ZGlmZiAtLWdpdCBhL1BBQ0tBR0VfU09VUkNFUyBiL1BBQ0tBR0VfU09VUkNFUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmQ3MWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvUEFDS0FHRV9TT1VSQ0VTCkBAIC0wLDAgKzEsNzkgQEAKK2xpYmFjbDEtZGV2XzIuMi41MS01dWJ1bnR1MV9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMmE1MjRkNDJjOTU1ZjdjOTA5M2Q3ZWJhZmI3YzJiOTcwYjRiNTc1ZQorbGliYWNsMS1kZXZfMi4yLjUxLTV1YnVudHUxX2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwNGQ5NmRmZTEyODRmOGEwNjAxNmQxZDVhNzgzNzJiMmUzZGY1NzI4CitsaWJhY2wxXzIuMi41MS01dWJ1bnR1MV9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0NjQyZGNiODE1ZjIyMGU5OGM3NTYxMjM2Yjc3YmU4ZDIyMTk5ZjUKK2xpYmFjbDFfMi4yLjUxLTV1YnVudHUxX2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZjM5YmRjYTllNWNmNzY3YTVhZjZjMzE4MGNjOWIxZTA4ZjRhNjQ3ZAorbGliYXNvdW5kMi1kZXZfMS4wLjI1LTF1YnVudHUxMF9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICBjNDY1NmM3MzdlMzA5ZTI5NmI0MTMwZGQzNGQyOTEyY2M2YWFlMzYxCitsaWJhc291bmQyLWRldl8xLjAuMjUtMXVidW50dTEwX2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgIDBhYjEzMWFlOWUwNWE2ZmM1NjVkZTVkODE2NTU3MTM1ZWE5Y2FlNmEKK2xpYmFzb3VuZDJfMS4wLjI1LTF1YnVudHUxMF9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzNmYzFhZDYxMjJlOGZmZTAxZmExOGU3M2Q1NmY5M2E0YTAyN2IxNAorbGliYXNvdW5kMl8xLjAuMjUtMXVidW50dTEwX2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZjAwOGFkZmMwMDQ1NGEyODdlNzE1N2FhOGNjMmJlNzE5OGVmY2M0CitsaWJhdHRyMS1kZXZfMi40LjQ2LTV1YnVudHUxX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgIGYyMmM0NDM2ZWFiMzJhOGUwY2VkODRjNjc1NGVkMmJjOWZhY2M3OWUKK2xpYmF0dHIxLWRldl8yLjQuNDYtNXVidW50dTFfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJiMDBmODQ0MjNhOTMyODEwMWRjYTkwYzQzMTc2MDg2MTcxYTUxMgorbGliYXR0cjFfMi40LjQ2LTV1YnVudHUxX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMTdjYzhlMGI1NGI5ODIxNjk5YTMyNGQ1YmM1ZTIzMjg5ZTQzNDM0CitsaWJhdHRyMV8yLjQuNDYtNXVidW50dTFfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlYmU2ZDYyYjNlMjdhMDU2MmVlZGI5OTNhYTJlMTI1N2UyMmI4ODYKK2xpYmF1ZGlvZmlsZS1kZXZfMC4zLjMtMl9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmRjOWM2Mjc2MzQ4MDJiZGVkNjc0ZTkyZTQ5ZjhjOTdmZTU3OWRkMworbGliYXVkaW9maWxlLWRldl8wLjMuMy0yX2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwNzgzMTRjZGQxNzUxOWViZGYwZjNlNTQwYTYxOTYxZDEyZTVjMGQwCitsaWJjNi1kZXZfMi4xNS0wdWJ1bnR1MTBfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIwZWM0ZDFhYTc2ZGZmMDMxZTNjMGVjZTE5YzFkNWNlOGNjN2U0ZDUKK2xpYmM2LWRldl8yLjE1LTB1YnVudHUxMF9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmViMDg1YTcyMjAyOTNlZDIzYWMxYjAwOWI5MDc3YTlkOTViMDYyNAorbGliYzZfMi4xNS0wdWJ1bnR1MTBfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2OWU5MjRmZDhjNzI3ZTZkZDFjZDNkZDg5N2MxYWFkMjE3MDcxZjViCitsaWJjNl8yLjE1LTB1YnVudHUxMF9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzYjdmMTA1MTVmYzg5NTI2NDZiMTJkMTUzOTJhOTg4NWE1NWQ1YzEKK2xpYmNhcC1kZXZfMi4yMi0xdWJ1bnR1M19hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmQwMmUxNzc5ZjAyZDQyNjdlMDk0ZjdkZmNlNzFmNTFkYzkwNmUxYworbGliY2FwLWRldl8yLjIyLTF1YnVudHUzX2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ZjI1ODUyNDFiMTI2NmVhMDdlZGMyOTk2MDkwNDI4YmIzMmRiODU3CitsaWJjYXAyXzIuMjItMXVidW50dTNfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUwZDY2MmFiNzJjNzFhODIzZDg1YTBhZWUxN2Q4YjMwMjFmYTM0YmIKK2xpYmNhcDJfMi4yMi0xdWJ1bnR1M19pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzZkM2UyNmE5MjAwOTVmOWEyNzk4MzRhYjRmMGRmMDZmNDQ2Y2ExNworbGliZHJtMl8yLjQuMzItMXVidW50dTFfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNzgwODAwODQyOTUyYmJlYmYwZjRhZGFhMWE3YzM0N2JlM2M0MDk2CitsaWJkcm0yXzIuNC4zMi0xdWJ1bnR1MV9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJlNzcxNzhlNTlhYzlmODM3Y2FkNWMxMGU0NGE3NTgyYmQ5ODMyNGMKK2xpYmVzZDAtZGV2XzAuMi40MS0xMGJ1aWxkM19hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDI3MzI0NTZhOGE5YjU0NmNjMjBjZWZmZjYxOTE0NmY5NWEwZjg3MworbGliZXNkMC1kZXZfMC4yLjQxLTEwYnVpbGQzX2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjNmQzNTIxMDI5Y2U2YjA4MmRmZDU3YjQ5OWVlODIzYTJhMzgzNzcwCitsaWJnbDEtbWVzYS1kZXZfOC4wLjItMHVidW50dTNfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgIDdiNjFkNGUyNDRlN2NlNGQ5M2NkMjA2YmIwNTFhMTgxYjZmODlkMzYKK2xpYmdsMS1tZXNhLWRldl84LjAuMi0wdWJ1bnR1M19pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgYzFjMGZlMWE4M2NjOWI3NzZjZTBmMzhjNWM2YmI1NTIwZTNmNDI5YgorbGliZ2wxLW1lc2EtZ2x4XzguMC4yLTB1YnVudHUzX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICBhNDk3OGNmYjVkZjUxN2E2MWU3YjVmNTNlNGQ1MjAyZDY1YmJmZGYzCitsaWJnbDEtbWVzYS1nbHhfOC4wLjItMHVidW50dTNfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgIDg0NDg4MWIwOTlmOWM0YmJkNGY5M2JjNDc2YWUwOThmZTJkNGM5YzcKK2xpYm5jdXJzZXM1LWRldl81LjktNF9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmMzNDEyNmJiN2JiMGJjYWIxMTVlMTg4OWNjMTRhZGRmODMyYjYzMworbGlibmN1cnNlczUtZGV2XzUuOS00X2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYmQ4M2ZiNDM5NmQ4NGViZGZmYWI0NWY4MDc4ZTg0MWM5ZDcyYzkxCitsaWJuY3Vyc2VzNV81LjktNF9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzOWMyNTk1MzM5OGE2MjNlYmQyYWU2YzJjZGEzZjk5ZWU3YTU0YTAKK2xpYm5jdXJzZXM1XzUuOS00X2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOGZiZmI3ODJmMmJjOWU2M2ZmN2FmMDAwNzBjYTEzNjM4ZWYwMjQ3ZQorbGlicHVsc2UtZGV2XzEuMS0wdWJ1bnR1MTVfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzZjAwODg3YTg5YWRlOGEyOGNmNmQ0Mzg2NDc4NDk5ZWM4MmE3ZTdjCitsaWJwdWxzZS1kZXZfMS4xLTB1YnVudHUxNV9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDdhN2YzYTBjNGJmNTZiYjk3M2RhYWEzMzMwOGE3Zjg5MDBmMTMzNDUKK2xpYnB1bHNlMF8xLjEtMHVidW50dTE1X2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGI1MzU0NGRjMDBiM2IwMWQ2ZjQ0MzY3Yzg5ODNiMGNmZDQyY2I1YgorbGlicHVsc2UwXzEuMS0wdWJ1bnR1MTVfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMzAyNGYyODk4YTdhMDNlYTMzZTRkYzkwZmUwZWE0YWIyODA5OWY4CitsaWJ0aW5mby1kZXZfNS45LTRfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFkYjQ1ODIwZWY1NWNmN2Q0YTNiMWRlZTE3N2NhOTk4MTE1ZTJhMDIKK2xpYnRpbmZvLWRldl81LjktNF9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTY5ODgyMGIzMDgzZjEyM2YwYzhiNTk1NWI2NDAxNmE4MzQyZDg5ZAorbGlidGluZm81XzUuOS00X2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2Mjg5YmQwZGU4MGM3NjY2NDBmMzZhNmM5ZTdmMTg1NzdmMjY4NjQwCitsaWJ0aW5mbzVfNS45LTRfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDNiZTliM2I1NDAzNzg4MWYzMzM1NzdhZmU0NzliYTYxMGE3MWQ0OWIKK2xpYngxMS02XzEuNC45OS4xLTB1YnVudHUyX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMGNjNzc4N2U4NTUyZjY3NmUyOTk0ZDBhMmU1NzllZTU3YWJlNWY4ZgorbGlieDExLTZfMS40Ljk5LjEtMHVidW50dTJfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NTRjNDU5YmIxNzkyNDI1NDViYzY4YjJmN2Q5NWFhNjBkMmJkNGVkCitsaWJ4MTEtZGV2XzEuNC45OS4xLTB1YnVudHUyX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgIDFlNzE3MWMwZTdkYWFmZDI2MmI4MTRhMWZjYjgzZDZlZGVkNmVmMGQKK2xpYngxMS1kZXZfMS40Ljk5LjEtMHVidW50dTJfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzQ5M2QwODcwZmMwMzcyYWI0OWMyYzlkZDQ5NmRiZDZhZDEzMGRjYworbGlieGF1Nl8xLjAuNi00X2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOWI2NWVhMDQwYTZiZjFkZGUyZTFlNjM0MjJjYjE1ODA5NWJmMmEyCitsaWJ4YXU2XzEuMC42LTRfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDVkMTk0MmFjNjhiM2EzMWUwZWVhYjY2ZGYwNzg0ZGJhYmU5NDM2YjUKK2xpYnhjYjEtZGV2XzEuOC4xLTFfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMyM2ZhY2M4Nzc2ZjQ5YmQyN2ViNmE0ZWUzMjM1MDM3MmJhNGYyOAorbGlieGNiMS1kZXZfMS44LjEtMV9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYzNkYjQ1ZDg3MjRhOTk3NzcwNzgyNThmZjhjZDRlOGZlMzhjYTgzCitsaWJ4ZGFtYWdlMV8xLjEuMy0yYnVpbGQxX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc1MTZmNDIzYTM4NjZlYTZhOGU1MGQxNzE0ODhhNmZlNWRmOTgyM2YKK2xpYnhkYW1hZ2UxXzEuMS4zLTJidWlsZDFfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzQ5NjI5OTJkYmNiZDBlNDY4OTBiYTcyM2FkOTdiYjZmOWMzM2I2OQorbGlieGRtY3A2XzEuMS4wLTRfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NTNiNjhhZTNhYzg0ZWM0YjRkYTI4M2RiNzE2YTdlNzEzYmYzOGQ5CitsaWJ4ZG1jcDZfMS4xLjAtNF9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3ZmVkZDhlZDM4OWRmNmM5N2Y3NTQwZjc1ZTc3NjYxZjEyMzkyOTEKK2xpYnhleHQtZGV2XzEuMy4wLTNidWlsZDFfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNmM3YWY3N2IxM2IyZGNhMTRlZDY5NjQ5NWRiNzJiNThkOTliM2Q1ZgorbGlieGV4dC1kZXZfMS4zLjAtM2J1aWxkMV9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYWVkZWNjMTQ1Y2U1ZjdmNjEwNDU5ZjQyMDhmYjBmNDU4NjAxM2ZhCitsaWJ4ZXh0Nl8xLjMuMC0zYnVpbGQxX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM1OGU0M2NlYjk4YTRmOTI5YmIzYjkyMDBmMzZmMTBkYmI0ZmEwYWQKK2xpYnhleHQ2XzEuMy4wLTNidWlsZDFfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODJiMjBmYjU3NjNiOWQ1ZjRhMjMyNjQ4YTUzZDM3MTFlMzQ3ZTg4OQorbGlieGZpeGVzLWRldl81LjAtNHVidW50dTRfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMmU3NDJiZmQxMTRjYTZiZmJlMGY3MjEyYWNiYjAwOWU3MmMxZGFmCitsaWJ4Zml4ZXMtZGV2XzUuMC00dWJ1bnR1NF9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ3MTdlYWJkZDkwZTBmYzQ0NGYxMmM2MGJjNDY0MDgwZDJkZDc1M2EKK2xpYnhmaXhlczNfNS4wLTR1YnVudHU0X2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgM2RkNmU4NGVjNDhhMjBjYzhmN2JhZDAwNTQzNmUxN2NiOGIyNWRiNgorbGlieGZpeGVzM181LjAtNHVidW50dTRfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5ZDY4ZDUzMTFkZWFmNjZhZDY5N2JiOTdjNzU0ZDRkODI2YzVlNzYxCitsaWJ4aS1kZXZfMS42LjAtMHVidW50dTJfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3NmNjN2Y5OTIzOTQ5M2JiYTRkNWI2ZDMxY2ZlZjg0Mzc2OTQ5OTUKK2xpYnhpLWRldl8xLjYuMC0wdWJ1bnR1Ml9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjJmZTBmNGRkYTBhMDRhYjRjMTI3YjgyZjU4ZmY0Y2ZmNDlkNTM3MQorbGlieHhmODZ2bTFfMS4xLjEtMmJ1aWxkMV9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMjQ5YWNjMjc5OWU2MThjMjRkNWQyYjIyM2ZkM2RjMDk1ZTg0Y2VkCitsaWJ4eGY4NnZtMV8xLjEuMS0yYnVpbGQxX2kzODYuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgxODZkZGU4Mzk1NGIzZGQ1ZmRiNzNiZDBhZDVhY2ZjMjdjYzcxNGMKK2xpbnV4LWxpYmMtZGV2XzMuMi4wLTIzLjM2X2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzc5NjVkNDAwOGEyYTMzZmEzNGEyZGM3NzEyZWExZjA2OWQ3MTk4ZQorbGludXgtbGliYy1kZXZfMy4yLjAtMjMuMzZfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDc2MDczNmRhYjBkNGE5MTY3ODg0MTYwNTQxMWQ1OWU3NjAwMDUwCittZXNhLWNvbW1vbi1kZXZfOC4wLjItMHVidW50dTNfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgIDcyMDgzYjRmZTQ3ODQ3N2EyNWZkNDJhNjBiMGU5Njg5NTEwN2UzNDkKK21lc2EtY29tbW9uLWRldl84LjAuMi0wdWJ1bnR1M19pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgMmNjMjJlYWIyZDFmY2Q4MmQxNTUxZjE3NTRhNmI0YjU5M2RjYzBhOQoreDExcHJvdG8tY29yZS1kZXZfNy4wLjIyLTFfYWxsLmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MmIwN2NlYWY1NWEwN2VjMDBkMTM4MWMwZWMyNWI3NmQ2ZGNmMzdjCit4MTFwcm90by1maXhlcy1kZXZfNS4wLTJ1YnVudHUxX2FsbC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZWY5ZDVjY2U5YjkxYTIzN2M4MWFlOTMwNTJkMzYyN2RkMDcxYjIKK3gxMXByb3RvLWlucHV0LWRldl8yLjEuOTkuNi0xX2FsbC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFkNGUxZGIyZmI0YmZkNzY5MjRlM2VhY2YwZDY4OWZlZWEyODg3MAoreDExcHJvdG8ta2ItZGV2XzEuMC41LTJfYWxsLmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NWU3MzJkNjYwMjFhMDViYWUxZTA5OTk3NzE3YTNlN2ZmOWVmOGI3Cit4MTFwcm90by14ZXh0LWRldl83LjIuMC0zX2FsbC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY4ZDg0NzZkODQ1MjNjYjNjNTc0ZWE0MzIzNzk0M2MzYWUxMzgzNjgKK3psaWIxZy1kZXZfMS4yLjMuNC5kZnNnLTN1YnVudHU0X2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgOGIwZWQ2YTg3NmJlOWMyOTM5Yzg0Njg3N2U2ZmNmMTUyY2JhYzdiMQoremxpYjFnLWRldl8xLjIuMy40LmRmc2ctM3VidW50dTRfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICBkMzI1M2VhM2ExOTUwN2Q0Y2I2OWRmNjQ5NTJiOWYxZTk4YzgyYWMxCit6bGliMWdfMS4yLjMuNC5kZnNnLTN1YnVudHU0X2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiYjg2MjAyOWRiMmQxYjhmYzVmZGNjMGVkZjYxZGVmMjQwNTkwYWYKK3psaWIxZ18xLjIuMy40LmRmc2ctM3VidW50dTRfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzAwMGU4ZjcwMzk4M2U0Mjk5ZDMyYTU5NTEyMDBlM2Y5NTMxYWZlOQpkaWZmIC0tZ2l0IGEvVE9PTENIQUlOX1NPVVJDRVMgYi9UT09MQ0hBSU5fU09VUkNFUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWRhNTJhCi0tLSAvZGV2L251bGwKKysrIGIvVE9PTENIQUlOX1NPVVJDRVMKQEAgLTAsMCArMSwxMCBAQAordG9vbGNoYWluL2JpbnV0aWxzLmdpdDogICAgICAgICAgYzhlMTYzNjQ5M2Y3ZDQwYmIwYmEzNzUwMWU5YTZmNjdjZDA2MmEzMSBbMi4yNF0gQ29ydGV4LUE1MyBlcnJhdHVtIDgzNTc2OSBsaW5rZXIgd29ya2Fyb3VuZCBUaGlzIGlzIHBvcnRlZCBmcm9tIHVwc3RyZWFtIGJpbnV0aWxzIDIuMjQgYnJhbmNoICAgY29tbWl0OiBjZGU5OGY4NTY2ZTE0ZjUyYjg5NmFiYzkyYzM1N2NkZDE0NzE3NTA1Cit0b29sY2hhaW4vYnVpbGQuZ2l0OiAgICAgICAgICAgICA3NTU0MmU3N2I1NjVjMmFmOTY4ZTQ4YzFiMTJiMzJmMzQzZDkxM2FlIEZpeCBiaW51dGlscy0yLjI0IGRldGVjdGlvbgordG9vbGNoYWluL2djYy5naXQ6ICAgICAgICAgICAgICAgYmEyMTEyMmM2M2IwNmE3MGI2MjBjODk5MGM1MTdiODcxOThhZDA1YiBbNC45XSBSZXN0b3JlIHJlY29nIHN0YXRlIGFmdGVyIGZpbmRpbmcgcHJlLW1hZGQgaW5zdHJ1Y3Rpb24uIFRoaXMgcGF0Y2ggYmFja3BvcnRzIHN2biByMjE2ODUzIGZyb20gdXBzdGVhbSBnY2MtNC45IGJyYW5jaCB0aGF0IGZpeGVkIGEgYnVnIGludHJvZHVjZWQgaW4gZml4aW5nIGNvcnRleCBhNTMgZXJyYXR1bSA4MzU3NjkuCit0b29sY2hhaW4vZ2RiLmdpdDogICAgICAgICAgICAgICAyNDIzN2JjOGJjMzAwMWE4MmQ2Y2Q5Njg1NzE5YzQ2NzlmNzIxNzkyIGZpeCBzb21lIGJ1aWxkIGVycm9ycwordG9vbGNoYWluL2dvbGQuZ2l0OiAgICAgICAgICAgICAgOGQ0MDFjZjcxMTUzOWFmNWEyZjc4ZDEyNDQ3MzQxZDc3NDg5MjYxOCBFbXB0eSBpbml0aWFsIGNvbW1pdC4KK3Rvb2xjaGFpbi9nbXAuZ2l0OiAgICAgICAgICAgICAgIGU2Yjk2NjlkYWZjNmE1ZjgzYzgwYjRiNDE3NjM1OWI3OGJjY2RjOTAgQWRkIGdtcC01LjAuNS50YXIuYnoyCit0b29sY2hhaW4vbXBmci5naXQ6ICAgICAgICAgICAgICBiZmNmMWJmYTM4NDY5MjA4YWFhZDg4NzNjZDRjNjg3ODEwNjFkOTBmIGFkZCBtcGZyLTMuMS4xLnRhci5iejIKK3Rvb2xjaGFpbi9tcGMuZ2l0OiAgICAgICAgICAgICAgIDgzNWQxNmU5MmVlZDg3NTYzOGE4YjVkNTUyMDM0YzNiMWFhZTA0NWIgYWRkIG1wYy0xLjAuMS50YXIuZ3oKK3Rvb2xjaGFpbi9pc2wuZ2l0OiAgICAgICAgICAgICAgIGIwNWQ0NTcyOTU4YzVkNDk3ZGE3OTNmMzMxNzA4NGJhYjkwYzMwMzMgYWRkIGlzbC0wLjExLjEudGFyLmJ6MiBuZWVkZWQgYnkgR0NDIDQuOCB3aXRoIGdyYXBoaXRlCit0b29sY2hhaW4vY2xvb2cuZ2l0OiAgICAgICAgICAgICA5ODk3MmQ1NDM0ZmZjYjRkMTFkMmM4MWE0NjYwMGU5YTFjZGE5MTEwIE1pbkdXLXc2NCBidWlsZCBmaXggKGxhY2tzIGZmcyBkZWNsYXJhdGlvbikKZGlmZiAtLWdpdCBhL2Jpbi9jbG9vZyBiL2Jpbi9jbG9vZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMGE2YjBjCi0tLSAvZGV2L251bGwKKysrIGIvYmluL2Nsb29nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtYWRkcjJsaW5lIGIvYmluL3g4Nl82NC1saW51eC1hZGRyMmxpbmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODAyMWMwNAotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi94ODZfNjQtbGludXgtYWRkcjJsaW5lCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtYXIgYi9iaW4veDg2XzY0LWxpbnV4LWFyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAwYTQ0YjUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4veDg2XzY0LWxpbnV4LWFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtYXMgYi9iaW4veDg2XzY0LWxpbnV4LWFzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk0OTczZGEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4veDg2XzY0LWxpbnV4LWFzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtYysrIGIvYmluL3g4Nl82NC1saW51eC1jKysKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmY0OGUzNAotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi94ODZfNjQtbGludXgtYysrCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtYysrZmlsdCBiL2Jpbi94ODZfNjQtbGludXgtYysrZmlsdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNjBmZDBmCi0tLSAvZGV2L251bGwKKysrIGIvYmluL3g4Nl82NC1saW51eC1jKytmaWx0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtY3BwIGIvYmluL3g4Nl82NC1saW51eC1jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTQ5NjMzZAotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi94ODZfNjQtbGludXgtY3BwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtZWxmZWRpdCBiL2Jpbi94ODZfNjQtbGludXgtZWxmZWRpdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZTVkYjM5Ci0tLSAvZGV2L251bGwKKysrIGIvYmluL3g4Nl82NC1saW51eC1lbGZlZGl0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtZysrIGIvYmluL3g4Nl82NC1saW51eC1nKysKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmY0OGUzNAotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi94ODZfNjQtbGludXgtZysrCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtZ2NjIGIvYmluL3g4Nl82NC1saW51eC1nY2MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWZiMmQxZQotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi94ODZfNjQtbGludXgtZ2NjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtZ2NjLTQuOCBiL2Jpbi94ODZfNjQtbGludXgtZ2NjLTQuOApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZmIyZDFlCi0tLSAvZGV2L251bGwKKysrIGIvYmluL3g4Nl82NC1saW51eC1nY2MtNC44CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtZ2NjLWFyIGIvYmluL3g4Nl82NC1saW51eC1nY2MtYXIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzI5MGU5YQotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi94ODZfNjQtbGludXgtZ2NjLWFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtZ2NjLW5tIGIvYmluL3g4Nl82NC1saW51eC1nY2Mtbm0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTM5MjIzMwotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi94ODZfNjQtbGludXgtZ2NjLW5tCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtZ2NjLXJhbmxpYiBiL2Jpbi94ODZfNjQtbGludXgtZ2NjLXJhbmxpYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZDdkNWJiCi0tLSAvZGV2L251bGwKKysrIGIvYmluL3g4Nl82NC1saW51eC1nY2MtcmFubGliCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtZ2NvdiBiL2Jpbi94ODZfNjQtbGludXgtZ2NvdgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZjE2MDRlCi0tLSAvZGV2L251bGwKKysrIGIvYmluL3g4Nl82NC1saW51eC1nY292CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtZ3Byb2YgYi9iaW4veDg2XzY0LWxpbnV4LWdwcm9mCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY2ZGVlZWIKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4veDg2XzY0LWxpbnV4LWdwcm9mCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtbGQgYi9iaW4veDg2XzY0LWxpbnV4LWxkCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVlYTVhYTYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4veDg2XzY0LWxpbnV4LWxkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtbGQuYmZkIGIvYmluL3g4Nl82NC1saW51eC1sZC5iZmQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzk3ZmMwZAotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi94ODZfNjQtbGludXgtbGQuYmZkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtbGQuZ29sZCBiL2Jpbi94ODZfNjQtbGludXgtbGQuZ29sZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZWE1YWE2Ci0tLSAvZGV2L251bGwKKysrIGIvYmluL3g4Nl82NC1saW51eC1sZC5nb2xkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtbm0gYi9iaW4veDg2XzY0LWxpbnV4LW5tCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI4ZWQyMjgKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4veDg2XzY0LWxpbnV4LW5tCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtb2JqY29weSBiL2Jpbi94ODZfNjQtbGludXgtb2JqY29weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNDVmZjM0Ci0tLSAvZGV2L251bGwKKysrIGIvYmluL3g4Nl82NC1saW51eC1vYmpjb3B5CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtb2JqZHVtcCBiL2Jpbi94ODZfNjQtbGludXgtb2JqZHVtcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMjRmZjliCi0tLSAvZGV2L251bGwKKysrIGIvYmluL3g4Nl82NC1saW51eC1vYmpkdW1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtcmFubGliIGIvYmluL3g4Nl82NC1saW51eC1yYW5saWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjJmNzJjZQotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi94ODZfNjQtbGludXgtcmFubGliCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtcmVhZGVsZiBiL2Jpbi94ODZfNjQtbGludXgtcmVhZGVsZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYTBmOTg2Ci0tLSAvZGV2L251bGwKKysrIGIvYmluL3g4Nl82NC1saW51eC1yZWFkZWxmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtc2l6ZSBiL2Jpbi94ODZfNjQtbGludXgtc2l6ZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNmI3OWMyCi0tLSAvZGV2L251bGwKKysrIGIvYmluL3g4Nl82NC1saW51eC1zaXplCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtc3RyaW5ncyBiL2Jpbi94ODZfNjQtbGludXgtc3RyaW5ncwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNTY2MmFlCi0tLSAvZGV2L251bGwKKysrIGIvYmluL3g4Nl82NC1saW51eC1zdHJpbmdzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi94ODZfNjQtbGludXgtc3RyaXAgYi9iaW4veDg2XzY0LWxpbnV4LXN0cmlwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYxZjVmNzUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4veDg2XzY0LWxpbnV4LXN0cmlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1aWxkLXByZWNpc2UtbXVsdGlsaWItdG9vbGNoYWluLnNoIGIvYnVpbGQtcHJlY2lzZS1tdWx0aWxpYi10b29sY2hhaW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzJhMmVmNAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkLXByZWNpc2UtbXVsdGlsaWItdG9vbGNoYWluLnNoCkBAIC0wLDAgKzEsMTgyMCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgVGhpcyBzY3JpcHQgaXMgdXNlZCB0byByZWJ1aWxkIHRoZSBMaW51eCAzMi1iaXQgY3Jvc3MtdG9vbGNoYWluCisjIHRoYXQgYWxsb3dzIHlvdSB0byBnZW5lcmF0ZSAzMi1iaXQgYmluYXJpZXMgdGhhdCB0YXJnZXQgVWJ1bnR1IDguMDQKKyMgKGEuay5hLiBIYXJkeSBIZXJvbikgaW5zdGVhZCBvZiB0aGUgaG9zdCBzeXN0ZW0gKHdoaWNoIHVzdWFsbHkgaXMgMTAuMDQsCisjIGEuay5hLiBMdWNpZCBMeW54KQorIworIyBVc2UgLS1oZWxwIGZvciBjb21wbGV0ZSB1c2FnZSBpbmZvcm1hdGlvbi4KKyMKKyMgV0FSTklORzogQXQgdGhpcyB0aW1lLCB0aGUgZ2VuZXJhdGVkIHRvb2xjaGFpbiBiaW5hcmllcyB3aWxsICpub3QqIHJ1bgorIyAgICAgICAgICB3aXRoIEdMaWJjIDIuMTUsIG9ubHkgdGhlIG1hY2hpbmUgY29kZSBpdCBnZW5lcmF0ZXMuCisjCisKK1BST0dOQU1FPSJgYmFzZW5hbWUgXCIkMFwiYCIKK1BBVENIRVNfRElSPSIkKCBjZCAiJCggZGlybmFtZSAiJDAiICkiICYmIHB3ZCApL3Rvb2xjaGFpbi1wYXRjaGVzIgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMKKyMjIyMjICBDIE8gTiBGIEkgRyBVIFIgQSBUIEkgTyBOCisjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworcGFuaWMgKCkKK3sKKyAgICBlY2hvICJFUlJPUjogJEAiCisgICAgZXhpdCAxCit9CisKK2ZhaWxfcGFuaWMgKCkKK3sKKyAgICBpZiBbICQ/ICE9IDAgXSA7IHRoZW4KKyAgICAgICAgZWNobyAiRVJST1I6ICRAIgorICAgICAgICBleGl0IDEKKyAgICBmaQorfQorCisKKyMgV2Ugb25seSBzdXBwb3J0IHJ1bm5pbmcgdGhpcyBzY3JpcHQgb24gTGludXgKK09TPSQodW5hbWUgLXMpCitpZiBbICIkT1MiICE9IExpbnV4IF07IHRoZW4KKyAgICBwYW5pYyAiVGhpcyBzY3JpcHQgY2FuIG9ubHkgcnVuIG9uIExpbnV4IG1hY2hpbmVzISIKK2ZpCisKK1VCVU5UVV9BUkNIUz0iaTM4NiBhbWQ2NCIKKworIyBVc2VkIHRvIHNldCB0aGUgaG9zdCBiaXRuZXNzIG9mIHRoZSBnZW5lcnRlZCB0b29sY2hhaW4gYmluYXJpZXMKKyMgRmlyc3QgY2FsbCB3aXRoIHRoZSBidWlsZCBtYWNoaW5lJ3MgYml0bmVzcywgYW5kIGxhdGVyIHdpdGggMzIKKyMgaWYgLS0zMi1iaXRzIG9wdGlvbiBpcyB1c2VkLgorIyAkMTogMzIgb3IgNjQKK3NldF9ob3N0X2JpdHMgKCkKK3sKKyAgICBIT1NUX0JJVFM9JDEKKyAgICBHTVBfQUJJPSQxCisgICAgY2FzZSAkMSBpbgorICAgICAgICAzMikKKyAgICAgICAgICAgIEhPU1RfQVJDSD1pNjg2CisgICAgICAgICAgICBHQ0NfVEFSR0VUPWk2ODYtbGludXgKKyAgICAgICAgICAgIEdNUF9UQVJHRVQ9aTM4Ni1saW51eAorICAgICAgICAgICAgOzsKKyAgICAgICAgNjQpCisgICAgICAgICAgICBIT1NUX0FSQ0g9eDg2XzY0CisgICAgICAgICAgICBHQ0NfVEFSR0VUPXg4Nl82NC1saW51eAorICAgICAgICAgICAgR01QX1RBUkdFVD14ODZfNjQtbGludXgKKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICBwYW5pYyAiSW52YWxpZCBob3N0IGJpdG5lc3MgKDMyIG9yIDY0IGV4cGVjdGVkKTogJDEiCisgICAgZXNhYworfQorCisjIERldGVybWluZSBidWlsZCBtYWNoaW5lIGJpdG5lc3MKK0JVSUxEX0FSQ0g9JCh1bmFtZSAtbSkKK2Nhc2UgIiRCVUlMRF9BUkNIIiBpbgorICAgIHg4Nl82NHxhbWQ2NCkKKyAgICAgICAgQlVJTERfQklUUz02NAorICAgICAgICBCVUlMRF9BUkNIPXg4Nl82NAorICAgICAgICBCVUlMRF9HQ0NfVEFSR0VUPXg4Nl82NC1saW51eAorICAgICAgICBzZXRfaG9zdF9iaXRzIDY0CisgICAgICAgIDs7CisgICAgaT84NikKKyAgICAgICAgQlVJTERfQklUUz0zMgorICAgICAgICBCVUlMRF9BUkNIPWk2ODYKKyAgICAgICAgQlVJTERfR0NDX1RBUkdFVD1pNjg2LWxpbnV4CisgICAgICAgIHNldF9ob3N0X2JpdHMgMzIKKyAgICAgICAgOzsKKyAgICAqKQorICAgICAgICBwYW5pYyAiVW5rbm93biBidWlsZCBDUFUgYXJjaGl0ZWN0dXJlOiAkQlVJTERfQVJDSCIKK2VzYWMKKworIyBWZXJzaW9ucyBvZiB2YXJpb3VzIHRvb2xjaGFpbiBjb21wb25lbnRzLCBkbyBub3QgdG91Y2ggdW5sZXNzIHlvdSBrbm93CisjIHdoYXQgeW91J3JlIGRvaW5nIQorCitCSU5VVElMU19WRVJTSU9OPTIuMjMKK0dNUF9WRVJTSU9OPTUuMC41CitNUEZSX1ZFUlNJT049My4xLjEKK01QQ19WRVJTSU9OPTEuMC4xCitHQ0NfVkVSU0lPTj00LjgKK0NMT09HX1ZFUlNJT049MC4xOC4wCitJU0xfVkVSU0lPTj0wLjExLjEKKworR0xJQkNfVkVSU0lPTj0yLjE1CisKK0dJVF9DTUQ9Z2l0CitHSVRfREFURT0KK0dJVF9CUkFOQ0g9bWFzdGVyCitHSVRfUkVGRVJFTkNFPQorR0lUX0JBU0U9CitHSVRfQkFTRV9ERUZBVUxUPWh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3Rvb2xjaGFpbgorCisjIExvY2F0aW9uIHdoZXJlIHdlJ3JlIGdvaW5nIHRvIGluc3RhbGwgdGhlIHRvb2xjaGFpbiBkdXJpbmcgdGhlIGJ1aWxkCisjIFRoaXMgd2lsbCBkZXBlbmQgb24gdGhlIHBoYXNlIG9mIHRoZSBidWlsZC4KK2luc3RhbGxfZGlyICgpIHsgZWNobyAiJFdPUktfRElSLyRQSEFTRS8kVE9PTENIQUlOX05BTUUiOyB9CisKKyMgR2l2ZW4gYW4gaW5wdXQgc3RyaW5nIHRoYXQgbG9va3MgbGlrZSA8bWFqb3I+LjxtaW5vcj4uPHBhdGNoPgorIyBSZXR1cm4gPG1ham9yPi48bWlub3I+IG9ubHkuCittYWpvcl9taW5vcl9vbmx5ICgpIHsKKyAgIGxvY2FsIE1BSk9SPSQoZWNobyAtbiAiJDEiIHwgY3V0IC1mMSAtZC4pCisgICBsb2NhbCBNSU5PUj0kKGVjaG8gLW4gIiQxIiB8IGN1dCAtZjIgLWQuKQorICAgZWNobyAiJE1BSk9SLiRNSU5PUiIKK30KKworIyBMb2NhdGlvbiB3aGVyZSB3ZSdyZSBnb2luZyB0byBpbnN0YWxsIHRoZSBmaW5hbCBiaW5hcmllcworIyBJZiBlbXB0eSwgVE9PTENIQUlOX0FSQ0hJVkUgd2lsbCBiZSBnZW5lcmF0ZWQKK1BSRUZJWF9ESVI9CisKKyMgTG9jYXRpb24gb2YgdGhlIGZpbmFsIHN5c3Jvb3QuIFRoaXMgbXVzdCBiZSBhIHN1Yi1kaXJlY3Rvcnkgb2YgSU5TVEFMTF9ESVIKKyMgdG8gZW5zdXJlIHRoYXQgdGhlIHRvb2xjaGFpbiBiaW5hcmllcyBhcmUgcHJvcGVybHkgcmVsb2NhdGFibGUgKGkuZS4gY2FuCisjIGJlIHVzZWQgd2hlbiBtb3ZlZCB0byBhbm90aGVyIGRpcmVjdG9yeSkuCitzeXNyb290X2RpciAoKSB7IGVjaG8gIiQoaW5zdGFsbF9kaXIpL3N5c3Jvb3QiOyB9CisKKyMgVHJ5IHRvIHBhcmFsbGVsaXplIHRoZSBidWlsZCBmb3IgZmFzdGVyIHBlcmZvcm1hbmNlLgorSk9CUz0kKGNhdCAvcHJvYy9jcHVpbmZvIHwgZ3JlcCAtYyBwcm9jZXNzb3IpCisKKyMgVGhlIGJhc2UgVVJMIG9mIHRoZSBVYnVudHUgbWlycm9yIHdlJ3JlIGdvaW5nIHRvIHVzZS4KK1VCVU5UVV9NSVJST1I9aHR0cDovL21pcnJvcnMudXMua2VybmVsLm9yZworCisjIFVidW50dSByZWxlYXNlIG5hbWUgd2Ugd2FudCBwYWNrYWdlcyBmcm9tLiBDYW4gYmUgYSBuYW1lIG9yIGEgbnVtYmVyCisjIChpLmUuICJwcmVjaXNlIiBvciAiMTIuMDQiKQorVUJVTlRVX1JFTEVBU0U9cHJlY2lzZQorCisKKyMgVGhlIGxpc3Qgb2YgcGFja2FnZXMgd2UgbmVlZCB0byBkb3dubG9hZCBmcm9tIHRoZSBVYnVudHUgc2VydmVycyBhbmQKKyMgZXh0cmFjdCBpbnRvIHRoZSBvcmlnaW5hbCBzeXNyb290CisjCisjIENhbGwgYWRkX3VidW50dV9wYWNrYWdlIDxwYWNrYWdlLW5hbWU+IHRvIGFkZCBhIHBhY2thZ2UgdG8gdGhlIGxpc3QsCisjIHdoaWNoIHdpbGwgYmUgcHJvY2Vzc2VkIGxhdGVyLgorIworVUJVTlRVX1BBQ0tBR0VTPQorCithZGRfdWJ1bnR1X3BhY2thZ2UgKCkKK3sKKyAgICBVQlVOVFVfUEFDS0FHRVM9IiRVQlVOVFVfUEFDS0FHRVMgJEAiCit9CisKKyMgVGhlIHBhY2thZ2UgZmlsZXMgY29udGFpbmluZyBrZXJuZWwgaGVhZGVycyBmb3IgSGFyZHkgYW5kIHRoZSBDCisjIGxpYnJhcnkgaGVhZGVycyBhbmQgYmluYXJpZXMKK2FkZF91YnVudHVfcGFja2FnZSBcCisgICAgbGludXgtbGliYy1kZXYgXAorICAgIGxpYmM2IFwKKyAgICBsaWJjNi1kZXYgXAorICAgIGxpYmNhcDIgXAorICAgIGxpYmNhcC1kZXYgXAorICAgIGxpYmF0dHIxIFwKKyAgICBsaWJhdHRyMS1kZXYgXAorICAgIGxpYmFjbDEgXAorICAgIGxpYmFjbDEtZGV2IFwKKworIyBUaGUgWDExIGhlYWRlcnMgYW5kIGJpbmFyaWVzIChmb3IgdGhlIGVtdWxhdG9yKQorYWRkX3VidW50dV9wYWNrYWdlIFwKKyAgICBsaWJ4MTEtNiBcCisgICAgbGlieDExLWRldiBcCisgICAgbGlieGF1NiBcCisgICAgbGlieGNiMS1kZXYgXAorICAgIGxpYnhkbWNwNiBcCisgICAgbGlieGV4dC1kZXYgXAorICAgIGxpYnhmaXhlcy1kZXYgXAorICAgIGxpYnhpLWRldiBcCisgICAgeDExcHJvdG8tY29yZS1kZXYgXAorICAgIHgxMXByb3RvLWZpeGVzLWRldiBcCisgICAgeDExcHJvdG8teGV4dC1kZXYgXAorICAgIHgxMXByb3RvLWlucHV0LWRldiBcCisgICAgeDExcHJvdG8ta2ItZGV2CisKKyMgVGhlIE9wZW5HTC1yZWxhdGVkIGhlYWRlcnMgYW5kIGxpYnJhcmllcyAoZm9yIEdMRVMgZW11bGF0aW9uKQorYWRkX3VidW50dV9wYWNrYWdlIFwKKyAgICBtZXNhLWNvbW1vbi1kZXYgXAorICAgIGxpYmdsMS1tZXNhLWRldiBcCisgICAgbGliZ2wxLW1lc2EtZ2x4IFwKKyAgICBsaWJ4eGY4NnZtMSBcCisgICAgbGlieGV4dDYgXAorICAgIGxpYnhkYW1hZ2UxIFwKKyAgICBsaWJ4Zml4ZXMzIFwKKyAgICBsaWJkcm0yCisKKyMgQXVkaW8gbGlicmFyaWVzIChyZXF1aXJlZCBieSB0aGUgZW11bGF0b3IpCithZGRfdWJ1bnR1X3BhY2thZ2UgXAorICAgIGxpYmFzb3VuZDIgXAorICAgIGxpYmFzb3VuZDItZGV2IFwKKyAgICBsaWJlc2QwLWRldiBcCisgICAgbGliYXVkaW9maWxlLWRldiBcCisgICAgbGlicHVsc2UwIFwKKyAgICBsaWJwdWxzZS1kZXYKKworIyBaTGliIGFuZCBvdGhlcnMuCithZGRfdWJ1bnR1X3BhY2thZ2UgXAorICAgIHpsaWIxZyBcCisgICAgemxpYjFnLWRldiBcCisgICAgbGlibmN1cnNlczUgXAorICAgIGxpYm5jdXJzZXM1LWRldiBcCisgICAgbGlidGluZm81IFwKKyAgICBsaWJ0aW5mby1kZXYKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIworIyMjIyMgIEUgTiBEICAgTyBGICAgQyBPIE4gRiBJIEcgVSBSIEEgVCBJIE8gTgorIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgUGFyc2UgYWxsIG9wdGlvbnMKK09QVElPTl9IRUxQPW5vCitWRVJCT1NFPTAKK0ZPUkNFPW5vCitPTkxZX1NZU1JPT1Q9bm8KK09OTFlfVE9PTENIQUlOX0RJUj0KK0JPT1RTVFJBUD0KK1BBUkFNRVRFUlM9CitGT1JDRV8zMj0KK0xJU1RfVEFTS1M9CisKK2ZvciBvcHQgZG8KKyAgb3B0YXJnPSQoZXhwciAieCRvcHQiIDogJ3hbXj1dKj1cKC4qXCknKQorICBjYXNlICRvcHQgaW4KKyAgLS1oZWxwfC1ofC1cPykgT1BUSU9OX0hFTFA9eWVzCisgIDs7CisgIC0tdmVyYm9zZSkgVkVSQk9TRT0kKCggJFZFUkJPU0UgKyAxICkpCisgIDs7CisgIC0tZm9yY2UpIEZPUkNFPSJ5ZXMiCisgIDs7CisgIC0tMzItYml0cykgRk9SQ0VfMzI9dHJ1ZQorICA7OworICAtLXVidW50dS1taXJyb3I9KikgVUJVTlRVX01JUlJPUj0kb3B0YXJnCisgIDs7CisgIC0tdWJ1bnR1LXJlbGVhc2U9KikgVUJVTlRVX1JFTEVBU0U9JG9wdGFyZworICA7OworICAtLXByZWZpeD0qKSBQUkVGSVhfRElSPSRvcHRhcmcKKyAgOzsKKyAgLS13b3JrLWRpcj0qKSBXT1JLX0RJUj0kb3B0YXJnCisgIDs7CisgIC0tZ2NjLXZlcnNpb249KikgR0NDX1ZFUlNJT049JG9wdGFyZworICA7OworICAtLWJpbnV0aWxzLXZlcnNpb249KikgQklOVVRJTFNfVkVSU0lPTj0kb3B0YXJnCisgIDs7CisgIC0tZ21wLXZlcnNpb249KikgR01QX1ZFUlNJT049JG9wdGFyZworICA7OworICAtLW1wZnItdmVyc2lvbj0qKSBNUEZSX1ZFUlNJT049JG9wdGFyZworICA7OworICAtLW1wYy12ZXJzaW9uPSopIE1QQ19WRVJTSU9OPSRvcHRhcmcKKyAgOzsKKyAgLS1pc2wtdmVyc2lvbj0qKSBJU0xfVkVSU0lPTj0kb3B0YXJnCisgIDs7CisgIC0tY2xvb2ctdmVyc2lvbj0qKSBDTE9PR19WRVJTSU9OPSRvcGFyZworICA7OworICAtLWdpdD0qKSBHSVRfQ01EPSRvcHRhcmcKKyAgOzsKKyAgLS1naXQtZGF0ZT0qKSBHSVRfREFURT0kb3B0YXJnCisgIDs7CisgIC0tZ2l0LWJyYW5jaD0qKSBHSVRfQlJBTkNIPSRvcHRhcmcKKyAgOzsKKyAgLS1naXQtYmFzZT0qKSBHSVRfQkFTRT0kb3B0YXJnCisgIDs7CisgIC0tZ2l0LXJlZmVyZW5jZT0qKSBHSVRfUkVGRVJFTkNFPSRvcHRhcmcKKyAgOzsKKyAgLS1vdXQtZGlyPSopIE9QVElPTl9PVVRfRElSPSRvcHRhcmcKKyAgOzsKKyAgLS1jYz0qKSBPUFRJT05fQ0M9JG9wdGFyZworICA7OworICAtLWpvYnM9KikgSk9CUz0kb3B0YXJnCisgIDs7CisgIC1qKikgSk9CUz0ke29wdCMtan0KKyAgOzsKKyAgLS1vbmx5LXN5c3Jvb3QpIE9OTFlfU1lTUk9PVD15ZXMKKyAgOzsKKyAgLS1ib290c3RyYXApIEJPT1RTVFJBUD15ZXMKKyAgOzsKKyAgLS1saXN0LXRhc2tzKSBMSVNUX1RBU0tTPXllcworICA7OworICAtKikKKyAgICBlY2hvICJ1bmtub3duIG9wdGlvbiAnJG9wdCcsIHVzZSAtLWhlbHAiCisgICAgZXhpdCAxCisgICAgOzsKKyAgKikKKyAgICBpZiBbIC16ICIkUEFSQU1FVEVSUyIgXTsgdGhlbgorICAgICAgICBQQVJBTUVURVJTPSRvcHQKKyAgICBlbHNlCisgICAgICAgIFBBUkFNRVRFUlM9IiRQQVJBTUVURVJTICRvcHQiCisgICAgZmkKKyAgZXNhYworZG9uZQorCitpZiBbICIkT1BUSU9OX0hFTFAiID0gInllcyIgXTsgdGhlbgorICAgIGNhdCA8PCBFT0YKKworVXNhZ2U6ICRQUk9HTkFNRSBbb3B0aW9uc10gWzxwYXRoLXRvLXRvb2xjaGFpbi1zb3VyY2VzPl0KKworVGhpcyBzY3JpcHQgaXMgdXNlZCB0byByZWJ1aWxkIGEgY3VzdG9tIExpbnV4IGhvc3QgdG9vbGNoYWluIHRoYXQgdGFyZ2V0cworR0xpYmMgJEdMSUJDX1ZFUlNJT04gb3IgaGlnaGVyLiBUaGUgbWFjaGluZSBjb2RlIGdlbmVyYXRlZCBieSB0aGlzIHRvb2xjaGFpbgord2lsbCBydW4gcHJvcGVybHkgb24gVWJ1bnR1ICRVQlVOVFVfUkVMRUFTRSBvciBoaWdoZXIuCisKK0lmIHlvdSdyZSBydW5uaW5nIG9uIGEgMzItYml0IHN5c3RlbSwgaXQgd2lsbCBnZW5lcmF0ZSBhIDMyLWJpdCB0b29sY2hhaW4uCitJZiB5b3UncmUgcnVubmluZyBvbiBhIDY0LWJpdCBzeXN0ZW0sIGl0IHdpbGwgZ2VuZXJhdGUgYSA2NC1iaXQgdG9vbGNoYWluCit1bmxlc3MgeW91IHVzZSB0aGUgLS0zMi1iaXRzIG9wdGlvbi4KKworWW91IGNhbiBwcm92aWRlIHRoZSBwYXRoIHRvIGEgbG9jYWwgY29weSBvZiB0aGUgdG9vbGNoYWluIHNvdXJjZXMgcmVwb3NpdG9yeQorYXMgYSBmaXJzdCBwYXJhbWV0ZXIuIElmIHlvdSBkb24ndCwgdGhlIHNvdXJjZXMgd2lsbCBiZSBkb3dubG9hZGVkIGFuZAorZXh0cmFjdGVkIGF1dG9tYXRpY2FsbHkgaW50byB5b3VyIHdvcmsgZGlyZWN0b3J5LgorCitOb3RlIHRoYXQgdGhpcyBzY3JpcHQgd2lsbCBkb3dubG9hZCB2YXJpb3VzIGJpbmFyeSBwYWNrYWdlcyBmcm9tIFVidW50dQorc2VydmVycyBpbiBvcmRlciB0byBwcmVwYXJlIGEgY29tcGF0aWJsZSAic3lzcm9vdCIuCisKK0J5IGRlZmF1bHQsIGl0IGdlbmVyYXRlcyBhIHBhY2thZ2UgYXJjaGl2ZSAoJFRPT0xDSEFJTl9BUkNISVZFKSBidXQgeW91IGNhbiwKK2FzIGFuIGFsdGVybmF0aXZlLCBhc2sgZm9yIGRpcmVjdCBpbnN0YWxsYXRpb24gd2l0aCAtLXByZWZpeD08cGF0aD4KKworVXNlIHRoZSBib290c3RyYXAgb3B0aW9uIHRvIHJlLWdlbmVyYXRlIHRoZSB0b29sY2hhaW4gd2l0aCBpdHNlbGYuIFRoaXMgaXMKK3VzZWZ1bCBpZiB5b3Ugd2FudCB0byBlbnN1cmUgdGhhdCB0aGUgZ2VuZXJhdGVkIGNvbXBpbGVyIGJpbmFyaWVzIHdpbGwgd29yaworcHJvcGVybHkgb24gVWJ1bnR1IDguMDQgb3IgaGlnaGVyLiBCeSBkZWZhdWx0LCB0aGV5IHdpbGwgb25seSBydW4gb24gc3lzdGVtcwordGhhdCBtYXRjaCB5b3VyIGJ1aWxkIHN5c3RlbSdzIEMgbGlicmFyeSBBQkksIG9yIGhpZ2hlci4KKworT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KK0VPRgorICAgIGVjaG8gIlN0YW5kYXJkIG9wdGlvbnM6IgorICAgIGVjaG8gIiAgLS1oZWxwICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnQgdGhpcyBtZXNzYWdlIgorICAgIGVjaG8gIiAgLS1mb3JjZSAgICAgICAgICAgICAgICAgICAgICAgRm9yY2UtcmVidWlsZCBldmVyeXRoaW5nIgorICAgIGVjaG8gIiAgLS1wcmVmaXg9UEFUSCAgICAgICAgICAgICAgICAgSW5zdGFsbGF0aW9uIHBhdGggWyRQUkVGSVhfRElSXSIKKyAgICBlY2hvICIgIC0tdWJ1bnR1LW1pcnJvcj1VUkwgICAgICAgICAgIFVidW50dSBtaXJyb3IgVVJMIFskVUJVTlRVX01JUlJPUl0iCisgICAgZWNobyAiICAtLXVidW50dS1yZWxlYXNlPU5BTUUgICAgICAgICBVYnVudHUgcmVsZWFzZSBuYW1lIFskVUJVTlRVX1JFTEVBU0VdIgorICAgIGVjaG8gIiAgLS13b3JrLWRpcj1QQVRIICAgICAgICAgICAgICAgVGVtcG9yYXJ5IHdvcmsgZGlyZWN0b3J5IFsvdG1wL2djYy48cmFuZG9tPl0iCisgICAgZWNobyAiICAtLW9ubHktc3lzcm9vdCAgICAgICAgICAgICAgICBPbmx5IGRvd25sb2FkIGFuZCBidWlsZCBzeXNyb290IHBhY2thZ2VzIgorICAgIGVjaG8gIiAgLS12ZXJib3NlICAgICAgICAgICAgICAgICAgICAgVmVyYm9zZSBvdXRwdXQuIENhbiBiZSB1c2VkIHR3aWNlLiIKKyAgICBlY2hvICIgIC0tYmludXRpbHMtdmVyc2lvbj1WRVJTSU9OICAgIEJpbnV0aWxzIHZlcnNpb24gbnVtYmVyIFskQklOVVRJTFNfVkVSU0lPTl0iCisgICAgZWNobyAiICAtLWdjYy12ZXJzaW9uPVZFUlNJT04gICAgICAgICBHQ0MgdmVyc2lvbiBudW1iZXIgWyRHQ0NfVkVSU0lPTl0iCisgICAgZWNobyAiICAtLWdtcC12ZXJzaW9uPVZFUlNJT04gICAgICAgICBHTVAgdmVyc2lvbiBudW1iZXIgWyRHTVBfVkVSU0lPTl0iCisgICAgZWNobyAiICAtLW1wZnItdmVyc2lvbj1WRVJTSU9OICAgICAgICBNUEZSIHZlcnNpb24gbnVtbmVyIFskTVBGUl9WRVJTSU9OXSIKKyAgICBlY2hvICIgIC0tbXBjLXZlcnNpb249VkVSU0lPTiAgICAgICAgIE1QQyB2ZXJzaW9uIG51bWJlciBbJE1QQ19WRVJTSU9OXSIKKyAgICBlY2hvICIgIC0taXNsLXZlcnNpb249VkVSU0lPTiAgICAgICAgIElTTCB2ZXJzaW9uIG51bWJlciBbJElTTF9WRVJTSU9OXSIKKyAgICBlY2hvICIgIC0tY2xvb2ctdmVyc2lvbj1WRVJTSU9OICAgICAgIENsb29nIHZlcnNpb24gbnVtYmVyIFskQ0xPT0dfVkVSU0lPTl0iCisgICAgZWNobyAiICAtLWpvYnM9Q09VTlQgICAgICAgICAgICAgICAgICBSdW4gQ09VTlQgYnVpbGQgam9icyBpbiBwYXJhbGxlbCBbJEpPQlNdIgorICAgIGVjaG8gIiAgLWo8Q09VTlQ+ICAgICAgICAgICAgICAgICAgICAgU2FtZSBhcyAtLWpvYnM9Q09VTlQuIgorICAgIGVjaG8gIiAgLS1naXQ9PGNtZD4gICAgICAgICAgICAgICAgICAgVXNlIHRoaXMgdmVyc2lvbiBvZiB0aGUgZ2l0IHRvb2wgWyRHSVRfQ01EXSIKKyAgICBlY2hvICIgIC0tZ2l0LWRhdGU9PGRhdGU+ICAgICAgICAgICAgIFNwZWNpZnkgc3BlY2lmaWMgZ2l0IGRhdGUgd2hlbiBkb3dubG9hZCBzb3VyY2VzIFtub25lXSIKKyAgICBlY2hvICIgIC0tZ2l0LWJyYW5jaD08bmFtZT4gICAgICAgICAgIFNwZWNpZnkgd2hpY2ggYnJhbmNoIHRvIHVzZSB3aGVuIGRvd25sb2FkaW5nIHRoZSBzb3VyY2VzIFskR0lUX0JSQU5DSF0iCisgICAgZWNobyAiICAtLWdpdC1yZWZlcmVuY2U9PHBhdGg+ICAgICAgICBVc2UgYSBnaXQgcmVmZXJlbmNlIHJlcG9zaXRvcnkiCisgICAgZWNobyAiICAtLWdpdC1iYXNlPTx1cmw+ICAgICAgICAgICAgICBVc2UgdGhpcyBnaXQgcmVwb3NpdG9yeSBiYXNlIFskR0lUX0JBU0VdIgorICAgIGVjaG8gIiAgLS1ib290c3RyYXAgICAgICAgICAgICAgICAgICAgQm9vdHN0cmFwIHRvb2xjaGFpbiAoaS5lLiBjb21waWxlIGl0IHdpdGggaXRzZWxmKSIKKyAgICBlY2hvICIgIC0tMzItYml0cyAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIDMyLWJpdCB0b29sY2hhaW4gb24gNjQtYml0IGJ1aWxkIHN5c3RlbS4iCisgICAgZWNobyAiIgorICAgIGV4aXQgMQorZmkKKworaWYgWyAiJEZPUkNFXzMyIiBdOyB0aGVuCisgICAgaWYgWyAiJEJVSUxEX0JJVFMiID0gNjQgXTsgdGhlbgorICAgICAgICBzZXRfaG9zdF9iaXRzIDMyCisgICAgZWxzZQorICAgICAgIGVjaG8gIldhcm5pbmc6IC0tMzItYml0cyBvcHRpb24gaWdub3JlZCBvbiAzMi1iaXQgYnVpbGQgbWFjaGluZS4iCisgICAgZmkKK2ZpCisKKyMgRGV0ZXJtaW5lIHJvb3Qgd29ya2luZyBkaXJlY3RvcnkgZm9yIG91ciBzY3JpcHQKK2lmIFsgLXogIiRXT1JLX0RJUiIgXTsgdGhlbgorICAgIFdPUktfRElSPSQobWt0ZW1wIC1kIC90bXAvJFVTRVItZ2NjLSRIT1NUX0JJVFMtWFhYWFhYKQorICAgIFdPUktfRElSX0NMRUFOVVA9dHJ1ZQorZWxzZQorICAgIG1rZGlyIC1wICIkV09SS19ESVIiCisgICAgZmFpbF9wYW5pYyAiQ291bGQgbm90IGNyZWF0ZSBkaXJlY3Rvcnk6ICRXT1JLX0RJUiIKKyAgICBXT1JLX0RJUl9DTEVBTlVQPWZhbHNlCitmaQorCitpZiBbIC16ICIkUEFSQU1FVEVSUyIgXSA7IHRoZW4KKyAgICBpZiBbIC1uICIkR0lUX1JFRkVSRU5DRSIgXSA7IHRoZW4KKyAgICAgICAgaWYgWyAhIC1kICIkR0lUX1JFRkVSRU5DRSIgLW8gISAtZCAiJEdJVF9SRUZFUkVOQ0UvYnVpbGQiIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIkVSUk9SOiBJbnZhbGlkIHJlZmVyZW5jZSByZXBvc2l0b3J5IGRpcmVjdG9yeSBwYXRoOiAkR0lUX1JFRkVSRU5DRSIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorICAgICAgICBpZiBbIC1uICIkR0lUX0JBU0UiIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlVzaW5nIGdpdCBjbG9uZSByZWZlcmVuY2U6ICRHSVRfUkVGRVJFTkNFIgorICAgICAgICBlbHNlCisgICAgICAgICAgICAjIElmIHdlIGhhdmUgYSByZWZlcmVuY2Ugd2l0aG91dCBhIGJhc2UsIHVzZSBpdCBhcyBhIGRvd25sb2FkIGJhc2UgaW5zdGVhZC4KKyAgICAgICAgICAgIEdJVF9CQVNFPSRHSVRfUkVGRVJFTkNFCisgICAgICAgICAgICBHSVRfUkVGRVJFTkNFPQorICAgICAgICAgICAgZWNobyAiVXNpbmcgZ2l0IGNsb25lIGJhc2U6ICRHSVRfQkFTRSIKKyAgICAgICAgZmkKKyAgICBlbGlmIFsgLXogIiRHSVRfQkFTRSIgXTsgdGhlbgorICAgICAgICBHSVRfQkFTRT0kR0lUX0JBU0VfREVGQVVMVAorICAgICAgICBlY2hvICJBdXRvLWNvbmZpZzogLS1naXQtYmFzZT0kR0lUX0JBU0UiCisgICAgZmkKKworICAgICMgTG9jYXRpb24gd2hlcmUgd2Ugd2lsbCBkb3dubG9hZCB0aGUgdG9vbGNoYWluIHNvdXJjZXMKKyAgICBUT09MQ0hBSU5fU1JDX0RJUj0kV09SS19ESVIvdG9vbGNoYWluLXNyYworZWxzZQorICAgIHNldF9wYXJhbWV0ZXJzICgpIHsKKyAgICAgICAgVE9PTENIQUlOX1NSQ19ESVI9IiQxIgorICAgICAgICBpZiBbICEgLWQgIiRUT09MQ0hBSU5fU1JDX0RJUiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiRVJST1I6IE5vdCBhIGRpcmVjdG9yeTogJDEiCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKyAgICAgICAgaWYgWyAhIC1kICIkVE9PTENIQUlOX1NSQ19ESVIvYnVpbGQiIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIkVSUk9SOiBNaXNzaW5nIGRpcmVjdG9yeTogJDEvYnVpbGQiCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKyAgICB9CisKKyAgICBzZXRfcGFyYW1ldGVycyAkUEFSQU1FVEVSUworZmkKKworIyBMb2NhdGlvbiBvZiBvcmlnaW5hbCBzeXNyb290LiBUaGlzIGlzIHdoZXJlIHdlJ3JlIGdvaW5nIHRvIGV4dHJhY3QgYWxsCisjIGJpbmFyeSBVYnVudHUgcGFja2FnZXMuCitPUkdfU1lTUk9PVF9ESVI9JFdPUktfRElSL3N5c3Jvb3QKKworIyBOYW1lIG9mIHRoZSBmaW5hbCBnZW5lcmF0ZWQgdG9vbGNoYWluCitUT09MQ0hBSU5fTkFNRT0kR0NDX1RBUkdFVC1nbGliYyRHTElCQ19WRVJTSU9OLSQobWFqb3JfbWlub3Jfb25seSAkR0NDX1ZFUlNJT04pCisKKyMgTmFtZSBvZiB0aGUgZmluYWwgdG9vbGNoYWluIGJpbmFyeSB0YXJiYWxsIHRoYXQgdGhpcyBzY3JpcHQgd2lsbCBjcmVhdGUKK1RPT0xDSEFJTl9BUkNISVZFPS90bXAvJFRPT0xDSEFJTl9OQU1FLnRhci5iejIKKworIyBBIGZpbGUgdGhhdCB3aWxsIGNvbnRhaW4gZGV0YWlscyBhYm91dCBhbGwgdGhlIHNvdXJjZXMgdXNlZCB0byBnZW5lcmF0ZQorIyB0aGUgZmluYWwgdG9vbGNoYWluLiBUaGlzIGluY2x1ZGVzIGJvdGggU0hBLTEgZm9yIHRvb2xjaGFpbiBnaXQgcmVwb3NpdG9yaWVzCisjIGFuZCBTSEEtMSBoYXNoZXMgZm9yIGRvd25sb2FkZWQgVWJ1bnR1IHBhY2thZ2VzLgorU09VUkNFU19MSVNUPSRXT1JLX0RJUi9TT1VSQ0VTCisKKyMgRGV0ZXJtaW5lIE1ha2UgZmxhZ3MKK01BS0VfRkxBR1M9Ii1qJEpPQlMiCisKKyMgQ3JlYXRlIHRoZSB3b3JrIGRpcmVjdG9yeQorbWtkaXIgLXAgIiRXT1JLX0RJUiIKK21rZGlyIC1wICIkVE9PTENIQUlOX1NSQ19ESVIiCisKKyMgTG9jYXRpb24gd2hlcmUgd2UgZG93bmxvYWQgcGFja2FnZXMgZnJvbSB0aGUgVWJ1bnR1IHNlcnZlcnMKK0RPV05MT0FEX0RJUj0kV09SS19ESVIvZG93bmxvYWQKKworIyBFbXB0eSB0aGUgU09VUkNFUyBmaWxlCitybSAtZiAiJFNPVVJDRVNfTElTVCIgJiYgdG91Y2ggIiRTT1VSQ0VTX0xJU1QiCisKKworaWYgWyAiJFZFUkJPU0UiIC1nZSAxIF0gOyB0aGVuCisgICAgcnVuICgpIHsKKyAgICAgICAgZWNobyAiIyMgQ09NTUFORDogJEAiCisgICAgICAgICRACisgICAgfQorICAgIGxvZyAoKSB7CisgICAgICAgIGVjaG8gIiRAIgorICAgIH0KKyAgICBpZiBbICIkVkVSQk9TRSIgLWdlIDIgXSA7IHRoZW4KKyAgICAgICAgbG9nMiAoKSB7CisgICAgICAgICAgICBlY2hvICIkQCIKKyAgICAgICAgfQorICAgIGVsc2UKKyAgICAgICAgbG9nMiAoKSB7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgfQorICAgIGZpCitlbHNlCisgICAgcnVuICgpIHsKKyAgICAgICAgIiRAIiA+PiRUTVBMT0cgMj4mMQorICAgIH0KKyAgICBsb2cgKCkgeworICAgICAgICByZXR1cm4KKyAgICB9CisgICAgbG9nMiAoKSB7CisgICAgICAgIHJldHVybgorICAgIH0KK2ZpCisKKyMgU2FuaXRpemUgYSBwYXRoIGxpc3QsIHdlIHdhbnQgdG8gcmVtb3ZlIGVtcHR5IHN1Yi1kaXJzIGFuZAorIyBsZWFkaW5nL3RyYWlsaW5nIGNvbHVtbnMuCitzYW5pdGl6ZV9wYXRoX2xpc3QgKCkKK3sKKyAgbG9jYWwgUkVTVUxUCisgIFJFU1VMVD0kKHByaW50ZiAiJXNcbiIgIiQqIiB8IHRyICc6JyAnXG4nIHwgYXdrICckMSAhPSAiIiAmJiAkMSAhPSAiLiIgeyBwcmludCAkMDsgfScgfCB0ciAnXG4nICc6JykKKyAgcHJpbnRmICIlcyIgJHtSRVNVTFQlOn0KK30KKworUEFUSD0kKHNhbml0aXplX3BhdGhfbGlzdCAkUEFUSCkKK0xEX0xJQlJBUllfUEFUSD0kKHNhbml0aXplX3BhdGhfbGlzdCAkTERfTElCUkFSWV9QQVRIKQorCitCVUlMRF9ESVI9JFdPUktfRElSL2J1aWxkCitta2RpciAtcCAkQlVJTERfRElSCisKK1RNUExPRz0kQlVJTERfRElSL2J1aWxkLmxvZworcm0gLXJmICRUTVBMT0cgJiYgdG91Y2ggJFRNUExPRworCitidWlsZF9kaXJfZm9yICgpIHsgZWNobyAiJEJVSUxEX0RJUi8kUEhBU0UvJDEiOyB9CisKK1RJTUVTVEFNUFNfRElSPSRCVUlMRF9ESVIvdGltZXN0YW1wcworbWtkaXIgLXAgJFRJTUVTVEFNUFNfRElSCisKK3N0YW1wX2NoZWNrICgpIHsKKyAgICBbIC1mICIkVElNRVNUQU1QU19ESVIvJDEiIF0KK30KKworc3RhbXBfY2xlYXIgKCkgeworICAgIHJtIC1mICIkVElNRVNUQU1QU19ESVIvJDEiCit9CisKK3N0YW1wX3NldCAoKSB7CisgICAgdG91Y2ggIiRUSU1FU1RBTVBTX0RJUi8kMSIKK30KKworaWYgWyAiJEZPUkNFIiA9ICJ5ZXMiIF0gOyB0aGVuCisgICAgZWNobyAiQ2xlYW5pbmcgdXAgdGltZXN0YW1wcyAoZm9yY2luZyB0aGUgYnVpbGQpLiIKKyAgICBybSAtZiAkVElNRVNUQU1QU19ESVIvKgorZmkKKworaWYgWyAiJFZFUkJPU0UiID0gMCBdIDsgdGhlbgorICAgIGVjaG8gIlRvIGZvbGxvdyBidWlsZCwgcnVuOiB0YWlsIC1GICRUTVBMT0ciCitmaQorCisjIHJldHVybnMgMCBpZmYgdGhlIHN0cmluZyBpbiAkMiBtYXRjaGVzIHRoZSBwYXR0ZXJuIGluICQxCisjICQxOiBwYXR0ZXJuCisjICQyOiBzdHJpbmcKK3BhdHRlcm5fbWF0Y2ggKCkKK3sKKyAgICBlY2hvICIkMiIgfCBncmVwIC1xIC1FIC1lICIkMSIKK30KKworIyBGaW5kIGlmIGEgZ2l2ZW4gc2hlbGwgcHJvZ3JhbSBpcyBhdmFpbGFibGUuCisjIFdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIHRoZSBmYWN0IHRoYXQgdGhlICd3aGljaCA8Zm9vPicgY29tbWFuZAorIyBtYXkgcmV0dXJuIGVpdGhlciBhbiBlbXB0eSBzdHJpbmcgKExpbnV4KSBvciBzb21ldGhpbmcgbGlrZQorIyAibm8gPGZvbz4gaW4gLi4uIiAoRGFyd2luKS4gQWxzbywgd2UgbmVlZCB0byByZWRpcmVjdCBzdGRlcnIKKyMgdG8gL2Rldi9udWxsIGZvciBDeWd3aW4KKyMKKyMgJDE6IHZhcmlhYmxlIG5hbWUKKyMgJDI6IHByb2dyYW0gbmFtZQorIworIyBSZXN1bHQ6IHNldCAkMSB0byB0aGUgZnVsbCBwYXRoIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNvbW1hbmQKKyMgICAgICAgICBvciB0byB0aGUgZW1wdHkvdW5kZWZpbmVkIHN0cmluZyBpZiBub3QgYXZhaWxhYmxlCisjCitmaW5kX3Byb2dyYW0gKCkKK3sKKyAgICBsb2NhbCBQUk9HCisgICAgUFJPRz1gd2hpY2ggJDIgMj4vZGV2L251bGxgCisgICAgaWYgWyAtbiAiJFBST0ciIF0gOyB0aGVuCisgICAgICAgIGlmIHBhdHRlcm5fbWF0Y2ggJ15ubyAnICIkUFJPRyI7IHRoZW4KKyAgICAgICAgICAgIFBST0c9CisgICAgICAgIGZpCisgICAgZmkKKyAgICBldmFsICQxPSIkUFJPRyIKK30KKworIyBDb3B5IGEgZGlyZWN0b3J5LCBjcmVhdGUgdGFyZ2V0IGxvY2F0aW9uIGlmIG5lZWRlZAorIworIyAkMTogc291cmNlIGRpcmVjdG9yeQorIyAkMjogdGFyZ2V0IGRpcmVjdG9yeSBsb2NhdGlvbgorIworY29weV9kaXJlY3RvcnkgKCkKK3sKKyAgICBsb2NhbCBTUkNESVI9IiQxIgorICAgIGxvY2FsIERTVERJUj0iJDIiCisgICAgaWYgWyAhIC1kICIkU1JDRElSIiBdIDsgdGhlbgorICAgICAgICBwYW5pYyAiQ2FuJ3QgY29weSBmcm9tIG5vbi1kaXJlY3Rvcnk6ICRTUkNESVIiCisgICAgZmkKKyAgICBsb2cyICJEaXJlY3RvcnkgY29weTogJFNSQ0RJUiAtPiAkRFNURElSIgorICAgIG1rZGlyIC1wICIkRFNURElSIiAmJiAoY2QgIiRTUkNESVIiICYmIHRhciBjZiAtICopIHwgKHRhciB4ZiAtIC1DICIkRFNURElSIikKKyAgICBmYWlsX3BhbmljICJDYW5ub3QgY29weSB0byBkaXJlY3Rvcnk6ICREU1RESVIiCit9CisKK2ZpbmRfcHJvZ3JhbSBDTURfV0dFVCB3Z2V0CitmaW5kX3Byb2dyYW0gQ01EX0NVUkwgY3VybAorZmluZF9wcm9ncmFtIENNRF9TQ1AgIHNjcAorCisjIERvd25sb2FkIGEgZmlsZSB3aXRoIGVpdGhlciAnY3VybCcsICd3Z2V0JyBvciAnc2NwJworIworIyAkMTogc291cmNlIFVSTCAoZS5nLiBodHRwOi8vZm9vLmNvbSwgc3NoOi8vYmxhaCwgL3NvbWUvcGF0aCkKKyMgJDI6IHRhcmdldCBmaWxlCitkb3dubG9hZF9maWxlICgpCit7CisgICAgIyBJcyB0aGlzIEhUVFAsIEhUVFBTIG9yIEZUUCA/CisgICAgaWYgcGF0dGVybl9tYXRjaCAiXihodHRwfGh0dHBzfGZ0cCk6LioiICIkMSI7IHRoZW4KKyAgICAgICAgaWYgWyAtbiAiJENNRF9XR0VUIiBdIDsgdGhlbgorICAgICAgICAgICAgcnVuICRDTURfV0dFVCAtTyAkMiAkMQorICAgICAgICBlbGlmIFsgLW4gIiRDTURfQ1VSTCIgXSA7IHRoZW4KKyAgICAgICAgICAgIHJ1biAkQ01EX0NVUkwgLW8gJDIgJDEKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiUGxlYXNlIGluc3RhbGwgd2dldCBvciBjdXJsIG9uIHRoaXMgbWFjaGluZSIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorICAgICAgICByZXR1cm4KKyAgICBmaQorCisgICAgIyBJcyB0aGlzIFNTSCA/CisgICAgIyBBY2NlcHQgYm90aCBzc2g6Ly88cGF0aD4gb3IgPG1hY2hpbmU+OjxwYXRoPgorICAgICMKKyAgICBpZiBwYXR0ZXJuX21hdGNoICJeKHNzaHxbXjpdKyk6LioiICIkMSI7IHRoZW4KKyAgICAgICAgaWYgWyAtbiAiJENNRF9TQ1AiIF0gOyB0aGVuCisgICAgICAgICAgICBzY3Bfc3JjPWBlY2hvICQxIHwgc2VkIC1lIHMlc3NoOi8vJSVnYAorICAgICAgICAgICAgcnVuICRDTURfU0NQICRzY3Bfc3JjICQyCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlBsZWFzZSBpbnN0YWxsIHNjcCBvbiB0aGlzIG1hY2hpbmUiCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKyAgICAgICAgcmV0dXJuCisgICAgZmkKKworICAgICMgSXMgdGhpcyBhIGZpbGUgY29weSA/CisgICAgIyBBY2NlcHQgYm90aCBmaWxlOi8vPHBhdGg+IG9yIC88cGF0aD4KKyAgICAjCisgICAgaWYgcGF0dGVybl9tYXRjaCAiXihmaWxlOi8vfC8pLioiICIkMSI7IHRoZW4KKyAgICAgICAgY3Bfc3JjPWBlY2hvICQxIHwgc2VkIC1lIHMlXmZpbGU6Ly8lJWdgCisgICAgICAgIHJ1biBjcCAtZiAkY3Bfc3JjICQyCisgICAgICAgIHJldHVybgorICAgIGZpCisKKyAgICAjIFVua25vd24gc2NoZW1hCisgICAgZWNobyAiRVJST1I6IFVuc3VwcG9ydGVkIHNvdXJjZSBVUkk6ICQxIgorICAgIGV4aXQgMQorfQorCisjIEEgdmFyaWFudCBvZiAnZG93bmxvYWRfZmlsZScgdXNlZCB0byBzcGVjaWZ5IHRoZSB0YXJnZXQgZGlyZWN0b3J5CisjICQxOiBzb3VyY2UgVVJMCisjICQyOiB0YXJnZXQgZGlyZWN0b3J5Citkb3dubG9hZF9maWxlX3RvICgpCit7CisgICAgbG9jYWwgVVJMPSIkMSIKKyAgICBsb2NhbCBESVI9IiQyIgorICAgIGxvY2FsIERTVD0iJERJUi9gYmFzZW5hbWUgJFVSTGAiCisgICAgbWtkaXIgLXAgJERJUgorICAgIGRvd25sb2FkX2ZpbGUgIiRVUkwiICIkRFNUIgorfQorCisjIFBhY2sgYSBnaXZlbiBhcmNoaXZlCisjCisjICQxOiBhcmNoaXZlIGZpbGUgcGF0aCAoaW5jbHVkaW5nIGV4dGVuc2lvbikKKyMgJDI6IHNvdXJjZSBkaXJlY3RvcnkgZm9yIGFyY2hpdmUgY29udGVudAorIyAkMys6IGxpc3Qgb2YgZmlsZXMgKGluY2x1ZGluZyBwYXR0ZXJucyksIGFsbCBpZiBlbXB0eQorcGFja19hcmNoaXZlICgpCit7CisgICAgbG9jYWwgQVJDSElWRT0iJDEiCisgICAgbG9jYWwgU1JDRElSPSIkMiIKKyAgICBsb2NhbCBTUkNGSUxFUworICAgIGxvY2FsIFRBUkZMQUdTIFpJUEZMQUdTCisgICAgc2hpZnQ7IHNoaWZ0OworICAgIGlmIFsgLXogIiQxIiBdIDsgdGhlbgorICAgICAgICBTUkNGSUxFUz0iKiIKKyAgICBlbHNlCisgICAgICAgIFNSQ0ZJTEVTPSIkQCIKKyAgICBmaQorICAgIGlmIFsgImBiYXNlbmFtZSAkQVJDSElWRWAiID0gIiRBUkNISVZFIiBdIDsgdGhlbgorICAgICAgICBBUkNISVZFPSJgcHdkYC8kQVJDSElWRSIKKyAgICBmaQorICAgIG1rZGlyIC1wIGBkaXJuYW1lICRBUkNISVZFYAorICAgIGlmIFsgIiRWRVJCT1NFIiAtZ2UgMiBdIDsgdGhlbgorICAgICAgICBUQVJGTEFHUz0idmNmIgorICAgICAgICBaSVBGTEFHUz0iLTlyIgorICAgIGVsc2UKKyAgICAgICAgVEFSRkxBR1M9ImNmIgorICAgICAgICBaSVBGTEFHUz0iLTlxciIKKyAgICBmaQorICAgIGNhc2UgIiRBUkNISVZFIiBpbgorICAgICAgICAqLnppcCkKKyAgICAgICAgICAgIChjZCAkU1JDRElSICYmIHJ1biB6aXAgJFpJUEZMQUdTICIkQVJDSElWRSIgJFNSQ0ZJTEVTKQorICAgICAgICAgICAgOzsKKyAgICAgICAgKi50YXIpCisgICAgICAgICAgICAoY2QgJFNSQ0RJUiAmJiBydW4gdGFyICRUQVJGTEFHUyAiJEFSQ0hJVkUiICRTUkNGSUxFUykKKyAgICAgICAgICAgIDs7CisgICAgICAgICoudGFyLmd6KQorICAgICAgICAgICAgKGNkICRTUkNESVIgJiYgcnVuIHRhciB6JFRBUkZMQUdTICIkQVJDSElWRSIgJFNSQ0ZJTEVTKQorICAgICAgICAgICAgOzsKKyAgICAgICAgKi50YXIuYnoyKQorICAgICAgICAgICAgKGNkICRTUkNESVIgJiYgcnVuIHRhciBqJFRBUkZMQUdTICIkQVJDSElWRSIgJFNSQ0ZJTEVTKQorICAgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICAgIHBhbmljICJVbnN1cHBvcnRlZCBhcmNoaXZlIGZvcm1hdDogJEFSQ0hJVkUiCisgICAgICAgICAgICA7OworICAgIGVzYWMKK30KKworbm9fdHJhaWxpbmdfc2xhc2ggKCkKK3sKKyAgICBlY2hvICR7MSMjL30KK30KKworIyBMb2FkIHRoZSBVYnVudHUgcGFja2FnZXMgZmlsZS4gVGhpcyBpcyBhIGxvbmcgdGV4dCBmaWxlIHRoYXQgd2lsbCBsaXN0CisjIGVhY2ggcGFja2FnZSBmb3IgYSBnaXZlbiByZWxlYXNlLgorIworIyAkMTogVWJ1bnR1IG1pcnJvciBiYXNlIFVSTCAoZS5nLiBodHRwOi8vbWlycm9ycy51cy5rZXJuZWwub3JnLykKKyMgJDI6IFJlbGVhc2UgbmFtZQorIworZ2V0X3VidW50dV9wYWNrYWdlc19saXN0ICgpCit7CisgICAgbG9jYWwgUkVMRUFTRT0kMgorICAgIGxvY2FsIEJBU0U9ImBub190cmFpbGluZ19zbGFzaCBcIiQxXCJgIgorICAgIGxvY2FsIFNSQ0ZJTEUgRFNURklMRQorICAgIGZvciBVQSBpbiAkVUJVTlRVX0FSQ0hTOyBkbworICAgICAgICBTUkNGSUxFPSIkQkFTRS91YnVudHUvZGlzdHMvJFJFTEVBU0UvbWFpbi9iaW5hcnktJFVBL1BhY2thZ2VzLmJ6MiIKKyAgICAgICAgRFNURklMRT0iJERPV05MT0FEX0RJUi9QYWNrYWdlcy0kVUEuYnoyIgorICAgICAgICBsb2cgIlRyeWluZyB0byBsb2FkICRTUkNGSUxFIgorICAgICAgICBkb3dubG9hZF9maWxlICIkU1JDRklMRSIgIiREU1RGSUxFIgorICAgICAgICBmYWlsX3BhbmljICJDb3VsZCBub3QgZG93bmxvYWQgJFNSQ0ZJTEUiCisgICAgICAgIChjZCAkRE9XTkxPQURfRElSICYmIGJ1bnppcDIgLWNmIFBhY2thZ2VzLSRVQS5iejIgPiBQYWNrYWdlcy0kVUEpCisgICAgICAgIGZhaWxfcGFuaWMgIkNvdWxkIG5vdCB1bmNvbXByZXNzICREU1RGSUxFIHRvIFBhY2thZ2VzLSRVQSIKKyAgICBkb25lCisKKyAgICAjIFdyaXRlIGEgc21hbGwgYXdrIHNjcmlwdCB1c2VkIHRvIGV4dHJhY3QgZmlsZW5hbWVzIGZvciBhIGdpdmVuIHBhY2thZ2UKKyAgICBjYXQgPiAkRE9XTkxPQURfRElSL2V4dHJhY3QtZmlsZW5hbWUuYXdrIDw8RU9GCitCRUdJTiB7CisgICAgIyBlc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHBhY2thZ2UgbmFtZQorICAgIGdzdWIoIlxcXFwuIiwiXFxcXC4iLFBLRykKKyAgICBnc3ViKCJcXFxcKyIsIlxcXFwrIixQS0cpCisgICAgRklMRSA9ICIiCisgICAgUEFDS0FHRSA9ICIiCit9CisKK1wkMSA9PSAiUGFja2FnZToiIHsKKyAgICBpZiAoXCQyID09IFBLRykgeworICAgICAgICBQQUNLQUdFID0gXCQyCisgICAgfSBlbHNlIHsKKyAgICAgICAgUEFDS0FHRSA9ICIiCisgICAgfQorfQorCitcJDEgPT0gIkZpbGVuYW1lOiIgJiYgUEFDS0FHRSA9PSBQS0cgeworICAgIEZJTEUgPSBcJDIKK30KKworRU5EIHsKKyAgICBwcmludCBGSUxFCit9CitFT0YKK30KKworIyBDb252ZXJ0IGFuIHVudmVyc2lvbmVkIHBhY2thZ2UgbmFtZSBpbnRvIGEgLmRlYiBwYWNrYWdlIFVSTAorIworIyAkMTogUGFja2FnZSBuYW1lIHdpdGhvdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiAoZS5nLiBsaWJjNi1kZXYpCisjICQyOiBVYnVudHUgbWlycm9yIGJhc2UgVVJMCisjICQzOiBVYnVudHUgYXJjaCAoImkzODYiIG9yICJhbWQ2NCIpCisjCitnZXRfdWJ1bnR1X3BhY2thZ2VfZGViX3VybCAoKQoreworICAgICMgVGhlIGZvbGxvd2luZyBpcyBhbiBhd2sgY29tbWFuZCB0byBwYXJzZSB0aGUgUGFja2FnZXMgZmlsZSBhbmQgZXh0cmFjdAorICAgICMgdGhlIGZpbGVuYW1lIG9mIGEgZ2l2ZW4gcGFja2FnZS4KKyAgICBsb2NhbCBCQVNFPSJgbm9fdHJhaWxpbmdfc2xhc2ggXCIkMVwiYCIKKyAgICBsb2NhbCBGSUxFPWBhd2sgLWYgIiRET1dOTE9BRF9ESVIvZXh0cmFjdC1maWxlbmFtZS5hd2siIC12IFBLRz0kMSAkRE9XTkxPQURfRElSL1BhY2thZ2VzLSQzYAorICAgIGlmIFsgLXogIiRGSUxFIiBdOyB0aGVuCisgICAgICAgIGxvZyAiQ291bGQgbm90IGZpbmQgZmlsZW5hbWUgZm9yIHBhY2thZ2UgJDEiCisgICAgICAgIGV4aXQgMQorICAgIGZpCisgICAgZWNobyAiJDIvdWJ1bnR1LyRGSUxFIgorfQorCisjIERvZXMgdGhlIGhvc3QgY29tcGlsZXIgZ2VuZXJhdGUgMzItYml0IG1hY2hpbmUgY29kZT8KKyMgSWYgbm90LCBhZGQgdGhlIC1tMzIgZmxhZyB0byB0aGUgY29tcGlsZXIgbmFtZSB0byBlbnN1cmUgdGhpcy4KKyMKK2NvbXB1dGVfaG9zdF9mbGFncyAoKQoreworICAgIEhPU1RfQ0M9JHtDQzotZ2NjfQorICAgIEhPU1RfQ1hYPSR7Q1hYLWcrK30KKyAgICBpZiBbIC1uICIkVVNFX0NDQUNIRSIgXTsgdGhlbgorICAgICAgICBlY2hvIC1uICJDaGVja2luZyBmb3IgY2NhY2hlLi4uIgorICAgICAgICBmaW5kX3Byb2dyYW0gQ01EX0NDQUNIRSBjY2FjaGUKKyAgICAgICAgaWYgWyAtbiAiJENNRF9DQ0FDSEUiIF0gOyB0aGVuCisgICAgICAgICAgICBlY2hvICIkSE9TVF9DQyIgfCB0ciAnICcgJ1xuJyB8IGdyZXAgLXEgLWUgImNjYWNoZSIKKyAgICAgICAgICAgIGlmIFsgJD8gPSAwIF0gOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyAieWVzIChpZ25vcmVkKSIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlY2hvICJ5ZXMiCisgICAgICAgICAgICAgICAgSE9TVF9DQz0iY2NhY2hlICRIT1NUX0NDIgorICAgICAgICAgICAgICAgIEhPU1RfQ1hYPSJjY2FjaGUgJEhPU1RfQ1hYIgorICAgICAgICAgICAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAibm8iCisgICAgICAgIGZpCisgICAgZmkKKyAgICBlY2hvIC1uICJDaGVja2luZyBjb21waWxlciBiaXRuZXNzLi4uICIKKyAgICBjYXQgPiAiJEJVSUxEX0RJUiIvY29uZnRlc3QuYyA8PCBFT0YKKyNpbmNsdWRlIDxzdGRpby5oPgoraW50IG1haW4odm9pZCkgeworICAgIHByaW50ZigiJWRcbiIsc2l6ZW9mKHZvaWQqKSo4KTsKKyAgICByZXR1cm4gMDsKK30KK0VPRgorICAgICRIT1NUX0NDIC1vICIkQlVJTERfRElSIi9jb25mdGVzdCAiJEJVSUxEX0RJUiIvY29uZnRlc3QuYyA+ICIkQlVJTERfRElSIi9jb25mdGVzdC5sb2cgMj4mMQorICAgIGlmIFsgJD8gIT0gMCBdIDsgdGhlbgorICAgICAgICBlY2hvICJDb3VsZCBub3QgY29tcGlsZSB0ZXN0IHByb2dyYW0hISIKKyAgICAgICAgZWNobyAiRXJyb3IgbG9nIGlzOiIKKyAgICAgICAgY2F0ICIkQlVJTERfRElSIi9jb25mdGVzdC5sb2cKKyAgICAgICAgcm0gIiRCVUlEX0RJUiIvY29uZnRlc3QubG9nCisgICAgICAgIHBhbmljICJOZWVkIGEgd29ya2luZyBidWlsZCB0b29sY2hhaW4hIgorICAgIGZpCisgICAgSE9TVF9DQ19CSVRTPSQoIiRCVUlMRF9ESVIiL2NvbmZ0ZXN0KQorICAgIGVjaG8gLW4gIiRIT1NUX0NDX0JJVFMiCisgICAgY2FzZSAkSE9TVF9DQ19CSVRTIGluCisgICAgICAgIDMyKSAjIE5vdGhpbmcgdG8gZG8KKyAgICAgICAgICAgIDs7CisgICAgICAgIDY0KSAjIERvIHdlIG5lZWQgdG8gZm9yY2UgMzItYml0cworICAgICAgICAgICAgaWYgWyAiJEZPUkNFXzMyIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyAiIChmb3JjaW5nIGdlbmVyYXRpb24gb2YgMzItYml0IGJpbmFyaWVzKSIKKyAgICAgICAgICAgICAgICBIT1NUX0NDPSRIT1NUX0NDIiAtbTMyIgorICAgICAgICAgICAgICAgIEhPU1RfQ1hYPSRIT1NUX0NYWCIgLW0zMiIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgcGFuaWMgIlVua25vd24gYml0bmVzcyAoMzIgb3IgNjQgZXhwZWN0ZWQpICEhIgorICAgIGVzYWMKKyAgICBlY2hvICIiCisgICAgZWNobyAiVXNpbmcgYnVpbGQgQyBjb21waWxlcjogJEhPU1RfQ0MiCisgICAgZWNobyAiVXNpbmcgYnVpbGQgQysrIGNvbXBpbGVyOiAkSE9TVF9DWFgiCisgICAgZWNobyAiR0NDIHRhcmdldCBuYW1lOiAkR0NDX1RBUkdFVCIKKyAgICBlY2hvICJHTVAgdGFyZ2V0IG5hbWU6ICRHTVBfVEFSR0VUIgorICAgIGVjaG8gIkdNUCBBQkk6ICRHTVBfQUJJIgorICAgIGV4cG9ydCBDQz0iJEhPU1RfQ0MiCisgICAgZXhwb3J0IENYWD0iJEhPU1RfQ1hYIgorfQorCitjb21wdXRlX2hvc3RfZmxhZ3MKKworIyBSZXR1cm4gdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gbmFtZWQgdmFyaWFibGUKKyMgJDE6IHZhcmlhYmxlIG5hbWUKKyMKKyMgZXhhbXBsZToKKyMgICAgRk9PPUJBUgorIyAgICBCQVI9Wk9PCisjICAgIGVjaG8gYHZhcl92YWx1ZSAkRk9PYAorIyAgICB3aWxsIHByaW50ICdaT08nCisjCit2YXJfdmFsdWUgKCkKK3sKKyAgICBldmFsIGVjaG8gXCQkMQorfQorCit2YXJfbGlzdF9hcHBlbmQgKCkKK3sKKyAgICBsb2NhbCBWQVJOQU1FPSQxCisgICAgbG9jYWwgVkFSVkFMPWB2YXJfdmFsdWUgJFZBUk5BTUVgCisgICAgc2hpZnQKKyAgICBpZiBbIC16ICIkVkFSVkFMIiBdIDsgdGhlbgorICAgICAgICBldmFsICRWQVJOQU1FPVwiJEBcIgorICAgIGVsc2UKKyAgICAgICAgZXZhbCAkVkFSTkFNRT1cIiRWQVJWQUwgJEBcIgorICAgIGZpCit9CisKK3Zhcl9saXN0X3ByZXBlbmQgKCkKK3sKKyAgICBsb2NhbCBWQVJOQU1FPSQxCisgICAgbG9jYWwgVkFSVkFMPWB2YXJfdmFsdWUgJFZBUk5BTUVgCisgICAgc2hpZnQKKyAgICBpZiBbIC16ICIkVkFSVkFMIiBdIDsgdGhlbgorICAgICAgICBldmFsICRWQVJOQU1FPVwiJEBcIgorICAgIGVsc2UKKyAgICAgICAgZXZhbCAkVkFSTkFNRT1cIiRAICRWQVJWQUxcIgorICAgIGZpCit9CisKK19saXN0X2ZpcnN0ICgpCit7CisgICAgZWNobyAkMQorfQorCitfbGlzdF9yZXN0ICgpCit7CisgICAgc2hpZnQKKyAgICBlY2hvICIkQCIKK30KKworX2xpc3RfcmV2ZXJzZSAoKQoreworICAgIGxvY2FsIEkxIEkyIEkzIEk0IEk1IEk2IEk3IEk4IEk5IFJFU1QgUkVUCisgICAgSTE9JDE7IEkyPSQyOyBJMz0kMzsgSTQ9JEk0OyBJNT0kSTU7IEk2PSRJNjsgSTc9JEk3OyBJOD0kSTg7IEk5PSRJOQorICAgIHNoaWZ0IDkKKyAgICBSRVQ9JEk5JHtJODorIiAifSRJOCR7STc6KyIgIn0kSTcke0k2OisiICJ9JEk2JHtJNTorIiAifSRJNSR7STQ6KyIgIn0kSTQke0kzOisiICJ9JEkzJHtJMjorIiAifSRJMiR7STE6KyIgIn0kSTEKKyAgICBSRVNUPSIkKiIKKyAgICBpZiBbICIkUkVTVCIgXTsgdGhlbgorICAgICAgICBSRVQ9JChfbGlzdF9yZXZlcnNlICRSRVNUKSRSRVQKKyAgICBmaQorICAgIGVjaG8gIiRSRVQiCit9CisKK3Zhcl9saXN0X3BvcF9maXJzdCAoKQoreworICAgIGxvY2FsIFZBUk5BTUU9JDEKKyAgICBsb2NhbCBWQVJWQUw9YHZhcl92YWx1ZSAkVkFSTkFNRWAKKyAgICBsb2NhbCBGSVJTVD1gX2xpc3RfZmlyc3QgJFZBUlZBTGAKKyAgICBldmFsICRWQVJOQU1FPVwiYF9saXN0X3Jlc3QgJFZBUlZBTGBcIgorICAgIGVjaG8gIiRGSVJTVCIKK30KKworX2xpc3RfZmlyc3QgKCkKK3sKKyAgICBlY2hvICQxCit9CisKK19saXN0X3Jlc3QgKCkKK3sKKyAgICBzaGlmdAorICAgIGVjaG8gIiRAIgorfQorCit2YXJfbGlzdF9maXJzdCAoKQoreworICAgIGxvY2FsIFZBTD1gdmFyX3ZhbHVlICQxYAorICAgIF9saXN0X2ZpcnN0ICRWQUwKK30KKwordmFyX2xpc3RfcmVzdCAoKQoreworICAgIGxvY2FsIFZBTD1gdmFyX3ZhbHVlICQxYAorICAgIF9saXN0X3Jlc3QgJFZBTAorfQorCitBTExfVEFTS1M9CisKKyMgRGVmaW5lIGEgbmV3IHRhc2sgZm9yIHRoaXMgYnVpbGQgc2NyaXB0CisjICQxOiBUYXNrIG5hbWUgKGUuZy4gYnVpbGRfc3R1ZmYpCisjICQyOiBUYXNrIGRlc2NyaXB0aW9uCisjICQzOiBPcHRpb25hbDogY29tbWFuZCBuYW1lICh3aWxsIGJlIGNtZF8kMSBieSBkZWZhdWx0KQorIwordGFza19kZWZpbmUgKCkKK3sKKyAgICBsb2NhbCBUQVNLPSIkMSIKKyAgICBsb2NhbCBERVNDUj0iJDIiCisgICAgbG9jYWwgQ09NTUFORD0iJHszOi1jbWRfJDF9IgorCisgICAgdmFyX2xpc3RfYXBwZW5kIEFMTF9UQVNLUyAkVEFTSworICAgIHRhc2tfc2V0ICRUQVNLIG5hbWUgIiRUQVNLIgorICAgIHRhc2tfc2V0ICRUQVNLIGRlc2NyICIkREVTQ1IiCisgICAgdGFza19zZXQgJFRBU0sgY21kICIkQ09NTUFORCIKKyAgICB0YXNrX3NldCAkVEFTSyBkZXBzICIiCit9CisKKyMgVmFyaWFudCBvZiB0YXNrIGRlZmluZSBmb3IgZHVhbCB0YXNrcworIyBUaGlzIHJlYWxseSBkZWZpbmVzIHR3byB0YXNrcyBuYW1lZCAnPHRhc2s+XzEnIGFuZCAnPHRhc2s+XzIiCisjICQxOiBUYXNrIGJhc2UgbmFtZQorIyAkMjogVGFzayBkZXNjcmlwdGlvbgorIyAkMzogT3B0aW9uYWw6IGNvbW1hbmQgbmFtZSAod2lsbCBiZSBjbWRfJDEgYnkgZGVmYXVsdCkKK3Rhc2syX2RlZmluZSAoKQoreworICAgIGxvY2FsIFRBU0s9IiQxIgorICAgIGxvY2FsIERFU0NSPSIkMiIKKyAgICBsb2NhbCBDT01NQU5EPSIkezM6LWNtZF8kMX0iCisKKyAgICB0YXNrX2RlZmluZSAiJHtUQVNLfV8xIiAiJERFU0NSIDEvMiIgInBoYXNlXzEgJENPTU1BTkQiCisgICAgdGFza19kZWZpbmUgIiR7VEFTS31fMiIgIiRERVNDUiAyLzIiICJwaGFzZV8yICRDT01NQU5EIgorfQorCit0YXNrX3NldCAoKQoreworICAgIGxvY2FsIFRBU0s9IiQxIgorICAgIGxvY2FsIEZJRUxEPSIkMiIKKyAgICBzaGlmdDsgc2hpZnQ7CisgICAgZXZhbCBUQVNLXyR7VEFTS31fXyR7RklFTER9PVwiJEBcIgorfQorCit0YXNrX2dldCAoKQoreworICAgIHZhcl92YWx1ZSBUQVNLXyQxX18kMgorfQorCisjIHJldHVybiB0aGUgbGlzdCBvZiBkZXBlbmRlbmNpZXMgZm9yIGEgZ2l2ZW4gdGFzawordGFza19nZXRfZGVwcyAoKQoreworICAgIHRhc2tfZ2V0ICQxIGRlcHMKK30KKwordGFza19nZXRfY21kICgpCit7CisgICAgdGFza19nZXQgJDEgY21kCit9CisKK3Rhc2tfZ2V0X2Rlc2NyICgpCit7CisgICAgdGFza19nZXQgJDEgZGVzY3IKK30KKworIyAkMTogdGFzayBuYW1lCisjICQyKzogb3RoZXIgdGFza3MgdGhpcyB0YXNrIGRlcGVuZHMgb24uCit0YXNrX2RlcGVuZHMgKCkKK3sKKyAgICBsb2NhbCBUQVNLPSIkMSIKKyAgICBzaGlmdDsKKyAgICB2YXJfbGlzdF9hcHBlbmQgVEFTS18ke1RBU0t9X19kZXBzICRACit9CisKKyMgJDE6IGR1YWwgdGFzayBuYW1lCisjICQyKzogb3RoZXIgbm9uLWR1YWwgdGFza3MgdGhpcyBkdWFsIHRhc2sgZGVwZW5kcyBvbgordGFzazJfZGVwZW5kczEgKCkKK3sKKyAgICBsb2NhbCBUQVNLPSIkMSIKKyAgICBzaGlmdAorICAgIHZhcl9saXN0X2FwcGVuZCBUQVNLXyR7VEFTS31fMV9fZGVwcyAkQAorICAgIHZhcl9saXN0X2FwcGVuZCBUQVNLXyR7VEFTS31fMl9fZGVwcyAkQAorfQorCisjICQxOiBkdWFsIHRhc2sgbmFtZQorIyAkMis6IG90aGVyIGR1YWwgdGFza3MgdGhpcyBkdWFsIHRhc2sgZGVwZW5kcyBvbgordGFzazJfZGVwZW5kczIgKCkKK3sKKyAgICBsb2NhbCBUQVNLPSIkMSIKKyAgICBsb2NhbCBERVAKKyAgICBzaGlmdAorICAgIGZvciBERVA7IGRvCisgICAgICAgIHZhcl9saXN0X2FwcGVuZCBUQVNLXyR7VEFTS31fMV9fZGVwcyAke0RFUH1fMQorICAgICAgICB2YXJfbGlzdF9hcHBlbmQgVEFTS18ke1RBU0t9XzJfX2RlcHMgJHtERVB9XzIKKyAgICBkb25lCit9CisKK3Rhc2tfZHVtcCAoKQoreworICAgIGxvY2FsIFRBU0sKKyAgICBmb3IgVEFTSyBpbiAkQUxMX1RBU0tTOyBkbworICAgICAgICBsb2NhbCBERVBTPSJgdGFza19nZXRfZGVwcyAkVEFTS2AiCisgICAgICAgIGxvY2FsIENNRD0iYHRhc2tfZ2V0X2NtZCAkVEFTS2AiCisgICAgICAgIGxvY2FsIERFU0NSPSJgdGFza19nZXRfZGVzY3IgJFRBU0tgIgorICAgICAgICBlY2hvICJUQVNLICRUQVNLOiAkREVTQ1I6ICRDTUQiCisgICAgICAgIGVjaG8gIj4gICRERVBTIgorICAgIGRvbmUKK30KKwordGFza192aXNpdCAoKQoreworICAgIHRhc2tfc2V0ICRUQVNLIHZpc2l0IDEKK30KKwordGFza191bnZpc2l0ICgpCit7CisgICAgdGFza19zZXQgJFRBU0sgdmlzaXQgMAorfQorCit0YXNrX2lzX3Zpc2l0ZWQgKCkKK3sKKyAgICBbIGB0YXNrX2dldCAkVEFTSyB2aXNpdGAgPSAxIF0KK30KKwordGFza19xdWV1ZV9yZXNldCAoKQoreworICAgIFRBU0tfUVVFVUU9Cit9CisKK3Rhc2tfcXVldWVfcHVzaCAoKQoreworICAgIHZhcl9saXN0X2FwcGVuZCBUQVNLX1FVRVVFICQxCit9CisKK3Rhc2tfcXVldWVfcG9wICgpCit7CisgICAgbG9jYWwgRklSU1Q9YHZhcl9saXN0X2ZpcnN0IFRBU0tfUVVFVUVgCisgICAgVEFTS19RVUVVRT1gdmFyX2xpc3RfcmVzdCBUQVNLX1FVRVVFYAorfQorCitkb19hbGxfdGFza3MgKCkKK3sKKyAgICBsb2NhbCBUQVNLCisgICAgbG9jYWwgVEFTS19MSVNUPQorICAgIHRhc2tfcXVldWVfcmVzZXQKKyAgICAjIENsZWFyIHZpc2l0IGZsYWdzCisgICAgZm9yIFRBU0sgaW4gJEFMTF9UQVNLUzsgZG8KKyAgICAgICAgdGFza191bnZpc2l0ICRUQVNLCisgICAgZG9uZQorICAgIHRhc2tfcXVldWVfcHVzaCAkMQorICAgIHdoaWxlIFsgLW4gIiRUQVNLX1FVRVVFIiBdIDsgZG8KKyAgICAgICAgVEFTSz1gdGFza19xdWV1ZV9wb3BgCisgICAgICAgIGlmIHRhc2tfaXNfdmlzaXRlZCAkVEFTSzsgdGhlbgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZmkKKyAgICAgICAgIyBQcmVwZW5kIHRoZSB0YXNrIHRvIHRoZSBsaXN0IGlmIGl0cyB0aW1lc3RhbXAgaXMgbm90IHNldAorICAgICAgICBpZiBzdGFtcF9jaGVjayAkVEFTSzsgdGhlbgorICAgICAgICAgICAgdmFyX2xpc3RfcHJlcGVuZCBUQVNLX0xJU1QgJFRBU0sKKyAgICAgICAgZmkKKyAgICAgICAgIyBBZGQgYWxsIGRlcGVuZGVuY2llcyB0byB0aGUgd29yay1xdWV1ZQorICAgICAgICBsb2NhbCBTVUJUQVNLCisgICAgICAgIGZvciBTVUJUQVNLIGluIGB0YXNrX2dldF9kZXBzICRUQVNLYDsgZG8KKyAgICAgICAgICAgIHRhc2tfcXVldWVfcHVzaCAkU1VCVEFTSworICAgICAgICBkb25lCisgICAgICAgIHRhc2tfdmlzaXQgJFRBU0sKKyAgICBkb25lCisKKyAgICAjIE5vdywgVEFTS19MSVNUIGNvbnRhaW5zIHRoZQorfQorCisKKyMgUmV0dXJuIHRoZSBmaXJzdCBpdGVtIG9mIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3QKK2xpc3RfZmlyc3QgKCkgeworICAgIHNldCAtLSAiJEAiCisgICAgZWNobyAiJDEiCit9CisKKyMgQXBwZW5kIGFuIGl0ZW0gdG8gYSBnaXZlbiBsaXN0CitsaXN0X2FwcGVuZCAoKSB7CisgICAgbG9jYWwgSVRFTT0kMQorICAgIHNoaWZ0OworICAgIGVjaG8gJEAke0A6KyIgIn0kMQorfQorCisjIFJldHVybiB0aGUgc2Vjb25kLXRvLWxhc3QgaXRlbXMgb2YgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdAorbGlzdF9yZXN0ICgpIHsKKyAgICBzZXQgLS0gIiRAIgorICAgIHNoaWZ0CisgICAgZWNobyAiJEAiCit9CisKKyMgUmV2ZXJzZSBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0CitsaXN0X3JldmVyc2UgKCkKK3sKKyAgICBzZXQgLS0gIiRAIgorICAgIGxvY2FsIEkxIEkyIEkzIEk0IEk1IEk2IEk3IEk4IEk5IFJFU1QgUkVUCisgICAgSTE9JDE7IEkyPSQyOyBJMz0kMzsgSTQ9JDQ7IEk1PSQ1OyBJNj0kNjsgSTc9JDc7IEk4PSQ4OyBJOT0kOQorICAgIHNoaWZ0OyBzaGlmdDsgc2hpZnQ7IHNoaWZ0OyBzaGlmdDsgc2hpZnQ7IHNoaWZ0OyBzaGlmdDsgc2hpZnQ7CisgICAgUkVUPSRJOSR7STk6KyIgIn0kSTgke0k4OisiICJ9JEk3JHtJNzorIiAifSRJNiR7STY6KyIgIn0kSTUke0k1OisiICJ9JEk0JHtJNDorIiAifSRJMyR7STM6KyIgIn0kSTIke0kyOisiICJ9JEkxCisgICAgUkVTVD0iJCoiCisgICAgaWYgWyAtbiAiJFJFU1QiIF07IHRoZW4KKyAgICAgICAgUkVUPSQobGlzdF9yZXZlcnNlICRSRVNUKSIgIiRSRVQKKyAgICBmaQorICAgIGVjaG8gIiRSRVQiCit9CisKKyMgVXNlZCB0byBidWlsZCB0aGUgbGlzdCBvZiB0YXNrcyB3aXRoIGEgdHJlZSBwb3N0LW9yZGVyIHRyYXZlcnNhbCwgaS5lLgorIyB0aGUgbGlzdCBzdGFydHMgYXQgdGhlIGxlYXZlcyBhbmQgZmluaXNoZXMgd2l0aCB0aGUgdG9wIGxldmVsIHRhc2ssCisjIHNvIHRoYXQgaWYgdGFzayhBKSBkZXBlbmRzIG9uIHRhc2soQiksIHRoZW4gQSB3aWxsIGFsd2F5cyBhcHBlYXIgX2FmdGVyXworIyBCIGluIHRoZSByZXN1bHQuCisjCisjICQxOiBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiB0YXNrcyB0byB2aXNpdAorIyBPdXQ6IGxpc3Qgb2YgYWxsIHRhc2tzIGluIHBvc3Qtb3JkZXIKKyMKK3Rhc2tfYnVpbGRfcG9zdG9yZGVyX2xpc3QgKCkKK3sKKyAgICBsb2NhbCBUQVNLCisgICAgbG9jYWwgU1RBQ0s9IiQxIgorICAgIGxvY2FsIFJFVD0iIgorICAgIGZvciBUQVNLIGluICRBTExfVEFTS1M7IGRvCisgICAgICAgIHN0YW1wX2NsZWFyICRUQVNLLnZpc2l0CisgICAgZG9uZQorICAgIHdoaWxlIHRydWU7IGRvCisgICAgICAgICMgUGVlayBhdCBzdGFjaworICAgICAgICBUQVNLPSQobGlzdF9maXJzdCAkU1RBQ0spCisgICAgICAgICNlY2hvID4mMiAiU1RBQ0s6ICgkVEFTSykgJyRTVEFDSyciCisgICAgICAgIGlmIFsgLXogIiRUQVNLIiBdOyB0aGVuCisgICAgICAgICAgICBicmVhaworICAgICAgICBmaQorICAgICAgICBIQVNfREVQUz0KKyAgICAgICAgZm9yIERFUCBpbiAkKHRhc2tfZ2V0X2RlcHMgJFRBU0spOyBkbworICAgICAgICAgICAgI2VjaG8gPiYyICJDSEVDSzogJyRERVAnIgorICAgICAgICAgICAgaWYgISBzdGFtcF9jaGVjayAkREVQLnZpc2l0OyB0aGVuCisgICAgICAgICAgICAgICAgU1RBQ0s9JERFUCIgIiRTVEFDSworICAgICAgICAgICAgICAgICNlY2hvID4mMiAiUFVTSDogJyRERVAnID0+ICckU1RBQ0snIgorICAgICAgICAgICAgICAgIEhBU19ERVBTPTEKKyAgICAgICAgICAgIGZpCisgICAgICAgIGRvbmUKKworICAgICAgICBpZiBbIC16ICIkSEFTX0RFUFMiIF07IHRoZW4KKyAgICAgICAgICAgICNlY2hvID4mMiAiQUREOiAkVEFTSyAtPiAnJFJFVCciCisgICAgICAgICAgICBTVEFDSz0kKGxpc3RfcmVzdCAkU1RBQ0spCisgICAgICAgICAgICBpZiAhIHN0YW1wX2NoZWNrICRUQVNLLnZpc2l0OyB0aGVuCisgICAgICAgICAgICAgICAgUkVUPSRSRVQke1JFVDorIiAifSRUQVNLCisgICAgICAgICAgICAgICAgc3RhbXBfc2V0ICRUQVNLLnZpc2l0CisgICAgICAgICAgICBmaQorICAgICAgICBmaQorICAgIGRvbmUKKyAgICBmb3IgVEFTSyBpbiAkQUxMX1RBU0tTOyBkbworICAgICAgICBzdGFtcF9jbGVhciAkVEFTSy52aXNpdAorICAgIGRvbmUKKyAgICBlY2hvICIkUkVUIgorfQorCitydW5fdGFzayAoKQoreworICAgICMgQnVpbGQgdGhlIGxpc3Qgb2YgdGFza3MsIGluIHJldmVyc2Ugb3JkZXIgKGZyb20gbGVhZnMgdG8gbGFzdCkKKyAgICBsb2NhbCBUQVNLUz0kKHRhc2tfYnVpbGRfcG9zdG9yZGVyX2xpc3QgJDEpCisgICAgIyBEbyBhbGwgdGFza3MKKyAgICBsb2NhbCBUQVNLIERFUCBERVNDUgorCisgICAgIyBEdW1wIGxpc3Qgb2YgdGFza3M6CisjICAgICBlY2hvICJBTEwgVEFTS1M6IgorIyAgICAgZm9yIFRBU0sgaW4gJFRBU0tTOyBkbworIyAgICAgICAgIGVjaG8gIiAgJFRBU0siCisjICAgICBkb25lCisKKyAgICAjIENsZWFuIHRpbWVzdGFtcHMgb2YgYW55IHRhc2tzIHdob3NlIGFueSBvZiBpdHMgZGVwZW5kZW50cyBuZWVkcworICAgICMgdG8gYmUgcmUtZG9uZS4KKyAgICAjCisgICAgZm9yIFRBU0sgaW4gJFRBU0tTOyBkbworICAgICAgIGZvciBERVAgaW4gJCh0YXNrX2dldF9kZXBzICRUQVNLKTsgZG8KKyAgICAgICAgICAgIGlmICEgc3RhbXBfY2hlY2sgJERFUDsgdGhlbgorICAgICAgICAgICAgICAgICNlY2hvICJSZWRvOiAkVEFTSyBkdWUgdG8gJERFUCIKKyAgICAgICAgICAgICAgICBzdGFtcF9jbGVhciAkVEFTSworICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBmaQorICAgICAgIGRvbmUKKyAgICBkb25lCisKKyAgICBmb3IgVEFTSyBpbiAkVEFTS1M7IGRvCisgICAgICAgIERFU0NSPSQodGFza19nZXRfZGVzY3IgJFRBU0spCisgICAgICAgIGlmIHN0YW1wX2NoZWNrICRUQVNLOyB0aGVuCisgICAgICAgICAgICBlY2hvICJTa2lwcGluZzogJERFU0NSIgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZmkKKyAgICAgICAgZWNobyAiUnVubmluZzogJERFU0NSIgorICAgICAgICBpZiBbICIkVkVSQk9TRSIgLWdlIDEgXSA7IHRoZW4KKyAgICAgICAgICAgIChldmFsICQodGFza19nZXRfY21kICRUQVNLKSkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKGV2YWwgJCh0YXNrX2dldF9jbWQgJFRBU0spKSA+PiAkVE1QTE9HIDI+JjEKKyAgICAgICAgZmkKKyAgICAgICAgaWYgWyAkPyAhPSAwIF0gOyB0aGVuCisgICAgICAgICAgICBlY2hvICJFUlJPUjogQ2Fubm90ICRERVNDUiIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorCisgICAgICAgIHN0YW1wX3NldCAkVEFTSworICAgIGRvbmUKK30KKworIyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2xvbmUgYSBzb3VyY2UgcmVwb3NpdG9yeSBlaXRoZXIgZnJvbSBhIGdpdmVuCisjIGdpdCBiYXNlIG9yIGEgZ2l0IHJlZmVyZW5jZS4KKyMgJDE6IHByb2plY3Qvc3ViZGlyIG5hbWUKKyMgJDI6IHBhdGggdG8gU09VUkNFUyBmaWxlCit0b29sY2hhaW5fY2xvbmUgKCkKK3sKKyAgICBsb2NhbCBHSVRGTEFHUworICAgIEdJVEZMQUdTPQorICAgIGlmIFsgIiRHSVRfUkVGRVJFTkNFIiBdOyB0aGVuCisgICAgICAgIEdJVEZMQUdTPSIkR0lURkxBR1MgLS1zaGFyZWQgLS1yZWZlcmVuY2UgJEdJVF9SRUZFUkVOQ0UvJDEiCisgICAgZmkKKyAgICBlY2hvICJjbGVhbmluZyB1cCB0b29sY2hhaW4vJDEiCisgICAgcm0gLXJmICQxCisgICAgZmFpbF9wYW5pYyAiQ291bGQgbm90IGNsZWFuICQocHdkKS8kMSIKKyAgICBlY2hvICJkb3dubG9hZGluZyBzb3VyY2VzIGZvciB0b29sY2hhaW4vJDEiCisgICAgaWYgWyAtZCAiJEdJVF9CQVNFLyQxIiBdOyB0aGVuCisgICAgICAgIGxvZyAiY2xvbmluZyAkR0lUX0JBU0UvJDEiCisgICAgICAgIHJ1biAkR0lUX0NNRCBjbG9uZSAkR0lURkxBR1MgJEdJVF9CQVNFLyQxICQxCisgICAgZWxzZQorICAgICAgICBsb2cgImNsb25pbmcgJEdJVFBSRUZJWC8kMS5naXQiCisgICAgICAgIHJ1biAkR0lUX0NNRCBjbG9uZSAkR0lURkxBR1MgJEdJVF9CQVNFLyQxLmdpdCAkMQorICAgIGZpCisgICAgZmFpbF9wYW5pYyAiQ291bGQgbm90IGNsb25lICRHSVRfQkFTRS8kMS5naXQgPyIKKyAgICBjZCAkMQorICAgIGlmIFsgIiRHSVRfQlJBTkNIIiAhPSAibWFzdGVyIiBdIDsgdGhlbgorICAgICAgICBsb2cgImNoZWNraW5nIG91dCAkR0lUX0JSQU5DSCBicmFuY2ggb2YgJDEuZ2l0IgorICAgICAgICBydW4gJEdJVF9DTUQgY2hlY2tvdXQgLWIgJEdJVF9CUkFOQ0ggb3JpZ2luLyRHSVRfQlJBTkNICisgICAgICAgIGZhaWxfcGFuaWMgIkNvdWxkIG5vdCBjaGVja291dCAkMSA/IgorICAgIGZpCisgICAgIyBJZiAtLWdpdC1kYXRlIGlzIHVzZWQsIG9yIHdlIGhhdmUgYSBkZWZhdWx0CisgICAgaWYgWyAtbiAiJEdJVF9EQVRFIiBdIDsgdGhlbgorICAgICAgICBSRVZJU0lPTj1gZ2l0IHJldi1saXN0IC1uIDEgLS11bnRpbD0iJEdJVF9EQVRFIiBIRUFEYAorICAgICAgICBlY2hvICJVc2luZyBzb3VyY2VzIGZvciBkYXRlICckR0lUX0RBVEUnOiB0b29sY2hhaW4vJDEgcmV2aXNpb24gJFJFVklTSU9OIgorICAgICAgICBydW4gJEdJVF9DTUQgY2hlY2tvdXQgJFJFVklTSU9OCisgICAgICAgIGZhaWxfcGFuaWMgIkNvdWxkIG5vdCBjaGVja291dCAkMSA/IgorICAgIGZpCisgICAgKHByaW50ZiAiJS0zMnMgIiAidG9vbGNoYWluLyQxLmdpdDogIiAmJiBnaXQgbG9nIC0xIC0tZm9ybWF0PW9uZWxpbmUpID4+ICQyCisgICAgY2QgLi4KK30KKwordGFza19kZWZpbmUgZG93bmxvYWRfdG9vbGNoYWluX3NvdXJjZXMgIkRvd25sb2FkIHRvb2xjaGFpbiBzb3VyY2VzIGZyb20gJEdJVF9CQVNFICIKK2NtZF9kb3dubG9hZF90b29sY2hhaW5fc291cmNlcyAoKQoreworICAgIGxvY2FsIFNVQkRJUlM9ImJpbnV0aWxzIGJ1aWxkIGdjYyBnZGIgZ29sZCBnbXAgbXBmciBtcGMgaXNsIGNsb29nIgorICAgIChta2RpciAtcCAkVE9PTENIQUlOX1NSQ19ESVIgJiYgY2QgJFRPT0xDSEFJTl9TUkNfRElSICYmCisgICAgIyBDcmVhdGUgYSB0ZW1wb3JhcnkgU09VUkNFUyBmaWxlIGZvciB0aGUgdG9vbGNoYWluIHNvdXJjZXMgb25seQorICAgICMgSXQncyBjb250ZW50IHdpbGwgYmUgY29waWVkIHRvIHRoZSBmaW5hbCBTT1VSQ0VTIGZpbGUgbGF0ZXIuCisgICAgU09VUkNFU19MSVNUPSRUT09MQ0hBSU5fU1JDX0RJUi9TT1VSQ0VTCisgICAgcm0gLWYgJFNPVVJDRVNfTElTVCAmJiB0b3VjaCAkU09VUkNFU19MSVNUCisgICAgZm9yIFNVQiBpbiAkU1VCRElSUzsgZG8KKyAgICAgICAgdG9vbGNoYWluX2Nsb25lICRTVUIgJFNPVVJDRVNfTElTVAorICAgIGRvbmUKKyAgICApCit9CisKK3Rhc2tfZGVmaW5lIGRvd25sb2FkX3VidW50dV9wYWNrYWdlc19saXN0ICJEb3dubG9hZCBVYnVudHUgcGFja2FnZXMgbGlzdCIKK2NtZF9kb3dubG9hZF91YnVudHVfcGFja2FnZXNfbGlzdCAoKQoreworICAgIG1rZGlyIC1wICRET1dOTE9BRF9ESVIKKyAgICBnZXRfdWJ1bnR1X3BhY2thZ2VzX2xpc3QgIiRVQlVOVFVfTUlSUk9SIiAiJFVCVU5UVV9SRUxFQVNFIgorICAgIGZhaWxfcGFuaWMgIlVuYWJsZSB0byBkb3dubG9hZCBwYWNrYWdlcyBsaXN0LCB0cnkgLS11YnVudHUtbWlycm9yPTx1cmw+IHRvIHVzZSBhbm90aGVyIGFyY2hpdmUgbWlycm9yIgorfQorCit0YXNrX2RlZmluZSBkb3dubG9hZF9wYWNrYWdlcyAiRG93bmxvYWQgVWJ1bnR1IHBhY2thZ2VzIgordGFza19kZXBlbmRzIGRvd25sb2FkX3BhY2thZ2VzIGRvd25sb2FkX3VidW50dV9wYWNrYWdlc19saXN0CitjbWRfZG93bmxvYWRfcGFja2FnZXMgKCkKK3sKKyAgICBsb2NhbCBQQUNLQUdFIFBLR1VSTAorCisgICAgcm0gLWYgJERPV05MT0FEX0RJUi9TT1VSQ0VTICYmIHRvdWNoICRET1dOTE9BRF9ESVIvU09VUkNFUworICAgIGZvciBQQUNLQUdFIGluICRVQlVOVFVfUEFDS0FHRVM7IGRvCisgICAgICAgIGVjaG8gIkRvd25sb2FkaW5nICRQQUNLQUdFIgorCSAgICBmb3IgVUEgaW4gJFVCVU5UVV9BUkNIUzsgZG8KKyAgICAgICAgICAgIFBLR1VSTD1gZ2V0X3VidW50dV9wYWNrYWdlX2RlYl91cmwgJFBBQ0tBR0UgJFVCVU5UVV9NSVJST1IgJFVBYAorICAgICAgICAgICAgZWNobyAiVVJMOiAkUEtHVVJMIgorICAgICAgICAgICAgZG93bmxvYWRfZmlsZV90byAkUEtHVVJMICRET1dOTE9BRF9ESVIKKyAgICAgICAgICAgIGZhaWxfcGFuaWMgIkNvdWxkIG5vdCBkb3dubG9hZCAkUEtHVVJMIgorICAgICAgICBkb25lCisgICAgZG9uZQorICAgIHNoYTFzdW0gJERPV05MT0FEX0RJUi8qLmRlYiB8IHdoaWxlIHJlYWQgTElORTsgZG8KKyAgICAgICAgUEFDS0FHRT0kKGJhc2VuYW1lICQoZWNobyAkTElORSB8IGF3ayAneyBwcmludCAkMjt9JykpCisgICAgICAgIFNIQTE9JChlY2hvICRMSU5FIHwgYXdrICd7IHByaW50ICQxOyB9JykKKyAgICAgICAgcHJpbnRmICIlLTY0cyAlc1xuIiAkUEFDS0FHRSAkU0hBMSA+PiAkRE9XTkxPQURfRElSL1NPVVJDRVMKKyAgICBkb25lCit9CisKK3Rhc2tfZGVmaW5lIGJ1aWxkX3N5c3Jvb3QgIkJ1aWxkIHN5c3Jvb3QiCit0YXNrX2RlcGVuZHMgYnVpbGRfc3lzcm9vdCBkb3dubG9hZF9wYWNrYWdlcworCitjbWRfYnVpbGRfc3lzcm9vdCAoKQoreworICAgIGxvY2FsIFBBQ0tBR0UgUEtHVVJMIFNSQ19QS0cKKyAgICBta2RpciAtcCAkU1JDX1BLRyAkT1JHX1NZU1JPT1RfRElSCisgICAgZm9yIFBBQ0tBR0UgaW4gJFVCVU5UVV9QQUNLQUdFUzsgZG8KKwkgICAgZm9yIFVBIGluICRVQlVOVFVfQVJDSFM7IGRvCisgICAgICAgICAgICBQS0dVUkw9YGdldF91YnVudHVfcGFja2FnZV9kZWJfdXJsICRQQUNLQUdFICRVQlVOVFVfTUlSUk9SICRVQWAKKyAgICAgICAgICAgIFNSQ19QS0c9JERPV05MT0FEX0RJUi9gYmFzZW5hbWUgJFBLR1VSTGAKKyAgICAgICAgICAgIGVjaG8gIkV4dHJhY3RpbmcgJFNSQ19QS0ciCisgICAgICAgICAgICBkcGtnIC14ICRTUkNfUEtHICRPUkdfU1lTUk9PVF9ESVIvJFVBCisJICAgIGRvbmUKKyAgICBkb25lCit9CisKKyMgTm93LCB3ZSBuZWVkIHRvIHBhdGNoIGxpYmMuc28gd2hpY2ggaXMgYWN0dWFsbHkgYSBsaW5rZXIgc2NyaXB0CisjIHJlZmVyZW5jaW5nIC9saWIqIGFuZCAvdXNyL2xpYiouIERvIHRoZSBzYW1lIGZvciBsaWJwdGhyZWFkLnNvCitwYXRjaF9saWJyYXJ5ICgpCit7CisgICAgZWNobyAiUGF0Y2hpbmcgJDEiCisgICAgc2VkIC1pIC1lICJzOiAvdXNyL2xpYlteIF0qLzogOmc7czogL2xpYlteIF0qLzogOmciICQxCit9CisKKyMgVXNlZCB0byBzZXR1cCBwaGFzZSAxIHRoZSBydW4gYSBjb21tYW5kCitwaGFzZV8xICgpCit7CisgICAgUEhBU0U9MQorICAgICRACit9CisKKyMgVXNlZCB0byBzZXR1cCBwaGFzZSAyIHRoZW4gcnVuIGEgY29tbWFuZAorcGhhc2VfMiAoKQoreworICAgIFBIQVNFPTEKKyAgICBCSU5QUkVGSVg9JChpbnN0YWxsX2RpcikvYmluLyR7R0NDX1RBUkdFVH0tCisgICAgQ0M9JHtCSU5QUkVGSVh9Z2NjCisgICAgQ1hYPSR7QklOUFJFRklYfWcrKworICAgIExEPSR7QklOUFJFRklYfWxkCisgICAgQVI9JHtCSU5QUkVGSVh9YXIKKyAgICBBUz0ke0JJTlBSRUZJWH1hcworICAgIFJBTkxJQj0ke0JJTlBSRUZJWH1yYW5saWIKKyAgICBTVFJJUD0ke0JJTlBSRUZJWH1zdHJpcAorICAgIENDX0ZPUl9UQVJHRVQ9JHtCSU5QUkVGSVh9Z2NjCisgICAgZXhwb3J0IENDIENYWCBMRCBBUiBBUyBSQU5MSUIgU1RSSVAgQ0NfRk9SX1RBUkdFVAorICAgIFBIQVNFPTIKKyAgICAkQAorfQorCisjIFJldHVybiB0aGUgbGlzdCBvZiBhbGwgc3ltYm9saWMgbGlua3MgaW4gYSBnaXZlbiBkaXJlY3RvcnksIGV4Y2x1ZGluZworIyBhbnkgbGlua3MgaW4gaXRzIHN1Yi1kaXJlY3Rvcmllcy4KKyMgJDE6IFN1Yi1kaXJlY3RvcnkgcGF0aC4KK2ZpbmRfc3ltbGlua3NfaW4gKCkgeworICAgIChjZCAkMSAmJiBmaW5kIC4gLW1heGRlcHRoIDEgLXR5cGUgbCkgfCBzZWQgLWUgJ3N8XlwuL3x8ZycKK30KKwordGFzazJfZGVmaW5lIGNvcHlfc3lzcm9vdCAiRml4IGFuZCBjb3B5IHN5c3Jvb3QiCit0YXNrMl9kZXBlbmRzMSBjb3B5X3N5c3Jvb3QgYnVpbGRfc3lzcm9vdAorY21kX2NvcHlfc3lzcm9vdCAoKQoreworICAgIGxvY2FsIFNMCisKKyAgICAjIENvcHkgdGhlIGNvbnRlbnQgb2YgJE9SR19TWVNST09UX0RJUi8uLi4vbGliIHRvICQoc3lzcm9vdF9kaXIpL3Vzci9saWIzMgorICAgIGNvcHlfZGlyZWN0b3J5ICRPUkdfU1lTUk9PVF9ESVIvaTM4Ni9saWIgJChzeXNyb290X2RpcikvdXNyL2xpYjMyCisgICAgY29weV9kaXJlY3RvcnkgJE9SR19TWVNST09UX0RJUi9pMzg2L3Vzci9saWIgJChzeXNyb290X2RpcikvdXNyL2xpYjMyCisgICAgY29weV9kaXJlY3RvcnkgJE9SR19TWVNST09UX0RJUi9pMzg2L3Vzci9pbmNsdWRlICQoc3lzcm9vdF9kaXIpL3Vzci9pbmNsdWRlCisKKyAgICBjb3B5X2RpcmVjdG9yeSAkT1JHX1NZU1JPT1RfRElSL2FtZDY0L2xpYiAkKHN5c3Jvb3RfZGlyKS91c3IvbGliCisgICAgY29weV9kaXJlY3RvcnkgJE9SR19TWVNST09UX0RJUi9hbWQ2NC91c3IvbGliICQoc3lzcm9vdF9kaXIpL3Vzci9saWIKKyAgICBjb3B5X2RpcmVjdG9yeSAkT1JHX1NZU1JPT1RfRElSL2FtZDY0L3Vzci9pbmNsdWRlICQoc3lzcm9vdF9kaXIpL3Vzci9pbmNsdWRlCisKKyAgICAjIFVidW50dSBwcmVjaXNlIHJlbGVhc2UgaGFzIC5zbyBmaWxlcyBpbgorICAgICMgL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudSBhbmQgL3Vzci9saWIzMi9pMzg2LWxpbnV4LWdudS4KKyAgICBmb3IgTElCIGluICQoc3lzcm9vdF9kaXIpL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudSBcCisgICAgICAgICAgICAgICAkKHN5c3Jvb3RfZGlyKS91c3IvbGliMzIvaTM4Ni1saW51eC1nbnU7IGRvCisgICAgICAgIG12ICRMSUIvKiBgZGlybmFtZSAkTElCYCAmJiBybWRpciAkTElCCisgICAgICAgIGZhaWxfcGFuaWMgIkNhbm5vdCBtb3ZlIGZpbGVzIGluICRMSUIiCisgICAgZG9uZQorCisgICAgZm9yIExJQiBpbiBsaWIgbGliMzI7IGRvCisgICAgICAgICMgV2UgbmVlZCB0byBmaXggdGhlIHN5bWxpbmsgbGlrZSBsaWJydC5zbyAtPiAvbGliKi9saWJydC5zby4xCisgICAgICAgICMgaW4gJChzeXNyb290X2RpcikvdXNyLyRMSUIsIHRoZXkgc2hvdWxkIHBvaW50IHRvIGxpYnJ0LnNvLjEgaW5zdGVhZCBub3cuCisgICAgICAgIFNZTUxJTktTPSQoZmluZF9zeW1saW5rc19pbiAkKHN5c3Jvb3RfZGlyKS91c3IvJExJQikKKyAgICAgICAgY2QgJChzeXNyb290X2RpcikvdXNyLyRMSUIKKyAgICAgICAgZm9yIFNMIGluICRTWU1MSU5LUzsgZG8KKyAgICAgICAgICAgICMgY29udmVydCAvJExJQi9saWJmb28uc28uPG4+IGludG8gJ2xpYmZvby5zby48bj4nIGZvciB0aGUgdGFyZ2V0CisgICAgICAgICAgICBsb2NhbCBEU1Q9JChyZWFkbGluayAkU0wgMj4vZGV2L251bGwpCisgICAgICAgICAgICBsb2NhbCBEU1QyPWBiYXNlbmFtZSAkRFNUYAorICAgICAgICAgICAgaWYgWyAiJERTVDIiICE9ICIkRFNUIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyAiRml4aW5nIHN5bWxpbmsgJFNMIC0tPiAkRFNUIgorICAgICAgICAgICAgICAgIHJtICRTTCAmJiBsbiAtcyAkRFNUMiAkU0wKKyAgICAgICAgICAgIGZpCisgICAgICAgIGRvbmUKKyAgICAgICAgcGF0Y2hfbGlicmFyeSBsaWJjLnNvCisgICAgICAgIHBhdGNoX2xpYnJhcnkgbGlicHRocmVhZC5zbworICAgIGRvbmUKK30KKwordGFza19kZWZpbmUgcGF0Y2hfdG9vbGNoYWluX3NvdXJjZXMgIlBhdGNoIHRvb2xjaGFpbiBzb3VyY2VzLiIKK3Rhc2tfZGVwZW5kcyBwYXRjaF90b29sY2hhaW5fc291cmNlcyBkb3dubG9hZF90b29sY2hhaW5fc291cmNlcworY21kX3BhdGNoX3Rvb2xjaGFpbl9zb3VyY2VzICgpCit7CisgICAgbG9nICJQQVRDSEVTX0RJUiA9ICRQQVRDSEVTX0RJUiIKKyAgICBpZiBbICEgLWQgIiRQQVRDSEVTX0RJUiIgXTsgdGhlbgorICAgICAgICBsb2cgIiRQQVRDSEVTX0RJUiBkb2Vzbid0IGV4aXN0IgorICAgICAgICByZXR1cm4gMAorICAgIGZpCisKKyAgICBsb2NhbCBQQVRDSEVTPWAoY2QgJFBBVENIRVNfRElSICYmIGZpbmQgLiAtbmFtZSAiKi5wYXRjaCIgfCBzb3J0ICkgMj4gL2Rldi9udWxsYAorICAgIGlmIFsgLXogIiRQQVRDSEVTIiBdIDsgdGhlbgorICAgICAgICBsb2cgIk5vIHBhdGNoZXMgZmlsZXMgaW4gJFBBVENIRVNfRElSIgorICAgICAgICByZXR1cm4gMAorICAgIGZpCisKKyAgICBQQVRDSEVTPWBlY2hvICRQQVRDSEVTIHwgc2VkIC1lIHMlXlwuLyUlZ2AKKyAgICBmb3IgUEFUQ0ggaW4gJFBBVENIRVM7IGRvCisgICAgICAgIFBBVENIRElSPWBkaXJuYW1lICRQQVRDSGAKKyAgICAgICAgUEFUQ0hOQU1FPWBiYXNlbmFtZSAkUEFUQ0hgCisgICAgICAgIGxvZyAiQXBwbHlpbmcgJFBBVENITkFNRSBpbnRvICRUT09MQ0hBSU5fU1JDX0RJUi8kUEFUQ0hESVIiCisgICAgICAgIChjZCAkVE9PTENIQUlOX1NSQ19ESVIvJFBBVENIRElSICYmIHBhdGNoIC1wMSA8ICRQQVRDSEVTX0RJUi8kUEFUQ0gpCisgICAgICAgIGZhaWxfcGFuaWMgIlBhdGNoIGZhaWx1cmUhISBQbGVhc2UgY2hlY2sgeW91ciBwYXRjaGVzIGRpcmVjdG9yeSEiCisgICAgZG9uZQorCisgICAgbG9nICJEb25lIHBhdGNoaW5nLiIKK30KKwordGFza19kZWZpbmUgcHJlcGFyZV90b29sY2hhaW5fc291cmNlcyAiUHJlcGFyZSB0b29sY2hhaW4gc291cmNlcy4iCitpZiBbIC1uICIkR0lUX0JBU0UiIC1vIC1uICIkR0lUX1JFRkVSRU5DRSIgXTsgdGhlbgorICAgIHRhc2tfZGVwZW5kcyBwcmVwYXJlX3Rvb2xjaGFpbl9zb3VyY2VzIHBhdGNoX3Rvb2xjaGFpbl9zb3VyY2VzCitmaQorY21kX3ByZXBhcmVfdG9vbGNoYWluX3NvdXJjZXMgKCkKK3sKKyAgICByZXR1cm4KK30KKwordGFzazJfZGVmaW5lIGNvbmZpZ3VyZV9iaW51dGlscyAiQ29uZmlndXJlIGJpbnV0aWxzLSRCSU5VVElMU19WRVJTSU9OIgordGFzazJfZGVwZW5kczEgY29uZmlndXJlX2JpbnV0aWxzIHByZXBhcmVfdG9vbGNoYWluX3NvdXJjZXMKK3Rhc2syX2RlcGVuZHMyIGNvbmZpZ3VyZV9iaW51dGlscyBjb3B5X3N5c3Jvb3QKK2NtZF9jb25maWd1cmVfYmludXRpbHMgKCkKK3sKKyAgICBPVVRfRElSPSQoYnVpbGRfZGlyX2ZvciBiaW51dGlscykKKyAgICBta2RpciAtcCAkT1VUX0RJUiAmJiBjZCAkT1VUX0RJUiAmJgorICAgIHJ1biAkVE9PTENIQUlOX1NSQ19ESVIvYmludXRpbHMvYmludXRpbHMtJEJJTlVUSUxTX1ZFUlNJT04vY29uZmlndXJlIFwKKyAgICAgICAgLS1wcmVmaXg9JChpbnN0YWxsX2RpcikgXAorICAgICAgICAtLXdpdGgtc3lzcm9vdD0kKHN5c3Jvb3RfZGlyKSBcCisgICAgICAgIC0tdGFyZ2V0PSRHQ0NfVEFSR0VUIFwKKyAgICAgICAgLS1lbmFibGUtZ29sZD1kZWZhdWx0IFwKKyAgICAgICAgLS13aXRoLWhvc3QtbGlic3RkY3h4PSctc3RhdGljLWxpYmdjYyAtV2wsLUJzdGF0aWMsLWxzdGRjKyssLUJkeW5hbWljIC1sbScgXAorICAgICAgICAtLXdpdGgtZ29sZC1sZGZsYWdzPSctc3RhdGljLWxpYmdjYyAtc3RhdGljLWxpYnN0ZGMrKycgXAorICAgICAgICAtLXdpdGgtYnVndXJsPWh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vc291cmNlL3JlcG9ydC1idWdzLmh0bWwKK30KKwordGFzazJfZGVmaW5lIGJ1aWxkX2JpbnV0aWxzICJCdWlsZCBiaW51dGlscy0kQklOVVRJTFNfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMyIGJ1aWxkX2JpbnV0aWxzIGNvbmZpZ3VyZV9iaW51dGlscworY21kX2J1aWxkX2JpbnV0aWxzICgpCit7CisgICAgY2QgJChidWlsZF9kaXJfZm9yIGJpbnV0aWxzKSAmJgorICAgIG1ha2UgJE1BS0VfRkxBR1MKK30KKwordGFzazJfZGVmaW5lIGluc3RhbGxfYmludXRpbHMgIkluc3RhbGwgYmludXRpbHMtJEJJTlVUSUxTX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMiBpbnN0YWxsX2JpbnV0aWxzIGJ1aWxkX2JpbnV0aWxzCitjbWRfaW5zdGFsbF9iaW51dGlscyAoKQoreworICAgIGNkICQoYnVpbGRfZGlyX2ZvciBiaW51dGlscykgJiYKKyAgICBtYWtlIGluc3RhbGwKK30KKwordGFzazJfZGVmaW5lIGV4dHJhY3RfZ21wICJFeHRyYWN0IHNvdXJjZXMgZm9yIGdtcC0kR01QX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMSBleHRyYWN0X2dtcCBwcmVwYXJlX3Rvb2xjaGFpbl9zb3VyY2VzCitjbWRfZXh0cmFjdF9nbXAgKCkKK3sKKyAgICBPVVRfRElSPSQoYnVpbGRfZGlyX2ZvciBnbXApCisgICAgR01QX1RBUkJBTEw9JFRPT0xDSEFJTl9TUkNfRElSL2dtcC9nbXAtJEdNUF9WRVJTSU9OLnRhci5iejIKKyAgICBpZiBbICEgLWYgIiRHTVBfVEFSQkFMTCIgXTsgdGhlbgorICAgICAgICBHTVBfVEFSQkFMTD0kVE9PTENIQUlOX1NSQ19ESVIvdGFyYmFsbHMvZ21wLSRHTVBfVkVSU0lPTi50YXIuYnoyCisgICAgICAgIGlmIFsgISAtZiAiJEdNUF9UQVJCQUxMIiBdOyB0aGVuCisgICAgICAgICAgICBwYW5pYyAiQ2FuJ3QgZmluZCBnbXAtJEdNUF9WRVJTSU9OIHNvdXJjZXMhISIKKyAgICAgICAgZmkKKyAgICBmaQorICAgIG1rZGlyIC1wICRPVVRfRElSICYmIGNkICRPVVRfRElSICYmCisgICAgdGFyIHhqZiAiJEdNUF9UQVJCQUxMIgorfQorCit0YXNrMl9kZWZpbmUgY29uZmlndXJlX2dtcCAiQ29uZmlndXJlIGdtcC0kR01QX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMiBjb25maWd1cmVfZ21wIGV4dHJhY3RfZ21wIGluc3RhbGxfYmludXRpbHMKK2NtZF9jb25maWd1cmVfZ21wICgpCit7CisgICAgZXhwb3J0IEFCST0kR01QX0FCSSAmJgorICAgIGNkICQoYnVpbGRfZGlyX2ZvciBnbXApICYmIG1rZGlyIC1wIGJ1aWxkICYmIGNkIGJ1aWxkICYmCisgICAgLi4vZ21wLSRHTVBfVkVSU0lPTi9jb25maWd1cmUgXAorICAgICAgICAtLXByZWZpeD0kKGluc3RhbGxfZGlyKSBcCisgICAgICAgIC0taG9zdD0kR01QX1RBUkdFVCBcCisgICAgICAgIC0td2l0aC1zeXNyb290PSQoaW5zdGFsbF9kaXIpIFwKKyAgICAgICAgLS1kaXNhYmxlLXNoYXJlZAorfQorCit0YXNrMl9kZWZpbmUgYnVpbGRfZ21wICJCdWlsZCBnbXAtJEdNUF9WRVJTSU9OIgordGFzazJfZGVwZW5kczIgYnVpbGRfZ21wIGNvbmZpZ3VyZV9nbXAKK2NtZF9idWlsZF9nbXAgKCkKK3sKKyAgICBleHBvcnQgQUJJPSRHTVBfQUJJICYmCisgICAgY2QgJChidWlsZF9kaXJfZm9yIGdtcCkvYnVpbGQgJiYKKyAgICBtYWtlICRNQUtFX0ZMQUdTCit9CisKK3Rhc2syX2RlZmluZSBpbnN0YWxsX2dtcCAiSW5zdGFsbCBnbXAtJEdNUF9WRVJTSU9OIgordGFzazJfZGVwZW5kczIgaW5zdGFsbF9nbXAgYnVpbGRfZ21wCitjbWRfaW5zdGFsbF9nbXAgKCkKK3sKKyAgICBjZCAkKGJ1aWxkX2Rpcl9mb3IgZ21wKS9idWlsZCAmJgorICAgIG1ha2UgaW5zdGFsbAorfQorCisjIFRoaXJkLCBidWlsZCBtcGZyCit0YXNrMl9kZWZpbmUgZXh0cmFjdF9tcGZyICJFeHRyYWN0IHNvdXJjZXMgZnJvbSBtcGZyLSRNUEZSX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMSBleHRyYWN0X21wZnIgcHJlcGFyZV90b29sY2hhaW5fc291cmNlcworY21kX2V4dHJhY3RfbXBmciAoKQoreworICAgIE9VVF9ESVI9JChidWlsZF9kaXJfZm9yIG1wZnIpCisgICAgTVBGUl9UQVJCQUxMPSRUT09MQ0hBSU5fU1JDX0RJUi9tcGZyL21wZnItJE1QRlJfVkVSU0lPTi50YXIuYnoyCisgICAgaWYgWyAhIC1mICIkTVBGUl9UQVJCQUxMIiBdOyB0aGVuCisgICAgICAgIE1QRlJfVEFSQkFMTD0kVE9PTENIQUlOX1NSQ19ESVIvdGFyYmFsbHMvbXBmci0kTVBGUl9WRVJTSU9OLnRhci5iejIKKyAgICAgICAgaWYgWyAhIC1mICIkTVBGUl9UQVJCQUxMIiBdOyB0aGVuCisgICAgICAgICAgICBwYW5pYyAiQ2FuJ3QgZmluZCBtcGZyLSRNUEZSX1ZFUlNJT04gc291cmNlcyEhIgorICAgICAgICBmaQorICAgIGZpCisgICAgbWtkaXIgLXAgJE9VVF9ESVIgJiYgY2QgJE9VVF9ESVIgJiYKKyAgICB0YXIgeGpmICIkTVBGUl9UQVJCQUxMIgorfQorCit0YXNrMl9kZWZpbmUgY29uZmlndXJlX21wZnIgIkNvbmZpZ3VyZSBtcGZyLSRNUEZSX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMiBjb25maWd1cmVfbXBmciBleHRyYWN0X21wZnIgaW5zdGFsbF9nbXAKK2NtZF9jb25maWd1cmVfbXBmciAoKQoreworICAgIGNkICQoYnVpbGRfZGlyX2ZvciBtcGZyKSAmJiBta2RpciAtcCBidWlsZCAmJiBjZCBidWlsZCAmJgorICAgIHJ1biAuLi9tcGZyLSRNUEZSX1ZFUlNJT04vY29uZmlndXJlIFwKKyAgICAgICAgLS1wcmVmaXg9JChpbnN0YWxsX2RpcikgXAorICAgICAgICAtLWhvc3Q9JEdNUF9UQVJHRVQgXAorICAgICAgICAtLXdpdGgtZ21wPSQoaW5zdGFsbF9kaXIpIFwKKyAgICAgICAgLS13aXRoLXN5c3Jvb3Q9JChzeXNyb290X2RpcikgXAorICAgICAgICAtLWRpc2FibGUtc2hhcmVkCit9CisKK3Rhc2syX2RlZmluZSBidWlsZF9tcGZyICJCdWlsZCBtcGZyLSRNUEZSX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMiBidWlsZF9tcGZyIGNvbmZpZ3VyZV9tcGZyCitjbWRfYnVpbGRfbXBmciAoKQoreworICAgIGNkICQoYnVpbGRfZGlyX2ZvciBtcGZyKS9idWlsZCAmJgorICAgIHJ1biBtYWtlICRNQUtFX0ZMQUdTCit9CisKK3Rhc2syX2RlZmluZSBpbnN0YWxsX21wZnIgIkluc3RhbGwgbXBmci0kTVBGUl9WRVJTSU9OIgordGFzazJfZGVwZW5kczIgaW5zdGFsbF9tcGZyIGJ1aWxkX21wZnIKK2NtZF9pbnN0YWxsX21wZnIgKCkKK3sKKyAgICBjZCAkKGJ1aWxkX2Rpcl9mb3IgbXBmcikvYnVpbGQgJiYKKyAgICBydW4gbWFrZSBpbnN0YWxsCit9CisKK3Rhc2syX2RlZmluZSBleHRyYWN0X21wYyAiRXh0cmFjdCBzb3VyY2VzIGZvciBtcGMtJE1QQ19WRVJTSU9OIgordGFzazJfZGVwZW5kczEgZXh0cmFjdF9tcGMgcHJlcGFyZV90b29sY2hhaW5fc291cmNlcworY21kX2V4dHJhY3RfbXBjICgpCit7CisgICAgT1VUX0RJUj0kKGJ1aWxkX2Rpcl9mb3IgbXBjKQorICAgIE1QQ19UQVJCQUxMPSRUT09MQ0hBSU5fU1JDX0RJUi9tcGMvbXBjLSRNUENfVkVSU0lPTi50YXIuZ3oKKyAgICBpZiBbICEgLWYgIiRNUENfVEFSQkFMTCIgXTsgdGhlbgorICAgICAgICBNUENfVEFSQkFMTD0kVE9PTENIQUlOX1NSQ19ESVIvdGFyYmFsbHMvbXBjLSRNUENfVkVSU0lPTi50YXIuZ3oKKyAgICAgICAgaWYgWyAhIC1mICIkTVBDX1RBUkJBTEwiIF07IHRoZW4KKyAgICAgICAgICAgIHBhbmljICJDYW4ndCBmaW5kIG1wYy0kTVBDX1ZFUlNJT04gc291cmNlcyEhIgorICAgICAgICBmaQorICAgIGZpCisgICAgbWtkaXIgLXAgJE9VVF9ESVIgJiYgY2QgJE9VVF9ESVIgJiYKKyAgICB0YXIgeHpmICIkTVBDX1RBUkJBTEwiCit9CisKK3Rhc2syX2RlZmluZSBjb25maWd1cmVfbXBjICJDb25maWd1cmUgbXBjLSRNUENfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMyIGNvbmZpZ3VyZV9tcGMgZXh0cmFjdF9tcGMgaW5zdGFsbF9tcGZyCitjbWRfY29uZmlndXJlX21wYyAoKQoreworICAgIGNkICQoYnVpbGRfZGlyX2ZvciBtcGMpICYmIG1rZGlyIC1wIGJ1aWxkICYmIGNkIGJ1aWxkICYmCisgICAgcnVuIC4uL21wYy0kTVBDX1ZFUlNJT04vY29uZmlndXJlIFwKKyAgICAgICAgLS1wcmVmaXg9JChpbnN0YWxsX2RpcikgXAorICAgICAgICAtLWhvc3Q9JEdNUF9UQVJHRVQgXAorICAgICAgICAtLXdpdGgtZ21wPSQoaW5zdGFsbF9kaXIpIFwKKyAgICAgICAgLS13aXRoLW1wZnI9JChpbnN0YWxsX2RpcikgXAorICAgICAgICAtLWRpc2FibGUtc2hhcmVkCit9CisKK3Rhc2syX2RlZmluZSBidWlsZF9tcGMgIkJ1aWxkIG1wYy0kTVBDX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMiBidWlsZF9tcGMgY29uZmlndXJlX21wYworY21kX2J1aWxkX21wYyAoKQoreworICAgIGNkICQoYnVpbGRfZGlyX2ZvciBtcGMpL2J1aWxkICYmCisgICAgcnVuIG1ha2UgJE1BS0VfRkxBR1MKK30KKwordGFzazJfZGVmaW5lIGluc3RhbGxfbXBjICJJbnN0YWxsIG1wYy0kTVBDX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMiBpbnN0YWxsX21wYyBidWlsZF9tcGMKK2NtZF9pbnN0YWxsX21wYyAoKQoreworICAgIGNkICQoYnVpbGRfZGlyX2ZvciBtcGMpL2J1aWxkICYmCisgICAgcnVuIG1ha2UgaW5zdGFsbAorfQorCit0YXNrMl9kZWZpbmUgZXh0cmFjdF9pc2wgIkV4dHJhY3Qgc291cmNlcyBmb3IgaXNsLSRJU0xfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMyIGV4dHJhY3RfaXNsIHByZXBhcmVfdG9vbGNoYWluX3NvdXJjZXMKK2NtZF9leHRyYWN0X2lzbCAoKQoreworICAgIE9VVF9ESVI9JChidWlsZF9kaXJfZm9yIGlzbCkKKyAgICBJU0xfVEFSQkFMTD0kVE9PTENIQUlOX1NSQ19ESVIvaXNsL2lzbC0kSVNMX1ZFUlNJT04udGFyLmJ6MgorICAgIGlmIFsgISAtZiAiJElTTF9UQVJCQUxMIiBdOyB0aGVuCisgICAgICAgIHBhbmljICJDYW4ndCBmaW5kIGlzbC0kSVNMX1ZFUlNJT04gc291cmNlcyEhIgorICAgIGZpCisgICAgbWtkaXIgLXAgJE9VVF9ESVIgJiYgY2QgJE9VVF9ESVIgJiYKKyAgICB0YXIgeGYgIiRJU0xfVEFSQkFMTCIKK30KKwordGFzazJfZGVmaW5lIGNvbmZpZ3VyZV9pc2wgIkNvbmZpZ3VyaW5nIGlzbC0kSVNMX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMiBjb25maWd1cmVfaXNsIGV4dHJhY3RfaXNsIGluc3RhbGxfZ21wCitjbWRfY29uZmlndXJlX2lzbCAoKQoreworICAgIGNkICQoYnVpbGRfZGlyX2ZvciBpc2wpICYmIG1rZGlyIC1wIGJ1aWxkICYmIGNkIGJ1aWxkICYmCisgICAgcnVuIC4uL2lzbC0kSVNMX1ZFUlNJT04vY29uZmlndXJlIFwKKyAgICAgICAgLS1wcmVmaXg9JChpbnN0YWxsX2RpcikgXAorICAgICAgICAtLWhvc3Q9JEdNUF9UQVJHRVQgXAorICAgICAgICAtLXdpdGgtZ21wLXByZWZpeD0kKGluc3RhbGxfZGlyKSBcCisgICAgICAgIC0td2l0aC1zeXNyb290PSQoc3lzcm9vdF9kaXIpIFwKKyAgICAgICAgLS1kaXNhYmxlLXNoYXJlZAorfQorCit0YXNrMl9kZWZpbmUgYnVpbGRfaXNsICJCdWlsZGluZyBpc2wtJElTTF9WRVJTSU9OIgordGFzazJfZGVwZW5kczIgYnVpbGRfaXNsIGNvbmZpZ3VyZV9pc2wKK2NtZF9idWlsZF9pc2wgKCkKK3sKKyAgICBjZCAkKGJ1aWxkX2Rpcl9mb3IgaXNsKS9idWlsZCAmJgorICAgIHJ1biBtYWtlICRNQUtFX0ZMQUdTCit9CisKK3Rhc2syX2RlZmluZSBpbnN0YWxsX2lzbCAiSW5zdGFsbGluZyBpc2wtJElTTF9WRVJTSU9OIgordGFzazJfZGVwZW5kczIgaW5zdGFsbF9pc2wgYnVpbGRfaXNsCitjbWRfaW5zdGFsbF9pc2wgKCkKK3sKKyAgICBjZCAkKGJ1aWxkX2Rpcl9mb3IgaXNsKS9idWlsZCAmJgorICAgIG1ha2UgaW5zdGFsbAorfQorCit0YXNrMl9kZWZpbmUgY29uZmlndXJlX2Nsb29nICJDb25maWd1cmUgQ2xvb2ctJENMT09HX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMiBjb25maWd1cmVfY2xvb2cgcHJlcGFyZV90b29sY2hhaW5fc291cmNlcyBpbnN0YWxsX2dtcCBpbnN0YWxsX2lzbAorY21kX2NvbmZpZ3VyZV9jbG9vZyAoKSB7CisgICAgbWtkaXIgLXAgJChidWlsZF9kaXJfZm9yIGNsb29nKS9idWlsZCAmJiBjZCAkKGJ1aWxkX2Rpcl9mb3IgY2xvb2cpL2J1aWxkICYmCisgICAgcnVuICRUT09MQ0hBSU5fU1JDX0RJUi9jbG9vZy9jbG9vZy0kQ0xPT0dfVkVSU0lPTi9jb25maWd1cmUgXAorICAgICAgICAtLXByZWZpeD0kKGluc3RhbGxfZGlyKSBcCisgICAgICAgIC0taG9zdD0kR01QX1RBUkdFVCBcCisgICAgICAgIC0td2l0aC1nbXAtcHJlZml4PSQoaW5zdGFsbF9kaXIpIFwKKyAgICAgICAgLS13aXRoLXN5c3Jvb3Q9JChzeXNyb290X2RpcikgXAorICAgICAgICAtLWRpc2FibGUtc2hhcmVkCit9CisKK3Rhc2syX2RlZmluZSBidWlsZF9jbG9vZyAiQnVpbGRpbmcgQ2xvb2ctJENMT09HX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMiBidWlsZF9jbG9vZyBjb25maWd1cmVfY2xvb2cKK2NtZF9idWlsZF9jbG9vZyAoKQoreworICAgIGNkICQoYnVpbGRfZGlyX2ZvciBjbG9vZykvYnVpbGQgJiYKKyAgICBydW4gbWFrZSAkTUFLRV9GTEFHUworfQorCit0YXNrMl9kZWZpbmUgaW5zdGFsbF9jbG9vZyAiSW5zdGFsbGluZyBDbG9vZy0kQ0xPT0dfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMyIGluc3RhbGxfY2xvb2cgYnVpbGRfY2xvb2cKK2NtZF9pbnN0YWxsX2Nsb29nICgpCit7CisgICAgY2QgJChidWlsZF9kaXJfZm9yIGNsb29nKS9idWlsZCAmJgorICAgIHJ1biBtYWtlIGluc3RhbGwKK30KKworIyBGb3VydGgsIHRoZSBjb21waWxlciBpdHNlbGYKK3Rhc2syX2RlZmluZSBjb25maWd1cmVfZ2NjICJDb25maWd1cmUgZ2NjLSRHQ0NfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMxIGNvbmZpZ3VyZV9nY2MgcHJlcGFyZV90b29sY2hhaW5fc291cmNlcwordGFzazJfZGVwZW5kczIgY29uZmlndXJlX2djYyBpbnN0YWxsX2JpbnV0aWxzIGluc3RhbGxfZ21wIGluc3RhbGxfbXBmciBpbnN0YWxsX21wYyBpbnN0YWxsX2Nsb29nCitjbWRfY29uZmlndXJlX2djYyAoKQoreworICAgIGxvY2FsIEVYVFJBX0NPTkZJR1VSRV9GTEFHUz0KKyAgICBpZiBbICIkR0NDX1ZFUlNJT04iICE9ICI0LjYiIF07IHRoZW4KKyAgICAgICAgRVhUUkFfQ09ORklHVVJFX0ZMQUdTPSItLXdpdGgtY2xvb2c9JChpbnN0YWxsX2RpcikiCisgICAgZmkKKyAgICBPVVRfRElSPSQoYnVpbGRfZGlyX2ZvciBnY2MpCisgICAgbWtkaXIgLXAgJE9VVF9ESVIgJiYgY2QgJE9VVF9ESVIgJiYKKyAgICBleHBvcnQgQ0M9JEhPU1RfQ0MgJiYKKyAgICBleHBvcnQgQ0NfRk9SX1RBUkdFVD0iJEhPU1RfQ0MiICYmCisgICAgcnVuICRUT09MQ0hBSU5fU1JDX0RJUi9nY2MvZ2NjLSRHQ0NfVkVSU0lPTi9jb25maWd1cmUgXAorICAgICAgICAtLWVuYWJsZS1tdWx0aWFyY2ggXAorICAgICAgICAtLXdpdGgtYXJjaC0zMj1pNjg2IFwKKyAgICAgICAgLS13aXRoLWFiaT1tNjQgXAorICAgICAgICAtLXByZWZpeD0kKGluc3RhbGxfZGlyKSBcCisgICAgICAgIC0td2l0aC1zeXNyb290PSQoc3lzcm9vdF9kaXIpIFwKKyAgICAgICAgLS1kaXNhYmxlLW5scyBcCisgICAgICAgIC0td2l0aC1nbXA9JChpbnN0YWxsX2RpcikgXAorICAgICAgICAtLXdpdGgtbXBmcj0kKGluc3RhbGxfZGlyKSBcCisgICAgICAgIC0td2l0aC1tcGM9JChpbnN0YWxsX2RpcikgXAorICAgICAgICAtLXRhcmdldD0kR0NDX1RBUkdFVCBcCisgICAgICAgIC0td2l0aC1hcmNoPXg4Ni02NCBcCisgICAgICAgIC0td2l0aC1tdWx0aWxpYi1saXN0PW0zMixtNjQgXAorICAgICAgICAtLWRpc2FibGUtcGx1Z2luIFwKKyAgICAgICAgLS1kaXNhYmxlLWRvY3MgXAorICAgICAgICAtLWRpc2FibGUtYm9vdHN0cmFwIFwKKyAgICAgICAgLS1kaXNhYmxlLWxpYmdvbXAgXAorICAgICAgICAtLWRpc2FibGUtbGlibXVkZmxhcCBcCisgICAgICAgIC0tZGlzYWJsZS1saWJxdWFkbWF0aCBcCisgICAgICAgIC0tZW5hYmxlLXRhcmdldC1vcHRzcGFjZSBcCisgICAgICAgIC0tZW5hYmxlLWdvbGQ9ZGVmYXVsdCBcCisgICAgICAgIC0tZW5hYmxlLWxhbmd1YWdlcz1jLGMrKyBcCisgICAgICAgICRFWFRSQV9DT05GSUdVUkVfRkxBR1MKK30KKwordGFzazJfZGVmaW5lIGJ1aWxkX2djYyAiQnVpbGQgZ2NjLSRHQ0NfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMyIGJ1aWxkX2djYyBjb25maWd1cmVfZ2NjCitjbWRfYnVpbGRfZ2NjICgpCit7CisgICAgY2QgJChidWlsZF9kaXJfZm9yIGdjYykgJiYKKyAgICBtYWtlICRNQUtFX0ZMQUdTCit9CisKK3Rhc2syX2RlZmluZSBpbnN0YWxsX2djYyAiSW5zdGFsbCBnY2MtJEdDQ19WRVJTSU9OIgordGFzazJfZGVwZW5kczIgaW5zdGFsbF9nY2MgYnVpbGRfZ2NjCitjbWRfaW5zdGFsbF9nY2MgKCkKK3sKKyAgICBjZCAkKGJ1aWxkX2Rpcl9mb3IgZ2NjKSAmJgorICAgIG1ha2UgaW5zdGFsbAorfQorCit0YXNrMl9kZWZpbmUgY2xlYW51cF90b29sY2hhaW4gIkNsZWFudXAgdG9vbGNoYWluIgordGFzazJfZGVwZW5kczIgY2xlYW51cF90b29sY2hhaW4gaW5zdGFsbF9nY2MKK2NtZF9jbGVhbnVwX3Rvb2xjaGFpbiAoKQoreworICAgICMgUmVtb3ZlIHVuLW5lZWRlZCBkaXJlY3RvcmllcyBhbmQgZmlsZXMKKyAgICBybSAtcmYgJChpbnN0YWxsX2Rpcikvc2hhcmUKKyAgICBybSAtcmYgJChpbnN0YWxsX2RpcikvbWFuCisgICAgcm0gLXJmICQoaW5zdGFsbF9kaXIpL2luZm8KKyAgICBybSAtcmYgJChpbnN0YWxsX2RpcikvbGliZXhlYy8qLyovaW5zdGFsbC10b29scworICAgICNybSAtcmYgJChpbnN0YWxsX2RpcikvJEdDQ19UQVJHRVQvYmluCisgICAgZmluZCAkKGluc3RhbGxfZGlyKSAtbmFtZSAiKi5sYSIgLWV4ZWMgcm0gLWYge30gXDsKKworICAgIChzdHJpcCAkKGluc3RhbGxfZGlyKS9iaW4vKikKKyAgICAoc3RyaXAgJChpbnN0YWxsX2RpcikvbGliZXhlYy9nY2MvJEdDQ19UQVJHRVQvKi8qKQorICAgIHRydWUKK30KKwordGFzazJfZGVmaW5lIHBhY2thZ2VfdG9vbGNoYWluICJQYWNrYWdlIGZpbmFsIHRvb2xjaGFpbiIKK3Rhc2syX2RlcGVuZHMyIHBhY2thZ2VfdG9vbGNoYWluIGNsZWFudXBfdG9vbGNoYWluCitjbWRfcGFja2FnZV90b29sY2hhaW4gKCkKK3sKKyAgICAjIENvcHkgdGhpcyBzY3JpcHQgdG8gdGhlIGluc3RhbGwgZGlyZWN0b3J5CisgICAgY3AgLWYgJDAgJChpbnN0YWxsX2RpcikKKyAgICBmYWlsX3BhbmljICJDb3VsZCBub3QgY29weSBidWlsZCBzY3JpcHQgdG8gaW5zdGFsbCBkaXJlY3RvcnkiCisKKyAgICBpZiBbIC1kICIkUEFUQ0hFU19ESVIiIF07IHRoZW4KKyAgICAgICAgIyBDb3B5IHBhdGNoZXMgdG8gdGhlIGluc3RhbGwgZGlyZWN0b3J5CisgICAgICAgIGNwIC1yZiAiJFBBVENIRVNfRElSIiAkKGluc3RhbGxfZGlyKQorICAgICAgICBmYWlsX3BhbmljICJDb3VsZCBub3QgY29weSBwYXRjaCBkaXJlY3RvcnkgdG8gaW5zdGFsbCBkaXJlY3RvcnkiCisgICAgZmkKKworICAgICMgQ29weSB0aGUgU09VUkNFUyBmaWxlIGFzIHdlbGwKKyAgICBjcCAkRE9XTkxPQURfRElSL1NPVVJDRVMgJChpbnN0YWxsX2RpcikvUEFDS0FHRV9TT1VSQ0VTICYmCisgICAgY3AgJFRPT0xDSEFJTl9TUkNfRElSL1NPVVJDRVMgJChpbnN0YWxsX2RpcikvVE9PTENIQUlOX1NPVVJDRVMKKyAgICBmYWlsX3BhbmljICJDb3VsZCBub3QgY29weSBTT1VSQ0VTIGZpbGVzIHRvIGluc3RhbGwgZGlyZWN0b3J5IgorCisgICAgIyBQYWNrYWdlIGV2ZXJ5dGhpbmcKKyAgICBwYWNrX2FyY2hpdmUgJFRPT0xDSEFJTl9BUkNISVZFICJgZGlybmFtZSAkKGluc3RhbGxfZGlyKWAiICJgYmFzZW5hbWUgJChpbnN0YWxsX2RpcilgIgorfQorCit0YXNrMl9kZWZpbmUgaW5zdGFsbF90b29sY2hhaW4gIkluc3RhbGwgZmluYWwgdG9vbGNoYWluIgordGFzazJfZGVwZW5kczIgaW5zdGFsbF90b29sY2hhaW4gY2xlYW51cF90b29sY2hhaW4KK2NtZF9pbnN0YWxsX3Rvb2xjaGFpbiAoKQoreworICAgIGNvcHlfZGlyZWN0b3J5ICIkKGluc3RhbGxfZGlyKSIgIiRQUkVGSVhfRElSLyRUT09MQ0hBSU5fTkFNRSIKKyAgICBjcCAtZiAkMCAiJFBSRUZJWF9ESVIvJFRPT0xDSEFJTl9OQU1FLyIKK30KKworIyBNYWtlIHN1cmUgdGhhdCB0aGUgc2Vjb25kIHRvb2xjaGFpbiBkZXBlbmRzIG9uIHRoZSBmaXJzdCBvbmUKK3Rhc2tfZGVwZW5kcyBjb25maWd1cmVfYmludXRpbHNfMiBpbnN0YWxsX2djY18xCisKK2lmIFsgIiRPTkxZX1NZU1JPT1QiID0gInllcyIgXTsgdGhlbgorICAgIE1BSU5fVEFTSz1jb3B5X3N5c3Jvb3QKKyAgICBDT01QTEVUSU9OX1RFWFQ9IkRvbmUsIHNlZSBzeXNyb290IGZpbGVzIGluICQoc3lzcm9vdF9kaXIpIgorZWxpZiBbIC1uICIkUFJFRklYX0RJUiIgXTsgdGhlbgorICAgIGlmIFsgLXogIiRCT09UU1RSQVAiIF07IHRoZW4KKyAgICAgICAgTUFJTl9UQVNLPWluc3RhbGxfdG9vbGNoYWluXzEKKyAgICBlbHNlCisgICAgICAgIE1BSU5fVEFTSz1pbnN0YWxsX3Rvb2xjaGFpbl8yCisgICAgZmkKKyAgICBDT01QTEVUSU9OX1RFWFQ9IkRvbmUsIHNlZSAkUFJFRklYX0RJUi8kVE9PTENIQUlOX05BTUUiCitlbHNlCisgICAgaWYgWyAteiAiJEJPT1RTVFJBUCIgXTsgdGhlbgorICAgICAgICBNQUlOX1RBU0s9cGFja2FnZV90b29sY2hhaW5fMQorICAgIGVsc2UKKyAgICAgICAgTUFJTl9UQVNLPXBhY2thZ2VfdG9vbGNoYWluXzIKKyAgICBmaQorICAgIENPTVBMRVRJT05fVEVYVD0iRG9uZSwgc2VlICRUT09MQ0hBSU5fQVJDSElWRSIKK2ZpCisKK2lmIFsgIiRMSVNUX1RBU0tTIiBdOyB0aGVuCisgICAgdGFza19kdW1wCitlbHNlCisgICAgcnVuX3Rhc2sgJE1BSU5fVEFTSworICAgIGVjaG8gIiRDT01QTEVUSU9OX1RFWFQiCitmaQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbG9vZy9ibG9jay5oIGIvaW5jbHVkZS9jbG9vZy9ibG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZjJhNDQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Nsb29nL2Jsb2NrLmgKQEAgLTAsMCArMSwxMTcgQEAKKworICAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgICAgKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTG9vRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyAgICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKgorICAgICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKyAgICAqKiAgICAgICAgICAgICAgICAgICAgRmlyc3QgdmVyc2lvbjogSnVuZSAxMXRoIDIwMDUgICAgICAgICAgICAgICAgICAqKgorICAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgQ0xvb0cgOiB0aGUgQ2h1bmt5IExvb3AgR2VuZXJhdG9yIChleHBlcmltZW50YWwpICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IENlZHJpYyBCYXN0b3VsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgICAgICAgICAgICAgICoKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgICAgICAgICAgICAgICAgICoKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciAgICAgICAgICAgICAgICoKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VICAgICAgICAgICoKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgICAgICAgICAgICoKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENMb29HLCB0aGUgQ2h1bmt5IExvb3AgR2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFdyaXR0ZW4gYnkgQ2VkcmljIEJhc3RvdWwsIENlZHJpYy5CYXN0b3VsQGlucmlhLmZyICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBDTE9PR19CTE9DS19ICisjZGVmaW5lIENMT09HX0JMT0NLX0gKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiAKKyAgeworI2VuZGlmIAorCisKKy8qKgorICogQ2xvb2dCbG9jayBzdHJ1Y3R1cmU6CisgKiB0aGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgaW5mb3JtYXRpb25zIG9mIGEgc3RhdGVtZW50IGJsb2NrLiBJdCBtYXkgaGFwcGVuCisgKiB0aGF0IHVzZXJzIGFyZSBsYXp5IGVub3VnaCB0byBhc2sgQ0xvb0cgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgZm9yIHN0YXRlbWVudHMKKyAqIHdpdGggZXhhY3RseSB0aGUgc2FtZSBkb21haW4vc2NhdHRlcmluZyBwYWlyIChwb3NzaWJseSBkaWZmZXJpbmcgYnkgb25seSBvbmUKKyAqIGNvbnN0YW50KSBpbnN0ZWFkIG9mIGdpdmluZyBvbmx5IG9uZSBwYWlyLiBDTG9vRyBwcm92aWRlcyB0aGVtIGEgbGFzdCBjaGFuY2UKKyAqIHRvIHNhdmUgdGltZSBhbmQgbWVtb3J5IGJ5IHRyeWluZyB0byBmaW5kIHRoZXNlIGJsb2NrcyBpdHNlbGYuIFRoZSBibG9jaworICogY29udGFpbnMgdGhlIHN0YXRlbWVudCBsaXN0IGFuZCB0aGUgY29tbW9uIGluZm9ybWF0aW9ucyBvZiB0aGUgc3RhdGVtZW50cy4KKyAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGFsc28gdGhlIG51bWJlciBvZiBleGlzdGluZyBhY3RpdmUgcmVmZXJlbmNlcyB0byBpdDoKKyAqIGJlY2F1c2UgQ0xvb0cgdXNlcyBtYW55IGNvcGllcyBvZiBibG9ja3MgdGhlcmUgaXMgbm8gbmVlZCB0byBhY3R1YWxseSBjb3B5CisgKiB0aGVzZSBibG9ja3MgYnV0IGp1c3QgdG8gcmV0dXJuIGEgcG9pbnRlciB0byB0aGVtIGFuZCB0byBpbmNyZW1lbnQgdGhlIG51bWJlcgorICogb2YgYWN0aXZlIHJlZmVyZW5jZXMuIEVhY2ggdGltZSBhIENsb29nQmxvY2sgd2lsbCBiZSBmcmVlZCwgd2Ugd2lsbCBkZWNyZW1lbnQKKyAqIHRoZSBhY3RpdmUgcmVmZXJlbmNlIGNvdW50ZXIgYW5kIGFjdHVhbGx5IGZyZWUgaXQgaWYgaXRzIHZhbHVlIGlzIHplcm8uCisgKi8KK3N0cnVjdCBjbG9vZ2Jsb2NrCit7CisgIENsb29nU3RhdGUgKnN0YXRlOyAgICAgICAgICAgIC8qKjwgU3RhdGUuICovCisgIENsb29nU3RhdGVtZW50ICogc3RhdGVtZW50IDsgIC8qKjwgVGhlIGxpc3Qgb2Ygc3RhdGVtZW50cyBpbiB0aGUgYmxvY2suICovCisgIGludCAgbmJfc2NhbGRpbXMgOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHNjYWxhciBkaW1lbnNpb25zLiAqLworICBjbG9vZ19pbnRfdCAqc2NhbGRpbXM7ICAgICAgICAvKio8IFNjYWxhciBkaW1lbnNpb24gdmFsdWVzLiAqLworICBpbnQgZGVwdGggOyAgICAgICAgICAgICAgICAgICAvKio8IE9yaWdpbmFsIGJsb2NrIGRlcHRoIChvdXRlciBsb29wIG51bWJlcikuKi8KKyAgaW50IHJlZmVyZW5jZXMgOyAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgcmVmZXJlbmNlcyB0byB0aGlzIHN0cnVjdHVyZS4gKi8KKyAgdm9pZCAqIHVzcjsJCSAgICAgICAgLyoqPCBVc2VyIGZpZWxkLCBmb3IgbGlicmFyeSB1c2VyIGNvbnZlbmllbmNlLgorCQkJCSAqICAgVGhpcyBwb2ludGVyIGlzIG5vdCBmcmVlZCB3aGVuIHRoZQorCQkJCSAqICAgQ2xvb2dCbG9jayBzdHJ1Y3R1cmUgaXMgZnJlZWQuCisJCQkgICAgICAgICAqLworfSA7Cit0eXBlZGVmIHN0cnVjdCBjbG9vZ2Jsb2NrIENsb29nQmxvY2sgOworCisKKy8qKgorICogQ2xvb2dCbG9ja0xpc3Qgc3RydWN0dXJlOgorICogdGhpcyBzdHJ1Y3R1cmUgcmVwcmVuc2VudHMgYSBub2RlIG9mIGEgbGlua2VkIGxpc3Qgb2YgQ2xvb2dCbG9jayBzdHJ1Y3R1cmVzLgorICovCitzdHJ1Y3QgY2xvb2dibG9ja2xpc3QKK3sgQ2xvb2dCbG9jayAqIGJsb2NrIDsgICAgICAgICAgLyoqPCBBbiBlbGVtZW50IG9mIHRoZSBsaXN0LiAqLworICBzdHJ1Y3QgY2xvb2dibG9ja2xpc3QgKiBuZXh0IDsvKio8IFBvaW50ZXIgdG8gdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgbGlzdC4qLworfSA7Cit0eXBlZGVmIHN0cnVjdCBjbG9vZ2Jsb2NrbGlzdCBDbG9vZ0Jsb2NrTGlzdCA7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZSBkaXNwbGF5IGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY2xvb2dfYmxvY2tfcHJpbnRfc3RydWN0dXJlKEZJTEUgKiwgQ2xvb2dCbG9jayAqLCBpbnQpIDsKK3ZvaWQgY2xvb2dfYmxvY2tfcHJpbnQoRklMRSAqLCBDbG9vZ0Jsb2NrICopIDsKK3ZvaWQgY2xvb2dfYmxvY2tfbGlzdF9wcmludChGSUxFICosIENsb29nQmxvY2tMaXN0ICopIDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1vcnkgZGVhbGxvY2F0aW9uIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjbG9vZ19ibG9ja19mcmVlKENsb29nQmxvY2sgKikgOwordm9pZCBjbG9vZ19ibG9ja19saXN0X2ZyZWUoQ2xvb2dCbG9ja0xpc3QgKikgOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NpbmcgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDbG9vZ0Jsb2NrICAgICAqIGNsb29nX2Jsb2NrX21hbGxvYyhDbG9vZ1N0YXRlICpzdGF0ZSk7CitDbG9vZ0Jsb2NrICAgICAqIGNsb29nX2Jsb2NrX2FsbG9jKENsb29nU3RhdGVtZW50ICpzdGF0ZW1lbnQsIGludCBuYl9zY2FsZGltcywKKwkJCQkgICAgY2xvb2dfaW50X3QgKnNjYWxkaW1zLCBpbnQgZGVwdGgpOworQ2xvb2dCbG9ja0xpc3QgKiBjbG9vZ19ibG9ja19saXN0X21hbGxvYyh2b2lkKTsKK0Nsb29nQmxvY2tMaXN0ICogY2xvb2dfYmxvY2tfbGlzdF9hbGxvYyhDbG9vZ0Jsb2NrICopIDsKK0Nsb29nQmxvY2sgICAgICogY2xvb2dfYmxvY2tfY29weShDbG9vZ0Jsb2NrICogYmxvY2spIDsKK3ZvaWQgICAgICAgICAgICAgY2xvb2dfYmxvY2tfbWVyZ2UoQ2xvb2dCbG9jayAqLCBDbG9vZ0Jsb2NrICopIDsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisgIH0KKyNlbmRpZiAKKyNlbmRpZiAvKiBkZWZpbmUgX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbG9vZy9jbGFzdC5oIGIvaW5jbHVkZS9jbG9vZy9jbGFzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNTZkZDcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Nsb29nL2NsYXN0LmgKQEAgLTAsMCArMSwxNzYgQEAKKyNpZm5kZWYgQ0xPT0dfQ0xBU1RfSAorI2RlZmluZSBDTE9PR19DTEFTVF9ICisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgCisgIHsKKyNlbmRpZiAKKworZW51bSBjbGFzdF9leHByX3R5cGUgeworICAgIGNsYXN0X2V4cHJfbmFtZSwKKyAgICBjbGFzdF9leHByX3Rlcm0sCisgICAgY2xhc3RfZXhwcl9iaW4sCisgICAgY2xhc3RfZXhwcl9yZWQKK307CitzdHJ1Y3QgY2xhc3RfZXhwciB7CisgICAgZW51bSBjbGFzdF9leHByX3R5cGUgdHlwZTsKK307CisKK3N0cnVjdCBjbGFzdF9uYW1lIHsKKyAgICBzdHJ1Y3QgY2xhc3RfZXhwcglleHByOworICAgIGNvbnN0IGNoYXIgKgluYW1lOworfTsKKworLyogUmVwcmVzZW50cyB0aGUgdGVybQorICoJdmFsICogdmFyCShpZiB2YXIgIT0gTlVMTCkKKyAqIG9yCisgKgl2YWwJCShpZiB2YXIgPT0gTlVMTCkKKyAqLworc3RydWN0IGNsYXN0X3Rlcm0geworICAgIHN0cnVjdCBjbGFzdF9leHByCWV4cHI7CisgICAgY2xvb2dfaW50X3QJCXZhbDsKKyAgICBzdHJ1Y3QgY2xhc3RfZXhwciAgKnZhcjsKK307CisKKyNkZWZpbmUgQ0xBU1RfUEFSQUxMRUxfTk9UIDAKKyNkZWZpbmUgQ0xBU1RfUEFSQUxMRUxfT01QIDEKKyNkZWZpbmUgQ0xBU1RfUEFSQUxMRUxfTVBJIDIKKyNkZWZpbmUgQ0xBU1RfUEFSQUxMRUxfVkVDIDQKKworZW51bSBjbGFzdF9yZWRfdHlwZSB7IGNsYXN0X3JlZF9zdW0sIGNsYXN0X3JlZF9taW4sIGNsYXN0X3JlZF9tYXggfTsKK3N0cnVjdCBjbGFzdF9yZWR1Y3Rpb24geworICAgIHN0cnVjdCBjbGFzdF9leHByCWV4cHI7CisgICAgZW51bSBjbGFzdF9yZWRfdHlwZQl0eXBlOworICAgIGludAkJCW47CisgICAgc3RydWN0IGNsYXN0X2V4cHIqCWVsdHNbMV07Cit9OworCitlbnVtIGNsYXN0X2Jpbl90eXBlIHsgY2xhc3RfYmluX2ZkaXYsIGNsYXN0X2Jpbl9jZGl2LCAKKwkJICAgICAgY2xhc3RfYmluX2RpdiwgY2xhc3RfYmluX21vZCB9Oworc3RydWN0IGNsYXN0X2JpbmFyeSB7CisgICAgc3RydWN0IGNsYXN0X2V4cHIJZXhwcjsKKyAgICBlbnVtIGNsYXN0X2Jpbl90eXBlIHR5cGU7CisgICAgc3RydWN0IGNsYXN0X2V4cHIqCUxIUzsKKyAgICBjbG9vZ19pbnRfdAkJUkhTOworfTsKKworc3RydWN0IGNsYXN0X3N0bXQ7CitzdHJ1Y3QgY2xhc3Rfc3RtdF9vcCB7CisgICAgdm9pZCAoKmZyZWUpKHN0cnVjdCBjbGFzdF9zdG10ICopOworfTsKKworI2RlZmluZSBDTEFTVF9TVE1UX0lTX0Eoc3RtdCwgdHlwZSkgKChzdG10KS0+b3AgPT0gJih0eXBlKSkKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBjbGFzdF9zdG10X29wIHN0bXRfcm9vdDsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgY2xhc3Rfc3RtdF9vcCBzdG10X2FzczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgY2xhc3Rfc3RtdF9vcCBzdG10X3VzZXI7CitleHRlcm4gY29uc3Qgc3RydWN0IGNsYXN0X3N0bXRfb3Agc3RtdF9ibG9jazsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgY2xhc3Rfc3RtdF9vcCBzdG10X2ZvcjsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgY2xhc3Rfc3RtdF9vcCBzdG10X2d1YXJkOworCitzdHJ1Y3QgY2xhc3Rfc3RtdCB7CisgICAgY29uc3Qgc3RydWN0IGNsYXN0X3N0bXRfb3AgICAgKm9wOworICAgIHN0cnVjdCBjbGFzdF9zdG10CSpuZXh0OworfTsKKworc3RydWN0IGNsYXN0X3Jvb3QgeworICAgIHN0cnVjdCBjbGFzdF9zdG10CXN0bXQ7CisgICAgQ2xvb2dOYW1lcyAqCW5hbWVzOyAgICAgICAvKio8IE5hbWVzIG9mIGl0ZXJhdG9ycyBhbmQgcGFyYW1ldGVycy4gKi8KK307CisKK3N0cnVjdCBjbGFzdF9hc3NpZ25tZW50IHsKKyAgICBzdHJ1Y3QgY2xhc3Rfc3RtdAlzdG10OworICAgIGNvbnN0IGNoYXIgKglMSFM7CisgICAgc3RydWN0IGNsYXN0X2V4cHIgKglSSFM7Cit9OworCitzdHJ1Y3QgY2xhc3RfYmxvY2sgeworICAgIHN0cnVjdCBjbGFzdF9zdG10CXN0bXQ7CisgICAgc3RydWN0IGNsYXN0X3N0bXQgKglib2R5OworfTsKKworc3RydWN0IGNsYXN0X3VzZXJfc3RtdCB7CisgICAgc3RydWN0IGNsYXN0X3N0bXQJc3RtdDsKKyAgICBDbG9vZ0RvbWFpbiAqCWRvbWFpbjsKKyAgICBDbG9vZ1N0YXRlbWVudCAqCXN0YXRlbWVudDsKKyAgICBzdHJ1Y3QgY2xhc3Rfc3RtdCAqCXN1YnN0aXR1dGlvbnM7Cit9OworCitzdHJ1Y3QgY2xhc3RfZm9yIHsKKyAgICBzdHJ1Y3QgY2xhc3Rfc3RtdAlzdG10OworICAgIENsb29nRG9tYWluICoJZG9tYWluOworICAgIGNvbnN0IGNoYXIgKglpdGVyYXRvcjsKKyAgICBzdHJ1Y3QgY2xhc3RfZXhwciAqCUxCOworICAgIHN0cnVjdCBjbGFzdF9leHByICoJVUI7CisgICAgY2xvb2dfaW50X3QJCXN0cmlkZTsKKyAgICBzdHJ1Y3QgY2xhc3Rfc3RtdCAqCWJvZHk7CisgICAgaW50IHBhcmFsbGVsOworICAgIC8qIENvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGxvb3AgcHJpdmF0ZSB2YXJpYWJsZXMgZm9yIE9wZW5NUCBwYXJhbGxlbGl6YXRpb24gKi8KKyAgICBjaGFyICpwcml2YXRlX3ZhcnM7CisgICAgLyogQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcmVkdWN0aW9uIHZhcmlhYmxlL29wZXJhdG9ycyBmb3IgT3Blbk1QIHBhcmFsbGVsaXphdGlvbiAqLworICAgIGNoYXIgKnJlZHVjdGlvbl92YXJzOworfTsKKworc3RydWN0IGNsYXN0X2VxdWF0aW9uIHsKKyAgICBzdHJ1Y3QgY2xhc3RfZXhwciAqCUxIUzsKKyAgICBzdHJ1Y3QgY2xhc3RfZXhwciAqCVJIUzsKKyAgICBpbnQJCQlzaWduOworfTsKKworc3RydWN0IGNsYXN0X2d1YXJkIHsKKyAgICBzdHJ1Y3QgY2xhc3Rfc3RtdAlzdG10OworICAgIHN0cnVjdCBjbGFzdF9zdG10ICoJdGhlbjsKKyAgICBpbnQJCQluOworICAgIHN0cnVjdCBjbGFzdF9lcXVhdGlvbgllcVsxXTsKK307CisKKworc3RydWN0IGNsYXN0X3N0bXQgKmNsb29nX2NsYXN0X2NyZWF0ZV9mcm9tX2lucHV0KENsb29nSW5wdXQgKmlucHV0LAorCQkJCQkJIENsb29nT3B0aW9ucyAqb3B0aW9ucyk7CitzdHJ1Y3QgY2xhc3Rfc3RtdCAqY2xvb2dfY2xhc3RfY3JlYXRlKENsb29nUHJvZ3JhbSAqcHJvZ3JhbSwKKwkJCQkgICAgICBDbG9vZ09wdGlvbnMgKm9wdGlvbnMpOwordm9pZCBjbG9vZ19jbGFzdF9mcmVlKHN0cnVjdCBjbGFzdF9zdG10ICpzKTsKKworc3RydWN0IGNsYXN0X25hbWUgKm5ld19jbGFzdF9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpOworc3RydWN0IGNsYXN0X3Rlcm0gKm5ld19jbGFzdF90ZXJtKGNsb29nX2ludF90IGMsIHN0cnVjdCBjbGFzdF9leHByICp2KTsKK3N0cnVjdCBjbGFzdF9iaW5hcnkgKm5ld19jbGFzdF9iaW5hcnkoZW51bSBjbGFzdF9iaW5fdHlwZSB0LCAKKwkJCQkgICAgICBzdHJ1Y3QgY2xhc3RfZXhwciAqbGhzLCBjbG9vZ19pbnRfdCByaHMpOworc3RydWN0IGNsYXN0X3JlZHVjdGlvbiAqbmV3X2NsYXN0X3JlZHVjdGlvbihlbnVtIGNsYXN0X3JlZF90eXBlIHQsIGludCBuKTsKK3N0cnVjdCBjbGFzdF9yb290ICpuZXdfY2xhc3Rfcm9vdChDbG9vZ05hbWVzICpuYW1lcyk7CitzdHJ1Y3QgY2xhc3RfYXNzaWdubWVudCAqbmV3X2NsYXN0X2Fzc2lnbm1lbnQoY29uc3QgY2hhciAqbGhzLAorCQkJCQkgICAgICBzdHJ1Y3QgY2xhc3RfZXhwciAqcmhzKTsKK3N0cnVjdCBjbGFzdF91c2VyX3N0bXQgKm5ld19jbGFzdF91c2VyX3N0bXQoQ2xvb2dEb21haW4gKmRvbWFpbiwKKyAgICBDbG9vZ1N0YXRlbWVudCAqc3RtdCwgc3RydWN0IGNsYXN0X3N0bXQgKnN1YnMpOworc3RydWN0IGNsYXN0X2Jsb2NrICpuZXdfY2xhc3RfYmxvY2sodm9pZCk7CitzdHJ1Y3QgY2xhc3RfZm9yICpuZXdfY2xhc3RfZm9yKENsb29nRG9tYWluICpkb21haW4sIGNvbnN0IGNoYXIgKml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY2xhc3RfZXhwciAqTEIsIHN0cnVjdCBjbGFzdF9leHByICpVQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xvb2dTdHJpZGUgKnN0cmlkZSk7CitzdHJ1Y3QgY2xhc3RfZ3VhcmQgKm5ld19jbGFzdF9ndWFyZChpbnQgbik7CisKK3ZvaWQgZnJlZV9jbGFzdF9uYW1lKHN0cnVjdCBjbGFzdF9uYW1lICp0KTsKK3ZvaWQgZnJlZV9jbGFzdF90ZXJtKHN0cnVjdCBjbGFzdF90ZXJtICp0KTsKK3ZvaWQgZnJlZV9jbGFzdF9iaW5hcnkoc3RydWN0IGNsYXN0X2JpbmFyeSAqYik7Cit2b2lkIGZyZWVfY2xhc3RfcmVkdWN0aW9uKHN0cnVjdCBjbGFzdF9yZWR1Y3Rpb24gKnIpOwordm9pZCBmcmVlX2NsYXN0X2V4cHIoc3RydWN0IGNsYXN0X2V4cHIgKmUpOwordm9pZCBmcmVlX2NsYXN0X3N0bXQoc3RydWN0IGNsYXN0X3N0bXQgKnMpOworCitpbnQgY2xhc3RfZXhwcl9lcXVhbChzdHJ1Y3QgY2xhc3RfZXhwciAqZTEsIHN0cnVjdCBjbGFzdF9leHByICplMik7CisKK3N0cnVjdCBjbGFzdF9leHByICpjbGFzdF9ib3VuZF9mcm9tX2NvbnN0cmFpbnQoQ2xvb2dDb25zdHJhaW50ICpjb25zdHJhaW50LAorCQkJCQkgICAgICAgaW50IGxldmVsLCBDbG9vZ05hbWVzICpuYW1lcyk7CisKK3R5cGVkZWYgZW51bSBmaWx0ZXJUeXBlIHtleGFjdCwgc3Vic2V0fSBDbGFzdEZpbHRlclR5cGU7CisKK3R5cGVkZWYgc3RydWN0IGNsYXN0RmlsdGVyeworICAgIGNvbnN0IGNoYXIgKml0ZXI7CisgICAgY29uc3QgaW50ICpzdG10c19maWx0ZXI7CisgICAgaW50IG5zdG10c19maWx0ZXI7CisgICAgQ2xhc3RGaWx0ZXJUeXBlIGZpbHRlcl90eXBlOworfSBDbGFzdEZpbHRlcjsKKwordm9pZCBjbGFzdF9maWx0ZXIoc3RydWN0IGNsYXN0X3N0bXQgKm5vZGUsIENsYXN0RmlsdGVyIGZpbHRlciwKKyAgICAgICAgc3RydWN0IGNsYXN0X2ZvciAqKipsb29wcywgaW50ICpubG9vcHMsIGludCAqKnN0bXRzLCBpbnQgKm5zdG10cyk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorICB9CisjZW5kaWYgCisjZW5kaWYgLyogZGVmaW5lIF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Nsb29nL2Nsb29nLmggYi9pbmNsdWRlL2Nsb29nL2Nsb29nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThjM2YyOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY2xvb2cvY2xvb2cuaApAQCAtMCwwICsxLDYyIEBACisKKyAgIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKgorICAgICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMb29HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKyAgICAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb29nLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgICAgKiogICAgICAgICAgICAgICAgICAgRmlyc3QgdmVyc2lvbjoganVseSAyNXRoIDIwMDIgICAgICAgICAgICAgICAgICAgKioKKyAgICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgIENMb29HIDogdGhlIENodW5reSBMb29wIEdlbmVyYXRvciAoZXhwZXJpbWVudGFsKSAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBDZWRyaWMgQmFzdG91bCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yICAgICAgICAgICAgICAqCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljICAgICAgICAgICAgICAgICAqCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgICAgICAgICAgICAgICAqCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSAgICAgICAgICAqCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljICAgICAgICAgICAqCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAqCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDTG9vRywgdGhlIENodW5reSBMb29wIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBXcml0dGVuIGJ5IENlZHJpYyBCYXN0b3VsLCBDZWRyaWMuQmFzdG91bEBpbnJpYS5mciAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgVEhJUyBGSUxFIEhBUyBCRUVOIEFVVE9NQVRJQ0FMTFkgR0VORVJBVEVEIEZST00gY2xvb2guaC5pbiBCWSBjb25maWd1cmUgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIENMT09HX0gKKyNkZWZpbmUgQ0xPT0dfSAorCisjaW5jbHVkZSA8Y2xvb2cvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGNsb29nL2ludC5oPgorI2luY2x1ZGUgPGNsb29nL21hdHJpeC5oPgorI2luY2x1ZGUgPGNsb29nL3N0YXRlLmg+CisjaW5jbHVkZSA8Y2xvb2cvb3B0aW9ucy5oPgorI2luY2x1ZGUgPGNsb29nL25hbWVzLmg+CisjaW5jbHVkZSA8Y2xvb2cvY29uc3RyYWludHMuaD4KKyNpbmNsdWRlIDxjbG9vZy9zdHJpZGUuaD4KKyNpbmNsdWRlIDxjbG9vZy9kb21haW4uaD4KKyNpbmNsdWRlIDxjbG9vZy9zdGF0ZW1lbnQuaD4KKyNpbmNsdWRlIDxjbG9vZy9ibG9jay5oPgorI2luY2x1ZGUgPGNsb29nL2xvb3AuaD4KKyNpbmNsdWRlIDxjbG9vZy91bmlvbl9kb21haW4uaD4KKyNpbmNsdWRlIDxjbG9vZy9pbnB1dC5oPgorI2luY2x1ZGUgPGNsb29nL3Byb2dyYW0uaD4KKyNpbmNsdWRlIDxjbG9vZy9jbGFzdC5oPgorI2luY2x1ZGUgPGNsb29nL3BwcmludC5oPgorCisjZW5kaWYgLyogIUNMT09HX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xvb2cvY29uc3RyYWludHMuaCBiL2luY2x1ZGUvY2xvb2cvY29uc3RyYWludHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODE4YzRjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jbG9vZy9jb25zdHJhaW50cy5oCkBAIC0wLDAgKzEsMTIxIEBACisKKyAgIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKgorICAgICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMb29HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKyAgICAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgICAgKiogICAgICAgICAgICAgICAgICAgIEZpcnN0IHZlcnNpb246IGFwcmlsIDE3dGggMjAwNSAgICAgICAgICAgICAgICAgKioKKyAgICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgIENMb29HIDogdGhlIENodW5reSBMb29wIEdlbmVyYXRvciAoZXhwZXJpbWVudGFsKSAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgQ2VkcmljIEJhc3RvdWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yICAgICAgICAgICAgICAqCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljICAgICAgICAgICAgICAgICAqCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgICAgICAgICAgICAgICAqCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSAgICAgICAgICAqCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljICAgICAgICAgICAqCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAqCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDTG9vRywgdGhlIENodW5reSBMb29wIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBXcml0dGVuIGJ5IENlZHJpYyBCYXN0b3VsLCBDZWRyaWMuQmFzdG91bEBpbnJpYS5mciAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgQ0xPT0dfQ09OU1RSQUlOVFNfSAorI2RlZmluZSBDTE9PR19DT05TVFJBSU5UU19ICisKK3N0cnVjdCBjbG9vZ2NvbnN0cmFpbnQ7Cit0eXBlZGVmIHN0cnVjdCBjbG9vZ2NvbnN0cmFpbnQgQ2xvb2dDb25zdHJhaW50Oworc3RydWN0IGNsb29nY29uc3RyYWludHNldDsKK3R5cGVkZWYgc3RydWN0IGNsb29nY29uc3RyYWludHNldCBDbG9vZ0NvbnN0cmFpbnRTZXQ7CitzdHJ1Y3QgY2xvb2dlcXVhbGl0aWVzOwordHlwZWRlZiBzdHJ1Y3QgY2xvb2dlcXVhbGl0aWVzIENsb29nRXF1YWxpdGllczsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIAorICB7CisjZW5kaWYgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgRXF1YWxpdGllcyBzcHJlYWRpbmcgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDbG9vZ0VxdWFsaXRpZXMgKmNsb29nX2VxdWFsX2FsbG9jKGludCBuLCBpbnQgbmJfbGV2ZWxzLAorCQkJaW50IG5iX3BhcmFtZXRlcnMpOwordm9pZAkJIGNsb29nX2VxdWFsX2ZyZWUoQ2xvb2dFcXVhbGl0aWVzICplcXVhbCk7CitpbnQgICAgICAgICAgICAgIGNsb29nX2VxdWFsX2NvdW50KENsb29nRXF1YWxpdGllcyAqZXF1YWwpOworaW50ICAgICAgICAgICAgICBjbG9vZ19lcXVhbF90eXBlKENsb29nRXF1YWxpdGllcyAqZXF1YWwsIGludCBsZXZlbCk7Cit2b2lkICAgICAgICAgICAgIGNsb29nX2VxdWFsX2RlbChDbG9vZ0VxdWFsaXRpZXMgKmVxdWFsLCBpbnQgbGV2ZWwpOworaW50ICAgICAgICAgICAgICBjbG9vZ19lcXVhbF90b3RhbF9kaW1lbnNpb24oQ2xvb2dFcXVhbGl0aWVzICplcXVhbCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NpbmcgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICAgICAgICAgIGNsb29nX2NvbnN0cmFpbnRfc2V0X25vcm1hbGl6ZShDbG9vZ0NvbnN0cmFpbnRTZXQgKiwgaW50KTsKK3ZvaWQgICAgICAgICAgY2xvb2dfY29uc3RyYWludF9zZXRfZnJlZShDbG9vZ0NvbnN0cmFpbnRTZXQgKik7CitpbnQgICAgICAgICAgIGNsb29nX2NvbnN0cmFpbnRfc2V0X2NvbnRhaW5zX2xldmVsKENsb29nQ29uc3RyYWludFNldCAqY29uc3RyYWludHMsCisJCQlpbnQgbGV2ZWwsIGludCBuYl9wYXJhbWV0ZXJzKTsKK2ludCAgICAgICAgICAgY2xvb2dfY29uc3RyYWludF9zZXRfdG90YWxfZGltZW5zaW9uKENsb29nQ29uc3RyYWludFNldCAqY29uc3RyYWludHMpOworaW50ICAgICAgICAgICBjbG9vZ19jb25zdHJhaW50X3NldF9uX2l0ZXJhdG9ycyhDbG9vZ0NvbnN0cmFpbnRTZXQgKmNvbnN0cmFpbnRzLAorCQkJaW50IG5iX3BhcmFtZXRlcnMpOworQ2xvb2dDb25zdHJhaW50U2V0ICpjbG9vZ19jb25zdHJhaW50X3NldF9jb3B5KENsb29nQ29uc3RyYWludFNldCAqKTsKK0Nsb29nQ29uc3RyYWludFNldCAqY2xvb2dfY29uc3RyYWludF9zZXRfc2ltcGxpZnkoQ2xvb2dDb25zdHJhaW50U2V0ICosIENsb29nRXF1YWxpdGllcyAqLCBpbnQsIGludCk7CisKK2ludCBjbG9vZ19jb25zdHJhaW50X25lZWRzX3JlZHVjdGlvbihDbG9vZ0NvbnN0cmFpbnQgKnVwcGVyLCBpbnQgbGV2ZWwpOworQ2xvb2dDb25zdHJhaW50U2V0ICpjbG9vZ19jb25zdHJhaW50X3NldF9mb3JfcmVkdWN0aW9uKENsb29nQ29uc3RyYWludCAqdXBwZXIsCisJICAgICAgIENsb29nQ29uc3RyYWludCAqbG93ZXIpOworQ2xvb2dDb25zdHJhaW50U2V0ICpjbG9vZ19jb25zdHJhaW50X3NldF9yZWR1Y2UoQ2xvb2dDb25zdHJhaW50U2V0ICpjb25zdHJhaW50cywKKwlpbnQgbGV2ZWwsIENsb29nRXF1YWxpdGllcyAqZXF1YWwsIGludCBuYl9wYXIsIGNsb29nX2ludF90ICpib3VuZCk7CitpbnQgY2xvb2dfY29uc3RyYWludF9zZXRfZm9yZWFjaF9jb25zdHJhaW50KENsb29nQ29uc3RyYWludFNldCAqY29uc3RyYWludHMsCisJaW50ICgqZm4pKENsb29nQ29uc3RyYWludCAqY29uc3RyYWludCwgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworaW50ICAgICAgICAgICAgICBjbG9vZ19jb25zdHJhaW50X2lzX3ZhbGlkKENsb29nQ29uc3RyYWludCAqY29uc3RyYWludCk7CitDbG9vZ0NvbnN0cmFpbnQgKmNsb29nX2NvbnN0cmFpbnRfY29weShDbG9vZ0NvbnN0cmFpbnQgKmNvbnN0cmFpbnQpOwordm9pZCAgICAgICAgICAgICBjbG9vZ19jb25zdHJhaW50X3JlbGVhc2UoQ2xvb2dDb25zdHJhaW50ICpjb25zdHJhaW50KTsKK0Nsb29nQ29uc3RyYWludCAqY2xvb2dfY29uc3RyYWludF9pbnZhbGlkKHZvaWQpOworaW50ICAgICAgICAgICAgICBjbG9vZ19jb25zdHJhaW50X3RvdGFsX2RpbWVuc2lvbihDbG9vZ0NvbnN0cmFpbnQgKmNvbnN0cmFpbnQpOworCitDbG9vZ0NvbnN0cmFpbnQgKmNsb29nX2VxdWFsX2NvbnN0cmFpbnQoQ2xvb2dFcXVhbGl0aWVzICplcXVhbCwgaW50IGopOwordm9pZCAgICAgICAgICAgICBjbG9vZ19lcXVhbF9hZGQoQ2xvb2dFcXVhbGl0aWVzICplcXVhbCwKKwkJCQkgIENsb29nQ29uc3RyYWludFNldCAqY29uc3RyYWludHMsCisJCQkJICBpbnQgbGV2ZWwsIENsb29nQ29uc3RyYWludCAqbGluZSwgaW50IG5iX3Bhcik7CisKK0Nsb29nQ29uc3RyYWludCAqY2xvb2dfY29uc3RyYWludF9zZXRfZGVmaW5pbmdfZXF1YWxpdHkoCisJCQlDbG9vZ0NvbnN0cmFpbnRTZXQgKmNvbnN0cmFpbnRzLCBpbnQgbGV2ZWwpOworQ2xvb2dDb25zdHJhaW50ICpjbG9vZ19jb25zdHJhaW50X3NldF9kZWZpbmluZ19pbmVxdWFsaXRpZXMoCisJCQlDbG9vZ0NvbnN0cmFpbnRTZXQgKmNvbnN0cmFpbnRzLAorCQkJaW50IGxldmVsLCBDbG9vZ0NvbnN0cmFpbnQgKipsb3dlciwgaW50IG5iX3BhcmFtZXRlcnMpOworaW50ICAgICAgICAgICBjbG9vZ19jb25zdHJhaW50X2ludm9sdmVzKENsb29nQ29uc3RyYWludCAqY29uc3RyYWludCwgaW50IHYpOworaW50ICAgICAgICAgICBjbG9vZ19jb25zdHJhaW50X2lzX2xvd2VyX2JvdW5kKENsb29nQ29uc3RyYWludCAqY29uc3RyYWludCwgaW50IHYpOworaW50ICAgICAgICAgICBjbG9vZ19jb25zdHJhaW50X2lzX3VwcGVyX2JvdW5kKENsb29nQ29uc3RyYWludCAqY29uc3RyYWludCwgaW50IHYpOworaW50ICAgICAgICAgICBjbG9vZ19jb25zdHJhaW50X2lzX2VxdWFsaXR5KENsb29nQ29uc3RyYWludCAqY29uc3RyYWludCk7Cit2b2lkICAgICAgICAgIGNsb29nX2NvbnN0cmFpbnRfY29uc3RhbnRfZ2V0KENsb29nQ29uc3RyYWludCAqY29uc3RyYWludCwKKwkJCWNsb29nX2ludF90ICp2YWwpOwordm9pZCAgICAgICAgICBjbG9vZ19jb25zdHJhaW50X2NvZWZmaWNpZW50X2dldChDbG9vZ0NvbnN0cmFpbnQgKmNvbnN0cmFpbnQsCisJCQlpbnQgdmFyLCBjbG9vZ19pbnRfdCAqdmFsKTsKK3ZvaWQgICAgICAgICAgY2xvb2dfY29uc3RyYWludF9jb2VmZmljaWVudF9zZXQoQ2xvb2dDb25zdHJhaW50ICpjb25zdHJhaW50LAorCQkJaW50IHZhciwgY2xvb2dfaW50X3QgdmFsKTsKK3ZvaWQgICAgICAgICAgY2xvb2dfY29uc3RyYWludF9jb3B5X2NvZWZmaWNpZW50cyhDbG9vZ0NvbnN0cmFpbnQgKmNvbnN0cmFpbnQsCisJCQljbG9vZ19pbnRfdCAqZHN0KTsKK0Nsb29nQ29uc3RyYWludFNldCAqY2xvb2dfY29uc3RyYWludF9zZXRfZHJvcF9jb25zdHJhaW50KAorCUNsb29nQ29uc3RyYWludFNldCAqY29uc3RyYWludHMsIENsb29nQ29uc3RyYWludCAqY29uc3RyYWludCk7CisKK3N0cnVjdCBjbGFzdF9leHByICpjbG9vZ19jb25zdHJhaW50X3ZhcmlhYmxlX2V4cHIoQ2xvb2dDb25zdHJhaW50ICpjb25zdHJhaW50LAorCQkJaW50IGxldmVsLCBDbG9vZ05hbWVzICpuYW1lcyk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorICB9CisjZW5kaWYgCisjZW5kaWYgLyogZGVmaW5lIF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Nsb29nL2RvbWFpbi5oIGIvaW5jbHVkZS9jbG9vZy9kb21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njc3NzFiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jbG9vZy9kb21haW4uaApAQCAtMCwwICsxLDE3NyBAQAorCisgICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKyAgICAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTG9vRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgICAgKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyAgICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKgorICAgICoqICAgICAgICAgICAgICAgICAgRmlyc3QgdmVyc2lvbjogb2N0b2JlciAyOHRoIDIwMDEgICAgICAgICAgICAgICAgICoqCisgICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICBDTG9vRyA6IHRoZSBDaHVua3kgTG9vcCBHZW5lcmF0b3IgKGV4cGVyaW1lbnRhbCkgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgQ2VkcmljIEJhc3RvdWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAgICAgICAgICAgICAgKgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyAgICAgICAgICAgICAgICAgKgorICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyICAgICAgICAgICAgICAgKgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgICAgICAgICAgKgorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyAgICAgICAgICAgKgorICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgKgorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ0xvb0csIHRoZSBDaHVua3kgTG9vcCBHZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogV3JpdHRlbiBieSBDZWRyaWMgQmFzdG91bCwgQ2VkcmljLkJhc3RvdWxAaW5yaWEuZnIgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIENMT09HX0RPTUFJTl9ICisjZGVmaW5lIENMT09HX0RPTUFJTl9ICisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgCisgIHsKKyNlbmRpZiAKKworCitzdHJ1Y3QgY2xvb2dkb21haW47Cit0eXBlZGVmIHN0cnVjdCBjbG9vZ2RvbWFpbiBDbG9vZ0RvbWFpbiA7CitzdHJ1Y3QgY2xvb2dzY2F0dGVyaW5nOwordHlwZWRlZiBzdHJ1Y3QgY2xvb2dzY2F0dGVyaW5nIENsb29nU2NhdHRlcmluZzsKK3N0cnVjdCBvc2xfcmVsYXRpb247CisKKworLyoqCisgKiBDbG9vZ0RvbWFpbkxpc3Qgc3RydWN0dXJlOgorICogdGhpcyBzdHJ1Y3R1cmUgcmVwcmVuc2VudHMgYSBub2RlIG9mIGEgbGlua2VkIGxpc3Qgb2YgQ2xvb2dEb21haW4gc3RydWN0dXJlcy4KKyAqLworc3RydWN0IGNsb29nZG9tYWlubGlzdCB7CisgIENsb29nRG9tYWluICpkb21haW47ICAgICAgICAgLyoqPCBBbiBlbGVtZW50IG9mIHRoZSBsaXN0LiAqLworICBzdHJ1Y3QgY2xvb2dkb21haW5saXN0ICpuZXh0Oy8qKjwgUG9pbnRlciB0byB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0LiovCit9IDsKK3R5cGVkZWYgc3RydWN0IGNsb29nZG9tYWlubGlzdCBDbG9vZ0RvbWFpbkxpc3Q7CisKKworLyoqCisgKiBDbG9vZ1NjYXR0ZXJpbmdMaXN0IHN0cnVjdHVyZToKKyAqIHRoaXMgc3RydWN0dXJlIHJlcHJlbnNlbnRzIGEgbm9kZSBvZiBhIGxpbmtlZCBsaXN0IG9mIENsb29nU2NhdHRlcmluZyBzdHJ1Y3R1cmVzLgorICovCitzdHJ1Y3QgY2xvb2dzY2F0dGVyaW5nbGlzdCB7CisgIENsb29nU2NhdHRlcmluZyAqc2NhdHQ7ICAgICAgICAgIC8qKjwgQW4gZWxlbWVudCBvZiB0aGUgbGlzdC4gKi8KKyAgc3RydWN0IGNsb29nc2NhdHRlcmluZ2xpc3QgKm5leHQ7LyoqPCBQb2ludGVyIHRvIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGxpc3QuKi8KK30gOwordHlwZWRlZiBzdHJ1Y3QgY2xvb2dzY2F0dGVyaW5nbGlzdCBDbG9vZ1NjYXR0ZXJpbmdMaXN0OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9seUxpYiBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICAgICAgICAgIGNsb29nX2RvbWFpbl9wcmludF9jb25zdHJhaW50cyhGSUxFICosIENsb29nRG9tYWluICosCisJCQkJCQlpbnQgcHJpbnRfbnVtYmVyKTsKK3ZvaWQgICAgICAgICAgY2xvb2dfc2NhdHRlcmluZ19wcmludF9jb25zdHJhaW50cyhGSUxFICosIENsb29nU2NhdHRlcmluZyAqKTsKK3ZvaWQgICAgICAgICAgY2xvb2dfZG9tYWluX2ZyZWUoQ2xvb2dEb21haW4gKikgOwordm9pZCAgICAgICAgICBjbG9vZ19zY2F0dGVyaW5nX2ZyZWUoQ2xvb2dTY2F0dGVyaW5nICopOworQ2xvb2dEb21haW4gKiBjbG9vZ19kb21haW5fY29weShDbG9vZ0RvbWFpbiAqKSA7CitDbG9vZ0RvbWFpbiAqIGNsb29nX2RvbWFpbl9jb252ZXgoQ2xvb2dEb21haW4gKiBQb2wpIDsKK0Nsb29nRG9tYWluICogY2xvb2dfZG9tYWluX3NpbXBsZV9jb252ZXgoQ2xvb2dEb21haW4gKiBkb21haW4pOworQ2xvb2dEb21haW4gKiBjbG9vZ19kb21haW5fc2ltcGxpZnkoQ2xvb2dEb21haW4gKiwgQ2xvb2dEb21haW4gKikgOworQ2xvb2dEb21haW4gKiBjbG9vZ19kb21haW5fdW5pb24oQ2xvb2dEb21haW4gKiwgQ2xvb2dEb21haW4gKikgOworQ2xvb2dEb21haW4gKiBjbG9vZ19kb21haW5faW50ZXJzZWN0aW9uKENsb29nRG9tYWluICosIENsb29nRG9tYWluICopIDsKK0Nsb29nRG9tYWluICogY2xvb2dfZG9tYWluX2RpZmZlcmVuY2UoQ2xvb2dEb21haW4gKiwgQ2xvb2dEb21haW4gKikgOwordm9pZCAgICAgICAgICBjbG9vZ19kb21haW5fc29ydChDbG9vZ0RvbWFpbioqLHVuc2lnbmVkLHVuc2lnbmVkLGludCAqKTsKK2ludCBjbG9vZ19kb21haW5fZm9sbG93cyhDbG9vZ0RvbWFpbiAqZG9tMSwgQ2xvb2dEb21haW4gKmRvbTIsIHVuc2lnbmVkIGxldmVsKTsKK0Nsb29nRG9tYWluICogY2xvb2dfZG9tYWluX2VtcHR5KENsb29nRG9tYWluICptb2RlbCk7CitpbnQgY2xvb2dfZG9tYWluX2lzX2JvdW5kZWQoQ2xvb2dEb21haW4gKmRpbSwgdW5zaWduZWQgbGV2ZWwpOworQ2xvb2dEb21haW4gKmNsb29nX2RvbWFpbl9ib3VuZF9zcGxpdHRlcihDbG9vZ0RvbWFpbiAqZG9tLCBpbnQgbGV2ZWwpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJ1Y3R1cmUgZGlzcGxheSBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNsb29nX2RvbWFpbl9wcmludF9zdHJ1Y3R1cmUoRklMRSAqZmlsZSwgQ2xvb2dEb21haW4gKmRvbWFpbiwgaW50IGxldmVsLAorCQkJCSAgY29uc3QgY2hhciAqbmFtZSk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5IGRlYWxsb2NhdGlvbiBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY2xvb2dfZG9tYWluX2xpc3RfZnJlZShDbG9vZ0RvbWFpbkxpc3QgKik7Cit2b2lkIGNsb29nX3NjYXR0ZXJpbmdfbGlzdF9mcmVlKENsb29nU2NhdHRlcmluZ0xpc3QgKik7CisKKworLyorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGluZyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0Nsb29nRG9tYWluICogY2xvb2dfZG9tYWluX3JlYWRfY29udGV4dChDbG9vZ1N0YXRlICpzdGF0ZSwgRklMRSAqIGZvbyk7CitDbG9vZ0RvbWFpbiAqIGNsb29nX2RvbWFpbl91bmlvbl9yZWFkKENsb29nU3RhdGUgKnN0YXRlLCBGSUxFICpmb28sIGludCBuYl9wYXIpOworQ2xvb2dTY2F0dGVyaW5nICpjbG9vZ19kb21haW5fcmVhZF9zY2F0dGVyaW5nKENsb29nRG9tYWluICpkb21haW4sIEZJTEUgKmZvbyk7CisKK0Nsb29nRG9tYWluICogY2xvb2dfZG9tYWluX2Zyb21fY2xvb2dfbWF0cml4KENsb29nU3RhdGUgKnN0YXRlLAorCQkJCUNsb29nTWF0cml4ICptYXRyaXgsIGludCBuYl9wYXIpOworQ2xvb2dTY2F0dGVyaW5nICogY2xvb2dfc2NhdHRlcmluZ19mcm9tX2Nsb29nX21hdHJpeChDbG9vZ1N0YXRlICpzdGF0ZSwKKwkJCQlDbG9vZ01hdHJpeCAqbWF0cml4LCBpbnQgbmJfc2NhdCwgaW50IG5iX3Bhcik7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc2luZyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0Nsb29nRG9tYWluICpjbG9vZ19kb21haW5fZnJvbV9vc2xfcmVsYXRpb24oQ2xvb2dTdGF0ZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3NsX3JlbGF0aW9uICopOworQ2xvb2dTY2F0dGVyaW5nICpjbG9vZ19zY2F0dGVyaW5nX2Zyb21fb3NsX3JlbGF0aW9uKENsb29nU3RhdGUgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3NsX3JlbGF0aW9uICopOworQ2xvb2dDb25zdHJhaW50U2V0ICpjbG9vZ19kb21haW5fY29uc3RyYWludHMoQ2xvb2dEb21haW4gKik7CitpbnQgICAgICAgICAgIGNsb29nX2RvbWFpbl9pc2VtcHR5KENsb29nRG9tYWluICopIDsKK0Nsb29nRG9tYWluICogY2xvb2dfZG9tYWluX3VuaXZlcnNlKENsb29nU3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBkaW0pOworQ2xvb2dEb21haW4gKiBjbG9vZ19kb21haW5fcHJvamVjdChDbG9vZ0RvbWFpbiAqLCBpbnQpOworQ2xvb2dEb21haW4gKiBjbG9vZ19kb21haW5fZXh0ZW5kKENsb29nRG9tYWluICosIGludCk7CitpbnQgICAgICAgICAgIGNsb29nX2RvbWFpbl9uZXZlcl9pbnRlZ3JhbChDbG9vZ0RvbWFpbiAqKSA7Cit2b2lkICAgICAgICAgIGNsb29nX2RvbWFpbl9zdHJpZGUoQ2xvb2dEb21haW4gKiwgaW50LCBjbG9vZ19pbnRfdCAqLCBjbG9vZ19pbnRfdCAqKTsKK2ludCAgICAgICAgICAgY2xvb2dfZG9tYWluX2Nhbl9zdHJpZGUoQ2xvb2dEb21haW4gKmRvbWFpbiwgaW50IGxldmVsKTsKK2ludCAgICAgICAgICAgY2xvb2dfZG9tYWluX2lzX290bChDbG9vZ0RvbWFpbiAqZG9tYWluLCBpbnQgbGV2ZWwpOworQ2xvb2dEb21haW4gKiBjbG9vZ19kb21haW5fc3RyaWRlX2xvd2VyX2JvdW5kKENsb29nRG9tYWluICpkb21haW4sIGludCBsZXZlbCwKKwkJCQkJQ2xvb2dTdHJpZGUgKnN0cmlkZSk7CitDbG9vZ0RvbWFpbiAqIGNsb29nX2RvbWFpbl9hZGRfc3RyaWRlX2NvbnN0cmFpbnQoQ2xvb2dEb21haW4gKmRvbWFpbiwKKwkJCQkJQ2xvb2dTdHJpZGUgKnN0cmlkZSk7CitpbnQgICAgICAgICAgIGNsb29nX2RvbWFpbl9jYW5fdW5yb2xsKENsb29nRG9tYWluICpkb21haW4sIGludCBsZXZlbCwKKwkJCQljbG9vZ19pbnRfdCAqbiwgQ2xvb2dDb25zdHJhaW50ICoqbGIpOworQ2xvb2dEb21haW4gKiBjbG9vZ19kb21haW5fZml4ZWRfb2Zmc2V0KENsb29nRG9tYWluICpkb21haW4sIGludCBsZXZlbCwKKwkJCQlDbG9vZ0NvbnN0cmFpbnQgKmxiLCBjbG9vZ19pbnRfdCBvZmZzZXQpOworaW50ICAgICAgICAgICBjbG9vZ19kb21haW5fbGF6eV9kaXNqb2ludChDbG9vZ0RvbWFpbiAqLCBDbG9vZ0RvbWFpbiAqKSA7CitpbnQgICAgICAgICAgIGNsb29nX2RvbWFpbl9sYXp5X2VxdWFsKENsb29nRG9tYWluICosIENsb29nRG9tYWluICopIDsKK2ludCAgICAgICAgICAgY2xvb2dfc2NhdHRlcmluZ19sYXp5X2Jsb2NrKENsb29nU2NhdHRlcmluZyAqLCBDbG9vZ1NjYXR0ZXJpbmcgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xvb2dTY2F0dGVyaW5nTGlzdCAqLCBpbnQpOworaW50ICAgICAgICAgICBjbG9vZ19zY2F0dGVyaW5nX2xhenlfaXNzY2FsYXIoQ2xvb2dTY2F0dGVyaW5nICosIGludCwKKwkJCQkJCQkJY2xvb2dfaW50X3QgKik7CitpbnQgICAgICAgICAgIGNsb29nX2RvbWFpbl9sYXp5X2lzY29uc3RhbnQoQ2xvb2dEb21haW4gKmRvbWFpbiwgaW50IGRpbWVuc2lvbiwKKwkJCQkJICAgY2xvb2dfaW50X3QgKnZhbHVlKTsKK2ludCAgICAgICAgICAgY2xvb2dfc2NhdHRlcmluZ19saXN0X2xhenlfc2FtZShDbG9vZ1NjYXR0ZXJpbmdMaXN0ICopOworQ2xvb2dEb21haW4gKiBjbG9vZ19kb21haW5fY3V0X2ZpcnN0KENsb29nRG9tYWluICpkb21haW4sIENsb29nRG9tYWluICoqcmVzdCk7CitDbG9vZ0RvbWFpbiAqIGNsb29nX2RvbWFpbl9zaW1wbGlmeV91bmlvbihDbG9vZ0RvbWFpbiAqZG9tYWluKTsKK0Nsb29nU2NhdHRlcmluZyAqIGNsb29nX3NjYXR0ZXJpbmdfZXJhc2VfZGltZW5zaW9uKENsb29nU2NhdHRlcmluZyAqLCBpbnQpOworCitpbnQgICAgICAgICAgIGNsb29nX2RvbWFpbl9kaW1lbnNpb24oQ2xvb2dEb21haW4gKikgOworaW50ICAgICAgICAgICBjbG9vZ19kb21haW5fcGFyYW1ldGVyX2RpbWVuc2lvbihDbG9vZ0RvbWFpbiAqZG9tYWluKTsKK2ludCAgICAgICAgICAgY2xvb2dfc2NhdHRlcmluZ19kaW1lbnNpb24oQ2xvb2dTY2F0dGVyaW5nICosIENsb29nRG9tYWluICopOworaW50ICAgICAgICAgICBjbG9vZ19kb21haW5faXNjb252ZXgoQ2xvb2dEb21haW4gKikgOworQ2xvb2dEb21haW4gKiBjbG9vZ19kb21haW5fY3ViZShDbG9vZ1N0YXRlICpzdGF0ZSwKKwkJCQlpbnQgZGltLCBjbG9vZ19pbnRfdCBtaW4sIGNsb29nX2ludF90IG1heCk7CitDbG9vZ0RvbWFpbiAqIGNsb29nX2RvbWFpbl9mcm9tX2NvbnRleHQoQ2xvb2dEb21haW4gKmNvbnRleHQpOworQ2xvb2dEb21haW4gKiBjbG9vZ19kb21haW5fc2NhdHRlcihDbG9vZ0RvbWFpbiAqZG9tYWluLCBDbG9vZ1NjYXR0ZXJpbmcgKnNjYXR0KTsKK2ludCAgICAgICAgICAgY2xvb2dfc2NhdHRlcmluZ19mdWxseV9zcGVjaWZpZWQoQ2xvb2dTY2F0dGVyaW5nICpzY2F0dGVyaW5nLAorCQkJCQkJQ2xvb2dEb21haW4gKmRvbWFpbik7CisKK0Nsb29nU3RyaWRlICpjbG9vZ19kb21haW5fbGlzdF9zdHJpZGUoQ2xvb2dEb21haW5MaXN0ICpsaXN0LCBpbnQgbGV2ZWwpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyAgfQorI2VuZGlmIAorI2VuZGlmIC8qIGRlZmluZSBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbG9vZy9pbnB1dC5oIGIvaW5jbHVkZS9jbG9vZy9pbnB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZDNjNTMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Nsb29nL2lucHV0LmgKQEAgLTAsMCArMSwyNyBAQAorI2lmbmRlZiBDTE9PR19JTlBVVF9ICisjZGVmaW5lIENMT09HX0lOUFVUX0gKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZiAKKworc3RydWN0IG9zbF9zY29wOworCitzdHJ1Y3QgY2xvb2dpbnB1dCB7CisJQ2xvb2dEb21haW4gKmNvbnRleHQ7CisJQ2xvb2dVbmlvbkRvbWFpbiAqdWQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgY2xvb2dpbnB1dCBDbG9vZ0lucHV0OworCitDbG9vZ0lucHV0ICpjbG9vZ19pbnB1dF9mcm9tX29zbF9zY29wKENsb29nU3RhdGUgKiwgc3RydWN0IG9zbF9zY29wICopOworQ2xvb2dJbnB1dCAqY2xvb2dfaW5wdXRfcmVhZChGSUxFICpmaWxlLCBDbG9vZ09wdGlvbnMgKm9wdGlvbnMpOworQ2xvb2dJbnB1dCAqY2xvb2dfaW5wdXRfYWxsb2MoQ2xvb2dEb21haW4gKmNvbnRleHQsIENsb29nVW5pb25Eb21haW4gKnVkKTsKK3ZvaWQgY2xvb2dfaW5wdXRfZnJlZShDbG9vZ0lucHV0ICppbnB1dCk7CisKK3ZvaWQgY2xvb2dfaW5wdXRfZHVtcF9jbG9vZyhGSUxFICpmaWxlLCBDbG9vZ0lucHV0ICppbnB1dCwgQ2xvb2dPcHRpb25zICpvcHQpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZiAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Nsb29nL2ludC5oIGIvaW5jbHVkZS9jbG9vZy9pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjNhMWNiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jbG9vZy9pbnQuaApAQCAtMCwwICsxLDE3NCBAQAorI2lmbmRlZiBDTE9PR19JTlRfSAorI2RlZmluZSBDTE9PR19JTlRfSAorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZiBkZWZpbmVkKENMT09HX0lOVF9HTVApCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z21wLmg+CisjaWZuZGVmIG1wX2dldF9tZW1vcnlfZnVuY3Rpb25zCit2b2lkIG1wX2dldF9tZW1vcnlfZnVuY3Rpb25zKAorCQl2b2lkICooKiphbGxvY19mdW5jX3B0cikgKHNpemVfdCksCisJCXZvaWQgKigqKnJlYWxsb2NfZnVuY19wdHIpICh2b2lkICosIHNpemVfdCwgc2l6ZV90KSwKKwkJdm9pZCAoKipmcmVlX2Z1bmNfcHRyKSAodm9pZCAqLCBzaXplX3QpKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiAKKyAgeworI2VuZGlmIAorCisjaWYgZGVmaW5lZChDTE9PR19JTlRfSU5UKQordHlwZWRlZiBpbnQJCWNsb29nX2ludF90OworI2RlZmluZSBDTE9PR19JTlRfRk9STUFUCSIlZCIKKyNlbGlmIGRlZmluZWQoQ0xPT0dfSU5UX0xPTkcpCit0eXBlZGVmIGxvbmcJCWNsb29nX2ludF90OworI2RlZmluZSBDTE9PR19JTlRfRk9STUFUCSIlbGQiCisjZWxpZiBkZWZpbmVkKENMT09HX0lOVF9MT05HX0xPTkcpCit0eXBlZGVmIGxvbmcgbG9uZwljbG9vZ19pbnRfdDsKKyNkZWZpbmUgQ0xPT0dfSU5UX0ZPUk1BVAkiJWxsZCIKKyNlbGlmIGRlZmluZWQoQ0xPT0dfSU5UX0dNUCkKK3R5cGVkZWYgbXB6X3QJCWNsb29nX2ludF90OworI2Vsc2UKKyNlcnJvciAiTm8gaW50ZWdlciB0eXBlIGRlZmluZWQiCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0xPT0dfSU5UX0dNUCkKKworI2RlZmluZSBjbG9vZ19pbnRfaW5pdChpKQltcHpfaW5pdChpKQorI2RlZmluZSBjbG9vZ19pbnRfY2xlYXIoaSkJbXB6X2NsZWFyKGkpOworCisjZGVmaW5lIGNsb29nX2ludF9zZXQocixpKQltcHpfc2V0KHIsaSkKKyNkZWZpbmUgY2xvb2dfaW50X3NldF9zaShyLGkpCW1wel9zZXRfc2kocixpKQorI2RlZmluZSBjbG9vZ19pbnRfYWJzKHIsaSkJbXB6X2FicyhyLGkpCisjZGVmaW5lIGNsb29nX2ludF9uZWcocixpKQltcHpfbmVnKHIsaSkKKyNkZWZpbmUgY2xvb2dfaW50X3N3YXAoaSxqKQltcHpfc3dhcChpLGopCisKKyNkZWZpbmUgY2xvb2dfaW50X2FkZChyLGksaikJbXB6X2FkZChyLGksaikKKyNkZWZpbmUgY2xvb2dfaW50X2FkZF91aShyLGksaikJbXB6X2FkZF91aShyLGksaikKKyNkZWZpbmUgY2xvb2dfaW50X3N1YihyLGksaikJbXB6X3N1YihyLGksaikKKyNkZWZpbmUgY2xvb2dfaW50X3N1Yl91aShyLGksaikJbXB6X3N1Yl91aShyLGksaikKKyNkZWZpbmUgY2xvb2dfaW50X211bChyLGksaikJbXB6X211bChyLGksaikKKyNkZWZpbmUgY2xvb2dfaW50X2FkZG11bChyLGksaikJbXB6X2FkZG11bChyLGksaikKKyNkZWZpbmUgY2xvb2dfaW50X2RpdmV4YWN0KHIsaSxqKQltcHpfZGl2ZXhhY3QocixpLGopCisjZGVmaW5lIGNsb29nX2ludF90ZGl2X3EocixpLGopCW1wel90ZGl2X3EocixpLGopCisjZGVmaW5lIGNsb29nX2ludF9mZGl2X3EocixpLGopCW1wel9mZGl2X3EocixpLGopCisjZGVmaW5lIGNsb29nX2ludF9mZGl2X3IocixpLGopCW1wel9mZGl2X3IocixpLGopCisjZGVmaW5lIGNsb29nX2ludF9jZGl2X3EocixpLGopCW1wel9jZGl2X3EocixpLGopCisjZGVmaW5lIGNsb29nX2ludF9nY2QocixpLGopCW1wel9nY2QocixpLGopCisKKyNkZWZpbmUgY2xvb2dfaW50X3NnbihpKQltcHpfc2duKGkpCisjZGVmaW5lIGNsb29nX2ludF9jbXAoaSxqKQltcHpfY21wKGksaikKKyNkZWZpbmUgY2xvb2dfaW50X2Fic19jbXAoaSxqKQltcHpfY21wYWJzKGksaikKKyNkZWZpbmUgY2xvb2dfaW50X2NtcF9zaShpLHNpKQltcHpfY21wX3NpKGksc2kpCisjZGVmaW5lIGNsb29nX2ludF9lcShpLGopCShtcHpfY21wKGksaikgPT0gMCkKKyNkZWZpbmUgY2xvb2dfaW50X25lKGksaikJKG1wel9jbXAoaSxqKSAhPSAwKQorI2RlZmluZSBjbG9vZ19pbnRfZ3QoaSxqKQkobXB6X2NtcChpLGopID4gMCkKKworI2RlZmluZSBjbG9vZ19pbnRfaXNfZGl2aXNpYmxlX2J5KGksaikJbXB6X2RpdmlzaWJsZV9wKGksaikKKworI2RlZmluZSBjbG9vZ19pbnRfcmVhZChyLHMpCW1wel9zZXRfc3RyKHIscywxMCkKK3R5cGVkZWYgdm9pZCAoKmNsb29nX2ludF9wcmludF9nbXBfZnJlZV90KSh2b2lkICosIHNpemVfdCk7CisjZGVmaW5lIGNsb29nX2ludF9wcmludChvdXQsaSkJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQljaGFyICpzOwkJCQkJCVwKKwkJY2xvb2dfaW50X3ByaW50X2dtcF9mcmVlX3QgZ21wX2ZyZWU7CQkJXAorCQlzID0gbXB6X2dldF9zdHIoMCwgMTAsIGkpOwkJCQlcCisJCWZwcmludGYob3V0LCAiJXMiLCBzKTsJCQkJCVwKKwkJbXBfZ2V0X21lbW9yeV9mdW5jdGlvbnMoTlVMTCwgTlVMTCwgJmdtcF9mcmVlKTsJCVwKKwkJKCpnbXBfZnJlZSkocywgc3RybGVuKHMpKzEpOwkJCQlcCisJfSB3aGlsZSAoMCkKKworI2Vsc2UKKworI2RlZmluZSBjbG9vZ19pbnRfaW5pdChpKQkoKGkpID0gMCkKKyNkZWZpbmUgY2xvb2dfaW50X2NsZWFyKGkpCWRvIHsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBjbG9vZ19pbnRfc2V0KHIsaSkJKChyKSA9IChpKSkKKyNkZWZpbmUgY2xvb2dfaW50X3NldF9zaShyLGkpCSgocikgPSAoaSkpCisjZGVmaW5lIGNsb29nX2ludF9hYnMocixpKQkoKHIpID0gKGkpID4gMCA/IChpKSA6IC0oaSkpCisjZGVmaW5lIGNsb29nX2ludF9uZWcocixpKQkoKHIpID0gLShpKSkKKyNkZWZpbmUgY2xvb2dfaW50X3N3YXAoaSxqKQlkbyB7CQkJCQlcCisJCQkJCWNsb29nX2ludF90IF90ID0gaTsJCVwKKwkJCQkJaSA9IGo7CQkJCVwKKwkJCQkJaiA9IF90OwkJCQlcCisJCQkJfSB3aGlsZSAoMCkKKworI2RlZmluZSBjbG9vZ19pbnRfYWRkKHIsaSxqKQkoKHIpID0gKGkpICsgKGopKQorI2RlZmluZSBjbG9vZ19pbnRfYWRkX3VpKHIsaSxqKQkoKHIpID0gKGkpICsgKGopKQorI2RlZmluZSBjbG9vZ19pbnRfc3ViKHIsaSxqKQkoKHIpID0gKGkpIC0gKGopKQorI2RlZmluZSBjbG9vZ19pbnRfc3ViX3VpKHIsaSxqKQkoKHIpID0gKGkpIC0gKGopKQorI2RlZmluZSBjbG9vZ19pbnRfbXVsKHIsaSxqKQkoKHIpID0gKGkpICogKGopKQorI2RlZmluZSBjbG9vZ19pbnRfYWRkbXVsKHIsaSxqKQkoKHIpICs9IChpKSAqIChqKSkKKyNkZWZpbmUgY2xvb2dfaW50X2RpdmV4YWN0KHIsaSxqKQkoKHIpID0gKGkpIC8gKGopKQorI2RlZmluZSBjbG9vZ19pbnRfdGRpdl9xKHIsaSxqKQkoKHIpID0gKGkpIC8gKGopKQorI2RlZmluZSBjbG9vZ19pbnRfZmRpdl9xKHIsaSxqKQlkbyB7CQkJCQlcCisJCQkJCWFzc2VydCgoaikgPiAwKTsJCVwKKwkJCQkJKHIpID0gKGkpID49IDAgPyAoaSkgLyAoaikgOglcCisJCQkJCSAgICAtKCgtKGkpKyhqKS0xKS8oaikpOwlcCisJCQkJfSB3aGlsZSAoMCkKKyNkZWZpbmUgY2xvb2dfaW50X2ZkaXZfcihyLGksaikJZG8gewkJCQkJXAorCQkJCQlhc3NlcnQoKGopID4gMCk7CQlcCisJCQkJCShyKSA9IChpKSA+PSAwID8gKGkpICUgKGopIDoJXAorCQkJCQkgICAgKGopLTEgLSAoKC0oaSkrKGopLTEpJShqKSk7CVwKKwkJCQl9IHdoaWxlICgwKQorI2RlZmluZSBjbG9vZ19pbnRfY2Rpdl9xKHIsaSxqKQlkbyB7CQkJCQlcCisJCQkJCWFzc2VydCgoaikgPiAwKTsJCVwKKwkJCQkJKHIpID0gKGkpID49IDAgPwkJXAorCQkJCQkgICAgKChpKSsoaiktMSkgLyAoaikgOgkJXAorCQkJCQkgICAgLSgtKGkpLyhqKSk7CQlcCisJCQkJfSB3aGlsZSAoMCkKK2Nsb29nX2ludF90IGNsb29nX2djZChjbG9vZ19pbnRfdCBhLCBjbG9vZ19pbnRfdCBiKTsKKyNkZWZpbmUgY2xvb2dfaW50X2djZChyLGksaikJKHIpID0gY2xvb2dfZ2NkKGksaikKKworI2RlZmluZSBjbG9vZ19pbnRfc2duKGkpCSgoaSkgPiAwID8gMSA6IChpKSA8IDAgPyAtMSA6IDApCisjZGVmaW5lIGNsb29nX2ludF9jbXAoaSxqKQkoaSAtIGopCisjZGVmaW5lIGNsb29nX2ludF9hYnNfY21wKGksaikJKCgoaSkgPiAwID8gKGkpIDogLShpKSkgLSAoKGopID4gMCA/IChqKSA6IC0oaikpKQorI2RlZmluZSBjbG9vZ19pbnRfY21wX3NpKGksc2kpCShpIC0gc2kpCisjZGVmaW5lIGNsb29nX2ludF9lcShpLGopCSgoaSkgPT0gKGopKQorI2RlZmluZSBjbG9vZ19pbnRfbmUoaSxqKQkoKGkpICE9IChqKSkKKyNkZWZpbmUgY2xvb2dfaW50X2d0KGksaikJKChpKSA+IChqKSkKKworI2RlZmluZSBjbG9vZ19pbnRfaXNfZGl2aXNpYmxlX2J5KGksaikJKChpKSAlIChqKSA9PSAwKQorCisjZGVmaW5lIGNsb29nX2ludF9yZWFkKGkscykJc3NjYW5mKHMsIENMT09HX0lOVF9GT1JNQVQsICZpKQorI2RlZmluZSBjbG9vZ19pbnRfcHJpbnQob3V0LGkpCWZwcmludGYob3V0LCBDTE9PR19JTlRfRk9STUFULCBpKQorCisjZW5kaWYKKworI2RlZmluZSBjbG9vZ19pbnRfaXNfcG9zKGkpCShjbG9vZ19pbnRfc2duKGkpID4gMCkKKyNkZWZpbmUgY2xvb2dfaW50X2lzX25lZyhpKQkoY2xvb2dfaW50X3NnbihpKSA8IDApCisjZGVmaW5lIGNsb29nX2ludF9pc196ZXJvKGkpCShjbG9vZ19pbnRfc2duKGkpID09IDApCisjZGVmaW5lIGNsb29nX2ludF9pc19vbmUoaSkJKGNsb29nX2ludF9jbXBfc2koaSwxKSA9PSAwKQorI2RlZmluZSBjbG9vZ19pbnRfaXNfbmVnX29uZShpKQkoY2xvb2dfaW50X2NtcF9zaShpLC0xKSA9PSAwKQorI2RlZmluZSBjbG9vZ19pbnRfZ3Rfc2koaSxzaSkJKGNsb29nX2ludF9jbXBfc2koaSxzaSkgPiAwKQorI2RlZmluZSBjbG9vZ19pbnRfbmVfc2koaSxqKQkoY2xvb2dfaW50X2NtcF9zaShpLGopICE9IDApCisjZGVmaW5lIGNsb29nX2ludF9sdChpLGopCShjbG9vZ19pbnRfY21wKGksaikgPCAwKQorI2RlZmluZSBjbG9vZ19pbnRfbGUoaSxqKQkoY2xvb2dfaW50X2NtcChpLGopIDw9IDApCisjZGVmaW5lIGNsb29nX2ludF9hYnNfbmUoaSxqKQkoY2xvb2dfaW50X2Fic19jbXAoaSxqKSAhPSAwKQorI2RlZmluZSBjbG9vZ19pbnRfYWJzX2dlKGksaikJKGNsb29nX2ludF9hYnNfY21wKGksaikgPj0gMCkKKyNkZWZpbmUgY2xvb2dfaW50X2Fic19sdChpLGopCShjbG9vZ19pbnRfYWJzX2NtcChpLGopIDwgMCkKKworc3RydWN0IGNsb29nX3ZlYyB7CisJdW5zaWduZWQJc2l6ZTsKKwljbG9vZ19pbnRfdAkqcDsKK307CisKK3N0cnVjdCBjbG9vZ192ZWMgKmNsb29nX3ZlY19hbGxvYyh1bnNpZ25lZCBzaXplKTsKK3ZvaWQgY2xvb2dfdmVjX2ZyZWUoc3RydWN0IGNsb29nX3ZlYyAqdmVjKTsKKworaW50IGNsb29nX3NlcV9maXJzdF9ub25femVybyhjbG9vZ19pbnRfdCAqcCwgdW5zaWduZWQgbGVuKTsKK3ZvaWQgY2xvb2dfc2VxX2NweShjbG9vZ19pbnRfdCAqZHN0LCBjbG9vZ19pbnRfdCAqc3JjLCB1bnNpZ25lZCBsZW4pOwordm9pZCBjbG9vZ19zZXFfbmVnKGNsb29nX2ludF90ICpkc3QsIGNsb29nX2ludF90ICpzcmMsIHVuc2lnbmVkIGxlbik7Cit2b2lkIGNsb29nX3NlcV9jb21iaW5lKGNsb29nX2ludF90ICpkc3QsIGNsb29nX2ludF90IG0xLCBjbG9vZ19pbnRfdCAqc3JjMSwKKwkJCWNsb29nX2ludF90IG0yLCBjbG9vZ19pbnRfdCAqc3JjMiwgdW5zaWduZWQgbGVuKTsKK3ZvaWQgY2xvb2dfc2VxX2djZChjbG9vZ19pbnRfdCAqcCwgdW5zaWduZWQgbGVuLCBjbG9vZ19pbnRfdCAqZ2NkKTsKK2ludCBjbG9vZ19zZXFfaXNfbmVnKGNsb29nX2ludF90ICpwMSwgY2xvb2dfaW50X3QgKnAyLCB1bnNpZ25lZCBsZW4pOwordm9pZCBjbG9vZ19zZXFfbm9ybWFsaXplKGNsb29nX2ludF90ICpwLCB1bnNpZ25lZCBsZW4pOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyAgfQorI2VuZGlmIAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xvb2cvaXNsL2JhY2tlbmQuaCBiL2luY2x1ZGUvY2xvb2cvaXNsL2JhY2tlbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDU3NmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jbG9vZy9pc2wvYmFja2VuZC5oCkBAIC0wLDAgKzEsMTEgQEAKKyNpZm5kZWYgQ0xPT0dfSVNMX0JBQ0tFTkRfSAorI2RlZmluZSBDTE9PR19JU0xfQkFDS0VORF9ICisKKyNpbmNsdWRlIDxpc2wvY29uc3RyYWludC5oPgorCitzdHJ1Y3QgY2xvb2diYWNrZW5kIHsKKwlzdHJ1Y3QgaXNsX2N0eAkqY3R4OworCXVuc2lnbmVkCWN0eF9hbGxvY2F0ZWQgOiAxOworfTsKKworI2VuZGlmIC8qIGRlZmluZSBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbG9vZy9pc2wvY2xvb2cuaCBiL2luY2x1ZGUvY2xvb2cvaXNsL2Nsb29nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM3OTA1NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY2xvb2cvaXNsL2Nsb29nLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBDTE9PR19JU0xfSAorI2RlZmluZSBDTE9PR19JU0xfSAorCisjaWZuZGVmIENMT09HX0lOVF9HTVAKKyNkZWZpbmUgQ0xPT0dfSU5UX0dNUAorI2VuZGlmCisKKyNpbmNsdWRlIDxjbG9vZy9jbG9vZy5oPgorI2luY2x1ZGUgPGNsb29nL2lzbC9jb25zdHJhaW50c2V0Lmg+CisjaW5jbHVkZSA8Y2xvb2cvaXNsL2RvbWFpbi5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmIAorCitDbG9vZ1N0YXRlICpjbG9vZ19pc2xfc3RhdGVfbWFsbG9jKHN0cnVjdCBpc2xfY3R4ICpjdHgpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZiAKKworI2VuZGlmIC8qIGRlZmluZSBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbG9vZy9pc2wvY29uc3RyYWludHNldC5oIGIvaW5jbHVkZS9jbG9vZy9pc2wvY29uc3RyYWludHNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzJlZWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Nsb29nL2lzbC9jb25zdHJhaW50c2V0LmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBDTE9PR19JU0xfQ09OU1RSQUlOVFNFVF9ICisjZGVmaW5lIENMT09HX0lTTF9DT05TVFJBSU5UU0VUX0gKKworI2luY2x1ZGUgPGNsb29nL2lzbC9iYWNrZW5kLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiAKKyAgeworI2VuZGlmIAorCitzdHJ1Y3QgY2xvb2djb25zdHJhaW50c2V0IHsKKwlpbnQgZHVtbXk7CS8qIFNvbGFyaXMgY2MgZG9lc24ndCBsaWtlIHplcm8tc2l6ZWQgc3RydWN0cyAqLworfTsKKworc3RydWN0IGNsb29nZXF1YWxpdGllcyB7CisJaW50CQkJICBuOworCXVuc2lnbmVkCQkgIHRvdGFsX2RpbTsKKwlpc2xfY29uc3RyYWludAkJKipjb25zdHJhaW50czsKKwlpbnQJCQkgKnR5cGVzOworfTsKKworc3RydWN0IGNsb29nY29uc3RyYWludCB7CisJaW50IGR1bW15OwkvKiBTb2xhcmlzIGNjIGRvZXNuJ3QgbGlrZSB6ZXJvLXNpemVkIHN0cnVjdHMgKi8KK307CisKK0Nsb29nQ29uc3RyYWludFNldCAqY2xvb2dfY29uc3RyYWludF9zZXRfZnJvbV9pc2xfYmFzaWNfc2V0KHN0cnVjdCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK0Nsb29nQ29uc3RyYWludCAqY2xvb2dfY29uc3RyYWludF9mcm9tX2lzbF9jb25zdHJhaW50KHN0cnVjdCBpc2xfY29uc3RyYWludCAqY29uc3RyYWludCk7Citpc2xfY29uc3RyYWludCAqY2xvb2dfY29uc3RyYWludF90b19pc2woQ2xvb2dDb25zdHJhaW50ICpjb25zdHJhaW50KTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisgIH0KKyNlbmRpZiAKKyNlbmRpZiAvKiBkZWZpbmUgX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xvb2cvaXNsL2RvbWFpbi5oIGIvaW5jbHVkZS9jbG9vZy9pc2wvZG9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzViNDdmMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY2xvb2cvaXNsL2RvbWFpbi5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgQ0xPT0dfSVNMX0RPTUFJTl9ICisjZGVmaW5lIENMT09HX0lTTF9ET01BSU5fSAorCisjaW5jbHVkZSA8aXNsL21hcC5oPgorI2luY2x1ZGUgPGlzbC9zZXQuaD4KKyNpbmNsdWRlIDxpc2wvdW5pb25fbWFwLmg+CisjaW5jbHVkZSA8aXNsL3VuaW9uX3NldC5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgCisgIHsKKyNlbmRpZiAKKworCitzdHJ1Y3QgY2xvb2dkb21haW4geworCWludCBkdW1teTsJLyogU29sYXJpcyBjYyBkb2Vzbid0IGxpa2UgemVyby1zaXplZCBzdHJ1Y3RzICovCit9OworCitzdHJ1Y3QgY2xvb2dzY2F0dGVyaW5nIHsKKwlpbnQgZHVtbXk7CS8qIFNvbGFyaXMgY2MgZG9lc24ndCBsaWtlIHplcm8tc2l6ZWQgc3RydWN0cyAqLworfTsKKworQ2xvb2dEb21haW4gKmNsb29nX2RvbWFpbl9mcm9tX2lzbF9zZXQoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworQ2xvb2dTY2F0dGVyaW5nICpjbG9vZ19zY2F0dGVyaW5nX2Zyb21faXNsX21hcChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitDbG9vZ1VuaW9uRG9tYWluICpjbG9vZ191bmlvbl9kb21haW5fZnJvbV9pc2xfdW5pb25fbWFwKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCk7CitDbG9vZ1VuaW9uRG9tYWluICpjbG9vZ191bmlvbl9kb21haW5fZnJvbV9pc2xfc2V0KAorCV9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKKworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2Zyb21fY2xvb2dfZG9tYWluKENsb29nRG9tYWluICpkb21haW4pOworCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorICB9CisjZW5kaWYgCisjZW5kaWYgLyogZGVmaW5lIF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Nsb29nL2xvb3AuaCBiL2luY2x1ZGUvY2xvb2cvbG9vcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MmEyNzQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Nsb29nL2xvb3AuaApAQCAtMCwwICsxLDEyMCBAQAorCisgICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKyAgICAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMb29HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgICAgKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyAgICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKgorICAgICoqICAgICAgICAgICAgICAgICBGaXJzdCB2ZXJzaW9uOiBvY3RvYmVyIDI2dGggMjAwMSAgICAgICAgICAgICAgICAgICoqCisgICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICBDTG9vRyA6IHRoZSBDaHVua3kgTG9vcCBHZW5lcmF0b3IgKGV4cGVyaW1lbnRhbCkgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgQ2VkcmljIEJhc3RvdWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAgICAgICAgICAgICAgKgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyAgICAgICAgICAgICAgICAgKgorICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyICAgICAgICAgICAgICAgKgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgICAgICAgICAgKgorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyAgICAgICAgICAgKgorICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgKgorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ0xvb0csIHRoZSBDaHVua3kgTG9vcCBHZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogV3JpdHRlbiBieSBDZWRyaWMgQmFzdG91bCwgQ2VkcmljLkJhc3RvdWxAaW5yaWEuZnIgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIENMT09HX0xPT1BfSAorI2RlZmluZSBDTE9PR19MT09QX0gKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiAKKyAgeworI2VuZGlmIAorCisvKioKKyAqIENsb29nTG9vcCBzdHJ1Y3R1cmU6CisgKiB0aGlzIHN0cnVjdHVyZSBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9ucyBvZiBhIGxvb3AgZ2VuZXJhdGVkIG9yIHRvIGJlCisgKiBnZW5lcmF0ZWQuCisgKiAtIGlmIHRoZSBsb29wIGhhcyBub3QgYmVlbiBwcm9jZXNzZWQgeWV0IChpdCBpcyBub3QgYSByZXN1bHQgb2YgYSBjYWxsIHRvCisgKiAgIGNsb29nX2xvb3BfZ2VuZXJhdGUpLCB0aGUgZG9tYWluIGlzIHRoZSB3aG9sZSBpdGVyYXRpb24gZG9tYWluIG9mIGEgZ2l2ZW4KKyAqICAgYmxvY2ssIHRoZSBzdHJpZGUgaXMgMSAoaS5lLiB0aGVyZSBpcyBubyBzdHJpZGUpLCBibG9jayBpcyBuZWNlc3NhcmlseSBub3QKKyAqICAgTlVMTCBhbmQgaW5uZXIgaXMgTlVMTC4KKyAqIC0gaWYgdGhlIGxvb3AgY29tZXMgYXMgYSByZXN1bHQgb2YgYSBjbG9vZ19sb29wX2dlbmVyYXRlIGNhbGwsIHRoZSBkb21haW4KKyAqICAgZGVzY3JpYmVzIHRoZSBjb25zdHJhaW50cyAoZ3VhcmRzIGFuZCBsb29wIGJvdW5kcykgZm9yIG9ubHkgb25lIGRpbWVuc2lvbgorICogICAodGhlIGxhc3Qgb25lOiBvdXRlciBkaW1lbnNpb25zIGJlaW5nIGNvbnNpZGVyZWQgYXMgcGFyYW1ldGVycyksIHRoZSBzdHJpZGUKKyAqICAgbWF5IGRpZmZlciBmcm9tIG9uZSAodGhpcyBtZWFucyB0aGF0IG9uIHRoZSBjb25zaWRlcmVkIGRpbWVuc2lvbiwgYSBzdGVwIG9mCisgKiAgICdzdHJpZGUnIG11c3QgYmUgY29uc2lkZXJlZCBiZXR3ZWVuIGludGVncmFsIHBvaW50LCB0aGUgZmlyc3QgaW50ZWdyYWwKKyAqICAgcG9pbnQgdG8gYmUgY29uc2lkZXJlZCBiZWluZyB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIGxvb3ApLCBpbm5lciBtYXkgZGlmZmVyCisgKiAgIGZyb20gTlVMTCwgbWVhbmluZyB0aGF0IHRoZXJlIGFyZSBmdXJ0aGVyIGRpbWVuc2lvbnMgYW5kIG5lc3RpbmcgbGV2ZWxzIGluCisgKiAgIHRoZSBsb29wLgorICovCitzdHJ1Y3QgY2xvb2dsb29wCit7CisgIENsb29nU3RhdGUgKnN0YXRlOyAgICAgICAgICAvKio8IFN0YXRlLiAqLworICBDbG9vZ0RvbWFpbiAqIGRvbWFpbiA7ICAgICAgLyoqPCBUaGUgaXRlcmF0aW9uIGRvbWFpbi4gKi8KKyAgQ2xvb2dEb21haW4gKnVuc2ltcGxpZmllZDsgIC8qKjwgVW5zaW1wbGlmaWVkIHZlcnNpb24gb2YgZG9tYWluLiAqLworICBpbnQgb3RsOyAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIGlzIGV4ZWN1dGVkIGF0IG1vc3Qgb25jZS4gKi8KKyAgQ2xvb2dTdHJpZGUgKnN0cmlkZTsgICAgICAgIC8qKjwgSWYgbm90IE5VTEwsIHN0cmlkZSBpbmZvcm1hdGlvbiBvbiBpdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAoZmlsbGVkIG9ubHkgYWZ0ZXIgbG9vcCBnZW5lcmF0aW9uKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBDbG9vZ0Jsb2NrICogYmxvY2sgOyAgICAgICAgLyoqPCBUaGUgaW5jbHVkZWQgc3RhdGVtZW50IGJsb2NrLCBOVUxMIGlmIG5vbmUuKi8KKyAgdm9pZCAqIHVzcjsJCSAgICAgIC8qKjwgVXNlciBmaWVsZCwgZm9yIGxpYnJhcnkgdXNlciBjb252ZW5pZW5jZS4KKwkJCSAgICAgICAqICAgVGhpcyBwb2ludGVyIGlzIG5vdCBmcmVlZCB3aGVuIHRoZQorCQkJICAgICAgICogICBDbG9vZ0xvb3Agc3RydWN0dXJlIGlzIGZyZWVkLgorCQkJICAgICAgICovCisgIHN0cnVjdCBjbG9vZ2xvb3AgKiBpbm5lciA7ICAvKio8IExvb3BzIGF0IHRoZSBuZXh0IGxldmVsLiAqLworICBzdHJ1Y3QgY2xvb2dsb29wICogbmV4dCA7ICAgLyoqPCBOZXh0IGxvb3AgYXQgdGhlIHNhbWUgbGV2ZWwuICovCit9IDsKK3R5cGVkZWYgc3RydWN0IGNsb29nbG9vcCBDbG9vZ0xvb3AgOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJ1Y3R1cmUgZGlzcGxheSBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNsb29nX2xvb3BfcHJpbnRfc3RydWN0dXJlKEZJTEUgKiwgQ2xvb2dMb29wICosIGludCkgOwordm9pZCBjbG9vZ19sb29wX3ByaW50KEZJTEUgKiwgQ2xvb2dMb29wICopIDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1vcnkgZGVhbGxvY2F0aW9uIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjbG9vZ19sb29wX2ZyZWUoQ2xvb2dMb29wICopIDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRpbmcgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ2xvb2dMb29wICpjbG9vZ19sb29wX2Zyb21fZG9tYWluKENsb29nU3RhdGUgKnN0YXRlLCBDbG9vZ0RvbWFpbiAqZG9tYWluLAorCQkJCSAgaW50IG51bWJlcik7CitDbG9vZ0xvb3AgKiBjbG9vZ19sb29wX3JlYWQoQ2xvb2dTdGF0ZSAqc3RhdGUsCisJCQkgICAgRklMRSAqIGZvbywgaW50IG51bWJlciwgaW50IG5iX3BhcmFtZXRlcnMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NpbmcgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDbG9vZ0xvb3AgKiBjbG9vZ19sb29wX2Jsb2NrKENsb29nTG9vcCAqbG9vcCwgaW50ICpzY2FsZGltcywgaW50IG5iX3NjYXR0ZGltcyk7CitDbG9vZ0xvb3AgKiBjbG9vZ19sb29wX21hbGxvYyhDbG9vZ1N0YXRlICpzdGF0ZSk7CitDbG9vZ0xvb3AgKmNsb29nX2xvb3BfZ2VuZXJhdGUoQ2xvb2dMb29wICpsb29wLCBDbG9vZ0RvbWFpbiAqY29udGV4dCwKKwlpbnQgbGV2ZWwsIGludCBzY2FsYXIsIGludCAqc2NhbGRpbXMsIGludCBuYl9zY2F0dGRpbXMsCisJQ2xvb2dPcHRpb25zICpvcHRpb25zKTsKK0Nsb29nTG9vcCAqY2xvb2dfbG9vcF9zaW1wbGlmeShDbG9vZ0xvb3AgKmxvb3AsIENsb29nRG9tYWluICpjb250ZXh0LCBpbnQgbGV2ZWwsCisJaW50IG5iX3NjYXR0ZGltcywgQ2xvb2dPcHRpb25zICpvcHRpb25zKTsKK3ZvaWQgY2xvb2dfbG9vcF9zY2F0dGVyKENsb29nTG9vcCAqLCBDbG9vZ1NjYXR0ZXJpbmcgKik7CisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisgIH0KKyNlbmRpZiAKKyNlbmRpZiAvKiBkZWZpbmUgX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xvb2cvbWF0cml4LmggYi9pbmNsdWRlL2Nsb29nL21hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNzMwMzkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Nsb29nL21hdHJpeC5oCkBAIC0wLDAgKzEsNTkgQEAKKyNpZm5kZWYgQ0xPT0dfTUFUUklYX0gKKyNkZWZpbmUgQ0xPT0dfTUFUUklYX0gKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIgorICB7CisjZW5kaWYKKworLyogVGhlIENsb29nTWF0cml4IHN0cnVjdHVyZSBpcyBlcXVpdmFsZW50IHRvIHRoZSBQb2x5TGliIE1hdHJpeCBkYXRhIHN0cnVjdHVyZQorICogKHNlZSBXaWw5MykuIFRoaXMgc3RydWN0dXJlIGlzIGRldm90ZWQgdG8gcmVwcmVzZW50IGEgc2V0IG9mIGNvbnN0cmFpbnRzLgorICoKKyAqIFRoZSB3aG9sZSBtYXRyaXggaXMgc3RvcmVkIGluIG1lbW9yeSByb3cgYWZ0ZXIgcm93IGF0IHRoZSBwX0luaXQgYWRkcmVzcy4gcAorICogaXMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgd2hlcmUgcFtpXSBwb2ludHMgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGlee3RoCisgKiByb3cuIE5iUm93cyBhbmQgTmJDb2x1bW5zIGFyZSByZXNwZWN0aXZlbHkgdGhlIG51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zIG9mCisgKiB0aGUgbWF0cml4LiBFYWNoIHJvdyBjb3JyZXNwb25kcyB0byBhIGNvbnN0cmFpbnQuIFRoZSBmaXJzdCBlbGVtZW50IG9mIGVhY2gKKyAqIHJvdyBpcyBhbiBlcXVhbGl0eS9pbmVxdWFsaXR5IHRhZy4gVGhlIGNvbnN0cmFpbnQgaXMgYW4gZXF1YWxpdHkgcCh4KSA9IDAgaWYKKyAqIHRoZSBmaXJzdCBlbGVtZW50IGlzIDAsIGJ1dCBpdCBpcyBhbiBpbmVxdWFsaXR5IHAoeCkgXGdlcSAwIGlmIHRoZSBmaXJzdAorICogZWxlbWVudCBpcyAxLiBUaGUgbmV4dCBlbGVtZW50cyBhcmUgdGhlIHVua25vd24gY29lZmZpY2llbnRzLCBmb2xsb3dlZCBieQorICogdGhlIHBhcmFtZXRlciBjb2VmZmljaWVudHMsIHRoZW4gdGhlIGNvbnN0YW50IHRlcm0uIEZvciBpbnN0YW5jZSwgdGhlCisgKiBmb2xsb3dpbmcgdGhyZWUgY29uc3RyYWludHM6CisgKgorICogICAgIC1pICsgbSAgPSAwCisgKiAgICAgLWogKyBuID49IDAKKyAqICBpICsgaiAtIGsgPj0gMAorICoKKyAqIHdvdWxkIGJlIHJlcHJlc2VudGVkIGJ5IHRoZSBmb2xsb3dpbmcgcm93czoKKyAqCisgKiAjIGVxL2luICBpICAgaiAgIGsgICBtICAgbiAgIGNzdAorICogICAgIDAgICAgMCAgLTEgICAwICAgMSAgIDAgICAgMAorICogICAgIDEgICAtMSAgIDAgICAwICAgMCAgIDEgICAgMAorICogICAgIDEgICAgMSAgIDEgIC0xICAgMCAgIDAgICAgMAorICoKKyAqIFRvIGJlIGFibGUgdG8gcHJvdmlkZSBkaWZmZXJlbnQgcHJlY2lzaW9uIHZlcnNpb24gKENMb29HIHN1cHBvcnRzIDMyIGJpdHMsCisgKiA2NCBiaXRzIGFuZCBhcmJpdHJhcnkgcHJlY2lzaW9uIHRocm91Z2ggdGhlIEdNUCBsaWJyYXJ5KSwgdGhlIGNsb29nX2ludF90CisgKiB0eXBlIGRlcGVuZHMgb24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAoaXQgbWF5IGJlIGxvbmcgaW50IGZvciAzMiBiaXRzCisgKiB2ZXJzaW9uLCBsb25nIGxvbmcgaW50IGZvciA2NCBiaXRzIHZlcnNpb24sIGFuZCBtcHpfdCBmb3IgbXVsdGlwbGUgcHJlY2lzaW9uCisgKiB2ZXJzaW9uKS4gKi8KKworc3RydWN0IGNsb29nbWF0cml4Cit7IHVuc2lnbmVkIE5iUm93czsgICAgLyogTnVtYmVyIG9mIHJvd3MuICovCisgIHVuc2lnbmVkIE5iQ29sdW1uczsgLyogTnVtYmVyIG9mIGNvbHVtbnMuICovCisgIGNsb29nX2ludF90ICoqIHA7ICAgICAgICAgLyogQXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlIG1hdHJpeCByb3dzLiAqLworICBjbG9vZ19pbnRfdCAqIHBfSW5pdDsgICAgIC8qIE1hdHJpeCByb3dzIGNvbnRpZ3VvdXNseSBpbiBtZW1vcnkuICovCit9OworCit0eXBlZGVmIHN0cnVjdCBjbG9vZ21hdHJpeCBDbG9vZ01hdHJpeDsKKworQ2xvb2dNYXRyaXggKmNsb29nX21hdHJpeF9hbGxvYyAodW5zaWduZWQsIHVuc2lnbmVkKTsKK3ZvaWQgY2xvb2dfbWF0cml4X2ZyZWUgKENsb29nTWF0cml4ICopOwordm9pZCBjbG9vZ19tYXRyaXhfcHJpbnRfc3RydWN0dXJlKEZJTEUgKmZpbGUsIENsb29nTWF0cml4ICpNLAorCQljb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKnN1ZmZpeCk7CitDbG9vZ01hdHJpeCAqY2xvb2dfbWF0cml4X3JlYWQoRklMRSAqaW5wdXQpOworQ2xvb2dNYXRyaXggKmNsb29nX21hdHJpeF9yZWFkX29mX3NpemUoRklMRSAqaW5wdXQsCisJCXVuc2lnbmVkIG5fcm93LCB1bnNpZ25lZCBuX2NvbCk7Cit2b2lkIGNsb29nX21hdHJpeF9wcmludChGSUxFKiwgQ2xvb2dNYXRyaXgqKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisgIH0KKyNlbmRpZgorI2VuZGlmIC8qIGRlZmluZSBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbG9vZy9tYXRyaXgvY29uc3RyYWludHNldC5oIGIvaW5jbHVkZS9jbG9vZy9tYXRyaXgvY29uc3RyYWludHNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMjMxNjIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Nsb29nL21hdHJpeC9jb25zdHJhaW50c2V0LmgKQEAgLTAsMCArMSwyOCBAQAorI2lmbmRlZiBDTE9PR19NQVRSSVhfQ09OU1RSQUlOVFNFVF9ICisjZGVmaW5lIENMT09HX01BVFJJWF9DT05TVFJBSU5UU0VUX0gKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIAorICB7CisjZW5kaWYgCisKK3N0cnVjdCBjbG9vZ2NvbnN0cmFpbnRzZXQgeworCUNsb29nTWF0cml4IE07Cit9OworCitzdHJ1Y3QgY2xvb2dlcXVhbGl0aWVzIHsKKwlDbG9vZ0NvbnN0cmFpbnRTZXQJKmNvbnN0cmFpbnRzOworCWludAkJCSp0eXBlczsKK307CisKK3N0cnVjdCBjbG9vZ2NvbnN0cmFpbnQgeworCUNsb29nQ29uc3RyYWludFNldAkqc2V0OworCWNsb29nX2ludF90CQkqKmxpbmU7Cit9OworCitDbG9vZ0NvbnN0cmFpbnRTZXQgKmNsb29nX2NvbnN0cmFpbnRfc2V0X2Zyb21fY2xvb2dfbWF0cml4KENsb29nTWF0cml4ICpNKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisgIH0KKyNlbmRpZiAKKyNlbmRpZiAvKiBkZWZpbmUgX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xvb2cvbmFtZXMuaCBiL2luY2x1ZGUvY2xvb2cvbmFtZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjU2NmYxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jbG9vZy9uYW1lcy5oCkBAIC0wLDAgKzEsMTAzIEBACisKKyAgIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKgorICAgICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xvb0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKyAgICAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgICAgKiogICAgICAgICAgICAgICAgICBGaXJzdCB2ZXJzaW9uOiBhdWd1c3QgMXN0IDIwMDIgICAgICAgICAgICAgICAgICAgKioKKyAgICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgIENMb29HIDogdGhlIENodW5reSBMb29wIEdlbmVyYXRvciAoZXhwZXJpbWVudGFsKSAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBDZWRyaWMgQmFzdG91bCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yICAgICAgICAgICAgICAqCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljICAgICAgICAgICAgICAgICAqCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgICAgICAgICAgICAgICAqCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSAgICAgICAgICAqCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljICAgICAgICAgICAqCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAqCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDTG9vRywgdGhlIENodW5reSBMb29wIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBXcml0dGVuIGJ5IENlZHJpYyBCYXN0b3VsLCBDZWRyaWMuQmFzdG91bEBpbnJpYS5mciAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgQ0xPT0dfTkFNRVNfSAorI2RlZmluZSBDTE9PR19OQU1FU19ICisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgCisgIHsKKyNlbmRpZiAKKworCisjIGRlZmluZSBNQVhfTkFNRSA1MAorIyBkZWZpbmUgRklSU1RfUEFSQU1FVEVSICdNJworIyBkZWZpbmUgRklSU1RfSVRFUkFUT1IgICdpJworCisKKy8qKgorICogQ2xvb2dOYW1lcyBzdHJ1Y3R1cmU6CisgKiB0aGlzIHN0cnVjdHVyZSBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9ucyBhYm91dCBwYXJhbWV0ZXIgYW5kIGl0ZXJhdG9yCisgKiBuYW1lcyAoYXMgc3RyaW5ncykuCisgKi8KK3N0cnVjdCBjbG9vZ25hbWVzCit7IGludCBuYl9zY2FsYXJzIDsgICAgICAgICAvKio8IFNjYWxhciBkaW1lbnNpb24gbnVtYmVyLiAqLworICBpbnQgbmJfc2NhdHRlcmluZyA7ICAgICAgLyoqPCBTY2F0dGVyaW5nIGl0ZXJhdG9yIG51bWJlci4gKi8KKyAgaW50IG5iX2l0ZXJhdG9ycyA7ICAgICAgIC8qKjwgSXRlcmF0b3IgbnVtYmVyLiAqLworICBpbnQgbmJfcGFyYW1ldGVycyA7ICAgICAgLyoqPCBQYXJhbWV0ZXIgbnVtYmVyLiAqLworICBjaGFyICoqIHNjYWxhcnMgOyAgICAgICAgLyoqPCBUaGUgc2NhbGFyIG5hbWVzICAgICAoYW4gYXJyYXkgb2Ygc3RyaW5ncykuICovCisgIGNoYXIgKiogc2NhdHRlcmluZyA7ICAgICAvKio8IFRoZSBzY2F0dGVyaW5nIG5hbWVzIChhbiBhcnJheSBvZiBzdHJpbmdzKS4gKi8KKyAgY2hhciAqKiBpdGVyYXRvcnMgOyAgICAgIC8qKjwgVGhlIGl0ZXJhdG9yIG5hbWVzICAgKGFuIGFycmF5IG9mIHN0cmluZ3MpLiAqLworICBjaGFyICoqIHBhcmFtZXRlcnMgOyAgICAgLyoqPCBUaGUgcGFyYW1ldGVyIG5hbWVzICAoYW4gYXJyYXkgb2Ygc3RyaW5ncykuICovCisgIGludCByZWZlcmVuY2VzOyAgICAgICAgICAvKio8IE51bWJlciBvZiByZWZlcmVuY2VzIHRvIHRoaXMgc3RydWN0dXJlLiAqLworfSA7Cit0eXBlZGVmIHN0cnVjdCBjbG9vZ25hbWVzIENsb29nTmFtZXMgOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJ1Y3R1cmUgZGlzcGxheSBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNsb29nX25hbWVzX3ByaW50X3N0cnVjdHVyZShGSUxFICosIENsb29nTmFtZXMgKiwgaW50KSA7Cit2b2lkIGNsb29nX25hbWVzX3ByaW50KEZJTEUgKiwgQ2xvb2dOYW1lcyAqKSA7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5IGRlYWxsb2NhdGlvbiBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY2xvb2dfbmFtZXNfZnJlZShDbG9vZ05hbWVzICopIDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRpbmcgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2hhciAqKiBjbG9vZ19uYW1lc19yZWFkX3N0cmluZ3MoRklMRSAqZmlsZSwgaW50IG5iX2l0ZW1zKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzaW5nIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ2xvb2dOYW1lcyAqIGNsb29nX25hbWVzX21hbGxvYyh2b2lkKTsKK0Nsb29nTmFtZXMgKiBjbG9vZ19uYW1lc19jb3B5KENsb29nTmFtZXMgKm5hbWVzKTsKK0Nsb29nTmFtZXMgKiBjbG9vZ19uYW1lc19hbGxvYyh2b2lkKTsKK2NoYXIgKiogY2xvb2dfbmFtZXNfZ2VuZXJhdGVfaXRlbXMoaW50LCBjaGFyICosIGNoYXIpIDsKK0Nsb29nTmFtZXMgKiBjbG9vZ19uYW1lc19nZW5lcmF0ZShpbnQsIGludCwgaW50LCBpbnQsIGNoYXIsIGNoYXIsIGNoYXIsIGNoYXIpIDsKK3ZvaWQgY2xvb2dfbmFtZXNfc2NhbGFyaXplKENsb29nTmFtZXMgKiwgaW50LCBpbnQgKikgOworY29uc3QgY2hhciAqIGNsb29nX25hbWVzX25hbWVfYXRfbGV2ZWwoQ2xvb2dOYW1lcyAqbmFtZXMsIGludCBsZXZlbCk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorICB9CisjZW5kaWYgCisjZW5kaWYgLyogZGVmaW5lIF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Nsb29nL29wdGlvbnMuaCBiL2luY2x1ZGUvY2xvb2cvb3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZGQ3MGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Nsb29nL29wdGlvbnMuaApAQCAtMCwwICsxLDE2OSBAQAorCisgICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKyAgICAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTG9vRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgICAgKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyAgICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKgorICAgICoqICAgICAgICAgICAgICAgICAgRmlyc3QgdmVyc2lvbjogYXByaWwgMTl0aCAyMDAzICAgICAgICAgICAgICAgICAgICoqCisgICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICBDTG9vRyA6IHRoZSBDaHVua3kgTG9vcCBHZW5lcmF0b3IgKGV4cGVyaW1lbnRhbCkgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgQ2VkcmljIEJhc3RvdWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAgICAgICAgICAgICAgKgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyAgICAgICAgICAgICAgICAgKgorICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyICAgICAgICAgICAgICAgKgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgICAgICAgICAgKgorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyAgICAgICAgICAgKgorICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgKgorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ0xvb0csIHRoZSBDaHVua3kgTG9vcCBHZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogV3JpdHRlbiBieSBDZWRyaWMgQmFzdG91bCwgQ2VkcmljLkJhc3RvdWxAaW5yaWEuZnIgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZm5kZWYgQ0xPT0dfT1BUSU9OU19ICisjZGVmaW5lIENMT09HX09QVElPTlNfSAorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIAorICB7CisjZW5kaWYgCisKKworLyogVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSBpZiB5b3Ugd2FudCBzb21lIGluZm9ybWF0aW9uIGFib3V0CisgKiBtYXhpbXVtIHRvdGFsIGFsbG9jYXRlZCBtZW1vcnkgZm9yIGNvZGUgZ2VuZXJhdGlvbi4KKyNkZWZpbmUgQ0xPT0dfTUVNT1JZIAorICovCisjZGVmaW5lIENMT09HX1NDQUxBUlMKKworc3RydWN0IG9zbF9zY29wOworCitzdHJ1Y3QgY2xvb2dvcHRpb25zOwordHlwZWRlZiBzdHJ1Y3QgY2xvb2dvcHRpb25zIENsb29nT3B0aW9uczsKK3N0cnVjdCBvc2xfc2NvcDsKKworc3RydWN0IGNsb29nb3B0aW9ucworeworICBDbG9vZ1N0YXRlICpzdGF0ZTsgLyogU3RhdGUuICovCisgIC8qIE9QVElPTlMgRk9SIExPT1AgR0VORVJBVElPTiAqLworICBpbnQgbCA7ICAgICAgICAgICAvKiBMYXN0IGxldmVsIHRvIG9wdGltaXplLiAqLworICBpbnQgZiA7ICAgICAgICAgICAvKiBGaXJzdCBsZXZlbCB0byBvcHRpbWl6ZS4gKi8KKworICBpbnQgKmxzOyAgICAgICAgIC8qIExhc3QgbGV2ZWwgdG8gb3B0aW1pemUgKHN0YXRlbWVudC13aXNlKS4gKi8KKyAgaW50ICpmczsgICAgICAgICAvKiBGaXJzdCBsZXZlbCB0byBvcHRpbWl6ZSAoc3RhdGVtZW50LXdpc2UpLiAqLworICBpbnQgZnNfbHNfc2l6ZTsgIC8qIFNpemUgb2YgdGhlIGZzIGFuZCBscyBhcnJheXMgKHNhbWUgc2l6ZSkgKi8KKyAgaW50IHN0b3AgOyAgICAgICAgLyogTGV2ZWwgdG8gc3RvcCBjb2RlIGdlbmVyYXRpb24uICovCisgIGludCBzdHJpZGVzIDsgICAgIC8qIDEgaWYgdXNlciB3YW50cyB0byBoYW5kbGUgbm9uLXVuaXQgc3RyaWRlcyAodGhlbiBsb29wCisgICAgICAgICAgICAgICAgICAgICAqIGluY3JlbWVudCBjYW4gYmUgc29tZXRoaW5nIGVsc2UgdGhhbiBvbmUpLCAwIG90aGVyd2lzZS4KKyAgICAgICAgICAgICAgICAgICAgICovCisgIGludCBzaDsJICAgIC8qIDEgZm9yIGNvbXB1dGluZyBzaW1wbGUgaHVsbHMgKi8KKyAgaW50IGZpcnN0X3Vucm9sbDsgLyogVGhlIGZpcnN0IGRpbWVuc2lvbiB0byB1bnJvbGwgKi8KKworICAvKiBPUFRJT05TIEZPUiBQUkVUVFkgUFJJTlRJTkcgKi8KKyAgaW50IGVzcCA7ICAgICAgIC8qIDEgaWYgdXNlciB3YW50cyB0byBzcHJlYWQgYWxsIGVxdWFsaXRpZXMsIGkuZS4gd2hlbiB0aGVyZQorICAgICAgICAgICAgICAgICAgICogaXMgc29tZXRoaW5nIGxpa2UgImkgPSAzKmogKyAxIDsgQVtpXSA9IDAgOyIgdGhlIGdlbmVyYXRvcgorICAgICAgICAgICAgICAgICAgICogd2lsbCB3cml0ZSAiQVszKmogKyAxXSA9IDAgOyIsIDAgb3RoZXJ3aXNlLgorICAgICAgICAgICAgICAgICAgICovCisgIGludCBmc3AgOyAgICAgICAvKiBUaGUgaXRlcmF0aW9uIGxldmVsIHdoZXJlIGVxdWFsaXRpZXMgc3ByZWFkaW5nIGNhbiBiZWdpbgorICAgICAgICAgICAgICAgICAgICogKGl0IG1pZ2h0IGhhcHBlbiB0aGF0IHRoZSB1c2VyIHdhbnRzIG5vdCB0byBzcHJlYWQgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgKiBvZiBzY2F0dGVyaW5nIGl0ZXJhdG9ycykuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IG90bCA7ICAgICAgIC8qIDEgZm9yIGVsaW1pbmF0ZSBsb29wcyBydW5uaW5nIGp1c3Qgb25lIHRpbWUgYW5kIHdyaXRlIHRoZW0KKyAgICAgICAgICAgICAgICAgICAqIGFzIGFuIGFmZmVjdGF0aW9uIG9mIHRoZSBpdGVyYXRvciwgMCBvdGhlcndpc2UuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IGJsb2NrIDsgICAgIC8qIDEgdG8gbWFrZSBvbmUgbmV3IGJsb2NrIHsuLi59IHBlciBuZXcgZGltZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICogMCBvdGhlcndpc2UuCisgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IGNvbXBpbGFibGU7IC8qIDEgdG8gZ2VuZXJhdGUgYSBjb21waWxhYmxlIGNvZGUgYnkgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAqIHByZXByb2Nlc3NpbmcsIDAgb3RoZXJ3aXNlLgorICAgICAgICAgICAgICAgICAgICovCisgIGludCBjYWxsYWJsZTsgICAvKiAxIHRvIGdlbmVyYXRlIGNhbGxhYmxlIGNvZGUgYnkgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAqIHByZXByb2Nlc3NpbmcsIDAgb3RoZXJ3aXNlLgorICAgICAgICAgICAgICAgICAgICovCisgIGludCBsYW5ndWFnZTsgICAvKiAxIHRvIGdlbmVyYXRlIEZPUlRSQU4sIDAgZm9yIEMgb3RoZXJ3aXNlLiAqLworCisgIGludCBzYXZlX2RvbWFpbnM7LyogU2F2ZSB1bnNpbXBsaWZpZWQgY29weSBvZiBkb21haW4uICovCisKKyAgLyogTUlTQyBPUFRJT05TICovCisgIGNoYXIgKiBuYW1lIDsgICAvKiBOYW1lIG9mIHRoZSBpbnB1dCBmaWxlLiAqLworICBmbG9hdCB0aW1lIDsgICAgLyogVGltZSBzcGVudCBmb3IgY29kZSBnZW5lcmF0aW9uIGluIHNlY29uZHMuICovCisgIGludCBvcGVuc2NvcDsgICAvKiAxIGlmIHRoZSBpbnB1dCBmaWxlIGhhcyBPcGVuU2NvcCBmb3JtYXQsIDAgb3RoZXJ3aXNlLiAqLworICBzdHJ1Y3Qgb3NsX3Njb3AgKnNjb3A7IC8qIElucHV0IE9wZW5TY29wIHNjb3AgaWYgYW55LCBOVUxMIG90aGVyd2lzZS4gKi8KKyNpZmRlZiBDTE9PR19NRU1PUlkKKyAgaW50IG1lbW9yeSA7ICAgIC8qIE1lbW9yeSBzcGVudCBmb3IgY29kZSBnZW5lcmF0aW9uIGluIGtpbG9ieXRlcy4gKi8KKyNlbmRpZgorICBpbnQgcXVpZXQ7ICAgICAgLyogRG9uJ3QgcHJpbnQgYW55IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuICovCisgIC8qIFVORE9DVU1FTlRFRCBPUFRJT05TIEZPUiBUSEUgQVVUSE9SIE9OTFkgKi8KKyAgaW50IGxlYWtzIDsgICAgIC8qIDEgaWYgSSB3YW50IHRvIHByaW50IHRoZSBhbGxvY2F0aW9uIHN0YXRpc3RpY3MsCisgICAgICAgICAgICAgICAgICAgKiAwIG90aGVyd2lzZS4KKwkJICAgKi8KKyAgaW50IGJhY2t0cmFjazsgIC8qIDEgdG8gcGVyZm9ybSBiYWNrdHJhY2tpbmcgaW4gCisgICAgICAgICAgICAgICAgICAgKiBRdWlsbGVyZSdzIGFsZ29yaXRobSwgMCBvdGhlcndpc2UuCisJCSAgICovCisgIGludCBvdmVycmlkZSA7ICAvKiAxIGlmIEkgd2FudCB0byBieXBhc3MgQ0xvb0cgZGVjaXNpb25zIG9uIG9wdGlvbiBjb3JyZWN0bmVzcworICAgICAgICAgICAgICAgICAgICogKGdlbmVyYXRlZCBjb2RlIG1heSBiZSBpbmNvcnJlY3QpLCAwIG90aGVyd2lzZS4KKwkJICAgKi8KKyAgaW50IHN0cnVjdHVyZSA7IC8qIDEgaWYgSSB3YW50IHRvIHByaW50IHRoZSBDbG9vZ1Byb2dyYW0gc3RydWN0dXJlIGJlZm9yZSB0aGUKKyAgICAgICAgICAgICAgICAgICAqIHByZXR0eSBwcmludGVkIGNvZGUsIDAgb3RoZXJ3aXNlLgorCQkgICAqLworICBpbnQgbm9ibG9ja3MgOyAgLyogMSBpZiBJIGRvbid0IHdhbnQgdG8gbWFrZSBzdGF0ZW1lbnQgYmxvY2tzLCAwIG90aGVyd2lzZS4gKi8KKyAgaW50IG5vc2NhbGFycyA7IC8qIDEgaWYgSSBkb24ndCB3YW50IHRvIHVzZSBzY2FsYXIgZGltZW5zaW9ucywgMCBvdGhlcndpc2UuICovCisgIGludCBub3NpbXBsaWZ5OyAvKiAxIGlmIEkgZG9uJ3Qgd2FudCB0byBzaW1wbGlmeSBwb2x5aGVkcmEsIDAgb3RoZXJ3aXNlLiAqLworfSA7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yIHJlcG9ydGluZyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZW51bSBjbG9vZ19tc2dfdHlwZSB7IENMT09HX0VSUk9SLCBDTE9PR19XQVJOSU5HLCBDTE9PR19JTkZPIH07CisKK3ZvaWQgY2xvb2dfbXNnKENsb29nT3B0aW9ucyAqb3B0aW9ucywgZW51bSBjbG9vZ19tc2dfdHlwZSB0eXBlLAorCQljb25zdCBjaGFyICptc2csIC4uLik7Cit2b2lkIGNsb29nX2RpZShjb25zdCBjaGFyICptc2csIC4uLik7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZSBkaXNwbGF5IGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY2xvb2dfb3B0aW9uc19wcmludChGSUxFICosIENsb29nT3B0aW9ucyAqKSA7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5IGRlYWxsb2NhdGlvbiBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY2xvb2dfb3B0aW9uc19mcmVlKENsb29nT3B0aW9ucyAqKSA7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGluZyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY2xvb2dfb3B0aW9uc19yZWFkKENsb29nU3RhdGUgKnN0YXRlLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisJCQlGSUxFICoqaW5wdXQsIEZJTEUgKipvdXRwdXQsIENsb29nT3B0aW9ucyAqKm9wdGlvbnMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NpbmcgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDbG9vZ09wdGlvbnMgKmNsb29nX29wdGlvbnNfbWFsbG9jKENsb29nU3RhdGUgKnN0YXRlKTsKK3ZvaWQgY2xvb2dfb3B0aW9uc19jb3B5X2Zyb21fb3NsX3Njb3Aoc3RydWN0IG9zbF9zY29wICosIENsb29nT3B0aW9ucyAqKTsKKworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyAgfQorI2VuZGlmIAorI2VuZGlmIC8qIGRlZmluZSBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbG9vZy9wcHJpbnQuaCBiL2luY2x1ZGUvY2xvb2cvcHByaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlMmI1ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY2xvb2cvcHByaW50LmgKQEAgLTAsMCArMSw2NyBAQAorCisgICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKyAgICAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMb29HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgICAgKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwcmludC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyAgICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKgorICAgICoqICAgICAgICAgICAgICAgICBGaXJzdCB2ZXJzaW9uOiBvY3RvYmVyIDI2dGggMjAwMSAgICAgICAgICAgICAgICAgICoqCisgICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICBDTG9vRyA6IHRoZSBDaHVua3kgTG9vcCBHZW5lcmF0b3IgKGV4cGVyaW1lbnRhbCkgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgQ2VkcmljIEJhc3RvdWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAgICAgICAgICAgICAgKgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyAgICAgICAgICAgICAgICAgKgorICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyICAgICAgICAgICAgICAgKgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgICAgICAgICAgKgorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyAgICAgICAgICAgKgorICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgKgorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ0xvb0csIHRoZSBDaHVua3kgTG9vcCBHZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogV3JpdHRlbiBieSBDZWRyaWMgQmFzdG91bCwgQ2VkcmljLkJhc3RvdWxAaW5yaWEuZnIgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIENMT09HX1BQUklOVF9ICisjZGVmaW5lIENMT09HX1BQUklOVF9ICisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgCisgIHsKKyNlbmRpZiAKKworCisjIGRlZmluZSBNQVhfU1RSSU5HX1ZBTCAzMgorIyBkZWZpbmUgSU5ERU5UX1NURVAgMgorCisjIGRlZmluZSBFUVRZUEVfTk9ORQkgMAorIyBkZWZpbmUgRVFUWVBFX0NPTlNUQU5UIDEKKyMgZGVmaW5lIEVRVFlQRV9QVVJFSVRFTSAyCisjIGRlZmluZSBFUVRZUEVfRVhBRkZJTkUgMworCisjZGVmaW5lIENMT09HX0xBTkdVQUdFX0MgMAorI2RlZmluZSBDTE9PR19MQU5HVUFHRV9GT1JUUkFOIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZSBkaXNwbGF5IGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY2xhc3RfcHByaW50KEZJTEUgKmZvbywgc3RydWN0IGNsYXN0X3N0bXQgKnJvb3QsIGludCBpbmRlbnQsIAorCSAgICBDbG9vZ09wdGlvbnMgKm9wdGlvbnMpOworCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorICB9CisjZW5kaWYgCisjZW5kaWYgLyogZGVmaW5lIF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Nsb29nL3Byb2dyYW0uaCBiL2luY2x1ZGUvY2xvb2cvcHJvZ3JhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMGQyMWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Nsb29nL3Byb2dyYW0uaApAQCAtMCwwICsxLDExNiBAQAorCisgICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKyAgICAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMb29HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgICAgKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyAgICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKgorICAgICoqICAgICAgICAgICAgICAgICBGaXJzdCB2ZXJzaW9uOiBvY3RvYmVyIDI1dGggMjAwMSAgICAgICAgICAgICAgICAgICoqCisgICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICBDTG9vRyA6IHRoZSBDaHVua3kgTG9vcCBHZW5lcmF0b3IgKGV4cGVyaW1lbnRhbCkgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgQ2VkcmljIEJhc3RvdWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAgICAgICAgICAgICAgKgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyAgICAgICAgICAgICAgICAgKgorICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyICAgICAgICAgICAgICAgKgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgICAgICAgICAgKgorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyAgICAgICAgICAgKgorICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgKgorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ0xvb0csIHRoZSBDaHVua3kgTG9vcCBHZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogV3JpdHRlbiBieSBDZWRyaWMgQmFzdG91bCwgQ2VkcmljLkJhc3RvdWxAaW5yaWEuZnIgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIENMT09HX1BST0dSQU1fSAorI2RlZmluZSBDTE9PR19QUk9HUkFNX0gKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiAKKyAgeworI2VuZGlmIAorCisKKyMgZGVmaW5lIE1BWF9TVFJJTkcgMTAyNAorIyBkZWZpbmUgTUVHQSAxMDAwMDAwICAvKiBPbmUgbWlsbGlvbi4gKi8KKworCisvKioKKyAqIENsb29nUHJvZ3JhbSBzdHJ1Y3R1cmU6CisgKiB0aGlzIHN0cnVjdHVyZSBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9ucyBvZiBhIHByb2dyYW0gZ2VuZXJhdGVkIG9yIHRvIGJlCisgKiBnZW5lcmF0ZWQuCisgKi8KK3N0cnVjdCBjbG9vZ3Byb2dyYW0KK3sgLyogQmFzaWMgcHJvZ3JhbSBkZXNjcmlwdGlvbiBmaWVsZHMuICovCisgIGNoYXIgbGFuZ3VhZ2UgOyAgICAgICAgICAgICAgLyoqPCBUaGUgbGFuZ3VhZ2Ugb2YgdGhlIHByb2dyYW0uICovCisgIGludCAgbmJfc2NhdHRkaW1zIDsgICAgICAgICAgLyoqPCBTY2F0dGVyaW5nIGRpbWVuc2lvbiBudW1iZXIuICovCisgIENsb29nRG9tYWluICAgICogY29udGV4dCA7ICAgLyoqPCBUaGUgY29udGV4dCBvZiB0aGUgcHJvZ3JhbS4gKi8KKyAgQ2xvb2dMb29wICAgICAgKiBsb29wIDsgICAgICAvKio8IFRoZSBsb29wcyBvZiB0aGUgcHJvZ3JhbS4gKi8KKyAgQ2xvb2dOYW1lcyAgICAgKiBuYW1lcyA7ICAgICAvKio8IEl0ZXJhdG9ycyBhbmQgcGFyYW1ldGVycyBuYW1lcy4gKi8KKyAgQ2xvb2dCbG9ja0xpc3QgKiBibG9ja2xpc3QgOyAvKio8IFRoZSBzdGF0ZW1lbnQgYmxvY2sgbGlzdC4gKi8KKyAgCisgIC8qIEludGVybmFsIHNlcnZpY2UgZmllbGRzLCBmaWxsZWQgdXAgYnkgY2xvb2dfcHJvZ3JhbV9zY2F0dGVyIGZ1bmN0aW9uLiAqLworICBpbnQgKiBzY2FsZGltcyA7ICAgICAgICAgICAgIC8qKjwgQm9vbGVhbiBhcnJheSBzYXlpbmcgd2hldGhlciBhIGdpdmVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBzY2F0dGVyaW5nIGRpbWVuc2lvbiBpcyBzY2FsYXIgb3Igbm90LgorCQkJCSovCisgIC8qIExpYnJhcnkgdXNlciByZXNlcnZlZCBmaWVsZC4gKi8KKyAgdm9pZCAqIHVzcjsJCSAgICAgICAvKio8IFVzZXIgZmllbGQsIGZvciBsaWJyYXJ5IHVzZXIgY29udmVuaWVuY2UuCisJCQkgICAgICAgICogICBUaGlzIHBvaW50ZXIgaXMgbm90IGZyZWVkIHdoZW4gdGhlCisJCQkgICAgICAgICogICBDbG9vZ1Byb2dyYW0gc3RydWN0dXJlIGlzIGZyZWVkLgorCQkJICAgICAgICAqLworfSA7Cit0eXBlZGVmIHN0cnVjdCBjbG9vZ3Byb2dyYW0gQ2xvb2dQcm9ncmFtIDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgU3RydWN0dXJlIGRpc3BsYXkgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjbG9vZ19wcm9ncmFtX3ByaW50X3N0cnVjdHVyZShGSUxFICosIENsb29nUHJvZ3JhbSAqLCBpbnQpIDsKK3ZvaWQgY2xvb2dfcHJvZ3JhbV9wcmludChGSUxFICosIENsb29nUHJvZ3JhbSAqKSA7Cit2b2lkIGNsb29nX3Byb2dyYW1fcHByaW50KEZJTEUgKiwgQ2xvb2dQcm9ncmFtICosIENsb29nT3B0aW9ucyAqKSA7Cit2b2lkIGNsb29nX3Byb2dyYW1fZHVtcF9jbG9vZyhGSUxFICosIENsb29nUHJvZ3JhbSAqLCBDbG9vZ1NjYXR0ZXJpbmdMaXN0ICopOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeSBkZWFsbG9jYXRpb24gZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNsb29nX3Byb2dyYW1fZnJlZShDbG9vZ1Byb2dyYW0gKikgOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRpbmcgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDbG9vZ1Byb2dyYW0gKiBjbG9vZ19wcm9ncmFtX3JlYWQoRklMRSAqLCBDbG9vZ09wdGlvbnMgKikgOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NpbmcgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDbG9vZ1Byb2dyYW0gKiBjbG9vZ19wcm9ncmFtX21hbGxvYyh2b2lkKTsKK0Nsb29nUHJvZ3JhbSAqIGNsb29nX3Byb2dyYW1fYWxsb2MoQ2xvb2dEb21haW4gKmNvbnRleHQsIENsb29nVW5pb25Eb21haW4gKnVkLAorCUNsb29nT3B0aW9ucyAqb3B0aW9ucyk7CitDbG9vZ1Byb2dyYW0gKiBjbG9vZ19wcm9ncmFtX2dlbmVyYXRlKENsb29nUHJvZ3JhbSAqLCBDbG9vZ09wdGlvbnMgKikgOwordm9pZCBjbG9vZ19wcm9ncmFtX2Jsb2NrKENsb29nUHJvZ3JhbSAqcHJvZ3JhbSwKKwlDbG9vZ1NjYXR0ZXJpbmdMaXN0ICpzY2F0dGVyaW5nLCBDbG9vZ09wdGlvbnMgKm9wdGlvbnMpOwordm9pZCBjbG9vZ19wcm9ncmFtX2V4dHJhY3Rfc2NhbGFycyhDbG9vZ1Byb2dyYW0gKnByb2dyYW0sCisJQ2xvb2dTY2F0dGVyaW5nTGlzdCAqc2NhdHRlcmluZywgQ2xvb2dPcHRpb25zICpvcHRpb25zKTsKK3ZvaWQgY2xvb2dfcHJvZ3JhbV9zY2F0dGVyKENsb29nUHJvZ3JhbSAqcHJvZ3JhbSwKKwkJCUNsb29nU2NhdHRlcmluZ0xpc3QgKnNjYXR0ZXJpbmcsIENsb29nT3B0aW9ucyAqb3B0aW9ucyk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorICB9CisjZW5kaWYgCisjZW5kaWYgLyogZGVmaW5lIF9IICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xvb2cvc3RhdGUuaCBiL2luY2x1ZGUvY2xvb2cvc3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmMzMjcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jbG9vZy9zdGF0ZS5oCkBAIC0wLDAgKzEsNDYgQEAKKyNpZm5kZWYgQ0xPT0dfU1RBVEVfSAorI2RlZmluZSBDTE9PR19TVEFURV9ICisKK3N0cnVjdCBjbG9vZ2JhY2tlbmQ7Cit0eXBlZGVmIHN0cnVjdCBjbG9vZ2JhY2tlbmQgQ2xvb2dCYWNrZW5kOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmIAorCitzdHJ1Y3QgY2xvb2dzdGF0ZSB7CisgIENsb29nQmFja2VuZCAqYmFja2VuZDsKKworICBjbG9vZ19pbnRfdCB6ZXJvOworICBjbG9vZ19pbnRfdCBvbmU7CisgIGNsb29nX2ludF90IG5lZ29uZTsKKworICBpbnQgYmxvY2tfYWxsb2NhdGVkOworICBpbnQgYmxvY2tfZnJlZWQ7CisgIGludCBibG9ja19tYXg7CisKKyAgaW50IGRvbWFpbl9hbGxvY2F0ZWQ7CisgIGludCBkb21haW5fZnJlZWQ7CisgIGludCBkb21haW5fbWF4OworCisgIGludCBsb29wX2FsbG9jYXRlZDsKKyAgaW50IGxvb3BfZnJlZWQ7CisgIGludCBsb29wX21heDsKKworICBpbnQgc3RhdGVtZW50X2FsbG9jYXRlZDsKKyAgaW50IHN0YXRlbWVudF9mcmVlZDsKKyAgaW50IHN0YXRlbWVudF9tYXg7Cit9OwordHlwZWRlZiBzdHJ1Y3QgY2xvb2dzdGF0ZSBDbG9vZ1N0YXRlOworCitDbG9vZ1N0YXRlICpjbG9vZ19jb3JlX3N0YXRlX21hbGxvYyh2b2lkKTsKK0Nsb29nU3RhdGUgKmNsb29nX3N0YXRlX21hbGxvYyh2b2lkKTsKKwordm9pZCBjbG9vZ19jb3JlX3N0YXRlX2ZyZWUoQ2xvb2dTdGF0ZSAqc3RhdGUpOwordm9pZCBjbG9vZ19zdGF0ZV9mcmVlKENsb29nU3RhdGUgKnN0YXRlKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYgCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbG9vZy9zdGF0ZW1lbnQuaCBiL2luY2x1ZGUvY2xvb2cvc3RhdGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjNTA1ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY2xvb2cvc3RhdGVtZW50LmgKQEAgLTAsMCArMSw4NSBAQAorCisgICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKyAgICAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMb29HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgICAgKiogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyAgICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKgorICAgICoqICAgICAgICAgICAgICAgICAgRmlyc3QgdmVyc2lvbjogbm92ZW1iZXIgNHRoIDIwMDEgICAgICAgICAgICAgICAgICoqCisgICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICBDTG9vRyA6IHRoZSBDaHVua3kgTG9vcCBHZW5lcmF0b3IgKGV4cGVyaW1lbnRhbCkgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgQ2VkcmljIEJhc3RvdWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAgICAgICAgICAgICAgKgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyAgICAgICAgICAgICAgICAgKgorICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyICAgICAgICAgICAgICAgKgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgICAgICAgICAgKgorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyAgICAgICAgICAgKgorICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgKgorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ0xvb0csIHRoZSBDaHVua3kgTG9vcCBHZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogV3JpdHRlbiBieSBDZWRyaWMgQmFzdG91bCwgQ2VkcmljLkJhc3RvdWxAaW5yaWEuZnIgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIENMT09HX1NUQVRFTUVOVF9ICisjZGVmaW5lIENMT09HX1NUQVRFTUVOVF9ICisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgCisgIHsKKyNlbmRpZiAKKworCitzdHJ1Y3QgY2xvb2dzdGF0ZW1lbnQKK3sKKyAgQ2xvb2dTdGF0ZSAqc3RhdGU7ICAgICAgICAgICAgIC8qIFN0YXRlLiAqLworICBjaGFyICpuYW1lOwkJCSAvKiBOYW1lIG9mIHRoZSBzdGF0ZW1lbnQuICovCisgIGludCBudW1iZXI7ICAgICAgICAgICAgICAgICAgICAvKiBUaGUgc3RhdGVtZW50IHVuaXF1ZSBudW1iZXIuICovCisgIHZvaWQgKiB1c3IgOyAgICAgICAgICAgICAgICAgICAvKiBBIHBvaW50ZXIgZm9yIGxpYnJhcnkgdXNlcnMgY29udmVuaWVuY2UuICovCisgIHN0cnVjdCBjbG9vZ3N0YXRlbWVudCAqIG5leHQgOyAvKiBQb2ludGVyIHRvIHRoZSBuZXh0IHN0YXRlbWVudCB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2FtZSBvcmlnaW5hbCBkb21haW4gYW5kIHRoZSBzYW1lCisJCQkJICAqIHNjYXR0ZXJpbmcgZnVuY3Rpb24uCisJCQkJICAqLworfSA7Cit0eXBlZGVmIHN0cnVjdCBjbG9vZ3N0YXRlbWVudCBDbG9vZ1N0YXRlbWVudCA7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZSBkaXNwbGF5IGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY2xvb2dfc3RhdGVtZW50X3ByaW50X3N0cnVjdHVyZShGSUxFICosIENsb29nU3RhdGVtZW50ICosIGludCkgOwordm9pZCBjbG9vZ19zdGF0ZW1lbnRfcHJpbnQoRklMRSAqLCBDbG9vZ1N0YXRlbWVudCAqKSA7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5IGRlYWxsb2NhdGlvbiBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY2xvb2dfc3RhdGVtZW50X2ZyZWUoQ2xvb2dTdGF0ZW1lbnQgKikgOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NpbmcgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDbG9vZ1N0YXRlbWVudCAqIGNsb29nX3N0YXRlbWVudF9tYWxsb2MoQ2xvb2dTdGF0ZSAqc3RhdGUpOworQ2xvb2dTdGF0ZW1lbnQgKiBjbG9vZ19zdGF0ZW1lbnRfYWxsb2MoQ2xvb2dTdGF0ZSAqc3RhdGUsIGludCk7CitDbG9vZ1N0YXRlbWVudCAqIGNsb29nX3N0YXRlbWVudF9jb3B5KENsb29nU3RhdGVtZW50ICopIDsKK3ZvaWQgY2xvb2dfc3RhdGVtZW50X2FkZChDbG9vZ1N0YXRlbWVudCoqLCBDbG9vZ1N0YXRlbWVudCoqLCBDbG9vZ1N0YXRlbWVudCopIDsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisgIH0KKyNlbmRpZiAKKyNlbmRpZiAvKiBkZWZpbmUgX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbG9vZy9zdHJpZGUuaCBiL2luY2x1ZGUvY2xvb2cvc3RyaWRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzZGM0ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY2xvb2cvc3RyaWRlLmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBDTE9PR19TVFJJREVfSAorI2RlZmluZSBDTE9PR19TVFJJREVfSAorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmIAorCisvKioKKyAqIEluZm9ybWF0aW9uIGFib3V0IHN0cmlkZXMuCisgKi8KK3N0cnVjdCBjbG9vZ3N0cmlkZSB7CisgIGludCByZWZlcmVuY2VzOworICBjbG9vZ19pbnRfdCBzdHJpZGU7ICAgICAgICAgLyoqPCBUaGUgYWN0dWFsIHN0cmlkZS4gKi8KKyAgY2xvb2dfaW50X3Qgb2Zmc2V0OyAgICAgICAgIC8qKjwgT2Zmc2V0IG9mIHN0cmlkZWQgbG9vcC4gKi8KKyAgY2xvb2dfaW50X3QgZmFjdG9yOworICBDbG9vZ0NvbnN0cmFpbnQgKmNvbnN0cmFpbnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgY2xvb2dzdHJpZGUgQ2xvb2dTdHJpZGU7CisKK0Nsb29nU3RyaWRlICpjbG9vZ19zdHJpZGVfYWxsb2MoY2xvb2dfaW50X3Qgc3RyaWRlLCBjbG9vZ19pbnRfdCBvZmZzZXQpOworQ2xvb2dTdHJpZGUgKmNsb29nX3N0cmlkZV9hbGxvY19mcm9tX2NvbnN0cmFpbnQoY2xvb2dfaW50X3Qgc3RyaWRlLAorCUNsb29nQ29uc3RyYWludCAqY29uc3RyYWludCwgY2xvb2dfaW50X3QgZmFjdG9yKTsKK0Nsb29nU3RyaWRlICpjbG9vZ19zdHJpZGVfY29weShDbG9vZ1N0cmlkZSAqc3RyaWRlKTsKK3ZvaWQgY2xvb2dfc3RyaWRlX2ZyZWUoQ2xvb2dTdHJpZGUgKnN0cmlkZSk7CisKK0Nsb29nQ29uc3RyYWludCAqY2xvb2dfY29uc3RyYWludF9zdHJpZGVfbG93ZXJfYm91bmQoQ2xvb2dDb25zdHJhaW50ICpjLAorCWludCBsZXZlbCwgQ2xvb2dTdHJpZGUgKnN0cmlkZSk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmIAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xvb2cvdW5pb25fZG9tYWluLmggYi9pbmNsdWRlL2Nsb29nL3VuaW9uX2RvbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNmZmODYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Nsb29nL3VuaW9uX2RvbWFpbi5oCkBAIC0wLDAgKzEsNTIgQEAKKyNpZm5kZWYgQ0xPT0dfVU5JT05fRE9NQUlOX0gKKyNkZWZpbmUgQ0xPT0dfVU5JT05fRE9NQUlOX0gKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZiAKKworc3RydWN0IG9zbF9zY29wOworCisvKioKKyAqIENsb29nTmFtZWREb21haW5MaXN0IHN0cnVjdHVyZToKKyAqIHRoaXMgc3RydWN0dXJlIHJlcHJlbnNlbnRzIGEgbm9kZSBvZiBhIGxpbmtlZCBsaXN0IG9mIENsb29nRG9tYWluIHN0cnVjdHVyZXMuCisgKi8KK3N0cnVjdCBjbG9vZ25hbWVkZG9tYWlubGlzdCB7CisgIENsb29nRG9tYWluICpkb21haW47ICAgICAgICAgICAgICAvKio8IEFuIGVsZW1lbnQgb2YgdGhlIGxpc3QuICovCisgIENsb29nU2NhdHRlcmluZyAqc2NhdHRlcmluZzsgICAgICAvKio8IFNjYXR0ZXJpbmcgZnVuY3Rpb24gZm9yIGRvbWFpbi4gKi8KKyAgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGUgZG9tYWluLiAqLworICB2b2lkICp1c3I7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBIHBvaW50ZXIgZm9yIGxpYnJhcnkgdXNlcidzIGNvbnZlbmllbmNlLiAqLworICBzdHJ1Y3QgY2xvb2duYW1lZGRvbWFpbmxpc3QgKm5leHQ7LyoqPCBQb2ludGVyIHRvIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGxpc3QuKi8KK307Cit0eXBlZGVmIHN0cnVjdCBjbG9vZ25hbWVkZG9tYWlubGlzdCBDbG9vZ05hbWVkRG9tYWluTGlzdDsKKworLyoqCisgKiBBIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGlucHV0IGRvbWFpbnMgYW5kIHNjYXR0ZXJpbmcgZnVuY3Rpb25zLgorICovCitzdHJ1Y3QgY2xvb2d1bmlvbmRvbWFpbiB7CisJaW50IG5fbmFtZVszXTsKKwljaGFyICoqbmFtZVszXTsKKwlDbG9vZ05hbWVkRG9tYWluTGlzdCAqZG9tYWluOworCUNsb29nTmFtZWREb21haW5MaXN0ICoqbmV4dF9kb21haW47Cit9OwordHlwZWRlZiBzdHJ1Y3QgY2xvb2d1bmlvbmRvbWFpbiBDbG9vZ1VuaW9uRG9tYWluOworCitlbnVtIGNsb29nX2RpbV90eXBlIHsgQ0xPT0dfUEFSQU0sIENMT09HX0lURVIsIENMT09HX1NDQVQgfTsKKworQ2xvb2dVbmlvbkRvbWFpbiAqY2xvb2dfdW5pb25fZG9tYWluX3JlYWQoRklMRSAqZmlsZSwgaW50IG5iX3BhciwKKwlDbG9vZ09wdGlvbnMgKm9wdGlvbnMpOworQ2xvb2dVbmlvbkRvbWFpbiAqY2xvb2dfdW5pb25fZG9tYWluX2FsbG9jKGludCBuYl9wYXIpOworQ2xvb2dVbmlvbkRvbWFpbiAqY2xvb2dfdW5pb25fZG9tYWluX2FkZF9kb21haW4oQ2xvb2dVbmlvbkRvbWFpbiAqdWQsCisJY29uc3QgY2hhciAqbmFtZSwgQ2xvb2dEb21haW4gKmRvbWFpbiwgQ2xvb2dTY2F0dGVyaW5nICpzY2F0dGVyaW5nLAorCXZvaWQgKnVzcik7CitDbG9vZ1VuaW9uRG9tYWluICpjbG9vZ191bmlvbl9kb21haW5fc2V0X25hbWUoQ2xvb2dVbmlvbkRvbWFpbiAqdWQsCisJZW51bSBjbG9vZ19kaW1fdHlwZSB0eXBlLCBpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBjbG9vZ191bmlvbl9kb21haW5fZnJlZShDbG9vZ1VuaW9uRG9tYWluICp1ZCk7CitDbG9vZ1VuaW9uRG9tYWluICpjbG9vZ191bmlvbl9kb21haW5fZnJvbV9vc2xfc2NvcChDbG9vZ1N0YXRlICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3NsX3Njb3AgKik7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmIAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xvb2cvdmVyc2lvbi5oIGIvaW5jbHVkZS9jbG9vZy92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0MzU2YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY2xvb2cvdmVyc2lvbi5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgQ0xvb0cgOiB0aGUgQ2h1bmt5IExvb3AgR2VuZXJhdG9yIChleHBlcmltZW50YWwpICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IENlZHJpYyBCYXN0b3VsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgICAgICAgICAgICAgICoKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgICAgICAgICAgICAgICAgICoKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciAgICAgICAgICAgICAgICoKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VICAgICAgICAgICoKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgICAgICAgICAgICoKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENMb29HLCB0aGUgQ2h1bmt5IExvb3AgR2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFdyaXR0ZW4gYnkgQ2VkcmljIEJhc3RvdWwsIENlZHJpYy5CYXN0b3VsQGlucmlhLmZyICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBDTE9PR19WRVJTSU9OX0gKKyNkZWZpbmUgQ0xPT0dfVkVSU0lPTl9ICisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgCisgIHsKKyNlbmRpZiAKKworI2RlZmluZSBDTE9PR19WRVJTSU9OX01BSk9SIDAKKyNkZWZpbmUgQ0xPT0dfVkVSU0lPTl9NSU5PUiAxOAorI2RlZmluZSBDTE9PR19WRVJTSU9OX1JFVklTSU9OIDAKKworY29uc3QgY2hhciAqY2xvb2dfdmVyc2lvbih2b2lkKTsKKworaW50IGNsb29nX3ZlcnNpb25fbWFqb3Iodm9pZCk7CisKK2ludCBjbG9vZ192ZXJzaW9uX21pbm9yKHZvaWQpOworCitpbnQgY2xvb2dfdmVyc2lvbl9yZXZpc2lvbih2b2lkKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisgIH0KKyNlbmRpZiAKKyNlbmRpZiAvKiBkZWZpbmUgX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ21wLmggYi9pbmNsdWRlL2dtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NzNjMTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2dtcC5oCkBAIC0wLDAgKzEsMjI3OSBAQAorLyogRGVmaW5pdGlvbnMgZm9yIEdOVSBtdWx0aXBsZSBwcmVjaXNpb24gZnVuY3Rpb25zLiAgIC0qLSBtb2RlOiBjIC0qLQorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywKKzIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaWZuZGVmIF9fR01QX0hfXworCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCisjaW5jbHVkZSA8aW9zZndkPiAgIC8qIGZvciBzdGQ6OmlzdHJlYW0sIHN0ZDo6b3N0cmVhbSwgc3RkOjpzdHJpbmcgKi8KKyNpbmNsdWRlIDxjc3RkaW8+CisjZW5kaWYKKworCisvKiBJbnN0YW50aWF0ZWQgYnkgY29uZmlndXJlLiAqLworI2lmICEgZGVmaW5lZCAoX19HTVBfV0lUSElOX0NPTkZJR1VSRSkKKyNkZWZpbmUgX19HTVBfSEFWRV9IT1NUX0NQVV9GQU1JTFlfcG93ZXIgICAwCisjZGVmaW5lIF9fR01QX0hBVkVfSE9TVF9DUFVfRkFNSUxZX3Bvd2VycGMgMAorI2RlZmluZSBHTVBfTElNQl9CSVRTICAgICAgICAgICAgICAgICAgICAgIDY0CisjZGVmaW5lIEdNUF9OQUlMX0JJVFMgICAgICAgICAgICAgICAgICAgICAgMAorI2VuZGlmCisjZGVmaW5lIEdNUF9OVU1CX0JJVFMgICAgIChHTVBfTElNQl9CSVRTIC0gR01QX05BSUxfQklUUykKKyNkZWZpbmUgR01QX05VTUJfTUFTSyAgICAgKCh+IF9fR01QX0NBU1QgKG1wX2xpbWJfdCwgMCkpID4+IEdNUF9OQUlMX0JJVFMpCisjZGVmaW5lIEdNUF9OVU1CX01BWCAgICAgIEdNUF9OVU1CX01BU0sKKyNkZWZpbmUgR01QX05BSUxfTUFTSyAgICAgKH4gR01QX05VTUJfTUFTSykKKworCisvKiBUaGUgZm9sbG93aW5nIChldmVyeXRoaW5nIHVuZGVyIGlmbmRlZiBfX0dOVV9NUF9fKSBtdXN0IGJlIGlkZW50aWNhbCBpbgorICAgZ21wLmggYW5kIG1wLmggdG8gYWxsb3cgYm90aCB0byBiZSBpbmNsdWRlZCBpbiBhbiBhcHBsaWNhdGlvbiBvciBkdXJpbmcKKyAgIHRoZSBsaWJyYXJ5IGJ1aWxkLiAgKi8KKyNpZm5kZWYgX19HTlVfTVBfXworI2RlZmluZSBfX0dOVV9NUF9fIDUKKworI2RlZmluZSBfX25lZWRfc2l6ZV90ICAvKiB0ZWxsIGdjYyBzdGRkZWYuaCB3ZSBvbmx5IHdhbnQgc2l6ZV90ICovCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCisjaW5jbHVkZSA8Y3N0ZGRlZj4gICAgIC8qIGZvciBzaXplX3QgKi8KKyNlbHNlCisjaW5jbHVkZSA8c3RkZGVmLmg+ICAgIC8qIGZvciBzaXplX3QgKi8KKyNlbmRpZgorI3VuZGVmIF9fbmVlZF9zaXplX3QKKworLyogSW5zdGFudGlhdGVkIGJ5IGNvbmZpZ3VyZS4gKi8KKyNpZiAhIGRlZmluZWQgKF9fR01QX1dJVEhJTl9DT05GSUdVUkUpCisvKiAjdW5kZWYgX0xPTkdfTE9OR19MSU1CICovCisjZGVmaW5lIF9fR01QX0xJQkdNUF9ETEwgIDAKKyNlbmRpZgorCisKKy8qIF9fU1REQ19fIC0gc29tZSBBTlNJIGNvbXBpbGVycyBkZWZpbmUgdGhpcyBvbmx5IHRvIDAsIGhlbmNlIHRoZSB1c2Ugb2YKKyAgICAgICAiZGVmaW5lZCIgYW5kIG5vdCAiX19TVERDX18tMCIuICBJbiBwYXJ0aWN1bGFyIFN1biB3b3Jrc2hvcCBDIDUuMAorICAgICAgIHNldHMgX19TVERDX18gdG8gMCwgYnV0IHJlcXVpcmVzICIjIyIgZm9yIHRva2VuIHBhc3RpbmcuCisKKyAgIF9BSVggLSBnbnUgYW5zaWRlY2wuaCBhc3NlcnRzIHRoYXQgYWxsIGtub3duIEFJWCBjb21waWxlcnMgYXJlIEFOU0kgYnV0CisgICAgICAgZG9uJ3QgYWx3YXlzIGRlZmluZSBfX1NURENfXy4KKworICAgX19ERUNDIC0gY3VycmVudCB2ZXJzaW9ucyBvZiBERUMgQyAoNS45IGZvciBpbnN0YW5jZSkgZm9yIGFscGhhIGFyZSBBTlNJLAorICAgICAgIGJ1dCBkb24ndCBkZWZpbmUgX19TVERDX18gaW4gdGhlaXIgZGVmYXVsdCBtb2RlLiAgRG9uJ3Qga25vdyBpZiBvbGQKKyAgICAgICB2ZXJzaW9ucyBtaWdodCBoYXZlIGJlZW4gSyZSLCBidXQgbGV0J3Mgbm90IHdvcnJ5IGFib3V0IHRoYXQgdW5sZXNzCisgICAgICAgc29tZW9uZSBpcyBzdGlsbCB1c2luZyBvbmUuCisKKyAgIF9taXBzIC0gZ251IGFuc2lkZWNsLmggc2F5cyB0aGUgUklTQy9PUyBNSVBTIGNvbXBpbGVyIGlzIEFOU0kgaW4gU1ZSNAorICAgICAgIG1vZGUsIGJ1dCBkb2Vzbid0IGRlZmluZSBfX1NURENfXy4KKworICAgX01TQ19WRVIgLSBNaWNyb3NvZnQgQyBpcyBBTlNJLCBidXQgX19TVERDX18gaXMgdW5kZWZpbmVkIHVubGVzcyB0aGUgL1phCisgICAgICAgb3B0aW9uIGlzIGdpdmVuIChpbiB3aGljaCBjYXNlIGl0J3MgMSkuCisKKyAgIF9XSU4zMiAtIHRlc3RlZCBmb3IgYnkgZ251IGFuc2lkZWNsLmgsIG5vIGRvdWJ0IG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQKKyAgICAgIGFsbCB3MzIgY29tcGlsZXJzIGFyZSBhbnNpLgorCisgICBOb3RlOiBUaGlzIHNhbWUgc2V0IG9mIHRlc3RzIGlzIHVzZWQgYnkgZ2VuLXBzcXIuYyBhbmQKKyAgIGRlbW9zL2V4cHIvZXhwci1pbXBsLmgsIHNvIGlmIGFueXRoaW5nIG5lZWRzIGFkZGluZywgdGhlbiBiZSBzdXJlIHRvCisgICB1cGRhdGUgdGhvc2UgdG9vLiAgKi8KKworI2lmICBkZWZpbmVkIChfX1NURENfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX0FJWCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfX0RFQ0MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHx8IChkZWZpbmVkIChfX21pcHMpICYmIGRlZmluZWQgKF9TWVNUWVBFX1NWUjQpKSAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX01TQ19WRVIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfV0lOMzIpCisjZGVmaW5lIF9fR01QX0hBVkVfQ09OU1QgICAgICAgIDEKKyNkZWZpbmUgX19HTVBfSEFWRV9QUk9UT1RZUEVTICAgMQorI2RlZmluZSBfX0dNUF9IQVZFX1RPS0VOX1BBU1RFICAxCisjZWxzZQorI2RlZmluZSBfX0dNUF9IQVZFX0NPTlNUICAgICAgICAwCisjZGVmaW5lIF9fR01QX0hBVkVfUFJPVE9UWVBFUyAgIDAKKyNkZWZpbmUgX19HTVBfSEFWRV9UT0tFTl9QQVNURSAgMAorI2VuZGlmCisKKworI2lmIF9fR01QX0hBVkVfQ09OU1QKKyNkZWZpbmUgX19nbXBfY29uc3QgICBjb25zdAorI2RlZmluZSBfX2dtcF9zaWduZWQgIHNpZ25lZAorI2Vsc2UKKyNkZWZpbmUgX19nbXBfY29uc3QKKyNkZWZpbmUgX19nbXBfc2lnbmVkCisjZW5kaWYKKworCisvKiBfX0dNUF9ERUNMU1BFQyBzdXBwb3J0cyBXaW5kb3dzIERMTCB2ZXJzaW9ucyBvZiBsaWJnbXAsIGFuZCBpcyBlbXB0eSBpbgorICAgYWxsIG90aGVyIGNpcmN1bXN0YW5jZXMuCisKKyAgIFdoZW4gY29tcGlsaW5nIG9iamVjdHMgZm9yIGxpYmdtcCwgX19HTVBfREVDTFNQRUMgaXMgYW4gZXhwb3J0IGRpcmVjdGl2ZSwKKyAgIG9yIHdoZW4gY29tcGlsaW5nIGZvciBhbiBhcHBsaWNhdGlvbiBpdCdzIGFuIGltcG9ydCBkaXJlY3RpdmUuICBUaGUgdHdvCisgICBjYXNlcyBhcmUgZGlmZmVyZW50aWF0ZWQgYnkgX19HTVBfV0lUSElOX0dNUCBkZWZpbmVkIGJ5IHRoZSBHTVAgTWFrZWZpbGVzCisgICAoYW5kIG5vdCBkZWZpbmVkIGZyb20gYW4gYXBwbGljYXRpb24pLgorCisgICBfX0dNUF9ERUNMU1BFQ19YWCBpcyBzaW1pbGFybHkgdXNlZCBmb3IgbGliZ21weHguICBfX0dNUF9XSVRISU5fR01QWFgKKyAgIGluZGljYXRlcyB3aGVuIGJ1aWxkaW5nIGxpYmdtcHh4LCBhbmQgaW4gdGhhdCBjYXNlIGxpYmdtcHh4IGZ1bmN0aW9ucyBhcmUKKyAgIGV4cG9ydHMsIGJ1dCBsaWJnbXAgZnVuY3Rpb25zIHdoaWNoIG1pZ2h0IGdldCBjYWxsZWQgYXJlIGltcG9ydHMuCisKKyAgIExpYnRvb2wgRExMX0VYUE9SVCBkZWZpbmUgaXMgbm90IHVzZWQuCisKKyAgIFRoZXJlJ3Mgbm8gYXR0ZW1wdCB0byBzdXBwb3J0IEdNUCBidWlsdCBib3RoIHN0YXRpYyBhbmQgRExMLiAgRG9pbmcgc28KKyAgIHdvdWxkIG1lYW4gYXBwbGljYXRpb25zIHdvdWxkIGhhdmUgdG8gdGVsbCB1cyB3aGljaCBvZiB0aGUgdHdvIGlzIGdvaW5nCisgICB0byBiZSB1c2VkIHdoZW4gbGlua2luZywgYW5kIHRoYXQgc2VlbXMgdmVyeSB0ZWRpb3VzIGFuZCBlcnJvciBwcm9uZSBpZgorICAgdXNpbmcgR01QIGJ5IGhhbmQsIGFuZCBlcXVhbGx5IHRlZGlvdXMgZnJvbSBhIHBhY2thZ2Ugc2luY2UgYXV0b2NvbmYgYW5kCisgICBhdXRvbWFrZSBkb24ndCBnaXZlIG11Y2ggaGVscC4KKworICAgX19HTVBfREVDTFNQRUMgaXMgcmVxdWlyZWQgb24gYWxsIGRvY3VtZW50ZWQgZ2xvYmFsIGZ1bmN0aW9ucyBhbmQKKyAgIHZhcmlhYmxlcywgdGhlIHZhcmlvdXMgaW50ZXJuYWxzIGluIGdtcC1pbXBsLmggZXRjIGNhbiBiZSBsZWZ0IHVuYWRvcm5lZC4KKyAgIEJ1dCBpbnRlcm5hbHMgdXNlZCBieSB0aGUgdGVzdCBwcm9ncmFtcyBvciBzcGVlZCBtZWFzdXJpbmcgcHJvZ3JhbXMKKyAgIHNob3VsZCBoYXZlIF9fR01QX0RFQ0xTUEVDLCBhbmQgY2VydGFpbmx5IGNvbnN0YW50cyBvciB2YXJpYWJsZXMgbXVzdAorICAgaGF2ZSBpdCBvciB0aGUgd3JvbmcgYWRkcmVzcyB3aWxsIGJlIHJlc29sdmVkLgorCisgICBJbiBnY2MgX19kZWNsc3BlYyBjYW4gZ28gYXQgZWl0aGVyIHRoZSBzdGFydCBvciBlbmQgb2YgYSBwcm90b3R5cGUuCisKKyAgIEluIE1pY3Jvc29mdCBDIF9fZGVjbHNwZWMgbXVzdCBnbyBhdCB0aGUgc3RhcnQsIG9yIGFmdGVyIHRoZSB0eXBlIGxpa2UKKyAgIHZvaWQgX19kZWNsc3BlYyguLi4pICpmb28oKSIuICBUaGVyZSdzIG5vIF9fZGxsZXhwb3J0IG9yIGFueXRoaW5nIHRvCisgICBndWFyZCBhZ2FpbnN0IHNvbWVvbmUgZm9vbGlzaCAjZGVmaW5pbmcgZGxsZXhwb3J0LiAgX2V4cG9ydCB1c2VkIHRvIGJlCisgICBhdmFpbGFibGUsIGJ1dCBubyBsb25nZXIuCisKKyAgIEluIEJvcmxhbmQgQyBfZXhwb3J0IHN0aWxsIGV4aXN0cywgYnV0IG5lZWRzIHRvIGdvIGFmdGVyIHRoZSB0eXBlLCBsaWtlCisgICAidm9pZCBfZXhwb3J0IGZvbygpOyIuICBXb3VsZCBoYXZlIHRvIGNoYW5nZSB0aGUgX19HTVBfREVDTFNQRUMgc3ludGF4IHRvCisgICBtYWtlIHVzZSBvZiB0aGF0LiAgUHJvYmFibHkgbW9yZSB0cm91YmxlIHRoYW4gaXQncyB3b3J0aC4gICovCisKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykKKyNkZWZpbmUgX19HTVBfREVDTFNQRUNfRVhQT1JUICBfX2RlY2xzcGVjKF9fZGxsZXhwb3J0X18pCisjZGVmaW5lIF9fR01QX0RFQ0xTUEVDX0lNUE9SVCAgX19kZWNsc3BlYyhfX2RsbGltcG9ydF9fKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoX01TQ19WRVIpIHx8IGRlZmluZWQgKF9fQk9STEFORENfXykKKyNkZWZpbmUgX19HTVBfREVDTFNQRUNfRVhQT1JUICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyNkZWZpbmUgX19HTVBfREVDTFNQRUNfSU1QT1JUICBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyNlbmRpZgorI2lmZGVmIF9fV0FUQ09NQ19fCisjZGVmaW5lIF9fR01QX0RFQ0xTUEVDX0VYUE9SVCAgX19leHBvcnQKKyNkZWZpbmUgX19HTVBfREVDTFNQRUNfSU1QT1JUICBfX2ltcG9ydAorI2VuZGlmCisjaWZkZWYgX19JQk1DX18KKyNkZWZpbmUgX19HTVBfREVDTFNQRUNfRVhQT1JUICBfRXhwb3J0CisjZGVmaW5lIF9fR01QX0RFQ0xTUEVDX0lNUE9SVCAgX0ltcG9ydAorI2VuZGlmCisKKyNpZiBfX0dNUF9MSUJHTVBfRExMCisjaWYgX19HTVBfV0lUSElOX0dNUAorLyogY29tcGlsaW5nIHRvIGdvIGludG8gYSBETEwgbGliZ21wICovCisjZGVmaW5lIF9fR01QX0RFQ0xTUEVDICBfX0dNUF9ERUNMU1BFQ19FWFBPUlQKKyNlbHNlCisvKiBjb21waWxpbmcgdG8gZ28gaW50byBhbiBhcHBsaWNhdGlvbiB3aGljaCB3aWxsIGxpbmsgdG8gYSBETEwgbGliZ21wICovCisjZGVmaW5lIF9fR01QX0RFQ0xTUEVDICBfX0dNUF9ERUNMU1BFQ19JTVBPUlQKKyNlbmRpZgorI2Vsc2UKKy8qIGFsbCBvdGhlciBjYXNlcyAqLworI2RlZmluZSBfX0dNUF9ERUNMU1BFQworI2VuZGlmCisKKworI2lmZGVmIF9fR01QX1NIT1JUX0xJTUIKK3R5cGVkZWYgdW5zaWduZWQgaW50CQltcF9saW1iX3Q7Cit0eXBlZGVmIGludAkJCW1wX2xpbWJfc2lnbmVkX3Q7CisjZWxzZQorI2lmZGVmIF9MT05HX0xPTkdfTElNQgordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50CW1wX2xpbWJfdDsKK3R5cGVkZWYgbG9uZyBsb25nIGludAkJbXBfbGltYl9zaWduZWRfdDsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50CW1wX2xpbWJfdDsKK3R5cGVkZWYgbG9uZyBpbnQJCW1wX2xpbWJfc2lnbmVkX3Q7CisjZW5kaWYKKyNlbmRpZgordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludAltcF9iaXRjbnRfdDsKKworLyogRm9yIHJlZmVyZW5jZSwgbm90ZSB0aGF0IHRoZSBuYW1lIF9fbXB6X3N0cnVjdCBnZXRzIGludG8gQysrIG1hbmdsZWQKKyAgIGZ1bmN0aW9uIG5hbWVzLCB3aGljaCBtZWFucyBhbHRob3VnaCB0aGUgIl9fIiBzdWdnZXN0cyBhbiBpbnRlcm5hbCwgd2UKKyAgIG11c3QgbGVhdmUgdGhpcyBuYW1lIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eS4gICovCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgX21wX2FsbG9jOwkJLyogTnVtYmVyIG9mICpsaW1icyogYWxsb2NhdGVkIGFuZCBwb2ludGVkCisJCQkJICAgdG8gYnkgdGhlIF9tcF9kIGZpZWxkLiAgKi8KKyAgaW50IF9tcF9zaXplOwkJCS8qIGFicyhfbXBfc2l6ZSkgaXMgdGhlIG51bWJlciBvZiBsaW1icyB0aGUKKwkJCQkgICBsYXN0IGZpZWxkIHBvaW50cyB0by4gIElmIF9tcF9zaXplIGlzCisJCQkJICAgbmVnYXRpdmUgdGhpcyBpcyBhIG5lZ2F0aXZlIG51bWJlci4gICovCisgIG1wX2xpbWJfdCAqX21wX2Q7CQkvKiBQb2ludGVyIHRvIHRoZSBsaW1icy4gICovCit9IF9fbXB6X3N0cnVjdDsKKworI2VuZGlmIC8qIF9fR05VX01QX18gKi8KKworCit0eXBlZGVmIF9fbXB6X3N0cnVjdCBNUF9JTlQ7ICAgIC8qIGdtcCAxIHNvdXJjZSBjb21wYXRpYmlsaXR5ICovCit0eXBlZGVmIF9fbXB6X3N0cnVjdCBtcHpfdFsxXTsKKwordHlwZWRlZiBtcF9saW1iX3QgKgkJbXBfcHRyOwordHlwZWRlZiBfX2dtcF9jb25zdCBtcF9saW1iX3QgKgltcF9zcmNwdHI7CisjaWYgZGVmaW5lZCAoX0NSQVkpICYmICEgZGVmaW5lZCAoX0NSQVlNUFApCisvKiBwbGFpbiBgaW50JyBpcyBtdWNoIGZhc3RlciAoNDggYml0cykgKi8KKyNkZWZpbmUgX19HTVBfTVBfU0laRV9UX0lOVCAgICAgMQordHlwZWRlZiBpbnQJCQltcF9zaXplX3Q7Cit0eXBlZGVmIGludAkJCW1wX2V4cF90OworI2Vsc2UKKyNkZWZpbmUgX19HTVBfTVBfU0laRV9UX0lOVCAgICAgMAordHlwZWRlZiBsb25nIGludAkJbXBfc2l6ZV90OwordHlwZWRlZiBsb25nIGludAkJbXBfZXhwX3Q7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgX19tcHpfc3RydWN0IF9tcF9udW07CisgIF9fbXB6X3N0cnVjdCBfbXBfZGVuOworfSBfX21wcV9zdHJ1Y3Q7CisKK3R5cGVkZWYgX19tcHFfc3RydWN0IE1QX1JBVDsgICAgLyogZ21wIDEgc291cmNlIGNvbXBhdGliaWxpdHkgKi8KK3R5cGVkZWYgX19tcHFfc3RydWN0IG1wcV90WzFdOworCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgX21wX3ByZWM7CQkJLyogTWF4IHByZWNpc2lvbiwgaW4gbnVtYmVyIG9mIGBtcF9saW1iX3Qncy4KKwkJCQkgICBTZXQgYnkgbXBmX2luaXQgYW5kIG1vZGlmaWVkIGJ5CisJCQkJICAgbXBmX3NldF9wcmVjLiAgVGhlIGFyZWEgcG9pbnRlZCB0byBieSB0aGUKKwkJCQkgICBfbXBfZCBmaWVsZCBjb250YWlucyBgcHJlYycgKyAxIGxpbWJzLiAgKi8KKyAgaW50IF9tcF9zaXplOwkJCS8qIGFicyhfbXBfc2l6ZSkgaXMgdGhlIG51bWJlciBvZiBsaW1icyB0aGUKKwkJCQkgICBsYXN0IGZpZWxkIHBvaW50cyB0by4gIElmIF9tcF9zaXplIGlzCisJCQkJICAgbmVnYXRpdmUgdGhpcyBpcyBhIG5lZ2F0aXZlIG51bWJlci4gICovCisgIG1wX2V4cF90IF9tcF9leHA7CQkvKiBFeHBvbmVudCwgaW4gdGhlIGJhc2Ugb2YgYG1wX2xpbWJfdCcuICAqLworICBtcF9saW1iX3QgKl9tcF9kOwkJLyogUG9pbnRlciB0byB0aGUgbGltYnMuICAqLworfSBfX21wZl9zdHJ1Y3Q7CisKKy8qIHR5cGVkZWYgX19tcGZfc3RydWN0IE1QX0ZMT0FUOyAqLwordHlwZWRlZiBfX21wZl9zdHJ1Y3QgbXBmX3RbMV07CisKKy8qIEF2YWlsYWJsZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gYWxnb3JpdGhtcy4gICovCit0eXBlZGVmIGVudW0KK3sKKyAgR01QX1JBTkRfQUxHX0RFRkFVTFQgPSAwLAorICBHTVBfUkFORF9BTEdfTEMgPSBHTVBfUkFORF9BTEdfREVGQVVMVCAvKiBMaW5lYXIgY29uZ3J1ZW50aWFsLiAgKi8KK30gZ21wX3JhbmRhbGdfdDsKKworLyogUmFuZG9tIHN0YXRlIHN0cnVjdC4gICovCit0eXBlZGVmIHN0cnVjdAoreworICBtcHpfdCBfbXBfc2VlZDsJICAvKiBfbXBfZCBtZW1iZXIgcG9pbnRzIHRvIHN0YXRlIG9mIHRoZSBnZW5lcmF0b3IuICovCisgIGdtcF9yYW5kYWxnX3QgX21wX2FsZzsgIC8qIEN1cnJlbnRseSB1bnVzZWQuICovCisgIHVuaW9uIHsKKyAgICB2b2lkICpfbXBfbGM7ICAgICAgICAgLyogUG9pbnRlciB0byBmdW5jdGlvbiBwb2ludGVycyBzdHJ1Y3R1cmUuICAqLworICB9IF9tcF9hbGdkYXRhOworfSBfX2dtcF9yYW5kc3RhdGVfc3RydWN0OwordHlwZWRlZiBfX2dtcF9yYW5kc3RhdGVfc3RydWN0IGdtcF9yYW5kc3RhdGVfdFsxXTsKKworLyogVHlwZXMgZm9yIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBpbiBnbXAgZmlsZXMuICAqLworLyogPz8/IFNob3VsZCBub3QgcG9sbHV0ZSB1c2VyIG5hbWUgc3BhY2Ugd2l0aCB0aGVzZSA/Pz8gKi8KK3R5cGVkZWYgX19nbXBfY29uc3QgX19tcHpfc3RydWN0ICptcHpfc3JjcHRyOwordHlwZWRlZiBfX21wel9zdHJ1Y3QgKm1wel9wdHI7Cit0eXBlZGVmIF9fZ21wX2NvbnN0IF9fbXBmX3N0cnVjdCAqbXBmX3NyY3B0cjsKK3R5cGVkZWYgX19tcGZfc3RydWN0ICptcGZfcHRyOwordHlwZWRlZiBfX2dtcF9jb25zdCBfX21wcV9zdHJ1Y3QgKm1wcV9zcmNwdHI7Cit0eXBlZGVmIF9fbXBxX3N0cnVjdCAqbXBxX3B0cjsKKworCisvKiBUaGlzIGlzIG5vdCB3YW50ZWQgaW4gbXAuaCwgc28gcHV0IGl0IG91dHNpZGUgdGhlIF9fR05VX01QX18gY29tbW9uCisgICBzZWN0aW9uLiAqLworI2lmIF9fR01QX0xJQkdNUF9ETEwKKyNpZiBfX0dNUF9XSVRISU5fR01QWFgKKy8qIGNvbXBpbGluZyB0byBnbyBpbnRvIGEgRExMIGxpYmdtcHh4ICovCisjZGVmaW5lIF9fR01QX0RFQ0xTUEVDX1hYICBfX0dNUF9ERUNMU1BFQ19FWFBPUlQKKyNlbHNlCisvKiBjb21waWxpbmcgdG8gZ28gaW50byBhIGFwcGxpY2F0aW9uIHdoaWNoIHdpbGwgbGluayB0byBhIERMTCBsaWJnbXB4eCAqLworI2RlZmluZSBfX0dNUF9ERUNMU1BFQ19YWCAgX19HTVBfREVDTFNQRUNfSU1QT1JUCisjZW5kaWYKKyNlbHNlCisvKiBhbGwgb3RoZXIgY2FzZXMgKi8KKyNkZWZpbmUgX19HTVBfREVDTFNQRUNfWFgKKyNlbmRpZgorCisKKyNpZiBfX0dNUF9IQVZFX1BST1RPVFlQRVMKKyNkZWZpbmUgX19HTVBfUFJPVE8oeCkgeAorI2Vsc2UKKyNkZWZpbmUgX19HTVBfUFJPVE8oeCkgKCkKKyNlbmRpZgorCisjaWZuZGVmIF9fTVBOCisjaWYgX19HTVBfSEFWRV9UT0tFTl9QQVNURQorI2RlZmluZSBfX01QTih4KSBfX2dtcG5fIyN4CisjZWxzZQorI2RlZmluZSBfX01QTih4KSBfX2dtcG5fLyoqL3gKKyNlbmRpZgorI2VuZGlmCisKKy8qIEZvciByZWZlcmVuY2UsICJkZWZpbmVkKEVPRikiIGNhbm5vdCBiZSB1c2VkIGhlcmUuICBJbiBnKysgMi45NS40LAorICAgPGlvc3RyZWFtPiBkZWZpbmVzIEVPRiBidXQgbm90IEZJTEUuICAqLworI2lmIGRlZmluZWQgKEZJTEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoSF9TVERJTykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9IX1NURElPKSAgICAgICAgICAgICAgIC8qIEFJWCAqLyAgICAgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfU1RESU9fSCkgICAgICAgICAgICAgICAvKiBnbGliYywgU3VuLCBTQ08gKi8gICAgIFwKKyAgfHwgZGVmaW5lZCAoX1NURElPX0hfKSAgICAgICAgICAgICAgLyogQlNELCBPU0YgKi8gICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9fU1RESU9fSCkgICAgICAgICAgICAgIC8qIEJvcmxhbmQgKi8gICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfX1NURElPX0hfXykgICAgICAgICAgICAvKiBJUklYICovICAgICAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX1NURElPX0lOQ0xVREVEKSAgICAgICAgLyogSFBVWCAqLyAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9fZGpfaW5jbHVkZV9zdGRpb19oXykgIC8qIERKR1BQICovICAgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfRklMRV9ERUZJTkVEKSAgICAgICAgICAvKiBNaWNyb3NvZnQgKi8gICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX19TVERJT19fKSAgICAgICAgICAgICAgLyogQXBwbGUgTVBXIE1yQyAqLyAgICAgICBcCisgIHx8IGRlZmluZWQgKF9NU0xfU1RESU9fSCkgICAgICAgICAgIC8qIE1ldHJvd2Vya3MgKi8gICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfU1RESU9fSF9JTkNMVURFRCkgICAgICAvKiBRTlg0ICovCQlcCisgIHx8IGRlZmluZWQgKF9JU09fU1RESU9fSVNPX0gpICAgICAgIC8qIFN1biBDKysgKi8JCVwKKyAgfHwgZGVmaW5lZCAoX19TVERJT19MT0FERUQpICAgICAgICAgLyogVk1TICovCisjZGVmaW5lIF9HTVBfSF9IQVZFX0ZJTEUgMQorI2VuZGlmCisKKy8qIEluIElTTyBDLCBpZiBhIHByb3RvdHlwZSBpbnZvbHZpbmcgInN0cnVjdCBvYnN0YWNrICoiIGlzIGdpdmVuIHdpdGhvdXQKKyAgIHRoYXQgc3RydWN0dXJlIGRlZmluZWQsIHRoZW4gdGhlIHN0cnVjdCBpcyBzY29wZWQgZG93biB0byBqdXN0IHRoZQorICAgcHJvdG90eXBlLCBjYXVzaW5nIGEgY29uZmxpY3QgaWYgaXQncyBzdWJzZXF1ZW50bHkgZGVmaW5lZCBmb3IgcmVhbC4gIFNvCisgICBvbmx5IGdpdmUgcHJvdG90eXBlcyBpZiB3ZSd2ZSBnb3Qgb2JzdGFjay5oLiAgKi8KKyNpZiBkZWZpbmVkIChfT0JTVEFDS19IKSAgIC8qIGdsaWJjIDxvYnN0YWNrLmg+ICovCisjZGVmaW5lIF9HTVBfSF9IQVZFX09CU1RBQ0sgMQorI2VuZGlmCisKKy8qIFRoZSBwcm90b3R5cGVzIGZvciBnbXBfdnByaW50ZiBldGMgYXJlIHByb3ZpZGVkIG9ubHkgaWYgdmFfbGlzdCBpcworICAgYXZhaWxhYmxlLCB2aWEgYW4gYXBwbGljYXRpb24gaGF2aW5nIGluY2x1ZGVkIDxzdGRhcmcuaD4gb3IgPHZhcmFyZ3MuaD4uCisgICBVc3VhbGx5IHZhX2xpc3QgaXMgYSB0eXBlZGVmIHNvIGNhbid0IGJlIHRlc3RlZCBkaXJlY3RseSwgYnV0IEM5OQorICAgc3BlY2lmaWVzIHRoYXQgdmFfc3RhcnQgaXMgYSBtYWNybyAoYW5kIGl0IHdhcyBub3JtYWxseSBhIG1hY3JvIG9uIHBhc3QKKyAgIHN5c3RlbXMgdG9vKSwgc28gbG9vayBmb3IgdGhhdC4KKworICAgPHN0ZGlvLmg+IHdpbGwgZGVmaW5lIHNvbWUgc29ydCBvZiB2YV9saXN0IGZvciB2cHJpbnRmIGFuZCB2ZnByaW50ZiwgYnV0CisgICBsZXQncyBub3QgYm90aGVyIHRyeWluZyB0byB1c2UgdGhhdCBzaW5jZSBpdCdzIG5vdCBzdGFuZGFyZCBhbmQgc2luY2UKKyAgIGFwcGxpY2F0aW9uIHVzZXMgZm9yIGdtcF92cHJpbnRmIGV0YyB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgcmVxdWlyZSB0aGUKKyAgIHdob2xlIDxzdGRhcmcuaD4gb3IgPHZhcmFyZ3MuaD4gYW55d2F5LiAgKi8KKworI2lmZGVmIHZhX3N0YXJ0CisjZGVmaW5lIF9HTVBfSF9IQVZFX1ZBX0xJU1QgMQorI2VuZGlmCisKKy8qIFRlc3QgZm9yIGdjYyA+PSBtYWoubWluLCBhcyBwZXIgX19HTlVDX1BSRVJFUSBpbiBnbGliYyAqLworI2lmIGRlZmluZWQgKF9fR05VQ19fKSAmJiBkZWZpbmVkIChfX0dOVUNfTUlOT1JfXykKKyNkZWZpbmUgX19HTVBfR05VQ19QUkVSRVEobWFqLCBtaW4pIFwKKyAgKChfX0dOVUNfXyA8PCAxNikgKyBfX0dOVUNfTUlOT1JfXyA+PSAoKG1haikgPDwgMTYpICsgKG1pbikpCisjZWxzZQorI2RlZmluZSBfX0dNUF9HTlVDX1BSRVJFUShtYWosIG1pbikgIDAKKyNlbmRpZgorCisvKiAicHVyZSIgaXMgaW4gZ2NjIDIuOTYgYW5kIHVwLCBzZWUgIihnY2MpRnVuY3Rpb24gQXR0cmlidXRlcyIuICBCYXNpY2FsbHkKKyAgIGl0IG1lYW5zIGEgZnVuY3Rpb24gZG9lcyBub3RoaW5nIGJ1dCBleGFtaW5lIGl0cyBhcmd1bWVudHMgYW5kIG1lbW9yeQorICAgKGdsb2JhbCBvciB2aWEgYXJndW1lbnRzKSB0byBnZW5lcmF0ZSBhIHJldHVybiB2YWx1ZSwgYnV0IGNoYW5nZXMgbm90aGluZworICAgYW5kIGhhcyBubyBzaWRlLWVmZmVjdHMuICBfX0dNUF9OT19BVFRSSUJVVEVfQ09OU1RfUFVSRSBsZXRzCisgICB0dW5lL2NvbW1vbi5jIGV0YyB0dXJuIHRoaXMgb2ZmIHdoZW4gdHJ5aW5nIHRvIHdyaXRlIHRpbWluZyBsb29wcy4gICovCisjaWYgX19HTVBfR05VQ19QUkVSRVEgKDIsOTYpICYmICEgZGVmaW5lZCAoX19HTVBfTk9fQVRUUklCVVRFX0NPTlNUX1BVUkUpCisjZGVmaW5lIF9fR01QX0FUVFJJQlVURV9QVVJFICAgX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSkKKyNlbHNlCisjZGVmaW5lIF9fR01QX0FUVFJJQlVURV9QVVJFCisjZW5kaWYKKworCisvKiBfX0dNUF9DQVNUIGFsbG93cyB1cyB0byB1c2Ugc3RhdGljX2Nhc3QgaW4gQysrLCBzbyBvdXIgbWFjcm9zIGFyZSBjbGVhbgorICAgdG8gImcrKyAtV29sZC1zdHlsZS1jYXN0Ii4KKworICAgQ2FzdHMgaW4gImV4dGVybiBpbmxpbmUiIGNvZGUgd2l0aGluIGFuIGV4dGVybiAiQyIgYmxvY2sgZG9uJ3QgaW5kdWNlCisgICB0aGVzZSB3YXJuaW5ncywgc28gX19HTVBfQ0FTVCBvbmx5IG5lZWRzIHRvIGJlIHVzZWQgb24gZG9jdW1lbnRlZAorICAgbWFjcm9zLiAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIF9fR01QX0NBU1QodHlwZSwgZXhwcikgIChzdGF0aWNfY2FzdDx0eXBlPiAoZXhwcikpCisjZWxzZQorI2RlZmluZSBfX0dNUF9DQVNUKHR5cGUsIGV4cHIpICAoKHR5cGUpIChleHByKSkKKyNlbmRpZgorCisKKy8qIEFuIGVtcHR5ICJ0aHJvdyAoKSIgbWVhbnMgdGhlIGZ1bmN0aW9uIGRvZXNuJ3QgdGhyb3cgYW55IEMrKyBleGNlcHRpb25zLAorICAgdGhpcyBjYW4gc2F2ZSBzb21lIHN0YWNrIGZyYW1lIGluZm8gaW4gYXBwbGljYXRpb25zLgorCisgICBDdXJyZW50bHkgaXQncyBnaXZlbiBvbmx5IG9uIGZ1bmN0aW9ucyB3aGljaCBuZXZlciBkaXZpZGUtYnktemVybyBldGMsCisgICBkb24ndCBhbGxvY2F0ZSBtZW1vcnksIGFuZCBhcmUgZXhwZWN0ZWQgdG8gbmV2ZXIgbmVlZCB0byBhbGxvY2F0ZSBtZW1vcnkuCisgICBUaGlzIGxlYXZlcyBvcGVuIHRoZSBwb3NzaWJpbGl0eSBvZiBhIEMrKyB0aHJvdyBmcm9tIGEgZnV0dXJlIEdNUAorICAgZXhjZXB0aW9ucyBzY2hlbWUuCisKKyAgIG1wel9zZXRfdWkgZXRjIGFyZSBvbWl0dGVkIHRvIGxlYXZlIG9wZW4gdGhlIGxhenkgYWxsb2NhdGlvbiBzY2hlbWUKKyAgIGRlc2NyaWJlZCBpbiBkb2MvdGFza3MuaHRtbC4gIG1wel9nZXRfZCBldGMgYXJlIG9taXR0ZWQgdG8gbGVhdmUgb3BlbgorICAgZXhjZXB0aW9ucyBmb3IgZmxvYXQgb3ZlcmZsb3dzLgorCisgICBOb3RlIHRoYXQgX19HTVBfTk9USFJPVyBtdXN0IGJlIGdpdmVuIG9uIGFueSBpbmxpbmVzIHRoZSBzYW1lIGFzIG9uIHRoZWlyCisgICBwcm90b3R5cGVzIChmb3IgZysrIGF0IGxlYXN0LCB3aGVyZSB0aGV5J3JlIHVzZWQgdG9nZXRoZXIpLiAgTm90ZSBhbHNvCisgICB0aGF0IGcrKyAzLjAgZGVtYW5kcyB0aGF0IF9fR01QX05PVEhST1cgaXMgYmVmb3JlIG90aGVyIGF0dHJpYnV0ZXMgbGlrZQorICAgX19HTVBfQVRUUklCVVRFX1BVUkUuICAqLworCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCisjZGVmaW5lIF9fR01QX05PVEhST1cgIHRocm93ICgpCisjZWxzZQorI2RlZmluZSBfX0dNUF9OT1RIUk9XCisjZW5kaWYKKworCisvKiBQT1JUTUU6IFdoYXQgb3RoZXIgY29tcGlsZXJzIGhhdmUgYSB1c2VmdWwgImV4dGVybiBpbmxpbmUiPyAgInN0YXRpYworICAgaW5saW5lIiB3b3VsZCBiZSBhbiBhY2NlcHRhYmxlIHN1YnN0aXR1dGUgaWYgdGhlIGNvbXBpbGVyIChvciBsaW5rZXIpCisgICBkaXNjYXJkcyB1bnVzZWQgc3RhdGljcy4gICovCisKKyAvKiBnY2MgaGFzIF9faW5saW5lX18gaW4gYWxsIG1vZGVzLCBpbmNsdWRpbmcgc3RyaWN0IGFuc2kuICBHaXZlIGEgcHJvdG90eXBlCisgICAgZm9yIGFuIGlubGluZSB0b28sIHNvIGFzIHRvIGNvcnJlY3RseSBzcGVjaWZ5ICJkbGxpbXBvcnQiIG9uIHdpbmRvd3MsIGluCisgICAgY2FzZSB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIHJhdGhlciB0aGFuIGlubGluZWQuCisgICAgR0NDIDQuMyBhbmQgYWJvdmUgd2l0aCAtc3RkPWM5OSBvciAtc3RkPWdudTk5IGltcGxlbWVudHMgSVNPIEM5OQorICAgIGlubGluZSBzZW1hbnRpY3MsIHVubGVzcyAtZmdudTg5LWlubGluZSBpcyB1c2VkLiAgKi8KKyNpZmRlZiBfX0dOVUNfXworI2lmIChkZWZpbmVkIF9fR05VQ19TVERDX0lOTElORV9fKSB8fCAoX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA9PSAyKQorI2RlZmluZSBfX0dNUF9FWFRFUk5fSU5MSU5FIGV4dGVybiBfX2lubGluZV9fIF9fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXykpCisjZWxzZQorI2RlZmluZSBfX0dNUF9FWFRFUk5fSU5MSU5FICAgICAgZXh0ZXJuIF9faW5saW5lX18KKyNlbmRpZgorI2RlZmluZSBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyAgMQorI2VuZGlmCisKKy8qIERFQyBDIChlZy4gdmVyc2lvbiA1LjkpIHN1cHBvcnRzICJzdGF0aWMgX19pbmxpbmUgZm9vKCkiLCBldmVuIGluIC1zdGQxCisgICBzdHJpY3QgQU5TSSBtb2RlLiAgSW5saW5pbmcgaXMgZG9uZSBldmVuIHdoZW4gbm90IG9wdGltaXppbmcgKGllLiAtTzAKKyAgIG1vZGUsIHdoaWNoIGlzIHRoZSBkZWZhdWx0KSwgYnV0IGFuIHVubmVjZXNzYXJ5IGxvY2FsIGNvcHkgb2YgZm9vIGlzCisgICBlbWl0dGVkIHVubGVzcyAtTyBpcyB1c2VkLiAgImV4dGVybiBfX2lubGluZSIgaXMgYWNjZXB0ZWQsIGJ1dCB0aGUKKyAgICJleHRlcm4iIGFwcGVhcnMgdG8gYmUgaWdub3JlZCwgaWUuIGl0IGJlY29tZXMgYSBwbGFpbiBnbG9iYWwgZnVuY3Rpb24KKyAgIGJ1dCB3aGljaCBpcyBpbmxpbmVkIHdpdGhpbiBpdHMgZmlsZS4gIERvbid0IGtub3cgaWYgYWxsIG9sZCB2ZXJzaW9ucyBvZgorICAgREVDIEMgc3VwcG9ydGVkIF9faW5saW5lLCBidXQgYXMgYSBzdGFydCBsZXQncyBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yCisgICBjdXJyZW50IHZlcnNpb25zLiAgKi8KKyNpZmRlZiBfX0RFQ0MKKyNkZWZpbmUgX19HTVBfRVhURVJOX0lOTElORSAgc3RhdGljIF9faW5saW5lCisjZW5kaWYKKworLyogU0NPIE9wZW5VTklYIDggY2Mgc3VwcG9ydHMgInN0YXRpYyBpbmxpbmUgZm9vKCkiIGJ1dCBub3QgaW4gLVhjIHN0cmljdAorICAgQU5TSSBtb2RlIChfX1NURENfXyBpcyAxIGluIHRoYXQgbW9kZSkuICBJbmxpbmluZyBvbmx5IGFjdHVhbGx5IHRha2VzCisgICBwbGFjZSB1bmRlciAtTy4gIFdpdGhvdXQgLU8gImZvbyIgc2VlbXMgdG8gYmUgZW1pdHRlZCB3aGV0aGVyIGl0J3MgdXNlZAorICAgb3Igbm90LCB3aGljaCBpcyB3YXN0ZWZ1bC4gICJleHRlcm4gaW5saW5lIGZvbygpIiBpc24ndCB1c2VmdWwsIHRoZQorICAgImV4dGVybiIgaXMgYXBwYXJlbnRseSBpZ25vcmVkLCBzbyBmb28gaXMgaW5saW5lZCBpZiBwb3NzaWJsZSBidXQgYWxzbworICAgZW1pdHRlZCBhcyBhIGdsb2JhbCwgd2hpY2ggY2F1c2VzIG11bHRpcGxlIGRlZmluaXRpb24gZXJyb3JzIHdoZW4KKyAgIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYmdtcC4gICovCisjaWZkZWYgX19TQ09fVkVSU0lPTl9fCisjaWYgX19TQ09fVkVSU0lPTl9fID4gNDAwMDAwMDAwICYmIF9fU1REQ19fICE9IDEgXAorICAmJiAhIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpCisjZGVmaW5lIF9fR01QX0VYVEVSTl9JTkxJTkUgIHN0YXRpYyBpbmxpbmUKKyNlbmRpZgorI2VuZGlmCisKKy8qIE1pY3Jvc29mdCdzIEMgY29tcGlsZXIgYWNjZXB0cyBfX2lubGluZSAqLworI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIF9fR01QX0VYVEVSTl9JTkxJTkUgIF9faW5saW5lCisjZW5kaWYKKworLyogUmVjZW50IGVub3VnaCBTdW4gQyBjb21waWxlcnMgd2FudCAiaW5saW5lIiAqLworI2lmIGRlZmluZWQgKF9fU1VOUFJPX0MpICYmIF9fU1VOUFJPX0MgPj0gMHg1NjAgXAorICAmJiAhIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpCisjZGVmaW5lIF9fR01QX0VYVEVSTl9JTkxJTkUgIGlubGluZQorI2VuZGlmCisKKy8qIFNvbWV3aGF0IG9sZGVyIFN1biBDIGNvbXBpbGVycyB3YW50ICJzdGF0aWMgaW5saW5lIiAqLworI2lmIGRlZmluZWQgKF9fU1VOUFJPX0MpICYmIF9fU1VOUFJPX0MgPj0gMHg1NDAgXAorICAmJiAhIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpCisjZGVmaW5lIF9fR01QX0VYVEVSTl9JTkxJTkUgIHN0YXRpYyBpbmxpbmUKKyNlbmRpZgorCisKKy8qIEMrKyBhbHdheXMgaGFzICJpbmxpbmUiIGFuZCBzaW5jZSBpdCdzIGEgbm9ybWFsIGZlYXR1cmUgdGhlIGxpbmtlciBzaG91bGQKKyAgIGRpc2NhcmQgZHVwbGljYXRlIG5vbi1pbmxpbmVkIGNvcGllcywgb3IgaWYgaXQgZG9lc24ndCB0aGVuIHRoYXQncyBhCisgICBwcm9ibGVtIGZvciBldmVyeW9uZSwgbm90IGp1c3QgR01QLiAgKi8KKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykgJiYgISBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKQorI2RlZmluZSBfX0dNUF9FWFRFUk5fSU5MSU5FICBpbmxpbmUKKyNlbmRpZgorCisvKiBEb24ndCBkbyBhbnkgaW5saW5pbmcgd2l0aGluIGEgY29uZmlndXJlIHJ1biwgc2luY2UgaWYgdGhlIGNvbXBpbGVyIGVuZHMKKyAgIHVwIGVtaXR0aW5nIGNvcGllcyBvZiB0aGUgY29kZSBpbnRvIHRoZSBvYmplY3QgZmlsZSBpdCBjYW4gZW5kIHVwCisgICBkZW1hbmRpbmcgdGhlIHZhcmlvdXMgc3VwcG9ydCByb3V0aW5lcyAobGlrZSBtcG5fcG9wY291bnQpIGZvciBsaW5raW5nLAorICAgbWFraW5nIHRoZSAiYWxsb2NhIiB0ZXN0IGFuZCBwZXJoYXBzIG90aGVycyBmYWlsLiAgQW5kIG9uIGhwcGEgaWE2NCBhCisgICBwcmUtcmVsZWFzZSBnY2MgMy4yIHdhcyBzZWVuIG5vdCByZXNwZWN0aW5nIHRoZSAiZXh0ZXJuIiBpbiAiZXh0ZXJuCisgICBfX2lubGluZV9fIiwgdHJpZ2dlcmluZyB0aGlzIHByb2JsZW0gdG9vLiAgKi8KKyNpZiBkZWZpbmVkIChfX0dNUF9XSVRISU5fQ09ORklHVVJFKSAmJiAhIF9fR01QX1dJVEhJTl9DT05GSUdVUkVfSU5MSU5FCisjdW5kZWYgX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCisKKy8qIEJ5IGRlZmF1bHQsIGRvbid0IGdpdmUgYSBwcm90b3R5cGUgd2hlbiB0aGVyZSdzIGdvaW5nIHRvIGJlIGFuIGlubGluZQorICAgdmVyc2lvbi4gIE5vdGUgaW4gcGFydGljdWxhciB0aGF0IENyYXkgQysrIG9iamVjdHMgdG8gdGhlIGNvbWJpbmF0aW9uIG9mCisgICBwcm90b3R5cGUgYW5kIGlubGluZS4gICovCisjaWZkZWYgX19HTVBfRVhURVJOX0lOTElORQorI2lmbmRlZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUworI2RlZmluZSBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyAgMAorI2VuZGlmCisjZWxzZQorI2RlZmluZSBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyAgMQorI2VuZGlmCisKKworI2RlZmluZSBfX0dNUF9BQlMoeCkgICAoKHgpID49IDAgPyAoeCkgOiAtKHgpKQorI2RlZmluZSBfX0dNUF9NQVgoaCxpKSAoKGgpID4gKGkpID8gKGgpIDogKGkpKQorCisvKiBfX0dNUF9VU0hSVF9NQVggaXMgbm90ICJ+ICh1bnNpZ25lZCBzaG9ydCkgMCIgYmVjYXVzZSBzaG9ydCBpcyBwcm9tb3RlZAorICAgdG8gaW50IGJ5ICJ+Ii4gICovCisjZGVmaW5lIF9fR01QX1VJTlRfTUFYICAgKH4gKHVuc2lnbmVkKSAwKQorI2RlZmluZSBfX0dNUF9VTE9OR19NQVggICh+ICh1bnNpZ25lZCBsb25nKSAwKQorI2RlZmluZSBfX0dNUF9VU0hSVF9NQVggICgodW5zaWduZWQgc2hvcnQpIH4wKQorCisKKy8qIF9fYnVpbHRpbl9leHBlY3QgaXMgaW4gZ2NjIDMuMCwgYW5kIG5vdCBpbiAyLjk1LiAqLworI2lmIF9fR01QX0dOVUNfUFJFUkVRICgzLDApCisjZGVmaW5lIF9fR01QX0xJS0VMWShjb25kKSAgICBfX2J1aWx0aW5fZXhwZWN0ICgoY29uZCkgIT0gMCwgMSkKKyNkZWZpbmUgX19HTVBfVU5MSUtFTFkoY29uZCkgIF9fYnVpbHRpbl9leHBlY3QgKChjb25kKSAhPSAwLCAwKQorI2Vsc2UKKyNkZWZpbmUgX19HTVBfTElLRUxZKGNvbmQpICAgIChjb25kKQorI2RlZmluZSBfX0dNUF9VTkxJS0VMWShjb25kKSAgKGNvbmQpCisjZW5kaWYKKworI2lmZGVmIF9DUkFZCisjZGVmaW5lIF9fR01QX0NSQVlfUHJhZ21hKHN0cikgIF9QcmFnbWEgKHN0cikKKyNlbHNlCisjZGVmaW5lIF9fR01QX0NSQVlfUHJhZ21hKHN0cikKKyNlbmRpZgorCisKKy8qIEFsbG93IGRpcmVjdCB1c2VyIGFjY2VzcyB0byBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yIG9mIGEgbXBxX3Qgb2JqZWN0LiAgKi8KKyNkZWZpbmUgbXBxX251bXJlZihRKSAoJigoUSktPl9tcF9udW0pKQorI2RlZmluZSBtcHFfZGVucmVmKFEpICgmKChRKS0+X21wX2RlbikpCisKKworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7Cit1c2luZyBzdGQ6OkZJTEU7CisjZW5kaWYKKworI2RlZmluZSBtcF9zZXRfbWVtb3J5X2Z1bmN0aW9ucyBfX2dtcF9zZXRfbWVtb3J5X2Z1bmN0aW9ucworX19HTVBfREVDTFNQRUMgdm9pZCBtcF9zZXRfbWVtb3J5X2Z1bmN0aW9ucyBfX0dNUF9QUk9UTyAoKHZvaWQgKigqKSAoc2l6ZV90KSwKKwkJCQkgICAgICB2b2lkICooKikgKHZvaWQgKiwgc2l6ZV90LCBzaXplX3QpLAorCQkJCSAgICAgIHZvaWQgKCopICh2b2lkICosIHNpemVfdCkpKSBfX0dNUF9OT1RIUk9XOworCisjZGVmaW5lIG1wX2dldF9tZW1vcnlfZnVuY3Rpb25zIF9fZ21wX2dldF9tZW1vcnlfZnVuY3Rpb25zCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wX2dldF9tZW1vcnlfZnVuY3Rpb25zIF9fR01QX1BST1RPICgodm9pZCAqKCoqKSAoc2l6ZV90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKCoqKSAodm9pZCAqLCBzaXplX3QsIHNpemVfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCoqKSAodm9pZCAqLCBzaXplX3QpKSkgX19HTVBfTk9USFJPVzsKKworI2RlZmluZSBtcF9iaXRzX3Blcl9saW1iIF9fZ21wX2JpdHNfcGVyX2xpbWIKK19fR01QX0RFQ0xTUEVDIGV4dGVybiBfX2dtcF9jb25zdCBpbnQgbXBfYml0c19wZXJfbGltYjsKKworI2RlZmluZSBnbXBfZXJybm8gX19nbXBfZXJybm8KK19fR01QX0RFQ0xTUEVDIGV4dGVybiBpbnQgZ21wX2Vycm5vOworCisjZGVmaW5lIGdtcF92ZXJzaW9uIF9fZ21wX3ZlcnNpb24KK19fR01QX0RFQ0xTUEVDIGV4dGVybiBfX2dtcF9jb25zdCBjaGFyICogX19nbXBfY29uc3QgZ21wX3ZlcnNpb247CisKKworLyoqKioqKioqKioqKioqKiogUmFuZG9tIG51bWJlciByb3V0aW5lcy4gICoqKioqKioqKioqKioqKiovCisKKy8qIG9ic29sZXRlICovCisjZGVmaW5lIGdtcF9yYW5kaW5pdCBfX2dtcF9yYW5kaW5pdAorX19HTVBfREVDTFNQRUMgdm9pZCBnbXBfcmFuZGluaXQgX19HTVBfUFJPVE8gKChnbXBfcmFuZHN0YXRlX3QsIGdtcF9yYW5kYWxnX3QsIC4uLikpOworCisjZGVmaW5lIGdtcF9yYW5kaW5pdF9kZWZhdWx0IF9fZ21wX3JhbmRpbml0X2RlZmF1bHQKK19fR01QX0RFQ0xTUEVDIHZvaWQgZ21wX3JhbmRpbml0X2RlZmF1bHQgX19HTVBfUFJPVE8gKChnbXBfcmFuZHN0YXRlX3QpKTsKKworI2RlZmluZSBnbXBfcmFuZGluaXRfbGNfMmV4cCBfX2dtcF9yYW5kaW5pdF9sY18yZXhwCitfX0dNUF9ERUNMU1BFQyB2b2lkIGdtcF9yYW5kaW5pdF9sY18yZXhwIF9fR01QX1BST1RPICgoZ21wX3JhbmRzdGF0ZV90LAorCQkJCQkJICAgICAgIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50LAorCQkJCQkJICAgICAgIG1wX2JpdGNudF90KSk7CisKKyNkZWZpbmUgZ21wX3JhbmRpbml0X2xjXzJleHBfc2l6ZSBfX2dtcF9yYW5kaW5pdF9sY18yZXhwX3NpemUKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfcmFuZGluaXRfbGNfMmV4cF9zaXplIF9fR01QX1BST1RPICgoZ21wX3JhbmRzdGF0ZV90LCBtcF9iaXRjbnRfdCkpOworCisjZGVmaW5lIGdtcF9yYW5kaW5pdF9tdCBfX2dtcF9yYW5kaW5pdF9tdAorX19HTVBfREVDTFNQRUMgdm9pZCBnbXBfcmFuZGluaXRfbXQgX19HTVBfUFJPVE8gKChnbXBfcmFuZHN0YXRlX3QpKTsKKworI2RlZmluZSBnbXBfcmFuZGluaXRfc2V0IF9fZ21wX3JhbmRpbml0X3NldAorX19HTVBfREVDTFNQRUMgdm9pZCBnbXBfcmFuZGluaXRfc2V0IF9fR01QX1BST1RPICgoZ21wX3JhbmRzdGF0ZV90LCBfX2dtcF9jb25zdCBfX2dtcF9yYW5kc3RhdGVfc3RydWN0ICopKTsKKworI2RlZmluZSBnbXBfcmFuZHNlZWQgX19nbXBfcmFuZHNlZWQKK19fR01QX0RFQ0xTUEVDIHZvaWQgZ21wX3JhbmRzZWVkIF9fR01QX1BST1RPICgoZ21wX3JhbmRzdGF0ZV90LCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgZ21wX3JhbmRzZWVkX3VpIF9fZ21wX3JhbmRzZWVkX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIGdtcF9yYW5kc2VlZF91aSBfX0dNUF9QUk9UTyAoKGdtcF9yYW5kc3RhdGVfdCwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBnbXBfcmFuZGNsZWFyIF9fZ21wX3JhbmRjbGVhcgorX19HTVBfREVDTFNQRUMgdm9pZCBnbXBfcmFuZGNsZWFyIF9fR01QX1BST1RPICgoZ21wX3JhbmRzdGF0ZV90KSk7CisKKyNkZWZpbmUgZ21wX3VyYW5kb21iX3VpIF9fZ21wX3VyYW5kb21iX3VpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGdtcF91cmFuZG9tYl91aSBfX0dNUF9QUk9UTyAoKGdtcF9yYW5kc3RhdGVfdCwgdW5zaWduZWQgbG9uZykpOworCisjZGVmaW5lIGdtcF91cmFuZG9tbV91aSBfX2dtcF91cmFuZG9tbV91aQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBnbXBfdXJhbmRvbW1fdWkgX19HTVBfUFJPVE8gKChnbXBfcmFuZHN0YXRlX3QsIHVuc2lnbmVkIGxvbmcpKTsKKworCisvKioqKioqKioqKioqKioqKiBGb3JtYXR0ZWQgb3V0cHV0IHJvdXRpbmVzLiAgKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBnbXBfYXNwcmludGYgX19nbXBfYXNwcmludGYKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfYXNwcmludGYgX19HTVBfUFJPVE8gKChjaGFyICoqLCBfX2dtcF9jb25zdCBjaGFyICosIC4uLikpOworCisjZGVmaW5lIGdtcF9mcHJpbnRmIF9fZ21wX2ZwcmludGYKKyNpZmRlZiBfR01QX0hfSEFWRV9GSUxFCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX2ZwcmludGYgX19HTVBfUFJPVE8gKChGSUxFICosIF9fZ21wX2NvbnN0IGNoYXIgKiwgLi4uKSk7CisjZW5kaWYKKworI2RlZmluZSBnbXBfb2JzdGFja19wcmludGYgX19nbXBfb2JzdGFja19wcmludGYKKyNpZiBkZWZpbmVkIChfR01QX0hfSEFWRV9PQlNUQUNLKQorX19HTVBfREVDTFNQRUMgaW50IGdtcF9vYnN0YWNrX3ByaW50ZiBfX0dNUF9QUk9UTyAoKHN0cnVjdCBvYnN0YWNrICosIF9fZ21wX2NvbnN0IGNoYXIgKiwgLi4uKSk7CisjZW5kaWYKKworI2RlZmluZSBnbXBfb2JzdGFja192cHJpbnRmIF9fZ21wX29ic3RhY2tfdnByaW50ZgorI2lmIGRlZmluZWQgKF9HTVBfSF9IQVZFX09CU1RBQ0spICYmIGRlZmluZWQgKF9HTVBfSF9IQVZFX1ZBX0xJU1QpCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX29ic3RhY2tfdnByaW50ZiBfX0dNUF9QUk9UTyAoKHN0cnVjdCBvYnN0YWNrICosIF9fZ21wX2NvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOworI2VuZGlmCisKKyNkZWZpbmUgZ21wX3ByaW50ZiBfX2dtcF9wcmludGYKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfcHJpbnRmIF9fR01QX1BST1RPICgoX19nbXBfY29uc3QgY2hhciAqLCAuLi4pKTsKKworI2RlZmluZSBnbXBfc25wcmludGYgX19nbXBfc25wcmludGYKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfc25wcmludGYgX19HTVBfUFJPVE8gKChjaGFyICosIHNpemVfdCwgX19nbXBfY29uc3QgY2hhciAqLCAuLi4pKTsKKworI2RlZmluZSBnbXBfc3ByaW50ZiBfX2dtcF9zcHJpbnRmCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX3NwcmludGYgX19HTVBfUFJPVE8gKChjaGFyICosIF9fZ21wX2NvbnN0IGNoYXIgKiwgLi4uKSk7CisKKyNkZWZpbmUgZ21wX3Zhc3ByaW50ZiBfX2dtcF92YXNwcmludGYKKyNpZiBkZWZpbmVkIChfR01QX0hfSEFWRV9WQV9MSVNUKQorX19HTVBfREVDTFNQRUMgaW50IGdtcF92YXNwcmludGYgX19HTVBfUFJPVE8gKChjaGFyICoqLCBfX2dtcF9jb25zdCBjaGFyICosIHZhX2xpc3QpKTsKKyNlbmRpZgorCisjZGVmaW5lIGdtcF92ZnByaW50ZiBfX2dtcF92ZnByaW50ZgorI2lmIGRlZmluZWQgKF9HTVBfSF9IQVZFX0ZJTEUpICYmIGRlZmluZWQgKF9HTVBfSF9IQVZFX1ZBX0xJU1QpCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX3ZmcHJpbnRmIF9fR01QX1BST1RPICgoRklMRSAqLCBfX2dtcF9jb25zdCBjaGFyICosIHZhX2xpc3QpKTsKKyNlbmRpZgorCisjZGVmaW5lIGdtcF92cHJpbnRmIF9fZ21wX3ZwcmludGYKKyNpZiBkZWZpbmVkIChfR01QX0hfSEFWRV9WQV9MSVNUKQorX19HTVBfREVDTFNQRUMgaW50IGdtcF92cHJpbnRmIF9fR01QX1BST1RPICgoX19nbXBfY29uc3QgY2hhciAqLCB2YV9saXN0KSk7CisjZW5kaWYKKworI2RlZmluZSBnbXBfdnNucHJpbnRmIF9fZ21wX3ZzbnByaW50ZgorI2lmIGRlZmluZWQgKF9HTVBfSF9IQVZFX1ZBX0xJU1QpCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX3ZzbnByaW50ZiBfX0dNUF9QUk9UTyAoKGNoYXIgKiwgc2l6ZV90LCBfX2dtcF9jb25zdCBjaGFyICosIHZhX2xpc3QpKTsKKyNlbmRpZgorCisjZGVmaW5lIGdtcF92c3ByaW50ZiBfX2dtcF92c3ByaW50ZgorI2lmIGRlZmluZWQgKF9HTVBfSF9IQVZFX1ZBX0xJU1QpCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX3ZzcHJpbnRmIF9fR01QX1BST1RPICgoY2hhciAqLCBfX2dtcF9jb25zdCBjaGFyICosIHZhX2xpc3QpKTsKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqIEZvcm1hdHRlZCBpbnB1dCByb3V0aW5lcy4gICoqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgZ21wX2ZzY2FuZiBfX2dtcF9mc2NhbmYKKyNpZmRlZiBfR01QX0hfSEFWRV9GSUxFCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX2ZzY2FuZiBfX0dNUF9QUk9UTyAoKEZJTEUgKiwgX19nbXBfY29uc3QgY2hhciAqLCAuLi4pKTsKKyNlbmRpZgorCisjZGVmaW5lIGdtcF9zY2FuZiBfX2dtcF9zY2FuZgorX19HTVBfREVDTFNQRUMgaW50IGdtcF9zY2FuZiBfX0dNUF9QUk9UTyAoKF9fZ21wX2NvbnN0IGNoYXIgKiwgLi4uKSk7CisKKyNkZWZpbmUgZ21wX3NzY2FuZiBfX2dtcF9zc2NhbmYKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfc3NjYW5mIF9fR01QX1BST1RPICgoX19nbXBfY29uc3QgY2hhciAqLCBfX2dtcF9jb25zdCBjaGFyICosIC4uLikpOworCisjZGVmaW5lIGdtcF92ZnNjYW5mIF9fZ21wX3Zmc2NhbmYKKyNpZiBkZWZpbmVkIChfR01QX0hfSEFWRV9GSUxFKSAmJiBkZWZpbmVkIChfR01QX0hfSEFWRV9WQV9MSVNUKQorX19HTVBfREVDTFNQRUMgaW50IGdtcF92ZnNjYW5mIF9fR01QX1BST1RPICgoRklMRSAqLCBfX2dtcF9jb25zdCBjaGFyICosIHZhX2xpc3QpKTsKKyNlbmRpZgorCisjZGVmaW5lIGdtcF92c2NhbmYgX19nbXBfdnNjYW5mCisjaWYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfVkFfTElTVCkKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfdnNjYW5mIF9fR01QX1BST1RPICgoX19nbXBfY29uc3QgY2hhciAqLCB2YV9saXN0KSk7CisjZW5kaWYKKworI2RlZmluZSBnbXBfdnNzY2FuZiBfX2dtcF92c3NjYW5mCisjaWYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfVkFfTElTVCkKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfdnNzY2FuZiBfX0dNUF9QUk9UTyAoKF9fZ21wX2NvbnN0IGNoYXIgKiwgX19nbXBfY29uc3QgY2hhciAqLCB2YV9saXN0KSk7CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKiBJbnRlZ2VyIChpLmUuIFopIHJvdXRpbmVzLiAgKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBfbXB6X3JlYWxsb2MgX19nbXB6X3JlYWxsb2MKKyNkZWZpbmUgbXB6X3JlYWxsb2MgX19nbXB6X3JlYWxsb2MKK19fR01QX0RFQ0xTUEVDIHZvaWQgKl9tcHpfcmVhbGxvYyBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wX3NpemVfdCkpOworCisjZGVmaW5lIG1wel9hYnMgX19nbXB6X2FicworI2lmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9hYnMpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9hYnMgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyKSk7CisjZW5kaWYKKworI2RlZmluZSBtcHpfYWRkIF9fZ21wel9hZGQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2FkZCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfYWRkX3VpIF9fZ21wel9hZGRfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2FkZF91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X2FkZG11bCBfX2dtcHpfYWRkbXVsCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9hZGRtdWwgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2FkZG11bF91aSBfX2dtcHpfYWRkbXVsX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9hZGRtdWxfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9hbmQgX19nbXB6X2FuZAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfYW5kIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9hcnJheV9pbml0IF9fZ21wel9hcnJheV9pbml0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9hcnJheV9pbml0IF9fR01QX1BST1RPICgobXB6X3B0ciwgbXBfc2l6ZV90LCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcHpfYmluX3VpIF9fZ21wel9iaW5fdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2Jpbl91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X2Jpbl91aXVpIF9fZ21wel9iaW5fdWl1aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfYmluX3VpdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCB1bnNpZ25lZCBsb25nIGludCwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfY2Rpdl9xIF9fZ21wel9jZGl2X3EKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2NkaXZfcSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfY2Rpdl9xXzJleHAgX19nbXB6X2NkaXZfcV8yZXhwCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9jZGl2X3FfMmV4cCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wX2JpdGNudF90KSk7CisKKyNkZWZpbmUgbXB6X2NkaXZfcV91aSBfX2dtcHpfY2Rpdl9xX3VpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGludCBtcHpfY2Rpdl9xX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfY2Rpdl9xciBfX2dtcHpfY2Rpdl9xcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfY2Rpdl9xciBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfY2Rpdl9xcl91aSBfX2dtcHpfY2Rpdl9xcl91aQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXB6X2NkaXZfcXJfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9jZGl2X3IgX19nbXB6X2NkaXZfcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfY2Rpdl9yIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9jZGl2X3JfMmV4cCBfX2dtcHpfY2Rpdl9yXzJleHAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2NkaXZfcl8yZXhwIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXBfYml0Y250X3QpKTsKKworI2RlZmluZSBtcHpfY2Rpdl9yX3VpIF9fZ21wel9jZGl2X3JfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel9jZGl2X3JfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9jZGl2X3VpIF9fZ21wel9jZGl2X3VpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGludCBtcHpfY2Rpdl91aSBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2NsZWFyIF9fZ21wel9jbGVhcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfY2xlYXIgX19HTVBfUFJPVE8gKChtcHpfcHRyKSk7CisKKyNkZWZpbmUgbXB6X2NsZWFycyBfX2dtcHpfY2xlYXJzCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9jbGVhcnMgX19HTVBfUFJPVE8gKChtcHpfcHRyLCAuLi4pKTsKKworI2RlZmluZSBtcHpfY2xyYml0IF9fZ21wel9jbHJiaXQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2NscmJpdCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wX2JpdGNudF90KSk7CisKKyNkZWZpbmUgbXB6X2NtcCBfX2dtcHpfY21wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2NtcCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9jbXBfZCBfX2dtcHpfY21wX2QKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfY21wX2QgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCBkb3VibGUpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBfbXB6X2NtcF9zaSBfX2dtcHpfY21wX3NpCitfX0dNUF9ERUNMU1BFQyBpbnQgX21wel9jbXBfc2kgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCBzaWduZWQgbG9uZyBpbnQpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIF9tcHpfY21wX3VpIF9fZ21wel9jbXBfdWkKK19fR01QX0RFQ0xTUEVDIGludCBfbXB6X2NtcF91aSBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfY21wYWJzIF9fZ21wel9jbXBhYnMKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfY21wYWJzIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2NtcGFic19kIF9fZ21wel9jbXBhYnNfZAorX19HTVBfREVDTFNQRUMgaW50IG1wel9jbXBhYnNfZCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIGRvdWJsZSkpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9jbXBhYnNfdWkgX19nbXB6X2NtcGFic191aQorX19HTVBfREVDTFNQRUMgaW50IG1wel9jbXBhYnNfdWkgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2NvbSBfX2dtcHpfY29tCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9jb20gX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2NvbWJpdCBfX2dtcHpfY29tYml0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9jb21iaXQgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcF9iaXRjbnRfdCkpOworCisjZGVmaW5lIG1wel9jb25ncnVlbnRfcCBfX2dtcHpfY29uZ3J1ZW50X3AKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfY29uZ3J1ZW50X3AgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2NvbmdydWVudF8yZXhwX3AgX19nbXB6X2NvbmdydWVudF8yZXhwX3AKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfY29uZ3J1ZW50XzJleHBfcCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIG1wel9zcmNwdHIsIG1wX2JpdGNudF90KSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfY29uZ3J1ZW50X3VpX3AgX19nbXB6X2NvbmdydWVudF91aV9wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2NvbmdydWVudF91aV9wIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZykpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9kaXZleGFjdCBfX2dtcHpfZGl2ZXhhY3QKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2RpdmV4YWN0IF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9kaXZleGFjdF91aSBfX2dtcHpfZGl2ZXhhY3RfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2RpdmV4YWN0X3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZykpOworCisjZGVmaW5lIG1wel9kaXZpc2libGVfcCBfX2dtcHpfZGl2aXNpYmxlX3AKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfZGl2aXNpYmxlX3AgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2RpdmlzaWJsZV91aV9wIF9fZ21wel9kaXZpc2libGVfdWlfcAorX19HTVBfREVDTFNQRUMgaW50IG1wel9kaXZpc2libGVfdWlfcCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfZGl2aXNpYmxlXzJleHBfcCBfX2dtcHpfZGl2aXNpYmxlXzJleHBfcAorX19HTVBfREVDTFNQRUMgaW50IG1wel9kaXZpc2libGVfMmV4cF9wIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgbXBfYml0Y250X3QpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9kdW1wIF9fZ21wel9kdW1wCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9kdW1wIF9fR01QX1BST1RPICgobXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9leHBvcnQgX19nbXB6X2V4cG9ydAorX19HTVBfREVDTFNQRUMgdm9pZCAqbXB6X2V4cG9ydCBfX0dNUF9QUk9UTyAoKHZvaWQgKiwgc2l6ZV90ICosIGludCwgc2l6ZV90LCBpbnQsIHNpemVfdCwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9mYWNfdWkgX19nbXB6X2ZhY191aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfZmFjX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfZmRpdl9xIF9fZ21wel9mZGl2X3EKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2ZkaXZfcSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfZmRpdl9xXzJleHAgX19nbXB6X2ZkaXZfcV8yZXhwCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9mZGl2X3FfMmV4cCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wX2JpdGNudF90KSk7CisKKyNkZWZpbmUgbXB6X2ZkaXZfcV91aSBfX2dtcHpfZmRpdl9xX3VpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGludCBtcHpfZmRpdl9xX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfZmRpdl9xciBfX2dtcHpfZmRpdl9xcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfZmRpdl9xciBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfZmRpdl9xcl91aSBfX2dtcHpfZmRpdl9xcl91aQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXB6X2ZkaXZfcXJfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9mZGl2X3IgX19nbXB6X2ZkaXZfcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfZmRpdl9yIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9mZGl2X3JfMmV4cCBfX2dtcHpfZmRpdl9yXzJleHAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2ZkaXZfcl8yZXhwIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXBfYml0Y250X3QpKTsKKworI2RlZmluZSBtcHpfZmRpdl9yX3VpIF9fZ21wel9mZGl2X3JfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel9mZGl2X3JfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9mZGl2X3VpIF9fZ21wel9mZGl2X3VpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGludCBtcHpfZmRpdl91aSBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2ZpYl91aSBfX2dtcHpfZmliX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9maWJfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9maWIyX3VpIF9fZ21wel9maWIyX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9maWIyX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfZml0c19zaW50X3AgX19nbXB6X2ZpdHNfc2ludF9wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2ZpdHNfc2ludF9wIF9fR01QX1BST1RPICgobXB6X3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2ZpdHNfc2xvbmdfcCBfX2dtcHpfZml0c19zbG9uZ19wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2ZpdHNfc2xvbmdfcCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9maXRzX3NzaG9ydF9wIF9fZ21wel9maXRzX3NzaG9ydF9wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2ZpdHNfc3Nob3J0X3AgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfZml0c191aW50X3AgX19nbXB6X2ZpdHNfdWludF9wCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2ZpdHNfdWludF9wKQorX19HTVBfREVDTFNQRUMgaW50IG1wel9maXRzX3VpbnRfcCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X2ZpdHNfdWxvbmdfcCBfX2dtcHpfZml0c191bG9uZ19wCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2ZpdHNfdWxvbmdfcCkKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfZml0c191bG9uZ19wIF9fR01QX1BST1RPICgobXB6X3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisjZW5kaWYKKworI2RlZmluZSBtcHpfZml0c191c2hvcnRfcCBfX2dtcHpfZml0c191c2hvcnRfcAorI2lmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9maXRzX3VzaG9ydF9wKQorX19HTVBfREVDTFNQRUMgaW50IG1wel9maXRzX3VzaG9ydF9wIF9fR01QX1BST1RPICgobXB6X3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisjZW5kaWYKKworI2RlZmluZSBtcHpfZ2NkIF9fZ21wel9nY2QKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2djZCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfZ2NkX3VpIF9fZ21wel9nY2RfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel9nY2RfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9nY2RleHQgX19nbXB6X2djZGV4dAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfZ2NkZXh0IF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3B0ciwgbXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9nZXRfZCBfX2dtcHpfZ2V0X2QKK19fR01QX0RFQ0xTUEVDIGRvdWJsZSBtcHpfZ2V0X2QgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyKSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2dldF9kXzJleHAgX19nbXB6X2dldF9kXzJleHAKK19fR01QX0RFQ0xTUEVDIGRvdWJsZSBtcHpfZ2V0X2RfMmV4cCBfX0dNUF9QUk9UTyAoKHNpZ25lZCBsb25nIGludCAqLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2dldF9zaSBfX2dtcHpfZ2V0X3NpCitfX0dNUF9ERUNMU1BFQyAvKiBzaWduZWQgKi8gbG9uZyBpbnQgbXB6X2dldF9zaSBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9nZXRfc3RyIF9fZ21wel9nZXRfc3RyCitfX0dNUF9ERUNMU1BFQyBjaGFyICptcHpfZ2V0X3N0ciBfX0dNUF9QUk9UTyAoKGNoYXIgKiwgaW50LCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2dldF91aSBfX2dtcHpfZ2V0X3VpCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2dldF91aSkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel9nZXRfdWkgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKyNlbmRpZgorCisjZGVmaW5lIG1wel9nZXRsaW1ibiBfX2dtcHpfZ2V0bGltYm4KKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfZ2V0bGltYm4pCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXB6X2dldGxpbWJuIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgbXBfc2l6ZV90KSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKyNlbmRpZgorCisjZGVmaW5lIG1wel9oYW1kaXN0IF9fZ21wel9oYW1kaXN0CitfX0dNUF9ERUNMU1BFQyBtcF9iaXRjbnRfdCBtcHpfaGFtZGlzdCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9pbXBvcnQgX19nbXB6X2ltcG9ydAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfaW1wb3J0IF9fR01QX1BST1RPICgobXB6X3B0ciwgc2l6ZV90LCBpbnQsIHNpemVfdCwgaW50LCBzaXplX3QsIF9fZ21wX2NvbnN0IHZvaWQgKikpOworCisjZGVmaW5lIG1wel9pbml0IF9fZ21wel9pbml0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9pbml0IF9fR01QX1BST1RPICgobXB6X3B0cikpOworCisjZGVmaW5lIG1wel9pbml0MiBfX2dtcHpfaW5pdDIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2luaXQyIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXBfYml0Y250X3QpKTsKKworI2RlZmluZSBtcHpfaW5pdHMgX19nbXB6X2luaXRzCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9pbml0cyBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIC4uLikpOworCisjZGVmaW5lIG1wel9pbml0X3NldCBfX2dtcHpfaW5pdF9zZXQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2luaXRfc2V0IF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9pbml0X3NldF9kIF9fZ21wel9pbml0X3NldF9kCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9pbml0X3NldF9kIF9fR01QX1BST1RPICgobXB6X3B0ciwgZG91YmxlKSk7CisKKyNkZWZpbmUgbXB6X2luaXRfc2V0X3NpIF9fZ21wel9pbml0X3NldF9zaQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfaW5pdF9zZXRfc2kgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBzaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfaW5pdF9zZXRfc3RyIF9fZ21wel9pbml0X3NldF9zdHIKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfaW5pdF9zZXRfc3RyIF9fR01QX1BST1RPICgobXB6X3B0ciwgX19nbXBfY29uc3QgY2hhciAqLCBpbnQpKTsKKworI2RlZmluZSBtcHpfaW5pdF9zZXRfdWkgX19nbXB6X2luaXRfc2V0X3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9pbml0X3NldF91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X2lucF9yYXcgX19nbXB6X2lucF9yYXcKKyNpZmRlZiBfR01QX0hfSEFWRV9GSUxFCitfX0dNUF9ERUNMU1BFQyBzaXplX3QgbXB6X2lucF9yYXcgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBGSUxFICopKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wel9pbnBfc3RyIF9fZ21wel9pbnBfc3RyCisjaWZkZWYgX0dNUF9IX0hBVkVfRklMRQorX19HTVBfREVDTFNQRUMgc2l6ZV90IG1wel9pbnBfc3RyIF9fR01QX1BST1RPICgobXB6X3B0ciwgRklMRSAqLCBpbnQpKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wel9pbnZlcnQgX19nbXB6X2ludmVydAorX19HTVBfREVDTFNQRUMgaW50IG1wel9pbnZlcnQgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2lvciBfX2dtcHpfaW9yCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9pb3IgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2phY29iaSBfX2dtcHpfamFjb2JpCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2phY29iaSBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfa3JvbmVja2VyIG1wel9qYWNvYmkgIC8qIGFsaWFzICovCisKKyNkZWZpbmUgbXB6X2tyb25lY2tlcl9zaSBfX2dtcHpfa3JvbmVja2VyX3NpCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2tyb25lY2tlcl9zaSBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIGxvbmcpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfa3JvbmVja2VyX3VpIF9fZ21wel9rcm9uZWNrZXJfdWkKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfa3JvbmVja2VyX3VpIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZykpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9zaV9rcm9uZWNrZXIgX19nbXB6X3NpX2tyb25lY2tlcgorX19HTVBfREVDTFNQRUMgaW50IG1wel9zaV9rcm9uZWNrZXIgX19HTVBfUFJPVE8gKChsb25nLCBtcHpfc3JjcHRyKSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X3VpX2tyb25lY2tlciBfX2dtcHpfdWlfa3JvbmVja2VyCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X3VpX2tyb25lY2tlciBfX0dNUF9QUk9UTyAoKHVuc2lnbmVkIGxvbmcsIG1wel9zcmNwdHIpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfbGNtIF9fZ21wel9sY20KK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2xjbSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfbGNtX3VpIF9fZ21wel9sY21fdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2xjbV91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcpKTsKKworI2RlZmluZSBtcHpfbGVnZW5kcmUgbXB6X2phY29iaSAgLyogYWxpYXMgKi8KKworI2RlZmluZSBtcHpfbHVjbnVtX3VpIF9fZ21wel9sdWNudW1fdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2x1Y251bV91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X2x1Y251bTJfdWkgX19nbXB6X2x1Y251bTJfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2x1Y251bTJfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9taWxsZXJyYWJpbiBfX2dtcHpfbWlsbGVycmFiaW4KK19fR01QX0RFQ0xTUEVDIGludCBtcHpfbWlsbGVycmFiaW4gX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCBpbnQpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfbW9kIF9fZ21wel9tb2QKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X21vZCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfbW9kX3VpIG1wel9mZGl2X3JfdWkgLyogc2FtZSBhcyBmZGl2X3IgYmVjYXVzZSBkaXZpc29yIHVuc2lnbmVkICovCisKKyNkZWZpbmUgbXB6X211bCBfX2dtcHpfbXVsCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9tdWwgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X211bF8yZXhwIF9fZ21wel9tdWxfMmV4cAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfbXVsXzJleHAgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcF9iaXRjbnRfdCkpOworCisjZGVmaW5lIG1wel9tdWxfc2kgX19nbXB6X211bF9zaQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfbXVsX3NpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfbXVsX3VpIF9fZ21wel9tdWxfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X211bF91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X25lZyBfX2dtcHpfbmVnCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X25lZykKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X25lZyBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIpKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wel9uZXh0cHJpbWUgX19nbXB6X25leHRwcmltZQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfbmV4dHByaW1lIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9vdXRfcmF3IF9fZ21wel9vdXRfcmF3CisjaWZkZWYgX0dNUF9IX0hBVkVfRklMRQorX19HTVBfREVDTFNQRUMgc2l6ZV90IG1wel9vdXRfcmF3IF9fR01QX1BST1RPICgoRklMRSAqLCBtcHpfc3JjcHRyKSk7CisjZW5kaWYKKworI2RlZmluZSBtcHpfb3V0X3N0ciBfX2dtcHpfb3V0X3N0cgorI2lmZGVmIF9HTVBfSF9IQVZFX0ZJTEUKK19fR01QX0RFQ0xTUEVDIHNpemVfdCBtcHpfb3V0X3N0ciBfX0dNUF9QUk9UTyAoKEZJTEUgKiwgaW50LCBtcHpfc3JjcHRyKSk7CisjZW5kaWYKKworI2RlZmluZSBtcHpfcGVyZmVjdF9wb3dlcl9wIF9fZ21wel9wZXJmZWN0X3Bvd2VyX3AKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfcGVyZmVjdF9wb3dlcl9wIF9fR01QX1BST1RPICgobXB6X3NyY3B0cikpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9wZXJmZWN0X3NxdWFyZV9wIF9fZ21wel9wZXJmZWN0X3NxdWFyZV9wCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X3BlcmZlY3Rfc3F1YXJlX3ApCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X3BlcmZlY3Rfc3F1YXJlX3AgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyKSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisjZW5kaWYKKworI2RlZmluZSBtcHpfcG9wY291bnQgX19nbXB6X3BvcGNvdW50CisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X3BvcGNvdW50KQorX19HTVBfREVDTFNQRUMgbXBfYml0Y250X3QgbXB6X3BvcGNvdW50IF9fR01QX1BST1RPICgobXB6X3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisjZW5kaWYKKworI2RlZmluZSBtcHpfcG93X3VpIF9fZ21wel9wb3dfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3Bvd191aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X3Bvd20gX19nbXB6X3Bvd20KK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3Bvd20gX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X3Bvd21fc2VjIF9fZ21wel9wb3dtX3NlYworX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfcG93bV9zZWMgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X3Bvd21fdWkgX19nbXB6X3Bvd21fdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3Bvd21fdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9wcm9iYWJfcHJpbWVfcCBfX2dtcHpfcHJvYmFiX3ByaW1lX3AKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfcHJvYmFiX3ByaW1lX3AgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCBpbnQpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfcmFuZG9tIF9fZ21wel9yYW5kb20KK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3JhbmRvbSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wX3NpemVfdCkpOworCisjZGVmaW5lIG1wel9yYW5kb20yIF9fZ21wel9yYW5kb20yCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9yYW5kb20yIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXBfc2l6ZV90KSk7CisKKyNkZWZpbmUgbXB6X3JlYWxsb2MyIF9fZ21wel9yZWFsbG9jMgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfcmVhbGxvYzIgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcF9iaXRjbnRfdCkpOworCisjZGVmaW5lIG1wel9yZW1vdmUgX19nbXB6X3JlbW92ZQorX19HTVBfREVDTFNQRUMgbXBfYml0Y250X3QgbXB6X3JlbW92ZSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfcm9vdCBfX2dtcHpfcm9vdAorX19HTVBfREVDTFNQRUMgaW50IG1wel9yb290IF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfcm9vdHJlbSBfX2dtcHpfcm9vdHJlbQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfcm9vdHJlbSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsbXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfcnJhbmRvbWIgX19nbXB6X3JyYW5kb21iCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9ycmFuZG9tYiBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIGdtcF9yYW5kc3RhdGVfdCwgbXBfYml0Y250X3QpKTsKKworI2RlZmluZSBtcHpfc2NhbjAgX19nbXB6X3NjYW4wCitfX0dNUF9ERUNMU1BFQyBtcF9iaXRjbnRfdCBtcHpfc2NhbjAgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCBtcF9iaXRjbnRfdCkpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X3NjYW4xIF9fZ21wel9zY2FuMQorX19HTVBfREVDTFNQRUMgbXBfYml0Y250X3QgbXB6X3NjYW4xIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgbXBfYml0Y250X3QpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9zZXQgX19nbXB6X3NldAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfc2V0IF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9zZXRfZCBfX2dtcHpfc2V0X2QKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3NldF9kIF9fR01QX1BST1RPICgobXB6X3B0ciwgZG91YmxlKSk7CisKKyNkZWZpbmUgbXB6X3NldF9mIF9fZ21wel9zZXRfZgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfc2V0X2YgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X3NldF9xIF9fZ21wel9zZXRfcQorI2lmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9zZXRfcSkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3NldF9xIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXBxX3NyY3B0cikpOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X3NldF9zaSBfX2dtcHpfc2V0X3NpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zZXRfc2kgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBzaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfc2V0X3N0ciBfX2dtcHpfc2V0X3N0cgorX19HTVBfREVDTFNQRUMgaW50IG1wel9zZXRfc3RyIF9fR01QX1BST1RPICgobXB6X3B0ciwgX19nbXBfY29uc3QgY2hhciAqLCBpbnQpKTsKKworI2RlZmluZSBtcHpfc2V0X3VpIF9fZ21wel9zZXRfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3NldF91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X3NldGJpdCBfX2dtcHpfc2V0Yml0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zZXRiaXQgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcF9iaXRjbnRfdCkpOworCisjZGVmaW5lIG1wel9zaXplIF9fZ21wel9zaXplCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X3NpemUpCitfX0dNUF9ERUNMU1BFQyBzaXplX3QgbXB6X3NpemUgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKyNlbmRpZgorCisjZGVmaW5lIG1wel9zaXplaW5iYXNlIF9fZ21wel9zaXplaW5iYXNlCitfX0dNUF9ERUNMU1BFQyBzaXplX3QgbXB6X3NpemVpbmJhc2UgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCBpbnQpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9zcXJ0IF9fZ21wel9zcXJ0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zcXJ0IF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9zcXJ0cmVtIF9fZ21wel9zcXJ0cmVtCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zcXJ0cmVtIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9zdWIgX19nbXB6X3N1YgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfc3ViIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9zdWJfdWkgX19nbXB6X3N1Yl91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfc3ViX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfdWlfc3ViIF9fZ21wel91aV9zdWIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3VpX3N1YiBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIHVuc2lnbmVkIGxvbmcgaW50LCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X3N1Ym11bCBfX2dtcHpfc3VibXVsCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zdWJtdWwgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X3N1Ym11bF91aSBfX2dtcHpfc3VibXVsX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zdWJtdWxfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9zd2FwIF9fZ21wel9zd2FwCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zd2FwIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3B0cikpIF9fR01QX05PVEhST1c7CisKKyNkZWZpbmUgbXB6X3RkaXZfdWkgX19nbXB6X3RkaXZfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel90ZGl2X3VpIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfdGRpdl9xIF9fZ21wel90ZGl2X3EKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3RkaXZfcSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfdGRpdl9xXzJleHAgX19nbXB6X3RkaXZfcV8yZXhwCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel90ZGl2X3FfMmV4cCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wX2JpdGNudF90KSk7CisKKyNkZWZpbmUgbXB6X3RkaXZfcV91aSBfX2dtcHpfdGRpdl9xX3VpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGludCBtcHpfdGRpdl9xX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfdGRpdl9xciBfX2dtcHpfdGRpdl9xcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfdGRpdl9xciBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfdGRpdl9xcl91aSBfX2dtcHpfdGRpdl9xcl91aQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXB6X3RkaXZfcXJfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel90ZGl2X3IgX19nbXB6X3RkaXZfcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfdGRpdl9yIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel90ZGl2X3JfMmV4cCBfX2dtcHpfdGRpdl9yXzJleHAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3RkaXZfcl8yZXhwIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXBfYml0Y250X3QpKTsKKworI2RlZmluZSBtcHpfdGRpdl9yX3VpIF9fZ21wel90ZGl2X3JfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel90ZGl2X3JfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel90c3RiaXQgX19nbXB6X3RzdGJpdAorX19HTVBfREVDTFNQRUMgaW50IG1wel90c3RiaXQgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCBtcF9iaXRjbnRfdCkpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X3VpX3Bvd191aSBfX2dtcHpfdWlfcG93X3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel91aV9wb3dfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCB1bnNpZ25lZCBsb25nIGludCwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfdXJhbmRvbWIgX19nbXB6X3VyYW5kb21iCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel91cmFuZG9tYiBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIGdtcF9yYW5kc3RhdGVfdCwgbXBfYml0Y250X3QpKTsKKworI2RlZmluZSBtcHpfdXJhbmRvbW0gX19nbXB6X3VyYW5kb21tCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel91cmFuZG9tbSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIGdtcF9yYW5kc3RhdGVfdCwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel94b3IgX19nbXB6X3hvcgorI2RlZmluZSBtcHpfZW9yIF9fZ21wel94b3IKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3hvciBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworCisvKioqKioqKioqKioqKioqKiBSYXRpb25hbCAoaS5lLiBRKSByb3V0aW5lcy4gICoqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgbXBxX2FicyBfX2dtcHFfYWJzCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBxX2FicykKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX2FicyBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIG1wcV9zcmNwdHIpKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wcV9hZGQgX19nbXBxX2FkZAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfYWRkIF9fR01QX1BST1RPICgobXBxX3B0ciwgbXBxX3NyY3B0ciwgbXBxX3NyY3B0cikpOworCisjZGVmaW5lIG1wcV9jYW5vbmljYWxpemUgX19nbXBxX2Nhbm9uaWNhbGl6ZQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfY2Fub25pY2FsaXplIF9fR01QX1BST1RPICgobXBxX3B0cikpOworCisjZGVmaW5lIG1wcV9jbGVhciBfX2dtcHFfY2xlYXIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX2NsZWFyIF9fR01QX1BST1RPICgobXBxX3B0cikpOworCisjZGVmaW5lIG1wcV9jbGVhcnMgX19nbXBxX2NsZWFycworX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfY2xlYXJzIF9fR01QX1BST1RPICgobXBxX3B0ciwgLi4uKSk7CisKKyNkZWZpbmUgbXBxX2NtcCBfX2dtcHFfY21wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBxX2NtcCBfX0dNUF9QUk9UTyAoKG1wcV9zcmNwdHIsIG1wcV9zcmNwdHIpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBfbXBxX2NtcF9zaSBfX2dtcHFfY21wX3NpCitfX0dNUF9ERUNMU1BFQyBpbnQgX21wcV9jbXBfc2kgX19HTVBfUFJPVE8gKChtcHFfc3JjcHRyLCBsb25nLCB1bnNpZ25lZCBsb25nKSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgX21wcV9jbXBfdWkgX19nbXBxX2NtcF91aQorX19HTVBfREVDTFNQRUMgaW50IF9tcHFfY21wX3VpIF9fR01QX1BST1RPICgobXBxX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIHVuc2lnbmVkIGxvbmcgaW50KSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBxX2RpdiBfX2dtcHFfZGl2CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9kaXYgX19HTVBfUFJPVE8gKChtcHFfcHRyLCBtcHFfc3JjcHRyLCBtcHFfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBxX2Rpdl8yZXhwIF9fZ21wcV9kaXZfMmV4cAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfZGl2XzJleHAgX19HTVBfUFJPVE8gKChtcHFfcHRyLCBtcHFfc3JjcHRyLCBtcF9iaXRjbnRfdCkpOworCisjZGVmaW5lIG1wcV9lcXVhbCBfX2dtcHFfZXF1YWwKK19fR01QX0RFQ0xTUEVDIGludCBtcHFfZXF1YWwgX19HTVBfUFJPVE8gKChtcHFfc3JjcHRyLCBtcHFfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHFfZ2V0X251bSBfX2dtcHFfZ2V0X251bQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfZ2V0X251bSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wcV9zcmNwdHIpKTsKKworI2RlZmluZSBtcHFfZ2V0X2RlbiBfX2dtcHFfZ2V0X2RlbgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfZ2V0X2RlbiBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wcV9zcmNwdHIpKTsKKworI2RlZmluZSBtcHFfZ2V0X2QgX19nbXBxX2dldF9kCitfX0dNUF9ERUNMU1BFQyBkb3VibGUgbXBxX2dldF9kIF9fR01QX1BST1RPICgobXBxX3NyY3B0cikpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wcV9nZXRfc3RyIF9fZ21wcV9nZXRfc3RyCitfX0dNUF9ERUNMU1BFQyBjaGFyICptcHFfZ2V0X3N0ciBfX0dNUF9QUk9UTyAoKGNoYXIgKiwgaW50LCBtcHFfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBxX2luaXQgX19nbXBxX2luaXQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX2luaXQgX19HTVBfUFJPVE8gKChtcHFfcHRyKSk7CisKKyNkZWZpbmUgbXBxX2luaXRzIF9fZ21wcV9pbml0cworX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfaW5pdHMgX19HTVBfUFJPVE8gKChtcHFfcHRyLCAuLi4pKTsKKworI2RlZmluZSBtcHFfaW5wX3N0ciBfX2dtcHFfaW5wX3N0cgorI2lmZGVmIF9HTVBfSF9IQVZFX0ZJTEUKK19fR01QX0RFQ0xTUEVDIHNpemVfdCBtcHFfaW5wX3N0ciBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIEZJTEUgKiwgaW50KSk7CisjZW5kaWYKKworI2RlZmluZSBtcHFfaW52IF9fZ21wcV9pbnYKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX2ludiBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIG1wcV9zcmNwdHIpKTsKKworI2RlZmluZSBtcHFfbXVsIF9fZ21wcV9tdWwKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX211bCBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIG1wcV9zcmNwdHIsIG1wcV9zcmNwdHIpKTsKKworI2RlZmluZSBtcHFfbXVsXzJleHAgX19nbXBxX211bF8yZXhwCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9tdWxfMmV4cCBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIG1wcV9zcmNwdHIsIG1wX2JpdGNudF90KSk7CisKKyNkZWZpbmUgbXBxX25lZyBfX2dtcHFfbmVnCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBxX25lZykKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX25lZyBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIG1wcV9zcmNwdHIpKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wcV9vdXRfc3RyIF9fZ21wcV9vdXRfc3RyCisjaWZkZWYgX0dNUF9IX0hBVkVfRklMRQorX19HTVBfREVDTFNQRUMgc2l6ZV90IG1wcV9vdXRfc3RyIF9fR01QX1BST1RPICgoRklMRSAqLCBpbnQsIG1wcV9zcmNwdHIpKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wcV9zZXQgX19nbXBxX3NldAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfc2V0IF9fR01QX1BST1RPICgobXBxX3B0ciwgbXBxX3NyY3B0cikpOworCisjZGVmaW5lIG1wcV9zZXRfZCBfX2dtcHFfc2V0X2QKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX3NldF9kIF9fR01QX1BST1RPICgobXBxX3B0ciwgZG91YmxlKSk7CisKKyNkZWZpbmUgbXBxX3NldF9kZW4gX19nbXBxX3NldF9kZW4KK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX3NldF9kZW4gX19HTVBfUFJPVE8gKChtcHFfcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBxX3NldF9mIF9fZ21wcV9zZXRfZgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfc2V0X2YgX19HTVBfUFJPVE8gKChtcHFfcHRyLCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBxX3NldF9udW0gX19nbXBxX3NldF9udW0KK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX3NldF9udW0gX19HTVBfUFJPVE8gKChtcHFfcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBxX3NldF9zaSBfX2dtcHFfc2V0X3NpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9zZXRfc2kgX19HTVBfUFJPVE8gKChtcHFfcHRyLCBzaWduZWQgbG9uZyBpbnQsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXBxX3NldF9zdHIgX19nbXBxX3NldF9zdHIKK19fR01QX0RFQ0xTUEVDIGludCBtcHFfc2V0X3N0ciBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIF9fZ21wX2NvbnN0IGNoYXIgKiwgaW50KSk7CisKKyNkZWZpbmUgbXBxX3NldF91aSBfX2dtcHFfc2V0X3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9zZXRfdWkgX19HTVBfUFJPVE8gKChtcHFfcHRyLCB1bnNpZ25lZCBsb25nIGludCwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHFfc2V0X3ogX19nbXBxX3NldF96CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9zZXRfeiBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHFfc3ViIF9fZ21wcV9zdWIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX3N1YiBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIG1wcV9zcmNwdHIsIG1wcV9zcmNwdHIpKTsKKworI2RlZmluZSBtcHFfc3dhcCBfX2dtcHFfc3dhcAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfc3dhcCBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIG1wcV9wdHIpKSBfX0dNUF9OT1RIUk9XOworCisKKy8qKioqKioqKioqKioqKioqIEZsb2F0IChpLmUuIEYpIHJvdXRpbmVzLiAgKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBtcGZfYWJzIF9fZ21wZl9hYnMKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2FicyBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfYWRkIF9fZ21wZl9hZGQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2FkZCBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIsIG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfYWRkX3VpIF9fZ21wZl9hZGRfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2FkZF91aSBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisjZGVmaW5lIG1wZl9jZWlsIF9fZ21wZl9jZWlsCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9jZWlsIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0cikpOworCisjZGVmaW5lIG1wZl9jbGVhciBfX2dtcGZfY2xlYXIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2NsZWFyIF9fR01QX1BST1RPICgobXBmX3B0cikpOworCisjZGVmaW5lIG1wZl9jbGVhcnMgX19nbXBmX2NsZWFycworX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfY2xlYXJzIF9fR01QX1BST1RPICgobXBmX3B0ciwgLi4uKSk7CisKKyNkZWZpbmUgbXBmX2NtcCBfX2dtcGZfY21wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX2NtcCBfX0dNUF9QUk9UTyAoKG1wZl9zcmNwdHIsIG1wZl9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9jbXBfZCBfX2dtcGZfY21wX2QKK19fR01QX0RFQ0xTUEVDIGludCBtcGZfY21wX2QgX19HTVBfUFJPVE8gKChtcGZfc3JjcHRyLCBkb3VibGUpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfY21wX3NpIF9fZ21wZl9jbXBfc2kKK19fR01QX0RFQ0xTUEVDIGludCBtcGZfY21wX3NpIF9fR01QX1BST1RPICgobXBmX3NyY3B0ciwgc2lnbmVkIGxvbmcgaW50KSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfY21wX3VpIF9fZ21wZl9jbXBfdWkKK19fR01QX0RFQ0xTUEVDIGludCBtcGZfY21wX3VpIF9fR01QX1BST1RPICgobXBmX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9kaXYgX19nbXBmX2RpdgorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfZGl2IF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0ciwgbXBmX3NyY3B0cikpOworCisjZGVmaW5lIG1wZl9kaXZfMmV4cCBfX2dtcGZfZGl2XzJleHAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2Rpdl8yZXhwIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0ciwgbXBfYml0Y250X3QpKTsKKworI2RlZmluZSBtcGZfZGl2X3VpIF9fZ21wZl9kaXZfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2Rpdl91aSBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXBmX2R1bXAgX19nbXBmX2R1bXAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2R1bXAgX19HTVBfUFJPVE8gKChtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBmX2VxIF9fZ21wZl9lcQorX19HTVBfREVDTFNQRUMgaW50IG1wZl9lcSBfX0dNUF9QUk9UTyAoKG1wZl9zcmNwdHIsIG1wZl9zcmNwdHIsIG1wX2JpdGNudF90KSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2ZpdHNfc2ludF9wIF9fZ21wZl9maXRzX3NpbnRfcAorX19HTVBfREVDTFNQRUMgaW50IG1wZl9maXRzX3NpbnRfcCBfX0dNUF9QUk9UTyAoKG1wZl9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9maXRzX3Nsb25nX3AgX19nbXBmX2ZpdHNfc2xvbmdfcAorX19HTVBfREVDTFNQRUMgaW50IG1wZl9maXRzX3Nsb25nX3AgX19HTVBfUFJPVE8gKChtcGZfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfZml0c19zc2hvcnRfcCBfX2dtcGZfZml0c19zc2hvcnRfcAorX19HTVBfREVDTFNQRUMgaW50IG1wZl9maXRzX3NzaG9ydF9wIF9fR01QX1BST1RPICgobXBmX3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2ZpdHNfdWludF9wIF9fZ21wZl9maXRzX3VpbnRfcAorX19HTVBfREVDTFNQRUMgaW50IG1wZl9maXRzX3VpbnRfcCBfX0dNUF9QUk9UTyAoKG1wZl9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9maXRzX3Vsb25nX3AgX19nbXBmX2ZpdHNfdWxvbmdfcAorX19HTVBfREVDTFNQRUMgaW50IG1wZl9maXRzX3Vsb25nX3AgX19HTVBfUFJPVE8gKChtcGZfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfZml0c191c2hvcnRfcCBfX2dtcGZfZml0c191c2hvcnRfcAorX19HTVBfREVDTFNQRUMgaW50IG1wZl9maXRzX3VzaG9ydF9wIF9fR01QX1BST1RPICgobXBmX3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2Zsb29yIF9fZ21wZl9mbG9vcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfZmxvb3IgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBmX2dldF9kIF9fZ21wZl9nZXRfZAorX19HTVBfREVDTFNQRUMgZG91YmxlIG1wZl9nZXRfZCBfX0dNUF9QUk9UTyAoKG1wZl9zcmNwdHIpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfZ2V0X2RfMmV4cCBfX2dtcGZfZ2V0X2RfMmV4cAorX19HTVBfREVDTFNQRUMgZG91YmxlIG1wZl9nZXRfZF8yZXhwIF9fR01QX1BST1RPICgoc2lnbmVkIGxvbmcgaW50ICosIG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfZ2V0X2RlZmF1bHRfcHJlYyBfX2dtcGZfZ2V0X2RlZmF1bHRfcHJlYworX19HTVBfREVDTFNQRUMgbXBfYml0Y250X3QgbXBmX2dldF9kZWZhdWx0X3ByZWMgX19HTVBfUFJPVE8gKCh2b2lkKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfZ2V0X3ByZWMgX19nbXBmX2dldF9wcmVjCitfX0dNUF9ERUNMU1BFQyBtcF9iaXRjbnRfdCBtcGZfZ2V0X3ByZWMgX19HTVBfUFJPVE8gKChtcGZfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfZ2V0X3NpIF9fZ21wZl9nZXRfc2kKK19fR01QX0RFQ0xTUEVDIGxvbmcgbXBmX2dldF9zaSBfX0dNUF9QUk9UTyAoKG1wZl9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9nZXRfc3RyIF9fZ21wZl9nZXRfc3RyCitfX0dNUF9ERUNMU1BFQyBjaGFyICptcGZfZ2V0X3N0ciBfX0dNUF9QUk9UTyAoKGNoYXIgKiwgbXBfZXhwX3QgKiwgaW50LCBzaXplX3QsIG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfZ2V0X3VpIF9fZ21wZl9nZXRfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgbXBmX2dldF91aSBfX0dNUF9QUk9UTyAoKG1wZl9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9pbml0IF9fZ21wZl9pbml0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9pbml0IF9fR01QX1BST1RPICgobXBmX3B0cikpOworCisjZGVmaW5lIG1wZl9pbml0MiBfX2dtcGZfaW5pdDIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2luaXQyIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBfYml0Y250X3QpKTsKKworI2RlZmluZSBtcGZfaW5pdHMgX19nbXBmX2luaXRzCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9pbml0cyBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIC4uLikpOworCisjZGVmaW5lIG1wZl9pbml0X3NldCBfX2dtcGZfaW5pdF9zZXQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2luaXRfc2V0IF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0cikpOworCisjZGVmaW5lIG1wZl9pbml0X3NldF9kIF9fZ21wZl9pbml0X3NldF9kCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9pbml0X3NldF9kIF9fR01QX1BST1RPICgobXBmX3B0ciwgZG91YmxlKSk7CisKKyNkZWZpbmUgbXBmX2luaXRfc2V0X3NpIF9fZ21wZl9pbml0X3NldF9zaQorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfaW5pdF9zZXRfc2kgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBzaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcGZfaW5pdF9zZXRfc3RyIF9fZ21wZl9pbml0X3NldF9zdHIKK19fR01QX0RFQ0xTUEVDIGludCBtcGZfaW5pdF9zZXRfc3RyIF9fR01QX1BST1RPICgobXBmX3B0ciwgX19nbXBfY29uc3QgY2hhciAqLCBpbnQpKTsKKworI2RlZmluZSBtcGZfaW5pdF9zZXRfdWkgX19nbXBmX2luaXRfc2V0X3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9pbml0X3NldF91aSBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXBmX2lucF9zdHIgX19nbXBmX2lucF9zdHIKKyNpZmRlZiBfR01QX0hfSEFWRV9GSUxFCitfX0dNUF9ERUNMU1BFQyBzaXplX3QgbXBmX2lucF9zdHIgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBGSUxFICosIGludCkpOworI2VuZGlmCisKKyNkZWZpbmUgbXBmX2ludGVnZXJfcCBfX2dtcGZfaW50ZWdlcl9wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX2ludGVnZXJfcCBfX0dNUF9QUk9UTyAoKG1wZl9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9tdWwgX19nbXBmX211bAorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfbXVsIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0ciwgbXBmX3NyY3B0cikpOworCisjZGVmaW5lIG1wZl9tdWxfMmV4cCBfX2dtcGZfbXVsXzJleHAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX211bF8yZXhwIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0ciwgbXBfYml0Y250X3QpKTsKKworI2RlZmluZSBtcGZfbXVsX3VpIF9fZ21wZl9tdWxfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX211bF91aSBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXBmX25lZyBfX2dtcGZfbmVnCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9uZWcgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBmX291dF9zdHIgX19nbXBmX291dF9zdHIKKyNpZmRlZiBfR01QX0hfSEFWRV9GSUxFCitfX0dNUF9ERUNMU1BFQyBzaXplX3QgbXBmX291dF9zdHIgX19HTVBfUFJPVE8gKChGSUxFICosIGludCwgc2l6ZV90LCBtcGZfc3JjcHRyKSk7CisjZW5kaWYKKworI2RlZmluZSBtcGZfcG93X3VpIF9fZ21wZl9wb3dfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3Bvd191aSBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXBmX3JhbmRvbTIgX19nbXBmX3JhbmRvbTIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3JhbmRvbTIgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcF9zaXplX3QsIG1wX2V4cF90KSk7CisKKyNkZWZpbmUgbXBmX3JlbGRpZmYgX19nbXBmX3JlbGRpZmYKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3JlbGRpZmYgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcGZfc3JjcHRyLCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBmX3NldCBfX2dtcGZfc2V0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9zZXQgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBmX3NldF9kIF9fZ21wZl9zZXRfZAorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfc2V0X2QgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBkb3VibGUpKTsKKworI2RlZmluZSBtcGZfc2V0X2RlZmF1bHRfcHJlYyBfX2dtcGZfc2V0X2RlZmF1bHRfcHJlYworX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfc2V0X2RlZmF1bHRfcHJlYyBfX0dNUF9QUk9UTyAoKG1wX2JpdGNudF90KSkgX19HTVBfTk9USFJPVzsKKworI2RlZmluZSBtcGZfc2V0X3ByZWMgX19nbXBmX3NldF9wcmVjCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9zZXRfcHJlYyBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wX2JpdGNudF90KSk7CisKKyNkZWZpbmUgbXBmX3NldF9wcmVjX3JhdyBfX2dtcGZfc2V0X3ByZWNfcmF3CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9zZXRfcHJlY19yYXcgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcF9iaXRjbnRfdCkpIF9fR01QX05PVEhST1c7CisKKyNkZWZpbmUgbXBmX3NldF9xIF9fZ21wZl9zZXRfcQorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfc2V0X3EgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcHFfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBmX3NldF9zaSBfX2dtcGZfc2V0X3NpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9zZXRfc2kgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBzaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcGZfc2V0X3N0ciBfX2dtcGZfc2V0X3N0cgorX19HTVBfREVDTFNQRUMgaW50IG1wZl9zZXRfc3RyIF9fR01QX1BST1RPICgobXBmX3B0ciwgX19nbXBfY29uc3QgY2hhciAqLCBpbnQpKTsKKworI2RlZmluZSBtcGZfc2V0X3VpIF9fZ21wZl9zZXRfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3NldF91aSBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXBmX3NldF96IF9fZ21wZl9zZXRfegorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfc2V0X3ogX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBmX3NpemUgX19nbXBmX3NpemUKK19fR01QX0RFQ0xTUEVDIHNpemVfdCBtcGZfc2l6ZSBfX0dNUF9QUk9UTyAoKG1wZl9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9zcXJ0IF9fZ21wZl9zcXJ0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9zcXJ0IF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0cikpOworCisjZGVmaW5lIG1wZl9zcXJ0X3VpIF9fZ21wZl9zcXJ0X3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9zcXJ0X3VpIF9fR01QX1BST1RPICgobXBmX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcGZfc3ViIF9fZ21wZl9zdWIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3N1YiBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIsIG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfc3ViX3VpIF9fZ21wZl9zdWJfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3N1Yl91aSBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXBmX3N3YXAgX19nbXBmX3N3YXAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3N3YXAgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcGZfcHRyKSkgX19HTVBfTk9USFJPVzsKKworI2RlZmluZSBtcGZfdHJ1bmMgX19nbXBmX3RydW5jCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl90cnVuYyBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfdWlfZGl2IF9fZ21wZl91aV9kaXYKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3VpX2RpdiBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIHVuc2lnbmVkIGxvbmcgaW50LCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBmX3VpX3N1YiBfX2dtcGZfdWlfc3ViCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl91aV9zdWIgX19HTVBfUFJPVE8gKChtcGZfcHRyLCB1bnNpZ25lZCBsb25nIGludCwgbXBmX3NyY3B0cikpOworCisjZGVmaW5lIG1wZl91cmFuZG9tYiBfX2dtcGZfdXJhbmRvbWIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3VyYW5kb21iIF9fR01QX1BST1RPICgobXBmX3QsIGdtcF9yYW5kc3RhdGVfdCwgbXBfYml0Y250X3QpKTsKKworCisvKioqKioqKioqKioqIExvdyBsZXZlbCBwb3NpdGl2ZS1pbnRlZ2VyIChpLmUuIE4pIHJvdXRpbmVzLiAgKioqKioqKioqKioqLworCisvKiBUaGlzIGlzIHVnbHksIGJ1dCB3ZSBuZWVkIHRvIG1ha2UgdXNlciBjYWxscyByZWFjaCB0aGUgcHJlZml4ZWQgZnVuY3Rpb24uICovCisKKyNkZWZpbmUgbXBuX2FkZCBfX01QTihhZGQpCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBuX2FkZCkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fYWRkIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLG1wX3NpemVfdCkpOworI2VuZGlmCisKKyNkZWZpbmUgbXBuX2FkZF8xIF9fTVBOKGFkZF8xKQorI2lmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9hZGRfMSkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fYWRkXzEgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpKSBfX0dNUF9OT1RIUk9XOworI2VuZGlmCisKKyNkZWZpbmUgbXBuX2FkZF9uIF9fTVBOKGFkZF9uKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9hZGRfbiBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCkpOworCisjZGVmaW5lIG1wbl9hZGRtdWxfMSBfX01QTihhZGRtdWxfMSkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fYWRkbXVsXzEgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpKTsKKworI2RlZmluZSBtcG5fY21wIF9fTVBOKGNtcCkKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fY21wKQorX19HTVBfREVDTFNQRUMgaW50IG1wbl9jbXAgX19HTVBfUFJPVE8gKChtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKyNlbmRpZgorCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTMoZHN0LHNyYyxzaXplKSBcCisgIG1wbl9kaXZleGFjdF9ieTNjIChkc3QsIHNyYywgc2l6ZSwgX19HTVBfQ0FTVCAobXBfbGltYl90LCAwKSkKKworI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnkzYyBfX01QTihkaXZleGFjdF9ieTNjKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9kaXZleGFjdF9ieTNjIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KSk7CisKKyNkZWZpbmUgbXBuX2Rpdm1vZF8xKHFwLG5wLG5zaXplLGRsaW1iKSBcCisgIG1wbl9kaXZyZW1fMSAocXAsIF9fR01QX0NBU1QgKG1wX3NpemVfdCwgMCksIG5wLCBuc2l6ZSwgZGxpbWIpCisKKyNkZWZpbmUgbXBuX2RpdnJlbSBfX01QTihkaXZyZW0pCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2RpdnJlbSBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcG5fZGl2cmVtXzEgX19NUE4oZGl2cmVtXzEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2RpdnJlbV8xIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpKTsKKworI2RlZmluZSBtcG5fZGl2cmVtXzIgX19NUE4oZGl2cmVtXzIpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2RpdnJlbV8yIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zaXplX3QsIG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIpKTsKKworI2RlZmluZSBtcG5fZ2NkIF9fTVBOKGdjZCkKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5fZ2NkIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9wdHIsIG1wX3NpemVfdCwgbXBfcHRyLCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcG5fZ2NkXzEgX19NUE4oZ2NkXzEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2djZF8xIF9fR01QX1BST1RPICgobXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCkpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wbl9nY2RleHRfMSBfX01QTihnY2RleHRfMSkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fZ2NkZXh0XzEgX19HTVBfUFJPVE8gKChtcF9saW1iX3NpZ25lZF90ICosIG1wX2xpbWJfc2lnbmVkX3QgKiwgbXBfbGltYl90LCBtcF9saW1iX3QpKTsKKworI2RlZmluZSBtcG5fZ2NkZXh0IF9fTVBOKGdjZGV4dCkKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5fZ2NkZXh0IF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9wdHIsIG1wX3NpemVfdCAqLCBtcF9wdHIsIG1wX3NpemVfdCwgbXBfcHRyLCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcG5fZ2V0X3N0ciBfX01QTihnZXRfc3RyKQorX19HTVBfREVDTFNQRUMgc2l6ZV90IG1wbl9nZXRfc3RyIF9fR01QX1BST1RPICgodW5zaWduZWQgY2hhciAqLCBpbnQsIG1wX3B0ciwgbXBfc2l6ZV90KSk7CisKKyNkZWZpbmUgbXBuX2hhbWRpc3QgX19NUE4oaGFtZGlzdCkKK19fR01QX0RFQ0xTUEVDIG1wX2JpdGNudF90IG1wbl9oYW1kaXN0IF9fR01QX1BST1RPICgobXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCkpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBuX2xzaGlmdCBfX01QTihsc2hpZnQpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2xzaGlmdCBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIHVuc2lnbmVkIGludCkpOworCisjZGVmaW5lIG1wbl9tb2RfMSBfX01QTihtb2RfMSkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fbW9kXzEgX19HTVBfUFJPVE8gKChtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBuX211bCBfX01QTihtdWwpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX211bCBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSk7CisKKyNkZWZpbmUgbXBuX211bF8xIF9fTVBOKG11bF8xKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9tdWxfMSBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCkpOworCisjZGVmaW5lIG1wbl9tdWxfbiBfX01QTihtdWxfbikKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX211bF9uIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSk7CisKKyNkZWZpbmUgbXBuX3NxciBfX01QTihzcXIpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9zcXIgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSk7CisKKyNkZWZpbmUgbXBuX25lZyBfX01QTihuZWcpCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBuX25lZykKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fbmVnIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCkpOworI2VuZGlmCisKKyNkZWZpbmUgbXBuX2NvbSBfX01QTihjb20pCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBuX2NvbSkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX2NvbSBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wbl9wZXJmZWN0X3NxdWFyZV9wIF9fTVBOKHBlcmZlY3Rfc3F1YXJlX3ApCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBuX3BlcmZlY3Rfc3F1YXJlX3AgX19HTVBfUFJPVE8gKChtcF9zcmNwdHIsIG1wX3NpemVfdCkpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wbl9wZXJmZWN0X3Bvd2VyX3AgX19NUE4ocGVyZmVjdF9wb3dlcl9wKQorX19HTVBfREVDTFNQRUMgaW50IG1wbl9wZXJmZWN0X3Bvd2VyX3AgX19HTVBfUFJPVE8gKChtcF9zcmNwdHIsIG1wX3NpemVfdCkpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wbl9wb3Bjb3VudCBfX01QTihwb3Bjb3VudCkKK19fR01QX0RFQ0xTUEVDIG1wX2JpdGNudF90IG1wbl9wb3Bjb3VudCBfX0dNUF9QUk9UTyAoKG1wX3NyY3B0ciwgbXBfc2l6ZV90KSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcG5fcG93XzEgX19NUE4ocG93XzEpCitfX0dNUF9ERUNMU1BFQyBtcF9zaXplX3QgbXBuX3Bvd18xIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90LCBtcF9wdHIpKTsKKworLyogdW5kb2N1bWVudGVkIG5vdywgYnV0IHJldGFpbmVkIGhlcmUgZm9yIHVwd2FyZCBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIG1wbl9wcmVpbnZfbW9kXzEgX19NUE4ocHJlaW52X21vZF8xKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9wcmVpbnZfbW9kXzEgX19HTVBfUFJPVE8gKChtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90LCBtcF9saW1iX3QpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcG5fcmFuZG9tIF9fTVBOKHJhbmRvbSkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX3JhbmRvbSBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc2l6ZV90KSk7CisKKyNkZWZpbmUgbXBuX3JhbmRvbTIgX19NUE4ocmFuZG9tMikKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX3JhbmRvbTIgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NpemVfdCkpOworCisjZGVmaW5lIG1wbl9yc2hpZnQgX19NUE4ocnNoaWZ0KQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9yc2hpZnQgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCB1bnNpZ25lZCBpbnQpKTsKKworI2RlZmluZSBtcG5fc2NhbjAgX19NUE4oc2NhbjApCitfX0dNUF9ERUNMU1BFQyBtcF9iaXRjbnRfdCBtcG5fc2NhbjAgX19HTVBfUFJPVE8gKChtcF9zcmNwdHIsIG1wX2JpdGNudF90KSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBuX3NjYW4xIF9fTVBOKHNjYW4xKQorX19HTVBfREVDTFNQRUMgbXBfYml0Y250X3QgbXBuX3NjYW4xIF9fR01QX1BST1RPICgobXBfc3JjcHRyLCBtcF9iaXRjbnRfdCkpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wbl9zZXRfc3RyIF9fTVBOKHNldF9zdHIpCitfX0dNUF9ERUNMU1BFQyBtcF9zaXplX3QgbXBuX3NldF9zdHIgX19HTVBfUFJPVE8gKChtcF9wdHIsIF9fZ21wX2NvbnN0IHVuc2lnbmVkIGNoYXIgKiwgc2l6ZV90LCBpbnQpKTsKKworI2RlZmluZSBtcG5fc3FydHJlbSBfX01QTihzcXJ0cmVtKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9zcXJ0cmVtIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSk7CisKKyNkZWZpbmUgbXBuX3N1YiBfX01QTihzdWIpCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBuX3N1YikKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fc3ViIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLG1wX3NpemVfdCkpOworI2VuZGlmCisKKyNkZWZpbmUgbXBuX3N1Yl8xIF9fTVBOKHN1Yl8xKQorI2lmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9zdWJfMSkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fc3ViXzEgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpKSBfX0dNUF9OT1RIUk9XOworI2VuZGlmCisKKyNkZWZpbmUgbXBuX3N1Yl9uIF9fTVBOKHN1Yl9uKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9zdWJfbiBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCkpOworCisjZGVmaW5lIG1wbl9zdWJtdWxfMSBfX01QTihzdWJtdWxfMSkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fc3VibXVsXzEgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpKTsKKworI2RlZmluZSBtcG5fdGRpdl9xciBfX01QTih0ZGl2X3FyKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fdGRpdl9xciBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCkpOworCisjZGVmaW5lIG1wbl9hbmRfbiBfX01QTihhbmRfbikKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX2FuZF9uIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSk7CisjZGVmaW5lIG1wbl9hbmRuX24gX19NUE4oYW5kbl9uKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fYW5kbl9uIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSk7CisjZGVmaW5lIG1wbl9uYW5kX24gX19NUE4obmFuZF9uKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fbmFuZF9uIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSk7CisjZGVmaW5lIG1wbl9pb3JfbiBfX01QTihpb3JfbikKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX2lvcl9uIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSk7CisjZGVmaW5lIG1wbl9pb3JuX24gX19NUE4oaW9ybl9uKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5faW9ybl9uIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSk7CisjZGVmaW5lIG1wbl9uaW9yX24gX19NUE4obmlvcl9uKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fbmlvcl9uIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSk7CisjZGVmaW5lIG1wbl94b3JfbiBfX01QTih4b3JfbikKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX3hvcl9uIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSk7CisjZGVmaW5lIG1wbl94bm9yX24gX19NUE4oeG5vcl9uKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5feG5vcl9uIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSk7CisKKyNkZWZpbmUgbXBuX2NvcHlpIF9fTVBOKGNvcHlpKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fY29weWkgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSk7CisjZGVmaW5lIG1wbl9jb3B5ZCBfX01QTihjb3B5ZCkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX2NvcHlkIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCkpOworI2RlZmluZSBtcG5femVybyBfX01QTih6ZXJvKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5femVybyBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc2l6ZV90KSk7CisKKy8qKioqKioqKioqKioqKioqIG1weiBpbmxpbmVzICoqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHByb3ZpZGVkIGFzIGlubGluZXMgd2hlcmUgcG9zc2libGUsIGJ1dCBhbHdheXMgZXhpc3QgYXMKKyAgIGxpYnJhcnkgZnVuY3Rpb25zIHRvbywgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5LgorCisgICBXaXRoaW4gZ21wIGl0c2VsZiB0aGlzIGlubGluaW5nIGdlbmVyYWxseSBpc24ndCByZWxpZWQgb24sIHNpbmNlIGl0CisgICBkb2Vzbid0IGdldCBkb25lIGZvciBhbGwgY29tcGlsZXJzLCB3aGVyZWFzIGlmIHNvbWV0aGluZyBpcyB3b3J0aAorICAgaW5saW5pbmcgdGhlbiBpdCdzIHdvcnRoIGFycmFuZ2luZyBhbHdheXMuCisKKyAgIFRoZXJlIGFyZSB0d28gc3R5bGVzIG9mIGlubGluaW5nIGhlcmUuICBXaGVuIHRoZSBzYW1lIGJpdCBvZiBjb2RlIGlzCisgICB3YW50ZWQgZm9yIHRoZSBpbmxpbmUgYXMgZm9yIHRoZSBsaWJyYXJ5IHZlcnNpb24sIHRoZW4gX19HTVBfRk9SQ0VfZm9vCisgICBhcnJhbmdlcyBmb3IgdGhhdCBjb2RlIHRvIGJlIGVtaXR0ZWQgYW5kIHRoZSBfX0dNUF9FWFRFUk5fSU5MSU5FCisgICBkaXJlY3RpdmUgc3VwcHJlc3NlZCwgZWcuIG1wel9maXRzX3VpbnRfcC4gIFdoZW4gYSBkaWZmZXJlbnQgYml0IG9mIGNvZGUKKyAgIGlzIHdhbnRlZCBmb3IgdGhlIGlubGluZSB0aGFuIGZvciB0aGUgbGlicmFyeSB2ZXJzaW9uLCB0aGVuCisgICBfX0dNUF9GT1JDRV9mb28gYXJyYW5nZXMgdGhlIGlubGluZSB0byBiZSBzdXBwcmVzc2VkLCBlZy4gbXB6X2Ficy4gICovCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSAmJiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9hYnMpCitfX0dNUF9FWFRFUk5fSU5MSU5FIHZvaWQKK21wel9hYnMgKG1wel9wdHIgX19nbXBfdywgbXB6X3NyY3B0ciBfX2dtcF91KQoreworICBpZiAoX19nbXBfdyAhPSBfX2dtcF91KQorICAgIG1wel9zZXQgKF9fZ21wX3csIF9fZ21wX3UpOworICBfX2dtcF93LT5fbXBfc2l6ZSA9IF9fR01QX0FCUyAoX19nbXBfdy0+X21wX3NpemUpOworfQorI2VuZGlmCisKKyNpZiBHTVBfTkFJTF9CSVRTID09IDAKKyNkZWZpbmUgX19HTVBaX0ZJVFNfVVRZUEVfUCh6LG1heHZhbCkJCQkJCVwKKyAgbXBfc2l6ZV90ICBfX2dtcF9uID0gei0+X21wX3NpemU7CQkJCQlcCisgIG1wX3B0ciAgX19nbXBfcCA9IHotPl9tcF9kOwkJCQkJCVwKKyAgcmV0dXJuIChfX2dtcF9uID09IDAgfHwgKF9fZ21wX24gPT0gMSAmJiBfX2dtcF9wWzBdIDw9IG1heHZhbCkpOworI2Vsc2UKKyNkZWZpbmUgX19HTVBaX0ZJVFNfVVRZUEVfUCh6LG1heHZhbCkJCQkJCVwKKyAgbXBfc2l6ZV90ICBfX2dtcF9uID0gei0+X21wX3NpemU7CQkJCQlcCisgIG1wX3B0ciAgX19nbXBfcCA9IHotPl9tcF9kOwkJCQkJCVwKKyAgcmV0dXJuIChfX2dtcF9uID09IDAgfHwgKF9fZ21wX24gPT0gMSAmJiBfX2dtcF9wWzBdIDw9IG1heHZhbCkJXAorCSAgfHwgKF9fZ21wX24gPT0gMiAmJiBfX2dtcF9wWzFdIDw9ICgobXBfbGltYl90KSBtYXh2YWwgPj4gR01QX05VTUJfQklUUykpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2ZpdHNfdWludF9wKQorI2lmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2ZpdHNfdWludF9wKQorX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCitpbnQKK21wel9maXRzX3VpbnRfcCAobXB6X3NyY3B0ciBfX2dtcF96KSBfX0dNUF9OT1RIUk9XCit7CisgIF9fR01QWl9GSVRTX1VUWVBFX1AgKF9fZ21wX3osIF9fR01QX1VJTlRfTUFYKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2ZpdHNfdWxvbmdfcCkKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9maXRzX3Vsb25nX3ApCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK2ludAorbXB6X2ZpdHNfdWxvbmdfcCAobXB6X3NyY3B0ciBfX2dtcF96KSBfX0dNUF9OT1RIUk9XCit7CisgIF9fR01QWl9GSVRTX1VUWVBFX1AgKF9fZ21wX3osIF9fR01QX1VMT05HX01BWCk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9maXRzX3VzaG9ydF9wKQorI2lmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2ZpdHNfdXNob3J0X3ApCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK2ludAorbXB6X2ZpdHNfdXNob3J0X3AgKG1wel9zcmNwdHIgX19nbXBfeikgX19HTVBfTk9USFJPVworeworICBfX0dNUFpfRklUU19VVFlQRV9QIChfX2dtcF96LCBfX0dNUF9VU0hSVF9NQVgpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfZ2V0X3VpKQorI2lmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2dldF91aSkKK19fR01QX0VYVEVSTl9JTkxJTkUKKyNlbmRpZgordW5zaWduZWQgbG9uZworbXB6X2dldF91aSAobXB6X3NyY3B0ciBfX2dtcF96KSBfX0dNUF9OT1RIUk9XCit7CisgIG1wX3B0ciBfX2dtcF9wID0gX19nbXBfei0+X21wX2Q7CisgIG1wX3NpemVfdCBfX2dtcF9uID0gX19nbXBfei0+X21wX3NpemU7CisgIG1wX2xpbWJfdCBfX2dtcF9sID0gX19nbXBfcFswXTsKKyAgLyogVGhpcyBpcyBhICIjaWYiIHJhdGhlciB0aGFuIGEgcGxhaW4gImlmIiBzbyBhcyB0byBhdm9pZCBnY2Mgd2FybmluZ3MKKyAgICAgYWJvdXQgIjw8IEdNUF9OVU1CX0JJVFMiIGV4Y2VlZGluZyB0aGUgdHlwZSBzaXplLCBhbmQgdG8gYXZvaWQgQm9ybGFuZAorICAgICBDKysgNi4wIHdhcm5pbmdzIGFib3V0IGNvbmRpdGlvbiBhbHdheXMgdHJ1ZSBmb3Igc29tZXRoaW5nIGxpa2UKKyAgICAgIl9fR01QX1VMT05HX01BWCA8IEdNUF9OVU1CX01BU0siLiAgKi8KKyNpZiBHTVBfTkFJTF9CSVRTID09IDAgfHwgZGVmaW5lZCAoX0xPTkdfTE9OR19MSU1CKQorICAvKiBsaW1iPT1sb25nIGFuZCBubyBuYWlscywgb3IgbGltYj09bG9uZ2xvbmcsIG9uZSBsaW1iIGlzIGVub3VnaCAqLworICByZXR1cm4gKF9fZ21wX24gIT0gMCA/IF9fZ21wX2wgOiAwKTsKKyNlbHNlCisgIC8qIGxpbWI9PWxvbmcgYW5kIG5haWxzLCBuZWVkIHR3byBsaW1icyB3aGVuIGF2YWlsYWJsZSAqLworICBfX2dtcF9uID0gX19HTVBfQUJTIChfX2dtcF9uKTsKKyAgaWYgKF9fZ21wX24gPD0gMSkKKyAgICByZXR1cm4gKF9fZ21wX24gIT0gMCA/IF9fZ21wX2wgOiAwKTsKKyAgZWxzZQorICAgIHJldHVybiBfX2dtcF9sICsgKF9fZ21wX3BbMV0gPDwgR01QX05VTUJfQklUUyk7CisjZW5kaWYKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2dldGxpbWJuKQorI2lmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2dldGxpbWJuKQorX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCittcF9saW1iX3QKK21wel9nZXRsaW1ibiAobXB6X3NyY3B0ciBfX2dtcF96LCBtcF9zaXplX3QgX19nbXBfbikgX19HTVBfTk9USFJPVworeworICBtcF9saW1iX3QgIF9fZ21wX3Jlc3VsdCA9IDA7CisgIGlmIChfX0dNUF9MSUtFTFkgKF9fZ21wX24gPj0gMCAmJiBfX2dtcF9uIDwgX19HTVBfQUJTIChfX2dtcF96LT5fbXBfc2l6ZSkpKQorICAgIF9fZ21wX3Jlc3VsdCA9IF9fZ21wX3otPl9tcF9kW19fZ21wX25dOworICByZXR1cm4gX19nbXBfcmVzdWx0OworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSAmJiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9uZWcpCitfX0dNUF9FWFRFUk5fSU5MSU5FIHZvaWQKK21wel9uZWcgKG1wel9wdHIgX19nbXBfdywgbXB6X3NyY3B0ciBfX2dtcF91KQoreworICBpZiAoX19nbXBfdyAhPSBfX2dtcF91KQorICAgIG1wel9zZXQgKF9fZ21wX3csIF9fZ21wX3UpOworICBfX2dtcF93LT5fbXBfc2l6ZSA9IC0gX19nbXBfdy0+X21wX3NpemU7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9wZXJmZWN0X3NxdWFyZV9wKQorI2lmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X3BlcmZlY3Rfc3F1YXJlX3ApCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK2ludAorbXB6X3BlcmZlY3Rfc3F1YXJlX3AgKG1wel9zcmNwdHIgX19nbXBfYSkKK3sKKyAgbXBfc2l6ZV90IF9fZ21wX2FzaXplOworICBpbnQgICAgICAgX19nbXBfcmVzdWx0OworCisgIF9fZ21wX2FzaXplID0gX19nbXBfYS0+X21wX3NpemU7CisgIF9fZ21wX3Jlc3VsdCA9IChfX2dtcF9hc2l6ZSA+PSAwKTsgIC8qIHplcm8gaXMgYSBzcXVhcmUsIG5lZ2F0aXZlcyBhcmUgbm90ICovCisgIGlmIChfX0dNUF9MSUtFTFkgKF9fZ21wX2FzaXplID4gMCkpCisgICAgX19nbXBfcmVzdWx0ID0gbXBuX3BlcmZlY3Rfc3F1YXJlX3AgKF9fZ21wX2EtPl9tcF9kLCBfX2dtcF9hc2l6ZSk7CisgIHJldHVybiBfX2dtcF9yZXN1bHQ7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9wb3Bjb3VudCkKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9wb3Bjb3VudCkKK19fR01QX0VYVEVSTl9JTkxJTkUKKyNlbmRpZgorbXBfYml0Y250X3QKK21wel9wb3Bjb3VudCAobXB6X3NyY3B0ciBfX2dtcF91KSBfX0dNUF9OT1RIUk9XCit7CisgIG1wX3NpemVfdCAgICAgIF9fZ21wX3VzaXplOworICBtcF9iaXRjbnRfdCAgICBfX2dtcF9yZXN1bHQ7CisKKyAgX19nbXBfdXNpemUgPSBfX2dtcF91LT5fbXBfc2l6ZTsKKyAgX19nbXBfcmVzdWx0ID0gKF9fZ21wX3VzaXplIDwgMCA/IF9fR01QX1VMT05HX01BWCA6IDApOworICBpZiAoX19HTVBfTElLRUxZIChfX2dtcF91c2l6ZSA+IDApKQorICAgIF9fZ21wX3Jlc3VsdCA9ICBtcG5fcG9wY291bnQgKF9fZ21wX3UtPl9tcF9kLCBfX2dtcF91c2l6ZSk7CisgIHJldHVybiBfX2dtcF9yZXN1bHQ7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9zZXRfcSkKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9zZXRfcSkKK19fR01QX0VYVEVSTl9JTkxJTkUKKyNlbmRpZgordm9pZAorbXB6X3NldF9xIChtcHpfcHRyIF9fZ21wX3csIG1wcV9zcmNwdHIgX19nbXBfdSkKK3sKKyAgbXB6X3RkaXZfcSAoX19nbXBfdywgbXBxX251bXJlZiAoX19nbXBfdSksIG1wcV9kZW5yZWYgKF9fZ21wX3UpKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X3NpemUpCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfc2l6ZSkKK19fR01QX0VYVEVSTl9JTkxJTkUKKyNlbmRpZgorc2l6ZV90CittcHpfc2l6ZSAobXB6X3NyY3B0ciBfX2dtcF96KSBfX0dNUF9OT1RIUk9XCit7CisgIHJldHVybiBfX0dNUF9BQlMgKF9fZ21wX3otPl9tcF9zaXplKTsKK30KKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqIG1wcSBpbmxpbmVzICoqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSAmJiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wcV9hYnMpCitfX0dNUF9FWFRFUk5fSU5MSU5FIHZvaWQKK21wcV9hYnMgKG1wcV9wdHIgX19nbXBfdywgbXBxX3NyY3B0ciBfX2dtcF91KQoreworICBpZiAoX19nbXBfdyAhPSBfX2dtcF91KQorICAgIG1wcV9zZXQgKF9fZ21wX3csIF9fZ21wX3UpOworICBfX2dtcF93LT5fbXBfbnVtLl9tcF9zaXplID0gX19HTVBfQUJTIChfX2dtcF93LT5fbXBfbnVtLl9tcF9zaXplKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgJiYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHFfbmVnKQorX19HTVBfRVhURVJOX0lOTElORSB2b2lkCittcHFfbmVnIChtcHFfcHRyIF9fZ21wX3csIG1wcV9zcmNwdHIgX19nbXBfdSkKK3sKKyAgaWYgKF9fZ21wX3cgIT0gX19nbXBfdSkKKyAgICBtcHFfc2V0IChfX2dtcF93LCBfX2dtcF91KTsKKyAgX19nbXBfdy0+X21wX251bS5fbXBfc2l6ZSA9IC0gX19nbXBfdy0+X21wX251bS5fbXBfc2l6ZTsKK30KKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqIG1wbiBpbmxpbmVzICoqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBjb21tZW50cyB3aXRoIF9fR01QTl9BRERfMSBiZWxvdyBhcHBseSBoZXJlIHRvby4KKworICAgVGhlIHRlc3QgZm9yIEZVTkNUSU9OIHJldHVybmluZyAwIHNob3VsZCBwcmVkaWN0IHdlbGwuICBJZiBpdCdzIGFzc3VtZWQKKyAgIHt5cCx5c2l6ZX0gd2lsbCB1c3VhbGx5IGhhdmUgYSByYW5kb20gbnVtYmVyIG9mIGJpdHMgdGhlbiB0aGUgaGlnaCBsaW1iCisgICB3b24ndCBiZSBmdWxsIGFuZCBhIGNhcnJ5IG91dCB3aWxsIG9jY3VyIGEgZ29vZCBkZWFsIGxlc3MgdGhhbiA1MCUgb2YgdGhlCisgICB0aW1lLgorCisgICB5c2l6ZT09MCBpc24ndCBhIGRvY3VtZW50ZWQgZmVhdHVyZSwgYnV0IGlzIHVzZWQgaW50ZXJuYWxseSBpbiBhIGZldworICAgcGxhY2VzLgorCisgICBQcm9kdWNpbmcgY291dCBsYXN0IHN0b3BzIGl0IHVzaW5nIHVwIGEgcmVnaXN0ZXIgZHVyaW5nIHRoZSBtYWluIHBhcnQgb2YKKyAgIHRoZSBjYWxjdWxhdGlvbiwgdGhvdWdoIGdjYyAoYXMgb2YgMy4wKSBvbiBhbiAiaWYgKG1wbl9hZGQgKC4uLikpIgorICAgZG9lc24ndCBzZWVtIGFibGUgdG8gbW92ZSB0aGUgdHJ1ZSBhbmQgZmFsc2UgbGVncyBvZiB0aGUgY29uZGl0aW9uYWwgdXAKKyAgIHRvIHRoZSB0d28gcGxhY2VzIGNvdXQgaXMgZ2VuZXJhdGVkLiAgKi8KKworI2RlZmluZSBfX0dNUE5fQU9SUyhjb3V0LCB3cCwgeHAsIHhzaXplLCB5cCwgeXNpemUsIEZVTkNUSU9OLCBURVNUKSAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wX3NpemVfdCAgX19nbXBfaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wX2xpbWJfdCAgX19nbXBfeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEFTU0VSVCAoKHlzaXplKSA+PSAwKTsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEFTU0VSVCAoKHhzaXplKSA+PSAoeXNpemUpKTsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEUyX1AgKHdwLCB4c2l6ZSwgeHAsIHhzaXplKSk7ICovICAgICAgXAorICAgIC8qIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEUyX1AgKHdwLCB4c2l6ZSwgeXAsIHlzaXplKSk7ICovICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fZ21wX2kgPSAoeXNpemUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChfX2dtcF9pICE9IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoRlVOQ1RJT04gKHdwLCB4cCwgeXAsIF9fZ21wX2kpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmIChfX2dtcF9pID49ICh4c2l6ZSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAoY291dCkgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBnb3RvIF9fZ21wX2RvbmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fZ21wX3ggPSAoeHApW19fZ21wX2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd2hpbGUgKFRFU1QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgod3ApICE9ICh4cCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX19HTVBOX0NPUFlfUkVTVCAod3AsIHhwLCB4c2l6ZSwgX19nbXBfaSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChjb3V0KSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2dtcF9kb25lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fR01QTl9BREQoY291dCwgd3AsIHhwLCB4c2l6ZSwgeXAsIHlzaXplKSAgICAgICAgICAgICAgXAorICBfX0dNUE5fQU9SUyAoY291dCwgd3AsIHhwLCB4c2l6ZSwgeXAsIHlzaXplLCBtcG5fYWRkX24sICAgICAgIFwKKyAgICAgICAgICAgICAgICgoKHdwKVtfX2dtcF9pKytdID0gKF9fZ21wX3ggKyAxKSAmIEdNUF9OVU1CX01BU0spID09IDApKQorI2RlZmluZSBfX0dNUE5fU1VCKGNvdXQsIHdwLCB4cCwgeHNpemUsIHlwLCB5c2l6ZSkgICAgICAgICAgICAgIFwKKyAgX19HTVBOX0FPUlMgKGNvdXQsIHdwLCB4cCwgeHNpemUsIHlwLCB5c2l6ZSwgbXBuX3N1Yl9uLCAgICAgICBcCisgICAgICAgICAgICAgICAoKCh3cClbX19nbXBfaSsrXSA9IChfX2dtcF94IC0gMSkgJiBHTVBfTlVNQl9NQVNLKSwgX19nbXBfeCA9PSAwKSkKKworCisvKiBUaGUgdXNlIG9mIF9fZ21wX2kgaW5kZXhpbmcgaXMgZGVzaWduZWQgdG8gZW5zdXJlIGEgY29tcGlsZSB0aW1lIHNyYz09ZHN0CisgICByZW1haW5zIG5pY2UgYW5kIGNsZWFyIHRvIHRoZSBjb21waWxlciwgc28gdGhhdCBfX0dNUE5fQ09QWV9SRVNUIGNhbgorICAgZGlzYXBwZWFyLCBhbmQgdGhlIGxvYWQvYWRkL3N0b3JlIGdldHMgYSBjaGFuY2UgdG8gYmVjb21lIGEKKyAgIHJlYWQtbW9kaWZ5LXdyaXRlIG9uIENJU0MgQ1BVcy4KKworICAgQWx0ZXJuYXRpdmVzOgorCisgICBVc2luZyBhIHBhaXIgb2YgcG9pbnRlcnMgaW5zdGVhZCBvZiBpbmRleGluZyB3b3VsZCBiZSBwb3NzaWJsZSwgYnV0IGdjYworICAgaXNuJ3QgYWJsZSB0byByZWNvZ25pc2UgY29tcGlsZS10aW1lIHNyYz09ZHN0IGluIHRoYXQgY2FzZSwgZXZlbiB3aGVuIHRoZQorICAgcG9pbnRlcnMgYXJlIGluY3JlbWVudGVkIG1vcmUgb3IgbGVzcyB0b2dldGhlci4gIE90aGVyIGNvbXBpbGVycyB3b3VsZAorICAgdmVyeSBsaWtlbHkgaGF2ZSBzaW1pbGFyIGRpZmZpY3VsdHkuCisKKyAgIGdjYyBjb3VsZCB1c2UgImlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChzcmM9PWRzdCkgJiYgc3JjPT1kc3QpIiBvcgorICAgc2ltaWxhciB0byBkZXRlY3QgYSBjb21waWxlLXRpbWUgc3JjPT1kc3QuICBUaGlzIHdvcmtzIG5pY2VseSBvbiBnY2MKKyAgIDIuOTUueCwgaXQncyBub3QgZ29vZCBvbiBnY2MgMy4wIHdoZXJlIF9fYnVpbHRpbl9jb25zdGFudF9wKHA9PXApIHNlZW1zCisgICB0byBiZSBhbHdheXMgZmFsc2UsIGZvciBhIHBvaW50ZXIgcC4gIEJ1dCB0aGUgY3VycmVudCBjb2RlIGZvcm0gc2VlbXMKKyAgIGdvb2QgZW5vdWdoIGZvciBzcmM9PWRzdCBhbnl3YXkuCisKKyAgIGdjYyBvbiB4ODYgYXMgdXN1YWwgZG9lc24ndCBnaXZlIHBhcnRpY3VsYXJseSBnb29kIGZsYWdzIGhhbmRsaW5nIGZvciB0aGUKKyAgIGNhcnJ5L2JvcnJvdyBkZXRlY3Rpb24uICBJdCdzIHRlbXB0aW5nIHRvIHdhbnQgc29tZSBtdWx0aSBpbnN0cnVjdGlvbiBhc20KKyAgIGJsb2NrcyB0byBoZWxwIGl0LCBhbmQgdGhpcyB3YXMgdHJpZWQsIGJ1dCBpbiB0cnV0aCB0aGVyZSdzIG9ubHkgYSBmZXcKKyAgIGluc3RydWN0aW9ucyB0byBzYXZlIGFuZCBhbnkgZ2FpbiBpcyBhbGwgdG9vIGVhc2lseSBsb3N0IGJ5IHJlZ2lzdGVyCisgICBqdWdnbGluZyBzZXR0aW5nIHVwIGZvciB0aGUgYXNtLiAgKi8KKworI2lmIEdNUF9OQUlMX0JJVFMgPT0gMAorI2RlZmluZSBfX0dNUE5fQU9SU18xKGNvdXQsIGRzdCwgc3JjLCBuLCB2LCBPUCwgQ0IpCQlcCisgIGRvIHsJCQkJCQkJCVwKKyAgICBtcF9zaXplX3QgIF9fZ21wX2k7CQkJCQkJXAorICAgIG1wX2xpbWJfdCAgX19nbXBfeCwgX19nbXBfcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJCQkJXAorICAgIC8qIEFTU0VSVCAoKG4pID49IDEpOyAqLwkJCQkJXAorICAgIC8qIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCAoZHN0LCBzcmMsIG4pKTsgKi8JXAorCQkJCQkJCQlcCisgICAgX19nbXBfeCA9IChzcmMpWzBdOwkJCQkJCVwKKyAgICBfX2dtcF9yID0gX19nbXBfeCBPUCAodik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGRzdClbMF0gPSBfX2dtcF9yOwkJCQkJCVwKKyAgICBpZiAoQ0IgKF9fZ21wX3IsIF9fZ21wX3gsICh2KSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7CQkJCQkJCQlcCisJKGNvdXQpID0gMTsJCQkJCQlcCisJZm9yIChfX2dtcF9pID0gMTsgX19nbXBfaSA8IChuKTspICAgICAgICAgICAgICAgICAgICAgICBcCisJICB7CQkJCQkJCVwKKwkgICAgX19nbXBfeCA9IChzcmMpW19fZ21wX2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgX19nbXBfciA9IF9fZ21wX3ggT1AgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgKGRzdClbX19nbXBfaV0gPSBfX2dtcF9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgKytfX2dtcF9pOwkJCQkJCVwKKwkgICAgaWYgKCFDQiAoX19nbXBfciwgX19nbXBfeCwgMSkpICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICB7CQkJCQkJCVwKKwkJaWYgKChzcmMpICE9IChkc3QpKQkJCQlcCisJCSAgX19HTVBOX0NPUFlfUkVTVCAoZHN0LCBzcmMsIG4sIF9fZ21wX2kpOyAgICAgIFwKKwkJKGNvdXQpID0gMDsJCQkJCVwKKwkJYnJlYWs7CQkJCQkJXAorCSAgICAgIH0JCQkJCQkJXAorCSAgfQkJCQkJCQlcCisgICAgICB9CQkJCQkJCQlcCisgICAgZWxzZQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQlcCisJaWYgKChzcmMpICE9IChkc3QpKQkJCQkJXAorCSAgX19HTVBOX0NPUFlfUkVTVCAoZHN0LCBzcmMsIG4sIDEpOwkJCVwKKwkoY291dCkgPSAwOwkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgR01QX05BSUxfQklUUyA+PSAxCisjZGVmaW5lIF9fR01QTl9BT1JTXzEoY291dCwgZHN0LCBzcmMsIG4sIHYsIE9QLCBDQikJCVwKKyAgZG8gewkJCQkJCQkJXAorICAgIG1wX3NpemVfdCAgX19nbXBfaTsJCQkJCQlcCisgICAgbXBfbGltYl90ICBfX2dtcF94LCBfX2dtcF9yOwkJCQlcCisJCQkJCQkJCVwKKyAgICAvKiBBU1NFUlQgKChuKSA+PSAxKTsgKi8JCQkJCVwKKyAgICAvKiBBU1NFUlQgKE1QTl9TQU1FX09SX1NFUEFSQVRFX1AgKGRzdCwgc3JjLCBuKSk7ICovCVwKKwkJCQkJCQkJXAorICAgIF9fZ21wX3ggPSAoc3JjKVswXTsJCQkJCQlcCisgICAgX19nbXBfciA9IF9fZ21wX3ggT1AgKHYpOwkJCQkJXAorICAgIChkc3QpWzBdID0gX19nbXBfciAmIEdNUF9OVU1CX01BU0s7CQkJCVwKKyAgICBpZiAoX19nbXBfciA+PiBHTVBfTlVNQl9CSVRTICE9IDApCQkJCVwKKyAgICAgIHsJCQkJCQkJCVwKKwkoY291dCkgPSAxOwkJCQkJCVwKKwlmb3IgKF9fZ21wX2kgPSAxOyBfX2dtcF9pIDwgKG4pOykJCQlcCisJICB7CQkJCQkJCVwKKwkgICAgX19nbXBfeCA9IChzcmMpW19fZ21wX2ldOwkJCQlcCisJICAgIF9fZ21wX3IgPSBfX2dtcF94IE9QIDE7CQkJCVwKKwkgICAgKGRzdClbX19nbXBfaV0gPSBfX2dtcF9yICYgR01QX05VTUJfTUFTSzsJCVwKKwkgICAgKytfX2dtcF9pOwkJCQkJCVwKKwkgICAgaWYgKF9fZ21wX3IgPj4gR01QX05VTUJfQklUUyA9PSAwKQkJCVwKKwkgICAgICB7CQkJCQkJCVwKKwkJaWYgKChzcmMpICE9IChkc3QpKQkJCQlcCisJCSAgX19HTVBOX0NPUFlfUkVTVCAoZHN0LCBzcmMsIG4sIF9fZ21wX2kpOwlcCisJCShjb3V0KSA9IDA7CQkJCQlcCisJCWJyZWFrOwkJCQkJCVwKKwkgICAgICB9CQkJCQkJCVwKKwkgIH0JCQkJCQkJXAorICAgICAgfQkJCQkJCQkJXAorICAgIGVsc2UJCQkJCQkJXAorICAgICAgewkJCQkJCQkJXAorCWlmICgoc3JjKSAhPSAoZHN0KSkJCQkJCVwKKwkgIF9fR01QTl9DT1BZX1JFU1QgKGRzdCwgc3JjLCBuLCAxKTsJCQlcCisJKGNvdXQpID0gMDsJCQkJCQlcCisgICAgICB9CQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBfX0dNUE5fQUREQ0Iocix4LHkpICgocikgPCAoeSkpCisjZGVmaW5lIF9fR01QTl9TVUJDQihyLHgseSkgKCh4KSA8ICh5KSkKKworI2RlZmluZSBfX0dNUE5fQUREXzEoY291dCwgZHN0LCBzcmMsIG4sIHYpCSAgICAgXAorICBfX0dNUE5fQU9SU18xKGNvdXQsIGRzdCwgc3JjLCBuLCB2LCArLCBfX0dNUE5fQUREQ0IpCisjZGVmaW5lIF9fR01QTl9TVUJfMShjb3V0LCBkc3QsIHNyYywgbiwgdikJICAgICBcCisgIF9fR01QTl9BT1JTXzEoY291dCwgZHN0LCBzcmMsIG4sIHYsIC0sIF9fR01QTl9TVUJDQikKKworCisvKiBDb21wYXJlIHt4cCxzaXplfSBhbmQge3lwLHNpemV9LCBzZXR0aW5nICJyZXN1bHQiIHRvIHBvc2l0aXZlLCB6ZXJvIG9yCisgICBuZWdhdGl2ZS4gIHNpemU9PTAgaXMgYWxsb3dlZC4gIE9uIHJhbmRvbSBkYXRhIHVzdWFsbHkgb25seSBvbmUgbGltYiB3aWxsCisgICBuZWVkIHRvIGJlIGV4YW1pbmVkIHRvIGdldCBhIHJlc3VsdCwgc28gaXQncyB3b3J0aCBoYXZpbmcgaXQgaW5saW5lLiAgKi8KKyNkZWZpbmUgX19HTVBOX0NNUChyZXN1bHQsIHhwLCB5cCwgc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtcF9zaXplX3QgIF9fZ21wX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtcF9saW1iX3QgIF9fZ21wX3gsIF9fZ21wX3k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBBU1NFUlQgKChzaXplKSA+PSAwKTsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAocmVzdWx0KSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2dtcF9pID0gKHNpemUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3aGlsZSAoLS1fX2dtcF9pID49IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19nbXBfeCA9ICh4cClbX19nbXBfaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19nbXBfeSA9ICh5cClbX19nbXBfaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKF9fZ21wX3ggIT0gX19nbXBfeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC8qIENhbm5vdCB1c2UgX19nbXBfeCAtIF9fZ21wX3ksIG1heSBvdmVyZmxvdyBhbiAiaW50IiAqLyAgIFwKKyAgICAgICAgICAgIChyZXN1bHQpID0gKF9fZ21wX3ggPiBfX2dtcF95ID8gMSA6IC0xKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworCisjaWYgZGVmaW5lZCAoX19HTVBOX0NPUFkpICYmICEgZGVmaW5lZCAoX19HTVBOX0NPUFlfUkVTVCkKKyNkZWZpbmUgX19HTVBOX0NPUFlfUkVTVChkc3QsIHNyYywgc2l6ZSwgc3RhcnQpICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEFTU0VSVCAoKHN0YXJ0KSA+PSAwKTsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBBU1NFUlQgKChzdGFydCkgPD0gKHNpemUpKTsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19HTVBOX0NPUFkgKChkc3QpKyhzdGFydCksIChzcmMpKyhzdGFydCksIChzaXplKS0oc3RhcnQpKTsgXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIENvcHkge3NyYyxzaXplfSB0byB7ZHN0LHNpemV9LCBzdGFydGluZyBhdCAic3RhcnQiLiAgVGhpcyBpcyBkZXNpZ25lZCB0bworICAga2VlcCB0aGUgaW5kZXhpbmcgZHN0W2pdIGFuZCBzcmNbal0gbmljZSBhbmQgc2ltcGxlIGZvciBfX0dNUE5fQUREXzEsCisgICBfX0dNUE5fQURELCBldGMuICAqLworI2lmICEgZGVmaW5lZCAoX19HTVBOX0NPUFlfUkVTVCkKKyNkZWZpbmUgX19HTVBOX0NPUFlfUkVTVChkc3QsIHNyYywgc2l6ZSwgc3RhcnQpICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wX3NpemVfdCBfX2dtcF9qOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBBU1NFUlQgKChzaXplKSA+PSAwKTsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogQVNTRVJUICgoc3RhcnQpID49IDApOyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEFTU0VSVCAoKHN0YXJ0KSA8PSAoc2l6ZSkpOyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBBU1NFUlQgKE1QTl9TQU1FX09SX1NFUEFSQVRFX1AgKGRzdCwgc3JjLCBzaXplKSk7ICovICAgICBcCisgICAgX19HTVBfQ1JBWV9QcmFnbWEgKCJfQ1JJIGl2ZGVwIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoX19nbXBfaiA9IChzdGFydCk7IF9fZ21wX2ogPCAoc2l6ZSk7IF9fZ21wX2orKykgICAgICAgIFwKKyAgICAgIChkc3QpW19fZ21wX2pdID0gKHNyYylbX19nbXBfal07ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogRW5oYW5jZW1lbnQ6IFVzZSBzb21lIG9mIHRoZSBzbWFydGVyIGNvZGUgZnJvbSBnbXAtaW1wbC5oLiAgTWF5YmUgdXNlCisgICBtcG5fY29weWkgaWYgdGhlcmUncyBhIG5hdGl2ZSB2ZXJzaW9uLCBhbmQgaWYgd2UgZG9uJ3QgbWluZCBkZW1hbmRpbmcKKyAgIGJpbmFyeSBjb21wYXRpYmlsaXR5IGZvciBpdCAob24gdGFyZ2V0cyB3aGljaCB1c2UgaXQpLiAgKi8KKworI2lmICEgZGVmaW5lZCAoX19HTVBOX0NPUFkpCisjZGVmaW5lIF9fR01QTl9DT1BZKGRzdCwgc3JjLCBzaXplKSAgIF9fR01QTl9DT1BZX1JFU1QgKGRzdCwgc3JjLCBzaXplLCAwKQorI2VuZGlmCisKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9hZGQpCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fYWRkKQorX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCittcF9saW1iX3QKK21wbl9hZGQgKG1wX3B0ciBfX2dtcF93cCwgbXBfc3JjcHRyIF9fZ21wX3hwLCBtcF9zaXplX3QgX19nbXBfeHNpemUsIG1wX3NyY3B0ciBfX2dtcF95cCwgbXBfc2l6ZV90IF9fZ21wX3lzaXplKQoreworICBtcF9saW1iX3QgIF9fZ21wX2M7CisgIF9fR01QTl9BREQgKF9fZ21wX2MsIF9fZ21wX3dwLCBfX2dtcF94cCwgX19nbXBfeHNpemUsIF9fZ21wX3lwLCBfX2dtcF95c2l6ZSk7CisgIHJldHVybiBfX2dtcF9jOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fYWRkXzEpCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fYWRkXzEpCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK21wX2xpbWJfdAorbXBuX2FkZF8xIChtcF9wdHIgX19nbXBfZHN0LCBtcF9zcmNwdHIgX19nbXBfc3JjLCBtcF9zaXplX3QgX19nbXBfc2l6ZSwgbXBfbGltYl90IF9fZ21wX24pIF9fR01QX05PVEhST1cKK3sKKyAgbXBfbGltYl90ICBfX2dtcF9jOworICBfX0dNUE5fQUREXzEgKF9fZ21wX2MsIF9fZ21wX2RzdCwgX19nbXBfc3JjLCBfX2dtcF9zaXplLCBfX2dtcF9uKTsKKyAgcmV0dXJuIF9fZ21wX2M7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9jbXApCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fY21wKQorX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCitpbnQKK21wbl9jbXAgKG1wX3NyY3B0ciBfX2dtcF94cCwgbXBfc3JjcHRyIF9fZ21wX3lwLCBtcF9zaXplX3QgX19nbXBfc2l6ZSkgX19HTVBfTk9USFJPVworeworICBpbnQgX19nbXBfcmVzdWx0OworICBfX0dNUE5fQ01QIChfX2dtcF9yZXN1bHQsIF9fZ21wX3hwLCBfX2dtcF95cCwgX19nbXBfc2l6ZSk7CisgIHJldHVybiBfX2dtcF9yZXN1bHQ7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9zdWIpCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fc3ViKQorX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCittcF9saW1iX3QKK21wbl9zdWIgKG1wX3B0ciBfX2dtcF93cCwgbXBfc3JjcHRyIF9fZ21wX3hwLCBtcF9zaXplX3QgX19nbXBfeHNpemUsIG1wX3NyY3B0ciBfX2dtcF95cCwgbXBfc2l6ZV90IF9fZ21wX3lzaXplKQoreworICBtcF9saW1iX3QgIF9fZ21wX2M7CisgIF9fR01QTl9TVUIgKF9fZ21wX2MsIF9fZ21wX3dwLCBfX2dtcF94cCwgX19nbXBfeHNpemUsIF9fZ21wX3lwLCBfX2dtcF95c2l6ZSk7CisgIHJldHVybiBfX2dtcF9jOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fc3ViXzEpCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fc3ViXzEpCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK21wX2xpbWJfdAorbXBuX3N1Yl8xIChtcF9wdHIgX19nbXBfZHN0LCBtcF9zcmNwdHIgX19nbXBfc3JjLCBtcF9zaXplX3QgX19nbXBfc2l6ZSwgbXBfbGltYl90IF9fZ21wX24pIF9fR01QX05PVEhST1cKK3sKKyAgbXBfbGltYl90ICBfX2dtcF9jOworICBfX0dNUE5fU1VCXzEgKF9fZ21wX2MsIF9fZ21wX2RzdCwgX19nbXBfc3JjLCBfX2dtcF9zaXplLCBfX2dtcF9uKTsKKyAgcmV0dXJuIF9fZ21wX2M7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9uZWcpCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fbmVnKQorX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCittcF9saW1iX3QKK21wbl9uZWcgKG1wX3B0ciBfX2dtcF9ycCwgbXBfc3JjcHRyIF9fZ21wX3VwLCBtcF9zaXplX3QgX19nbXBfbikKK3sKKyAgbXBfbGltYl90IF9fZ21wX3VsLCBfX2dtcF9jeTsKKyAgX19nbXBfY3kgPSAwOworICBkbyB7CisgICAgICBfX2dtcF91bCA9ICpfX2dtcF91cCsrOworICAgICAgKl9fZ21wX3JwKysgPSAtX19nbXBfdWwgLSBfX2dtcF9jeTsKKyAgICAgIF9fZ21wX2N5IHw9IF9fZ21wX3VsICE9IDA7CisgIH0gd2hpbGUgKC0tX19nbXBfbiAhPSAwKTsKKyAgcmV0dXJuIF9fZ21wX2N5OworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisKKy8qIEFsbG93IGZhc3RlciB0ZXN0aW5nIGZvciBuZWdhdGl2ZSwgemVybywgYW5kIHBvc2l0aXZlLiAgKi8KKyNkZWZpbmUgbXB6X3NnbihaKSAoKFopLT5fbXBfc2l6ZSA8IDAgPyAtMSA6IChaKS0+X21wX3NpemUgPiAwKQorI2RlZmluZSBtcGZfc2duKEYpICgoRiktPl9tcF9zaXplIDwgMCA/IC0xIDogKEYpLT5fbXBfc2l6ZSA+IDApCisjZGVmaW5lIG1wcV9zZ24oUSkgKChRKS0+X21wX251bS5fbXBfc2l6ZSA8IDAgPyAtMSA6IChRKS0+X21wX251bS5fbXBfc2l6ZSA+IDApCisKKy8qIFdoZW4gdXNpbmcgR0NDLCBvcHRpbWl6ZSBjZXJ0YWluIGNvbW1vbiBjb21wYXJpc29ucy4gICovCisjaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIF9fR05VQ19fID49IDIKKyNkZWZpbmUgbXB6X2NtcF91aShaLFVJKSBcCisgIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoVUkpICYmIChVSSkgPT0gMAkJCQlcCisgICA/IG1wel9zZ24gKFopIDogX21wel9jbXBfdWkgKFosVUkpKQorI2RlZmluZSBtcHpfY21wX3NpKFosU0kpIFwKKyAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChTSSkgJiYgKFNJKSA9PSAwID8gbXB6X3NnbiAoWikJCQlcCisgICA6IF9fYnVpbHRpbl9jb25zdGFudF9wIChTSSkgJiYgKFNJKSA+IDAJCQkJXAorICAgID8gX21wel9jbXBfdWkgKFosIF9fR01QX0NBU1QgKHVuc2lnbmVkIGxvbmcgaW50LCBTSSkpCQlcCisgICA6IF9tcHpfY21wX3NpIChaLFNJKSkKKyNkZWZpbmUgbXBxX2NtcF91aShRLE5VSSxEVUkpIFwKKyAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChOVUkpICYmIChOVUkpID09IDAJCQkJXAorICAgPyBtcHFfc2duIChRKSA6IF9tcHFfY21wX3VpIChRLE5VSSxEVUkpKQorI2RlZmluZSBtcHFfY21wX3NpKHEsbixkKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAoX19idWlsdGluX2NvbnN0YW50X3AgKChuKSA+PSAwKSAmJiAobikgPj0gMCAgXAorICAgPyBtcHFfY21wX3VpIChxLCBfX0dNUF9DQVNUICh1bnNpZ25lZCBsb25nLCBuKSwgZCkgXAorICAgOiBfbXBxX2NtcF9zaSAocSwgbiwgZCkpCisjZWxzZQorI2RlZmluZSBtcHpfY21wX3VpKFosVUkpIF9tcHpfY21wX3VpIChaLFVJKQorI2RlZmluZSBtcHpfY21wX3NpKFosVUkpIF9tcHpfY21wX3NpIChaLFVJKQorI2RlZmluZSBtcHFfY21wX3VpKFEsTlVJLERVSSkgX21wcV9jbXBfdWkgKFEsTlVJLERVSSkKKyNkZWZpbmUgbXBxX2NtcF9zaShxLG4sZCkgIF9tcHFfY21wX3NpKHEsbixkKQorI2VuZGlmCisKKworLyogVXNpbmcgIiYiIHJhdGhlciB0aGFuICImJiIgbWVhbnMgdGhlc2UgY2FuIGNvbWUgb3V0IGJyYW5jaC1mcmVlLiAgRXZlcnkKKyAgIG1wel90IGhhcyBhdCBsZWFzdCBvbmUgbGltYiBhbGxvY2F0ZWQsIHNvIGZldGNoaW5nIHRoZSBsb3cgbGltYiBpcyBhbHdheXMKKyAgIGFsbG93ZWQuICAqLworI2RlZmluZSBtcHpfb2RkX3AoeikgICAoKCh6KS0+X21wX3NpemUgIT0gMCkgJiBfX0dNUF9DQVNUIChpbnQsICh6KS0+X21wX2RbMF0pKQorI2RlZmluZSBtcHpfZXZlbl9wKHopICAoISBtcHpfb2RkX3AgKHopKQorCisKKy8qKioqKioqKioqKioqKioqIEMrKyByb3V0aW5lcyAqKioqKioqKioqKioqKioqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK19fR01QX0RFQ0xTUEVDX1hYIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCAoc3RkOjpvc3RyZWFtICYsIG1wel9zcmNwdHIpOworX19HTVBfREVDTFNQRUNfWFggc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8IChzdGQ6Om9zdHJlYW0gJiwgbXBxX3NyY3B0cik7CitfX0dNUF9ERUNMU1BFQ19YWCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgKHN0ZDo6b3N0cmVhbSAmLCBtcGZfc3JjcHRyKTsKK19fR01QX0RFQ0xTUEVDX1hYIHN0ZDo6aXN0cmVhbSYgb3BlcmF0b3I+PiAoc3RkOjppc3RyZWFtICYsIG1wel9wdHIpOworX19HTVBfREVDTFNQRUNfWFggc3RkOjppc3RyZWFtJiBvcGVyYXRvcj4+IChzdGQ6OmlzdHJlYW0gJiwgbXBxX3B0cik7CitfX0dNUF9ERUNMU1BFQ19YWCBzdGQ6OmlzdHJlYW0mIG9wZXJhdG9yPj4gKHN0ZDo6aXN0cmVhbSAmLCBtcGZfcHRyKTsKKyNlbmRpZgorCisKKy8qIFNvdXJjZS1sZXZlbCBjb21wYXRpYmlsaXR5IHdpdGggR01QIDIgYW5kIGVhcmxpZXIuICovCisjZGVmaW5lIG1wbl9kaXZtb2QocXAsbnAsbnNpemUsZHAsZHNpemUpIFwKKyAgbXBuX2RpdnJlbSAocXAsIF9fR01QX0NBU1QgKG1wX3NpemVfdCwgMCksIG5wLCBuc2l6ZSwgZHAsIGRzaXplKQorCisvKiBTb3VyY2UtbGV2ZWwgY29tcGF0aWJpbGl0eSB3aXRoIEdNUCAxLiAgKi8KKyNkZWZpbmUgbXB6X21kaXYJbXB6X2ZkaXZfcQorI2RlZmluZSBtcHpfbWRpdm1vZAltcHpfZmRpdl9xcgorI2RlZmluZSBtcHpfbW1vZAltcHpfZmRpdl9yCisjZGVmaW5lIG1wel9tZGl2X3VpCW1wel9mZGl2X3FfdWkKKyNkZWZpbmUgbXB6X21kaXZtb2RfdWkocSxyLG4sZCkgXAorICAoKChyKSA9PSAwKSA/IG1wel9mZGl2X3FfdWkgKHEsbixkKSA6IG1wel9mZGl2X3FyX3VpIChxLHIsbixkKSkKKyNkZWZpbmUgbXB6X21tb2RfdWkocixuLGQpIFwKKyAgKCgocikgPT0gMCkgPyBtcHpfZmRpdl91aSAobixkKSA6IG1wel9mZGl2X3JfdWkgKHIsbixkKSkKKworLyogVXNlZnVsIHN5bm9ueW1zLCBidXQgbm90IHF1aXRlIGNvbXBhdGlibGUgd2l0aCBHTVAgMS4gICovCisjZGVmaW5lIG1wel9kaXYJCW1wel9mZGl2X3EKKyNkZWZpbmUgbXB6X2Rpdm1vZAltcHpfZmRpdl9xcgorI2RlZmluZSBtcHpfZGl2X3VpCW1wel9mZGl2X3FfdWkKKyNkZWZpbmUgbXB6X2Rpdm1vZF91aQltcHpfZmRpdl9xcl91aQorI2RlZmluZSBtcHpfZGl2XzJleHAJbXB6X2ZkaXZfcV8yZXhwCisjZGVmaW5lIG1wel9tb2RfMmV4cAltcHpfZmRpdl9yXzJleHAKKworZW51bQoreworICBHTVBfRVJST1JfTk9ORSA9IDAsCisgIEdNUF9FUlJPUl9VTlNVUFBPUlRFRF9BUkdVTUVOVCA9IDEsCisgIEdNUF9FUlJPUl9ESVZJU0lPTl9CWV9aRVJPID0gMiwKKyAgR01QX0VSUk9SX1NRUlRfT0ZfTkVHQVRJVkUgPSA0LAorICBHTVBfRVJST1JfSU5WQUxJRF9BUkdVTUVOVCA9IDgKK307CisKKy8qIERlZmluZSBDQyBhbmQgQ0ZMQUdTIHdoaWNoIHdlcmUgdXNlZCB0byBidWlsZCB0aGlzIHZlcnNpb24gb2YgR01QICovCisjZGVmaW5lIF9fR01QX0NDICIvZGlzazQvY2hoL0FPU1AvbWFzdGVyL3ByZWJ1aWx0cy9nY2MvbGludXgteDg2L2hvc3QveDg2XzY0LWxpbnV4LWdsaWJjMi4xMS00LjgvYmluL3g4Nl82NC1saW51eC1nY2MgLXN0ZD1nbnU5OSIKKyNkZWZpbmUgX19HTVBfQ0ZMQUdTICItTzIgLXBlZGFudGljIC1tNjQgLW10dW5lPWs4IC1tYXJjaD1rOCIKKworLyogTWFqb3IgdmVyc2lvbiBudW1iZXIgaXMgdGhlIHZhbHVlIG9mIF9fR05VX01QX18gdG9vLCBhYm92ZSBhbmQgaW4gbXAuaC4gKi8KKyNkZWZpbmUgX19HTlVfTVBfVkVSU0lPTiA1CisjZGVmaW5lIF9fR05VX01QX1ZFUlNJT05fTUlOT1IgMAorI2RlZmluZSBfX0dOVV9NUF9WRVJTSU9OX1BBVENITEVWRUwgNQorI2RlZmluZSBfX0dOVV9NUF9SRUxFQVNFIChfX0dOVV9NUF9WRVJTSU9OICogMTAwMDAgKyBfX0dOVV9NUF9WRVJTSU9OX01JTk9SICogMTAwICsgX19HTlVfTVBfVkVSU0lPTl9QQVRDSExFVkVMKQorCisjZGVmaW5lIF9fR01QX0hfXworI2VuZGlmIC8qIF9fR01QX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pc2wvYWZmLmggYi9pbmNsdWRlL2lzbC9hZmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGUxNmM4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9pc2wvYWZmLmgKQEAgLTAsMCArMSw1NjYgQEAKKyNpZm5kZWYgSVNMX0FGRl9ICisjZGVmaW5lIElTTF9BRkZfSAorCisjaW5jbHVkZSA8aXNsL2xvY2FsX3NwYWNlLmg+CisjaW5jbHVkZSA8aXNsL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxpc2wvc2V0X3R5cGUuaD4KKyNpbmNsdWRlIDxpc2wvYWZmX3R5cGUuaD4KKyNpbmNsdWRlIDxpc2wvbGlzdC5oPgorI2luY2x1ZGUgPGlzbC9tdWx0aS5oPgorI2luY2x1ZGUgPGlzbC91bmlvbl9zZXRfdHlwZS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl96ZXJvX29uX2RvbWFpbihfX2lzbF90YWtlIGlzbF9sb2NhbF9zcGFjZSAqbHMpOworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX3Zhcl9vbl9kb21haW4oX19pc2xfdGFrZSBpc2xfbG9jYWxfc3BhY2UgKmxzLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CisKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9jb3B5KF9faXNsX2tlZXAgaXNsX2FmZiAqYWZmKTsKK3ZvaWQgKmlzbF9hZmZfZnJlZShfX2lzbF90YWtlIGlzbF9hZmYgKmFmZik7CisKK2lzbF9jdHggKmlzbF9hZmZfZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF9hZmYgKmFmZik7CisKK2ludCBpc2xfYWZmX2RpbShfX2lzbF9rZWVwIGlzbF9hZmYgKmFmZiwgZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CitpbnQgaXNsX2FmZl9pbnZvbHZlc19kaW1zKF9faXNsX2tlZXAgaXNsX2FmZiAqYWZmLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKKworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9hZmZfZ2V0X2RvbWFpbl9zcGFjZShfX2lzbF9rZWVwIGlzbF9hZmYgKmFmZik7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2FmZl9nZXRfc3BhY2UoX19pc2xfa2VlcCBpc2xfYWZmICphZmYpOworX19pc2xfZ2l2ZSBpc2xfbG9jYWxfc3BhY2UgKmlzbF9hZmZfZ2V0X2RvbWFpbl9sb2NhbF9zcGFjZSgKKwlfX2lzbF9rZWVwIGlzbF9hZmYgKmFmZik7CitfX2lzbF9naXZlIGlzbF9sb2NhbF9zcGFjZSAqaXNsX2FmZl9nZXRfbG9jYWxfc3BhY2UoX19pc2xfa2VlcCBpc2xfYWZmICphZmYpOworCitjb25zdCBjaGFyICppc2xfYWZmX2dldF9kaW1fbmFtZShfX2lzbF9rZWVwIGlzbF9hZmYgKmFmZiwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworaW50IGlzbF9hZmZfZ2V0X2NvbnN0YW50KF9faXNsX2tlZXAgaXNsX2FmZiAqYWZmLCBpc2xfaW50ICp2KTsKK2ludCBpc2xfYWZmX2dldF9jb2VmZmljaWVudChfX2lzbF9rZWVwIGlzbF9hZmYgKmFmZiwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBpbnQgcG9zLCBpc2xfaW50ICp2KTsKK2ludCBpc2xfYWZmX2dldF9kZW5vbWluYXRvcihfX2lzbF9rZWVwIGlzbF9hZmYgKmFmZiwgaXNsX2ludCAqdik7CitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfc2V0X2NvbnN0YW50KF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmLCBpc2xfaW50IHYpOworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX3NldF9jb25zdGFudF9zaShfX2lzbF90YWtlIGlzbF9hZmYgKmFmZiwgaW50IHYpOworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX3NldF9jb2VmZmljaWVudChfX2lzbF90YWtlIGlzbF9hZmYgKmFmZiwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBpbnQgcG9zLCBpc2xfaW50IHYpOworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX3NldF9jb2VmZmljaWVudF9zaShfX2lzbF90YWtlIGlzbF9hZmYgKmFmZiwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBpbnQgcG9zLCBpbnQgdik7CitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfc2V0X2Rlbm9taW5hdG9yKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmLCBpc2xfaW50IHYpOworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX2FkZF9jb25zdGFudChfX2lzbF90YWtlIGlzbF9hZmYgKmFmZiwgaXNsX2ludCB2KTsKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9hZGRfY29uc3RhbnRfc2koX19pc2xfdGFrZSBpc2xfYWZmICphZmYsIGludCB2KTsKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9hZGRfY29uc3RhbnRfbnVtKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmLAorCWlzbF9pbnQgdik7CitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfYWRkX2NvbnN0YW50X251bV9zaShfX2lzbF90YWtlIGlzbF9hZmYgKmFmZiwgaW50IHYpOworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX2FkZF9jb2VmZmljaWVudChfX2lzbF90YWtlIGlzbF9hZmYgKmFmZiwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBpbnQgcG9zLCBpc2xfaW50IHYpOworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX2FkZF9jb2VmZmljaWVudF9zaShfX2lzbF90YWtlIGlzbF9hZmYgKmFmZiwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBpbnQgcG9zLCBpbnQgdik7CisKK2ludCBpc2xfYWZmX2lzX2NzdChfX2lzbF9rZWVwIGlzbF9hZmYgKmFmZik7CisKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9zZXRfZGltX25hbWUoX19pc2xfdGFrZSBpc2xfYWZmICphZmYsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBjb25zdCBjaGFyICpzKTsKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9zZXRfZGltX2lkKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgX19pc2xfdGFrZSBpc2xfaWQgKmlkKTsKKworaW50IGlzbF9hZmZfcGxhaW5faXNfZXF1YWwoX19pc2xfa2VlcCBpc2xfYWZmICphZmYxLCBfX2lzbF9rZWVwIGlzbF9hZmYgKmFmZjIpOworaW50IGlzbF9hZmZfcGxhaW5faXNfemVybyhfX2lzbF9rZWVwIGlzbF9hZmYgKmFmZik7CisKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9nZXRfZGl2KF9faXNsX2tlZXAgaXNsX2FmZiAqYWZmLCBpbnQgcG9zKTsKKworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX25lZyhfX2lzbF90YWtlIGlzbF9hZmYgKmFmZik7CitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfY2VpbChfX2lzbF90YWtlIGlzbF9hZmYgKmFmZik7CitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfZmxvb3IoX19pc2xfdGFrZSBpc2xfYWZmICphZmYpOworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX21vZChfX2lzbF90YWtlIGlzbF9hZmYgKmFmZiwgaXNsX2ludCBtb2QpOworCitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfbXVsKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmMSwKKwlfX2lzbF90YWtlIGlzbF9hZmYgKmFmZjIpOworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX2RpdihfX2lzbF90YWtlIGlzbF9hZmYgKmFmZjEsCisJX19pc2xfdGFrZSBpc2xfYWZmICphZmYyKTsKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9hZGQoX19pc2xfdGFrZSBpc2xfYWZmICphZmYxLAorCV9faXNsX3Rha2UgaXNsX2FmZiAqYWZmMik7CitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfc3ViKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmMSwKKwlfX2lzbF90YWtlIGlzbF9hZmYgKmFmZjIpOworCitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfc2NhbGUoX19pc2xfdGFrZSBpc2xfYWZmICphZmYsIGlzbF9pbnQgZik7CitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfc2NhbGVfZG93bihfX2lzbF90YWtlIGlzbF9hZmYgKmFmZiwgaXNsX2ludCBmKTsKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9zY2FsZV9kb3duX3VpKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmLCB1bnNpZ25lZCBmKTsKKworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX2luc2VydF9kaW1zKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9hZGRfZGltcyhfX2lzbF90YWtlIGlzbF9hZmYgKmFmZiwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9kcm9wX2RpbXMoX19pc2xfdGFrZSBpc2xfYWZmICphZmYsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX3Byb2plY3RfZG9tYWluX29uX3BhcmFtcyhfX2lzbF90YWtlIGlzbF9hZmYgKmFmZik7CisKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9hbGlnbl9wYXJhbXMoX19pc2xfdGFrZSBpc2xfYWZmICphZmYsCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKm1vZGVsKTsKKworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX2dpc3QoX19pc2xfdGFrZSBpc2xfYWZmICphZmYsCisJX19pc2xfdGFrZSBpc2xfc2V0ICpjb250ZXh0KTsKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2FmZl9naXN0X3BhcmFtcyhfX2lzbF90YWtlIGlzbF9hZmYgKmFmZiwKKwlfX2lzbF90YWtlIGlzbF9zZXQgKmNvbnRleHQpOworCitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9hZmZfcHVsbGJhY2tfbXVsdGlfYWZmKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmLAorCV9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWEpOworCitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9hZmZfemVyb19iYXNpY19zZXQoX19pc2xfdGFrZSBpc2xfYWZmICphZmYpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYWZmX25lZ19iYXNpY19zZXQoX19pc2xfdGFrZSBpc2xfYWZmICphZmYpOworCitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9hZmZfbGVfYmFzaWNfc2V0KF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmMSwKKwlfX2lzbF90YWtlIGlzbF9hZmYgKmFmZjIpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYWZmX2dlX2Jhc2ljX3NldChfX2lzbF90YWtlIGlzbF9hZmYgKmFmZjEsCisJX19pc2xfdGFrZSBpc2xfYWZmICphZmYyKTsKKworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYWZmX3JlYWRfZnJvbV9zdHIoaXNsX2N0eCAqY3R4LCBjb25zdCBjaGFyICpzdHIpOworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfcHJpbnRfYWZmKF9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsCisJX19pc2xfa2VlcCBpc2xfYWZmICphZmYpOwordm9pZCBpc2xfYWZmX2R1bXAoX19pc2xfa2VlcCBpc2xfYWZmICphZmYpOworCitpc2xfY3R4ICppc2xfcHdfYWZmX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfcHdfYWZmICpwd2FmZik7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3B3X2FmZl9nZXRfZG9tYWluX3NwYWNlKF9faXNsX2tlZXAgaXNsX3B3X2FmZiAqcHdhZmYpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9wd19hZmZfZ2V0X3NwYWNlKF9faXNsX2tlZXAgaXNsX3B3X2FmZiAqcHdhZmYpOworCitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfZnJvbV9hZmYoX19pc2xfdGFrZSBpc2xfYWZmICphZmYpOworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX2VtcHR5KF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX2FsbG9jKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCV9faXNsX3Rha2UgaXNsX2FmZiAqYWZmKTsKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl96ZXJvX29uX2RvbWFpbigKKwlfX2lzbF90YWtlIGlzbF9sb2NhbF9zcGFjZSAqbHMpOworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX3Zhcl9vbl9kb21haW4oX19pc2xfdGFrZSBpc2xfbG9jYWxfc3BhY2UgKmxzLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CisKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3NldF9pbmRpY2F0b3JfZnVuY3Rpb24oX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworCitjb25zdCBjaGFyICppc2xfcHdfYWZmX2dldF9kaW1fbmFtZShfX2lzbF9rZWVwIGlzbF9wd19hZmYgKnBhLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CitpbnQgaXNsX3B3X2FmZl9oYXNfZGltX2lkKF9faXNsX2tlZXAgaXNsX3B3X2FmZiAqcGEsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK19faXNsX2dpdmUgaXNsX2lkICppc2xfcHdfYWZmX2dldF9kaW1faWQoX19pc2xfa2VlcCBpc2xfcHdfYWZmICpwYSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX3NldF9kaW1faWQoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwbWEsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBfX2lzbF90YWtlIGlzbF9pZCAqaWQpOworCitpbnQgaXNsX3B3X2FmZl9pc19lbXB0eShfX2lzbF9rZWVwIGlzbF9wd19hZmYgKnB3YWZmKTsKK2ludCBpc2xfcHdfYWZmX3BsYWluX2lzX2VxdWFsKF9faXNsX2tlZXAgaXNsX3B3X2FmZiAqcHdhZmYxLAorCV9faXNsX2tlZXAgaXNsX3B3X2FmZiAqcHdhZmYyKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX3VuaW9uX21pbihfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmMSwKKwlfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmMik7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfdW5pb25fbWF4KF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYxLAorCV9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYyKTsKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl91bmlvbl9hZGQoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZjEsCisJX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZjIpOworCitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfY29weShfX2lzbF9rZWVwIGlzbF9wd19hZmYgKnB3YWZmKTsKK3ZvaWQgKmlzbF9wd19hZmZfZnJlZShfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmKTsKKwordW5zaWduZWQgaXNsX3B3X2FmZl9kaW0oX19pc2xfa2VlcCBpc2xfcHdfYWZmICpwd2FmZiwgZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CitpbnQgaXNsX3B3X2FmZl9pbnZvbHZlc19kaW1zKF9faXNsX2tlZXAgaXNsX3B3X2FmZiAqcHdhZmYsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworCitpbnQgaXNsX3B3X2FmZl9pc19jc3QoX19pc2xfa2VlcCBpc2xfcHdfYWZmICpwd2FmZik7CisKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl9hbGlnbl9wYXJhbXMoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZiwKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqbW9kZWwpOworCitfX2lzbF9naXZlIGlzbF9pZCAqaXNsX3B3X2FmZl9nZXRfdHVwbGVfaWQoX19pc2xfa2VlcCBpc2xfcHdfYWZmICpwYSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl9zZXRfdHVwbGVfaWQoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZiwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBfX2lzbF90YWtlIGlzbF9pZCAqaWQpOworCitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9wd19hZmZfZG9tYWluKF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYpOworCitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfbWluKF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYxLAorCV9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYyKTsKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl9tYXgoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZjEsCisJX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZjIpOworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX211bChfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmMSwKKwlfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmMik7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfZGl2KF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcGExLAorCV9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcGEyKTsKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl9hZGQoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZjEsCisJX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZjIpOworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX3N1YihfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmMSwKKwlfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmMik7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfbmVnKF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYpOworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX2NlaWwoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZik7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfZmxvb3IoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZik7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfbW9kKF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYsCisJaXNsX2ludCBtb2QpOworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX3RkaXZfcShfX2lzbF90YWtlIGlzbF9wd19hZmYgKnBhMSwKKwlfX2lzbF90YWtlIGlzbF9wd19hZmYgKnBhMik7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfdGRpdl9yKF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcGExLAorCV9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcGEyKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX2ludGVyc2VjdF9wYXJhbXMoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwYSwKKwlfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfaW50ZXJzZWN0X2RvbWFpbihfX2lzbF90YWtlIGlzbF9wd19hZmYgKnBhLAorCV9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX2NvbmQoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpjb25kLAorCV9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmZfdHJ1ZSwgX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZl9mYWxzZSk7CisKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl9zY2FsZShfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmLAorCWlzbF9pbnQgZik7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfc2NhbGVfZG93bihfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmLAorCWlzbF9pbnQgZik7CisKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl9pbnNlcnRfZGltcyhfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl9hZGRfZGltcyhfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX2Ryb3BfZGltcyhfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX2NvYWxlc2NlKF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdxcCk7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfZ2lzdChfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmLAorCV9faXNsX3Rha2UgaXNsX3NldCAqY29udGV4dCk7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfZ2lzdF9wYXJhbXMoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZiwKKwlfX2lzbF90YWtlIGlzbF9zZXQgKmNvbnRleHQpOworCitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19hZmZfcHVsbGJhY2tfbXVsdGlfYWZmKAorCV9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcGEsIF9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWEpOworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX3B1bGxiYWNrX3B3X211bHRpX2FmZigKKwlfX2lzbF90YWtlIGlzbF9wd19hZmYgKnBhLCBfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYSk7CisKK2ludCBpc2xfcHdfYWZmX25fcGllY2UoX19pc2xfa2VlcCBpc2xfcHdfYWZmICpwd2FmZik7CitpbnQgaXNsX3B3X2FmZl9mb3JlYWNoX3BpZWNlKF9faXNsX2tlZXAgaXNsX3B3X2FmZiAqcHdhZmYsCisJaW50ICgqZm4pKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LCBfX2lzbF90YWtlIGlzbF9hZmYgKmFmZiwKKwkJICAgIHZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKKworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2Zyb21fcHdfYWZmKF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2Zyb21fcHdfYWZmKF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYpOworCitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9wd19hZmZfbm9ubmVnX3NldChfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3B3X2FmZl96ZXJvX3NldChfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3B3X2FmZl9ub25femVyb19zZXQoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZik7CisKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3B3X2FmZl9lcV9zZXQoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZjEsCisJX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZjIpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfcHdfYWZmX25lX3NldChfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmMSwKKwlfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmMik7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9wd19hZmZfbGVfc2V0KF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYxLAorCV9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYyKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3B3X2FmZl9sdF9zZXQoX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZjEsCisJX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwd2FmZjIpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfcHdfYWZmX2dlX3NldChfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmMSwKKwlfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmMik7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9wd19hZmZfZ3Rfc2V0KF9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYxLAorCV9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcHdhZmYyKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX3JlYWRfZnJvbV9zdHIoaXNsX2N0eCAqY3R4LCBjb25zdCBjaGFyICpzdHIpOworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfcHJpbnRfcHdfYWZmKF9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsCisJX19pc2xfa2VlcCBpc2xfcHdfYWZmICpwd2FmZik7Cit2b2lkIGlzbF9wd19hZmZfZHVtcChfX2lzbF9rZWVwIGlzbF9wd19hZmYgKnB3YWZmKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfcHdfYWZmX2xpc3RfbWluKF9faXNsX3Rha2UgaXNsX3B3X2FmZl9saXN0ICpsaXN0KTsKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3B3X2FmZl9saXN0X21heChfX2lzbF90YWtlIGlzbF9wd19hZmZfbGlzdCAqbGlzdCk7CisKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3B3X2FmZl9saXN0X2VxX3NldChfX2lzbF90YWtlIGlzbF9wd19hZmZfbGlzdCAqbGlzdDEsCisJX19pc2xfdGFrZSBpc2xfcHdfYWZmX2xpc3QgKmxpc3QyKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3B3X2FmZl9saXN0X25lX3NldChfX2lzbF90YWtlIGlzbF9wd19hZmZfbGlzdCAqbGlzdDEsCisJX19pc2xfdGFrZSBpc2xfcHdfYWZmX2xpc3QgKmxpc3QyKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3B3X2FmZl9saXN0X2xlX3NldChfX2lzbF90YWtlIGlzbF9wd19hZmZfbGlzdCAqbGlzdDEsCisJX19pc2xfdGFrZSBpc2xfcHdfYWZmX2xpc3QgKmxpc3QyKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3B3X2FmZl9saXN0X2x0X3NldChfX2lzbF90YWtlIGlzbF9wd19hZmZfbGlzdCAqbGlzdDEsCisJX19pc2xfdGFrZSBpc2xfcHdfYWZmX2xpc3QgKmxpc3QyKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3B3X2FmZl9saXN0X2dlX3NldChfX2lzbF90YWtlIGlzbF9wd19hZmZfbGlzdCAqbGlzdDEsCisJX19pc2xfdGFrZSBpc2xfcHdfYWZmX2xpc3QgKmxpc3QyKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3B3X2FmZl9saXN0X2d0X3NldChfX2lzbF90YWtlIGlzbF9wd19hZmZfbGlzdCAqbGlzdDEsCisJX19pc2xfdGFrZSBpc2xfcHdfYWZmX2xpc3QgKmxpc3QyKTsKKworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfYWZmICppc2xfbXVsdGlfYWZmX2Zyb21fYWZmKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmKTsKK19faXNsX2dpdmUgaXNsX211bHRpX2FmZiAqaXNsX211bHRpX2FmZl96ZXJvKF9faXNsX3Rha2UgaXNsX3NwYWNlICpzcGFjZSk7CitfX2lzbF9naXZlIGlzbF9tdWx0aV9hZmYgKmlzbF9tdWx0aV9hZmZfaWRlbnRpdHkoX19pc2xfdGFrZSBpc2xfc3BhY2UgKnNwYWNlKTsKKworaXNsX2N0eCAqaXNsX211bHRpX2FmZl9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX211bHRpX2FmZiAqbWFmZik7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX211bHRpX2FmZl9nZXRfc3BhY2UoX19pc2xfa2VlcCBpc2xfbXVsdGlfYWZmICptYWZmKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfbXVsdGlfYWZmX2dldF9kb21haW5fc3BhY2UoCisJX19pc2xfa2VlcCBpc2xfbXVsdGlfYWZmICptYWZmKTsKK19faXNsX2dpdmUgaXNsX211bHRpX2FmZiAqaXNsX211bHRpX2FmZl9zZXRfdHVwbGVfbmFtZSgKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hZmYsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgY29uc3QgY2hhciAqcyk7CitfX2lzbF9naXZlIGlzbF9tdWx0aV9hZmYgKmlzbF9tdWx0aV9hZmZfc2V0X3R1cGxlX2lkKAorCV9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWFmZiwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBfX2lzbF90YWtlIGlzbF9pZCAqaWQpOworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfYWZmICppc2xfbXVsdGlfYWZmX2NvcHkoX19pc2xfa2VlcCBpc2xfbXVsdGlfYWZmICptYWZmKTsKK3ZvaWQgKmlzbF9tdWx0aV9hZmZfZnJlZShfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hZmYpOworCit1bnNpZ25lZCBpc2xfbXVsdGlfYWZmX2RpbShfX2lzbF9rZWVwIGlzbF9tdWx0aV9hZmYgKm1hZmYsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9tdWx0aV9hZmZfZ2V0X2FmZihfX2lzbF9rZWVwIGlzbF9tdWx0aV9hZmYgKm11bHRpLAorCWludCBwb3MpOworCitfX2lzbF9naXZlIGlzbF9tdWx0aV9hZmYgKmlzbF9tdWx0aV9hZmZfaW5zZXJ0X2RpbXMoCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9tdWx0aV9hZmYgKmlzbF9tdWx0aV9hZmZfYWRkX2RpbXMoX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX211bHRpX2FmZiAqaXNsX211bHRpX2FmZl9kcm9wX2RpbXMoCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYWZmLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKKworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfYWZmICppc2xfbXVsdGlfYWZmX3NldF9kaW1fbmFtZSgKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hZmYsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBjb25zdCBjaGFyICpzKTsKKworaW50IGlzbF9tdWx0aV9hZmZfcGxhaW5faXNfZXF1YWwoX19pc2xfa2VlcCBpc2xfbXVsdGlfYWZmICptYWZmMSwKKwlfX2lzbF9rZWVwIGlzbF9tdWx0aV9hZmYgKm1hZmYyKTsKKworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfYWZmICppc2xfbXVsdGlfYWZmX2FkZChfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hZmYxLAorCV9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWFmZjIpOworCitfX2lzbF9naXZlIGlzbF9tdWx0aV9hZmYgKmlzbF9tdWx0aV9hZmZfc2NhbGUoX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYWZmLAorCWlzbF9pbnQgZik7CisKK19faXNsX2dpdmUgaXNsX211bHRpX2FmZiAqaXNsX211bHRpX2FmZl9yYW5nZV9zcGxpY2UoCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYTEsIHVuc2lnbmVkIHBvcywKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hMik7CitfX2lzbF9naXZlIGlzbF9tdWx0aV9hZmYgKmlzbF9tdWx0aV9hZmZfc3BsaWNlKAorCV9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWExLCB1bnNpZ25lZCBpbl9wb3MsIHVuc2lnbmVkIG91dF9wb3MsCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYTIpOworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfYWZmICppc2xfbXVsdGlfYWZmX3JhbmdlX3Byb2R1Y3QoCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYTEsIF9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWEyKTsKK19faXNsX2dpdmUgaXNsX211bHRpX2FmZiAqaXNsX211bHRpX2FmZl9mbGF0X3JhbmdlX3Byb2R1Y3QoCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYTEsIF9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWEyKTsKK19faXNsX2dpdmUgaXNsX211bHRpX2FmZiAqaXNsX211bHRpX2FmZl9wcm9kdWN0KAorCV9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWExLCBfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hMik7CisKK19faXNsX2dpdmUgaXNsX211bHRpX2FmZiAqaXNsX211bHRpX2FmZl9hbGlnbl9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptdWx0aSwgX19pc2xfdGFrZSBpc2xfc3BhY2UgKm1vZGVsKTsKKworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfYWZmICppc2xfbXVsdGlfYWZmX2dpc3RfcGFyYW1zKAorCV9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWFmZiwgX19pc2xfdGFrZSBpc2xfc2V0ICpjb250ZXh0KTsKK19faXNsX2dpdmUgaXNsX211bHRpX2FmZiAqaXNsX211bHRpX2FmZl9naXN0KF9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWFmZiwKKwlfX2lzbF90YWtlIGlzbF9zZXQgKmNvbnRleHQpOworCitfX2lzbF9naXZlIGlzbF9tdWx0aV9hZmYgKmlzbF9tdWx0aV9hZmZfbGlmdChfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hZmYsCisJX19pc2xfZ2l2ZSBpc2xfbG9jYWxfc3BhY2UgKipscyk7CisKK19faXNsX2dpdmUgaXNsX211bHRpX2FmZiAqaXNsX211bHRpX2FmZl9wdWxsYmFja19tdWx0aV9hZmYoCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYTEsIF9faXNsX3Rha2UgaXNsX211bHRpX2FmZiAqbWEyKTsKKworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfbXVsdGlfYWZmX2xleF9sZV9zZXQoX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYTEsCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYTIpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfbXVsdGlfYWZmX2xleF9nZV9zZXQoX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYTEsCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYTIpOworCitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF9tdWx0aV9hZmYoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwKKwlfX2lzbF9rZWVwIGlzbF9tdWx0aV9hZmYgKm1hZmYpOworCitfX2lzbF9naXZlIGlzbF9tdWx0aV9hZmYgKmlzbF9tdWx0aV9hZmZfcmVhZF9mcm9tX3N0cihpc2xfY3R4ICpjdHgsCisJCWNvbnN0IGNoYXIgKnN0cik7Cit2b2lkIGlzbF9tdWx0aV9hZmZfZHVtcChfX2lzbF9rZWVwIGlzbF9tdWx0aV9hZmYgKm1hZmYpOworCitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9wd19tdWx0aV9hZmZfaWRlbnRpdHkoCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKnNwYWNlKTsKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl9mcm9tX211bHRpX2FmZigKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hKTsKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl9hbGxvYyhfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hZmYpOworX19pc2xfZ2l2ZSBpc2xfcHdfbXVsdGlfYWZmICppc2xfcHdfbXVsdGlfYWZmX2NvcHkoCisJX19pc2xfa2VlcCBpc2xfcHdfbXVsdGlfYWZmICpwbWEpOwordm9pZCAqaXNsX3B3X211bHRpX2FmZl9mcmVlKF9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hKTsKKwordW5zaWduZWQgaXNsX3B3X211bHRpX2FmZl9kaW0oX19pc2xfa2VlcCBpc2xfcHdfbXVsdGlfYWZmICpwbWEsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9wd19tdWx0aV9hZmZfZ2V0X3B3X2FmZigKKwlfX2lzbF9rZWVwIGlzbF9wd19tdWx0aV9hZmYgKnBtYSwgaW50IHBvcyk7CitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9wd19tdWx0aV9hZmZfc2V0X3B3X2FmZigKKwlfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYSwgdW5zaWduZWQgcG9zLAorCV9faXNsX3Rha2UgaXNsX3B3X2FmZiAqcGEpOworCitpc2xfY3R4ICppc2xfcHdfbXVsdGlfYWZmX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfcHdfbXVsdGlfYWZmICpwbWEpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9wd19tdWx0aV9hZmZfZ2V0X2RvbWFpbl9zcGFjZSgKKwlfX2lzbF9rZWVwIGlzbF9wd19tdWx0aV9hZmYgKnBtYSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3B3X211bHRpX2FmZl9nZXRfc3BhY2UoCisJX19pc2xfa2VlcCBpc2xfcHdfbXVsdGlfYWZmICpwbWEpOworaW50IGlzbF9wd19tdWx0aV9hZmZfaGFzX3R1cGxlX25hbWUoX19pc2xfa2VlcCBpc2xfcHdfbXVsdGlfYWZmICpwbWEsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7Citjb25zdCBjaGFyICppc2xfcHdfbXVsdGlfYWZmX2dldF90dXBsZV9uYW1lKF9faXNsX2tlZXAgaXNsX3B3X211bHRpX2FmZiAqcG1hLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworX19pc2xfZ2l2ZSBpc2xfaWQgKmlzbF9wd19tdWx0aV9hZmZfZ2V0X3R1cGxlX2lkKAorCV9faXNsX2tlZXAgaXNsX3B3X211bHRpX2FmZiAqcG1hLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKK2ludCBpc2xfcHdfbXVsdGlfYWZmX2hhc190dXBsZV9pZChfX2lzbF9rZWVwIGlzbF9wd19tdWx0aV9hZmYgKnBtYSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl9zZXRfdHVwbGVfaWQoCisJX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgX19pc2xfdGFrZSBpc2xfaWQgKmlkKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfbXVsdGlfYWZmICppc2xfcHdfbXVsdGlfYWZmX2Ryb3BfZGltcygKKwlfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CisKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3B3X211bHRpX2FmZl9kb21haW4oX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEpOworCitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9wd19tdWx0aV9hZmZfZW1wdHkoX19pc2xfdGFrZSBpc2xfc3BhY2UgKnNwYWNlKTsKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl9mcm9tX2RvbWFpbigKKwlfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CisKK2NvbnN0IGNoYXIgKmlzbF9wd19tdWx0aV9hZmZfZ2V0X2RpbV9uYW1lKF9faXNsX2tlZXAgaXNsX3B3X211bHRpX2FmZiAqcG1hLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CitfX2lzbF9naXZlIGlzbF9pZCAqaXNsX3B3X211bHRpX2FmZl9nZXRfZGltX2lkKAorCV9faXNsX2tlZXAgaXNsX3B3X211bHRpX2FmZiAqcG1hLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlLAorCXVuc2lnbmVkIHBvcyk7CitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9wd19tdWx0aV9hZmZfc2V0X2RpbV9pZCgKKwlfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIF9faXNsX3Rha2UgaXNsX2lkICppZCk7CisKK2ludCBpc2xfcHdfbXVsdGlfYWZmX3BsYWluX2lzX2VxdWFsKF9faXNsX2tlZXAgaXNsX3B3X211bHRpX2FmZiAqcG1hMSwKKwlfX2lzbF9rZWVwIGlzbF9wd19tdWx0aV9hZmYgKnBtYTIpOworCitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9wd19tdWx0aV9hZmZfdW5pb25fYWRkKAorCV9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hMSwgX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEyKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfbXVsdGlfYWZmICppc2xfcHdfbXVsdGlfYWZmX2FkZCgKKwlfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYTEsIF9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hMik7CisKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl91bmlvbl9sZXhtaW4oCisJX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWExLAorCV9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hMik7CitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9wd19tdWx0aV9hZmZfdW5pb25fbGV4bWF4KAorCV9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hMSwKKwlfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYTIpOworCitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9wd19tdWx0aV9hZmZfcmFuZ2VfcHJvZHVjdCgKKwlfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYTEsIF9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hMik7CitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9wd19tdWx0aV9hZmZfZmxhdF9yYW5nZV9wcm9kdWN0KAorCV9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hMSwgX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEyKTsKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl9wcm9kdWN0KAorCV9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hMSwgX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEyKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfbXVsdGlfYWZmICppc2xfcHdfbXVsdGlfYWZmX2ludGVyc2VjdF9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEsIF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl9pbnRlcnNlY3RfZG9tYWluKAorCV9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hLCBfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CisKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl9wcm9qZWN0X2RvbWFpbl9vbl9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEpOworCitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9wd19tdWx0aV9hZmZfYWxpZ25fcGFyYW1zKAorCV9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hLCBfX2lzbF90YWtlIGlzbF9zcGFjZSAqbW9kZWwpOworCitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9wd19tdWx0aV9hZmZfY29hbGVzY2UoCisJX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEpOworX19pc2xfZ2l2ZSBpc2xfcHdfbXVsdGlfYWZmICppc2xfcHdfbXVsdGlfYWZmX2dpc3RfcGFyYW1zKAorCV9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hLCBfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9wd19tdWx0aV9hZmZfZ2lzdCgKKwlfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYSwgX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworCitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9wd19tdWx0aV9hZmZfcHVsbGJhY2tfbXVsdGlfYWZmKAorCV9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hLCBfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hKTsKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX3B3X211bHRpX2FmZl9wdWxsYmFja19wd19tdWx0aV9hZmYoCisJX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWExLCBfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYTIpOworCitpbnQgaXNsX3B3X211bHRpX2FmZl9mb3JlYWNoX3BpZWNlKF9faXNsX2tlZXAgaXNsX3B3X211bHRpX2FmZiAqcG1hLAorCWludCAoKmZuKShfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwgX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYWZmLAorCQkgICAgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworCitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfZnJvbV9wd19tdWx0aV9hZmYoX19pc2xfdGFrZSBpc2xfcHdfbXVsdGlfYWZmICpwbWEpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2Zyb21fcHdfbXVsdGlfYWZmKF9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hKTsKKworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfcHJpbnRfcHdfbXVsdGlfYWZmKF9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsCisJX19pc2xfa2VlcCBpc2xfcHdfbXVsdGlfYWZmICpwbWEpOworCitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9wd19tdWx0aV9hZmZfZnJvbV9zZXQoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfcHdfbXVsdGlfYWZmICppc2xfcHdfbXVsdGlfYWZmX2Zyb21fbWFwKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfbXVsdGlfYWZmICppc2xfcHdfbXVsdGlfYWZmX3JlYWRfZnJvbV9zdHIoaXNsX2N0eCAqY3R4LAorCWNvbnN0IGNoYXIgKnN0cik7Cit2b2lkIGlzbF9wd19tdWx0aV9hZmZfZHVtcChfX2lzbF9rZWVwIGlzbF9wd19tdWx0aV9hZmYgKnBtYSk7CisKKworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfbXVsdGlfYWZmICppc2xfdW5pb25fcHdfbXVsdGlfYWZmX2VtcHR5KAorCV9faXNsX3Rha2UgaXNsX3NwYWNlICpzcGFjZSk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19tdWx0aV9hZmYgKmlzbF91bmlvbl9wd19tdWx0aV9hZmZfZnJvbV9kb21haW4oCisJX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0KTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X211bHRpX2FmZiAqaXNsX3VuaW9uX3B3X211bHRpX2FmZl9jb3B5KAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX3B3X211bHRpX2FmZiAqdXBtYSk7Cit2b2lkICppc2xfdW5pb25fcHdfbXVsdGlfYWZmX2ZyZWUoX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfbXVsdGlfYWZmICp1cG1hKTsKKworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfbXVsdGlfYWZmICppc2xfdW5pb25fcHdfbXVsdGlfYWZmX2FkZF9wd19tdWx0aV9hZmYoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfbXVsdGlfYWZmICp1cG1hLAorCV9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hKTsKKworaXNsX2N0eCAqaXNsX3VuaW9uX3B3X211bHRpX2FmZl9nZXRfY3R4KAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX3B3X211bHRpX2FmZiAqdXBtYSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3VuaW9uX3B3X211bHRpX2FmZl9nZXRfc3BhY2UoCisJX19pc2xfa2VlcCBpc2xfdW5pb25fcHdfbXVsdGlfYWZmICp1cG1hKTsKKworaW50IGlzbF91bmlvbl9wd19tdWx0aV9hZmZfZm9yZWFjaF9wd19tdWx0aV9hZmYoCisJX19pc2xfa2VlcCBpc2xfdW5pb25fcHdfbXVsdGlfYWZmICp1cG1hLAorCWludCAoKmZuKShfX2lzbF90YWtlIGlzbF9wd19tdWx0aV9hZmYgKnBtYSwgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9wd19tdWx0aV9hZmZfZG9tYWluKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X211bHRpX2FmZiAqdXBtYSk7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X211bHRpX2FmZiAqaXNsX3VuaW9uX3B3X211bHRpX2FmZl9hZGQoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfbXVsdGlfYWZmICp1cG1hMSwKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19tdWx0aV9hZmYgKnVwbWEyKTsKKworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfbXVsdGlfYWZmICppc2xfdW5pb25fcHdfbXVsdGlfYWZmX2ZsYXRfcmFuZ2VfcHJvZHVjdCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19tdWx0aV9hZmYgKnVwbWExLAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X211bHRpX2FmZiAqdXBtYTIpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfZnJvbV91bmlvbl9wd19tdWx0aV9hZmYoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfbXVsdGlfYWZmICp1cG1hKTsKKworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfcHJpbnRfdW5pb25fcHdfbXVsdGlfYWZmKAorCV9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsIF9faXNsX2tlZXAgaXNsX3VuaW9uX3B3X211bHRpX2FmZiAqdXBtYSk7CisKK19faXNsX2dpdmUgaXNsX211bHRpX3B3X2FmZiAqaXNsX211bHRpX3B3X2FmZl96ZXJvKF9faXNsX3Rha2UgaXNsX3NwYWNlICpzcGFjZSk7CitfX2lzbF9naXZlIGlzbF9tdWx0aV9wd19hZmYgKmlzbF9tdWx0aV9wd19hZmZfaWRlbnRpdHkoCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKnNwYWNlKTsKK19faXNsX2dpdmUgaXNsX211bHRpX3B3X2FmZiAqaXNsX211bHRpX3B3X2FmZl9mcm9tX3B3X2FmZigKKwlfX2lzbF90YWtlIGlzbF9wd19hZmYgKnBhKTsKKworaXNsX2N0eCAqaXNsX211bHRpX3B3X2FmZl9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX211bHRpX3B3X2FmZiAqbXBhKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfbXVsdGlfcHdfYWZmX2dldF9zcGFjZSgKKwlfX2lzbF9rZWVwIGlzbF9tdWx0aV9wd19hZmYgKm1wYSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX211bHRpX3B3X2FmZl9nZXRfZG9tYWluX3NwYWNlKAorCV9faXNsX2tlZXAgaXNsX211bHRpX3B3X2FmZiAqbXBhKTsKK19faXNsX2dpdmUgaXNsX211bHRpX3B3X2FmZiAqaXNsX211bHRpX3B3X2FmZl9zZXRfdHVwbGVfbmFtZSgKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV9wd19hZmYgKm1wYSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBjb25zdCBjaGFyICpzKTsKK19faXNsX2dpdmUgaXNsX211bHRpX3B3X2FmZiAqaXNsX211bHRpX3B3X2FmZl9jb3B5KAorCV9faXNsX2tlZXAgaXNsX211bHRpX3B3X2FmZiAqbXBhKTsKK3ZvaWQgKmlzbF9tdWx0aV9wd19hZmZfZnJlZShfX2lzbF90YWtlIGlzbF9tdWx0aV9wd19hZmYgKm1wYSk7CisKK3Vuc2lnbmVkIGlzbF9tdWx0aV9wd19hZmZfZGltKF9faXNsX2tlZXAgaXNsX211bHRpX3B3X2FmZiAqbXBhLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworX19pc2xfZ2l2ZSBpc2xfcHdfYWZmICppc2xfbXVsdGlfcHdfYWZmX2dldF9wd19hZmYoCisJX19pc2xfa2VlcCBpc2xfbXVsdGlfcHdfYWZmICptcGEsIGludCBwb3MpOworCitfX2lzbF9naXZlIGlzbF9tdWx0aV9wd19hZmYgKmlzbF9tdWx0aV9wd19hZmZfaW5zZXJ0X2RpbXMoCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfcHdfYWZmICptcGEsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfcHdfYWZmICppc2xfbXVsdGlfcHdfYWZmX2FkZF9kaW1zKAorCV9faXNsX3Rha2UgaXNsX211bHRpX3B3X2FmZiAqbXBhLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBuKTsKKworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfcHdfYWZmICppc2xfbXVsdGlfcHdfYWZmX3NldF9kaW1fbmFtZSgKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV9wd19hZmYgKm1wYSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGNvbnN0IGNoYXIgKnMpOworCitfX2lzbF9naXZlIGlzbF9tdWx0aV9wd19hZmYgKmlzbF9tdWx0aV9wd19hZmZfcmFuZ2Vfc3BsaWNlKAorCV9faXNsX3Rha2UgaXNsX211bHRpX3B3X2FmZiAqbXBhMSwgdW5zaWduZWQgcG9zLAorCV9faXNsX3Rha2UgaXNsX211bHRpX3B3X2FmZiAqbXBhMik7CitfX2lzbF9naXZlIGlzbF9tdWx0aV9wd19hZmYgKmlzbF9tdWx0aV9wd19hZmZfc3BsaWNlKAorCV9faXNsX3Rha2UgaXNsX211bHRpX3B3X2FmZiAqbXBhMSwgdW5zaWduZWQgaW5fcG9zLCB1bnNpZ25lZCBvdXRfcG9zLAorCV9faXNsX3Rha2UgaXNsX211bHRpX3B3X2FmZiAqbXBhMik7CitfX2lzbF9naXZlIGlzbF9tdWx0aV9wd19hZmYgKmlzbF9tdWx0aV9wd19hZmZfZmxhdF9yYW5nZV9wcm9kdWN0KAorCV9faXNsX3Rha2UgaXNsX211bHRpX3B3X2FmZiAqbXBhMSwgX19pc2xfdGFrZSBpc2xfbXVsdGlfcHdfYWZmICptcGEyKTsKK19faXNsX2dpdmUgaXNsX211bHRpX3B3X2FmZiAqaXNsX211bHRpX3B3X2FmZl9yYW5nZV9wcm9kdWN0KAorCV9faXNsX3Rha2UgaXNsX211bHRpX3B3X2FmZiAqbXBhMSwgX19pc2xfdGFrZSBpc2xfbXVsdGlfcHdfYWZmICptcGEyKTsKKworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfcHJpbnRfbXVsdGlfcHdfYWZmKAorCV9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsIF9faXNsX2tlZXAgaXNsX211bHRpX3B3X2FmZiAqbXBhKTsKK3ZvaWQgaXNsX211bHRpX3B3X2FmZl9kdW1wKF9faXNsX2tlZXAgaXNsX211bHRpX3B3X2FmZiAqbXBhKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2luY2x1ZGUgPGlzbC9kaW0uaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2lzbC9hZmZfdHlwZS5oIGIvaW5jbHVkZS9pc2wvYWZmX3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTMwOGM3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9pc2wvYWZmX3R5cGUuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIElTTF9BRkZfVFlQRV9ICisjZGVmaW5lIElTTF9BRkZfVFlQRV9ICisKK3N0cnVjdCBpc2xfYWZmOwordHlwZWRlZiBzdHJ1Y3QgaXNsX2FmZiBpc2xfYWZmOworCitzdHJ1Y3QgaXNsX3B3X2FmZjsKK3R5cGVkZWYgc3RydWN0IGlzbF9wd19hZmYgaXNsX3B3X2FmZjsKKworc3RydWN0IGlzbF9tdWx0aV9hZmY7Cit0eXBlZGVmIHN0cnVjdCBpc2xfbXVsdGlfYWZmIGlzbF9tdWx0aV9hZmY7CisKK3N0cnVjdCBpc2xfcHdfbXVsdGlfYWZmOwordHlwZWRlZiBzdHJ1Y3QgaXNsX3B3X211bHRpX2FmZiBpc2xfcHdfbXVsdGlfYWZmOworCitzdHJ1Y3QgaXNsX3VuaW9uX3B3X211bHRpX2FmZjsKK3R5cGVkZWYgc3RydWN0IGlzbF91bmlvbl9wd19tdWx0aV9hZmYgaXNsX3VuaW9uX3B3X211bHRpX2FmZjsKKworc3RydWN0IGlzbF9tdWx0aV9wd19hZmY7Cit0eXBlZGVmIHN0cnVjdCBpc2xfbXVsdGlfcHdfYWZmIGlzbF9tdWx0aV9wd19hZmY7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pc2wvYXJnLmggYi9pbmNsdWRlL2lzbC9hcmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2VlNDRjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9pc2wvYXJnLmgKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEthdGhvbGlla2UgVW5pdmVyc2l0ZWl0IExldXZlbgorICoKKyAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBNSVQgbGljZW5zZQorICoKKyAqIFdyaXR0ZW4gYnkgU3ZlbiBWZXJkb29sYWVnZSwgSy5VLkxldXZlbiwgRGVwYXJ0ZW1lbnQKKyAqIENvbXB1dGVyd2V0ZW5zY2hhcHBlbiwgQ2VsZXN0aWpuZW5sYWFuIDIwMEEsIEItMzAwMSBMZXV2ZW4sIEJlbGdpdW0KKyAqLworCisjaWZuZGVmIElTTF9BUkdfSAorI2RlZmluZSBJU0xfQVJHX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBpc2xfYXJnX2Nob2ljZSB7CisJY29uc3QgY2hhcgkqbmFtZTsKKwl1bnNpZ25lZAkgdmFsdWU7Cit9OworCitzdHJ1Y3QgaXNsX2FyZ19mbGFncyB7CisJY29uc3QgY2hhcgkqbmFtZTsKKwl1bnNpZ25lZAkgbWFzazsKKwl1bnNpZ25lZAkgdmFsdWU7Cit9OworCitlbnVtIGlzbF9hcmdfdHlwZSB7CisJaXNsX2FyZ19lbmQsCisJaXNsX2FyZ19hbGlhcywKKwlpc2xfYXJnX2FyZywKKwlpc2xfYXJnX2Jvb2wsCisJaXNsX2FyZ19jaGlsZCwKKwlpc2xfYXJnX2Nob2ljZSwKKwlpc2xfYXJnX2ZsYWdzLAorCWlzbF9hcmdfZm9vdGVyLAorCWlzbF9hcmdfaW50LAorCWlzbF9hcmdfdXNlciwKKwlpc2xfYXJnX2xvbmcsCisJaXNsX2FyZ191bG9uZywKKwlpc2xfYXJnX3N0ciwKKwlpc2xfYXJnX3N0cl9saXN0LAorCWlzbF9hcmdfdmVyc2lvbgorfTsKKworc3RydWN0IGlzbF9hcmdzOworCitzdHJ1Y3QgaXNsX2FyZyB7CisJZW51bSBpc2xfYXJnX3R5cGUJIHR5cGU7CisJY2hhcgkJCSBzaG9ydF9uYW1lOworCWNvbnN0IGNoYXIJCSpsb25nX25hbWU7CisJY29uc3QgY2hhcgkJKmFyZ3VtZW50X25hbWU7CisJc2l6ZV90CQkJIG9mZnNldDsKKwljb25zdCBjaGFyCQkqaGVscF9tc2c7CisjZGVmaW5lIElTTF9BUkdfU0lOR0xFX0RBU0gJKDEgPDwgMCkKKyNkZWZpbmUgSVNMX0FSR19CT09MX0FSRwkoMSA8PCAxKQorI2RlZmluZSBJU0xfQVJHX0hJRERFTgkJKDEgPDwgMikKKwl1bnNpZ25lZAkJIGZsYWdzOworCXVuaW9uIHsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgaXNsX2FyZ19jaG9pY2UJKmNob2ljZTsKKwkJdW5zaWduZWQJIAkgZGVmYXVsdF92YWx1ZTsKKwkJdW5zaWduZWQJIAkgZGVmYXVsdF9zZWxlY3RlZDsKKwkJaW50ICgqc2V0KSh2b2lkICpvcHQsIHVuc2lnbmVkIHZhbCk7CisJfSBjaG9pY2U7CisJc3RydWN0IHsKKwkJc3RydWN0IGlzbF9hcmdfZmxhZ3MJKmZsYWdzOworCQl1bnNpZ25lZAkgCSBkZWZhdWx0X3ZhbHVlOworCX0gZmxhZ3M7CisJc3RydWN0IHsKKwkJdW5zaWduZWQJCSBkZWZhdWx0X3ZhbHVlOworCQlpbnQgKCpzZXQpKHZvaWQgKm9wdCwgdW5zaWduZWQgdmFsKTsKKwl9IGI7CisJc3RydWN0IHsKKwkJaW50CQkJZGVmYXVsdF92YWx1ZTsKKwl9IGk7CisJc3RydWN0IHsKKwkJbG9uZwkJIAlkZWZhdWx0X3ZhbHVlOworCQlsb25nCQkgCWRlZmF1bHRfc2VsZWN0ZWQ7CisJCWludCAoKnNldCkodm9pZCAqb3B0LCBsb25nIHZhbCk7CisJfSBsOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcJCWRlZmF1bHRfdmFsdWU7CisJfSB1bDsKKwlzdHJ1Y3QgeworCQljb25zdCBjaGFyCQkqZGVmYXVsdF92YWx1ZTsKKwl9IHN0cjsKKwlzdHJ1Y3QgeworCQlzaXplX3QJCQkgb2Zmc2V0X247CisJfSBzdHJfbGlzdDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgaXNsX2FyZ3MJCSpjaGlsZDsKKwl9IGNoaWxkOworCXN0cnVjdCB7CisJCXZvaWQgKCpwcmludF92ZXJzaW9uKSh2b2lkKTsKKwl9IHZlcnNpb247CisJc3RydWN0IHsKKwkJaW50ICgqaW5pdCkodm9pZCopOworCQl2b2lkICgqY2xlYXIpKHZvaWQqKTsKKwl9IHVzZXI7CisJfSB1OworfTsKKworc3RydWN0IGlzbF9hcmdzIHsKKwlzaXplX3QJCQkgb3B0aW9uc19zaXplOworCXN0cnVjdCBpc2xfYXJnCQkqYXJnczsKK307CisKKyNkZWZpbmUgSVNMX0FSR1NfU1RBUlQocyxuYW1lKQkJCQkJCVwKKwlzdHJ1Y3QgaXNsX2FyZyBuYW1lICMjIExJU1RbXTsJCQkJCVwKKwlzdHJ1Y3QgaXNsX2FyZ3MgbmFtZSA9IHsgc2l6ZW9mKHMpLCBuYW1lICMjIExJU1QgfTsJCVwKKwlzdHJ1Y3QgaXNsX2FyZyBuYW1lICMjIExJU1RbXSA9IHsKKyNkZWZpbmUgSVNMX0FSR1NfRU5ECQkJCQkJCVwKKwl7IGlzbF9hcmdfZW5kIH0gfTsKKworI2RlZmluZSBJU0xfQVJHX0FMSUFTKGwpCXsJCQkJCVwKKwkudHlwZSA9IGlzbF9hcmdfYWxpYXMsCQkJCQkJXAorCS5sb25nX25hbWUgPSBsLAkJCQkJCQlcCit9LAorI2RlZmluZSBJU0xfQVJHX0FSRyhzdCxmLGEsZCkJewkJCQkJXAorCS50eXBlID0gaXNsX2FyZ19hcmcsCQkJCQkJXAorCS5hcmd1bWVudF9uYW1lID0gYSwJCQkJCQlcCisJLm9mZnNldCA9IG9mZnNldG9mKHN0LCBmKSwJCQkJCVwKKwkudSA9IHsgLnN0ciA9IHsgLmRlZmF1bHRfdmFsdWUgPSBkIH0gfQkJCQlcCit9LAorI2RlZmluZSBJU0xfQVJHX0ZPT1RFUihoKQl7CQkJCQlcCisJLnR5cGUgPSBpc2xfYXJnX2Zvb3RlciwJCQkJCQlcCisJLmhlbHBfbXNnID0gaCwJCQkJCQkJXAorfSwKKyNkZWZpbmUgSVNMX0FSR19DSE9JQ0Uoc3QsZixzLGwsYyxkLGgpCXsJCQkJXAorCS50eXBlID0gaXNsX2FyZ19jaG9pY2UsCQkJCQkJXAorCS5zaG9ydF9uYW1lID0gcywJCQkJCQlcCisJLmxvbmdfbmFtZSA9IGwsCQkJCQkJCVwKKwkub2Zmc2V0ID0gb2Zmc2V0b2Yoc3QsIGYpLAkJCQkJXAorCS5oZWxwX21zZyA9IGgsCQkJCQkJCVwKKwkudSA9IHsgLmNob2ljZSA9IHsgLmNob2ljZSA9IGMsIC5kZWZhdWx0X3ZhbHVlID0gZCwJCVwKKwkJCSAgICAuZGVmYXVsdF9zZWxlY3RlZCA9IGQsIC5zZXQgPSBOVUxMIH0gfQlcCit9LAorI2RlZmluZSBJU0xfQVJHX09QVF9DSE9JQ0Uoc3QsZixzLGwsYyxkLGRzLGgpCXsJCQlcCisJLnR5cGUgPSBpc2xfYXJnX2Nob2ljZSwJCQkJCQlcCisJLnNob3J0X25hbWUgPSBzLAkJCQkJCVwKKwkubG9uZ19uYW1lID0gbCwJCQkJCQkJXAorCS5vZmZzZXQgPSBvZmZzZXRvZihzdCwgZiksCQkJCQlcCisJLmhlbHBfbXNnID0gaCwJCQkJCQkJXAorCS51ID0geyAuY2hvaWNlID0geyAuY2hvaWNlID0gYywgLmRlZmF1bHRfdmFsdWUgPSBkLAkJXAorCQkJICAgIC5kZWZhdWx0X3NlbGVjdGVkID0gZHMsIC5zZXQgPSBOVUxMIH0gfQlcCit9LAorI2RlZmluZSBJU0xfQVJHX1VTRVJfT1BUX0NIT0lDRShzdCxmLHMsbCxjLHNldHRlcixkLGRzLGgpCXsJXAorCS50eXBlID0gaXNsX2FyZ19jaG9pY2UsCQkJCQkJXAorCS5zaG9ydF9uYW1lID0gcywJCQkJCQlcCisJLmxvbmdfbmFtZSA9IGwsCQkJCQkJCVwKKwkub2Zmc2V0ID0gb2Zmc2V0b2Yoc3QsIGYpLAkJCQkJXAorCS5oZWxwX21zZyA9IGgsCQkJCQkJCVwKKwkudSA9IHsgLmNob2ljZSA9IHsgLmNob2ljZSA9IGMsIC5kZWZhdWx0X3ZhbHVlID0gZCwJCVwKKwkJCSAgICAuZGVmYXVsdF9zZWxlY3RlZCA9IGRzLCAuc2V0ID0gc2V0dGVyIH0gfQlcCit9LAorI2RlZmluZSBfSVNMX0FSR19CT09MX0YobyxzLGwsc2V0dGVyLGQsaCxmbCkJewkJCVwKKwkudHlwZSA9IGlzbF9hcmdfYm9vbCwJCQkJCQlcCisJLnNob3J0X25hbWUgPSBzLAkJCQkJCVwKKwkubG9uZ19uYW1lID0gbCwJCQkJCQkJXAorCS5vZmZzZXQgPSBvLAkJCQkJCQlcCisJLmhlbHBfbXNnID0gaCwJCQkJCQkJXAorCS5mbGFncyA9IGZsLAkJCQkJCQlcCisJLnUgPSB7IC5iID0geyAuZGVmYXVsdF92YWx1ZSA9IGQsIC5zZXQgPSBzZXR0ZXIgfSB9CQlcCit9LAorI2RlZmluZSBJU0xfQVJHX0JPT0xfRihzdCxmLHMsbCxkLGgsZmwpCQkJCQlcCisJX0lTTF9BUkdfQk9PTF9GKG9mZnNldG9mKHN0LCBmKSxzLGwsTlVMTCxkLGgsZmwpCisjZGVmaW5lIElTTF9BUkdfQk9PTChzdCxmLHMsbCxkLGgpCQkJCQlcCisJSVNMX0FSR19CT09MX0Yoc3QsZixzLGwsZCxoLDApCisjZGVmaW5lIElTTF9BUkdfUEhBTlRPTV9CT09MX0YocyxsLHNldHRlcixoLGZsKQkJCQlcCisJX0lTTF9BUkdfQk9PTF9GKC0xLHMsbCxzZXR0ZXIsMCxoLGZsKQorI2RlZmluZSBJU0xfQVJHX1BIQU5UT01fQk9PTChzLGwsc2V0dGVyLGgpCQkJCVwKKwlJU0xfQVJHX1BIQU5UT01fQk9PTF9GKHMsbCxzZXR0ZXIsaCwwKQorI2RlZmluZSBJU0xfQVJHX0lOVF9GKHN0LGYscyxsLGEsZCxoLGZsKQl7CQkJXAorCS50eXBlID0gaXNsX2FyZ19pbnQsCQkJCQkJXAorCS5zaG9ydF9uYW1lID0gcywJCQkJCQlcCisJLmxvbmdfbmFtZSA9IGwsCQkJCQkJCVwKKwkuYXJndW1lbnRfbmFtZSA9IGEsCQkJCQkJXAorCS5vZmZzZXQgPSBvZmZzZXRvZihzdCwgZiksCQkJCQlcCisJLmhlbHBfbXNnID0gaCwJCQkJCQkJXAorCS5mbGFncyA9IGZsLAkJCQkJCQlcCisJLnUgPSB7IC51bCA9IHsgLmRlZmF1bHRfdmFsdWUgPSBkIH0gfQkJCQlcCit9LAorI2RlZmluZSBJU0xfQVJHX0lOVChzdCxmLHMsbCxhLGQsaCkJCQkJCVwKKwlJU0xfQVJHX0lOVF9GKHN0LGYscyxsLGEsZCxoLDApCisjZGVmaW5lIElTTF9BUkdfTE9ORyhzdCxmLHMsbG8sZCxoKQl7CQkJCVwKKwkudHlwZSA9IGlzbF9hcmdfbG9uZywJCQkJCQlcCisJLnNob3J0X25hbWUgPSBzLAkJCQkJCVwKKwkubG9uZ19uYW1lID0gbG8sCQkJCQkJXAorCS5vZmZzZXQgPSBvZmZzZXRvZihzdCwgZiksCQkJCQlcCisJLmhlbHBfbXNnID0gaCwJCQkJCQkJXAorCS51ID0geyAubCA9IHsgLmRlZmF1bHRfdmFsdWUgPSBkLCAuZGVmYXVsdF9zZWxlY3RlZCA9IGQsCVwKKwkJICAgICAgLnNldCA9IE5VTEwgfSB9CQkJCQlcCit9LAorI2RlZmluZSBJU0xfQVJHX1VTRVJfTE9ORyhzdCxmLHMsbG8sc2V0dGVyLGQsaCkJewkJCVwKKwkudHlwZSA9IGlzbF9hcmdfbG9uZywJCQkJCQlcCisJLnNob3J0X25hbWUgPSBzLAkJCQkJCVwKKwkubG9uZ19uYW1lID0gbG8sCQkJCQkJXAorCS5vZmZzZXQgPSBvZmZzZXRvZihzdCwgZiksCQkJCQlcCisJLmhlbHBfbXNnID0gaCwJCQkJCQkJXAorCS51ID0geyAubCA9IHsgLmRlZmF1bHRfdmFsdWUgPSBkLCAuZGVmYXVsdF9zZWxlY3RlZCA9IGQsCVwKKwkJICAgICAgLnNldCA9IHNldHRlciB9IH0JCQkJCVwKK30sCisjZGVmaW5lIElTTF9BUkdfT1BUX0xPTkcoc3QsZixzLGxvLGQsZHMsaCkJewkJCVwKKwkudHlwZSA9IGlzbF9hcmdfbG9uZywJCQkJCQlcCisJLnNob3J0X25hbWUgPSBzLAkJCQkJCVwKKwkubG9uZ19uYW1lID0gbG8sCQkJCQkJXAorCS5vZmZzZXQgPSBvZmZzZXRvZihzdCwgZiksCQkJCQlcCisJLmhlbHBfbXNnID0gaCwJCQkJCQkJXAorCS51ID0geyAubCA9IHsgLmRlZmF1bHRfdmFsdWUgPSBkLCAuZGVmYXVsdF9zZWxlY3RlZCA9IGRzLAlcCisJCSAgICAgIC5zZXQgPSBOVUxMIH0gfQkJCQkJXAorfSwKKyNkZWZpbmUgSVNMX0FSR19VTE9ORyhzdCxmLHMsbCxkLGgpCXsJCQkJXAorCS50eXBlID0gaXNsX2FyZ191bG9uZywJCQkJCQlcCisJLnNob3J0X25hbWUgPSBzLAkJCQkJCVwKKwkubG9uZ19uYW1lID0gbCwJCQkJCQkJXAorCS5vZmZzZXQgPSBvZmZzZXRvZihzdCwgZiksCQkJCQlcCisJLmhlbHBfbXNnID0gaCwJCQkJCQkJXAorCS51ID0geyAudWwgPSB7IC5kZWZhdWx0X3ZhbHVlID0gZCB9IH0JCQkJXAorfSwKKyNkZWZpbmUgSVNMX0FSR19TVFJfRihzdCxmLHMsbCxhLGQsaCxmbCkJewkJCVwKKwkudHlwZSA9IGlzbF9hcmdfc3RyLAkJCQkJCVwKKwkuc2hvcnRfbmFtZSA9IHMsCQkJCQkJXAorCS5sb25nX25hbWUgPSBsLAkJCQkJCQlcCisJLmFyZ3VtZW50X25hbWUgPSBhLAkJCQkJCVwKKwkub2Zmc2V0ID0gb2Zmc2V0b2Yoc3QsIGYpLAkJCQkJXAorCS5oZWxwX21zZyA9IGgsCQkJCQkJCVwKKwkuZmxhZ3MgPSBmbCwJCQkJCQkJXAorCS51ID0geyAuc3RyID0geyAuZGVmYXVsdF92YWx1ZSA9IGQgfSB9CQkJCVwKK30sCisjZGVmaW5lIElTTF9BUkdfU1RSKHN0LGYscyxsLGEsZCxoKQkJCQkJXAorCUlTTF9BUkdfU1RSX0Yoc3QsZixzLGwsYSxkLGgsMCkKKyNkZWZpbmUgSVNMX0FSR19TVFJfTElTVChzdCxmX24sZl9sLHMsbCxhLGgpCXsJCQlcCisJLnR5cGUgPSBpc2xfYXJnX3N0cl9saXN0LAkJCQkJXAorCS5zaG9ydF9uYW1lID0gcywJCQkJCQlcCisJLmxvbmdfbmFtZSA9IGwsCQkJCQkJCVwKKwkuYXJndW1lbnRfbmFtZSA9IGEsCQkJCQkJXAorCS5vZmZzZXQgPSBvZmZzZXRvZihzdCwgZl9sKSwJCQkJCVwKKwkuaGVscF9tc2cgPSBoLAkJCQkJCQlcCisJLnUgPSB7IC5zdHJfbGlzdCA9IHsgLm9mZnNldF9uID0gb2Zmc2V0b2Yoc3QsIGZfbikgfSB9CQlcCit9LAorI2RlZmluZSBfSVNMX0FSR19DSElMRChvLGwsYyxoLGZsKQl7CQkJCVwKKwkudHlwZSA9IGlzbF9hcmdfY2hpbGQsCQkJCQkJXAorCS5sb25nX25hbWUgPSBsLAkJCQkJCQlcCisJLm9mZnNldCA9IG8sCQkJCQkJCVwKKwkuaGVscF9tc2cgPSBoLAkJCQkJCQlcCisJLmZsYWdzID0gZmwsCQkJCQkJCVwKKwkudSA9IHsgLmNoaWxkID0geyAuY2hpbGQgPSBjIH0gfQkJCQlcCit9LAorI2RlZmluZSBJU0xfQVJHX0NISUxEKHN0LGYsbCxjLGgpCQkJCQlcCisJX0lTTF9BUkdfQ0hJTEQob2Zmc2V0b2Yoc3QsIGYpLGwsYyxoLDApCisjZGVmaW5lIElTTF9BUkdfR1JPVVBfRihjLGgsZmwpCQkJCQkJXAorCV9JU0xfQVJHX0NISUxEKC0xLE5VTEwsYyxoLGZsKQorI2RlZmluZSBJU0xfQVJHX0dST1VQKGMsaCkJCQkJCQlcCisJSVNMX0FSR19HUk9VUF9GKGMsaCwwKQorI2RlZmluZSBJU0xfQVJHX0ZMQUdTKHN0LGYscyxsLGMsZCxoKQl7CQkJCVwKKwkudHlwZSA9IGlzbF9hcmdfZmxhZ3MsCQkJCQkJXAorCS5zaG9ydF9uYW1lID0gcywJCQkJCQlcCisJLmxvbmdfbmFtZSA9IGwsCQkJCQkJCVwKKwkub2Zmc2V0ID0gb2Zmc2V0b2Yoc3QsIGYpLAkJCQkJXAorCS5oZWxwX21zZyA9IGgsCQkJCQkJCVwKKwkudSA9IHsgLmZsYWdzID0geyAuZmxhZ3MgPSBjLCAuZGVmYXVsdF92YWx1ZSA9IGQgfSB9CQlcCit9LAorI2RlZmluZSBJU0xfQVJHX1VTRVIoc3QsZixpLGMpIHsJCQkJCVwKKwkudHlwZSA9IGlzbF9hcmdfdXNlciwJCQkJCQlcCisJLm9mZnNldCA9IG9mZnNldG9mKHN0LCBmKSwJCQkJCVwKKwkudSA9IHsgLnVzZXIgPSB7IC5pbml0ID0gaSwgLmNsZWFyID0gY30gfQkJCVwKK30sCisjZGVmaW5lIElTTF9BUkdfVkVSU0lPTihwcmludCkgewkJCQkJXAorCS50eXBlID0gaXNsX2FyZ192ZXJzaW9uLAkJCQkJXAorCS51ID0geyAudmVyc2lvbiA9IHsgLnByaW50X3ZlcnNpb24gPSBwcmludCB9IH0JCQlcCit9LAorCisjZGVmaW5lIElTTF9BUkdfQUxMCQkoMSA8PCAwKQorI2RlZmluZSBJU0xfQVJHX1NLSVBfSEVMUAkoMSA8PCAxKQorCit2b2lkIGlzbF9hcmdzX3NldF9kZWZhdWx0cyhzdHJ1Y3QgaXNsX2FyZ3MgKmFyZ3MsIHZvaWQgKm9wdCk7Cit2b2lkIGlzbF9hcmdzX2ZyZWUoc3RydWN0IGlzbF9hcmdzICphcmdzLCB2b2lkICpvcHQpOworaW50IGlzbF9hcmdzX3BhcnNlKHN0cnVjdCBpc2xfYXJncyAqYXJncywgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCB2b2lkICpvcHQsCisJdW5zaWduZWQgZmxhZ3MpOworCisjZGVmaW5lIElTTF9BUkdfREVDTChwcmVmaXgsc3QsYXJncykJCQkJCVwKK2V4dGVybiBzdHJ1Y3QgaXNsX2FyZ3MgYXJnczsJCQkJCQlcCitzdCAqcHJlZml4ICMjIF9uZXdfd2l0aF9kZWZhdWx0cyh2b2lkKTsJCQkJCVwKK3ZvaWQgcHJlZml4ICMjIF9mcmVlKHN0ICpvcHQpOwkJCQkJCVwKK2ludCBwcmVmaXggIyMgX3BhcnNlKHN0ICpvcHQsIGludCBhcmdjLCBjaGFyICoqYXJndiwgdW5zaWduZWQgZmxhZ3MpOworCisjZGVmaW5lIElTTF9BUkdfREVGKHByZWZpeCxzdCxhcmdzKQkJCQkJXAorc3QgKnByZWZpeCAjIyBfbmV3X3dpdGhfZGVmYXVsdHMoKQkJCQkJXAorewkJCQkJCQkJCVwKKwlzdCAqb3B0ID0gKHN0ICopY2FsbG9jKDEsIHNpemVvZihzdCkpOwkJCQlcCisJaWYgKG9wdCkJCQkJCQkJXAorCQlpc2xfYXJnc19zZXRfZGVmYXVsdHMoJihhcmdzKSwgb3B0KTsJCQlcCisJcmV0dXJuIG9wdDsJCQkJCQkJXAorfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3ZvaWQgcHJlZml4ICMjIF9mcmVlKHN0ICpvcHQpCQkJCQkJXAorewkJCQkJCQkJCVwKKwlpc2xfYXJnc19mcmVlKCYoYXJncyksIG9wdCk7CQkJCQlcCit9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAoraW50IHByZWZpeCAjIyBfcGFyc2Uoc3QgKm9wdCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCB1bnNpZ25lZCBmbGFncykJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gaXNsX2FyZ3NfcGFyc2UoJihhcmdzKSwgYXJnYywgYXJndiwgb3B0LCBmbGFncyk7CQlcCit9CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pc2wvYXN0LmggYi9pbmNsdWRlL2lzbC9hc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmZlNDUwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9pc2wvYXN0LmgKQEAgLTAsMCArMSwxODMgQEAKKyNpZm5kZWYgSVNMX0FTVF9ICisjZGVmaW5lIElTTF9BU1RfSAorCisjaW5jbHVkZSA8aXNsL2N0eC5oPgorI2luY2x1ZGUgPGlzbC9pZC5oPgorI2luY2x1ZGUgPGlzbC9saXN0Lmg+CisjaW5jbHVkZSA8aXNsL3ByaW50ZXIuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgaXNsX2FzdF9leHByOwordHlwZWRlZiBzdHJ1Y3QgaXNsX2FzdF9leHByIGlzbF9hc3RfZXhwcjsKKworc3RydWN0IGlzbF9hc3Rfbm9kZTsKK3R5cGVkZWYgc3RydWN0IGlzbF9hc3Rfbm9kZSBpc2xfYXN0X25vZGU7CisKK2VudW0gaXNsX2FzdF9vcF90eXBlIHsKKwlpc2xfYXN0X29wX2Vycm9yID0gLTEsCisJaXNsX2FzdF9vcF9hbmQsCisJaXNsX2FzdF9vcF9hbmRfdGhlbiwKKwlpc2xfYXN0X29wX29yLAorCWlzbF9hc3Rfb3Bfb3JfZWxzZSwKKwlpc2xfYXN0X29wX21heCwKKwlpc2xfYXN0X29wX21pbiwKKwlpc2xfYXN0X29wX21pbnVzLAorCWlzbF9hc3Rfb3BfYWRkLAorCWlzbF9hc3Rfb3Bfc3ViLAorCWlzbF9hc3Rfb3BfbXVsLAorCWlzbF9hc3Rfb3BfZGl2LAorCWlzbF9hc3Rfb3BfZmRpdl9xLAkvKiBSb3VuZCB0b3dhcmRzIC1pbmZ0eSAqLworCWlzbF9hc3Rfb3BfcGRpdl9xLAkvKiBEaXZpZGVuZCBpcyBub24tbmVnYXRpdmUgKi8KKwlpc2xfYXN0X29wX3BkaXZfciwJLyogRGl2aWRlbmQgaXMgbm9uLW5lZ2F0aXZlICovCisJaXNsX2FzdF9vcF9jb25kLAorCWlzbF9hc3Rfb3Bfc2VsZWN0LAorCWlzbF9hc3Rfb3BfZXEsCisJaXNsX2FzdF9vcF9sZSwKKwlpc2xfYXN0X29wX2x0LAorCWlzbF9hc3Rfb3BfZ2UsCisJaXNsX2FzdF9vcF9ndCwKKwlpc2xfYXN0X29wX2NhbGwKK307CisKK2VudW0gaXNsX2FzdF9leHByX3R5cGUgeworCWlzbF9hc3RfZXhwcl9lcnJvciA9IC0xLAorCWlzbF9hc3RfZXhwcl9vcCwKKwlpc2xfYXN0X2V4cHJfaWQsCisJaXNsX2FzdF9leHByX2ludAorfTsKKworZW51bSBpc2xfYXN0X25vZGVfdHlwZSB7CisJaXNsX2FzdF9ub2RlX2Vycm9yID0gLTEsCisJaXNsX2FzdF9ub2RlX2ZvciA9IDEsCisJaXNsX2FzdF9ub2RlX2lmLAorCWlzbF9hc3Rfbm9kZV9ibG9jaywKKwlpc2xfYXN0X25vZGVfdXNlcgorfTsKKworc3RydWN0IGlzbF9hc3RfcHJpbnRfb3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IGlzbF9hc3RfcHJpbnRfb3B0aW9ucyBpc2xfYXN0X3ByaW50X29wdGlvbnM7CisKK0lTTF9ERUNMQVJFX0xJU1QoYXN0X2V4cHIpCitJU0xfREVDTEFSRV9MSVNUKGFzdF9ub2RlKQorCitpbnQgaXNsX29wdGlvbnNfc2V0X2FzdF9pdGVyYXRvcl90eXBlKGlzbF9jdHggKmN0eCwgY29uc3QgY2hhciAqdmFsKTsKK2NvbnN0IGNoYXIgKmlzbF9vcHRpb25zX2dldF9hc3RfaXRlcmF0b3JfdHlwZShpc2xfY3R4ICpjdHgpOworCitfX2lzbF9naXZlIGlzbF9hc3RfZXhwciAqaXNsX2FzdF9leHByX2Zyb21faWQoX19pc2xfdGFrZSBpc2xfaWQgKmlkKTsKK19faXNsX2dpdmUgaXNsX2FzdF9leHByICppc2xfYXN0X2V4cHJfbmVnKF9faXNsX3Rha2UgaXNsX2FzdF9leHByICpleHByKTsKK19faXNsX2dpdmUgaXNsX2FzdF9leHByICppc2xfYXN0X2V4cHJfYWRkKF9faXNsX3Rha2UgaXNsX2FzdF9leHByICpleHByMSwKKwlfX2lzbF90YWtlIGlzbF9hc3RfZXhwciAqZXhwcjIpOworX19pc2xfZ2l2ZSBpc2xfYXN0X2V4cHIgKmlzbF9hc3RfZXhwcl9zdWIoX19pc2xfdGFrZSBpc2xfYXN0X2V4cHIgKmV4cHIxLAorCV9faXNsX3Rha2UgaXNsX2FzdF9leHByICpleHByMik7CitfX2lzbF9naXZlIGlzbF9hc3RfZXhwciAqaXNsX2FzdF9leHByX211bChfX2lzbF90YWtlIGlzbF9hc3RfZXhwciAqZXhwcjEsCisJX19pc2xfdGFrZSBpc2xfYXN0X2V4cHIgKmV4cHIyKTsKK19faXNsX2dpdmUgaXNsX2FzdF9leHByICppc2xfYXN0X2V4cHJfZGl2KF9faXNsX3Rha2UgaXNsX2FzdF9leHByICpleHByMSwKKwlfX2lzbF90YWtlIGlzbF9hc3RfZXhwciAqZXhwcjIpOworX19pc2xfZ2l2ZSBpc2xfYXN0X2V4cHIgKmlzbF9hc3RfZXhwcl9hbmQoX19pc2xfdGFrZSBpc2xfYXN0X2V4cHIgKmV4cHIxLAorCV9faXNsX3Rha2UgaXNsX2FzdF9leHByICpleHByMik7CitfX2lzbF9naXZlIGlzbF9hc3RfZXhwciAqaXNsX2FzdF9leHByX29yKF9faXNsX3Rha2UgaXNsX2FzdF9leHByICpleHByMSwKKwlfX2lzbF90YWtlIGlzbF9hc3RfZXhwciAqZXhwcjIpOworCitfX2lzbF9naXZlIGlzbF9hc3RfZXhwciAqaXNsX2FzdF9leHByX2NvcHkoX19pc2xfa2VlcCBpc2xfYXN0X2V4cHIgKmV4cHIpOwordm9pZCAqaXNsX2FzdF9leHByX2ZyZWUoX19pc2xfdGFrZSBpc2xfYXN0X2V4cHIgKmV4cHIpOworCitpc2xfY3R4ICppc2xfYXN0X2V4cHJfZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF9hc3RfZXhwciAqZXhwcik7CitlbnVtIGlzbF9hc3RfZXhwcl90eXBlIGlzbF9hc3RfZXhwcl9nZXRfdHlwZShfX2lzbF9rZWVwIGlzbF9hc3RfZXhwciAqZXhwcik7CitpbnQgaXNsX2FzdF9leHByX2dldF9pbnQoX19pc2xfa2VlcCBpc2xfYXN0X2V4cHIgKmV4cHIsIGlzbF9pbnQgKnYpOworX19pc2xfZ2l2ZSBpc2xfaWQgKmlzbF9hc3RfZXhwcl9nZXRfaWQoX19pc2xfa2VlcCBpc2xfYXN0X2V4cHIgKmV4cHIpOworCitlbnVtIGlzbF9hc3Rfb3BfdHlwZSBpc2xfYXN0X2V4cHJfZ2V0X29wX3R5cGUoX19pc2xfa2VlcCBpc2xfYXN0X2V4cHIgKmV4cHIpOworaW50IGlzbF9hc3RfZXhwcl9nZXRfb3Bfbl9hcmcoX19pc2xfa2VlcCBpc2xfYXN0X2V4cHIgKmV4cHIpOworX19pc2xfZ2l2ZSBpc2xfYXN0X2V4cHIgKmlzbF9hc3RfZXhwcl9nZXRfb3BfYXJnKF9faXNsX2tlZXAgaXNsX2FzdF9leHByICpleHByLAorCWludCBwb3MpOworCitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF9hc3RfZXhwcihfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLAorCV9faXNsX2tlZXAgaXNsX2FzdF9leHByICpleHByKTsKK3ZvaWQgaXNsX2FzdF9leHByX2R1bXAoX19pc2xfa2VlcCBpc2xfYXN0X2V4cHIgKmV4cHIpOworX19pc2xfZ2l2ZSBjaGFyICppc2xfYXN0X2V4cHJfdG9fc3RyKF9faXNsX2tlZXAgaXNsX2FzdF9leHByICpleHByKTsKKworX19pc2xfZ2l2ZSBpc2xfYXN0X25vZGUgKmlzbF9hc3Rfbm9kZV9hbGxvY191c2VyKF9faXNsX3Rha2UgaXNsX2FzdF9leHByICpleHByKTsKK19faXNsX2dpdmUgaXNsX2FzdF9ub2RlICppc2xfYXN0X25vZGVfY29weShfX2lzbF9rZWVwIGlzbF9hc3Rfbm9kZSAqbm9kZSk7Cit2b2lkICppc2xfYXN0X25vZGVfZnJlZShfX2lzbF90YWtlIGlzbF9hc3Rfbm9kZSAqbm9kZSk7CisKK2lzbF9jdHggKmlzbF9hc3Rfbm9kZV9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX2FzdF9ub2RlICpub2RlKTsKK2VudW0gaXNsX2FzdF9ub2RlX3R5cGUgaXNsX2FzdF9ub2RlX2dldF90eXBlKF9faXNsX2tlZXAgaXNsX2FzdF9ub2RlICpub2RlKTsKKworX19pc2xfZ2l2ZSBpc2xfYXN0X25vZGUgKmlzbF9hc3Rfbm9kZV9zZXRfYW5ub3RhdGlvbigKKwlfX2lzbF90YWtlIGlzbF9hc3Rfbm9kZSAqbm9kZSwgX19pc2xfdGFrZSBpc2xfaWQgKmFubm90YXRpb24pOworX19pc2xfZ2l2ZSBpc2xfaWQgKmlzbF9hc3Rfbm9kZV9nZXRfYW5ub3RhdGlvbihfX2lzbF9rZWVwIGlzbF9hc3Rfbm9kZSAqbm9kZSk7CisKK19faXNsX2dpdmUgaXNsX2FzdF9leHByICppc2xfYXN0X25vZGVfZm9yX2dldF9pdGVyYXRvcigKKwlfX2lzbF9rZWVwIGlzbF9hc3Rfbm9kZSAqbm9kZSk7CitfX2lzbF9naXZlIGlzbF9hc3RfZXhwciAqaXNsX2FzdF9ub2RlX2Zvcl9nZXRfaW5pdCgKKwlfX2lzbF9rZWVwIGlzbF9hc3Rfbm9kZSAqbm9kZSk7CitfX2lzbF9naXZlIGlzbF9hc3RfZXhwciAqaXNsX2FzdF9ub2RlX2Zvcl9nZXRfY29uZCgKKwlfX2lzbF9rZWVwIGlzbF9hc3Rfbm9kZSAqbm9kZSk7CitfX2lzbF9naXZlIGlzbF9hc3RfZXhwciAqaXNsX2FzdF9ub2RlX2Zvcl9nZXRfaW5jKAorCV9faXNsX2tlZXAgaXNsX2FzdF9ub2RlICpub2RlKTsKK19faXNsX2dpdmUgaXNsX2FzdF9ub2RlICppc2xfYXN0X25vZGVfZm9yX2dldF9ib2R5KAorCV9faXNsX2tlZXAgaXNsX2FzdF9ub2RlICpub2RlKTsKK2ludCBpc2xfYXN0X25vZGVfZm9yX2lzX2RlZ2VuZXJhdGUoX19pc2xfa2VlcCBpc2xfYXN0X25vZGUgKm5vZGUpOworCitfX2lzbF9naXZlIGlzbF9hc3RfZXhwciAqaXNsX2FzdF9ub2RlX2lmX2dldF9jb25kKAorCV9faXNsX2tlZXAgaXNsX2FzdF9ub2RlICpub2RlKTsKK19faXNsX2dpdmUgaXNsX2FzdF9ub2RlICppc2xfYXN0X25vZGVfaWZfZ2V0X3RoZW4oCisJX19pc2xfa2VlcCBpc2xfYXN0X25vZGUgKm5vZGUpOworaW50IGlzbF9hc3Rfbm9kZV9pZl9oYXNfZWxzZShfX2lzbF9rZWVwIGlzbF9hc3Rfbm9kZSAqbm9kZSk7CitfX2lzbF9naXZlIGlzbF9hc3Rfbm9kZSAqaXNsX2FzdF9ub2RlX2lmX2dldF9lbHNlKAorCV9faXNsX2tlZXAgaXNsX2FzdF9ub2RlICpub2RlKTsKKworX19pc2xfZ2l2ZSBpc2xfYXN0X25vZGVfbGlzdCAqaXNsX2FzdF9ub2RlX2Jsb2NrX2dldF9jaGlsZHJlbigKKwlfX2lzbF9rZWVwIGlzbF9hc3Rfbm9kZSAqbm9kZSk7CisKK19faXNsX2dpdmUgaXNsX2FzdF9leHByICppc2xfYXN0X25vZGVfdXNlcl9nZXRfZXhwcigKKwlfX2lzbF9rZWVwIGlzbF9hc3Rfbm9kZSAqbm9kZSk7CisKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X2FzdF9ub2RlKF9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsCisJX19pc2xfa2VlcCBpc2xfYXN0X25vZGUgKm5vZGUpOwordm9pZCBpc2xfYXN0X25vZGVfZHVtcChfX2lzbF9rZWVwIGlzbF9hc3Rfbm9kZSAqbm9kZSk7CisKK19faXNsX2dpdmUgaXNsX2FzdF9wcmludF9vcHRpb25zICppc2xfYXN0X3ByaW50X29wdGlvbnNfYWxsb2MoaXNsX2N0eCAqY3R4KTsKK19faXNsX2dpdmUgaXNsX2FzdF9wcmludF9vcHRpb25zICppc2xfYXN0X3ByaW50X29wdGlvbnNfY29weSgKKwlfX2lzbF9rZWVwIGlzbF9hc3RfcHJpbnRfb3B0aW9ucyAqb3B0aW9ucyk7Cit2b2lkICppc2xfYXN0X3ByaW50X29wdGlvbnNfZnJlZShfX2lzbF90YWtlIGlzbF9hc3RfcHJpbnRfb3B0aW9ucyAqb3B0aW9ucyk7Citpc2xfY3R4ICppc2xfYXN0X3ByaW50X29wdGlvbnNfZ2V0X2N0eCgKKwlfX2lzbF9rZWVwIGlzbF9hc3RfcHJpbnRfb3B0aW9ucyAqb3B0aW9ucyk7CisKK19faXNsX2dpdmUgaXNsX2FzdF9wcmludF9vcHRpb25zICppc2xfYXN0X3ByaW50X29wdGlvbnNfc2V0X3ByaW50X3VzZXIoCisJX19pc2xfdGFrZSBpc2xfYXN0X3ByaW50X29wdGlvbnMgKm9wdGlvbnMsCisJX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqKCpwcmludF91c2VyKShfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLAorCQlfX2lzbF90YWtlIGlzbF9hc3RfcHJpbnRfb3B0aW9ucyAqb3B0aW9ucywKKwkJX19pc2xfa2VlcCBpc2xfYXN0X25vZGUgKm5vZGUsIHZvaWQgKnVzZXIpLAorCXZvaWQgKnVzZXIpOworX19pc2xfZ2l2ZSBpc2xfYXN0X3ByaW50X29wdGlvbnMgKmlzbF9hc3RfcHJpbnRfb3B0aW9uc19zZXRfcHJpbnRfZm9yKAorCV9faXNsX3Rha2UgaXNsX2FzdF9wcmludF9vcHRpb25zICpvcHRpb25zLAorCV9faXNsX2dpdmUgaXNsX3ByaW50ZXIgKigqcHJpbnRfZm9yKShfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLAorCQlfX2lzbF90YWtlIGlzbF9hc3RfcHJpbnRfb3B0aW9ucyAqb3B0aW9ucywKKwkJX19pc2xfa2VlcCBpc2xfYXN0X25vZGUgKm5vZGUsIHZvaWQgKnVzZXIpLAorCXZvaWQgKnVzZXIpOworCitpbnQgaXNsX2FzdF9ub2RlX2ZvcmVhY2hfYXN0X29wX3R5cGUoX19pc2xfa2VlcCBpc2xfYXN0X25vZGUgKm5vZGUsCisJaW50ICgqZm4pKGVudW0gaXNsX2FzdF9vcF90eXBlIHR5cGUsIHZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9hc3Rfb3BfdHlwZV9wcmludF9tYWNybygKKwllbnVtIGlzbF9hc3Rfb3BfdHlwZSB0eXBlLCBfX2lzbF90YWtlIGlzbF9wcmludGVyICpwKTsKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9hc3Rfbm9kZV9wcmludF9tYWNyb3MoCisJX19pc2xfa2VlcCBpc2xfYXN0X25vZGUgKm5vZGUsIF9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnApOworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX2FzdF9ub2RlX3ByaW50KF9faXNsX2tlZXAgaXNsX2FzdF9ub2RlICpub2RlLAorCV9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsCisJX19pc2xfdGFrZSBpc2xfYXN0X3ByaW50X29wdGlvbnMgKm9wdGlvbnMpOworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX2FzdF9ub2RlX2Zvcl9wcmludChfX2lzbF9rZWVwIGlzbF9hc3Rfbm9kZSAqbm9kZSwKKwlfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLAorCV9faXNsX3Rha2UgaXNsX2FzdF9wcmludF9vcHRpb25zICpvcHRpb25zKTsKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9hc3Rfbm9kZV9pZl9wcmludChfX2lzbF9rZWVwIGlzbF9hc3Rfbm9kZSAqbm9kZSwKKwlfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLAorCV9faXNsX3Rha2UgaXNsX2FzdF9wcmludF9vcHRpb25zICpvcHRpb25zKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2lzbC9hc3RfYnVpbGQuaCBiL2luY2x1ZGUvaXNsL2FzdF9idWlsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyOTRlZDcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2lzbC9hc3RfYnVpbGQuaApAQCAtMCwwICsxLDkwIEBACisjaWZuZGVmIElTTF9BU1RfQ09OVEVYVF9ICisjZGVmaW5lIElTTF9BU1RfQ09OVEVYVF9ICisKKyNpbmNsdWRlIDxpc2wvY3R4Lmg+CisjaW5jbHVkZSA8aXNsL3NldC5oPgorI2luY2x1ZGUgPGlzbC9hc3QuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgaXNsX2FzdF9idWlsZDsKK3R5cGVkZWYgc3RydWN0IGlzbF9hc3RfYnVpbGQgaXNsX2FzdF9idWlsZDsKKworCitpbnQgaXNsX29wdGlvbnNfc2V0X2FzdF9idWlsZF9hdG9taWNfdXBwZXJfYm91bmQoaXNsX2N0eCAqY3R4LCBpbnQgdmFsKTsKK2ludCBpc2xfb3B0aW9uc19nZXRfYXN0X2J1aWxkX2F0b21pY191cHBlcl9ib3VuZChpc2xfY3R4ICpjdHgpOworCitpbnQgaXNsX29wdGlvbnNfc2V0X2FzdF9idWlsZF9wcmVmZXJfcGRpdihpc2xfY3R4ICpjdHgsIGludCB2YWwpOworaW50IGlzbF9vcHRpb25zX2dldF9hc3RfYnVpbGRfcHJlZmVyX3BkaXYoaXNsX2N0eCAqY3R4KTsKKworaW50IGlzbF9vcHRpb25zX3NldF9hc3RfYnVpbGRfZXhwbG9pdF9uZXN0ZWRfYm91bmRzKGlzbF9jdHggKmN0eCwgaW50IHZhbCk7CitpbnQgaXNsX29wdGlvbnNfZ2V0X2FzdF9idWlsZF9leHBsb2l0X25lc3RlZF9ib3VuZHMoaXNsX2N0eCAqY3R4KTsKKworaW50IGlzbF9vcHRpb25zX3NldF9hc3RfYnVpbGRfZ3JvdXBfY29zY2hlZHVsZWQoaXNsX2N0eCAqY3R4LCBpbnQgdmFsKTsKK2ludCBpc2xfb3B0aW9uc19nZXRfYXN0X2J1aWxkX2dyb3VwX2Nvc2NoZWR1bGVkKGlzbF9jdHggKmN0eCk7CisKKyNkZWZpbmUgSVNMX0FTVF9CVUlMRF9TRVBBUkFUSU9OX0JPVU5EU19FWFBMSUNJVAkJMAorI2RlZmluZSBJU0xfQVNUX0JVSUxEX1NFUEFSQVRJT05fQk9VTkRTX0lNUExJQ0lUCQkxCitpbnQgaXNsX29wdGlvbnNfc2V0X2FzdF9idWlsZF9zZXBhcmF0aW9uX2JvdW5kcyhpc2xfY3R4ICpjdHgsIGludCB2YWwpOworaW50IGlzbF9vcHRpb25zX2dldF9hc3RfYnVpbGRfc2VwYXJhdGlvbl9ib3VuZHMoaXNsX2N0eCAqY3R4KTsKKworaW50IGlzbF9vcHRpb25zX3NldF9hc3RfYnVpbGRfc2NhbGVfc3RyaWRlcyhpc2xfY3R4ICpjdHgsIGludCB2YWwpOworaW50IGlzbF9vcHRpb25zX2dldF9hc3RfYnVpbGRfc2NhbGVfc3RyaWRlcyhpc2xfY3R4ICpjdHgpOworCitpbnQgaXNsX29wdGlvbnNfc2V0X2FzdF9idWlsZF9hbGxvd19lbHNlKGlzbF9jdHggKmN0eCwgaW50IHZhbCk7CitpbnQgaXNsX29wdGlvbnNfZ2V0X2FzdF9idWlsZF9hbGxvd19lbHNlKGlzbF9jdHggKmN0eCk7CisKK2lzbF9jdHggKmlzbF9hc3RfYnVpbGRfZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF9hc3RfYnVpbGQgKmJ1aWxkKTsKKworX19pc2xfZ2l2ZSBpc2xfYXN0X2J1aWxkICppc2xfYXN0X2J1aWxkX2Zyb21fY29udGV4dChfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CisKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfYXN0X2J1aWxkX2dldF9zY2hlZHVsZV9zcGFjZSgKKwlfX2lzbF9rZWVwIGlzbF9hc3RfYnVpbGQgKmJ1aWxkKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX2FzdF9idWlsZF9nZXRfc2NoZWR1bGUoCisJX19pc2xfa2VlcCBpc2xfYXN0X2J1aWxkICpidWlsZCk7CisKK19faXNsX2dpdmUgaXNsX2FzdF9idWlsZCAqaXNsX2FzdF9idWlsZF9yZXN0cmljdCgKKwlfX2lzbF90YWtlIGlzbF9hc3RfYnVpbGQgKmJ1aWxkLCBfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CisKK19faXNsX2dpdmUgaXNsX2FzdF9idWlsZCAqaXNsX2FzdF9idWlsZF9jb3B5KAorCV9faXNsX2tlZXAgaXNsX2FzdF9idWlsZCAqYnVpbGQpOwordm9pZCAqaXNsX2FzdF9idWlsZF9mcmVlKF9faXNsX3Rha2UgaXNsX2FzdF9idWlsZCAqYnVpbGQpOworCitfX2lzbF9naXZlIGlzbF9hc3RfYnVpbGQgKmlzbF9hc3RfYnVpbGRfc2V0X29wdGlvbnMoCisJX19pc2xfdGFrZSBpc2xfYXN0X2J1aWxkICpidWlsZCwKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKm9wdGlvbnMpOworX19pc2xfZ2l2ZSBpc2xfYXN0X2J1aWxkICppc2xfYXN0X2J1aWxkX3NldF9pdGVyYXRvcnMoCisJX19pc2xfdGFrZSBpc2xfYXN0X2J1aWxkICpidWlsZCwKKwlfX2lzbF90YWtlIGlzbF9pZF9saXN0ICppdGVyYXRvcnMpOworX19pc2xfZ2l2ZSBpc2xfYXN0X2J1aWxkICppc2xfYXN0X2J1aWxkX3NldF9hdF9lYWNoX2RvbWFpbigKKwlfX2lzbF90YWtlIGlzbF9hc3RfYnVpbGQgKmJ1aWxkLAorCV9faXNsX2dpdmUgaXNsX2FzdF9ub2RlICooKmZuKShfX2lzbF90YWtlIGlzbF9hc3Rfbm9kZSAqbm9kZSwKKwkJX19pc2xfa2VlcCBpc2xfYXN0X2J1aWxkICpidWlsZCwgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworX19pc2xfZ2l2ZSBpc2xfYXN0X2J1aWxkICppc2xfYXN0X2J1aWxkX3NldF9iZWZvcmVfZWFjaF9mb3IoCisJX19pc2xfdGFrZSBpc2xfYXN0X2J1aWxkICpidWlsZCwKKwlfX2lzbF9naXZlIGlzbF9pZCAqKCpmbikoX19pc2xfa2VlcCBpc2xfYXN0X2J1aWxkICpidWlsZCwKKwkJdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworX19pc2xfZ2l2ZSBpc2xfYXN0X2J1aWxkICppc2xfYXN0X2J1aWxkX3NldF9hZnRlcl9lYWNoX2ZvcigKKwlfX2lzbF90YWtlIGlzbF9hc3RfYnVpbGQgKmJ1aWxkLAorCV9faXNsX2dpdmUgaXNsX2FzdF9ub2RlICooKmZuKShfX2lzbF90YWtlIGlzbF9hc3Rfbm9kZSAqbm9kZSwKKwkJX19pc2xfa2VlcCBpc2xfYXN0X2J1aWxkICpidWlsZCwgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworX19pc2xfZ2l2ZSBpc2xfYXN0X2J1aWxkICppc2xfYXN0X2J1aWxkX3NldF9jcmVhdGVfbGVhZigKKwlfX2lzbF90YWtlIGlzbF9hc3RfYnVpbGQgKmJ1aWxkLAorCV9faXNsX2dpdmUgaXNsX2FzdF9ub2RlICooKmZuKShfX2lzbF90YWtlIGlzbF9hc3RfYnVpbGQgKmJ1aWxkLAorCQl2b2lkICp1c2VyKSwgdm9pZCAqdXNlcik7CisKK19faXNsX2dpdmUgaXNsX2FzdF9leHByICppc2xfYXN0X2J1aWxkX2V4cHJfZnJvbV9wd19hZmYoCisJX19pc2xfa2VlcCBpc2xfYXN0X2J1aWxkICpidWlsZCwgX19pc2xfdGFrZSBpc2xfcHdfYWZmICpwYSk7CitfX2lzbF9naXZlIGlzbF9hc3RfZXhwciAqaXNsX2FzdF9idWlsZF9jYWxsX2Zyb21fcHdfbXVsdGlfYWZmKAorCV9faXNsX2tlZXAgaXNsX2FzdF9idWlsZCAqYnVpbGQsIF9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hKTsKKworX19pc2xfZ2l2ZSBpc2xfYXN0X25vZGUgKmlzbF9hc3RfYnVpbGRfYXN0X2Zyb21fc2NoZWR1bGUoCisJX19pc2xfa2VlcCBpc2xfYXN0X2J1aWxkICpidWlsZCwgX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICpzY2hlZHVsZSk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pc2wvYmFuZC5oIGIvaW5jbHVkZS9pc2wvYmFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YmY1MWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2lzbC9iYW5kLmgKQEAgLTAsMCArMSw1MSBAQAorI2lmbmRlZiBJU0xfQkFORF9ICisjZGVmaW5lIElTTF9CQU5EX0gKKworI2luY2x1ZGUgPGlzbC9wcmludGVyLmg+CisjaW5jbHVkZSA8aXNsL2xpc3QuaD4KKyNpbmNsdWRlIDxpc2wvdW5pb25fbWFwX3R5cGUuaD4KKyNpbmNsdWRlIDxpc2wvdmVjLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IGlzbF9iYW5kOwordHlwZWRlZiBzdHJ1Y3QgaXNsX2JhbmQgaXNsX2JhbmQ7CisKK19faXNsX2dpdmUgaXNsX2JhbmQgKmlzbF9iYW5kX2NvcHkoX19pc2xfa2VlcCBpc2xfYmFuZCAqYmFuZCk7Cit2b2lkICppc2xfYmFuZF9mcmVlKF9faXNsX3Rha2UgaXNsX2JhbmQgKmJhbmQpOworCitpc2xfY3R4ICppc2xfYmFuZF9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX2JhbmQgKmJhbmQpOworCitpbnQgaXNsX2JhbmRfaGFzX2NoaWxkcmVuKF9faXNsX2tlZXAgaXNsX2JhbmQgKmJhbmQpOworX19pc2xfZ2l2ZSBpc2xfYmFuZF9saXN0ICppc2xfYmFuZF9nZXRfY2hpbGRyZW4oCisJX19pc2xfa2VlcCBpc2xfYmFuZCAqYmFuZCk7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX2JhbmRfZ2V0X3ByZWZpeF9zY2hlZHVsZSgKKwlfX2lzbF9rZWVwIGlzbF9iYW5kICpiYW5kKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX2JhbmRfZ2V0X3BhcnRpYWxfc2NoZWR1bGUoCisJX19pc2xfa2VlcCBpc2xfYmFuZCAqYmFuZCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF9iYW5kX2dldF9zdWZmaXhfc2NoZWR1bGUoCisJX19pc2xfa2VlcCBpc2xfYmFuZCAqYmFuZCk7CisKK2ludCBpc2xfb3B0aW9uc19zZXRfdGlsZV9zY2FsZV90aWxlX2xvb3BzKGlzbF9jdHggKmN0eCwgaW50IHZhbCk7CitpbnQgaXNsX29wdGlvbnNfZ2V0X3RpbGVfc2NhbGVfdGlsZV9sb29wcyhpc2xfY3R4ICpjdHgpOworCitpbnQgaXNsX2JhbmRfdGlsZShfX2lzbF9rZWVwIGlzbF9iYW5kICpiYW5kLCBfX2lzbF90YWtlIGlzbF92ZWMgKnNpemVzKTsKKworaW50IGlzbF9iYW5kX25fbWVtYmVyKF9faXNsX2tlZXAgaXNsX2JhbmQgKmJhbmQpOworaW50IGlzbF9iYW5kX21lbWJlcl9pc196ZXJvX2Rpc3RhbmNlKF9faXNsX2tlZXAgaXNsX2JhbmQgKmJhbmQsIGludCBwb3MpOworCitpbnQgaXNsX2JhbmRfbGlzdF9mb3JlYWNoX2JhbmQoX19pc2xfa2VlcCBpc2xfYmFuZF9saXN0ICpsaXN0LAorCWludCAoKmZuKShfX2lzbF9rZWVwIGlzbF9iYW5kICpiYW5kLCB2b2lkICp1c2VyKSwgdm9pZCAqdXNlcik7CisKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X2JhbmQoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwKKwlfX2lzbF9rZWVwIGlzbF9iYW5kICpiYW5kKTsKK3ZvaWQgaXNsX2JhbmRfZHVtcChfX2lzbF9rZWVwIGlzbF9iYW5kICpiYW5kKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2lzbC9ibGsuaCBiL2luY2x1ZGUvaXNsL2Jsay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZDhjZjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2lzbC9ibGsuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBLYXRob2xpZWtlIFVuaXZlcnNpdGVpdCBMZXV2ZW4KKyAqCisgKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgTUlUIGxpY2Vuc2UKKyAqCisgKiBXcml0dGVuIGJ5IFN2ZW4gVmVyZG9vbGFlZ2UsIEsuVS5MZXV2ZW4sIERlcGFydGVtZW50CisgKiBDb21wdXRlcndldGVuc2NoYXBwZW4sIENlbGVzdGlqbmVubGFhbiAyMDBBLCBCLTMwMDEgTGV1dmVuLCBCZWxnaXVtCisgKi8KKworI2lmbmRlZiBJU0xfQkxLX0gKKyNkZWZpbmUgSVNMX0JMS19ICisKKyNpbmNsdWRlIDxpc2wvaW50Lmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IGlzbF9ibGsgeworCXNpemVfdCBzaXplOworCWlzbF9pbnQgKmRhdGE7Cit9OworCisjZGVmaW5lIElTTF9CTEtfQ0FDSEVfU0laRQkyMAorCitzdHJ1Y3QgaXNsX2N0eDsKKworc3RydWN0IGlzbF9ibGsgaXNsX2Jsa19hbGxvYyhzdHJ1Y3QgaXNsX2N0eCAqY3R4LCBzaXplX3Qgbik7CitzdHJ1Y3QgaXNsX2JsayBpc2xfYmxrX2VtcHR5KHZvaWQpOworaW50IGlzbF9ibGtfaXNfZXJyb3Ioc3RydWN0IGlzbF9ibGsgYmxvY2spOworc3RydWN0IGlzbF9ibGsgaXNsX2Jsa19leHRlbmQoc3RydWN0IGlzbF9jdHggKmN0eCwgc3RydWN0IGlzbF9ibGsgYmxvY2ssCisJCQkJc2l6ZV90IG5ld19uKTsKK3ZvaWQgaXNsX2Jsa19mcmVlKHN0cnVjdCBpc2xfY3R4ICpjdHgsIHN0cnVjdCBpc2xfYmxrIGJsb2NrKTsKK3ZvaWQgaXNsX2Jsa19jbGVhcl9jYWNoZShzdHJ1Y3QgaXNsX2N0eCAqY3R4KTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2lzbC9jb25maWcuaCBiL2luY2x1ZGUvaXNsL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNjljMjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2lzbC9jb25maWcuaApAQCAtMCwwICsxLDQgQEAKKy8qIGluY2x1ZGUvaXNsL2NvbmZpZy5oLiAgR2VuZXJhdGVkIGZyb20gY29uZmlnLmguaW4gYnkgY29uZmlndXJlLiAgKi8KKyNkZWZpbmUgR0NDX1dBUk5fVU5VU0VEX1JFU1VMVCBfX2F0dHJpYnV0ZV9fKChfX3dhcm5fdW51c2VkX3Jlc3VsdF9fKSkKKworLyogI3VuZGVmIElTTF9QSVBMSUIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaXNsL2NvbnN0cmFpbnQuaCBiL2luY2x1ZGUvaXNsL2NvbnN0cmFpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjRlNDRkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9pc2wvY29uc3RyYWludC5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBLYXRob2xpZWtlIFVuaXZlcnNpdGVpdCBMZXV2ZW4KKyAqCisgKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgTUlUIGxpY2Vuc2UKKyAqCisgKiBXcml0dGVuIGJ5IFN2ZW4gVmVyZG9vbGFlZ2UsIEsuVS5MZXV2ZW4sIERlcGFydGVtZW50CisgKiBDb21wdXRlcndldGVuc2NoYXBwZW4sIENlbGVzdGlqbmVubGFhbiAyMDBBLCBCLTMwMDEgTGV1dmVuLCBCZWxnaXVtCisgKi8KKworI2lmbmRlZiBJU0xfQ09OU1RSQUlOVF9ICisjZGVmaW5lIElTTF9DT05TVFJBSU5UX0gKKworI2luY2x1ZGUgPGlzbC9sb2NhbF9zcGFjZS5oPgorI2luY2x1ZGUgPGlzbC9zcGFjZS5oPgorI2luY2x1ZGUgPGlzbC9hZmZfdHlwZS5oPgorI2luY2x1ZGUgPGlzbC9zZXRfdHlwZS5oPgorI2luY2x1ZGUgPGlzbC9wcmludGVyLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IGlzbF9jb25zdHJhaW50OwordHlwZWRlZiBzdHJ1Y3QgaXNsX2NvbnN0cmFpbnQgaXNsX2NvbnN0cmFpbnQ7CisKK2lzbF9jdHggKmlzbF9jb25zdHJhaW50X2dldF9jdHgoX19pc2xfa2VlcCBpc2xfY29uc3RyYWludCAqYyk7CisKK19faXNsX2dpdmUgaXNsX2NvbnN0cmFpbnQgKmlzbF9lcXVhbGl0eV9hbGxvYyhfX2lzbF90YWtlIGlzbF9sb2NhbF9zcGFjZSAqbHMpOworX19pc2xfZ2l2ZSBpc2xfY29uc3RyYWludCAqaXNsX2luZXF1YWxpdHlfYWxsb2MoX19pc2xfdGFrZSBpc2xfbG9jYWxfc3BhY2UgKmxzKTsKKworc3RydWN0IGlzbF9jb25zdHJhaW50ICppc2xfY29uc3RyYWludF9jb3coc3RydWN0IGlzbF9jb25zdHJhaW50ICpjKTsKK3N0cnVjdCBpc2xfY29uc3RyYWludCAqaXNsX2NvbnN0cmFpbnRfY29weShzdHJ1Y3QgaXNsX2NvbnN0cmFpbnQgKmMpOwordm9pZCAqaXNsX2NvbnN0cmFpbnRfZnJlZShfX2lzbF90YWtlIGlzbF9jb25zdHJhaW50ICpjKTsKKworaW50IGlzbF9iYXNpY19zZXRfbl9jb25zdHJhaW50KF9faXNsX2tlZXAgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitpbnQgaXNsX2Jhc2ljX21hcF9mb3JlYWNoX2NvbnN0cmFpbnQoX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwLAorCWludCAoKmZuKShfX2lzbF90YWtlIGlzbF9jb25zdHJhaW50ICpjLCB2b2lkICp1c2VyKSwgdm9pZCAqdXNlcik7CitpbnQgaXNsX2Jhc2ljX3NldF9mb3JlYWNoX2NvbnN0cmFpbnQoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0LAorCWludCAoKmZuKShfX2lzbF90YWtlIGlzbF9jb25zdHJhaW50ICpjLCB2b2lkICp1c2VyKSwgdm9pZCAqdXNlcik7CitpbnQgaXNsX2NvbnN0cmFpbnRfaXNfZXF1YWwoc3RydWN0IGlzbF9jb25zdHJhaW50ICpjb25zdHJhaW50MSwKKwkJCSAgICBzdHJ1Y3QgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQyKTsKKworaW50IGlzbF9iYXNpY19zZXRfZm9yZWFjaF9ib3VuZF9wYWlyKF9faXNsX2tlZXAgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsCisJaW50ICgqZm4pKF9faXNsX3Rha2UgaXNsX2NvbnN0cmFpbnQgKmxvd2VyLAorCQkgIF9faXNsX3Rha2UgaXNsX2NvbnN0cmFpbnQgKnVwcGVyLAorCQkgIF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworCitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfYWRkX2NvbnN0cmFpbnQoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwLCBfX2lzbF90YWtlIGlzbF9jb25zdHJhaW50ICpjb25zdHJhaW50KTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9hZGRfY29uc3RyYWludCgKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQsIF9faXNsX3Rha2UgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2FkZF9jb25zdHJhaW50KF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCV9faXNsX3Rha2UgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2FkZF9jb25zdHJhaW50KF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCV9faXNsX3Rha2UgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQpOworCitpbnQgaXNsX2Jhc2ljX21hcF9oYXNfZGVmaW5pbmdfZXF1YWxpdHkoCisJX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBpbnQgcG9zLAorCV9faXNsX2dpdmUgaXNsX2NvbnN0cmFpbnQgKipjKTsKK2ludCBpc2xfYmFzaWNfc2V0X2hhc19kZWZpbmluZ19lcXVhbGl0eSgKKwlzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqYnNldCwgZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgaW50IHBvcywKKwlzdHJ1Y3QgaXNsX2NvbnN0cmFpbnQgKipjb25zdHJhaW50KTsKK2ludCBpc2xfYmFzaWNfc2V0X2hhc19kZWZpbmluZ19pbmVxdWFsaXRpZXMoCisJc3RydWN0IGlzbF9iYXNpY19zZXQgKmJzZXQsIGVudW0gaXNsX2RpbV90eXBlIHR5cGUsIGludCBwb3MsCisJc3RydWN0IGlzbF9jb25zdHJhaW50ICoqbG93ZXIsCisJc3RydWN0IGlzbF9jb25zdHJhaW50ICoqdXBwZXIpOworCitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2NvbnN0cmFpbnRfZ2V0X3NwYWNlKAorCV9faXNsX2tlZXAgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQpOworX19pc2xfZ2l2ZSBpc2xfbG9jYWxfc3BhY2UgKmlzbF9jb25zdHJhaW50X2dldF9sb2NhbF9zcGFjZSgKKwlfX2lzbF9rZWVwIGlzbF9jb25zdHJhaW50ICpjb25zdHJhaW50KTsKK2ludCBpc2xfY29uc3RyYWludF9kaW0oc3RydWN0IGlzbF9jb25zdHJhaW50ICpjb25zdHJhaW50LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworCitpbnQgaXNsX2NvbnN0cmFpbnRfaW52b2x2ZXNfZGltcyhfX2lzbF9rZWVwIGlzbF9jb25zdHJhaW50ICpjb25zdHJhaW50LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKKworY29uc3QgY2hhciAqaXNsX2NvbnN0cmFpbnRfZ2V0X2RpbV9uYW1lKF9faXNsX2tlZXAgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK3ZvaWQgaXNsX2NvbnN0cmFpbnRfZ2V0X2NvbnN0YW50KF9faXNsX2tlZXAgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQsCisJaXNsX2ludCAqdik7Cit2b2lkIGlzbF9jb25zdHJhaW50X2dldF9jb2VmZmljaWVudChfX2lzbF9rZWVwIGlzbF9jb25zdHJhaW50ICpjb25zdHJhaW50LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIGludCBwb3MsIGlzbF9pbnQgKnYpOworX19pc2xfZ2l2ZSBpc2xfY29uc3RyYWludCAqaXNsX2NvbnN0cmFpbnRfc2V0X2NvbnN0YW50KAorCV9faXNsX3Rha2UgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQsIGlzbF9pbnQgdik7CitfX2lzbF9naXZlIGlzbF9jb25zdHJhaW50ICppc2xfY29uc3RyYWludF9zZXRfY29uc3RhbnRfc2koCisJX19pc2xfdGFrZSBpc2xfY29uc3RyYWludCAqY29uc3RyYWludCwgaW50IHYpOworX19pc2xfZ2l2ZSBpc2xfY29uc3RyYWludCAqaXNsX2NvbnN0cmFpbnRfc2V0X2NvZWZmaWNpZW50KAorCV9faXNsX3Rha2UgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgaW50IHBvcywgaXNsX2ludCB2KTsKK19faXNsX2dpdmUgaXNsX2NvbnN0cmFpbnQgKmlzbF9jb25zdHJhaW50X3NldF9jb2VmZmljaWVudF9zaSgKKwlfX2lzbF90YWtlIGlzbF9jb25zdHJhaW50ICpjb25zdHJhaW50LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIGludCBwb3MsIGludCB2KTsKKworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfY29uc3RyYWludF9nZXRfZGl2KF9faXNsX2tlZXAgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQsCisJaW50IHBvcyk7CisKK3N0cnVjdCBpc2xfY29uc3RyYWludCAqaXNsX2NvbnN0cmFpbnRfbmVnYXRlKHN0cnVjdCBpc2xfY29uc3RyYWludCAqY29uc3RyYWludCk7CisKK2ludCBpc2xfY29uc3RyYWludF9pc19lcXVhbGl0eShfX2lzbF9rZWVwIGlzbF9jb25zdHJhaW50ICpjb25zdHJhaW50KTsKK2ludCBpc2xfY29uc3RyYWludF9pc19kaXZfY29uc3RyYWludChfX2lzbF9rZWVwIGlzbF9jb25zdHJhaW50ICpjb25zdHJhaW50KTsKKworaW50IGlzbF9jb25zdHJhaW50X2lzX2xvd2VyX2JvdW5kKF9faXNsX2tlZXAgaXNsX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK2ludCBpc2xfY29uc3RyYWludF9pc191cHBlcl9ib3VuZChfX2lzbF9rZWVwIGlzbF9jb25zdHJhaW50ICpjb25zdHJhaW50LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CisKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9mcm9tX2NvbnN0cmFpbnQoCisJX19pc2xfdGFrZSBpc2xfY29uc3RyYWludCAqY29uc3RyYWludCk7CitzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9mcm9tX2NvbnN0cmFpbnQoCisJc3RydWN0IGlzbF9jb25zdHJhaW50ICpjb25zdHJhaW50KTsKKworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfY29uc3RyYWludF9nZXRfYm91bmQoCisJX19pc2xfa2VlcCBpc2xfY29uc3RyYWludCAqY29uc3RyYWludCwgZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgaW50IHBvcyk7CitfX2lzbF9naXZlIGlzbF9hZmYgKmlzbF9jb25zdHJhaW50X2dldF9hZmYoCisJX19pc2xfa2VlcCBpc2xfY29uc3RyYWludCAqY29uc3RyYWludCk7CitfX2lzbF9naXZlIGlzbF9jb25zdHJhaW50ICppc2xfZXF1YWxpdHlfZnJvbV9hZmYoX19pc2xfdGFrZSBpc2xfYWZmICphZmYpOworX19pc2xfZ2l2ZSBpc2xfY29uc3RyYWludCAqaXNsX2luZXF1YWxpdHlfZnJvbV9hZmYoX19pc2xfdGFrZSBpc2xfYWZmICphZmYpOworCitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfZHJvcF9jb25zdHJhaW50KAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwgX19pc2xfdGFrZSBpc2xfY29uc3RyYWludCAqY29uc3RyYWludCk7CisKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X2NvbnN0cmFpbnQoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwKKwlfX2lzbF9rZWVwIGlzbF9jb25zdHJhaW50ICpjKTsKK3ZvaWQgaXNsX2NvbnN0cmFpbnRfZHVtcChfX2lzbF9rZWVwIGlzbF9jb25zdHJhaW50ICpjKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2luY2x1ZGUgPGlzbC9kaW0uaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2lzbC9jdHguaCBiL2luY2x1ZGUvaXNsL2N0eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkODg2OTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2lzbC9jdHguaApAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgS2F0aG9saWVrZSBVbml2ZXJzaXRlaXQgTGV1dmVuCisgKgorICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIE1JVCBsaWNlbnNlCisgKgorICogV3JpdHRlbiBieSBTdmVuIFZlcmRvb2xhZWdlLCBLLlUuTGV1dmVuLCBEZXBhcnRlbWVudAorICogQ29tcHV0ZXJ3ZXRlbnNjaGFwcGVuLCBDZWxlc3Rpam5lbmxhYW4gMjAwQSwgQi0zMDAxIExldXZlbiwgQmVsZ2l1bQorICovCisKKyNpZm5kZWYgSVNMX0NUWF9ICisjZGVmaW5lIElTTF9DVFhfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGlzbC9pbnQuaD4KKyNpbmNsdWRlIDxpc2wvYmxrLmg+CisjaW5jbHVkZSA8aXNsL2FyZy5oPgorI2luY2x1ZGUgPGlzbC9oYXNoLmg+CisjaW5jbHVkZSA8aXNsL2NvbmZpZy5oPgorCisjaWZuZGVmIF9faXNsX2dpdmUKKyNkZWZpbmUgX19pc2xfZ2l2ZQorI2VuZGlmCisjaWZuZGVmIF9faXNsX3Rha2UKKyNkZWZpbmUgX19pc2xfdGFrZQorI2VuZGlmCisjaWZuZGVmIF9faXNsX2tlZXAKKyNkZWZpbmUgX19pc2xfa2VlcAorI2VuZGlmCisjaWZuZGVmIF9faXNsX2V4cG9ydAorI2RlZmluZSBfX2lzbF9leHBvcnQKKyNlbmRpZgorI2lmbmRlZiBfX2lzbF9jb25zdHJ1Y3RvcgorI2RlZmluZSBfX2lzbF9jb25zdHJ1Y3RvcgorI2VuZGlmCisjaWZuZGVmIF9faXNsX3N1YmNsYXNzCisjZGVmaW5lIF9faXNsX3N1YmNsYXNzKHN1cGVyKQorI2VuZGlmCisKKyNpZmRlZiBHQ0NfV0FSTl9VTlVTRURfUkVTVUxUCisjZGVmaW5lCVdBUk5fVU5VU0VECUdDQ19XQVJOX1VOVVNFRF9SRVNVTFQKKyNlbHNlCisjZGVmaW5lIFdBUk5fVU5VU0VECisjZW5kaWYKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBOZWFybHkgYWxsIGlzYSBmdW5jdGlvbnMgcmVxdWlyZSBhIHN0cnVjdCBpc2xfY3R4IGFsbG9jYXRlZCB1c2luZworICogaXNsX2N0eF9hbGxvYy4gIFRoaXMgY3R4IGNvbnRhaW5zIChvciB3aWxsIGNvbnRhaW4pIG9wdGlvbnMgdGhhdAorICogY29udHJvbCB0aGUgYmVoYXZpb3Igb2YgdGhlIGxpYnJhcnkgYW5kIHNvbWUgY2FjaGVzLgorICoKKyAqIEFuIG9iamVjdCBhbGxvY2F0ZWQgd2l0aGluIGEgZ2l2ZW4gY3R4IHNob3VsZCBuZXZlciBiZSB1c2VkIGluc2lkZQorICogYW5vdGhlciBjdHguICBGdW5jdGlvbnMgZm9yIG1vdmluZyBvYmplY3RzIGZyb20gb25lIGN0eCB0byBhbm90aGVyCisgKiB3aWxsIGJlIGFkZGVkIGFzIHRoZSBuZWVkIGFyaXNlcy4KKyAqCisgKiBBIGdpdmVuIGNvbnRleHQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbnNpZGUgYSBzaW5nbGUgdGhyZWFkLgorICogQSBnbG9iYWwgY29udGV4dCBmb3Igc3luY2hyb25pemF0aW9uIGJldHdlZW4gZGlmZmVyZW50IHRocmVhZHMKKyAqIGFzIHdlbGwgYXMgZnVuY3Rpb25zIGZvciBtb3ZpbmcgYSBjb250ZXh0IHRvIGEgZGlmZmVyZW50IHRocmVhZAorICogd2lsbCBiZSBhZGRlZCBhcyB0aGUgbmVlZCBhcmlzZXMuCisgKgorICogSWYgYW55dGhpbmcgZ29lcyB3cm9uZyAob3V0IG9mIG1lbW9yeSwgZmFpbGVkIGFzc2VydGlvbiksIHRoZW4KKyAqIHRoZSBsaWJyYXJ5IHdpbGwgY3VycmVudGx5IHNpbXBseSBhYm9ydC4gIFRoaXMgd2lsbCBiZSBtYWRlCisgKiBjb25maWd1cmFibGUgaW4gdGhlIGZ1dHVyZS4KKyAqIFVzZXJzIG9mIHRoZSBsaWJyYXJ5IHNob3VsZCBleHBlY3QgZnVuY3Rpb25zIHRoYXQgcmV0dXJuCisgKiBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUsIHRvIHJldHVybiBOVUxMLCBpbmRpY2F0aW5nIGZhaWx1cmUuCisgKiBBbnkgZnVuY3Rpb24gYWNjZXB0aW5nIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSB3aWxsIHRyZWF0CisgKiBhIE5VTEwgYXJndW1lbnQgYXMgYSBmYWlsdXJlLCByZXN1bHRpbmcgaW4gdGhlIGZ1bmN0aW9uIGZyZWVpbmcKKyAqIHRoZSByZW1haW5pbmcgc3RydWN0dXJlcyAoaWYgYW55KSBhbmQgcmV0dXJuaW5nIE5VTEwgaXRzZWxmCisgKiAoaW4gY2FzZSBvZiBwb2ludGVyIHJldHVybiB0eXBlKS4KKyAqIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyB0aGUgaXNsX2N0eCBhcmd1bWVudCwgd2hpY2ggc2hvdWxkIG5ldmVyIGJlIE5VTEwuCisgKi8KK3N0cnVjdCBpc2xfc3RhdHMgeworCWxvbmcJZ2JyX3NvbHZlZF9scHM7Cit9OworZW51bSBpc2xfZXJyb3IgeworCWlzbF9lcnJvcl9ub25lID0gMCwKKwlpc2xfZXJyb3JfYWJvcnQsCisJaXNsX2Vycm9yX3Vua25vd24sCisJaXNsX2Vycm9yX2ludGVybmFsLAorCWlzbF9lcnJvcl9pbnZhbGlkLAorCWlzbF9lcnJvcl91bnN1cHBvcnRlZAorfTsKK3N0cnVjdCBpc2xfY3R4OwordHlwZWRlZiBzdHJ1Y3QgaXNsX2N0eCBpc2xfY3R4OworCisvKiBTb21lIGhlbHBlciBtYWNyb3MgKi8KKworI2RlZmluZSBJU0xfRkxfSU5JVChsLCBmKSAgIChsKSA9IChmKSAgICAgICAgICAgICAgIC8qIFNwZWNpZmljIGZsYWdzIGxvY2F0aW9uLiAqLworI2RlZmluZSBJU0xfRkxfU0VUKGwsIGYpICAgICgobCkgfD0gKGYpKQorI2RlZmluZSBJU0xfRkxfQ0xSKGwsIGYpICAgICgobCkgJj0gfihmKSkKKyNkZWZpbmUgSVNMX0ZMX0lTU0VUKGwsIGYpICAoISEoKGwpICYgKGYpKSkKKworI2RlZmluZSBJU0xfRl9JTklUKHAsIGYpICAgIElTTF9GTF9JTklUKChwKS0+ZmxhZ3MsIGYpICAvKiBTdHJ1Y3R1cmUgZWxlbWVudCBmbGFncy4gKi8KKyNkZWZpbmUgSVNMX0ZfU0VUKHAsIGYpICAgICBJU0xfRkxfU0VUKChwKS0+ZmxhZ3MsIGYpCisjZGVmaW5lIElTTF9GX0NMUihwLCBmKSAgICAgSVNMX0ZMX0NMUigocCktPmZsYWdzLCBmKQorI2RlZmluZSBJU0xfRl9JU1NFVChwLCBmKSAgIElTTF9GTF9JU1NFVCgocCktPmZsYWdzLCBmKQorCisvKiBpc2xfY2hlY2tfY3R4KCkgY2hlY2tzIGF0IGNvbXBpbGUgdGltZSBpZiAnY3R4JyBpcyBvZiB0eXBlICdpc2xfY3R4IConIGFuZAorICogcmV0dXJucyB0aGUgdmFsdWUgb2YgJ2V4cHInLiBJdCBpcyB1c2VkIHRvIGVuc3VyZSwgdGhhdCBhbHdheXMgYW4gaXNsX2N0eCBpcworICogcGFzc2VkIHRvIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBldmVuIGlmIHRoZXkgY3VycmVudGx5IGRvIG5vdCB1c2UgaXQuCisgKi8KKyNkZWZpbmUgaXNsX2NoZWNrX2N0eChjdHgsIGV4cHIpCSgoY3R4ICE9IChpc2xfY3R4ICopIDApID8gZXhwciA6IGV4cHIpCisKKyNkZWZpbmUgaXNsX2FsbG9jKGN0eCx0eXBlLHNpemUpCSgodHlwZSAqKWlzbF9jaGVja19jdHgoY3R4LFwKKwkJCQkJCQltYWxsb2Moc2l6ZSkpKQorI2RlZmluZSBpc2xfY2FsbG9jKGN0eCx0eXBlLHNpemUpCSgodHlwZSAqKWlzbF9jaGVja19jdHgoY3R4LFwKKwkJCQkJCQljYWxsb2MoMSwgc2l6ZSkpKQorI2RlZmluZSBpc2xfcmVhbGxvYyhjdHgscHRyLHR5cGUsc2l6ZSkJKCh0eXBlICopaXNsX2NoZWNrX2N0eChjdHgsXAorCQkJCQkJCXJlYWxsb2MocHRyLHNpemUpKSkKKyNkZWZpbmUgaXNsX2FsbG9jX3R5cGUoY3R4LHR5cGUpCWlzbF9hbGxvYyhjdHgsdHlwZSxzaXplb2YodHlwZSkpCisjZGVmaW5lIGlzbF9jYWxsb2NfdHlwZShjdHgsdHlwZSkJaXNsX2NhbGxvYyhjdHgsdHlwZSxzaXplb2YodHlwZSkpCisjZGVmaW5lIGlzbF9yZWFsbG9jX3R5cGUoY3R4LHB0cix0eXBlKQlpc2xfcmVhbGxvYyhjdHgscHRyLHR5cGUsc2l6ZW9mKHR5cGUpKQorI2RlZmluZSBpc2xfYWxsb2NfYXJyYXkoY3R4LHR5cGUsbikJaXNsX2FsbG9jKGN0eCx0eXBlLChuKSpzaXplb2YodHlwZSkpCisjZGVmaW5lIGlzbF9jYWxsb2NfYXJyYXkoY3R4LHR5cGUsbikJKCh0eXBlICopaXNsX2NoZWNrX2N0eChjdHgsXAorCQkJCQkJY2FsbG9jKG4sIHNpemVvZih0eXBlKSkpKQorI2RlZmluZSBpc2xfcmVhbGxvY19hcnJheShjdHgscHRyLHR5cGUsbikgXAorCQkJCSAgICBpc2xfcmVhbGxvYyhjdHgscHRyLHR5cGUsKG4pKnNpemVvZih0eXBlKSkKKworI2RlZmluZSBpc2xfZGllKGN0eCxlcnJubyxtc2csY29kZSkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlzbF9oYW5kbGVfZXJyb3IoY3R4LCBlcnJubywgbXNnLCBfX0ZJTEVfXywgX19MSU5FX18pOwlcCisJCWNvZGU7CQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCit2b2lkIGlzbF9oYW5kbGVfZXJyb3IoaXNsX2N0eCAqY3R4LCBlbnVtIGlzbF9lcnJvciBlcnJvciwgY29uc3QgY2hhciAqbXNnLAorCWNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKTsKKworI2RlZmluZSBpc2xfYXNzZXJ0NChjdHgsdGVzdCxjb2RlLGVycm5vKQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpZiAodGVzdCkJCQkJCQlcCisJCQlicmVhazsJCQkJCQlcCisJCWlzbF9kaWUoY3R4LCBlcnJubywgIkFzc2VydGlvbiBcIiIgI3Rlc3QgIlwiIGZhaWxlZCIsIGNvZGUpOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgaXNsX2Fzc2VydChjdHgsdGVzdCxjb2RlKQkJCQkJXAorCWlzbF9hc3NlcnQ0KGN0eCx0ZXN0LGNvZGUsaXNsX2Vycm9yX3Vua25vd24pCisKKyNkZWZpbmUgaXNsX21pbihhLGIpCQkJKChhIDwgYikgPyAoYSkgOiAoYikpCisKKy8qIHN0cnVjdCBpc2xfY3R4IGZ1bmN0aW9ucyAqLworCitzdHJ1Y3QgaXNsX29wdGlvbnMgKmlzbF9jdHhfb3B0aW9ucyhpc2xfY3R4ICpjdHgpOworCitpc2xfY3R4ICppc2xfY3R4X2FsbG9jX3dpdGhfb3B0aW9ucyhzdHJ1Y3QgaXNsX2FyZ3MgKmFyZ3MsCisJX19pc2xfdGFrZSB2b2lkICpvcHQpOworaXNsX2N0eCAqaXNsX2N0eF9hbGxvYyh2b2lkKTsKK3ZvaWQgKmlzbF9jdHhfcGVla19vcHRpb25zKGlzbF9jdHggKmN0eCwgc3RydWN0IGlzbF9hcmdzICphcmdzKTsKK2ludCBpc2xfY3R4X3BhcnNlX29wdGlvbnMoaXNsX2N0eCAqY3R4LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHVuc2lnbmVkIGZsYWdzKTsKK3ZvaWQgaXNsX2N0eF9yZWYoc3RydWN0IGlzbF9jdHggKmN0eCk7Cit2b2lkIGlzbF9jdHhfZGVyZWYoc3RydWN0IGlzbF9jdHggKmN0eCk7Cit2b2lkIGlzbF9jdHhfZnJlZShpc2xfY3R4ICpjdHgpOworCit2b2lkIGlzbF9jdHhfYWJvcnQoaXNsX2N0eCAqY3R4KTsKK3ZvaWQgaXNsX2N0eF9yZXN1bWUoaXNsX2N0eCAqY3R4KTsKK2ludCBpc2xfY3R4X2Fib3J0ZWQoaXNsX2N0eCAqY3R4KTsKKworI2RlZmluZSBJU0xfQVJHX0NUWF9ERUNMKHByZWZpeCxzdCxhcmdzKQkJCQlcCitzdCAqaXNsX2N0eF9wZWVrXyAjIyBwcmVmaXgoaXNsX2N0eCAqY3R4KTsKKworI2RlZmluZSBJU0xfQVJHX0NUWF9ERUYocHJlZml4LHN0LGFyZ3MpCQkJCQlcCitzdCAqaXNsX2N0eF9wZWVrXyAjIyBwcmVmaXgoaXNsX2N0eCAqY3R4KQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiAoc3QgKilpc2xfY3R4X3BlZWtfb3B0aW9ucyhjdHgsICYoYXJncykpOwkJXAorfQorCisjZGVmaW5lIElTTF9DVFhfR0VUX0lOVF9ERUYocHJlZml4LHN0LGFyZ3MsZmllbGQpCQkJXAoraW50IHByZWZpeCAjIyBfZ2V0XyAjIyBmaWVsZChpc2xfY3R4ICpjdHgpCQkJCVwKK3sJCQkJCQkJCQlcCisJc3QgKm9wdGlvbnM7CQkJCQkJCVwKKwlvcHRpb25zID0gaXNsX2N0eF9wZWVrXyAjIyBwcmVmaXgoY3R4KTsJCQkJXAorCWlmICghb3B0aW9ucykJCQkJCQkJXAorCQlpc2xfZGllKGN0eCwgaXNsX2Vycm9yX2ludmFsaWQsCQkJCVwKKwkJCSJpc2xfY3R4IGRvZXMgbm90IHJlZmVyZW5jZSAiICNwcmVmaXgsCQlcCisJCQlyZXR1cm4gLTEpOwkJCQkJXAorCXJldHVybiBvcHRpb25zLT5maWVsZDsJCQkJCQlcCit9CisKKyNkZWZpbmUgSVNMX0NUWF9TRVRfSU5UX0RFRihwcmVmaXgsc3QsYXJncyxmaWVsZCkJCQlcCitpbnQgcHJlZml4ICMjIF9zZXRfICMjIGZpZWxkKGlzbF9jdHggKmN0eCwgaW50IHZhbCkJCQlcCit7CQkJCQkJCQkJXAorCXN0ICpvcHRpb25zOwkJCQkJCQlcCisJb3B0aW9ucyA9IGlzbF9jdHhfcGVla18gIyMgcHJlZml4KGN0eCk7CQkJCVwKKwlpZiAoIW9wdGlvbnMpCQkJCQkJCVwKKwkJaXNsX2RpZShjdHgsIGlzbF9lcnJvcl9pbnZhbGlkLAkJCQlcCisJCQkiaXNsX2N0eCBkb2VzIG5vdCByZWZlcmVuY2UgIiAjcHJlZml4LAkJXAorCQkJcmV0dXJuIC0xKTsJCQkJCVwKKwlvcHRpb25zLT5maWVsZCA9IHZhbDsJCQkJCQlcCisJcmV0dXJuIDA7CQkJCQkJCVwKK30KKworI2RlZmluZSBJU0xfQ1RYX0dFVF9TVFJfREVGKHByZWZpeCxzdCxhcmdzLGZpZWxkKQkJCVwKK2NvbnN0IGNoYXIgKnByZWZpeCAjIyBfZ2V0XyAjIyBmaWVsZChpc2xfY3R4ICpjdHgpCQkJXAorewkJCQkJCQkJCVwKKwlzdCAqb3B0aW9uczsJCQkJCQkJXAorCW9wdGlvbnMgPSBpc2xfY3R4X3BlZWtfICMjIHByZWZpeChjdHgpOwkJCQlcCisJaWYgKCFvcHRpb25zKQkJCQkJCQlcCisJCWlzbF9kaWUoY3R4LCBpc2xfZXJyb3JfaW52YWxpZCwJCQkJXAorCQkJImlzbF9jdHggZG9lcyBub3QgcmVmZXJlbmNlICIgI3ByZWZpeCwJCVwKKwkJCXJldHVybiBOVUxMKTsJCQkJCVwKKwlyZXR1cm4gb3B0aW9ucy0+ZmllbGQ7CQkJCQkJXAorfQorCisjZGVmaW5lIElTTF9DVFhfU0VUX1NUUl9ERUYocHJlZml4LHN0LGFyZ3MsZmllbGQpCQkJXAoraW50IHByZWZpeCAjIyBfc2V0XyAjIyBmaWVsZChpc2xfY3R4ICpjdHgsIGNvbnN0IGNoYXIgKnZhbCkJCVwKK3sJCQkJCQkJCQlcCisJc3QgKm9wdGlvbnM7CQkJCQkJCVwKKwlvcHRpb25zID0gaXNsX2N0eF9wZWVrXyAjIyBwcmVmaXgoY3R4KTsJCQkJXAorCWlmICghb3B0aW9ucykJCQkJCQkJXAorCQlpc2xfZGllKGN0eCwgaXNsX2Vycm9yX2ludmFsaWQsCQkJCVwKKwkJCSJpc2xfY3R4IGRvZXMgbm90IHJlZmVyZW5jZSAiICNwcmVmaXgsCQlcCisJCQlyZXR1cm4gLTEpOwkJCQkJXAorCWlmICghdmFsKQkJCQkJCQlcCisJCXJldHVybiAtMTsJCQkJCQlcCisJZnJlZShvcHRpb25zLT5maWVsZCk7CQkJCQkJXAorCW9wdGlvbnMtPmZpZWxkID0gc3RyZHVwKHZhbCk7CQkJCQlcCisJaWYgKCFvcHRpb25zLT5maWVsZCkJCQkJCQlcCisJCXJldHVybiAtMTsJCQkJCQlcCisJcmV0dXJuIDA7CQkJCQkJCVwKK30KKworI2RlZmluZSBJU0xfQ1RYX0dFVF9CT09MX0RFRihwcmVmaXgsc3QsYXJncyxmaWVsZCkJCQlcCisJSVNMX0NUWF9HRVRfSU5UX0RFRihwcmVmaXgsc3QsYXJncyxmaWVsZCkKKworI2RlZmluZSBJU0xfQ1RYX1NFVF9CT09MX0RFRihwcmVmaXgsc3QsYXJncyxmaWVsZCkJCQlcCisJSVNMX0NUWF9TRVRfSU5UX0RFRihwcmVmaXgsc3QsYXJncyxmaWVsZCkKKworI2RlZmluZSBJU0xfQ1RYX0dFVF9DSE9JQ0VfREVGKHByZWZpeCxzdCxhcmdzLGZpZWxkKQkJCVwKKwlJU0xfQ1RYX0dFVF9JTlRfREVGKHByZWZpeCxzdCxhcmdzLGZpZWxkKQorCisjZGVmaW5lIElTTF9DVFhfU0VUX0NIT0lDRV9ERUYocHJlZml4LHN0LGFyZ3MsZmllbGQpCQkJXAorCUlTTF9DVFhfU0VUX0lOVF9ERUYocHJlZml4LHN0LGFyZ3MsZmllbGQpCisKK2VudW0gaXNsX2Vycm9yIGlzbF9jdHhfbGFzdF9lcnJvcihpc2xfY3R4ICpjdHgpOwordm9pZCBpc2xfY3R4X3Jlc2V0X2Vycm9yKGlzbF9jdHggKmN0eCk7Cit2b2lkIGlzbF9jdHhfc2V0X2Vycm9yKGlzbF9jdHggKmN0eCwgZW51bSBpc2xfZXJyb3IgZXJyb3IpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaXNsL2RpbS5oIGIvaW5jbHVkZS9pc2wvZGltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MzMWMwMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaXNsL2RpbS5oCkBAIC0wLDAgKzEsMTIyIEBACisjaWZuZGVmIElTTF9ESU1fSAorI2RlZmluZSBJU0xfRElNX0gKKworI2luY2x1ZGUgPGlzbC9zcGFjZS5oPgorI2luY2x1ZGUgPGlzbC9sb2NhbF9zcGFjZS5oPgorI2luY2x1ZGUgPGlzbC9hZmZfdHlwZS5oPgorI2luY2x1ZGUgPGlzbC9jb25zdHJhaW50Lmg+CisjaW5jbHVkZSA8aXNsL21hcF90eXBlLmg+CisjaW5jbHVkZSA8aXNsL3NldF90eXBlLmg+CisjaW5jbHVkZSA8aXNsL3BvaW50Lmg+CisjaW5jbHVkZSA8aXNsL3VuaW9uX21hcC5oPgorI2luY2x1ZGUgPGlzbC91bmlvbl9zZXQuaD4KKyNpbmNsdWRlIDxpc2wvcG9seW5vbWlhbF90eXBlLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBpc2xfZGltIGlzbF9zcGFjZQorCitpc2xfY3R4ICppc2xfZGltX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2RpbV9hbGxvYyhpc2xfY3R4ICpjdHgsCisJCQl1bnNpZ25lZCBucGFyYW0sIHVuc2lnbmVkIG5faW4sIHVuc2lnbmVkIG5fb3V0KTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfZGltX3NldF9hbGxvYyhpc2xfY3R4ICpjdHgsCisJCQl1bnNpZ25lZCBucGFyYW0sIHVuc2lnbmVkIGRpbSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2RpbV9jb3B5KF9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0pOwordm9pZCBpc2xfZGltX2ZyZWUoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CisKK3Vuc2lnbmVkIGlzbF9kaW1fc2l6ZShfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKKworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9kaW1fc2V0X2RpbV9pZChfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgX19pc2xfdGFrZSBpc2xfaWQgKmlkKTsKK2ludCBpc2xfZGltX2hhc19kaW1faWQoX19pc2xfa2VlcCBpc2xfc3BhY2UgKmRpbSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworX19pc2xfZ2l2ZSBpc2xfaWQgKmlzbF9kaW1fZ2V0X2RpbV9pZChfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CisKK2ludCBpc2xfZGltX2ZpbmRfZGltX2J5X2lkKF9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0sCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgX19pc2xfa2VlcCBpc2xfaWQgKmlkKTsKKworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9kaW1fc2V0X3R1cGxlX2lkKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgX19pc2xfdGFrZSBpc2xfaWQgKmlkKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfZGltX3Jlc2V0X3R1cGxlX2lkKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CitpbnQgaXNsX2RpbV9oYXNfdHVwbGVfaWQoX19pc2xfa2VlcCBpc2xfc3BhY2UgKmRpbSwgZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CitfX2lzbF9naXZlIGlzbF9pZCAqaXNsX2RpbV9nZXRfdHVwbGVfaWQoX19pc2xfa2VlcCBpc2xfc3BhY2UgKmRpbSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKKworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9kaW1fc2V0X25hbWUoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIF9faXNsX2tlZXAgY29uc3QgY2hhciAqbmFtZSk7CitfX2lzbF9rZWVwIGNvbnN0IGNoYXIgKmlzbF9kaW1fZ2V0X25hbWUoX19pc2xfa2VlcCBpc2xfc3BhY2UgKmRpbSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworCitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2RpbV9zZXRfdHVwbGVfbmFtZShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIGNvbnN0IGNoYXIgKnMpOworY29uc3QgY2hhciAqaXNsX2RpbV9nZXRfdHVwbGVfbmFtZShfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltLAorCQkJCSBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKKworaW50IGlzbF9kaW1faXNfd3JhcHBpbmcoX19pc2xfa2VlcCBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2RpbV93cmFwKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9kaW1fdW53cmFwKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworCitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2RpbV9kb21haW4oX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2RpbV9mcm9tX2RvbWFpbihfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfZGltX3JhbmdlKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9kaW1fZnJvbV9yYW5nZShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfZGltX3JldmVyc2UoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2RpbV9qb2luKF9faXNsX3Rha2UgaXNsX3NwYWNlICpsZWZ0LAorCV9faXNsX3Rha2UgaXNsX3NwYWNlICpyaWdodCk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2RpbV9hbGlnbl9wYXJhbXMoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbTEsCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbTIpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9kaW1faW5zZXJ0KF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfZGltX2FkZChfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9kaW1fZHJvcChfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfZGltX21vdmUoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwKKwllbnVtIGlzbF9kaW1fdHlwZSBkc3RfdHlwZSwgdW5zaWduZWQgZHN0X3BvcywKKwllbnVtIGlzbF9kaW1fdHlwZSBzcmNfdHlwZSwgdW5zaWduZWQgc3JjX3BvcywgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2RpbV9tYXBfZnJvbV9zZXQoCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2RpbV96aXAoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CisKK19faXNsX2dpdmUgaXNsX2xvY2FsX3NwYWNlICppc2xfbG9jYWxfc3BhY2VfZnJvbV9kaW0oCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2xvY2FsX3NwYWNlX2dldF9kaW0oCisJX19pc2xfa2VlcCBpc2xfbG9jYWxfc3BhY2UgKmxzKTsKKworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9hZmZfZ2V0X2RpbShfX2lzbF9rZWVwIGlzbF9hZmYgKmFmZik7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3B3X2FmZl9nZXRfZGltKF9faXNsX2tlZXAgaXNsX3B3X2FmZiAqcHdhZmYpOworCitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2NvbnN0cmFpbnRfZ2V0X2RpbSgKKwlfX2lzbF9rZWVwIGlzbF9jb25zdHJhaW50ICpjb25zdHJhaW50KTsKKworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9iYXNpY19tYXBfZ2V0X2RpbShfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9tYXBfZ2V0X2RpbShfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3VuaW9uX21hcF9nZXRfZGltKF9faXNsX2tlZXAgaXNsX3VuaW9uX21hcCAqdW1hcCk7CisKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfYmFzaWNfc2V0X2dldF9kaW0oX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc2V0X2dldF9kaW0oX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF91bmlvbl9zZXRfZ2V0X2RpbShfX2lzbF9rZWVwIGlzbF91bmlvbl9zZXQgKnVzZXQpOworCitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3BvaW50X2dldF9kaW0oX19pc2xfa2VlcCBpc2xfcG9pbnQgKnBudCk7CisKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfcXBvbHlub21pYWxfZ2V0X2RpbShfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbCAqcXApOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9wd19xcG9seW5vbWlhbF9nZXRfZGltKAorCV9faXNsX2tlZXAgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfcXBvbHlub21pYWxfZm9sZF9nZXRfZGltKAorCV9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmZvbGQpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX2dldF9kaW0oCisJX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZ2V0X2RpbSgKKwlfX2lzbF9rZWVwIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqdXB3cXApOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX2dldF9kaW0oCisJX19pc2xfa2VlcCBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqdXB3Zik7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pc2wvZmxvdy5oIGIvaW5jbHVkZS9pc2wvZmxvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYWE5NDEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2lzbC9mbG93LmgKQEAgLTAsMCArMSw3NSBAQAorI2lmbmRlZiBJU0xfRkxPV19ICisjZGVmaW5lIElTTF9GTE9XX0gKKworI2luY2x1ZGUgPGlzbC9zZXRfdHlwZS5oPgorI2luY2x1ZGUgPGlzbC9tYXBfdHlwZS5oPgorI2luY2x1ZGUgPGlzbC91bmlvbl9zZXRfdHlwZS5oPgorI2luY2x1ZGUgPGlzbC91bmlvbl9tYXBfdHlwZS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIExldCBuICg+PSAwKSBiZSB0aGUgbnVtYmVyIG9mIGl0ZXJhdG9ycyBzaGFyZWQgYnkgZmlyc3QgYW5kIHNlY29uZC4KKyAqIElmIGZpcnN0IHByZWNlZGVzIHNlY29uZCB0ZXh0dWFsbHkgcmV0dXJuIDIgKiBuICsgMSwKKyAqIG90aGVyd2lzZSByZXR1cm4gMiAqIG4uCisgKi8KK3R5cGVkZWYgaW50ICgqaXNsX2FjY2Vzc19sZXZlbF9iZWZvcmUpKHZvaWQgKmZpcnN0LCB2b2lkICpzZWNvbmQpOworCitzdHJ1Y3QgaXNsX3Jlc3RyaWN0aW9uOwordHlwZWRlZiBzdHJ1Y3QgaXNsX3Jlc3RyaWN0aW9uIGlzbF9yZXN0cmljdGlvbjsKKwordm9pZCAqaXNsX3Jlc3RyaWN0aW9uX2ZyZWUoX19pc2xfdGFrZSBpc2xfcmVzdHJpY3Rpb24gKnJlc3RyKTsKK19faXNsX2dpdmUgaXNsX3Jlc3RyaWN0aW9uICppc2xfcmVzdHJpY3Rpb25fZW1wdHkoCisJX19pc2xfdGFrZSBpc2xfbWFwICpzb3VyY2VfbWFwKTsKK19faXNsX2dpdmUgaXNsX3Jlc3RyaWN0aW9uICppc2xfcmVzdHJpY3Rpb25fbm9uZSgKKwlfX2lzbF90YWtlIGlzbF9tYXAgKnNvdXJjZV9tYXApOworX19pc2xfZ2l2ZSBpc2xfcmVzdHJpY3Rpb24gKmlzbF9yZXN0cmljdGlvbl9pbnB1dCgKKwlfX2lzbF90YWtlIGlzbF9zZXQgKnNvdXJjZV9yZXN0ciwgX19pc2xfdGFrZSBpc2xfc2V0ICpzaW5rX3Jlc3RyKTsKK19faXNsX2dpdmUgaXNsX3Jlc3RyaWN0aW9uICppc2xfcmVzdHJpY3Rpb25fb3V0cHV0KAorCV9faXNsX3Rha2UgaXNsX3NldCAqc291cmNlX3Jlc3RyKTsKKworaXNsX2N0eCAqaXNsX3Jlc3RyaWN0aW9uX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfcmVzdHJpY3Rpb24gKnJlc3RyKTsKKwordHlwZWRlZiBfX2lzbF9naXZlIGlzbF9yZXN0cmljdGlvbiAqKCppc2xfYWNjZXNzX3Jlc3RyaWN0KSgKKwlfX2lzbF9rZWVwIGlzbF9tYXAgKnNvdXJjZV9tYXAsIF9faXNsX2tlZXAgaXNsX3NldCAqc2luaywKKwl2b2lkICpzb3VyY2VfdXNlciwgdm9pZCAqdXNlcik7CisKK3N0cnVjdCBpc2xfYWNjZXNzX2luZm87Cit0eXBlZGVmIHN0cnVjdCBpc2xfYWNjZXNzX2luZm8gaXNsX2FjY2Vzc19pbmZvOworc3RydWN0IGlzbF9mbG93OwordHlwZWRlZiBzdHJ1Y3QgaXNsX2Zsb3cgaXNsX2Zsb3c7CisKK19faXNsX2dpdmUgaXNsX2FjY2Vzc19pbmZvICppc2xfYWNjZXNzX2luZm9fYWxsb2MoX19pc2xfdGFrZSBpc2xfbWFwICpzaW5rLAorCXZvaWQgKnNpbmtfdXNlciwgaXNsX2FjY2Vzc19sZXZlbF9iZWZvcmUgZm4sIGludCBtYXhfc291cmNlKTsKK19faXNsX2dpdmUgaXNsX2FjY2Vzc19pbmZvICppc2xfYWNjZXNzX2luZm9fc2V0X3Jlc3RyaWN0KAorCV9faXNsX3Rha2UgaXNsX2FjY2Vzc19pbmZvICphY2MsIGlzbF9hY2Nlc3NfcmVzdHJpY3QgZm4sIHZvaWQgKnVzZXIpOworX19pc2xfZ2l2ZSBpc2xfYWNjZXNzX2luZm8gKmlzbF9hY2Nlc3NfaW5mb19hZGRfc291cmNlKAorCV9faXNsX3Rha2UgaXNsX2FjY2Vzc19pbmZvICphY2MsIF9faXNsX3Rha2UgaXNsX21hcCAqc291cmNlLAorCWludCBtdXN0LCB2b2lkICpzb3VyY2VfdXNlcik7Cit2b2lkICppc2xfYWNjZXNzX2luZm9fZnJlZShfX2lzbF90YWtlIGlzbF9hY2Nlc3NfaW5mbyAqYWNjKTsKKworaXNsX2N0eCAqaXNsX2FjY2Vzc19pbmZvX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfYWNjZXNzX2luZm8gKmFjYyk7CisKK19faXNsX2dpdmUgaXNsX2Zsb3cgKmlzbF9hY2Nlc3NfaW5mb19jb21wdXRlX2Zsb3coX19pc2xfdGFrZSBpc2xfYWNjZXNzX2luZm8gKmFjYyk7CitpbnQgaXNsX2Zsb3dfZm9yZWFjaChfX2lzbF9rZWVwIGlzbF9mbG93ICpkZXBzLAorCWludCAoKmZuKShfX2lzbF90YWtlIGlzbF9tYXAgKmRlcCwgaW50IG11c3QsIHZvaWQgKmRlcF91c2VyLCB2b2lkICp1c2VyKSwKKwl2b2lkICp1c2VyKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX2Zsb3dfZ2V0X25vX3NvdXJjZShfX2lzbF9rZWVwIGlzbF9mbG93ICpkZXBzLCBpbnQgbXVzdCk7Cit2b2lkIGlzbF9mbG93X2ZyZWUoX19pc2xfdGFrZSBpc2xfZmxvdyAqZGVwcyk7CisKK2lzbF9jdHggKmlzbF9mbG93X2dldF9jdHgoX19pc2xfa2VlcCBpc2xfZmxvdyAqZGVwcyk7CisKK2ludCBpc2xfdW5pb25fbWFwX2NvbXB1dGVfZmxvdyhfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnNpbmssCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICptdXN0X3NvdXJjZSwKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKm1heV9zb3VyY2UsCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICpzY2hlZHVsZSwKKwlfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKiptdXN0X2RlcCwgX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICoqbWF5X2RlcCwKKwlfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKiptdXN0X25vX3NvdXJjZSwKKwlfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKiptYXlfbm9fc291cmNlKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2lzbC9oYXNoLmggYi9pbmNsdWRlL2lzbC9oYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc2NGE5YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaXNsL2hhc2guaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBLYXRob2xpZWtlIFVuaXZlcnNpdGVpdCBMZXV2ZW4KKyAqCisgKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgTUlUIGxpY2Vuc2UKKyAqCisgKiBXcml0dGVuIGJ5IFN2ZW4gVmVyZG9vbGFlZ2UsIEsuVS5MZXV2ZW4sIERlcGFydGVtZW50CisgKiBDb21wdXRlcndldGVuc2NoYXBwZW4sIENlbGVzdGlqbmVubGFhbiAyMDBBLCBCLTMwMDEgTGV1dmVuLCBCZWxnaXVtCisgKi8KKworI2lmbmRlZiBJU0xfSEFTSF9ICisjZGVmaW5lIElTTF9IQVNIX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGlzbC9zdGRpbnQuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIGlzbF9oYXNoX2luaXQoKQkJKDIxNjYxMzYyNjF1KQorI2RlZmluZSBpc2xfaGFzaF9ieXRlKGgsYikJZG8gewkJCQkJXAorCQkJCQloICo9IDE2Nzc3NjE5OwkJCVwKKwkJCQkJaCBePSBiOwkJCQlcCisJCQkJfSB3aGlsZSgwKQorI2RlZmluZSBpc2xfaGFzaF9oYXNoKGgsaDIpCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaXNsX2hhc2hfYnl0ZShoLCAoaDIpICYgMHhGRik7CQkJCVwKKwkJaXNsX2hhc2hfYnl0ZShoLCAoKGgyKSA+PiA4KSAmIDB4RkYpOwkJCVwKKwkJaXNsX2hhc2hfYnl0ZShoLCAoKGgyKSA+PiAxNikgJiAweEZGKTsJCQlcCisJCWlzbF9oYXNoX2J5dGUoaCwgKChoMikgPj4gMjQpICYgMHhGRik7CQkJXAorCX0gd2hpbGUoMCkKKyNkZWZpbmUgaXNsX2hhc2hfYml0cyhoLGJpdHMpCQkJCQkJXAorCSgoYml0cykgPT0gMzIpID8gKGgpIDoJCQkJCQlcCisJKChiaXRzKSA+PSAxNikgPwkJCQkJCVwKKwkgICAgICAoKGgpID4+IChiaXRzKSkgXiAoKGgpICYgKCgodWludDMyX3QpMSA8PCAoYml0cykpIC0gMSkpIDoJXAorCSAgICAgICgoKGgpID4+IChiaXRzKSkgXiAoaCkpICYgKCgodWludDMyX3QpMSA8PCAoYml0cykpIC0gMSkKKwordWludDMyX3QgaXNsX2hhc2hfc3RyaW5nKHVpbnQzMl90IGhhc2gsIGNvbnN0IGNoYXIgKnMpOwordWludDMyX3QgaXNsX2hhc2hfbWVtKHVpbnQzMl90IGhhc2gsIGNvbnN0IHZvaWQgKnAsIHNpemVfdCBsZW4pOworCisjZGVmaW5lIGlzbF9oYXNoX2J1aWx0aW4oaCxsKQlpc2xfaGFzaF9tZW0oaCwgJmwsIHNpemVvZihsKSkKKworc3RydWN0IGlzbF9oYXNoX3RhYmxlX2VudHJ5Cit7CisJdWludDMyX3QgIGhhc2g7CisJdm9pZCAgICAgKmRhdGE7Cit9OworCitzdHJ1Y3QgaXNsX2hhc2hfdGFibGUgeworCWludCAgICBiaXRzOworCWludCAgICBuOworCXN0cnVjdCBpc2xfaGFzaF90YWJsZV9lbnRyeSAqZW50cmllczsKK307CisKK3N0cnVjdCBpc2xfY3R4OworCitzdHJ1Y3QgaXNsX2hhc2hfdGFibGUgKmlzbF9oYXNoX3RhYmxlX2FsbG9jKHN0cnVjdCBpc2xfY3R4ICpjdHgsIGludCBtaW5fc2l6ZSk7Cit2b2lkIGlzbF9oYXNoX3RhYmxlX2ZyZWUoc3RydWN0IGlzbF9jdHggKmN0eCwgc3RydWN0IGlzbF9oYXNoX3RhYmxlICp0YWJsZSk7CisKK2ludCBpc2xfaGFzaF90YWJsZV9pbml0KHN0cnVjdCBpc2xfY3R4ICpjdHgsIHN0cnVjdCBpc2xfaGFzaF90YWJsZSAqdGFibGUsCisJCQlpbnQgbWluX3NpemUpOwordm9pZCBpc2xfaGFzaF90YWJsZV9jbGVhcihzdHJ1Y3QgaXNsX2hhc2hfdGFibGUgKnRhYmxlKTsKK3N0cnVjdCBpc2xfaGFzaF90YWJsZV9lbnRyeSAqaXNsX2hhc2hfdGFibGVfZmluZChzdHJ1Y3QgaXNsX2N0eCAqY3R4LAorCQkJCXN0cnVjdCBpc2xfaGFzaF90YWJsZSAqdGFibGUsCisJCQkJdWludDMyX3Qga2V5X2hhc2gsCisJCQkJaW50ICgqZXEpKGNvbnN0IHZvaWQgKmVudHJ5LCBjb25zdCB2b2lkICp2YWwpLAorCQkJCWNvbnN0IHZvaWQgKnZhbCwgaW50IHJlc2VydmUpOworaW50IGlzbF9oYXNoX3RhYmxlX2ZvcmVhY2goc3RydWN0IGlzbF9jdHggKmN0eCwKKwkJCSAgICBzdHJ1Y3QgaXNsX2hhc2hfdGFibGUgKnRhYmxlLAorCQkJICAgIGludCAoKmZuKSh2b2lkICoqZW50cnksIHZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKK3ZvaWQgaXNsX2hhc2hfdGFibGVfcmVtb3ZlKHN0cnVjdCBpc2xfY3R4ICpjdHgsCisJCQkJc3RydWN0IGlzbF9oYXNoX3RhYmxlICp0YWJsZSwKKwkJCQlzdHJ1Y3QgaXNsX2hhc2hfdGFibGVfZW50cnkgKmVudHJ5KTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2lzbC9pZC5oIGIvaW5jbHVkZS9pc2wvaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjM3YjIzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9pc2wvaWQuaApAQCAtMCwwICsxLDM1IEBACisjaWZuZGVmIElTTF9JRF9ICisjZGVmaW5lIElTTF9JRF9ICisKKyNpbmNsdWRlIDxpc2wvY3R4Lmg+CisjaW5jbHVkZSA8aXNsL3ByaW50ZXIuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgaXNsX2lkOwordHlwZWRlZiBzdHJ1Y3QgaXNsX2lkIGlzbF9pZDsKKworaXNsX2N0eCAqaXNsX2lkX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfaWQgKmlkKTsKKworX19pc2xfZ2l2ZSBpc2xfaWQgKmlzbF9pZF9hbGxvYyhpc2xfY3R4ICpjdHgsCisJX19pc2xfa2VlcCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICp1c2VyKTsKK19faXNsX2dpdmUgaXNsX2lkICppc2xfaWRfY29weShpc2xfaWQgKmlkKTsKK3ZvaWQgKmlzbF9pZF9mcmVlKF9faXNsX3Rha2UgaXNsX2lkICppZCk7CisKK3ZvaWQgKmlzbF9pZF9nZXRfdXNlcihfX2lzbF9rZWVwIGlzbF9pZCAqaWQpOworX19pc2xfa2VlcCBjb25zdCBjaGFyICppc2xfaWRfZ2V0X25hbWUoX19pc2xfa2VlcCBpc2xfaWQgKmlkKTsKKworX19pc2xfZ2l2ZSBpc2xfaWQgKmlzbF9pZF9zZXRfZnJlZV91c2VyKF9faXNsX3Rha2UgaXNsX2lkICppZCwKKwlfX2lzbF9naXZlIHZvaWQgKCpmcmVlX3VzZXIpKHZvaWQgKnVzZXIpKTsKKworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfcHJpbnRfaWQoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwKKwlfX2lzbF9rZWVwIGlzbF9pZCAqaWQpOwordm9pZCBpc2xfaWRfZHVtcChfX2lzbF9rZWVwIGlzbF9pZCAqaWQpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaXNsL2lscC5oIGIvaW5jbHVkZS9pc2wvaWxwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI3YzNiYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaXNsL2lscC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEthdGhvbGlla2UgVW5pdmVyc2l0ZWl0IExldXZlbgorICoKKyAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBNSVQgbGljZW5zZQorICoKKyAqIFdyaXR0ZW4gYnkgU3ZlbiBWZXJkb29sYWVnZSwgSy5VLkxldXZlbiwgRGVwYXJ0ZW1lbnQKKyAqIENvbXB1dGVyd2V0ZW5zY2hhcHBlbiwgQ2VsZXN0aWpuZW5sYWFuIDIwMEEsIEItMzAwMSBMZXV2ZW4sIEJlbGdpdW0KKyAqLworCisjaWZuZGVmIElTTF9JTFBfSAorI2RlZmluZSBJU0xfSUxQX0gKKworI2luY2x1ZGUgPGlzbC9hZmZfdHlwZS5oPgorI2luY2x1ZGUgPGlzbC9scC5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2VudW0gaXNsX2xwX3Jlc3VsdCBpc2xfYmFzaWNfc2V0X3NvbHZlX2lscChzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqYnNldCwgaW50IG1heCwKKwkJCQkgICAgICBpc2xfaW50ICpmLCBpc2xfaW50ICpvcHQsCisJCQkJICAgICAgc3RydWN0IGlzbF92ZWMgKipzb2xfcCk7CitlbnVtIGlzbF9scF9yZXN1bHQgaXNsX2Jhc2ljX3NldF9tYXgoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0LAorCV9faXNsX2tlZXAgaXNsX2FmZiAqb2JqLCBpc2xfaW50ICpvcHQpOworZW51bSBpc2xfbHBfcmVzdWx0IGlzbF9zZXRfbWluKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0LAorCV9faXNsX2tlZXAgaXNsX2FmZiAqb2JqLCBpc2xfaW50ICpvcHQpOworZW51bSBpc2xfbHBfcmVzdWx0IGlzbF9zZXRfbWF4KF9faXNsX2tlZXAgaXNsX3NldCAqc2V0LAorCV9faXNsX2tlZXAgaXNsX2FmZiAqb2JqLCBpc2xfaW50ICpvcHQpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaXNsL2ludC5oIGIvaW5jbHVkZS9pc2wvaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5MWRmOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaXNsL2ludC5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBLYXRob2xpZWtlIFVuaXZlcnNpdGVpdCBMZXV2ZW4KKyAqCisgKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgTUlUIGxpY2Vuc2UKKyAqCisgKiBXcml0dGVuIGJ5IFN2ZW4gVmVyZG9vbGFlZ2UsIEsuVS5MZXV2ZW4sIERlcGFydGVtZW50CisgKiBDb21wdXRlcndldGVuc2NoYXBwZW4sIENlbGVzdGlqbmVubGFhbiAyMDBBLCBCLTMwMDEgTGV1dmVuLCBCZWxnaXVtCisgKi8KKworI2lmbmRlZiBJU0xfSU5UX0gKKyNkZWZpbmUgSVNMX0lOVF9ICisKKyNpbmNsdWRlIDxpc2wvaGFzaC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdtcC5oPgorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZuZGVmIG1wX2dldF9tZW1vcnlfZnVuY3Rpb25zCit2b2lkIG1wX2dldF9tZW1vcnlfZnVuY3Rpb25zKAorCQl2b2lkICooKiphbGxvY19mdW5jX3B0cikgKHNpemVfdCksCisJCXZvaWQgKigqKnJlYWxsb2NfZnVuY19wdHIpICh2b2lkICosIHNpemVfdCwgc2l6ZV90KSwKKwkJdm9pZCAoKipmcmVlX2Z1bmNfcHRyKSAodm9pZCAqLCBzaXplX3QpKTsKKyNlbmRpZgorCisvKiBpc2xfaW50IGlzIHRoZSBiYXNpYyBpbnRlZ2VyIHR5cGUuICBJdCBjdXJyZW50bHkgYWx3YXlzIGNvcnJlc3BvbmRzCisgKiB0byBhIGdtcCBtcHpfdCwgYnV0IGluIHRoZSBmdXR1cmUsIGRpZmZlcmVudCB0eXBlcyBzdWNoIGFzIGxvbmcgbG9uZworICogb3IgY2xuOjpjbF9JIHdpbGwgYmUgc3VwcG9ydGVkLgorICovCit0eXBlZGVmIG1wel90CWlzbF9pbnQ7CisKKyNkZWZpbmUgaXNsX2ludF9pbml0KGkpCQltcHpfaW5pdChpKQorI2RlZmluZSBpc2xfaW50X2NsZWFyKGkpCW1wel9jbGVhcihpKQorCisjZGVmaW5lIGlzbF9pbnRfc2V0KHIsaSkJbXB6X3NldChyLGkpCisjZGVmaW5lIGlzbF9pbnRfc2V0X2dtcChyLGkpCW1wel9zZXQocixpKQorI2RlZmluZSBpc2xfaW50X3NldF9zaShyLGkpCW1wel9zZXRfc2kocixpKQorI2RlZmluZSBpc2xfaW50X3NldF91aShyLGkpCW1wel9zZXRfdWkocixpKQorI2RlZmluZSBpc2xfaW50X2dldF9nbXAoaSxnKQltcHpfc2V0KGcsaSkKKyNkZWZpbmUgaXNsX2ludF9nZXRfc2kocikJbXB6X2dldF9zaShyKQorI2RlZmluZSBpc2xfaW50X2dldF91aShyKQltcHpfZ2V0X3VpKHIpCisjZGVmaW5lIGlzbF9pbnRfZ2V0X2QocikJbXB6X2dldF9kKHIpCisjZGVmaW5lIGlzbF9pbnRfZ2V0X3N0cihyKQltcHpfZ2V0X3N0cigwLCAxMCwgcikKK3R5cGVkZWYgdm9pZCAoKmlzbF9pbnRfcHJpbnRfZ21wX2ZyZWVfdCkodm9pZCAqLCBzaXplX3QpOworI2RlZmluZSBpc2xfaW50X2ZyZWVfc3RyKHMpCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpc2xfaW50X3ByaW50X2dtcF9mcmVlX3QgZ21wX2ZyZWU7CQkJXAorCQltcF9nZXRfbWVtb3J5X2Z1bmN0aW9ucyhOVUxMLCBOVUxMLCAmZ21wX2ZyZWUpOwkJXAorCQkoKmdtcF9mcmVlKShzLCBzdHJsZW4ocykgKyAxKTsJCQkJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIGlzbF9pbnRfYWJzKHIsaSkJbXB6X2FicyhyLGkpCisjZGVmaW5lIGlzbF9pbnRfbmVnKHIsaSkJbXB6X25lZyhyLGkpCisjZGVmaW5lIGlzbF9pbnRfc3dhcChpLGopCW1wel9zd2FwKGksaikKKyNkZWZpbmUgaXNsX2ludF9zd2FwX29yX3NldChpLGopCW1wel9zd2FwKGksaikKKyNkZWZpbmUgaXNsX2ludF9hZGRfdWkocixpLGopCW1wel9hZGRfdWkocixpLGopCisjZGVmaW5lIGlzbF9pbnRfc3ViX3VpKHIsaSxqKQltcHpfc3ViX3VpKHIsaSxqKQorCisjZGVmaW5lIGlzbF9pbnRfYWRkKHIsaSxqKQltcHpfYWRkKHIsaSxqKQorI2RlZmluZSBpc2xfaW50X3N1YihyLGksaikJbXB6X3N1YihyLGksaikKKyNkZWZpbmUgaXNsX2ludF9tdWwocixpLGopCW1wel9tdWwocixpLGopCisjZGVmaW5lIGlzbF9pbnRfbXVsXzJleHAocixpLGopCW1wel9tdWxfMmV4cChyLGksaikKKyNkZWZpbmUgaXNsX2ludF9tdWxfdWkocixpLGopCW1wel9tdWxfdWkocixpLGopCisjZGVmaW5lIGlzbF9pbnRfcG93X3VpKHIsaSxqKQltcHpfcG93X3VpKHIsaSxqKQorI2RlZmluZSBpc2xfaW50X2FkZG11bChyLGksaikJbXB6X2FkZG11bChyLGksaikKKyNkZWZpbmUgaXNsX2ludF9zdWJtdWwocixpLGopCW1wel9zdWJtdWwocixpLGopCisKKyNkZWZpbmUgaXNsX2ludF9nY2QocixpLGopCW1wel9nY2QocixpLGopCisjZGVmaW5lIGlzbF9pbnRfbGNtKHIsaSxqKQltcHpfbGNtKHIsaSxqKQorI2RlZmluZSBpc2xfaW50X2RpdmV4YWN0KHIsaSxqKQltcHpfZGl2ZXhhY3QocixpLGopCisjZGVmaW5lIGlzbF9pbnRfZGl2ZXhhY3RfdWkocixpLGopCW1wel9kaXZleGFjdF91aShyLGksaikKKyNkZWZpbmUgaXNsX2ludF90ZGl2X3EocixpLGopCW1wel90ZGl2X3EocixpLGopCisjZGVmaW5lIGlzbF9pbnRfY2Rpdl9xKHIsaSxqKQltcHpfY2Rpdl9xKHIsaSxqKQorI2RlZmluZSBpc2xfaW50X2ZkaXZfcShyLGksaikJbXB6X2ZkaXZfcShyLGksaikKKyNkZWZpbmUgaXNsX2ludF9mZGl2X3IocixpLGopCW1wel9mZGl2X3IocixpLGopCisjZGVmaW5lIGlzbF9pbnRfZmRpdl9xX3VpKHIsaSxqKQltcHpfZmRpdl9xX3VpKHIsaSxqKQorCisjZGVmaW5lIGlzbF9pbnRfcmVhZChyLHMpCW1wel9zZXRfc3RyKHIscywxMCkKKyNkZWZpbmUgaXNsX2ludF9wcmludChvdXQsaSx3aWR0aCkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWNoYXIgKnM7CQkJCQkJXAorCQlzID0gbXB6X2dldF9zdHIoMCwgMTAsIGkpOwkJCQlcCisJCWZwcmludGYob3V0LCAiJSpzIiwgd2lkdGgsIHMpOwkJCQlcCisJCWlzbF9pbnRfZnJlZV9zdHIocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIGlzbF9pbnRfc2duKGkpCQltcHpfc2duKGkpCisjZGVmaW5lIGlzbF9pbnRfY21wKGksaikJbXB6X2NtcChpLGopCisjZGVmaW5lIGlzbF9pbnRfY21wX3NpKGksc2kpCW1wel9jbXBfc2koaSxzaSkKKyNkZWZpbmUgaXNsX2ludF9lcShpLGopCQkobXB6X2NtcChpLGopID09IDApCisjZGVmaW5lIGlzbF9pbnRfbmUoaSxqKQkJKG1wel9jbXAoaSxqKSAhPSAwKQorI2RlZmluZSBpc2xfaW50X2x0KGksaikJCShtcHpfY21wKGksaikgPCAwKQorI2RlZmluZSBpc2xfaW50X2xlKGksaikJCShtcHpfY21wKGksaikgPD0gMCkKKyNkZWZpbmUgaXNsX2ludF9ndChpLGopCQkobXB6X2NtcChpLGopID4gMCkKKyNkZWZpbmUgaXNsX2ludF9nZShpLGopCQkobXB6X2NtcChpLGopID49IDApCisjZGVmaW5lIGlzbF9pbnRfYWJzX2VxKGksaikJKG1wel9jbXBhYnMoaSxqKSA9PSAwKQorI2RlZmluZSBpc2xfaW50X2Fic19uZShpLGopCShtcHpfY21wYWJzKGksaikgIT0gMCkKKyNkZWZpbmUgaXNsX2ludF9hYnNfbHQoaSxqKQkobXB6X2NtcGFicyhpLGopIDwgMCkKKyNkZWZpbmUgaXNsX2ludF9hYnNfZ3QoaSxqKQkobXB6X2NtcGFicyhpLGopID4gMCkKKyNkZWZpbmUgaXNsX2ludF9hYnNfZ2UoaSxqKQkobXB6X2NtcGFicyhpLGopID49IDApCisKKworI2RlZmluZSBpc2xfaW50X2lzX3plcm8oaSkJKGlzbF9pbnRfc2duKGkpID09IDApCisjZGVmaW5lIGlzbF9pbnRfaXNfb25lKGkpCShpc2xfaW50X2NtcF9zaShpLDEpID09IDApCisjZGVmaW5lIGlzbF9pbnRfaXNfbmVnb25lKGkpCShpc2xfaW50X2NtcF9zaShpLC0xKSA9PSAwKQorI2RlZmluZSBpc2xfaW50X2lzX3BvcyhpKQkoaXNsX2ludF9zZ24oaSkgPiAwKQorI2RlZmluZSBpc2xfaW50X2lzX25lZyhpKQkoaXNsX2ludF9zZ24oaSkgPCAwKQorI2RlZmluZSBpc2xfaW50X2lzX25vbnBvcyhpKQkoaXNsX2ludF9zZ24oaSkgPD0gMCkKKyNkZWZpbmUgaXNsX2ludF9pc19ub25uZWcoaSkJKGlzbF9pbnRfc2duKGkpID49IDApCisjZGVmaW5lIGlzbF9pbnRfaXNfZGl2aXNpYmxlX2J5KGksaikJbXB6X2RpdmlzaWJsZV9wKGksaikKKwordWludDMyX3QgaXNsX2dtcF9oYXNoKG1wel90IHYsIHVpbnQzMl90IGhhc2gpOworI2RlZmluZSBpc2xfaW50X2hhc2godixoKQlpc2xfZ21wX2hhc2godixoKQorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeyB0eXBlZGVmIHZvaWQgKCppc2xfZ21wX2ZyZWVfdCkodm9pZCAqLCBzaXplX3QpOyB9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpvc3RyZWFtICZvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSAmb3MsIGlzbF9pbnQgaSkKK3sKKwljaGFyICpzOworCXMgPSBtcHpfZ2V0X3N0cigwLCAxMCwgaSk7CisJb3MgPDwgczsKKwlpc2xfaW50X2ZyZWVfc3RyKHMpOworCXJldHVybiBvczsKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaXNsL2xpc3QuaCBiL2luY2x1ZGUvaXNsL2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGU3ZDFjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9pc2wvbGlzdC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEthdGhvbGlla2UgVW5pdmVyc2l0ZWl0IExldXZlbgorICoKKyAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBNSVQgbGljZW5zZQorICoKKyAqIFdyaXR0ZW4gYnkgU3ZlbiBWZXJkb29sYWVnZSwgSy5VLkxldXZlbiwgRGVwYXJ0ZW1lbnQKKyAqIENvbXB1dGVyd2V0ZW5zY2hhcHBlbiwgQ2VsZXN0aWpuZW5sYWFuIDIwMEEsIEItMzAwMSBMZXV2ZW4sIEJlbGdpdW0KKyAqLworCisjaWZuZGVmIElTTF9MSVNUX0gKKyNkZWZpbmUgSVNMX0xJU1RfSAorCisjaW5jbHVkZSA8aXNsL2N0eC5oPgorI2luY2x1ZGUgPGlzbC9wcmludGVyLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBJU0xfREVDTEFSRV9MSVNUKEVMKQkJCQkJCVwKK3N0cnVjdCBpc2xfIyNFTDsJCQkJCQkJXAorc3RydWN0IGlzbF8jI0VMIyNfbGlzdDsJCQkJCQkJXAordHlwZWRlZiBzdHJ1Y3QgaXNsXyMjRUwjI19saXN0IGlzbF8jI0VMIyNfbGlzdDsJCQkJXAoraXNsX2N0eCAqaXNsXyMjRUwjI19saXN0X2dldF9jdHgoX19pc2xfa2VlcCBpc2xfIyNFTCMjX2xpc3QgKmxpc3QpOwlcCitfX2lzbF9naXZlIGlzbF8jI0VMIyNfbGlzdCAqaXNsXyMjRUwjI19saXN0X2Zyb21fIyNFTCgJCQlcCisJX19pc2xfdGFrZSBzdHJ1Y3QgaXNsXyMjRUwgKmVsKTsJCQkJXAorX19pc2xfZ2l2ZSBpc2xfIyNFTCMjX2xpc3QgKmlzbF8jI0VMIyNfbGlzdF9hbGxvYyhpc2xfY3R4ICpjdHgsIGludCBuKTsJXAorX19pc2xfZ2l2ZSBpc2xfIyNFTCMjX2xpc3QgKmlzbF8jI0VMIyNfbGlzdF9jb3B5KAkJCVwKKwlfX2lzbF9rZWVwIGlzbF8jI0VMIyNfbGlzdCAqbGlzdCk7CQkJCVwKK3ZvaWQgKmlzbF8jI0VMIyNfbGlzdF9mcmVlKF9faXNsX3Rha2UgaXNsXyMjRUwjI19saXN0ICpsaXN0KTsJCVwKK19faXNsX2dpdmUgaXNsXyMjRUwjI19saXN0ICppc2xfIyNFTCMjX2xpc3RfYWRkKAkJCVwKKwlfX2lzbF90YWtlIGlzbF8jI0VMIyNfbGlzdCAqbGlzdCwJCQkJXAorCV9faXNsX3Rha2Ugc3RydWN0IGlzbF8jI0VMICplbCk7CQkJCVwKK19faXNsX2dpdmUgaXNsXyMjRUwjI19saXN0ICppc2xfIyNFTCMjX2xpc3RfaW5zZXJ0KAkJCVwKKwlfX2lzbF90YWtlIGlzbF8jI0VMIyNfbGlzdCAqbGlzdCwgdW5zaWduZWQgcG9zLAkJCVwKKwlfX2lzbF90YWtlIHN0cnVjdCBpc2xfIyNFTCAqZWwpOwkJCQlcCitfX2lzbF9naXZlIGlzbF8jI0VMIyNfbGlzdCAqaXNsXyMjRUwjI19saXN0X2Ryb3AoCQkJXAorCV9faXNsX3Rha2UgaXNsXyMjRUwjI19saXN0ICpsaXN0LCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CVwKK19faXNsX2dpdmUgaXNsXyMjRUwjI19saXN0ICppc2xfIyNFTCMjX2xpc3RfY29uY2F0KAkJCVwKKwlfX2lzbF90YWtlIGlzbF8jI0VMIyNfbGlzdCAqbGlzdDEsCQkJCVwKKwlfX2lzbF90YWtlIGlzbF8jI0VMIyNfbGlzdCAqbGlzdDIpOwkJCQlcCitpbnQgaXNsXyMjRUwjI19saXN0X25fIyNFTChfX2lzbF9rZWVwIGlzbF8jI0VMIyNfbGlzdCAqbGlzdCk7CQlcCitfX2lzbF9naXZlIHN0cnVjdCBpc2xfIyNFTCAqaXNsXyMjRUwjI19saXN0X2dldF8jI0VMKAkJCVwKKwlfX2lzbF9rZWVwIGlzbF8jI0VMIyNfbGlzdCAqbGlzdCwgaW50IGluZGV4KTsJCQlcCitfX2lzbF9naXZlIHN0cnVjdCBpc2xfIyNFTCMjX2xpc3QgKmlzbF8jI0VMIyNfbGlzdF9zZXRfIyNFTCgJCVwKKwlfX2lzbF90YWtlIHN0cnVjdCBpc2xfIyNFTCMjX2xpc3QgKmxpc3QsIGludCBpbmRleCwJCVwKKwlfX2lzbF90YWtlIHN0cnVjdCBpc2xfIyNFTCAqZWwpOwkJCQlcCitpbnQgaXNsXyMjRUwjI19saXN0X2ZvcmVhY2goX19pc2xfa2VlcCBpc2xfIyNFTCMjX2xpc3QgKmxpc3QsCQlcCisJaW50ICgqZm4pKF9faXNsX3Rha2Ugc3RydWN0IGlzbF8jI0VMICplbCwgdm9pZCAqdXNlciksCQlcCisJdm9pZCAqdXNlcik7CQkJCQkJCVwKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50XyMjRUwjI19saXN0KAkJCVwKKwlfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLCBfX2lzbF9rZWVwIGlzbF8jI0VMIyNfbGlzdCAqbGlzdCk7CVwKK3ZvaWQgaXNsXyMjRUwjI19saXN0X2R1bXAoX19pc2xfa2VlcCBpc2xfIyNFTCMjX2xpc3QgKmxpc3QpOworCitJU0xfREVDTEFSRV9MSVNUKGlkKQorSVNMX0RFQ0xBUkVfTElTVChjb25zdHJhaW50KQorSVNMX0RFQ0xBUkVfTElTVChiYXNpY19zZXQpCitJU0xfREVDTEFSRV9MSVNUKHNldCkKK0lTTF9ERUNMQVJFX0xJU1QoYWZmKQorSVNMX0RFQ0xBUkVfTElTVChwd19hZmYpCitJU0xfREVDTEFSRV9MSVNUKGJhbmQpCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pc2wvbG9jYWxfc3BhY2UuaCBiL2luY2x1ZGUvaXNsL2xvY2FsX3NwYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1NTI2MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaXNsL2xvY2FsX3NwYWNlLmgKQEAgLTAsMCArMSw3OCBAQAorI2lmbmRlZiBJU0xfTE9DQUxfU1BBQ0VfSAorI2RlZmluZSBJU0xfTE9DQUxfU1BBQ0VfSAorCisjaW5jbHVkZSA8aXNsL2FmZl90eXBlLmg+CisjaW5jbHVkZSA8aXNsL3NwYWNlLmg+CisjaW5jbHVkZSA8aXNsL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxpc2wvbWFwX3R5cGUuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgaXNsX2xvY2FsX3NwYWNlOwordHlwZWRlZiBzdHJ1Y3QgaXNsX2xvY2FsX3NwYWNlIGlzbF9sb2NhbF9zcGFjZTsKKworaXNsX2N0eCAqaXNsX2xvY2FsX3NwYWNlX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfbG9jYWxfc3BhY2UgKmxzKTsKKworX19pc2xfZ2l2ZSBpc2xfbG9jYWxfc3BhY2UgKmlzbF9sb2NhbF9zcGFjZV9mcm9tX3NwYWNlKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworCitfX2lzbF9naXZlIGlzbF9sb2NhbF9zcGFjZSAqaXNsX2xvY2FsX3NwYWNlX2NvcHkoCisJX19pc2xfa2VlcCBpc2xfbG9jYWxfc3BhY2UgKmxzKTsKK3ZvaWQgKmlzbF9sb2NhbF9zcGFjZV9mcmVlKF9faXNsX3Rha2UgaXNsX2xvY2FsX3NwYWNlICpscyk7CisKK2ludCBpc2xfbG9jYWxfc3BhY2VfaXNfc2V0KF9faXNsX2tlZXAgaXNsX2xvY2FsX3NwYWNlICpscyk7CisKK2ludCBpc2xfbG9jYWxfc3BhY2VfZGltKF9faXNsX2tlZXAgaXNsX2xvY2FsX3NwYWNlICpscywKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKK2ludCBpc2xfbG9jYWxfc3BhY2VfaGFzX2RpbV9uYW1lKF9faXNsX2tlZXAgaXNsX2xvY2FsX3NwYWNlICpscywKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworY29uc3QgY2hhciAqaXNsX2xvY2FsX3NwYWNlX2dldF9kaW1fbmFtZShfX2lzbF9rZWVwIGlzbF9sb2NhbF9zcGFjZSAqbHMsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK19faXNsX2dpdmUgaXNsX2xvY2FsX3NwYWNlICppc2xfbG9jYWxfc3BhY2Vfc2V0X2RpbV9uYW1lKAorCV9faXNsX3Rha2UgaXNsX2xvY2FsX3NwYWNlICpscywKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGNvbnN0IGNoYXIgKnMpOworaW50IGlzbF9sb2NhbF9zcGFjZV9oYXNfZGltX2lkKF9faXNsX2tlZXAgaXNsX2xvY2FsX3NwYWNlICpscywKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworX19pc2xfZ2l2ZSBpc2xfaWQgKmlzbF9sb2NhbF9zcGFjZV9nZXRfZGltX2lkKF9faXNsX2tlZXAgaXNsX2xvY2FsX3NwYWNlICpscywKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworX19pc2xfZ2l2ZSBpc2xfbG9jYWxfc3BhY2UgKmlzbF9sb2NhbF9zcGFjZV9zZXRfZGltX2lkKAorCV9faXNsX3Rha2UgaXNsX2xvY2FsX3NwYWNlICpscywKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIF9faXNsX3Rha2UgaXNsX2lkICppZCk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2xvY2FsX3NwYWNlX2dldF9zcGFjZShfX2lzbF9rZWVwIGlzbF9sb2NhbF9zcGFjZSAqbHMpOworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfbG9jYWxfc3BhY2VfZ2V0X2RpdihfX2lzbF9rZWVwIGlzbF9sb2NhbF9zcGFjZSAqbHMsCisJaW50IHBvcyk7CisKK19faXNsX2dpdmUgaXNsX2xvY2FsX3NwYWNlICppc2xfbG9jYWxfc3BhY2VfZG9tYWluKAorCV9faXNsX3Rha2UgaXNsX2xvY2FsX3NwYWNlICpscyk7CitfX2lzbF9naXZlIGlzbF9sb2NhbF9zcGFjZSAqaXNsX2xvY2FsX3NwYWNlX3JhbmdlKAorCV9faXNsX3Rha2UgaXNsX2xvY2FsX3NwYWNlICpscyk7CitfX2lzbF9naXZlIGlzbF9sb2NhbF9zcGFjZSAqaXNsX2xvY2FsX3NwYWNlX2Zyb21fZG9tYWluKAorCV9faXNsX3Rha2UgaXNsX2xvY2FsX3NwYWNlICpscyk7CitfX2lzbF9naXZlIGlzbF9sb2NhbF9zcGFjZSAqaXNsX2xvY2FsX3NwYWNlX2FkZF9kaW1zKAorCV9faXNsX3Rha2UgaXNsX2xvY2FsX3NwYWNlICpscywgZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9sb2NhbF9zcGFjZSAqaXNsX2xvY2FsX3NwYWNlX2Ryb3BfZGltcygKKwlfX2lzbF90YWtlIGlzbF9sb2NhbF9zcGFjZSAqbHMsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfbG9jYWxfc3BhY2UgKmlzbF9sb2NhbF9zcGFjZV9pbnNlcnRfZGltcygKKwlfX2lzbF90YWtlIGlzbF9sb2NhbF9zcGFjZSAqbHMsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworCitfX2lzbF9naXZlIGlzbF9sb2NhbF9zcGFjZSAqaXNsX2xvY2FsX3NwYWNlX2ludGVyc2VjdCgKKwlfX2lzbF90YWtlIGlzbF9sb2NhbF9zcGFjZSAqbHMxLCBfX2lzbF90YWtlIGlzbF9sb2NhbF9zcGFjZSAqbHMyKTsKKworaW50IGlzbF9sb2NhbF9zcGFjZV9pc19lcXVhbChfX2lzbF9rZWVwIGlzbF9sb2NhbF9zcGFjZSAqbHMxLAorCV9faXNsX2tlZXAgaXNsX2xvY2FsX3NwYWNlICpsczIpOworCitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9sb2NhbF9zcGFjZV9saWZ0aW5nKAorCV9faXNsX3Rha2UgaXNsX2xvY2FsX3NwYWNlICpscyk7CisKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X2xvY2FsX3NwYWNlKF9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsCisJX19pc2xfa2VlcCBpc2xfbG9jYWxfc3BhY2UgKmxzKTsKK3ZvaWQgaXNsX2xvY2FsX3NwYWNlX2R1bXAoX19pc2xfa2VlcCBpc2xfbG9jYWxfc3BhY2UgKmxzKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2lzbC9scC5oIGIvaW5jbHVkZS9pc2wvbHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTUwMzcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9pc2wvbHAuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBLYXRob2xpZWtlIFVuaXZlcnNpdGVpdCBMZXV2ZW4KKyAqCisgKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgTUlUIGxpY2Vuc2UKKyAqCisgKiBXcml0dGVuIGJ5IFN2ZW4gVmVyZG9vbGFlZ2UsIEsuVS5MZXV2ZW4sIERlcGFydGVtZW50CisgKiBDb21wdXRlcndldGVuc2NoYXBwZW4sIENlbGVzdGlqbmVubGFhbiAyMDBBLCBCLTMwMDEgTGV1dmVuLCBCZWxnaXVtCisgKi8KKworI2lmbmRlZiBJU0xfTFBfSAorI2RlZmluZSBJU0xfTFBfSAorCisjaW5jbHVkZSA8aXNsL2ludC5oPgorI2luY2x1ZGUgPGlzbC92ZWMuaD4KKyNpbmNsdWRlIDxpc2wvbWFwX3R5cGUuaD4KKyNpbmNsdWRlIDxpc2wvc2V0X3R5cGUuaD4KKworZW51bSBpc2xfbHBfcmVzdWx0IHsKKwlpc2xfbHBfZXJyb3IgPSAtMSwKKwlpc2xfbHBfb2sgPSAwLAorCWlzbF9scF91bmJvdW5kZWQsCisJaXNsX2xwX2VtcHR5Cit9OworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2VudW0gaXNsX2xwX3Jlc3VsdCBpc2xfYmFzaWNfbWFwX3NvbHZlX2xwKHN0cnVjdCBpc2xfYmFzaWNfbWFwICpibWFwLCBpbnQgbWF4LAorCQkJCSAgICAgIGlzbF9pbnQgKmYsIGlzbF9pbnQgZGVub20sIGlzbF9pbnQgKm9wdCwKKwkJCQkgICAgICBpc2xfaW50ICpvcHRfZGVub20sCisJCQkJICAgICAgc3RydWN0IGlzbF92ZWMgKipzb2wpOworZW51bSBpc2xfbHBfcmVzdWx0IGlzbF9iYXNpY19zZXRfc29sdmVfbHAoc3RydWN0IGlzbF9iYXNpY19zZXQgKmJzZXQsIGludCBtYXgsCisJCQkJICAgICAgaXNsX2ludCAqZiwgaXNsX2ludCBkZW5vbSwgaXNsX2ludCAqb3B0LAorCQkJCSAgICAgIGlzbF9pbnQgKm9wdF9kZW5vbSwKKwkJCQkgICAgICBzdHJ1Y3QgaXNsX3ZlYyAqKnNvbCk7CitlbnVtIGlzbF9scF9yZXN1bHQgaXNsX21hcF9zb2x2ZV9scChfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCwgaW50IG1heCwKKwkJCQkgICAgICBpc2xfaW50ICpmLCBpc2xfaW50IGRlbm9tLCBpc2xfaW50ICpvcHQsCisJCQkJICAgICAgaXNsX2ludCAqb3B0X2Rlbm9tLAorCQkJCSAgICAgIHN0cnVjdCBpc2xfdmVjICoqc29sKTsKK2VudW0gaXNsX2xwX3Jlc3VsdCBpc2xfc2V0X3NvbHZlX2xwKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0LCBpbnQgbWF4LAorCQkJCSAgICAgIGlzbF9pbnQgKmYsIGlzbF9pbnQgZGVub20sIGlzbF9pbnQgKm9wdCwKKwkJCQkgICAgICBpc2xfaW50ICpvcHRfZGVub20sCisJCQkJICAgICAgc3RydWN0IGlzbF92ZWMgKipzb2wpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaXNsL21hcC5oIGIvaW5jbHVkZS9pc2wvbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM4NmUzNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaXNsL21hcC5oCkBAIC0wLDAgKzEsNjU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBLYXRob2xpZWtlIFVuaXZlcnNpdGVpdCBMZXV2ZW4KKyAqCisgKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgTUlUIGxpY2Vuc2UKKyAqCisgKiBXcml0dGVuIGJ5IFN2ZW4gVmVyZG9vbGFlZ2UsIEsuVS5MZXV2ZW4sIERlcGFydGVtZW50CisgKiBDb21wdXRlcndldGVuc2NoYXBwZW4sIENlbGVzdGlqbmVubGFhbiAyMDBBLCBCLTMwMDEgTGV1dmVuLCBCZWxnaXVtCisgKi8KKworI2lmbmRlZiBJU0xfTUFQX0gKKyNkZWZpbmUgSVNMX01BUF9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8aXNsL2ludC5oPgorI2luY2x1ZGUgPGlzbC9jdHguaD4KKyNpbmNsdWRlIDxpc2wvYmxrLmg+CisjaW5jbHVkZSA8aXNsL3NwYWNlLmg+CisjaW5jbHVkZSA8aXNsL3ZlYy5oPgorI2luY2x1ZGUgPGlzbC9tYXQuaD4KKyNpbmNsdWRlIDxpc2wvcHJpbnRlci5oPgorI2luY2x1ZGUgPGlzbC9sb2NhbF9zcGFjZS5oPgorI2luY2x1ZGUgPGlzbC9hZmZfdHlwZS5oPgorI2luY2x1ZGUgPGlzbC9saXN0Lmg+CisjaW5jbHVkZSA8aXNsL21hcF90eXBlLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogR2VuZXJhbCBub3RlczoKKyAqCisgKiBBbGwgc3RydWN0dXJlcyBhcmUgcmVmZXJlbmNlIGNvdW50ZWQgdG8gYWxsb3cgcmV1c2Ugd2l0aG91dCBkdXBsaWNhdGlvbi4KKyAqIEEgKl9jb3B5IG9wZXJhdGlvbiB3aWxsIGluY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnQsIHdoaWxlIGEgKl9mcmVlCisgKiBvcGVyYXRpb24gd2lsbCBkZWNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IGFuZCBvbmx5IGFjdHVhbGx5IHJlbGVhc2UKKyAqIHRoZSBzdHJ1Y3R1cmVzIHdoZW4gdGhlIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byB6ZXJvLgorICoKKyAqIEZ1bmN0aW9ucyB0aGF0IHJldHVybiBhbiBpc2Egc3RydWN0dXJlIHdpbGwgaW4gZ2VuZXJhbCBfZGVzdHJveV8KKyAqIGFsbCBhcmd1bWVudCBpc2Egc3RydWN0dXJlcyAodGhlIG9idmlvdXMgZXhlY3B0aW9uIGJlZ2luIHRoZSBfY29weQorICogZnVuY3Rpb25zKS4gIEEgcG9pbnRlciBwYXNzZWQgdG8gc3VjaCBhIGZ1bmN0aW9uIG1heSB0aGVyZWZvcmUKKyAqIG5ldmVyIGJlIHVzZWQgYWZ0ZXIgdGhlIGZ1bmN0aW9uIGNhbGwuICBJZiB5b3Ugd2FudCB0byBrZWVwIGEKKyAqIHJlZmVyZW5jZSB0byB0aGUgb2xkIHN0cnVjdHVyZShzKSwgdXNlIHRoZSBhcHByb3ByaWF0ZSBfY29weSBmdW5jdGlvbi4KKyAqLworCit1bnNpZ25lZCBpc2xfYmFzaWNfbWFwX25faW4oY29uc3Qgc3RydWN0IGlzbF9iYXNpY19tYXAgKmJtYXApOwordW5zaWduZWQgaXNsX2Jhc2ljX21hcF9uX291dChjb25zdCBzdHJ1Y3QgaXNsX2Jhc2ljX21hcCAqYm1hcCk7Cit1bnNpZ25lZCBpc2xfYmFzaWNfbWFwX25fcGFyYW0oY29uc3Qgc3RydWN0IGlzbF9iYXNpY19tYXAgKmJtYXApOwordW5zaWduZWQgaXNsX2Jhc2ljX21hcF9uX2Rpdihjb25zdCBzdHJ1Y3QgaXNsX2Jhc2ljX21hcCAqYm1hcCk7Cit1bnNpZ25lZCBpc2xfYmFzaWNfbWFwX3RvdGFsX2RpbShjb25zdCBzdHJ1Y3QgaXNsX2Jhc2ljX21hcCAqYm1hcCk7Cit1bnNpZ25lZCBpc2xfYmFzaWNfbWFwX2RpbShfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXAsCisJCQkJZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CisKK3Vuc2lnbmVkIGlzbF9tYXBfbl9pbihjb25zdCBzdHJ1Y3QgaXNsX21hcCAqbWFwKTsKK3Vuc2lnbmVkIGlzbF9tYXBfbl9vdXQoY29uc3Qgc3RydWN0IGlzbF9tYXAgKm1hcCk7Cit1bnNpZ25lZCBpc2xfbWFwX25fcGFyYW0oY29uc3Qgc3RydWN0IGlzbF9tYXAgKm1hcCk7Cit1bnNpZ25lZCBpc2xfbWFwX2RpbShfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCwgZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CisKK2lzbF9jdHggKmlzbF9iYXNpY19tYXBfZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXApOworaXNsX2N0eCAqaXNsX21hcF9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX21hcCAqbWFwKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfYmFzaWNfbWFwX2dldF9zcGFjZShfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9tYXBfZ2V0X3NwYWNlKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwKTsKKworX19pc2xfZ2l2ZSBpc2xfYWZmICppc2xfYmFzaWNfbWFwX2dldF9kaXYoX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwLAorCWludCBwb3MpOworCitfX2lzbF9naXZlIGlzbF9sb2NhbF9zcGFjZSAqaXNsX2Jhc2ljX21hcF9nZXRfbG9jYWxfc3BhY2UoCisJX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwKTsKKworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX3NldF90dXBsZV9uYW1lKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCwgZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgY29uc3QgY2hhciAqcyk7Citjb25zdCBjaGFyICppc2xfYmFzaWNfbWFwX2dldF90dXBsZV9uYW1lKF9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKK2ludCBpc2xfbWFwX2hhc190dXBsZV9uYW1lKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKK2NvbnN0IGNoYXIgKmlzbF9tYXBfZ2V0X3R1cGxlX25hbWUoX19pc2xfa2VlcCBpc2xfbWFwICptYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfc2V0X3R1cGxlX25hbWUoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgY29uc3QgY2hhciAqcyk7Citjb25zdCBjaGFyICppc2xfYmFzaWNfbWFwX2dldF9kaW1fbmFtZShfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK2ludCBpc2xfbWFwX2hhc19kaW1fbmFtZShfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworY29uc3QgY2hhciAqaXNsX21hcF9nZXRfZGltX25hbWUoX19pc2xfa2VlcCBpc2xfbWFwICptYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9zZXRfZGltX25hbWUoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgY29uc3QgY2hhciAqcyk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfc2V0X2RpbV9uYW1lKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgY29uc3QgY2hhciAqcyk7CisKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9zZXRfZGltX2lkKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgX19pc2xfdGFrZSBpc2xfaWQgKmlkKTsKK2ludCBpc2xfYmFzaWNfbWFwX2hhc19kaW1faWQoX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CitpbnQgaXNsX21hcF9oYXNfZGltX2lkKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CitfX2lzbF9naXZlIGlzbF9pZCAqaXNsX21hcF9nZXRfZGltX2lkKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfc2V0X3R1cGxlX2lkKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIF9faXNsX3Rha2UgaXNsX2lkICppZCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfcmVzZXRfdHVwbGVfaWQoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CitpbnQgaXNsX21hcF9oYXNfdHVwbGVfaWQoX19pc2xfa2VlcCBpc2xfbWFwICptYXAsIGVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworX19pc2xfZ2l2ZSBpc2xfaWQgKmlzbF9tYXBfZ2V0X3R1cGxlX2lkKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworCitpbnQgaXNsX21hcF9maW5kX2RpbV9ieV9pZChfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCwgZW51bSBpc2xfZGltX3R5cGUgdHlwZSwKKwlfX2lzbF9rZWVwIGlzbF9pZCAqaWQpOworaW50IGlzbF9tYXBfZmluZF9kaW1fYnlfbmFtZShfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCwgZW51bSBpc2xfZGltX3R5cGUgdHlwZSwKKwljb25zdCBjaGFyICpuYW1lKTsKKworaW50IGlzbF9iYXNpY19tYXBfaXNfcmF0aW9uYWwoX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwKTsKKworc3RydWN0IGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfYWxsb2Moc3RydWN0IGlzbF9jdHggKmN0eCwKKwkJdW5zaWduZWQgbnBhcmFtLCB1bnNpZ25lZCBpbiwgdW5zaWduZWQgb3V0LCB1bnNpZ25lZCBleHRyYSwKKwkJdW5zaWduZWQgbl9lcSwgdW5zaWduZWQgbl9pbmVxKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9pZGVudGl0eShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK3N0cnVjdCBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2lkZW50aXR5X2xpa2Uoc3RydWN0IGlzbF9iYXNpY19tYXAgKm1vZGVsKTsKK3N0cnVjdCBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2ZpbmFsaXplKHN0cnVjdCBpc2xfYmFzaWNfbWFwICpibWFwKTsKK3ZvaWQgKmlzbF9iYXNpY19tYXBfZnJlZShfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2NvcHkoX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwKTsKK3N0cnVjdCBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2V4dGVuZChzdHJ1Y3QgaXNsX2Jhc2ljX21hcCAqYmFzZSwKKwkJdW5zaWduZWQgbnBhcmFtLCB1bnNpZ25lZCBuX2luLCB1bnNpZ25lZCBuX291dCwgdW5zaWduZWQgZXh0cmEsCisJCXVuc2lnbmVkIG5fZXEsIHVuc2lnbmVkIG5faW5lcSk7CitzdHJ1Y3QgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9leHRlbmRfY29uc3RyYWludHMoCisJCXN0cnVjdCBpc2xfYmFzaWNfbWFwICpiYXNlLCB1bnNpZ25lZCBuX2VxLCB1bnNpZ25lZCBuX2luZXEpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2VxdWFsKAorCV9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sIHVuc2lnbmVkIG5fZXF1YWwpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2xlc3NfYXQoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwKKwl1bnNpZ25lZCBwb3MpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX21vcmVfYXQoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwKKwl1bnNpZ25lZCBwb3MpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2VtcHR5KF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworc3RydWN0IGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZW1wdHlfbGlrZShzdHJ1Y3QgaXNsX2Jhc2ljX21hcCAqbW9kZWwpOworc3RydWN0IGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZW1wdHlfbGlrZV9tYXAoc3RydWN0IGlzbF9tYXAgKm1vZGVsKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF91bml2ZXJzZShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9uYXRfdW5pdmVyc2UoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfdW5pdmVyc2VfbGlrZSgKKwkJX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9yZW1vdmVfcmVkdW5kYW5jaWVzKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfcmVtb3ZlX3JlZHVuZGFuY2llcyhfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9tYXBfc2ltcGxlX2h1bGwoX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfbWFwX3Vuc2hpZnRlZF9zaW1wbGVfaHVsbCgKKwlfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CisKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2ludGVyc2VjdF9kb21haW4oCisJCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCwKKwkJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2ludGVyc2VjdF9yYW5nZSgKKwkJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwLAorCQlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfaW50ZXJzZWN0KAorCQlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAxLAorCQlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAyKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfYmFzaWNfbWFwX3VuaW9uKAorCQlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAxLAorCQlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAyKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2FwcGx5X2RvbWFpbigKKwkJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwMSwKKwkJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwMik7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9hcHBseV9yYW5nZSgKKwkJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwMSwKKwkJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwMik7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9hZmZpbmVfaHVsbCgKKwkJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX3JldmVyc2UoX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX21hcF9kb21haW4oX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX21hcF9yYW5nZShfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2RvbWFpbl9tYXAoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9yYW5nZV9tYXAoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9yZW1vdmVfZGltcygKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2VsaW1pbmF0ZSgKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2Zyb21fYmFzaWNfc2V0KAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwgX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9mcm9tX2Jhc2ljX21hcChzdHJ1Y3QgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9zYW1wbGUoX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwKTsKK3N0cnVjdCBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX3NpbXBsaWZ5KHN0cnVjdCBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2RldGVjdF9lcXVhbGl0aWVzKAorCQkJCQkJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9yZWFkX2Zyb21fZmlsZShpc2xfY3R4ICpjdHgsCisJRklMRSAqaW5wdXQpOworX19pc2xfY29uc3RydWN0b3IKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9yZWFkX2Zyb21fc3RyKGlzbF9jdHggKmN0eCwKKwljb25zdCBjaGFyICpzdHIpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX3JlYWRfZnJvbV9maWxlKGlzbF9jdHggKmN0eCwgRklMRSAqaW5wdXQpOworX19pc2xfY29uc3RydWN0b3IKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9yZWFkX2Zyb21fc3RyKGlzbF9jdHggKmN0eCwgY29uc3QgY2hhciAqc3RyKTsKK3ZvaWQgaXNsX2Jhc2ljX21hcF9kdW1wKF9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcCk7Cit2b2lkIGlzbF9iYXNpY19tYXBfcHJpbnQoX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwLCBGSUxFICpvdXQsIGludCBpbmRlbnQsCisJY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpzdWZmaXgsIHVuc2lnbmVkIG91dHB1dF9mb3JtYXQpOwordm9pZCBpc2xfbWFwX2R1bXAoX19pc2xfa2VlcCBpc2xfbWFwICptYXApOwordm9pZCBpc2xfbWFwX3ByaW50KF9faXNsX2tlZXAgaXNsX21hcCAqbWFwLCBGSUxFICpvdXQsIGludCBpbmRlbnQsCisJdW5zaWduZWQgb3V0cHV0X2Zvcm1hdCk7CitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF9iYXNpY19tYXAoCisJX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcHJpbnRlciwgX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X21hcChfX2lzbF90YWtlIGlzbF9wcmludGVyICpwcmludGVyLAorCV9faXNsX2tlZXAgaXNsX21hcCAqbWFwKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9maXhfc2koX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwLAorCQllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGludCB2YWx1ZSk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfbG93ZXJfYm91bmRfc2koCisJCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCwKKwkJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBpbnQgdmFsdWUpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX3VwcGVyX2JvdW5kX3NpKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGludCB2YWx1ZSk7CisKK3N0cnVjdCBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX3N1bSgKKwkJc3RydWN0IGlzbF9iYXNpY19tYXAgKmJtYXAxLCBzdHJ1Y3QgaXNsX2Jhc2ljX21hcCAqYm1hcDIpOworc3RydWN0IGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfbmVnKHN0cnVjdCBpc2xfYmFzaWNfbWFwICpibWFwKTsKK3N0cnVjdCBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2Zsb29yZGl2KHN0cnVjdCBpc2xfYmFzaWNfbWFwICpibWFwLAorCQlpc2xfaW50IGQpOworCitzdHJ1Y3QgaXNsX21hcCAqaXNsX21hcF9zdW0oc3RydWN0IGlzbF9tYXAgKm1hcDEsIHN0cnVjdCBpc2xfbWFwICptYXAyKTsKK3N0cnVjdCBpc2xfbWFwICppc2xfbWFwX25lZyhzdHJ1Y3QgaXNsX21hcCAqbWFwKTsKK3N0cnVjdCBpc2xfbWFwICppc2xfbWFwX2Zsb29yZGl2KHN0cnVjdCBpc2xfbWFwICptYXAsIGlzbF9pbnQgZCk7CisKK19faXNsX2V4cG9ydAoraW50IGlzbF9iYXNpY19tYXBfaXNfZXF1YWwoCisJCV9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcDEsCisJCV9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcDIpOworCitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9iYXNpY19tYXBfcGFydGlhbF9sZXhtYXgoCisJCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCwgX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpkb20sCisJCV9faXNsX2dpdmUgaXNsX3NldCAqKmVtcHR5KTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX2Jhc2ljX21hcF9wYXJ0aWFsX2xleG1pbigKKwkJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwLCBfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmRvbSwKKwkJX19pc2xfZ2l2ZSBpc2xfc2V0ICoqZW1wdHkpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX3BhcnRpYWxfbGV4bWF4KAorCQlfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwgX19pc2xfdGFrZSBpc2xfc2V0ICpkb20sCisJCV9faXNsX2dpdmUgaXNsX3NldCAqKmVtcHR5KTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9wYXJ0aWFsX2xleG1pbigKKwkJX19pc2xfdGFrZSBpc2xfbWFwICptYXAsIF9faXNsX3Rha2UgaXNsX3NldCAqZG9tLAorCQlfX2lzbF9naXZlIGlzbF9zZXQgKiplbXB0eSk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX2Jhc2ljX21hcF9sZXhtaW4oX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfYmFzaWNfbWFwX2xleG1heChfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfbGV4bWluKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2xleG1heChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9iYXNpY19tYXBfcGFydGlhbF9sZXhtaW5fcHdfbXVsdGlfYWZmKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCwgX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpkb20sCisJX19pc2xfZ2l2ZSBpc2xfc2V0ICoqZW1wdHkpOworX19pc2xfZ2l2ZSBpc2xfcHdfbXVsdGlfYWZmICppc2xfYmFzaWNfbWFwX3BhcnRpYWxfbGV4bWF4X3B3X211bHRpX2FmZigKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAsIF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqZG9tLAorCV9faXNsX2dpdmUgaXNsX3NldCAqKmVtcHR5KTsKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX2Jhc2ljX21hcF9sZXhtaW5fcHdfbXVsdGlfYWZmKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9tYXBfbGV4bWluX3B3X211bHRpX2FmZigKKwlfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9naXZlIGlzbF9wd19tdWx0aV9hZmYgKmlzbF9tYXBfbGV4bWF4X3B3X211bHRpX2FmZigKKwlfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CisKK3ZvaWQgaXNsX2Jhc2ljX21hcF9wcmludF9pbnRlcm5hbChfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXAsCisJRklMRSAqb3V0LCBpbnQgaW5kZW50KTsKKworc3RydWN0IGlzbF9iYXNpY19tYXAgKmlzbF9tYXBfY29weV9iYXNpY19tYXAoc3RydWN0IGlzbF9tYXAgKm1hcCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfZHJvcF9iYXNpY19tYXAoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJCQkJCQlfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXApOworCitpbnQgaXNsX2Jhc2ljX21hcF9wbGFpbl9pc19maXhlZChfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBpc2xfaW50ICp2YWwpOworCitpbnQgaXNsX2Jhc2ljX21hcF9pbWFnZV9pc19ib3VuZGVkKF9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitpbnQgaXNsX2Jhc2ljX21hcF9pc191bml2ZXJzZShfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXApOworaW50IGlzbF9iYXNpY19tYXBfcGxhaW5faXNfZW1wdHkoX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwKTsKK2ludCBpc2xfYmFzaWNfbWFwX2Zhc3RfaXNfZW1wdHkoX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2V4cG9ydAoraW50IGlzbF9iYXNpY19tYXBfaXNfZW1wdHkoX19pc2xfa2VlcCBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2V4cG9ydAoraW50IGlzbF9iYXNpY19tYXBfaXNfc3Vic2V0KF9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcDEsCisJCV9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcDIpOworaW50IGlzbF9iYXNpY19tYXBfaXNfc3RyaWN0X3N1YnNldChfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXAxLAorCQlfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXAyKTsKKworc3RydWN0IGlzbF9tYXAgKmlzbF9tYXBfYWxsb2Moc3RydWN0IGlzbF9jdHggKmN0eCwKKwkJdW5zaWduZWQgbnBhcmFtLCB1bnNpZ25lZCBpbiwgdW5zaWduZWQgb3V0LCBpbnQgbiwKKwkJdW5zaWduZWQgZmxhZ3MpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX3VuaXZlcnNlKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX25hdF91bml2ZXJzZShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9lbXB0eShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK3N0cnVjdCBpc2xfbWFwICppc2xfbWFwX2VtcHR5X2xpa2Uoc3RydWN0IGlzbF9tYXAgKm1vZGVsKTsKK3N0cnVjdCBpc2xfbWFwICppc2xfbWFwX2VtcHR5X2xpa2VfYmFzaWNfbWFwKHN0cnVjdCBpc2xfYmFzaWNfbWFwICptb2RlbCk7CitzdHJ1Y3QgaXNsX21hcCAqaXNsX21hcF9kdXAoc3RydWN0IGlzbF9tYXAgKm1hcCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfYWRkX2Jhc2ljX21hcChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwkJCQkJCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfaWRlbnRpdHkoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitzdHJ1Y3QgaXNsX21hcCAqaXNsX21hcF9pZGVudGl0eV9saWtlKHN0cnVjdCBpc2xfbWFwICptb2RlbCk7CitzdHJ1Y3QgaXNsX21hcCAqaXNsX21hcF9pZGVudGl0eV9saWtlX2Jhc2ljX21hcChzdHJ1Y3QgaXNsX2Jhc2ljX21hcCAqbW9kZWwpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2xleF9sdF9maXJzdChfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9sZXhfbGVfZmlyc3QoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfbGV4X2x0KF9faXNsX3Rha2UgaXNsX3NwYWNlICpzZXRfZGltKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9sZXhfbGUoX19pc2xfdGFrZSBpc2xfc3BhY2UgKnNldF9kaW0pOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2xleF9ndF9maXJzdChfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9sZXhfZ2VfZmlyc3QoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfbGV4X2d0KF9faXNsX3Rha2UgaXNsX3NwYWNlICpzZXRfZGltKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9sZXhfZ2UoX19pc2xfdGFrZSBpc2xfc3BhY2UgKnNldF9kaW0pOworc3RydWN0IGlzbF9tYXAgKmlzbF9tYXBfZmluYWxpemUoc3RydWN0IGlzbF9tYXAgKm1hcCk7Cit2b2lkICppc2xfbWFwX2ZyZWUoX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2NvcHkoX19pc2xfa2VlcCBpc2xfbWFwICptYXApOworc3RydWN0IGlzbF9tYXAgKmlzbF9tYXBfZXh0ZW5kKHN0cnVjdCBpc2xfbWFwICpiYXNlLAorCQl1bnNpZ25lZCBucGFyYW0sIHVuc2lnbmVkIG5faW4sIHVuc2lnbmVkIG5fb3V0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX3JldmVyc2UoX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfdW5pb24oCisJCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwMSwKKwkJX19pc2xfdGFrZSBpc2xfbWFwICptYXAyKTsKK3N0cnVjdCBpc2xfbWFwICppc2xfbWFwX3VuaW9uX2Rpc2pvaW50KAorCQkJc3RydWN0IGlzbF9tYXAgKm1hcDEsIHN0cnVjdCBpc2xfbWFwICptYXAyKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2ludGVyc2VjdF9kb21haW4oCisJCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCQlfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9pbnRlcnNlY3RfcmFuZ2UoCisJCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCQlfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9hcHBseV9kb21haW4oCisJCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwMSwKKwkJX19pc2xfdGFrZSBpc2xfbWFwICptYXAyKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2FwcGx5X3JhbmdlKAorCQlfX2lzbF90YWtlIGlzbF9tYXAgKm1hcDEsCisJCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwMik7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfcHJvZHVjdCgKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAxLCBfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAyKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9wcm9kdWN0KF9faXNsX3Rha2UgaXNsX21hcCAqbWFwMSwKKwlfX2lzbF90YWtlIGlzbF9tYXAgKm1hcDIpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2RvbWFpbl9wcm9kdWN0KAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcDEsIF9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcDIpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX3JhbmdlX3Byb2R1Y3QoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwMSwgX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwMik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfZG9tYWluX3Byb2R1Y3QoX19pc2xfdGFrZSBpc2xfbWFwICptYXAxLAorCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwMik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfcmFuZ2VfcHJvZHVjdChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcDEsCisJX19pc2xfdGFrZSBpc2xfbWFwICptYXAyKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9mbGF0X3Byb2R1Y3QoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwMSwgX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwMik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfZmxhdF9wcm9kdWN0KF9faXNsX3Rha2UgaXNsX21hcCAqbWFwMSwKKwlfX2lzbF90YWtlIGlzbF9tYXAgKm1hcDIpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2ZsYXRfcmFuZ2VfcHJvZHVjdCgKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAxLCBfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAyKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9mbGF0X2RvbWFpbl9wcm9kdWN0KF9faXNsX3Rha2UgaXNsX21hcCAqbWFwMSwKKwlfX2lzbF90YWtlIGlzbF9tYXAgKm1hcDIpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2ZsYXRfcmFuZ2VfcHJvZHVjdChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcDEsCisJX19pc2xfdGFrZSBpc2xfbWFwICptYXAyKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2ludGVyc2VjdChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcDEsCisJCQkJICAgICAgX19pc2xfdGFrZSBpc2xfbWFwICptYXAyKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2ludGVyc2VjdF9wYXJhbXMoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJCV9faXNsX3Rha2UgaXNsX3NldCAqcGFyYW1zKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX3N1YnRyYWN0KAorCQlfX2lzbF90YWtlIGlzbF9tYXAgKm1hcDEsCisJCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwMik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfc3VidHJhY3RfZG9tYWluKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCV9faXNsX3Rha2UgaXNsX3NldCAqZG9tKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9zdWJ0cmFjdF9yYW5nZShfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwlfX2lzbF90YWtlIGlzbF9zZXQgKmRvbSk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9jb21wbGVtZW50KF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK3N0cnVjdCBpc2xfbWFwICppc2xfbWFwX2ZpeF9pbnB1dF9zaShzdHJ1Y3QgaXNsX21hcCAqbWFwLAorCQl1bnNpZ25lZCBpbnB1dCwgaW50IHZhbHVlKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9maXgoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBpc2xfaW50IHZhbHVlKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9maXhfc2koX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgaW50IHZhbHVlKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9sb3dlcl9ib3VuZF9zaShfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwkJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBpbnQgdmFsdWUpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX3VwcGVyX2JvdW5kX3NpKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgaW50IHZhbHVlKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfbWFwX2RlbHRhcyhfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9tYXBfZGVsdGFzKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9kZWx0YXNfbWFwKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfZGVsdGFzX21hcChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9kZXRlY3RfZXF1YWxpdGllcyhfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX21hcF9hZmZpbmVfaHVsbChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9tYXBfY29udmV4X2h1bGwoX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9tYXBfcG9seWhlZHJhbF9odWxsKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9hZGQoX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwLAorCQllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9hZGRfZGltcyhfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwkJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfaW5zZXJ0X2RpbXMoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlLAorCXVuc2lnbmVkIHBvcywgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfaW5zZXJ0X2RpbXMoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfbW92ZV9kaW1zKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSBkc3RfdHlwZSwgdW5zaWduZWQgZHN0X3BvcywKKwllbnVtIGlzbF9kaW1fdHlwZSBzcmNfdHlwZSwgdW5zaWduZWQgc3JjX3BvcywgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfbW92ZV9kaW1zKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCWVudW0gaXNsX2RpbV90eXBlIGRzdF90eXBlLCB1bnNpZ25lZCBkc3RfcG9zLAorCWVudW0gaXNsX2RpbV90eXBlIHNyY190eXBlLCB1bnNpZ25lZCBzcmNfcG9zLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9wcm9qZWN0X291dCgKKwkJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwLAorCQllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfcHJvamVjdF9vdXQoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9yZW1vdmVfZGl2cygKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX3JlbW92ZV91bmtub3duX2RpdnMoX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX3JlbW92ZV9kaXZzKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9lbGltaW5hdGUoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX3JlbW92ZV9kaW1zKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9yZW1vdmVfZGl2c19pbnZvbHZpbmdfZGltcygKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX3JlbW92ZV9kaXZzX2ludm9sdmluZ19kaW1zKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK3N0cnVjdCBpc2xfbWFwICppc2xfbWFwX3JlbW92ZV9pbnB1dHMoc3RydWN0IGlzbF9tYXAgKm1hcCwKKwl1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CisKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9lcXVhdGUoX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUxLCBpbnQgcG9zMSwgZW51bSBpc2xfZGltX3R5cGUgdHlwZTIsIGludCBwb3MyKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9vcmRlcl9nZShfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZTEsIGludCBwb3MxLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlMiwgaW50IHBvczIpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2VxdWF0ZShfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlMSwgaW50IHBvczEsIGVudW0gaXNsX2RpbV90eXBlIHR5cGUyLCBpbnQgcG9zMik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfb3Bwb3NlKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUxLCBpbnQgcG9zMSwgZW51bSBpc2xfZGltX3R5cGUgdHlwZTIsIGludCBwb3MyKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9vcmRlcl9sdChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlMSwgaW50IHBvczEsIGVudW0gaXNsX2RpbV90eXBlIHR5cGUyLCBpbnQgcG9zMik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfb3JkZXJfZ3QoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZTEsIGludCBwb3MxLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlMiwgaW50IHBvczIpOworCitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX3NldF9pZGVudGl0eShfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CisKK19faXNsX2V4cG9ydAoraW50IGlzbF9iYXNpY19zZXRfaXNfd3JhcHBpbmcoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2V4cG9ydAoraW50IGlzbF9zZXRfaXNfd3JhcHBpbmcoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfbWFwX3dyYXAoX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX21hcF93cmFwKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX3NldF91bndyYXAoX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX3NldF91bndyYXAoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZmxhdHRlbihfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfZmxhdHRlbihfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9mbGF0dGVuX2RvbWFpbigKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZmxhdHRlbl9yYW5nZSgKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfZmxhdHRlbl9kb21haW4oX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfZmxhdHRlbl9yYW5nZShfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9mbGF0dGVuKF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9mbGF0dGVuKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX3NldF9mbGF0dGVuX21hcChfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9tYXBfcGFyYW1zKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX21hcF9kb21haW4oX19pc2xfdGFrZSBpc2xfbWFwICpibWFwKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX21hcF9yYW5nZShfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfZG9tYWluX21hcChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfcmFuZ2VfbWFwKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK19faXNsX2NvbnN0cnVjdG9yCitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfZnJvbV9iYXNpY19tYXAoX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9mcm9tX2RvbWFpbihfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZnJvbV9kb21haW4oCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9mcm9tX3JhbmdlKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitzdHJ1Y3QgaXNsX21hcCAqaXNsX21hcF9mcm9tX3JhbmdlKHN0cnVjdCBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2Zyb21fZG9tYWluX2FuZF9yYW5nZSgKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmRvbWFpbiwgX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpyYW5nZSk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfZnJvbV9kb21haW5fYW5kX3JhbmdlKF9faXNsX3Rha2UgaXNsX3NldCAqZG9tYWluLAorCV9faXNsX3Rha2UgaXNsX3NldCAqcmFuZ2UpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2Zyb21fc2V0KF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCV9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworc3RydWN0IGlzbF9zZXQgKmlzbF9zZXRfZnJvbV9tYXAoc3RydWN0IGlzbF9tYXAgKm1hcCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX21hcF9zYW1wbGUoX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworCitpbnQgaXNsX21hcF9wbGFpbl9pc19lbXB0eShfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCk7CitpbnQgaXNsX21hcF9mYXN0X2lzX2VtcHR5KF9faXNsX2tlZXAgaXNsX21hcCAqbWFwKTsKK2ludCBpc2xfbWFwX3BsYWluX2lzX3VuaXZlcnNlKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwKTsKK19faXNsX2V4cG9ydAoraW50IGlzbF9tYXBfaXNfZW1wdHkoX19pc2xfa2VlcCBpc2xfbWFwICptYXApOworX19pc2xfZXhwb3J0CitpbnQgaXNsX21hcF9pc19zdWJzZXQoX19pc2xfa2VlcCBpc2xfbWFwICptYXAxLCBfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcDIpOworX19pc2xfZXhwb3J0CitpbnQgaXNsX21hcF9pc19zdHJpY3Rfc3Vic2V0KF9faXNsX2tlZXAgaXNsX21hcCAqbWFwMSwgX19pc2xfa2VlcCBpc2xfbWFwICptYXAyKTsKK19faXNsX2V4cG9ydAoraW50IGlzbF9tYXBfaXNfZXF1YWwoX19pc2xfa2VlcCBpc2xfbWFwICptYXAxLCBfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcDIpOworX19pc2xfZXhwb3J0CitpbnQgaXNsX21hcF9pc19kaXNqb2ludChfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcDEsIF9faXNsX2tlZXAgaXNsX21hcCAqbWFwMik7CitpbnQgaXNsX2Jhc2ljX21hcF9pc19zaW5nbGVfdmFsdWVkKF9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitpbnQgaXNsX21hcF9wbGFpbl9pc19zaW5nbGVfdmFsdWVkKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwKTsKK19faXNsX2V4cG9ydAoraW50IGlzbF9tYXBfaXNfc2luZ2xlX3ZhbHVlZChfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCk7CitpbnQgaXNsX21hcF9wbGFpbl9pc19pbmplY3RpdmUoX19pc2xfa2VlcCBpc2xfbWFwICptYXApOworX19pc2xfZXhwb3J0CitpbnQgaXNsX21hcF9pc19pbmplY3RpdmUoX19pc2xfa2VlcCBpc2xfbWFwICptYXApOworX19pc2xfZXhwb3J0CitpbnQgaXNsX21hcF9pc19iaWplY3RpdmUoX19pc2xfa2VlcCBpc2xfbWFwICptYXApOworaW50IGlzbF9tYXBfaXNfdHJhbnNsYXRpb24oX19pc2xfa2VlcCBpc2xfbWFwICptYXApOworaW50IGlzbF9tYXBfaGFzX2VxdWFsX3NwYWNlKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwMSwgX19pc2xfa2VlcCBpc2xfbWFwICptYXAyKTsKKworaW50IGlzbF9iYXNpY19tYXBfY2FuX3ppcChfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXApOworaW50IGlzbF9tYXBfY2FuX3ppcChfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfemlwKF9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfemlwKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKKworaW50IGlzbF9iYXNpY19tYXBfY2FuX2N1cnJ5KF9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitpbnQgaXNsX21hcF9jYW5fY3VycnkoX19pc2xfa2VlcCBpc2xfbWFwICptYXApOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2N1cnJ5KF9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfY3VycnkoX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworCitpbnQgaXNsX2Jhc2ljX21hcF9jYW5fdW5jdXJyeShfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXApOworaW50IGlzbF9tYXBfY2FuX3VuY3VycnkoX19pc2xfa2VlcCBpc2xfbWFwICptYXApOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX3VuY3VycnkoX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF91bmN1cnJ5KF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKKworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX21ha2VfZGlzam9pbnQoX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfYmFzaWNfbWFwX2NvbXB1dGVfZGl2cyhfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2NvbXB1dGVfZGl2cyhfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfYWxpZ25fZGl2cyhfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CisKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9kcm9wX2NvbnN0cmFpbnRzX2ludm9sdmluZ19kaW1zKAorCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKKworaW50IGlzbF9iYXNpY19tYXBfaW52b2x2ZXNfZGltcyhfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworaW50IGlzbF9tYXBfaW52b2x2ZXNfZGltcyhfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CisKK3ZvaWQgaXNsX21hcF9wcmludF9pbnRlcm5hbChfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCwgRklMRSAqb3V0LCBpbnQgaW5kZW50KTsKKworaW50IGlzbF9tYXBfcGxhaW5faW5wdXRfaXNfZml4ZWQoX19pc2xfa2VlcCBpc2xfbWFwICptYXAsCisJCXVuc2lnbmVkIGluLCBpc2xfaW50ICp2YWwpOworaW50IGlzbF9tYXBfcGxhaW5faXNfZml4ZWQoX19pc2xfa2VlcCBpc2xfbWFwICptYXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBpc2xfaW50ICp2YWwpOworaW50IGlzbF9tYXBfZmFzdF9pc19maXhlZChfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGlzbF9pbnQgKnZhbCk7CisKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2dpc3QoX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwLAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqY29udGV4dCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9naXN0KF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCV9faXNsX3Rha2UgaXNsX21hcCAqY29udGV4dCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9naXN0X2RvbWFpbihfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwlfX2lzbF90YWtlIGlzbF9zZXQgKmNvbnRleHQpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2dpc3RfcmFuZ2UoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsCisJX19pc2xfdGFrZSBpc2xfc2V0ICpjb250ZXh0KTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9naXN0X3BhcmFtcyhfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwlfX2lzbF90YWtlIGlzbF9zZXQgKmNvbnRleHQpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2dpc3RfYmFzaWNfbWFwKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqY29udGV4dCk7CisKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2NvYWxlc2NlKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKKworaW50IGlzbF9tYXBfcGxhaW5faXNfZXF1YWwoX19pc2xfa2VlcCBpc2xfbWFwICptYXAxLCBfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcDIpOworaW50IGlzbF9tYXBfZmFzdF9pc19lcXVhbChfX2lzbF9rZWVwIGlzbF9tYXAgKm1hcDEsIF9faXNsX2tlZXAgaXNsX21hcCAqbWFwMik7CisKK3VpbnQzMl90IGlzbF9tYXBfZ2V0X2hhc2goX19pc2xfa2VlcCBpc2xfbWFwICptYXApOworCitfX2lzbF9leHBvcnQKK2ludCBpc2xfbWFwX2ZvcmVhY2hfYmFzaWNfbWFwKF9faXNsX2tlZXAgaXNsX21hcCAqbWFwLAorCWludCAoKmZuKShfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXAsIHZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKKworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfc2V0X2xpZnRpbmcoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworCitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfZml4ZWRfcG93ZXIoX19pc2xfdGFrZSBpc2xfbWFwICptYXAsIGlzbF9pbnQgZXhwKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9wb3dlcihfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwgaW50ICpleGFjdCk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfcmVhY2hpbmdfcGF0aF9sZW5ndGhzKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLAorCWludCAqZXhhY3QpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX3RyYW5zaXRpdmVfY2xvc3VyZShfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwlpbnQgKmV4YWN0KTsKKworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2xleF9sZV9tYXAoX19pc2xfdGFrZSBpc2xfbWFwICptYXAxLAorCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwMik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfbGV4X2x0X21hcChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcDEsCisJX19pc2xfdGFrZSBpc2xfbWFwICptYXAyKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9sZXhfZ2VfbWFwKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwMSwKKwlfX2lzbF90YWtlIGlzbF9tYXAgKm1hcDIpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2xleF9ndF9tYXAoX19pc2xfdGFrZSBpc2xfbWFwICptYXAxLAorCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwMik7CisKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9hbGlnbl9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfbWFwICpibWFwLCBfX2lzbF90YWtlIGlzbF9zcGFjZSAqbW9kZWwpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2FsaWduX3BhcmFtcyhfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqbW9kZWwpOworCitfX2lzbF9naXZlIGlzbF9tYXQgKmlzbF9iYXNpY19tYXBfZXF1YWxpdGllc19tYXRyaXgoCisJCV9faXNsX2tlZXAgaXNsX2Jhc2ljX21hcCAqYm1hcCwgZW51bSBpc2xfZGltX3R5cGUgYzEsCisJCWVudW0gaXNsX2RpbV90eXBlIGMyLCBlbnVtIGlzbF9kaW1fdHlwZSBjMywKKwkJZW51bSBpc2xfZGltX3R5cGUgYzQsIGVudW0gaXNsX2RpbV90eXBlIGM1KTsKK19faXNsX2dpdmUgaXNsX21hdCAqaXNsX2Jhc2ljX21hcF9pbmVxdWFsaXRpZXNfbWF0cml4KAorCQlfX2lzbF9rZWVwIGlzbF9iYXNpY19tYXAgKmJtYXAsIGVudW0gaXNsX2RpbV90eXBlIGMxLAorCQllbnVtIGlzbF9kaW1fdHlwZSBjMiwgZW51bSBpc2xfZGltX3R5cGUgYzMsCisJCWVudW0gaXNsX2RpbV90eXBlIGM0LCBlbnVtIGlzbF9kaW1fdHlwZSBjNSk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZnJvbV9jb25zdHJhaW50X21hdHJpY2VzKAorCV9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sCisJX19pc2xfdGFrZSBpc2xfbWF0ICplcSwgX19pc2xfdGFrZSBpc2xfbWF0ICppbmVxLCBlbnVtIGlzbF9kaW1fdHlwZSBjMSwKKwllbnVtIGlzbF9kaW1fdHlwZSBjMiwgZW51bSBpc2xfZGltX3R5cGUgYzMsCisJZW51bSBpc2xfZGltX3R5cGUgYzQsIGVudW0gaXNsX2RpbV90eXBlIGM1KTsKKworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2Zyb21fYWZmKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX21hcCAqaXNsX2Jhc2ljX21hcF9mcm9tX211bHRpX2FmZigKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hZmYpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfYmFzaWNfbWFwX2Zyb21fYWZmX2xpc3QoCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRvbWFpbl9kaW0sIF9faXNsX3Rha2UgaXNsX2FmZl9saXN0ICpsaXN0KTsKKworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfbWFwX2Zyb21fYWZmKF9faXNsX3Rha2UgaXNsX2FmZiAqYWZmKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX21hcF9mcm9tX211bHRpX2FmZihfX2lzbF90YWtlIGlzbF9tdWx0aV9hZmYgKm1hZmYpOworCitfX2lzbF9naXZlIGlzbF9wd19hZmYgKmlzbF9tYXBfZGltX21heChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCwgaW50IHBvcyk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNpbmNsdWRlIDxpc2wvZGltLmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pc2wvbWFwX3R5cGUuaCBiL2luY2x1ZGUvaXNsL21hcF90eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcwNTdlNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaXNsL21hcF90eXBlLmgKQEAgLTAsMCArMSwyOCBAQAorI2lmbmRlZiBJU0xfTUFQX1RZUEVfSAorI2RlZmluZSBJU0xfTUFQX1RZUEVfSAorCisjaW5jbHVkZSA8aXNsL2N0eC5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBfX2lzbF9zdWJjbGFzcyhpc2xfbWFwKSBpc2xfYmFzaWNfbWFwOwordHlwZWRlZiBzdHJ1Y3QgaXNsX2Jhc2ljX21hcCBpc2xfYmFzaWNfbWFwOworc3RydWN0IF9faXNsX3N1YmNsYXNzKGlzbF91bmlvbl9tYXApIGlzbF9tYXA7Cit0eXBlZGVmIHN0cnVjdCBpc2xfbWFwIGlzbF9tYXA7CisKKyNpZm5kZWYgaXNsX2Jhc2ljX3NldAorc3RydWN0IF9faXNsX3N1YmNsYXNzKGlzbF9zZXQpIGlzbF9iYXNpY19zZXQ7Cit0eXBlZGVmIHN0cnVjdCBpc2xfYmFzaWNfc2V0IGlzbF9iYXNpY19zZXQ7CisjZW5kaWYKKyNpZm5kZWYgaXNsX3NldAorc3RydWN0IF9faXNsX3N1YmNsYXNzKGlzbF91bmlvbl9zZXQpIGlzbF9zZXQ7Cit0eXBlZGVmIHN0cnVjdCBpc2xfc2V0IGlzbF9zZXQ7CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2lzbC9tYXQuaCBiL2luY2x1ZGUvaXNsL21hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5N2IwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2lzbC9tYXQuaApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgS2F0aG9saWVrZSBVbml2ZXJzaXRlaXQgTGV1dmVuCisgKgorICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIE1JVCBsaWNlbnNlCisgKgorICogV3JpdHRlbiBieSBTdmVuIFZlcmRvb2xhZWdlLCBLLlUuTGV1dmVuLCBEZXBhcnRlbWVudAorICogQ29tcHV0ZXJ3ZXRlbnNjaGFwcGVuLCBDZWxlc3Rpam5lbmxhYW4gMjAwQSwgQi0zMDAxIExldXZlbiwgQmVsZ2l1bQorICovCisKKyNpZm5kZWYgSVNMX01BVF9ICisjZGVmaW5lIElTTF9NQVRfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGlzbC9pbnQuaD4KKyNpbmNsdWRlIDxpc2wvY3R4Lmg+CisjaW5jbHVkZSA8aXNsL2Jsay5oPgorI2luY2x1ZGUgPGlzbC92ZWMuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgaXNsX21hdDsKK3R5cGVkZWYgc3RydWN0IGlzbF9tYXQJaXNsX21hdDsKKworaXNsX2N0eCAqaXNsX21hdF9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX21hdCAqbWF0KTsKKworX19pc2xfZ2l2ZSBpc2xfbWF0ICppc2xfbWF0X2FsbG9jKGlzbF9jdHggKmN0eCwKKwl1bnNpZ25lZCBuX3JvdywgdW5zaWduZWQgbl9jb2wpOworc3RydWN0IGlzbF9tYXQgKmlzbF9tYXRfZHVwKHN0cnVjdCBpc2xfbWF0ICptYXQpOworc3RydWN0IGlzbF9tYXQgKmlzbF9tYXRfZXh0ZW5kKHN0cnVjdCBpc2xfbWF0ICptYXQsCisJdW5zaWduZWQgbl9yb3csIHVuc2lnbmVkIG5fY29sKTsKK3N0cnVjdCBpc2xfbWF0ICppc2xfbWF0X2lkZW50aXR5KHN0cnVjdCBpc2xfY3R4ICpjdHgsIHVuc2lnbmVkIG5fcm93KTsKK19faXNsX2dpdmUgaXNsX21hdCAqaXNsX21hdF9jb3B5KF9faXNsX2tlZXAgaXNsX21hdCAqbWF0KTsKK3N0cnVjdCBpc2xfbWF0ICppc2xfbWF0X2NvdyhzdHJ1Y3QgaXNsX21hdCAqbWF0KTsKK3ZvaWQgaXNsX21hdF9mcmVlKF9faXNsX3Rha2UgaXNsX21hdCAqbWF0KTsKKworaW50IGlzbF9tYXRfcm93cyhfX2lzbF9rZWVwIGlzbF9tYXQgKm1hdCk7CitpbnQgaXNsX21hdF9jb2xzKF9faXNsX2tlZXAgaXNsX21hdCAqbWF0KTsKK2ludCBpc2xfbWF0X2dldF9lbGVtZW50KF9faXNsX2tlZXAgaXNsX21hdCAqbWF0LCBpbnQgcm93LCBpbnQgY29sLCBpc2xfaW50ICp2KTsKK19faXNsX2dpdmUgaXNsX21hdCAqaXNsX21hdF9zZXRfZWxlbWVudChfX2lzbF90YWtlIGlzbF9tYXQgKm1hdCwKKwlpbnQgcm93LCBpbnQgY29sLCBpc2xfaW50IHYpOworX19pc2xfZ2l2ZSBpc2xfbWF0ICppc2xfbWF0X3NldF9lbGVtZW50X3NpKF9faXNsX3Rha2UgaXNsX21hdCAqbWF0LAorCWludCByb3csIGludCBjb2wsIGludCB2KTsKKworc3RydWN0IGlzbF9tYXQgKmlzbF9tYXRfc3dhcF9jb2xzKHN0cnVjdCBpc2xfbWF0ICptYXQsIHVuc2lnbmVkIGksIHVuc2lnbmVkIGopOworc3RydWN0IGlzbF9tYXQgKmlzbF9tYXRfc3dhcF9yb3dzKHN0cnVjdCBpc2xfbWF0ICptYXQsIHVuc2lnbmVkIGksIHVuc2lnbmVkIGopOworCitzdHJ1Y3QgaXNsX3ZlYyAqaXNsX21hdF92ZWNfcHJvZHVjdChzdHJ1Y3QgaXNsX21hdCAqbWF0LCBzdHJ1Y3QgaXNsX3ZlYyAqdmVjKTsKK3N0cnVjdCBpc2xfdmVjICppc2xfdmVjX21hdF9wcm9kdWN0KHN0cnVjdCBpc2xfdmVjICp2ZWMsIHN0cnVjdCBpc2xfbWF0ICptYXQpOworX19pc2xfZ2l2ZSBpc2xfdmVjICppc2xfbWF0X3ZlY19pbnZlcnNlX3Byb2R1Y3QoX19pc2xfdGFrZSBpc2xfbWF0ICptYXQsCisJCQkJCQlfX2lzbF90YWtlIGlzbF92ZWMgKnZlYyk7CitzdHJ1Y3QgaXNsX21hdCAqaXNsX21hdF9hZmZfZGlyZWN0X3N1bShzdHJ1Y3QgaXNsX21hdCAqbGVmdCwKKwkJCQkJc3RydWN0IGlzbF9tYXQgKnJpZ2h0KTsKK19faXNsX2dpdmUgaXNsX21hdCAqaXNsX21hdF9kaWFnb25hbChfX2lzbF90YWtlIGlzbF9tYXQgKm1hdDEsCisJX19pc2xfdGFrZSBpc2xfbWF0ICptYXQyKTsKK3N0cnVjdCBpc2xfbWF0ICppc2xfbWF0X2xlZnRfaGVybWl0ZShzdHJ1Y3QgaXNsX21hdCAqTSwKKwlpbnQgbmVnLCBzdHJ1Y3QgaXNsX21hdCAqKlUsIHN0cnVjdCBpc2xfbWF0ICoqUSk7CitzdHJ1Y3QgaXNsX21hdCAqaXNsX21hdF9saW5fdG9fYWZmKHN0cnVjdCBpc2xfbWF0ICptYXQpOworc3RydWN0IGlzbF9tYXQgKmlzbF9tYXRfaW52ZXJzZV9wcm9kdWN0KHN0cnVjdCBpc2xfbWF0ICpsZWZ0LAorCXN0cnVjdCBpc2xfbWF0ICpyaWdodCk7CitzdHJ1Y3QgaXNsX21hdCAqaXNsX21hdF9wcm9kdWN0KHN0cnVjdCBpc2xfbWF0ICpsZWZ0LCBzdHJ1Y3QgaXNsX21hdCAqcmlnaHQpOworc3RydWN0IGlzbF9tYXQgKmlzbF9tYXRfdHJhbnNwb3NlKHN0cnVjdCBpc2xfbWF0ICptYXQpOworX19pc2xfZ2l2ZSBpc2xfbWF0ICppc2xfbWF0X3JpZ2h0X2ludmVyc2UoX19pc2xfdGFrZSBpc2xfbWF0ICptYXQpOworX19pc2xfZ2l2ZSBpc2xfbWF0ICppc2xfbWF0X3JpZ2h0X2tlcm5lbChfX2lzbF90YWtlIGlzbF9tYXQgKm1hdCk7CisKK19faXNsX2dpdmUgaXNsX21hdCAqaXNsX21hdF9zY2FsZV9kb3duX3JvdyhfX2lzbF90YWtlIGlzbF9tYXQgKm1hdCwgaW50IHJvdywKKwlpc2xfaW50IG0pOworCitfX2lzbF9naXZlIGlzbF9tYXQgKmlzbF9tYXRfbm9ybWFsaXplKF9faXNsX3Rha2UgaXNsX21hdCAqbWF0KTsKK19faXNsX2dpdmUgaXNsX21hdCAqaXNsX21hdF9ub3JtYWxpemVfcm93KF9faXNsX3Rha2UgaXNsX21hdCAqbWF0LCBpbnQgcm93KTsKKworc3RydWN0IGlzbF9tYXQgKmlzbF9tYXRfZHJvcF9jb2xzKHN0cnVjdCBpc2xfbWF0ICptYXQsCisJCQkJdW5zaWduZWQgY29sLCB1bnNpZ25lZCBuKTsKK3N0cnVjdCBpc2xfbWF0ICppc2xfbWF0X2Ryb3Bfcm93cyhzdHJ1Y3QgaXNsX21hdCAqbWF0LAorCQkJCXVuc2lnbmVkIHJvdywgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9tYXQgKmlzbF9tYXRfaW5zZXJ0X2NvbHMoX19pc2xfdGFrZSBpc2xfbWF0ICptYXQsCisJCQkJdW5zaWduZWQgY29sLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX21hdCAqaXNsX21hdF9pbnNlcnRfcm93cyhfX2lzbF90YWtlIGlzbF9tYXQgKm1hdCwKKwkJCQl1bnNpZ25lZCByb3csIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfbWF0ICppc2xfbWF0X21vdmVfY29scyhfX2lzbF90YWtlIGlzbF9tYXQgKm1hdCwKKwl1bnNpZ25lZCBkc3RfY29sLCB1bnNpZ25lZCBzcmNfY29sLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX21hdCAqaXNsX21hdF9hZGRfcm93cyhfX2lzbF90YWtlIGlzbF9tYXQgKm1hdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9tYXQgKmlzbF9tYXRfaW5zZXJ0X3plcm9fY29scyhfX2lzbF90YWtlIGlzbF9tYXQgKm1hdCwKKwl1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9tYXQgKmlzbF9tYXRfYWRkX3plcm9fY29scyhfX2lzbF90YWtlIGlzbF9tYXQgKm1hdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9tYXQgKmlzbF9tYXRfaW5zZXJ0X3plcm9fcm93cyhfX2lzbF90YWtlIGlzbF9tYXQgKm1hdCwKKwl1bnNpZ25lZCByb3csIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfbWF0ICppc2xfbWF0X2FkZF96ZXJvX3Jvd3MoX19pc2xfdGFrZSBpc2xfbWF0ICptYXQsIHVuc2lnbmVkIG4pOworCit2b2lkIGlzbF9tYXRfY29sX2FkZChfX2lzbF9rZWVwIGlzbF9tYXQgKm1hdCwgaW50IGRzdF9jb2wsIGludCBzcmNfY29sKTsKK3ZvaWQgaXNsX21hdF9jb2xfbXVsKHN0cnVjdCBpc2xfbWF0ICptYXQsIGludCBkc3RfY29sLCBpc2xfaW50IGYsIGludCBzcmNfY29sKTsKK3ZvaWQgaXNsX21hdF9jb2xfc3VibXVsKHN0cnVjdCBpc2xfbWF0ICptYXQsCisJCQlpbnQgZHN0X2NvbCwgaXNsX2ludCBmLCBpbnQgc3JjX2NvbCk7CisKK3N0cnVjdCBpc2xfbWF0ICppc2xfbWF0X3VuaW1vZHVsYXJfY29tcGxldGUoc3RydWN0IGlzbF9tYXQgKk0sIGludCByb3cpOworCitfX2lzbF9naXZlIGlzbF9tYXQgKmlzbF9tYXRfZnJvbV9yb3dfdmVjKF9faXNsX3Rha2UgaXNsX3ZlYyAqdmVjKTsKK19faXNsX2dpdmUgaXNsX21hdCAqaXNsX21hdF9jb25jYXQoX19pc2xfdGFrZSBpc2xfbWF0ICp0b3AsCisJX19pc2xfdGFrZSBpc2xfbWF0ICpib3QpOworX19pc2xfZ2l2ZSBpc2xfbWF0ICppc2xfbWF0X3ZlY19jb25jYXQoX19pc2xfdGFrZSBpc2xfbWF0ICp0b3AsCisJX19pc2xfdGFrZSBpc2xfdmVjICpib3QpOworCitpbnQgaXNsX21hdF9pc19lcXVhbChfX2lzbF9rZWVwIGlzbF9tYXQgKm1hdDEsIF9faXNsX2tlZXAgaXNsX21hdCAqbWF0Mik7CisKK2ludCBpc2xfbWF0X2luaXRpYWxfbm9uX3plcm9fY29scyhfX2lzbF9rZWVwIGlzbF9tYXQgKm1hdCk7CisKK3ZvaWQgaXNsX21hdF9wcmludF9pbnRlcm5hbChfX2lzbF9rZWVwIGlzbF9tYXQgKm1hdCwgRklMRSAqb3V0LCBpbnQgaW5kZW50KTsKK3ZvaWQgaXNsX21hdF9kdW1wKF9faXNsX2tlZXAgaXNsX21hdCAqbWF0KTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2lzbC9tdWx0aS5oIGIvaW5jbHVkZS9pc2wvbXVsdGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWI3YWNhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9pc2wvbXVsdGkuaApAQCAtMCwwICsxLDI2IEBACisjaWZuZGVmIElTTF9NVUxUSV9ICisjZGVmaW5lIElTTF9NVUxUSV9ICisKKyNpbmNsdWRlIDxpc2wvbGlzdC5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgSVNMX0RFQ0xBUkVfTVVMVEkoQkFTRSkJCQkJCQlcCitfX2lzbF9naXZlIGlzbF9tdWx0aV8jI0JBU0UgKmlzbF9tdWx0aV8jI0JBU0UjI19mcm9tXyMjQkFTRSMjX2xpc3QoCVwKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqc3BhY2UsIF9faXNsX3Rha2UgaXNsXyMjQkFTRSMjX2xpc3QgKmxpc3QpOyBcCitjb25zdCBjaGFyICppc2xfbXVsdGlfIyNCQVNFIyNfZ2V0X3R1cGxlX25hbWUoCQkJCVwKKwlfX2lzbF9rZWVwIGlzbF9tdWx0aV8jI0JBU0UgKm11bHRpLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsJXAorX19pc2xfZ2l2ZSBpc2xfbXVsdGlfIyNCQVNFICppc2xfbXVsdGlfIyNCQVNFIyNfc2V0XyMjQkFTRSgJCVwKKwlfX2lzbF90YWtlIGlzbF9tdWx0aV8jI0JBU0UgKm11bHRpLCBpbnQgcG9zLAkJCVwKKwlfX2lzbF90YWtlIGlzbF8jI0JBU0UgKmVsKTsKKworSVNMX0RFQ0xBUkVfTVVMVEkoYWZmKQorSVNMX0RFQ0xBUkVfTVVMVEkocHdfYWZmKQorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaXNsL29iai5oIGIvaW5jbHVkZS9pc2wvb2JqLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YyNmMwYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaXNsL29iai5oCkBAIC0wLDAgKzEsNjQgQEAKKyNpZm5kZWYgSVNMX09CSl9ICisjZGVmaW5lIElTTF9PQkpfSAorCisjaW5jbHVkZSA8aXNsL3NldF90eXBlLmg+CisjaW5jbHVkZSA8aXNsL21hcF90eXBlLmg+CisjaW5jbHVkZSA8aXNsL3VuaW9uX3NldF90eXBlLmg+CisjaW5jbHVkZSA8aXNsL3VuaW9uX21hcF90eXBlLmg+CisjaW5jbHVkZSA8aXNsL3BvbHlub21pYWxfdHlwZS5oPgorI2luY2x1ZGUgPGlzbC9wcmludGVyLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IGlzbF9vYmpfdnRhYmxlIHsKKwl2b2lkICooKmNvcHkpKHZvaWQgKnYxKTsKKwl2b2lkICooKmFkZCkodm9pZCAqdjEsIHZvaWQgKnYyKTsKKwlfX2lzbF9naXZlIGlzbF9wcmludGVyICooKnByaW50KShfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLCB2b2lkICp2KTsKKwl2b2lkICgqZnJlZSkodm9pZCAqdik7Cit9OwordHlwZWRlZiBzdHJ1Y3QgaXNsX29ial92dGFibGUgKmlzbF9vYmpfdHlwZTsKK2V4dGVybiBzdHJ1Y3QgaXNsX29ial92dGFibGUgaXNsX29ial9ub25lX3Z0YWJsZTsKKyNkZWZpbmUgaXNsX29ial9ub25lCQkoJmlzbF9vYmpfbm9uZV92dGFibGUpCitleHRlcm4gc3RydWN0IGlzbF9vYmpfdnRhYmxlIGlzbF9vYmpfaW50X3Z0YWJsZTsKKyNkZWZpbmUgaXNsX29ial9pbnQJCSgmaXNsX29ial9pbnRfdnRhYmxlKQorZXh0ZXJuIHN0cnVjdCBpc2xfb2JqX3Z0YWJsZSBpc2xfb2JqX3NldF92dGFibGU7CisjZGVmaW5lIGlzbF9vYmpfc2V0CQkoJmlzbF9vYmpfc2V0X3Z0YWJsZSkKK2V4dGVybiBzdHJ1Y3QgaXNsX29ial92dGFibGUgaXNsX29ial91bmlvbl9zZXRfdnRhYmxlOworI2RlZmluZSBpc2xfb2JqX3VuaW9uX3NldAkoJmlzbF9vYmpfdW5pb25fc2V0X3Z0YWJsZSkKK2V4dGVybiBzdHJ1Y3QgaXNsX29ial92dGFibGUgaXNsX29ial9tYXBfdnRhYmxlOworI2RlZmluZSBpc2xfb2JqX21hcAkJKCZpc2xfb2JqX21hcF92dGFibGUpCitleHRlcm4gc3RydWN0IGlzbF9vYmpfdnRhYmxlIGlzbF9vYmpfdW5pb25fbWFwX3Z0YWJsZTsKKyNkZWZpbmUgaXNsX29ial91bmlvbl9tYXAJKCZpc2xfb2JqX3VuaW9uX21hcF92dGFibGUpCitleHRlcm4gc3RydWN0IGlzbF9vYmpfdnRhYmxlIGlzbF9vYmpfcHdfcXBvbHlub21pYWxfdnRhYmxlOworI2RlZmluZSBpc2xfb2JqX3B3X3Fwb2x5bm9taWFsCSgmaXNsX29ial9wd19xcG9seW5vbWlhbF92dGFibGUpCitleHRlcm4gc3RydWN0IGlzbF9vYmpfdnRhYmxlIGlzbF9vYmpfdW5pb25fcHdfcXBvbHlub21pYWxfdnRhYmxlOworI2RlZmluZSBpc2xfb2JqX3VuaW9uX3B3X3Fwb2x5bm9taWFsCSgmaXNsX29ial91bmlvbl9wd19xcG9seW5vbWlhbF92dGFibGUpCitleHRlcm4gc3RydWN0IGlzbF9vYmpfdnRhYmxlIGlzbF9vYmpfcHdfcXBvbHlub21pYWxfZm9sZF92dGFibGU7CisjZGVmaW5lIGlzbF9vYmpfcHdfcXBvbHlub21pYWxfZm9sZAkoJmlzbF9vYmpfcHdfcXBvbHlub21pYWxfZm9sZF92dGFibGUpCitleHRlcm4gc3RydWN0IGlzbF9vYmpfdnRhYmxlIGlzbF9vYmpfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZF92dGFibGU7CisjZGVmaW5lIGlzbF9vYmpfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZAkoJmlzbF9vYmpfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZF92dGFibGUpCitzdHJ1Y3QgaXNsX29iaiB7CisJaXNsX29ial90eXBlCXR5cGU7CisJdm9pZAkJKnY7Cit9OworCitzdHJ1Y3QgaXNsX2ludF9vYmo7Cit0eXBlZGVmIHN0cnVjdCBpc2xfaW50X29iaiBpc2xfaW50X29iajsKKworX19pc2xfZ2l2ZSBpc2xfaW50X29iaiAqaXNsX2ludF9vYmpfYWxsb2MoaXNsX2N0eCAqY3R4LCBpc2xfaW50IHYpOwordm9pZCBpc2xfaW50X29ial9mcmVlKF9faXNsX3Rha2UgaXNsX2ludF9vYmogKmkpOworX19pc2xfZ2l2ZSBpc2xfaW50X29iaiAqaXNsX2ludF9vYmpfYWRkKF9faXNsX3Rha2UgaXNsX2ludF9vYmogKmkxLAorCV9faXNsX3Rha2UgaXNsX2ludF9vYmogKmkyKTsKK19faXNsX2dpdmUgaXNsX2ludF9vYmogKmlzbF9pbnRfb2JqX3N1YihfX2lzbF90YWtlIGlzbF9pbnRfb2JqICppMSwKKwlfX2lzbF90YWtlIGlzbF9pbnRfb2JqICppMik7CitfX2lzbF9naXZlIGlzbF9pbnRfb2JqICppc2xfaW50X29ial9tdWwoX19pc2xfdGFrZSBpc2xfaW50X29iaiAqaTEsCisJX19pc2xfdGFrZSBpc2xfaW50X29iaiAqaTIpOwordm9pZCBpc2xfaW50X29ial9nZXRfaW50KF9faXNsX2tlZXAgaXNsX2ludF9vYmogKmksIGlzbF9pbnQgKnYpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaXNsL29wdGlvbnMuaCBiL2luY2x1ZGUvaXNsL29wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGM5YTQzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9pc2wvb3B0aW9ucy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEthdGhvbGlla2UgVW5pdmVyc2l0ZWl0IExldXZlbgorICoKKyAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBNSVQgbGljZW5zZQorICoKKyAqIFdyaXR0ZW4gYnkgU3ZlbiBWZXJkb29sYWVnZSwgSy5VLkxldXZlbiwgRGVwYXJ0ZW1lbnQKKyAqIENvbXB1dGVyd2V0ZW5zY2hhcHBlbiwgQ2VsZXN0aWpuZW5sYWFuIDIwMEEsIEItMzAwMSBMZXV2ZW4sIEJlbGdpdW0KKyAqLworCisjaWZuZGVmIElTTF9PUFRJT05TX0gKKyNkZWZpbmUgSVNMX09QVElPTlNfSAorCisjaW5jbHVkZSA8aXNsL2FyZy5oPgorI2luY2x1ZGUgPGlzbC9jdHguaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgaXNsX29wdGlvbnM7CisKK0lTTF9BUkdfREVDTChpc2xfb3B0aW9ucywgc3RydWN0IGlzbF9vcHRpb25zLCBpc2xfb3B0aW9uc19hcmdzKQorCisjZGVmaW5lCQkJSVNMX0JPVU5EX0JFUk5TVEVJTgkwCisjZGVmaW5lCQkJSVNMX0JPVU5EX1JBTkdFCQkxCitpbnQgaXNsX29wdGlvbnNfc2V0X2JvdW5kKGlzbF9jdHggKmN0eCwgaW50IHZhbCk7CitpbnQgaXNsX29wdGlvbnNfZ2V0X2JvdW5kKGlzbF9jdHggKmN0eCk7CisKKyNkZWZpbmUJCQlJU0xfT05fRVJST1JfV0FSTgkwCisjZGVmaW5lCQkJSVNMX09OX0VSUk9SX0NPTlRJTlVFCTEKKyNkZWZpbmUJCQlJU0xfT05fRVJST1JfQUJPUlQJMgoraW50IGlzbF9vcHRpb25zX3NldF9vbl9lcnJvcihpc2xfY3R4ICpjdHgsIGludCB2YWwpOworaW50IGlzbF9vcHRpb25zX2dldF9vbl9lcnJvcihpc2xfY3R4ICpjdHgpOworCitpbnQgaXNsX29wdGlvbnNfc2V0X2dicl9vbmx5X2ZpcnN0KGlzbF9jdHggKmN0eCwgaW50IHZhbCk7CitpbnQgaXNsX29wdGlvbnNfZ2V0X2dicl9vbmx5X2ZpcnN0KGlzbF9jdHggKmN0eCk7CisKKyNkZWZpbmUJCUlTTF9TQ0hFRFVMRV9BTEdPUklUSE1fSVNMCQkwCisjZGVmaW5lCQlJU0xfU0NIRURVTEVfQUxHT1JJVEhNX0ZFQVVUUklFUgkxCitpbnQgaXNsX29wdGlvbnNfc2V0X3NjaGVkdWxlX2FsZ29yaXRobShpc2xfY3R4ICpjdHgsIGludCB2YWwpOworaW50IGlzbF9vcHRpb25zX2dldF9zY2hlZHVsZV9hbGdvcml0aG0oaXNsX2N0eCAqY3R4KTsKKworaW50IGlzbF9vcHRpb25zX3NldF9jb2FsZXNjZV9ib3VuZGVkX3dyYXBwaW5nKGlzbF9jdHggKmN0eCwgaW50IHZhbCk7CitpbnQgaXNsX29wdGlvbnNfZ2V0X2NvYWxlc2NlX2JvdW5kZWRfd3JhcHBpbmcoaXNsX2N0eCAqY3R4KTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2lzbC9wb2ludC5oIGIvaW5jbHVkZS9pc2wvcG9pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTdlNjA1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9pc2wvcG9pbnQuaApAQCAtMCwwICsxLDQ0IEBACisjaWZuZGVmIElTTF9QT0lOVF9ICisjZGVmaW5lIElTTF9QT0lOVF9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGlzbC9zcGFjZS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBpc2xfcG9pbnQ7Cit0eXBlZGVmIHN0cnVjdCBpc2xfcG9pbnQgaXNsX3BvaW50OworCitpc2xfY3R4ICppc2xfcG9pbnRfZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF9wb2ludCAqcG50KTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfcG9pbnRfZ2V0X3NwYWNlKF9faXNsX2tlZXAgaXNsX3BvaW50ICpwbnQpOworCitfX2lzbF9naXZlIGlzbF9wb2ludCAqaXNsX3BvaW50X3plcm8oX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9wb2ludCAqaXNsX3BvaW50X2NvcHkoX19pc2xfa2VlcCBpc2xfcG9pbnQgKnBudCk7Cit2b2lkIGlzbF9wb2ludF9mcmVlKF9faXNsX3Rha2UgaXNsX3BvaW50ICpwbnQpOworCitpbnQgaXNsX3BvaW50X2dldF9jb29yZGluYXRlKF9faXNsX2tlZXAgaXNsX3BvaW50ICpwbnQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgaW50IHBvcywgaXNsX2ludCAqdik7CitfX2lzbF9naXZlIGlzbF9wb2ludCAqaXNsX3BvaW50X3NldF9jb29yZGluYXRlKF9faXNsX3Rha2UgaXNsX3BvaW50ICpwbnQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgaW50IHBvcywgaXNsX2ludCB2KTsKKworX19pc2xfZ2l2ZSBpc2xfcG9pbnQgKmlzbF9wb2ludF9hZGRfdWkoX19pc2xfdGFrZSBpc2xfcG9pbnQgKnBudCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBpbnQgcG9zLCB1bnNpZ25lZCB2YWwpOworX19pc2xfZ2l2ZSBpc2xfcG9pbnQgKmlzbF9wb2ludF9zdWJfdWkoX19pc2xfdGFrZSBpc2xfcG9pbnQgKnBudCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBpbnQgcG9zLCB1bnNpZ25lZCB2YWwpOworCitfX2lzbF9naXZlIGlzbF9wb2ludCAqaXNsX3BvaW50X3ZvaWQoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitpbnQgaXNsX3BvaW50X2lzX3ZvaWQoX19pc2xfa2VlcCBpc2xfcG9pbnQgKnBudCk7CisKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X3BvaW50KAorCV9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnByaW50ZXIsIF9faXNsX2tlZXAgaXNsX3BvaW50ICpwbnQpOwordm9pZCBpc2xfcG9pbnRfZHVtcChfX2lzbF9rZWVwIGlzbF9wb2ludCAqcG50KTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2luY2x1ZGUgPGlzbC9kaW0uaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2lzbC9wb2x5bm9taWFsLmggYi9pbmNsdWRlL2lzbC9wb2x5bm9taWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM1NGM2MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaXNsL3BvbHlub21pYWwuaApAQCAtMCwwICsxLDU5MyBAQAorI2lmbmRlZiBJU0xfUE9MWU5PTUlBTF9ICisjZGVmaW5lIElTTF9QT0xZTk9NSUFMX0gKKworI2luY2x1ZGUgPGlzbC9jdHguaD4KKyNpbmNsdWRlIDxpc2wvY29uc3RyYWludC5oPgorI2luY2x1ZGUgPGlzbC9zcGFjZS5oPgorI2luY2x1ZGUgPGlzbC9zZXRfdHlwZS5oPgorI2luY2x1ZGUgPGlzbC9wb2ludC5oPgorI2luY2x1ZGUgPGlzbC9wcmludGVyLmg+CisjaW5jbHVkZSA8aXNsL3VuaW9uX3NldF90eXBlLmg+CisjaW5jbHVkZSA8aXNsL2FmZl90eXBlLmg+CisjaW5jbHVkZSA8aXNsL3BvbHlub21pYWxfdHlwZS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2lzbF9jdHggKmlzbF9xcG9seW5vbWlhbF9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsICpxcCk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3Fwb2x5bm9taWFsX2dldF9kb21haW5fc3BhY2UoCisJX19pc2xfa2VlcCBpc2xfcXBvbHlub21pYWwgKnFwKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfcXBvbHlub21pYWxfZ2V0X3NwYWNlKF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsICpxcCk7Cit1bnNpZ25lZCBpc2xfcXBvbHlub21pYWxfZGltKF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsICpxcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKK2ludCBpc2xfcXBvbHlub21pYWxfaW52b2x2ZXNfZGltcyhfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbCAqcXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworCitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX3NldF9kaW1fbmFtZSgKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBjb25zdCBjaGFyICpzKTsKKworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF96ZXJvX29uX2RvbWFpbihfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcXBvbHlub21pYWxfb25lX29uX2RvbWFpbihfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcXBvbHlub21pYWxfaW5mdHlfb25fZG9tYWluKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9uZWdpbmZ0eV9vbl9kb21haW4oX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX25hbl9vbl9kb21haW4oX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX3JhdF9jc3Rfb25fZG9tYWluKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sCisJY29uc3QgaXNsX2ludCBuLCBjb25zdCBpc2xfaW50IGQpOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF92YXJfb25fZG9tYWluKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcXBvbHlub21pYWxfY29weShfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbCAqcXApOwordm9pZCAqaXNsX3Fwb2x5bm9taWFsX2ZyZWUoX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwKTsKKworaW50IGlzbF9xcG9seW5vbWlhbF9wbGFpbl9pc19lcXVhbChfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbCAqcXAxLAorCV9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsICpxcDIpOworaW50IGlzbF9xcG9seW5vbWlhbF9pc196ZXJvKF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsICpxcCk7CitpbnQgaXNsX3Fwb2x5bm9taWFsX2lzX25hbihfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbCAqcXApOworaW50IGlzbF9xcG9seW5vbWlhbF9pc19pbmZ0eShfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbCAqcXApOworaW50IGlzbF9xcG9seW5vbWlhbF9pc19uZWdpbmZ0eShfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbCAqcXApOworaW50IGlzbF9xcG9seW5vbWlhbF9zZ24oX19pc2xfa2VlcCBpc2xfcXBvbHlub21pYWwgKnFwKTsKK2ludCBpc2xfcXBvbHlub21pYWxfaXNfY3N0KF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsICpxcCwKKwlpc2xfaW50ICpuLCBpc2xfaW50ICpkKTsKK3ZvaWQgaXNsX3Fwb2x5bm9taWFsX2dldF9kZW4oX19pc2xfa2VlcCBpc2xfcXBvbHlub21pYWwgKnFwLCBpc2xfaW50ICpkKTsKKworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9uZWcoX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwKTsKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcXBvbHlub21pYWxfYWRkKF9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsICpxcDEsCisJX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwMik7CitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX3N1YihfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcXAxLAorCV9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsICpxcDIpOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9tdWwoX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwMSwKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcXAyKTsKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcXBvbHlub21pYWxfcG93KF9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsICpxcCwKKwl1bnNpZ25lZCBwb3dlcik7CitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX2FkZF9pc2xfaW50KAorCV9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsICpxcCwgaXNsX2ludCB2KTsKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcXBvbHlub21pYWxfbXVsX2lzbF9pbnQoCisJX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwLCBpc2xfaW50IHYpOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9zY2FsZSgKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcXAsIGlzbF9pbnQgdik7CisKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcXBvbHlub21pYWxfaW5zZXJ0X2RpbXMoCisJX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlLAorCXVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcXBvbHlub21pYWxfYWRkX2RpbXMoCisJX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcXBvbHlub21pYWxfbW92ZV9kaW1zKAorCV9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsICpxcCwKKwllbnVtIGlzbF9kaW1fdHlwZSBkc3RfdHlwZSwgdW5zaWduZWQgZHN0X3BvcywKKwllbnVtIGlzbF9kaW1fdHlwZSBzcmNfdHlwZSwgdW5zaWduZWQgc3JjX3BvcywgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX3Byb2plY3RfZG9tYWluX29uX3BhcmFtcygKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcXApOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9kcm9wX2RpbXMoCisJX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKKworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9zdWJzdGl0dXRlKAorCV9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsICpxcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbiwKKwlfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbCAqKnN1YnMpOworCitpbnQgaXNsX3Fwb2x5bm9taWFsX2FzX3BvbHlub21pYWxfb25fZG9tYWluKF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsICpxcCwKKwlfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQsCisJaW50ICgqZm4pKF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwkJICBfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcG9seSwgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworCitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX2hvbW9nZW5pemUoCisJX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnBvbHkpOworCitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX2FsaWduX3BhcmFtcygKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcXAsIF9faXNsX3Rha2UgaXNsX3NwYWNlICptb2RlbCk7CisKK2lzbF9jdHggKmlzbF90ZXJtX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfdGVybSAqdGVybSk7CisKK19faXNsX2dpdmUgaXNsX3Rlcm0gKmlzbF90ZXJtX2NvcHkoX19pc2xfa2VlcCBpc2xfdGVybSAqdGVybSk7Cit2b2lkIGlzbF90ZXJtX2ZyZWUoX19pc2xfdGFrZSBpc2xfdGVybSAqdGVybSk7CisKK3Vuc2lnbmVkIGlzbF90ZXJtX2RpbShfX2lzbF9rZWVwIGlzbF90ZXJtICp0ZXJtLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKK3ZvaWQgaXNsX3Rlcm1fZ2V0X251bShfX2lzbF9rZWVwIGlzbF90ZXJtICp0ZXJtLCBpc2xfaW50ICpuKTsKK3ZvaWQgaXNsX3Rlcm1fZ2V0X2RlbihfX2lzbF9rZWVwIGlzbF90ZXJtICp0ZXJtLCBpc2xfaW50ICpkKTsKK2ludCBpc2xfdGVybV9nZXRfZXhwKF9faXNsX2tlZXAgaXNsX3Rlcm0gKnRlcm0sCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX3Rlcm1fZ2V0X2RpdihfX2lzbF9rZWVwIGlzbF90ZXJtICp0ZXJtLCB1bnNpZ25lZCBwb3MpOworCitpbnQgaXNsX3Fwb2x5bm9taWFsX2ZvcmVhY2hfdGVybShfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbCAqcXAsCisJaW50ICgqZm4pKF9faXNsX3Rha2UgaXNsX3Rlcm0gKnRlcm0sIHZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKKworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9ldmFsKAorCV9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsICpxcCwgX19pc2xfdGFrZSBpc2xfcG9pbnQgKnBudCk7CisKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcXBvbHlub21pYWxfZ2lzdF9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwLCBfX2lzbF90YWtlIGlzbF9zZXQgKmNvbnRleHQpOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9naXN0KAorCV9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsICpxcCwgX19pc2xfdGFrZSBpc2xfc2V0ICpjb250ZXh0KTsKKworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9mcm9tX2NvbnN0cmFpbnQoCisJX19pc2xfdGFrZSBpc2xfY29uc3RyYWludCAqYywgZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcXBvbHlub21pYWxfZnJvbV90ZXJtKF9faXNsX3Rha2UgaXNsX3Rlcm0gKnRlcm0pOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF9xcG9seW5vbWlhbF9mcm9tX2FmZihfX2lzbF90YWtlIGlzbF9hZmYgKmFmZik7CitfX2lzbF9naXZlIGlzbF9iYXNpY19tYXAgKmlzbF9iYXNpY19tYXBfZnJvbV9xcG9seW5vbWlhbCgKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcXApOworCitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF9xcG9seW5vbWlhbCgKKwlfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLCBfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbCAqcXApOwordm9pZCBpc2xfcXBvbHlub21pYWxfcHJpbnQoX19pc2xfa2VlcCBpc2xfcXBvbHlub21pYWwgKnFwLCBGSUxFICpvdXQsCisJdW5zaWduZWQgb3V0cHV0X2Zvcm1hdCk7Cit2b2lkIGlzbF9xcG9seW5vbWlhbF9kdW1wKF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsICpxcCk7CisKK2lzbF9jdHggKmlzbF9wd19xcG9seW5vbWlhbF9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwKTsKKworaW50IGlzbF9wd19xcG9seW5vbWlhbF9wbGFpbl9pc19lcXVhbChfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcDEsCisJX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXAyKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF96ZXJvKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9hbGxvYyhfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcXApOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9mcm9tX3Fwb2x5bm9taWFsKAorCV9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsICpxcCk7CitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbCAqaXNsX3B3X3Fwb2x5bm9taWFsX2NvcHkoCisJX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXApOwordm9pZCAqaXNsX3B3X3Fwb2x5bm9taWFsX2ZyZWUoX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXApOworCitpbnQgaXNsX3B3X3Fwb2x5bm9taWFsX2lzX3plcm8oX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXApOworCitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3B3X3Fwb2x5bm9taWFsX2dldF9kb21haW5fc3BhY2UoCisJX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXApOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9wd19xcG9seW5vbWlhbF9nZXRfc3BhY2UoCisJX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXApOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9yZXNldF9kb21haW5fc3BhY2UoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXAsIF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOwordW5zaWduZWQgaXNsX3B3X3Fwb2x5bm9taWFsX2RpbShfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKK2ludCBpc2xfcHdfcXBvbHlub21pYWxfaW52b2x2ZXNfZGltcyhfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitpbnQgaXNsX3B3X3Fwb2x5bm9taWFsX2hhc19lcXVhbF9zcGFjZShfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcDEsCisJX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXAyKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9zZXRfZGltX25hbWUoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXAsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBjb25zdCBjaGFyICpzKTsKKworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfcHdfcXBvbHlub21pYWxfZG9tYWluKF9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwKTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfaW50ZXJzZWN0X2RvbWFpbigKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdwcSwgX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9pbnRlcnNlY3RfcGFyYW1zKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3BxLCBfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CisKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfcHJvamVjdF9kb21haW5fb25fcGFyYW1zKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwKTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfZHJvcF9kaW1zKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfc3BsaXRfZGltcygKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CisKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfYWRkKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwMSwKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcDIpOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9zdWIoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXAxLAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwMik7CitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbCAqaXNsX3B3X3Fwb2x5bm9taWFsX2FkZF9kaXNqb2ludCgKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcDEsCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXAyKTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfbmVnKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwKTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfbXVsKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwMSwKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcDIpOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9tdWxfaXNsX2ludCgKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCwgaXNsX2ludCB2KTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfcG93KAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwLCB1bnNpZ25lZCBleHBvbmVudCk7CisKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfaW5zZXJ0X2RpbXMoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXAsIGVudW0gaXNsX2RpbV90eXBlIHR5cGUsCisJdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9hZGRfZGltcygKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfbW92ZV9kaW1zKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwLAorCWVudW0gaXNsX2RpbV90eXBlIGRzdF90eXBlLCB1bnNpZ25lZCBkc3RfcG9zLAorCWVudW0gaXNsX2RpbV90eXBlIHNyY190eXBlLCB1bnNpZ25lZCBzcmNfcG9zLCB1bnNpZ25lZCBuKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9maXhfZGltKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIG4sIGlzbF9pbnQgdik7CisKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfZXZhbCgKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCwgX19pc2xfdGFrZSBpc2xfcG9pbnQgKnBudCk7CisKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfbWF4KAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwKTsKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfbWluKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwKTsKKworaW50IGlzbF9wd19xcG9seW5vbWlhbF9mb3JlYWNoX3BpZWNlKF9faXNsX2tlZXAgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwLAorCWludCAoKmZuKShfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwgX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwLAorCQkgICAgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworaW50IGlzbF9wd19xcG9seW5vbWlhbF9mb3JlYWNoX2xpZnRlZF9waWVjZShfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCwKKwlpbnQgKCpmbikoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsIF9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsICpxcCwKKwkJICAgIHZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9wd19xcG9seW5vbWlhbF9mcm9tX3B3X2FmZigKKwlfX2lzbF90YWtlIGlzbF9wd19hZmYgKnB3YWZmKTsKKworX19pc2xfY29uc3RydWN0b3IKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfcmVhZF9mcm9tX3N0cihpc2xfY3R4ICpjdHgsCisJCWNvbnN0IGNoYXIgKnN0cik7CitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbCAqaXNsX3B3X3Fwb2x5bm9taWFsX3JlYWRfZnJvbV9maWxlKGlzbF9jdHggKmN0eCwKKwkJRklMRSAqaW5wdXQpOworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfcHJpbnRfcHdfcXBvbHlub21pYWwoCisJX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwgX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXApOwordm9pZCBpc2xfcHdfcXBvbHlub21pYWxfcHJpbnQoX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXAsIEZJTEUgKm91dCwKKwl1bnNpZ25lZCBvdXRwdXRfZm9ybWF0KTsKK3ZvaWQgaXNsX3B3X3Fwb2x5bm9taWFsX2R1bXAoX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXApOworCitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbCAqaXNsX3B3X3Fwb2x5bm9taWFsX2NvYWxlc2NlKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwKTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfZ2lzdCgKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCwgX19pc2xfdGFrZSBpc2xfc2V0ICpjb250ZXh0KTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfZ2lzdF9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXAsIF9faXNsX3Rha2UgaXNsX3NldCAqY29udGV4dCk7CisKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfc3BsaXRfcGVyaW9kcygKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCwgaW50IG1heF9wZXJpb2RzKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9iYXNpY19zZXRfbXVsdGlwbGljYXRpdmVfY2FsbCgKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQsCisJX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKigqZm4pKF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCkpOworCitpc2xfY3R4ICppc2xfcXBvbHlub21pYWxfZm9sZF9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmZvbGQpOworZW51bSBpc2xfZm9sZCBpc2xfcXBvbHlub21pYWxfZm9sZF9nZXRfdHlwZShfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbF9mb2xkICpmb2xkKTsKKworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWxfZm9sZCAqaXNsX3Fwb2x5bm9taWFsX2ZvbGRfZW1wdHkoZW51bSBpc2xfZm9sZCB0eXBlLAorCV9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWxfZm9sZCAqaXNsX3Fwb2x5bm9taWFsX2ZvbGRfYWxsb2MoCisJZW51bSBpc2xfZm9sZCB0eXBlLCBfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbCAqcXApOworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWxfZm9sZCAqaXNsX3Fwb2x5bm9taWFsX2ZvbGRfY29weSgKKwlfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbF9mb2xkICpmb2xkKTsKK3ZvaWQgaXNsX3Fwb2x5bm9taWFsX2ZvbGRfZnJlZShfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbF9mb2xkICpmb2xkKTsKKworaW50IGlzbF9xcG9seW5vbWlhbF9mb2xkX2lzX2VtcHR5KF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmZvbGQpOworaW50IGlzbF9xcG9seW5vbWlhbF9mb2xkX3BsYWluX2lzX2VxdWFsKF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmZvbGQxLAorCV9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmZvbGQyKTsKKworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9xcG9seW5vbWlhbF9mb2xkX2dldF9zcGFjZSgKKwlfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbF9mb2xkICpmb2xkKTsKKworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWxfZm9sZCAqaXNsX3Fwb2x5bm9taWFsX2ZvbGRfZm9sZCgKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbF9mb2xkICpmb2xkMSwKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbF9mb2xkICpmb2xkMik7CisKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF9xcG9seW5vbWlhbF9mb2xkX211bF9pc2xfaW50KAorCV9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmZvbGQsIGlzbF9pbnQgdik7CitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbF9mb2xkICppc2xfcXBvbHlub21pYWxfZm9sZF9zY2FsZSgKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbF9mb2xkICpmb2xkLCBpc2xfaW50IHYpOworCitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbF9mb2xkICppc2xfcXBvbHlub21pYWxfZm9sZF9tb3ZlX2RpbXMoCisJX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWxfZm9sZCAqZm9sZCwKKwllbnVtIGlzbF9kaW1fdHlwZSBkc3RfdHlwZSwgdW5zaWduZWQgZHN0X3BvcywKKwllbnVtIGlzbF9kaW1fdHlwZSBzcmNfdHlwZSwgdW5zaWduZWQgc3JjX3BvcywgdW5zaWduZWQgbik7CisKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF9xcG9seW5vbWlhbF9mb2xkX3N1YnN0aXR1dGUoCisJX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWxfZm9sZCAqZm9sZCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbiwKKwlfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbCAqKnN1YnMpOworCitfX2lzbF9naXZlIGlzbF9xcG9seW5vbWlhbCAqaXNsX3Fwb2x5bm9taWFsX2ZvbGRfZXZhbCgKKwlfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbF9mb2xkICpmb2xkLCBfX2lzbF90YWtlIGlzbF9wb2ludCAqcG50KTsKKworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWxfZm9sZCAqaXNsX3Fwb2x5bm9taWFsX2ZvbGRfZ2lzdF9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWxfZm9sZCAqZm9sZCwgX19pc2xfdGFrZSBpc2xfc2V0ICpjb250ZXh0KTsKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF9xcG9seW5vbWlhbF9mb2xkX2dpc3QoCisJX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWxfZm9sZCAqZm9sZCwgX19pc2xfdGFrZSBpc2xfc2V0ICpjb250ZXh0KTsKKworaW50IGlzbF9xcG9seW5vbWlhbF9mb2xkX2ZvcmVhY2hfcXBvbHlub21pYWwoCisJX19pc2xfa2VlcCBpc2xfcXBvbHlub21pYWxfZm9sZCAqZm9sZCwKKwlpbnQgKCpmbikoX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWwgKnFwLCB2b2lkICp1c2VyKSwgdm9pZCAqdXNlcik7CisKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X3Fwb2x5bm9taWFsX2ZvbGQoCisJX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwgX19pc2xfa2VlcCBpc2xfcXBvbHlub21pYWxfZm9sZCAqZm9sZCk7Cit2b2lkIGlzbF9xcG9seW5vbWlhbF9mb2xkX3ByaW50KF9faXNsX2tlZXAgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmZvbGQsIEZJTEUgKm91dCwKKwl1bnNpZ25lZCBvdXRwdXRfZm9ybWF0KTsKK3ZvaWQgaXNsX3Fwb2x5bm9taWFsX2ZvbGRfZHVtcChfX2lzbF9rZWVwIGlzbF9xcG9seW5vbWlhbF9mb2xkICpmb2xkKTsKKworaXNsX2N0eCAqaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YpOworCitpbnQgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfcGxhaW5faXNfZXF1YWwoCisJX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmMSwKKwlfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YyKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZnJvbV9wd19xcG9seW5vbWlhbCgKKwllbnVtIGlzbF9mb2xkIHR5cGUsIF9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfYWxsb2MoCisJZW51bSBpc2xfZm9sZCB0eXBlLAorCV9faXNsX3Rha2UgaXNsX3NldCAqc2V0LCBfX2lzbF90YWtlIGlzbF9xcG9seW5vbWlhbF9mb2xkICpmb2xkKTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX2NvcHkoCisJX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmKTsKK3ZvaWQgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX2ZyZWUoX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmKTsKKworaW50IGlzbF9wd19xcG9seW5vbWlhbF9mb2xkX2lzX3plcm8oX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmKTsKKworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX2dldF9kb21haW5fc3BhY2UoCisJX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfcHdfcXBvbHlub21pYWxfZm9sZF9nZXRfc3BhY2UoCisJX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmKTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX3Jlc2V0X3NwYWNlKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3ZiwgX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7Cit1bnNpZ25lZCBpc2xfcHdfcXBvbHlub21pYWxfZm9sZF9kaW0oX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworaW50IGlzbF9wd19xcG9seW5vbWlhbF9mb2xkX2hhc19lcXVhbF9zcGFjZSgKKwlfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YxLAorCV9faXNsX2tlZXAgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3ZjIpOworCitzaXplX3QgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfc2l6ZShfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YpOworCitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfcHdfcXBvbHlub21pYWxfZm9sZF96ZXJvKAorCV9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sIGVudW0gaXNsX2ZvbGQgdHlwZSk7CisKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX3NldF9kaW1fbmFtZSgKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBjb25zdCBjaGFyICpzKTsKKworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfcHdfcXBvbHlub21pYWxfZm9sZF9kb21haW4oCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmKTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX2ludGVyc2VjdF9kb21haW4oCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmLCBfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfcHdfcXBvbHlub21pYWxfZm9sZF9pbnRlcnNlY3RfcGFyYW1zKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3ZiwgX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworCitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfcHdfcXBvbHlub21pYWxfZm9sZF9hZGQoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmMSwKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YyKTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX2ZvbGQoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmMSwKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YyKTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX2FkZF9kaXNqb2ludCgKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YxLAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3ZjIpOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfbXVsX2lzbF9pbnQoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmLCBpc2xfaW50IHYpOworCitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfcHdfcXBvbHlub21pYWxfZm9sZF9wcm9qZWN0X2RvbWFpbl9vbl9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmKTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX2Ryb3BfZGltcygKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfbW92ZV9kaW1zKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3ZiwKKwllbnVtIGlzbF9kaW1fdHlwZSBkc3RfdHlwZSwgdW5zaWduZWQgZHN0X3BvcywKKwllbnVtIGlzbF9kaW1fdHlwZSBzcmNfdHlwZSwgdW5zaWduZWQgc3JjX3BvcywgdW5zaWduZWQgbik7CisKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF9wd19xcG9seW5vbWlhbF9mb2xkX2ZpeF9kaW0oCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIG4sIGlzbF9pbnQgdik7CisKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfZm9sZF9ldmFsKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3ZiwgX19pc2xfdGFrZSBpc2xfcG9pbnQgKnBudCk7CisKK2ludCBpc2xfcHdfcXBvbHlub21pYWxfZm9sZF9mb3JlYWNoX3BpZWNlKAorCV9faXNsX2tlZXAgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3ZiwKKwlpbnQgKCpmbikoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsIF9faXNsX3Rha2UgaXNsX3Fwb2x5bm9taWFsX2ZvbGQgKmZvbGQsCisJCSAgICB2b2lkICp1c2VyKSwgdm9pZCAqdXNlcik7CitpbnQgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZm9yZWFjaF9saWZ0ZWRfcGllY2UoCisJX19pc2xfa2VlcCBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmLAorCWludCAoKmZuKShfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwgX19pc2xfdGFrZSBpc2xfcXBvbHlub21pYWxfZm9sZCAqZm9sZCwKKwkJICAgIHZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKKworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfcHJpbnRfcHdfcXBvbHlub21pYWxfZm9sZCgKKwlfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLCBfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YpOwordm9pZCBpc2xfcHdfcXBvbHlub21pYWxfZm9sZF9wcmludChfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YsCisJRklMRSAqb3V0LCB1bnNpZ25lZCBvdXRwdXRfZm9ybWF0KTsKK3ZvaWQgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZHVtcChfX2lzbF9rZWVwIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YpOworCitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfcHdfcXBvbHlub21pYWxfZm9sZF9jb2FsZXNjZSgKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YpOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZ2lzdCgKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YsIF9faXNsX3Rha2UgaXNsX3NldCAqY29udGV4dCk7CitfX2lzbF9naXZlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfcHdfcXBvbHlub21pYWxfZm9sZF9naXN0X3BhcmFtcygKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YsIF9faXNsX3Rha2UgaXNsX3NldCAqY29udGV4dCk7CisKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfZm9sZF9tYXgoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmKTsKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfZm9sZF9taW4oCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmKTsKKworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3B3X3Fwb2x5bm9taWFsX2JvdW5kKAorCV9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsICpwd3FwLCBlbnVtIGlzbF9mb2xkIHR5cGUsIGludCAqdGlnaHQpOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGRfYm91bmQoCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmLCBpbnQgKnRpZ2h0KTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF9zZXRfYXBwbHlfcHdfcXBvbHlub21pYWxfZm9sZCgKKwlfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwgX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmLAorCWludCAqdGlnaHQpOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX21hcF9hcHBseV9wd19xcG9seW5vbWlhbF9mb2xkKAorCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwLCBfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd2YsCisJaW50ICp0aWdodCk7CisKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsICppc2xfcHdfcXBvbHlub21pYWxfdG9fcG9seW5vbWlhbCgKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCwgaW50IHNpZ24pOworCitpc2xfY3R4ICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZ2V0X2N0eCgKKwlfX2lzbF9rZWVwIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqdXB3cXApOworCitpbnQgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX3BsYWluX2lzX2VxdWFsKAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcDEsCisJX19pc2xfa2VlcCBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKnVwd3FwMik7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZnJvbV9wd19xcG9seW5vbWlhbChfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbCAqcHdxcCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX3plcm8oCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2FkZF9wd19xcG9seW5vbWlhbCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqdXB3cXAsCisJX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXApOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9jb3B5KAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcCk7Cit2b2lkICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZnJlZShfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqdXB3cXApOworCitfX2lzbF9jb25zdHJ1Y3RvcgorX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9yZWFkX2Zyb21fc3RyKAorCWlzbF9jdHggKmN0eCwgY29uc3QgY2hhciAqc3RyKTsKKworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9hZGQoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKnVwd3FwMSwKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqdXB3cXAyKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfc3ViKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcDEsCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKnVwd3FwMik7CitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX211bCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqdXB3cXAxLAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcDIpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9tdWxfaXNsX2ludCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqdXB3cXAsIGlzbF9pbnQgdik7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX3NldCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2RvbWFpbigKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqdXB3cXApOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9pbnRlcnNlY3RfZG9tYWluKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdwcSwKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9pbnRlcnNlY3RfcGFyYW1zKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdwcSwKKwlfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CisKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZ2V0X3NwYWNlKAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcCk7CisKK19faXNsX2dpdmUgaXNsX3Fwb2x5bm9taWFsICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZXZhbCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqdXB3cXAsIF9faXNsX3Rha2UgaXNsX3BvaW50ICpwbnQpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2NvYWxlc2NlKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2dpc3QoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKnVwd3FwLAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqY29udGV4dCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2dpc3RfcGFyYW1zKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcCwKKwlfX2lzbF90YWtlIGlzbF9zZXQgKmNvbnRleHQpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2FsaWduX3BhcmFtcygKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqdXB3cXAsCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKm1vZGVsKTsKKworaW50IGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb3JlYWNoX3B3X3Fwb2x5bm9taWFsKAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcCwKKwlpbnQgKCpmbikoX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWwgKnB3cXAsIHZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZXh0cmFjdF9wd19xcG9seW5vbWlhbCgKKwlfX2lzbF9rZWVwIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqdXB3cXAsIF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworCitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF91bmlvbl9wd19xcG9seW5vbWlhbCgKKwlfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLCBfX2lzbF9rZWVwIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbCAqdXB3cXApOworCitpc2xfY3R4ICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZF9nZXRfY3R4KAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnVwd2YpOworCitpbnQgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGRfcGxhaW5faXNfZXF1YWwoCisJX19pc2xfa2VlcCBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqdXB3ZjEsCisJX19pc2xfa2VlcCBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqdXB3ZjIpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZF9mcm9tX3B3X3Fwb2x5bm9taWFsX2ZvbGQoX19pc2xfdGFrZSBpc2xfcHdfcXBvbHlub21pYWxfZm9sZCAqcHdmKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX3plcm8oCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwgZW51bSBpc2xfZm9sZCB0eXBlKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX2ZvbGRfcHdfcXBvbHlub21pYWxfZm9sZCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICp1cHdxcCwKKwlfX2lzbF90YWtlIGlzbF9wd19xcG9seW5vbWlhbF9mb2xkICpwd3FwKTsKK3ZvaWQgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX2ZyZWUoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqdXB3Zik7CitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZF9jb3B5KAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnVwd2YpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZF9mb2xkKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnVwd2YxLAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnVwd2YyKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX2FkZF91bmlvbl9wd19xcG9seW5vbWlhbCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICp1cHdmLAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZF9tdWxfaXNsX2ludCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICp1cHdmLCBpc2xfaW50IHYpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX2RvbWFpbigKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICp1cHdmKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX2ludGVyc2VjdF9kb21haW4oCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqdXB3ZiwKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqCitpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZF9pbnRlcnNlY3RfcGFyYW1zKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnVwd2YsCisJX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworCitlbnVtIGlzbF9mb2xkIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX2dldF90eXBlKAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnVwd2YpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX2dldF9zcGFjZSgKKwlfX2lzbF9rZWVwIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICp1cHdmKTsKKworX19pc2xfZ2l2ZSBpc2xfcXBvbHlub21pYWwgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX2V2YWwoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqdXB3ZiwKKwlfX2lzbF90YWtlIGlzbF9wb2ludCAqcG50KTsKKworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGRfY29hbGVzY2UoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqdXB3Zik7CitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZF9naXN0KAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnVwd2YsCisJX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICpjb250ZXh0KTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKgoraXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZ2lzdF9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqdXB3ZiwKKwlfX2lzbF90YWtlIGlzbF9zZXQgKmNvbnRleHQpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZF9hbGlnbl9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqdXB3ZiwKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqbW9kZWwpOworCitpbnQgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGRfZm9yZWFjaF9wd19xcG9seW5vbWlhbF9mb2xkKAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnVwd2YsCisJaW50ICgqZm4pKF9faXNsX3Rha2UgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnB3ZiwKKwkJICAgIHZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKK19faXNsX2dpdmUgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkX2V4dHJhY3RfcHdfcXBvbHlub21pYWxfZm9sZCgKKwlfX2lzbF9rZWVwIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICp1cHdmLCBfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKKworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfcHJpbnRfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCgKKwlfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnVwd2YpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfdW5pb25fcHdfcXBvbHlub21pYWxfYm91bmQoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKnVwd3FwLAorCWVudW0gaXNsX2ZvbGQgdHlwZSwgaW50ICp0aWdodCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICppc2xfdW5pb25fc2V0X2FwcGx5X3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0LAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgKnVwd2YsIGludCAqdGlnaHQpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWxfZm9sZCAqaXNsX3VuaW9uX21hcF9hcHBseV91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCwKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkICp1cHdmLCBpbnQgKnRpZ2h0KTsKKworX19pc2xfZ2l2ZSBpc2xfdW5pb25fcHdfcXBvbHlub21pYWwgKmlzbF91bmlvbl9wd19xcG9seW5vbWlhbF90b19wb2x5bm9taWFsKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsICp1cHdxcCwgaW50IHNpZ24pOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjaW5jbHVkZSA8aXNsL2RpbS5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaXNsL3BvbHlub21pYWxfdHlwZS5oIGIvaW5jbHVkZS9pc2wvcG9seW5vbWlhbF90eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0MzJiZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaXNsL3BvbHlub21pYWxfdHlwZS5oCkBAIC0wLDAgKzEsMzEgQEAKKyNpZm5kZWYgSVNMX1BPTFlOT01JQUxfVFlQRV9ICisjZGVmaW5lIElTTF9QT0xZTk9NSUFMX1RZUEVfSAorCitzdHJ1Y3QgaXNsX3Fwb2x5bm9taWFsOwordHlwZWRlZiBzdHJ1Y3QgaXNsX3Fwb2x5bm9taWFsIGlzbF9xcG9seW5vbWlhbDsKKworc3RydWN0IGlzbF90ZXJtOwordHlwZWRlZiBzdHJ1Y3QgaXNsX3Rlcm0gaXNsX3Rlcm07CisKK3N0cnVjdCBfX2lzbF9leHBvcnQgaXNsX3B3X3Fwb2x5bm9taWFsOwordHlwZWRlZiBzdHJ1Y3QgaXNsX3B3X3Fwb2x5bm9taWFsIGlzbF9wd19xcG9seW5vbWlhbDsKKworZW51bSBpc2xfZm9sZCB7CisJaXNsX2ZvbGRfbWluLAorCWlzbF9mb2xkX21heCwKKwlpc2xfZm9sZF9saXN0Cit9OworCitzdHJ1Y3QgaXNsX3Fwb2x5bm9taWFsX2ZvbGQ7Cit0eXBlZGVmIHN0cnVjdCBpc2xfcXBvbHlub21pYWxfZm9sZCBpc2xfcXBvbHlub21pYWxfZm9sZDsKKworc3RydWN0IGlzbF9wd19xcG9seW5vbWlhbF9mb2xkOwordHlwZWRlZiBzdHJ1Y3QgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQgaXNsX3B3X3Fwb2x5bm9taWFsX2ZvbGQ7CisKK3N0cnVjdCBfX2lzbF9leHBvcnQgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsOwordHlwZWRlZiBzdHJ1Y3QgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsIGlzbF91bmlvbl9wd19xcG9seW5vbWlhbDsKKworc3RydWN0IGlzbF91bmlvbl9wd19xcG9seW5vbWlhbF9mb2xkOwordHlwZWRlZiBzdHJ1Y3QgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQgaXNsX3VuaW9uX3B3X3Fwb2x5bm9taWFsX2ZvbGQ7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pc2wvcHJpbnRlci5oIGIvaW5jbHVkZS9pc2wvcHJpbnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NzlmYzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2lzbC9wcmludGVyLmgKQEAgLTAsMCArMSw2MiBAQAorI2lmbmRlZiBJU0xfUFJJTlRFUl9ICisjZGVmaW5lIElTTF9QUklOVEVSX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8aXNsL2N0eC5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBpc2xfcHJpbnRlcjsKK3R5cGVkZWYgc3RydWN0IGlzbF9wcmludGVyIGlzbF9wcmludGVyOworCitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl90b19maWxlKGlzbF9jdHggKmN0eCwgRklMRSAqZmlsZSk7CitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl90b19zdHIoaXNsX2N0eCAqY3R4KTsKK3ZvaWQgKmlzbF9wcmludGVyX2ZyZWUoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcHJpbnRlcik7CisKK2lzbF9jdHggKmlzbF9wcmludGVyX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfcHJpbnRlciAqcHJpbnRlcik7CitGSUxFICppc2xfcHJpbnRlcl9nZXRfZmlsZShfX2lzbF9rZWVwIGlzbF9wcmludGVyICpwcmludGVyKTsKKworX19pc2xfZ2l2ZSBjaGFyICppc2xfcHJpbnRlcl9nZXRfc3RyKF9faXNsX2tlZXAgaXNsX3ByaW50ZXIgKnByaW50ZXIpOworCitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9zZXRfaW5kZW50KF9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsCisJaW50IGluZGVudCk7CitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9pbmRlbnQoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwKKwlpbnQgaW5kZW50KTsKKworI2RlZmluZSBJU0xfRk9STUFUX0lTTAkJCTAKKyNkZWZpbmUgSVNMX0ZPUk1BVF9QT0xZTElCCQkxCisjZGVmaW5lIElTTF9GT1JNQVRfUE9MWUxJQl9DT05TVFJBSU5UUwkyCisjZGVmaW5lIElTTF9GT1JNQVRfT01FR0EJCTMKKyNkZWZpbmUgSVNMX0ZPUk1BVF9DCQkJNAorI2RlZmluZSBJU0xfRk9STUFUX0xBVEVYCQk1CisjZGVmaW5lIElTTF9GT1JNQVRfRVhUX1BPTFlMSUIJCTYKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3NldF9vdXRwdXRfZm9ybWF0KF9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsCisJaW50IG91dHB1dF9mb3JtYXQpOworaW50IGlzbF9wcmludGVyX2dldF9vdXRwdXRfZm9ybWF0KF9faXNsX2tlZXAgaXNsX3ByaW50ZXIgKnApOworCitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9zZXRfcHJlZml4KF9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnAsCisJY29uc3QgY2hhciAqcHJlZml4KTsKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3NldF9zdWZmaXgoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwKKwljb25zdCBjaGFyICpzdWZmaXgpOworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfc2V0X2lzbF9pbnRfd2lkdGgoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwKKwlpbnQgd2lkdGgpOworCitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9zdGFydF9saW5lKF9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnApOworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfZW5kX2xpbmUoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCk7CitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF9kb3VibGUoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwKKwlkb3VibGUgZCk7CitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF9pbnQoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwgaW50IGkpOworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfcHJpbnRfaXNsX2ludChfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLAorCWlzbF9pbnQgaSk7CitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF9zdHIoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwKKwljb25zdCBjaGFyICpzKTsKKworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfZmx1c2goX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pc2wvc2NoZWR1bGUuaCBiL2luY2x1ZGUvaXNsL3NjaGVkdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1YzZjNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaXNsL3NjaGVkdWxlLmgKQEAgLTAsMCArMSw2MiBAQAorI2lmbmRlZiBJU0xfU0NIRURVTEVfSAorI2RlZmluZSBJU0xfU0NIRURVTEVfSAorCisjaW5jbHVkZSA8aXNsL3VuaW9uX3NldF90eXBlLmg+CisjaW5jbHVkZSA8aXNsL3VuaW9uX21hcF90eXBlLmg+CisjaW5jbHVkZSA8aXNsL2JhbmQuaD4KKyNpbmNsdWRlIDxpc2wvbGlzdC5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBpc2xfc2NoZWR1bGU7Cit0eXBlZGVmIHN0cnVjdCBpc2xfc2NoZWR1bGUgaXNsX3NjaGVkdWxlOworCitpbnQgaXNsX29wdGlvbnNfc2V0X3NjaGVkdWxlX21heF9jb2VmZmljaWVudChpc2xfY3R4ICpjdHgsIGludCB2YWwpOworaW50IGlzbF9vcHRpb25zX2dldF9zY2hlZHVsZV9tYXhfY29lZmZpY2llbnQoaXNsX2N0eCAqY3R4KTsKKworaW50IGlzbF9vcHRpb25zX3NldF9zY2hlZHVsZV9tYXhfY29uc3RhbnRfdGVybShpc2xfY3R4ICpjdHgsIGludCB2YWwpOworaW50IGlzbF9vcHRpb25zX2dldF9zY2hlZHVsZV9tYXhfY29uc3RhbnRfdGVybShpc2xfY3R4ICpjdHgpOworCitpbnQgaXNsX29wdGlvbnNfc2V0X3NjaGVkdWxlX21heGltaXplX2JhbmRfZGVwdGgoaXNsX2N0eCAqY3R4LCBpbnQgdmFsKTsKK2ludCBpc2xfb3B0aW9uc19nZXRfc2NoZWR1bGVfbWF4aW1pemVfYmFuZF9kZXB0aChpc2xfY3R4ICpjdHgpOworCitpbnQgaXNsX29wdGlvbnNfc2V0X3NjaGVkdWxlX291dGVyX3plcm9fZGlzdGFuY2UoaXNsX2N0eCAqY3R4LCBpbnQgdmFsKTsKK2ludCBpc2xfb3B0aW9uc19nZXRfc2NoZWR1bGVfb3V0ZXJfemVyb19kaXN0YW5jZShpc2xfY3R4ICpjdHgpOworCitpbnQgaXNsX29wdGlvbnNfc2V0X3NjaGVkdWxlX3NwbGl0X3NjYWxlZChpc2xfY3R4ICpjdHgsIGludCB2YWwpOworaW50IGlzbF9vcHRpb25zX2dldF9zY2hlZHVsZV9zcGxpdF9zY2FsZWQoaXNsX2N0eCAqY3R4KTsKKworaW50IGlzbF9vcHRpb25zX3NldF9zY2hlZHVsZV9zZXBhcmF0ZV9jb21wb25lbnRzKGlzbF9jdHggKmN0eCwgaW50IHZhbCk7CitpbnQgaXNsX29wdGlvbnNfZ2V0X3NjaGVkdWxlX3NlcGFyYXRlX2NvbXBvbmVudHMoaXNsX2N0eCAqY3R4KTsKKworI2RlZmluZQkJSVNMX1NDSEVEVUxFX0ZVU0VfTUFYCQkJMAorI2RlZmluZQkJSVNMX1NDSEVEVUxFX0ZVU0VfTUlOCQkJMQoraW50IGlzbF9vcHRpb25zX3NldF9zY2hlZHVsZV9mdXNlKGlzbF9jdHggKmN0eCwgaW50IHZhbCk7CitpbnQgaXNsX29wdGlvbnNfZ2V0X3NjaGVkdWxlX2Z1c2UoaXNsX2N0eCAqY3R4KTsKKworX19pc2xfZ2l2ZSBpc2xfc2NoZWR1bGUgKmlzbF91bmlvbl9zZXRfY29tcHV0ZV9zY2hlZHVsZSgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKmRvbWFpbiwKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnZhbGlkaXR5LAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqcHJveGltaXR5KTsKK3ZvaWQgKmlzbF9zY2hlZHVsZV9mcmVlKF9faXNsX3Rha2UgaXNsX3NjaGVkdWxlICpzY2hlZCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF9zY2hlZHVsZV9nZXRfbWFwKF9faXNsX2tlZXAgaXNsX3NjaGVkdWxlICpzY2hlZCk7CisKK2lzbF9jdHggKmlzbF9zY2hlZHVsZV9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX3NjaGVkdWxlICpzY2hlZCk7CisKK19faXNsX2dpdmUgaXNsX2JhbmRfbGlzdCAqaXNsX3NjaGVkdWxlX2dldF9iYW5kX2ZvcmVzdCgKKwlfX2lzbF9rZWVwIGlzbF9zY2hlZHVsZSAqc2NoZWR1bGUpOworCitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF9zY2hlZHVsZShfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLAorCV9faXNsX2tlZXAgaXNsX3NjaGVkdWxlICpzY2hlZHVsZSk7Cit2b2lkIGlzbF9zY2hlZHVsZV9kdW1wKF9faXNsX2tlZXAgaXNsX3NjaGVkdWxlICpzY2hlZHVsZSk7CisKK2ludCBpc2xfc2NoZWR1bGVfZm9yZWFjaF9iYW5kKF9faXNsX2tlZXAgaXNsX3NjaGVkdWxlICpzY2hlZCwKKwlpbnQgKCpmbikoX19pc2xfa2VlcCBpc2xfYmFuZCAqYmFuZCwgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaXNsL3NlcS5oIGIvaW5jbHVkZS9pc2wvc2VxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2MzM1MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaXNsL3NlcS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEthdGhvbGlla2UgVW5pdmVyc2l0ZWl0IExldXZlbgorICoKKyAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBNSVQgbGljZW5zZQorICoKKyAqIFdyaXR0ZW4gYnkgU3ZlbiBWZXJkb29sYWVnZSwgSy5VLkxldXZlbiwgRGVwYXJ0ZW1lbnQKKyAqIENvbXB1dGVyd2V0ZW5zY2hhcHBlbiwgQ2VsZXN0aWpuZW5sYWFuIDIwMEEsIEItMzAwMSBMZXV2ZW4sIEJlbGdpdW0KKyAqLworCisjaWZuZGVmIElTTF9TRVFfSAorI2RlZmluZSBJU0xfU0VRX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGlzbC9pbnQuaD4KKyNpbmNsdWRlIDxpc2wvY3R4Lmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogU29tZSBjb21tb24gb3BlcmF0aW9ucyBvbiBzZXF1ZW5jZXMgb2YgaXNsX2ludCdzICovCisKK3ZvaWQgaXNsX3NlcV9jbHIoaXNsX2ludCAqcCwgdW5zaWduZWQgbGVuKTsKK3ZvaWQgaXNsX3NlcV9zZXQoaXNsX2ludCAqcCwgaXNsX2ludCB2LCB1bnNpZ25lZCBsZW4pOwordm9pZCBpc2xfc2VxX3NldF9zaShpc2xfaW50ICpwLCBpbnQgdiwgdW5zaWduZWQgbGVuKTsKK3ZvaWQgaXNsX3NlcV9uZWcoaXNsX2ludCAqZGF0LCBpc2xfaW50ICpzcmMsIHVuc2lnbmVkIGxlbik7Cit2b2lkIGlzbF9zZXFfY3B5KGlzbF9pbnQgKmRzdCwgaXNsX2ludCAqc3JjLCB1bnNpZ25lZCBsZW4pOwordm9pZCBpc2xfc2VxX2FkZG11bChpc2xfaW50ICpkc3QsIGlzbF9pbnQgZiwgaXNsX2ludCAqc3JjLCB1bnNpZ25lZCBsZW4pOwordm9pZCBpc2xfc2VxX3N1Ym11bChpc2xfaW50ICpkc3QsIGlzbF9pbnQgZiwgaXNsX2ludCAqc3JjLCB1bnNpZ25lZCBsZW4pOwordm9pZCBpc2xfc2VxX3N3cF9vcl9jcHkoaXNsX2ludCAqZHN0LCBpc2xfaW50ICpzcmMsIHVuc2lnbmVkIGxlbik7Cit2b2lkIGlzbF9zZXFfc2NhbGUoaXNsX2ludCAqZHN0LCBpc2xfaW50ICpzcmMsIGlzbF9pbnQgZiwgdW5zaWduZWQgbGVuKTsKK3ZvaWQgaXNsX3NlcV9zY2FsZV9kb3duKGlzbF9pbnQgKmRzdCwgaXNsX2ludCAqc3JjLCBpc2xfaW50IGYsIHVuc2lnbmVkIGxlbik7Cit2b2lkIGlzbF9zZXFfY2Rpdl9xKGlzbF9pbnQgKmRzdCwgaXNsX2ludCAqc3JjLCBpc2xfaW50IG0sIHVuc2lnbmVkIGxlbik7Cit2b2lkIGlzbF9zZXFfZmRpdl9xKGlzbF9pbnQgKmRzdCwgaXNsX2ludCAqc3JjLCBpc2xfaW50IG0sIHVuc2lnbmVkIGxlbik7Cit2b2lkIGlzbF9zZXFfZmRpdl9yKGlzbF9pbnQgKmRzdCwgaXNsX2ludCAqc3JjLCBpc2xfaW50IG0sIHVuc2lnbmVkIGxlbik7Cit2b2lkIGlzbF9zZXFfY29tYmluZShpc2xfaW50ICpkc3QsIGlzbF9pbnQgbTEsIGlzbF9pbnQgKnNyYzEsCisJCQlpc2xfaW50IG0yLCBpc2xfaW50ICpzcmMyLCB1bnNpZ25lZCBsZW4pOwordm9pZCBpc2xfc2VxX2VsaW0oaXNsX2ludCAqZHN0LCBpc2xfaW50ICpzcmMsIHVuc2lnbmVkIHBvcywgdW5zaWduZWQgbGVuLAorCQkgIGlzbF9pbnQgKm0pOwordm9pZCBpc2xfc2VxX2Fic19tYXgoaXNsX2ludCAqcCwgdW5zaWduZWQgbGVuLCBpc2xfaW50ICptYXgpOwordm9pZCBpc2xfc2VxX2djZChpc2xfaW50ICpwLCB1bnNpZ25lZCBsZW4sIGlzbF9pbnQgKmdjZCk7Cit2b2lkIGlzbF9zZXFfbGNtKGlzbF9pbnQgKnAsIHVuc2lnbmVkIGxlbiwgaXNsX2ludCAqbGNtKTsKK3ZvaWQgaXNsX3NlcV9ub3JtYWxpemUoc3RydWN0IGlzbF9jdHggKmN0eCwgaXNsX2ludCAqcCwgdW5zaWduZWQgbGVuKTsKK3ZvaWQgaXNsX3NlcV9pbm5lcl9wcm9kdWN0KGlzbF9pbnQgKnAxLCBpc2xfaW50ICpwMiwgdW5zaWduZWQgbGVuLAorCQkJICAgaXNsX2ludCAqcHJvZCk7CitpbnQgaXNsX3NlcV9maXJzdF9ub25femVybyhpc2xfaW50ICpwLCB1bnNpZ25lZCBsZW4pOworaW50IGlzbF9zZXFfbGFzdF9ub25femVybyhpc2xfaW50ICpwLCB1bnNpZ25lZCBsZW4pOworaW50IGlzbF9zZXFfYWJzX21pbl9ub25femVybyhpc2xfaW50ICpwLCB1bnNpZ25lZCBsZW4pOworaW50IGlzbF9zZXFfZXEoaXNsX2ludCAqcDEsIGlzbF9pbnQgKnAyLCB1bnNpZ25lZCBsZW4pOworaW50IGlzbF9zZXFfY21wKGlzbF9pbnQgKnAxLCBpc2xfaW50ICpwMiwgdW5zaWduZWQgbGVuKTsKK2ludCBpc2xfc2VxX2lzX25lZyhpc2xfaW50ICpwMSwgaXNsX2ludCAqcDIsIHVuc2lnbmVkIGxlbik7CisKK3VpbnQzMl90IGlzbF9zZXFfZ2V0X2hhc2goaXNsX2ludCAqcCwgdW5zaWduZWQgbGVuKTsKK3VpbnQzMl90IGlzbF9zZXFfZ2V0X2hhc2hfYml0cyhpc2xfaW50ICpwLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGJpdHMpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaXNsL3NldC5oIGIvaW5jbHVkZS9pc2wvc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2NWZlYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaXNsL3NldC5oCkBAIC0wLDAgKzEsNTM1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBLYXRob2xpZWtlIFVuaXZlcnNpdGVpdCBMZXV2ZW4KKyAqCisgKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgTUlUIGxpY2Vuc2UKKyAqCisgKiBXcml0dGVuIGJ5IFN2ZW4gVmVyZG9vbGFlZ2UsIEsuVS5MZXV2ZW4sIERlcGFydGVtZW50CisgKiBDb21wdXRlcndldGVuc2NoYXBwZW4sIENlbGVzdGlqbmVubGFhbiAyMDBBLCBCLTMwMDEgTGV1dmVuLCBCZWxnaXVtCisgKi8KKworI2lmbmRlZiBJU0xfU0VUX0gKKyNkZWZpbmUgSVNMX1NFVF9ICisKKyNpbmNsdWRlIDxpc2wvbWFwX3R5cGUuaD4KKyNpbmNsdWRlIDxpc2wvYWZmX3R5cGUuaD4KKyNpbmNsdWRlIDxpc2wvbGlzdC5oPgorI2luY2x1ZGUgPGlzbC9tYXQuaD4KKyNpbmNsdWRlIDxpc2wvcG9pbnQuaD4KKyNpbmNsdWRlIDxpc2wvbG9jYWxfc3BhY2UuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit1bnNpZ25lZCBpc2xfYmFzaWNfc2V0X25fZGltKF9faXNsX2tlZXAgaXNsX2Jhc2ljX3NldCAqYnNldCk7Cit1bnNpZ25lZCBpc2xfYmFzaWNfc2V0X25fcGFyYW0oX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK3Vuc2lnbmVkIGlzbF9iYXNpY19zZXRfdG90YWxfZGltKGNvbnN0IHN0cnVjdCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK3Vuc2lnbmVkIGlzbF9iYXNpY19zZXRfZGltKF9faXNsX2tlZXAgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwkJCQllbnVtIGlzbF9kaW1fdHlwZSB0eXBlKTsKKwordW5zaWduZWQgaXNsX3NldF9uX2RpbShfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCk7Cit1bnNpZ25lZCBpc2xfc2V0X25fcGFyYW0oX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQpOwordW5zaWduZWQgaXNsX3NldF9kaW0oX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQsIGVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworCitpc2xfY3R4ICppc2xfYmFzaWNfc2V0X2dldF9jdHgoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK2lzbF9jdHggKmlzbF9zZXRfZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX2Jhc2ljX3NldF9nZXRfc3BhY2UoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc2V0X2dldF9zcGFjZShfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfcmVzZXRfc3BhY2UoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CisKK19faXNsX2dpdmUgaXNsX2FmZiAqaXNsX2Jhc2ljX3NldF9nZXRfZGl2KF9faXNsX2tlZXAgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwlpbnQgcG9zKTsKKworX19pc2xfZ2l2ZSBpc2xfbG9jYWxfc3BhY2UgKmlzbF9iYXNpY19zZXRfZ2V0X2xvY2FsX3NwYWNlKAorCV9faXNsX2tlZXAgaXNsX2Jhc2ljX3NldCAqYnNldCk7CisKK2NvbnN0IGNoYXIgKmlzbF9iYXNpY19zZXRfZ2V0X3R1cGxlX25hbWUoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK2ludCBpc2xfc2V0X2hhc190dXBsZV9uYW1lKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0KTsKK2NvbnN0IGNoYXIgKmlzbF9zZXRfZ2V0X3R1cGxlX25hbWUoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X3NldF90dXBsZV9uYW1lKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqc2V0LCBjb25zdCBjaGFyICpzKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9zZXRfdHVwbGVfbmFtZShfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwljb25zdCBjaGFyICpzKTsKK2NvbnN0IGNoYXIgKmlzbF9iYXNpY19zZXRfZ2V0X2RpbV9uYW1lKF9faXNsX2tlZXAgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X3NldF9kaW1fbmFtZSgKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBjb25zdCBjaGFyICpzKTsKK2ludCBpc2xfc2V0X2hhc19kaW1fbmFtZShfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworY29uc3QgY2hhciAqaXNsX3NldF9nZXRfZGltX25hbWUoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9zZXRfZGltX25hbWUoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBjb25zdCBjaGFyICpzKTsKKworX19pc2xfZ2l2ZSBpc2xfaWQgKmlzbF9iYXNpY19zZXRfZ2V0X2RpbV9pZChfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9zZXRfZGltX2lkKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgX19pc2xfdGFrZSBpc2xfaWQgKmlkKTsKK2ludCBpc2xfc2V0X2hhc19kaW1faWQoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK19faXNsX2dpdmUgaXNsX2lkICppc2xfc2V0X2dldF9kaW1faWQoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9zZXRfdHVwbGVfaWQoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJX19pc2xfdGFrZSBpc2xfaWQgKmlkKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9yZXNldF90dXBsZV9pZChfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitpbnQgaXNsX3NldF9oYXNfdHVwbGVfaWQoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfaWQgKmlzbF9zZXRfZ2V0X3R1cGxlX2lkKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0KTsKKworaW50IGlzbF9zZXRfZmluZF9kaW1fYnlfaWQoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQsIGVudW0gaXNsX2RpbV90eXBlIHR5cGUsCisJX19pc2xfa2VlcCBpc2xfaWQgKmlkKTsKK2ludCBpc2xfc2V0X2ZpbmRfZGltX2J5X25hbWUoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQsIGVudW0gaXNsX2RpbV90eXBlIHR5cGUsCisJY29uc3QgY2hhciAqbmFtZSk7CisKK2ludCBpc2xfYmFzaWNfc2V0X2lzX3JhdGlvbmFsKF9faXNsX2tlZXAgaXNsX2Jhc2ljX3NldCAqYnNldCk7CisKK3N0cnVjdCBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2FsbG9jKHN0cnVjdCBpc2xfY3R4ICpjdHgsCisJCXVuc2lnbmVkIG5wYXJhbSwgdW5zaWduZWQgZGltLCB1bnNpZ25lZCBleHRyYSwKKwkJdW5zaWduZWQgbl9lcSwgdW5zaWduZWQgbl9pbmVxKTsKK3N0cnVjdCBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2V4dGVuZChzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqYmFzZSwKKwkJdW5zaWduZWQgbnBhcmFtLCB1bnNpZ25lZCBkaW0sIHVuc2lnbmVkIGV4dHJhLAorCQl1bnNpZ25lZCBuX2VxLCB1bnNpZ25lZCBuX2luZXEpOworc3RydWN0IGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfZXh0ZW5kX2NvbnN0cmFpbnRzKAorCQlzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqYmFzZSwgdW5zaWduZWQgbl9lcSwgdW5zaWduZWQgbl9pbmVxKTsKK3N0cnVjdCBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2ZpbmFsaXplKHN0cnVjdCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK3ZvaWQgKmlzbF9iYXNpY19zZXRfZnJlZShfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2NvcHkoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK3N0cnVjdCBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2R1cChzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfZW1wdHkoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9lbXB0eV9saWtlKHN0cnVjdCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF91bml2ZXJzZShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9uYXRfdW5pdmVyc2UoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF91bml2ZXJzZV9saWtlKHN0cnVjdCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF91bml2ZXJzZV9saWtlX3NldCgKKwlfX2lzbF9rZWVwIGlzbF9zZXQgKm1vZGVsKTsKK3N0cnVjdCBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2ludGVydmFsKHN0cnVjdCBpc2xfY3R4ICpjdHgsCisJaXNsX2ludCBtaW4sIGlzbF9pbnQgbWF4KTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9wb3NpdGl2ZV9vcnRoYW50KAorCV9faXNsX3Rha2UgaXNsX3NwYWNlICpzcGFjZSk7Cit2b2lkIGlzbF9iYXNpY19zZXRfcHJpbnRfaW50ZXJuYWwoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0LAorCQkJCUZJTEUgKm91dCwgaW50IGluZGVudCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9pbnRlcnNlY3QoCisJCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldDEsCisJCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldDIpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfaW50ZXJzZWN0X3BhcmFtcygKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQxLCBfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQyKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2FwcGx5KAorCQlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQsCisJCV9faXNsX3Rha2UgaXNsX2Jhc2ljX21hcCAqYm1hcCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfcHJlaW1hZ2VfbXVsdGlfYWZmKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwgX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYSk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9hZmZpbmVfaHVsbCgKKwkJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9yZW1vdmVfZGltcygKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfc2FtcGxlKF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9zaW1wbGlmeShzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9kZXRlY3RfZXF1YWxpdGllcygKKwkJCQkJCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfcmVtb3ZlX3JlZHVuZGFuY2llcygKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X3JlbW92ZV9yZWR1bmRhbmNpZXMoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2xpc3RfcHJvZHVjdCgKKwlfX2lzbF90YWtlIHN0cnVjdCBpc2xfYmFzaWNfc2V0X2xpc3QgKmxpc3QpOworCitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfcmVhZF9mcm9tX2ZpbGUoaXNsX2N0eCAqY3R4LAorCUZJTEUgKmlucHV0KTsKK19faXNsX2NvbnN0cnVjdG9yCitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfcmVhZF9mcm9tX3N0cihpc2xfY3R4ICpjdHgsCisJY29uc3QgY2hhciAqc3RyKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9yZWFkX2Zyb21fZmlsZShpc2xfY3R4ICpjdHgsIEZJTEUgKmlucHV0KTsKK19faXNsX2NvbnN0cnVjdG9yCitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfcmVhZF9mcm9tX3N0cihpc2xfY3R4ICpjdHgsIGNvbnN0IGNoYXIgKnN0cik7Cit2b2lkIGlzbF9iYXNpY19zZXRfZHVtcChfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQpOwordm9pZCBpc2xfc2V0X2R1bXAoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfcHJpbnRlciAqaXNsX3ByaW50ZXJfcHJpbnRfYmFzaWNfc2V0KAorCV9faXNsX3Rha2UgaXNsX3ByaW50ZXIgKnByaW50ZXIsIF9faXNsX2tlZXAgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF9zZXQoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcHJpbnRlciwKKwlfX2lzbF9rZWVwIGlzbF9zZXQgKm1hcCk7Cit2b2lkIGlzbF9iYXNpY19zZXRfcHJpbnQoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0LCBGSUxFICpvdXQsIGludCBpbmRlbnQsCisJY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpzdWZmaXgsIHVuc2lnbmVkIG91dHB1dF9mb3JtYXQpOwordm9pZCBpc2xfc2V0X3ByaW50KF9faXNsX2tlZXAgc3RydWN0IGlzbF9zZXQgKnNldCwgRklMRSAqb3V0LCBpbnQgaW5kZW50LAorCXVuc2lnbmVkIG91dHB1dF9mb3JtYXQpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2ZpeChfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQsCisJCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgaXNsX2ludCB2YWx1ZSk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfZml4X3NpKF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwkJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBpbnQgdmFsdWUpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2ZpeF9zaShfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwkJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBpbnQgdmFsdWUpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2xvd2VyX2JvdW5kX3NpKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCQllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGludCB2YWx1ZSk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfbG93ZXJfYm91bmQoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBpc2xfaW50IHZhbHVlKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF91cHBlcl9ib3VuZF9zaShfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIGludCB2YWx1ZSk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfdXBwZXJfYm91bmQoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCBpc2xfaW50IHZhbHVlKTsKKworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2VxdWF0ZShfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlMSwgaW50IHBvczEsIGVudW0gaXNsX2RpbV90eXBlIHR5cGUyLCBpbnQgcG9zMik7CisKK3N0cnVjdCBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2Zyb21fdW5kZXJseWluZ19zZXQoCisJc3RydWN0IGlzbF9iYXNpY19zZXQgKmJzZXQsIHN0cnVjdCBpc2xfYmFzaWNfc2V0ICpsaWtlKTsKK3N0cnVjdCBpc2xfc2V0ICppc2xfc2V0X2Zyb21fdW5kZXJseWluZ19zZXQoCisJc3RydWN0IGlzbF9zZXQgKnNldCwgc3RydWN0IGlzbF9iYXNpY19zZXQgKmxpa2UpOworc3RydWN0IGlzbF9zZXQgKmlzbF9zZXRfdG9fdW5kZXJseWluZ19zZXQoc3RydWN0IGlzbF9zZXQgKnNldCk7CisKK19faXNsX2V4cG9ydAoraW50IGlzbF9iYXNpY19zZXRfaXNfZXF1YWwoCisJCXN0cnVjdCBpc2xfYmFzaWNfc2V0ICpic2V0MSwgc3RydWN0IGlzbF9iYXNpY19zZXQgKmJzZXQyKTsKKworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfYmFzaWNfc2V0X3BhcnRpYWxfbGV4bWluKAorCQlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQsIF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqZG9tLAorCQlfX2lzbF9naXZlIGlzbF9zZXQgKiplbXB0eSk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9iYXNpY19zZXRfcGFydGlhbF9sZXhtYXgoCisJCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwgX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpkb20sCisJCV9faXNsX2dpdmUgaXNsX3NldCAqKmVtcHR5KTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9wYXJ0aWFsX2xleG1pbigKKwkJX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsIF9faXNsX3Rha2UgaXNsX3NldCAqZG9tLAorCQlfX2lzbF9naXZlIGlzbF9zZXQgKiplbXB0eSk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfcGFydGlhbF9sZXhtYXgoCisJCV9faXNsX3Rha2UgaXNsX3NldCAqc2V0LCBfX2lzbF90YWtlIGlzbF9zZXQgKmRvbSwKKwkJX19pc2xfZ2l2ZSBpc2xfc2V0ICoqZW1wdHkpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9iYXNpY19zZXRfbGV4bWluKF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX2Jhc2ljX3NldF9sZXhtYXgoX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2xleG1pbihfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9sZXhtYXgoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfcHdfbXVsdGlfYWZmICppc2xfYmFzaWNfc2V0X3BhcnRpYWxfbGV4bWluX3B3X211bHRpX2FmZigKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQsIF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqZG9tLAorCV9faXNsX2dpdmUgaXNsX3NldCAqKmVtcHR5KTsKK19faXNsX2dpdmUgaXNsX3B3X211bHRpX2FmZiAqaXNsX2Jhc2ljX3NldF9wYXJ0aWFsX2xleG1heF9wd19tdWx0aV9hZmYoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0LCBfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmRvbSwKKwlfX2lzbF9naXZlIGlzbF9zZXQgKiplbXB0eSk7CisKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfYmFzaWNfc2V0X3VuaW9uKAorCQlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQxLAorCQlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQyKTsKKworaW50IGlzbF9iYXNpY19zZXRfY29tcGFyZV9hdChzdHJ1Y3QgaXNsX2Jhc2ljX3NldCAqYnNldDEsCisJc3RydWN0IGlzbF9iYXNpY19zZXQgKmJzZXQyLCBpbnQgcG9zKTsKK2ludCBpc2xfc2V0X2ZvbGxvd3NfYXQoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQxLAorCV9faXNsX2tlZXAgaXNsX3NldCAqc2V0MiwgaW50IHBvcyk7CisKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9wYXJhbXMoX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9mcm9tX3BhcmFtcygKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X3BhcmFtcyhfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfZnJvbV9wYXJhbXMoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworCitpbnQgaXNsX2Jhc2ljX3NldF9kaW1zX2dldF9zaWduKF9faXNsX2tlZXAgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIHVuc2lnbmVkIG4sIGludCAqc2lnbnMpOworCitpbnQgaXNsX2Jhc2ljX3NldF9pc191bml2ZXJzZShfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQpOworaW50IGlzbF9iYXNpY19zZXRfcGxhaW5faXNfZW1wdHkoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK2ludCBpc2xfYmFzaWNfc2V0X2Zhc3RfaXNfZW1wdHkoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2V4cG9ydAoraW50IGlzbF9iYXNpY19zZXRfaXNfZW1wdHkoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK2ludCBpc2xfYmFzaWNfc2V0X2lzX2JvdW5kZWQoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2V4cG9ydAoraW50IGlzbF9iYXNpY19zZXRfaXNfc3Vic2V0KF9faXNsX2tlZXAgaXNsX2Jhc2ljX3NldCAqYnNldDEsCisJX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0Mik7CisKK3N0cnVjdCBpc2xfc2V0ICppc2xfc2V0X2FsbG9jKHN0cnVjdCBpc2xfY3R4ICpjdHgsCisJCXVuc2lnbmVkIG5wYXJhbSwgdW5zaWduZWQgZGltLCBpbnQgbiwgdW5zaWduZWQgZmxhZ3MpOworc3RydWN0IGlzbF9zZXQgKmlzbF9zZXRfZXh0ZW5kKHN0cnVjdCBpc2xfc2V0ICpiYXNlLAorCQl1bnNpZ25lZCBucGFyYW0sIHVuc2lnbmVkIGRpbSk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfZW1wdHkoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitzdHJ1Y3QgaXNsX3NldCAqaXNsX3NldF9lbXB0eV9saWtlKHN0cnVjdCBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X3VuaXZlcnNlKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X25hdF91bml2ZXJzZShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF91bml2ZXJzZV9saWtlKF9faXNsX2tlZXAgaXNsX3NldCAqbW9kZWwpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2FkZF9iYXNpY19zZXQoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJCQkJCQlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQpOworc3RydWN0IGlzbF9zZXQgKmlzbF9zZXRfZmluYWxpemUoc3RydWN0IGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfY29weShfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCk7Cit2b2lkICppc2xfc2V0X2ZyZWUoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworc3RydWN0IGlzbF9zZXQgKmlzbF9zZXRfZHVwKHN0cnVjdCBpc2xfc2V0ICpzZXQpOworX19pc2xfY29uc3RydWN0b3IKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9mcm9tX2Jhc2ljX3NldChfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9zZXRfc2FtcGxlKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2dpdmUgaXNsX3BvaW50ICppc2xfYmFzaWNfc2V0X3NhbXBsZV9wb2ludChfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZ2l2ZSBpc2xfcG9pbnQgKmlzbF9zZXRfc2FtcGxlX3BvaW50KF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2RldGVjdF9lcXVhbGl0aWVzKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfc2V0X2FmZmluZV9odWxsKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX3NldF9jb252ZXhfaHVsbChfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX3NldF9wb2x5aGVkcmFsX2h1bGwoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfc2V0X3NpbXBsZV9odWxsKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX3NldF91bnNoaWZ0ZWRfc2ltcGxlX2h1bGwoCisJX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworc3RydWN0IGlzbF9iYXNpY19zZXQgKmlzbF9zZXRfYm91bmRlZF9zaW1wbGVfaHVsbChzdHJ1Y3QgaXNsX3NldCAqc2V0KTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9yZWNlc3Npb25fY29uZShfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CisKK3N0cnVjdCBpc2xfc2V0ICppc2xfc2V0X3VuaW9uX2Rpc2pvaW50KAorCQkJc3RydWN0IGlzbF9zZXQgKnNldDEsIHN0cnVjdCBpc2xfc2V0ICpzZXQyKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X3VuaW9uKAorCQlfX2lzbF90YWtlIGlzbF9zZXQgKnNldDEsCisJCV9faXNsX3Rha2UgaXNsX3NldCAqc2V0Mik7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfcHJvZHVjdChfX2lzbF90YWtlIGlzbF9zZXQgKnNldDEsCisJX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQyKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9mbGF0X3Byb2R1Y3QoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0MSwgX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0Mik7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfZmxhdF9wcm9kdWN0KF9faXNsX3Rha2UgaXNsX3NldCAqc2V0MSwKKwlfX2lzbF90YWtlIGlzbF9zZXQgKnNldDIpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfaW50ZXJzZWN0KAorCQlfX2lzbF90YWtlIGlzbF9zZXQgKnNldDEsCisJCV9faXNsX3Rha2UgaXNsX3NldCAqc2V0Mik7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9pbnRlcnNlY3RfcGFyYW1zKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCQlfX2lzbF90YWtlIGlzbF9zZXQgKnBhcmFtcyk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9zdWJ0cmFjdCgKKwkJX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQxLAorCQlfX2lzbF90YWtlIGlzbF9zZXQgKnNldDIpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfY29tcGxlbWVudChfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9hcHBseSgKKwkJX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJCV9faXNsX3Rha2UgaXNsX21hcCAqbWFwKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9wcmVpbWFnZV9tdWx0aV9hZmYoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJX19pc2xfdGFrZSBpc2xfbXVsdGlfYWZmICptYSk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfcHJlaW1hZ2VfcHdfbXVsdGlfYWZmKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCV9faXNsX3Rha2UgaXNsX3B3X211bHRpX2FmZiAqcG1hKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9maXgoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgaXNsX2ludCB2YWx1ZSk7CitzdHJ1Y3QgaXNsX3NldCAqaXNsX3NldF9maXhfZGltX3NpKHN0cnVjdCBpc2xfc2V0ICpzZXQsCisJCXVuc2lnbmVkIGRpbSwgaW50IHZhbHVlKTsKK3N0cnVjdCBpc2xfc2V0ICppc2xfc2V0X2xvd2VyX2JvdW5kX2RpbShzdHJ1Y3QgaXNsX3NldCAqc2V0LAorCQl1bnNpZ25lZCBkaW0sIGlzbF9pbnQgdmFsdWUpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2luc2VydF9kaW1zKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2luc2VydF9kaW1zKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCQllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2FkZF9kaW1zKF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwkJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgbik7CisvKiBkZXByZWNhdGVkICovCitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfYWRkKF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9hZGRfZGltcyhfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwkJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfbW92ZV9kaW1zKF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSBkc3RfdHlwZSwgdW5zaWduZWQgZHN0X3BvcywKKwllbnVtIGlzbF9kaW1fdHlwZSBzcmNfdHlwZSwgdW5zaWduZWQgc3JjX3BvcywgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfbW92ZV9kaW1zKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCWVudW0gaXNsX2RpbV90eXBlIGRzdF90eXBlLCB1bnNpZ25lZCBkc3RfcG9zLAorCWVudW0gaXNsX2RpbV90eXBlIHNyY190eXBlLCB1bnNpZ25lZCBzcmNfcG9zLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9wcm9qZWN0X291dCgKKwkJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0LAorCQllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfcHJvamVjdF9vdXQoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9yZW1vdmVfZGl2cygKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2VsaW1pbmF0ZSgKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2VsaW1pbmF0ZShfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitzdHJ1Y3QgaXNsX3NldCAqaXNsX3NldF9lbGltaW5hdGVfZGltcyhzdHJ1Y3QgaXNsX3NldCAqc2V0LAorCQl1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfcmVtb3ZlX2RpbXMoX19pc2xfdGFrZSBpc2xfc2V0ICpic2V0LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9yZW1vdmVfZGl2c19pbnZvbHZpbmdfZGltcygKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X3JlbW92ZV9kaXZzX2ludm9sdmluZ19kaW1zKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9yZW1vdmVfdW5rbm93bl9kaXZzKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfcmVtb3ZlX3Vua25vd25fZGl2cyhfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfcmVtb3ZlX2RpdnMoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X3NwbGl0X2RpbXMoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworCitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfZHJvcF9jb25zdHJhaW50c19pbnZvbHZpbmdfZGltcygKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2Ryb3BfY29uc3RyYWludHNfbm90X2ludm9sdmluZ19kaW1zKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfZHJvcF9jb25zdHJhaW50c19pbnZvbHZpbmdfZGltcygKKwlfX2lzbF90YWtlIGlzbF9zZXQgKnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CisKK2ludCBpc2xfYmFzaWNfc2V0X2ludm9sdmVzX2RpbXMoX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBuKTsKK2ludCBpc2xfc2V0X2ludm9sdmVzX2RpbXMoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgZmlyc3QsIHVuc2lnbmVkIG4pOworCit2b2lkIGlzbF9zZXRfcHJpbnRfaW50ZXJuYWwoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQsIEZJTEUgKm91dCwgaW50IGluZGVudCk7CitpbnQgaXNsX3NldF9wbGFpbl9pc19lbXB0eShfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCk7CitpbnQgaXNsX3NldF9mYXN0X2lzX2VtcHR5KF9faXNsX2tlZXAgaXNsX3NldCAqc2V0KTsKK2ludCBpc2xfc2V0X3BsYWluX2lzX3VuaXZlcnNlKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0KTsKK2ludCBpc2xfc2V0X2Zhc3RfaXNfdW5pdmVyc2UoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQpOworaW50IGlzbF9zZXRfaXNfcGFyYW1zKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0KTsKK19faXNsX2V4cG9ydAoraW50IGlzbF9zZXRfaXNfZW1wdHkoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQpOworaW50IGlzbF9zZXRfaXNfYm91bmRlZChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCk7CitfX2lzbF9leHBvcnQKK2ludCBpc2xfc2V0X2lzX3N1YnNldChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldDEsIF9faXNsX2tlZXAgaXNsX3NldCAqc2V0Mik7CitfX2lzbF9leHBvcnQKK2ludCBpc2xfc2V0X2lzX3N0cmljdF9zdWJzZXQoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQxLCBfX2lzbF9rZWVwIGlzbF9zZXQgKnNldDIpOworX19pc2xfZXhwb3J0CitpbnQgaXNsX3NldF9pc19lcXVhbChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldDEsIF9faXNsX2tlZXAgaXNsX3NldCAqc2V0Mik7CitfX2lzbF9leHBvcnQKK2ludCBpc2xfc2V0X2lzX2Rpc2pvaW50KF9faXNsX2tlZXAgaXNsX3NldCAqc2V0MSwgX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQyKTsKK2ludCBpc2xfc2V0X2lzX3NpbmdsZXRvbihfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCk7CitpbnQgaXNsX3NldF9pc19ib3goX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQpOworaW50IGlzbF9zZXRfaGFzX2VxdWFsX3NwYWNlKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0MSwgX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQyKTsKKworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X3N1bShfX2lzbF90YWtlIGlzbF9zZXQgKnNldDEsCisJX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQyKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9uZWcoX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9uZWcoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworCitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfbWFrZV9kaXNqb2ludChfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitzdHJ1Y3QgaXNsX3NldCAqaXNsX2Jhc2ljX3NldF9jb21wdXRlX2RpdnMoc3RydWN0IGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2NvbXB1dGVfZGl2cyhfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfYWxpZ25fZGl2cyhfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CisKK3N0cnVjdCBpc2xfYmFzaWNfc2V0ICppc2xfc2V0X2NvcHlfYmFzaWNfc2V0KHN0cnVjdCBpc2xfc2V0ICpzZXQpOworc3RydWN0IGlzbF9zZXQgKmlzbF9zZXRfZHJvcF9iYXNpY19zZXQoc3RydWN0IGlzbF9zZXQgKnNldCwKKwkJCQkJCXN0cnVjdCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKKworaW50IGlzbF9iYXNpY19zZXRfcGxhaW5fZGltX2lzX2ZpeGVkKF9faXNsX2tlZXAgaXNsX2Jhc2ljX3NldCAqYnNldCwKKwl1bnNpZ25lZCBkaW0sIGlzbF9pbnQgKnZhbCk7CisKK2ludCBpc2xfc2V0X3BsYWluX2lzX2ZpeGVkKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywgaXNsX2ludCAqdmFsKTsKK2ludCBpc2xfc2V0X3BsYWluX2RpbV9pc19maXhlZChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCwKKwl1bnNpZ25lZCBkaW0sIGlzbF9pbnQgKnZhbCk7CitpbnQgaXNsX3NldF9mYXN0X2RpbV9pc19maXhlZChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCwKKwl1bnNpZ25lZCBkaW0sIGlzbF9pbnQgKnZhbCk7CitpbnQgaXNsX3NldF9wbGFpbl9kaW1faGFzX2ZpeGVkX2xvd2VyX2JvdW5kKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0LAorCXVuc2lnbmVkIGRpbSwgaXNsX2ludCAqdmFsKTsKK2ludCBpc2xfc2V0X2RpbV9pc19ib3VuZGVkKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CitpbnQgaXNsX3NldF9kaW1faGFzX2xvd2VyX2JvdW5kKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CitpbnQgaXNsX3NldF9kaW1faGFzX3VwcGVyX2JvdW5kKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0LAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcyk7CitpbnQgaXNsX3NldF9kaW1faGFzX2FueV9sb3dlcl9ib3VuZChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworaW50IGlzbF9zZXRfZGltX2hhc19hbnlfdXBwZXJfYm91bmQoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKKworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfZ2lzdChfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQsCisJCQkJCSAgICBfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmNvbnRleHQpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2dpc3RfYmFzaWNfc2V0KF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqY29udGV4dCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9naXN0KF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LAorCV9faXNsX3Rha2UgaXNsX3NldCAqY29udGV4dCk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfZ2lzdF9wYXJhbXMoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJX19pc2xfdGFrZSBpc2xfc2V0ICpjb250ZXh0KTsKK2ludCBpc2xfYmFzaWNfc2V0X2RpbV9yZXNpZHVlX2NsYXNzKHN0cnVjdCBpc2xfYmFzaWNfc2V0ICpic2V0LAorCWludCBwb3MsIGlzbF9pbnQgKm1vZHVsbywgaXNsX2ludCAqcmVzaWR1ZSk7CitpbnQgaXNsX3NldF9kaW1fcmVzaWR1ZV9jbGFzcyhzdHJ1Y3QgaXNsX3NldCAqc2V0LAorCWludCBwb3MsIGlzbF9pbnQgKm1vZHVsbywgaXNsX2ludCAqcmVzaWR1ZSk7CisKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2NvYWxlc2NlKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKKworaW50IGlzbF9zZXRfcGxhaW5fY21wKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0MSwgX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQyKTsKK2ludCBpc2xfc2V0X3BsYWluX2lzX2VxdWFsKF9faXNsX2tlZXAgaXNsX3NldCAqc2V0MSwgX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQyKTsKK2ludCBpc2xfc2V0X2Zhc3RfaXNfZXF1YWwoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQxLCBfX2lzbF9rZWVwIGlzbF9zZXQgKnNldDIpOworaW50IGlzbF9zZXRfcGxhaW5faXNfZGlzam9pbnQoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQxLAorCV9faXNsX2tlZXAgaXNsX3NldCAqc2V0Mik7CitpbnQgaXNsX3NldF9mYXN0X2lzX2Rpc2pvaW50KF9faXNsX2tlZXAgaXNsX3NldCAqc2V0MSwKKwlfX2lzbF9rZWVwIGlzbF9zZXQgKnNldDIpOworCit1aW50MzJfdCBpc2xfc2V0X2dldF9oYXNoKHN0cnVjdCBpc2xfc2V0ICpzZXQpOworCitpbnQgaXNsX3NldF9kaW1faXNfdW5pcXVlKHN0cnVjdCBpc2xfc2V0ICpzZXQsIHVuc2lnbmVkIGRpbSk7CisKK2ludCBpc2xfc2V0X25fYmFzaWNfc2V0KF9faXNsX2tlZXAgaXNsX3NldCAqc2V0KTsKK19faXNsX2V4cG9ydAoraW50IGlzbF9zZXRfZm9yZWFjaF9iYXNpY19zZXQoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQsCisJaW50ICgqZm4pKF9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOworCitpbnQgaXNsX3NldF9mb3JlYWNoX3BvaW50KF9faXNsX2tlZXAgaXNsX3NldCAqc2V0LAorCWludCAoKmZuKShfX2lzbF90YWtlIGlzbF9wb2ludCAqcG50LCB2b2lkICp1c2VyKSwgdm9pZCAqdXNlcik7CitpbnQgaXNsX3NldF9jb3VudChfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCwgaXNsX2ludCAqY291bnQpOworaW50IGlzbF9iYXNpY19zZXRfY291bnRfdXB0byhfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQsCisJaXNsX2ludCBtYXgsIGlzbF9pbnQgKmNvdW50KTsKK2ludCBpc2xfc2V0X2NvdW50X3VwdG8oX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQsIGlzbF9pbnQgbWF4LCBpc2xfaW50ICpjb3VudCk7CisKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9mcm9tX3BvaW50KF9faXNsX3Rha2UgaXNsX3BvaW50ICpwbnQpOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfc2V0X2Zyb21fcG9pbnQoX19pc2xfdGFrZSBpc2xfcG9pbnQgKnBudCk7CitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfYm94X2Zyb21fcG9pbnRzKAorCV9faXNsX3Rha2UgaXNsX3BvaW50ICpwbnQxLCBfX2lzbF90YWtlIGlzbF9wb2ludCAqcG50Mik7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zZXRfYm94X2Zyb21fcG9pbnRzKF9faXNsX3Rha2UgaXNsX3BvaW50ICpwbnQxLAorCV9faXNsX3Rha2UgaXNsX3BvaW50ICpwbnQyKTsKKworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2xpZnQoX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9saWZ0KF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKKworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfc2V0X2xleF9sZV9zZXQoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQxLAorCV9faXNsX3Rha2UgaXNsX3NldCAqc2V0Mik7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9zZXRfbGV4X2x0X3NldChfX2lzbF90YWtlIGlzbF9zZXQgKnNldDEsCisJX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQyKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX3NldF9sZXhfZ2Vfc2V0KF9faXNsX3Rha2UgaXNsX3NldCAqc2V0MSwKKwlfX2lzbF90YWtlIGlzbF9zZXQgKnNldDIpOworX19pc2xfZ2l2ZSBpc2xfbWFwICppc2xfc2V0X2xleF9ndF9zZXQoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQxLAorCV9faXNsX3Rha2UgaXNsX3NldCAqc2V0Mik7CisKK2ludCBpc2xfc2V0X3NpemUoX19pc2xfa2VlcCBpc2xfc2V0ICpzZXQpOworCitfX2lzbF9naXZlIGlzbF9iYXNpY19zZXQgKmlzbF9iYXNpY19zZXRfYWxpZ25fcGFyYW1zKAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCwgX19pc2xfdGFrZSBpc2xfc3BhY2UgKm1vZGVsKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9hbGlnbl9wYXJhbXMoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKm1vZGVsKTsKKworX19pc2xfZ2l2ZSBpc2xfbWF0ICppc2xfYmFzaWNfc2V0X2VxdWFsaXRpZXNfbWF0cml4KAorCV9faXNsX2tlZXAgaXNsX2Jhc2ljX3NldCAqYnNldCwgZW51bSBpc2xfZGltX3R5cGUgYzEsCisJZW51bSBpc2xfZGltX3R5cGUgYzIsIGVudW0gaXNsX2RpbV90eXBlIGMzLCBlbnVtIGlzbF9kaW1fdHlwZSBjNCk7CitfX2lzbF9naXZlIGlzbF9tYXQgKmlzbF9iYXNpY19zZXRfaW5lcXVhbGl0aWVzX21hdHJpeCgKKwlfX2lzbF9rZWVwIGlzbF9iYXNpY19zZXQgKmJzZXQsIGVudW0gaXNsX2RpbV90eXBlIGMxLAorCWVudW0gaXNsX2RpbV90eXBlIGMyLCBlbnVtIGlzbF9kaW1fdHlwZSBjMywgZW51bSBpc2xfZGltX3R5cGUgYzQpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X2Zyb21fY29uc3RyYWludF9tYXRyaWNlcygKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLAorCV9faXNsX3Rha2UgaXNsX21hdCAqZXEsIF9faXNsX3Rha2UgaXNsX21hdCAqaW5lcSwgZW51bSBpc2xfZGltX3R5cGUgYzEsCisJZW51bSBpc2xfZGltX3R5cGUgYzIsIGVudW0gaXNsX2RpbV90eXBlIGMzLCBlbnVtIGlzbF9kaW1fdHlwZSBjNCk7CisKK19faXNsX2dpdmUgaXNsX21hdCAqaXNsX2Jhc2ljX3NldF9yZWR1Y2VkX2Jhc2lzKF9faXNsX2tlZXAgaXNsX2Jhc2ljX3NldCAqYnNldCk7CisKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2Jhc2ljX3NldF9jb2VmZmljaWVudHMoCisJX19pc2xfdGFrZSBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX3NldF9jb2VmZmljaWVudHMoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfYmFzaWNfc2V0X3NvbHV0aW9ucygKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19zZXQgKmJzZXQpOworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfc2V0X3NvbHV0aW9ucyhfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CisKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3NldF9kaW1fbWF4KF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LCBpbnQgcG9zKTsKK19faXNsX2dpdmUgaXNsX3B3X2FmZiAqaXNsX3NldF9kaW1fbWluKF9faXNsX3Rha2UgaXNsX3NldCAqc2V0LCBpbnQgcG9zKTsKKworX19pc2xfZ2l2ZSBjaGFyICppc2xfc2V0X3RvX3N0cihfX2lzbF9rZWVwIGlzbF9zZXQgKnNldCk7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNpbmNsdWRlIDxpc2wvZGltLmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pc2wvc2V0X3R5cGUuaCBiL2luY2x1ZGUvaXNsL3NldF90eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzNDllMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaXNsL3NldF90eXBlLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIElTTF9TRVRfVFlQRV9ICisjZGVmaW5lIElTTF9TRVRfVFlQRV9ICisKKyNpbmNsdWRlIDxpc2wvbWFwX3R5cGUuaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2lzbC9zcGFjZS5oIGIvaW5jbHVkZS9pc2wvc3BhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2U0MTAyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9pc2wvc3BhY2UuaApAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgS2F0aG9saWVrZSBVbml2ZXJzaXRlaXQgTGV1dmVuCisgKgorICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIE1JVCBsaWNlbnNlCisgKgorICogV3JpdHRlbiBieSBTdmVuIFZlcmRvb2xhZWdlLCBLLlUuTGV1dmVuLCBEZXBhcnRlbWVudAorICogQ29tcHV0ZXJ3ZXRlbnNjaGFwcGVuLCBDZWxlc3Rpam5lbmxhYW4gMjAwQSwgQi0zMDAxIExldXZlbiwgQmVsZ2l1bQorICovCisKKyNpZm5kZWYgSVNMX1NQQUNFX0gKKyNkZWZpbmUgSVNMX1NQQUNFX0gKKworI2luY2x1ZGUgPGlzbC9jdHguaD4KKyNpbmNsdWRlIDxpc2wvaWQuaD4KKyNpbmNsdWRlIDxpc2wvcHJpbnRlci5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBpc2xfc3BhY2U7Cit0eXBlZGVmIHN0cnVjdCBpc2xfc3BhY2UgaXNsX3NwYWNlOworCitlbnVtIGlzbF9kaW1fdHlwZSB7CisJaXNsX2RpbV9jc3QsCisJaXNsX2RpbV9wYXJhbSwKKwlpc2xfZGltX2luLAorCWlzbF9kaW1fb3V0LAorCWlzbF9kaW1fc2V0ID0gaXNsX2RpbV9vdXQsCisJaXNsX2RpbV9kaXYsCisJaXNsX2RpbV9hbGwKK307CisKK2lzbF9jdHggKmlzbF9zcGFjZV9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV9hbGxvYyhpc2xfY3R4ICpjdHgsCisJCQl1bnNpZ25lZCBucGFyYW0sIHVuc2lnbmVkIG5faW4sIHVuc2lnbmVkIG5fb3V0KTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2Vfc2V0X2FsbG9jKGlzbF9jdHggKmN0eCwKKwkJCXVuc2lnbmVkIG5wYXJhbSwgdW5zaWduZWQgZGltKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2VfcGFyYW1zX2FsbG9jKGlzbF9jdHggKmN0eCwgdW5zaWduZWQgbnBhcmFtKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2VfY29weShfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltKTsKK3ZvaWQgKmlzbF9zcGFjZV9mcmVlKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworCitpbnQgaXNsX3NwYWNlX2lzX3BhcmFtcyhfX2lzbF9rZWVwIGlzbF9zcGFjZSAqc3BhY2UpOworaW50IGlzbF9zcGFjZV9pc19zZXQoX19pc2xfa2VlcCBpc2xfc3BhY2UgKnNwYWNlKTsKK2ludCBpc2xfc3BhY2VfaXNfbWFwKF9faXNsX2tlZXAgaXNsX3NwYWNlICpzcGFjZSk7CisKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2Vfc2V0X3R1cGxlX25hbWUoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBjb25zdCBjaGFyICpzKTsKK2ludCBpc2xfc3BhY2VfaGFzX3R1cGxlX25hbWUoX19pc2xfa2VlcCBpc2xfc3BhY2UgKnNwYWNlLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworY29uc3QgY2hhciAqaXNsX3NwYWNlX2dldF90dXBsZV9uYW1lKF9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0sCisJCQkJIGVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV9zZXRfdHVwbGVfaWQoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCBfX2lzbF90YWtlIGlzbF9pZCAqaWQpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV9yZXNldF90dXBsZV9pZChfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworaW50IGlzbF9zcGFjZV9oYXNfdHVwbGVfaWQoX19pc2xfa2VlcCBpc2xfc3BhY2UgKmRpbSwgZW51bSBpc2xfZGltX3R5cGUgdHlwZSk7CitfX2lzbF9naXZlIGlzbF9pZCAqaXNsX3NwYWNlX2dldF90dXBsZV9pZChfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworCitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX3NldF9kaW1faWQoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MsIF9faXNsX3Rha2UgaXNsX2lkICppZCk7CitpbnQgaXNsX3NwYWNlX2hhc19kaW1faWQoX19pc2xfa2VlcCBpc2xfc3BhY2UgKmRpbSwKKwllbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworX19pc2xfZ2l2ZSBpc2xfaWQgKmlzbF9zcGFjZV9nZXRfZGltX2lkKF9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0sCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKKworaW50IGlzbF9zcGFjZV9maW5kX2RpbV9ieV9pZChfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltLCBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlLAorCV9faXNsX2tlZXAgaXNsX2lkICppZCk7CitpbnQgaXNsX3NwYWNlX2ZpbmRfZGltX2J5X25hbWUoX19pc2xfa2VlcCBpc2xfc3BhY2UgKnNwYWNlLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIGNvbnN0IGNoYXIgKm5hbWUpOworCitpbnQgaXNsX3NwYWNlX2hhc19kaW1fbmFtZShfX2lzbF9rZWVwIGlzbF9zcGFjZSAqc3BhY2UsCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2Vfc2V0X2RpbV9uYW1lKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sCisJCQkJIGVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIHBvcywKKwkJCQkgX19pc2xfa2VlcCBjb25zdCBjaGFyICpuYW1lKTsKK19faXNsX2tlZXAgY29uc3QgY2hhciAqaXNsX3NwYWNlX2dldF9kaW1fbmFtZShfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltLAorCQkJCSBlbnVtIGlzbF9kaW1fdHlwZSB0eXBlLCB1bnNpZ25lZCBwb3MpOworCitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX2V4dGVuZChfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLAorCQkJdW5zaWduZWQgbnBhcmFtLCB1bnNpZ25lZCBuX2luLCB1bnNpZ25lZCBuX291dCk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX2FkZF9kaW1zKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sIGVudW0gaXNsX2RpbV90eXBlIHR5cGUsCisJCXVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV9tb3ZlX2RpbXMoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSwKKwllbnVtIGlzbF9kaW1fdHlwZSBkc3RfdHlwZSwgdW5zaWduZWQgZHN0X3BvcywKKwllbnVtIGlzbF9kaW1fdHlwZSBzcmNfdHlwZSwgdW5zaWduZWQgc3JjX3BvcywgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX2luc2VydF9kaW1zKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0sCisJZW51bSBpc2xfZGltX3R5cGUgdHlwZSwgdW5zaWduZWQgcG9zLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2Vfam9pbihfX2lzbF90YWtlIGlzbF9zcGFjZSAqbGVmdCwKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqcmlnaHQpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV9wcm9kdWN0KF9faXNsX3Rha2UgaXNsX3NwYWNlICpsZWZ0LAorCV9faXNsX3Rha2UgaXNsX3NwYWNlICpyaWdodCk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX2RvbWFpbl9wcm9kdWN0KF9faXNsX3Rha2UgaXNsX3NwYWNlICpsZWZ0LAorCV9faXNsX3Rha2UgaXNsX3NwYWNlICpyaWdodCk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX3JhbmdlX3Byb2R1Y3QoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmxlZnQsCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKnJpZ2h0KTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2VfbWFwX2Zyb21fc2V0KF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV9tYXBfZnJvbV9kb21haW5fYW5kX3JhbmdlKAorCV9faXNsX3Rha2UgaXNsX3NwYWNlICpkb21haW4sIF9faXNsX3Rha2UgaXNsX3NwYWNlICpyYW5nZSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX3JldmVyc2UoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX2Ryb3BfZGltcyhfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLAorCWVudW0gaXNsX2RpbV90eXBlIHR5cGUsIHVuc2lnbmVkIGZpcnN0LCB1bnNpZ25lZCBudW0pOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV9kcm9wX2lucHV0cyhfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLAorCQl1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX2Ryb3Bfb3V0cHV0cyhfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltLAorCQl1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbik7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX2RvbWFpbihfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2VfZnJvbV9kb21haW4oX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX3JhbmdlKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV9mcm9tX3JhbmdlKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV9wYXJhbXMoX19pc2xfdGFrZSBpc2xfc3BhY2UgKnNwYWNlKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2Vfc2V0X2Zyb21fcGFyYW1zKF9faXNsX3Rha2UgaXNsX3NwYWNlICpzcGFjZSk7CisKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2VfYWxpZ25fcGFyYW1zKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0xLAorCV9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0yKTsKKworaW50IGlzbF9zcGFjZV9pc193cmFwcGluZyhfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2Vfd3JhcChfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2VfdW53cmFwKF9faXNsX3Rha2UgaXNsX3NwYWNlICpkaW0pOworCitpbnQgaXNsX3NwYWNlX2Nhbl96aXAoX19pc2xfa2VlcCBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3NwYWNlX3ppcChfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKKworaW50IGlzbF9zcGFjZV9jYW5fY3VycnkoX19pc2xfa2VlcCBpc2xfc3BhY2UgKnNwYWNlKTsKK19faXNsX2dpdmUgaXNsX3NwYWNlICppc2xfc3BhY2VfY3VycnkoX19pc2xfdGFrZSBpc2xfc3BhY2UgKnNwYWNlKTsKKworaW50IGlzbF9zcGFjZV9jYW5fdW5jdXJyeShfX2lzbF9rZWVwIGlzbF9zcGFjZSAqc3BhY2UpOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF9zcGFjZV91bmN1cnJ5KF9faXNsX3Rha2UgaXNsX3NwYWNlICpzcGFjZSk7CisKK2ludCBpc2xfc3BhY2VfaXNfZG9tYWluKF9faXNsX2tlZXAgaXNsX3NwYWNlICpzcGFjZTEsCisJX19pc2xfa2VlcCBpc2xfc3BhY2UgKnNwYWNlMik7CitpbnQgaXNsX3NwYWNlX2lzX3JhbmdlKF9faXNsX2tlZXAgaXNsX3NwYWNlICpzcGFjZTEsCisJX19pc2xfa2VlcCBpc2xfc3BhY2UgKnNwYWNlMik7CitpbnQgaXNsX3NwYWNlX2lzX2VxdWFsKF9faXNsX2tlZXAgaXNsX3NwYWNlICpzcGFjZTEsCisJX19pc2xfa2VlcCBpc2xfc3BhY2UgKnNwYWNlMik7CitpbnQgaXNsX3NwYWNlX21hdGNoKF9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0xLCBlbnVtIGlzbF9kaW1fdHlwZSBkaW0xX3R5cGUsCisJX19pc2xfa2VlcCBpc2xfc3BhY2UgKmRpbTIsIGVudW0gaXNsX2RpbV90eXBlIGRpbTJfdHlwZSk7CitpbnQgaXNsX3NwYWNlX3R1cGxlX21hdGNoKF9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0xLCBlbnVtIGlzbF9kaW1fdHlwZSBkaW0xX3R5cGUsCisJCQlfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltMiwgZW51bSBpc2xfZGltX3R5cGUgZGltMl90eXBlKTsKK2ludCBpc2xfc3BhY2VfY29tcGF0aWJsZShfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltMSwKKwlfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltMik7Cit1bnNpZ25lZCBpc2xfc3BhY2VfZGltKF9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0sIGVudW0gaXNsX2RpbV90eXBlIHR5cGUpOworCitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF9zcGFjZShfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLAorCV9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0pOwordm9pZCBpc2xfc3BhY2VfZHVtcChfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2lzbC9zdGRpbnQuaCBiL2luY2x1ZGUvaXNsL3N0ZGludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YjgwZDUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2lzbC9zdGRpbnQuaApAQCAtMCwwICsxLDkgQEAKKyNpZm5kZWYgX0lTTF9JTkNMVURFX0lTTF9TVERJTlRfSAorI2RlZmluZSBfSVNMX0lOQ0xVREVfSVNMX1NURElOVF9IIDEKKyNpZm5kZWYgX0dFTkVSQVRFRF9TVERJTlRfSAorI2RlZmluZSBfR0VORVJBVEVEX1NURElOVF9IICJpc2wgMC4xMS4xIgorLyogZ2VuZXJhdGVkIHVzaW5nIGdudSBjb21waWxlciB4ODZfNjQtbGludXgtZ2NjIChHQ0MpIDQuOCAqLworI2RlZmluZSBfU1RESU5UX0hBVkVfU1RESU5UX0ggMQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaXNsL3N0cmVhbS5oIGIvaW5jbHVkZS9pc2wvc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcwNmJjZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaXNsL3N0cmVhbS5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBLYXRob2xpZWtlIFVuaXZlcnNpdGVpdCBMZXV2ZW4KKyAqCisgKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgTUlUIGxpY2Vuc2UKKyAqCisgKiBXcml0dGVuIGJ5IFN2ZW4gVmVyZG9vbGFlZ2UsIEsuVS5MZXV2ZW4sIERlcGFydGVtZW50CisgKiBDb21wdXRlcndldGVuc2NoYXBwZW4sIENlbGVzdGlqbmVubGFhbiAyMDBBLCBCLTMwMDEgTGV1dmVuLCBCZWxnaXVtCisgKi8KKworI2lmbmRlZiBJU0xfU1RSRUFNX0gKKyNkZWZpbmUgSVNMX1NUUkVBTV9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGlzbC9oYXNoLmg+CisjaW5jbHVkZSA8aXNsL2FmZl90eXBlLmg+CisjaW5jbHVkZSA8aXNsL29iai5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2VudW0gaXNsX3Rva2VuX3R5cGUgeyBJU0xfVE9LRU5fRVJST1IgPSAtMSwKKwkJCUlTTF9UT0tFTl9VTktOT1dOID0gMjU2LCBJU0xfVE9LRU5fVkFMVUUsCisJCQlJU0xfVE9LRU5fSURFTlQsIElTTF9UT0tFTl9HRSwKKwkJCUlTTF9UT0tFTl9MRSwgSVNMX1RPS0VOX0dULCBJU0xfVE9LRU5fTFQsCisJCQlJU0xfVE9LRU5fTkUsIElTTF9UT0tFTl9FUV9FUSwKKwkJCUlTTF9UT0tFTl9MRVhfR0UsIElTTF9UT0tFTl9MRVhfTEUsCisJCQlJU0xfVE9LRU5fTEVYX0dULCBJU0xfVE9LRU5fTEVYX0xULAorCQkJSVNMX1RPS0VOX1RPLCBJU0xfVE9LRU5fQU5ELAorCQkJSVNMX1RPS0VOX09SLCBJU0xfVE9LRU5fRVhJU1RTLCBJU0xfVE9LRU5fTk9ULAorCQkJSVNMX1RPS0VOX0RFRiwgSVNMX1RPS0VOX0lORlRZLCBJU0xfVE9LRU5fTkFOLAorCQkJSVNMX1RPS0VOX01JTiwgSVNMX1RPS0VOX01BWCwgSVNMX1RPS0VOX1JBVCwKKwkJCUlTTF9UT0tFTl9UUlVFLCBJU0xfVE9LRU5fRkFMU0UsCisJCQlJU0xfVE9LRU5fQ0VJTEQsIElTTF9UT0tFTl9GTE9PUkQsIElTTF9UT0tFTl9NT0QsCisJCQlJU0xfVE9LRU5fU1RSSU5HLAorCQkJSVNMX1RPS0VOX01BUCwgSVNMX1RPS0VOX0FGRiwKKwkJCUlTTF9UT0tFTl9MQVNUIH07CisKK3N0cnVjdCBpc2xfdG9rZW4geworCWludCB0eXBlOworCisJdW5zaWduZWQgaW50IG9uX25ld19saW5lIDogMTsKKwl1bnNpZ25lZCBpc19rZXl3b3JkIDogMTsKKwlpbnQgbGluZTsKKwlpbnQgY29sOworCisJdW5pb24geworCQlpc2xfaW50CXY7CisJCWNoYXIJKnM7CisJCWlzbF9tYXAgKm1hcDsKKwkJaXNsX3B3X2FmZiAqcHdhZmY7CisJfSB1OworfTsKKwordm9pZCBpc2xfdG9rZW5fZnJlZShzdHJ1Y3QgaXNsX3Rva2VuICp0b2spOworCitzdHJ1Y3QgaXNsX3N0cmVhbSB7CisJc3RydWN0IGlzbF9jdHgJKmN0eDsKKwlGSUxFICAgICAgICAJKmZpbGU7CisJY29uc3QgY2hhciAgCSpzdHI7CisJaW50CSAgICAJbGluZTsKKwlpbnQJICAgIAljb2w7CisJaW50CSAgICAJZW9mOworCisJY2hhcgkgICAgCSpidWZmZXI7CisJc2l6ZV90CSAgICAJc2l6ZTsKKwlzaXplX3QJICAgIAlsZW47CisJaW50CSAgICAJYzsKKwlpbnQJCXVuWzVdOworCWludAkJbl91bjsKKworCXN0cnVjdCBpc2xfdG9rZW4JKnRva2Vuc1s1XTsKKwlpbnQJICAgIAluX3Rva2VuOworCisJc3RydWN0IGlzbF9oYXNoX3RhYmxlCSprZXl3b3JkczsKKwllbnVtIGlzbF90b2tlbl90eXBlCSBuZXh0X3R5cGU7Cit9OworCitzdHJ1Y3QgaXNsX3N0cmVhbSogaXNsX3N0cmVhbV9uZXdfZmlsZShzdHJ1Y3QgaXNsX2N0eCAqY3R4LCBGSUxFICpmaWxlKTsKK3N0cnVjdCBpc2xfc3RyZWFtKiBpc2xfc3RyZWFtX25ld19zdHIoc3RydWN0IGlzbF9jdHggKmN0eCwgY29uc3QgY2hhciAqc3RyKTsKK3ZvaWQgaXNsX3N0cmVhbV9mcmVlKHN0cnVjdCBpc2xfc3RyZWFtICpzKTsKKwordm9pZCBpc2xfc3RyZWFtX2Vycm9yKHN0cnVjdCBpc2xfc3RyZWFtICpzLCBzdHJ1Y3QgaXNsX3Rva2VuICp0b2ssIGNoYXIgKm1zZyk7CisKK3N0cnVjdCBpc2xfdG9rZW4gKmlzbF9zdHJlYW1fbmV4dF90b2tlbihzdHJ1Y3QgaXNsX3N0cmVhbSAqcyk7CitzdHJ1Y3QgaXNsX3Rva2VuICppc2xfc3RyZWFtX25leHRfdG9rZW5fb25fc2FtZV9saW5lKHN0cnVjdCBpc2xfc3RyZWFtICpzKTsKK2ludCBpc2xfc3RyZWFtX25leHRfdG9rZW5faXMoc3RydWN0IGlzbF9zdHJlYW0gKnMsIGludCB0eXBlKTsKK3ZvaWQgaXNsX3N0cmVhbV9wdXNoX3Rva2VuKHN0cnVjdCBpc2xfc3RyZWFtICpzLCBzdHJ1Y3QgaXNsX3Rva2VuICp0b2spOwordm9pZCBpc2xfc3RyZWFtX2ZsdXNoX3Rva2VucyhzdHJ1Y3QgaXNsX3N0cmVhbSAqcyk7CitpbnQgaXNsX3N0cmVhbV9lYXRfaWZfYXZhaWxhYmxlKHN0cnVjdCBpc2xfc3RyZWFtICpzLCBpbnQgdHlwZSk7CitjaGFyICppc2xfc3RyZWFtX3JlYWRfaWRlbnRfaWZfYXZhaWxhYmxlKHN0cnVjdCBpc2xfc3RyZWFtICpzKTsKK2ludCBpc2xfc3RyZWFtX2VhdChzdHJ1Y3QgaXNsX3N0cmVhbSAqcywgaW50IHR5cGUpOworaW50IGlzbF9zdHJlYW1faXNfZW1wdHkoc3RydWN0IGlzbF9zdHJlYW0gKnMpOworaW50IGlzbF9zdHJlYW1fc2tpcF9saW5lKHN0cnVjdCBpc2xfc3RyZWFtICpzKTsKKworZW51bSBpc2xfdG9rZW5fdHlwZSBpc2xfc3RyZWFtX3JlZ2lzdGVyX2tleXdvcmQoc3RydWN0IGlzbF9zdHJlYW0gKnMsCisJY29uc3QgY2hhciAqbmFtZSk7CisKK3N0cnVjdCBpc2xfb2JqIGlzbF9zdHJlYW1fcmVhZF9vYmooc3RydWN0IGlzbF9zdHJlYW0gKnMpOworX19pc2xfZ2l2ZSBpc2xfbXVsdGlfYWZmICppc2xfc3RyZWFtX3JlYWRfbXVsdGlfYWZmKHN0cnVjdCBpc2xfc3RyZWFtICpzKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX3N0cmVhbV9yZWFkX21hcChzdHJ1Y3QgaXNsX3N0cmVhbSAqcyk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF9zdHJlYW1fcmVhZF9zZXQoc3RydWN0IGlzbF9zdHJlYW0gKnMpOworX19pc2xfZ2l2ZSBpc2xfcHdfcXBvbHlub21pYWwgKmlzbF9zdHJlYW1fcmVhZF9wd19xcG9seW5vbWlhbCgKKwlzdHJ1Y3QgaXNsX3N0cmVhbSAqcyk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF9zdHJlYW1fcmVhZF91bmlvbl9tYXAoc3RydWN0IGlzbF9zdHJlYW0gKnMpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaXNsL3VuaW9uX21hcC5oIGIvaW5jbHVkZS9pc2wvdW5pb25fbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViN2IyZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaXNsL3VuaW9uX21hcC5oCkBAIC0wLDAgKzEsMjAyIEBACisjaWZuZGVmIElTTF9VTklPTl9NQVBfSAorI2RlZmluZSBJU0xfVU5JT05fTUFQX0gKKworI2luY2x1ZGUgPGlzbC9zcGFjZS5oPgorI2luY2x1ZGUgPGlzbC9tYXBfdHlwZS5oPgorI2luY2x1ZGUgPGlzbC91bmlvbl9tYXBfdHlwZS5oPgorI2luY2x1ZGUgPGlzbC9wcmludGVyLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworX19pc2xfY29uc3RydWN0b3IKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9mcm9tX2Jhc2ljX21hcCgKKwlfX2lzbF90YWtlIGlzbF9iYXNpY19tYXAgKmJtYXApOworX19pc2xfY29uc3RydWN0b3IKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9mcm9tX21hcChfX2lzbF90YWtlIGlzbF9tYXAgKm1hcCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfZW1wdHkoX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfY29weShfX2lzbF9rZWVwIGlzbF91bmlvbl9tYXAgKnVtYXApOwordm9pZCAqaXNsX3VuaW9uX21hcF9mcmVlKF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCk7CisKK2lzbF9jdHggKmlzbF91bmlvbl9tYXBfZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF91bmlvbl9tYXAgKnVtYXApOworX19pc2xfZ2l2ZSBpc2xfc3BhY2UgKmlzbF91bmlvbl9tYXBfZ2V0X3NwYWNlKF9faXNsX2tlZXAgaXNsX3VuaW9uX21hcCAqdW1hcCk7CisKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF91bml2ZXJzZSgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXApOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfdW5pb25fbWFwX3BhcmFtcyhfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXApOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fbWFwX2RvbWFpbihfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXApOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fbWFwX3JhbmdlKF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfZG9tYWluX21hcCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXApOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX3JhbmdlX21hcCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXApOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX2Zyb21fZG9tYWluKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfZnJvbV9yYW5nZSgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQpOworCitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9hZmZpbmVfaHVsbCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXApOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfcG9seWhlZHJhbF9odWxsKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfc2ltcGxlX2h1bGwoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX2NvYWxlc2NlKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfY29tcHV0ZV9kaXZzKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9sZXhtaW4oX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX2xleG1heChfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXApOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfYWRkX21hcChfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAsCisJX19pc2xfdGFrZSBpc2xfbWFwICptYXApOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfdW5pb24oX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwMSwKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAyKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX3N1YnRyYWN0KAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcDEsIF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcDIpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfaW50ZXJzZWN0KAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcDEsIF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcDIpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfaW50ZXJzZWN0X3BhcmFtcygKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAsIF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9wcm9kdWN0KF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcDEsCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwMik7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfZG9tYWluX3Byb2R1Y3QoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwMSwgX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwMik7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfcmFuZ2VfcHJvZHVjdCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAxLCBfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAyKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9mbGF0X3JhbmdlX3Byb2R1Y3QoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwMSwgX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwMik7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9naXN0KF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCwKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKmNvbnRleHQpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfZ2lzdF9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwLCBfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9naXN0X2RvbWFpbigKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAsIF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9naXN0X3JhbmdlKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCwgX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0KTsKKworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfaW50ZXJzZWN0X2RvbWFpbigKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAsIF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9pbnRlcnNlY3RfcmFuZ2UoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwLCBfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQpOworCitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9zdWJ0cmFjdF9kb21haW4oCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwLCBfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKmRvbSk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9zdWJ0cmFjdF9yYW5nZSgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAsIF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqZG9tKTsKKworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfYXBwbHlfZG9tYWluKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcDEsIF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcDIpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfYXBwbHlfcmFuZ2UoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwMSwgX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwMik7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9yZXZlcnNlKF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfZnJvbV9kb21haW5fYW5kX3JhbmdlKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqZG9tYWluLCBfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnJhbmdlKTsKKworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfZGV0ZWN0X2VxdWFsaXRpZXMoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fbWFwX2RlbHRhcyhfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXApOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX2RlbHRhc19tYXAoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fc2V0X2lkZW50aXR5KF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCk7CisKK19faXNsX2V4cG9ydAoraW50IGlzbF91bmlvbl9tYXBfaXNfZW1wdHkoX19pc2xfa2VlcCBpc2xfdW5pb25fbWFwICp1bWFwKTsKK19faXNsX2V4cG9ydAoraW50IGlzbF91bmlvbl9tYXBfaXNfc2luZ2xlX3ZhbHVlZChfX2lzbF9rZWVwIGlzbF91bmlvbl9tYXAgKnVtYXApOworaW50IGlzbF91bmlvbl9tYXBfcGxhaW5faXNfaW5qZWN0aXZlKF9faXNsX2tlZXAgaXNsX3VuaW9uX21hcCAqdW1hcCk7CitfX2lzbF9leHBvcnQKK2ludCBpc2xfdW5pb25fbWFwX2lzX2luamVjdGl2ZShfX2lzbF9rZWVwIGlzbF91bmlvbl9tYXAgKnVtYXApOworX19pc2xfZXhwb3J0CitpbnQgaXNsX3VuaW9uX21hcF9pc19iaWplY3RpdmUoX19pc2xfa2VlcCBpc2xfdW5pb25fbWFwICp1bWFwKTsKKworX19pc2xfZXhwb3J0CitpbnQgaXNsX3VuaW9uX21hcF9pc19zdWJzZXQoX19pc2xfa2VlcCBpc2xfdW5pb25fbWFwICp1bWFwMSwKKwlfX2lzbF9rZWVwIGlzbF91bmlvbl9tYXAgKnVtYXAyKTsKK19faXNsX2V4cG9ydAoraW50IGlzbF91bmlvbl9tYXBfaXNfZXF1YWwoX19pc2xfa2VlcCBpc2xfdW5pb25fbWFwICp1bWFwMSwKKwlfX2lzbF9rZWVwIGlzbF91bmlvbl9tYXAgKnVtYXAyKTsKK19faXNsX2V4cG9ydAoraW50IGlzbF91bmlvbl9tYXBfaXNfc3RyaWN0X3N1YnNldChfX2lzbF9rZWVwIGlzbF91bmlvbl9tYXAgKnVtYXAxLAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX21hcCAqdW1hcDIpOworCitpbnQgaXNsX3VuaW9uX21hcF9uX21hcChfX2lzbF9rZWVwIGlzbF91bmlvbl9tYXAgKnVtYXApOworX19pc2xfZXhwb3J0CitpbnQgaXNsX3VuaW9uX21hcF9mb3JlYWNoX21hcChfX2lzbF9rZWVwIGlzbF91bmlvbl9tYXAgKnVtYXAsCisJaW50ICgqZm4pKF9faXNsX3Rha2UgaXNsX21hcCAqbWFwLCB2b2lkICp1c2VyKSwgdm9pZCAqdXNlcik7CitfX2lzbF9naXZlIGludCBpc2xfdW5pb25fbWFwX2NvbnRhaW5zKF9faXNsX2tlZXAgaXNsX3VuaW9uX21hcCAqdW1hcCwKKwlfX2lzbF9rZWVwIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX21hcCAqaXNsX3VuaW9uX21hcF9leHRyYWN0X21hcChfX2lzbF9rZWVwIGlzbF91bmlvbl9tYXAgKnVtYXAsCisJX19pc2xfdGFrZSBpc2xfc3BhY2UgKmRpbSk7CitfX2lzbF9naXZlIGlzbF9tYXAgKmlzbF9tYXBfZnJvbV91bmlvbl9tYXAoX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwKTsKKworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfbWFwICppc2xfdW5pb25fbWFwX3NhbXBsZShfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXApOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfZml4ZWRfcG93ZXIoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwLCBpc2xfaW50IGV4cCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfcG93ZXIoX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwLAorCWludCAqZXhhY3QpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX3RyYW5zaXRpdmVfY2xvc3VyZSgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAsIGludCAqZXhhY3QpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfbGV4X2x0X3VuaW9uX21hcCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAxLCBfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAyKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX21hcF9sZXhfbGVfdW5pb25fbWFwKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcDEsIF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcDIpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX2xleF9ndF91bmlvbl9tYXAoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwMSwgX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwMik7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfbGV4X2dlX3VuaW9uX21hcCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAxLCBfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXAyKTsKKworX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX3JlYWRfZnJvbV9maWxlKGlzbF9jdHggKmN0eCwKKwlGSUxFICppbnB1dCk7CitfX2lzbF9jb25zdHJ1Y3RvcgorX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX3JlYWRfZnJvbV9zdHIoaXNsX2N0eCAqY3R4LAorCWNvbnN0IGNoYXIgKnN0cik7CitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF91bmlvbl9tYXAoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcCwKKwlfX2lzbF9rZWVwIGlzbF91bmlvbl9tYXAgKnVtYXApOwordm9pZCBpc2xfdW5pb25fbWFwX2R1bXAoX19pc2xfa2VlcCBpc2xfdW5pb25fbWFwICp1bWFwKTsKKworX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fbWFwX3dyYXAoX19pc2xfdGFrZSBpc2xfdW5pb25fbWFwICp1bWFwKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX3NldF91bndyYXAoX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0KTsKKworX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX3ppcChfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXApOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fbWFwX2N1cnJ5KF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfdW5jdXJyeShfX2lzbF90YWtlIGlzbF91bmlvbl9tYXAgKnVtYXApOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9tYXBfYWxpZ25fcGFyYW1zKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCwgX19pc2xfdGFrZSBpc2xfc3BhY2UgKm1vZGVsKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3NldCAqaXNsX3VuaW9uX3NldF9hbGlnbl9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0LCBfX2lzbF90YWtlIGlzbF9zcGFjZSAqbW9kZWwpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjaW5jbHVkZSA8aXNsL2RpbS5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaXNsL3VuaW9uX21hcF90eXBlLmggYi9pbmNsdWRlL2lzbC91bmlvbl9tYXBfdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5M2YyY2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2lzbC91bmlvbl9tYXBfdHlwZS5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgSVNMX1VOSU9OX01BUF9UWVBFX0gKKyNkZWZpbmUgSVNMX1VOSU9OX01BUF9UWVBFX0gKKworI2luY2x1ZGUgPGlzbC9jdHguaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgX19pc2xfZXhwb3J0IGlzbF91bmlvbl9tYXA7Cit0eXBlZGVmIHN0cnVjdCBpc2xfdW5pb25fbWFwIGlzbF91bmlvbl9tYXA7CisjaWZuZGVmIGlzbF91bmlvbl9zZXQKK3N0cnVjdCBfX2lzbF9leHBvcnQgaXNsX3VuaW9uX3NldDsKK3R5cGVkZWYgc3RydWN0IGlzbF91bmlvbl9zZXQgaXNsX3VuaW9uX3NldDsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaXNsL3VuaW9uX3NldC5oIGIvaW5jbHVkZS9pc2wvdW5pb25fc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4NTk3NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaXNsL3VuaW9uX3NldC5oCkBAIC0wLDAgKzEsMTMzIEBACisjaWZuZGVmIElTTF9VTklPTl9TRVRfSAorI2RlZmluZSBJU0xfVU5JT05fU0VUX0gKKworI2luY2x1ZGUgPGlzbC9wb2ludC5oPgorI2luY2x1ZGUgPGlzbC91bmlvbl9tYXAuaD4KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitfX2lzbF9jb25zdHJ1Y3RvcgorX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fc2V0X2Zyb21fYmFzaWNfc2V0KAorCV9faXNsX3Rha2UgaXNsX2Jhc2ljX3NldCAqYnNldCk7CitfX2lzbF9jb25zdHJ1Y3RvcgorX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fc2V0X2Zyb21fc2V0KF9faXNsX3Rha2UgaXNsX3NldCAqc2V0KTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3NldCAqaXNsX3VuaW9uX3NldF9lbXB0eShfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX3NldCAqaXNsX3VuaW9uX3NldF9jb3B5KF9faXNsX2tlZXAgaXNsX3VuaW9uX3NldCAqdXNldCk7Cit2b2lkICppc2xfdW5pb25fc2V0X2ZyZWUoX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0KTsKKworaXNsX2N0eCAqaXNsX3VuaW9uX3NldF9nZXRfY3R4KF9faXNsX2tlZXAgaXNsX3VuaW9uX3NldCAqdXNldCk7CitfX2lzbF9naXZlIGlzbF9zcGFjZSAqaXNsX3VuaW9uX3NldF9nZXRfc3BhY2UoX19pc2xfa2VlcCBpc2xfdW5pb25fc2V0ICp1c2V0KTsKKworX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fc2V0X3VuaXZlcnNlKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCk7CitfX2lzbF9naXZlIGlzbF9zZXQgKmlzbF91bmlvbl9zZXRfcGFyYW1zKF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCk7CisKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fc2V0X2RldGVjdF9lcXVhbGl0aWVzKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX3NldCAqaXNsX3VuaW9uX3NldF9hZmZpbmVfaHVsbCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfcG9seWhlZHJhbF9odWxsKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfc2ltcGxlX2h1bGwoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fc2V0X2NvYWxlc2NlKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfY29tcHV0ZV9kaXZzKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCk7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX3NldCAqaXNsX3VuaW9uX3NldF9sZXhtaW4oX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fc2V0X2xleG1heChfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfYWRkX3NldChfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQsCisJX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fc2V0X3VuaW9uKF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldDEsCisJX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0Mik7CitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX3NldCAqaXNsX3VuaW9uX3NldF9zdWJ0cmFjdCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQxLCBfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQyKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fc2V0X2ludGVyc2VjdCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQxLCBfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQyKTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fc2V0X2ludGVyc2VjdF9wYXJhbXMoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0LCBfX2lzbF90YWtlIGlzbF9zZXQgKnNldCk7CitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfcHJvZHVjdChfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQxLAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldDIpOworX19pc2xfZXhwb3J0CitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfZ2lzdChfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQsCisJX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICpjb250ZXh0KTsKK19faXNsX2V4cG9ydAorX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fc2V0X2dpc3RfcGFyYW1zKAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldCwgX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQpOworCitfX2lzbF9leHBvcnQKK19faXNsX2dpdmUgaXNsX3VuaW9uX3NldCAqaXNsX3VuaW9uX3NldF9hcHBseSgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQsIF9faXNsX3Rha2UgaXNsX3VuaW9uX21hcCAqdW1hcCk7CisKK2ludCBpc2xfdW5pb25fc2V0X2lzX3BhcmFtcyhfX2lzbF9rZWVwIGlzbF91bmlvbl9zZXQgKnVzZXQpOworX19pc2xfZXhwb3J0CitpbnQgaXNsX3VuaW9uX3NldF9pc19lbXB0eShfX2lzbF9rZWVwIGlzbF91bmlvbl9zZXQgKnVzZXQpOworCitfX2lzbF9leHBvcnQKK2ludCBpc2xfdW5pb25fc2V0X2lzX3N1YnNldChfX2lzbF9rZWVwIGlzbF91bmlvbl9zZXQgKnVzZXQxLAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX3NldCAqdXNldDIpOworX19pc2xfZXhwb3J0CitpbnQgaXNsX3VuaW9uX3NldF9pc19lcXVhbChfX2lzbF9rZWVwIGlzbF91bmlvbl9zZXQgKnVzZXQxLAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX3NldCAqdXNldDIpOworX19pc2xfZXhwb3J0CitpbnQgaXNsX3VuaW9uX3NldF9pc19zdHJpY3Rfc3Vic2V0KF9faXNsX2tlZXAgaXNsX3VuaW9uX3NldCAqdXNldDEsCisJX19pc2xfa2VlcCBpc2xfdW5pb25fc2V0ICp1c2V0Mik7CisKK2ludCBpc2xfdW5pb25fc2V0X25fc2V0KF9faXNsX2tlZXAgaXNsX3VuaW9uX3NldCAqdXNldCk7CitfX2lzbF9leHBvcnQKK2ludCBpc2xfdW5pb25fc2V0X2ZvcmVhY2hfc2V0KF9faXNsX2tlZXAgaXNsX3VuaW9uX3NldCAqdXNldCwKKwlpbnQgKCpmbikoX19pc2xfdGFrZSBpc2xfc2V0ICpzZXQsIHZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKK19faXNsX2dpdmUgaW50IGlzbF91bmlvbl9zZXRfY29udGFpbnMoX19pc2xfa2VlcCBpc2xfdW5pb25fc2V0ICp1c2V0LAorCV9faXNsX2tlZXAgaXNsX3NwYWNlICpkaW0pOworX19pc2xfZ2l2ZSBpc2xfc2V0ICppc2xfdW5pb25fc2V0X2V4dHJhY3Rfc2V0KF9faXNsX2tlZXAgaXNsX3VuaW9uX3NldCAqdXNldCwKKwlfX2lzbF90YWtlIGlzbF9zcGFjZSAqZGltKTsKK19faXNsX2dpdmUgaXNsX3NldCAqaXNsX3NldF9mcm9tX3VuaW9uX3NldChfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQpOworaW50IGlzbF91bmlvbl9zZXRfZm9yZWFjaF9wb2ludChfX2lzbF9rZWVwIGlzbF91bmlvbl9zZXQgKnVzZXQsCisJaW50ICgqZm4pKF9faXNsX3Rha2UgaXNsX3BvaW50ICpwbnQsIHZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKKworX19pc2xfZ2l2ZSBpc2xfYmFzaWNfc2V0ICppc2xfdW5pb25fc2V0X3NhbXBsZShfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfbGlmdChfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9zZXRfbGV4X2x0X3VuaW9uX3NldCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQxLCBfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQyKTsKK19faXNsX2dpdmUgaXNsX3VuaW9uX21hcCAqaXNsX3VuaW9uX3NldF9sZXhfbGVfdW5pb25fc2V0KAorCV9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldDEsIF9faXNsX3Rha2UgaXNsX3VuaW9uX3NldCAqdXNldDIpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fbWFwICppc2xfdW5pb25fc2V0X2xleF9ndF91bmlvbl9zZXQoCisJX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0MSwgX19pc2xfdGFrZSBpc2xfdW5pb25fc2V0ICp1c2V0Mik7CitfX2lzbF9naXZlIGlzbF91bmlvbl9tYXAgKmlzbF91bmlvbl9zZXRfbGV4X2dlX3VuaW9uX3NldCgKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQxLCBfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKnVzZXQyKTsKKworX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fc2V0X2NvZWZmaWNpZW50cygKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKmJzZXQpOworX19pc2xfZ2l2ZSBpc2xfdW5pb25fc2V0ICppc2xfdW5pb25fc2V0X3NvbHV0aW9ucygKKwlfX2lzbF90YWtlIGlzbF91bmlvbl9zZXQgKmJzZXQpOworCitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfcmVhZF9mcm9tX2ZpbGUoaXNsX2N0eCAqY3R4LAorCUZJTEUgKmlucHV0KTsKK19faXNsX2NvbnN0cnVjdG9yCitfX2lzbF9naXZlIGlzbF91bmlvbl9zZXQgKmlzbF91bmlvbl9zZXRfcmVhZF9mcm9tX3N0cihpc2xfY3R4ICpjdHgsCisJY29uc3QgY2hhciAqc3RyKTsKK19faXNsX2dpdmUgaXNsX3ByaW50ZXIgKmlzbF9wcmludGVyX3ByaW50X3VuaW9uX3NldChfX2lzbF90YWtlIGlzbF9wcmludGVyICpwLAorCV9faXNsX2tlZXAgaXNsX3VuaW9uX3NldCAqdXNldCk7Cit2b2lkIGlzbF91bmlvbl9zZXRfZHVtcChfX2lzbF9rZWVwIGlzbF91bmlvbl9zZXQgKnVzZXQpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjaW5jbHVkZSA8aXNsL2RpbS5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaXNsL3VuaW9uX3NldF90eXBlLmggYi9pbmNsdWRlL2lzbC91bmlvbl9zZXRfdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YjJjMzEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2lzbC91bmlvbl9zZXRfdHlwZS5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBJU0xfVU5JT05fU0VUX1RZUEVfSAorI2RlZmluZSBJU0xfVU5JT05fU0VUX1RZUEVfSAorCisjaW5jbHVkZSA8aXNsL3VuaW9uX21hcF90eXBlLmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pc2wvdmVjLmggYi9pbmNsdWRlL2lzbC92ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTIyOTk3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9pc2wvdmVjLmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgS2F0aG9saWVrZSBVbml2ZXJzaXRlaXQgTGV1dmVuCisgKgorICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIE1JVCBsaWNlbnNlCisgKgorICogV3JpdHRlbiBieSBTdmVuIFZlcmRvb2xhZWdlLCBLLlUuTGV1dmVuLCBEZXBhcnRlbWVudAorICogQ29tcHV0ZXJ3ZXRlbnNjaGFwcGVuLCBDZWxlc3Rpam5lbmxhYW4gMjAwQSwgQi0zMDAxIExldXZlbiwgQmVsZ2l1bQorICovCisKKyNpZm5kZWYgSVNMX1ZFQ19ICisjZGVmaW5lIElTTF9WRUNfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGlzbC9pbnQuaD4KKyNpbmNsdWRlIDxpc2wvY3R4Lmg+CisjaW5jbHVkZSA8aXNsL2Jsay5oPgorI2luY2x1ZGUgPGlzbC9wcmludGVyLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IGlzbF92ZWMgeworCWludCByZWY7CisKKwlzdHJ1Y3QgaXNsX2N0eCAqY3R4OworCisJdW5zaWduZWQgc2l6ZTsKKwlpc2xfaW50ICplbDsKKworCXN0cnVjdCBpc2xfYmxrIGJsb2NrOworfTsKK3R5cGVkZWYgc3RydWN0IGlzbF92ZWMgaXNsX3ZlYzsKKworX19pc2xfZ2l2ZSBpc2xfdmVjICppc2xfdmVjX2FsbG9jKGlzbF9jdHggKmN0eCwgdW5zaWduZWQgc2l6ZSk7CitfX2lzbF9naXZlIGlzbF92ZWMgKmlzbF92ZWNfY29weShfX2lzbF9rZWVwIGlzbF92ZWMgKnZlYyk7CitzdHJ1Y3QgaXNsX3ZlYyAqaXNsX3ZlY19jb3coc3RydWN0IGlzbF92ZWMgKnZlYyk7Cit2b2lkICppc2xfdmVjX2ZyZWUoX19pc2xfdGFrZSBpc2xfdmVjICp2ZWMpOworCitpc2xfY3R4ICppc2xfdmVjX2dldF9jdHgoX19pc2xfa2VlcCBpc2xfdmVjICp2ZWMpOworCitpbnQgaXNsX3ZlY19zaXplKF9faXNsX2tlZXAgaXNsX3ZlYyAqdmVjKTsKK2ludCBpc2xfdmVjX2dldF9lbGVtZW50KF9faXNsX2tlZXAgaXNsX3ZlYyAqdmVjLCBpbnQgcG9zLCBpc2xfaW50ICp2KTsKK19faXNsX2dpdmUgaXNsX3ZlYyAqaXNsX3ZlY19zZXRfZWxlbWVudChfX2lzbF90YWtlIGlzbF92ZWMgKnZlYywKKwlpbnQgcG9zLCBpc2xfaW50IHYpOworX19pc2xfZ2l2ZSBpc2xfdmVjICppc2xfdmVjX3NldF9lbGVtZW50X3NpKF9faXNsX3Rha2UgaXNsX3ZlYyAqdmVjLAorCWludCBwb3MsIGludCB2KTsKKworaW50IGlzbF92ZWNfaXNfZXF1YWwoX19pc2xfa2VlcCBpc2xfdmVjICp2ZWMxLCBfX2lzbF9rZWVwIGlzbF92ZWMgKnZlYzIpOworCit2b2lkIGlzbF92ZWNfZHVtcChfX2lzbF9rZWVwIGlzbF92ZWMgKnZlYyk7CitfX2lzbF9naXZlIGlzbF9wcmludGVyICppc2xfcHJpbnRlcl9wcmludF92ZWMoX19pc2xfdGFrZSBpc2xfcHJpbnRlciAqcHJpbnRlciwKKwlfX2lzbF9rZWVwIGlzbF92ZWMgKnZlYyk7CisKK3ZvaWQgaXNsX3ZlY19sY20oc3RydWN0IGlzbF92ZWMgKnZlYywgaXNsX2ludCAqbGNtKTsKK3N0cnVjdCBpc2xfdmVjICppc2xfdmVjX2NlaWwoc3RydWN0IGlzbF92ZWMgKnZlYyk7CitzdHJ1Y3QgaXNsX3ZlYyAqaXNsX3ZlY19ub3JtYWxpemUoc3RydWN0IGlzbF92ZWMgKnZlYyk7CitfX2lzbF9naXZlIGlzbF92ZWMgKmlzbF92ZWNfc2V0KF9faXNsX3Rha2UgaXNsX3ZlYyAqdmVjLCBpc2xfaW50IHYpOworX19pc2xfZ2l2ZSBpc2xfdmVjICppc2xfdmVjX3NldF9zaShfX2lzbF90YWtlIGlzbF92ZWMgKnZlYywgaW50IHYpOworX19pc2xfZ2l2ZSBpc2xfdmVjICppc2xfdmVjX2NscihfX2lzbF90YWtlIGlzbF92ZWMgKnZlYyk7CitfX2lzbF9naXZlIGlzbF92ZWMgKmlzbF92ZWNfbmVnKF9faXNsX3Rha2UgaXNsX3ZlYyAqdmVjKTsKK19faXNsX2dpdmUgaXNsX3ZlYyAqaXNsX3ZlY19zY2FsZShfX2lzbF90YWtlIGlzbF92ZWMgKnZlYywgaXNsX2ludCBtKTsKK19faXNsX2dpdmUgaXNsX3ZlYyAqaXNsX3ZlY19mZGl2X3IoX19pc2xfdGFrZSBpc2xfdmVjICp2ZWMsIGlzbF9pbnQgbSk7CitfX2lzbF9naXZlIGlzbF92ZWMgKmlzbF92ZWNfYWRkKF9faXNsX3Rha2UgaXNsX3ZlYyAqdmVjMSwKKwlfX2lzbF90YWtlIGlzbF92ZWMgKnZlYzIpOworX19pc2xfZ2l2ZSBpc2xfdmVjICppc2xfdmVjX2V4dGVuZChfX2lzbF90YWtlIGlzbF92ZWMgKnZlYywgdW5zaWduZWQgc2l6ZSk7CitfX2lzbF9naXZlIGlzbF92ZWMgKmlzbF92ZWNfemVyb19leHRlbmQoX19pc2xfdGFrZSBpc2xfdmVjICp2ZWMsIHVuc2lnbmVkIHNpemUpOworX19pc2xfZ2l2ZSBpc2xfdmVjICppc2xfdmVjX2NvbmNhdChfX2lzbF90YWtlIGlzbF92ZWMgKnZlYzEsCisJX19pc2xfdGFrZSBpc2xfdmVjICp2ZWMyKTsKKworX19pc2xfZ2l2ZSBpc2xfdmVjICppc2xfdmVjX3NvcnQoX19pc2xfdGFrZSBpc2xfdmVjICp2ZWMpOworCitfX2lzbF9naXZlIGlzbF92ZWMgKmlzbF92ZWNfcmVhZF9mcm9tX2ZpbGUoaXNsX2N0eCAqY3R4LCBGSUxFICppbnB1dCk7CisKK19faXNsX2dpdmUgaXNsX3ZlYyAqaXNsX3ZlY19kcm9wX2VscyhfX2lzbF90YWtlIGlzbF92ZWMgKnZlYywKKwl1bnNpZ25lZCBwb3MsIHVuc2lnbmVkIG4pOworX19pc2xfZ2l2ZSBpc2xfdmVjICppc2xfdmVjX2luc2VydF9lbHMoX19pc2xfdGFrZSBpc2xfdmVjICp2ZWMsCisJdW5zaWduZWQgcG9zLCB1bnNpZ25lZCBuKTsKK19faXNsX2dpdmUgaXNsX3ZlYyAqaXNsX3ZlY19pbnNlcnRfemVyb19lbHMoX19pc2xfdGFrZSBpc2xfdmVjICp2ZWMsCisJdW5zaWduZWQgcG9zLCB1bnNpZ25lZCBuKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2lzbC92ZXJzaW9uLmggYi9pbmNsdWRlL2lzbC92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4ZjIzZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaXNsL3ZlcnNpb24uaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIElTTF9WRVJTSU9OX0gKKyNkZWZpbmUgSVNMX1ZFUlNJT05fSAorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2NvbnN0IGNoYXIgKmlzbF92ZXJzaW9uKHZvaWQpOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaXNsL3ZlcnRpY2VzLmggYi9pbmNsdWRlL2lzbC92ZXJ0aWNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlODQ2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2lzbC92ZXJ0aWNlcy5oCkBAIC0wLDAgKzEsNDYgQEAKKyNpZm5kZWYgSVNMX1ZFUlRJQ0VTX0gKKyNkZWZpbmUgSVNMX1ZFUlRJQ0VTX0gKKworI2luY2x1ZGUgPGlzbC9zZXRfdHlwZS5oPgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBpc2xfZXh0ZXJuYWxfdmVydGV4OwordHlwZWRlZiBzdHJ1Y3QgaXNsX2V4dGVybmFsX3ZlcnRleAlpc2xfdmVydGV4OworCitzdHJ1Y3QgaXNsX2NlbGw7Cit0eXBlZGVmIHN0cnVjdCBpc2xfY2VsbAkJaXNsX2NlbGw7CisKK3N0cnVjdCBpc2xfdmVydGljZXM7Cit0eXBlZGVmIHN0cnVjdCBpc2xfdmVydGljZXMJaXNsX3ZlcnRpY2VzOworCitpc2xfY3R4ICppc2xfdmVydGV4X2dldF9jdHgoX19pc2xfa2VlcCBpc2xfdmVydGV4ICp2ZXJ0ZXgpOworaW50IGlzbF92ZXJ0ZXhfZ2V0X2lkKF9faXNsX2tlZXAgaXNsX3ZlcnRleCAqdmVydGV4KTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX3ZlcnRleF9nZXRfZG9tYWluKF9faXNsX2tlZXAgaXNsX3ZlcnRleCAqdmVydGV4KTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX3ZlcnRleF9nZXRfZXhwcihfX2lzbF9rZWVwIGlzbF92ZXJ0ZXggKnZlcnRleCk7Cit2b2lkIGlzbF92ZXJ0ZXhfZnJlZShfX2lzbF90YWtlIGlzbF92ZXJ0ZXggKnZlcnRleCk7CisKK19faXNsX2dpdmUgaXNsX3ZlcnRpY2VzICppc2xfYmFzaWNfc2V0X2NvbXB1dGVfdmVydGljZXMoCisJX19pc2xfa2VlcCBpc2xfYmFzaWNfc2V0ICpic2V0KTsKK2lzbF9jdHggKmlzbF92ZXJ0aWNlc19nZXRfY3R4KF9faXNsX2tlZXAgaXNsX3ZlcnRpY2VzICp2ZXJ0aWNlcyk7CitpbnQgaXNsX3ZlcnRpY2VzX2dldF9uX3ZlcnRpY2VzKF9faXNsX2tlZXAgaXNsX3ZlcnRpY2VzICp2ZXJ0aWNlcyk7CitpbnQgaXNsX3ZlcnRpY2VzX2ZvcmVhY2hfdmVydGV4KF9faXNsX2tlZXAgaXNsX3ZlcnRpY2VzICp2ZXJ0aWNlcywKKwlpbnQgKCpmbikoX19pc2xfdGFrZSBpc2xfdmVydGV4ICp2ZXJ0ZXgsIHZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKK3ZvaWQgaXNsX3ZlcnRpY2VzX2ZyZWUoX19pc2xfdGFrZSBpc2xfdmVydGljZXMgKnZlcnRpY2VzKTsKKworaXNsX2N0eCAqaXNsX2NlbGxfZ2V0X2N0eChfX2lzbF9rZWVwIGlzbF9jZWxsICpjZWxsKTsKK19faXNsX2dpdmUgaXNsX2Jhc2ljX3NldCAqaXNsX2NlbGxfZ2V0X2RvbWFpbihfX2lzbF9rZWVwIGlzbF9jZWxsICpjZWxsKTsKK2ludCBpc2xfY2VsbF9mb3JlYWNoX3ZlcnRleChfX2lzbF9rZWVwIGlzbF9jZWxsICpjZWxsLAorCWludCAoKmZuKShfX2lzbF90YWtlIGlzbF92ZXJ0ZXggKnZlcnRleCwgdm9pZCAqdXNlciksIHZvaWQgKnVzZXIpOwordm9pZCBpc2xfY2VsbF9mcmVlKF9faXNsX3Rha2UgaXNsX2NlbGwgKmNlbGwpOworCitpbnQgaXNsX3ZlcnRpY2VzX2ZvcmVhY2hfY2VsbChfX2lzbF9rZWVwIGlzbF92ZXJ0aWNlcyAqdmVydGljZXMsCisJaW50ICgqZm4pKF9faXNsX3Rha2UgaXNsX2NlbGwgKmNlbGwsIHZvaWQgKnVzZXIpLCB2b2lkICp1c2VyKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wYy5oIGIvaW5jbHVkZS9tcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmMxOTQzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tcGMuaApAQCAtMCwwICsxLDI2OSBAQAorLyogbXBjLmggLS0gSW5jbHVkZSBmaWxlIGZvciBtcGMuCisKK0NvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiBJTlJJQQorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgTVBDLgorCitHTlUgTVBDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK29wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0dOVSBNUEMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCitGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvIC4KKyovCisKKyNpZm5kZWYgX19NUENfSAorI2RlZmluZSBfX01QQ19ICisKKyNpbmNsdWRlICJnbXAuaCIKKyNpbmNsdWRlICJtcGZyLmgiCisKKy8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggbXBmcjwzLjAuMCAqLworI2lmbmRlZiBtcGZyX2V4cF90CisjZGVmaW5lIG1wZnJfZXhwX3QgbXBfZXhwX3QKKyNlbmRpZgorCisvKiBEZWZpbmUgTVBDIHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lIE1QQ19WRVJTSU9OX01BSk9SIDEKKyNkZWZpbmUgTVBDX1ZFUlNJT05fTUlOT1IgMAorI2RlZmluZSBNUENfVkVSU0lPTl9QQVRDSExFVkVMIDEKKyNkZWZpbmUgTVBDX1ZFUlNJT05fU1RSSU5HICIxLjAuMSIKKworLyogTWFjcm9zIGRlYWxpbmcgd2l0aCBNUEMgVkVSU0lPTiAqLworI2RlZmluZSBNUENfVkVSU0lPTl9OVU0oYSxiLGMpICgoKGEpIDw8IDE2TCkgfCAoKGIpIDw8IDgpIHwgKGMpKQorI2RlZmluZSBNUENfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBNUENfVkVSU0lPTl9OVU0oTVBDX1ZFUlNJT05fTUFKT1IsTVBDX1ZFUlNJT05fTUlOT1IsTVBDX1ZFUlNJT05fUEFUQ0hMRVZFTCkKKworLyogQ2hlY2sgaWYgc3RkaW50LmgvaW50dHlwZXMuaCBpcyBpbmNsdWRlZCAqLworI2lmIGRlZmluZWQgKElOVE1BWF9DKSAmJiBkZWZpbmVkIChVSU5UTUFYX0MpCisjZGVmaW5lIF9NUENfSF9IQVZFX0lOVE1BWF9UIDEKKyNlbmRpZgorCisvKiBSZXR1cm4gdmFsdWVzICovCisKKy8qIFRyYW5zZm9ybSBuZWdhdGl2ZSB0byAyLCBwb3NpdGl2ZSB0byAxLCBsZWF2ZSAwIHVuY2hhbmdlZCAqLworI2RlZmluZSBNUENfSU5FWF9QT1MoaW5leCkgKCgoaW5leCkgPCAwKSA/IDIgOiAoKGluZXgpID09IDApID8gMCA6IDEpCisvKiBUcmFuc2Zvcm0gMiB0byBuZWdhdGl2ZSwgMSB0byBwb3NpdGl2ZSwgbGVhdmUgMCB1bmNoYW5nZWQgKi8KKyNkZWZpbmUgTVBDX0lORVhfTkVHKGluZXgpICgoKGluZXgpID09IDIpID8gLTEgOiAoKGluZXgpID09IDApID8gMCA6IDEpCisKKy8qIFRoZSBnbG9iYWwgaW5leGFjdCBmbGFnIGlzIG1hZGUgb2YgKHJlYWwgZmxhZykgKyA0ICogKGltYWdpbmFyeSBmbGFnKSwgd2hlcmUKKyAgIGVhY2ggb2YgdGhlIHJlYWwgYW5kIGltYWdpbmFyeSBpbmV4YWN0IGZsYWcgYXJlOgorICAgMCB3aGVuIHRoZSByZXN1bHQgaXMgZXhhY3QgKG5vIHJvdW5kaW5nIGVycm9yKQorICAgMSB3aGVuIHRoZSByZXN1bHQgaXMgbGFyZ2VyIHRoYW4gdGhlIGV4YWN0IHZhbHVlCisgICAyIHdoZW4gdGhlIHJlc3VsdCBpcyBzbWFsbGVyIHRoYW4gdGhlIGV4YWN0IHZhbHVlICovCisjZGVmaW5lIE1QQ19JTkVYKGluZXhfcmUsIGluZXhfaW0pIFwKKyAgICAgICAgKE1QQ19JTkVYX1BPUyhpbmV4X3JlKSB8IChNUENfSU5FWF9QT1MoaW5leF9pbSkgPDwgMikpCisjZGVmaW5lIE1QQ19JTkVYX1JFKGluZXgpIE1QQ19JTkVYX05FRygoaW5leCkgJiAzKQorI2RlZmluZSBNUENfSU5FWF9JTShpbmV4KSBNUENfSU5FWF9ORUcoKGluZXgpID4+IDIpCisKKy8qIEZvciBmdW5jdGlvbnMgY29tcHV0aW5nIHR3byByZXN1bHRzLCB0aGUgcmV0dXJuIHZhbHVlIGlzCisgICBpbmV4YWN0MSsxNippbmV4YWN0Miwgd2hpY2ggaXMgMCBpaWYgYm90aCByZXN1bHRzIGFyZSBleGFjdC4gKi8KKyNkZWZpbmUgTVBDX0lORVgxMihpbmV4MSwgaW5leDIpIChpbmV4MSB8IChpbmV4MiA8PCA0KSkKKyNkZWZpbmUgTVBDX0lORVgxKGluZXgpIChpbmV4ICYgMTUpCisjZGVmaW5lIE1QQ19JTkVYMihpbmV4KSAoaW5leCA+PiA0KQorCisvKiBEZWZpbml0aW9uIG9mIHJvdW5kaW5nIG1vZGVzICovCisKKy8qIGEgY29tcGxleCByb3VuZGluZyBtb2RlIGlzIGp1c3QgYSBwYWlyIG9mIHR3byByZWFsIHJvdW5kaW5nIG1vZGVzCisgICB3ZSByZXNlcnZlIGZvdXIgYml0cyBmb3IgYSByZWFsIHJvdW5kaW5nIG1vZGUuICAqLwordHlwZWRlZiBpbnQgbXBjX3JuZF90OworCisjZGVmaW5lIE1QQ19STkQocjEscjIpICgoKGludCkocjEpKSArICgoaW50KShyMikgPDwgNCkpCisjZGVmaW5lIE1QQ19STkRfUkUoeCkgKChtcGZyX3JuZF90KSgoeCkgJiAweDBGKSkKKyNkZWZpbmUgTVBDX1JORF9JTSh4KSAoKG1wZnJfcm5kX3QpKCh4KSA+PiA0KSkKKworI2RlZmluZSBNUENfUk5ETk4gTVBDX1JORCAoR01QX1JORE4sR01QX1JORE4pCisjZGVmaW5lIE1QQ19STkROWiBNUENfUk5EIChHTVBfUk5ETixHTVBfUk5EWikKKyNkZWZpbmUgTVBDX1JORE5VIE1QQ19STkQgKEdNUF9STkROLEdNUF9STkRVKQorI2RlZmluZSBNUENfUk5ETkQgTVBDX1JORCAoR01QX1JORE4sR01QX1JOREQpCisKKyNkZWZpbmUgTVBDX1JORFpOIE1QQ19STkQgKEdNUF9STkRaLEdNUF9STkROKQorI2RlZmluZSBNUENfUk5EWlogTVBDX1JORCAoR01QX1JORFosR01QX1JORFopCisjZGVmaW5lIE1QQ19STkRaVSBNUENfUk5EIChHTVBfUk5EWixHTVBfUk5EVSkKKyNkZWZpbmUgTVBDX1JORFpEIE1QQ19STkQgKEdNUF9STkRaLEdNUF9STkREKQorCisjZGVmaW5lIE1QQ19STkRVTiBNUENfUk5EIChHTVBfUk5EVSxHTVBfUk5ETikKKyNkZWZpbmUgTVBDX1JORFVaIE1QQ19STkQgKEdNUF9STkRVLEdNUF9STkRaKQorI2RlZmluZSBNUENfUk5EVVUgTVBDX1JORCAoR01QX1JORFUsR01QX1JORFUpCisjZGVmaW5lIE1QQ19STkRVRCBNUENfUk5EIChHTVBfUk5EVSxHTVBfUk5ERCkKKworI2RlZmluZSBNUENfUk5ERE4gTVBDX1JORCAoR01QX1JOREQsR01QX1JORE4pCisjZGVmaW5lIE1QQ19STkREWiBNUENfUk5EIChHTVBfUk5ERCxHTVBfUk5EWikKKyNkZWZpbmUgTVBDX1JORERVIE1QQ19STkQgKEdNUF9STkRELEdNUF9STkRVKQorI2RlZmluZSBNUENfUk5EREQgTVBDX1JORCAoR01QX1JOREQsR01QX1JOREQpCisKKworLyogRGVmaW5pdGlvbnMgb2YgdHlwZXMgYW5kIHRoZWlyIHNlbWFudGljcyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIG1wZnJfdCByZTsKKyAgbXBmcl90IGltOworfQorX19tcGNfc3RydWN0OworCit0eXBlZGVmIF9fbXBjX3N0cnVjdCBtcGNfdFsxXTsKK3R5cGVkZWYgX19tcGNfc3RydWN0ICptcGNfcHRyOwordHlwZWRlZiBjb25zdCBfX21wY19zdHJ1Y3QgKm1wY19zcmNwdHI7CisKKy8qIFN1cHBvcnQgZm9yIFdJTkRPV1MgRExMLCBzZWUKKyAgIGh0dHA6Ly9saXN0cy5nZm9yZ2UuaW5yaWEuZnIvcGlwZXJtYWlsL21wYy1kaXNjdXNzLzIwMTEtTm92ZW1iZXIvMDAwOTkwLmh0bWw7CisgICB3aGVuIGJ1aWxkaW5nIHRoZSBETEwsIGV4cG9ydCBzeW1ib2xzLCBvdGhlcndpc2UgYmVoYXZlIGFzIEdNUCAgICAgICAgICAgKi8KKyNpZiBkZWZpbmVkIChfX01QQ19MSUJSQVJZX0JVSUxEKSAmJiBfX0dNUF9MSUJHTVBfRExMCisjZGVmaW5lIF9fTVBDX0RFQ0xTUEVDIF9fR01QX0RFQ0xTUEVDX0VYUE9SVAorI2Vsc2UKKyNkZWZpbmUgX19NUENfREVDTFNQRUMgX19HTVBfREVDTFNQRUMKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19hZGQgICAgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19hZGRfZnIgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wZnJfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfYWRkX3NpICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBsb25nIGludCwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2FkZF91aSAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zdWIgICAgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zdWJfZnIgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wZnJfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfZnJfc3ViICAgIChtcGNfcHRyLCBtcGZyX3NyY3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3N1Yl91aSAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY191aV91aV9zdWIgKG1wY19wdHIsIHVuc2lnbmVkIGxvbmcgaW50LCB1bnNpZ25lZCBsb25nIGludCwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX211bCAgICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX211bF9mciAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBmcl9zcmNwdHIsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19tdWxfdWkgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50LCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfbXVsX3NpICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBsb25nIGludCwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX211bF9pICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgaW50LCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc3FyICAgICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfZGl2ICAgICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfcG93ICAgICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfcG93X2ZyICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGZyX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3Bvd19sZCAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbG9uZyBkb3VibGUsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19wb3dfZCAgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIGRvdWJsZSwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3Bvd19zaSAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbG9uZywgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3Bvd191aSAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgdW5zaWduZWQgbG9uZywgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3Bvd196ICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXB6X3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2Rpdl9mciAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBmcl9zcmNwdHIsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19mcl9kaXYgICAgKG1wY19wdHIsIG1wZnJfc3JjcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfZGl2X3VpICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3VpX2RpdiAgICAobXBjX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIG1wY19zcmNwdHIsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19kaXZfMnVpICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50LCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfbXVsXzJ1aSAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2Rpdl8yc2kgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbG9uZyBpbnQsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19tdWxfMnNpICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIGxvbmcgaW50LCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfY29uaiAgICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfbmVnICAgICAgIChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfbm9ybSAgICAgIChtcGZyX3B0ciwgbXBjX3NyY3B0ciwgbXBmcl9ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19hYnMgICAgICAgKG1wZnJfcHRyLCBtcGNfc3JjcHRyLCBtcGZyX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NxcnQgICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldCAgICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF9kICAgICAobXBjX3B0ciwgZG91YmxlLCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X2RfZCAgIChtcGNfcHRyLCBkb3VibGUsIGRvdWJsZSwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF9sZCAgICAobXBjX3B0ciwgbG9uZyBkb3VibGUsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zZXRfbGRfbGQgKG1wY19wdHIsIGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF9mICAgICAobXBjX3B0ciwgbXBmX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF9mX2YgICAobXBjX3B0ciwgbXBmX3NyY3B0ciwgbXBmX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF9mciAgICAobXBjX3B0ciwgbXBmcl9zcmNwdHIsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zZXRfZnJfZnIgKG1wY19wdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF9xICAgICAobXBjX3B0ciwgbXBxX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF9xX3EgICAobXBjX3B0ciwgbXBxX3NyY3B0ciwgbXBxX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF9zaSAgICAobXBjX3B0ciwgbG9uZyBpbnQsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zZXRfc2lfc2kgKG1wY19wdHIsIGxvbmcgaW50LCBsb25nIGludCwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF91aSAgICAobXBjX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zZXRfdWlfdWkgKG1wY19wdHIsIHVuc2lnbmVkIGxvbmcgaW50LCB1bnNpZ25lZCBsb25nIGludCwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF96ICAgICAobXBjX3B0ciwgbXB6X3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF96X3ogICAobXBjX3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIHZvaWQgbXBjX3N3YXAgICAgICAobXBjX3B0ciwgbXBjX3B0cik7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19mbWEgICAgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19zcmNwdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCk7CisKK19fTVBDX0RFQ0xTUEVDIHZvaWQgbXBjX3NldF9uYW4gICAobXBjX3B0cik7CisKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3JlYWwgICAgICAobXBmcl9wdHIsIG1wY19zcmNwdHIsIG1wZnJfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfaW1hZyAgICAgIChtcGZyX3B0ciwgbXBjX3NyY3B0ciwgbXBmcl9ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19hcmcgICAgICAgKG1wZnJfcHRyLCBtcGNfc3JjcHRyLCBtcGZyX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3Byb2ogICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2NtcCAgICAgICAobXBjX3NyY3B0ciwgbXBjX3NyY3B0cik7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19jbXBfc2lfc2kgKG1wY19zcmNwdHIsIGxvbmcgaW50LCBsb25nIGludCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19leHAgICAgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19sb2cgICAgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19sb2cxMCAgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zaW4gICAgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19jb3MgICAgICAgKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zaW5fY29zICAgKG1wY19wdHIsIG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3RhbiAgICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NpbmggICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2Nvc2ggICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3RhbmggICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2FzaW4gICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2Fjb3MgICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2F0YW4gICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2FzaW5oICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2Fjb3NoICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2F0YW5oICAgICAobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIHZvaWQgbXBjX2NsZWFyICAgICAobXBjX3B0cik7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY191cmFuZG9tICAgKG1wY19wdHIsIGdtcF9yYW5kc3RhdGVfdCk7CitfX01QQ19ERUNMU1BFQyB2b2lkIG1wY19pbml0MiAgICAgKG1wY19wdHIsIG1wZnJfcHJlY190KTsKK19fTVBDX0RFQ0xTUEVDIHZvaWQgbXBjX2luaXQzICAgICAobXBjX3B0ciwgbXBmcl9wcmVjX3QsIG1wZnJfcHJlY190KTsKK19fTVBDX0RFQ0xTUEVDIG1wZnJfcHJlY190IG1wY19nZXRfcHJlYyAobXBjX3NyY3B0ciB4KTsKK19fTVBDX0RFQ0xTUEVDIHZvaWQgbXBjX2dldF9wcmVjMiAobXBmcl9wcmVjX3QgKnByLCBtcGZyX3ByZWNfdCAqcGksIG1wY19zcmNwdHIgeCk7CitfX01QQ19ERUNMU1BFQyB2b2lkIG1wY19zZXRfcHJlYyAgKG1wY19wdHIsIG1wZnJfcHJlY190KTsKK19fTVBDX0RFQ0xTUEVDIGNvbnN0IGNoYXIgKiBtcGNfZ2V0X3ZlcnNpb24gKHZvaWQpOworCitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zdHJ0b2MgICAgKG1wY19wdHIsIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50LCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X3N0ciAgIChtcGNfcHRyLCBjb25zdCBjaGFyICosIGludCwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGNoYXIgKiBtcGNfZ2V0X3N0ciAoaW50LCBzaXplX3QsIG1wY19zcmNwdHIsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyB2b2lkIG1wY19mcmVlX3N0ciAgKGNoYXIgKik7CisKKy8qIGRlY2xhcmUgY2VydGFpbiBmdW5jdGlvbnMgb25seSBpZiBhcHByb3ByaWF0ZSBoZWFkZXJzIGhhdmUgYmVlbiBpbmNsdWRlZCAqLworI2lmZGVmIF9NUENfSF9IQVZFX0lOVE1BWF9UCitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zZXRfc2ogICAgKG1wY19wdHIsIGludG1heF90LCBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X3VqICAgIChtcGNfcHRyLCB1aW50bWF4X3QsICBtcGNfcm5kX3QpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X3NqX3NqIChtcGNfcHRyLCBpbnRtYXhfdCwgaW50bWF4X3QsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zZXRfdWpfdWogKG1wY19wdHIsIHVpbnRtYXhfdCwgdWludG1heF90LCBtcGNfcm5kX3QpOworI2VuZGlmCisKKyNpZmRlZiBfQ29tcGxleF9JCitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zZXRfZGMgICAgKG1wY19wdHIsIGRvdWJsZSBfQ29tcGxleCwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF9sZGMgICAobXBjX3B0ciwgbG9uZyBkb3VibGUgX0NvbXBsZXgsIG1wY19ybmRfdCk7CitfX01QQ19ERUNMU1BFQyBkb3VibGUgX0NvbXBsZXggbXBjX2dldF9kYyAobXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIGxvbmcgZG91YmxlIF9Db21wbGV4IG1wY19nZXRfbGRjIChtcGNfc3JjcHRyLCBtcGNfcm5kX3QpOworI2VuZGlmCisKKyNpZmRlZiBfR01QX0hfSEFWRV9GSUxFCitfX01QQ19ERUNMU1BFQyBpbnQgbXBjX2lucF9zdHIgICAgKG1wY19wdHIsIEZJTEUgKiwgc2l6ZV90ICosIGludCwgbXBjX3JuZF90KTsKK19fTVBDX0RFQ0xTUEVDIHNpemVfdCBtcGNfb3V0X3N0ciAoRklMRSAqLCBpbnQsIHNpemVfdCwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2RlZmluZSBtcGNfcmVhbHJlZih4KSAoKHgpLT5yZSkKKyNkZWZpbmUgbXBjX2ltYWdyZWYoeCkgKCh4KS0+aW0pCisKKyNkZWZpbmUgbXBjX2NtcF9zaSh4LCB5KSBcCisgKCBtcGNfY21wX3NpX3NpICgoeCksICh5KSwgMGwpICkKKyNkZWZpbmUgbXBjX3VpX3N1Yih4LCB5LCB6LCByKSBtcGNfdWlfdWlfc3ViICh4LCB5LCAwdWwsIHosIHIpCisKKy8qCisgICBEZWZpbmUgYSBmYWtlIG1wZnJfc2V0X2ZyIHNvIHRoYXQsIGZvciBpbnN0YW5jZSwgbXBjX3NldF9mcl96IHdvdWxkCisgICBiZSBkZWZpbmVkIGFzIGZvbGxvd3M6CisgICBtcGNfc2V0X2ZyX3ogKG1wY190IHJvcCwgbXBmcl90IHgsIG1wel90IHksIG1wY19ybmRfdCBybmQpCisgICAgICAgTVBDX1NFVF9YX1kgKGZyLCB6LCByb3AsIHgsIHksIHJuZCkKKyovCisjaWZuZGVmIG1wZnJfc2V0X2ZyCisjZGVmaW5lIG1wZnJfc2V0X2ZyIG1wZnJfc2V0CisjZW5kaWYKKyNkZWZpbmUgTVBDX1NFVF9YX1kocmVhbF90LCBpbWFnX3QsIHosIHJlYWxfdmFsdWUsIGltYWdfdmFsdWUsIHJuZCkgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX2luZXhfcmUsIF9pbmV4X2ltOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfaW5leF9yZSA9IChtcGZyX3NldF8gIyMgcmVhbF90KSAobXBjX3JlYWxyZWYgKHopLCAocmVhbF92YWx1ZSksIE1QQ19STkRfUkUgKHJuZCkpOyBcCisgICAgX2luZXhfaW0gPSAobXBmcl9zZXRfICMjIGltYWdfdCkgKG1wY19pbWFncmVmICh6KSwgKGltYWdfdmFsdWUpLCBNUENfUk5EX0lNIChybmQpKTsgXAorICAgIHJldHVybiBNUENfSU5FWCAoX2luZXhfcmUsIF9pbmV4X2ltKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNlbmRpZiAvKiBpZm5kZWYgX19NUENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcGYybXBmci5oIGIvaW5jbHVkZS9tcGYybXBmci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NzVhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21wZjJtcGZyLmgKQEAgLTAsMCArMSwxNzUgQEAKKy8qIG1wZjJtcGZyLmggLS0gQ29tcGF0aWJpbGl0eSBpbmNsdWRlIGZpbGUgd2l0aCBtcGYuCisKK0NvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorQ29udHJpYnV0ZWQgYnkgdGhlIEFyaUMgYW5kIENhcmFtZWwgcHJvamVjdHMsIElOUklBLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QRlIgTGlicmFyeS4KKworVGhlIEdOVSBNUEZSIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUEZSIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBHTlUgTVBGUiBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MRVNTRVIuICBJZiBub3QsIHNlZQoraHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLyBvciB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gKi8KKworI2lmbmRlZiBfX01QRlJfRlJPTV9NUEZfXworI2RlZmluZSBfX01QRlJfRlJPTV9NUEZfXworCisvKiB0eXBlcyAqLworI2RlZmluZSBtcGZfdCBtcGZyX3QKKyNkZWZpbmUgbXBmX3NyY3B0ciBtcGZyX3NyY3B0cgorI2RlZmluZSBtcGZfcHRyIG1wZnJfcHRyCisKKy8qIEdldCBjdXJyZW50IFJvdW5kaW5nIE1vZGUgKi8KKyNpZm5kZWYgTVBGUl9ERUZBVUxUX1JORAorIyBkZWZpbmUgTVBGUl9ERUZBVUxUX1JORCBtcGZyX2dldF9kZWZhdWx0X3JvdW5kaW5nX21vZGUgKCkKKyNlbmRpZgorCisvKiBtcGZfaW5pdCBpbml0YWxpemVzIGF0IDAgKi8KKyN1bmRlZiBtcGZfaW5pdAorI2RlZmluZSBtcGZfaW5pdCh4KSBtcGZyX2luaXRfc2V0X3VpICgoeCksIDAsIE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2luaXQyCisjZGVmaW5lIG1wZl9pbml0Mih4LHApIChtcGZyX2luaXQyKCh4KSwocCkpLCBtcGZyX3NldF91aSAoKHgpLCAwLCBNUEZSX0RFRkFVTFRfUk5EKSkKKworLyogZnVuY3Rpb25zIHdoaWNoIGRvbid0IHRha2UgYXMgYXJndW1lbnQgdGhlIHJvdW5kaW5nIG1vZGUgKi8KKyN1bmRlZiBtcGZfY2VpbAorI2RlZmluZSBtcGZfY2VpbCBtcGZyX2NlaWwKKyN1bmRlZiBtcGZfY2xlYXIKKyNkZWZpbmUgbXBmX2NsZWFyIG1wZnJfY2xlYXIKKyN1bmRlZiBtcGZfY21wCisjZGVmaW5lIG1wZl9jbXAgbXBmcl9jbXAKKyN1bmRlZiBtcGZfY21wX3NpCisjZGVmaW5lIG1wZl9jbXBfc2kgbXBmcl9jbXBfc2kKKyN1bmRlZiBtcGZfY21wX3VpCisjZGVmaW5lIG1wZl9jbXBfdWkgbXBmcl9jbXBfdWkKKyN1bmRlZiBtcGZfY21wX2QKKyNkZWZpbmUgbXBmX2NtcF9kIG1wZnJfY21wX2QKKyN1bmRlZiBtcGZfZXEKKyNkZWZpbmUgbXBmX2VxIG1wZnJfZXEKKyN1bmRlZiBtcGZfZmxvb3IKKyNkZWZpbmUgbXBmX2Zsb29yIG1wZnJfZmxvb3IKKyN1bmRlZiBtcGZfZ2V0X3ByZWMKKyNkZWZpbmUgbXBmX2dldF9wcmVjIG1wZnJfZ2V0X3ByZWMKKyN1bmRlZiBtcGZfaW50ZWdlcl9wCisjZGVmaW5lIG1wZl9pbnRlZ2VyX3AgbXBmcl9pbnRlZ2VyX3AKKyN1bmRlZiBtcGZfcmFuZG9tMgorI2RlZmluZSBtcGZfcmFuZG9tMiBtcGZyX3JhbmRvbTIKKyN1bmRlZiBtcGZfc2V0X2RlZmF1bHRfcHJlYworI2RlZmluZSBtcGZfc2V0X2RlZmF1bHRfcHJlYyBtcGZyX3NldF9kZWZhdWx0X3ByZWMKKyN1bmRlZiBtcGZfZ2V0X2RlZmF1bHRfcHJlYworI2RlZmluZSBtcGZfZ2V0X2RlZmF1bHRfcHJlYyBtcGZyX2dldF9kZWZhdWx0X3ByZWMKKyN1bmRlZiBtcGZfc2V0X3ByZWMKKyNkZWZpbmUgbXBmX3NldF9wcmVjIG1wZnJfc2V0X3ByZWMKKyN1bmRlZiBtcGZfc2V0X3ByZWNfcmF3CisjZGVmaW5lIG1wZl9zZXRfcHJlY19yYXcoeCxwKSBtcGZyX3ByZWNfcm91bmQoeCxwLE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX3RydW5jCisjZGVmaW5lIG1wZl90cnVuYyBtcGZyX3RydW5jCisjdW5kZWYgbXBmX3NnbgorI2RlZmluZSBtcGZfc2duIG1wZnJfc2duCisjdW5kZWYgbXBmX3N3YXAKKyNkZWZpbmUgbXBmX3N3YXAgbXBmcl9zd2FwCisjdW5kZWYgbXBmX2R1bXAKKyNkZWZpbmUgbXBmX2R1bXAgbXBmcl9kdW1wCisKKy8qIGZ1bmN0aW9ucyB3aGljaCB0YWtlIGFzIGFyZ3VtZW50IHRoZSByb3VuZGluZyBtb2RlICovCisjdW5kZWYgbXBmX2FicworI2RlZmluZSBtcGZfYWJzKHgseSkgbXBmcl9hYnMoeCx5LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2FkZAorI2RlZmluZSBtcGZfYWRkKHgseSx6KSBtcGZyX2FkZCh4LHkseixNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9hZGRfdWkKKyNkZWZpbmUgbXBmX2FkZF91aSh4LHkseikgbXBmcl9hZGRfdWkoeCx5LHosTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfZGl2CisjZGVmaW5lIG1wZl9kaXYoeCx5LHopIG1wZnJfZGl2KHgseSx6LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2Rpdl91aQorI2RlZmluZSBtcGZfZGl2X3VpKHgseSx6KSBtcGZyX2Rpdl91aSh4LHkseixNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9kaXZfMmV4cAorI2RlZmluZSBtcGZfZGl2XzJleHAoeCx5LHopIG1wZnJfZGl2XzJleHAoeCx5LHosTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfZml0c19zbG9uZ19wCisjZGVmaW5lIG1wZl9maXRzX3Nsb25nX3AoeCkgbXBmcl9maXRzX3Vsb25nX3AoeCxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9maXRzX3Vsb25nX3AKKyNkZWZpbmUgbXBmX2ZpdHNfdWxvbmdfcCh4KSBtcGZyX2ZpdHNfdWxvbmdfcCh4LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2ZpdHNfc2ludF9wCisjZGVmaW5lIG1wZl9maXRzX3NpbnRfcCh4KSBtcGZyX2ZpdHNfdWludF9wKHgsTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfZml0c191aW50X3AKKyNkZWZpbmUgbXBmX2ZpdHNfdWludF9wKHgpIG1wZnJfZml0c191aW50X3AoeCxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9maXRzX3NzaG9ydF9wCisjZGVmaW5lIG1wZl9maXRzX3NzaG9ydF9wKHgpIG1wZnJfZml0c191c2hvcnRfcCh4LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2ZpdHNfdXNob3J0X3AKKyNkZWZpbmUgbXBmX2ZpdHNfdXNob3J0X3AoeCkgbXBmcl9maXRzX3VzaG9ydF9wKHgsTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfZ2V0X3N0cgorI2RlZmluZSBtcGZfZ2V0X3N0cih4LHkseix0LHUpIG1wZnJfZ2V0X3N0cih4LHkseix0LHUsTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfZ2V0X2QKKyNkZWZpbmUgbXBmX2dldF9kKHgpIG1wZnJfZ2V0X2QoeCxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9nZXRfZF8yZXhwCisjZGVmaW5lIG1wZl9nZXRfZF8yZXhwKGUseCkgbXBmcl9nZXRfZF8yZXhwKGUseCxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9nZXRfdWkKKyNkZWZpbmUgbXBmX2dldF91aSh4KSBtcGZyX2dldF91aSh4LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2dldF9zaQorI2RlZmluZSBtcGZfZ2V0X3NpKHgpIG1wZnJfZ2V0X3VpKHgsTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfaW5wX3N0cgorI2RlZmluZSBtcGZfaW5wX3N0cih4LHkseikgbXBmcl9pbnBfc3RyKHgseSx6LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX3NldF9zdHIKKyNkZWZpbmUgbXBmX3NldF9zdHIoeCx5LHopIG1wZnJfc2V0X3N0cih4LHkseixNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9pbml0X3NldAorI2RlZmluZSBtcGZfaW5pdF9zZXQoeCx5KSBtcGZyX2luaXRfc2V0KHgseSxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9pbml0X3NldF9kCisjZGVmaW5lIG1wZl9pbml0X3NldF9kKHgseSkgbXBmcl9pbml0X3NldF9kKHgseSxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9pbml0X3NldF9zaQorI2RlZmluZSBtcGZfaW5pdF9zZXRfc2koeCx5KSBtcGZyX2luaXRfc2V0X3NpKHgseSxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9pbml0X3NldF9zdHIKKyNkZWZpbmUgbXBmX2luaXRfc2V0X3N0cih4LHkseikgbXBmcl9pbml0X3NldF9zdHIoeCx5LHosTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfaW5pdF9zZXRfdWkKKyNkZWZpbmUgbXBmX2luaXRfc2V0X3VpKHgseSkgbXBmcl9pbml0X3NldF91aSh4LHksTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfbXVsCisjZGVmaW5lIG1wZl9tdWwoeCx5LHopIG1wZnJfbXVsKHgseSx6LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX211bF8yZXhwCisjZGVmaW5lIG1wZl9tdWxfMmV4cCh4LHkseikgbXBmcl9tdWxfMmV4cCh4LHkseixNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9tdWxfdWkKKyNkZWZpbmUgbXBmX211bF91aSh4LHkseikgbXBmcl9tdWxfdWkoeCx5LHosTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfbmVnCisjZGVmaW5lIG1wZl9uZWcoeCx5KSBtcGZyX25lZyh4LHksTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfb3V0X3N0cgorI2RlZmluZSBtcGZfb3V0X3N0cih4LHkseix0KSBtcGZyX291dF9zdHIoeCx5LHosdCxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9wb3dfdWkKKyNkZWZpbmUgbXBmX3Bvd191aSh4LHkseikgbXBmcl9wb3dfdWkoeCx5LHosTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfcmVsZGlmZgorI2RlZmluZSBtcGZfcmVsZGlmZih4LHkseikgbXBmcl9yZWxkaWZmKHgseSx6LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX3NldAorI2RlZmluZSBtcGZfc2V0KHgseSkgbXBmcl9zZXQoeCx5LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX3NldF9kCisjZGVmaW5lIG1wZl9zZXRfZCh4LHkpIG1wZnJfc2V0X2QoeCx5LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX3NldF9xCisjZGVmaW5lIG1wZl9zZXRfcSh4LHkpIG1wZnJfc2V0X3EoeCx5LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX3NldF9zaQorI2RlZmluZSBtcGZfc2V0X3NpKHgseSkgbXBmcl9zZXRfc2koeCx5LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX3NldF91aQorI2RlZmluZSBtcGZfc2V0X3VpKHgseSkgbXBmcl9zZXRfdWkoeCx5LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX3NldF96CisjZGVmaW5lIG1wZl9zZXRfeih4LHkpIG1wZnJfc2V0X3ooeCx5LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX3NxcnQKKyNkZWZpbmUgbXBmX3NxcnQoeCx5KSBtcGZyX3NxcnQoeCx5LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX3NxcnRfdWkKKyNkZWZpbmUgbXBmX3NxcnRfdWkoeCx5KSBtcGZyX3NxcnRfdWkoeCx5LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX3N1YgorI2RlZmluZSBtcGZfc3ViKHgseSx6KSBtcGZyX3N1Yih4LHkseixNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9zdWJfdWkKKyNkZWZpbmUgbXBmX3N1Yl91aSh4LHkseikgbXBmcl9zdWJfdWkoeCx5LHosTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfdWlfZGl2CisjZGVmaW5lIG1wZl91aV9kaXYoeCx5LHopIG1wZnJfdWlfZGl2KHgseSx6LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX3VpX3N1YgorI2RlZmluZSBtcGZfdWlfc3ViKHgseSx6KSBtcGZyX3VpX3N1Yih4LHkseixNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl91cmFuZG9tYgorI2RlZmluZSBtcGZfdXJhbmRvbWIoeCx5LG4pIG1wZnJfdXJhbmRvbWIoeCx5KQorCisjdW5kZWYgbXB6X3NldF9mCisjZGVmaW5lIG1wel9zZXRfZih6LGYpIG1wZnJfZ2V0X3ooeixmLE1QRlJfREVGQVVMVF9STkQpCisKKyNlbmRpZiAvKiBfX01QRlJfRlJPTV9NUEZfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcGZyLmggYi9pbmNsdWRlL21wZnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTlhZDI3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tcGZyLmgKQEAgLTAsMCArMSwxMDU5IEBACisvKiBtcGZyLmggLS0gSW5jbHVkZSBmaWxlIGZvciBtcGZyLgorCitDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK0NvbnRyaWJ1dGVkIGJ5IHRoZSBBcmlDIGFuZCBDYXJhbWVsIHByb2plY3RzLCBJTlJJQS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUEZSIExpYnJhcnkuCisKK1RoZSBHTlUgTVBGUiBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK29wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVBGUiBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgR05VIE1QRlIgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTEVTU0VSLiAgSWYgbm90LCBzZWUKK2h0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8gb3Igd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuICovCisKKyNpZm5kZWYgX19NUEZSX0gKKyNkZWZpbmUgX19NUEZSX0gKKworLyogRGVmaW5lIE1QRlIgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgTVBGUl9WRVJTSU9OX01BSk9SIDMKKyNkZWZpbmUgTVBGUl9WRVJTSU9OX01JTk9SIDEKKyNkZWZpbmUgTVBGUl9WRVJTSU9OX1BBVENITEVWRUwgMQorI2RlZmluZSBNUEZSX1ZFUlNJT05fU1RSSU5HICIzLjEuMSIKKworLyogTWFjcm9zIGRlYWxpbmcgd2l0aCBNUEZSIFZFUlNJT04gKi8KKyNkZWZpbmUgTVBGUl9WRVJTSU9OX05VTShhLGIsYykgKCgoYSkgPDwgMTZMKSB8ICgoYikgPDwgOCkgfCAoYykpCisjZGVmaW5lIE1QRlJfVkVSU0lPTiBcCitNUEZSX1ZFUlNJT05fTlVNKE1QRlJfVkVSU0lPTl9NQUpPUixNUEZSX1ZFUlNJT05fTUlOT1IsTVBGUl9WRVJTSU9OX1BBVENITEVWRUwpCisKKy8qIENoZWNrIGlmIEdNUCBpcyBpbmNsdWRlZCwgYW5kIHRyeSB0byBpbmNsdWRlIGl0IChXb3JrcyB3aXRoIGxvY2FsIEdNUCkgKi8KKyNpZm5kZWYgX19HTVBfSF9fCisjIGluY2x1ZGUgPGdtcC5oPgorI2VuZGlmCisKKy8qIEdNUCdzIGludGVybmFsIF9fZ21wX2NvbnN0IG1hY3JvIGhhcyBiZWVuIHJlbW92ZWQgb24gMjAxMi0wMy0wNDoKKyAgICAgaHR0cDovL2dtcGxpYi5vcmc6ODAwMC9nbXAvcmV2L2QyODdjZmFmNjczMgorICAgY29uc3QgaXMgc3RhbmRhcmQgYW5kIG5vdyBhc3N1bWVkIHRvIGJlIGF2YWlsYWJsZS4gSWYgdGhlIF9fZ21wX2NvbnN0CisgICBkZWZpbml0aW9uIGlzIG5vIGxvbmdlciBwcmVzZW50IGluIEdNUCwgdGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IEdNUAorICAgYXNzdW1lcyB0aGF0IGNvbnN0IGlzIGF2YWlsYWJsZTsgdGh1cyBsZXQncyBkZWZpbmUgaXQgdG8gY29uc3QuCisgICBOb3RlOiB0aGlzIGlzIGEgdGVtcG9yYXJ5IGZpeCB0aGF0IGNhbiBiZSBiYWNrcG9ydGVkIHRvIHByZXZpb3VzIE1QRlIKKyAgIHZlcnNpb25zLiBJbiB0aGUgZnV0dXJlLCBfX2dtcF9jb25zdCBzaG91bGQgYmUgcmVwbGFjZWQgYnkgY29uc3QgbGlrZQorICAgaW4gR01QLiAqLworI2lmbmRlZiBfX2dtcF9jb25zdAorIyBkZWZpbmUgX19nbXBfY29uc3QgY29uc3QKKyNlbmRpZgorCisvKiBBdm9pZCBzb21lIHByb2JsZW1zIHdpdGggbWFjcm8gZXhwYW5zaW9uIGlmIHRoZSB1c2VyIGRlZmluZXMgbWFjcm9zCisgICB3aXRoIHRoZSBzYW1lIG5hbWUgYXMga2V5d29yZHMuIEJ5IGNvbnZlbnRpb24sIGlkZW50aWZpZXJzIGFuZCBtYWNybworICAgbmFtZXMgc3RhcnRpbmcgd2l0aCBtcGZyXyBhcmUgcmVzZXJ2ZWQgYnkgTVBGUi4gKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgICAgIG1wZnJfdm9pZDsKK3R5cGVkZWYgaW50ICAgICAgICAgICAgIG1wZnJfaW50OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgbXBmcl91aW50OwordHlwZWRlZiBsb25nICAgICAgICAgICAgbXBmcl9sb25nOwordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgbXBmcl91bG9uZzsKK3R5cGVkZWYgc2l6ZV90ICAgICAgICAgIG1wZnJfc2l6ZV90OworCisvKiBEZWZpbml0aW9uIG9mIHJvdW5kaW5nIG1vZGVzIChET04nVCBVU0UgTVBGUl9STkROQSEpLgorICAgV2FybmluZyEgQ2hhbmdpbmcgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZW51bSBzaG91bGQgYmUgc2VlbiBhcyBhbgorICAgaW50ZXJmYWNlIGNoYW5nZSBzaW5jZSB0aGUgb2xkIGFuZCB0aGUgbmV3IHR5cGVzIGFyZSBub3QgY29tcGF0aWJsZQorICAgKHRoZSBpbnRlZ2VyIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBlbnVtZXJhdGVkIHR5cGUgY2FuIGV2ZW4gY2hhbmdlLAorICAgc2VlIElTTyBDOTksIDYuNy4yLjIjNCksIGFuZCBpbiBNYWtlZmlsZS5hbSwgQUdFIHNob3VsZCBiZSBzZXQgdG8gMC4KKworICAgTVBGUl9STkRVIG11c3QgYXBwZWFyIGp1c3QgYmVmb3JlIE1QRlJfUk5ERCAoc2VlCisgICBNUEZSX0lTX1JORFVURVNUX09SX1JOREROT1RURVNUIGluIG1wZnItaW1wbC5oKS4KKworICAgTVBGUl9STkRGIGhhcyBiZWVuIGFkZGVkLCB0aG91Z2ggbm90IGltcGxlbWVudGVkIHlldCwgaW4gb3JkZXIgdG8gYXZvaWQKKyAgIHRvIGJyZWFrIHRoZSBBQkkgb25jZSBmYWl0aGZ1bCByb3VuZGluZyBnZXRzIGltcGxlbWVudGVkLgorCisgICBJZiB5b3UgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgcm91bmRpbmcgbW9kZXMsIHBsZWFzZSB1cGRhdGUgdGhlIHJvdXRpbmVzCisgICBpbiB0ZXhjZXB0aW9ucy5jIHdoaWNoIGFzc3VtZSAwPVJORE4sIDE9Uk5EWiwgMj1STkRVLCAzPVJOREQsIDQ9Uk5EQS4KKyovCit0eXBlZGVmIGVudW0geworICBNUEZSX1JORE49MCwgIC8qIHJvdW5kIHRvIG5lYXJlc3QsIHdpdGggdGllcyB0byBldmVuICovCisgIE1QRlJfUk5EWiwgICAgLyogcm91bmQgdG93YXJkIHplcm8gKi8KKyAgTVBGUl9STkRVLCAgICAvKiByb3VuZCB0b3dhcmQgK0luZiAqLworICBNUEZSX1JOREQsICAgIC8qIHJvdW5kIHRvd2FyZCAtSW5mICovCisgIE1QRlJfUk5EQSwgICAgLyogcm91bmQgYXdheSBmcm9tIHplcm8gKi8KKyAgTVBGUl9STkRGLCAgICAvKiBmYWl0aGZ1bCByb3VuZGluZyAobm90IGltcGxlbWVudGVkIHlldCkgKi8KKyAgTVBGUl9STkROQT0tMSAvKiByb3VuZCB0byBuZWFyZXN0LCB3aXRoIHRpZXMgYXdheSBmcm9tIHplcm8gKG1wZnJfcm91bmQpICovCit9IG1wZnJfcm5kX3Q7CisKKy8qIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBNUEZSIDIuNC54IGFuZCBiZWZvcmUgKi8KKyNkZWZpbmUgR01QX1JORE4gTVBGUl9STkROCisjZGVmaW5lIEdNUF9STkRaIE1QRlJfUk5EWgorI2RlZmluZSBHTVBfUk5EVSBNUEZSX1JORFUKKyNkZWZpbmUgR01QX1JOREQgTVBGUl9STkRECisKKy8qIE5vdGU6IFdpdGggdGhlIGZvbGxvd2luZyBkZWZhdWx0IGNob2ljZXMgZm9yIF9NUEZSX1BSRUNfRk9STUFUIGFuZAorICAgX01QRlJfRVhQX0ZPUk1BVCwgbXBmcl9leHBfdCB3aWxsIGJlIHRoZSBzYW1lIGFzIFttcF9leHBfdF0gKGF0IGxlYXN0CisgICB1cCB0byBHTVAgNSkuICovCisKKy8qIERlZmluZSBwcmVjaXNpb246IDEgKHNob3J0KSwgMiAoaW50KSBvciAzIChsb25nKSAoRE9OJ1QgVVNFIElUISkgKi8KKyNpZm5kZWYgX01QRlJfUFJFQ19GT1JNQVQKKyMgaWYgX19HTVBfTVBfU0laRV9UX0lOVCA9PSAxCisjICBkZWZpbmUgX01QRlJfUFJFQ19GT1JNQVQgMgorIyBlbHNlCisjICBkZWZpbmUgX01QRlJfUFJFQ19GT1JNQVQgMworIyBlbmRpZgorI2VuZGlmCisKKy8qIERlZmluZSBleHBvbmVudDogMSAoc2hvcnQpLCAyIChpbnQpLCAzIChsb25nKSBvciA0IChpbnRtYXhfdCkKKyAgIChET04nVCBVU0UgSVQhKSAqLworI2lmbmRlZiBfTVBGUl9FWFBfRk9STUFUCisjIGRlZmluZSBfTVBGUl9FWFBfRk9STUFUIF9NUEZSX1BSRUNfRk9STUFUCisjZW5kaWYKKworI2lmIF9NUEZSX1BSRUNfRk9STUFUID4gX01QRlJfRVhQX0ZPUk1BVAorIyBlcnJvciAibXBmcl9wcmVjX3QgbXVzdCBub3QgYmUgbGFyZ2VyIHRoYW4gbXBmcl9leHBfdCIKKyNlbmRpZgorCisvKiBMZXQncyBtYWtlIG1wZnJfcHJlY190IHNpZ25lZCBpbiBvcmRlciB0byBhdm9pZCBwcm9ibGVtcyBkdWUgdG8gdGhlCisgICB1c3VhbCBhcml0aG1ldGljIGNvbnZlcnNpb25zIHdoZW4gbWl4aW5nIG1wZnJfcHJlY190IGFuZCBtcGZyX2V4cF90CisgICBpbiBhbiBleHByZXNzaW9uIChmb3IgZXJyb3IgYW5hbHlzaXMpIGlmIGNhc3RzIGFyZSBmb3Jnb3R0ZW4uICovCisjaWYgICBfTVBGUl9QUkVDX0ZPUk1BVCA9PSAxCit0eXBlZGVmIHNob3J0IG1wZnJfcHJlY190OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBtcGZyX3VwcmVjX3Q7CisjZWxpZiBfTVBGUl9QUkVDX0ZPUk1BVCA9PSAyCit0eXBlZGVmIGludCAgIG1wZnJfcHJlY190OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICBtcGZyX3VwcmVjX3Q7CisjZWxpZiBfTVBGUl9QUkVDX0ZPUk1BVCA9PSAzCit0eXBlZGVmIGxvbmcgIG1wZnJfcHJlY190OwordHlwZWRlZiB1bnNpZ25lZCBsb25nICBtcGZyX3VwcmVjX3Q7CisjZWxzZQorIyBlcnJvciAiSW52YWxpZCBNUEZSIFByZWMgZm9ybWF0IgorI2VuZGlmCisKKy8qIERlZmluaXRpb24gb2YgcHJlY2lzaW9uIGxpbWl0cyB3aXRob3V0IG5lZWRpbmcgPGxpbWl0cy5oPiAqLworLyogTm90ZTogdGhlIGNhc3RzIGFsbG93cyB0aGUgZXhwcmVzc2lvbiB0byB5aWVsZCB0aGUgd2FudGVkIGJlaGF2aW9yCisgICBmb3IgX01QRlJfUFJFQ19GT1JNQVQgPT0gMSAoZHVlIHRvIGludGVnZXIgcHJvbW90aW9uIHJ1bGVzKS4gKi8KKyNkZWZpbmUgTVBGUl9QUkVDX01JTiAyCisjZGVmaW5lIE1QRlJfUFJFQ19NQVggKChtcGZyX3ByZWNfdCkoKG1wZnJfdXByZWNfdCkofihtcGZyX3VwcmVjX3QpMCk+PjEpKQorCisvKiBEZWZpbml0aW9uIG9mIHNpZ24gKi8KK3R5cGVkZWYgaW50ICAgICAgICAgIG1wZnJfc2lnbl90OworCisvKiBEZWZpbml0aW9uIG9mIHRoZSBleHBvbmVudC4gX01QRlJfRVhQX0ZPUk1BVCBtdXN0IGJlIGxhcmdlIGVub3VnaAorICAgc28gdGhhdCBtcGZyX2V4cF90IGhhcyBhdCBsZWFzdCAzMiBiaXRzLiAqLworI2lmICAgX01QRlJfRVhQX0ZPUk1BVCA9PSAxCit0eXBlZGVmIHNob3J0IG1wZnJfZXhwX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IG1wZnJfdWV4cF90OworI2VsaWYgX01QRlJfRVhQX0ZPUk1BVCA9PSAyCit0eXBlZGVmIGludCBtcGZyX2V4cF90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgbXBmcl91ZXhwX3Q7CisjZWxpZiBfTVBGUl9FWFBfRk9STUFUID09IDMKK3R5cGVkZWYgbG9uZyBtcGZyX2V4cF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIG1wZnJfdWV4cF90OworI2VsaWYgX01QRlJfRVhQX0ZPUk1BVCA9PSA0CisvKiBOb3RlOiBpbiB0aGlzIGNhc2UsIGludG1heF90IGFuZCB1aW50bWF4X3QgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZQorICAgdGhlIGluY2x1c2lvbiBvZiBtcGZyLmggKHdlIGRvIG5vdCBpbmNsdWRlIDxzdGRpbnQuaD4gaGVyZSBiZWNhdXNlCisgICBvZiBzb21lIG5vbi1JU08gQzk5IGltcGxlbWVudGF0aW9ucyB0aGF0IHN1cHBvcnQgdGhlc2UgdHlwZXMpLiAqLwordHlwZWRlZiBpbnRtYXhfdCBtcGZyX2V4cF90OwordHlwZWRlZiB1aW50bWF4X3QgbXBmcl91ZXhwX3Q7CisjZWxzZQorIyBlcnJvciAiSW52YWxpZCBNUEZSIEV4cCBmb3JtYXQiCisjZW5kaWYKKworLyogRGVmaW5pdGlvbiBvZiB0aGUgc3RhbmRhcmQgZXhwb25lbnQgbGltaXRzICovCisjZGVmaW5lIE1QRlJfRU1BWF9ERUZBVUxUICgobXBmcl9leHBfdCkgKCgobXBmcl91bG9uZykgMSA8PCAzMCkgLSAxKSkKKyNkZWZpbmUgTVBGUl9FTUlOX0RFRkFVTFQgKC0oTVBGUl9FTUFYX0RFRkFVTFQpKQorCisvKiBET04nVCBVU0UgVEhJUyEgKEZvciBNUEZSLXB1YmxpYyBtYWNyb3Mgb25seSwgc2VlIGJlbG93LikKKyAgIFRoZSBtcGZyX3NnbiBtYWNybyB1c2VzIHRoZSBmYWN0IHRoYXQgX19NUEZSX0VYUF9OQU4gYW5kIF9fTVBGUl9FWFBfWkVSTworICAgYXJlIHRoZSBzbWFsbGVzdCB2YWx1ZXMuICovCisjZGVmaW5lIF9fTVBGUl9FWFBfTUFYICgobXBmcl9leHBfdCkgKCgobXBmcl91ZXhwX3QpIC0xKSA+PiAxKSkKKyNkZWZpbmUgX19NUEZSX0VYUF9OQU4gICgxIC0gX19NUEZSX0VYUF9NQVgpCisjZGVmaW5lIF9fTVBGUl9FWFBfWkVSTyAoMCAtIF9fTVBGUl9FWFBfTUFYKQorI2RlZmluZSBfX01QRlJfRVhQX0lORiAgKDIgLSBfX01QRlJfRVhQX01BWCkKKworLyogRGVmaW5pdGlvbiBvZiB0aGUgbWFpbiBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgbXBmcl9wcmVjX3QgIF9tcGZyX3ByZWM7CisgIG1wZnJfc2lnbl90ICBfbXBmcl9zaWduOworICBtcGZyX2V4cF90ICAgX21wZnJfZXhwOworICBtcF9saW1iX3QgICAqX21wZnJfZDsKK30gX19tcGZyX3N0cnVjdDsKKworLyogQ29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzIHR5cGVzIG9mIE1QRlIgKi8KKyNpZm5kZWYgbXBfcm5kX3QKKyMgZGVmaW5lIG1wX3JuZF90ICBtcGZyX3JuZF90CisjZW5kaWYKKyNpZm5kZWYgbXBfcHJlY190CisjIGRlZmluZSBtcF9wcmVjX3QgbXBmcl9wcmVjX3QKKyNlbmRpZgorCisvKgorICAgVGhlIHJlcHJlc2VudGVkIG51bWJlciBpcworICAgICAgX3NpZ24qKF9kW2stMV0vQitfZFtrLTJdL0JeMisuLi4rX2RbMF0vQl5rKSoyXl9leHAKKyAgIHdoZXJlIGs9Y2VpbChfbXBfcHJlYy9HTVBfTlVNQl9CSVRTKSBhbmQgQj0yXkdNUF9OVU1CX0JJVFMuCisKKyAgIEZvciB0aGUgbXNiIChtb3N0IHNpZ25pZmljYW50IGJpdCkgbm9ybWFsaXplZCByZXByZXNlbnRhdGlvbiwgd2UgbXVzdCBoYXZlCisgICAgICBfZFtrLTFdPj1CLzIsIHVubGVzcyB0aGUgbnVtYmVyIGlzIHNpbmd1bGFyLgorCisgICBXZSBtdXN0IGFsc28gaGF2ZSB0aGUgbGFzdCBrKkdNUF9OVU1CX0JJVFMtX3ByZWMgYml0cyBzZXQgdG8gemVyby4KKyovCisKK3R5cGVkZWYgX19tcGZyX3N0cnVjdCBtcGZyX3RbMV07Cit0eXBlZGVmIF9fbXBmcl9zdHJ1Y3QgKm1wZnJfcHRyOwordHlwZWRlZiBfX2dtcF9jb25zdCBfX21wZnJfc3RydWN0ICptcGZyX3NyY3B0cjsKKworLyogRm9yIHRob3NlIHdobyBuZWVkIGEgZGlyZWN0IGFuZCBmYXN0IGFjY2VzcyB0byB0aGUgc2lnbiBmaWVsZC4KKyAgIEhvd2V2ZXIgaXQgaXMgbm90IGluIHRoZSBBUEksIHRodXMgdXNlIGl0IGF0IHlvdXIgb3duIHJpc2s6IGl0IG1pZ2h0CisgICBub3QgYmUgc3VwcG9ydGVkLCBvciBjaGFuZ2UgbmFtZSwgaW4gZnVydGhlciB2ZXJzaW9ucyEKKyAgIFVuZm9ydHVuYXRlbHksIGl0IG11c3QgYmUgZGVmaW5lZCBoZXJlIChpbnN0ZWFkIG9mIE1QRlIncyBpbnRlcm5hbAorICAgaGVhZGVyIGZpbGUgbXBmci1pbXBsLmgpIGJlY2F1c2UgaXQgaXMgdXNlZCBieSBzb21lIG1hY3JvcyBiZWxvdy4KKyovCisjZGVmaW5lIE1QRlJfU0lHTih4KSAoKHgpLT5fbXBmcl9zaWduKQorCisvKiBTdGFjayBpbnRlcmZhY2UgKi8KK3R5cGVkZWYgZW51bSB7CisgIE1QRlJfTkFOX0tJTkQgPSAwLAorICBNUEZSX0lORl9LSU5EID0gMSwgTVBGUl9aRVJPX0tJTkQgPSAyLCBNUEZSX1JFR1VMQVJfS0lORCA9IDMKK30gbXBmcl9raW5kX3Q7CisKKy8qIEdNUCBkZWZpbmVzOgorICAgICsgc2l6ZV90OiAgICAgICAgICAgICAgICBTdGFuZGFyZCBzaXplX3QKKyAgICArIF9fR01QX0FUVFJJQlVURV9QVVJFICAgQXR0cmlidXRlIGZvciBtYXRoIGZ1bmN0aW9ucy4KKyAgICArIF9fR01QX05PVEhST1cgICAgICAgICAgRm9yIEMrKzogY2FuJ3QgdGhyb3cgLgorICAgICsgX19HTVBfRVhURVJOX0lOTElORSAgICBBdHRyaWJ1dGUgZm9yIGlubGluZSBmdW5jdGlvbi4KKyAgICAqIF9fZ21wX2NvbnN0ICAgICAgICAgICAgY29uc3QgKFN1cHBvcnRzIGZvciBLJlIgY29tcGlsZXIgb25seSBmb3IgbXBmci5oKS4KKyAgICArIF9fR01QX0RFQ0xTUEVDX0VYUE9SVCAgY29tcGlsaW5nIHRvIGdvIGludG8gYSBETEwKKyAgICArIF9fR01QX0RFQ0xTUEVDX0lNUE9SVCAgY29tcGlsaW5nIHRvIGdvIGludG8gYSBhcHBsaWNhdGlvbgorKi8KKy8qIEV4dHJhIE1QRlIgZGVmaW5lcyAqLworI2RlZmluZSBfX01QRlJfU0VOVElORUxfQVRUUgorI2lmIGRlZmluZWQgKF9fR05VQ19fKQorIyBpZiBfX0dOVUNfXyA+PSA0CisjICB1bmRlZiBfX01QRlJfU0VOVElORUxfQVRUUgorIyAgZGVmaW5lIF9fTVBGUl9TRU5USU5FTF9BVFRSIF9fYXR0cmlidXRlX18gKChzZW50aW5lbCkpCisjIGVuZGlmCisjZW5kaWYKKworLyogUHJvdG90eXBlczogU3VwcG9ydCBvZiBLJlIgY29tcGlsZXIgKi8KKyNpZiBkZWZpbmVkIChfX0dNUF9QUk9UTykKKyMgZGVmaW5lIF9NUEZSX1BST1RPIF9fR01QX1BST1RPCisjZWxpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCisjIGRlZmluZSBfTVBGUl9QUk9UTyh4KSB4CisjZWxzZQorIyBkZWZpbmUgX01QRlJfUFJPVE8oeCkgKCkKKyNlbmRpZgorLyogU3VwcG9ydCBmb3IgV0lORE9XUyBEbGw6CisgICBDaGVjayBpZiB3ZSBhcmUgaW5zaWRlIGEgTVBGUiBidWlsZCwgYW5kIGlmIHNvIGV4cG9ydCB0aGUgZnVuY3Rpb25zLgorICAgT3RoZXJ3aXNlIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgR01QICovCisjaWYgZGVmaW5lZChfX01QRlJfV0lUSElOX01QRlIpICYmIF9fR01QX0xJQkdNUF9ETEwKKyMgZGVmaW5lIF9fTVBGUl9ERUNMU1BFQyBfX0dNUF9ERUNMU1BFQ19FWFBPUlQKKyNlbHNlCisjIGRlZmluZSBfX01QRlJfREVDTFNQRUMgX19HTVBfREVDTFNQRUMKKyNlbmRpZgorCisvKiBVc2UgTVBGUl9ERVBSRUNBVEVEIHRvIG1hcmsgTVBGUiBmdW5jdGlvbnMsIHR5cGVzIG9yIHZhcmlhYmxlcyBhcworICAgZGVwcmVjYXRlZC4gQ29kZSBpbnNwaXJlZCBieSBBcGFjaGUgU3VidmVyc2lvbidzIHN2bl90eXBlcy5oIGZpbGUuICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgXAorICAoX19HTlVDX18gPj0gNCB8fCAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+PSAxKSkKKyMgZGVmaW5lIE1QRlJfREVQUkVDQVRFRCBfX2F0dHJpYnV0ZV9fICgoZGVwcmVjYXRlZCkpCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA+PSAxMzAwCisjIGRlZmluZSBNUEZSX0RFUFJFQ0FURUQgX19kZWNsc3BlYyhkZXByZWNhdGVkKQorI2Vsc2UKKyMgZGVmaW5lIE1QRlJfREVQUkVDQVRFRAorI2VuZGlmCisKKy8qIE5vdGU6IEluIG9yZGVyIHRvIGJlIGRlY2xhcmVkLCBzb21lIGZ1bmN0aW9ucyBuZWVkIGEgc3BlY2lmaWMKKyAgIHN5c3RlbSBoZWFkZXIgdG8gYmUgaW5jbHVkZWQgKmJlZm9yZSogIm1wZnIuaCIuIElmIHRoZSB1c2VyCisgICBmb3JnZXRzIHRvIGluY2x1ZGUgdGhlIGhlYWRlciwgdGhlIE1QRlIgZnVuY3Rpb24gcHJvdG90eXBlIGluCisgICB0aGUgdXNlciBvYmplY3QgZmlsZSBpcyBub3QgY29ycmVjdC4gVG8gYXZvaWQgd3JvbmcgcmVzdWx0cywKKyAgIHdlIHJhaXNlIGEgbGlua2VyIGVycm9yIGluIHRoYXQgY2FzZSBieSBjaGFuZ2luZyB0aGVpciBpbnRlcm5hbAorICAgbmFtZSBpbiB0aGUgbGlicmFyeSAocHJlZml4ZWQgYnkgX19nbXBmciBpbnN0ZWFkIG9mIG1wZnIpLiBTZWUKKyAgIHRoZSBsaW5lcyBvZiB0aGUgZm9ybSAiI2RlZmluZSBtcGZyX3h4eCBfX2dtcGZyX3h4eCIgYmVsb3cuICovCisKKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK19fTVBGUl9ERUNMU1BFQyBfX2dtcF9jb25zdCBjaGFyICogbXBmcl9nZXRfdmVyc2lvbiBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyBfX2dtcF9jb25zdCBjaGFyICogbXBmcl9nZXRfcGF0Y2hlcyBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9idWlsZG9wdF90bHNfcCAgICAgICAgICBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9idWlsZG9wdF9kZWNpbWFsX3AgICAgICBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9idWlsZG9wdF9nbXBpbnRlcm5hbHNfcCBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyBfX2dtcF9jb25zdCBjaGFyICogbXBmcl9idWlsZG9wdF90dW5lX2Nhc2UgX01QRlJfUFJPVE8gKCh2b2lkKSk7CisKK19fTVBGUl9ERUNMU1BFQyBtcGZyX2V4cF90IG1wZnJfZ2V0X2VtaW4gICAgIF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIGludCAgICAgICAgbXBmcl9zZXRfZW1pbiAgICAgX01QRlJfUFJPVE8gKChtcGZyX2V4cF90KSk7CitfX01QRlJfREVDTFNQRUMgbXBmcl9leHBfdCBtcGZyX2dldF9lbWluX21pbiBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyBtcGZyX2V4cF90IG1wZnJfZ2V0X2VtaW5fbWF4IF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIG1wZnJfZXhwX3QgbXBmcl9nZXRfZW1heCAgICAgX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgaW50ICAgICAgICBtcGZyX3NldF9lbWF4ICAgICBfTVBGUl9QUk9UTyAoKG1wZnJfZXhwX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBtcGZyX2V4cF90IG1wZnJfZ2V0X2VtYXhfbWluIF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIG1wZnJfZXhwX3QgbXBmcl9nZXRfZW1heF9tYXggX01QRlJfUFJPVE8gKCh2b2lkKSk7CisKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfc2V0X2RlZmF1bHRfcm91bmRpbmdfbW9kZSBfTVBGUl9QUk9UTygobXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIG1wZnJfcm5kX3QgbXBmcl9nZXRfZGVmYXVsdF9yb3VuZGluZ19tb2RlIF9NUEZSX1BST1RPKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgX19nbXBfY29uc3QgY2hhciAqCisgICBtcGZyX3ByaW50X3JuZF9tb2RlIF9NUEZSX1BST1RPKChtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfY2xlYXJfZmxhZ3MgX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX2NsZWFyX3VuZGVyZmxvdyBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfY2xlYXJfb3ZlcmZsb3cgX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX2NsZWFyX2RpdmJ5MCBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfY2xlYXJfbmFuZmxhZyBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfY2xlYXJfaW5leGZsYWcgX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX2NsZWFyX2VyYW5nZWZsYWcgX01QRlJfUFJPVE8gKCh2b2lkKSk7CisKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfc2V0X3VuZGVyZmxvdyBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfc2V0X292ZXJmbG93IF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9zZXRfZGl2YnkwIF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9zZXRfbmFuZmxhZyBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfc2V0X2luZXhmbGFnIF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9zZXRfZXJhbmdlZmxhZyBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3VuZGVyZmxvd19wIF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX292ZXJmbG93X3AgX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZGl2YnkwX3AgX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbmFuZmxhZ19wIF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2luZXhmbGFnX3AgX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZXJhbmdlZmxhZ19wIF9NUEZSX1BST1RPICgodm9pZCkpOworCitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfY2hlY2tfcmFuZ2UgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgaW50LCBtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfaW5pdDIgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9wcmVjX3QpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfaW5pdCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyKSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX2NsZWFyIF9NUEZSX1BST1RPICgobXBmcl9wdHIpKTsKKworX19NUEZSX0RFQ0xTUEVDIHZvaWQKKyAgbXBmcl9pbml0czIgX01QRlJfUFJPVE8gKChtcGZyX3ByZWNfdCwgbXBmcl9wdHIsIC4uLikpIF9fTVBGUl9TRU5USU5FTF9BVFRSOworX19NUEZSX0RFQ0xTUEVDIHZvaWQKKyAgbXBmcl9pbml0cyBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCAuLi4pKSBfX01QRlJfU0VOVElORUxfQVRUUjsKK19fTVBGUl9ERUNMU1BFQyB2b2lkCisgIG1wZnJfY2xlYXJzIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIC4uLikpIF9fTVBGUl9TRU5USU5FTF9BVFRSOworCitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfcHJlY19yb3VuZCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3ByZWNfdCwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludAorICBtcGZyX2Nhbl9yb3VuZCBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLCBtcGZyX2V4cF90LCBtcGZyX3JuZF90LCBtcGZyX3JuZF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcHJlY190KSk7CitfX01QRlJfREVDTFNQRUMgbXBmcl9wcmVjX3QgbXBmcl9taW5fcHJlYyBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyKSk7CisKK19fTVBGUl9ERUNMU1BFQyBtcGZyX2V4cF90IG1wZnJfZ2V0X2V4cCBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc2V0X2V4cCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX2V4cF90KSk7CitfX01QRlJfREVDTFNQRUMgbXBmcl9wcmVjX3QgbXBmcl9nZXRfcHJlYyBfTVBGUl9QUk9UTygobXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfc2V0X3ByZWMgX01QRlJfUFJPVE8oKG1wZnJfcHRyLCBtcGZyX3ByZWNfdCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9zZXRfcHJlY19yYXcgX01QRlJfUFJPVE8oKG1wZnJfcHRyLCBtcGZyX3ByZWNfdCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9zZXRfZGVmYXVsdF9wcmVjIF9NUEZSX1BST1RPKChtcGZyX3ByZWNfdCkpOworX19NUEZSX0RFQ0xTUEVDIG1wZnJfcHJlY190IG1wZnJfZ2V0X2RlZmF1bHRfcHJlYyBfTVBGUl9QUk9UTygodm9pZCkpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc2V0X2QgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgZG91YmxlLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc2V0X2ZsdCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBmbG9hdCwgbXBmcl9ybmRfdCkpOworI2lmZGVmIE1QRlJfV0FOVF9ERUNJTUFMX0ZMT0FUUworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3NldF9kZWNpbWFsNjQgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgX0RlY2ltYWw2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworI2VuZGlmCitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfc2V0X2xkIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIGxvbmcgZG91YmxlLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfc2V0X3ogX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXB6X3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludAorICBtcGZyX3NldF96XzJleHAgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXB6X3NyY3B0ciwgbXBmcl9leHBfdCwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9zZXRfbmFuIF9NUEZSX1BST1RPICgobXBmcl9wdHIpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfc2V0X2luZiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBpbnQpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfc2V0X3plcm8gX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgaW50KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfc2V0X2YgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludAorICBtcGZyX2dldF9mIF9NUEZSX1BST1RPICgobXBmX3B0ciwgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zZXRfc2kgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbG9uZywgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludAorICBtcGZyX3NldF91aSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCB1bnNpZ25lZCBsb25nLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfc2V0X3NpXzJleHAgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbG9uZywgbXBmcl9leHBfdCwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludAorICBtcGZyX3NldF91aV8yZXhwIF9NUEZSX1BST1RPICgobXBmcl9wdHIsdW5zaWduZWQgbG9uZyxtcGZyX2V4cF90LG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9zZXRfcSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcHFfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfc2V0X3N0ciBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBfX2dtcF9jb25zdCBjaGFyICosIGludCwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludAorICBtcGZyX2luaXRfc2V0X3N0ciBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBfX2dtcF9jb25zdCBjaGFyICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfc2V0NCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCwgaW50KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfYWJzIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfc2V0IF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbmVnIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc2lnbmJpdCBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfc2V0c2lnbiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwgaW50LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfY29weXNpZ24gX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBtcGZyX2V4cF90IG1wZnJfZ2V0X3pfMmV4cCBfTVBGUl9QUk9UTyAoKG1wel9wdHIsIG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgZmxvYXQgbXBmcl9nZXRfZmx0IF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBkb3VibGUgbXBmcl9nZXRfZCBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CisjaWZkZWYgTVBGUl9XQU5UX0RFQ0lNQUxfRkxPQVRTCitfX01QRlJfREVDTFNQRUMgX0RlY2ltYWw2NCBtcGZyX2dldF9kZWNpbWFsNjQgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworI2VuZGlmCitfX01QRlJfREVDTFNQRUMgbG9uZyBkb3VibGUgbXBmcl9nZXRfbGQgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBkb3VibGUgbXBmcl9nZXRfZDEgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0cikpOworX19NUEZSX0RFQ0xTUEVDIGRvdWJsZSBtcGZyX2dldF9kXzJleHAgX01QRlJfUFJPVE8gKChsb25nKiwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBsb25nIGRvdWJsZSBtcGZyX2dldF9sZF8yZXhwIF9NUEZSX1BST1RPICgobG9uZyosIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZnJleHAgX01QRlJfUFJPVE8gKChtcGZyX2V4cF90KiwgbXBmcl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGxvbmcgbXBmcl9nZXRfc2kgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgbXBmcl9nZXRfdWkgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGNoYXIqbXBmcl9nZXRfc3RyIF9NUEZSX1BST1RPICgoY2hhciosIG1wZnJfZXhwX3QqLCBpbnQsIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZ2V0X3ogX01QRlJfUFJPVE8gKChtcHpfcHRyIHosIG1wZnJfc3JjcHRyIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfZnJlZV9zdHIgX01QRlJfUFJPVE8gKChjaGFyICopKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3VyYW5kb20gX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgZ21wX3JhbmRzdGF0ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZ3JhbmRvbSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3B0ciwgZ21wX3JhbmRzdGF0ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfdXJhbmRvbWIgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgZ21wX3JhbmRzdGF0ZV90KSk7CisKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfbmV4dGFib3ZlIF9NUEZSX1BST1RPICgobXBmcl9wdHIpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfbmV4dGJlbG93IF9NUEZSX1BST1RPICgobXBmcl9wdHIpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfbmV4dHRvd2FyZCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0cikpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfcHJpbnRmIF9NUEZSX1BST1RPICgoX19nbXBfY29uc3QgY2hhciosIC4uLikpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2FzcHJpbnRmIF9NUEZSX1BST1RPICgoY2hhcioqLCBfX2dtcF9jb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLikpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3NwcmludGYgX01QRlJfUFJPVE8gKChjaGFyKiwgX19nbXBfY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLikpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3NucHJpbnRmIF9NUEZSX1BST1RPICgoY2hhciosIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ21wX2NvbnN0IGNoYXIqLCAuLi4pKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3BvdyBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3Bvd19zaSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGludCwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3Bvd191aSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGludCwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3VpX3Bvd191aSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCB1bnNpZ25lZCBsb25nIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfdWlfcG93IF9NUEZSX1BST1RPICgobXBmcl9wdHIsIHVuc2lnbmVkIGxvbmcgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfcG93X3ogX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcHpfc3JjcHRyLCBtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zcXJ0IF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc3FydF91aSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCB1bnNpZ25lZCBsb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfcmVjX3NxcnQgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9hZGQgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zdWIgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9tdWwgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9kaXYgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2FkZF91aSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc3ViX3VpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl91aV9zdWIgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgdW5zaWduZWQgbG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX211bF91aSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZGl2X3VpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl91aV9kaXYgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgdW5zaWduZWQgbG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfYWRkX3NpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgaW50LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc3ViX3NpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgaW50LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc2lfc3ViIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIGxvbmcgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbXVsX3NpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgaW50LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZGl2X3NpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgaW50LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc2lfZGl2IF9NUEZSX1BST1RPICgobXBmcl9wdHIsIGxvbmcgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9hZGRfZCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zdWJfZCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9kX3N1YiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBkb3VibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9tdWxfZCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9kaXZfZCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9kX2RpdiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBkb3VibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3NxciBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jb25zdF9waSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY29uc3RfbG9nMiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY29uc3RfZXVsZXIgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2NvbnN0X2NhdGFsYW4gX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfYWdtIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9sb2cgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2xvZzIgX01QRlJfUFJPVE8gKChtcGZyX3B0cixtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbG9nMTAgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbG9nMXAgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9leHAgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2V4cDIgX01QRlJfUFJPVE8gKChtcGZyX3B0cixtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZXhwMTAgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZXhwbTEgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZWludCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9saTIgX01QRlJfUFJPVE8gKChtcGZyX3B0cixtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jbXAgIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsIG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY21wMyBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLCBtcGZyX3NyY3B0ciwgaW50KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY21wX2QgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgZG91YmxlKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY21wX2xkIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsIGxvbmcgZG91YmxlKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY21wYWJzIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsIG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY21wX3VpIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsIHVuc2lnbmVkIGxvbmcpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jbXBfc2kgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbG9uZykpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2NtcF91aV8yZXhwIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsIHVuc2lnbmVkIGxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX2V4cF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY21wX3NpXzJleHAgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfZXhwX3QpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfcmVsZGlmZiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZXEgX01QRlJfUFJPVE8oKG1wZnJfc3JjcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZykpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3NnbiBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyKSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9tdWxfMmV4cCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9kaXZfMmV4cCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9tdWxfMnVpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZGl2XzJ1aSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZywgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX211bF8yc2kgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9kaXZfMnNpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nLCBtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9yaW50IF9NUEZSX1BST1RPKChtcGZyX3B0cixtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3JvdW5kIF9NUEZSX1BST1RPKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl90cnVuYyBfTVBGUl9QUk9UTygobXBmcl9wdHIsIG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY2VpbCBfTVBGUl9QUk9UTygobXBmcl9wdHIsIG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZmxvb3IgX01QRlJfUFJPVE8oKG1wZnJfcHRyLCBtcGZyX3NyY3B0cikpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3JpbnRfcm91bmQgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9yaW50X3RydW5jIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfcmludF9jZWlsIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9yaW50X2Zsb29yIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZnJhYyBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9tb2RmIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3JlbXF1byBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBsb25nKiwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9yZW1haW5kZXIgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9mbW9kIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9maXRzX3Vsb25nX3AgX01QRlJfUFJPVE8oKG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZml0c19zbG9uZ19wIF9NUEZSX1BST1RPKChtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2ZpdHNfdWludF9wIF9NUEZSX1BST1RPKChtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2ZpdHNfc2ludF9wIF9NUEZSX1BST1RPKChtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2ZpdHNfdXNob3J0X3AgX01QRlJfUFJPVE8oKG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZml0c19zc2hvcnRfcCBfTVBGUl9QUk9UTygobXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9maXRzX3VpbnRtYXhfcCBfTVBGUl9QUk9UTygobXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2ZpdHNfaW50bWF4X3AgX01QRlJfUFJPVE8oKG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfZXh0cmFjdCBfTVBGUl9QUk9UTyAoKG1wel9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX3N3YXAgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9wdHIpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfZHVtcCBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyKSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9uYW5fcCBfTVBGUl9QUk9UTygobXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9pbmZfcCBfTVBGUl9QUk9UTygobXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9udW1iZXJfcCBfTVBGUl9QUk9UTygobXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9pbnRlZ2VyX3AgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0cikpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3plcm9fcCBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfcmVndWxhcl9wIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2dyZWF0ZXJfcCBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLCBtcGZyX3NyY3B0cikpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2dyZWF0ZXJlcXVhbF9wIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0cikpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2xlc3NfcCBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLCBtcGZyX3NyY3B0cikpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2xlc3NlcXVhbF9wIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsIG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbGVzc2dyZWF0ZXJfcCBfTVBGUl9QUk9UTygobXBmcl9zcmNwdHIsbXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9lcXVhbF9wIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsIG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfdW5vcmRlcmVkX3AgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbXBmcl9zcmNwdHIpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2F0YW5oIF9NUEZSX1BST1RPKChtcGZyX3B0cixtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfYWNvc2ggX01QRlJfUFJPVE8oKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9hc2luaCBfTVBGUl9QUk9UTygobXBmcl9wdHIsbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2Nvc2ggX01QRlJfUFJPVE8oKG1wZnJfcHRyLG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc2luaCBfTVBGUl9QUk9UTygobXBmcl9wdHIsbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl90YW5oIF9NUEZSX1BST1RPKChtcGZyX3B0cixtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3NpbmhfY29zaCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3NlY2ggX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2NzY2ggX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2NvdGggX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfYWNvcyBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9hc2luIF9NUEZSX1BST1RPICgobXBmcl9wdHIsbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2F0YW4gX01QRlJfUFJPVE8gKChtcGZyX3B0cixtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc2luIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zaW5fY29zIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2NvcyBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfdGFuIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9hdGFuMiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3NlYyBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY3NjIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jb3QgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfaHlwb3QgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2VyZiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZXJmYyBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY2JydCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9yb290IF9NUEZSX1BST1RPICgobXBmcl9wdHIsbXBmcl9zcmNwdHIsdW5zaWduZWQgbG9uZyxtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZ2FtbWEgX01QRlJfUFJPVE8oKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9sbmdhbW1hIF9NUEZSX1BST1RPKChtcGZyX3B0cixtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbGdhbW1hIF9NUEZSX1BST1RPKChtcGZyX3B0cixpbnQqLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9kaWdhbW1hIF9NUEZSX1BST1RPKChtcGZyX3B0cixtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfemV0YSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl96ZXRhX3VpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsdW5zaWduZWQgbG9uZyxtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZmFjX3VpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIHVuc2lnbmVkIGxvbmcgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9qMCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2oxIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfam4gX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbG9uZywgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfeTAgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl95MSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3luIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIGxvbmcsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfYWkgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX21pbiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX21heCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2RpbSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbXVsX3ogX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcHpfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZGl2X3ogX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcHpfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfYWRkX3ogX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcHpfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc3ViX3ogX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcHpfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfel9zdWIgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXB6X3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY21wX3ogX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbXB6X3NyY3B0cikpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbXVsX3EgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcHFfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZGl2X3EgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcHFfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfYWRkX3EgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcHFfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc3ViX3EgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcHFfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY21wX3EgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbXBxX3NyY3B0cikpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY21wX2YgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbXBmX3NyY3B0cikpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZm1hIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2ZtcyBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zdW0gX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9wdHIgKl9fZ21wX2NvbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcsIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9mcmVlX2NhY2hlIF9NUEZSX1BST1RPICgodm9pZCkpOworCitfX01QRlJfREVDTFNQRUMgaW50ICBtcGZyX3N1Ym5vcm1hbGl6ZSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCAgbXBmcl9zdHJ0b2ZyIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIF9fZ21wX2NvbnN0IGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiosIGludCwgbXBmcl9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgc2l6ZV90IG1wZnJfY3VzdG9tX2dldF9zaXplICAgX01QRlJfUFJPVE8gKChtcGZyX3ByZWNfdCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgICBtcGZyX2N1c3RvbV9pbml0ICAgIF9NUEZSX1BST1RPICgodm9pZCAqLCBtcGZyX3ByZWNfdCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgKiBtcGZyX2N1c3RvbV9nZXRfc2lnbmlmaWNhbmQgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0cikpOworX19NUEZSX0RFQ0xTUEVDIG1wZnJfZXhwX3QgbXBmcl9jdXN0b21fZ2V0X2V4cCAgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0cikpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgICBtcGZyX2N1c3RvbV9tb3ZlICAgICAgIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIHZvaWQgKikpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgICBtcGZyX2N1c3RvbV9pbml0X3NldCAgIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfZXhwX3QsIG1wZnJfcHJlY190LCB2b2lkICopKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgICAgbXBmcl9jdXN0b21fZ2V0X2tpbmQgICBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyKSk7CisKKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisvKiBEZWZpbmUgTVBGUl9VU0VfRVhURU5TSU9OIHRvIGF2b2lkICJnY2MgLXBlZGFudGljIiB3YXJuaW5ncy4gKi8KKyNpZm5kZWYgTVBGUl9FWFRFTlNJT04KKyMgaWYgZGVmaW5lZChNUEZSX1VTRV9FWFRFTlNJT04pCisjICBkZWZpbmUgTVBGUl9FWFRFTlNJT04gX19leHRlbnNpb25fXworIyBlbHNlCisjICBkZWZpbmUgTVBGUl9FWFRFTlNJT04KKyMgZW5kaWYKKyNlbmRpZgorCisvKiBXYXJuaW5nISBUaGlzIG1hY3JvIGRvZXNuJ3Qgd29yayB3aXRoIEsmUiBDIChlLmcuLCBjb21wYXJlIHRoZSAiZ2NjIC1FIgorICAgb3V0cHV0IHdpdGggYW5kIHdpdGhvdXQgLXRyYWRpdGlvbmFsKSBhbmQgc2hvdWxkbid0IGJlIHVzZWQgaW50ZXJuYWxseS4KKyAgIEZvciBwdWJsaWMgdXNlIG9ubHksIGJ1dCBzZWUgdGhlIE1QRlIgbWFudWFsLiAqLworI2RlZmluZSBNUEZSX0RFQ0xfSU5JVChfeCwgX3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTVBGUl9FWFRFTlNJT04gbXBfbGltYl90IF9fZ21wZnJfbG9jYWxfdGFiXyMjX3hbKChfcCktMSkvR01QX05VTUJfQklUUysxXTsgXAorICBNUEZSX0VYVEVOU0lPTiBtcGZyX3QgX3ggPSB7eyhfcCksMSxfX01QRlJfRVhQX05BTixfX2dtcGZyX2xvY2FsX3RhYl8jI194fX0KKworLyogRmFzdCBhY2Nlc3MgbWFjcm9zIHRvIHJlcGxhY2UgZnVuY3Rpb24gaW50ZXJmYWNlLgorICAgSWYgdGhlIFVTRVIgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIG1hY3JvIGludGVyZmFjZSwgbGV0IGhpbSBtYWtlIGhhcHB5CisgICBldmVuIGlmIGl0IHByb2R1Y2VzIGZhc3RlciBhbmQgc21hbGxlciBjb2RlLiAqLworI2lmbmRlZiBNUEZSX1VTRV9OT19NQUNSTworCisvKiBJbmxpbmluZyB0aGVzZXMgZnVuY3Rpb25zIGlzIGJvdGggZmFzdGVyIGFuZCBzbWFsbGVyICovCisjZGVmaW5lIG1wZnJfbmFuX3AoX3gpICAgICAgKChfeCktPl9tcGZyX2V4cCA9PSBfX01QRlJfRVhQX05BTikKKyNkZWZpbmUgbXBmcl9pbmZfcChfeCkgICAgICAoKF94KS0+X21wZnJfZXhwID09IF9fTVBGUl9FWFBfSU5GKQorI2RlZmluZSBtcGZyX3plcm9fcChfeCkgICAgICgoX3gpLT5fbXBmcl9leHAgPT0gX19NUEZSX0VYUF9aRVJPKQorI2RlZmluZSBtcGZyX3JlZ3VsYXJfcChfeCkgICgoX3gpLT5fbXBmcl9leHAgPiAgX19NUEZSX0VYUF9JTkYpCisjZGVmaW5lIG1wZnJfc2duKF94KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKF94KS0+X21wZnJfZXhwIDwgX19NUEZSX0VYUF9JTkYgPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIChtcGZyX25hbl9wIChfeCkgPyBtcGZyX3NldF9lcmFuZ2VmbGFnICgpIDogKG1wZnJfdm9pZCkgMCksIDAgOiBcCisgICBNUEZSX1NJR04gKF94KSkKKworLyogUHJldmVudCB0aGVtIGZyb20gdXNpbmcgYXMgbHZhbHVlcyAqLworI2RlZmluZSBNUEZSX1ZBTFVFX09GKHgpICAoMCA/ICh4KSA6ICh4KSkKKyNkZWZpbmUgbXBmcl9nZXRfcHJlYyhfeCkgTVBGUl9WQUxVRV9PRigoX3gpLT5fbXBmcl9wcmVjKQorI2RlZmluZSBtcGZyX2dldF9leHAoX3gpICBNUEZSX1ZBTFVFX09GKChfeCktPl9tcGZyX2V4cCkKKy8qIE5vdGU6IGlmIG5lZWQgYmUsIHRoZSBNUEZSX1ZBTFVFX09GIGNhbiBiZSB1c2VkIGZvciBvdGhlciBleHByZXNzaW9ucworICAgKG9mIGFueSB0eXBlKS4gVGhhbmtzIHRvIFdvanRlayBMZXJjaCBhbmQgVGltIFJlbnRzY2ggZm9yIHRoZSBpZGVhLiAqLworCisjZGVmaW5lIG1wZnJfcm91bmQoYSxiKSBtcGZyX3JpbnQoKGEpLCAoYiksIE1QRlJfUk5ETkEpCisjZGVmaW5lIG1wZnJfdHJ1bmMoYSxiKSBtcGZyX3JpbnQoKGEpLCAoYiksIE1QRlJfUk5EWikKKyNkZWZpbmUgbXBmcl9jZWlsKGEsYikgIG1wZnJfcmludCgoYSksIChiKSwgTVBGUl9STkRVKQorI2RlZmluZSBtcGZyX2Zsb29yKGEsYikgbXBmcl9yaW50KChhKSwgKGIpLCBNUEZSX1JOREQpCisKKyNkZWZpbmUgbXBmcl9jbXBfdWkoYixpKSBtcGZyX2NtcF91aV8yZXhwKChiKSwoaSksMCkKKyNkZWZpbmUgbXBmcl9jbXBfc2koYixpKSBtcGZyX2NtcF9zaV8yZXhwKChiKSwoaSksMCkKKyNkZWZpbmUgbXBmcl9zZXQoYSxiLHIpICBtcGZyX3NldDQoYSxiLHIsTVBGUl9TSUdOKGIpKQorI2RlZmluZSBtcGZyX2FicyhhLGIscikgIG1wZnJfc2V0NChhLGIsciwxKQorI2RlZmluZSBtcGZyX2NvcHlzaWduKGEsYixjLHIpIG1wZnJfc2V0NChhLGIscixNUEZSX1NJR04oYykpCisjZGVmaW5lIG1wZnJfc2V0c2lnbihhLGIscyxyKSBtcGZyX3NldDQoYSxiLHIsKHMpID8gLTEgOiAxKQorI2RlZmluZSBtcGZyX3NpZ25iaXQoeCkgIChNUEZSX1NJR04oeCkgPCAwKQorI2RlZmluZSBtcGZyX2NtcChiLCBjKSAgIG1wZnJfY21wMyhiLCBjLCAxKQorI2RlZmluZSBtcGZyX211bF8yZXhwKHkseCxuLHIpIG1wZnJfbXVsXzJ1aSgoeSksKHgpLChuKSwocikpCisjZGVmaW5lIG1wZnJfZGl2XzJleHAoeSx4LG4scikgbXBmcl9kaXZfMnVpKCh5KSwoeCksKG4pLChyKSkKKworCisvKiBXaGVuIHVzaW5nIEdDQywgb3B0aW1pemUgY2VydGFpbiBjb21tb24gY29tcGFyaXNvbnMgYW5kIGFmZmVjdGF0aW9ucy4KKyAgICsgUmVtb3ZlIElDQyBzaW5jZSBpdCBkZWZpbmVzIF9fR05VQ19fIGJ1dCBwcm9kdWNlcyBhCisgICAgIGh1Z2UgbnVtYmVyIG9mIHdhcm5pbmdzIGlmIHlvdSB1c2UgdGhpcyBjb2RlLgorICAgICBWTDogSSBjb3VsZG4ndCByZXByb2R1Y2UgYSBzaW5nbGUgd2FybmluZyB3aGVuIGVuYWJsaW5nIHRoZXNlIG1hY3JvcworICAgICB3aXRoIGljYyAxMC4xIDIwMDgwMjEyIG9uIEl0YW5pdW0uIEJ1dCB3aXRoIHRoaXMgdmVyc2lvbiwgX19JQ0MgaXNuJ3QKKyAgICAgZGVmaW5lZCAoX19JTlRFTF9DT01QSUxFUiBpcywgdGhvdWdoKSwgc28gdGhhdCB0aGVzZSBtYWNyb3MgYXJlIGVuYWJsZWQKKyAgICAgYW55d2F5LiBDaGVja2luZyB3aXRoIG90aGVyIElDQyB2ZXJzaW9ucyBpcyBuZWVkZWQuIFBvc3NpYmx5IGRldGVjdAorICAgICB3aGV0aGVyIHdhcm5pbmdzIGFyZSBwcm9kdWNlZCBvciBub3Qgd2l0aCBhIGNvbmZpZ3VyZSB0ZXN0LgorICAgKyBSZW1vdmUgQysrIHRvbywgc2luY2UgaXQgY29tcGxhaW5zIHRvbyBtdWNoLiAqLworLyogQWRkZWQgY2FzdHMgdG8gaW1wcm92ZSByb2J1c3RuZXNzIGluIGNhc2Ugb2YgdW5kZWZpbmVkIGJlaGF2aW9yIGFuZAorICAgY29tcGlsZXIgZXh0ZW5zaW9ucyBiYXNlZCBvbiBVQiAoaW4gcGFydGljdWxhciAtZndyYXB2KS4gTVBGUiBkb2Vzbid0CisgICB1c2Ugc3VjaCBleHRlbnNpb25zLCBidXQgdGhlc2UgbWFjcm9zIHdpbGwgYmUgdXNlZCBieSAzcmQtcGFydHkgY29kZSwKKyAgIHdoZXJlIHN1Y2ggZXh0ZW5zaW9ucyBtYXkgYmUgcmVxdWlyZWQuCisgICBNb3Jlb3ZlciBjYXN0cyB0byB1bnNpZ25lZCBsb25nIGhhdmUgYmVlbiBhZGRlZCB0byBhdm9pZCB3YXJuaW5ncyBpbgorICAgcHJvZ3JhbXMgdGhhdCB1c2UgTVBGUiBhbmQgYXJlIGNvbXBpbGVkIHdpdGggLVdjb252ZXJzaW9uOyBzdWNoIGNhc3RzCisgICBhcmUgT0sgc2luY2UgaWYgWCBpcyBhIGNvbnN0YW50IGV4cHJlc3Npb24sIHRoZW4gKHVuc2lnbmVkIGxvbmcpIFggaXMKKyAgIGFsc28gYSBjb25zdGFudCBleHByZXNzaW9uLCBzbyB0aGF0IHRoZSBvcHRpbWl6YXRpb25zIHN0aWxsIHdvcmsuIFRoZQorICAgd2FybmluZ3MgYXJlIHByb2JhYmx5IHJlbGF0ZWQgdG8gdGhlIGZvbGxvd2luZyB0d28gYnVnczoKKyAgICAgaHR0cDovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00MjEwCisgICAgIGh0dHA6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9Mzg0NzAgKHBvc3NpYmx5IGEgdmFyaWFudCkKKyAgIGFuZCB0aGUgY2FzdHMgY291bGQgYmUgcmVtb3ZlZCBvbmNlIHRoZXNlIGJ1Z3MgYXJlIGZpeGVkLgorICAgQ2FzdHMgc2hvdWxkbid0IGJlIHVzZWQgb24gdGhlIGdlbmVyaWMgY2FsbHMgKHRvIHRoZSAuLi5fMmV4cCBmdW5jdGlvbnMpLAorICAgd2hlcmUgaW1wbGljaXQgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZC4gSW5kZWVkLCBoYXZpbmcgYXQgbGVhc3Qgb25lCisgICBpbXBsaWNpdCBjb252ZXJzaW9uIGluIHRoZSBtYWNybyBhbGxvd3MgdGhlIGNvbXBpbGVyIHRvIGVtaXQgZGlhZ25vc3RpY3MKKyAgIHdoZW4gbm9ybWFsbHkgZXhwZWN0ZWQsIGZvciBpbnN0YW5jZSBpbiB0aGUgZm9sbG93aW5nIGNhbGw6CisgICAgIG1wZnJfc2V0X3VpICh4LCAiZm9vIiwgTVBGUl9STkROKTsKKyAgIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlIChmb3IgZnV0dXJlIG1hY3JvcyksIG9uZSBvZiB0aGUgdHJpY2tzIGRlc2NyaWJlZAorICAgb24gaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2NvbXAuc3RkLmMvbXNnL2U5MmFiZDI0YmY5ZWFmN2IgY291bGQKKyAgIGJlIHVzZWQuICovCisjaWYgZGVmaW5lZCAoX19HTlVDX18pICYmICFkZWZpbmVkKF9fSUNDKSAmJiAhZGVmaW5lZChfX2NwbHVzcGx1cykKKyNpZiAoX19HTlVDX18gPj0gMikKKyN1bmRlZiBtcGZyX2NtcF91aQorLyogV2UgdXNlIHRoZSBmYWN0IHRoYXQgbXBmcl9zZ24gb24gTmFOIHNldHMgdGhlIGVyYW5nZSBmbGFnIGFuZCByZXR1cm5zIDAuCisgICBCdXQgd2FybmluZyEgbXBmcl9zZ24gaXMgc3BlY2lmaWVkIGFzIGEgbWFjcm8gaW4gdGhlIEFQSSwgdGh1cyB0aGUgbWFjcm8KKyAgIG11c3RuJ3QgYmUgdXNlZCBpZiBzaWRlIGVmZmVjdHMgYXJlIHBvc3NpYmxlLCBsaWtlIGhlcmUuICovCisjZGVmaW5lIG1wZnJfY21wX3VpKF9mLF91KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoX19idWlsdGluX2NvbnN0YW50X3AgKF91KSAmJiAobXBmcl91bG9uZykgKF91KSA9PSAwID8gICAgICAgIFwKKyAgIChtcGZyX3NnbikgKF9mKSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBtcGZyX2NtcF91aV8yZXhwICgoX2YpLCAoX3UpLCAwKSkKKyN1bmRlZiBtcGZyX2NtcF9zaQorI2RlZmluZSBtcGZyX2NtcF9zaShfZixfcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfcykgJiYgKG1wZnJfbG9uZykgKF9zKSA+PSAwID8gICAgICAgICBcCisgICBtcGZyX2NtcF91aSAoKF9mKSwgKG1wZnJfdWxvbmcpIChtcGZyX2xvbmcpIChfcykpIDogICAgICAgICAgXAorICAgbXBmcl9jbXBfc2lfMmV4cCAoKF9mKSwgKF9zKSwgMCkpCisjaWYgX19HTlVDX18gPiAyIHx8IF9fR05VQ19NSU5PUl9fID49IDk1CisjdW5kZWYgbXBmcl9zZXRfdWkKKyNkZWZpbmUgbXBmcl9zZXRfdWkoX2YsX3UsX3IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX3UpICYmIChtcGZyX3Vsb25nKSAoX3UpID09IDAgPyAgICAgICAgXAorICAgX19leHRlbnNpb25fXyAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBtcGZyX3B0ciBfcCA9IChfZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgX3AtPl9tcGZyX3NpZ24gPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIF9wLT5fbXBmcl9leHAgPSBfX01QRlJfRVhQX1pFUk87ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAobXBmcl92b2lkKSAoX3IpOyAwOyB9KSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBtcGZyX3NldF91aV8yZXhwICgoX2YpLCAoX3UpLCAwLCAoX3IpKSkKKyNlbmRpZgorI3VuZGVmIG1wZnJfc2V0X3NpCisjZGVmaW5lIG1wZnJfc2V0X3NpKF9mLF9zLF9yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoX19idWlsdGluX2NvbnN0YW50X3AgKF9zKSAmJiAobXBmcl9sb25nKSAoX3MpID49IDAgPyAgICAgICAgIFwKKyAgIG1wZnJfc2V0X3VpICgoX2YpLCAobXBmcl91bG9uZykgKG1wZnJfbG9uZykgKF9zKSwgKF9yKSkgOiAgICBcCisgICBtcGZyX3NldF9zaV8yZXhwICgoX2YpLCAoX3MpLCAwLCAoX3IpKSkKKyNlbmRpZgorI2VuZGlmCisKKy8qIE1hY3JvIHZlcnNpb24gb2YgbXBmcl9zdGFjayBpbnRlcmZhY2UgZm9yIGZhc3QgYWNjZXNzICovCisjZGVmaW5lIG1wZnJfY3VzdG9tX2dldF9zaXplKHApICgobXBmcl9zaXplX3QpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKCgocCkrR01QX05VTUJfQklUUy0xKS9HTVBfTlVNQl9CSVRTKnNpemVvZiAobXBfbGltYl90KSkpCisjZGVmaW5lIG1wZnJfY3VzdG9tX2luaXQobSxwKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgbXBmcl9jdXN0b21fZ2V0X3NpZ25pZmljYW5kKHgpICgobXBmcl92b2lkKikoKHgpLT5fbXBmcl9kKSkKKyNkZWZpbmUgbXBmcl9jdXN0b21fZ2V0X2V4cCh4KSAoKHgpLT5fbXBmcl9leHApCisjZGVmaW5lIG1wZnJfY3VzdG9tX21vdmUoeCxtKSBkbyB7ICgoeCktPl9tcGZyX2QgPSAobXBfbGltYl90KikobSkpOyB9IHdoaWxlICgwKQorI2RlZmluZSBtcGZyX2N1c3RvbV9pbml0X3NldCh4LGssZSxwLG0pIGRvIHsgICAgICAgICAgICAgICAgICAgXAorICBtcGZyX3B0ciBfeCA9ICh4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtcGZyX2V4cF90IF9lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtcGZyX2tpbmRfdCBfdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtcGZyX2ludCBfcywgX2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfayA9IChrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoX2sgPj0gMCkgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF90ID0gKG1wZnJfa2luZF90KSBfazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9zID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF90ID0gKG1wZnJfa2luZF90KSAtazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9zID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfZSA9IF90ID09IE1QRlJfUkVHVUxBUl9LSU5EID8gKGUpIDogICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF90ID09IE1QRlJfTkFOX0tJTkQgPyBfX01QRlJfRVhQX05BTiA6ICAgICAgICAgICAgICAgICAgICAgXAorICAgIF90ID09IE1QRlJfSU5GX0tJTkQgPyBfX01QRlJfRVhQX0lORiA6IF9fTVBGUl9FWFBfWkVSTzsgICAgXAorICBfeC0+X21wZnJfcHJlYyA9IChwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfeC0+X21wZnJfc2lnbiA9IF9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfeC0+X21wZnJfZXhwICA9IF9lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfeC0+X21wZnJfZCAgICA9IChtcF9saW1iX3QqKSAobSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIH0gd2hpbGUgKDApCisjZGVmaW5lIG1wZnJfY3VzdG9tX2dldF9raW5kKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggKHgpLT5fbXBmcl9leHAgPiAgX19NUEZSX0VYUF9JTkYgPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKG1wZnJfaW50KSBNUEZSX1JFR1VMQVJfS0lORCAqIE1QRlJfU0lHTiAoeCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDogKHgpLT5fbXBmcl9leHAgPT0gX19NUEZSX0VYUF9JTkYgPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKG1wZnJfaW50KSBNUEZSX0lORl9LSU5EICogTVBGUl9TSUdOICh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDogKHgpLT5fbXBmcl9leHAgPT0gX19NUEZSX0VYUF9OQU4gPyAobXBmcl9pbnQpIE1QRlJfTkFOX0tJTkQgICAgICAgICBcCisgIDogKG1wZnJfaW50KSBNUEZSX1pFUk9fS0lORCAqIE1QRlJfU0lHTiAoeCkgKQorCisKKyNlbmRpZiAvKiBNUEZSX1VTRV9OT19NQUNSTyAqLworCisvKiBUaGVzZXMgYXJlIGRlZmluZWQgdG8gYmUgbWFjcm9zICovCisjZGVmaW5lIG1wZnJfaW5pdF9zZXRfc2koeCwgaSwgcm5kKSBcCisgKCBtcGZyX2luaXQoeCksIG1wZnJfc2V0X3NpKCh4KSwgKGkpLCAocm5kKSkgKQorI2RlZmluZSBtcGZyX2luaXRfc2V0X3VpKHgsIGksIHJuZCkgXAorICggbXBmcl9pbml0KHgpLCBtcGZyX3NldF91aSgoeCksIChpKSwgKHJuZCkpICkKKyNkZWZpbmUgbXBmcl9pbml0X3NldF9kKHgsIGQsIHJuZCkgXAorICggbXBmcl9pbml0KHgpLCBtcGZyX3NldF9kKCh4KSwgKGQpLCAocm5kKSkgKQorI2RlZmluZSBtcGZyX2luaXRfc2V0X2xkKHgsIGQsIHJuZCkgXAorICggbXBmcl9pbml0KHgpLCBtcGZyX3NldF9sZCgoeCksIChkKSwgKHJuZCkpICkKKyNkZWZpbmUgbXBmcl9pbml0X3NldF96KHgsIGksIHJuZCkgXAorICggbXBmcl9pbml0KHgpLCBtcGZyX3NldF96KCh4KSwgKGkpLCAocm5kKSkgKQorI2RlZmluZSBtcGZyX2luaXRfc2V0X3EoeCwgaSwgcm5kKSBcCisgKCBtcGZyX2luaXQoeCksIG1wZnJfc2V0X3EoKHgpLCAoaSksIChybmQpKSApCisjZGVmaW5lIG1wZnJfaW5pdF9zZXQoeCwgeSwgcm5kKSBcCisgKCBtcGZyX2luaXQoeCksIG1wZnJfc2V0KCh4KSwgKHkpLCAocm5kKSkgKQorI2RlZmluZSBtcGZyX2luaXRfc2V0X2YoeCwgeSwgcm5kKSBcCisgKCBtcGZyX2luaXQoeCksIG1wZnJfc2V0X2YoKHgpLCAoeSksIChybmQpKSApCisKKy8qIENvbXBhdGliaWxpdHkgbGF5ZXIgLS0gb2Jzb2xldGUgZnVuY3Rpb25zIGFuZCBtYWNyb3MgKi8KKy8qIE5vdGU6IGl0IGlzIG5vdCBwb3NzaWJsZSB0byBvdXRwdXQgd2FybmluZ3MsIHVubGVzcyBvbmUgZGVmaW5lcworICogYSBkZXByZWNhdGVkIHZhcmlhYmxlIGFuZCB1c2VzIGl0LCBlLmcuCisgKiAgIE1QRlJfREVQUkVDQVRFRCBleHRlcm4gaW50IG1wZnJfZGVwcmVjYXRlZF9mZWF0dXJlOworICogICAjZGVmaW5lIE1QRlJfRU1JTl9NSU4gKCh2b2lkKW1wZnJfZGVwcmVjYXRlZF9mZWF0dXJlLG1wZnJfZ2V0X2VtaW5fbWluKCkpCisgKiAodGhlIGNhc3QgdG8gdm9pZCBhdm9pZHMgYSB3YXJuaW5nIGJlY2F1c2UgdGhlIGxlZnQtaGFuZCBvcGVyYW5kCisgKiBoYXMgbm8gZWZmZWN0KS4KKyAqLworI2RlZmluZSBtcGZyX2NtcF9hYnMgbXBmcl9jbXBhYnMKKyNkZWZpbmUgbXBmcl9yb3VuZF9wcmVjKHgscixwKSBtcGZyX3ByZWNfcm91bmQoeCxwLHIpCisjZGVmaW5lIF9fZ21wX2RlZmF1bHRfcm91bmRpbmdfbW9kZSAobXBmcl9nZXRfZGVmYXVsdF9yb3VuZGluZ19tb2RlKCkpCisjZGVmaW5lIF9fbXBmcl9lbWluIChtcGZyX2dldF9lbWluKCkpCisjZGVmaW5lIF9fbXBmcl9lbWF4IChtcGZyX2dldF9lbWF4KCkpCisjZGVmaW5lIF9fbXBmcl9kZWZhdWx0X2ZwX2JpdF9wcmVjaXNpb24gKG1wZnJfZ2V0X2RlZmF1bHRfZnBfYml0X3ByZWNpc2lvbigpKQorI2RlZmluZSBNUEZSX0VNSU5fTUlOIG1wZnJfZ2V0X2VtaW5fbWluKCkKKyNkZWZpbmUgTVBGUl9FTUlOX01BWCBtcGZyX2dldF9lbWluX21heCgpCisjZGVmaW5lIE1QRlJfRU1BWF9NSU4gbXBmcl9nZXRfZW1heF9taW4oKQorI2RlZmluZSBNUEZSX0VNQVhfTUFYIG1wZnJfZ2V0X2VtYXhfbWF4KCkKKyNkZWZpbmUgbXBmcl92ZXJzaW9uIChtcGZyX2dldF92ZXJzaW9uKCkpCisjaWZuZGVmIG1wel9zZXRfZnIKKyMgZGVmaW5lIG1wel9zZXRfZnIgbXBmcl9nZXRfegorI2VuZGlmCisjZGVmaW5lIG1wZnJfYWRkX29uZV91bHAoeCxyKSBcCisgKG1wZnJfc2duICh4KSA+IDAgPyBtcGZyX25leHRhYm92ZSAoeCkgOiBtcGZyX25leHRiZWxvdyAoeCkpCisjZGVmaW5lIG1wZnJfc3ViX29uZV91bHAoeCxyKSBcCisgKG1wZnJfc2duICh4KSA+IDAgPyBtcGZyX25leHRiZWxvdyAoeCkgOiBtcGZyX25leHRhYm92ZSAoeCkpCisjZGVmaW5lIG1wZnJfZ2V0X3pfZXhwIG1wZnJfZ2V0X3pfMmV4cAorI2RlZmluZSBtcGZyX2N1c3RvbV9nZXRfbWFudGlzc2EgbXBmcl9jdXN0b21fZ2V0X3NpZ25pZmljYW5kCisKKyNlbmRpZiAvKiBfX01QRlJfSCAqLworCisKKy8qIENoZWNrIGlmIDxzdGRpbnQuaD4gLyA8aW50dHlwZXMuaD4gaXMgaW5jbHVkZWQgb3IgaWYgdGhlIHVzZXIKKyAgIGV4cGxpY2l0bHkgd2FudHMgaW50bWF4X3QuIEF1dG9tYXRpY2FsIGRldGVjdGlvbiBpcyBkb25lIGJ5CisgICBjaGVja2luZzoKKyAgICAgLSBJTlRNQVhfQyBhbmQgVUlOVE1BWF9DLCBidXQgbm90IGlmIHRoZSBjb21waWxlciBpcyBhIEMrKyBvbmUKKyAgICAgICAoYXMgc3VnZ2VzdGVkIGJ5IFBhdHJpY2sgUGVsaXNzaWVyKSBiZWNhdXNlIHRoZSB0ZXN0IGRvZXMgbm90CisgICAgICAgd29yayB3ZWxsIGluIHRoaXMgY2FzZS4gU2VlOgorICAgICAgICAgaHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9hcmMvbXBmci8yMDEwLTAyL21zZzAwMDI1Lmh0bWwKKyAgICAgICBXZSBkbyBub3QgY2hlY2sgSU5UTUFYX01BWCBhbmQgVUlOVE1BWF9NQVggYmVjYXVzZSB1bmRlciBTb2xhcmlzLAorICAgICAgIHRoZXNlIG1hY3JvcyBhcmUgYWx3YXlzIGRlZmluZWQgYnkgPGxpbWl0cy5oPiAoaS5lLiBldmVuIHdoZW4KKyAgICAgICA8c3RkaW50Lmg+IGFuZCA8aW50dHlwZXMuaD4gYXJlIG5vdCBpbmNsdWRlZCkuCisgICAgIC0gX1NURElOVF9IIChkZWZpbmVkIGJ5IHRoZSBnbGliYyksIF9TVERJTlRfSF8gKGRlZmluZWQgdW5kZXIKKyAgICAgICBNYWMgT1MgWCkgYW5kIF9TVERJTlQgKGRlZmluZWQgdW5kZXIgTVMgVmlzdWFsIFN0dWRpbyksIGJ1dAorICAgICAgIHRoaXMgdGVzdCBtYXkgbm90IHdvcmsgd2l0aCBhbGwgaW1wbGVtZW50YXRpb25zLgorICAgICAgIFBvcnRhYmxlIHNvZnR3YXJlIHNob3VsZCBub3QgcmVseSBvbiB0aGVzZSB0ZXN0cy4KKyovCisjaWYgKGRlZmluZWQgKElOVE1BWF9DKSAmJiBkZWZpbmVkIChVSU5UTUFYX0MpICYmICFkZWZpbmVkKF9fY3BsdXNwbHVzKSkgfHwgXAorICBkZWZpbmVkIChNUEZSX1VTRV9JTlRNQVhfVCkgfHwgXAorICBkZWZpbmVkIChfU1RESU5UX0gpIHx8IGRlZmluZWQgKF9TVERJTlRfSF8pIHx8IGRlZmluZWQgKF9TVERJTlQpCisjIGlmbmRlZiBfTVBGUl9IX0hBVkVfSU5UTUFYX1QKKyMgZGVmaW5lIF9NUEZSX0hfSEFWRV9JTlRNQVhfVCAxCisKKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgbXBmcl9zZXRfc2ogX19nbXBmcl9zZXRfc2oKKyNkZWZpbmUgbXBmcl9zZXRfc2pfMmV4cCBfX2dtcGZyX3NldF9zal8yZXhwCisjZGVmaW5lIG1wZnJfc2V0X3VqIF9fZ21wZnJfc2V0X3VqCisjZGVmaW5lIG1wZnJfc2V0X3VqXzJleHAgX19nbXBmcl9zZXRfdWpfMmV4cAorI2RlZmluZSBtcGZyX2dldF9zaiBfX2dtcGZyX21wZnJfZ2V0X3NqCisjZGVmaW5lIG1wZnJfZ2V0X3VqIF9fZ21wZnJfbXBmcl9nZXRfdWoKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zZXRfc2ogX01QRlJfUFJPVE8gKChtcGZyX3QsIGludG1heF90LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfc2V0X3NqXzJleHAgX01QRlJfUFJPVE8gKChtcGZyX3QsIGludG1heF90LCBpbnRtYXhfdCwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3NldF91aiBfTVBGUl9QUk9UTyAoKG1wZnJfdCwgdWludG1heF90LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfc2V0X3VqXzJleHAgX01QRlJfUFJPVE8gKChtcGZyX3QsIHVpbnRtYXhfdCwgaW50bWF4X3QsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnRtYXhfdCBtcGZyX2dldF9zaiBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgdWludG1heF90IG1wZnJfZ2V0X3VqIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKKworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyMgZW5kaWYgLyogX01QRlJfSF9IQVZFX0lOVE1BWF9UICovCisjZW5kaWYKKworCisvKiBDaGVjayBpZiA8c3RkaW8uaD4gaGFzIGJlZW4gaW5jbHVkZWQgb3IgaWYgdGhlIHVzZXIgd2FudHMgRklMRSAqLworI2lmIGRlZmluZWQgKF9HTVBfSF9IQVZFX0ZJTEUpIHx8IGRlZmluZWQgKE1QRlJfVVNFX0ZJTEUpCisjIGlmbmRlZiBfTVBGUl9IX0hBVkVfRklMRQorIyBkZWZpbmUgX01QRlJfSF9IQVZFX0ZJTEUgMQorCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIG1wZnJfaW5wX3N0ciBfX2dtcGZyX2lucF9zdHIKKyNkZWZpbmUgbXBmcl9vdXRfc3RyIF9fZ21wZnJfb3V0X3N0cgorX19NUEZSX0RFQ0xTUEVDIHNpemVfdCBtcGZyX2lucF9zdHIgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgRklMRSosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIHNpemVfdCBtcGZyX291dF9zdHIgX01QRlJfUFJPVE8gKChGSUxFKiwgaW50LCBzaXplX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CisjZGVmaW5lIG1wZnJfZnByaW50ZiBfX2dtcGZyX2ZwcmludGYKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9mcHJpbnRmIF9NUEZSX1BST1RPICgoRklMRSosIF9fZ21wX2NvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pKTsKKworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyMgZW5kaWYgLyogX01QRlJfSF9IQVZFX0ZJTEUgKi8KKyNlbmRpZgorCisKKy8qIGNoZWNrIGlmIDxzdGRhcmcuaD4gaGFzIGJlZW4gaW5jbHVkZWQgb3IgaWYgdGhlIHVzZXIgd2FudHMgdmFfbGlzdCAqLworI2lmIGRlZmluZWQgKF9HTVBfSF9IQVZFX1ZBX0xJU1QpIHx8IGRlZmluZWQgKE1QRlJfVVNFX1ZBX0xJU1QpCisjIGlmbmRlZiBfTVBGUl9IX0hBVkVfVkFfTElTVAorIyBkZWZpbmUgX01QRlJfSF9IQVZFX1ZBX0xJU1QgMQorCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIG1wZnJfdnByaW50ZiBfX2dtcGZyX3ZwcmludGYKKyNkZWZpbmUgbXBmcl92YXNwcmludGYgX19nbXBmcl92YXNwcmludGYKKyNkZWZpbmUgbXBmcl92c3ByaW50ZiBfX2dtcGZyX3ZzcHJpbnRmCisjZGVmaW5lIG1wZnJfdnNucHJpbnRmIF9fZ21wZnJfdnNucHJpbnRmCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfdnByaW50ZiBfTVBGUl9QUk9UTyAoKF9fZ21wX2NvbnN0IGNoYXIqLCB2YV9saXN0KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfdmFzcHJpbnRmIF9NUEZSX1BST1RPICgoY2hhcioqLCBfX2dtcF9jb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfdnNwcmludGYgX01QRlJfUFJPVE8gKChjaGFyKiwgX19nbXBfY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl92c25wcmludGYgX01QRlJfUFJPVE8gKChjaGFyKiwgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbXBfY29uc3QgY2hhciosIHZhX2xpc3QpKTsKKworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyMgZW5kaWYgLyogX01QRlJfSF9IQVZFX1ZBX0xJU1QgKi8KKyNlbmRpZgorCisKKy8qIGNoZWNrIGlmIDxzdGRhcmcuaD4gaGFzIGJlZW4gaW5jbHVkZWQgYW5kIGlmIEZJTEUgaXMgYXZhaWxhYmxlCisgICAoc2VlIGFib3ZlKSAqLworI2lmIGRlZmluZWQgKF9NUEZSX0hfSEFWRV9WQV9MSVNUKSAmJiBkZWZpbmVkIChfTVBGUl9IX0hBVkVfRklMRSkKKyMgaWZuZGVmIF9NUEZSX0hfSEFWRV9WQV9MSVNUX0ZJTEUKKyMgZGVmaW5lIF9NUEZSX0hfSEFWRV9WQV9MSVNUX0ZJTEUgMQorCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIG1wZnJfdmZwcmludGYgX19nbXBmcl92ZnByaW50ZgorX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3ZmcHJpbnRmIF9NUEZSX1BST1RPICgoRklMRSosIF9fZ21wX2NvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCkpOworCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworIyBlbmRpZiAvKiBfTVBGUl9IX0hBVkVfVkFfTElTVF9GSUxFICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9jcnRiZWdpbi5vIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydGJlZ2luLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRjNDc2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9jcnRiZWdpbi5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9jcnRiZWdpblMubyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9jcnRiZWdpblMubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTdlODAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydGJlZ2luUy5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9jcnRiZWdpblQubyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9jcnRiZWdpblQubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzE1MTcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydGJlZ2luVC5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9jcnRlbmQubyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9jcnRlbmQubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGI4MGNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydGVuZC5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9jcnRlbmRTLm8gYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvMzIvY3J0ZW5kUy5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNzk0M2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvMzIvY3J0ZW5kUy5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9jcnRmYXN0bWF0aC5vIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydGZhc3RtYXRoLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM2MzZiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9jcnRmYXN0bWF0aC5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9jcnRwcmVjMzIubyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9jcnRwcmVjMzIubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDRjNTE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydHByZWMzMi5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9jcnRwcmVjNjQubyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9jcnRwcmVjNjQubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2YyM2I0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydHByZWM2NC5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9jcnRwcmVjODAubyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9jcnRwcmVjODAubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTc4ZGZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2NydHByZWM4MC5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9saWJnY2MuYSBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9saWJnY2MuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGM4OWRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2xpYmdjYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9saWJnY2NfZWguYSBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9saWJnY2NfZWguYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzc0ZjVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44LzMyL2xpYmdjY19laC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC8zMi9saWJnY292LmEgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvMzIvbGliZ2Nvdi5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZWM0OTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvMzIvbGliZ2Nvdi5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9jcnRiZWdpbi5vIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydGJlZ2luLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlMGFjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9jcnRiZWdpbi5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9jcnRiZWdpblMubyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9jcnRiZWdpblMubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWVkYzk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydGJlZ2luUy5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9jcnRiZWdpblQubyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9jcnRiZWdpblQubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWRlOTQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydGJlZ2luVC5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9jcnRlbmQubyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9jcnRlbmQubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGI1ZDlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydGVuZC5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9jcnRlbmRTLm8gYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvY3J0ZW5kUy5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Y2UzOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvY3J0ZW5kUy5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9jcnRmYXN0bWF0aC5vIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydGZhc3RtYXRoLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYxOTIzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9jcnRmYXN0bWF0aC5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9jcnRwcmVjMzIubyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9jcnRwcmVjMzIubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzIyMDIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydHByZWMzMi5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9jcnRwcmVjNjQubyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9jcnRwcmVjNjQubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjNkZDllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydHByZWM2NC5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9jcnRwcmVjODAubyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9jcnRwcmVjODAubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjFkMzAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2NydHByZWM4MC5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlLWZpeGVkL1JFQURNRSBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlLWZpeGVkL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDg2YTc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUtZml4ZWQvUkVBRE1FCkBAIC0wLDAgKzEsMTQgQEAKK1RoaXMgUkVBRE1FIGZpbGUgaXMgY29waWVkIGludG8gdGhlIGRpcmVjdG9yeSBmb3IgR0NDLW9ubHkgaGVhZGVyIGZpbGVzCit3aGVuIGZpeGluY2x1ZGVzIGlzIHJ1biBieSB0aGUgbWFrZWZpbGUgZm9yIEdDQy4KKworTWFueSBvZiB0aGUgZmlsZXMgaW4gdGhpcyBkaXJlY3Rvcnkgd2VyZSBhdXRvbWF0aWNhbGx5IGVkaXRlZCBmcm9tIHRoZQorc3RhbmRhcmQgc3lzdGVtIGhlYWRlciBmaWxlcyBieSB0aGUgZml4aW5jbHVkZXMgcHJvY2Vzcy4gIFRoZXkgYXJlCitzeXN0ZW0tc3BlY2lmaWMsIGFuZCB3aWxsIG5vdCB3b3JrIG9uIGFueSBvdGhlciBraW5kIG9mIHN5c3RlbS4gIFRoZXkKK2FyZSBhbHNvIG5vdCBwYXJ0IG9mIEdDQy4gIFRoZSByZWFzb24gd2UgaGF2ZSB0byBkbyB0aGlzIGlzIGJlY2F1c2UKK0dDQyByZXF1aXJlcyBBTlNJIEMgaGVhZGVycyBhbmQgbWFueSB2ZW5kb3JzIHN1cHBseSBBTlNJLWluY29tcGF0aWJsZQoraGVhZGVycy4KKworQmVjYXVzZSB0aGlzIGlzIGFuIGF1dG9tYXRlZCBwcm9jZXNzLCBzb21ldGltZXMgaGVhZGVycyBnZXQgImZpeGVkIgordGhhdCBkbyBub3QsIHN0cmljdGx5IHNwZWFraW5nLCBuZWVkIGEgZml4LiAgQXMgbG9uZyBhcyBub3RoaW5nIGlzIGJyb2tlbgorYnkgdGhlIHByb2Nlc3MsIGl0IGlzIGp1c3QgYW4gdW5mb3J0dW5hdGUgY29sbGF0ZXJhbCBpbmNvbnZlbmllbmNlLgorV2Ugd291bGQgbGlrZSB0byByZWN0aWZ5IGl0LCBpZiBpdCBpcyBub3QgInRvbyBpbmNvbnZlbmllbnQiLgpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUtZml4ZWQvbGltaXRzLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS1maXhlZC9saW1pdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjQwYTg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUtZml4ZWQvbGltaXRzLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5Mi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1VuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBUaGlzIGFkbWluaXN0cml2aWEgZ2V0cyBhZGRlZCB0byB0aGUgYmVnaW5uaW5nIG9mIGxpbWl0cy5oCisgICBpZiB0aGUgc3lzdGVtIGhhcyBpdHMgb3duIHZlcnNpb24gb2YgbGltaXRzLmguICAqLworCisvKiBXZSB1c2UgX0dDQ19MSU1JVFNfSF8gYmVjYXVzZSB3ZSB3YW50IHRoaXMgbm90IHRvIG1hdGNoCisgICBhbnkgbWFjcm9zIHRoYXQgdGhlIHN5c3RlbSdzIGxpbWl0cy5oIHVzZXMgZm9yIGl0cyBvd24gcHVycG9zZXMuICAqLworI2lmbmRlZiBfR0NDX0xJTUlUU19IXyAgLyogVGVybWluYXRlZCBpbiBsaW1pdHkuaC4gICovCisjZGVmaW5lIF9HQ0NfTElNSVRTX0hfCisKKyNpZm5kZWYgX0xJQkNfTElNSVRTX0hfCisvKiBVc2UgIi4uLiIgc28gdGhhdCB3ZSBmaW5kIHN5c2xpbWl0cy5oIG9ubHkgaW4gdGhpcyBzYW1lIGRpcmVjdG9yeS4gICovCisjaW5jbHVkZSAic3lzbGltaXRzLmgiCisjZW5kaWYKKy8qIENvcHlyaWdodCAoQykgMTk5MS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1VuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9MSU1JVFNfSF9fXworI2RlZmluZSBfTElNSVRTX0hfX18KKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSBgY2hhcicuICAqLworI3VuZGVmIENIQVJfQklUCisjZGVmaW5lIENIQVJfQklUIF9fQ0hBUl9CSVRfXworCisvKiBNYXhpbXVtIGxlbmd0aCBvZiBhIG11bHRpYnl0ZSBjaGFyYWN0ZXIuICAqLworI2lmbmRlZiBNQl9MRU5fTUFYCisjZGVmaW5lIE1CX0xFTl9NQVggMQorI2VuZGlmCisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBjaGFyJyBjYW4gaG9sZC4gICovCisjdW5kZWYgU0NIQVJfTUlOCisjZGVmaW5lIFNDSEFSX01JTiAoLVNDSEFSX01BWCAtIDEpCisjdW5kZWYgU0NIQVJfTUFYCisjZGVmaW5lIFNDSEFSX01BWCBfX1NDSEFSX01BWF9fCisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIGNoYXInIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMCkuICAqLworI3VuZGVmIFVDSEFSX01BWAorI2lmIF9fU0NIQVJfTUFYX18gPT0gX19JTlRfTUFYX18KKyMgZGVmaW5lIFVDSEFSX01BWCAoU0NIQVJfTUFYICogMlUgKyAxVSkKKyNlbHNlCisjIGRlZmluZSBVQ0hBUl9NQVggKFNDSEFSX01BWCAqIDIgKyAxKQorI2VuZGlmCisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYGNoYXInIGNhbiBob2xkLiAgKi8KKyNpZmRlZiBfX0NIQVJfVU5TSUdORURfXworIyB1bmRlZiBDSEFSX01JTgorIyBpZiBfX1NDSEFSX01BWF9fID09IF9fSU5UX01BWF9fCisjICBkZWZpbmUgQ0hBUl9NSU4gMFUKKyMgZWxzZQorIyAgZGVmaW5lIENIQVJfTUlOIDAKKyMgZW5kaWYKKyMgdW5kZWYgQ0hBUl9NQVgKKyMgZGVmaW5lIENIQVJfTUFYIFVDSEFSX01BWAorI2Vsc2UKKyMgdW5kZWYgQ0hBUl9NSU4KKyMgZGVmaW5lIENIQVJfTUlOIFNDSEFSX01JTgorIyB1bmRlZiBDSEFSX01BWAorIyBkZWZpbmUgQ0hBUl9NQVggU0NIQVJfTUFYCisjZW5kaWYKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIHNob3J0IGludCcgY2FuIGhvbGQuICAqLworI3VuZGVmIFNIUlRfTUlOCisjZGVmaW5lIFNIUlRfTUlOICgtU0hSVF9NQVggLSAxKQorI3VuZGVmIFNIUlRfTUFYCisjZGVmaW5lIFNIUlRfTUFYIF9fU0hSVF9NQVhfXworCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBzaG9ydCBpbnQnIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMCkuICAqLworI3VuZGVmIFVTSFJUX01BWAorI2lmIF9fU0hSVF9NQVhfXyA9PSBfX0lOVF9NQVhfXworIyBkZWZpbmUgVVNIUlRfTUFYIChTSFJUX01BWCAqIDJVICsgMVUpCisjZWxzZQorIyBkZWZpbmUgVVNIUlRfTUFYIChTSFJUX01BWCAqIDIgKyAxKQorI2VuZGlmCisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBpbnQnIGNhbiBob2xkLiAgKi8KKyN1bmRlZiBJTlRfTUlOCisjZGVmaW5lIElOVF9NSU4gKC1JTlRfTUFYIC0gMSkKKyN1bmRlZiBJTlRfTUFYCisjZGVmaW5lIElOVF9NQVggX19JTlRfTUFYX18KKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgaW50JyBjYW4gaG9sZC4gIChNaW5pbXVtIGlzIDApLiAgKi8KKyN1bmRlZiBVSU5UX01BWAorI2RlZmluZSBVSU5UX01BWCAoSU5UX01BWCAqIDJVICsgMVUpCisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBsb25nIGludCcgY2FuIGhvbGQuCisgICAoU2FtZSBhcyBgaW50JykuICAqLworI3VuZGVmIExPTkdfTUlOCisjZGVmaW5lIExPTkdfTUlOICgtTE9OR19NQVggLSAxTCkKKyN1bmRlZiBMT05HX01BWAorI2RlZmluZSBMT05HX01BWCBfX0xPTkdfTUFYX18KKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgbG9uZyBpbnQnIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMCkuICAqLworI3VuZGVmIFVMT05HX01BWAorI2RlZmluZSBVTE9OR19NQVggKExPTkdfTUFYICogMlVMICsgMVVMKQorCisjaWYgZGVmaW5lZCAoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhIGBzaWduZWQgbG9uZyBsb25nIGludCcgY2FuIGhvbGQuICAqLworIyB1bmRlZiBMTE9OR19NSU4KKyMgZGVmaW5lIExMT05HX01JTiAoLUxMT05HX01BWCAtIDFMTCkKKyMgdW5kZWYgTExPTkdfTUFYCisjIGRlZmluZSBMTE9OR19NQVggX19MT05HX0xPTkdfTUFYX18KKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgbG9uZyBsb25nIGludCcgY2FuIGhvbGQuICAoTWluaW11bSBpcyAwKS4gICovCisjIHVuZGVmIFVMTE9OR19NQVgKKyMgZGVmaW5lIFVMTE9OR19NQVggKExMT05HX01BWCAqIDJVTEwgKyAxVUxMKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dOVV9MSUJSQVJZX18pID8gZGVmaW5lZCAoX19VU0VfR05VKSA6ICFkZWZpbmVkIChfX1NUUklDVF9BTlNJX18pCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhIGBzaWduZWQgbG9uZyBsb25nIGludCcgY2FuIGhvbGQuICAqLworIyB1bmRlZiBMT05HX0xPTkdfTUlOCisjIGRlZmluZSBMT05HX0xPTkdfTUlOICgtTE9OR19MT05HX01BWCAtIDFMTCkKKyMgdW5kZWYgTE9OR19MT05HX01BWAorIyBkZWZpbmUgTE9OR19MT05HX01BWCBfX0xPTkdfTE9OR19NQVhfXworCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBsb25nIGxvbmcgaW50JyBjYW4gaG9sZC4gIChNaW5pbXVtIGlzIDApLiAgKi8KKyMgdW5kZWYgVUxPTkdfTE9OR19NQVgKKyMgZGVmaW5lIFVMT05HX0xPTkdfTUFYIChMT05HX0xPTkdfTUFYICogMlVMTCArIDFVTEwpCisjZW5kaWYKKworI2VuZGlmIC8qIF9MSU1JVFNfSF9fXyAqLworLyogVGhpcyBhZG1pbmlzdHJpdmlhIGdldHMgYWRkZWQgdG8gdGhlIGVuZCBvZiBsaW1pdHMuaAorICAgaWYgdGhlIHN5c3RlbSBoYXMgaXRzIG93biB2ZXJzaW9uIG9mIGxpbWl0cy5oLiAgKi8KKworI2Vsc2UgLyogbm90IF9HQ0NfTElNSVRTX0hfICovCisKKyNpZmRlZiBfR0NDX05FWFRfTElNSVRTX0gKKyNpbmNsdWRlX25leHQgPGxpbWl0cy5oPgkJLyogcmVjdXJzZSBkb3duIHRvIHRoZSByZWFsIG9uZSAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBub3QgX0dDQ19MSU1JVFNfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlLWZpeGVkL3N5c2xpbWl0cy5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUtZml4ZWQvc3lzbGltaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM2MjgwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlLWZpeGVkL3N5c2xpbWl0cy5oCkBAIC0wLDAgKzEsOCBAQAorLyogc3lzbGltaXRzLmggc3RhbmRzIGZvciB0aGUgc3lzdGVtJ3Mgb3duIGxpbWl0cy5oIGZpbGUuCisgICBJZiB3ZSBjYW4gdXNlIGl0IG9rIHVubW9kaWZpZWQsIHRoZW4gd2UgaW5zdGFsbCB0aGlzIHRleHQuCisgICBJZiBmaXhpbmNsdWRlcyBmaXhlcyBpdCwgdGhlbiB0aGUgZml4ZWQgdmVyc2lvbiBpcyBpbnN0YWxsZWQKKyAgIGluc3RlYWQgb2YgdGhpcyB0ZXh0LiAgKi8KKworI2RlZmluZSBfR0NDX05FWFRfTElNSVRTX0gJCS8qIHRlbGwgZ2NjJ3MgbGltaXRzLmggdG8gcmVjdXJzZSAqLworI2luY2x1ZGVfbmV4dCA8bGltaXRzLmg+CisjdW5kZWYgX0dDQ19ORVhUX0xJTUlUU19ICmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9hZHhpbnRyaW4uaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2FkeGludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMGVhOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9hZHhpbnRyaW4uaApAQCAtMCwwICsxLDQ5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmICFkZWZpbmVkIF9YODZJTlRSSU5fSF9JTkNMVURFRCAmJiAhZGVmaW5lZCBfSU1NSU5UUklOX0hfSU5DTFVERUQKKyMgZXJyb3IgIk5ldmVyIHVzZSA8YWR4aW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDx4ODZpbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfQURYSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX0FEWElOVFJJTl9IX0lOQ0xVREVECisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBjaGFyCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19hZGRjYXJyeXhfdTMyICh1bnNpZ25lZCBjaGFyIF9fQ0YsIHVuc2lnbmVkIGludCBfX1gsCisJCXVuc2lnbmVkIGludCBfX1ksIHVuc2lnbmVkIGludCAqX19QKQoreworICAgIHJldHVybiBfX2J1aWx0aW5faWEzMl9hZGRjYXJyeXhfdTMyIChfX0NGLCBfX1gsIF9fWSwgX19QKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBjaGFyCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19hZGRjYXJyeXhfdTY0ICh1bnNpZ25lZCBjaGFyIF9fQ0YsIHVuc2lnbmVkIGxvbmcgX19YLAorCQl1bnNpZ25lZCBsb25nIF9fWSwgdW5zaWduZWQgbG9uZyBsb25nICpfX1ApCit7CisgICAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2FkZGNhcnJ5eF91NjQgKF9fQ0YsIF9fWCwgX19ZLCBfX1ApOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfQURYSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2FtbWludHJpbi5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvYW1taW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzExMjkyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2FtbWludHJpbi5oCkBAIC0wLDAgKzEsODggQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBJbXBsZW1lbnRlZCBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGluY2x1ZGVkIGluIHRoZSBBTUQgUHJvZ3JhbW1lcnMKKyAgIE1hbnVhbCBVcGRhdGUsIHZlcnNpb24gMi54ICovCisKKyNpZm5kZWYgX0FNTUlOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9BTU1JTlRSSU5fSF9JTkNMVURFRAorCisjaWZuZGVmIF9fU1NFNEFfXworIyBlcnJvciAiU1NFNEEgaW5zdHJ1Y3Rpb24gc2V0IG5vdCBlbmFibGVkIgorI2Vsc2UKKworLyogV2UgbmVlZCBkZWZpbml0aW9ucyBmcm9tIHRoZSBTU0UzLCBTU0UyIGFuZCBTU0UgaGVhZGVyIGZpbGVzKi8KKyNpbmNsdWRlIDxwbW1pbnRyaW4uaD4KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RyZWFtX3NkIChkb3VibGUgKiBfX1AsIF9fbTEyOGQgX19ZKQoreworICBfX2J1aWx0aW5faWEzMl9tb3ZudHNkIChfX1AsIChfX3YyZGYpIF9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0cmVhbV9zcyAoZmxvYXQgKiBfX1AsIF9fbTEyOCBfX1kpCit7CisgIF9fYnVpbHRpbl9pYTMyX21vdm50c3MgKF9fUCwgKF9fdjRzZikgX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZXh0cmFjdF9zaTY0IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfZXh0cnEgKChfX3YyZGkpIF9fWCwgKF9fdjE2cWkpIF9fWSk7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2V4dHJhY3RpX3NpNjQgKF9fbTEyOGkgX19YLCB1bnNpZ25lZCBjb25zdCBpbnQgX19JLCB1bnNpZ25lZCBjb25zdCBpbnQgX19MKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2V4dHJxaSAoKF9fdjJkaSkgX19YLCBfX0ksIF9fTCk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fZXh0cmFjdGlfc2k2NChYLCBJLCBMKQkJCQkJXAorICAoKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2V4dHJxaSAoKF9fdjJkaSkoX19tMTI4aSkoWCksCQlcCisJCQkJICAgICh1bnNpZ25lZCBpbnQpKEkpLCAodW5zaWduZWQgaW50KShMKSkpCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faW5zZXJ0X3NpNjQgKF9fbTEyOGkgX19YLF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2luc2VydHEgKChfX3YyZGkpX19YLCAoX192MmRpKV9fWSk7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2luc2VydGlfc2k2NChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1ksIHVuc2lnbmVkIGNvbnN0IGludCBfX0ksIHVuc2lnbmVkIGNvbnN0IGludCBfX0wpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfaW5zZXJ0cWkgKChfX3YyZGkpX19YLCAoX192MmRpKV9fWSwgX19JLCBfX0wpOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX2luc2VydGlfc2k2NChYLCBZLCBJLCBMKQkJCQkJXAorICAoKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2luc2VydHFpICgoX192MmRpKShfX20xMjhpKShYKSwJCVwKKwkJCQkgICAgICAoX192MmRpKShfX20xMjhpKShZKSwJCVwKKwkJCQkgICAgICAodW5zaWduZWQgaW50KShJKSwgKHVuc2lnbmVkIGludCkoTCkpKQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NTRTRBX18gKi8KKworI2VuZGlmIC8qIF9BTU1JTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvYXJtX25lb24uaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2FybV9uZW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY5MjE1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2FybV9uZW9uLmgKQEAgLTAsMCArMSwxNjYyMCBAQAorLy9jcmVhdGVkIGJ5IFZpY3RvcmlhIFpoaXNsaW5hLCB0aGUgU2VuaW9yIEFwcGxpY2F0aW9uIEVuZ2luZWVyLCBJbnRlbCBDb3Jwb3JhdGlvbiwgIHZpY3RvcmlhLnpoaXNsaW5hQGludGVsLmNvbQorCisvLyoqKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKy8vSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKworLy9CeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpY2Vuc2UgQWdyZWVtZW50CisKKy8vUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvL3B1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKy8vY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKworLy9USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSAorLy9SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKKy8vQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULAorLy9JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00KKy8vTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKy8vT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorLy9QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gc2ltcGxpZnkgQVJNLT5JQTMyIHBvcnRpbmcKKy8vIEl0IG1ha2VzIHRoZSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIEFSTSBORU9OIGludHJpbnNpY3MgKGFzIGRlZmluZWQgaW4gImFybV9uZW9uLmgiKQorLy8gYW5kIHg4NiBTU0UodXAgdG8gU1NFNC4yKSBpbnRyaW5zaWMgZnVuY3Rpb25zIGFzIGRlZmluZWQgaW4gaGVhZGVycyBmaWxlcyBiZWxvdworLy8gTU1YIGluc3RydWN0aW9uIHNldCBpcyBub3QgdXNlZCBkdWUgdG8gcGVyZm9ybWFuY2Ugb3ZlcmhlYWQgYW5kIHRoZSBuZWNlc3NpdHkgdG8gdXNlIHRoZQorLy8gRU1NUyBpbnN0cnVjdGlvbiAoX21tX2VtcHR5KCkpZm9yIG1teC14ODcgZmxvYXRpbmcgcG9pbnQgc3dpdGNoaW5nCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8vISEhISEhISAgVG8gdXNlIHRoaXMgZmlsZSBpbiB5b3VyIHByb2plY3QgdGhhdCB1c2VzIEFSTSBORU9OIGludGluc2ljcyBqdXN0IGtlZXAgYXJtX25lb24uaCBpbmNsdWRlZCBhbmQgY29tcGxpbGUgaXQgYXMgdXN1YWwuCisvLyEhISEhISEgIFBsZWFzZSBwYXkgYXR0ZW50aW9uIGF0IFVTRV9TU0U0IGJlbG93IC0geW91IG5lZWQgdG8gZGVmaW5lIGl0IGZvciBuZXdlc3QgSW50ZWwgcGxhdGZvcm1zIGZvcgorLy8hISEhISEhICBncmVhdGVyIHBlcmZvcm1hbmNlLiBJdCBjYW4gYmUgZG9uZSBieSAtbXNzZTQuMiBjb21waWxlciBzd2l0Y2guCisKKyNpZm5kZWYgTkVPTjJTU0VfSAorI2RlZmluZSBORU9OMlNTRV9ICisKKyNpZm5kZWYgVVNFX1NTRTQKKyNpZiBkZWZpbmVkKF9fU1NFNF8yX18pCisgICAgI2RlZmluZSBVU0VfU1NFNAorI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPHhtbWludHJpbi5oPiAgICAgLy9TU0UKKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4gICAgIC8vU1NFMgorI2luY2x1ZGUgPHBtbWludHJpbi5oPiAgICAgLy9TU0UzCisjaW5jbHVkZSA8dG1taW50cmluLmg+ICAgICAvL1NTU0UzCisjaWZkZWYgVVNFX1NTRTQKKyNpbmNsdWRlIDxzbW1pbnRyaW4uaD4gLy9TU0U0LjEKKyNpbmNsdWRlIDxubW1pbnRyaW4uaD4gLy9TU0U0LjIKKyNlbmRpZgorCisKKy8vKioqKioqKioqKioqKioqICBmdW5jdGlvbnMgYW5kIGRhdGEgYXR0cmlidXRlcywgY29tcGlsZXIgZGVwZW5kZW50ICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBfR0NDX1ZFUlNJT04gKF9fR05VQ19fICogMTAwMDAgKyBfX0dOVUNfTUlOT1JfXyAqIDEwMCArIF9fR05VQ19QQVRDSExFVkVMX18pCisjZGVmaW5lIF9ORU9OMlNTRV9BTElHTl8xNiAgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKQorI2RlZmluZSBfTkVPTjJTU0VfSU5MSU5FIGV4dGVybiBpbmxpbmUgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCisjaWYgX0dDQ19WRVJTSU9OIDwgIDQwNTAwCisgICAgI2RlZmluZSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhmdW5jdGlvbiwgZXhwbGFuYXRpb24pICAgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpIGZ1bmN0aW9uCisjZWxzZQorICAgICNkZWZpbmUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoZnVuY3Rpb24sIGV4cGxhbmF0aW9uKSAgIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQoZXhwbGFuYXRpb24pKSkgZnVuY3Rpb24KKyNlbmRpZgorI2lmIGRlZmluZWQoX194ODZfNjRfXykKKyAgICAjZGVmaW5lIF9ORU9OMlNTRV82NEJJVCAgX194ODZfNjRfXworI2VuZGlmCisjZWxzZQorI2RlZmluZSBfTkVPTjJTU0VfQUxJR05fMTYgIF9fZGVjbHNwZWMoYWxpZ24oMTYpKQorI2RlZmluZSBfTkVPTjJTU0VfSU5MSU5FIF9faW5saW5lCisjaWYgZGVmaW5lZChfTVNDX1ZFUil8fCBkZWZpbmVkIChfX0lOVEVMX0NPTVBJTEVSKQorICAgICNkZWZpbmUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoZnVuY3Rpb24sIEVYUExBTkFUSU9OKSBfX2RlY2xzcGVjKGRlcHJlY2F0ZWQoRVhQTEFOQVRJT04pKSBmdW5jdGlvbgorI2lmIGRlZmluZWQoX01fWDY0KQorICAgICAgICAjZGVmaW5lIF9ORU9OMlNTRV82NEJJVCAgX01fWDY0CisjZW5kaWYKKyNlbHNlCisgICAgI2RlZmluZSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhmdW5jdGlvbiwgZXhwbGFuYXRpb24pICBmdW5jdGlvbgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgIChfTkVPTjJTU0VfNjRCSVQpICYmIGRlZmluZWQgKFVTRV9TU0U0KQorICAgICNkZWZpbmUgX05FT04yU1NFXzY0QklUX1NTRTQKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gICAgZGF0YSB0eXBlcyBjb252ZXJzaW9uCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA8IDEzMDApCisgICAgdHlwZWRlZiBzaWduZWQgY2hhciBpbnQ4X3Q7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVpbnQ4X3Q7CisgICAgdHlwZWRlZiBzaWduZWQgc2hvcnQgaW50MTZfdDsKKyAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVpbnQxNl90OworICAgIHR5cGVkZWYgc2lnbmVkIGludCBpbnQzMl90OworICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQzMl90OworICAgIHR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBpbnQ2NF90OworICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnQ2NF90OworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICB0eXBlZGVmIHNpZ25lZCBfX2ludDggaW50OF90OworICAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ4IHVpbnQ4X3Q7CisgICAgdHlwZWRlZiBzaWduZWQgX19pbnQxNiBpbnQxNl90OworICAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQxNiB1aW50MTZfdDsKKyAgICB0eXBlZGVmIHNpZ25lZCBfX2ludDMyIGludDMyX3Q7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDMyIHVpbnQzMl90OworCisgICAgdHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIGludDY0X3Q7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2VuZGlmCisKK3R5cGVkZWYgdW5pb24gICBfX202NF8xMjggeworICAgIHVpbnQ2NF90IG02NF91NjRbMV07CisgICAgZmxvYXQgbTY0X2YzMlsyXTsKKyAgICBpbnQ4X3QgbTY0X2k4WzhdOworICAgIGludDE2X3QgbTY0X2kxNls0XTsKKyAgICBpbnQzMl90IG02NF9pMzJbMl07CisgICAgaW50NjRfdCBtNjRfaTY0WzFdOworICAgIHVpbnQ4X3QgbTY0X3U4WzhdOworICAgIHVpbnQxNl90IG02NF91MTZbNF07CisgICAgdWludDMyX3QgbTY0X3UzMlsyXTsKK30gX19tNjRfMTI4OworCit0eXBlZGVmIF9fbTY0XzEyOCBpbnQ4eDhfdDsKK3R5cGVkZWYgX19tNjRfMTI4IHVpbnQ4eDhfdDsKK3R5cGVkZWYgX19tNjRfMTI4IGludDE2eDRfdDsKK3R5cGVkZWYgX19tNjRfMTI4IHVpbnQxNng0X3Q7Cit0eXBlZGVmIF9fbTY0XzEyOCBpbnQzMngyX3Q7Cit0eXBlZGVmIF9fbTY0XzEyOCB1aW50MzJ4Ml90OwordHlwZWRlZiBfX202NF8xMjggaW50NjR4MV90OwordHlwZWRlZiBfX202NF8xMjggdWludDY0eDFfdDsKK3R5cGVkZWYgX19tNjRfMTI4IHBvbHk4eDhfdDsKK3R5cGVkZWYgX19tNjRfMTI4IHBvbHkxNng0X3Q7CisKK3R5cGVkZWYgX19tNjRfMTI4IGZsb2F0MzJ4Ml90OwordHlwZWRlZiBfX20xMjggZmxvYXQzMng0X3Q7CisKK3R5cGVkZWYgX19tMTI4IGZsb2F0MTZ4NF90OyAvL25vdCBzdXBwb3J0ZWQgYnkgSUEsIGZvciBjb21wYXRpYmlsaXR5Cit0eXBlZGVmIF9fbTEyOCBmbG9hdDE2eDhfdDsgLy9ub3Qgc3VwcG9ydGVkIGJ5IElBLCBmb3IgY29tcGF0aWJpbGl0eQorCit0eXBlZGVmIF9fbTEyOGkgaW50OHgxNl90OwordHlwZWRlZiBfX20xMjhpIGludDE2eDhfdDsKK3R5cGVkZWYgX19tMTI4aSBpbnQzMng0X3Q7Cit0eXBlZGVmIF9fbTEyOGkgaW50NjR4Ml90OwordHlwZWRlZiBfX20xMjhpIHVpbnQ4eDE2X3Q7Cit0eXBlZGVmIF9fbTEyOGkgdWludDE2eDhfdDsKK3R5cGVkZWYgX19tMTI4aSB1aW50MzJ4NF90OwordHlwZWRlZiBfX20xMjhpIHVpbnQ2NHgyX3Q7Cit0eXBlZGVmIF9fbTEyOGkgcG9seTh4MTZfdDsKK3R5cGVkZWYgX19tMTI4aSBwb2x5MTZ4OF90OworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICAjZGVmaW5lIFNJTlRfTUlOICAgICAoLTIxNDc0ODM2NDcgLSAxKSAvKiBtaW4gc2lnbmVkIGludCB2YWx1ZSAqLworICAgICNkZWZpbmUgU0lOVF9NQVggICAgICAgMjE0NzQ4MzY0NyAvKiBtYXggc2lnbmVkIGludCB2YWx1ZSAqLworI2Vsc2UKKyAgICAjZGVmaW5lIFNJTlRfTUlOICAgICBJTlRfTUlOIC8qIG1pbiBzaWduZWQgaW50IHZhbHVlICovCisgICAgI2RlZmluZSBTSU5UX01BWCAgICAgSU5UX01BWCAvKiBtYXggc2lnbmVkIGludCB2YWx1ZSAqLworI2VuZGlmCisKK3R5cGVkZWYgICBmbG9hdCBmbG9hdDMyX3Q7Cit0eXBlZGVmICAgZmxvYXQgX19mcDE2OworCit0eXBlZGVmICB1aW50OF90IHBvbHk4X3Q7Cit0eXBlZGVmICB1aW50MTZfdCBwb2x5MTZfdDsKKworCisvL01TVkMgY29tcGlsZXJzICh0ZXN0ZWQgdXAgdG8gMjAxMiBWUyB2ZXJzaW9uKSBkb2Vzbid0IGFsbG93IHVzaW5nIHN0cnVjdHVyZXMgb3IgYXJyYXlzIG9mIF9fbTEyOHggdHlwZSAgYXMgZnVuY3Rpb25zIGFyZ3VtZW50cyByZXN1bHRpbmcgaW4KKy8vZXJyb3IgQzI3MTk6ICdzcmMnOiBmb3JtYWwgcGFyYW1ldGVyIHdpdGggX19kZWNsc3BlYyhhbGlnbignMTYnKSkgd29uJ3QgYmUgYWxpZ25lZC4gIFRvIGF2b2lkIGl0IHdlIG5lZWQgdGhlIHNwZWNpYWwgdHJpY2sgZm9yIGZ1bmN0aW9ucyB0aGF0IHVzZSB0aGVzZSB0eXBlcworc3RydWN0IGludDh4MTZ4Ml90IHsKKyAgICBpbnQ4eDE2X3QgdmFsWzJdOworfTsKK3N0cnVjdCBpbnQxNng4eDJfdCB7CisgICAgaW50MTZ4OF90IHZhbFsyXTsKK307CitzdHJ1Y3QgaW50MzJ4NHgyX3QgeworICAgIGludDMyeDRfdCB2YWxbMl07Cit9Oworc3RydWN0IGludDY0eDJ4Ml90IHsKKyAgICBpbnQ2NHgyX3QgdmFsWzJdOworfTsKKy8vVW5mb3J0dW5hdGVseSB3ZSBhcmUgdW5hYmxlIHRvIG1lcmdlIHR3byA2NC1iaXRzIGluIG9uIDEyOCBiaXQgcmVnaXN0ZXIgYmVjYXVzZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGFjY2VzcyB2YWxbbl0gbWVtYmVycyBleHBsaWNpdGx5ISEhCitzdHJ1Y3QgaW50OHg4eDJfdCB7CisgICAgaW50OHg4X3QgdmFsWzJdOworfTsKK3N0cnVjdCBpbnQxNng0eDJfdCB7CisgICAgaW50MTZ4NF90IHZhbFsyXTsKK307CitzdHJ1Y3QgaW50MzJ4MngyX3QgeworICAgIGludDMyeDJfdCB2YWxbMl07Cit9Oworc3RydWN0IGludDY0eDF4Ml90IHsKKyAgICBpbnQ2NHgxX3QgdmFsWzJdOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgaW50OHgxNngyX3QgaW50OHgxNngyX3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgaW50MTZ4OHgyX3QgaW50MTZ4OHgyX3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgaW50MzJ4NHgyX3QgaW50MzJ4NHgyX3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgaW50NjR4MngyX3QgaW50NjR4MngyX3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQorCit0eXBlZGVmIHN0cnVjdCBpbnQ4eDh4Ml90IGludDh4OHgyX3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgaW50MTZ4NHgyX3QgaW50MTZ4NHgyX3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgaW50MzJ4MngyX3QgaW50MzJ4MngyX3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgaW50NjR4MXgyX3QgaW50NjR4MXgyX3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQorCisvKiB0byBhdm9pZCBwb2ludGVyIGNvbnZlcnNpb25zIHRoZSBmb2xsb3dpbmcgdW5zaWduZWQgaW50ZWdlcnMgc3RydWN0dXJlcyBhcmUgZGVmaW5lZCB2aWEgdGhlIGNvcnJlc3BvbmRpbmcgc2lnbmVkIGludGVnZXJzIHN0cnVjdHVyZXMgYWJvdmUgKi8KK3R5cGVkZWYgc3RydWN0IGludDh4MTZ4Ml90IHVpbnQ4eDE2eDJfdDsKK3R5cGVkZWYgc3RydWN0IGludDE2eDh4Ml90IHVpbnQxNng4eDJfdDsKK3R5cGVkZWYgc3RydWN0IGludDMyeDR4Ml90IHVpbnQzMng0eDJfdDsKK3R5cGVkZWYgc3RydWN0IGludDY0eDJ4Ml90IHVpbnQ2NHgyeDJfdDsKK3R5cGVkZWYgc3RydWN0IGludDh4MTZ4Ml90IHBvbHk4eDE2eDJfdDsKK3R5cGVkZWYgc3RydWN0IGludDE2eDh4Ml90IHBvbHkxNng4eDJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaW50OHg4eDJfdCB1aW50OHg4eDJfdDsKK3R5cGVkZWYgc3RydWN0IGludDE2eDR4Ml90IHVpbnQxNng0eDJfdDsKK3R5cGVkZWYgc3RydWN0IGludDMyeDJ4Ml90IHVpbnQzMngyeDJfdDsKK3R5cGVkZWYgc3RydWN0IGludDY0eDF4Ml90IHVpbnQ2NHgxeDJfdDsKK3R5cGVkZWYgc3RydWN0IGludDh4OHgyX3QgcG9seTh4OHgyX3Q7Cit0eXBlZGVmIHN0cnVjdCBpbnQxNng0eDJfdCBwb2x5MTZ4NHgyX3Q7CisKKy8vZmxvYXQKK3N0cnVjdCBmbG9hdDMyeDR4Ml90IHsKKyAgICBmbG9hdDMyeDRfdCB2YWxbMl07Cit9Oworc3RydWN0IGZsb2F0MTZ4OHgyX3QgeworICAgIGZsb2F0MTZ4OF90IHZhbFsyXTsKK307CitzdHJ1Y3QgZmxvYXQzMngyeDJfdCB7CisgICAgZmxvYXQzMngyX3QgdmFsWzJdOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZmxvYXQzMng0eDJfdCBmbG9hdDMyeDR4Ml90OyAvL2ZvciBDIGNvbXBpbGVycyB0byBtYWtlIHRoZW0gaGFwcHkKK3R5cGVkZWYgc3RydWN0IGZsb2F0MTZ4OHgyX3QgZmxvYXQxNng4eDJfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmIHN0cnVjdCAgZmxvYXQzMngyeDJfdCBmbG9hdDMyeDJ4Ml90OyAvL2ZvciBDIGNvbXBpbGVycyB0byBtYWtlIHRoZW0gaGFwcHkKK3R5cGVkZWYgIGZsb2F0MTZ4OHgyX3QgZmxvYXQxNng0eDJfdDsKKworLy80CitzdHJ1Y3QgaW50OHgxNng0X3QgeworICAgIGludDh4MTZfdCB2YWxbNF07Cit9Oworc3RydWN0IGludDE2eDh4NF90IHsKKyAgICBpbnQxNng4X3QgdmFsWzRdOworfTsKK3N0cnVjdCBpbnQzMng0eDRfdCB7CisgICAgaW50MzJ4NF90IHZhbFs0XTsKK307CitzdHJ1Y3QgaW50NjR4Mng0X3QgeworICAgIGludDY0eDJfdCB2YWxbNF07Cit9OworCitzdHJ1Y3QgaW50OHg4eDRfdCB7CisgICAgaW50OHg4X3QgdmFsWzRdOworfTsKK3N0cnVjdCBpbnQxNng0eDRfdCB7CisgICAgaW50MTZ4NF90IHZhbFs0XTsKK307CitzdHJ1Y3QgaW50MzJ4Mng0X3QgeworICAgIGludDMyeDJfdCB2YWxbNF07Cit9Oworc3RydWN0IGludDY0eDF4NF90IHsKKyAgICBpbnQ2NHgxX3QgdmFsWzRdOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgaW50OHgxNng0X3QgaW50OHgxNng0X3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgaW50MTZ4OHg0X3QgaW50MTZ4OHg0X3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgaW50MzJ4NHg0X3QgaW50MzJ4NHg0X3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgaW50NjR4Mng0X3QgaW50NjR4Mng0X3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQorCit0eXBlZGVmIHN0cnVjdCBpbnQ4eDh4NF90IGludDh4OHg0X3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgaW50MTZ4NHg0X3QgaW50MTZ4NHg0X3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgaW50MzJ4Mng0X3QgaW50MzJ4Mng0X3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgaW50NjR4MXg0X3QgaW50NjR4MXg0X3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQorCisvKiB0byBhdm9pZCBwb2ludGVyIGNvbnZlcnNpb25zIHRoZSBmb2xsb3dpbmcgdW5zaWduZWQgaW50ZWdlcnMgc3RydWN0dXJlcyBhcmUgZGVmaW5lZCB2aWEgdGhlIGNvcnJlc3BvbmRpbmcgc2lnbmVkIGludGVnZXJzIGRlYWxpbmcgc3RydWN0dXJlcyBhYm92ZToqLwordHlwZWRlZiBzdHJ1Y3QgaW50OHg4eDRfdCB1aW50OHg4eDRfdDsKK3R5cGVkZWYgc3RydWN0IGludDE2eDR4NF90IHVpbnQxNng0eDRfdDsKK3R5cGVkZWYgc3RydWN0IGludDMyeDJ4NF90IHVpbnQzMngyeDRfdDsKK3R5cGVkZWYgc3RydWN0IGludDY0eDF4NF90IHVpbnQ2NHgxeDRfdDsKK3R5cGVkZWYgc3RydWN0IGludDh4OHg0X3QgcG9seTh4OHg0X3Q7Cit0eXBlZGVmIHN0cnVjdCBpbnQxNng0eDRfdCBwb2x5MTZ4NHg0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGludDh4MTZ4NF90IHVpbnQ4eDE2eDRfdDsKK3R5cGVkZWYgc3RydWN0IGludDE2eDh4NF90IHVpbnQxNng4eDRfdDsKK3R5cGVkZWYgc3RydWN0IGludDMyeDR4NF90IHVpbnQzMng0eDRfdDsKK3R5cGVkZWYgc3RydWN0IGludDY0eDJ4NF90IHVpbnQ2NHgyeDRfdDsKK3R5cGVkZWYgc3RydWN0IGludDh4MTZ4NF90IHBvbHk4eDE2eDRfdDsKK3R5cGVkZWYgc3RydWN0IGludDE2eDh4NF90IHBvbHkxNng4eDRfdDsKKworc3RydWN0IGZsb2F0MzJ4NHg0X3QgeworICAgIGZsb2F0MzJ4NF90IHZhbFs0XTsKK307CitzdHJ1Y3QgZmxvYXQxNng4eDRfdCB7CisgICAgZmxvYXQxNng4X3QgdmFsWzRdOworfTsKK3N0cnVjdCBmbG9hdDMyeDJ4NF90IHsKKyAgICBmbG9hdDMyeDJfdCB2YWxbNF07Cit9OworCit0eXBlZGVmIHN0cnVjdCBmbG9hdDMyeDR4NF90IGZsb2F0MzJ4NHg0X3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgZmxvYXQxNng4eDRfdCBmbG9hdDE2eDh4NF90OyAvL2ZvciBDIGNvbXBpbGVycyB0byBtYWtlIHRoZW0gaGFwcHkKK3R5cGVkZWYgc3RydWN0ICBmbG9hdDMyeDJ4NF90IGZsb2F0MzJ4Mng0X3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiAgZmxvYXQxNng4eDRfdCBmbG9hdDE2eDR4NF90OworCisvLzMKK3N0cnVjdCBpbnQxNng4eDNfdCB7CisgICAgaW50MTZ4OF90IHZhbFszXTsKK307CitzdHJ1Y3QgaW50MzJ4NHgzX3QgeworICAgIGludDMyeDRfdCB2YWxbM107Cit9Oworc3RydWN0IGludDY0eDJ4M190IHsKKyAgICBpbnQ2NHgyX3QgdmFsWzNdOworfTsKK3N0cnVjdCBpbnQ4eDE2eDNfdCB7CisgICAgaW50OHgxNl90IHZhbFszXTsKK307CisKK3N0cnVjdCBpbnQxNng0eDNfdCB7CisgICAgaW50MTZ4NF90IHZhbFszXTsKK307CitzdHJ1Y3QgaW50MzJ4MngzX3QgeworICAgIGludDMyeDJfdCB2YWxbM107Cit9Oworc3RydWN0IGludDY0eDF4M190IHsKKyAgICBpbnQ2NHgxX3QgdmFsWzNdOworfTsKK3N0cnVjdCBpbnQ4eDh4M190IHsKKyAgICBpbnQ4eDhfdCB2YWxbM107Cit9OwordHlwZWRlZiBzdHJ1Y3QgaW50MTZ4OHgzX3QgaW50MTZ4OHgzX3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgaW50MzJ4NHgzX3QgaW50MzJ4NHgzX3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgaW50NjR4MngzX3QgaW50NjR4MngzX3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgaW50OHgxNngzX3QgaW50OHgxNngzX3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQorCit0eXBlZGVmIHN0cnVjdCBpbnQ4eDh4M190IGludDh4OHgzX3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgaW50MTZ4NHgzX3QgaW50MTZ4NHgzX3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgaW50MzJ4MngzX3QgaW50MzJ4MngzX3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgaW50NjR4MXgzX3QgaW50NjR4MXgzX3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQorCisKKy8qIHRvIGF2b2lkIHBvaW50ZXIgY29udmVyc2lvbnMgdGhlIGZvbGxvd2luZyB1bnNpZ25lZCBpbnRlZ2VycyBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkIHZpYSB0aGUgY29ycmVzcG9uZGluZyBzaWduZWQgaW50ZWdlcnMgZGVhbGluZyBzdHJ1Y3R1cmVzIGFib3ZlOiovCit0eXBlZGVmIHN0cnVjdCBpbnQ4eDE2eDNfdCB1aW50OHgxNngzX3Q7Cit0eXBlZGVmIHN0cnVjdCBpbnQxNng4eDNfdCB1aW50MTZ4OHgzX3Q7Cit0eXBlZGVmIHN0cnVjdCBpbnQzMng0eDNfdCB1aW50MzJ4NHgzX3Q7Cit0eXBlZGVmIHN0cnVjdCBpbnQ2NHgyeDNfdCB1aW50NjR4MngzX3Q7Cit0eXBlZGVmIHN0cnVjdCBpbnQ4eDE2eDNfdCBwb2x5OHgxNngzX3Q7Cit0eXBlZGVmIHN0cnVjdCBpbnQxNng4eDNfdCBwb2x5MTZ4OHgzX3Q7Cit0eXBlZGVmIHN0cnVjdCAgaW50OHg4eDNfdCB1aW50OHg4eDNfdDsKK3R5cGVkZWYgc3RydWN0ICBpbnQxNng0eDNfdCB1aW50MTZ4NHgzX3Q7Cit0eXBlZGVmIHN0cnVjdCAgaW50MzJ4MngzX3QgdWludDMyeDJ4M190OwordHlwZWRlZiBzdHJ1Y3QgIGludDY0eDF4M190IHVpbnQ2NHgxeDNfdDsKK3R5cGVkZWYgc3RydWN0ICBpbnQ4eDh4M190IHBvbHk4eDh4M190OwordHlwZWRlZiBzdHJ1Y3QgIGludDE2eDR4M190IHBvbHkxNng0eDNfdDsKKworLy9mbG9hdAorc3RydWN0IGZsb2F0MzJ4NHgzX3QgeworICAgIGZsb2F0MzJ4NF90IHZhbFszXTsKK307CitzdHJ1Y3QgZmxvYXQzMngyeDNfdCB7CisgICAgZmxvYXQzMngyX3QgdmFsWzNdOworfTsKK3N0cnVjdCBmbG9hdDE2eDh4M190IHsKKyAgICBmbG9hdDE2eDhfdCB2YWxbM107Cit9OworCit0eXBlZGVmIHN0cnVjdCBmbG9hdDMyeDR4M190IGZsb2F0MzJ4NHgzX3Q7IC8vZm9yIEMgY29tcGlsZXJzIHRvIG1ha2UgdGhlbSBoYXBweQordHlwZWRlZiBzdHJ1Y3QgZmxvYXQxNng4eDNfdCBmbG9hdDE2eDh4M190OyAvL2ZvciBDIGNvbXBpbGVycyB0byBtYWtlIHRoZW0gaGFwcHkKK3R5cGVkZWYgc3RydWN0IGZsb2F0MzJ4MngzX3QgZmxvYXQzMngyeDNfdDsgLy9mb3IgQyBjb21waWxlcnMgdG8gbWFrZSB0aGVtIGhhcHB5Cit0eXBlZGVmICBmbG9hdDE2eDh4M190IGZsb2F0MTZ4NHgzX3Q7CisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKiBQb3J0aW5nIGF1eGlsaWFyeSBtYWNyb3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLy8qKiBmbG9hdGluZyBwb2ludCByZWxhdGVkIG1hY3JvcyAqKgorI2RlZmluZSBfTTEyOGkoYSkgX21tX2Nhc3Rwc19zaTEyOChhKQorI2RlZmluZSBfTTEyOChhKSBfbW1fY2FzdHNpMTI4X3BzKGEpCisvL2hlcmUgdGhlIG1vc3QgcGVyZm9ybWFuY2UgZWZmZWN0aXZlIGltcGxlbWVudGF0aW9uIGlzIGNvbXBpbGVyIGFuZCAzMi82NCBiaXRzIGJ1aWxkIGRlcGVuZGVudAorI2lmIGRlZmluZWQgKF9ORU9OMlNTRV82NEJJVCkgfHwgKGRlZmluZWQgKF9fSU5URUxfQ09NUElMRVIpICYmIChfX0lOVEVMX0NPTVBJTEVSICA+PSAxNTAwKSApCisKKyAgICAgICAgI2RlZmluZSBfcE0xMjhpKGEpIF9tbV9jdnRzaTY0X3NpMTI4KCooaW50NjRfdCopKCYoYSkpKQorICAgICAgICAjZGVmaW5lIF9NNjQob3V0LCBpbnApIG91dC5tNjRfaTY0WzBdID0gX21tX2N2dHNpMTI4X3NpNjQgKGlucCk7CisgICAgICAgICNkZWZpbmUgX002NGYob3V0LCBpbnApIG91dC5tNjRfaTY0WzBdID0gX21tX2N2dHNpMTI4X3NpNjQgKF9NMTI4aShpbnApKTsKKyNlbHNlCisgICAvL2ZvciAzMmJpdCBnY2MgYW5kIE1pY3Jvc29mdCBjb21waWxlcnMgYnVpbGRzCisgICAgI2RlZmluZSBfcE0xMjhpKGEpIF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJihhKSkKKyAgICAjZGVmaW5lIF9NNjQob3V0LCBpbnApICBfbW1fc3RvcmVsX2VwaTY0ICgoX19tMTI4aSopJihvdXQpLCBpbnApCisgICAgI2RlZmluZSBfTTY0ZihvdXQsIGlucCkgIF9tbV9zdG9yZWxfZXBpNjQgKChfX20xMjhpKikmKG91dCksIF9NMTI4aShpbnApKQorI2VuZGlmCisjZGVmaW5lIF9wTTEyOChhKSBfbW1fY2FzdHNpMTI4X3BzKF9wTTEyOGkoYSkpCisKKyNkZWZpbmUgcmV0dXJuNjQoYSkgIF9NNjQocmVzNjQsYSk7IHJldHVybiByZXM2NDsKKyNkZWZpbmUgcmV0dXJuNjRmKGEpICBfTTY0ZihyZXM2NCxhKTsgcmV0dXJuIHJlczY0OworCisjZGVmaW5lIF9VaTY0KGEpICgqKHVpbnQ2NF90KikmKGEpKQorI2RlZmluZSBfVU5TSUdORURfVChhKSB1ICMjIGEKKworI2RlZmluZSBfU0lHTkJJVDY0ICgodWludDY0X3QpMSA8PCA2MykKKyNkZWZpbmUgX1NXQVBfSElfTE9XMzIgICgyIHwgKDMgPDwgMikgfCAoMCA8PCA0KSB8ICgxIDw8IDYpKQorI2RlZmluZSBfSU5TRVJUUFNfTkRYKHNyY0ZpZWxkLCBkc3RGaWVsZCkgKCgoc3JjRmllbGQpIDw8IDYpIHwgKChkc3RGaWVsZCkgPDwgNCkgKQorCisjZGVmaW5lICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMICJUaGUgZnVuY3Rpb24gbWF5IGJlIHZlcnkgc2xvdyBkdWUgdG8gdGhlIHNlcmlhbCBpbXBsZW1lbnRhdGlvbiwgcGxlYXNlIHRyeSB0byBhdm9pZCBpdCIKKyNkZWZpbmUgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19VTkVGRkVDVElWRSAiVGhlIGZ1bmN0aW9uIG1heSBiZSBzbG93IGR1ZSB0byBpbmVmZmljaWVudCB4ODYgU0lNRCBpbXBsZW1lbnRhdGlvbiwgcGxlYXNlIHRyeSB0byBhdm9pZCBpdCIKKworLy9+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyNkZWZpbmUgX19jb25zdHJhbmdlKG1pbixtYXgpICBjb25zdAorI2RlZmluZSBfX3RyYW5zZmVyc2l6ZShzaXplKQorLy9+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKiogIEZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgYXMgZGVjbGFyZWQgaW4gb3JpZ2luYWwgYXJtX25lb24uaCAqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL1ZlY3RvciBhZGQ6IHZhZGQgLT4gVnJbaV06PVZhW2ldK1ZiW2ldLCBWciwgVmEsIFZiIGhhdmUgZXF1YWwgbGFuZSBzaXplcy4KK2ludDh4OF90IHZhZGRfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZBREQuSTggZDAsZDAsZDAKK2ludDE2eDRfdCB2YWRkX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWQURELkkxNiBkMCxkMCxkMAoraW50MzJ4Ml90IHZhZGRfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZBREQuSTMyIGQwLGQwLGQwCitpbnQ2NHgxX3QgdmFkZF9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVkFERC5JNjQgZDAsZDAsZDAKK2Zsb2F0MzJ4Ml90IHZhZGRfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWQURELkYzMiBkMCxkMCxkMAordWludDh4OF90IHZhZGRfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVkFERC5JOCBkMCxkMCxkMAordWludDE2eDRfdCB2YWRkX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZBREQuSTE2IGQwLGQwLGQwCit1aW50MzJ4Ml90IHZhZGRfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVkFERC5JMzIgZDAsZDAsZDAKK3VpbnQ2NHgxX3QgdmFkZF91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIpOyAvLyBWQURELkk2NCBkMCxkMCxkMAoraW50OHgxNl90IHZhZGRxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZBREQuSTggcTAscTAscTAKK2ludDE2eDhfdCB2YWRkcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkFERC5JMTYgcTAscTAscTAKK2ludDMyeDRfdCB2YWRkcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVkFERC5JMzIgcTAscTAscTAKK2ludDY0eDJfdCB2YWRkcV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVkFERC5JNjQgcTAscTAscTAKK2Zsb2F0MzJ4NF90IHZhZGRxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVkFERC5GMzIgcTAscTAscTAKK3VpbnQ4eDE2X3QgdmFkZHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWQURELkk4IHEwLHEwLHEwCit1aW50MTZ4OF90IHZhZGRxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZBREQuSTE2IHEwLHEwLHEwCit1aW50MzJ4NF90IHZhZGRxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZBREQuSTMyIHEwLHEwLHEwCit1aW50NjR4Ml90IHZhZGRxX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYik7IC8vIFZBREQuSTY0IHEwLHEwLHEwCisvL1ZlY3RvciBsb25nIGFkZDogdmFkZGwgLT4gVnJbaV06PVZhW2ldK1ZiW2ldLCBWYSwgVmIgaGF2ZSBlcXVhbCBsYW5lIHNpemVzLCByZXN1bHQgaXMgYSAxMjggYml0IHZlY3RvciBvZiBsYW5lcyB0aGF0IGFyZSB0d2ljZSB0aGUgd2lkdGguCitpbnQxNng4X3QgdmFkZGxfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZBRERMLlM4IHEwLGQwLGQwCitpbnQzMng0X3QgdmFkZGxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZBRERMLlMxNiBxMCxkMCxkMAoraW50NjR4Ml90IHZhZGRsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWQURETC5TMzIgcTAsZDAsZDAKK3VpbnQxNng4X3QgdmFkZGxfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVkFEREwuVTggcTAsZDAsZDAKK3VpbnQzMng0X3QgdmFkZGxfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVkFEREwuVTE2IHEwLGQwLGQwCit1aW50NjR4Ml90IHZhZGRsX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZBRERMLlUzMiBxMCxkMCxkMAorLy9WZWN0b3Igd2lkZSBhZGR3OiB2YWRkIC0+IFZyW2ldOj1WYVtpXStWYltpXQoraW50MTZ4OF90IHZhZGR3X3M4KGludDE2eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVkFERFcuUzggcTAscTAsZDAKK2ludDMyeDRfdCB2YWRkd19zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkFERFcuUzE2IHEwLHEwLGQwCitpbnQ2NHgyX3QgdmFkZHdfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZBRERXLlMzMiBxMCxxMCxkMAordWludDE2eDhfdCB2YWRkd191OCh1aW50MTZ4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVkFERFcuVTggcTAscTAsZDAKK3VpbnQzMng0X3QgdmFkZHdfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVkFERFcuVTE2IHEwLHEwLGQwCit1aW50NjR4Ml90IHZhZGR3X3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZBRERXLlUzMiBxMCxxMCxkMAorLy9WZWN0b3IgaGFsdmluZyBhZGQ6IHZoYWRkIC0+IFZyW2ldOj0oVmFbaV0rVmJbaV0pPj4xCitpbnQ4eDhfdCB2aGFkZF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVkhBREQuUzggZDAsZDAsZDAKK2ludDE2eDRfdCB2aGFkZF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkhBREQuUzE2IGQwLGQwLGQwCitpbnQzMngyX3QgdmhhZGRfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZIQURELlMzMiBkMCxkMCxkMAordWludDh4OF90IHZoYWRkX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZIQURELlU4IGQwLGQwLGQwCit1aW50MTZ4NF90IHZoYWRkX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZIQURELlUxNiBkMCxkMCxkMAordWludDMyeDJfdCB2aGFkZF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWSEFERC5VMzIgZDAsZDAsZDAKK2ludDh4MTZfdCB2aGFkZHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVkhBREQuUzggcTAscTAscTAKK2ludDE2eDhfdCB2aGFkZHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZIQURELlMxNiBxMCxxMCxxMAoraW50MzJ4NF90IHZoYWRkcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVkhBREQuUzMyIHEwLHEwLHEwCit1aW50OHgxNl90IHZoYWRkcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZIQURELlU4IHEwLHEwLHEwCit1aW50MTZ4OF90IHZoYWRkcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWSEFERC5VMTYgcTAscTAscTAKK3VpbnQzMng0X3QgdmhhZGRxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZIQURELlUzMiBxMCxxMCxxMAorLy9WZWN0b3Igcm91bmRpbmcgaGFsdmluZyBhZGQ6IHZyaGFkZCAtPiBWcltpXTo9KFZhW2ldK1ZiW2ldKzEpPj4xCitpbnQ4eDhfdCB2cmhhZGRfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZSSEFERC5TOCBkMCxkMCxkMAoraW50MTZ4NF90IHZyaGFkZF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlJIQURELlMxNiBkMCxkMCxkMAoraW50MzJ4Ml90IHZyaGFkZF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlJIQURELlMzMiBkMCxkMCxkMAordWludDh4OF90IHZyaGFkZF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWUkhBREQuVTggZDAsZDAsZDAKK3VpbnQxNng0X3QgdnJoYWRkX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZSSEFERC5VMTYgZDAsZDAsZDAKK3VpbnQzMngyX3QgdnJoYWRkX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZSSEFERC5VMzIgZDAsZDAsZDAKK2ludDh4MTZfdCB2cmhhZGRxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZSSEFERC5TOCBxMCxxMCxxMAoraW50MTZ4OF90IHZyaGFkZHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZSSEFERC5TMTYgcTAscTAscTAKK2ludDMyeDRfdCB2cmhhZGRxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWUkhBREQuUzMyIHEwLHEwLHEwCit1aW50OHgxNl90IHZyaGFkZHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWUkhBREQuVTggcTAscTAscTAKK3VpbnQxNng4X3QgdnJoYWRkcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWUkhBREQuVTE2IHEwLHEwLHEwCit1aW50MzJ4NF90IHZyaGFkZHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVlJIQURELlUzMiBxMCxxMCxxMAorLy9WZWN0b3Igc2F0dXJhdGluZyBhZGQ6IHZxYWRkIC0+IFZyW2ldOj1zYXQ8c2l6ZT4oVmFbaV0rVmJbaV0pCitpbnQ4eDhfdCB2cWFkZF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlFBREQuUzggZDAsZDAsZDAKK2ludDE2eDRfdCB2cWFkZF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlFBREQuUzE2IGQwLGQwLGQwCitpbnQzMngyX3QgdnFhZGRfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZRQURELlMzMiBkMCxkMCxkMAoraW50NjR4MV90IHZxYWRkX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWUUFERC5TNjQgZDAsZDAsZDAKK3VpbnQ4eDhfdCB2cWFkZF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWUUFERC5VOCBkMCxkMCxkMAordWludDE2eDRfdCB2cWFkZF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWUUFERC5VMTYgZDAsZDAsZDAKK3VpbnQzMngyX3QgdnFhZGRfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVlFBREQuVTMyIGQwLGQwLGQwCit1aW50NjR4MV90IHZxYWRkX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYik7IC8vIFZRQURELlU2NCBkMCxkMCxkMAoraW50OHgxNl90IHZxYWRkcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWUUFERC5TOCBxMCxxMCxxMAoraW50MTZ4OF90IHZxYWRkcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlFBREQuUzE2IHEwLHEwLHEwCitpbnQzMng0X3QgdnFhZGRxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWUUFERC5TMzIgcTAscTAscTAKK2ludDY0eDJfdCB2cWFkZHFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZRQURELlM2NCBxMCxxMCxxMAordWludDh4MTZfdCB2cWFkZHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWUUFERC5VOCBxMCxxMCxxMAordWludDE2eDhfdCB2cWFkZHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVlFBREQuVTE2IHEwLHEwLHEwCit1aW50MzJ4NF90IHZxYWRkcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWUUFERC5VMzIgcTAscTAscTAKK3VpbnQ2NHgyX3QgdnFhZGRxX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYik7IC8vIFZRQURELlU2NCBxMCxxMCxxMAorLy9WZWN0b3IgYWRkIGhpZ2ggaGFsZjogdmFkZGhuLT4gVnJbaV06PVZhW2ldK1ZiW2ldCitpbnQ4eDhfdCB2YWRkaG5fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZBRERITi5JMTYgZDAscTAscTAKK2ludDE2eDRfdCB2YWRkaG5fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZBRERITi5JMzIgZDAscTAscTAKK2ludDMyeDJfdCB2YWRkaG5fczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZBRERITi5JNjQgZDAscTAscTAKK3VpbnQ4eDhfdCB2YWRkaG5fdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkFEREhOLkkxNiBkMCxxMCxxMAordWludDE2eDRfdCB2YWRkaG5fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVkFEREhOLkkzMiBkMCxxMCxxMAordWludDMyeDJfdCB2YWRkaG5fdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKTsgLy8gVkFEREhOLkk2NCBkMCxxMCxxMAorLy9WZWN0b3Igcm91bmRpbmcgYWRkIGhpZ2ggaGFsZjogdnJhZGRobgoraW50OHg4X3QgdnJhZGRobl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlJBRERITi5JMTYgZDAscTAscTAKK2ludDE2eDRfdCB2cmFkZGhuX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWUkFEREhOLkkzMiBkMCxxMCxxMAoraW50MzJ4Ml90IHZyYWRkaG5fczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZSQURESE4uSTY0IGQwLHEwLHEwCit1aW50OHg4X3QgdnJhZGRobl91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWUkFEREhOLkkxNiBkMCxxMCxxMAordWludDE2eDRfdCB2cmFkZGhuX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZSQURESE4uSTMyIGQwLHEwLHEwCit1aW50MzJ4Ml90IHZyYWRkaG5fdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKTsgLy8gVlJBRERITi5JNjQgZDAscTAscTAKKy8vTXVsdGlwbGljYXRpb24KKy8vVmVjdG9yIG11bHRpcGx5OiB2bXVsIC0+IFZyW2ldIDo9IFZhW2ldICogVmJbaV0KK2ludDh4OF90IHZtdWxfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZNVUwuSTggZDAsZDAsZDAKK2ludDE2eDRfdCB2bXVsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWTVVMLkkxNiBkMCxkMCxkMAoraW50MzJ4Ml90IHZtdWxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZNVUwuSTMyIGQwLGQwLGQwCitmbG9hdDMyeDJfdCB2bXVsX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVk1VTC5GMzIgZDAsZDAsZDAKK3VpbnQ4eDhfdCB2bXVsX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZNVUwuSTggZDAsZDAsZDAKK3VpbnQxNng0X3Qgdm11bF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWTVVMLkkxNiBkMCxkMCxkMAordWludDMyeDJfdCB2bXVsX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZNVUwuSTMyIGQwLGQwLGQwCitwb2x5OHg4X3Qgdm11bF9wOChwb2x5OHg4X3QgYSwgcG9seTh4OF90IGIpOyAvLyBWTVVMLlA4IGQwLGQwLGQwCitpbnQ4eDE2X3Qgdm11bHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVk1VTC5JOCBxMCxxMCxxMAoraW50MTZ4OF90IHZtdWxxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWTVVMLkkxNiBxMCxxMCxxMAoraW50MzJ4NF90IHZtdWxxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWTVVMLkkzMiBxMCxxMCxxMAorZmxvYXQzMng0X3Qgdm11bHFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWTVVMLkYzMiBxMCxxMCxxMAordWludDh4MTZfdCB2bXVscV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZNVUwuSTggcTAscTAscTAKK3VpbnQxNng4X3Qgdm11bHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVk1VTC5JMTYgcTAscTAscTAKK3VpbnQzMng0X3Qgdm11bHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVk1VTC5JMzIgcTAscTAscTAKK3BvbHk4eDE2X3Qgdm11bHFfcDgocG9seTh4MTZfdCBhLCBwb2x5OHgxNl90IGIpOyAvLyBWTVVMLlA4IHEwLHEwLHEwCisvL211bHRpcGx5IGxhbmUKK2ludDE2eDRfdCB2bXVsX2xhbmVfczE2IChpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDMpIGludCBjKTsKK2ludDMyeDJfdCB2bXVsX2xhbmVfczMyIChpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDEpIGludCBjKTsKK2Zsb2F0MzJ4Ml90IHZtdWxfbGFuZV9mMzIgKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDEpIGludCBjKTsKK3VpbnQxNng0X3Qgdm11bF9sYW5lX3UxNiAodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDMpIGludCBjKTsKK3VpbnQzMngyX3Qgdm11bF9sYW5lX3UzMiAodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDEpIGludCBjKTsKK2ludDE2eDhfdCB2bXVscV9sYW5lX3MxNiAoaW50MTZ4OF90IGEsIGludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgYyk7CitpbnQzMng0X3Qgdm11bHFfbGFuZV9zMzIgKGludDMyeDRfdCBhLCBpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpOworZmxvYXQzMng0X3Qgdm11bHFfbGFuZV9mMzIgKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDEpIGludCBjKTsKK3VpbnQxNng4X3Qgdm11bHFfbGFuZV91MTYgKHVpbnQxNng4X3QgYSwgdWludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgYyk7Cit1aW50MzJ4NF90IHZtdWxxX2xhbmVfdTMyICh1aW50MzJ4NF90IGEsIHVpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpOworLy9WZWN0b3IgbXVsdGlwbHkgYWNjdW11bGF0ZTogdm1sYSAtPiBWcltpXSA6PSBWYVtpXSArIFZiW2ldICogVmNbaV0KK2ludDh4OF90IHZtbGFfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYiwgaW50OHg4X3QgYyk7IC8vIFZNTEEuSTggZDAsZDAsZDAKK2ludDE2eDRfdCB2bWxhX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCBjKTsgLy8gVk1MQS5JMTYgZDAsZDAsZDAKK2ludDMyeDJfdCB2bWxhX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKTsgLy8gVk1MQS5JMzIgZDAsZDAsZDAKK2Zsb2F0MzJ4Ml90IHZtbGFfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJ4Ml90IGMpOyAvLyBWTUxBLkYzMiBkMCxkMCxkMAordWludDh4OF90IHZtbGFfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiLCB1aW50OHg4X3QgYyk7IC8vIFZNTEEuSTggZDAsZDAsZDAKK3VpbnQxNng0X3Qgdm1sYV91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgYyk7IC8vIFZNTEEuSTE2IGQwLGQwLGQwCit1aW50MzJ4Ml90IHZtbGFfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IGMpOyAvLyBWTUxBLkkzMiBkMCxkMCxkMAoraW50OHgxNl90IHZtbGFxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYiwgaW50OHgxNl90IGMpOyAvLyBWTUxBLkk4IHEwLHEwLHEwCitpbnQxNng4X3Qgdm1sYXFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4OF90IGMpOyAvLyBWTUxBLkkxNiBxMCxxMCxxMAoraW50MzJ4NF90IHZtbGFxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDRfdCBjKTsgLy8gVk1MQS5JMzIgcTAscTAscTAKK2Zsb2F0MzJ4NF90IHZtbGFxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBmbG9hdDMyeDRfdCBjKTsgLy8gVk1MQS5GMzIgcTAscTAscTAKK3VpbnQ4eDE2X3Qgdm1sYXFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIsIHVpbnQ4eDE2X3QgYyk7IC8vIFZNTEEuSTggcTAscTAscTAKK3VpbnQxNng4X3Qgdm1sYXFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiLCB1aW50MTZ4OF90IGMpOyAvLyBWTUxBLkkxNiBxMCxxMCxxMAordWludDMyeDRfdCB2bWxhcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMng0X3QgYyk7IC8vIFZNTEEuSTMyIHEwLHEwLHEwCisvL1ZlY3RvciBtdWx0aXBseSBhY2N1bXVsYXRlIGxvbmc6IHZtbGFsIC0+IFZyW2ldIDo9IFZhW2ldICsgVmJbaV0gKiBWY1tpXQoraW50MTZ4OF90IHZtbGFsX3M4KGludDE2eDhfdCBhLCBpbnQ4eDhfdCBiLCBpbnQ4eDhfdCBjKTsgLy8gVk1MQUwuUzggcTAsZDAsZDAKK2ludDMyeDRfdCB2bWxhbF9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgYyk7IC8vIFZNTEFMLlMxNiBxMCxkMCxkMAoraW50NjR4Ml90IHZtbGFsX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKTsgLy8gVk1MQUwuUzMyIHEwLGQwLGQwCit1aW50MTZ4OF90IHZtbGFsX3U4KHVpbnQxNng4X3QgYSwgdWludDh4OF90IGIsIHVpbnQ4eDhfdCBjKTsgLy8gVk1MQUwuVTggcTAsZDAsZDAKK3VpbnQzMng0X3Qgdm1sYWxfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IGMpOyAvLyBWTUxBTC5VMTYgcTAsZDAsZDAKK3VpbnQ2NHgyX3Qgdm1sYWxfdTMyKHVpbnQ2NHgyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IGMpOyAvLyBWTUxBTC5VMzIgcTAsZDAsZDAKKy8vVmVjdG9yIG11bHRpcGx5IHN1YnRyYWN0OiB2bWxzIC0+IFZyW2ldIDo9IFZhW2ldIC0gVmJbaV0gKiBWY1tpXQoraW50OHg4X3Qgdm1sc19zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiLCBpbnQ4eDhfdCBjKTsgLy8gVk1MUy5JOCBkMCxkMCxkMAoraW50MTZ4NF90IHZtbHNfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpOyAvLyBWTUxTLkkxNiBkMCxkMCxkMAoraW50MzJ4Ml90IHZtbHNfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IGMpOyAvLyBWTUxTLkkzMiBkMCxkMCxkMAorZmxvYXQzMngyX3Qgdm1sc19mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgZmxvYXQzMngyX3QgYyk7IC8vIFZNTFMuRjMyIGQwLGQwLGQwCit1aW50OHg4X3Qgdm1sc191OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIsIHVpbnQ4eDhfdCBjKTsgLy8gVk1MUy5JOCBkMCxkMCxkMAordWludDE2eDRfdCB2bWxzX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2eDRfdCBjKTsgLy8gVk1MUy5JMTYgZDAsZDAsZDAKK3VpbnQzMngyX3Qgdm1sc191MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMngyX3QgYyk7IC8vIFZNTFMuSTMyIGQwLGQwLGQwCitpbnQ4eDE2X3Qgdm1sc3FfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiLCBpbnQ4eDE2X3QgYyk7IC8vIFZNTFMuSTggcTAscTAscTAKK2ludDE2eDhfdCB2bWxzcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng4X3QgYyk7IC8vIFZNTFMuSTE2IHEwLHEwLHEwCitpbnQzMng0X3Qgdm1sc3FfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4NF90IGMpOyAvLyBWTUxTLkkzMiBxMCxxMCxxMAorZmxvYXQzMng0X3Qgdm1sc3FfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJ4NF90IGMpOyAvLyBWTUxTLkYzMiBxMCxxMCxxMAordWludDh4MTZfdCB2bWxzcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYiwgdWludDh4MTZfdCBjKTsgLy8gVk1MUy5JOCBxMCxxMCxxMAordWludDE2eDhfdCB2bWxzcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIHVpbnQxNng4X3QgYyk7IC8vIFZNTFMuSTE2IHEwLHEwLHEwCit1aW50MzJ4NF90IHZtbHNxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyeDRfdCBjKTsgLy8gVk1MUy5JMzIgcTAscTAscTAKKy8vVmVjdG9yIG11bHRpcGx5IHN1YnRyYWN0IGxvbmcKK2ludDE2eDhfdCB2bWxzbF9zOChpbnQxNng4X3QgYSwgaW50OHg4X3QgYiwgaW50OHg4X3QgYyk7IC8vIFZNTFNMLlM4IHEwLGQwLGQwCitpbnQzMng0X3Qgdm1sc2xfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpOyAvLyBWTUxTTC5TMTYgcTAsZDAsZDAKK2ludDY0eDJfdCB2bWxzbF9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgYyk7IC8vIFZNTFNMLlMzMiBxMCxkMCxkMAordWludDE2eDhfdCB2bWxzbF91OCh1aW50MTZ4OF90IGEsIHVpbnQ4eDhfdCBiLCB1aW50OHg4X3QgYyk7IC8vIFZNTFNMLlU4IHEwLGQwLGQwCit1aW50MzJ4NF90IHZtbHNsX3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2eDRfdCBjKTsgLy8gVk1MU0wuVTE2IHEwLGQwLGQwCit1aW50NjR4Ml90IHZtbHNsX3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCBjKTsgLy8gVk1MU0wuVTMyIHEwLGQwLGQwCisvL1ZlY3RvciBzYXR1cmF0aW5nIGRvdWJsaW5nIG11bHRpcGx5IGhpZ2gKK2ludDE2eDRfdCB2cWRtdWxoX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWUURNVUxILlMxNiBkMCxkMCxkMAoraW50MzJ4Ml90IHZxZG11bGhfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZRRE1VTEguUzMyIGQwLGQwLGQwCitpbnQxNng4X3QgdnFkbXVsaHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZRRE1VTEguUzE2IHEwLHEwLHEwCitpbnQzMng0X3QgdnFkbXVsaHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZRRE1VTEguUzMyIHEwLHEwLHEwCisvL1ZlY3RvciBzYXR1cmF0aW5nIHJvdW5kaW5nIGRvdWJsaW5nIG11bHRpcGx5IGhpZ2gKK2ludDE2eDRfdCB2cXJkbXVsaF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlFSRE1VTEguUzE2IGQwLGQwLGQwCitpbnQzMngyX3QgdnFyZG11bGhfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZRUkRNVUxILlMzMiBkMCxkMCxkMAoraW50MTZ4OF90IHZxcmRtdWxocV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlFSRE1VTEguUzE2IHEwLHEwLHEwCitpbnQzMng0X3QgdnFyZG11bGhxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWUVJETVVMSC5TMzIgcTAscTAscTAKKy8vVmVjdG9yIHNhdHVyYXRpbmcgZG91YmxpbmcgbXVsdGlwbHkgYWNjdW11bGF0ZSBsb25nCitpbnQzMng0X3QgdnFkbWxhbF9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgYyk7IC8vIFZRRE1MQUwuUzE2IHEwLGQwLGQwCitpbnQ2NHgyX3QgdnFkbWxhbF9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgYyk7IC8vIFZRRE1MQUwuUzMyIHEwLGQwLGQwCisvL1ZlY3RvciBzYXR1cmF0aW5nIGRvdWJsaW5nIG11bHRpcGx5IHN1YnRyYWN0IGxvbmcKK2ludDMyeDRfdCB2cWRtbHNsX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCBjKTsgLy8gVlFETUxTTC5TMTYgcTAsZDAsZDAKK2ludDY0eDJfdCB2cWRtbHNsX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKTsgLy8gVlFETUxTTC5TMzIgcTAsZDAsZDAKKy8vVmVjdG9yIGxvbmcgbXVsdGlwbHkKK2ludDE2eDhfdCB2bXVsbF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVk1VTEwuUzggcTAsZDAsZDAKK2ludDMyeDRfdCB2bXVsbF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVk1VTEwuUzE2IHEwLGQwLGQwCitpbnQ2NHgyX3Qgdm11bGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZNVUxMLlMzMiBxMCxkMCxkMAordWludDE2eDhfdCB2bXVsbF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWTVVMTC5VOCBxMCxkMCxkMAordWludDMyeDRfdCB2bXVsbF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWTVVMTC5VMTYgcTAsZDAsZDAKK3VpbnQ2NHgyX3Qgdm11bGxfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVk1VTEwuVTMyIHEwLGQwLGQwCitwb2x5MTZ4OF90IHZtdWxsX3A4KHBvbHk4eDhfdCBhLCBwb2x5OHg4X3QgYik7IC8vIFZNVUxMLlA4IHEwLGQwLGQwCisvL1ZlY3RvciBzYXR1cmF0aW5nIGRvdWJsaW5nIGxvbmcgbXVsdGlwbHkKK2ludDMyeDRfdCB2cWRtdWxsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWUURNVUxMLlMxNiBxMCxkMCxkMAoraW50NjR4Ml90IHZxZG11bGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZRRE1VTEwuUzMyIHEwLGQwLGQwCisvL1N1YnRyYWN0aW9uCisvL1ZlY3RvciBzdWJ0cmFjdAoraW50OHg4X3QgdnN1Yl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlNVQi5JOCBkMCxkMCxkMAoraW50MTZ4NF90IHZzdWJfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZTVUIuSTE2IGQwLGQwLGQwCitpbnQzMngyX3QgdnN1Yl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlNVQi5JMzIgZDAsZDAsZDAKK2ludDY0eDFfdCB2c3ViX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWU1VCLkk2NCBkMCxkMCxkMAorZmxvYXQzMngyX3QgdnN1Yl9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZTVUIuRjMyIGQwLGQwLGQwCit1aW50OHg4X3QgdnN1Yl91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWU1VCLkk4IGQwLGQwLGQwCit1aW50MTZ4NF90IHZzdWJfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlNVQi5JMTYgZDAsZDAsZDAKK3VpbnQzMngyX3QgdnN1Yl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWU1VCLkkzMiBkMCxkMCxkMAordWludDY0eDFfdCB2c3ViX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYik7IC8vIFZTVUIuSTY0IGQwLGQwLGQwCitpbnQ4eDE2X3QgdnN1YnFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlNVQi5JOCBxMCxxMCxxMAoraW50MTZ4OF90IHZzdWJxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWU1VCLkkxNiBxMCxxMCxxMAoraW50MzJ4NF90IHZzdWJxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWU1VCLkkzMiBxMCxxMCxxMAoraW50NjR4Ml90IHZzdWJxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWU1VCLkk2NCBxMCxxMCxxMAorZmxvYXQzMng0X3QgdnN1YnFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWU1VCLkYzMiBxMCxxMCxxMAordWludDh4MTZfdCB2c3VicV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZTVUIuSTggcTAscTAscTAKK3VpbnQxNng4X3QgdnN1YnFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVlNVQi5JMTYgcTAscTAscTAKK3VpbnQzMng0X3QgdnN1YnFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVlNVQi5JMzIgcTAscTAscTAKK3VpbnQ2NHgyX3QgdnN1YnFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKTsgLy8gVlNVQi5JNjQgcTAscTAscTAKKy8vVmVjdG9yIGxvbmcgc3VidHJhY3Q6IHZzdWIgLT4gVnJbaV06PVZhW2ldK1ZiW2ldCitpbnQxNng4X3QgdnN1YmxfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZTVUJMLlM4IHEwLGQwLGQwCitpbnQzMng0X3QgdnN1YmxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZTVUJMLlMxNiBxMCxkMCxkMAoraW50NjR4Ml90IHZzdWJsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWU1VCTC5TMzIgcTAsZDAsZDAKK3VpbnQxNng4X3QgdnN1YmxfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlNVQkwuVTggcTAsZDAsZDAKK3VpbnQzMng0X3QgdnN1YmxfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlNVQkwuVTE2IHEwLGQwLGQwCit1aW50NjR4Ml90IHZzdWJsX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZTVUJMLlUzMiBxMCxkMCxkMAorLy9WZWN0b3Igd2lkZSBzdWJ0cmFjdDogdnN1YiAtPiBWcltpXTo9VmFbaV0rVmJbaV0KK2ludDE2eDhfdCB2c3Vid19zOChpbnQxNng4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZTVUJXLlM4IHEwLHEwLGQwCitpbnQzMng0X3QgdnN1YndfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZTVUJXLlMxNiBxMCxxMCxkMAoraW50NjR4Ml90IHZzdWJ3X3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWU1VCVy5TMzIgcTAscTAsZDAKK3VpbnQxNng4X3QgdnN1YndfdTgodWludDE2eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZTVUJXLlU4IHEwLHEwLGQwCit1aW50MzJ4NF90IHZzdWJ3X3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZTVUJXLlUxNiBxMCxxMCxkMAordWludDY0eDJfdCB2c3Vid191MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWU1VCVy5VMzIgcTAscTAsZDAKKy8vVmVjdG9yIHNhdHVyYXRpbmcgc3VidHJhY3QKK2ludDh4OF90IHZxc3ViX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWUVNVQi5TOCBkMCxkMCxkMAoraW50MTZ4NF90IHZxc3ViX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWUVNVQi5TMTYgZDAsZDAsZDAKK2ludDMyeDJfdCB2cXN1Yl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlFTVUIuUzMyIGQwLGQwLGQwCitpbnQ2NHgxX3QgdnFzdWJfczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYik7IC8vIFZRU1VCLlM2NCBkMCxkMCxkMAordWludDh4OF90IHZxc3ViX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZRU1VCLlU4IGQwLGQwLGQwCit1aW50MTZ4NF90IHZxc3ViX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZRU1VCLlUxNiBkMCxkMCxkMAordWludDMyeDJfdCB2cXN1Yl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWUVNVQi5VMzIgZDAsZDAsZDAKK3VpbnQ2NHgxX3QgdnFzdWJfdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiKTsgLy8gVlFTVUIuVTY0IGQwLGQwLGQwCitpbnQ4eDE2X3QgdnFzdWJxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZRU1VCLlM4IHEwLHEwLHEwCitpbnQxNng4X3QgdnFzdWJxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWUVNVQi5TMTYgcTAscTAscTAKK2ludDMyeDRfdCB2cXN1YnFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZRU1VCLlMzMiBxMCxxMCxxMAoraW50NjR4Ml90IHZxc3VicV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVlFTVUIuUzY0IHEwLHEwLHEwCit1aW50OHgxNl90IHZxc3VicV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZRU1VCLlU4IHEwLHEwLHEwCit1aW50MTZ4OF90IHZxc3VicV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWUVNVQi5VMTYgcTAscTAscTAKK3VpbnQzMng0X3QgdnFzdWJxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZRU1VCLlUzMiBxMCxxMCxxMAordWludDY0eDJfdCB2cXN1YnFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKTsgLy8gVlFTVUIuVTY0IHEwLHEwLHEwCisvL1ZlY3RvciBoYWx2aW5nIHN1YnRyYWN0CitpbnQ4eDhfdCB2aHN1Yl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVkhTVUIuUzggZDAsZDAsZDAKK2ludDE2eDRfdCB2aHN1Yl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkhTVUIuUzE2IGQwLGQwLGQwCitpbnQzMngyX3QgdmhzdWJfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZIU1VCLlMzMiBkMCxkMCxkMAordWludDh4OF90IHZoc3ViX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZIU1VCLlU4IGQwLGQwLGQwCit1aW50MTZ4NF90IHZoc3ViX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZIU1VCLlUxNiBkMCxkMCxkMAordWludDMyeDJfdCB2aHN1Yl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWSFNVQi5VMzIgZDAsZDAsZDAKK2ludDh4MTZfdCB2aHN1YnFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVkhTVUIuUzggcTAscTAscTAKK2ludDE2eDhfdCB2aHN1YnFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZIU1VCLlMxNiBxMCxxMCxxMAoraW50MzJ4NF90IHZoc3VicV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVkhTVUIuUzMyIHEwLHEwLHEwCit1aW50OHgxNl90IHZoc3VicV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZIU1VCLlU4IHEwLHEwLHEwCit1aW50MTZ4OF90IHZoc3VicV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWSFNVQi5VMTYgcTAscTAscTAKK3VpbnQzMng0X3QgdmhzdWJxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZIU1VCLlUzMiBxMCxxMCxxMAorLy9WZWN0b3Igc3VidHJhY3QgaGlnaCBoYWxmCitpbnQ4eDhfdCB2c3ViaG5fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZTVUJITi5JMTYgZDAscTAscTAKK2ludDE2eDRfdCB2c3ViaG5fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZTVUJITi5JMzIgZDAscTAscTAKK2ludDMyeDJfdCB2c3ViaG5fczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZTVUJITi5JNjQgZDAscTAscTAKK3VpbnQ4eDhfdCB2c3ViaG5fdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVlNVQkhOLkkxNiBkMCxxMCxxMAordWludDE2eDRfdCB2c3ViaG5fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVlNVQkhOLkkzMiBkMCxxMCxxMAordWludDMyeDJfdCB2c3ViaG5fdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKTsgLy8gVlNVQkhOLkk2NCBkMCxxMCxxMAorLy9WZWN0b3Igcm91bmRpbmcgc3VidHJhY3QgaGlnaCBoYWxmCitpbnQ4eDhfdCB2cnN1YmhuX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWUlNVQkhOLkkxNiBkMCxxMCxxMAoraW50MTZ4NF90IHZyc3ViaG5fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZSU1VCSE4uSTMyIGQwLHEwLHEwCitpbnQzMngyX3QgdnJzdWJobl9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVlJTVUJITi5JNjQgZDAscTAscTAKK3VpbnQ4eDhfdCB2cnN1YmhuX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZSU1VCSE4uSTE2IGQwLHEwLHEwCit1aW50MTZ4NF90IHZyc3ViaG5fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVlJTVUJITi5JMzIgZDAscTAscTAKK3VpbnQzMngyX3QgdnJzdWJobl91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpOyAvLyBWUlNVQkhOLkk2NCBkMCxxMCxxMAorLy9Db21wYXJpc29uCisvL1ZlY3RvciBjb21wYXJlIGVxdWFsCit1aW50OHg4X3QgdmNlcV9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVkNFUS5JOCBkMCwgZDAsIGQwCit1aW50MTZ4NF90IHZjZXFfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZDRVEuSTE2IGQwLCBkMCwgZDAKK3VpbnQzMngyX3QgdmNlcV9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVkNFUS5JMzIgZDAsIGQwLCBkMAordWludDMyeDJfdCB2Y2VxX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVkNFUS5GMzIgZDAsIGQwLCBkMAordWludDh4OF90IHZjZXFfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVkNFUS5JOCBkMCwgZDAsIGQwCit1aW50MTZ4NF90IHZjZXFfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVkNFUS5JMTYgZDAsIGQwLCBkMAordWludDMyeDJfdCB2Y2VxX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZDRVEuSTMyIGQwLCBkMCwgZDAKK3VpbnQ4eDhfdCB2Y2VxX3A4KHBvbHk4eDhfdCBhLCBwb2x5OHg4X3QgYik7IC8vIFZDRVEuSTggZDAsIGQwLCBkMAordWludDh4MTZfdCB2Y2VxcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWQ0VRLkk4IHEwLCBxMCwgcTAKK3VpbnQxNng4X3QgdmNlcXFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZDRVEuSTE2IHEwLCBxMCwgcTAKK3VpbnQzMng0X3QgdmNlcXFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZDRVEuSTMyIHEwLCBxMCwgcTAKK3VpbnQzMng0X3QgdmNlcXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWQ0VRLkYzMiBxMCwgcTAsIHEwCit1aW50OHgxNl90IHZjZXFxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVkNFUS5JOCBxMCwgcTAsIHEwCit1aW50MTZ4OF90IHZjZXFxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZDRVEuSTE2IHEwLCBxMCwgcTAKK3VpbnQzMng0X3QgdmNlcXFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVkNFUS5JMzIgcTAsIHEwLCBxMAordWludDh4MTZfdCB2Y2VxcV9wOChwb2x5OHgxNl90IGEsIHBvbHk4eDE2X3QgYik7IC8vIFZDRVEuSTggcTAsIHEwLCBxMAorLy9WZWN0b3IgY29tcGFyZSBncmVhdGVyLXRoYW4gb3IgZXF1YWwKK3VpbnQ4eDhfdCB2Y2dlX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWQ0dFLlM4IGQwLCBkMCwgZDAKK3VpbnQxNng0X3QgdmNnZV9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkNHRS5TMTYgZDAsIGQwLCBkMAordWludDMyeDJfdCB2Y2dlX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWQ0dFLlMzMiBkMCwgZDAsIGQwCit1aW50MzJ4Ml90IHZjZ2VfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWQ0dFLkYzMiBkMCwgZDAsIGQwCit1aW50OHg4X3QgdmNnZV91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWQ0dFLlU4IGQwLCBkMCwgZDAKK3VpbnQxNng0X3QgdmNnZV91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWQ0dFLlUxNiBkMCwgZDAsIGQwCit1aW50MzJ4Ml90IHZjZ2VfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVkNHRS5VMzIgZDAsIGQwLCBkMAordWludDh4MTZfdCB2Y2dlcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWQ0dFLlM4IHEwLCBxMCwgcTAKK3VpbnQxNng4X3QgdmNnZXFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZDR0UuUzE2IHEwLCBxMCwgcTAKK3VpbnQzMng0X3QgdmNnZXFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZDR0UuUzMyIHEwLCBxMCwgcTAKK3VpbnQzMng0X3QgdmNnZXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWQ0dFLkYzMiBxMCwgcTAsIHEwCit1aW50OHgxNl90IHZjZ2VxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVkNHRS5VOCBxMCwgcTAsIHEwCit1aW50MTZ4OF90IHZjZ2VxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZDR0UuVTE2IHEwLCBxMCwgcTAKK3VpbnQzMng0X3QgdmNnZXFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVkNHRS5VMzIgcTAsIHEwLCBxMAorLy9WZWN0b3IgY29tcGFyZSBsZXNzLXRoYW4gb3IgZXF1YWwKK3VpbnQ4eDhfdCB2Y2xlX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWQ0dFLlM4IGQwLCBkMCwgZDAKK3VpbnQxNng0X3QgdmNsZV9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkNHRS5TMTYgZDAsIGQwLCBkMAordWludDMyeDJfdCB2Y2xlX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWQ0dFLlMzMiBkMCwgZDAsIGQwCit1aW50MzJ4Ml90IHZjbGVfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWQ0dFLkYzMiBkMCwgZDAsIGQwCit1aW50OHg4X3QgdmNsZV91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWQ0dFLlU4IGQwLCBkMCwgZDAKK3VpbnQxNng0X3QgdmNsZV91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWQ0dFLlUxNiBkMCwgZDAsIGQwCit1aW50MzJ4Ml90IHZjbGVfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVkNHRS5VMzIgZDAsIGQwLCBkMAordWludDh4MTZfdCB2Y2xlcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWQ0dFLlM4IHEwLCBxMCwgcTAKK3VpbnQxNng4X3QgdmNsZXFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZDR0UuUzE2IHEwLCBxMCwgcTAKK3VpbnQzMng0X3QgdmNsZXFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZDR0UuUzMyIHEwLCBxMCwgcTAKK3VpbnQzMng0X3QgdmNsZXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWQ0dFLkYzMiBxMCwgcTAsIHEwCit1aW50OHgxNl90IHZjbGVxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVkNHRS5VOCBxMCwgcTAsIHEwCit1aW50MTZ4OF90IHZjbGVxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZDR0UuVTE2IHEwLCBxMCwgcTAKK3VpbnQzMng0X3QgdmNsZXFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVkNHRS5VMzIgcTAsIHEwLCBxMAorLy9WZWN0b3IgY29tcGFyZSBncmVhdGVyLXRoYW4KK3VpbnQ4eDhfdCB2Y2d0X3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWQ0dULlM4IGQwLCBkMCwgZDAKK3VpbnQxNng0X3QgdmNndF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkNHVC5TMTYgZDAsIGQwLCBkMAordWludDMyeDJfdCB2Y2d0X3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWQ0dULlMzMiBkMCwgZDAsIGQwCit1aW50MzJ4Ml90IHZjZ3RfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWQ0dULkYzMiBkMCwgZDAsIGQwCit1aW50OHg4X3QgdmNndF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWQ0dULlU4IGQwLCBkMCwgZDAKK3VpbnQxNng0X3QgdmNndF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWQ0dULlUxNiBkMCwgZDAsIGQwCit1aW50MzJ4Ml90IHZjZ3RfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVkNHVC5VMzIgZDAsIGQwLCBkMAordWludDh4MTZfdCB2Y2d0cV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWQ0dULlM4IHEwLCBxMCwgcTAKK3VpbnQxNng4X3QgdmNndHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZDR1QuUzE2IHEwLCBxMCwgcTAKK3VpbnQzMng0X3QgdmNndHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZDR1QuUzMyIHEwLCBxMCwgcTAKK3VpbnQzMng0X3QgdmNndHFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWQ0dULkYzMiBxMCwgcTAsIHEwCit1aW50OHgxNl90IHZjZ3RxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVkNHVC5VOCBxMCwgcTAsIHEwCit1aW50MTZ4OF90IHZjZ3RxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZDR1QuVTE2IHEwLCBxMCwgcTAKK3VpbnQzMng0X3QgdmNndHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVkNHVC5VMzIgcTAsIHEwLCBxMAorLy9WZWN0b3IgY29tcGFyZSBsZXNzLXRoYW4KK3VpbnQ4eDhfdCB2Y2x0X3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWQ0dULlM4IGQwLCBkMCwgZDAKK3VpbnQxNng0X3QgdmNsdF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkNHVC5TMTYgZDAsIGQwLCBkMAordWludDMyeDJfdCB2Y2x0X3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWQ0dULlMzMiBkMCwgZDAsIGQwCit1aW50MzJ4Ml90IHZjbHRfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWQ0dULkYzMiBkMCwgZDAsIGQwCit1aW50OHg4X3QgdmNsdF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWQ0dULlU4IGQwLCBkMCwgZDAKK3VpbnQxNng0X3QgdmNsdF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWQ0dULlUxNiBkMCwgZDAsIGQwCit1aW50MzJ4Ml90IHZjbHRfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVkNHVC5VMzIgZDAsIGQwLCBkMAordWludDh4MTZfdCB2Y2x0cV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWQ0dULlM4IHEwLCBxMCwgcTAKK3VpbnQxNng4X3QgdmNsdHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZDR1QuUzE2IHEwLCBxMCwgcTAKK3VpbnQzMng0X3QgdmNsdHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZDR1QuUzMyIHEwLCBxMCwgcTAKK3VpbnQzMng0X3QgdmNsdHFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWQ0dULkYzMiBxMCwgcTAsIHEwCit1aW50OHgxNl90IHZjbHRxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVkNHVC5VOCBxMCwgcTAsIHEwCit1aW50MTZ4OF90IHZjbHRxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZDR1QuVTE2IHEwLCBxMCwgcTAKK3VpbnQzMng0X3QgdmNsdHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVkNHVC5VMzIgcTAsIHEwLCBxMAorLy9WZWN0b3IgY29tcGFyZSBhYnNvbHV0ZSBncmVhdGVyLXRoYW4gb3IgZXF1YWwKK3VpbnQzMngyX3QgdmNhZ2VfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWQUNHRS5GMzIgZDAsIGQwLCBkMAordWludDMyeDRfdCB2Y2FnZXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWQUNHRS5GMzIgcTAsIHEwLCBxMAorLy9WZWN0b3IgY29tcGFyZSBhYnNvbHV0ZSBsZXNzLXRoYW4gb3IgZXF1YWwKK3VpbnQzMngyX3QgdmNhbGVfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWQUNHRS5GMzIgZDAsIGQwLCBkMAordWludDMyeDRfdCB2Y2FsZXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWQUNHRS5GMzIgcTAsIHEwLCBxMAorLy9WZWN0b3IgY29tcGFyZSBhYnNvbHV0ZSBncmVhdGVyLXRoYW4KK3VpbnQzMngyX3QgdmNhZ3RfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWQUNHVC5GMzIgZDAsIGQwLCBkMAordWludDMyeDRfdCB2Y2FndHFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWQUNHVC5GMzIgcTAsIHEwLCBxMAorLy9WZWN0b3IgY29tcGFyZSBhYnNvbHV0ZSBsZXNzLXRoYW4KK3VpbnQzMngyX3QgdmNhbHRfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWQUNHVC5GMzIgZDAsIGQwLCBkMAordWludDMyeDRfdCB2Y2FsdHFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWQUNHVC5GMzIgcTAsIHEwLCBxMAorLy9WZWN0b3IgdGVzdCBiaXRzCit1aW50OHg4X3QgdnRzdF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlRTVC44IGQwLCBkMCwgZDAKK3VpbnQxNng0X3QgdnRzdF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlRTVC4xNiBkMCwgZDAsIGQwCit1aW50MzJ4Ml90IHZ0c3RfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZUU1QuMzIgZDAsIGQwLCBkMAordWludDh4OF90IHZ0c3RfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlRTVC44IGQwLCBkMCwgZDAKK3VpbnQxNng0X3QgdnRzdF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWVFNULjE2IGQwLCBkMCwgZDAKK3VpbnQzMngyX3QgdnRzdF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWVFNULjMyIGQwLCBkMCwgZDAKK3VpbnQ4eDhfdCB2dHN0X3A4KHBvbHk4eDhfdCBhLCBwb2x5OHg4X3QgYik7IC8vIFZUU1QuOCBkMCwgZDAsIGQwCit1aW50OHgxNl90IHZ0c3RxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZUU1QuOCBxMCwgcTAsIHEwCit1aW50MTZ4OF90IHZ0c3RxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWVFNULjE2IHEwLCBxMCwgcTAKK3VpbnQzMng0X3QgdnRzdHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZUU1QuMzIgcTAsIHEwLCBxMAordWludDh4MTZfdCB2dHN0cV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZUU1QuOCBxMCwgcTAsIHEwCit1aW50MTZ4OF90IHZ0c3RxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZUU1QuMTYgcTAsIHEwLCBxMAordWludDMyeDRfdCB2dHN0cV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWVFNULjMyIHEwLCBxMCwgcTAKK3VpbnQ4eDE2X3QgdnRzdHFfcDgocG9seTh4MTZfdCBhLCBwb2x5OHgxNl90IGIpOyAvLyBWVFNULjggcTAsIHEwLCBxMAorLy9BYnNvbHV0ZSBkaWZmZXJlbmNlCisvL0Fic29sdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYXJndW1lbnRzOiBWcltpXSA9IHwgVmFbaV0gLSBWYltpXSB8CitpbnQ4eDhfdCB2YWJkX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWQUJELlM4IGQwLGQwLGQwCitpbnQxNng0X3QgdmFiZF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkFCRC5TMTYgZDAsZDAsZDAKK2ludDMyeDJfdCB2YWJkX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWQUJELlMzMiBkMCxkMCxkMAordWludDh4OF90IHZhYmRfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVkFCRC5VOCBkMCxkMCxkMAordWludDE2eDRfdCB2YWJkX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZBQkQuVTE2IGQwLGQwLGQwCit1aW50MzJ4Ml90IHZhYmRfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVkFCRC5VMzIgZDAsZDAsZDAKK2Zsb2F0MzJ4Ml90IHZhYmRfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWQUJELkYzMiBkMCxkMCxkMAoraW50OHgxNl90IHZhYmRxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZBQkQuUzggcTAscTAscTAKK2ludDE2eDhfdCB2YWJkcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkFCRC5TMTYgcTAscTAscTAKK2ludDMyeDRfdCB2YWJkcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVkFCRC5TMzIgcTAscTAscTAKK3VpbnQ4eDE2X3QgdmFiZHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWQUJELlU4IHEwLHEwLHEwCit1aW50MTZ4OF90IHZhYmRxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZBQkQuVTE2IHEwLHEwLHEwCit1aW50MzJ4NF90IHZhYmRxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZBQkQuVTMyIHEwLHEwLHEwCitmbG9hdDMyeDRfdCB2YWJkcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZBQkQuRjMyIHEwLHEwLHEwCisvL0Fic29sdXRlIGRpZmZlcmVuY2UgLSBsb25nCitpbnQxNng4X3QgdmFiZGxfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZBQkRMLlM4IHEwLGQwLGQwCitpbnQzMng0X3QgdmFiZGxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZBQkRMLlMxNiBxMCxkMCxkMAoraW50NjR4Ml90IHZhYmRsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWQUJETC5TMzIgcTAsZDAsZDAKK3VpbnQxNng4X3QgdmFiZGxfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVkFCREwuVTggcTAsZDAsZDAKK3VpbnQzMng0X3QgdmFiZGxfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVkFCREwuVTE2IHEwLGQwLGQwCit1aW50NjR4Ml90IHZhYmRsX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZBQkRMLlUzMiBxMCxkMCxkMAorLy9BYnNvbHV0ZSBkaWZmZXJlbmNlIGFuZCBhY2N1bXVsYXRlOiBWcltpXSA9IFZhW2ldICsgfCBWYltpXSAtIFZjW2ldIHwKK2ludDh4OF90IHZhYmFfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYiwgaW50OHg4X3QgYyk7IC8vIFZBQkEuUzggZDAsZDAsZDAKK2ludDE2eDRfdCB2YWJhX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCBjKTsgLy8gVkFCQS5TMTYgZDAsZDAsZDAKK2ludDMyeDJfdCB2YWJhX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKTsgLy8gVkFCQS5TMzIgZDAsZDAsZDAKK3VpbnQ4eDhfdCB2YWJhX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYiwgdWludDh4OF90IGMpOyAvLyBWQUJBLlU4IGQwLGQwLGQwCit1aW50MTZ4NF90IHZhYmFfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IGMpOyAvLyBWQUJBLlUxNiBkMCxkMCxkMAordWludDMyeDJfdCB2YWJhX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCBjKTsgLy8gVkFCQS5VMzIgZDAsZDAsZDAKK2ludDh4MTZfdCB2YWJhcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIsIGludDh4MTZfdCBjKTsgLy8gVkFCQS5TOCBxMCxxMCxxMAoraW50MTZ4OF90IHZhYmFxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDhfdCBjKTsgLy8gVkFCQS5TMTYgcTAscTAscTAKK2ludDMyeDRfdCB2YWJhcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBpbnQzMng0X3QgYyk7IC8vIFZBQkEuUzMyIHEwLHEwLHEwCit1aW50OHgxNl90IHZhYmFxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiLCB1aW50OHgxNl90IGMpOyAvLyBWQUJBLlU4IHEwLHEwLHEwCit1aW50MTZ4OF90IHZhYmFxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2eDhfdCBjKTsgLy8gVkFCQS5VMTYgcTAscTAscTAKK3VpbnQzMng0X3QgdmFiYXFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiLCB1aW50MzJ4NF90IGMpOyAvLyBWQUJBLlUzMiBxMCxxMCxxMAorLy9BYnNvbHV0ZSBkaWZmZXJlbmNlIGFuZCBhY2N1bXVsYXRlIC0gbG9uZworaW50MTZ4OF90IHZhYmFsX3M4KGludDE2eDhfdCBhLCBpbnQ4eDhfdCBiLCBpbnQ4eDhfdCBjKTsgLy8gVkFCQUwuUzggcTAsZDAsZDAKK2ludDMyeDRfdCB2YWJhbF9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgYyk7IC8vIFZBQkFMLlMxNiBxMCxkMCxkMAoraW50NjR4Ml90IHZhYmFsX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKTsgLy8gVkFCQUwuUzMyIHEwLGQwLGQwCit1aW50MTZ4OF90IHZhYmFsX3U4KHVpbnQxNng4X3QgYSwgdWludDh4OF90IGIsIHVpbnQ4eDhfdCBjKTsgLy8gVkFCQUwuVTggcTAsZDAsZDAKK3VpbnQzMng0X3QgdmFiYWxfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IGMpOyAvLyBWQUJBTC5VMTYgcTAsZDAsZDAKK3VpbnQ2NHgyX3QgdmFiYWxfdTMyKHVpbnQ2NHgyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IGMpOyAvLyBWQUJBTC5VMzIgcTAsZDAsZDAKKy8vTWF4L01pbgorLy92bWF4IC0+IFZyW2ldIDo9IChWYVtpXSA+PSBWYltpXSkgPyBWYVtpXSA6IFZiW2ldCitpbnQ4eDhfdCB2bWF4X3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWTUFYLlM4IGQwLGQwLGQwCitpbnQxNng0X3Qgdm1heF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVk1BWC5TMTYgZDAsZDAsZDAKK2ludDMyeDJfdCB2bWF4X3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWTUFYLlMzMiBkMCxkMCxkMAordWludDh4OF90IHZtYXhfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVk1BWC5VOCBkMCxkMCxkMAordWludDE2eDRfdCB2bWF4X3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZNQVguVTE2IGQwLGQwLGQwCit1aW50MzJ4Ml90IHZtYXhfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVk1BWC5VMzIgZDAsZDAsZDAKK2Zsb2F0MzJ4Ml90IHZtYXhfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWTUFYLkYzMiBkMCxkMCxkMAoraW50OHgxNl90IHZtYXhxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZNQVguUzggcTAscTAscTAKK2ludDE2eDhfdCB2bWF4cV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVk1BWC5TMTYgcTAscTAscTAKK2ludDMyeDRfdCB2bWF4cV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVk1BWC5TMzIgcTAscTAscTAKK3VpbnQ4eDE2X3Qgdm1heHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWTUFYLlU4IHEwLHEwLHEwCit1aW50MTZ4OF90IHZtYXhxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZNQVguVTE2IHEwLHEwLHEwCit1aW50MzJ4NF90IHZtYXhxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZNQVguVTMyIHEwLHEwLHEwCitmbG9hdDMyeDRfdCB2bWF4cV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZNQVguRjMyIHEwLHEwLHEwCisvL3ZtaW4gLT4gVnJbaV0gOj0gKFZhW2ldID49IFZiW2ldKSA/IFZiW2ldIDogVmFbaV0KK2ludDh4OF90IHZtaW5fczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZNSU4uUzggZDAsZDAsZDAKK2ludDE2eDRfdCB2bWluX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWTUlOLlMxNiBkMCxkMCxkMAoraW50MzJ4Ml90IHZtaW5fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZNSU4uUzMyIGQwLGQwLGQwCit1aW50OHg4X3Qgdm1pbl91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWTUlOLlU4IGQwLGQwLGQwCit1aW50MTZ4NF90IHZtaW5fdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVk1JTi5VMTYgZDAsZDAsZDAKK3VpbnQzMngyX3Qgdm1pbl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWTUlOLlUzMiBkMCxkMCxkMAorZmxvYXQzMngyX3Qgdm1pbl9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZNSU4uRjMyIGQwLGQwLGQwCitpbnQ4eDE2X3Qgdm1pbnFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVk1JTi5TOCBxMCxxMCxxMAoraW50MTZ4OF90IHZtaW5xX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWTUlOLlMxNiBxMCxxMCxxMAoraW50MzJ4NF90IHZtaW5xX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWTUlOLlMzMiBxMCxxMCxxMAordWludDh4MTZfdCB2bWlucV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZNSU4uVTggcTAscTAscTAKK3VpbnQxNng4X3Qgdm1pbnFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVk1JTi5VMTYgcTAscTAscTAKK3VpbnQzMng0X3Qgdm1pbnFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVk1JTi5VMzIgcTAscTAscTAKK2Zsb2F0MzJ4NF90IHZtaW5xX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVk1JTi5GMzIgcTAscTAscTAKKy8vUGFpcndpc2UgYWRkaXRpb24KKy8vUGFpcndpc2UgYWRkCitpbnQ4eDhfdCB2cGFkZF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlBBREQuSTggZDAsZDAsZDAKK2ludDE2eDRfdCB2cGFkZF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlBBREQuSTE2IGQwLGQwLGQwCitpbnQzMngyX3QgdnBhZGRfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZQQURELkkzMiBkMCxkMCxkMAordWludDh4OF90IHZwYWRkX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZQQURELkk4IGQwLGQwLGQwCit1aW50MTZ4NF90IHZwYWRkX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZQQURELkkxNiBkMCxkMCxkMAordWludDMyeDJfdCB2cGFkZF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWUEFERC5JMzIgZDAsZDAsZDAKK2Zsb2F0MzJ4Ml90IHZwYWRkX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVlBBREQuRjMyIGQwLGQwLGQwCisvL0xvbmcgcGFpcndpc2UgYWRkCitpbnQxNng0X3QgdnBhZGRsX3M4KGludDh4OF90IGEpOyAvLyBWUEFEREwuUzggZDAsZDAKK2ludDMyeDJfdCB2cGFkZGxfczE2KGludDE2eDRfdCBhKTsgLy8gVlBBRERMLlMxNiBkMCxkMAoraW50NjR4MV90IHZwYWRkbF9zMzIoaW50MzJ4Ml90IGEpOyAvLyBWUEFEREwuUzMyIGQwLGQwCit1aW50MTZ4NF90IHZwYWRkbF91OCh1aW50OHg4X3QgYSk7IC8vIFZQQURETC5VOCBkMCxkMAordWludDMyeDJfdCB2cGFkZGxfdTE2KHVpbnQxNng0X3QgYSk7IC8vIFZQQURETC5VMTYgZDAsZDAKK3VpbnQ2NHgxX3QgdnBhZGRsX3UzMih1aW50MzJ4Ml90IGEpOyAvLyBWUEFEREwuVTMyIGQwLGQwCitpbnQxNng4X3QgdnBhZGRscV9zOChpbnQ4eDE2X3QgYSk7IC8vIFZQQURETC5TOCBxMCxxMAoraW50MzJ4NF90IHZwYWRkbHFfczE2KGludDE2eDhfdCBhKTsgLy8gVlBBRERMLlMxNiBxMCxxMAoraW50NjR4Ml90IHZwYWRkbHFfczMyKGludDMyeDRfdCBhKTsgLy8gVlBBRERMLlMzMiBxMCxxMAordWludDE2eDhfdCB2cGFkZGxxX3U4KHVpbnQ4eDE2X3QgYSk7IC8vIFZQQURETC5VOCBxMCxxMAordWludDMyeDRfdCB2cGFkZGxxX3UxNih1aW50MTZ4OF90IGEpOyAvLyBWUEFEREwuVTE2IHEwLHEwCit1aW50NjR4Ml90IHZwYWRkbHFfdTMyKHVpbnQzMng0X3QgYSk7IC8vIFZQQURETC5VMzIgcTAscTAKKy8vTG9uZyBwYWlyd2lzZSBhZGQgYW5kIGFjY3VtdWxhdGUKK2ludDE2eDRfdCB2cGFkYWxfczgoaW50MTZ4NF90IGEsIGludDh4OF90IGIpOyAvLyBWUEFEQUwuUzggZDAsZDAKK2ludDMyeDJfdCB2cGFkYWxfczE2KGludDMyeDJfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZQQURBTC5TMTYgZDAsZDAKK2ludDY0eDFfdCB2cGFkYWxfczMyKGludDY0eDFfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZQQURBTC5TMzIgZDAsZDAKK3VpbnQxNng0X3QgdnBhZGFsX3U4KHVpbnQxNng0X3QgYSwgdWludDh4OF90IGIpOyAvLyBWUEFEQUwuVTggZDAsZDAKK3VpbnQzMngyX3QgdnBhZGFsX3UxNih1aW50MzJ4Ml90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZQQURBTC5VMTYgZDAsZDAKK3VpbnQ2NHgxX3QgdnBhZGFsX3UzMih1aW50NjR4MV90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZQQURBTC5VMzIgZDAsZDAKK2ludDE2eDhfdCB2cGFkYWxxX3M4KGludDE2eDhfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZQQURBTC5TOCBxMCxxMAoraW50MzJ4NF90IHZwYWRhbHFfczE2KGludDMyeDRfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZQQURBTC5TMTYgcTAscTAKK2ludDY0eDJfdCB2cGFkYWxxX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWUEFEQUwuUzMyIHEwLHEwCit1aW50MTZ4OF90IHZwYWRhbHFfdTgodWludDE2eDhfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWUEFEQUwuVTggcTAscTAKK3VpbnQzMng0X3QgdnBhZGFscV91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWUEFEQUwuVTE2IHEwLHEwCit1aW50NjR4Ml90IHZwYWRhbHFfdTMyKHVpbnQ2NHgyX3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVlBBREFMLlUzMiBxMCxxMAorLy9Gb2xkaW5nIG1heGltdW0gdnBtYXggLT4gdGFrZXMgbWF4aW11bSBvZiBhZGphY2VudCBwYWlycworaW50OHg4X3QgdnBtYXhfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZQTUFYLlM4IGQwLGQwLGQwCitpbnQxNng0X3QgdnBtYXhfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZQTUFYLlMxNiBkMCxkMCxkMAoraW50MzJ4Ml90IHZwbWF4X3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWUE1BWC5TMzIgZDAsZDAsZDAKK3VpbnQ4eDhfdCB2cG1heF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWUE1BWC5VOCBkMCxkMCxkMAordWludDE2eDRfdCB2cG1heF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWUE1BWC5VMTYgZDAsZDAsZDAKK3VpbnQzMngyX3QgdnBtYXhfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVlBNQVguVTMyIGQwLGQwLGQwCitmbG9hdDMyeDJfdCB2cG1heF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZQTUFYLkYzMiBkMCxkMCxkMAorLy9Gb2xkaW5nIG1pbmltdW0gdnBtaW4gLT4gdGFrZXMgbWluaW11bSBvZiBhZGphY2VudCBwYWlycworaW50OHg4X3QgdnBtaW5fczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZQTUlOLlM4IGQwLGQwLGQwCitpbnQxNng0X3QgdnBtaW5fczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZQTUlOLlMxNiBkMCxkMCxkMAoraW50MzJ4Ml90IHZwbWluX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWUE1JTi5TMzIgZDAsZDAsZDAKK3VpbnQ4eDhfdCB2cG1pbl91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWUE1JTi5VOCBkMCxkMCxkMAordWludDE2eDRfdCB2cG1pbl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWUE1JTi5VMTYgZDAsZDAsZDAKK3VpbnQzMngyX3QgdnBtaW5fdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVlBNSU4uVTMyIGQwLGQwLGQwCitmbG9hdDMyeDJfdCB2cG1pbl9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZQTUlOLkYzMiBkMCxkMCxkMAorLy9SZWNpcHJvY2FsL1NxcnQKK2Zsb2F0MzJ4Ml90IHZyZWNwc19mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZSRUNQUy5GMzIgZDAsIGQwLCBkMAorZmxvYXQzMng0X3QgdnJlY3BzcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZSRUNQUy5GMzIgcTAsIHEwLCBxMAorZmxvYXQzMngyX3QgdnJzcXJ0c19mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZSU1FSVFMuRjMyIGQwLCBkMCwgZDAKK2Zsb2F0MzJ4NF90IHZyc3FydHNxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVlJTUVJUUy5GMzIgcTAsIHEwLCBxMAorLy9TaGlmdHMgYnkgc2lnbmVkIHZhcmlhYmxlCisvL1ZlY3RvciBzaGlmdCBsZWZ0OiBWcltpXSA6PSBWYVtpXSA8PCBWYltpXSAobmVnYXRpdmUgdmFsdWVzIHNoaWZ0IHJpZ2h0KQoraW50OHg4X3QgdnNobF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlNITC5TOCBkMCxkMCxkMAoraW50MTZ4NF90IHZzaGxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZTSEwuUzE2IGQwLGQwLGQwCitpbnQzMngyX3QgdnNobF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlNITC5TMzIgZDAsZDAsZDAKK2ludDY0eDFfdCB2c2hsX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWU0hMLlM2NCBkMCxkMCxkMAordWludDh4OF90IHZzaGxfdTgodWludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWU0hMLlU4IGQwLGQwLGQwCit1aW50MTZ4NF90IHZzaGxfdTE2KHVpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWU0hMLlUxNiBkMCxkMCxkMAordWludDMyeDJfdCB2c2hsX3UzMih1aW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlNITC5VMzIgZDAsZDAsZDAKK3VpbnQ2NHgxX3QgdnNobF91NjQodWludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYik7IC8vIFZTSEwuVTY0IGQwLGQwLGQwCitpbnQ4eDE2X3QgdnNobHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlNITC5TOCBxMCxxMCxxMAoraW50MTZ4OF90IHZzaGxxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWU0hMLlMxNiBxMCxxMCxxMAoraW50MzJ4NF90IHZzaGxxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWU0hMLlMzMiBxMCxxMCxxMAoraW50NjR4Ml90IHZzaGxxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWU0hMLlM2NCBxMCxxMCxxMAordWludDh4MTZfdCB2c2hscV91OCh1aW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlNITC5VOCBxMCxxMCxxMAordWludDE2eDhfdCB2c2hscV91MTYodWludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZTSEwuVTE2IHEwLHEwLHEwCit1aW50MzJ4NF90IHZzaGxxX3UzMih1aW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlNITC5VMzIgcTAscTAscTAKK3VpbnQ2NHgyX3QgdnNobHFfdTY0KHVpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWU0hMLlU2NCBxMCxxMCxxMAorLy9WZWN0b3Igc2F0dXJhdGluZyBzaGlmdCBsZWZ0OiAobmVnYXRpdmUgdmFsdWVzIHNoaWZ0IHJpZ2h0KQoraW50OHg4X3QgdnFzaGxfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZRU0hMLlM4IGQwLGQwLGQwCitpbnQxNng0X3QgdnFzaGxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZRU0hMLlMxNiBkMCxkMCxkMAoraW50MzJ4Ml90IHZxc2hsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWUVNITC5TMzIgZDAsZDAsZDAKK2ludDY0eDFfdCB2cXNobF9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVlFTSEwuUzY0IGQwLGQwLGQwCit1aW50OHg4X3QgdnFzaGxfdTgodWludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWUVNITC5VOCBkMCxkMCxkMAordWludDE2eDRfdCB2cXNobF91MTYodWludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZRU0hMLlUxNiBkMCxkMCxkMAordWludDMyeDJfdCB2cXNobF91MzIodWludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZRU0hMLlUzMiBkMCxkMCxkMAordWludDY0eDFfdCB2cXNobF91NjQodWludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYik7IC8vIFZRU0hMLlU2NCBkMCxkMCxkMAoraW50OHgxNl90IHZxc2hscV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWUVNITC5TOCBxMCxxMCxxMAoraW50MTZ4OF90IHZxc2hscV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlFTSEwuUzE2IHEwLHEwLHEwCitpbnQzMng0X3QgdnFzaGxxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWUVNITC5TMzIgcTAscTAscTAKK2ludDY0eDJfdCB2cXNobHFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZRU0hMLlM2NCBxMCxxMCxxMAordWludDh4MTZfdCB2cXNobHFfdTgodWludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZRU0hMLlU4IHEwLHEwLHEwCit1aW50MTZ4OF90IHZxc2hscV91MTYodWludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZRU0hMLlUxNiBxMCxxMCxxMAordWludDMyeDRfdCB2cXNobHFfdTMyKHVpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWUVNITC5VMzIgcTAscTAscTAKK3VpbnQ2NHgyX3QgdnFzaGxxX3U2NCh1aW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVlFTSEwuVTY0IHEwLHEwLHEwCisvL1ZlY3RvciByb3VuZGluZyBzaGlmdCBsZWZ0OiAobmVnYXRpdmUgdmFsdWVzIHNoaWZ0IHJpZ2h0KQoraW50OHg4X3QgdnJzaGxfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZSU0hMLlM4IGQwLGQwLGQwCitpbnQxNng0X3QgdnJzaGxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZSU0hMLlMxNiBkMCxkMCxkMAoraW50MzJ4Ml90IHZyc2hsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWUlNITC5TMzIgZDAsZDAsZDAKK2ludDY0eDFfdCB2cnNobF9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVlJTSEwuUzY0IGQwLGQwLGQwCit1aW50OHg4X3QgdnJzaGxfdTgodWludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWUlNITC5VOCBkMCxkMCxkMAordWludDE2eDRfdCB2cnNobF91MTYodWludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZSU0hMLlUxNiBkMCxkMCxkMAordWludDMyeDJfdCB2cnNobF91MzIodWludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZSU0hMLlUzMiBkMCxkMCxkMAordWludDY0eDFfdCB2cnNobF91NjQodWludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYik7IC8vIFZSU0hMLlU2NCBkMCxkMCxkMAoraW50OHgxNl90IHZyc2hscV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWUlNITC5TOCBxMCxxMCxxMAoraW50MTZ4OF90IHZyc2hscV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlJTSEwuUzE2IHEwLHEwLHEwCitpbnQzMng0X3QgdnJzaGxxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWUlNITC5TMzIgcTAscTAscTAKK2ludDY0eDJfdCB2cnNobHFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZSU0hMLlM2NCBxMCxxMCxxMAordWludDh4MTZfdCB2cnNobHFfdTgodWludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZSU0hMLlU4IHEwLHEwLHEwCit1aW50MTZ4OF90IHZyc2hscV91MTYodWludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZSU0hMLlUxNiBxMCxxMCxxMAordWludDMyeDRfdCB2cnNobHFfdTMyKHVpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWUlNITC5VMzIgcTAscTAscTAKK3VpbnQ2NHgyX3QgdnJzaGxxX3U2NCh1aW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVlJTSEwuVTY0IHEwLHEwLHEwCisvL1ZlY3RvciBzYXR1cmF0aW5nIHJvdW5kaW5nIHNoaWZ0IGxlZnQ6IChuZWdhdGl2ZSB2YWx1ZXMgc2hpZnQgcmlnaHQpCitpbnQ4eDhfdCB2cXJzaGxfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZRUlNITC5TOCBkMCxkMCxkMAoraW50MTZ4NF90IHZxcnNobF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlFSU0hMLlMxNiBkMCxkMCxkMAoraW50MzJ4Ml90IHZxcnNobF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlFSU0hMLlMzMiBkMCxkMCxkMAoraW50NjR4MV90IHZxcnNobF9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVlFSU0hMLlM2NCBkMCxkMCxkMAordWludDh4OF90IHZxcnNobF91OCh1aW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZRUlNITC5VOCBkMCxkMCxkMAordWludDE2eDRfdCB2cXJzaGxfdTE2KHVpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWUVJTSEwuVTE2IGQwLGQwLGQwCit1aW50MzJ4Ml90IHZxcnNobF91MzIodWludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZRUlNITC5VMzIgZDAsZDAsZDAKK3VpbnQ2NHgxX3QgdnFyc2hsX3U2NCh1aW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVlFSU0hMLlU2NCBkMCxkMCxkMAoraW50OHgxNl90IHZxcnNobHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlFSU0hMLlM4IHEwLHEwLHEwCitpbnQxNng4X3QgdnFyc2hscV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlFSU0hMLlMxNiBxMCxxMCxxMAoraW50MzJ4NF90IHZxcnNobHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZRUlNITC5TMzIgcTAscTAscTAKK2ludDY0eDJfdCB2cXJzaGxxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWUVJTSEwuUzY0IHEwLHEwLHEwCit1aW50OHgxNl90IHZxcnNobHFfdTgodWludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZRUlNITC5VOCBxMCxxMCxxMAordWludDE2eDhfdCB2cXJzaGxxX3UxNih1aW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlFSU0hMLlUxNiBxMCxxMCxxMAordWludDMyeDRfdCB2cXJzaGxxX3UzMih1aW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlFSU0hMLlUzMiBxMCxxMCxxMAordWludDY0eDJfdCB2cXJzaGxxX3U2NCh1aW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVlFSU0hMLlU2NCBxMCxxMCxxMAorLy9TaGlmdHMgYnkgYSBjb25zdGFudAorLy9WZWN0b3Igc2hpZnQgcmlnaHQgYnkgY29uc3RhbnQKK2ludDh4OF90IHZzaHJfbl9zOChpbnQ4eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZTSFIuUzggZDAsZDAsIzgKK2ludDE2eDRfdCB2c2hyX25fczE2KGludDE2eDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWU0hSLlMxNiBkMCxkMCwjMTYKK2ludDMyeDJfdCB2c2hyX25fczMyKGludDMyeDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWU0hSLlMzMiBkMCxkMCwjMzIKK2ludDY0eDFfdCB2c2hyX25fczY0KGludDY0eDFfdCBhLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGIpOyAvLyBWU0hSLlM2NCBkMCxkMCwjNjQKK3VpbnQ4eDhfdCB2c2hyX25fdTgodWludDh4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlNIUi5VOCBkMCxkMCwjOAordWludDE2eDRfdCB2c2hyX25fdTE2KHVpbnQxNng0X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKTsgLy8gVlNIUi5VMTYgZDAsZDAsIzE2Cit1aW50MzJ4Ml90IHZzaHJfbl91MzIodWludDMyeDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWU0hSLlUzMiBkMCxkMCwjMzIKK3VpbnQ2NHgxX3QgdnNocl9uX3U2NCh1aW50NjR4MV90IGEsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYik7IC8vIFZTSFIuVTY0IGQwLGQwLCM2NAoraW50OHgxNl90IHZzaHJxX25fczgoaW50OHgxNl90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlNIUi5TOCBxMCxxMCwjOAoraW50MTZ4OF90IHZzaHJxX25fczE2KGludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWU0hSLlMxNiBxMCxxMCwjMTYKK2ludDMyeDRfdCB2c2hycV9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlNIUi5TMzIgcTAscTAsIzMyCitpbnQ2NHgyX3QgdnNocnFfbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYik7IC8vIFZTSFIuUzY0IHEwLHEwLCM2NAordWludDh4MTZfdCB2c2hycV9uX3U4KHVpbnQ4eDE2X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWU0hSLlU4IHEwLHEwLCM4Cit1aW50MTZ4OF90IHZzaHJxX25fdTE2KHVpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKTsgLy8gVlNIUi5VMTYgcTAscTAsIzE2Cit1aW50MzJ4NF90IHZzaHJxX25fdTMyKHVpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlNIUi5VMzIgcTAscTAsIzMyCit1aW50NjR4Ml90IHZzaHJxX25fdTY0KHVpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsNjQpIGludCBiKTsgLy8gVlNIUi5VNjQgcTAscTAsIzY0CisvL1ZlY3RvciBzaGlmdCBsZWZ0IGJ5IGNvbnN0YW50CitpbnQ4eDhfdCB2c2hsX25fczgoaW50OHg4X3QgYSwgX19jb25zdHJhbmdlKDAsNykgaW50IGIpOyAvLyBWU0hMLkk4IGQwLGQwLCMwCitpbnQxNng0X3QgdnNobF9uX3MxNihpbnQxNng0X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKTsgLy8gVlNITC5JMTYgZDAsZDAsIzAKK2ludDMyeDJfdCB2c2hsX25fczMyKGludDMyeDJfdCBhLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpOyAvLyBWU0hMLkkzMiBkMCxkMCwjMAoraW50NjR4MV90IHZzaGxfbl9zNjQoaW50NjR4MV90IGEsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYik7IC8vIFZTSEwuSTY0IGQwLGQwLCMwCit1aW50OHg4X3QgdnNobF9uX3U4KHVpbnQ4eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYik7IC8vIFZTSEwuSTggZDAsZDAsIzAKK3VpbnQxNng0X3QgdnNobF9uX3UxNih1aW50MTZ4NF90IGEsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYik7IC8vIFZTSEwuSTE2IGQwLGQwLCMwCit1aW50MzJ4Ml90IHZzaGxfbl91MzIodWludDMyeDJfdCBhLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpOyAvLyBWU0hMLkkzMiBkMCxkMCwjMAordWludDY0eDFfdCB2c2hsX25fdTY0KHVpbnQ2NHgxX3QgYSwgX19jb25zdHJhbmdlKDAsNjMpIGludCBiKTsgLy8gVlNITC5JNjQgZDAsZDAsIzAKK2ludDh4MTZfdCB2c2hscV9uX3M4KGludDh4MTZfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYik7IC8vIFZTSEwuSTggcTAscTAsIzAKK2ludDE2eDhfdCB2c2hscV9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKTsgLy8gVlNITC5JMTYgcTAscTAsIzAKK2ludDMyeDRfdCB2c2hscV9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDAsMzEpIGludCBiKTsgLy8gVlNITC5JMzIgcTAscTAsIzAKK2ludDY0eDJfdCB2c2hscV9uX3M2NChpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDAsNjMpIGludCBiKTsgLy8gVlNITC5JNjQgcTAscTAsIzAKK3VpbnQ4eDE2X3QgdnNobHFfbl91OCh1aW50OHgxNl90IGEsIF9fY29uc3RyYW5nZSgwLDcpIGludCBiKTsgLy8gVlNITC5JOCBxMCxxMCwjMAordWludDE2eDhfdCB2c2hscV9uX3UxNih1aW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYik7IC8vIFZTSEwuSTE2IHEwLHEwLCMwCit1aW50MzJ4NF90IHZzaGxxX25fdTMyKHVpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDAsMzEpIGludCBiKTsgLy8gVlNITC5JMzIgcTAscTAsIzAKK3VpbnQ2NHgyX3QgdnNobHFfbl91NjQodWludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGIpOyAvLyBWU0hMLkk2NCBxMCxxMCwjMAorLy9WZWN0b3Igcm91bmRpbmcgc2hpZnQgcmlnaHQgYnkgY29uc3RhbnQKK2ludDh4OF90IHZyc2hyX25fczgoaW50OHg4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWUlNIUi5TOCBkMCxkMCwjOAoraW50MTZ4NF90IHZyc2hyX25fczE2KGludDE2eDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWUlNIUi5TMTYgZDAsZDAsIzE2CitpbnQzMngyX3QgdnJzaHJfbl9zMzIoaW50MzJ4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZSU0hSLlMzMiBkMCxkMCwjMzIKK2ludDY0eDFfdCB2cnNocl9uX3M2NChpbnQ2NHgxX3QgYSwgX19jb25zdHJhbmdlKDEsNjQpIGludCBiKTsgLy8gVlJTSFIuUzY0IGQwLGQwLCM2NAordWludDh4OF90IHZyc2hyX25fdTgodWludDh4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlJTSFIuVTggZDAsZDAsIzgKK3VpbnQxNng0X3QgdnJzaHJfbl91MTYodWludDE2eDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWUlNIUi5VMTYgZDAsZDAsIzE2Cit1aW50MzJ4Ml90IHZyc2hyX25fdTMyKHVpbnQzMngyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlJTSFIuVTMyIGQwLGQwLCMzMgordWludDY0eDFfdCB2cnNocl9uX3U2NCh1aW50NjR4MV90IGEsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYik7IC8vIFZSU0hSLlU2NCBkMCxkMCwjNjQKK2ludDh4MTZfdCB2cnNocnFfbl9zOChpbnQ4eDE2X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWUlNIUi5TOCBxMCxxMCwjOAoraW50MTZ4OF90IHZyc2hycV9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKTsgLy8gVlJTSFIuUzE2IHEwLHEwLCMxNgoraW50MzJ4NF90IHZyc2hycV9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlJTSFIuUzMyIHEwLHEwLCMzMgoraW50NjR4Ml90IHZyc2hycV9uX3M2NChpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsNjQpIGludCBiKTsgLy8gVlJTSFIuUzY0IHEwLHEwLCM2NAordWludDh4MTZfdCB2cnNocnFfbl91OCh1aW50OHgxNl90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlJTSFIuVTggcTAscTAsIzgKK3VpbnQxNng4X3QgdnJzaHJxX25fdTE2KHVpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKTsgLy8gVlJTSFIuVTE2IHEwLHEwLCMxNgordWludDMyeDRfdCB2cnNocnFfbl91MzIodWludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWUlNIUi5VMzIgcTAscTAsIzMyCit1aW50NjR4Ml90IHZyc2hycV9uX3U2NCh1aW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYik7IC8vIFZSU0hSLlU2NCBxMCxxMCwjNjQKKy8vVmVjdG9yIHNoaWZ0IHJpZ2h0IGJ5IGNvbnN0YW50IGFuZCBhY2N1bXVsYXRlCitpbnQ4eDhfdCB2c3JhX25fczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpOyAvLyBWU1JBLlM4IGQwLGQwLCM4CitpbnQxNng0X3QgdnNyYV9uX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYyk7IC8vIFZTUkEuUzE2IGQwLGQwLCMxNgoraW50MzJ4Ml90IHZzcmFfbl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGMpOyAvLyBWU1JBLlMzMiBkMCxkMCwjMzIKK2ludDY0eDFfdCB2c3JhX25fczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKTsgLy8gVlNSQS5TNjQgZDAsZDAsIzY0Cit1aW50OHg4X3QgdnNyYV9uX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpOyAvLyBWU1JBLlU4IGQwLGQwLCM4Cit1aW50MTZ4NF90IHZzcmFfbl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYyk7IC8vIFZTUkEuVTE2IGQwLGQwLCMxNgordWludDMyeDJfdCB2c3JhX25fdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGMpOyAvLyBWU1JBLlUzMiBkMCxkMCwjMzIKK3VpbnQ2NHgxX3QgdnNyYV9uX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKTsgLy8gVlNSQS5VNjQgZDAsZDAsIzY0CitpbnQ4eDE2X3QgdnNyYXFfbl9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIsIF9fY29uc3RyYW5nZSgxLDgpIGludCBjKTsgLy8gVlNSQS5TOCBxMCxxMCwjOAoraW50MTZ4OF90IHZzcmFxX25fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlNSQS5TMTYgcTAscTAsIzE2CitpbnQzMng0X3QgdnNyYXFfbl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGMpOyAvLyBWU1JBLlMzMiBxMCxxMCwjMzIKK2ludDY0eDJfdCB2c3JhcV9uX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYyk7IC8vIFZTUkEuUzY0IHEwLHEwLCM2NAordWludDh4MTZfdCB2c3JhcV9uX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZTUkEuVTggcTAscTAsIzgKK3VpbnQxNng4X3QgdnNyYXFfbl91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYyk7IC8vIFZTUkEuVTE2IHEwLHEwLCMxNgordWludDMyeDRfdCB2c3JhcV9uX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKTsgLy8gVlNSQS5VMzIgcTAscTAsIzMyCit1aW50NjR4Ml90IHZzcmFxX25fdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpOyAvLyBWU1JBLlU2NCBxMCxxMCwjNjQKKy8vVmVjdG9yIHJvdW5kaW5nIHNoaWZ0IHJpZ2h0IGJ5IGNvbnN0YW50IGFuZCBhY2N1bXVsYXRlCitpbnQ4eDhfdCB2cnNyYV9uX3M4KGludDh4OF90IGEsIGludDh4OF90IGIsIF9fY29uc3RyYW5nZSgxLDgpIGludCBjKTsgLy8gVlJTUkEuUzggZDAsZDAsIzgKK2ludDE2eDRfdCB2cnNyYV9uX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYyk7IC8vIFZSU1JBLlMxNiBkMCxkMCwjMTYKK2ludDMyeDJfdCB2cnNyYV9uX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYyk7IC8vIFZSU1JBLlMzMiBkMCxkMCwjMzIKK2ludDY0eDFfdCB2cnNyYV9uX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYyk7IC8vIFZSU1JBLlM2NCBkMCxkMCwjNjQKK3VpbnQ4eDhfdCB2cnNyYV9uX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpOyAvLyBWUlNSQS5VOCBkMCxkMCwjOAordWludDE2eDRfdCB2cnNyYV9uX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlJTUkEuVTE2IGQwLGQwLCMxNgordWludDMyeDJfdCB2cnNyYV9uX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKTsgLy8gVlJTUkEuVTMyIGQwLGQwLCMzMgordWludDY0eDFfdCB2cnNyYV9uX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKTsgLy8gVlJTUkEuVTY0IGQwLGQwLCM2NAoraW50OHgxNl90IHZyc3JhcV9uX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpOyAvLyBWUlNSQS5TOCBxMCxxMCwjOAoraW50MTZ4OF90IHZyc3JhcV9uX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYyk7IC8vIFZSU1JBLlMxNiBxMCxxMCwjMTYKK2ludDMyeDRfdCB2cnNyYXFfbl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGMpOyAvLyBWUlNSQS5TMzIgcTAscTAsIzMyCitpbnQ2NHgyX3QgdnJzcmFxX25fczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKTsgLy8gVlJTUkEuUzY0IHEwLHEwLCM2NAordWludDh4MTZfdCB2cnNyYXFfbl91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpOyAvLyBWUlNSQS5VOCBxMCxxMCwjOAordWludDE2eDhfdCB2cnNyYXFfbl91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYyk7IC8vIFZSU1JBLlUxNiBxMCxxMCwjMTYKK3VpbnQzMng0X3QgdnJzcmFxX25fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGMpOyAvLyBWUlNSQS5VMzIgcTAscTAsIzMyCit1aW50NjR4Ml90IHZyc3JhcV9uX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKTsgLy8gVlJTUkEuVTY0IHEwLHEwLCM2NAorLy9WZWN0b3Igc2F0dXJhdGluZyBzaGlmdCBsZWZ0IGJ5IGNvbnN0YW50CitpbnQ4eDhfdCB2cXNobF9uX3M4KGludDh4OF90IGEsIF9fY29uc3RyYW5nZSgwLDcpIGludCBiKTsgLy8gVlFTSEwuUzggZDAsZDAsIzAKK2ludDE2eDRfdCB2cXNobF9uX3MxNihpbnQxNng0X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKTsgLy8gVlFTSEwuUzE2IGQwLGQwLCMwCitpbnQzMngyX3QgdnFzaGxfbl9zMzIoaW50MzJ4Ml90IGEsIF9fY29uc3RyYW5nZSgwLDMxKSBpbnQgYik7IC8vIFZRU0hMLlMzMiBkMCxkMCwjMAoraW50NjR4MV90IHZxc2hsX25fczY0KGludDY0eDFfdCBhLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGIpOyAvLyBWUVNITC5TNjQgZDAsZDAsIzAKK3VpbnQ4eDhfdCB2cXNobF9uX3U4KHVpbnQ4eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYik7IC8vIFZRU0hMLlU4IGQwLGQwLCMwCit1aW50MTZ4NF90IHZxc2hsX25fdTE2KHVpbnQxNng0X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKTsgLy8gVlFTSEwuVTE2IGQwLGQwLCMwCit1aW50MzJ4Ml90IHZxc2hsX25fdTMyKHVpbnQzMngyX3QgYSwgX19jb25zdHJhbmdlKDAsMzEpIGludCBiKTsgLy8gVlFTSEwuVTMyIGQwLGQwLCMwCit1aW50NjR4MV90IHZxc2hsX25fdTY0KHVpbnQ2NHgxX3QgYSwgX19jb25zdHJhbmdlKDAsNjMpIGludCBiKTsgLy8gVlFTSEwuVTY0IGQwLGQwLCMwCitpbnQ4eDE2X3QgdnFzaGxxX25fczgoaW50OHgxNl90IGEsIF9fY29uc3RyYW5nZSgwLDcpIGludCBiKTsgLy8gVlFTSEwuUzggcTAscTAsIzAKK2ludDE2eDhfdCB2cXNobHFfbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYik7IC8vIFZRU0hMLlMxNiBxMCxxMCwjMAoraW50MzJ4NF90IHZxc2hscV9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDAsMzEpIGludCBiKTsgLy8gVlFTSEwuUzMyIHEwLHEwLCMwCitpbnQ2NHgyX3QgdnFzaGxxX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGIpOyAvLyBWUVNITC5TNjQgcTAscTAsIzAKK3VpbnQ4eDE2X3QgdnFzaGxxX25fdTgodWludDh4MTZfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYik7IC8vIFZRU0hMLlU4IHEwLHEwLCMwCit1aW50MTZ4OF90IHZxc2hscV9uX3UxNih1aW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYik7IC8vIFZRU0hMLlUxNiBxMCxxMCwjMAordWludDMyeDRfdCB2cXNobHFfbl91MzIodWludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpOyAvLyBWUVNITC5VMzIgcTAscTAsIzAKK3VpbnQ2NHgyX3QgdnFzaGxxX25fdTY0KHVpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDAsNjMpIGludCBiKTsgLy8gVlFTSEwuVTY0IHEwLHEwLCMwCisvL1ZlY3RvciBzaWduZWQtPnVuc2lnbmVkIHNhdHVyYXRpbmcgc2hpZnQgbGVmdCBieSBjb25zdGFudAordWludDh4OF90IHZxc2hsdV9uX3M4KGludDh4OF90IGEsIF9fY29uc3RyYW5nZSgwLDcpIGludCBiKTsgLy8gVlFTSExVLlM4IGQwLGQwLCMwCit1aW50MTZ4NF90IHZxc2hsdV9uX3MxNihpbnQxNng0X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKTsgLy8gVlFTSExVLlMxNiBkMCxkMCwjMAordWludDMyeDJfdCB2cXNobHVfbl9zMzIoaW50MzJ4Ml90IGEsIF9fY29uc3RyYW5nZSgwLDMxKSBpbnQgYik7IC8vIFZRU0hMVS5TMzIgZDAsZDAsIzAKK3VpbnQ2NHgxX3QgdnFzaGx1X25fczY0KGludDY0eDFfdCBhLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGIpOyAvLyBWUVNITFUuUzY0IGQwLGQwLCMwCit1aW50OHgxNl90IHZxc2hsdXFfbl9zOChpbnQ4eDE2X3QgYSwgX19jb25zdHJhbmdlKDAsNykgaW50IGIpOyAvLyBWUVNITFUuUzggcTAscTAsIzAKK3VpbnQxNng4X3QgdnFzaGx1cV9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKTsgLy8gVlFTSExVLlMxNiBxMCxxMCwjMAordWludDMyeDRfdCB2cXNobHVxX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpOyAvLyBWUVNITFUuUzMyIHEwLHEwLCMwCit1aW50NjR4Ml90IHZxc2hsdXFfbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYik7IC8vIFZRU0hMVS5TNjQgcTAscTAsIzAKKy8vVmVjdG9yIG5hcnJvd2luZyBzaGlmdCByaWdodCBieSBjb25zdGFudAoraW50OHg4X3QgdnNocm5fbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlNIUk4uSTE2IGQwLHEwLCM4CitpbnQxNng0X3QgdnNocm5fbl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZTSFJOLkkzMiBkMCxxMCwjMTYKK2ludDMyeDJfdCB2c2hybl9uX3M2NChpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlNIUk4uSTY0IGQwLHEwLCMzMgordWludDh4OF90IHZzaHJuX25fdTE2KHVpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWU0hSTi5JMTYgZDAscTAsIzgKK3VpbnQxNng0X3QgdnNocm5fbl91MzIodWludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWU0hSTi5JMzIgZDAscTAsIzE2Cit1aW50MzJ4Ml90IHZzaHJuX25fdTY0KHVpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlNIUk4uSTY0IGQwLHEwLCMzMgorLy9WZWN0b3Igc2lnbmVkLT51bnNpZ25lZCBuYXJyb3dpbmcgc2F0dXJhdGluZyBzaGlmdCByaWdodCBieSBjb25zdGFudAordWludDh4OF90IHZxc2hydW5fbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlFTSFJVTi5TMTYgZDAscTAsIzgKK3VpbnQxNng0X3QgdnFzaHJ1bl9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKTsgLy8gVlFTSFJVTi5TMzIgZDAscTAsIzE2Cit1aW50MzJ4Ml90IHZxc2hydW5fbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZRU0hSVU4uUzY0IGQwLHEwLCMzMgorLy9WZWN0b3Igc2lnbmVkLT51bnNpZ25lZCByb3VuZGluZyBuYXJyb3dpbmcgc2F0dXJhdGluZyBzaGlmdCByaWdodCBieSBjb25zdGFudAordWludDh4OF90IHZxcnNocnVuX25fczE2KGludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZRUlNIUlVOLlMxNiBkMCxxMCwjOAordWludDE2eDRfdCB2cXJzaHJ1bl9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKTsgLy8gVlFSU0hSVU4uUzMyIGQwLHEwLCMxNgordWludDMyeDJfdCB2cXJzaHJ1bl9uX3M2NChpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlFSU0hSVU4uUzY0IGQwLHEwLCMzMgorLy9WZWN0b3IgbmFycm93aW5nIHNhdHVyYXRpbmcgc2hpZnQgcmlnaHQgYnkgY29uc3RhbnQKK2ludDh4OF90IHZxc2hybl9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWUVNIUk4uUzE2IGQwLHEwLCM4CitpbnQxNng0X3QgdnFzaHJuX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWUVNIUk4uUzMyIGQwLHEwLCMxNgoraW50MzJ4Ml90IHZxc2hybl9uX3M2NChpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlFTSFJOLlM2NCBkMCxxMCwjMzIKK3VpbnQ4eDhfdCB2cXNocm5fbl91MTYodWludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZRU0hSTi5VMTYgZDAscTAsIzgKK3VpbnQxNng0X3QgdnFzaHJuX25fdTMyKHVpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKTsgLy8gVlFTSFJOLlUzMiBkMCxxMCwjMTYKK3VpbnQzMngyX3QgdnFzaHJuX25fdTY0KHVpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlFTSFJOLlU2NCBkMCxxMCwjMzIKKy8vVmVjdG9yIHJvdW5kaW5nIG5hcnJvd2luZyBzaGlmdCByaWdodCBieSBjb25zdGFudAoraW50OHg4X3QgdnJzaHJuX25fczE2KGludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZSU0hSTi5JMTYgZDAscTAsIzgKK2ludDE2eDRfdCB2cnNocm5fbl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZSU0hSTi5JMzIgZDAscTAsIzE2CitpbnQzMngyX3QgdnJzaHJuX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWUlNIUk4uSTY0IGQwLHEwLCMzMgordWludDh4OF90IHZyc2hybl9uX3UxNih1aW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlJTSFJOLkkxNiBkMCxxMCwjOAordWludDE2eDRfdCB2cnNocm5fbl91MzIodWludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWUlNIUk4uSTMyIGQwLHEwLCMxNgordWludDMyeDJfdCB2cnNocm5fbl91NjQodWludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWUlNIUk4uSTY0IGQwLHEwLCMzMgorLy9WZWN0b3Igcm91bmRpbmcgbmFycm93aW5nIHNhdHVyYXRpbmcgc2hpZnQgcmlnaHQgYnkgY29uc3RhbnQKK2ludDh4OF90IHZxcnNocm5fbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlFSU0hSTi5TMTYgZDAscTAsIzgKK2ludDE2eDRfdCB2cXJzaHJuX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWUVJTSFJOLlMzMiBkMCxxMCwjMTYKK2ludDMyeDJfdCB2cXJzaHJuX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWUVJTSFJOLlM2NCBkMCxxMCwjMzIKK3VpbnQ4eDhfdCB2cXJzaHJuX25fdTE2KHVpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWUVJTSFJOLlUxNiBkMCxxMCwjOAordWludDE2eDRfdCB2cXJzaHJuX25fdTMyKHVpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKTsgLy8gVlFSU0hSTi5VMzIgZDAscTAsIzE2Cit1aW50MzJ4Ml90IHZxcnNocm5fbl91NjQodWludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWUVJTSFJOLlU2NCBkMCxxMCwjMzIKKy8vVmVjdG9yIHdpZGVuaW5nIHNoaWZ0IGxlZnQgYnkgY29uc3RhbnQKK2ludDE2eDhfdCB2c2hsbF9uX3M4KGludDh4OF90IGEsIF9fY29uc3RyYW5nZSgwLDgpIGludCBiKTsgLy8gVlNITEwuUzggcTAsZDAsIzAKK2ludDMyeDRfdCB2c2hsbF9uX3MxNihpbnQxNng0X3QgYSwgX19jb25zdHJhbmdlKDAsMTYpIGludCBiKTsgLy8gVlNITEwuUzE2IHEwLGQwLCMwCitpbnQ2NHgyX3QgdnNobGxfbl9zMzIoaW50MzJ4Ml90IGEsIF9fY29uc3RyYW5nZSgwLDMyKSBpbnQgYik7IC8vIFZTSExMLlMzMiBxMCxkMCwjMAordWludDE2eDhfdCB2c2hsbF9uX3U4KHVpbnQ4eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMCw4KSBpbnQgYik7IC8vIFZTSExMLlU4IHEwLGQwLCMwCit1aW50MzJ4NF90IHZzaGxsX25fdTE2KHVpbnQxNng0X3QgYSwgX19jb25zdHJhbmdlKDAsMTYpIGludCBiKTsgLy8gVlNITEwuVTE2IHEwLGQwLCMwCit1aW50NjR4Ml90IHZzaGxsX25fdTMyKHVpbnQzMngyX3QgYSwgX19jb25zdHJhbmdlKDAsMzIpIGludCBiKTsgLy8gVlNITEwuVTMyIHEwLGQwLCMwCisvL1NoaWZ0cyB3aXRoIGluc2VydAorLy9WZWN0b3Igc2hpZnQgcmlnaHQgYW5kIGluc2VydAoraW50OHg4X3QgdnNyaV9uX3M4KGludDh4OF90IGEsIGludDh4OF90IGIsIF9fY29uc3RyYW5nZSgxLDgpIGludCBjKTsgLy8gVlNSSS44IGQwLGQwLCM4CitpbnQxNng0X3QgdnNyaV9uX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYyk7IC8vIFZTUkkuMTYgZDAsZDAsIzE2CitpbnQzMngyX3QgdnNyaV9uX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYyk7IC8vIFZTUkkuMzIgZDAsZDAsIzMyCitpbnQ2NHgxX3QgdnNyaV9uX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYyk7IC8vIFZTUkkuNjQgZDAsZDAsIzY0Cit1aW50OHg4X3QgdnNyaV9uX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpOyAvLyBWU1JJLjggZDAsZDAsIzgKK3VpbnQxNng0X3QgdnNyaV9uX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlNSSS4xNiBkMCxkMCwjMTYKK3VpbnQzMngyX3QgdnNyaV9uX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKTsgLy8gVlNSSS4zMiBkMCxkMCwjMzIKK3VpbnQ2NHgxX3QgdnNyaV9uX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKTsgLy8gVlNSSS42NCBkMCxkMCwjNjQKK3BvbHk4eDhfdCB2c3JpX25fcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZTUkkuOCBkMCxkMCwjOAorcG9seTE2eDRfdCB2c3JpX25fcDE2KHBvbHkxNng0X3QgYSwgcG9seTE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpOyAvLyBWU1JJLjE2IGQwLGQwLCMxNgoraW50OHgxNl90IHZzcmlxX25fczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZTUkkuOCBxMCxxMCwjOAoraW50MTZ4OF90IHZzcmlxX25fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlNSSS4xNiBxMCxxMCwjMTYKK2ludDMyeDRfdCB2c3JpcV9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYyk7IC8vIFZTUkkuMzIgcTAscTAsIzMyCitpbnQ2NHgyX3QgdnNyaXFfbl9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpOyAvLyBWU1JJLjY0IHEwLHEwLCM2NAordWludDh4MTZfdCB2c3JpcV9uX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZTUkkuOCBxMCxxMCwjOAordWludDE2eDhfdCB2c3JpcV9uX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlNSSS4xNiBxMCxxMCwjMTYKK3VpbnQzMng0X3QgdnNyaXFfbl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYyk7IC8vIFZTUkkuMzIgcTAscTAsIzMyCit1aW50NjR4Ml90IHZzcmlxX25fdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpOyAvLyBWU1JJLjY0IHEwLHEwLCM2NAorcG9seTh4MTZfdCB2c3JpcV9uX3A4KHBvbHk4eDE2X3QgYSwgcG9seTh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZTUkkuOCBxMCxxMCwjOAorcG9seTE2eDhfdCB2c3JpcV9uX3AxNihwb2x5MTZ4OF90IGEsIHBvbHkxNng4X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlNSSS4xNiBxMCxxMCwjMTYKKy8vVmVjdG9yIHNoaWZ0IGxlZnQgYW5kIGluc2VydAoraW50OHg4X3QgdnNsaV9uX3M4KGludDh4OF90IGEsIGludDh4OF90IGIsIF9fY29uc3RyYW5nZSgwLDcpIGludCBjKTsgLy8gVlNMSS44IGQwLGQwLCMwCitpbnQxNng0X3QgdnNsaV9uX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYyk7IC8vIFZTTEkuMTYgZDAsZDAsIzAKK2ludDMyeDJfdCB2c2xpX25fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMzEpIGludCBjKTsgLy8gVlNMSS4zMiBkMCxkMCwjMAoraW50NjR4MV90IHZzbGlfbl9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGMpOyAvLyBWU0xJLjY0IGQwLGQwLCMwCit1aW50OHg4X3QgdnNsaV9uX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWU0xJLjggZDAsZDAsIzAKK3VpbnQxNng0X3QgdnNsaV9uX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDAsMTUpIGludCBjKTsgLy8gVlNMSS4xNiBkMCxkMCwjMAordWludDMyeDJfdCB2c2xpX25fdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGMpOyAvLyBWU0xJLjMyIGQwLGQwLCMwCit1aW50NjR4MV90IHZzbGlfbl91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYyk7IC8vIFZTTEkuNjQgZDAsZDAsIzAKK3BvbHk4eDhfdCB2c2xpX25fcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYyk7IC8vIFZTTEkuOCBkMCxkMCwjMAorcG9seTE2eDRfdCB2c2xpX25fcDE2KHBvbHkxNng0X3QgYSwgcG9seTE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGMpOyAvLyBWU0xJLjE2IGQwLGQwLCMwCitpbnQ4eDE2X3QgdnNsaXFfbl9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIsIF9fY29uc3RyYW5nZSgwLDcpIGludCBjKTsgLy8gVlNMSS44IHEwLHEwLCMwCitpbnQxNng4X3QgdnNsaXFfbl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGMpOyAvLyBWU0xJLjE2IHEwLHEwLCMwCitpbnQzMng0X3QgdnNsaXFfbl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGMpOyAvLyBWU0xJLjMyIHEwLHEwLCMwCitpbnQ2NHgyX3QgdnNsaXFfbl9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGMpOyAvLyBWU0xJLjY0IHEwLHEwLCMwCit1aW50OHgxNl90IHZzbGlxX25fdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIsIF9fY29uc3RyYW5nZSgwLDcpIGludCBjKTsgLy8gVlNMSS44IHEwLHEwLCMwCit1aW50MTZ4OF90IHZzbGlxX25fdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGMpOyAvLyBWU0xJLjE2IHEwLHEwLCMwCit1aW50MzJ4NF90IHZzbGlxX25fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGMpOyAvLyBWU0xJLjMyIHEwLHEwLCMwCit1aW50NjR4Ml90IHZzbGlxX25fdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGMpOyAvLyBWU0xJLjY0IHEwLHEwLCMwCitwb2x5OHgxNl90IHZzbGlxX25fcDgocG9seTh4MTZfdCBhLCBwb2x5OHgxNl90IGIsIF9fY29uc3RyYW5nZSgwLDcpIGludCBjKTsgLy8gVlNMSS44IHEwLHEwLCMwCitwb2x5MTZ4OF90IHZzbGlxX25fcDE2KHBvbHkxNng4X3QgYSwgcG9seTE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGMpOyAvLyBWU0xJLjE2IHEwLHEwLCMwCisvL0xvYWRzIG9mIGEgc2luZ2xlIHZlY3RvciBvciBsYW5lLiBQZXJmb3JtIGxvYWRzIGFuZCBzdG9yZXMgb2YgYSBzaW5nbGUgdmVjdG9yIG9mIHNvbWUgdHlwZS4KKy8vTG9hZCBhIHNpbmdsZSB2ZWN0b3IgZnJvbSBtZW1vcnkKK3VpbnQ4eDE2X3QgdmxkMXFfdTgoX190cmFuc2ZlcnNpemUoMTYpIHVpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjgge2QwLCBkMX0sIFtyMF0KK3VpbnQxNng4X3QgdmxkMXFfdTE2KF9fdHJhbnNmZXJzaXplKDgpIHVpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4xNiB7ZDAsIGQxfSwgW3IwXQordWludDMyeDRfdCB2bGQxcV91MzIoX190cmFuc2ZlcnNpemUoNCkgdWludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjMyIHtkMCwgZDF9LCBbcjBdCit1aW50NjR4Ml90IHZsZDFxX3U2NChfX3RyYW5zZmVyc2l6ZSgyKSB1aW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwLCBkMX0sIFtyMF0KK2ludDh4MTZfdCB2bGQxcV9zOChfX3RyYW5zZmVyc2l6ZSgxNikgaW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS44IHtkMCwgZDF9LCBbcjBdCitpbnQxNng4X3QgdmxkMXFfczE2KF9fdHJhbnNmZXJzaXplKDgpIGludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMCwgZDF9LCBbcjBdCitpbnQzMng0X3QgdmxkMXFfczMyKF9fdHJhbnNmZXJzaXplKDQpIGludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjMyIHtkMCwgZDF9LCBbcjBdCitpbnQ2NHgyX3QgdmxkMXFfczY0KF9fdHJhbnNmZXJzaXplKDIpIGludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMCwgZDF9LCBbcjBdCitmbG9hdDE2eDhfdCB2bGQxcV9mMTYoX190cmFuc2ZlcnNpemUoOCkgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4xNiB7ZDAsIGQxfSwgW3IwXQorZmxvYXQzMng0X3QgdmxkMXFfZjMyKF9fdHJhbnNmZXJzaXplKDQpIGZsb2F0MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMzIge2QwLCBkMX0sIFtyMF0KK3BvbHk4eDE2X3QgdmxkMXFfcDgoX190cmFuc2ZlcnNpemUoMTYpIHBvbHk4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjgge2QwLCBkMX0sIFtyMF0KK3BvbHkxNng4X3QgdmxkMXFfcDE2KF9fdHJhbnNmZXJzaXplKDgpIHBvbHkxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4xNiB7ZDAsIGQxfSwgW3IwXQordWludDh4OF90IHZsZDFfdTgoX190cmFuc2ZlcnNpemUoOCkgdWludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuOCB7ZDB9LCBbcjBdCit1aW50MTZ4NF90IHZsZDFfdTE2KF9fdHJhbnNmZXJzaXplKDQpIHVpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4xNiB7ZDB9LCBbcjBdCit1aW50MzJ4Ml90IHZsZDFfdTMyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4zMiB7ZDB9LCBbcjBdCit1aW50NjR4MV90IHZsZDFfdTY0KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDB9LCBbcjBdCitpbnQ4eDhfdCB2bGQxX3M4KF9fdHJhbnNmZXJzaXplKDgpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuOCB7ZDB9LCBbcjBdCitpbnQxNng0X3QgdmxkMV9zMTYoX190cmFuc2ZlcnNpemUoNCkgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwfSwgW3IwXQoraW50MzJ4Ml90IHZsZDFfczMyKF9fdHJhbnNmZXJzaXplKDIpIGludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjMyIHtkMH0sIFtyMF0KK2ludDY0eDFfdCB2bGQxX3M2NChfX3RyYW5zZmVyc2l6ZSgxKSBpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDB9LCBbcjBdCitmbG9hdDE2eDRfdCB2bGQxX2YxNihfX3RyYW5zZmVyc2l6ZSg0KSBfX2ZwMTYgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMH0sIFtyMF0KK2Zsb2F0MzJ4Ml90IHZsZDFfZjMyKF9fdHJhbnNmZXJzaXplKDIpIGZsb2F0MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMzIge2QwfSwgW3IwXQorcG9seTh4OF90IHZsZDFfcDgoX190cmFuc2ZlcnNpemUoOCkgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuOCB7ZDB9LCBbcjBdCitwb2x5MTZ4NF90IHZsZDFfcDE2KF9fdHJhbnNmZXJzaXplKDQpIHBvbHkxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4xNiB7ZDB9LCBbcjBdCisvL0xvYWQgYSBzaW5nbGUgbGFuZSBmcm9tIG1lbW9yeQordWludDh4MTZfdCB2bGQxcV9sYW5lX3U4KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ4X3QgY29uc3QgKiBwdHIsIHVpbnQ4eDE2X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGxhbmUpOyAvL1ZMRDEuOCB7ZDBbMF19LCBbcjBdCit1aW50MTZ4OF90IHZsZDFxX2xhbmVfdTE2KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQxNl90IGNvbnN0ICogcHRyLCB1aW50MTZ4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQxLjE2IHtkMFswXX0sIFtyMF0KK3VpbnQzMng0X3QgdmxkMXFfbGFuZV91MzIoX190cmFuc2ZlcnNpemUoMSkgdWludDMyX3QgY29uc3QgKiBwdHIsIHVpbnQzMng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDEuMzIge2QwWzBdfSwgW3IwXQordWludDY0eDJfdCB2bGQxcV9sYW5lX3U2NChfX3RyYW5zZmVyc2l6ZSgxKSB1aW50NjRfdCBjb25zdCAqIHB0ciwgdWludDY0eDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVkxEMS42NCB7ZDB9LCBbcjBdCitpbnQ4eDE2X3QgdmxkMXFfbGFuZV9zOChfX3RyYW5zZmVyc2l6ZSgxKSBpbnQ4X3QgY29uc3QgKiBwdHIsIGludDh4MTZfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgbGFuZSk7IC8vVkxEMS44IHtkMFswXX0sIFtyMF0KK2ludDE2eDhfdCB2bGQxcV9sYW5lX3MxNihfX3RyYW5zZmVyc2l6ZSgxKSBpbnQxNl90IGNvbnN0ICogcHRyLCBpbnQxNng4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vVkxEMS4xNiB7ZDBbMF19LCBbcjBdCitpbnQzMng0X3QgdmxkMXFfbGFuZV9zMzIoX190cmFuc2ZlcnNpemUoMSkgaW50MzJfdCBjb25zdCAqIHB0ciwgaW50MzJ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvL1ZMRDEuMzIge2QwWzBdfSwgW3IwXQorZmxvYXQxNng4X3QgdmxkMXFfbGFuZV9mMTYoX190cmFuc2ZlcnNpemUoMSkgX19mcDE2IGNvbnN0ICogcHRyLCBmbG9hdDE2eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy9WTEQxLjE2IHtkMFswXX0sIFtyMF0KK2Zsb2F0MzJ4NF90IHZsZDFxX2xhbmVfZjMyKF9fdHJhbnNmZXJzaXplKDEpIGZsb2F0MzJfdCBjb25zdCAqIHB0ciwgZmxvYXQzMng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDEuMzIge2QwWzBdfSwgW3IwXQoraW50NjR4Ml90IHZsZDFxX2xhbmVfczY0KF9fdHJhbnNmZXJzaXplKDEpIGludDY0X3QgY29uc3QgKiBwdHIsIGludDY0eDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy9WTEQxLjY0IHtkMH0sIFtyMF0KK3BvbHk4eDE2X3QgdmxkMXFfbGFuZV9wOChfX3RyYW5zZmVyc2l6ZSgxKSBwb2x5OF90IGNvbnN0ICogcHRyLCBwb2x5OHgxNl90IHZlYywgX19jb25zdHJhbmdlKDAsMTUpIGludCBsYW5lKTsgLy9WTEQxLjgge2QwWzBdfSwgW3IwXQorcG9seTE2eDhfdCB2bGQxcV9sYW5lX3AxNihfX3RyYW5zZmVyc2l6ZSgxKSBwb2x5MTZfdCBjb25zdCAqIHB0ciwgcG9seTE2eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxEMS4xNiB7ZDBbMF19LCBbcjBdCit1aW50OHg4X3QgdmxkMV9sYW5lX3U4KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ4X3QgY29uc3QgKiBwdHIsIHVpbnQ4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy9WTEQxLjgge2QwWzBdfSwgW3IwXQordWludDE2eDRfdCB2bGQxX2xhbmVfdTE2KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQxNl90IGNvbnN0ICogcHRyLCB1aW50MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvL1ZMRDEuMTYge2QwWzBdfSwgW3IwXQordWludDMyeDJfdCB2bGQxX2xhbmVfdTMyKF9fdHJhbnNmZXJzaXplKDEpIHVpbnQzMl90IGNvbnN0ICogcHRyLCB1aW50MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvL1ZMRDEuMzIge2QwWzBdfSwgW3IwXQordWludDY0eDFfdCB2bGQxX2xhbmVfdTY0KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ2NF90IGNvbnN0ICogcHRyLCB1aW50NjR4MV90IHZlYywgX19jb25zdHJhbmdlKDAsMCkgaW50IGxhbmUpOyAvL1ZMRDEuNjQge2QwfSwgW3IwXQoraW50OHg4X3QgdmxkMV9sYW5lX3M4KF9fdHJhbnNmZXJzaXplKDEpIGludDhfdCBjb25zdCAqIHB0ciwgaW50OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZMRDEuOHtkMFswXX0sIFtyMF0KK2ludDE2eDRfdCB2bGQxX2xhbmVfczE2KF9fdHJhbnNmZXJzaXplKDEpIGludDE2X3QgY29uc3QgKiBwdHIsIGludDE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy9WTEQxLjE2IHtkMFswXX0sIFtyMF0KK2ludDMyeDJfdCB2bGQxX2xhbmVfczMyKF9fdHJhbnNmZXJzaXplKDEpIGludDMyX3QgY29uc3QgKiBwdHIsIGludDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy9WTEQxLjMyIHtkMFswXX0sIFtyMF0KK2Zsb2F0MTZ4NF90IHZsZDFxX2xhbmVfZjE2KF9fdHJhbnNmZXJzaXplKDEpIF9fZnAxNiBjb25zdCAqIHB0ciwgZmxvYXQxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vVkxEMS4xNiB7ZDBbMF19LCBbcjBdCitmbG9hdDMyeDJfdCB2bGQxX2xhbmVfZjMyKF9fdHJhbnNmZXJzaXplKDEpIGZsb2F0MzJfdCBjb25zdCAqIHB0ciwgZmxvYXQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZMRDEuMzIge2QwWzBdfSwgW3IwXQoraW50NjR4MV90IHZsZDFfbGFuZV9zNjQoX190cmFuc2ZlcnNpemUoMSkgaW50NjRfdCBjb25zdCAqIHB0ciwgaW50NjR4MV90IHZlYywgX19jb25zdHJhbmdlKDAsMCkgaW50IGxhbmUpOyAvL1ZMRDEuNjQge2QwfSwgW3IwXQorcG9seTh4OF90IHZsZDFfbGFuZV9wOChfX3RyYW5zZmVyc2l6ZSgxKSBwb2x5OF90IGNvbnN0ICogcHRyLCBwb2x5OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vVkxEMS44IHtkMFswXX0sIFtyMF0KK3BvbHkxNng0X3QgdmxkMV9sYW5lX3AxNihfX3RyYW5zZmVyc2l6ZSgxKSBwb2x5MTZfdCBjb25zdCAqIHB0ciwgcG9seTE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy9WTEQxLjE2IHtkMFswXX0sIFtyMF0KKy8vTG9hZCBhbGwgbGFuZXMgb2YgdmVjdG9yIHdpdGggc2FtZSB2YWx1ZSBmcm9tIG1lbW9yeQordWludDh4MTZfdCB2bGQxcV9kdXBfdTgoX190cmFuc2ZlcnNpemUoMSkgdWludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuOCB7ZDBbXX0sIFtyMF0KK3VpbnQxNng4X3QgdmxkMXFfZHVwX3UxNihfX3RyYW5zZmVyc2l6ZSgxKSB1aW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwW119LCBbcjBdCit1aW50MzJ4NF90IHZsZDFxX2R1cF91MzIoX190cmFuc2ZlcnNpemUoMSkgdWludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjMyIHtkMFtdfSwgW3IwXQordWludDY0eDJfdCB2bGQxcV9kdXBfdTY0KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDB9LCBbcjBdCitpbnQ4eDE2X3QgdmxkMXFfZHVwX3M4KF9fdHJhbnNmZXJzaXplKDEpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuOCB7ZDBbXX0sIFtyMF0KK2ludDE2eDhfdCB2bGQxcV9kdXBfczE2KF9fdHJhbnNmZXJzaXplKDEpIGludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMFtdfSwgW3IwXQoraW50MzJ4NF90IHZsZDFxX2R1cF9zMzIoX190cmFuc2ZlcnNpemUoMSkgaW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMzIge2QwW119LCBbcjBdCitpbnQ2NHgyX3QgdmxkMXFfZHVwX3M2NChfX3RyYW5zZmVyc2l6ZSgxKSBpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDB9LCBbcjBdCitmbG9hdDE2eDhfdCB2bGQxcV9kdXBfZjE2KF9fdHJhbnNmZXJzaXplKDEpIF9fZnAxNiBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwW119LCBbcjBdCitmbG9hdDMyeDRfdCB2bGQxcV9kdXBfZjMyKF9fdHJhbnNmZXJzaXplKDEpIGZsb2F0MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMzIge2QwW119LCBbcjBdCitwb2x5OHgxNl90IHZsZDFxX2R1cF9wOChfX3RyYW5zZmVyc2l6ZSgxKSBwb2x5OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS44IHtkMFtdfSwgW3IwXQorcG9seTE2eDhfdCB2bGQxcV9kdXBfcDE2KF9fdHJhbnNmZXJzaXplKDEpIHBvbHkxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4xNiB7ZDBbXX0sIFtyMF0KK3VpbnQ4eDhfdCB2bGQxX2R1cF91OChfX3RyYW5zZmVyc2l6ZSgxKSB1aW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS44IHtkMFtdfSwgW3IwXQordWludDE2eDRfdCB2bGQxX2R1cF91MTYoX190cmFuc2ZlcnNpemUoMSkgdWludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMFtdfSwgW3IwXQordWludDMyeDJfdCB2bGQxX2R1cF91MzIoX190cmFuc2ZlcnNpemUoMSkgdWludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjMyIHtkMFtdfSwgW3IwXQordWludDY0eDFfdCB2bGQxX2R1cF91NjQoX190cmFuc2ZlcnNpemUoMSkgdWludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMH0sIFtyMF0KK2ludDh4OF90IHZsZDFfZHVwX3M4KF9fdHJhbnNmZXJzaXplKDEpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuOCB7ZDBbXX0sIFtyMF0KK2ludDE2eDRfdCB2bGQxX2R1cF9zMTYoX190cmFuc2ZlcnNpemUoMSkgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwW119LCBbcjBdCitpbnQzMngyX3QgdmxkMV9kdXBfczMyKF9fdHJhbnNmZXJzaXplKDEpIGludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjMyIHtkMFtdfSwgW3IwXQoraW50NjR4MV90IHZsZDFfZHVwX3M2NChfX3RyYW5zZmVyc2l6ZSgxKSBpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDB9LCBbcjBdCitmbG9hdDE2eDRfdCB2bGQxX2R1cF9mMTYoX190cmFuc2ZlcnNpemUoMSkgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4xNiB7ZDBbXX0sIFtyMF0KK2Zsb2F0MzJ4Ml90IHZsZDFfZHVwX2YzMihfX3RyYW5zZmVyc2l6ZSgxKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjMyIHtkMFtdfSwgW3IwXQorcG9seTh4OF90IHZsZDFfZHVwX3A4KF9fdHJhbnNmZXJzaXplKDEpIHBvbHk4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjgge2QwW119LCBbcjBdCitwb2x5MTZ4NF90IHZsZDFfZHVwX3AxNihfX3RyYW5zZmVyc2l6ZSgxKSBwb2x5MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwW119LCBbcjBdCisvL1N0b3JlIGEgc2luZ2xlIHZlY3RvciBvciBsYW5lLiBTdG9yZXMgYWxsIGxhbmVzIG9yIGEgc2luZ2xlIGxhbmUgb2YgYSB2ZWN0b3IuCisvL1N0b3JlIGEgc2luZ2xlIHZlY3RvciBpbnRvIG1lbW9yeQordm9pZCB2c3QxcV91OChfX3RyYW5zZmVyc2l6ZSgxNikgdWludDhfdCAqIHB0ciwgdWludDh4MTZfdCB2YWwpOyAvLyBWU1QxLjgge2QwLCBkMX0sIFtyMF0KK3ZvaWQgdnN0MXFfdTE2KF9fdHJhbnNmZXJzaXplKDgpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4OF90IHZhbCk7IC8vIFZTVDEuMTYge2QwLCBkMX0sIFtyMF0KK3ZvaWQgdnN0MXFfdTMyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4NF90IHZhbCk7IC8vIFZTVDEuMzIge2QwLCBkMX0sIFtyMF0KK3ZvaWQgdnN0MXFfdTY0KF9fdHJhbnNmZXJzaXplKDIpIHVpbnQ2NF90ICogcHRyLCB1aW50NjR4Ml90IHZhbCk7IC8vIFZTVDEuNjQge2QwLCBkMX0sIFtyMF0KK3ZvaWQgdnN0MXFfczgoX190cmFuc2ZlcnNpemUoMTYpIGludDhfdCAqIHB0ciwgaW50OHgxNl90IHZhbCk7IC8vIFZTVDEuOCB7ZDAsIGQxfSwgW3IwXQordm9pZCB2c3QxcV9zMTYoX190cmFuc2ZlcnNpemUoOCkgaW50MTZfdCAqIHB0ciwgaW50MTZ4OF90IHZhbCk7IC8vIFZTVDEuMTYge2QwLCBkMX0sIFtyMF0KK3ZvaWQgdnN0MXFfczMyKF9fdHJhbnNmZXJzaXplKDQpIGludDMyX3QgKiBwdHIsIGludDMyeDRfdCB2YWwpOyAvLyBWU1QxLjMyIHtkMCwgZDF9LCBbcjBdCit2b2lkIHZzdDFxX3M2NChfX3RyYW5zZmVyc2l6ZSgyKSBpbnQ2NF90ICogcHRyLCBpbnQ2NHgyX3QgdmFsKTsgLy8gVlNUMS42NCB7ZDAsIGQxfSwgW3IwXQordm9pZCB2c3QxcV9mMTYoX190cmFuc2ZlcnNpemUoOCkgX19mcDE2ICogcHRyLCBmbG9hdDE2eDhfdCB2YWwpOyAvLyBWU1QxLjE2IHtkMCwgZDF9LCBbcjBdCit2b2lkIHZzdDFxX2YzMihfX3RyYW5zZmVyc2l6ZSg0KSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4NF90IHZhbCk7IC8vIFZTVDEuMzIge2QwLCBkMX0sIFtyMF0KK3ZvaWQgdnN0MXFfcDgoX190cmFuc2ZlcnNpemUoMTYpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDE2X3QgdmFsKTsgLy8gVlNUMS44IHtkMCwgZDF9LCBbcjBdCit2b2lkIHZzdDFxX3AxNihfX3RyYW5zZmVyc2l6ZSg4KSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDhfdCB2YWwpOyAvLyBWU1QxLjE2IHtkMCwgZDF9LCBbcjBdCit2b2lkIHZzdDFfdTgoX190cmFuc2ZlcnNpemUoOCkgdWludDhfdCAqIHB0ciwgdWludDh4OF90IHZhbCk7IC8vIFZTVDEuOCB7ZDB9LCBbcjBdCit2b2lkIHZzdDFfdTE2KF9fdHJhbnNmZXJzaXplKDQpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4NF90IHZhbCk7IC8vIFZTVDEuMTYge2QwfSwgW3IwXQordm9pZCB2c3QxX3UzMihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDJfdCB2YWwpOyAvLyBWU1QxLjMyIHtkMH0sIFtyMF0KK3ZvaWQgdnN0MV91NjQoX190cmFuc2ZlcnNpemUoMSkgdWludDY0X3QgKiBwdHIsIHVpbnQ2NHgxX3QgdmFsKTsgLy8gVlNUMS42NCB7ZDB9LCBbcjBdCit2b2lkIHZzdDFfczgoX190cmFuc2ZlcnNpemUoOCkgaW50OF90ICogcHRyLCBpbnQ4eDhfdCB2YWwpOyAvLyBWU1QxLjgge2QwfSwgW3IwXQordm9pZCB2c3QxX3MxNihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQxNl90ICogcHRyLCBpbnQxNng0X3QgdmFsKTsgLy8gVlNUMS4xNiB7ZDB9LCBbcjBdCit2b2lkIHZzdDFfczMyKF9fdHJhbnNmZXJzaXplKDIpIGludDMyX3QgKiBwdHIsIGludDMyeDJfdCB2YWwpOyAvLyBWU1QxLjMyIHtkMH0sIFtyMF0KK3ZvaWQgdnN0MV9zNjQoX190cmFuc2ZlcnNpemUoMSkgaW50NjRfdCAqIHB0ciwgaW50NjR4MV90IHZhbCk7IC8vIFZTVDEuNjQge2QwfSwgW3IwXQordm9pZCB2c3QxX2YxNihfX3RyYW5zZmVyc2l6ZSg0KSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4NF90IHZhbCk7IC8vIFZTVDEuMTYge2QwfSwgW3IwXQordm9pZCB2c3QxX2YzMihfX3RyYW5zZmVyc2l6ZSgyKSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4Ml90IHZhbCk7IC8vIFZTVDEuMzIge2QwfSwgW3IwXQordm9pZCB2c3QxX3A4KF9fdHJhbnNmZXJzaXplKDgpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDhfdCB2YWwpOyAvLyBWU1QxLjgge2QwfSwgW3IwXQordm9pZCB2c3QxX3AxNihfX3RyYW5zZmVyc2l6ZSg0KSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDRfdCB2YWwpOyAvLyBWU1QxLjE2IHtkMH0sIFtyMF0KKy8vU3RvcmUgYSBsYW5lIG9mIGEgdmVjdG9yIGludG8gbWVtb3J5CisvL0xvYWRzIG9mIGFuIE4tZWxlbWVudCBzdHJ1Y3R1cmUKKy8vTG9hZCBOLWVsZW1lbnQgc3RydWN0dXJlIGZyb20gbWVtb3J5Cit1aW50OHgxNngyX3QgdmxkMnFfdTgoX190cmFuc2ZlcnNpemUoMzIpIHVpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjgge2QwLCBkMn0sIFtyMF0KK3VpbnQxNng4eDJfdCB2bGQycV91MTYoX190cmFuc2ZlcnNpemUoMTYpIHVpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4xNiB7ZDAsIGQyfSwgW3IwXQordWludDMyeDR4Ml90IHZsZDJxX3UzMihfX3RyYW5zZmVyc2l6ZSg4KSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMzIge2QwLCBkMn0sIFtyMF0KK2ludDh4MTZ4Ml90IHZsZDJxX3M4KF9fdHJhbnNmZXJzaXplKDMyKSBpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjgge2QwLCBkMn0sIFtyMF0KK2ludDE2eDh4Ml90IHZsZDJxX3MxNihfX3RyYW5zZmVyc2l6ZSgxNikgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMTYge2QwLCBkMn0sIFtyMF0KK2ludDMyeDR4Ml90IHZsZDJxX3MzMihfX3RyYW5zZmVyc2l6ZSg4KSBpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4zMiB7ZDAsIGQyfSwgW3IwXQorZmxvYXQxNng4eDJfdCB2bGQycV9mMTYoX190cmFuc2ZlcnNpemUoMTYpIF9fZnAxNiBjb25zdCAqIHB0cik7IC8vIFZMRDIuMTYge2QwLCBkMn0sIFtyMF0KK2Zsb2F0MzJ4NHgyX3QgdmxkMnFfZjMyKF9fdHJhbnNmZXJzaXplKDgpIGZsb2F0MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMzIge2QwLCBkMn0sIFtyMF0KK3BvbHk4eDE2eDJfdCB2bGQycV9wOChfX3RyYW5zZmVyc2l6ZSgzMikgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuOCB7ZDAsIGQyfSwgW3IwXQorcG9seTE2eDh4Ml90IHZsZDJxX3AxNihfX3RyYW5zZmVyc2l6ZSgxNikgcG9seTE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjE2IHtkMCwgZDJ9LCBbcjBdCit1aW50OHg4eDJfdCB2bGQyX3U4KF9fdHJhbnNmZXJzaXplKDE2KSB1aW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi44IHtkMCwgZDF9LCBbcjBdCit1aW50MTZ4NHgyX3QgdmxkMl91MTYoX190cmFuc2ZlcnNpemUoOCkgdWludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjE2IHtkMCwgZDF9LCBbcjBdCit1aW50MzJ4MngyX3QgdmxkMl91MzIoX190cmFuc2ZlcnNpemUoNCkgdWludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjMyIHtkMCwgZDF9LCBbcjBdCit1aW50NjR4MXgyX3QgdmxkMl91NjQoX190cmFuc2ZlcnNpemUoMikgdWludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMCwgZDF9LCBbcjBdCitpbnQ4eDh4Ml90IHZsZDJfczgoX190cmFuc2ZlcnNpemUoMTYpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuOCB7ZDAsIGQxfSwgW3IwXQoraW50MTZ4NHgyX3QgdmxkMl9zMTYoX190cmFuc2ZlcnNpemUoOCkgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMTYge2QwLCBkMX0sIFtyMF0KK2ludDMyeDJ4Ml90IHZsZDJfczMyKF9fdHJhbnNmZXJzaXplKDQpIGludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjMyIHtkMCwgZDF9LCBbcjBdCitpbnQ2NHgxeDJfdCB2bGQyX3M2NChfX3RyYW5zZmVyc2l6ZSgyKSBpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDAsIGQxfSwgW3IwXQorLy9mbG9hdDE2eDR4Ml90IHZsZDJfZjE2KF9fdHJhbnNmZXJzaXplKDgpIF9fZnAxNiBjb25zdCAqIHB0cik7IC8vIFZMRDIuMTYge2QwLCBkMX0sIFtyMF0KK2Zsb2F0MzJ4MngyX3QgdmxkMl9mMzIoX190cmFuc2ZlcnNpemUoNCkgZmxvYXQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4zMiB7ZDAsIGQxfSwgW3IwXQorcG9seTh4OHgyX3QgdmxkMl9wOChfX3RyYW5zZmVyc2l6ZSgxNikgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuOCB7ZDAsIGQxfSwgW3IwXQorcG9seTE2eDR4Ml90IHZsZDJfcDE2KF9fdHJhbnNmZXJzaXplKDgpIHBvbHkxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4xNiB7ZDAsIGQxfSwgW3IwXQordWludDh4MTZ4M190IHZsZDNxX3U4KF9fdHJhbnNmZXJzaXplKDQ4KSB1aW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy44IHtkMCwgZDIsIGQ0fSwgW3IwXQordWludDE2eDh4M190IHZsZDNxX3UxNihfX3RyYW5zZmVyc2l6ZSgyNCkgdWludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjE2IHtkMCwgZDIsIGQ0fSwgW3IwXQordWludDMyeDR4M190IHZsZDNxX3UzMihfX3RyYW5zZmVyc2l6ZSgxMikgdWludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjMyIHtkMCwgZDIsIGQ0fSwgW3IwXQoraW50OHgxNngzX3QgdmxkM3FfczgoX190cmFuc2ZlcnNpemUoNDgpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuOCB7ZDAsIGQyLCBkNH0sIFtyMF0KK2ludDE2eDh4M190IHZsZDNxX3MxNihfX3RyYW5zZmVyc2l6ZSgyNCkgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMTYge2QwLCBkMiwgZDR9LCBbcjBdCitpbnQzMng0eDNfdCB2bGQzcV9zMzIoX190cmFuc2ZlcnNpemUoMTIpIGludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjMyIHtkMCwgZDIsIGQ0fSwgW3IwXQorZmxvYXQxNng4eDNfdCB2bGQzcV9mMTYoX190cmFuc2ZlcnNpemUoMjQpIF9fZnAxNiBjb25zdCAqIHB0cik7IC8vIFZMRDMuMTYge2QwLCBkMiwgZDR9LCBbcjBdCitmbG9hdDMyeDR4M190IHZsZDNxX2YzMihfX3RyYW5zZmVyc2l6ZSgxMikgZmxvYXQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4zMiB7ZDAsIGQyLCBkNH0sIFtyMF0KK3BvbHk4eDE2eDNfdCB2bGQzcV9wOChfX3RyYW5zZmVyc2l6ZSg0OCkgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuOCB7ZDAsIGQyLCBkNH0sIFtyMF0KK3BvbHkxNng4eDNfdCB2bGQzcV9wMTYoX190cmFuc2ZlcnNpemUoMjQpIHBvbHkxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4xNiB7ZDAsIGQyLCBkNH0sIFtyMF0KK3VpbnQ4eDh4M190IHZsZDNfdTgoX190cmFuc2ZlcnNpemUoMjQpIHVpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjgge2QwLCBkMSwgZDJ9LCBbcjBdCit1aW50MTZ4NHgzX3QgdmxkM191MTYoX190cmFuc2ZlcnNpemUoMTIpIHVpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4xNiB7ZDAsIGQxLCBkMn0sIFtyMF0KK3VpbnQzMngyeDNfdCB2bGQzX3UzMihfX3RyYW5zZmVyc2l6ZSg2KSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMzIge2QwLCBkMSwgZDJ9LCBbcjBdCit1aW50NjR4MXgzX3QgdmxkM191NjQoX190cmFuc2ZlcnNpemUoMykgdWludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMCwgZDEsIGQyfSwgW3IwXQoraW50OHg4eDNfdCB2bGQzX3M4KF9fdHJhbnNmZXJzaXplKDI0KSBpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjgge2QwLCBkMSwgZDJ9LCBbcjBdCitpbnQxNng0eDNfdCB2bGQzX3MxNihfX3RyYW5zZmVyc2l6ZSgxMikgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMTYge2QwLCBkMSwgZDJ9LCBbcjBdCitpbnQzMngyeDNfdCB2bGQzX3MzMihfX3RyYW5zZmVyc2l6ZSg2KSBpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4zMiB7ZDAsIGQxLCBkMn0sIFtyMF0KK2ludDY0eDF4M190IHZsZDNfczY0KF9fdHJhbnNmZXJzaXplKDMpIGludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMCwgZDEsIGQyfSwgW3IwXQorZmxvYXQxNng0eDNfdCB2bGQzX2YxNihfX3RyYW5zZmVyc2l6ZSgxMikgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4xNiB7ZDAsIGQxLCBkMn0sIFtyMF0KK2Zsb2F0MzJ4MngzX3QgdmxkM19mMzIoX190cmFuc2ZlcnNpemUoNikgZmxvYXQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4zMiB7ZDAsIGQxLCBkMn0sIFtyMF0KK3BvbHk4eDh4M190IHZsZDNfcDgoX190cmFuc2ZlcnNpemUoMjQpIHBvbHk4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjgge2QwLCBkMSwgZDJ9LCBbcjBdCitwb2x5MTZ4NHgzX3QgdmxkM19wMTYoX190cmFuc2ZlcnNpemUoMTIpIHBvbHkxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4xNiB7ZDAsIGQxLCBkMn0sIFtyMF0KK3VpbnQ4eDE2eDRfdCB2bGQ0cV91OChfX3RyYW5zZmVyc2l6ZSg2NCkgdWludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuOCB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCit1aW50MTZ4OHg0X3QgdmxkNHFfdTE2KF9fdHJhbnNmZXJzaXplKDMyKSB1aW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMTYge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQordWludDMyeDR4NF90IHZsZDRxX3UzMihfX3RyYW5zZmVyc2l6ZSgxNikgdWludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjMyIHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK2ludDh4MTZ4NF90IHZsZDRxX3M4KF9fdHJhbnNmZXJzaXplKDY0KSBpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0Ljgge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQoraW50MTZ4OHg0X3QgdmxkNHFfczE2KF9fdHJhbnNmZXJzaXplKDMyKSBpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4xNiB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCitpbnQzMng0eDRfdCB2bGQ0cV9zMzIoX190cmFuc2ZlcnNpemUoMTYpIGludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjMyIHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK2Zsb2F0MTZ4OHg0X3QgdmxkNHFfZjE2KF9fdHJhbnNmZXJzaXplKDMyKSBfX2ZwMTYgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjE2IHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK2Zsb2F0MzJ4NHg0X3QgdmxkNHFfZjMyKF9fdHJhbnNmZXJzaXplKDE2KSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjMyIHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK3BvbHk4eDE2eDRfdCB2bGQ0cV9wOChfX3RyYW5zZmVyc2l6ZSg2NCkgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuOCB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCitwb2x5MTZ4OHg0X3QgdmxkNHFfcDE2KF9fdHJhbnNmZXJzaXplKDMyKSBwb2x5MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMTYge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQordWludDh4OHg0X3QgdmxkNF91OChfX3RyYW5zZmVyc2l6ZSgzMikgdWludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuOCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCit1aW50MTZ4NHg0X3QgdmxkNF91MTYoX190cmFuc2ZlcnNpemUoMTYpIHVpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4xNiB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCit1aW50MzJ4Mng0X3QgdmxkNF91MzIoX190cmFuc2ZlcnNpemUoOCkgdWludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjMyIHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK3VpbnQ2NHgxeDRfdCB2bGQ0X3U2NChfX3RyYW5zZmVyc2l6ZSg0KSB1aW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQoraW50OHg4eDRfdCB2bGQ0X3M4KF9fdHJhbnNmZXJzaXplKDMyKSBpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0Ljgge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQoraW50MTZ4NHg0X3QgdmxkNF9zMTYoX190cmFuc2ZlcnNpemUoMTYpIGludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjE2IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK2ludDMyeDJ4NF90IHZsZDRfczMyKF9fdHJhbnNmZXJzaXplKDgpIGludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjMyIHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK2ludDY0eDF4NF90IHZsZDRfczY0KF9fdHJhbnNmZXJzaXplKDQpIGludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK2Zsb2F0MTZ4NHg0X3QgdmxkNF9mMTYoX190cmFuc2ZlcnNpemUoMTYpIF9fZnAxNiBjb25zdCAqIHB0cik7IC8vIFZMRDQuMTYge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorZmxvYXQzMngyeDRfdCB2bGQ0X2YzMihfX3RyYW5zZmVyc2l6ZSg4KSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjMyIHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK3BvbHk4eDh4NF90IHZsZDRfcDgoX190cmFuc2ZlcnNpemUoMzIpIHBvbHk4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0Ljgge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorcG9seTE2eDR4NF90IHZsZDRfcDE2KF9fdHJhbnNmZXJzaXplKDE2KSBwb2x5MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMTYge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorLy9Mb2FkIGFsbCBsYW5lcyBvZiBOLWVsZW1lbnQgc3RydWN0dXJlIHdpdGggc2FtZSB2YWx1ZSBmcm9tIG1lbW9yeQordWludDh4OHgyX3QgdmxkMl9kdXBfdTgoX190cmFuc2ZlcnNpemUoMikgdWludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuOCB7ZDBbXSwgZDFbXX0sIFtyMF0KK3VpbnQxNng0eDJfdCB2bGQyX2R1cF91MTYoX190cmFuc2ZlcnNpemUoMikgdWludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjE2IHtkMFtdLCBkMVtdfSwgW3IwXQordWludDMyeDJ4Ml90IHZsZDJfZHVwX3UzMihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMzIge2QwW10sIGQxW119LCBbcjBdCit1aW50NjR4MXgyX3QgdmxkMl9kdXBfdTY0KF9fdHJhbnNmZXJzaXplKDIpIHVpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDAsIGQxfSwgW3IwXQoraW50OHg4eDJfdCB2bGQyX2R1cF9zOChfX3RyYW5zZmVyc2l6ZSgyKSBpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjgge2QwW10sIGQxW119LCBbcjBdCitpbnQxNng0eDJfdCB2bGQyX2R1cF9zMTYoX190cmFuc2ZlcnNpemUoMikgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMTYge2QwW10sIGQxW119LCBbcjBdCitpbnQzMngyeDJfdCB2bGQyX2R1cF9zMzIoX190cmFuc2ZlcnNpemUoMikgaW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMzIge2QwW10sIGQxW119LCBbcjBdCitpbnQ2NHgxeDJfdCB2bGQyX2R1cF9zNjQoX190cmFuc2ZlcnNpemUoMikgaW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwLCBkMX0sIFtyMF0KKy8vZmxvYXQxNng0eDJfdCB2bGQyX2R1cF9mMTYoX190cmFuc2ZlcnNpemUoMikgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4xNiB7ZDBbXSwgZDFbXX0sIFtyMF0KK2Zsb2F0MzJ4MngyX3QgdmxkMl9kdXBfZjMyKF9fdHJhbnNmZXJzaXplKDIpIGZsb2F0MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMzIge2QwW10sIGQxW119LCBbcjBdCitwb2x5OHg4eDJfdCB2bGQyX2R1cF9wOChfX3RyYW5zZmVyc2l6ZSgyKSBwb2x5OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi44IHtkMFtdLCBkMVtdfSwgW3IwXQorcG9seTE2eDR4Ml90IHZsZDJfZHVwX3AxNihfX3RyYW5zZmVyc2l6ZSgyKSBwb2x5MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMTYge2QwW10sIGQxW119LCBbcjBdCit1aW50OHg4eDNfdCB2bGQzX2R1cF91OChfX3RyYW5zZmVyc2l6ZSgzKSB1aW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy44IHtkMFtdLCBkMVtdLCBkMltdfSwgW3IwXQordWludDE2eDR4M190IHZsZDNfZHVwX3UxNihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMTYge2QwW10sIGQxW10sIGQyW119LCBbcjBdCit1aW50MzJ4MngzX3QgdmxkM19kdXBfdTMyKF9fdHJhbnNmZXJzaXplKDMpIHVpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4zMiB7ZDBbXSwgZDFbXSwgZDJbXX0sIFtyMF0KK3VpbnQ2NHgxeDNfdCB2bGQzX2R1cF91NjQoX190cmFuc2ZlcnNpemUoMykgdWludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMCwgZDEsIGQyfSwgW3IwXQoraW50OHg4eDNfdCB2bGQzX2R1cF9zOChfX3RyYW5zZmVyc2l6ZSgzKSBpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjgge2QwW10sIGQxW10sIGQyW119LCBbcjBdCitpbnQxNng0eDNfdCB2bGQzX2R1cF9zMTYoX190cmFuc2ZlcnNpemUoMykgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMTYge2QwW10sIGQxW10sIGQyW119LCBbcjBdCitpbnQzMngyeDNfdCB2bGQzX2R1cF9zMzIoX190cmFuc2ZlcnNpemUoMykgaW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMzIge2QwW10sIGQxW10sIGQyW119LCBbcjBdCitpbnQ2NHgxeDNfdCB2bGQzX2R1cF9zNjQoX190cmFuc2ZlcnNpemUoMykgaW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwLCBkMSwgZDJ9LCBbcjBdCitmbG9hdDE2eDR4M190IHZsZDNfZHVwX2YxNihfX3RyYW5zZmVyc2l6ZSgzKSBfX2ZwMTYgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjE2IHtkMFtdLCBkMVtdLCBkMltdfSwgW3IwXQorZmxvYXQzMngyeDNfdCB2bGQzX2R1cF9mMzIoX190cmFuc2ZlcnNpemUoMykgZmxvYXQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4zMiB7ZDBbXSwgZDFbXSwgZDJbXX0sIFtyMF0KK3BvbHk4eDh4M190IHZsZDNfZHVwX3A4KF9fdHJhbnNmZXJzaXplKDMpIHBvbHk4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjgge2QwW10sIGQxW10sIGQyW119LCBbcjBdCitwb2x5MTZ4NHgzX3QgdmxkM19kdXBfcDE2KF9fdHJhbnNmZXJzaXplKDMpIHBvbHkxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4xNiB7ZDBbXSwgZDFbXSwgZDJbXX0sIFtyMF0KK3VpbnQ4eDh4NF90IHZsZDRfZHVwX3U4KF9fdHJhbnNmZXJzaXplKDQpIHVpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0Ljgge2QwW10sIGQxW10sIGQyW10sIGQzW119LCBbcjBdCit1aW50MTZ4NHg0X3QgdmxkNF9kdXBfdTE2KF9fdHJhbnNmZXJzaXplKDQpIHVpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4xNiB7ZDBbXSwgZDFbXSwgZDJbXSwgZDNbXX0sIFtyMF0KK3VpbnQzMngyeDRfdCB2bGQ0X2R1cF91MzIoX190cmFuc2ZlcnNpemUoNCkgdWludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjMyIHtkMFtdLCBkMVtdLCBkMltdLCBkM1tdfSwgW3IwXQordWludDY0eDF4NF90IHZsZDRfZHVwX3U2NChfX3RyYW5zZmVyc2l6ZSg0KSB1aW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQoraW50OHg4eDRfdCB2bGQ0X2R1cF9zOChfX3RyYW5zZmVyc2l6ZSg0KSBpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0Ljgge2QwW10sIGQxW10sIGQyW10sIGQzW119LCBbcjBdCitpbnQxNng0eDRfdCB2bGQ0X2R1cF9zMTYoX190cmFuc2ZlcnNpemUoNCkgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMTYge2QwW10sIGQxW10sIGQyW10sIGQzW119LCBbcjBdCitpbnQzMngyeDRfdCB2bGQ0X2R1cF9zMzIoX190cmFuc2ZlcnNpemUoNCkgaW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMzIge2QwW10sIGQxW10sIGQyW10sIGQzW119LCBbcjBdCitpbnQ2NHgxeDRfdCB2bGQ0X2R1cF9zNjQoX190cmFuc2ZlcnNpemUoNCkgaW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorZmxvYXQxNng0eDRfdCB2bGQ0X2R1cF9mMTYoX190cmFuc2ZlcnNpemUoNCkgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxENC4xNiB7ZDBbXSwgZDFbXSwgZDJbXSwgZDNbXX0sIFtyMF0KK2Zsb2F0MzJ4Mng0X3QgdmxkNF9kdXBfZjMyKF9fdHJhbnNmZXJzaXplKDQpIGZsb2F0MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMzIge2QwW10sIGQxW10sIGQyW10sIGQzW119LCBbcjBdCitwb2x5OHg4eDRfdCB2bGQ0X2R1cF9wOChfX3RyYW5zZmVyc2l6ZSg0KSBwb2x5OF90IGNvbnN0ICogcHRyKTsgLy8gVkxENC44IHtkMFtdLCBkMVtdLCBkMltdLCBkM1tdfSwgW3IwXQorcG9seTE2eDR4NF90IHZsZDRfZHVwX3AxNihfX3RyYW5zZmVyc2l6ZSg0KSBwb2x5MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMTYge2QwW10sIGQxW10sIGQyW10sIGQzW119LCBbcjBdCisvL0xvYWQgYSBzaW5nbGUgbGFuZSBvZiBOLWVsZW1lbnQgc3RydWN0dXJlIGZyb20gbWVtb3J5CisvL3RoZSBmdW5jdGlvbnMgYmVsb3cgYXJlIG1vZGlmaWVkIHRvIGRlYWwgd2l0aCB0aGUgZXJyb3IgQzI3MTk6ICdzcmMnOiBmb3JtYWwgcGFyYW1ldGVyIHdpdGggX19kZWNsc3BlYyhhbGlnbignMTYnKSkgd29uJ3QgYmUgYWxpZ25lZAordWludDE2eDh4Ml90IHZsZDJxX2xhbmVfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50MTZfdCBjb25zdCAqIHB0ciwgdWludDE2eDh4Ml90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZMRDIuMTYge2QwWzBdLCBkMlswXX0sIFtyMF0KK3VpbnQzMng0eDJfdCB2bGQycV9sYW5lX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoMikgdWludDMyX3QgY29uc3QgKiBwdHIsIHVpbnQzMng0eDJfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTEQyLjMyIHtkMFswXSwgZDJbMF19LCBbcjBdCitpbnQxNng4eDJfdCB2bGQycV9sYW5lX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoMikgaW50MTZfdCBjb25zdCAqIHB0ciwgaW50MTZ4OHgyX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxEMi4xNiB7ZDBbMF0sIGQyWzBdfSwgW3IwXQoraW50MzJ4NHgyX3QgdmxkMnFfbGFuZV9zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDIpIGludDMyX3QgY29uc3QgKiBwdHIsIGludDMyeDR4Ml90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDIuMzIge2QwWzBdLCBkMlswXX0sIFtyMF0KK2Zsb2F0MTZ4OHgyX3QgdmxkMnFfbGFuZV9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIF9fZnAxNiBjb25zdCAqIHB0ciwgZmxvYXQxNng4eDJfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQyLjE2IHtkMFswXSwgZDJbMF19LCBbcjBdCitmbG9hdDMyeDR4Ml90IHZsZDJxX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIsIGZsb2F0MzJ4NHgyX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMi4zMiB7ZDBbMF0sIGQyWzBdfSwgW3IwXQorcG9seTE2eDh4Ml90IHZsZDJxX2xhbmVfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBwb2x5MTZfdCBjb25zdCAqIHB0ciwgcG9seTE2eDh4Ml90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZMRDIuMTYge2QwWzBdLCBkMlswXX0sIFtyMF0KK3VpbnQ4eDh4Ml90IHZsZDJfbGFuZV91OF9wdHIoX190cmFuc2ZlcnNpemUoMikgdWludDhfdCBjb25zdCAqIHB0ciwgdWludDh4OHgyX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy9WTEQyLjgge2QwWzBdLCBkMVswXX0sIFtyMF0KK3VpbnQxNng0eDJfdCB2bGQyX2xhbmVfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50MTZfdCBjb25zdCAqIHB0ciwgdWludDE2eDR4Ml90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDIuMTYge2QwWzBdLCBkMVswXX0sIFtyMF0KK3VpbnQzMngyeDJfdCB2bGQyX2xhbmVfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50MzJfdCBjb25zdCAqIHB0ciwgdWludDMyeDJ4Ml90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZMRDIuMzIge2QwWzBdLCBkMVswXX0sIFtyMF0KK2ludDh4OHgyX3QgdmxkMl9sYW5lX3M4X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQ4X3QgY29uc3QgKiBwdHIsIGludDh4OHgyX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy9WTEQyLjgge2QwWzBdLCBkMVswXX0sIFtyMF0KK2ludDE2eDR4Ml90IHZsZDJfbGFuZV9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIGludDE2X3QgY29uc3QgKiBwdHIsIGludDE2eDR4Ml90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vVkxEMi4xNiB7ZDBbMF0sIGQxWzBdfSwgW3IwXQoraW50MzJ4MngyX3QgdmxkMl9sYW5lX3MzMl9wdHIoX190cmFuc2ZlcnNpemUoMikgaW50MzJfdCBjb25zdCAqIHB0ciwgaW50MzJ4MngyX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy9WTEQyLjMyIHtkMFswXSwgZDFbMF19LCBbcjBdCisvL2Zsb2F0MTZ4NHgyX3QgdmxkMl9sYW5lX2YxNl9wdHIoX190cmFuc2ZlcnNpemUoMikgX19mcDE2IGNvbnN0ICogcHRyLCBmbG9hdDE2eDR4Ml90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDIuMTYge2QwWzBdLCBkMVswXX0sIFtyMF0KK2Zsb2F0MzJ4MngyX3QgdmxkMl9sYW5lX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoMikgZmxvYXQzMl90IGNvbnN0ICogcHRyLCBmbG9hdDMyeDJ4Ml90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZMRDIuMzIge2QwWzBdLCBkMVswXX0sIFtyMF0KK3BvbHk4eDh4Ml90IHZsZDJfbGFuZV9wOF9wdHIoX190cmFuc2ZlcnNpemUoMikgcG9seThfdCBjb25zdCAqIHB0ciwgcG9seTh4OHgyX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy9WTEQyLjgge2QwWzBdLCBkMVswXX0sIFtyMF0KK3BvbHkxNng0eDJfdCB2bGQyX2xhbmVfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBwb2x5MTZfdCBjb25zdCAqIHB0ciwgcG9seTE2eDR4Ml90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDIuMTYge2QwWzBdLCBkMVswXX0sIFtyMF0KK3VpbnQxNng4eDNfdCB2bGQzcV9sYW5lX3UxNl9wdHIoX190cmFuc2ZlcnNpemUoMykgdWludDE2X3QgY29uc3QgKiBwdHIsIHVpbnQxNng4eDNfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQzLjE2IHtkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQordWludDMyeDR4M190IHZsZDNxX2xhbmVfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MzJfdCBjb25zdCAqIHB0ciwgdWludDMyeDR4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDMuMzIge2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCitpbnQxNng4eDNfdCB2bGQzcV9sYW5lX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoMykgaW50MTZfdCBjb25zdCAqIHB0ciwgaW50MTZ4OHgzX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxEMy4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KK2ludDMyeDR4M190IHZsZDNxX2xhbmVfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQzMl90IGNvbnN0ICogcHRyLCBpbnQzMng0eDNfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTEQzLjMyIHtkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQorZmxvYXQxNng4eDNfdCB2bGQzcV9sYW5lX2YxNl9wdHIoX190cmFuc2ZlcnNpemUoMykgX19mcDE2IGNvbnN0ICogcHRyLCBmbG9hdDE2eDh4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZMRDMuMTYge2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCitmbG9hdDMyeDR4M190IHZsZDNxX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIsIGZsb2F0MzJ4NHgzX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMy4zMiB7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KK3BvbHkxNng4eDNfdCB2bGQzcV9sYW5lX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoMykgcG9seTE2X3QgY29uc3QgKiBwdHIsIHBvbHkxNng4eDNfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQzLjE2IHtkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQordWludDh4OHgzX3QgdmxkM19sYW5lX3U4X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50OF90IGNvbnN0ICogcHRyLCB1aW50OHg4eDNfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvL1ZMRDMuOCB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK3VpbnQxNng0eDNfdCB2bGQzX2xhbmVfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MTZfdCBjb25zdCAqIHB0ciwgdWludDE2eDR4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDMuMTYge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCit1aW50MzJ4MngzX3QgdmxkM19sYW5lX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoMykgdWludDMyX3QgY29uc3QgKiBwdHIsIHVpbnQzMngyeDNfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTEQzLjMyIHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQoraW50OHg4eDNfdCB2bGQzX2xhbmVfczhfcHRyKF9fdHJhbnNmZXJzaXplKDMpIGludDhfdCBjb25zdCAqIHB0ciwgaW50OHg4eDNfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvL1ZMRDMuOCB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK2ludDE2eDR4M190IHZsZDNfbGFuZV9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDMpIGludDE2X3QgY29uc3QgKiBwdHIsIGludDE2eDR4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vVkxEMy4xNiB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK2ludDMyeDJ4M190IHZsZDNfbGFuZV9zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDMpIGludDMyX3QgY29uc3QgKiBwdHIsIGludDMyeDJ4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vVkxEMy4zMiB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK2Zsb2F0MTZ4NHgzX3QgdmxkM19sYW5lX2YxNl9wdHIoX190cmFuc2ZlcnNpemUoMykgX19mcDE2IGNvbnN0ICogcHRyLCBmbG9hdDE2eDR4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDMuMTYge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCitmbG9hdDMyeDJ4M190IHZsZDNfbGFuZV9mMzJfcHRyKF9fdHJhbnNmZXJzaXplKDMpIGZsb2F0MzJfdCBjb25zdCAqIHB0ciwgZmxvYXQzMngyeDNfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTEQzLjMyIHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQorcG9seTh4OHgzX3QgdmxkM19sYW5lX3A4X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBwb2x5OF90IGNvbnN0ICogcHRyLCBwb2x5OHg4eDNfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvL1ZMRDMuOCB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK3BvbHkxNng0eDNfdCB2bGQzX2xhbmVfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBwb2x5MTZfdCBjb25zdCAqIHB0ciwgcG9seTE2eDR4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDMuMTYge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCit1aW50MTZ4OHg0X3QgdmxkNHFfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQxNl90IGNvbnN0ICogcHRyLCB1aW50MTZ4OHg0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxENC4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCit1aW50MzJ4NHg0X3QgdmxkNHFfbGFuZV91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQzMl90IGNvbnN0ICogcHRyLCB1aW50MzJ4NHg0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxENC4zMiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCitpbnQxNng4eDRfdCB2bGQ0cV9sYW5lX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoNCkgaW50MTZfdCBjb25zdCAqIHB0ciwgaW50MTZ4OHg0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxENC4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCitpbnQzMng0eDRfdCB2bGQ0cV9sYW5lX3MzMl9wdHIoX190cmFuc2ZlcnNpemUoNCkgaW50MzJfdCBjb25zdCAqIHB0ciwgaW50MzJ4NHg0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxENC4zMiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCitmbG9hdDE2eDh4NF90IHZsZDRxX2xhbmVfZjE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBfX2ZwMTYgY29uc3QgKiBwdHIsIGZsb2F0MTZ4OHg0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxENC4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCitmbG9hdDMyeDR4NF90IHZsZDRxX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBmbG9hdDMyX3QgY29uc3QgKiBwdHIsIGZsb2F0MzJ4NHg0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxENC4zMiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCitwb2x5MTZ4OHg0X3QgdmxkNHFfbGFuZV9wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHBvbHkxNl90IGNvbnN0ICogcHRyLCBwb2x5MTZ4OHg0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxENC4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCit1aW50OHg4eDRfdCB2bGQ0X2xhbmVfdThfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQ4X3QgY29uc3QgKiBwdHIsIHVpbnQ4eDh4NF90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vVkxENC44IHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK3VpbnQxNng0eDRfdCB2bGQ0X2xhbmVfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MTZfdCBjb25zdCAqIHB0ciwgdWludDE2eDR4NF90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDQuMTYge2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQordWludDMyeDJ4NF90IHZsZDRfbGFuZV91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQzMl90IGNvbnN0ICogcHRyLCB1aW50MzJ4Mng0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVkxENC4zMiB7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCitpbnQ4eDh4NF90IHZsZDRfbGFuZV9zOF9wdHIoX190cmFuc2ZlcnNpemUoNCkgaW50OF90IGNvbnN0ICogcHRyLCBpbnQ4eDh4NF90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vVkxENC44IHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK2ludDE2eDR4NF90IHZsZDRfbGFuZV9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIGludDE2X3QgY29uc3QgKiBwdHIsIGludDE2eDR4NF90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vVkxENC4xNiB7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCitpbnQzMngyeDRfdCB2bGQ0X2xhbmVfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQzMl90IGNvbnN0ICogcHRyLCBpbnQzMngyeDRfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvL1ZMRDQuMzIge2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQorZmxvYXQxNng0eDRfdCB2bGQ0X2xhbmVfZjE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBfX2ZwMTYgY29uc3QgKiBwdHIsIGZsb2F0MTZ4NHg0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxENC4xNiB7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCitmbG9hdDMyeDJ4NF90IHZsZDRfbGFuZV9mMzJfcHRyKF9fdHJhbnNmZXJzaXplKDQpIGZsb2F0MzJfdCBjb25zdCAqIHB0ciwgZmxvYXQzMngyeDRfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTEQ0LjMyIHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK3BvbHk4eDh4NF90IHZsZDRfbGFuZV9wOF9wdHIoX190cmFuc2ZlcnNpemUoNCkgcG9seThfdCBjb25zdCAqIHB0ciwgcG9seTh4OHg0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy9WTEQ0Ljgge2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQorcG9seTE2eDR4NF90IHZsZDRfbGFuZV9wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHBvbHkxNl90IGNvbnN0ICogcHRyLCBwb2x5MTZ4NHg0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxENC4xNiB7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCisvL1N0b3JlIE4tZWxlbWVudCBzdHJ1Y3R1cmUgdG8gbWVtb3J5Cit2b2lkIHZzdDJxX3U4X3B0cihfX3RyYW5zZmVyc2l6ZSgzMikgdWludDhfdCAqIHB0ciwgdWludDh4MTZ4Ml90ICogdmFsKTsgLy8gVlNUMi44IHtkMCwgZDJ9LCBbcjBdCit2b2lkIHZzdDJxX3UxNl9wdHIoX190cmFuc2ZlcnNpemUoMTYpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4OHgyX3QgKiB2YWwpOyAvLyBWU1QyLjE2IHtkMCwgZDJ9LCBbcjBdCit2b2lkIHZzdDJxX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoOCkgdWludDMyX3QgKiBwdHIsIHVpbnQzMng0eDJfdCAqIHZhbCk7IC8vIFZTVDIuMzIge2QwLCBkMn0sIFtyMF0KK3ZvaWQgdnN0MnFfczhfcHRyKF9fdHJhbnNmZXJzaXplKDMyKSBpbnQ4X3QgKiBwdHIsIGludDh4MTZ4Ml90ICogdmFsKTsgLy8gVlNUMi44IHtkMCwgZDJ9LCBbcjBdCit2b2lkIHZzdDJxX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoMTYpIGludDE2X3QgKiBwdHIsIGludDE2eDh4Ml90ICogdmFsKTsgLy8gVlNUMi4xNiB7ZDAsIGQyfSwgW3IwXQordm9pZCB2c3QycV9zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDgpIGludDMyX3QgKiBwdHIsIGludDMyeDR4Ml90ICogdmFsKTsgLy8gVlNUMi4zMiB7ZDAsIGQyfSwgW3IwXQordm9pZCB2c3QycV9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDE2KSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4OHgyX3QgKiB2YWwpOyAvLyBWU1QyLjE2IHtkMCwgZDJ9LCBbcjBdCit2b2lkIHZzdDJxX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoOCkgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDR4Ml90ICogdmFsKTsgLy8gVlNUMi4zMiB7ZDAsIGQyfSwgW3IwXQordm9pZCB2c3QycV9wOF9wdHIoX190cmFuc2ZlcnNpemUoMzIpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDE2eDJfdCAqIHZhbCk7IC8vIFZTVDIuOCB7ZDAsIGQyfSwgW3IwXQordm9pZCB2c3QycV9wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDE2KSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDh4Ml90ICogdmFsKTsgLy8gVlNUMi4xNiB7ZDAsIGQyfSwgW3IwXQordm9pZCB2c3QyX3U4X3B0cihfX3RyYW5zZmVyc2l6ZSgxNikgdWludDhfdCAqIHB0ciwgdWludDh4OHgyX3QgKiB2YWwpOyAvLyBWU1QyLjgge2QwLCBkMX0sIFtyMF0KK3ZvaWQgdnN0Ml91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDgpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4NHgyX3QgKiB2YWwpOyAvLyBWU1QyLjE2IHtkMCwgZDF9LCBbcjBdCit2b2lkIHZzdDJfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDJ4Ml90ICogdmFsKTsgLy8gVlNUMi4zMiB7ZDAsIGQxfSwgW3IwXQordm9pZCB2c3QyX3U2NF9wdHIoX190cmFuc2ZlcnNpemUoMikgdWludDY0X3QgKiBwdHIsIHVpbnQ2NHgxeDJfdCAqIHZhbCk7IC8vIFZTVDEuNjQge2QwLCBkMX0sIFtyMF0KK3ZvaWQgdnN0Ml9zOF9wdHIoX190cmFuc2ZlcnNpemUoMTYpIGludDhfdCAqIHB0ciwgaW50OHg4eDJfdCAqIHZhbCk7IC8vIFZTVDIuOCB7ZDAsIGQxfSwgW3IwXQordm9pZCB2c3QyX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoOCkgaW50MTZfdCAqIHB0ciwgaW50MTZ4NHgyX3QgKiB2YWwpOyAvLyBWU1QyLjE2IHtkMCwgZDF9LCBbcjBdCit2b2lkIHZzdDJfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQzMl90ICogcHRyLCBpbnQzMngyeDJfdCAqIHZhbCk7IC8vIFZTVDIuMzIge2QwLCBkMX0sIFtyMF0KK3ZvaWQgdnN0Ml9zNjRfcHRyKF9fdHJhbnNmZXJzaXplKDIpIGludDY0X3QgKiBwdHIsIGludDY0eDF4Ml90ICogdmFsKTsgLy8gVlNUMS42NCB7ZDAsIGQxfSwgW3IwXQorLy92b2lkIHZzdDJfZjE2X3B0cihfX3RyYW5zZmVyc2l6ZSg4KSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4NHgyX3QgKiB2YWwpOyAvLyBWU1QyLjE2IHtkMCwgZDF9LCBbcjBdCit2b2lkIHZzdDJfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4MngyX3QgKiB2YWwpOyAvLyBWU1QyLjMyIHtkMCwgZDF9LCBbcjBdCit2b2lkIHZzdDJfcDhfcHRyKF9fdHJhbnNmZXJzaXplKDE2KSBwb2x5OF90ICogcHRyLCBwb2x5OHg4eDJfdCAqIHZhbCk7IC8vIFZTVDIuOCB7ZDAsIGQxfSwgW3IwXQordm9pZCB2c3QyX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoOCkgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng0eDJfdCAqIHZhbCk7IC8vIFZTVDIuMTYge2QwLCBkMX0sIFtyMF0KK3ZvaWQgdnN0M3FfdThfcHRyKF9fdHJhbnNmZXJzaXplKDQ4KSB1aW50OF90ICogcHRyLCB1aW50OHgxNngzX3QgKiB2YWwpOyAvLyBWU1QzLjgge2QwLCBkMiwgZDR9LCBbcjBdCit2b2lkIHZzdDNxX3UxNl9wdHIoX190cmFuc2ZlcnNpemUoMjQpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4OHgzX3QgKiB2YWwpOyAvLyBWU1QzLjE2IHtkMCwgZDIsIGQ0fSwgW3IwXQordm9pZCB2c3QzcV91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDEyKSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDR4M190ICogdmFsKTsgLy8gVlNUMy4zMiB7ZDAsIGQyLCBkNH0sIFtyMF0KK3ZvaWQgdnN0M3FfczhfcHRyKF9fdHJhbnNmZXJzaXplKDQ4KSBpbnQ4X3QgKiBwdHIsIGludDh4MTZ4M190ICogdmFsKTsgLy8gVlNUMy44IHtkMCwgZDIsIGQ0fSwgW3IwXQordm9pZCB2c3QzcV9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDI0KSBpbnQxNl90ICogcHRyLCBpbnQxNng4eDNfdCAqIHZhbCk7IC8vIFZTVDMuMTYge2QwLCBkMiwgZDR9LCBbcjBdCit2b2lkIHZzdDNxX3MzMl9wdHIoX190cmFuc2ZlcnNpemUoMTIpIGludDMyX3QgKiBwdHIsIGludDMyeDR4M190ICogdmFsKTsgLy8gVlNUMy4zMiB7ZDAsIGQyLCBkNH0sIFtyMF0KK3ZvaWQgdnN0M3FfZjE2X3B0cihfX3RyYW5zZmVyc2l6ZSgyNCkgX19mcDE2ICogcHRyLCBmbG9hdDE2eDh4M190ICogdmFsKTsgLy8gVlNUMy4xNiB7ZDAsIGQyLCBkNH0sIFtyMF0KK3ZvaWQgdnN0M3FfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgxMikgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDR4M190ICogdmFsKTsgLy8gVlNUMy4zMiB7ZDAsIGQyLCBkNH0sIFtyMF0KK3ZvaWQgdnN0M3FfcDhfcHRyKF9fdHJhbnNmZXJzaXplKDQ4KSBwb2x5OF90ICogcHRyLCBwb2x5OHgxNngzX3QgKiB2YWwpOyAvLyBWU1QzLjgge2QwLCBkMiwgZDR9LCBbcjBdCit2b2lkIHZzdDNxX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoMjQpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4OHgzX3QgKiB2YWwpOyAvLyBWU1QzLjE2IHtkMCwgZDIsIGQ0fSwgW3IwXQordm9pZCB2c3QzX3U4X3B0cihfX3RyYW5zZmVyc2l6ZSgyNCkgdWludDhfdCAqIHB0ciwgdWludDh4OHgzX3QgKiB2YWwpOyAvLyBWU1QzLjgge2QwLCBkMSwgZDJ9LCBbcjBdCit2b2lkIHZzdDNfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSgxMikgdWludDE2X3QgKiBwdHIsIHVpbnQxNng0eDNfdCAqIHZhbCk7IC8vIFZTVDMuMTYge2QwLCBkMSwgZDJ9LCBbcjBdCit2b2lkIHZzdDNfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSg2KSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDJ4M190ICogdmFsKTsgLy8gVlNUMy4zMiB7ZDAsIGQxLCBkMn0sIFtyMF0KK3ZvaWQgdnN0M191NjRfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHVpbnQ2NF90ICogcHRyLCB1aW50NjR4MXgzX3QgKiB2YWwpOyAvLyBWU1QxLjY0IHtkMCwgZDEsIGQyfSwgW3IwXQordm9pZCB2c3QzX3M4X3B0cihfX3RyYW5zZmVyc2l6ZSgyNCkgaW50OF90ICogcHRyLCBpbnQ4eDh4M190ICogdmFsKTsgLy8gVlNUMy44IHtkMCwgZDEsIGQyfSwgW3IwXQordm9pZCB2c3QzX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoMTIpIGludDE2X3QgKiBwdHIsIGludDE2eDR4M190ICogdmFsKTsgLy8gVlNUMy4xNiB7ZDAsIGQxLCBkMn0sIFtyMF0KK3ZvaWQgdnN0M19zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDYpIGludDMyX3QgKiBwdHIsIGludDMyeDJ4M190ICogdmFsKTsgLy8gVlNUMy4zMiB7ZDAsIGQxLCBkMn0sIFtyMF0KK3ZvaWQgdnN0M19zNjRfcHRyKF9fdHJhbnNmZXJzaXplKDMpIGludDY0X3QgKiBwdHIsIGludDY0eDF4M190ICogdmFsKTsgLy8gVlNUMS42NCB7ZDAsIGQxLCBkMn0sIFtyMF0KK3ZvaWQgdnN0M19mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDEyKSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4NHgzX3QgKiB2YWwpOyAvLyBWU1QzLjE2IHtkMCwgZDEsIGQyfSwgW3IwXQordm9pZCB2c3QzX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoNikgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDJ4M190ICogdmFsKTsgLy8gVlNUMy4zMiB7ZDAsIGQxLCBkMn0sIFtyMF0KK3ZvaWQgdnN0M19wOF9wdHIoX190cmFuc2ZlcnNpemUoMjQpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDh4M190ICogdmFsKTsgLy8gVlNUMy44IHtkMCwgZDEsIGQyfSwgW3IwXQordm9pZCB2c3QzX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoMTIpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4NHgzX3QgKiB2YWwpOyAvLyBWU1QzLjE2IHtkMCwgZDEsIGQyfSwgW3IwXQordm9pZCB2c3Q0cV91OF9wdHIoX190cmFuc2ZlcnNpemUoNjQpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDE2eDRfdCAqIHZhbCk7IC8vIFZTVDQuOCB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCit2b2lkIHZzdDRxX3UxNl9wdHIoX190cmFuc2ZlcnNpemUoMzIpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4OHg0X3QgKiB2YWwpOyAvLyBWU1Q0LjE2IHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK3ZvaWQgdnN0NHFfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSgxNikgdWludDMyX3QgKiBwdHIsIHVpbnQzMng0eDRfdCAqIHZhbCk7IC8vIFZTVDQuMzIge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQordm9pZCB2c3Q0cV9zOF9wdHIoX190cmFuc2ZlcnNpemUoNjQpIGludDhfdCAqIHB0ciwgaW50OHgxNng0X3QgKiB2YWwpOyAvLyBWU1Q0Ljgge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQordm9pZCB2c3Q0cV9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDMyKSBpbnQxNl90ICogcHRyLCBpbnQxNng4eDRfdCAqIHZhbCk7IC8vIFZTVDQuMTYge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQordm9pZCB2c3Q0cV9zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDE2KSBpbnQzMl90ICogcHRyLCBpbnQzMng0eDRfdCAqIHZhbCk7IC8vIFZTVDQuMzIge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQordm9pZCB2c3Q0cV9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDMyKSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4OHg0X3QgKiB2YWwpOyAvLyBWU1Q0LjE2IHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK3ZvaWQgdnN0NHFfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgxNikgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDR4NF90ICogdmFsKTsgLy8gVlNUNC4zMiB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCit2b2lkIHZzdDRxX3A4X3B0cihfX3RyYW5zZmVyc2l6ZSg2NCkgcG9seThfdCAqIHB0ciwgcG9seTh4MTZ4NF90ICogdmFsKTsgLy8gVlNUNC44IHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK3ZvaWQgdnN0NHFfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzMikgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng4eDRfdCAqIHZhbCk7IC8vIFZTVDQuMTYge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQordm9pZCB2c3Q0X3U4X3B0cihfX3RyYW5zZmVyc2l6ZSgzMikgdWludDhfdCAqIHB0ciwgdWludDh4OHg0X3QgKiB2YWwpOyAvLyBWU1Q0Ljgge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQordm9pZCB2c3Q0X3UxNl9wdHIoX190cmFuc2ZlcnNpemUoMTYpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4NHg0X3QgKiB2YWwpOyAvLyBWU1Q0LjE2IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK3ZvaWQgdnN0NF91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDgpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4Mng0X3QgKiB2YWwpOyAvLyBWU1Q0LjMyIHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK3ZvaWQgdnN0NF91NjRfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQ2NF90ICogcHRyLCB1aW50NjR4MXg0X3QgKiB2YWwpOyAvLyBWU1QxLjY0IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK3ZvaWQgdnN0NF9zOF9wdHIoX190cmFuc2ZlcnNpemUoMzIpIGludDhfdCAqIHB0ciwgaW50OHg4eDRfdCAqIHZhbCk7IC8vIFZTVDQuOCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCit2b2lkIHZzdDRfczE2X3B0cihfX3RyYW5zZmVyc2l6ZSgxNikgaW50MTZfdCAqIHB0ciwgaW50MTZ4NHg0X3QgKiB2YWwpOyAvLyBWU1Q0LjE2IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK3ZvaWQgdnN0NF9zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDgpIGludDMyX3QgKiBwdHIsIGludDMyeDJ4NF90ICogdmFsKTsgLy8gVlNUNC4zMiB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCit2b2lkIHZzdDRfczY0X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQ2NF90ICogcHRyLCBpbnQ2NHgxeDRfdCAqIHZhbCk7IC8vIFZTVDEuNjQge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQordm9pZCB2c3Q0X2YxNl9wdHIoX190cmFuc2ZlcnNpemUoMTYpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng0eDRfdCAqIHZhbCk7IC8vIFZTVDQuMTYge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQordm9pZCB2c3Q0X2YzMl9wdHIoX190cmFuc2ZlcnNpemUoOCkgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDJ4NF90ICogdmFsKTsgLy8gVlNUNC4zMiB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCit2b2lkIHZzdDRfcDhfcHRyKF9fdHJhbnNmZXJzaXplKDMyKSBwb2x5OF90ICogcHRyLCBwb2x5OHg4eDRfdCAqIHZhbCk7IC8vIFZTVDQuOCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCit2b2lkIHZzdDRfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSgxNikgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng0eDRfdCAqIHZhbCk7IC8vIFZTVDQuMTYge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorLy9TdG9yZSBhIHNpbmdsZSBsYW5lIG9mIE4tZWxlbWVudCBzdHJ1Y3R1cmUgdG8gbWVtb3J5Cit2b2lkIHZzdDJxX2xhbmVfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDh4Ml90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZTVDIuMTZ7ZDBbMF0sIGQyWzBdfSwgW3IwXQordm9pZCB2c3QycV9sYW5lX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoMikgdWludDMyX3QgKiBwdHIsIHVpbnQzMng0eDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWU1QyLjMye2QwWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0MnFfbGFuZV9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIGludDE2X3QgKiBwdHIsIGludDE2eDh4Ml90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZTVDIuMTZ7ZDBbMF0sIGQyWzBdfSwgW3IwXQordm9pZCB2c3QycV9sYW5lX3MzMl9wdHIoX190cmFuc2ZlcnNpemUoMikgaW50MzJfdCAqIHB0ciwgaW50MzJ4NHgyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVlNUMi4zMntkMFswXSwgZDJbMF19LCBbcjBdCit2b2lkIHZzdDJxX2xhbmVfZjE2X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4OHgyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUMi4xNntkMFswXSwgZDJbMF19LCBbcjBdCit2b2lkIHZzdDJxX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4NHgyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy9WU1QyLjMyIHtkMFswXSwgZDJbMF19LCBbcjBdCit2b2lkIHZzdDJxX2xhbmVfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDh4Ml90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZTVDIuMTZ7ZDBbMF0sIGQyWzBdfSwgW3IwXQordm9pZCB2c3QyX2xhbmVfdThfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDh4Ml90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZTVDIuOHtkMFswXSwgZDFbMF19LCBbcjBdCit2b2lkIHZzdDJfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4NHgyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVlNUMi4xNntkMFswXSwgZDFbMF19LCBbcjBdCit2b2lkIHZzdDJfbGFuZV91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4MngyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVlNUMi4zMntkMFswXSwgZDFbMF19LCBbcjBdCit2b2lkIHZzdDJfbGFuZV9zOF9wdHIoX190cmFuc2ZlcnNpemUoMikgaW50OF90ICogcHRyLCBpbnQ4eDh4Ml90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZTVDIuOCB7ZDBbMF0sZDFbMF19LCBbcjBdCit2b2lkIHZzdDJfbGFuZV9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIGludDE2X3QgKiBwdHIsIGludDE2eDR4Ml90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDIuMTZ7ZDBbMF0sIGQxWzBdfSwgW3IwXQordm9pZCB2c3QyX2xhbmVfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQzMl90ICogcHRyLCBpbnQzMngyeDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWU1QyLjMye2QwWzBdLCBkMVswXX0sIFtyMF0KK3ZvaWQgdnN0Ml9sYW5lX2YxNl9wdHIoX190cmFuc2ZlcnNpemUoMikgX19mcDE2ICogcHRyLCBmbG9hdDE2eDR4Ml90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDIuMTZ7ZDBbMF0sIGQxWzBdfSwgW3IwXQordm9pZCB2c3QyX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4MngyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVlNUMi4zMntkMFswXSwgZDFbMF19LCBbcjBdCit2b2lkIHZzdDJfbGFuZV9wOF9wdHIoX190cmFuc2ZlcnNpemUoMikgcG9seThfdCAqIHB0ciwgcG9seTh4OHgyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUMi44e2QwWzBdLCBkMVswXX0sIFtyMF0KK3ZvaWQgdnN0Ml9sYW5lX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoMikgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng0eDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWU1QyLjE2e2QwWzBdLCBkMVswXX0sIFtyMF0KK3ZvaWQgdnN0M3FfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4OHgzX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUMy4xNntkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQordm9pZCB2c3QzcV9sYW5lX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoMykgdWludDMyX3QgKiBwdHIsIHVpbnQzMng0eDNfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWU1QzLjMye2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCit2b2lkIHZzdDNxX2xhbmVfczE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQxNl90ICogcHRyLCBpbnQxNng4eDNfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWU1QzLjE2e2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCit2b2lkIHZzdDNxX2xhbmVfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQzMl90ICogcHRyLCBpbnQzMng0eDNfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWU1QzLjMye2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCit2b2lkIHZzdDNxX2xhbmVfZjE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4OHgzX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUMy4xNntkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQordm9pZCB2c3QzcV9sYW5lX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoMykgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDR4M190ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vVlNUMy4zMiB7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KK3ZvaWQgdnN0M3FfbGFuZV9wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4OHgzX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUMy4xNntkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQordm9pZCB2c3QzX2xhbmVfdThfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDh4M190ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZTVDMuOHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQordm9pZCB2c3QzX2xhbmVfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDR4M190ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDMuMTZ7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0M19sYW5lX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoMykgdWludDMyX3QgKiBwdHIsIHVpbnQzMngyeDNfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWU1QzLjMye2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCit2b2lkIHZzdDNfbGFuZV9zOF9wdHIoX190cmFuc2ZlcnNpemUoMykgaW50OF90ICogcHRyLCBpbnQ4eDh4M190ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZTVDMuOCB7ZDBbMF0sZDFbMF0sIGQyWzBdfSwgW3IwXQordm9pZCB2c3QzX2xhbmVfczE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQxNl90ICogcHRyLCBpbnQxNng0eDNfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWU1QzLjE2e2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCit2b2lkIHZzdDNfbGFuZV9zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDMpIGludDMyX3QgKiBwdHIsIGludDMyeDJ4M190ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZTVDMuMzJ7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0M19sYW5lX2YxNl9wdHIoX190cmFuc2ZlcnNpemUoMykgX19mcDE2ICogcHRyLCBmbG9hdDE2eDR4M190ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDMuMTZ7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0M19sYW5lX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoMykgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDJ4M190ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZTVDMuMzJ7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0M19sYW5lX3A4X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBwb2x5OF90ICogcHRyLCBwb2x5OHg4eDNfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWU1QzLjh7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0M19sYW5lX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoMykgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng0eDNfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWU1QzLjE2e2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCit2b2lkIHZzdDRxX2xhbmVfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDh4NF90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZTVDQuMTZ7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCit2b2lkIHZzdDRxX2xhbmVfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDR4NF90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDQuMzJ7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCit2b2lkIHZzdDRxX2xhbmVfczE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQxNl90ICogcHRyLCBpbnQxNng4eDRfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWU1Q0LjE2e2QwWzBdLCBkMlswXSwgZDRbMF0sIGQ2WzBdfSwgW3IwXQordm9pZCB2c3Q0cV9sYW5lX3MzMl9wdHIoX190cmFuc2ZlcnNpemUoNCkgaW50MzJfdCAqIHB0ciwgaW50MzJ4NHg0X3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVlNUNC4zMntkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK3ZvaWQgdnN0NHFfbGFuZV9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng4eDRfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWU1Q0LjE2e2QwWzBdLCBkMlswXSwgZDRbMF0sIGQ2WzBdfSwgW3IwXQordm9pZCB2c3Q0cV9sYW5lX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoNCkgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDR4NF90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vVlNUNC4zMiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCit2b2lkIHZzdDRxX2xhbmVfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDh4NF90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZTVDQuMTZ7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCit2b2lkIHZzdDRfbGFuZV91OF9wdHIoX190cmFuc2ZlcnNpemUoNCkgdWludDhfdCAqIHB0ciwgdWludDh4OHg0X3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUNC44e2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQordm9pZCB2c3Q0X2xhbmVfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDR4NF90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDQuMTZ7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCit2b2lkIHZzdDRfbGFuZV91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4Mng0X3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVlNUNC4zMntkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK3ZvaWQgdnN0NF9sYW5lX3M4X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQ4X3QgKiBwdHIsIGludDh4OHg0X3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUNC44IHtkMFswXSxkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQordm9pZCB2c3Q0X2xhbmVfczE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQxNl90ICogcHRyLCBpbnQxNng0eDRfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWU1Q0LjE2e2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQordm9pZCB2c3Q0X2xhbmVfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQzMl90ICogcHRyLCBpbnQzMngyeDRfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWU1Q0LjMye2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQordm9pZCB2c3Q0X2xhbmVfZjE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4NHg0X3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVlNUNC4xNntkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK3ZvaWQgdnN0NF9sYW5lX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoNCkgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDJ4NF90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZTVDQuMzJ7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCit2b2lkIHZzdDRfbGFuZV9wOF9wdHIoX190cmFuc2ZlcnNpemUoNCkgcG9seThfdCAqIHB0ciwgcG9seTh4OHg0X3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUNC44e2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQordm9pZCB2c3Q0X2xhbmVfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDR4NF90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDQuMTZ7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCisvL0V4dHJhY3QgbGFuZXMgZnJvbSBhIHZlY3RvciBhbmQgcHV0IGludG8gYSByZWdpc3Rlci4gVGhlc2UgaW50cmluc2ljcyBleHRyYWN0IGEgc2luZ2xlIGxhbmUgKGVsZW1lbnQpIGZyb20gYSB2ZWN0b3IuCit1aW50OF90IHZnZXRfbGFuZV91OCh1aW50OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZNT1YuVTggcjAsIGQwWzBdCit1aW50MTZfdCB2Z2V0X2xhbmVfdTE2KHVpbnQxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZNT1YuVTE2IHIwLCBkMFswXQordWludDMyX3QgdmdldF9sYW5lX3UzMih1aW50MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTU9WLjMyIHIwLCBkMFswXQoraW50OF90IHZnZXRfbGFuZV9zOChpbnQ4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVk1PVi5TOCByMCwgZDBbMF0KK2ludDE2X3QgdmdldF9sYW5lX3MxNihpbnQxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZNT1YuUzE2IHIwLCBkMFswXQoraW50MzJfdCB2Z2V0X2xhbmVfczMyKGludDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVk1PVi4zMiByMCwgZDBbMF0KK3BvbHk4X3QgdmdldF9sYW5lX3A4KHBvbHk4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVk1PVi5VOCByMCwgZDBbMF0KK3BvbHkxNl90IHZnZXRfbGFuZV9wMTYocG9seTE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVk1PVi5VMTYgcjAsIGQwWzBdCitmbG9hdDMyX3QgdmdldF9sYW5lX2YzMihmbG9hdDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVk1PVi4zMiByMCwgZDBbMF0KK3VpbnQ4X3QgdmdldHFfbGFuZV91OCh1aW50OHgxNl90IHZlYywgX19jb25zdHJhbmdlKDAsMTUpIGludCBsYW5lKTsgLy8gVk1PVi5VOCByMCwgZDBbMF0KK3VpbnQxNl90IHZnZXRxX2xhbmVfdTE2KHVpbnQxNng4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZNT1YuVTE2IHIwLCBkMFswXQordWludDMyX3QgdmdldHFfbGFuZV91MzIodWludDMyeDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVk1PVi4zMiByMCwgZDBbMF0KK2ludDhfdCB2Z2V0cV9sYW5lX3M4KGludDh4MTZfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgbGFuZSk7IC8vIFZNT1YuUzggcjAsIGQwWzBdCitpbnQxNl90IHZnZXRxX2xhbmVfczE2KGludDE2eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVk1PVi5TMTYgcjAsIGQwWzBdCitpbnQzMl90IHZnZXRxX2xhbmVfczMyKGludDMyeDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVk1PVi4zMiByMCwgZDBbMF0KK3BvbHk4X3QgdmdldHFfbGFuZV9wOChwb2x5OHgxNl90IHZlYywgX19jb25zdHJhbmdlKDAsMTUpIGludCBsYW5lKTsgLy8gVk1PVi5VOCByMCwgZDBbMF0KK3BvbHkxNl90IHZnZXRxX2xhbmVfcDE2KHBvbHkxNng4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZNT1YuVTE2IHIwLCBkMFswXQorZmxvYXQzMl90IHZnZXRxX2xhbmVfZjMyKGZsb2F0MzJ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTU9WLjMyIHIwLCBkMFswXQoraW50NjRfdCB2Z2V0X2xhbmVfczY0KGludDY0eDFfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDApIGludCBsYW5lKTsgLy8gVk1PViByMCxyMCxkMAordWludDY0X3QgdmdldF9sYW5lX3U2NCh1aW50NjR4MV90IHZlYywgX19jb25zdHJhbmdlKDAsMCkgaW50IGxhbmUpOyAvLyBWTU9WIHIwLHIwLGQwCitpbnQ2NF90IHZnZXRxX2xhbmVfczY0KGludDY0eDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVk1PViByMCxyMCxkMAordWludDY0X3QgdmdldHFfbGFuZV91NjQodWludDY0eDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVk1PViByMCxyMCxkMAorLy9Mb2FkIGEgc2luZ2xlIGxhbmUgb2YgYSB2ZWN0b3IgZnJvbSBhIGxpdGVyYWwuIFRoZXNlIGludHJpbnNpY3Mgc2V0IGEgc2luZ2xlIGxhbmUgKGVsZW1lbnQpIHdpdGhpbiBhIHZlY3Rvci4KK3VpbnQ4eDhfdCB2c2V0X2xhbmVfdTgodWludDhfdCB2YWx1ZSwgdWludDh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTU9WLjggZDBbMF0scjAKK3VpbnQxNng0X3QgdnNldF9sYW5lX3UxNih1aW50MTZfdCB2YWx1ZSwgdWludDE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVk1PVi4xNiBkMFswXSxyMAordWludDMyeDJfdCB2c2V0X2xhbmVfdTMyKHVpbnQzMl90IHZhbHVlLCB1aW50MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTU9WLjMyIGQwWzBdLHIwCitpbnQ4eDhfdCB2c2V0X2xhbmVfczgoaW50OF90IHZhbHVlLCBpbnQ4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVk1PVi44IGQwWzBdLHIwCitpbnQxNng0X3QgdnNldF9sYW5lX3MxNihpbnQxNl90IHZhbHVlLCBpbnQxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZNT1YuMTYgZDBbMF0scjAKK2ludDMyeDJfdCB2c2V0X2xhbmVfczMyKGludDMyX3QgdmFsdWUsIGludDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVk1PVi4zMiBkMFswXSxyMAorcG9seTh4OF90IHZzZXRfbGFuZV9wOChwb2x5OF90IHZhbHVlLCBwb2x5OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZNT1YuOCBkMFswXSxyMAorcG9seTE2eDRfdCB2c2V0X2xhbmVfcDE2KHBvbHkxNl90IHZhbHVlLCBwb2x5MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTU9WLjE2IGQwWzBdLHIwCitmbG9hdDMyeDJfdCB2c2V0X2xhbmVfZjMyKGZsb2F0MzJfdCB2YWx1ZSwgZmxvYXQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZNT1YuMzIgZDBbMF0scjAKK3VpbnQ4eDE2X3QgdnNldHFfbGFuZV91OCh1aW50OF90IHZhbHVlLCB1aW50OHgxNl90IHZlYywgX19jb25zdHJhbmdlKDAsMTUpIGludCBsYW5lKTsgLy8gVk1PVi44IGQwWzBdLHIwCit1aW50MTZ4OF90IHZzZXRxX2xhbmVfdTE2KHVpbnQxNl90IHZhbHVlLCB1aW50MTZ4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTU9WLjE2IGQwWzBdLHIwCit1aW50MzJ4NF90IHZzZXRxX2xhbmVfdTMyKHVpbnQzMl90IHZhbHVlLCB1aW50MzJ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTU9WLjMyIGQwWzBdLHIwCitpbnQ4eDE2X3QgdnNldHFfbGFuZV9zOChpbnQ4X3QgdmFsdWUsIGludDh4MTZfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgbGFuZSk7IC8vIFZNT1YuOCBkMFswXSxyMAoraW50MTZ4OF90IHZzZXRxX2xhbmVfczE2KGludDE2X3QgdmFsdWUsIGludDE2eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVk1PVi4xNiBkMFswXSxyMAoraW50MzJ4NF90IHZzZXRxX2xhbmVfczMyKGludDMyX3QgdmFsdWUsIGludDMyeDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVk1PVi4zMiBkMFswXSxyMAorcG9seTh4MTZfdCB2c2V0cV9sYW5lX3A4KHBvbHk4X3QgdmFsdWUsIHBvbHk4eDE2X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGxhbmUpOyAvLyBWTU9WLjggZDBbMF0scjAKK3BvbHkxNng4X3QgdnNldHFfbGFuZV9wMTYocG9seTE2X3QgdmFsdWUsIHBvbHkxNng4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZNT1YuMTYgZDBbMF0scjAKK2Zsb2F0MzJ4NF90IHZzZXRxX2xhbmVfZjMyKGZsb2F0MzJfdCB2YWx1ZSwgZmxvYXQzMng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZNT1YuMzIgZDBbMF0scjAKK2ludDY0eDFfdCB2c2V0X2xhbmVfczY0KGludDY0X3QgdmFsdWUsIGludDY0eDFfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDApIGludCBsYW5lKTsgLy8gVk1PViBkMCxyMCxyMAordWludDY0eDFfdCB2c2V0X2xhbmVfdTY0KHVpbnQ2NF90IHZhbHVlLCB1aW50NjR4MV90IHZlYywgX19jb25zdHJhbmdlKDAsMCkgaW50IGxhbmUpOyAvLyBWTU9WIGQwLHIwLHIwCitpbnQ2NHgyX3QgdnNldHFfbGFuZV9zNjQoaW50NjRfdCB2YWx1ZSwgaW50NjR4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTU9WIGQwLHIwLHIwCit1aW50NjR4Ml90IHZzZXRxX2xhbmVfdTY0KHVpbnQ2NF90IHZhbHVlLCB1aW50NjR4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTU9WIGQwLHIwLHIwCisvL0luaXRpYWxpemUgYSB2ZWN0b3IgZnJvbSBhIGxpdGVyYWwgYml0IHBhdHRlcm4uCitpbnQ4eDhfdCB2Y3JlYXRlX3M4KHVpbnQ2NF90IGEpOyAvLyBWTU9WIGQwLHIwLHIwCitpbnQxNng0X3QgdmNyZWF0ZV9zMTYodWludDY0X3QgYSk7IC8vIFZNT1YgZDAscjAscjAKK2ludDMyeDJfdCB2Y3JlYXRlX3MzMih1aW50NjRfdCBhKTsgLy8gVk1PViBkMCxyMCxyMAorZmxvYXQxNng0X3QgdmNyZWF0ZV9mMTYodWludDY0X3QgYSk7IC8vIFZNT1YgZDAscjAscjAKK2Zsb2F0MzJ4Ml90IHZjcmVhdGVfZjMyKHVpbnQ2NF90IGEpOyAvLyBWTU9WIGQwLHIwLHIwCit1aW50OHg4X3QgdmNyZWF0ZV91OCh1aW50NjRfdCBhKTsgLy8gVk1PViBkMCxyMCxyMAordWludDE2eDRfdCB2Y3JlYXRlX3UxNih1aW50NjRfdCBhKTsgLy8gVk1PViBkMCxyMCxyMAordWludDMyeDJfdCB2Y3JlYXRlX3UzMih1aW50NjRfdCBhKTsgLy8gVk1PViBkMCxyMCxyMAordWludDY0eDFfdCB2Y3JlYXRlX3U2NCh1aW50NjRfdCBhKTsgLy8gVk1PViBkMCxyMCxyMAorcG9seTh4OF90IHZjcmVhdGVfcDgodWludDY0X3QgYSk7IC8vIFZNT1YgZDAscjAscjAKK3BvbHkxNng0X3QgdmNyZWF0ZV9wMTYodWludDY0X3QgYSk7IC8vIFZNT1YgZDAscjAscjAKK2ludDY0eDFfdCB2Y3JlYXRlX3M2NCh1aW50NjRfdCBhKTsgLy8gVk1PViBkMCxyMCxyMAorLy9TZXQgYWxsIGxhbmVzIHRvIHNhbWUgdmFsdWUKKy8vTG9hZCBhbGwgbGFuZXMgb2YgdmVjdG9yIHRvIHRoZSBzYW1lIGxpdGVyYWwgdmFsdWUKK3VpbnQ4eDhfdCB2ZHVwX25fdTgodWludDhfdCB2YWx1ZSk7IC8vIFZEVVAuOCBkMCxyMAordWludDE2eDRfdCB2ZHVwX25fdTE2KHVpbnQxNl90IHZhbHVlKTsgLy8gVkRVUC4xNiBkMCxyMAordWludDMyeDJfdCB2ZHVwX25fdTMyKHVpbnQzMl90IHZhbHVlKTsgLy8gVkRVUC4zMiBkMCxyMAoraW50OHg4X3QgdmR1cF9uX3M4KGludDhfdCB2YWx1ZSk7IC8vIFZEVVAuOCBkMCxyMAoraW50MTZ4NF90IHZkdXBfbl9zMTYoaW50MTZfdCB2YWx1ZSk7IC8vIFZEVVAuMTYgZDAscjAKK2ludDMyeDJfdCB2ZHVwX25fczMyKGludDMyX3QgdmFsdWUpOyAvLyBWRFVQLjMyIGQwLHIwCitwb2x5OHg4X3QgdmR1cF9uX3A4KHBvbHk4X3QgdmFsdWUpOyAvLyBWRFVQLjggZDAscjAKK3BvbHkxNng0X3QgdmR1cF9uX3AxNihwb2x5MTZfdCB2YWx1ZSk7IC8vIFZEVVAuMTYgZDAscjAKK2Zsb2F0MzJ4Ml90IHZkdXBfbl9mMzIoZmxvYXQzMl90IHZhbHVlKTsgLy8gVkRVUC4zMiBkMCxyMAordWludDh4MTZfdCB2ZHVwcV9uX3U4KHVpbnQ4X3QgdmFsdWUpOyAvLyBWRFVQLjggcTAscjAKK3VpbnQxNng4X3QgdmR1cHFfbl91MTYodWludDE2X3QgdmFsdWUpOyAvLyBWRFVQLjE2IHEwLHIwCit1aW50MzJ4NF90IHZkdXBxX25fdTMyKHVpbnQzMl90IHZhbHVlKTsgLy8gVkRVUC4zMiBxMCxyMAoraW50OHgxNl90IHZkdXBxX25fczgoaW50OF90IHZhbHVlKTsgLy8gVkRVUC44IHEwLHIwCitpbnQxNng4X3QgdmR1cHFfbl9zMTYoaW50MTZfdCB2YWx1ZSk7IC8vIFZEVVAuMTYgcTAscjAKK2ludDMyeDRfdCB2ZHVwcV9uX3MzMihpbnQzMl90IHZhbHVlKTsgLy8gVkRVUC4zMiBxMCxyMAorcG9seTh4MTZfdCB2ZHVwcV9uX3A4KHBvbHk4X3QgdmFsdWUpOyAvLyBWRFVQLjggcTAscjAKK3BvbHkxNng4X3QgdmR1cHFfbl9wMTYocG9seTE2X3QgdmFsdWUpOyAvLyBWRFVQLjE2IHEwLHIwCitmbG9hdDMyeDRfdCB2ZHVwcV9uX2YzMihmbG9hdDMyX3QgdmFsdWUpOyAvLyBWRFVQLjMyIHEwLHIwCitpbnQ2NHgxX3QgdmR1cF9uX3M2NChpbnQ2NF90IHZhbHVlKTsgLy8gVk1PViBkMCxyMCxyMAordWludDY0eDFfdCB2ZHVwX25fdTY0KHVpbnQ2NF90IHZhbHVlKTsgLy8gVk1PViBkMCxyMCxyMAoraW50NjR4Ml90IHZkdXBxX25fczY0KGludDY0X3QgdmFsdWUpOyAvLyBWTU9WIGQwLHIwLHIwCit1aW50NjR4Ml90IHZkdXBxX25fdTY0KHVpbnQ2NF90IHZhbHVlKTsgLy8gVk1PViBkMCxyMCxyMAordWludDh4OF90IHZtb3Zfbl91OCh1aW50OF90IHZhbHVlKTsgLy8gVkRVUC44IGQwLHIwCit1aW50MTZ4NF90IHZtb3Zfbl91MTYodWludDE2X3QgdmFsdWUpOyAvLyBWRFVQLjE2IGQwLHIwCit1aW50MzJ4Ml90IHZtb3Zfbl91MzIodWludDMyX3QgdmFsdWUpOyAvLyBWRFVQLjMyIGQwLHIwCitpbnQ4eDhfdCB2bW92X25fczgoaW50OF90IHZhbHVlKTsgLy8gVkRVUC44IGQwLHIwCitpbnQxNng0X3Qgdm1vdl9uX3MxNihpbnQxNl90IHZhbHVlKTsgLy8gVkRVUC4xNiBkMCxyMAoraW50MzJ4Ml90IHZtb3Zfbl9zMzIoaW50MzJfdCB2YWx1ZSk7IC8vIFZEVVAuMzIgZDAscjAKK3BvbHk4eDhfdCB2bW92X25fcDgocG9seThfdCB2YWx1ZSk7IC8vIFZEVVAuOCBkMCxyMAorcG9seTE2eDRfdCB2bW92X25fcDE2KHBvbHkxNl90IHZhbHVlKTsgLy8gVkRVUC4xNiBkMCxyMAorZmxvYXQzMngyX3Qgdm1vdl9uX2YzMihmbG9hdDMyX3QgdmFsdWUpOyAvLyBWRFVQLjMyIGQwLHIwCit1aW50OHgxNl90IHZtb3ZxX25fdTgodWludDhfdCB2YWx1ZSk7IC8vIFZEVVAuOCBxMCxyMAordWludDE2eDhfdCB2bW92cV9uX3UxNih1aW50MTZfdCB2YWx1ZSk7IC8vIFZEVVAuMTYgcTAscjAKK3VpbnQzMng0X3Qgdm1vdnFfbl91MzIodWludDMyX3QgdmFsdWUpOyAvLyBWRFVQLjMyIHEwLHIwCitpbnQ4eDE2X3Qgdm1vdnFfbl9zOChpbnQ4X3QgdmFsdWUpOyAvLyBWRFVQLjggcTAscjAKK2ludDE2eDhfdCB2bW92cV9uX3MxNihpbnQxNl90IHZhbHVlKTsgLy8gVkRVUC4xNiBxMCxyMAoraW50MzJ4NF90IHZtb3ZxX25fczMyKGludDMyX3QgdmFsdWUpOyAvLyBWRFVQLjMyIHEwLHIwCitwb2x5OHgxNl90IHZtb3ZxX25fcDgocG9seThfdCB2YWx1ZSk7IC8vIFZEVVAuOCBxMCxyMAorcG9seTE2eDhfdCB2bW92cV9uX3AxNihwb2x5MTZfdCB2YWx1ZSk7IC8vIFZEVVAuMTYgcTAscjAKK2Zsb2F0MzJ4NF90IHZtb3ZxX25fZjMyKGZsb2F0MzJfdCB2YWx1ZSk7IC8vIFZEVVAuMzIgcTAscjAKK2ludDY0eDFfdCB2bW92X25fczY0KGludDY0X3QgdmFsdWUpOyAvLyBWTU9WIGQwLHIwLHIwCit1aW50NjR4MV90IHZtb3Zfbl91NjQodWludDY0X3QgdmFsdWUpOyAvLyBWTU9WIGQwLHIwLHIwCitpbnQ2NHgyX3Qgdm1vdnFfbl9zNjQoaW50NjRfdCB2YWx1ZSk7IC8vIFZNT1YgZDAscjAscjAKK3VpbnQ2NHgyX3Qgdm1vdnFfbl91NjQodWludDY0X3QgdmFsdWUpOyAvLyBWTU9WIGQwLHIwLHIwCisvL0xvYWQgYWxsIGxhbmVzIG9mIHRoZSB2ZWN0b3IgdG8gdGhlIHZhbHVlIG9mIGEgbGFuZSBvZiBhIHZlY3RvcgordWludDh4OF90IHZkdXBfbGFuZV91OCh1aW50OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZEVVAuOCBkMCxkMFswXQordWludDE2eDRfdCB2ZHVwX2xhbmVfdTE2KHVpbnQxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZEVVAuMTYgZDAsZDBbMF0KK3VpbnQzMngyX3QgdmR1cF9sYW5lX3UzMih1aW50MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWRFVQLjMyIGQwLGQwWzBdCitpbnQ4eDhfdCB2ZHVwX2xhbmVfczgoaW50OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZEVVAuOCBkMCxkMFswXQoraW50MTZ4NF90IHZkdXBfbGFuZV9zMTYoaW50MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWRFVQLjE2IGQwLGQwWzBdCitpbnQzMngyX3QgdmR1cF9sYW5lX3MzMihpbnQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZEVVAuMzIgZDAsZDBbMF0KK3BvbHk4eDhfdCB2ZHVwX2xhbmVfcDgocG9seTh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWRFVQLjggZDAsZDBbMF0KK3BvbHkxNng0X3QgdmR1cF9sYW5lX3AxNihwb2x5MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWRFVQLjE2IGQwLGQwWzBdCitmbG9hdDMyeDJfdCB2ZHVwX2xhbmVfZjMyKGZsb2F0MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWRFVQLjMyIGQwLGQwWzBdCit1aW50OHgxNl90IHZkdXBxX2xhbmVfdTgodWludDh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWRFVQLjggcTAsZDBbMF0KK3VpbnQxNng4X3QgdmR1cHFfbGFuZV91MTYodWludDE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkRVUC4xNiBxMCxkMFswXQordWludDMyeDRfdCB2ZHVwcV9sYW5lX3UzMih1aW50MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWRFVQLjMyIHEwLGQwWzBdCitpbnQ4eDE2X3QgdmR1cHFfbGFuZV9zOChpbnQ4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkRVUC44IHEwLGQwWzBdCitpbnQxNng4X3QgdmR1cHFfbGFuZV9zMTYoaW50MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWRFVQLjE2IHEwLGQwWzBdCitpbnQzMng0X3QgdmR1cHFfbGFuZV9zMzIoaW50MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWRFVQLjMyIHEwLGQwWzBdCitwb2x5OHgxNl90IHZkdXBxX2xhbmVfcDgocG9seTh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWRFVQLjggcTAsZDBbMF0KK3BvbHkxNng4X3QgdmR1cHFfbGFuZV9wMTYocG9seTE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkRVUC4xNiBxMCxkMFswXQorZmxvYXQzMng0X3QgdmR1cHFfbGFuZV9mMzIoZmxvYXQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZEVVAuMzIgcTAsZDBbMF0KK2ludDY0eDFfdCB2ZHVwX2xhbmVfczY0KGludDY0eDFfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDApIGludCBsYW5lKTsgLy8gVk1PViBkMCxkMAordWludDY0eDFfdCB2ZHVwX2xhbmVfdTY0KHVpbnQ2NHgxX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgbGFuZSk7IC8vIFZNT1YgZDAsZDAKK2ludDY0eDJfdCB2ZHVwcV9sYW5lX3M2NChpbnQ2NHgxX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgbGFuZSk7IC8vIFZNT1YgcTAscTAKK3VpbnQ2NHgyX3QgdmR1cHFfbGFuZV91NjQodWludDY0eDFfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDApIGludCBsYW5lKTsgLy8gVk1PViBxMCxxMAorLy9Db21iaW5pbmcgdmVjdG9ycy4gVGhlc2UgaW50cmluc2ljcyBqb2luIHR3byA2NCBiaXQgdmVjdG9ycyBpbnRvIGEgc2luZ2xlIDEyOGJpdCB2ZWN0b3IuCitpbnQ4eDE2X3QgdmNvbWJpbmVfczgoaW50OHg4X3QgbG93LCBpbnQ4eDhfdCBoaWdoKTsgLy8gVk1PViBkMCxkMAoraW50MTZ4OF90IHZjb21iaW5lX3MxNihpbnQxNng0X3QgbG93LCBpbnQxNng0X3QgaGlnaCk7IC8vIFZNT1YgZDAsZDAKK2ludDMyeDRfdCB2Y29tYmluZV9zMzIoaW50MzJ4Ml90IGxvdywgaW50MzJ4Ml90IGhpZ2gpOyAvLyBWTU9WIGQwLGQwCitpbnQ2NHgyX3QgdmNvbWJpbmVfczY0KGludDY0eDFfdCBsb3csIGludDY0eDFfdCBoaWdoKTsgLy8gVk1PViBkMCxkMAorZmxvYXQxNng4X3QgdmNvbWJpbmVfZjE2KGZsb2F0MTZ4NF90IGxvdywgZmxvYXQxNng0X3QgaGlnaCk7IC8vIFZNT1YgZDAsZDAKK2Zsb2F0MzJ4NF90IHZjb21iaW5lX2YzMihmbG9hdDMyeDJfdCBsb3csIGZsb2F0MzJ4Ml90IGhpZ2gpOyAvLyBWTU9WIGQwLGQwCit1aW50OHgxNl90IHZjb21iaW5lX3U4KHVpbnQ4eDhfdCBsb3csIHVpbnQ4eDhfdCBoaWdoKTsgLy8gVk1PViBkMCxkMAordWludDE2eDhfdCB2Y29tYmluZV91MTYodWludDE2eDRfdCBsb3csIHVpbnQxNng0X3QgaGlnaCk7IC8vIFZNT1YgZDAsZDAKK3VpbnQzMng0X3QgdmNvbWJpbmVfdTMyKHVpbnQzMngyX3QgbG93LCB1aW50MzJ4Ml90IGhpZ2gpOyAvLyBWTU9WIGQwLGQwCit1aW50NjR4Ml90IHZjb21iaW5lX3U2NCh1aW50NjR4MV90IGxvdywgdWludDY0eDFfdCBoaWdoKTsgLy8gVk1PViBkMCxkMAorcG9seTh4MTZfdCB2Y29tYmluZV9wOChwb2x5OHg4X3QgbG93LCBwb2x5OHg4X3QgaGlnaCk7IC8vIFZNT1YgZDAsZDAKK3BvbHkxNng4X3QgdmNvbWJpbmVfcDE2KHBvbHkxNng0X3QgbG93LCBwb2x5MTZ4NF90IGhpZ2gpOyAvLyBWTU9WIGQwLGQwCisvL1NwbGl0dGluZyB2ZWN0b3JzLiBUaGVzZSBpbnRyaW5zaWNzIHNwbGl0IGEgMTI4IGJpdCB2ZWN0b3IgaW50byAyIGNvbXBvbmVudCA2NCBiaXQgdmVjdG9ycworaW50OHg4X3QgdmdldF9oaWdoX3M4KGludDh4MTZfdCBhKTsgLy8gVk1PViBkMCxkMAoraW50MTZ4NF90IHZnZXRfaGlnaF9zMTYoaW50MTZ4OF90IGEpOyAvLyBWTU9WIGQwLGQwCitpbnQzMngyX3QgdmdldF9oaWdoX3MzMihpbnQzMng0X3QgYSk7IC8vIFZNT1YgZDAsZDAKK2ludDY0eDFfdCB2Z2V0X2hpZ2hfczY0KGludDY0eDJfdCBhKTsgLy8gVk1PViBkMCxkMAorZmxvYXQxNng0X3QgdmdldF9oaWdoX2YxNihmbG9hdDE2eDhfdCBhKTsgLy8gVk1PViBkMCxkMAorZmxvYXQzMngyX3QgdmdldF9oaWdoX2YzMihmbG9hdDMyeDRfdCBhKTsgLy8gVk1PViBkMCxkMAordWludDh4OF90IHZnZXRfaGlnaF91OCh1aW50OHgxNl90IGEpOyAvLyBWTU9WIGQwLGQwCit1aW50MTZ4NF90IHZnZXRfaGlnaF91MTYodWludDE2eDhfdCBhKTsgLy8gVk1PViBkMCxkMAordWludDMyeDJfdCB2Z2V0X2hpZ2hfdTMyKHVpbnQzMng0X3QgYSk7IC8vIFZNT1YgZDAsZDAKK3VpbnQ2NHgxX3QgdmdldF9oaWdoX3U2NCh1aW50NjR4Ml90IGEpOyAvLyBWTU9WIGQwLGQwCitwb2x5OHg4X3QgdmdldF9oaWdoX3A4KHBvbHk4eDE2X3QgYSk7IC8vIFZNT1YgZDAsZDAKK3BvbHkxNng0X3QgdmdldF9oaWdoX3AxNihwb2x5MTZ4OF90IGEpOyAvLyBWTU9WIGQwLGQwCitpbnQ4eDhfdCB2Z2V0X2xvd19zOChpbnQ4eDE2X3QgYSk7IC8vIFZNT1YgZDAsZDAKK2ludDE2eDRfdCB2Z2V0X2xvd19zMTYoaW50MTZ4OF90IGEpOyAvLyBWTU9WIGQwLGQwCitpbnQzMngyX3QgdmdldF9sb3dfczMyKGludDMyeDRfdCBhKTsgLy8gVk1PViBkMCxkMAoraW50NjR4MV90IHZnZXRfbG93X3M2NChpbnQ2NHgyX3QgYSk7IC8vIFZNT1YgZDAsZDAKK2Zsb2F0MTZ4NF90IHZnZXRfbG93X2YxNihmbG9hdDE2eDhfdCBhKTsgLy8gVk1PViBkMCxkMAorZmxvYXQzMngyX3QgdmdldF9sb3dfZjMyKGZsb2F0MzJ4NF90IGEpOyAvLyBWTU9WIGQwLGQwCit1aW50OHg4X3QgdmdldF9sb3dfdTgodWludDh4MTZfdCBhKTsgLy8gVk1PViBkMCxkMAordWludDE2eDRfdCB2Z2V0X2xvd191MTYodWludDE2eDhfdCBhKTsgLy8gVk1PViBkMCxkMAordWludDMyeDJfdCB2Z2V0X2xvd191MzIodWludDMyeDRfdCBhKTsgLy8gVk1PViBkMCxkMAordWludDY0eDFfdCB2Z2V0X2xvd191NjQodWludDY0eDJfdCBhKTsgLy8gVk1PViBkMCxkMAorcG9seTh4OF90IHZnZXRfbG93X3A4KHBvbHk4eDE2X3QgYSk7IC8vIFZNT1YgZDAsZDAKK3BvbHkxNng0X3QgdmdldF9sb3dfcDE2KHBvbHkxNng4X3QgYSk7IC8vIFZNT1YgZDAsZDAKKy8vQ29udmVydGluZyB2ZWN0b3JzLiBUaGVzZSBpbnRyaW5zaWNzIGFyZSB1c2VkIHRvIGNvbnZlcnQgdmVjdG9ycy4KKy8vQ29udmVydCBmcm9tIGZsb2F0CitpbnQzMngyX3QgdmN2dF9zMzJfZjMyKGZsb2F0MzJ4Ml90IGEpOyAvLyBWQ1ZULlMzMi5GMzIgZDAsIGQwCit1aW50MzJ4Ml90IHZjdnRfdTMyX2YzMihmbG9hdDMyeDJfdCBhKTsgLy8gVkNWVC5VMzIuRjMyIGQwLCBkMAoraW50MzJ4NF90IHZjdnRxX3MzMl9mMzIoZmxvYXQzMng0X3QgYSk7IC8vIFZDVlQuUzMyLkYzMiBxMCwgcTAKK3VpbnQzMng0X3QgdmN2dHFfdTMyX2YzMihmbG9hdDMyeDRfdCBhKTsgLy8gVkNWVC5VMzIuRjMyIHEwLCBxMAoraW50MzJ4Ml90IHZjdnRfbl9zMzJfZjMyKGZsb2F0MzJ4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZDVlQuUzMyLkYzMiBkMCwgZDAsICMzMgordWludDMyeDJfdCB2Y3Z0X25fdTMyX2YzMihmbG9hdDMyeDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWQ1ZULlUzMi5GMzIgZDAsIGQwLCAjMzIKK2ludDMyeDRfdCB2Y3Z0cV9uX3MzMl9mMzIoZmxvYXQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVkNWVC5TMzIuRjMyIHEwLCBxMCwgIzMyCit1aW50MzJ4NF90IHZjdnRxX25fdTMyX2YzMihmbG9hdDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWQ1ZULlUzMi5GMzIgcTAsIHEwLCAjMzIKKy8vQ29udmVydCB0byBmbG9hdAorZmxvYXQzMngyX3QgdmN2dF9mMzJfczMyKGludDMyeDJfdCBhKTsgLy8gVkNWVC5GMzIuUzMyIGQwLCBkMAorZmxvYXQzMngyX3QgdmN2dF9mMzJfdTMyKHVpbnQzMngyX3QgYSk7IC8vIFZDVlQuRjMyLlUzMiBkMCwgZDAKK2Zsb2F0MzJ4NF90IHZjdnRxX2YzMl9zMzIoaW50MzJ4NF90IGEpOyAvLyBWQ1ZULkYzMi5TMzIgcTAsIHEwCitmbG9hdDMyeDRfdCB2Y3Z0cV9mMzJfdTMyKHVpbnQzMng0X3QgYSk7IC8vIFZDVlQuRjMyLlUzMiBxMCwgcTAKK2Zsb2F0MzJ4Ml90IHZjdnRfbl9mMzJfczMyKGludDMyeDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWQ1ZULkYzMi5TMzIgZDAsIGQwLCAjMzIKK2Zsb2F0MzJ4Ml90IHZjdnRfbl9mMzJfdTMyKHVpbnQzMngyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVkNWVC5GMzIuVTMyIGQwLCBkMCwgIzMyCitmbG9hdDMyeDRfdCB2Y3Z0cV9uX2YzMl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZDVlQuRjMyLlMzMiBxMCwgcTAsICMzMgorZmxvYXQzMng0X3QgdmN2dHFfbl9mMzJfdTMyKHVpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVkNWVC5GMzIuVTMyIHEwLCBxMCwgIzMyCisvL0NvbnZlcnQgYmV0d2VlbiBmbG9hdHMKK2Zsb2F0MTZ4NF90IHZjdnRfZjE2X2YzMihmbG9hdDMyeDRfdCBhKTsgLy8gVkNWVC5GMTYuRjMyIGQwLCBxMAorZmxvYXQzMng0X3QgdmN2dF9mMzJfZjE2KGZsb2F0MTZ4NF90IGEpOyAvLyBWQ1ZULkYzMi5GMTYgcTAsIGQwCisvL1ZlY3RvciBuYXJyb3cgaW50ZWdlcgoraW50OHg4X3Qgdm1vdm5fczE2KGludDE2eDhfdCBhKTsgLy8gVk1PVk4uSTE2IGQwLHEwCitpbnQxNng0X3Qgdm1vdm5fczMyKGludDMyeDRfdCBhKTsgLy8gVk1PVk4uSTMyIGQwLHEwCitpbnQzMngyX3Qgdm1vdm5fczY0KGludDY0eDJfdCBhKTsgLy8gVk1PVk4uSTY0IGQwLHEwCit1aW50OHg4X3Qgdm1vdm5fdTE2KHVpbnQxNng4X3QgYSk7IC8vIFZNT1ZOLkkxNiBkMCxxMAordWludDE2eDRfdCB2bW92bl91MzIodWludDMyeDRfdCBhKTsgLy8gVk1PVk4uSTMyIGQwLHEwCit1aW50MzJ4Ml90IHZtb3ZuX3U2NCh1aW50NjR4Ml90IGEpOyAvLyBWTU9WTi5JNjQgZDAscTAKKy8vVmVjdG9yIGxvbmcgbW92ZQoraW50MTZ4OF90IHZtb3ZsX3M4KGludDh4OF90IGEpOyAvLyBWTU9WTC5TOCBxMCxkMAoraW50MzJ4NF90IHZtb3ZsX3MxNihpbnQxNng0X3QgYSk7IC8vIFZNT1ZMLlMxNiBxMCxkMAoraW50NjR4Ml90IHZtb3ZsX3MzMihpbnQzMngyX3QgYSk7IC8vIFZNT1ZMLlMzMiBxMCxkMAordWludDE2eDhfdCB2bW92bF91OCh1aW50OHg4X3QgYSk7IC8vIFZNT1ZMLlU4IHEwLGQwCit1aW50MzJ4NF90IHZtb3ZsX3UxNih1aW50MTZ4NF90IGEpOyAvLyBWTU9WTC5VMTYgcTAsZDAKK3VpbnQ2NHgyX3Qgdm1vdmxfdTMyKHVpbnQzMngyX3QgYSk7IC8vIFZNT1ZMLlUzMiBxMCxkMAorLy9WZWN0b3Igc2F0dXJhdGluZyBuYXJyb3cgaW50ZWdlcgoraW50OHg4X3QgdnFtb3ZuX3MxNihpbnQxNng4X3QgYSk7IC8vIFZRTU9WTi5TMTYgZDAscTAKK2ludDE2eDRfdCB2cW1vdm5fczMyKGludDMyeDRfdCBhKTsgLy8gVlFNT1ZOLlMzMiBkMCxxMAoraW50MzJ4Ml90IHZxbW92bl9zNjQoaW50NjR4Ml90IGEpOyAvLyBWUU1PVk4uUzY0IGQwLHEwCit1aW50OHg4X3QgdnFtb3ZuX3UxNih1aW50MTZ4OF90IGEpOyAvLyBWUU1PVk4uVTE2IGQwLHEwCit1aW50MTZ4NF90IHZxbW92bl91MzIodWludDMyeDRfdCBhKTsgLy8gVlFNT1ZOLlUzMiBkMCxxMAordWludDMyeDJfdCB2cW1vdm5fdTY0KHVpbnQ2NHgyX3QgYSk7IC8vIFZRTU9WTi5VNjQgZDAscTAKKy8vVmVjdG9yIHNhdHVyYXRpbmcgbmFycm93IGludGVnZXIgc2lnbmVkLT51bnNpZ25lZAordWludDh4OF90IHZxbW92dW5fczE2KGludDE2eDhfdCBhKTsgLy8gVlFNT1ZVTi5TMTYgZDAscTAKK3VpbnQxNng0X3QgdnFtb3Z1bl9zMzIoaW50MzJ4NF90IGEpOyAvLyBWUU1PVlVOLlMzMiBkMCxxMAordWludDMyeDJfdCB2cW1vdnVuX3M2NChpbnQ2NHgyX3QgYSk7IC8vIFZRTU9WVU4uUzY0IGQwLHEwCisvL1RhYmxlIGxvb2sgdXAKK3VpbnQ4eDhfdCB2dGJsMV91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWVEJMLjggZDAsIHtkMH0sIGQwCitpbnQ4eDhfdCB2dGJsMV9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlRCTC44IGQwLCB7ZDB9LCBkMAorcG9seTh4OF90IHZ0YmwxX3A4KHBvbHk4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZUQkwuOCBkMCwge2QwfSwgZDAKK3VpbnQ4eDhfdCB2dGJsMl91OF9wdHIodWludDh4OHgyX3QgKmEsIHVpbnQ4eDhfdCBiKTsgLy8gVlRCTC44IGQwLCB7ZDAsIGQxfSwgZDAKK2ludDh4OF90IHZ0YmwyX3M4X3B0cihpbnQ4eDh4Ml90ICphLCBpbnQ4eDhfdCBiKTsgLy8gVlRCTC44IGQwLCB7ZDAsIGQxfSwgZDAKK3BvbHk4eDhfdCB2dGJsMl9wOF9wdHIocG9seTh4OHgyX3QgKmEsIHVpbnQ4eDhfdCBiKTsgLy8gVlRCTC44IGQwLCB7ZDAsIGQxfSwgZDAKK3VpbnQ4eDhfdCB2dGJsM191OF9wdHIodWludDh4OHgzX3QgKmEsIHVpbnQ4eDhfdCBiKTsgLy8gVlRCTC44IGQwLCB7ZDAsIGQxLCBkMn0sIGQwCitpbnQ4eDhfdCB2dGJsM19zOF9wdHIoaW50OHg4eDNfdCAqYSwgaW50OHg4X3QgYik7IC8vIFZUQkwuOCBkMCwge2QwLCBkMSwgZDJ9LCBkMAorcG9seTh4OF90IHZ0YmwzX3A4X3B0cihwb2x5OHg4eDNfdCAqYSwgdWludDh4OF90IGIpOyAvLyBWVEJMLjggZDAsIHtkMCwgZDEsIGQyfSwgZDAKK3VpbnQ4eDhfdCB2dGJsNF91OF9wdHIodWludDh4OHg0X3QgKmEsIHVpbnQ4eDhfdCBiKTsgLy8gVlRCTC44IGQwLCB7ZDAsIGQxLCBkMiwgZDN9LCBkMAoraW50OHg4X3QgdnRibDRfczhfcHRyKGludDh4OHg0X3QgKmEsIGludDh4OF90IGIpOyAvLyBWVEJMLjggZDAsIHtkMCwgZDEsIGQyLCBkM30sIGQwCitwb2x5OHg4X3QgdnRibDRfcDhfcHRyKHBvbHk4eDh4NF90ICphLCB1aW50OHg4X3QgYik7IC8vIFZUQkwuOCBkMCwge2QwLCBkMSwgZDIsIGQzfSwgZDAKKy8vRXh0ZW5kZWQgdGFibGUgbG9vayB1cCBpbnRyaW5zaWNzCit1aW50OHg4X3QgdnRieDFfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiLCB1aW50OHg4X3QgYyk7IC8vIFZUQlguOCBkMCwge2QwfSwgZDAKK2ludDh4OF90IHZ0YngxX3M4KGludDh4OF90IGEsIGludDh4OF90IGIsIGludDh4OF90IGMpOyAvLyBWVEJYLjggZDAsIHtkMH0sIGQwCitwb2x5OHg4X3QgdnRieDFfcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiLCB1aW50OHg4X3QgYyk7IC8vIFZUQlguOCBkMCwge2QwfSwgZDAKK3VpbnQ4eDhfdCB2dGJ4Ml91OF9wdHIodWludDh4OF90IGEsIHVpbnQ4eDh4Ml90ICpiLCB1aW50OHg4X3QgYyk7IC8vIFZUQlguOCBkMCwge2QwLCBkMX0sIGQwCitpbnQ4eDhfdCB2dGJ4Ml9zOF9wdHIoaW50OHg4X3QgYSwgaW50OHg4eDJfdCAqYiwgaW50OHg4X3QgYyk7IC8vIFZUQlguOCBkMCwge2QwLCBkMX0sIGQwCitwb2x5OHg4X3QgdnRieDJfcDhfcHRyKHBvbHk4eDhfdCBhLCBwb2x5OHg4eDJfdCAqYiwgdWludDh4OF90IGMpOyAvLyBWVEJYLjggZDAsIHtkMCwgZDF9LCBkMAordWludDh4OF90IHZ0YngzX3U4X3B0cih1aW50OHg4X3QgYSwgdWludDh4OHgzX3QgKmIsIHVpbnQ4eDhfdCBjKTsgLy8gVlRCWC44IGQwLCB7ZDAsIGQxLCBkMn0sIGQwCitpbnQ4eDhfdCB2dGJ4M19zOF9wdHIoaW50OHg4X3QgYSwgaW50OHg4eDNfdCAqYiwgaW50OHg4X3QgYyk7IC8vIFZUQlguOCBkMCwge2QwLCBkMSwgZDJ9LCBkMAorcG9seTh4OF90IHZ0YngzX3A4X3B0cihwb2x5OHg4X3QgYSwgcG9seTh4OHgzX3QgKmIsIHVpbnQ4eDhfdCBjKTsgLy8gVlRCWC44IGQwLCB7ZDAsIGQxLCBkMn0sIGQwCit1aW50OHg4X3QgdnRieDRfdThfcHRyKHVpbnQ4eDhfdCBhLCB1aW50OHg4eDRfdCAqYiwgdWludDh4OF90IGMpOyAvLyBWVEJYLjggZDAsIHtkMCwgZDEsIGQyLCBkM30sIGQwCitpbnQ4eDhfdCB2dGJ4NF9zOF9wdHIoaW50OHg4X3QgYSwgaW50OHg4eDRfdCAqYiwgaW50OHg4X3QgYyk7IC8vIFZUQlguOCBkMCwge2QwLCBkMSwgZDIsIGQzfSwgZDAKK3BvbHk4eDhfdCB2dGJ4NF9wOF9wdHIocG9seTh4OF90IGEsIHBvbHk4eDh4NF90ICpiLCB1aW50OHg4X3QgYyk7IC8vIFZUQlguOCBkMCwge2QwLCBkMSwgZDIsIGQzfSwgZDAKKy8vT3BlcmF0aW9ucyB3aXRoIGEgc2NhbGFyIHZhbHVlCisvL1ZlY3RvciBtdWx0aXBseSBhY2N1bXVsYXRlIHdpdGggc2NhbGFyCitpbnQxNng0X3Qgdm1sYV9sYW5lX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZNTEEuSTE2IGQwLCBkMCxkMFswXQoraW50MzJ4Ml90IHZtbGFfbGFuZV9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWTUxBLkkzMiBkMCwgZDAsZDBbMF0KK3VpbnQxNng0X3Qgdm1sYV9sYW5lX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZNTEEuSTE2IGQwLCBkMCxkMFswXQordWludDMyeDJfdCB2bWxhX2xhbmVfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVk1MQS5JMzIgZDAsIGQwLGQwWzBdCitmbG9hdDMyeDJfdCB2bWxhX2xhbmVfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVk1MQS5GMzIgZDAsZDAsIGQwWzBdCitpbnQxNng4X3Qgdm1sYXFfbGFuZV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpOyAvLyBWTUxBLkkxNiBxMCwgcTAsZDBbMF0KK2ludDMyeDRfdCB2bWxhcV9sYW5lX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTEEuSTMyIHEwLCBxMCxkMFswXQordWludDE2eDhfdCB2bWxhcV9sYW5lX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZNTEEuSTE2IHEwLHEwLCBkMFswXQordWludDMyeDRfdCB2bWxhcV9sYW5lX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTEEuSTMyIHEwLHEwLCBkMFswXQorZmxvYXQzMng0X3Qgdm1sYXFfbGFuZV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWTUxBLkYzMiBxMCxxMCwgZDBbMF0KKy8vVmVjdG9yIHdpZGVuaW5nIG11bHRpcGx5IGFjY3VtdWxhdGUgd2l0aCBzY2FsYXIKK2ludDMyeDRfdCB2bWxhbF9sYW5lX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vVk1MQUwuUzE2IHEwLCBkMCxkMFswXQoraW50NjR4Ml90IHZtbGFsX2xhbmVfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy9WTUxBTC5TMzIgcTAsIGQwLGQwWzBdCit1aW50MzJ4NF90IHZtbGFsX2xhbmVfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IHYsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsKTsgLy8gVk1MQUwuVTE2IHEwLGQwLCBkMFswXQordWludDY0eDJfdCB2bWxhbF9sYW5lX3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTEFMLlUzMiBxMCxkMCwgZDBbMF0KKy8vVmVjdG9yIHdpZGVuaW5nIHNhdHVyYXRpbmcgZG91YmxpbmcgbXVsdGlwbHkgYWNjdW11bGF0ZSB3aXRoIHNjYWxhcgoraW50MzJ4NF90IHZxZG1sYWxfbGFuZV9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpOyAvLyBWUURNTEFMLlMxNiBxMCxkMCwgZDBbMF0KK2ludDY0eDJfdCB2cWRtbGFsX2xhbmVfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVlFETUxBTC5TMzIgcTAsZDAsIGQwWzBdCisvL1ZlY3RvciBtdWx0aXBseSBzdWJ0cmFjdCB3aXRoIHNjYWxhcgoraW50MTZ4NF90IHZtbHNfbGFuZV9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpOyAvLyBWTUxTLkkxNiBkMCwgZDAsZDBbMF0KK2ludDMyeDJfdCB2bWxzX2xhbmVfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVk1MUy5JMzIgZDAsIGQwLGQwWzBdCit1aW50MTZ4NF90IHZtbHNfbGFuZV91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpOyAvLyBWTUxTLkkxNiBkMCwgZDAsZDBbMF0KK3VpbnQzMngyX3Qgdm1sc19sYW5lX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTFMuSTMyIGQwLCBkMCxkMFswXQorZmxvYXQzMngyX3Qgdm1sc19sYW5lX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTFMuRjMyIGQwLGQwLCBkMFswXQoraW50MTZ4OF90IHZtbHNxX2xhbmVfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4NF90IHYsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsKTsgLy8gVk1MUy5JMTYgcTAsIHEwLGQwWzBdCitpbnQzMng0X3Qgdm1sc3FfbGFuZV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWTUxTLkkzMiBxMCwgcTAsZDBbMF0KK3VpbnQxNng4X3Qgdm1sc3FfbGFuZV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIHVpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpOyAvLyBWTUxTLkkxNiBxMCxxMCwgZDBbMF0KK3VpbnQzMng0X3Qgdm1sc3FfbGFuZV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWTUxTLkkzMiBxMCxxMCwgZDBbMF0KK2Zsb2F0MzJ4NF90IHZtbHNxX2xhbmVfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVk1MUy5GMzIgcTAscTAsIGQwWzBdCisvL1ZlY3RvciB3aWRlbmluZyBtdWx0aXBseSBzdWJ0cmFjdCB3aXRoIHNjYWxhcgoraW50MzJ4NF90IHZtbHNsX2xhbmVfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IHYsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsKTsgLy8gVk1MU0wuUzE2IHEwLCBkMCxkMFswXQoraW50NjR4Ml90IHZtbHNsX2xhbmVfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVk1MU0wuUzMyIHEwLCBkMCxkMFswXQordWludDMyeDRfdCB2bWxzbF9sYW5lX3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZNTFNMLlUxNiBxMCxkMCwgZDBbMF0KK3VpbnQ2NHgyX3Qgdm1sc2xfbGFuZV91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWTUxTTC5VMzIgcTAsZDAsIGQwWzBdCisvL1ZlY3RvciB3aWRlbmluZyBzYXR1cmF0aW5nIGRvdWJsaW5nIG11bHRpcGx5IHN1YnRyYWN0IHdpdGggc2NhbGFyCitpbnQzMng0X3QgdnFkbWxzbF9sYW5lX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZRRE1MU0wuUzE2IHEwLGQwLCBkMFswXQoraW50NjR4Ml90IHZxZG1sc2xfbGFuZV9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWUURNTFNMLlMzMiBxMCxkMCwgZDBbMF0KKy8vVmVjdG9yIG11bHRpcGx5IGJ5IHNjYWxhcgoraW50MTZ4NF90IHZtdWxfbl9zMTYoaW50MTZ4NF90IGEsIGludDE2X3QgYik7IC8vIFZNVUwuSTE2IGQwLGQwLGQwWzBdCitpbnQzMngyX3Qgdm11bF9uX3MzMihpbnQzMngyX3QgYSwgaW50MzJfdCBiKTsgLy8gVk1VTC5JMzIgZDAsZDAsZDBbMF0KK2Zsb2F0MzJ4Ml90IHZtdWxfbl9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMl90IGIpOyAvLyBWTVVMLkYzMiBkMCxkMCxkMFswXQordWludDE2eDRfdCB2bXVsX25fdTE2KHVpbnQxNng0X3QgYSwgdWludDE2X3QgYik7IC8vIFZNVUwuSTE2IGQwLGQwLGQwWzBdCit1aW50MzJ4Ml90IHZtdWxfbl91MzIodWludDMyeDJfdCBhLCB1aW50MzJfdCBiKTsgLy8gVk1VTC5JMzIgZDAsZDAsZDBbMF0KK2ludDE2eDhfdCB2bXVscV9uX3MxNihpbnQxNng4X3QgYSwgaW50MTZfdCBiKTsgLy8gVk1VTC5JMTYgcTAscTAsZDBbMF0KK2ludDMyeDRfdCB2bXVscV9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJfdCBiKTsgLy8gVk1VTC5JMzIgcTAscTAsZDBbMF0KK2Zsb2F0MzJ4NF90IHZtdWxxX25fZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJfdCBiKTsgLy8gVk1VTC5GMzIgcTAscTAsZDBbMF0KK3VpbnQxNng4X3Qgdm11bHFfbl91MTYodWludDE2eDhfdCBhLCB1aW50MTZfdCBiKTsgLy8gVk1VTC5JMTYgcTAscTAsZDBbMF0KK3VpbnQzMng0X3Qgdm11bHFfbl91MzIodWludDMyeDRfdCBhLCB1aW50MzJfdCBiKTsgLy8gVk1VTC5JMzIgcTAscTAsZDBbMF0KKy8vVmVjdG9yIGxvbmcgbXVsdGlwbHkgd2l0aCBzY2FsYXIKK2ludDMyeDRfdCB2bXVsbF9uX3MxNihpbnQxNng0X3QgdmVjMSwgaW50MTZfdCB2YWwyKTsgLy8gVk1VTEwuUzE2IHEwLGQwLGQwWzBdCitpbnQ2NHgyX3Qgdm11bGxfbl9zMzIoaW50MzJ4Ml90IHZlYzEsIGludDMyX3QgdmFsMik7IC8vIFZNVUxMLlMzMiBxMCxkMCxkMFswXQordWludDMyeDRfdCB2bXVsbF9uX3UxNih1aW50MTZ4NF90IHZlYzEsIHVpbnQxNl90IHZhbDIpOyAvLyBWTVVMTC5VMTYgcTAsZDAsZDBbMF0KK3VpbnQ2NHgyX3Qgdm11bGxfbl91MzIodWludDMyeDJfdCB2ZWMxLCB1aW50MzJfdCB2YWwyKTsgLy8gVk1VTEwuVTMyIHEwLGQwLGQwWzBdCisvL1ZlY3RvciBsb25nIG11bHRpcGx5IGJ5IHNjYWxhcgoraW50MzJ4NF90IHZtdWxsX2xhbmVfczE2KGludDE2eDRfdCB2ZWMxLCBpbnQxNng0X3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDMpIGludCB2YWwzKTsgLy8gVk1VTEwuUzE2IHEwLGQwLGQwWzBdCitpbnQ2NHgyX3Qgdm11bGxfbGFuZV9zMzIoaW50MzJ4Ml90IHZlYzEsIGludDMyeDJfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMSkgaW50IHZhbDMpOyAvLyBWTVVMTC5TMzIgcTAsZDAsZDBbMF0KK3VpbnQzMng0X3Qgdm11bGxfbGFuZV91MTYodWludDE2eDRfdCB2ZWMxLCB1aW50MTZ4NF90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAzKSBpbnQgdmFsMyk7IC8vIFZNVUxMLlUxNiBxMCxkMCxkMFswXQordWludDY0eDJfdCB2bXVsbF9sYW5lX3UzMih1aW50MzJ4Ml90IHZlYzEsIHVpbnQzMngyX3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDEpIGludCB2YWwzKTsgLy8gVk1VTEwuVTMyIHEwLGQwLGQwWzBdCisvL1ZlY3RvciBzYXR1cmF0aW5nIGRvdWJsaW5nIGxvbmcgbXVsdGlwbHkgd2l0aCBzY2FsYXIKK2ludDMyeDRfdCB2cWRtdWxsX25fczE2KGludDE2eDRfdCB2ZWMxLCBpbnQxNl90IHZhbDIpOyAvLyBWUURNVUxMLlMxNiBxMCxkMCxkMFswXQoraW50NjR4Ml90IHZxZG11bGxfbl9zMzIoaW50MzJ4Ml90IHZlYzEsIGludDMyX3QgdmFsMik7IC8vIFZRRE1VTEwuUzMyIHEwLGQwLGQwWzBdCisvL1ZlY3RvciBzYXR1cmF0aW5nIGRvdWJsaW5nIGxvbmcgbXVsdGlwbHkgYnkgc2NhbGFyCitpbnQzMng0X3QgdnFkbXVsbF9sYW5lX3MxNihpbnQxNng0X3QgdmVjMSwgaW50MTZ4NF90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAzKSBpbnQgdmFsMyk7IC8vIFZRRE1VTEwuUzE2IHEwLGQwLGQwWzBdCitpbnQ2NHgyX3QgdnFkbXVsbF9sYW5lX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJ4Ml90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAxKSBpbnQgdmFsMyk7IC8vIFZRRE1VTEwuUzMyIHEwLGQwLGQwWzBdCisvL1ZlY3RvciBzYXR1cmF0aW5nIGRvdWJsaW5nIG11bHRpcGx5IGhpZ2ggd2l0aCBzY2FsYXIKK2ludDE2eDRfdCB2cWRtdWxoX25fczE2KGludDE2eDRfdCB2ZWMxLCBpbnQxNl90IHZhbDIpOyAvLyBWUURNVUxILlMxNiBkMCxkMCxkMFswXQoraW50MzJ4Ml90IHZxZG11bGhfbl9zMzIoaW50MzJ4Ml90IHZlYzEsIGludDMyX3QgdmFsMik7IC8vIFZRRE1VTEguUzMyIGQwLGQwLGQwWzBdCitpbnQxNng4X3QgdnFkbXVsaHFfbl9zMTYoaW50MTZ4OF90IHZlYzEsIGludDE2X3QgdmFsMik7IC8vIFZRRE1VTEguUzE2IHEwLHEwLGQwWzBdCitpbnQzMng0X3QgdnFkbXVsaHFfbl9zMzIoaW50MzJ4NF90IHZlYzEsIGludDMyX3QgdmFsMik7IC8vIFZRRE1VTEguUzMyIHEwLHEwLGQwWzBdCisvL1ZlY3RvciBzYXR1cmF0aW5nIGRvdWJsaW5nIG11bHRpcGx5IGhpZ2ggYnkgc2NhbGFyCitpbnQxNng0X3QgdnFkbXVsaF9sYW5lX3MxNihpbnQxNng0X3QgdmVjMSwgaW50MTZ4NF90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAzKSBpbnQgdmFsMyk7IC8vIFZRRE1VTEguUzE2IGQwLGQwLGQwWzBdCitpbnQzMngyX3QgdnFkbXVsaF9sYW5lX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJ4Ml90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAxKSBpbnQgdmFsMyk7IC8vIFZRRE1VTEguUzMyIGQwLGQwLGQwWzBdCitpbnQxNng4X3QgdnFkbXVsaHFfbGFuZV9zMTYoaW50MTZ4OF90IHZlYzEsIGludDE2eDRfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMykgaW50IHZhbDMpOyAvLyBWUURNVUxILlMxNiBxMCxxMCxkMFswXQoraW50MzJ4NF90IHZxZG11bGhxX2xhbmVfczMyKGludDMyeDRfdCB2ZWMxLCBpbnQzMngyX3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDEpIGludCB2YWwzKTsgLy8gVlFETVVMSC5TMzIgcTAscTAsZDBbMF0KKy8vVmVjdG9yIHNhdHVyYXRpbmcgcm91bmRpbmcgZG91YmxpbmcgbXVsdGlwbHkgaGlnaCB3aXRoIHNjYWxhcgoraW50MTZ4NF90IHZxcmRtdWxoX25fczE2KGludDE2eDRfdCB2ZWMxLCBpbnQxNl90IHZhbDIpOyAvLyBWUVJETVVMSC5TMTYgZDAsZDAsZDBbMF0KK2ludDMyeDJfdCB2cXJkbXVsaF9uX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJfdCB2YWwyKTsgLy8gVlFSRE1VTEguUzMyIGQwLGQwLGQwWzBdCitpbnQxNng4X3QgdnFyZG11bGhxX25fczE2KGludDE2eDhfdCB2ZWMxLCBpbnQxNl90IHZhbDIpOyAvLyBWUVJETVVMSC5TMTYgcTAscTAsZDBbMF0KK2ludDMyeDRfdCB2cXJkbXVsaHFfbl9zMzIoaW50MzJ4NF90IHZlYzEsIGludDMyX3QgdmFsMik7IC8vIFZRUkRNVUxILlMzMiBxMCxxMCxkMFswXQorLy9WZWN0b3Igcm91bmRpbmcgc2F0dXJhdGluZyBkb3VibGluZyBtdWx0aXBseSBoaWdoIGJ5IHNjYWxhcgoraW50MTZ4NF90IHZxcmRtdWxoX2xhbmVfczE2KGludDE2eDRfdCB2ZWMxLCBpbnQxNng0X3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDMpIGludCB2YWwzKTsgLy8gVlFSRE1VTEguUzE2IGQwLGQwLGQwWzBdCitpbnQzMngyX3QgdnFyZG11bGhfbGFuZV9zMzIoaW50MzJ4Ml90IHZlYzEsIGludDMyeDJfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMSkgaW50IHZhbDMpOyAvLyBWUVJETVVMSC5TMzIgZDAsZDAsZDBbMF0KK2ludDE2eDhfdCB2cXJkbXVsaHFfbGFuZV9zMTYoaW50MTZ4OF90IHZlYzEsIGludDE2eDRfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMykgaW50IHZhbDMpOyAvLyBWUVJETVVMSC5TMTYgcTAscTAsZDBbMF0KK2ludDMyeDRfdCB2cXJkbXVsaHFfbGFuZV9zMzIoaW50MzJ4NF90IHZlYzEsIGludDMyeDJfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMSkgaW50IHZhbDMpOyAvLyBWUVJETVVMSC5TMzIgcTAscTAsZDBbMF0KKy8vVmVjdG9yIG11bHRpcGx5IGFjY3VtdWxhdGUgd2l0aCBzY2FsYXIKK2ludDE2eDRfdCB2bWxhX25fczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZfdCBjKTsgLy8gVk1MQS5JMTYgZDAsIGQwLCBkMFswXQoraW50MzJ4Ml90IHZtbGFfbl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMl90IGMpOyAvLyBWTUxBLkkzMiBkMCwgZDAsIGQwWzBdCit1aW50MTZ4NF90IHZtbGFfbl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNl90IGMpOyAvLyBWTUxBLkkxNiBkMCwgZDAsIGQwWzBdCit1aW50MzJ4Ml90IHZtbGFfbl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMl90IGMpOyAvLyBWTUxBLkkzMiBkMCwgZDAsIGQwWzBdCitmbG9hdDMyeDJfdCB2bWxhX25fZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJfdCBjKTsgLy8gVk1MQS5GMzIgZDAsIGQwLCBkMFswXQoraW50MTZ4OF90IHZtbGFxX25fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZfdCBjKTsgLy8gVk1MQS5JMTYgcTAsIHEwLCBkMFswXQoraW50MzJ4NF90IHZtbGFxX25fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJfdCBjKTsgLy8gVk1MQS5JMzIgcTAsIHEwLCBkMFswXQordWludDE2eDhfdCB2bWxhcV9uX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2X3QgYyk7IC8vIFZNTEEuSTE2IHEwLCBxMCwgZDBbMF0KK3VpbnQzMng0X3Qgdm1sYXFfbl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMl90IGMpOyAvLyBWTUxBLkkzMiBxMCwgcTAsIGQwWzBdCitmbG9hdDMyeDRfdCB2bWxhcV9uX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBmbG9hdDMyX3QgYyk7IC8vIFZNTEEuRjMyIHEwLCBxMCwgZDBbMF0KKy8vVmVjdG9yIHdpZGVuaW5nIG11bHRpcGx5IGFjY3VtdWxhdGUgd2l0aCBzY2FsYXIKK2ludDMyeDRfdCB2bWxhbF9uX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2X3QgYyk7IC8vIFZNTEFMLlMxNiBxMCwgZDAsIGQwWzBdCitpbnQ2NHgyX3Qgdm1sYWxfbl9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMl90IGMpOyAvLyBWTUxBTC5TMzIgcTAsIGQwLCBkMFswXQordWludDMyeDRfdCB2bWxhbF9uX3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2X3QgYyk7IC8vIFZNTEFMLlUxNiBxMCwgZDAsIGQwWzBdCit1aW50NjR4Ml90IHZtbGFsX25fdTMyKHVpbnQ2NHgyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJfdCBjKTsgLy8gVk1MQUwuVTMyIHEwLCBkMCwgZDBbMF0KKy8vVmVjdG9yIHdpZGVuaW5nIHNhdHVyYXRpbmcgZG91YmxpbmcgbXVsdGlwbHkgYWNjdW11bGF0ZSB3aXRoIHNjYWxhcgoraW50MzJ4NF90IHZxZG1sYWxfbl9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNl90IGMpOyAvLyBWUURNTEFMLlMxNiBxMCwgZDAsIGQwWzBdCitpbnQ2NHgyX3QgdnFkbWxhbF9uX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyX3QgYyk7IC8vIFZRRE1MQUwuUzMyIHEwLCBkMCwgZDBbMF0KKy8vVmVjdG9yIG11bHRpcGx5IHN1YnRyYWN0IHdpdGggc2NhbGFyCitpbnQxNng0X3Qgdm1sc19uX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2X3QgYyk7IC8vIFZNTFMuSTE2IGQwLCBkMCwgZDBbMF0KK2ludDMyeDJfdCB2bWxzX25fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJfdCBjKTsgLy8gVk1MUy5JMzIgZDAsIGQwLCBkMFswXQordWludDE2eDRfdCB2bWxzX25fdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZfdCBjKTsgLy8gVk1MUy5JMTYgZDAsIGQwLCBkMFswXQordWludDMyeDJfdCB2bWxzX25fdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJfdCBjKTsgLy8gVk1MUy5JMzIgZDAsIGQwLCBkMFswXQorZmxvYXQzMngyX3Qgdm1sc19uX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyX3QgYyk7IC8vIFZNTFMuRjMyIGQwLCBkMCwgZDBbMF0KK2ludDE2eDhfdCB2bWxzcV9uX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIGludDE2X3QgYyk7IC8vIFZNTFMuSTE2IHEwLCBxMCwgZDBbMF0KK2ludDMyeDRfdCB2bWxzcV9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIGludDMyX3QgYyk7IC8vIFZNTFMuSTMyIHEwLCBxMCwgZDBbMF0KK3VpbnQxNng4X3Qgdm1sc3Ffbl91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIHVpbnQxNl90IGMpOyAvLyBWTUxTLkkxNiBxMCwgcTAsIGQwWzBdCit1aW50MzJ4NF90IHZtbHNxX25fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiLCB1aW50MzJfdCBjKTsgLy8gVk1MUy5JMzIgcTAsIHEwLCBkMFswXQorZmxvYXQzMng0X3Qgdm1sc3Ffbl9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMl90IGMpOyAvLyBWTUxTLkYzMiBxMCwgcTAsIGQwWzBdCisvL1ZlY3RvciB3aWRlbmluZyBtdWx0aXBseSBzdWJ0cmFjdCB3aXRoIHNjYWxhcgoraW50MzJ4NF90IHZtbHNsX25fczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZfdCBjKTsgLy8gVk1MU0wuUzE2IHEwLCBkMCwgZDBbMF0KK2ludDY0eDJfdCB2bWxzbF9uX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyX3QgYyk7IC8vIFZNTFNMLlMzMiBxMCwgZDAsIGQwWzBdCit1aW50MzJ4NF90IHZtbHNsX25fdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZfdCBjKTsgLy8gVk1MU0wuVTE2IHEwLCBkMCwgZDBbMF0KK3VpbnQ2NHgyX3Qgdm1sc2xfbl91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMl90IGMpOyAvLyBWTUxTTC5VMzIgcTAsIGQwLCBkMFswXQorLy9WZWN0b3Igd2lkZW5pbmcgc2F0dXJhdGluZyBkb3VibGluZyBtdWx0aXBseSBzdWJ0cmFjdCB3aXRoIHNjYWxhcgoraW50MzJ4NF90IHZxZG1sc2xfbl9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNl90IGMpOyAvLyBWUURNTFNMLlMxNiBxMCwgZDAsIGQwWzBdCitpbnQ2NHgyX3QgdnFkbWxzbF9uX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyX3QgYyk7IC8vIFZRRE1MU0wuUzMyIHEwLCBkMCwgZDBbMF0KKy8vVmVjdG9yIGV4dHJhY3QKK2ludDh4OF90IHZleHRfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWRVhULjggZDAsZDAsZDAsIzAKK3VpbnQ4eDhfdCB2ZXh0X3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWRVhULjggZDAsZDAsZDAsIzAKK3BvbHk4eDhfdCB2ZXh0X3A4KHBvbHk4eDhfdCBhLCBwb2x5OHg4X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWRVhULjggZDAsZDAsZDAsIzAKK2ludDE2eDRfdCB2ZXh0X3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDMpIGludCBjKTsgLy8gVkVYVC4xNiBkMCxkMCxkMCwjMAordWludDE2eDRfdCB2ZXh0X3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDAsMykgaW50IGMpOyAvLyBWRVhULjE2IGQwLGQwLGQwLCMwCitwb2x5MTZ4NF90IHZleHRfcDE2KHBvbHkxNng0X3QgYSwgcG9seTE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgYyk7IC8vIFZFWFQuMTYgZDAsZDAsZDAsIzAKK2ludDMyeDJfdCB2ZXh0X3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDEpIGludCBjKTsgLy8gVkVYVC4zMiBkMCxkMCxkMCwjMAordWludDMyeDJfdCB2ZXh0X3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpOyAvLyBWRVhULjMyIGQwLGQwLGQwLCMwCitpbnQ2NHgxX3QgdmV4dF9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgYyk7IC8vIFZFWFQuNjQgZDAsZDAsZDAsIzAKK3VpbnQ2NHgxX3QgdmV4dF91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIsIF9fY29uc3RyYW5nZSgwLDApIGludCBjKTsgLy8gVkVYVC42NCBkMCxkMCxkMCwjMAorZmxvYXQzMngyX3QgdmV4dF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpOyAvLyBWRVhULjMyIGQwLGQwLGQwLCMwCitpbnQ4eDE2X3QgdmV4dHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGMpOyAvLyBWRVhULjggcTAscTAscTAsIzAKK3VpbnQ4eDE2X3QgdmV4dHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYyk7IC8vIFZFWFQuOCBxMCxxMCxxMCwjMAorcG9seTh4MTZfdCB2ZXh0cV9wOChwb2x5OHgxNl90IGEsIHBvbHk4eDE2X3QgYiwgX19jb25zdHJhbmdlKDAsMTUpIGludCBjKTsgLy8gVkVYVC44IHEwLHEwLHEwLCMwCitpbnQxNng4X3QgdmV4dHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWRVhULjE2IHEwLHEwLHEwLCMwCit1aW50MTZ4OF90IHZleHRxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWRVhULjE2IHEwLHEwLHEwLCMwCitwb2x5MTZ4OF90IHZleHRxX3AxNihwb2x5MTZ4OF90IGEsIHBvbHkxNng4X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWRVhULjE2IHEwLHEwLHEwLCMwCitpbnQzMng0X3QgdmV4dHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgX19jb25zdHJhbmdlKDAsMykgaW50IGMpOyAvLyBWRVhULjMyIHEwLHEwLHEwLCMwCit1aW50MzJ4NF90IHZleHRxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgX19jb25zdHJhbmdlKDAsMykgaW50IGMpOyAvLyBWRVhULjMyIHEwLHEwLHEwLCMwCitpbnQ2NHgyX3QgdmV4dHFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpOyAvLyBWRVhULjY0IHEwLHEwLHEwLCMwCit1aW50NjR4Ml90IHZleHRxX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpOyAvLyBWRVhULjY0IHEwLHEwLHEwLCMwCitmbG9hdDMyeDRfdCB2ZXh0cV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgX19jb25zdHJhbmdlKDAsMykgZmxvYXQgYyk7IC8vIFZFWFQuMzIgcTAscTAscTAsIzAKKy8vUmV2ZXJzZSB2ZWN0b3IgZWxlbWVudHMgKHN3YXAgZW5kaWFubmVzcykuIFZSRVZuLm0gcmV2ZXJzZXMgdGhlIG9yZGVyIG9mIHRoZSBtLWJpdCBsYW5lcyB3aXRoaW4gYSBzZXQgdGhhdCBpcyBuIGJpdHMgd2lkZS4KK2ludDh4OF90IHZyZXY2NF9zOChpbnQ4eDhfdCB2ZWMpOyAvLyBWUkVWNjQuOCBkMCxkMAoraW50MTZ4NF90IHZyZXY2NF9zMTYoaW50MTZ4NF90IHZlYyk7IC8vIFZSRVY2NC4xNiBkMCxkMAoraW50MzJ4Ml90IHZyZXY2NF9zMzIoaW50MzJ4Ml90IHZlYyk7IC8vIFZSRVY2NC4zMiBkMCxkMAordWludDh4OF90IHZyZXY2NF91OCh1aW50OHg4X3QgdmVjKTsgLy8gVlJFVjY0LjggZDAsZDAKK3VpbnQxNng0X3QgdnJldjY0X3UxNih1aW50MTZ4NF90IHZlYyk7IC8vIFZSRVY2NC4xNiBkMCxkMAordWludDMyeDJfdCB2cmV2NjRfdTMyKHVpbnQzMngyX3QgdmVjKTsgLy8gVlJFVjY0LjMyIGQwLGQwCitwb2x5OHg4X3QgdnJldjY0X3A4KHBvbHk4eDhfdCB2ZWMpOyAvLyBWUkVWNjQuOCBkMCxkMAorcG9seTE2eDRfdCB2cmV2NjRfcDE2KHBvbHkxNng0X3QgdmVjKTsgLy8gVlJFVjY0LjE2IGQwLGQwCitmbG9hdDMyeDJfdCB2cmV2NjRfZjMyKGZsb2F0MzJ4Ml90IHZlYyk7IC8vIFZSRVY2NC4zMiBkMCxkMAoraW50OHgxNl90IHZyZXY2NHFfczgoaW50OHgxNl90IHZlYyk7IC8vIFZSRVY2NC44IHEwLHEwCitpbnQxNng4X3QgdnJldjY0cV9zMTYoaW50MTZ4OF90IHZlYyk7IC8vIFZSRVY2NC4xNiBxMCxxMAoraW50MzJ4NF90IHZyZXY2NHFfczMyKGludDMyeDRfdCB2ZWMpOyAvLyBWUkVWNjQuMzIgcTAscTAKK3VpbnQ4eDE2X3QgdnJldjY0cV91OCh1aW50OHgxNl90IHZlYyk7IC8vIFZSRVY2NC44IHEwLHEwCit1aW50MTZ4OF90IHZyZXY2NHFfdTE2KHVpbnQxNng4X3QgdmVjKTsgLy8gVlJFVjY0LjE2IHEwLHEwCit1aW50MzJ4NF90IHZyZXY2NHFfdTMyKHVpbnQzMng0X3QgdmVjKTsgLy8gVlJFVjY0LjMyIHEwLHEwCitwb2x5OHgxNl90IHZyZXY2NHFfcDgocG9seTh4MTZfdCB2ZWMpOyAvLyBWUkVWNjQuOCBxMCxxMAorcG9seTE2eDhfdCB2cmV2NjRxX3AxNihwb2x5MTZ4OF90IHZlYyk7IC8vIFZSRVY2NC4xNiBxMCxxMAorZmxvYXQzMng0X3QgdnJldjY0cV9mMzIoZmxvYXQzMng0X3QgdmVjKTsgLy8gVlJFVjY0LjMyIHEwLHEwCitpbnQ4eDhfdCB2cmV2MzJfczgoaW50OHg4X3QgdmVjKTsgLy8gVlJFVjMyLjggZDAsZDAKK2ludDE2eDRfdCB2cmV2MzJfczE2KGludDE2eDRfdCB2ZWMpOyAvLyBWUkVWMzIuMTYgZDAsZDAKK3VpbnQ4eDhfdCB2cmV2MzJfdTgodWludDh4OF90IHZlYyk7IC8vIFZSRVYzMi44IGQwLGQwCit1aW50MTZ4NF90IHZyZXYzMl91MTYodWludDE2eDRfdCB2ZWMpOyAvLyBWUkVWMzIuMTYgZDAsZDAKK3BvbHk4eDhfdCB2cmV2MzJfcDgocG9seTh4OF90IHZlYyk7IC8vIFZSRVYzMi44IGQwLGQwCitwb2x5MTZ4NF90IHZyZXYzMl9wMTYocG9seTE2eDRfdCB2ZWMpOyAvLyBWUkVWMzIuMTYgZDAsZDAKK2ludDh4MTZfdCB2cmV2MzJxX3M4KGludDh4MTZfdCB2ZWMpOyAvLyBWUkVWMzIuOCBxMCxxMAoraW50MTZ4OF90IHZyZXYzMnFfczE2KGludDE2eDhfdCB2ZWMpOyAvLyBWUkVWMzIuMTYgcTAscTAKK3VpbnQ4eDE2X3QgdnJldjMycV91OCh1aW50OHgxNl90IHZlYyk7IC8vIFZSRVYzMi44IHEwLHEwCit1aW50MTZ4OF90IHZyZXYzMnFfdTE2KHVpbnQxNng4X3QgdmVjKTsgLy8gVlJFVjMyLjE2IHEwLHEwCitwb2x5OHgxNl90IHZyZXYzMnFfcDgocG9seTh4MTZfdCB2ZWMpOyAvLyBWUkVWMzIuOCBxMCxxMAorcG9seTE2eDhfdCB2cmV2MzJxX3AxNihwb2x5MTZ4OF90IHZlYyk7IC8vIFZSRVYzMi4xNiBxMCxxMAoraW50OHg4X3QgdnJldjE2X3M4KGludDh4OF90IHZlYyk7IC8vIFZSRVYxNi44IGQwLGQwCit1aW50OHg4X3QgdnJldjE2X3U4KHVpbnQ4eDhfdCB2ZWMpOyAvLyBWUkVWMTYuOCBkMCxkMAorcG9seTh4OF90IHZyZXYxNl9wOChwb2x5OHg4X3QgdmVjKTsgLy8gVlJFVjE2LjggZDAsZDAKK2ludDh4MTZfdCB2cmV2MTZxX3M4KGludDh4MTZfdCB2ZWMpOyAvLyBWUkVWMTYuOCBxMCxxMAordWludDh4MTZfdCB2cmV2MTZxX3U4KHVpbnQ4eDE2X3QgdmVjKTsgLy8gVlJFVjE2LjggcTAscTAKK3BvbHk4eDE2X3QgdnJldjE2cV9wOChwb2x5OHgxNl90IHZlYyk7IC8vIFZSRVYxNi44IHEwLHEwCisvL090aGVyIHNpbmdsZSBvcGVyYW5kIGFyaXRobWV0aWMKKy8vQWJzb2x1dGU6IFZkW2ldID0gfFZhW2ldfAoraW50OHg4X3QgdmFic19zOChpbnQ4eDhfdCBhKTsgLy8gVkFCUy5TOCBkMCxkMAoraW50MTZ4NF90IHZhYnNfczE2KGludDE2eDRfdCBhKTsgLy8gVkFCUy5TMTYgZDAsZDAKK2ludDMyeDJfdCB2YWJzX3MzMihpbnQzMngyX3QgYSk7IC8vIFZBQlMuUzMyIGQwLGQwCitmbG9hdDMyeDJfdCB2YWJzX2YzMihmbG9hdDMyeDJfdCBhKTsgLy8gVkFCUy5GMzIgZDAsZDAKK2ludDh4MTZfdCB2YWJzcV9zOChpbnQ4eDE2X3QgYSk7IC8vIFZBQlMuUzggcTAscTAKK2ludDE2eDhfdCB2YWJzcV9zMTYoaW50MTZ4OF90IGEpOyAvLyBWQUJTLlMxNiBxMCxxMAoraW50MzJ4NF90IHZhYnNxX3MzMihpbnQzMng0X3QgYSk7IC8vIFZBQlMuUzMyIHEwLHEwCitmbG9hdDMyeDRfdCB2YWJzcV9mMzIoZmxvYXQzMng0X3QgYSk7IC8vIFZBQlMuRjMyIHEwLHEwCisvL1NhdHVyYXRpbmcgYWJzb2x1dGU6IFZkW2ldID0gc2F0KHxWYVtpXXwpCitpbnQ4eDhfdCB2cWFic19zOChpbnQ4eDhfdCBhKTsgLy8gVlFBQlMuUzggZDAsZDAKK2ludDE2eDRfdCB2cWFic19zMTYoaW50MTZ4NF90IGEpOyAvLyBWUUFCUy5TMTYgZDAsZDAKK2ludDMyeDJfdCB2cWFic19zMzIoaW50MzJ4Ml90IGEpOyAvLyBWUUFCUy5TMzIgZDAsZDAKK2ludDh4MTZfdCB2cWFic3FfczgoaW50OHgxNl90IGEpOyAvLyBWUUFCUy5TOCBxMCxxMAoraW50MTZ4OF90IHZxYWJzcV9zMTYoaW50MTZ4OF90IGEpOyAvLyBWUUFCUy5TMTYgcTAscTAKK2ludDMyeDRfdCB2cWFic3FfczMyKGludDMyeDRfdCBhKTsgLy8gVlFBQlMuUzMyIHEwLHEwCisvL05lZ2F0ZTogVmRbaV0gPSAtIFZhW2ldCitpbnQ4eDhfdCB2bmVnX3M4KGludDh4OF90IGEpOyAvLyBWTkUvL2QwLGQwCitpbnQxNng0X3Qgdm5lZ19zMTYoaW50MTZ4NF90IGEpOyAvLyBWTkUvL2QwLGQwCitpbnQzMngyX3Qgdm5lZ19zMzIoaW50MzJ4Ml90IGEpOyAvLyBWTkUvL2QwLGQwCitmbG9hdDMyeDJfdCB2bmVnX2YzMihmbG9hdDMyeDJfdCBhKTsgLy8gVk5FLy9kMCxkMAoraW50OHgxNl90IHZuZWdxX3M4KGludDh4MTZfdCBhKTsgLy8gVk5FLy9xMCxxMAoraW50MTZ4OF90IHZuZWdxX3MxNihpbnQxNng4X3QgYSk7IC8vIFZORS8vcTAscTAKK2ludDMyeDRfdCB2bmVncV9zMzIoaW50MzJ4NF90IGEpOyAvLyBWTkUvL3EwLHEwCitmbG9hdDMyeDRfdCB2bmVncV9mMzIoZmxvYXQzMng0X3QgYSk7IC8vIFZORS8vcTAscTAKKy8vU2F0dXJhdGluZyBOZWdhdGU6IHNhdChWZFtpXSA9IC0gVmFbaV0pCitpbnQ4eDhfdCB2cW5lZ19zOChpbnQ4eDhfdCBhKTsgLy8gVlFORS8vZDAsZDAKK2ludDE2eDRfdCB2cW5lZ19zMTYoaW50MTZ4NF90IGEpOyAvLyBWUU5FLy9kMCxkMAoraW50MzJ4Ml90IHZxbmVnX3MzMihpbnQzMngyX3QgYSk7IC8vIFZRTkUvL2QwLGQwCitpbnQ4eDE2X3QgdnFuZWdxX3M4KGludDh4MTZfdCBhKTsgLy8gVlFORS8vcTAscTAKK2ludDE2eDhfdCB2cW5lZ3FfczE2KGludDE2eDhfdCBhKTsgLy8gVlFORS8vcTAscTAKK2ludDMyeDRfdCB2cW5lZ3FfczMyKGludDMyeDRfdCBhKTsgLy8gVlFORS8vcTAscTAKKy8vQ291bnQgbGVhZGluZyBzaWduIGJpdHMKK2ludDh4OF90IHZjbHNfczgoaW50OHg4X3QgYSk7IC8vIFZDTFMuUzggZDAsZDAKK2ludDE2eDRfdCB2Y2xzX3MxNihpbnQxNng0X3QgYSk7IC8vIFZDTFMuUzE2IGQwLGQwCitpbnQzMngyX3QgdmNsc19zMzIoaW50MzJ4Ml90IGEpOyAvLyBWQ0xTLlMzMiBkMCxkMAoraW50OHgxNl90IHZjbHNxX3M4KGludDh4MTZfdCBhKTsgLy8gVkNMUy5TOCBxMCxxMAoraW50MTZ4OF90IHZjbHNxX3MxNihpbnQxNng4X3QgYSk7IC8vIFZDTFMuUzE2IHEwLHEwCitpbnQzMng0X3QgdmNsc3FfczMyKGludDMyeDRfdCBhKTsgLy8gVkNMUy5TMzIgcTAscTAKKy8vQ291bnQgbGVhZGluZyB6ZXJvcworaW50OHg4X3QgdmNsel9zOChpbnQ4eDhfdCBhKTsgLy8gVkNMWi5JOCBkMCxkMAoraW50MTZ4NF90IHZjbHpfczE2KGludDE2eDRfdCBhKTsgLy8gVkNMWi5JMTYgZDAsZDAKK2ludDMyeDJfdCB2Y2x6X3MzMihpbnQzMngyX3QgYSk7IC8vIFZDTFouSTMyIGQwLGQwCit1aW50OHg4X3QgdmNsel91OCh1aW50OHg4X3QgYSk7IC8vIFZDTFouSTggZDAsZDAKK3VpbnQxNng0X3QgdmNsel91MTYodWludDE2eDRfdCBhKTsgLy8gVkNMWi5JMTYgZDAsZDAKK3VpbnQzMngyX3QgdmNsel91MzIodWludDMyeDJfdCBhKTsgLy8gVkNMWi5JMzIgZDAsZDAKK2ludDh4MTZfdCB2Y2x6cV9zOChpbnQ4eDE2X3QgYSk7IC8vIFZDTFouSTggcTAscTAKK2ludDE2eDhfdCB2Y2x6cV9zMTYoaW50MTZ4OF90IGEpOyAvLyBWQ0xaLkkxNiBxMCxxMAoraW50MzJ4NF90IHZjbHpxX3MzMihpbnQzMng0X3QgYSk7IC8vIFZDTFouSTMyIHEwLHEwCit1aW50OHgxNl90IHZjbHpxX3U4KHVpbnQ4eDE2X3QgYSk7IC8vIFZDTFouSTggcTAscTAKK3VpbnQxNng4X3QgdmNsenFfdTE2KHVpbnQxNng4X3QgYSk7IC8vIFZDTFouSTE2IHEwLHEwCit1aW50MzJ4NF90IHZjbHpxX3UzMih1aW50MzJ4NF90IGEpOyAvLyBWQ0xaLkkzMiBxMCxxMAorLy9Db3VudCBudW1iZXIgb2Ygc2V0IGJpdHMKK3VpbnQ4eDhfdCB2Y250X3U4KHVpbnQ4eDhfdCBhKTsgLy8gVkNOVC44IGQwLGQwCitpbnQ4eDhfdCB2Y250X3M4KGludDh4OF90IGEpOyAvLyBWQ05ULjggZDAsZDAKK3BvbHk4eDhfdCB2Y250X3A4KHBvbHk4eDhfdCBhKTsgLy8gVkNOVC44IGQwLGQwCit1aW50OHgxNl90IHZjbnRxX3U4KHVpbnQ4eDE2X3QgYSk7IC8vIFZDTlQuOCBxMCxxMAoraW50OHgxNl90IHZjbnRxX3M4KGludDh4MTZfdCBhKTsgLy8gVkNOVC44IHEwLHEwCitwb2x5OHgxNl90IHZjbnRxX3A4KHBvbHk4eDE2X3QgYSk7IC8vIFZDTlQuOCBxMCxxMAorLy9SZWNpcHJvY2FsIGVzdGltYXRlCitmbG9hdDMyeDJfdCB2cmVjcGVfZjMyKGZsb2F0MzJ4Ml90IGEpOyAvLyBWUkVDUEUuRjMyIGQwLGQwCit1aW50MzJ4Ml90IHZyZWNwZV91MzIodWludDMyeDJfdCBhKTsgLy8gVlJFQ1BFLlUzMiBkMCxkMAorZmxvYXQzMng0X3QgdnJlY3BlcV9mMzIoZmxvYXQzMng0X3QgYSk7IC8vIFZSRUNQRS5GMzIgcTAscTAKK3VpbnQzMng0X3QgdnJlY3BlcV91MzIodWludDMyeDRfdCBhKTsgLy8gVlJFQ1BFLlUzMiBxMCxxMAorLy9SZWNpcHJvY2FsIHNxdWFyZSByb290IGVzdGltYXRlCitmbG9hdDMyeDJfdCB2cnNxcnRlX2YzMihmbG9hdDMyeDJfdCBhKTsgLy8gVlJTUVJURS5GMzIgZDAsZDAKK3VpbnQzMngyX3QgdnJzcXJ0ZV91MzIodWludDMyeDJfdCBhKTsgLy8gVlJTUVJURS5VMzIgZDAsZDAKK2Zsb2F0MzJ4NF90IHZyc3FydGVxX2YzMihmbG9hdDMyeDRfdCBhKTsgLy8gVlJTUVJURS5GMzIgcTAscTAKK3VpbnQzMng0X3QgdnJzcXJ0ZXFfdTMyKHVpbnQzMng0X3QgYSk7IC8vIFZSU1FSVEUuVTMyIHEwLHEwCisvL0xvZ2ljYWwgb3BlcmF0aW9ucworLy9CaXR3aXNlIG5vdAoraW50OHg4X3Qgdm12bl9zOChpbnQ4eDhfdCBhKTsgLy8gVk1WTiBkMCxkMAoraW50MTZ4NF90IHZtdm5fczE2KGludDE2eDRfdCBhKTsgLy8gVk1WTiBkMCxkMAoraW50MzJ4Ml90IHZtdm5fczMyKGludDMyeDJfdCBhKTsgLy8gVk1WTiBkMCxkMAordWludDh4OF90IHZtdm5fdTgodWludDh4OF90IGEpOyAvLyBWTVZOIGQwLGQwCit1aW50MTZ4NF90IHZtdm5fdTE2KHVpbnQxNng0X3QgYSk7IC8vIFZNVk4gZDAsZDAKK3VpbnQzMngyX3Qgdm12bl91MzIodWludDMyeDJfdCBhKTsgLy8gVk1WTiBkMCxkMAorcG9seTh4OF90IHZtdm5fcDgocG9seTh4OF90IGEpOyAvLyBWTVZOIGQwLGQwCitpbnQ4eDE2X3Qgdm12bnFfczgoaW50OHgxNl90IGEpOyAvLyBWTVZOIHEwLHEwCitpbnQxNng4X3Qgdm12bnFfczE2KGludDE2eDhfdCBhKTsgLy8gVk1WTiBxMCxxMAoraW50MzJ4NF90IHZtdm5xX3MzMihpbnQzMng0X3QgYSk7IC8vIFZNVk4gcTAscTAKK3VpbnQ4eDE2X3Qgdm12bnFfdTgodWludDh4MTZfdCBhKTsgLy8gVk1WTiBxMCxxMAordWludDE2eDhfdCB2bXZucV91MTYodWludDE2eDhfdCBhKTsgLy8gVk1WTiBxMCxxMAordWludDMyeDRfdCB2bXZucV91MzIodWludDMyeDRfdCBhKTsgLy8gVk1WTiBxMCxxMAorcG9seTh4MTZfdCB2bXZucV9wOChwb2x5OHgxNl90IGEpOyAvLyBWTVZOIHEwLHEwCisvL0JpdHdpc2UgYW5kCitpbnQ4eDhfdCB2YW5kX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWQU5EIGQwLGQwLGQwCitpbnQxNng0X3QgdmFuZF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkFORCBkMCxkMCxkMAoraW50MzJ4Ml90IHZhbmRfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZBTkQgZDAsZDAsZDAKK2ludDY0eDFfdCB2YW5kX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWQU5EIGQwLGQwLGQwCit1aW50OHg4X3QgdmFuZF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWQU5EIGQwLGQwLGQwCit1aW50MTZ4NF90IHZhbmRfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVkFORCBkMCxkMCxkMAordWludDMyeDJfdCB2YW5kX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZBTkQgZDAsZDAsZDAKK3VpbnQ2NHgxX3QgdmFuZF91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIpOyAvLyBWQU5EIGQwLGQwLGQwCitpbnQ4eDE2X3QgdmFuZHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVkFORCBxMCxxMCxxMAoraW50MTZ4OF90IHZhbmRxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWQU5EIHEwLHEwLHEwCitpbnQzMng0X3QgdmFuZHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZBTkQgcTAscTAscTAKK2ludDY0eDJfdCB2YW5kcV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVkFORCBxMCxxMCxxMAordWludDh4MTZfdCB2YW5kcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZBTkQgcTAscTAscTAKK3VpbnQxNng4X3QgdmFuZHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkFORCBxMCxxMCxxMAordWludDMyeDRfdCB2YW5kcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWQU5EIHEwLHEwLHEwCit1aW50NjR4Ml90IHZhbmRxX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYik7IC8vIFZBTkQgcTAscTAscTAKKy8vQml0d2lzZSBvcgoraW50OHg4X3Qgdm9ycl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVk9SUiBkMCxkMCxkMAoraW50MTZ4NF90IHZvcnJfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZPUlIgZDAsZDAsZDAKK2ludDMyeDJfdCB2b3JyX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWT1JSIGQwLGQwLGQwCitpbnQ2NHgxX3Qgdm9ycl9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVk9SUiBkMCxkMCxkMAordWludDh4OF90IHZvcnJfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVk9SUiBkMCxkMCxkMAordWludDE2eDRfdCB2b3JyX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZPUlIgZDAsZDAsZDAKK3VpbnQzMngyX3Qgdm9ycl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWT1JSIGQwLGQwLGQwCit1aW50NjR4MV90IHZvcnJfdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiKTsgLy8gVk9SUiBkMCxkMCxkMAoraW50OHgxNl90IHZvcnJxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZPUlIgcTAscTAscTAKK2ludDE2eDhfdCB2b3JycV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVk9SUiBxMCxxMCxxMAoraW50MzJ4NF90IHZvcnJxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWT1JSIHEwLHEwLHEwCitpbnQ2NHgyX3Qgdm9ycnFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZPUlIgcTAscTAscTAKK3VpbnQ4eDE2X3Qgdm9ycnFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWT1JSIHEwLHEwLHEwCit1aW50MTZ4OF90IHZvcnJxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZPUlIgcTAscTAscTAKK3VpbnQzMng0X3Qgdm9ycnFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVk9SUiBxMCxxMCxxMAordWludDY0eDJfdCB2b3JycV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpOyAvLyBWT1JSIHEwLHEwLHEwCisvL0JpdHdpc2UgZXhjbHVzaXZlIG9yIChFT1Igb3IgWE9SKQoraW50OHg4X3QgdmVvcl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVkVPUiBkMCxkMCxkMAoraW50MTZ4NF90IHZlb3JfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZFT1IgZDAsZDAsZDAKK2ludDMyeDJfdCB2ZW9yX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWRU9SIGQwLGQwLGQwCitpbnQ2NHgxX3QgdmVvcl9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVkVPUiBkMCxkMCxkMAordWludDh4OF90IHZlb3JfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVkVPUiBkMCxkMCxkMAordWludDE2eDRfdCB2ZW9yX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZFT1IgZDAsZDAsZDAKK3VpbnQzMngyX3QgdmVvcl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWRU9SIGQwLGQwLGQwCit1aW50NjR4MV90IHZlb3JfdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiKTsgLy8gVkVPUiBkMCxkMCxkMAoraW50OHgxNl90IHZlb3JxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZFT1IgcTAscTAscTAKK2ludDE2eDhfdCB2ZW9ycV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkVPUiBxMCxxMCxxMAoraW50MzJ4NF90IHZlb3JxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWRU9SIHEwLHEwLHEwCitpbnQ2NHgyX3QgdmVvcnFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZFT1IgcTAscTAscTAKK3VpbnQ4eDE2X3QgdmVvcnFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWRU9SIHEwLHEwLHEwCit1aW50MTZ4OF90IHZlb3JxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZFT1IgcTAscTAscTAKK3VpbnQzMng0X3QgdmVvcnFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVkVPUiBxMCxxMCxxMAordWludDY0eDJfdCB2ZW9ycV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpOyAvLyBWRU9SIHEwLHEwLHEwCisvL0JpdCBDbGVhcgoraW50OHg4X3QgdmJpY19zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVkJJQyBkMCxkMCxkMAoraW50MTZ4NF90IHZiaWNfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZCSUMgZDAsZDAsZDAKK2ludDMyeDJfdCB2YmljX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWQklDIGQwLGQwLGQwCitpbnQ2NHgxX3QgdmJpY19zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVkJJQyBkMCxkMCxkMAordWludDh4OF90IHZiaWNfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVkJJQyBkMCxkMCxkMAordWludDE2eDRfdCB2YmljX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZCSUMgZDAsZDAsZDAKK3VpbnQzMngyX3QgdmJpY191MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWQklDIGQwLGQwLGQwCit1aW50NjR4MV90IHZiaWNfdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiKTsgLy8gVkJJQyBkMCxkMCxkMAoraW50OHgxNl90IHZiaWNxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZCSUMgcTAscTAscTAKK2ludDE2eDhfdCB2YmljcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkJJQyBxMCxxMCxxMAoraW50MzJ4NF90IHZiaWNxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWQklDIHEwLHEwLHEwCitpbnQ2NHgyX3QgdmJpY3FfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZCSUMgcTAscTAscTAKK3VpbnQ4eDE2X3QgdmJpY3FfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWQklDIHEwLHEwLHEwCit1aW50MTZ4OF90IHZiaWNxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZCSUMgcTAscTAscTAKK3VpbnQzMng0X3QgdmJpY3FfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVkJJQyBxMCxxMCxxMAordWludDY0eDJfdCB2YmljcV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpOyAvLyBWQklDIHEwLHEwLHEwCisvL0JpdHdpc2UgT1IgY29tcGxlbWVudAoraW50OHg4X3Qgdm9ybl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVk9STiBkMCxkMCxkMAoraW50MTZ4NF90IHZvcm5fczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZPUk4gZDAsZDAsZDAKK2ludDMyeDJfdCB2b3JuX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWT1JOIGQwLGQwLGQwCitpbnQ2NHgxX3Qgdm9ybl9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVk9STiBkMCxkMCxkMAordWludDh4OF90IHZvcm5fdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVk9STiBkMCxkMCxkMAordWludDE2eDRfdCB2b3JuX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZPUk4gZDAsZDAsZDAKK3VpbnQzMngyX3Qgdm9ybl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWT1JOIGQwLGQwLGQwCit1aW50NjR4MV90IHZvcm5fdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiKTsgLy8gVk9STiBkMCxkMCxkMAoraW50OHgxNl90IHZvcm5xX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZPUk4gcTAscTAscTAKK2ludDE2eDhfdCB2b3JucV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVk9STiBxMCxxMCxxMAoraW50MzJ4NF90IHZvcm5xX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWT1JOIHEwLHEwLHEwCitpbnQ2NHgyX3Qgdm9ybnFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZPUk4gcTAscTAscTAKK3VpbnQ4eDE2X3Qgdm9ybnFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWT1JOIHEwLHEwLHEwCit1aW50MTZ4OF90IHZvcm5xX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZPUk4gcTAscTAscTAKK3VpbnQzMng0X3Qgdm9ybnFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVk9STiBxMCxxMCxxMAordWludDY0eDJfdCB2b3JucV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpOyAvLyBWT1JOIHEwLHEwLHEwCisvL0JpdHdpc2UgU2VsZWN0CitpbnQ4eDhfdCB2YnNsX3M4KHVpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiLCBpbnQ4eDhfdCBjKTsgLy8gVkJTTCBkMCxkMCxkMAoraW50MTZ4NF90IHZic2xfczE2KHVpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCBjKTsgLy8gVkJTTCBkMCxkMCxkMAoraW50MzJ4Ml90IHZic2xfczMyKHVpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKTsgLy8gVkJTTCBkMCxkMCxkMAoraW50NjR4MV90IHZic2xfczY0KHVpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIsIGludDY0eDFfdCBjKTsgLy8gVkJTTCBkMCxkMCxkMAordWludDh4OF90IHZic2xfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiLCB1aW50OHg4X3QgYyk7IC8vIFZCU0wgZDAsZDAsZDAKK3VpbnQxNng0X3QgdmJzbF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgYyk7IC8vIFZCU0wgZDAsZDAsZDAKK3VpbnQzMngyX3QgdmJzbF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMngyX3QgYyk7IC8vIFZCU0wgZDAsZDAsZDAKK3VpbnQ2NHgxX3QgdmJzbF91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIsIHVpbnQ2NHgxX3QgYyk7IC8vIFZCU0wgZDAsZDAsZDAKK2Zsb2F0MzJ4Ml90IHZic2xfZjMyKHVpbnQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgZmxvYXQzMngyX3QgYyk7IC8vIFZCU0wgZDAsZDAsZDAKK3BvbHk4eDhfdCB2YnNsX3A4KHVpbnQ4eDhfdCBhLCBwb2x5OHg4X3QgYiwgcG9seTh4OF90IGMpOyAvLyBWQlNMIGQwLGQwLGQwCitwb2x5MTZ4NF90IHZic2xfcDE2KHVpbnQxNng0X3QgYSwgcG9seTE2eDRfdCBiLCBwb2x5MTZ4NF90IGMpOyAvLyBWQlNMIGQwLGQwLGQwCitpbnQ4eDE2X3QgdmJzbHFfczgodWludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYiwgaW50OHgxNl90IGMpOyAvLyBWQlNMIHEwLHEwLHEwCitpbnQxNng4X3QgdmJzbHFfczE2KHVpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDhfdCBjKTsgLy8gVkJTTCBxMCxxMCxxMAoraW50MzJ4NF90IHZic2xxX3MzMih1aW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBpbnQzMng0X3QgYyk7IC8vIFZCU0wgcTAscTAscTAKK2ludDY0eDJfdCB2YnNscV9zNjQodWludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYiwgaW50NjR4Ml90IGMpOyAvLyBWQlNMIHEwLHEwLHEwCit1aW50OHgxNl90IHZic2xxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiLCB1aW50OHgxNl90IGMpOyAvLyBWQlNMIHEwLHEwLHEwCit1aW50MTZ4OF90IHZic2xxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2eDhfdCBjKTsgLy8gVkJTTCBxMCxxMCxxMAordWludDMyeDRfdCB2YnNscV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMng0X3QgYyk7IC8vIFZCU0wgcTAscTAscTAKK3VpbnQ2NHgyX3QgdmJzbHFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiLCB1aW50NjR4Ml90IGMpOyAvLyBWQlNMIHEwLHEwLHEwCitmbG9hdDMyeDRfdCB2YnNscV9mMzIodWludDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBmbG9hdDMyeDRfdCBjKTsgLy8gVkJTTCBxMCxxMCxxMAorcG9seTh4MTZfdCB2YnNscV9wOCh1aW50OHgxNl90IGEsIHBvbHk4eDE2X3QgYiwgcG9seTh4MTZfdCBjKTsgLy8gVkJTTCBxMCxxMCxxMAorcG9seTE2eDhfdCB2YnNscV9wMTYodWludDE2eDhfdCBhLCBwb2x5MTZ4OF90IGIsIHBvbHkxNng4X3QgYyk7IC8vIFZCU0wgcTAscTAscTAKKy8vVHJhbnNwb3NpdGlvbiBvcGVyYXRpb25zCisvL1RyYW5zcG9zZSBlbGVtZW50cworaW50OHg4eDJfdCB2dHJuX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWVFJOLjggZDAsZDAKK2ludDE2eDR4Ml90IHZ0cm5fczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZUUk4uMTYgZDAsZDAKK2ludDMyeDJ4Ml90IHZ0cm5fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZUUk4uMzIgZDAsZDAKK3VpbnQ4eDh4Ml90IHZ0cm5fdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlRSTi44IGQwLGQwCit1aW50MTZ4NHgyX3QgdnRybl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWVFJOLjE2IGQwLGQwCit1aW50MzJ4MngyX3QgdnRybl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWVFJOLjMyIGQwLGQwCitmbG9hdDMyeDJ4Ml90IHZ0cm5fZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWVFJOLjMyIGQwLGQwCitwb2x5OHg4eDJfdCB2dHJuX3A4KHBvbHk4eDhfdCBhLCBwb2x5OHg4X3QgYik7IC8vIFZUUk4uOCBkMCxkMAorcG9seTE2eDR4Ml90IHZ0cm5fcDE2KHBvbHkxNng0X3QgYSwgcG9seTE2eDRfdCBiKTsgLy8gVlRSTi4xNiBkMCxkMAoraW50OHgxNngyX3QgdnRybnFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlRSTi44IHEwLHEwCitpbnQxNng4eDJfdCB2dHJucV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlRSTi4xNiBxMCxxMAoraW50MzJ4NHgyX3QgdnRybnFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZUUk4uMzIgcTAscTAKK3VpbnQ4eDE2eDJfdCB2dHJucV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZUUk4uOCBxMCxxMAordWludDE2eDh4Ml90IHZ0cm5xX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZUUk4uMTYgcTAscTAKK3VpbnQzMng0eDJfdCB2dHJucV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWVFJOLjMyIHEwLHEwCitmbG9hdDMyeDR4Ml90IHZ0cm5xX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVlRSTi4zMiBxMCxxMAorcG9seTh4MTZ4Ml90IHZ0cm5xX3A4KHBvbHk4eDE2X3QgYSwgcG9seTh4MTZfdCBiKTsgLy8gVlRSTi44IHEwLHEwCitwb2x5MTZ4OHgyX3QgdnRybnFfcDE2KHBvbHkxNng4X3QgYSwgcG9seTE2eDhfdCBiKTsgLy8gVlRSTi4xNiBxMCxxMAorLy9JbnRlcmxlYXZlIGVsZW1lbnRzCitpbnQ4eDh4Ml90IHZ6aXBfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZaSVAuOCBkMCxkMAoraW50MTZ4NHgyX3QgdnppcF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlpJUC4xNiBkMCxkMAoraW50MzJ4MngyX3QgdnppcF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlpJUC4zMiBkMCxkMAordWludDh4OHgyX3QgdnppcF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWWklQLjggZDAsZDAKK3VpbnQxNng0eDJfdCB2emlwX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZaSVAuMTYgZDAsZDAKK3VpbnQzMngyeDJfdCB2emlwX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZaSVAuMzIgZDAsZDAKK2Zsb2F0MzJ4MngyX3QgdnppcF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZaSVAuMzIgZDAsZDAKK3BvbHk4eDh4Ml90IHZ6aXBfcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiKTsgLy8gVlpJUC44IGQwLGQwCitwb2x5MTZ4NHgyX3QgdnppcF9wMTYocG9seTE2eDRfdCBhLCBwb2x5MTZ4NF90IGIpOyAvLyBWWklQLjE2IGQwLGQwCitpbnQ4eDE2eDJfdCB2emlwcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWWklQLjggcTAscTAKK2ludDE2eDh4Ml90IHZ6aXBxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWWklQLjE2IHEwLHEwCitpbnQzMng0eDJfdCB2emlwcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlpJUC4zMiBxMCxxMAordWludDh4MTZ4Ml90IHZ6aXBxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVlpJUC44IHEwLHEwCit1aW50MTZ4OHgyX3QgdnppcHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVlpJUC4xNiBxMCxxMAordWludDMyeDR4Ml90IHZ6aXBxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZaSVAuMzIgcTAscTAKK2Zsb2F0MzJ4NHgyX3QgdnppcHFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWWklQLjMyIHEwLHEwCitwb2x5OHgxNngyX3QgdnppcHFfcDgocG9seTh4MTZfdCBhLCBwb2x5OHgxNl90IGIpOyAvLyBWWklQLjggcTAscTAKK3BvbHkxNng4eDJfdCB2emlwcV9wMTYocG9seTE2eDhfdCBhLCBwb2x5MTZ4OF90IGIpOyAvLyBWWklQLjE2IHEwLHEwCisvL0RlLUludGVybGVhdmUgZWxlbWVudHMKK2ludDh4OHgyX3QgdnV6cF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlVaUC44IGQwLGQwCitpbnQxNng0eDJfdCB2dXpwX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWVVpQLjE2IGQwLGQwCitpbnQzMngyeDJfdCB2dXpwX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWVVpQLjMyIGQwLGQwCit1aW50OHg4eDJfdCB2dXpwX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZVWlAuOCBkMCxkMAordWludDE2eDR4Ml90IHZ1enBfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlVaUC4xNiBkMCxkMAordWludDMyeDJ4Ml90IHZ1enBfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVlVaUC4zMiBkMCxkMAorZmxvYXQzMngyeDJfdCB2dXpwX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVlVaUC4zMiBkMCxkMAorcG9seTh4OHgyX3QgdnV6cF9wOChwb2x5OHg4X3QgYSwgcG9seTh4OF90IGIpOyAvLyBWVVpQLjggZDAsZDAKK3BvbHkxNng0eDJfdCB2dXpwX3AxNihwb2x5MTZ4NF90IGEsIHBvbHkxNng0X3QgYik7IC8vIFZVWlAuMTYgZDAsZDAKK2ludDh4MTZ4Ml90IHZ1enBxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZVWlAuOCBxMCxxMAoraW50MTZ4OHgyX3QgdnV6cHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZVWlAuMTYgcTAscTAKK2ludDMyeDR4Ml90IHZ1enBxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWVVpQLjMyIHEwLHEwCit1aW50OHgxNngyX3QgdnV6cHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWVVpQLjggcTAscTAKK3VpbnQxNng4eDJfdCB2dXpwcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWVVpQLjE2IHEwLHEwCit1aW50MzJ4NHgyX3QgdnV6cHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVlVaUC4zMiBxMCxxMAorZmxvYXQzMng0eDJfdCB2dXpwcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZVWlAuMzIgcTAscTAKK3BvbHk4eDE2eDJfdCB2dXpwcV9wOChwb2x5OHgxNl90IGEsIHBvbHk4eDE2X3QgYik7IC8vIFZVWlAuOCBxMCxxMAorcG9seTE2eDh4Ml90IHZ1enBxX3AxNihwb2x5MTZ4OF90IGEsIHBvbHkxNng4X3QgYik7IC8vIFZVWlAuMTYgcTAscTAKKworCisvL15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorLy8gdGhlIGZvbGxvd2luZyBtYWNyb3Mgc29sdmUgdGhlIHByb2JsZW0gb2YgdGhlICJpbW1lZGlhdGUgcGFyYW1ldGVycyByZXF1aXJlbWVudCIgZm9yIHNvbWUgeDg2IGludHJpbnNpY3MuIFdoaWxlIGZvciByZWxlYXNlIGJ1aWxkIGl0IGlzIG5vdCBhIG11c3QsCisvL2ZvciBkZWJ1ZyBidWlsZCB3ZSBuZWVkIGl0IHRvIGNvbXBpbGUgdGhlIGNvZGUgdW5sZXNzIHRoZSAiSW50cmluc2ljIHBhcmFtZXRlciBtdXN0IGJlIGFuIGltbWVkaWF0ZSB2YWx1ZSIgZXJyb3IgaXMgb3VyIGdvYWwKKy8vCisjaWYgKCAoKGRlZmluZWQgX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+IDE2MDApKSB8fCBkZWZpbmVkIChfX0lOVEVMX0NPTVBJTEVSKSApJiYgZGVmaW5lZCBOREVCVUcgICAgIC8vaWYgaXQgaXMgYSByZWxlYXNlIGJ1aWxkLCB3ZSBhbHNvIG5lZWQgaXQgdG8gZml4IHRoZSBpc3N1ZSBmb3IgVlMyMDEwIGFuZCBlYXJsaWVyIGNvbXBpbGVycy4KKworICAgICNkZWZpbmUgX01NX0FMSUdOUl9FUEk4IF9tbV9hbGlnbnJfZXBpOAorCisgICAgI2RlZmluZSBfTU1fRVhUUkFDVF9FUEkxNiAgX21tX2V4dHJhY3RfZXBpMTYKKyAgICAjZGVmaW5lIF9NTV9JTlNFUlRfRVBJMTYgX21tX2luc2VydF9lcGkxNgorI2lmZGVmIFVTRV9TU0U0CisgICAgICAgICNkZWZpbmUgX01NX0VYVFJBQ1RfRVBJOCAgX21tX2V4dHJhY3RfZXBpOAorICAgICAgICAjZGVmaW5lIF9NTV9FWFRSQUNUX0VQSTMyICBfbW1fZXh0cmFjdF9lcGkzMgorICAgICAgICAjZGVmaW5lIF9NTV9FWFRSQUNUX1BTICBfbW1fZXh0cmFjdF9wcworCisgICAgICAgICNkZWZpbmUgX01NX0lOU0VSVF9FUEk4ICBfbW1faW5zZXJ0X2VwaTgKKyAgICAgICAgI2RlZmluZSBfTU1fSU5TRVJUX0VQSTMyIF9tbV9pbnNlcnRfZXBpMzIKKyAgICAgICAgI2RlZmluZSBfTU1fSU5TRVJUX1BTICAgIF9tbV9pbnNlcnRfcHMKKyNpZmRlZiAgX05FT04yU1NFXzY0QklUCisgICAgICAgICAgICAjZGVmaW5lIF9NTV9JTlNFUlRfRVBJNjQgX21tX2luc2VydF9lcGk2NAorICAgICAgICAgICAgI2RlZmluZSBfTU1fRVhUUkFDVF9FUEk2NCBfbW1fZXh0cmFjdF9lcGk2NAorI2VuZGlmCisjZW5kaWYgLy9TU0U0CisjZWxzZQorICAgICNkZWZpbmUgX05FT04yU1NFX0NPTU1BICwKKyAgICAjZGVmaW5lIF9ORU9OMlNTRV9TV0lUQ0gxNihOQU1FLCBhLCBiLCBMQU5FKSBcCisgICAgICAgICAgICBzd2l0Y2goTEFORSkgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIDA6ICAgICByZXR1cm4gTkFNRShhIGIsIDApOyBcCisgICAgICAgIGNhc2UgMTogICAgIHJldHVybiBOQU1FKGEgYiwgMSk7IFwKKyAgICAgICAgY2FzZSAyOiAgICAgcmV0dXJuIE5BTUUoYSBiLCAyKTsgXAorICAgICAgICBjYXNlIDM6ICAgICByZXR1cm4gTkFNRShhIGIsIDMpOyBcCisgICAgICAgIGNhc2UgNDogICAgIHJldHVybiBOQU1FKGEgYiwgNCk7IFwKKyAgICAgICAgY2FzZSA1OiAgICAgcmV0dXJuIE5BTUUoYSBiLCA1KTsgXAorICAgICAgICBjYXNlIDY6ICAgICByZXR1cm4gTkFNRShhIGIsIDYpOyBcCisgICAgICAgIGNhc2UgNzogICAgIHJldHVybiBOQU1FKGEgYiwgNyk7IFwKKyAgICAgICAgY2FzZSA4OiAgICAgcmV0dXJuIE5BTUUoYSBiLCA4KTsgXAorICAgICAgICBjYXNlIDk6ICAgICByZXR1cm4gTkFNRShhIGIsIDkpOyBcCisgICAgICAgIGNhc2UgMTA6ICAgIHJldHVybiBOQU1FKGEgYiwgMTApOyBcCisgICAgICAgIGNhc2UgMTE6ICAgIHJldHVybiBOQU1FKGEgYiwgMTEpOyBcCisgICAgICAgIGNhc2UgMTI6ICAgIHJldHVybiBOQU1FKGEgYiwgMTIpOyBcCisgICAgICAgIGNhc2UgMTM6ICAgIHJldHVybiBOQU1FKGEgYiwgMTMpOyBcCisgICAgICAgIGNhc2UgMTQ6ICAgIHJldHVybiBOQU1FKGEgYiwgMTQpOyBcCisgICAgICAgIGNhc2UgMTU6ICAgIHJldHVybiBOQU1FKGEgYiwgMTUpOyBcCisgICAgICAgIGRlZmF1bHQ6ICAgIHJldHVybiBOQU1FKGEgYiwgMCk7IFwKKyAgICAgICAgfQorCisgICAgI2RlZmluZSBfTkVPTjJTU0VfU1dJVENIOChOQU1FLCB2ZWMsIExBTkUsIHApIFwKKyAgICAgICAgICAgIHN3aXRjaChMQU5FKSAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgMDogIHJldHVybiBOQU1FKHZlYyBwLDApOyBcCisgICAgICAgIGNhc2UgMTogIHJldHVybiBOQU1FKHZlYyBwLDEpOyBcCisgICAgICAgIGNhc2UgMjogIHJldHVybiBOQU1FKHZlYyBwLDIpOyBcCisgICAgICAgIGNhc2UgMzogIHJldHVybiBOQU1FKHZlYyBwLDMpOyBcCisgICAgICAgIGNhc2UgNDogIHJldHVybiBOQU1FKHZlYyBwLDQpOyBcCisgICAgICAgIGNhc2UgNTogIHJldHVybiBOQU1FKHZlYyBwLDUpOyBcCisgICAgICAgIGNhc2UgNjogIHJldHVybiBOQU1FKHZlYyBwLDYpOyBcCisgICAgICAgIGNhc2UgNzogIHJldHVybiBOQU1FKHZlYyBwLDcpOyBcCisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBOQU1FKHZlYyBwLDApOyBcCisgICAgICAgIH0KKworICAgICNkZWZpbmUgX05FT04yU1NFX1NXSVRDSDQoTkFNRSwgY2FzZTAsIGNhc2UxLCBjYXNlMiwgY2FzZTMsIHZlYywgTEFORSwgcCkgXAorICAgICAgICAgICAgc3dpdGNoKExBTkUpICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBjYXNlMDogIHJldHVybiBOQU1FKHZlYyBwLGNhc2UwKTsgXAorICAgICAgICBjYXNlIGNhc2UxOiAgcmV0dXJuIE5BTUUodmVjIHAsY2FzZTEpOyBcCisgICAgICAgIGNhc2UgY2FzZTI6ICByZXR1cm4gTkFNRSh2ZWMgcCxjYXNlMik7IFwKKyAgICAgICAgY2FzZSBjYXNlMzogIHJldHVybiBOQU1FKHZlYyBwLGNhc2UzKTsgXAorICAgICAgICBkZWZhdWx0OiAgICAgcmV0dXJuIE5BTUUodmVjIHAsY2FzZTApOyBcCisgICAgICAgIH0KKworICAgIF9ORU9OMlNTRV9JTkxJTkUgX19tMTI4aSBfTU1fQUxJR05SX0VQSTgoX19tMTI4aSBhLCBfX20xMjhpIGIsIGludCBMQU5FKQorICAgIHsKKyAgICAgICAgX05FT04yU1NFX1NXSVRDSDE2KF9tbV9hbGlnbnJfZXBpOCwgYSwgX05FT04yU1NFX0NPTU1BIGIsIExBTkUpCisgICAgfQorCisgICAgX05FT04yU1NFX0lOTElORSBfX20xMjhpICBfTU1fSU5TRVJUX0VQSTE2KF9fbTEyOGkgdmVjLCBpbnQgcCwgY29uc3QgaW50IExBTkUpCisgICAgeworICAgICAgICBfTkVPTjJTU0VfU1dJVENIOChfbW1faW5zZXJ0X2VwaTE2LCB2ZWMsIExBTkUsIF9ORU9OMlNTRV9DT01NQSBwKQorICAgIH0KKworICAgIF9ORU9OMlNTRV9JTkxJTkUgaW50IF9NTV9FWFRSQUNUX0VQSTE2KF9fbTEyOGkgdmVjLCBjb25zdCBpbnQgTEFORSkKKyAgICB7CisgICAgICAgIF9ORU9OMlNTRV9TV0lUQ0g4KF9tbV9leHRyYWN0X2VwaTE2LCB2ZWMsIExBTkUsKQorICAgIH0KKworI2lmZGVmIFVTRV9TU0U0CisgICAgICAgIF9ORU9OMlNTRV9JTkxJTkUgaW50IF9NTV9FWFRSQUNUX0VQSTMyKF9fbTEyOGkgdmVjLCBjb25zdCBpbnQgTEFORSkKKyAgICAgICAgeworICAgICAgICAgICAgX05FT04yU1NFX1NXSVRDSDQoX21tX2V4dHJhY3RfZXBpMzIsIDAsMSwyLDMsIHZlYywgTEFORSwpCisgICAgICAgIH0KKworICAgICAgICBfTkVPTjJTU0VfSU5MSU5FIGludCBfTU1fRVhUUkFDVF9QUyhfX20xMjggdmVjLCBjb25zdCBpbnQgTEFORSkKKyAgICAgICAgeworICAgICAgICAgICAgX05FT04yU1NFX1NXSVRDSDQoX21tX2V4dHJhY3RfcHMsIDAsMSwyLDMsIHZlYywgTEFORSwpCisgICAgICAgIH0KKworICAgICAgICBfTkVPTjJTU0VfSU5MSU5FIGludCBfTU1fRVhUUkFDVF9FUEk4KF9fbTEyOGkgdmVjLCBjb25zdCBpbnQgTEFORSkKKyAgICAgICAgeworICAgICAgICAgICAgX05FT04yU1NFX1NXSVRDSDE2KF9tbV9leHRyYWN0X2VwaTgsIHZlYywgLCBMQU5FKQorICAgICAgICB9CisKKyAgICAgICAgX05FT04yU1NFX0lOTElORSBfX20xMjhpICBfTU1fSU5TRVJUX0VQSTMyKF9fbTEyOGkgdmVjLCBpbnQgcCwgY29uc3QgaW50IExBTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9ORU9OMlNTRV9TV0lUQ0g0KF9tbV9pbnNlcnRfZXBpMzIsIDAsIDEsIDIsIDMsIHZlYywgTEFORSwgX05FT04yU1NFX0NPTU1BIHApCisgICAgICAgIH0KKworICAgICAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgIF9NTV9JTlNFUlRfRVBJOChfX20xMjhpIHZlYywgaW50IHAsIGNvbnN0IGludCBMQU5FKQorICAgICAgICB7CisgICAgICAgICAgICBfTkVPTjJTU0VfU1dJVENIMTYoX21tX2luc2VydF9lcGk4LCB2ZWMsIF9ORU9OMlNTRV9DT01NQSBwLCBMQU5FKQorICAgICAgICB9CisKKyNpZmRlZiAgX05FT04yU1NFXzY0QklUCisgICAgICAgICAgICAvL3RoZSBzcGVjaWFsIGNhc2Ugb2YgZnVuY3Rpb25zIGF2YWlsYWJsZSBvbmx5IGZvciBTU0U0IGFuZCA2NC1iaXQgYnVpbGQuCisgICAgICAgICAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgIF9NTV9JTlNFUlRfRVBJNjQoX19tMTI4aSB2ZWMsIGludCBwLCBjb25zdCBpbnQgTEFORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2goTEFORSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9tbV9pbnNlcnRfZXBpNjQodmVjLCAgcCwgMCk7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX21tX2luc2VydF9lcGk2NCh2ZWMsICBwLCAxKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX21tX2luc2VydF9lcGk2NCh2ZWMsICBwLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9ORU9OMlNTRV9JTkxJTkUgaW50NjRfdCBfTU1fRVhUUkFDVF9FUEk2NChfX20xMjhpIHZhbCwgY29uc3QgaW50IExBTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKExBTkUgPT0wKSByZXR1cm4gX21tX2V4dHJhY3RfZXBpNjQodmFsLCAwKTsKKyAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBfbW1fZXh0cmFjdF9lcGk2NCh2YWwsIDEpOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgX05FT04yU1NFX0lOTElORSBfX20xMjggX01NX0lOU0VSVF9QUyhfX20xMjggdmVjLCBfX20xMjggcCwgY29uc3QgaW50IExBTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9ORU9OMlNTRV9TV0lUQ0g0KF9tbV9pbnNlcnRfcHMsIDAsIDE2LCAzMiwgNDgsIHZlYywgTEFORSwgX05FT04yU1NFX0NPTU1BIHApCisgICAgICAgIH0KKworI2VuZGlmIC8vVVNFX1NTRTQKKworI2VuZGlmICAgICAvLyNpZmRlZiBOREVCVUcKKworLy9+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorLy8gQmVsb3cgYXJlIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyB1c2VkIGVpdGhlciBmb3IgU1NFNCBpbnRyaW5zaWNzICJlbXVsYXRpb24iIGZvciBTU1NFMyBsaW1pdGVkIGRldmljZXMKKy8vIG9yIGZvciBzb21lIHNwZWNpZmljIGNvbW1vbmx5IHVzZWQgb3BlcmF0aW9ucyBpbXBsZW1lbnRhdGlvbiBtaXNzaW5nIGluIFNTRQorI2lmZGVmIFVTRV9TU0U0CisgICAgI2RlZmluZSBfTU1fQ1ZURVBVOF9FUEkxNiAgX21tX2N2dGVwdThfZXBpMTYKKyAgICAjZGVmaW5lIF9NTV9DVlRFUFUxNl9FUEkzMiBfbW1fY3Z0ZXB1MTZfZXBpMzIKKyAgICAjZGVmaW5lIF9NTV9DVlRFUFUzMl9FUEk2NCAgX21tX2N2dGVwdTMyX2VwaTY0CisKKyAgICAjZGVmaW5lIF9NTV9DVlRFUEk4X0VQSTE2ICBfbW1fY3Z0ZXBpOF9lcGkxNgorICAgICNkZWZpbmUgX01NX0NWVEVQSTE2X0VQSTMyIF9tbV9jdnRlcGkxNl9lcGkzMgorICAgICNkZWZpbmUgX01NX0NWVEVQSTMyX0VQSTY0ICBfbW1fY3Z0ZXBpMzJfZXBpNjQKKworICAgICNkZWZpbmUgX01NX01BWF9FUEk4ICBfbW1fbWF4X2VwaTgKKyAgICAjZGVmaW5lIF9NTV9NQVhfRVBJMzIgX21tX21heF9lcGkzMgorICAgICNkZWZpbmUgX01NX01BWF9FUFUxNiBfbW1fbWF4X2VwdTE2CisgICAgI2RlZmluZSBfTU1fTUFYX0VQVTMyIF9tbV9tYXhfZXB1MzIKKworICAgICNkZWZpbmUgX01NX01JTl9FUEk4ICBfbW1fbWluX2VwaTgKKyAgICAjZGVmaW5lIF9NTV9NSU5fRVBJMzIgX21tX21pbl9lcGkzMgorICAgICNkZWZpbmUgX01NX01JTl9FUFUxNiBfbW1fbWluX2VwdTE2CisgICAgI2RlZmluZSBfTU1fTUlOX0VQVTMyIF9tbV9taW5fZXB1MzIKKworICAgICNkZWZpbmUgX01NX0JMRU5EVl9FUEk4IF9tbV9ibGVuZHZfZXBpOAorICAgICNkZWZpbmUgX01NX1BBQ0tVU19FUEkzMiBfbW1fcGFja3VzX2VwaTMyCisgICAgI2RlZmluZSBfTU1fUEFDS1VTMV9FUEkzMihhKSBfbW1fcGFja3VzX2VwaTMyKGEsIGEpCisKKyAgICAjZGVmaW5lIF9NTV9NVUxMT19FUEkzMiBfbW1fbXVsbG9fZXBpMzIKKyAgICAjZGVmaW5lIF9NTV9NVUxfRVBJMzIgIF9tbV9tdWxfZXBpMzIKKworICAgICNkZWZpbmUgX01NX0NNUEVRX0VQSTY0IF9tbV9jbXBlcV9lcGk2NAorI2Vsc2UgICAgIC8vbm8gU1NFNCAhISEhISEKKyAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgX01NX0NWVEVQVThfRVBJMTYoX19tMTI4aSBhKQorICAgIHsKKyAgICAgICAgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICAgICAgcmV0dXJuIF9tbV91bnBhY2tsb19lcGk4KGEsIHplcm8pOworICAgIH0KKworICAgIF9ORU9OMlNTRV9JTkxJTkUgX19tMTI4aSBfTU1fQ1ZURVBVMTZfRVBJMzIoX19tMTI4aSBhKQorICAgIHsKKyAgICAgICAgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICAgICAgcmV0dXJuIF9tbV91bnBhY2tsb19lcGkxNihhLCB6ZXJvKTsKKyAgICB9CisKKyAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgX01NX0NWVEVQVTMyX0VQSTY0KF9fbTEyOGkgYSkKKyAgICB7CisgICAgICAgIF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgICAgIHJldHVybiBfbW1fdW5wYWNrbG9fZXBpMzIoYSwgemVybyk7CisgICAgfQorCisgICAgX05FT04yU1NFX0lOTElORSBfX20xMjhpIF9NTV9DVlRFUEk4X0VQSTE2KF9fbTEyOGkgYSkKKyAgICB7CisgICAgICAgIF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgICAgIF9fbTEyOGkgc2lnbiA9IF9tbV9jbXBndF9lcGk4KHplcm8sIGEpOworICAgICAgICByZXR1cm4gX21tX3VucGFja2xvX2VwaTgoYSwgc2lnbik7CisgICAgfQorCisgICAgX05FT04yU1NFX0lOTElORSBfX20xMjhpIF9NTV9DVlRFUEkxNl9FUEkzMihfX20xMjhpIGEpCisgICAgeworICAgICAgICBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgICAgICBfX20xMjhpIHNpZ24gPSBfbW1fY21wZ3RfZXBpMTYoemVybywgYSk7CisgICAgICAgIHJldHVybiBfbW1fdW5wYWNrbG9fZXBpMTYoYSwgc2lnbik7CisgICAgfQorCisgICAgX05FT04yU1NFX0lOTElORSBfX20xMjhpIF9NTV9DVlRFUEkzMl9FUEk2NChfX20xMjhpIGEpCisgICAgeworICAgICAgICBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgICAgICBfX20xMjhpIHNpZ24gPSBfbW1fY21wZ3RfZXBpMzIoemVybywgYSk7CisgICAgICAgIHJldHVybiBfbW1fdW5wYWNrbG9fZXBpMzIoYSwgc2lnbik7CisgICAgfQorCisgICAgX05FT04yU1NFX0lOTElORSBpbnQgX01NX0VYVFJBQ1RfRVBJMzIoX19tMTI4aSB2ZWMsIGNvbnN0IGludCBMQU5FKQorICAgIHsKKyAgICAgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDMyX3QgdG1wWzRdOworICAgICAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKXRtcCwgdmVjKTsKKyAgICAgICAgcmV0dXJuIHRtcFtMQU5FXTsKKyAgICB9CisKKyAgICBfTkVPTjJTU0VfSU5MSU5FIGludCBfTU1fRVhUUkFDVF9FUEk4KF9fbTEyOGkgdmVjLCBjb25zdCBpbnQgTEFORSkKKyAgICB7CisgICAgICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgdG1wWzE2XTsKKyAgICAgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKil0bXAsIHZlYyk7CisgICAgICAgIHJldHVybiAoaW50KXRtcFtMQU5FXTsKKyAgICB9CisKKyAgICBfTkVPTjJTU0VfSU5MSU5FIGludCBfTU1fRVhUUkFDVF9QUyhfX20xMjggdmVjLCBjb25zdCBpbnQgTEFORSkKKyAgICB7CisgICAgICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQzMl90IHRtcFs0XTsKKyAgICAgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKil0bXAsIF9NMTI4aSh2ZWMpKTsKKyAgICAgICAgcmV0dXJuIHRtcFtMQU5FXTsKKyAgICB9CisKKyAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgIF9NTV9JTlNFUlRfRVBJMzIoX19tMTI4aSB2ZWMsIGludCBwLCBjb25zdCBpbnQgTEFORSkKKyAgICB7CisgICAgICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQzMl90IHB2ZWNbNF0gPSB7MCwwLDAsMH07CisgICAgICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50MzJfdCBtYXNrWzRdID0gezB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwweGZmZmZmZmZmLDB4ZmZmZmZmZmZ9OworICAgICAgICBfX20xMjhpIHZlY19tYXNrZWQsIHBfbWFza2VkOworICAgICAgICBwdmVjW0xBTkVdID0gcDsKKyAgICAgICAgbWFza1tMQU5FXSA9IDB4MDsKKyAgICAgICAgdmVjX21hc2tlZCA9IF9tbV9hbmRfc2kxMjggKCooX19tMTI4aSopbWFzayx2ZWMpOyAvL3JlYWR5IGZvciBwCisgICAgICAgIHBfbWFza2VkID0gX21tX2FuZG5vdF9zaTEyOCAoKihfX20xMjhpKiltYXNrLCooX19tMTI4aSopcHZlYyk7IC8vcmVhZHkgZm9yIHZlYworICAgICAgICByZXR1cm4gX21tX29yX3NpMTI4KHZlY19tYXNrZWQsIHBfbWFza2VkKTsKKyAgICB9CisKKyAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgIF9NTV9JTlNFUlRfRVBJOChfX20xMjhpIHZlYywgaW50IHAsIGNvbnN0IGludCBMQU5FKQorICAgIHsKKyAgICAgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBwdmVjWzE2XSA9IHswLDAsMCwwLCAwLDAsMCwwLCAwLDAsMCwwLCAwLDAsMCwwfTsKKyAgICAgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ4X3QgbWFza1sxNl0gPSB7MHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZn07CisgICAgICAgIF9fbTEyOGkgdmVjX21hc2tlZCwgcF9tYXNrZWQ7CisgICAgICAgIHB2ZWNbTEFORV0gPSAoaW50OF90KXA7CisgICAgICAgIG1hc2tbTEFORV0gPSAweDA7CisgICAgICAgIHZlY19tYXNrZWQgPSBfbW1fYW5kX3NpMTI4ICgqKF9fbTEyOGkqKW1hc2ssdmVjKTsgLy9yZWFkeSBmb3IgcAorICAgICAgICBwX21hc2tlZCA9IF9tbV9hbmRub3Rfc2kxMjggICgqKF9fbTEyOGkqKW1hc2ssKihfX20xMjhpKilwdmVjKTsgLy9yZWFkeSBmb3IgdmVjCisgICAgICAgIHJldHVybiBfbW1fb3Jfc2kxMjgodmVjX21hc2tlZCwgcF9tYXNrZWQpOworICAgIH0KKworICAgIF9ORU9OMlNTRV9JTkxJTkUgX19tMTI4IF9NTV9JTlNFUlRfUFMoX19tMTI4IHZlYywgX19tMTI4IHAsIGNvbnN0IGludCBMQU5FKQorICAgIHsKKyAgICAgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDMyX3QgbWFza1s0XSA9IHsweGZmZmZmZmZmLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwweGZmZmZmZmZmfTsKKyAgICAgICAgX19tMTI4IHRtcCwgdmVjX21hc2tlZCwgcF9tYXNrZWQ7CisgICAgICAgIG1hc2tbTEFORSA+PiA0XSA9IDB4MDsgLy9oZXJlIHRoZSBMQU5FIGlzIG5vdCBhY3R1cmFsIGxhbmUsIG5lZWQgdG8gZGVhbCB3aXRoIGl0CisgICAgICAgIHZlY19tYXNrZWQgPSBfbW1fYW5kX3BzICgqKF9fbTEyOCopbWFzayx2ZWMpOyAvL3JlYWR5IGZvciBwCisgICAgICAgIHBfbWFza2VkID0gX21tX2FuZG5vdF9wcyAoKihfX20xMjgqKW1hc2ssIHApOyAvL3JlYWR5IGZvciB2ZWMKKyAgICAgICAgdG1wID0gX21tX29yX3BzKHZlY19tYXNrZWQsIHBfbWFza2VkKTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisKKyAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgX01NX01BWF9FUEk4KF9fbTEyOGkgYSwgX19tMTI4aSBiKQorICAgIHsKKyAgICAgICAgX19tMTI4aSBjbXAsIHJlc2EsIHJlc2I7CisgICAgICAgIGNtcCA9IF9tbV9jbXBndF9lcGk4IChhLCBiKTsKKyAgICAgICAgcmVzYSA9IF9tbV9hbmRfc2kxMjggKGNtcCwgYSk7CisgICAgICAgIHJlc2IgPSBfbW1fYW5kbm90X3NpMTI4IChjbXAsYik7CisgICAgICAgIHJldHVybiBfbW1fb3Jfc2kxMjgocmVzYSwgcmVzYik7CisgICAgfQorCisgICAgX05FT04yU1NFX0lOTElORSBfX20xMjhpIF9NTV9NQVhfRVBJMzIoX19tMTI4aSBhLCBfX20xMjhpIGIpCisgICAgeworICAgICAgICBfX20xMjhpIGNtcCwgcmVzYSwgcmVzYjsKKyAgICAgICAgY21wID0gX21tX2NtcGd0X2VwaTMyKGEsIGIpOworICAgICAgICByZXNhID0gX21tX2FuZF9zaTEyOCAoY21wLCBhKTsKKyAgICAgICAgcmVzYiA9IF9tbV9hbmRub3Rfc2kxMjggKGNtcCxiKTsKKyAgICAgICAgcmV0dXJuIF9tbV9vcl9zaTEyOChyZXNhLCByZXNiKTsKKyAgICB9CisKKyAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgX01NX01BWF9FUFUxNihfX20xMjhpIGEsIF9fbTEyOGkgYikKKyAgICB7CisgICAgICAgIF9fbTEyOGkgYzgwMDAsIGJfcywgYV9zLCBjbXA7CisgICAgICAgIGM4MDAwID0gX21tX2NtcGVxX2VwaTE2IChhLGEpOyAvLzB4ZmZmZgorICAgICAgICBjODAwMCA9IF9tbV9zbGxpX2VwaTE2IChjODAwMCwgMTUpOyAvLzB4ODAwMAorICAgICAgICBiX3MgPSBfbW1fc3ViX2VwaTE2IChiLCBjODAwMCk7CisgICAgICAgIGFfcyA9IF9tbV9zdWJfZXBpMTYgKGEsIGM4MDAwKTsKKyAgICAgICAgY21wID0gX21tX2NtcGd0X2VwaTE2IChhX3MsIGJfcyk7IC8vbm8gdW5zaWduZWQgY29tcGFyaXNvbiwgbmVlZCB0byBnbyB0byBzaWduZWQKKyAgICAgICAgYV9zID0gX21tX2FuZF9zaTEyOCAoY21wLGEpOworICAgICAgICBiX3MgPSBfbW1fYW5kbm90X3NpMTI4IChjbXAsYik7CisgICAgICAgIHJldHVybiBfbW1fb3Jfc2kxMjgoYV9zLCBiX3MpOworICAgIH0KKworICAgIF9ORU9OMlNTRV9JTkxJTkUgX19tMTI4aSBfTU1fTUFYX0VQVTMyKF9fbTEyOGkgYSwgX19tMTI4aSBiKQorICAgIHsKKyAgICAgICAgX19tMTI4aSBjODAwMDAwMDAsIGJfcywgYV9zLCBjbXA7CisgICAgICAgIGM4MDAwMDAwMCA9IF9tbV9jbXBlcV9lcGkzMiAoYSxhKTsgLy8weGZmZmZmZmZmCisgICAgICAgIGM4MDAwMDAwMCA9IF9tbV9zbGxpX2VwaTMyIChjODAwMDAwMDAsIDMxKTsgLy8weDgwMDAwMDAwCisgICAgICAgIGJfcyA9IF9tbV9zdWJfZXBpMzIgKGIsIGM4MDAwMDAwMCk7CisgICAgICAgIGFfcyA9IF9tbV9zdWJfZXBpMzIgKGEsIGM4MDAwMDAwMCk7CisgICAgICAgIGNtcCA9IF9tbV9jbXBndF9lcGkzMiAoYV9zLCBiX3MpOyAvL25vIHVuc2lnbmVkIGNvbXBhcmlzb24sIG5lZWQgdG8gZ28gdG8gc2lnbmVkCisgICAgICAgIGFfcyA9IF9tbV9hbmRfc2kxMjggKGNtcCxhKTsKKyAgICAgICAgYl9zID0gX21tX2FuZG5vdF9zaTEyOCAoY21wLGIpOworICAgICAgICByZXR1cm4gX21tX29yX3NpMTI4KGFfcywgYl9zKTsKKyAgICB9CisKKyAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgX01NX01JTl9FUEk4KF9fbTEyOGkgYSwgX19tMTI4aSBiKQorICAgIHsKKyAgICAgICAgX19tMTI4aSBjbXAsIHJlc2EsIHJlc2I7CisgICAgICAgIGNtcCA9IF9tbV9jbXBndF9lcGk4IChiLCBhKTsKKyAgICAgICAgcmVzYSA9IF9tbV9hbmRfc2kxMjggKGNtcCwgYSk7CisgICAgICAgIHJlc2IgPSBfbW1fYW5kbm90X3NpMTI4IChjbXAsYik7CisgICAgICAgIHJldHVybiBfbW1fb3Jfc2kxMjgocmVzYSwgcmVzYik7CisgICAgfQorCisgICAgX05FT04yU1NFX0lOTElORSBfX20xMjhpIF9NTV9NSU5fRVBJMzIoX19tMTI4aSBhLCBfX20xMjhpIGIpCisgICAgeworICAgICAgICBfX20xMjhpIGNtcCwgcmVzYSwgcmVzYjsKKyAgICAgICAgY21wID0gX21tX2NtcGd0X2VwaTMyKGIsIGEpOworICAgICAgICByZXNhID0gX21tX2FuZF9zaTEyOCAoY21wLCBhKTsKKyAgICAgICAgcmVzYiA9IF9tbV9hbmRub3Rfc2kxMjggKGNtcCxiKTsKKyAgICAgICAgcmV0dXJuIF9tbV9vcl9zaTEyOChyZXNhLCByZXNiKTsKKyAgICB9CisKKyAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgX01NX01JTl9FUFUxNihfX20xMjhpIGEsIF9fbTEyOGkgYikKKyAgICB7CisgICAgICAgIF9fbTEyOGkgYzgwMDAsIGJfcywgYV9zLCBjbXA7CisgICAgICAgIGM4MDAwID0gX21tX2NtcGVxX2VwaTE2IChhLGEpOyAvLzB4ZmZmZgorICAgICAgICBjODAwMCA9IF9tbV9zbGxpX2VwaTE2IChjODAwMCwgMTUpOyAvLzB4ODAwMAorICAgICAgICBiX3MgPSBfbW1fc3ViX2VwaTE2IChiLCBjODAwMCk7CisgICAgICAgIGFfcyA9IF9tbV9zdWJfZXBpMTYgKGEsIGM4MDAwKTsKKyAgICAgICAgY21wID0gX21tX2NtcGd0X2VwaTE2IChiX3MsIGFfcyk7IC8vbm8gdW5zaWduZWQgY29tcGFyaXNvbiwgbmVlZCB0byBnbyB0byBzaWduZWQKKyAgICAgICAgYV9zID0gX21tX2FuZF9zaTEyOCAoY21wLGEpOworICAgICAgICBiX3MgPSBfbW1fYW5kbm90X3NpMTI4IChjbXAsYik7CisgICAgICAgIHJldHVybiBfbW1fb3Jfc2kxMjgoYV9zLCBiX3MpOworICAgIH0KKworICAgIF9ORU9OMlNTRV9JTkxJTkUgX19tMTI4aSBfTU1fTUlOX0VQVTMyKF9fbTEyOGkgYSwgX19tMTI4aSBiKQorICAgIHsKKyAgICAgICAgX19tMTI4aSBjODAwMDAwMDAsIGJfcywgYV9zLCBjbXA7CisgICAgICAgIGM4MDAwMDAwMCA9IF9tbV9jbXBlcV9lcGkzMiAoYSxhKTsgLy8weGZmZmZmZmZmCisgICAgICAgIGM4MDAwMDAwMCA9IF9tbV9zbGxpX2VwaTMyIChjODAwMDAwMDAsIDMxKTsgLy8weDgwMDAwMDAwCisgICAgICAgIGJfcyA9IF9tbV9zdWJfZXBpMzIgKGIsIGM4MDAwMDAwMCk7CisgICAgICAgIGFfcyA9IF9tbV9zdWJfZXBpMzIgKGEsIGM4MDAwMDAwMCk7CisgICAgICAgIGNtcCA9IF9tbV9jbXBndF9lcGkzMiAoYl9zLCBhX3MpOyAvL25vIHVuc2lnbmVkIGNvbXBhcmlzb24sIG5lZWQgdG8gZ28gdG8gc2lnbmVkCisgICAgICAgIGFfcyA9IF9tbV9hbmRfc2kxMjggKGNtcCxhKTsKKyAgICAgICAgYl9zID0gX21tX2FuZG5vdF9zaTEyOCAoY21wLGIpOworICAgICAgICByZXR1cm4gX21tX29yX3NpMTI4KGFfcywgYl9zKTsKKyAgICB9CisKKyAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgIF9NTV9CTEVORFZfRVBJOChfX20xMjhpIGEsIF9fbTEyOGkgYiwgX19tMTI4aSBtYXNrKSAvL3RoaXMgaXMgTk9UIGV4YWN0IGltcGxlbWVudGF0aW9uIG9mIF9tbV9ibGVuZHZfZXBpOCAgISEhISEgLSBwbGVhc2Ugc2VlIGJlbG93CisgICAgeworICAgICAgICAvL2l0IGFzc3VtZXMgbWFzayBpcyBlaXRoZXIgMHhmZiBvciAwICBhbHdheXMgKGxpa2UgaW4gYWxsIHVzZWNhc2VzIGJlbG93KSB3aGlsZSBmb3IgdGhlIG9yaWdpbmFsIF9tbV9ibGVuZHZfZXBpOCBvbmx5IE1TQiBtYXNrIGJ5dGUgbWF0dGVycy4KKyAgICAgICAgX19tMTI4aSBhX21hc2tlZCwgYl9tYXNrZWQ7CisgICAgICAgIGJfbWFza2VkID0gX21tX2FuZF9zaTEyOCAobWFzayxiKTsgLy91c2UgYiBpZiBtYXNrIDB4ZmYKKyAgICAgICAgYV9tYXNrZWQgPSBfbW1fYW5kbm90X3NpMTI4IChtYXNrLGEpOworICAgICAgICByZXR1cm4gX21tX29yX3NpMTI4KGFfbWFza2VkLCBiX21hc2tlZCk7CisgICAgfQorCisgICAgX05FT04yU1NFX0lOTElORSBfX20xMjhpIF9NTV9QQUNLVVNfRVBJMzIoX19tMTI4aSBhLCBfX20xMjhpIGIpCisgICAgeworICAgICAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s4XzMyX2V2ZW5fb2RkWzE2XSA9IHsgMCwxLCA0LDUsIDgsOSwgIDEyLDEzLCAgMiwzLCA2LDcsMTAsMTEsMTQsMTV9OworICAgICAgICBfX20xMjhpIGExNiwgYjE2LCByZXMsIHJlc2hpLGNtcCwgemVybzsKKyAgICAgICAgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgICAgIGExNiA9IF9tbV9zaHVmZmxlX2VwaTggKGEsICooX19tMTI4aSopIG1hc2s4XzMyX2V2ZW5fb2RkKTsKKyAgICAgICAgYjE2ID0gX21tX3NodWZmbGVfZXBpOCAoYiwgKihfX20xMjhpKikgbWFzazhfMzJfZXZlbl9vZGQpOworICAgICAgICByZXMgPSBfbW1fdW5wYWNrbG9fZXBpNjQoYTE2LCBiMTYpOyAvL3Jlc3VsdCB3aXRob3V0IHNhdHVyYXRpb24KKyAgICAgICAgcmVzaGkgPSBfbW1fdW5wYWNraGlfZXBpNjQoYTE2LCBiMTYpOyAvL2hpIHBhcnQgb2YgcmVzdWx0IHVzZWQgZm9yIHNhdHVyYXRpb24KKyAgICAgICAgY21wID0gX21tX2NtcGd0X2VwaTE2KHplcm8sIHJlc2hpKTsgLy9pZiBjbXA8MCB0aGUgcmVzdWx0IHNob3VsZCBiZSB6ZXJvCisgICAgICAgIHJlcyA9IF9tbV9hbmRub3Rfc2kxMjgoY21wLHJlcyk7IC8vaWYgY21wIHplcm8gLSBkbyBub3RoaW5nLCBvdGhlcndpc2UgY21wIDwwICBhbmQgdGhlIHJlc3VsdCBpcyAwCisgICAgICAgIGNtcCA9IF9tbV9jbXBndF9lcGkxNihyZXNoaSx6ZXJvKTsgLy9pZiBjbXAgcG9zaXRpdmUKKyAgICAgICAgcmV0dXJuIF9tbV9vcl9zaTEyOChyZXMsIGNtcCk7IC8vaWYgY21wIHBvc2l0aXZlIHdlIGFyZSBvdXQgb2YgMTZiaXRzIG5lZWQgdG8gc2F0dXJhYXRlIHRvIDB4ZmZmZgorICAgIH0KKworICAgIF9ORU9OMlNTRV9JTkxJTkUgX19tMTI4aSBfTU1fUEFDS1VTMV9FUEkzMihfX20xMjhpIGEpCisgICAgeworICAgICAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s4XzMyX2V2ZW5fb2RkWzE2XSA9IHsgMCwxLCA0LDUsIDgsOSwgIDEyLDEzLCAgMiwzLCA2LDcsMTAsMTEsMTQsMTV9OworICAgICAgICBfX20xMjhpIGExNiwgcmVzLCByZXNoaSxjbXAsIHplcm87CisgICAgICAgIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgICAgICBhMTYgPSBfbW1fc2h1ZmZsZV9lcGk4IChhLCAqKF9fbTEyOGkqKW1hc2s4XzMyX2V2ZW5fb2RkKTsKKyAgICAgICAgcmVzaGkgPSBfbW1fdW5wYWNraGlfZXBpNjQoYTE2LCBhMTYpOyAvL2hpIHBhcnQgb2YgcmVzdWx0IHVzZWQgZm9yIHNhdHVyYXRpb24KKyAgICAgICAgY21wID0gX21tX2NtcGd0X2VwaTE2KHplcm8sIHJlc2hpKTsgLy9pZiBjbXA8MCB0aGUgcmVzdWx0IHNob3VsZCBiZSB6ZXJvCisgICAgICAgIHJlcyA9IF9tbV9hbmRub3Rfc2kxMjgoY21wLCBhMTYpOyAvL2lmIGNtcCB6ZXJvIC0gZG8gbm90aGluZywgb3RoZXJ3aXNlIGNtcCA8MCAgYW5kIHRoZSByZXN1bHQgaXMgMAorICAgICAgICBjbXAgPSBfbW1fY21wZ3RfZXBpMTYocmVzaGksemVybyk7IC8vaWYgY21wIHBvc2l0aXZlCisgICAgICAgIHJldHVybiBfbW1fb3Jfc2kxMjgocmVzLCBjbXApOyAvL2lmIGNtcCBwb3NpdGl2ZSB3ZSBhcmUgb3V0IG9mIDE2Yml0cyBuZWVkIHRvIHNhdHVyYWF0ZSB0byAweGZmZmYKKyAgICB9CisKKworICAgIF9ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoX19tMTI4aSBfTU1fTVVMTE9fRVBJMzIoX19tMTI4aSBhLCBfX20xMjhpIGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQorICAgIHsKKyAgICAgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDMyX3QgYXRtcFs0XSwgYnRtcFs0XSwgcmVzWzRdOworICAgICAgICBpbnQ2NF90IHJlczY0OworICAgICAgICBpbnQgaTsKKyAgICAgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilhdG1wLCBhKTsKKyAgICAgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilidG1wLCBiKTsKKyAgICAgICAgZm9yIChpID0gMDsgaTw0OyBpKyspIHsKKyAgICAgICAgICAgIHJlczY0ID0gYXRtcFtpXSAqIGJ0bXBbaV07CisgICAgICAgICAgICByZXNbaV0gPSAoaW50KShyZXM2NCAmIDB4ZmZmZmZmZmYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSopcmVzKTsKKyAgICB9CisKKyAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgX01NX01VTF9FUEkzMihfX20xMjhpIGEsIF9fbTEyOGkgYikKKyAgICB7CisgICAgICAgIF9fbTEyOGkgc2lnbiwgemVybywgIG11bF91cywgYV9uZWcsIGJfbmVnLCBtdWxfdXNfbmVnOworICAgICAgICBzaWduID0gX21tX3hvcl9zaTEyOCAoYSwgYik7CisgICAgICAgIHNpZ24gPSAgX21tX3NyYWlfZXBpMzIgKHNpZ24sIDMxKTsgLy9wcm9tb3RlIHNpZ24gYml0IHRvIGFsbCBmaWVsZHMsIGFsbCBmZmYgaWYgbmVnYXRpdmUgYW5kIGFsbCAwIGlmIHBvc2l0aXZlCisgICAgICAgIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgICAgICBhX25lZyA9IF9tbV9hYnNfZXBpMzIgKGEpOyAvL25lZ2F0ZSBhIGFuZCBiCisgICAgICAgIGJfbmVnID0gX21tX2Fic19lcGkzMiAoYik7IC8vbmVnYXRlIGEgYW5kIGIKKyAgICAgICAgbXVsX3VzID0gX21tX211bF9lcHUzMiAoYV9uZWcsIGJfbmVnKTsgLy91c2VzIDAgYW5kIDJuZCBkYXRhIGxhbmVzLCAoYWJzKSwgdGhlIG11bHRpcGxpY2F0aW9uIGdpdmVzIDY0IGJpdCByZXN1bHQKKyAgICAgICAgbXVsX3VzX25lZyA9IF9tbV9zdWJfZXBpNjQoemVybywgbXVsX3VzKTsKKyAgICAgICAgbXVsX3VzX25lZyA9IF9tbV9hbmRfc2kxMjgoc2lnbiwgbXVsX3VzX25lZyk7CisgICAgICAgIG11bF91cyA9IF9tbV9hbmRub3Rfc2kxMjgoc2lnbiwgbXVsX3VzKTsKKyAgICAgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAobXVsX3VzLCBtdWxfdXNfbmVnKTsKKyAgICB9CisKKyAgICBfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgX01NX0NNUEVRX0VQSTY0KF9fbTEyOGkgYSwgX19tMTI4aSBiKQorICAgIHsKKyAgICAgICAgX19tMTI4aSByZXM7CisgICAgICAgIHJlcyA9IF9tbV9jbXBlcV9lcGkzMiAoYSwgYik7CisgICAgICAgIHJldHVybiBfbW1fc2h1ZmZsZV9lcGkzMiAocmVzLCAxIHwgKDEgPDwgMikgfCAoMyA8PCA0KSB8ICgzIDw8IDYpKTsgLy9jb3B5IHRoZSBpbmZvcm1hdGlvbiBmcm9tIGhpIHRvIGxvdyBwYXJ0IG9mIHRoZSA2NCBiaXQgZGF0YQorICAgIH0KKyNlbmRpZiAgICAgLy9TU0U0CisKKy8vdGhlIHNwZWNpYWwgY2FzZSBvZiBmdW5jdGlvbnMgd29ya2luZyBvbmx5IGZvciAzMiBiaXRzLCBubyBTU0U0CitfTkVPTjJTU0VfSU5MSU5FIF9fbTEyOGkgIF9NTV9JTlNFUlRfRVBJNjRfMzIoX19tMTI4aSB2ZWMsIGludCBwLCBjb25zdCBpbnQgTEFORSkKK3sKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDY0X3QgcHZlY1syXSA9IHswLDB9OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50NjRfdCBtYXNrWzJdID0gezB4ZmZmZmZmZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmZmZmZmfTsKKyAgICBfX20xMjhpIHZlY19tYXNrZWQsIHBfbWFza2VkOworICAgIHB2ZWNbTEFORV0gPSBwOworICAgIG1hc2tbTEFORV0gPSAweDA7CisgICAgdmVjX21hc2tlZCA9IF9tbV9hbmRfc2kxMjggKCooX19tMTI4aSopbWFzayx2ZWMpOyAvL3JlYWR5IGZvciBwCisgICAgcF9tYXNrZWQgPSBfbW1fYW5kbm90X3NpMTI4ICgqKF9fbTEyOGkqKW1hc2ssKihfX20xMjhpKilwdmVjKTsgLy9yZWFkeSBmb3IgdmVjCisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCh2ZWNfbWFza2VkLCBwX21hc2tlZCk7Cit9CisKK19ORU9OMlNTRV9JTkxJTkUgaW50NjRfdCBfTU1fRVhUUkFDVF9FUEk2NF8zMihfX20xMjhpIHZhbCwgY29uc3QgaW50IExBTkUpCit7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDY0X3QgdG1wWzJdOworICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopdG1wLCB2YWwpOworICAgIHJldHVybiB0bXBbTEFORV07Cit9CisKKyNpZm5kZWYgX05FT04yU1NFXzY0QklUX1NTRTQKKyAgICAjZGVmaW5lIF9NTV9JTlNFUlRfRVBJNjQgX01NX0lOU0VSVF9FUEk2NF8zMgorICAgICNkZWZpbmUgX01NX0VYVFJBQ1RfRVBJNjQgX01NX0VYVFJBQ1RfRVBJNjRfMzIKKyNlbmRpZgorCitpbnQzMng0X3QgIHZxZF9zMzIoaW50MzJ4NF90IGEpOyAvL0RvdWJsaW5nIHNhdHVyYXRpb24gZm9yIHNpZ25lZCBpbnRzCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCAgdnFkX3MzMihpbnQzMng0X3QgYSkKK3sKKyAgICAvL092ZXJmbG93IGhhcHBlbnMgb25seSBpZiBhIGFuZCBzdW0gaGF2ZSB0aGUgb3Bwb3NpdGUgc2lnbnMKKyAgICBfX20xMjhpIGM3ZmZmZmZmZiwgcmVzLCByZXNfc2F0LCByZXNfeG9yX2E7CisgICAgYzdmZmZmZmZmID0gX21tX3NldDFfZXBpMzIoMHg3ZmZmZmZmZik7CisgICAgcmVzID0gX21tX3NsbGlfZXBpMzIgKGEsIDEpOyAvLyByZXMgPSBhKjIKKyAgICByZXNfc2F0ID0gX21tX3NybGlfZXBpMzIoYSwgMzEpOworICAgIHJlc19zYXQgPSBfbW1fYWRkX2VwaTMyKHJlc19zYXQsIGM3ZmZmZmZmZik7CisgICAgcmVzX3hvcl9hID0gX21tX3hvcl9zaTEyOChyZXMsIGEpOworICAgIHJlc194b3JfYSA9IF9tbV9zcmFpX2VwaTMyKHJlc194b3JfYSwzMSk7IC8vcHJvcGFnYXRlIHRoZSBzaWdoIGJpdCwgYWxsIGZmZmYgaWYgPDAgYWxsIG9uZXMgb3RoZXJ3aXNlCisgICAgcmVzX3NhdCA9IF9tbV9hbmRfc2kxMjgocmVzX3hvcl9hLCByZXNfc2F0KTsKKyAgICByZXMgPSBfbW1fYW5kbm90X3NpMTI4KHJlc194b3JfYSwgcmVzKTsKKyAgICByZXR1cm4gX21tX29yX3NpMTI4KHJlcywgcmVzX3NhdCk7Cit9CisKKworLy8hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKiAgRnVuY3Rpb25zIHJlZGVmaW5pdGlvblxpbXBsZW1lbnRhdGluIHN0YXJ0cyBoZXJlICoqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisKKy8qSWYgdGhlIHVuaWZpZWQgaW50cmluc2ljcyBzb2x1dGlvbnMgaXMgbmVjZXNzYXJ5IHBsZWFzZSBkZWZpbmUgeW91ciBTU0UgaW50cmluc2ljcyB3cmFwIGhlcmUgbGlrZSBpbiB0aGUgZm9sbG93aW5nIHNhbXBsZToKKyNpZmRlZiBBUk0KKyNkZWZpbmUgdmVjdG9yX2FkZHFfczMyIF9tbV9hZGRfZXBpMzIKKyNlbHNlIC8vaWYgd2UgaGF2ZSBJQQorI2RlZmluZSB2ZWN0b3JfYWRkcV9zMzIgdmFkZF9zMzIKKyNlbmRpZgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRnVuY3Rpb25zIGJlbG93IGFyZSBvcmdhbmlzZWQgaW4gdGhlIGZvbGxvd2luZyB3YXk6CisKK0VhY2ggTkVPTiBpbnRyaW5zaWMgZnVuY3Rpb24gaGFzIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisxLiAgaXRzIHg4NiBmdWxsIGVxdWl2YWxlbnQgU1NFIGludHJpbnNpYyAtIGluIHRoaXMgY2FzZSB4ODYgdmVyc2lvbiBqdXN0IGZvbGxvd3MgdGhlIE5FT04gb25lIHVuZGVyIHRoZSBjb3JyZXNwb25kaW5nICNkZWZpbmUgc3RhdGVtZW50CisyLiAgeDg2IGltcGxlbWVudGF0aW9uIHVzaW5nIG1vcmUgdGhhbiBvbmUgeDg2IGludHJpbnNpY3MuIEluIHRoaXMgY2FzZSBpdCBpcyBzaGFwZWQgYXMgaW5saW5lZCBDIGZ1bmN0aW9uIHdpdGggcmV0dXJuIHN0YXRlbWVudAorMy4gIHRoZSByZWZlcmVuY2UgdG8gdGhlIE5FT04gZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzYW1lIHJlc3VsdCBhbmQgaW1wbGVtZW50ZWQgaW4geDg2IGFzIGFib3ZlLiBJbiB0aGlzIGNhc2UgaXQgaXMgc2hhcGVkIGFzIG1hdGNoaW5nIE5FT04gZnVuY3Rpb24gZGVmaW5pdGlvbgorNC4gIGZvciBhYm91dCA1JSBvZiBmdW5jdGlvbnMgZHVlIHRvIHRoZSBjb3JyZXNwb25kaW5nIHg4NiBTSU1EIHVuYXZhaWxhYmlsaXR5IG9yIGluZWZmaWNpZW5jeSBpbiB0ZXJtcyBvZiBwZXJmb3JtYW5jZQordGhlIHNlcmlhbCBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBpbGVyIHdhcm5pbmcuIElmIHRoZXNlIGZ1bmN0aW9ucyBhcmUgb24geW91ciBhcHAgY3JpdGljYWwgcGF0aAorLSBwbGVhc2UgY29uc2lkZXIgc3VjaCBmdW5jdGlvbnMgcmVtb3ZhbCBmcm9tIHlvdXIgY29kZS4KKyovCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgVmVjdG9yIGFkZCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQ4eDhfdCB2YWRkX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWQURELkk4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZhZGRfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fYWRkX2VwaTgoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKworaW50MTZ4NF90IHZhZGRfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZBREQuSTE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2YWRkX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9hZGRfZXBpMTYoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKworaW50MzJ4Ml90IHZhZGRfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZBREQuSTMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2YWRkX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9hZGRfZXBpMzIoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKworaW50NjR4MV90ICB2YWRkX3M2NChpbnQ2NHgxX3QgYSwgIGludDY0eDFfdCBiKTsgLy8gVkFERC5JNjQgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4MV90ICB2YWRkX3M2NChpbnQ2NHgxX3QgYSwgIGludDY0eDFfdCBiKQoreworICAgIGludDY0eDFfdCByZXM2NDsKKyAgICByZXM2NC5tNjRfaTY0WzBdID0gYS5tNjRfaTY0WzBdICsgYi5tNjRfaTY0WzBdOworICAgIHJldHVybiByZXM2NDsKK30KKworCitmbG9hdDMyeDJfdCB2YWRkX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVkFERC5GMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3QgdmFkZF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikKK3sKKyAgICBfX20xMjggcmVzOworICAgIF9fbTY0XzEyOCByZXM2NDsKKyAgICByZXMgPSBfbW1fYWRkX3BzKF9wTTEyOChhKSxfcE0xMjgoYikpOyAvL1NTRSwgdXNlIG9ubHkgbG93IDY0IGJpdHMKKyAgICBfTTY0ZihyZXM2NCwgcmVzKTsKKyAgICByZXR1cm4gcmVzNjQ7Cit9CisKK3VpbnQ4eDhfdCAgdmFkZF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWQURELkk4IGQwLGQwLGQwCisjZGVmaW5lIHZhZGRfdTggdmFkZF9zOAorCit1aW50MTZ4NF90ICB2YWRkX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZBREQuSTE2IGQwLGQwLGQwCisjZGVmaW5lIHZhZGRfdTE2IHZhZGRfczE2CisKK3VpbnQzMngyX3QgIHZhZGRfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVkFERC5JMzIgZDAsZDAsZDAKKyNkZWZpbmUgdmFkZF91MzIgdmFkZF9zMzIKKwordWludDY0eDFfdCB2YWRkX3U2NCh1aW50NjR4MV90IGEsICB1aW50NjR4MV90IGIpOyAvLyBWQURELkk2NCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50NjR4MV90IHZhZGRfdTY0KHVpbnQ2NHgxX3QgYSwgIHVpbnQ2NHgxX3QgYikKK3sKKyAgICB1aW50NjR4MV90IHJlczY0OworICAgIHJlczY0Lm02NF91NjRbMF0gPSBhLm02NF91NjRbMF0gKyBiLm02NF91NjRbMF07CisgICAgcmV0dXJuIHJlczY0OworfQorCisKK2ludDh4MTZfdCAgIHZhZGRxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZBREQuSTggcTAscTAscTAKKyNkZWZpbmUgdmFkZHFfczggX21tX2FkZF9lcGk4CisKK2ludDE2eDhfdCAgIHZhZGRxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWQURELkkxNiBxMCxxMCxxMAorI2RlZmluZSB2YWRkcV9zMTYgX21tX2FkZF9lcGkxNgorCitpbnQzMng0X3QgICB2YWRkcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVkFERC5JMzIgcTAscTAscTAKKyNkZWZpbmUgdmFkZHFfczMyIF9tbV9hZGRfZXBpMzIKKworaW50NjR4Ml90ICAgdmFkZHFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZBREQuSTY0IHEwLHEwLHEwCisjZGVmaW5lIHZhZGRxX3M2NCBfbW1fYWRkX2VwaTY0CisKK2Zsb2F0MzJ4NF90IHZhZGRxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVkFERC5GMzIgcTAscTAscTAKKyNkZWZpbmUgdmFkZHFfZjMyIF9tbV9hZGRfcHMKKwordWludDh4MTZfdCAgIHZhZGRxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVkFERC5JOCBxMCxxMCxxMAorI2RlZmluZSB2YWRkcV91OCBfbW1fYWRkX2VwaTgKKwordWludDE2eDhfdCAgIHZhZGRxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZBREQuSTE2IHEwLHEwLHEwCisjZGVmaW5lIHZhZGRxX3UxNiBfbW1fYWRkX2VwaTE2CisKK3VpbnQzMng0X3QgICB2YWRkcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWQURELkkzMiBxMCxxMCxxMAorI2RlZmluZSB2YWRkcV91MzIgX21tX2FkZF9lcGkzMgorCit1aW50NjR4Ml90ICAgdmFkZHFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKTsgLy8gVkFERC5JNjQgcTAscTAscTAKKyNkZWZpbmUgdmFkZHFfdTY0IF9tbV9hZGRfZXBpNjQKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFZlY3RvciBsb25nIGFkZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKjoKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vVmEsIFZiIGhhdmUgZXF1YWwgbGFuZSBzaXplcywgcmVzdWx0IGlzIGEgMTI4IGJpdCB2ZWN0b3Igb2YgbGFuZXMgdGhhdCBhcmUgdHdpY2UgdGhlIHdpZHRoLgoraW50MTZ4OF90ICB2YWRkbF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVkFEREwuUzggcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90ICB2YWRkbF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSAvLyBWQURETC5TOCBxMCxkMCxkMAoreworICAgIF9fbTEyOGkgYTE2LCBiMTY7CisgICAgYTE2ID0gX01NX0NWVEVQSThfRVBJMTYgKF9wTTEyOGkoYSkpOyAvL1NTRTQuMSwKKyAgICBiMTYgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoX3BNMTI4aShiKSk7IC8vU1NFNC4xLAorICAgIHJldHVybiBfbW1fYWRkX2VwaTE2IChhMTYsIGIxNik7Cit9CisKK2ludDMyeDRfdCAgdmFkZGxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZBRERMLlMxNiBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgIHZhZGRsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIC8vIFZBRERMLlMxNiBxMCxkMCxkMAoreworICAgIF9fbTEyOGkgYTMyLCBiMzI7CisgICAgYTMyID0gX01NX0NWVEVQSTE2X0VQSTMyIChfcE0xMjhpKGEpKTsgLy9TU0U0LjEKKyAgICBiMzIgPSBfTU1fQ1ZURVBJMTZfRVBJMzIgKF9wTTEyOGkoYikpOyAvL1NTRTQuMQorICAgIHJldHVybiBfbW1fYWRkX2VwaTMyIChhMzIsIGIzMik7Cit9CisKK2ludDY0eDJfdCAgdmFkZGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZBRERMLlMzMiBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgyX3QgIHZhZGRsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpIC8vIFZBRERMLlMzMiBxMCxkMCxkMAoreworICAgIC8vbWF5IGJlIG5vdCBvcHRpbWFsCisgICAgX19tMTI4aSBhNjQsIGI2NDsKKyAgICBhNjQgPSBfTU1fQ1ZURVBJMzJfRVBJNjQgKF9wTTEyOGkoYSkpOyAvL1NTRTQuMQorICAgIGI2NCA9IF9NTV9DVlRFUEkzMl9FUEk2NCAoX3BNMTI4aShiKSk7IC8vU1NFNC4xCisgICAgcmV0dXJuIF9tbV9hZGRfZXBpNjQgKCBhNjQsIGI2NCk7Cit9CisKK3VpbnQxNng4X3QgdmFkZGxfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVkFEREwuVTggcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDhfdCB2YWRkbF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpIC8vIFZBRERMLlU4IHEwLGQwLGQwCit7CisgICAgX19tMTI4aSBhMTYsIGIxNjsKKyAgICBhMTYgPSBfTU1fQ1ZURVBVOF9FUEkxNiAoX3BNMTI4aShhKSk7IC8vU1NFNC4xCisgICAgYjE2ID0gX01NX0NWVEVQVThfRVBJMTYgKF9wTTEyOGkoYikpOyAvL1NTRTQuMQorICAgIHJldHVybiBfbW1fYWRkX2VwaTE2IChhMTYsIGIxNik7Cit9CisKK3VpbnQzMng0X3QgdmFkZGxfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVkFEREwuczE2IHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdmFkZGxfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKSAvLyBWQURETC5zMTYgcTAsZDAsZDAKK3sKKyAgICBfX20xMjhpIGEzMiwgYjMyOworICAgIGEzMiA9IF9NTV9DVlRFUFUxNl9FUEkzMiAoX3BNMTI4aShhKSk7IC8vU1NFNC4xCisgICAgYjMyID0gX01NX0NWVEVQVTE2X0VQSTMyIChfcE0xMjhpKGIpKTsgLy9TU0U0LjEKKyAgICByZXR1cm4gX21tX2FkZF9lcGkzMiAoYTMyLCBiMzIpOworfQorCit1aW50NjR4Ml90IHZhZGRsX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZBRERMLlUzMiBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50NjR4Ml90IHZhZGRsX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYikgLy8gVkFEREwuVTMyIHEwLGQwLGQwCit7CisgICAgLy9tYXkgYmUgbm90IG9wdGltYWwKKyAgICBfX20xMjhpIGE2NCwgYjY0OworICAgIGE2NCA9IF9NTV9DVlRFUFUzMl9FUEk2NCAoX3BNMTI4aShhKSk7IC8vU1NFNC4xCisgICAgYjY0ID0gX01NX0NWVEVQVTMyX0VQSTY0IChfcE0xMjhpKGIpKTsgLy9TU0U0LjEKKyAgICByZXR1cm4gX21tX2FkZF9lcGk2NCAoYTY0LCBiNjQpOworfQorCisvLyoqKioqKioqKioqKioqKiAgIFZlY3RvciB3aWRlIGFkZDogdmFkZHdfPHR5cGU+LiBWcltpXTo9VmFbaV0rVmJbaV0gKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDE2eDhfdCAgdmFkZHdfczgoaW50MTZ4OF90IGEsIGludDh4OF90IGIpOyAvLyBWQUREVy5TOCBxMCxxMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgIHZhZGR3X3M4KGludDE2eDhfdCBhLCBpbnQ4eDhfdCBiKSAvLyBWQUREVy5TOCBxMCxxMCxkMAoreworICAgIF9fbTEyOGkgYjE2OworICAgIGIxNiA9IF9NTV9DVlRFUEk4X0VQSTE2IChfcE0xMjhpKGIpKTsgLy9TU0U0LjEsCisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMTYgKGEsIGIxNik7Cit9CisKK2ludDMyeDRfdCAgdmFkZHdfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZBRERXLlMxNiBxMCxxMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgIHZhZGR3X3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIpIC8vIFZBRERXLlMxNiBxMCxxMCxkMAoreworICAgIF9fbTEyOGkgYjMyOworICAgIGIzMiA9ICBfTU1fQ1ZURVBJMTZfRVBJMzIoX3BNMTI4aShiKSk7IC8vU1NFNC4xLAorICAgIHJldHVybiBfbW1fYWRkX2VwaTMyIChhLCBiMzIpOworfQorCitpbnQ2NHgyX3QgIHZhZGR3X3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWQUREVy5TMzIgcTAscTAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4Ml90ICB2YWRkd19zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiKSAvLyBWQUREVy5TMzIgcTAscTAsZDAKK3sKKyAgICBfX20xMjhpIGI2NDsKKyAgICBiNjQgPSBfTU1fQ1ZURVBJMzJfRVBJNjQgKF9wTTEyOGkoYikpOyAvL1NTRTQuMQorICAgIHJldHVybiBfbW1fYWRkX2VwaTY0IChhLCBiNjQpOworfQorCit1aW50MTZ4OF90IHZhZGR3X3U4KHVpbnQxNng4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWQUREVy5VOCBxMCxxMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZhZGR3X3U4KHVpbnQxNng4X3QgYSwgdWludDh4OF90IGIpIC8vIFZBRERXLlU4IHEwLHEwLGQwCit7CisgICAgX19tMTI4aSBiMTY7CisgICAgYjE2ID0gX01NX0NWVEVQVThfRVBJMTYgKF9wTTEyOGkoYikpOyAvL1NTRTQuMQorICAgIHJldHVybiBfbW1fYWRkX2VwaTE2IChhLCBiMTYpOworfQorCit1aW50MzJ4NF90IHZhZGR3X3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZBRERXLnMxNiBxMCxxMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZhZGR3X3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng0X3QgYikgLy8gVkFERFcuczE2IHEwLHEwLGQwCit7CisgICAgX19tMTI4aSBiMzI7CisgICAgYjMyID0gX01NX0NWVEVQVTE2X0VQSTMyIChfcE0xMjhpKGIpKTsgLy9TU0U0LjEKKyAgICByZXR1cm4gX21tX2FkZF9lcGkzMiAoYSwgYjMyKTsKK30KKwordWludDY0eDJfdCB2YWRkd191MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWQUREVy5VMzIgcTAscTAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDJfdCB2YWRkd191MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIpIC8vIFZBRERXLlUzMiBxMCxxMCxkMAoreworICAgIF9fbTEyOGkgYjY0OworICAgIGI2NCA9IF9NTV9DVlRFUFUzMl9FUEk2NCAoX3BNMTI4aShiKSk7IC8vU1NFNC4xCisgICAgcmV0dXJuIF9tbV9hZGRfZXBpNjQgKGEsIGI2NCk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqVmVjdG9yIGhhbHZpbmcgYWRkOiB2aGFkZCAtPiBWcltpXTo9KFZhW2ldK1ZiW2ldKT4+MSAsICByZXN1bHQgdHJ1bmNhdGVkICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgdmhhZGRfczgoaW50OHg4X3QgYSwgIGludDh4OF90IGIpOyAvLyBWSEFERC5TOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2aGFkZF9zOChpbnQ4eDhfdCBhLCAgaW50OHg4X3QgYikKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NCh2aGFkZHFfdTgoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK2ludDE2eDRfdCB2aGFkZF9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYik7IC8vIFZIQURELlMxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdmhhZGRfczE2KGludDE2eDRfdCBhLCAgaW50MTZ4NF90IGIpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KCB2aGFkZHFfczE2KF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCitpbnQzMngyX3QgdmhhZGRfczMyKGludDMyeDJfdCBhLCAgaW50MzJ4Ml90IGIpOyAvLyBWSEFERC5TMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZoYWRkX3MzMihpbnQzMngyX3QgYSwgIGludDMyeDJfdCBiKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NCggdmhhZGRxX3MzMihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDh4OF90IHZoYWRkX3U4KHVpbnQ4eDhfdCBhLCAgdWludDh4OF90IGIpOyAvLyBWSEFERC53IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2aGFkZF91OCh1aW50OHg4X3QgYSwgIHVpbnQ4eDhfdCBiKQoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NCggdmhhZGRxX3U4KF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCit1aW50MTZ4NF90IHZoYWRkX3UxNih1aW50MTZ4NF90IGEsICB1aW50MTZ4NF90IGIpOyAvLyBWSEFERC5zMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2aGFkZF91MTYodWludDE2eDRfdCBhLCAgdWludDE2eDRfdCBiKQoreworICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoIHZoYWRkcV91MTYoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQzMngyX3QgdmhhZGRfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYik7IC8vIFZIQURELlUzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZoYWRkX3UzMih1aW50MzJ4Ml90IGEsICB1aW50MzJ4Ml90IGIpCit7CisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NCggdmhhZGRxX3UzMihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKworaW50OHgxNl90IHZoYWRkcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWSEFERC5TOCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2X3QgdmhhZGRxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikKK3sKKyAgICAvL25lZWQgdG8gYXZvaWQgaW50ZXJuYWwgb3ZlcmZsb3csIHdpbGwgdXNlIHRoZSAoeCZ5KSsoKHheeSk+PjEpLgorICAgIF9fbTEyOGkgdG1wMSwgdG1wMjsKKyAgICB0bXAxID0gX21tX2FuZF9zaTEyOChhLGIpOworICAgIHRtcDIgPSBfbW1feG9yX3NpMTI4KGEsYik7CisgICAgdG1wMiA9IHZzaHJxX25fczgodG1wMiwxKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGk4KHRtcDEsdG1wMik7Cit9CisKK2ludDE2eDhfdCB2aGFkZHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZIQURELlMxIDYgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZoYWRkcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKQoreworICAgIC8vbmVlZCB0byBhdm9pZCBpbnRlcm5hbCBvdmVyZmxvdywgd2lsbCB1c2UgdGhlICh4JnkpKygoeF55KT4+MSkuCisgICAgX19tMTI4aSB0bXAxLCB0bXAyOworICAgIHRtcDEgPSBfbW1fYW5kX3NpMTI4KGEsYik7CisgICAgdG1wMiA9IF9tbV94b3Jfc2kxMjgoYSxiKTsKKyAgICB0bXAyID0gX21tX3NyYWlfZXBpMTYodG1wMiwxKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGkxNih0bXAxLHRtcDIpOworfQorCitpbnQzMng0X3QgdmhhZGRxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWSEFERC5TMzIgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZoYWRkcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSAvLyBWSEFERC5TMzIgcTAscTAscTAKK3sKKyAgICAvL25lZWQgdG8gYXZvaWQgaW50ZXJuYWwgb3ZlcmZsb3csIHdpbGwgdXNlIHRoZSAoeCZ5KSsoKHheeSk+PjEpLgorICAgIF9fbTEyOGkgdG1wMSwgdG1wMjsKKyAgICB0bXAxID0gX21tX2FuZF9zaTEyOChhLGIpOworICAgIHRtcDIgPSBfbW1feG9yX3NpMTI4KGEsYik7CisgICAgdG1wMiA9IF9tbV9zcmFpX2VwaTMyKHRtcDIsMSk7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMzIodG1wMSx0bXAyKTsKK30KKwordWludDh4MTZfdCB2aGFkZHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWSEFERC5VOCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50OHgxNl90IHZoYWRkcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgLy8gVkhBREQuVTggcTAscTAscTAKK3sKKyAgICBfX20xMjhpIGMxLCBzdW0sIHJlczsKKyAgICBjMSA9IF9tbV9zZXQxX2VwaTgoMSk7CisgICAgc3VtID0gX21tX2F2Z19lcHU4KGEsIGIpOyAvL3Jlc3VsdCBpcyByb3VuZGVkLCBuZWVkIHRvIGNvbXBlbnNhdGUgaXQKKyAgICByZXMgPSBfbW1feG9yX3NpMTI4KGEsIGIpOyAvL2ZvciByb3VuZGluZyBjb21wZW5zYXRpb24KKyAgICByZXMgPSBfbW1fYW5kX3NpMTI4KHJlcyxjMSk7IC8vZm9yIHJvdW5kaW5nIGNvbXBlbnNhdGlvbgorICAgIHJldHVybiBfbW1fc3ViX2VwaTggKHN1bSwgcmVzKTsgLy9hY3R1YWwgcm91bmRpbmcgY29tcGVuc2F0aW9uCit9CisKK3VpbnQxNng4X3QgdmhhZGRxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZIQURELnMxNiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZoYWRkcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIC8vIFZIQURELnMxNiBxMCxxMCxxMAoreworICAgIF9fbTEyOGkgc3VtLCByZXM7CisgICAgc3VtID0gX21tX2F2Z19lcHUxNihhLCBiKTsgLy9yZXN1bHQgaXMgcm91bmRlZCwgbmVlZCB0byBjb21wZW5zYXRlIGl0CisgICAgcmVzID0gX21tX3hvcl9zaTEyOChhLCBiKTsgLy9mb3Igcm91bmRpbmcgY29tcGVuc2F0aW9uCisgICAgcmVzID0gX21tX3NsbGlfZXBpMTYgKHJlcywxNSk7IC8vc2hpZnQgbGVmdCAgdGhlbiBiYWNrIHJpZ2h0IHRvCisgICAgcmVzID0gX21tX3NybGlfZXBpMTYgKHJlcywxNSk7IC8vZ2V0IDEgb3IgemVybworICAgIHJldHVybiBfbW1fc3ViX2VwaTE2IChzdW0sIHJlcyk7IC8vYWN0dWFsIHJvdW5kaW5nIGNvbXBlbnNhdGlvbgorfQorCit1aW50MzJ4NF90IHZoYWRkcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWSEFERC5VMzIgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2aGFkZHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSAvLyBWSEFERC5VMzIgcTAscTAscTAKK3sKKyAgICAvL25lZWQgdG8gYXZvaWQgaW50ZXJuYWwgb3ZlcmZsb3csIHdpbGwgdXNlIHRoZSAoeCZ5KSsoKHheeSk+PjEpLgorICAgIF9fbTEyOGkgdG1wMSwgdG1wMjsKKyAgICB0bXAxID0gX21tX2FuZF9zaTEyOChhLGIpOworICAgIHRtcDIgPSBfbW1feG9yX3NpMTI4KGEsYik7CisgICAgdG1wMiA9IF9tbV9zcmxpX2VwaTMyKHRtcDIsMSk7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMzIodG1wMSx0bXAyKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKipWZWN0b3Igcm91bmRpbmcgaGFsdmluZyBhZGQ6IHZyaGFkZHtxfV88dHlwZT4uIFZyW2ldOj0oVmFbaV0rVmJbaV0rMSk+PjEgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZyaGFkZF9zOChpbnQ4eDhfdCBhLCAgaW50OHg4X3QgYik7IC8vIFZSSEFERC5TOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2cmhhZGRfczgoaW50OHg4X3QgYSwgIGludDh4OF90IGIpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnJoYWRkcV9zOChfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKworaW50MTZ4NF90IHZyaGFkZF9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYik7IC8vIFZSSEFERC5TMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZyaGFkZF9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYikKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnJoYWRkcV9zMTYoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK2ludDMyeDJfdCB2cmhhZGRfczMyKGludDMyeDJfdCBhLCAgaW50MzJ4Ml90IGIpOyAvLyBWUkhBREQuUzMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2cmhhZGRfczMyKGludDMyeDJfdCBhLCAgaW50MzJ4Ml90IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KHZyaGFkZHFfczMyKF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCit1aW50OHg4X3QgdnJoYWRkX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZSSEFERC5VOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnJoYWRkX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYikKK3sKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX2F2Z19lcHU4KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOyAvL1NTRSwgcmVzdWx0IHJvdW5kaW5nISEhCit9CisKKwordWludDE2eDRfdCB2cmhhZGRfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlJIQURELnMxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZyaGFkZF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpCit7CisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fYXZnX2VwdTE2KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOyAvL1NTRSwgcmVzdWx0IHJvdW5kaW5nISEhCit9CisKKwordWludDMyeDJfdCB2cmhhZGRfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYik7IC8vIFZSSEFERC5VMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2cmhhZGRfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYikKK3sKKyAgICB1aW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KHZyaGFkZHFfdTMyKF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCitpbnQ4eDE2X3QgIHZyaGFkZHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlJIQURELlM4IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4MTZfdCAgdnJoYWRkcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIC8vIFZSSEFERC5TOCBxMCxxMCxxMAoreworICAgIC8vbm8gc2lnbmVkIGF2ZXJhZ2UgaW4geDg2IFNJTUQsIGdvIHRvIHVuc2lnbmVkCisgICAgX19tMTI4aSBjMTI4LCBhdSwgYnUsIHN1bTsKKyAgICBjMTI4ID0gX21tX3NldDFfZXBpOCgweDgwKTsgLy8tMTI4CisgICAgYXUgPSBfbW1fc3ViX2VwaTgoYSwgYzEyOCk7IC8vYWRkIDEyOAorICAgIGJ1ID0gX21tX3N1Yl9lcGk4KGIsIGMxMjgpOyAvL2FkZCAxMjgKKyAgICBzdW0gPSBfbW1fYXZnX2VwdTgoYXUsIGJ1KTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGk4IChzdW0sIGMxMjgpOyAvL3N1YiAxMjgKK30KKworaW50MTZ4OF90ICB2cmhhZGRxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWUkhBREQuUzE2IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCAgdnJoYWRkcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSAvLyBWUkhBREQuUzE2IHEwLHEwLHEwCit7CisgICAgLy9ubyBzaWduZWQgYXZlcmFnZSBpbiB4ODYgU0lNRCwgZ28gdG8gdW5zaWduZWQKKyAgICBfX20xMjhpIGN4ODAwMCwgYXUsIGJ1LCBzdW07CisgICAgY3g4MDAwID0gX21tX3NldDFfZXBpMTYoMHg4MDAwKTsgLy8gLSAzMjc2OAorICAgIGF1ID0gX21tX3N1Yl9lcGkxNihhLCBjeDgwMDApOyAvL2FkZCAzMjc2OAorICAgIGJ1ID0gX21tX3N1Yl9lcGkxNihiLCBjeDgwMDApOyAvL2FkZCAzMjc2OAorICAgIHN1bSA9IF9tbV9hdmdfZXB1MTYoYXUsIGJ1KTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGkxNiAoc3VtLCBjeDgwMDApOyAvL3N1YiAzMjc2OAorfQorCitpbnQzMng0X3QgIHZyaGFkZHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZSSEFERC5TMzIgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90ICB2cmhhZGRxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpCit7CisgICAgLy9uZWVkIHRvIGF2b2lkIG92ZXJmbG93CisgICAgX19tMTI4aSBhMiwgYjIsIHJlcywgc3VtOworICAgIGEyID0gX21tX3NyYWlfZXBpMzIoYSwxKTsgLy9hMj1hLzI7CisgICAgYjIgPSBfbW1fc3JhaV9lcGkzMihiLDEpOyAvLyBiMj1iLzI7CisgICAgcmVzID0gX21tX29yX3NpMTI4KGEsYik7IC8vZm9yIHJvdW5kaW5nCisgICAgcmVzID0gX21tX3NsbGlfZXBpMzIgKHJlcywzMSk7IC8vc2hpZnQgbGVmdCAgdGhlbiBiYWNrIHJpZ2h0IHRvCisgICAgcmVzID0gX21tX3NybGlfZXBpMzIgKHJlcywzMSk7IC8vZ2V0IDEgb3IgemVybworICAgIHN1bSA9IF9tbV9hZGRfZXBpMzIoYTIsYjIpOworICAgIHJldHVybiBfbW1fYWRkX2VwaTMyKHN1bSxyZXMpOworfQorCit1aW50OHgxNl90ICAgdnJoYWRkcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZSSEFERC5VOCBxMCxxMCxxMAorI2RlZmluZSB2cmhhZGRxX3U4IF9tbV9hdmdfZXB1OCAvL1NTRTIsIHJlc3VsdHMgcm91bmRlZAorCit1aW50MTZ4OF90ICAgdnJoYWRkcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWUkhBREQuczE2IHEwLHEwLHEwCisjZGVmaW5lIHZyaGFkZHFfdTE2IF9tbV9hdmdfZXB1MTYgLy9TU0UyLCByZXN1bHRzIHJvdW5kZWQKKworCit1aW50MzJ4NF90IHZyaGFkZHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVlJIQURELlUzMiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZyaGFkZHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSAvLyBWUkhBREQuVTMyIHEwLHEwLHEwCit7CisgICAgLy9uZWVkIHRvIGF2b2lkIG92ZXJmbG93CisgICAgX19tMTI4aSBhMiwgYjIsIHJlcywgc3VtOworICAgIGEyID0gX21tX3NybGlfZXBpMzIoYSwxKTsgLy9hMj1hLzI7CisgICAgYjIgPSBfbW1fc3JsaV9lcGkzMihiLDEpOyAvLyBiMj1iLzI7CisgICAgcmVzID0gX21tX29yX3NpMTI4KGEsYik7IC8vZm9yIHJvdW5kaW5nCisgICAgcmVzID0gX21tX3NsbGlfZXBpMzIgKHJlcywzMSk7IC8vc2hpZnQgbGVmdCAgdGhlbiBiYWNrIHJpZ2h0IHRvCisgICAgcmVzID0gX21tX3NybGlfZXBpMzIgKHJlcywzMSk7IC8vZ2V0IDEgb3IgemVybworICAgIHN1bSA9IF9tbV9hZGRfZXBpMzIoYTIsYjIpOworICAgIHJldHVybiBfbW1fYWRkX2VwaTMyKHN1bSxyZXMpOworfQorCisvLyoqKioqKioqKioqKioqKioqKiBWUUFERDogVmVjdG9yIHNhdHVyYXRpbmcgYWRkICoqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZxYWRkX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWUUFERC5TOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2cWFkZF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9hZGRzX2VwaTgoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKworaW50MTZ4NF90IHZxYWRkX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWUUFERC5TMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZxYWRkX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9hZGRzX2VwaTE2KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK2ludDMyeDJfdCB2cWFkZF9zMzIoaW50MzJ4Ml90IGEsICBpbnQzMngyX3QgYik7IC8vIFZRQURELlMzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdnFhZGRfczMyKGludDMyeDJfdCBhLCAgaW50MzJ4Ml90IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KHZxYWRkcV9zMzIoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK2ludDY0eDFfdCAgdnFhZGRfczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYik7IC8vIFZRQURELlM2NCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ2NHgxX3QgdnFhZGRfczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYiksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgaW50NjR4MV90IHJlczsKKyAgICB1aW50NjRfdCBhNjQsIGI2NDsKKyAgICBhNjQgPSBhLm02NF91NjRbMF07CisgICAgYjY0ID0gYi5tNjRfdTY0WzBdOworICAgIHJlcy5tNjRfdTY0WzBdID0gYTY0ICsgYjY0OworICAgIGE2NCA9IChhNjQgPj4gNjMpICsgKH5fU0lHTkJJVDY0KTsKKyAgICBpZiAoKGludDY0X3QpKChiNjQgXiBhNjQpIHwgfihyZXMubTY0X3U2NFswXSBeIGI2NCkpPj0wKSB7CisgICAgICAgIHJlcy5tNjRfdTY0WzBdID0gYTY0OworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit1aW50OHg4X3QgdnFhZGRfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlFBREQuVTggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZxYWRkX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYikKK3sKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX2FkZHNfZXB1OChfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCit1aW50MTZ4NF90IHZxYWRkX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZRQURELnMxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZxYWRkX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYikKK3sKKyAgICB1aW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9hZGRzX2VwdTE2KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQzMngyX3QgdnFhZGRfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYik7IC8vIFZRQURELlUzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZxYWRkX3UzMih1aW50MzJ4Ml90IGEsICB1aW50MzJ4Ml90IGIpCit7CisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NCh2cWFkZHFfdTMyKF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCit1aW50NjR4MV90IHZxYWRkX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYik7IC8vIFZRQURELlU2NCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50NjR4MV90IHZxYWRkX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYiksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ2NF90IGE2NCwgYjY0OworICAgIHVpbnQ2NHgxX3QgcmVzOworICAgIGE2NCA9IGEubTY0X3U2NFswXTsKKyAgICBiNjQgPSBiLm02NF91NjRbMF07CisgICAgcmVzLm02NF91NjRbMF0gPSBhNjQgKyBiNjQ7CisgICAgaWYgKHJlcy5tNjRfdTY0WzBdIDwgYTY0KSB7CisgICAgICAgIHJlcy5tNjRfdTY0WzBdID0gfih1aW50NjRfdCkwOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitpbnQ4eDE2X3QgICB2cWFkZHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlFBREQuUzggcTAscTAscTAKKyNkZWZpbmUgdnFhZGRxX3M4IF9tbV9hZGRzX2VwaTgKKworaW50MTZ4OF90ICAgdnFhZGRxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWUUFERC5TMTYgcTAscTAscTAKKyNkZWZpbmUgdnFhZGRxX3MxNiBfbW1fYWRkc19lcGkxNgorCitpbnQzMng0X3QgIHZxYWRkcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlFBREQuUzMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCAgdnFhZGRxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpCit7CisgICAgLy9ubyBjb3JyZXNwb25kaW5nIHg4NiBTSU1EIHNvdWx1dGlvbiwgc3BlY2lhbCB0cmlja3MgYXJlIG5lY2Vzc2FyeS4gT3ZlcmZsb3cgaGFwcGVucyBvbmx5IGlmIGEgYW5kIGIgaGF2ZSB0aGUgc2FtZSBzaWduIGFuZCBzdW0gaGFzIHRoZSBvcHBvc2l0ZSBzaWduCisgICAgX19tMTI4aSBjN2ZmZmZmZmYsIHJlcywgcmVzX3NhdCwgcmVzX3hvcl9hLCBiX3hvcl9hXzsKKyAgICBjN2ZmZmZmZmYgPSBfbW1fc2V0MV9lcGkzMigweDdmZmZmZmZmKTsKKyAgICByZXMgPSBfbW1fYWRkX2VwaTMyKGEsIGIpOworICAgIHJlc19zYXQgPSBfbW1fc3JsaV9lcGkzMihhLCAzMSk7CisgICAgcmVzX3NhdCA9IF9tbV9hZGRfZXBpMzIocmVzX3NhdCwgYzdmZmZmZmZmKTsKKyAgICByZXNfeG9yX2EgPSBfbW1feG9yX3NpMTI4KHJlcywgYSk7CisgICAgYl94b3JfYV8gPSBfbW1feG9yX3NpMTI4KGIsIGEpOworICAgIHJlc194b3JfYSA9IF9tbV9hbmRub3Rfc2kxMjgoYl94b3JfYV8sIHJlc194b3JfYSk7CisgICAgcmVzX3hvcl9hID0gX21tX3NyYWlfZXBpMzIocmVzX3hvcl9hLDMxKTsgLy9wcm9wYWdhdGUgdGhlIHNpZ2ggYml0LCBhbGwgZmZmZiBpZiA8MCBhbGwgb25lcyBvdGhlcndpc2UKKyAgICByZXNfc2F0ID0gX21tX2FuZF9zaTEyOChyZXNfeG9yX2EsIHJlc19zYXQpOworICAgIHJlcyA9IF9tbV9hbmRub3Rfc2kxMjgocmVzX3hvcl9hLCByZXMpOworICAgIHJldHVybiBfbW1fb3Jfc2kxMjgocmVzLCByZXNfc2F0KTsKK30KKworaW50NjR4Ml90ICB2cWFkZHFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZRQURELlM2NCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ2NHgyX3QgdnFhZGRxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50NjRfdCBhdG1wWzJdLCBidG1wWzJdLCByZXNbMl07CisgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilhdG1wLCBhKTsKKyAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWJ0bXAsIGIpOworICAgIHJlc1swXSA9IGF0bXBbMF0gKyBidG1wWzBdOworICAgIHJlc1sxXSA9IGF0bXBbMV0gKyBidG1wWzFdOworCisgICAgYXRtcFswXSA9IChhdG1wWzBdID4+IDYzKSArICh+X1NJR05CSVQ2NCk7CisgICAgYXRtcFsxXSA9IChhdG1wWzFdID4+IDYzKSArICh+X1NJR05CSVQ2NCk7CisKKyAgICBpZiAoKGludDY0X3QpKChidG1wWzBdIF4gYXRtcFswXSkgfCB+KHJlc1swXSBeIGJ0bXBbMF0pKT49MCkgeworICAgICAgICByZXNbMF0gPSBhdG1wWzBdOworICAgIH0KKyAgICBpZiAoKGludDY0X3QpKChidG1wWzFdIF4gYXRtcFsxXSkgfCB+KHJlc1sxXSBeIGJ0bXBbMV0pKT49MCkgeworICAgICAgICByZXNbMV0gPSBhdG1wWzFdOworICAgIH0KKyAgICByZXR1cm4gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKXJlcyk7Cit9CisKK3VpbnQ4eDE2X3QgICB2cWFkZHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWUUFERC5VOCBxMCxxMCxxMAorI2RlZmluZSB2cWFkZHFfdTggX21tX2FkZHNfZXB1OAorCit1aW50MTZ4OF90ICAgdnFhZGRxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZRQURELnMxNiBxMCxxMCxxMAorI2RlZmluZSB2cWFkZHFfdTE2IF9tbV9hZGRzX2VwdTE2CisKK3VpbnQzMng0X3QgdnFhZGRxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZRQURELlUzMiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZxYWRkcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpCit7CisgICAgX19tMTI4aSBjODAwMDAwMDAsIGNtcCwgc3Vic3VtLCBzdWJhLCBzdW07CisgICAgYzgwMDAwMDAwID0gX21tX3NldDFfZXBpMzIgKDB4ODAwMDAwMDApOworICAgIHN1bSA9IF9tbV9hZGRfZXBpMzIgKGEsIGIpOworICAgIHN1YnN1bSA9IF9tbV9zdWJfZXBpMzIgKHN1bSwgYzgwMDAwMDAwKTsKKyAgICBzdWJhID0gX21tX3N1Yl9lcGkzMiAoYSwgYzgwMDAwMDAwKTsKKyAgICBjbXAgPSBfbW1fY21wZ3RfZXBpMzIgKCBzdWJhLCBzdWJzdW0pOyAvL25vIHVuc2lnbmVkIGNvbXBhcmlzb24sIG5lZWQgdG8gZ28gdG8gc2lnbmVkCisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAoc3VtLCBjbXApOyAvL3NhdHVyYXRpb24KK30KKwordWludDY0eDJfdCB2cWFkZHFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKTsgLy8gVlFBREQuVTY0IHEwLHEwLHEwCisjaWZkZWYgVVNFX1NTRTQKKyAgICBfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgyX3QgdnFhZGRxX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYikKKyAgICB7CisgICAgICAgIF9fbTEyOGkgYzgwMDAwMDAwLCBzdW0sIGNtcCwgc3ViYSwgc3Vic3VtOworICAgICAgICBjODAwMDAwMDAgPSBfbW1fc2V0X2VwaTMyICgweDgwMDAwMDAwLCAweDAsIDB4ODAwMDAwMDAsIDB4MCk7CisgICAgICAgIHN1bSA9IF9tbV9hZGRfZXBpNjQgKGEsIGIpOworICAgICAgICBzdWJzdW0gPSBfbW1fc3ViX2VwaTY0IChzdW0sIGM4MDAwMDAwMCk7CisgICAgICAgIHN1YmEgPSBfbW1fc3ViX2VwaTY0IChhLCBjODAwMDAwMDApOworICAgICAgICBjbXAgPSBfbW1fY21wZ3RfZXBpNjQgKCBzdWJhLCBzdWJzdW0pOyAvL25vIHVuc2lnbmVkIGNvbXBhcmlzb24sIG5lZWQgdG8gZ28gdG8gc2lnbmVkLCBTU0U0LjIhISEKKyAgICAgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAoc3VtLCBjbXApOyAvL3NhdHVyYXRpb24KKyAgICB9CisjZWxzZQorICAgIF9ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDY0eDJfdCB2cWFkZHFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKKyAgICB7CisgICAgICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50NjRfdCBhdG1wWzJdLCBidG1wWzJdLCByZXNbMl07CisgICAgICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopYXRtcCwgYSk7CisgICAgICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopYnRtcCwgYik7CisgICAgICAgIHJlc1swXSA9IGF0bXBbMF0gKyBidG1wWzBdOworICAgICAgICByZXNbMV0gPSBhdG1wWzFdICsgYnRtcFsxXTsKKyAgICAgICAgaWYgKHJlc1swXSA8IGF0bXBbMF0pIHJlc1swXSA9IH4odWludDY0X3QpMDsKKyAgICAgICAgaWYgKHJlc1sxXSA8IGF0bXBbMV0pIHJlc1sxXSA9IH4odWludDY0X3QpMDsKKyAgICAgICAgcmV0dXJuIF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikocmVzKSk7CisgICAgfQorI2VuZGlmCisKKworLy8qKioqKioqKioqKioqKioqKioqIFZlY3RvciBhZGQgaGlnaCBoYWxmICh0cnVuY2F0ZWQpICAqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQ4eDhfdCAgIHZhZGRobl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkFEREhOLkkxNiBkMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCAgIHZhZGRobl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSAvLyBWQURESE4uSTE2IGQwLHEwLHEwCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBzdW07CisgICAgc3VtID0gX21tX2FkZF9lcGkxNiAoYSwgYik7CisgICAgc3VtID0gX21tX3NyYWlfZXBpMTYgKHN1bSwgOCk7CisgICAgc3VtID0gX21tX3BhY2tzX2VwaTE2IChzdW0sIHN1bSk7IC8vdXNlIDY0IGxvdyBiaXRzIG9ubHkKKyAgICByZXR1cm42NChzdW0pOworfQorCitpbnQxNng0X3QgIHZhZGRobl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVkFEREhOLkkzMiBkMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgIHZhZGRobl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSAvLyBWQURESE4uSTMyIGQwLHEwLHEwCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgc3VtOworICAgIHN1bSA9IF9tbV9hZGRfZXBpMzIgKGEsIGIpOworICAgIHN1bSA9IF9tbV9zcmFpX2VwaTMyKHN1bSwgMTYpOworICAgIHN1bSA9IF9tbV9wYWNrc19lcGkzMiAoc3VtLCBzdW0pOyAvL3VzZSA2NCBsb3cgYml0cyBvbmx5CisgICAgcmV0dXJuNjQoc3VtKTsKK30KKworaW50MzJ4Ml90ICB2YWRkaG5fczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZBRERITi5JNjQgZDAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90ICB2YWRkaG5fczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYikKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSBzdW07CisgICAgc3VtID0gX21tX2FkZF9lcGk2NCAoYSwgYik7CisgICAgc3VtID0gX21tX3NodWZmbGVfZXBpMzIoc3VtLCAgMSB8ICgzIDw8IDIpIHwgKDAgPDwgNCkgfCAoMiA8PCA2KSk7CisgICAgcmV0dXJuNjQoc3VtKTsKK30KKwordWludDh4OF90ICB2YWRkaG5fdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkFEREhOLkkxNiBkMCxxMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgIHZhZGRobl91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIC8vIFZBRERITi5JMTYgZDAscTAscTAKK3sKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBzdW07CisgICAgc3VtID0gX21tX2FkZF9lcGkxNiAoYSwgYik7CisgICAgc3VtID0gX21tX3NybGlfZXBpMTYgKHN1bSwgOCk7CisgICAgc3VtID0gX21tX3BhY2t1c19lcGkxNiAoc3VtLHN1bSk7IC8vdXNlIDY0IGxvdyBiaXRzIG9ubHkKKyAgICByZXR1cm42NChzdW0pOworfQorCit1aW50MTZ4NF90IHZhZGRobl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWQURESE4uSTMyIGQwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdmFkZGhuX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYikgLy8gVkFEREhOLkkzMiBkMCxxMCxxMAoreworICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSBzdW07CisgICAgc3VtID0gX21tX2FkZF9lcGkzMiAoYSwgYik7CisgICAgc3VtID0gX21tX3NybGlfZXBpMzIgKHN1bSwgMTYpOworICAgIHN1bSA9IF9NTV9QQUNLVVMxX0VQSTMyIChzdW0pOyAvL3VzZSA2NCBsb3cgYml0cyBvbmx5CisgICAgcmV0dXJuNjQoc3VtKTsKK30KKwordWludDMyeDJfdCB2YWRkaG5fdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKTsgLy8gVkFEREhOLkk2NCBkMCxxMCxxMAorI2RlZmluZSB2YWRkaG5fdTY0IHZhZGRobl9zNjQKKworLy8qKioqKioqKioqKiBWZWN0b3Igcm91bmRpbmcgYWRkIGhpZ2ggaGFsZjogdnJhZGRobl88dHlwZT4gKioqKioqKioqKioqKioqKioqLgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90ICAgdnJhZGRobl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlJBRERITi5JMTYgZDAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgICB2cmFkZGhuX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIC8vIFZSQURESE4uSTE2IGQwLHEwLHEwCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBzdW0sIG1hc2sxOworICAgIHN1bSA9IF9tbV9hZGRfZXBpMTYgKGEsIGIpOworICAgIG1hc2sxID0gX21tX3NsbGlfZXBpMTYoc3VtLCA5KTsgLy9zaGlmdCBsZWZ0IHRoZW4gYmFjayByaWdodCB0bworICAgIG1hc2sxID0gX21tX3NybGlfZXBpMTYobWFzazEsIDE1KTsgLy9nZXQgIDctdGggYml0IDEgb3IgemVybworICAgIHN1bSA9IF9tbV9zcmFpX2VwaTE2IChzdW0sIDgpOyAvL2dldCBoaWdoIGhhbGYKKyAgICBzdW0gPSBfbW1fYWRkX2VwaTE2IChzdW0sIG1hc2sxKTsgLy9hY3R1YWwgcm91bmRpbmcKKyAgICBzdW0gPSBfbW1fcGFja3NfZXBpMTYgKHN1bSwgc3VtKTsKKyAgICByZXR1cm42NChzdW0pOworfQorCitpbnQxNng0X3QgIHZyYWRkaG5fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZSQURESE4uSTMyIGQwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCAgdnJhZGRobl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSAvLyBWUkFEREhOLkkzMiBkMCxxMCxxMAoreworICAgIC8vU0lNRCBtYXkgYmUgbm90IG9wdGltYWwsIHNlcmlhbCBtYXkgYmUgZmFzdGVyCisgICAgaW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgc3VtLCBtYXNrMTsKKyAgICBzdW0gPSBfbW1fYWRkX2VwaTMyIChhLCBiKTsKKyAgICBtYXNrMSA9IF9tbV9zbGxpX2VwaTMyKHN1bSwgMTcpOyAvL3NoaWZ0IGxlZnQgdGhlbiBiYWNrIHJpZ2h0IHRvCisgICAgbWFzazEgPSBfbW1fc3JsaV9lcGkzMihtYXNrMSwzMSk7IC8vZ2V0ICAxNS10aCBiaXQgMSBvciB6ZXJvCisgICAgc3VtID0gX21tX3NyYWlfZXBpMzIgKHN1bSwgMTYpOyAvL2dldCBoaWdoIGhhbGYKKyAgICBzdW0gPSBfbW1fYWRkX2VwaTMyIChzdW0sIG1hc2sxKTsgLy9hY3R1YWwgcm91bmRpbmcKKyAgICBzdW0gPSBfbW1fcGFja3NfZXBpMzIgKHN1bSwgc3VtKTsKKyAgICByZXR1cm42NChzdW0pOworfQorCitpbnQzMngyX3QgIHZyYWRkaG5fczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZSQURESE4uSTY0IGQwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2cmFkZGhuX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpCit7CisgICAgLy9TSU1EIG1heSBiZSBub3Qgb3B0aW1hbCwgc2VyaWFsIG1heSBiZSBmYXN0ZXIKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSBzdW0sIG1hc2sxOworICAgIHN1bSA9IF9tbV9hZGRfZXBpNjQgKGEsIGIpOworICAgIG1hc2sxID0gX21tX3NsbGlfZXBpNjQoc3VtLCAzMyk7IC8vc2hpZnQgbGVmdCB0aGVuIGJhY2sgcmlnaHQgdG8KKyAgICBtYXNrMSA9IF9tbV9zcmxpX2VwaTY0KG1hc2sxLDMyKTsgLy9nZXQgIDMxLXRoIGJpdCAxIG9yIHplcm8KKyAgICBzdW0gPSBfbW1fYWRkX2VwaTY0IChzdW0sIG1hc2sxKTsgLy9hY3R1YWwgaGlnaCBoYWxmIHJvdW5kaW5nCisgICAgc3VtID0gX21tX3NodWZmbGVfZXBpMzIoc3VtLCAgMSB8ICgzIDw8IDIpIHwgKDEgPDwgNCkgfCAoMyA8PCA2KSk7CisgICAgcmV0dXJuNjQoc3VtKTsKK30KKwordWludDh4OF90ICB2cmFkZGhuX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZSQURESE4uSTE2IGQwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCAgdnJhZGRobl91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIC8vIFZSQURESE4uSTE2IGQwLHEwLHEwCit7CisgICAgdWludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgc3VtLCBtYXNrMTsKKyAgICBzdW0gPSBfbW1fYWRkX2VwaTE2IChhLCBiKTsKKyAgICBtYXNrMSA9IF9tbV9zbGxpX2VwaTE2KHN1bSwgOSk7IC8vc2hpZnQgbGVmdCB0aGVuIGJhY2sgcmlnaHQgdG8KKyAgICBtYXNrMSA9IF9tbV9zcmxpX2VwaTE2KG1hc2sxLCAxNSk7IC8vZ2V0ICA3LXRoIGJpdCAxIG9yIHplcm8KKyAgICBzdW0gPSBfbW1fc3JhaV9lcGkxNiAoc3VtLCA4KTsgLy9nZXQgaGlnaCBoYWxmCisgICAgc3VtID0gX21tX2FkZF9lcGkxNiAoc3VtLCBtYXNrMSk7IC8vYWN0dWFsIHJvdW5kaW5nCisgICAgc3VtID0gX21tX3BhY2t1c19lcGkxNiAoc3VtLCBzdW0pOworICAgIHJldHVybjY0KHN1bSk7Cit9CisKK3VpbnQxNng0X3QgdnJhZGRobl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWUkFEREhOLkkzMiBkMCxxMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZyYWRkaG5fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKQoreworICAgIC8vU0lNRCBtYXkgYmUgbm90IG9wdGltYWwsIHNlcmlhbCBtYXkgYmUgZmFzdGVyCisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIHN1bSwgbWFzazE7CisgICAgc3VtID0gX21tX2FkZF9lcGkzMiAoYSwgYik7CisgICAgbWFzazEgPSBfbW1fc2xsaV9lcGkzMihzdW0sIDE3KTsgLy9zaGlmdCBsZWZ0IHRoZW4gYmFjayByaWdodCB0bworICAgIG1hc2sxID0gX21tX3NybGlfZXBpMzIobWFzazEsMzEpOyAvL2dldCAgMTUtdGggYml0IDEgb3IgemVybworICAgIHN1bSA9IF9tbV9zcmFpX2VwaTMyIChzdW0sIDE2KTsgLy9nZXQgaGlnaCBoYWxmCisgICAgc3VtID0gX21tX2FkZF9lcGkzMiAoc3VtLCBtYXNrMSk7IC8vYWN0dWFsIHJvdW5kaW5nCisgICAgc3VtID0gX01NX1BBQ0tVUzFfRVBJMzIgKHN1bSk7CisgICAgcmV0dXJuNjQoc3VtKTsKK30KKwordWludDMyeDJfdCB2cmFkZGhuX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYik7IC8vIFZSQURESE4uSTY0IGQwLHEwLHEwCisjZGVmaW5lIHZyYWRkaG5fdTY0IHZyYWRkaG5fczY0CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKiogICAgICAgICAgICAgTXVsdGlwbGljYXRpb24gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8vVmVjdG9yIG11bHRpcGx5OiB2bXVsIC0+IFZyW2ldIDo9IFZhW2ldICogVmJbaV0KKy8vQXMgd2UgZG9uJ3QgZ28gdG8gd2lkZXIgcmVzdWx0IGZ1bmN0aW9ucyBhcmUgZXF1YWwgdG8gIm11bHRpcGx5IGxvdyIgaW4geDg2CitpbnQ4eDhfdCB2bXVsX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWTVVMLkk4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZtdWxfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgLy8gVk1VTC5JOCBkMCxkMCxkMAoreworICAgIC8vIG5vIDggYml0IHNpbWQgbXVsdGlwbHksIG5lZWQgdG8gZ28gdG8gMTYgYml0cyBpbiBTU0UKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIGExMjgsIGIxMjgsIHJlczsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s4XzE2X2V2ZW5fb2RkWzE2XSA9IHsgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMSwgMywgNSwgNywgOSwgMTEsIDEzLCAxNSB9OworICAgIGExMjggPSBfTU1fQ1ZURVBJOF9FUEkxNiAoX3BNMTI4aShhKSk7IC8vIFNTRSA0LjEgdXNlIGxvdyA2NCBiaXRzCisgICAgYjEyOCA9IF9NTV9DVlRFUEk4X0VQSTE2IChfcE0xMjhpKGIpKTsgLy8gU1NFIDQuMSB1c2UgbG93IDY0IGJpdHMKKyAgICByZXMgPSBfbW1fbXVsbG9fZXBpMTYgKGExMjgsIGIxMjgpOworICAgIHJlcyA9IF9tbV9zaHVmZmxlX2VwaTggKHJlcywgKihfX20xMjhpKikgbWFzazhfMTZfZXZlbl9vZGQpOyAvL3JldHVybiB0byA4IGJpdCBmcm9tIDE2LCB1c2UgNjQgbG93IGJpdHMgb25seQorICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDE2eDRfdCB2bXVsX3MxNihpbnQxNng0X3QgYSwgIGludDE2eDRfdCBiKTsgLy8gVk1VTC5JMTYgZDAsZDAsZDAKKyNkZWZpbmUgdm11bF9zMTYgdm11bF91MTYKKworaW50MzJ4Ml90IHZtdWxfczMyKGludDMyeDJfdCBhLCAgaW50MzJ4Ml90IGIpOyAvLyBWTVVMLkkzMiBkMCxkMCxkMAorI2RlZmluZSB2bXVsX3MzMiB2bXVsX3UzMgorCitmbG9hdDMyeDJfdCB2bXVsX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVk1VTC5GMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3Qgdm11bF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikKK3sKKyAgICBmbG9hdDMyeDRfdCB0bXA7CisgICAgX19tNjRfMTI4IHJlczY0OworICAgIHRtcCA9ICBfbW1fbXVsX3BzKF9wTTEyOChhKSxfcE0xMjgoYikpOworICAgIF9NNjRmKHJlczY0LCB0bXApOyAvL3VzZSBsb3cgNjQgYml0cworICAgIHJldHVybiByZXM2NDsKK30KKwordWludDh4OF90IHZtdWxfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVk1VTC5JOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3Qgdm11bF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpIC8vIFZNVUwuSTggZDAsZDAsZDAKK3sKKyAgICAvLyBubyA4IGJpdCBzaW1kIG11bHRpcGx5LCBuZWVkIHRvIGdvIHRvIDE2IGJpdHMgaW4gU1NFCisgICAgdWludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgbWFzaywgYTEyOCwgYjEyOCwgcmVzOworICAgIG1hc2sgPSBfbW1fc2V0MV9lcGkxNigweGZmKTsKKyAgICBhMTI4ID0gX01NX0NWVEVQVThfRVBJMTYgKF9wTTEyOGkoYSkpOworICAgIGIxMjggPSBfTU1fQ1ZURVBVOF9FUEkxNiAoX3BNMTI4aShiKSk7CisgICAgcmVzID0gX21tX211bGxvX2VwaTE2IChhMTI4LCBiMTI4KTsKKyAgICByZXMgPSBfbW1fYW5kX3NpMTI4KHJlcywgbWFzayk7IC8vdG8gYXZvaWQgc2F0dXJhdGlvbgorICAgIHJlcyA9IF9tbV9wYWNrdXNfZXBpMTYgKHJlcyxyZXMpOyAvL3VzZSBvbmx5IGxvdyA2NCBiaXRzCisgICAgcmV0dXJuNjQocmVzKTsKK30KKwordWludDE2eDRfdCB2bXVsX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZNVUwuSTE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3Qgdm11bF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpCit7CisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fbXVsbG9fZXBpMTYoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDMyeDJfdCAgIHZtdWxfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVk1VTC5JMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoIHVpbnQzMngyX3QgICB2bXVsX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgdWludDMyeDJfdCByZXM7CisgICAgcmVzLm02NF91MzJbMF0gPSBhLm02NF91MzJbMF0gKiBiLm02NF91MzJbMF07CisgICAgcmVzLm02NF91MzJbMV0gPSBhLm02NF91MzJbMV0gKiBiLm02NF91MzJbMV07CisgICAgcmV0dXJuIHJlczsKK30KKworcG9seTh4OF90IHZtdWxfcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiKTsgLy8gVk1VTC5QOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBwb2x5OHg4X3Qgdm11bF9wOChwb2x5OHg4X3QgYSwgcG9seTh4OF90IGIpCit7CisgICAgLy9tYXkgYmUgb3B0aW1pemVkCisgICAgcG9seTh4OF90IHJlczY0OworICAgIF9fbTEyOGkgYTY0LCBiNjQsIGMxLCByZXMsIHRtcCwgYm1hc2tlZDsKKyAgICBpbnQgaTsKKyAgICBhNjQgPSBfcE0xMjhpKGEpOworICAgIGI2NCA9IF9wTTEyOGkoYik7CisgICAgYzEgPSBfbW1fY21wZXFfZXBpOCAoYTY0LGE2NCk7IC8vYWxsIG9uZXMgMHhmZi4uLi4KKyAgICBjMSA9IHZzaHJxX25fdTgoYzEsNyk7IC8vMHgxCisgICAgYm1hc2tlZCA9IF9tbV9hbmRfc2kxMjgoYjY0LCBjMSk7IC8vMHgxCisgICAgcmVzID0gdm11bHFfdTgoYTY0LCBibWFza2VkKTsKKyAgICBmb3IoaSA9IDE7IGk8ODsgaSsrKSB7CisgICAgICAgIGMxID0gX21tX3NsbGlfZXBpMTYoYzEsMSk7IC8vc2hpZnQgbWFzayBsZWZ0IGJ5IDEsIDE2IGJpdCBzaGlmdCBpcyBPSyBoZXJlCisgICAgICAgIGJtYXNrZWQgPSBfbW1fYW5kX3NpMTI4KGI2NCwgYzEpOyAvLzB4MQorICAgICAgICB0bXAgPSB2bXVscV91OChhNjQsIGJtYXNrZWQpOworICAgICAgICByZXMgPSBfbW1feG9yX3NpMTI4KHJlcywgdG1wKTsKKyAgICB9CisgICAgcmV0dXJuNjQgKHJlcyk7Cit9CisKK2ludDh4MTZfdCB2bXVscV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWTVVMLkk4IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4MTZfdCB2bXVscV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIC8vIFZNVUwuSTggcTAscTAscTAKK3sKKyAgICAvLyBubyA4IGJpdCBzaW1kIG11bHRpcGx5LCBuZWVkIHRvIGdvIHRvIDE2IGJpdHMKKyAgICAvL3NvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbAorICAgIF9fbTEyOGkgYTE2LCBiMTYsIHIxNl8xLCByMTZfMjsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s4XzE2X2V2ZW5fb2RkWzE2XSA9IHsgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMSwgMywgNSwgNywgOSwgMTEsIDEzLCAxNSB9OworICAgIGExNiA9IF9NTV9DVlRFUEk4X0VQSTE2IChhKTsgLy8gU1NFIDQuMQorICAgIGIxNiA9IF9NTV9DVlRFUEk4X0VQSTE2IChiKTsgLy8gU1NFIDQuMQorICAgIHIxNl8xID0gX21tX211bGxvX2VwaTE2IChhMTYsIGIxNik7CisgICAgLy9zd2FwIGhpIGFuZCBsb3cgcGFydCBvZiBhIGFuZCBiIHRvIHByb2Nlc3MgdGhlIHJlbWFpbmluZyBkYXRhCisgICAgYTE2ID0gX21tX3NodWZmbGVfZXBpMzIgKGEsIF9TV0FQX0hJX0xPVzMyKTsKKyAgICBiMTYgPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYiwgX1NXQVBfSElfTE9XMzIpOworICAgIGExNiA9IF9NTV9DVlRFUEk4X0VQSTE2IChhMTYpOyAvLyBTU0UgNC4xCisgICAgYjE2ID0gX01NX0NWVEVQSThfRVBJMTYgKGIxNik7IC8vIFNTRSA0LjEgIF9fbTEyOGkgcjE2XzIKKworICAgIHIxNl8yID0gX21tX211bGxvX2VwaTE2IChhMTYsIGIxNik7CisgICAgcjE2XzEgPSBfbW1fc2h1ZmZsZV9lcGk4IChyMTZfMSwgKihfX20xMjhpKiltYXNrOF8xNl9ldmVuX29kZCk7IC8vcmV0dXJuIHRvIDggYml0CisgICAgcjE2XzIgPSBfbW1fc2h1ZmZsZV9lcGk4IChyMTZfMiwgKihfX20xMjhpKiltYXNrOF8xNl9ldmVuX29kZCk7IC8vcmV0dXJuIHRvIDggYml0CisKKyAgICByZXR1cm4gX21tX3VucGFja2xvX2VwaTY0KHIxNl8xLCAgcjE2XzIpOworfQorCitpbnQxNng4X3QgICB2bXVscV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVk1VTC5JMTYgcTAscTAscTAKKyNkZWZpbmUgdm11bHFfczE2IF9tbV9tdWxsb19lcGkxNgorCitpbnQzMng0X3QgICB2bXVscV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVk1VTC5JMzIgcTAscTAscTAKKyNkZWZpbmUgdm11bHFfczMyIF9NTV9NVUxMT19FUEkzMiAvL1NTRTQuMQorCitmbG9hdDMyeDRfdCB2bXVscV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZNVUwuRjMyIHEwLHEwLHEwCisjZGVmaW5lIHZtdWxxX2YzMiBfbW1fbXVsX3BzCisKK3VpbnQ4eDE2X3Qgdm11bHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWTVVMLkk4IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDE2X3Qgdm11bHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpIC8vIFZNVUwuSTggcTAscTAscTAKK3sKKyAgICAvLyBubyA4IGJpdCBzaW1kIG11bHRpcGx5LCBuZWVkIHRvIGdvIHRvIDE2IGJpdHMKKyAgICAvL3NvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbAorICAgIF9fbTEyOGkgbWFza2ZmLCBhMTYsIGIxNiwgcjE2XzEsIHIxNl8yOworICAgIG1hc2tmZiA9IF9tbV9zZXQxX2VwaTE2KDB4ZmYpOworICAgIGExNiA9IF9NTV9DVlRFUFU4X0VQSTE2IChhKTsgLy8gU1NFIDQuMQorICAgIGIxNiA9IF9NTV9DVlRFUFU4X0VQSTE2IChiKTsgLy8gU1NFIDQuMQorICAgIHIxNl8xID0gX21tX211bGxvX2VwaTE2IChhMTYsIGIxNik7CisgICAgcjE2XzEgPSBfbW1fYW5kX3NpMTI4KHIxNl8xLCBtYXNrZmYpOyAvL3RvIGF2b2lkIHNhdHVyYXRpb24KKyAgICAvL3N3YXAgaGkgYW5kIGxvdyBwYXJ0IG9mIGEgYW5kIGIgdG8gcHJvY2VzcyB0aGUgcmVtYWluaW5nIGRhdGEKKyAgICBhMTYgPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYSwgX1NXQVBfSElfTE9XMzIpOworICAgIGIxNiA9IF9tbV9zaHVmZmxlX2VwaTMyIChiLCBfU1dBUF9ISV9MT1czMik7CisgICAgYTE2ID0gX01NX0NWVEVQSThfRVBJMTYgKGExNik7IC8vIFNTRSA0LjEKKyAgICBiMTYgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoYjE2KTsgLy8gU1NFIDQuMQorCisgICAgcjE2XzIgPSBfbW1fbXVsbG9fZXBpMTYgKGExNiwgYjE2KTsKKyAgICByMTZfMiA9IF9tbV9hbmRfc2kxMjgocjE2XzIsIG1hc2tmZik7IC8vdG8gYXZvaWQgc2F0dXJhdGlvbgorICAgIHJldHVybiBfbW1fcGFja3VzX2VwaTE2IChyMTZfMSwgIHIxNl8yKTsKK30KKwordWludDE2eDhfdCAgIHZtdWxxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZNVUwuSTE2IHEwLHEwLHEwCisjZGVmaW5lIHZtdWxxX3UxNiBfbW1fbXVsbG9fZXBpMTYKKwordWludDMyeDRfdCAgIHZtdWxxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZNVUwuSTMyIHEwLHEwLHEwCisjZGVmaW5lIHZtdWxxX3UzMiBfTU1fTVVMTE9fRVBJMzIgLy9TU0U0LjEKKworcG9seTh4MTZfdCB2bXVscV9wOChwb2x5OHgxNl90IGEsIHBvbHk4eDE2X3QgYik7IC8vIFZNVUwuUDggcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgcG9seTh4MTZfdCB2bXVscV9wOChwb2x5OHgxNl90IGEsIHBvbHk4eDE2X3QgYikKK3sKKyAgICAvL21heSBiZSBvcHRpbWl6ZWQKKyAgICBfX20xMjhpIGMxLCByZXMsIHRtcCwgYm1hc2tlZDsKKyAgICBpbnQgaTsKKyAgICBjMSA9IF9tbV9jbXBlcV9lcGk4IChhLGEpOyAvL2FsbCBvbmVzIDB4ZmYuLi4uCisgICAgYzEgPSB2c2hycV9uX3U4KGMxLDcpOyAvLzB4MQorICAgIGJtYXNrZWQgPSBfbW1fYW5kX3NpMTI4KGIsIGMxKTsgLy8weDEKKyAgICByZXMgPSB2bXVscV91OChhLCBibWFza2VkKTsKKyAgICBmb3IoaSA9IDE7IGk8ODsgaSsrKSB7CisgICAgICAgIGMxID0gX21tX3NsbGlfZXBpMTYoYzEsMSk7IC8vc2hpZnQgbWFzayBsZWZ0IGJ5IDEsIDE2IGJpdCBzaGlmdCBpcyBPSyBoZXJlCisgICAgICAgIGJtYXNrZWQgPSBfbW1fYW5kX3NpMTI4KGIsIGMxKTsgLy8weDEKKyAgICAgICAgdG1wID0gdm11bHFfdTgoYSwgYm1hc2tlZCk7CisgICAgICAgIHJlcyA9IF9tbV94b3Jfc2kxMjgocmVzLCB0bXApOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKiogVmVjdG9yIGxvbmcgbXVsdGlwbHkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50MTZ4OF90IHZtdWxsX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWTVVMTC5TOCBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3Qgdm11bGxfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgLy8gVk1VTEwuUzggcTAsZDAsZDAKK3sKKyAgICAvL25vIDggYml0IHNpbWQgbXVsdGlwbHksIG5lZWQgdG8gZ28gdG8gMTYgYml0cworICAgIF9fbTEyOGkgYTE2LCBiMTY7CisgICAgYTE2ID0gX01NX0NWVEVQSThfRVBJMTYgKF9wTTEyOGkoYSkpOyAvLyBTU0UgNC4xCisgICAgYjE2ID0gX01NX0NWVEVQSThfRVBJMTYgKF9wTTEyOGkoYikpOyAvLyBTU0UgNC4xCisgICAgcmV0dXJuIF9tbV9tdWxsb19lcGkxNiAoYTE2LCBiMTYpOyAvL3Nob3VsZCBmaXQgaW50byAxNiBiaXQKK30KKworaW50MzJ4NF90IHZtdWxsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWTVVMTC5TMTYgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZtdWxsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIC8vIFZNVUxMLlMxNiBxMCxkMCxkMAoreworICAgICNpZmRlZiBVU0VfU1NFNAorICAgICAgICBfX20xMjhpIGExNiwgYjE2OworICAgICAgICBhMTYgPSBfTU1fQ1ZURVBJMTZfRVBJMzIgKF9wTTEyOGkoYSkpOyAvLyBTU0UgNC4xCisgICAgICAgIGIxNiA9IF9NTV9DVlRFUEkxNl9FUEkzMiAoX3BNMTI4aShiKSk7IC8vIFNTRSA0LjEKKyAgICAgICAgcmV0dXJuIF9NTV9NVUxMT19FUEkzMiAoYTE2LCBiMTYpOyAvLyBTU0UgNC4xCisgICAgI2Vsc2UKKyAgICAgICAgX19tMTI4aSBsb3csIGhpLCBhMTI4LGIxMjg7CisgICAgICAgIGExMjggPSBfcE0xMjhpKGEpOworICAgICAgICBiMTI4ID0gX3BNMTI4aShiKTsKKyAgICAgICAgbG93ID0gIF9tbV9tdWxsb19lcGkxNihhMTI4LGIxMjgpOworICAgICAgICBoaSA9ICAgX21tX211bGhpX2VwaTE2KGExMjgsYjEyOCk7CisgICAgICAgIHJldHVybiBfbW1fdW5wYWNrbG9fZXBpMTYobG93LGhpKTsKKyAgICAjZW5kaWYKK30KKworaW50NjR4Ml90IHZtdWxsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWTVVMTC5TMzIgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4Ml90IHZtdWxsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpIC8vIFZNVUxMLlMzMiBxMCxkMCxkMAoreworICAgIF9fbTEyOGkgYWIsIGJhLCBhMTI4LCBiMTI4OworICAgIGExMjggPSBfcE0xMjhpKGEpOworICAgIGIxMjggPSBfcE0xMjhpKGIpOworICAgIGFiID0gX21tX3VucGFja2xvX2VwaTMyIChhMTI4LCBiMTI4KTsgLy9hMCwgYjAsIGExLGIxCisgICAgYmEgPSBfbW1fdW5wYWNrbG9fZXBpMzIgKGIxMjgsIGExMjgpOyAvL2IwLCBhMCwgYjEsYTEKKyAgICByZXR1cm4gX01NX01VTF9FUEkzMihhYiwgYmEpOyAvL3VzZXMgMXJzdCBhbmQgM3JkIGRhdGEgbGFuZXMsIHRoZSBtdWx0aXBsaWNhdGlvbiBnaXZlcyA2NCBiaXQgcmVzdWx0Cit9CisKK3VpbnQxNng4X3Qgdm11bGxfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVk1VTEwuVTggcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDhfdCB2bXVsbF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpIC8vIFZNVUxMLlU4IHEwLGQwLGQwCit7CisgICAgLy9ubyA4IGJpdCBzaW1kIG11bHRpcGx5LCBuZWVkIHRvIGdvIHRvIDE2IGJpdHMKKyAgICBfX20xMjhpIGExNiwgYjE2OworICAgIGExNiA9IF9NTV9DVlRFUFU4X0VQSTE2IChfcE0xMjhpKGEpKTsgLy8gU1NFIDQuMQorICAgIGIxNiA9IF9NTV9DVlRFUFU4X0VQSTE2IChfcE0xMjhpKGIpKTsgLy8gU1NFIDQuMQorICAgIHJldHVybiBfbW1fbXVsbG9fZXBpMTYgKGExNiwgYjE2KTsgLy9zaG91bGQgZml0IGludG8gMTYgYml0Cit9CisKK3VpbnQzMng0X3Qgdm11bGxfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVk1VTEwuczE2IHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3Qgdm11bGxfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKSAvLyBWTVVMTC5zMTYgcTAsZDAsZDAKK3sKKyAgICAjaWZkZWYgVVNFX1NTRTQKKyAgICAgICAgX19tMTI4aSBhMTYsIGIxNjsKKyAgICAgICAgYTE2ID0gX01NX0NWVEVQVTE2X0VQSTMyIChfcE0xMjhpKGEpKTsgLy8gU1NFIDQuMQorICAgICAgICBiMTYgPSBfTU1fQ1ZURVBVMTZfRVBJMzIgKF9wTTEyOGkoYikpOyAvLyBTU0UgNC4xCisgICAgICAgIHJldHVybiBfTU1fTVVMTE9fRVBJMzIgKGExNiwgYjE2KTsgLy8gU1NFIDQuMQorICAgICNlbHNlCisgICAgICAgIF9fbTEyOGkgYTEyOCxiMTI4LGxvdywgaGk7CisgICAgICAgIGExMjggPSBfcE0xMjhpKGEpOworICAgICAgICBiMTI4ID0gX3BNMTI4aShiKTsKKyAgICAgICAgbG93ID0gIF9tbV9tdWxsb19lcGkxNihhMTI4LGIxMjgpOworICAgICAgICBoaSA9ICAgX21tX211bGhpX2VwdTE2KGExMjgsYjEyOCk7CisgICAgICAgIHJldHVybiBfbW1fdW5wYWNrbG9fZXBpMTYobG93LGhpKTsKKyAgICAjZW5kaWYKK30KKwordWludDY0eDJfdCB2bXVsbF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWTVVMTC5VMzIgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDJfdCB2bXVsbF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpIC8vIFZNVUxMLlUzMiBxMCxkMCxkMAoreworICAgIC8vL21heSBiZSBub3Qgb3B0aW1hbCBjb21wYXJlZCB3aXRoIHNlcmlhbCBpbXBsZW1lbnRhdGlvbgorICAgIF9fbTEyOGkgYWIsIGJhLCBhMTI4LCBiMTI4OworICAgIGExMjggPSBfcE0xMjhpKGEpOworICAgIGIxMjggPSBfcE0xMjhpKGIpOworICAgIGFiID0gX21tX3VucGFja2xvX2VwaTMyIChhMTI4LCBiMTI4KTsgLy9hMCwgYjAsIGExLGIxCisgICAgYmEgPSBfbW1fdW5wYWNrbG9fZXBpMzIgKGIxMjgsIGExMjgpOyAvL2IwLCBhMCwgYjEsYTEKKyAgICByZXR1cm4gX21tX211bF9lcHUzMiAoYWIsIGJhKTsgLy91c2VzIDFyc3QgYW5kIDNyZCBkYXRhIGxhbmVzLCB0aGUgbXVsdGlwbGljYXRpb24gZ2l2ZXMgNjQgYml0IHJlc3VsdAorfQorCitwb2x5MTZ4OF90IHZtdWxsX3A4KHBvbHk4eDhfdCBhLCBwb2x5OHg4X3QgYik7IC8vIFZNVUxMLlA4IHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHBvbHkxNng4X3Qgdm11bGxfcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiKQoreworICAgIC8vbWF5IGJlIG9wdGltaXplZAorICAgIF9fbTEyOGkgYTEyOCxiMTI4LCBjMSwgYTEyOF8xNiwgYm1hc2tlZF8xNiwgcmVzLCB0bXAsIGJtYXNrZWQ7CisgICAgaW50IGk7CisgICAgYTEyOCA9IF9wTTEyOGkoYSk7CisgICAgYjEyOCA9IF9wTTEyOGkoYik7CisgICAgYzEgPSBfbW1fY21wZXFfZXBpOCAoYTEyOCxhMTI4KTsgLy9hbGwgb25lcyAweGZmLi4uLgorICAgIGMxID0gdnNocnFfbl91OChjMSw3KTsgLy8weDEKKyAgICBibWFza2VkID0gX21tX2FuZF9zaTEyOChiMTI4LCBjMSk7IC8vMHgxCisKKyAgICBhMTI4XzE2ID0gX01NX0NWVEVQVThfRVBJMTYgKGExMjgpOyAvLyBTU0UgNC4xCisgICAgYm1hc2tlZF8xNiA9IF9NTV9DVlRFUFU4X0VQSTE2IChibWFza2VkKTsgLy8gU1NFIDQuMQorICAgIHJlcyA9IF9tbV9tdWxsb19lcGkxNiAoYTEyOF8xNiwgYm1hc2tlZF8xNik7IC8vc2hvdWxkIGZpdCBpbnRvIDE2IGJpdAorICAgIGZvcihpID0gMTsgaTw4OyBpKyspIHsKKyAgICAgICAgYzEgPSBfbW1fc2xsaV9lcGkxNihjMSwxKTsgLy9zaGlmdCBtYXNrIGxlZnQgYnkgMSwgMTYgYml0IHNoaWZ0IGlzIE9LIGhlcmUKKyAgICAgICAgYm1hc2tlZCA9IF9tbV9hbmRfc2kxMjgoYjEyOCwgYzEpOyAvLzB4MQorICAgICAgICBibWFza2VkXzE2ID0gX01NX0NWVEVQVThfRVBJMTYgKGJtYXNrZWQpOyAvLyBTU0UgNC4xCisgICAgICAgIHRtcCA9IF9tbV9tdWxsb19lcGkxNiAoYTEyOF8xNiwgYm1hc2tlZF8xNik7IC8vc2hvdWxkIGZpdCBpbnRvIDE2IGJpdCwgdm11bGxfdTgoYSwgYm1hc2tlZCk7CisgICAgICAgIHJlcyA9IF9tbV94b3Jfc2kxMjgocmVzLCB0bXApOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvLyoqKioqKioqKioqKioqKipWZWN0b3Igc2F0dXJhdGluZyBkb3VibGluZyBsb25nIG11bHRpcGx5ICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQzMng0X3QgdnFkbXVsbF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlFETVVMTC5TMTYgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZxZG11bGxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikKK3sKKyAgICAvL3RoZSBzZXJpYWwgc291bHV0aW9uIG1heSBiZSBmYXN0ZXIgZHVlIHRvIHNhdHVyYXRpb24KKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSB2bXVsbF9zMTYoYSwgYik7CisgICAgcmV0dXJuIHZxZF9zMzIocmVzKTsKK30KKworaW50NjR4Ml90IHZxZG11bGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZRRE1VTEwuUzMyIHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDJfdCB2cWRtdWxsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpLF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgLy90aGUgc2VyaWFsIHNvdWx1dGlvbiBtYXkgYmUgZmFzdGVyIGR1ZSB0byBzYXR1cmF0aW9uCisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdm11bGxfczMyKGEsYik7CisgICAgcmV0dXJuIHZxYWRkcV9zNjQocmVzLHJlcyk7IC8vc2xvdyBzZXJpYWwgZnVuY3Rpb24hISEhCit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqIFZlY3RvciBtdWx0aXBseSBhY2N1bXVsYXRlOiB2bWxhIC0+IFZyW2ldIDo9IFZhW2ldICsgVmJbaV0gKiBWY1tpXSAgKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3Qgdm1sYV9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiLCBpbnQ4eDhfdCBjKTsgLy8gVk1MQS5JOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2bWxhX3M4KGludDh4OF90IGEsIGludDh4OF90IGIsIGludDh4OF90IGMpIC8vIFZNTEEuSTggZDAsZDAsZDAKK3sKKyAgICAvLyBubyA4IGJpdCB4ODYgc2ltZCBtdWx0aXBseSwgbmVlZCB0byBnbyB0byAxNiBiaXRzLCAgYW5kIHVzZSB0aGUgbG93IDY0IGJpdHMKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIGIxMjgsIGMxMjgsIHJlczsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s4XzE2X2V2ZW5fb2RkWzE2XSA9IHsgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMSwgMywgNSwgNywgOSwgMTEsIDEzLCAxNSB9OworICAgIGIxMjggPSBfTU1fQ1ZURVBJOF9FUEkxNiAoX3BNMTI4aShiKSk7IC8vIFNTRSA0LjEgdXNlIGxvdyA2NCBiaXRzCisgICAgYzEyOCA9IF9NTV9DVlRFUEk4X0VQSTE2IChfcE0xMjhpKGMpKTsgLy8gU1NFIDQuMSB1c2UgbG93IDY0IGJpdHMKKyAgICByZXMgPSBfbW1fbXVsbG9fZXBpMTYgKGMxMjgsIGIxMjgpOworICAgIHJlcyAgPSAgX21tX3NodWZmbGVfZXBpOCAocmVzLCAqKF9fbTEyOGkqKSBtYXNrOF8xNl9ldmVuX29kZCk7CisgICAgcmVzICA9IF9tbV9hZGRfZXBpOCAocmVzLCBfcE0xMjhpKGEpKTsgLy91c2UgdGhlIGxvdyA2NCBiaXRzCisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50MTZ4NF90IHZtbGFfczE2KGludDE2eDRfdCBhLCAgaW50MTZ4NF90IGIsIGludDE2eDRfdCBjKTsgLy8gVk1MQS5JMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZtbGFfczE2KGludDE2eDRfdCBhLCAgaW50MTZ4NF90IGIsIGludDE2eDRfdCBjKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NCh2bWxhcV9zMTYoX3BNMTI4aShhKSxfcE0xMjhpKGIpLCBfcE0xMjhpKGMpKSk7Cit9CisKKworaW50MzJ4Ml90IHZtbGFfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IGMpOyAvLyBWTUxBLkkzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3Qgdm1sYV9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgYykgLy8gVk1MQS5JMzIgZDAsZDAsZDAKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gX01NX01VTExPX0VQSTMyIChfcE0xMjhpKGIpLCBfcE0xMjhpKGMpKTsgLy9TU0U0LjEKKyAgICByZXMgPSBfbW1fYWRkX2VwaTMyIChyZXMsIF9wTTEyOGkoYSkpOyAvL3VzZSB0aGUgbG93IDY0IGJpdHMKKyAgICByZXR1cm42NChyZXMpOworfQorCitmbG9hdDMyeDJfdCB2bWxhX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyeDJfdCBjKTsgLy8gVk1MQS5GMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3Qgdm1sYV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgZmxvYXQzMngyX3QgYykKK3sKKyAgICAvL2ZtYSBpcyBjb21pbmcgc29vbiwgYnV0IHJpZ2h0IG5vdzoKKyAgICBfX20xMjggcmVzOworICAgIF9fbTY0XzEyOCByZXM2NDsKKyAgICByZXMgPSBfbW1fbXVsX3BzIChfcE0xMjgoYyksIF9wTTEyOChiKSk7CisgICAgcmVzID0gX21tX2FkZF9wcyAoX3BNMTI4KGEpLCByZXMpOworICAgIF9NNjRmKHJlczY0LCByZXMpOworICAgIHJldHVybiByZXM2NDsKK30KKwordWludDh4OF90IHZtbGFfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiLCB1aW50OHg4X3QgYyk7IC8vIFZNTEEuSTggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZtbGFfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiLCB1aW50OHg4X3QgYykgLy8gVk1MQS5JOCBkMCxkMCxkMAoreworICAgIC8vIG5vIDggYml0IHg4NiBzaW1kIG11bHRpcGx5LCBuZWVkIHRvIGdvIHRvIDE2IGJpdHMsICBhbmQgdXNlIHRoZSBsb3cgNjQgYml0cworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIG1hc2ssIGIxMjgsIGMxMjgsIHJlczsKKyAgICBtYXNrID0gX21tX3NldDFfZXBpMTYoMHhmZik7CisgICAgYjEyOCA9IF9NTV9DVlRFUFU4X0VQSTE2IChfcE0xMjhpKGIpKTsgLy8gU1NFIDQuMSB1c2UgbG93IDY0IGJpdHMKKyAgICBjMTI4ID0gX01NX0NWVEVQVThfRVBJMTYgKF9wTTEyOGkoYykpOyAvLyBTU0UgNC4xIHVzZSBsb3cgNjQgYml0cworICAgIHJlcyA9IF9tbV9tdWxsb19lcGkxNiAoYzEyOCwgYjEyOCk7CisgICAgcmVzID0gX21tX2FuZF9zaTEyOChyZXMsIG1hc2spOyAvL3RvIGF2b2lkIHNhdHVyYXRpb24KKyAgICByZXMgPSBfbW1fcGFja3VzX2VwaTE2IChyZXMsIHJlcyk7CisgICAgcmVzID0gIF9tbV9hZGRfZXBpOCAocmVzLCBfcE0xMjhpKGEpKTsgLy91c2UgdGhlIGxvdyA2NCBiaXRzCisgICAgcmV0dXJuNjQocmVzKTsKK30KKwordWludDE2eDRfdCB2bWxhX3UxNih1aW50MTZ4NF90IGEsICB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgYyk7IC8vIFZNTEEuSTE2IGQwLGQwLGQwCisjZGVmaW5lIHZtbGFfdTE2IHZtbGFfczE2CisKK3VpbnQzMngyX3Qgdm1sYV91MzIodWludDMyeDJfdCBhLCAgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IGMpOyAvLyBWTUxBLkkzMiBkMCxkMCxkMAorI2RlZmluZSB2bWxhX3UzMiB2bWxhX3MzMgorCitpbnQ4eDE2X3Qgdm1sYXFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiLCBpbnQ4eDE2X3QgYyk7IC8vIFZNTEEuSTggcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90IHZtbGFxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYiwgaW50OHgxNl90IGMpIC8vIFZNTEEuSTggcTAscTAscTAKK3sKKyAgICAvL3NvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbAorICAgIC8vIG5vIDggYml0IHNpbWQgbXVsdGlwbHksIG5lZWQgdG8gZ28gdG8gMTYgYml0cworICAgIF9fbTEyOGkgYjE2LCBjMTYsIHIxNl8xLCBhXzIscjE2XzI7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrOF8xNl9ldmVuX29kZFsxNl0gPSB7IDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDEsIDMsIDUsIDcsIDksIDExLCAxMywgMTUgfTsKKyAgICBiMTYgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoYik7IC8vIFNTRSA0LjEKKyAgICBjMTYgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoYyk7IC8vIFNTRSA0LjEKKyAgICByMTZfMSA9IF9tbV9tdWxsb19lcGkxNiAoYjE2LCBjMTYpOworICAgIHIxNl8xID0gX21tX3NodWZmbGVfZXBpOCAocjE2XzEsICooX19tMTI4aSopIG1hc2s4XzE2X2V2ZW5fb2RkKTsgLy9yZXR1cm4gdG8gOCBiaXRzCisgICAgcjE2XzEgPSBfbW1fYWRkX2VwaTggKHIxNl8xLCBhKTsKKyAgICAvL3N3YXAgaGkgYW5kIGxvdyBwYXJ0IG9mIGEsIGIgYW5kIGMgdG8gcHJvY2VzcyB0aGUgcmVtYWluaW5nIGRhdGEKKyAgICBhXzIgPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYSwgX1NXQVBfSElfTE9XMzIpOworICAgIGIxNiA9IF9tbV9zaHVmZmxlX2VwaTMyIChiLCBfU1dBUF9ISV9MT1czMik7CisgICAgYzE2ID0gX21tX3NodWZmbGVfZXBpMzIgKGMsIF9TV0FQX0hJX0xPVzMyKTsKKyAgICBiMTYgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoYjE2KTsgLy8gU1NFIDQuMQorICAgIGMxNiA9IF9NTV9DVlRFUEk4X0VQSTE2IChjMTYpOyAvLyBTU0UgNC4xCisKKyAgICByMTZfMiA9IF9tbV9tdWxsb19lcGkxNiAoYjE2LCBjMTYpOworICAgIHIxNl8yID0gX21tX3NodWZmbGVfZXBpOCAocjE2XzIsICooX19tMTI4aSopIG1hc2s4XzE2X2V2ZW5fb2RkKTsKKyAgICByMTZfMiA9IF9tbV9hZGRfZXBpOChyMTZfMiwgYV8yKTsKKyAgICByZXR1cm4gX21tX3VucGFja2xvX2VwaTY0KHIxNl8xLHIxNl8yKTsKK30KKworaW50MTZ4OF90IHZtbGFxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDhfdCBjKTsgLy8gVk1MQS5JMTYgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZtbGFxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDhfdCBjKSAvLyBWTUxBLkkxNiBxMCxxMCxxMAoreworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IF9tbV9tdWxsb19lcGkxNiAoYywgYik7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMTYgKHJlcywgYSk7Cit9CisKK2ludDMyeDRfdCB2bWxhcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBpbnQzMng0X3QgYyk7IC8vIFZNTEEuSTMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2bWxhcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBpbnQzMng0X3QgYykgLy8gVk1MQS5JMzIgcTAscTAscTAKK3sKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSBfTU1fTVVMTE9fRVBJMzIgKGMsICBiKTsgLy9TU0U0LjEKKyAgICByZXR1cm4gX21tX2FkZF9lcGkzMiAocmVzLCBhKTsKK30KKworZmxvYXQzMng0X3Qgdm1sYXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJ4NF90IGMpOyAvLyBWTUxBLkYzMiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDRfdCB2bWxhcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMng0X3QgYykgLy8gVk1MQS5GMzIgcTAscTAscTAKK3sKKyAgICAvL2ZtYSBpcyBjb21pbmcgc29vbiwgYnV0IHJpZ2h0IG5vdzoKKyAgICBfX20xMjggcmVzOworICAgIHJlcyA9IF9tbV9tdWxfcHMgKGMsIGIpOworICAgIHJldHVybiBfbW1fYWRkX3BzIChhLCByZXMpOworfQorCit1aW50OHgxNl90IHZtbGFxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiLCB1aW50OHgxNl90IGMpOyAvLyBWTUxBLkk4IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDE2X3Qgdm1sYXFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIsIHVpbnQ4eDE2X3QgYykgLy8gVk1MQS5JOCBxMCxxMCxxMAoreworICAgIC8vc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsCisgICAgLy8gbm8gOCBiaXQgc2ltZCBtdWx0aXBseSwgbmVlZCB0byBnbyB0byAxNiBiaXRzCisgICAgX19tMTI4aSBiMTYsIGMxNiwgcjE2XzEsIGFfMiwgcjE2XzI7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrOF8xNl9ldmVuX29kZFsxNl0gPSB7IDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDEsIDMsIDUsIDcsIDksIDExLCAxMywgMTUgfTsKKyAgICBiMTYgPSBfTU1fQ1ZURVBVOF9FUEkxNiAoYik7IC8vIFNTRSA0LjEKKyAgICBjMTYgPSBfTU1fQ1ZURVBVOF9FUEkxNiAoYyk7IC8vIFNTRSA0LjEKKyAgICByMTZfMSA9IF9tbV9tdWxsb19lcGkxNiAoYjE2LCBjMTYpOworICAgIHIxNl8xID0gX21tX3NodWZmbGVfZXBpOCAocjE2XzEsICooX19tMTI4aSopIG1hc2s4XzE2X2V2ZW5fb2RkKTsgLy9yZXR1cm4gdG8gOCBiaXRzCisgICAgcjE2XzEgPSBfbW1fYWRkX2VwaTggKHIxNl8xLCBhKTsKKyAgICAvL3N3YXAgaGkgYW5kIGxvdyBwYXJ0IG9mIGEsIGIgYW5kIGMgdG8gcHJvY2VzcyB0aGUgcmVtYWluaW5nIGRhdGEKKyAgICBhXzIgPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYSwgX1NXQVBfSElfTE9XMzIpOworICAgIGIxNiA9IF9tbV9zaHVmZmxlX2VwaTMyIChiLCBfU1dBUF9ISV9MT1czMik7CisgICAgYzE2ID0gX21tX3NodWZmbGVfZXBpMzIgKGMsIF9TV0FQX0hJX0xPVzMyKTsKKyAgICBiMTYgPSBfTU1fQ1ZURVBVOF9FUEkxNiAoYjE2KTsgLy8gU1NFIDQuMQorICAgIGMxNiA9IF9NTV9DVlRFUFU4X0VQSTE2IChjMTYpOyAvLyBTU0UgNC4xCisKKyAgICByMTZfMiA9IF9tbV9tdWxsb19lcGkxNiAoYjE2LCBjMTYpOworICAgIHIxNl8yID0gX21tX3NodWZmbGVfZXBpOCAocjE2XzIsICooX19tMTI4aSopIG1hc2s4XzE2X2V2ZW5fb2RkKTsKKyAgICByMTZfMiA9IF9tbV9hZGRfZXBpOChyMTZfMiwgYV8yKTsKKyAgICByZXR1cm4gX21tX3VucGFja2xvX2VwaTY0KHIxNl8xLHIxNl8yKTsKK30KKwordWludDE2eDhfdCB2bWxhcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIHVpbnQxNng4X3QgYyk7IC8vIFZNTEEuSTE2IHEwLHEwLHEwCisjZGVmaW5lIHZtbGFxX3UxNiB2bWxhcV9zMTYKKwordWludDMyeDRfdCB2bWxhcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMng0X3QgYyk7IC8vIFZNTEEuSTMyIHEwLHEwLHEwCisjZGVmaW5lIHZtbGFxX3UzMiB2bWxhcV9zMzIKKworLy8qKioqKioqKioqKioqKioqKioqKioqICBWZWN0b3Igd2lkZW5pbmcgbXVsdGlwbHkgYWNjdW11bGF0ZSAobG9uZyBtdWx0aXBseSBhY2N1bXVsYXRlKToKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICB2bWxhIC0+IFZyW2ldIDo9IFZhW2ldICsgVmJbaV0gKiBWY1tpXSAgKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDE2eDhfdCB2bWxhbF9zOChpbnQxNng4X3QgYSwgaW50OHg4X3QgYiwgaW50OHg4X3QgYyk7IC8vIFZNTEFMLlM4IHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2bWxhbF9zOChpbnQxNng4X3QgYSwgaW50OHg4X3QgYiwgaW50OHg4X3QgYykgLy8gVk1MQUwuUzggcTAsZDAsZDAKK3sKKyAgICBpbnQxNng4X3QgcmVzOworICAgIHJlcyA9IHZtdWxsX3M4KGIsIGMpOworICAgIHJldHVybiBfbW1fYWRkX2VwaTE2IChyZXMsIGEpOworfQorCitpbnQzMng0X3Qgdm1sYWxfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpOyAvLyBWTUxBTC5TMTYgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZtbGFsX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCBjKSAvLyBWTUxBTC5TMTYgcTAsZDAsZDAKK3sKKyAgICAvL21heSBiZSBub3Qgb3B0aW1hbCBjb21wYXJlZCB3aXRoIHNlcmlhbCBpbXBsZW1lbnRhdGlvbgorICAgIGludDMyeDRfdCByZXM7CisgICAgcmVzID0gdm11bGxfczE2KGIsICBjKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGkzMiAocmVzLCBhKTsKK30KKworaW50NjR4Ml90IHZtbGFsX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKTsgLy8gVk1MQUwuUzMyIHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDJfdCB2bWxhbF9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgYykgLy8gVk1MQUwuUzMyIHEwLGQwLGQwCit7CisgICAgLy9tYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCBzZXJpYWwgaW1wbGVtZW50YXRpb24KKyAgICBpbnQ2NHgyX3QgcmVzOworICAgIHJlcyA9IHZtdWxsX3MzMiggYiwgYyk7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpNjQgKHJlcywgYSk7Cit9CisKK3VpbnQxNng4X3Qgdm1sYWxfdTgodWludDE2eDhfdCBhLCB1aW50OHg4X3QgYiwgdWludDh4OF90IGMpOyAvLyBWTUxBTC5VOCBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZtbGFsX3U4KHVpbnQxNng4X3QgYSwgdWludDh4OF90IGIsIHVpbnQ4eDhfdCBjKSAvLyBWTUxBTC5VOCBxMCxkMCxkMAoreworICAgIHVpbnQxNng4X3QgcmVzOworICAgIHJlcyA9IHZtdWxsX3U4KGIsIGMpOworICAgIHJldHVybiBfbW1fYWRkX2VwaTE2IChyZXMsIGEpOworfQorCit1aW50MzJ4NF90IHZtbGFsX3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2eDRfdCBjKTsgLy8gVk1MQUwuczE2IHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3Qgdm1sYWxfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IGMpIC8vIFZNTEFMLnMxNiBxMCxkMCxkMAoreworICAgIC8vbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggc2VyaWFsIGltcGxlbWVudGF0aW9uCisgICAgdWludDMyeDRfdCByZXM7CisgICAgcmVzID0gdm11bGxfdTE2KGIsIGMpOworICAgIHJldHVybiBfbW1fYWRkX2VwaTMyIChyZXMsIGEpOworfQorCit1aW50NjR4Ml90IHZtbGFsX3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCBjKTsgLy8gVk1MQUwuVTMyIHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgyX3Qgdm1sYWxfdTMyKHVpbnQ2NHgyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IGMpIC8vIFZNTEFMLlUzMiBxMCxkMCxkMAoreworICAgIC8vbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggc2VyaWFsIGltcGxlbWVudGF0aW9uCisgICAgaW50NjR4Ml90IHJlczsKKyAgICByZXMgPSB2bXVsbF91MzIoIGIsYyk7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpNjQgKHJlcywgYSk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKiogVmVjdG9yIG11bHRpcGx5IHN1YnRyYWN0OiB2bWxzIC0+IFZyW2ldIDo9IFZhW2ldIC0gVmJbaV0gKiBWY1tpXSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZtbHNfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYiwgaW50OHg4X3QgYyk7IC8vIFZNTFMuSTggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3Qgdm1sc19zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiLCBpbnQ4eDhfdCBjKSAvLyBWTUxTLkk4IGQwLGQwLGQwCit7CisgICAgLy8gbm8gOCBiaXQgc2ltZCBtdWx0aXBseSwgbmVlZCB0byBnbyB0byAxNiBiaXRzIC0gIGFuZCB1c2UgdGhlIGxvdyA2NCBiaXRzCisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzNjQgPSB2bXVsX3M4KGIsYyk7CisgICAgcmVzID0gX21tX3N1Yl9lcGk4IChfcE0xMjhpKGEpLCBfcE0xMjhpKHJlczY0KSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50MTZ4NF90IHZtbHNfczE2KGludDE2eDRfdCBhLCAgaW50MTZ4NF90IGIsIGludDE2eDRfdCBjKTsgLy8gVk1MUy5JMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZtbHNfczE2KGludDE2eDRfdCBhLCAgaW50MTZ4NF90IGIsIGludDE2eDRfdCBjKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NCh2bWxzcV9zMTYoX3BNMTI4aShhKSxfcE0xMjhpKGIpLCBfcE0xMjhpKGMpKSk7Cit9CisKKworaW50MzJ4Ml90IHZtbHNfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IGMpOyAvLyBWTUxTLkkzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3Qgdm1sc19zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgYykgLy8gVk1MUy5JMzIgZDAsZDAsZDAKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gX01NX01VTExPX0VQSTMyIChfcE0xMjhpKGMpLF9wTTEyOGkoIGIpKTsgLy9TU0U0LjEKKyAgICByZXMgPSAgX21tX3N1Yl9lcGkzMiAoX3BNMTI4aShhKSxyZXMpOyAvL3VzZSBsb3cgNjQgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworZmxvYXQzMngyX3Qgdm1sc19mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgZmxvYXQzMngyX3QgYyk7IC8vIFZNTFMuRjMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZtbHNfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJ4Ml90IGMpCit7CisgICAgX19tMTI4IHJlczsKKyAgICBfX202NF8xMjggcmVzNjQ7CisgICAgcmVzID0gX21tX211bF9wcyAoX3BNMTI4KGMpLCBfcE0xMjgoYikpOworICAgIHJlcyA9IF9tbV9zdWJfcHMgKF9wTTEyOChhKSwgcmVzKTsKKyAgICBfTTY0ZihyZXM2NCwgcmVzKTsKKyAgICByZXR1cm4gcmVzNjQ7Cit9CisKK3VpbnQ4eDhfdCB2bWxzX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYiwgdWludDh4OF90IGMpOyAvLyBWTUxTLkk4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2bWxzX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYiwgdWludDh4OF90IGMpCit7CisgICAgLy8gbm8gOCBiaXQgc2ltZCBtdWx0aXBseSwgbmVlZCB0byBnbyB0byAxNiBiaXRzIC0gIGFuZCB1c2UgdGhlIGxvdyA2NCBiaXRzCisgICAgdWludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlczY0ID0gdm11bF91OChiLGMpOworICAgIHJlcyA9IF9tbV9zdWJfZXBpOCAoX3BNMTI4aShhKSwgX3BNMTI4aShyZXM2NCkpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK3VpbnQxNng0X3Qgdm1sc191MTYodWludDE2eDRfdCBhLCAgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IGMpOyAvLyBWTUxTLkkxNiBkMCxkMCxkMAorI2RlZmluZSB2bWxzX3UxNiB2bWxzX3MxNgorCit1aW50MzJ4Ml90IHZtbHNfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCBjKTsgLy8gVk1MUy5JMzIgZDAsZDAsZDAKKyNkZWZpbmUgdm1sc191MzIgdm1sc19zMzIKKworCitpbnQ4eDE2X3Qgdm1sc3FfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiLCBpbnQ4eDE2X3QgYyk7IC8vIFZNTFMuSTggcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90IHZtbHNxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYiwgaW50OHgxNl90IGMpIC8vIFZNTFMuSTggcTAscTAscTAKK3sKKyAgICAvL3NvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbAorICAgIC8vIG5vIDggYml0IHNpbWQgbXVsdGlwbHksIG5lZWQgdG8gZ28gdG8gMTYgYml0cworICAgIF9fbTEyOGkgYjE2LCBjMTYsIHIxNl8xLCBhXzIsIHIxNl8yOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazhfMTZfZXZlbl9vZGRbMTZdID0geyAwLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxLCAzLCA1LCA3LCA5LCAxMSwgMTMsIDE1IH07CisgICAgYjE2ID0gX01NX0NWVEVQSThfRVBJMTYgKGIpOyAvLyBTU0UgNC4xCisgICAgYzE2ID0gX01NX0NWVEVQSThfRVBJMTYgKGMpOyAvLyBTU0UgNC4xCisgICAgcjE2XzEgPSBfbW1fbXVsbG9fZXBpMTYgKGIxNiwgYzE2KTsKKyAgICByMTZfMSA9IF9tbV9zaHVmZmxlX2VwaTggKHIxNl8xLCAqKF9fbTEyOGkqKSBtYXNrOF8xNl9ldmVuX29kZCk7CisgICAgcjE2XzEgPSBfbW1fc3ViX2VwaTggKGEsIHIxNl8xKTsKKyAgICAvL3N3YXAgaGkgYW5kIGxvdyBwYXJ0IG9mIGEsIGIsIGMgdG8gcHJvY2VzcyB0aGUgcmVtYWluaW5nIGRhdGEKKyAgICBhXzIgPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYSwgX1NXQVBfSElfTE9XMzIpOworICAgIGIxNiA9IF9tbV9zaHVmZmxlX2VwaTMyIChiLCBfU1dBUF9ISV9MT1czMik7CisgICAgYzE2ID0gX21tX3NodWZmbGVfZXBpMzIgKGMsIF9TV0FQX0hJX0xPVzMyKTsKKyAgICBiMTYgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoYjE2KTsgLy8gU1NFIDQuMQorICAgIGMxNiA9IF9NTV9DVlRFUEk4X0VQSTE2IChjMTYpOyAvLyBTU0UgNC4xCisKKyAgICByMTZfMiA9IF9tbV9tdWxsb19lcGkxNiAoYjE2LCBjMTYpOworICAgIHIxNl8yID0gX21tX3NodWZmbGVfZXBpOCAocjE2XzIsICooX19tMTI4aSopIG1hc2s4XzE2X2V2ZW5fb2RkKTsKKyAgICByMTZfMiA9IF9tbV9zdWJfZXBpOCAoYV8yLCByMTZfMik7CisgICAgcmV0dXJuIF9tbV91bnBhY2tsb19lcGk2NChyMTZfMSxyMTZfMik7Cit9CisKK2ludDE2eDhfdCB2bWxzcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng4X3QgYyk7IC8vIFZNTFMuSTE2IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2bWxzcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng4X3QgYykgLy8gVk1MUy5JMTYgcTAscTAscTAKK3sKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSBfbW1fbXVsbG9fZXBpMTYgKGMsIGIpOworICAgIHJldHVybiBfbW1fc3ViX2VwaTE2IChhLCByZXMpOworfQorCitpbnQzMng0X3Qgdm1sc3FfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4NF90IGMpOyAvLyBWTUxTLkkzMiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3Qgdm1sc3FfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4NF90IGMpIC8vIFZNTFMuSTMyIHEwLHEwLHEwCit7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gX01NX01VTExPX0VQSTMyIChjLCBiKTsgLy9TU0U0LjEKKyAgICByZXR1cm4gX21tX3N1Yl9lcGkzMiAoYSwgcmVzKTsKK30KKworZmxvYXQzMng0X3Qgdm1sc3FfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJ4NF90IGMpOyAvLyBWTUxTLkYzMiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDRfdCB2bWxzcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMng0X3QgYykgLy8gVk1MUy5GMzIgcTAscTAscTAKK3sKKyAgICBfX20xMjggcmVzOworICAgIHJlcyA9IF9tbV9tdWxfcHMgKGMsIGIpOworICAgIHJldHVybiBfbW1fc3ViX3BzIChhLCByZXMpOworfQorCit1aW50OHgxNl90IHZtbHNxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiLCB1aW50OHgxNl90IGMpOyAvLyBWTUxTLkk4IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDE2X3Qgdm1sc3FfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIsIHVpbnQ4eDE2X3QgYykgLy8gVk1MUy5JOCBxMCxxMCxxMAoreworICAgIC8vc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsCisgICAgLy8gbm8gOCBiaXQgc2ltZCBtdWx0aXBseSwgbmVlZCB0byBnbyB0byAxNiBiaXRzCisgICAgX19tMTI4aSBiMTYsIGMxNiwgcjE2XzEsIGFfMiwgcjE2XzI7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrOF8xNl9ldmVuX29kZFsxNl0gPSB7IDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDEsIDMsIDUsIDcsIDksIDExLCAxMywgMTUgfTsKKyAgICBiMTYgPSBfTU1fQ1ZURVBVOF9FUEkxNiAoYik7IC8vIFNTRSA0LjEKKyAgICBjMTYgPSBfTU1fQ1ZURVBVOF9FUEkxNiAoYyk7IC8vIFNTRSA0LjEKKyAgICByMTZfMSA9IF9tbV9tdWxsb19lcGkxNiAoYjE2LCBjMTYpOworICAgIHIxNl8xID0gX21tX3NodWZmbGVfZXBpOCAocjE2XzEsICooX19tMTI4aSopIG1hc2s4XzE2X2V2ZW5fb2RkKTsgLy9yZXR1cm4gdG8gOCBiaXRzCisgICAgcjE2XzEgPSBfbW1fc3ViX2VwaTggKGEsIHIxNl8xKTsKKyAgICAvL3N3YXAgaGkgYW5kIGxvdyBwYXJ0IG9mIGEsIGIgYW5kIGMgdG8gcHJvY2VzcyB0aGUgcmVtYWluaW5nIGRhdGEKKyAgICBhXzIgPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYSwgX1NXQVBfSElfTE9XMzIpOworICAgIGIxNiA9IF9tbV9zaHVmZmxlX2VwaTMyIChiLCBfU1dBUF9ISV9MT1czMik7CisgICAgYzE2ID0gX21tX3NodWZmbGVfZXBpMzIgKGMsIF9TV0FQX0hJX0xPVzMyKTsKKyAgICBiMTYgPSBfTU1fQ1ZURVBVOF9FUEkxNiAoYjE2KTsgLy8gU1NFIDQuMQorICAgIGMxNiA9IF9NTV9DVlRFUFU4X0VQSTE2IChjMTYpOyAvLyBTU0UgNC4xCisKKyAgICByMTZfMiA9IF9tbV9tdWxsb19lcGkxNiAoYjE2LCBjMTYpOworICAgIHIxNl8yID0gX21tX3NodWZmbGVfZXBpOCAocjE2XzIsICooX19tMTI4aSopIG1hc2s4XzE2X2V2ZW5fb2RkKTsKKyAgICByMTZfMiA9IF9tbV9zdWJfZXBpOChhXzIsIHIxNl8yKTsKKyAgICByZXR1cm4gX21tX3VucGFja2xvX2VwaTY0KHIxNl8xLHIxNl8yKTsKK30KKwordWludDE2eDhfdCB2bWxzcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIHVpbnQxNng4X3QgYyk7IC8vIFZNTFMuSTE2IHEwLHEwLHEwCisjZGVmaW5lIHZtbHNxX3UxNiB2bWxzcV9zMTYKKwordWludDMyeDRfdCB2bWxzcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMng0X3QgYyk7IC8vIFZNTFMuSTMyIHEwLHEwLHEwCisjZGVmaW5lIHZtbHNxX3UzMiB2bWxzcV9zMzIKKworLy8qKioqKioqKioqKioqKioqKioqKiBWZWN0b3IgbXVsdGlwbHkgc3VidHJhY3QgbG9uZyAod2lkZW5pbmcgbXVsdGlwbHkgc3VidHJhY3QpICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQxNng4X3Qgdm1sc2xfczgoaW50MTZ4OF90IGEsIGludDh4OF90IGIsIGludDh4OF90IGMpOyAvLyBWTUxTTC5TOCBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3Qgdm1sc2xfczgoaW50MTZ4OF90IGEsIGludDh4OF90IGIsIGludDh4OF90IGMpIC8vIFZNTFNMLlM4IHEwLGQwLGQwCit7CisgICAgaW50MTZ4OF90IHJlczsKKyAgICByZXMgPSB2bXVsbF9zOChiLCBjKTsKKyAgICByZXR1cm4gX21tX3N1Yl9lcGkxNiAoYSwgcmVzKTsKK30KKworaW50MzJ4NF90IHZtbHNsX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCBjKTsgLy8gVk1MU0wuUzE2IHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2bWxzbF9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgYykgLy8gVk1MU0wuUzE2IHEwLGQwLGQwCit7CisgICAgLy9tYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCBzZXJpYWwgaW1wbGVtZW50YXRpb24KKyAgICBpbnQzMng0X3QgcmVzOworICAgIHJlcyA9IHZtdWxsX3MxNihiLCAgYyk7CisgICAgcmV0dXJuIF9tbV9zdWJfZXBpMzIgKGEsIHJlcyk7Cit9CisKK2ludDY0eDJfdCB2bWxzbF9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgYyk7IC8vIFZNTFNMLlMzMiBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgyX3Qgdm1sc2xfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IGMpIC8vIFZNTFNMLlMzMiBxMCxkMCxkMAoreworICAgIC8vbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggc2VyaWFsIGltcGxlbWVudGF0aW9uCisgICAgaW50NjR4Ml90IHJlczsKKyAgICByZXMgPSB2bXVsbF9zMzIoIGIsYyk7CisgICAgcmV0dXJuIF9tbV9zdWJfZXBpNjQgKGEsIHJlcyk7Cit9CisKK3VpbnQxNng4X3Qgdm1sc2xfdTgodWludDE2eDhfdCBhLCB1aW50OHg4X3QgYiwgdWludDh4OF90IGMpOyAvLyBWTUxTTC5VOCBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZtbHNsX3U4KHVpbnQxNng4X3QgYSwgdWludDh4OF90IGIsIHVpbnQ4eDhfdCBjKSAvLyBWTUxTTC5VOCBxMCxkMCxkMAoreworICAgIHVpbnQxNng4X3QgcmVzOworICAgIHJlcyA9IHZtdWxsX3U4KGIsIGMpOworICAgIHJldHVybiBfbW1fc3ViX2VwaTE2IChhLCByZXMpOworfQorCit1aW50MzJ4NF90IHZtbHNsX3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2eDRfdCBjKTsgLy8gVk1MU0wuczE2IHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3Qgdm1sc2xfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IGMpIC8vIFZNTFNMLnMxNiBxMCxkMCxkMAoreworICAgIC8vbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggc2VyaWFsIGltcGxlbWVudGF0aW9uCisgICAgdWludDMyeDRfdCByZXM7CisgICAgcmVzID0gdm11bGxfdTE2KGIsIGMpOworICAgIHJldHVybiBfbW1fc3ViX2VwaTMyIChhLCByZXMpOworfQorCit1aW50NjR4Ml90IHZtbHNsX3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCBjKTsgLy8gVk1MU0wuVTMyIHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgyX3Qgdm1sc2xfdTMyKHVpbnQ2NHgyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IGMpIC8vIFZNTFNMLlUzMiBxMCxkMCxkMAoreworICAgIC8vbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggc2VyaWFsIGltcGxlbWVudGF0aW9uCisgICAgaW50NjR4Ml90IHJlczsKKyAgICByZXMgPSB2bXVsbF91MzIoIGIsYyk7CisgICAgcmV0dXJuIF9tbV9zdWJfZXBpNjQgKGEsIHJlcyk7Cit9CisKKy8vKioqKioqICBWZWN0b3Igc2F0dXJhdGluZyBkb3VibGluZyBtdWx0aXBseSBoaWdoICoqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50MTZ4NF90IHZxZG11bGhfczE2KGludDE2eDRfdCBhLCAgaW50MTZ4NF90IGIpOyAvLyBWUURNVUxILlMxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQxNng0X3QgdnFkbXVsaF9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYiksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgaW50MTZ4NF90IHJlczsKKyAgICBpbnQzMl90IGEzMiwgYjMyLCBpOworICAgIGZvciAoaSA9IDA7IGk8NDsgaSsrKSB7CisgICAgICAgIGEzMiA9IChpbnQzMl90KSBhLm02NF9pMTZbaV07CisgICAgICAgIGIzMiA9IChpbnQzMl90KSBiLm02NF9pMTZbaV07CisgICAgICAgIGEzMiA9IChhMzIgKiBiMzIpID4+IDE1OworICAgICAgICByZXMubTY0X2kxNltpXSA9IChhMzIgPT0gMHg4MDAwKSA/IDB4N2ZmZiA6IChpbnQxNl90KSBhMzI7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK2ludDMyeDJfdCB2cWRtdWxoX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWUURNVUxILlMzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdnFkbXVsaF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSAvLyBubyBtdWx0aXBseSBoaWdoIDMyIGJpdCBTSU1EIGluIElBMzIsIHNvIG5lZWQgdG8gZG8gc29tZSB0cmlja3MsIHNlcmlhbCBzb2x1dGlvbiBtYXkgYmUgZmFzdGVyCit7CisgICAgLy9tYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCBhIHNlcmlhbCBzb2x1dGlvbgorICAgIGludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIG1hc2s7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQzMl90IGNtYXNrMzJbXSA9IHsweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwfTsKKyAgICBpbnQ2NHgyX3QgbXVsOworICAgIG11bCA9IHZtdWxsX3MzMihhLGIpOworICAgIG11bCA9IF9tbV9zbGxpX2VwaTY0KG11bCwxKTsgLy9kb3VibGUgdGhlIHJlc3VsdAorICAgIC8vYXQgdGhpcyBwb2ludCBzdGFydCB0cmVhdGluZyAyIDY0LWJpdCBudW1iZXJzIGFzIDQgMzItYml0CisgICAgbXVsID0gX21tX3NodWZmbGVfZXBpMzIgKG11bCwgMSB8ICgzIDw8IDIpIHwgKDAgPDwgNCkgfCAoMiA8PCA2KSk7IC8vc2h1ZmZsZSB0aGUgZGF0YSB0byBnZXQgMiAzMi1iaXRzCisgICAgbWFzayA9IF9tbV9jbXBlcV9lcGkzMiAobXVsLCAqKF9fbTEyOGkqKWNtYXNrMzIpOworICAgIG11bCA9IF9tbV94b3Jfc2kxMjggKG11bCwgIG1hc2spOyAvL3JlcyBzYXR1cmF0ZWQgZm9yIDB4ODAwMDAwMDAKKyAgICByZXR1cm42NChtdWwpOworfQorCitpbnQxNng4X3QgdnFkbXVsaHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZRRE1VTEguUzE2IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2cWRtdWxocV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSAvLyBWUURNVUxILlMxNiBxMCxxMCxxMAoreworICAgIF9fbTEyOGkgcmVzLCByZXNfbG8sIG1hc2s7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQxNl90IGNtYXNrW10gPSB7MHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDB9OworICAgIHJlcyA9IF9tbV9tdWxoaV9lcGkxNiAoYSwgYik7CisgICAgcmVzID0gX21tX3NsbGlfZXBpMTYgKHJlcywgMSk7IC8vZG91YmxlIHRoZSByZXN1bHQsIGRvbid0IGNhcmUgYWJvdXQgc2F0dXJhdGlvbgorICAgIHJlc19sbyA9IF9tbV9tdWxsb19lcGkxNiAoYSwgYik7CisgICAgcmVzX2xvID0gX21tX3NybGlfZXBpMTYocmVzX2xvLDE1KTsgLy90YWtlIHRoZSBoaWdoZXN0IGJpdAorICAgIHJlcyA9IF9tbV9hZGRfZXBpMTYocmVzLCByZXNfbG8pOyAvL2NvbWJpbmUgcmVzdWx0cworICAgIG1hc2sgPSBfbW1fY21wZXFfZXBpMTYgKHJlcywgKihfX20xMjhpKiljbWFzayk7CisgICAgcmV0dXJuIF9tbV94b3Jfc2kxMjggKHJlcywgIG1hc2spOyAvL3JlcyBzYXR1cmF0ZWQgZm9yIDB4ODAwMAorfQorCitpbnQzMng0X3QgdnFkbXVsaHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZRRE1VTEguUzMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDMyeDRfdCB2cWRtdWxocV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1VORUZGRUNUSVZFKQoreworICAgIC8vIG5vIG11bHRpcGx5IGhpZ2ggMzIgYml0IFNJTUQgaW4gSUEzMiwgbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggYSBzZXJpYWwgc29sdXRpb24gZm9yIHRoZSBTU1NFMyB0YXJnZXQKKyAgICBfX20xMjhpIGFiLCBiYSwgbWFzaywgbXVsLCBtdWwxOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50MzJfdCBjbWFzazMyW10gPSB7MHg4MDAwMDAwMCwgMHg4MDAwMDAwMCwgMHg4MDAwMDAwMCwgMHg4MDAwMDAwMH07CisgICAgYWIgPSBfbW1fdW5wYWNrbG9fZXBpMzIgKGEsIGIpOyAvL2EwLCBiMCwgYTEsYjEKKyAgICBiYSA9IF9tbV91bnBhY2tsb19lcGkzMiAoYiwgYSk7IC8vYjAsIGEwLCBiMSxhMQorICAgIG11bCA9IF9NTV9NVUxfRVBJMzIoYWIsIGJhKTsgLy91c2VzIDFyc3QgYW5kIDNyZCBkYXRhIGxhbmVzLCB0aGUgbXVsdGlwbGljYXRpb24gZ2l2ZXMgNjQgYml0IHJlc3VsdAorICAgIG11bCA9IF9tbV9zbGxpX2VwaTY0KG11bCwxKTsgLy9kb3VibGUgdGhlIHJlc3VsdAorICAgIGFiID0gX21tX3VucGFja2hpX2VwaTMyIChhLCBiKTsgLy9hMiwgYjIsIGEzLGIzCisgICAgYmEgPSBfbW1fdW5wYWNraGlfZXBpMzIgKGIsIGEpOyAvL2IyLCBhMiwgYjMsYTMKKyAgICBtdWwxID0gX01NX01VTF9FUEkzMihhYiwgYmEpOyAvL3VzZXMgMXJzdCBhbmQgM3JkIGRhdGEgbGFuZXMsIHRoZSBtdWx0aXBsaWNhdGlvbiBnaXZlcyA2NCBiaXQgcmVzdWx0CisgICAgbXVsMSA9IF9tbV9zbGxpX2VwaTY0KG11bDEsMSk7IC8vZG91YmxlIHRoZSByZXN1bHQKKyAgICBtdWwgPSBfbW1fc2h1ZmZsZV9lcGkzMiAobXVsLCAxIHwgKDMgPDwgMikgfCAoMCA8PCA0KSB8ICgyIDw8IDYpKTsgLy9zaHVmZmxlIHRoZSBkYXRhIHRvIGdldCAyIDMyLWJpdHMKKyAgICBtdWwxID0gX21tX3NodWZmbGVfZXBpMzIgKG11bDEsIDEgfCAoMyA8PCAyKSB8ICgwIDw8IDQpIHwgKDIgPDwgNikpOyAvL3NodWZmbGUgdGhlIGRhdGEgdG8gZ2V0IDIgMzItYml0cworICAgIG11bCA9IF9tbV91bnBhY2tsb19lcGk2NChtdWwsIG11bDEpOworICAgIG1hc2sgPSBfbW1fY21wZXFfZXBpMzIgKG11bCwgKihfX20xMjhpKiljbWFzazMyKTsKKyAgICByZXR1cm4gX21tX3hvcl9zaTEyOCAobXVsLCAgbWFzayk7IC8vcmVzIHNhdHVyYXRlZCBmb3IgMHg4MDAwMDAwMAorfQorCisvLyoqKioqKioqKiBWZWN0b3Igc2F0dXJhdGluZyByb3VuZGluZyBkb3VibGluZyBtdWx0aXBseSBoaWdoICoqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9JZiB1c2UgX21tX211bGhyc194eCBmdW5jdGlvbnMgIHRoZSByZXN1bHQgbWF5IGRpZmZlciBmcm9tIE5FT04gb25lIGEgbGl0dGxlICBkdWUgdG8gZGlmZmVyZW50IHJvdW5kaW5nIHJ1bGVzIGFuZCBvcmRlcgoraW50MTZ4NF90IHZxcmRtdWxoX3MxNihpbnQxNng0X3QgYSwgIGludDE2eDRfdCBiKTsgLy8gVlFSRE1VTEguUzE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2cXJkbXVsaF9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYikKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnFyZG11bGhxX3MxNihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKK2ludDMyeDJfdCB2cXJkbXVsaF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlFSRE1VTEguUzMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDMyeDJfdCB2cXJkbXVsaF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1VORUZGRUNUSVZFKQoreworICAgIC8vbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggYSBzZXJpYWwgc29sdXRpb24KKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQzMl90IGNtYXNrMzJbXSA9IHsweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwfTsKKyAgICBfX20xMjhpIHJlc19zYXQsIG1hc2ssIG1hc2sxOworICAgIGludDY0eDJfdCBtdWw7CisgICAgbXVsID0gdm11bGxfczMyKGEsYik7CisgICAgcmVzX3NhdCA9IF9tbV9zbGxpX2VwaTY0IChtdWwsIDEpOyAvL2RvdWJsZSB0aGUgcmVzdWx0LCBzYXR1cmF0aW9uIG5vdCBjb25zaWRlcmVkCisgICAgbWFzazEgPSBfbW1fc2xsaV9lcGk2NChyZXNfc2F0LCAzMik7IC8vc2hpZnQgbGVmdCB0aGVuIGJhY2sgcmlnaHQgdG8KKyAgICBtYXNrMSA9IF9tbV9zcmxpX2VwaTY0KG1hc2sxLDMxKTsgLy9nZXQgIDMxLXRoIGJpdCAxIG9yIHplcm8KKyAgICBtdWwgPSBfbW1fYWRkX2VwaTMyIChyZXNfc2F0LCBtYXNrMSk7IC8vYWN0dWFsIHJvdW5kaW5nCisgICAgLy9hdCB0aGlzIHBvaW50IHN0YXJ0IHRyZWF0aW5nIDIgNjQtYml0IG51bWJlcnMgYXMgNCAzMi1iaXQKKyAgICBtdWwgPSBfbW1fc2h1ZmZsZV9lcGkzMiAobXVsLCAxIHwgKDMgPDwgMikgfCAoMCA8PCA0KSB8ICgyIDw8IDYpKTsgLy9zaHVmZmxlIHRoZSBkYXRhIHRvIGdldCAyIDMyLWJpdHMgZnJvbSBlYWNoIDY0LWJpdAorICAgIG1hc2sgPSBfbW1fY21wZXFfZXBpMzIgKG11bCwgKihfX20xMjhpKiljbWFzazMyKTsKKyAgICBtdWwgPSBfbW1feG9yX3NpMTI4IChtdWwsICBtYXNrKTsgLy9yZXMgc2F0dXJhdGVkIGZvciAweDgwMDAwMDAwCisgICAgcmV0dXJuNjQobXVsKTsKK30KKworaW50MTZ4OF90IHZxcmRtdWxocV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlFSRE1VTEguUzE2IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2cXJkbXVsaHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgLy8gVlFSRE1VTEguUzE2IHEwLHEwLHEwCit7CisgICAgX19tMTI4aSBtYXNrLCByZXM7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQxNl90IGNtYXNrW10gPSB7MHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDB9OworICAgIHJlcyA9IF9tbV9tdWxocnNfZXBpMTYgKGEsIGIpOworICAgIG1hc2sgPSBfbW1fY21wZXFfZXBpMTYgKHJlcywgKihfX20xMjhpKiljbWFzayk7CisgICAgcmV0dXJuIF9tbV94b3Jfc2kxMjggKHJlcywgIG1hc2spOyAvL3JlcyBzYXR1cmF0ZWQgZm9yIDB4ODAwMAorfQorCitpbnQzMng0X3QgdnFyZG11bGhxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWUVJETVVMSC5TMzIgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MzJ4NF90IHZxcmRtdWxocV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1VORUZGRUNUSVZFKQoreworICAgIC8vIG5vIG11bHRpcGx5IGhpZ2ggMzIgYml0IFNJTUQgaW4gSUEzMiwgbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggYSBzZXJpYWwgc29sdXRpb24gZm9yIHRoZSBTU1NFMyB0YXJnZXQKKyAgICBfX20xMjhpIGFiLCBiYSwgIG1hc2ssIG11bCwgbXVsMSwgbWFzazE7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQzMl90IGNtYXNrMzJbXSA9IHsweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwfTsKKyAgICBhYiA9IF9tbV91bnBhY2tsb19lcGkzMiAoYSwgYik7IC8vYTAsIGIwLCBhMSxiMQorICAgIGJhID0gX21tX3VucGFja2xvX2VwaTMyIChiLCBhKTsgLy9iMCwgYTAsIGIxLGExCisgICAgbXVsID0gX01NX01VTF9FUEkzMihhYiwgYmEpOyAvL3VzZXMgMXJzdCBhbmQgM3JkIGRhdGEgbGFuZXMsIHRoZSBtdWx0aXBsaWNhdGlvbiBnaXZlcyA2NCBiaXQgcmVzdWx0CisgICAgbXVsID0gX21tX3NsbGlfZXBpNjQgKG11bCwgMSk7IC8vZG91YmxlIHRoZSByZXN1bHQsIHNhdHVyYXRpb24gbm90IGNvbnNpZGVyZWQKKyAgICBtYXNrMSA9IF9tbV9zbGxpX2VwaTY0KG11bCwgMzIpOyAvL3NoaWZ0IGxlZnQgdGhlbiBiYWNrIHJpZ2h0IHRvCisgICAgbWFzazEgPSBfbW1fc3JsaV9lcGk2NChtYXNrMSwzMSk7IC8vZ2V0ICAzMS10aCBiaXQgMSBvciB6ZXJvCisgICAgbXVsID0gX21tX2FkZF9lcGkzMiAobXVsLCBtYXNrMSk7IC8vYWN0dWFsIHJvdW5kaW5nCisKKyAgICBhYiA9IF9tbV91bnBhY2toaV9lcGkzMiAoYSwgYik7IC8vYTIsIGIyLCBhMyxiMworICAgIGJhID0gX21tX3VucGFja2hpX2VwaTMyIChiLCBhKTsgLy9iMiwgYTIsIGIzLGEzCisgICAgbXVsMSA9IF9NTV9NVUxfRVBJMzIoYWIsIGJhKTsgLy91c2VzIDFyc3QgYW5kIDNyZCBkYXRhIGxhbmVzLCB0aGUgbXVsdGlwbGljYXRpb24gZ2l2ZXMgNjQgYml0IHJlc3VsdAorICAgIG11bDEgPSBfbW1fc2xsaV9lcGk2NCAobXVsMSwgMSk7IC8vZG91YmxlIHRoZSByZXN1bHQsIHNhdHVyYXRpb24gbm90IGNvbnNpZGVyZWQKKyAgICBtYXNrMSA9IF9tbV9zbGxpX2VwaTY0KG11bDEsIDMyKTsgLy9zaGlmdCBsZWZ0IHRoZW4gYmFjayByaWdodCB0bworICAgIG1hc2sxID0gX21tX3NybGlfZXBpNjQobWFzazEsMzEpOyAvL2dldCAgMzEtdGggYml0IDEgb3IgemVybworICAgIG11bDEgPSBfbW1fYWRkX2VwaTMyIChtdWwxLCBtYXNrMSk7IC8vYWN0dWFsIHJvdW5kaW5nCisgICAgLy9hdCB0aGlzIHBvaW50IHN0YXJ0IHRyZWF0aW5nIDIgNjQtYml0IG51bWJlcnMgYXMgNCAzMi1iaXQKKyAgICBtdWwgPSBfbW1fc2h1ZmZsZV9lcGkzMiAobXVsLCAxIHwgKDMgPDwgMikgfCAoMCA8PCA0KSB8ICgyIDw8IDYpKTsgLy9zaHVmZmxlIHRoZSBkYXRhIHRvIGdldCAyIDMyLWJpdHMgZnJvbSBlYWNoIDY0LWJpdAorICAgIG11bDEgPSBfbW1fc2h1ZmZsZV9lcGkzMiAobXVsMSwgMSB8ICgzIDw8IDIpIHwgKDAgPDwgNCkgfCAoMiA8PCA2KSk7IC8vc2h1ZmZsZSB0aGUgZGF0YSB0byBnZXQgMiAzMi1iaXRzIGZyb20gZWFjaCA2NC1iaXQKKyAgICBtdWwgPSBfbW1fdW5wYWNrbG9fZXBpNjQobXVsLCBtdWwxKTsKKyAgICBtYXNrID0gX21tX2NtcGVxX2VwaTMyIChtdWwsICooX19tMTI4aSopY21hc2szMik7CisgICAgcmV0dXJuIF9tbV94b3Jfc2kxMjggKG11bCwgIG1hc2spOyAvL3JlcyBzYXR1cmF0ZWQgZm9yIDB4ODAwMDAwMDAKK30KKworLy8qKioqKioqKioqKioqVmVjdG9yIHdpZGVuaW5nIHNhdHVyYXRpbmcgZG91YmxpbmcgbXVsdGlwbHkgYWNjdW11bGF0ZSAobG9uZyBzYXR1cmF0aW5nIGRvdWJsaW5nIG11bHRpcGx5IGFjY3VtdWxhdGUpICoqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDMyeDRfdCB2cWRtbGFsX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCBjKTsgLy8gVlFETUxBTC5TMTYgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZxZG1sYWxfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpIC8vIFZRRE1MQUwuUzE2IHEwLGQwLGQwCit7CisgICAgLy9ub3Qgb3B0aW1hbCBTSU1EIHNvdWx1dGlvbiwgc2VyaWFsIG1heSBiZSBmYXN0ZXIKKyAgICBfX20xMjhpIHJlczMyOworICAgIHJlczMyID0gdm11bGxfczE2KGIsICBjKTsKKyAgICByZXMzMiA9IHZxZF9zMzIocmVzMzIpOyAvL2RvdWJsaW5nICYgc2F0dXJhdGlvbiAsaWYgbm8gc2F0dXJhdGlvbiB3ZSBjb3VsZCB1c2UgX21tX3NsbGlfZXBpMzIgKHJlcywgMSk7CisgICAgcmV0dXJuIHZxYWRkcV9zMzIocmVzMzIsIGEpOyAvL3NhdHVyYXRpb24KK30KKworaW50NjR4Ml90IHZxZG1sYWxfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IGMpOyAvLyBWUURNTEFMLlMzMiBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ2NHgyX3QgdnFkbWxhbF9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgYyksX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBfX20xMjhpIHJlczY0OworICAgIHJlczY0ID0gdm11bGxfczMyKGIsYyk7CisgICAgcmVzNjQgPSB2cWFkZHFfczY0KHJlczY0LCByZXM2NCk7IC8vZG91YmxpbmcgJiBzYXR1cmF0aW9uICxpZiBubyBzYXR1cmF0aW9uIHdlIGNvdWxkIHVzZSBfbW1fc2xsaV9lcGk2NCAocmVzLCAxKTsKKyAgICByZXR1cm4gdnFhZGRxX3M2NChyZXM2NCwgYSk7IC8vc2F0dXJhdGlvbgorfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKiogIFZlY3RvciBzdWJ0cmFjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZzdWJfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZTVUIuSTggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdnN1Yl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9zdWJfZXBpOChfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCitpbnQxNng0X3QgdnN1Yl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlNVQi5JMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZzdWJfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX3N1Yl9lcGkxNihfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCitpbnQzMngyX3QgdnN1Yl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlNVQi5JMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZzdWJfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX3N1Yl9lcGkzMihfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCitpbnQ2NHgxX3QgdnN1Yl9zNjQoaW50NjR4MV90IGEsICBpbnQ2NHgxX3QgYik7IC8vIFZTVUIuSTY0IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDFfdCB2c3ViX3M2NChpbnQ2NHgxX3QgYSwgIGludDY0eDFfdCBiKQoreworICAgIGludDY0eDFfdCByZXM2NDsKKyAgICByZXM2NC5tNjRfaTY0WzBdID0gYS5tNjRfaTY0WzBdIC0gYi5tNjRfaTY0WzBdOworICAgIHJldHVybiByZXM2NDsKK30KKworCitmbG9hdDMyeDJfdCB2c3ViX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVlNVQi5GMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3QgdnN1Yl9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikKK3sKKyAgICBmbG9hdDMyeDJfdCByZXM7CisgICAgcmVzLm02NF9mMzJbMF0gPSBhLm02NF9mMzJbMF0gLSBiLm02NF9mMzJbMF07CisgICAgcmVzLm02NF9mMzJbMV0gPSBhLm02NF9mMzJbMV0gLSBiLm02NF9mMzJbMV07CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDh4OF90IHZzdWJfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlNVQi5JOCBkMCxkMCxkMAorI2RlZmluZSB2c3ViX3U4IHZzdWJfczgKKwordWludDE2eDRfdCB2c3ViX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZTVUIuSTE2IGQwLGQwLGQwCisjZGVmaW5lIHZzdWJfdTE2IHZzdWJfczE2CisKK3VpbnQzMngyX3QgdnN1Yl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWU1VCLkkzMiBkMCxkMCxkMAorI2RlZmluZSB2c3ViX3UzMiB2c3ViX3MzMgorCisKK3VpbnQ2NHgxX3QgdnN1Yl91NjQodWludDY0eDFfdCBhLCAgdWludDY0eDFfdCBiKTsgLy8gVlNVQi5JNjQgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDFfdCB2c3ViX3U2NCh1aW50NjR4MV90IGEsICB1aW50NjR4MV90IGIpCit7CisgICAgaW50NjR4MV90IHJlczY0OworICAgIHJlczY0Lm02NF91NjRbMF0gPSBhLm02NF91NjRbMF0gLSBiLm02NF91NjRbMF07CisgICAgcmV0dXJuIHJlczY0OworfQorCisKK2ludDh4MTZfdCAgIHZzdWJxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZTVUIuSTggcTAscTAscTAKKyNkZWZpbmUgdnN1YnFfczggX21tX3N1Yl9lcGk4CisKK2ludDE2eDhfdCAgIHZzdWJxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWU1VCLkkxNiBxMCxxMCxxMAorI2RlZmluZSB2c3VicV9zMTYgX21tX3N1Yl9lcGkxNgorCitpbnQzMng0X3QgICB2c3VicV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlNVQi5JMzIgcTAscTAscTAKKyNkZWZpbmUgdnN1YnFfczMyIF9tbV9zdWJfZXBpMzIKKworaW50NjR4Ml90ICAgdnN1YnFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZTVUIuSTY0IHEwLHEwLHEwCisjZGVmaW5lIHZzdWJxX3M2NCBfbW1fc3ViX2VwaTY0CisKK2Zsb2F0MzJ4NF90IHZzdWJxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVlNVQi5GMzIgcTAscTAscTAKKyNkZWZpbmUgdnN1YnFfZjMyIF9tbV9zdWJfcHMKKwordWludDh4MTZfdCAgIHZzdWJxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVlNVQi5JOCBxMCxxMCxxMAorI2RlZmluZSB2c3VicV91OCBfbW1fc3ViX2VwaTgKKwordWludDE2eDhfdCAgIHZzdWJxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZTVUIuSTE2IHEwLHEwLHEwCisjZGVmaW5lIHZzdWJxX3UxNiBfbW1fc3ViX2VwaTE2CisKK3VpbnQzMng0X3QgICB2c3VicV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWU1VCLkkzMiBxMCxxMCxxMAorI2RlZmluZSB2c3VicV91MzIgX21tX3N1Yl9lcGkzMgorCit1aW50NjR4Ml90ICAgdnN1YnFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKTsgLy8gVlNVQi5JNjQgcTAscTAscTAKKyNkZWZpbmUgdnN1YnFfdTY0IF9tbV9zdWJfZXBpNjQKKworLy8qKioqKioqKioqKioqKipWZWN0b3IgbG9uZyBzdWJ0cmFjdDogdnN1YiAtPiBWcltpXTo9VmFbaV0tVmJbaV0gKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL1ZhLCBWYiBoYXZlIGVxdWFsIGxhbmUgc2l6ZXMsIHJlc3VsdCBpcyBhIDEyOCBiaXQgdmVjdG9yIG9mIGxhbmVzIHRoYXQgYXJlIHR3aWNlIHRoZSB3aWR0aC4KK2ludDE2eDhfdCB2c3VibF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlNVQkwuUzggcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZzdWJsX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpIC8vIFZTVUJMLlM4IHEwLGQwLGQwCit7CisgICAgX19tMTI4aSBhMTYsIGIxNjsKKyAgICBhMTYgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoX3BNMTI4aShhKSk7IC8vU1NFNC4xLAorICAgIGIxNiA9IF9NTV9DVlRFUEk4X0VQSTE2IChfcE0xMjhpKGIpKTsgLy9TU0U0LjEsCisgICAgcmV0dXJuIF9tbV9zdWJfZXBpMTYgKGExNiwgYjE2KTsKK30KKworaW50MzJ4NF90IHZzdWJsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWU1VCTC5TMTYgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZzdWJsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIC8vIFZTVUJMLlMxNiBxMCxkMCxkMAoreworICAgIF9fbTEyOGkgYTMyLCBiMzI7CisgICAgYTMyID0gX01NX0NWVEVQSTE2X0VQSTMyIChfcE0xMjhpKGEpKTsgLy9TU0U0LjEKKyAgICBiMzIgPSBfTU1fQ1ZURVBJMTZfRVBJMzIgKF9wTTEyOGkoYikpOyAvL1NTRTQuMSwKKyAgICByZXR1cm4gX21tX3N1Yl9lcGkzMiAoYTMyLCBiMzIpOworfQorCitpbnQ2NHgyX3QgdnN1YmxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZTVUJMLlMzMiBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgyX3QgdnN1YmxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikgLy8gVlNVQkwuUzMyIHEwLGQwLGQwCit7CisgICAgLy9tYXkgYmUgbm90IG9wdGltYWwKKyAgICBfX20xMjhpIGE2NCwgYjY0OworICAgIGE2NCA9IF9NTV9DVlRFUEkzMl9FUEk2NCAoX3BNMTI4aShhKSk7IC8vU1NFNC4xCisgICAgYjY0ID0gX01NX0NWVEVQSTMyX0VQSTY0IChfcE0xMjhpKGIpKTsgLy9TU0U0LjEsCisgICAgcmV0dXJuIF9tbV9zdWJfZXBpNjQgKGE2NCwgYjY0KTsKK30KKwordWludDE2eDhfdCB2c3VibF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWU1VCTC5VOCBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZzdWJsX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYikgLy8gVlNVQkwuVTggcTAsZDAsZDAKK3sKKyAgICBfX20xMjhpIGExNiwgYjE2OworICAgIGExNiA9IF9NTV9DVlRFUFU4X0VQSTE2IChfcE0xMjhpKGEpKTsgLy9TU0U0LjEsCisgICAgYjE2ID0gX01NX0NWVEVQVThfRVBJMTYgKF9wTTEyOGkoYikpOyAvL1NTRTQuMSwKKyAgICByZXR1cm4gX21tX3N1Yl9lcGkxNiAoYTE2LCBiMTYpOworfQorCit1aW50MzJ4NF90IHZzdWJsX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZTVUJMLnMxNiBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZzdWJsX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYikgLy8gVlNVQkwuczE2IHEwLGQwLGQwCit7CisgICAgX19tMTI4aSBhMzIsIGIzMjsKKyAgICBhMzIgPSBfTU1fQ1ZURVBVMTZfRVBJMzIgKF9wTTEyOGkoYSkpOyAvL1NTRTQuMQorICAgIGIzMiA9IF9NTV9DVlRFUFUxNl9FUEkzMiAoX3BNMTI4aShiKSk7IC8vU1NFNC4xLAorICAgIHJldHVybiBfbW1fc3ViX2VwaTMyIChhMzIsIGIzMik7Cit9CisKK3VpbnQ2NHgyX3QgdnN1YmxfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVlNVQkwuVTMyIHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgyX3QgdnN1YmxfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKSAvLyBWU1VCTC5VMzIgcTAsZDAsZDAKK3sKKyAgICAvL21heSBiZSBub3Qgb3B0aW1hbAorICAgIF9fbTEyOGkgYTY0LCBiNjQ7CisgICAgYTY0ID0gX01NX0NWVEVQVTMyX0VQSTY0IChfcE0xMjhpKGEpKTsgLy9TU0U0LjEKKyAgICBiNjQgPSBfTU1fQ1ZURVBVMzJfRVBJNjQgKF9wTTEyOGkoYikpOyAvL1NTRTQuMSwKKyAgICByZXR1cm4gX21tX3N1Yl9lcGk2NCAoYTY0LCBiNjQpOworfQorCisvLyoqKioqKioqKioqKioqKioqIFZlY3RvciB3aWRlIHN1YnRyYWN0OiB2c3ViIC0+IFZyW2ldOj1WYVtpXS1WYltpXSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQxNng4X3QgdnN1YndfczgoaW50MTZ4OF90IGEsIGludDh4OF90IGIpOyAvLyBWU1VCVy5TOCBxMCxxMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgdnN1YndfczgoaW50MTZ4OF90IGEsIGludDh4OF90IGIpIC8vIFZTVUJXLlM4IHEwLHEwLGQwCit7CisgICAgX19tMTI4aSBiMTY7CisgICAgYjE2ID0gX01NX0NWVEVQSThfRVBJMTYgKF9wTTEyOGkoYikpOyAvL1NTRTQuMSwKKyAgICByZXR1cm4gX21tX3N1Yl9lcGkxNiAoYSwgYjE2KTsKK30KKworaW50MzJ4NF90IHZzdWJ3X3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWU1VCVy5TMTYgcTAscTAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZzdWJ3X3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIpIC8vIFZTVUJXLlMxNiBxMCxxMCxkMAoreworICAgIF9fbTEyOGkgYjMyOworICAgIGIzMiA9IF9NTV9DVlRFUEkxNl9FUEkzMiAoX3BNMTI4aShiKSk7IC8vU1NFNC4xLAorICAgIHJldHVybiBfbW1fc3ViX2VwaTMyIChhLCBiMzIpOworfQorCitpbnQ2NHgyX3QgdnN1YndfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZTVUJXLlMzMiBxMCxxMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgyX3QgdnN1YndfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYikgLy8gVlNVQlcuUzMyIHEwLHEwLGQwCit7CisgICAgX19tMTI4aSBiNjQ7CisgICAgYjY0ID0gX01NX0NWVEVQSTMyX0VQSTY0IChfcE0xMjhpKGIpKTsgLy9TU0U0LjEKKyAgICByZXR1cm4gX21tX3N1Yl9lcGk2NCAoYSwgYjY0KTsKK30KKwordWludDE2eDhfdCB2c3Vid191OCh1aW50MTZ4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlNVQlcuVTggcTAscTAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDhfdCB2c3Vid191OCh1aW50MTZ4OF90IGEsIHVpbnQ4eDhfdCBiKSAvLyBWU1VCVy5VOCBxMCxxMCxkMAoreworICAgIF9fbTEyOGkgYjE2OworICAgIGIxNiA9IF9NTV9DVlRFUFU4X0VQSTE2IChfcE0xMjhpKGIpKTsgLy9TU0U0LjEsCisgICAgcmV0dXJuIF9tbV9zdWJfZXBpMTYgKGEsIGIxNik7Cit9CisKK3VpbnQzMng0X3QgdnN1YndfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlNVQlcuczE2IHEwLHEwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdnN1YndfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiKSAvLyBWU1VCVy5zMTYgcTAscTAsZDAKK3sKKyAgICBfX20xMjhpIGIzMjsKKyAgICBiMzIgPSBfTU1fQ1ZURVBVMTZfRVBJMzIgKF9wTTEyOGkoYikpOyAvL1NTRTQuMSwKKyAgICByZXR1cm4gX21tX3N1Yl9lcGkzMiAoYSwgYjMyKTsKK30KKwordWludDY0eDJfdCB2c3Vid191MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWU1VCVy5VMzIgcTAscTAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDJfdCB2c3Vid191MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIpIC8vIFZTVUJXLlUzMiBxMCxxMCxkMAoreworICAgIF9fbTEyOGkgYjY0OworICAgIGI2NCA9IF9NTV9DVlRFUFUzMl9FUEk2NCAoX3BNMTI4aShiKSk7IC8vU1NFNC4xCisgICAgcmV0dXJuIF9tbV9zdWJfZXBpNjQgKGEsIGI2NCk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqVmVjdG9yIHNhdHVyYXRpbmcgc3VidHJhY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZxc3ViX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWUVNVQi5TOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2cXN1Yl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9zdWJzX2VwaTgoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKworaW50MTZ4NF90IHZxc3ViX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWUVNVQi5TMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZxc3ViX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9zdWJzX2VwaTE2KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK2ludDMyeDJfdCB2cXN1Yl9zMzIoaW50MzJ4Ml90IGEsICBpbnQzMngyX3QgYik7IC8vIFZRU1VCLlMzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdnFzdWJfczMyKGludDMyeDJfdCBhLCAgaW50MzJ4Ml90IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KHZxc3VicV9zMzIoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK2ludDY0eDFfdCB2cXN1Yl9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVlFTVUIuUzY0IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDFfdCB2cXN1Yl9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkgLy9ubyBvcHRpbWFsIFNJTUQgc291bHV0aW9uCit7CisgICAgdWludDY0eDFfdCByZXM7CisgICAgdWludDY0X3QgYTY0LGI2NDsKKyAgICBhNjQgPSBhLm02NF91NjRbMF07CisgICAgYjY0ID0gYi5tNjRfdTY0WzBdOworICAgIHJlcy5tNjRfdTY0WzBdID0gYTY0IC0gYjY0OworCisgICAgYTY0ID0gIChhNjQgPj4gNjMpICsgKH5fU0lHTkJJVDY0KTsKKyAgICBpZiAoKGludDY0X3QpKChhNjQgXiBiNjQpICYgKGE2NCBeIHJlcy5tNjRfdTY0WzBdKSkgPCAwKSB7CisgICAgICAgIHJlcy5tNjRfdTY0WzBdID0gYTY0OworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit1aW50OHg4X3QgdnFzdWJfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlFTVUIuVTggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZxc3ViX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYikKK3sKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX3N1YnNfZXB1OChfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCit1aW50MTZ4NF90IHZxc3ViX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZRU1VCLnMxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZxc3ViX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYikKK3sKKyAgICB1aW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9zdWJzX2VwdTE2KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQzMngyX3QgdnFzdWJfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYik7IC8vIFZRU1VCLlUzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZxc3ViX3UzMih1aW50MzJ4Ml90IGEsICB1aW50MzJ4Ml90IGIpCit7CisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NCh2cXN1YnFfdTMyKF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCit1aW50NjR4MV90IHZxc3ViX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYik7IC8vIFZRU1VCLlU2NCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50NjR4MV90IHZxc3ViX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYiksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgdWludDY0eDFfdCByZXM7CisgICAgdWludDY0X3QgYTY0LCBiNjQ7CisgICAgYTY0ID0gX1VpNjQoYSk7CisgICAgYjY0ID0gX1VpNjQoYik7CisgICAgaWYgKGE2NCA+IGI2NCkgeworICAgICAgICByZXMubTY0X3U2NFswXSA9IGE2NCAtIGI2NDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXMubTY0X3U2NFswXSA9IDA7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK2ludDh4MTZfdCAgIHZxc3VicV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWUVNVQi5TOCBxMCxxMCxxMAorI2RlZmluZSB2cXN1YnFfczggX21tX3N1YnNfZXBpOAorCitpbnQxNng4X3QgICB2cXN1YnFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZRU1VCLlMxNiBxMCxxMCxxMAorI2RlZmluZSB2cXN1YnFfczE2IF9tbV9zdWJzX2VwaTE2CisKK2ludDMyeDRfdCB2cXN1YnFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZRU1VCLlMzMiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnFzdWJxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpCit7CisgICAgLy9ubyBjb3JyZXNwb25kaW5nIHg4NiBTSU1EIHNvdWx1dGlvbiwgc3BlY2lhbCB0cmlja3MgYXJlIG5lY2Vzc2FyeS4gVGhlIG92ZXJmbG93IGlzIHBvc3NpYmxlIG9ubHkgaWYgYSBhbmQgYiBoYXZlIG9wcG9zaXRlIHNpZ25zIGFuZCBzdWIgaGFzIG9wcG9zaXRlIHNpZ24gdG8gYQorICAgIF9fbTEyOGkgYzdmZmZmZmZmLCByZXMsIHJlc19zYXQsIHJlc194b3JfYSwgYl94b3JfYTsKKyAgICBjN2ZmZmZmZmYgPSBfbW1fc2V0MV9lcGkzMigweDdmZmZmZmZmKTsKKyAgICByZXMgPSBfbW1fc3ViX2VwaTMyKGEsIGIpOworICAgIHJlc19zYXQgPSBfbW1fc3JsaV9lcGkzMihhLCAzMSk7CisgICAgcmVzX3NhdCA9IF9tbV9hZGRfZXBpMzIocmVzX3NhdCwgYzdmZmZmZmZmKTsKKyAgICByZXNfeG9yX2EgPSBfbW1feG9yX3NpMTI4KHJlcywgYSk7CisgICAgYl94b3JfYSA9IF9tbV94b3Jfc2kxMjgoYiwgYSk7CisgICAgcmVzX3hvcl9hID0gX21tX2FuZF9zaTEyOChiX3hvcl9hLCByZXNfeG9yX2EpOworICAgIHJlc194b3JfYSA9IF9tbV9zcmFpX2VwaTMyKHJlc194b3JfYSwzMSk7IC8vcHJvcGFnYXRlIHRoZSBzaWdoIGJpdCwgYWxsIGZmZmYgaWYgPDAgYWxsIG9uZXMgb3RoZXJ3aXNlCisgICAgcmVzX3NhdCA9IF9tbV9hbmRfc2kxMjgocmVzX3hvcl9hLCByZXNfc2F0KTsKKyAgICByZXMgPSBfbW1fYW5kbm90X3NpMTI4KHJlc194b3JfYSwgcmVzKTsKKyAgICByZXR1cm4gX21tX29yX3NpMTI4KHJlcywgcmVzX3NhdCk7Cit9CisKK2ludDY0eDJfdCB2cXN1YnFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZRU1VCLlM2NCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ2NHgyX3QgdnFzdWJxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKSAvL25vIG9wdGltYWwgU0lNRCBzb3VsdXRpb24KK3sKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50NjRfdCBhdG1wWzJdLCBidG1wWzJdOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50NjRfdCByZXNbMl07CisgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilhdG1wLCBhKTsKKyAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWJ0bXAsIGIpOworICAgIHJlc1swXSA9IGF0bXBbMF0gLSBidG1wWzBdOworICAgIHJlc1sxXSA9IGF0bXBbMV0gLSBidG1wWzFdOworICAgIGlmICgoKHJlc1swXSBeIGF0bXBbMF0pICYgX1NJR05CSVQ2NCkgJiYgKChhdG1wWzBdIF4gYnRtcFswXSkgJiBfU0lHTkJJVDY0KSkgeworICAgICAgICByZXNbMF0gPSAoYXRtcFswXSA+PiA2MykgXiB+X1NJR05CSVQ2NDsKKyAgICB9CisgICAgaWYgKCgocmVzWzFdIF4gYXRtcFsxXSkgJiBfU0lHTkJJVDY0KSAmJiAoKGF0bXBbMV0gXiBidG1wWzFdKSAmIF9TSUdOQklUNjQpKSB7CisgICAgICAgIHJlc1sxXSA9IChhdG1wWzFdID4+IDYzKSBeIH5fU0lHTkJJVDY0OworICAgIH0KKyAgICByZXR1cm4gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKXJlcyk7Cit9CisKK3VpbnQ4eDE2X3QgICB2cXN1YnFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWUVNVQi5VOCBxMCxxMCxxMAorI2RlZmluZSB2cXN1YnFfdTggX21tX3N1YnNfZXB1OAorCit1aW50MTZ4OF90ICAgdnFzdWJxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZRU1VCLnMxNiBxMCxxMCxxMAorI2RlZmluZSB2cXN1YnFfdTE2IF9tbV9zdWJzX2VwdTE2CisKK3VpbnQzMng0X3QgdnFzdWJxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZRU1VCLlUzMiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZxc3VicV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpIC8vIFZRU1VCLlUzMiBxMCxxMCxxMAoreworICAgIF9fbTEyOGkgbWluLCBtYXNrLCBzdWI7CisgICAgbWluID0gX01NX01JTl9FUFUzMihhLCBiKTsgLy9TU0U0LjEKKyAgICBtYXNrID0gX21tX2NtcGVxX2VwaTMyIChtaW4sICBiKTsKKyAgICBzdWIgPSBfbW1fc3ViX2VwaTMyIChhLCBiKTsKKyAgICByZXR1cm4gX21tX2FuZF9zaTEyOCAoIHN1YiwgbWFzayk7Cit9CisKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDY0eDJfdCB2cXN1YnFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCk7IC8vIFZRU1VCLlU2NCBxMCxxMCxxMAorI2lmZGVmIFVTRV9TU0U0CisgICAgX05FT04yU1NFX0lOTElORSB1aW50NjR4Ml90IHZxc3VicV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpCisgICAgeworICAgICAgICBfX20xMjhpIGM4MDAwMDAwMCwgc3ViYiwgc3ViYSwgY21wLCBzdWI7CisgICAgICAgIGM4MDAwMDAwMCA9IF9tbV9zZXRfZXBpMzIgKDB4ODAwMDAwMDAsIDB4MCwgMHg4MDAwMDAwMCwgMHgwKTsKKyAgICAgICAgc3ViICA9IF9tbV9zdWJfZXBpNjQgKGEsIGIpOworICAgICAgICBzdWJhID0gX21tX3N1Yl9lcGk2NCAoYSwgYzgwMDAwMDAwKTsKKyAgICAgICAgc3ViYiA9IF9tbV9zdWJfZXBpNjQgKGIsIGM4MDAwMDAwMCk7CisgICAgICAgIGNtcCA9IF9tbV9jbXBndF9lcGk2NCAoIHN1YmEsIHN1YmIpOyAvL25vIHVuc2lnbmVkIGNvbXBhcmlzb24sIG5lZWQgdG8gZ28gdG8gc2lnbmVkLCBTU0U0LjIhISEKKyAgICAgICAgcmV0dXJuIF9tbV9hbmRfc2kxMjggKHN1YiwgY21wKTsgLy9zYXR1cmF0aW9uCisgICAgfQorI2Vsc2UKKyAgICBfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQ2NHgyX3QgdnFzdWJxX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYiksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCisgICAgeworICAgICAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDY0X3QgYXRtcFsyXSwgYnRtcFsyXSwgcmVzWzJdOworICAgICAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWF0bXAsIGEpOworICAgICAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWJ0bXAsIGIpOworICAgICAgICByZXNbMF0gPSAoYXRtcFswXSA+IGJ0bXBbMF0pID8gYXRtcFswXSAtICBidG1wWzBdIDogMDsKKyAgICAgICAgcmVzWzFdID0gKGF0bXBbMV0gPiBidG1wWzFdKSA/IGF0bXBbMV0gLSAgYnRtcFsxXSA6IDA7CisgICAgICAgIHJldHVybiBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSopKHJlcykpOworICAgIH0KKyNlbmRpZgorCisvLyoqKioqKioqKipWZWN0b3IgaGFsdmluZyBzdWJ0cmFjdCBWcltpXTo9KFZhW2ldLVZiW2ldKT4+MSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZoc3ViX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWSFNVQi5TOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2aHN1Yl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSAvLyBWSFNVQi5TOCBkMCxkMCxkMAoreworICAgIC8vbm8gOCBiaXQgc2hpZnQgYXZhaWxhYmxlLCBpbnRlcm5hbCBvdmVyZmxvdyBpcyBwb3NzaWJsZSwgc28gbGV0J3MgZ28gdG8gMTYgYml0LAorICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgcjE2OworICAgIGludDh4OF90IHI7CisgICAgciA9IHZzdWJfczggKGEsIGIpOworICAgIHIxNiA9IF9NTV9DVlRFUEk4X0VQSTE2IChfcE0xMjhpKHIpKTsgLy9TU0UgNC4xCisgICAgcjE2ID0gX21tX3NyYWlfZXBpMTYgKHIxNiwgMSk7IC8vU1NFMgorICAgIHIxNiA9ICBfbW1fcGFja3NfZXBpMTYgKHIxNixyMTYpOyAvL3VzZSBsb3cgNjQgYml0cworICAgIHJldHVybjY0KHIxNik7Cit9CisKK2ludDE2eDRfdCB2aHN1Yl9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYik7IC8vIFZIU1VCLlMxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdmhzdWJfczE2KGludDE2eDRfdCBhLCAgaW50MTZ4NF90IGIpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KHZoc3VicV9zMTYoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKKworaW50MzJ4Ml90IHZoc3ViX3MzMihpbnQzMngyX3QgYSwgIGludDMyeDJfdCBiKTsgLy8gVkhTVUIuUzMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2aHN1Yl9zMzIoaW50MzJ4Ml90IGEsICBpbnQzMngyX3QgYikKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodmhzdWJxX3MzMihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDh4OF90IHZoc3ViX3U4KHVpbnQ4eDhfdCBhLCAgdWludDh4OF90IGIpOyAvLyBWSFNVQi5VOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdmhzdWJfdTgodWludDh4OF90IGEsICB1aW50OHg4X3QgYikKK3sKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodmhzdWJxX3U4KF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKwordWludDE2eDRfdCB2aHN1Yl91MTYodWludDE2eDRfdCBhLCAgdWludDE2eDRfdCBiKTsgLy8gVkhTVUIuczE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdmhzdWJfdTE2KHVpbnQxNng0X3QgYSwgIHVpbnQxNng0X3QgYikKK3sKKyAgICB1aW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KHZoc3VicV91MTYoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCit1aW50MzJ4Ml90IHZoc3ViX3UzMih1aW50MzJ4Ml90IGEsICB1aW50MzJ4Ml90IGIpOyAvLyBWSFNVQi5VMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2aHN1Yl91MzIodWludDMyeDJfdCBhLCAgdWludDMyeDJfdCBiKQoreworICAgIHVpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodmhzdWJxX3UzMihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKK2ludDh4MTZfdCB2aHN1YnFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVkhTVUIuUzggcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90IHZoc3VicV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIC8vIFZIU1VCLlM4IHEwLHEwLHEwCit7CisgICAgLy8gLy9uZWVkIHRvIGRlYWwgd2l0aCB0aGUgcG9zc2liaWxpdHkgb2YgaW50ZXJuYWwgb3ZlcmZsb3cKKyAgICBfX20xMjhpIGMxMjgsIGF1LGJ1OworICAgIGMxMjggPSBfbW1fc2V0MV9lcGk4ICgxMjgpOworICAgIGF1ID0gX21tX2FkZF9lcGk4KCBhLCBjMTI4KTsKKyAgICBidSA9IF9tbV9hZGRfZXBpOCggYiwgYzEyOCk7CisgICAgcmV0dXJuIHZoc3VicV91OChhdSxidSk7Cit9CisKK2ludDE2eDhfdCB2aHN1YnFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZIU1VCLlMxNiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgdmhzdWJxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIC8vIFZIU1VCLlMxNiBxMCxxMCxxMAoreworICAgIC8vbmVlZCB0byBkZWFsIHdpdGggdGhlIHBvc3NpYmlsaXR5IG9mIGludGVybmFsIG92ZXJmbG93CisgICAgX19tMTI4aSBjODAwMCwgYXUsYnU7CisgICAgYzgwMDAgPSBfbW1fc2V0MV9lcGkxNigweDgwMDApOworICAgIGF1ID0gX21tX2FkZF9lcGkxNiggYSwgYzgwMDApOworICAgIGJ1ID0gX21tX2FkZF9lcGkxNiggYiwgYzgwMDApOworICAgIHJldHVybiB2aHN1YnFfdTE2KGF1LGJ1KTsKK30KKworaW50MzJ4NF90IHZoc3VicV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVkhTVUIuUzMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2aHN1YnFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgLy8gVkhTVUIuUzMyIHEwLHEwLHEwCit7CisgICAgLy9uZWVkIHRvIGRlYWwgd2l0aCB0aGUgcG9zc2liaWxpdHkgb2YgaW50ZXJuYWwgb3ZlcmZsb3cKKyAgICBfX20xMjhpIGEyLCBiMixyLCBiXzE7CisgICAgYTIgPSBfbW1fc3JhaV9lcGkzMiAoYSwxKTsKKyAgICBiMiA9IF9tbV9zcmFpX2VwaTMyIChiLDEpOworICAgIHIgPSBfbW1fc3ViX2VwaTMyIChhMiwgYjIpOworICAgIGJfMSA9IF9tbV9hbmRub3Rfc2kxMjgoYSwgYik7IC8vIWEgYW5kIGIKKyAgICBiXzEgPSBfbW1fc2xsaV9lcGkzMiAoYl8xLDMxKTsKKyAgICBiXzEgPSBfbW1fc3JsaV9lcGkzMiAoYl8xLDMxKTsgLy8wIG9yIDEsIGxhc3QgYiBiaXQKKyAgICByZXR1cm4gX21tX3N1Yl9lcGkzMihyLGJfMSk7Cit9CisKK3VpbnQ4eDE2X3QgdmhzdWJxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVkhTVUIuVTggcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZfdCB2aHN1YnFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpIC8vIFZIU1VCLlU4IHEwLHEwLHEwCit7CisgICAgX19tMTI4aSBhdmc7CisgICAgYXZnID0gX21tX2F2Z19lcHU4IChhLCBiKTsKKyAgICByZXR1cm4gX21tX3N1Yl9lcGk4KGEsIGF2Zyk7Cit9CisKK3VpbnQxNng4X3QgdmhzdWJxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZIU1VCLnMxNiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZoc3VicV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIC8vIFZIU1VCLnMxNiBxMCxxMCxxMAoreworICAgIF9fbTEyOGkgYXZnOworICAgIGF2ZyA9IF9tbV9hdmdfZXB1MTYgKGEsIGIpOworICAgIHJldHVybiBfbW1fc3ViX2VwaTE2KGEsIGF2Zyk7Cit9CisKK3VpbnQzMng0X3QgdmhzdWJxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZIU1VCLlUzMiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZoc3VicV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpIC8vIFZIU1VCLlUzMiBxMCxxMCxxMAoreworICAgIC8vbmVlZCB0byBkZWFsIHdpdGggdGhlIHBvc3NpYmlsaXR5IG9mIGludGVybmFsIG92ZXJmbG93CisgICAgX19tMTI4aSBhMiwgYjIsciwgYl8xOworICAgIGEyID0gX21tX3NybGlfZXBpMzIgKGEsMSk7CisgICAgYjIgPSBfbW1fc3JsaV9lcGkzMiAoYiwxKTsKKyAgICByID0gX21tX3N1Yl9lcGkzMiAoYTIsIGIyKTsKKyAgICBiXzEgPSBfbW1fYW5kbm90X3NpMTI4KGEsIGIpOyAvLyFhIGFuZCBiCisgICAgYl8xID0gX21tX3NsbGlfZXBpMzIgKGJfMSwzMSk7CisgICAgYl8xID0gX21tX3NybGlfZXBpMzIgKGJfMSwzMSk7IC8vMCBvciAxLCBsYXN0IGIgYml0CisgICAgcmV0dXJuIF9tbV9zdWJfZXBpMzIocixiXzEpOworfQorCisvLyoqKioqKiogVmVjdG9yIHN1YnRyYWN0IGhpZ2ggaGFsZiAodHJ1bmNhdGVkKSAqKiAqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQ4eDhfdCB2c3ViaG5fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZTVUJITi5JMTYgZDAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdnN1YmhuX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIC8vIFZTVUJITi5JMTYgZDAscTAscTAKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHN1bSwgc3VtODsKKyAgICBzdW0gPSBfbW1fc3ViX2VwaTE2IChhLCBiKTsKKyAgICBzdW04ID0gX21tX3NyYWlfZXBpMTYgKHN1bSwgOCk7CisgICAgc3VtOCA9IF9tbV9wYWNrc19lcGkxNihzdW04LHN1bTgpOworICAgIHJldHVybjY0KHN1bTgpOworfQorCitpbnQxNng0X3QgdnN1YmhuX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWU1VCSE4uSTMyIGQwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2c3ViaG5fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgLy8gVlNVQkhOLkkzMiBkMCxxMCxxMAoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIHN1bSwgc3VtMTY7CisgICAgc3VtID0gX21tX3N1Yl9lcGkzMiAoYSwgYik7CisgICAgc3VtMTYgPSBfbW1fc3JhaV9lcGkzMiAoc3VtLCAxNik7CisgICAgc3VtMTYgPSBfbW1fcGFja3NfZXBpMzIoc3VtMTYsc3VtMTYpOworICAgIHJldHVybjY0KHN1bTE2KTsKK30KKworaW50MzJ4Ml90IHZzdWJobl9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVlNVQkhOLkk2NCBkMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdnN1YmhuX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOGkgc3ViOworICAgIHN1YiA9IF9tbV9zdWJfZXBpNjQgKGEsIGIpOworICAgIHN1YiA9IF9tbV9zaHVmZmxlX2VwaTMyKHN1YiwgIDEgfCAoMyA8PCAyKSB8ICgwIDw8IDQpIHwgKDIgPDwgNikpOworICAgIHJldHVybjY0KHN1Yik7Cit9CisKK3VpbnQ4eDhfdCB2c3ViaG5fdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVlNVQkhOLkkxNiBkMCxxMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnN1YmhuX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYikgLy8gVlNVQkhOLkkxNiBkMCxxMCxxMAoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHN1bSwgc3VtODsKKyAgICBzdW0gPSBfbW1fc3ViX2VwaTE2IChhLCBiKTsKKyAgICBzdW04ID0gX21tX3NybGlfZXBpMTYgKHN1bSwgOCk7CisgICAgc3VtOCA9ICBfbW1fcGFja3VzX2VwaTE2KHN1bTgsc3VtOCk7CisgICAgcmV0dXJuNjQoc3VtOCk7Cit9CisKK3VpbnQxNng0X3QgdnN1YmhuX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZTVUJITi5JMzIgZDAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2c3ViaG5fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSAvLyBWU1VCSE4uSTMyIGQwLHEwLHEwCit7CisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIHN1bSwgc3VtMTY7CisgICAgc3VtID0gX21tX3N1Yl9lcGkzMiAoYSwgYik7CisgICAgc3VtMTYgPSBfbW1fc3JsaV9lcGkzMiAoc3VtLCAxNik7CisgICAgc3VtMTYgPSAgX01NX1BBQ0tVUzFfRVBJMzIoc3VtMTYpOworICAgIHJldHVybjY0KHN1bTE2KTsKK30KKwordWludDMyeDJfdCB2c3ViaG5fdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKTsgLy8gVlNVQkhOLkk2NCBkMCxxMCxxMAorI2RlZmluZSB2c3ViaG5fdTY0IHZzdWJobl9zNjQKKworLy8qKioqKioqKioqKiogVmVjdG9yIHJvdW5kaW5nIHN1YnRyYWN0IGhpZ2ggaGFsZiAqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQ4eDhfdCB2cnN1YmhuX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWUlNVQkhOLkkxNiBkMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2cnN1YmhuX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIC8vIFZSU1VCSE4uSTE2IGQwLHEwLHEwCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBzdWIsIG1hc2sxOworICAgIHN1YiA9IF9tbV9zdWJfZXBpMTYgKGEsIGIpOworICAgIG1hc2sxID0gX21tX3NsbGlfZXBpMTYoc3ViLCA5KTsgLy9zaGlmdCBsZWZ0IHRoZW4gYmFjayByaWdodCB0bworICAgIG1hc2sxID0gX21tX3NybGlfZXBpMTYobWFzazEsIDE1KTsgLy9nZXQgIDctdGggYml0IDEgb3IgemVybworICAgIHN1YiA9IF9tbV9zcmFpX2VwaTE2IChzdWIsIDgpOyAvL2dldCBoaWdoIGhhbGYKKyAgICBzdWIgPSBfbW1fYWRkX2VwaTE2IChzdWIsIG1hc2sxKTsgLy9hY3R1YWwgcm91bmRpbmcKKyAgICBzdWIgPSAgX21tX3BhY2tzX2VwaTE2IChzdWIsIHN1Yik7CisgICAgcmV0dXJuNjQoc3ViKTsKK30KKworaW50MTZ4NF90IHZyc3ViaG5fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZSU1VCSE4uSTMyIGQwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2cnN1YmhuX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIC8vIFZSU1VCSE4uSTMyIGQwLHEwLHEwCit7CisgICAgLy9TSU1EIG1heSBiZSBub3Qgb3B0aW1hbCwgc2VyaWFsIG1heSBiZSBmYXN0ZXIKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSBzdWIsIG1hc2sxOworICAgIHN1YiA9IF9tbV9zdWJfZXBpMzIgKGEsIGIpOworICAgIG1hc2sxID0gX21tX3NsbGlfZXBpMzIoc3ViLCAxNyk7IC8vc2hpZnQgbGVmdCB0aGVuIGJhY2sgcmlnaHQgdG8KKyAgICBtYXNrMSA9IF9tbV9zcmxpX2VwaTMyKG1hc2sxLDMxKTsgLy9nZXQgIDE1LXRoIGJpdCAxIG9yIHplcm8KKyAgICBzdWIgPSBfbW1fc3JhaV9lcGkzMiAoc3ViLCAxNik7IC8vZ2V0IGhpZ2ggaGFsZgorICAgIHN1YiA9IF9tbV9hZGRfZXBpMzIgKHN1YiwgbWFzazEpOyAvL2FjdHVhbCByb3VuZGluZworICAgIHN1YiA9IF9tbV9wYWNrc19lcGkzMiAoc3ViLCBzdWIpOworICAgIHJldHVybjY0KHN1Yik7Cit9CisKK2ludDMyeDJfdCB2cnN1YmhuX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWUlNVQkhOLkk2NCBkMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdnJzdWJobl9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKQoreworICAgIC8vU0lNRCBtYXkgYmUgbm90IG9wdGltYWwsIHNlcmlhbCBtYXkgYmUgZmFzdGVyCisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOGkgc3ViLCBtYXNrMTsKKyAgICBzdWIgPSBfbW1fc3ViX2VwaTY0IChhLCBiKTsKKyAgICBtYXNrMSA9IF9tbV9zbGxpX2VwaTY0KHN1YiwgMzMpOyAvL3NoaWZ0IGxlZnQgdGhlbiBiYWNrIHJpZ2h0IHRvCisgICAgbWFzazEgPSBfbW1fc3JsaV9lcGk2NChtYXNrMSwzMik7IC8vZ2V0ICAzMS10aCBiaXQgMSBvciB6ZXJvCisgICAgc3ViID0gX21tX2FkZF9lcGk2NCAoc3ViLCBtYXNrMSk7IC8vYWN0dWFsIGhpZ2ggaGFsZiByb3VuZGluZworICAgIHN1YiA9IF9tbV9zaHVmZmxlX2VwaTMyKHN1YiwgIDEgfCAoMyA8PCAyKSB8ICgwIDw8IDQpIHwgKDIgPDwgNikpOworICAgIHJldHVybjY0KHN1Yik7Cit9CisKK3VpbnQ4eDhfdCB2cnN1YmhuX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZSU1VCSE4uSTE2IGQwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2cnN1YmhuX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYikgLy8gVlJTVUJITi5JMTYgZDAscTAscTAKK3sKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBzdWIsIG1hc2sxOworICAgIHN1YiA9IF9tbV9zdWJfZXBpMTYgKGEsIGIpOworICAgIG1hc2sxID0gX21tX3NsbGlfZXBpMTYoc3ViLCA5KTsgLy9zaGlmdCBsZWZ0IHRoZW4gYmFjayByaWdodCB0bworICAgIG1hc2sxID0gX21tX3NybGlfZXBpMTYobWFzazEsIDE1KTsgLy9nZXQgIDctdGggYml0IDEgb3IgemVybworICAgIHN1YiA9IF9tbV9zcmFpX2VwaTE2IChzdWIsIDgpOyAvL2dldCBoaWdoIGhhbGYKKyAgICBzdWIgPSBfbW1fYWRkX2VwaTE2IChzdWIsIG1hc2sxKTsgLy9hY3R1YWwgcm91bmRpbmcKKyAgICBzdWIgPSBfbW1fcGFja3VzX2VwaTE2IChzdWIsIHN1Yik7CisgICAgcmV0dXJuNjQoc3ViKTsKK30KKwordWludDE2eDRfdCB2cnN1YmhuX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZSU1VCSE4uSTMyIGQwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdnJzdWJobl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpIC8vIFZSU1VCSE4uSTMyIGQwLHEwLHEwCit7CisgICAgLy9TSU1EIG1heSBiZSBub3Qgb3B0aW1hbCwgc2VyaWFsIG1heSBiZSBmYXN0ZXIKKyAgICB1aW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgc3ViLCBtYXNrMTsKKyAgICBzdWIgPSBfbW1fc3ViX2VwaTMyIChhLCBiKTsKKyAgICBtYXNrMSA9IF9tbV9zbGxpX2VwaTMyKHN1YiwgMTcpOyAvL3NoaWZ0IGxlZnQgdGhlbiBiYWNrIHJpZ2h0IHRvCisgICAgbWFzazEgPSBfbW1fc3JsaV9lcGkzMihtYXNrMSwzMSk7IC8vZ2V0ICAxNS10aCBiaXQgMSBvciB6ZXJvCisgICAgc3ViID0gX21tX3NyYWlfZXBpMzIgKHN1YiwgMTYpOyAvL2dldCBoaWdoIGhhbGYKKyAgICBzdWIgPSBfbW1fYWRkX2VwaTMyIChzdWIsIG1hc2sxKTsgLy9hY3R1YWwgcm91bmRpbmcKKyAgICBzdWIgPSAgX01NX1BBQ0tVUzFfRVBJMzIgKHN1Yik7CisgICAgcmV0dXJuNjQoc3ViKTsKK30KKwordWludDMyeDJfdCB2cnN1YmhuX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYik7IC8vIFZSU1VCSE4uSTY0IGQwLHEwLHEwCisjZGVmaW5lIHZyc3ViaG5fdTY0IHZyc3ViaG5fczY0CisKKy8vKioqKioqKioqKiogVmVjdG9yIHNhdHVyYXRpbmcgZG91YmxpbmcgbXVsdGlwbHkgc3VidHJhY3QgbG9uZyAqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDMyeDRfdCB2cWRtbHNsX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCBjKTsgLy8gVlFETUxTTC5TMTYgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZxZG1sc2xfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpCit7CisgICAgLy9ub3Qgb3B0aW1hbCBTSU1EIHNvdWx1dGlvbiwgc2VyaWFsIG1heSBiZSBmYXN0ZXIKKyAgICBfX20xMjhpIHJlczMyLCBtYXNrOworICAgIGludDMyeDRfdCByZXM7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQzMl90IGNtYXNrW10gPSB7MHg4MDAwMDAwMCwgMHg4MDAwMDAwMCwgMHg4MDAwMDAwMCwgMHg4MDAwMDAwMH07CisgICAgcmVzID0gdm11bGxfczE2KGIsICBjKTsKKyAgICByZXMzMiA9IF9tbV9zbGxpX2VwaTMyIChyZXMsIDEpOyAvL2RvdWJsZSB0aGUgcmVzdWx0LCBzYXR1cmF0aW9uIG5vdCBjb25zaWRlcmVkCisgICAgbWFzayA9IF9tbV9jbXBlcV9lcGkzMiAocmVzMzIsICooX19tMTI4aSopY21hc2spOworICAgIHJlczMyID0gX21tX3hvcl9zaTEyOCAocmVzMzIsICBtYXNrKTsgLy9yZXMzMiBzYXR1cmF0ZWQgZm9yIDB4ODAwMDAwMDAKKyAgICByZXR1cm4gdnFzdWJxX3MzMihhLCByZXMzMik7IC8vc2F0dXJhdGlvbgorfQorCitpbnQ2NHgyX3QgdnFkbWxzbF9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgYyk7IC8vIFZRRE1MU0wuUzMyIHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDJfdCB2cWRtbHNsX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBfX20xMjhpIHJlczY0LCBtYXNrOworICAgIGludDY0eDJfdCByZXM7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ2NF90IGNtYXNrW10gPSB7MHg4MDAwMDAwMDAwMDAwMDAwLCAweDgwMDAwMDAwMDAwMDAwMDB9OworICAgIHJlcyA9IHZtdWxsX3MzMihiLCAgYyk7CisgICAgcmVzNjQgPSBfbW1fc2xsaV9lcGk2NCAocmVzLCAxKTsgLy9kb3VibGUgdGhlIHJlc3VsdCwgc2F0dXJhdGlvbiBub3QgY29uc2lkZXJlZAorICAgIG1hc2sgPSBfTU1fQ01QRVFfRVBJNjQgKHJlczY0LCAqKF9fbTEyOGkqKWNtYXNrKTsKKyAgICByZXM2NCA9IF9tbV94b3Jfc2kxMjggKHJlczY0LCAgbWFzayk7IC8vcmVzMzIgc2F0dXJhdGVkIGZvciAweDgwMDAwMDAwCisgICAgcmV0dXJuIHZxc3VicV9zNjQoYSwgcmVzNjQpOyAvL3NhdHVyYXRpb24KK30KKworLy8qKioqKioqKioqKioqKioqKiogIENPTVBBUklTT04gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKiogVmVjdG9yIGNvbXBhcmUgZXF1YWwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCit1aW50OHg4X3QgdmNlcV9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVkNFUS5JOCBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZjZXFfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fY21wZXFfZXBpOChfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCit1aW50MTZ4NF90IHZjZXFfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZDRVEuSTE2IGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZjZXFfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX2NtcGVxX2VwaTE2KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQzMngyX3QgdmNlcV9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVkNFUS5JMzIgZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdmNlcV9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fY21wZXFfZXBpMzIoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDMyeDJfdCB2Y2VxX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVkNFUS5GMzIgZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZjZXFfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpCit7CisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjggcmVzOworICAgIHJlcyA9IF9tbV9jbXBlcV9wcyhfcE0xMjgoYSksIF9wTTEyOChiKSApOworICAgIHJldHVybjY0ZihyZXMpOworfQorCit1aW50OHg4X3QgdmNlcV91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWQ0VRLkk4IGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZjZXFfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKQoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fY21wZXFfZXBpOChfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCit1aW50MTZ4NF90IHZjZXFfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVkNFUS5JMTYgZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZjZXFfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKQoreworICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX2NtcGVxX2VwaTE2KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQzMngyX3QgdmNlcV91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWQ0VRLkkzMiBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdmNlcV91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpCit7CisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fY21wZXFfZXBpMzIoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDh4OF90ICAgdmNlcV9wOChwb2x5OHg4X3QgYSwgcG9seTh4OF90IGIpOyAvLyBWQ0VRLkk4IGQwLCBkMCwgZDAKKyNkZWZpbmUgdmNlcV9wOCB2Y2VxX3U4CisKKwordWludDh4MTZfdCAgIHZjZXFxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZDRVEuSTggcTAsIHEwLCBxMAorI2RlZmluZSB2Y2VxcV9zOCBfbW1fY21wZXFfZXBpOAorCit1aW50MTZ4OF90ICAgdmNlcXFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZDRVEuSTE2IHEwLCBxMCwgcTAKKyNkZWZpbmUgdmNlcXFfczE2IF9tbV9jbXBlcV9lcGkxNgorCit1aW50MzJ4NF90ICAgdmNlcXFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZDRVEuSTMyIHEwLCBxMCwgcTAKKyNkZWZpbmUgdmNlcXFfczMyIF9tbV9jbXBlcV9lcGkzMgorCit1aW50MzJ4NF90IHZjZXFxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVkNFUS5GMzIgcTAsIHEwLCBxMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZjZXFxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKQoreworICAgIF9fbTEyOCByZXM7CisgICAgcmVzID0gX21tX2NtcGVxX3BzKGEsYik7CisgICAgcmV0dXJuIF9NMTI4aShyZXMpOworfQorCit1aW50OHgxNl90ICAgdmNlcXFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWQ0VRLkk4IHEwLCBxMCwgcTAKKyNkZWZpbmUgdmNlcXFfdTggX21tX2NtcGVxX2VwaTgKKwordWludDE2eDhfdCAgIHZjZXFxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZDRVEuSTE2IHEwLCBxMCwgcTAKKyNkZWZpbmUgdmNlcXFfdTE2IF9tbV9jbXBlcV9lcGkxNgorCit1aW50MzJ4NF90ICAgdmNlcXFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVkNFUS5JMzIgcTAsIHEwLCBxMAorI2RlZmluZSB2Y2VxcV91MzIgX21tX2NtcGVxX2VwaTMyCisKK3VpbnQ4eDE2X3QgICB2Y2VxcV9wOChwb2x5OHgxNl90IGEsIHBvbHk4eDE2X3QgYik7IC8vIFZDRVEuSTggcTAsIHEwLCBxMAorI2RlZmluZSB2Y2VxcV9wOCBfbW1fY21wZXFfZXBpOAorCisvLyoqKioqKioqKioqKioqKioqKlZlY3RvciBjb21wYXJlIGdyZWF0ZXItdGhhbiBvciBlcXVhbCoqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9pbiBJQSBTSU1EIG5vIGdyZWF0ZXItdGhhbi1vci1lcXVhbCBjb21wYXJpc29uIGZvciBpbnRlZ2VycywKKy8vIHRoZXJlIGlzIGdyZWF0ZXItdGhhbiBhdmFpbGFibGUgb25seSwgc28gd2UgbmVlZCB0aGUgZm9sbG93aW5nIHRyaWNrcworCit1aW50OHg4X3QgdmNnZV9zOChpbnQ4eDhfdCBhLCAgaW50OHg4X3QgYik7IC8vIFZDR0UuUzggZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2Y2dlX3M4KGludDh4OF90IGEsICBpbnQ4eDhfdCBiKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KHZjZ2VxX3M4KF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCit1aW50MTZ4NF90IHZjZ2VfczE2KGludDE2eDRfdCBhLCAgaW50MTZ4NF90IGIpOyAvLyBWQ0dFLlMxNiBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2Y2dlX3MxNihpbnQxNng0X3QgYSwgIGludDE2eDRfdCBiKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NCh2Y2dlcV9zMTYoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQzMngyX3QgdmNnZV9zMzIoaW50MzJ4Ml90IGEsICBpbnQzMngyX3QgYik7IC8vIFZDR0UuUzMyIGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZjZ2VfczMyKGludDMyeDJfdCBhLCAgaW50MzJ4Ml90IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KHZjZ2VxX3MzMihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDMyeDJfdCB2Y2dlX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVkNHRS5GMzIgZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZjZ2VfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpCit7CisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjggcmVzOworICAgIHJlcyA9IF9tbV9jbXBnZV9wcyhfcE0xMjgoYSksX3BNMTI4KGIpKTsgLy91c2Ugb25seSAyIGZpcnN0IGVudHJpZXMKKyAgICByZXR1cm42NGYocmVzKTsKK30KKwordWludDh4OF90IHZjZ2VfdTgodWludDh4OF90IGEsICB1aW50OHg4X3QgYik7IC8vIFZDR0UuVTggZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdmNnZV91OCh1aW50OHg4X3QgYSwgIHVpbnQ4eDhfdCBiKQoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NCh2Y2dlcV91OChfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDE2eDRfdCB2Y2dlX3UxNih1aW50MTZ4NF90IGEsICB1aW50MTZ4NF90IGIpOyAvLyBWQ0dFLnMxNiBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdmNnZV91MTYodWludDE2eDRfdCBhLCAgdWludDE2eDRfdCBiKQoreworICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodmNnZXFfdTE2KF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCit1aW50MzJ4Ml90IHZjZ2VfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYik7IC8vIFZDR0UuVTMyIGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2Y2dlX3UzMih1aW50MzJ4Ml90IGEsICB1aW50MzJ4Ml90IGIpCit7CisgICAgLy9zZXJpYWwgc29sdXRpb24gbG9va3MgZmFzdGVyCisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NCh2Y2dlcV91MzIgKF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCisKK3VpbnQ4eDE2X3QgdmNnZXFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVkNHRS5TOCBxMCwgcTAsIHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDE2X3QgdmNnZXFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSAvLyBWQ0dFLlM4IHEwLCBxMCwgcTAKK3sKKyAgICBfX20xMjhpIG0xLCBtMjsKKyAgICBtMSA9IF9tbV9jbXBndF9lcGk4ICggYSwgYik7CisgICAgbTIgPSBfbW1fY21wZXFfZXBpOCAoIGEsIGIpOworICAgIHJldHVybiBfbW1fb3Jfc2kxMjggICggbTEsIG0yKTsKK30KKwordWludDE2eDhfdCB2Y2dlcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVkNHRS5TMTYgcTAsIHEwLCBxMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZjZ2VxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIC8vIFZDR0UuUzE2IHEwLCBxMCwgcTAKK3sKKyAgICBfX20xMjhpIG0xLCBtMjsKKyAgICBtMSA9IF9tbV9jbXBndF9lcGkxNiAoIGEsIGIpOworICAgIG0yID0gX21tX2NtcGVxX2VwaTE2ICggYSwgYik7CisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAgICggbTEsbTIpOworfQorCit1aW50MzJ4NF90IHZjZ2VxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWQ0dFLlMzMiBxMCwgcTAsIHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdmNnZXFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgLy8gVkNHRS5TMzIgcTAsIHEwLCBxMAoreworICAgIF9fbTEyOGkgbTEsIG0yOworICAgIG0xID0gX21tX2NtcGd0X2VwaTMyIChhLCBiKTsKKyAgICBtMiA9IF9tbV9jbXBlcV9lcGkzMiAoYSwgYik7CisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAgIChtMSwgbTIpOworfQorCit1aW50MzJ4NF90IHZjZ2VxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVkNHRS5GMzIgcTAsIHEwLCBxMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZjZ2VxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKQoreworICAgIF9fbTEyOCByZXM7CisgICAgcmVzID0gX21tX2NtcGdlX3BzKGEsYik7IC8vdXNlIG9ubHkgMiBmaXJzdCBlbnRyaWVzCisgICAgcmV0dXJuICooX19tMTI4aSopJnJlczsKK30KKwordWludDh4MTZfdCB2Y2dlcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZDR0UuVTggcTAsIHEwLCBxMAorX05FT04yU1NFX0lOTElORSB1aW50OHgxNl90IHZjZ2VxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKSAvLyBWQ0dFLlU4IHEwLCBxMCwgcTAKK3sKKyAgICAvL25vIHVuc2lnbmVkIGNoYXJzIGNvbXBhcmlzb24sIG9ubHkgc2lnbmVkIGF2YWlsYWJsZSxzbyBuZWVkIHRoZSB0cmljaworICAgICNpZmRlZiBVU0VfU1NFNAorICAgICAgICBfX20xMjhpIGNtcDsKKyAgICAgICAgY21wID0gX21tX21heF9lcHU4KGEsIGIpOworICAgICAgICByZXR1cm4gX21tX2NtcGVxX2VwaTgoY21wLCBhKTsgLy9hPj1iCisgICAgI2Vsc2UKKyAgICAgICAgX19tMTI4aSBjMTI4LCBhcywgYnMsIG0xLCBtMjsKKyAgICAgICAgYzEyOCA9IF9tbV9zZXQxX2VwaTggKDEyOCk7CisgICAgICAgIGFzID0gX21tX3N1Yl9lcGk4KCBhLCBjMTI4KTsKKyAgICAgICAgYnMgPSBfbW1fc3ViX2VwaTgoIGIsIGMxMjgpOworICAgICAgICBtMSA9IF9tbV9jbXBndF9lcGk4KCBhcywgYnMpOworICAgICAgICBtMiA9IF9tbV9jbXBlcV9lcGk4IChhcywgYnMpOworICAgICAgICByZXR1cm4gX21tX29yX3NpMTI4ICggbTEsICBtMik7CisgICAgI2VuZGlmCit9CisKK3VpbnQxNng4X3QgdmNnZXFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkNHRS5zMTYgcTAsIHEwLCBxMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZjZ2VxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYikgLy8gVkNHRS5zMTYgcTAsIHEwLCBxMAoreworICAgIC8vbm8gdW5zaWduZWQgc2hvcnRzIGNvbXBhcmlzb24sIG9ubHkgc2lnbmVkIGF2YWlsYWJsZSxzbyBuZWVkIHRoZSB0cmljaworICAgICNpZmRlZiBVU0VfU1NFNAorICAgICAgICBfX20xMjhpIGNtcDsKKyAgICAgICAgY21wID0gX21tX21heF9lcHUxNihhLCBiKTsKKyAgICAgICAgcmV0dXJuIF9tbV9jbXBlcV9lcGkxNihjbXAsIGEpOyAvL2E+PWIKKyAgICAjZWxzZQorICAgICAgICBfX20xMjhpIGM4MDAwLCBhcywgYnMsIG0xLCBtMjsKKyAgICAgICAgYzgwMDAgPSBfbW1fc2V0MV9lcGkxNiAoMHg4MDAwKTsKKyAgICAgICAgYXMgPSBfbW1fc3ViX2VwaTE2KGEsYzgwMDApOworICAgICAgICBicyA9IF9tbV9zdWJfZXBpMTYoYixjODAwMCk7CisgICAgICAgIG0xID0gX21tX2NtcGd0X2VwaTE2KGFzLCBicyk7CisgICAgICAgIG0yID0gX21tX2NtcGVxX2VwaTE2IChhcywgYnMpOworICAgICAgICByZXR1cm4gX21tX29yX3NpMTI4ICggbTEsIG0yKTsKKyAgICAjZW5kaWYKK30KKwordWludDMyeDRfdCB2Y2dlcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWQ0dFLlUzMiBxMCwgcTAsIHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdmNnZXFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSAvLyBWQ0dFLlUzMiBxMCwgcTAsIHEwCit7CisgICAgLy9ubyB1bnNpZ25lZCBpbnRzIGNvbXBhcmlzb24sIG9ubHkgc2lnbmVkIGF2YWlsYWJsZSxzbyBuZWVkIHRoZSB0cmljaworICAgICNpZmRlZiBVU0VfU1NFNAorICAgICAgICBfX20xMjhpIGNtcDsKKyAgICAgICAgY21wID0gX21tX21heF9lcHUzMihhLCBiKTsKKyAgICAgICAgcmV0dXJuIF9tbV9jbXBlcV9lcGkzMihjbXAsIGEpOyAvL2E+PWIKKyAgICAjZWxzZQorICAgICAgICAvL3NlcmlhbCBzb2x1dGlvbiBtYXkgYmUgZmFzdGVyCisgICAgICAgIF9fbTEyOGkgYzgwMDAwMDAwLCBhcywgYnMsIG0xLCBtMjsKKyAgICAgICAgYzgwMDAwMDAwID0gX21tX3NldDFfZXBpMzIgKDB4ODAwMDAwMDApOworICAgICAgICBhcyA9IF9tbV9zdWJfZXBpMzIoYSxjODAwMDAwMDApOworICAgICAgICBicyA9IF9tbV9zdWJfZXBpMzIoYixjODAwMDAwMDApOworICAgICAgICBtMSA9IF9tbV9jbXBndF9lcGkzMiAoYXMsIGJzKTsKKyAgICAgICAgbTIgPSBfbW1fY21wZXFfZXBpMzIgKGFzLCBicyk7CisgICAgICAgIHJldHVybiBfbW1fb3Jfc2kxMjggKCBtMSwgIG0yKTsKKyAgICAjZW5kaWYKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqVmVjdG9yIGNvbXBhcmUgbGVzcy10aGFuIG9yIGVxdWFsKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9pbiBJQSBTSU1EIG5vIGxlc3MtdGhhbi1vci1lcXVhbCBjb21wYXJpc29uIGZvciBpbnRlZ2VycyBwcmVzZW50LCBzbyB3ZSBuZWVkIHRoZSB0cmlja3MKKwordWludDh4OF90IHZjbGVfczgoaW50OHg4X3QgYSwgIGludDh4OF90IGIpOyAvLyBWQ0dFLlM4IGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdmNsZV9zOChpbnQ4eDhfdCBhLCAgaW50OHg4X3QgYikKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NCh2Y2xlcV9zOChfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDE2eDRfdCB2Y2xlX3MxNihpbnQxNng0X3QgYSwgIGludDE2eDRfdCBiKTsgLy8gVkNHRS5TMTYgZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdmNsZV9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYikKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodmNsZXFfczE2KF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCit1aW50MzJ4Ml90IHZjbGVfczMyKGludDMyeDJfdCBhLCAgaW50MzJ4Ml90IGIpOyAvLyBWQ0dFLlMzMiBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2Y2xlX3MzMihpbnQzMngyX3QgYSwgIGludDMyeDJfdCBiKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NCh2Y2xlcV9zMzIoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQzMngyX3QgdmNsZV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZDR0UuRjMyIGQwLCBkMCwgZDA/CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdmNsZV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikKK3sKKyAgICB1aW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOCByZXM7CisgICAgcmVzID0gX21tX2NtcGxlX3BzKF9wTTEyOChhKSxfcE0xMjgoYikpOworICAgIHJldHVybjY0ZihyZXMpOworfQorCit1aW50OHg4X3QgdmNsZV91OCh1aW50OHg4X3QgYSwgIHVpbnQ4eDhfdCBiKTsgLy8gVkNHRS5VOCBkMCwgZDAsIGQwCisjZGVmaW5lIHZjbGVfdTgoYSxiKSB2Y2dlX3U4KGIsYSkKKworCit1aW50MTZ4NF90IHZjbGVfdTE2KHVpbnQxNng0X3QgYSwgIHVpbnQxNng0X3QgYik7IC8vIFZDR0UuczE2IGQwLCBkMCwgZDAKKyNkZWZpbmUgdmNsZV91MTYoYSxiKSB2Y2dlX3UxNihiLGEpCisKKwordWludDMyeDJfdCB2Y2xlX3UzMih1aW50MzJ4Ml90IGEsICB1aW50MzJ4Ml90IGIpOyAvLyBWQ0dFLlUzMiBkMCwgZDAsIGQwCisjZGVmaW5lIHZjbGVfdTMyKGEsYikgdmNnZV91MzIoYixhKQorCit1aW50OHgxNl90IHZjbGVxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZDR0UuUzggcTAsIHEwLCBxMAorX05FT04yU1NFX0lOTElORSB1aW50OHgxNl90IHZjbGVxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgLy8gVkNHRS5TOCBxMCwgcTAsIHEwCit7CisgICAgX19tMTI4aSBjMSwgcmVzOworICAgIGMxID0gX21tX2NtcGVxX2VwaTggKGEsYSk7IC8vYWxsIG9uZXMgMHhmZi4uLi4KKyAgICByZXMgPSBfbW1fY21wZ3RfZXBpOCAoIGEsICBiKTsKKyAgICByZXR1cm4gX21tX2FuZG5vdF9zaTEyOCAocmVzLCBjMSk7IC8vaW52ZXJzZSB0aGUgY21wZ3QgcmVzdWx0LCBnZXQgbGVzcy10aGFuLW9yLWVxdWFsCit9CisKK3VpbnQxNng4X3QgdmNsZXFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZDR0UuUzE2IHEwLCBxMCwgcTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDhfdCB2Y2xlcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSAvLyBWQ0dFLlMxNiBxMCwgcTAsIHEwCit7CisgICAgX19tMTI4aSBjMSwgcmVzOworICAgIGMxID0gX21tX2NtcGVxX2VwaTE2IChhLGEpOyAvL2FsbCBvbmVzIDB4ZmYuLi4uCisgICAgcmVzID0gX21tX2NtcGd0X2VwaTE2ICggYSwgIGIpOworICAgIHJldHVybiBfbW1fYW5kbm90X3NpMTI4IChyZXMsIGMxKTsKK30KKwordWludDMyeDRfdCB2Y2xlcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVkNHRS5TMzIgcTAsIHEwLCBxMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZjbGVxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIC8vIFZDR0UuUzMyIHEwLCBxMCwgcTAKK3sKKyAgICBfX20xMjhpIGMxLCByZXM7CisgICAgYzEgPSBfbW1fY21wZXFfZXBpMzIgKGEsYSk7IC8vYWxsIG9uZXMgMHhmZi4uLi4KKyAgICByZXMgPSBfbW1fY21wZ3RfZXBpMzIgKCBhLCAgYik7CisgICAgcmV0dXJuIF9tbV9hbmRub3Rfc2kxMjggKHJlcywgYzEpOworfQorCit1aW50MzJ4NF90IHZjbGVxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVkNHRS5GMzIgcTAsIHEwLCBxMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZjbGVxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKQoreworICAgIF9fbTEyOCByZXM7CisgICAgcmVzID0gX21tX2NtcGxlX3BzKGEsYik7CisgICAgcmV0dXJuICooX19tMTI4aSopJnJlczsKK30KKwordWludDh4MTZfdCB2Y2xlcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZDR0UuVTggcTAsIHEwLCBxMAorI2lmZGVmIFVTRV9TU0U0CisgICAgX05FT04yU1NFX0lOTElORSB1aW50OHgxNl90IHZjbGVxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKSAvLyBWQ0dFLlU4IHEwLCBxMCwgcTAKKyAgICB7CisgICAgICAgIC8vbm8gdW5zaWduZWQgY2hhcnMgY29tcGFyaXNvbiBpbiBTU0UsIG9ubHkgc2lnbmVkIGF2YWlsYWJsZSxzbyBuZWVkIHRoZSB0cmljaworICAgICAgICBfX20xMjhpIGNtcDsKKyAgICAgICAgY21wID0gX21tX21pbl9lcHU4KGEsIGIpOworICAgICAgICByZXR1cm4gX21tX2NtcGVxX2VwaTgoY21wLCBhKTsgLy9hPD1iCisgICAgfQorI2Vsc2UKKyAgICAjZGVmaW5lIHZjbGVxX3U4KGEsYikgdmNnZXFfdTgoYixhKQorI2VuZGlmCisKKwordWludDE2eDhfdCB2Y2xlcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWQ0dFLnMxNiBxMCwgcTAsIHEwCisjaWZkZWYgVVNFX1NTRTQKKyAgICBfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3QgdmNsZXFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKSAvLyBWQ0dFLnMxNiBxMCwgcTAsIHEwCisgICAgeworICAgICAgICAvL25vIHVuc2lnbmVkIHNob3J0cyBjb21wYXJpc29uIGluIFNTRSwgb25seSBzaWduZWQgYXZhaWxhYmxlLHNvIG5lZWQgdGhlIHRyaWNrCisgICAgICAgIF9fbTEyOGkgY21wOworICAgICAgICBjbXAgPSBfbW1fbWluX2VwdTE2KGEsIGIpOworICAgICAgICByZXR1cm4gX21tX2NtcGVxX2VwaTE2KGNtcCwgYSk7IC8vYTw9YgorICAgIH0KKyNlbHNlCisgICAgI2RlZmluZSB2Y2xlcV91MTYoYSxiKSB2Y2dlcV91MTYoYixhKQorI2VuZGlmCisKKwordWludDMyeDRfdCB2Y2xlcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWQ0dFLlUzMiBxMCwgcTAsIHEwCisjaWZkZWYgVVNFX1NTRTQKKyAgICBfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdmNsZXFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSAvLyBWQ0dFLlUzMiBxMCwgcTAsIHEwCisgICAgeworICAgICAgICAvL25vIHVuc2lnbmVkIGNoYXJzIGNvbXBhcmlzb24gaW4gU1NFLCBvbmx5IHNpZ25lZCBhdmFpbGFibGUsc28gbmVlZCB0aGUgdHJpY2sKKyAgICAgICAgX19tMTI4aSBjbXA7CisgICAgICAgIGNtcCA9IF9tbV9taW5fZXB1MzIoYSwgYik7CisgICAgICAgIHJldHVybiBfbW1fY21wZXFfZXBpMzIoY21wLCBhKTsgLy9hPD1iCisgICAgfQorI2Vsc2UKKy8vc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggdGhlIHNlcmlhbCBvbmUKKyAgICAjZGVmaW5lIHZjbGVxX3UzMihhLGIpIHZjZ2VxX3UzMihiLGEpCisjZW5kaWYKKworCisvLyoqKioqKiBWZWN0b3IgY29tcGFyZSBncmVhdGVyLXRoYW4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCit1aW50OHg4X3QgdmNndF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVkNHVC5TOCBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZjZ3RfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fY21wZ3RfZXBpOChfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCit1aW50MTZ4NF90IHZjZ3RfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZDR1QuUzE2IGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZjZ3RfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX2NtcGd0X2VwaTE2KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQzMngyX3QgdmNndF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVkNHVC5TMzIgZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdmNndF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fY21wZ3RfZXBpMzIoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDMyeDJfdCB2Y2d0X2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVkNHVC5GMzIgZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZjZ3RfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpCit7CisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjggcmVzOworICAgIHJlcyA9IF9tbV9jbXBndF9wcyhfcE0xMjgoYSksX3BNMTI4KGIpKTsgLy91c2Ugb25seSAyIGZpcnN0IGVudHJpZXMKKyAgICByZXR1cm42NGYocmVzKTsKK30KKwordWludDh4OF90IHZjZ3RfdTgodWludDh4OF90IGEsICB1aW50OHg4X3QgYik7IC8vIFZDR1QuVTggZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdmNndF91OCh1aW50OHg4X3QgYSwgIHVpbnQ4eDhfdCBiKQoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NCh2Y2d0cV91OChfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDE2eDRfdCB2Y2d0X3UxNih1aW50MTZ4NF90IGEsICB1aW50MTZ4NF90IGIpOyAvLyBWQ0dULnMxNiBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdmNndF91MTYodWludDE2eDRfdCBhLCAgdWludDE2eDRfdCBiKQoreworICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodmNndHFfdTE2KF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCit1aW50MzJ4Ml90IHZjZ3RfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYik7IC8vIFZDR1QuVTMyIGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2Y2d0X3UzMih1aW50MzJ4Ml90IGEsICB1aW50MzJ4Ml90IGIpCit7CisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NCh2Y2d0cV91MzIoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQ4eDE2X3QgICB2Y2d0cV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWQ0dULlM4IHEwLCBxMCwgcTAKKyNkZWZpbmUgdmNndHFfczggX21tX2NtcGd0X2VwaTgKKwordWludDE2eDhfdCAgIHZjZ3RxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWQ0dULlMxNiBxMCwgcTAsIHEwCisjZGVmaW5lIHZjZ3RxX3MxNiBfbW1fY21wZ3RfZXBpMTYKKwordWludDMyeDRfdCAgIHZjZ3RxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWQ0dULlMzMiBxMCwgcTAsIHEwCisjZGVmaW5lIHZjZ3RxX3MzMiBfbW1fY21wZ3RfZXBpMzIKKwordWludDMyeDRfdCB2Y2d0cV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZDR1QuRjMyIHEwLCBxMCwgcTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2Y2d0cV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYikKK3sKKyAgICBfX20xMjggcmVzOworICAgIHJlcyA9IF9tbV9jbXBndF9wcyhhLGIpOyAvL3VzZSBvbmx5IDIgZmlyc3QgZW50cmllcworICAgIHJldHVybiAqKF9fbTEyOGkqKSZyZXM7Cit9CisKK3VpbnQ4eDE2X3QgdmNndHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWQ0dULlU4IHEwLCBxMCwgcTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZfdCB2Y2d0cV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgLy8gVkNHVC5VOCBxMCwgcTAsIHEwCit7CisgICAgLy9ubyB1bnNpZ25lZCBjaGFycyBjb21wYXJpc29uLCBvbmx5IHNpZ25lZCBhdmFpbGFibGUsc28gbmVlZCB0aGUgdHJpY2sKKyAgICBfX20xMjhpIGMxMjgsIGFzLCBiczsKKyAgICBjMTI4ID0gX21tX3NldDFfZXBpOCAoMTI4KTsKKyAgICBhcyA9IF9tbV9zdWJfZXBpOChhLGMxMjgpOworICAgIGJzID0gX21tX3N1Yl9lcGk4KGIsYzEyOCk7CisgICAgcmV0dXJuIF9tbV9jbXBndF9lcGk4IChhcywgYnMpOworfQorCit1aW50MTZ4OF90IHZjZ3RxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZDR1QuczE2IHEwLCBxMCwgcTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDhfdCB2Y2d0cV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIC8vIFZDR1QuczE2IHEwLCBxMCwgcTAKK3sKKyAgICAvL25vIHVuc2lnbmVkIHNob3J0IGNvbXBhcmlzb24sIG9ubHkgc2lnbmVkIGF2YWlsYWJsZSxzbyBuZWVkIHRoZSB0cmljaworICAgIF9fbTEyOGkgYzgwMDAsIGFzLCBiczsKKyAgICBjODAwMCA9IF9tbV9zZXQxX2VwaTE2ICgweDgwMDApOworICAgIGFzID0gX21tX3N1Yl9lcGkxNihhLGM4MDAwKTsKKyAgICBicyA9IF9tbV9zdWJfZXBpMTYoYixjODAwMCk7CisgICAgcmV0dXJuIF9tbV9jbXBndF9lcGkxNiAoIGFzLCBicyk7Cit9CisKK3VpbnQzMng0X3QgdmNndHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVkNHVC5VMzIgcTAsIHEwLCBxMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZjZ3RxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYikgLy8gVkNHVC5VMzIgcTAsIHEwLCBxMAoreworICAgIC8vbm8gdW5zaWduZWQgaW50IGNvbXBhcmlzb24sIG9ubHkgc2lnbmVkIGF2YWlsYWJsZSxzbyBuZWVkIHRoZSB0cmljaworICAgIF9fbTEyOGkgYzgwMDAwMDAwLCBhcywgYnM7CisgICAgYzgwMDAwMDAwID0gX21tX3NldDFfZXBpMzIgKDB4ODAwMDAwMDApOworICAgIGFzID0gX21tX3N1Yl9lcGkzMihhLGM4MDAwMDAwMCk7CisgICAgYnMgPSBfbW1fc3ViX2VwaTMyKGIsYzgwMDAwMDAwKTsKKyAgICByZXR1cm4gX21tX2NtcGd0X2VwaTMyICggYXMsIGJzKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKiogVmVjdG9yIGNvbXBhcmUgbGVzcy10aGFuICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3VpbnQ4eDhfdCAgIHZjbHRfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZDR1QuUzggZDAsIGQwLCBkMAorI2RlZmluZSB2Y2x0X3M4KGEsYikgdmNndF9zOChiLGEpIC8vc3dhcCB0aGUgYXJndW1lbnRzISEKKworCit1aW50MTZ4NF90ICAgdmNsdF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkNHVC5TMTYgZDAsIGQwLCBkMAorI2RlZmluZSB2Y2x0X3MxNihhLGIpIHZjZ3RfczE2KGIsYSkgLy9zd2FwIHRoZSBhcmd1bWVudHMhIQorCisKK3VpbnQzMngyX3QgICB2Y2x0X3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWQ0dULlMzMiBkMCwgZDAsIGQwCisjZGVmaW5lIHZjbHRfczMyKGEsYikgIHZjZ3RfczMyKGIsYSkgLy9zd2FwIHRoZSBhcmd1bWVudHMhIQorCisKK3VpbnQzMngyX3QgdmNsdF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZDR1QuRjMyIGQwLCBkMCwgZDAKKyNkZWZpbmUgdmNsdF9mMzIoYSxiKSB2Y2d0X2YzMihiLCBhKSAvL3N3YXAgdGhlIGFyZ3VtZW50cyEhCisKK3VpbnQ4eDhfdCB2Y2x0X3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZDR1QuVTggZDAsIGQwLCBkMAorI2RlZmluZSB2Y2x0X3U4KGEsYikgdmNndF91OChiLGEpIC8vc3dhcCB0aGUgYXJndW1lbnRzISEKKwordWludDE2eDRfdCB2Y2x0X3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZDR1QuczE2IGQwLCBkMCwgZDAKKyNkZWZpbmUgdmNsdF91MTYoYSxiKSB2Y2d0X3UxNihiLGEpIC8vc3dhcCB0aGUgYXJndW1lbnRzISEKKwordWludDMyeDJfdCB2Y2x0X3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZDR1QuVTMyIGQwLCBkMCwgZDAKKyNkZWZpbmUgdmNsdF91MzIoYSxiKSB2Y2d0X3UzMihiLGEpIC8vc3dhcCB0aGUgYXJndW1lbnRzISEKKwordWludDh4MTZfdCAgIHZjbHRxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZDR1QuUzggcTAsIHEwLCBxMAorI2RlZmluZSB2Y2x0cV9zOChhLGIpIHZjZ3RxX3M4KGIsIGEpIC8vc3dhcCB0aGUgYXJndW1lbnRzISEKKwordWludDE2eDhfdCAgIHZjbHRxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWQ0dULlMxNiBxMCwgcTAsIHEwCisjZGVmaW5lIHZjbHRxX3MxNihhLGIpIHZjZ3RxX3MxNihiLCBhKSAvL3N3YXAgdGhlIGFyZ3VtZW50cyEhCisKK3VpbnQzMng0X3QgICB2Y2x0cV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVkNHVC5TMzIgcTAsIHEwLCBxMAorI2RlZmluZSB2Y2x0cV9zMzIoYSxiKSB2Y2d0cV9zMzIoYiwgYSkgLy9zd2FwIHRoZSBhcmd1bWVudHMhIQorCit1aW50MzJ4NF90IHZjbHRxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVkNHVC5GMzIgcTAsIHEwLCBxMAorI2RlZmluZSB2Y2x0cV9mMzIoYSxiKSB2Y2d0cV9mMzIoYiwgYSkgLy9zd2FwIHRoZSBhcmd1bWVudHMhIQorCit1aW50OHgxNl90IHZjbHRxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVkNHVC5VOCBxMCwgcTAsIHEwCisjZGVmaW5lIHZjbHRxX3U4KGEsYikgdmNndHFfdTgoYiwgYSkgLy9zd2FwIHRoZSBhcmd1bWVudHMhIQorCit1aW50MTZ4OF90IHZjbHRxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZDR1QuczE2IHEwLCBxMCwgcTAKKyNkZWZpbmUgdmNsdHFfdTE2KGEsYikgdmNndHFfdTE2KGIsIGEpIC8vc3dhcCB0aGUgYXJndW1lbnRzISEKKwordWludDMyeDRfdCB2Y2x0cV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWQ0dULlUzMiBxMCwgcTAsIHEwCisjZGVmaW5lIHZjbHRxX3UzMihhLGIpIHZjZ3RxX3UzMihiLCBhKSAvL3N3YXAgdGhlIGFyZ3VtZW50cyEhCisKKy8vKioqKioqKioqKioqKioqKipWZWN0b3IgY29tcGFyZSBhYnNvbHV0ZSBncmVhdGVyLXRoYW4gb3IgZXF1YWwgKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgordWludDMyeDJfdCB2Y2FnZV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZBQ0dFLkYzMiBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdmNhZ2VfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpCit7CisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIGM3ZmZmZmZmZjsKKyAgICBfX20xMjggYTAsIGIwOworICAgIGM3ZmZmZmZmZiA9IF9tbV9zZXQxX2VwaTMyICgweDdmZmZmZmZmKTsKKyAgICBhMCA9IF9tbV9hbmRfcHMgKF9wTTEyOChhKSwgKihfX20xMjgqKSZjN2ZmZmZmZmYpOworICAgIGIwID0gX21tX2FuZF9wcyAoX3BNMTI4KGIpLCAqKF9fbTEyOCopJmM3ZmZmZmZmZik7CisgICAgYTAgPSBfbW1fY21wZ2VfcHMgKCBhMCwgYjApOworICAgIHJldHVybjY0ZihhMCk7Cit9CisKK3VpbnQzMng0X3QgdmNhZ2VxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVkFDR0UuRjMyIHEwLCBxMCwgcTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2Y2FnZXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpIC8vIFZBQ0dFLkYzMiBxMCwgcTAsIHEwCit7CisgICAgX19tMTI4aSBjN2ZmZmZmZmY7CisgICAgX19tMTI4IGEwLCBiMDsKKyAgICBjN2ZmZmZmZmYgPSBfbW1fc2V0MV9lcGkzMiAoMHg3ZmZmZmZmZik7CisgICAgYTAgPSBfbW1fYW5kX3BzIChhLCAqKF9fbTEyOCopJmM3ZmZmZmZmZik7CisgICAgYjAgPSBfbW1fYW5kX3BzIChiLCAqKF9fbTEyOCopJmM3ZmZmZmZmZik7CisgICAgYTAgPSBfbW1fY21wZ2VfcHMgKCBhMCwgYjApOworICAgIHJldHVybiAoKihfX20xMjhpKikmYTApOworfQorCisvLyoqKioqKioqVmVjdG9yIGNvbXBhcmUgYWJzb2x1dGUgbGVzcy10aGFuIG9yIGVxdWFsICoqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgordWludDMyeDJfdCB2Y2FsZV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZBQ0dFLkYzMiBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdmNhbGVfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpCit7CisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIGM3ZmZmZmZmZjsKKyAgICBfX20xMjggYTAsIGIwOworICAgIGM3ZmZmZmZmZiA9IF9tbV9zZXQxX2VwaTMyICgweDdmZmZmZmZmKTsKKyAgICBhMCA9IF9tbV9hbmRfcHMgKF9wTTEyOChhKSwgKihfX20xMjgqKSZjN2ZmZmZmZmYpOworICAgIGIwID0gX21tX2FuZF9wcyAoX3BNMTI4KGIpLCAqKF9fbTEyOCopJmM3ZmZmZmZmZik7CisgICAgYTAgPSBfbW1fY21wbGVfcHMgKGEwLCBiMCk7CisgICAgcmV0dXJuNjRmKGEwKTsKK30KKwordWludDMyeDRfdCB2Y2FsZXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWQUNHRS5GMzIgcTAsIHEwLCBxMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZjYWxlcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYikgLy8gVkFDR0UuRjMyIHEwLCBxMCwgcTAKK3sKKyAgICBfX20xMjhpIGM3ZmZmZmZmZjsKKyAgICBfX20xMjggYTAsIGIwOworICAgIGM3ZmZmZmZmZiA9IF9tbV9zZXQxX2VwaTMyICgweDdmZmZmZmZmKTsKKyAgICBhMCA9IF9tbV9hbmRfcHMgKGEsICooX19tMTI4KikmYzdmZmZmZmZmKTsKKyAgICBiMCA9IF9tbV9hbmRfcHMgKGIsICooX19tMTI4KikmYzdmZmZmZmZmKTsKKyAgICBhMCA9IF9tbV9jbXBsZV9wcyAoYTAsIGIwKTsKKyAgICByZXR1cm4gKCooX19tMTI4aSopJmEwKTsKK30KKworLy8qKioqKioqKiAgVmVjdG9yIGNvbXBhcmUgYWJzb2x1dGUgZ3JlYXRlci10aGFuICAgICoqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3VpbnQzMngyX3QgdmNhZ3RfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWQUNHVC5GMzIgZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZjYWd0X2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKQoreworICAgIHVpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSBjN2ZmZmZmZmY7CisgICAgX19tMTI4IGEwLCBiMDsKKyAgICBjN2ZmZmZmZmYgPSBfbW1fc2V0MV9lcGkzMiAoMHg3ZmZmZmZmZik7CisgICAgYTAgPSBfbW1fYW5kX3BzIChfcE0xMjgoYSksICooX19tMTI4KikmYzdmZmZmZmZmKTsKKyAgICBiMCA9IF9tbV9hbmRfcHMgKF9wTTEyOChiKSwgKihfX20xMjgqKSZjN2ZmZmZmZmYpOworICAgIGEwID0gX21tX2NtcGd0X3BzIChhMCwgYjApOworICAgIHJldHVybjY0ZihhMCk7Cit9CisKK3VpbnQzMng0X3QgdmNhZ3RxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVkFDR1QuRjMyIHEwLCBxMCwgcTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2Y2FndHFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpIC8vIFZBQ0dULkYzMiBxMCwgcTAsIHEwCit7CisgICAgX19tMTI4aSBjN2ZmZmZmZmY7CisgICAgX19tMTI4IGEwLCBiMDsKKyAgICBjN2ZmZmZmZmYgPSBfbW1fc2V0MV9lcGkzMiAoMHg3ZmZmZmZmZik7CisgICAgYTAgPSBfbW1fYW5kX3BzIChhLCAqKF9fbTEyOCopJmM3ZmZmZmZmZik7CisgICAgYjAgPSBfbW1fYW5kX3BzIChiLCAqKF9fbTEyOCopJmM3ZmZmZmZmZik7CisgICAgYTAgPSBfbW1fY21wZ3RfcHMgKGEwLCBiMCk7CisgICAgcmV0dXJuICgqKF9fbTEyOGkqKSZhMCk7Cit9CisKKy8vKioqKioqKioqKioqKioqVmVjdG9yIGNvbXBhcmUgYWJzb2x1dGUgbGVzcy10aGFuICAqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCit1aW50MzJ4Ml90IHZjYWx0X2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVkFDR1QuRjMyIGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2Y2FsdF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikKK3sKKyAgICB1aW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOGkgYzdmZmZmZmZmOworICAgIF9fbTEyOCBhMCwgYjA7CisgICAgYzdmZmZmZmZmID0gX21tX3NldDFfZXBpMzIgKDB4N2ZmZmZmZmYpOworICAgIGEwID0gX21tX2FuZF9wcyAoX3BNMTI4KGEpLCAqKF9fbTEyOCopJmM3ZmZmZmZmZik7CisgICAgYjAgPSBfbW1fYW5kX3BzIChfcE0xMjgoYiksICooX19tMTI4KikmYzdmZmZmZmZmKTsKKyAgICBhMCA9IF9tbV9jbXBsdF9wcyAoYTAsIGIwKTsKKyAgICByZXR1cm42NGYoYTApOworfQorCit1aW50MzJ4NF90IHZjYWx0cV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZBQ0dULkYzMiBxMCwgcTAsIHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdmNhbHRxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKSAvLyBWQUNHVC5GMzIgcTAsIHEwLCBxMAoreworICAgIF9fbTEyOGkgYzdmZmZmZmZmOworICAgIF9fbTEyOCBhMCwgYjA7CisgICAgYzdmZmZmZmZmID0gX21tX3NldDFfZXBpMzIgKDB4N2ZmZmZmZmYpOworICAgIGEwID0gX21tX2FuZF9wcyAoYSwgKihfX20xMjgqKSZjN2ZmZmZmZmYpOworICAgIGIwID0gX21tX2FuZF9wcyAoYiwgKihfX20xMjgqKSZjN2ZmZmZmZmYpOworICAgIGEwID0gX21tX2NtcGx0X3BzIChhMCwgYjApOworICAgIHJldHVybiAoKihfX20xMjhpKikmYTApOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKipWZWN0b3IgdGVzdCBiaXRzKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKlZUU1QgKFZlY3RvciBUZXN0IEJpdHMpIHRha2VzIGVhY2ggZWxlbWVudCBpbiBhIHZlY3RvciwgYW5kIGJpdHdpc2UgbG9naWNhbCBBTkRzIHRoZW0KK3dpdGggdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiBhIHNlY29uZCB2ZWN0b3IuIElmIHRoZSByZXN1bHQgaXMgbm90IHplcm8sIHRoZQorY29ycmVzcG9uZGluZyBlbGVtZW50IGluIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IgaXMgc2V0IHRvIGFsbCBvbmVzLiBPdGhlcndpc2UsIGl0IGlzIHNldCB0bworYWxsIHplcm9zLiAqLworCit1aW50OHg4X3QgdnRzdF9zOChpbnQ4eDhfdCBhLCAgaW50OHg4X3QgYik7IC8vIFZUU1QuOCBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2dHN0X3M4KGludDh4OF90IGEsICBpbnQ4eDhfdCBiKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KHZ0c3RxX3M4KF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCit1aW50MTZ4NF90IHZ0c3RfczE2KGludDE2eDRfdCBhLCAgaW50MTZ4NF90IGIpOyAvLyBWVFNULjE2IGQwLCBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2dHN0X3MxNihpbnQxNng0X3QgYSwgIGludDE2eDRfdCBiKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NCh2dHN0cV9zMTYoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQzMngyX3QgdnRzdF9zMzIoaW50MzJ4Ml90IGEsICBpbnQzMngyX3QgYik7IC8vIFZUU1QuMzIgZDAsIGQwLCBkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZ0c3RfczMyKGludDMyeDJfdCBhLCAgaW50MzJ4Ml90IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KHZ0c3RxX3MzMihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDh4OF90IHZ0c3RfdTgodWludDh4OF90IGEsICB1aW50OHg4X3QgYik7IC8vIFZUU1QuOCBkMCwgZDAsIGQwCisjZGVmaW5lIHZ0c3RfdTggdnRzdF9zOAorCit1aW50MTZ4NF90IHZ0c3RfdTE2KHVpbnQxNng0X3QgYSwgIHVpbnQxNng0X3QgYik7IC8vIFZUU1QuMTYgZDAsIGQwLCBkMAorI2RlZmluZSB2dHN0X3UxNiB2dHN0X3MxNgorCit1aW50MzJ4Ml90IHZ0c3RfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYik7IC8vIFZUU1QuMzIgZDAsIGQwLCBkMAorI2RlZmluZSB2dHN0X3UzMiB2dHN0X3MzMgorCisKK3VpbnQ4eDhfdCB2dHN0X3A4KHBvbHk4eDhfdCBhLCBwb2x5OHg4X3QgYik7IC8vIFZUU1QuOCBkMCwgZDAsIGQwCisjZGVmaW5lIHZ0c3RfcDggdnRzdF91OAorCit1aW50OHgxNl90IHZ0c3RxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZUU1QuOCBxMCwgcTAsIHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDE2X3QgdnRzdHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSAvLyBWVFNULjggcTAsIHEwLCBxMAoreworICAgIF9fbTEyOGkgemVybywgb25lLCByZXM7CisgICAgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4ICgpOworICAgIG9uZSA9IF9tbV9jbXBlcV9lcGk4KHplcm8semVybyk7IC8vMHhmZmYuLmZmZmYKKyAgICByZXMgPSBfbW1fYW5kX3NpMTI4IChhLCBiKTsKKyAgICByZXMgPSAgX21tX2NtcGVxX2VwaTggKHJlcywgemVybyk7CisgICAgcmV0dXJuIF9tbV94b3Jfc2kxMjgocmVzLCBvbmUpOyAvL2ludmVydCByZXN1bHQKK30KKwordWludDE2eDhfdCB2dHN0cV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlRTVC4xNiBxMCwgcTAsIHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3QgdnRzdHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgLy8gVlRTVC4xNiBxMCwgcTAsIHEwCit7CisgICAgX19tMTI4aSB6ZXJvLCBvbmUsIHJlczsKKyAgICB6ZXJvID0gX21tX3NldHplcm9fc2kxMjggKCk7CisgICAgb25lID0gX21tX2NtcGVxX2VwaTgoemVybyx6ZXJvKTsgLy8weGZmZi4uZmZmZgorICAgIHJlcyA9IF9tbV9hbmRfc2kxMjggKGEsIGIpOworICAgIHJlcyA9ICBfbW1fY21wZXFfZXBpMTYgKHJlcywgemVybyk7CisgICAgcmV0dXJuIF9tbV94b3Jfc2kxMjgocmVzLCBvbmUpOyAvL2ludmVydCByZXN1bHQKK30KKwordWludDMyeDRfdCB2dHN0cV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlRTVC4zMiBxMCwgcTAsIHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdnRzdHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgLy8gVlRTVC4zMiBxMCwgcTAsIHEwCit7CisgICAgX19tMTI4aSB6ZXJvLCBvbmUsIHJlczsKKyAgICB6ZXJvID0gX21tX3NldHplcm9fc2kxMjggKCk7CisgICAgb25lID0gX21tX2NtcGVxX2VwaTgoemVybyx6ZXJvKTsgLy8weGZmZi4uZmZmZgorICAgIHJlcyA9IF9tbV9hbmRfc2kxMjggKGEsIGIpOworICAgIHJlcyA9ICBfbW1fY21wZXFfZXBpMzIgKHJlcywgemVybyk7CisgICAgcmV0dXJuIF9tbV94b3Jfc2kxMjgocmVzLCBvbmUpOyAvL2ludmVydCByZXN1bHQKK30KKwordWludDh4MTZfdCB2dHN0cV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZUU1QuOCBxMCwgcTAsIHEwCisjZGVmaW5lIHZ0c3RxX3U4IHZ0c3RxX3M4CisKK3VpbnQxNng4X3QgdnRzdHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVlRTVC4xNiBxMCwgcTAsIHEwCisjZGVmaW5lIHZ0c3RxX3UxNiB2dHN0cV9zMTYKKwordWludDMyeDRfdCB2dHN0cV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWVFNULjMyIHEwLCBxMCwgcTAKKyNkZWZpbmUgdnRzdHFfdTMyIHZ0c3RxX3MzMgorCit1aW50OHgxNl90IHZ0c3RxX3A4KHBvbHk4eDE2X3QgYSwgcG9seTh4MTZfdCBiKTsgLy8gVlRTVC44IHEwLCBxMCwgcTAKKyNkZWZpbmUgdnRzdHFfcDggdnRzdHFfdTgKKworLy8qKioqKioqKioqKioqKioqKiogQWJzb2x1dGUgZGlmZmVyZW5jZSAqKioqKioqKioqKioqKioqKioqKgorLy8qKiogQWJzb2x1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhcmd1bWVudHM6IFZyW2ldID0gfCBWYVtpXSAtIFZiW2ldIHwqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZhYmRfczgoaW50OHg4X3QgYSwgIGludDh4OF90IGIpOyAvLyBWQUJELlM4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZhYmRfczgoaW50OHg4X3QgYSwgIGludDh4OF90IGIpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodmFiZHFfczgoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCitpbnQxNng0X3QgdmFiZF9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYik7IC8vIFZBQkQuUzE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2YWJkX3MxNihpbnQxNng0X3QgYSwgIGludDE2eDRfdCBiKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NCh2YWJkcV9zMTYoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCitpbnQzMngyX3QgdmFiZF9zMzIoaW50MzJ4Ml90IGEsICBpbnQzMngyX3QgYik7IC8vIFZBQkQuUzMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2YWJkX3MzMihpbnQzMngyX3QgYSwgIGludDMyeDJfdCBiKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NCh2YWJkcV9zMzIoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCit1aW50OHg4X3QgdmFiZF91OCh1aW50OHg4X3QgYSwgIHVpbnQ4eDhfdCBiKTsgLy8gVkFCRC5VOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdmFiZF91OCh1aW50OHg4X3QgYSwgIHVpbnQ4eDhfdCBiKQoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NCh2YWJkcV91OChfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKK3VpbnQxNng0X3QgdmFiZF91MTYodWludDE2eDRfdCBhLCAgdWludDE2eDRfdCBiKTsgLy8gVkFCRC5zMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2YWJkX3UxNih1aW50MTZ4NF90IGEsICB1aW50MTZ4NF90IGIpCit7CisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NCh2YWJkcV91MTYoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCit1aW50MzJ4Ml90IHZhYmRfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYik7IC8vIFZBQkQuVTMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdmFiZF91MzIodWludDMyeDJfdCBhLCAgdWludDMyeDJfdCBiKQoreworICAgIHVpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodmFiZHFfdTMyKF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworZmxvYXQzMngyX3QgdmFiZF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZBQkQuRjMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZhYmRfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpCit7CisgICAgZmxvYXQzMng0X3QgcmVzOworICAgIF9fbTY0XzEyOCByZXM2NDsKKyAgICByZXMgPSB2YWJkcV9mMzIoX3BNMTI4KGEpLCBfcE0xMjgoYikpOworICAgIF9NNjRmKHJlczY0LCByZXMpOworICAgIHJldHVybiByZXM2NDsKK30KKworaW50OHgxNl90IHZhYmRxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZBQkQuUzggcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90IHZhYmRxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgLy8gVkFCRC5TOCBxMCxxMCxxMAoreworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IF9tbV9zdWJfZXBpOCAoYSwgYik7CisgICAgcmV0dXJuIF9tbV9hYnNfZXBpOCAocmVzKTsKK30KKworaW50MTZ4OF90IHZhYmRxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWQUJELlMxNiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgdmFiZHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgLy8gVkFCRC5TMTYgcTAscTAscTAKK3sKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSBfbW1fc3ViX2VwaTE2IChhLGIpOworICAgIHJldHVybiBfbW1fYWJzX2VwaTE2IChyZXMpOworfQorCitpbnQzMng0X3QgdmFiZHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZBQkQuUzMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2YWJkcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSAvLyBWQUJELlMzMiBxMCxxMCxxMAoreworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IF9tbV9zdWJfZXBpMzIgKGEsYik7CisgICAgcmV0dXJuIF9tbV9hYnNfZXBpMzIgKHJlcyk7Cit9CisKK3VpbnQ4eDE2X3QgdmFiZHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWQUJELlU4IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDE2X3QgdmFiZHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpIC8vbm8gYWJzIGZvciB1bnNpZ25lZAoreworICAgIF9fbTEyOGkgY21wLCBkaWZhYiwgZGlmYmE7CisgICAgY21wID0gdmNndHFfdTgoYSxiKTsKKyAgICBkaWZhYiA9IF9tbV9zdWJfZXBpOChhLGIpOworICAgIGRpZmJhID0gX21tX3N1Yl9lcGk4IChiLGEpOworICAgIGRpZmFiID0gX21tX2FuZF9zaTEyOChjbXAsIGRpZmFiKTsKKyAgICBkaWZiYSA9IF9tbV9hbmRub3Rfc2kxMjgoY21wLCBkaWZiYSk7CisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOChkaWZhYiwgZGlmYmEpOworfQorCit1aW50MTZ4OF90IHZhYmRxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZBQkQuczE2IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3QgdmFiZHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKQoreworICAgIF9fbTEyOGkgY21wLCBkaWZhYiwgZGlmYmE7CisgICAgY21wID0gdmNndHFfdTE2KGEsYik7CisgICAgZGlmYWIgPSBfbW1fc3ViX2VwaTE2KGEsYik7CisgICAgZGlmYmEgPSBfbW1fc3ViX2VwaTE2IChiLGEpOworICAgIGRpZmFiID0gX21tX2FuZF9zaTEyOChjbXAsIGRpZmFiKTsKKyAgICBkaWZiYSA9IF9tbV9hbmRub3Rfc2kxMjgoY21wLCBkaWZiYSk7CisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOChkaWZhYiwgZGlmYmEpOworfQorCit1aW50MzJ4NF90IHZhYmRxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZBQkQuVTMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdmFiZHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKQoreworICAgIF9fbTEyOGkgY21wLCBkaWZhYiwgZGlmYmE7CisgICAgY21wID0gdmNndHFfdTMyKGEsYik7CisgICAgZGlmYWIgPSBfbW1fc3ViX2VwaTMyKGEsYik7CisgICAgZGlmYmEgPSBfbW1fc3ViX2VwaTMyIChiLGEpOworICAgIGRpZmFiID0gX21tX2FuZF9zaTEyOChjbXAsIGRpZmFiKTsKKyAgICBkaWZiYSA9IF9tbV9hbmRub3Rfc2kxMjgoY21wLCBkaWZiYSk7CisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOChkaWZhYiwgZGlmYmEpOworfQorCitmbG9hdDMyeDRfdCB2YWJkcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZBQkQuRjMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4NF90IHZhYmRxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKSAvLyBWQUJELkYzMiBxMCxxMCxxMAoreworICAgIF9fbTEyOGkgYzE7CisgICAgX19tMTI4IHJlczsKKyAgICBjMSA9ICBfbW1fc2V0MV9lcGkzMigweDdmZmZmZmZmKTsKKyAgICByZXMgPSBfbW1fc3ViX3BzIChhLCBiKTsKKyAgICByZXR1cm4gX21tX2FuZF9wcyAocmVzLCAqKF9fbTEyOCopJmMxKTsKK30KKworLy8qKioqKioqKioqKiogIEFic29sdXRlIGRpZmZlcmVuY2UgLSBsb25nICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQxNng4X3QgdmFiZGxfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZBQkRMLlM4IHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2YWJkbF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSAvLyBWQUJETC5TOCBxMCxkMCxkMAoreworICAgIF9fbTEyOGkgYTE2LCBiMTY7CisgICAgYTE2ID0gX01NX0NWVEVQSThfRVBJMTYgKF9wTTEyOGkoYSkpOyAvL1NTRTQuMSwKKyAgICBiMTYgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoX3BNMTI4aShiKSk7IC8vU1NFNC4xLAorICAgIHJldHVybiB2YWJkcV9zMTYoYTE2LCBiMTYpOworCit9CisKK2ludDMyeDRfdCB2YWJkbF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVkFCREwuUzE2IHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2YWJkbF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKSAvLyBWQUJETC5TMTYgcTAsZDAsZDAKK3sKKyAgICBfX20xMjhpIGEzMiwgYjMyOworICAgIGEzMiA9IF9NTV9DVlRFUEkxNl9FUEkzMiAoX3BNMTI4aShhKSk7IC8vU1NFNC4xCisgICAgYjMyID0gX01NX0NWVEVQSTE2X0VQSTMyIChfcE0xMjhpKGIpKTsgLy9TU0U0LjEsCisgICAgcmV0dXJuIHZhYmRxX3MzMihhMzIsIGIzMik7Cit9CisKK2ludDY0eDJfdCB2YWJkbF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVkFCREwuUzMyIHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HIChpbnQ2NHgyX3QgdmFiZGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiksX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICAvL25vIG9wdGltYWwgU0lNRCBzb2x1dGlvbiwgc2VyaWFsIGxvb2tzIGZhc3RlcgorICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ2NF90IHJlc1syXTsKKyAgICBpZihhLm02NF9pMzJbMF0gPiBiLm02NF9pMzJbMF0pIHJlc1swXSA9ICggaW50NjRfdCkgYS5tNjRfaTMyWzBdIC0gKCBpbnQ2NF90KSBiLm02NF9pMzJbMF07CisgICAgZWxzZSByZXNbMF0gPSAoIGludDY0X3QpIGIubTY0X2kzMlswXSAtICggaW50NjRfdCkgYS5tNjRfaTMyWzBdOworICAgIGlmKGEubTY0X2kzMlsxXSA+IGIubTY0X2kzMlsxXSkgcmVzWzFdID0gKCBpbnQ2NF90KSBhLm02NF9pMzJbMV0gLSAoIGludDY0X3QpIGIubTY0X2kzMlsxXTsKKyAgICBlbHNlIHJlc1sxXSA9ICggaW50NjRfdCkgYi5tNjRfaTMyWzFdIC0gKCBpbnQ2NF90KSBhLm02NF9pMzJbMV07CisgICAgcmV0dXJuIF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKilyZXMpOworfQorCit1aW50MTZ4OF90IHZhYmRsX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZBQkRMLlU4IHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3QgdmFiZGxfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKQoreworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IHZzdWJsX3U4KGEsYik7CisgICAgcmV0dXJuIF9tbV9hYnNfZXBpMTYocmVzKTsKK30KKwordWludDMyeDRfdCB2YWJkbF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWQUJETC5zMTYgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2YWJkbF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpCit7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdnN1YmxfdTE2KGEsYik7CisgICAgcmV0dXJuIF9tbV9hYnNfZXBpMzIocmVzKTsKK30KKwordWludDY0eDJfdCB2YWJkbF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWQUJETC5VMzIgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcgKHVpbnQ2NHgyX3QgdmFiZGxfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDY0X3QgcmVzWzJdOworICAgIGlmKGEubTY0X3UzMlswXSA+IGIubTY0X3UzMlswXSkgcmVzWzBdID0gKCB1aW50NjRfdCkgYS5tNjRfdTMyWzBdIC0gKCB1aW50NjRfdCkgYi5tNjRfdTMyWzBdOworICAgIGVsc2UgcmVzWzBdID0gKCB1aW50NjRfdCkgYi5tNjRfdTMyWzBdIC0gKCB1aW50NjRfdCkgYS5tNjRfdTMyWzBdOworICAgIGlmKGEubTY0X3UzMlsxXSA+IGIubTY0X3UzMlsxXSkgcmVzWzFdID0gKCB1aW50NjRfdCkgYS5tNjRfdTMyWzFdIC0gKCB1aW50NjRfdCkgYi5tNjRfdTMyWzFdOworICAgIGVsc2UgcmVzWzFdID0gKCB1aW50NjRfdCkgYi5tNjRfdTMyWzFdIC0gKCB1aW50NjRfdCkgYS5tNjRfdTMyWzFdOworICAgIHJldHVybiBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSopcmVzKTsKK30KKworLy8qKioqKioqKioqQWJzb2x1dGUgZGlmZmVyZW5jZSBhbmQgYWNjdW11bGF0ZTogVnJbaV0gPSBWYVtpXSArIHwgVmJbaV0gLSBWY1tpXSB8ICoqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQ4eDhfdCB2YWJhX3M4KGludDh4OF90IGEsICBpbnQ4eDhfdCBiLCBpbnQ4eDhfdCBjKTsgLy8gVkFCQS5TOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2YWJhX3M4KGludDh4OF90IGEsICBpbnQ4eDhfdCBiLCBpbnQ4eDhfdCBjKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KHZhYmFxX3M4KF9wTTEyOGkoYSksX3BNMTI4aShiKSwgX3BNMTI4aShjKSkpOworfQorCitpbnQxNng0X3QgdmFiYV9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpOyAvLyBWQUJBLlMxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdmFiYV9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KHZhYmFxX3MxNihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpLCBfcE0xMjhpKGMpKSk7Cit9CisKK2ludDMyeDJfdCB2YWJhX3MzMihpbnQzMngyX3QgYSwgIGludDMyeDJfdCBiLCBpbnQzMngyX3QgYyk7IC8vIFZBQkEuUzMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2YWJhX3MzMihpbnQzMngyX3QgYSwgIGludDMyeDJfdCBiLCBpbnQzMngyX3QgYykKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodmFiYXFfczMyKF9wTTEyOGkoYSksIF9wTTEyOGkoYiksIF9wTTEyOGkoYykpKTsKK30KKwordWludDh4OF90IHZhYmFfdTgodWludDh4OF90IGEsICB1aW50OHg4X3QgYiwgdWludDh4OF90IGMpOyAvLyBWQUJBLlU4IGQwLGQwLGQwCisjZGVmaW5lIHZhYmFfdTggdmFiYV9zOAorCisKK3VpbnQxNng0X3QgdmFiYV91MTYodWludDE2eDRfdCBhLCAgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IGMpOyAvLyBWQUJBLnMxNiBkMCxkMCxkMAorI2RlZmluZSB2YWJhX3UxNiB2YWJhX3MxNgorCit1aW50MzJ4Ml90IHZhYmFfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCBjKTsgLy8gVkFCQS5VMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2YWJhX3UzMih1aW50MzJ4Ml90IGEsICB1aW50MzJ4Ml90IGIsIHVpbnQzMngyX3QgYykKK3sKKyAgICB1aW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KHZhYmFxX3UzMihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpLCBfcE0xMjhpKGMpKSk7Cit9CisKK2ludDh4MTZfdCB2YWJhcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIsIGludDh4MTZfdCBjKTsgLy8gVkFCQS5TOCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2X3QgdmFiYXFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiLCBpbnQ4eDE2X3QgYykgLy8gVkFCQS5TOCBxMCxxMCxxMAoreworICAgIGludDh4MTZfdCBzdWI7CisgICAgc3ViID0gdmFiZHFfczgoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRxX3M4KCBhLCBzdWIpOworfQorCitpbnQxNng4X3QgdmFiYXFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4OF90IGMpOyAvLyBWQUJBLlMxNiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgdmFiYXFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4OF90IGMpIC8vIFZBQkEuUzE2IHEwLHEwLHEwCit7CisgICAgaW50MTZ4OF90IHN1YjsKKyAgICBzdWIgPSB2YWJkcV9zMTYoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRxX3MxNiggYSwgc3ViKTsKK30KKworaW50MzJ4NF90IHZhYmFxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDRfdCBjKTsgLy8gVkFCQS5TMzIgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZhYmFxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDRfdCBjKSAvLyBWQUJBLlMzMiBxMCxxMCxxMAoreworICAgIGludDMyeDRfdCBzdWI7CisgICAgc3ViID0gdmFiZHFfczMyKGIsIGMpOworICAgIHJldHVybiB2YWRkcV9zMzIoIGEsIHN1Yik7Cit9CisKK3VpbnQ4eDE2X3QgdmFiYXFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIsIHVpbnQ4eDE2X3QgYyk7IC8vIFZBQkEuVTggcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZfdCB2YWJhcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYiwgdWludDh4MTZfdCBjKQoreworICAgIHVpbnQ4eDE2X3Qgc3ViOworICAgIHN1YiA9IHZhYmRxX3U4KGIsIGMpOworICAgIHJldHVybiB2YWRkcV91OCggYSwgc3ViKTsKK30KKwordWludDE2eDhfdCB2YWJhcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIHVpbnQxNng4X3QgYyk7IC8vIFZBQkEuczE2IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3QgdmFiYXFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiLCB1aW50MTZ4OF90IGMpCit7CisgICAgdWludDE2eDhfdCBzdWI7CisgICAgc3ViID0gdmFiZHFfdTE2KGIsIGMpOworICAgIHJldHVybiB2YWRkcV91MTYoIGEsIHN1Yik7Cit9CisKK3VpbnQzMng0X3QgdmFiYXFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiLCB1aW50MzJ4NF90IGMpOyAvLyBWQUJBLlUzMiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZhYmFxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyeDRfdCBjKQoreworICAgIHVpbnQzMng0X3Qgc3ViOworICAgIHN1YiA9IHZhYmRxX3UzMihiLCBjKTsKKyAgICByZXR1cm4gdmFkZHFfdTMyKCBhLCBzdWIpOworfQorCisvLyoqKioqKioqKioqKioqIEFic29sdXRlIGRpZmZlcmVuY2UgYW5kIGFjY3VtdWxhdGUgLSBsb25nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDE2eDhfdCB2YWJhbF9zOChpbnQxNng4X3QgYSwgaW50OHg4X3QgYiwgaW50OHg4X3QgYyk7IC8vIFZBQkFMLlM4IHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2YWJhbF9zOChpbnQxNng4X3QgYSwgaW50OHg4X3QgYiwgaW50OHg4X3QgYykgLy8gVkFCQUwuUzggcTAsZDAsZDAKK3sKKyAgICBfX20xMjhpIGIxNiwgYzE2LCByZXM7CisgICAgYjE2ID0gX01NX0NWVEVQSThfRVBJMTYgKF9wTTEyOGkoYikpOyAvL1NTRTQuMSwKKyAgICBjMTYgPSBfTU1fQ1ZURVBJOF9FUEkxNiAoX3BNMTI4aShjKSk7IC8vU1NFNC4xLAorICAgIHJlcyA9IF9tbV9hYnNfZXBpMTYgKF9tbV9zdWJfZXBpMTYgKGIxNiwgYzE2KSApOworICAgIHJldHVybiBfbW1fYWRkX2VwaTE2IChhLCByZXMpOworfQorCitpbnQzMng0X3QgdmFiYWxfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpOyAvLyBWQUJBTC5TMTYgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZhYmFsX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCBjKSAvLyBWQUJBTC5TMTYgcTAsZDAsZDAKK3sKKyAgICBfX20xMjhpIGIzMiwgYzMyLCByZXM7CisgICAgYjMyID0gX01NX0NWVEVQSTE2X0VQSTMyKF9wTTEyOGkoYikpOyAvL1NTRTQuMQorICAgIGMzMiA9IF9NTV9DVlRFUEkxNl9FUEkzMihfcE0xMjhpKGMpKTsgLy9TU0U0LjEKKyAgICByZXMgPSBfbW1fYWJzX2VwaTMyIChfbW1fc3ViX2VwaTMyIChiMzIsIGMzMikgKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGkzMiAoYSwgcmVzKTsKK30KKworaW50NjR4Ml90IHZhYmFsX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKTsgLy8gVkFCQUwuUzMyIHEwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HIChpbnQ2NHgyX3QgdmFiYWxfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IGMpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IHZhYmRsX3MzMihiLGMpOworICAgIHJldHVybiBfbW1fYWRkX2VwaTY0KGEsIHJlcyk7Cit9CisKK3VpbnQxNng4X3QgdmFiYWxfdTgodWludDE2eDhfdCBhLCB1aW50OHg4X3QgYiwgdWludDh4OF90IGMpOyAvLyBWQUJBTC5VOCBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZhYmFsX3U4KHVpbnQxNng4X3QgYSwgdWludDh4OF90IGIsIHVpbnQ4eDhfdCBjKQoreworICAgIF9fbTEyOGkgYjE2LCBjMTYsIHJlczsKKyAgICBiMTYgPSBfTU1fQ1ZURVBVOF9FUEkxNiAoX3BNMTI4aShiKSk7IC8vU1NFNC4xLAorICAgIGMxNiA9IF9NTV9DVlRFUFU4X0VQSTE2IChfcE0xMjhpKGMpKTsgLy9TU0U0LjEsCisgICAgcmVzID0gX21tX2Fic19lcGkxNiAoX21tX3N1Yl9lcGkxNiAoYjE2LCBjMTYpICk7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMTYgKGEsIHJlcyk7Cit9CisKK3VpbnQzMng0X3QgdmFiYWxfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IGMpOyAvLyBWQUJBTC5zMTYgcTAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2YWJhbF91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgYykKK3sKKyAgICBfX20xMjhpIGIzMiwgYzMyLCByZXM7CisgICAgYjMyID0gX01NX0NWVEVQVTE2X0VQSTMyKF9wTTEyOGkoYikpOyAvL1NTRTQuMQorICAgIGMzMiA9IF9NTV9DVlRFUFUxNl9FUEkzMihfcE0xMjhpKGMpKTsgLy9TU0U0LjEKKyAgICByZXMgPSBfbW1fYWJzX2VwaTMyIChfbW1fc3ViX2VwaTMyIChiMzIsIGMzMikgKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGkzMiAoYSwgcmVzKTsKK30KKwordWludDY0eDJfdCB2YWJhbF91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMngyX3QgYyk7IC8vIFZBQkFMLlUzMiBxMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyAodWludDY0eDJfdCB2YWJhbF91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMngyX3QgYyksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdmFiZGxfdTMyKGIsYyk7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpNjQoYSwgcmVzKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqICBNYXhpbXVtIGFuZCBtaW5pbXVtIG9wZXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqIE1heGltdW06ICB2bWF4IC0+IFZyW2ldIDo9IChWYVtpXSA+PSBWYltpXSkgPyBWYVtpXSA6IFZiW2ldICAgICoqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90ICAgdm1heF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVk1BWC5TOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCAgIHZtYXhfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSBfTU1fTUFYX0VQSTgoX3BNMTI4aShhKSxfcE0xMjhpKGIpKTsgLy9TU0U0LjEsIHVzZSBvbmx5IGxvd2VyIDY0IGJpdHMKKyAgICByZXR1cm42NChyZXMpOworfQorCitpbnQxNng0X3Qgdm1heF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVk1BWC5TMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZtYXhfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX21heF9lcGkxNihfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworaW50MzJ4Ml90ICAgdm1heF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVk1BWC5TMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90ICAgdm1heF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSAgX01NX01BWF9FUEkzMihfcE0xMjhpKGEpLF9wTTEyOGkoYikpOyAvL1NTRTQuMSwgdXNlIG9ubHkgbG93ZXIgNjQgYml0cworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK3VpbnQ4eDhfdCB2bWF4X3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZNQVguVTggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZtYXhfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKQoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fbWF4X2VwdTgoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKwordWludDE2eDRfdCB2bWF4X3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZNQVguczE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3Qgdm1heF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpCit7CisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NChfTU1fTUFYX0VQVTE2KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQzMngyX3QgICB2bWF4X3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZNQVguVTMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgICB2bWF4X3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYikKK3sKKyAgICB1aW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IF9NTV9NQVhfRVBVMzIoX3BNMTI4aShhKSxfcE0xMjhpKGIpKTsgLy9TU0U0LjEsIHVzZSBvbmx5IGxvd2VyIDY0IGJpdHMsIG1heSBiZSBub3QgZWZmZWN0aXZlIGNvbXBhcmVkIHdpdGggc2VyaWFsCisgICAgcmV0dXJuNjQocmVzKTsKK30KKworZmxvYXQzMngyX3Qgdm1heF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZNQVguRjMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZtYXhfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpCit7CisgICAgLy9zZXJpYWwgc29sdXRpb24gbG9va3MgZmFzdGVyIHRoYW4gIFNJTUQgb25lCisgICAgZmxvYXQzMngyX3QgcmVzOworICAgIHJlcy5tNjRfZjMyWzBdID0gKGEubTY0X2YzMlswXSA+IGIubTY0X2YzMlswXSkgPyBhLm02NF9mMzJbMF0gOiBiLm02NF9mMzJbMF07CisgICAgcmVzLm02NF9mMzJbMV0gPSAoYS5tNjRfZjMyWzFdID4gYi5tNjRfZjMyWzFdKSA/IGEubTY0X2YzMlsxXSA6IGIubTY0X2YzMlsxXTsKKyAgICByZXR1cm4gcmVzOworfQorCitpbnQ4eDE2X3QgICB2bWF4cV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWTUFYLlM4IHEwLHEwLHEwCisjZGVmaW5lIHZtYXhxX3M4IF9NTV9NQVhfRVBJOCAvL1NTRTQuMQorCitpbnQxNng4X3QgICB2bWF4cV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVk1BWC5TMTYgcTAscTAscTAKKyNkZWZpbmUgdm1heHFfczE2IF9tbV9tYXhfZXBpMTYKKworaW50MzJ4NF90ICAgdm1heHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZNQVguUzMyIHEwLHEwLHEwCisjZGVmaW5lIHZtYXhxX3MzMiBfTU1fTUFYX0VQSTMyIC8vU1NFNC4xCisKK3VpbnQ4eDE2X3QgICB2bWF4cV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZNQVguVTggcTAscTAscTAKKyNkZWZpbmUgdm1heHFfdTggX21tX21heF9lcHU4CisKK3VpbnQxNng4X3QgICB2bWF4cV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWTUFYLnMxNiBxMCxxMCxxMAorI2RlZmluZSB2bWF4cV91MTYgX01NX01BWF9FUFUxNiAvL1NTRTQuMQorCit1aW50MzJ4NF90ICAgdm1heHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVk1BWC5VMzIgcTAscTAscTAKKyNkZWZpbmUgdm1heHFfdTMyIF9NTV9NQVhfRVBVMzIgLy9TU0U0LjEKKworCitmbG9hdDMyeDRfdCB2bWF4cV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZNQVguRjMyIHEwLHEwLHEwCisjZGVmaW5lIHZtYXhxX2YzMiBfbW1fbWF4X3BzCisKKy8vKioqKioqKioqKioqKioqIE1pbmltdW06IHZtaW4gLT4gVnJbaV0gOj0gKFZhW2ldID49IFZiW2ldKSA/IFZiW2ldIDogVmFbaV0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90ICAgdm1pbl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVk1JTi5TOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCAgIHZtaW5fczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSBfTU1fTUlOX0VQSTgoX3BNMTI4aShhKSxfcE0xMjhpKGIpKTsgLy9TU0U0LjEsIHVzZSBvbmx5IGxvd2VyIDY0IGJpdHMKKyAgICByZXR1cm42NChyZXMpOworfQorCitpbnQxNng0X3Qgdm1pbl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVk1JTi5TMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZtaW5fczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX21pbl9lcGkxNihfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCitpbnQzMngyX3QgICB2bWluX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWTUlOLlMzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgICB2bWluX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IF9NTV9NSU5fRVBJMzIoX3BNMTI4aShhKSxfcE0xMjhpKGIpKTsgLy9TU0U0LjEsIHVzZSBvbmx5IGxvd2VyIDY0IGJpdHMKKyAgICByZXR1cm42NChyZXMpOworfQorCit1aW50OHg4X3Qgdm1pbl91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWTUlOLlU4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2bWluX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYikKK3sKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX21pbl9lcHU4KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQxNng0X3Qgdm1pbl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWTUlOLnMxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZtaW5fdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKQoreworICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX01NX01JTl9FUFUxNihfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCit1aW50MzJ4Ml90ICAgdm1pbl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWTUlOLlUzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90ICAgdm1pbl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpCit7CisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSBfTU1fTUlOX0VQVTMyKF9wTTEyOGkoYSksX3BNMTI4aShiKSk7IC8vU1NFNC4xLCB1c2Ugb25seSBsb3dlciA2NCBiaXRzLCBtYXkgYmUgbm90IGVmZmVjdGl2ZSBjb21wYXJlZCB3aXRoIHNlcmlhbAorICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2Zsb2F0MzJ4Ml90IHZtaW5fZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWTUlOLkYzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2bWluX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKQoreworICAgIC8vc2VyaWFsIHNvbHV0aW9uIGxvb2tzIGZhc3RlciB0aGFuICBTSU1EIG9uZQorICAgIGZsb2F0MzJ4Ml90IHJlczsKKyAgICByZXMubTY0X2YzMlswXSA9IChhLm02NF9mMzJbMF0gPCBiLm02NF9mMzJbMF0pID8gYS5tNjRfZjMyWzBdIDogYi5tNjRfZjMyWzBdOworICAgIHJlcy5tNjRfZjMyWzFdID0gKGEubTY0X2YzMlsxXSA8IGIubTY0X2YzMlsxXSkgPyBhLm02NF9mMzJbMV0gOiBiLm02NF9mMzJbMV07CisgICAgcmV0dXJuIHJlczsKK30KKworaW50OHgxNl90ICAgdm1pbnFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVk1JTi5TOCBxMCxxMCxxMAorI2RlZmluZSB2bWlucV9zOCBfTU1fTUlOX0VQSTggLy9TU0U0LjEKKworaW50MTZ4OF90ICAgdm1pbnFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZNSU4uUzE2IHEwLHEwLHEwCisjZGVmaW5lIHZtaW5xX3MxNiBfbW1fbWluX2VwaTE2CisKK2ludDMyeDRfdCAgIHZtaW5xX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWTUlOLlMzMiBxMCxxMCxxMAorI2RlZmluZSB2bWlucV9zMzIgX01NX01JTl9FUEkzMiAvL1NTRTQuMQorCit1aW50OHgxNl90ICAgdm1pbnFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpOyAvLyBWTUlOLlU4IHEwLHEwLHEwCisjZGVmaW5lIHZtaW5xX3U4IF9tbV9taW5fZXB1OAorCit1aW50MTZ4OF90ICAgdm1pbnFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVk1JTi5zMTYgcTAscTAscTAKKyNkZWZpbmUgdm1pbnFfdTE2IF9NTV9NSU5fRVBVMTYgLy9TU0U0LjEKKwordWludDMyeDRfdCAgIHZtaW5xX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZNSU4uVTMyIHEwLHEwLHEwCisjZGVmaW5lIHZtaW5xX3UzMiBfTU1fTUlOX0VQVTMyIC8vU1NFNC4xCisKK2Zsb2F0MzJ4NF90IHZtaW5xX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVk1JTi5GMzIgcTAscTAscTAKKyNkZWZpbmUgdm1pbnFfZjMyIF9tbV9taW5fcHMKKworLy8qKioqKioqKioqKioqICBQYWlyd2lzZSBhZGRpdGlvbiBvcGVyYXRpb25zLiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vUGFpcndpc2UgYWRkIC0gYWRkcyBhZGphY2VudCBwYWlycyBvZiBlbGVtZW50cyBvZiB0d28gdmVjdG9ycywgYW5kIHBsYWNlcyB0aGUgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24gdmVjdG9yCitpbnQ4eDhfdCB2cGFkZF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlBBREQuSTggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdnBhZGRfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgLy8gVlBBREQuSTggZDAsZDAsZDAKK3sKKyAgICAvL25vIDggYml0IGhhZGQgaW4gSUEzMiwgbmVlZCB0byBnbyB0byAxNiBiaXQgYW5kIHRoZW4gcGFjaworICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgYTE2LCBiMTYsIHJlczsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s4XzE2X2V2ZW5fb2RkWzE2XSA9IHsgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMSwgMywgNSwgNywgOSwgMTEsIDEzLCAxNSB9OworICAgIGExNiA9IF9NTV9DVlRFUEk4X0VQSTE2IChfcE0xMjhpKGEpKTsgLy8gU1NFIDQuMQorICAgIGIxNiA9IF9NTV9DVlRFUEk4X0VQSTE2IChfcE0xMjhpKGIpKTsgLy8gU1NFIDQuMQorICAgIHJlcyA9IF9tbV9oYWRkX2VwaTE2IChhMTYsIGIxNik7CisgICAgcmVzID0gX21tX3NodWZmbGVfZXBpOCAocmVzLCAqKF9fbTEyOGkqKSBtYXNrOF8xNl9ldmVuX29kZCk7IC8vcmV0dXJuIHRvIDggYml0LCB1c2UgbG93IDY0IGJpdHMKKyAgICByZXR1cm42NChyZXMpOworfQorCitpbnQxNng0X3QgICB2cGFkZF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlBBREQuSTE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCAgIHZwYWRkX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgaGFkZDEyODsKKyAgICBoYWRkMTI4ID0gX21tX2hhZGRfZXBpMTYgKF9wTTEyOGkoYSksIF9wTTEyOGkoYikpOworICAgIGhhZGQxMjggPSBfbW1fc2h1ZmZsZV9lcGkzMiAoaGFkZDEyOCwgMCB8ICgyIDw8IDIpIHwgKDEgPDwgNCkgfCAoMyA8PCA2KSk7CisgICAgcmV0dXJuNjQoaGFkZDEyOCk7Cit9CisKKworaW50MzJ4Ml90ICAgdnBhZGRfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZQQURELkkzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgICB2cGFkZF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIGhhZGQxMjg7CisgICAgaGFkZDEyOCA9IF9tbV9oYWRkX2VwaTMyIChfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKTsKKyAgICBoYWRkMTI4ID0gX21tX3NodWZmbGVfZXBpMzIgKGhhZGQxMjgsIDAgfCAoMiA8PCAyKSB8ICgxIDw8IDQpIHwgKDMgPDwgNikpOworICAgIHJldHVybjY0KGhhZGQxMjgpOworfQorCisKK3VpbnQ4eDhfdCB2cGFkZF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWUEFERC5JOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnBhZGRfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKSAvLyBWUEFERC5JOCBkMCxkMCxkMAoreworICAgIC8vICBubyA4IGJpdCBoYWRkIGluIElBMzIsIG5lZWQgdG8gZ28gdG8gMTYgYml0IGFuZCB0aGVuIHBhY2sKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisvLyAgbm8gdW5zaWduZWQgX21tX2hhZGRfIGZ1bmN0aW9ucyBpbiBJQTMyLCBidXQgOCB1bnNpZ25lZCBpcyBsZXNzIHRoZW4gMTYgc2lnbmVkLCBzbyBpdCBzaG91bGQgd29yaworICAgIF9fbTEyOGkgbWFzazgsIGExNiwgYjE2LCByZXM7CisgICAgbWFzazggPSBfbW1fc2V0MV9lcGkxNigweGZmKTsKKyAgICBhMTYgPSBfTU1fQ1ZURVBVOF9FUEkxNiAoX3BNMTI4aShhKSk7IC8vIFNTRSA0LjEKKyAgICBiMTYgPSBfTU1fQ1ZURVBVOF9FUEkxNiAoX3BNMTI4aShiKSk7IC8vIFNTRSA0LjEKKyAgICByZXMgPSBfbW1faGFkZF9lcGkxNiAoYTE2LCBiMTYpOworICAgIHJlcyA9IF9tbV9hbmRfc2kxMjgocmVzLCBtYXNrOCk7IC8vdG8gYXZvaWQgc2F0dXJhdGlvbgorICAgIHJlcyA9IF9tbV9wYWNrdXNfZXBpMTYgKHJlcyxyZXMpOyAvL3VzZSBsb3cgNjQgYml0cworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK3VpbnQxNng0X3QgdnBhZGRfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlBBREQuSTE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdnBhZGRfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKSAvLyBWUEFERC5JMTYgZDAsZDAsZDAKK3sKKyAgICAvLyBzb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwsIHNlcmlhbCBleGVjdXRpb24gbWF5IGJlIGZhc3RlcgorICAgIC8vIG5vIHVuc2lnbmVkIF9tbV9oYWRkXyBmdW5jdGlvbnMgaW4gSUEzMiwgbmVlZCB0byBtb3ZlIGZyb20gdW5zaWduZWQgdG8gc2lnbmVkCisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIGMzMjc2NywgIGNmZmZlLCBhcywgYnMsIHJlczsKKyAgICBjMzI3NjcgPSBfbW1fc2V0MV9lcGkxNiAoMzI3NjcpOworICAgIGNmZmZlID0gX21tX3NldDFfZXBpMTYgKDB4ZmZmZSk7CisgICAgYXMgPSBfbW1fc3ViX2VwaTE2IChfcE0xMjhpKGEpLCBjMzI3NjcpOworICAgIGJzID0gX21tX3N1Yl9lcGkxNiAoX3BNMTI4aShiKSwgYzMyNzY3KTsKKyAgICByZXMgPSBfbW1faGFkZF9lcGkxNiAoYXMsIGJzKTsKKyAgICByZXMgPSBfbW1fYWRkX2VwaTE2IChyZXMsIGNmZmZlKTsKKyAgICByZXMgPSBfbW1fc2h1ZmZsZV9lcGkzMiAocmVzLCAwIHwgKDIgPDwgMikgfCAoMSA8PCA0KSB8ICgzIDw8IDYpKTsKKyAgICByZXR1cm42NChyZXMpOworfQorCit1aW50MzJ4Ml90IHZwYWRkX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZQQURELkkzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZwYWRkX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYikgLy9zZXJpYWwgbWF5IGJlIGZhc3RlcgoreworICAgIC8vaGFkZCBkb2Vzbid0IHdvcmsgZm9yIHVuc2lnbmVkIHZhbHVlcworICAgIHVpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSBhYiwgYWJfc2gsIHJlczsKKyAgICBhYiA9IF9tbV91bnBhY2tsb19lcGk2NCAoIF9wTTEyOGkoYSksIF9wTTEyOGkoYikpOyAvL2EwIGExIGIwIGIxCisgICAgYWJfc2ggPSBfbW1fc2h1ZmZsZV9lcGkzMihhYiwgMSB8ICgwIDw8IDIpIHwgKDMgPDwgNCkgfCAoMiA8PCA2KSk7IC8vYTEsIGEwLCBiMSwgYjAKKyAgICByZXMgPSBfbW1fYWRkX2VwaTMyKGFiLCBhYl9zaCk7CisgICAgcmVzID0gX21tX3NodWZmbGVfZXBpMzIocmVzLCAwIHwgKDIgPDwgMikgfCAoMSA8PCA0KSB8ICgzIDw8IDYpKTsKKyAgICByZXR1cm42NChyZXMpOworfQorCitmbG9hdDMyeDJfdCB2cGFkZF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZQQURELkYzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2cGFkZF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikKK3sKKyAgICBfX20xMjggaGFkZDEyODsKKyAgICBfX202NF8xMjggcmVzNjQ7CisgICAgaGFkZDEyOCA9IF9tbV9oYWRkX3BzIChfcE0xMjgoYSksIF9wTTEyOChiKSk7CisgICAgaGFkZDEyOCA9IF9tbV9zaHVmZmxlX3BzIChoYWRkMTI4LCBoYWRkMTI4LCBfTU1fU0hVRkZMRSgzLDEsIDIsIDApKTsgLy91c2UgbG93IDY0IGJpdHMKKyAgICBfTTY0ZihyZXM2NCwgaGFkZDEyOCk7CisgICAgcmV0dXJuIHJlczY0OworfQorCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKiogIExvbmcgcGFpcndpc2UgYWRkICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9BZGRzIGFkamFjZW50IHBhaXJzIG9mIGVsZW1lbnRzIG9mIGEgdmVjdG9yLHNpZ24gb3IgemVybyBleHRlbmRzIHRoZSByZXN1bHRzIHRvIHR3aWNlIHRoZWlyIG9yaWdpbmFsIHdpZHRoLAorLy8gYW5kIHBsYWNlcyB0aGUgZmluYWwgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24gdmVjdG9yLgorCitpbnQxNng0X3QgdnBhZGRsX3M4KGludDh4OF90IGEpOyAvLyBWUEFEREwuUzggZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZwYWRkbF9zOChpbnQ4eDhfdCBhKSAvLyBWUEFEREwuUzggZDAsZDAKK3sKKyAgICAvL25vIDggYml0IGhhZGQgaW4gSUEzMiwgbmVlZCB0byBnbyB0byAxNiBiaXQgYW55d2F5CisgICAgX19tMTI4aSBhMTY7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIGExNiA9IF9NTV9DVlRFUEk4X0VQSTE2IChfcE0xMjhpKGEpKTsgLy8gU1NFIDQuMQorICAgIGExNiA9IF9tbV9oYWRkX2VwaTE2IChhMTYsICBhMTYpOyAvL3VzZSBsb3cgNjQgYml0cworICAgIHJldHVybjY0KGExNik7Cit9CisKK2ludDMyeDJfdCB2cGFkZGxfczE2KGludDE2eDRfdCBhKTsgLy8gVlBBRERMLlMxNiBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdnBhZGRsX3MxNihpbnQxNng0X3QgYSkgLy8gVlBBRERMLlMxNiBkMCxkMAoreworICAgIC8vIHNvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbCwgc2VyaWFsIGV4ZWN1dGlvbiBtYXkgYmUgZmFzdGVyCisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOGkgcjMyXzE7CisgICAgcjMyXzEgPSBfTU1fQ1ZURVBJMTZfRVBJMzIgKF9wTTEyOGkoYSkpOworICAgIHIzMl8xID0gX21tX2hhZGRfZXBpMzIocjMyXzEsIHIzMl8xKTsgLy91c2UgbG93IDY0IGJpdHMKKyAgICByZXR1cm42NChyMzJfMSk7Cit9CisKK2ludDY0eDFfdCB2cGFkZGxfczMyKGludDMyeDJfdCBhKTsgLy8gVlBBRERMLlMzMiBkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ2NHgxX3QgdnBhZGRsX3MzMihpbnQzMngyX3QgYSksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpIC8vc2VyaWFsIHNvbHV0aW9uIGxvb2tzIGZhc3RlcgoreworICAgIGludDY0eDFfdCByZXM7CisgICAgcmVzLm02NF9pNjRbMF0gPSAoaW50NjRfdClhLm02NF9pMzJbMF0gKyAoaW50NjRfdClhLm02NF9pMzJbMV07CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDE2eDRfdCB2cGFkZGxfdTgodWludDh4OF90IGEpOyAvLyBWUEFEREwuVTggZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2cGFkZGxfdTgodWludDh4OF90IGEpIC8vIFZQQURETC5VOCBkMCxkMAoreworICAgIC8vICBubyA4IGJpdCBoYWRkIGluIElBMzIsIG5lZWQgdG8gZ28gdG8gMTYgYml0CisvLyAgbm8gdW5zaWduZWQgX21tX2hhZGRfIGZ1bmN0aW9ucyBpbiBJQTMyLCBidXQgOCB1bnNpZ25lZCBpcyBsZXNzIHRoZW4gMTYgc2lnbmVkLCBzbyBpdCBzaG91bGQgd29yaworICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSBhMTY7CisgICAgYTE2ID0gX01NX0NWVEVQVThfRVBJMTYgKF9wTTEyOGkoYSkpOyAvLyBTU0UgNC4xIHVzZSBsb3cgNjQgYml0cworICAgIGExNiA9IF9tbV9oYWRkX2VwaTE2IChhMTYsIGExNik7IC8vdXNlIGxvdyA2NCBiaXRzCisgICAgcmV0dXJuNjQoYTE2KTsKK30KKwordWludDMyeDJfdCB2cGFkZGxfdTE2KHVpbnQxNng0X3QgYSk7IC8vIFZQQURETC5zMTYgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDMyeDJfdCB2cGFkZGxfdTE2KHVpbnQxNng0X3QgYSksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIC8vc2VyaWFsIHNvbHV0aW9uIGxvb2tzIGZhc3RlciB0aGFuIGEgU0lNRCBvbmUKKyAgICB1aW50MzJ4Ml90IHJlczsKKyAgICByZXMubTY0X3UzMlswXSA9ICh1aW50MzJfdClhLm02NF91MTZbMF0gKyAodWludDMyX3QpYS5tNjRfdTE2WzFdOworICAgIHJlcy5tNjRfdTMyWzFdID0gKHVpbnQzMl90KWEubTY0X3UxNlsyXSArICh1aW50MzJfdClhLm02NF91MTZbM107CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDY0eDFfdCB2cGFkZGxfdTMyKHVpbnQzMngyX3QgYSk7IC8vIFZQQURETC5VMzIgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDY0eDFfdCB2cGFkZGxfdTMyKHVpbnQzMngyX3QgYSksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpIC8vc2VyaWFsIHNvbHV0aW9uIGxvb2tzIGZhc3RlcgoreworICAgIHVpbnQ2NHgxX3QgcmVzOworICAgIHJlcy5tNjRfdTY0WzBdID0gKHVpbnQ2NF90KWEubTY0X3UzMlswXSArICh1aW50NjRfdClhLm02NF91MzJbMV07CisgICAgcmV0dXJuIHJlczsKK30KKworaW50MTZ4OF90IHZwYWRkbHFfczgoaW50OHgxNl90IGEpOyAvLyBWUEFEREwuUzggcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZwYWRkbHFfczgoaW50OHgxNl90IGEpIC8vIFZQQURETC5TOCBxMCxxMAoreworICAgIC8vbm8gOCBiaXQgaGFkZCBpbiBJQTMyLCBuZWVkIHRvIGdvIHRvIDE2IGJpdAorICAgIF9fbTEyOGkgcjE2XzEsIHIxNl8yOworICAgIHIxNl8xID0gX01NX0NWVEVQSThfRVBJMTYgKGEpOyAvLyBTU0UgNC4xCisgICAgLy9zd2FwIGhpIGFuZCBsb3cgcGFydCBvZiByIHRvIHByb2Nlc3MgdGhlIHJlbWFpbmluZyBkYXRhCisgICAgcjE2XzIgPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYSwgX1NXQVBfSElfTE9XMzIpOworICAgIHIxNl8yID0gX01NX0NWVEVQSThfRVBJMTYgKHIxNl8yKTsKKyAgICByZXR1cm4gX21tX2hhZGRfZXBpMTYgKHIxNl8xLCByMTZfMik7Cit9CisKK2ludDMyeDRfdCB2cGFkZGxxX3MxNihpbnQxNng4X3QgYSk7IC8vIFZQQURETC5TMTYgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZwYWRkbHFfczE2KGludDE2eDhfdCBhKSAvLyBWUEFEREwuUzE2IHEwLHEwCit7CisgICAgLy9ubyA4IGJpdCBoYWRkIGluIElBMzIsIG5lZWQgdG8gZ28gdG8gMTYgYml0CisgICAgX19tMTI4aSByMzJfMSwgcjMyXzI7CisgICAgcjMyXzEgPSBfTU1fQ1ZURVBJMTZfRVBJMzIoYSk7CisgICAgLy9zd2FwIGhpIGFuZCBsb3cgcGFydCBvZiByIHRvIHByb2Nlc3MgdGhlIHJlbWFpbmluZyBkYXRhCisgICAgcjMyXzIgPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYSwgX1NXQVBfSElfTE9XMzIpOworICAgIHIzMl8yID0gX01NX0NWVEVQSTE2X0VQSTMyIChyMzJfMik7CisgICAgcmV0dXJuIF9tbV9oYWRkX2VwaTMyIChyMzJfMSwgcjMyXzIpOworfQorCitpbnQ2NHgyX3QgdnBhZGRscV9zMzIoaW50MzJ4NF90IGEpOyAvLyBWUEFEREwuUzMyIHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDJfdCB2cGFkZGxxX3MzMihpbnQzMng0X3QgYSksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpIC8vIFZQQURETC5TMzIgcTAscTAKK3sKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50MzJfdCBhdG1wWzRdOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ2NF90IHJlc1syXTsKKyAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWF0bXAsIGEpOworICAgIHJlc1swXSA9IChpbnQ2NF90KWF0bXBbMF0gKyAoaW50NjRfdClhdG1wWzFdOworICAgIHJlc1sxXSA9IChpbnQ2NF90KWF0bXBbMl0gKyAoaW50NjRfdClhdG1wWzNdOworICAgIHJldHVybiBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSopcmVzKTsKK30KKwordWludDE2eDhfdCB2cGFkZGxxX3U4KHVpbnQ4eDE2X3QgYSk7IC8vIFZQQURETC5VOCBxMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZwYWRkbHFfdTgodWludDh4MTZfdCBhKSAvLyBWUEFEREwuVTggcTAscTAKK3sKKyAgICAvL25vIDggYml0IGhhZGQgaW4gSUEzMiwgbmVlZCB0byBnbyB0byAxNiBiaXQKKyAgICBfX20xMjhpIHIxNl8xLCByMTZfMjsKKyAgICByMTZfMSA9IF9NTV9DVlRFUFU4X0VQSTE2KGEpOworICAgIC8vc3dhcCBoaSBhbmQgbG93IHBhcnQgb2YgciB0byBwcm9jZXNzIHRoZSByZW1haW5pbmcgZGF0YQorICAgIHIxNl8yID0gX21tX3NodWZmbGVfZXBpMzIgKGEsIF9TV0FQX0hJX0xPVzMyKTsKKyAgICByMTZfMiA9IF9NTV9DVlRFUFU4X0VQSTE2IChyMTZfMik7CisgICAgcmV0dXJuIF9tbV9oYWRkX2VwaTE2IChyMTZfMSwgcjE2XzIpOworfQorCit1aW50MzJ4NF90IHZwYWRkbHFfdTE2KHVpbnQxNng4X3QgYSk7IC8vIFZQQURETC5zMTYgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDMyeDRfdCB2cGFkZGxxX3UxNih1aW50MTZ4OF90IGEpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICAvL3NlcmlhbCBzb2x1dGlvbiBsb29rcyBmYXN0ZXIgdGhhbiBhIFNJTUQgb25lCisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQxNl90IGF0bXBbOF07CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQzMl90IHJlc1s0XTsKKyAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWF0bXAsIGEpOworICAgIHJlc1swXSA9ICh1aW50MzJfdClhdG1wWzBdICsgKHVpbnQzMl90KWF0bXBbMV07CisgICAgcmVzWzFdID0gKHVpbnQzMl90KWF0bXBbMl0gKyAodWludDMyX3QpYXRtcFszXTsKKyAgICByZXNbMl0gPSAodWludDMyX3QpYXRtcFs0XSArICh1aW50MzJfdClhdG1wWzVdOworICAgIHJlc1szXSA9ICh1aW50MzJfdClhdG1wWzZdICsgKHVpbnQzMl90KWF0bXBbN107CisgICAgcmV0dXJuIF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKilyZXMpOworfQorCit1aW50NjR4Ml90IHZwYWRkbHFfdTMyKHVpbnQzMng0X3QgYSk7IC8vIFZQQURETC5VMzIgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDY0eDJfdCB2cGFkZGxxX3UzMih1aW50MzJ4NF90IGEpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50MzJfdCBhdG1wWzRdOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50NjRfdCByZXNbMl07CisgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilhdG1wLCBhKTsKKyAgICByZXNbMF0gPSAodWludDY0X3QpYXRtcFswXSArICh1aW50NjRfdClhdG1wWzFdOworICAgIHJlc1sxXSA9ICh1aW50NjRfdClhdG1wWzJdICsgKHVpbnQ2NF90KWF0bXBbM107CisgICAgcmV0dXJuIF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKilyZXMpOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKiAgTG9uZyBwYWlyd2lzZSBhZGQgYW5kIGFjY3VtdWxhdGUgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9WUEFEQUwgKFZlY3RvciBQYWlyd2lzZSBBZGQgYW5kIEFjY3VtdWxhdGUgTG9uZykgYWRkcyBhZGphY2VudCBwYWlycyBvZiBlbGVtZW50cyBvZiBhIHZlY3RvciwKKy8vIGFuZCBhY2N1bXVsYXRlcyB0aGUgIHZhbHVlcyBvZiB0aGUgcmVzdWx0cyBpbnRvIHRoZSBlbGVtZW50cyBvZiB0aGUgZGVzdGluYXRpb24gKHdpZGUpIHZlY3RvcgoraW50MTZ4NF90IHZwYWRhbF9zOChpbnQxNng0X3QgYSwgIGludDh4OF90IGIpOyAvLyBWUEFEQUwuUzggZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZwYWRhbF9zOChpbnQxNng0X3QgYSwgIGludDh4OF90IGIpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KHZwYWRhbHFfczgoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCitpbnQzMngyX3QgdnBhZGFsX3MxNihpbnQzMngyX3QgYSwgIGludDE2eDRfdCBiKTsgLy8gVlBBREFMLlMxNiBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdnBhZGFsX3MxNihpbnQzMngyX3QgYSwgIGludDE2eDRfdCBiKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NCh2cGFkYWxxX3MxNihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKworaW50NjR4MV90IHZwYWRhbF9zMzIoaW50NjR4MV90IGEsIGludDMyeDJfdCBiKTsgLy8gVlBBREFMLlMzMiBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgxX3QgdnBhZGFsX3MzMihpbnQ2NHgxX3QgYSwgaW50MzJ4Ml90IGIpCit7CisgICAgaW50NjR4MV90IHJlczsKKyAgICByZXMubTY0X2k2NFswXSA9IChpbnQ2NF90KWIubTY0X2kzMlswXSArIChpbnQ2NF90KWIubTY0X2kzMlsxXSArIGEubTY0X2k2NFswXTsKKyAgICByZXR1cm4gcmVzOworfQorCit1aW50MTZ4NF90IHZwYWRhbF91OCh1aW50MTZ4NF90IGEsICB1aW50OHg4X3QgYik7IC8vIFZQQURBTC5VOCBkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZwYWRhbF91OCh1aW50MTZ4NF90IGEsICB1aW50OHg4X3QgYikKK3sKKyAgICB1aW50MTZ4NF90IHJlczY0OworICAgIHJldHVybjY0KHZwYWRhbHFfdTgoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK3VpbnQzMngyX3QgdnBhZGFsX3UxNih1aW50MzJ4Ml90IGEsICB1aW50MTZ4NF90IGIpOyAvLyBWUEFEQUwuczE2IGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdnBhZGFsX3UxNih1aW50MzJ4Ml90IGEsICB1aW50MTZ4NF90IGIpCit7CisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NCh2cGFkYWxxX3UxNihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKK3VpbnQ2NHgxX3QgdnBhZGFsX3UzMih1aW50NjR4MV90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZQQURBTC5VMzIgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDFfdCB2cGFkYWxfdTMyKHVpbnQ2NHgxX3QgYSwgdWludDMyeDJfdCBiKQoreworICAgIHVpbnQ2NHgxX3QgcmVzOworICAgIHJlcy5tNjRfdTY0WzBdID0gKHVpbnQ2NF90KWIubTY0X3UzMlswXSArICh1aW50NjRfdCliLm02NF91MzJbMV0gKyBhLm02NF91NjRbMF07CisgICAgcmV0dXJuIHJlczsKK30KKworaW50MTZ4OF90IHZwYWRhbHFfczgoaW50MTZ4OF90IGEsIGludDh4MTZfdCBiKTsgLy8gVlBBREFMLlM4IHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2cGFkYWxxX3M4KGludDE2eDhfdCBhLCBpbnQ4eDE2X3QgYikgLy8gVlBBREFMLlM4IHEwLHEwCit7CisgICAgaW50MTZ4OF90IHBhZDsKKyAgICBwYWQgPSB2cGFkZGxxX3M4KGIpOworICAgIHJldHVybiBfbW1fYWRkX2VwaTE2IChhLCBwYWQpOworfQorCitpbnQzMng0X3QgdnBhZGFscV9zMTYoaW50MzJ4NF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlBBREFMLlMxNiBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnBhZGFscV9zMTYoaW50MzJ4NF90IGEsIGludDE2eDhfdCBiKSAvLyBWUEFEQUwuUzE2IHEwLHEwCit7CisgICAgaW50MzJ4NF90IHBhZDsKKyAgICBwYWQgPSB2cGFkZGxxX3MxNihiKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGkzMihhLCBwYWQpOworfQorCitpbnQ2NHgyX3QgdnBhZGFscV9zMzIoaW50NjR4Ml90IGEsIGludDMyeDRfdCBiKTsgLy8gVlBBREFMLlMzMiBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgyX3QgdnBhZGFscV9zMzIoaW50NjR4Ml90IGEsIGludDMyeDRfdCBiKQoreworICAgIGludDY0eDJfdCBwYWQ7CisgICAgcGFkID0gdnBhZGRscV9zMzIoYik7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpNjQgKGEsIHBhZCk7Cit9CisKK3VpbnQxNng4X3QgdnBhZGFscV91OCh1aW50MTZ4OF90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZQQURBTC5VOCBxMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZwYWRhbHFfdTgodWludDE2eDhfdCBhLCB1aW50OHgxNl90IGIpIC8vIFZQQURBTC5VOCBxMCxxMAoreworICAgIHVpbnQxNng4X3QgcGFkOworICAgIHBhZCA9IHZwYWRkbHFfdTgoYik7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMTYgKGEsIHBhZCk7Cit9CisKK3VpbnQzMng0X3QgdnBhZGFscV91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWUEFEQUwuczE2IHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQzMng0X3QgdnBhZGFscV91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4OF90IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIHVpbnQzMng0X3QgcGFkOworICAgIHBhZCA9IHZwYWRkbHFfdTE2KGIpOworICAgIHJldHVybiBfbW1fYWRkX2VwaTMyKGEsIHBhZCk7Cit9IC8vbm8gb3B0aW1hbCBTSU1EIHNvbHV0aW9uLCBzZXJpYWwgaXMgZmFzdGVyCisKK3VpbnQ2NHgyX3QgdnBhZGFscV91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWUEFEQUwuVTMyIHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQ2NHgyX3QgdnBhZGFscV91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4NF90IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIC8vbm8gb3B0aW1hbCBTSU1EIHNvbHV0aW9uLCBzZXJpYWwgaXMgZmFzdGVyCisgICAgdWludDY0eDJfdCBwYWQ7CisgICAgcGFkID0gdnBhZGRscV91MzIoYik7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpNjQoYSwgcGFkKTsKK30gLy9ubyBvcHRpbWFsIFNJTUQgc29sdXRpb24sIHNlcmlhbCBpcyBmYXN0ZXIKKworLy8qKioqKioqKioqICBGb2xkaW5nIG1heGltdW0gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vVlBNQVggKFZlY3RvciBQYWlyd2lzZSBNYXhpbXVtKSBjb21wYXJlcyBhZGphY2VudCBwYWlycyBvZiBlbGVtZW50cyBpbiB0d28gdmVjdG9ycywKKy8vYW5kIGNvcGllcyB0aGUgbGFyZ2VyIG9mIGVhY2ggcGFpciBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaW4gdGhlIGRlc3RpbmF0aW9uCisvLyAgICBubyBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uYWxpdHkgaW4gSUEzMiBTSU1ELCBzbyB3ZSBuZWVkIHRvIGRvIHRoZSB2ZXJ0aWNhbCBjb21wYXJpc29uCitpbnQ4eDhfdCB2cG1heF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlBNQVguUzggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdnBtYXhfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgLy8gVlBNQVguUzggZDAsZDAsZDAKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIGFiLCBhYjEsIG1heDsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrOF9zYWJbMTZdID0geyAxLCAwLCAzLCAyLCA1LCA0LCA3LCA2LCA5LCA4LCAxMSwgMTAsIDEzLCAxMiwgMTUsIDE0fTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrOF9vZGRbMTZdID0geyAxLCAzLCAgNSwgIDcsIDksIDExLCAxMywgMTUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworICAgIGFiID0gX21tX3VucGFja2xvX2VwaTY0ICggX3BNMTI4aShhKSwgX3BNMTI4aShiKSk7IC8vYWIKKyAgICBhYjEgPSBfbW1fc2h1ZmZsZV9lcGk4IChhYiwgKihfX20xMjhpKikgbWFzazhfc2FiKTsgLy9ob3Jpc29udGFsIHBhaXJzIHN3YXAgZm9yIHZlcnRpY2FsIG1heCBmaW5kaW5nCisgICAgbWF4ID0gX01NX01BWF9FUEk4IChhYiwgYWIxKTsgLy8gU1NFNC4xCisgICAgbWF4ID0gX21tX3NodWZmbGVfZXBpOCAobWF4LCAqKF9fbTEyOGkqKSBtYXNrOF9vZGQpOyAvL3JlbW92ZSByZXBldGl0aXZlIGRhdGEKKyAgICByZXR1cm42NChtYXgpOyAvL3dlIG5lZWQgNjQgYml0cyBvbmx5Cit9CisKK2ludDE2eDRfdCB2cG1heF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlBNQVguUzE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2cG1heF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKSAvLyBWUE1BWC5TMTYgZDAsZDAsZDAKK3sKKyAgICAvL3NvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbCBjb21wYXJlZCB3aXRoIHRoZSBzZXJpYWwgb25lCisgICAgaW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgYWIsIGFiMSwgbWF4OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazE2X3NhYlsxNl0gPSB7IDIsIDMsIDAsIDEsIDYsIDcsIDQsIDUsIDEwLCAxMSwgOCwgOSwgMTQsIDE1LCAxMiwgMTN9OyAvL2VhY2ggY2hhcnMgcGFpciBpcyBjb25zaWRlcmQgdG8gYmUgMTYgYml0IG51bWJlcgorICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazE2X29kZFsxNl0gPSB7IDAsMSwgNCw1LCA4LDksIDEyLDEzLCAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CisgICAgYWIgPSBfbW1fdW5wYWNrbG9fZXBpNjQgKCBfcE0xMjhpKGEpLCAgX3BNMTI4aShiKSk7IC8vYWIKKyAgICBhYjEgPSBfbW1fc2h1ZmZsZV9lcGk4IChhYiwgKihfX20xMjhpKikgbWFzazE2X3NhYik7IC8vaG9yaXNvbnRhbCBwYWlycyBzd2FwIGZvciB2ZXJ0aWNhbCBtYXggZmluZGluZywgdXNlIDhiaXQgZm4gYW5kIHRoZSBjb3JyZXNwb25kaW5nIG1hc2sKKyAgICBtYXggPSBfbW1fbWF4X2VwaTE2IChhYiwgYWIxKTsKKyAgICBtYXggPSAgX21tX3NodWZmbGVfZXBpOCAobWF4LCAqKF9fbTEyOGkqKSBtYXNrMTZfb2RkKTsgLy9yZW1vdmUgcmVwZXRpdGl2ZSBkYXRhLCB1c2UgOGJpdCBmbiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbWFzaworICAgIHJldHVybjY0KG1heCk7Cit9CisKK2ludDMyeDJfdCB2cG1heF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlBNQVguUzMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDMyeDJfdCB2cG1heF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgLy9zZXJpYWwgc29sdXRpb24gbG9va3MgZmFzdGVyIHRoYW4gU0lNRCBvbmUKKyAgICBpbnQzMngyX3QgcmVzOworICAgIHJlcy5tNjRfaTMyWzBdID0gKGEubTY0X2kzMlswXSA8IGEubTY0X2kzMlsxXSkgPyBhLm02NF9pMzJbMV0gOiBhLm02NF9pMzJbMF07CisgICAgcmVzLm02NF9pMzJbMV0gPSAoYi5tNjRfaTMyWzBdIDwgYi5tNjRfaTMyWzFdKSA/IGIubTY0X2kzMlsxXSA6IGIubTY0X2kzMlswXTsKKyAgICByZXR1cm4gcmVzOworfQorCit1aW50OHg4X3QgdnBtYXhfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlBNQVguVTggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZwbWF4X3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYikgLy8gVlBNQVguVTggZDAsZDAsZDAKK3sKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBhYiwgYWIxLCBtYXg7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrOF9zYWJbMTZdID0geyAxLCAwLCAzLCAyLCA1LCA0LCA3LCA2LCA5LCA4LCAxMSwgMTAsIDEzLCAxMiwgMTUsIDE0fTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrOF9vZGRbMTZdID0geyAxLCAzLCAgNSwgIDcsIDksIDExLCAxMywgMTUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworICAgIGFiID0gX21tX3VucGFja2xvX2VwaTY0IChfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKTsgLy9hYgorICAgIGFiMSA9IF9tbV9zaHVmZmxlX2VwaTggKGFiLCAqKF9fbTEyOGkqKSBtYXNrOF9zYWIpOyAvL2hvcmlzb250YWwgcGFpcnMgc3dhcCBmb3IgdmVydGljYWwgbWF4IGZpbmRpbmcKKyAgICBtYXggPSBfbW1fbWF4X2VwdTggKGFiLCBhYjEpOyAvLyBTU0U0LjEKKyAgICBtYXggPSBfbW1fc2h1ZmZsZV9lcGk4IChtYXgsICooX19tMTI4aSopIG1hc2s4X29kZCk7IC8vcmVtb3ZlIHJlcGV0aXRpdmUgZGF0YQorICAgIHJldHVybjY0KG1heCk7Cit9CisKK3VpbnQxNng0X3QgdnBtYXhfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlBNQVguczE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdnBtYXhfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKSAvLyBWUE1BWC5zMTYgZDAsZDAsZDAKK3sKKyAgICAvL3NvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbCBjb21wYXJlZCB3aXRoIHRoZSBzZXJpYWwgb25lCisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIGFiLCBhYjEsIG1heDsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrMTZfc2FiWzE2XSA9IHsgMiwgMywgMCwgMSwgNiwgNywgNCwgNSwgMTAsIDExLCA4LCA5LCAxNCwgMTUsIDEyLCAxM307IC8vZWFjaCBjaGFycyBwYWlyIGlzIGNvbnNpZGVyZCB0byBiZSAxNiBiaXQgbnVtYmVyCisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ4X3QgbWFzazE2X29kZFsxNl0gPSB7IDAsMSwgNCw1LCA4LDksIDEyLDEzLCAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CisgICAgYWIgPSBfbW1fdW5wYWNrbG9fZXBpNjQgKCBfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKTsgLy9hYgorICAgIGFiMSA9IF9tbV9zaHVmZmxlX2VwaTggKGFiLCAqKF9fbTEyOGkqKSBtYXNrMTZfc2FiKTsgLy9ob3Jpc29udGFsIHBhaXJzIHN3YXAgZm9yIHZlcnRpY2FsIG1heCBmaW5kaW5nLCB1c2UgOGJpdCBmbiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbWFzaworICAgIG1heCA9IF9NTV9NQVhfRVBVMTYgKGFiLCBhYjEpOworICAgIG1heCA9IF9tbV9zaHVmZmxlX2VwaTggKG1heCwgKihfX20xMjhpKikgbWFzazE2X29kZCk7IC8vcmVtb3ZlIHJlcGV0aXRpdmUgZGF0YSwgdXNlIDhiaXQgZm4gYW5kIHRoZSBjb3JyZXNwb25kaW5nIG1hc2sKKyAgICByZXR1cm42NChtYXgpOworfQorCit1aW50MzJ4Ml90IHZwbWF4X3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYik7IC8vIFZQTUFYLlUzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50MzJ4Ml90IHZwbWF4X3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIC8vc2VyaWFsIHNvbHV0aW9uIGxvb2tzIGZhc3RlciB0aGFuIFNJTUQgb25lCisgICAgdWludDMyeDJfdCByZXM7CisgICAgcmVzLm02NF9pMzJbMF0gPSAoYS5tNjRfaTMyWzBdIDwgYS5tNjRfaTMyWzFdKSA/IGEubTY0X2kzMlsxXSA6IGEubTY0X2kzMlswXTsKKyAgICByZXMubTY0X2kzMlsxXSA9IChiLm02NF9pMzJbMF0gPCBiLm02NF9pMzJbMV0pID8gYi5tNjRfaTMyWzFdIDogYi5tNjRfaTMyWzBdOworICAgIHJldHVybiByZXM7Cit9IC8vc2VyaWFsIHNvbHV0aW9uIGxvb2tzIGZhc3RlciB0aGFuIGEgU0lNRCBvbmUKKworZmxvYXQzMngyX3QgdnBtYXhfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWUE1BWC5GMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoZmxvYXQzMngyX3QgdnBtYXhfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIC8vc2VyaWFsIHNvbHV0aW9uIGxvb2tzIGZhc3RlciB0aGFuICBTSU1EIG9uZQorICAgIGZsb2F0MzJ4Ml90IHJlczsKKyAgICByZXMubTY0X2YzMlswXSA9IChhLm02NF9mMzJbMF0gPCBhLm02NF9mMzJbMV0pID8gYS5tNjRfZjMyWzFdIDogYS5tNjRfZjMyWzBdOworICAgIHJlcy5tNjRfZjMyWzFdID0gKGIubTY0X2YzMlswXSA8IGIubTY0X2YzMlsxXSkgPyBiLm02NF9mMzJbMV0gOiBiLm02NF9mMzJbMF07CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gKioqKioqKioqKioqKioqKiogRm9sZGluZyBtaW5pbXVtICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy92cG1pbiAtPiB0YWtlcyBtaW5pbXVtIG9mIGFkamFjZW50IHBhaXJzCitpbnQ4eDhfdCB2cG1pbl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlBNSU4uUzggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdnBtaW5fczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgLy8gVlBNSU4uUzggZDAsZDAsZDAKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIGFiLCBhYjEsIG1pbjsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrOF9zYWJbMTZdID0geyAxLCAwLCAzLCAyLCA1LCA0LCA3LCA2LCA5LCA4LCAxMSwgMTAsIDEzLCAxMiwgMTUsIDE0fTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrOF9vZGRbMTZdID0geyAxLCAzLCAgNSwgIDcsIDksIDExLCAxMywgMTUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworICAgIGFiID0gX21tX3VucGFja2xvX2VwaTY0ICggX3BNMTI4aShhKSwgX3BNMTI4aShiKSk7IC8vYWIKKyAgICBhYjEgPSBfbW1fc2h1ZmZsZV9lcGk4IChhYiwgKihfX20xMjhpKikgbWFzazhfc2FiKTsgLy9ob3Jpc29udGFsIHBhaXJzIHN3YXAgZm9yIHZlcnRpY2FsIG1pbiBmaW5kaW5nCisgICAgbWluID0gIF9NTV9NSU5fRVBJOCAoYWIsIGFiMSk7IC8vIFNTRTQuMQorICAgIG1pbiA9ICBfbW1fc2h1ZmZsZV9lcGk4IChtaW4sICooX19tMTI4aSopIG1hc2s4X29kZCk7IC8vcmVtb3ZlIHJlcGV0aXRpdmUgZGF0YQorICAgIHJldHVybjY0KG1pbik7Cit9CisKK2ludDE2eDRfdCB2cG1pbl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlBNSU4uUzE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2cG1pbl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKSAvLyBWUE1JTi5TMTYgZDAsZDAsZDAKK3sKKyAgICAvL3NvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbCBjb21wYXJlZCB3aXRoIHRoZSBzZXJpYWwgb25lCisgICAgaW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgYWIsIGFiMSwgbWluOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazE2X3NhYlsxNl0gPSB7IDIsIDMsIDAsIDEsIDYsIDcsIDQsIDUsIDEwLCAxMSwgOCwgOSwgMTQsIDE1LCAxMiwgMTN9OyAvL2VhY2ggY2hhcnMgcGFpciBpcyBjb25zaWRlcmQgdG8gYmUgMTYgYml0IG51bWJlcgorICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazE2X29kZFsxNl0gPSB7IDAsMSwgNCw1LCA4LDksIDEyLDEzLCAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CisgICAgYWIgPSBfbW1fdW5wYWNrbG9fZXBpNjQgKCAgX3BNMTI4aShhKSwgIF9wTTEyOGkoYikpOyAvL2FiCisgICAgYWIxID0gX21tX3NodWZmbGVfZXBpOCAoYWIsICooX19tMTI4aSopIG1hc2sxNl9zYWIpOyAvL2hvcmlzb250YWwgcGFpcnMgc3dhcCBmb3IgdmVydGljYWwgbWF4IGZpbmRpbmcsIHVzZSA4Yml0IGZuIGFuZCB0aGUgY29ycmVzcG9uZGluZyBtYXNrCisgICAgbWluID0gX21tX21pbl9lcGkxNiAoYWIsIGFiMSk7CisgICAgbWluID0gX21tX3NodWZmbGVfZXBpOCAobWluLCAqKF9fbTEyOGkqKSBtYXNrMTZfb2RkKTsgLy9yZW1vdmUgcmVwZXRpdGl2ZSBkYXRhLCB1c2UgOGJpdCBmbiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbWFzaworICAgIHJldHVybjY0KG1pbik7Cit9CisKK2ludDMyeDJfdCB2cG1pbl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlBNSU4uUzMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDMyeDJfdCB2cG1pbl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgLy9zZXJpYWwgc29sdXRpb24gbG9va3MgZmFzdGVyIHRoYW4gU0lNRCBvbmUKKyAgICBpbnQzMngyX3QgcmVzOworICAgIHJlcy5tNjRfaTMyWzBdID0gKGEubTY0X2kzMlswXSA+IGEubTY0X2kzMlsxXSkgPyBhLm02NF9pMzJbMV0gOiBhLm02NF9pMzJbMF07CisgICAgcmVzLm02NF9pMzJbMV0gPSAoYi5tNjRfaTMyWzBdID4gYi5tNjRfaTMyWzFdKSA/IGIubTY0X2kzMlsxXSA6IGIubTY0X2kzMlswXTsKKyAgICByZXR1cm4gcmVzOworfQorCit1aW50OHg4X3QgdnBtaW5fdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlBNSU4uVTggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZwbWluX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYikgLy8gVlBNSU4uVTggZDAsZDAsZDAKK3sKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBhYiwgYWIxLCBtaW47CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ4X3QgbWFzazhfc2FiWzE2XSA9IHsgMSwgMCwgMywgMiwgNSwgNCwgNywgNiwgOSwgOCwgMTEsIDEwLCAxMywgMTIsIDE1LCAxNH07CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ4X3QgbWFzazhfb2RkWzE2XSA9IHsgMSwgMywgIDUsICA3LCA5LCAxMSwgMTMsIDE1LCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKKyAgICBhYiA9IF9tbV91bnBhY2tsb19lcGk2NCAoICBfcE0xMjhpKGEpLCAgX3BNMTI4aShiKSk7IC8vYWIKKyAgICBhYjEgPSBfbW1fc2h1ZmZsZV9lcGk4IChhYiwgKihfX20xMjhpKikgbWFzazhfc2FiKTsgLy9ob3Jpc29udGFsIHBhaXJzIHN3YXAgZm9yIHZlcnRpY2FsIG1heCBmaW5kaW5nCisgICAgbWluID0gX21tX21pbl9lcHU4IChhYiwgYWIxKTsgLy8gU1NFNC4xCisgICAgbWluID0gX21tX3NodWZmbGVfZXBpOCAobWluLCAqKF9fbTEyOGkqKSBtYXNrOF9vZGQpOyAvL3JlbW92ZSByZXBldGl0aXZlIGRhdGEKKyAgICByZXR1cm42NChtaW4pOworfQorCit1aW50MTZ4NF90IHZwbWluX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZQTUlOLnMxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZwbWluX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYikgLy8gVlBNSU4uczE2IGQwLGQwLGQwCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCB0aGUgc2VyaWFsIG9uZQorICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSBhYiwgYWIxLCBtaW47CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ4X3QgbWFzazE2X3NhYlsxNl0gPSB7IDIsIDMsIDAsIDEsIDYsIDcsIDQsIDUsIDEwLCAxMSwgOCwgOSwgMTQsIDE1LCAxMiwgMTN9OyAvL2VhY2ggY2hhcnMgcGFpciBpcyBjb25zaWRlcmQgdG8gYmUgMTYgYml0IG51bWJlcgorICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50OF90IG1hc2sxNl9vZGRbMTZdID0geyAwLDEsIDQsNSwgOCw5LCAxMiwxMywgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworICAgIGFiID0gX21tX3VucGFja2xvX2VwaTY0ICggX3BNMTI4aShhKSwgIF9wTTEyOGkoYikpOyAvL2FiCisgICAgYWIxID0gX21tX3NodWZmbGVfZXBpOCAoYWIsICooX19tMTI4aSopIG1hc2sxNl9zYWIpOyAvL2hvcmlzb250YWwgcGFpcnMgc3dhcCBmb3IgdmVydGljYWwgbWluIGZpbmRpbmcsIHVzZSA4Yml0IGZuIGFuZCB0aGUgY29ycmVzcG9uZGluZyBtYXNrCisgICAgbWluID0gX01NX01JTl9FUFUxNiAoYWIsIGFiMSk7CisgICAgbWluID0gICAgX21tX3NodWZmbGVfZXBpOCAobWluLCAqKF9fbTEyOGkqKSBtYXNrMTZfb2RkKTsgLy9yZW1vdmUgcmVwZXRpdGl2ZSBkYXRhLCB1c2UgOGJpdCBmbiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbWFzaworICAgIHJldHVybjY0KG1pbik7Cit9CisKK3VpbnQzMngyX3QgdnBtaW5fdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVlBNSU4uVTMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQzMngyX3QgdnBtaW5fdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgLy9zZXJpYWwgc29sdXRpb24gbG9va3MgZmFzdGVyIHRoYW4gU0lNRCBvbmUKKyAgICB1aW50MzJ4Ml90IHJlczsKKyAgICByZXMubTY0X3UzMlswXSA9IChhLm02NF91MzJbMF0gPiBhLm02NF91MzJbMV0pID8gYS5tNjRfdTMyWzFdIDogYS5tNjRfdTMyWzBdOworICAgIHJlcy5tNjRfdTMyWzFdID0gKGIubTY0X3UzMlswXSA+IGIubTY0X3UzMlsxXSkgPyBiLm02NF91MzJbMV0gOiBiLm02NF91MzJbMF07CisgICAgcmV0dXJuIHJlczsKK30KKworZmxvYXQzMngyX3QgdnBtaW5fZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWUE1JTi5GMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoZmxvYXQzMngyX3QgdnBtaW5fZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIC8vc2VyaWFsIHNvbHV0aW9uIGxvb2tzIGZhc3RlciB0aGFuIFNJTUQgb25lCisgICAgZmxvYXQzMngyX3QgcmVzOworICAgIHJlcy5tNjRfZjMyWzBdID0gKGEubTY0X2YzMlswXSA+IGEubTY0X2YzMlsxXSkgPyBhLm02NF9mMzJbMV0gOiBhLm02NF9mMzJbMF07CisgICAgcmVzLm02NF9mMzJbMV0gPSAoYi5tNjRfZjMyWzBdID4gYi5tNjRfZjMyWzFdKSA/IGIubTY0X2YzMlsxXSA6IGIubTY0X2YzMlswXTsKKyAgICByZXR1cm4gcmVzOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKiAgUmVjaXByb2NhbC9TcXJ0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqIFJlY2lwcm9jYWwgZXN0aW1hdGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy90aGUgQVJNIE5FT04gYW5kIHg4NiBTSU1EIHJlc3VsdHMgbWF5IGJlIHNsaWdodGx5IGRpZmZlcmVudAorZmxvYXQzMngyX3QgdnJlY3BlX2YzMihmbG9hdDMyeDJfdCBhKTsgLy8gVlJFQ1BFLkYzMiBkMCxkMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2cmVjcGVfZjMyKGZsb2F0MzJ4Ml90IGEpIC8vdXNlIGxvdyA2NCBiaXRzCit7CisgICAgZmxvYXQzMng0X3QgcmVzOworICAgIF9fbTY0XzEyOCByZXM2NDsKKyAgICByZXMgPSBfbW1fcmNwX3BzKF9wTTEyOChhKSk7CisgICAgX002NGYocmVzNjQsIHJlcyk7CisgICAgcmV0dXJuIHJlczY0OworfQorCit1aW50MzJ4Ml90IHZyZWNwZV91MzIodWludDMyeDJfdCBhKTsgLy8gVlJFQ1BFLlUzMiBkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50MzJ4Ml90IHZyZWNwZV91MzIodWludDMyeDJfdCBhKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICAvL0lucHV0IGlzICBmaXhlZCBwb2ludCBudW1iZXIhISEgTm8gcmVjaXByb2NhbCBmb3IgaW50cyBpbiBJQTMyIGF2YWlsYWJsZQorICAgIHVpbnQzMngyX3QgcmVzOworICAgIGZsb2F0IHJlc2YsIHI7CisgICAgaW50IGksIHEsIHM7CisgICAgZm9yIChpID0wOyBpPDI7IGkrKyl7CisgICAgICAgIGlmKChhLm02NF91MzJbaV0gJiAweDgwMDAwMDAwKSA9PSAwKSB7CisgICAgICAgICAgICByZXMubTY0X3UzMltpXSA9IDB4ZmZmZmZmZmY7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgcmVzZiA9ICAoZmxvYXQpIChhLm02NF91MzJbaV0gKiAoMC41ZiAvICh1aW50MzJfdCkoMSA8PCAzMSkpKTsKKyAgICAgICAgICAgIHEgPSAoaW50KShyZXNmICogNTEyLjApOyAvKiBhIGluIHVuaXRzIG9mIDEvNTEyIHJvdW5kZWQgZG93biAqLworICAgICAgICAgICAgciA9IDEuMCAvICgoKGZsb2F0KXEgKyAwLjUpIC8gNTEyLjApOyAvKiByZWNpcHJvY2FsIHIgKi8KKyAgICAgICAgICAgIHMgPSAoaW50KSgyNTYuMCAqIHIgKyAwLjUpOyAvKiByIGluIHVuaXRzIG9mIDEvMjU2IHJvdW5kZWQgdG8gbmVhcmVzdCAqLworICAgICAgICAgICAgciA9ICAoZmxvYXQpcyAvIDI1Ni4wOworICAgICAgICAgICAgcmVzLm02NF91MzJbaV0gPSByICogKHVpbnQzMl90KSgxIDw8IDMxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitmbG9hdDMyeDRfdCB2cmVjcGVxX2YzMihmbG9hdDMyeDRfdCBhKTsgLy8gVlJFQ1BFLkYzMiBxMCxxMAorI2RlZmluZSB2cmVjcGVxX2YzMiBfbW1fcmNwX3BzCisKKwordWludDMyeDRfdCB2cmVjcGVxX3UzMih1aW50MzJ4NF90IGEpOyAvLyBWUkVDUEUuVTMyIHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQzMng0X3QgdnJlY3BlcV91MzIodWludDMyeDRfdCBhKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICAvL0lucHV0IGlzICBmaXhlZCBwb2ludCBudW1iZXIhISEKKyAgICAvL1dlIGltcGxlbWVudCB0aGUgcmVjaXBfZXN0aW1hdGUgZnVuY3Rpb24gYXMgZGVzY3JpYmVkIGluIEFSTXY3IHJlZmVyZW5jZSBtYW51YWwgKFZSRUNQRSBpbnN0cnVjdGlvbikgYnV0IHVzZSBmbG9hdCBpbnN0ZWFkIG9mIGRvdWJsZQorICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50MzJfdCBhdG1wWzRdOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50MzJfdCByZXNbNF07CisgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50IGM4MDAwMDAwMFs0XSA9IHsweDgwMDAwMDAwLDB4ODAwMDAwMDAsIDB4ODAwMDAwMDAsMHg4MDAwMDAwMH07CisgICAgZmxvYXQgcmVzZiwgcjsKKyAgICBpbnQgaSwgcSwgczsKKyAgX19tMTI4aSByZXMxMjgsIG1hc2ssIHplcm87CisgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilhdG1wLCBhKTsKKyAgICB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICBmb3IgKGkgPTA7IGk8NDsgaSsrKXsKKyAgICAgICAgcmVzZiA9IChhdG1wW2ldICogKDAuNWYgLyAodWludDMyX3QpICgxIDw8IDMxKSkpOyAgLy8gIDIuMzI4MzA2NDM2NTM4Njk2M0UtMTAgfigwLjVmIC8gKHVpbnQzMl90KSAoMSA8PCAzMSkpCisgICAgICAgIHEgPSAoaW50KShyZXNmICogNTEyLjApOyAvKiBhIGluIHVuaXRzIG9mIDEvNTEyIHJvdW5kZWQgZG93biAqLworICAgICAgICByID0gMS4wIC8gKCgoZmxvYXQpcSArIDAuNSkgLyA1MTIuMCk7IC8qIHJlY2lwcm9jYWwgciAqLworICAgICAgICBzID0gKGludCkoMjU2LjAgKiByICsgMC41KTsgLyogciBpbiB1bml0cyBvZiAxLzI1NiByb3VuZGVkIHRvIG5lYXJlc3QgKi8KKyAgICAgICAgciA9ICAoZmxvYXQpcyAvIDI1Ni4wOworICAgICAgICByZXNbaV0gPSAodWludDMyX3QpIChyICogKCgodWludDMyX3QpMSkgPDwgMzEpICk7CisgICAgfQorICAgIHJlczEyOCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKilyZXMpOworICAgIG1hc2sgPSBfbW1fYW5kX3NpMTI4KGEsICooX19tMTI4aSopYzgwMDAwMDAwKTsKKyAgICBtYXNrID0gX21tX2NtcGVxX2VwaTMyKHplcm8sIG1hc2spOyAgLy8weGZmZmZmZmZmIGlmIGF0bXBbaV0gPD0gMHg3ZmZmZmZmZgorICAgIHJldHVybiBfbW1fb3Jfc2kxMjgocmVzMTI4LCBtYXNrKTsKK30KKworLy8qKioqKioqKioqUmVjaXByb2NhbCBzcXVhcmUgcm9vdCBlc3RpbWF0ZSAqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vbm8gcmVjaXByb2NhbCBzcXVhcmUgcm9vdCBmb3IgaW50cyBpbiBJQTMyIGF2YWlsYWJsZSwgbmVpdGhlciBmb3IgdW5zaWduZWQgaW50IHRvIGZsb2F0NCBsYW5lcyBjb252ZXJzaW9uLCBzbyBhIHNlcmlhbCBzb2x1dGlvbiBsb29rcyBmYXN0ZXIKKy8vYnV0IHRoZSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIGZvciB2cnNxcnRlX3UzMiBtYXkgdmFyeSBmb3IgdmFyaW91cyBBUk0gY29tcGlsZXJzCisvLy8vdGhlIEFSTSBORU9OIGFuZCB4ODYgU0lNRCByZXN1bHRzIG1heSBiZSBzbGlnaHRseSBkaWZmZXJlbnQKK2Zsb2F0MzJ4Ml90IHZyc3FydGVfZjMyKGZsb2F0MzJ4Ml90IGEpOyAvLyBWUlNRUlRFLkYzMiBkMCxkMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2cnNxcnRlX2YzMihmbG9hdDMyeDJfdCBhKSAvL3VzZSBsb3cgNjQgYml0cworeworICAgIGZsb2F0MzJ4NF90IHJlczsKKyAgICBfX202NF8xMjggcmVzNjQ7CisgICAgcmVzID0gX21tX3JzcXJ0X3BzKF9wTTEyOChhKSk7CisgICAgX002NGYocmVzNjQsIHJlcyk7CisgICAgcmV0dXJuIHJlczY0OworfQorCit1aW50MzJ4Ml90IHZyc3FydGVfdTMyKHVpbnQzMngyX3QgYSk7IC8vIFZSU1FSVEUuVTMyIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQzMngyX3QgdnJzcXJ0ZV91MzIodWludDMyeDJfdCBhKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICAvL0lucHV0IGlzICBmaXhlZCBwb2ludCBudW1iZXIhISEKKyAgICAvL1dlIGltcGxlbWVudCB0aGUgcmVjaXBfc3FydF9lc3RpbWF0ZSBmdW5jdGlvbiBhcyBkZXNjcmliZWQgaW4gQVJNdjcgcmVmZXJlbmNlIG1hbnVhbCAoVlJTUVJURSBpbnN0cnVjdGlvbikgYnV0IHVzZSBmbG9hdCBpbnN0ZWFkIG9mIGRvdWJsZQorICAgdWludDMyeDJfdCByZXM7CisgICBfX20xMjggdG1wOworICAgIGZsb2F0IHIsIHJlc2YsIGNvZWZmOworICAgIGludCBpLHEwLCBxMSwgczs7CisgICAgZm9yIChpID0wOyBpPDI7IGkrKyl7CisgICAgICAgIGlmKChhLm02NF91MzJbaV0gJiAweGMwMDAwMDAwKSA9PSAwKSB7IC8vYSA8PTB4M2ZmZmZmZmYKKyAgICAgICAgICAgIHJlcy5tNjRfdTMyW2ldID0gMHhmZmZmZmZmZjsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICByZXNmID0gIChmbG9hdCkgKGEubTY0X3UzMltpXSAqICgwLjVmIC8gKHVpbnQzMl90KSgxIDw8IDMxKSkpOworICAgICAgICAgICAgY29lZmYgPSAocmVzZiA8IDAuNSk/IDUxMi4wIDogMjU2LjAgOyAvKiByYW5nZSAwLjI1IDw9IHJlc2YgPCAwLjUgIG9yIHJhbmdlIDAuNSA8PSByZXNmIDwgMS4wKi8KKyAgICAgICAgICAgIHEwID0gKGludCkocmVzZiAqIGNvZWZmKTsgLyogYSBpbiB1bml0cyBvZiAxLzUxMiByb3VuZGVkIGRvd24gKi8KKyAgICAgICAgICAgIHIgPSAoKGZsb2F0KXEwICsgMC41KSAvIGNvZWZmOworICAgICAgICAgICAgdG1wID0gX21tX3JzcXJ0X3NzKF9tbV9sb2FkX3NzKCAmcikpOy8qIHJlY2lwcm9jYWwgcm9vdCByICovCisgICAgICAgICAgICBfbW1fc3RvcmVfc3MoJnIsIHRtcCk7CisgICAgICAgICAgICBzID0gKGludCkoMjU2LjAgKiByICsgMC41KTsgLyogciBpbiB1bml0cyBvZiAxLzI1NiByb3VuZGVkIHRvIG5lYXJlc3QgKi8KKyAgICAgICAgICAgIHIgPSAoZmxvYXQpcyAvIDI1Ni4wOworICAgICAgICAgICAgcmVzLm02NF91MzJbaV0gPSByICogKCgodWludDMyX3QpMSkgPDwgMzEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK2Zsb2F0MzJ4NF90IHZyc3FydGVxX2YzMihmbG9hdDMyeDRfdCBhKTsgLy8gVlJTUVJURS5GMzIgcTAscTAKKyNkZWZpbmUgdnJzcXJ0ZXFfZjMyIF9tbV9yc3FydF9wcworCit1aW50MzJ4NF90IHZyc3FydGVxX3UzMih1aW50MzJ4NF90IGEpOyAvLyBWUlNRUlRFLlUzMiBxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50MzJ4NF90IHZyc3FydGVxX3UzMih1aW50MzJ4NF90IGEpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIC8vSW5wdXQgaXMgIGZpeGVkIHBvaW50IG51bWJlciEhIQorICAgIC8vV2UgaW1wbGVtZW50IHRoZSByZWNpcF9zcXJ0X2VzdGltYXRlIGZ1bmN0aW9uIGFzIGRlc2NyaWJlZCBpbiBBUk12NyByZWZlcmVuY2UgbWFudWFsIChWUlNRUlRFIGluc3RydWN0aW9uKSBidXQgdXNlIGZsb2F0IGluc3RlYWQgb2YgZG91YmxlCisgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDMyX3QgIGF0bXBbNF0sIHJlc1s0XTsKKyAgIF9ORU9OMlNTRV9BTElHTl8xNiBmbG9hdCBjMV8zMVs0XSA9IHsoZmxvYXQpKCgodWludDMyX3QpMSkgPDwgMzEpLCAoZmxvYXQpKCgodWludDMyX3QpMSkgPDwgMzEpLChmbG9hdCkoKCh1aW50MzJfdCkxKSA8PCAzMSksIChmbG9hdCkoKCh1aW50MzJfdCkxKSA8PCAzMSl9OworICAgX05FT04yU1NFX0FMSUdOXzE2IGludCBjX2MwMDAwMDAwWzRdID0gezB4YzAwMDAwMDAsMHhjMDAwMDAwMCwgMHhjMDAwMDAwMCwweGMwMDAwMDAwfTsKKyAgX19tMTI4IHRtcDsKKyAgX19tMTI4aSByZXMxMjgsIG1hc2ssIHplcm87CisgICAgZmxvYXQgciwgcmVzZiwgY29lZmY7CisgICAgaW50IGkscTAsIHExLCBzOworICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopYXRtcCwgYSk7CisgICAgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgZm9yIChpID0wOyBpPDQ7IGkrKyl7CisgICAgICAgIHJlc2YgPSAgKGZsb2F0KSAoYXRtcFtpXSAqICgwLjVmIC8gKHVpbnQzMl90KSgxIDw8IDMxKSkpOworICAgICAgICBjb2VmZiA9IChyZXNmIDwgMC41KT8gNTEyLjAgOiAyNTYuMCA7IC8qIHJhbmdlIDAuMjUgPD0gcmVzZiA8IDAuNSAgb3IgcmFuZ2UgMC41IDw9IHJlc2YgPCAxLjAqLworICAgICAgICBxMCA9IChpbnQpKHJlc2YgKiBjb2VmZik7IC8qIGEgaW4gdW5pdHMgb2YgMS81MTIgcm91bmRlZCBkb3duICovCisgICAgICAgIHIgPSAoKGZsb2F0KXEwICsgMC41KSAvIGNvZWZmOworICAgICAgICB0bXAgPSBfbW1fcnNxcnRfc3MoX21tX2xvYWRfc3MoICZyKSk7LyogcmVjaXByb2NhbCByb290IHIgKi8KKyAgICAgICAgX21tX3N0b3JlX3NzKCZyLCB0bXApOworICAgICAgICBzID0gKGludCkoMjU2LjAgKiByICsgMC41KTsgLyogciBpbiB1bml0cyBvZiAxLzI1NiByb3VuZGVkIHRvIG5lYXJlc3QgKi8KKyAgICAgICAgciA9IChmbG9hdClzIC8gMjU2LjA7CisgICAgICAgIHJlc1tpXSA9ICh1aW50MzJfdCkgKHIgKiAoKCh1aW50MzJfdCkxKSA8PCAzMSkgKTsKKyAgICB9CisgICAgcmVzMTI4ID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKXJlcyk7CisgICAgbWFzayA9IF9tbV9hbmRfc2kxMjgoYSwgKihfX20xMjhpKiljX2MwMDAwMDAwKTsKKyAgICBtYXNrID0gX21tX2NtcGVxX2VwaTMyKHplcm8sIG1hc2spOyAgLy8weGZmZmZmZmZmIGlmIGF0bXBbaV0gPD0gMHgzZmZmZmZmZgorICAgIHJldHVybiBfbW1fb3Jfc2kxMjgocmVzMTI4LCBtYXNrKTsKK30KKy8vKioqKioqKioqKioqIFJlY2lwcm9jYWwgZXN0aW1hdGUvc3RlcCBhbmQgMS9zcXJ0IGVzdGltYXRlL3N0ZXAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKipWUkVDUFMgKFZlY3RvciBSZWNpcHJvY2FsIFN0ZXApICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9tdWx0aXBsaWVzIHRoZSBlbGVtZW50cyBvZiBvbmUgdmVjdG9yIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIGFub3RoZXIgdmVjdG9yLAorLy9zdWJ0cmFjdHMgZWFjaCBvZiB0aGUgcmVzdWx0cyBmcm9tIDIsIGFuZCBwbGFjZXMgdGhlIGZpbmFsIHJlc3VsdHMgaW50byB0aGUgZWxlbWVudHMgb2YgdGhlIGRlc3RpbmF0aW9uIHZlY3Rvci4KKworZmxvYXQzMngyX3QgdnJlY3BzX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKTsgLy8gVlJFQ1BTLkYzMiBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZyZWNwc19mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikKK3sKKyAgICBmbG9hdDMyeDRfdCByZXM7CisgICAgX19tNjRfMTI4IHJlczY0OworICAgIHJlcyA9IHZyZWNwc3FfZjMyKF9wTTEyOChhKSwgX3BNMTI4KGIpKTsKKyAgICBfTTY0ZihyZXM2NCwgcmVzKTsKKyAgICByZXR1cm4gcmVzNjQ7Cit9CisKK2Zsb2F0MzJ4NF90IHZyZWNwc3FfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWUkVDUFMuRjMyIHEwLCBxMCwgcTAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMng0X3QgdnJlY3BzcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYikgLy8gVlJFQ1BTLkYzMiBxMCwgcTAsIHEwCit7CisgICAgX19tMTI4IGYyLCBtdWw7CisgICAgZjIgPSAgX21tX3NldDFfcHMoMi4pOworICAgIG11bCA9IF9tbV9tdWxfcHMoYSxiKTsKKyAgICByZXR1cm4gX21tX3N1Yl9wcyhmMixtdWwpOworfQorCisvLyoqKioqKioqKioqKioqKioqVlJTUVJUUyAoVmVjdG9yIFJlY2lwcm9jYWwgU3F1YXJlIFJvb3QgU3RlcCkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vbXVsdGlwbGllcyB0aGUgZWxlbWVudHMgb2Ygb25lIHZlY3RvciBieSB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBhbm90aGVyIHZlY3RvciwKKy8vc3VidHJhY3RzIGVhY2ggb2YgdGhlIHJlc3VsdHMgZnJvbSAzLCBkaXZpZGVzIHRoZXNlIHJlc3VsdHMgYnkgdHdvLCBhbmQgcGxhY2VzIHRoZSBmaW5hbCByZXN1bHRzIGludG8gdGhlIGVsZW1lbnRzIG9mIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuCisKK2Zsb2F0MzJ4Ml90IHZyc3FydHNfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWUlNRUlRTLkYzMiBkMCwgZDAsIGQwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZyc3FydHNfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpCit7CisgICAgZmxvYXQzMngyX3QgcmVzOworICAgIHJlcy5tNjRfZjMyWzBdID0gKDMgLSBhLm02NF9mMzJbMF0gKiBiLm02NF9mMzJbMF0pIC8gMjsKKyAgICByZXMubTY0X2YzMlsxXSA9ICgzIC0gYS5tNjRfZjMyWzFdICogYi5tNjRfZjMyWzFdKSAvIDI7CisgICAgcmV0dXJuIHJlczsKK30KKworZmxvYXQzMng0X3QgdnJzcXJ0c3FfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpOyAvLyBWUlNRUlRTLkYzMiBxMCwgcTAsIHEwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4NF90IHZyc3FydHNxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKSAvLyBWUlNRUlRTLkYzMiBxMCwgcTAsIHEwCit7CisgICAgX19tMTI4IGYzLCBmMDUsIG11bDsKKyAgICBmMyA9ICBfbW1fc2V0MV9wcygzLik7CisgICAgZjA1ID0gIF9tbV9zZXQxX3BzKDAuNSk7CisgICAgbXVsID0gX21tX211bF9wcyhhLGIpOworICAgIGYzID0gX21tX3N1Yl9wcyhmMyxtdWwpOworICAgIHJldHVybiBfbW1fbXVsX3BzIChmMywgZjA1KTsKK30KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU2hpZnRzIGJ5IHNpZ25lZCB2YXJpYWJsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKiBWZWN0b3Igc2hpZnQgbGVmdDogVnJbaV0gOj0gVmFbaV0gPDwgVmJbaV0gKG5lZ2F0aXZlIHZhbHVlcyBzaGlmdCByaWdodCkgKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vTm8gc3VjaCBvcGVyYXRpb25zIGluIElBMzIgU0lNRCB1bmZvcnR1bmF0ZWx5LCBjb25zdGFudCBzaGlmdCBvbmx5IGF2YWlsYWJsZSwgc28gbmVlZCB0byBkbyB0aGUgc2VyaWFsIHNvbHV0aW9uCisvL2hlbHBlciBtYWNyby4gSXQgbWF0Y2hlcyBBUk0gaW1wbGVtZW50YXRpb24gZm9yIGJpZyBzaGlmdHMKKyNkZWZpbmUgU0VSSUFMX1NISUZUKFRZUEUsIElOVEVSTkFMX1RZUEUsIExFTk1BWCwgTEVOKSBcCisgICAgICAgIF9ORU9OMlNTRV9BTElHTl8xNiBUWVBFIGF0bXBbTEVOTUFYXSwgcmVzW0xFTk1BWF07IF9ORU9OMlNTRV9BTElHTl8xNiBJTlRFUk5BTF9UWVBFIGJ0bXBbTEVOTUFYXTsgaW50IGksIGxhbmVzaXplID0gc2l6ZW9mKElOVEVSTkFMX1RZUEUpIDw8IDM7IFwKKyAgICAgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilhdG1wLCBhKTsgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilidG1wLCBiKTsgXAorICAgICAgICBmb3IgKGkgPSAwOyBpPExFTjsgaSsrKSB7IFwKKyAgICAgICAgaWYoIChidG1wW2ldID49IGxhbmVzaXplKXx8KGJ0bXBbaV0gPD0gLWxhbmVzaXplKSApIHJlc1tpXSA9IDA7IFwKKyAgICAgICAgZWxzZSByZXNbaV0gPSAoYnRtcFtpXSA+PTApID8gYXRtcFtpXSA8PCBidG1wW2ldIDogYXRtcFtpXSA+PiAoLWJ0bXBbaV0pOyB9IFwKKyAgICAgICAgcmV0dXJuIF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKilyZXMpOworCisjZGVmaW5lIFNFUklBTF9TSElGVF82NChUWVBFLCBTSUdOLCBMRU4pIFwKKyAgICAgICAgaW50ICMjIFRZUEUgIyMgeCAjIyBMRU4gIyMgX3QgcmVzOyAgaW50IGksIGxhbmVzaXplID0gc2l6ZW9mKGludCAjIyBUWVBFICMjIF90KSA8PCAzOyBcCisgICAgICAgIGZvciAoaSA9IDA7IGk8TEVOOyBpKyspIHsgXAorICAgICAgICBpZiggKGIubTY0X2kgIyMgVFlQRVtpXSA+PSBsYW5lc2l6ZSl8fChiLm02NF9pICMjIFRZUEVbaV0gPD0gLWxhbmVzaXplKSApIHJlcy5tNjRfICMjIFNJR04gIyMgVFlQRVtpXSA9IDA7IFwKKyAgICAgICAgZWxzZSByZXMubTY0XyAjIyBTSUdOICMjIFRZUEVbaV0gPSAoYi5tNjRfaSAjIyBUWVBFW2ldID49MCkgPyBhLm02NF8gIyMgU0lHTiAjIyBUWVBFW2ldIDw8IGIubTY0X2kgIyMgVFlQRVtpXSA6IGEubTY0XyAjIyBTSUdOICMjIFRZUEVbaV0gPj4gKC1iLm02NF9pICMjIFRZUEVbaV0pOyB9IFwKKyAgICAgICAgcmV0dXJuIHJlczsKKworaW50OHg4X3QgdnNobF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlNITC5TOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ4eDhfdCB2c2hsX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0hJRlRfNjQoOCwgaSwgOCkKK30KKworaW50MTZ4NF90IHZzaGxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZTSEwuUzE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDE2eDRfdCB2c2hsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0hJRlRfNjQoMTYsIGksIDQpCit9CisKK2ludDMyeDJfdCB2c2hsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWU0hMLlMzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQzMngyX3QgdnNobF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NISUZUXzY0KDMyLCBpLCAyKQorfQorCitpbnQ2NHgxX3QgdnNobF9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVlNITC5TNjQgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50NjR4MV90IHZzaGxfczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TSElGVF82NCg2NCwgaSwgMSkKK30KKwordWludDh4OF90IHZzaGxfdTgodWludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWU0hMLlU4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQ4eDhfdCB2c2hsX3U4KHVpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NISUZUXzY0KDgsIHUsIDgpCit9CisKK3VpbnQxNng0X3QgdnNobF91MTYodWludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZTSEwuczE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQxNng0X3QgdnNobF91MTYodWludDE2eDRfdCBhLCBpbnQxNng0X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TSElGVF82NCgxNiwgdSwgNCkKK30KKwordWludDMyeDJfdCB2c2hsX3UzMih1aW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlNITC5VMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDMyeDJfdCB2c2hsX3UzMih1aW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NISUZUXzY0KDMyLCB1LCAyKQorfQorCit1aW50NjR4MV90IHZzaGxfdTY0KHVpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWU0hMLlU2NCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSB1aW50NjR4MV90IHZzaGxfdTY0KHVpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpIC8vaWYgd2UgdXNlIHRoZSBTRVJJQUxfU0hJRlQgbWFjcm8gbmVlZCB0byBoYXZlIHRoZSBzcGVjaWFsIHByb2Nlc3NpbmcgIGZvciBsYXJnZSBudW1iZXJzCit7CisgICAgU0VSSUFMX1NISUZUXzY0KDY0LCB1LCAxKQorfQorCitpbnQ4eDE2X3QgdnNobHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlNITC5TOCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ4eDE2X3QgdnNobHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NISUZUKGludDhfdCwgaW50OF90LCAxNiwgMTYpCit9CisKK2ludDE2eDhfdCB2c2hscV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlNITC5TMTYgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MTZ4OF90IHZzaGxxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0hJRlQoaW50MTZfdCwgaW50MTZfdCwgOCwgOCkKK30KKworaW50MzJ4NF90IHZzaGxxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWU0hMLlMzMiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQzMng0X3QgdnNobHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TSElGVChpbnQzMl90LCBpbnQzMl90LCA0LCA0KQorfQorCitpbnQ2NHgyX3QgdnNobHFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZTSEwuUzY0IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDJfdCB2c2hscV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NISUZUKGludDY0X3QsIGludDY0X3QsIDIsIDIpCit9CisKK3VpbnQ4eDE2X3QgdnNobHFfdTgodWludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZTSEwuVTggcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDh4MTZfdCB2c2hscV91OCh1aW50OHgxNl90IGEsIGludDh4MTZfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NISUZUKHVpbnQ4X3QsIGludDhfdCwgMTYsIDE2KQorfQorCit1aW50MTZ4OF90IHZzaGxxX3UxNih1aW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlNITC5zMTYgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDE2eDhfdCB2c2hscV91MTYodWludDE2eDhfdCBhLCBpbnQxNng4X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TSElGVCh1aW50MTZfdCwgaW50MTZfdCwgOCwgOCkKK30KKwordWludDMyeDRfdCB2c2hscV91MzIodWludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZTSEwuVTMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQzMng0X3QgdnNobHFfdTMyKHVpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0hJRlQodWludDMyX3QsIGludDMyX3QsIDQsIDQpCit9CisKK3VpbnQ2NHgyX3QgdnNobHFfdTY0KHVpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWU0hMLlU2NCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyggdWludDY0eDJfdCB2c2hscV91NjQodWludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TSElGVCh1aW50NjRfdCwgaW50NjRfdCwgMiwgMikKK30KKworCisvLyoqKioqKioqKioqIFZlY3RvciBzYXR1cmF0aW5nIHNoaWZ0IGxlZnQ6IChuZWdhdGl2ZSB2YWx1ZXMgc2hpZnQgcmlnaHQpICoqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vTm8gc3VjaCBvcGVyYXRpb25zIGluIElBMzIgU0lNRCBhdmFpbGFibGUgeWV0LCBjb25zdGFudCBzaGlmdCBvbmx5IGF2YWlsYWJsZSwgc28gbmVlZCB0byBkbyB0aGUgc2VyaWFsIHNvbHV0aW9uCisjZGVmaW5lIFNFUklBTF9TQVRVUkFUSU5HX1NISUZUX1NJR05FRChUWVBFLCBMRU5NQVgsIExFTikgXAorICAgICAgICBfTkVPTjJTU0VfQUxJR05fMTYgVFlQRSBhdG1wW0xFTk1BWF0sIHJlc1tMRU5NQVhdLCBidG1wW0xFTk1BWF07IFRZUEUgbGltaXQ7IGludCBpOyBcCisgICAgICAgIGludCBsYW5lc2l6ZV8xID0gKHNpemVvZihUWVBFKSA8PCAzKSAtIDE7IFwKKyAgICAgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilhdG1wLCBhKTsgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilidG1wLCBiKTsgXAorICAgICAgICBmb3IgKGkgPSAwOyBpPExFTjsgaSsrKSB7IFwKKyAgICAgICAgaWYgKGF0bXBbaV0gPT0wKSByZXNbaV0gPSAwOyBcCisgICAgICAgIGVsc2V7IFwKKyAgICAgICAgICAgIGlmKGJ0bXBbaV0gPDApIHJlc1tpXSA9IGF0bXBbaV0gPj4gKC1idG1wW2ldKTsgXAorICAgICAgICAgICAgZWxzZXsgXAorICAgICAgICAgICAgICAgIGlmIChidG1wW2ldPmxhbmVzaXplXzEpIHsgXAorICAgICAgICAgICAgICAgICAgICByZXNbaV0gPSAoKF9VTlNJR05FRF9UKFRZUEUpKWF0bXBbaV0gPj4gbGFuZXNpemVfMSApICsgKChUWVBFKTEgPDwgbGFuZXNpemVfMSkgLSAxOyBcCisgICAgICAgICAgICAgICAgfWVsc2V7IFwKKyAgICAgICAgICAgICAgICAgICAgbGltaXQgPSAoVFlQRSkxIDw8IChsYW5lc2l6ZV8xIC0gYnRtcFtpXSk7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYoKGF0bXBbaV0gPj0gbGltaXQpfHwoYXRtcFtpXSA8PSAtbGltaXQpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXNbaV0gPSAoKF9VTlNJR05FRF9UKFRZUEUpKWF0bXBbaV0gPj4gbGFuZXNpemVfMSApICsgKChUWVBFKTEgPDwgbGFuZXNpemVfMSkgLSAxOyBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgcmVzW2ldID0gYXRtcFtpXSA8PCBidG1wW2ldOyB9fX19IFwKKyAgICAgICAgcmV0dXJuIF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKilyZXMpOworCisjZGVmaW5lIFNFUklBTF9TQVRVUkFUSU5HX1NISUZUX1VOU0lHTkVEKFRZUEUsIExFTk1BWCwgTEVOKSBcCisgICAgICAgIF9ORU9OMlNTRV9BTElHTl8xNiBfVU5TSUdORURfVChUWVBFKSBhdG1wW0xFTk1BWF0sIHJlc1tMRU5NQVhdOyBfTkVPTjJTU0VfQUxJR05fMTYgVFlQRSBidG1wW0xFTk1BWF07IF9VTlNJR05FRF9UKFRZUEUpIGxpbWl0OyBpbnQgaTsgXAorICAgICAgICBUWVBFIGxhbmVzaXplID0gKHNpemVvZihUWVBFKSA8PCAzKTsgXAorICAgICAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWF0bXAsIGEpOyBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWJ0bXAsIGIpOyBcCisgICAgICAgIGZvciAoaSA9IDA7IGk8TEVOOyBpKyspIHsgXAorICAgICAgICBpZiAoYXRtcFtpXSA9PTApIHtyZXNbaV0gPSAwOyBcCisgICAgICAgIH1lbHNleyBcCisgICAgICAgICAgICBpZihidG1wW2ldIDwgMCkgcmVzW2ldID0gYXRtcFtpXSA+PiAoLWJ0bXBbaV0pOyBcCisgICAgICAgICAgICBlbHNleyBcCisgICAgICAgICAgICAgICAgaWYgKGJ0bXBbaV0+bGFuZXNpemUpIHJlc1tpXSA9IH4oKFRZUEUpMCk7IFwKKyAgICAgICAgICAgICAgICBlbHNleyBcCisgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gKFRZUEUpIDEgPDwgKGxhbmVzaXplIC0gYnRtcFtpXSk7IFwKKyAgICAgICAgICAgICAgICAgICAgcmVzW2ldID0gKCBhdG1wW2ldID49IGxpbWl0KSA/IHJlc1tpXSA9IH4oKFRZUEUpMCkgOiBhdG1wW2ldIDw8IGJ0bXBbaV07IH19fX0gXAorICAgICAgICByZXR1cm4gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKXJlcyk7CisKKyNkZWZpbmUgU0VSSUFMX1NBVFVSQVRJTkdfU0hJRlRfU0lHTkVEXzY0KFRZUEUsIExFTikgXAorICAgICAgICBpbnQgIyMgVFlQRSAjIyB4ICMjIExFTiAjIyBfdCByZXM7IGludCAjIyBUWVBFICMjIF90IGxpbWl0OyBpbnQgaTsgXAorICAgICAgICBpbnQgbGFuZXNpemVfMSA9IChzaXplb2YoIGludCAjIyBUWVBFICMjIF90KSA8PCAzKSAtIDE7IFwKKyAgICAgICAgZm9yIChpID0gMDsgaTxMRU47IGkrKykgeyBcCisgICAgICAgIGlmIChhLm02NF9pICMjIFRZUEVbaV0gPT0wKSByZXMubTY0X2kgIyMgVFlQRVtpXSA9IDA7IFwKKyAgICAgICAgZWxzZXsgXAorICAgICAgICAgICAgaWYoYi5tNjRfaSAjIyBUWVBFW2ldIDwwKSByZXMubTY0X2kgIyMgVFlQRVtpXSA9IGEubTY0X2kgIyMgVFlQRVtpXSA+PiAoLShiLm02NF9pICMjIFRZUEVbaV0pKTsgXAorICAgICAgICAgICAgZWxzZXsgXAorICAgICAgICAgICAgICAgIGlmIChiLm02NF9pICMjIFRZUEVbaV0+bGFuZXNpemVfMSkgeyBcCisgICAgICAgICAgICAgICAgICAgIHJlcy5tNjRfaSAjIyBUWVBFW2ldID0gKChfVU5TSUdORURfVChpbnQgIyMgVFlQRSAjIyBfdCkpYS5tNjRfaSAjIyBUWVBFW2ldID4+IGxhbmVzaXplXzEgKSArICgoaW50ICMjIFRZUEUgIyMgX3QpIDEgPDwgbGFuZXNpemVfMSkgLSAxOyBcCisgICAgICAgICAgICAgICAgfWVsc2V7IFwKKyAgICAgICAgICAgICAgICAgICAgbGltaXQgPSAoaW50ICMjIFRZUEUgIyMgX3QpIDEgPDwgKGxhbmVzaXplXzEgLSBiLm02NF9pICMjIFRZUEVbaV0pOyBcCisgICAgICAgICAgICAgICAgICAgIGlmKChhLm02NF9pICMjIFRZUEVbaV0gPj0gbGltaXQpfHwoYS5tNjRfaSAjIyBUWVBFW2ldIDw9IC1saW1pdCkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5tNjRfaSAjIyBUWVBFW2ldID0gKChfVU5TSUdORURfVChpbnQgIyMgVFlQRSAjIyBfdCkpYS5tNjRfaSAjIyBUWVBFW2ldID4+IGxhbmVzaXplXzEgKSArICgoaW50ICMjIFRZUEUgIyMgX3QpIDEgPDwgbGFuZXNpemVfMSkgLSAxOyBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgcmVzLm02NF9pICMjIFRZUEVbaV0gPSBhLm02NF9pICMjIFRZUEVbaV0gPDwgYi5tNjRfaSAjIyBUWVBFW2ldOyB9fX19IFwKKyAgICAgICAgcmV0dXJuIHJlczsKKworI2RlZmluZSBTRVJJQUxfU0FUVVJBVElOR19TSElGVF9VTlNJR05FRF82NChUWVBFLCBMRU4pIFwKKyAgICAgICAgaW50ICMjIFRZUEUgIyMgeCAjIyBMRU4gIyMgX3QgcmVzOyAgX1VOU0lHTkVEX1QoaW50ICMjIFRZUEUgIyMgX3QpIGxpbWl0OyBpbnQgaTsgXAorICAgICAgICBpbnQgIyMgVFlQRSAjIyBfdCBsYW5lc2l6ZSA9IChzaXplb2YoaW50ICMjIFRZUEUgIyMgX3QpIDw8IDMpOyBcCisgICAgICAgIGZvciAoaSA9IDA7IGk8TEVOOyBpKyspIHsgXAorICAgICAgICBpZiAoYS5tNjRfdSAjIyBUWVBFW2ldID09MCkge3Jlcy5tNjRfdSAjIyBUWVBFW2ldID0gMDsgXAorICAgICAgICB9ZWxzZXsgXAorICAgICAgICAgICAgaWYoYi5tNjRfaSAjIyBUWVBFW2ldIDwgMCkgcmVzLm02NF91ICMjIFRZUEVbaV0gPSBhLm02NF91ICMjIFRZUEVbaV0gPj4gKC0oYi5tNjRfaSAjIyBUWVBFW2ldKSk7IFwKKyAgICAgICAgICAgIGVsc2V7IFwKKyAgICAgICAgICAgICAgICBpZiAoYi5tNjRfaSAjIyBUWVBFW2ldPmxhbmVzaXplKSByZXMubTY0X3UgIyMgVFlQRVtpXSA9IH4oKGludCAjIyBUWVBFICMjIF90KSAwKTsgXAorICAgICAgICAgICAgICAgIGVsc2V7IFwKKyAgICAgICAgICAgICAgICAgICAgbGltaXQgPSAoaW50ICMjIFRZUEUgIyMgX3QpIDEgPDwgKGxhbmVzaXplIC0gYi5tNjRfaSAjIyBUWVBFW2ldKTsgXAorICAgICAgICAgICAgICAgICAgICByZXMubTY0X3UgIyMgVFlQRVtpXSA9ICggYS5tNjRfdSAjIyBUWVBFW2ldID49IGxpbWl0KSA/IHJlcy5tNjRfdSAjIyBUWVBFW2ldID0gfigoaW50ICMjIFRZUEUgIyMgX3QpIDApIDogYS5tNjRfdSAjIyBUWVBFW2ldIDw8IGIubTY0X3UgIyMgVFlQRVtpXTsgfX19fSBcCisgICAgICAgIHJldHVybiByZXM7CisKK2ludDh4OF90IHZxc2hsX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWUVNITC5TOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ4eDhfdCB2cXNobF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NBVFVSQVRJTkdfU0hJRlRfU0lHTkVEXzY0KDgsOCkKK30KKworaW50MTZ4NF90IHZxc2hsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWUVNITC5TMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MTZ4NF90IHZxc2hsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19TSElGVF9TSUdORURfNjQoMTYsNCkKK30KKworaW50MzJ4Ml90IHZxc2hsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWUVNITC5TMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MzJ4Ml90IHZxc2hsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19TSElGVF9TSUdORURfNjQoMzIsMikKK30KKworaW50NjR4MV90IHZxc2hsX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpOyAvLyBWUVNITC5TNjQgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50NjR4MV90IHZxc2hsX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19TSElGVF9TSUdORURfNjQoNjQsMSkKK30KKwordWludDh4OF90IHZxc2hsX3U4KHVpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlFTSEwuVTggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDh4OF90IHZxc2hsX3U4KHVpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NBVFVSQVRJTkdfU0hJRlRfVU5TSUdORURfNjQoOCw4KQorfQorCit1aW50MTZ4NF90IHZxc2hsX3UxNih1aW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlFTSEwuczE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQxNng0X3QgdnFzaGxfdTE2KHVpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19TSElGVF9VTlNJR05FRF82NCgxNiw0KQorfQorCit1aW50MzJ4Ml90IHZxc2hsX3UzMih1aW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlFTSEwuVTMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQzMngyX3QgdnFzaGxfdTMyKHVpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19TSElGVF9VTlNJR05FRF82NCgzMiwyKQorfQorCit1aW50NjR4MV90IHZxc2hsX3U2NCh1aW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVlFTSEwuVTY0IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQ2NHgxX3QgdnFzaGxfdTY0KHVpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19TSElGVF9VTlNJR05FRF82NCg2NCwxKQorfQorCitpbnQ4eDE2X3QgdnFzaGxxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZRU0hMLlM4IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDh4MTZfdCB2cXNobHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NBVFVSQVRJTkdfU0hJRlRfU0lHTkVEKGludDhfdCwgMTYsIDE2KQorfQorCitpbnQxNng4X3QgdnFzaGxxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWUVNITC5TMTYgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MTZ4OF90IHZxc2hscV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NBVFVSQVRJTkdfU0hJRlRfU0lHTkVEKGludDE2X3QsIDgsIDgpCit9CisKK2ludDMyeDRfdCB2cXNobHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZRU0hMLlMzMiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQzMng0X3QgdnFzaGxxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19TSElGVF9TSUdORUQoaW50MzJfdCwgNCwgNCkKK30KKworaW50NjR4Ml90IHZxc2hscV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVlFTSEwuUzY0IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDJfdCB2cXNobHFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1NISUZUX1NJR05FRChpbnQ2NF90LCAyLCAyKQorfQorCit1aW50OHgxNl90IHZxc2hscV91OCh1aW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlFTSEwuVTggcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDh4MTZfdCB2cXNobHFfdTgodWludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1NISUZUX1VOU0lHTkVEKGludDhfdCwgMTYsIDE2KQorfQorCit1aW50MTZ4OF90IHZxc2hscV91MTYodWludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZRU0hMLnMxNiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50MTZ4OF90IHZxc2hscV91MTYodWludDE2eDhfdCBhLCBpbnQxNng4X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1NISUZUX1VOU0lHTkVEKGludDE2X3QsIDgsIDgpCit9CisKK3VpbnQzMng0X3QgdnFzaGxxX3UzMih1aW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlFTSEwuVTMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQzMng0X3QgdnFzaGxxX3UzMih1aW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NBVFVSQVRJTkdfU0hJRlRfVU5TSUdORUQoaW50MzJfdCwgNCwgNCkKK30KKwordWludDY0eDJfdCB2cXNobHFfdTY0KHVpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWUVNITC5VNjQgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDY0eDJfdCB2cXNobHFfdTY0KHVpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19TSElGVF9VTlNJR05FRChpbnQ2NF90LCAyLCAyKQorfQorCisKKy8vKioqKioqKiogVmVjdG9yIHJvdW5kaW5nIHNoaWZ0IGxlZnQ6IChuZWdhdGl2ZSB2YWx1ZXMgc2hpZnQgcmlnaHQpICoqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9ObyBzdWNoIG9wZXJhdGlvbnMgaW4gSUEzMiBTSU1EIGF2YWlsYWJsZSB5ZXQsIGNvbnN0YW50IHNoaWZ0IG9ubHkgYXZhaWxhYmxlLCBzbyBuZWVkIHRvIGRvIHRoZSBzZXJpYWwgc29sdXRpb24KKy8vcm91bmRpbmcgbWFrZXMgc2Vuc2UgZm9yIHJpZ2h0IHNoaWZ0cyBvbmx5LgorI2RlZmluZSBTRVJJQUxfUk9VTkRJTkdfU0hJRlQoVFlQRSwgSU5URVJOQUxfVFlQRSwgTEVOTUFYLCBMRU4pIFwKKyAgICAgICAgX05FT04yU1NFX0FMSUdOXzE2IFRZUEUgYXRtcFtMRU5NQVhdLCByZXNbTEVOTUFYXTsgX05FT04yU1NFX0FMSUdOXzE2IElOVEVSTkFMX1RZUEUgYnRtcFtMRU5NQVhdOyBJTlRFUk5BTF9UWVBFIGksIGxhbmVzaXplID0gc2l6ZW9mKElOVEVSTkFMX1RZUEUpIDw8IDM7IFwKKyAgICAgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilhdG1wLCBhKTsgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilidG1wLCBiKTsgXAorICAgICAgICBmb3IgKGkgPSAwOyBpPExFTjsgaSsrKSB7IFwKKyAgICAgICAgaWYoIGJ0bXBbaV0gPj0gMCkgeyBcCisgICAgICAgICAgICBpZihidG1wW2ldID49IGxhbmVzaXplKSByZXNbaV0gPSAwOyBcCisgICAgICAgICAgICBlbHNlIHJlc1tpXSA9IChhdG1wW2ldIDw8IGJ0bXBbaV0pOyBcCisgICAgICAgIH1lbHNleyBcCisgICAgICAgICAgICByZXNbaV0gPSAoYnRtcFtpXSA8IC1sYW5lc2l6ZSkgPyByZXNbaV0gPSAwIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidG1wW2ldID09IC1sYW5lc2l6ZSkgPyAoYXRtcFtpXSAmICgoSU5URVJOQUxfVFlQRSkxIDw8ICgtYnRtcFtpXSAtIDEpKSkgPj4gKC1idG1wW2ldIC0gMSkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF0bXBbaV0gPj4gKC1idG1wW2ldKSkgKyAoIChhdG1wW2ldICYgKChJTlRFUk5BTF9UWVBFKTEgPDwgKC1idG1wW2ldIC0gMSkpKSA+PiAoLWJ0bXBbaV0gLSAxKSApOyAgICB9fSBcCisgICAgICAgIHJldHVybiBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSopcmVzKTsKKworCisjZGVmaW5lIFNFUklBTF9ST1VORElOR19TSElGVF82NChUWVBFLCBTSUdOLCBMRU4pIFwKKyAgICAgICAgaW50ICMjIFRZUEUgIyMgeCAjIyBMRU4gIyMgX3QgcmVzOyAgaW50IGk7ICBpbnQgbGFuZXNpemUgPSBzaXplb2YoaW50ICMjIFRZUEUgIyMgX3QpIDw8IDM7IFwKKyAgICAgICAgZm9yIChpID0gMDsgaTxMRU47IGkrKykgeyBcCisgICAgICAgIGlmKCBiLm02NF9pICMjIFRZUEVbaV0gPj0gMCkgeyBcCisgICAgICAgICAgICBpZihiLm02NF9pICMjIFRZUEVbaV0gPj0gbGFuZXNpemUpIHJlcy5tNjRfICMjIFNJR04gIyMgVFlQRVtpXSA9IDA7IFwKKyAgICAgICAgICAgIGVsc2UgcmVzLm02NF8gIyMgU0lHTiAjIyBUWVBFW2ldID0gKGEubTY0XyAjIyBTSUdOICMjIFRZUEVbaV0gPDwgYi5tNjRfaSAjIyBUWVBFW2ldKTsgXAorICAgICAgICB9ZWxzZXsgXAorICAgICAgICAgICAgcmVzLm02NF8gIyMgU0lHTiAjIyBUWVBFW2ldID0gKGIubTY0X2kgIyMgVFlQRVtpXSA8IC1sYW5lc2l6ZSkgPyByZXMubTY0XyAjIyBTSUdOICMjIFRZUEVbaV0gPSAwIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiLm02NF9pICMjIFRZUEVbaV0gPT0gLWxhbmVzaXplKSA/IChhLm02NF8gIyMgU0lHTiAjIyBUWVBFW2ldICYgKChpbnQgIyMgVFlQRSAjIyBfdCkgMSA8PCAoLShiLm02NF9pICMjIFRZUEVbaV0pIC0gMSkpKSA+PiAoLShiLm02NF9pICMjIFRZUEVbaV0pIC0gMSkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGEubTY0XyAjIyBTSUdOICMjIFRZUEVbaV0gPj4gKC0oYi5tNjRfaSAjIyBUWVBFW2ldKSkpICsgKCAoYS5tNjRfICMjIFNJR04gIyMgVFlQRVtpXSAmICgoaW50ICMjIFRZUEUgIyMgX3QpIDEgPDwgKC0oYi5tNjRfaSAjIyBUWVBFW2ldKSAtIDEpKSkgPj4gKC0oYi5tNjRfaSAjIyBUWVBFW2ldKSAtIDEpICk7ICAgIH19IFwKKyAgICAgICAgcmV0dXJuIHJlczsKKworCitpbnQ4eDhfdCB2cnNobF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlJTSEwuUzggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50OHg4X3QgdnJzaGxfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9ST1VORElOR19TSElGVF82NCg4LGksOCkKK30KKworaW50MTZ4NF90IHZyc2hsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpOyAvLyBWUlNITC5TMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MTZ4NF90IHZyc2hsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfUk9VTkRJTkdfU0hJRlRfNjQoMTYsaSw0KQorfQorCitpbnQzMngyX3QgdnJzaGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZSU0hMLlMzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQzMngyX3QgdnJzaGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9ST1VORElOR19TSElGVF82NCgzMixpLDIpCit9CisKK2ludDY0eDFfdCB2cnNobF9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVlJTSEwuUzY0IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDFfdCB2cnNobF9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1JPVU5ESU5HX1NISUZUXzY0KDY0LGksMSkKK30KKwordWludDh4OF90IHZyc2hsX3U4KHVpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlJTSEwuVTggZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDh4OF90IHZyc2hsX3U4KHVpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1JPVU5ESU5HX1NISUZUXzY0KDgsdSw4KQorfQorCit1aW50MTZ4NF90IHZyc2hsX3UxNih1aW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlJTSEwuczE2IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQxNng0X3QgdnJzaGxfdTE2KHVpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfUk9VTkRJTkdfU0hJRlRfNjQoMTYsdSw0KQorfQorCit1aW50MzJ4Ml90IHZyc2hsX3UzMih1aW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlJTSEwuVTMyIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQzMngyX3QgdnJzaGxfdTMyKHVpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfUk9VTkRJTkdfU0hJRlRfNjQoMzIsdSwyKQorfQorCit1aW50NjR4MV90IHZyc2hsX3U2NCh1aW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVlJTSEwuVTY0IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQ2NHgxX3QgdnJzaGxfdTY0KHVpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfUk9VTkRJTkdfU0hJRlRfNjQoNjQsdSwxKQorfQorCitpbnQ4eDE2X3QgdnJzaGxxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZSU0hMLlM4IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDh4MTZfdCB2cnNobHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1JPVU5ESU5HX1NISUZUKGludDhfdCwgaW50OF90LCAxNiwgMTYpCit9CisKK2ludDE2eDhfdCB2cnNobHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZSU0hMLlMxNiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQxNng4X3QgdnJzaGxxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfUk9VTkRJTkdfU0hJRlQoaW50MTZfdCwgaW50MTZfdCwgOCwgOCkKK30KKworaW50MzJ4NF90IHZyc2hscV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlJTSEwuUzMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDMyeDRfdCB2cnNobHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9ST1VORElOR19TSElGVChpbnQzMl90LCBpbnQzMl90LCA0LCA0KQorfQorCitpbnQ2NHgyX3QgdnJzaGxxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWUlNITC5TNjQgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50NjR4Ml90IHZyc2hscV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1JPVU5ESU5HX1NISUZUKGludDY0X3QsIGludDY0X3QsIDIsIDIpCit9CisKK3VpbnQ4eDE2X3QgdnJzaGxxX3U4KHVpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWUlNITC5VOCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50OHgxNl90IHZyc2hscV91OCh1aW50OHgxNl90IGEsIGludDh4MTZfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1JPVU5ESU5HX1NISUZUKHVpbnQ4X3QsIGludDhfdCwgMTYsIDE2KQorfQorCit1aW50MTZ4OF90IHZyc2hscV91MTYodWludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZSU0hMLnMxNiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50MTZ4OF90IHZyc2hscV91MTYodWludDE2eDhfdCBhLCBpbnQxNng4X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9ST1VORElOR19TSElGVCh1aW50MTZfdCwgaW50MTZfdCwgOCwgOCkKK30KKwordWludDMyeDRfdCB2cnNobHFfdTMyKHVpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWUlNITC5VMzIgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDMyeDRfdCB2cnNobHFfdTMyKHVpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfUk9VTkRJTkdfU0hJRlQodWludDMyX3QsIGludDMyX3QsIDQsIDQpCit9CisKK3VpbnQ2NHgyX3QgdnJzaGxxX3U2NCh1aW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVlJTSEwuVTY0IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQ2NHgyX3QgdnJzaGxxX3U2NCh1aW50NjR4Ml90IGEsIGludDY0eDJfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1JPVU5ESU5HX1NISUZUKHVpbnQ2NF90LCBpbnQ2NF90LCAyLCAyKQorfQorCisKKy8vKioqKioqKioqKiBWZWN0b3Igc2F0dXJhdGluZyByb3VuZGluZyBzaGlmdCBsZWZ0OiAobmVnYXRpdmUgdmFsdWVzIHNoaWZ0IHJpZ2h0KSAqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vTm8gc3VjaCBvcGVyYXRpb25zIGluIElBMzIgU0lNRCB1bmZvcnR1bmF0ZWx5LCBjb25zdGFudCBzaGlmdCBvbmx5IGF2YWlsYWJsZSwgc28gbmVlZCB0byBkbyB0aGUgc2VyaWFsIHNvbHV0aW9uCisvL1NhdHVyYXRpb24gaGFwcGVucyBmb3IgbGVmdCBzaGlmdHMgb25seSB3aGlsZSByb3VuZGluZyBtYWtlcyBzZW5zZSBmb3IgcmlnaHQgc2hpZnRzIG9ubHkuCisjZGVmaW5lIFNFUklBTF9TQVRVUkFUSU5HX1JPVU5ESU5HX1NISUZUX1NJR05FRChUWVBFLCBMRU5NQVgsIExFTikgXAorICAgICAgICBfTkVPTjJTU0VfQUxJR05fMTYgVFlQRSBhdG1wW0xFTk1BWF0sIHJlc1tMRU5NQVhdLCBidG1wW0xFTk1BWF07IFRZUEUgbGltaXQ7IGludCBpOyBcCisgICAgICAgIGludCBsYW5lc2l6ZV8xID0gKHNpemVvZihUWVBFKSA8PCAzKSAtIDE7IFwKKyAgICAgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilhdG1wLCBhKTsgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilidG1wLCBiKTsgXAorICAgICAgICBmb3IgKGkgPSAwOyBpPExFTjsgaSsrKSB7IFwKKyAgICAgICAgaWYgKGF0bXBbaV0gPT0wKSByZXNbaV0gPSAwOyBcCisgICAgICAgIGVsc2V7IFwKKyAgICAgICAgICAgIGlmKGJ0bXBbaV0gPDApIHJlc1tpXSA9IChidG1wW2ldIDwgKC1sYW5lc2l6ZV8xKSkgPyAwIDogKGF0bXBbaV0gPj4gKC1idG1wW2ldKSkgKyAoIChhdG1wW2ldICYgKChUWVBFKTEgPDwgKC1idG1wW2ldIC0gMSkpKSA+PiAoLWJ0bXBbaV0gLSAxKSApOyBcCisgICAgICAgICAgICBlbHNleyBcCisgICAgICAgICAgICAgICAgaWYgKGJ0bXBbaV0+bGFuZXNpemVfMSkgeyBcCisgICAgICAgICAgICAgICAgICAgIHJlc1tpXSA9ICgoX1VOU0lHTkVEX1QoVFlQRSkpYXRtcFtpXSA+PiBsYW5lc2l6ZV8xICkgKyAoKFRZUEUpMSA8PCBsYW5lc2l6ZV8xKSAtIDE7IFwKKyAgICAgICAgICAgICAgICB9ZWxzZXsgXAorICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IChUWVBFKTEgPDwgKGxhbmVzaXplXzEgLSBidG1wW2ldKTsgXAorICAgICAgICAgICAgICAgICAgICBpZigoYXRtcFtpXSA+PSBsaW1pdCl8fChhdG1wW2ldIDw9IC1saW1pdCkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc1tpXSA9ICgoX1VOU0lHTkVEX1QoVFlQRSkpYXRtcFtpXSA+PiBsYW5lc2l6ZV8xICkgKyAoKFRZUEUpMSA8PCBsYW5lc2l6ZV8xKSAtIDE7IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSByZXNbaV0gPSBhdG1wW2ldIDw8IGJ0bXBbaV07IH19fX0gXAorICAgICAgICByZXR1cm4gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKXJlcyk7CisKKyNkZWZpbmUgU0VSSUFMX1NBVFVSQVRJTkdfUk9VTkRJTkdfU0hJRlRfVU5TSUdORUQoVFlQRSwgTEVOTUFYLCBMRU4pIFwKKyAgICAgICAgX05FT04yU1NFX0FMSUdOXzE2IF9VTlNJR05FRF9UKFRZUEUpIGF0bXBbTEVOTUFYXSwgcmVzW0xFTk1BWF07IF9ORU9OMlNTRV9BTElHTl8xNiBUWVBFIGJ0bXBbTEVOTUFYXTsgX1VOU0lHTkVEX1QoVFlQRSkgbGltaXQ7IGludCBpOyBcCisgICAgICAgIGludCBsYW5lc2l6ZSA9IChzaXplb2YoVFlQRSkgPDwgMyk7IFwKKyAgICAgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilhdG1wLCBhKTsgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilidG1wLCBiKTsgXAorICAgICAgICBmb3IgKGkgPSAwOyBpPExFTjsgaSsrKSB7IFwKKyAgICAgICAgaWYgKGF0bXBbaV0gPT0wKSB7cmVzW2ldID0gMDsgXAorICAgICAgICB9ZWxzZXsgXAorICAgICAgICAgICAgaWYoYnRtcFtpXSA8IDApIHJlc1tpXSA9IChidG1wW2ldIDwgKC1sYW5lc2l6ZSkpID8gMCA6IChhdG1wW2ldID4+ICgtYnRtcFtpXSkpICsgKCAoYXRtcFtpXSAmICgoVFlQRSkxIDw8ICgtYnRtcFtpXSAtIDEpKSkgPj4gKC1idG1wW2ldIC0gMSkgKTsgXAorICAgICAgICAgICAgZWxzZXsgXAorICAgICAgICAgICAgICAgIGlmIChidG1wW2ldPmxhbmVzaXplKSByZXNbaV0gPSB+KChUWVBFKTApOyBcCisgICAgICAgICAgICAgICAgZWxzZXsgXAorICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IChUWVBFKSAxIDw8IChsYW5lc2l6ZSAtIGJ0bXBbaV0pOyBcCisgICAgICAgICAgICAgICAgICAgIHJlc1tpXSA9ICggYXRtcFtpXSA+PSBsaW1pdCkgPyByZXNbaV0gPSB+KChUWVBFKTApIDogYXRtcFtpXSA8PCBidG1wW2ldOyB9fX19IFwKKyAgICAgICAgcmV0dXJuIF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKilyZXMpOworCisjZGVmaW5lIFNFUklBTF9TQVRVUkFUSU5HX1JPVU5ESU5HX1NISUZUX1NJR05FRF82NChUWVBFLCBMRU4pIFwKKyAgICAgICAgX19tNjRfMTI4IHJlczsgaW50ICMjIFRZUEUgIyMgX3QgbGltaXQ7IGludCBpOyBcCisgICAgICAgIGludCBsYW5lc2l6ZV8xID0gKHNpemVvZihpbnQgIyMgVFlQRSAjIyBfdCApIDw8IDMpIC0gMTsgXAorICAgICAgICBmb3IgKGkgPSAwOyBpPExFTjsgaSsrKSB7IFwKKyAgICAgICAgaWYgKGEubTY0X2kgIyMgVFlQRVtpXSA9PTApIHJlcy5tNjRfaSAjIyBUWVBFW2ldID0gMDsgXAorICAgICAgICBlbHNleyBcCisgICAgICAgICAgICBpZihiLm02NF9pICMjIFRZUEVbaV0gPDApIHJlcy5tNjRfaSAjIyBUWVBFW2ldID0gKGIubTY0X2kgIyMgVFlQRVtpXSA8ICgtbGFuZXNpemVfMSkpID8gMCA6IChhLm02NF9pICMjIFRZUEVbaV0gPj4gKC0oYi5tNjRfaSAjIyBUWVBFW2ldKSkpICsgKCAoYS5tNjRfaSAjIyBUWVBFW2ldICYgKChpbnQgIyMgVFlQRSAjIyBfdCApIDEgPDwgKC0oYi5tNjRfaSAjIyBUWVBFW2ldKSAtIDEpKSkgPj4gKC0oYi5tNjRfaSAjIyBUWVBFW2ldKSAtIDEpICk7IFwKKyAgICAgICAgICAgIGVsc2V7IFwKKyAgICAgICAgICAgICAgICBpZiAoYi5tNjRfaSAjIyBUWVBFW2ldPmxhbmVzaXplXzEpIHsgXAorICAgICAgICAgICAgICAgICAgICByZXMubTY0X2kgIyMgVFlQRVtpXSA9ICgoX1VOU0lHTkVEX1QoaW50ICMjIFRZUEUgIyMgX3QgKSlhLm02NF9pICMjIFRZUEVbaV0gPj4gbGFuZXNpemVfMSApICsgKChpbnQgIyMgVFlQRSAjIyBfdCApIDEgPDwgbGFuZXNpemVfMSkgLSAxOyBcCisgICAgICAgICAgICAgICAgfWVsc2V7IFwKKyAgICAgICAgICAgICAgICAgICAgbGltaXQgPSAoaW50ICMjIFRZUEUgIyMgX3QgKSAxIDw8IChsYW5lc2l6ZV8xIC0gYi5tNjRfaSAjIyBUWVBFW2ldKTsgXAorICAgICAgICAgICAgICAgICAgICBpZigoYS5tNjRfaSAjIyBUWVBFW2ldID49IGxpbWl0KXx8KGEubTY0X2kgIyMgVFlQRVtpXSA8PSAtbGltaXQpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXMubTY0X2kgIyMgVFlQRVtpXSA9ICgoX1VOU0lHTkVEX1QoaW50ICMjIFRZUEUgIyMgX3QgKSlhLm02NF9pICMjIFRZUEVbaV0gPj4gbGFuZXNpemVfMSApICsgKChpbnQgIyMgVFlQRSAjIyBfdCApIDEgPDwgbGFuZXNpemVfMSkgLSAxOyBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgcmVzLm02NF9pICMjIFRZUEVbaV0gPSBhLm02NF9pICMjIFRZUEVbaV0gPDwgYi5tNjRfaSAjIyBUWVBFW2ldOyB9fX19IFwKKyAgICAgICAgcmV0dXJuIHJlczsKKworI2RlZmluZSBTRVJJQUxfU0FUVVJBVElOR19ST1VORElOR19TSElGVF9VTlNJR05FRF82NChUWVBFLCBMRU4pIFwKKyAgICAgICAgX19tNjRfMTI4IHJlczsgX1VOU0lHTkVEX1QoaW50ICMjIFRZUEUgIyMgX3QpIGxpbWl0OyBpbnQgaTsgXAorICAgICAgICBpbnQgbGFuZXNpemUgPSAoc2l6ZW9mKGludCAjIyBUWVBFICMjIF90KSA8PCAzKTsgXAorICAgICAgICBmb3IgKGkgPSAwOyBpPExFTjsgaSsrKSB7IFwKKyAgICAgICAgaWYgKGEubTY0X3UgIyMgVFlQRVtpXSA9PTApIHtyZXMubTY0X3UgIyMgVFlQRVtpXSA9IDA7IFwKKyAgICAgICAgfWVsc2V7IFwKKyAgICAgICAgICAgIGlmKGIubTY0X2kgIyMgVFlQRVtpXSA8IDApIHJlcy5tNjRfdSAjIyBUWVBFW2ldID0gKGIubTY0X2kgIyMgVFlQRVtpXSA8ICgtbGFuZXNpemUpKSA/IDAgOiAoYS5tNjRfdSAjIyBUWVBFW2ldID4+ICgtKGIubTY0X2kgIyMgVFlQRVtpXSkpKSArICggKGEubTY0X3UgIyMgVFlQRVtpXSAmICgoaW50ICMjIFRZUEUgIyMgX3QpIDEgPDwgKC0oYi5tNjRfaSAjIyBUWVBFW2ldKSAtIDEpKSkgPj4gKC0oYi5tNjRfaSAjIyBUWVBFW2ldKSAtIDEpICk7IFwKKyAgICAgICAgICAgIGVsc2V7IFwKKyAgICAgICAgICAgICAgICBpZiAoYi5tNjRfaSAjIyBUWVBFW2ldPmxhbmVzaXplKSByZXMubTY0X3UgIyMgVFlQRVtpXSA9IH4oKGludCAjIyBUWVBFICMjIF90KSAwKTsgXAorICAgICAgICAgICAgICAgIGVsc2V7IFwKKyAgICAgICAgICAgICAgICAgICAgbGltaXQgPSAoaW50ICMjIFRZUEUgIyMgX3QpIDEgPDwgKGxhbmVzaXplIC0gYi5tNjRfaSAjIyBUWVBFW2ldKTsgXAorICAgICAgICAgICAgICAgICAgICByZXMubTY0X3UgIyMgVFlQRVtpXSA9ICggYS5tNjRfdSAjIyBUWVBFW2ldID49IGxpbWl0KSA/IHJlcy5tNjRfdSAjIyBUWVBFW2ldID0gfigoaW50ICMjIFRZUEUgIyMgX3QpIDApIDogYS5tNjRfdSAjIyBUWVBFW2ldIDw8IGIubTY0X2kgIyMgVFlQRVtpXTsgfX19fSBcCisgICAgICAgIHJldHVybiByZXM7CisKK2ludDh4OF90IHZxcnNobF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVlFSU0hMLlM4IGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDh4OF90IHZxcnNobF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NBVFVSQVRJTkdfUk9VTkRJTkdfU0hJRlRfU0lHTkVEXzY0KDgsOCkKK30KKworaW50MTZ4NF90IHZxcnNobF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlFSU0hMLlMxNiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQxNng0X3QgdnFyc2hsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19ST1VORElOR19TSElGVF9TSUdORURfNjQoMTYsNCkKK30KKworaW50MzJ4Ml90IHZxcnNobF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlFSU0hMLlMzMiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQzMngyX3QgdnFyc2hsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19ST1VORElOR19TSElGVF9TSUdORURfNjQoMzIsMikKK30KKworaW50NjR4MV90IHZxcnNobF9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVlFSU0hMLlM2NCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ2NHgxX3QgdnFyc2hsX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19ST1VORElOR19TSElGVF9TSUdORURfNjQoNjQsMSkKK30KKwordWludDh4OF90IHZxcnNobF91OCh1aW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZRUlNITC5VOCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50OHg4X3QgdnFyc2hsX3U4KHVpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NBVFVSQVRJTkdfUk9VTkRJTkdfU0hJRlRfVU5TSUdORURfNjQoOCw4KQorfQorCit1aW50MTZ4NF90IHZxcnNobF91MTYodWludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZRUlNITC5zMTYgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDE2eDRfdCB2cXJzaGxfdTE2KHVpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19ST1VORElOR19TSElGVF9VTlNJR05FRF82NCgxNiw0KQorfQorCit1aW50MzJ4Ml90IHZxcnNobF91MzIodWludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZRUlNITC5VMzIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDMyeDJfdCB2cXJzaGxfdTMyKHVpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19ST1VORElOR19TSElGVF9VTlNJR05FRF82NCgzMiwyKQorfQorCit1aW50NjR4MV90IHZxcnNobF91NjQodWludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYik7IC8vIFZRUlNITC5VNjQgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDY0eDFfdCB2cXJzaGxfdTY0KHVpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19ST1VORElOR19TSElGVF9VTlNJR05FRF82NCg2NCwxKQorfQorCitpbnQ4eDE2X3QgdnFyc2hscV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWUVJTSEwuUzggcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50OHgxNl90IHZxcnNobHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NBVFVSQVRJTkdfUk9VTkRJTkdfU0hJRlRfU0lHTkVEKGludDhfdCwgMTYsIDE2KQorfQorCitpbnQxNng4X3QgdnFyc2hscV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKTsgLy8gVlFSU0hMLlMxNiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQxNng4X3QgdnFyc2hscV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NBVFVSQVRJTkdfUk9VTkRJTkdfU0hJRlRfU0lHTkVEKGludDE2X3QsIDgsIDgpCit9CisKK2ludDMyeDRfdCB2cXJzaGxxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWUVJTSEwuUzMyIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDMyeDRfdCB2cXJzaGxxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19ST1VORElOR19TSElGVF9TSUdORUQoaW50MzJfdCwgNCwgNCkKK30KKworaW50NjR4Ml90IHZxcnNobHFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZRUlNITC5TNjQgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50NjR4Ml90IHZxcnNobHFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1JPVU5ESU5HX1NISUZUX1NJR05FRChpbnQ2NF90LCAyLCAyKQorfQorCit1aW50OHgxNl90IHZxcnNobHFfdTgodWludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZRUlNITC5VOCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50OHgxNl90IHZxcnNobHFfdTgodWludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1JPVU5ESU5HX1NISUZUX1VOU0lHTkVEKGludDhfdCwgMTYsIDE2KQorfQorCit1aW50MTZ4OF90IHZxcnNobHFfdTE2KHVpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWUVJTSEwuczE2IHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQxNng4X3QgdnFyc2hscV91MTYodWludDE2eDhfdCBhLCBpbnQxNng4X3QgYiksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIFNFUklBTF9TQVRVUkFUSU5HX1JPVU5ESU5HX1NISUZUX1VOU0lHTkVEKGludDE2X3QsIDgsIDgpCit9CisKK3VpbnQzMng0X3QgdnFyc2hscV91MzIodWludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZRUlNITC5VMzIgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDMyeDRfdCB2cXJzaGxxX3UzMih1aW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgU0VSSUFMX1NBVFVSQVRJTkdfUk9VTkRJTkdfU0hJRlRfVU5TSUdORUQoaW50MzJfdCwgNCwgNCkKK30KKwordWludDY0eDJfdCB2cXJzaGxxX3U2NCh1aW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVlFSU0hMLlU2NCBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50NjR4Ml90IHZxcnNobHFfdTY0KHVpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBTRVJJQUxfU0FUVVJBVElOR19ST1VORElOR19TSElGVF9VTlNJR05FRChpbnQ2NF90LCAyLCAyKQorfQorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBTaGlmdHMgYnkgYSBjb25zdGFudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKiogVmVjdG9yIHNoaWZ0IHJpZ2h0IGJ5IGNvbnN0YW50KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZzaHJfbl9zOChpbnQ4eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZTSFIuUzggZDAsZDAsIzgKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdnNocl9uX3M4KGludDh4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKSAvLyBWU0hSLlM4IGQwLGQwLCM4Cit7CisgICAgLy9ubyA4IGJpdCBzaGlmdCBhdmFpbGFibGUsIGdvIHRvIDE2IGJpdAorICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgcjsKKyAgICByID0gX01NX0NWVEVQSThfRVBJMTYgKF9wTTEyOGkoYSkpOyAvL1NTRSA0LjEKKyAgICByID0gX21tX3NyYWlfZXBpMTYgKHIsIGIpOyAvL1NTRTIKKyAgICByID0gX21tX3BhY2tzX2VwaTE2IChyLHIpOyAvL3dlIG5lZWQgNjQgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocik7Cit9CisKK2ludDE2eDRfdCB2c2hyX25fczE2KGludDE2eDRfdCBhLCAgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKTsgLy8gVlNIUi5TMTYgZDAsZDAsIzE2CitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2c2hyX25fczE2KGludDE2eDRfdCBhLCAgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fc3JhaV9lcGkxNihfcE0xMjhpKGEpLCBiKSk7Cit9CisKKworaW50MzJ4Ml90IHZzaHJfbl9zMzIoaW50MzJ4Ml90IGEsICBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWU0hSLlMzMiBkMCxkMCwjMzIKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZzaHJfbl9zMzIoaW50MzJ4Ml90IGEsICBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9zcmFpX2VwaTMyKF9wTTEyOGkoYSksIGIpKTsKK30KKworaW50NjR4MV90IHZzaHJfbl9zNjQoaW50NjR4MV90IGEsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYik7IC8vIFZTSFIuUzY0IGQwLGQwLCM2NAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ2NHgxX3QgdnNocl9uX3M2NChpbnQ2NHgxX3QgYSwgX19jb25zdHJhbmdlKDEsNjQpIGludCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICAvL25vIGFyaXRobWV0aWMgc2hpZnQgZm9yIDY0Yml0IHZhbHVlcywgc2VyaWFsIHNvbHV0aW9uIHVzZWQKKyAgICBpbnQ2NHgxX3QgcmVzOworICAgIGlmKGI+PTY0KSByZXMubTY0X2k2NFswXSA9IDA7CisgICAgZWxzZSByZXMubTY0X2k2NFswXSA9ICgqKGludDY0X3QqKSZhKSA+PiBiOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ4eDhfdCB2c2hyX25fdTgodWludDh4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlNIUi5VOCBkMCxkMCwjOAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnNocl9uX3U4KHVpbnQ4eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYikgLy8gVlNIUi5VOCBkMCxkMCwjOAoreworICAgIC8vbm8gOCBiaXQgc2hpZnQgYXZhaWxhYmxlLCBnbyB0byAxNiBiaXQKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByOworICAgIHIgPSBfTU1fQ1ZURVBVOF9FUEkxNiAoX3BNMTI4aShhKSk7IC8vU1NFIDQuMQorICAgIHIgPSBfbW1fc3JsaV9lcGkxNiAociwgYik7IC8vZm9yIHVuc2lnbmVkIHZhcmlhYmxlcyB3ZSB1c2UgdGhlIGxvZ2ljYWwgc2hpZnQgbm90IGFyaXRobWV0aWNhbCBvbmUKKyAgICByID0gX21tX3BhY2t1c19lcGkxNiAocixyKTsgLy93ZSBuZWVkIDY0IGJpdHMgb25seQorICAgIHJldHVybjY0KHIpOworfQorCit1aW50MTZ4NF90IHZzaHJfbl91MTYodWludDE2eDRfdCBhLCAgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKTsgLy8gVlNIUi5zMTYgZDAsZDAsIzE2CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdnNocl9uX3UxNih1aW50MTZ4NF90IGEsICBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpCit7CisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fc3JsaV9lcGkxNihfcE0xMjhpKGEpLCBiKSk7Cit9CisKKwordWludDMyeDJfdCB2c2hyX25fdTMyKHVpbnQzMngyX3QgYSwgIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZTSFIuVTMyIGQwLGQwLCMzMgorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZzaHJfbl91MzIodWludDMyeDJfdCBhLCAgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKQoreworICAgIHVpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX3NybGlfZXBpMzIoX3BNMTI4aShhKSwgYikpOworfQorCisKK3VpbnQ2NHgxX3QgdnNocl9uX3U2NCh1aW50NjR4MV90IGEsICBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGIpOyAvLyBWU0hSLlU2NCBkMCxkMCwjNjQKK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDFfdCB2c2hyX25fdTY0KHVpbnQ2NHgxX3QgYSwgIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYikKK3sKKyAgICB1aW50NjR4MV90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9zcmxpX2VwaTY0KF9wTTEyOGkoYSksIGIpKTsKK30KKworCitpbnQ4eDE2X3QgdnNocnFfbl9zOChpbnQ4eDE2X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWU0hSLlM4IHEwLHEwLCM4CitfTkVPTjJTU0VfSU5MSU5FIGludDh4MTZfdCB2c2hycV9uX3M4KGludDh4MTZfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYikgLy8gVlNIUi5TOCBxMCxxMCwjOAoreworICAgIC8vbm8gOCBiaXQgc2hpZnQgYXZhaWxhYmxlLCBnbyB0byAxNiBiaXQgdHJpY2sKKyAgICBfX20xMjhpIHplcm8sIG1hc2swLCBhX3NpZ24sIHIsIGFfc2lnbl9tYXNrOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQxNl90IG1hc2swXzE2WzldID0gezB4MDAwMCwgMHgwMDgwLCAweDAwYzAsIDB4MDBlMCwgMHgwMGYwLCAgMHgwMGY4LCAweDAwZmMsIDB4MDBmZSwgMHgwMGZmfTsKKyAgICB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICBtYXNrMCA9IF9tbV9zZXQxX2VwaTE2KG1hc2swXzE2W2JdKTsgLy90byBtYXNrIHRoZSBiaXRzIHRvIGJlICJzcG9pbGVkIiAgYnkgMTYgYml0IHNoaWZ0CisgICAgYV9zaWduID0gIF9tbV9jbXBndF9lcGk4ICh6ZXJvLCBhKTsgLy9mZiBpZiBhPDAgb3IgemVybyBpZiBhPjAKKyAgICByID0gX21tX3NyYWlfZXBpMTYgKGEsIGIpOworICAgIGFfc2lnbl9tYXNrID0gIF9tbV9hbmRfc2kxMjggKG1hc2swLCBhX3NpZ24pOworICAgIHIgPSAgX21tX2FuZG5vdF9zaTEyOCAobWFzazAsIHIpOworICAgIHJldHVybiBfbW1fb3Jfc2kxMjggKHIsIGFfc2lnbl9tYXNrKTsKK30KKworaW50MTZ4OF90IHZzaHJxX25fczE2KGludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWU0hSLlMxNiBxMCxxMCwjMTYKKyNkZWZpbmUgdnNocnFfbl9zMTYgX21tX3NyYWlfZXBpMTYKKworaW50MzJ4NF90IHZzaHJxX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWU0hSLlMzMiBxMCxxMCwjMzIKKyNkZWZpbmUgdnNocnFfbl9zMzIgX21tX3NyYWlfZXBpMzIKKworaW50NjR4Ml90IHZzaHJxX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGIpOyAvLyBWU0hSLlM2NCBxMCxxMCwjNjQKK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4Ml90IHZzaHJxX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGIpCit7CisgICAgLy9TSU1EIGltcGxlbWVudGF0aW9uIG1heSBiZSBub3Qgb3B0aW1hbCBkdWUgdG8gNjQgYml0IGFyaXRobWV0aWMgc2hpZnQgYWJzZW5zZSBpbiB4ODYgU0lNRAorICAgIF9fbTEyOGkgYzEsIHNpZ25tYXNrLGEwLCAgcmVzNjQ7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ2NF90IG1hc2tbXSA9IHsweDgwMDAwMDAwMDAwMDAwMDAsIDB4ODAwMDAwMDAwMDAwMDAwMH07CisgICAgYzEgPSAgX21tX2NtcGVxX2VwaTMyKGEsYSk7IC8vMHhmZmZmZmZmZmZmZmZmZmZmCisgICAgc2lnbm1hc2sgID0gIF9tbV9zbGxpX2VwaTY0IChjMSwgKDY0IC0gYikpOworICAgIGEwID0gX21tX29yX3NpMTI4KGEsICooX19tMTI4aSopbWFzayk7IC8vZ2V0IHRoZSBmaXJzdCBiaXQKKyAgICBhMCA9IF9NTV9DTVBFUV9FUEk2NCAoYSwgYTApOworICAgIHNpZ25tYXNrID0gX21tX2FuZF9zaTEyOChhMCwgc2lnbm1hc2spOworICAgIHJlczY0ID0gX21tX3NybGlfZXBpNjQgKGEsIGIpOworICAgIHJldHVybiBfbW1fb3Jfc2kxMjgocmVzNjQsIHNpZ25tYXNrKTsKK30KKwordWludDh4MTZfdCB2c2hycV9uX3U4KHVpbnQ4eDE2X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWU0hSLlU4IHEwLHEwLCM4CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDE2X3QgdnNocnFfbl91OCh1aW50OHgxNl90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKSAvLyBWU0hSLlU4IHEwLHEwLCM4Cit7CisgICAgLy9ubyA4IGJpdCBzaGlmdCBhdmFpbGFibGUsIG5lZWQgdGhlIHNwZWNpYWwgdHJpY2sKKyAgICBfX20xMjhpIG1hc2swLCByOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50MTZfdCBtYXNrMTBfMTZbOV0gPSB7MHhmZmZmLCAweGZmN2YsIDB4ZmYzZiwgMHhmZjFmLCAweGZmMGYsICAweGZmMDcsIDB4ZmYwMywgMHhmZjAxLCAweGZmMDB9OworICAgIG1hc2swID0gX21tX3NldDFfZXBpMTYobWFzazEwXzE2W2JdKTsgLy90byBtYXNrIHRoZSBiaXRzIHRvIGJlICJzcG9pbGVkIiAgYnkgMTYgYml0IHNoaWZ0CisgICAgciA9IF9tbV9zcmxpX2VwaTE2ICggYSwgYik7CisgICAgcmV0dXJuIF9tbV9hbmRfc2kxMjggKHIsICBtYXNrMCk7Cit9CisKK3VpbnQxNng4X3QgdnNocnFfbl91MTYodWludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWU0hSLnMxNiBxMCxxMCwjMTYKKyNkZWZpbmUgdnNocnFfbl91MTYgX21tX3NybGlfZXBpMTYKKwordWludDMyeDRfdCB2c2hycV9uX3UzMih1aW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZTSFIuVTMyIHEwLHEwLCMzMgorI2RlZmluZSB2c2hycV9uX3UzMiBfbW1fc3JsaV9lcGkzMgorCit1aW50NjR4Ml90IHZzaHJxX25fdTY0KHVpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsNjQpIGludCBiKTsgLy8gVlNIUi5VNjQgcTAscTAsIzY0CisjZGVmaW5lIHZzaHJxX25fdTY0IF9tbV9zcmxpX2VwaTY0CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqIFZlY3RvciBzaGlmdCBsZWZ0IGJ5IGNvbnN0YW50ICoqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQ4eDhfdCB2c2hsX25fczgoaW50OHg4X3QgYSwgX19jb25zdHJhbmdlKDAsNykgaW50IGIpOyAvLyBWU0hMLkk4IGQwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZzaGxfbl9zOChpbnQ4eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYikgLy8gVlNITC5JOCBkMCxkMCwjMAoreworICAgIC8vbm8gOCBiaXQgc2hpZnQgYXZhaWxhYmxlLCBnbyB0byAxNiBiaXQKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHI7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrOF8xNl9ldmVuX29kZFsxNl0gPSB7IDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDEsIDMsIDUsIDcsIDksIDExLCAxMywgMTUgfTsKKyAgICByID0gX01NX0NWVEVQSThfRVBJMTYgKF9wTTEyOGkoYSkpOyAvL1NTRSA0LjEKKyAgICByID0gX21tX3NsbGlfZXBpMTYgKHIsIGIpOyAvL1NTRTIKKyAgICByID0gX21tX3NodWZmbGVfZXBpOCAociwgKihfX20xMjhpKikgbWFzazhfMTZfZXZlbl9vZGQpOyAvL3JldHVybiB0byA4IGJpdCwgd2UgbmVlZCA2NCBiaXRzIG9ubHkKKyAgICByZXR1cm42NChyKTsKK30KKworaW50MTZ4NF90IHZzaGxfbl9zMTYoaW50MTZ4NF90IGEsICBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGIpOyAvLyBWU0hMLkkxNiBkMCxkMCwjMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdnNobF9uX3MxNihpbnQxNng0X3QgYSwgIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYikKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX3NsbGlfZXBpMTYoX3BNMTI4aShhKSwgYikpOworfQorCisKK2ludDMyeDJfdCB2c2hsX25fczMyKGludDMyeDJfdCBhLCAgX19jb25zdHJhbmdlKDAsMzEpIGludCBiKTsgLy8gVlNITC5JMzIgZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZzaGxfbl9zMzIoaW50MzJ4Ml90IGEsICBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9zbGxpX2VwaTMyKF9wTTEyOGkoYSksIGIpKTsKK30KKworCitpbnQ2NHgxX3QgdnNobF9uX3M2NChpbnQ2NHgxX3QgYSwgIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYik7IC8vIFZTSEwuSTY0IGQwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDFfdCB2c2hsX25fczY0KGludDY0eDFfdCBhLCAgX19jb25zdHJhbmdlKDAsNjMpIGludCBiKQoreworICAgIGludDY0eDFfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fc2xsaV9lcGk2NChfcE0xMjhpKGEpLCBiKSk7Cit9CisKKwordWludDh4OF90IHZzaGxfbl91OCh1aW50OHg4X3QgYSwgX19jb25zdHJhbmdlKDAsNykgaW50IGIpOyAvLyBWU0hMLkk4IGQwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2c2hsX25fdTgodWludDh4OF90IGEsIF9fY29uc3RyYW5nZSgwLDcpIGludCBiKQoreworICAgIC8vbm8gOCBiaXQgc2hpZnQgYXZhaWxhYmxlLCBnbyB0byAxNiBiaXQKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBtYXNrODsKKyAgICBfX20xMjhpIHI7CisgICAgbWFzazggPSBfbW1fc2V0MV9lcGkxNigweGZmKTsKKyAgICByID0gX01NX0NWVEVQVThfRVBJMTYgKF9wTTEyOGkoYSkpOyAvL1NTRSA0LjEKKyAgICByID0gX21tX3NsbGlfZXBpMTYgKHIsIGIpOyAvL1NTRTIKKyAgICByID0gX21tX2FuZF9zaTEyOChyLCBtYXNrOCk7IC8vdG8gYXZvaWQgc2F0dXJhdGlvbgorICAgIHIgPSBfbW1fcGFja3VzX2VwaTE2IChyLHIpOyAvL3dlIG5lZWQgNjQgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocik7Cit9CisKK3VpbnQxNng0X3QgdnNobF9uX3UxNih1aW50MTZ4NF90IGEsICBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGIpOyAvLyBWU0hMLkkxNiBkMCxkMCwjMAorI2RlZmluZSB2c2hsX25fdTE2IHZzaGxfbl9zMTYKKworCit1aW50MzJ4Ml90IHZzaGxfbl91MzIodWludDMyeDJfdCBhLCAgX19jb25zdHJhbmdlKDAsMzEpIGludCBiKTsgLy8gVlNITC5JMzIgZDAsZDAsIzAKKyNkZWZpbmUgdnNobF9uX3UzMiB2c2hsX25fczMyCisKK3VpbnQ2NHgxX3QgdnNobF9uX3U2NCh1aW50NjR4MV90IGEsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYik7IC8vIFZTSEwuSTY0IGQwLGQwLCMwCisjZGVmaW5lIHZzaGxfbl91NjQgdnNobF9uX3M2NAorCitpbnQ4eDE2X3QgdnNobHFfbl9zOChpbnQ4eDE2X3QgYSwgX19jb25zdHJhbmdlKDAsNykgaW50IGIpOyAvLyBWU0hMLkk4IHEwLHEwLCMwCisjZGVmaW5lIHZzaGxxX25fczggdnNobHFfbl91OAorCitpbnQxNng4X3QgdnNobHFfbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYik7IC8vIFZTSEwuSTE2IHEwLHEwLCMwCisjZGVmaW5lIHZzaGxxX25fczE2IF9tbV9zbGxpX2VwaTE2CisKK2ludDMyeDRfdCB2c2hscV9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDAsMzEpIGludCBiKTsgLy8gVlNITC5JMzIgcTAscTAsIzAKKyNkZWZpbmUgdnNobHFfbl9zMzIgX21tX3NsbGlfZXBpMzIKKworaW50NjR4Ml90IHZzaGxxX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGIpOyAvLyBWU0hMLkk2NCBxMCxxMCwjMAorI2RlZmluZSB2c2hscV9uX3M2NCBfbW1fc2xsaV9lcGk2NAorCit1aW50OHgxNl90IHZzaGxxX25fdTgodWludDh4MTZfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYik7IC8vIFZTSEwuSTggcTAscTAsIzAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZfdCB2c2hscV9uX3U4KHVpbnQ4eDE2X3QgYSwgX19jb25zdHJhbmdlKDAsNykgaW50IGIpCit7CisgICAgLy9ubyA4IGJpdCBzaGlmdCBhdmFpbGFibGUsIG5lZWQgdGhlIHNwZWNpYWwgdHJpY2sKKyAgICBfX20xMjhpIG1hc2swLCByOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50MTZfdCBtYXNrMTBfMTZbOV0gPSB7MHhmZmZmLCAweGZlZmYsIDB4ZmNmZiwgMHhmOGZmLCAweGYwZmYsICAweGUwZmYsIDB4YzBmZiwgMHg4MGZmLCAweGZmfTsKKyAgICBtYXNrMCA9IF9tbV9zZXQxX2VwaTE2KG1hc2sxMF8xNltiXSk7IC8vdG8gbWFzayB0aGUgYml0cyB0byBiZSAic3BvaWxlZCIgIGJ5IDE2IGJpdCBzaGlmdAorICAgIHIgPSBfbW1fc2xsaV9lcGkxNiAoIGEsIGIpOworICAgIHJldHVybiBfbW1fYW5kX3NpMTI4IChyLCAgbWFzazApOworfQorCit1aW50MTZ4OF90IHZzaGxxX25fdTE2KHVpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKTsgLy8gVlNITC5JMTYgcTAscTAsIzAKKyNkZWZpbmUgdnNobHFfbl91MTYgdnNobHFfbl9zMTYKKwordWludDMyeDRfdCB2c2hscV9uX3UzMih1aW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgwLDMxKSBpbnQgYik7IC8vIFZTSEwuSTMyIHEwLHEwLCMwCisjZGVmaW5lIHZzaGxxX25fdTMyIHZzaGxxX25fczMyCisKK3VpbnQ2NHgyX3QgdnNobHFfbl91NjQodWludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGIpOyAvLyBWU0hMLkk2NCBxMCxxMCwjMAorI2RlZmluZSB2c2hscV9uX3U2NCB2c2hscV9uX3M2NAorCisvLyoqKioqKioqKioqKiogVmVjdG9yIHJvdW5kaW5nIHNoaWZ0IHJpZ2h0IGJ5IGNvbnN0YW50ICoqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL05vIGNvcnJlc3BvbmRpbmcgIHg4NiBpbnRyaW5zaWNzIGV4aXN0LCBuZWVkIHRvIGRvIHNvbWUgdHJpY2tzCitpbnQ4eDhfdCB2cnNocl9uX3M4KGludDh4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlJTSFIuUzggZDAsZDAsIzgKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdnJzaHJfbl9zOChpbnQ4eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYikgLy8gVlJTSFIuUzggZDAsZDAsIzgKK3sKKyAgICAvL25vIDggYml0IHNoaWZ0IGF2YWlsYWJsZSwgZ28gdG8gMTYgYml0CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByLCBtYXNrYjsKKyAgICByID0gX01NX0NWVEVQSThfRVBJMTYgKF9wTTEyOGkoYSkpOyAvL1NTRSA0LjEKKyAgICBtYXNrYiA9ICBfbW1fc2xsaV9lcGkxNiAociwgKDE2IC0gYikpOyAvL3RvIGdldCByb3VuZGluZyAoYi0xKXRoIGJpdAorICAgIG1hc2tiID0gX21tX3NybGlfZXBpMTYgKG1hc2tiLCAxNSk7IC8vMSBvciAwCisgICAgciA9IF9tbV9zcmFpX2VwaTE2IChyLCBiKTsKKyAgICByID0gX21tX2FkZF9lcGkxNiAociwgbWFza2IpOyAvL2FjdHVhbCByb3VuZGluZworICAgIHIgPSBfbW1fcGFja3NfZXBpMTYgKHIscik7IC8vLy93ZSBuZWVkIDY0IGJpdHMgb25seQorICAgIHJldHVybjY0KHIpOworfQorCitpbnQxNng0X3QgdnJzaHJfbl9zMTYoaW50MTZ4NF90IGEsICBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWUlNIUi5TMTYgZDAsZDAsIzE2CitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2cnNocl9uX3MxNihpbnQxNng0X3QgYSwgIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYikKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnJzaHJxX25fczE2KF9wTTEyOGkoYSksIGIpKTsKK30KKworCitpbnQzMngyX3QgdnJzaHJfbl9zMzIoaW50MzJ4Ml90IGEsICBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWUlNIUi5TMzIgZDAsZDAsIzMyCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2cnNocl9uX3MzMihpbnQzMngyX3QgYSwgIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYikKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnJzaHJxX25fczMyKF9wTTEyOGkoYSksIGIpKTsKK30KKworCitpbnQ2NHgxX3QgdnJzaHJfbl9zNjQoaW50NjR4MV90IGEsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYik7IC8vIFZSU0hSLlM2NCBkMCxkMCwjNjQKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50NjR4MV90IHZyc2hyX25fczY0KGludDY0eDFfdCBhLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIC8vc2VyaWFsIHNvbHV0aW9uIGlzIGZhc3RlcgorICAgIGludDY0eDFfdCByZXM7CisgICAgaW50NjRfdCBhX2k2NCA9ICooIGludDY0X3QqKSZhOworICAgIGlmKGI9PTY0KSB7CisgICAgICAgIHJlcy5tNjRfaTY0WzBdID0gMDsgLy9mb3Igc29tZSBjb21waWxlcnMgcm91bmRpbmcgaGFwcGVucyBhbmQgd2UgbmVlZCB0byB1c2UoYV9pNjQgJiBfU0lHTkJJVDY0KT4+NjM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50NjRfdCBtYXNrYiA9IGFfaTY0ICYgKCggaW50NjRfdCkxIDw8IChiIC0gMSkpOworICAgICAgICByZXMubTY0X2k2NFswXSA9IChhX2k2NCA+PiBiKSArIChtYXNrYiA+PiAoYiAtIDEpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDh4OF90IHZyc2hyX25fdTgodWludDh4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlJTSFIuVTggZDAsZDAsIzgKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZyc2hyX25fdTgodWludDh4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKSAvLyBWUlNIUi5VOCBkMCxkMCwjOAoreworICAgIC8vbm8gOCBiaXQgc2hpZnQgYXZhaWxhYmxlLCBnbyB0byAxNiBiaXQsIHNvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbCBjb21wYXJlZCB3aXRoIHRoZSBzZXJpYWwgb25lCisgICAgdWludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgciwgbWFza2I7CisgICAgciA9IF9NTV9DVlRFUFU4X0VQSTE2IChfcE0xMjhpKGEpKTsgLy9TU0UgNC4xCisgICAgbWFza2IgPSAgX21tX3NsbGlfZXBpMTYgKHIsICgxNiAtIGIpKTsgLy90byBnZXQgcm91bmRpbmcgKGItMSl0aCBiaXQKKyAgICBtYXNrYiA9IF9tbV9zcmxpX2VwaTE2IChtYXNrYiwgMTUpOyAvLzEgb3IgMAorICAgIHIgPSBfbW1fc3JsaV9lcGkxNiAociwgYik7CisgICAgciA9IF9tbV9hZGRfZXBpMTYgKHIsIG1hc2tiKTsgLy9hY3R1YWwgcm91bmRpbmcKKyAgICByID0gIF9tbV9wYWNrdXNfZXBpMTYgKHIscik7IC8vLy93ZSBuZWVkIDY0IGJpdHMgb25seQorICAgIHJldHVybjY0KHIpOworfQorCit1aW50MTZ4NF90IHZyc2hyX25fdTE2KHVpbnQxNng0X3QgYSwgIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZSU0hSLnMxNiBkMCxkMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2cnNocl9uX3UxNih1aW50MTZ4NF90IGEsICBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpCit7CisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NCh2cnNocnFfbl91MTYoX3BNMTI4aShhKSwgYikpOworfQorCisKK3VpbnQzMngyX3QgdnJzaHJfbl91MzIodWludDMyeDJfdCBhLCAgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlJTSFIuVTMyIGQwLGQwLCMzMgorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZyc2hyX25fdTMyKHVpbnQzMngyX3QgYSwgIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYikKK3sKKyAgICB1aW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KHZyc2hycV9uX3UzMihfcE0xMjhpKGEpLCBiKSk7Cit9CisKKwordWludDY0eDFfdCB2cnNocl9uX3U2NCh1aW50NjR4MV90IGEsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYik7IC8vIFZSU0hSLlU2NCBkMCxkMCwjNjQKK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDFfdCB2cnNocl9uX3U2NCh1aW50NjR4MV90IGEsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYikKK3sKKyAgICB1aW50NjR4MV90IHJlczY0OworICAgIHJldHVybjY0KHZyc2hycV9uX3U2NChfcE0xMjhpKGEpLCBiKSk7Cit9CisKK2ludDh4MTZfdCB2cnNocnFfbl9zOChpbnQ4eDE2X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWUlNIUi5TOCBxMCxxMCwjOAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2X3QgdnJzaHJxX25fczgoaW50OHgxNl90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKSAvLyBWUlNIUi5TOCBxMCxxMCwjOAoreworICAgIC8vbm8gOCBiaXQgc2hpZnQgYXZhaWxhYmxlLCBnbyB0byAxNiBiaXQgdHJpY2sKKyAgICBfX20xMjhpIHIsIG1hc2sxLCBtYXNrYjsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDE2X3QgbWFzazJiWzldID0gezB4MDAwMCwgMHgwMTAxLCAweDAyMDIsIDB4MDQwNCwgMHgwODA4LCAweDEwMTAsIDB4MjAyMCwgMHg0MDQwLCAweDgwODB9OyAvLyAyXmItdGggYml0IHNldCB0byAxCisgICAgciA9IHZzaHJxX25fczggKGEsIGIpOworICAgIG1hc2sxID0gX21tX3NldDFfZXBpMTYobWFzazJiW2JdKTsgLy8gMl5iLXRoIGJpdCBzZXQgdG8gMSBmb3IgMTZiaXQsIG5lZWQgaXQgZm9yIHJvdW5kaW5nCisgICAgbWFza2IgPSBfbW1fYW5kX3NpMTI4KGEsIG1hc2sxKTsgLy9nZXQgYiBvciAwIGZvciByb3VuZGluZworICAgIG1hc2tiID0gIF9tbV9zcmxpX2VwaTE2IChtYXNrYiwgYiAtIDEpOyAvLyB0byBhZGQgMQorICAgIHJldHVybiBfbW1fYWRkX2VwaTgociwgbWFza2IpOyAvL2FjdHVhbCByb3VuZGluZworfQorCitpbnQxNng4X3QgdnJzaHJxX25fczE2KGludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWUlNIUi5TMTYgcTAscTAsIzE2CitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2cnNocnFfbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYikgLy8gVlJTSFIuUzE2IHEwLHEwLCMxNgoreworICAgIF9fbTEyOGkgbWFza2IsIHI7CisgICAgbWFza2IgPSAgX21tX3NsbGlfZXBpMTYoYSwgKDE2IC0gYikpOyAvL3RvIGdldCByb3VuZGluZyAoYi0xKXRoIGJpdAorICAgIG1hc2tiID0gX21tX3NybGlfZXBpMTYobWFza2IsIDE1KTsgLy8xIG9yIDAKKyAgICByID0gX21tX3NyYWlfZXBpMTYgKGEsIGIpOworICAgIHJldHVybiBfbW1fYWRkX2VwaTE2IChyLCBtYXNrYik7IC8vYWN0dWFsIHJvdW5kaW5nCit9CisKK2ludDMyeDRfdCB2cnNocnFfbl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZSU0hSLlMzMiBxMCxxMCwjMzIKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZyc2hycV9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKSAvLyBWUlNIUi5TMzIgcTAscTAsIzMyCit7CisgICAgX19tMTI4aSBtYXNrYiwgIHI7CisgICAgbWFza2IgPSBfbW1fc2xsaV9lcGkzMiAoYSwgKDMyIC0gYikpOyAvL3RvIGdldCByb3VuZGluZyAoYi0xKXRoIGJpdAorICAgIG1hc2tiID0gX21tX3NybGlfZXBpMzIgKG1hc2tiLDMxKTsgLy8xIG9yIDAKKyAgICByID0gX21tX3NyYWlfZXBpMzIoYSwgYik7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMzIgKHIsIG1hc2tiKTsgLy9hY3R1YWwgcm91bmRpbmcKK30KKworaW50NjR4Ml90IHZyc2hycV9uX3M2NChpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsNjQpIGludCBiKTsgLy8gVlJTSFIuUzY0IHEwLHEwLCM2NAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgyX3QgdnJzaHJxX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGIpCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCBhIHNlcmlhbCBvbmUKKyAgICBfX20xMjhpIG1hc2tiOworICAgIGludDY0eDJfdCByOworICAgIG1hc2tiID0gX21tX3NsbGlfZXBpNjQgKGEsICg2NCAtIGIpKTsgLy90byBnZXQgcm91bmRpbmcgKGItMSl0aCBiaXQKKyAgICBtYXNrYiA9IF9tbV9zcmxpX2VwaTY0IChtYXNrYiw2Myk7IC8vMSBvciAwCisgICAgciA9IHZzaHJxX25fczY0KGEsIGIpOworICAgIHJldHVybiBfbW1fYWRkX2VwaTY0IChyLCBtYXNrYik7IC8vYWN0dWFsIHJvdW5kaW5nCit9CisKK3VpbnQ4eDE2X3QgdnJzaHJxX25fdTgodWludDh4MTZfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZSU0hSLlU4IHEwLHEwLCM4CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDE2X3QgdnJzaHJxX25fdTgodWludDh4MTZfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYikgLy8gVlJTSFIuVTggcTAscTAsIzgKK3sKKyAgICAvL25vIDggYml0IHNoaWZ0IGF2YWlsYWJsZSwgZ28gdG8gMTYgYml0IHRyaWNrCisgICAgX19tMTI4aSByLCBtYXNrMSwgbWFza2I7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQxNl90IG1hc2syYls5XSA9IHsweDAwMDAsIDB4MDEwMSwgMHgwMjAyLCAweDA0MDQsIDB4MDgwOCwgMHgxMDEwLCAweDIwMjAsIDB4NDA0MCwgMHg4MDgwfTsgLy8gMl5iLXRoIGJpdCBzZXQgdG8gMQorICAgIHIgPSB2c2hycV9uX3U4IChhLCBiKTsKKyAgICBtYXNrMSA9IF9tbV9zZXQxX2VwaTE2KG1hc2syYltiXSk7IC8vIDJeYi10aCBiaXQgc2V0IHRvIDEgZm9yIDE2Yml0LCBuZWVkIGl0IGZvciByb3VuZGluZworICAgIG1hc2tiID0gX21tX2FuZF9zaTEyOChhLCBtYXNrMSk7IC8vZ2V0IGIgb3IgMCBmb3Igcm91bmRpbmcKKyAgICBtYXNrYiA9ICBfbW1fc3JsaV9lcGkxNiAobWFza2IsIGIgLSAxKTsgLy8gdG8gYWRkIDEKKyAgICByZXR1cm4gX21tX2FkZF9lcGk4KHIsIG1hc2tiKTsgLy9hY3R1YWwgcm91bmRpbmcKK30KKwordWludDE2eDhfdCB2cnNocnFfbl91MTYodWludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWUlNIUi5zMTYgcTAscTAsIzE2CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3QgdnJzaHJxX25fdTE2KHVpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKSAvLyBWUlNIUi5TMTYgcTAscTAsIzE2Cit7CisgICAgX19tMTI4aSBtYXNrYiwgcjsKKyAgICBtYXNrYiA9ICBfbW1fc2xsaV9lcGkxNihhLCAoMTYgLSBiKSk7IC8vdG8gZ2V0IHJvdW5kaW5nIChiLTEpdGggYml0CisgICAgbWFza2IgPSBfbW1fc3JsaV9lcGkxNihtYXNrYiwgMTUpOyAvLzEgb3IgMAorICAgIHIgPSBfbW1fc3JsaV9lcGkxNiAoYSwgYik7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMTYgKHIsIG1hc2tiKTsgLy9hY3R1YWwgcm91bmRpbmcKK30KKwordWludDMyeDRfdCB2cnNocnFfbl91MzIodWludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWUlNIUi5VMzIgcTAscTAsIzMyCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdnJzaHJxX25fdTMyKHVpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKSAvLyBWUlNIUi5TMzIgcTAscTAsIzMyCit7CisgICAgX19tMTI4aSBtYXNrYiwgIHI7CisgICAgbWFza2IgPSBfbW1fc2xsaV9lcGkzMiAoYSwgKDMyIC0gYikpOyAvL3RvIGdldCByb3VuZGluZyAoYi0xKXRoIGJpdAorICAgIG1hc2tiID0gX21tX3NybGlfZXBpMzIgKG1hc2tiLDMxKTsgLy8xIG9yIDAKKyAgICByID0gX21tX3NybGlfZXBpMzIoYSwgYik7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpMzIgKHIsIG1hc2tiKTsgLy9hY3R1YWwgcm91bmRpbmcKK30KKwordWludDY0eDJfdCB2cnNocnFfbl91NjQodWludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGIpOyAvLyBWUlNIUi5VNjQgcTAscTAsIzY0CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgyX3QgdnJzaHJxX25fdTY0KHVpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsNjQpIGludCBiKQoreworICAgIC8vc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggYSBzZXJpYWwgb25lCisgICAgX19tMTI4aSBtYXNrYiwgIHI7CisgICAgbWFza2IgPSBfbW1fc2xsaV9lcGk2NCAoYSwgKDY0IC0gYikpOyAvL3RvIGdldCByb3VuZGluZyAoYi0xKXRoIGJpdAorICAgIG1hc2tiID0gX21tX3NybGlfZXBpNjQgKG1hc2tiLDYzKTsgLy8xIG9yIDAKKyAgICByID0gX21tX3NybGlfZXBpNjQoYSwgYik7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpNjQgKHIsIG1hc2tiKTsgLy9hY3R1YWwgcm91bmRpbmcKK30KKworLy8qKioqKioqKioqKioqIFZlY3RvciBzaGlmdCByaWdodCBieSBjb25zdGFudCBhbmQgYWNjdW11bGF0ZSAqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQ4eDhfdCB2c3JhX25fczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpOyAvLyBWU1JBLlM4IGQwLGQwLCM4CitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZzcmFfbl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYykgLy8gVlNSQS5TOCBkMCxkMCwjOAoreworICAgIGludDh4OF90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnNocl9uX3M4KGIsIGMpOworICAgIHJldHVybiB2YWRkX3M4KCBhLCBzaGlmdCk7Cit9CisKK2ludDE2eDRfdCB2c3JhX25fczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlNSQS5TMTYgZDAsZDAsIzE2CitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2c3JhX25fczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKSAvLyBWU1JBLlMxNiBkMCxkMCwjMTYKK3sKKyAgICBpbnQxNng0X3Qgc2hpZnQ7CisgICAgc2hpZnQgPSB2c2hyX25fczE2KCBiLCBjKTsKKyAgICByZXR1cm4gdmFkZF9zMTYoYSwgc2hpZnQpOworfQorCitpbnQzMngyX3QgdnNyYV9uX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYyk7IC8vIFZTUkEuUzMyIGQwLGQwLCMzMgorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdnNyYV9uX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYykgLy8gVlNSQS5TMzIgZDAsZDAsIzMyCit7CisgICAgLy9tYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCB0aGUgc2VyaWFsIGV4ZWN1dGlvbgorICAgIGludDMyeDJfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZzaHJfbl9zMzIoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRfczMyKCBhLCBzaGlmdCk7Cit9CisKK2ludDY0eDFfdCB2c3JhX25fczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKTsgLy8gVlNSQS5TNjQgZDAsZDAsIzY0CitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDFfdCB2c3JhX25fczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKQoreworICAgIC8vbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggYSBzZXJpYWwgc29sdXRpb24KKyAgICBpbnQ2NHgxX3Qgc2hpZnQ7CisgICAgc2hpZnQgPSB2c2hyX25fczY0KGIsIGMpOworICAgIHJldHVybiB2YWRkX3M2NCggYSwgc2hpZnQpOworfQorCit1aW50OHg4X3QgdnNyYV9uX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpOyAvLyBWU1JBLlU4IGQwLGQwLCM4CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2c3JhX25fdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYykgLy8gVlNSQS5VOCBkMCxkMCwjOAoreworICAgIHVpbnQ4eDhfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZzaHJfbl91OChiLCBjKTsKKyAgICByZXR1cm4gdmFkZF91OChhLCBzaGlmdCk7Cit9CisKK3VpbnQxNng0X3QgdnNyYV9uX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlNSQS5zMTYgZDAsZDAsIzE2CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdnNyYV9uX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKSAvLyBWU1JBLnMxNiBkMCxkMCwjMTYKK3sKKyAgICB1aW50MTZ4NF90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnNocl9uX3UxNihiLCBjKTsKKyAgICByZXR1cm4gdmFkZF91MTYoYSxzaGlmdCk7Cit9CisKK3VpbnQzMngyX3QgdnNyYV9uX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKTsgLy8gVlNSQS5VMzIgZDAsZDAsIzMyCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdnNyYV9uX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKSAvLyBWU1JBLlUzMiBkMCxkMCwjMzIKK3sKKyAgICAvL21heSBiZSBub3Qgb3B0aW1hbCBjb21wYXJlZCB3aXRoIHRoZSBzZXJpYWwgZXhlY3V0aW9uCisgICAgdWludDMyeDJfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZzaHJfbl91MzIoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRfdTMyKCBhLCBzaGlmdCk7Cit9CisKK3VpbnQ2NHgxX3QgdnNyYV9uX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKTsgLy8gVlNSQS5VNjQgZDAsZDAsIzY0CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgxX3QgdnNyYV9uX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKSAvLyBWU1JBLlU2NCBkMCxkMCwjNjQKK3sKKyAgICAvL21heSBiZSBub3Qgb3B0aW1hbCBjb21wYXJlZCB3aXRoIHRoZSBzZXJpYWwgZXhlY3V0aW9uCisgICAgdWludDY0eDFfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZzaHJfbl91NjQoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRfdTY0KGEsIHNoaWZ0KTsKK30KKworaW50OHgxNl90IHZzcmFxX25fczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZTUkEuUzggcTAscTAsIzgKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90IHZzcmFxX25fczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYykgLy8gVlNSQS5TOCBxMCxxMCwjOAoreworICAgIGludDh4MTZfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZzaHJxX25fczgoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRxX3M4KGEsIHNoaWZ0KTsKK30KKworaW50MTZ4OF90IHZzcmFxX25fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlNSQS5TMTYgcTAscTAsIzE2CitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2c3JhcV9uX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYykgLy8gVlNSQS5TMTYgcTAscTAsIzE2Cit7CisgICAgaW50MTZ4OF90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnNocnFfbl9zMTYoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRxX3MxNihhLCBzaGlmdCk7Cit9CisKK2ludDMyeDRfdCB2c3JhcV9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYyk7IC8vIFZTUkEuUzMyIHEwLHEwLCMzMgorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnNyYXFfbl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGMpIC8vIFZTUkEuUzMyIHEwLHEwLCMzMgoreworICAgIGludDMyeDRfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZzaHJxX25fczMyKGIsIGMpOworICAgIHJldHVybiB2YWRkcV9zMzIoYSwgc2hpZnQpOworfQorCitpbnQ2NHgyX3QgdnNyYXFfbl9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpOyAvLyBWU1JBLlM2NCBxMCxxMCwjNjQKK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4Ml90IHZzcmFxX25fczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKSAvLyBWU1JBLlM2NCBxMCxxMCwjNjQKK3sKKyAgICBpbnQ2NHgyX3Qgc2hpZnQ7CisgICAgc2hpZnQgPSB2c2hycV9uX3M2NChiLCBjKTsKKyAgICByZXR1cm4gdmFkZHFfczY0KCBhLCBzaGlmdCk7Cit9CisKK3VpbnQ4eDE2X3QgdnNyYXFfbl91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpOyAvLyBWU1JBLlU4IHEwLHEwLCM4CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDE2X3QgdnNyYXFfbl91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpIC8vIFZTUkEuVTggcTAscTAsIzgKK3sKKyAgICB1aW50OHgxNl90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnNocnFfbl91OChiLCBjKTsKKyAgICByZXR1cm4gdmFkZHFfdTgoYSwgc2hpZnQpOworfQorCit1aW50MTZ4OF90IHZzcmFxX25fdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpOyAvLyBWU1JBLnMxNiBxMCxxMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDhfdCB2c3JhcV9uX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKSAvLyBWU1JBLnMxNiBxMCxxMCwjMTYKK3sKKyAgICB1aW50MTZ4OF90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnNocnFfbl91MTYoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRxX3UxNihhLCAgc2hpZnQpOworfQorCit1aW50MzJ4NF90IHZzcmFxX25fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGMpOyAvLyBWU1JBLlUzMiBxMCxxMCwjMzIKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2c3JhcV9uX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKSAvLyBWU1JBLlUzMiBxMCxxMCwjMzIKK3sKKyAgICB1aW50MzJ4NF90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnNocnFfbl91MzIoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRxX3UzMihhLCBzaGlmdCk7Cit9CisKK3VpbnQ2NHgyX3QgdnNyYXFfbl91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYyk7IC8vIFZTUkEuVTY0IHEwLHEwLCM2NAorX05FT04yU1NFX0lOTElORSB1aW50NjR4Ml90IHZzcmFxX25fdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpIC8vIFZTUkEuVTY0IHEwLHEwLCM2NAoreworICAgIHVpbnQ2NHgyX3Qgc2hpZnQ7CisgICAgc2hpZnQgPSB2c2hycV9uX3U2NChiLCBjKTsKKyAgICByZXR1cm4gdmFkZHFfdTY0KGEsIHNoaWZ0KTsKK30KKworLy8qKioqKioqKioqKioqIFZlY3RvciByb3VuZGluZyBzaGlmdCByaWdodCBieSBjb25zdGFudCBhbmQgYWNjdW11bGF0ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgdnJzcmFfbl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZSU1JBLlM4IGQwLGQwLCM4CitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZyc3JhX25fczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpIC8vIFZSU1JBLlM4IGQwLGQwLCM4Cit7CisgICAgaW50OHg4X3Qgc2hpZnQ7CisgICAgc2hpZnQgPSB2cnNocl9uX3M4KGIsIGMpOworICAgIHJldHVybiB2YWRkX3M4KCBhLCBzaGlmdCk7Cit9CisKK2ludDE2eDRfdCB2cnNyYV9uX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYyk7IC8vIFZSU1JBLlMxNiBkMCxkMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZyc3JhX25fczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKSAvLyBWUlNSQS5TMTYgZDAsZDAsIzE2Cit7CisgICAgaW50MTZ4NF90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnJzaHJfbl9zMTYoIGIsIGMpOworICAgIHJldHVybiB2YWRkX3MxNihhLCBzaGlmdCk7Cit9CisKK2ludDMyeDJfdCB2cnNyYV9uX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYyk7IC8vIFZSU1JBLlMzMiBkMCxkMCwjMzIKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZyc3JhX25fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKSAvLyBWUlNSQS5TMzIgZDAsZDAsIzMyCit7CisgICAgLy9tYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCB0aGUgc2VyaWFsIGV4ZWN1dGlvbgorICAgIGludDMyeDJfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZyc2hyX25fczMyKGIsIGMpOworICAgIHJldHVybiB2YWRkX3MzMiggYSwgc2hpZnQpOworfQorCitpbnQ2NHgxX3QgdnJzcmFfbl9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpOyAvLyBWUlNSQS5TNjQgZDAsZDAsIzY0CitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDFfdCB2cnNyYV9uX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYyksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpIC8vc2VyaWFsIHNvbHV0aW9uCit7CisgICAgaW50NjR4MV90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnJzaHJfbl9zNjQoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRfczY0KCBhLCBzaGlmdCk7Cit9CisKK3VpbnQ4eDhfdCB2cnNyYV9uX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpOyAvLyBWUlNSQS5VOCBkMCxkMCwjOAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnJzcmFfbl91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIsIF9fY29uc3RyYW5nZSgxLDgpIGludCBjKSAvLyBWUlNSQS5VOCBkMCxkMCwjOAoreworICAgIHVpbnQ4eDhfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZyc2hyX25fdTgoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRfdTgoYSwgc2hpZnQpOworfQorCit1aW50MTZ4NF90IHZyc3JhX25fdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpOyAvLyBWUlNSQS5zMTYgZDAsZDAsIzE2CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdnJzcmFfbl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYykgLy8gVlJTUkEuczE2IGQwLGQwLCMxNgoreworICAgIHVpbnQxNng0X3Qgc2hpZnQ7CisgICAgc2hpZnQgPSB2cnNocl9uX3UxNihiLCBjKTsKKyAgICByZXR1cm4gdmFkZF91MTYoYSxzaGlmdCk7Cit9CisKK3VpbnQzMngyX3QgdnJzcmFfbl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYyk7IC8vIFZSU1JBLlUzMiBkMCxkMCwjMzIKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2cnNyYV9uX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDEsMzIpIGludCBjKSAvLyBWUlNSQS5VMzIgZDAsZDAsIzMyCit7CisgICAgLy9tYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCB0aGUgc2VyaWFsIGV4ZWN1dGlvbgorICAgIHVpbnQzMngyX3Qgc2hpZnQ7CisgICAgc2hpZnQgPSB2cnNocl9uX3UzMihiLCBjKTsKKyAgICByZXR1cm4gdmFkZF91MzIoIGEsIHNoaWZ0KTsKK30KKwordWludDY0eDFfdCB2cnNyYV9uX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKTsgLy8gVlJTUkEuVTY0IGQwLGQwLCM2NAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50NjR4MV90IHZyc3JhX25fdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKSAvL3NlcmlhbCBzb2x1dGlvbgoreworICAgIC8vbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggdGhlIHNlcmlhbCBleGVjdXRpb24KKyAgICB1aW50NjR4MV90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnJzaHJfbl91NjQoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRfdTY0KCBhLCBzaGlmdCk7Cit9CisKK2ludDh4MTZfdCB2cnNyYXFfbl9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIsIF9fY29uc3RyYW5nZSgxLDgpIGludCBjKTsgLy8gVlJTUkEuUzggcTAscTAsIzgKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90IHZyc3JhcV9uX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpIC8vIFZSU1JBLlM4IHEwLHEwLCM4Cit7CisgICAgaW50OHgxNl90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnJzaHJxX25fczgoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRxX3M4KGEsIHNoaWZ0KTsKK30KKworaW50MTZ4OF90IHZyc3JhcV9uX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYyk7IC8vIFZSU1JBLlMxNiBxMCxxMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZyc3JhcV9uX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYykgLy8gVlJTUkEuUzE2IHEwLHEwLCMxNgoreworICAgIGludDE2eDhfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZyc2hycV9uX3MxNihiLCBjKTsKKyAgICByZXR1cm4gdmFkZHFfczE2KGEsIHNoaWZ0KTsKK30KKworaW50MzJ4NF90IHZyc3JhcV9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYyk7IC8vIFZSU1JBLlMzMiBxMCxxMCwjMzIKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZyc3JhcV9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYykgLy8gVlJTUkEuUzMyIHEwLHEwLCMzMgoreworICAgIGludDMyeDRfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZyc2hycV9uX3MzMihiLCBjKTsKKyAgICByZXR1cm4gdmFkZHFfczMyKGEsIHNoaWZ0KTsKK30KKworaW50NjR4Ml90IHZyc3JhcV9uX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYyk7IC8vIFZSU1JBLlM2NCBxMCxxMCwjNjQKK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4Ml90IHZyc3JhcV9uX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYykKK3sKKyAgICBpbnQ2NHgyX3Qgc2hpZnQ7CisgICAgc2hpZnQgPSB2cnNocnFfbl9zNjQoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRxX3M2NChhLCBzaGlmdCk7Cit9CisKK3VpbnQ4eDE2X3QgdnJzcmFxX25fdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIsIF9fY29uc3RyYW5nZSgxLDgpIGludCBjKTsgLy8gVlJTUkEuVTggcTAscTAsIzgKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZfdCB2cnNyYXFfbl91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpIC8vIFZSU1JBLlU4IHEwLHEwLCM4Cit7CisgICAgdWludDh4MTZfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZyc2hycV9uX3U4KGIsIGMpOworICAgIHJldHVybiB2YWRkcV91OChhLCBzaGlmdCk7Cit9CisKK3VpbnQxNng4X3QgdnJzcmFxX25fdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpOyAvLyBWUlNSQS5zMTYgcTAscTAsIzE2CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3QgdnJzcmFxX25fdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpIC8vIFZSU1JBLnMxNiBxMCxxMCwjMTYKK3sKKyAgICB1aW50MTZ4OF90IHNoaWZ0OworICAgIHNoaWZ0ID0gdnJzaHJxX25fdTE2KGIsIGMpOworICAgIHJldHVybiB2YWRkcV91MTYoYSwgIHNoaWZ0KTsKK30KKwordWludDMyeDRfdCB2cnNyYXFfbl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYyk7IC8vIFZSU1JBLlUzMiBxMCxxMCwjMzIKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2cnNyYXFfbl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYykgLy8gVlJTUkEuVTMyIHEwLHEwLCMzMgoreworICAgIHVpbnQzMng0X3Qgc2hpZnQ7CisgICAgc2hpZnQgPSB2cnNocnFfbl91MzIoYiwgYyk7CisgICAgcmV0dXJuIHZhZGRxX3UzMihhLCBzaGlmdCk7Cit9CisKK3VpbnQ2NHgyX3QgdnJzcmFxX25fdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpOyAvLyBWUlNSQS5VNjQgcTAscTAsIzY0CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgyX3QgdnJzcmFxX25fdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpCit7CisgICAgdWludDY0eDJfdCBzaGlmdDsKKyAgICBzaGlmdCA9IHZyc2hycV9uX3U2NChiLCBjKTsKKyAgICByZXR1cm4gdmFkZHFfdTY0KGEsIHNoaWZ0KTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqVmVjdG9yIHNhdHVyYXRpbmcgc2hpZnQgbGVmdCBieSBjb25zdGFudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy93ZSBkb24ndCBjaGVjayBjb25zdCByYW5nZXMgIGFzc3VtaW5nIHRoZXkgYXJlIG1ldAoraW50OHg4X3QgdnFzaGxfbl9zOChpbnQ4eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYik7IC8vIFZRU0hMLlM4IGQwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZxc2hsX25fczgoaW50OHg4X3QgYSwgX19jb25zdHJhbmdlKDAsNykgaW50IGIpIC8vIFZRU0hMLlM4IGQwLGQwLCMwCit7CisgICAgLy9ubyA4IGJpdCBzaGlmdCBhdmFpbGFibGUgaW4gSUEzMiBTSU1ELCBnbyB0byAxNiBiaXQuIEl0IGFsc28gcHJvdmlkZXMgdGhlIGF1dG8gc2F0dXJhdGlvbiAoaW4gcGFja3MgZnVuY3Rpb24pCisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBhMTI4LCByMTI4OworICAgIGExMjggPSBfTU1fQ1ZURVBJOF9FUEkxNiAoX3BNMTI4aShhKSk7IC8vU1NFIDQuMQorICAgIHIxMjggPSBfbW1fc2xsaV9lcGkxNiAoYTEyOCwgYik7CisgICAgcjEyOCA9IF9tbV9wYWNrc19lcGkxNiAocjEyOCxyMTI4KTsgLy9zYXR1cmF0ZWQgczgsIHVzZSA2NCBsb3cgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocjEyOCk7Cit9CisKK2ludDE2eDRfdCB2cXNobF9uX3MxNihpbnQxNng0X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKTsgLy8gVlFTSEwuUzE2IGQwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2cXNobF9uX3MxNihpbnQxNng0X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKSAvLyBWUVNITC5TMTYgZDAsZDAsIzAKK3sKKyAgICAvLyBnbyB0byAzMiBiaXQgdG8gZ2V0IHRoZSBhdXRvIHNhdHVyYXRpb24gKGluIHBhY2tzIGZ1bmN0aW9uKQorICAgIGludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIGExMjgsIHIxMjg7CisgICAgYTEyOCA9IF9NTV9DVlRFUEkxNl9FUEkzMiAoX3BNMTI4aShhKSk7IC8vU1NFIDQuMQorICAgIHIxMjggPSBfbW1fc2xsaV9lcGkzMiAoYTEyOCwgYik7IC8vc2hpZnRfcmVzCisgICAgcjEyOCA9IF9tbV9wYWNrc19lcGkzMiAocjEyOCxyMTI4KTsgLy9zYXR1cmF0ZWQgczE2LCB1c2UgNjQgbG93IGJpdHMgb25seQorICAgIHJldHVybjY0KHIxMjgpOworfQorCitpbnQzMngyX3QgdnFzaGxfbl9zMzIoaW50MzJ4Ml90IGEsICBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpOyAvLyBWUVNITC5TMzIgZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZxc2hsX25fczMyKGludDMyeDJfdCBhLCAgX19jb25zdHJhbmdlKDAsMzEpIGludCBiKQoreworICAgIC8vc2VyaWFsIGV4ZWN1dGlvbiBtYXkgYmUgZmFzdGVyCisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KHZxc2hscV9uX3MzMiAoX3BNMTI4aShhKSwgYikpOworfQorCisKK2ludDY0eDFfdCB2cXNobF9uX3M2NChpbnQ2NHgxX3QgYSwgX19jb25zdHJhbmdlKDAsNjMpIGludCBiKTsgLy8gVlFTSEwuUzY0IGQwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDFfdCB2cXNobF9uX3M2NChpbnQ2NHgxX3QgYSwgX19jb25zdHJhbmdlKDAsNjMpIGludCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICAvLyBubyBlZmZlY3RpdmUgU0lNRCBzb2x1dGlvbiBoZXJlCisgICAgaW50NjR4MV90IHJlczsKKyAgICBpbnQ2NF90IGJtYXNrOworICAgIGludDY0X3QgYV9pNjQgPSAqKCBpbnQ2NF90KikmYTsKKyAgICBibWFzayA9ICggaW50NjRfdCkxIDw8ICg2MyAtIGIpOyAvL3Bvc2l0aXZlCisgICAgaWYgKGFfaTY0ID49IGJtYXNrKSB7CisgICAgICAgIHJlcy5tNjRfaTY0WzBdID0gfihfU0lHTkJJVDY0KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXMubTY0X2k2NFswXSAgPSAoYV9pNjQgPD0gLWJtYXNrKSA/IF9TSUdOQklUNjQgOiBhX2k2NCA8PCBiOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisKK3VpbnQ4eDhfdCB2cXNobF9uX3U4KHVpbnQ4eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYik7IC8vIFZRU0hMLlU4IGQwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2cXNobF9uX3U4KHVpbnQ4eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYikgLy8gVlFTSEwuVTggZDAsZDAsIzAKK3sKKyAgICAvL25vIDggYml0IHNoaWZ0IGF2YWlsYWJsZSBpbiBJQTMyIFNJTUQsIGdvIHRvIDE2IGJpdAorICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIGExMjgsIHIxMjg7CisgICAgYTEyOCA9IF9NTV9DVlRFUFU4X0VQSTE2IChfcE0xMjhpKGEpKTsgLy9TU0UgNC4xCisgICAgcjEyOCA9IF9tbV9zbGxpX2VwaTE2IChhMTI4LCBiKTsgLy9zaGlmdF9yZXMKKyAgICByMTI4ID0gX21tX3BhY2t1c19lcGkxNiAocjEyOCxyMTI4KTsgLy9zYXR1cmF0ZWQgdTgsIHVzZSA2NCBsb3cgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocjEyOCk7Cit9CisKK3VpbnQxNng0X3QgdnFzaGxfbl91MTYodWludDE2eDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGIpOyAvLyBWUVNITC5zMTYgZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2cXNobF9uX3UxNih1aW50MTZ4NF90IGEsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYikgLy8gVlFTSEwuczE2IGQwLGQwLCMwCit7CisgICAgLy8gZ28gdG8gMzIgYml0IHRvIGdldCB0aGUgYXV0byBzYXR1cmF0aW9uIChpbiBwYWNrdXMgZnVuY3Rpb24pCisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIGExMjgsIHIxMjg7CisgICAgYTEyOCA9IF9NTV9DVlRFUFUxNl9FUEkzMiAoX3BNMTI4aShhKSk7IC8vU1NFIDQuMQorICAgIHIxMjggPSBfbW1fc2xsaV9lcGkzMiAoYTEyOCwgYik7IC8vc2hpZnRfcmVzCisgICAgcjEyOCA9IF9NTV9QQUNLVVMxX0VQSTMyIChyMTI4KTsgLy9zYXR1cmF0ZWQgczE2CisgICAgcmV0dXJuNjQocjEyOCk7Cit9CisKK3VpbnQzMngyX3QgdnFzaGxfbl91MzIodWludDMyeDJfdCBhLCAgX19jb25zdHJhbmdlKDAsMzEpIGludCBiKTsgLy8gVlFTSEwuVTMyIGQwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdnFzaGxfbl91MzIodWludDMyeDJfdCBhLCAgX19jb25zdHJhbmdlKDAsMzEpIGludCBiKQoreworICAgIHVpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnFzaGxxX25fdTMyKF9wTTEyOGkoYSksIGIpKTsKK30KKwordWludDY0eDFfdCB2cXNobF9uX3U2NCh1aW50NjR4MV90IGEsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYik7IC8vIFZRU0hMLlU2NCBkMCxkMCwjMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50NjR4MV90IHZxc2hsX25fdTY0KHVpbnQ2NHgxX3QgYSwgX19jb25zdHJhbmdlKDAsNjMpIGludCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICAvLyBubyBlZmZlY3RpdmUgU0lNRCBzb2x1dGlvbiBoZXJlCisgICAgdWludDY0eDFfdCByZXM7CisgICAgdWludDY0X3QgYm1hc2s7CisgICAgdWludDY0X3QgYV9pNjQgPSAqKHVpbnQ2NF90KikmYTsKKyAgICBibWFzayA9ICggdWludDY0X3QpMSA8PCAoNjQgLSBiKTsKKyAgICByZXMubTY0X3U2NFswXSA9IChhX2k2NCA+PSBibWFzaykmJihiPjApID8gMHhmZmZmZmZmZmZmZmZmZmZmIDogYV9pNjQgPDwgYjsgLy9pZiBiPTAgd2UgYXJlIGZpbmUgd2l0aCBhbnkgYQorICAgIHJldHVybiByZXM7Cit9CisKK2ludDh4MTZfdCB2cXNobHFfbl9zOChpbnQ4eDE2X3QgYSwgX19jb25zdHJhbmdlKDAsNykgaW50IGIpOyAvLyBWUVNITC5TOCBxMCxxMCwjMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2X3QgdnFzaGxxX25fczgoaW50OHgxNl90IGEsIF9fY29uc3RyYW5nZSgwLDcpIGludCBiKSAvLyBWUVNITC5TOCBxMCxxMCwjMAoreworICAgIC8vIGdvIHRvIDE2IGJpdCB0byBnZXQgdGhlIGF1dG8gc2F0dXJhdGlvbiAoaW4gcGFja3MgZnVuY3Rpb24pCisgICAgX19tMTI4aSBhMTI4LCByMTI4XzEsIHIxMjhfMjsKKyAgICBhMTI4ID0gX01NX0NWVEVQSThfRVBJMTYgKGEpOyAvL1NTRSA0LjEKKyAgICByMTI4XzEgPSBfbW1fc2xsaV9lcGkxNiAoYTEyOCwgYik7CisgICAgLy9zd2FwIGhpIGFuZCBsb3cgcGFydCBvZiBhMTI4IHRvIHByb2Nlc3MgdGhlIHJlbWFpbmluZyBkYXRhCisgICAgYTEyOCA9IF9tbV9zaHVmZmxlX2VwaTMyIChhLCBfU1dBUF9ISV9MT1czMik7CisgICAgYTEyOCA9IF9NTV9DVlRFUEk4X0VQSTE2IChhMTI4KTsKKyAgICByMTI4XzIgPSBfbW1fc2xsaV9lcGkxNiAoYTEyOCwgYik7CisgICAgcmV0dXJuIF9tbV9wYWNrc19lcGkxNiAocjEyOF8xLCByMTI4XzIpOyAvL3NhdHVyYXRlZCBzOAorfQorCitpbnQxNng4X3QgdnFzaGxxX25fczE2KGludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGIpOyAvLyBWUVNITC5TMTYgcTAscTAsIzAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZxc2hscV9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDAsMTUpIGludCBiKSAvLyBWUVNITC5TMTYgcTAscTAsIzAKK3sKKyAgICAvLyBtYW51YWwgc2F0dXJhdGlvbiBzb2x1dGlvbiBsb29rcyBMRVNTIG9wdGltYWwgdGhhbiAzMiBiaXRzIGNvbnZlcnNpb24gb25lCisgICAgLy8gZ28gdG8gMzIgYml0IHRvIGdldCB0aGUgYXV0byBzYXR1cmF0aW9uIChpbiBwYWNrcyBmdW5jdGlvbikKKyAgICBfX20xMjhpIGExMjgsIHIxMjhfMSwgcjEyOF8yOworICAgIGExMjggPSBfTU1fQ1ZURVBJMTZfRVBJMzIgKGEpOyAvL1NTRSA0LjEKKyAgICByMTI4XzEgPSBfbW1fc2xsaV9lcGkzMiAoYTEyOCwgYik7IC8vc2hpZnRfcmVzCisgICAgLy9zd2FwIGhpIGFuZCBsb3cgcGFydCBvZiBhMTI4IHRvIHByb2Nlc3MgdGhlIHJlbWFpbmluZyBkYXRhCisgICAgYTEyOCA9IF9tbV9zaHVmZmxlX2VwaTMyIChhLCBfU1dBUF9ISV9MT1czMik7CisgICAgYTEyOCA9IF9NTV9DVlRFUEkxNl9FUEkzMiAoYTEyOCk7CisgICAgcjEyOF8yID0gX21tX3NsbGlfZXBpMzIgKGExMjgsIGIpOworICAgIHJldHVybiBfbW1fcGFja3NfZXBpMzIgKHIxMjhfMSwgcjEyOF8yKTsgLy9zYXR1cmF0ZWQgczE2Cit9CisKK2ludDMyeDRfdCB2cXNobHFfbl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgwLDMxKSBpbnQgYik7IC8vIFZRU0hMLlMzMiBxMCxxMCwjMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnFzaGxxX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpIC8vIFZRU0hMLlMzMiBxMCxxMCwjMAoreworICAgIC8vIG5vIDY0IGJpdCBzYXR1cmF0aW9uIG9wdGlvbiBhdmFpbGFibGUsIHNwZWNpYWwgdHJpY2tzIG5lY2Vzc2FyeQorICAgIF9fbTEyOGkgYzEsIG1hc2tBLCBzYXR1cmF0aW9uX21hc2ssIGM3ZmZmZmZmX21hc2ssIHNoaWZ0X3Jlcywgc2hpZnRfcmVzX21hc2s7CisgICAgYzEgPSBfbW1fY21wZXFfZXBpMzIoYSxhKTsgLy8weGZmLi5mZgorICAgIG1hc2tBID0gX21tX3NybGlfZXBpMzIoYzEsIGIgKyAxKTsgLy9tYXNrIGZvciBwb3NpdGl2ZSBudW1iZXJzICgzMi1iKzEpIHplcm9zIGFuZCBiLTEgb25lcworICAgIHNhdHVyYXRpb25fbWFzayA9IF9tbV9jbXBndF9lcGkzMiAoYSwgbWFza0EpOyAvLzB4ZmYuLi5mZiBpZiB3ZSBuZWVkIHNhdHVyYXRpb24sIDAgIG90aGVyd2lzZQorICAgIGM3ZmZmZmZmX21hc2sgID0gX21tX3NybGlfZXBpMzIoc2F0dXJhdGlvbl9tYXNrLCAxKTsgLy9zYXR1cmF0ZWQgdG8gMHg3Zi4uZmYgd2hlbiBuZWVkZWQgYW5kIHplcm9zIGlmIG5vdAorICAgIHNoaWZ0X3JlcyA9IF9tbV9zbGxpX2VwaTMyIChhLCBiKTsKKyAgICBzaGlmdF9yZXNfbWFzayA9IF9tbV9hbmRub3Rfc2kxMjgoc2F0dXJhdGlvbl9tYXNrLCBzaGlmdF9yZXMpOworICAgIC8vcmVzdWx0IHdpdGggcG9zaXRpdmUgbnVtYmVycyBzYXR1cmF0ZWQKKyAgICBzaGlmdF9yZXMgPSBfbW1fb3Jfc2kxMjggKGM3ZmZmZmZmX21hc2ssIHNoaWZ0X3Jlc19tYXNrKTsKKyAgICAvL3RyZWF0IG5lZ2F0aXZlIG51bWJlcnMKKyAgICBtYXNrQSA9IF9tbV9zbGxpX2VwaTMyKGMxLCAzMSAtIGIpOyAvL21hc2sgZm9yIG5lZ2F0aXZlIG51bWJlcnMgYi0xIG9uZXMgIGFuZCAoMzItYisxKSAgemVyb3MKKyAgICBzYXR1cmF0aW9uX21hc2sgPSBfbW1fY21wZ3RfZXBpMzIgKG1hc2tBLGEpOyAvLzB4ZmYuLi5mZiBpZiB3ZSBuZWVkIHNhdHVyYXRpb24sIDAgIG90aGVyd2lzZQorICAgIGM3ZmZmZmZmX21hc2sgID0gX21tX3NsbGlfZXBpMzIoc2F0dXJhdGlvbl9tYXNrLCAzMSk7IC8vc2F0dXJhdGVkIHRvIDB4ODAuLjAwIHdoZW4gbmVlZGVkIGFuZCB6ZXJvcyBpZiBub3QKKyAgICBzaGlmdF9yZXNfbWFzayA9IF9tbV9hbmRub3Rfc2kxMjgoc2F0dXJhdGlvbl9tYXNrLCBzaGlmdF9yZXMpOworICAgIHJldHVybiBfbW1fb3Jfc2kxMjggKGM3ZmZmZmZmX21hc2ssIHNoaWZ0X3Jlc19tYXNrKTsKK30KKworaW50NjR4Ml90IHZxc2hscV9uX3M2NChpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDAsNjMpIGludCBiKTsgLy8gVlFTSEwuUzY0IHEwLHEwLCMwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDJfdCB2cXNobHFfbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYiksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgLy8gbm8gZWZmZWN0aXZlIFNJTUQgc29sdXRpb24gaGVyZQorICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ2NF90IGF0bXBbMl0sIHJlc1syXTsKKyAgICBpbnQ2NF90IGJtYXNrOworICAgIGludCBpOworICAgIGJtYXNrID0gKCBpbnQ2NF90KTEgPDwgKDYzIC0gYik7IC8vcG9zaXRpdmUKKyAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWF0bXAsIGEpOworICAgIGZvciAoaSA9IDA7IGk8MjsgaSsrKSB7CisgICAgICAgIGlmIChhdG1wW2ldID49IGJtYXNrKSB7CisgICAgICAgICAgICByZXNbaV0gPSB+KF9TSUdOQklUNjQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzW2ldID0gKGF0bXBbaV0gPD0gLWJtYXNrKSA/IF9TSUdOQklUNjQgOiBhdG1wW2ldIDw8IGI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKilyZXMpOworfQorCit1aW50OHgxNl90IHZxc2hscV9uX3U4KHVpbnQ4eDE2X3QgYSwgX19jb25zdHJhbmdlKDAsNykgaW50IGIpOyAvLyBWUVNITC5VOCBxMCxxMCwjMAorX05FT04yU1NFX0lOTElORSB1aW50OHgxNl90IHZxc2hscV9uX3U4KHVpbnQ4eDE2X3QgYSwgX19jb25zdHJhbmdlKDAsNykgaW50IGIpIC8vIFZRU0hMLlU4IHEwLHEwLCMwCit7CisgICAgLy8gZ28gdG8gMTYgYml0IHRvIGdldCB0aGUgYXV0byBzYXR1cmF0aW9uIChpbiBwYWNrcyBmdW5jdGlvbikKKyAgICBfX20xMjhpIGExMjgsIHIxMjhfMSwgcjEyOF8yOworICAgIGExMjggPSBfTU1fQ1ZURVBVOF9FUEkxNiAoYSk7IC8vU1NFIDQuMQorICAgIHIxMjhfMSA9IF9tbV9zbGxpX2VwaTE2IChhMTI4LCBiKTsKKyAgICAvL3N3YXAgaGkgYW5kIGxvdyBwYXJ0IG9mIGExMjggdG8gcHJvY2VzcyB0aGUgcmVtYWluaW5nIGRhdGEKKyAgICBhMTI4ID0gX21tX3NodWZmbGVfZXBpMzIgKGEsIF9TV0FQX0hJX0xPVzMyKTsKKyAgICBhMTI4ID0gX01NX0NWVEVQVThfRVBJMTYgKGExMjgpOworICAgIHIxMjhfMiA9IF9tbV9zbGxpX2VwaTE2IChhMTI4LCBiKTsKKyAgICByZXR1cm4gX21tX3BhY2t1c19lcGkxNiAocjEyOF8xLCByMTI4XzIpOyAvL3NhdHVyYXRlZCB1OAorfQorCit1aW50MTZ4OF90IHZxc2hscV9uX3UxNih1aW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYik7IC8vIFZRU0hMLnMxNiBxMCxxMCwjMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZxc2hscV9uX3UxNih1aW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYikgLy8gVlFTSEwuczE2IHEwLHEwLCMwCit7CisgICAgLy8gbWFudWFsIHNhdHVyYXRpb24gc29sdXRpb24gbG9va3MgbW9yZSBvcHRpbWFsIHRoYW4gMzIgYml0cyBjb252ZXJzaW9uIG9uZQorICAgIF9fbTEyOGkgY2IsIGM4MDAwLCBhX3NpZ25lZCwgc2F0dXJhdGlvbl9tYXNrLCAgc2hpZnRfcmVzOworICAgIGNiID0gX21tX3NldDFfZXBpMTYoKDEgPDwgKDE2IC0gYikpIC0gMSAtIDB4ODAwMCApOworICAgIGM4MDAwID0gX21tX3NldDFfZXBpMTYgKDB4ODAwMCk7CisvL25vIHVuc2lnbmVkIHNob3J0cyBjb21wYXJpc29uIGluIFNTRSwgb25seSBzaWduZWQgYXZhaWxhYmxlLCBzbyBuZWVkIHRoZSB0cmljaworICAgIGFfc2lnbmVkID0gX21tX3N1Yl9lcGkxNihhLCBjODAwMCk7IC8vZ28gdG8gc2lnbmVkCisgICAgc2F0dXJhdGlvbl9tYXNrID0gX21tX2NtcGd0X2VwaTE2IChhX3NpZ25lZCwgY2IpOworICAgIHNoaWZ0X3JlcyA9IF9tbV9zbGxpX2VwaTE2IChhLCBiKTsKKyAgICByZXR1cm4gX21tX29yX3NpMTI4IChzaGlmdF9yZXMsIHNhdHVyYXRpb25fbWFzayk7Cit9CisKK3VpbnQzMng0X3QgdnFzaGxxX25fdTMyKHVpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDAsMzEpIGludCBiKTsgLy8gVlFTSEwuVTMyIHEwLHEwLCMwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdnFzaGxxX25fdTMyKHVpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDAsMzEpIGludCBiKSAvLyBWUVNITC5VMzIgcTAscTAsIzAKK3sKKyAgICAvLyBtYW51YWwgc2F0dXJhdGlvbiBzb2x1dGlvbiwgbm8gNjQgYml0IHNhdHVyYXRpb24gb3B0aW9uLCB0aGUgc2VyaWFsIHZlcnNpb24gbWF5IGJlIGZhc3RlcgorICAgIF9fbTEyOGkgY2IsIGM4MDAwMDAwMCwgYV9zaWduZWQsIHNhdHVyYXRpb25fbWFzaywgIHNoaWZ0X3JlczsKKyAgICBjYiA9IF9tbV9zZXQxX2VwaTMyKCgxIDw8ICgzMiAtIGIpKSAtIDEgLSAweDgwMDAwMDAwICk7CisgICAgYzgwMDAwMDAwID0gX21tX3NldDFfZXBpMzIgKDB4ODAwMDAwMDApOworLy9ubyB1bnNpZ25lZCBpbnRzIGNvbXBhcmlzb24gaW4gU1NFLCBvbmx5IHNpZ25lZCBhdmFpbGFibGUsIHNvIG5lZWQgdGhlIHRyaWNrCisgICAgYV9zaWduZWQgPSBfbW1fc3ViX2VwaTMyKGEsIGM4MDAwMDAwMCk7IC8vZ28gdG8gc2lnbmVkCisgICAgc2F0dXJhdGlvbl9tYXNrID0gX21tX2NtcGd0X2VwaTMyIChhX3NpZ25lZCwgY2IpOworICAgIHNoaWZ0X3JlcyA9IF9tbV9zbGxpX2VwaTMyIChhLCBiKTsKKyAgICByZXR1cm4gX21tX29yX3NpMTI4IChzaGlmdF9yZXMsIHNhdHVyYXRpb25fbWFzayk7Cit9CisKK3VpbnQ2NHgyX3QgdnFzaGxxX25fdTY0KHVpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDAsNjMpIGludCBiKTsgLy8gVlFTSEwuVTY0IHEwLHEwLCMwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQ2NHgyX3QgdnFzaGxxX25fdTY0KHVpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDAsNjMpIGludCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICAvLyBubyBlZmZlY3RpdmUgU0lNRCBzb2x1dGlvbiBoZXJlCisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ2NF90IGF0bXBbMl0sIHJlc1syXTsKKyAgICB1aW50NjRfdCBibWFzazsKKyAgICBpbnQgaTsKKyAgICBibWFzayA9ICggdWludDY0X3QpMSA8PCAoNjQgLSBiKTsKKyAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWF0bXAsIGEpOworICAgIGZvciAoaSA9IDA7IGk8MjsgaSsrKSB7CisgICAgICAgIHJlc1tpXSA9IChhdG1wW2ldID49IGJtYXNrKSYmKGI+MCkgPyAweGZmZmZmZmZmZmZmZmZmZmYgOiBhdG1wW2ldIDw8IGI7IC8vaWYgYj0wIHdlIGFyZSBmaW5lIHdpdGggYW55IGEKKyAgICB9CisgICAgcmV0dXJuIF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKilyZXMpOworfQorCisvLyoqKioqKioqKioqKioqVmVjdG9yIHNpZ25lZC0+dW5zaWduZWQgc2F0dXJhdGluZyBzaGlmdCBsZWZ0IGJ5IGNvbnN0YW50ICoqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgordWludDh4OF90IHZxc2hsdV9uX3M4KGludDh4OF90IGEsIF9fY29uc3RyYW5nZSgwLDcpIGludCBiKTsgLy8gVlFTSExVLlM4IGQwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2cXNobHVfbl9zOChpbnQ4eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYikgLy8gVlFTSExVLlM4IGQwLGQwLCMwCit7CisgICAgLy9ubyA4IGJpdCBzaGlmdCBhdmFpbGFibGUgaW4gSUEzMiBTSU1ELCBnbyB0byAxNiBiaXQuIEl0IGFsc28gcHJvdmlkZXMgdGhlIGF1dG8gc2F0dXJhdGlvbiAoaW4gcGFja3MgZnVuY3Rpb24pCisgICAgdWludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgYTEyOCwgcjEyODsKKyAgICBhMTI4ID0gX01NX0NWVEVQSThfRVBJMTYgKF9wTTEyOGkoYSkpOyAvL1NTRSA0LjEKKyAgICByMTI4ID0gX21tX3NsbGlfZXBpMTYgKGExMjgsIGIpOworICAgIHIxMjggPSBfbW1fcGFja3VzX2VwaTE2IChyMTI4LHIxMjgpOyAvL3NhdHVyYXRlZCB1OCwgdXNlIDY0IGxvdyBiaXRzIG9ubHkKKyAgICByZXR1cm42NChyMTI4KTsKK30KKwordWludDE2eDRfdCB2cXNobHVfbl9zMTYoaW50MTZ4NF90IGEsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYik7IC8vIFZRU0hMVS5TMTYgZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2cXNobHVfbl9zMTYoaW50MTZ4NF90IGEsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYikgLy8gVlFTSExVLlMxNiBkMCxkMCwjMAoreworICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSBhMTI4LCByMTI4OworICAgIGExMjggPSBfTU1fQ1ZURVBJMTZfRVBJMzIgKF9wTTEyOGkoYSkpOyAvL1NTRSA0LjEKKyAgICByMTI4ID0gX21tX3NsbGlfZXBpMzIgKGExMjgsIGIpOyAvL3NoaWZ0X3JlcworICAgIHIxMjggPSBfTU1fUEFDS1VTMV9FUEkzMiAocjEyOCk7IC8vc2F0dXJhdGVkIHMxNiwgdXNlIDY0IGxvdyBiaXRzIG9ubHkKKyAgICByZXR1cm42NChyMTI4KTsKK30KKwordWludDMyeDJfdCB2cXNobHVfbl9zMzIoaW50MzJ4Ml90IGEsICBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpOyAvLyBWUVNITFUuUzMyIGQwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2cXNobHVfbl9zMzIoaW50MzJ4Ml90IGEsICBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KCB2cXNobHVxX25fczMyKF9wTTEyOGkoYSksIGIpKTsKK30KKwordWludDY0eDFfdCB2cXNobHVfbl9zNjQoaW50NjR4MV90IGEsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYik7IC8vIFZRU0hMVS5TNjQgZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDY0eDFfdCB2cXNobHVfbl9zNjQoaW50NjR4MV90IGEsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYiksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpIC8vIG5vIGVmZmVjdGl2ZSBTSU1EIHNvbHV0aW9uIGhlcmUsIHNlcmlhbCBleGVjdXRpb24gbG9va3MgZmFzdGVyCit7CisgICAgdWludDY0eDFfdCByZXM7CisgICAgdWludDY0X3QgbGltaXQ7CisgICAgaWYgKGEubTY0X2k2NFswXTw9MCkgeworICAgICAgICByZXMubTY0X3U2NFswXSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbGltaXQgPSAodWludDY0X3QpIDEgPDwgKDY0IC0gYik7CisgICAgICAgIHJlcy5tNjRfdTY0WzBdID0gKCAoKHVpbnQ2NF90KWEubTY0X2k2NFswXSkgPj0gbGltaXQpID8gcmVzLm02NF91NjRbMF0gPSB+KCh1aW50NjRfdCkwKSA6IGEubTY0X2k2NFswXSA8PCBiOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit1aW50OHgxNl90IHZxc2hsdXFfbl9zOChpbnQ4eDE2X3QgYSwgX19jb25zdHJhbmdlKDAsNykgaW50IGIpOyAvLyBWUVNITFUuUzggcTAscTAsIzAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZfdCB2cXNobHVxX25fczgoaW50OHgxNl90IGEsIF9fY29uc3RyYW5nZSgwLDcpIGludCBiKSAvLyBWUVNITFUuUzggcTAscTAsIzAKK3sKKyAgICBfX20xMjhpIGExMjgsIHIxMjhfMSwgcjEyOF8yOworICAgIGExMjggPSBfTU1fQ1ZURVBJOF9FUEkxNiAoYSk7IC8vU1NFIDQuMQorICAgIHIxMjhfMSA9IF9tbV9zbGxpX2VwaTE2IChhMTI4LCBiKTsKKyAgICAvL3N3YXAgaGkgYW5kIGxvdyBwYXJ0IG9mIGExMjggdG8gcHJvY2VzcyB0aGUgcmVtYWluaW5nIGRhdGEKKyAgICBhMTI4ID0gX21tX3NodWZmbGVfZXBpMzIgKGEsIF9TV0FQX0hJX0xPVzMyKTsKKyAgICBhMTI4ID0gX01NX0NWVEVQSThfRVBJMTYgKGExMjgpOworICAgIHIxMjhfMiA9IF9tbV9zbGxpX2VwaTE2IChhMTI4LCBiKTsKKyAgICByZXR1cm4gX21tX3BhY2t1c19lcGkxNiAocjEyOF8xLCByMTI4XzIpOyAvL3NhdHVyYXRlZCB1OAorfQorCit1aW50MTZ4OF90IHZxc2hsdXFfbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYik7IC8vIFZRU0hMVS5TMTYgcTAscTAsIzAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDhfdCB2cXNobHVxX25fczE2KGludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGIpIC8vIFZRU0hMVS5TMTYgcTAscTAsIzAKK3sKKyAgICAvLyBtYW51YWwgc2F0dXJhdGlvbiBzb2x1dGlvbiBsb29rcyBMRVNTIG9wdGltYWwgdGhhbiAzMiBiaXRzIGNvbnZlcnNpb24gb25lCisgICAgX19tMTI4aSBhMTI4LCByMTI4XzEsIHIxMjhfMjsKKyAgICBhMTI4ID0gX01NX0NWVEVQSTE2X0VQSTMyIChhKTsgLy9TU0UgNC4xCisgICAgcjEyOF8xID0gX21tX3NsbGlfZXBpMzIgKGExMjgsIGIpOyAvL3NoaWZ0X3JlcworICAgIC8vc3dhcCBoaSBhbmQgbG93IHBhcnQgb2YgYTEyOCB0byBwcm9jZXNzIHRoZSByZW1haW5pbmcgZGF0YQorICAgIGExMjggPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYSwgX1NXQVBfSElfTE9XMzIpOworICAgIGExMjggPSBfTU1fQ1ZURVBJMTZfRVBJMzIgKGExMjgpOworICAgIHIxMjhfMiA9IF9tbV9zbGxpX2VwaTMyIChhMTI4LCBiKTsKKyAgICByZXR1cm4gX01NX1BBQ0tVU19FUEkzMiAocjEyOF8xLCByMTI4XzIpOyAvL3NhdHVyYXRlZCBzMTYKK30KKwordWludDMyeDRfdCB2cXNobHVxX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGIpOyAvLyBWUVNITFUuUzMyIHEwLHEwLCMwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdnFzaGx1cV9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDAsMzEpIGludCBiKSAvLyBWUVNITFUuUzMyIHEwLHEwLCMwCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggdGhlIHNlcmlhbCBvbmUKKyAgICBfX20xMjhpIHplcm8sIG1hc2tBLCBtYXNrR1QwLCBhMCwgIGFfbWFza2VkLCBhX3NoaWZ0OworICAgIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgIG1hc2tBID0gX21tX2NtcGVxX2VwaTMyKGEsIGEpOworICAgIG1hc2tBID0gX21tX3NsbGlfZXBpMzIobWFza0EsKDMyIC0gYikpOyAvLyBiIG9uZXMgYW5kICgzMi1iKXplcm9zCisgICAgLy9zYXR1cmF0ZSBuZWdhdGl2ZSBudW1iZXJzIHRvIHplcm8KKyAgICBtYXNrR1QwICAgPSBfbW1fY21wZ3RfZXBpMzIgKGEsIHplcm8pOyAvLyAvLzB4ZmZmZmZmZmYgaWYgcG9zaXRpdmUgbnVtYmVyIGFuZCB6ZXJvIG90aGVyd2lzZSAobmVnYXRpdmUgbnVtYmVycykKKyAgICBhMCA9IF9tbV9hbmRfc2kxMjggKGEsICBtYXNrR1QwKTsgLy9uZWdhdGl2ZSBhcmUgemVyb3Mgbm93CisgICAgLy9zYXR1cmF0ZSBwb3NpdGl2ZSB0byAweGZmZmZmZmZmCisgICAgYV9tYXNrZWQgPSBfbW1fYW5kX3NpMTI4IChhMCwgbWFza0EpOworICAgIGFfbWFza2VkID0gX21tX2NtcGd0X2VwaTMyIChhX21hc2tlZCwgemVybyk7IC8vMHhmZmZmZmZmZiBpZiBzYXR1cmF0aW9uIG5lY2Vzc2FyeSAwIG90aGVyd2lzZQorICAgIGFfc2hpZnQgPSBfbW1fc2xsaV9lcGkzMiAoYTAsIGIpOworICAgIHJldHVybiBfbW1fb3Jfc2kxMjggKGFfc2hpZnQsIGFfbWFza2VkKTsgLy9hY3R1YWwgc2F0dXJhdGlvbgorfQorCit1aW50NjR4Ml90IHZxc2hsdXFfbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYik7IC8vIFZRU0hMVS5TNjQgcTAscTAsIzAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDY0eDJfdCB2cXNobHVxX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGIpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICAvLyBubyBlZmZlY3RpdmUgU0lNRCBzb2x1dGlvbiBoZXJlLCBzZXJpYWwgZXhlY3V0aW9uIGxvb2tzIGZhc3RlcgorICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ2NF90IGF0bXBbMl07CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ2NF90IHJlc1syXTsKKyAgICB1aW50NjRfdCBsaW1pdDsKKyAgICBpbnQgaTsKKyAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWF0bXAsIGEpOworICAgIGZvciAoaSA9IDA7IGk8MjsgaSsrKSB7CisgICAgICAgIGlmIChhdG1wW2ldPD0wKSB7CisgICAgICAgICAgICByZXNbaV0gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGltaXQgPSAodWludDY0X3QpIDEgPDwgKDY0IC0gYik7CisgICAgICAgICAgICByZXNbaV0gPSAoICgodWludDY0X3QpYXRtcFtpXSkgPj0gbGltaXQpID8gcmVzW2ldID0gfigodWludDY0X3QpMCkgOiBhdG1wW2ldIDw8IGI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKilyZXMpOworfQorCisvLyoqKioqKioqKioqKioqIFZlY3RvciBuYXJyb3dpbmcgIHNoaWZ0IHJpZ2h0IGJ5IGNvbnN0YW50ICoqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZzaHJuX25fczE2KGludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZTSFJOLkkxNiBkMCxxMCwjOAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2c2hybl9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpIC8vIFZTSFJOLkkxNiBkMCxxMCwjOAoreworICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgcjE2OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazhfMTZfZXZlbl9vZGRbMTZdID0geyAwLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxLCAzLCA1LCA3LCA5LCAxMSwgMTMsIDE1IH07CisgICAgcjE2ICA9IHZzaHJxX25fczE2KGEsYik7CisgICAgcjE2ICA9IF9tbV9zaHVmZmxlX2VwaTggKHIxNiwgKihfX20xMjhpKikgbWFzazhfMTZfZXZlbl9vZGQpOyAvL25hcnJvdywgdXNlIGxvdyA2NCBiaXRzIG9ubHkuIEltcG9zc2libGUgdG8gdXNlIF9tbV9wYWNrcyBiZWNhdXNlIG9mIG5lZ2F0aXZlIHNhdHVyYXRpb24gcHJvYmxlbXMKKyAgICByZXR1cm42NChyMTYpOworfQorCitpbnQxNng0X3QgdnNocm5fbl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZTSFJOLkkzMiBkMCxxMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZzaHJuX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpIC8vIFZTSFJOLkkzMiBkMCxxMCwjMTYKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSByMzI7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrMTZfb2RkWzE2XSA9IHsgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMSwgMywgNSwgNywgOSwgMTEsIDEzLCAxNSB9OworICAgIHIzMiAgPSB2c2hycV9uX3MzMihhLGIpOworICAgIHIzMiAgPSAgX21tX3NodWZmbGVfZXBpOCAocjMyLCAqKF9fbTEyOGkqKSBtYXNrMTZfb2RkKTsgLy9uYXJyb3csIHVzZSBsb3cgNjQgYml0cyBvbmx5LiBJbXBvc3NpYmxlIHRvIHVzZSBfbW1fcGFja3MgYmVjYXVzZSBvZiBuZWdhdGl2ZSBzYXR1cmF0aW9uIHByb2JsZW1zCisgICAgcmV0dXJuNjQocjMyKTsKK30KKworaW50MzJ4Ml90IHZzaHJuX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWU0hSTi5JNjQgZDAscTAsIzMyCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2c2hybl9uX3M2NChpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHI2NDsKKyAgICByNjQgID0gdnNocnFfbl9zNjQoYSxiKTsKKyAgICByNjQgID0gX21tX3NodWZmbGVfZXBpMzIocjY0LCAwIHwgKDIgPDwgMikgfCAoMSA8PCA0KSB8ICgzIDw8IDYpKTsgLy9zaHVmZmxlIHRoZSBkYXRhIHRvIGdldCAyIDMyLWJpdHMKKyAgICByZXR1cm42NChyNjQpOworfQorCit1aW50OHg4X3QgdnNocm5fbl91MTYodWludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZTSFJOLkkxNiBkMCxxMCwjOAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnNocm5fbl91MTYodWludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYikgLy8gVlNIUk4uSTE2IGQwLHEwLCM4Cit7CisgICAgdWludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgbWFzaywgcjE2OworICAgIG1hc2sgPSBfbW1fc2V0MV9lcGkxNigweGZmKTsKKyAgICByMTYgID0gdnNocnFfbl9zMTYoYSxiKTsgLy9hZnRlciByaWdodCBzaGlmdCBiPj0xIHVuc2lnbmVkIHZhciBmaXRzIGludG8gc2lnbmVkIHJhbmdlLCBzbyB3ZSBjb3VsZCB1c2UgX21tX3BhY2t1c19lcGkxNiAoc2lnbmVkIDE2IHRvIHVuc2lnbmVkIDgpCisgICAgcjE2ID0gX21tX2FuZF9zaTEyOChyMTYsIG1hc2spOyAvL3RvIGF2b2lkIHNhdHVyYXRpb24KKyAgICByMTYgPSBfbW1fcGFja3VzX2VwaTE2IChyMTYscjE2KTsgLy9uYXJyb3csIHVzZSBsb3cgNjQgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocjE2KTsKK30KKwordWludDE2eDRfdCB2c2hybl9uX3UzMih1aW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZTSFJOLkkzMiBkMCxxMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2c2hybl9uX3UzMih1aW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYikgLy8gVlNIUk4uSTMyIGQwLHEwLCMxNgoreworICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSBtYXNrLCByMzI7CisgICAgbWFzayA9IF9tbV9zZXQxX2VwaTMyKDB4ZmZmZik7CisgICAgcjMyICA9IHZzaHJxX25fdTMyKGEsYik7IC8vYWZ0ZXIgcmlnaHQgc2hpZnQgYj49MSB1bnNpZ25lZCB2YXIgZml0cyBpbnRvIHNpZ25lZCByYW5nZSwgc28gd2UgY291bGQgdXNlIF9NTV9QQUNLVVNfRVBJMzIgKHNpZ25lZCAzMiB0byB1bnNpZ25lZCAxNikKKyAgICByMzIgPSBfbW1fYW5kX3NpMTI4KHIzMiwgbWFzayk7IC8vdG8gYXZvaWQgc2F0dXJhdGlvbgorICAgIHIzMiA9ICBfTU1fUEFDS1VTMV9FUEkzMiAocjMyKTsgLy9zYXR1cmF0ZSBhbmQgIG5hcnJvdywgdXNlIGxvdyA2NCBiaXRzIG9ubHkKKyAgICByZXR1cm42NChyMzIpOworfQorCit1aW50MzJ4Ml90IHZzaHJuX25fdTY0KHVpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlNIUk4uSTY0IGQwLHEwLCMzMgorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZzaHJuX25fdTY0KHVpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKQoreworICAgIHVpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSByNjQ7CisgICAgcjY0ICA9IHZzaHJxX25fdTY0KGEsYik7CisgICAgcjY0ICA9IF9tbV9zaHVmZmxlX2VwaTMyKHI2NCwgMCB8ICgyIDw8IDIpIHwgKDEgPDwgNCkgfCAoMyA8PCA2KSk7IC8vc2h1ZmZsZSB0aGUgZGF0YSB0byBnZXQgMiAzMi1iaXRzCisgICAgcmV0dXJuNjQocjY0KTsKK30KKworLy8qKioqKioqKioqKioqKiBWZWN0b3Igc2lnbmVkLT51bnNpZ25lZCBuYXJyb3dpbmcgc2F0dXJhdGluZyBzaGlmdCByaWdodCBieSBjb25zdGFudCAqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3VpbnQ4eDhfdCB2cXNocnVuX25fczE2KGludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZRU0hSVU4uUzE2IGQwLHEwLCM4CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2cXNocnVuX25fczE2KGludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYikgLy8gVlFTSFJVTi5TMTYgZDAscTAsIzgKK3sKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByMTY7CisgICAgcjE2ICA9IHZzaHJxX25fczE2KGEsYik7CisgICAgcjE2ID0gX21tX3BhY2t1c19lcGkxNiAocjE2LHIxNik7IC8vc2F0dXJhdGUgYW5kICBuYXJyb3cgKHNpZ25lZCB0byB1bnNpZ25lZCksIHVzZSBsb3cgNjQgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocjE2KTsKK30KKwordWludDE2eDRfdCB2cXNocnVuX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWUVNIUlVOLlMzMiBkMCxxMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2cXNocnVuX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpIC8vIFZRU0hSVU4uUzMyIGQwLHEwLCMxNgoreworICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSByMzI7CisgICAgcjMyICA9IHZzaHJxX25fczMyKGEsYik7CisgICAgcjMyICA9IF9NTV9QQUNLVVMxX0VQSTMyIChyMzIpOyAvL3NhdHVyYXRlIGFuZCAgbmFycm93KHNpZ25lZCB0byB1bnNpZ25lZCksIHVzZSBsb3cgNjQgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocjMyKTsKK30KKwordWludDMyeDJfdCB2cXNocnVuX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWUVNIUlVOLlM2NCBkMCxxMCwjMzIKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDMyeDJfdCB2cXNocnVuX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKSAvL3NlcmlhbCBzb2x1dGlvbiBpcyBmYXN0ZXIKK3sKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50NjRfdCBhdG1wWzJdOworICAgIHVpbnQzMngyX3QgcmVzOworICAgIGludDY0X3QgcmVzNjQ7CisgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilhdG1wLCBhKTsKKyAgICBpZiAoYXRtcFswXSA8IDApIHsKKyAgICAgICAgcmVzLm02NF91MzJbMF0gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlczY0ID0gKGF0bXBbMF0gPj4gYik7CisgICAgICAgIHJlcy5tNjRfdTMyWzBdID0gKHJlczY0ID4gKGludDY0X3QpMHhmZmZmZmZmZikgPyAweGZmZmZmZmZmIDogKHVpbnQzMl90KSByZXM2NDsKKyAgICB9CisgICAgaWYgKGF0bXBbMV0gPCAwKSB7CisgICAgICAgIHJlcy5tNjRfdTMyWzFdID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXM2NCA9IChhdG1wWzFdID4+IGIpOworICAgICAgICByZXMubTY0X3UzMlsxXSA9IChyZXM2NCA+IChpbnQ2NF90KTB4ZmZmZmZmZmYpID8gMHhmZmZmZmZmZiA6ICh1aW50MzJfdClyZXM2NDsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLy8qKioqIFZlY3RvciBzaWduZWQtPnVuc2lnbmVkIHJvdW5kaW5nIG5hcnJvd2luZyBzYXR1cmF0aW5nIHNoaWZ0IHJpZ2h0IGJ5IGNvbnN0YW50ICoqKioqCit1aW50OHg4X3QgdnFyc2hydW5fbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlFSU0hSVU4uUzE2IGQwLHEwLCM4CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2cXJzaHJ1bl9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpIC8vIFZRUlNIUlVOLlMxNiBkMCxxMCwjOAoreworICAgIC8vc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggdGhlIHNlcmlhbCBvbmUKKyAgICBfX20xMjhpIHIxNjsKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgcjE2ID0gdnJzaHJxX25fczE2KGEsYik7CisgICAgcjE2ID0gIF9tbV9wYWNrdXNfZXBpMTYgKHIxNixyMTYpOyAvL3NhdHVyYXRlIGFuZCAgbmFycm93IChzaWduZWQgdG8gdW5zaWduZWQpLCB1c2UgbG93IDY0IGJpdHMgb25seQorICAgIHJldHVybjY0KHIxNik7Cit9CisKK3VpbnQxNng0X3QgdnFyc2hydW5fbl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZRUlNIUlVOLlMzMiBkMCxxMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2cXJzaHJ1bl9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKSAvLyBWUVJTSFJVTi5TMzIgZDAscTAsIzE2Cit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCB0aGUgc2VyaWFsIG9uZQorICAgIF9fbTEyOGkgcjMyOworICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgcjMyID0gdnJzaHJxX25fczMyKGEsYik7CisgICAgcjMyID0gIF9NTV9QQUNLVVMxX0VQSTMyIChyMzIpOyAvL3NhdHVyYXRlIGFuZCAgbmFycm93IChzaWduZWQgdG8gdW5zaWduZWQpLCB1c2UgbG93IDY0IGJpdHMgb25seQorICAgIHJldHVybjY0KHIzMik7Cit9CisKK3VpbnQzMngyX3QgdnFyc2hydW5fbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZRUlNIUlVOLlM2NCBkMCxxMCwjMzIKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDMyeDJfdCB2cXJzaHJ1bl9uX3M2NChpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkgLy9zZXJpYWwgc29sdXRpb24gaXMgZmFzdGVyCit7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDY0X3QgYXRtcFsyXTsKKyAgICB1aW50MzJ4Ml90IHJlczsKKyAgICBpbnQ2NF90IHJlczY0OworICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopYXRtcCwgYSk7CisgICAgaWYgKGF0bXBbMF0gPCAwKSB7CisgICAgICAgIHJlcy5tNjRfdTMyWzBdID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXM2NCA9IChhdG1wWzBdID4+IGIpICsgKCAoYXRtcFswXSAmICgoaW50NjRfdCkxIDw8IChiIC0gMSkpKSA+PiAoYiAtIDEpICApOworICAgICAgICByZXMubTY0X3UzMlswXSA9IChyZXM2NCA+IChpbnQ2NF90KTB4ZmZmZmZmZmYgKSA/IDB4ZmZmZmZmZmYgOiByZXM2NDsKKyAgICB9CisgICAgaWYgKGF0bXBbMV0gPCAwKSB7CisgICAgICAgIHJlcy5tNjRfdTMyWzFdID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXM2NCA9IChhdG1wWzFdID4+IGIpICsgKCAoYXRtcFswXSAmICgoaW50NjRfdCkxIDw8IChiIC0gMSkpKSA+PiAoYiAtIDEpICApOworICAgICAgICByZXMubTY0X3UzMlsxXSA9IChyZXM2NCA+IChpbnQ2NF90KTB4ZmZmZmZmZmYgKSA/IDB4ZmZmZmZmZmYgOiByZXM2NDsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLy8qKioqKiBWZWN0b3IgbmFycm93aW5nIHNhdHVyYXRpbmcgc2hpZnQgcmlnaHQgYnkgY29uc3RhbnQgKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQ4eDhfdCB2cXNocm5fbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlFTSFJOLlMxNiBkMCxxMCwjOAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2cXNocm5fbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKSAvLyBWUVNIUk4uUzE2IGQwLHEwLCM4Cit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByMTY7CisgICAgcjE2ICA9IHZzaHJxX25fczE2KGEsYik7CisgICAgcjE2ICA9IF9tbV9wYWNrc19lcGkxNiAocjE2LHIxNik7IC8vc2F0dXJhdGUgYW5kICBuYXJyb3csIHVzZSBsb3cgNjQgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocjE2KTsKK30KKworaW50MTZ4NF90IHZxc2hybl9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKTsgLy8gVlFTSFJOLlMzMiBkMCxxMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZxc2hybl9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKSAvLyBWUVNIUk4uUzMyIGQwLHEwLCMxNgoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIHIzMjsKKyAgICByMzIgID0gdnNocnFfbl9zMzIoYSxiKTsKKyAgICByMzIgID0gX21tX3BhY2tzX2VwaTMyIChyMzIscjMyKTsgLy9zYXR1cmF0ZSBhbmQgIG5hcnJvdywgdXNlIGxvdyA2NCBiaXRzIG9ubHkKKyAgICByZXR1cm42NChyMzIpOworfQorCitpbnQzMngyX3QgdnFzaHJuX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWUVNIUk4uUzY0IGQwLHEwLCMzMgorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQzMngyX3QgdnFzaHJuX25fczY0KGludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfVU5FRkZFQ1RJVkUpCit7CisgICAgLy9ubyBvcHRpbWFsIFNJTUQgc29sdXRpb24gZm91bmQKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50NjRfdCByZXM2NFsyXSwgYXRtcFsyXTsKKyAgICBpbnQzMngyX3QgcmVzOworICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopYXRtcCwgYSk7CisgICAgcmVzNjRbMF0gPSAoYXRtcFswXSA+PiBiKTsKKyAgICByZXM2NFsxXSA9IChhdG1wWzFdID4+IGIpOworICAgIGlmKHJlczY0WzBdPlNJTlRfTUFYKSByZXM2NFswXSA9IFNJTlRfTUFYOworICAgIGlmKHJlczY0WzBdPFNJTlRfTUlOKSByZXM2NFswXSA9IFNJTlRfTUlOOworICAgIGlmKHJlczY0WzFdPlNJTlRfTUFYKSByZXM2NFsxXSA9IFNJTlRfTUFYOworICAgIGlmKHJlczY0WzFdPFNJTlRfTUlOKSByZXM2NFsxXSA9IFNJTlRfTUlOOworICAgIHJlcy5tNjRfaTMyWzBdID0gKGludDMyX3QpcmVzNjRbMF07CisgICAgcmVzLm02NF9pMzJbMV0gPSAoaW50MzJfdClyZXM2NFsxXTsKKyAgICByZXR1cm4gcmVzOworfQorCit1aW50OHg4X3QgdnFzaHJuX25fdTE2KHVpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWUVNIUk4uczE2IGQwLHEwLCM4CitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2cXNocm5fbl91MTYodWludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYikgLy8gVlFTSFJOLnMxNiBkMCxxMCwjOAoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHIxNjsKKyAgICByMTYgID0gdnNocnFfbl91MTYoYSxiKTsgLy9hZnRlciByaWdodCBzaGlmdCBiPj0xIHVuc2lnbmVkIHZhciBmaXRzIGludG8gc2lnbmVkIHJhbmdlLCBzbyB3ZSBjb3VsZCB1c2UgX21tX3BhY2t1c19lcGkxNiAoc2lnbmVkIDE2IHRvIHVuc2lnbmVkIDgpCisgICAgcjE2ICA9IF9tbV9wYWNrdXNfZXBpMTYgKHIxNixyMTYpOyAvL3NhdHVyYXRlIGFuZCAgbmFycm93LCB1c2UgbG93IDY0IGJpdHMgb25seQorICAgIHJldHVybjY0KHIxNik7Cit9CisKK3VpbnQxNng0X3QgdnFzaHJuX25fdTMyKHVpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKTsgLy8gVlFTSFJOLlUzMiBkMCxxMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2cXNocm5fbl91MzIodWludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpIC8vIFZRU0hSTi5VMzIgZDAscTAsIzE2Cit7CisgICAgdWludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIHIzMjsKKyAgICByMzIgID0gdnNocnFfbl91MzIoYSxiKTsgLy9hZnRlciByaWdodCBzaGlmdCBiPj0xIHVuc2lnbmVkIHZhciBmaXRzIGludG8gc2lnbmVkIHJhbmdlLCBzbyB3ZSBjb3VsZCB1c2UgX01NX1BBQ0tVU19FUEkzMiAoc2lnbmVkIDMyIHRvIHVuc2lnbmVkIDgpCisgICAgcjMyICA9IF9NTV9QQUNLVVMxX0VQSTMyIChyMzIpOyAvL3NhdHVyYXRlIGFuZCAgbmFycm93LCB1c2UgbG93IDY0IGJpdHMgb25seQorICAgIHJldHVybjY0KHIzMik7Cit9CisKK3VpbnQzMngyX3QgdnFzaHJuX25fdTY0KHVpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVlFTSFJOLlU2NCBkMCxxMCwjMzIKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2cXNocm5fbl91NjQodWludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpCit7CisgICAgLy9zZXJpYWwgc29sdXRpb24gbWF5IGJlIGZhc3RlcgorICAgIHVpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSByNjQsIHJlc19oaSwgemVybzsKKyAgICB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICByNjQgID0gdnNocnFfbl91NjQoYSxiKTsKKyAgICByZXNfaGkgPSBfbW1fc3JsaV9lcGk2NChyNjQsICAzMik7CisgICAgcmVzX2hpID0gX21tX2NtcGd0X2VwaTMyKHJlc19oaSwgemVybyk7CisgICAgcjY0ID0gX21tX29yX3NpMTI4KHI2NCwgcmVzX2hpKTsKKyAgICByNjQgPSBfbW1fc2h1ZmZsZV9lcGkzMihyNjQsIDAgfCAoMiA8PCAyKSB8ICgxIDw8IDQpIHwgKDMgPDwgNikpOyAvL3NodWZmbGUgdGhlIGRhdGEgdG8gZ2V0IDIgMzItYml0cworICAgIHJldHVybjY0KHI2NCk7Cit9CisKKworLy8qKioqKioqKiogVmVjdG9yIHJvdW5kaW5nIG5hcnJvd2luZyBzaGlmdCByaWdodCBieSBjb25zdGFudCAqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZyc2hybl9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWUlNIUk4uSTE2IGQwLHEwLCM4CitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZyc2hybl9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpIC8vIFZSU0hSTi5JMTYgZDAscTAsIzgKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHIxNjsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s4XzE2X2V2ZW5fb2RkWzE2XSA9IHsgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMSwgMywgNSwgNywgOSwgMTEsIDEzLCAxNSB9OworICAgIHIxNiAgPSB2cnNocnFfbl9zMTYoYSxiKTsKKyAgICByMTYgID0gX21tX3NodWZmbGVfZXBpOCAocjE2LCAqKF9fbTEyOGkqKSBtYXNrOF8xNl9ldmVuX29kZCk7IC8vbmFycm93LCB1c2UgbG93IDY0IGJpdHMgb25seS4gSW1wb3NzaWJsZSB0byB1c2UgX21tX3BhY2tzIGJlY2F1c2Ugb2YgbmVnYXRpdmUgc2F0dXJhdGlvbiBwcm9ibGVtcworICAgIHJldHVybjY0KHIxNik7Cit9CisKK2ludDE2eDRfdCB2cnNocm5fbl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYik7IC8vIFZSU0hSTi5JMzIgZDAscTAsIzE2CitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2cnNocm5fbl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYikgLy8gVlJTSFJOLkkzMiBkMCxxMCwjMTYKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSByMzI7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrMTZfb2RkWzE2XSA9IHsgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMSwgMywgNSwgNywgOSwgMTEsIDEzLCAxNSB9OworICAgIHIzMiAgPSB2cnNocnFfbl9zMzIoYSxiKTsKKyAgICByMzIgID0gIF9tbV9zaHVmZmxlX2VwaTggKHIzMiwgKihfX20xMjhpKikgbWFzazE2X29kZCk7IC8vbmFycm93LCB1c2UgbG93IDY0IGJpdHMgb25seS4gSW1wb3NzaWJsZSB0byB1c2UgX21tX3BhY2tzIGJlY2F1c2Ugb2YgbmVnYXRpdmUgc2F0dXJhdGlvbiBwcm9ibGVtcworICAgIHJldHVybjY0KHIzMik7Cit9CisKK2ludDMyeDJfdCB2cnNocm5fbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZSU0hSTi5JNjQgZDAscTAsIzMyCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2cnNocm5fbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYikKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSByNjQ7CisgICAgcjY0ICA9IHZyc2hycV9uX3M2NChhLGIpOworICAgIHI2NCAgPSBfbW1fc2h1ZmZsZV9lcGkzMihyNjQsIDAgfCAoMiA8PCAyKSB8ICgxIDw8IDQpIHwgKDMgPDwgNikpOyAvL3NodWZmbGUgdGhlIGRhdGEgdG8gZ2V0IDIgMzItYml0cworICAgIHJldHVybjY0KHI2NCk7Cit9CisKK3VpbnQ4eDhfdCB2cnNocm5fbl91MTYodWludDE2eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYik7IC8vIFZSU0hSTi5JMTYgZDAscTAsIzgKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZyc2hybl9uX3UxNih1aW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKSAvLyBWUlNIUk4uSTE2IGQwLHEwLCM4Cit7CisgICAgdWludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgbWFzaywgcjE2OworICAgIG1hc2sgPSBfbW1fc2V0MV9lcGkxNigweGZmKTsKKyAgICByMTYgID0gdnJzaHJxX25fczE2KGEsYik7IC8vYWZ0ZXIgcmlnaHQgc2hpZnQgYj49MSB1bnNpZ25lZCB2YXIgZml0cyBpbnRvIHNpZ25lZCByYW5nZSwgc28gd2UgY291bGQgdXNlIF9tbV9wYWNrdXNfZXBpMTYgKHNpZ25lZCAxNiB0byB1bnNpZ25lZCA4KQorICAgIHIxNiA9IF9tbV9hbmRfc2kxMjgocjE2LCBtYXNrKTsgLy90byBhdm9pZCBzYXR1cmF0aW9uCisgICAgcjE2ID0gX21tX3BhY2t1c19lcGkxNiAocjE2LHIxNik7IC8vc2F0dXJhdGUgYW5kICBuYXJyb3csIHVzZSBsb3cgNjQgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocjE2KTsKK30KKwordWludDE2eDRfdCB2cnNocm5fbl91MzIodWludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWUlNIUk4uSTMyIGQwLHEwLCMxNgorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZyc2hybl9uX3UzMih1aW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYikgLy8gVlJTSFJOLkkzMiBkMCxxMCwjMTYKK3sKKyAgICB1aW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgbWFzaywgcjMyOworICAgIG1hc2sgPSBfbW1fc2V0MV9lcGkzMigweGZmZmYpOworICAgIHIzMiAgPSB2cnNocnFfbl91MzIoYSxiKTsgLy9hZnRlciByaWdodCBzaGlmdCBiPj0xIHVuc2lnbmVkIHZhciBmaXRzIGludG8gc2lnbmVkIHJhbmdlLCBzbyB3ZSBjb3VsZCB1c2UgX01NX1BBQ0tVU19FUEkzMiAoc2lnbmVkIDMyIHRvIHVuc2lnbmVkIDgpCisgICAgcjMyID0gX21tX2FuZF9zaTEyOChyMzIsIG1hc2spOyAvL3RvIGF2b2lkIHNhdHVyYXRpb24KKyAgICByMzIgPSBfTU1fUEFDS1VTMV9FUEkzMiAocjMyKTsgLy9zYXR1cmF0ZSBhbmQgIG5hcnJvdywgdXNlIGxvdyA2NCBiaXRzIG9ubHkKKyAgICByZXR1cm42NChyMzIpOworfQorCit1aW50MzJ4Ml90IHZyc2hybl9uX3U2NCh1aW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZSU0hSTi5JNjQgZDAscTAsIzMyCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdnJzaHJuX25fdTY0KHVpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKSAvL3NlcmlhbCBzb2x1dGlvbiBtYXkgYmUgZmFzdGVyCit7CisgICAgdWludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHI2NDsKKyAgICByNjQgID0gdnJzaHJxX25fdTY0KGEsYik7CisgICAgcjY0ICA9ICBfbW1fc2h1ZmZsZV9lcGkzMihyNjQsIDAgfCAoMiA8PCAyKSB8ICgxIDw8IDQpIHwgKDMgPDwgNikpOyAvL3NodWZmbGUgdGhlIGRhdGEgdG8gZ2V0IDIgMzItYml0cworICAgIHJldHVybjY0KHI2NCk7Cit9CisKKy8vKioqKioqKioqKioqKiBWZWN0b3Igcm91bmRpbmcgbmFycm93aW5nIHNhdHVyYXRpbmcgc2hpZnQgcmlnaHQgYnkgY29uc3RhbnQgKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZxcnNocm5fbl9zMTYoaW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKTsgLy8gVlFSU0hSTi5TMTYgZDAscTAsIzgKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdnFyc2hybl9uX3MxNihpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpIC8vIFZRUlNIUk4uUzE2IGQwLHEwLCM4Cit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByMTY7CisgICAgcjE2ICA9IHZyc2hycV9uX3MxNihhLGIpOworICAgIHIxNiAgPSAgX21tX3BhY2tzX2VwaTE2IChyMTYscjE2KTsgLy9zYXR1cmF0ZSBhbmQgIG5hcnJvdywgdXNlIGxvdyA2NCBiaXRzIG9ubHkKKyAgICByZXR1cm42NChyMTYpOworfQorCitpbnQxNng0X3QgdnFyc2hybl9uX3MzMihpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKTsgLy8gVlFSU0hSTi5TMzIgZDAscTAsIzE2CitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2cXJzaHJuX25fczMyKGludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpIC8vIFZRUlNIUk4uUzMyIGQwLHEwLCMxNgoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIHIzMjsKKyAgICByMzIgID0gdnJzaHJxX25fczMyKGEsYik7CisgICAgcjMyICA9IF9tbV9wYWNrc19lcGkzMiAocjMyLHIzMik7IC8vc2F0dXJhdGUgYW5kICBuYXJyb3csIHVzZSBsb3cgNjQgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocjMyKTsKK30KKworaW50MzJ4Ml90IHZxcnNocm5fbl9zNjQoaW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZRUlNIUk4uUzY0IGQwLHEwLCMzMgorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQzMngyX3QgdnFyc2hybl9uX3M2NChpbnQ2NHgyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1VORUZGRUNUSVZFKQoreworICAgIC8vbm8gb3B0aW1hbCBTSU1EIHNvbHV0aW9uIGZvdW5kCisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDY0X3QgcmVzNjRbMl0sIGF0bXBbMl0sIG1hc2tiWzJdOworICAgIGludDMyeDJfdCByZXM7CisgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilhdG1wLCBhKTsKKyAgICBtYXNrYlswXSA9IGF0bXBbMF0gJiAoKCBpbnQ2NF90KTEgPDwgKGIgLSAxKSk7CisgICAgcmVzNjRbMF0gPSAoYXRtcFswXSA+PiBiKSArIChtYXNrYlswXSA+PiAoYiAtIDEpKTsgLy9yb3VuZGVkIHJlc3VsdAorICAgIG1hc2tiWzFdID0gYXRtcFsxXSAmICgoIGludDY0X3QpMSA8PCAoYiAtIDEpKTsKKyAgICByZXM2NFsxXSA9IChhdG1wWzFdID4+IGIpICsgKG1hc2tiWzFdID4+IChiIC0gMSkpOyAvL3JvdW5kZWQgcmVzdWx0CisgICAgaWYocmVzNjRbMF0+U0lOVF9NQVgpIHJlczY0WzBdID0gU0lOVF9NQVg7CisgICAgaWYocmVzNjRbMF08U0lOVF9NSU4pIHJlczY0WzBdID0gU0lOVF9NSU47CisgICAgaWYocmVzNjRbMV0+U0lOVF9NQVgpIHJlczY0WzFdID0gU0lOVF9NQVg7CisgICAgaWYocmVzNjRbMV08U0lOVF9NSU4pIHJlczY0WzFdID0gU0lOVF9NSU47CisgICAgcmVzLm02NF9pMzJbMF0gPSAoaW50MzJfdClyZXM2NFswXTsKKyAgICByZXMubTY0X2kzMlsxXSA9IChpbnQzMl90KXJlczY0WzFdOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ4eDhfdCB2cXJzaHJuX25fdTE2KHVpbnQxNng4X3QgYSwgX19jb25zdHJhbmdlKDEsOCkgaW50IGIpOyAvLyBWUVJTSFJOLnMxNiBkMCxxMCwjOAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnFyc2hybl9uX3UxNih1aW50MTZ4OF90IGEsIF9fY29uc3RyYW5nZSgxLDgpIGludCBiKSAvLyBWUVJTSFJOLnMxNiBkMCxxMCwjOAoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHIxNjsKKyAgICByMTYgID0gdnJzaHJxX25fdTE2KGEsYik7IC8vYWZ0ZXIgcmlnaHQgc2hpZnQgYj49MSB1bnNpZ25lZCB2YXIgZml0cyBpbnRvIHNpZ25lZCByYW5nZSwgc28gd2UgY291bGQgdXNlIF9tbV9wYWNrdXNfZXBpMTYgKHNpZ25lZCAxNiB0byB1bnNpZ25lZCA4KQorICAgIHIxNiAgPSBfbW1fcGFja3VzX2VwaTE2IChyMTYscjE2KTsgLy9zYXR1cmF0ZSBhbmQgIG5hcnJvdywgdXNlIGxvdyA2NCBiaXRzIG9ubHkKKyAgICByZXR1cm42NChyMTYpOworfQorCit1aW50MTZ4NF90IHZxcnNocm5fbl91MzIodWludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGIpOyAvLyBWUVJTSFJOLlUzMiBkMCxxMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2cXJzaHJuX25fdTMyKHVpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMTYpIGludCBiKSAvLyBWUVJTSFJOLlUzMiBkMCxxMCwjMTYKK3sKKyAgICB1aW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgcjMyOworICAgIHIzMiAgPSB2cnNocnFfbl91MzIoYSxiKTsgLy9hZnRlciByaWdodCBzaGlmdCBiPj0xIHVuc2lnbmVkIHZhciBmaXRzIGludG8gc2lnbmVkIHJhbmdlLCBzbyB3ZSBjb3VsZCB1c2UgX01NX1BBQ0tVU19FUEkzMiAoc2lnbmVkIDMyIHRvIHVuc2lnbmVkIDgpCisgICAgcjMyICA9IF9NTV9QQUNLVVMxX0VQSTMyIChyMzIpOyAvL3NhdHVyYXRlIGFuZCAgbmFycm93LCB1c2UgbG93IDY0IGJpdHMgb25seQorICAgIHJldHVybjY0KHIzMik7Cit9CisKK3VpbnQzMngyX3QgdnFyc2hybl9uX3U2NCh1aW50NjR4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZRUlNIUk4uVTY0IGQwLHEwLCMzMgorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZxcnNocm5fbl91NjQodWludDY0eDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpCit7CisgICAgLy9zZXJpYWwgc29sdXRpb24gbWF5IGJlIGZhc3RlcgorICAgIHVpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSByNjQsIHJlc19oaSwgemVybzsKKyAgICB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICByNjQgID0gdnJzaHJxX25fdTY0KGEsYik7CisgICAgcmVzX2hpID0gX21tX3NybGlfZXBpNjQocjY0LCAgMzIpOworICAgIHJlc19oaSA9IF9tbV9jbXBndF9lcGkzMihyZXNfaGksIHplcm8pOworICAgIHI2NCA9IF9tbV9vcl9zaTEyOChyNjQsIHJlc19oaSk7CisgICAgcjY0ID0gX21tX3NodWZmbGVfZXBpMzIocjY0LCAwIHwgKDIgPDwgMikgfCAoMSA8PCA0KSB8ICgzIDw8IDYpKTsgLy9zaHVmZmxlIHRoZSBkYXRhIHRvIGdldCAyIDMyLWJpdHMKKyAgICByZXR1cm42NChyNjQpOworfQorCisvLyoqKioqKioqKioqKioqIFZlY3RvciB3aWRlbmluZyBzaGlmdCBsZWZ0IGJ5IGNvbnN0YW50ICoqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQxNng4X3QgdnNobGxfbl9zOChpbnQ4eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMCw4KSBpbnQgYik7IC8vIFZTSExMLlM4IHEwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2c2hsbF9uX3M4KGludDh4OF90IGEsIF9fY29uc3RyYW5nZSgwLDgpIGludCBiKSAvLyBWU0hMTC5TOCBxMCxkMCwjMAoreworICAgIF9fbTEyOGkgcjsKKyAgICByID0gX01NX0NWVEVQSThfRVBJMTYgKF9wTTEyOGkoYSkpOyAvL1NTRSA0LjEKKyAgICByZXR1cm4gX21tX3NsbGlfZXBpMTYgKHIsIGIpOworfQorCitpbnQzMng0X3QgdnNobGxfbl9zMTYoaW50MTZ4NF90IGEsIF9fY29uc3RyYW5nZSgwLDE2KSBpbnQgYik7IC8vIFZTSExMLlMxNiBxMCxkMCwjMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnNobGxfbl9zMTYoaW50MTZ4NF90IGEsIF9fY29uc3RyYW5nZSgwLDE2KSBpbnQgYikgLy8gVlNITEwuUzE2IHEwLGQwLCMwCit7CisgICAgX19tMTI4aSByOworICAgIHIgPSAgX01NX0NWVEVQSTE2X0VQSTMyKF9wTTEyOGkoYSkpOyAvL1NTRTQuMSwKKyAgICByZXR1cm4gX21tX3NsbGlfZXBpMzIgKHIsIGIpOworfQorCitpbnQ2NHgyX3QgdnNobGxfbl9zMzIoaW50MzJ4Ml90IGEsIF9fY29uc3RyYW5nZSgwLDMyKSBpbnQgYik7IC8vIFZTSExMLlMzMiBxMCxkMCwjMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgyX3QgdnNobGxfbl9zMzIoaW50MzJ4Ml90IGEsIF9fY29uc3RyYW5nZSgwLDMyKSBpbnQgYikgLy8gVlNITEwuUzMyIHEwLGQwLCMwCit7CisgICAgX19tMTI4aSByOworICAgIHIgPSAgX01NX0NWVEVQSTMyX0VQSTY0KF9wTTEyOGkoYSkpOyAvL1NTRTQuMSwKKyAgICByZXR1cm4gX21tX3NsbGlfZXBpNjQgKHIsIGIpOworfQorCit1aW50MTZ4OF90IHZzaGxsX25fdTgodWludDh4OF90IGEsIF9fY29uc3RyYW5nZSgwLDgpIGludCBiKTsgLy8gVlNITEwuVTggcTAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDhfdCB2c2hsbF9uX3U4KHVpbnQ4eDhfdCBhLCBfX2NvbnN0cmFuZ2UoMCw4KSBpbnQgYikgLy8gVlNITEwuVTggcTAsZDAsIzAKK3sKKyAgICAvL25vIHVpbnQ4IHRvIHVpbnQxNiBjb252ZXJzaW9uIGF2YWlsYWJsZSwgbWFudWFsIGNvbnZlcnNpb24gdXNlZAorICAgIF9fbTEyOGkgemVybywgIHI7CisgICAgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4ICgpOworICAgIHIgPSBfbW1fdW5wYWNrbG9fZXBpOChfcE0xMjhpKGEpLCB6ZXJvKTsKKyAgICByZXR1cm4gX21tX3NsbGlfZXBpMTYgKHIsIGIpOworfQorCit1aW50MzJ4NF90IHZzaGxsX25fdTE2KHVpbnQxNng0X3QgYSwgX19jb25zdHJhbmdlKDAsMTYpIGludCBiKTsgLy8gVlNITEwuczE2IHEwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3QgdnNobGxfbl91MTYodWludDE2eDRfdCBhLCBfX2NvbnN0cmFuZ2UoMCwxNikgaW50IGIpIC8vIFZTSExMLnMxNiBxMCxkMCwjMAoreworICAgIC8vbm8gdWludDE2IHRvIHVpbnQzMiBjb252ZXJzaW9uIGF2YWlsYWJsZSwgbWFudWFsIGNvbnZlcnNpb24gdXNlZAorICAgIF9fbTEyOGkgemVybywgIHI7CisgICAgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4ICgpOworICAgIHIgPSBfbW1fdW5wYWNrbG9fZXBpMTYoX3BNMTI4aShhKSwgemVybyk7CisgICAgcmV0dXJuIF9tbV9zbGxpX2VwaTMyIChyLCBiKTsKK30KKwordWludDY0eDJfdCB2c2hsbF9uX3UzMih1aW50MzJ4Ml90IGEsIF9fY29uc3RyYW5nZSgwLDMyKSBpbnQgYik7IC8vIFZTSExMLlUzMiBxMCxkMCwjMAorX05FT04yU1NFX0lOTElORSB1aW50NjR4Ml90IHZzaGxsX25fdTMyKHVpbnQzMngyX3QgYSwgX19jb25zdHJhbmdlKDAsMzIpIGludCBiKSAvLyBWU0hMTC5VMzIgcTAsZDAsIzAKK3sKKyAgICAvL25vIHVpbnQzMiB0byB1aW50NjQgY29udmVyc2lvbiBhdmFpbGFibGUsIG1hbnVhbCBjb252ZXJzaW9uIHVzZWQKKyAgICBfX20xMjhpIHplcm8sICByOworICAgIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCAoKTsKKyAgICByID0gX21tX3VucGFja2xvX2VwaTMyKF9wTTEyOGkoYSksIHplcm8pOworICAgIHJldHVybiBfbW1fc2xsaV9lcGk2NCAociwgYik7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU2hpZnRzIHdpdGggaW5zZXJ0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vdGFrZXMgZWFjaCBlbGVtZW50IGluIGEgdmVjdG9yLCAgc2hpZnRzIHRoZW0gYnkgYW4gaW1tZWRpYXRlIHZhbHVlLAorLy9hbmQgaW5zZXJ0cyB0aGUgcmVzdWx0cyBpbiB0aGUgZGVzdGluYXRpb24gdmVjdG9yLiBCaXRzIHNoaWZ0ZWQgb3V0IG9mIHRoZSBlYWNoIGVsZW1lbnQgYXJlIGxvc3QuCisKKy8vKioqKioqKioqKioqKioqKiBWZWN0b3Igc2hpZnQgcmlnaHQgYW5kIGluc2VydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vQWN0dWFsbHkgdGhlICJjIiBsZWZ0IGJpdHMgZnJvbSAiYSIgYXJlIHRoZSBvbmx5IGJpdHMgcmVtYWluZWQgZnJvbSAiYSIgIGFmdGVyIHRoZSBzaGlmdC4KKy8vQWxsIG90aGVyIGJpdHMgYXJlIHRha2VuIGZyb20gYiBzaGlmdGVkLgoraW50OHg4X3QgdnNyaV9uX3M4KGludDh4OF90IGEsICBpbnQ4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZTUkkuOCBkMCxkMCwjOAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2c3JpX25fczgoaW50OHg4X3QgYSwgIGludDh4OF90IGIsIF9fY29uc3RyYW5nZSgxLDgpIGludCBjKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KHZzcmlxX25fczgoX3BNMTI4aShhKSxfcE0xMjhpKGIpLCBjKSk7Cit9CisKKworaW50MTZ4NF90IHZzcmlfbl9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKTsgLy8gVlNSSS4xNiBkMCxkMCwjMTYKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZzcmlfbl9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDEsMTYpIGludCBjKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NCh2c3JpcV9uX3MxNihfcE0xMjhpKGEpLF9wTTEyOGkoYiksIGMpKTsKK30KKworCitpbnQzMngyX3QgdnNyaV9uX3MzMihpbnQzMngyX3QgYSwgIGludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGMpOyAvLyBWU1JJLjMyIGQwLGQwLCMzMgorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdnNyaV9uX3MzMihpbnQzMngyX3QgYSwgIGludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGMpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KHZzcmlxX25fczMyKF9wTTEyOGkoYSksX3BNMTI4aShiKSwgYykpOworfQorCisKK2ludDY0eDFfdCB2c3JpX25fczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYiwgX19jb25zdHJhbmdlKDEsNjQpIGludCBjKTsgLy8gVlNSSS42NCBkMCxkMCwjNjQKK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4MV90IHZzcmlfbl9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpCit7CisgICAgaW50NjR4MV90IHJlczsKKyAgICBpZiAoYyA9PTY0KQorICAgICAgICByZXMgPSBhOworICAgIGVsc2V7CisgICAgICAgIHJlcy5tNjRfaTY0WzBdID0gKGIubTY0X3U2NFswXSA+PiBjKSB8ICgoYS5tNjRfaTY0WzBdID4+ICg2NCAtIGMpKSA8PCAoNjQgLSBjKSk7IC8vdHJlYXQgYiBhcyB1bnNpZ25lZCBmb3Igc2hpZnQgdG8gZ2V0IGxlYWRpbmcgemVyb3MKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDh4OF90IHZzcmlfbl91OCh1aW50OHg4X3QgYSwgIHVpbnQ4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSw4KSBpbnQgYyk7IC8vIFZTUkkuOCBkMCxkMCwjOAorI2RlZmluZSB2c3JpX25fdTggdnNyaV9uX3M4CisKK3VpbnQxNng0X3QgdnNyaV9uX3UxNih1aW50MTZ4NF90IGEsICB1aW50MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYyk7IC8vIFZTUkkuMTYgZDAsZDAsIzE2CisjZGVmaW5lIHZzcmlfbl91MTYgdnNyaV9uX3MxNgorCit1aW50MzJ4Ml90IHZzcmlfbl91MzIodWludDMyeDJfdCBhLCAgdWludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGMpOyAvLyBWU1JJLjMyIGQwLGQwLCMzMgorI2RlZmluZSB2c3JpX25fdTMyIHZzcmlfbl9zMzIKKworCit1aW50NjR4MV90IHZzcmlfbl91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYyk7IC8vIFZTUkkuNjQgZDAsZDAsIzY0CisjZGVmaW5lIHZzcmlfbl91NjQgdnNyaV9uX3M2NAorCitwb2x5OHg4X3QgdnNyaV9uX3A4KHBvbHk4eDhfdCBhLCBwb2x5OHg4X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpOyAvLyBWU1JJLjggZDAsZDAsIzgKKyNkZWZpbmUgdnNyaV9uX3A4IHZzcmlfbl91OAorCitwb2x5MTZ4NF90IHZzcmlfbl9wMTYocG9seTE2eDRfdCBhLCBwb2x5MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYyk7IC8vIFZTUkkuMTYgZDAsZDAsIzE2CisjZGVmaW5lIHZzcmlfbl9wMTYgdnNyaV9uX3UxNgorCitpbnQ4eDE2X3QgdnNyaXFfbl9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIsIF9fY29uc3RyYW5nZSgxLDgpIGludCBjKTsgLy8gVlNSSS44IHEwLHEwLCM4CitfTkVPTjJTU0VfSU5MSU5FIGludDh4MTZfdCB2c3JpcV9uX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpIC8vIFZTUkkuOCBxMCxxMCwjOAoreworICAgIF9fbTEyOGkgbWFza0EsIGFfbWFza2VkOworICAgIHVpbnQ4eDE2X3QgYl9zaGlmdDsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrTGVmdFs5XSA9IHsweDAsIDB4ODAsIDB4YzAsIDB4ZTAsIDB4ZjAsIDB4ZjgsIDB4ZmMsIDB4ZmUsIDB4ZmZ9OyAvLyJhIiBiaXRzIG1hc2ssIDAgYml0IG5vdCB1c2VkCisgICAgbWFza0EgPSBfbW1fc2V0MV9lcGk4KG1hc2tMZWZ0W2NdKTsgLy8gYyBvbmVzIGFuZCAoOC1jKXplcm9zCisgICAgYV9tYXNrZWQgPSBfbW1fYW5kX3NpMTI4IChhLCBtYXNrQSk7CisgICAgYl9zaGlmdCA9IHZzaHJxX25fdTgoIGIsIGMpOyAvLyBjIHplcm9zIG9uIHRoZSBsZWZ0IGluIGIgZHVlIHRvIGxvZ2ljYWwgc2hpZnQKKyAgICByZXR1cm4gX21tX29yX3NpMTI4IChhX21hc2tlZCwgYl9zaGlmdCk7IC8vY29tYmluZSAoaW5zZXJ0IGIgaW50byBhKQorfQorCitpbnQxNng4X3QgdnNyaXFfbl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpOyAvLyBWU1JJLjE2IHEwLHEwLCMxNgorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgdnNyaXFfbl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMSwxNikgaW50IGMpIC8vIFZTUkkuMTYgcTAscTAsIzE2Cit7CisgICAgLy90byBjdXQgImMiIGxlZnQgYml0cyBmcm9tIGEgd2UgZG8gc2hpZnQgcmlnaHQgYW5kIHRoZW4gIHNoaWZ0IGJhY2sgbGVmdCBwcm92aWRpbmcgYyByaWdodCB6ZXJvcyBpbiBhCisgICAgdWludDE2eDhfdCBiX3NoaWZ0OworICAgIHVpbnQxNng4X3QgYV9jOworICAgIGJfc2hpZnQgPSB2c2hycV9uX3UxNiggYiwgYyk7IC8vIGMgemVyb3Mgb24gdGhlIGxlZnQgaW4gYiBkdWUgdG8gbG9naWNhbCBzaGlmdAorICAgIGFfYyA9IHZzaHJxX25fdTE2KCBhLCAoMTYgLSBjKSk7CisgICAgYV9jICA9IF9tbV9zbGxpX2VwaTE2KGFfYywgKDE2IC0gYykpOyAvL2xvZ2ljYWwgc2hpZnQgcHJvdmlkZXMgcmlnaHQgImMiIGJpdHMgemVyb3MgaW4gYQorICAgIHJldHVybiBfbW1fb3Jfc2kxMjggKGFfYywgYl9zaGlmdCk7IC8vY29tYmluZSAoaW5zZXJ0IGIgaW50byBhKQorfQorCitpbnQzMng0X3QgdnNyaXFfbl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGMpOyAvLyBWU1JJLjMyIHEwLHEwLCMzMgorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnNyaXFfbl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGMpIC8vIFZTUkkuMzIgcTAscTAsIzMyCit7CisgICAgLy90byBjdXQgImMiIGxlZnQgYml0cyBmcm9tIGEgd2UgZG8gc2hpZnQgcmlnaHQgYW5kIHRoZW4gIHNoaWZ0IGJhY2sgbGVmdCBwcm92aWRpbmcgYyByaWdodCB6ZXJvcyBpbiBhCisgICAgdWludDMyeDRfdCBiX3NoaWZ0OworICAgIHVpbnQzMng0X3QgYV9jOworICAgIGJfc2hpZnQgPSB2c2hycV9uX3UzMiggYiwgYyk7IC8vIGMgemVyb3Mgb24gdGhlIGxlZnQgaW4gYiBkdWUgdG8gbG9naWNhbCBzaGlmdAorICAgIGFfYyA9IHZzaHJxX25fdTMyKCBhLCAoMzIgLSBjKSk7CisgICAgYV9jICA9IF9tbV9zbGxpX2VwaTMyKGFfYywgKDMyIC0gYykpOyAvL2xvZ2ljYWwgc2hpZnQgcHJvdmlkZXMgcmlnaHQgImMiIGJpdHMgemVyb3MgaW4gYQorICAgIHJldHVybiBfbW1fb3Jfc2kxMjggKGFfYywgYl9zaGlmdCk7IC8vY29tYmluZSAoaW5zZXJ0IGIgaW50byBhKQorfQorCitpbnQ2NHgyX3QgdnNyaXFfbl9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpOyAvLyBWU1JJLjY0IHEwLHEwLCM2NAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgyX3QgdnNyaXFfbl9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiLCBfX2NvbnN0cmFuZ2UoMSw2NCkgaW50IGMpCit7CisgICAgLy9zZXJpYWwgc29sdXRpb24gbWF5IGJlIGZhc3RlcgorICAgIHVpbnQ2NHgyX3QgYl9zaGlmdDsKKyAgICB1aW50NjR4Ml90IGFfYzsKKyAgICBiX3NoaWZ0ID0gX21tX3NybGlfZXBpNjQoYiwgYyk7IC8vIGMgemVyb3Mgb24gdGhlIGxlZnQgaW4gYiBkdWUgdG8gbG9naWNhbCBzaGlmdAorICAgIGFfYyA9IF9tbV9zcmxpX2VwaTY0KGEsICg2NCAtIGMpKTsKKyAgICBhX2MgID0gX21tX3NsbGlfZXBpNjQoYV9jLCAoNjQgLSBjKSk7IC8vbG9naWNhbCBzaGlmdCBwcm92aWRlcyByaWdodCAiYyIgYml0cyB6ZXJvcyBpbiBhCisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAoYV9jLCBiX3NoaWZ0KTsgLy9jb21iaW5lIChpbnNlcnQgYiBpbnRvIGEpCit9CisKK3VpbnQ4eDE2X3QgdnNyaXFfbl91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpOyAvLyBWU1JJLjggcTAscTAsIzgKKyNkZWZpbmUgdnNyaXFfbl91OCB2c3JpcV9uX3M4CisKK3VpbnQxNng4X3QgdnNyaXFfbl91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYyk7IC8vIFZTUkkuMTYgcTAscTAsIzE2CisjZGVmaW5lIHZzcmlxX25fdTE2IHZzcmlxX25fczE2CisKK3VpbnQzMng0X3QgdnNyaXFfbl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYyk7IC8vIFZTUkkuMzIgcTAscTAsIzMyCisjZGVmaW5lIHZzcmlxX25fdTMyIHZzcmlxX25fczMyCisKK3VpbnQ2NHgyX3QgdnNyaXFfbl91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIsIF9fY29uc3RyYW5nZSgxLDY0KSBpbnQgYyk7IC8vIFZTUkkuNjQgcTAscTAsIzY0CisjZGVmaW5lIHZzcmlxX25fdTY0IHZzcmlxX25fczY0CisKK3BvbHk4eDE2X3QgdnNyaXFfbl9wOChwb2x5OHgxNl90IGEsIHBvbHk4eDE2X3QgYiwgX19jb25zdHJhbmdlKDEsOCkgaW50IGMpOyAvLyBWU1JJLjggcTAscTAsIzgKKyNkZWZpbmUgdnNyaXFfbl9wOCB2c3JpcV9uX3U4CisKK3BvbHkxNng4X3QgdnNyaXFfbl9wMTYocG9seTE2eDhfdCBhLCBwb2x5MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgxLDE2KSBpbnQgYyk7IC8vIFZTUkkuMTYgcTAscTAsIzE2CisjZGVmaW5lIHZzcmlxX25fcDE2IHZzcmlxX25fdTE2CisKKy8vKioqKiogVmVjdG9yIHNoaWZ0IGxlZnQgYW5kIGluc2VydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL0FjdHVhbGx5IHRoZSAiYyIgcmlnaHQgYml0cyBmcm9tICJhIiBhcmUgdGhlIG9ubHkgYml0cyByZW1haW5lZCBmcm9tICJhIiAgYWZ0ZXIgdGhlIHNoaWZ0LgorLy9BbGwgb3RoZXIgYml0cyBhcmUgdGFrZW4gZnJvbSBiIHNoaWZ0ZWQuIEVuZGluZyB6ZXJvcyBhcmUgaW5zZXJ0ZWQgaW4gYiBpbiB0aGUgc2hpZnQgcHJvY2VzLiBXZSBuZWVkIHRvIGNvbWJpbmUgImEiIGFuZCAiYiBzaGlmdGVkIi4KK2ludDh4OF90IHZzbGlfbl9zOChpbnQ4eDhfdCBhLCAgaW50OHg4X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWU0xJLjggZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdnNsaV9uX3M4KGludDh4OF90IGEsICBpbnQ4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYykKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NCh2c2xpcV9uX3M4KF9wTTEyOGkoYSksX3BNMTI4aShiKSwgYykpOworfQorCisKK2ludDE2eDRfdCB2c2xpX25fczE2KGludDE2eDRfdCBhLCAgaW50MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYyk7IC8vIFZTTEkuMTYgZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZzbGlfbl9zMTYoaW50MTZ4NF90IGEsICBpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDAsMTUpIGludCBjKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NCh2c2xpcV9uX3MxNihfcE0xMjhpKGEpLF9wTTEyOGkoYiksIGMpKTsKK30KKworCitpbnQzMngyX3QgdnNsaV9uX3MzMihpbnQzMngyX3QgYSwgIGludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzMSkgaW50IGMpOyAvLyBWU0xJLjMyIGQwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2c2xpX25fczMyKGludDMyeDJfdCBhLCAgaW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDMxKSBpbnQgYykKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnNsaXFfbl9zMzIoX3BNMTI4aShhKSxfcE0xMjhpKGIpLCBjKSk7Cit9CisKK2ludDY0eDFfdCB2c2xpX25fczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYiwgX19jb25zdHJhbmdlKDAsNjMpIGludCBjKTsgLy8gVlNMSS42NCBkMCxkMCwjMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgxX3QgdnNsaV9uX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYykKK3sKKyAgICBpbnQ2NHgxX3QgcmVzOworICAgIHJlcy5tNjRfaTY0WzBdID0gKGIubTY0X2k2NFswXSA8PCBjKSB8ICgoYS5tNjRfdTY0WzBdIDw8ICg2NCAtIGMpKSA+PiAoNjQgLSBjKSk7IC8vbmVlZCB0byB0cmVhdCBhIGFzIHVuc2lnbmVkIHRvIGdldCBsZWFkaW5nIHplcm9zCisgICAgcmV0dXJuIHJlczsKK30KKworCit1aW50OHg4X3QgdnNsaV9uX3U4KHVpbnQ4eDhfdCBhLCAgdWludDh4OF90IGIsIF9fY29uc3RyYW5nZSgwLDcpIGludCBjKTsgLy8gVlNMSS44IGQwLGQwLCMwCisjZGVmaW5lIHZzbGlfbl91OCB2c2xpX25fczgKKwordWludDE2eDRfdCB2c2xpX25fdTE2KHVpbnQxNng0X3QgYSwgIHVpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDAsMTUpIGludCBjKTsgLy8gVlNMSS4xNiBkMCxkMCwjMAorI2RlZmluZSB2c2xpX25fdTE2IHZzbGlfbl9zMTYKKwordWludDMyeDJfdCB2c2xpX25fdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMzEpIGludCBjKTsgLy8gVlNMSS4zMiBkMCxkMCwjMAorI2RlZmluZSB2c2xpX25fdTMyIHZzbGlfbl9zMzIKKwordWludDY0eDFfdCB2c2xpX25fdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGMpOyAvLyBWU0xJLjY0IGQwLGQwLCMwCisjZGVmaW5lIHZzbGlfbl91NjQgdnNsaV9uX3M2NAorCitwb2x5OHg4X3QgdnNsaV9uX3A4KHBvbHk4eDhfdCBhLCBwb2x5OHg4X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWU0xJLjggZDAsZDAsIzAKKyNkZWZpbmUgdnNsaV9uX3A4IHZzbGlfbl91OAorCitwb2x5MTZ4NF90IHZzbGlfbl9wMTYocG9seTE2eDRfdCBhLCBwb2x5MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYyk7IC8vIFZTTEkuMTYgZDAsZDAsIzAKKyNkZWZpbmUgdnNsaV9uX3AxNiB2c2xpX25fdTE2CisKK2ludDh4MTZfdCB2c2xpcV9uX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWU0xJLjggcTAscTAsIzAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90IHZzbGlxX25fczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYykgLy8gVlNMSS44IHEwLHEwLCMwCit7CisgICAgX19tMTI4aSBtYXNrQSwgYV9tYXNrZWQ7CisgICAgaW50OHgxNl90IGJfc2hpZnQ7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ4X3QgbWFza1JpZ2h0WzhdID0gezB4MCwgMHgxLCAweDMsIDB4NywgMHgwZiwgMHgxZiwgMHgzZiwgMHg3Zn07IC8vImEiIGJpdHMgbWFzaworICAgIG1hc2tBID0gX21tX3NldDFfZXBpOChtYXNrUmlnaHRbY10pOyAvLyAoOC1jKXplcm9zIGFuZCBjIG9uZXMKKyAgICBiX3NoaWZ0ID0gdnNobHFfbl9zOCggYiwgYyk7CisgICAgYV9tYXNrZWQgPSBfbW1fYW5kX3NpMTI4IChhLCBtYXNrQSk7CisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAoYl9zaGlmdCwgYV9tYXNrZWQpOyAvL2NvbWJpbmUgKGluc2VydCBiIGludG8gYSkKK30KKworaW50MTZ4OF90IHZzbGlxX25fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgX19jb25zdHJhbmdlKDAsMTUpIGludCBjKTsgLy8gVlNMSS4xNiBxMCxxMCwjMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgdnNsaXFfbl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGMpIC8vIFZTTEkuMTYgcTAscTAsIzAKK3sKKyAgICAvL3RvIGN1dCAiYyIgcmlnaHQgYml0cyBmcm9tIGEgd2UgZG8gc2hpZnQgbGVmdCBhbmQgdGhlbiBsb2dpY2FsIHNoaWZ0IGJhY2sgcmlnaHQgcHJvdmlkaW5nICgxNi1jKXplcm9zIGluIGEKKyAgICBpbnQxNng4X3QgYl9zaGlmdDsKKyAgICBpbnQxNng4X3QgYV9jOworICAgIGJfc2hpZnQgPSB2c2hscV9uX3MxNiggYiwgYyk7CisgICAgYV9jID0gdnNobHFfbl9zMTYoIGEsICgxNiAtIGMpKTsKKyAgICBhX2MgID0gX21tX3NybGlfZXBpMTYoYV9jLCAoMTYgLSBjKSk7CisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAoYl9zaGlmdCwgYV9jKTsgLy9jb21iaW5lIChpbnNlcnQgYiBpbnRvIGEpCit9CisKK2ludDMyeDRfdCB2c2xpcV9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDMxKSBpbnQgYyk7IC8vIFZTTEkuMzIgcTAscTAsIzAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZzbGlxX25fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgX19jb25zdHJhbmdlKDAsMzEpIGludCBjKSAvLyBWU0xJLjMyIHEwLHEwLCMwCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggdGhlIHNlcmlhbCBvbmUKKyAgICAvL3RvIGN1dCAiYyIgcmlnaHQgYml0cyBmcm9tIGEgd2UgZG8gc2hpZnQgbGVmdCBhbmQgdGhlbiBsb2dpY2FsIHNoaWZ0IGJhY2sgcmlnaHQgcHJvdmlkaW5nICgzMi1jKXplcm9zIGluIGEKKyAgICBpbnQzMng0X3QgYl9zaGlmdDsKKyAgICBpbnQzMng0X3QgYV9jOworICAgIGJfc2hpZnQgPSB2c2hscV9uX3MzMiggYiwgYyk7CisgICAgYV9jID0gdnNobHFfbl9zMzIoIGEsICgzMiAtIGMpKTsKKyAgICBhX2MgID0gX21tX3NybGlfZXBpMzIoYV9jLCAoMzIgLSBjKSk7CisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAoYl9zaGlmdCwgYV9jKTsgLy9jb21iaW5lIChpbnNlcnQgYiBpbnRvIGEpCit9CisKK2ludDY0eDJfdCB2c2xpcV9uX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDYzKSBpbnQgYyk7IC8vIFZTTEkuNjQgcTAscTAsIzAKK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4Ml90IHZzbGlxX25fczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYiwgX19jb25zdHJhbmdlKDAsNjMpIGludCBjKSAvLyBWU0xJLjY0IHEwLHEwLCMwCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgIG5vdCBvcHRpbWFsIGNvbXBhcmVkIHdpdGggdGhlIHNlcmlhbCBvbmUKKyAgICAvL3RvIGN1dCAiYyIgcmlnaHQgYml0cyBmcm9tIGEgd2UgZG8gc2hpZnQgbGVmdCBhbmQgdGhlbiBsb2dpY2FsIHNoaWZ0IGJhY2sgcmlnaHQgcHJvdmlkaW5nICg2NC1jKXplcm9zIGluIGEKKyAgICBpbnQ2NHgyX3QgYl9zaGlmdDsKKyAgICBpbnQ2NHgyX3QgYV9jOworICAgIGJfc2hpZnQgPSB2c2hscV9uX3M2NCggYiwgYyk7CisgICAgYV9jID0gdnNobHFfbl9zNjQoIGEsICg2NCAtIGMpKTsKKyAgICBhX2MgID0gX21tX3NybGlfZXBpNjQoYV9jLCAoNjQgLSBjKSk7CisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAoYl9zaGlmdCwgYV9jKTsgLy9jb21iaW5lIChpbnNlcnQgYiBpbnRvIGEpCit9CisKK3VpbnQ4eDE2X3QgdnNsaXFfbl91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWU0xJLjggcTAscTAsIzAKKyNkZWZpbmUgdnNsaXFfbl91OCB2c2xpcV9uX3M4CisKK3VpbnQxNng4X3QgdnNsaXFfbl91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYyk7IC8vIFZTTEkuMTYgcTAscTAsIzAKKyNkZWZpbmUgdnNsaXFfbl91MTYgdnNsaXFfbl9zMTYKKwordWludDMyeDRfdCB2c2xpcV9uX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgX19jb25zdHJhbmdlKDAsMzEpIGludCBjKTsgLy8gVlNMSS4zMiBxMCxxMCwjMAorI2RlZmluZSB2c2xpcV9uX3UzMiB2c2xpcV9uX3MzMgorCit1aW50NjR4Ml90IHZzbGlxX25fdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCw2MykgaW50IGMpOyAvLyBWU0xJLjY0IHEwLHEwLCMwCisjZGVmaW5lIHZzbGlxX25fdTY0IHZzbGlxX25fczY0CisKK3BvbHk4eDE2X3QgdnNsaXFfbl9wOChwb2x5OHgxNl90IGEsIHBvbHk4eDE2X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWU0xJLjggcTAscTAsIzAKKyNkZWZpbmUgdnNsaXFfbl9wOCB2c2xpcV9uX3U4CisKK3BvbHkxNng4X3QgdnNsaXFfbl9wMTYocG9seTE2eDhfdCBhLCBwb2x5MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYyk7IC8vIFZTTEkuMTYgcTAscTAsIzAKKyNkZWZpbmUgdnNsaXFfbl9wMTYgdnNsaXFfbl91MTYKKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vICoqKioqKioqKioqKioqKioqKiBMb2FkcyBhbmQgc3RvcmVzIG9mIGEgc2luZ2xlIHZlY3RvciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL1BlcmZvcm1zIGxvYWRzIGFuZCBzdG9yZXMgb2YgYSBzaW5nbGUgdmVjdG9yIG9mIHNvbWUgdHlwZS4KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTG9hZHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL1dlIGFzc3VtZSBwdHIgaXMgTk9UIGFsaWduZWQgaW4gZ2VuZXJhbCBjYXNlIGFuZCB1c2UgX19tMTI4aSBfbW1fbG9hZHVfc2kxMjggKChfX20xMjhpKikgcHRyKTsuCisvL2Fsc28gZm9yIFNTRTMgIHN1cHBvcnRpbmcgc3lzdGVtcyB0aGUgX19tMTI4aSBfbW1fbGRkcXVfc2kxMjggKF9fbTEyOGkgY29uc3QqIHApIHVzYWdlIGZvciB1bmFsaWduZWQgYWNjZXNzIG1heSBiZSBhZHZhbnRhZ2VvdXMuCisvLyBpdCBsb2FkcyBhIDMyLWJ5dGUgYmxvY2sgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgYW5kIGV4dHJhY3RzIHRoZSAxNiBieXRlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmFsaWduZWQgYWNjZXNzCisvL0lmIHRoZSBwdHIgaXMgYWxpZ25lZCB0aGVuIGNvdWxkIHVzZSBfX20xMjhpIF9tbV9sb2FkX3NpMTI4ICgoX19tMTI4aSopIHB0cikgaW5zdGVhZDsKKyNkZWZpbmUgTE9BRF9TSTEyOChwdHIpIFwKKyAgICAgICAgKCAoKHVuc2lnbmVkIGxvbmcpKHB0cikgJiAxNSkgPT0gMCApID8gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShwdHIpKSA6IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopKHB0cikpOworCit1aW50OHgxNl90IHZsZDFxX3U4KF9fdHJhbnNmZXJzaXplKDE2KSB1aW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS44IHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZsZDFxX3U4IExPQURfU0kxMjgKKwordWludDE2eDhfdCB2bGQxcV91MTYoX190cmFuc2ZlcnNpemUoOCkgdWludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZsZDFxX3UxNiBMT0FEX1NJMTI4CisKK3VpbnQzMng0X3QgdmxkMXFfdTMyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4zMiB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2bGQxcV91MzIgTE9BRF9TSTEyOAorCit1aW50NjR4Ml90IHZsZDFxX3U2NChfX3RyYW5zZmVyc2l6ZSgyKSB1aW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfdTY0IExPQURfU0kxMjgKKworaW50OHgxNl90IHZsZDFxX3M4KF9fdHJhbnNmZXJzaXplKDE2KSBpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjgge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfczggTE9BRF9TSTEyOAorCitpbnQxNng4X3QgdmxkMXFfczE2KF9fdHJhbnNmZXJzaXplKDgpIGludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZsZDFxX3MxNiBMT0FEX1NJMTI4CisKK2ludDMyeDRfdCB2bGQxcV9zMzIoX190cmFuc2ZlcnNpemUoNCkgaW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMzIge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfczMyIExPQURfU0kxMjgKKworaW50NjR4Ml90IHZsZDFxX3M2NChfX3RyYW5zZmVyc2l6ZSgyKSBpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2bGQxcV9zNjQgTE9BRF9TSTEyOAorCitmbG9hdDE2eDhfdCB2bGQxcV9mMTYoX190cmFuc2ZlcnNpemUoOCkgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4xNiB7ZDAsIGQxfSwgW3IwXQorLy8gSUEzMiBTSU1EIGRvZXNuJ3Qgd29yayB3aXRoIDE2Yml0IGZsb2F0cyBjdXJyZW50bHksIHNvIG5lZWQgdG8gZ28gdG8gMzIgYml0IGFuZCB0aGVuIHdvcmsgd2l0aCB0d28gMTI4Yml0IHJlZ2lzdGVycworLyogX05FT04yU1NFX0lOTElORSBmbG9hdDE2eDhfdCB2bGQxcV9mMTYoX190cmFuc2ZlcnNpemUoOCkgX19mcDE2IGNvbnN0ICogcHRyKS8vIFZMRDEuMTYge2QwLCBkMX0sIFtyMF0KK3tfX20xMjggZjEgPSBfbW1fc2V0X3BzIChwdHJbM10sIHB0clsyXSwgcHRyWzFdLCBwdHJbMF0pOworX19tMTI4IGYyOworZjIgPSBfbW1fc2V0X3BzIChwdHJbN10sIHB0cls2XSwgcHRyWzVdLCBwdHJbNF0pOworfSovCisKK2Zsb2F0MzJ4NF90IHZsZDFxX2YzMihfX3RyYW5zZmVyc2l6ZSg0KSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjMyIHtkMCwgZDF9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4NF90IHZsZDFxX2YzMihfX3RyYW5zZmVyc2l6ZSg0KSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpCit7CisgICAgaWYoICgoKHVuc2lnbmVkIGxvbmcpKHB0cikpICYgMTUgKSA9PSAwICkgLy8xNiBiaXRzIGFsaWduZWQKKyAgICAgICAgcmV0dXJuIF9tbV9sb2FkX3BzKHB0cik7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gX21tX2xvYWR1X3BzKHB0cik7Cit9CisKK3BvbHk4eDE2X3QgdmxkMXFfcDgoX190cmFuc2ZlcnNpemUoMTYpIHBvbHk4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjgge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfcDggIExPQURfU0kxMjgKKworcG9seTE2eDhfdCB2bGQxcV9wMTYoX190cmFuc2ZlcnNpemUoOCkgcG9seTE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZsZDFxX3AxNiBMT0FEX1NJMTI4CisKK3VpbnQ4eDhfdCB2bGQxX3U4KF9fdHJhbnNmZXJzaXplKDgpIHVpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjgge2QwfSwgW3IwXQorI2RlZmluZSB2bGQxX3U4KHB0cikgICooKF9fbTY0XzEyOCopKHB0cikpIC8vd2FzIF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopKHB0cikpCisKK3VpbnQxNng0X3QgdmxkMV91MTYoX190cmFuc2ZlcnNpemUoNCkgdWludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMH0sIFtyMF0KKyNkZWZpbmUgdmxkMV91MTYgdmxkMV91OAorCit1aW50MzJ4Ml90IHZsZDFfdTMyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4zMiB7ZDB9LCBbcjBdCisjZGVmaW5lIHZsZDFfdTMyIHZsZDFfdTgKKworCit1aW50NjR4MV90IHZsZDFfdTY0KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDB9LCBbcjBdCisjZGVmaW5lIHZsZDFfdTY0IHZsZDFfdTgKKworaW50OHg4X3QgdmxkMV9zOChfX3RyYW5zZmVyc2l6ZSg4KSBpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjgge2QwfSwgW3IwXQorI2RlZmluZSB2bGQxX3M4IHZsZDFfdTgKKworaW50MTZ4NF90IHZsZDFfczE2KF9fdHJhbnNmZXJzaXplKDQpIGludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMH0sIFtyMF0KKyNkZWZpbmUgdmxkMV9zMTYgdmxkMV91MTYKKworaW50MzJ4Ml90IHZsZDFfczMyKF9fdHJhbnNmZXJzaXplKDIpIGludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjMyIHtkMH0sIFtyMF0KKyNkZWZpbmUgdmxkMV9zMzIgdmxkMV91MzIKKworaW50NjR4MV90IHZsZDFfczY0KF9fdHJhbnNmZXJzaXplKDEpIGludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMH0sIFtyMF0KKyNkZWZpbmUgdmxkMV9zNjQgdmxkMV91NjQKKworZmxvYXQxNng0X3QgdmxkMV9mMTYoX190cmFuc2ZlcnNpemUoNCkgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4xNiB7ZDB9LCBbcjBdCisvLyBJQTMyIFNJTUQgZG9lc24ndCB3b3JrIHdpdGggMTZiaXQgZmxvYXRzIGN1cnJlbnRseSwgc28gbmVlZCB0byBnbyB0byAzMiBiaXQgbGlrZSBfbW1fc2V0X3BzIChwdHJbM10sIHB0clsyXSwgcHRyWzFdLCBwdHJbMF0pOworCitmbG9hdDMyeDJfdCB2bGQxX2YzMihfX3RyYW5zZmVyc2l6ZSgyKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjMyIHtkMH0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3QgdmxkMV9mMzIoX190cmFuc2ZlcnNpemUoMikgZmxvYXQzMl90IGNvbnN0ICogcHRyKQoreworICAgIGZsb2F0MzJ4Ml90IHJlczsKKyAgICByZXMubTY0X2YzMlswXSA9ICoocHRyKTsKKyAgICByZXMubTY0X2YzMlsxXSA9ICoocHRyICsgMSk7CisgICAgcmV0dXJuIHJlczsKK30KKworcG9seTh4OF90IHZsZDFfcDgoX190cmFuc2ZlcnNpemUoOCkgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuOCB7ZDB9LCBbcjBdCisjZGVmaW5lIHZsZDFfcDggdmxkMV91OAorCitwb2x5MTZ4NF90IHZsZDFfcDE2KF9fdHJhbnNmZXJzaXplKDQpIHBvbHkxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4xNiB7ZDB9LCBbcjBdCisjZGVmaW5lIHZsZDFfcDE2IHZsZDFfdTE2CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKiBMYW5lIGxvYWQgZnVuY3Rpb25zIC0gaW5zZXJ0IHRoZSBkYXRhIGF0ICB2ZWN0b3IncyBnaXZlbiBwb3NpdGlvbiAobGFuZSkgKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgordWludDh4MTZfdCB2bGQxcV9sYW5lX3U4KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ4X3QgY29uc3QgKiBwdHIsIHVpbnQ4eDE2X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGxhbmUpOyAvLyBWTEQxLjgge2QwWzBdfSwgW3IwXQorI2RlZmluZSB2bGQxcV9sYW5lX3U4KHB0ciwgdmVjLCBsYW5lKSBfTU1fSU5TRVJUX0VQSTgodmVjLCAqKHB0ciksIGxhbmUpCisKK3VpbnQxNng4X3QgdmxkMXFfbGFuZV91MTYoX190cmFuc2ZlcnNpemUoMSkgICAgdWludDE2X3QgY29uc3QgKiBwdHIsIHVpbnQxNng4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZMRDEuMTYge2QwWzBdfSwgW3IwXQorI2RlZmluZSB2bGQxcV9sYW5lX3UxNihwdHIsIHZlYywgbGFuZSkgX01NX0lOU0VSVF9FUEkxNih2ZWMsICoocHRyKSwgbGFuZSkKKwordWludDMyeDRfdCB2bGQxcV9sYW5lX3UzMihfX3RyYW5zZmVyc2l6ZSgxKSB1aW50MzJfdCBjb25zdCAqIHB0ciwgdWludDMyeDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMS4zMiB7ZDBbMF19LCBbcjBdCisjZGVmaW5lIHZsZDFxX2xhbmVfdTMyKHB0ciwgdmVjLCBsYW5lKSBfTU1fSU5TRVJUX0VQSTMyKHZlYywgKihwdHIpLCBsYW5lKQorCit1aW50NjR4Ml90IHZsZDFxX2xhbmVfdTY0KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ2NF90IGNvbnN0ICogcHRyLCB1aW50NjR4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTEQxLjY0IHtkMH0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfbGFuZV91NjQocHRyLCB2ZWMsIGxhbmUpIF9NTV9JTlNFUlRfRVBJNjQodmVjLCAqKHB0ciksIGxhbmUpOyAvLyBfcDsKKworCitpbnQ4eDE2X3QgdmxkMXFfbGFuZV9zOChfX3RyYW5zZmVyc2l6ZSgxKSBpbnQ4X3QgY29uc3QgKiBwdHIsIGludDh4MTZfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgbGFuZSk7IC8vIFZMRDEuOCB7ZDBbMF19LCBbcjBdCisjZGVmaW5lIHZsZDFxX2xhbmVfczgocHRyLCB2ZWMsIGxhbmUpIF9NTV9JTlNFUlRfRVBJOCh2ZWMsICoocHRyKSwgbGFuZSkKKworaW50MTZ4OF90IHZsZDFxX2xhbmVfczE2KF9fdHJhbnNmZXJzaXplKDEpIGludDE2X3QgY29uc3QgKiBwdHIsIGludDE2eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxEMS4xNiB7ZDBbMF19LCBbcjBdCisjZGVmaW5lIHZsZDFxX2xhbmVfczE2KHB0ciwgdmVjLCBsYW5lKSBfTU1fSU5TRVJUX0VQSTE2KHZlYywgKihwdHIpLCBsYW5lKQorCitpbnQzMng0X3QgdmxkMXFfbGFuZV9zMzIoX190cmFuc2ZlcnNpemUoMSkgaW50MzJfdCBjb25zdCAqIHB0ciwgaW50MzJ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTEQxLjMyIHtkMFswXX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfbGFuZV9zMzIocHRyLCB2ZWMsIGxhbmUpIF9NTV9JTlNFUlRfRVBJMzIodmVjLCAqKHB0ciksIGxhbmUpCisKK2Zsb2F0MTZ4OF90IHZsZDFxX2xhbmVfZjE2KF9fdHJhbnNmZXJzaXplKDEpIF9fZnAxNiBjb25zdCAqIHB0ciwgZmxvYXQxNng4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZMRDEuMTYge2QwWzBdfSwgW3IwXQorLy9jdXJyZW50IElBIFNJTUQgZG9lc24ndCBzdXBwb3J0IGZsb2F0MTYKKworZmxvYXQzMng0X3QgdmxkMXFfbGFuZV9mMzIoX190cmFuc2ZlcnNpemUoMSkgZmxvYXQzMl90IGNvbnN0ICogcHRyLCBmbG9hdDMyeDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMS4zMiB7ZDBbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4NF90IHZsZDFxX2xhbmVfZjMyKF9fdHJhbnNmZXJzaXplKDEpIGZsb2F0MzJfdCBjb25zdCAqIHB0ciwgZmxvYXQzMng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkKK3sKKyAgICAvL3dlIG5lZWQgdG8gZGVhbCB3aXRoICBwdHIgIDE2Yml0IE5PVCBhbGlnbmVkIGNhc2UKKyAgICBfX20xMjggcDsKKyAgICBwID0gX21tX3NldDFfcHMoKihwdHIpKTsKKyAgICByZXR1cm4gX01NX0lOU0VSVF9QUyh2ZWMsICBwLCBfSU5TRVJUUFNfTkRYKDAsIGxhbmUpKTsKK30KKworaW50NjR4Ml90IHZsZDFxX2xhbmVfczY0KF9fdHJhbnNmZXJzaXplKDEpIGludDY0X3QgY29uc3QgKiBwdHIsIGludDY0eDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVkxEMS42NCB7ZDB9LCBbcjBdCisjZGVmaW5lIHZsZDFxX2xhbmVfczY0KHB0ciwgdmVjLCBsYW5lKSBfTU1fSU5TRVJUX0VQSTY0KHZlYywgKihwdHIpLCBsYW5lKQorCitwb2x5OHgxNl90IHZsZDFxX2xhbmVfcDgoX190cmFuc2ZlcnNpemUoMSkgcG9seThfdCBjb25zdCAqIHB0ciwgcG9seTh4MTZfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgbGFuZSk7IC8vIFZMRDEuOCB7ZDBbMF19LCBbcjBdCisjZGVmaW5lIHZsZDFxX2xhbmVfcDgocHRyLCB2ZWMsIGxhbmUpIF9NTV9JTlNFUlRfRVBJOCh2ZWMsICoocHRyKSwgbGFuZSkKKworcG9seTE2eDhfdCB2bGQxcV9sYW5lX3AxNihfX3RyYW5zZmVyc2l6ZSgxKSBwb2x5MTZfdCBjb25zdCAqIHB0ciwgcG9seTE2eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxEMS4xNiB7ZDBbMF19LCBbcjBdCisjZGVmaW5lIHZsZDFxX2xhbmVfcDE2KHB0ciwgdmVjLCBsYW5lKSBfTU1fSU5TRVJUX0VQSTE2KHZlYywgKihwdHIpLCBsYW5lKQorCit1aW50OHg4X3QgdmxkMV9sYW5lX3U4KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ4X3QgY29uc3QgKiBwdHIsIHVpbnQ4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxEMS44IHtkMFswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZsZDFfbGFuZV91OChfX3RyYW5zZmVyc2l6ZSgxKSB1aW50OF90IGNvbnN0ICogcHRyLCB1aW50OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSkKK3sKKyAgICB1aW50OHg4X3QgcmVzOworICAgIHJlcyA9IHZlYzsKKyAgICByZXMubTY0X3U4W2xhbmVdID0gKihwdHIpOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQxNng0X3QgdmxkMV9sYW5lX3UxNihfX3RyYW5zZmVyc2l6ZSgxKSB1aW50MTZfdCBjb25zdCAqIHB0ciwgdWludDE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMS4xNiB7ZDBbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdmxkMV9sYW5lX3UxNihfX3RyYW5zZmVyc2l6ZSgxKSB1aW50MTZfdCBjb25zdCAqIHB0ciwgdWludDE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKQoreworICAgIHVpbnQxNng0X3QgcmVzOworICAgIHJlcyA9IHZlYzsKKyAgICByZXMubTY0X3UxNltsYW5lXSA9ICoocHRyKTsKKyAgICByZXR1cm4gcmVzOworfQorCit1aW50MzJ4Ml90IHZsZDFfbGFuZV91MzIoX190cmFuc2ZlcnNpemUoMSkgdWludDMyX3QgY29uc3QgKiBwdHIsIHVpbnQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZMRDEuMzIge2QwWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZsZDFfbGFuZV91MzIoX190cmFuc2ZlcnNpemUoMSkgdWludDMyX3QgY29uc3QgKiBwdHIsIHVpbnQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSkKK3sKKyAgICB1aW50MzJ4Ml90IHJlczsKKyAgICByZXMgPSB2ZWM7CisgICAgcmVzLm02NF91MzJbbGFuZV0gPSAqKHB0cik7CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDY0eDFfdCB2bGQxX2xhbmVfdTY0KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ2NF90IGNvbnN0ICogcHRyLCB1aW50NjR4MV90IHZlYywgX19jb25zdHJhbmdlKDAsMCkgaW50IGxhbmUpOyAvLyBWTEQxLjY0IHtkMH0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDFfdCB2bGQxX2xhbmVfdTY0KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ2NF90IGNvbnN0ICogcHRyLCB1aW50NjR4MV90IHZlYywgX19jb25zdHJhbmdlKDAsMCkgaW50IGxhbmUpCit7CisgICAgdWludDY0eDFfdCByZXM7CisgICAgcmVzLm02NF91NjRbMF0gPSAqKHB0cik7CisgICAgcmV0dXJuIHJlczsKK30KKworCitpbnQ4eDhfdCB2bGQxX2xhbmVfczgoX190cmFuc2ZlcnNpemUoMSkgaW50OF90IGNvbnN0ICogcHRyLCBpbnQ4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxEMS44IHtkMFswXX0sIFtyMF0KKyNkZWZpbmUgdmxkMV9sYW5lX3M4KHB0ciwgdmVjLCBsYW5lKSB2bGQxX2xhbmVfdTgoKHVpbnQ4X3QqKXB0ciwgdmVjLCBsYW5lKQorCitpbnQxNng0X3QgdmxkMV9sYW5lX3MxNihfX3RyYW5zZmVyc2l6ZSgxKSBpbnQxNl90IGNvbnN0ICogcHRyLCBpbnQxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDEuMTYge2QwWzBdfSwgW3IwXQorI2RlZmluZSB2bGQxX2xhbmVfczE2KHB0ciwgdmVjLCBsYW5lKSB2bGQxX2xhbmVfdTE2KCh1aW50MTZfdCopcHRyLCB2ZWMsIGxhbmUpCisKK2ludDMyeDJfdCB2bGQxX2xhbmVfczMyKF9fdHJhbnNmZXJzaXplKDEpIGludDMyX3QgY29uc3QgKiBwdHIsIGludDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVkxEMS4zMiB7ZDBbMF19LCBbcjBdCisjZGVmaW5lIHZsZDFfbGFuZV9zMzIocHRyLCB2ZWMsIGxhbmUpIHZsZDFfbGFuZV91MzIoKHVpbnQzMl90KilwdHIsIHZlYywgbGFuZSkKKworZmxvYXQxNng0X3QgdmxkMV9sYW5lX2YxNihfX3RyYW5zZmVyc2l6ZSgxKSBfX2ZwMTYgY29uc3QgKiBwdHIsIGZsb2F0MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTEQxLjE2IHtkMFswXX0sIFtyMF0KKy8vY3VycmVudCBJQSBTSU1EIGRvZXNuJ3Qgc3VwcG9ydCBmbG9hdDE2CisKK2Zsb2F0MzJ4Ml90IHZsZDFfbGFuZV9mMzIoX190cmFuc2ZlcnNpemUoMSkgZmxvYXQzMl90IGNvbnN0ICogcHRyLCBmbG9hdDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVkxEMS4zMiB7ZDBbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZsZDFfbGFuZV9mMzIoX190cmFuc2ZlcnNpemUoMSkgZmxvYXQzMl90IGNvbnN0ICogcHRyLCBmbG9hdDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKQoreworICAgIGZsb2F0MzJ4Ml90IHJlczsKKyAgICByZXMgPSB2ZWM7CisgICAgcmVzLm02NF9mMzJbbGFuZV0gPSAqKHB0cik7CisgICAgcmV0dXJuIHJlczsKK30KKworaW50NjR4MV90IHZsZDFfbGFuZV9zNjQoX190cmFuc2ZlcnNpemUoMSkgaW50NjRfdCBjb25zdCAqIHB0ciwgaW50NjR4MV90IHZlYywgX19jb25zdHJhbmdlKDAsMCkgaW50IGxhbmUpOyAvLyBWTEQxLjY0IHtkMH0sIFtyMF0KKyNkZWZpbmUgdmxkMV9sYW5lX3M2NChwdHIsIHZlYywgbGFuZSkgdmxkMV9sYW5lX3U2NCgodWludDY0X3QqKXB0ciwgdmVjLCBsYW5lKQorCitwb2x5OHg4X3QgdmxkMV9sYW5lX3A4KF9fdHJhbnNmZXJzaXplKDEpIHBvbHk4X3QgY29uc3QgKiBwdHIsIHBvbHk4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxEMS44IHtkMFswXX0sIFtyMF0KKyNkZWZpbmUgdmxkMV9sYW5lX3A4IHZsZDFfbGFuZV91OAorCitwb2x5MTZ4NF90IHZsZDFfbGFuZV9wMTYoX190cmFuc2ZlcnNpemUoMSkgcG9seTE2X3QgY29uc3QgKiBwdHIsIHBvbHkxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDEuMTYge2QwWzBdfSwgW3IwXQorI2RlZmluZSB2bGQxX2xhbmVfcDE2IHZsZDFfbGFuZV9zMTYKKworLy8gKioqKioqKioqKioqKioqKioqIExvYWQgc2luZ2xlIHZhbHVlICggc2V0IGFsbCBsYW5lcyBvZiB2ZWN0b3Igd2l0aCBzYW1lIHZhbHVlIGZyb20gbWVtb3J5KSoqKioqKioqKioqKioqKioqKioqKioKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgordWludDh4MTZfdCB2bGQxcV9kdXBfdTgoX190cmFuc2ZlcnNpemUoMSkgdWludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuOCB7ZDBbXX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfZHVwX3U4KHB0cikgX21tX3NldDFfZXBpOCgqKHB0cikpCisKK3VpbnQxNng4X3QgdmxkMXFfZHVwX3UxNihfX3RyYW5zZmVyc2l6ZSgxKSB1aW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwW119LCBbcjBdCisjZGVmaW5lIHZsZDFxX2R1cF91MTYocHRyKSBfbW1fc2V0MV9lcGkxNigqKHB0cikpCisKK3VpbnQzMng0X3QgdmxkMXFfZHVwX3UzMihfX3RyYW5zZmVyc2l6ZSgxKSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMzIge2QwW119LCBbcjBdCisjZGVmaW5lIHZsZDFxX2R1cF91MzIocHRyKSBfbW1fc2V0MV9lcGkzMigqKHB0cikpCisKK3VpbnQ2NHgyX3QgdmxkMXFfZHVwX3U2NChfX3RyYW5zZmVyc2l6ZSgxKSB1aW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50NjR4Ml90ICAgdmxkMXFfZHVwX3U2NChfX3RyYW5zZmVyc2l6ZSgxKSB1aW50NjRfdCBjb25zdCAqIHB0cikKK3sKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDY0X3QgdmFsWzJdID0geyoocHRyKSwgKihwdHIpfTsKKyAgICByZXR1cm4gTE9BRF9TSTEyOCh2YWwpOworfQorCitpbnQ4eDE2X3QgdmxkMXFfZHVwX3M4KF9fdHJhbnNmZXJzaXplKDEpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuOCB7ZDBbXX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfZHVwX3M4KHB0cikgX21tX3NldDFfZXBpOCgqKHB0cikpCisKK2ludDE2eDhfdCB2bGQxcV9kdXBfczE2KF9fdHJhbnNmZXJzaXplKDEpIGludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMFtdfSwgW3IwXQorI2RlZmluZSB2bGQxcV9kdXBfczE2KHB0cikgX21tX3NldDFfZXBpMTYgKCoocHRyKSkKKworaW50MzJ4NF90IHZsZDFxX2R1cF9zMzIoX190cmFuc2ZlcnNpemUoMSkgaW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMzIge2QwW119LCBbcjBdCisjZGVmaW5lIHZsZDFxX2R1cF9zMzIocHRyKSBfbW1fc2V0MV9lcGkzMiAoKihwdHIpKQorCitpbnQ2NHgyX3QgdmxkMXFfZHVwX3M2NChfX3RyYW5zZmVyc2l6ZSgxKSBpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDB9LCBbcjBdCisjZGVmaW5lIHZsZDFxX2R1cF9zNjQocHRyKSB2bGQxcV9kdXBfdTY0KCh1aW50NjRfdCopcHRyKQorCitmbG9hdDE2eDhfdCB2bGQxcV9kdXBfZjE2KF9fdHJhbnNmZXJzaXplKDEpIF9fZnAxNiBjb25zdCAqIHB0cik7IC8vIFZMRDEuMTYge2QwW119LCBbcjBdCisvL2N1cnJlbnQgSUEgU0lNRCBkb2Vzbid0IHN1cHBvcnQgZmxvYXQxNiwgbmVlZCB0byBnbyB0byAzMiBiaXRzCisKK2Zsb2F0MzJ4NF90IHZsZDFxX2R1cF9mMzIoX190cmFuc2ZlcnNpemUoMSkgZmxvYXQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4zMiB7ZDBbXX0sIFtyMF0KKyNkZWZpbmUgdmxkMXFfZHVwX2YzMihwdHIpIF9tbV9zZXQxX3BzICgqKHB0cikpCisKK3BvbHk4eDE2X3QgdmxkMXFfZHVwX3A4KF9fdHJhbnNmZXJzaXplKDEpIHBvbHk4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjgge2QwW119LCBbcjBdCisjZGVmaW5lIHZsZDFxX2R1cF9wOChwdHIpIF9tbV9zZXQxX2VwaTgoKihwdHIpKQorCitwb2x5MTZ4OF90IHZsZDFxX2R1cF9wMTYoX190cmFuc2ZlcnNpemUoMSkgcG9seTE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMFtdfSwgW3IwXQorI2RlZmluZSB2bGQxcV9kdXBfcDE2KHB0cikgX21tX3NldDFfZXBpMTYgKCoocHRyKSkKKwordWludDh4OF90IHZsZDFfZHVwX3U4KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjgge2QwW119LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQ4eDhfdCB2bGQxX2R1cF91OChfX3RyYW5zZmVyc2l6ZSgxKSB1aW50OF90IGNvbnN0ICogcHRyKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICB1aW50OHg4X3QgcmVzOworICAgIGludCBpOworICAgIGZvcihpID0gMDsgaTw4OyBpKyspIHsKKyAgICAgICAgcmVzLm02NF91OFtpXSA9ICAqKHB0cik7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQxNng0X3QgdmxkMV9kdXBfdTE2KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4xNiB7ZDBbXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDE2eDRfdCB2bGQxX2R1cF91MTYoX190cmFuc2ZlcnNpemUoMSkgdWludDE2X3QgY29uc3QgKiBwdHIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIHVpbnQxNng0X3QgcmVzOworICAgIGludCBpOworICAgIGZvcihpID0gMDsgaTw0OyBpKyspIHsKKyAgICAgICAgcmVzLm02NF91MTZbaV0gPSAgKihwdHIpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit1aW50MzJ4Ml90IHZsZDFfZHVwX3UzMihfX3RyYW5zZmVyc2l6ZSgxKSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMzIge2QwW119LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKHVpbnQzMngyX3QgdmxkMV9kdXBfdTMyKF9fdHJhbnNmZXJzaXplKDEpIHVpbnQzMl90IGNvbnN0ICogcHRyKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICB1aW50MzJ4Ml90IHJlczsKKyAgICByZXMubTY0X3UzMlswXSA9ICoocHRyKTsKKyAgICByZXMubTY0X3UzMlsxXSA9ICoocHRyKTsKKyAgICByZXR1cm4gcmVzOworfQorCit1aW50NjR4MV90IHZsZDFfZHVwX3U2NChfX3RyYW5zZmVyc2l6ZSgxKSB1aW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50NjR4MV90IHZsZDFfZHVwX3U2NChfX3RyYW5zZmVyc2l6ZSgxKSB1aW50NjRfdCBjb25zdCAqIHB0cikKK3sKKyAgICB1aW50NjR4MV90IHJlczsKKyAgICByZXMubTY0X3U2NFswXSA9ICoocHRyKTsKKyAgICByZXR1cm4gcmVzOworfQorCitpbnQ4eDhfdCB2bGQxX2R1cF9zOChfX3RyYW5zZmVyc2l6ZSgxKSBpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjgge2QwW119LCBbcjBdCisjZGVmaW5lIHZsZDFfZHVwX3M4KHB0cikgdmxkMV9kdXBfdTgoKHVpbnQ4X3QqKXB0cikKKworCitpbnQxNng0X3QgdmxkMV9kdXBfczE2KF9fdHJhbnNmZXJzaXplKDEpIGludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMFtdfSwgW3IwXQorI2RlZmluZSB2bGQxX2R1cF9zMTYocHRyKSB2bGQxX2R1cF91MTYoKHVpbnQxNl90KilwdHIpCisKKworaW50MzJ4Ml90IHZsZDFfZHVwX3MzMihfX3RyYW5zZmVyc2l6ZSgxKSBpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS4zMiB7ZDBbXX0sIFtyMF0KKyNkZWZpbmUgdmxkMV9kdXBfczMyKHB0cikgdmxkMV9kdXBfdTMyKCh1aW50MzJfdCopcHRyKQorCisKK2ludDY0eDFfdCB2bGQxX2R1cF9zNjQoX190cmFuc2ZlcnNpemUoMSkgaW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwfSwgW3IwXQorI2RlZmluZSB2bGQxX2R1cF9zNjQocHRyKSB2bGQxX2R1cF91NjQoKHVpbnQ2NF90KilwdHIpCisKK2Zsb2F0MTZ4NF90IHZsZDFfZHVwX2YxNihfX3RyYW5zZmVyc2l6ZSgxKSBfX2ZwMTYgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMFtdfSwgW3IwXQorLy9jdXJyZW50IElBIFNJTUQgZG9lc24ndCBzdXBwb3J0IGZsb2F0MTYKKworZmxvYXQzMngyX3QgdmxkMV9kdXBfZjMyKF9fdHJhbnNmZXJzaXplKDEpIGZsb2F0MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuMzIge2QwW119LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZsZDFfZHVwX2YzMihfX3RyYW5zZmVyc2l6ZSgxKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpCit7CisgICAgZmxvYXQzMngyX3QgcmVzOworICAgIHJlcy5tNjRfZjMyWzBdID0gKihwdHIpOworICAgIHJlcy5tNjRfZjMyWzFdID0gcmVzLm02NF9mMzJbMF07CisgICAgcmV0dXJuIHJlczsgLy8gdXNlIGxhc3QgNjRiaXRzIG9ubHkKK30KKworcG9seTh4OF90IHZsZDFfZHVwX3A4KF9fdHJhbnNmZXJzaXplKDEpIHBvbHk4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjgge2QwW119LCBbcjBdCisjZGVmaW5lIHZsZDFfZHVwX3A4IHZsZDFfZHVwX3U4CisKKworcG9seTE2eDRfdCB2bGQxX2R1cF9wMTYoX190cmFuc2ZlcnNpemUoMSkgcG9seTE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjE2IHtkMFtdfSwgW3IwXQorI2RlZmluZSB2bGQxX2R1cF9wMTYgdmxkMV9kdXBfdTE2CisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTdG9yZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIElmIHB0ciBpcyAxNmJpdCBhbGlnbmVkIGFuZCB5b3UgIG5lZWQgdG8gc3RvcmUgZGF0YSB3aXRob3V0IGNhY2hlIHBvbGx1dGlvbiB0aGVuIHVzZSB2b2lkIF9tbV9zdHJlYW1fc2kxMjggKChfX20xMjhpKilwdHIsIHZhbCk7CisvL2hlcmUgd2UgYXNzdW1lIHRoZSBjYXNlIG9mICBOT1QgMTZiaXQgYWxpZ25lZCBwdHIgcG9zc2libGUuIElmIGl0IGlzIGFsaWduZWQgd2UgY291bGQgdG8gdXNlIF9tbV9zdG9yZV9zaTEyOCBsaWtlIHNob3duIGluIHRoZSBmb2xsb3dpbmcgbWFjcm8KKyNkZWZpbmUgU1RPUkVfU0kxMjgocHRyLCB2YWwpIFwKKyAgICAgICAgKCgodW5zaWduZWQgbG9uZykocHRyKSAmIDE1KSA9PSAwICkgPyBfbW1fc3RvcmVfc2kxMjggKChfX20xMjhpKikocHRyKSwgdmFsKSA6IF9tbV9zdG9yZXVfc2kxMjggKChfX20xMjhpKikocHRyKSwgdmFsKTsKKwordm9pZCB2c3QxcV91OChfX3RyYW5zZmVyc2l6ZSgxNikgdWludDhfdCAqIHB0ciwgdWludDh4MTZfdCB2YWwpOyAvLyBWU1QxLjgge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdnN0MXFfdTggU1RPUkVfU0kxMjgKKwordm9pZCB2c3QxcV91MTYoX190cmFuc2ZlcnNpemUoOCkgdWludDE2X3QgKiBwdHIsIHVpbnQxNng4X3QgdmFsKTsgLy8gVlNUMS4xNiB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2c3QxcV91MTYgU1RPUkVfU0kxMjgKKwordm9pZCB2c3QxcV91MzIoX190cmFuc2ZlcnNpemUoNCkgdWludDMyX3QgKiBwdHIsIHVpbnQzMng0X3QgdmFsKTsgLy8gVlNUMS4zMiB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2c3QxcV91MzIgU1RPUkVfU0kxMjgKKwordm9pZCB2c3QxcV91NjQoX190cmFuc2ZlcnNpemUoMikgdWludDY0X3QgKiBwdHIsIHVpbnQ2NHgyX3QgdmFsKTsgLy8gVlNUMS42NCB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2c3QxcV91NjQgU1RPUkVfU0kxMjgKKwordm9pZCB2c3QxcV9zOChfX3RyYW5zZmVyc2l6ZSgxNikgaW50OF90ICogcHRyLCBpbnQ4eDE2X3QgdmFsKTsgLy8gVlNUMS44IHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZzdDFxX3M4IFNUT1JFX1NJMTI4CisKK3ZvaWQgdnN0MXFfczE2KF9fdHJhbnNmZXJzaXplKDgpIGludDE2X3QgKiBwdHIsIGludDE2eDhfdCB2YWwpOyAvLyBWU1QxLjE2IHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZzdDFxX3MxNiBTVE9SRV9TSTEyOAorCit2b2lkIHZzdDFxX3MzMihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQzMl90ICogcHRyLCBpbnQzMng0X3QgdmFsKTsgLy8gVlNUMS4zMiB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2c3QxcV9zMzIgU1RPUkVfU0kxMjgKKwordm9pZCB2c3QxcV9zNjQoX190cmFuc2ZlcnNpemUoMikgaW50NjRfdCAqIHB0ciwgaW50NjR4Ml90IHZhbCk7IC8vIFZTVDEuNjQge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdnN0MXFfczY0IFNUT1JFX1NJMTI4CisKK3ZvaWQgdnN0MXFfZjE2KF9fdHJhbnNmZXJzaXplKDgpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng4X3QgdmFsKTsgLy8gVlNUMS4xNiB7ZDAsIGQxfSwgW3IwXQorLy8gSUEzMiBTSU1EIGRvZXNuJ3Qgd29yayB3aXRoIDE2Yml0IGZsb2F0cyBjdXJyZW50bHkKKwordm9pZCB2c3QxcV9mMzIoX190cmFuc2ZlcnNpemUoNCkgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDRfdCB2YWwpOyAvLyBWU1QxLjMyIHtkMCwgZDF9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0MXFfZjMyKF9fdHJhbnNmZXJzaXplKDQpIGZsb2F0MzJfdCAqIHB0ciwgZmxvYXQzMng0X3QgdmFsKQoreworICAgIGlmKCAoKHVuc2lnbmVkIGxvbmcpKHB0cikgJiAxNSkgID09IDAgKSAvLzE2IGJpdHMgYWxpZ25lZAorICAgICAgICBfbW1fc3RvcmVfcHMgKHB0ciwgdmFsKTsKKyAgICBlbHNlCisgICAgICAgIF9tbV9zdG9yZXVfcHMgKHB0ciwgdmFsKTsKK30KKwordm9pZCB2c3QxcV9wOChfX3RyYW5zZmVyc2l6ZSgxNikgcG9seThfdCAqIHB0ciwgcG9seTh4MTZfdCB2YWwpOyAvLyBWU1QxLjgge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdnN0MXFfcDggIHZzdDFxX3U4CisKK3ZvaWQgdnN0MXFfcDE2KF9fdHJhbnNmZXJzaXplKDgpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4OF90IHZhbCk7IC8vIFZTVDEuMTYge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdnN0MXFfcDE2IHZzdDFxX3UxNgorCit2b2lkIHZzdDFfdTgoX190cmFuc2ZlcnNpemUoOCkgdWludDhfdCAqIHB0ciwgdWludDh4OF90IHZhbCk7IC8vIFZTVDEuOCB7ZDB9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0MV91OChfX3RyYW5zZmVyc2l6ZSg4KSB1aW50OF90ICogcHRyLCB1aW50OHg4X3QgdmFsKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGk8ODsgaSsrKSB7CisgICAgICAgICoocHRyICsgaSkgPSAoKHVpbnQ4X3QqKSZ2YWwpW2ldOworICAgIH0KKyAgICAvL19tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKXB0ciwgdmFsKTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgdnN0MV91MTYoX190cmFuc2ZlcnNpemUoNCkgdWludDE2X3QgKiBwdHIsIHVpbnQxNng0X3QgdmFsKTsgLy8gVlNUMS4xNiB7ZDB9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0MV91MTYoX190cmFuc2ZlcnNpemUoNCkgdWludDE2X3QgKiBwdHIsIHVpbnQxNng0X3QgdmFsKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGk8NDsgaSsrKSB7CisgICAgICAgICoocHRyICsgaSkgPSAoKHVpbnQxNl90KikmdmFsKVtpXTsKKyAgICB9CisgICAgLy9fbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKilwdHIsIHZhbCk7CisgICAgcmV0dXJuOworfQorCit2b2lkIHZzdDFfdTMyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4Ml90IHZhbCk7IC8vIFZTVDEuMzIge2QwfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDFfdTMyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4Ml90IHZhbCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpPDI7IGkrKykgeworICAgICAgICAqKHB0ciArIGkpID0gKCh1aW50MzJfdCopJnZhbClbaV07CisgICAgfQorICAgIC8vX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopcHRyLCB2YWwpOworICAgIHJldHVybjsKK30KKwordm9pZCB2c3QxX3U2NChfX3RyYW5zZmVyc2l6ZSgxKSB1aW50NjRfdCAqIHB0ciwgdWludDY0eDFfdCB2YWwpOyAvLyBWU1QxLjY0IHtkMH0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QxX3U2NChfX3RyYW5zZmVyc2l6ZSgxKSB1aW50NjRfdCAqIHB0ciwgdWludDY0eDFfdCB2YWwpCit7CisgICAgKihwdHIpID0gKigodWludDY0X3QqKSZ2YWwpOworICAgIC8vX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopcHRyLCB2YWwpOworICAgIHJldHVybjsKK30KKwordm9pZCB2c3QxX3M4KF9fdHJhbnNmZXJzaXplKDgpIGludDhfdCAqIHB0ciwgaW50OHg4X3QgdmFsKTsgLy8gVlNUMS44IHtkMH0sIFtyMF0KKyNkZWZpbmUgdnN0MV9zOChwdHIsdmFsKSB2c3QxX3U4KCh1aW50OF90KilwdHIsdmFsKQorCit2b2lkIHZzdDFfczE2KF9fdHJhbnNmZXJzaXplKDQpIGludDE2X3QgKiBwdHIsIGludDE2eDRfdCB2YWwpOyAvLyBWU1QxLjE2IHtkMH0sIFtyMF0KKyNkZWZpbmUgdnN0MV9zMTYocHRyLHZhbCkgdnN0MV91MTYoKHVpbnQxNl90KilwdHIsdmFsKQorCit2b2lkIHZzdDFfczMyKF9fdHJhbnNmZXJzaXplKDIpIGludDMyX3QgKiBwdHIsIGludDMyeDJfdCB2YWwpOyAvLyBWU1QxLjMyIHtkMH0sIFtyMF0KKyNkZWZpbmUgdnN0MV9zMzIocHRyLHZhbCkgdnN0MV91MzIoKHVpbnQzMl90KilwdHIsdmFsKQorCit2b2lkIHZzdDFfczY0KF9fdHJhbnNmZXJzaXplKDEpIGludDY0X3QgKiBwdHIsIGludDY0eDFfdCB2YWwpOyAvLyBWU1QxLjY0IHtkMH0sIFtyMF0KKyNkZWZpbmUgdnN0MV9zNjQocHRyLHZhbCkgdnN0MV91NjQoKHVpbnQ2NF90KilwdHIsdmFsKQorCit2b2lkIHZzdDFfZjE2KF9fdHJhbnNmZXJzaXplKDQpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng0X3QgdmFsKTsgLy8gVlNUMS4xNiB7ZDB9LCBbcjBdCisvL2N1cnJlbnQgSUEgU0lNRCBkb2Vzbid0IHN1cHBvcnQgZmxvYXQxNgorCit2b2lkIHZzdDFfZjMyKF9fdHJhbnNmZXJzaXplKDIpIGZsb2F0MzJfdCAqIHB0ciwgZmxvYXQzMngyX3QgdmFsKTsgLy8gVlNUMS4zMiB7ZDB9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0MV9mMzIoX190cmFuc2ZlcnNpemUoMikgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDJfdCB2YWwpCit7CisgICAgKihwdHIpID0gICB2YWwubTY0X2YzMlswXTsKKyAgICAqKHB0ciArIDEpID0gdmFsLm02NF9mMzJbMV07CisgICAgcmV0dXJuOworfQorCit2b2lkIHZzdDFfcDgoX190cmFuc2ZlcnNpemUoOCkgcG9seThfdCAqIHB0ciwgcG9seTh4OF90IHZhbCk7IC8vIFZTVDEuOCB7ZDB9LCBbcjBdCisjZGVmaW5lIHZzdDFfcDggdnN0MV91OAorCit2b2lkIHZzdDFfcDE2KF9fdHJhbnNmZXJzaXplKDQpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4NF90IHZhbCk7IC8vIFZTVDEuMTYge2QwfSwgW3IwXQorI2RlZmluZSB2c3QxX3AxNiB2c3QxX3UxNgorCisvLyoqKioqKioqKioqU3RvcmUgYSBsYW5lIG9mIGEgdmVjdG9yIGludG8gbWVtb3J5IChleHRyYWN0IGdpdmVuIGxhbmUpICoqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3ZvaWQgdnN0MXFfbGFuZV91OChfX3RyYW5zZmVyc2l6ZSgxKSB1aW50OF90ICogcHRyLCB1aW50OHgxNl90IHZhbCwgX19jb25zdHJhbmdlKDAsMTUpIGludCBsYW5lKTsgLy8gVlNUMS44IHtkMFswXX0sIFtyMF0KKyNkZWZpbmUgdnN0MXFfbGFuZV91OChwdHIsIHZhbCwgbGFuZSkgKihwdHIpID0gX01NX0VYVFJBQ1RfRVBJOCAodmFsLCBsYW5lKQorCit2b2lkIHZzdDFxX2xhbmVfdTE2KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4OF90IHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWU1QxLjE2IHtkMFswXX0sIFtyMF0KKyNkZWZpbmUgdnN0MXFfbGFuZV91MTYocHRyLCB2YWwsIGxhbmUpICoocHRyKSA9IF9NTV9FWFRSQUNUX0VQSTE2ICh2YWwsIGxhbmUpCisKK3ZvaWQgdnN0MXFfbGFuZV91MzIoX190cmFuc2ZlcnNpemUoMSkgdWludDMyX3QgKiBwdHIsIHVpbnQzMng0X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDEuMzIge2QwWzBdfSwgW3IwXQorI2RlZmluZSB2c3QxcV9sYW5lX3UzMihwdHIsIHZhbCwgbGFuZSkgKihwdHIpID0gX01NX0VYVFJBQ1RfRVBJMzIgKHZhbCwgbGFuZSkKKwordm9pZCB2c3QxcV9sYW5lX3U2NChfX3RyYW5zZmVyc2l6ZSgxKSB1aW50NjRfdCAqIHB0ciwgdWludDY0eDJfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVlNUMS42NCB7ZDB9LCBbcjBdCisjZGVmaW5lIHZzdDFxX2xhbmVfdTY0KHB0ciwgdmFsLCBsYW5lKSAqKHB0cikgPSBfTU1fRVhUUkFDVF9FUEk2NCAodmFsLCBsYW5lKQorCit2b2lkIHZzdDFxX2xhbmVfczgoX190cmFuc2ZlcnNpemUoMSkgaW50OF90ICogcHRyLCBpbnQ4eDE2X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGxhbmUpOyAvLyBWU1QxLjgge2QwWzBdfSwgW3IwXQorI2RlZmluZSB2c3QxcV9sYW5lX3M4KHB0ciwgdmFsLCBsYW5lKSAqKHB0cikgPSBfTU1fRVhUUkFDVF9FUEk4ICh2YWwsIGxhbmUpCisKK3ZvaWQgdnN0MXFfbGFuZV9zMTYoX190cmFuc2ZlcnNpemUoMSkgaW50MTZfdCAqIHB0ciwgaW50MTZ4OF90IHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWU1QxLjE2IHtkMFswXX0sIFtyMF0KKyNkZWZpbmUgdnN0MXFfbGFuZV9zMTYocHRyLCB2YWwsIGxhbmUpICoocHRyKSA9IF9NTV9FWFRSQUNUX0VQSTE2ICh2YWwsIGxhbmUpCisKK3ZvaWQgdnN0MXFfbGFuZV9zMzIoX190cmFuc2ZlcnNpemUoMSkgaW50MzJfdCAqIHB0ciwgaW50MzJ4NF90IHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWU1QxLjMyIHtkMFswXX0sIFtyMF0KKyNkZWZpbmUgdnN0MXFfbGFuZV9zMzIocHRyLCB2YWwsIGxhbmUpICoocHRyKSA9IF9NTV9FWFRSQUNUX0VQSTMyICh2YWwsIGxhbmUpCisKK3ZvaWQgdnN0MXFfbGFuZV9zNjQoX190cmFuc2ZlcnNpemUoMSkgaW50NjRfdCAqIHB0ciwgaW50NjR4Ml90IHZhbCwgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWU1QxLjY0IHtkMH0sIFtyMF0KKyNkZWZpbmUgdnN0MXFfbGFuZV9zNjQocHRyLCB2YWwsIGxhbmUpICoocHRyKSA9IF9NTV9FWFRSQUNUX0VQSTY0ICh2YWwsIGxhbmUpCisKK3ZvaWQgdnN0MXFfbGFuZV9mMTYoX190cmFuc2ZlcnNpemUoMSkgX19mcDE2ICogcHRyLCBmbG9hdDE2eDhfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVlNUMS4xNiB7ZDBbMF19LCBbcjBdCisvL2N1cnJlbnQgSUEgU0lNRCBkb2Vzbid0IHN1cHBvcnQgZmxvYXQxNgorCit2b2lkIHZzdDFxX2xhbmVfZjMyKF9fdHJhbnNmZXJzaXplKDEpIGZsb2F0MzJfdCAqIHB0ciwgZmxvYXQzMng0X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDEuMzIge2QwWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDFxX2xhbmVfZjMyKF9fdHJhbnNmZXJzaXplKDEpIGZsb2F0MzJfdCAqIHB0ciwgZmxvYXQzMng0X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkKK3sKKyAgICBpbnQzMl90IGlsYW5lOworICAgIGlsYW5lID0gX01NX0VYVFJBQ1RfUFModmFsLGxhbmUpOworICAgICoocHRyKSA9ICAqKChmbG9hdCopJmlsYW5lKTsKK30KKwordm9pZCB2c3QxcV9sYW5lX3A4KF9fdHJhbnNmZXJzaXplKDEpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDE2X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGxhbmUpOyAvLyBWU1QxLjgge2QwWzBdfSwgW3IwXQorI2RlZmluZSB2c3QxcV9sYW5lX3A4ICAgdnN0MXFfbGFuZV91OAorCit2b2lkIHZzdDFxX2xhbmVfcDE2KF9fdHJhbnNmZXJzaXplKDEpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4OF90IHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWU1QxLjE2IHtkMFswXX0sIFtyMF0KKyNkZWZpbmUgdnN0MXFfbGFuZV9wMTYgICB2c3QxcV9sYW5lX3MxNgorCit2b2lkIHZzdDFfbGFuZV91OChfX3RyYW5zZmVyc2l6ZSgxKSB1aW50OF90ICogcHRyLCB1aW50OHg4X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZTVDEuOCB7ZDBbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0MV9sYW5lX3U4KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDhfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKQoreworICAgICoocHRyKSA9IHZhbC5tNjRfdThbbGFuZV07Cit9CisKK3ZvaWQgdnN0MV9sYW5lX3UxNihfX3RyYW5zZmVyc2l6ZSgxKSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDRfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVlNUMS4xNiB7ZDBbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0MV9sYW5lX3UxNihfX3RyYW5zZmVyc2l6ZSgxKSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDRfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKQoreworICAgICoocHRyKSA9IHZhbC5tNjRfdTE2W2xhbmVdOworfQorCit2b2lkIHZzdDFfbGFuZV91MzIoX190cmFuc2ZlcnNpemUoMSkgdWludDMyX3QgKiBwdHIsIHVpbnQzMngyX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZTVDEuMzIge2QwWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDFfbGFuZV91MzIoX190cmFuc2ZlcnNpemUoMSkgdWludDMyX3QgKiBwdHIsIHVpbnQzMngyX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSkKK3sKKyAgICAqKHB0cikgPSB2YWwubTY0X3UzMltsYW5lXTsKK30KKwordm9pZCB2c3QxX2xhbmVfdTY0KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ2NF90ICogcHRyLCB1aW50NjR4MV90IHZhbCwgX19jb25zdHJhbmdlKDAsMCkgaW50IGxhbmUpOyAvLyBWU1QxLjY0IHtkMH0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QxX2xhbmVfdTY0KF9fdHJhbnNmZXJzaXplKDEpIHVpbnQ2NF90ICogcHRyLCB1aW50NjR4MV90IHZhbCwgX19jb25zdHJhbmdlKDAsMCkgaW50IGxhbmUpCit7CisgICAgKihwdHIpID0gdmFsLm02NF91NjRbMF07Cit9CisKK3ZvaWQgdnN0MV9sYW5lX3M4KF9fdHJhbnNmZXJzaXplKDEpIGludDhfdCAqIHB0ciwgaW50OHg4X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZTVDEuOCB7ZDBbMF19LCBbcjBdCisjZGVmaW5lICB2c3QxX2xhbmVfczgocHRyLCB2YWwsIGxhbmUpIHZzdDFfbGFuZV91OCgodWludDhfdCopcHRyLCB2YWwsIGxhbmUpCisKK3ZvaWQgdnN0MV9sYW5lX3MxNihfX3RyYW5zZmVyc2l6ZSgxKSBpbnQxNl90ICogcHRyLCBpbnQxNng0X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDEuMTYge2QwWzBdfSwgW3IwXQorI2RlZmluZSB2c3QxX2xhbmVfczE2KHB0ciwgdmFsLCBsYW5lKSB2c3QxX2xhbmVfdTE2KCh1aW50MTZfdCopcHRyLCB2YWwsIGxhbmUpCisKK3ZvaWQgdnN0MV9sYW5lX3MzMihfX3RyYW5zZmVyc2l6ZSgxKSBpbnQzMl90ICogcHRyLCBpbnQzMngyX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZTVDEuMzIge2QwWzBdfSwgW3IwXQorI2RlZmluZSB2c3QxX2xhbmVfczMyKHB0ciwgdmFsLCBsYW5lKSAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKXB0ciwgdmFsLCBsYW5lKQorCisKK3ZvaWQgdnN0MV9sYW5lX3M2NChfX3RyYW5zZmVyc2l6ZSgxKSBpbnQ2NF90ICogcHRyLCBpbnQ2NHgxX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgbGFuZSk7IC8vIFZTVDEuNjQge2QwfSwgW3IwXQorI2RlZmluZSB2c3QxX2xhbmVfczY0KHB0ciwgdmFsLCBsYW5lKSB2c3QxX2xhbmVfdTY0KCh1aW50NjRfdCopcHRyLCB2YWwsIGxhbmUpCisKKwordm9pZCB2c3QxX2xhbmVfZjE2KF9fdHJhbnNmZXJzaXplKDEpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng0X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDEuMTYge2QwWzBdfSwgW3IwXQorLy9jdXJyZW50IElBIFNJTUQgZG9lc24ndCBzdXBwb3J0IGZsb2F0MTYKKwordm9pZCB2c3QxX2xhbmVfZjMyKF9fdHJhbnNmZXJzaXplKDEpIGZsb2F0MzJfdCAqIHB0ciwgZmxvYXQzMngyX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZTVDEuMzIge2QwWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDFfbGFuZV9mMzIoX190cmFuc2ZlcnNpemUoMSkgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDJfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKQoreworICAgICoocHRyKSA9IHZhbC5tNjRfZjMyW2xhbmVdOworfQorCit2b2lkIHZzdDFfbGFuZV9wOChfX3RyYW5zZmVyc2l6ZSgxKSBwb2x5OF90ICogcHRyLCBwb2x5OHg4X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZTVDEuOCB7ZDBbMF19LCBbcjBdCisjZGVmaW5lIHZzdDFfbGFuZV9wOCB2c3QxX2xhbmVfdTgKKwordm9pZCB2c3QxX2xhbmVfcDE2KF9fdHJhbnNmZXJzaXplKDEpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4NF90IHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWU1QxLjE2IHtkMFswXX0sIFtyMF0KKyNkZWZpbmUgdnN0MV9sYW5lX3AxNiB2c3QxX2xhbmVfczE2CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKiBMb2FkcyBhbmQgc3RvcmVzIG9mIGFuIE4tZWxlbWVudCBzdHJ1Y3R1cmUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9UaGVzZSBpbnRyaW5zaWNzIGxvYWQgb3Igc3RvcmUgYW4gbi1lbGVtZW50IHN0cnVjdHVyZS4gVGhlIGFycmF5IHN0cnVjdHVyZXMgYXJlIGRlZmluZWQgaW4gdGhlIGJlZ2lubmluZworLy9XZSBhc3N1bWUgcHRyIGlzIE5PVCBhbGlnbmVkIGluIGdlbmVyYWwgY2FzZSwgZm9yIG1vcmUgZGV0YWlscyBzZWUgICJMb2FkcyBhbmQgc3RvcmVzIG9mIGEgc2luZ2xlIHZlY3RvciBmdW5jdGlvbnMiCisvLyoqKioqKioqKioqKioqKioqKiAyIGVsZW1lbnRzIGxvYWQgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgordWludDh4MTZ4Ml90IHZsZDJxX3U4KF9fdHJhbnNmZXJzaXplKDMyKSB1aW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi44IHtkMCwgZDJ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDE2eDJfdCB2bGQycV91OChfX3RyYW5zZmVyc2l6ZSgzMikgdWludDhfdCBjb25zdCAqIHB0cikgLy8gVkxEMi44IHtkMCwgZDJ9LCBbcjBdCit7CisgICAgdWludDh4MTZ4Ml90IHY7CisgICAgdi52YWxbMF0gPSB2bGQxcV91OChwdHIpOworICAgIHYudmFsWzFdID0gdmxkMXFfdTgoKHB0ciArIDE2KSk7CisgICAgdiA9IHZ1enBxX3M4KHYudmFsWzBdLCB2LnZhbFsxXSk7CisgICAgcmV0dXJuIHY7Cit9CisKK3VpbnQxNng4eDJfdCB2bGQycV91MTYoX190cmFuc2ZlcnNpemUoMTYpIHVpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4xNiB7ZDAsIGQyfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OHgyX3QgdmxkMnFfdTE2KF9fdHJhbnNmZXJzaXplKDE2KSB1aW50MTZfdCBjb25zdCAqIHB0cikgLy8gVkxEMi4xNiB7ZDAsIGQyfSwgW3IwXQoreworICAgIHVpbnQxNng4eDJfdCB2OworICAgIHYudmFsWzBdID0gdmxkMXFfdTE2KCBwdHIpOworICAgIHYudmFsWzFdID0gdmxkMXFfdTE2KCAocHRyICsgOCkpOworICAgIHYgPSB2dXpwcV9zMTYodi52YWxbMF0sIHYudmFsWzFdKTsKKyAgICByZXR1cm4gdjsKK30KKwordWludDMyeDR4Ml90IHZsZDJxX3UzMihfX3RyYW5zZmVyc2l6ZSg4KSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMzIge2QwLCBkMn0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDR4Ml90IHZsZDJxX3UzMihfX3RyYW5zZmVyc2l6ZSg4KSB1aW50MzJfdCBjb25zdCAqIHB0cikgLy8gVkxEMi4zMiB7ZDAsIGQyfSwgW3IwXQoreworICAgIHVpbnQzMng0eDJfdCB2OworICAgIHYudmFsWzBdID0gdmxkMXFfdTMyICggcHRyKTsKKyAgICB2LnZhbFsxXSA9IHZsZDFxX3UzMiAoIChwdHIgKyA0KSk7CisgICAgdiA9IHZ1enBxX3MzMih2LnZhbFswXSwgdi52YWxbMV0pOworICAgIHJldHVybiB2OworfQorCitpbnQ4eDE2eDJfdCB2bGQycV9zOChfX3RyYW5zZmVyc2l6ZSgzMikgaW50OF90IGNvbnN0ICogcHRyKTsKKyNkZWZpbmUgIHZsZDJxX3M4KHB0cikgdmxkMnFfdTgoKHVpbnQ4X3QqKSBwdHIpCisKK2ludDE2eDh4Ml90IHZsZDJxX3MxNihfX3RyYW5zZmVyc2l6ZSgxNikgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMTYge2QwLCBkMn0sIFtyMF0KKyNkZWZpbmUgdmxkMnFfczE2KHB0cikgdmxkMnFfdTE2KCh1aW50MTZfdCopIHB0cikKKworaW50MzJ4NHgyX3QgdmxkMnFfczMyKF9fdHJhbnNmZXJzaXplKDgpIGludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjMyIHtkMCwgZDJ9LCBbcjBdCisjZGVmaW5lIHZsZDJxX3MzMihwdHIpIHZsZDJxX3UzMigodWludDMyX3QqKSBwdHIpCisKKworZmxvYXQxNng4eDJfdCB2bGQycV9mMTYoX190cmFuc2ZlcnNpemUoMTYpIF9fZnAxNiBjb25zdCAqIHB0cik7IC8vIFZMRDIuMTYge2QwLCBkMn0sIFtyMF0KKy8vIElBMzIgU0lNRCBkb2Vzbid0IHdvcmsgd2l0aCAxNmJpdCBmbG9hdHMgY3VycmVudGx5LCBzbyBuZWVkIHRvIGdvIHRvIDMyIGJpdCBhbmQgdGhlbiB3b3JrIHdpdGggdHdvIDEyOGJpdCByZWdpc3RlcnMuIFNlZSB2bGQxcV9mMTYgZm9yIGV4YW1wbGUKKworZmxvYXQzMng0eDJfdCB2bGQycV9mMzIoX190cmFuc2ZlcnNpemUoOCkgZmxvYXQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4zMiB7ZDAsIGQyfSwgW3IwXQorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDR4Ml90IHZsZDJxX2YzMihfX3RyYW5zZmVyc2l6ZSg4KSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpIC8vIFZMRDIuMzIge2QwLCBkMn0sIFtyMF0KK3sKKyAgICBmbG9hdDMyeDR4Ml90IHY7CisgICAgdi52YWxbMF0gPSAgdmxkMXFfZjMyIChwdHIpOworICAgIHYudmFsWzFdID0gIHZsZDFxX2YzMiAoKHB0ciArIDQpKTsKKyAgICB2ID0gdnV6cHFfZjMyKHYudmFsWzBdLCB2LnZhbFsxXSk7CisgICAgcmV0dXJuIHY7Cit9CisKK3BvbHk4eDE2eDJfdCB2bGQycV9wOChfX3RyYW5zZmVyc2l6ZSgzMikgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuOCB7ZDAsIGQyfSwgW3IwXQorI2RlZmluZSAgdmxkMnFfcDggdmxkMnFfdTgKKworcG9seTE2eDh4Ml90IHZsZDJxX3AxNihfX3RyYW5zZmVyc2l6ZSgxNikgcG9seTE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjE2IHtkMCwgZDJ9LCBbcjBdCisjZGVmaW5lIHZsZDJxX3AxNiB2bGQycV91MTYKKwordWludDh4OHgyX3QgdmxkMl91OChfX3RyYW5zZmVyc2l6ZSgxNikgdWludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuOCB7ZDAsIGQxfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50OHg4eDJfdCB2bGQyX3U4KF9fdHJhbnNmZXJzaXplKDE2KSB1aW50OF90IGNvbnN0ICogcHRyKQoreworICAgIHVpbnQ4eDh4Ml90IHY7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrOF9ldmVuX29kZFsxNl0gPSB7IDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDEsIDMsIDUsIDcsIDksIDExLCAxMywgMTV9OworICAgIF9fbTEyOGkgbGQxMjg7CisgICAgbGQxMjggPSB2bGQxcV91OChwdHIpOyAvL21lcmdlIHR3byA2NC1iaXRzIGluIDEyOCBiaXQKKyAgICBsZDEyOCA9ICBfbW1fc2h1ZmZsZV9lcGk4KGxkMTI4LCAqKF9fbTEyOGkqKW1hc2s4X2V2ZW5fb2RkKTsKKyAgICB2c3QxcV91OCgodi52YWwpLCBsZDEyOCk7IC8vICB2LnZhbFsxXSA9IF9tbV9zaHVmZmxlX2VwaTMyKHYudmFsWzBdLCBfU1dBUF9ISV9MT1czMik7CisgICAgcmV0dXJuIHY7Cit9CisKK3VpbnQxNng0eDJfdCB2bGQyX3UxNihfX3RyYW5zZmVyc2l6ZSg4KSB1aW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMTYge2QwLCBkMX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDR4Ml90IHZsZDJfdTE2KF9fdHJhbnNmZXJzaXplKDgpIHVpbnQxNl90IGNvbnN0ICogcHRyKQoreworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50MTZ4NHgyX3QgdjsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2sxNl9ldmVuX29kZFsxNl0gPSB7IDAsMSwgNCw1LCA4LDksIDEyLDEzLCAyLDMsIDYsNywgMTAsMTEsIDE0LDE1fTsKKyAgICBfX20xMjhpIGxkMTI4OworICAgIGxkMTI4ID0gdmxkMXFfdTE2KHB0cik7IC8vbWVyZ2UgdHdvIDY0LWJpdHMgaW4gMTI4IGJpdAorICAgIGxkMTI4ID0gX21tX3NodWZmbGVfZXBpOChsZDEyOCwgKihfX20xMjhpKiltYXNrMTZfZXZlbl9vZGQpOworICAgIHZzdDFxX3UxNigodi52YWwpLCBsZDEyOCk7CisgICAgcmV0dXJuIHY7Cit9CisKK3VpbnQzMngyeDJfdCB2bGQyX3UzMihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMzIge2QwLCBkMX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJ4Ml90IHZsZDJfdTMyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQzMl90IGNvbnN0ICogcHRyKQoreworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50MzJ4MngyX3QgdjsKKyAgICBfX20xMjhpIGxkMTI4OworICAgIGxkMTI4ID0gdmxkMXFfdTMyKHB0cik7IC8vbWVyZ2UgdHdvIDY0LWJpdHMgaW4gMTI4IGJpdAorICAgIGxkMTI4ID0gX21tX3NodWZmbGVfZXBpMzIobGQxMjgsICAwIHwgKDIgPDwgMikgfCAoMSA8PCA0KSB8ICgzIDw8IDYpKTsKKyAgICB2c3QxcV91MzIoKHYudmFsKSwgbGQxMjgpOworICAgIHJldHVybiB2OworfQorCit1aW50NjR4MXgyX3QgdmxkMl91NjQoX190cmFuc2ZlcnNpemUoMikgdWludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMCwgZDF9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgxeDJfdCB2bGQyX3U2NChfX3RyYW5zZmVyc2l6ZSgyKSB1aW50NjRfdCBjb25zdCAqIHB0cikKK3sKKyAgICB1aW50NjR4MXgyX3QgdjsKKyAgICB2LnZhbFswXS5tNjRfdTY0WzBdID0gKihwdHIpOworICAgIHYudmFsWzFdLm02NF91NjRbMF0gPSAqKHB0ciArIDEpOworICAgIHJldHVybiB2OworfQorCitpbnQ4eDh4Ml90IHZsZDJfczgoX190cmFuc2ZlcnNpemUoMTYpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuOCB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2bGQyX3M4KHB0cikgdmxkMl91OCgodWludDhfdCopcHRyKQorCitpbnQxNng0eDJfdCB2bGQyX3MxNihfX3RyYW5zZmVyc2l6ZSg4KSBpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4xNiB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2bGQyX3MxNihwdHIpIHZsZDJfdTE2KCh1aW50MTZfdCopcHRyKQorCitpbnQzMngyeDJfdCB2bGQyX3MzMihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4zMiB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2bGQyX3MzMihwdHIpIHZsZDJfdTMyKCh1aW50MzJfdCopcHRyKQorCitpbnQ2NHgxeDJfdCB2bGQyX3M2NChfX3RyYW5zZmVyc2l6ZSgyKSBpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDAsIGQxfSwgW3IwXQorI2RlZmluZSB2bGQyX3M2NChwdHIpIHZsZDJfdTY0KCh1aW50NjRfdCopcHRyKQorCitmbG9hdDE2eDR4Ml90IHZsZDJfZjE2KF9fdHJhbnNmZXJzaXplKDgpIF9fZnAxNiBjb25zdCAqIHB0cik7IC8vIFZMRDIuMTYge2QwLCBkMX0sIFtyMF0KKy8vIElBMzIgU0lNRCBkb2Vzbid0IHdvcmsgd2l0aCAxNmJpdCBmbG9hdHMgY3VycmVudGx5LCBzbyBuZWVkIHRvIGdvIHRvIDMyIGJpdCBhbmQgdGhlbiB3b3JrIHdpdGggdHdvIDEyOGJpdCByZWdpc3RlcnMuIFNlZSB2bGQxX2YxNiBmb3IgZXhhbXBsZQorCitmbG9hdDMyeDJ4Ml90IHZsZDJfZjMyKF9fdHJhbnNmZXJzaXplKDQpIGZsb2F0MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMzIge2QwLCBkMX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyeDJfdCB2bGQyX2YzMihfX3RyYW5zZmVyc2l6ZSg0KSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpCit7CisgICAgZmxvYXQzMngyeDJfdCB2OworICAgIHYudmFsWzBdLm02NF9mMzJbMF0gPSAqKHB0cik7CisgICAgdi52YWxbMF0ubTY0X2YzMlsxXSA9ICoocHRyICsgMik7CisgICAgdi52YWxbMV0ubTY0X2YzMlswXSA9ICoocHRyICsgMSk7CisgICAgdi52YWxbMV0ubTY0X2YzMlsxXSA9ICoocHRyICsgMyk7CisgICAgcmV0dXJuIHY7Cit9CisKK3BvbHk4eDh4Ml90IHZsZDJfcDgoX190cmFuc2ZlcnNpemUoMTYpIHBvbHk4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjgge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdmxkMl9wOCB2bGQyX3U4CisKK3BvbHkxNng0eDJfdCB2bGQyX3AxNihfX3RyYW5zZmVyc2l6ZSg4KSBwb2x5MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMTYge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdmxkMl9wMTYgdmxkMl91MTYKKworLy8qKioqKioqKioqKioqKioqKioqKiBUcmlwbGV0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCit1aW50OHgxNngzX3QgdmxkM3FfdTgoX190cmFuc2ZlcnNpemUoNDgpIHVpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjgge2QwLCBkMiwgZDR9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDE2eDNfdCB2bGQzcV91OChfX3RyYW5zZmVyc2l6ZSg0OCkgdWludDhfdCBjb25zdCAqIHB0cikgLy8gVkxEMy44IHtkMCwgZDIsIGQ0fSwgW3IwXQoreworICAgIC8vYTAsYTEsYTIsYTMsLi4uYTcsYTgsLi4uYTE1LCAgYjAsYjEsYjIsLi4uYjcsYjgsLi4uYjE1LCBjMCxjMSxjMiwuLi5jNyxjOCwuLi5jMTUgLT4KKyAgICAvL2E6MCwzLDYsOSwxMiwxNSxiOjIsNSw4LDExLDE0LCAgYzoxLDQsNywxMCwxMworICAgIC8vYToxLDQsNywxMCwxMywgIGI6MCwzLDYsOSwxMiwxNSxjOjIsNSw4LDExLDE0LAorICAgIC8vYToyLDUsOCwxMSwxNCwgIGI6MSw0LDcsMTAsMTMsICBjOjAsMyw2LDksMTIsMTUKKyAgICB1aW50OHgxNngzX3QgdjsKKyAgICBfX20xMjhpIHRtcDAsIHRtcDEsdG1wMiwgdG1wMzsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s4XzBbMTZdID0gezAsMyw2LDksMTIsMTUsMSw0LDcsMTAsMTMsMiw1LDgsMTEsMTR9OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazhfMVsxNl0gPSB7Miw1LDgsMTEsMTQsMCwzLDYsOSwxMiwxNSwxLDQsNywxMCwxM307CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrOF8yWzE2XSA9IHsxLDQsNywxMCwxMywyLDUsOCwxMSwxNCwwLDMsNiw5LDEyLDE1fTsKKworICAgIHYudmFsWzBdID0gIHZsZDFxX3U4IChwdHIpOyAvL2EwLGExLGEyLGEzLC4uLmE3LCAuLi5hMTUKKyAgICB2LnZhbFsxXSA9ICB2bGQxcV91OCAoKHB0ciArIDE2KSk7IC8vYjAsYjEsYjIsYjMuLi5iNywgLi4uYjE1CisgICAgdi52YWxbMl0gPSAgdmxkMXFfdTggKChwdHIgKyAzMikpOyAvL2MwLGMxLGMyLGMzLC4uLmM3LC4uLmMxNQorCisgICAgdG1wMCA9IF9tbV9zaHVmZmxlX2VwaTgodi52YWxbMF0sICooX19tMTI4aSopbWFzazhfMCk7IC8vYTowLDMsNiw5LDEyLDE1LDEsNCw3LDEwLDEzLDIsNSw4LDExCisgICAgdG1wMSA9IF9tbV9zaHVmZmxlX2VwaTgodi52YWxbMV0sICooX19tMTI4aSopbWFzazhfMSk7IC8vYjoyLDUsOCwxMSwxNCwwLDMsNiw5LDEyLDE1LDEsNCw3LDEwLDEzCisgICAgdG1wMiA9IF9tbV9zaHVmZmxlX2VwaTgodi52YWxbMl0sICooX19tMTI4aSopbWFzazhfMik7IC8vYzoxLDQsNywxMCwxMywyLDUsOCwxMSwxNCwzLDYsOSwxMiwxNQorCisgICAgdG1wMyA9IF9tbV9zbGxpX3NpMTI4KHRtcDAsMTApOyAvLzAsMCwwLDAsMCwwLDAsMCwwLDAsYTAsYTMsYTYsYTksYTEyLGExNQorICAgIHRtcDMgPSBfbW1fYWxpZ25yX2VwaTgodG1wMSx0bXAzLCAxMCk7IC8vYTowLDMsNiw5LDEyLDE1LGI6Miw1LDgsMTEsMTQseCx4LHgseCx4CisgICAgdG1wMyA9IF9tbV9zbGxpX3NpMTI4KHRtcDMsIDUpOyAvLzAsMCwwLDAsMCxhOjAsMyw2LDksMTIsMTUsYjoyLDUsOCwxMSwxNCwKKyAgICB0bXAzID0gX21tX3NybGlfc2kxMjgodG1wMywgNSk7IC8vYTowLDMsNiw5LDEyLDE1LGI6Miw1LDgsMTEsMTQsOjAsMCwwLDAsMAorICAgIHYudmFsWzBdID0gX21tX3NsbGlfc2kxMjgodG1wMiwgMTEpOyAvLzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAxLDQsNywxMCwxMywKKyAgICB2LnZhbFswXSA9IF9tbV9vcl9zaTEyOCh2LnZhbFswXSx0bXAzKTsgLy9hOjAsMyw2LDksMTIsMTUsYjoyLDUsOCwxMSwxNCxjOjEsNCw3LDEwLDEzLAorCisgICAgdG1wMyA9IF9tbV9zbGxpX3NpMTI4KHRtcDAsIDUpOyAvLzAsMCwwLDAsMCxhOjAsMyw2LDksMTIsMTUsMSw0LDcsMTAsMTMsCisgICAgdG1wMyA9IF9tbV9zcmxpX3NpMTI4KHRtcDMsIDExKTsgLy9hOjEsNCw3LDEwLDEzLCAwLDAsMCwwLDAsMCwwLDAsMCwwLDAKKyAgICB2LnZhbFsxXSA9IF9tbV9zcmxpX3NpMTI4KHRtcDEsNSk7IC8vYjowLDMsNiw5LDEyLDE1LEM6MSw0LDcsMTAsMTMsIDAsMCwwLDAsMAorICAgIHYudmFsWzFdID0gX21tX3NsbGlfc2kxMjgodi52YWxbMV0sIDUpOyAvLzAsMCwwLDAsMCxiOjAsMyw2LDksMTIsMTUsQzoxLDQsNywxMCwxMywKKyAgICB2LnZhbFsxXSA9IF9tbV9vcl9zaTEyOCh2LnZhbFsxXSx0bXAzKTsgLy9hOjEsNCw3LDEwLDEzLGI6MCwzLDYsOSwxMiwxNSxDOjEsNCw3LDEwLDEzLAorICAgIHYudmFsWzFdID0gIF9tbV9zbGxpX3NpMTI4KHYudmFsWzFdLDUpOyAvLzAsMCwwLDAsMCxhOjEsNCw3LDEwLDEzLGI6MCwzLDYsOSwxMiwxNSwKKyAgICB2LnZhbFsxXSA9IF9tbV9zcmxpX3NpMTI4KHYudmFsWzFdLCA1KTsgLy9hOjEsNCw3LDEwLDEzLGI6MCwzLDYsOSwxMiwxNSwwLDAsMCwwLDAKKyAgICB0bXAzID0gX21tX3NybGlfc2kxMjgodG1wMiw1KTsgLy9jOjIsNSw4LDExLDE0LDAsMyw2LDksMTIsMTUsMCwwLDAsMCwwCisgICAgdG1wMyA9IF9tbV9zbGxpX3NpMTI4KHRtcDMsMTEpOyAvLzAsMCwwLDAsMCwwLDAsMCwwLDAsMCxjOjIsNSw4LDExLDE0LAorICAgIHYudmFsWzFdID0gX21tX29yX3NpMTI4KHYudmFsWzFdLHRtcDMpOyAvL2E6MSw0LDcsMTAsMTMsYjowLDMsNiw5LDEyLDE1LGM6Miw1LDgsMTEsMTQsCisKKyAgICB0bXAzID0gX21tX3NybGlfc2kxMjgodG1wMiwxMCk7IC8vYzowLDMsNiw5LDEyLDE1LCAwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIHRtcDMgPSBfbW1fc2xsaV9zaTEyOCh0bXAzLDEwKTsgLy8wLDAsMCwwLDAsMCwwLDAsMCwwLCBjOjAsMyw2LDksMTIsMTUsCisgICAgdi52YWxbMl0gPSBfbW1fc3JsaV9zaTEyOCh0bXAxLDExKTsgLy9iOjEsNCw3LDEwLDEzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMAorICAgIHYudmFsWzJdID0gX21tX3NsbGlfc2kxMjgodi52YWxbMl0sNSk7IC8vMCwwLDAsMCwwLGI6MSw0LDcsMTAsMTMsIDAsMCwwLDAsMCwwCisgICAgdi52YWxbMl0gPSBfbW1fb3Jfc2kxMjgodi52YWxbMl0sdG1wMyk7IC8vMCwwLDAsMCwwLGI6MSw0LDcsMTAsMTMsYzowLDMsNiw5LDEyLDE1LAorICAgIHRtcDAgPSBfbW1fc3JsaV9zaTEyOCh0bXAwLCAxMSk7IC8vYToyLDUsOCwxMSwxNCwgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIHYudmFsWzJdID0gX21tX29yX3NpMTI4KHYudmFsWzJdLHRtcDApOyAvL2E6Miw1LDgsMTEsMTQsYjoxLDQsNywxMCwxMyxjOjAsMyw2LDksMTIsMTUsCisgICAgcmV0dXJuIHY7Cit9CisKK3VpbnQxNng4eDNfdCB2bGQzcV91MTYoX190cmFuc2ZlcnNpemUoMjQpIHVpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4xNiB7ZDAsIGQyLCBkNH0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDh4M190IHZsZDNxX3UxNihfX3RyYW5zZmVyc2l6ZSgyNCkgdWludDE2X3QgY29uc3QgKiBwdHIpIC8vIFZMRDMuMTYge2QwLCBkMiwgZDR9LCBbcjBdCit7CisgICAgLy9hMCwgYTEsYTIsYTMsLi4uYTcsICBiMCxiMSxiMixiMywuLi5iNywgYzAsYzEsYzIsYzMuLi5jNyAtPiBhMCxhMyxhNixiMSxiNCxiNyxjMixjNSwgYTEsYTQsYTcsYjIsYjUsYzAsYzMsYzYsIGEyLGE1LGIwLGIzLGI2LGMxLGM0LGM3CisgICAgdWludDE2eDh4M190IHY7CisgICAgX19tMTI4aSB0bXAwLCB0bXAxLHRtcDIsIHRtcDM7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrMTZfMFsxNl0gPSB7MCwxLCA2LDcsIDEyLDEzLCAyLDMsIDgsOSwgMTQsMTUsIDQsNSwgMTAsMTF9OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazE2XzFbMTZdID0gezIsMywgOCw5LCAxNCwxNSwgNCw1LCAxMCwxMSwgMCwxLCA2LDcsIDEyLDEzfTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2sxNl8yWzE2XSA9IHs0LDUsIDEwLDExLCAwLDEsIDYsNywgMTIsMTMsIDIsMywgOCw5LCAxNCwxNX07CisKKyAgICB2LnZhbFswXSA9ICB2bGQxcV91MTYgKHB0cik7IC8vYTAsYTEsYTIsYTMsLi4uYTcsCisgICAgdi52YWxbMV0gPSAgdmxkMXFfdTE2ICgocHRyICsgOCkpOyAvL2IwLGIxLGIyLGIzLi4uYjcKKyAgICB2LnZhbFsyXSA9ICB2bGQxcV91MTYgKChwdHIgKyAxNikpOyAvL2MwLGMxLGMyLGMzLC4uLmM3CisKKyAgICB0bXAwID0gX21tX3NodWZmbGVfZXBpOCh2LnZhbFswXSwgKihfX20xMjhpKiltYXNrMTZfMCk7IC8vYTAsYTMsYTYsYTEsYTQsYTcsYTIsYTUsCisgICAgdG1wMSA9IF9tbV9zaHVmZmxlX2VwaTgodi52YWxbMV0sICooX19tMTI4aSopbWFzazE2XzEpOyAvL2IxLGI0LGI3LGIyLGI1LGIwLGIzLGI2CisgICAgdG1wMiA9IF9tbV9zaHVmZmxlX2VwaTgodi52YWxbMl0sICooX19tMTI4aSopbWFzazE2XzIpOyAvL2MyLGM1LCBjMCxjMyxjNiwgYzEsYzQsYzcKKworICAgIHRtcDMgPSBfbW1fc2xsaV9zaTEyOCh0bXAwLDEwKTsgLy8wLDAsMCwwLDAsYTAsYTMsYTYsCisgICAgdG1wMyA9IF9tbV9hbGlnbnJfZXBpOCh0bXAxLHRtcDMsIDEwKTsgLy9hMCxhMyxhNixiMSxiNCxiNyx4LHgKKyAgICB0bXAzID0gX21tX3NsbGlfc2kxMjgodG1wMywgNCk7IC8vMCwwLCBhMCxhMyxhNixiMSxiNCxiNworICAgIHRtcDMgPSBfbW1fc3JsaV9zaTEyOCh0bXAzLCA0KTsgLy9hMCxhMyxhNixiMSxiNCxiNywwLDAKKyAgICB2LnZhbFswXSA9IF9tbV9zbGxpX3NpMTI4KHRtcDIsIDEyKTsgLy8wLDAsMCwwLDAsMCwgYzIsYzUsCisgICAgdi52YWxbMF0gPSBfbW1fb3Jfc2kxMjgodi52YWxbMF0sdG1wMyk7IC8vYTAsYTMsYTYsYjEsYjQsYjcsYzIsYzUKKworICAgIHRtcDMgPSBfbW1fc2xsaV9zaTEyOCh0bXAwLCA0KTsgLy8wLDAsYTAsYTMsYTYsYTEsYTQsYTcKKyAgICB0bXAzID0gX21tX3NybGlfc2kxMjgodG1wMywxMCk7IC8vYTEsYTQsYTcsIDAsMCwwLDAsMAorICAgIHYudmFsWzFdID0gX21tX3NybGlfc2kxMjgodG1wMSw2KTsgLy9iMixiNSxiMCxiMyxiNiwwLDAKKyAgICB2LnZhbFsxXSA9IF9tbV9zbGxpX3NpMTI4KHYudmFsWzFdLCA2KTsgLy8wLDAsMCxiMixiNSxiMCxiMyxiNiwKKyAgICB2LnZhbFsxXSA9IF9tbV9vcl9zaTEyOCh2LnZhbFsxXSx0bXAzKTsgLy9hMSxhNCxhNyxiMixiNSxiMCxiMyxiNiwKKyAgICB2LnZhbFsxXSA9ICBfbW1fc2xsaV9zaTEyOCh2LnZhbFsxXSw2KTsgLy8wLDAsMCxhMSxhNCxhNyxiMixiNSwKKyAgICB2LnZhbFsxXSA9IF9tbV9zcmxpX3NpMTI4KHYudmFsWzFdLCA2KTsgLy9hMSxhNCxhNyxiMixiNSwwLDAsMCwKKyAgICB0bXAzID0gX21tX3NybGlfc2kxMjgodG1wMiw0KTsgLy9jMCxjMyxjNiwgYzEsYzQsYzcsMCwwCisgICAgdG1wMyA9IF9tbV9zbGxpX3NpMTI4KHRtcDMsMTApOyAvLzAsMCwwLDAsMCxjMCxjMyxjNiwKKyAgICB2LnZhbFsxXSA9IF9tbV9vcl9zaTEyOCh2LnZhbFsxXSx0bXAzKTsgLy9hMSxhNCxhNyxiMixiNSxjMCxjMyxjNiwKKworICAgIHRtcDMgPSBfbW1fc3JsaV9zaTEyOCh0bXAyLDEwKTsgLy9jMSxjNCxjNywgMCwwLDAsMCwwCisgICAgdG1wMyA9IF9tbV9zbGxpX3NpMTI4KHRtcDMsMTApOyAvLzAsMCwwLDAsMCwgYzEsYzQsYzcsCisgICAgdi52YWxbMl0gPSBfbW1fc3JsaV9zaTEyOCh0bXAxLDEwKTsgLy9iMCxiMyxiNiwwLDAsIDAsMCwwCisgICAgdi52YWxbMl0gPSBfbW1fc2xsaV9zaTEyOCh2LnZhbFsyXSw0KTsgLy8wLDAsIGIwLGIzLGI2LDAsMCwwCisgICAgdi52YWxbMl0gPSBfbW1fb3Jfc2kxMjgodi52YWxbMl0sdG1wMyk7IC8vMCwwLCBiMCxiMyxiNixjMSxjNCxjNywKKyAgICB0bXAwID0gX21tX3NybGlfc2kxMjgodG1wMCwgMTIpOyAvL2EyLGE1LDAsMCwwLDAsMCwwCisgICAgdi52YWxbMl0gPSBfbW1fb3Jfc2kxMjgodi52YWxbMl0sdG1wMCk7IC8vYTIsYTUsYjAsYjMsYjYsYzEsYzQsYzcsCisgICAgcmV0dXJuIHY7Cit9CisKK3VpbnQzMng0eDNfdCB2bGQzcV91MzIoX190cmFuc2ZlcnNpemUoMTIpIHVpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4zMiB7ZDAsIGQyLCBkNH0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDR4M190IHZsZDNxX3UzMihfX3RyYW5zZmVyc2l6ZSgxMikgdWludDMyX3QgY29uc3QgKiBwdHIpIC8vIFZMRDMuMzIge2QwLCBkMiwgZDR9LCBbcjBdCit7CisgICAgLy9hMCxhMSxhMixhMywgIGIwLGIxLGIyLGIzLCBjMCxjMSxjMixjMyAtPiBhMCxhMyxiMixjMSwgIGExLGIwLGIzLGMyLCBhMixiMSxjMCxjMywKKyAgICB1aW50MzJ4NHgzX3QgdjsKKyAgICBfX20xMjhpIHRtcDAsIHRtcDEsdG1wMiwgdG1wMzsKKyAgICB2LnZhbFswXSA9ICB2bGQxcV91MzIgKHB0cik7IC8vYTAsYTEsYTIsYTMsCisgICAgdi52YWxbMV0gPSAgdmxkMXFfdTMyICgocHRyICsgNCkpOyAvL2IwLGIxLGIyLGIzCisgICAgdi52YWxbMl0gPSAgdmxkMXFfdTMyICgocHRyICsgOCkpOyAvL2MwLGMxLGMyLGMzLAorCisgICAgdG1wMCA9IF9tbV9zaHVmZmxlX2VwaTMyKHYudmFsWzBdLCAwIHwgKDMgPDwgMikgfCAoMSA8PCA0KSB8ICgyIDw8IDYpKTsgLy9hMCxhMyxhMSxhMgorICAgIHRtcDEgPSBfbW1fc2h1ZmZsZV9lcGkzMih2LnZhbFsxXSwgX1NXQVBfSElfTE9XMzIpOyAvL2IyLGIzLGIwLGIxCisgICAgdG1wMiA9IF9tbV9zaHVmZmxlX2VwaTMyKHYudmFsWzJdLCAxIHwgKDIgPDwgMikgfCAoMCA8PCA0KSB8ICgzIDw8IDYpKTsgLy9jMSxjMiwgYzAsYzMKKworICAgIHRtcDMgPSBfbW1fdW5wYWNrbG9fZXBpMzIodG1wMSwgdG1wMik7IC8vYjIsYzEsIGIzLGMyCisgICAgdi52YWxbMF0gPSBfbW1fdW5wYWNrbG9fZXBpNjQodG1wMCx0bXAzKTsgLy9hMCxhMyxiMixjMQorICAgIHRtcDAgPSBfbW1fdW5wYWNraGlfZXBpMzIodG1wMCwgdG1wMSk7IC8vYTEsYjAsIGEyLGIxCisgICAgdi52YWxbMV0gPSBfbW1fc2h1ZmZsZV9lcGkzMih0bXAwLCBfU1dBUF9ISV9MT1czMiApOyAvL2EyLGIxLCBhMSxiMCwKKyAgICB2LnZhbFsxXSA9IF9tbV91bnBhY2toaV9lcGk2NCh2LnZhbFsxXSwgdG1wMyk7IC8vYTEsYjAsIGIzLGMyCisgICAgdi52YWxbMl0gPSBfbW1fdW5wYWNraGlfZXBpNjQodG1wMCwgdG1wMik7IC8vYTIsYjEsIGMwLGMzCisgICAgcmV0dXJuIHY7Cit9CisKK2ludDh4MTZ4M190IHZsZDNxX3M4KF9fdHJhbnNmZXJzaXplKDQ4KSBpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjgge2QwLCBkMiwgZDR9LCBbcjBdCisjZGVmaW5lICB2bGQzcV9zOChwdHIpIHZsZDNxX3U4KCh1aW50OF90KikgKHB0cikpCisKK2ludDE2eDh4M190IHZsZDNxX3MxNihfX3RyYW5zZmVyc2l6ZSgyNCkgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMTYge2QwLCBkMiwgZDR9LCBbcjBdCisjZGVmaW5lICB2bGQzcV9zMTYocHRyKSB2bGQzcV91MTYoKHVpbnQxNl90KikgKHB0cikpCisKK2ludDMyeDR4M190IHZsZDNxX3MzMihfX3RyYW5zZmVyc2l6ZSgxMikgaW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMzIge2QwLCBkMiwgZDR9LCBbcjBdCisjZGVmaW5lICB2bGQzcV9zMzIocHRyKSB2bGQzcV91MzIoKHVpbnQzMl90KikgKHB0cikpCisKK2Zsb2F0MTZ4OHgzX3QgdmxkM3FfZjE2KF9fdHJhbnNmZXJzaXplKDI0KSBfX2ZwMTYgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjE2IHtkMCwgZDIsIGQ0fSwgW3IwXQorLy8gSUEzMiBTSU1EIGRvZXNuJ3Qgd29yayB3aXRoIDE2Yml0IGZsb2F0cyBjdXJyZW50bHksIHNvIG5lZWQgdG8gZ28gdG8gMzIgYml0IGFuZCB0aGVuIHdvcmsgd2l0aCB0d28gMTI4Yml0IHJlZ2lzdGVycy4gU2VlIHZsZDFxX2YxNiBmb3IgZXhhbXBsZQorCitmbG9hdDMyeDR4M190IHZsZDNxX2YzMihfX3RyYW5zZmVyc2l6ZSgxMikgZmxvYXQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4zMiB7ZDAsIGQyLCBkNH0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMng0eDNfdCB2bGQzcV9mMzIoX190cmFuc2ZlcnNpemUoMTIpIGZsb2F0MzJfdCBjb25zdCAqIHB0cikgLy8gVkxEMy4zMiB7ZDAsIGQyLCBkNH0sIFtyMF0KK3sKKyAgICAvL2EwLGExLGEyLGEzLCAgYjAsYjEsYjIsYjMsIGMwLGMxLGMyLGMzIC0+IGEwLGEzLGIyLGMxLCAgYTEsYjAsYjMsYzIsIGEyLGIxLGMwLGMzLAorICAgIGZsb2F0MzJ4NHgzX3QgdjsKKyAgICBfX20xMjggdG1wMCwgdG1wMSx0bXAyLCB0bXAzOworICAgIHYudmFsWzBdID0gIHZsZDFxX2YzMiAocHRyKTsgLy9hMCxhMSxhMixhMywKKyAgICB2LnZhbFsxXSA9ICB2bGQxcV9mMzIgKChwdHIgKyA0KSk7IC8vYjAsYjEsYjIsYjMKKyAgICB2LnZhbFsyXSA9ICB2bGQxcV9mMzIgKChwdHIgKyA4KSk7IC8vYzAsYzEsYzIsYzMsCisKKyAgICB0bXAwID0gX21tX2Nhc3RzaTEyOF9wcyhfbW1fc2h1ZmZsZV9lcGkzMihfbW1fY2FzdHBzX3NpMTI4KHYudmFsWzBdKSwgMCB8ICgzIDw8IDIpIHwgKDEgPDwgNCkgfCAoMiA8PCA2KSkpOyAvL2EwLGEzLGExLGEyCisgICAgdG1wMSA9IF9tbV9jYXN0c2kxMjhfcHMoX21tX3NodWZmbGVfZXBpMzIoX21tX2Nhc3Rwc19zaTEyOCh2LnZhbFsxXSksIF9TV0FQX0hJX0xPVzMyKSk7IC8vYjIsYjMsYjAsYjEKKyAgICB0bXAyID0gX21tX2Nhc3RzaTEyOF9wcyhfbW1fc2h1ZmZsZV9lcGkzMihfbW1fY2FzdHBzX3NpMTI4KHYudmFsWzJdKSwgMSB8ICgyIDw8IDIpIHwgKDAgPDwgNCkgfCAoMyA8PCA2KSkpOyAvL2MxLGMyLCBjMCxjMworICAgIHRtcDMgPSBfbW1fdW5wYWNrbG9fcHModG1wMSwgdG1wMik7IC8vYjIsYzEsIGIzLGMyCisKKyAgICB2LnZhbFswXSA9IF9tbV9tb3ZlbGhfcHModG1wMCx0bXAzKTsgLy9hMCxhMyxiMixjMQorICAgIHRtcDAgPSBfbW1fdW5wYWNraGlfcHModG1wMCwgdG1wMSk7IC8vYTEsYjAsIGEyLGIxCisgICAgdi52YWxbMV0gPSBfbW1fY2FzdHNpMTI4X3BzKF9tbV9zaHVmZmxlX2VwaTMyKF9tbV9jYXN0cHNfc2kxMjgodG1wMCksIF9TV0FQX0hJX0xPVzMyICkpOyAvL2EyLGIxLCBhMSxiMCwKKyAgICB2LnZhbFsxXSA9IF9tbV9tb3ZlaGxfcHModG1wMyx2LnZhbFsxXSk7IC8vYTEsYjAsIGIzLGMyCisgICAgdi52YWxbMl0gPSBfbW1fbW92ZWhsX3BzKHRtcDIsdG1wMCk7IC8vYTIsYjEsIGMwLGMzCisgICAgcmV0dXJuIHY7Cit9CisKK3BvbHk4eDE2eDNfdCB2bGQzcV9wOChfX3RyYW5zZmVyc2l6ZSg0OCkgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuOCB7ZDAsIGQyLCBkNH0sIFtyMF0KKyNkZWZpbmUgdmxkM3FfcDggdmxkM3FfdTgKKworcG9seTE2eDh4M190IHZsZDNxX3AxNihfX3RyYW5zZmVyc2l6ZSgyNCkgcG9seTE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjE2IHtkMCwgZDIsIGQ0fSwgW3IwXQorI2RlZmluZSB2bGQzcV9wMTYgdmxkM3FfdTE2CisKK3VpbnQ4eDh4M190IHZsZDNfdTgoX190cmFuc2ZlcnNpemUoMjQpIHVpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjgge2QwLCBkMSwgZDJ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDh4M190IHZsZDNfdTgoX190cmFuc2ZlcnNpemUoMjQpIHVpbnQ4X3QgY29uc3QgKiBwdHIpIC8vIFZMRDMuOCB7ZDAsIGQxLCBkMn0sIFtyMF0KK3sKKyAgICAvL2EwLCBhMSxhMixhMywuLi5hNywgIGIwLGIxLGIyLGIzLC4uLmI3LCBjMCxjMSxjMixjMy4uLmM3IC0+IGEwLGEzLGE2LGIxLGI0LGI3LGMyLGM1LCBhMSxhNCxhNyxiMixiNSxjMCxjMyxjNiwgYTIsYTUsYjAsYjMsYjYsYzEsYzQsYzcKKyAgICB1aW50OHg4eDNfdCB2OworICAgIF9fbTEyOGkgdmFsMCwgdmFsMSwgdmFsMiwgdG1wMCwgdG1wMTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s4XzBbMTZdID0gezAsMyw2LDksMTIsMTUsIDEsNCw3LDEwLDEzLCAyLDUsOCwxMSwxNH07CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrOF8xWzE2XSA9IHsyLDUsIDAsMyw2LCAxLDQsNywgMCwwLDAsMCwwLDAsMCwwfTsKKyAgICB2YWwwID0gIHZsZDFxX3U4IChwdHIpOyAvL2EwLGExLGEyLGEzLC4uLmE3LCBiMCxiMSxiMixiMy4uLmI3CisgICAgdmFsMiA9ICBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKShwdHIgKyAxNikpOyAvL2MwLGMxLGMyLGMzLC4uLmM3CisKKyAgICB0bXAwID0gX21tX3NodWZmbGVfZXBpOCh2YWwwLCAqKF9fbTEyOGkqKW1hc2s4XzApOyAvL2EwLGEzLGE2LGIxLGI0LGI3LCBhMSxhNCxhNyxiMixiNSwgYTIsYTUsYjAsYjMsYjYsCisgICAgdG1wMSA9IF9tbV9zaHVmZmxlX2VwaTgodmFsMiwgKihfX20xMjhpKiltYXNrOF8xKTsgLy9jMixjNSwgYzAsYzMsYzYsIGMxLGM0LGM3LHgseCx4LHgseCx4LHgseAorICAgIHZhbDAgPSBfbW1fc2xsaV9zaTEyOCh0bXAwLDEwKTsKKyAgICB2YWwwID0gX21tX3NybGlfc2kxMjgodmFsMCwxMCk7IC8vYTAsYTMsYTYsYjEsYjQsYjcsIDAsMCwwLDAsMCwwLDAsMCwwLDAKKyAgICB2YWwyID0gX21tX3NsbGlfc2kxMjgodG1wMSw2KTsgLy8wLDAsMCwwLDAsMCxjMixjNSx4LHgseCx4LHgseCx4LHgKKyAgICB2YWwwID0gX21tX29yX3NpMTI4KHZhbDAsdmFsMik7IC8vYTAsYTMsYTYsYjEsYjQsYjcsYzIsYzUgeCx4LHgseCx4LHgseCx4CisgICAgX002NCh2LnZhbFswXSwgdmFsMCk7CisgICAgdmFsMSA9IF9tbV9zbGxpX3NpMTI4KHRtcDAsNSk7IC8vMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCBhMSxhNCxhNyxiMixiNSwKKyAgICB2YWwxID0gX21tX3NybGlfc2kxMjgodmFsMSwxMSk7IC8vYTEsYTQsYTcsYjIsYjUsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIHZhbDIgPSBfbW1fc3JsaV9zaTEyOCh0bXAxLDIpOyAvL2MwLGMzLGM2LGMxLGM0LGM3LHgseCx4LHgseCx4LHgseCwwLDAKKyAgICB2YWwyID0gX21tX3NsbGlfc2kxMjgodmFsMiw1KTsgLy8wLDAsMCwwLDAsYzAsYzMsYzYsMCwwLDAsMCwwLDAsMCwwCisgICAgdmFsMSA9IF9tbV9vcl9zaTEyOCh2YWwxLHZhbDIpOyAvL2ExLGE0LGE3LGIyLGI1LGMwLGMzLGM2LHgseCx4LHgseCx4LHgseAorICAgIF9NNjQodi52YWxbMV0sIHZhbDEpOworCisgICAgdG1wMCA9IF9tbV9zcmxpX3NpMTI4KHRtcDAsMTEpOyAvL2EyLGE1LGIwLGIzLGI2LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICB2YWwyID0gX21tX3NybGlfc2kxMjgodG1wMSw1KTsgLy9jMSxjNCxjNywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwCisgICAgdmFsMiA9IF9tbV9zbGxpX3NpMTI4KHZhbDIsNSk7IC8vMCwwLDAsMCwwLGMxLGM0LGM3LAorICAgIHZhbDIgPSBfbW1fb3Jfc2kxMjgodG1wMCwgdmFsMik7IC8vYTIsYTUsYjAsYjMsYjYsYzEsYzQsYzcseCx4LHgseCx4LHgseCx4CisgICAgX002NCh2LnZhbFsyXSwgdmFsMik7CisgICAgcmV0dXJuIHY7Cit9CisKK3VpbnQxNng0eDNfdCB2bGQzX3UxNihfX3RyYW5zZmVyc2l6ZSgxMikgdWludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjE2IHtkMCwgZDEsIGQyfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NHgzX3QgdmxkM191MTYoX190cmFuc2ZlcnNpemUoMTIpIHVpbnQxNl90IGNvbnN0ICogcHRyKSAvLyBWTEQzLjE2IHtkMCwgZDEsIGQyfSwgW3IwXQoreworICAgIC8vYTAsYTEsYTIsYTMsICBiMCxiMSxiMixiMywgYzAsYzEsYzIsYzMgLT4gYTAsYTMsYjIsYzEsICBhMSxiMCxiMyxjMiwgYTIsYjEsYzAsYzMsCisgICAgdWludDE2eDR4M190IHY7CisgICAgX19tMTI4aSB2YWwwLCB2YWwxLCB2YWwyLCB0bXAwLCB0bXAxOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazE2WzE2XSA9IHswLDEsIDYsNywgMTIsMTMsIDIsMywgOCw5LCAxNCwxNSwgNCw1LCAxMCwxMX07CisgICAgdmFsMCA9ICB2bGQxcV91MTYgKHB0cik7IC8vYTAsYTEsYTIsYTMsICBiMCxiMSxiMixiMworICAgIHZhbDIgPSAgX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikocHRyICsgOCkpOyAvL2MwLGMxLGMyLGMzLCB4LHgseCx4CisKKyAgICB0bXAwID0gX21tX3NodWZmbGVfZXBpOCh2YWwwLCAqKF9fbTEyOGkqKW1hc2sxNik7IC8vYTAsIGEzLCBiMixhMSwgYjAsIGIzLCBhMiwgYjEKKyAgICB0bXAxID0gX21tX3NodWZmbGVsb19lcGkxNih2YWwyLCAyMDEpOyAvLzExIDAwIDEwIDAxICAgICA6IGMxLCBjMiwgYzAsIGMzLAorICAgIHZhbDAgPSBfbW1fc2xsaV9zaTEyOCh0bXAwLDEwKTsKKyAgICB2YWwwID0gX21tX3NybGlfc2kxMjgodmFsMCwxMCk7IC8vYTAsIGEzLCBiMiwgMCwwLCAwLDAsCisgICAgdmFsMiA9IF9tbV9zbGxpX3NpMTI4KHRtcDEsMTQpOyAvLzAsMCwwLDAsMCwwLDAsYzEKKyAgICB2YWwyID0gX21tX3NybGlfc2kxMjgodmFsMiw4KTsgLy8wLDAsMCxjMSwwLDAsMCwwCisgICAgdmFsMCA9IF9tbV9vcl9zaTEyOCh2YWwwLHZhbDIpOyAvL2EwLCBhMywgYjIsIGMxLCB4LHgseCx4CisgICAgX002NCh2LnZhbFswXSwgdmFsMCk7CisKKyAgICB2YWwxID0gX21tX3NsbGlfc2kxMjgodG1wMCw0KTsgLy8wLDAsMCwwLDAsYTEsIGIwLCBiMworICAgIHZhbDEgPSBfbW1fc3JsaV9zaTEyOCh2YWwxLDEwKTsgLy9hMSwgYjAsIGIzLCAwLDAsIDAsMCwKKyAgICB2YWwyID0gX21tX3NybGlfc2kxMjgodG1wMSwyKTsgLy9jMiwgMCwwLDAsMCwwLDAsMCwKKyAgICB2YWwyID0gX21tX3NsbGlfc2kxMjgodmFsMiw2KTsgLy8wLDAsMCxjMiwwLDAsMCwwCisgICAgdmFsMSA9IF9tbV9vcl9zaTEyOCh2YWwxLHZhbDIpOyAvL2ExLCBiMCwgYjMsIGMyLCB4LHgseCx4CisgICAgX002NCh2LnZhbFsxXSwgdmFsMSk7CisKKyAgICB0bXAwID0gX21tX3NybGlfc2kxMjgodG1wMCwxMik7IC8vYTIsIGIxLDAsMCwwLDAsMCwwCisgICAgdG1wMSA9IF9tbV9zcmxpX3NpMTI4KHRtcDEsNCk7CisgICAgdG1wMSA9IF9tbV9zbGxpX3NpMTI4KHRtcDEsNCk7IC8vMCwwLGMwLCBjMywKKyAgICB2YWwyID0gX21tX29yX3NpMTI4KHRtcDAsIHRtcDEpOyAvL2EyLCBiMSwgYzAsIGMzLAorICAgIF9NNjQodi52YWxbMl0sIHZhbDIpOworICAgIHJldHVybiB2OworfQorCit1aW50MzJ4MngzX3QgdmxkM191MzIoX190cmFuc2ZlcnNpemUoNikgdWludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjMyIHtkMCwgZDEsIGQyfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MzJ4MngzX3QgdmxkM191MzIoX190cmFuc2ZlcnNpemUoNikgdWludDMyX3QgY29uc3QgKiBwdHIpIC8vIFZMRDMuMzIge2QwLCBkMSwgZDJ9LCBbcjBdCit7CisgICAgLy9hMCxhMSwgIGIwLGIxLCBjMCxjMSwgIC0+IGEwLGIxLCBhMSxjMCwgYjAsYzEKKyAgICB1aW50MzJ4MngzX3QgdjsKKyAgICBfX20xMjhpIHZhbDAsIHZhbDEsIHZhbDI7CisgICAgdmFsMCA9ICB2bGQxcV91MzIgKHB0cik7IC8vYTAsYTEsICBiMCxiMSwKKyAgICB2YWwyID0gICBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSAocHRyICsgNCkpOyAvL2MwLGMxLCB4LHgKKworICAgIHZhbDAgPSBfbW1fc2h1ZmZsZV9lcGkzMih2YWwwLCAwIHwgKDMgPDwgMikgfCAoMSA8PCA0KSB8ICgyIDw8IDYpKTsgLy9hMCxiMSwgYTEsIGIwCisgICAgX002NCh2LnZhbFswXSwgdmFsMCk7CisgICAgdmFsMiA9ICBfbW1fc2xsaV9zaTEyOCh2YWwyLCA4KTsgLy94LCB4LGMwLGMxLAorICAgIHZhbDEgPSAgX21tX3VucGFja2hpX2VwaTMyKHZhbDAsdmFsMik7IC8vYTEsYzAsIGIwLCBjMQorICAgIF9NNjQodi52YWxbMV0sIHZhbDEpOworICAgIHZhbDIgPSAgX21tX3NybGlfc2kxMjgodmFsMSwgOCk7IC8vYjAsIGMxLCB4LCB4LAorICAgIF9NNjQodi52YWxbMl0sIHZhbDIpOworICAgIHJldHVybiB2OworfQordWludDY0eDF4M190IHZsZDNfdTY0KF9fdHJhbnNmZXJzaXplKDMpIHVpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDAsIGQxLCBkMn0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDF4M190IHZsZDNfdTY0KF9fdHJhbnNmZXJzaXplKDMpIHVpbnQ2NF90IGNvbnN0ICogcHRyKSAvLyBWTEQxLjY0IHtkMCwgZDEsIGQyfSwgW3IwXQoreworICAgIHVpbnQ2NHgxeDNfdCB2OworICAgIHYudmFsWzBdLm02NF91NjRbMF0gPSAqKHB0cik7CisgICAgdi52YWxbMV0ubTY0X3U2NFswXSA9ICoocHRyICsgMSk7CisgICAgdi52YWxbMl0ubTY0X3U2NFswXSA9ICoocHRyICsgMik7CisgICAgcmV0dXJuIHY7Cit9CisKK2ludDh4OHgzX3QgdmxkM19zOChfX3RyYW5zZmVyc2l6ZSgyNCkgaW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy44IHtkMCwgZDEsIGQyfSwgW3IwXQorI2RlZmluZSB2bGQzX3M4KHB0cikgdmxkM191OCgodWludDhfdCopcHRyKQorCitpbnQxNng0eDNfdCB2bGQzX3MxNihfX3RyYW5zZmVyc2l6ZSgxMikgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMTYge2QwLCBkMSwgZDJ9LCBbcjBdCisjZGVmaW5lIHZsZDNfczE2KHB0cikgdmxkM191MTYoKHVpbnQxNl90KilwdHIpCisKK2ludDMyeDJ4M190IHZsZDNfczMyKF9fdHJhbnNmZXJzaXplKDYpIGludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjMyIHtkMCwgZDEsIGQyfSwgW3IwXQorI2RlZmluZSB2bGQzX3MzMihwdHIpIHZsZDNfdTMyKCh1aW50MzJfdCopcHRyKQorCitpbnQ2NHgxeDNfdCB2bGQzX3M2NChfX3RyYW5zZmVyc2l6ZSgzKSBpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDAsIGQxLCBkMn0sIFtyMF0KKyNkZWZpbmUgdmxkM19zNjQocHRyKSB2bGQzX3U2NCgodWludDY0X3QqKXB0cikKKworZmxvYXQxNng0eDNfdCB2bGQzX2YxNihfX3RyYW5zZmVyc2l6ZSgxMikgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4xNiB7ZDAsIGQxLCBkMn0sIFtyMF0KKy8vIElBMzIgU0lNRCBkb2Vzbid0IHdvcmsgd2l0aCAxNmJpdCBmbG9hdHMgY3VycmVudGx5LCBzbyBuZWVkIHRvIGdvIHRvIDMyIGJpdCBhbmQgdGhlbiB3b3JrIHdpdGggdHdvIDEyOGJpdCByZWdpc3RlcnMuIFNlZSB2bGQxcV9mMTYgZm9yIGV4YW1wbGUKKworZmxvYXQzMngyeDNfdCB2bGQzX2YzMihfX3RyYW5zZmVyc2l6ZSg2KSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjMyIHtkMCwgZDEsIGQyfSwgW3IwXQorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJ4M190IHZsZDNfZjMyKF9fdHJhbnNmZXJzaXplKDYpIGZsb2F0MzJfdCBjb25zdCAqIHB0cikKK3sKKyAgICAvL2EwLGExLCAgYjAsYjEsIGMwLGMxLCAgLT4gYTAsYjEsIGExLGMwLCBiMCxjMQorICAgIGZsb2F0MzJ4MngzX3QgdjsKKyAgICB2LnZhbFswXS5tNjRfZjMyWzBdID0gKihwdHIpOworICAgIHYudmFsWzBdLm02NF9mMzJbMV0gPSAqKHB0ciArIDMpOworCisgICAgdi52YWxbMV0ubTY0X2YzMlswXSA9ICoocHRyICsgMSk7CisgICAgdi52YWxbMV0ubTY0X2YzMlsxXSA9ICoocHRyICsgNCk7CisKKyAgICB2LnZhbFsyXS5tNjRfZjMyWzBdID0gKihwdHIgKyAyKTsKKyAgICB2LnZhbFsyXS5tNjRfZjMyWzFdID0gKihwdHIgKyA1KTsKKyAgICByZXR1cm4gdjsKK30KKworcG9seTh4OHgzX3QgdmxkM19wOChfX3RyYW5zZmVyc2l6ZSgyNCkgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuOCB7ZDAsIGQxLCBkMn0sIFtyMF0KKyNkZWZpbmUgdmxkM19wOCB2bGQzX3U4CisKK3BvbHkxNng0eDNfdCB2bGQzX3AxNihfX3RyYW5zZmVyc2l6ZSgxMikgcG9seTE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjE2IHtkMCwgZDEsIGQyfSwgW3IwXQorI2RlZmluZSB2bGQzX3AxNiB2bGQzX3UxNgorCisvLyoqKioqKioqKioqKioqKiAgUXVhZHJ1cGxlcyBsb2FkICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCit1aW50OHgxNng0X3QgdmxkNHFfdTgoX190cmFuc2ZlcnNpemUoNjQpIHVpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0Ljgge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50OHgxNng0X3QgdmxkNHFfdTgoX190cmFuc2ZlcnNpemUoNjQpIHVpbnQ4X3QgY29uc3QgKiBwdHIpIC8vIFZMRDQuOCB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCit7CisgICAgdWludDh4MTZ4NF90IHY7CisgICAgX19tMTI4aSB0bXAzLCB0bXAyLCB0bXAxLCB0bXAwOworCisgICAgdi52YWxbMF0gPSB2bGQxcV91OCAoIHB0cik7IC8vYTAsYTEsYTIsLi4uYTcsIC4uLmExNQorICAgIHYudmFsWzFdID0gdmxkMXFfdTggKCAocHRyICsgMTYpKTsgLy9iMCwgYjEsYjIsLi4uYjcuLi4uIGIxNQorICAgIHYudmFsWzJdID0gdmxkMXFfdTggKCAocHRyICsgMzIpKTsgLy9jMCwgYzEsYzIsLi4uYzcuLi4uYzE1CisgICAgdi52YWxbM10gPSB2bGQxcV91OCAoIChwdHIgKyA0OCkpOyAvL2QwLGQxLGQyLC4uLmQ3Li4uLmQxNQorCisgICAgdG1wMCA9IF9tbV91bnBhY2tsb19lcGk4KHYudmFsWzBdLHYudmFsWzFdKTsgLy9hMCxiMCwgYTEsYjEsIGEyLGIyLCBhMyxiMywuLi4uYTcsYjcKKyAgICB0bXAxID0gX21tX3VucGFja2xvX2VwaTgodi52YWxbMl0sdi52YWxbM10pOyAvL2MwLGQwLCBjMSxkMSwgYzIsZDIsIGMzLGQzLC4uLiBjNyxkNworICAgIHRtcDIgPSBfbW1fdW5wYWNraGlfZXBpOCh2LnZhbFswXSx2LnZhbFsxXSk7IC8vYTgsYjgsIGE5LGI5LCBhMTAsYjEwLCBhMTEsYjExLC4uLmExNSxiMTUKKyAgICB0bXAzID0gX21tX3VucGFja2hpX2VwaTgodi52YWxbMl0sdi52YWxbM10pOyAvL2M4LGQ4LCBjOSxkOSwgYzEwLGQxMCwgYzExLGQxMSwuLi5jMTUsZDE1CisKKyAgICB2LnZhbFswXSA9IF9tbV91bnBhY2tsb19lcGk4KHRtcDAsIHRtcDIpOyAvL2EwLGE4LCBiMCxiOCwgIGExLGE5LCBiMSxiOSwgLi4uLmEzLGExMSwgYjMsYjExCisgICAgdi52YWxbMV0gPSBfbW1fdW5wYWNraGlfZXBpOCh0bXAwLCB0bXAyKTsgLy9hNCxhMTIsIGI0LGIxMiwgYTUsYTEzLCBiNSxiMTMsLi4uLmE3LGExNSxiNyxiMTUKKyAgICB2LnZhbFsyXSA9IF9tbV91bnBhY2tsb19lcGk4KHRtcDEsIHRtcDMpOyAvL2MwLGM4LCBkMCxkOCwgYzEsYzksIGQxLGQ5Li4uLi5kMyxkMTEKKyAgICB2LnZhbFszXSA9IF9tbV91bnBhY2toaV9lcGk4KHRtcDEsIHRtcDMpOyAvL2M0LGMxMixkNCxkMTIsIGM1LGMxMywgZDUsZDEzLC4uLi5kNyxkMTUKKworICAgIHRtcDAgPSAgX21tX3VucGFja2xvX2VwaTMyKHYudmFsWzBdLCB2LnZhbFsyXSApOyAvLy9hMCxhOCwgYjAsYjgsIGMwLGM4LCAgZDAsZDgsIGExLGE5LCBiMSxiOSwgYzEsYzksIGQxLGQ5CisgICAgdG1wMSA9ICBfbW1fdW5wYWNraGlfZXBpMzIodi52YWxbMF0sIHYudmFsWzJdICk7IC8vYTIsYTEwLCBiMixiMTAsIGMyLGMxMCwgZDIsZDEwLCBhMyxhMTEsIGIzLGIxMSwgYzMsYzExLCBkMyxkMTEKKyAgICB0bXAyID0gIF9tbV91bnBhY2tsb19lcGkzMih2LnZhbFsxXSwgdi52YWxbM10gKTsgLy9hNCxhMTIsIGI0LGIxMiwgYzQsYzEyLCBkNCxkMTIsIGE1LGExMywgYjUsYjEzLCBjNSxjMTMsIGQ1LGQxMywKKyAgICB0bXAzID0gIF9tbV91bnBhY2toaV9lcGkzMih2LnZhbFsxXSwgdi52YWxbM10gKTsgLy9hNixhMTQsIGI2LGIxNCwgYzYsYzE0LCBkNixkMTQsIGE3LGExNSxiNyxiMTUsYzcsYzE1LGQ3LGQxNQorCisgICAgdi52YWxbMF0gPSBfbW1fdW5wYWNrbG9fZXBpOCh0bXAwLCB0bXAyKTsgLy9hMCxhNCxhOCxhMTIsYjAsYjQsYjgsYjEyLGMwLGM0LGM4LGMxMixkMCxkNCxkOCxkMTIKKyAgICB2LnZhbFsxXSA9IF9tbV91bnBhY2toaV9lcGk4KHRtcDAsIHRtcDIpOyAvL2ExLGE1LCBhOSwgYTEzLCBiMSxiNSwgYjksYjEzLCBjMSxjNSwgYzksIGMxMywgZDEsZDUsIGQ5LGQxMworICAgIHYudmFsWzJdID0gX21tX3VucGFja2xvX2VwaTgodG1wMSwgdG1wMyk7IC8vYTIsYTYsIGExMCxhMTQsIGIyLGI2LCBiMTAsYjE0LGMyLGM2LCBjMTAsYzE0LCBkMixkNiwgZDEwLGQxNAorICAgIHYudmFsWzNdID0gX21tX3VucGFja2hpX2VwaTgodG1wMSwgdG1wMyk7IC8vYTMsYTcsIGExMSxhMTUsIGIzLGI3LCBiMTEsYjE1LGMzLGM3LCBjMTEsIGMxNSxkMyxkNywgZDExLGQxNQorICAgIHJldHVybiB2OworfQorCit1aW50MTZ4OHg0X3QgdmxkNHFfdTE2KF9fdHJhbnNmZXJzaXplKDMyKSB1aW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMTYge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OHg0X3QgdmxkNHFfdTE2KF9fdHJhbnNmZXJzaXplKDMyKSB1aW50MTZfdCBjb25zdCAqIHB0cikgLy8gVkxENC4xNiB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCit7CisgICAgdWludDE2eDh4NF90IHY7CisgICAgX19tMTI4aSB0bXAzLCB0bXAyLCB0bXAxLCB0bXAwOworICAgIHRtcDAgID0gIHZsZDFxX3UxNiAocHRyKTsgLy9hMCxhMSxhMiwuLi5hNworICAgIHRtcDEgID0gIHZsZDFxX3UxNiAoKHB0ciArIDgpKTsgLy9iMCwgYjEsYjIsLi4uYjcKKyAgICB0bXAyICA9ICB2bGQxcV91MTYgKChwdHIgKyAxNikpOyAvL2MwLCBjMSxjMiwuLi5jNworICAgIHRtcDMgID0gIHZsZDFxX3UxNiAoKHB0ciArIDI0KSk7IC8vZDAsZDEsZDIsLi4uZDcKKyAgICB2LnZhbFswXSA9IF9tbV91bnBhY2tsb19lcGkxNih0bXAwLHRtcDEpOyAvL2EwLGIwLCBhMSxiMSwgYTIsYjIsIGEzLGIzLAorICAgIHYudmFsWzFdID0gX21tX3VucGFja2xvX2VwaTE2KHRtcDIsdG1wMyk7IC8vYzAsZDAsIGMxLGQxLCBjMixkMiwgYzMsZDMsCisgICAgdi52YWxbMl0gPSBfbW1fdW5wYWNraGlfZXBpMTYodG1wMCx0bXAxKTsgLy9hNCxiNCwgYTUsYjUsIGE2LGI2LCBhNyxiNworICAgIHYudmFsWzNdID0gX21tX3VucGFja2hpX2VwaTE2KHRtcDIsdG1wMyk7IC8vYzQsZDQsIGM1LGQ1LCBjNixkNiwgYzcsZDcKKyAgICB0bXAwID0gX21tX3VucGFja2xvX2VwaTE2KHYudmFsWzBdLCB2LnZhbFsyXSk7IC8vYTAsYTQsIGIwLGI0LCBhMSxhNSwgYjEsYjUKKyAgICB0bXAxID0gX21tX3VucGFja2hpX2VwaTE2KHYudmFsWzBdLCB2LnZhbFsyXSk7IC8vYTIsYTYsIGIyLGI2LCBhMyxhNywgYjMsYjcKKyAgICB0bXAyID0gX21tX3VucGFja2xvX2VwaTE2KHYudmFsWzFdLCB2LnZhbFszXSk7IC8vYzAsYzQsIGQwLGQ0LCBjMSxjNSwgZDEsZDUKKyAgICB0bXAzID0gX21tX3VucGFja2hpX2VwaTE2KHYudmFsWzFdLCB2LnZhbFszXSk7IC8vYzIsYzYsIGQyLGQ2LCBjMyxjNywgZDMsZDcKKyAgICB2LnZhbFswXSA9ICBfbW1fdW5wYWNrbG9fZXBpNjQodG1wMCwgdG1wMik7IC8vYTAsYTQsIGIwLGI0LCBjMCxjNCwgZDAsZDQsCisgICAgdi52YWxbMV0gPSAgX21tX3VucGFja2hpX2VwaTY0KHRtcDAsIHRtcDIpOyAvL2ExLGE1LCBiMSxiNSwgYzEsYzUsIGQxLGQ1CisgICAgdi52YWxbMl0gPSAgX21tX3VucGFja2xvX2VwaTY0KHRtcDEsIHRtcDMpOyAvL2EyLGE2LCBiMixiNiwgYzIsYzYsIGQyLGQ2LAorICAgIHYudmFsWzNdID0gIF9tbV91bnBhY2toaV9lcGk2NCh0bXAxLCB0bXAzKTsgLy9hMyxhNywgYjMsYjcsIGMzLGM3LCBkMyxkNworICAgIHJldHVybiB2OworfQorCit1aW50MzJ4NHg0X3QgdmxkNHFfdTMyKF9fdHJhbnNmZXJzaXplKDE2KSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMzIge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NHg0X3QgdmxkNHFfdTMyKF9fdHJhbnNmZXJzaXplKDE2KSB1aW50MzJfdCBjb25zdCAqIHB0cikgLy8gVkxENC4zMiB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCit7CisgICAgdWludDMyeDR4NF90IHY7CisgICAgX19tMTI4aSB0bXAzLCB0bXAyLCB0bXAxLCB0bXAwOworICAgIHYudmFsWzBdID0gIHZsZDFxX3UzMiAocHRyKTsKKyAgICB2LnZhbFsxXSA9ICB2bGQxcV91MzIgKChwdHIgKyA0KSk7CisgICAgdi52YWxbMl0gPSAgdmxkMXFfdTMyICgocHRyICsgOCkpOworICAgIHYudmFsWzNdID0gIHZsZDFxX3UzMiAoKHB0ciArIDEyKSk7CisgICAgdG1wMCA9IF9tbV91bnBhY2tsb19lcGkzMih2LnZhbFswXSx2LnZhbFsxXSk7CisgICAgdG1wMSA9IF9tbV91bnBhY2tsb19lcGkzMih2LnZhbFsyXSx2LnZhbFszXSk7CisgICAgdG1wMiA9IF9tbV91bnBhY2toaV9lcGkzMih2LnZhbFswXSx2LnZhbFsxXSk7CisgICAgdG1wMyA9IF9tbV91bnBhY2toaV9lcGkzMih2LnZhbFsyXSx2LnZhbFszXSk7CisgICAgdi52YWxbMF0gPSBfbW1fdW5wYWNrbG9fZXBpNjQodG1wMCwgdG1wMSk7CisgICAgdi52YWxbMV0gPSBfbW1fdW5wYWNraGlfZXBpNjQodG1wMCwgdG1wMSk7CisgICAgdi52YWxbMl0gPSBfbW1fdW5wYWNrbG9fZXBpNjQodG1wMiwgdG1wMyk7CisgICAgdi52YWxbM10gPSBfbW1fdW5wYWNraGlfZXBpNjQodG1wMiwgdG1wMyk7CisgICAgcmV0dXJuIHY7Cit9CisKK2ludDh4MTZ4NF90IHZsZDRxX3M4KF9fdHJhbnNmZXJzaXplKDY0KSBpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0Ljgge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQorI2RlZmluZSB2bGQ0cV9zOChwdHIpIHZsZDRxX3U4KCh1aW50OF90KilwdHIpCisKK2ludDE2eDh4NF90IHZsZDRxX3MxNihfX3RyYW5zZmVyc2l6ZSgzMikgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMTYge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQorI2RlZmluZSAgdmxkNHFfczE2KHB0cikgdmxkNHFfdTE2KCh1aW50MTZfdCopcHRyKQorCitpbnQzMng0eDRfdCB2bGQ0cV9zMzIoX190cmFuc2ZlcnNpemUoMTYpIGludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjMyIHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KKyNkZWZpbmUgIHZsZDRxX3MzMihwdHIpIHZsZDRxX3UzMigodWludDMyX3QqKXB0cikKKworZmxvYXQxNng4eDRfdCB2bGQ0cV9mMTYoX190cmFuc2ZlcnNpemUoMzIpIF9fZnAxNiBjb25zdCAqIHB0cik7IC8vIFZMRDQuMTYge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQorLy8gSUEzMiBTSU1EIGRvZXNuJ3Qgd29yayB3aXRoIDE2Yml0IGZsb2F0cyBjdXJyZW50bHksIHNvIG5lZWQgdG8gZ28gdG8gMzIgYml0IGFuZCB0aGVuIHdvcmsgd2l0aCB0d28gMTI4Yml0IHJlZ2lzdGVycy4gU2VlIHZsZDFxX2YxNiBmb3IgZXhhbXBsZQorCitmbG9hdDMyeDR4NF90IHZsZDRxX2YzMihfX3RyYW5zZmVyc2l6ZSgxNikgZmxvYXQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4zMiB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4NHg0X3QgdmxkNHFfZjMyKF9fdHJhbnNmZXJzaXplKDE2KSBmbG9hdDMyX3QgY29uc3QgKiBwdHIpIC8vIFZMRDQuMzIge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQoreworICAgIGZsb2F0MzJ4NHg0X3QgdjsKKyAgICBfX20xMjggdG1wMywgdG1wMiwgdG1wMSwgdG1wMDsKKworICAgIHYudmFsWzBdID0gIHZsZDFxX2YzMiAoKGZsb2F0KikgcHRyKTsKKyAgICB2LnZhbFsxXSA9ICB2bGQxcV9mMzIgKChmbG9hdCopIChwdHIgKyA0KSk7CisgICAgdi52YWxbMl0gPSAgdmxkMXFfZjMyICgoZmxvYXQqKSAocHRyICsgOCkpOworICAgIHYudmFsWzNdID0gIHZsZDFxX2YzMiAoKGZsb2F0KikgKHB0ciArIDEyKSk7CisgICAgdG1wMCA9IF9tbV91bnBhY2tsb19wcyh2LnZhbFswXSwgdi52YWxbMV0pOworICAgIHRtcDIgPSBfbW1fdW5wYWNrbG9fcHModi52YWxbMl0sIHYudmFsWzNdKTsKKyAgICB0bXAxID0gX21tX3VucGFja2hpX3BzKHYudmFsWzBdLCB2LnZhbFsxXSk7CisgICAgdG1wMyA9IF9tbV91bnBhY2toaV9wcyh2LnZhbFsyXSwgdi52YWxbM10pOworICAgIHYudmFsWzBdID0gX21tX21vdmVsaF9wcyh0bXAwLCB0bXAyKTsKKyAgICB2LnZhbFsxXSA9IF9tbV9tb3ZlaGxfcHModG1wMiwgdG1wMCk7CisgICAgdi52YWxbMl0gPSBfbW1fbW92ZWxoX3BzKHRtcDEsIHRtcDMpOworICAgIHYudmFsWzNdID0gX21tX21vdmVobF9wcyh0bXAzLCB0bXAxKTsKKyAgICByZXR1cm4gdjsKK30KKworcG9seTh4MTZ4NF90IHZsZDRxX3A4KF9fdHJhbnNmZXJzaXplKDY0KSBwb2x5OF90IGNvbnN0ICogcHRyKTsgLy8gVkxENC44IHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KKyNkZWZpbmUgdmxkNHFfcDggdmxkNHFfdTgKKworcG9seTE2eDh4NF90IHZsZDRxX3AxNihfX3RyYW5zZmVyc2l6ZSgzMikgcG9seTE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjE2IHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KKyNkZWZpbmUgdmxkNHFfcDE2IHZsZDRxX3MxNgorCit1aW50OHg4eDRfdCB2bGQ0X3U4KF9fdHJhbnNmZXJzaXplKDMyKSB1aW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxENC44IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OHg0X3QgdmxkNF91OChfX3RyYW5zZmVyc2l6ZSgzMikgdWludDhfdCBjb25zdCAqIHB0cikgLy8gVkxENC44IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK3sKKyAgICB1aW50OHg4eDRfdCB2OworICAgIF9fbTEyOGkgc2gwLCBzaDE7CisgICAgX19tMTI4aSB2YWwwLCAgdmFsMjsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s0XzhbMTZdID0gezAsIDQsIDgsIDEyLCAxLCA1LCA5LCAxMywgMiwgNiwgMTAsIDE0LCAzLCA3LCAxMSwgMTV9OworCisgICAgdmFsMCA9IHZsZDFxX3U4KCggcHRyKSk7IC8vbG9hZCBmaXJzdCA2NC1iaXRzIGluIHZhbFswXSBhbmQgdmFsWzFdCisgICAgdmFsMiA9IHZsZDFxX3U4KCggcHRyICsgMTYpKTsgLy9sb2FkIHRoaXJkIGFuZCBmb3J0aCA2NC1iaXRzIGluIHZhbFsyXSwgdmFsWzNdCisKKyAgICBzaDAgPSBfbW1fc2h1ZmZsZV9lcGk4KHZhbDAsICooX19tMTI4aSopbWFzazRfOCk7CisgICAgc2gxID0gX21tX3NodWZmbGVfZXBpOCh2YWwyLCAqKF9fbTEyOGkqKW1hc2s0XzgpOworICAgIHZhbDAgPSBfbW1fdW5wYWNrbG9fZXBpMzIoc2gwLHNoMSk7IC8vMCw0LDgsMTIsMTYsMjAsMjQsMjgsIDEsNSw5LDEzLDE3LDIxLDI1LDI5CisgICAgdnN0MXFfdTgoJnYudmFsWzBdLCB2YWwwICk7CisgICAgdmFsMiA9IF9tbV91bnBhY2toaV9lcGkzMihzaDAsc2gxKTsgLy8yLDYsMTAsMTQsMTgsMjIsMjYsMzAsIDMsNywxMSwxNSwxOSwyMywyNywzMQorICAgIHZzdDFxX3U4KCZ2LnZhbFsyXSwgdmFsMiApOworICAgIHJldHVybiB2OworfQorCit1aW50MTZ4NHg0X3QgdmxkNF91MTYoX190cmFuc2ZlcnNpemUoMTYpIHVpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4xNiB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0eDRfdCB2bGQ0X3UxNihfX3RyYW5zZmVyc2l6ZSgxNikgdWludDE2X3QgY29uc3QgKiBwdHIpIC8vIFZMRDQuMTYge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQoreworICAgIHVpbnQxNng0eDRfdCB2OworICAgIF9fbTEyOGkgc2gwLCBzaDE7CisgICAgX19tMTI4aSB2YWwwLCB2YWwyOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazRfMTZbMTZdID0gezAsMSwgOCw5LCAyLDMsIDEwLDExLCA0LDUsIDEyLDEzLCA2LDcsIDE0LDE1fTsgLy8wLCA0LCAxLCA1LCAyLCA2LCAzLCA3CisgICAgdmFsMCA9IHZsZDFxX3UxNiAoIChwdHIpKTsgLy9sb2FkIGZpcnN0IDY0LWJpdHMgaW4gdmFsWzBdIGFuZCB2YWxbMV0KKyAgICB2YWwyID0gdmxkMXFfdTE2ICggKHB0ciArIDgpKTsgLy9sb2FkIHRoaXJkIGFuZCBmb3J0aCA2NC1iaXRzIGluIHZhbFsyXSwgdmFsWzNdCisgICAgc2gwID0gX21tX3NodWZmbGVfZXBpOCh2YWwwLCAqKF9fbTEyOGkqKW1hc2s0XzE2KTsKKyAgICBzaDEgPSBfbW1fc2h1ZmZsZV9lcGk4KHZhbDIsICooX19tMTI4aSopbWFzazRfMTYpOworICAgIHZhbDAgPSBfbW1fdW5wYWNrbG9fZXBpMzIoc2gwLHNoMSk7IC8vMCw0LDgsMTIsIDEsNSw5LDEzCisgICAgdnN0MXFfdTE2KCZ2LnZhbFswXSwgdmFsMCApOworICAgIHZhbDIgPSBfbW1fdW5wYWNraGlfZXBpMzIoc2gwLHNoMSk7IC8vMiw2LDEwLDE0LCAzLDcsMTEsMTUKKyAgICB2c3QxcV91MTYoJnYudmFsWzJdLCB2YWwyICk7CisgICAgcmV0dXJuIHY7Cit9CisKK3VpbnQzMngyeDRfdCB2bGQ0X3UzMihfX3RyYW5zZmVyc2l6ZSg4KSB1aW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMzIge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Mng0X3QgdmxkNF91MzIoX190cmFuc2ZlcnNpemUoOCkgdWludDMyX3QgY29uc3QgKiBwdHIpCit7CisgICAgLy9hMCxhMSwgIGIwLGIxLCBjMCxjMSwgZDAsZDEgLT4gYTAsYzAsIGExLGMxLCBiMCxkMCwgYjEsZDEKKyAgICB1aW50MzJ4Mng0X3QgdjsKKyAgICBfX20xMjhpIHZhbDAsIHZhbDAxLCB2YWwyOworICAgIHZhbDAgPSAgdmxkMXFfdTMyIChwdHIpOyAvL2EwLGExLCAgYjAsYjEsCisgICAgdmFsMiA9ICB2bGQxcV91MzIgKChwdHIgKyA0KSk7IC8vYzAsYzEsIGQwLGQxCisgICAgdmFsMDEgPSBfbW1fdW5wYWNrbG9fZXBpMzIodmFsMCx2YWwyKTsgLy9hMCwgYzAsIGExLGMxLAorICAgIHZhbDIgPSBfbW1fdW5wYWNraGlfZXBpMzIodmFsMCx2YWwyKTsgLy9iMCxkMCwgYjEsIGQxCisgICAgdnN0MXFfdTMyKCZ2LnZhbFswXSwgdmFsMDEpOworICAgIHZzdDFxX3UzMigmdi52YWxbMl0sIHZhbDIgKTsKKyAgICByZXR1cm4gdjsKK30KKwordWludDY0eDF4NF90IHZsZDRfdTY0KF9fdHJhbnNmZXJzaXplKDQpIHVpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgxeDRfdCB2bGQ0X3U2NChfX3RyYW5zZmVyc2l6ZSg0KSB1aW50NjRfdCBjb25zdCAqIHB0cikgLy8gVkxEMS42NCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCit7CisgICAgdWludDY0eDF4NF90IHY7CisgICAgdi52YWxbMF0ubTY0X3U2NFswXSA9ICoocHRyKTsgLy9sb2FkIGZpcnN0IDY0LWJpdHMgaW4gdmFsWzBdIGFuZCB2YWxbMV0KKyAgICB2LnZhbFsxXS5tNjRfdTY0WzBdID0gKihwdHIgKyAxKTsgLy9sb2FkIGZpcnN0IDY0LWJpdHMgaW4gdmFsWzBdIGFuZCB2YWxbMV0KKyAgICB2LnZhbFsyXS5tNjRfdTY0WzBdID0gKihwdHIgKyAyKTsgLy9sb2FkIHRoaXJkIGFuZCBmb3J0aCA2NC1iaXRzIGluIHZhbFsyXSwgdmFsWzNdCisgICAgdi52YWxbM10ubTY0X3U2NFswXSA9ICoocHRyICsgMyk7IC8vbG9hZCB0aGlyZCBhbmQgZm9ydGggNjQtYml0cyBpbiB2YWxbMl0sIHZhbFszXQorICAgIHJldHVybiB2OworfQorCitpbnQ4eDh4NF90IHZsZDRfczgoX190cmFuc2ZlcnNpemUoMzIpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuOCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCisjZGVmaW5lICB2bGQ0X3M4KHB0cikgdmxkNF91OCgodWludDhfdCopcHRyKQorCitpbnQxNng0eDRfdCB2bGQ0X3MxNihfX3RyYW5zZmVyc2l6ZSgxNikgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMTYge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorI2RlZmluZSB2bGQ0X3MxNihwdHIpIHZsZDRfdTE2KCh1aW50MTZfdCopcHRyKQorCitpbnQzMngyeDRfdCB2bGQ0X3MzMihfX3RyYW5zZmVyc2l6ZSg4KSBpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4zMiB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCisjZGVmaW5lIHZsZDRfczMyKHB0cikgdmxkNF91MzIoKHVpbnQzMl90KilwdHIpCisKK2ludDY0eDF4NF90IHZsZDRfczY0KF9fdHJhbnNmZXJzaXplKDQpIGludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KKyNkZWZpbmUgdmxkNF9zNjQocHRyKSB2bGQ0X3U2NCgodWludDY0X3QqKXB0cikKKworZmxvYXQxNng0eDRfdCB2bGQ0X2YxNihfX3RyYW5zZmVyc2l6ZSgxNikgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxENC4xNiB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCisvLyBJQTMyIFNJTUQgZG9lc24ndCB3b3JrIHdpdGggMTZiaXQgZmxvYXRzIGN1cnJlbnRseSwgc28gbmVlZCB0byBnbyB0byAzMiBiaXQgYW5kIHRoZW4gd29yayB3aXRoIHR3byAxMjhiaXQgcmVnaXN0ZXJzLiBTZWUgdmxkMXFfZjE2IGZvciBleGFtcGxlCisKK2Zsb2F0MzJ4Mng0X3QgdmxkNF9mMzIoX190cmFuc2ZlcnNpemUoOCkgZmxvYXQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4zMiB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Mng0X3QgdmxkNF9mMzIoX190cmFuc2ZlcnNpemUoOCkgZmxvYXQzMl90IGNvbnN0ICogcHRyKSAvLyBWTEQ0LjMyIHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK3sKKyAgICAvL2EwLGExLCAgYjAsYjEsIGMwLGMxLCBkMCxkMSAtPiBhMCxjMCwgYTEsYzEsIGIwLGQwLCBiMSxkMQorICAgIGZsb2F0MzJ4Mng0X3QgcmVzOworICAgIHJlcy52YWxbMF0ubTY0X2YzMlswXSA9ICoocHRyKTsKKyAgICByZXMudmFsWzBdLm02NF9mMzJbMV0gPSAqKHB0ciArIDQpOworICAgIHJlcy52YWxbMV0ubTY0X2YzMlswXSA9ICoocHRyICsgMSk7CisgICAgcmVzLnZhbFsxXS5tNjRfZjMyWzFdID0gKihwdHIgKyA1KTsKKyAgICByZXMudmFsWzJdLm02NF9mMzJbMF0gPSAqKHB0ciArIDIpOworICAgIHJlcy52YWxbMl0ubTY0X2YzMlsxXSA9ICoocHRyICsgNik7CisgICAgcmVzLnZhbFszXS5tNjRfZjMyWzBdID0gKihwdHIgKyAzKTsKKyAgICByZXMudmFsWzNdLm02NF9mMzJbMV0gPSAqKHB0ciArIDcpOworICAgIHJldHVybiByZXM7Cit9CisKK3BvbHk4eDh4NF90IHZsZDRfcDgoX190cmFuc2ZlcnNpemUoMzIpIHBvbHk4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0Ljgge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorI2RlZmluZSB2bGQ0X3A4IHZsZDRfdTgKKworcG9seTE2eDR4NF90IHZsZDRfcDE2KF9fdHJhbnNmZXJzaXplKDE2KSBwb2x5MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMTYge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorI2RlZmluZSB2bGQ0X3AxNiB2bGQ0X3UxNgorCisvLyoqKioqKioqKioqKiogRHVwbGljYXRlIChvciBwcm9wYWdhdGUpIHB0clswXSB0byBhbGwgdmFsWzBdIGxhbmVzIGFuZCBwdHJbMV0gdG8gYWxsIHZhbFsxXSBsYW5lcyAqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3VpbnQ4eDh4Ml90IHZsZDJfZHVwX3U4KF9fdHJhbnNmZXJzaXplKDIpIHVpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjgge2QwW10sIGQxW119LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDh4Ml90IHZsZDJfZHVwX3U4KF9fdHJhbnNmZXJzaXplKDIpIHVpbnQ4X3QgY29uc3QgKiBwdHIpIC8vIFZMRDIuOCB7ZDBbXSwgZDFbXX0sIFtyMF0KK3sKKyAgICB1aW50OHg4eDJfdCB2OworICAgIF9fbTEyOGkgdmFsMCwgdmFsMTsKKyAgICB2YWwwID0gTE9BRF9TSTEyOChwdHIpOyAvLzAsMSx4LHgsIHgseCx4LHgseCx4LHgseCwgeCx4LHgseAorICAgIHZhbDEgPSBfbW1fdW5wYWNrbG9fZXBpOCh2YWwwLHZhbDApOyAvLzAsMCwxLDEseCx4LHgseCwgeCx4LHgseCx4LHgseCx4LAorICAgIHZhbDEgPSBfbW1fdW5wYWNrbG9fZXBpMTYodmFsMSx2YWwxKTsgLy8wLDAsMCwwLCAxLDEsMSwxLHgseCx4LHgsIHgseCx4LHgKKyAgICB2YWwwID0gX21tX3VucGFja2xvX2VwaTMyKHZhbDEsdmFsMSk7IC8vMCwwLDAsMCwgMCwwLDAsMCwxLDEsMSwxLDEsMSwxLDEsCisgICAgdnN0MXFfdTgodi52YWwsIHZhbDApOworICAgIHJldHVybiB2OworfQorCit1aW50MTZ4NHgyX3QgdmxkMl9kdXBfdTE2KF9fdHJhbnNmZXJzaXplKDIpIHVpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4xNiB7ZDBbXSwgZDFbXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDR4Ml90IHZsZDJfZHVwX3UxNihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50MTZfdCBjb25zdCAqIHB0cikgLy8gVkxEMi4xNiB7ZDBbXSwgZDFbXX0sIFtyMF0KK3sKKyAgICB1aW50MTZ4NHgyX3QgdjsKKyAgICBfX20xMjhpIHZhbDAsIHZhbDE7CisgICAgdmFsMSA9IExPQURfU0kxMjgocHRyKTsgLy8wLDEseCx4LCB4LHgseCx4CisgICAgdmFsMCA9IF9tbV9zaHVmZmxlbG9fZXBpMTYodmFsMSwgMCk7IC8vMDAgMDAgMDAgMDAgKGFsbCAwKQorICAgIF9NNjQodi52YWxbMF0sIHZhbDApOworICAgIHZhbDEgPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KHZhbDEsIDg1KTsgLy8wMSAwMSAwMSAwMSAoYWxsIDEpCisgICAgX002NCh2LnZhbFsxXSwgdmFsMSk7CisgICAgcmV0dXJuIHY7Cit9CisKK3VpbnQzMngyeDJfdCB2bGQyX2R1cF91MzIoX190cmFuc2ZlcnNpemUoMikgdWludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjMyIHtkMFtdLCBkMVtdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MzJ4MngyX3QgdmxkMl9kdXBfdTMyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQzMl90IGNvbnN0ICogcHRyKSAvLyBWTEQyLjMyIHtkMFtdLCBkMVtdfSwgW3IwXQoreworICAgIHVpbnQzMngyeDJfdCB2OworICAgIF9fbTEyOGkgdmFsMDsKKyAgICB2YWwwID0gTE9BRF9TSTEyOChwdHIpOyAvLzAsMSx4LHgKKyAgICB2YWwwID0gX21tX3NodWZmbGVfZXBpMzIodmFsMCwgICAwIHwgKDAgPDwgMikgfCAoMSA8PCA0KSB8ICgxIDw8IDYpKTsgLy8wLDAsMSwxCisgICAgdnN0MXFfdTMyKHYudmFsLCB2YWwwKTsKKyAgICByZXR1cm4gdjsKK30KKwordWludDY0eDF4Ml90IHZsZDJfZHVwX3U2NChfX3RyYW5zZmVyc2l6ZSgyKSB1aW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdmxkMl9kdXBfdTY0IHZsZDJfdTY0CisKK2ludDh4OHgyX3QgdmxkMl9kdXBfczgoX190cmFuc2ZlcnNpemUoMikgaW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi44IHtkMFtdLCBkMVtdfSwgW3IwXQorI2RlZmluZSB2bGQyX2R1cF9zOChwdHIpIHZsZDJfZHVwX3U4KCh1aW50OF90KilwdHIpCisKK2ludDE2eDR4Ml90IHZsZDJfZHVwX3MxNihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4xNiB7ZDBbXSwgZDFbXX0sIFtyMF0KKyNkZWZpbmUgdmxkMl9kdXBfczE2KHB0cikgdmxkMl9kdXBfdTE2KCh1aW50MTZfdCopcHRyKQorCitpbnQzMngyeDJfdCB2bGQyX2R1cF9zMzIoX190cmFuc2ZlcnNpemUoMikgaW50MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDIuMzIge2QwW10sIGQxW119LCBbcjBdCisjZGVmaW5lIHZsZDJfZHVwX3MzMihwdHIpIHZsZDJfZHVwX3UzMigodWludDMyX3QqKXB0cikKKworaW50NjR4MXgyX3QgdmxkMl9kdXBfczY0KF9fdHJhbnNmZXJzaXplKDIpIGludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZsZDJfZHVwX3M2NChwdHIpIHZsZDJfZHVwX3U2NCgodWludDY0X3QqKXB0cikKKworZmxvYXQxNng0eDJfdCB2bGQyX2R1cF9mMTYoX190cmFuc2ZlcnNpemUoMikgX19mcDE2IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4xNiB7ZDBbXSwgZDFbXX0sIFtyMF0KKy8vIElBMzIgU0lNRCBkb2Vzbid0IHdvcmsgd2l0aCAxNmJpdCBmbG9hdHMgY3VycmVudGx5LCBzbyBuZWVkIHRvIGdvIHRvIDMyIGJpdCBhbmQgdGhlbiB3b3JrIHdpdGggdHdvIDEyOGJpdCByZWdpc3RlcnMuIFNlZSB2bGQxcV9mMTYgZm9yIGV4YW1wbGUKKworZmxvYXQzMngyeDJfdCB2bGQyX2R1cF9mMzIoX190cmFuc2ZlcnNpemUoMikgZmxvYXQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMi4zMiB7ZDBbXSwgZDFbXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyeDJfdCB2bGQyX2R1cF9mMzIoX190cmFuc2ZlcnNpemUoMikgZmxvYXQzMl90IGNvbnN0ICogcHRyKSAvLyBWTEQyLjMyIHtkMFtdLCBkMVtdfSwgW3IwXQoreworICAgIGZsb2F0MzJ4MngyX3QgdjsKKyAgICB2LnZhbFswXS5tNjRfZjMyWzBdID0gKihwdHIpOyAvLzAsMAorICAgIHYudmFsWzBdLm02NF9mMzJbMV0gPSAqKHB0cik7IC8vMCwwCisgICAgdi52YWxbMV0ubTY0X2YzMlswXSA9ICoocHRyICsgMSk7IC8vMSwxCisgICAgdi52YWxbMV0ubTY0X2YzMlsxXSA9ICoocHRyICsgMSk7IC8vMSwxCisgICAgcmV0dXJuIHY7Cit9CisKK3BvbHk4eDh4Ml90IHZsZDJfZHVwX3A4KF9fdHJhbnNmZXJzaXplKDIpIHBvbHk4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjgge2QwW10sIGQxW119LCBbcjBdCisjZGVmaW5lIHZsZDJfZHVwX3A4IHZsZDJfZHVwX3U4CisKK3BvbHkxNng0eDJfdCB2bGQyX2R1cF9wMTYoX190cmFuc2ZlcnNpemUoMikgcG9seTE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQyLjE2IHtkMFtdLCBkMVtdfSwgW3IwXQorI2RlZmluZSB2bGQyX2R1cF9wMTYgdmxkMl9kdXBfczE2CisKKy8vKioqKioqKioqKioqKiBEdXBsaWNhdGUgKG9yIHByb3BhZ2F0ZSl0cmlwbGV0czogKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9wdHJbMF0gdG8gYWxsIHZhbFswXSBsYW5lcywgcHRyWzFdIHRvIGFsbCB2YWxbMV0gbGFuZXMgYW5kIHB0clsyXSB0byBhbGwgdmFsWzJdIGxhbmVzCit1aW50OHg4eDNfdCB2bGQzX2R1cF91OChfX3RyYW5zZmVyc2l6ZSgzKSB1aW50OF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy44IHtkMFtdLCBkMVtdLCBkMltdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50OHg4eDNfdCB2bGQzX2R1cF91OChfX3RyYW5zZmVyc2l6ZSgzKSB1aW50OF90IGNvbnN0ICogcHRyKSAvLyBWTEQzLjgge2QwW10sIGQxW10sIGQyW119LCBbcjBdCit7CisgICAgdWludDh4OHgzX3QgdjsKKyAgICBfX20xMjhpIHZhbDAsIHZhbDEsIHZhbDI7CisgICAgdmFsMCA9IExPQURfU0kxMjgocHRyKTsgLy8wLDEsMix4LCB4LHgseCx4LHgseCx4LHgsIHgseCx4LHgKKyAgICB2YWwxID0gX21tX3VucGFja2xvX2VwaTgodmFsMCx2YWwwKTsgLy8wLDAsMSwxLDIsMix4LHgsIHgseCx4LHgseCx4LHgseCwKKyAgICB2YWwxID0gX21tX3VucGFja2xvX2VwaTE2KHZhbDEsdmFsMSk7IC8vMCwwLDAsMCwgMSwxLDEsMSwyLDIsMiwyLHgseCx4LHgsCisgICAgdmFsMCA9IF9tbV91bnBhY2tsb19lcGkzMih2YWwxLHZhbDEpOyAvLzAsMCwwLDAsIDAsMCwwLDAsMSwxLDEsMSwxLDEsMSwxLAorICAgIHZhbDIgPSBfbW1fdW5wYWNraGlfZXBpMzIodmFsMSx2YWwxKTsgLy8gMiwyLDIsMiwyLDIsMiwyLCB4LHgseCx4LHgseCx4LHgsCisgICAgdnN0MXFfdTgodi52YWwsIHZhbDApOworICAgIF9NNjQodi52YWxbMl0sIHZhbDIpOworICAgIHJldHVybiB2OworfQorCit1aW50MTZ4NHgzX3QgdmxkM19kdXBfdTE2KF9fdHJhbnNmZXJzaXplKDMpIHVpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxEMy4xNiB7ZDBbXSwgZDFbXSwgZDJbXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDR4M190IHZsZDNfZHVwX3UxNihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MTZfdCBjb25zdCAqIHB0cikgLy8gVkxEMy4xNiB7ZDBbXSwgZDFbXSwgZDJbXX0sIFtyMF0KK3sKKyAgICB1aW50MTZ4NHgzX3QgdjsKKyAgICBfX20xMjhpIHZhbDAsIHZhbDEsIHZhbDI7CisgICAgdmFsMiA9IExPQURfU0kxMjgocHRyKTsgLy8wLDEsMix4LCB4LHgseCx4CisgICAgdmFsMCA9IF9tbV9zaHVmZmxlbG9fZXBpMTYodmFsMiwgMCk7IC8vMDAgMDAgMDAgMDAgKGFsbCAwKQorICAgIHZhbDEgPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KHZhbDIsIDg1KTsgLy8wMSAwMSAwMSAwMSAoYWxsIDEpCisgICAgdmFsMiA9IF9tbV9zaHVmZmxlbG9fZXBpMTYodmFsMiwgMTcwKTsgLy8xMCAxMCAxMCAxMCAoYWxsIDIpCisgICAgX002NCh2LnZhbFswXSwgdmFsMCk7CisgICAgX002NCh2LnZhbFsxXSwgdmFsMSk7CisgICAgX002NCh2LnZhbFsyXSwgdmFsMik7CisgICAgcmV0dXJuIHY7Cit9CisKK3VpbnQzMngyeDNfdCB2bGQzX2R1cF91MzIoX190cmFuc2ZlcnNpemUoMykgdWludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjMyIHtkMFtdLCBkMVtdLCBkMltdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MzJ4MngzX3QgdmxkM19kdXBfdTMyKF9fdHJhbnNmZXJzaXplKDMpIHVpbnQzMl90IGNvbnN0ICogcHRyKSAvLyBWTEQzLjMyIHtkMFtdLCBkMVtdLCBkMltdfSwgW3IwXQoreworICAgIHVpbnQzMngyeDNfdCB2OworICAgIF9fbTEyOGkgdmFsMCwgdmFsMSwgdmFsMjsKKyAgICB2YWwyID0gTE9BRF9TSTEyOChwdHIpOyAvLzAsMSwyLHgKKyAgICB2YWwwID0gX21tX3NodWZmbGVfZXBpMzIodmFsMiwgICAwIHwgKDAgPDwgMikgfCAoMiA8PCA0KSB8ICgyIDw8IDYpKTsgLy8wLDAsMiwyCisgICAgdmFsMSA9IF9tbV9zaHVmZmxlX2VwaTMyKHZhbDIsICAgMSB8ICgxIDw8IDIpIHwgKDIgPDwgNCkgfCAoMiA8PCA2KSk7IC8vMSwxLDIsMgorICAgIHZhbDIgPSBfbW1fc3JsaV9zaTEyOCh2YWwwLCA4KTsgLy8yLDIsMHgwLDB4MAorICAgIF9NNjQodi52YWxbMF0sIHZhbDApOworICAgIF9NNjQodi52YWxbMV0sIHZhbDEpOworICAgIF9NNjQodi52YWxbMl0sIHZhbDIpOworICAgIHJldHVybiB2OworfQorCit1aW50NjR4MXgzX3QgdmxkM19kdXBfdTY0KF9fdHJhbnNmZXJzaXplKDMpIHVpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDAsIGQxLCBkMn0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDF4M190IHZsZDNfZHVwX3U2NChfX3RyYW5zZmVyc2l6ZSgzKSB1aW50NjRfdCBjb25zdCAqIHB0cikgLy8gVkxEMS42NCB7ZDAsIGQxLCBkMn0sIFtyMF0KK3sKKyAgICB1aW50NjR4MXgzX3QgdjsKKyAgICB2LnZhbFswXS5tNjRfdTY0WzBdID0gKihwdHIpOworICAgIHYudmFsWzFdLm02NF91NjRbMF0gPSAqKHB0ciArIDEpOworICAgIHYudmFsWzJdLm02NF91NjRbMF0gPSAqKHB0ciArIDIpOworICAgIHJldHVybiB2OworfQorCitpbnQ4eDh4M190IHZsZDNfZHVwX3M4KF9fdHJhbnNmZXJzaXplKDMpIGludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuOCB7ZDBbXSwgZDFbXSwgZDJbXX0sIFtyMF0KKyNkZWZpbmUgdmxkM19kdXBfczgocHRyKSB2bGQzX2R1cF91OCgodWludDhfdCopcHRyKQorCitpbnQxNng0eDNfdCB2bGQzX2R1cF9zMTYoX190cmFuc2ZlcnNpemUoMykgaW50MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMTYge2QwW10sIGQxW10sIGQyW119LCBbcjBdCisjZGVmaW5lIHZsZDNfZHVwX3MxNihwdHIpIHZsZDNfZHVwX3UxNigodWludDE2X3QqKXB0cikKKworaW50MzJ4MngzX3QgdmxkM19kdXBfczMyKF9fdHJhbnNmZXJzaXplKDMpIGludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQzLjMyIHtkMFtdLCBkMVtdLCBkMltdfSwgW3IwXQorI2RlZmluZSB2bGQzX2R1cF9zMzIocHRyKSB2bGQzX2R1cF91MzIoKHVpbnQzMl90KilwdHIpCisKK2ludDY0eDF4M190IHZsZDNfZHVwX3M2NChfX3RyYW5zZmVyc2l6ZSgzKSBpbnQ2NF90IGNvbnN0ICogcHRyKTsgLy8gVkxEMS42NCB7ZDAsIGQxLCBkMn0sIFtyMF0KKyNkZWZpbmUgdmxkM19kdXBfczY0KHB0cikgdmxkM19kdXBfdTY0KCh1aW50NjRfdCopcHRyKQorCisKK2Zsb2F0MTZ4NHgzX3QgdmxkM19kdXBfZjE2KF9fdHJhbnNmZXJzaXplKDMpIF9fZnAxNiBjb25zdCAqIHB0cik7IC8vIFZMRDMuMTYge2QwW10sIGQxW10sIGQyW119LCBbcjBdCisvLyBJQTMyIFNJTUQgZG9lc24ndCB3b3JrIHdpdGggMTZiaXQgZmxvYXRzIGN1cnJlbnRseSwgc28gbmVlZCB0byBnbyB0byAzMiBiaXQgYW5kIHRoZW4gd29yayB3aXRoIHR3byAxMjhiaXQgcmVnaXN0ZXJzLiBTZWUgdmxkMXFfZjE2IGZvciBleGFtcGxlCisKK2Zsb2F0MzJ4MngzX3QgdmxkM19kdXBfZjMyKF9fdHJhbnNmZXJzaXplKDMpIGZsb2F0MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMzIge2QwW10sIGQxW10sIGQyW119LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4MngzX3QgdmxkM19kdXBfZjMyKF9fdHJhbnNmZXJzaXplKDMpIGZsb2F0MzJfdCBjb25zdCAqIHB0cikgLy8gVkxEMy4zMiB7ZDBbXSwgZDFbXSwgZDJbXX0sIFtyMF0KK3sKKyAgICBmbG9hdDMyeDJ4M190IHY7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaTwzOyBpKyspIHsKKyAgICAgICAgdi52YWxbaV0ubTY0X2YzMlswXSA9ICoocHRyICsgaSk7CisgICAgICAgIHYudmFsW2ldLm02NF9mMzJbMV0gPSAqKHB0ciArIGkpOworICAgIH0KKyAgICByZXR1cm4gdjsKK30KKworcG9seTh4OHgzX3QgdmxkM19kdXBfcDgoX190cmFuc2ZlcnNpemUoMykgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuOCB7ZDBbXSwgZDFbXSwgZDJbXX0sIFtyMF0KKyNkZWZpbmUgdmxkM19kdXBfcDggdmxkM19kdXBfdTgKKworcG9seTE2eDR4M190IHZsZDNfZHVwX3AxNihfX3RyYW5zZmVyc2l6ZSgzKSBwb2x5MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDMuMTYge2QwW10sIGQxW10sIGQyW119LCBbcjBdCisjZGVmaW5lIHZsZDNfZHVwX3AxNiB2bGQzX2R1cF9zMTYKKworCisvLyoqKioqKioqKioqKiogRHVwbGljYXRlIChvciBwcm9wYWdhdGUpIHF1YWRydXBsZXM6ICoqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vcHRyWzBdIHRvIGFsbCB2YWxbMF0gbGFuZXMsIHB0clsxXSB0byBhbGwgdmFsWzFdIGxhbmVzLCBwdHJbMl0gdG8gYWxsIHZhbFsyXSBsYW5lcyAgYW5kICBwdHJbM10gdG8gYWxsIHZhbFszXSBsYW5lcwordWludDh4OHg0X3QgdmxkNF9kdXBfdTgoX190cmFuc2ZlcnNpemUoNCkgdWludDhfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuOCB7ZDBbXSwgZDFbXSwgZDJbXSwgZDNbXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OHg0X3QgdmxkNF9kdXBfdTgoX190cmFuc2ZlcnNpemUoNCkgdWludDhfdCBjb25zdCAqIHB0cikgLy8gVkxENC44IHtkMFtdLCBkMVtdLCBkMltdLCBkM1tdfSwgW3IwXQoreworICAgIHVpbnQ4eDh4NF90IHY7CisgICAgX19tMTI4aSB2YWwwLCB2YWwxLCB2YWwyOworICAgIHZhbDAgPSBMT0FEX1NJMTI4KHB0cik7IC8vMCwxLDIsMywgeCx4LHgseCx4LHgseCx4LCB4LHgseCx4CisgICAgdmFsMSA9IF9tbV91bnBhY2tsb19lcGk4KHZhbDAsdmFsMCk7IC8vMCwwLDEsMSwyLDIsMywzLCB4LHgseCx4LHgseCx4LHgsCisgICAgdmFsMSA9IF9tbV91bnBhY2tsb19lcGkxNih2YWwxLHZhbDEpOyAvLzAsMCwwLDAsIDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzCisgICAgdmFsMCA9IF9tbV91bnBhY2tsb19lcGkzMih2YWwxLHZhbDEpOyAvLzAsMCwwLDAsIDAsMCwwLDAsMSwxLDEsMSwxLDEsMSwxLAorICAgIHZhbDIgPSBfbW1fdW5wYWNraGlfZXBpMzIodmFsMSx2YWwxKTsgLy8gMiwyLDIsMiwyLDIsMiwyLCAzLDMsMywzLCAzLDMsMywzCisgICAgdnN0MXFfdTgoJnYudmFsWzBdLCB2YWwwKTsKKyAgICB2c3QxcV91OCgmdi52YWxbMl0sIHZhbDIpOworICAgIHJldHVybiB2OworfQorCit1aW50MTZ4NHg0X3QgdmxkNF9kdXBfdTE2KF9fdHJhbnNmZXJzaXplKDQpIHVpbnQxNl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4xNiB7ZDBbXSwgZDFbXSwgZDJbXSwgZDNbXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDR4NF90IHZsZDRfZHVwX3UxNihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MTZfdCBjb25zdCAqIHB0cikgLy8gVkxENC4xNiB7ZDBbXSwgZDFbXSwgZDJbXSwgZDNbXX0sIFtyMF0KK3sKKyAgICB1aW50MTZ4NHg0X3QgdjsKKyAgICBfX20xMjhpIHZhbDAsIHZhbDEsIHZhbDIsIHZhbDM7CisgICAgdmFsMyA9IExPQURfU0kxMjgocHRyKTsgLy8wLDEsMiwzLCB4LHgseCx4CisgICAgdmFsMCA9IF9tbV9zaHVmZmxlbG9fZXBpMTYodmFsMywgMCk7IC8vMDAgMDAgMDAgMDAgKGFsbCAwKQorICAgIHZhbDEgPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KHZhbDMsIDg1KTsgLy8wMSAwMSAwMSAwMSAoYWxsIDEpCisgICAgdmFsMiA9IF9tbV9zaHVmZmxlbG9fZXBpMTYodmFsMywgMTcwKTsgLy8xMCAxMCAxMCAxMCAoYWxsIDIpCisgICAgdmFsMyA9IF9tbV9zaHVmZmxlbG9fZXBpMTYodmFsMywgMjU1KTsgLy8xMSAxMSAxMSAxMSAoYWxsIDMpCisgICAgX002NCh2LnZhbFswXSwgdmFsMCk7CisgICAgX002NCh2LnZhbFsxXSwgdmFsMSk7CisgICAgX002NCh2LnZhbFsyXSwgdmFsMik7CisgICAgX002NCh2LnZhbFszXSwgdmFsMyk7CisgICAgcmV0dXJuIHY7Cit9CisKK3VpbnQzMngyeDRfdCB2bGQ0X2R1cF91MzIoX190cmFuc2ZlcnNpemUoNCkgdWludDMyX3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjMyIHtkMFtdLCBkMVtdLCBkMltdLCBkM1tdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Mng0X3QgdmxkNF9kdXBfdTMyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQzMl90IGNvbnN0ICogcHRyKSAvLyBWTEQ0LjMyIHtkMFtdLCBkMVtdLCBkMltdLCBkM1tdfSwgW3IwXQoreworICAgIHVpbnQzMngyeDRfdCB2OworICAgIF9fbTEyOGkgdmFsMCwgdmFsMSwgdmFsMiwgdmFsMzsKKyAgICB2YWwzID0gTE9BRF9TSTEyOChwdHIpOyAvLzAsMSwyLDMKKyAgICB2YWwwID0gX21tX3NodWZmbGVfZXBpMzIodmFsMywgICAwIHwgKDAgPDwgMikgfCAoMiA8PCA0KSB8ICgzIDw8IDYpKTsgLy8wLDAsMiwzCisgICAgdmFsMSA9IF9tbV9zaHVmZmxlX2VwaTMyKHZhbDMsICAgMSB8ICgxIDw8IDIpIHwgKDIgPDwgNCkgfCAoMyA8PCA2KSk7IC8vMSwxLDIsMworICAgIHZhbDIgPSBfbW1fc2h1ZmZsZV9lcGkzMih2YWwzLCAgIDIgfCAoMiA8PCAyKSB8ICgzIDw8IDQpIHwgKDMgPDwgNikpOyAvLzIsMiwzLDMKKyAgICB2YWwzID0gX21tX3NodWZmbGVfZXBpMzIodmFsMywgICAzIHwgKDMgPDwgMikgfCAoMyA8PCA0KSB8ICgzIDw8IDYpKTsgLy8zLDMsMiwyCisgICAgX002NCh2LnZhbFswXSwgdmFsMCk7CisgICAgX002NCh2LnZhbFsxXSwgdmFsMSk7CisgICAgX002NCh2LnZhbFsyXSwgdmFsMik7CisgICAgX002NCh2LnZhbFszXSwgdmFsMyk7CisgICAgcmV0dXJuIHY7Cit9CisKK3VpbnQ2NHgxeDRfdCB2bGQ0X2R1cF91NjQoX190cmFuc2ZlcnNpemUoNCkgdWludDY0X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQxLjY0IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDF4NF90IHZsZDRfZHVwX3U2NChfX3RyYW5zZmVyc2l6ZSg0KSB1aW50NjRfdCBjb25zdCAqIHB0cikgLy8gVkxEMS42NCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCit7CisgICAgdWludDY0eDF4NF90IHY7CisgICAgdi52YWxbMF0ubTY0X3U2NFswXSA9ICoocHRyKTsKKyAgICB2LnZhbFsxXS5tNjRfdTY0WzBdID0gKihwdHIgKyAxKTsKKyAgICB2LnZhbFsyXS5tNjRfdTY0WzBdID0gKihwdHIgKyAyKTsKKyAgICB2LnZhbFszXS5tNjRfdTY0WzBdID0gKihwdHIgKyAzKTsKKyAgICByZXR1cm4gdjsKK30KKworaW50OHg4eDRfdCB2bGQ0X2R1cF9zOChfX3RyYW5zZmVyc2l6ZSg0KSBpbnQ4X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0Ljgge2QwW10sIGQxW10sIGQyW10sIGQzW119LCBbcjBdCisjZGVmaW5lIHZsZDRfZHVwX3M4KHB0cikgdmxkNF9kdXBfdTgoKHVpbnQ4X3QqKXB0cikKKworaW50MTZ4NHg0X3QgdmxkNF9kdXBfczE2KF9fdHJhbnNmZXJzaXplKDQpIGludDE2X3QgY29uc3QgKiBwdHIpOyAvLyBWTEQ0LjE2IHtkMFtdLCBkMVtdLCBkMltdLCBkM1tdfSwgW3IwXQorI2RlZmluZSB2bGQ0X2R1cF9zMTYocHRyKSB2bGQ0X2R1cF91MTYoKHVpbnQxNl90KilwdHIpCisKK2ludDMyeDJ4NF90IHZsZDRfZHVwX3MzMihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQzMl90IGNvbnN0ICogcHRyKTsgLy8gVkxENC4zMiB7ZDBbXSwgZDFbXSwgZDJbXSwgZDNbXX0sIFtyMF0KKyNkZWZpbmUgdmxkNF9kdXBfczMyKHB0cikgdmxkNF9kdXBfdTMyKCh1aW50MzJfdCopcHRyKQorCitpbnQ2NHgxeDRfdCB2bGQ0X2R1cF9zNjQoX190cmFuc2ZlcnNpemUoNCkgaW50NjRfdCBjb25zdCAqIHB0cik7IC8vIFZMRDEuNjQge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorI2RlZmluZSB2bGQ0X2R1cF9zNjQocHRyKSB2bGQ0X2R1cF91NjQoKHVpbnQ2NF90KilwdHIpCisKK2Zsb2F0MTZ4NHg0X3QgdmxkNF9kdXBfZjE2KF9fdHJhbnNmZXJzaXplKDQpIF9fZnAxNiBjb25zdCAqIHB0cik7IC8vIFZMRDQuMTYge2QwW10sIGQxW10sIGQyW10sIGQzW119LCBbcjBdCisvLyBJQTMyIFNJTUQgZG9lc24ndCB3b3JrIHdpdGggMTZiaXQgZmxvYXRzIGN1cnJlbnRseSwgc28gbmVlZCB0byBnbyB0byAzMiBiaXQgYW5kIHRoZW4gd29yayB3aXRoIHR3byAxMjhiaXQgcmVnaXN0ZXJzLiBTZWUgdmxkMXFfZjE2IGZvciBleGFtcGxlCisKK2Zsb2F0MzJ4Mng0X3QgdmxkNF9kdXBfZjMyKF9fdHJhbnNmZXJzaXplKDQpIGZsb2F0MzJfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMzIge2QwW10sIGQxW10sIGQyW10sIGQzW119LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Mng0X3QgdmxkNF9kdXBfZjMyKF9fdHJhbnNmZXJzaXplKDQpIGZsb2F0MzJfdCBjb25zdCAqIHB0cikgLy8gVkxENC4zMiB7ZDBbXSwgZDFbXSwgZDJbXSwgZDNbXX0sIFtyMF0KK3sKKyAgICBmbG9hdDMyeDJ4NF90IHY7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaTw0OyBpKyspIHsKKyAgICAgICAgdi52YWxbaV0ubTY0X2YzMlswXSA9ICoocHRyICsgaSk7CisgICAgICAgIHYudmFsW2ldLm02NF9mMzJbMV0gPSAqKHB0ciArIGkpOworICAgIH0KKyAgICByZXR1cm4gdjsKK30KKworcG9seTh4OHg0X3QgdmxkNF9kdXBfcDgoX190cmFuc2ZlcnNpemUoNCkgcG9seThfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuOCB7ZDBbXSwgZDFbXSwgZDJbXSwgZDNbXX0sIFtyMF0KKyNkZWZpbmUgdmxkNF9kdXBfcDggdmxkNF9kdXBfdTgKKworcG9seTE2eDR4NF90IHZsZDRfZHVwX3AxNihfX3RyYW5zZmVyc2l6ZSg0KSBwb2x5MTZfdCBjb25zdCAqIHB0cik7IC8vIFZMRDQuMTYge2QwW10sIGQxW10sIGQyW10sIGQzW119LCBbcjBdCisjZGVmaW5lIHZsZDRfZHVwX3AxNiB2bGQ0X2R1cF91MTYKKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKkxhbmUgbG9hZHMgZm9yICBhbiBOLWVsZW1lbnQgc3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKiogTGFuZSBwYWlycyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL2RvZXMgdmxkMV9sYW5lX3h4IHB0clswXSB0byBzcmMtPnZhbFswXSBhdCBsYW5lIHBvc2l0b24gYW5kIHB0clsxXSB0byBzcmMtPnZhbFsxXSBhdCBsYW5lIHBvc2l0b24KKy8vd2UgYXNzdW1lICBzcmMgaXMgMTYgYml0IGFsaWduZWQKKworLy8hISEhISEgTWljcm9zb2Z0IGNvbXBpbGVyIGRvZXMgbm90IGFsbG93IHh4eHh4eF8ydCBmdW5jdGlvbiBhcmd1bWVudHMgcmVzdWx0aW5nIGluICJmb3JtYWwgcGFyYW1ldGVyIHdpdGggX19kZWNsc3BlYyhhbGlnbignMTYnKSkgd29uJ3QgYmUgYWxpZ25lZCIgZXJyb3IKKy8vdG8gZml4IGl0IHRoZSBhbGwgZnVuY3Rpb25zIGJlbG93IHdvcmsgd2l0aCAgeHh4eHh4XzJ0IHBvaW50ZXJzIGFuZCB0aGUgY29ycmVzcG9uZGluZyBvcmlnaW5hbCBmdW5jdGlvbnMgYXJlIHJlZGVmaW5lZAorCisvL3VpbnQxNng4eDJfdCB2bGQycV9sYW5lX3UxNihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50MTZfdCBjb25zdCAqIHB0ciwgdWludDE2eDh4Ml90IHNyYyxfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7Ly8gVkxEMi4xNiB7ZDBbMF0sIGQyWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OHgyX3QgdmxkMnFfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQxNl90IGNvbnN0ICogcHRyLCB1aW50MTZ4OHgyX3QqIHNyYyxfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSkgLy8gVkxEMi4xNiB7ZDBbMF0sIGQyWzBdfSwgW3IwXQoreworICAgIHVpbnQxNng4eDJfdCB2OworICAgIHYudmFsWzBdID0gdmxkMXFfbGFuZV9zMTYgKHB0ciwgc3JjLT52YWxbMF0sICBsYW5lKTsKKyAgICB2LnZhbFsxXSA9IHZsZDFxX2xhbmVfczE2ICgocHRyICsgMSksIHNyYy0+dmFsWzFdLCAgbGFuZSk7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDJxX2xhbmVfdTE2KHB0ciwgc3JjLCBsYW5lKSB2bGQycV9sYW5lX3UxNl9wdHIocHRyLCAmc3JjLCBsYW5lKQorCisvL3VpbnQzMng0eDJfdCB2bGQycV9sYW5lX3UzMihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50MzJfdCBjb25zdCAqIHB0ciwgdWludDMyeDR4Ml90IHNyYyxfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7Ly8gVkxEMi4zMiB7ZDBbMF0sIGQyWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NHgyX3QgdmxkMnFfbGFuZV91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQzMl90IGNvbnN0ICogcHRyLCB1aW50MzJ4NHgyX3QqIHNyYyxfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkgLy8gVkxEMi4zMiB7ZDBbMF0sIGQyWzBdfSwgW3IwXQoreworICAgIHVpbnQzMng0eDJfdCB2OworICAgIHYudmFsWzBdID0gX01NX0lOU0VSVF9FUEkzMiAoc3JjLT52YWxbMF0sICBwdHJbMF0sIGxhbmUpOworICAgIHYudmFsWzFdID0gX01NX0lOU0VSVF9FUEkzMiAoc3JjLT52YWxbMV0sICBwdHJbMV0sIGxhbmUpOworICAgIHJldHVybiB2OworfQorI2RlZmluZSB2bGQycV9sYW5lX3UzMihwdHIsIHNyYywgbGFuZSkgdmxkMnFfbGFuZV91MzJfcHRyKHB0ciwgJnNyYywgbGFuZSkKKworLy9pbnQxNng4eDJfdCB2bGQycV9sYW5lX3MxNihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQxNl90IGNvbnN0ICogcHRyLCBpbnQxNng4eDJfdCBzcmMsIF9fY29uc3RyYW5nZSgwLDcpaW50IGxhbmUpOy8vIFZMRDIuMTYge2QwWzBdLCBkMlswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OHgyX3QgdmxkMnFfbGFuZV9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIGludDE2X3QgY29uc3QgKiBwdHIsIGludDE2eDh4Ml90KiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKQoreworICAgIGludDE2eDh4Ml90IHY7CisgICAgdi52YWxbMF0gPSB2bGQxcV9sYW5lX3MxNiAocHRyLCBzcmMtPnZhbFswXSwgIGxhbmUpOworICAgIHYudmFsWzFdID0gdmxkMXFfbGFuZV9zMTYgKChwdHIgKyAxKSwgc3JjLT52YWxbMV0sICBsYW5lKTsKKyAgICByZXR1cm4gdjsKK30KKyNkZWZpbmUgdmxkMnFfbGFuZV9zMTYocHRyLCBzcmMsIGxhbmUpIHZsZDJxX2xhbmVfczE2X3B0cihwdHIsICZzcmMsIGxhbmUpCisKKy8vaW50MzJ4NHgyX3QgdmxkMnFfbGFuZV9zMzIoX190cmFuc2ZlcnNpemUoMikgaW50MzJfdCBjb25zdCAqIHB0ciwgaW50MzJ4NHgyX3Qgc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKWludCBsYW5lKTsvLyBWTEQyLjMyIHtkMFswXSwgZDJbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDR4Ml90IHZsZDJxX2xhbmVfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQzMl90IGNvbnN0ICogcHRyLCBpbnQzMng0eDJfdCogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkKK3sKKyAgICBpbnQzMng0eDJfdCB2OworICAgIHYudmFsWzBdID0gX01NX0lOU0VSVF9FUEkzMiAoc3JjLT52YWxbMF0sICBwdHJbMF0sIGxhbmUpOworICAgIHYudmFsWzFdID0gX01NX0lOU0VSVF9FUEkzMiAoc3JjLT52YWxbMV0sICBwdHJbMV0sIGxhbmUpOworICAgIHJldHVybiB2OworfQorI2RlZmluZSB2bGQycV9sYW5lX3MzMihwdHIsIHNyYywgbGFuZSkgdmxkMnFfbGFuZV9zMzJfcHRyKHB0ciwgJnNyYywgbGFuZSkKKworLy9mbG9hdDE2eDh4Ml90IHZsZDJxX2xhbmVfZjE2KF9fdHJhbnNmZXJzaXplKDIpIF9fZnAxNiBjb25zdCAqIHB0ciwgZmxvYXQxNng4eDJfdCBzcmMsIF9fY29uc3RyYW5nZSgwLDcpaW50IGxhbmUpOy8vIFZMRDIuMTYge2QwWzBdLCBkMlswXX0sIFtyMF0KKy8vY3VycmVudCBJQSBTSU1EIGRvZXNuJ3Qgc3VwcG9ydCBmbG9hdDE2CisKKy8vZmxvYXQzMng0eDJfdCB2bGQycV9sYW5lX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoMikgZmxvYXQzMl90IGNvbnN0ICogcHRyLCBmbG9hdDMyeDR4Ml90IHNyYyxfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7Ly8gVkxEMi4zMiB7ZDBbMF0sIGQyWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDR4Ml90IHZsZDJxX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIsIGZsb2F0MzJ4NHgyX3QqIHNyYyxfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkgLy8gVkxEMi4zMiB7ZDBbMF0sIGQyWzBdfSwgW3IwXQoreworICAgIGZsb2F0MzJ4NHgyX3QgdjsKKyAgICB2LnZhbFswXSA9IHZsZDFxX2xhbmVfZjMyKHB0ciwgc3JjLT52YWxbMF0sIGxhbmUpOworICAgIHYudmFsWzFdID0gdmxkMXFfbGFuZV9mMzIoKHB0ciArIDEpLCBzcmMtPnZhbFsxXSwgbGFuZSk7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDJxX2xhbmVfZjMyKHB0cixzcmMsbGFuZSkgdmxkMnFfbGFuZV9mMzJfcHRyKHB0ciwmc3JjLGxhbmUpCisKKy8vcG9seTE2eDh4Ml90IHZsZDJxX2xhbmVfcDE2KF9fdHJhbnNmZXJzaXplKDIpIHBvbHkxNl90IGNvbnN0ICogcHRyLCBwb2x5MTZ4OHgyX3Qgc3JjLF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsvLyBWTEQyLjE2IHtkMFswXSwgZDJbMF19LCBbcjBdCisjZGVmaW5lIHZsZDJxX2xhbmVfcDE2IHZsZDJxX2xhbmVfdTE2CisKKy8vdWludDh4OHgyX3QgdmxkMl9sYW5lX3U4KF9fdHJhbnNmZXJzaXplKDIpIHVpbnQ4X3QgY29uc3QgKiBwdHIsIHVpbnQ4eDh4Ml90IHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOy8vIFZMRDIuOCB7ZDBbMF0sIGQxWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50OHg4eDJfdCB2bGQyX2xhbmVfdThfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQ4X3QgY29uc3QgKiBwdHIsIHVpbnQ4eDh4Ml90KiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKSAvLyBWTEQyLjgge2QwWzBdLCBkMVswXX0sIFtyMF0KK3sKKyAgICB1aW50OHg4eDJfdCB2OworICAgIHYudmFsWzBdID0gdmxkMV9sYW5lX3U4KHB0ciwgc3JjLT52YWxbMF0sIGxhbmUpOworICAgIHYudmFsWzFdID0gdmxkMV9sYW5lX3U4KChwdHIgKyAxKSwgc3JjLT52YWxbMV0sIGxhbmUpOworICAgIHJldHVybiB2OworfQorI2RlZmluZSB2bGQyX2xhbmVfdTgocHRyLCBzcmMsIGxhbmUpIHZsZDJfbGFuZV91OF9wdHIocHRyLCAmc3JjLCBsYW5lKQorCisvL3VpbnQxNng0eDJfdCB2bGQyX2xhbmVfdTE2KF9fdHJhbnNmZXJzaXplKDIpIHVpbnQxNl90IGNvbnN0ICogcHRyLCB1aW50MTZ4NHgyX3Qgc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKWludCBsYW5lKTsvLyBWTEQyLjE2IHtkMFswXSwgZDFbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0eDJfdCB2bGQyX2xhbmVfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50MTZfdCBjb25zdCAqIHB0ciwgdWludDE2eDR4Ml90KiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKQoreworICAgIHVpbnQxNng0eDJfdCB2OworICAgIHYudmFsWzBdICA9ICB2bGQxX2xhbmVfdTE2KHB0ciwgc3JjLT52YWxbMF0sIGxhbmUpOworICAgIHYudmFsWzFdICA9IHZsZDFfbGFuZV91MTYoKHB0ciArIDEpLCBzcmMtPnZhbFsxXSwgbGFuZSk7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDJfbGFuZV91MTYocHRyLCBzcmMsIGxhbmUpIHZsZDJfbGFuZV91MTZfcHRyKHB0ciwgJnNyYywgbGFuZSkKKworLy91aW50MzJ4MngyX3QgdmxkMl9sYW5lX3UzMihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50MzJfdCBjb25zdCAqIHB0ciwgdWludDMyeDJ4Ml90IHNyYywgX19jb25zdHJhbmdlKDAsMSlpbnQgbGFuZSk7Ly8gVkxEMi4zMiB7ZDBbMF0sIGQxWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MzJ4MngyX3QgdmxkMl9sYW5lX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoMikgdWludDMyX3QgY29uc3QgKiBwdHIsIHVpbnQzMngyeDJfdCogc3JjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSkKK3sKKyAgICB1aW50MzJ4MngyX3QgdjsKKyAgICB2LnZhbFswXSAgPSAgdmxkMV9sYW5lX3UzMihwdHIsIHNyYy0+dmFsWzBdLCBsYW5lKTsKKyAgICB2LnZhbFsxXSAgPSB2bGQxX2xhbmVfdTMyKChwdHIgKyAxKSwgc3JjLT52YWxbMV0sIGxhbmUpOworICAgIHJldHVybiB2OworfQorI2RlZmluZSB2bGQyX2xhbmVfdTMyKHB0ciwgc3JjLCBsYW5lKSB2bGQyX2xhbmVfdTMyX3B0cihwdHIsICZzcmMsIGxhbmUpCisKKy8vaW50OHg4eDJfdCB2bGQyX2xhbmVfczgoX190cmFuc2ZlcnNpemUoMikgaW50OF90IGNvbnN0ICogcHRyLCBpbnQ4eDh4Ml90IHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOy8vIFZMRDIuOCB7ZDBbMF0sIGQxWzBdfSwgW3IwXQoraW50OHg4eDJfdCB2bGQyX2xhbmVfczhfcHRyKF9fdHJhbnNmZXJzaXplKDIpIGludDhfdCBjb25zdCAqIHB0ciwgaW50OHg4eDJfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQyLjgge2QwWzBdLCBkMVswXX0sIFtyMF0KKyNkZWZpbmUgdmxkMl9sYW5lX3M4KHB0ciwgc3JjLCBsYW5lKSAgdmxkMl9sYW5lX3U4KCggdWludDhfdCopIHB0ciwgc3JjLCBsYW5lKQorCisvL2ludDE2eDR4Ml90IHZsZDJfbGFuZV9zMTYoX190cmFuc2ZlcnNpemUoMikgaW50MTZfdCBjb25zdCAqIHB0ciwgaW50MTZ4NHgyX3Qgc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7Ly8gVkxEMi4xNiB7ZDBbMF0sIGQxWzBdfSwgW3IwXQoraW50MTZ4NHgyX3QgdmxkMl9sYW5lX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoMikgaW50MTZfdCBjb25zdCAqIHB0ciwgaW50MTZ4NHgyX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMi4xNiB7ZDBbMF0sIGQxWzBdfSwgW3IwXQorI2RlZmluZSB2bGQyX2xhbmVfczE2KHB0ciwgc3JjLCBsYW5lKSB2bGQyX2xhbmVfdTE2KCggdWludDE2X3QqKSBwdHIsIHNyYywgbGFuZSkKKworLy9pbnQzMngyeDJfdCB2bGQyX2xhbmVfczMyKF9fdHJhbnNmZXJzaXplKDIpIGludDMyX3QgY29uc3QgKiBwdHIsIGludDMyeDJ4Ml90IHNyYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOy8vIFZMRDIuMzIge2QwWzBdLCBkMVswXX0sIFtyMF0KK2ludDMyeDJ4Ml90IHZsZDJfbGFuZV9zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDIpIGludDMyX3QgY29uc3QgKiBwdHIsIGludDMyeDJ4Ml90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZMRDIuMzIge2QwWzBdLCBkMVswXX0sIFtyMF0KKyNkZWZpbmUgdmxkMl9sYW5lX3MzMihwdHIsIHNyYywgbGFuZSkgdmxkMl9sYW5lX3UzMigoIHVpbnQzMl90KikgcHRyLCBzcmMsIGxhbmUpCisKKy8vZmxvYXQxNng0eDJfdCB2bGQyX2xhbmVfZjE2KF9fdHJhbnNmZXJzaXplKDIpIF9fZnAxNiBjb25zdCAqIHB0ciwgZmxvYXQxNng0eDJfdCBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxEMi4xNiB7ZDBbMF0sIGQxWzBdfSwgW3IwXQorLy9jdXJyZW50IElBIFNJTUQgZG9lc24ndCBzdXBwb3J0IGZsb2F0MTYKKworZmxvYXQzMngyeDJfdCB2bGQyX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIsIGZsb2F0MzJ4MngyX3QgKiBzcmMsX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTEQyLjMyIHtkMFswXSwgZDFbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4MngyX3QgdmxkMl9sYW5lX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoMikgZmxvYXQzMl90IGNvbnN0ICogcHRyLCBmbG9hdDMyeDJ4Ml90ICogc3JjLF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKQoreworICAgIGZsb2F0MzJ4MngyX3QgdjsKKyAgICB2LnZhbFswXSA9IHZsZDFfbGFuZV9mMzIocHRyLCBzcmMtPnZhbFswXSwgbGFuZSk7CisgICAgdi52YWxbMV0gPSB2bGQxX2xhbmVfZjMyKChwdHIgKyAxKSwgc3JjLT52YWxbMV0sIGxhbmUpOworICAgIHJldHVybiB2OworfQorI2RlZmluZSB2bGQyX2xhbmVfZjMyKHB0ciwgc3JjLCBsYW5lKSB2bGQyX2xhbmVfZjMyX3B0cihwdHIsICZzcmMsIGxhbmUpCisKKy8vcG9seTh4OHgyX3QgdmxkMl9sYW5lX3A4KF9fdHJhbnNmZXJzaXplKDIpIHBvbHk4X3QgY29uc3QgKiBwdHIsIHBvbHk4eDh4Ml90IHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOy8vIFZMRDIuOCB7ZDBbMF0sIGQxWzBdfSwgW3IwXQorcG9seTh4OHgyX3QgdmxkMl9sYW5lX3A4X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBwb2x5OF90IGNvbnN0ICogcHRyLCBwb2x5OHg4eDJfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQyLjgge2QwWzBdLCBkMVswXX0sIFtyMF0KKyNkZWZpbmUgdmxkMl9sYW5lX3A4IHZsZDJfbGFuZV91OAorCisvL3BvbHkxNng0eDJfdCB2bGQyX2xhbmVfcDE2KF9fdHJhbnNmZXJzaXplKDIpIHBvbHkxNl90IGNvbnN0ICogcHRyLCBwb2x5MTZ4NHgyX3Qgc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKWludCBsYW5lKTsvLyBWTEQyLjE2IHtkMFswXSwgZDFbMF19LCBbcjBdCitwb2x5MTZ4NHgyX3QgdmxkMl9sYW5lX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoMikgcG9seTE2X3QgY29uc3QgKiBwdHIsIHBvbHkxNng0eDJfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTEQyLjE2IHtkMFswXSwgZDFbMF19LCBbcjBdCisjZGVmaW5lIHZsZDJfbGFuZV9wMTYgdmxkMl9sYW5lX3UxNgorCisvLyoqKioqKioqKioqIExhbmUgdHJpcGxldHMgKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL2RvZXMgdmxkMV9sYW5lX3h4IHB0clswXSB0byBzcmMtPnZhbFswXSwgcHRyWzFdIHRvIHNyYy0+dmFsWzFdIGFuZCBwdHJbMl0gdG8gc3JjLT52YWxbMl0gYXQgbGFuZSBwb3NpdG9uCisvL3dlIGFzc3VtZSBzcmMgaXMgMTYgYml0IGFsaWduZWQKKworLy91aW50MTZ4OHgzX3QgdmxkM3FfbGFuZV91MTYoX190cmFuc2ZlcnNpemUoMykgdWludDE2X3QgY29uc3QgKiBwdHIsIHVpbnQxNng4eDNfdCBzcmMsX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOy8vIFZMRDMuMTYge2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4eDNfdCB2bGQzcV9sYW5lX3UxNl9wdHIoX190cmFuc2ZlcnNpemUoMykgdWludDE2X3QgY29uc3QgKiBwdHIsIHVpbnQxNng4eDNfdCogc3JjLF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKSAvLyBWTEQzLjE2IHtkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQoreworICAgIHVpbnQxNng4eDNfdCB2OworICAgIHYudmFsWzBdID0gX01NX0lOU0VSVF9FUEkxNiAoIHNyYy0+dmFsWzBdLCAgcHRyWzBdLCBsYW5lKTsKKyAgICB2LnZhbFsxXSA9IF9NTV9JTlNFUlRfRVBJMTYgKCBzcmMtPnZhbFsxXSwgIHB0clsxXSwgbGFuZSk7CisgICAgdi52YWxbMl0gPSBfTU1fSU5TRVJUX0VQSTE2ICggc3JjLT52YWxbMl0sICBwdHJbMl0sIGxhbmUpOworICAgIHJldHVybiB2OworfQorI2RlZmluZSB2bGQzcV9sYW5lX3UxNihwdHIsIHNyYywgbGFuZSkgdmxkM3FfbGFuZV91MTZfcHRyKHB0ciwgJnNyYywgbGFuZSkKKworLy91aW50MzJ4NHgzX3QgdmxkM3FfbGFuZV91MzIoX190cmFuc2ZlcnNpemUoMykgdWludDMyX3QgY29uc3QgKiBwdHIsIHVpbnQzMng0eDNfdCBzcmMsX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOy8vIFZMRDMuMzIge2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0eDNfdCB2bGQzcV9sYW5lX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoMykgdWludDMyX3QgY29uc3QgKiBwdHIsIHVpbnQzMng0eDNfdCogc3JjLF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKSAvLyBWTEQzLjMyIHtkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQoreworICAgIHVpbnQzMng0eDNfdCB2OworICAgIHYudmFsWzBdID0gX01NX0lOU0VSVF9FUEkzMiAoIHNyYy0+dmFsWzBdLCAgcHRyWzBdLCBsYW5lKTsKKyAgICB2LnZhbFsxXSA9IF9NTV9JTlNFUlRfRVBJMzIgKCBzcmMtPnZhbFsxXSwgIHB0clsxXSwgbGFuZSk7CisgICAgdi52YWxbMl0gPSBfTU1fSU5TRVJUX0VQSTMyICggc3JjLT52YWxbMl0sICBwdHJbMl0sIGxhbmUpOworICAgIHJldHVybiB2OworfQorI2RlZmluZSB2bGQzcV9sYW5lX3UzMihwdHIsIHNyYywgbGFuZSkgdmxkM3FfbGFuZV91MzJfcHRyKHB0ciwgJnNyYywgbGFuZSkKKworLy9pbnQxNng4eDNfdCB2bGQzcV9sYW5lX3MxNihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQxNl90IGNvbnN0ICogcHRyLCBpbnQxNng4eDNfdCBzcmMsIF9fY29uc3RyYW5nZSgwLDcpaW50IGxhbmUpOy8vIFZMRDMuMTYge2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDh4M190IHZsZDNxX2xhbmVfczE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQxNl90IGNvbnN0ICogcHRyLCBpbnQxNng4eDNfdCogc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSkgLy8gVkxEMy4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KK3sKKyAgICBpbnQxNng4eDNfdCB2OworICAgIHYudmFsWzBdID0gX01NX0lOU0VSVF9FUEkxNiAoIHNyYy0+dmFsWzBdLCAgcHRyWzBdLCBsYW5lKTsKKyAgICB2LnZhbFsxXSA9IF9NTV9JTlNFUlRfRVBJMTYgKCBzcmMtPnZhbFsxXSwgIHB0clsxXSwgbGFuZSk7CisgICAgdi52YWxbMl0gPSBfTU1fSU5TRVJUX0VQSTE2ICggc3JjLT52YWxbMl0sICBwdHJbMl0sIGxhbmUpOworICAgIHJldHVybiB2OworfQorI2RlZmluZSB2bGQzcV9sYW5lX3MxNihwdHIsIHNyYywgbGFuZSkgdmxkM3FfbGFuZV9zMTZfcHRyKHB0ciwgJnNyYywgbGFuZSkKKworLy9pbnQzMng0eDNfdCB2bGQzcV9sYW5lX3MzMihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQzMl90IGNvbnN0ICogcHRyLCBpbnQzMng0eDNfdCBzcmMsIF9fY29uc3RyYW5nZSgwLDMpaW50IGxhbmUpOy8vIFZMRDMuMzIge2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDR4M190IHZsZDNxX2xhbmVfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQzMl90IGNvbnN0ICogcHRyLCBpbnQzMng0eDNfdCogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkgLy8gVkxEMy4zMiB7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KK3sKKyAgICBpbnQzMng0eDNfdCB2OworICAgIHYudmFsWzBdID0gX01NX0lOU0VSVF9FUEkzMiAoIHNyYy0+dmFsWzBdLCAgcHRyWzBdLCBsYW5lKTsKKyAgICB2LnZhbFsxXSA9IF9NTV9JTlNFUlRfRVBJMzIgKCBzcmMtPnZhbFsxXSwgIHB0clsxXSwgbGFuZSk7CisgICAgdi52YWxbMl0gPSBfTU1fSU5TRVJUX0VQSTMyICggc3JjLT52YWxbMl0sICBwdHJbMl0sIGxhbmUpOworICAgIHJldHVybiB2OworfQorI2RlZmluZSB2bGQzcV9sYW5lX3MzMihwdHIsIHNyYywgbGFuZSkgdmxkM3FfbGFuZV9zMzJfcHRyKHB0ciwgJnNyYywgbGFuZSkKKworZmxvYXQxNng4eDNfdCB2bGQzcV9sYW5lX2YxNl9wdHIoX190cmFuc2ZlcnNpemUoMykgX19mcDE2IGNvbnN0ICogcHRyLCBmbG9hdDE2eDh4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZMRDMuMTYge2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCisvL2N1cnJlbnQgSUEgU0lNRCBkb2Vzbid0IHN1cHBvcnQgZmxvYXQxNgorI2RlZmluZSB2bGQzcV9sYW5lX2YxNihwdHIsIHNyYywgbGFuZSkgdmxkM3FfbGFuZV9mMTZfcHRyKHB0ciwgJnNyYywgbGFuZSkKKworCisvL2Zsb2F0MzJ4NHgzX3QgdmxkM3FfbGFuZV9mMzIoX190cmFuc2ZlcnNpemUoMykgZmxvYXQzMl90IGNvbnN0ICogcHRyLCBmbG9hdDMyeDR4M190IHNyYyxfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7Ly8gVkxEMy4zMiB7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMng0eDNfdCB2bGQzcV9sYW5lX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoMykgZmxvYXQzMl90IGNvbnN0ICogcHRyLCBmbG9hdDMyeDR4M190KiBzcmMsX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpIC8vIFZMRDMuMzIge2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCit7CisgICAgZmxvYXQzMng0eDNfdCB2OworICAgIHYudmFsWzBdID0gdmxkMXFfbGFuZV9mMzIoJnB0clswXSwgc3JjLT52YWxbMF0sIGxhbmUpOworICAgIHYudmFsWzFdID0gdmxkMXFfbGFuZV9mMzIoJnB0clsxXSwgc3JjLT52YWxbMV0sIGxhbmUpOworICAgIHYudmFsWzJdID0gdmxkMXFfbGFuZV9mMzIoJnB0clsyXSwgc3JjLT52YWxbMl0sIGxhbmUpOworICAgIHJldHVybiB2OworfQorI2RlZmluZSB2bGQzcV9sYW5lX2YzMihwdHIsc3JjLGxhbmUpIHZsZDNxX2xhbmVfZjMyX3B0cihwdHIsJnNyYyxsYW5lKQorCitwb2x5MTZ4OHgzX3QgdmxkM3FfbGFuZV9wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHBvbHkxNl90IGNvbnN0ICogcHRyLCBwb2x5MTZ4OHgzX3QgKiBzcmMsX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQzLjE2IHtkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQorI2RlZmluZSB2bGQzcV9sYW5lX3AxNiB2bGQzcV9sYW5lX3UxNgorCisvL3VpbnQ4eDh4M190IHZsZDNfbGFuZV91OChfX3RyYW5zZmVyc2l6ZSgzKSB1aW50OF90IGNvbnN0ICogcHRyLCB1aW50OHg4eDNfdCBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsvLyBWTEQzLjgge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDh4M190IHZsZDNfbGFuZV91OF9wdHIoX190cmFuc2ZlcnNpemUoMykgdWludDhfdCBjb25zdCAqIHB0ciwgdWludDh4OHgzX3QqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpIC8vIFZMRDMuOCB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK3sKKyAgICB1aW50OHg4eDNfdCB2OworICAgIHYudmFsWzBdID0gdmxkMV9sYW5lX3U4KHB0ciwgc3JjLT52YWxbMF0sIGxhbmUpOworICAgIHYudmFsWzFdID0gdmxkMV9sYW5lX3U4KChwdHIgKyAxKSwgc3JjLT52YWxbMV0sIGxhbmUpOworICAgIHYudmFsWzJdID0gdmxkMV9sYW5lX3U4KChwdHIgKyAyKSwgc3JjLT52YWxbMl0sIGxhbmUpOworICAgIHJldHVybiB2OworfQorI2RlZmluZSB2bGQzX2xhbmVfdTgocHRyLCBzcmMsIGxhbmUpIHZsZDNfbGFuZV91OF9wdHIocHRyLCAmc3JjLCBsYW5lKQorCisvL3VpbnQxNng0eDNfdCB2bGQzX2xhbmVfdTE2KF9fdHJhbnNmZXJzaXplKDMpIHVpbnQxNl90ICAgY29uc3QgKiBwdHIsIHVpbnQxNng0eDNfdCBzcmMsIF9fY29uc3RyYW5nZSgwLDMpaW50IGxhbmUpOy8vIFZMRDMuMTYge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0eDNfdCB2bGQzX2xhbmVfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MTZfdCBjb25zdCAqIHB0ciwgdWludDE2eDR4M190KiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKSAvLyBWTEQzLjE2IHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQoreworICAgIHVpbnQxNng0eDNfdCB2OworICAgIHYudmFsWzBdID0gdmxkMV9sYW5lX3UxNihwdHIsIHNyYy0+dmFsWzBdLCBsYW5lKTsKKyAgICB2LnZhbFsxXSA9IHZsZDFfbGFuZV91MTYoKHB0ciArIDEpLCBzcmMtPnZhbFsxXSwgbGFuZSk7CisgICAgdi52YWxbMl0gPSB2bGQxX2xhbmVfdTE2KChwdHIgKyAyKSwgc3JjLT52YWxbMl0sIGxhbmUpOworICAgIHJldHVybiB2OworfQorI2RlZmluZSB2bGQzX2xhbmVfdTE2KHB0ciwgc3JjLCBsYW5lKSB2bGQzX2xhbmVfdTE2X3B0cihwdHIsICZzcmMsIGxhbmUpCisKKy8vdWludDMyeDJ4M190IHZsZDNfbGFuZV91MzIoX190cmFuc2ZlcnNpemUoMykgdWludDMyX3QgY29uc3QgKiBwdHIsIHVpbnQzMngyeDNfdCBzcmMsIF9fY29uc3RyYW5nZSgwLDEpaW50IGxhbmUpOy8vIFZMRDMuMzIge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyeDNfdCB2bGQzX2xhbmVfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MzJfdCBjb25zdCAqIHB0ciwgdWludDMyeDJ4M190KiBzcmMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKSAvLyBWTEQzLjMyIHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQoreworICAgIC8vbmVlZCB0byBtZXJnZSBpbnRvIDEyOCBiaXQgYW55d2F5CisgICAgdWludDMyeDJ4M190IHY7CisgICAgdi52YWxbMF0gPSB2bGQxX2xhbmVfdTMyKHB0ciwgc3JjLT52YWxbMF0sIGxhbmUpOzsKKyAgICB2LnZhbFsxXSA9IHZsZDFfbGFuZV91MzIoKHB0ciArIDEpLCBzcmMtPnZhbFsxXSwgbGFuZSk7OworICAgIHYudmFsWzJdID0gdmxkMV9sYW5lX3UzMigocHRyICsgMiksIHNyYy0+dmFsWzJdLCBsYW5lKTs7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDNfbGFuZV91MzIocHRyLCBzcmMsIGxhbmUpIHZsZDNfbGFuZV91MzJfcHRyKHB0ciwgJnNyYywgbGFuZSkKKworaW50OHg4eDNfdCB2bGQzX2xhbmVfczhfcHRyKF9fdHJhbnNmZXJzaXplKDMpIGludDhfdCBjb25zdCAqIHB0ciwgaW50OHg4eDNfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQzLjgge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCisjZGVmaW5lIHZsZDNfbGFuZV9zOChwdHIsIHNyYywgbGFuZSkgIHZsZDNfbGFuZV91OF9wdHIoKCB1aW50OF90KikgcHRyLCAmc3JjLCBsYW5lKQorCitpbnQxNng0eDNfdCB2bGQzX2xhbmVfczE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQxNl90IGNvbnN0ICogcHRyLCBpbnQxNng0eDNfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTEQzLjE2IHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQorI2RlZmluZSB2bGQzX2xhbmVfczE2KHB0ciwgc3JjLCBsYW5lKSAgdmxkM19sYW5lX3UxNl9wdHIoKCB1aW50MTZfdCopIHB0ciwgJnNyYywgbGFuZSkKKworaW50MzJ4MngzX3QgdmxkM19sYW5lX3MzMl9wdHIoX190cmFuc2ZlcnNpemUoMykgaW50MzJfdCBjb25zdCAqIHB0ciwgaW50MzJ4MngzX3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVkxEMy4zMiB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KKyNkZWZpbmUgdmxkM19sYW5lX3MzMihwdHIsIHNyYywgbGFuZSkgIHZsZDNfbGFuZV91MzJfcHRyKCggdWludDMyX3QqKSBwdHIsICZzcmMsIGxhbmUpCisKK2Zsb2F0MTZ4NHgzX3QgdmxkM19sYW5lX2YxNl9wdHIoX190cmFuc2ZlcnNpemUoMykgX19mcDE2IGNvbnN0ICogcHRyLCBmbG9hdDE2eDR4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDMuMTYge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCisvL2N1cnJlbnQgSUEgU0lNRCBkb2Vzbid0IHN1cHBvcnQgZmxvYXQxNgorCisvL2Zsb2F0MzJ4MngzX3QgdmxkM19sYW5lX2YzMihfX3RyYW5zZmVyc2l6ZSgzKSBmbG9hdDMyX3QgY29uc3QgKiBwdHIsIGZsb2F0MzJ4MngzX3Qgc3JjLF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsvLyBWTEQzLjMyIHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJ4M190IHZsZDNfbGFuZV9mMzJfcHRyKF9fdHJhbnNmZXJzaXplKDMpIGZsb2F0MzJfdCBjb25zdCAqIHB0ciwgZmxvYXQzMngyeDNfdCogc3JjLF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKSAvLyBWTEQzLjMyIHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQoreworICAgIGZsb2F0MzJ4MngzX3QgdjsKKyAgICB2LnZhbFswXSA9IHZsZDFfbGFuZV9mMzIocHRyLCBzcmMtPnZhbFswXSwgbGFuZSk7CisgICAgdi52YWxbMV0gPSB2bGQxX2xhbmVfZjMyKChwdHIgKyAxKSwgc3JjLT52YWxbMV0sIGxhbmUpOworICAgIHYudmFsWzJdID0gdmxkMV9sYW5lX2YzMigocHRyICsgMiksIHNyYy0+dmFsWzJdLCBsYW5lKTsKKyAgICByZXR1cm4gdjsKK30KKyNkZWZpbmUgdmxkM19sYW5lX2YzMihwdHIsc3JjLGxhbmUpIHZsZDNfbGFuZV9mMzJfcHRyKHB0ciwmc3JjLGxhbmUpCisKKy8vcG9seTh4OHgzX3QgdmxkM19sYW5lX3A4X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSBwb2x5OF90IGNvbnN0ICogcHRyLCBwb2x5OHg4eDNfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQzLjgge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCisjZGVmaW5lIHZsZDNfbGFuZV9wOCB2bGQzX2xhbmVfdTgKKworLy9wb2x5MTZ4NHgzX3QgdmxkM19sYW5lX3AxNihfX3RyYW5zZmVyc2l6ZSgzKSBwb2x5MTZfdCBjb25zdCAqIHB0ciwgcG9seTE2eDR4M190ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZMRDMuMTYge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCisjZGVmaW5lIHZsZDNfbGFuZV9wMTYgdmxkM19sYW5lX3UxNgorCisvLyoqKioqKioqKioqKioqKioqKiogTGFuZSBRdWFkcnVwbGVzICBsb2FkICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vZG9lcyB2bGQxX2xhbmVfeHggcHRyWzBdIHRvIHNyYy0+dmFsWzBdLCBwdHJbMV0gdG8gc3JjLT52YWxbMV0sIHB0clsyXSB0byBzcmMtPnZhbFsyXSBhbmQgcHRyWzNdIHRvIHNyYy0+dmFsWzNdIGF0IGxhbmUgcG9zaXRvbgorLy93ZSBhc3N1bWUgc3JjIGlzIDE2IGJpdCBhbGlnbmVkCisKKy8vdWludDE2eDh4NF90IHZsZDRxX2xhbmVfdTE2KF9fdHJhbnNmZXJzaXplKDQpIHVpbnQxNl90IGNvbnN0ICogcHRyLCB1aW50MTZ4OHg0X3Qgc3JjLF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKS8vIFZMRDQuMTYge2QwWzBdLCBkMlswXSwgZDRbMF0sIGQ2WzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OHg0X3QgdmxkNHFfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQxNl90IGNvbnN0ICogcHRyLCB1aW50MTZ4OHg0X3QqIHNyYyxfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSkKK3sKKyAgICB1aW50MTZ4OHg0X3QgdjsKKyAgICB2LnZhbFswXSA9IF9NTV9JTlNFUlRfRVBJMTYgKCBzcmMtPnZhbFswXSwgIHB0clswXSwgbGFuZSk7CisgICAgdi52YWxbMV0gPSBfTU1fSU5TRVJUX0VQSTE2ICggc3JjLT52YWxbMV0sICBwdHJbMV0sIGxhbmUpOworICAgIHYudmFsWzJdID0gX01NX0lOU0VSVF9FUEkxNiAoIHNyYy0+dmFsWzJdLCAgcHRyWzJdLCBsYW5lKTsKKyAgICB2LnZhbFszXSA9IF9NTV9JTlNFUlRfRVBJMTYgKCBzcmMtPnZhbFszXSwgIHB0clszXSwgbGFuZSk7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDRxX2xhbmVfdTE2KHB0ciwgc3JjLCBsYW5lKSB2bGQ0cV9sYW5lX3UxNl9wdHIocHRyLCAmc3JjLCBsYW5lKQorCisvL3VpbnQzMng0eDRfdCB2bGQ0cV9sYW5lX3UzMihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MzJfdCBjb25zdCAqIHB0ciwgdWludDMyeDR4NF90IHNyYyxfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkvLyBWTEQ0LjMyIHtkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDR4NF90IHZsZDRxX2xhbmVfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MzJfdCBjb25zdCAqIHB0ciwgdWludDMyeDR4NF90KiBzcmMsX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgdWludDMyeDR4NF90IHY7CisgICAgdi52YWxbMF0gPSBfTU1fSU5TRVJUX0VQSTMyICggc3JjLT52YWxbMF0sICBwdHJbMF0sIGxhbmUpOworICAgIHYudmFsWzFdID0gX01NX0lOU0VSVF9FUEkzMiAoIHNyYy0+dmFsWzFdLCAgcHRyWzFdLCBsYW5lKTsKKyAgICB2LnZhbFsyXSA9IF9NTV9JTlNFUlRfRVBJMzIgKCBzcmMtPnZhbFsyXSwgIHB0clsyXSwgbGFuZSk7CisgICAgdi52YWxbM10gPSBfTU1fSU5TRVJUX0VQSTMyICggc3JjLT52YWxbM10sICBwdHJbM10sIGxhbmUpOworICAgIHJldHVybiB2OworfQorI2RlZmluZSB2bGQ0cV9sYW5lX3UzMihwdHIsIHNyYywgbGFuZSkgdmxkNHFfbGFuZV91MzJfcHRyKHB0ciwgJnNyYywgbGFuZSkKKworLy9pbnQxNng4eDRfdCB2bGQ0cV9sYW5lX3MxNihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQxNl90IGNvbnN0ICogcHRyLCBpbnQxNng4eDRfdCBzcmMsIF9fY29uc3RyYW5nZSgwLDcpaW50IGxhbmUpOy8vIFZMRDQuMTYge2QwWzBdLCBkMlswXSwgZDRbMF0sIGQ2WzBdfSwgW3IwXQoraW50MTZ4OHg0X3QgdmxkNHFfbGFuZV9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIGludDE2X3QgY29uc3QgKiBwdHIsIGludDE2eDh4NF90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZMRDQuMTYge2QwWzBdLCBkMlswXSwgZDRbMF0sIGQ2WzBdfSwgW3IwXQorI2RlZmluZSB2bGQ0cV9sYW5lX3MxNihwdHIsIHNyYywgbGFuZSkgdmxkNHFfbGFuZV91MTYoKCB1aW50MTZfdCopIHB0ciwgc3JjLCBsYW5lKQorCisvL2ludDMyeDR4NF90IHZsZDRxX2xhbmVfczMyKF9fdHJhbnNmZXJzaXplKDQpIGludDMyX3QgY29uc3QgKiBwdHIsIGludDMyeDR4NF90IHNyYywgX19jb25zdHJhbmdlKDAsMylpbnQgbGFuZSk7Ly8gVkxENC4zMiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCitpbnQzMng0eDRfdCB2bGQ0cV9sYW5lX3MzMl9wdHIoX190cmFuc2ZlcnNpemUoNCkgaW50MzJfdCBjb25zdCAqIHB0ciwgaW50MzJ4NHg0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkxENC4zMiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCisjZGVmaW5lIHZsZDRxX2xhbmVfczMyKHB0ciwgc3JjLCBsYW5lKSAgdmxkNHFfbGFuZV91MzIoKCB1aW50MzJfdCopIHB0ciwgc3JjLCBsYW5lKQorCisvL2Zsb2F0MTZ4OHg0X3QgdmxkNHFfbGFuZV9mMTYoX190cmFuc2ZlcnNpemUoNCkgX19mcDE2IGNvbnN0ICogcHRyLCBmbG9hdDE2eDh4NF90IHNyYywgX19jb25zdHJhbmdlKDAsNylpbnQgbGFuZSk7Ly8gVkxENC4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCitmbG9hdDE2eDh4NF90IHZsZDRxX2xhbmVfZjE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBfX2ZwMTYgY29uc3QgKiBwdHIsIGZsb2F0MTZ4OHg0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVkxENC4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCisvL2N1cnJlbnQgSUEgU0lNRCBkb2Vzbid0IHN1cHBvcnQgZmxvYXQxNgorCisvL2Zsb2F0MzJ4NHg0X3QgdmxkNHFfbGFuZV9mMzIoX190cmFuc2ZlcnNpemUoNCkgZmxvYXQzMl90IGNvbnN0ICogcHRyLCBmbG9hdDMyeDR4NF90IHNyYyxfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkvLyBWTEQ0LjMyIHtkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMng0eDRfdCB2bGQ0cV9sYW5lX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoNCkgZmxvYXQzMl90IGNvbnN0ICogcHRyLCBmbG9hdDMyeDR4NF90KiBzcmMsX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgZmxvYXQzMng0eDRfdCB2OworICAgIHYudmFsWzBdID0gdmxkMXFfbGFuZV9mMzIoJnB0clswXSwgc3JjLT52YWxbMF0sIGxhbmUpOworICAgIHYudmFsWzFdID0gdmxkMXFfbGFuZV9mMzIoJnB0clsxXSwgc3JjLT52YWxbMV0sIGxhbmUpOworICAgIHYudmFsWzJdID0gdmxkMXFfbGFuZV9mMzIoJnB0clsyXSwgc3JjLT52YWxbMl0sIGxhbmUpOworICAgIHYudmFsWzNdID0gdmxkMXFfbGFuZV9mMzIoJnB0clszXSwgc3JjLT52YWxbM10sIGxhbmUpOworICAgIHJldHVybiB2OworfQorI2RlZmluZSB2bGQ0cV9sYW5lX2YzMihwdHIsdmFsLGxhbmUpIHZsZDRxX2xhbmVfZjMyX3B0cihwdHIsJnZhbCxsYW5lKQorCisvL3BvbHkxNng4eDRfdCB2bGQ0cV9sYW5lX3AxNihfX3RyYW5zZmVyc2l6ZSg0KSBwb2x5MTZfdCBjb25zdCAqIHB0ciwgcG9seTE2eDh4NF90IHNyYyxfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7Ly8gVkxENC4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCitwb2x5MTZ4OHg0X3QgdmxkNHFfbGFuZV9wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHBvbHkxNl90IGNvbnN0ICogcHRyLCBwb2x5MTZ4OHg0X3QgKiBzcmMsX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTEQ0LjE2IHtkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KKyNkZWZpbmUgdmxkNHFfbGFuZV9wMTYgdmxkNHFfbGFuZV91MTYKKworLy91aW50OHg4eDRfdCB2bGQ0X2xhbmVfdTgoX190cmFuc2ZlcnNpemUoNCkgdWludDhfdCBjb25zdCAqIHB0ciwgdWludDh4OHg0X3Qgc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSkvLyBWTEQ0Ljgge2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50OHg4eDRfdCB2bGQ0X2xhbmVfdThfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQ4X3QgY29uc3QgKiBwdHIsIHVpbnQ4eDh4NF90KiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKQoreworICAgIHVpbnQ4eDh4NF90IHY7CisgICAgdi52YWxbMF0gPSB2bGQxX2xhbmVfdTgocHRyLCBzcmMtPnZhbFswXSwgbGFuZSk7CisgICAgdi52YWxbMV0gPSB2bGQxX2xhbmVfdTgoKHB0ciArIDEpLCBzcmMtPnZhbFsxXSwgbGFuZSk7CisgICAgdi52YWxbMl0gPSB2bGQxX2xhbmVfdTgoKHB0ciArIDIpLCBzcmMtPnZhbFsyXSwgbGFuZSk7CisgICAgdi52YWxbM10gPSB2bGQxX2xhbmVfdTgoKHB0ciArIDMpLCBzcmMtPnZhbFszXSwgbGFuZSk7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDRfbGFuZV91OChwdHIsIHNyYywgbGFuZSkgdmxkNF9sYW5lX3U4X3B0cihwdHIsICZzcmMsIGxhbmUpCisKKy8vdWludDE2eDR4NF90IHZsZDRfbGFuZV91MTYoX190cmFuc2ZlcnNpemUoNCkgdWludDE2X3QgY29uc3QgKiBwdHIsIHVpbnQxNng0eDRfdCBzcmMsIF9fY29uc3RyYW5nZSgwLDMpaW50IGxhbmUpLy8gVkxENC4xNiB7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0eDRfdCB2bGQ0X2xhbmVfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MTZfdCBjb25zdCAqIHB0ciwgdWludDE2eDR4NF90KiBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKQoreworICAgIHVpbnQxNng0eDRfdCB2OworICAgIHYudmFsWzBdID0gdmxkMV9sYW5lX3UxNihwdHIsIHNyYy0+dmFsWzBdLCBsYW5lKTsKKyAgICB2LnZhbFsxXSA9IHZsZDFfbGFuZV91MTYoKHB0ciArIDEpLCBzcmMtPnZhbFsxXSwgbGFuZSk7CisgICAgdi52YWxbMl0gPSB2bGQxX2xhbmVfdTE2KChwdHIgKyAyKSwgc3JjLT52YWxbMl0sIGxhbmUpOworICAgIHYudmFsWzNdID0gdmxkMV9sYW5lX3UxNigocHRyICsgMyksIHNyYy0+dmFsWzNdLCBsYW5lKTsKKyAgICByZXR1cm4gdjsKK30KKyNkZWZpbmUgdmxkNF9sYW5lX3UxNihwdHIsIHNyYywgbGFuZSkgdmxkNF9sYW5lX3UxNl9wdHIocHRyLCAmc3JjLCBsYW5lKQorCisvL3VpbnQzMngyeDRfdCB2bGQ0X2xhbmVfdTMyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQzMl90IGNvbnN0ICogcHRyLCB1aW50MzJ4Mng0X3Qgc3JjLCBfX2NvbnN0cmFuZ2UoMCwxKWludCBsYW5lKS8vIFZMRDQuMzIge2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Mng0X3QgdmxkNF9sYW5lX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoNCkgdWludDMyX3QgY29uc3QgKiBwdHIsIHVpbnQzMngyeDRfdCogc3JjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSkKK3sKKyAgICB1aW50MzJ4Mng0X3QgdjsKKyAgICB2LnZhbFswXSA9IHZsZDFfbGFuZV91MzIocHRyLCBzcmMtPnZhbFswXSwgbGFuZSk7CisgICAgdi52YWxbMV0gPSB2bGQxX2xhbmVfdTMyKChwdHIgKyAxKSwgc3JjLT52YWxbMV0sIGxhbmUpOworICAgIHYudmFsWzJdID0gdmxkMV9sYW5lX3UzMigocHRyICsgMiksIHNyYy0+dmFsWzJdLCBsYW5lKTsKKyAgICB2LnZhbFszXSA9IHZsZDFfbGFuZV91MzIoKHB0ciArIDMpLCBzcmMtPnZhbFszXSwgbGFuZSk7CisgICAgcmV0dXJuIHY7Cit9CisjZGVmaW5lIHZsZDRfbGFuZV91MzIocHRyLCBzcmMsIGxhbmUpIHZsZDRfbGFuZV91MzJfcHRyKHB0ciwgJnNyYywgbGFuZSkKKworLy9pbnQ4eDh4NF90IHZsZDRfbGFuZV9zOChfX3RyYW5zZmVyc2l6ZSg0KSBpbnQ4X3QgY29uc3QgKiBwdHIsIGludDh4OHg0X3Qgc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7Ly8gVkxENC44IHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK2ludDh4OHg0X3QgdmxkNF9sYW5lX3M4X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQ4X3QgY29uc3QgKiBwdHIsIGludDh4OHg0X3QgKiBzcmMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsKKyNkZWZpbmUgdmxkNF9sYW5lX3M4KHB0cixzcmMsbGFuZSkgdmxkNF9sYW5lX3U4KCh1aW50OF90KilwdHIsc3JjLGxhbmUpCisKKy8vaW50MTZ4NHg0X3QgdmxkNF9sYW5lX3MxNihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQxNl90IGNvbnN0ICogcHRyLCBpbnQxNng0eDRfdCBzcmMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsvLyBWTEQ0LjE2IHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK2ludDE2eDR4NF90IHZsZDRfbGFuZV9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIGludDE2X3QgY29uc3QgKiBwdHIsIGludDE2eDR4NF90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7CisjZGVmaW5lIHZsZDRfbGFuZV9zMTYocHRyLHNyYyxsYW5lKSB2bGQ0X2xhbmVfdTE2KCh1aW50MTZfdCopcHRyLHNyYyxsYW5lKQorCisvL2ludDMyeDJ4NF90IHZsZDRfbGFuZV9zMzIoX190cmFuc2ZlcnNpemUoNCkgaW50MzJfdCBjb25zdCAqIHB0ciwgaW50MzJ4Mng0X3Qgc3JjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7Ly8gVkxENC4zMiB7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCitpbnQzMngyeDRfdCB2bGQ0X2xhbmVfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQzMl90IGNvbnN0ICogcHRyLCBpbnQzMngyeDRfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOworI2RlZmluZSB2bGQ0X2xhbmVfczMyKHB0cixzcmMsbGFuZSkgdmxkNF9sYW5lX3UzMigodWludDMyX3QqKXB0cixzcmMsbGFuZSkKKworLy9mbG9hdDE2eDR4NF90IHZsZDRfbGFuZV9mMTYoX190cmFuc2ZlcnNpemUoNCkgX19mcDE2IGNvbnN0ICogcHRyLCBmbG9hdDE2eDR4NF90IHNyYywgX19jb25zdHJhbmdlKDAsMylpbnQgbGFuZSk7Ly8gVkxENC4xNiB7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCitmbG9hdDE2eDR4NF90IHZsZDRfbGFuZV9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDQpIF9fZnAxNiBjb25zdCAqIHB0ciwgZmxvYXQxNng0eDRfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOworLy9jdXJyZW50IElBIFNJTUQgZG9lc24ndCBzdXBwb3J0IGZsb2F0MTYKKworLy9mbG9hdDMyeDJ4NF90IHZsZDRfbGFuZV9mMzIoX190cmFuc2ZlcnNpemUoNCkgZmxvYXQzMl90IGNvbnN0ICogcHRyLCBmbG9hdDMyeDJ4NF90IHNyYyxfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSkvLyBWTEQ0LjMyIHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyeDRfdCB2bGQ0X2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBmbG9hdDMyX3QgY29uc3QgKiBwdHIsIGZsb2F0MzJ4Mng0X3QqIHNyYyxfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSkKK3sKKyAgICAvL3NlcmlhbCBzb2x1dGlvbiBtYXkgYmUgZmFzdGVyCisgICAgZmxvYXQzMngyeDRfdCB2OworICAgIHYudmFsWzBdID0gdmxkMV9sYW5lX2YzMihwdHIsIHNyYy0+dmFsWzBdLCBsYW5lKTsKKyAgICB2LnZhbFsxXSA9IHZsZDFfbGFuZV9mMzIoKHB0ciArIDEpLCBzcmMtPnZhbFsxXSwgbGFuZSk7CisgICAgdi52YWxbMl0gPSB2bGQxX2xhbmVfZjMyKChwdHIgKyAyKSwgc3JjLT52YWxbMl0sIGxhbmUpOworICAgIHYudmFsWzNdID0gdmxkMV9sYW5lX2YzMigocHRyICsgMyksIHNyYy0+dmFsWzNdLCBsYW5lKTsKKyAgICByZXR1cm4gdjsKK30KKyNkZWZpbmUgdmxkNF9sYW5lX2YzMihwdHIsc3JjLGxhbmUpIHZsZDRfbGFuZV9mMzJfcHRyKHB0ciwmc3JjLGxhbmUpCisKKy8vcG9seTh4OHg0X3QgdmxkNF9sYW5lX3A4KF9fdHJhbnNmZXJzaXplKDQpIHBvbHk4X3QgY29uc3QgKiBwdHIsIHBvbHk4eDh4NF90IHNyYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOy8vIFZMRDQuOCB7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCitwb2x5OHg4eDRfdCB2bGQ0X2xhbmVfcDhfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHBvbHk4X3QgY29uc3QgKiBwdHIsIHBvbHk4eDh4NF90ICogc3JjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7CisjZGVmaW5lIHZsZDRfbGFuZV9wOCB2bGQ0X2xhbmVfdTgKKworLy9wb2x5MTZ4NHg0X3QgdmxkNF9sYW5lX3AxNihfX3RyYW5zZmVyc2l6ZSg0KSBwb2x5MTZfdCBjb25zdCAqIHB0ciwgcG9seTE2eDR4NF90IHNyYywgX19jb25zdHJhbmdlKDAsMylpbnQgbGFuZSk7Ly8gVkxENC4xNiB7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCitwb2x5MTZ4NHg0X3QgdmxkNF9sYW5lX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoNCkgcG9seTE2X3QgY29uc3QgKiBwdHIsIHBvbHkxNng0eDRfdCAqIHNyYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOworI2RlZmluZSB2bGQ0X2xhbmVfcDE2IHZsZDRfbGFuZV91MTYKKworLy8qKioqKioqKioqKioqKioqKioqIFN0b3JlIGR1cGxldHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL2hlcmUgd2UgYXNzdW1lIHRoZSBwdHIgaXMgMTZiaXQgYWxpZ25lZC4gSWYgbm90IHdlIG5lZWQgdG8gdXNlIF9tbV9zdG9yZXVfc2kxMjggbGlrZSBzaG93biBpbiB2c3QxcV91OCBmdW5jdGlvbgorLy9JZiBuZWNlc3NhcnkgeW91IG5lZWQgdG8gbW9kaWZ5IGFsbCBzdG9yZSBmdW5jdGlvbnMgYWNjb3JkaW5nbHkuIFNlZSBtb3JlIGNvbW1lbnRzIHRvICJTdG9yZSBzaW5nbGUiIGZ1bmN0aW9ucworLy92b2lkIHZzdDJxX3U4KF9fdHJhbnNmZXJzaXplKDMyKSB1aW50OF90ICogcHRyLCB1aW50OHgxNngyX3QgdmFsKS8vIFZTVDIuOCB7ZDAsIGQyfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDJxX3U4X3B0cihfX3RyYW5zZmVyc2l6ZSgzMikgdWludDhfdCAqIHB0ciwgdWludDh4MTZ4Ml90KiB2YWwpCit7CisgICAgdWludDh4MTZ4Ml90IHY7CisgICAgdi52YWxbMF0gPSBfbW1fdW5wYWNrbG9fZXBpOCh2YWwtPnZhbFswXSwgdmFsLT52YWxbMV0pOworICAgIHYudmFsWzFdID0gX21tX3VucGFja2hpX2VwaTgodmFsLT52YWxbMF0sIHZhbC0+dmFsWzFdKTsKKyAgICB2c3QxcV91OCAocHRyLCB2LnZhbFswXSk7CisgICAgdnN0MXFfdTggKChwdHIgKyAxNiksICB2LnZhbFsxXSk7Cit9CisjZGVmaW5lIHZzdDJxX3U4KHB0ciwgdmFsKSB2c3QycV91OF9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0MnFfdTE2KF9fdHJhbnNmZXJzaXplKDE2KSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDh4Ml90IHZhbCkvLyBWU1QyLjE2IHtkMCwgZDJ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0MnFfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSgxNikgdWludDE2X3QgKiBwdHIsIHVpbnQxNng4eDJfdCogdmFsKQoreworICAgIHVpbnQxNng4eDJfdCB2OworICAgIHYudmFsWzBdID0gX21tX3VucGFja2xvX2VwaTE2KHZhbC0+dmFsWzBdLCB2YWwtPnZhbFsxXSk7CisgICAgdi52YWxbMV0gPSBfbW1fdW5wYWNraGlfZXBpMTYodmFsLT52YWxbMF0sIHZhbC0+dmFsWzFdKTsKKyAgICB2c3QxcV91MTYgKHB0ciwgdi52YWxbMF0pOworICAgIHZzdDFxX3UxNiAoKHB0ciArIDgpLCAgdi52YWxbMV0pOworfQorI2RlZmluZSB2c3QycV91MTYocHRyLCB2YWwpIHZzdDJxX3UxNl9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0MnFfdTMyKF9fdHJhbnNmZXJzaXplKDgpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4NHgyX3QgdmFsKS8vIFZTVDIuMzIge2QwLCBkMn0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QycV91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDgpIHVpbnQzMl90KiBwdHIsIHVpbnQzMng0eDJfdCogdmFsKQoreworICAgIHVpbnQzMng0eDJfdCB2OworICAgIHYudmFsWzBdID0gX21tX3VucGFja2xvX2VwaTMyKHZhbC0+dmFsWzBdLCB2YWwtPnZhbFsxXSk7CisgICAgdi52YWxbMV0gPSBfbW1fdW5wYWNraGlfZXBpMzIodmFsLT52YWxbMF0sIHZhbC0+dmFsWzFdKTsKKyAgICB2c3QxcV91MzIgKHB0ciwgdi52YWxbMF0pOworICAgIHZzdDFxX3UzMiAoKHB0ciArIDQpLCAgdi52YWxbMV0pOworfQorI2RlZmluZSB2c3QycV91MzIocHRyLCB2YWwpIHZzdDJxX3UzMl9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0MnFfczgoX190cmFuc2ZlcnNpemUoMzIpIGludDhfdCAqIHB0ciwgaW50OHgxNngyX3QgdmFsKTsgLy8gVlNUMi44IHtkMCwgZDJ9LCBbcjBdCit2b2lkIHZzdDJxX3M4X3B0cihfX3RyYW5zZmVyc2l6ZSgzMikgaW50OF90ICogcHRyLCBpbnQ4eDE2eDJfdCAqIHZhbCk7CisjZGVmaW5lIHZzdDJxX3M4KHB0ciwgdmFsKSB2c3QycV91OCgodWludDhfdCopKHB0ciksIHZhbCkKKworLy92b2lkIHZzdDJxX3MxNihfX3RyYW5zZmVyc2l6ZSgxNikgaW50MTZfdCAqIHB0ciwgaW50MTZ4OHgyX3QgdmFsKTsvLyBWU1QyLjE2IHtkMCwgZDJ9LCBbcjBdCit2b2lkIHZzdDJxX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoMTYpIGludDE2X3QgKiBwdHIsIGludDE2eDh4Ml90ICogdmFsKTsKKyNkZWZpbmUgdnN0MnFfczE2KHB0ciwgdmFsKSB2c3QycV91MTYoKHVpbnQxNl90KikocHRyKSwgdmFsKQorCisvL3ZvaWQgdnN0MnFfczMyKF9fdHJhbnNmZXJzaXplKDgpIGludDMyX3QgKiBwdHIsIGludDMyeDR4Ml90IHZhbCk7Ly8gVlNUMi4zMiB7ZDAsIGQyfSwgW3IwXQordm9pZCB2c3QycV9zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDgpIGludDMyX3QgKiBwdHIsIGludDMyeDR4Ml90ICogdmFsKTsKKyNkZWZpbmUgdnN0MnFfczMyKHB0ciwgdmFsKSAgdnN0MnFfdTMyKCh1aW50MzJfdCopKHB0ciksIHZhbCkKKworLy92b2lkIHZzdDJxX2YxNihfX3RyYW5zZmVyc2l6ZSgxNikgX19mcDE2ICogcHRyLCBmbG9hdDE2eDh4Ml90IHZhbCk7Ly8gVlNUMi4xNiB7ZDAsIGQyfSwgW3IwXQordm9pZCB2c3QycV9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDE2KSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4OHgyX3QgKiB2YWwpOworLy8gSUEzMiBTSU1EIGRvZXNuJ3Qgd29yayB3aXRoIDE2Yml0IGZsb2F0cyBjdXJyZW50bHkKKworLy92b2lkIHZzdDJxX2YzMihfX3RyYW5zZmVyc2l6ZSg4KSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4NHgyX3QgdmFsKS8vIFZTVDIuMzIge2QwLCBkMn0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QycV9mMzJfcHRyKF9fdHJhbnNmZXJzaXplKDgpIGZsb2F0MzJfdCogcHRyLCBmbG9hdDMyeDR4Ml90KiB2YWwpCit7CisgICAgZmxvYXQzMng0eDJfdCB2OworICAgIHYudmFsWzBdID0gX21tX3VucGFja2xvX3BzKHZhbC0+dmFsWzBdLCB2YWwtPnZhbFsxXSk7CisgICAgdi52YWxbMV0gPSBfbW1fdW5wYWNraGlfcHModmFsLT52YWxbMF0sIHZhbC0+dmFsWzFdKTsKKyAgICB2c3QxcV9mMzIgKHB0ciwgdi52YWxbMF0pOworICAgIHZzdDFxX2YzMiAoKHB0ciArIDQpLCAgdi52YWxbMV0pOworfQorI2RlZmluZSB2c3QycV9mMzIocHRyLCB2YWwpIHZzdDJxX2YzMl9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0MnFfcDgoX190cmFuc2ZlcnNpemUoMzIpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDE2eDJfdCB2YWwpOy8vIFZTVDIuOCB7ZDAsIGQyfSwgW3IwXQordm9pZCB2c3QycV9wOF9wdHIoX190cmFuc2ZlcnNpemUoMzIpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDE2eDJfdCAqIHZhbCk7CisjZGVmaW5lIHZzdDJxX3A4IHZzdDJxX3U4CisKKy8vdm9pZCB2c3QycV9wMTYoX190cmFuc2ZlcnNpemUoMTYpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4OHgyX3QgdmFsKTsvLyBWU1QyLjE2IHtkMCwgZDJ9LCBbcjBdCit2b2lkIHZzdDJxX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoMTYpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4OHgyX3QgKiB2YWwpOworI2RlZmluZSB2c3QycV9wMTYgdnN0MnFfdTE2CisKKy8vdm9pZCB2c3QyX3U4KF9fdHJhbnNmZXJzaXplKDE2KSB1aW50OF90ICogcHRyLCB1aW50OHg4eDJfdCB2YWwpOy8vIFZTVDIuOCB7ZDAsIGQxfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDJfdThfcHRyKF9fdHJhbnNmZXJzaXplKDE2KSB1aW50OF90ICogcHRyLCB1aW50OHg4eDJfdCogdmFsKQoreworICAgIF9fbTEyOGkgdjA7CisgICAgdjAgPSBfbW1fdW5wYWNrbG9fZXBpOChfcE0xMjhpKHZhbC0+dmFsWzBdKSwgX3BNMTI4aSh2YWwtPnZhbFsxXSkpOworICAgIHZzdDFxX3U4IChwdHIsIHYwKTsKK30KKyNkZWZpbmUgdnN0Ml91OChwdHIsIHZhbCkgdnN0Ml91OF9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0Ml91MTYoX190cmFuc2ZlcnNpemUoOCkgdWludDE2X3QgKiBwdHIsIHVpbnQxNng0eDJfdCB2YWwpOy8vIFZTVDIuMTYge2QwLCBkMX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QyX3UxNl9wdHIoX190cmFuc2ZlcnNpemUoOCkgdWludDE2X3QgKiBwdHIsIHVpbnQxNng0eDJfdCogdmFsKQoreworICAgIF9fbTEyOGkgdjA7CisgICAgdjAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoX3BNMTI4aSh2YWwtPnZhbFswXSksIF9wTTEyOGkodmFsLT52YWxbMV0pKTsKKyAgICB2c3QxcV91MTYgKHB0ciwgdjApOworfQorI2RlZmluZSB2c3QyX3UxNihwdHIsIHZhbCkgdnN0Ml91MTZfcHRyKHB0ciwgJnZhbCkKKworLy92b2lkIHZzdDJfdTMyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4MngyX3QgdmFsKTsvLyBWU1QyLjMyIHtkMCwgZDF9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0Ml91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4MngyX3QqIHZhbCkKK3sKKyAgICBfX20xMjhpIHYwOworICAgIHYwID0gX21tX3VucGFja2xvX2VwaTMyKF9wTTEyOGkodmFsLT52YWxbMF0pLCBfcE0xMjhpKHZhbC0+dmFsWzFdKSk7CisgICAgdnN0MXFfdTMyIChwdHIsIHYwKTsKK30KKyNkZWZpbmUgdnN0Ml91MzIocHRyLCB2YWwpIHZzdDJfdTMyX3B0cihwdHIsICZ2YWwpCisKKworLy92b2lkIHZzdDJfdTY0KF9fdHJhbnNmZXJzaXplKDIpIHVpbnQ2NF90ICogcHRyLCB1aW50NjR4MXgyX3QgdmFsKTsvLyBWU1QxLjY0IHtkMCwgZDF9LCBbcjBdCit2b2lkIHZzdDJfdTY0X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50NjRfdCAqIHB0ciwgdWludDY0eDF4Ml90ICogdmFsKTsKK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QyX3U2NF9wdHIoX190cmFuc2ZlcnNpemUoMikgdWludDY0X3QgKiBwdHIsIHVpbnQ2NHgxeDJfdCogdmFsKQoreworICAgICoocHRyKSA9IHZhbC0+dmFsWzBdLm02NF91NjRbMF07CisgICAgKihwdHIgKyAxKSA9IHZhbC0+dmFsWzFdLm02NF91NjRbMF07Cit9CisjZGVmaW5lIHZzdDJfdTY0KHB0ciwgdmFsKSB2c3QyX3U2NF9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0Ml9zOChfX3RyYW5zZmVyc2l6ZSgxNikgaW50OF90ICogcHRyLCBpbnQ4eDh4Ml90IHZhbCk7Ly8gVlNUMi44IHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZzdDJfczgocHRyLCB2YWwpIHZzdDJfdTgoKHVpbnQ4X3QqKSBwdHIsIHZhbCkKKworLy92b2lkIHZzdDJfczE2KF9fdHJhbnNmZXJzaXplKDgpIGludDE2X3QgKiBwdHIsIGludDE2eDR4Ml90IHZhbCk7IC8vIFZTVDIuMTYge2QwLCBkMX0sIFtyMF0KKyNkZWZpbmUgdnN0Ml9zMTYocHRyLHZhbCkgdnN0Ml91MTYoKHVpbnQxNl90KikgcHRyLCB2YWwpCisKKy8vdm9pZCB2c3QyX3MzMihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQzMl90ICogcHRyLCBpbnQzMngyeDJfdCB2YWwpOyAvLyBWU1QyLjMyIHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZzdDJfczMyKHB0cix2YWwpIHZzdDJfdTMyKCh1aW50MzJfdCopIHB0ciwgdmFsKQorCisvL3ZvaWQgdnN0Ml9zNjQoX190cmFuc2ZlcnNpemUoMikgaW50NjRfdCAqIHB0ciwgaW50NjR4MXgyX3QgdmFsKTsKKyNkZWZpbmUgdnN0Ml9zNjQocHRyLHZhbCkgdnN0Ml91NjQoKHVpbnQ2NF90KikgcHRyLHZhbCkKKworLy92b2lkIHZzdDJfZjE2KF9fdHJhbnNmZXJzaXplKDgpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng0eDJfdCB2YWwpOyAvLyBWU1QyLjE2IHtkMCwgZDF9LCBbcjBdCisvL2N1cnJlbnQgSUEgU0lNRCBkb2Vzbid0IHN1cHBvcnQgZmxvYXQxNgorCisvL3ZvaWQgdnN0Ml9mMzIoX190cmFuc2ZlcnNpemUoNCkgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDJ4Ml90IHZhbCk7IC8vIFZTVDIuMzIge2QwLCBkMX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QyX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoNCkgZmxvYXQzMl90KiBwdHIsIGZsb2F0MzJ4MngyX3QqIHZhbCkKK3sKKyAgICAqKHB0cikgPSAgIHZhbC0+dmFsWzBdLm02NF9mMzJbMF07CisgICAgKihwdHIgKyAxKSA9IHZhbC0+dmFsWzFdLm02NF9mMzJbMF07CisgICAgKihwdHIgKyAyKSA9IHZhbC0+dmFsWzBdLm02NF9mMzJbMV07CisgICAgKihwdHIgKyAzKSA9IHZhbC0+dmFsWzFdLm02NF9mMzJbMV07Cit9CisjZGVmaW5lIHZzdDJfZjMyKHB0ciwgdmFsKSB2c3QyX2YzMl9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0Ml9wOF9wdHIoX190cmFuc2ZlcnNpemUoMTYpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDh4Ml90ICogdmFsKTsgLy8gVlNUMi44IHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZzdDJfcDggdnN0Ml91OAorCisvL3ZvaWQgdnN0Ml9wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDgpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4NHgyX3QgKiB2YWwpOyAvLyBWU1QyLjE2IHtkMCwgZDF9LCBbcjBdCisjZGVmaW5lIHZzdDJfcDE2IHZzdDJfdTE2CisKKy8vKioqKioqKioqKioqKioqKioqKiogVHJpcGxldHMgc3RvcmUgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy92b2lkIHZzdDNxX3U4KF9fdHJhbnNmZXJzaXplKDQ4KSB1aW50OF90ICogcHRyLCB1aW50OHgxNngzX3QgdmFsKS8vIFZTVDMuOCB7ZDAsIGQyLCBkNH0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QzcV91OF9wdHIoX190cmFuc2ZlcnNpemUoNDgpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDE2eDNfdCogdmFsKQoreworICAgIHVpbnQ4eDE2eDNfdCB2OworICAgIF9fbTEyOGkgdjAsdjEsdjIsIGNmZiwgYmxkbWFzazsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrMFsxNl0gICA9IHswLCAxLCAweGZmLCAyLCAzLDB4ZmYsIDQsIDUsMHhmZiwgNiw3LDB4ZmYsIDgsOSwweGZmLCAxMH07CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ4X3QgbWFzazFbMTZdICAgPSB7MCwgMHhmZiwgMSwgMiwgMHhmZiwgMywgNCwgMHhmZiwgNSwgNiwgMHhmZiwgNyw4LDB4ZmYsIDksMTB9OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50OF90IG1hc2syWzE2XSA9ICAgIHsweGZmLCA2LCA3LCAweGZmLCA4LCA5LDB4ZmYsIDEwLCAxMSwweGZmLCAxMiwxMywweGZmLCAxNCwxNSwweGZmfTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrMmxvWzE2XSA9IHsweGZmLDB4ZmYsIDAsIDB4ZmYsMHhmZiwgMSwgMHhmZiwweGZmLCAyLCAweGZmLDB4ZmYsIDMsIDB4ZmYsMHhmZiwgNCwgMHhmZn07CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ4X3QgbWFzazJtZWRbMTZdID0gezB4ZmYsIDUsIDB4ZmYsIDB4ZmYsIDYsIDB4ZmYsMHhmZiwgNywgMHhmZiwweGZmLCA4LCAweGZmLDB4ZmYsIDksIDB4ZmYsIDB4ZmZ9OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50OF90IG1hc2syaGlbMTZdID0gezEwLCAweGZmLDB4ZmYsIDExLCAweGZmLDB4ZmYsIDEyLCAweGZmLDB4ZmYsIDEzLCAweGZmLDB4ZmYsIDE0LCAweGZmLCAweGZmLCAxNX07CisKKyAgICB2MCA9ICBfbW1fdW5wYWNrbG9fZXBpOCh2YWwtPnZhbFswXSwgdmFsLT52YWxbMV0pOyAvLzAsMSwgMyw0LCA2LDcsIDksMTAsIDEyLDEzLCAxNSwxNiwgMTgsMTksIDIxLDIyCisgICAgdjIgPSAgX21tX3VucGFja2hpX2VwaTgodmFsLT52YWxbMF0sIHZhbC0+dmFsWzFdKTsgLy8yNCwyNSwgIDI3LDI4LCAzMCwzMSwgMzMsMzQsIDM2LDM3LCAzOSw0MCwgNDIsNDMsIDQ1LDQ2CisgICAgdjEgPSAgX21tX2FsaWducl9lcGk4KHYyLCB2MCwgMTEpOyAvLzEyLDEzLCAxNSwxNiwgMTgsMTksIDIxLDIyLCAyNCwyNSwgIDI3LDI4LCAzMCwzMSwgMzMsMzQKKyAgICB2LnZhbFswXSA9ICBfbW1fc2h1ZmZsZV9lcGk4KHYwLCAqKF9fbTEyOGkqKW1hc2swKTsgLy9tYWtlIGhvbGVzIGZvciB0aGUgdi52YWxbMl0gZGF0YSBlbWJlZGRpbmcKKyAgICB2LnZhbFsyXSA9ICBfbW1fc2h1ZmZsZV9lcGk4KHZhbC0+dmFsWzJdLCAqKF9fbTEyOGkqKW1hc2sybG8pOyAvL21ha2UgcGx1Z3MgZm9yIHRoZSB2LnZhbFsyXSBkYXRhIGVtYmVkZGluZworICAgIGNmZiA9IF9tbV9jbXBlcV9lcGk4KHYwLCB2MCk7IC8vYWxsIGZmCisgICAgYmxkbWFzayA9IF9tbV9jbXBlcV9lcGk4KCooX19tMTI4aSopbWFzazAsIGNmZik7CisgICAgdi52YWxbMF0gPSBfTU1fQkxFTkRWX0VQSTgodi52YWxbMF0sIHYudmFsWzJdLCBibGRtYXNrKTsKKyAgICB2c3QxcV91OChwdHIsICAgdi52YWxbMF0pOworICAgIHYudmFsWzBdID0gIF9tbV9zaHVmZmxlX2VwaTgodjEsICooX19tMTI4aSopbWFzazEpOyAvL21ha2UgaG9sZXMgZm9yIHRoZSB2LnZhbFsyXSBkYXRhIGVtYmVkZGluZworICAgIHYudmFsWzJdID0gIF9tbV9zaHVmZmxlX2VwaTgodmFsLT52YWxbMl0sICooX19tMTI4aSopbWFzazJtZWQpOyAvL21ha2UgcGx1Z3MgZm9yIHRoZSB2LnZhbFsyXSBkYXRhIGVtYmVkZGluZworICAgIGJsZG1hc2sgPSBfbW1fY21wZXFfZXBpOCgqKF9fbTEyOGkqKW1hc2sxLCBjZmYpOworICAgIHYudmFsWzFdID0gX01NX0JMRU5EVl9FUEk4KHYudmFsWzBdLHYudmFsWzJdLCBibGRtYXNrKTsKKyAgICB2c3QxcV91OCgocHRyICsgMTYpLCAgdi52YWxbMV0pOworICAgIHYudmFsWzBdID0gIF9tbV9zaHVmZmxlX2VwaTgodjIsICooX19tMTI4aSopbWFzazIpOyAvL21ha2UgaG9sZXMgZm9yIHRoZSB2LnZhbFsyXSBkYXRhIGVtYmVkZGluZworICAgIHYudmFsWzJdID0gIF9tbV9zaHVmZmxlX2VwaTgodmFsLT52YWxbMl0sICooX19tMTI4aSopbWFzazJoaSk7IC8vbWFrZSBwbHVncyBmb3IgdGhlIHYudmFsWzJdIGRhdGEgZW1iZWRkaW5nCisgICAgYmxkbWFzayA9IF9tbV9jbXBlcV9lcGk4KCooX19tMTI4aSopbWFzazIsIGNmZik7CisgICAgdi52YWxbMl0gPSBfTU1fQkxFTkRWX0VQSTgodi52YWxbMF0sdi52YWxbMl0sIGJsZG1hc2sgKTsKKyAgICB2c3QxcV91OCgocHRyICsgMzIpLCAgdi52YWxbMl0pOworfQorI2RlZmluZSB2c3QzcV91OChwdHIsIHZhbCkgdnN0M3FfdThfcHRyKHB0ciwgJnZhbCkKKworLy92b2lkIHZzdDNxX3UxNihfX3RyYW5zZmVyc2l6ZSgyNCkgdWludDE2X3QgKiBwdHIsIHVpbnQxNng4eDNfdCB2YWwpLy8gVlNUMy4xNiB7ZDAsIGQyLCBkNH0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QzcV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDI0KSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDh4M190KiB2YWwpCit7CisgICAgdWludDE2eDh4M190IHY7CisgICAgX19tMTI4aSB2MCx2MSx2MiwgY2ZmLCBibGRtYXNrOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50OF90IG1hc2swWzE2XSAgID0gezAsMSwgMiwzLCAweGZmLDB4ZmYsIDQsNSwgNiw3LDB4ZmYsMHhmZiwgOCw5LDEwLDExfTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrMVsxNl0gICA9IHsweGZmLCAweGZmLCAwLDEsIDIsMywgMHhmZiwweGZmLCA0LDUsIDYsNywgMHhmZiwweGZmLCA4LDl9OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50OF90IG1hc2syWzE2XSA9ICAgIHs2LDcsMHhmZiwweGZmLCA4LDksMTAsMTEsIDB4ZmYsIDB4ZmYsIDEyLDEzLDE0LDE1LCAweGZmLCAweGZmfTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrMmxvWzE2XSA9IHsweGZmLDB4ZmYsIDB4ZmYsMHhmZiwgMCwxLCAweGZmLDB4ZmYsIDB4ZmYsMHhmZiwgMiwzLCAweGZmLDB4ZmYsIDB4ZmYsMHhmZn07CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQ4X3QgbWFzazJtZWRbMTZdID0gezQsNSwgMHhmZiwweGZmLDB4ZmYsMHhmZiwgNiw3LCAweGZmLCAweGZmLDB4ZmYsMHhmZiwgOCw5LCAweGZmLCAweGZmfTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDhfdCBtYXNrMmhpWzE2XSA9IHsweGZmLCAweGZmLCAxMCwxMSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMTIsMTMsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsMTQsMTV9OworCisgICAgdjAgPSAgX21tX3VucGFja2xvX2VwaTE2KHZhbC0+dmFsWzBdLCB2YWwtPnZhbFsxXSk7IC8vMCwxLCAzLDQsIDYsNywgOSwxMAorICAgIHYyID0gIF9tbV91bnBhY2toaV9lcGkxNih2YWwtPnZhbFswXSwgdmFsLT52YWxbMV0pOyAvLzEyLDEzLCAxNSwxNiwgMTgsMTksIDIxLDIyLAorICAgIHYxID0gIF9tbV9hbGlnbnJfZXBpOCh2MiwgdjAsIDEyKTsgLy85LDEwLCAxMiwxMywgMTUsMTYsIDE4LDE5CisgICAgdi52YWxbMF0gPSAgX21tX3NodWZmbGVfZXBpOCh2MCwgKihfX20xMjhpKiltYXNrMCk7IC8vbWFrZSBob2xlcyBmb3IgdGhlIHYudmFsWzJdIGRhdGEgZW1iZWRkaW5nCisgICAgdi52YWxbMl0gPSAgX21tX3NodWZmbGVfZXBpOCh2YWwtPnZhbFsyXSwgKihfX20xMjhpKiltYXNrMmxvKTsgLy9tYWtlIHBsdWdzIGZvciB0aGUgdi52YWxbMl0gZGF0YSBlbWJlZGRpbmcKKyAgICBjZmYgPSBfbW1fY21wZXFfZXBpMTYodjAsIHYwKTsgLy9hbGwgZmYKKyAgICBibGRtYXNrID0gX21tX2NtcGVxX2VwaTE2KCooX19tMTI4aSopbWFzazAsIGNmZik7CisgICAgdi52YWxbMF0gPSBfTU1fQkxFTkRWX0VQSTgodi52YWxbMF0sIHYudmFsWzJdLCBibGRtYXNrKTsKKyAgICB2c3QxcV91MTYocHRyLCAgICAgIHYudmFsWzBdKTsKKyAgICB2LnZhbFswXSA9ICBfbW1fc2h1ZmZsZV9lcGk4KHYxLCAqKF9fbTEyOGkqKW1hc2sxKTsgLy9tYWtlIGhvbGVzIGZvciB0aGUgdi52YWxbMl0gZGF0YSBlbWJlZGRpbmcKKyAgICB2LnZhbFsyXSA9ICBfbW1fc2h1ZmZsZV9lcGk4KHZhbC0+dmFsWzJdLCAqKF9fbTEyOGkqKW1hc2sybWVkKTsgLy9tYWtlIHBsdWdzIGZvciB0aGUgdi52YWxbMl0gZGF0YSBlbWJlZGRpbmcKKyAgICBibGRtYXNrID0gX21tX2NtcGVxX2VwaTE2KCooX19tMTI4aSopbWFzazEsIGNmZik7CisgICAgdi52YWxbMV0gPSBfTU1fQkxFTkRWX0VQSTgodi52YWxbMF0sdi52YWxbMl0sIGJsZG1hc2spOworICAgIHZzdDFxX3UxNigocHRyICsgOCksICB2LnZhbFsxXSk7CisgICAgdi52YWxbMF0gPSAgX21tX3NodWZmbGVfZXBpOCh2MiwgKihfX20xMjhpKiltYXNrMik7IC8vbWFrZSBob2xlcyBmb3IgdGhlIHYudmFsWzJdIGRhdGEgZW1iZWRkaW5nCisgICAgdi52YWxbMl0gPSAgX21tX3NodWZmbGVfZXBpOCh2YWwtPnZhbFsyXSwgKihfX20xMjhpKiltYXNrMmhpKTsgLy9tYWtlIHBsdWdzIGZvciB0aGUgdi52YWxbMl0gZGF0YSBlbWJlZGRpbmcKKyAgICBibGRtYXNrID0gX21tX2NtcGVxX2VwaTE2KCooX19tMTI4aSopbWFzazIsIGNmZik7CisgICAgdi52YWxbMl0gPSBfTU1fQkxFTkRWX0VQSTgodi52YWxbMF0sdi52YWxbMl0sIGJsZG1hc2sgKTsKKyAgICB2c3QxcV91MTYoKHB0ciArIDE2KSwgdi52YWxbMl0pOworfQorI2RlZmluZSB2c3QzcV91MTYocHRyLCB2YWwpIHZzdDNxX3UxNl9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0M3FfdTMyKF9fdHJhbnNmZXJzaXplKDEyKSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDR4M190IHZhbCkvLyBWU1QzLjMyIHtkMCwgZDIsIGQ0fSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDNxX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoMTIpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4NHgzX3QqIHZhbCkKK3sKKyAgICAvL2EwLGExLGEyLGEzLCAgYjAsYjEsYjIsYjMsIGMwLGMxLGMyLGMzIC0+IGEwLGIwLGMwLGExLCBiMSxjMSxhMixiMiwgYzIsYTMsYjMsYzMKKyAgICB1aW50MzJ4NHgzX3QgdjsKKyAgICBfX20xMjhpIHRtcDAsIHRtcDEsdG1wMjsKKyAgICB0bXAwID0gX21tX3VucGFja2xvX2VwaTMyKHZhbC0+dmFsWzBdLCB2YWwtPnZhbFsxXSk7IC8vYTAsYjAsYTEsYjEKKyAgICB0bXAxID0gX21tX3VucGFja2hpX2VwaTMyKHZhbC0+dmFsWzBdLCB2YWwtPnZhbFsxXSk7IC8vYTIsYjIsYTMsYjMKKyAgICB0bXAyID0gX21tX3VucGFja2xvX2VwaTMyKHZhbC0+dmFsWzFdLCB2YWwtPnZhbFsyXSk7IC8vYjAsYzAsYjEsYzEKKyAgICB2LnZhbFsxXSA9IF9tbV9jYXN0cHNfc2kxMjgoX21tX3NodWZmbGVfcHMoX21tX2Nhc3RzaTEyOF9wcyh0bXAyKSxfbW1fY2FzdHNpMTI4X3BzKHRtcDEpLCBfTU1fU0hVRkZMRSgxLDAsMywyKSkpOyAvL2IxLGMxLGEyLGIyLAorICAgIHYudmFsWzJdID0gX21tX3VucGFja2hpX2VwaTY0KHRtcDEsIHZhbC0+dmFsWzJdKTsgLy9hMyxiMywgYzIsYzMKKyAgICB2LnZhbFsyXSA9IF9tbV9zaHVmZmxlX2VwaTMyKHYudmFsWzJdLCAyIHwgKDAgPDwgMikgfCAoMSA8PCA0KSB8ICgzIDw8IDYpKTsgLy9jMixhMyxiMyxjMworICAgIHRtcDEgPSBfbW1fdW5wYWNrbG9fZXBpMzIodG1wMix2YWwtPnZhbFswXSk7IC8vYjAsYTAsYzAsYTEKKyAgICB2LnZhbFswXSA9IF9tbV9jYXN0cHNfc2kxMjgoX21tX3NodWZmbGVfcHMoX21tX2Nhc3RzaTEyOF9wcyh0bXAwKSxfbW1fY2FzdHNpMTI4X3BzKHRtcDEpLCBfTU1fU0hVRkZMRSgzLDIsMSwwKSkpOyAvL2EwLGIwLGMwLGExLAorCisgICAgdnN0MXFfdTMyKHB0ciwgICAgICB2LnZhbFswXSk7CisgICAgdnN0MXFfdTMyKChwdHIgKyA0KSwgIHYudmFsWzFdKTsKKyAgICB2c3QxcV91MzIoKHB0ciArIDgpLCAgdi52YWxbMl0pOworfQorI2RlZmluZSB2c3QzcV91MzIocHRyLCB2YWwpIHZzdDNxX3UzMl9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0M3FfczgoX190cmFuc2ZlcnNpemUoNDgpIGludDhfdCAqIHB0ciwgaW50OHgxNngzX3QgdmFsKTsKK3ZvaWQgdnN0M3FfczhfcHRyKF9fdHJhbnNmZXJzaXplKDQ4KSBpbnQ4X3QgKiBwdHIsIGludDh4MTZ4M190ICogdmFsKTsKKyNkZWZpbmUgdnN0M3FfczgocHRyLCB2YWwpIHZzdDNxX3U4KCh1aW50OF90KikocHRyKSwgdmFsKQorCisvL3ZvaWQgdnN0M3FfczE2KF9fdHJhbnNmZXJzaXplKDI0KSBpbnQxNl90ICogcHRyLCBpbnQxNng4eDNfdCB2YWwpOwordm9pZCB2c3QzcV9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDI0KSBpbnQxNl90ICogcHRyLCBpbnQxNng4eDNfdCAqIHZhbCk7CisjZGVmaW5lIHZzdDNxX3MxNihwdHIsIHZhbCkgdnN0M3FfdTE2KCh1aW50MTZfdCopKHB0ciksIHZhbCkKKworLy92b2lkIHZzdDNxX3MzMihfX3RyYW5zZmVyc2l6ZSgxMikgaW50MzJfdCAqIHB0ciwgaW50MzJ4NHgzX3QgdmFsKTsKK3ZvaWQgdnN0M3FfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSgxMikgaW50MzJfdCAqIHB0ciwgaW50MzJ4NHgzX3QgKiB2YWwpOworI2RlZmluZSB2c3QzcV9zMzIocHRyLCB2YWwpICB2c3QzcV91MzIoKHVpbnQzMl90KikocHRyKSwgdmFsKQorCisvL3ZvaWQgdnN0M3FfZjE2KF9fdHJhbnNmZXJzaXplKDI0KSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4OHgzX3QgdmFsKTsvLyBWU1QzLjE2IHtkMCwgZDIsIGQ0fSwgW3IwXQordm9pZCB2c3QzcV9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDI0KSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4OHgzX3QgKiB2YWwpOworLy8gSUEzMiBTSU1EIGRvZXNuJ3Qgd29yayB3aXRoIDE2Yml0IGZsb2F0cyBjdXJyZW50bHkKKworLy92b2lkIHZzdDNxX2YzMihfX3RyYW5zZmVyc2l6ZSgxMikgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDR4M190IHZhbCkvLyBWU1QzLjMyIHtkMCwgZDIsIGQ0fSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDNxX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoMTIpIGZsb2F0MzJfdCAqIHB0ciwgZmxvYXQzMng0eDNfdCogdmFsKQoreworICAgIGZsb2F0MzJ4NHgzX3QgdjsKKyAgICBfX20xMjggdG1wMCwgdG1wMSx0bXAyOworICAgIHRtcDAgPSBfbW1fdW5wYWNrbG9fcHModmFsLT52YWxbMF0sIHZhbC0+dmFsWzFdKTsgLy9hMCxiMCxhMSxiMQorICAgIHRtcDEgPSBfbW1fdW5wYWNraGlfcHModmFsLT52YWxbMF0sIHZhbC0+dmFsWzFdKTsgLy9hMixiMixhMyxiMworICAgIHRtcDIgPSBfbW1fdW5wYWNrbG9fcHModmFsLT52YWxbMV0sIHZhbC0+dmFsWzJdKTsgLy9iMCxjMCxiMSxjMQorICAgIHYudmFsWzFdID0gX21tX3NodWZmbGVfcHModG1wMix0bXAxLCBfTU1fU0hVRkZMRSgxLDAsMywyKSk7IC8vYjEsYzEsYTIsYjIsCisgICAgdi52YWxbMl0gPSBfbW1fbW92ZWhsX3BzKHZhbC0+dmFsWzJdLHRtcDEpOyAvL2EzLGIzLCBjMixjMworICAgIHYudmFsWzJdID0gX21tX3NodWZmbGVfcHModi52YWxbMl0sdi52YWxbMl0sIF9NTV9TSFVGRkxFKDMsMSwwLDIpKTsgLy9jMixhMyxiMyxjMworICAgIHRtcDEgPSBfbW1fdW5wYWNrbG9fcHModG1wMix2YWwtPnZhbFswXSk7IC8vYjAsYTAsYzAsYTEKKyAgICB2LnZhbFswXSA9IF9tbV9zaHVmZmxlX3BzKHRtcDAsdG1wMSwgX01NX1NIVUZGTEUoMywyLDEsMCkpOyAvL2EwLGIwLGMwLGExLAorCisgICAgdnN0MXFfZjMyKCBwdHIsICAgIHYudmFsWzBdKTsKKyAgICB2c3QxcV9mMzIoIChwdHIgKyA0KSwgIHYudmFsWzFdKTsKKyAgICB2c3QxcV9mMzIoIChwdHIgKyA4KSwgIHYudmFsWzJdKTsKK30KKyNkZWZpbmUgdnN0M3FfZjMyKHB0ciwgdmFsKSB2c3QzcV9mMzJfcHRyKHB0ciwgJnZhbCkKKworLy92b2lkIHZzdDNxX3A4KF9fdHJhbnNmZXJzaXplKDQ4KSBwb2x5OF90ICogcHRyLCBwb2x5OHgxNngzX3QgdmFsKTsvLyBWU1QzLjgge2QwLCBkMiwgZDR9LCBbcjBdCit2b2lkIHZzdDNxX3A4X3B0cihfX3RyYW5zZmVyc2l6ZSg0OCkgcG9seThfdCAqIHB0ciwgcG9seTh4MTZ4M190ICogdmFsKTsKKyNkZWZpbmUgdnN0M3FfcDggdnN0M3FfdTgKKworLy92b2lkIHZzdDNxX3AxNihfX3RyYW5zZmVyc2l6ZSgyNCkgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng4eDNfdCB2YWwpOy8vIFZTVDMuMTYge2QwLCBkMiwgZDR9LCBbcjBdCit2b2lkIHZzdDNxX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoMjQpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4OHgzX3QgKiB2YWwpOworI2RlZmluZSB2c3QzcV9wMTYgdnN0M3FfdTE2CisKKy8vdm9pZCB2c3QzX3U4KF9fdHJhbnNmZXJzaXplKDI0KSB1aW50OF90ICogcHRyLCB1aW50OHg4eDNfdCB2YWwpLy8gVlNUMy44IHtkMCwgZDEsIGQyfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDNfdThfcHRyKF9fdHJhbnNmZXJzaXplKDI0KSB1aW50OF90ICogcHRyLCB1aW50OHg4eDNfdCogdmFsKQoreworICAgIF9fbTEyOGkgdG1wLCBzaDAsIHNoMSwgdmFsMCwgdmFsMjsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2swWzE2XSA9IHsgMCwgOCwgMTYsIDEsIDksIDE3LCAyLCAxMCwgMTgsIDMsIDExLCAxOSwgNCwgMTIsIDIwLCA1fTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2sxWzE2XSA9IHsxMywgMjEsIDYsIDE0LCAyMiwgNywgMTUsIDIzLCAwLDAsMCwwLDAsMCwwLDB9OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazBfc2VsWzE2XSA9IHswLCAwLCAweGZmLCAwLCAwLCAweGZmLCAwLCAwLCAweGZmLCAwLCAwLCAweGZmLCAwLCAwLCAweGZmLCAwfTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2sxX3NlbFsxNl0gPSB7MCwgMHhmZiwgMCwgMCwgMHhmZiwgMCwgMCwgMHhmZiwgMCwwLDAsMCwwLDAsMCwwfTsKKyAgICB0bXAgPSBfbW1fdW5wYWNrbG9fZXBpNjQoX3BNMTI4aSh2YWwtPnZhbFswXSksIF9wTTEyOGkodmFsLT52YWxbMV0pICk7CisgICAgc2gwID0gIF9tbV9zaHVmZmxlX2VwaTgodG1wLCAqKF9fbTEyOGkqKW1hc2swKTsgLy9mb3IgYmk+MTUgYmkgaXMgd3JhcHBlZCAoYmktPTE1KQorICAgIHZhbDIgPSBfcE0xMjhpKHZhbC0+dmFsWzJdKTsKKyAgICBzaDEgPSAgX21tX3NodWZmbGVfZXBpOCh2YWwyLCAqKF9fbTEyOGkqKW1hc2swKTsKKyAgICB2YWwwID0gX01NX0JMRU5EVl9FUEk4KHNoMCwgc2gxLCAqKF9fbTEyOGkqKW1hc2swX3NlbCk7CisgICAgdnN0MXFfdTgocHRyLCAgIHZhbDApOyAvL3N0b3JlIGFzIDEyOCBiaXQgc3RydWN0dXJlCisgICAgc2gwID0gIF9tbV9zaHVmZmxlX2VwaTgodG1wLCAqKF9fbTEyOGkqKW1hc2sxKTsgLy9mb3IgYmk+MTUgYmkgaXMgd3JhcHBlZCAoYmktPTE1KQorICAgIHNoMSA9ICBfbW1fc2h1ZmZsZV9lcGk4KHZhbDIsICooX19tMTI4aSopbWFzazEpOworICAgIHZhbDIgPSBfTU1fQkxFTkRWX0VQSTgoc2gwLCBzaDEsICooX19tMTI4aSopbWFzazFfc2VsKTsKKyAgICBfTTY0KCgqKF9fbTY0XzEyOCopKHB0ciArIDE2KSksICB2YWwyKTsgLy9uZWVkIGl0IHRvIGZpdCBpbnRvICpwdHIgbWVtb3J5Cit9CisjZGVmaW5lIHZzdDNfdTgocHRyLCB2YWwpIHZzdDNfdThfcHRyKHB0ciwgJnZhbCkKKworLy92b2lkIHZzdDNfdTE2KF9fdHJhbnNmZXJzaXplKDEyKSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDR4M190IHZhbCkvLyBWU1QzLjE2IHtkMCwgZDEsIGQyfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDNfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSgxMikgdWludDE2X3QgKiBwdHIsIHVpbnQxNng0eDNfdCogdmFsKQoreworICAgIF9fbTEyOGkgdG1wLCB2YWwwLCB2YWwxLCB2YWwyOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazBbMTZdID0gezAsMSwgOCw5LCAxNiwxNywgMiwzLCAxMCwxMSwgMTgsMTksIDQsNSwgMTIsMTN9OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazFbMTZdID0gezIwLDIxLCA2LDcsIDE0LDE1LCAyMiwyMywgICAwLDAsMCwwLDAsMCwwLDB9OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiB1aW50MTZfdCBtYXNrMGZbOF0gPSB7MHhmZmZmLCAweGZmZmYsIDAsIDB4ZmZmZiwgMHhmZmZmLCAwLCAweGZmZmYsIDB4ZmZmZn07IC8vaWYgYWxsIG9uZXMgd2UgdGFrZSB0aGUgcmVzdWx0IGZyb20gdi52YWxbMF0gIG90aGVyd2lzZSBmcm9tIHYudmFsWzFdCisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQxNl90IG1hc2sxZls4XSA9IHsweGZmZmYsIDAsIDAsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmfTsgLy9pZiBhbGwgb25lcyB3ZSB0YWtlIHRoZSByZXN1bHQgZnJvbSB2LnZhbFsxXSAgb3RoZXJ3aXNlIGZyb20gdi52YWxbMF0KKyAgICB0bXAgPSBfbW1fdW5wYWNrbG9fZXBpNjQoX3BNMTI4aSh2YWwtPnZhbFswXSksIF9wTTEyOGkodmFsLT52YWxbMV0pKTsKKyAgICB2YWwwID0gX21tX3NodWZmbGVfZXBpOCh0bXAsICooX19tMTI4aSopbWFzazApOworICAgIHZhbDIgPSBfcE0xMjhpKHZhbC0+dmFsWzJdKTsKKyAgICB2YWwxID0gX21tX3NodWZmbGVfZXBpOCh2YWwyLCAqKF9fbTEyOGkqKW1hc2swKTsKKyAgICB2YWwwID0gX01NX0JMRU5EVl9FUEk4KHZhbDEsIHZhbDAsICooX19tMTI4aSopbWFzazBmKTsKKyAgICB2c3QxcV91MTYocHRyLCAgICB2YWwwKTsgLy9zdG9yZSBhcyAxMjggYml0IHN0cnVjdHVyZQorICAgIHZhbDAgPSBfbW1fc2h1ZmZsZV9lcGk4KHRtcCwgKihfX20xMjhpKiltYXNrMSk7CisgICAgdmFsMSA9IF9tbV9zaHVmZmxlX2VwaTgodmFsMiwgKihfX20xMjhpKiltYXNrMSk7CisgICAgdmFsMSA9IF9NTV9CTEVORFZfRVBJOCh2YWwwLCB2YWwxLCAgKihfX20xMjhpKiltYXNrMWYpOyAvL2NoYW5nZSB0aGUgb3BlcmFuZHMgb3JkZXIKKyAgICBfTTY0KCgqKF9fbTY0XzEyOCopKHB0ciArIDgpKSwgIHZhbDEpOyAvL25lZWQgaXQgdG8gZml0IGludG8gKnB0ciBtZW1vcnkKK30KKyNkZWZpbmUgdnN0M191MTYocHRyLCB2YWwpIHZzdDNfdTE2X3B0cihwdHIsICZ2YWwpCisKKy8vdm9pZCB2c3QzX3UzMihfX3RyYW5zZmVyc2l6ZSg2KSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDJ4M190IHZhbCkvLyBWU1QzLjMyIHtkMCwgZDEsIGQyfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDNfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSg2KSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDJ4M190KiB2YWwpCit7CisgICAgLy92YWwtPnZhbFswXTowLDMsdmFsLT52YWxbMV06MSw0OyB2YWwtPnZhbFsyXToyLDUseCx4OworICAgIF9fbTEyOGkgdmFsMCwgdmFsMTsKKyAgICB2YWwwID0gX21tX3VucGFja2xvX2VwaTY0KF9wTTEyOGkodmFsLT52YWxbMV0pLCBfcE0xMjhpKHZhbC0+dmFsWzJdKSk7IC8vdmFsWzBdOiAxLDQsMiw1CisgICAgdmFsMCA9IF9tbV9zaHVmZmxlX2VwaTMyKHZhbDAsIDAgfCAoMiA8PCAyKSB8ICgxIDw8IDQpIHwgKDMgPDwgNikpOyAvLzEsMiw0LDUKKyAgICB2YWwxID0gX21tX3NybGlfc2kxMjgodmFsMCwgOCk7IC8vNCw1LCB4LHgKKyAgICBfTTY0KCgqKF9fbTY0XzEyOCopKHB0ciArIDQpKSwgIHZhbDEpOworICAgIHZhbDAgPSBfbW1fdW5wYWNrbG9fZXBpMzIoX3BNMTI4aSh2YWwtPnZhbFswXSksIHZhbDApOyAvLzAsMSwzLDIKKyAgICB2YWwwID0gX21tX3NodWZmbGVfZXBpMzIodmFsMCwgMCB8ICgxIDw8IDIpIHwgKDMgPDwgNCkgfCAoMiA8PCA2KSk7IC8vMCwxLDIsIDMKKyAgICB2c3QxcV91MzIocHRyLCB2YWwwKTsgLy9zdG9yZSBhcyAxMjggYml0IHN0cnVjdHVyZQorfQorI2RlZmluZSB2c3QzX3UzMihwdHIsIHZhbCkgdnN0M191MzJfcHRyKHB0ciwgJnZhbCkKKworLy92b2lkIHZzdDNfdTY0KF9fdHJhbnNmZXJzaXplKDMpIHVpbnQ2NF90ICogcHRyLCB1aW50NjR4MXgzX3QgdmFsKS8vIFZTVDEuNjQge2QwLCBkMSwgZDJ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0M191NjRfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHVpbnQ2NF90ICogcHRyLCB1aW50NjR4MXgzX3QqIHZhbCkKK3sKKyAgICAqKHB0cikgPSB2YWwtPnZhbFswXS5tNjRfdTY0WzBdOworICAgICoocHRyICsgMSkgPSB2YWwtPnZhbFsxXS5tNjRfdTY0WzBdOworICAgICoocHRyICsgMikgPSB2YWwtPnZhbFsyXS5tNjRfdTY0WzBdOworfQorI2RlZmluZSB2c3QzX3U2NChwdHIsIHZhbCkgdnN0M191NjRfcHRyKHB0ciwgJnZhbCkKKworLy92b2lkIHZzdDNfczgoX190cmFuc2ZlcnNpemUoMjQpIGludDhfdCAqIHB0ciwgaW50OHg4eDNfdCB2YWwpICAvLyBWU1QzLjgge2QwLCBkMSwgZDJ9LCBbcjBdCisjZGVmaW5lIHZzdDNfczgocHRyLCB2YWwpIHZzdDNfdThfcHRyKCh1aW50OF90KilwdHIsICZ2YWwpCisKKy8vdm9pZCB2c3QzX3MxNihfX3RyYW5zZmVyc2l6ZSgxMikgaW50MTZfdCAqIHB0ciwgaW50MTZ4NHgzX3QgdmFsKSAgLy8gVlNUMy4xNiB7ZDAsIGQxLCBkMn0sIFtyMF0KKyNkZWZpbmUgdnN0M19zMTYocHRyLCB2YWwpIHZzdDNfdTE2X3B0cigodWludDE2X3QqKXB0ciwgJnZhbCkKKworLy92b2lkIHZzdDNfczMyKF9fdHJhbnNmZXJzaXplKDYpIGludDMyX3QgKiBwdHIsIGludDMyeDJ4M190IHZhbCk7IC8vIFZTVDMuMzIge2QwLCBkMSwgZDJ9LCBbcjBdCisjZGVmaW5lIHZzdDNfczMyKHB0ciwgdmFsKSB2c3QzX3UzMl9wdHIoKHVpbnQzMl90KilwdHIsICZ2YWwpCisKKy8vdm9pZCB2c3QzX3M2NChfX3RyYW5zZmVyc2l6ZSgzKSBpbnQ2NF90ICogcHRyLCBpbnQ2NHgxeDNfdCB2YWwpIC8vIFZTVDEuNjQge2QwLCBkMSwgZDJ9LCBbcjBdCisjZGVmaW5lIHZzdDNfczY0KHB0ciwgdmFsKSB2c3QzX3U2NF9wdHIoKHVpbnQ2NF90KilwdHIsICZ2YWwpCisKKy8vdm9pZCB2c3QzX2YxNihfX3RyYW5zZmVyc2l6ZSgxMikgX19mcDE2ICogcHRyLCBmbG9hdDE2eDR4M190IHZhbCk7Ly8gVlNUMy4xNiB7ZDAsIGQxLCBkMn0sIFtyMF0KK3ZvaWQgdnN0M19mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDEyKSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4NHgzX3QgKiB2YWwpOyAvLyBWU1QzLjE2IHtkMCwgZDEsIGQyfSwgW3IwXQorLy8gSUEzMiBTSU1EIGRvZXNuJ3Qgd29yayB3aXRoIDE2Yml0IGZsb2F0cyBjdXJyZW50bHksIHNvIG5lZWQgdG8gZ28gdG8gMzIgYml0IGFuZCB0aGVuIHdvcmsgd2l0aCB0d28gMTI4Yml0IHJlZ2lzdGVycy4gU2VlIHZsZDFxX2YxNiBmb3IgZXhhbXBsZQorCisvL3ZvaWQgdnN0M19mMzIoX190cmFuc2ZlcnNpemUoNikgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDJ4M190IHZhbCkvLyBWU1QzLjMyIHtkMCwgZDEsIGQyfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDNfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSg2KSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4MngzX3QqIHZhbCkKK3sKKyAgICAvL3ZhbC0+dmFsWzBdOjAsMyx2YWwtPnZhbFsxXToxLDQ7IHZhbC0+dmFsWzJdOjIsNSx4LHg7ICAgLT4gMCwyLCA0LDEsIDMsNQorICAgICoocHRyKSA9ICAgdmFsLT52YWxbMF0ubTY0X2YzMlswXTsKKyAgICAqKHB0ciArIDEpID0gdmFsLT52YWxbMV0ubTY0X2YzMlswXTsKKyAgICAqKHB0ciArIDIpID0gdmFsLT52YWxbMl0ubTY0X2YzMlswXTsKKyAgICAqKHB0ciArIDMpID0gdmFsLT52YWxbMF0ubTY0X2YzMlsxXTsKKyAgICAqKHB0ciArIDQpID0gdmFsLT52YWxbMV0ubTY0X2YzMlsxXTsKKyAgICAqKHB0ciArIDUpID0gdmFsLT52YWxbMl0ubTY0X2YzMlsxXTsKK30KKyNkZWZpbmUgdnN0M19mMzIocHRyLCB2YWwpIHZzdDNfZjMyX3B0cihwdHIsICZ2YWwpCisKKy8vdm9pZCB2c3QzX3A4KF9fdHJhbnNmZXJzaXplKDI0KSBwb2x5OF90ICogcHRyLCBwb2x5OHg4eDNfdCB2YWwpOy8vIFZTVDMuOCB7ZDAsIGQxLCBkMn0sIFtyMF0KK3ZvaWQgdnN0M19wOF9wdHIoX190cmFuc2ZlcnNpemUoMjQpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDh4M190ICogdmFsKTsKKyNkZWZpbmUgdnN0M19wOCB2c3QzX3U4CisKKy8vdm9pZCB2c3QzX3AxNihfX3RyYW5zZmVyc2l6ZSgxMikgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng0eDNfdCB2YWwpOy8vIFZTVDMuMTYge2QwLCBkMSwgZDJ9LCBbcjBdCit2b2lkIHZzdDNfcDE2X3B0cihfX3RyYW5zZmVyc2l6ZSgxMikgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng0eDNfdCAqIHZhbCk7CisjZGVmaW5lIHZzdDNfcDE2IHZzdDNfczE2CisKKy8vKioqKioqKioqKioqKioqICBRdWFkcnVwbGVzIHN0b3JlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy92b2lkIHZzdDRxX3U4KF9fdHJhbnNmZXJzaXplKDY0KSB1aW50OF90ICogcHRyLCB1aW50OHgxNng0X3QgdmFsKS8vIFZTVDQuOCB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0NHFfdThfcHRyKF9fdHJhbnNmZXJzaXplKDY0KSB1aW50OF90ICogcHRyLCB1aW50OHgxNng0X3QqIHZhbCkKK3sKKyAgICBfX20xMjhpIHRtcDEsIHRtcDIsIHJlczsKKyAgICB0bXAxID0gX21tX3VucGFja2xvX2VwaTgodmFsLT52YWxbMF0sIHZhbC0+dmFsWzFdKTsgLy8gIDAsMSwgNCw1LCA4LDksIDEyLDEzLCAxNiwxNywgMjAsMjEsIDI0LDI1LCAyOCwyOQorICAgIHRtcDIgPSBfbW1fdW5wYWNrbG9fZXBpOCh2YWwtPnZhbFsyXSwgdmFsLT52YWxbM10pOyAvLyAgMiwzLCA2LDcsIDEwLDExLCAxNCwxNSwgMTgsMTksIDIyLDIzLCAyNiwyNywgMzAsMzEKKyAgICByZXMgPSBfbW1fdW5wYWNrbG9fZXBpMTYodG1wMSwgdG1wMik7IC8vMCwxLCAyLDMsIDQsNSwgNiw3LCA4LDksIDEwLDExLCAxMiwxMywgMTQsMTUKKyAgICB2c3QxcV91OChwdHIsICByZXMpOworICAgIHJlcyA9IF9tbV91bnBhY2toaV9lcGkxNih0bXAxLCB0bXAyKTsgLy8xNiwxNywgMTgsMTksIDIwLDIxLCAyMiwyMywgMjQsMjUsIDI2LDI3LCAyOCwyOSwgMzAsMzEKKyAgICB2c3QxcV91OCgocHRyICsgMTYpLCByZXMpOworICAgIHRtcDEgPSBfbW1fdW5wYWNraGlfZXBpOCh2YWwtPnZhbFswXSwgdmFsLT52YWxbMV0pOyAvLworICAgIHRtcDIgPSBfbW1fdW5wYWNraGlfZXBpOCh2YWwtPnZhbFsyXSwgdmFsLT52YWxbM10pOyAvLworICAgIHJlcyA9IF9tbV91bnBhY2tsb19lcGkxNih0bXAxLCB0bXAyKTsgLy8KKyAgICB2c3QxcV91OCgocHRyICsgMzIpLCByZXMpOworICAgIHJlcyA9IF9tbV91bnBhY2toaV9lcGkxNih0bXAxLCB0bXAyKTsgLy8KKyAgICB2c3QxcV91OCgocHRyICsgNDgpLCByZXMpOworfQorI2RlZmluZSB2c3Q0cV91OChwdHIsIHZhbCkgdnN0NHFfdThfcHRyKHB0ciwgJnZhbCkKKworLy92b2lkIHZzdDRxX3UxNihfX3RyYW5zZmVyc2l6ZSgzMikgdWludDE2X3QgKiBwdHIsIHVpbnQxNng4eDRfdCB2YWwpLy8gVlNUNC4xNiB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0NHFfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzMikgdWludDE2X3QgKiBwdHIsIHVpbnQxNng4eDRfdCogdmFsKQoreworICAgIHVpbnQxNng4eDRfdCB2OworICAgIF9fbTEyOGkgdG1wMSwgdG1wMjsKKyAgICB0bXAxID0gX21tX3VucGFja2xvX2VwaTE2KHZhbC0+dmFsWzBdLCB2YWwtPnZhbFsxXSk7IC8vMCwxLCA0LDUsIDgsOSwgMTIsMTMKKyAgICB0bXAyID0gX21tX3VucGFja2xvX2VwaTE2KHZhbC0+dmFsWzJdLCB2YWwtPnZhbFszXSk7IC8vMiwzLCA2LDcgLCAxMCwxMSwgMTQsMTUKKyAgICB2LnZhbFswXSA9IF9tbV91bnBhY2tsb19lcGkzMih0bXAxLCB0bXAyKTsKKyAgICB2LnZhbFsxXSA9IF9tbV91bnBhY2toaV9lcGkzMih0bXAxLCB0bXAyKTsKKyAgICB0bXAxID0gX21tX3VucGFja2hpX2VwaTE2KHZhbC0+dmFsWzBdLCB2YWwtPnZhbFsxXSk7IC8vMCwxLCA0LDUsIDgsOSwgMTIsMTMKKyAgICB0bXAyID0gX21tX3VucGFja2hpX2VwaTE2KHZhbC0+dmFsWzJdLCB2YWwtPnZhbFszXSk7IC8vMiwzLCA2LDcgLCAxMCwxMSwgMTQsMTUKKyAgICB2LnZhbFsyXSA9IF9tbV91bnBhY2tsb19lcGkzMih0bXAxLCB0bXAyKTsKKyAgICB2LnZhbFszXSA9IF9tbV91bnBhY2toaV9lcGkzMih0bXAxLCB0bXAyKTsKKyAgICB2c3QxcV91MTYocHRyLCAgICAgdi52YWxbMF0pOworICAgIHZzdDFxX3UxNigocHRyICsgOCksIHYudmFsWzFdKTsKKyAgICB2c3QxcV91MTYoKHB0ciArIDE2KSx2LnZhbFsyXSk7CisgICAgdnN0MXFfdTE2KChwdHIgKyAyNCksIHYudmFsWzNdKTsKK30KKyNkZWZpbmUgdnN0NHFfdTE2KHB0ciwgdmFsKSB2c3Q0cV91MTZfcHRyKHB0ciwgJnZhbCkKKworLy92b2lkIHZzdDRxX3UzMihfX3RyYW5zZmVyc2l6ZSgxNikgdWludDMyX3QgKiBwdHIsIHVpbnQzMng0eDRfdCB2YWwpLy8gVlNUNC4zMiB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0NHFfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSgxNikgdWludDMyX3QgKiBwdHIsIHVpbnQzMng0eDRfdCogdmFsKQoreworICAgIHVpbnQxNng4eDRfdCB2OworICAgIF9fbTEyOGkgdG1wMSwgdG1wMjsKKyAgICB0bXAxID0gX21tX3VucGFja2xvX2VwaTMyKHZhbC0+dmFsWzBdLCB2YWwtPnZhbFsxXSk7IC8vMCwxLCA0LDUsIDgsOSwgMTIsMTMKKyAgICB0bXAyID0gX21tX3VucGFja2xvX2VwaTMyKHZhbC0+dmFsWzJdLCB2YWwtPnZhbFszXSk7IC8vMiwzLCA2LDcgLCAxMCwxMSwgMTQsMTUKKyAgICB2LnZhbFswXSA9IF9tbV91bnBhY2tsb19lcGk2NCh0bXAxLCB0bXAyKTsKKyAgICB2LnZhbFsxXSA9IF9tbV91bnBhY2toaV9lcGk2NCh0bXAxLCB0bXAyKTsKKyAgICB0bXAxID0gX21tX3VucGFja2hpX2VwaTMyKHZhbC0+dmFsWzBdLCB2YWwtPnZhbFsxXSk7IC8vMCwxLCA0LDUsIDgsOSwgMTIsMTMKKyAgICB0bXAyID0gX21tX3VucGFja2hpX2VwaTMyKHZhbC0+dmFsWzJdLCB2YWwtPnZhbFszXSk7IC8vMiwzLCA2LDcgLCAxMCwxMSwgMTQsMTUKKyAgICB2LnZhbFsyXSA9IF9tbV91bnBhY2tsb19lcGk2NCh0bXAxLCB0bXAyKTsKKyAgICB2LnZhbFszXSA9IF9tbV91bnBhY2toaV9lcGk2NCh0bXAxLCB0bXAyKTsKKyAgICB2c3QxcV91MzIocHRyLCAgICAgIHYudmFsWzBdKTsKKyAgICB2c3QxcV91MzIoKHB0ciArIDQpLCAgdi52YWxbMV0pOworICAgIHZzdDFxX3UzMigocHRyICsgOCksICB2LnZhbFsyXSk7CisgICAgdnN0MXFfdTMyKChwdHIgKyAxMiksIHYudmFsWzNdKTsKK30KKyNkZWZpbmUgdnN0NHFfdTMyKHB0ciwgdmFsKSB2c3Q0cV91MzJfcHRyKHB0ciwgJnZhbCkKKworLy92b2lkIHZzdDRxX3M4KF9fdHJhbnNmZXJzaXplKDY0KSBpbnQ4X3QgKiBwdHIsIGludDh4MTZ4NF90IHZhbCk7Cit2b2lkIHZzdDRxX3M4X3B0cihfX3RyYW5zZmVyc2l6ZSg2NCkgaW50OF90ICogcHRyLCBpbnQ4eDE2eDRfdCAqIHZhbCk7CisjZGVmaW5lIHZzdDRxX3M4KHB0ciwgdmFsKSB2c3Q0cV91OCgodWludDhfdCopKHB0ciksIHZhbCkKKworLy92b2lkIHZzdDRxX3MxNihfX3RyYW5zZmVyc2l6ZSgzMikgaW50MTZfdCAqIHB0ciwgaW50MTZ4OHg0X3QgdmFsKTsKK3ZvaWQgdnN0NHFfczE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzMikgaW50MTZfdCAqIHB0ciwgaW50MTZ4OHg0X3QgKiB2YWwpOworI2RlZmluZSB2c3Q0cV9zMTYocHRyLCB2YWwpIHZzdDRxX3UxNigodWludDE2X3QqKShwdHIpLCB2YWwpCisKKy8vdm9pZCB2c3Q0cV9zMzIoX190cmFuc2ZlcnNpemUoMTYpIGludDMyX3QgKiBwdHIsIGludDMyeDR4NF90IHZhbCk7Cit2b2lkIHZzdDRxX3MzMl9wdHIoX190cmFuc2ZlcnNpemUoMTYpIGludDMyX3QgKiBwdHIsIGludDMyeDR4NF90ICogdmFsKTsKKyNkZWZpbmUgdnN0NHFfczMyKHB0ciwgdmFsKSB2c3Q0cV91MzIoKHVpbnQzMl90KikocHRyKSwgdmFsKQorCisvL3ZvaWQgdnN0NHFfZjE2KF9fdHJhbnNmZXJzaXplKDMyKSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4OHg0X3QgdmFsKTsvLyBWU1Q0LjE2IHtkMCwgZDIsIGQ0LCBkNn0sIFtyMF0KK3ZvaWQgdnN0NHFfZjE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzMikgX19mcDE2ICogcHRyLCBmbG9hdDE2eDh4NF90ICogdmFsKTsKKy8vIElBMzIgU0lNRCBkb2Vzbid0IHdvcmsgd2l0aCAxNmJpdCBmbG9hdHMgY3VycmVudGx5CisKKy8vdm9pZCB2c3Q0cV9mMzIoX190cmFuc2ZlcnNpemUoMTYpIGZsb2F0MzJfdCAqIHB0ciwgZmxvYXQzMng0eDRfdCB2YWwpLy8gVlNUNC4zMiB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0NHFfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgxNikgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDR4NF90KiB2YWwpCit7CisgICAgX19tMTI4IHRtcDMsIHRtcDIsIHRtcDEsIHRtcDA7CisgICAgZmxvYXQzMng0eDRfdCB2OworICAgIHRtcDAgPSBfbW1fdW5wYWNrbG9fcHModmFsLT52YWxbMF0sIHZhbC0+dmFsWzFdKTsKKyAgICB0bXAyID0gX21tX3VucGFja2xvX3BzKHZhbC0+dmFsWzJdLCB2YWwtPnZhbFszXSk7CisgICAgdG1wMSA9IF9tbV91bnBhY2toaV9wcyh2YWwtPnZhbFswXSwgdmFsLT52YWxbMV0pOworICAgIHRtcDMgPSBfbW1fdW5wYWNraGlfcHModmFsLT52YWxbMl0sIHZhbC0+dmFsWzNdKTsKKyAgICB2LnZhbFswXSA9IF9tbV9tb3ZlbGhfcHModG1wMCwgdG1wMik7CisgICAgdi52YWxbMV0gPSBfbW1fbW92ZWhsX3BzKHRtcDIsIHRtcDApOworICAgIHYudmFsWzJdID0gX21tX21vdmVsaF9wcyh0bXAxLCB0bXAzKTsKKyAgICB2LnZhbFszXSA9IF9tbV9tb3ZlaGxfcHModG1wMywgdG1wMSk7CisgICAgdnN0MXFfZjMyKHB0ciwgICB2LnZhbFswXSk7CisgICAgdnN0MXFfZjMyKChwdHIgKyA0KSwgdi52YWxbMV0pOworICAgIHZzdDFxX2YzMigocHRyICsgOCksIHYudmFsWzJdKTsKKyAgICB2c3QxcV9mMzIoKHB0ciArIDEyKSwgdi52YWxbM10pOworfQorI2RlZmluZSB2c3Q0cV9mMzIocHRyLCB2YWwpIHZzdDRxX2YzMl9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0NHFfcDgoX190cmFuc2ZlcnNpemUoNjQpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDE2eDRfdCB2YWwpOy8vIFZTVDQuOCB7ZDAsIGQyLCBkNCwgZDZ9LCBbcjBdCit2b2lkIHZzdDRxX3A4X3B0cihfX3RyYW5zZmVyc2l6ZSg2NCkgcG9seThfdCAqIHB0ciwgcG9seTh4MTZ4NF90ICogdmFsKTsKKyNkZWZpbmUgdnN0NHFfcDggdnN0NHFfdTgKKworLy92b2lkIHZzdDRxX3AxNihfX3RyYW5zZmVyc2l6ZSgzMikgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng4eDRfdCB2YWwpOy8vIFZTVDQuMTYge2QwLCBkMiwgZDQsIGQ2fSwgW3IwXQordm9pZCB2c3Q0cV9wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDMyKSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDh4NF90ICogdmFsKTsKKyNkZWZpbmUgdnN0NHFfcDE2IHZzdDRxX3MxNgorCisvL3ZvaWQgdnN0NF91OChfX3RyYW5zZmVyc2l6ZSgzMikgdWludDhfdCAqIHB0ciwgdWludDh4OHg0X3QgdmFsKS8vIFZTVDQuOCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0NF91OF9wdHIoX190cmFuc2ZlcnNpemUoMzIpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDh4NF90KiB2YWwpCit7CisgICAgX19tMTI4aSBzaDAsIHNoMSwgdmFsMCwgdmFsMjsKKyAgICBzaDAgPSBfbW1fdW5wYWNrbG9fZXBpOChfcE0xMjhpKHZhbC0+dmFsWzBdKSxfcE0xMjhpKHZhbC0+dmFsWzFdKSk7IC8vIGEwLGIwLGExLGIxLGEyLGIyLGEzLGIzLGE0LGI0LGE1LGI1LCBhNixiNixhNyxiNywKKyAgICBzaDEgPSBfbW1fdW5wYWNrbG9fZXBpOChfcE0xMjhpKHZhbC0+dmFsWzJdKSxfcE0xMjhpKHZhbC0+dmFsWzNdKSk7IC8vIGMwLGQwLGMxLGQxLGMyLGQyLGMzLGQzLCBjNCxkNCxjNSxkNSxjNixkNixjNyxkNworICAgIHZhbDAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoc2gwLHNoMSk7IC8vIGEwLGIwLGMwLGQwLGExLGIxLGMxLGQxLGEyLGIyLGMyLGQyLGEzLGIzLGMzLGQzLAorICAgIHZhbDIgPSBfbW1fdW5wYWNraGlfZXBpMTYoc2gwLHNoMSk7IC8vYTQsYjQsYzQsZDQsYTUsYjUsYzUsZDUsIGE2LGI2LGM2LGQ2LGE3LGI3LGM3LGQ3CisgICAgdnN0MXFfdTgocHRyLCAgICB2YWwwKTsKKyAgICB2c3QxcV91OCgocHRyICsgMTYpLCAgdmFsMik7Cit9CisjZGVmaW5lIHZzdDRfdTgocHRyLCB2YWwpIHZzdDRfdThfcHRyKHB0ciwgJnZhbCkKKworLy92b2lkIHZzdDRfdTE2KF9fdHJhbnNmZXJzaXplKDE2KSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDR4NF90IHZhbCkvLyBWU1Q0LjE2IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3Q0X3UxNl9wdHIoX190cmFuc2ZlcnNpemUoMTYpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4NHg0X3QqIHZhbCkKK3sKKyAgICBfX20xMjhpIHNoMCwgc2gxLCB2YWwwLCB2YWwyOworICAgIHNoMCA9IF9tbV91bnBhY2tsb19lcGkxNihfcE0xMjhpKHZhbC0+dmFsWzBdKSxfcE0xMjhpKHZhbC0+dmFsWzFdKSk7IC8vYTAsYTEsYjAsYjEsYzAsYzEsZDAsZDEsCisgICAgc2gxID0gX21tX3VucGFja2xvX2VwaTE2KF9wTTEyOGkodmFsLT52YWxbMl0pLF9wTTEyOGkodmFsLT52YWxbM10pKTsgLy9hMixhMyxiMixiMyxjMixjMyxkMixkMworICAgIHZhbDAgPSBfbW1fdW5wYWNrbG9fZXBpMzIoc2gwLHNoMSk7IC8vIGEwLGExLGEyLGEzLGIwLGIxLGIyLGIzCisgICAgdmFsMiA9IF9tbV91bnBhY2toaV9lcGkzMihzaDAsc2gxKTsgLy8gYzAsYzEsYzIsYzMsZDAsZDEsZDIsZDMKKyAgICB2c3QxcV91MTYocHRyLCAgICAgIHZhbDApOyAvL3N0b3JlIGFzIDEyOCBiaXQgc3RydWN0dXJlCisgICAgdnN0MXFfdTE2KChwdHIgKyA4KSwgIHZhbDIpOworfQorI2RlZmluZSB2c3Q0X3UxNihwdHIsIHZhbCkgdnN0NF91MTZfcHRyKHB0ciwgJnZhbCkKKworLy92b2lkIHZzdDRfdTMyKF9fdHJhbnNmZXJzaXplKDgpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4Mng0X3QgdmFsKS8vIFZTVDQuMzIge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDRfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSg4KSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDJ4NF90KiB2YWwpCit7CisgICAgLy8wLDQsICAgMSw1LCAgMiw2LCAgMyw3CisgICAgX19tMTI4aSBzaDAsIHNoMSwgdmFsMCwgdmFsMTsKKyAgICBzaDAgPSBfbW1fdW5wYWNrbG9fZXBpMzIoX3BNMTI4aSh2YWwtPnZhbFswXSksIF9wTTEyOGkodmFsLT52YWxbMV0pKTsgLy8wLDEsNCw1CisgICAgc2gxID0gX21tX3VucGFja2xvX2VwaTMyKF9wTTEyOGkodmFsLT52YWxbMl0pLCBfcE0xMjhpKHZhbC0+dmFsWzNdKSk7IC8vMiwzLDYsNworICAgIHZhbDAgPSBfbW1fdW5wYWNrbG9fZXBpNjQoc2gwLHNoMSk7IC8vCisgICAgdmFsMSA9IF9tbV91bnBhY2toaV9lcGk2NChzaDAsc2gxKTsgLy8KKyAgICB2c3QxcV91MzIocHRyLCAgICAgdmFsMCk7IC8vc3RvcmUgYXMgMTI4IGJpdCBzdHJ1Y3R1cmUKKyAgICB2c3QxcV91MzIoKHB0ciArIDQpLCAgdmFsMSk7Cit9CisjZGVmaW5lIHZzdDRfdTMyKHB0ciwgdmFsKSB2c3Q0X3UzMl9wdHIocHRyLCAmdmFsKQorCisvL3ZvaWQgdnN0NF91NjQoX190cmFuc2ZlcnNpemUoNCkgdWludDY0X3QgKiBwdHIsIHVpbnQ2NHgxeDRfdCB2YWwpLy8gVlNUMS42NCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0NF91NjRfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQ2NF90ICogcHRyLCB1aW50NjR4MXg0X3QqIHZhbCkKK3sKKyAgICAqKHB0cikgPSAgdmFsLT52YWxbMF0ubTY0X3U2NFswXTsKKyAgICAqKHB0ciArIDEpID0gIHZhbC0+dmFsWzFdLm02NF91NjRbMF07CisgICAgKihwdHIgKyAyKSA9ICB2YWwtPnZhbFsyXS5tNjRfdTY0WzBdOworICAgICoocHRyICsgMykgPSAgdmFsLT52YWxbM10ubTY0X3U2NFswXTsKK30KKyNkZWZpbmUgdnN0NF91NjQocHRyLCB2YWwpIHZzdDRfdTY0X3B0cihwdHIsICZ2YWwpCisKKy8vdm9pZCB2c3Q0X3M4KF9fdHJhbnNmZXJzaXplKDMyKSBpbnQ4X3QgKiBwdHIsIGludDh4OHg0X3QgdmFsKSAgLy9WU1Q0Ljgge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorI2RlZmluZSB2c3Q0X3M4KHB0ciwgdmFsKSB2c3Q0X3U4KCh1aW50OF90KilwdHIsIHZhbCkKKworLy92b2lkIHZzdDRfczE2KF9fdHJhbnNmZXJzaXplKDE2KSBpbnQxNl90ICogcHRyLCBpbnQxNng0eDRfdCB2YWwpICAvLyBWU1Q0LjE2IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KKyNkZWZpbmUgdnN0NF9zMTYocHRyLCB2YWwpIHZzdDRfdTE2KCh1aW50MTZfdCopcHRyLCB2YWwpCisKKy8vdm9pZCB2c3Q0X3MzMihfX3RyYW5zZmVyc2l6ZSg4KSBpbnQzMl90ICogcHRyLCBpbnQzMngyeDRfdCB2YWwpIC8vIFZTVDQuMzIge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQorI2RlZmluZSB2c3Q0X3MzMihwdHIsIHZhbCkgdnN0NF91MzIoKHVpbnQzMl90KilwdHIsIHZhbCkKKworLy92b2lkIHZzdDRfczY0KF9fdHJhbnNmZXJzaXplKDQpIGludDY0X3QgKiBwdHIsIGludDY0eDF4NF90IHZhbCk7IC8vIFZTVDEuNjQge2QwLCBkMSwgZDIsIGQzfSwgW3IwXQordm9pZCB2c3Q0X3M2NF9wdHIoX190cmFuc2ZlcnNpemUoNCkgaW50NjRfdCAqIHB0ciwgaW50NjR4MXg0X3QgKiB2YWwpOworI2RlZmluZSB2c3Q0X3M2NChwdHIsIHZhbCkgdnN0NF91NjQoKHVpbnQ2NF90KilwdHIsIHZhbCkKKworLy92b2lkIHZzdDRfZjE2KF9fdHJhbnNmZXJzaXplKDE2KSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4NHg0X3QgdmFsKTsvLyBWU1Q0LjE2IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK3ZvaWQgdnN0NF9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDE2KSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4NHg0X3QgKiB2YWwpOworLy8gSUEzMiBTSU1EIGRvZXNuJ3Qgd29yayB3aXRoIDE2Yml0IGZsb2F0cyBjdXJyZW50bHksIHNvIG5lZWQgdG8gZ28gdG8gMzIgYml0IGFuZCB0aGVuIHdvcmsgd2l0aCB0d28gMTI4Yml0IHJlZ2lzdGVycy4gU2VlIHZsZDFxX2YxNiBmb3IgZXhhbXBsZQorCisvL3ZvaWQgdnN0NF9mMzIoX190cmFuc2ZlcnNpemUoOCkgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDJ4NF90IHZhbCkvLyBWU1Q0LjMyIHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3Q0X2YzMl9wdHIoX190cmFuc2ZlcnNpemUoOCkgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDJ4NF90KiB2YWwpCit7CisgICAgLy8wLDQsICAgMSw1LCAgMiw2LCAgMyw3IC0+IDAsMSwgMiwzLCA0LDUsIDYsNworICAgICoocHRyKSA9ICAgdmFsLT52YWxbMF0ubTY0X2YzMlswXTsKKyAgICAqKHB0ciArIDEpID0gdmFsLT52YWxbMV0ubTY0X2YzMlswXTsKKyAgICAqKHB0ciArIDIpID0gdmFsLT52YWxbMl0ubTY0X2YzMlswXTsKKyAgICAqKHB0ciArIDMpID0gdmFsLT52YWxbM10ubTY0X2YzMlswXTsKKyAgICAqKHB0ciArIDQpID0gdmFsLT52YWxbMF0ubTY0X2YzMlsxXTsKKyAgICAqKHB0ciArIDUpID0gdmFsLT52YWxbMV0ubTY0X2YzMlsxXTsKKyAgICAqKHB0ciArIDYpID0gdmFsLT52YWxbMl0ubTY0X2YzMlsxXTsKKyAgICAqKHB0ciArIDcpID0gdmFsLT52YWxbM10ubTY0X2YzMlsxXTsKK30KKyNkZWZpbmUgdnN0NF9mMzIocHRyLCB2YWwpIHZzdDRfZjMyX3B0cihwdHIsICZ2YWwpCisKKy8vdm9pZCB2c3Q0X3A4KF9fdHJhbnNmZXJzaXplKDMyKSBwb2x5OF90ICogcHRyLCBwb2x5OHg4eDRfdCB2YWwpOy8vIFZTVDQuOCB7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCit2b2lkIHZzdDRfcDhfcHRyKF9fdHJhbnNmZXJzaXplKDMyKSBwb2x5OF90ICogcHRyLCBwb2x5OHg4eDRfdCAqIHZhbCk7CisjZGVmaW5lIHZzdDRfcDggdnN0NF91OAorCisvL3ZvaWQgdnN0NF9wMTYoX190cmFuc2ZlcnNpemUoMTYpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4NHg0X3QgdmFsKTsvLyBWU1Q0LjE2IHtkMCwgZDEsIGQyLCBkM30sIFtyMF0KK3ZvaWQgdnN0NF9wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDE2KSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDR4NF90ICogdmFsKTsKKyNkZWZpbmUgdnN0NF9wMTYgdnN0NF91MTYKKworLy8qKioqKioqKioqKiBTdG9yZSBhIGxhbmUgb2YgYSB2ZWN0b3IgaW50byBtZW1vcnkgKGV4dHJhY3QgZ2l2ZW4gbGFuZSkgZm9yIGEgY291cGxlIG9mIHZlY3RvcnMgICoqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy92b2lkIHZzdDJxX2xhbmVfdTE2KF9fdHJhbnNmZXJzaXplKDIpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4OHgyX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSkvLyBWU1QyLjE2IHtkMFswXSwgZDJbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0MnFfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4OHgyX3QqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpCit7CisgICAgdnN0MXFfbGFuZV9zMTYocHRyLCB2YWwtPnZhbFswXSwgbGFuZSk7CisgICAgdnN0MXFfbGFuZV9zMTYoKHB0ciArIDEpLCB2YWwtPnZhbFsxXSwgbGFuZSk7Cit9CisjZGVmaW5lIHZzdDJxX2xhbmVfdTE2KHB0ciwgdmFsLCBsYW5lKSB2c3QycV9sYW5lX3UxNl9wdHIocHRyLCAmdmFsLCBsYW5lKQorCisvL3ZvaWQgdnN0MnFfbGFuZV91MzIoX190cmFuc2ZlcnNpemUoMikgdWludDMyX3QgKiBwdHIsIHVpbnQzMng0eDJfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKS8vIFZTVDIuMzIge2QwWzBdLCBkMlswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QycV9sYW5lX3UzMl9wdHIoX190cmFuc2ZlcnNpemUoMikgdWludDMyX3QqIHB0ciwgdWludDMyeDR4Ml90KiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKQoreworICAgIHZzdDFxX2xhbmVfdTMyKHB0ciwgdmFsLT52YWxbMF0sIGxhbmUpOworICAgIHZzdDFxX2xhbmVfdTMyKChwdHIgKyAxKSwgdmFsLT52YWxbMV0sIGxhbmUpOworfQorI2RlZmluZSB2c3QycV9sYW5lX3UzMihwdHIsIHZhbCwgbGFuZSkgdnN0MnFfbGFuZV91MzJfcHRyKHB0ciwgJnZhbCwgbGFuZSkKKworLy92b2lkIHZzdDJxX2xhbmVfczE2KF9fdHJhbnNmZXJzaXplKDIpIGludDE2X3QgKiBwdHIsIGludDE2eDh4Ml90IHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOy8vIFZTVDIuMTYge2QwWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0MnFfbGFuZV9zMTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIGludDE2X3QgKiBwdHIsIGludDE2eDh4Ml90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7CisjZGVmaW5lIHZzdDJxX2xhbmVfczE2KHB0ciwgdmFsLCBsYW5lKSB2c3QycV9sYW5lX3UxNigodWludDE2X3QqKXB0ciwgdmFsLCBsYW5lKQorCisvL3ZvaWQgdnN0MnFfbGFuZV9zMzIoX190cmFuc2ZlcnNpemUoMikgaW50MzJfdCAqIHB0ciwgaW50MzJ4NHgyX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7Ly8gVlNUMi4zMiB7ZDBbMF0sIGQyWzBdfSwgW3IwXQordm9pZCB2c3QycV9sYW5lX3MzMl9wdHIoX190cmFuc2ZlcnNpemUoMikgaW50MzJfdCAqIHB0ciwgaW50MzJ4NHgyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsKKyNkZWZpbmUgdnN0MnFfbGFuZV9zMzIocHRyLCB2YWwsIGxhbmUpICB2c3QycV9sYW5lX3UzMigodWludDMyX3QqKXB0ciwgdmFsLCBsYW5lKQorCisvL3ZvaWQgdnN0MnFfbGFuZV9mMTYoX190cmFuc2ZlcnNpemUoMikgX19mcDE2ICogcHRyLCBmbG9hdDE2eDh4Ml90IHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOy8vIFZTVDIuMTYge2QwWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0MnFfbGFuZV9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng4eDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOworLy9jdXJyZW50IElBIFNJTUQgZG9lc24ndCBzdXBwb3J0IGZsb2F0MTYKKworLy92b2lkIHZzdDJxX2xhbmVfZjMyKF9fdHJhbnNmZXJzaXplKDIpIGZsb2F0MzJfdCAqIHB0ciwgZmxvYXQzMng0eDJfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKS8vIFZTVDIuMzIge2QwWzBdLCBkMlswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QycV9sYW5lX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoMikgZmxvYXQzMl90KiBwdHIsIGZsb2F0MzJ4NHgyX3QqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgdnN0MXFfbGFuZV9mMzIocHRyLCB2YWwtPnZhbFswXSwgbGFuZSk7CisgICAgdnN0MXFfbGFuZV9mMzIoKHB0ciArIDEpLCB2YWwtPnZhbFsxXSwgbGFuZSk7Cit9CisjZGVmaW5lIHZzdDJxX2xhbmVfZjMyKHB0cixzcmMsbGFuZSkgdnN0MnFfbGFuZV9mMzJfcHRyKHB0ciwmc3JjLGxhbmUpCisKKy8vdm9pZCB2c3QycV9sYW5lX3AxNihfX3RyYW5zZmVyc2l6ZSgyKSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDh4Ml90IHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOy8vIFZTVDIuMTYge2QwWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0MnFfbGFuZV9wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4OHgyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsKKyNkZWZpbmUgdnN0MnFfbGFuZV9wMTYgdnN0MnFfbGFuZV9zMTYKKworLy92b2lkIHZzdDJfbGFuZV91OChfX3RyYW5zZmVyc2l6ZSgyKSB1aW50OF90ICogcHRyLCB1aW50OHg4eDJfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsvLyBWU1QyLjgge2QwWzBdLCBkMVswXX0sIFtyMF0KK3ZvaWQgdnN0Ml9sYW5lX3U4X3B0cihfX3RyYW5zZmVyc2l6ZSgyKSB1aW50OF90ICogcHRyLCB1aW50OHg4eDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWU1QyLjgge2QwWzBdLCBkMVswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QyX2xhbmVfdThfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDh4Ml90KiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKSAvLyBWU1QyLjgge2QwWzBdLCBkMVswXX0sIFtyMF0KK3sKKyAgICAqKHB0cikgPSB2YWwtPnZhbFswXS5tNjRfdThbbGFuZV07CisgICAgKihwdHIgKyAxKSA9IHZhbC0+dmFsWzFdLm02NF91OFtsYW5lXTsKK30KKyNkZWZpbmUgdnN0Ml9sYW5lX3U4KHB0ciwgdmFsLCBsYW5lKSB2c3QyX2xhbmVfdThfcHRyKHB0ciwgJnZhbCwgbGFuZSkKKworLy92b2lkIHZzdDJfbGFuZV91MTYoX190cmFuc2ZlcnNpemUoMikgdWludDE2X3QgKiBwdHIsIHVpbnQxNng0eDJfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsvLyBWU1QyLjE2IHtkMFswXSwgZDFbMF19LCBbcjBdCit2b2lkIHZzdDJfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4NHgyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVlNUMi4xNiB7ZDBbMF0sIGQxWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDJfbGFuZV91MTZfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4NHgyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKQoreworICAgICoocHRyKSA9IHZhbC0+dmFsWzBdLm02NF91MTZbbGFuZV07CisgICAgKihwdHIgKyAxKSA9IHZhbC0+dmFsWzFdLm02NF91MTZbbGFuZV07Cit9CisjZGVmaW5lIHZzdDJfbGFuZV91MTYocHRyLCB2YWwsIGxhbmUpIHZzdDJfbGFuZV91MTZfcHRyKHB0ciwgJnZhbCwgbGFuZSkKKworLy92b2lkIHZzdDJfbGFuZV91MzIoX190cmFuc2ZlcnNpemUoMikgdWludDMyX3QgKiBwdHIsIHVpbnQzMngyeDJfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsvLyBWU1QyLjMyIHtkMFswXSwgZDFbMF19LCBbcjBdCit2b2lkIHZzdDJfbGFuZV91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4MngyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVlNUMi4zMiB7ZDBbMF0sIGQxWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDJfbGFuZV91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDIpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4MngyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKQoreworICAgICoocHRyKSA9IHZhbC0+dmFsWzBdLm02NF91MzJbbGFuZV07CisgICAgKihwdHIgKyAxKSA9IHZhbC0+dmFsWzFdLm02NF91MzJbbGFuZV07Cit9CisjZGVmaW5lIHZzdDJfbGFuZV91MzIocHRyLCB2YWwsIGxhbmUpIHZzdDJfbGFuZV91MzJfcHRyKHB0ciwgJnZhbCwgbGFuZSkKKworLy92b2lkIHZzdDJfbGFuZV9zOChfX3RyYW5zZmVyc2l6ZSgyKSBpbnQ4X3QgKiBwdHIsIGludDh4OHgyX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7Ly8gVlNUMi44IHtkMFswXSwgZDFbMF19LCBbcjBdCit2b2lkIHZzdDJfbGFuZV9zOF9wdHIoX190cmFuc2ZlcnNpemUoMikgaW50OF90ICogcHRyLCBpbnQ4eDh4Ml90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7CisjZGVmaW5lIHZzdDJfbGFuZV9zOChwdHIsIHZhbCwgbGFuZSkgIHZzdDJfbGFuZV91OCgodWludDhfdCopcHRyLCB2YWwsIGxhbmUpCisKKy8vdm9pZCB2c3QyX2xhbmVfczE2KF9fdHJhbnNmZXJzaXplKDIpIGludDE2X3QgKiBwdHIsIGludDE2eDR4Ml90IHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOy8vIFZTVDIuMTYge2QwWzBdLCBkMVswXX0sIFtyMF0KK3ZvaWQgdnN0Ml9sYW5lX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoMikgaW50MTZfdCAqIHB0ciwgaW50MTZ4NHgyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsKKyNkZWZpbmUgdnN0Ml9sYW5lX3MxNihwdHIsIHZhbCwgbGFuZSkgIHZzdDJfbGFuZV91MTYoKHVpbnQxNl90KilwdHIsIHZhbCwgbGFuZSkKKworLy92b2lkIHZzdDJfbGFuZV9zMzIoX190cmFuc2ZlcnNpemUoMikgaW50MzJfdCAqIHB0ciwgaW50MzJ4MngyX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7Ly8gVlNUMi4zMiB7ZDBbMF0sIGQxWzBdfSwgW3IwXQordm9pZCB2c3QyX2xhbmVfczMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBpbnQzMl90ICogcHRyLCBpbnQzMngyeDJfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOworI2RlZmluZSB2c3QyX2xhbmVfczMyKHB0ciwgdmFsLCBsYW5lKSAgdnN0Ml9sYW5lX3UzMigodWludDMyX3QqKXB0ciwgdmFsLCBsYW5lKQorCisvL3ZvaWQgdnN0Ml9sYW5lX2YxNihfX3RyYW5zZmVyc2l6ZSgyKSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4NHgyX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZTVDIuMTYge2QwWzBdLCBkMVswXX0sIFtyMF0KKy8vY3VycmVudCBJQSBTSU1EIGRvZXNuJ3Qgc3VwcG9ydCBmbG9hdDE2CisKK3ZvaWQgdnN0Ml9sYW5lX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoMikgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDJ4Ml90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZTVDIuMzIge2QwWzBdLCBkMVswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QyX2xhbmVfZjMyX3B0cihfX3RyYW5zZmVyc2l6ZSgyKSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4MngyX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKQoreworICAgICoocHRyKSA9IHZhbC0+dmFsWzBdLm02NF9mMzJbbGFuZV07CisgICAgKihwdHIgKyAxKSA9IHZhbC0+dmFsWzFdLm02NF9mMzJbbGFuZV07Cit9CisjZGVmaW5lIHZzdDJfbGFuZV9mMzIocHRyLHNyYyxsYW5lKSB2c3QyX2xhbmVfZjMyX3B0cihwdHIsJnNyYyxsYW5lKQorCisvL3ZvaWQgdnN0Ml9sYW5lX3A4KF9fdHJhbnNmZXJzaXplKDIpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDh4Ml90IHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOy8vIFZTVDIuOCB7ZDBbMF0sIGQxWzBdfSwgW3IwXQorI2RlZmluZSB2c3QyX2xhbmVfcDggdnN0Ml9sYW5lX3U4CisKKy8vdm9pZCB2c3QyX2xhbmVfcDE2KF9fdHJhbnNmZXJzaXplKDIpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4NHgyX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7Ly8gVlNUMi4xNiB7ZDBbMF0sIGQxWzBdfSwgW3IwXQorI2RlZmluZSB2c3QyX2xhbmVfcDE2IHZzdDJfbGFuZV91MTYKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqIFRyaXBsZSBsYW5lcyAgc3RvcmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy92b2lkIHZzdDNxX2xhbmVfdTE2KF9fdHJhbnNmZXJzaXplKDMpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4OHgzX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSkvLyBWU1QzLjE2IHtkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDNxX2xhbmVfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDh4M190KiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKQoreworICAgIHZzdDJxX2xhbmVfdTE2X3B0cihwdHIsICh1aW50MTZ4OHgyX3QqKXZhbCwgbGFuZSk7CisgICAgdnN0MXFfbGFuZV91MTYoKHB0ciArIDIpLCB2YWwtPnZhbFsyXSwgbGFuZSk7Cit9CisjZGVmaW5lIHZzdDNxX2xhbmVfdTE2KHB0ciwgdmFsLCBsYW5lKSB2c3QzcV9sYW5lX3UxNl9wdHIocHRyLCAmdmFsLCBsYW5lKQorCisvL3ZvaWQgdnN0M3FfbGFuZV91MzIoX190cmFuc2ZlcnNpemUoMykgdWludDMyX3QgKiBwdHIsIHVpbnQzMng0eDNfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKS8vIFZTVDMuMzIge2QwWzBdLCBkMlswXSwgZDRbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0M3FfbGFuZV91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4NHgzX3QqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgdnN0MnFfbGFuZV91MzJfcHRyKHB0ciwgKHVpbnQzMng0eDJfdCopdmFsLCBsYW5lKTsKKyAgICB2c3QxcV9sYW5lX3UzMigocHRyICsgMiksIHZhbC0+dmFsWzJdLCBsYW5lKTsKK30KKyNkZWZpbmUgdnN0M3FfbGFuZV91MzIocHRyLCB2YWwsIGxhbmUpIHZzdDNxX2xhbmVfdTMyX3B0cihwdHIsICZ2YWwsIGxhbmUpCisKKy8vdm9pZCB2c3QzcV9sYW5lX3MxNihfX3RyYW5zZmVyc2l6ZSgzKSBpbnQxNl90ICogcHRyLCBpbnQxNng4eDNfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsvLyBWU1QzLjE2IHtkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQordm9pZCB2c3QzcV9sYW5lX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoMykgaW50MTZfdCAqIHB0ciwgaW50MTZ4OHgzX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsKKyNkZWZpbmUgdnN0M3FfbGFuZV9zMTYocHRyLCB2YWwsIGxhbmUpIHZzdDNxX2xhbmVfdTE2KCh1aW50MTZfdCAqKXB0ciwgdmFsLCBsYW5lKQorCisvL3ZvaWQgdnN0M3FfbGFuZV9zMzIoX190cmFuc2ZlcnNpemUoMykgaW50MzJfdCAqIHB0ciwgaW50MzJ4NHgzX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7Ly8gVlNUMy4zMiB7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KK3ZvaWQgdnN0M3FfbGFuZV9zMzJfcHRyKF9fdHJhbnNmZXJzaXplKDMpIGludDMyX3QgKiBwdHIsIGludDMyeDR4M190ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7CisjZGVmaW5lIHZzdDNxX2xhbmVfczMyKHB0ciwgdmFsLCBsYW5lKSB2c3QzcV9sYW5lX3UzMigodWludDMyX3QgKilwdHIsIHZhbCwgbGFuZSkKKworLy92b2lkIHZzdDNxX2xhbmVfZjE2KF9fdHJhbnNmZXJzaXplKDMpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng4eDNfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsvLyBWU1QzLjE2IHtkMFswXSwgZDJbMF0sIGQ0WzBdfSwgW3IwXQordm9pZCB2c3QzcV9sYW5lX2YxNl9wdHIoX190cmFuc2ZlcnNpemUoMykgX19mcDE2ICogcHRyLCBmbG9hdDE2eDh4M190ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7CisvL2N1cnJlbnQgSUEgU0lNRCBkb2Vzbid0IHN1cHBvcnQgZmxvYXQxNgorCisvL3ZvaWQgdnN0M3FfbGFuZV9mMzIoX190cmFuc2ZlcnNpemUoMykgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDR4M190IHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpLy8gVlNUMy4zMiB7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QzcV9sYW5lX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoMykgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDR4M190KiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKQoreworICAgIHZzdDFxX2xhbmVfZjMyKHB0ciwgICB2YWwtPnZhbFswXSwgbGFuZSk7CisgICAgdnN0MXFfbGFuZV9mMzIoKHB0ciArIDEpLCAgIHZhbC0+dmFsWzFdLCBsYW5lKTsKKyAgICB2c3QxcV9sYW5lX2YzMigocHRyICsgMiksIHZhbC0+dmFsWzJdLCBsYW5lKTsKK30KKyNkZWZpbmUgdnN0M3FfbGFuZV9mMzIocHRyLHZhbCxsYW5lKSB2c3QzcV9sYW5lX2YzMl9wdHIocHRyLCZ2YWwsbGFuZSkKKworLy92b2lkIHZzdDNxX2xhbmVfcDE2KF9fdHJhbnNmZXJzaXplKDMpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4OHgzX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7Ly8gVlNUMy4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXX0sIFtyMF0KK3ZvaWQgdnN0M3FfbGFuZV9wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4OHgzX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsKKyNkZWZpbmUgdnN0M3FfbGFuZV9wMTYgdnN0M3FfbGFuZV9zMTYKKworLy92b2lkIHZzdDNfbGFuZV91OChfX3RyYW5zZmVyc2l6ZSgzKSB1aW50OF90ICogcHRyLCB1aW50OHg4eDNfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKS8vIFZTVDMuOCB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QzX2xhbmVfdThfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDh4M190KiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKQoreworICAgICoocHRyKSA9ICAgICB2YWwtPnZhbFswXS5tNjRfdThbbGFuZV07CisgICAgKihwdHIgKyAxKSA9IHZhbC0+dmFsWzFdLm02NF91OFtsYW5lXTsKKyAgICAqKHB0ciArIDIpID0gdmFsLT52YWxbMl0ubTY0X3U4W2xhbmVdOworfQorI2RlZmluZSB2c3QzX2xhbmVfdTgocHRyLCB2YWwsIGxhbmUpIHZzdDNfbGFuZV91OF9wdHIocHRyLCAmdmFsLCBsYW5lKQorCisvL3ZvaWQgdnN0M19sYW5lX3UxNihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDR4M190IHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpLy8gVlNUMy4xNiB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3QzX2xhbmVfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSgzKSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDR4M190KiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKQoreworICAgICoocHRyKSA9ICAgICB2YWwtPnZhbFswXS5tNjRfdTE2W2xhbmVdOworICAgICoocHRyICsgMSkgPSB2YWwtPnZhbFsxXS5tNjRfdTE2W2xhbmVdOworICAgICoocHRyICsgMikgPSB2YWwtPnZhbFsyXS5tNjRfdTE2W2xhbmVdOworfQorI2RlZmluZSB2c3QzX2xhbmVfdTE2KHB0ciwgdmFsLCBsYW5lKSB2c3QzX2xhbmVfdTE2X3B0cihwdHIsICZ2YWwsIGxhbmUpCisKKy8vdm9pZCB2c3QzX2xhbmVfdTMyKF9fdHJhbnNmZXJzaXplKDMpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4MngzX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSkvLyBWU1QzLjMyIHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDNfbGFuZV91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4MngzX3QqIHZhbCwgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpCit7CisgICAgKihwdHIpID0gICAgIHZhbC0+dmFsWzBdLm02NF91MzJbbGFuZV07CisgICAgKihwdHIgKyAxKSA9IHZhbC0+dmFsWzFdLm02NF91MzJbbGFuZV07CisgICAgKihwdHIgKyAyKSA9IHZhbC0+dmFsWzJdLm02NF91MzJbbGFuZV07Cit9CisjZGVmaW5lIHZzdDNfbGFuZV91MzIocHRyLCB2YWwsIGxhbmUpIHZzdDNfbGFuZV91MzJfcHRyKHB0ciwgJnZhbCwgbGFuZSkKKworLy92b2lkIHZzdDNfbGFuZV9zOChfX3RyYW5zZmVyc2l6ZSgzKSBpbnQ4X3QgKiBwdHIsIGludDh4OHgzX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7Ly8gVlNUMy44IHtkMFswXSwgZDFbMF0sIGQyWzBdfSwgW3IwXQordm9pZCB2c3QzX2xhbmVfczhfcHRyKF9fdHJhbnNmZXJzaXplKDMpIGludDhfdCAqIHB0ciwgaW50OHg4eDNfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOworI2RlZmluZSAgdnN0M19sYW5lX3M4KHB0ciwgdmFsLCBsYW5lKSB2c3QzX2xhbmVfdTgoKHVpbnQ4X3QgKilwdHIsIHZhbCwgbGFuZSkKKworLy92b2lkIHZzdDNfbGFuZV9zMTYoX190cmFuc2ZlcnNpemUoMykgaW50MTZfdCAqIHB0ciwgaW50MTZ4NHgzX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7Ly8gVlNUMy4xNiB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0M19sYW5lX3MxNl9wdHIoX190cmFuc2ZlcnNpemUoMykgaW50MTZfdCAqIHB0ciwgaW50MTZ4NHgzX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsKKyNkZWZpbmUgdnN0M19sYW5lX3MxNihwdHIsIHZhbCwgbGFuZSkgdnN0M19sYW5lX3UxNigodWludDE2X3QgKilwdHIsIHZhbCwgbGFuZSkKKworLy92b2lkIHZzdDNfbGFuZV9zMzIoX190cmFuc2ZlcnNpemUoMykgaW50MzJfdCAqIHB0ciwgaW50MzJ4MngzX3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7Ly8gVlNUMy4zMiB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0M19sYW5lX3MzMl9wdHIoX190cmFuc2ZlcnNpemUoMykgaW50MzJfdCAqIHB0ciwgaW50MzJ4MngzX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsKKyNkZWZpbmUgdnN0M19sYW5lX3MzMihwdHIsIHZhbCwgbGFuZSkgdnN0M19sYW5lX3UzMigodWludDMyX3QgKilwdHIsIHZhbCwgbGFuZSkKKworLy92b2lkIHZzdDNfbGFuZV9mMTYoX190cmFuc2ZlcnNpemUoMykgX19mcDE2ICogcHRyLCBmbG9hdDE2eDR4M190IHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOy8vIFZTVDMuMTYge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCit2b2lkIHZzdDNfbGFuZV9mMTZfcHRyKF9fdHJhbnNmZXJzaXplKDMpIF9fZnAxNiAqIHB0ciwgZmxvYXQxNng0eDNfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOworLy9jdXJyZW50IElBIFNJTUQgZG9lc24ndCBzdXBwb3J0IGZsb2F0MTYKKworLy92b2lkIHZzdDNfbGFuZV9mMzIoX190cmFuc2ZlcnNpemUoMykgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDJ4M190IHZhbCwgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpLy8gVlNUMy4zMiB7ZDBbMF0sIGQxWzBdLCBkMlswXX0sIFtyMF0KK3ZvaWQgdnN0M19sYW5lX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoMykgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDJ4M190ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7CitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0M19sYW5lX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoMykgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDJ4M190ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSkKK3sKKyAgICAqKHB0cikgPSB2YWwtPnZhbFswXS5tNjRfZjMyW2xhbmVdOworICAgICoocHRyICsgMSkgPSB2YWwtPnZhbFsxXS5tNjRfZjMyW2xhbmVdOworICAgICoocHRyICsgMikgPSB2YWwtPnZhbFsyXS5tNjRfZjMyW2xhbmVdOworfQorI2RlZmluZSB2c3QzX2xhbmVfZjMyKHB0cix2YWwsbGFuZSkgdnN0M19sYW5lX2YzMl9wdHIocHRyLCZ2YWwsbGFuZSkKKworLy92b2lkIHZzdDNfbGFuZV9wOChfX3RyYW5zZmVyc2l6ZSgzKSBwb2x5OF90ICogcHRyLCBwb2x5OHg4eDNfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsvLyBWU1QzLjgge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCit2b2lkIHZzdDNfbGFuZV9wOF9wdHIoX190cmFuc2ZlcnNpemUoMykgcG9seThfdCAqIHB0ciwgcG9seTh4OHgzX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsKKyNkZWZpbmUgdnN0M19sYW5lX3A4IHZzdDNfbGFuZV91OAorCisvL3ZvaWQgdnN0M19sYW5lX3AxNihfX3RyYW5zZmVyc2l6ZSgzKSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDR4M190IHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOy8vIFZTVDMuMTYge2QwWzBdLCBkMVswXSwgZDJbMF19LCBbcjBdCit2b2lkIHZzdDNfbGFuZV9wMTZfcHRyKF9fdHJhbnNmZXJzaXplKDMpIHBvbHkxNl90ICogcHRyLCBwb2x5MTZ4NHgzX3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsKKyNkZWZpbmUgdnN0M19sYW5lX3AxNiB2c3QzX2xhbmVfczE2CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUXVhZHJ1cGxlIGxhbmVzIHN0b3JlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL3ZvaWQgdnN0NHFfbGFuZV91MTYoX190cmFuc2ZlcnNpemUoNCkgdWludDE2X3QgKiBwdHIsIHVpbnQxNng4eDRfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKS8vIFZTVDQuMTYge2QwWzBdLCBkMlswXSwgZDRbMF0sIGQ2WzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDRxX2xhbmVfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDh4NF90KiB2YWw0LCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSkKK3sKKyAgICB2c3QycV9sYW5lX3UxNl9wdHIocHRyLCAgICAodWludDE2eDh4Ml90Kil2YWw0LT52YWwsIGxhbmUpOworICAgIHZzdDJxX2xhbmVfdTE2X3B0cigocHRyICsgMiksKCh1aW50MTZ4OHgyX3QqKXZhbDQtPnZhbCArIDEpLCBsYW5lKTsKK30KKyNkZWZpbmUgdnN0NHFfbGFuZV91MTYocHRyLCB2YWwsIGxhbmUpIHZzdDRxX2xhbmVfdTE2X3B0cihwdHIsICZ2YWwsIGxhbmUpCisKKy8vdm9pZCB2c3Q0cV9sYW5lX3UzMihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDR4NF90IHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpLy8gVlNUNC4zMiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCitfTkVPTjJTU0VfSU5MSU5FIHZvaWQgdnN0NHFfbGFuZV91MzJfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4NHg0X3QqIHZhbDQsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKQoreworICAgIHZzdDJxX2xhbmVfdTMyX3B0cihwdHIsICAgICAodWludDMyeDR4Ml90Kil2YWw0LT52YWwsIGxhbmUpOworICAgIHZzdDJxX2xhbmVfdTMyX3B0cigocHRyICsgMiksICgodWludDMyeDR4Ml90Kil2YWw0LT52YWwgKyAxKSwgbGFuZSk7Cit9CisjZGVmaW5lIHZzdDRxX2xhbmVfdTMyKHB0ciwgdmFsLCBsYW5lKSB2c3Q0cV9sYW5lX3UzMl9wdHIocHRyLCAmdmFsLCBsYW5lKQorCisvL3ZvaWQgdnN0NHFfbGFuZV9zMTYoX190cmFuc2ZlcnNpemUoNCkgaW50MTZfdCAqIHB0ciwgaW50MTZ4OHg0X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7Ly8gVlNUNC4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCit2b2lkIHZzdDRxX2xhbmVfczE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQxNl90ICogcHRyLCBpbnQxNng4eDRfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOworI2RlZmluZSB2c3Q0cV9sYW5lX3MxNihwdHIsdmFsLGxhbmUpIHZzdDRxX2xhbmVfdTE2KCh1aW50MTZfdCAqKXB0cix2YWwsbGFuZSkKKworLy92b2lkIHZzdDRxX2xhbmVfczMyKF9fdHJhbnNmZXJzaXplKDQpIGludDMyX3QgKiBwdHIsIGludDMyeDR4NF90IHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOy8vIFZTVDQuMzIge2QwWzBdLCBkMlswXSwgZDRbMF0sIGQ2WzBdfSwgW3IwXQordm9pZCB2c3Q0cV9sYW5lX3MzMl9wdHIoX190cmFuc2ZlcnNpemUoNCkgaW50MzJfdCAqIHB0ciwgaW50MzJ4NHg0X3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsKKyNkZWZpbmUgdnN0NHFfbGFuZV9zMzIocHRyLHZhbCxsYW5lKSB2c3Q0cV9sYW5lX3UzMigodWludDMyX3QgKilwdHIsdmFsLGxhbmUpCisKKy8vdm9pZCB2c3Q0cV9sYW5lX2YxNihfX3RyYW5zZmVyc2l6ZSg0KSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4OHg0X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7Ly8gVlNUNC4xNiB7ZDBbMF0sIGQyWzBdLCBkNFswXSwgZDZbMF19LCBbcjBdCit2b2lkIHZzdDRxX2xhbmVfZjE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4OHg0X3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsKKy8vY3VycmVudCBJQSBTSU1EIGRvZXNuJ3Qgc3VwcG9ydCBmbG9hdDE2CisKKy8vdm9pZCB2c3Q0cV9sYW5lX2YzMihfX3RyYW5zZmVyc2l6ZSg0KSBmbG9hdDMyX3QgKiBwdHIsIGZsb2F0MzJ4NHg0X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkvLyBWU1Q0LjMyIHtkMFswXSwgZDJbMF0sIGQ0WzBdLCBkNlswXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3Q0cV9sYW5lX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoNCkgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDR4NF90KiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKQoreworICAgIHZzdDFxX2xhbmVfZjMyKHB0ciwgICB2YWwtPnZhbFswXSwgbGFuZSk7CisgICAgdnN0MXFfbGFuZV9mMzIoKHB0ciArIDEpLCB2YWwtPnZhbFsxXSwgbGFuZSk7CisgICAgdnN0MXFfbGFuZV9mMzIoKHB0ciArIDIpLCB2YWwtPnZhbFsyXSwgbGFuZSk7CisgICAgdnN0MXFfbGFuZV9mMzIoKHB0ciArIDMpLCB2YWwtPnZhbFszXSwgbGFuZSk7Cit9CisjZGVmaW5lIHZzdDRxX2xhbmVfZjMyKHB0cix2YWwsbGFuZSkgdnN0NHFfbGFuZV9mMzJfcHRyKHB0ciwmdmFsLGxhbmUpCisKKy8vdm9pZCB2c3Q0cV9sYW5lX3AxNihfX3RyYW5zZmVyc2l6ZSg0KSBwb2x5MTZfdCAqIHB0ciwgcG9seTE2eDh4NF90IHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOy8vIFZTVDQuMTYge2QwWzBdLCBkMlswXSwgZDRbMF0sIGQ2WzBdfSwgW3IwXQordm9pZCB2c3Q0cV9sYW5lX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoNCkgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng4eDRfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOworI2RlZmluZSB2c3Q0cV9sYW5lX3AxNiB2c3Q0cV9sYW5lX3UxNgorCisvL3ZvaWQgdnN0NF9sYW5lX3U4KF9fdHJhbnNmZXJzaXplKDQpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDh4NF90IHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpLy8gVlNUNC44IHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3Q0X2xhbmVfdThfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQ4X3QgKiBwdHIsIHVpbnQ4eDh4NF90KiB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKQoreworICAgICoocHRyKSA9ICAgICB2YWwtPnZhbFswXS5tNjRfdThbbGFuZV07CisgICAgKihwdHIgKyAxKSA9IHZhbC0+dmFsWzFdLm02NF91OFtsYW5lXTsKKyAgICAqKHB0ciArIDIpID0gdmFsLT52YWxbMl0ubTY0X3U4W2xhbmVdOworICAgICoocHRyICsgMykgPSB2YWwtPnZhbFszXS5tNjRfdThbbGFuZV07Cit9CisjZGVmaW5lIHZzdDRfbGFuZV91OChwdHIsIHZhbCwgbGFuZSkgdnN0NF9sYW5lX3U4X3B0cihwdHIsICZ2YWwsIGxhbmUpCisKKy8vdm9pZCB2c3Q0X2xhbmVfdTE2KF9fdHJhbnNmZXJzaXplKDQpIHVpbnQxNl90ICogcHRyLCB1aW50MTZ4NHg0X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkvLyBWU1Q0LjE2IHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3Q0X2xhbmVfdTE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MTZfdCAqIHB0ciwgdWludDE2eDR4NF90KiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKQoreworICAgICoocHRyKSA9ICAgICB2YWwtPnZhbFswXS5tNjRfdTE2W2xhbmVdOworICAgICoocHRyICsgMSkgPSB2YWwtPnZhbFsxXS5tNjRfdTE2W2xhbmVdOworICAgICoocHRyICsgMikgPSB2YWwtPnZhbFsyXS5tNjRfdTE2W2xhbmVdOworICAgICoocHRyICsgMykgPSB2YWwtPnZhbFszXS5tNjRfdTE2W2xhbmVdOworfQorI2RlZmluZSB2c3Q0X2xhbmVfdTE2KHB0ciwgdmFsLCBsYW5lKSB2c3Q0X2xhbmVfdTE2X3B0cihwdHIsICZ2YWwsIGxhbmUpCisKKy8vdm9pZCB2c3Q0X2xhbmVfdTMyKF9fdHJhbnNmZXJzaXplKDQpIHVpbnQzMl90ICogcHRyLCB1aW50MzJ4Mng0X3QgdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSkvLyBWU1Q0LjMyIHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK19ORU9OMlNTRV9JTkxJTkUgdm9pZCB2c3Q0X2xhbmVfdTMyX3B0cihfX3RyYW5zZmVyc2l6ZSg0KSB1aW50MzJfdCAqIHB0ciwgdWludDMyeDJ4NF90KiB2YWwsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKQoreworICAgICoocHRyKSA9ICAgICB2YWwtPnZhbFswXS5tNjRfdTMyW2xhbmVdOworICAgICoocHRyICsgMSkgPSB2YWwtPnZhbFsxXS5tNjRfdTMyW2xhbmVdOworICAgICoocHRyICsgMikgPSB2YWwtPnZhbFsyXS5tNjRfdTMyW2xhbmVdOworICAgICoocHRyICsgMykgPSB2YWwtPnZhbFszXS5tNjRfdTMyW2xhbmVdOworfQorI2RlZmluZSB2c3Q0X2xhbmVfdTMyKHB0ciwgdmFsLCBsYW5lKSB2c3Q0X2xhbmVfdTMyX3B0cihwdHIsICZ2YWwsIGxhbmUpCisKKy8vdm9pZCB2c3Q0X2xhbmVfczgoX190cmFuc2ZlcnNpemUoNCkgaW50OF90ICogcHRyLCBpbnQ4eDh4NF90IHZhbCwgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpLy8gVlNUNC44IHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KKyNkZWZpbmUgdnN0NF9sYW5lX3M4KHB0ciwgdmFsLCBsYW5lKSB2c3Q0X2xhbmVfdTgoKHVpbnQ4X3QqKXB0ciwgdmFsLCBsYW5lKQorCisvL3ZvaWQgdnN0NF9sYW5lX3MxNihfX3RyYW5zZmVyc2l6ZSg0KSBpbnQxNl90ICogcHRyLCBpbnQxNng0eDRfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKS8vIFZTVDQuMTYge2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQorI2RlZmluZSB2c3Q0X2xhbmVfczE2KHB0ciwgdmFsLCBsYW5lKSB2c3Q0X2xhbmVfdTE2KCh1aW50MTZfdCopcHRyLCB2YWwsIGxhbmUpCisKKy8vdm9pZCB2c3Q0X2xhbmVfczMyKF9fdHJhbnNmZXJzaXplKDQpIGludDMyX3QgKiBwdHIsIGludDMyeDJ4NF90IHZhbCwgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpLy8gVlNUNC4zMiB7ZDBbMF0sIGQxWzBdLCBkMlswXSwgZDNbMF19LCBbcjBdCisjZGVmaW5lIHZzdDRfbGFuZV9zMzIocHRyLCB2YWwsIGxhbmUpIHZzdDRfbGFuZV91MzIoKHVpbnQzMl90KilwdHIsIHZhbCwgbGFuZSkKKworLy92b2lkIHZzdDRfbGFuZV9mMTYoX190cmFuc2ZlcnNpemUoNCkgX19mcDE2ICogcHRyLCBmbG9hdDE2eDR4NF90IHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOy8vIFZTVDQuMTYge2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQordm9pZCB2c3Q0X2xhbmVfZjE2X3B0cihfX3RyYW5zZmVyc2l6ZSg0KSBfX2ZwMTYgKiBwdHIsIGZsb2F0MTZ4NHg0X3QgKiB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsKKy8vY3VycmVudCBJQSBTSU1EIGRvZXNuJ3Qgc3VwcG9ydCBmbG9hdDE2CisKK3ZvaWQgdnN0NF9sYW5lX2YzMl9wdHIoX190cmFuc2ZlcnNpemUoNCkgZmxvYXQzMl90ICogcHRyLCBmbG9hdDMyeDJ4NF90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZTVDQuMzIge2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQorX05FT04yU1NFX0lOTElORSB2b2lkIHZzdDRfbGFuZV9mMzJfcHRyKF9fdHJhbnNmZXJzaXplKDQpIGZsb2F0MzJfdCAqIHB0ciwgZmxvYXQzMngyeDRfdCogdmFsLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSkKK3sKKyAgICAqKHB0cikgPSB2YWwtPnZhbFswXS5tNjRfZjMyW2xhbmVdOworICAgICoocHRyICsgMSkgPSB2YWwtPnZhbFsxXS5tNjRfZjMyW2xhbmVdOworICAgICoocHRyICsgMikgPSB2YWwtPnZhbFsyXS5tNjRfZjMyW2xhbmVdOworICAgICoocHRyICsgMykgPSB2YWwtPnZhbFszXS5tNjRfZjMyW2xhbmVdOworfQorI2RlZmluZSB2c3Q0X2xhbmVfZjMyKHB0cix2YWwsbGFuZSkgdnN0NF9sYW5lX2YzMl9wdHIocHRyLCZ2YWwsbGFuZSkKKworLy92b2lkIHZzdDRfbGFuZV9wOChfX3RyYW5zZmVyc2l6ZSg0KSBwb2x5OF90ICogcHRyLCBwb2x5OHg4eDRfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsvLyBWU1Q0Ljgge2QwWzBdLCBkMVswXSwgZDJbMF0sIGQzWzBdfSwgW3IwXQordm9pZCB2c3Q0X2xhbmVfcDhfcHRyKF9fdHJhbnNmZXJzaXplKDQpIHBvbHk4X3QgKiBwdHIsIHBvbHk4eDh4NF90ICogdmFsLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7CisjZGVmaW5lIHZzdDRfbGFuZV9wOCB2c3Q0X2xhbmVfdTgKKworLy92b2lkIHZzdDRfbGFuZV9wMTYoX190cmFuc2ZlcnNpemUoNCkgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng0eDRfdCB2YWwsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsvLyBWU1Q0LjE2IHtkMFswXSwgZDFbMF0sIGQyWzBdLCBkM1swXX0sIFtyMF0KK3ZvaWQgdnN0NF9sYW5lX3AxNl9wdHIoX190cmFuc2ZlcnNpemUoNCkgcG9seTE2X3QgKiBwdHIsIHBvbHkxNng0eDRfdCAqIHZhbCwgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOworI2RlZmluZSB2c3Q0X2xhbmVfcDE2IHZzdDRfbGFuZV91MTYKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKiogRXh0cmFjdCBsYW5lcyBmcm9tIGEgdmVjdG9yICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL1RoZXNlIGludHJpbnNpY3MgZXh0cmFjdCBhIHNpbmdsZSBsYW5lIChlbGVtZW50KSBmcm9tIGEgdmVjdG9yLgordWludDhfdCB2Z2V0X2xhbmVfdTgodWludDh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTU9WLlU4IHIwLCBkMFswXQorI2RlZmluZSB2Z2V0X2xhbmVfdTgodmVjLCBsYW5lKSB2ZWMubTY0X3U4W2xhbmVdCisKK3VpbnQxNl90IHZnZXRfbGFuZV91MTYodWludDE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVk1PVi5zMTYgcjAsIGQwWzBdCisjZGVmaW5lIHZnZXRfbGFuZV91MTYodmVjLCBsYW5lKSB2ZWMubTY0X3UxNltsYW5lXQorCisKK3VpbnQzMl90IHZnZXRfbGFuZV91MzIodWludDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVk1PVi4zMiByMCwgZDBbMF0KKyNkZWZpbmUgdmdldF9sYW5lX3UzMih2ZWMsIGxhbmUpIHZlYy5tNjRfdTMyW2xhbmVdCisKK2ludDhfdCB2Z2V0X2xhbmVfczgoaW50OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZNT1YuUzggcjAsIGQwWzBdCisjZGVmaW5lIHZnZXRfbGFuZV9zOCh2ZWMsIGxhbmUpIHZlYy5tNjRfaThbbGFuZV0KKworaW50MTZfdCB2Z2V0X2xhbmVfczE2KGludDE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVk1PVi5TMTYgcjAsIGQwWzBdCisjZGVmaW5lIHZnZXRfbGFuZV9zMTYodmVjLCBsYW5lKSB2ZWMubTY0X2kxNltsYW5lXQorCitpbnQzMl90IHZnZXRfbGFuZV9zMzIoaW50MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTU9WLjMyIHIwLCBkMFswXQorI2RlZmluZSB2Z2V0X2xhbmVfczMyKHZlYywgbGFuZSkgdmVjLm02NF9pMzJbbGFuZV0KKworcG9seThfdCB2Z2V0X2xhbmVfcDgocG9seTh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTU9WLlU4IHIwLCBkMFswXQorI2RlZmluZSB2Z2V0X2xhbmVfcDggdmdldF9sYW5lX3U4CisKK3BvbHkxNl90IHZnZXRfbGFuZV9wMTYocG9seTE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVk1PVi5zMTYgcjAsIGQwWzBdCisjZGVmaW5lIHZnZXRfbGFuZV9wMTYgdmdldF9sYW5lX3UxNgorCitmbG9hdDMyX3QgdmdldF9sYW5lX2YzMihmbG9hdDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVk1PVi4zMiByMCwgZDBbMF0KKyNkZWZpbmUgdmdldF9sYW5lX2YzMih2ZWMsIGxhbmUpIHZlYy5tNjRfZjMyW2xhbmVdCisKK3VpbnQ4X3QgdmdldHFfbGFuZV91OCh1aW50OHgxNl90IHZlYywgX19jb25zdHJhbmdlKDAsMTUpIGludCBsYW5lKTsgLy8gVk1PVi5VOCByMCwgZDBbMF0KKyNkZWZpbmUgdmdldHFfbGFuZV91OCBfTU1fRVhUUkFDVF9FUEk4CisKK3VpbnQxNl90IHZnZXRxX2xhbmVfdTE2KHVpbnQxNng4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZNT1YuczE2IHIwLCBkMFswXQorI2RlZmluZSAgdmdldHFfbGFuZV91MTYgX01NX0VYVFJBQ1RfRVBJMTYKKwordWludDMyX3QgdmdldHFfbGFuZV91MzIodWludDMyeDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVk1PVi4zMiByMCwgZDBbMF0KKyNkZWZpbmUgdmdldHFfbGFuZV91MzIgX01NX0VYVFJBQ1RfRVBJMzIKKworaW50OF90IHZnZXRxX2xhbmVfczgoaW50OHgxNl90IHZlYywgX19jb25zdHJhbmdlKDAsMTUpIGludCBsYW5lKTsgLy8gVk1PVi5TOCByMCwgZDBbMF0KKyNkZWZpbmUgdmdldHFfbGFuZV9zOCB2Z2V0cV9sYW5lX3U4CisKK2ludDE2X3QgdmdldHFfbGFuZV9zMTYoaW50MTZ4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTU9WLlMxNiByMCwgZDBbMF0KKyNkZWZpbmUgdmdldHFfbGFuZV9zMTYgdmdldHFfbGFuZV91MTYKKworaW50MzJfdCB2Z2V0cV9sYW5lX3MzMihpbnQzMng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZNT1YuMzIgcjAsIGQwWzBdCisjZGVmaW5lIHZnZXRxX2xhbmVfczMyIHZnZXRxX2xhbmVfdTMyCisKK3BvbHk4X3QgdmdldHFfbGFuZV9wOChwb2x5OHgxNl90IHZlYywgX19jb25zdHJhbmdlKDAsMTUpIGludCBsYW5lKTsgLy8gVk1PVi5VOCByMCwgZDBbMF0KKyNkZWZpbmUgdmdldHFfbGFuZV9wOCB2Z2V0cV9sYW5lX3U4CisKK3BvbHkxNl90IHZnZXRxX2xhbmVfcDE2KHBvbHkxNng4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZNT1YuczE2IHIwLCBkMFswXQorI2RlZmluZSB2Z2V0cV9sYW5lX3AxNiB2Z2V0cV9sYW5lX3UxNgorCitmbG9hdDMyX3QgdmdldHFfbGFuZV9mMzIoZmxvYXQzMng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZNT1YuMzIgcjAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJfdCB2Z2V0cV9sYW5lX2YzMihmbG9hdDMyeDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKQoreworICAgIGludDMyX3QgaWxhbmU7CisgICAgaWxhbmUgPSBfTU1fRVhUUkFDVF9QUyh2ZWMsbGFuZSk7CisgICAgcmV0dXJuICooZmxvYXQqKSZpbGFuZTsKK30KKworaW50NjRfdCB2Z2V0X2xhbmVfczY0KGludDY0eDFfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDApIGludCBsYW5lKTsgLy8gVk1PViByMCxyMCxkMAorI2RlZmluZSB2Z2V0X2xhbmVfczY0KHZlYywgbGFuZSkgdmVjLm02NF9pNjRbMF0KKwordWludDY0X3QgdmdldF9sYW5lX3U2NCh1aW50NjR4MV90IHZlYywgX19jb25zdHJhbmdlKDAsMCkgaW50IGxhbmUpOyAvLyBWTU9WIHIwLHIwLGQwCisjZGVmaW5lIHZnZXRfbGFuZV91NjQodmVjLCBsYW5lKSB2ZWMubTY0X3U2NFswXQorCisKK2ludDY0X3QgdmdldHFfbGFuZV9zNjQoaW50NjR4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTU9WIHIwLHIwLGQwCisjZGVmaW5lIHZnZXRxX2xhbmVfczY0IChpbnQ2NF90KSB2Z2V0cV9sYW5lX3U2NAorCit1aW50NjRfdCB2Z2V0cV9sYW5lX3U2NCh1aW50NjR4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTU9WIHIwLHIwLGQwCisjZGVmaW5lIHZnZXRxX2xhbmVfdTY0IF9NTV9FWFRSQUNUX0VQSTY0CisKKy8vICoqKioqKioqKioqKioqKioqIFNldCBsYW5lcyB3aXRoaW4gYSB2ZWN0b3IgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL1RoZXNlIGludHJpbnNpY3Mgc2V0IGEgc2luZ2xlIGxhbmUgKGVsZW1lbnQpIHdpdGhpbiBhIHZlY3Rvci4KKy8vc2FtZSBmdW5jdGlvbnMgYXMgdmxkMV9sYW5lX3h4IG9uZXMsIGJ1dCB0YWtlIHRoZSB2YWx1ZSB0byBiZSBzZXQgZGlyZWN0bHkuCisKK3VpbnQ4eDhfdCB2c2V0X2xhbmVfdTgodWludDhfdCB2YWx1ZSwgdWludDh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWTU9WLjggZDBbMF0scjAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZzZXRfbGFuZV91OCh1aW50OF90IHZhbHVlLCB1aW50OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSkKK3sKKyAgICB1aW50OF90IHZhbDsKKyAgICB2YWwgPSB2YWx1ZTsKKyAgICByZXR1cm4gdmxkMV9sYW5lX3U4KCZ2YWwsIHZlYywgIGxhbmUpOworfQorCit1aW50MTZ4NF90IHZzZXRfbGFuZV91MTYodWludDE2X3QgdmFsdWUsIHVpbnQxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZNT1YuMTYgZDBbMF0scjAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDRfdCB2c2V0X2xhbmVfdTE2KHVpbnQxNl90IHZhbHVlLCB1aW50MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgdWludDE2X3QgdmFsOworICAgIHZhbCA9IHZhbHVlOworICAgIHJldHVybiB2bGQxX2xhbmVfdTE2KCZ2YWwsIHZlYywgIGxhbmUpOworfQorCit1aW50MzJ4Ml90IHZzZXRfbGFuZV91MzIodWludDMyX3QgdmFsdWUsIHVpbnQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZNT1YuMzIgZDBbMF0scjAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2c2V0X2xhbmVfdTMyKHVpbnQzMl90IHZhbHVlLCB1aW50MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpCit7CisgICAgdWludDMyX3QgdmFsOworICAgIHZhbCA9IHZhbHVlOworICAgIHJldHVybiB2bGQxX2xhbmVfdTMyKCZ2YWwsIHZlYywgIGxhbmUpOworfQorCitpbnQ4eDhfdCB2c2V0X2xhbmVfczgoaW50OF90IHZhbHVlLCBpbnQ4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVk1PVi44IGQwWzBdLHIwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZzZXRfbGFuZV9zOChpbnQ4X3QgdmFsdWUsIGludDh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpCit7CisgICAgaW50OF90IHZhbDsKKyAgICB2YWwgPSB2YWx1ZTsKKyAgICByZXR1cm4gdmxkMV9sYW5lX3M4KCZ2YWwsIHZlYywgIGxhbmUpOworfQorCitpbnQxNng0X3QgdnNldF9sYW5lX3MxNihpbnQxNl90IHZhbHVlLCBpbnQxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZNT1YuMTYgZDBbMF0scjAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZzZXRfbGFuZV9zMTYoaW50MTZfdCB2YWx1ZSwgaW50MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgaW50MTZfdCB2YWw7CisgICAgdmFsID0gdmFsdWU7CisgICAgcmV0dXJuIHZsZDFfbGFuZV9zMTYoJnZhbCwgdmVjLCAgbGFuZSk7Cit9CisKK2ludDMyeDJfdCB2c2V0X2xhbmVfczMyKGludDMyX3QgdmFsdWUsIGludDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVk1PVi4zMiBkMFswXSxyMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdnNldF9sYW5lX3MzMihpbnQzMl90IHZhbHVlLCBpbnQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSkKK3sKKyAgICBpbnQzMl90IHZhbDsKKyAgICB2YWwgPSB2YWx1ZTsKKyAgICByZXR1cm4gdmxkMV9sYW5lX3MzMigmdmFsLCB2ZWMsICBsYW5lKTsKK30KKworcG9seTh4OF90IHZzZXRfbGFuZV9wOChwb2x5OF90IHZhbHVlLCBwb2x5OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZNT1YuOCBkMFswXSxyMAorI2RlZmluZSB2c2V0X2xhbmVfcDggIHZzZXRfbGFuZV91OAorCitwb2x5MTZ4NF90IHZzZXRfbGFuZV9wMTYocG9seTE2X3QgdmFsdWUsIHBvbHkxNng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZNT1YuMTYgZDBbMF0scjAKKyNkZWZpbmUgdnNldF9sYW5lX3AxNiAgdnNldF9sYW5lX3UxNgorCitmbG9hdDMyeDJfdCB2c2V0X2xhbmVfZjMyKGZsb2F0MzJfdCB2YWx1ZSwgZmxvYXQzMngyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZNT1YuMzIgZDBbMF0scjAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3QgdnNldF9sYW5lX2YzMihmbG9hdDMyX3QgdmFsdWUsIGZsb2F0MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpCit7CisgICAgZmxvYXQzMl90IHZhbDsKKyAgICB2YWwgPSB2YWx1ZTsKKyAgICByZXR1cm4gdmxkMV9sYW5lX2YzMigmdmFsLCB2ZWMsICBsYW5lKTsKK30KKwordWludDh4MTZfdCB2c2V0cV9sYW5lX3U4KHVpbnQ4X3QgdmFsdWUsIHVpbnQ4eDE2X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGxhbmUpOyAvLyBWTU9WLjggZDBbMF0scjAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZfdCB2c2V0cV9sYW5lX3U4KHVpbnQ4X3QgdmFsdWUsIHVpbnQ4eDE2X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGxhbmUpCit7CisgICAgdWludDhfdCB2YWw7CisgICAgdmFsID0gdmFsdWU7CisgICAgcmV0dXJuIHZsZDFxX2xhbmVfdTgoJnZhbCwgdmVjLCAgbGFuZSk7Cit9CisKK3VpbnQxNng4X3QgdnNldHFfbGFuZV91MTYodWludDE2X3QgdmFsdWUsIHVpbnQxNng4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZNT1YuMTYgZDBbMF0scjAKK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDhfdCB2c2V0cV9sYW5lX3UxNih1aW50MTZfdCB2YWx1ZSwgdWludDE2eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKQoreworICAgIHVpbnQxNl90IHZhbDsKKyAgICB2YWwgPSB2YWx1ZTsKKyAgICByZXR1cm4gdmxkMXFfbGFuZV91MTYoJnZhbCwgdmVjLCAgbGFuZSk7Cit9CisKK3VpbnQzMng0X3QgdnNldHFfbGFuZV91MzIodWludDMyX3QgdmFsdWUsIHVpbnQzMng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZNT1YuMzIgZDBbMF0scjAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2c2V0cV9sYW5lX3UzMih1aW50MzJfdCB2YWx1ZSwgdWludDMyeDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKQoreworICAgIHVpbnQzMl90IHZhbDsKKyAgICB2YWwgPSB2YWx1ZTsKKyAgICByZXR1cm4gdmxkMXFfbGFuZV91MzIoJnZhbCwgdmVjLCAgbGFuZSk7Cit9CisKK2ludDh4MTZfdCB2c2V0cV9sYW5lX3M4KGludDhfdCB2YWx1ZSwgaW50OHgxNl90IHZlYywgX19jb25zdHJhbmdlKDAsMTUpIGludCBsYW5lKTsgLy8gVk1PVi44IGQwWzBdLHIwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4MTZfdCB2c2V0cV9sYW5lX3M4KGludDhfdCB2YWx1ZSwgaW50OHgxNl90IHZlYywgX19jb25zdHJhbmdlKDAsMTUpIGludCBsYW5lKQoreworICAgIGludDhfdCB2YWw7CisgICAgdmFsID0gdmFsdWU7CisgICAgcmV0dXJuIHZsZDFxX2xhbmVfczgoJnZhbCwgdmVjLCAgbGFuZSk7Cit9CisKK2ludDE2eDhfdCB2c2V0cV9sYW5lX3MxNihpbnQxNl90IHZhbHVlLCBpbnQxNng4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZNT1YuMTYgZDBbMF0scjAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZzZXRxX2xhbmVfczE2KGludDE2X3QgdmFsdWUsIGludDE2eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKQoreworICAgIGludDE2X3QgdmFsOworICAgIHZhbCA9IHZhbHVlOworICAgIHJldHVybiB2bGQxcV9sYW5lX3MxNigmdmFsLCB2ZWMsICBsYW5lKTsKK30KKworaW50MzJ4NF90IHZzZXRxX2xhbmVfczMyKGludDMyX3QgdmFsdWUsIGludDMyeDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVk1PVi4zMiBkMFswXSxyMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnNldHFfbGFuZV9zMzIoaW50MzJfdCB2YWx1ZSwgaW50MzJ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgaW50MzJfdCB2YWw7CisgICAgdmFsID0gdmFsdWU7CisgICAgcmV0dXJuIHZsZDFxX2xhbmVfczMyKCZ2YWwsIHZlYywgIGxhbmUpOworfQorCitwb2x5OHgxNl90IHZzZXRxX2xhbmVfcDgocG9seThfdCB2YWx1ZSwgcG9seTh4MTZfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgbGFuZSk7IC8vIFZNT1YuOCBkMFswXSxyMAorI2RlZmluZSB2c2V0cV9sYW5lX3A4IHZzZXRxX2xhbmVfdTgKKworcG9seTE2eDhfdCB2c2V0cV9sYW5lX3AxNihwb2x5MTZfdCB2YWx1ZSwgcG9seTE2eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKTsgLy8gVk1PVi4xNiBkMFswXSxyMAorI2RlZmluZSB2c2V0cV9sYW5lX3AxNiB2c2V0cV9sYW5lX3UxNgorCitmbG9hdDMyeDRfdCB2c2V0cV9sYW5lX2YzMihmbG9hdDMyX3QgdmFsdWUsIGZsb2F0MzJ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWTU9WLjMyIGQwWzBdLHIwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4NF90IHZzZXRxX2xhbmVfZjMyKGZsb2F0MzJfdCB2YWx1ZSwgZmxvYXQzMng0X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSkKK3sKKyAgICBmbG9hdDMyX3QgdmFsOworICAgIHZhbCA9IHZhbHVlOworICAgIHJldHVybiB2bGQxcV9sYW5lX2YzMigmdmFsLCB2ZWMsICBsYW5lKTsKK30KKworaW50NjR4MV90IHZzZXRfbGFuZV9zNjQoaW50NjRfdCB2YWx1ZSwgaW50NjR4MV90IHZlYywgX19jb25zdHJhbmdlKDAsMCkgaW50IGxhbmUpOyAvLyBWTU9WIGQwLHIwLHIwCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDFfdCB2c2V0X2xhbmVfczY0KGludDY0X3QgdmFsdWUsIGludDY0eDFfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDApIGludCBsYW5lKQoreworICAgIGludDY0X3QgdmFsOworICAgIHZhbCA9IHZhbHVlOworICAgIHJldHVybiB2bGQxX2xhbmVfczY0KCZ2YWwsIHZlYywgIGxhbmUpOworfQorCit1aW50NjR4MV90IHZzZXRfbGFuZV91NjQodWludDY0X3QgdmFsdWUsIHVpbnQ2NHgxX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgbGFuZSk7IC8vIFZNT1YgZDAscjAscjAKK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDFfdCB2c2V0X2xhbmVfdTY0KHVpbnQ2NF90IHZhbHVlLCB1aW50NjR4MV90IHZlYywgX19jb25zdHJhbmdlKDAsMCkgaW50IGxhbmUpCit7CisgICAgdWludDY0X3QgdmFsOworICAgIHZhbCA9IHZhbHVlOworICAgIHJldHVybiB2bGQxX2xhbmVfdTY0KCZ2YWwsIHZlYywgIGxhbmUpOworfQorCitpbnQ2NHgyX3QgdnNldHFfbGFuZV9zNjQoaW50NjRfdCB2YWx1ZSwgaW50NjR4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTU9WIGQwLHIwLHIwCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDJfdCB2c2V0cV9sYW5lX3M2NChpbnQ2NF90IHZhbHVlLCBpbnQ2NHgyX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSkKK3sKKyAgICB1aW50NjRfdCB2YWw7CisgICAgdmFsID0gdmFsdWU7CisgICAgcmV0dXJuIHZsZDFxX2xhbmVfczY0KCZ2YWwsIHZlYywgIGxhbmUpOworfQorCit1aW50NjR4Ml90IHZzZXRxX2xhbmVfdTY0KHVpbnQ2NF90IHZhbHVlLCB1aW50NjR4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWTU9WIGQwLHIwLHIwCisjZGVmaW5lIHZzZXRxX2xhbmVfdTY0IHZzZXRxX2xhbmVfczY0CisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vICoqKioqKioqKioqKioqKiogSW5pdGlhbGl6ZSBhIHZlY3RvciBmcm9tIGJpdCBwYXR0ZXJuICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9UaGVzZSBpbnRyaW5zaWNzIGNyZWF0ZSBhIHZlY3RvciBmcm9tIGEgbGl0ZXJhbCBiaXQgcGF0dGVybi4KK2ludDh4OF90IHZjcmVhdGVfczgodWludDY0X3QgYSk7IC8vIFZNT1YgZDAscjAscjAKKyNkZWZpbmUgdmNyZWF0ZV9zOChhKSAgKCooX19tNjRfMTI4KikmKGEpKQorCisKK2ludDE2eDRfdCB2Y3JlYXRlX3MxNih1aW50NjRfdCBhKTsgLy8gVk1PViBkMCxyMCxyMAorI2RlZmluZSB2Y3JlYXRlX3MxNiAgdmNyZWF0ZV9zOAorCitpbnQzMngyX3QgdmNyZWF0ZV9zMzIodWludDY0X3QgYSk7IC8vIFZNT1YgZDAscjAscjAKKyNkZWZpbmUgdmNyZWF0ZV9zMzIgIHZjcmVhdGVfczgKKworZmxvYXQxNng0X3QgdmNyZWF0ZV9mMTYodWludDY0X3QgYSk7IC8vIFZNT1YgZDAscjAscjAKKy8vbm8gSUEzMiBTSU1EIGF2YWxpbGFibGUKKworZmxvYXQzMngyX3QgdmNyZWF0ZV9mMzIodWludDY0X3QgYSk7IC8vIFZNT1YgZDAscjAscjAKKyNkZWZpbmUgdmNyZWF0ZV9mMzIoYSkgICgqKF9fbTY0XzEyOCopJihhKSkKKwordWludDh4OF90IHZjcmVhdGVfdTgodWludDY0X3QgYSk7IC8vIFZNT1YgZDAscjAscjAKKyNkZWZpbmUgdmNyZWF0ZV91OCB2Y3JlYXRlX3M4CisKK3VpbnQxNng0X3QgdmNyZWF0ZV91MTYodWludDY0X3QgYSk7IC8vIFZNT1YgZDAscjAscjAKKyNkZWZpbmUgdmNyZWF0ZV91MTYgdmNyZWF0ZV9zMTYKKwordWludDMyeDJfdCB2Y3JlYXRlX3UzMih1aW50NjRfdCBhKTsgLy8gVk1PViBkMCxyMCxyMAorI2RlZmluZSB2Y3JlYXRlX3UzMiB2Y3JlYXRlX3MzMgorCit1aW50NjR4MV90IHZjcmVhdGVfdTY0KHVpbnQ2NF90IGEpOyAvLyBWTU9WIGQwLHIwLHIwCisjZGVmaW5lIHZjcmVhdGVfdTY0ICB2Y3JlYXRlX3M4CisKKworcG9seTh4OF90IHZjcmVhdGVfcDgodWludDY0X3QgYSk7IC8vIFZNT1YgZDAscjAscjAKKyNkZWZpbmUgdmNyZWF0ZV9wOCB2Y3JlYXRlX3U4CisKK3BvbHkxNng0X3QgdmNyZWF0ZV9wMTYodWludDY0X3QgYSk7IC8vIFZNT1YgZDAscjAscjAKKyNkZWZpbmUgdmNyZWF0ZV9wMTYgdmNyZWF0ZV91MTYKKworaW50NjR4MV90IHZjcmVhdGVfczY0KHVpbnQ2NF90IGEpOyAvLyBWTU9WIGQwLHIwLHIwCisjZGVmaW5lIHZjcmVhdGVfczY0IHZjcmVhdGVfdTY0CisKKy8vKioqKioqKioqKioqKioqKioqKioqIFNldCBhbGwgbGFuZXMgdG8gc2FtZSB2YWx1ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vVGhlc2UgaW50cmluc2ljcyBzZXQgYWxsIGxhbmVzIHRvIHRoZSBzYW1lIHZhbHVlLgordWludDh4OF90ICAgdmR1cF9uX3U4KHVpbnQ4X3QgdmFsdWUpOyAvLyBWRFVQLjggZDAscjAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDh4OF90ICB2ZHVwX25fdTgodWludDhfdCB2YWx1ZSksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIHVpbnQ4eDhfdCByZXM7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaTw4OyBpKyspIHsKKyAgICAgICAgcmVzLm02NF91OFtpXSA9IHZhbHVlOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit1aW50MTZ4NF90ICAgdmR1cF9uX3UxNih1aW50MTZfdCB2YWx1ZSk7IC8vIFZEVVAuMTYgZDAscjAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcodWludDE2eDRfdCAgdmR1cF9uX3UxNih1aW50MTZfdCB2YWx1ZSksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIHVpbnQxNng0X3QgcmVzOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGk8NDsgaSsrKSB7CisgICAgICAgIHJlcy5tNjRfdTE2W2ldID0gdmFsdWU7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQzMngyX3QgICB2ZHVwX25fdTMyKHVpbnQzMl90IHZhbHVlKTsgLy8gVkRVUC4zMiBkMCxyMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyh1aW50MzJ4Ml90ICB2ZHVwX25fdTMyKHVpbnQzMl90IHZhbHVlKSwgIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgdWludDMyeDJfdCByZXM7CisgICAgcmVzLm02NF91MzJbMF0gPSB2YWx1ZTsKKyAgICByZXMubTY0X3UzMlsxXSA9IHZhbHVlOworICAgIHJldHVybiByZXM7Cit9CisKK2ludDh4OF90ICAgdmR1cF9uX3M4KGludDhfdCB2YWx1ZSk7IC8vIFZEVVAuOCBkMCxyMAorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ4eDhfdCAgdmR1cF9uX3M4KGludDhfdCB2YWx1ZSksICBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIGludDh4OF90IHJlczsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpPDg7IGkrKykgeworICAgICAgICByZXMubTY0X2k4W2ldID0gdmFsdWU7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK2ludDE2eDRfdCAgIHZkdXBfbl9zMTYoaW50MTZfdCB2YWx1ZSk7IC8vIFZEVVAuMTYgZDAscjAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MTZ4NF90ICB2ZHVwX25fczE2KGludDE2X3QgdmFsdWUpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBpbnQxNng0X3QgcmVzOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGk8NDsgaSsrKSB7CisgICAgICAgIHJlcy5tNjRfaTE2W2ldID0gdmFsdWU7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK2ludDMyeDJfdCAgIHZkdXBfbl9zMzIoaW50MzJfdCB2YWx1ZSk7IC8vIFZEVVAuMzIgZDAscjAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MzJ4Ml90ICB2ZHVwX25fczMyKGludDMyX3QgdmFsdWUpLCAgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBpbnQzMngyX3QgcmVzOworICAgIHJlcy5tNjRfaTMyWzBdID0gdmFsdWU7CisgICAgcmVzLm02NF9pMzJbMV0gPSB2YWx1ZTsKKyAgICByZXR1cm4gcmVzOworfQorCitwb2x5OHg4X3QgdmR1cF9uX3A4KHBvbHk4X3QgdmFsdWUpOyAvLyBWRFVQLjggZDAscjAKKyNkZWZpbmUgdmR1cF9uX3A4IHZkdXBfbl91OAorCitwb2x5MTZ4NF90IHZkdXBfbl9wMTYocG9seTE2X3QgdmFsdWUpOyAvLyBWRFVQLjE2IGQwLHIwCisjZGVmaW5lIHZkdXBfbl9wMTYgdmR1cF9uX3MxNgorCitmbG9hdDMyeDJfdCB2ZHVwX25fZjMyKGZsb2F0MzJfdCB2YWx1ZSk7IC8vIFZEVVAuMzIgZDAscjAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3QgdmR1cF9uX2YzMihmbG9hdDMyX3QgdmFsdWUpCit7CisgICAgZmxvYXQzMngyX3QgcmVzOworICAgIHJlcy5tNjRfZjMyWzBdID0gdmFsdWU7CisgICAgcmVzLm02NF9mMzJbMV0gPSB2YWx1ZTsKKyAgICByZXR1cm4gcmVzOworfQorCit1aW50OHgxNl90ICAgdmR1cHFfbl91OCh1aW50OF90IHZhbHVlKTsgLy8gVkRVUC44IHEwLHIwCisjZGVmaW5lIHZkdXBxX25fdTgodmFsdWUpIF9tbV9zZXQxX2VwaTgoKHVpbnQ4X3QpICh2YWx1ZSkpCisKK3VpbnQxNng4X3QgICB2ZHVwcV9uX3UxNih1aW50MTZfdCB2YWx1ZSk7IC8vIFZEVVAuMTYgcTAscjAKKyNkZWZpbmUgdmR1cHFfbl91MTYodmFsdWUpIF9tbV9zZXQxX2VwaTE2KCh1aW50MTZfdCkgKHZhbHVlKSkKKwordWludDMyeDRfdCAgIHZkdXBxX25fdTMyKHVpbnQzMl90IHZhbHVlKTsgLy8gVkRVUC4zMiBxMCxyMAorI2RlZmluZSB2ZHVwcV9uX3UzMih2YWx1ZSkgX21tX3NldDFfZXBpMzIoKHVpbnQzMl90KSAodmFsdWUpKQorCitpbnQ4eDE2X3QgICB2ZHVwcV9uX3M4KGludDhfdCB2YWx1ZSk7IC8vIFZEVVAuOCBxMCxyMAorI2RlZmluZSB2ZHVwcV9uX3M4IF9tbV9zZXQxX2VwaTgKKworaW50MTZ4OF90ICAgdmR1cHFfbl9zMTYoaW50MTZfdCB2YWx1ZSk7IC8vIFZEVVAuMTYgcTAscjAKKyNkZWZpbmUgdmR1cHFfbl9zMTYgX21tX3NldDFfZXBpMTYKKworaW50MzJ4NF90ICAgdmR1cHFfbl9zMzIoaW50MzJfdCB2YWx1ZSk7IC8vIFZEVVAuMzIgcTAscjAKKyNkZWZpbmUgdmR1cHFfbl9zMzIgX21tX3NldDFfZXBpMzIKKworcG9seTh4MTZfdCB2ZHVwcV9uX3A4KHBvbHk4X3QgdmFsdWUpOyAvLyBWRFVQLjggcTAscjAKKyNkZWZpbmUgIHZkdXBxX25fcDggdmR1cHFfbl91OAorCitwb2x5MTZ4OF90IHZkdXBxX25fcDE2KHBvbHkxNl90IHZhbHVlKTsgLy8gVkRVUC4xNiBxMCxyMAorI2RlZmluZSAgdmR1cHFfbl9wMTYgdmR1cHFfbl91MTYKKworZmxvYXQzMng0X3QgdmR1cHFfbl9mMzIoZmxvYXQzMl90IHZhbHVlKTsgLy8gVkRVUC4zMiBxMCxyMAorI2RlZmluZSB2ZHVwcV9uX2YzMiBfbW1fc2V0MV9wcworCitpbnQ2NHgxX3QgdmR1cF9uX3M2NChpbnQ2NF90IHZhbHVlKTsgLy8gVk1PViBkMCxyMCxyMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgxX3QgdmR1cF9uX3M2NChpbnQ2NF90IHZhbHVlKQoreworICAgIGludDY0eDFfdCByZXM7CisgICAgcmVzLm02NF9pNjRbMF0gPSB2YWx1ZTsKKyAgICByZXR1cm4gcmVzOworfQorCit1aW50NjR4MV90IHZkdXBfbl91NjQodWludDY0X3QgdmFsdWUpOyAvLyBWTU9WIGQwLHIwLHIwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgxX3QgIHZkdXBfbl91NjQodWludDY0X3QgdmFsdWUpCit7CisgICAgdWludDY0eDFfdCByZXM7CisgICAgcmVzLm02NF91NjRbMF0gPSB2YWx1ZTsKKyAgICByZXR1cm4gcmVzOworfQorCitpbnQ2NHgyX3QgICB2ZHVwcV9uX3M2NChpbnQ2NF90IHZhbHVlKTsgLy8gVk1PViBkMCxyMCxyMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgyX3QgICB2ZHVwcV9uX3M2NChpbnQ2NF90IHZhbHVlKQoreworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ2NF90IHZhbHVlMlsyXSA9IHt2YWx1ZSwgdmFsdWV9OyAvL3ZhbHVlIG1heSBiZSBhbiBpbW1lZGlhdGUKKyAgICByZXR1cm4gTE9BRF9TSTEyOCh2YWx1ZTIpOworfQorCit1aW50NjR4Ml90ICAgdmR1cHFfbl91NjQodWludDY0X3QgdmFsdWUpOyAvLyBWTU9WIGQwLHIwLHIwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgyX3QgICB2ZHVwcV9uX3U2NCh1aW50NjRfdCB2YWx1ZSkKK3sKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgdWludDY0X3QgdmFsWzJdID0ge3ZhbHVlLCB2YWx1ZX07IC8vdmFsdWUgbWF5IGJlIGFuIGltbWVkaWF0ZQorICAgIHJldHVybiBMT0FEX1NJMTI4KHZhbCk7Cit9CisKKy8vKioqKiAgU2V0IGFsbCBsYW5lcyB0byBzYW1lIHZhbHVlICAqKioqKioqKioqKioqKioqKioqKioqKioKKy8vU2FtZSBmdW5jdGlvbnMgYXMgYWJvdmUgLSBqdXN0IGFsaWFjZXMuKioqKioqKioqKioqKioqKioqKioKKy8vUHJvYmFibHkgdGhleSByZWZsZWN0IHRoZSBmYWN0IHRoYXQgMTI4LWJpdCBmdW5jdGlvbnMgdmVyc2lvbnMgdXNlIFZNT1YgaW5zdHJ1Y3Rpb24gKioqKioqKioqKgordWludDh4OF90IHZtb3Zfbl91OCh1aW50OF90IHZhbHVlKTsgLy8gVkRVUC44IGQwLHIwCisjZGVmaW5lIHZtb3Zfbl91OCB2ZHVwX25fczgKKwordWludDE2eDRfdCB2bW92X25fdTE2KHVpbnQxNl90IHZhbHVlKTsgLy8gVkRVUC4xNiBkMCxyMAorI2RlZmluZSB2bW92X25fdTE2IHZkdXBfbl9zMTYKKwordWludDMyeDJfdCB2bW92X25fdTMyKHVpbnQzMl90IHZhbHVlKTsgLy8gVkRVUC4zMiBkMCxyMAorI2RlZmluZSB2bW92X25fdTMyIHZkdXBfbl91MzIKKworaW50OHg4X3Qgdm1vdl9uX3M4KGludDhfdCB2YWx1ZSk7IC8vIFZEVVAuOCBkMCxyMAorI2RlZmluZSB2bW92X25fczggdmR1cF9uX3M4CisKK2ludDE2eDRfdCB2bW92X25fczE2KGludDE2X3QgdmFsdWUpOyAvLyBWRFVQLjE2IGQwLHIwCisjZGVmaW5lIHZtb3Zfbl9zMTYgdmR1cF9uX3MxNgorCitpbnQzMngyX3Qgdm1vdl9uX3MzMihpbnQzMl90IHZhbHVlKTsgLy8gVkRVUC4zMiBkMCxyMAorI2RlZmluZSB2bW92X25fczMyIHZkdXBfbl9zMzIKKworcG9seTh4OF90IHZtb3Zfbl9wOChwb2x5OF90IHZhbHVlKTsgLy8gVkRVUC44IGQwLHIwCisjZGVmaW5lIHZtb3Zfbl9wOCB2ZHVwX25fdTgKKworcG9seTE2eDRfdCB2bW92X25fcDE2KHBvbHkxNl90IHZhbHVlKTsgLy8gVkRVUC4xNiBkMCxyMAorI2RlZmluZSB2bW92X25fcDE2IHZkdXBfbl9zMTYKKworZmxvYXQzMngyX3Qgdm1vdl9uX2YzMihmbG9hdDMyX3QgdmFsdWUpOyAvLyBWRFVQLjMyIGQwLHIwCisjZGVmaW5lIHZtb3Zfbl9mMzIgdmR1cF9uX2YzMgorCit1aW50OHgxNl90IHZtb3ZxX25fdTgodWludDhfdCB2YWx1ZSk7IC8vIFZEVVAuOCBxMCxyMAorI2RlZmluZSB2bW92cV9uX3U4IHZkdXBxX25fdTgKKwordWludDE2eDhfdCB2bW92cV9uX3UxNih1aW50MTZfdCB2YWx1ZSk7IC8vIFZEVVAuMTYgcTAscjAKKyNkZWZpbmUgdm1vdnFfbl91MTYgdmR1cHFfbl9zMTYKKwordWludDMyeDRfdCB2bW92cV9uX3UzMih1aW50MzJfdCB2YWx1ZSk7IC8vIFZEVVAuMzIgcTAscjAKKyNkZWZpbmUgdm1vdnFfbl91MzIgdmR1cHFfbl91MzIKKworaW50OHgxNl90IHZtb3ZxX25fczgoaW50OF90IHZhbHVlKTsgLy8gVkRVUC44IHEwLHIwCisjZGVmaW5lIHZtb3ZxX25fczggdmR1cHFfbl9zOAorCitpbnQxNng4X3Qgdm1vdnFfbl9zMTYoaW50MTZfdCB2YWx1ZSk7IC8vIFZEVVAuMTYgcTAscjAKKyNkZWZpbmUgdm1vdnFfbl9zMTYgdmR1cHFfbl9zMTYKKworaW50MzJ4NF90IHZtb3ZxX25fczMyKGludDMyX3QgdmFsdWUpOyAvLyBWRFVQLjMyIHEwLHIwCisjZGVmaW5lIHZtb3ZxX25fczMyIHZkdXBxX25fczMyCisKK3BvbHk4eDE2X3Qgdm1vdnFfbl9wOChwb2x5OF90IHZhbHVlKTsgLy8gVkRVUC44IHEwLHIwCisjZGVmaW5lIHZtb3ZxX25fcDggdmR1cHFfbl91OAorCitwb2x5MTZ4OF90IHZtb3ZxX25fcDE2KHBvbHkxNl90IHZhbHVlKTsgLy8gVkRVUC4xNiBxMCxyMAorI2RlZmluZSB2bW92cV9uX3AxNiB2ZHVwcV9uX3MxNgorCitmbG9hdDMyeDRfdCB2bW92cV9uX2YzMihmbG9hdDMyX3QgdmFsdWUpOyAvLyBWRFVQLjMyIHEwLHIwCisjZGVmaW5lIHZtb3ZxX25fZjMyIHZkdXBxX25fZjMyCisKK2ludDY0eDFfdCB2bW92X25fczY0KGludDY0X3QgdmFsdWUpOyAvLyBWTU9WIGQwLHIwLHIwCisjZGVmaW5lIHZtb3Zfbl9zNjQgdmR1cF9uX3M2NAorCit1aW50NjR4MV90IHZtb3Zfbl91NjQodWludDY0X3QgdmFsdWUpOyAvLyBWTU9WIGQwLHIwLHIwCisjZGVmaW5lIHZtb3Zfbl91NjQgdmR1cF9uX3U2NAorCitpbnQ2NHgyX3Qgdm1vdnFfbl9zNjQoaW50NjRfdCB2YWx1ZSk7IC8vIFZNT1YgZDAscjAscjAKKyNkZWZpbmUgdm1vdnFfbl9zNjQgdmR1cHFfbl9zNjQKKwordWludDY0eDJfdCB2bW92cV9uX3U2NCh1aW50NjRfdCB2YWx1ZSk7IC8vIFZNT1YgZDAscjAscjAKKyNkZWZpbmUgdm1vdnFfbl91NjQgdmR1cHFfbl91NjQKKworLy8qKioqKioqKioqKioqKlNldCBhbGwgbGFuZXMgdG8gdGhlIHZhbHVlIG9mIG9uZSBsYW5lIG9mIGEgdmVjdG9yICoqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9oZXJlIHNodWZmbGUgaXMgYmV0dGVyIHNvbHV0aW9uIHRoYW4gbGFuZSBleHRyYWN0aW9uIGZvbGxvd2VkIGJ5IHNldDEgZnVuY3Rpb24KK3VpbnQ4eDhfdCB2ZHVwX2xhbmVfdTgodWludDh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWRFVQLjggZDAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZkdXBfbGFuZV91OCh1aW50OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSkKK3sKKyAgICB1aW50OHg4X3QgcmVzOworICAgIHVpbnQ4X3QgdmFsYW5lOworICAgIGludCBpID0gMDsKKyAgICB2YWxhbmUgPSB2ZWMubTY0X3U4W2xhbmVdOworICAgIGZvciAoaSA9IDA7IGk8ODsgaSsrKSB7CisgICAgICAgIHJlcy5tNjRfdThbaV0gPSB2YWxhbmU7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQxNng0X3QgdmR1cF9sYW5lX3UxNih1aW50MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWRFVQLjE2IGQwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3QgdmR1cF9sYW5lX3UxNih1aW50MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpCit7CisgICAgdWludDE2eDRfdCByZXM7CisgICAgdWludDE2X3QgdmFsYW5lOworICAgIHZhbGFuZSA9IHZlYy5tNjRfdTE2W2xhbmVdOworICAgIHJlcy5tNjRfdTE2WzBdID0gdmFsYW5lOworICAgIHJlcy5tNjRfdTE2WzFdID0gdmFsYW5lOworICAgIHJlcy5tNjRfdTE2WzJdID0gdmFsYW5lOworICAgIHJlcy5tNjRfdTE2WzNdID0gdmFsYW5lOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQzMngyX3QgdmR1cF9sYW5lX3UzMih1aW50MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWRFVQLjMyIGQwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdmR1cF9sYW5lX3UzMih1aW50MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpCit7CisgICAgdWludDMyeDJfdCByZXM7CisgICAgcmVzLm02NF91MzJbMF0gPSB2ZWMubTY0X3UzMltsYW5lXTsKKyAgICByZXMubTY0X3UzMlsxXSA9IHJlcy5tNjRfdTMyWzBdOworICAgIHJldHVybiByZXM7Cit9CisKK2ludDh4OF90IHZkdXBfbGFuZV9zOChpbnQ4eDhfdCB2ZWMsICBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZEVVAuOCBkMCxkMFswXQorI2RlZmluZSB2ZHVwX2xhbmVfczggdmR1cF9sYW5lX3U4CisKK2ludDE2eDRfdCB2ZHVwX2xhbmVfczE2KGludDE2eDRfdCB2ZWMsICBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbGFuZSk7IC8vIFZEVVAuMTYgZDAsZDBbMF0KKyNkZWZpbmUgdmR1cF9sYW5lX3MxNiB2ZHVwX2xhbmVfdTE2CisKK2ludDMyeDJfdCB2ZHVwX2xhbmVfczMyKGludDMyeDJfdCB2ZWMsICBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbGFuZSk7IC8vIFZEVVAuMzIgZDAsZDBbMF0KKyNkZWZpbmUgdmR1cF9sYW5lX3MzMiB2ZHVwX2xhbmVfdTMyCisKK3BvbHk4eDhfdCB2ZHVwX2xhbmVfcDgocG9seTh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWRFVQLjggZDAsZDBbMF0KKyNkZWZpbmUgdmR1cF9sYW5lX3A4IHZkdXBfbGFuZV91OAorCitwb2x5MTZ4NF90IHZkdXBfbGFuZV9wMTYocG9seTE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkRVUC4xNiBkMCxkMFswXQorI2RlZmluZSB2ZHVwX2xhbmVfcDE2IHZkdXBfbGFuZV9zMTYKKworZmxvYXQzMngyX3QgdmR1cF9sYW5lX2YzMihmbG9hdDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVkRVUC4zMiBkMCxkMFswXQorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2ZHVwX2xhbmVfZjMyKGZsb2F0MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpCit7CisgICAgZmxvYXQzMngyX3QgcmVzOworICAgIHJlcy5tNjRfZjMyWzBdID0gdmVjLm02NF9mMzJbbGFuZV07CisgICAgcmVzLm02NF9mMzJbMV0gPSByZXMubTY0X2YzMlswXTsKKyAgICByZXR1cm4gcmVzOworfQorCit1aW50OHgxNl90IHZkdXBxX2xhbmVfdTgodWludDh4OF90IHZlYywgX19jb25zdHJhbmdlKDAsNykgaW50IGxhbmUpOyAvLyBWRFVQLjggcTAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZfdCB2ZHVwcV9sYW5lX3U4KHVpbnQ4eDhfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDcpIGludCBsYW5lKSAvLyBWRFVQLjggcTAsZDBbMF0KK3sKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IGxhbmVtYXNrOFsxNl0gPSB7bGFuZSwgbGFuZSwgbGFuZSwgbGFuZSwgbGFuZSwgbGFuZSwgbGFuZSwgbGFuZSwgbGFuZSwgbGFuZSwgbGFuZSwgbGFuZSwgbGFuZSwgbGFuZSwgbGFuZSwgbGFuZX07CisgICAgcmV0dXJuIF9tbV9zaHVmZmxlX2VwaTggKF9wTTEyOGkodmVjKSwgKihfX20xMjhpKikgbGFuZW1hc2s4KTsKK30KKwordWludDE2eDhfdCB2ZHVwcV9sYW5lX3UxNih1aW50MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWRFVQLjE2IHEwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3QgdmR1cHFfbGFuZV91MTYodWludDE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKSAvLyBWRFVQLjE2IHEwLGQwWzBdCit7CisgICAgLy93ZSBjb3VsZCB1c2UgOGJpdCBzaHVmZmxlIGZvciAxNiBiaXQgYXMgd2VsbAorICAgIGNvbnN0IGludDhfdCBsYW5lMTYgPSAoKGludDhfdCkgbGFuZSkgPDwgMTsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IGxhbmVtYXNrX2UxNlsxNl0gPSB7bGFuZTE2LCBsYW5lMTYgKyAxLCBsYW5lMTYsIGxhbmUxNiArIDEsIGxhbmUxNiwgbGFuZTE2ICsgMSwgbGFuZTE2LCBsYW5lMTYgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZTE2LCBsYW5lMTYgKyAxLCBsYW5lMTYsIGxhbmUxNiArIDEsIGxhbmUxNiwgbGFuZTE2ICsgMSwgbGFuZTE2LCBsYW5lMTYgKyAxfTsKKyAgICByZXR1cm4gX21tX3NodWZmbGVfZXBpOCAoX3BNMTI4aSh2ZWMpLCAqKF9fbTEyOGkqKWxhbmVtYXNrX2UxNik7Cit9CisKK3VpbnQzMng0X3QgdmR1cHFfbGFuZV91MzIodWludDMyeDJfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsYW5lKTsgLy8gVkRVUC4zMiBxMCxkMFswXQorI2RlZmluZSB2ZHVwcV9sYW5lX3UzMih2ZWMsICBsYW5lKSBfbW1fc2h1ZmZsZV9lcGkzMiAoX3BNMTI4aSh2ZWMpLCAgbGFuZSB8IChsYW5lIDw8IDIpIHwgKGxhbmUgPDwgNCkgfCAobGFuZSA8PCA2KSkKKworaW50OHgxNl90IHZkdXBxX2xhbmVfczgoaW50OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZEVVAuOCBxMCxkMFswXQorI2RlZmluZSB2ZHVwcV9sYW5lX3M4IHZkdXBxX2xhbmVfdTgKKworaW50MTZ4OF90IHZkdXBxX2xhbmVfczE2KGludDE2eDRfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsYW5lKTsgLy8gVkRVUC4xNiBxMCxkMFswXQorI2RlZmluZSB2ZHVwcV9sYW5lX3MxNiB2ZHVwcV9sYW5lX3UxNgorCitpbnQzMng0X3QgdmR1cHFfbGFuZV9zMzIoaW50MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWRFVQLjMyIHEwLGQwWzBdCisjZGVmaW5lIHZkdXBxX2xhbmVfczMyIHZkdXBxX2xhbmVfdTMyCisKK3BvbHk4eDE2X3QgdmR1cHFfbGFuZV9wOChwb2x5OHg4X3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgbGFuZSk7IC8vIFZEVVAuOCBxMCxkMFswXQorI2RlZmluZSB2ZHVwcV9sYW5lX3A4IHZkdXBxX2xhbmVfdTgKKworcG9seTE2eDhfdCB2ZHVwcV9sYW5lX3AxNihwb2x5MTZ4NF90IHZlYywgX19jb25zdHJhbmdlKDAsMykgaW50IGxhbmUpOyAvLyBWRFVQLjE2IHEwLGQwWzBdCisjZGVmaW5lIHZkdXBxX2xhbmVfcDE2IHZkdXBxX2xhbmVfczE2CisKK2Zsb2F0MzJ4NF90IHZkdXBxX2xhbmVfZjMyKGZsb2F0MzJ4Ml90IHZlYywgX19jb25zdHJhbmdlKDAsMSkgaW50IGxhbmUpOyAvLyBWRFVQLjMyIHEwLGQwWzBdCisjZGVmaW5lICB2ZHVwcV9sYW5lX2YzMih2ZWMsIGxhbmUpICBfbW1fbG9hZDFfcHMoKHZlYy5tNjRfZjMyICsgbGFuZSkpCisKK2ludDY0eDFfdCB2ZHVwX2xhbmVfczY0KGludDY0eDFfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDApIGludCBsYW5lKTsgLy8gVk1PViBkMCxkMAorI2RlZmluZSB2ZHVwX2xhbmVfczY0KHZlYyxsYW5lKSB2ZWMKKwordWludDY0eDFfdCB2ZHVwX2xhbmVfdTY0KHVpbnQ2NHgxX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgbGFuZSk7IC8vIFZNT1YgZDAsZDAKKyNkZWZpbmUgdmR1cF9sYW5lX3U2NCh2ZWMsbGFuZSkgdmVjCisKK2ludDY0eDJfdCB2ZHVwcV9sYW5lX3M2NChpbnQ2NHgxX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgbGFuZSk7IC8vIFZNT1YgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4Ml90IHZkdXBxX2xhbmVfczY0KGludDY0eDFfdCB2ZWMsIF9fY29uc3RyYW5nZSgwLDApIGludCBsYW5lKQoreworICAgIF9fbTEyOGkgdmVjMTI4OworICAgIHZlYzEyOCA9IF9wTTEyOGkodmVjKTsKKyAgICByZXR1cm4gX21tX3VucGFja2xvX2VwaTY0KHZlYzEyOCx2ZWMxMjgpOworfQorCit1aW50NjR4Ml90IHZkdXBxX2xhbmVfdTY0KHVpbnQ2NHgxX3QgdmVjLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgbGFuZSk7IC8vIFZNT1YgcTAscTAKKyNkZWZpbmUgdmR1cHFfbGFuZV91NjQgdmR1cHFfbGFuZV9zNjQKKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vICoqKioqKioqKioqKioqKioqKioqICBDb21iaW5pbmcgdmVjdG9ycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vVGhlc2UgaW50cmluc2ljcyBqb2luIHR3byA2NCBiaXQgdmVjdG9ycyBpbnRvIGEgc2luZ2xlIDEyOGJpdCB2ZWN0b3IuCitpbnQ4eDE2X3QgICB2Y29tYmluZV9zOChpbnQ4eDhfdCBsb3csIGludDh4OF90IGhpZ2gpOyAvLyBWTU9WIGQwLGQwCisjZGVmaW5lIHZjb21iaW5lX3M4KGxvdywgaGlnaCkgICBfbW1fdW5wYWNrbG9fZXBpNjQgKF9wTTEyOGkobG93KSwgX3BNMTI4aShoaWdoKSApCisKK2ludDE2eDhfdCAgIHZjb21iaW5lX3MxNihpbnQxNng0X3QgbG93LCBpbnQxNng0X3QgaGlnaCk7IC8vIFZNT1YgZDAsZDAKKyNkZWZpbmUgdmNvbWJpbmVfczE2KGxvdywgaGlnaCkgICAgX21tX3VucGFja2xvX2VwaTY0IChfcE0xMjhpKGxvdyksIF9wTTEyOGkoaGlnaCkgKQorCitpbnQzMng0X3QgICB2Y29tYmluZV9zMzIoaW50MzJ4Ml90IGxvdywgaW50MzJ4Ml90IGhpZ2gpOyAvLyBWTU9WIGQwLGQwCisjZGVmaW5lIHZjb21iaW5lX3MzMihsb3csIGhpZ2gpICAgX21tX3VucGFja2xvX2VwaTY0IChfcE0xMjhpKGxvdyksIF9wTTEyOGkoaGlnaCkgKQorCitpbnQ2NHgyX3QgICB2Y29tYmluZV9zNjQoaW50NjR4MV90IGxvdywgaW50NjR4MV90IGhpZ2gpOyAvLyBWTU9WIGQwLGQwCisjZGVmaW5lIHZjb21iaW5lX3M2NChsb3csIGhpZ2gpICAgX21tX3VucGFja2xvX2VwaTY0IChfcE0xMjhpKGxvdyksIF9wTTEyOGkoaGlnaCkgKQorCitmbG9hdDE2eDhfdCB2Y29tYmluZV9mMTYoZmxvYXQxNng0X3QgbG93LCBmbG9hdDE2eDRfdCBoaWdoKTsgLy8gVk1PViBkMCxkMAorLy9jdXJyZW50IElBIFNJTUQgZG9lc24ndCBzdXBwb3J0IGZsb2F0MTYKKworZmxvYXQzMng0X3QgdmNvbWJpbmVfZjMyKGZsb2F0MzJ4Ml90IGxvdywgZmxvYXQzMngyX3QgaGlnaCk7IC8vIFZNT1YgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMng0X3QgdmNvbWJpbmVfZjMyKGZsb2F0MzJ4Ml90IGxvdywgZmxvYXQzMngyX3QgaGlnaCkKK3sKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSBfbW1fdW5wYWNrbG9fZXBpNjQoX3BNMTI4aShsb3cpLCBfcE0xMjhpKGhpZ2gpICk7CisgICAgcmV0dXJuIF9NMTI4KHJlcyk7Cit9CisKK3VpbnQ4eDE2X3QgICB2Y29tYmluZV91OCh1aW50OHg4X3QgbG93LCB1aW50OHg4X3QgaGlnaCk7IC8vIFZNT1YgZDAsZDAKKyNkZWZpbmUgdmNvbWJpbmVfdTggdmNvbWJpbmVfczgKKwordWludDE2eDhfdCAgIHZjb21iaW5lX3UxNih1aW50MTZ4NF90IGxvdywgdWludDE2eDRfdCBoaWdoKTsgLy8gVk1PViBkMCxkMAorI2RlZmluZSB2Y29tYmluZV91MTYgdmNvbWJpbmVfczE2CisKK3VpbnQzMng0X3QgICB2Y29tYmluZV91MzIodWludDMyeDJfdCBsb3csIHVpbnQzMngyX3QgaGlnaCk7IC8vIFZNT1YgZDAsZDAKKyNkZWZpbmUgdmNvbWJpbmVfdTMyIHZjb21iaW5lX3MzMgorCit1aW50NjR4Ml90ICAgdmNvbWJpbmVfdTY0KHVpbnQ2NHgxX3QgbG93LCB1aW50NjR4MV90IGhpZ2gpOyAvLyBWTU9WIGQwLGQwCisjZGVmaW5lIHZjb21iaW5lX3U2NCB2Y29tYmluZV9zNjQKKworcG9seTh4MTZfdCAgIHZjb21iaW5lX3A4KHBvbHk4eDhfdCBsb3csIHBvbHk4eDhfdCBoaWdoKTsgLy8gVk1PViBkMCxkMAorI2RlZmluZSB2Y29tYmluZV9wOCB2Y29tYmluZV91OAorCitwb2x5MTZ4OF90ICAgdmNvbWJpbmVfcDE2KHBvbHkxNng0X3QgbG93LCBwb2x5MTZ4NF90IGhpZ2gpOyAvLyBWTU9WIGQwLGQwCisjZGVmaW5lIHZjb21iaW5lX3AxNiB2Y29tYmluZV91MTYKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKiogU3BsaXR0aW5nIHZlY3RvcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqIEdldCBoaWdoIHBhcnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL1RoZXNlIGludHJpbnNpY3Mgc3BsaXQgYSAxMjggYml0IHZlY3RvciBpbnRvIDIgY29tcG9uZW50IDY0IGJpdCB2ZWN0b3JzCitpbnQ4eDhfdCB2Z2V0X2hpZ2hfczgoaW50OHgxNl90IGEpOyAvLyBWTU9WIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZnZXRfaGlnaF9zOChpbnQ4eDE2X3QgYSkKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSBfbW1fdW5wYWNraGlfZXBpNjQoYSxhKTsgLy9TU0UyCisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50MTZ4NF90IHZnZXRfaGlnaF9zMTYoaW50MTZ4OF90IGEpOyAvLyBWTU9WIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2Z2V0X2hpZ2hfczE2KGludDE2eDhfdCBhKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSAgX21tX3VucGFja2hpX2VwaTY0KGEsYSk7IC8vU1NFMgorICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDMyeDJfdCB2Z2V0X2hpZ2hfczMyKGludDMyeDRfdCBhKTsgLy8gVk1PViBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdmdldF9oaWdoX3MzMihpbnQzMng0X3QgYSkKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gIF9tbV91bnBhY2toaV9lcGk2NChhLGEpOyAvL1NTRTIKKyAgICByZXR1cm42NChyZXMpOworfQorCitpbnQ2NHgxX3QgdmdldF9oaWdoX3M2NChpbnQ2NHgyX3QgYSk7IC8vIFZNT1YgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4MV90IHZnZXRfaGlnaF9zNjQoaW50NjR4Ml90IGEpCit7CisgICAgaW50NjR4MV90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9ICBfbW1fdW5wYWNraGlfZXBpNjQoYSxhKTsgLy9TU0UyCisgICAgcmV0dXJuNjQocmVzKTsKK30KKworZmxvYXQxNng0X3QgdmdldF9oaWdoX2YxNihmbG9hdDE2eDhfdCBhKTsgLy8gVk1PViBkMCxkMAorLy8gSUEzMiBTSU1EIGRvZXNuJ3Qgd29yayB3aXRoIDE2Yml0IGZsb2F0cyBjdXJyZW50bHkKKworZmxvYXQzMngyX3QgdmdldF9oaWdoX2YzMihmbG9hdDMyeDRfdCBhKTsgLy8gVk1PViBkMCxkMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2Z2V0X2hpZ2hfZjMyKGZsb2F0MzJ4NF90IGEpCit7CisgICAgX19tMTI4aSByZXM7CisgICAgX19tNjRfMTI4IHJlczY0OworICAgIHJlcyA9IF9tbV91bnBhY2toaV9lcGk2NChfTTEyOGkoYSksX00xMjhpKGEpKTsKKyAgICByZXR1cm42NChyZXMpOworfQorCit1aW50OHg4X3QgdmdldF9oaWdoX3U4KHVpbnQ4eDE2X3QgYSk7IC8vIFZNT1YgZDAsZDAKKyNkZWZpbmUgdmdldF9oaWdoX3U4IHZnZXRfaGlnaF9zOAorCit1aW50MTZ4NF90IHZnZXRfaGlnaF91MTYodWludDE2eDhfdCBhKTsgLy8gVk1PViBkMCxkMAorI2RlZmluZSB2Z2V0X2hpZ2hfdTE2IHZnZXRfaGlnaF9zMTYKKwordWludDMyeDJfdCB2Z2V0X2hpZ2hfdTMyKHVpbnQzMng0X3QgYSk7IC8vIFZNT1YgZDAsZDAKKyNkZWZpbmUgdmdldF9oaWdoX3UzMiB2Z2V0X2hpZ2hfczMyCisKK3VpbnQ2NHgxX3QgdmdldF9oaWdoX3U2NCh1aW50NjR4Ml90IGEpOyAvLyBWTU9WIGQwLGQwCisjZGVmaW5lIHZnZXRfaGlnaF91NjQgdmdldF9oaWdoX3M2NAorCitwb2x5OHg4X3QgdmdldF9oaWdoX3A4KHBvbHk4eDE2X3QgYSk7IC8vIFZNT1YgZDAsZDAKKyNkZWZpbmUgdmdldF9oaWdoX3A4IHZnZXRfaGlnaF91OAorCitwb2x5MTZ4NF90IHZnZXRfaGlnaF9wMTYocG9seTE2eDhfdCBhKTsgLy8gVk1PViBkMCxkMAorI2RlZmluZSB2Z2V0X2hpZ2hfcDE2IHZnZXRfaGlnaF91MTYKKworLy8qKioqKioqKioqKioqKioqKioqKioqIEdldCBsb3cgcGFydCAqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZnZXRfbG93X3M4KGludDh4MTZfdCBhKTsgLy8gVk1PViBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2Z2V0X2xvd19zOChpbnQ4eDE2X3QgYSkgLy8gVk1PViBkMCxkMAoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NChhKTsKK30KKworaW50MTZ4NF90IHZnZXRfbG93X3MxNihpbnQxNng4X3QgYSk7IC8vIFZNT1YgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZnZXRfbG93X3MxNihpbnQxNng4X3QgYSkgLy8gVk1PViBkMCxkMAoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NChhKTsKK30KKworaW50MzJ4Ml90IHZnZXRfbG93X3MzMihpbnQzMng0X3QgYSk7IC8vIFZNT1YgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZnZXRfbG93X3MzMihpbnQzMng0X3QgYSkgLy8gVk1PViBkMCxkMAoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NChhKTsKK30KKworaW50NjR4MV90IHZnZXRfbG93X3M2NChpbnQ2NHgyX3QgYSk7IC8vIFZNT1YgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4MV90IHZnZXRfbG93X3M2NChpbnQ2NHgyX3QgYSkgLy8gVk1PViBkMCxkMAoreworICAgIGludDY0eDFfdCByZXM2NDsKKyAgICByZXR1cm42NCAoYSk7Cit9CisKK2Zsb2F0MTZ4NF90IHZnZXRfbG93X2YxNihmbG9hdDE2eDhfdCBhKTsgLy8gVk1PViBkMCxkMAorLy8gSUEzMiBTSU1EIGRvZXNuJ3Qgd29yayB3aXRoIDE2Yml0IGZsb2F0cyBjdXJyZW50bHkKKworZmxvYXQzMngyX3QgdmdldF9sb3dfZjMyKGZsb2F0MzJ4NF90IGEpOyAvLyBWTU9WIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZnZXRfbG93X2YzMihmbG9hdDMyeDRfdCBhKQoreworICAgIGZsb2F0MzJ4Ml90IHJlczY0OworICAgIF9NNjRmKHJlczY0LCBhKTsKKyAgICByZXR1cm4gcmVzNjQ7Cit9CisKK3VpbnQ4eDhfdCB2Z2V0X2xvd191OCh1aW50OHgxNl90IGEpOyAvLyBWTU9WIGQwLGQwCisjZGVmaW5lIHZnZXRfbG93X3U4IHZnZXRfbG93X3M4CisKK3VpbnQxNng0X3QgdmdldF9sb3dfdTE2KHVpbnQxNng4X3QgYSk7IC8vIFZNT1YgZDAsZDAKKyNkZWZpbmUgdmdldF9sb3dfdTE2IHZnZXRfbG93X3MxNgorCit1aW50MzJ4Ml90IHZnZXRfbG93X3UzMih1aW50MzJ4NF90IGEpOyAvLyBWTU9WIGQwLGQwCisjZGVmaW5lIHZnZXRfbG93X3UzMiB2Z2V0X2xvd19zMzIKKwordWludDY0eDFfdCB2Z2V0X2xvd191NjQodWludDY0eDJfdCBhKTsgLy8gVk1PViBkMCxkMAorI2RlZmluZSB2Z2V0X2xvd191NjQgdmdldF9sb3dfczY0CisKK3BvbHk4eDhfdCB2Z2V0X2xvd19wOChwb2x5OHgxNl90IGEpOyAvLyBWTU9WIGQwLGQwCisjZGVmaW5lIHZnZXRfbG93X3A4IHZnZXRfbG93X3U4CisKK3BvbHkxNng0X3QgdmdldF9sb3dfcDE2KHBvbHkxNng4X3QgYSk7IC8vIFZNT1YgZDAsZDAKKyNkZWZpbmUgdmdldF9sb3dfcDE2IHZnZXRfbG93X3MxNgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKiBDb252ZXJ0aW5nIHZlY3RvcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqIENvbnZlcnQgZnJvbSBmbG9hdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIG5lZWQgdG8gc2V0IF9NTV9TRVRfUk9VTkRJTkdfTU9ERSAoIHgpIGFjY29yZGluZ2x5CitpbnQzMngyX3QgICB2Y3Z0X3MzMl9mMzIoZmxvYXQzMngyX3QgYSk7IC8vIFZDVlQuUzMyLkYzMiBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90ICAgdmN2dF9zMzJfZjMyKGZsb2F0MzJ4Ml90IGEpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9ICBfbW1fY3Z0dHBzX2VwaTMyKF9wTTEyOChhKSk7IC8vdXNlIGxvdyA2NCBiaXRzIG9mIHJlc3VsdCBvbmx5CisgICAgcmV0dXJuNjQocmVzKTsKK30KKwordWludDMyeDJfdCB2Y3Z0X3UzMl9mMzIoZmxvYXQzMngyX3QgYSk7IC8vIFZDVlQuVTMyLkYzMiBkMCwgZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2Y3Z0X3UzMl9mMzIoZmxvYXQzMngyX3QgYSkKK3sKKyAgICAvL21heSBiZSBub3QgZWZmZWN0aXZlIGNvbXBhcmVkIHdpdGggYSBzZXJpYWwgU0lNRCBzb2x1dGlvbgorICAgIHVpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdmN2dHFfdTMyX2YzMihfcE0xMjgoYSkpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDMyeDRfdCAgIHZjdnRxX3MzMl9mMzIoZmxvYXQzMng0X3QgYSk7IC8vIFZDVlQuUzMyLkYzMiBxMCwgcTAKKyNkZWZpbmUgdmN2dHFfczMyX2YzMiBfbW1fY3Z0dHBzX2VwaTMyCisKK3VpbnQzMng0X3QgdmN2dHFfdTMyX2YzMihmbG9hdDMyeDRfdCBhKTsgLy8gVkNWVC5VMzIuRjMyIHEwLCBxMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZjdnRxX3UzMl9mMzIoZmxvYXQzMng0X3QgYSkgLy8gVkNWVC5VMzIuRjMyIHEwLCBxMAoreworICAgIC8vTm8gc2luZ2xlIGluc3RydWN0aW9uIFNTRSBzb2x1dGlvbiAgYnV0IHdlIGNvdWxkIGltcGxlbWVudCBpdCBhcyBmb2xsb3dpbmc6CisgICAgX19tMTI4aSByZXNpOworICAgIF9fbTEyOCB6ZXJvLCAgbWFzaywgYV9wb3MsIG1hc2tfZl9tYXhfc2ksIHJlczsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50MzJfdCBjN2ZmZmZmZmZbNF0gPSB7MHg3ZmZmZmZmZiwgMHg3ZmZmZmZmZiwgMHg3ZmZmZmZmZiwgMHg3ZmZmZmZmZn07CisgICAgemVybyA9IF9tbV9zZXR6ZXJvX3BzKCk7CisgICAgbWFzayA9IF9tbV9jbXBndF9wcyhhLCB6ZXJvKTsKKyAgICBhX3BvcyA9IF9tbV9hbmRfcHMoYSwgbWFzayk7CisgICAgbWFza19mX21heF9zaSA9IF9tbV9jbXBndF9wcyhhX3BvcywqKF9fbTEyOCopYzdmZmZmZmZmKTsKKyAgICByZXMgPSAgX21tX3N1Yl9wcyhhX3BvcywgbWFza19mX21heF9zaSk7IC8vaWYgdGhlIGlucHV0IGZpdHMgdG8gc2lnbmVkIHdlIGRvbid0IHN1YnRyYWN0IGFueXRoaW5nCisgICAgcmVzaSA9IF9tbV9jdnR0cHNfZXBpMzIocmVzKTsKKyAgICByZXR1cm4gX21tX2FkZF9lcGkzMihyZXNpLCAqKF9fbTEyOGkqKSZtYXNrX2ZfbWF4X3NpKTsKK30KKworLy8gKioqKiogQ29udmVydCB0byB0aGUgZml4ZWQgcG9pbnQgIHdpdGggICB0aGUgbnVtYmVyIG9mIGZyYWN0aW9uIGJpdHMgc3BlY2lmaWVkIGJ5IGIgKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50MzJ4Ml90IHZjdnRfbl9zMzJfZjMyKGZsb2F0MzJ4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZDVlQuUzMyLkYzMiBkMCwgZDAsICMzMgorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdmN2dF9uX3MzMl9mMzIoZmxvYXQzMngyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICByZXR1cm42NCh2Y3Z0cV9uX3MzMl9mMzIoX3BNMTI4KGEpLGIpKTsKK30KKwordWludDMyeDJfdCB2Y3Z0X25fdTMyX2YzMihmbG9hdDMyeDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWQ1ZULlUzMi5GMzIgZDAsIGQwLCAjMzIKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2Y3Z0X25fdTMyX2YzMihmbG9hdDMyeDJfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpCit7CisgICAgdWludDMyeDJfdCByZXM7CisgICAgZmxvYXQgY29udmNvbnN0OworICAgIGNvbnZjb25zdCA9IChmbG9hdCkoKHVpbnQzMl90KTEgPDwgYik7CisgICAgcmVzLm02NF91MzJbMF0gPSAodWludDMyX3QpIChhLm02NF9mMzJbMF0gKiBjb252Y29uc3QpOworICAgIHJlcy5tNjRfdTMyWzFdID0gKHVpbnQzMl90KSAoYS5tNjRfZjMyWzFdICogY29udmNvbnN0KTsKKyAgICByZXR1cm4gcmVzOworfQorCitpbnQzMng0X3QgdmN2dHFfbl9zMzJfZjMyKGZsb2F0MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZDVlQuUzMyLkYzMiBxMCwgcTAsICMzMgorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdmN2dHFfbl9zMzJfZjMyKGZsb2F0MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYikKK3sKKyAgICBmbG9hdCBjb252Y29uc3Q7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQzMl90IGNtYXNrW10gPSB7MHg4MDAwMDAwMCwgMHg4MDAwMDAwMCwgMHg4MDAwMDAwMCwgMHg4MDAwMDAwMH07CisgICAgX19tMTI4IGNjb25zdDEyODsKKyAgICBfX20xMjhpIG1hc2ssIHJlczsKKyAgICBjb252Y29uc3QgPSAoZmxvYXQpKDEgPDwgYik7CisgICAgY2NvbnN0MTI4ID0gdmR1cHFfbl9mMzIoY29udmNvbnN0KTsKKyAgICByZXMgPSAgX21tX2N2dHRwc19lcGkzMihfbW1fbXVsX3BzKGEsY2NvbnN0MTI4KSk7CisgICAgbWFzayA9IF9tbV9jbXBlcV9lcGkzMiAocmVzLCAqKF9fbTEyOGkqKWNtYXNrKTsKKyAgICByZXR1cm4gX21tX3hvcl9zaTEyOCAocmVzLCAgbWFzayk7IC8vcmVzIHNhdHVyYXRlZCBmb3IgMHg4MDAwMDAwMAorfQorCit1aW50MzJ4NF90IHZjdnRxX25fdTMyX2YzMihmbG9hdDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWQ1ZULlUzMi5GMzIgcTAsIHEwLCAjMzIKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2Y3Z0cV9uX3UzMl9mMzIoZmxvYXQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKQoreworICAgIGZsb2F0IGNvbnZjb25zdDsKKyAgICBfX20xMjggY2NvbnN0MTI4OworICAgIGNvbnZjb25zdCA9IChmbG9hdCkoMSA8PCBiKTsKKyAgICBjY29uc3QxMjggPSB2ZHVwcV9uX2YzMihjb252Y29uc3QpOworICAgIHJldHVybiB2Y3Z0cV91MzJfZjMyKF9tbV9tdWxfcHMoYSxjY29uc3QxMjgpKTsKK30KKworLy8qKioqKioqKioqKioqKioqKiBDb252ZXJ0IHRvIGZsb2F0ICoqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZmxvYXQzMngyX3QgdmN2dF9mMzJfczMyKGludDMyeDJfdCBhKTsgLy8gVkNWVC5GMzIuUzMyIGQwLCBkMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2Y3Z0X2YzMl9zMzIoaW50MzJ4Ml90IGEpIC8vdXNlIGxvdyA2NCBiaXRzCit7CisgICAgZmxvYXQzMngyX3QgcmVzOworICAgIHJlcy5tNjRfZjMyWzBdID0gKGZsb2F0KSBhLm02NF9pMzJbMF07CisgICAgcmVzLm02NF9mMzJbMV0gPSAoZmxvYXQpIGEubTY0X2kzMlsxXTsKKyAgICByZXR1cm4gcmVzOworfQorCitmbG9hdDMyeDJfdCB2Y3Z0X2YzMl91MzIodWludDMyeDJfdCBhKTsgLy8gVkNWVC5GMzIuVTMyIGQwLCBkMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2Y3Z0X2YzMl91MzIodWludDMyeDJfdCBhKQoreworICAgIGZsb2F0MzJ4Ml90IHJlczsKKyAgICByZXMubTY0X2YzMlswXSA9IChmbG9hdCkgYS5tNjRfdTMyWzBdOworICAgIHJlcy5tNjRfZjMyWzFdID0gKGZsb2F0KSBhLm02NF91MzJbMV07CisgICAgcmV0dXJuIHJlczsKK30KKworZmxvYXQzMng0X3QgdmN2dHFfZjMyX3MzMihpbnQzMng0X3QgYSk7IC8vIFZDVlQuRjMyLlMzMiBxMCwgcTAKKyNkZWZpbmUgdmN2dHFfZjMyX3MzMihhKSBfbW1fY3Z0ZXBpMzJfcHMoYSkKKworZmxvYXQzMng0X3QgdmN2dHFfZjMyX3UzMih1aW50MzJ4NF90IGEpOyAvLyBWQ1ZULkYzMi5VMzIgcTAsIHEwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4NF90IHZjdnRxX2YzMl91MzIodWludDMyeDRfdCBhKSAvLyBWQ1ZULkYzMi5VMzIgcTAsIHEwCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwKKyAgICBfX20xMjggdHdvMTYsIGZIaSwgZkxvOworICAgIF9fbTEyOGkgaGksIGxvOworICAgIHR3bzE2ID0gX21tX3NldDFfcHMoKGZsb2F0KTB4MTAwMDApOyAvLzJeMTYKKyAgICAvLyBBdm9pZCBkb3VibGUgcm91bmRpbmcgYnkgZG9pbmcgdHdvIGV4YWN0IGNvbnZlcnNpb25zCisgICAgLy8gb2YgaGlnaCBhbmQgbG93IDE2LWJpdCBzZWdtZW50cworICAgIGhpID0gX21tX3NybGlfZXBpMzIoYSwgMTYpOworICAgIGxvID0gX21tX3NybGlfZXBpMzIoX21tX3NsbGlfZXBpMzIoYSwgMTYpLCAxNik7CisgICAgZkhpID0gX21tX211bF9wcyhfbW1fY3Z0ZXBpMzJfcHMoaGkpLCB0d28xNik7CisgICAgZkxvID0gX21tX2N2dGVwaTMyX3BzKGxvKTsKKyAgICAvLyBkbyBzaW5nbGUgcm91bmRpbmcgYWNjb3JkaW5nIHRvIGN1cnJlbnQgcm91bmRpbmcgbW9kZQorICAgIHJldHVybiBfbW1fYWRkX3BzKGZIaSwgZkxvKTsKK30KKworLy8gKioqKiogQ29udmVydCB0byB0aGUgZmxvYXQgZnJvbSBmaXhlZCBwb2ludCAgd2l0aCAgIHRoZSBudW1iZXIgb2YgZnJhY3Rpb24gYml0cyBzcGVjaWZpZWQgYnkgYiAqKioqKioqKioqKgorZmxvYXQzMngyX3QgdmN2dF9uX2YzMl9zMzIoaW50MzJ4Ml90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZDVlQuRjMyLlMzMiBkMCwgZDAsICMzMgorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2Y3Z0X25fZjMyX3MzMihpbnQzMngyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKQoreworICAgIGZsb2F0MzJ4Ml90IHJlczsKKyAgICBmbG9hdCBjb252Y29uc3Q7CisgICAgY29udmNvbnN0ID0gKGZsb2F0KSgxLiAvICgodWludDMyX3QpMSA8PCBiKSk7CisgICAgcmVzLm02NF9mMzJbMF0gPSAgYS5tNjRfaTMyWzBdICogY29udmNvbnN0OworICAgIHJlcy5tNjRfZjMyWzFdID0gYS5tNjRfaTMyWzFdICogY29udmNvbnN0OworICAgIHJldHVybiByZXM7Cit9CisKK2Zsb2F0MzJ4Ml90IHZjdnRfbl9mMzJfdTMyKHVpbnQzMngyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKTsgLy8gVkNWVC5GMzIuVTMyIGQwLCBkMCwgIzMyCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZjdnRfbl9mMzJfdTMyKHVpbnQzMngyX3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKSAvLyBWQ1ZULkYzMi5VMzIgZDAsIGQwLCAjMzIKK3sKKyAgICBmbG9hdDMyeDJfdCByZXM7CisgICAgZmxvYXQgY29udmNvbnN0OworICAgIGNvbnZjb25zdCA9IChmbG9hdCkoMS4gLyAoKHVpbnQzMl90KTEgPDwgYikpOworICAgIHJlcy5tNjRfZjMyWzBdID0gIGEubTY0X3UzMlswXSAqIGNvbnZjb25zdDsKKyAgICByZXMubTY0X2YzMlsxXSA9IGEubTY0X3UzMlsxXSAqIGNvbnZjb25zdDsKKyAgICByZXR1cm4gcmVzOworfQorCitmbG9hdDMyeDRfdCB2Y3Z0cV9uX2YzMl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYik7IC8vIFZDVlQuRjMyLlMzMiBxMCwgcTAsICMzMgorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDRfdCB2Y3Z0cV9uX2YzMl9zMzIoaW50MzJ4NF90IGEsIF9fY29uc3RyYW5nZSgxLDMyKSBpbnQgYikKK3sKKyAgICBmbG9hdCBjb252Y29uc3Q7CisgICAgX19tMTI4IGNjb25zdDEyOCwgYWY7CisgICAgY29udmNvbnN0ID0gKGZsb2F0KSgxLiAvICgodWludDMyX3QpMSA8PCBiKSk7CisgICAgYWYgPSBfbW1fY3Z0ZXBpMzJfcHMoYSk7CisgICAgY2NvbnN0MTI4ID0gdmR1cHFfbl9mMzIoY29udmNvbnN0KTsKKyAgICByZXR1cm4gX21tX211bF9wcyhhZixjY29uc3QxMjgpOworfQorCitmbG9hdDMyeDRfdCB2Y3Z0cV9uX2YzMl91MzIodWludDMyeDRfdCBhLCBfX2NvbnN0cmFuZ2UoMSwzMikgaW50IGIpOyAvLyBWQ1ZULkYzMi5VMzIgcTAsIHEwLCAjMzIKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMng0X3QgdmN2dHFfbl9mMzJfdTMyKHVpbnQzMng0X3QgYSwgX19jb25zdHJhbmdlKDEsMzIpIGludCBiKQoreworICAgIGZsb2F0IGNvbnZjb25zdDsKKyAgICBfX20xMjggY2NvbnN0MTI4LCBhZjsKKyAgICBjb252Y29uc3QgPSAoZmxvYXQpKDEuIC8gKDEgPDwgYikpOworICAgIGFmID0gdmN2dHFfZjMyX3UzMihhKTsKKyAgICBjY29uc3QxMjggPSB2ZHVwcV9uX2YzMihjb252Y29uc3QpOworICAgIHJldHVybiBfbW1fbXVsX3BzKGFmLGNjb25zdDEyOCk7Cit9CisKKy8vKioqKioqKioqKioqKipDb252ZXJ0IGJldHdlZW4gZmxvYXRzICoqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZmxvYXQxNng0X3QgdmN2dF9mMTZfZjMyKGZsb2F0MzJ4NF90IGEpOyAvLyBWQ1ZULkYxNi5GMzIgZDAsIHEwCisvL0ludGVsIFNJTUQgZG9lc24ndCBzdXBwb3J0IDE2Yml0cyBmbG9hdHMgY3VyZW50bHkKKworZmxvYXQzMng0X3QgdmN2dF9mMzJfZjE2KGZsb2F0MTZ4NF90IGEpOyAvLyBWQ1ZULkYzMi5GMTYgcTAsIGQwCisvL0ludGVsIFNJTUQgZG9lc24ndCBzdXBwb3J0IDE2Yml0cyBmbG9hdHMgY3VyZW50bHksIHRoZSBvbmx5IHNvbHV0aW9uIGlzIHRvIHN0b3JlIDE2Yml0IGZsb2F0cyBhbmQgbG9hZCBhcyAzMiBiaXRzCisKKy8vKioqKioqKioqKioqVmVjdG9yIG5hcnJvdyBpbnRlZ2VyIGNvbnZlcnNpb24gKHRydW5jYXRpb24pICoqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQ4eDhfdCB2bW92bl9zMTYoaW50MTZ4OF90IGEpOyAvLyBWTU9WTi5JMTYgZDAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3Qgdm1vdm5fczE2KGludDE2eDhfdCBhKSAvLyBWTU9WTi5JMTYgZDAscTAKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s4XzE2X2V2ZW5fb2RkWzE2XSA9IHsgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMSwgMywgNSwgNywgOSwgMTEsIDEzLCAxNSB9OworICAgIHJlcyA9IF9tbV9zaHVmZmxlX2VwaTggKGEsICooX19tMTI4aSopIG1hc2s4XzE2X2V2ZW5fb2RkKTsgLy91c2UgNjQgbG93IGJpdHMgb25seQorICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDE2eDRfdCB2bW92bl9zMzIoaW50MzJ4NF90IGEpOyAvLyBWTU9WTi5JMzIgZDAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZtb3ZuX3MzMihpbnQzMng0X3QgYSkgLy8gVk1PVk4uSTMyIGQwLHEwCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazhfMzJfZXZlbl9vZGRbMTZdID0geyAwLDEsIDQsNSwgOCw5LCAgMTIsMTMsICAyLDMsIDYsNywxMCwxMSwxNCwxNX07CisgICAgcmVzID0gX21tX3NodWZmbGVfZXBpOCAoYSwgKihfX20xMjhpKikgbWFzazhfMzJfZXZlbl9vZGQpOyAvL3VzZSA2NCBsb3cgYml0cyBvbmx5CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50MzJ4Ml90IHZtb3ZuX3M2NChpbnQ2NHgyX3QgYSk7IC8vIFZNT1ZOLkk2NCBkMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3Qgdm1vdm5fczY0KGludDY0eDJfdCBhKQoreworICAgIC8vbWF5IGJlIG5vdCBlZmZlY3RpdmUgY29tcGFyZWQgd2l0aCBhIHNlcmlhbCBpbXBsZW1lbnRhdGlvbgorICAgIGludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSBfbW1fc2h1ZmZsZV9lcGkzMiAoYSwgMCB8ICgyIDw8IDIpIHwgKDEgPDwgNCkgfCAoMyA8PCA2KSk7IC8vdXNlIDY0IGxvdyBiaXRzIG9ubHksIF9NTV9TSFVGRkxFKDMsIDEsIDIsIDApCisgICAgcmV0dXJuNjQocmVzKTsKK30KKwordWludDh4OF90IHZtb3ZuX3UxNih1aW50MTZ4OF90IGEpOyAvLyBWTU9WTi5JMTYgZDAscTAKKyNkZWZpbmUgdm1vdm5fdTE2IHZtb3ZuX3MxNgorCit1aW50MTZ4NF90IHZtb3ZuX3UzMih1aW50MzJ4NF90IGEpOyAvLyBWTU9WTi5JMzIgZDAscTAKKyNkZWZpbmUgdm1vdm5fdTMyIHZtb3ZuX3MzMgorCit1aW50MzJ4Ml90IHZtb3ZuX3U2NCh1aW50NjR4Ml90IGEpOyAvLyBWTU9WTi5JNjQgZDAscTAKKyNkZWZpbmUgdm1vdm5fdTY0IHZtb3ZuX3M2NAorCisvLyoqKioqKioqKioqKioqKiogVmVjdG9yIGxvbmcgbW92ZSAgICoqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQxNng4X3Qgdm1vdmxfczgoaW50OHg4X3QgYSk7IC8vIFZNT1ZMLlM4IHEwLGQwCisjZGVmaW5lIHZtb3ZsX3M4KGEpIF9NTV9DVlRFUEk4X0VQSTE2KF9wTTEyOGkoYSkpIC8vU1NFNC4xCisKK2ludDMyeDRfdCB2bW92bF9zMTYoaW50MTZ4NF90IGEpOyAvLyBWTU9WTC5TMTYgcTAsZDAKKyNkZWZpbmUgdm1vdmxfczE2KGEpIF9NTV9DVlRFUEkxNl9FUEkzMihfcE0xMjhpKGEpKSAvL1NTRTQuMQorCitpbnQ2NHgyX3Qgdm1vdmxfczMyKGludDMyeDJfdCBhKTsgLy8gVk1PVkwuUzMyIHEwLGQwCisjZGVmaW5lIHZtb3ZsX3MzMihhKSAgX01NX0NWVEVQSTMyX0VQSTY0KF9wTTEyOGkoYSkpIC8vU1NFNC4xCisKK3VpbnQxNng4X3Qgdm1vdmxfdTgodWludDh4OF90IGEpOyAvLyBWTU9WTC5VOCBxMCxkMAorI2RlZmluZSB2bW92bF91OChhKSBfTU1fQ1ZURVBVOF9FUEkxNihfcE0xMjhpKGEpKSAvL1NTRTQuMQorCit1aW50MzJ4NF90IHZtb3ZsX3UxNih1aW50MTZ4NF90IGEpOyAvLyBWTU9WTC5zMTYgcTAsZDAKKyNkZWZpbmUgdm1vdmxfdTE2KGEpIF9NTV9DVlRFUFUxNl9FUEkzMihfcE0xMjhpKGEpKSAvL1NTRTQuMQorCit1aW50NjR4Ml90IHZtb3ZsX3UzMih1aW50MzJ4Ml90IGEpOyAvLyBWTU9WTC5VMzIgcTAsZDAKKyNkZWZpbmUgdm1vdmxfdTMyKGEpICBfTU1fQ1ZURVBVMzJfRVBJNjQoX3BNMTI4aShhKSkgLy9TU0U0LjEKKworLy8qKioqKioqKioqKioqVmVjdG9yIHNhdHVyYXRpbmcgbmFycm93IGludGVnZXIqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgICB2cW1vdm5fczE2KGludDE2eDhfdCBhKTsgLy8gVlFNT1ZOLlMxNiBkMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCAgIHZxbW92bl9zMTYoaW50MTZ4OF90IGEpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gX21tX3BhY2tzX2VwaTE2KGEsIGEpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDE2eDRfdCAgIHZxbW92bl9zMzIoaW50MzJ4NF90IGEpOyAvLyBWUU1PVk4uUzMyIGQwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCAgIHZxbW92bl9zMzIoaW50MzJ4NF90IGEpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IF9tbV9wYWNrc19lcGkzMihhLCBhKTsKKyAgICByZXR1cm42NChyZXMpOworfQorCitpbnQzMngyX3QgdnFtb3ZuX3M2NChpbnQ2NHgyX3QgYSk7IC8vIFZRTU9WTi5TNjQgZDAscTAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MzJ4Ml90IHZxbW92bl9zNjQoaW50NjR4Ml90IGEpLF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpIC8vbm8gZWZmZWN0aXZlIFNJTUQgc29sdXRpb24KK3sKKyAgICBpbnQzMngyX3QgcmVzOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ2NF90IGF0bXBbMl07CisgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilhdG1wLCBhKTsKKyAgICBpZihhdG1wWzBdPlNJTlRfTUFYKSBhdG1wWzBdID0gU0lOVF9NQVg7CisgICAgaWYoYXRtcFswXTxTSU5UX01JTikgYXRtcFswXSA9IFNJTlRfTUlOOworICAgIGlmKGF0bXBbMV0+U0lOVF9NQVgpIGF0bXBbMV0gPSBTSU5UX01BWDsKKyAgICBpZihhdG1wWzFdPFNJTlRfTUlOKSBhdG1wWzFdID0gU0lOVF9NSU47CisgICAgcmVzLm02NF9pMzJbMF0gPSAoaW50MzJfdClhdG1wWzBdOworICAgIHJlcy5tNjRfaTMyWzFdID0gKGludDMyX3QpYXRtcFsxXTsKKyAgICByZXR1cm4gcmVzOworfQorCit1aW50OHg4X3QgdnFtb3ZuX3UxNih1aW50MTZ4OF90IGEpOyAvLyBWUU1PVk4uczE2IGQwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2cW1vdm5fdTE2KHVpbnQxNng4X3QgYSkgLy8gVlFNT1ZOLnMxNiBkMCxxMAoreworICAgIC8vbm8gdWludDE2IHRvIHVpbnQ4IGNvbnZlcnNpb24gaW4gU1NFLCBuZWVkIHRydW5jYXRlIHRvIG1heCBzaWduZWQgZmlyc3QKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBjN2ZmZiwgYV90cnVuYzsKKyAgICBjN2ZmZiA9IF9tbV9zZXQxX2VwaTE2ICgweDdmZmYpOyAvLyAxNS10aCBiaXQgc2V0IHRvIHplcm8KKyAgICBhX3RydW5jID0gIF9tbV9hbmRfc2kxMjgoYSwgIGM3ZmZmKTsgLy8gYSB0cnVuY2F0ZWQgdG8gbWF4IHNpZ25lZAorICAgIGFfdHJ1bmMgPSAgX21tX3BhY2t1c19lcGkxNiAoYV90cnVuYywgYV90cnVuYyk7IC8vdXNlIGxvdyA2NGJpdHMgb25seQorICAgIHJldHVybjY0KGFfdHJ1bmMpOworfQorCit1aW50MTZ4NF90IHZxbW92bl91MzIodWludDMyeDRfdCBhKTsgLy8gVlFNT1ZOLlUzMiBkMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZxbW92bl91MzIodWludDMyeDRfdCBhKSAvLyBWUU1PVk4uVTMyIGQwLHEwCit7CisgICAgLy9ubyB1aW50MzIgdG8gdWludDE2IGNvbnZlcnNpb24gaW4gU1NFLCBuZWVkIHRydW5jYXRlIHRvIG1heCBzaWduZWQgZmlyc3QKKyAgICB1aW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgYzdmZmZmZmZmLCBhX3RydW5jOworICAgIGM3ZmZmZmZmZiA9IF9tbV9zZXQxX2VwaTMyKCh1aW50MzJfdCkweDdmZmZmZmZmKTsgLy8gMzEtdGggYml0IHNldCB0byB6ZXJvCisgICAgYV90cnVuYyA9ICBfbW1fYW5kX3NpMTI4KGEsICBjN2ZmZmZmZmYpOyAvLyBhIHRydW5jYXRlZCB0byBtYXggc2lnbmVkCisgICAgYV90cnVuYyA9IF9NTV9QQUNLVVMxX0VQSTMyIChhX3RydW5jKTsgLy91c2UgbG93IDY0Yml0cyBvbmx5CisgICAgcmV0dXJuNjQoYV90cnVuYyk7Cit9CisKK3VpbnQzMngyX3QgdnFtb3ZuX3U2NCh1aW50NjR4Ml90IGEpOyAvLyBWUU1PVk4uVTY0IGQwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3QgdnFtb3ZuX3U2NCh1aW50NjR4Ml90IGEpCit7CisgICAgLy9zZXJpYWwgc29sdXRpb24gbWF5IGJlIGZhc3RlcgorICAgIHVpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXNfaGksIG1hc2s7CisgICAgbWFzayA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgcmVzX2hpID0gX21tX3NybGlfZXBpNjQoYSwgMzIpOworICAgIHJlc19oaSA9IF9tbV9jbXBlcV9lcGkzMihyZXNfaGksIG1hc2spOworICAgIG1hc2sgPSBfbW1fY21wZXFfZXBpMzIobWFzayxtYXNrKTsgLy9hbGwgZmZmCisgICAgbWFzayA9IF9tbV9hbmRub3Rfc2kxMjgocmVzX2hpLG1hc2spOyAvL2ludmVyc3QgcmVzX2hpIHRvIGdldCA+MzIgYml0cyBudW1iZXJzCisgICAgcmVzX2hpID0gX21tX29yX3NpMTI4KGEsIG1hc2spOworICAgIHJlc19oaSA9IF9tbV9zaHVmZmxlX2VwaTMyKHJlc19oaSwgMCB8ICgyIDw8IDIpIHwgKDEgPDwgNCkgfCAoMyA8PCA2KSk7IC8vc2h1ZmZsZSB0aGUgZGF0YSB0byBnZXQgMiAzMi1iaXRzCisgICAgcmV0dXJuNjQocmVzX2hpKTsKK30KKy8vKioqKioqKioqKioqKiBWZWN0b3Igc2F0dXJhdGluZyBuYXJyb3cgaW50ZWdlciBzaWduZWQtPnVuc2lnbmVkICoqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCit1aW50OHg4X3QgdnFtb3Z1bl9zMTYoaW50MTZ4OF90IGEpOyAvLyBWUU1PVlVOLlMxNiBkMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnFtb3Z1bl9zMTYoaW50MTZ4OF90IGEpCit7CisgICAgdWludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IF9tbV9wYWNrdXNfZXBpMTYoYSwgYSk7IC8vdXNlIGxvdyA2NGJpdHMgb25seQorICAgIHJldHVybjY0KHJlcyk7Cit9CisKK3VpbnQxNng0X3QgdnFtb3Z1bl9zMzIoaW50MzJ4NF90IGEpOyAvLyBWUU1PVlVOLlMzMiBkMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZxbW92dW5fczMyKGludDMyeDRfdCBhKQoreworICAgIHVpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gX01NX1BBQ0tVUzFfRVBJMzIoYSk7IC8vdXNlIGxvdyA2NGJpdHMgb25seQorICAgIHJldHVybjY0KHJlcyk7Cit9CisKK3VpbnQzMngyX3QgdnFtb3Z1bl9zNjQoaW50NjR4Ml90IGEpOyAvLyBWUU1PVlVOLlM2NCBkMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50MzJ4Ml90IHZxbW92dW5fczY0KGludDY0eDJfdCBhKQoreworICAgIHVpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXNfaGkscmVzX2xvLCB6ZXJvLCBjbXA7CisgICAgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgcmVzX2hpID0gX21tX3NybGlfZXBpNjQoYSwgIDMyKTsKKyAgICBjbXAgPSBfbW1fY21wZ3RfZXBpMzIoemVybywgcmVzX2hpKTsgLy9pZiBjbXA8MCB0aGUgcmVzdWx0IHNob3VsZCBiZSB6ZXJvCisgICAgcmVzX2xvID0gX21tX2FuZG5vdF9zaTEyOChjbXAsYSk7IC8vaWYgY21wIHplcm8gLSBkbyBub3RoaW5nLCBvdGhlcndpc2UgY21wIDwwICBhbmQgdGhlIHJlc3VsdCBpcyAwCisgICAgY21wID0gX21tX2NtcGd0X2VwaTMyKHJlc19oaSx6ZXJvKTsgLy9pZiBjbXAgcG9zaXRpdmUKKyAgICByZXNfbG8gPSAgX21tX29yX3NpMTI4KHJlc19sbywgY21wKTsgLy9pZiBjbXAgcG9zaXRpdmUgd2UgYXJlIG91dCBvZiAzMmJpdHMgbmVlZCB0byBzYXR1cmFhdGUgdG8gMHhmZmZmZmZmZgorICAgIHJlc19sbyA9IF9tbV9zaHVmZmxlX2VwaTMyKHJlc19sbywgMCB8ICgyIDw8IDIpIHwgKDEgPDwgNCkgfCAoMyA8PCA2KSk7IC8vc2h1ZmZsZSB0aGUgZGF0YSB0byBnZXQgMiAzMi1iaXRzCisgICAgcmV0dXJuNjQocmVzX2xvKTsKK30KKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vICoqKioqKioqKioqKioqKiogVGFibGUgbG9vayB1cCAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vVlRCTCAoVmVjdG9yIFRhYmxlIExvb2t1cCkgdXNlcyBieXRlIGluZGV4ZXMgaW4gYSBjb250cm9sIHZlY3RvciB0byBsb29rIHVwIGJ5dGUgdmFsdWVzCisvL2luIGEgdGFibGUgYW5kIGdlbmVyYXRlIGEgbmV3IHZlY3Rvci4gSW5kZXhlcyBvdXQgb2YgcmFuZ2UgcmV0dXJuIDAuCisvL2ZvciBJbnRlbCBTSU1EIHdlIG5lZWQgdG8gc2V0IHRoZSBNU0IgdG8gMSBmb3IgemVybyByZXR1cm4KK3VpbnQ4eDhfdCB2dGJsMV91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWVEJMLjggZDAsIHtkMH0sIGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2dGJsMV91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpCit7CisgICAgdWludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgYzcsIG1hc2tndCwgYm1hc2ssIGIxMjg7CisgICAgYzcgPSBfbW1fc2V0MV9lcGk4ICg3KTsKKyAgICBiMTI4ID0gX3BNMTI4aShiKTsKKyAgICBtYXNrZ3QgPSBfbW1fY21wZ3RfZXBpOChiMTI4LGM3KTsKKyAgICBibWFzayA9IF9tbV9vcl9zaTEyOChiMTI4LG1hc2tndCk7CisgICAgYm1hc2sgPSBfbW1fc2h1ZmZsZV9lcGk4KF9wTTEyOGkoYSksYm1hc2spOworICAgIHJldHVybjY0KGJtYXNrKTsKK30KKworaW50OHg4X3QgdnRibDFfczgoaW50OHg4X3QgYSwgIGludDh4OF90IGIpOyAvLyBWVEJMLjggZDAsIHtkMH0sIGQwCisjZGVmaW5lIHZ0YmwxX3M4IHZ0YmwxX3U4CisKK3BvbHk4eDhfdCB2dGJsMV9wOChwb2x5OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWVEJMLjggZDAsIHtkMH0sIGQwCisjZGVmaW5lIHZ0YmwxX3A4IHZ0YmwxX3U4CisKKy8vU3BlY2lhbCB0cmljayB0byBhdm9pZCBfX2RlY2xzcGVjKGFsaWduKCc4JykpIHdvbid0IGJlIGFsaWduZWQiIGVycm9yCisvL3VpbnQ4eDhfdCB2dGJsMl91OCh1aW50OHg4eDJfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZUQkwuOCBkMCwge2QwLCBkMX0sIGQwCit1aW50OHg4X3QgdnRibDJfdThfcHRyKHVpbnQ4eDh4Ml90KiBhLCB1aW50OHg4X3QgYik7IC8vIFZUQkwuOCBkMCwge2QwLCBkMX0sIGQwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDhfdCB2dGJsMl91OF9wdHIodWludDh4OHgyX3QqIGEsIHVpbnQ4eDhfdCBiKQoreworICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIGMxNSwgYTAxLCBtYXNrZ3QxNSwgYm1hc2ssIGIxMjg7CisgICAgYzE1ID0gX21tX3NldDFfZXBpOCAoMTUpOworICAgIGIxMjggPSBfcE0xMjhpKGIpOworICAgIG1hc2tndDE1ID0gX21tX2NtcGd0X2VwaTgoYjEyOCxjMTUpOworICAgIGJtYXNrID0gX21tX29yX3NpMTI4KGIxMjgsIG1hc2tndDE1KTsKKyAgICBhMDEgPSBfbW1fdW5wYWNrbG9fZXBpNjQoX3BNMTI4aShhLT52YWxbMF0pLCBfcE0xMjhpKGEtPnZhbFsxXSkpOworICAgIGEwMSA9ICBfbW1fc2h1ZmZsZV9lcGk4KGEwMSwgYm1hc2spOworICAgIHJldHVybjY0KGEwMSk7Cit9CisjZGVmaW5lIHZ0YmwyX3U4KGEsIGIpIHZ0YmwyX3U4X3B0cigmYSwgYikKKworLy9pbnQ4eDhfdCB2dGJsMl9zOChpbnQ4eDh4Ml90IGEsIGludDh4OF90IGIpOyAvLyBWVEJMLjggZDAsIHtkMCwgZDF9LCBkMAorI2RlZmluZSB2dGJsMl9zOCB2dGJsMl91OAorCisvL3BvbHk4eDhfdCB2dGJsMl9wOChwb2x5OHg4eDJfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZUQkwuOCBkMCwge2QwLCBkMX0sIGQwCisjZGVmaW5lIHZ0YmwyX3A4IHZ0YmwyX3U4CisKKy8vU3BlY2lhbCB0cmljayB0byBhdm9pZCBfX2RlY2xzcGVjKGFsaWduKCcxNicpKSB3b24ndCBiZSBhbGlnbmVkIiBlcnJvcgorLy91aW50OHg4X3QgdnRibDNfdTgodWludDh4OHgzX3QgYSwgdWludDh4OF90IGIpOyAvLyBWVEJMLjggZDAsIHtkMCwgZDEsIGQyfSwgZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZ0YmwzX3U4X3B0cih1aW50OHg4eDNfdCogYSwgdWludDh4OF90IGIpCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBjMTUsIGMyMywgbWFza2d0MjMsIGJtYXNrLCBtYXNrZ3QxNSwgc2gwLCBzaDEsIGEwMSwgYjEyODsKKyAgICBjMTUgPSBfbW1fc2V0MV9lcGk4ICgxNSk7CisgICAgYzIzID0gX21tX3NldDFfZXBpOCAoMjMpOworICAgIGIxMjggPSBfcE0xMjhpKGIpOworICAgIG1hc2tndDIzID0gX21tX2NtcGd0X2VwaTgoYjEyOCxjMjMpOworICAgIGJtYXNrID0gX21tX29yX3NpMTI4KGIxMjgsIG1hc2tndDIzKTsKKyAgICBtYXNrZ3QxNSA9IF9tbV9jbXBndF9lcGk4KGIxMjgsYzE1KTsKKyAgICBhMDEgPSBfbW1fdW5wYWNrbG9fZXBpNjQoX3BNMTI4aShhLT52YWxbMF0pLF9wTTEyOGkoYS0+dmFsWzFdKSk7CisgICAgc2gwID0gIF9tbV9zaHVmZmxlX2VwaTgoYTAxLCBibWFzayk7CisgICAgc2gxID0gIF9tbV9zaHVmZmxlX2VwaTgoX3BNMTI4aShhLT52YWxbMl0pLCBibWFzayk7IC8vZm9yIGJpPjE1IGJpIGlzIHdyYXBwZWQgKGJpLT0xNSkKKyAgICBzaDAgPSBfTU1fQkxFTkRWX0VQSTgoc2gwLCBzaDEsIG1hc2tndDE1KTsgLy9TU0U0LjEKKyAgICByZXR1cm42NChzaDApOworfQorI2RlZmluZSB2dGJsM191OChhLGIpIHZ0YmwzX3U4X3B0cigmYSxiKQorCisvL2ludDh4OF90IHZ0YmwzX3M4KGludDh4OHgzX3QgYSwgaW50OHg4X3QgYik7IC8vIFZUQkwuOCBkMCwge2QwLCBkMSwgZDJ9LCBkMAoraW50OHg4X3QgdnRibDNfczhfcHRyKGludDh4OHgzX3QqIGEsIGludDh4OF90IGIpOyAvLyBWVEJMLjggZDAsIHtkMCwgZDEsIGQyfSwgZDAKKyNkZWZpbmUgdnRibDNfczggdnRibDNfdTgKKworLy9wb2x5OHg4X3QgdnRibDNfcDgocG9seTh4OHgzX3QgYSwgdWludDh4OF90IGIpOyAvLyBWVEJMLjggZDAsIHtkMCwgZDEsIGQyfSwgZDAKK3BvbHk4eDhfdCB2dGJsM19wOF9wdHIocG9seTh4OHgzX3QqIGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlRCTC44IGQwLCB7ZDAsIGQxLCBkMn0sIGQwCisjZGVmaW5lIHZ0YmwzX3A4IHZ0YmwzX3U4CisKKy8vdWludDh4OF90IHZ0Ymw0X3U4KHVpbnQ4eDh4NF90IGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlRCTC44IGQwLCB7ZDAsIGQxLCBkMiwgZDN9LCBkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnRibDRfdThfcHRyKHVpbnQ4eDh4NF90KiBhLCB1aW50OHg4X3QgYikKK3sKKyAgICAvL3NvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbAorICAgIHVpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIGMxNSwgYzMxLCBtYXNrZ3QzMSwgYm1hc2ssIG1hc2tndDE1LCBzaDAsIHNoMSwgYTAxLCBhMjMsIGIxMjg7CisgICAgYzE1ID0gX21tX3NldDFfZXBpOCAoMTUpOworICAgIGMzMSA9IF9tbV9zZXQxX2VwaTggKDMxKTsKKyAgICBiMTI4ID0gX3BNMTI4aShiKTsKKyAgICBtYXNrZ3QzMSA9IF9tbV9jbXBndF9lcGk4KGIxMjgsYzMxKTsKKyAgICBibWFzayA9IF9tbV9vcl9zaTEyOChiMTI4LCBtYXNrZ3QzMSk7CisgICAgbWFza2d0MTUgPSBfbW1fY21wZ3RfZXBpOChiMTI4LGMxNSk7CisgICAgYTAxID0gX21tX3VucGFja2xvX2VwaTY0KF9wTTEyOGkoYS0+dmFsWzBdKSxfcE0xMjhpKGEtPnZhbFsxXSkpOworICAgIGEyMyA9IF9tbV91bnBhY2tsb19lcGk2NChfcE0xMjhpKGEtPnZhbFsyXSksX3BNMTI4aShhLT52YWxbM10pKTsKKyAgICBzaDAgPSAgX21tX3NodWZmbGVfZXBpOChhMDEsIGJtYXNrKTsKKyAgICBzaDEgPSAgX21tX3NodWZmbGVfZXBpOChhMjMsIGJtYXNrKTsgLy9mb3IgYmk+MTUgYmkgaXMgd3JhcHBlZCAoYmktPTE1KQorICAgIHNoMCA9IF9NTV9CTEVORFZfRVBJOCAoc2gwLCBzaDEsIG1hc2tndDE1KTsgLy9TU0U0LjEKKyAgICByZXR1cm42NChzaDApOworfQorI2RlZmluZSB2dGJsNF91OChhLGIpIHZ0Ymw0X3U4X3B0cigmYSxiKQorCisvL2ludDh4OF90IHZ0Ymw0X3M4KGludDh4OHg0X3QgYSwgaW50OHg4X3QgYik7IC8vIFZUQkwuOCBkMCwge2QwLCBkMSwgZDIsIGQzfSwgZDAKK2ludDh4OF90IHZ0Ymw0X3M4X3B0cihpbnQ4eDh4NF90KiBhLCBpbnQ4eDhfdCBiKTsgLy8gVlRCTC44IGQwLCB7ZDAsIGQxLCBkMiwgZDN9LCBkMAorI2RlZmluZSB2dGJsNF9zOCB2dGJsNF91OAorCisvL3BvbHk4eDhfdCB2dGJsNF9wOChwb2x5OHg4eDRfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZUQkwuOCBkMCwge2QwLCBkMSwgZDIsIGQzfSwgZDAKK3BvbHk4eDhfdCB2dGJsNF9wOF9wdHIocG9seTh4OHg0X3QqIGEsIHVpbnQ4eDhfdCBiKTsgLy8gVlRCTC44IGQwLCB7ZDAsIGQxLCBkMiwgZDN9LCBkMAorI2RlZmluZSB2dGJsNF9wOCB2dGJsNF91OAorCisvLyoqKioqKioqKioqKioqKioqKiBFeHRlbmRlZCB0YWJsZSBsb29rIHVwIGludHJpbnNpY3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vVlRCWCAoVmVjdG9yIFRhYmxlIEV4dGVuc2lvbikgd29ya3MgaW4gdGhlIHNhbWUgd2F5IGFzIFZUQkwgZG8sCisvLyBleGNlcHQgdGhhdCBpbmRleGVzIG91dCBvZiByYW5nZSBsZWF2ZSB0aGUgZGVzdGluYXRpb24gZWxlbWVudCB1bmNoYW5nZWQuCisKK3VpbnQ4eDhfdCB2dGJ4MV91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIsIHVpbnQ4eDhfdCBjKTsgLy8gVlRCWC44IGQwLCB7ZDB9LCBkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnRieDFfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiLCB1aW50OHg4X3QgYykKK3sKKyAgICB1aW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSBjNywgbWFza2d0LCBzaCwgYzEyODsKKyAgICBjNyA9IF9tbV9zZXQxX2VwaTggKDcpOworICAgIGMxMjggPSBfcE0xMjhpKGMpOworICAgIG1hc2tndCA9IF9tbV9jbXBndF9lcGk4KGMxMjgsYzcpOworICAgIGM3ID0gX21tX2FuZF9zaTEyOChtYXNrZ3QsX3BNMTI4aShhKSk7CisgICAgc2ggPSBfbW1fc2h1ZmZsZV9lcGk4KF9wTTEyOGkoYiksYzEyOCk7CisgICAgc2ggPSBfbW1fYW5kbm90X3NpMTI4KG1hc2tndCxzaCk7CisgICAgc2ggPSAgX21tX29yX3NpMTI4KHNoLGM3KTsKKyAgICByZXR1cm42NChzaCk7Cit9CisKK2ludDh4OF90IHZ0YngxX3M4KGludDh4OF90IGEsICBpbnQ4eDhfdCBiLCBpbnQ4eDhfdCBjKTsgLy8gVlRCWC44IGQwLCB7ZDB9LCBkMAorI2RlZmluZSB2dGJ4MV9zOCB2dGJ4MV91OAorCitwb2x5OHg4X3QgdnRieDFfcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiLCB1aW50OHg4X3QgYyk7IC8vIFZUQlguOCBkMCwge2QwfSwgZDAKKyNkZWZpbmUgdnRieDFfcDggdnRieDFfdTgKKworLy9TcGVjaWFsIHRyaWNrIHRvIGF2b2lkIF9fZGVjbHNwZWMoYWxpZ24oJzgnKSkgd29uJ3QgYmUgYWxpZ25lZCIgZXJyb3IKKy8vdWludDh4OF90IHZ0YngyX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4eDJfdCBiLCB1aW50OHg4X3QgYyk7IC8vIFZUQlguOCBkMCwge2QwLCBkMX0sIGQwCit1aW50OHg4X3QgdnRieDJfdThfcHRyKHVpbnQ4eDhfdCBhLCB1aW50OHg4eDJfdCogYiwgdWludDh4OF90IGMpOyAvLyBWVEJYLjggZDAsIHtkMCwgZDF9LCBkMAorX05FT04yU1NFX0lOTElORSB1aW50OHg4X3QgdnRieDJfdThfcHRyKHVpbnQ4eDhfdCBhLCB1aW50OHg4eDJfdCogYiwgdWludDh4OF90IGMpCit7CisgICAgdWludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgYzE1LCBiMDEsIG1hc2tndDE1LCBzaCwgYzEyODsKKyAgICBjMTUgPSBfbW1fc2V0MV9lcGk4ICgxNSk7CisgICAgYzEyOCA9IF9wTTEyOGkoYyk7CisgICAgbWFza2d0MTUgPSBfbW1fY21wZ3RfZXBpOChjMTI4LCBjMTUpOworICAgIGMxNSA9IF9tbV9hbmRfc2kxMjgobWFza2d0MTUsIF9wTTEyOGkoYSkpOworICAgIGIwMSA9IF9tbV91bnBhY2tsb19lcGk2NChfcE0xMjhpKGItPnZhbFswXSksIF9wTTEyOGkoYi0+dmFsWzFdKSk7CisgICAgc2ggPSAgX21tX3NodWZmbGVfZXBpOChiMDEsIGMxMjgpOworICAgIHNoID0gX21tX2FuZG5vdF9zaTEyOChtYXNrZ3QxNSwgc2gpOworICAgIHNoID0gIF9tbV9vcl9zaTEyOChzaCxjMTUpOworICAgIHJldHVybjY0KHNoKTsKK30KKyNkZWZpbmUgdnRieDJfdTgoYSwgYiwgYykgdnRieDJfdThfcHRyKGEsICZiLCBjKQorCisvL2ludDh4OF90IHZ0YngyX3M4KGludDh4OF90IGEsICBpbnQ4eDh4Ml90IGIsIGludDh4OF90IGMpOyAgLy8gVlRCWC44IGQwLCB7ZDAsIGQxfSwgZDAKKyNkZWZpbmUgdnRieDJfczggdnRieDJfdTgKKworLy9wb2x5OHg4X3QgdnRieDJfcDgocG9seTh4OF90IGEsIHBvbHk4eDh4Ml90IGIsIHVpbnQ4eDhfdCBjKTsgLy8gVlRCWC44IGQwLCB7ZDAsIGQxfSwgZDAKKyNkZWZpbmUgdnRieDJfcDggdnRieDJfdTgKKworLy91aW50OHg4X3QgdnRieDNfdTgodWludDh4OF90IGEsIHVpbnQ4eDh4M190IGIsIHVpbnQ4eDhfdCBjKSAvLyBWVEJYLjggZDAsIHtkMCwgZDEsIGQyfSwgZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZ0YngzX3U4X3B0cih1aW50OHg4X3QgYSwgdWludDh4OHgzX3QqIGIsIHVpbnQ4eDhfdCBjKQoreworICAgIC8vc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsCisgICAgdWludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgYzE1LCBjMjMsIG1hc2tndDE1LCBtYXNrZ3QyMywgc2gwLCBzaDEsIGIwMSwgYzEyODsKKyAgICBjMTUgPSBfbW1fc2V0MV9lcGk4ICgxNSk7CisgICAgYzIzID0gX21tX3NldDFfZXBpOCAoMjMpOworICAgIGMxMjggPSBfcE0xMjhpKGMpOworICAgIG1hc2tndDE1ID0gX21tX2NtcGd0X2VwaTgoYzEyOCxjMTUpOworICAgIG1hc2tndDIzID0gX21tX2NtcGd0X2VwaTgoYzEyOCxjMjMpOworICAgIGMyMyA9IF9tbV9hbmRfc2kxMjgobWFza2d0MjMsIF9wTTEyOGkoYSkpOworICAgIGIwMSA9IF9tbV91bnBhY2tsb19lcGk2NChfcE0xMjhpKGItPnZhbFswXSksX3BNMTI4aShiLT52YWxbMV0pKTsKKyAgICBzaDAgPSAgX21tX3NodWZmbGVfZXBpOChiMDEsIGMxMjgpOworICAgIHNoMSA9ICBfbW1fc2h1ZmZsZV9lcGk4KF9wTTEyOGkoYi0+dmFsWzJdKSwgYzEyOCk7IC8vZm9yIGJpPjE1IGJpIGlzIHdyYXBwZWQgKGJpLT0xNSkKKyAgICBzaDAgPSBfTU1fQkxFTkRWX0VQSTgoc2gwLCBzaDEsIG1hc2tndDE1KTsKKyAgICBzaDAgPSBfbW1fYW5kbm90X3NpMTI4KG1hc2tndDIzLHNoMCk7CisgICAgc2gwID0gX21tX29yX3NpMTI4KHNoMCxjMjMpOworICAgIHJldHVybjY0KHNoMCk7Cit9CisjZGVmaW5lIHZ0YngzX3U4KGEsIGIsIGMpIHZ0YngzX3U4X3B0cihhLCAmYiwgYykKKworLy9pbnQ4eDhfdCB2dGJ4M19zOChpbnQ4eDhfdCBhLCBpbnQ4eDh4M190IGIsIGludDh4OF90IGMpOyAvLyBWVEJYLjggZDAsIHtkMCwgZDEsIGQyfSwgZDAKK2ludDh4OF90IHZ0YngzX3M4X3B0cihpbnQ4eDhfdCBhLCBpbnQ4eDh4M190KiBiLCBpbnQ4eDhfdCBjKTsKKyNkZWZpbmUgdnRieDNfczggdnRieDNfdTgKKworLy9wb2x5OHg4X3QgdnRieDNfcDgocG9seTh4OF90IGEsIHBvbHk4eDh4M190IGIsIHVpbnQ4eDhfdCBjKTsgLy8gVlRCWC44IGQwLCB7ZDAsIGQxLCBkMn0sIGQwCitwb2x5OHg4X3QgdnRieDNfcDhfcHRyKHBvbHk4eDhfdCBhLCBwb2x5OHg4eDNfdCogYiwgdWludDh4OF90IGMpOworI2RlZmluZSB2dGJ4M19wOCB2dGJ4M191OAorCisvL3VpbnQ4eDhfdCB2dGJ4NF91OCh1aW50OHg4X3QgYSwgdWludDh4OHg0X3QgYiwgdWludDh4OF90IGMpIC8vIFZUQlguOCBkMCwge2QwLCBkMSwgZDIsIGQzfSwgZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZ0Yng0X3U4X3B0cih1aW50OHg4X3QgYSwgdWludDh4OHg0X3QqIGIsIHVpbnQ4eDhfdCBjKQoreworICAgIC8vc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsCisgICAgdWludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgYzE1LCBjMzEsIG1hc2tndDE1LCBtYXNrZ3QzMSwgc2gwLCBzaDEsIGIwMSwgYjIzLCBjMTI4OworICAgIGMxNSA9IF9tbV9zZXQxX2VwaTggKDE1KTsKKyAgICBjMzEgPSBfbW1fc2V0MV9lcGk4ICgzMSk7CisgICAgYzEyOCA9IF9wTTEyOGkoYyk7CisgICAgbWFza2d0MTUgPSBfbW1fY21wZ3RfZXBpOChjMTI4LGMxNSk7CisgICAgbWFza2d0MzEgPSBfbW1fY21wZ3RfZXBpOChjMTI4LGMzMSk7CisgICAgYzMxID0gX21tX2FuZF9zaTEyOChtYXNrZ3QzMSwgX3BNMTI4aShhKSk7CisKKyAgICBiMDEgPSBfbW1fdW5wYWNrbG9fZXBpNjQoX3BNMTI4aShiLT52YWxbMF0pLF9wTTEyOGkoYi0+dmFsWzFdKSk7CisgICAgYjIzID0gX21tX3VucGFja2xvX2VwaTY0KF9wTTEyOGkoYi0+dmFsWzJdKSxfcE0xMjhpKGItPnZhbFszXSkpOworICAgIHNoMCA9ICBfbW1fc2h1ZmZsZV9lcGk4KGIwMSwgYzEyOCk7CisgICAgc2gxID0gIF9tbV9zaHVmZmxlX2VwaTgoYjIzLCBjMTI4KTsgLy9mb3IgYmk+MTUgYmkgaXMgd3JhcHBlZCAoYmktPTE1KQorICAgIHNoMCA9IF9NTV9CTEVORFZfRVBJOChzaDAsIHNoMSwgbWFza2d0MTUpOworICAgIHNoMCA9IF9tbV9hbmRub3Rfc2kxMjgobWFza2d0MzEsc2gwKTsKKyAgICBzaDAgPSAgX21tX29yX3NpMTI4KHNoMCxjMzEpOworICAgIHJldHVybjY0KHNoMCk7Cit9CisjZGVmaW5lIHZ0Yng0X3U4KGEsIGIsIGMpIHZ0Yng0X3U4X3B0cihhLCAmYiwgYykKKworLy9pbnQ4eDhfdCB2dGJ4NF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDh4NF90IGIsIGludDh4OF90IGMpOyAvLyBWVEJYLjggZDAsIHtkMCwgZDEsIGQyLCBkM30sIGQwCitpbnQ4eDhfdCB2dGJ4NF9zOF9wdHIoaW50OHg4X3QgYSwgaW50OHg4eDRfdCogYiwgaW50OHg4X3QgYyk7CisjZGVmaW5lIHZ0Yng0X3M4IHZ0Yng0X3U4CisKKy8vcG9seTh4OF90IHZ0Yng0X3A4KHBvbHk4eDhfdCBhLCBwb2x5OHg4eDRfdCBiLCB1aW50OHg4X3QgYyk7IC8vIFZUQlguOCBkMCwge2QwLCBkMSwgZDIsIGQzfSwgZDAKK3BvbHk4eDhfdCB2dGJ4NF9wOF9wdHIocG9seTh4OF90IGEsIHBvbHk4eDh4NF90KiBiLCB1aW50OHg4X3QgYyk7CisjZGVmaW5lIHZ0Yng0X3A4IHZ0Yng0X3U4CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqIE9wZXJhdGlvbnMgd2l0aCBhIHNjYWxhciB2YWx1ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisvLyoqKioqKiogVmVjdG9yIG11bHRpcGx5IGFjY3VtdWxhdGUgYnkgc2NhbGFyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50MTZ4NF90IHZtbGFfbGFuZV9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpOyAvLyBWTUxBLkkxNiBkMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2bWxhX2xhbmVfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IHYsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsKSAvLyBWTUxBLkkxNiBkMCwgZDAsIGQwWzBdCit7CisgICAgaW50MTZfdCBjOworICAgIGludDE2eDRfdCBzY2FsYXI7CisgICAgYyA9IHZnZXRfbGFuZV9zMTYodiwgbCk7CisgICAgc2NhbGFyID0gdmR1cF9uX3MxNihjKTsKKyAgICByZXR1cm4gdm1sYV9zMTYoYSwgYiwgc2NhbGFyKTsKK30KKworaW50MzJ4Ml90IHZtbGFfbGFuZV9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWTUxBLkkzMiBkMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2bWxhX2xhbmVfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKSAvLyBWTUxBLkkzMiBkMCwgZDAsIGQwWzBdCit7CisgICAgaW50MzJfdCBjOworICAgIGludDMyeDJfdCBzY2FsYXI7CisgICAgYyA9IHZnZXRfbGFuZV9zMzIodiwgbCk7CisgICAgc2NhbGFyID0gdmR1cF9uX3MzMihjKTsKKyAgICByZXR1cm4gdm1sYV9zMzIoYSwgYiwgc2NhbGFyKTsKK30KKwordWludDE2eDRfdCB2bWxhX2xhbmVfdTE2KHVpbnQxNng0X3QgYSwgIHVpbnQxNng0X3QgYiwgdWludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZNTEEuSTE2IGQwLCBkMCwgZDBbMF0KKyNkZWZpbmUgdm1sYV9sYW5lX3UxNiB2bWxhX2xhbmVfczE2CisKKwordWludDMyeDJfdCB2bWxhX2xhbmVfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTEEuSTMyIGQwLCBkMCwgZDBbMF0KKyNkZWZpbmUgdm1sYV9sYW5lX3UzMiB2bWxhX2xhbmVfczMyCisKK2Zsb2F0MzJ4Ml90IHZtbGFfbGFuZV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgZmxvYXQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWTUxBLkYzMiBkMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZtbGFfbGFuZV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgZmxvYXQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpCit7CisgICAgZmxvYXQzMl90IHZsYW5lOworICAgIGZsb2F0MzJ4Ml90IGM7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfZjMyKHYsIGwpOworICAgIGMgPSB2ZHVwX25fZjMyKHZsYW5lKTsKKyAgICByZXR1cm4gdm1sYV9mMzIoYSxiLGMpOworfQorCitpbnQxNng4X3Qgdm1sYXFfbGFuZV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpOyAvLyBWTUxBLkkxNiBxMCwgcTAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2bWxhcV9sYW5lX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCkgLy8gVk1MQS5JMTYgcTAsIHEwLCBkMFswXQoreworICAgIGludDE2X3QgdmxhbmU7CisgICAgaW50MTZ4OF90IGM7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfczE2KHYsIGwpOworICAgIGMgPSB2ZHVwcV9uX3MxNih2bGFuZSk7CisgICAgcmV0dXJuIHZtbGFxX3MxNihhLGIsYyk7Cit9CisKK2ludDMyeDRfdCB2bWxhcV9sYW5lX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTEEuSTMyIHEwLCBxMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZtbGFxX2xhbmVfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKSAvLyBWTUxBLkkzMiBxMCwgcTAsIGQwWzBdCit7CisgICAgaW50MzJfdCB2bGFuZTsKKyAgICBpbnQzMng0X3QgYzsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9zMzIodiwgbCk7CisgICAgYyA9IHZkdXBxX25fczMyKHZsYW5lKTsKKyAgICByZXR1cm4gdm1sYXFfczMyKGEsYixjKTsKK30KKwordWludDE2eDhfdCB2bWxhcV9sYW5lX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZNTEEuSTE2IHEwLCBxMCwgZDBbMF0KKyNkZWZpbmUgdm1sYXFfbGFuZV91MTYgdm1sYXFfbGFuZV9zMTYKKwordWludDMyeDRfdCB2bWxhcV9sYW5lX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTEEuSTMyIHEwLCBxMCwgZDBbMF0KKyNkZWZpbmUgdm1sYXFfbGFuZV91MzIgdm1sYXFfbGFuZV9zMzIKKworZmxvYXQzMng0X3Qgdm1sYXFfbGFuZV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWTUxBLkYzMiBxMCwgcTAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4NF90IHZtbGFxX2xhbmVfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKSAvLyBWTUxBLkYzMiBxMCwgcTAsIGQwWzBdCit7CisgICAgZmxvYXQzMl90IHZsYW5lOworICAgIGZsb2F0MzJ4NF90IGM7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfZjMyKHYsIGwpOworICAgIGMgPSB2ZHVwcV9uX2YzMih2bGFuZSk7CisgICAgcmV0dXJuIHZtbGFxX2YzMihhLGIsYyk7Cit9CisKKy8vKioqKioqKioqKioqKioqKiogVmVjdG9yIHdpZGVuaW5nIG11bHRpcGx5IGFjY3VtdWxhdGUgYnkgc2NhbGFyICoqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQzMng0X3Qgdm1sYWxfbGFuZV9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpOyAvLyBWTUxBTC5TMTYgcTAsIGQwLCBkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3Qgdm1sYWxfbGFuZV9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpIC8vIFZNTEFMLlMxNiBxMCwgZDAsIGQwWzBdCit7CisgICAgaW50MTZfdCB2bGFuZTsKKyAgICBpbnQxNng0X3QgYzsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9zMTYodiwgbCk7CisgICAgYyA9IHZkdXBfbl9zMTYodmxhbmUpOworICAgIHJldHVybiB2bWxhbF9zMTYoYSwgYiwgYyk7Cit9CisKK2ludDY0eDJfdCB2bWxhbF9sYW5lX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTEFMLlMzMiBxMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDJfdCB2bWxhbF9sYW5lX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCkgLy8gVk1MQUwuUzMyIHEwLCBkMCwgZDBbMF0KK3sKKyAgICBpbnQzMl90IHZsYW5lOworICAgIGludDMyeDJfdCBjOworICAgIHZsYW5lID0gdmdldF9sYW5lX3MzMih2LCBsKTsKKyAgICBjID0gdmR1cF9uX3MzMih2bGFuZSk7CisgICAgcmV0dXJuIHZtbGFsX3MzMihhLCBiLCBjKTsKK30KKwordWludDMyeDRfdCB2bWxhbF9sYW5lX3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZNTEFMLnMxNiBxMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3Qgdm1sYWxfbGFuZV91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpIC8vIFZNTEFMLnMxNiBxMCwgZDAsIGQwWzBdCit7CisgICAgdWludDE2X3QgdmxhbmU7CisgICAgdWludDE2eDRfdCBjOworICAgIHZsYW5lID0gdmdldF9sYW5lX3UxNih2LCBsKTsKKyAgICBjID0gdmR1cF9uX3UxNih2bGFuZSk7CisgICAgcmV0dXJuIHZtbGFsX3UxNihhLCBiLCBjKTsKK30KKwordWludDY0eDJfdCB2bWxhbF9sYW5lX3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTEFMLlUzMiBxMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgyX3Qgdm1sYWxfbGFuZV91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpIC8vIFZNTEFMLlUzMiBxMCwgZDAsIGQwWzBdCit7CisgICAgdWludDMyX3QgdmxhbmU7CisgICAgdWludDMyeDJfdCBjOworICAgIHZsYW5lID0gdmdldF9sYW5lX3UzMih2LCBsKTsKKyAgICBjID0gdmR1cF9uX3UzMih2bGFuZSk7CisgICAgcmV0dXJuIHZtbGFsX3UzMihhLCBiLCBjKTsKK30KKworLy8gKioqKioqKiogVmVjdG9yIHdpZGVuaW5nIHNhdHVyYXRpbmcgZG91YmxpbmcgbXVsdGlwbHkgYWNjdW11bGF0ZSBieSBzY2FsYXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQzMng0X3QgdnFkbWxhbF9sYW5lX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZRRE1MQUwuUzE2IHEwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZxZG1sYWxfbGFuZV9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpCit7CisgICAgaW50MTZfdCB2bGFuZTsKKyAgICBpbnQxNng0X3QgYzsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9zMTYodiwgbCk7CisgICAgYyA9IHZkdXBfbl9zMTYodmxhbmUpOworICAgIHJldHVybiB2cWRtbGFsX3MxNihhLCBiLCBjKTsKK30KKworaW50NjR4Ml90IHZxZG1sYWxfbGFuZV9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWUURNTEFMLlMzMiBxMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDJfdCB2cWRtbGFsX2xhbmVfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKQoreworICAgIGludDMyX3QgdmxhbmU7CisgICAgdWludDMyeDJfdCBjOworICAgIHZsYW5lID0gdmdldF9sYW5lX3MzMih2LCBsKTsKKyAgICBjID0gdmR1cF9uX3MzMih2bGFuZSk7CisgICAgcmV0dXJuIHZxZG1sYWxfczMyKGEsIGIsIGMpOworfQorCisvLyAqKioqKiogVmVjdG9yIG11bHRpcGx5IHN1YnRyYWN0IGJ5IHNjYWxhciAqKioqKioqKioqKioqKioqKgorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50MTZ4NF90IHZtbHNfbGFuZV9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpOyAvLyBWTUxTLkkxNiBkMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2bWxzX2xhbmVfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IHYsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsKSAvLyBWTUxTLkkxNiBkMCwgZDAsIGQwWzBdCit7CisgICAgaW50MTZfdCB2bGFuZTsKKyAgICBpbnQxNng0X3QgYzsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9zMTYodiwgbCk7CisgICAgYyA9IHZkdXBfbl9zMTYodmxhbmUpOworICAgIHJldHVybiB2bWxzX3MxNihhLCBiLCBjKTsKK30KKworaW50MzJ4Ml90IHZtbHNfbGFuZV9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWTUxTLkkzMiBkMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2bWxzX2xhbmVfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKSAvLyBWTUxTLkkzMiBkMCwgZDAsIGQwWzBdCit7CisgICAgaW50MzJfdCB2bGFuZTsKKyAgICBpbnQzMngyX3QgYzsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9zMzIodiwgbCk7CisgICAgYyA9IHZkdXBfbl9zMzIodmxhbmUpOworICAgIHJldHVybiB2bWxzX3MzMihhLCBiLCBjKTsKK30KKwordWludDE2eDRfdCB2bWxzX2xhbmVfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IHYsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsKTsgLy8gVk1MUy5JMTYgZDAsIGQwLCBkMFswXQorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZtbHNfbGFuZV91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpIC8vIFZNTFMuSTE2IGQwLCBkMCwgZDBbMF0KK3sKKyAgICB1aW50MTZfdCB2bGFuZTsKKyAgICB1aW50MTZ4NF90IGM7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfczE2KHYsIGwpOworICAgIGMgPSB2ZHVwX25fczE2KHZsYW5lKTsKKyAgICByZXR1cm4gdm1sc19zMTYoYSwgYiwgYyk7Cit9CisKK3VpbnQzMngyX3Qgdm1sc19sYW5lX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTFMuSTMyIGQwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDJfdCB2bWxzX2xhbmVfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKSAvLyBWTUxTLkkzMiBkMCwgZDAsIGQwWzBdCit7CisgICAgdWludDMyX3QgdmxhbmU7CisgICAgdWludDMyeDJfdCBjOworICAgIHZsYW5lID0gdmdldF9sYW5lX3UzMih2LCBsKTsKKyAgICBjID0gdmR1cF9uX3UzMih2bGFuZSk7CisgICAgcmV0dXJuIHZtbHNfdTMyKGEsIGIsIGMpOworfQorCitmbG9hdDMyeDJfdCB2bWxzX2xhbmVfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVk1MUy5GMzIgZDAsIGQwLCBkMFswXQorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2bWxzX2xhbmVfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKQoreworICAgIGZsb2F0MzJfdCB2bGFuZTsKKyAgICBmbG9hdDMyeDJfdCBjOworICAgIHZsYW5lID0gKGZsb2F0KSB2Z2V0X2xhbmVfZjMyKHYsIGwpOworICAgIGMgPSB2ZHVwX25fZjMyKHZsYW5lKTsKKyAgICByZXR1cm4gdm1sc19mMzIoYSxiLGMpOworfQorCitpbnQxNng4X3Qgdm1sc3FfbGFuZV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpOyAvLyBWTUxTLkkxNiBxMCwgcTAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2bWxzcV9sYW5lX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCkgLy8gVk1MUy5JMTYgcTAsIHEwLCBkMFswXQoreworICAgIGludDE2X3QgdmxhbmU7CisgICAgaW50MTZ4OF90IGM7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfczE2KHYsIGwpOworICAgIGMgPSB2ZHVwcV9uX3MxNih2bGFuZSk7CisgICAgcmV0dXJuIHZtbHNxX3MxNihhLCBiLGMpOworfQorCitpbnQzMng0X3Qgdm1sc3FfbGFuZV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWTUxTLkkzMiBxMCwgcTAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2bWxzcV9sYW5lX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCkgLy8gVk1MUy5JMzIgcTAsIHEwLCBkMFswXQoreworICAgIGludDMyX3QgdmxhbmU7CisgICAgaW50MzJ4NF90IGM7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfczMyKHYsIGwpOworICAgIGMgPSB2ZHVwcV9uX3MzMih2bGFuZSk7CisgICAgcmV0dXJuIHZtbHNxX3MzMihhLGIsYyk7Cit9CisKK3VpbnQxNng4X3Qgdm1sc3FfbGFuZV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIHVpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpOyAvLyBWTUxBLkkxNiBxMCwgcTAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3Qgdm1sc3FfbGFuZV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIHVpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpIC8vIFZNTEEuSTE2IHEwLCBxMCwgZDBbMF0KK3sKKyAgICB1aW50MTZfdCB2bGFuZTsKKyAgICB1aW50MTZ4OF90IGM7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfdTE2KHYsIGwpOworICAgIGMgPSB2ZHVwcV9uX3UxNih2bGFuZSk7CisgICAgcmV0dXJuIHZtbHNxX3UxNihhLGIsYyk7Cit9CisKK3VpbnQzMng0X3Qgdm1sc3FfbGFuZV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpOyAvLyBWTUxBLkkzMiBxMCwgcTAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3Qgdm1sc3FfbGFuZV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpIC8vIFZNTEEuSTMyIHEwLCBxMCwgZDBbMF0KK3sKKyAgICB1aW50MzJfdCB2bGFuZTsKKyAgICB1aW50MzJ4NF90IGM7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfdTMyKHYsIGwpOworICAgIGMgPSB2ZHVwcV9uX3UzMih2bGFuZSk7CisgICAgcmV0dXJuIHZtbHNxX3UzMihhLGIsYyk7Cit9CisKK2Zsb2F0MzJ4NF90IHZtbHNxX2xhbmVfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVk1MQS5GMzIgcTAsIHEwLCBkMFswXQorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDRfdCB2bWxzcV9sYW5lX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBmbG9hdDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCkgLy8gVk1MQS5GMzIgcTAsIHEwLCBkMFswXQoreworICAgIGZsb2F0MzJfdCB2bGFuZTsKKyAgICBmbG9hdDMyeDRfdCBjOworICAgIHZsYW5lID0gKGZsb2F0KSB2Z2V0X2xhbmVfZjMyKHYsIGwpOworICAgIGMgPSB2ZHVwcV9uX2YzMih2bGFuZSk7CisgICAgcmV0dXJuIHZtbHNxX2YzMihhLGIsYyk7Cit9CisKKy8vICoqKiogVmVjdG9yIHdpZGVuaW5nIG11bHRpcGx5IHN1YnRyYWN0IGJ5IHNjYWxhciAqKioqCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQzMng0X3Qgdm1sc2xfbGFuZV9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpOyAvLyBWTUxBTC5TMTYgcTAsIGQwLCBkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3Qgdm1sc2xfbGFuZV9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpIC8vIFZNTEFMLlMxNiBxMCwgZDAsIGQwWzBdCit7CisgICAgaW50MTZfdCB2bGFuZTsKKyAgICBpbnQxNng0X3QgYzsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9zMTYodiwgbCk7CisgICAgYyA9IHZkdXBfbl9zMTYodmxhbmUpOworICAgIHJldHVybiB2bWxzbF9zMTYoYSwgYiwgYyk7Cit9CisKK2ludDY0eDJfdCB2bWxzbF9sYW5lX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTEFMLlMzMiBxMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDJfdCB2bWxzbF9sYW5lX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCkgLy8gVk1MQUwuUzMyIHEwLCBkMCwgZDBbMF0KK3sKKyAgICBpbnQzMl90IHZsYW5lOworICAgIGludDMyeDJfdCBjOworICAgIHZsYW5lID0gdmdldF9sYW5lX3MzMih2LCBsKTsKKyAgICBjID0gdmR1cF9uX3MzMih2bGFuZSk7CisgICAgcmV0dXJuIHZtbHNsX3MzMihhLCBiLCBjKTsKK30KKwordWludDMyeDRfdCB2bWxzbF9sYW5lX3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2eDRfdCB2LCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgbCk7IC8vIFZNTEFMLnMxNiBxMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3Qgdm1sc2xfbGFuZV91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpIC8vIFZNTEFMLnMxNiBxMCwgZDAsIGQwWzBdCit7CisgICAgdWludDE2X3QgdmxhbmU7CisgICAgdWludDE2eDRfdCBjOworICAgIHZsYW5lID0gdmdldF9sYW5lX3MxNih2LCBsKTsKKyAgICBjID0gdmR1cF9uX3MxNih2bGFuZSk7CisgICAgcmV0dXJuIHZtbHNsX3MxNihhLCBiLCBjKTsKK30KKwordWludDY0eDJfdCB2bWxzbF9sYW5lX3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCk7IC8vIFZNTEFMLlUzMiBxMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgyX3Qgdm1sc2xfbGFuZV91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMngyX3QgdiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGwpIC8vIFZNTEFMLlUzMiBxMCwgZDAsIGQwWzBdCit7CisgICAgdWludDMyX3QgdmxhbmU7CisgICAgdWludDMyeDJfdCBjOworICAgIHZsYW5lID0gdmdldF9sYW5lX3UzMih2LCBsKTsKKyAgICBjID0gdmR1cF9uX3UzMih2bGFuZSk7CisgICAgcmV0dXJuIHZtbHNsX3UzMihhLCBiLCBjKTsKK30KKworLy8qKioqKioqKiogVmVjdG9yIHdpZGVuaW5nIHNhdHVyYXRpbmcgZG91YmxpbmcgbXVsdGlwbHkgc3VidHJhY3QgYnkgc2NhbGFyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50MzJ4NF90IHZxZG1sc2xfbGFuZV9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgdiwgX19jb25zdHJhbmdlKDAsMykgaW50IGwpOyAvLyBWUURNTFNMLlMxNiBxMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2cWRtbHNsX2xhbmVfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IHYsIF9fY29uc3RyYW5nZSgwLDMpIGludCBsKQoreworICAgIGludDE2X3QgdmxhbmU7CisgICAgaW50MTZ4NF90IGM7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfczE2KHYsIGwpOworICAgIGMgPSB2ZHVwX25fczE2KHZsYW5lKTsKKyAgICByZXR1cm4gdnFkbWxzbF9zMTYoYSwgYiwgYyk7Cit9CisKK2ludDY0eDJfdCB2cWRtbHNsX2xhbmVfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IHYsIF9fY29uc3RyYW5nZSgwLDEpIGludCBsKTsgLy8gVlFETUxTTC5TMzIgcTAsIGQwLCBkMFswXQorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ2NHgyX3QgdnFkbWxzbF9sYW5lX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCB2LCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgbCksIF9ORU9OMlNTRV9SRUFTT05fU0xPV19TRVJJQUwpCit7CisgICAgaW50MzJfdCB2bGFuZTsKKyAgICBpbnQzMngyX3QgYzsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9zMzIodiwgbCk7CisgICAgYyA9IHZkdXBfbl9zMzIodmxhbmUpOworICAgIHJldHVybiB2cWRtbHNsX3MzMihhLCBiLCBjKTsKK30KKy8vKioqKioqKioqKiBWZWN0b3IgbXVsdGlwbHkgd2l0aCBzY2FsYXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDE2eDRfdCB2bXVsX25fczE2KGludDE2eDRfdCBhLCBpbnQxNl90IGIpOyAvLyBWTVVMLkkxNiBkMCxkMCxkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3Qgdm11bF9uX3MxNihpbnQxNng0X3QgYSwgaW50MTZfdCBiKSAvLyBWTVVMLkkxNiBkMCxkMCxkMFswXQoreworICAgIGludDE2eDRfdCBiMTZ4NDsKKyAgICBiMTZ4NCA9IHZkdXBfbl9zMTYoYik7CisgICAgcmV0dXJuIHZtdWxfczE2KGEsIGIxNng0KTsKK30KKworaW50MzJ4Ml90IHZtdWxfbl9zMzIoaW50MzJ4Ml90IGEsIGludDMyX3QgYik7IC8vIFZNVUwuSTMyIGQwLGQwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2bXVsX25fczMyKGludDMyeDJfdCBhLCBpbnQzMl90IGIpIC8vIFZNVUwuSTMyIGQwLGQwLGQwWzBdCit7CisgICAgLy9zZXJpYWwgc29sdXRpb24gbG9va3MgZmFzdGVyCisgICAgaW50MzJ4Ml90IGIzMngyOworICAgIGIzMngyID0gdmR1cF9uX3MzMihiKTsKKyAgICByZXR1cm4gdm11bF9zMzIoYSwgYjMyeDIpOworfQorCitmbG9hdDMyeDJfdCB2bXVsX25fZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJfdCBiKTsgLy8gVk1VTC5GMzIgZDAsZDAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3Qgdm11bF9uX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyX3QgYikgLy8gVk1VTC5GMzIgZDAsZDAsZDBbMF0KK3sKKyAgICBmbG9hdDMyeDJfdCBiMzJ4MjsKKyAgICBiMzJ4MiA9IHZkdXBfbl9mMzIoYik7CisgICAgcmV0dXJuIHZtdWxfZjMyKGEsIGIzMngyKTsKK30KKwordWludDE2eDRfdCB2bXVsX25fdTE2KHVpbnQxNng0X3QgYSwgdWludDE2X3QgYik7IC8vIFZNVUwuSTE2IGQwLGQwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng0X3Qgdm11bF9uX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNl90IGIpIC8vIFZNVUwuSTE2IGQwLGQwLGQwWzBdCit7CisgICAgdWludDE2eDRfdCBiMTZ4NDsKKyAgICBiMTZ4NCA9IHZkdXBfbl9zMTYoYik7CisgICAgcmV0dXJuIHZtdWxfczE2KGEsIGIxNng0KTsKK30KKwordWludDMyeDJfdCB2bXVsX25fdTMyKHVpbnQzMngyX3QgYSwgdWludDMyX3QgYik7IC8vIFZNVUwuSTMyIGQwLGQwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3Qgdm11bF9uX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMl90IGIpIC8vIFZNVUwuSTMyIGQwLGQwLGQwWzBdCit7CisgICAgLy9zZXJpYWwgc29sdXRpb24gbG9va3MgZmFzdGVyCisgICAgdWludDMyeDJfdCBiMzJ4MjsKKyAgICBiMzJ4MiA9IHZkdXBfbl91MzIoYik7CisgICAgcmV0dXJuIHZtdWxfdTMyKGEsIGIzMngyKTsKK30KKworaW50MTZ4OF90IHZtdWxxX25fczE2KGludDE2eDhfdCBhLCBpbnQxNl90IGIpOyAvLyBWTVVMLkkxNiBxMCxxMCxkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3Qgdm11bHFfbl9zMTYoaW50MTZ4OF90IGEsIGludDE2X3QgYikgLy8gVk1VTC5JMTYgcTAscTAsZDBbMF0KK3sKKyAgICBpbnQxNng4X3QgYjE2eDg7CisgICAgYjE2eDggPSB2ZHVwcV9uX3MxNihiKTsKKyAgICByZXR1cm4gdm11bHFfczE2KGEsIGIxNng4KTsKK30KKworaW50MzJ4NF90IHZtdWxxX25fczMyKGludDMyeDRfdCBhLCBpbnQzMl90IGIpOyAvLyBWTVVMLkkzMiBxMCxxMCxkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3Qgdm11bHFfbl9zMzIoaW50MzJ4NF90IGEsIGludDMyX3QgYikgLy8gVk1VTC5JMzIgcTAscTAsZDBbMF0KK3sKKyAgICBpbnQzMng0X3QgYjMyeDQ7CisgICAgYjMyeDQgPSB2ZHVwcV9uX3MzMihiKTsKKyAgICByZXR1cm4gdm11bHFfczMyKGEsIGIzMng0KTsKK30KKworZmxvYXQzMng0X3Qgdm11bHFfbl9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMl90IGIpOyAvLyBWTVVMLkYzMiBxMCxxMCxkMFswXQorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDRfdCB2bXVscV9uX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyX3QgYikgLy8gVk1VTC5GMzIgcTAscTAsZDBbMF0KK3sKKyAgICBmbG9hdDMyeDRfdCBiMzJ4NDsKKyAgICBiMzJ4NCA9IHZkdXBxX25fZjMyKGIpOworICAgIHJldHVybiB2bXVscV9mMzIoYSwgYjMyeDQpOworfQorCit1aW50MTZ4OF90IHZtdWxxX25fdTE2KHVpbnQxNng4X3QgYSwgdWludDE2X3QgYik7IC8vIFZNVUwuSTE2IHEwLHEwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQxNng4X3Qgdm11bHFfbl91MTYodWludDE2eDhfdCBhLCB1aW50MTZfdCBiKSAvLyBWTVVMLkkxNiBxMCxxMCxkMFswXQoreworICAgIHVpbnQxNng4X3QgYjE2eDg7CisgICAgYjE2eDggPSB2ZHVwcV9uX3MxNihiKTsKKyAgICByZXR1cm4gdm11bHFfczE2KGEsIGIxNng4KTsKK30KKwordWludDMyeDRfdCB2bXVscV9uX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMl90IGIpOyAvLyBWTVVMLkkzMiBxMCxxMCxkMFswXQorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZtdWxxX25fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyX3QgYikgLy8gVk1VTC5JMzIgcTAscTAsZDBbMF0KK3sKKyAgICB1aW50MzJ4NF90IGIzMng0OworICAgIGIzMng0ID0gdmR1cHFfbl91MzIoYik7CisgICAgcmV0dXJuIHZtdWxxX3UzMihhLCBiMzJ4NCk7Cit9CisKKy8vKioqKioqKioqKiBWZWN0b3IgbXVsdGlwbHkgbGFuZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50MTZ4NF90IHZtdWxfbGFuZV9zMTYgKGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDAsMykgaW50IGMpOworX05FT04yU1NFX0lOTElORSBpbnQxNng0X3Qgdm11bF9sYW5lX3MxNiAoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgYykKK3sKKyAgICBpbnQxNng0X3QgYjE2eDQ7CisgICAgaW50MTZfdCB2bGFuZTsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9zMTYoYiwgYyk7CisgICAgYjE2eDQgPSB2ZHVwX25fczE2KHZsYW5lKTsKKyAgICByZXR1cm4gdm11bF9zMTYoYSwgYjE2eDQpOworfQorCitpbnQzMngyX3Qgdm11bF9sYW5lX3MzMiAoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgYyk7CitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2bXVsX2xhbmVfczMyIChpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDEpIGludCBjKQoreworICAgIGludDMyeDJfdCBiMzJ4MjsKKyAgICBpbnQzMl90IHZsYW5lOworICAgIHZsYW5lID0gdmdldF9sYW5lX3MzMihiLCBjKTsKKyAgICBiMzJ4MiA9IHZkdXBfbl9zMzIodmxhbmUpOworICAgIHJldHVybiB2bXVsX3MzMihhLCBiMzJ4Mik7Cit9CisKK2Zsb2F0MzJ4Ml90IHZtdWxfbGFuZV9mMzIgKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDEpIGludCBjKTsKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3Qgdm11bF9sYW5lX2YzMiAoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpCit7CisgICAgZmxvYXQzMngyX3QgYjMyeDI7CisgICAgZmxvYXQzMl90IHZsYW5lOworICAgIHZsYW5lID0gdmdldF9sYW5lX2YzMihiLCBjKTsKKyAgICBiMzJ4MiA9IHZkdXBfbl9mMzIodmxhbmUpOworICAgIHJldHVybiB2bXVsX2YzMihhLCBiMzJ4Mik7Cit9CisKK3VpbnQxNng0X3Qgdm11bF9sYW5lX3UxNiAodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDMpIGludCBjKTsKKyNkZWZpbmUgdm11bF9sYW5lX3UxNiB2bXVsX2xhbmVfczE2CisKK3VpbnQzMngyX3Qgdm11bF9sYW5lX3UzMiAodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDEpIGludCBjKTsKKyNkZWZpbmUgdm11bF9sYW5lX3UzMiB2bXVsX2xhbmVfczMyCisKK2ludDE2eDhfdCB2bXVscV9sYW5lX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDMpIGludCBjKTsKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZtdWxxX2xhbmVfczE2IChpbnQxNng4X3QgYSwgaW50MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDMpIGludCBjKQoreworICAgIGludDE2eDhfdCBiMTZ4ODsKKyAgICBpbnQxNl90IHZsYW5lOworICAgIHZsYW5lID0gdmdldF9sYW5lX3MxNihiLCBjKTsKKyAgICBiMTZ4OCA9IHZkdXBxX25fczE2KHZsYW5lKTsKKyAgICByZXR1cm4gdm11bHFfczE2KGEsIGIxNng4KTsKK30KKworaW50MzJ4NF90IHZtdWxxX2xhbmVfczMyIChpbnQzMng0X3QgYSwgaW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDEpIGludCBjKTsKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZtdWxxX2xhbmVfczMyIChpbnQzMng0X3QgYSwgaW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDEpIGludCBjKQoreworICAgIGludDMyeDRfdCBiMzJ4NDsKKyAgICBpbnQzMl90IHZsYW5lOworICAgIHZsYW5lID0gdmdldF9sYW5lX3MzMihiLCBjKTsKKyAgICBiMzJ4NCA9IHZkdXBxX25fczMyKHZsYW5lKTsKKyAgICByZXR1cm4gdm11bHFfczMyKGEsIGIzMng0KTsKK30KKworZmxvYXQzMng0X3Qgdm11bHFfbGFuZV9mMzIgKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDEpIGludCBjKTsKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMng0X3Qgdm11bHFfbGFuZV9mMzIgKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDEpIGludCBjKQoreworICAgIGZsb2F0MzJ4NF90IGIzMng0OworICAgIGZsb2F0MzJfdCB2bGFuZTsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9mMzIoYiwgYyk7CisgICAgYjMyeDQgPSB2ZHVwcV9uX2YzMih2bGFuZSk7CisgICAgcmV0dXJuIHZtdWxxX2YzMihhLCBiMzJ4NCk7Cit9CisKK3VpbnQxNng4X3Qgdm11bHFfbGFuZV91MTYgKHVpbnQxNng4X3QgYSwgdWludDE2eDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgYyk7CisjZGVmaW5lIHZtdWxxX2xhbmVfdTE2IHZtdWxxX2xhbmVfczE2CisKK3VpbnQzMng0X3Qgdm11bHFfbGFuZV91MzIgKHVpbnQzMng0X3QgYSwgdWludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgYyk7CisjZGVmaW5lIHZtdWxxX2xhbmVfdTMyIHZtdWxxX2xhbmVfczMyCisKKy8vKioqKiBWZWN0b3IgbG9uZyBtdWx0aXBseSB3aXRoIHNjYWxhciAqKioqKioqKioqKioKK2ludDMyeDRfdCB2bXVsbF9uX3MxNihpbnQxNng0X3QgdmVjMSwgaW50MTZfdCB2YWwyKTsgLy8gVk1VTEwuUzE2IHEwLGQwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2bXVsbF9uX3MxNihpbnQxNng0X3QgdmVjMSwgaW50MTZfdCB2YWwyKSAvLyBWTVVMTC5TMTYgcTAsZDAsZDBbMF0KK3sKKyAgICBpbnQxNng0X3QgYjE2eDQ7CisgICAgYjE2eDQgPSB2ZHVwX25fczE2KHZhbDIpOworICAgIHJldHVybiB2bXVsbF9zMTYodmVjMSwgYjE2eDQpOworfQorCitpbnQ2NHgyX3Qgdm11bGxfbl9zMzIoaW50MzJ4Ml90IHZlYzEsIGludDMyX3QgdmFsMik7IC8vIFZNVUxMLlMzMiBxMCxkMCxkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQ2NHgyX3Qgdm11bGxfbl9zMzIoaW50MzJ4Ml90IHZlYzEsIGludDMyX3QgdmFsMikgLy8gVk1VTEwuUzMyIHEwLGQwLGQwWzBdCit7CisgICAgaW50MzJ4Ml90IGIzMngyOworICAgIGIzMngyID0gdmR1cF9uX3MzMih2YWwyKTsKKyAgICByZXR1cm4gdm11bGxfczMyKHZlYzEsIGIzMngyKTsKK30KKwordWludDMyeDRfdCB2bXVsbF9uX3UxNih1aW50MTZ4NF90IHZlYzEsIHVpbnQxNl90IHZhbDIpOyAvLyBWTVVMTC5zMTYgcTAsZDAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2bXVsbF9uX3UxNih1aW50MTZ4NF90IHZlYzEsIHVpbnQxNl90IHZhbDIpIC8vIFZNVUxMLnMxNiBxMCxkMCxkMFswXQoreworICAgIHVpbnQxNng0X3QgYjE2eDQ7CisgICAgYjE2eDQgPSB2ZHVwX25fczE2KHZhbDIpOworICAgIHJldHVybiB2bXVsbF9zMTYodmVjMSwgYjE2eDQpOworfQorCit1aW50NjR4Ml90IHZtdWxsX25fdTMyKHVpbnQzMngyX3QgdmVjMSwgdWludDMyX3QgdmFsMik7IC8vIFZNVUxMLlUzMiBxMCxkMCxkMFswXQorX05FT04yU1NFX0lOTElORSB1aW50NjR4Ml90IHZtdWxsX25fdTMyKHVpbnQzMngyX3QgdmVjMSwgdWludDMyX3QgdmFsMikgLy8gVk1VTEwuVTMyIHEwLGQwLGQwWzBdCit7CisgICAgdWludDMyeDJfdCBiMzJ4MjsKKyAgICBiMzJ4MiA9IHZkdXBfbl91MzIodmFsMik7CisgICAgcmV0dXJuIHZtdWxsX3UzMih2ZWMxLCBiMzJ4Mik7Cit9CisKKy8vKioqKiBWZWN0b3IgbG9uZyBtdWx0aXBseSBieSBzY2FsYXIgKioqKgoraW50MzJ4NF90IHZtdWxsX2xhbmVfczE2KGludDE2eDRfdCB2ZWMxLCBpbnQxNng0X3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDMpIGludCB2YWwzKTsgLy8gVk1VTEwuUzE2IHEwLGQwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2bXVsbF9sYW5lX3MxNihpbnQxNng0X3QgdmVjMSwgaW50MTZ4NF90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAzKSBpbnQgdmFsMykgLy8gVk1VTEwuUzE2IHEwLGQwLGQwWzBdCit7CisgICAgaW50MTZfdCB2bGFuZTsKKyAgICBpbnQxNng0X3QgYjsKKyAgICB2bGFuZSA9IHZnZXRfbGFuZV9zMTYodmFsMiwgdmFsMyk7CisgICAgYiA9IHZkdXBfbl9zMTYodmxhbmUpOworICAgIHJldHVybiB2bXVsbF9zMTYodmVjMSwgYik7Cit9CisKK2ludDY0eDJfdCB2bXVsbF9sYW5lX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJ4Ml90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAxKSBpbnQgdmFsMyk7IC8vIFZNVUxMLlMzMiBxMCxkMCxkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQ2NHgyX3Qgdm11bGxfbGFuZV9zMzIoaW50MzJ4Ml90IHZlYzEsIGludDMyeDJfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMSkgaW50IHZhbDMpIC8vIFZNVUxMLlMzMiBxMCxkMCxkMFswXQoreworICAgIGludDMyX3QgdmxhbmU7CisgICAgaW50MzJ4Ml90IGI7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfczMyKHZhbDIsIHZhbDMpOworICAgIGIgPSB2ZHVwX25fczMyKHZsYW5lKTsKKyAgICByZXR1cm4gdm11bGxfczMyKHZlYzEsIGIpOworfQorCit1aW50MzJ4NF90IHZtdWxsX2xhbmVfdTE2KHVpbnQxNng0X3QgdmVjMSwgdWludDE2eDRfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMykgaW50IHZhbDMpOyAvLyBWTVVMTC5zMTYgcTAsZDAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2bXVsbF9sYW5lX3UxNih1aW50MTZ4NF90IHZlYzEsIHVpbnQxNng0X3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDMpIGludCB2YWwzKSAvLyBWTVVMTC5zMTYgcTAsZDAsZDBbMF0KK3sKKyAgICB1aW50MTZfdCB2bGFuZTsKKyAgICB1aW50MTZ4NF90IGI7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfczE2KHZhbDIsIHZhbDMpOworICAgIGIgPSB2ZHVwX25fczE2KHZsYW5lKTsKKyAgICByZXR1cm4gdm11bGxfczE2KHZlYzEsIGIpOworfQorCit1aW50NjR4Ml90IHZtdWxsX2xhbmVfdTMyKHVpbnQzMngyX3QgdmVjMSwgdWludDMyeDJfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMSkgaW50IHZhbDMpOyAvLyBWTVVMTC5VMzIgcTAsZDAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDJfdCB2bXVsbF9sYW5lX3UzMih1aW50MzJ4Ml90IHZlYzEsIHVpbnQzMngyX3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDEpIGludCB2YWwzKSAvLyBWTVVMTC5VMzIgcTAsZDAsZDBbMF0KK3sKKyAgICB1aW50MzJfdCB2bGFuZTsKKyAgICB1aW50MzJ4Ml90IGI7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfdTMyKHZhbDIsIHZhbDMpOworICAgIGIgPSB2ZHVwX25fdTMyKHZsYW5lKTsKKyAgICByZXR1cm4gdm11bGxfdTMyKHZlYzEsIGIpOworfQorCisvLyoqKioqKioqKiBWZWN0b3Igc2F0dXJhdGluZyBkb3VibGluZyBsb25nIG11bHRpcGx5IHdpdGggc2NhbGFyICAqKioqKioqKioqKioqKioqKioqCitpbnQzMng0X3QgdnFkbXVsbF9uX3MxNihpbnQxNng0X3QgdmVjMSwgaW50MTZfdCB2YWwyKTsgLy8gVlFETVVMTC5TMTYgcTAsZDAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZxZG11bGxfbl9zMTYoaW50MTZ4NF90IHZlYzEsIGludDE2X3QgdmFsMikKK3sKKyAgICAvL3RoZSBzZXJpYWwgc291bHV0aW9uIG1heSBiZSBmYXN0ZXIgZHVlIHRvIHNhdHVyYXRpb24KKyAgICBpbnQxNng0X3QgYjsKKyAgICBiID0gdmR1cF9uX3MxNih2YWwyKTsKKyAgICByZXR1cm4gdnFkbXVsbF9zMTYodmVjMSwgYik7Cit9CisKK2ludDY0eDJfdCB2cWRtdWxsX25fczMyKGludDMyeDJfdCB2ZWMxLCBpbnQzMl90IHZhbDIpOyAvLyBWUURNVUxMLlMzMiBxMCxkMCxkMFswXQorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQ2NHgyX3QgdnFkbXVsbF9uX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJfdCB2YWwyKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBpbnQzMngyX3QgYjsKKyAgICBiID0gdmR1cF9uX3MzMih2YWwyKTsKKyAgICByZXR1cm4gdnFkbXVsbF9zMzIodmVjMSxiKTsgLy9zbG93IHNlcmlhbCBmdW5jdGlvbiEhISEKK30KKworLy8qKioqKioqKioqKioqIFZlY3RvciBzYXR1cmF0aW5nIGRvdWJsaW5nIGxvbmcgbXVsdGlwbHkgYnkgc2NhbGFyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQzMng0X3QgdnFkbXVsbF9sYW5lX3MxNihpbnQxNng0X3QgdmVjMSwgaW50MTZ4NF90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAzKSBpbnQgdmFsMyk7IC8vIFZRRE1VTEwuUzE2IHEwLGQwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2cWRtdWxsX2xhbmVfczE2KGludDE2eDRfdCB2ZWMxLCBpbnQxNng0X3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDMpIGludCB2YWwzKQoreworICAgIGludDE2X3QgYzsKKyAgICBpbnQxNng0X3Qgc2NhbGFyOworICAgIGMgPSB2Z2V0X2xhbmVfczE2KHZhbDIsIHZhbDMpOworICAgIHNjYWxhciA9IHZkdXBfbl9zMTYoYyk7CisgICAgcmV0dXJuIHZxZG11bGxfczE2KHZlYzEsIHNjYWxhcik7Cit9CisKKworaW50NjR4Ml90IHZxZG11bGxfbGFuZV9zMzIoaW50MzJ4Ml90IHZlYzEsIGludDMyeDJfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMSkgaW50IHZhbDMpOyAvLyAgVlFETVVMTC5TMzIgcTAsZDAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50NjR4Ml90IHZxZG11bGxfbGFuZV9zMzIoaW50MzJ4Ml90IHZlYzEsIGludDMyeDJfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMSkgaW50IHZhbDMpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIGludDMyX3QgYzsKKyAgICBpbnQzMngyX3Qgc2NhbGFyOworICAgIGMgPSB2Z2V0X2xhbmVfczMyKHZhbDIsIHZhbDMpOworICAgIHNjYWxhciA9IHZkdXBfbl9zMzIoYyk7CisgICAgcmV0dXJuIHZxZG11bGxfczMyKHZlYzEsc2NhbGFyKTsgLy9zbG93IHNlcmlhbCBmdW5jdGlvbiEhISEKK30KKworLy8gKioqKipWZWN0b3Igc2F0dXJhdGluZyBkb3VibGluZyBtdWx0aXBseSBoaWdoIHdpdGggc2NhbGFyICoqKioqCitpbnQxNng0X3QgdnFkbXVsaF9uX3MxNihpbnQxNng0X3QgdmVjMSwgIGludDE2X3QgdmFsMik7IC8vICBWUURNVUxILlMxNiBkMCxkMCxkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdnFkbXVsaF9uX3MxNihpbnQxNng0X3QgdmVjMSwgIGludDE2X3QgdmFsMikKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnFkbXVsaHFfbl9zMTYoX3BNMTI4aSh2ZWMxKSwgdmFsMikpOworfQorCitpbnQzMngyX3QgdnFkbXVsaF9uX3MzMihpbnQzMngyX3QgdmVjMSwgIGludDMyX3QgdmFsMik7IC8vICBWUURNVUxILlMzMiBkMCxkMCxkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdnFkbXVsaF9uX3MzMihpbnQzMngyX3QgdmVjMSwgIGludDMyX3QgdmFsMikKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodnFkbXVsaHFfbl9zMzIoX3BNMTI4aSh2ZWMxKSwgdmFsMikpOworfQorCitpbnQxNng4X3QgdnFkbXVsaHFfbl9zMTYoaW50MTZ4OF90IHZlYzEsIGludDE2X3QgdmFsMik7IC8vICBWUURNVUxILlMxNiBxMCxxMCxkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgdnFkbXVsaHFfbl9zMTYoaW50MTZ4OF90IHZlYzEsIGludDE2X3QgdmFsMikgLy8gIFZRRE1VTEguUzE2IHEwLHEwLGQwWzBdCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwKKyAgICBpbnQxNng4X3Qgc2NhbGFyOworICAgIHNjYWxhciA9IHZkdXBxX25fczE2KHZhbDIpOworICAgIHJldHVybiB2cWRtdWxocV9zMTYodmVjMSwgc2NhbGFyKTsKK30KKworaW50MzJ4NF90IHZxZG11bGhxX25fczMyKGludDMyeDRfdCB2ZWMxLCBpbnQzMl90IHZhbDIpOyAvLyAgVlFETVVMSC5TMzIgcTAscTAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MzJ4NF90IHZxZG11bGhxX25fczMyKGludDMyeDRfdCB2ZWMxLCBpbnQzMl90IHZhbDIpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfVU5FRkZFQ1RJVkUpCit7CisgICAgaW50MzJ4NF90IHNjYWxhcjsKKyAgICBzY2FsYXIgPSB2ZHVwcV9uX3MzMih2YWwyKTsKKyAgICByZXR1cm4gdnFkbXVsaHFfczMyKHZlYzEsIHNjYWxhcik7Cit9CisKKy8vKioqKiogVmVjdG9yIHNhdHVyYXRpbmcgZG91YmxpbmcgbXVsdGlwbHkgaGlnaCBieSBzY2FsYXIgKioqKioqKioqKioqKioqKgoraW50MTZ4NF90IHZxZG11bGhfbGFuZV9zMTYoaW50MTZ4NF90IHZlYzEsIGludDE2eDRfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMykgaW50IHZhbDMpOyAvLyAgVlFETVVMSC5TMTYgZDAsZDAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZxZG11bGhfbGFuZV9zMTYoaW50MTZ4NF90IHZlYzEsIGludDE2eDRfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMykgaW50IHZhbDMpIC8vICBWUURNVUxILlMxNiBkMCxkMCxkMFswXQoreworICAgIC8vc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsCisgICAgaW50MTZfdCB2bGFuZTsKKyAgICBpbnQxNng0X3Qgc2NhbGFyOworICAgIHZsYW5lID0gdmdldF9sYW5lX3MxNih2YWwyLCB2YWwzKTsKKyAgICBzY2FsYXIgPSB2ZHVwX25fczE2KHZsYW5lKTsKKyAgICByZXR1cm4gdnFkbXVsaF9zMTYodmVjMSwgc2NhbGFyKTsKK30KKworaW50MzJ4Ml90IHZxZG11bGhfbGFuZV9zMzIoaW50MzJ4Ml90IHZlYzEsIGludDMyeDJfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMSkgaW50IHZhbDMpOyAvLyAgVlFETVVMSC5TMzIgZDAsZDAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MzJ4Ml90IHZxZG11bGhfbGFuZV9zMzIoaW50MzJ4Ml90IHZlYzEsIGludDMyeDJfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMSkgaW50IHZhbDMpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfVU5FRkZFQ1RJVkUpCit7CisgICAgaW50MzJfdCB2bGFuZTsKKyAgICBpbnQzMngyX3Qgc2NhbGFyOworICAgIHZsYW5lID0gdmdldF9sYW5lX3MzMih2YWwyLCB2YWwzKTsKKyAgICBzY2FsYXIgPSB2ZHVwX25fczMyKHZsYW5lKTsKKyAgICByZXR1cm4gdnFkbXVsaF9zMzIodmVjMSwgc2NhbGFyKTsKK30KKworaW50MTZ4OF90IHZxZG11bGhxX2xhbmVfczE2KGludDE2eDhfdCB2ZWMxLCBpbnQxNng0X3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDMpIGludCB2YWwzKTsgLy8gIFZRRE1VTEguUzE2IHEwLHEwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2cWRtdWxocV9sYW5lX3MxNihpbnQxNng4X3QgdmVjMSwgaW50MTZ4NF90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAzKSBpbnQgdmFsMykgLy8gIFZRRE1VTEguUzE2IHEwLHEwLGQwWzBdCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwKKyAgICBpbnQxNl90IHZsYW5lOworICAgIGludDE2eDhfdCBzY2FsYXI7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfczE2KHZhbDIsIHZhbDMpOworICAgIHNjYWxhciA9IHZkdXBxX25fczE2KHZsYW5lICk7CisgICAgcmV0dXJuIHZxZG11bGhxX3MxNih2ZWMxLCBzY2FsYXIpOworfQorCitpbnQzMng0X3QgdnFkbXVsaHFfbGFuZV9zMzIoaW50MzJ4NF90IHZlYzEsIGludDMyeDJfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMSkgaW50IHZhbDMpOyAvLyAgVlFETVVMSC5TMzIgcTAscTAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MzJ4NF90IHZxZG11bGhxX2xhbmVfczMyKGludDMyeDRfdCB2ZWMxLCBpbnQzMngyX3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDEpIGludCB2YWwzKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1VORUZGRUNUSVZFKQoreworICAgIC8vc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsCisgICAgaW50MzJfdCB2bGFuZTsKKyAgICBpbnQzMng0X3Qgc2NhbGFyOworICAgIHZsYW5lID0gdmdldHFfbGFuZV9zMzIoX3BNMTI4aSh2YWwyKSwgdmFsMyk7CisgICAgc2NhbGFyID0gdmR1cHFfbl9zMzIodmxhbmUgKTsKKyAgICByZXR1cm4gdnFkbXVsaHFfczMyKHZlYzEsIHNjYWxhcik7Cit9CisKKy8vKioqKioqKiogVmVjdG9yIHNhdHVyYXRpbmcgcm91bmRpbmcgZG91YmxpbmcgbXVsdGlwbHkgaGlnaCB3aXRoIHNjYWxhciAqKioKK2ludDE2eDRfdCB2cXJkbXVsaF9uX3MxNihpbnQxNng0X3QgdmVjMSwgaW50MTZfdCB2YWwyKTsgLy8gVlFSRE1VTEguUzE2IGQwLGQwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2cXJkbXVsaF9uX3MxNihpbnQxNng0X3QgdmVjMSwgaW50MTZfdCB2YWwyKSAvLyBWUVJETVVMSC5TMTYgZDAsZDAsZDBbMF0KK3sKKyAgICAvL3NvbHV0aW9uIG1heSBiZSBub3Qgb3B0aW1hbAorICAgIGludDE2eDRfdCBzY2FsYXI7CisgICAgc2NhbGFyID0gdmR1cF9uX3MxNih2YWwyKTsKKyAgICByZXR1cm4gdnFyZG11bGhfczE2KHZlYzEsIHNjYWxhcik7Cit9CisKK2ludDMyeDJfdCB2cXJkbXVsaF9uX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJfdCB2YWwyKTsgLy8gVlFSRE1VTEguUzMyIGQwLGQwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDMyeDJfdCB2cXJkbXVsaF9uX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJfdCB2YWwyKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1VORUZGRUNUSVZFKQoreworICAgIGludDMyeDJfdCBzY2FsYXI7CisgICAgc2NhbGFyID0gdmR1cF9uX3MzMih2YWwyKTsKKyAgICByZXR1cm4gdnFyZG11bGhfczMyKHZlYzEsIHNjYWxhcik7Cit9CisKK2ludDE2eDhfdCB2cXJkbXVsaHFfbl9zMTYoaW50MTZ4OF90IHZlYzEsIGludDE2X3QgdmFsMik7IC8vIFZRUkRNVUxILlMxNiBxMCxxMCxkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgdnFyZG11bGhxX25fczE2KGludDE2eDhfdCB2ZWMxLCBpbnQxNl90IHZhbDIpIC8vIFZRUkRNVUxILlMxNiBxMCxxMCxkMFswXQoreworICAgIC8vc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsCisgICAgaW50MTZ4OF90IHNjYWxhcjsKKyAgICBzY2FsYXIgPSB2ZHVwcV9uX3MxNih2YWwyKTsKKyAgICByZXR1cm4gdnFyZG11bGhxX3MxNih2ZWMxLCBzY2FsYXIpOworfQorCitpbnQzMng0X3QgdnFyZG11bGhxX25fczMyKGludDMyeDRfdCB2ZWMxLCBpbnQzMl90IHZhbDIpOyAvLyBWUVJETVVMSC5TMzIgcTAscTAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MzJ4NF90IHZxcmRtdWxocV9uX3MzMihpbnQzMng0X3QgdmVjMSwgaW50MzJfdCB2YWwyKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1VORUZGRUNUSVZFKQoreworICAgIGludDMyeDRfdCBzY2FsYXI7CisgICAgc2NhbGFyID0gdmR1cHFfbl9zMzIodmFsMik7CisgICAgcmV0dXJuIHZxcmRtdWxocV9zMzIodmVjMSwgc2NhbGFyKTsKK30KKworLy8qKioqKioqKiogVmVjdG9yIHJvdW5kaW5nIHNhdHVyYXRpbmcgZG91YmxpbmcgbXVsdGlwbHkgaGlnaCBieSBzY2FsYXIgICoqKioKK2ludDE2eDRfdCB2cXJkbXVsaF9sYW5lX3MxNihpbnQxNng0X3QgdmVjMSwgaW50MTZ4NF90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAzKSBpbnQgdmFsMyk7IC8vIFZRUkRNVUxILlMxNiBkMCxkMCxkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdnFyZG11bGhfbGFuZV9zMTYoaW50MTZ4NF90IHZlYzEsIGludDE2eDRfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMykgaW50IHZhbDMpIC8vIFZRUkRNVUxILlMxNiBkMCxkMCxkMFswXQoreworICAgIC8vc29sdXRpb24gbWF5IGJlIG5vdCBvcHRpbWFsCisgICAgaW50MTZfdCB2bGFuZTsKKyAgICBpbnQxNng0X3Qgc2NhbGFyOworICAgIHZsYW5lID0gdmdldF9sYW5lX3MxNih2YWwyLCB2YWwzKTsKKyAgICBzY2FsYXIgPSB2ZHVwX25fczE2KHZsYW5lKTsKKyAgICByZXR1cm4gdnFyZG11bGhfczE2KHZlYzEsIHNjYWxhcik7Cit9CisKK2ludDMyeDJfdCB2cXJkbXVsaF9sYW5lX3MzMihpbnQzMngyX3QgdmVjMSwgaW50MzJ4Ml90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAxKSBpbnQgdmFsMyk7IC8vIFZRUkRNVUxILlMzMiBkMCxkMCxkMFswXQorX05FT04yU1NFX0lOTElORSBfTkVPTjJTU0VfUEVSRk9STUFOQ0VfV0FSTklORyhpbnQzMngyX3QgdnFyZG11bGhfbGFuZV9zMzIoaW50MzJ4Ml90IHZlYzEsIGludDMyeDJfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMSkgaW50IHZhbDMpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfVU5FRkZFQ1RJVkUpCit7CisgICAgaW50MzJfdCB2bGFuZTsKKyAgICBpbnQzMngyX3Qgc2NhbGFyOworICAgIHZsYW5lID0gdmdldF9sYW5lX3MzMih2YWwyLCB2YWwzKTsKKyAgICBzY2FsYXIgPSB2ZHVwX25fczMyKHZsYW5lKTsKKyAgICByZXR1cm4gdnFyZG11bGhfczMyKHZlYzEsIHNjYWxhcik7Cit9CisKK2ludDE2eDhfdCB2cXJkbXVsaHFfbGFuZV9zMTYoaW50MTZ4OF90IHZlYzEsIGludDE2eDRfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMykgaW50IHZhbDMpOyAvLyBWUVJETVVMSC5TMTYgcTAscTAsZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZxcmRtdWxocV9sYW5lX3MxNihpbnQxNng4X3QgdmVjMSwgaW50MTZ4NF90IHZhbDIsIF9fY29uc3RyYW5nZSgwLCAzKSBpbnQgdmFsMykgLy8gVlFSRE1VTEguUzE2IHEwLHEwLGQwWzBdCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwKKyAgICBpbnQxNl90IHZsYW5lOworICAgIGludDE2eDhfdCBzY2FsYXI7CisgICAgdmxhbmUgPSB2Z2V0X2xhbmVfczE2KHZhbDIsIHZhbDMpOworICAgIHNjYWxhciA9IHZkdXBxX25fczE2KHZsYW5lKTsKKyAgICByZXR1cm4gdnFyZG11bGhxX3MxNih2ZWMxLCBzY2FsYXIpOworfQorCitpbnQzMng0X3QgdnFyZG11bGhxX2xhbmVfczMyKGludDMyeDRfdCB2ZWMxLCBpbnQzMngyX3QgdmFsMiwgX19jb25zdHJhbmdlKDAsIDEpIGludCB2YWwzKTsgLy8gVlFSRE1VTEguUzMyIHEwLHEwLGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDMyeDRfdCB2cXJkbXVsaHFfbGFuZV9zMzIoaW50MzJ4NF90IHZlYzEsIGludDMyeDJfdCB2YWwyLCBfX2NvbnN0cmFuZ2UoMCwgMSkgaW50IHZhbDMpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfVU5FRkZFQ1RJVkUpCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwKKyAgICBpbnQzMl90IHZsYW5lOworICAgIGludDMyeDRfdCBzY2FsYXI7CisgICAgdmxhbmUgPSB2Z2V0cV9sYW5lX3MzMihfcE0xMjhpKHZhbDIpLCB2YWwzKTsKKyAgICBzY2FsYXIgPSB2ZHVwcV9uX3MzMih2bGFuZSApOworICAgIHJldHVybiB2cXJkbXVsaHFfczMyKHZlYzEsIHNjYWxhcik7Cit9CisKKy8vKioqKioqKioqKioqKipWZWN0b3IgbXVsdGlwbHkgYWNjdW11bGF0ZSB3aXRoIHNjYWxhciAqKioqKioqKioqKioqKioqKioqCitpbnQxNng0X3Qgdm1sYV9uX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2X3QgYyk7IC8vIFZNTEEuSTE2IGQwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZtbGFfbl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNl90IGMpIC8vIFZNTEEuSTE2IGQwLCBkMCwgZDBbMF0KK3sKKyAgICBpbnQxNng0X3Qgc2NhbGFyOworICAgIHNjYWxhciA9IHZkdXBfbl9zMTYoYyk7CisgICAgcmV0dXJuIHZtbGFfczE2KGEsIGIsIHNjYWxhcik7Cit9CisKK2ludDMyeDJfdCB2bWxhX25fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJfdCBjKTsgLy8gVk1MQS5JMzIgZDAsIGQwLCBkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3Qgdm1sYV9uX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyX3QgYykgLy8gVk1MQS5JMzIgZDAsIGQwLCBkMFswXQoreworICAgIGludDMyeDJfdCBzY2FsYXI7CisgICAgc2NhbGFyID0gdmR1cF9uX3MzMihjKTsKKyAgICByZXR1cm4gdm1sYV9zMzIoYSwgYiwgc2NhbGFyKTsKK30KKwordWludDE2eDRfdCB2bWxhX25fdTE2KHVpbnQxNng0X3QgYSwgIHVpbnQxNng0X3QgYiwgdWludDE2X3QgYyk7IC8vIFZNTEEuSTE2IGQwLCBkMCwgZDBbMF0KKyNkZWZpbmUgdm1sYV9uX3UxNiB2bWxhX25fczE2CisKKwordWludDMyeDJfdCB2bWxhX25fdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYiwgdWludDMyX3QgYyk7IC8vIFZNTEEuSTMyIGQwLCBkMCwgZDBbMF0KKyNkZWZpbmUgdm1sYV9uX3UzMiB2bWxhX25fczMyCisKKworZmxvYXQzMngyX3Qgdm1sYV9uX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyX3QgYyk7IC8vIFZNTEEuRjMyIGQwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyX3Qgdm1sYV9uX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyX3QgYykgLy8gVk1MQS5GMzIgZDAsIGQwLCBkMFswXQoreworICAgIGZsb2F0MzJ4Ml90IHNjYWxhcjsKKyAgICBzY2FsYXIgPSB2ZHVwX25fZjMyKGMpOworICAgIHJldHVybiB2bWxhX2YzMihhLCBiLCBzY2FsYXIpOworfQorCitpbnQxNng4X3Qgdm1sYXFfbl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBpbnQxNl90IGMpOyAvLyBWTUxBLkkxNiBxMCwgcTAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2bWxhcV9uX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIGludDE2X3QgYykgLy8gVk1MQS5JMTYgcTAsIHEwLCBkMFswXQoreworICAgIGludDE2eDhfdCBzY2FsYXI7CisgICAgc2NhbGFyID0gdmR1cHFfbl9zMTYoYyk7CisgICAgcmV0dXJuIHZtbGFxX3MxNihhLGIsc2NhbGFyKTsKK30KKworaW50MzJ4NF90IHZtbGFxX25fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJfdCBjKTsgLy8gVk1MQS5JMzIgcTAsIHEwLCBkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3Qgdm1sYXFfbl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBpbnQzMl90IGMpIC8vIFZNTEEuSTMyIHEwLCBxMCwgZDBbMF0KK3sKKyAgICBpbnQzMng0X3Qgc2NhbGFyOworICAgIHNjYWxhciA9IHZkdXBxX25fczMyKGMpOworICAgIHJldHVybiB2bWxhcV9zMzIoYSxiLHNjYWxhcik7Cit9CisKK3VpbnQxNng4X3Qgdm1sYXFfbl91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIHVpbnQxNl90IGMpOyAvLyBWTUxBLkkxNiBxMCwgcTAsIGQwWzBdCisjZGVmaW5lIHZtbGFxX25fdTE2IHZtbGFxX25fczE2CisKK3VpbnQzMng0X3Qgdm1sYXFfbl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMl90IGMpOyAvLyBWTUxBLkkzMiBxMCwgcTAsIGQwWzBdCisjZGVmaW5lIHZtbGFxX25fdTMyIHZtbGFxX25fczMyCisKK2Zsb2F0MzJ4NF90IHZtbGFxX25fZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJfdCBjKTsgLy8gVk1MQS5GMzIgcTAsIHEwLCBkMFswXQorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDRfdCB2bWxhcV9uX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBmbG9hdDMyX3QgYykgLy8gVk1MQS5GMzIgcTAsIHEwLCBkMFswXQoreworICAgIGZsb2F0MzJ4NF90IHNjYWxhcjsKKyAgICBzY2FsYXIgPSB2ZHVwcV9uX2YzMihjKTsKKyAgICByZXR1cm4gdm1sYXFfZjMyKGEsYixzY2FsYXIpOworfQorCisvLyoqKioqKioqKioqKlZlY3RvciB3aWRlbmluZyBtdWx0aXBseSBhY2N1bXVsYXRlIHdpdGggc2NhbGFyKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50MzJ4NF90IHZtbGFsX25fczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZfdCBjKTsgLy8gVk1MQUwuUzE2IHEwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZtbGFsX25fczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZfdCBjKSAvLyBWTUxBTC5TMTYgcTAsIGQwLCBkMFswXQoreworICAgIGludDE2eDRfdCB2YzsKKyAgICB2YyA9IHZkdXBfbl9zMTYoYyk7CisgICAgcmV0dXJuIHZtbGFsX3MxNihhLCBiLCB2Yyk7Cit9CisKK2ludDY0eDJfdCB2bWxhbF9uX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyX3QgYyk7IC8vIFZNTEFMLlMzMiBxMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDY0eDJfdCB2bWxhbF9uX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyX3QgYykgLy8gVk1MQUwuUzMyIHEwLCBkMCwgZDBbMF0KK3sKKyAgICBpbnQzMngyX3QgdmM7CisgICAgdmMgPSB2ZHVwX25fczMyKGMpOworICAgIHJldHVybiB2bWxhbF9zMzIoYSwgYiwgdmMpOworfQorCit1aW50MzJ4NF90IHZtbGFsX25fdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZfdCBjKTsgLy8gVk1MQUwuczE2IHEwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2bWxhbF9uX3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2X3QgYykgLy8gVk1MQUwuczE2IHEwLCBkMCwgZDBbMF0KK3sKKyAgICB1aW50MTZ4NF90IHZjOworICAgIHZjID0gdmR1cF9uX3MxNihjKTsKKyAgICByZXR1cm4gdm1sYWxfczE2KGEsIGIsIHZjKTsKK30KKwordWludDY0eDJfdCB2bWxhbF9uX3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyX3QgYyk7IC8vIFZNTEFMLlUzMiBxMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ2NHgyX3Qgdm1sYWxfbl91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMl90IGMpIC8vIFZNTEFMLlUzMiBxMCwgZDAsIGQwWzBdCit7CisgICAgdWludDMyeDJfdCB2YzsKKyAgICB2YyA9IHZkdXBfbl91MzIoYyk7CisgICAgcmV0dXJuIHZtbGFsX3UzMihhLCBiLCB2Yyk7Cit9CisKKy8vKioqKioqKioqKioqIFZlY3RvciB3aWRlbmluZyBzYXR1cmF0aW5nIGRvdWJsaW5nIG11bHRpcGx5IGFjY3VtdWxhdGUgd2l0aCBzY2FsYXIgKioqKioqKioqKioqKioKK2ludDMyeDRfdCB2cWRtbGFsX25fczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZfdCBjKTsgLy8gVlFETUxBTC5TMTYgcTAsIGQwLCBkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdnFkbWxhbF9uX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2X3QgYykKK3sKKyAgICAvL25vdCBvcHRpbWFsIFNJTUQgc291bHV0aW9uLCBzZXJpYWwgbWF5IGJlIGZhc3RlcgorICAgIGludDE2eDRfdCB2YzsKKyAgICB2YyA9IHZkdXBfbl9zMTYoYyk7CisgICAgcmV0dXJuIHZxZG1sYWxfczE2KGEsIGIsIHZjKTsKK30KKworaW50NjR4Ml90IHZxZG1sYWxfbl9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMl90IGMpOyAvLyBWUURNTEFMLlMzMiBxMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDJfdCB2cWRtbGFsX25fczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJfdCBjKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBpbnQzMngyX3QgdmM7CisgICAgdmMgPSB2ZHVwX25fczMyKGMpOworICAgIHJldHVybiB2cWRtbGFsX3MzMihhLCBiLCB2Yyk7Cit9CisKKy8vKioqKioqKiogVmVjdG9yIG11bHRpcGx5IHN1YnRyYWN0IHdpdGggc2NhbGFyICoqKioqKioqKioqKioqCitpbnQxNng0X3Qgdm1sc19uX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2X3QgYyk7IC8vIFZNTFMuSTE2IGQwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZtbHNfbl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNl90IGMpIC8vIFZNTFMuSTE2IGQwLCBkMCwgZDBbMF0KK3sKKyAgICBpbnQxNng0X3QgdmM7CisgICAgdmMgPSB2ZHVwX25fczE2KGMpOworICAgIHJldHVybiB2bWxzX3MxNihhLCBiLCB2Yyk7Cit9CisKK2ludDMyeDJfdCB2bWxzX25fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJfdCBjKTsgLy8gVk1MUy5JMzIgZDAsIGQwLCBkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3Qgdm1sc19uX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyX3QgYykgLy8gVk1MUy5JMzIgZDAsIGQwLCBkMFswXQoreworICAgIGludDMyeDJfdCB2YzsKKyAgICB2YyA9IHZkdXBfbl9zMzIoYyk7CisgICAgcmV0dXJuIHZtbHNfczMyKGEsIGIsIHZjKTsKK30KKwordWludDE2eDRfdCB2bWxzX25fdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZfdCBjKTsgLy8gVk1MUy5JMTYgZDAsIGQwLCBkMFswXQorX05FT04yU1NFX0lOTElORSB1aW50MTZ4NF90IHZtbHNfbl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNl90IGMpIC8vIFZNTFMuSTE2IGQwLCBkMCwgZDBbMF0KK3sKKyAgICB1aW50MTZ4NF90IHZjOworICAgIHZjID0gdmR1cF9uX3MxNihjKTsKKyAgICByZXR1cm4gdm1sc19zMTYoYSwgYiwgdmMpOworfQorCit1aW50MzJ4Ml90IHZtbHNfbl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMl90IGMpOyAvLyBWTUxTLkkzMiBkMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMngyX3Qgdm1sc19uX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyX3QgYykgLy8gVk1MUy5JMzIgZDAsIGQwLCBkMFswXQoreworICAgIHVpbnQzMngyX3QgdmM7CisgICAgdmMgPSB2ZHVwX25fdTMyKGMpOworICAgIHJldHVybiB2bWxzX3UzMihhLCBiLCB2Yyk7Cit9CisKK2Zsb2F0MzJ4Ml90IHZtbHNfbl9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgZmxvYXQzMl90IGMpOyAvLyBWTUxTLkYzMiBkMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZtbHNfbl9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgZmxvYXQzMl90IGMpCit7CisgICAgZmxvYXQzMngyX3QgcmVzOworICAgIHJlcy5tNjRfZjMyWzBdID0gYS5tNjRfZjMyWzBdIC0gYi5tNjRfZjMyWzBdICogYzsKKyAgICByZXMubTY0X2YzMlsxXSA9IGEubTY0X2YzMlsxXSAtIGIubTY0X2YzMlsxXSAqIGM7CisgICAgcmV0dXJuIHJlczsKK30KKworaW50MTZ4OF90IHZtbHNxX25fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZfdCBjKTsgLy8gVk1MUy5JMTYgcTAsIHEwLCBkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3Qgdm1sc3Ffbl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBpbnQxNl90IGMpIC8vIFZNTFMuSTE2IHEwLCBxMCwgZDBbMF0KK3sKKyAgICBpbnQxNng4X3QgdmM7CisgICAgdmMgPSB2ZHVwcV9uX3MxNihjKTsKKyAgICByZXR1cm4gdm1sc3FfczE2KGEsIGIsdmMpOworfQorCitpbnQzMng0X3Qgdm1sc3Ffbl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBpbnQzMl90IGMpOyAvLyBWTUxTLkkzMiBxMCwgcTAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2bWxzcV9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIGludDMyX3QgYykgLy8gVk1MUy5JMzIgcTAsIHEwLCBkMFswXQoreworICAgIGludDMyeDRfdCB2YzsKKyAgICB2YyA9IHZkdXBxX25fczMyKGMpOworICAgIHJldHVybiB2bWxzcV9zMzIoYSxiLHZjKTsKK30KKwordWludDE2eDhfdCB2bWxzcV9uX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2X3QgYyk7IC8vIFZNTFMuSTE2IHEwLCBxMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDE2eDhfdCB2bWxzcV9uX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2X3QgYykgLy8gVk1MUy5JMTYgcTAsIHEwLCBkMFswXQoreworICAgIHVpbnQzMng0X3QgdmM7CisgICAgdmMgPSB2ZHVwcV9uX3UzMihjKTsKKyAgICByZXR1cm4gdm1sc3FfdTMyKGEsYix2Yyk7Cit9CisKK3VpbnQzMng0X3Qgdm1sc3Ffbl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMl90IGMpOyAvLyBWTUxTLkkzMiBxMCwgcTAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQzMng0X3Qgdm1sc3Ffbl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMl90IGMpIC8vIFZNTFMuSTMyIHEwLCBxMCwgZDBbMF0KK3sKKyAgICB1aW50MzJ4NF90IHZjOworICAgIHZjID0gdmR1cHFfbl91MzIoYyk7CisgICAgcmV0dXJuIHZtbHNxX3UzMihhLGIsdmMpOworfQorCitmbG9hdDMyeDRfdCB2bWxzcV9uX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBmbG9hdDMyX3QgYyk7IC8vIFZNTFMuRjMyIHEwLCBxMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMng0X3Qgdm1sc3Ffbl9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMl90IGMpCit7CisgICAgZmxvYXQzMng0X3QgdmM7CisgICAgdmMgPSB2ZHVwcV9uX2YzMihjKTsKKyAgICByZXR1cm4gdm1sc3FfZjMyKGEsYix2Yyk7Cit9CisKKy8vKioqKiBWZWN0b3Igd2lkZW5pbmcgbXVsdGlwbHkgc3VidHJhY3Qgd2l0aCBzY2FsYXIgKioqKioqCitpbnQzMng0X3Qgdm1sc2xfbl9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNl90IGMpOyAvLyBWTUxTTC5TMTYgcTAsIGQwLCBkMFswXQorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3Qgdm1sc2xfbl9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNl90IGMpIC8vIFZNTFNMLlMxNiBxMCwgZDAsIGQwWzBdCit7CisgICAgaW50MTZ4NF90IHZjOworICAgIHZjID0gdmR1cF9uX3MxNihjKTsKKyAgICByZXR1cm4gdm1sc2xfczE2KGEsIGIsIHZjKTsKK30KKworaW50NjR4Ml90IHZtbHNsX25fczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJfdCBjKTsgLy8gVk1MU0wuUzMyIHEwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4Ml90IHZtbHNsX25fczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJfdCBjKSAvLyBWTUxTTC5TMzIgcTAsIGQwLCBkMFswXQoreworICAgIGludDMyeDJfdCB2YzsKKyAgICB2YyA9IHZkdXBfbl9zMzIoYyk7CisgICAgcmV0dXJuIHZtbHNsX3MzMihhLCBiLCB2Yyk7Cit9CisKK3VpbnQzMng0X3Qgdm1sc2xfbl91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNl90IGMpOyAvLyBWTUxTTC5zMTYgcTAsIGQwLCBkMFswXQorX05FT04yU1NFX0lOTElORSB1aW50MzJ4NF90IHZtbHNsX25fdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZfdCBjKSAvLyBWTUxTTC5zMTYgcTAsIGQwLCBkMFswXQoreworICAgIHVpbnQxNng0X3QgdmM7CisgICAgdmMgPSB2ZHVwX25fdTE2KGMpOworICAgIHJldHVybiB2bWxzbF91MTYoYSwgYiwgdmMpOworfQorCit1aW50NjR4Ml90IHZtbHNsX25fdTMyKHVpbnQ2NHgyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJfdCBjKTsgLy8gVk1MU0wuVTMyIHEwLCBkMCwgZDBbMF0KK19ORU9OMlNTRV9JTkxJTkUgdWludDY0eDJfdCB2bWxzbF9uX3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyX3QgYykgLy8gVk1MU0wuVTMyIHEwLCBkMCwgZDBbMF0KK3sKKyAgICB1aW50MzJ4Ml90IHZjOworICAgIHZjID0gdmR1cF9uX3UzMihjKTsKKyAgICByZXR1cm4gdm1sc2xfdTMyKGEsIGIsIHZjKTsKK30KKworLy8qKioqKiBWZWN0b3Igd2lkZW5pbmcgc2F0dXJhdGluZyBkb3VibGluZyBtdWx0aXBseSBzdWJ0cmFjdCB3aXRoIHNjYWxhciAqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50MzJ4NF90IHZxZG1sc2xfbl9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNl90IGMpOyAvLyBWUURNTFNMLlMxNiBxMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2cWRtbHNsX25fczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZfdCBjKQoreworICAgIGludDE2eDRfdCB2YzsKKyAgICB2YyA9IHZkdXBfbl9zMTYoYyk7CisgICAgcmV0dXJuIHZxZG1sc2xfczE2KGEsIGIsIHZjKTsKK30KKworaW50NjR4Ml90IHZxZG1sc2xfbl9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMl90IGMpOyAvLyBWUURNTFNMLlMzMiBxMCwgZDAsIGQwWzBdCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGludDY0eDJfdCB2cWRtbHNsX25fczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJfdCBjKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBpbnQzMngyX3QgdmM7CisgICAgdmMgPSB2ZHVwX25fczMyKGMpOworICAgIHJldHVybiB2cWRtbHNsX3MzMihhLCBiLCB2Yyk7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKiAgVmVjdG9yIGV4dHJhY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9WRVhUIChWZWN0b3IgRXh0cmFjdCkgZXh0cmFjdHMgIGVsZW1lbnRzIGZyb20gdGhlIGJvdHRvbSBlbmQgb2YgdGhlIHNlY29uZCBvcGVyYW5kCisvL3ZlY3RvciBhbmQgdGhlIHRvcCBlbmQgb2YgdGhlIGZpcnN0LCBjb25jYXRlbmF0ZXMgdGhlbSwgYW5kIHBsYWNlcyB0aGUgcmVzdWx0IGluIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IKKy8vYyBlbGVtZW50cyBmcm9tIHRoZSBib3R0b20gZW5kIG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBhbmQgKDgtYykgZnJvbSB0aGUgdG9wIGVuZCBvZiB0aGUgZmlyc3QKK2ludDh4OF90IHZleHRfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWRVhULjggZDAsZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50OHg4X3QgdmV4dF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYyksX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBpbnQ4eDhfdCByZXM7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaTw4IC0gYzsgaSsrKSB7CisgICAgICAgIHJlcy5tNjRfaThbaV0gPSBhLm02NF9pOFtpICsgY107CisgICAgfQorICAgIGZvcihpID0gMDsgaTxjOyBpKyspIHsKKyAgICAgICAgcmVzLm02NF9pOFs4IC0gYyArIGldID0gYi5tNjRfaThbaV07CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ4eDhfdCB2ZXh0X3U4KHVpbnQ4eDhfdCBhLCAgdWludDh4OF90IGIsIF9fY29uc3RyYW5nZSgwLDcpIGludCBjKTsgLy8gVkVYVC44IGQwLGQwLGQwLCMwCisjZGVmaW5lIHZleHRfdTggdmV4dF9zOAorLy9zYW1lIHJlc3VsdCB0ZXN0ZWQKKworcG9seTh4OF90IHZleHRfcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYyk7IC8vIFZFWFQuOCBkMCxkMCxkMCwjMAorI2RlZmluZSB2ZXh0X3A4IHZleHRfdTgKKworaW50MTZ4NF90IHZleHRfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDAsMykgaW50IGMpOyAvLyBWRVhULjE2IGQwLGQwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCAgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcgKHZleHRfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDAsMykgaW50IGMpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIGludDE2eDRfdCByZXM7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaTw0IC0gYzsgaSsrKSB7CisgICAgICAgIHJlcy5tNjRfaTE2W2ldID0gYS5tNjRfaTE2W2kgKyBjXTsKKyAgICB9CisgICAgZm9yKGkgPSAwOyBpPGM7IGkrKykgeworICAgICAgICByZXMubTY0X2kxNls0IC0gYyArIGldID0gYi5tNjRfaTE2W2ldOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit1aW50MTZ4NF90IHZleHRfdTE2KHVpbnQxNng0X3QgYSwgIHVpbnQxNng0X3QgYiwgX19jb25zdHJhbmdlKDAsMykgaW50IGMpOyAvLyBWRVhULjE2IGQwLGQwLGQwLCMwCisjZGVmaW5lIHZleHRfdTE2IHZleHRfczE2CisKK3BvbHkxNng0X3QgdmV4dF9wMTYocG9seTE2eDRfdCBhLCBwb2x5MTZ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDMpIGludCBjKTsgLy8gVkVYVC4xNiBkMCxkMCxkMCwjMAorI2RlZmluZSB2ZXh0X3AxNiB2ZXh0X3MxNgorCitpbnQzMngyX3QgdmV4dF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgYyk7IC8vIFZFWFQuMzIgZDAsZDAsZDAsIzAKK19ORU9OMlNTRV9JTkxJTkUgX05FT04yU1NFX1BFUkZPUk1BTkNFX1dBUk5JTkcoaW50MzJ4Ml90IHZleHRfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpLCBfTkVPTjJTU0VfUkVBU09OX1NMT1dfU0VSSUFMKQoreworICAgIGludDMyeDJfdCByZXM7CisgICAgaWYgKGM9PTApIHsKKyAgICAgICAgcmVzLm02NF9pMzJbMF0gPSBhLm02NF9pMzJbMF07CisgICAgICAgIHJlcy5tNjRfaTMyWzFdID0gYS5tNjRfaTMyWzFdOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcy5tNjRfaTMyWzBdID0gYS5tNjRfaTMyWzFdOworICAgICAgICByZXMubTY0X2kzMlsxXSA9IGIubTY0X2kzMlswXTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworZmxvYXQzMngyX3QgdmV4dF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpOyAvLyBWRVhULjMyIGQwLGQwLGQwLCMwCitfTkVPTjJTU0VfSU5MSU5FIF9ORU9OMlNTRV9QRVJGT1JNQU5DRV9XQVJOSU5HKGZsb2F0MzJ4Ml90IHZleHRfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDEpIGludCBjKSwgX05FT04yU1NFX1JFQVNPTl9TTE9XX1NFUklBTCkKK3sKKyAgICBmbG9hdDMyeDJfdCByZXM7CisgICAgaWYgKGM9PTApIHsKKyAgICAgICAgcmVzLm02NF9mMzJbMF0gPSBhLm02NF9mMzJbMF07CisgICAgICAgIHJlcy5tNjRfZjMyWzFdID0gYS5tNjRfZjMyWzFdOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcy5tNjRfZjMyWzBdID0gYS5tNjRfZjMyWzFdOworICAgICAgICByZXMubTY0X2YzMlsxXSA9IGIubTY0X2YzMlswXTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDMyeDJfdCB2ZXh0X3UzMih1aW50MzJ4Ml90IGEsICB1aW50MzJ4Ml90IGIsIF9fY29uc3RyYW5nZSgwLDEpIGludCBjKTsgLy8gVkVYVC4zMiBkMCxkMCxkMCwjMAorI2RlZmluZSB2ZXh0X3UzMiB2ZXh0X3MzMgorCisKK2ludDY0eDFfdCB2ZXh0X3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIsIF9fY29uc3RyYW5nZSgwLDApIGludCBjKTsgLy8gVkVYVC42NCBkMCxkMCxkMCwjMAorI2RlZmluZSB2ZXh0X3M2NChhLGIsYykgYQorCit1aW50NjR4MV90IHZleHRfdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiLCBfX2NvbnN0cmFuZ2UoMCwwKSBpbnQgYyk7IC8vIFZFWFQuNjQgZDAsZDAsZDAsIzAKKyNkZWZpbmUgdmV4dF91NjQoYSxiLGMpIGEKKworaW50OHgxNl90IHZleHRxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYiwgX19jb25zdHJhbmdlKDAsMTUpIGludCBjKTsgLy8gVkVYVC44IHEwLHEwLHEwLCMwCisjZGVmaW5lIHZleHRxX3M4KGEsYixjKSBfTU1fQUxJR05SX0VQSTggKGIsYSxjKQorCit1aW50OHgxNl90IHZleHRxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxNSkgaW50IGMpOyAvLyBWRVhULjggcTAscTAscTAsIzAKKyNkZWZpbmUgdmV4dHFfdTgoYSxiLGMpIF9NTV9BTElHTlJfRVBJOCAoYixhLGMpCisKK3BvbHk4eDE2X3QgdmV4dHFfcDgocG9seTh4MTZfdCBhLCBwb2x5OHgxNl90IGIsIF9fY29uc3RyYW5nZSgwLDE1KSBpbnQgYyk7IC8vIFZFWFQuOCBxMCxxMCxxMCwjMAorI2RlZmluZSB2ZXh0cV9wOCB2ZXh0cV9zOAorCitpbnQxNng4X3QgdmV4dHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgX19jb25zdHJhbmdlKDAsNykgaW50IGMpOyAvLyBWRVhULjE2IHEwLHEwLHEwLCMwCisjZGVmaW5lIHZleHRxX3MxNihhLGIsYykgX01NX0FMSUdOUl9FUEk4IChiLGEsYyAqIDIpCisKK3VpbnQxNng4X3QgdmV4dHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiLCBfX2NvbnN0cmFuZ2UoMCw3KSBpbnQgYyk7IC8vIFZFWFQuMTYgcTAscTAscTAsIzAKKyNkZWZpbmUgdmV4dHFfdTE2KGEsYixjKSBfTU1fQUxJR05SX0VQSTggKGIsYSxjICogMikKKworcG9seTE2eDhfdCB2ZXh0cV9wMTYocG9seTE2eDhfdCBhLCBwb2x5MTZ4OF90IGIsIF9fY29uc3RyYW5nZSgwLDcpIGludCBjKTsgLy8gVkVYVC4xNiBxMCxxMCxxMCwjMAorI2RlZmluZSB2ZXh0cV9wMTYgdmV4dHFfczE2CisKK2ludDMyeDRfdCB2ZXh0cV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBfX2NvbnN0cmFuZ2UoMCwzKSBpbnQgYyk7IC8vIFZFWFQuMzIgcTAscTAscTAsIzAKKyNkZWZpbmUgdmV4dHFfczMyKGEsYixjKSBfTU1fQUxJR05SX0VQSTggKGIsYSxjICogNCkKKwordWludDMyeDRfdCB2ZXh0cV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIF9fY29uc3RyYW5nZSgwLDMpIGludCBjKTsgLy8gVkVYVC4zMiBxMCxxMCxxMCwjMAorI2RlZmluZSB2ZXh0cV91MzIoYSxiLGMpIF9NTV9BTElHTlJfRVBJOCAoYixhLGMgKiA0KQorCitmbG9hdDMyeDRfdCB2ZXh0cV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgX19jb25zdHJhbmdlKDAsMykgZmxvYXQgYyk7IC8vIFZFWFQuMzIgcTAscTAscTAsIzAKKyNkZWZpbmUgdmV4dHFfZjMyKGEsYixjKSBfTTEyOCh2ZXh0cV9zMzIoX00xMjhpKGEpLF9NMTI4aShiKSxjKSApCisKK2ludDY0eDJfdCB2ZXh0cV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiLCBfX2NvbnN0cmFuZ2UoMCwxKSBpbnQgYyk7IC8vIFZFWFQuNjQgcTAscTAscTAsIzAKKyNkZWZpbmUgdmV4dHFfczY0KGEsYixjKSBfTU1fQUxJR05SX0VQSTgoYixhLGMgKiA4KQorCit1aW50NjR4Ml90IHZleHRxX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYiwgX19jb25zdHJhbmdlKDAsMSkgaW50IGMpOyAvLyBWRVhULjY0IHEwLHEwLHEwLCMwCisjZGVmaW5lIHZleHRxX3U2NChhLGIsYykgX01NX0FMSUdOUl9FUEk4KGIsYSxjICogOCkKKworLy8qKioqKioqKioqKiogUmV2ZXJzZSB2ZWN0b3IgZWxlbWVudHMgKHN3YXAgZW5kaWFubmVzcykqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL1ZSRVZuLm0gcmV2ZXJzZXMgdGhlIG9yZGVyIG9mIHRoZSBtLWJpdCBsYW5lcyB3aXRoaW4gYSBzZXQgdGhhdCBpcyBuIGJpdHMgd2lkZS4KK2ludDh4OF90IHZyZXY2NF9zOChpbnQ4eDhfdCB2ZWMpOyAvLyBWUkVWNjQuOCBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2cmV2NjRfczgoaW50OHg4X3QgdmVjKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IHZyZXY2NHFfczgoX3BNMTI4aSh2ZWMpKTsKKyAgICByZXR1cm42NChyZXMpOworfQorCitpbnQxNng0X3QgdnJldjY0X3MxNihpbnQxNng0X3QgdmVjKTsgLy8gVlJFVjY0LjE2IGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2cmV2NjRfczE2KGludDE2eDRfdCB2ZWMpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IHZyZXY2NHFfczE2KF9wTTEyOGkodmVjKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50MzJ4Ml90IHZyZXY2NF9zMzIoaW50MzJ4Ml90IHZlYyk7IC8vIFZSRVY2NC4zMiBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdnJldjY0X3MzMihpbnQzMngyX3QgdmVjKQoreworICAgIGludDMyeDJfdCByZXM7CisgICAgcmVzLm02NF9pMzJbMF0gPSB2ZWMubTY0X2kzMlsxXTsKKyAgICByZXMubTY0X2kzMlsxXSA9IHZlYy5tNjRfaTMyWzBdOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ4eDhfdCB2cmV2NjRfdTgodWludDh4OF90IHZlYyk7IC8vIFZSRVY2NC44IGQwLGQwCisjZGVmaW5lIHZyZXY2NF91OCB2cmV2NjRfczgKKwordWludDE2eDRfdCB2cmV2NjRfdTE2KHVpbnQxNng0X3QgdmVjKTsgLy8gVlJFVjY0LjE2IGQwLGQwCisjZGVmaW5lIHZyZXY2NF91MTYgdnJldjY0X3MxNgorCit1aW50MzJ4Ml90IHZyZXY2NF91MzIodWludDMyeDJfdCB2ZWMpOyAvLyBWUkVWNjQuMzIgZDAsZDAKKyNkZWZpbmUgdnJldjY0X3UzMiB2cmV2NjRfczMyCisKK3BvbHk4eDhfdCB2cmV2NjRfcDgocG9seTh4OF90IHZlYyk7IC8vIFZSRVY2NC44IGQwLGQwCisjZGVmaW5lIHZyZXY2NF9wOCB2cmV2NjRfdTgKKworcG9seTE2eDRfdCB2cmV2NjRfcDE2KHBvbHkxNng0X3QgdmVjKTsgLy8gVlJFVjY0LjE2IGQwLGQwCisjZGVmaW5lIHZyZXY2NF9wMTYgdnJldjY0X3UxNgorCitmbG9hdDMyeDJfdCB2cmV2NjRfZjMyKGZsb2F0MzJ4Ml90IHZlYyk7IC8vIFZSRVY2NC4zMiBkMCxkMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2cmV2NjRfZjMyKGZsb2F0MzJ4Ml90IHZlYykKK3sKKyAgICBmbG9hdDMyeDJfdCByZXM7CisgICAgcmVzLm02NF9mMzJbMF0gPSB2ZWMubTY0X2YzMlsxXTsKKyAgICByZXMubTY0X2YzMlsxXSA9IHZlYy5tNjRfZjMyWzBdOworICAgIHJldHVybiByZXM7Cit9CisKK2ludDh4MTZfdCB2cmV2NjRxX3M4KGludDh4MTZfdCB2ZWMpOyAvLyBWUkVWNjQuOCBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2X3QgdnJldjY0cV9zOChpbnQ4eDE2X3QgdmVjKSAvLyBWUkVWNjQuOCBxMCxxMAoreworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFza19yZXZfZThbMTZdID0gezcsNiw1LDQsMywyLDEsMCwgMTUsMTQsMTMsMTIsMTEsMTAsOSwgOH07CisgICAgcmV0dXJuIF9tbV9zaHVmZmxlX2VwaTggKHZlYywgKihfX20xMjhpKikgIG1hc2tfcmV2X2U4KTsKK30KKworaW50MTZ4OF90IHZyZXY2NHFfczE2KGludDE2eDhfdCB2ZWMpOyAvLyBWUkVWNjQuMTYgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZyZXY2NHFfczE2KGludDE2eDhfdCB2ZWMpIC8vIFZSRVY2NC4xNiBxMCxxMAoreworICAgIC8vbm8gX21tX3NodWZmbGVfZXBpMTYsIF9tbV9zaHVmZmxlX2VwaTggdG8gYmUgdXNlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG1hc2sKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2tfcmV2X2UxNlsxNl0gPSB7Niw3LCA0LDUsMiwzLDAsMSwxNCwxNSwxMiwxMywxMCwxMSw4LDl9OworICAgIHJldHVybiBfbW1fc2h1ZmZsZV9lcGk4ICh2ZWMsICooX19tMTI4aSopbWFza19yZXZfZTE2KTsKK30KKworaW50MzJ4NF90IHZyZXY2NHFfczMyKGludDMyeDRfdCB2ZWMpOyAvLyBWUkVWNjQuMzIgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZyZXY2NHFfczMyKGludDMyeDRfdCB2ZWMpIC8vIFZSRVY2NC4zMiBxMCxxMAoreworICAgIHJldHVybiBfbW1fc2h1ZmZsZV9lcGkzMiAodmVjLCAxIHwgKDAgPDwgMikgfCAoMyA8PCA0KSB8ICgyIDw8IDYpICk7Cit9CisKK3VpbnQ4eDE2X3QgdnJldjY0cV91OCh1aW50OHgxNl90IHZlYyk7IC8vIFZSRVY2NC44IHEwLHEwCisjZGVmaW5lIHZyZXY2NHFfdTggdnJldjY0cV9zOAorCit1aW50MTZ4OF90IHZyZXY2NHFfdTE2KHVpbnQxNng4X3QgdmVjKTsgLy8gVlJFVjY0LjE2IHEwLHEwCisjZGVmaW5lIHZyZXY2NHFfdTE2IHZyZXY2NHFfczE2CisKK3VpbnQzMng0X3QgdnJldjY0cV91MzIodWludDMyeDRfdCB2ZWMpOyAvLyBWUkVWNjQuMzIgcTAscTAKKyNkZWZpbmUgdnJldjY0cV91MzIgdnJldjY0cV9zMzIKKworcG9seTh4MTZfdCB2cmV2NjRxX3A4KHBvbHk4eDE2X3QgdmVjKTsgLy8gVlJFVjY0LjggcTAscTAKKyNkZWZpbmUgdnJldjY0cV9wOCB2cmV2NjRxX3U4CisKK3BvbHkxNng4X3QgdnJldjY0cV9wMTYocG9seTE2eDhfdCB2ZWMpOyAvLyBWUkVWNjQuMTYgcTAscTAKKyNkZWZpbmUgdnJldjY0cV9wMTYgdnJldjY0cV91MTYKKworZmxvYXQzMng0X3QgdnJldjY0cV9mMzIoZmxvYXQzMng0X3QgdmVjKTsgLy8gVlJFVjY0LjMyIHEwLHEwCisjZGVmaW5lIHZyZXY2NHFfZjMyKHZlYykgX21tX3NodWZmbGVfcHMgKHZlYywgIHZlYywgX01NX1NIVUZGTEUoMiwzLCAwLDEpKQorCisvLyoqKioqKioqKioqKioqKioqKioqICAzMiBiaXQgc2h1ZmZsZXMgKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90IHZyZXYzMl9zOChpbnQ4eDhfdCB2ZWMpOyAvLyBWUkVWMzIuOCBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2cmV2MzJfczgoaW50OHg4X3QgdmVjKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IHZyZXYzMnFfczgoX3BNMTI4aSh2ZWMpKTsKKyAgICByZXR1cm42NChyZXMpOworfQorCitpbnQxNng0X3QgdnJldjMyX3MxNihpbnQxNng0X3QgdmVjKTsgLy8gVlJFVjMyLjE2IGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2cmV2MzJfczE2KGludDE2eDRfdCB2ZWMpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IHZyZXYzMnFfczE2KF9wTTEyOGkodmVjKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKwordWludDh4OF90IHZyZXYzMl91OCh1aW50OHg4X3QgdmVjKTsgLy8gVlJFVjMyLjggZDAsZDAKKyNkZWZpbmUgdnJldjMyX3U4IHZyZXYzMl9zOAorCit1aW50MTZ4NF90IHZyZXYzMl91MTYodWludDE2eDRfdCB2ZWMpOyAvLyBWUkVWMzIuMTYgZDAsZDAKKyNkZWZpbmUgdnJldjMyX3UxNiB2cmV2MzJfczE2CisKK3BvbHk4eDhfdCB2cmV2MzJfcDgocG9seTh4OF90IHZlYyk7IC8vIFZSRVYzMi44IGQwLGQwCisjZGVmaW5lIHZyZXYzMl9wOCB2cmV2MzJfdTgKKworcG9seTE2eDRfdCB2cmV2MzJfcDE2KHBvbHkxNng0X3QgdmVjKTsgLy8gVlJFVjMyLjE2IGQwLGQwCisjZGVmaW5lIHZyZXYzMl9wMTYgdnJldjMyX3UxNgorCitpbnQ4eDE2X3QgdnJldjMycV9zOChpbnQ4eDE2X3QgdmVjKTsgLy8gVlJFVjMyLjggcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90IHZyZXYzMnFfczgoaW50OHgxNl90IHZlYykgLy8gVlJFVjMyLjggcTAscTAKK3sKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2tfcmV2X2U4WzE2XSA9IHszLDIsMSwwLCA3LDYsNSw0LCAxMSwxMCw5LDgsIDE1LDE0LDEzLDEyfTsKKyAgICByZXR1cm4gX21tX3NodWZmbGVfZXBpOCAodmVjLCAqKF9fbTEyOGkqKSAgbWFza19yZXZfZTgpOworfQorCitpbnQxNng4X3QgdnJldjMycV9zMTYoaW50MTZ4OF90IHZlYyk7IC8vIFZSRVYzMi4xNiBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3QgdnJldjMycV9zMTYoaW50MTZ4OF90IHZlYykgLy8gVlJFVjMyLjE2IHEwLHEwCit7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrX3Jldl9lOFsxNl0gPSB7MiwzLDAsMSwgNiw3LCA0LDUsIDEwLDExLCA4LDksIDE0LDE1LDEyLDEzfTsKKyAgICByZXR1cm4gX21tX3NodWZmbGVfZXBpOCAodmVjLCAqKF9fbTEyOGkqKSAgbWFza19yZXZfZTgpOworfQorCit1aW50OHgxNl90IHZyZXYzMnFfdTgodWludDh4MTZfdCB2ZWMpOyAvLyBWUkVWMzIuOCBxMCxxMAorI2RlZmluZSB2cmV2MzJxX3U4IHZyZXYzMnFfczgKKwordWludDE2eDhfdCB2cmV2MzJxX3UxNih1aW50MTZ4OF90IHZlYyk7IC8vIFZSRVYzMi4xNiBxMCxxMAorI2RlZmluZSB2cmV2MzJxX3UxNiB2cmV2MzJxX3MxNgorCitwb2x5OHgxNl90IHZyZXYzMnFfcDgocG9seTh4MTZfdCB2ZWMpOyAvLyBWUkVWMzIuOCBxMCxxMAorI2RlZmluZSB2cmV2MzJxX3A4IHZyZXYzMnFfdTgKKworcG9seTE2eDhfdCB2cmV2MzJxX3AxNihwb2x5MTZ4OF90IHZlYyk7IC8vIFZSRVYzMi4xNiBxMCxxMAorI2RlZmluZSB2cmV2MzJxX3AxNiB2cmV2MzJxX3UxNgorCisvLyoqKioqKioqKioqKiogIDE2IGJpdCBzaHVmZmxlcyAqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgdnJldjE2X3M4KGludDh4OF90IHZlYyk7IC8vIFZSRVYxNi44IGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZyZXYxNl9zOChpbnQ4eDhfdCB2ZWMpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdnJldjE2cV9zOChfcE0xMjhpKHZlYykpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK3VpbnQ4eDhfdCB2cmV2MTZfdTgodWludDh4OF90IHZlYyk7IC8vIFZSRVYxNi44IGQwLGQwCisjZGVmaW5lIHZyZXYxNl91OCB2cmV2MTZfczgKKworcG9seTh4OF90IHZyZXYxNl9wOChwb2x5OHg4X3QgdmVjKTsgLy8gVlJFVjE2LjggZDAsZDAKKyNkZWZpbmUgdnJldjE2X3A4IHZyZXYxNl91OAorCitpbnQ4eDE2X3QgdnJldjE2cV9zOChpbnQ4eDE2X3QgdmVjKTsgLy8gVlJFVjE2LjggcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90IHZyZXYxNnFfczgoaW50OHgxNl90IHZlYykgLy8gVlJFVjE2LjggcTAscTAKK3sKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2tfcmV2OFsxNl0gPSB7MSwwLCAzLDIsIDUsNCwgNyw2LCA5LDgsIDExLCAxMCwgMTMsIDEyLCAxNSwgMTR9OworICAgIHJldHVybiBfbW1fc2h1ZmZsZV9lcGk4ICh2ZWMsICooX19tMTI4aSopICBtYXNrX3JldjgpOworfQorCit1aW50OHgxNl90IHZyZXYxNnFfdTgodWludDh4MTZfdCB2ZWMpOyAvLyBWUkVWMTYuOCBxMCxxMAorI2RlZmluZSB2cmV2MTZxX3U4IHZyZXYxNnFfczgKKworcG9seTh4MTZfdCB2cmV2MTZxX3A4KHBvbHk4eDE2X3QgdmVjKTsgLy8gVlJFVjE2LjggcTAscTAKKyNkZWZpbmUgdnJldjE2cV9wOCB2cmV2MTZxX3U4CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKiogT3RoZXIgc2luZ2xlIG9wZXJhbmQgYXJpdGhtZXRpYyAqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisvLyoqKioqKioqKioqIEFic29sdXRlOiBWZFtpXSA9IHxWYVtpXXwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludDh4OF90ICAgdmFic19zOChpbnQ4eDhfdCBhKTsgLy8gVkFCUy5TOCBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCAgIHZhYnNfczgoaW50OHg4X3QgYSkKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSBfbW1fYWJzX2VwaTgoX3BNMTI4aShhKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworCitpbnQxNng0X3QgICB2YWJzX3MxNihpbnQxNng0X3QgYSk7IC8vIFZBQlMuUzE2IGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCAgIHZhYnNfczE2KGludDE2eDRfdCBhKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSBfbW1fYWJzX2VwaTE2KF9wTTEyOGkoYSkpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDMyeDJfdCAgIHZhYnNfczMyKGludDMyeDJfdCBhKTsgLy8gVkFCUy5TMzIgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90ICAgdmFic19zMzIoaW50MzJ4Ml90IGEpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IF9tbV9hYnNfZXBpMzIoX3BNMTI4aShhKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworZmxvYXQzMngyX3QgdmFic19mMzIoZmxvYXQzMngyX3QgYSk7IC8vIFZBQlMuRjMyIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZhYnNfZjMyKGZsb2F0MzJ4Ml90IGEpIC8vIFZBQlMuRjMyIGQwLGQwCit7CisgICAgZmxvYXQzMng0X3QgcmVzOworICAgIF9fbTY0XzEyOCByZXM2NDsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50MzJfdCBjN2ZmZmZmZmZbNF0gPSB7MHg3ZmZmZmZmZiwgMHg3ZmZmZmZmZiwgMHg3ZmZmZmZmZiwgMHg3ZmZmZmZmZn07CisgICAgcmVzID0gX21tX2FuZF9wcyAoX3BNMTI4KGEpLCAqKF9fbTEyOCopYzdmZmZmZmZmKTsgLy91c2UgNjQgbG93IGJpdHMgb25seQorICAgIF9NNjRmKHJlczY0LCByZXMpOworICAgIHJldHVybiByZXM2NDsKK30KKworaW50OHgxNl90ICAgdmFic3FfczgoaW50OHgxNl90IGEpOyAvLyBWQUJTLlM4IHEwLHEwCisjZGVmaW5lIHZhYnNxX3M4IF9tbV9hYnNfZXBpOAorCitpbnQxNng4X3QgICB2YWJzcV9zMTYoaW50MTZ4OF90IGEpOyAvLyBWQUJTLlMxNiBxMCxxMAorI2RlZmluZSB2YWJzcV9zMTYgX21tX2Fic19lcGkxNgorCitpbnQzMng0X3QgICB2YWJzcV9zMzIoaW50MzJ4NF90IGEpOyAvLyBWQUJTLlMzMiBxMCxxMAorI2RlZmluZSB2YWJzcV9zMzIgX21tX2Fic19lcGkzMgorCitmbG9hdDMyeDRfdCB2YWJzcV9mMzIoZmxvYXQzMng0X3QgYSk7IC8vIFZBQlMuRjMyIHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4NF90IHZhYnNxX2YzMihmbG9hdDMyeDRfdCBhKSAvLyBWQUJTLkYzMiBxMCxxMAoreworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQzMl90IGM3ZmZmZmZmZls0XSA9IHsweDdmZmZmZmZmLCAweDdmZmZmZmZmLCAweDdmZmZmZmZmLCAweDdmZmZmZmZmfTsKKyAgICByZXR1cm4gX21tX2FuZF9wcyAoYSwgKihfX20xMjgqKWM3ZmZmZmZmZik7Cit9CisKKy8vKioqKioqIFNhdHVyYXRpbmcgYWJzb2x1dGU6IFZkW2ldID0gc2F0KHxWYVtpXXwpICoqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL0ZvciBzaWduZWQtaW50ZWdlciBkYXRhIHR5cGVzLCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIG1vc3QgbmVnYXRpdmUgdmFsdWUgaXMgbm90IHJlcHJlc2VudGFibGUgYnkgdGhlIGRhdGEgdHlwZSwgc2F0dXJhdGlvbiB0YWtlcyBwbGFjZQoraW50OHg4X3QgdnFhYnNfczgoaW50OHg4X3QgYSk7IC8vIFZRQUJTLlM4IGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZxYWJzX3M4KGludDh4OF90IGEpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdnFhYnNxX3M4KF9wTTEyOGkoYSkpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDE2eDRfdCB2cWFic19zMTYoaW50MTZ4NF90IGEpOyAvLyBWUUFCUy5TMTYgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZxYWJzX3MxNihpbnQxNng0X3QgYSkKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdnFhYnNxX3MxNihfcE0xMjhpKGEpKTsKKyAgICByZXR1cm42NChyZXMpOworfQorCitpbnQzMngyX3QgdnFhYnNfczMyKGludDMyeDJfdCBhKTsgLy8gVlFBQlMuUzMyIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2cWFic19zMzIoaW50MzJ4Ml90IGEpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IHZxYWJzcV9zMzIoX3BNMTI4aShhKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50OHgxNl90IHZxYWJzcV9zOChpbnQ4eDE2X3QgYSk7IC8vIFZRQUJTLlM4IHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4MTZfdCB2cWFic3FfczgoaW50OHgxNl90IGEpIC8vIFZRQUJTLlM4IHEwLHEwCit7CisgICAgX19tMTI4aSBjXzEyOCwgYWJzLCBhYnNfY21wOworICAgIGNfMTI4ID0gX21tX3NldDFfZXBpOCAoMHg4MCk7IC8vLTEyOAorICAgIGFicyA9IF9tbV9hYnNfZXBpOCAoYSk7CisgICAgYWJzX2NtcCA9IF9tbV9jbXBlcV9lcGk4IChhYnMsIGNfMTI4KTsKKyAgICByZXR1cm4gX21tX3hvcl9zaTEyOCAoYWJzLCAgYWJzX2NtcCk7Cit9CisKK2ludDE2eDhfdCB2cWFic3FfczE2KGludDE2eDhfdCBhKTsgLy8gVlFBQlMuUzE2IHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2cWFic3FfczE2KGludDE2eDhfdCBhKSAvLyBWUUFCUy5TMTYgcTAscTAKK3sKKyAgICBfX20xMjhpIGNfMzI3NjgsIGFicywgYWJzX2NtcDsKKyAgICBjXzMyNzY4ID0gX21tX3NldDFfZXBpMTYgKDB4ODAwMCk7IC8vLTMyNzY4CisgICAgYWJzID0gX21tX2Fic19lcGkxNiAoYSk7CisgICAgYWJzX2NtcCA9IF9tbV9jbXBlcV9lcGkxNiAoYWJzLCBjXzMyNzY4KTsKKyAgICByZXR1cm4gX21tX3hvcl9zaTEyOCAoYWJzLCAgYWJzX2NtcCk7Cit9CisKK2ludDMyeDRfdCB2cWFic3FfczMyKGludDMyeDRfdCBhKTsgLy8gVlFBQlMuUzMyIHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2cWFic3FfczMyKGludDMyeDRfdCBhKSAvLyBWUUFCUy5TMzIgcTAscTAKK3sKKyAgICBfX20xMjhpIGM4MDAwMDAwMCwgYWJzLCBhYnNfY21wOworICAgIGM4MDAwMDAwMCA9IF9tbV9zZXQxX2VwaTMyICgweDgwMDAwMDAwKTsgLy9tb3N0IG5lZ2F0aXZlIHZhbHVlCisgICAgYWJzID0gX21tX2Fic19lcGkzMiAoYSk7CisgICAgYWJzX2NtcCA9IF9tbV9jbXBlcV9lcGkzMiAoYWJzLCBjODAwMDAwMDApOworICAgIHJldHVybiBfbW1feG9yX3NpMTI4IChhYnMsICBhYnNfY21wKTsKK30KKworLy8qKioqKioqKioqKioqKiogTmVnYXRlOiBWZFtpXSA9IC0gVmFbaV0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9zZXZlcmFsIE5lZ2F0ZSBpbXBsZW1lbnRhdGlvbnMgcG9zc2libGUgZm9yIFNJTUQuCisvL2UuLy9mdW5jdGlvbiBfbW1fc2lnbiBmdW5jdGlvbihhLCBuZWdhdGl2ZSBudW1iZXJzIHZlY3RvciksIGJ1dCB0aGUgZm9sbG93aW5nIG9uZSBnaXZlcyBnb29kIHBlcmZvcm1hbmNlOgoraW50OHg4X3Qgdm5lZ19zOChpbnQ4eDhfdCBhKTsgLy8gVk5FLy9kMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2bmVnX3M4KGludDh4OF90IGEpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdm5lZ3FfczgoX3BNMTI4aShhKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50MTZ4NF90IHZuZWdfczE2KGludDE2eDRfdCBhKTsgLy8gVk5FLy9kMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3Qgdm5lZ19zMTYoaW50MTZ4NF90IGEpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IHZuZWdxX3MxNihfcE0xMjhpKGEpKTsKKyAgICByZXR1cm42NChyZXMpOworfQorCitpbnQzMngyX3Qgdm5lZ19zMzIoaW50MzJ4Ml90IGEpOyAvLyBWTkUvL2QwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2bmVnX3MzMihpbnQzMngyX3QgYSkKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdm5lZ3FfczMyKF9wTTEyOGkoYSkpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2Zsb2F0MzJ4Ml90IHZuZWdfZjMyKGZsb2F0MzJ4Ml90IGEpOyAvLyBWTkUvL2QwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4Ml90IHZuZWdfZjMyKGZsb2F0MzJ4Ml90IGEpIC8vIFZORS8vZDAsZDAKK3sKKyAgICBmbG9hdDMyeDRfdCByZXM7CisgICAgX19tNjRfMTI4IHJlczY0OworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQzMl90IGM4MDAwMDAwMFs0XSA9IHsweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwfTsKKyAgICByZXMgPSBfbW1feG9yX3BzIChfcE0xMjgoYSksICooX19tMTI4KikgYzgwMDAwMDAwKTsgLy91c2UgbG93IDY0IGJpdHMKKyAgICBfTTY0ZihyZXM2NCwgcmVzKTsKKyAgICByZXR1cm4gcmVzNjQ7Cit9CisKK2ludDh4MTZfdCB2bmVncV9zOChpbnQ4eDE2X3QgYSk7IC8vIFZORS8vcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90IHZuZWdxX3M4KGludDh4MTZfdCBhKSAvLyBWTkUvL3EwLHEwCit7CisgICAgX19tMTI4aSB6ZXJvOworICAgIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCAoKTsKKyAgICByZXR1cm4gX21tX3N1Yl9lcGk4ICh6ZXJvLCBhKTsKK30gLy9vciBfbW1fc2lnbl9lcGk4IChhLCBuZWdhdGl2ZSBudW1iZXJzIHZlY3RvcikKKworaW50MTZ4OF90IHZuZWdxX3MxNihpbnQxNng4X3QgYSk7IC8vIFZORS8vcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZuZWdxX3MxNihpbnQxNng4X3QgYSkgLy8gVk5FLy9xMCxxMAoreworICAgIF9fbTEyOGkgemVybzsKKyAgICB6ZXJvID0gX21tX3NldHplcm9fc2kxMjggKCk7CisgICAgcmV0dXJuIF9tbV9zdWJfZXBpMTYgKHplcm8sIGEpOworfSAvL29yIF9tbV9zaWduX2VwaTE2IChhLCBuZWdhdGl2ZSBudW1iZXJzIHZlY3RvcikKKworaW50MzJ4NF90IHZuZWdxX3MzMihpbnQzMng0X3QgYSk7IC8vIFZORS8vcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZuZWdxX3MzMihpbnQzMng0X3QgYSkgLy8gVk5FLy9xMCxxMAoreworICAgIF9fbTEyOGkgemVybzsKKyAgICB6ZXJvID0gX21tX3NldHplcm9fc2kxMjggKCk7CisgICAgcmV0dXJuIF9tbV9zdWJfZXBpMzIgKHplcm8sIGEpOworfSAvL29yIF9tbV9zaWduX2VwaTMyIChhLCBuZWdhdGl2ZSBudW1iZXJzIHZlY3RvcikKKworZmxvYXQzMng0X3Qgdm5lZ3FfZjMyKGZsb2F0MzJ4NF90IGEpOyAvLyBWTkUvL3EwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGZsb2F0MzJ4NF90IHZuZWdxX2YzMihmbG9hdDMyeDRfdCBhKSAvLyBWTkUvL3EwLHEwCit7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDMyX3QgYzgwMDAwMDAwWzRdID0gezB4ODAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDB9OworICAgIHJldHVybiBfbW1feG9yX3BzIChhLCAqKF9fbTEyOCopIGM4MDAwMDAwMCk7Cit9CisKKy8vKioqKioqKioqKioqKiogU2F0dXJhdGluZyBOZWdhdGU6IHNhdChWZFtpXSA9IC0gVmFbaV0pICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9Gb3Igc2lnbmVkLWludGVnZXIgZGF0YSB0eXBlcywgdGhlIG5lZ2F0aW9uIG9mIHRoZSBtb3N0IG5lZ2F0aXZlIHZhbHVlIGNhbid0IGJlIHByb2R1Y2VkIHdpdGhvdXQgc2F0dXJhdGlvbiwgd2hpbGUgd2l0aCBzYXR1cmF0aW9uIGl0IGlzIG1heCBwb3NpdGl2ZQoraW50OHg4X3QgdnFuZWdfczgoaW50OHg4X3QgYSk7IC8vIFZRTkUvL2QwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZxbmVnX3M4KGludDh4OF90IGEpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdnFuZWdxX3M4KF9wTTEyOGkoYSkpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDE2eDRfdCB2cW5lZ19zMTYoaW50MTZ4NF90IGEpOyAvLyBWUU5FLy9kMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdnFuZWdfczE2KGludDE2eDRfdCBhKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSB2cW5lZ3FfczE2KF9wTTEyOGkoYSkpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDMyeDJfdCB2cW5lZ19zMzIoaW50MzJ4Ml90IGEpOyAvLyBWUU5FLy9kMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdnFuZWdfczMyKGludDMyeDJfdCBhKQoreworICAgIGludDMyeDJfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSB2cW5lZ3FfczMyKF9wTTEyOGkoYSkpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDh4MTZfdCB2cW5lZ3FfczgoaW50OHgxNl90IGEpOyAvLyBWUU5FLy9xMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2X3QgdnFuZWdxX3M4KGludDh4MTZfdCBhKSAvLyBWUU5FLy9xMCxxMAoreworICAgIF9fbTEyOGkgemVybzsKKyAgICB6ZXJvID0gX21tX3NldHplcm9fc2kxMjggKCk7CisgICAgcmV0dXJuIF9tbV9zdWJzX2VwaTggKHplcm8sIGEpOyAvL3NhdHVyYXRpbmcgc3Vic3RyYWN0aW9uCit9CisKK2ludDE2eDhfdCB2cW5lZ3FfczE2KGludDE2eDhfdCBhKTsgLy8gVlFORS8vcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZxbmVncV9zMTYoaW50MTZ4OF90IGEpIC8vIFZRTkUvL3EwLHEwCit7CisgICAgX19tMTI4aSB6ZXJvOworICAgIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCAoKTsKKyAgICByZXR1cm4gX21tX3N1YnNfZXBpMTYgKHplcm8sIGEpOyAvL3NhdHVyYXRpbmcgc3Vic3RyYWN0aW9uCit9CisKK2ludDMyeDRfdCB2cW5lZ3FfczMyKGludDMyeDRfdCBhKTsgLy8gVlFORS8vcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4NF90IHZxbmVncV9zMzIoaW50MzJ4NF90IGEpIC8vIFZRTkUvL3EwLHEwCit7CisgICAgLy9zb2x1dGlvbiBtYXkgYmUgbm90IG9wdGltYWwgY29tcGFyZWQgd2l0aCBhIHNlcmlhbAorICAgIF9fbTEyOGkgYzgwMDAwMDAwLCB6ZXJvLCBzdWIsIGNtcDsKKyAgICBjODAwMDAwMDAgPSBfbW1fc2V0MV9lcGkzMiAoMHg4MDAwMDAwMCk7IC8vbW9zdCBuZWdhdGl2ZSB2YWx1ZQorICAgIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCAoKTsKKyAgICBzdWIgPSAgX21tX3N1Yl9lcGkzMiAoemVybywgYSk7IC8vc3Vic3RyYWN0aW9uCisgICAgY21wID0gX21tX2NtcGVxX2VwaTMyIChhLCBjODAwMDAwMDApOworICAgIHJldHVybiBfbW1feG9yX3NpMTI4IChzdWIsICBjbXApOworfQorCisvLyoqKioqKioqKioqKioqKioqKiBDb3VudCBsZWFkaW5nIHplcm9zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL25vIGNvcnJlc3BvbmRpbmcgdmVjdG9yIGludHJpbnNpY3MgaW4gSUEzMiwgbmVlZCB0byBpbXBsZW1lbnQgaXQuICBXaGlsZSB0aGUgaW1wbGVtZW50YXRpb24gaXMgZWZmZWN0aXZlIGZvciA4IGJpdHMsIGl0IG1heSBiZSBub3QgZm9yIDE2IGFuZCAzMiBiaXRzCitpbnQ4eDhfdCB2Y2x6X3M4KGludDh4OF90IGEpOyAvLyBWQ0xaLkk4IGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZjbHpfczgoaW50OHg4X3QgYSkKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICBfX20xMjhpIHJlczsKKyAgICByZXMgPSB2Y2x6cV9zOChfcE0xMjhpKGEpKTsKKyAgICByZXR1cm42NChyZXMpOworfQorCitpbnQxNng0X3QgdmNsel9zMTYoaW50MTZ4NF90IGEpOyAvLyBWQ0xaLkkxNiBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3QgdmNsel9zMTYoaW50MTZ4NF90IGEpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IHZjbHpxX3MxNihfcE0xMjhpKGEpKTsKKyAgICByZXR1cm42NChyZXMpOworfQorCitpbnQzMngyX3QgdmNsel9zMzIoaW50MzJ4Ml90IGEpOyAvLyBWQ0xaLkkzMiBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3QgdmNsel9zMzIoaW50MzJ4Ml90IGEpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IHZjbHpxX3MzMihfcE0xMjhpKGEpKTsKKyAgICByZXR1cm42NChyZXMpOworfQorCisKK3VpbnQ4eDhfdCB2Y2x6X3U4KHVpbnQ4eDhfdCBhKTsgLy8gVkNMWi5JOCBkMCxkMAorI2RlZmluZSB2Y2x6X3U4IHZjbHpfczgKKwordWludDE2eDRfdCB2Y2x6X3UxNih1aW50MTZ4NF90IGEpOyAvLyBWQ0xaLkkxNiBkMCxkMAorI2RlZmluZSB2Y2x6X3UxNiB2Y2x6X3MxNgorCit1aW50MzJ4Ml90IHZjbHpfdTMyKHVpbnQzMngyX3QgYSk7IC8vIFZDTFouSTMyIGQwLGQwCisjZGVmaW5lIHZjbHpfdTMyIHZjbHpfczMyCisKK2ludDh4MTZfdCB2Y2x6cV9zOChpbnQ4eDE2X3QgYSk7IC8vIFZDTFouSTggcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90IHZjbHpxX3M4KGludDh4MTZfdCBhKQoreworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFza19DTFpbMTZdID0geyAvKiAwICovIDQsLyogMSAqLyAzLC8qIDIgKi8gMiwvKiAzICovIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNCAqLyAxLC8qIDUgKi8gMSwvKiA2ICovIDEsLyogNyAqLyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDggKi8gMCwvKiA5ICovIDAsLyogYSAqLyAwLC8qIGIgKi8gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjICovIDAsLyogZCAqLyAwLC8qIGUgKi8gMCwvKiBmICovIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgX19tMTI4aSBtYXNrTE9XLCBjNCwgbG93Y2x6LCBtYXNrLCBoaWNsejsKKyAgICBtYXNrTE9XID0gX21tX3NldDFfZXBpOCgweDBmKTsgLy9sb3cgNCBiaXRzLCBkb24ndCBuZWVkIG1hc2tpbmcgbG93IHRvIGF2b2lkIHplcm8gaWYgTVNCIGlzIHNldCAtIGl0IGhhcHBlbnMgYXV0b21hdGljYWxseQorICAgIGM0ID0gX21tX3NldDFfZXBpOCg0KTsKKyAgICBsb3djbHogPSBfbW1fc2h1ZmZsZV9lcGk4KCAqKF9fbTEyOGkqKW1hc2tfQ0xaLCBhKTsgLy91c2VzIGxvdyA0IGJpdHMgYW55d2F5CisgICAgbWFzayA9ICBfbW1fc3JsaV9lcGkxNihhLCA0KTsgLy9nZXQgaGlnaCA0IGJpdHMgYXMgbG93IGJpdHMKKyAgICBtYXNrID0gX21tX2FuZF9zaTEyOChtYXNrLCBtYXNrTE9XKTsgLy9sb3cgNCBiaXRzLCBuZWVkIG1hc2tpbmcgdG8gYXZvaWQgemVybyBpZiBNU0IgaXMgc2V0CisgICAgaGljbHogPSBfbW1fc2h1ZmZsZV9lcGk4KCAqKF9fbTEyOGkqKSBtYXNrX0NMWiwgbWFzayk7IC8vdXNlcyBsb3cgNCBiaXRzIGFueXdheQorICAgIG1hc2sgPSBfbW1fY21wZXFfZXBpOChoaWNseiwgYzQpOyAvLyBzaG93cyB0aGUgbmVlZCB0byBhZGQgbG93Y2x6IHplcm9zCisgICAgbG93Y2x6ID0gX21tX2FuZF9zaTEyOChsb3djbHosbWFzayk7CisgICAgcmV0dXJuIF9tbV9hZGRfZXBpOChsb3djbHosIGhpY2x6KTsKK30KKworaW50MTZ4OF90IHZjbHpxX3MxNihpbnQxNng4X3QgYSk7IC8vIFZDTFouSTE2IHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDhfdCB2Y2x6cV9zMTYoaW50MTZ4OF90IGEpCit7CisgICAgX19tMTI4aSBjNywgcmVzOHgxNiwgcmVzOHgxNl9zd2FwOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazhfc2FiWzE2XSA9IHsgMSwgMCwgMywgMiwgNSwgNCwgNywgNiwgOSwgOCwgMTEsIDEwLCAxMywgMTIsIDE1LCAxNH07CisgICAgX05FT04yU1NFX0FMSUdOXzE2IHVpbnQxNl90IG1hc2s4Yml0WzhdID0gezB4MDBmZiwgMHgwMGZmLCAweDAwZmYsIDB4MDBmZiwweDAwZmYsIDB4MDBmZiwgMHgwMGZmLCAweDAwZmZ9OworICAgIGM3ID0gX21tX3NybGlfZXBpMTYoKihfX20xMjhpKiltYXNrOGJpdCwgNSk7IC8vNworICAgIHJlczh4MTYgPSB2Y2x6cV9zOChhKTsKKyAgICByZXM4eDE2X3N3YXAgPSBfbW1fc2h1ZmZsZV9lcGk4IChyZXM4eDE2LCAqKF9fbTEyOGkqKSBtYXNrOF9zYWIpOyAvL2hvcmlzb250YWwgcGFpcnMgc3dhcAorICAgIHJlczh4MTYgPSBfbW1fYW5kX3NpMTI4KHJlczh4MTYsICooX19tMTI4aSopbWFzazhiaXQpOyAvL2xvd2NsegorICAgIHJlczh4MTZfc3dhcCA9IF9tbV9hbmRfc2kxMjgocmVzOHgxNl9zd2FwLCAqKF9fbTEyOGkqKW1hc2s4Yml0KTsgLy9oaWNsegorICAgIGM3ID0gX21tX2NtcGd0X2VwaTE2KHJlczh4MTZfc3dhcCwgYzcpOyAvLyBzaG93cyB0aGUgbmVlZCB0byBhZGQgbG93Y2x6IHplcm9zCisgICAgcmVzOHgxNiA9IF9tbV9hbmRfc2kxMjgocmVzOHgxNiwgYzcpOyAvL2xvd2NsegorICAgIHJldHVybiBfbW1fYWRkX2VwaTE2KHJlczh4MTZfc3dhcCwgcmVzOHgxNik7Cit9CisKK2ludDMyeDRfdCB2Y2x6cV9zMzIoaW50MzJ4NF90IGEpOyAvLyBWQ0xaLkkzMiBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3QgdmNsenFfczMyKGludDMyeDRfdCBhKQoreworICAgIF9fbTEyOGkgYzU1NTU1NTU1LCBjMzMzMzMzMzMsIGMwZjBmMGYwZiwgYzNmLCBjMzIsIHRtcCwgdG1wMSwgcmVzOworICAgIGM1NTU1NTU1NSA9IF9tbV9zZXQxX2VwaTMyKDB4NTU1NTU1NTUpOworICAgIGMzMzMzMzMzMyA9IF9tbV9zZXQxX2VwaTMyKDB4MzMzMzMzMzMpOworICAgIGMwZjBmMGYwZiA9IF9tbV9zZXQxX2VwaTMyKDB4MGYwZjBmMGYpOworICAgIGMzZiA9IF9tbV9zZXQxX2VwaTMyKDB4M2YpOworICAgIGMzMiA9IF9tbV9zZXQxX2VwaTMyKDMyKTsKKyAgICB0bXAgPSBfbW1fc3JsaV9lcGkzMihhLCAxKTsKKyAgICByZXMgPSBfbW1fb3Jfc2kxMjgodG1wLCBhKTsgLy9hdG1wW2ldIHw9IChhdG1wW2ldID4+IDEpOworICAgIHRtcCA9IF9tbV9zcmxpX2VwaTMyKHJlcywgMik7CisgICAgcmVzID0gX21tX29yX3NpMTI4KHRtcCwgcmVzKTsgLy9hdG1wW2ldIHw9IChhdG1wW2ldID4+IDIpOworICAgIHRtcCA9IF9tbV9zcmxpX2VwaTMyKHJlcywgNCk7CisgICAgcmVzID0gX21tX29yX3NpMTI4KHRtcCwgcmVzKTsgLy9hdG1wW2ldIHw9IChhdG1wW2ldID4+IDQpOworICAgIHRtcCA9IF9tbV9zcmxpX2VwaTMyKHJlcywgOCk7CisgICAgcmVzID0gX21tX29yX3NpMTI4KHRtcCwgcmVzKTsgLy9hdG1wW2ldIHw9IChhdG1wW2ldID4+IDgpOworICAgIHRtcCA9IF9tbV9zcmxpX2VwaTMyKHJlcywgMTYpOworICAgIHJlcyA9IF9tbV9vcl9zaTEyOCh0bXAsIHJlcyk7IC8vYXRtcFtpXSB8PSAoYXRtcFtpXSA+PiAxNik7CisKKyAgICB0bXAgPSBfbW1fc3JsaV9lcGkzMihyZXMsIDEpOworICAgIHRtcCA9IF9tbV9hbmRfc2kxMjgodG1wLCBjNTU1NTU1NTUpOworICAgIHJlcyA9IF9tbV9zdWJfZXBpMzIocmVzLCB0bXApOyAvL2F0bXBbaV0gLT0gKChhdG1wW2ldID4+IDEpICYgMHg1NTU1NTU1NSk7CisKKyAgICB0bXAgPSBfbW1fc3JsaV9lcGkzMihyZXMsIDIpOworICAgIHRtcCA9IF9tbV9hbmRfc2kxMjgodG1wLCBjMzMzMzMzMzMpOworICAgIHRtcDEgPSBfbW1fYW5kX3NpMTI4KHJlcywgYzMzMzMzMzMzKTsKKyAgICByZXMgPSBfbW1fYWRkX2VwaTMyKHRtcCwgdG1wMSk7IC8vYXRtcFtpXSA9ICgoKGF0bXBbaV0gPj4gMikgJiAweDMzMzMzMzMzKSArIChhdG1wW2ldICYgMHgzMzMzMzMzMykpOworCisgICAgdG1wID0gX21tX3NybGlfZXBpMzIocmVzLCA0KTsKKyAgICB0bXAgPSBfbW1fYWRkX2VwaTMyKHRtcCwgcmVzKTsKKyAgICByZXMgPSBfbW1fYW5kX3NpMTI4KHRtcCwgYzBmMGYwZjBmKTsgLy9hdG1wW2ldID0gKCgoYXRtcFtpXSA+PiA0KSArIGF0bXBbaV0pICYgMHgwZjBmMGYwZik7CisKKyAgICB0bXAgPSBfbW1fc3JsaV9lcGkzMihyZXMsIDgpOworICAgIHJlcyA9IF9tbV9hZGRfZXBpMzIodG1wLCByZXMpOyAvL2F0bXBbaV0gKz0gKGF0bXBbaV0gPj4gOCk7CisKKyAgICB0bXAgPSBfbW1fc3JsaV9lcGkzMihyZXMsIDE2KTsKKyAgICByZXMgPSBfbW1fYWRkX2VwaTMyKHRtcCwgcmVzKTsgLy9hdG1wW2ldICs9IChhdG1wW2ldID4+IDE2KTsKKworICAgIHJlcyA9IF9tbV9hbmRfc2kxMjgocmVzLCBjM2YpOyAvL2F0bXBbaV0gPSBhdG1wW2ldICYgMHgwMDAwMDAzZjsKKworICAgIHJldHVybiBfbW1fc3ViX2VwaTMyKGMzMiwgcmVzKTsgLy9yZXNbaV0gPSAzMiAtIGF0bXBbaV07Cit9CisKK3VpbnQ4eDE2X3QgdmNsenFfdTgodWludDh4MTZfdCBhKTsgLy8gVkNMWi5JOCBxMCxxMAorI2RlZmluZSB2Y2x6cV91OCB2Y2x6cV9zOAorCit1aW50MTZ4OF90IHZjbHpxX3UxNih1aW50MTZ4OF90IGEpOyAvLyBWQ0xaLkkxNiBxMCxxMAorI2RlZmluZSB2Y2x6cV91MTYgdmNsenFfczE2CisKK3VpbnQzMng0X3QgdmNsenFfdTMyKHVpbnQzMng0X3QgYSk7IC8vIFZDTFouSTMyIHEwLHEwCisjZGVmaW5lIHZjbHpxX3UzMiB2Y2x6cV9zMzIKKworLy8qKioqKioqKioqKioqKiBDb3VudCBsZWFkaW5nIHNpZ24gYml0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9WQ0xTIChWZWN0b3IgQ291bnQgTGVhZGluZyBTaWduIGJpdHMpIGNvdW50cyB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGJpdHMgZm9sbG93aW5nCisvLyB0aGUgdG9wbW9zdCBiaXQsIHRoYXQgYXJlIHRoZSBzYW1lIGFzIHRoZSB0b3Btb3N0IGJpdCwgaW4gZWFjaCBlbGVtZW50IGluIGEgdmVjdG9yCisvL05vIGNvcnJlc3BvbmRpbmcgdmVjdG9yIGludHJpbnNpY3MgaW4gSUEzMiwgbmVlZCB0byBpbXBsZW1lbnQgaXQuCisvL1doaWxlIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBlZmZlY3RpdmUgZm9yIDggYml0cywgaXQgbWF5IGJlIG5vdCBmb3IgMTYgYW5kIDMyIGJpdHMKK2ludDh4OF90IHZjbHNfczgoaW50OHg4X3QgYSk7IC8vIFZDTFMuUzggZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3QgdmNsc19zOChpbnQ4eDhfdCBhKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IHZjbHNxX3M4KF9wTTEyOGkoYSkpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDE2eDRfdCB2Y2xzX3MxNihpbnQxNng0X3QgYSk7IC8vIFZDTFMuUzE2IGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2Y2xzX3MxNihpbnQxNng0X3QgYSkKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdmNsc3FfczE2KF9wTTEyOGkoYSkpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDMyeDJfdCB2Y2xzX3MzMihpbnQzMngyX3QgYSk7IC8vIFZDTFMuUzMyIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2Y2xzX3MzMihpbnQzMngyX3QgYSkKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdmNsc3FfczMyKF9wTTEyOGkoYSkpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDh4MTZfdCB2Y2xzcV9zOChpbnQ4eDE2X3QgYSk7IC8vIFZDTFMuUzggcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90IHZjbHNxX3M4KGludDh4MTZfdCBhKQoreworICAgIF9fbTEyOGkgY2ZmLCBjODAsIGMxLCBhX21hc2ssIGFfbmVnLCBhX3BvcywgYV9jb21iOworICAgIGNmZiA9IF9tbV9jbXBlcV9lcGk4IChhLGEpOyAvLzB4ZmYKKyAgICBjODAgPSBfbW1fc2V0MV9lcGk4KDB4ODApOworICAgIGMxID0gX21tX3NldDFfZXBpOCgxKTsKKyAgICBhX21hc2sgPSBfbW1fYW5kX3NpMTI4KGEsIGM4MCk7CisgICAgYV9tYXNrID0gX21tX2NtcGVxX2VwaTgoYV9tYXNrLCBjODApOyAvLzB4ZmYgaWYgbmVnYXRpdmUgaW5wdXQgYW5kIDAgaWYgcG9zaXRpdmUKKyAgICBhX25lZyA9IF9tbV94b3Jfc2kxMjgoYSwgY2ZmKTsKKyAgICBhX25lZyA9IF9tbV9hbmRfc2kxMjgoYV9tYXNrLCBhX25lZyk7CisgICAgYV9wb3MgPSBfbW1fYW5kbm90X3NpMTI4KGFfbWFzaywgYSk7CisgICAgYV9jb21iID0gX21tX29yX3NpMTI4KGFfcG9zLCBhX25lZyk7CisgICAgYV9jb21iID0gdmNsenFfczgoYV9jb21iKTsKKyAgICByZXR1cm4gX21tX3N1Yl9lcGk4KGFfY29tYiwgYzEpOworfQorCitpbnQxNng4X3QgdmNsc3FfczE2KGludDE2eDhfdCBhKTsgLy8gVkNMUy5TMTYgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZjbHNxX3MxNihpbnQxNng4X3QgYSkKK3sKKyAgICBfX20xMjhpIGNmZmZmLCBjODAwMCwgYzEsIGFfbWFzaywgYV9uZWcsIGFfcG9zLCBhX2NvbWI7CisgICAgY2ZmZmYgPSBfbW1fY21wZXFfZXBpMTYoYSxhKTsKKyAgICBjODAwMCA9ICBfbW1fc2xsaV9lcGkxNihjZmZmZiwgMTUpOyAvLzB4ODAwMAorICAgIGMxID0gX21tX3NybGlfZXBpMTYoY2ZmZmYsMTUpOyAvLzB4MQorICAgIGFfbWFzayA9IF9tbV9hbmRfc2kxMjgoYSwgYzgwMDApOworICAgIGFfbWFzayA9IF9tbV9jbXBlcV9lcGkxNihhX21hc2ssIGM4MDAwKTsgLy8weGZmZmYgaWYgbmVnYXRpdmUgaW5wdXQgYW5kIDAgaWYgcG9zaXRpdmUKKyAgICBhX25lZyA9IF9tbV94b3Jfc2kxMjgoYSwgY2ZmZmYpOworICAgIGFfbmVnID0gX21tX2FuZF9zaTEyOChhX21hc2ssIGFfbmVnKTsKKyAgICBhX3BvcyA9IF9tbV9hbmRub3Rfc2kxMjgoYV9tYXNrLCBhKTsKKyAgICBhX2NvbWIgPSBfbW1fb3Jfc2kxMjgoYV9wb3MsIGFfbmVnKTsKKyAgICBhX2NvbWIgPSB2Y2x6cV9zMTYoYV9jb21iKTsKKyAgICByZXR1cm4gX21tX3N1Yl9lcGkxNihhX2NvbWIsIGMxKTsKK30KKworaW50MzJ4NF90IHZjbHNxX3MzMihpbnQzMng0X3QgYSk7IC8vIFZDTFMuUzMyIHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2Y2xzcV9zMzIoaW50MzJ4NF90IGEpCit7CisgICAgX19tMTI4aSBjZmZmZmZmZmYsIGM4MDAwMDAwMCwgYzEsIGFfbWFzaywgYV9uZWcsIGFfcG9zLCBhX2NvbWI7CisgICAgY2ZmZmZmZmZmID0gX21tX2NtcGVxX2VwaTMyKGEsYSk7CisgICAgYzgwMDAwMDAwID0gIF9tbV9zbGxpX2VwaTMyKGNmZmZmZmZmZiwgMzEpOyAvLzB4ODAwMDAwMDAKKyAgICBjMSA9IF9tbV9zcmxpX2VwaTMyKGNmZmZmZmZmZiwzMSk7IC8vMHgxCisgICAgYV9tYXNrID0gX21tX2FuZF9zaTEyOChhLCBjODAwMDAwMDApOworICAgIGFfbWFzayA9IF9tbV9jbXBlcV9lcGkzMihhX21hc2ssIGM4MDAwMDAwMCk7IC8vMHhmZmZmZmZmZiBpZiBuZWdhdGl2ZSBpbnB1dCBhbmQgMCBpZiBwb3NpdGl2ZQorICAgIGFfbmVnID0gX21tX3hvcl9zaTEyOChhLCBjZmZmZmZmZmYpOworICAgIGFfbmVnID0gX21tX2FuZF9zaTEyOChhX21hc2ssIGFfbmVnKTsKKyAgICBhX3BvcyA9IF9tbV9hbmRub3Rfc2kxMjgoYV9tYXNrLCBhKTsKKyAgICBhX2NvbWIgPSBfbW1fb3Jfc2kxMjgoYV9wb3MsIGFfbmVnKTsKKyAgICBhX2NvbWIgPSB2Y2x6cV9zMzIoYV9jb21iKTsKKyAgICByZXR1cm4gX21tX3N1Yl9lcGkzMihhX2NvbWIsIGMxKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqIENvdW50IG51bWJlciBvZiBzZXQgYml0cyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vTm8gY29ycmVzcG9uZGluZyBTSU1EIHNvbHV0aW9uLiBPbmUgb3B0aW9uIGlzIHRvIGdldCBhIGVsZW1lbnRzLCBjb252ZXJ0IGl0IHRvIDMyIGJpdHMgYW5kIHRoZW4gdXNlIFNTRTQuMiAgX21tX3BvcGNudF9fdTMyICh1bnNpZ25lZCBpbnQgdikgZm9yIGVhY2ggZWxlbWVudAorLy9hbm90aGVyIG9wdGlvbiBpcyB0byBkbyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobToKKwordWludDh4OF90IHZjbnRfdTgodWludDh4OF90IGEpOyAvLyBWQ05ULjggZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4OF90IHZjbnRfdTgodWludDh4OF90IGEpCit7CisgICAgdWludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IHZjbnRxX3U4KF9wTTEyOGkoYSkpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDh4OF90IHZjbnRfczgoaW50OHg4X3QgYSk7IC8vIFZDTlQuOCBkMCxkMAorI2RlZmluZSB2Y250X3M4IHZjbnRfdTgKKworcG9seTh4OF90IHZjbnRfcDgocG9seTh4OF90IGEpOyAvLyBWQ05ULjggZDAsZDAKKyNkZWZpbmUgdmNudF9wOCB2Y250X3U4CisKK3VpbnQ4eDE2X3QgdmNudHFfdTgodWludDh4MTZfdCBhKTsgLy8gVkNOVC44IHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIHVpbnQ4eDE2X3QgdmNudHFfdTgodWludDh4MTZfdCBhKQoreworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFza19QT1BDT1VOVFsxNl0gPSB7IC8qIDAgKi8gMCwvKiAxICovIDEsLyogMiAqLyAxLC8qIDMgKi8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNCAqLyAxLC8qIDUgKi8gMiwvKiA2ICovIDIsLyogNyAqLyAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4ICovIDEsLyogOSAqLyAyLC8qIGEgKi8gMiwvKiBiICovIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGMgKi8gMiwvKiBkICovIDMsLyogZSAqLyAzLC8qIGYgKi8gNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICBfX20xMjhpIG1hc2tMT1csIG1hc2ssIGxvd3BvcGNudCwgaGlwb3BjbnQ7CisgICAgbWFza0xPVyA9IF9tbV9zZXQxX2VwaTgoMHgwZik7IC8vbG93IDQgYml0cywgbmVlZCBtYXNraW5nIHRvIGF2b2lkIHplcm8gaWYgTVNCIGlzIHNldAorICAgIG1hc2sgPSBfbW1fYW5kX3NpMTI4KGEsIG1hc2tMT1cpOworICAgIGxvd3BvcGNudCA9IF9tbV9zaHVmZmxlX2VwaTgoICooX19tMTI4aSopbWFza19QT1BDT1VOVCwgbWFzayk7IC8vdXNlcyBsb3cgNCBiaXRzIGFueXdheQorICAgIG1hc2sgPSAgX21tX3NybGlfZXBpMTYoYSwgNCk7IC8vZ2V0IGhpZ2ggNCBiaXRzIGFzIGxvdyBiaXRzCisgICAgbWFzayA9IF9tbV9hbmRfc2kxMjgobWFzaywgbWFza0xPVyk7IC8vbG93IDQgYml0cywgbmVlZCBtYXNraW5nIHRvIGF2b2lkIHplcm8gaWYgTVNCIGlzIHNldAorICAgIGhpcG9wY250ID0gX21tX3NodWZmbGVfZXBpOCggKihfX20xMjhpKikgbWFza19QT1BDT1VOVCwgbWFzayk7IC8vdXNlcyBsb3cgNCBiaXRzIGFueXdheQorICAgIHJldHVybiBfbW1fYWRkX2VwaTgobG93cG9wY250LCBoaXBvcGNudCk7Cit9CisKK2ludDh4MTZfdCB2Y250cV9zOChpbnQ4eDE2X3QgYSk7IC8vIFZDTlQuOCBxMCxxMAorI2RlZmluZSB2Y250cV9zOCB2Y250cV91OAorCitwb2x5OHgxNl90IHZjbnRxX3A4KHBvbHk4eDE2X3QgYSk7IC8vIFZDTlQuOCBxMCxxMAorI2RlZmluZSB2Y250cV9wOCB2Y250cV91OAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqIExvZ2ljYWwgb3BlcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEJpdHdpc2Ugbm90ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL3NldmVyYWwgQml0d2lzZSBub3QgaW1wbGVtZW50YXRpb25zIHBvc3NpYmxlIGZvciBTSU1ELiBFZyAieG9yIiB3aXRoIGFsbCBvbmVzLCBidXQgdGhlIGZvbGxvd2luZyBvbmUgZ2l2ZXMgZ29vZCBwZXJmb3JtYW5jZQoraW50OHg4X3Qgdm12bl9zOChpbnQ4eDhfdCBhKTsgLy8gVk1WTiBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2bXZuX3M4KGludDh4OF90IGEpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdm12bnFfczgoX3BNMTI4aShhKSk7CisgICAgcmV0dXJuNjQocmVzKTsKK30KKworaW50MTZ4NF90IHZtdm5fczE2KGludDE2eDRfdCBhKTsgLy8gVk1WTiBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0X3Qgdm12bl9zMTYoaW50MTZ4NF90IGEpCit7CisgICAgaW50MTZ4NF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IHZtdm5xX3MxNihfcE0xMjhpKGEpKTsKKyAgICByZXR1cm42NChyZXMpOworfQorCitpbnQzMngyX3Qgdm12bl9zMzIoaW50MzJ4Ml90IGEpOyAvLyBWTVZOIGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2bXZuX3MzMihpbnQzMngyX3QgYSkKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgX19tMTI4aSByZXM7CisgICAgcmVzID0gdm12bnFfczMyKF9wTTEyOGkoYSkpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK3VpbnQ4eDhfdCB2bXZuX3U4KHVpbnQ4eDhfdCBhKTsgLy8gVk1WTiBkMCxkMAorI2RlZmluZSB2bXZuX3U4IHZtdm5fczgKKwordWludDE2eDRfdCB2bXZuX3UxNih1aW50MTZ4NF90IGEpOyAvLyBWTVZOIGQwLGQwCisjZGVmaW5lIHZtdm5fdTE2IHZtdm5fczE2CisKK3VpbnQzMngyX3Qgdm12bl91MzIodWludDMyeDJfdCBhKTsgLy8gVk1WTiBkMCxkMAorI2RlZmluZSB2bXZuX3UzMiB2bXZuX3MzMgorCitwb2x5OHg4X3Qgdm12bl9wOChwb2x5OHg4X3QgYSk7IC8vIFZNVk4gZDAsZDAKKyNkZWZpbmUgdm12bl9wOCB2bXZuX3U4CisKK2ludDh4MTZfdCB2bXZucV9zOChpbnQ4eDE2X3QgYSk7IC8vIFZNVk4gcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNl90IHZtdm5xX3M4KGludDh4MTZfdCBhKSAvLyBWTVZOIHEwLHEwCit7CisgICAgX19tMTI4aSBjMTsKKyAgICBjMSA9IF9tbV9jbXBlcV9lcGk4IChhLGEpOyAvLzB4ZmYKKyAgICByZXR1cm4gX21tX2FuZG5vdF9zaTEyOCAoYSwgYzEpOworfQorCitpbnQxNng4X3Qgdm12bnFfczE2KGludDE2eDhfdCBhKTsgLy8gVk1WTiBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQxNng4X3Qgdm12bnFfczE2KGludDE2eDhfdCBhKSAvLyBWTVZOIHEwLHEwCit7CisgICAgX19tMTI4aSBjMTsKKyAgICBjMSA9IF9tbV9jbXBlcV9lcGkxNiAoYSxhKTsgLy8weGZmZmYKKyAgICByZXR1cm4gX21tX2FuZG5vdF9zaTEyOCAoYSwgYzEpOworfQorCitpbnQzMng0X3Qgdm12bnFfczMyKGludDMyeDRfdCBhKTsgLy8gVk1WTiBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0X3Qgdm12bnFfczMyKGludDMyeDRfdCBhKSAvLyBWTVZOIHEwLHEwCit7CisgICAgX19tMTI4aSBjMTsKKyAgICBjMSA9IF9tbV9jbXBlcV9lcGkzMiAoYSxhKTsgLy8weGZmZmZmZmZmCisgICAgcmV0dXJuIF9tbV9hbmRub3Rfc2kxMjggKGEsIGMxKTsKK30KKwordWludDh4MTZfdCB2bXZucV91OCh1aW50OHgxNl90IGEpOyAvLyBWTVZOIHEwLHEwCisjZGVmaW5lIHZtdm5xX3U4IHZtdm5xX3M4CisKK3VpbnQxNng4X3Qgdm12bnFfdTE2KHVpbnQxNng4X3QgYSk7IC8vIFZNVk4gcTAscTAKKyNkZWZpbmUgdm12bnFfdTE2IHZtdm5xX3MxNgorCit1aW50MzJ4NF90IHZtdm5xX3UzMih1aW50MzJ4NF90IGEpOyAvLyBWTVZOIHEwLHEwCisjZGVmaW5lIHZtdm5xX3UzMiB2bXZucV9zMzIKKworcG9seTh4MTZfdCB2bXZucV9wOChwb2x5OHgxNl90IGEpOyAvLyBWTVZOIHEwLHEwCisjZGVmaW5lIHZtdm5xX3A4IHZtdm5xX3U4CisKKy8vKioqKioqKioqKioqKioqKioqIEJpdHdpc2UgYW5kICoqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgdmFuZF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVkFORCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2YW5kX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX2FuZF9zaTEyOChfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworaW50MTZ4NF90IHZhbmRfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZBTkQgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZhbmRfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX2FuZF9zaTEyOChfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworaW50MzJ4Ml90IHZhbmRfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZBTkQgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4Ml90IHZhbmRfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX2FuZF9zaTEyOChfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCitpbnQ2NHgxX3QgdmFuZF9zNjQoaW50NjR4MV90IGEsICBpbnQ2NHgxX3QgYik7IC8vIFZBTkQgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4MV90IHZhbmRfczY0KGludDY0eDFfdCBhLCAgaW50NjR4MV90IGIpCit7CisgICAgaW50NjR4MV90IHJlczsKKyAgICByZXMubTY0X2k2NFswXSA9IGEubTY0X2k2NFswXSAmIGIubTY0X2k2NFswXTsKKyAgICByZXR1cm4gcmVzOworfQorCit1aW50OHg4X3QgdmFuZF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWQU5EIGQwLGQwLGQwCisjZGVmaW5lIHZhbmRfdTggdmFuZF9zOAorCit1aW50MTZ4NF90IHZhbmRfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVkFORCBkMCxkMCxkMAorI2RlZmluZSB2YW5kX3UxNiB2YW5kX3MxNgorCit1aW50MzJ4Ml90IHZhbmRfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVkFORCBkMCxkMCxkMAorI2RlZmluZSB2YW5kX3UzMiB2YW5kX3MzMgorCit1aW50NjR4MV90IHZhbmRfdTY0KHVpbnQ2NHgxX3QgYSwgIHVpbnQ2NHgxX3QgYik7IC8vIFZBTkQgZDAsZDAsZDAKKyNkZWZpbmUgdmFuZF91NjQgdmFuZF9zNjQKKworCitpbnQ4eDE2X3QgICB2YW5kcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWQU5EIHEwLHEwLHEwCisjZGVmaW5lIHZhbmRxX3M4IF9tbV9hbmRfc2kxMjgKKworaW50MTZ4OF90ICAgdmFuZHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZBTkQgcTAscTAscTAKKyNkZWZpbmUgdmFuZHFfczE2IF9tbV9hbmRfc2kxMjgKKworaW50MzJ4NF90ICAgdmFuZHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZBTkQgcTAscTAscTAKKyNkZWZpbmUgdmFuZHFfczMyIF9tbV9hbmRfc2kxMjgKKworaW50NjR4Ml90ICAgdmFuZHFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZBTkQgcTAscTAscTAKKyNkZWZpbmUgdmFuZHFfczY0IF9tbV9hbmRfc2kxMjgKKwordWludDh4MTZfdCAgIHZhbmRxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVkFORCBxMCxxMCxxMAorI2RlZmluZSB2YW5kcV91OCBfbW1fYW5kX3NpMTI4CisKK3VpbnQxNng4X3QgICB2YW5kcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWQU5EIHEwLHEwLHEwCisjZGVmaW5lIHZhbmRxX3UxNiBfbW1fYW5kX3NpMTI4CisKK3VpbnQzMng0X3QgICB2YW5kcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWQU5EIHEwLHEwLHEwCisjZGVmaW5lIHZhbmRxX3UzMiBfbW1fYW5kX3NpMTI4CisKK3VpbnQ2NHgyX3QgICB2YW5kcV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpOyAvLyBWQU5EIHEwLHEwLHEwCisjZGVmaW5lIHZhbmRxX3U2NCBfbW1fYW5kX3NpMTI4CisKKy8vKioqKioqKioqKioqKioqKioqKiogQml0d2lzZSBvciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbnQ4eDhfdCB2b3JyX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWT1JSIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90IHZvcnJfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NChfbW1fb3Jfc2kxMjgoX3BNMTI4aShhKSxfcE0xMjhpKGIpKSk7Cit9CisKKworaW50MTZ4NF90IHZvcnJfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZPUlIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4NF90IHZvcnJfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikKK3sKKyAgICBpbnQxNng0X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX29yX3NpMTI4KF9wTTEyOGkoYSksX3BNMTI4aShiKSkpOworfQorCisKK2ludDMyeDJfdCB2b3JyX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWT1JSIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDJfdCB2b3JyX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpCit7CisgICAgaW50MzJ4Ml90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9vcl9zaTEyOChfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworCitpbnQ2NHgxX3Qgdm9ycl9zNjQoaW50NjR4MV90IGEsICBpbnQ2NHgxX3QgYik7IC8vIFZPUlIgZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50NjR4MV90IHZvcnJfczY0KGludDY0eDFfdCBhLCAgaW50NjR4MV90IGIpCit7CisgICAgaW50NjR4MV90IHJlczsKKyAgICByZXMubTY0X2k2NFswXSA9IGEubTY0X2k2NFswXSB8IGIubTY0X2k2NFswXTsKKyAgICByZXR1cm4gcmVzOworfQorCit1aW50OHg4X3Qgdm9ycl91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWT1JSIGQwLGQwLGQwCisjZGVmaW5lIHZvcnJfdTggdm9ycl9zOAorCit1aW50MTZ4NF90IHZvcnJfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVk9SUiBkMCxkMCxkMAorI2RlZmluZSB2b3JyX3UxNiB2b3JyX3MxNgorCit1aW50MzJ4Ml90IHZvcnJfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVk9SUiBkMCxkMCxkMAorI2RlZmluZSB2b3JyX3UzMiB2b3JyX3MzMgorCit1aW50NjR4MV90IHZvcnJfdTY0KHVpbnQ2NHgxX3QgYSwgIHVpbnQ2NHgxX3QgYik7IC8vIFZPUlIgZDAsZDAsZDAKKyNkZWZpbmUgdm9ycl91NjQgdm9ycl9zNjQKKworaW50OHgxNl90ICAgdm9ycnFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVk9SUiBxMCxxMCxxMAorI2RlZmluZSB2b3JycV9zOCBfbW1fb3Jfc2kxMjgKKworaW50MTZ4OF90ICAgdm9ycnFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZPUlIgcTAscTAscTAKKyNkZWZpbmUgdm9ycnFfczE2IF9tbV9vcl9zaTEyOAorCitpbnQzMng0X3QgICB2b3JycV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVk9SUiBxMCxxMCxxMAorI2RlZmluZSB2b3JycV9zMzIgX21tX29yX3NpMTI4CisKK2ludDY0eDJfdCAgIHZvcnJxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpOyAvLyBWT1JSIHEwLHEwLHEwCisjZGVmaW5lIHZvcnJxX3M2NCBfbW1fb3Jfc2kxMjgKKwordWludDh4MTZfdCAgIHZvcnJxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVk9SUiBxMCxxMCxxMAorI2RlZmluZSB2b3JycV91OCBfbW1fb3Jfc2kxMjgKKwordWludDE2eDhfdCAgIHZvcnJxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYik7IC8vIFZPUlIgcTAscTAscTAKKyNkZWZpbmUgdm9ycnFfdTE2IF9tbV9vcl9zaTEyOAorCit1aW50MzJ4NF90ICAgdm9ycnFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKTsgLy8gVk9SUiBxMCxxMCxxMAorI2RlZmluZSB2b3JycV91MzIgX21tX29yX3NpMTI4CisKK3VpbnQ2NHgyX3QgICB2b3JycV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpOyAvLyBWT1JSIHEwLHEwLHEwCisjZGVmaW5lIHZvcnJxX3U2NCBfbW1fb3Jfc2kxMjgKKworLy8qKioqKioqKioqKioqIEJpdHdpc2UgZXhjbHVzaXZlIG9yIChFT1Igb3IgWE9SKSAqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50OHg4X3QgdmVvcl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKTsgLy8gVkVPUiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2ZW9yX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpCit7CisgICAgaW50OHg4X3QgcmVzNjQ7CisgICAgcmV0dXJuNjQoX21tX3hvcl9zaTEyOChfcE0xMjhpKGEpLF9wTTEyOGkoYikpKTsKK30KKworaW50MTZ4NF90IHZlb3JfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZFT1IgZDAsZDAsZDAKKyNkZWZpbmUgdmVvcl9zMTYgdmVvcl9zOAorCitpbnQzMngyX3QgdmVvcl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVkVPUiBkMCxkMCxkMAorI2RlZmluZSB2ZW9yX3MzMiB2ZW9yX3M4CisKK2ludDY0eDFfdCB2ZW9yX3M2NChpbnQ2NHgxX3QgYSwgIGludDY0eDFfdCBiKTsgLy8gVkVPUiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgxX3QgdmVvcl9zNjQoaW50NjR4MV90IGEsICBpbnQ2NHgxX3QgYikKK3sKKyAgICBpbnQ2NHgxX3QgcmVzOworICAgIHJlcy5tNjRfaTY0WzBdID0gYS5tNjRfaTY0WzBdIF4gYi5tNjRfaTY0WzBdOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ4eDhfdCB2ZW9yX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZFT1IgZDAsZDAsZDAKKyNkZWZpbmUgdmVvcl91OCB2ZW9yX3M4CisKK3VpbnQxNng0X3QgdmVvcl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpOyAvLyBWRU9SIGQwLGQwLGQwCisjZGVmaW5lIHZlb3JfdTE2IHZlb3JfczE2CisKK3VpbnQzMngyX3QgdmVvcl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWRU9SIGQwLGQwLGQwCisjZGVmaW5lIHZlb3JfdTMyIHZlb3JfczMyCisKK3VpbnQ2NHgxX3QgdmVvcl91NjQodWludDY0eDFfdCBhLCAgdWludDY0eDFfdCBiKTsgLy8gVkVPUiBkMCxkMCxkMAorI2RlZmluZSB2ZW9yX3U2NCB2ZW9yX3M2NAorCitpbnQ4eDE2X3QgICB2ZW9ycV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWRU9SIHEwLHEwLHEwCisjZGVmaW5lIHZlb3JxX3M4IF9tbV94b3Jfc2kxMjgKKworaW50MTZ4OF90ICAgdmVvcnFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZFT1IgcTAscTAscTAKKyNkZWZpbmUgdmVvcnFfczE2IF9tbV94b3Jfc2kxMjgKKworaW50MzJ4NF90ICAgdmVvcnFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYik7IC8vIFZFT1IgcTAscTAscTAKKyNkZWZpbmUgdmVvcnFfczMyIF9tbV94b3Jfc2kxMjgKKworaW50NjR4Ml90ICAgdmVvcnFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYik7IC8vIFZFT1IgcTAscTAscTAKKyNkZWZpbmUgdmVvcnFfczY0IF9tbV94b3Jfc2kxMjgKKwordWludDh4MTZfdCAgIHZlb3JxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVkVPUiBxMCxxMCxxMAorI2RlZmluZSB2ZW9ycV91OCBfbW1feG9yX3NpMTI4CisKK3VpbnQxNng4X3QgICB2ZW9ycV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWRU9SIHEwLHEwLHEwCisjZGVmaW5lIHZlb3JxX3UxNiBfbW1feG9yX3NpMTI4CisKK3VpbnQzMng0X3QgICB2ZW9ycV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWRU9SIHEwLHEwLHEwCisjZGVmaW5lIHZlb3JxX3UzMiBfbW1feG9yX3NpMTI4CisKK3VpbnQ2NHgyX3QgICB2ZW9ycV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpOyAvLyBWRU9SIHEwLHEwLHEwCisjZGVmaW5lIHZlb3JxX3U2NCBfbW1feG9yX3NpMTI4CisKKy8vKioqKioqKioqKioqKioqKioqKioqKiBCaXQgQ2xlYXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvL0xvZ2ljYWwgQU5EIGNvbXBsZW1lbnQgKEFORCBuZWdhdGlvbiBvciBBTkQgTk9UKQoraW50OHg4X3QgICB2YmljX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWQklDIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4OF90ICAgdmJpY19zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIHJldHVybjY0KF9tbV9hbmRub3Rfc2kxMjgoX3BNMTI4aShiKSxfcE0xMjhpKGEpKSk7IC8vbm90aWNlIHRoZSBhcmd1bWVudHMgInN3YXAiCit9CisKK2ludDE2eDRfdCAgIHZiaWNfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYik7IC8vIFZCSUMgZDAsZDAsZDAKKyNkZWZpbmUgdmJpY19zMTYgdmJpY19zOAorCitpbnQzMngyX3QgICB2YmljX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpOyAvLyBWQklDIGQwLGQwLGQwCisjZGVmaW5lIHZiaWNfczMyIHZiaWNfczgKKworaW50NjR4MV90ICAgdmJpY19zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVkJJQyBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgxX3QgICB2YmljX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpCit7CisgICAgaW50NjR4MV90IHJlczsKKyAgICByZXMubTY0X2k2NFswXSA9IGEubTY0X2k2NFswXSAmICh+Yi5tNjRfaTY0WzBdKTsKKyAgICByZXR1cm4gcmVzOworfQorCit1aW50OHg4X3QgICB2YmljX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZCSUMgZDAsZDAsZDAKKyNkZWZpbmUgdmJpY191OCB2YmljX3M4CisKK3VpbnQxNng0X3QgICB2YmljX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZCSUMgZDAsZDAsZDAKKyNkZWZpbmUgdmJpY191MTYgdmJpY19zMTYKKwordWludDMyeDJfdCAgIHZiaWNfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVkJJQyBkMCxkMCxkMAorI2RlZmluZSB2YmljX3UzMiB2YmljX3MzMgorCit1aW50NjR4MV90ICAgdmJpY191NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIpOyAvLyBWQklDIGQwLGQwLGQwCisjZGVmaW5lIHZiaWNfdTY0IHZiaWNfczY0CisKK2ludDh4MTZfdCAgIHZiaWNxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZCSUMgcTAscTAscTAKKyNkZWZpbmUgdmJpY3FfczgoYSxiKSBfbW1fYW5kbm90X3NpMTI4IChiLGEpIC8vbm90aWNlIGFyZ3VtZW50cyAic3dhcCIKKworaW50MTZ4OF90ICAgdmJpY3FfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZCSUMgcTAscTAscTAKKyNkZWZpbmUgdmJpY3FfczE2KGEsYikgX21tX2FuZG5vdF9zaTEyOCAoYixhKSAvL25vdGljZSBhcmd1bWVudHMgInN3YXAiCisKK2ludDMyeDRfdCAgIHZiaWNxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWQklDIHEwLHEwLHEwCisjZGVmaW5lIHZiaWNxX3MzMihhLGIpIF9tbV9hbmRub3Rfc2kxMjggKGIsYSkgLy9ub3RpY2UgYXJndW1lbnRzICJzd2FwIgorCitpbnQ2NHgyX3QgICB2YmljcV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVkJJQyBxMCxxMCxxMAorI2RlZmluZSB2YmljcV9zNjQoYSxiKSBfbW1fYW5kbm90X3NpMTI4IChiLGEpIC8vbm90aWNlIGFyZ3VtZW50cyAic3dhcCIKKwordWludDh4MTZfdCAgIHZiaWNxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVkJJQyBxMCxxMCxxMAorI2RlZmluZSB2YmljcV91OChhLGIpIF9tbV9hbmRub3Rfc2kxMjggKGIsYSkgLy9ub3RpY2UgYXJndW1lbnRzICJzd2FwIgorCit1aW50MTZ4OF90ICAgdmJpY3FfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVkJJQyBxMCxxMCxxMAorI2RlZmluZSB2YmljcV91MTYoYSxiKSBfbW1fYW5kbm90X3NpMTI4IChiLGEpIC8vbm90aWNlIGFyZ3VtZW50cyAic3dhcCIKKwordWludDMyeDRfdCAgIHZiaWNxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZCSUMgcTAscTAscTAKKyNkZWZpbmUgdmJpY3FfdTMyKGEsYikgX21tX2FuZG5vdF9zaTEyOCAoYixhKSAvL25vdGljZSBhcmd1bWVudHMgInN3YXAiCisKK3VpbnQ2NHgyX3QgICB2YmljcV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpOyAvLyBWQklDIHEwLHEwLHEwCisjZGVmaW5lIHZiaWNxX3U2NChhLGIpIF9tbV9hbmRub3Rfc2kxMjggKGIsYSkgLy9ub3RpY2UgYXJndW1lbnRzICJzd2FwIgorCisvLyoqKioqKioqKioqKioqKiogQml0d2lzZSBPUiBjb21wbGVtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vbm8gZXhhY3QgSUEgMzIgbWF0Y2gsIG5lZWQgdG8gaW1wbGVtZW50IGl0IGFzIGZvbGxvd2luZworaW50OHg4X3Qgdm9ybl9zOChpbnQ4eDhfdCBhLCAgaW50OHg4X3QgYik7IC8vIFZPUk4gZDAsZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4X3Qgdm9ybl9zOChpbnQ4eDhfdCBhLCAgaW50OHg4X3QgYikKK3sKKyAgICBpbnQ4eDhfdCByZXM2NDsKKyAgICByZXR1cm42NCh2b3JucV9zOChfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKSk7Cit9CisKKworaW50MTZ4NF90IHZvcm5fczE2KGludDE2eDRfdCBhLCAgaW50MTZ4NF90IGIpOyAvLyBWT1JOIGQwLGQwLGQwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDRfdCB2b3JuX3MxNihpbnQxNng0X3QgYSwgIGludDE2eDRfdCBiKQoreworICAgIGludDE2eDRfdCByZXM2NDsKKyAgICByZXR1cm42NCh2b3JucV9zMTYoX3BNMTI4aShhKSwgX3BNMTI4aShiKSkpOworfQorCisKK2ludDMyeDJfdCB2b3JuX3MzMihpbnQzMngyX3QgYSwgIGludDMyeDJfdCBiKTsgLy8gVk9STiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyX3Qgdm9ybl9zMzIoaW50MzJ4Ml90IGEsICBpbnQzMngyX3QgYikKK3sKKyAgICBpbnQzMngyX3QgcmVzNjQ7CisgICAgcmV0dXJuNjQodm9ybnFfczMyKF9wTTEyOGkoYSksIF9wTTEyOGkoYikpKTsKK30KKworCitpbnQ2NHgxX3Qgdm9ybl9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKTsgLy8gVk9STiBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgxX3Qgdm9ybl9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKQoreworICAgIGludDY0eDFfdCByZXM7CisgICAgcmVzLm02NF9pNjRbMF0gPSBhLm02NF9pNjRbMF0gfCAofmIubTY0X2k2NFswXSk7CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDh4OF90IHZvcm5fdTgodWludDh4OF90IGEsICB1aW50OHg4X3QgYik7IC8vIFZPUk4gZDAsZDAsZDAKKyNkZWZpbmUgdm9ybl91OCB2b3JuX3M4CisKKwordWludDE2eDRfdCB2b3JuX3UxNih1aW50MTZ4NF90IGEsICB1aW50MTZ4NF90IGIpOyAvLyBWT1JOIGQwLGQwLGQwCisjZGVmaW5lIHZvcm5fdTE2IHZvcm5fczE2CisKK3VpbnQzMngyX3Qgdm9ybl91MzIodWludDMyeDJfdCBhLCAgdWludDMyeDJfdCBiKTsgLy8gVk9STiBkMCxkMCxkMAorI2RlZmluZSB2b3JuX3UzMiB2b3JuX3MzMgorCit1aW50NjR4MV90IHZvcm5fdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiKTsgLy8gVk9STiBkMCxkMCxkMAorI2RlZmluZSB2b3JuX3U2NCB2b3JuX3M2NAorCisKK2ludDh4MTZfdCB2b3JucV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWT1JOIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4MTZfdCB2b3JucV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIC8vIFZPUk4gcTAscTAscTAKK3sKKyAgICBfX20xMjhpIGIxOworICAgIGIxID0gdm12bnFfczgoIGIpOyAvL2JpdHdpc2Ugbm90IGZvciBiCisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAoYSwgYjEpOworfQorCitpbnQxNng4X3Qgdm9ybnFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYik7IC8vIFZPUk4gcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50MTZ4OF90IHZvcm5xX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIC8vIFZPUk4gcTAscTAscTAKK3sKKyAgICBfX20xMjhpIGIxOworICAgIGIxID0gdm12bnFfczE2KCBiKTsgLy9iaXR3aXNlIG5vdCBmb3IgYgorICAgIHJldHVybiBfbW1fb3Jfc2kxMjggKGEsIGIxKTsKK30KKworaW50MzJ4NF90IHZvcm5xX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWT1JOIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDRfdCB2b3JucV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSAvLyBWT1JOIHEwLHEwLHEwCit7CisgICAgX19tMTI4aSBiMTsKKyAgICBiMSA9IHZtdm5xX3MzMiggYik7IC8vYml0d2lzZSBub3QgZm9yIGIKKyAgICByZXR1cm4gX21tX29yX3NpMTI4IChhLCBiMSk7Cit9CisKK2ludDY0eDJfdCB2b3JucV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKTsgLy8gVk9STiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgyX3Qgdm9ybnFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYikKK3sKKyAgICBfX20xMjhpIGMxLCBiMTsKKyAgICBjMSA9IF9tbV9jbXBlcV9lcGk4IChhLCBhKTsgLy9hbGwgb25lcyAweGZmZmZmZmYuLi5mZmZmZgorICAgIGIxID0gX21tX2FuZG5vdF9zaTEyOCAoYiwgYzEpOworICAgIHJldHVybiBfbW1fb3Jfc2kxMjggKGEsIGIxKTsKK30KKwordWludDh4MTZfdCB2b3JucV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZPUk4gcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDh4MTZfdCB2b3JucV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgLy8gVk9STiBxMCxxMCxxMAoreworICAgIF9fbTEyOGkgYjE7CisgICAgYjEgPSB2bXZucV91OCggYik7IC8vYml0d2lzZSBub3QgZm9yIGIKKyAgICByZXR1cm4gX21tX29yX3NpMTI4IChhLCBiMSk7Cit9CisKK3VpbnQxNng4X3Qgdm9ybnFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVk9STiBxMCxxMCxxMAorX05FT04yU1NFX0lOTElORSB1aW50MTZ4OF90IHZvcm5xX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYikgLy8gVk9STiBxMCxxMCxxMAoreworICAgIF9fbTEyOGkgYjE7CisgICAgYjEgPSB2bXZucV9zMTYoIGIpOyAvL2JpdHdpc2Ugbm90IGZvciBiCisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAoYSwgYjEpOworfQorCit1aW50MzJ4NF90IHZvcm5xX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZPUk4gcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgdWludDMyeDRfdCB2b3JucV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpIC8vIFZPUk4gcTAscTAscTAKK3sKKyAgICBfX20xMjhpIGIxOworICAgIGIxID0gdm12bnFfdTMyKCBiKTsgLy9iaXR3aXNlIG5vdCBmb3IgYgorICAgIHJldHVybiBfbW1fb3Jfc2kxMjggKGEsIGIxKTsKK30KK3VpbnQ2NHgyX3Qgdm9ybnFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKTsgLy8gVk9STiBxMCxxMCxxMAorI2RlZmluZSB2b3JucV91NjQgdm9ybnFfczY0CisKKy8vKioqKioqKioqKioqKioqKioqKioqIEJpdHdpc2UgU2VsZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9Ob3RlIFRoaXMgaW50cmluc2ljIGNhbiBjb21waWxlIHRvIGFueSBvZiBWQlNML1ZCSUYvVkJJVCBkZXBlbmRpbmcgb24gcmVnaXN0ZXIgYWxsb2NhdGlvbi4oPz8/Pz8/Pz8/KQorCisvL1ZCU0wgKEJpdHdpc2UgU2VsZWN0KSBzZWxlY3RzIGVhY2ggYml0IGZvciB0aGUgZGVzdGluYXRpb24gZnJvbSB0aGUgZmlyc3Qgb3BlcmFuZCBpZiB0aGUKKy8vY29ycmVzcG9uZGluZyBiaXQgb2YgdGhlIGRlc3RpbmF0aW9uIGlzIDEsIG9yIGZyb20gdGhlIHNlY29uZCBvcGVyYW5kIGlmIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBvZiB0aGUgZGVzdGluYXRpb24gaXMgMC4KKworLy9WQklGIChCaXR3aXNlIEluc2VydCBpZiBGYWxzZSkgaW5zZXJ0cyBlYWNoIGJpdCBmcm9tIHRoZSBmaXJzdCBvcGVyYW5kIGludG8gdGhlIGRlc3RpbmF0aW9uCisvL2lmIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgaXMgMCwgb3RoZXJ3aXNlIGxlYXZlcyB0aGUgZGVzdGluYXRpb24gYml0IHVuY2hhbmdlZAorCisvL1ZCSVQgKEJpdHdpc2UgSW5zZXJ0IGlmIFRydWUpIGluc2VydHMgZWFjaCBiaXQgZnJvbSB0aGUgZmlyc3Qgb3BlcmFuZCBpbnRvIHRoZSBkZXN0aW5hdGlvbgorLy9pZiB0aGUgY29ycmVzcG9uZGluZyBiaXQgb2YgdGhlIHNlY29uZCBvcGVyYW5kIGlzIDEsIG90aGVyd2lzZSBsZWF2ZXMgdGhlIGRlc3RpbmF0aW9uIGJpdCB1bmNoYW5nZWQuCisKKy8vVkJTTCBvbmx5IGlzIGltcGxlbWVudGVkIGZvciBTSU1ECitpbnQ4eDhfdCB2YnNsX3M4KHVpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiLCBpbnQ4eDhfdCBjKTsgLy8gVkJTTCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDhfdCB2YnNsX3M4KHVpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiLCBpbnQ4eDhfdCBjKQoreworICAgIGludDh4OF90IHJlczY0OworICAgIF9fbTEyOGkgcmVzOworICAgIHJlcyA9IHZic2xxX3M4KF9wTTEyOGkoYSksIF9wTTEyOGkoYiksIF9wTTEyOGkoYykpOworICAgIHJldHVybjY0KHJlcyk7Cit9CisKK2ludDE2eDRfdCB2YnNsX3MxNih1aW50MTZ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgYyk7IC8vIFZCU0wgZDAsZDAsZDAKKyNkZWZpbmUgdmJzbF9zMTYgdmJzbF9zOAorCitpbnQzMngyX3QgdmJzbF9zMzIodWludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IGMpOyAvLyBWQlNMIGQwLGQwLGQwCisjZGVmaW5lIHZic2xfczMyIHZic2xfczgKKworaW50NjR4MV90IHZic2xfczY0KHVpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIsIGludDY0eDFfdCBjKTsgLy8gVkJTTCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ2NHgxX3QgdmJzbF9zNjQodWludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYiwgaW50NjR4MV90IGMpCit7CisgICAgaW50NjR4MV90IHJlczsKKyAgICByZXMubTY0X2k2NFswXSA9IChhLm02NF9pNjRbMF0gJiBiLm02NF9pNjRbMF0pIHwgKCAofmEubTY0X2k2NFswXSkgJiBjLm02NF9pNjRbMF0pOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ4eDhfdCB2YnNsX3U4KHVpbnQ4eDhfdCBhLCAgdWludDh4OF90IGIsIHVpbnQ4eDhfdCBjKTsgLy8gVkJTTCBkMCxkMCxkMAorI2RlZmluZSB2YnNsX3U4IHZic2xfczgKKwordWludDE2eDRfdCB2YnNsX3UxNih1aW50MTZ4NF90IGEsICB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgYyk7IC8vIFZCU0wgZDAsZDAsZDAKKyNkZWZpbmUgdmJzbF91MTYgdmJzbF9zOAorCit1aW50MzJ4Ml90IHZic2xfdTMyKHVpbnQzMngyX3QgYSwgIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCBjKTsgLy8gVkJTTCBkMCxkMCxkMAorI2RlZmluZSB2YnNsX3UzMiB2YnNsX3M4CisKK3VpbnQ2NHgxX3QgdmJzbF91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIsIHVpbnQ2NHgxX3QgYyk7IC8vIFZCU0wgZDAsZDAsZDAKKyNkZWZpbmUgdmJzbF91NjQgdmJzbF9zNjQKKworZmxvYXQzMngyX3QgdmJzbF9mMzIodWludDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyeDJfdCBjKTsgLy8gVkJTTCBkMCxkMCxkMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDJfdCB2YnNsX2YzMih1aW50MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJ4Ml90IGMpCit7CisgICAgX19tMTI4IHNlbDEsIHNlbDI7CisgICAgX19tNjRfMTI4IHJlczY0OworICAgIHNlbDEgPSBfbW1fYW5kX3BzICAgKF9wTTEyOChhKSwgX3BNMTI4KGIpKTsKKyAgICBzZWwyID0gX21tX2FuZG5vdF9wcyAoX3BNMTI4KGEpLCBfcE0xMjgoYykpOworICAgIHNlbDEgPSBfbW1fb3JfcHMgKHNlbDEsIHNlbDIpOworICAgIF9NNjRmKHJlczY0LCBzZWwxKTsKKyAgICByZXR1cm4gcmVzNjQ7Cit9CisKK3BvbHk4eDhfdCB2YnNsX3A4KHVpbnQ4eDhfdCBhLCBwb2x5OHg4X3QgYiwgcG9seTh4OF90IGMpOyAvLyBWQlNMIGQwLGQwLGQwCisjZGVmaW5lICB2YnNsX3A4IHZic2xfczgKKworcG9seTE2eDRfdCB2YnNsX3AxNih1aW50MTZ4NF90IGEsIHBvbHkxNng0X3QgYiwgcG9seTE2eDRfdCBjKTsgLy8gVkJTTCBkMCxkMCxkMAorI2RlZmluZSAgdmJzbF9wMTYgdmJzbF9zOAorCitpbnQ4eDE2X3QgdmJzbHFfczgodWludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYiwgaW50OHgxNl90IGMpOyAvLyBWQlNMIHEwLHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4MTZfdCB2YnNscV9zOCh1aW50OHgxNl90IGEsIGludDh4MTZfdCBiLCBpbnQ4eDE2X3QgYykgLy8gVkJTTCBxMCxxMCxxMAoreworICAgIF9fbTEyOGkgc2VsMSwgc2VsMjsKKyAgICBzZWwxID0gX21tX2FuZF9zaTEyOCAgIChhLCBiKTsKKyAgICBzZWwyID0gX21tX2FuZG5vdF9zaTEyOCAoYSwgYyk7CisgICAgcmV0dXJuIF9tbV9vcl9zaTEyOCAoc2VsMSwgc2VsMik7Cit9CisKK2ludDE2eDhfdCB2YnNscV9zMTYodWludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4OF90IGMpOyAvLyBWQlNMIHEwLHEwLHEwCisjZGVmaW5lIHZic2xxX3MxNiB2YnNscV9zOAorCitpbnQzMng0X3QgdmJzbHFfczMyKHVpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDRfdCBjKTsgLy8gVkJTTCBxMCxxMCxxMAorI2RlZmluZSB2YnNscV9zMzIgdmJzbHFfczgKKworaW50NjR4Ml90IHZic2xxX3M2NCh1aW50NjR4Ml90IGEsIGludDY0eDJfdCBiLCBpbnQ2NHgyX3QgYyk7IC8vIFZCU0wgcTAscTAscTAKKyNkZWZpbmUgdmJzbHFfczY0IHZic2xxX3M4CisKK3VpbnQ4eDE2X3QgdmJzbHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIsIHVpbnQ4eDE2X3QgYyk7IC8vIFZCU0wgcTAscTAscTAKKyNkZWZpbmUgdmJzbHFfdTggdmJzbHFfczgKKwordWludDE2eDhfdCB2YnNscV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIHVpbnQxNng4X3QgYyk7IC8vIFZCU0wgcTAscTAscTAKKyNkZWZpbmUgdmJzbHFfdTE2IHZic2xxX3M4CisKK3VpbnQzMng0X3QgdmJzbHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiLCB1aW50MzJ4NF90IGMpOyAvLyBWQlNMIHEwLHEwLHEwCisjZGVmaW5lIHZic2xxX3UzMiB2YnNscV9zOAorCit1aW50NjR4Ml90IHZic2xxX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYiwgdWludDY0eDJfdCBjKTsgLy8gVkJTTCBxMCxxMCxxMAorI2RlZmluZSB2YnNscV91NjQgdmJzbHFfczgKKworZmxvYXQzMng0X3QgdmJzbHFfZjMyKHVpbnQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMng0X3QgYyk7IC8vIFZCU0wgcTAscTAscTAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMng0X3QgdmJzbHFfZjMyKHVpbnQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMng0X3QgYykgLy8gVkJTTCBxMCxxMCxxMAoreworICAgIF9fbTEyOCBzZWwxLCBzZWwyOworICAgIHNlbDEgPSBfbW1fYW5kX3BzICAgKCooX19tMTI4KikmYSwgYik7CisgICAgc2VsMiA9IF9tbV9hbmRub3RfcHMgKCooX19tMTI4KikmYSwgYyk7CisgICAgcmV0dXJuIF9tbV9vcl9wcyAoc2VsMSwgc2VsMik7Cit9CisKK3BvbHk4eDE2X3QgdmJzbHFfcDgodWludDh4MTZfdCBhLCBwb2x5OHgxNl90IGIsIHBvbHk4eDE2X3QgYyk7IC8vIFZCU0wgcTAscTAscTAKKyNkZWZpbmUgdmJzbHFfcDggdmJzbHFfdTgKKworcG9seTE2eDhfdCB2YnNscV9wMTYodWludDE2eDhfdCBhLCBwb2x5MTZ4OF90IGIsIHBvbHkxNng4X3QgYyk7IC8vIFZCU0wgcTAscTAscTAKKyNkZWZpbmUgdmJzbHFfcDE2IHZic2xxX3M4CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKiogVHJhbnNwb3NpdGlvbiBvcGVyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqICBWZWN0b3IgVHJhbnNwb3NlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vVlRSTiAoVmVjdG9yIFRyYW5zcG9zZSkgdHJlYXRzIHRoZSBlbGVtZW50cyBvZiBpdHMgb3BlcmFuZCB2ZWN0b3JzIGFzIGVsZW1lbnRzIG9mIDIgeCAyIG1hdHJpY2VzLCBhbmQgdHJhbnNwb3NlcyB0aGUgbWF0cmljZXMuCisvLyBtYWtpbmcgdGhlIHJlc3VsdCBsb29rIGFzIChhMCwgYjAsIGEyLCBiMiwgYTQsIGI0LC4uLi4pIChhMSwgYjEsIGEzLCBiMywgYTUsIGI1LC4uLi4uKQoraW50OHg4eDJfdCB2dHJuX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpOyAvLyBWVFJOLjggZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHg4eDJfdCB2dHJuX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpIC8vIFZUUk4uOCBkMCxkMAoreworICAgIGludDh4OHgyX3QgdmFsOworICAgIF9fbTEyOGkgdG1wLCB2YWwwOworICAgIF9ORU9OMlNTRV9BTElHTl8xNiBpbnQ4X3QgbWFzazE2X2V2ZW5fb2RkWzE2XSA9IHsgMCwxLCA0LDUsIDgsOSwgMTIsMTMsIDIsMywgNiw3LCAxMCwxMSwgMTQsMTV9OyAvL21hc2s4X3RybnNwCisgICAgdG1wID0gX21tX3VucGFja2xvX2VwaTgoX3BNMTI4aShhKSwgX3BNMTI4aShiKSk7IC8vYTAsYjAsYTEsYjEsYTIsYjIsYTMsYjMsLi4uLGE3LGI3CisgICAgdmFsMCA9IF9tbV9zaHVmZmxlX2VwaTggKHRtcCwgKihfX20xMjhpKiltYXNrMTZfZXZlbl9vZGQpOyAvLyhhMCwgYjAsIGEyLCBiMiwgYTQsIGI0LCBhNiwgYjYpLCAoYTEsYjEsIGEzLGIzLCBhNSxiNSwgYTcsYjcpCisgICAgdnN0MXFfczggKHZhbC52YWwsIHZhbDApOyAvLyBfbW1fc2h1ZmZsZV9lcGkzMiAodmFsLnZhbFswXSwgX1NXQVBfSElfTE9XMzIpOyAvLyhhMSxiMSwgYTMsYjMsIGE1LGI1LCBhNyxiNyksKGEwLCBiMCwgYTIsIGIyLCBhNCwgYjQsIGE2LCBiNiksCisgICAgcmV0dXJuIHZhbDsKK30KKworaW50MTZ4NHgyX3QgdnRybl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlRSTi4xNiBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0eDJfdCB2dHJuX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIC8vIFZUUk4uMTYgZDAsZDAKK3sKKyAgICBpbnQxNng0eDJfdCB2YWw7CisgICAgX19tMTI4aSB0bXAsIHZhbDA7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrZGx2MTZbMTZdID0gezAsMSwgMiwzLCA4LDksIDEwLDExLCA0LDUsIDYsNywgMTIsMTMsIDE0LCAxNX07CisgICAgdG1wID0gX21tX3VucGFja2xvX2VwaTE2KF9wTTEyOGkoYSksIF9wTTEyOGkoYikpOyAvL2EwLGIwLGExLGIxLGEyLGIyLGEzLGIzCisgICAgdmFsMCA9ICBfbW1fc2h1ZmZsZV9lcGk4ICh0bXAsICooX19tMTI4aSopbWFza2RsdjE2KTsgLy9hMCwgYjAsIGEyLCBiMiwgYTEsYjEsIGEzLCBiMworICAgIHZzdDFxX3MxNih2YWwudmFsLCB2YWwwKTsgLy8gX21tX3NodWZmbGVfZXBpMzIgKHZhbC52YWxbMF0sIF9TV0FQX0hJX0xPVzMyKTsgLy8oYTEsYjEsIGEzLGIzKSwoYTAsIGIwLCBhMiwgYjIpLAorICAgIHJldHVybiB2YWw7Cit9CisKK2ludDMyeDJ4Ml90IHZ0cm5fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYik7IC8vIFZUUk4uMzIgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgaW50MzJ4MngyX3QgdnRybl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKQoreworICAgIGludDMyeDJ4Ml90IHZhbDsKKyAgICBfX20xMjhpIHZhbDA7CisgICAgdmFsMCA9IF9tbV91bnBhY2tsb19lcGkzMihfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKTsgLy9hMCxiMCxhMSxiMQorICAgIHZzdDFxX3MzMih2YWwudmFsLCB2YWwwKTsgLy8gX21tX3NodWZmbGVfZXBpMzIodmFsLnZhbFswXSwgX1NXQVBfSElfTE9XMzIpOyAvL2ExLGIxLCBhMCxiMCwKKyAgICByZXR1cm4gdmFsOworfQorCit1aW50OHg4eDJfdCB2dHJuX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZUUk4uOCBkMCxkMAorI2RlZmluZSB2dHJuX3U4IHZ0cm5fczgKKwordWludDE2eDR4Ml90IHZ0cm5fdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlRSTi4xNiBkMCxkMAorI2RlZmluZSB2dHJuX3UxNiB2dHJuX3MxNgorCit1aW50MzJ4MngyX3QgdnRybl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWVFJOLjMyIGQwLGQwCisjZGVmaW5lIHZ0cm5fdTMyIHZ0cm5fczMyCisKK2Zsb2F0MzJ4MngyX3QgdnRybl9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZUUk4uMzIgZDAsZDAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMngyeDJfdCB2dHJuX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKQoreworICAgIGZsb2F0MzJ4MngyX3QgdmFsOworICAgIHZhbC52YWxbMF0ubTY0X2YzMlswXSA9IGEubTY0X2YzMlswXTsKKyAgICB2YWwudmFsWzBdLm02NF9mMzJbMV0gPSBiLm02NF9mMzJbMF07CisgICAgdmFsLnZhbFsxXS5tNjRfZjMyWzBdID0gYS5tNjRfZjMyWzFdOworICAgIHZhbC52YWxbMV0ubTY0X2YzMlsxXSA9IGIubTY0X2YzMlsxXTsKKyAgICByZXR1cm4gdmFsOyAvL2EwLGIwLGExLGIxCit9CisKK3BvbHk4eDh4Ml90IHZ0cm5fcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiKTsgLy8gVlRSTi44IGQwLGQwCisjZGVmaW5lICB2dHJuX3A4IHZ0cm5fdTgKKworcG9seTE2eDR4Ml90IHZ0cm5fcDE2KHBvbHkxNng0X3QgYSwgcG9seTE2eDRfdCBiKTsgLy8gVlRSTi4xNiBkMCxkMAorI2RlZmluZSAgdnRybl9wMTYgdnRybl9zMTYKKworLy9pbnQ4eDE2eDJfdCB2dHJucV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpOyAvLyBWVFJOLjggcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgaW50OHgxNngyX3QgdnRybnFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSAvLyBWVFJOLjggcTAscTAKK3sKKyAgICBpbnQ4eDE2eDJfdCByOHgxNjsKKyAgICBfX20xMjhpIGFfc2gsIGJfc2g7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrOF9ldmVuX29kZFsxNl0gPSB7IDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDEsIDMsNSwgNywgOSwgMTEsIDEzLCAxNX07CisgICAgYV9zaCA9IF9tbV9zaHVmZmxlX2VwaTggKGEsICooX19tMTI4aSopbWFzazhfZXZlbl9vZGQpOyAvL2EwLCBhMiwgYTQsIGE2LCBhOCwgYTEwLCBhMTIsIGExNCwgYTEsIGEzLCBhNSwgYTcsIGE5LCBhMTEsIGExMywgYTE1CisgICAgYl9zaCA9IF9tbV9zaHVmZmxlX2VwaTggKGIsICooX19tMTI4aSopbWFzazhfZXZlbl9vZGQpOyAvL2IwLCBiMiwgYjQsIGI2LCBiOCwgYjEwLCBiMTIsIGIxNCwgYjEsIGIzLCBiNSwgYjcsIGI5LCBiMTEsIGIxMywgYjE1CisKKyAgICByOHgxNi52YWxbMF0gPSAgX21tX3VucGFja2xvX2VwaTgoYV9zaCwgYl9zaCk7IC8vKGEwLCBiMCwgYTIsIGIyLCBhNCwgYjQsIGE2LCBiNiwgYTgsYjgsIGExMCxiMTAsIGExMixiMTIsIGExNCxiMTQpCisgICAgcjh4MTYudmFsWzFdID0gIF9tbV91bnBhY2toaV9lcGk4KGFfc2gsIGJfc2gpOyAvLyAoYTEsIGIxLCBhMywgYjMsIGE1LCBiNSwgYTcsIGI3LCBhOSxiOSwgYTExLGIxMSwgYTEzLGIxMywgYTE1LGIxNSkKKyAgICByZXR1cm4gcjh4MTY7Cit9CisKK2ludDE2eDh4Ml90IHZ0cm5xX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWVFJOLjE2IHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDh4Ml90IHZ0cm5xX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIC8vIFZUUk4uMTYgcTAscTAKK3sKKyAgICBpbnQxNng4eDJfdCB2MTZ4ODsKKyAgICBfX20xMjhpIGFfc2gsIGJfc2g7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrMTZfZXZlbl9vZGRbMTZdID0geyAwLDEsIDQsNSwgOCw5LCAxMiwxMywgMiwzLCA2LDcsIDEwLDExLCAxNCwxNX07CisgICAgYV9zaCA9IF9tbV9zaHVmZmxlX2VwaTggKGEsICooX19tMTI4aSopbWFzazE2X2V2ZW5fb2RkKTsgLy9hMCwgYTIsIGE0LCBhNiwgIGExLCBhMywgYTUsIGE3CisgICAgYl9zaCA9IF9tbV9zaHVmZmxlX2VwaTggKGIsICooX19tMTI4aSopbWFzazE2X2V2ZW5fb2RkKTsgLy9iMCwgYjIsIGI0LCBiNiwgIGIxLCBiMywgYjUsIGI3CisgICAgdjE2eDgudmFsWzBdID0gX21tX3VucGFja2xvX2VwaTE2KGFfc2gsIGJfc2gpOyAvL2EwLCBiMCwgYTIsIGIyLCBhNCwgYjQsIGE2LCBiNgorICAgIHYxNng4LnZhbFsxXSA9IF9tbV91bnBhY2toaV9lcGkxNihhX3NoLCBiX3NoKTsgLy9hMSwgYjEsIGEzLCBiMywgYTUsIGI1LCBhNywgYjcKKyAgICByZXR1cm4gdjE2eDg7Cit9CisKK2ludDMyeDR4Ml90IHZ0cm5xX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWVFJOLjMyIHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDR4Ml90IHZ0cm5xX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIC8vIFZUUk4uMzIgcTAscTAKK3sKKyAgICAvL21heSBiZSBub3Qgb3B0aW1hbCBzb2x1dGlvbiBjb21wYXJlZCB3aXRoIHNlcmlhbAorICAgIGludDMyeDR4Ml90IHYzMng0OworICAgIF9fbTEyOGkgYV9zaCwgYl9zaDsKKyAgICBhX3NoID0gX21tX3NodWZmbGVfZXBpMzIgKGEsIDIxNik7IC8vYTAsIGEyLCBhMSwgYTMKKyAgICBiX3NoID0gX21tX3NodWZmbGVfZXBpMzIgKGIsIDIxNik7IC8vYjAsIGIyLCBiMSwgYjMKKworICAgIHYzMng0LnZhbFswXSA9IF9tbV91bnBhY2tsb19lcGkzMihhX3NoLCBiX3NoKTsgLy9hMCwgYjAsIGEyLCBiMgorICAgIHYzMng0LnZhbFsxXSA9IF9tbV91bnBhY2toaV9lcGkzMihhX3NoLCBiX3NoKTsgLy9hMSwgYjEsIGEzLCAgYjMKKyAgICByZXR1cm4gdjMyeDQ7Cit9CisKK3VpbnQ4eDE2eDJfdCB2dHJucV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYik7IC8vIFZUUk4uOCBxMCxxMAorI2RlZmluZSB2dHJucV91OCB2dHJucV9zOAorCit1aW50MTZ4OHgyX3QgdnRybnFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKTsgLy8gVlRSTi4xNiBxMCxxMAorI2RlZmluZSB2dHJucV91MTYgdnRybnFfczE2CisKK3VpbnQzMng0eDJfdCB2dHJucV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpOyAvLyBWVFJOLjMyIHEwLHEwCisjZGVmaW5lIHZ0cm5xX3UzMiB2dHJucV9zMzIKKworZmxvYXQzMng0eDJfdCB2dHJucV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYik7IC8vIFZUUk4uMzIgcTAscTAKK19ORU9OMlNTRV9JTkxJTkUgZmxvYXQzMng0eDJfdCB2dHJucV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYikgLy8gVlRSTi4zMiBxMCxxMAoreworICAgIC8vbWF5IGJlIG5vdCBvcHRpbWFsIHNvbHV0aW9uIGNvbXBhcmVkIHdpdGggc2VyaWFsCisgICAgZmxvYXQzMng0eDJfdCBmMzJ4NDsKKyAgICBfX20xMjggYV9zaCwgYl9zaDsKKyAgICBhX3NoID0gX21tX3NodWZmbGVfcHMgKGEsIGEsIF9NTV9TSFVGRkxFKDMsMSwgMiwgMCkpOyAvL2EwLCBhMiwgYTEsIGEzLCBuZWVkIHRvIGNoZWNrIGVuZGluZXNzCisgICAgYl9zaCA9IF9tbV9zaHVmZmxlX3BzIChiLCBiLCBfTU1fU0hVRkZMRSgzLDEsIDIsIDApKTsgLy9iMCwgYjIsIGIxLCBiMywgbmVlZCB0byBjaGVjayBlbmRpbmVzcworCisgICAgZjMyeDQudmFsWzBdID0gX21tX3VucGFja2xvX3BzKGFfc2gsIGJfc2gpOyAvL2EwLCBiMCwgYTIsIGIyCisgICAgZjMyeDQudmFsWzFdID0gX21tX3VucGFja2hpX3BzKGFfc2gsIGJfc2gpOyAvL2ExLCBiMSwgYTMsICBiMworICAgIHJldHVybiBmMzJ4NDsKK30KKworcG9seTh4MTZ4Ml90IHZ0cm5xX3A4KHBvbHk4eDE2X3QgYSwgcG9seTh4MTZfdCBiKTsgLy8gVlRSTi44IHEwLHEwCisjZGVmaW5lIHZ0cm5xX3A4IHZ0cm5xX3M4CisKK3BvbHkxNng4eDJfdCB2dHJucV9wMTYocG9seTE2eDhfdCBhLCBwb2x5MTZ4OF90IGIpOyAvLyBWVFJOLjE2IHEwLHEwCisjZGVmaW5lIHZ0cm5xX3AxNiB2dHJucV9zMTYKKworLy8qKioqKioqKioqKioqKioqKiBJbnRlcmxlYXZlIGVsZW1lbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy9vdXRwdXQgaGFzIChhMCxiMCxhMSxiMSwgYTIsYjIsLi4uLi4pCitpbnQ4eDh4Ml90IHZ6aXBfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZaSVAuOCBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDh4Ml90IHZ6aXBfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgLy8gVlpJUC44IGQwLGQwCit7CisgICAgaW50OHg4eDJfdCB2YWw7CisgICAgX19tMTI4aSB2YWwwOworICAgIHZhbDAgPSBfbW1fdW5wYWNrbG9fZXBpOChfcE0xMjhpKGEpLCBfcE0xMjhpKGIpKTsKKyAgICB2c3QxcV9zOCh2YWwudmFsLCB2YWwwKTsgLy9fbW1fc2h1ZmZsZV9lcGkzMih2YWwudmFsWzBdLCBfU1dBUF9ISV9MT1czMik7CisgICAgcmV0dXJuIHZhbDsKK30KKworaW50MTZ4NHgyX3QgdnppcF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlpJUC4xNiBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0eDJfdCB2emlwX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIC8vIFZaSVAuMTYgZDAsZDAKK3sKKyAgICBpbnQxNng0eDJfdCB2YWw7CisgICAgX19tMTI4aSB2YWwwOworICAgIHZhbDAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoX3BNMTI4aShhKSwgX3BNMTI4aShiKSk7CisgICAgdnN0MXFfczE2KHZhbC52YWwsIHZhbDApOyAvLyBfbW1fc2h1ZmZsZV9lcGkzMih2YWwudmFsWzBdLCBfU1dBUF9ISV9MT1czMik7CisgICAgcmV0dXJuIHZhbDsKK30KKworaW50MzJ4MngyX3QgdnppcF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlpJUC4zMiBkMCxkMAorI2RlZmluZSB2emlwX3MzMiB2dHJuX3MzMgorCit1aW50OHg4eDJfdCB2emlwX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYik7IC8vIFZaSVAuOCBkMCxkMAorI2RlZmluZSB2emlwX3U4IHZ6aXBfczgKKwordWludDE2eDR4Ml90IHZ6aXBfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKTsgLy8gVlpJUC4xNiBkMCxkMAorI2RlZmluZSB2emlwX3UxNiB2emlwX3MxNgorCit1aW50MzJ4MngyX3QgdnppcF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpOyAvLyBWWklQLjMyIGQwLGQwCisjZGVmaW5lIHZ6aXBfdTMyIHZ6aXBfczMyCisKK2Zsb2F0MzJ4MngyX3QgdnppcF9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYik7IC8vIFZaSVAuMzIgZDAsZDAKKyNkZWZpbmUgdnppcF9mMzIgdnRybl9mMzIKKworcG9seTh4OHgyX3QgdnppcF9wOChwb2x5OHg4X3QgYSwgcG9seTh4OF90IGIpOyAvLyBWWklQLjggZDAsZDAKKyNkZWZpbmUgdnppcF9wOCB2emlwX3U4CisKK3BvbHkxNng0eDJfdCB2emlwX3AxNihwb2x5MTZ4NF90IGEsIHBvbHkxNng0X3QgYik7IC8vIFZaSVAuMTYgZDAsZDAKKyNkZWZpbmUgdnppcF9wMTYgdnppcF91MTYKKworaW50OHgxNngyX3QgdnppcHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKTsgLy8gVlpJUC44IHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDh4MTZ4Ml90IHZ6aXBxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgLy8gVlpJUC44IHEwLHEwCit7CisgICAgaW50OHgxNngyX3Qgcjh4MTY7CisgICAgcjh4MTYudmFsWzBdID0gIF9tbV91bnBhY2tsb19lcGk4KGEsIGIpOworICAgIHI4eDE2LnZhbFsxXSA9ICBfbW1fdW5wYWNraGlfZXBpOChhLCBiKTsKKyAgICByZXR1cm4gcjh4MTY7Cit9CisKK2ludDE2eDh4Ml90IHZ6aXBxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWWklQLjE2IHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDh4Ml90IHZ6aXBxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIC8vIFZaSVAuMTYgcTAscTAKK3sKKyAgICBpbnQxNng4eDJfdCByMTZ4ODsKKyAgICByMTZ4OC52YWxbMF0gPSAgX21tX3VucGFja2xvX2VwaTE2KGEsIGIpOworICAgIHIxNng4LnZhbFsxXSA9ICBfbW1fdW5wYWNraGlfZXBpMTYoYSwgYik7CisgICAgcmV0dXJuIHIxNng4OworfQorCitpbnQzMng0eDJfdCB2emlwcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKTsgLy8gVlpJUC4zMiBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQzMng0eDJfdCB2emlwcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSAvLyBWWklQLjMyIHEwLHEwCit7CisgICAgaW50MzJ4NHgyX3QgcjMyeDQ7CisgICAgcjMyeDQudmFsWzBdID0gIF9tbV91bnBhY2tsb19lcGkzMihhLCBiKTsKKyAgICByMzJ4NC52YWxbMV0gPSAgX21tX3VucGFja2hpX2VwaTMyKGEsIGIpOworICAgIHJldHVybiByMzJ4NDsKK30KKwordWludDh4MTZ4Ml90IHZ6aXBxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVlpJUC44IHEwLHEwCisjZGVmaW5lIHZ6aXBxX3U4IHZ6aXBxX3M4CisKK3VpbnQxNng4eDJfdCB2emlwcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWWklQLjE2IHEwLHEwCisjZGVmaW5lIHZ6aXBxX3UxNiB2emlwcV9zMTYKKwordWludDMyeDR4Ml90IHZ6aXBxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZaSVAuMzIgcTAscTAKKyNkZWZpbmUgdnppcHFfdTMyIHZ6aXBxX3MzMgorCitmbG9hdDMyeDR4Ml90IHZ6aXBxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVlpJUC4zMiBxMCxxMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDR4Ml90IHZ6aXBxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKSAvLyBWWklQLjMyIHEwLHEwCit7CisgICAgZmxvYXQzMng0eDJfdCBmMzJ4NDsKKyAgICBmMzJ4NC52YWxbMF0gPSAgIF9tbV91bnBhY2tsb19wcyAoIGEsICBiKTsKKyAgICBmMzJ4NC52YWxbMV0gPSAgIF9tbV91bnBhY2toaV9wcyAoIGEsICBiKTsKKyAgICByZXR1cm4gZjMyeDQ7Cit9CisKK3BvbHk4eDE2eDJfdCB2emlwcV9wOChwb2x5OHgxNl90IGEsIHBvbHk4eDE2X3QgYik7IC8vIFZaSVAuOCBxMCxxMAorI2RlZmluZSB2emlwcV9wOCB2emlwcV91OAorCitwb2x5MTZ4OHgyX3QgdnppcHFfcDE2KHBvbHkxNng4X3QgYSwgcG9seTE2eDhfdCBiKTsgLy8gVlpJUC4xNiBxMCxxMAorI2RlZmluZSB2emlwcV9wMTYgdnppcHFfdTE2CisKKy8vKioqKioqKioqKioqKioqKioqKioqKiogRGUtSW50ZXJsZWF2ZSBlbGVtZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vQXMgdGhlIHJlc3VsdCBvZiB0aGVzZSBmdW5jdGlvbnMgZmlyc3QgdmFsICBjb250YWlucyAoYTAsYTIsYTQsLi4uLixiMCxiMiwgYjQsLi4uKSBhbmQgdGhlIHNlY29uZCB2YWwgKGExLGEzLGE1LC4uLi5iMSxiMyxiNS4uLikKKy8vbm8gc3VjaCBmdW5jdGlvbnMgaW4gSUEzMiBTSU1ELCBzaHVmZmxlIGlzIHJlcXVpcmVkCitpbnQ4eDh4Ml90IHZ1enBfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYik7IC8vIFZVWlAuOCBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDh4Ml90IHZ1enBfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgLy8gVlVaUC44IGQwLGQwCit7CisgICAgaW50OHg4eDJfdCB2YWw7CisgICAgX19tMTI4aSB0bXAsIHZhbDA7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrZGx2OFsxNl0gPSB7IDAsIDQsIDgsIDEyLCAxLCA1LCA5LCAxMywgIDIsIDYsIDEwLCAxNCwgMywgNywgMTEsMTV9OworICAgIHRtcCA9IF9tbV91bnBhY2tsb19lcGk4KF9wTTEyOGkoYSksIF9wTTEyOGkoYikpOyAvL2EwLGIwLGExLGIxLGEyLGIyLGEzLGIzLC4uLixhNyxiNworICAgIHZhbDAgPSBfbW1fc2h1ZmZsZV9lcGk4ICh0bXAsICooX19tMTI4aSopbWFza2RsdjgpOyAvLyhhMCwgYTIsIGE0LCBhNiwgYjAsIGIyLCBiNCwgYjYpLCAgKGExLCBhMywgYTUsIGE3LCBiMSxiMywgYjUsIGI3KQorICAgIHZzdDFxX3M4KHZhbC52YWwsIHZhbDApOyAvLyBfbW1fc2h1ZmZsZV9lcGkzMih2YWwudmFsWzBdLCBfU1dBUF9ISV9MT1czMik7CisgICAgcmV0dXJuIHZhbDsKK30KKworaW50MTZ4NHgyX3QgdnV6cF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKTsgLy8gVlVaUC4xNiBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQxNng0eDJfdCB2dXpwX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIC8vIFZVWlAuMTYgZDAsZDAKK3sKKyAgICBpbnQxNng0eDJfdCB2YWw7CisgICAgX19tMTI4aSB0bXAsIHZhbDA7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrZGx2MTZbMTZdID0gezAsMSwgIDgsOSwgIDIsMywgMTAsMTEsICA0LDUsIDEyLDEzLCA2LDcsIDE0LDE1fTsKKyAgICB0bXAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoX3BNMTI4aShhKSwgX3BNMTI4aShiKSk7IC8vYTAsYjAsYTEsYjEsYTIsYjIsYTMsYjMKKyAgICB2YWwwID0gX21tX3NodWZmbGVfZXBpOCAodG1wLCAqKF9fbTEyOGkqKW1hc2tkbHYxNik7IC8vYTAsYTIsIGIwLCBiMiwgYTEsYTMsIGIxLGIzCisgICAgdnN0MXFfczE2KHZhbC52YWwsIHZhbDApOyAvLyBfbW1fc2h1ZmZsZV9lcGkzMih2YWwudmFsWzBdLCBfU1dBUF9ISV9MT1czMik7CisgICAgcmV0dXJuIHZhbDsKK30KKworaW50MzJ4MngyX3QgdnV6cF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKTsgLy8gVlVaUC4zMiBkMCxkMAorX05FT04yU1NFX0lOTElORSBpbnQzMngyeDJfdCB2dXpwX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpIC8vIFZVWlAuMzIgZDAsZDAKK3sKKyAgICBpbnQzMngyeDJfdCB2YWw7CisgICAgX19tMTI4aSB2YWwwOworICAgIHZhbDAgPSBfbW1fdW5wYWNrbG9fZXBpMzIoX3BNMTI4aShhKSwgX3BNMTI4aShiKSk7IC8vYTAsYjAsIGExLGIxCisgICAgdnN0MXFfczMyKHZhbC52YWwsIHZhbDApOyAvLyBfbW1fc2h1ZmZsZV9lcGkzMih2YWwudmFsWzBdLCBfU1dBUF9ISV9MT1czMik7CisgICAgcmV0dXJuIHZhbDsKK30KKwordWludDh4OHgyX3QgdnV6cF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpOyAvLyBWVVpQLjggZDAsZDAKKyNkZWZpbmUgdnV6cF91OCB2dXpwX3M4CisKK3VpbnQxNng0eDJfdCB2dXpwX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYik7IC8vIFZVWlAuMTYgZDAsZDAKKyNkZWZpbmUgdnV6cF91MTYgdnV6cF9zMTYKKwordWludDMyeDJ4Ml90IHZ1enBfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKTsgLy8gVlVaUC4zMiBkMCxkMAorI2RlZmluZSB2dXpwX3UzMiB2dXpwX3MzMgorCitmbG9hdDMyeDJ4Ml90IHZ1enBfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpOyAvLyBWVVpQLjMyIGQwLGQwCisjZGVmaW5lIHZ1enBfZjMyIHZ6aXBfZjMyCisKK3BvbHk4eDh4Ml90IHZ1enBfcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiKTsgLy8gVlVaUC44IGQwLGQwCisjZGVmaW5lIHZ1enBfcDggdnV6cF91OAorCitwb2x5MTZ4NHgyX3QgdnV6cF9wMTYocG9seTE2eDRfdCBhLCBwb2x5MTZ4NF90IGIpOyAvLyBWVVpQLjE2IGQwLGQwCisjZGVmaW5lIHZ1enBfcDE2IHZ1enBfdTE2CisKK2ludDh4MTZ4Ml90IHZ1enBxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYik7IC8vIFZVWlAuOCBxMCxxMAorX05FT04yU1NFX0lOTElORSBpbnQ4eDE2eDJfdCB2dXpwcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIC8vIFZVWlAuOCBxMCxxMAoreworICAgIGludDh4MTZ4Ml90IHY4eDE2OworICAgIF9fbTEyOGkgYV9zaCwgYl9zaDsKKyAgICBfTkVPTjJTU0VfQUxJR05fMTYgaW50OF90IG1hc2s4X2V2ZW5fb2RkWzE2XSA9IHsgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMSwgMyw1LCA3LCA5LCAxMSwgMTMsIDE1fTsKKyAgICBhX3NoID0gX21tX3NodWZmbGVfZXBpOCAoYSwgKihfX20xMjhpKiltYXNrOF9ldmVuX29kZCk7IC8vYTAsIGEyLCBhNCwgYTYsIGE4LCBhMTAsIGExMiwgYTE0LCBhMSwgYTMsIGE1LCBhNywgYTksIGExMSwgYTEzLCBhMTUKKyAgICBiX3NoID0gX21tX3NodWZmbGVfZXBpOCAoYiwgKihfX20xMjhpKiltYXNrOF9ldmVuX29kZCk7IC8vYjAsIGIyLCBiNCwgYjYsIGI4LCBiMTAsIGIxMiwgYjE0LCBiMSwgYjMsIGI1LCBiNywgYjksIGIxMSwgYjEzLCBiMTUKKyAgICAvL3dlIG5lZWQgdW5wYWNrNjQgdG8gY29tYmluZSBsb3dlciAodXBwZXIpIDY0IGJpdHMgZnJvbSBhIHdpdGggbG93ZXIgKHVwcGVyKSA2NCBiaXRzIGZyb20gYgorICAgIHY4eDE2LnZhbFswXSA9IF9tbV91bnBhY2tsb19lcGk2NChhX3NoLCBiX3NoKTsgLy8vYTAsIGEyLCBhNCwgYTYsIGE4LCBhMTAsIGExMiwgYTE0LCAgYjAsIGIyLCBiNCwgYjYsIGI4LCBiMTAsIGIxMiwgYjE0LAorICAgIHY4eDE2LnZhbFsxXSA9IF9tbV91bnBhY2toaV9lcGk2NChhX3NoLCBiX3NoKTsgLy9hMSwgYTMsIGE1LCBhNywgYTksIGExMSwgYTEzLCBhMTUsICBiMSwgYjMsIGI1LCBiNywgYjksIGIxMSwgYjEzLCBiMTUKKyAgICByZXR1cm4gdjh4MTY7Cit9CisKK2ludDE2eDh4Ml90IHZ1enBxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpOyAvLyBWVVpQLjE2IHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDE2eDh4Ml90IHZ1enBxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIC8vIFZVWlAuMTYgcTAscTAKK3sKKyAgICBpbnQxNng4eDJfdCB2MTZ4ODsKKyAgICBfX20xMjhpIGFfc2gsIGJfc2g7CisgICAgX05FT04yU1NFX0FMSUdOXzE2IGludDhfdCBtYXNrMTZfZXZlbl9vZGRbMTZdID0geyAwLDEsIDQsNSwgOCw5LCAxMiwxMywgMiwzLCA2LDcsIDEwLDExLCAxNCwxNX07CisgICAgYV9zaCA9IF9tbV9zaHVmZmxlX2VwaTggKGEsICooX19tMTI4aSopbWFzazE2X2V2ZW5fb2RkKTsgLy9hMCwgYTIsIGE0LCBhNiwgIGExLCBhMywgYTUsIGE3CisgICAgYl9zaCA9IF9tbV9zaHVmZmxlX2VwaTggKGIsICooX19tMTI4aSopbWFzazE2X2V2ZW5fb2RkKTsgLy9iMCwgYjIsIGI0LCBiNiwgIGIxLCBiMywgYjUsIGI3CisgICAgdjE2eDgudmFsWzBdID0gX21tX3VucGFja2xvX2VwaTY0KGFfc2gsIGJfc2gpOyAvL2EwLCBhMiwgYTQsIGE2LCBiMCwgYjIsIGI0LCBiNgorICAgIHYxNng4LnZhbFsxXSA9IF9tbV91bnBhY2toaV9lcGk2NChhX3NoLCBiX3NoKTsgLy9hMSwgYTMsIGE1LCBhNywgYjEsIGIzLCBiNSwgYjcKKyAgICByZXR1cm4gdjE2eDg7Cit9CisKK2ludDMyeDR4Ml90IHZ1enBxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpOyAvLyBWVVpQLjMyIHEwLHEwCitfTkVPTjJTU0VfSU5MSU5FIGludDMyeDR4Ml90IHZ1enBxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIC8vIFZVWlAuMzIgcTAscTAKK3sKKyAgICAvL21heSBiZSBub3Qgb3B0aW1hbCBzb2x1dGlvbiBjb21wYXJlZCB3aXRoIHNlcmlhbAorICAgIGludDMyeDR4Ml90IHYzMng0OworICAgIF9fbTEyOGkgYV9zaCwgYl9zaDsKKyAgICBhX3NoID0gX21tX3NodWZmbGVfZXBpMzIgKGEsIDIxNik7IC8vYTAsIGEyLCBhMSwgYTMKKyAgICBiX3NoID0gX21tX3NodWZmbGVfZXBpMzIgKGIsIDIxNik7IC8vYjAsIGIyLCBiMSwgYjMKKworICAgIHYzMng0LnZhbFswXSA9IF9tbV91bnBhY2tsb19lcGk2NChhX3NoLCBiX3NoKTsgLy9hMCwgYTIsIGIwLCBiMgorICAgIHYzMng0LnZhbFsxXSA9IF9tbV91bnBhY2toaV9lcGk2NChhX3NoLCBiX3NoKTsgLy9hMSwgYTMsIGIxLCBiMworICAgIHJldHVybiB2MzJ4NDsKK30KKwordWludDh4MTZ4Ml90IHZ1enBxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKTsgLy8gVlVaUC44IHEwLHEwCisjZGVmaW5lIHZ1enBxX3U4IHZ1enBxX3M4CisKK3VpbnQxNng4eDJfdCB2dXpwcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpOyAvLyBWVVpQLjE2IHEwLHEwCisjZGVmaW5lIHZ1enBxX3UxNiB2dXpwcV9zMTYKKwordWludDMyeDR4Ml90IHZ1enBxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYik7IC8vIFZVWlAuMzIgcTAscTAKKyNkZWZpbmUgdnV6cHFfdTMyIHZ1enBxX3MzMgorCitmbG9hdDMyeDR4Ml90IHZ1enBxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKTsgLy8gVlVaUC4zMiBxMCxxMAorX05FT04yU1NFX0lOTElORSBmbG9hdDMyeDR4Ml90IHZ1enBxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKSAvLyBWVVpQLjMyIHEwLHEwCit7CisgICAgZmxvYXQzMng0eDJfdCB2MzJ4NDsKKyAgICB2MzJ4NC52YWxbMF0gPSBfbW1fc2h1ZmZsZV9wcyhhLCBiLCBfTU1fU0hVRkZMRSgyLDAsIDIsIDApKTsgLy9hMCwgYTIsIGIwLCBiMiAsIG5lZWQgdG8gY2hlY2sgZW5kaWFuZXNzIGhvd2V2ZXIKKyAgICB2MzJ4NC52YWxbMV0gPSBfbW1fc2h1ZmZsZV9wcyhhLCBiLCBfTU1fU0hVRkZMRSgzLDEsIDMsIDEpKTsgLy9hMSwgYTMsIGIxLCBiMywgbmVlZCB0byBjaGVjayBlbmRpYW5lc3MgaG93ZXZlcgorICAgIHJldHVybiB2MzJ4NDsKK30KKworcG9seTh4MTZ4Ml90IHZ1enBxX3A4KHBvbHk4eDE2X3QgYSwgcG9seTh4MTZfdCBiKTsgLy8gVlVaUC44IHEwLHEwCisjZGVmaW5lIHZ1enBxX3A4IHZ1enBxX3U4CisKK3BvbHkxNng4eDJfdCB2dXpwcV9wMTYocG9seTE2eDhfdCBhLCBwb2x5MTZ4OF90IGIpOyAvLyBWVVpQLjE2IHEwLHEwCisjZGVmaW5lIHZ1enBxX3AxNiB2dXpwcV91MTYKKworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyoqKioqKioqKioqKioqKioqKioqKioqIFJlaW50ZXJwcmV0IGNhc3QgaW50cmluc2ljcy4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gTm90IGEgcGFydCBvZiBvZmljaWFsIE5FT04gaW5zdHJ1Y3Rpb24gc2V0IGJ1dCBhdmFpbGFibGUgaW4gZ2NjIGNvbXBpbGVyICoqKioqKioqKioqKioqKioqKioqKgorcG9seTh4OF90IHZyZWludGVycHJldF9wOF91MzIgKHVpbnQzMngyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9wOF91MzIKKworcG9seTh4OF90IHZyZWludGVycHJldF9wOF91MTYgKHVpbnQxNng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9wOF91MTYKKworcG9seTh4OF90IHZyZWludGVycHJldF9wOF91OCAodWludDh4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfcDhfdTgKKworcG9seTh4OF90IHZyZWludGVycHJldF9wOF9zMzIgKGludDMyeDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3A4X3MzMgorCitwb2x5OHg4X3QgdnJlaW50ZXJwcmV0X3A4X3MxNiAoaW50MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfcDhfczE2CisKK3BvbHk4eDhfdCB2cmVpbnRlcnByZXRfcDhfczggKGludDh4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfcDhfczgKKworcG9seTh4OF90IHZyZWludGVycHJldF9wOF91NjQgKHVpbnQ2NHgxX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9wOF91NjQKKworcG9seTh4OF90IHZyZWludGVycHJldF9wOF9zNjQgKGludDY0eDFfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3A4X3M2NAorCitwb2x5OHg4X3QgdnJlaW50ZXJwcmV0X3A4X2YzMiAoZmxvYXQzMngyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9wOF9mMzIKKworcG9seTh4OF90IHZyZWludGVycHJldF9wOF9wMTYgKHBvbHkxNng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9wOF9wMTYKKworcG9seTh4MTZfdCB2cmVpbnRlcnByZXRxX3A4X3UzMiAodWludDMyeDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9wOF91MzIKKworcG9seTh4MTZfdCB2cmVpbnRlcnByZXRxX3A4X3UxNiAodWludDE2eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9wOF91MTYKKworcG9seTh4MTZfdCB2cmVpbnRlcnByZXRxX3A4X3U4ICh1aW50OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3A4X3U4CisKK3BvbHk4eDE2X3QgdnJlaW50ZXJwcmV0cV9wOF9zMzIgKGludDMyeDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9wOF9zMzIKKworcG9seTh4MTZfdCB2cmVpbnRlcnByZXRxX3A4X3MxNiAoaW50MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3A4X3MxNgorCitwb2x5OHgxNl90IHZyZWludGVycHJldHFfcDhfczggKGludDh4MTZfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9wOF9zOAorCitwb2x5OHgxNl90IHZyZWludGVycHJldHFfcDhfdTY0ICh1aW50NjR4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3A4X3U2NAorCitwb2x5OHgxNl90IHZyZWludGVycHJldHFfcDhfczY0IChpbnQ2NHgyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfcDhfczY0CisKK3BvbHk4eDE2X3QgdnJlaW50ZXJwcmV0cV9wOF9mMzIgKGZsb2F0MzJ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3A4X2YzMih0KSBfTTEyOGkodCkKKworcG9seTh4MTZfdCB2cmVpbnRlcnByZXRxX3A4X3AxNiAocG9seTE2eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9wOF9wMTYKKworcG9seTE2eDRfdCB2cmVpbnRlcnByZXRfcDE2X3UzMiAodWludDMyeDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3AxNl91MzIKKworcG9seTE2eDRfdCB2cmVpbnRlcnByZXRfcDE2X3UxNiAodWludDE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3AxNl91MTYKKworcG9seTE2eDRfdCB2cmVpbnRlcnByZXRfcDE2X3U4ICh1aW50OHg4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9wMTZfdTgKKworcG9seTE2eDRfdCB2cmVpbnRlcnByZXRfcDE2X3MzMiAoaW50MzJ4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfcDE2X3MzMgorCitwb2x5MTZ4NF90IHZyZWludGVycHJldF9wMTZfczE2IChpbnQxNng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9wMTZfczE2CisKK3BvbHkxNng0X3QgdnJlaW50ZXJwcmV0X3AxNl9zOCAoaW50OHg4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9wMTZfczgKKworcG9seTE2eDRfdCB2cmVpbnRlcnByZXRfcDE2X3U2NCAodWludDY0eDFfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3AxNl91NjQKKworcG9seTE2eDRfdCB2cmVpbnRlcnByZXRfcDE2X3M2NCAoaW50NjR4MV90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfcDE2X3M2NAorCitwb2x5MTZ4NF90IHZyZWludGVycHJldF9wMTZfZjMyIChmbG9hdDMyeDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3AxNl9mMzIKKworcG9seTE2eDRfdCB2cmVpbnRlcnByZXRfcDE2X3A4IChwb2x5OHg4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9wMTZfcDgKKworcG9seTE2eDhfdCB2cmVpbnRlcnByZXRxX3AxNl91MzIgKHVpbnQzMng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfcDE2X3UzMgorCitwb2x5MTZ4OF90IHZyZWludGVycHJldHFfcDE2X3UxNiAodWludDE2eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9wMTZfdTE2CisKK3BvbHkxNng4X3QgdnJlaW50ZXJwcmV0cV9wMTZfczMyIChpbnQzMng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfcDE2X3MzMgorCitwb2x5MTZ4OF90IHZyZWludGVycHJldHFfcDE2X3MxNiAoaW50MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3AxNl9zMTYKKworcG9seTE2eDhfdCB2cmVpbnRlcnByZXRxX3AxNl9zOCAoaW50OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3AxNl9zOAorCitwb2x5MTZ4OF90IHZyZWludGVycHJldHFfcDE2X3U2NCAodWludDY0eDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9wMTZfdTY0CisKK3BvbHkxNng4X3QgdnJlaW50ZXJwcmV0cV9wMTZfczY0IChpbnQ2NHgyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfcDE2X3M2NAorCitwb2x5MTZ4OF90IHZyZWludGVycHJldHFfcDE2X2YzMiAoZmxvYXQzMng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfcDE2X2YzMih0KSBfTTEyOGkodCkKKworcG9seTE2eDhfdCB2cmVpbnRlcnByZXRxX3AxNl9wOCAocG9seTh4MTZfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9wMTZfcDggIHZyZWludGVycHJldHFfczE2X3A4CisKKy8vKioqKiAgSW50ZWdlciB0byBmbG9hdCAgKioqKioqCitmbG9hdDMyeDJfdCB2cmVpbnRlcnByZXRfZjMyX3UzMiAodWludDMyeDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X2YzMl91MzIodCkgKCooX19tNjRfMTI4KikmKHQpKQorCisKK2Zsb2F0MzJ4Ml90IHZyZWludGVycHJldF9mMzJfdTE2ICh1aW50MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfZjMyX3UxNiB2cmVpbnRlcnByZXRfZjMyX3UzMgorCisKK2Zsb2F0MzJ4Ml90IHZyZWludGVycHJldF9mMzJfdTggKHVpbnQ4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X2YzMl91OCB2cmVpbnRlcnByZXRfZjMyX3UzMgorCisKK2Zsb2F0MzJ4Ml90IHZyZWludGVycHJldF9mMzJfczMyIChpbnQzMngyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9mMzJfczMyIHZyZWludGVycHJldF9mMzJfdTMyCisKKworZmxvYXQzMngyX3QgdnJlaW50ZXJwcmV0X2YzMl9zMTYgKGludDE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X2YzMl9zMTYgdnJlaW50ZXJwcmV0X2YzMl91MzIKKworZmxvYXQzMngyX3QgdnJlaW50ZXJwcmV0X2YzMl9zOCAoaW50OHg4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9mMzJfczggdnJlaW50ZXJwcmV0X2YzMl91MzIKKworCitmbG9hdDMyeDJfdCB2cmVpbnRlcnByZXRfZjMyX3U2NCh1aW50NjR4MV90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfZjMyX3U2NCB2cmVpbnRlcnByZXRfZjMyX3UzMgorCisKK2Zsb2F0MzJ4Ml90IHZyZWludGVycHJldF9mMzJfczY0IChpbnQ2NHgxX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9mMzJfczY0IHZyZWludGVycHJldF9mMzJfdTMyCisKKworZmxvYXQzMngyX3QgdnJlaW50ZXJwcmV0X2YzMl9wMTYgKHBvbHkxNng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9mMzJfcDE2IHZyZWludGVycHJldF9mMzJfdTMyCisKK2Zsb2F0MzJ4Ml90IHZyZWludGVycHJldF9mMzJfcDggKHBvbHk4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X2YzMl9wOCB2cmVpbnRlcnByZXRfZjMyX3UzMgorCitmbG9hdDMyeDRfdCB2cmVpbnRlcnByZXRxX2YzMl91MzIgKHVpbnQzMng0X3QgdCk7CisjZGVmaW5lICB2cmVpbnRlcnByZXRxX2YzMl91MzIodCkgKihfX20xMjgqKSYodCkKKworZmxvYXQzMng0X3QgdnJlaW50ZXJwcmV0cV9mMzJfdTE2ICh1aW50MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX2YzMl91MTYgdnJlaW50ZXJwcmV0cV9mMzJfdTMyCisKK2Zsb2F0MzJ4NF90IHZyZWludGVycHJldHFfZjMyX3U4ICh1aW50OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX2YzMl91OCB2cmVpbnRlcnByZXRxX2YzMl91MzIKKworZmxvYXQzMng0X3QgdnJlaW50ZXJwcmV0cV9mMzJfczMyIChpbnQzMng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfZjMyX3MzMiB2cmVpbnRlcnByZXRxX2YzMl91MzIKKworZmxvYXQzMng0X3QgdnJlaW50ZXJwcmV0cV9mMzJfczE2IChpbnQxNng4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfZjMyX3MxNiB2cmVpbnRlcnByZXRxX2YzMl91MzIKKworZmxvYXQzMng0X3QgdnJlaW50ZXJwcmV0cV9mMzJfczggKGludDh4MTZfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9mMzJfczggdnJlaW50ZXJwcmV0cV9mMzJfdTMyCisKK2Zsb2F0MzJ4NF90IHZyZWludGVycHJldHFfZjMyX3U2NCAodWludDY0eDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9mMzJfdTY0IHZyZWludGVycHJldHFfZjMyX3UzMgorCitmbG9hdDMyeDRfdCB2cmVpbnRlcnByZXRxX2YzMl9zNjQgKGludDY0eDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9mMzJfczY0IHZyZWludGVycHJldHFfZjMyX3UzMgorCitmbG9hdDMyeDRfdCB2cmVpbnRlcnByZXRxX2YzMl9wMTYgKHBvbHkxNng4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfZjMyX3AxNiB2cmVpbnRlcnByZXRxX2YzMl91MzIKKworZmxvYXQzMng0X3QgdnJlaW50ZXJwcmV0cV9mMzJfcDggKHBvbHk4eDE2X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfZjMyX3A4IHZyZWludGVycHJldHFfZjMyX3UzMgorCisvLyoqKiBJbnRlZ2VyIHR5cGUgY29udmVyc2lvbnMgKioqKioqKioqKioqKioqKioqCisvL25vIGNvbnZlcnNpb24gbmVjZXNzYXJ5IGZvciB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBiZWNhdXNlIGl0IGlzIHNhbWUgZGF0YSB0eXBlCitpbnQ2NHgxX3QgdnJlaW50ZXJwcmV0X3M2NF91MzIgKHVpbnQzMngyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zNjRfdTMyCisKK2ludDY0eDFfdCB2cmVpbnRlcnByZXRfczY0X3UxNiAodWludDE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3M2NF91MTYKKworaW50NjR4MV90IHZyZWludGVycHJldF9zNjRfdTggKHVpbnQ4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3M2NF91OAorCitpbnQ2NHgxX3QgdnJlaW50ZXJwcmV0X3M2NF9zMzIgKGludDMyeDJfdCB0KTsKKyNkZWZpbmUgIHZyZWludGVycHJldF9zNjRfczMyCisKK2ludDY0eDFfdCB2cmVpbnRlcnByZXRfczY0X3MxNiAoaW50MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczY0X3MxNgorCitpbnQ2NHgxX3QgdnJlaW50ZXJwcmV0X3M2NF9zOCAoaW50OHg4X3QgdCk7CisjZGVmaW5lICB2cmVpbnRlcnByZXRfczY0X3M4CisKK2ludDY0eDFfdCB2cmVpbnRlcnByZXRfczY0X3U2NCAodWludDY0eDFfdCB0KTsKKyNkZWZpbmUgIHZyZWludGVycHJldF9zNjRfdTY0CisKK2ludDY0eDFfdCB2cmVpbnRlcnByZXRfczY0X2YzMiAoZmxvYXQzMngyX3QgdCk7CisjZGVmaW5lICB2cmVpbnRlcnByZXRfczY0X2YzMgorCitpbnQ2NHgxX3QgdnJlaW50ZXJwcmV0X3M2NF9wMTYgKHBvbHkxNng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zNjRfcDE2CisKK2ludDY0eDFfdCB2cmVpbnRlcnByZXRfczY0X3A4IChwb2x5OHg4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zNjRfcDgKKworaW50NjR4Ml90IHZyZWludGVycHJldHFfczY0X3UzMiAodWludDMyeDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zNjRfdTMyCisKK2ludDY0eDJfdCB2cmVpbnRlcnByZXRxX3M2NF9zMTYgKHVpbnQxNng4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczY0X3MxNgorCitpbnQ2NHgyX3QgdnJlaW50ZXJwcmV0cV9zNjRfdTggKHVpbnQ4eDE2X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczY0X3U4CisKK2ludDY0eDJfdCB2cmVpbnRlcnByZXRxX3M2NF9zMzIgKGludDMyeDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zNjRfczMyCisKK2ludDY0eDJfdCB2cmVpbnRlcnByZXRxX3M2NF91MTYgKGludDE2eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zNjRfdTE2CisKK2ludDY0eDJfdCB2cmVpbnRlcnByZXRxX3M2NF9zOCAoaW50OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3M2NF9zOAorCitpbnQ2NHgyX3QgdnJlaW50ZXJwcmV0cV9zNjRfdTY0ICh1aW50NjR4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3M2NF91NjQKKworaW50NjR4Ml90IHZyZWludGVycHJldHFfczY0X2YzMiAoZmxvYXQzMng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczY0X2YzMih0KSBfTTEyOGkodCkKKworaW50NjR4Ml90IHZyZWludGVycHJldHFfczY0X3AxNiAocG9seTE2eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zNjRfcDE2CisKK2ludDY0eDJfdCB2cmVpbnRlcnByZXRxX3M2NF9wOCAocG9seTh4MTZfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zNjRfcDgKKwordWludDY0eDFfdCB2cmVpbnRlcnByZXRfdTY0X3UzMiAodWludDMyeDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3U2NF91MzIKKwordWludDY0eDFfdCB2cmVpbnRlcnByZXRfdTY0X3UxNiAodWludDE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3U2NF91MTYKKwordWludDY0eDFfdCB2cmVpbnRlcnByZXRfdTY0X3U4ICh1aW50OHg4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91NjRfdTgKKwordWludDY0eDFfdCB2cmVpbnRlcnByZXRfdTY0X3MzMiAoaW50MzJ4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTY0X3MzMgorCit1aW50NjR4MV90IHZyZWludGVycHJldF91NjRfczE2IChpbnQxNng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91NjRfczE2CisKK3VpbnQ2NHgxX3QgdnJlaW50ZXJwcmV0X3U2NF9zOCAoaW50OHg4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91NjRfczgKKwordWludDY0eDFfdCB2cmVpbnRlcnByZXRfdTY0X3M2NCAoaW50NjR4MV90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTY0X3M2NAorCit1aW50NjR4MV90IHZyZWludGVycHJldF91NjRfZjMyIChmbG9hdDMyeDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3U2NF9mMzIKKwordWludDY0eDFfdCB2cmVpbnRlcnByZXRfdTY0X3AxNiAocG9seTE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3U2NF9wMTYKKwordWludDY0eDFfdCB2cmVpbnRlcnByZXRfdTY0X3A4IChwb2x5OHg4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91NjRfcDgKKwordWludDY0eDJfdCB2cmVpbnRlcnByZXRxX3U2NF91MzIgKHVpbnQzMng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTY0X3UzMgorCit1aW50NjR4Ml90IHZyZWludGVycHJldHFfdTY0X3UxNiAodWludDE2eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91NjRfdTE2CisKK3VpbnQ2NHgyX3QgdnJlaW50ZXJwcmV0cV91NjRfdTggKHVpbnQ4eDE2X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTY0X3U4CisKK3VpbnQ2NHgyX3QgdnJlaW50ZXJwcmV0cV91NjRfczMyIChpbnQzMng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTY0X3MzMgorCit1aW50NjR4Ml90IHZyZWludGVycHJldHFfdTY0X3MxNiAoaW50MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3U2NF9zMTYKKwordWludDY0eDJfdCB2cmVpbnRlcnByZXRxX3U2NF9zOCAoaW50OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3U2NF9zOAorCit1aW50NjR4Ml90IHZyZWludGVycHJldHFfdTY0X3M2NCAoaW50NjR4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3U2NF9zNjQKKwordWludDY0eDJfdCB2cmVpbnRlcnByZXRxX3U2NF9mMzIgKGZsb2F0MzJ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3U2NF9mMzIodCkgX00xMjhpKHQpCisKK3VpbnQ2NHgyX3QgdnJlaW50ZXJwcmV0cV91NjRfcDE2IChwb2x5MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3U2NF9wMTYKKwordWludDY0eDJfdCB2cmVpbnRlcnByZXRxX3U2NF9wOCAocG9seTh4MTZfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91NjRfcDgKKworaW50OHg4X3QgdnJlaW50ZXJwcmV0X3M4X3UzMiAodWludDMyeDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3M4X3UzMgorCitpbnQ4eDhfdCB2cmVpbnRlcnByZXRfczhfdTE2ICh1aW50MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczhfdTE2CisKK2ludDh4OF90IHZyZWludGVycHJldF9zOF91OCAodWludDh4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczhfdTgKKworaW50OHg4X3QgdnJlaW50ZXJwcmV0X3M4X3MzMiAoaW50MzJ4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczhfczMyCisKK2ludDh4OF90IHZyZWludGVycHJldF9zOF9zMTYgKGludDE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3M4X3MxNgorCitpbnQ4eDhfdCB2cmVpbnRlcnByZXRfczhfdTY0ICh1aW50NjR4MV90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczhfdTY0CisKK2ludDh4OF90IHZyZWludGVycHJldF9zOF9zNjQgKGludDY0eDFfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3M4X3M2NAorCitpbnQ4eDhfdCB2cmVpbnRlcnByZXRfczhfZjMyIChmbG9hdDMyeDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3M4X2YzMgorCitpbnQ4eDhfdCB2cmVpbnRlcnByZXRfczhfcDE2IChwb2x5MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczhfcDE2CisKK2ludDh4OF90IHZyZWludGVycHJldF9zOF9wOCAocG9seTh4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczhfcDgKKworaW50OHgxNl90IHZyZWludGVycHJldHFfczhfdTMyICh1aW50MzJ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3M4X3UzMgorCitpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV9zOF91MTYgKHVpbnQxNng4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczhfdTE2CisKK2ludDh4MTZfdCB2cmVpbnRlcnByZXRxX3M4X3U4ICh1aW50OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3M4X3U4CisKK2ludDh4MTZfdCB2cmVpbnRlcnByZXRxX3M4X3MzMiAoaW50MzJ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3M4X3MzMgorCitpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV9zOF9zMTYgKGludDE2eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zOF9zMTYKKworaW50OHgxNl90IHZyZWludGVycHJldHFfczhfdTY0ICh1aW50NjR4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3M4X3U2NAorCitpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV9zOF9zNjQgKGludDY0eDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zOF9zNjQKKworaW50OHgxNl90IHZyZWludGVycHJldHFfczhfZjMyIChmbG9hdDMyeDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zOF9mMzIodCkgX00xMjhpKHQpCisKK2ludDh4MTZfdCB2cmVpbnRlcnByZXRxX3M4X3AxNiAocG9seTE2eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zOF9wMTYKKworaW50OHgxNl90IHZyZWludGVycHJldHFfczhfcDggKHBvbHk4eDE2X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczhfcDgKKworaW50MTZ4NF90IHZyZWludGVycHJldF9zMTZfdTMyICh1aW50MzJ4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczE2X3UzMgorCitpbnQxNng0X3QgdnJlaW50ZXJwcmV0X3MxNl91MTYgKHVpbnQxNng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zMTZfdTE2CisKK2ludDE2eDRfdCB2cmVpbnRlcnByZXRfczE2X3U4ICh1aW50OHg4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zMTZfdTgKKworaW50MTZ4NF90IHZyZWludGVycHJldF9zMTZfczMyIChpbnQzMngyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zMTZfczMyCisKK2ludDE2eDRfdCB2cmVpbnRlcnByZXRfczE2X3M4IChpbnQ4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3MxNl9zOAorCitpbnQxNng0X3QgdnJlaW50ZXJwcmV0X3MxNl91NjQgKHVpbnQ2NHgxX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zMTZfdTY0CisKK2ludDE2eDRfdCB2cmVpbnRlcnByZXRfczE2X3M2NCAoaW50NjR4MV90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczE2X3M2NAorCitpbnQxNng0X3QgdnJlaW50ZXJwcmV0X3MxNl9mMzIgKGZsb2F0MzJ4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczE2X2YzMgorCisKK2ludDE2eDRfdCB2cmVpbnRlcnByZXRfczE2X3AxNiAocG9seTE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3MxNl9wMTYKKworaW50MTZ4NF90IHZyZWludGVycHJldF9zMTZfcDggKHBvbHk4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3MxNl9wOAorCitpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV9zMTZfdTMyICh1aW50MzJ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3MxNl91MzIKKworaW50MTZ4OF90IHZyZWludGVycHJldHFfczE2X3UxNiAodWludDE2eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zMTZfdTE2CisKK2ludDE2eDhfdCB2cmVpbnRlcnByZXRxX3MxNl91OCAodWludDh4MTZfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zMTZfdTgKKworaW50MTZ4OF90IHZyZWludGVycHJldHFfczE2X3MzMiAoaW50MzJ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3MxNl9zMzIKKworaW50MTZ4OF90IHZyZWludGVycHJldHFfczE2X3M4IChpbnQ4eDE2X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczE2X3M4CisKK2ludDE2eDhfdCB2cmVpbnRlcnByZXRxX3MxNl91NjQgKHVpbnQ2NHgyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczE2X3U2NAorCitpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV9zMTZfczY0IChpbnQ2NHgyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczE2X3M2NAorCitpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV9zMTZfZjMyIChmbG9hdDMyeDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zMTZfZjMyKHQpIF9NMTI4aSh0KQorCitpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV9zMTZfcDE2IChwb2x5MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3MxNl9wMTYKKworaW50MTZ4OF90IHZyZWludGVycHJldHFfczE2X3A4IChwb2x5OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3MxNl9wOAorCitpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3MzMl91MzIgKHVpbnQzMngyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zMzJfdTMyCisKK2ludDMyeDJfdCB2cmVpbnRlcnByZXRfczMyX3UxNiAodWludDE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3MzMl91MTYKKworaW50MzJ4Ml90IHZyZWludGVycHJldF9zMzJfdTggKHVpbnQ4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3MzMl91OAorCitpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3MzMl9zMTYgKGludDE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3MzMl9zMTYKKworaW50MzJ4Ml90IHZyZWludGVycHJldF9zMzJfczggKGludDh4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfczMyX3M4CisKK2ludDMyeDJfdCB2cmVpbnRlcnByZXRfczMyX3U2NCAodWludDY0eDFfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3MzMl91NjQKKworaW50MzJ4Ml90IHZyZWludGVycHJldF9zMzJfczY0IChpbnQ2NHgxX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zMzJfczY0CisKK2ludDMyeDJfdCB2cmVpbnRlcnByZXRfczMyX2YzMiAoZmxvYXQzMngyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF9zMzJfZjMyCisKK2ludDMyeDJfdCB2cmVpbnRlcnByZXRfczMyX3AxNiAocG9seTE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3MzMl9wMTYKKworaW50MzJ4Ml90IHZyZWludGVycHJldF9zMzJfcDggKHBvbHk4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3MzMl9wOAorCitpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV9zMzJfdTMyICh1aW50MzJ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3MzMl91MzIKKworaW50MzJ4NF90IHZyZWludGVycHJldHFfczMyX3UxNiAodWludDE2eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zMzJfdTE2CisKK2ludDMyeDRfdCB2cmVpbnRlcnByZXRxX3MzMl91OCAodWludDh4MTZfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zMzJfdTgKKworaW50MzJ4NF90IHZyZWludGVycHJldHFfczMyX3MxNiAoaW50MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3MzMl9zMTYKKworaW50MzJ4NF90IHZyZWludGVycHJldHFfczMyX3M4IChpbnQ4eDE2X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczMyX3M4CisKK2ludDMyeDRfdCB2cmVpbnRlcnByZXRxX3MzMl91NjQgKHVpbnQ2NHgyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczMyX3U2NAorCitpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV9zMzJfczY0IChpbnQ2NHgyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfczMyX3M2NAorCitpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV9zMzJfZjMyIChmbG9hdDMyeDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zMzJfZjMyKHQpICBfbW1fY2FzdHBzX3NpMTI4KHQpIC8vKCooX19tMTI4aSopJih0KSkKKworaW50MzJ4NF90IHZyZWludGVycHJldHFfczMyX3AxNiAocG9seTE2eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zMzJfcDE2CisKK2ludDMyeDRfdCB2cmVpbnRlcnByZXRxX3MzMl9wOCAocG9seTh4MTZfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV9zMzJfcDgKKwordWludDh4OF90IHZyZWludGVycHJldF91OF91MzIgKHVpbnQzMngyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91OF91MzIKKwordWludDh4OF90IHZyZWludGVycHJldF91OF91MTYgKHVpbnQxNng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91OF91MTYKKwordWludDh4OF90IHZyZWludGVycHJldF91OF9zMzIgKGludDMyeDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3U4X3MzMgorCit1aW50OHg4X3QgdnJlaW50ZXJwcmV0X3U4X3MxNiAoaW50MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdThfczE2CisKK3VpbnQ4eDhfdCB2cmVpbnRlcnByZXRfdThfczggKGludDh4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdThfczgKKwordWludDh4OF90IHZyZWludGVycHJldF91OF91NjQgKHVpbnQ2NHgxX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91OF91NjQKKwordWludDh4OF90IHZyZWludGVycHJldF91OF9zNjQgKGludDY0eDFfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3U4X3M2NAorCit1aW50OHg4X3QgdnJlaW50ZXJwcmV0X3U4X2YzMiAoZmxvYXQzMngyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91OF9mMzIKKwordWludDh4OF90IHZyZWludGVycHJldF91OF9wMTYgKHBvbHkxNng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91OF9wMTYKKwordWludDh4OF90IHZyZWludGVycHJldF91OF9wOCAocG9seTh4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdThfcDgKKwordWludDh4MTZfdCB2cmVpbnRlcnByZXRxX3U4X3UzMiAodWludDMyeDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91OF91MzIKKwordWludDh4MTZfdCB2cmVpbnRlcnByZXRxX3U4X3UxNiAodWludDE2eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91OF91MTYKKwordWludDh4MTZfdCB2cmVpbnRlcnByZXRxX3U4X3MzMiAoaW50MzJ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3U4X3MzMgorCit1aW50OHgxNl90IHZyZWludGVycHJldHFfdThfczE2IChpbnQxNng4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdThfczE2CisKK3VpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV91OF9zOCAoaW50OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3U4X3M4CisKK3VpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV91OF91NjQgKHVpbnQ2NHgyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdThfdTY0CisKK3VpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV91OF9zNjQgKGludDY0eDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91OF9zNjQKKwordWludDh4MTZfdCB2cmVpbnRlcnByZXRxX3U4X2YzMiAoZmxvYXQzMng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdThfZjMyKHQpIF9NMTI4aSh0KQorCisKK3VpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV91OF9wMTYgKHBvbHkxNng4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdThfcDE2CisKK3VpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV91OF9wOCAocG9seTh4MTZfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91OF9wOAorCit1aW50MTZ4NF90IHZyZWludGVycHJldF91MTZfdTMyICh1aW50MzJ4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTE2X3UzMgorCit1aW50MTZ4NF90IHZyZWludGVycHJldF91MTZfdTggKHVpbnQ4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3UxNl91OAorCit1aW50MTZ4NF90IHZyZWludGVycHJldF91MTZfczMyIChpbnQzMngyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91MTZfczMyCisKK3VpbnQxNng0X3QgdnJlaW50ZXJwcmV0X3UxNl9zMTYgKGludDE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3UxNl9zMTYKKwordWludDE2eDRfdCB2cmVpbnRlcnByZXRfdTE2X3M4IChpbnQ4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3UxNl9zOAorCit1aW50MTZ4NF90IHZyZWludGVycHJldF91MTZfdTY0ICh1aW50NjR4MV90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTE2X3U2NAorCit1aW50MTZ4NF90IHZyZWludGVycHJldF91MTZfczY0IChpbnQ2NHgxX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91MTZfczY0CisKK3VpbnQxNng0X3QgdnJlaW50ZXJwcmV0X3UxNl9mMzIgKGZsb2F0MzJ4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTE2X2YzMgorCit1aW50MTZ4NF90IHZyZWludGVycHJldF91MTZfcDE2IChwb2x5MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTE2X3AxNgorCit1aW50MTZ4NF90IHZyZWludGVycHJldF91MTZfcDggKHBvbHk4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3UxNl9wOAorCit1aW50MTZ4OF90IHZyZWludGVycHJldHFfdTE2X3UzMiAodWludDMyeDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91MTZfdTMyCisKK3VpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV91MTZfdTggKHVpbnQ4eDE2X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTE2X3U4CisKK3VpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV91MTZfczMyIChpbnQzMng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTE2X3MzMgorCit1aW50MTZ4OF90IHZyZWludGVycHJldHFfdTE2X3MxNiAoaW50MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3UxNl9zMTYKKwordWludDE2eDhfdCB2cmVpbnRlcnByZXRxX3UxNl9zOCAoaW50OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3UxNl9zOAorCit1aW50MTZ4OF90IHZyZWludGVycHJldHFfdTE2X3U2NCAodWludDY0eDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91MTZfdTY0CisKK3VpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV91MTZfczY0IChpbnQ2NHgyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTE2X3M2NAorCit1aW50MTZ4OF90IHZyZWludGVycHJldHFfdTE2X2YzMiAoZmxvYXQzMng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTE2X2YzMih0KSBfTTEyOGkodCkKKwordWludDE2eDhfdCB2cmVpbnRlcnByZXRxX3UxNl9wMTYgKHBvbHkxNng4X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTE2X3AxNgorCit1aW50MTZ4OF90IHZyZWludGVycHJldHFfdTE2X3A4IChwb2x5OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3UxNl9wOAorCit1aW50MzJ4Ml90IHZyZWludGVycHJldF91MzJfdTE2ICh1aW50MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTMyX3UxNgorCit1aW50MzJ4Ml90IHZyZWludGVycHJldF91MzJfdTggKHVpbnQ4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3UzMl91OAorCit1aW50MzJ4Ml90IHZyZWludGVycHJldF91MzJfczMyIChpbnQzMngyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91MzJfczMyCisKK3VpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3UzMl9zMTYgKGludDE2eDRfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3UzMl9zMTYKKwordWludDMyeDJfdCB2cmVpbnRlcnByZXRfdTMyX3M4IChpbnQ4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3UzMl9zOAorCit1aW50MzJ4Ml90IHZyZWludGVycHJldF91MzJfdTY0ICh1aW50NjR4MV90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTMyX3U2NAorCit1aW50MzJ4Ml90IHZyZWludGVycHJldF91MzJfczY0IChpbnQ2NHgxX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldF91MzJfczY0CisKK3VpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3UzMl9mMzIgKGZsb2F0MzJ4Ml90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTMyX2YzMgorCit1aW50MzJ4Ml90IHZyZWludGVycHJldF91MzJfcDE2IChwb2x5MTZ4NF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRfdTMyX3AxNgorCit1aW50MzJ4Ml90IHZyZWludGVycHJldF91MzJfcDggKHBvbHk4eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0X3UzMl9wOAorCit1aW50MzJ4NF90IHZyZWludGVycHJldHFfdTMyX3UxNiAodWludDE2eDhfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91MzJfdTE2CisKK3VpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV91MzJfdTggKHVpbnQ4eDE2X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTMyX3U4CisKK3VpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV91MzJfczMyIChpbnQzMng0X3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTMyX3MzMgorCit1aW50MzJ4NF90IHZyZWludGVycHJldHFfdTMyX3MxNiAoaW50MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3UzMl9zMTYKKwordWludDMyeDRfdCB2cmVpbnRlcnByZXRxX3UzMl9zOCAoaW50OHgxNl90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3UzMl9zOAorCit1aW50MzJ4NF90IHZyZWludGVycHJldHFfdTMyX3U2NCAodWludDY0eDJfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91MzJfdTY0CisKK3VpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV91MzJfczY0IChpbnQ2NHgyX3QgdCk7CisjZGVmaW5lIHZyZWludGVycHJldHFfdTMyX3M2NAorCit1aW50MzJ4NF90IHZyZWludGVycHJldHFfdTMyX2YzMiAoZmxvYXQzMng0X3QgdCk7CisjZGVmaW5lICB2cmVpbnRlcnByZXRxX3UzMl9mMzIodCkgX00xMjhpKHQpCisKK3VpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV91MzJfcDE2IChwb2x5MTZ4OF90IHQpOworI2RlZmluZSB2cmVpbnRlcnByZXRxX3UzMl9wMTYKKwordWludDMyeDRfdCB2cmVpbnRlcnByZXRxX3UzMl9wOCAocG9seTh4MTZfdCB0KTsKKyNkZWZpbmUgdnJlaW50ZXJwcmV0cV91MzJfcDgKKworI2VuZGlmIC8qIE5FT04yU1NFX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2F2eDJpbnRyaW4uaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2F2eDJpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTM3YmY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvYXZ4MmludHJpbi5oCkBAIC0wLDAgKzEsMTg3MyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX0lNTUlOVFJJTl9IX0lOQ0xVREVECisjIGVycm9yICJOZXZlciB1c2UgPGF2eDJpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBTdW0gYWJzb2x1dGUgOC1iaXQgaW50ZWdlciBkaWZmZXJlbmNlIG9mIGFkamFjZW50IGdyb3VwcyBvZiA0CisgICBieXRlIGludGVnZXJzIGluIHRoZSBmaXJzdCAyIG9wZXJhbmRzLiAgU3RhcnRpbmcgb2Zmc2V0cyB3aXRoaW4KKyAgIG9wZXJhbmRzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAzcmQgbWFzayBvcGVyYW5kLiAgKi8KKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbXBzYWRid19lcHU4IChfX20yNTZpIF9fWCwgX19tMjU2aSBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfbXBzYWRidzI1NiAoKF9fdjMycWkpX19YLAorCQkJCQkgICAgICAoX192MzJxaSlfX1ksIF9fTSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW0yNTZfbXBzYWRid19lcHU4KFgsIFksIE0pCQkJCQlcCisgICgoX19tMjU2aSkgX19idWlsdGluX2lhMzJfbXBzYWRidzI1NiAoKF9fdjMycWkpKF9fbTI1NmkpKFgpLAkJXAorCQkJCQkoX192MzJxaSkoX19tMjU2aSkoWSksIChpbnQpKE0pKSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Fic19lcGk4IChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BhYnNiMjU2ICgoX192MzJxaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Fic19lcGkxNiAoX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wYWJzdzI1NiAoKF9fdjE2aGkpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9hYnNfZXBpMzIgKF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGFic2QyNTYgKChfX3Y4c2kpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9wYWNrc19lcGkzMiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGFja3NzZHcyNTYgKChfX3Y4c2kpX19BLCAoX192OHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfcGFja3NfZXBpMTYgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BhY2tzc3diMjU2ICgoX192MTZoaSlfX0EsIChfX3YxNmhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfcGFja3VzX2VwaTMyIChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wYWNrdXNkdzI1NiAoKF9fdjhzaSlfX0EsIChfX3Y4c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9wYWNrdXNfZXBpMTYgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BhY2t1c3diMjU2ICgoX192MTZoaSlfX0EsIChfX3YxNmhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYWRkX2VwaTggKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BhZGRiMjU2ICgoX192MzJxaSlfX0EsIChfX3YzMnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYWRkX2VwaTE2IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wYWRkdzI1NiAoKF9fdjE2aGkpX19BLCAoX192MTZoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2FkZF9lcGkzMiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGFkZGQyNTYgKChfX3Y4c2kpX19BLCAoX192OHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYWRkX2VwaTY0IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wYWRkcTI1NiAoKF9fdjRkaSlfX0EsIChfX3Y0ZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9hZGRzX2VwaTggKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BhZGRzYjI1NiAoKF9fdjMycWkpX19BLCAoX192MzJxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2FkZHNfZXBpMTYgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BhZGRzdzI1NiAoKF9fdjE2aGkpX19BLCAoX192MTZoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2FkZHNfZXB1OCAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGFkZHVzYjI1NiAoKF9fdjMycWkpX19BLCAoX192MzJxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2FkZHNfZXB1MTYgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BhZGR1c3cyNTYgKChfX3YxNmhpKV9fQSwgKF9fdjE2aGkpX19CKTsKK30KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9hbGlnbnJfZXBpOCAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CLCBjb25zdCBpbnQgX19OKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BhbGlnbnIyNTYgKChfX3Y0ZGkpX19BLAorCQkJCQkgICAgICAoX192NGRpKV9fQiwKKwkJCQkJICAgICAgX19OICogOCk7Cit9CisjZWxzZQorLyogSW4gdGhhdCBjYXNlIChfX04qOCkgd2lsbCBiZSBpbiB2cmVnLCBhbmQgaW5zbiB3aWxsIG5vdCBiZSBtYXRjaGVkLiAqLworLyogVXNlIGRlZmluZSBpbnN0ZWFkICovCisjZGVmaW5lIF9tbTI1Nl9hbGlnbnJfZXBpOChBLCBCLCBOKQkJCQkgICBcCisgICgoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGFsaWducjI1NiAoKF9fdjRkaSkoX19tMjU2aSkoQSksCSAgIFwKKwkJCQkJKF9fdjRkaSkoX19tMjU2aSkoQiksCSAgIFwKKwkJCQkJKGludCkoTikgKiA4KSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2FuZF9zaTI1NiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2FuZHNpMjU2ICgoX192NGRpKV9fQSwgKF9fdjRkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2FuZG5vdF9zaTI1NiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2FuZG5vdHNpMjU2ICgoX192NGRpKV9fQSwgKF9fdjRkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2F2Z19lcHU4IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wYXZnYjI1NiAoKF9fdjMycWkpX19BLCAoX192MzJxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2F2Z19lcHUxNiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGF2Z3cyNTYgKChfX3YxNmhpKV9fQSwgKF9fdjE2aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9ibGVuZHZfZXBpOCAoX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZLCBfX20yNTZpIF9fTSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYmxlbmR2YjI1NiAoKF9fdjMycWkpX19YLAorCQkJCQkgICAgICAgKF9fdjMycWkpX19ZLAorCQkJCQkgICAgICAgKF9fdjMycWkpX19NKTsKK30KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9ibGVuZF9lcGkxNiAoX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BibGVuZHcyNTYgKChfX3YxNmhpKV9fWCwKKwkJCQkJICAgICAgKF9fdjE2aGkpX19ZLAorCQkJCQkgICAgICAgX19NKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbTI1Nl9ibGVuZF9lcGkxNihYLCBZLCBNKQkJCQkJXAorICAoKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BibGVuZHcyNTYgKChfX3YxNmhpKShfX20yNTZpKShYKSwJCVwKKwkJCQkJKF9fdjE2aGkpKF9fbTI1NmkpKFkpLCAoaW50KShNKSkpCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jbXBlcV9lcGk4IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wY21wZXFiMjU2ICgoX192MzJxaSlfX0EsIChfX3YzMnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY21wZXFfZXBpMTYgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BjbXBlcXcyNTYgKChfX3YxNmhpKV9fQSwgKF9fdjE2aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jbXBlcV9lcGkzMiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGNtcGVxZDI1NiAoKF9fdjhzaSlfX0EsIChfX3Y4c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jbXBlcV9lcGk2NCAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGNtcGVxcTI1NiAoKF9fdjRkaSlfX0EsIChfX3Y0ZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jbXBndF9lcGk4IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wY21wZ3RiMjU2ICgoX192MzJxaSlfX0EsCisJCQkJCSAgICAgKF9fdjMycWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jbXBndF9lcGkxNiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGNtcGd0dzI1NiAoKF9fdjE2aGkpX19BLAorCQkJCQkgICAgIChfX3YxNmhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY21wZ3RfZXBpMzIgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BjbXBndGQyNTYgKChfX3Y4c2kpX19BLAorCQkJCQkgICAgIChfX3Y4c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jbXBndF9lcGk2NCAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcGNtcGd0cTI1NiAoKF9fdjRkaSlfX0EsIChfX3Y0ZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9oYWRkX2VwaTE2IChfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGhhZGR3MjU2ICgoX192MTZoaSlfX1gsCisJCQkJCSAgICAgKF9fdjE2aGkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9oYWRkX2VwaTMyIChfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGhhZGRkMjU2ICgoX192OHNpKV9fWCwgKF9fdjhzaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2hhZGRzX2VwaTE2IChfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGhhZGRzdzI1NiAoKF9fdjE2aGkpX19YLAorCQkJCQkgICAgICAoX192MTZoaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2hzdWJfZXBpMTYgKF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9waHN1YncyNTYgKChfX3YxNmhpKV9fWCwKKwkJCQkJICAgICAoX192MTZoaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2hzdWJfZXBpMzIgKF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9waHN1YmQyNTYgKChfX3Y4c2kpX19YLCAoX192OHNpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaHN1YnNfZXBpMTYgKF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9waHN1YnN3MjU2ICgoX192MTZoaSlfX1gsCisJCQkJCSAgICAgIChfX3YxNmhpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbWFkZHVic19lcGkxNiAoX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtYWRkdWJzdzI1NiAoKF9fdjMycWkpX19YLAorCQkJCQkJKF9fdjMycWkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYWRkX2VwaTE2IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wbWFkZHdkMjU2ICgoX192MTZoaSlfX0EsCisJCQkJCSAgICAgKF9fdjE2aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXhfZXBpOCAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG1heHNiMjU2ICgoX192MzJxaSlfX0EsIChfX3YzMnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbWF4X2VwaTE2IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wbWF4c3cyNTYgKChfX3YxNmhpKV9fQSwgKF9fdjE2aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXhfZXBpMzIgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BtYXhzZDI1NiAoKF9fdjhzaSlfX0EsIChfX3Y4c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXhfZXB1OCAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG1heHViMjU2ICgoX192MzJxaSlfX0EsIChfX3YzMnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbWF4X2VwdTE2IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wbWF4dXcyNTYgKChfX3YxNmhpKV9fQSwgKF9fdjE2aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXhfZXB1MzIgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BtYXh1ZDI1NiAoKF9fdjhzaSlfX0EsIChfX3Y4c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9taW5fZXBpOCAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG1pbnNiMjU2ICgoX192MzJxaSlfX0EsIChfX3YzMnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbWluX2VwaTE2IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wbWluc3cyNTYgKChfX3YxNmhpKV9fQSwgKF9fdjE2aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9taW5fZXBpMzIgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BtaW5zZDI1NiAoKF9fdjhzaSlfX0EsIChfX3Y4c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9taW5fZXB1OCAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG1pbnViMjU2ICgoX192MzJxaSlfX0EsIChfX3YzMnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbWluX2VwdTE2IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wbWludXcyNTYgKChfX3YxNmhpKV9fQSwgKF9fdjE2aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9taW5fZXB1MzIgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BtaW51ZDI1NiAoKF9fdjhzaSlfX0EsIChfX3Y4c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludAorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21vdmVtYXNrX2VwaTggKF9fbTI1NmkgX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcG1vdm1za2IyNTYgKChfX3YzMnFpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0ZXBpOF9lcGkxNiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnN4YncyNTYgKChfX3YxNnFpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0ZXBpOF9lcGkzMiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnN4YmQyNTYgKChfX3YxNnFpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0ZXBpOF9lcGk2NCAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnN4YnEyNTYgKChfX3YxNnFpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0ZXBpMTZfZXBpMzIgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzeHdkMjU2ICgoX192OGhpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0ZXBpMTZfZXBpNjQgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzeHdxMjU2ICgoX192OGhpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0ZXBpMzJfZXBpNjQgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzeGRxMjU2ICgoX192NHNpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0ZXB1OF9lcGkxNiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnp4YncyNTYgKChfX3YxNnFpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0ZXB1OF9lcGkzMiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnp4YmQyNTYgKChfX3YxNnFpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0ZXB1OF9lcGk2NCAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG1vdnp4YnEyNTYgKChfX3YxNnFpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0ZXB1MTZfZXBpMzIgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eHdkMjU2ICgoX192OGhpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0ZXB1MTZfZXBpNjQgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eHdxMjU2ICgoX192OGhpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0ZXB1MzJfZXBpNjQgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eGRxMjU2ICgoX192NHNpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbXVsX2VwaTMyIChfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcG11bGRxMjU2ICgoX192OHNpKV9fWCwgKF9fdjhzaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X211bGhyc19lcGkxNiAoX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BtdWxocnN3MjU2ICgoX192MTZoaSlfX1gsCisJCQkJCSAgICAgICAoX192MTZoaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X211bGhpX2VwdTE2IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wbXVsaHV3MjU2ICgoX192MTZoaSlfX0EsIChfX3YxNmhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbXVsaGlfZXBpMTYgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BtdWxodzI1NiAoKF9fdjE2aGkpX19BLCAoX192MTZoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X211bGxvX2VwaTE2IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wbXVsbHcyNTYgKChfX3YxNmhpKV9fQSwgKF9fdjE2aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tdWxsb19lcGkzMiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG11bGxkMjU2ICgoX192OHNpKV9fQSwgKF9fdjhzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X211bF9lcHUzMiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG11bHVkcTI1NiAoKF9fdjhzaSlfX0EsIChfX3Y4c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9vcl9zaTI1NiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcG9yMjU2ICgoX192NGRpKV9fQSwgKF9fdjRkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NhZF9lcHU4IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc2FkYncyNTYgKChfX3YzMnFpKV9fQSwgKF9fdjMycWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zaHVmZmxlX2VwaTggKF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc2h1ZmIyNTYgKChfX3YzMnFpKV9fWCwKKwkJCQkJICAgICAoX192MzJxaSlfX1kpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NodWZmbGVfZXBpMzIgKF9fbTI1NmkgX19BLCBjb25zdCBpbnQgX19tYXNrKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNodWZkMjU2ICgoX192OHNpKV9fQSwgX19tYXNrKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zaHVmZmxlaGlfZXBpMTYgKF9fbTI1NmkgX19BLCBjb25zdCBpbnQgX19tYXNrKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNodWZodzI1NiAoKF9fdjE2aGkpX19BLCBfX21hc2spOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NodWZmbGVsb19lcGkxNiAoX19tMjU2aSBfX0EsIGNvbnN0IGludCBfX21hc2spCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc2h1Zmx3MjU2ICgoX192MTZoaSlfX0EsIF9fbWFzayk7Cit9CisjZWxzZQorI2RlZmluZSBfbW0yNTZfc2h1ZmZsZV9lcGkzMihBLCBOKSBcCisgICgoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc2h1ZmQyNTYgKChfX3Y4c2kpKF9fbTI1NmkpKEEpLCAoaW50KShOKSkpCisjZGVmaW5lIF9tbTI1Nl9zaHVmZmxlaGlfZXBpMTYoQSwgTikgXAorICAoKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNodWZodzI1NiAoKF9fdjE2aGkpKF9fbTI1NmkpKEEpLCAoaW50KShOKSkpCisjZGVmaW5lIF9tbTI1Nl9zaHVmZmxlbG9fZXBpMTYoQSwgTikgXAorICAoKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNodWZsdzI1NiAoKF9fdjE2aGkpKF9fbTI1NmkpKEEpLCAoaW50KShOKSkpCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zaWduX2VwaTggKF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc2lnbmIyNTYgKChfX3YzMnFpKV9fWCwgKF9fdjMycWkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zaWduX2VwaTE2IChfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHNpZ253MjU2ICgoX192MTZoaSlfX1gsIChfX3YxNmhpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2lnbl9lcGkzMiAoX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzaWduZDI1NiAoKF9fdjhzaSlfX1gsIChfX3Y4c2kpX19ZKTsKK30KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zbGxpX3NpMjU2IChfX20yNTZpIF9fQSwgY29uc3QgaW50IF9fTikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzbGxkcWkyNTYgKF9fQSwgX19OICogOCk7Cit9CisjZWxzZQorI2RlZmluZSBfbW0yNTZfc2xsaV9zaTI1NihBLCBOKSBcCisgICgoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc2xsZHFpMjU2ICgoX19tMjU2aSkoQSksIChpbnQpKE4pICogOCkpCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zbGxpX2VwaTE2IChfX20yNTZpIF9fQSwgaW50IF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzbGx3aTI1NiAoKF9fdjE2aGkpX19BLCBfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NsbF9lcGkxNiAoX19tMjU2aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNsbHcyNTYoKF9fdjE2aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2xsaV9lcGkzMiAoX19tMjU2aSBfX0EsIGludCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc2xsZGkyNTYgKChfX3Y4c2kpX19BLCBfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NsbF9lcGkzMiAoX19tMjU2aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNsbGQyNTYoKF9fdjhzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zbGxpX2VwaTY0IChfX20yNTZpIF9fQSwgaW50IF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzbGxxaTI1NiAoKF9fdjRkaSlfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2xsX2VwaTY0IChfX20yNTZpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc2xscTI1NigoX192NGRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NyYWlfZXBpMTYgKF9fbTI1NmkgX19BLCBpbnQgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNyYXdpMjU2ICgoX192MTZoaSlfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3JhX2VwaTE2IChfX20yNTZpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3JhdzI1NiAoKF9fdjE2aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3JhaV9lcGkzMiAoX19tMjU2aSBfX0EsIGludCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3JhZGkyNTYgKChfX3Y4c2kpX19BLCBfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NyYV9lcGkzMiAoX19tMjU2aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNyYWQyNTYgKChfX3Y4c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3JsaV9zaTI1NiAoX19tMjU2aSBfX0EsIGNvbnN0IGludCBfX04pCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3JsZHFpMjU2IChfX0EsIF9fTiAqIDgpOworfQorI2Vsc2UKKyNkZWZpbmUgX21tMjU2X3NybGlfc2kyNTYoQSwgTikgXAorICAoKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNybGRxaTI1NiAoKF9fbTI1NmkpKEEpLCAoaW50KShOKSAqIDgpKQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3JsaV9lcGkxNiAoX19tMjU2aSBfX0EsIGludCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3Jsd2kyNTYgKChfX3YxNmhpKV9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zcmxfZXBpMTYgKF9fbTI1NmkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3Bzcmx3MjU2KChfX3YxNmhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NybGlfZXBpMzIgKF9fbTI1NmkgX19BLCBpbnQgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNybGRpMjU2ICgoX192OHNpKV9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zcmxfZXBpMzIgKF9fbTI1NmkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzcmxkMjU2KChfX3Y4c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3JsaV9lcGk2NCAoX19tMjU2aSBfX0EsIGludCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3JscWkyNTYgKChfX3Y0ZGkpX19BLCBfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NybF9lcGk2NCAoX19tMjU2aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHNybHEyNTYoKF9fdjRkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdWJfZXBpOCAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHN1YmIyNTYgKChfX3YzMnFpKV9fQSwgKF9fdjMycWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdWJfZXBpMTYgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzdWJ3MjU2ICgoX192MTZoaSlfX0EsIChfX3YxNmhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3ViX2VwaTMyIChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3ViZDI1NiAoKF9fdjhzaSlfX0EsIChfX3Y4c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdWJfZXBpNjQgKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3BzdWJxMjU2ICgoX192NGRpKV9fQSwgKF9fdjRkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3N1YnNfZXBpOCAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHN1YnNiMjU2ICgoX192MzJxaSlfX0EsIChfX3YzMnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3Vic19lcGkxNiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHN1YnN3MjU2ICgoX192MTZoaSlfX0EsIChfX3YxNmhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3Vic19lcHU4IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wc3VidXNiMjU2ICgoX192MzJxaSlfX0EsIChfX3YzMnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3Vic19lcHUxNiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHN1YnVzdzI1NiAoKF9fdjE2aGkpX19BLCAoX192MTZoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3VucGFja2hpX2VwaTggKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3B1bnBja2hidzI1NiAoKF9fdjMycWkpX19BLCAoX192MzJxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3VucGFja2hpX2VwaTE2IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wdW5wY2tod2QyNTYgKChfX3YxNmhpKV9fQSwgKF9fdjE2aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl91bnBhY2toaV9lcGkzMiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHVucGNraGRxMjU2ICgoX192OHNpKV9fQSwgKF9fdjhzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3VucGFja2hpX2VwaTY0IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wdW5wY2tocWRxMjU2ICgoX192NGRpKV9fQSwgKF9fdjRkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3VucGFja2xvX2VwaTggKF9fbTI1NmkgX19BLCBfX20yNTZpIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX3B1bnBja2xidzI1NiAoKF9fdjMycWkpX19BLCAoX192MzJxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3VucGFja2xvX2VwaTE2IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wdW5wY2tsd2QyNTYgKChfX3YxNmhpKV9fQSwgKF9fdjE2aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl91bnBhY2tsb19lcGkzMiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHVucGNrbGRxMjU2ICgoX192OHNpKV9fQSwgKF9fdjhzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3VucGFja2xvX2VwaTY0IChfX20yNTZpIF9fQSwgX19tMjU2aSBfX0IpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9wdW5wY2tscWRxMjU2ICgoX192NGRpKV9fQSwgKF9fdjRkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3hvcl9zaTI1NiAoX19tMjU2aSBfX0EsIF9fbTI1NmkgX19CKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfcHhvcjI1NiAoKF9fdjRkaSlfX0EsIChfX3Y0ZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdHJlYW1fbG9hZF9zaTI1NiAoX19tMjU2aSBjb25zdCAqX19YKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX21vdm50ZHFhMjU2ICgoX192NGRpICopIF9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjgKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9icm9hZGNhc3Rzc19wcyAoX19tMTI4IF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3Zicm9hZGNhc3Rzc19wcyAoKF9fdjRzZilfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2CitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYnJvYWRjYXN0c3NfcHMgKF9fbTEyOCBfX1gpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92YnJvYWRjYXN0c3NfcHMyNTYgKChfX3Y0c2YpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9icm9hZGNhc3RzZF9wZCAoX19tMTI4ZCBfX1gpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdmJyb2FkY2FzdHNkX3BkMjU2ICgoX192MmRmKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYnJvYWRjYXN0c2kxMjhfc2kyNTYgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Zicm9hZGNhc3RzaTI1NiAoKF9fdjJkaSlfX1gpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2JsZW5kX2VwaTMyIChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGJsZW5kZDEyOCAoKF9fdjRzaSlfX1gsCisJCQkJCSAgICAgIChfX3Y0c2kpX19ZLAorCQkJCQkgICAgICBfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX2JsZW5kX2VwaTMyKFgsIFksIE0pCQkJCQlcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGJsZW5kZDEyOCAoKF9fdjRzaSkoX19tMTI4aSkoWCksCQlcCisJCQkJCShfX3Y0c2kpKF9fbTEyOGkpKFkpLCAoaW50KShNKSkpCisjZW5kaWYKKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9ibGVuZF9lcGkzMiAoX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BibGVuZGQyNTYgKChfX3Y4c2kpX19YLAorCQkJCQkgICAgICAoX192OHNpKV9fWSwKKwkJCQkJICAgICAgX19NKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbTI1Nl9ibGVuZF9lcGkzMihYLCBZLCBNKQkJCQkJXAorICAoKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BibGVuZGQyNTYgKChfX3Y4c2kpKF9fbTI1NmkpKFgpLAkJXAorCQkJCQkoX192OHNpKShfX20yNTZpKShZKSwgKGludCkoTSkpKQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYnJvYWRjYXN0Yl9lcGk4IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYnJvYWRjYXN0YjI1NiAoKF9fdjE2cWkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9icm9hZGNhc3R3X2VwaTE2IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wYnJvYWRjYXN0dzI1NiAoKF9fdjhoaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Jyb2FkY2FzdGRfZXBpMzIgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Bicm9hZGNhc3RkMjU2ICgoX192NHNpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYnJvYWRjYXN0cV9lcGk2NCAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGJyb2FkY2FzdHEyNTYgKChfX3YyZGkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9icm9hZGNhc3RiX2VwaTggKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Bicm9hZGNhc3RiMTI4ICgoX192MTZxaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Jyb2FkY2FzdHdfZXBpMTYgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Bicm9hZGNhc3R3MTI4ICgoX192OGhpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYnJvYWRjYXN0ZF9lcGkzMiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGJyb2FkY2FzdGQxMjggKChfX3Y0c2kpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9icm9hZGNhc3RxX2VwaTY0IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYnJvYWRjYXN0cTEyOCAoKF9fdjJkaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Blcm11dGV2YXI4eDMyX2VwaTMyIChfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGVybXZhcnNpMjU2ICgoX192OHNpKV9fWCwgKF9fdjhzaSlfX1kpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZAorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Blcm11dGU0eDY0X3BkIChfX20yNTZkIF9fWCwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9wZXJtZGYyNTYgKChfX3Y0ZGYpX19YLCBfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tMjU2X3Blcm11dGU0eDY0X3BkKFgsIE0pCQkJICAgICAgIFwKKyAgKChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9wZXJtZGYyNTYgKChfX3Y0ZGYpKF9fbTI1NmQpKFgpLCAoaW50KShNKSkpCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NgorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Blcm11dGV2YXI4eDMyX3BzIChfX20yNTYgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJzZjI1NiAoKF9fdjhzZilfX1gsIChfX3Y4c2kpX19ZKTsKK30KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9wZXJtdXRlNHg2NF9lcGk2NCAoX19tMjU2aSBfX1gsIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGVybWRpMjU2ICgoX192NGRpKV9fWCwgX19NKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbTI1Nl9wZXJtdXRlNHg2NF9lcGk2NChYLCBNKQkJCSAgICAgICBcCisgICgoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcGVybWRpMjU2ICgoX192NGRpKShfX20yNTZpKShYKSwgKGludCkoTSkpKQorI2VuZGlmCisKKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9wZXJtdXRlMngxMjhfc2kyNTYgKF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wZXJtdGkyNTYgKChfX3Y0ZGkpX19YLCAoX192NGRpKV9fWSwgX19NKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbTI1Nl9wZXJtdXRlMngxMjhfc2kyNTYoWCwgWSwgTSkJCQkJXAorICAoKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Blcm10aTI1NiAoKF9fdjRkaSkoX19tMjU2aSkoWCksIChfX3Y0ZGkpKF9fbTI1NmkpKFkpLCAoaW50KShNKSkpCisjZW5kaWYKKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9leHRyYWN0aTEyOF9zaTI1NiAoX19tMjU2aSBfX1gsIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfZXh0cmFjdDEyOGkyNTYgKChfX3Y0ZGkpX19YLCBfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tMjU2X2V4dHJhY3RpMTI4X3NpMjU2KFgsIE0pCQkJCVwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9leHRyYWN0MTI4aTI1NiAoKF9fdjRkaSkoX19tMjU2aSkoWCksIChpbnQpKE0pKSkKKyNlbmRpZgorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2luc2VydGkxMjhfc2kyNTYgKF9fbTI1NmkgX19YLCBfX20xMjhpIF9fWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9pbnNlcnQxMjhpMjU2ICgoX192NGRpKV9fWCwgKF9fdjJkaSlfX1ksIF9fTSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW0yNTZfaW5zZXJ0aTEyOF9zaTI1NihYLCBZLCBNKQkJCSBcCisgICgoX19tMjU2aSkgX19idWlsdGluX2lhMzJfaW5zZXJ0MTI4aTI1NiAoKF9fdjRkaSkoX19tMjU2aSkoWCksIFwKKwkJCQkJICAgKF9fdjJkaSkoX19tMTI4aSkoWSksIFwKKwkJCQkJICAgKGludCkoTSkpKQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbWFza2xvYWRfZXBpMzIgKGludCBjb25zdCAqX19YLCBfX20yNTZpIF9fTSApCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfbWFza2xvYWRkMjU2ICgoY29uc3QgX192OHNpICopX19YLAorCQkJCQkJKF9fdjhzaSlfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21hc2tsb2FkX2VwaTY0IChsb25nIGxvbmcgY29uc3QgKl9fWCwgX19tMjU2aSBfX00gKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX21hc2tsb2FkcTI1NiAoKGNvbnN0IF9fdjRkaSAqKV9fWCwKKwkJCQkJCShfX3Y0ZGkpX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXNrbG9hZF9lcGkzMiAoaW50IGNvbnN0ICpfX1gsIF9fbTEyOGkgX19NICkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9tYXNrbG9hZGQgKChjb25zdCBfX3Y0c2kgKilfX1gsCisJCQkJCSAgICAgKF9fdjRzaSlfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hc2tsb2FkX2VwaTY0IChsb25nIGxvbmcgY29uc3QgKl9fWCwgX19tMTI4aSBfX00gKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX21hc2tsb2FkcSAoKGNvbnN0IF9fdjJkaSAqKV9fWCwKKwkJCQkJICAgICAoX192MmRpKV9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbWFza3N0b3JlX2VwaTMyIChpbnQgKl9fWCwgX19tMjU2aSBfX00sIF9fbTI1NmkgX19ZICkKK3sKKyAgX19idWlsdGluX2lhMzJfbWFza3N0b3JlZDI1NiAoKF9fdjhzaSAqKV9fWCwgKF9fdjhzaSlfX00sIChfX3Y4c2kpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXNrc3RvcmVfZXBpNjQgKGxvbmcgbG9uZyAqX19YLCBfX20yNTZpIF9fTSwgX19tMjU2aSBfX1kgKQoreworICBfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVxMjU2ICgoX192NGRpICopX19YLCAoX192NGRpKV9fTSwgKF9fdjRkaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZAorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hc2tzdG9yZV9lcGkzMiAoaW50ICpfX1gsIF9fbTEyOGkgX19NLCBfX20xMjhpIF9fWSApCit7CisgIF9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZWQgKChfX3Y0c2kgKilfX1gsIChfX3Y0c2kpX19NLCAoX192NHNpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFza3N0b3JlX2VwaTY0IChsb25nIGxvbmcgKl9fWCwgX19tMTI4aSBfX00sIF9fbTEyOGkgX19ZICkKK3sKKyAgX19idWlsdGluX2lhMzJfbWFza3N0b3JlcSAoKCBfX3YyZGkgKilfX1gsIChfX3YyZGkpX19NLCAoX192MmRpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2xsdl9lcGkzMiAoX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3BzbGx2OHNpICgoX192OHNpKV9fWCwgKF9fdjhzaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NsbHZfZXBpMzIgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc2xsdjRzaSAoKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zbGx2X2VwaTY0IChfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHNsbHY0ZGkgKChfX3Y0ZGkpX19YLCAoX192NGRpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2xsdl9lcGk2NCAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzbGx2MmRpICgoX192MmRpKV9fWCwgKF9fdjJkaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NyYXZfZXBpMzIgKF9fbTI1NmkgX19YLCBfX20yNTZpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9wc3JhdjhzaSAoKF9fdjhzaSlfX1gsIChfX3Y4c2kpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmF2X2VwaTMyIChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNyYXY0c2kgKChfX3Y0c2kpX19YLCAoX192NHNpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3Jsdl9lcGkzMiAoX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3Bzcmx2OHNpICgoX192OHNpKV9fWCwgKF9fdjhzaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NybHZfZXBpMzIgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc3JsdjRzaSAoKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zcmx2X2VwaTY0IChfX20yNTZpIF9fWCwgX19tMjU2aSBfX1kpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfcHNybHY0ZGkgKChfX3Y0ZGkpX19YLCAoX192NGRpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3Jsdl9lcGk2NCAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Bzcmx2MmRpICgoX192MmRpKV9fWCwgKF9fdjJkaSlfX1kpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZAorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2kzMmdhdGhlcl9wZCAoZG91YmxlIGNvbnN0ICpiYXNlLCBfX20xMjhpIGluZGV4LCBjb25zdCBpbnQgc2NhbGUpCit7CisgIF9fdjJkZiBzcmMgPSBfbW1fc2V0emVyb19wZCAoKTsKKyAgX192MmRmIG1hc2sgPSBfbW1fY21wZXFfcGQgKHNyYywgc3JjKTsKKworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjJkZiAoc3JjLAorCQkJCQkJYmFzZSwKKwkJCQkJCShfX3Y0c2kpaW5kZXgsCisJCQkJCQltYXNrLAorCQkJCQkJc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZAorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hc2tfaTMyZ2F0aGVyX3BkIChfX20xMjhkIHNyYywgZG91YmxlIGNvbnN0ICpiYXNlLCBfX20xMjhpIGluZGV4LAorCQkgICAgICAgX19tMTI4ZCBtYXNrLCBjb25zdCBpbnQgc2NhbGUpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2MmRmICgoX192MmRmKXNyYywKKwkJCQkJCWJhc2UsCisJCQkJCQkoX192NHNpKWluZGV4LAorCQkJCQkJKF9fdjJkZiltYXNrLAorCQkJCQkJc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZAorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2kzMmdhdGhlcl9wZCAoZG91YmxlIGNvbnN0ICpiYXNlLCBfX20xMjhpIGluZGV4LCBjb25zdCBpbnQgc2NhbGUpCit7CisgIF9fdjRkZiBzcmMgPSBfbW0yNTZfc2V0emVyb19wZCAoKTsKKyAgX192NGRmIG1hc2sgPSBfbW0yNTZfY21wX3BkIChzcmMsIHNyYywgX0NNUF9FUV9PUSk7CisKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY0ZGYgKHNyYywKKwkJCQkJCWJhc2UsCisJCQkJCQkoX192NHNpKWluZGV4LAorCQkJCQkJbWFzaywKKwkJCQkJCXNjYWxlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXNrX2kzMmdhdGhlcl9wZCAoX19tMjU2ZCBzcmMsIGRvdWJsZSBjb25zdCAqYmFzZSwKKwkJCSAgX19tMTI4aSBpbmRleCwgX19tMjU2ZCBtYXNrLCBjb25zdCBpbnQgc2NhbGUpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2NGRmICgoX192NGRmKXNyYywKKwkJCQkJCWJhc2UsCisJCQkJCQkoX192NHNpKWluZGV4LAorCQkJCQkJKF9fdjRkZiltYXNrLAorCQkJCQkJc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZAorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2k2NGdhdGhlcl9wZCAoZG91YmxlIGNvbnN0ICpiYXNlLCBfX20xMjhpIGluZGV4LCBjb25zdCBpbnQgc2NhbGUpCit7CisgIF9fdjJkZiBzcmMgPSBfbW1fc2V0emVyb19wZCAoKTsKKyAgX192MmRmIG1hc2sgPSBfbW1fY21wZXFfcGQgKHNyYywgc3JjKTsKKworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjJkZiAoc3JjLAorCQkJCQkJYmFzZSwKKwkJCQkJCShfX3YyZGkpaW5kZXgsCisJCQkJCQltYXNrLAorCQkJCQkJc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZAorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hc2tfaTY0Z2F0aGVyX3BkIChfX20xMjhkIHNyYywgZG91YmxlIGNvbnN0ICpiYXNlLCBfX20xMjhpIGluZGV4LAorCQkgICAgICAgX19tMTI4ZCBtYXNrLCBjb25zdCBpbnQgc2NhbGUpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2MmRmICgoX192MmRmKXNyYywKKwkJCQkJCWJhc2UsCisJCQkJCQkoX192MmRpKWluZGV4LAorCQkJCQkJKF9fdjJkZiltYXNrLAorCQkJCQkJc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZAorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2k2NGdhdGhlcl9wZCAoZG91YmxlIGNvbnN0ICpiYXNlLCBfX20yNTZpIGluZGV4LCBjb25zdCBpbnQgc2NhbGUpCit7CisgIF9fdjRkZiBzcmMgPSBfbW0yNTZfc2V0emVyb19wZCAoKTsKKyAgX192NGRmIG1hc2sgPSBfbW0yNTZfY21wX3BkIChzcmMsIHNyYywgX0NNUF9FUV9PUSk7CisKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY0ZGYgKHNyYywKKwkJCQkJCWJhc2UsCisJCQkJCQkoX192NGRpKWluZGV4LAorCQkJCQkJbWFzaywKKwkJCQkJCXNjYWxlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXNrX2k2NGdhdGhlcl9wZCAoX19tMjU2ZCBzcmMsIGRvdWJsZSBjb25zdCAqYmFzZSwKKwkJCSAgX19tMjU2aSBpbmRleCwgX19tMjU2ZCBtYXNrLCBjb25zdCBpbnQgc2NhbGUpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2NGRmICgoX192NGRmKXNyYywKKwkJCQkJCWJhc2UsCisJCQkJCQkoX192NGRpKWluZGV4LAorCQkJCQkJKF9fdjRkZiltYXNrLAorCQkJCQkJc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4CitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faTMyZ2F0aGVyX3BzIChmbG9hdCBjb25zdCAqYmFzZSwgX19tMTI4aSBpbmRleCwgY29uc3QgaW50IHNjYWxlKQoreworICBfX3Y0c2Ygc3JjID0gX21tX3NldHplcm9fcHMgKCk7CisgIF9fdjRzZiBtYXNrID0gX21tX2NtcGVxX3BzIChzcmMsIHNyYyk7CisKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjRzZiAoc3JjLAorCQkJCQkgICAgICAgYmFzZSwKKwkJCQkJICAgICAgIChfX3Y0c2kpaW5kZXgsCisJCQkJCSAgICAgICBtYXNrLAorCQkJCQkgICAgICAgc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4CitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFza19pMzJnYXRoZXJfcHMgKF9fbTEyOCBzcmMsIGZsb2F0IGNvbnN0ICpiYXNlLCBfX20xMjhpIGluZGV4LAorCQkgICAgICAgX19tMTI4IG1hc2ssIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjRzZiAoKF9fdjRzZilzcmMsCisJCQkJCSAgICAgICBiYXNlLAorCQkJCQkgICAgICAgKF9fdjRzaSlpbmRleCwKKwkJCQkJICAgICAgIChfX3Y0c2YpbWFzaywKKwkJCQkJICAgICAgIHNjYWxlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NgorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2kzMmdhdGhlcl9wcyAoZmxvYXQgY29uc3QgKmJhc2UsIF9fbTI1NmkgaW5kZXgsIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgX192OHNmIHNyYyA9IF9tbTI1Nl9zZXR6ZXJvX3BzICgpOworICBfX3Y4c2YgbWFzayA9IF9tbTI1Nl9jbXBfcHMgKHNyYywgc3JjLCBfQ01QX0VRX09RKTsKKworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2OHNmIChzcmMsCisJCQkJCSAgICAgICBiYXNlLAorCQkJCQkgICAgICAgKF9fdjhzaSlpbmRleCwKKwkJCQkJICAgICAgIG1hc2ssCisJCQkJCSAgICAgICBzY2FsZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXNrX2kzMmdhdGhlcl9wcyAoX19tMjU2IHNyYywgZmxvYXQgY29uc3QgKmJhc2UsCisJCQkgIF9fbTI1NmkgaW5kZXgsIF9fbTI1NiBtYXNrLCBjb25zdCBpbnQgc2NhbGUpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY4c2YgKChfX3Y4c2Ypc3JjLAorCQkJCQkgICAgICAgYmFzZSwKKwkJCQkJICAgICAgIChfX3Y4c2kpaW5kZXgsCisJCQkJCSAgICAgICAoX192OHNmKW1hc2ssCisJCQkJCSAgICAgICBzY2FsZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjgKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9pNjRnYXRoZXJfcHMgKGZsb2F0IGNvbnN0ICpiYXNlLCBfX20xMjhpIGluZGV4LCBjb25zdCBpbnQgc2NhbGUpCit7CisgIF9fdjRzZiBzcmMgPSBfbW1fc2V0emVyb19wcyAoKTsKKyAgX192NHNmIG1hc2sgPSBfbW1fY21wZXFfcHMgKHNyYywgc3JjKTsKKworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2NHNmIChzcmMsCisJCQkJCSAgICAgICBiYXNlLAorCQkJCQkgICAgICAgKF9fdjJkaSlpbmRleCwKKwkJCQkJICAgICAgIG1hc2ssCisJCQkJCSAgICAgICBzY2FsZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjgKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXNrX2k2NGdhdGhlcl9wcyAoX19tMTI4IHNyYywgZmxvYXQgY29uc3QgKmJhc2UsIF9fbTEyOGkgaW5kZXgsCisJCSAgICAgICBfX20xMjggbWFzaywgY29uc3QgaW50IHNjYWxlKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2NHNmICgoX192NHNmKXNyYywKKwkJCQkJCWJhc2UsCisJCQkJCQkoX192MmRpKWluZGV4LAorCQkJCQkJKF9fdjRzZiltYXNrLAorCQkJCQkJc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4CitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaTY0Z2F0aGVyX3BzIChmbG9hdCBjb25zdCAqYmFzZSwgX19tMjU2aSBpbmRleCwgY29uc3QgaW50IHNjYWxlKQoreworICBfX3Y0c2Ygc3JjID0gX21tX3NldHplcm9fcHMgKCk7CisgIF9fdjRzZiBtYXNrID0gX21tX2NtcGVxX3BzIChzcmMsIHNyYyk7CisKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjRzZjI1NiAoc3JjLAorCQkJCQkJICBiYXNlLAorCQkJCQkJICAoX192NGRpKWluZGV4LAorCQkJCQkJICBtYXNrLAorCQkJCQkJICBzY2FsZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjgKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXNrX2k2NGdhdGhlcl9wcyAoX19tMTI4IHNyYywgZmxvYXQgY29uc3QgKmJhc2UsCisJCQkgIF9fbTI1NmkgaW5kZXgsIF9fbTEyOCBtYXNrLCBjb25zdCBpbnQgc2NhbGUpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY0c2YyNTYgKChfX3Y0c2Ypc3JjLAorCQkJCQkJICBiYXNlLAorCQkJCQkJICAoX192NGRpKWluZGV4LAorCQkJCQkJICAoX192NHNmKW1hc2ssCisJCQkJCQkgIHNjYWxlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9pMzJnYXRoZXJfZXBpNjQgKGxvbmcgbG9uZyBpbnQgY29uc3QgKmJhc2UsCisJCSAgICAgX19tMTI4aSBpbmRleCwgY29uc3QgaW50IHNjYWxlKQoreworICBfX3YyZGkgc3JjID0gX19leHRlbnNpb25fXyAoX192MmRpKXsgMCwgMCB9OworICBfX3YyZGkgbWFzayA9IF9fZXh0ZW5zaW9uX18gKF9fdjJkaSl7IH4wLCB+MCB9OworCisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2MmRpIChzcmMsCisJCQkJCQliYXNlLAorCQkJCQkJKF9fdjRzaSlpbmRleCwKKwkJCQkJCW1hc2ssCisJCQkJCQlzY2FsZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFza19pMzJnYXRoZXJfZXBpNjQgKF9fbTEyOGkgc3JjLCBsb25nIGxvbmcgaW50IGNvbnN0ICpiYXNlLAorCQkJICBfX20xMjhpIGluZGV4LCBfX20xMjhpIG1hc2ssIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXYyZGkgKChfX3YyZGkpc3JjLAorCQkJCQkJYmFzZSwKKwkJCQkJCShfX3Y0c2kpaW5kZXgsCisJCQkJCQkoX192MmRpKW1hc2ssCisJCQkJCQlzY2FsZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaTMyZ2F0aGVyX2VwaTY0IChsb25nIGxvbmcgaW50IGNvbnN0ICpiYXNlLAorCQkJX19tMTI4aSBpbmRleCwgY29uc3QgaW50IHNjYWxlKQoreworICBfX3Y0ZGkgc3JjID0gX19leHRlbnNpb25fXyAoX192NGRpKXsgMCwgMCwgMCwgMCB9OworICBfX3Y0ZGkgbWFzayA9IF9fZXh0ZW5zaW9uX18gKF9fdjRkaSl7IH4wLCB+MCwgfjAsIH4wIH07CisKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY0ZGkgKHNyYywKKwkJCQkJCWJhc2UsCisJCQkJCQkoX192NHNpKWluZGV4LAorCQkJCQkJbWFzaywKKwkJCQkJCXNjYWxlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXNrX2kzMmdhdGhlcl9lcGk2NCAoX19tMjU2aSBzcmMsIGxvbmcgbG9uZyBpbnQgY29uc3QgKmJhc2UsCisJCQkgICAgIF9fbTEyOGkgaW5kZXgsIF9fbTI1NmkgbWFzaywgY29uc3QgaW50IHNjYWxlKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjRkaSAoKF9fdjRkaSlzcmMsCisJCQkJCQliYXNlLAorCQkJCQkJKF9fdjRzaSlpbmRleCwKKwkJCQkJCShfX3Y0ZGkpbWFzaywKKwkJCQkJCXNjYWxlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9pNjRnYXRoZXJfZXBpNjQgKGxvbmcgbG9uZyBpbnQgY29uc3QgKmJhc2UsCisJCSAgICAgX19tMTI4aSBpbmRleCwgY29uc3QgaW50IHNjYWxlKQoreworICBfX3YyZGkgc3JjID0gX19leHRlbnNpb25fXyAoX192MmRpKXsgMCwgMCB9OworICBfX3YyZGkgbWFzayA9IF9fZXh0ZW5zaW9uX18gKF9fdjJkaSl7IH4wLCB+MCB9OworCisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2MmRpIChzcmMsCisJCQkJCQliYXNlLAorCQkJCQkJKF9fdjJkaSlpbmRleCwKKwkJCQkJCW1hc2ssCisJCQkJCQlzY2FsZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFza19pNjRnYXRoZXJfZXBpNjQgKF9fbTEyOGkgc3JjLCBsb25nIGxvbmcgaW50IGNvbnN0ICpiYXNlLCBfX20xMjhpIGluZGV4LAorCQkJICBfX20xMjhpIG1hc2ssIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXYyZGkgKChfX3YyZGkpc3JjLAorCQkJCQkJYmFzZSwKKwkJCQkJCShfX3YyZGkpaW5kZXgsCisJCQkJCQkoX192MmRpKW1hc2ssCisJCQkJCQlzY2FsZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaTY0Z2F0aGVyX2VwaTY0IChsb25nIGxvbmcgaW50IGNvbnN0ICpiYXNlLAorCQkJX19tMjU2aSBpbmRleCwgY29uc3QgaW50IHNjYWxlKQoreworICBfX3Y0ZGkgc3JjID0gX19leHRlbnNpb25fXyAoX192NGRpKXsgMCwgMCwgMCwgMCB9OworICBfX3Y0ZGkgbWFzayA9IF9fZXh0ZW5zaW9uX18gKF9fdjRkaSl7IH4wLCB+MCwgfjAsIH4wIH07CisKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY0ZGkgKHNyYywKKwkJCQkJCWJhc2UsCisJCQkJCQkoX192NGRpKWluZGV4LAorCQkJCQkJbWFzaywKKwkJCQkJCXNjYWxlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXNrX2k2NGdhdGhlcl9lcGk2NCAoX19tMjU2aSBzcmMsIGxvbmcgbG9uZyBpbnQgY29uc3QgKmJhc2UsCisJCQkgICAgIF9fbTI1NmkgaW5kZXgsIF9fbTI1NmkgbWFzaywgY29uc3QgaW50IHNjYWxlKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjRkaSAoKF9fdjRkaSlzcmMsCisJCQkJCQliYXNlLAorCQkJCQkJKF9fdjRkaSlpbmRleCwKKwkJCQkJCShfX3Y0ZGkpbWFzaywKKwkJCQkJCXNjYWxlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9pMzJnYXRoZXJfZXBpMzIgKGludCBjb25zdCAqYmFzZSwgX19tMTI4aSBpbmRleCwgY29uc3QgaW50IHNjYWxlKQoreworICBfX3Y0c2kgc3JjID0gX19leHRlbnNpb25fXyAoX192NHNpKXsgMCwgMCwgMCwgMCB9OworICBfX3Y0c2kgbWFzayA9IF9fZXh0ZW5zaW9uX18gKF9fdjRzaSl7IH4wLCB+MCwgfjAsIH4wIH07CisKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY0c2kgKHNyYywKKwkJCQkJICAgICAgIGJhc2UsCisJCQkJCSAgICAgICAoX192NHNpKWluZGV4LAorCQkJCQkgICAgICAgbWFzaywKKwkJCQkJICAgICAgIHNjYWxlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXNrX2kzMmdhdGhlcl9lcGkzMiAoX19tMTI4aSBzcmMsIGludCBjb25zdCAqYmFzZSwgX19tMTI4aSBpbmRleCwKKwkJCSAgX19tMTI4aSBtYXNrLCBjb25zdCBpbnQgc2NhbGUpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2NHNpICgoX192NHNpKXNyYywKKwkJCQkJCWJhc2UsCisJCQkJCQkoX192NHNpKWluZGV4LAorCQkJCQkJKF9fdjRzaSltYXNrLAorCQkJCQkJc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2kzMmdhdGhlcl9lcGkzMiAoaW50IGNvbnN0ICpiYXNlLCBfX20yNTZpIGluZGV4LCBjb25zdCBpbnQgc2NhbGUpCit7CisgIF9fdjhzaSBzcmMgPSBfX2V4dGVuc2lvbl9fIChfX3Y4c2kpeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CisgIF9fdjhzaSBtYXNrID0gX19leHRlbnNpb25fXyAoX192OHNpKXsgfjAsIH4wLCB+MCwgfjAsIH4wLCB+MCwgfjAsIH4wIH07CisKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY4c2kgKHNyYywKKwkJCQkJCWJhc2UsCisJCQkJCQkoX192OHNpKWluZGV4LAorCQkJCQkJbWFzaywKKwkJCQkJCXNjYWxlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXNrX2kzMmdhdGhlcl9lcGkzMiAoX19tMjU2aSBzcmMsIGludCBjb25zdCAqYmFzZSwKKwkJCSAgICAgX19tMjU2aSBpbmRleCwgX19tMjU2aSBtYXNrLCBjb25zdCBpbnQgc2NhbGUpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2OHNpICgoX192OHNpKXNyYywKKwkJCQkJCWJhc2UsCisJCQkJCQkoX192OHNpKWluZGV4LAorCQkJCQkJKF9fdjhzaSltYXNrLAorCQkJCQkJc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2k2NGdhdGhlcl9lcGkzMiAoaW50IGNvbnN0ICpiYXNlLCBfX20xMjhpIGluZGV4LCBjb25zdCBpbnQgc2NhbGUpCit7CisgIF9fdjRzaSBzcmMgPSBfX2V4dGVuc2lvbl9fIChfX3Y0c2kpeyAwLCAwLCAwLCAwIH07CisgIF9fdjRzaSBtYXNrID0gX19leHRlbnNpb25fXyAoX192NHNpKXsgfjAsIH4wLCB+MCwgfjAgfTsKKworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjRzaSAoc3JjLAorCQkJCQkJYmFzZSwKKwkJCQkJCShfX3YyZGkpaW5kZXgsCisJCQkJCQltYXNrLAorCQkJCQkJc2NhbGUpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aQorX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hc2tfaTY0Z2F0aGVyX2VwaTMyIChfX20xMjhpIHNyYywgaW50IGNvbnN0ICpiYXNlLCBfX20xMjhpIGluZGV4LAorCQkJICBfX20xMjhpIG1hc2ssIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY0c2kgKChfX3Y0c2kpc3JjLAorCQkJCQkJYmFzZSwKKwkJCQkJCShfX3YyZGkpaW5kZXgsCisJCQkJCQkoX192NHNpKW1hc2ssCisJCQkJCQlzY2FsZSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpCitfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaTY0Z2F0aGVyX2VwaTMyIChpbnQgY29uc3QgKmJhc2UsIF9fbTI1NmkgaW5kZXgsIGNvbnN0IGludCBzY2FsZSkKK3sKKyAgX192NHNpIHNyYyA9IF9fZXh0ZW5zaW9uX18gKF9fdjRzaSl7IDAsIDAsIDAsIDAgfTsKKyAgX192NHNpIG1hc2sgPSBfX2V4dGVuc2lvbl9fIChfX3Y0c2kpeyB+MCwgfjAsIH4wLCB+MCB9OworCisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2NHNpMjU2IChzcmMsCisJCQkJCQkgIGJhc2UsCisJCQkJCQkgIChfX3Y0ZGkpaW5kZXgsCisJCQkJCQkgIG1hc2ssCisJCQkJCQkgIHNjYWxlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkKK19fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXNrX2k2NGdhdGhlcl9lcGkzMiAoX19tMTI4aSBzcmMsIGludCBjb25zdCAqYmFzZSwKKwkJCSAgICAgX19tMjU2aSBpbmRleCwgX19tMTI4aSBtYXNrLCBjb25zdCBpbnQgc2NhbGUpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2NHNpMjU2ICgoX192NHNpKXNyYywKKwkJCQkJCSAgIGJhc2UsCisJCQkJCQkgICAoX192NGRpKWluZGV4LAorCQkJCQkJICAgKF9fdjRzaSltYXNrLAorCQkJCQkJICAgc2NhbGUpOworfQorI2Vsc2UgLyogX19PUFRJTUlaRV9fICovCisjZGVmaW5lIF9tbV9pMzJnYXRoZXJfcGQoQkFTRSwgSU5ERVgsIFNDQUxFKQkJCQlcCisgIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXYyZGYgKChfX3YyZGYpIF9tbV9zZXR6ZXJvX3BkICgpLAlcCisJCQkJCSAoZG91YmxlIGNvbnN0ICopQkFTRSwJCVwKKwkJCQkJIChfX3Y0c2kpKF9fbTEyOGkpSU5ERVgsCVwKKwkJCQkJIChfX3YyZGYpX21tX3NldDFfcGQoCQlcCisJCQkJCSAgIChkb3VibGUpKGxvbmcgbG9uZyBpbnQpIC0xKSwgXAorCQkJCQkgKGludClTQ0FMRSkKKworI2RlZmluZSBfbW1fbWFza19pMzJnYXRoZXJfcGQoU1JDLCBCQVNFLCBJTkRFWCwgTUFTSywgU0NBTEUpCSBcCisgIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXYyZGYgKChfX3YyZGYpKF9fbTEyOGQpU1JDLAkgXAorCQkJCQkgKGRvdWJsZSBjb25zdCAqKUJBU0UsCSBcCisJCQkJCSAoX192NHNpKShfX20xMjhpKUlOREVYLCBcCisJCQkJCSAoX192MmRmKShfX20xMjhkKU1BU0ssCSBcCisJCQkJCSAoaW50KVNDQUxFKQorCisjZGVmaW5lIF9tbTI1Nl9pMzJnYXRoZXJfcGQoQkFTRSwgSU5ERVgsIFNDQUxFKQkJCQlcCisgIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY0ZGYgKChfX3Y0ZGYpIF9tbTI1Nl9zZXR6ZXJvX3BkICgpLAlcCisJCQkJCSAoZG91YmxlIGNvbnN0ICopQkFTRSwJCVwKKwkJCQkJIChfX3Y0c2kpKF9fbTEyOGkpSU5ERVgsCVwKKwkJCQkJIChfX3Y0ZGYpX21tMjU2X3NldDFfcGQoCVwKKwkJCQkJICAgKGRvdWJsZSkobG9uZyBsb25nIGludCkgLTEpLCBcCisJCQkJCSAoaW50KVNDQUxFKQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2kzMmdhdGhlcl9wZChTUkMsIEJBU0UsIElOREVYLCBNQVNLLCBTQ0FMRSkJIFwKKyAgKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjRkZiAoKF9fdjRkZikoX19tMjU2ZClTUkMsCSBcCisJCQkJCSAoZG91YmxlIGNvbnN0ICopQkFTRSwJIFwKKwkJCQkJIChfX3Y0c2kpKF9fbTEyOGkpSU5ERVgsIFwKKwkJCQkJIChfX3Y0ZGYpKF9fbTI1NmQpTUFTSywJIFwKKwkJCQkJIChpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tX2k2NGdhdGhlcl9wZChCQVNFLCBJTkRFWCwgU0NBTEUpCQkJCVwKKyAgKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjJkZiAoKF9fdjJkZikgX21tX3NldHplcm9fcGQgKCksCVwKKwkJCQkJIChkb3VibGUgY29uc3QgKilCQVNFLAkJXAorCQkJCQkgKF9fdjJkaSkoX19tMTI4aSlJTkRFWCwJXAorCQkJCQkgKF9fdjJkZilfbW1fc2V0MV9wZCgJCVwKKwkJCQkJICAgKGRvdWJsZSkobG9uZyBsb25nIGludCkgLTEpLCBcCisJCQkJCSAoaW50KVNDQUxFKQorCisjZGVmaW5lIF9tbV9tYXNrX2k2NGdhdGhlcl9wZChTUkMsIEJBU0UsIElOREVYLCBNQVNLLCBTQ0FMRSkJIFwKKyAgKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjJkZiAoKF9fdjJkZikoX19tMTI4ZClTUkMsCSBcCisJCQkJCSAoZG91YmxlIGNvbnN0ICopQkFTRSwJIFwKKwkJCQkJIChfX3YyZGkpKF9fbTEyOGkpSU5ERVgsIFwKKwkJCQkJIChfX3YyZGYpKF9fbTEyOGQpTUFTSywJIFwKKwkJCQkJIChpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tMjU2X2k2NGdhdGhlcl9wZChCQVNFLCBJTkRFWCwgU0NBTEUpCQkJCVwKKyAgKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjRkZiAoKF9fdjRkZikgX21tMjU2X3NldHplcm9fcGQgKCksCVwKKwkJCQkJIChkb3VibGUgY29uc3QgKilCQVNFLAkJXAorCQkJCQkgKF9fdjRkaSkoX19tMjU2aSlJTkRFWCwJXAorCQkJCQkgKF9fdjRkZilfbW0yNTZfc2V0MV9wZCgJXAorCQkJCQkgICAoZG91YmxlKShsb25nIGxvbmcgaW50KSAtMSksIFwKKwkJCQkJIChpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tMjU2X21hc2tfaTY0Z2F0aGVyX3BkKFNSQywgQkFTRSwgSU5ERVgsIE1BU0ssIFNDQUxFKQkgXAorICAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2NGRmICgoX192NGRmKShfX20yNTZkKVNSQywJIFwKKwkJCQkJIChkb3VibGUgY29uc3QgKilCQVNFLAkgXAorCQkJCQkgKF9fdjRkaSkoX19tMjU2aSlJTkRFWCwgXAorCQkJCQkgKF9fdjRkZikoX19tMjU2ZClNQVNLLAkgXAorCQkJCQkgKGludClTQ0FMRSkKKworI2RlZmluZSBfbW1faTMyZ2F0aGVyX3BzKEJBU0UsIElOREVYLCBTQ0FMRSkJCQkJXAorICAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY0c2YgKChfX3Y0c2YpIF9tbV9zZXR6ZXJvX3BzICgpLAlcCisJCQkJCShmbG9hdCBjb25zdCAqKUJBU0UsCQlcCisJCQkJCShfX3Y0c2kpKF9fbTEyOGkpSU5ERVgsCQlcCisJCQkJCV9tbV9zZXQxX3BzICgoZmxvYXQpKGludCkgLTEpLAlcCisJCQkJCShpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tX21hc2tfaTMyZ2F0aGVyX3BzKFNSQywgQkFTRSwgSU5ERVgsIE1BU0ssIFNDQUxFKQkgXAorICAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY0c2YgKChfX3Y0c2YpKF9fbTEyOGQpU1JDLAkgXAorCQkJCQkoZmxvYXQgY29uc3QgKilCQVNFLAkgXAorCQkJCQkoX192NHNpKShfX20xMjhpKUlOREVYLAkgXAorCQkJCQkoX192NHNmKShfX20xMjhkKU1BU0ssCSBcCisJCQkJCShpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tMjU2X2kzMmdhdGhlcl9wcyhCQVNFLCBJTkRFWCwgU0NBTEUpCQkJICAgICAgIFwKKyAgKF9fbTI1NikgX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2OHNmICgoX192OHNmKSBfbW0yNTZfc2V0emVyb19wcyAoKSwgXAorCQkJCQkoZmxvYXQgY29uc3QgKilCQVNFLAkgICAgICAgXAorCQkJCQkoX192OHNpKShfX20yNTZpKUlOREVYLAkgICAgICAgXAorCQkJCQkoX192OHNmKV9tbTI1Nl9zZXQxX3BzICggICAgICAgXAorCQkJCQkgIChmbG9hdCkoaW50KSAtMSksCSAgICAgICBcCisJCQkJCShpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tMjU2X21hc2tfaTMyZ2F0aGVyX3BzKFNSQywgQkFTRSwgSU5ERVgsIE1BU0ssIFNDQUxFKSBcCisgIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjhzZiAoKF9fdjhzZikoX19tMjU2KVNSQywJXAorCQkJCQkoZmxvYXQgY29uc3QgKilCQVNFLAlcCisJCQkJCShfX3Y4c2kpKF9fbTI1NmkpSU5ERVgsIFwKKwkJCQkJKF9fdjhzZikoX19tMjU2ZClNQVNLLAlcCisJCQkJCShpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tX2k2NGdhdGhlcl9wcyhCQVNFLCBJTkRFWCwgU0NBTEUpCQkJCVwKKyAgKF9fbTEyOCkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2NHNmICgoX192NHNmKSBfbW1fc2V0emVyb19wZCAoKSwJXAorCQkJCQkoZmxvYXQgY29uc3QgKilCQVNFLAkJXAorCQkJCQkoX192MmRpKShfX20xMjhpKUlOREVYLAkJXAorCQkJCQkoX192NHNmKV9tbV9zZXQxX3BzICgJCVwKKwkJCQkJICAoZmxvYXQpKGludCkgLTEpLAkJXAorCQkJCQkoaW50KVNDQUxFKQorCisjZGVmaW5lIF9tbV9tYXNrX2k2NGdhdGhlcl9wcyhTUkMsIEJBU0UsIElOREVYLCBNQVNLLCBTQ0FMRSkJIFwKKyAgKF9fbTEyOCkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2NHNmICgoX192NHNmKShfX20xMjgpU1JDLAkgXAorCQkJCQkoZmxvYXQgY29uc3QgKilCQVNFLAkgXAorCQkJCQkoX192MmRpKShfX20xMjhpKUlOREVYLAkgXAorCQkJCQkoX192NHNmKShfX20xMjhkKU1BU0ssCSBcCisJCQkJCShpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tMjU2X2k2NGdhdGhlcl9wcyhCQVNFLCBJTkRFWCwgU0NBTEUpCQkJCVwKKyAgKF9fbTEyOCkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2NHNmMjU2ICgoX192NHNmKSBfbW1fc2V0emVyb19wcyAoKSwJXAorCQkJCQkgICAoZmxvYXQgY29uc3QgKilCQVNFLAkJXAorCQkJCQkgICAoX192NGRpKShfX20yNTZpKUlOREVYLAlcCisJCQkJCSAgIChfX3Y0c2YpX21tX3NldDFfcHMoCQlcCisJCQkJCSAgICAgKGZsb2F0KShpbnQpIC0xKSwJCVwKKwkJCQkJICAgKGludClTQ0FMRSkKKworI2RlZmluZSBfbW0yNTZfbWFza19pNjRnYXRoZXJfcHMoU1JDLCBCQVNFLCBJTkRFWCwgTUFTSywgU0NBTEUpCSAgIFwKKyAgKF9fbTEyOCkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2NHNmMjU2ICgoX192NHNmKShfX20xMjgpU1JDLAkgICBcCisJCQkJCSAgIChmbG9hdCBjb25zdCAqKUJBU0UsCSAgIFwKKwkJCQkJICAgKF9fdjRkaSkoX19tMjU2aSlJTkRFWCwgXAorCQkJCQkgICAoX192NHNmKShfX20xMjgpTUFTSywgICBcCisJCQkJCSAgIChpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tX2kzMmdhdGhlcl9lcGk2NChCQVNFLCBJTkRFWCwgU0NBTEUpCQkJCVwKKyAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjJkaSAoKF9fdjJkaSkgX21tX3NldHplcm9fc2kxMjggKCksIFwKKwkJCQkJIChsb25nIGxvbmcgY29uc3QgKilCQVNFLAlcCisJCQkJCSAoX192NHNpKShfX20xMjhpKUlOREVYLAlcCisJCQkJCSAoX192MmRpKV9tbV9zZXQxX2VwaTY0eCAoLTEpLAlcCisJCQkJCSAoaW50KVNDQUxFKQorCisjZGVmaW5lIF9tbV9tYXNrX2kzMmdhdGhlcl9lcGk2NChTUkMsIEJBU0UsIElOREVYLCBNQVNLLCBTQ0FMRSkJICBcCisgIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXYyZGkgKChfX3YyZGkpKF9fbTEyOGkpU1JDLAkgIFwKKwkJCQkJIChsb25nIGxvbmcgY29uc3QgKilCQVNFLCBcCisJCQkJCSAoX192NHNpKShfX20xMjhpKUlOREVYLCAgXAorCQkJCQkgKF9fdjJkaSkoX19tMTI4aSlNQVNLLAkgIFwKKwkJCQkJIChpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tMjU2X2kzMmdhdGhlcl9lcGk2NChCQVNFLCBJTkRFWCwgU0NBTEUpCQkJICAgXAorICAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2NGRpICgoX192NGRpKSBfbW0yNTZfc2V0emVyb19zaTI1NiAoKSwgXAorCQkJCQkgKGxvbmcgbG9uZyBjb25zdCAqKUJBU0UsCSAgIFwKKwkJCQkJIChfX3Y0c2kpKF9fbTEyOGkpSU5ERVgsCSAgIFwKKwkJCQkJIChfX3Y0ZGkpX21tMjU2X3NldDFfZXBpNjR4ICgtMSksICBcCisJCQkJCSAoaW50KVNDQUxFKQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2kzMmdhdGhlcl9lcGk2NChTUkMsIEJBU0UsIElOREVYLCBNQVNLLCBTQ0FMRSkgXAorICAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2NGRpICgoX192NGRpKShfX20yNTZpKVNSQywJICAgXAorCQkJCQkgKGxvbmcgbG9uZyBjb25zdCAqKUJBU0UsICBcCisJCQkJCSAoX192NHNpKShfX20xMjhpKUlOREVYLCAgIFwKKwkJCQkJIChfX3Y0ZGkpKF9fbTI1NmkpTUFTSywJICAgXAorCQkJCQkgKGludClTQ0FMRSkKKworI2RlZmluZSBfbW1faTY0Z2F0aGVyX2VwaTY0KEJBU0UsIElOREVYLCBTQ0FMRSkJCQkJXAorICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2MmRpICgoX192MmRpKSBfbW1fc2V0emVyb19zaTEyOCAoKSwgXAorCQkJCQkgKGxvbmcgbG9uZyBjb25zdCAqKUJBU0UsCVwKKwkJCQkJIChfX3YyZGkpKF9fbTEyOGkpSU5ERVgsCVwKKwkJCQkJIChfX3YyZGkpX21tX3NldDFfZXBpNjR4ICgtMSksCVwKKwkJCQkJIChpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tX21hc2tfaTY0Z2F0aGVyX2VwaTY0KFNSQywgQkFTRSwgSU5ERVgsIE1BU0ssIFNDQUxFKQkgIFwKKyAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjJkaSAoKF9fdjJkaSkoX19tMTI4aSlTUkMsCSAgXAorCQkJCQkgKGxvbmcgbG9uZyBjb25zdCAqKUJBU0UsIFwKKwkJCQkJIChfX3YyZGkpKF9fbTEyOGkpSU5ERVgsICBcCisJCQkJCSAoX192MmRpKShfX20xMjhpKU1BU0ssCSAgXAorCQkJCQkgKGludClTQ0FMRSkKKworI2RlZmluZSBfbW0yNTZfaTY0Z2F0aGVyX2VwaTY0KEJBU0UsIElOREVYLCBTQ0FMRSkJCQkgICBcCisgIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY0ZGkgKChfX3Y0ZGkpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLCBcCisJCQkJCSAobG9uZyBsb25nIGNvbnN0ICopQkFTRSwJICAgXAorCQkJCQkgKF9fdjRkaSkoX19tMjU2aSlJTkRFWCwJICAgXAorCQkJCQkgKF9fdjRkaSlfbW0yNTZfc2V0MV9lcGk2NHggKC0xKSwgIFwKKwkJCQkJIChpbnQpU0NBTEUpCisKKyNkZWZpbmUgX21tMjU2X21hc2tfaTY0Z2F0aGVyX2VwaTY0KFNSQywgQkFTRSwgSU5ERVgsIE1BU0ssIFNDQUxFKSBcCisgIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY0ZGkgKChfX3Y0ZGkpKF9fbTI1NmkpU1JDLAkgICBcCisJCQkJCSAobG9uZyBsb25nIGNvbnN0ICopQkFTRSwgIFwKKwkJCQkJIChfX3Y0ZGkpKF9fbTI1NmkpSU5ERVgsICAgXAorCQkJCQkgKF9fdjRkaSkoX19tMjU2aSlNQVNLLAkgICBcCisJCQkJCSAoaW50KVNDQUxFKQorCisjZGVmaW5lIF9tbV9pMzJnYXRoZXJfZXBpMzIoQkFTRSwgSU5ERVgsIFNDQUxFKQkJCQlcCisgIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY0c2kgKChfX3Y0c2kpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAlcCisJCQkJCSAoaW50IGNvbnN0ICopQkFTRSwJCVwKKwkJCQkJIChfX3Y0c2kpKF9fbTEyOGkpSU5ERVgsCVwKKwkJCQkJIChfX3Y0c2kpX21tX3NldDFfZXBpMzIgKC0xKSwJXAorCQkJCQkgKGludClTQ0FMRSkKKworI2RlZmluZSBfbW1fbWFza19pMzJnYXRoZXJfZXBpMzIoU1JDLCBCQVNFLCBJTkRFWCwgTUFTSywgU0NBTEUpIFwKKyAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjRzaSAoKF9fdjRzaSkoX19tMTI4aSlTUkMsCVwKKwkJCQkJKGludCBjb25zdCAqKUJBU0UsCVwKKwkJCQkJKF9fdjRzaSkoX19tMTI4aSlJTkRFWCwgXAorCQkJCQkoX192NHNpKShfX20xMjhpKU1BU0ssCVwKKwkJCQkJKGludClTQ0FMRSkKKworI2RlZmluZSBfbW0yNTZfaTMyZ2F0aGVyX2VwaTMyKEJBU0UsIElOREVYLCBTQ0FMRSkJCQkgICBcCisgIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJzaXY4c2kgKChfX3Y4c2kpIF9tbTI1Nl9zZXR6ZXJvX3NpMjU2ICgpLCBcCisJCQkJCSAoaW50IGNvbnN0ICopQkFTRSwJCSAgIFwKKwkJCQkJIChfX3Y4c2kpKF9fbTI1NmkpSU5ERVgsCSAgIFwKKwkJCQkJIChfX3Y4c2kpX21tMjU2X3NldDFfZXBpMzIgKC0xKSwgICBcCisJCQkJCSAoaW50KVNDQUxFKQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2kzMmdhdGhlcl9lcGkzMihTUkMsIEJBU0UsIElOREVYLCBNQVNLLCBTQ0FMRSkgXAorICAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2OHNpICgoX192OHNpKShfX20yNTZpKVNSQywJICAgXAorCQkJCQkoaW50IGNvbnN0ICopQkFTRSwJICAgXAorCQkJCQkoX192OHNpKShfX20yNTZpKUlOREVYLAkgICBcCisJCQkJCShfX3Y4c2kpKF9fbTI1NmkpTUFTSywJICAgXAorCQkJCQkoaW50KVNDQUxFKQorCisjZGVmaW5lIF9tbV9pNjRnYXRoZXJfZXBpMzIoQkFTRSwgSU5ERVgsIFNDQUxFKQkJCQlcCisgIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY0c2kgKChfX3Y0c2kpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLAlcCisJCQkJCSAoaW50IGNvbnN0ICopQkFTRSwJCVwKKwkJCQkJIChfX3YyZGkpKF9fbTEyOGkpSU5ERVgsCVwKKwkJCQkJIChfX3Y0c2kpX21tX3NldDFfZXBpMzIgKC0xKSwJXAorCQkJCQkgKGludClTQ0FMRSkKKworI2RlZmluZSBfbW1fbWFza19pNjRnYXRoZXJfZXBpMzIoU1JDLCBCQVNFLCBJTkRFWCwgTUFTSywgU0NBTEUpIFwKKyAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjRzaSAoKF9fdjRzaSkoX19tMTI4aSlTUkMsCVwKKwkJCQkJKGludCBjb25zdCAqKUJBU0UsCVwKKwkJCQkJKF9fdjJkaSkoX19tMTI4aSlJTkRFWCwgXAorCQkJCQkoX192NHNpKShfX20xMjhpKU1BU0ssCVwKKwkJCQkJKGludClTQ0FMRSkKKworI2RlZmluZSBfbW0yNTZfaTY0Z2F0aGVyX2VwaTMyKEJBU0UsIElOREVYLCBTQ0FMRSkJCQkgICBcCisgIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY0c2kyNTYgKChfX3Y0c2kpIF9tbV9zZXR6ZXJvX3NpMTI4ICgpLCBcCisJCQkJCSAgICAoaW50IGNvbnN0ICopQkFTRSwJCSAgIFwKKwkJCQkJICAgIChfX3Y0ZGkpKF9fbTI1NmkpSU5ERVgsCSAgIFwKKwkJCQkJICAgIChfX3Y0c2kpX21tX3NldDFfZXBpMzIoLTEpLAkgICBcCisJCQkJCSAgICAoaW50KVNDQUxFKQorCisjZGVmaW5lIF9tbTI1Nl9tYXNrX2k2NGdhdGhlcl9lcGkzMihTUkMsIEJBU0UsIElOREVYLCBNQVNLLCBTQ0FMRSkgXAorICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2NHNpMjU2ICgoX192NHNpKShfX20xMjhpKVNSQywgIFwKKwkJCQkJICAgKGludCBjb25zdCAqKUJBU0UsCSAgIFwKKwkJCQkJICAgKF9fdjRkaSkoX19tMjU2aSlJTkRFWCwgXAorCQkJCQkgICAoX192NHNpKShfX20xMjhpKU1BU0ssICBcCisJCQkJCSAgIChpbnQpU0NBTEUpCisjZW5kaWYgIC8qIF9fT1BUSU1JWkVfXyAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvYXZ4aW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9hdnhpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzVkZTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvYXZ4aW50cmluLmgKQEAgLTAsMCArMSwxNDI2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogSW1wbGVtZW50ZWQgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBpbmNsdWRlZCBpbiB0aGUgSW50ZWwgQysrIENvbXBpbGVyCisgICBVc2VyIEd1aWRlIGFuZCBSZWZlcmVuY2UsIHZlcnNpb24gMTEuMC4gICovCisKKyNpZm5kZWYgX0lNTUlOVFJJTl9IX0lOQ0xVREVECisjIGVycm9yICJOZXZlciB1c2UgPGF2eGludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8aW1taW50cmluLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIEludGVybmFsIGRhdGEgdHlwZXMgZm9yIGltcGxlbWVudGluZyB0aGUgaW50cmluc2ljcy4gICovCit0eXBlZGVmIGRvdWJsZSBfX3Y0ZGYgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMzIpKSk7Cit0eXBlZGVmIGZsb2F0IF9fdjhzZiBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgzMikpKTsKK3R5cGVkZWYgbG9uZyBsb25nIF9fdjRkaSBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgzMikpKTsKK3R5cGVkZWYgaW50IF9fdjhzaSBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgzMikpKTsKK3R5cGVkZWYgc2hvcnQgX192MTZoaSBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgzMikpKTsKK3R5cGVkZWYgY2hhciBfX3YzMnFpIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDMyKSkpOworCisvKiBUaGUgSW50ZWwgQVBJIGlzIGZsZXhpYmxlIGVub3VnaCB0aGF0IHdlIG11c3QgYWxsb3cgYWxpYXNpbmcgd2l0aCBvdGhlcgorICAgdmVjdG9yIHR5cGVzLCBhbmQgdGhlaXIgc2NhbGFyIGNvbXBvbmVudHMuICAqLwordHlwZWRlZiBmbG9hdCBfX20yNTYgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMzIpLAorCQkJCSAgICAgX19tYXlfYWxpYXNfXykpOwordHlwZWRlZiBsb25nIGxvbmcgX19tMjU2aSBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgzMiksCisJCQkJCSAgX19tYXlfYWxpYXNfXykpOwordHlwZWRlZiBkb3VibGUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgzMiksCisJCQkJICAgICAgIF9fbWF5X2FsaWFzX18pKTsKKworLyogQ29tcGFyZSBwcmVkaWNhdGVzIGZvciBzY2FsYXIgYW5kIHBhY2tlZCBjb21wYXJlIGludHJpbnNpY3MuICAqLworCisvKiBFcXVhbCAob3JkZXJlZCwgbm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfRVFfT1EJMHgwMAorLyogTGVzcy10aGFuIChvcmRlcmVkLCBzaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX0xUX09TCTB4MDEKKy8qIExlc3MtdGhhbi1vci1lcXVhbCAob3JkZXJlZCwgc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9MRV9PUwkweDAyCisvKiBVbm9yZGVyZWQgKG5vbi1zaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX1VOT1JEX1EJMHgwMworLyogTm90LWVxdWFsICh1bm9yZGVyZWQsIG5vbi1zaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX05FUV9VUQkweDA0CisvKiBOb3QtbGVzcy10aGFuICh1bm9yZGVyZWQsIHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTkxUX1VTCTB4MDUKKy8qIE5vdC1sZXNzLXRoYW4tb3ItZXF1YWwgKHVub3JkZXJlZCwgc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9OTEVfVVMJMHgwNgorLyogT3JkZXJlZCAobm9uc2lnbmFsaW5nKSAgICovCisjZGVmaW5lIF9DTVBfT1JEX1EJMHgwNworLyogRXF1YWwgKHVub3JkZXJlZCwgbm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfRVFfVVEJMHgwOAorLyogTm90LWdyZWF0ZXItdGhhbi1vci1lcXVhbCAodW5vcmRlcmVkLCBzaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX05HRV9VUwkweDA5CisvKiBOb3QtZ3JlYXRlci10aGFuICh1bm9yZGVyZWQsIHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTkdUX1VTCTB4MGEKKy8qIEZhbHNlIChvcmRlcmVkLCBub24tc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9GQUxTRV9PUQkweDBiCisvKiBOb3QtZXF1YWwgKG9yZGVyZWQsIG5vbi1zaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX05FUV9PUQkweDBjCisvKiBHcmVhdGVyLXRoYW4tb3ItZXF1YWwgKG9yZGVyZWQsIHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfR0VfT1MJMHgwZAorLyogR3JlYXRlci10aGFuIChvcmRlcmVkLCBzaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX0dUX09TCTB4MGUKKy8qIFRydWUgKHVub3JkZXJlZCwgbm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfVFJVRV9VUQkweDBmCisvKiBFcXVhbCAob3JkZXJlZCwgc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9FUV9PUwkweDEwCisvKiBMZXNzLXRoYW4gKG9yZGVyZWQsIG5vbi1zaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX0xUX09RCTB4MTEKKy8qIExlc3MtdGhhbi1vci1lcXVhbCAob3JkZXJlZCwgbm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTEVfT1EJMHgxMgorLyogVW5vcmRlcmVkIChzaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX1VOT1JEX1MJMHgxMworLyogTm90LWVxdWFsICh1bm9yZGVyZWQsIHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTkVRX1VTCTB4MTQKKy8qIE5vdC1sZXNzLXRoYW4gKHVub3JkZXJlZCwgbm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTkxUX1VRCTB4MTUKKy8qIE5vdC1sZXNzLXRoYW4tb3ItZXF1YWwgKHVub3JkZXJlZCwgbm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTkxFX1VRCTB4MTYKKy8qIE9yZGVyZWQgKHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfT1JEX1MJMHgxNworLyogRXF1YWwgKHVub3JkZXJlZCwgc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9FUV9VUwkweDE4CisvKiBOb3QtZ3JlYXRlci10aGFuLW9yLWVxdWFsICh1bm9yZGVyZWQsIG5vbi1zaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX05HRV9VUQkweDE5CisvKiBOb3QtZ3JlYXRlci10aGFuICh1bm9yZGVyZWQsIG5vbi1zaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX05HVF9VUQkweDFhCisvKiBGYWxzZSAob3JkZXJlZCwgc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9GQUxTRV9PUwkweDFiCisvKiBOb3QtZXF1YWwgKG9yZGVyZWQsIHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTkVRX09TCTB4MWMKKy8qIEdyZWF0ZXItdGhhbi1vci1lcXVhbCAob3JkZXJlZCwgbm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfR0VfT1EJMHgxZAorLyogR3JlYXRlci10aGFuIChvcmRlcmVkLCBub24tc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9HVF9PUQkweDFlCisvKiBUcnVlICh1bm9yZGVyZWQsIHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfVFJVRV9VUwkweDFmCisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2FkZF9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2FkZHBkMjU2ICgoX192NGRmKV9fQSwgKF9fdjRkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2FkZF9wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2FkZHBzMjU2ICgoX192OHNmKV9fQSwgKF9fdjhzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9hZGRzdWJfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9hZGRzdWJwZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9hZGRzdWJfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9hZGRzdWJwczI1NiAoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CKTsKK30KKworCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9hbmRfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9hbmRwZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9hbmRfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9hbmRwczI1NiAoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYW5kbm90X3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfYW5kbnBkMjU2ICgoX192NGRmKV9fQSwgKF9fdjRkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2FuZG5vdF9wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2FuZG5wczI1NiAoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CKTsKK30KKworLyogRG91YmxlL3NpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgYmxlbmQgaW5zdHJ1Y3Rpb25zIC0gc2VsZWN0CisgICBkYXRhIGZyb20gMiBzb3VyY2VzIHVzaW5nIGNvbnN0YW50L3ZhcmlhYmxlIG1hc2suICAqLworCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9ibGVuZF9wZCAoX19tMjU2ZCBfX1gsIF9fbTI1NmQgX19ZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2JsZW5kcGQyNTYgKChfX3Y0ZGYpX19YLAorCQkJCQkgICAgICAoX192NGRmKV9fWSwKKwkJCQkJICAgICAgX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9ibGVuZF9wcyAoX19tMjU2IF9fWCwgX19tMjU2IF9fWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2JsZW5kcHMyNTYgKChfX3Y4c2YpX19YLAorCQkJCQkgICAgIChfX3Y4c2YpX19ZLAorCQkJCQkgICAgIF9fTSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW0yNTZfYmxlbmRfcGQoWCwgWSwgTSkJCQkJCVwKKyAgKChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9ibGVuZHBkMjU2ICgoX192NGRmKShfX20yNTZkKShYKSwJCVwKKwkJCQkJKF9fdjRkZikoX19tMjU2ZCkoWSksIChpbnQpKE0pKSkKKworI2RlZmluZSBfbW0yNTZfYmxlbmRfcHMoWCwgWSwgTSkJCQkJCVwKKyAgKChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2JsZW5kcHMyNTYgKChfX3Y4c2YpKF9fbTI1NikoWCksCQlcCisJCQkJICAgICAgIChfX3Y4c2YpKF9fbTI1NikoWSksIChpbnQpKE0pKSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9ibGVuZHZfcGQgKF9fbTI1NmQgX19YLCBfX20yNTZkIF9fWSwgX19tMjU2ZCBfX00pCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfYmxlbmR2cGQyNTYgKChfX3Y0ZGYpX19YLAorCQkJCQkgICAgICAgKF9fdjRkZilfX1ksCisJCQkJCSAgICAgICAoX192NGRmKV9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYmxlbmR2X3BzIChfX20yNTYgX19YLCBfX20yNTYgX19ZLCBfX20yNTYgX19NKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfYmxlbmR2cHMyNTYgKChfX3Y4c2YpX19YLAorCQkJCQkgICAgICAoX192OHNmKV9fWSwKKwkJCQkJICAgICAgKF9fdjhzZilfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9kaXZfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9kaXZwZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9kaXZfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9kaXZwczI1NiAoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CKTsKK30KKworLyogRG90IHByb2R1Y3QgaW5zdHJ1Y3Rpb25zIHdpdGggbWFzay1kZWZpbmVkIHN1bW1pbmcgYW5kIHplcm9pbmcgcGFydHMKKyAgIG9mIHJlc3VsdC4gICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfZHBfcHMgKF9fbTI1NiBfX1gsIF9fbTI1NiBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9kcHBzMjU2ICgoX192OHNmKV9fWCwKKwkJCQkJICAoX192OHNmKV9fWSwKKwkJCQkJICBfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tMjU2X2RwX3BzKFgsIFksIE0pCQkJCQkJXAorICAoKF9fbTI1NikgX19idWlsdGluX2lhMzJfZHBwczI1NiAoKF9fdjhzZikoX19tMjU2KShYKSwJCVwKKwkJCQkgICAgKF9fdjhzZikoX19tMjU2KShZKSwgKGludCkoTSkpKQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2hhZGRfcGQgKF9fbTI1NmQgX19YLCBfX20yNTZkIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9oYWRkcGQyNTYgKChfX3Y0ZGYpX19YLCAoX192NGRmKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaGFkZF9wcyAoX19tMjU2IF9fWCwgX19tMjU2IF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2hhZGRwczI1NiAoKF9fdjhzZilfX1gsIChfX3Y4c2YpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaHN1Yl9wZCAoX19tMjU2ZCBfX1gsIF9fbTI1NmQgX19ZKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2hzdWJwZDI1NiAoKF9fdjRkZilfX1gsIChfX3Y0ZGYpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9oc3ViX3BzIChfX20yNTYgX19YLCBfX20yNTYgX19ZKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfaHN1YnBzMjU2ICgoX192OHNmKV9fWCwgKF9fdjhzZilfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXhfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9tYXhwZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXhfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9tYXhwczI1NiAoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbWluX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfbWlucGQyNTYgKChfX3Y0ZGYpX19BLCAoX192NGRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbWluX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfbWlucHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X211bF9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX211bHBkMjU2ICgoX192NGRmKV9fQSwgKF9fdjRkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X211bF9wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX211bHBzMjU2ICgoX192OHNmKV9fQSwgKF9fdjhzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9vcl9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX29ycGQyNTYgKChfX3Y0ZGYpX19BLCAoX192NGRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfb3JfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9vcnBzMjU2ICgoX192OHNmKV9fQSwgKF9fdjhzZilfX0IpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zaHVmZmxlX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IsIGNvbnN0IGludCBfX21hc2spCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfc2h1ZnBkMjU2ICgoX192NGRmKV9fQSwgKF9fdjRkZilfX0IsCisJCQkJCSAgICAgX19tYXNrKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zaHVmZmxlX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CLCBjb25zdCBpbnQgX19tYXNrKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfc2h1ZnBzMjU2ICgoX192OHNmKV9fQSwgKF9fdjhzZilfX0IsCisJCQkJCSAgICBfX21hc2spOworfQorI2Vsc2UKKyNkZWZpbmUgX21tMjU2X3NodWZmbGVfcGQoQSwgQiwgTikJCQkJCVwKKyAgKChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX3NodWZwZDI1NiAoKF9fdjRkZikoX19tMjU2ZCkoQSksCQlcCisJCQkJICAgICAgKF9fdjRkZikoX19tMjU2ZCkoQiksIChpbnQpKE4pKSkKKworI2RlZmluZSBfbW0yNTZfc2h1ZmZsZV9wcyhBLCBCLCBOKQkJCQkJXAorICAoKF9fbTI1NikgX19idWlsdGluX2lhMzJfc2h1ZnBzMjU2ICgoX192OHNmKShfX20yNTYpKEEpLAkJXAorCQkJCSAgICAgIChfX3Y4c2YpKF9fbTI1NikoQiksIChpbnQpKE4pKSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdWJfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9zdWJwZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdWJfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9zdWJwczI1NiAoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfeG9yX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfeG9ycGQyNTYgKChfX3Y0ZGYpX19BLCAoX192NGRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfeG9yX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfeG9ycHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQik7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcF9wZCAoX19tMTI4ZCBfX1gsIF9fbTEyOGQgX19ZLCBjb25zdCBpbnQgX19QKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2NtcHBkICgoX192MmRmKV9fWCwgKF9fdjJkZilfX1ksIF9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wX3BzIChfX20xMjggX19YLCBfX20xMjggX19ZLCBjb25zdCBpbnQgX19QKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wcHMgKChfX3Y0c2YpX19YLCAoX192NHNmKV9fWSwgX19QKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY21wX3BkIChfX20yNTZkIF9fWCwgX19tMjU2ZCBfX1ksIGNvbnN0IGludCBfX1ApCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfY21wcGQyNTYgKChfX3Y0ZGYpX19YLCAoX192NGRmKV9fWSwKKwkJCQkJICAgIF9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY21wX3BzIChfX20yNTYgX19YLCBfX20yNTYgX19ZLCBjb25zdCBpbnQgX19QKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfY21wcHMyNTYgKChfX3Y4c2YpX19YLCAoX192OHNmKV9fWSwKKwkJCQkJICAgX19QKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wX3NkIChfX20xMjhkIF9fWCwgX19tMTI4ZCBfX1ksIGNvbnN0IGludCBfX1ApCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfY21wc2QgKChfX3YyZGYpX19YLCAoX192MmRmKV9fWSwgX19QKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBfc3MgKF9fbTEyOCBfX1gsIF9fbTEyOCBfX1ksIGNvbnN0IGludCBfX1ApCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXBzcyAoKF9fdjRzZilfX1gsIChfX3Y0c2YpX19ZLCBfX1ApOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX2NtcF9wZChYLCBZLCBQKQkJCQkJCVwKKyAgKChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9jbXBwZCAoKF9fdjJkZikoX19tMTI4ZCkoWCksCQlcCisJCQkJICAgKF9fdjJkZikoX19tMTI4ZCkoWSksIChpbnQpKFApKSkKKworI2RlZmluZSBfbW1fY21wX3BzKFgsIFksIFApCQkJCQkJXAorICAoKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wcHMgKChfX3Y0c2YpKF9fbTEyOCkoWCksCQkJXAorCQkJCSAgKF9fdjRzZikoX19tMTI4KShZKSwgKGludCkoUCkpKQorCisjZGVmaW5lIF9tbTI1Nl9jbXBfcGQoWCwgWSwgUCkJCQkJCQlcCisgICgoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfY21wcGQyNTYgKChfX3Y0ZGYpKF9fbTI1NmQpKFgpLAkJXAorCQkJCSAgICAgIChfX3Y0ZGYpKF9fbTI1NmQpKFkpLCAoaW50KShQKSkpCisKKyNkZWZpbmUgX21tMjU2X2NtcF9wcyhYLCBZLCBQKQkJCQkJCVwKKyAgKChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2NtcHBzMjU2ICgoX192OHNmKShfX20yNTYpKFgpLAkJXAorCQkJCSAgICAgKF9fdjhzZikoX19tMjU2KShZKSwgKGludCkoUCkpKQorCisjZGVmaW5lIF9tbV9jbXBfc2QoWCwgWSwgUCkJCQkJCQlcCisgICgoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfY21wc2QgKChfX3YyZGYpKF9fbTEyOGQpKFgpLAkJXAorCQkJCSAgIChfX3YyZGYpKF9fbTEyOGQpKFkpLCAoaW50KShQKSkpCisKKyNkZWZpbmUgX21tX2NtcF9zcyhYLCBZLCBQKQkJCQkJCVwKKyAgKChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2NtcHNzICgoX192NHNmKShfX20xMjgpKFgpLAkJCVwKKwkJCQkgIChfX3Y0c2YpKF9fbTEyOCkoWSksIChpbnQpKFApKSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnRlcGkzMl9wZCAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9jdnRkcTJwZDI1NiAoKF9fdjRzaSkgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnRlcGkzMl9wcyAoX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX2N2dGRxMnBzMjU2ICgoX192OHNpKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2N2dHBkX3BzIChfX20yNTZkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfY3Z0cGQycHMyNTYgKChfX3Y0ZGYpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2N2dHBzX2VwaTMyIChfX20yNTYgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfY3Z0cHMyZHEyNTYgKChfX3Y4c2YpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2N2dHBzX3BkIChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTI1NmQpX19idWlsdGluX2lhMzJfY3Z0cHMycGQyNTYgKChfX3Y0c2YpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2N2dHRwZF9lcGkzMiAoX19tMjU2ZCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9jdnR0cGQyZHEyNTYgKChfX3Y0ZGYpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2N2dHBkX2VwaTMyIChfX20yNTZkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX2N2dHBkMmRxMjU2ICgoX192NGRmKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnR0cHNfZXBpMzIgKF9fbTI1NiBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSlfX2J1aWx0aW5faWEzMl9jdnR0cHMyZHEyNTYgKChfX3Y4c2YpIF9fQSk7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2V4dHJhY3RmMTI4X3BkIChfX20yNTZkIF9fWCwgY29uc3QgaW50IF9fTikKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92ZXh0cmFjdGYxMjhfcGQyNTYgKChfX3Y0ZGYpX19YLCBfX04pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2V4dHJhY3RmMTI4X3BzIChfX20yNTYgX19YLCBjb25zdCBpbnQgX19OKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmV4dHJhY3RmMTI4X3BzMjU2ICgoX192OHNmKV9fWCwgX19OKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfZXh0cmFjdGYxMjhfc2kyNTYgKF9fbTI1NmkgX19YLCBjb25zdCBpbnQgX19OKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZleHRyYWN0ZjEyOF9zaTI1NiAoKF9fdjhzaSlfX1gsIF9fTik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfZXh0cmFjdF9lcGkzMiAoX19tMjU2aSBfX1gsIGludCBjb25zdCBfX04pCit7CisgIF9fbTEyOGkgX19ZID0gX21tMjU2X2V4dHJhY3RmMTI4X3NpMjU2IChfX1gsIF9fTiA+PiAyKTsKKyAgcmV0dXJuIF9tbV9leHRyYWN0X2VwaTMyIChfX1ksIF9fTiAlIDQpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2V4dHJhY3RfZXBpMTYgKF9fbTI1NmkgX19YLCBpbnQgY29uc3QgX19OKQoreworICBfX20xMjhpIF9fWSA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9zaTI1NiAoX19YLCBfX04gPj4gMyk7CisgIHJldHVybiBfbW1fZXh0cmFjdF9lcGkxNiAoX19ZLCBfX04gJSA4KTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9leHRyYWN0X2VwaTggKF9fbTI1NmkgX19YLCBpbnQgY29uc3QgX19OKQoreworICBfX20xMjhpIF9fWSA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9zaTI1NiAoX19YLCBfX04gPj4gNCk7CisgIHJldHVybiBfbW1fZXh0cmFjdF9lcGk4IChfX1ksIF9fTiAlIDE2KTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KK2V4dGVybiBfX2lubGluZSBsb25nIGxvbmcgIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2V4dHJhY3RfZXBpNjQgKF9fbTI1NmkgX19YLCBjb25zdCBpbnQgX19OKQoreworICBfX20xMjhpIF9fWSA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9zaTI1NiAoX19YLCBfX04gPj4gMSk7CisgIHJldHVybiBfbW1fZXh0cmFjdF9lcGk2NCAoX19ZLCBfX04gJSAyKTsKK30KKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgX21tMjU2X2V4dHJhY3RmMTI4X3BkKFgsIE4pCQkJCQlcCisgICgoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmV4dHJhY3RmMTI4X3BkMjU2ICgoX192NGRmKShfX20yNTZkKShYKSwJXAorCQkJCQkJKGludCkoTikpKQorCisjZGVmaW5lIF9tbTI1Nl9leHRyYWN0ZjEyOF9wcyhYLCBOKQkJCQkJXAorICAoKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmV4dHJhY3RmMTI4X3BzMjU2ICgoX192OHNmKShfX20yNTYpKFgpLAlcCisJCQkJCSAgICAgICAoaW50KShOKSkpCisKKyNkZWZpbmUgX21tMjU2X2V4dHJhY3RmMTI4X3NpMjU2KFgsIE4pCQkJCQlcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdmV4dHJhY3RmMTI4X3NpMjU2ICgoX192OHNpKShfX20yNTZpKShYKSwJXAorCQkJCQkJKGludCkoTikpKQorCisjZGVmaW5lIF9tbTI1Nl9leHRyYWN0X2VwaTMyKFgsIE4pCQkJCQlcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCVwKKyAgICh7CQkJCQkJCQkJXAorICAgICAgX19tMTI4aSBfX1kgPSBfbW0yNTZfZXh0cmFjdGYxMjhfc2kyNTYgKChYKSwgKE4pID4+IDIpOwkJXAorICAgICAgX21tX2V4dHJhY3RfZXBpMzIgKF9fWSwgKE4pICUgNCk7CQkJCQlcCisgICAgfSkpCisKKyNkZWZpbmUgX21tMjU2X2V4dHJhY3RfZXBpMTYoWCwgTikJCQkJCVwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJXAorICAgKHsJCQkJCQkJCQlcCisgICAgICBfX20xMjhpIF9fWSA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9zaTI1NiAoKFgpLCAoTikgPj4gMyk7CQlcCisgICAgICBfbW1fZXh0cmFjdF9lcGkxNiAoX19ZLCAoTikgJSA4KTsJCQkJCVwKKyAgICB9KSkKKworI2RlZmluZSBfbW0yNTZfZXh0cmFjdF9lcGk4KFgsIE4pCQkJCQlcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCVwKKyAgICh7CQkJCQkJCQkJXAorICAgICAgX19tMTI4aSBfX1kgPSBfbW0yNTZfZXh0cmFjdGYxMjhfc2kyNTYgKChYKSwgKE4pID4+IDQpOwkJXAorICAgICAgX21tX2V4dHJhY3RfZXBpOCAoX19ZLCAoTikgJSAxNik7CQkJCQlcCisgICAgfSkpCisKKyNpZmRlZiBfX3g4Nl82NF9fCisjZGVmaW5lIF9tbTI1Nl9leHRyYWN0X2VwaTY0KFgsIE4pCQkJCQlcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCVwKKyAgICh7CQkJCQkJCQkJXAorICAgICAgX19tMTI4aSBfX1kgPSBfbW0yNTZfZXh0cmFjdGYxMjhfc2kyNTYgKChYKSwgKE4pID4+IDEpOwkJXAorICAgICAgX21tX2V4dHJhY3RfZXBpNjQgKF9fWSwgKE4pICUgMik7CQkJCQlcCisgICAgfSkpCisjZW5kaWYKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl96ZXJvYWxsICh2b2lkKQoreworICBfX2J1aWx0aW5faWEzMl92emVyb2FsbCAoKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfemVyb3VwcGVyICh2b2lkKQoreworICBfX2J1aWx0aW5faWEzMl92emVyb3VwcGVyICgpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9wZXJtdXRldmFyX3BkIChfX20xMjhkIF9fQSwgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdnBlcm1pbHZhcnBkICgoX192MmRmKV9fQSwKKwkJCQkJCShfX3YyZGkpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfcGVybXV0ZXZhcl9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmkgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwZDI1NiAoKF9fdjRkZilfX0EsCisJCQkJCQkgICAoX192NGRpKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcGVybXV0ZXZhcl9wcyAoX19tMTI4IF9fQSwgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycHMgKChfX3Y0c2YpX19BLAorCQkJCQkgICAgICAgKF9fdjRzaSlfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Blcm11dGV2YXJfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NmkgX19DKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdnBlcm1pbHZhcnBzMjU2ICgoX192OHNmKV9fQSwKKwkJCQkJCSAgKF9fdjhzaSlfX0MpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9wZXJtdXRlX3BkIChfX20xMjhkIF9fWCwgY29uc3QgaW50IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92cGVybWlscGQgKChfX3YyZGYpX19YLCBfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9wZXJtdXRlX3BkIChfX20yNTZkIF9fWCwgY29uc3QgaW50IF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92cGVybWlscGQyNTYgKChfX3Y0ZGYpX19YLCBfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Blcm11dGVfcHMgKF9fbTEyOCBfX1gsIGNvbnN0IGludCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92cGVybWlscHMgKChfX3Y0c2YpX19YLCBfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Blcm11dGVfcHMgKF9fbTI1NiBfX1gsIGNvbnN0IGludCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92cGVybWlscHMyNTYgKChfX3Y4c2YpX19YLCBfX0MpOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX3Blcm11dGVfcGQoWCwgQykJCQkJCQlcCisgICgoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdnBlcm1pbHBkICgoX192MmRmKShfX20xMjhkKShYKSwgKGludCkoQykpKQorCisjZGVmaW5lIF9tbTI1Nl9wZXJtdXRlX3BkKFgsIEMpCQkJCQkJXAorICAoKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWxwZDI1NiAoKF9fdjRkZikoX19tMjU2ZCkoWCksCShpbnQpKEMpKSkKKworI2RlZmluZSBfbW1fcGVybXV0ZV9wcyhYLCBDKQkJCQkJCVwKKyAgKChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWxwcyAoKF9fdjRzZikoX19tMTI4KShYKSwgKGludCkoQykpKQorCisjZGVmaW5lIF9tbTI1Nl9wZXJtdXRlX3BzKFgsIEMpCQkJCQkJXAorICAoKF9fbTI1NikgX19idWlsdGluX2lhMzJfdnBlcm1pbHBzMjU2ICgoX192OHNmKShfX20yNTYpKFgpLCAoaW50KShDKSkpCisjZW5kaWYKKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfcGVybXV0ZTJmMTI4X3BkIChfX20yNTZkIF9fWCwgX19tMjU2ZCBfX1ksIGNvbnN0IGludCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdnBlcm0yZjEyOF9wZDI1NiAoKF9fdjRkZilfX1gsCisJCQkJCQkgICAgKF9fdjRkZilfX1ksCisJCQkJCQkgICAgX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9wZXJtdXRlMmYxMjhfcHMgKF9fbTI1NiBfX1gsIF9fbTI1NiBfX1ksIGNvbnN0IGludCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92cGVybTJmMTI4X3BzMjU2ICgoX192OHNmKV9fWCwKKwkJCQkJCSAgIChfX3Y4c2YpX19ZLAorCQkJCQkJICAgX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfcGVybXV0ZTJmMTI4X3NpMjU2IChfX20yNTZpIF9fWCwgX19tMjU2aSBfX1ksIGNvbnN0IGludCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfdnBlcm0yZjEyOF9zaTI1NiAoKF9fdjhzaSlfX1gsCisJCQkJCQkgICAgKF9fdjhzaSlfX1ksCisJCQkJCQkgICAgX19DKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbTI1Nl9wZXJtdXRlMmYxMjhfcGQoWCwgWSwgQykJCQkJCVwKKyAgKChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92cGVybTJmMTI4X3BkMjU2ICgoX192NGRmKShfX20yNTZkKShYKSwJXAorCQkJCQkgICAgICAoX192NGRmKShfX20yNTZkKShZKSwJXAorCQkJCQkgICAgICAoaW50KShDKSkpCisKKyNkZWZpbmUgX21tMjU2X3Blcm11dGUyZjEyOF9wcyhYLCBZLCBDKQkJCQkJXAorICAoKF9fbTI1NikgX19idWlsdGluX2lhMzJfdnBlcm0yZjEyOF9wczI1NiAoKF9fdjhzZikoX19tMjU2KShYKSwJXAorCQkJCQkgICAgIChfX3Y4c2YpKF9fbTI1NikoWSksCVwKKwkJCQkJICAgICAoaW50KShDKSkpCisKKyNkZWZpbmUgX21tMjU2X3Blcm11dGUyZjEyOF9zaTI1NihYLCBZLCBDKQkJCQlcCisgICgoX19tMjU2aSkgX19idWlsdGluX2lhMzJfdnBlcm0yZjEyOF9zaTI1NiAoKF9fdjhzaSkoX19tMjU2aSkoWCksCVwKKwkJCQkJICAgICAgKF9fdjhzaSkoX19tMjU2aSkoWSksCVwKKwkJCQkJICAgICAgKGludCkoQykpKQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYnJvYWRjYXN0X3NzIChmbG9hdCBjb25zdCAqX19YKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmJyb2FkY2FzdHNzIChfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9icm9hZGNhc3Rfc2QgKGRvdWJsZSBjb25zdCAqX19YKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3Zicm9hZGNhc3RzZDI1NiAoX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9icm9hZGNhc3Rfc3MgKGZsb2F0IGNvbnN0ICpfX1gpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92YnJvYWRjYXN0c3MyNTYgKF9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Jyb2FkY2FzdF9wZCAoX19tMTI4ZCBjb25zdCAqX19YKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3Zicm9hZGNhc3RmMTI4X3BkMjU2IChfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Jyb2FkY2FzdF9wcyAoX19tMTI4IGNvbnN0ICpfX1gpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92YnJvYWRjYXN0ZjEyOF9wczI1NiAoX19YKTsKK30KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaW5zZXJ0ZjEyOF9wZCAoX19tMjU2ZCBfX1gsIF9fbTEyOGQgX19ZLCBjb25zdCBpbnQgX19PKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZpbnNlcnRmMTI4X3BkMjU2ICgoX192NGRmKV9fWCwKKwkJCQkJCSAgICAgKF9fdjJkZilfX1ksCisJCQkJCQkgICAgIF9fTyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaW5zZXJ0ZjEyOF9wcyAoX19tMjU2IF9fWCwgX19tMTI4IF9fWSwgY29uc3QgaW50IF9fTykKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZpbnNlcnRmMTI4X3BzMjU2ICgoX192OHNmKV9fWCwKKwkJCQkJCSAgICAoX192NHNmKV9fWSwKKwkJCQkJCSAgICBfX08pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9pbnNlcnRmMTI4X3NpMjU2IChfX20yNTZpIF9fWCwgX19tMTI4aSBfX1ksIGNvbnN0IGludCBfX08pCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfdmluc2VydGYxMjhfc2kyNTYgKChfX3Y4c2kpX19YLAorCQkJCQkJICAgICAoX192NHNpKV9fWSwKKwkJCQkJCSAgICAgX19PKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaW5zZXJ0X2VwaTMyIChfX20yNTZpIF9fWCwgaW50IF9fRCwgaW50IGNvbnN0IF9fTikKK3sKKyAgX19tMTI4aSBfX1kgPSBfbW0yNTZfZXh0cmFjdGYxMjhfc2kyNTYgKF9fWCwgX19OID4+IDIpOworICBfX1kgPSBfbW1faW5zZXJ0X2VwaTMyIChfX1ksIF9fRCwgX19OICUgNCk7CisgIHJldHVybiBfbW0yNTZfaW5zZXJ0ZjEyOF9zaTI1NiAoX19YLCBfX1ksIF9fTiA+PiAyKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaW5zZXJ0X2VwaTE2IChfX20yNTZpIF9fWCwgaW50IF9fRCwgaW50IGNvbnN0IF9fTikKK3sKKyAgX19tMTI4aSBfX1kgPSBfbW0yNTZfZXh0cmFjdGYxMjhfc2kyNTYgKF9fWCwgX19OID4+IDMpOworICBfX1kgPSBfbW1faW5zZXJ0X2VwaTE2IChfX1ksIF9fRCwgX19OICUgOCk7CisgIHJldHVybiBfbW0yNTZfaW5zZXJ0ZjEyOF9zaTI1NiAoX19YLCBfX1ksIF9fTiA+PiAzKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaW5zZXJ0X2VwaTggKF9fbTI1NmkgX19YLCBpbnQgX19ELCBpbnQgY29uc3QgX19OKQoreworICBfX20xMjhpIF9fWSA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9zaTI1NiAoX19YLCBfX04gPj4gNCk7CisgIF9fWSA9IF9tbV9pbnNlcnRfZXBpOCAoX19ZLCBfX0QsIF9fTiAlIDE2KTsKKyAgcmV0dXJuIF9tbTI1Nl9pbnNlcnRmMTI4X3NpMjU2IChfX1gsIF9fWSwgX19OID4+IDQpOworfQorCisjaWZkZWYgX194ODZfNjRfXworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaW5zZXJ0X2VwaTY0IChfX20yNTZpIF9fWCwgbG9uZyBsb25nIF9fRCwgaW50IGNvbnN0IF9fTikKK3sKKyAgX19tMTI4aSBfX1kgPSBfbW0yNTZfZXh0cmFjdGYxMjhfc2kyNTYgKF9fWCwgX19OID4+IDEpOworICBfX1kgPSBfbW1faW5zZXJ0X2VwaTY0IChfX1ksIF9fRCwgX19OICUgMik7CisgIHJldHVybiBfbW0yNTZfaW5zZXJ0ZjEyOF9zaTI1NiAoX19YLCBfX1ksIF9fTiA+PiAxKTsKK30KKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgX21tMjU2X2luc2VydGYxMjhfcGQoWCwgWSwgTykJCQkJCVwKKyAgKChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92aW5zZXJ0ZjEyOF9wZDI1NiAoKF9fdjRkZikoX19tMjU2ZCkoWCksCVwKKwkJCQkJICAgICAgIChfX3YyZGYpKF9fbTEyOGQpKFkpLAlcCisJCQkJCSAgICAgICAoaW50KShPKSkpCisKKyNkZWZpbmUgX21tMjU2X2luc2VydGYxMjhfcHMoWCwgWSwgTykJCQkJCVwKKyAgKChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZpbnNlcnRmMTI4X3BzMjU2ICgoX192OHNmKShfX20yNTYpKFgpLAlcCisJCQkJCSAgICAgIChfX3Y0c2YpKF9fbTEyOCkoWSksICAJXAorCQkJCQkgICAgICAoaW50KShPKSkpCisKKyNkZWZpbmUgX21tMjU2X2luc2VydGYxMjhfc2kyNTYoWCwgWSwgTykJCQkJXAorICAoKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZpbnNlcnRmMTI4X3NpMjU2ICgoX192OHNpKShfX20yNTZpKShYKSwJXAorCQkJCQkgICAgICAgKF9fdjRzaSkoX19tMTI4aSkoWSksCVwKKwkJCQkJICAgICAgIChpbnQpKE8pKSkKKworI2RlZmluZSBfbW0yNTZfaW5zZXJ0X2VwaTMyKFgsIEQsIE4pCQkJCQlcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCVwKKyAgICh7CQkJCQkJCQkJXAorICAgICAgX19tMTI4aSBfX1kgPSBfbW0yNTZfZXh0cmFjdGYxMjhfc2kyNTYgKChYKSwgKE4pID4+IDIpOwkJXAorICAgICAgX19ZID0gX21tX2luc2VydF9lcGkzMiAoX19ZLCAoRCksIChOKSAlIDQpOwkJCVwKKyAgICAgIF9tbTI1Nl9pbnNlcnRmMTI4X3NpMjU2ICgoWCksIF9fWSwgKE4pID4+IDIpOwkJCVwKKyAgICB9KSkKKworI2RlZmluZSBfbW0yNTZfaW5zZXJ0X2VwaTE2KFgsIEQsIE4pCQkJCQlcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCVwKKyAgICh7CQkJCQkJCQkJXAorICAgICAgX19tMTI4aSBfX1kgPSBfbW0yNTZfZXh0cmFjdGYxMjhfc2kyNTYgKChYKSwgKE4pID4+IDMpOwkJXAorICAgICAgX19ZID0gX21tX2luc2VydF9lcGkxNiAoX19ZLCAoRCksIChOKSAlIDgpOwkJCVwKKyAgICAgIF9tbTI1Nl9pbnNlcnRmMTI4X3NpMjU2ICgoWCksIF9fWSwgKE4pID4+IDMpOwkJCVwKKyAgICB9KSkKKworI2RlZmluZSBfbW0yNTZfaW5zZXJ0X2VwaTgoWCwgRCwgTikJCQkJCVwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJXAorICAgKHsJCQkJCQkJCQlcCisgICAgICBfX20xMjhpIF9fWSA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9zaTI1NiAoKFgpLCAoTikgPj4gNCk7CQlcCisgICAgICBfX1kgPSBfbW1faW5zZXJ0X2VwaTggKF9fWSwgKEQpLCAoTikgJSAxNik7CQkJXAorICAgICAgX21tMjU2X2luc2VydGYxMjhfc2kyNTYgKChYKSwgX19ZLCAoTikgPj4gNCk7CQkJXAorICAgIH0pKQorCisjaWZkZWYgX194ODZfNjRfXworI2RlZmluZSBfbW0yNTZfaW5zZXJ0X2VwaTY0KFgsIEQsIE4pCQkJCQlcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCVwKKyAgICh7CQkJCQkJCQkJXAorICAgICAgX19tMTI4aSBfX1kgPSBfbW0yNTZfZXh0cmFjdGYxMjhfc2kyNTYgKChYKSwgKE4pID4+IDEpOwkJXAorICAgICAgX19ZID0gX21tX2luc2VydF9lcGk2NCAoX19ZLCAoRCksIChOKSAlIDIpOwkJCVwKKyAgICAgIF9tbTI1Nl9pbnNlcnRmMTI4X3NpMjU2ICgoWCksIF9fWSwgKE4pID4+IDEpOwkJCVwKKyAgICB9KSkKKyNlbmRpZgorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2xvYWRfcGQgKGRvdWJsZSBjb25zdCAqX19QKQoreworICByZXR1cm4gKihfX20yNTZkICopX19QOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdG9yZV9wZCAoZG91YmxlICpfX1AsIF9fbTI1NmQgX19BKQoreworICAqKF9fbTI1NmQgKilfX1AgPSBfX0E7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbG9hZF9wcyAoZmxvYXQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuICooX19tMjU2ICopX19QOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdG9yZV9wcyAoZmxvYXQgKl9fUCwgX19tMjU2IF9fQSkKK3sKKyAgKihfX20yNTYgKilfX1AgPSBfX0E7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2xvYWR1X3BkIChkb3VibGUgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9sb2FkdXBkMjU2IChfX1ApOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdG9yZXVfcGQgKGRvdWJsZSAqX19QLCBfX20yNTZkIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfc3RvcmV1cGQyNTYgKF9fUCwgKF9fdjRkZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2xvYWR1X3BzIChmbG9hdCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfbG9hZHVwczI1NiAoX19QKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3RvcmV1X3BzIChmbG9hdCAqX19QLCBfX20yNTYgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9zdG9yZXVwczI1NiAoX19QLCAoX192OHNmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2xvYWRfc2kyNTYgKF9fbTI1NmkgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuICpfX1A7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3N0b3JlX3NpMjU2IChfX20yNTZpICpfX1AsIF9fbTI1NmkgX19BKQoreworICAqX19QID0gX19BOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9sb2FkdV9zaTI1NiAoX19tMjU2aSBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2xvYWRkcXUyNTYgKChjaGFyIGNvbnN0ICopX19QKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3RvcmV1X3NpMjU2IChfX20yNTZpICpfX1AsIF9fbTI1NmkgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9zdG9yZWRxdTI1NiAoKGNoYXIgKilfX1AsIChfX3YzMnFpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hc2tsb2FkX3BkIChkb3VibGUgY29uc3QgKl9fUCwgX19tMTI4aSBfX00pCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfbWFza2xvYWRwZCAoKGNvbnN0IF9fdjJkZiAqKV9fUCwKKwkJCQkJICAgICAgKF9fdjJkaSlfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXNrc3RvcmVfcGQgKGRvdWJsZSAqX19QLCBfX20xMjhpIF9fTSwgX19tMTI4ZCBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZXBkICgoX192MmRmICopX19QLCAoX192MmRpKV9fTSwgKF9fdjJkZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXNrbG9hZF9wZCAoZG91YmxlIGNvbnN0ICpfX1AsIF9fbTI1NmkgX19NKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX21hc2tsb2FkcGQyNTYgKChjb25zdCBfX3Y0ZGYgKilfX1AsCisJCQkJCQkgKF9fdjRkaSlfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXNrc3RvcmVfcGQgKGRvdWJsZSAqX19QLCBfX20yNTZpIF9fTSwgX19tMjU2ZCBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZXBkMjU2ICgoX192NGRmICopX19QLCAoX192NGRpKV9fTSwgKF9fdjRkZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hc2tsb2FkX3BzIChmbG9hdCBjb25zdCAqX19QLCBfX20xMjhpIF9fTSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21hc2tsb2FkcHMgKChjb25zdCBfX3Y0c2YgKilfX1AsCisJCQkJCSAgICAgKF9fdjRzaSlfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXNrc3RvcmVfcHMgKGZsb2F0ICpfX1AsIF9fbTEyOGkgX19NLCBfX20xMjggX19BKQoreworICBfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVwcyAoKF9fdjRzZiAqKV9fUCwgKF9fdjRzaSlfX00sIChfX3Y0c2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXNrbG9hZF9wcyAoZmxvYXQgY29uc3QgKl9fUCwgX19tMjU2aSBfX00pCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHBzMjU2ICgoY29uc3QgX192OHNmICopX19QLAorCQkJCQkJKF9fdjhzaSlfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYXNrc3RvcmVfcHMgKGZsb2F0ICpfX1AsIF9fbTI1NmkgX19NLCBfX20yNTYgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVwczI1NiAoKF9fdjhzZiAqKV9fUCwgKF9fdjhzaSlfX00sIChfX3Y4c2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tb3ZlaGR1cF9wcyAoX19tMjU2IF9fWCkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX21vdnNoZHVwMjU2ICgoX192OHNmKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbW92ZWxkdXBfcHMgKF9fbTI1NiBfX1gpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9tb3ZzbGR1cDI1NiAoKF9fdjhzZilfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tb3ZlZHVwX3BkIChfX20yNTZkIF9fWCkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9tb3ZkZHVwMjU2ICgoX192NGRmKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2xkZHF1X3NpMjU2IChfX20yNTZpIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMjU2aSkgX19idWlsdGluX2lhMzJfbGRkcXUyNTYgKChjaGFyIGNvbnN0ICopX19QKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3RyZWFtX3NpMjU2IChfX20yNTZpICpfX0EsIF9fbTI1NmkgX19CKQoreworICBfX2J1aWx0aW5faWEzMl9tb3ZudGRxMjU2ICgoX192NGRpICopX19BLCAoX192NGRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3N0cmVhbV9wZCAoZG91YmxlICpfX0EsIF9fbTI1NmQgX19CKQoreworICBfX2J1aWx0aW5faWEzMl9tb3ZudHBkMjU2IChfX0EsIChfX3Y0ZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3RyZWFtX3BzIChmbG9hdCAqX19QLCBfX20yNTYgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9tb3ZudHBzMjU2IChfX1AsIChfX3Y4c2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9yY3BfcHMgKF9fbTI1NiBfX0EpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9yY3BwczI1NiAoKF9fdjhzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3JzcXJ0X3BzIChfX20yNTYgX19BKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfcnNxcnRwczI1NiAoKF9fdjhzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zcXJ0X3BkIChfX20yNTZkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9zcXJ0cGQyNTYgKChfX3Y0ZGYpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zcXJ0X3BzIChfX20yNTYgX19BKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfc3FydHBzMjU2ICgoX192OHNmKV9fQSk7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3JvdW5kX3BkIChfX20yNTZkIF9fViwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9yb3VuZHBkMjU2ICgoX192NGRmKV9fViwgX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9yb3VuZF9wcyAoX19tMjU2IF9fViwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3JvdW5kcHMyNTYgKChfX3Y4c2YpX19WLCBfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tMjU2X3JvdW5kX3BkKFYsIE0pIFwKKyAgKChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9yb3VuZHBkMjU2ICgoX192NGRmKShfX20yNTZkKShWKSwgKGludCkoTSkpKQorCisjZGVmaW5lIF9tbTI1Nl9yb3VuZF9wcyhWLCBNKSBcCisgICgoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9yb3VuZHBzMjU2ICgoX192OHNmKShfX20yNTYpKFYpLCAoaW50KShNKSkpCisjZW5kaWYKKworI2RlZmluZSBfbW0yNTZfY2VpbF9wZChWKQlfbW0yNTZfcm91bmRfcGQgKChWKSwgX01NX0ZST1VORF9DRUlMKQorI2RlZmluZSBfbW0yNTZfZmxvb3JfcGQoVikJX21tMjU2X3JvdW5kX3BkICgoViksIF9NTV9GUk9VTkRfRkxPT1IpCisjZGVmaW5lIF9tbTI1Nl9jZWlsX3BzKFYpCV9tbTI1Nl9yb3VuZF9wcyAoKFYpLCBfTU1fRlJPVU5EX0NFSUwpCisjZGVmaW5lIF9tbTI1Nl9mbG9vcl9wcyhWKQlfbW0yNTZfcm91bmRfcHMgKChWKSwgX01NX0ZST1VORF9GTE9PUikKKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfdW5wYWNraGlfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl91bnBja2hwZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfdW5wYWNrbG9fcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl91bnBja2xwZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl91bnBhY2toaV9wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3VucGNraHBzMjU2ICgoX192OHNmKV9fQSwgKF9fdjhzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3VucGFja2xvX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdW5wY2tscHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdGVzdHpfcGQgKF9fbTEyOGQgX19NLCBfX20xMjhkIF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0enBkICgoX192MmRmKV9fTSwgKF9fdjJkZilfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Rlc3RjX3BkIChfX20xMjhkIF9fTSwgX19tMTI4ZCBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92dGVzdGNwZCAoKF9fdjJkZilfX00sIChfX3YyZGYpX19WKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV90ZXN0bnpjX3BkIChfX20xMjhkIF9fTSwgX19tMTI4ZCBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92dGVzdG56Y3BkICgoX192MmRmKV9fTSwgKF9fdjJkZilfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Rlc3R6X3BzIChfX20xMjggX19NLCBfX20xMjggX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdnRlc3R6cHMgKChfX3Y0c2YpX19NLCAoX192NHNmKV9fVik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdGVzdGNfcHMgKF9fbTEyOCBfX00sIF9fbTEyOCBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92dGVzdGNwcyAoKF9fdjRzZilfX00sIChfX3Y0c2YpX19WKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV90ZXN0bnpjX3BzIChfX20xMjggX19NLCBfX20xMjggX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdnRlc3RuemNwcyAoKF9fdjRzZilfX00sIChfX3Y0c2YpX19WKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl90ZXN0el9wZCAoX19tMjU2ZCBfX00sIF9fbTI1NmQgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdnRlc3R6cGQyNTYgKChfX3Y0ZGYpX19NLCAoX192NGRmKV9fVik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfdGVzdGNfcGQgKF9fbTI1NmQgX19NLCBfX20yNTZkIF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0Y3BkMjU2ICgoX192NGRmKV9fTSwgKF9fdjRkZilfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Rlc3RuemNfcGQgKF9fbTI1NmQgX19NLCBfX20yNTZkIF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0bnpjcGQyNTYgKChfX3Y0ZGYpX19NLCAoX192NGRmKV9fVik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfdGVzdHpfcHMgKF9fbTI1NiBfX00sIF9fbTI1NiBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92dGVzdHpwczI1NiAoKF9fdjhzZilfX00sIChfX3Y4c2YpX19WKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl90ZXN0Y19wcyAoX19tMjU2IF9fTSwgX19tMjU2IF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0Y3BzMjU2ICgoX192OHNmKV9fTSwgKF9fdjhzZilfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Rlc3RuemNfcHMgKF9fbTI1NiBfX00sIF9fbTI1NiBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92dGVzdG56Y3BzMjU2ICgoX192OHNmKV9fTSwgKF9fdjhzZilfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Rlc3R6X3NpMjU2IChfX20yNTZpIF9fTSwgX19tMjU2aSBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wdGVzdHoyNTYgKChfX3Y0ZGkpX19NLCAoX192NGRpKV9fVik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfdGVzdGNfc2kyNTYgKF9fbTI1NmkgX19NLCBfX20yNTZpIF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3B0ZXN0YzI1NiAoKF9fdjRkaSlfX00sIChfX3Y0ZGkpX19WKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl90ZXN0bnpjX3NpMjU2IChfX20yNTZpIF9fTSwgX19tMjU2aSBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wdGVzdG56YzI1NiAoKF9fdjRkaSlfX00sIChfX3Y0ZGkpX19WKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tb3ZlbWFza19wZCAoX19tMjU2ZCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9tb3Ztc2twZDI1NiAoKF9fdjRkZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21vdmVtYXNrX3BzIChfX20yNTYgX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfbW92bXNrcHMyNTYgKChfX3Y4c2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0emVyb19wZCAodm9pZCkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTI1NmQpeyAwLjAsIDAuMCwgMC4wLCAwLjAgfTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXR6ZXJvX3BzICh2b2lkKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMjU2KXsgMC4wLCAwLjAsIDAuMCwgMC4wLAorCQkJCSAwLjAsIDAuMCwgMC4wLCAwLjAgfTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0emVyb19zaTI1NiAodm9pZCkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTI1NmkpKF9fdjRkaSl7IDAsIDAsIDAsIDAgfTsKK30KKworLyogQ3JlYXRlIHRoZSB2ZWN0b3IgW0EgQiBDIERdLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldF9wZCAoZG91YmxlIF9fQSwgZG91YmxlIF9fQiwgZG91YmxlIF9fQywgZG91YmxlIF9fRCkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTI1NmQpeyBfX0QsIF9fQywgX19CLCBfX0EgfTsKK30KKworLyogQ3JlYXRlIHRoZSB2ZWN0b3IgW0EgQiBDIEQgRSBGIEcgSF0uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXRfcHMgKGZsb2F0IF9fQSwgZmxvYXQgX19CLCBmbG9hdCBfX0MsIGZsb2F0IF9fRCwKKwkgICAgICAgZmxvYXQgX19FLCBmbG9hdCBfX0YsIGZsb2F0IF9fRywgZmxvYXQgX19IKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMjU2KXsgX19ILCBfX0csIF9fRiwgX19FLAorCQkJCSBfX0QsIF9fQywgX19CLCBfX0EgfTsKK30KKworLyogQ3JlYXRlIHRoZSB2ZWN0b3IgW0EgQiBDIEQgRSBGIEcgSF0uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0X2VwaTMyIChpbnQgX19BLCBpbnQgX19CLCBpbnQgX19DLCBpbnQgX19ELAorCQkgIGludCBfX0UsIGludCBfX0YsIGludCBfX0csIGludCBfX0gpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20yNTZpKShfX3Y4c2kpeyBfX0gsIF9fRywgX19GLCBfX0UsCisJCQkJCSAgX19ELCBfX0MsIF9fQiwgX19BIH07Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldF9lcGkxNiAoc2hvcnQgX19xMTUsIHNob3J0IF9fcTE0LCBzaG9ydCBfX3ExMywgc2hvcnQgX19xMTIsCisJCSAgc2hvcnQgX19xMTEsIHNob3J0IF9fcTEwLCBzaG9ydCBfX3EwOSwgc2hvcnQgX19xMDgsCisJCSAgc2hvcnQgX19xMDcsIHNob3J0IF9fcTA2LCBzaG9ydCBfX3EwNSwgc2hvcnQgX19xMDQsCisJCSAgc2hvcnQgX19xMDMsIHNob3J0IF9fcTAyLCBzaG9ydCBfX3EwMSwgc2hvcnQgX19xMDApCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20yNTZpKShfX3YxNmhpKXsKKyAgICBfX3EwMCwgX19xMDEsIF9fcTAyLCBfX3EwMywgX19xMDQsIF9fcTA1LCBfX3EwNiwgX19xMDcsCisgICAgX19xMDgsIF9fcTA5LCBfX3ExMCwgX19xMTEsIF9fcTEyLCBfX3ExMywgX19xMTQsIF9fcTE1CisgIH07Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldF9lcGk4ICAoY2hhciBfX3EzMSwgY2hhciBfX3EzMCwgY2hhciBfX3EyOSwgY2hhciBfX3EyOCwKKwkJICBjaGFyIF9fcTI3LCBjaGFyIF9fcTI2LCBjaGFyIF9fcTI1LCBjaGFyIF9fcTI0LAorCQkgIGNoYXIgX19xMjMsIGNoYXIgX19xMjIsIGNoYXIgX19xMjEsIGNoYXIgX19xMjAsCisJCSAgY2hhciBfX3ExOSwgY2hhciBfX3ExOCwgY2hhciBfX3ExNywgY2hhciBfX3ExNiwKKwkJICBjaGFyIF9fcTE1LCBjaGFyIF9fcTE0LCBjaGFyIF9fcTEzLCBjaGFyIF9fcTEyLAorCQkgIGNoYXIgX19xMTEsIGNoYXIgX19xMTAsIGNoYXIgX19xMDksIGNoYXIgX19xMDgsCisJCSAgY2hhciBfX3EwNywgY2hhciBfX3EwNiwgY2hhciBfX3EwNSwgY2hhciBfX3EwNCwKKwkJICBjaGFyIF9fcTAzLCBjaGFyIF9fcTAyLCBjaGFyIF9fcTAxLCBjaGFyIF9fcTAwKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMjU2aSkoX192MzJxaSl7CisgICAgX19xMDAsIF9fcTAxLCBfX3EwMiwgX19xMDMsIF9fcTA0LCBfX3EwNSwgX19xMDYsIF9fcTA3LAorICAgIF9fcTA4LCBfX3EwOSwgX19xMTAsIF9fcTExLCBfX3ExMiwgX19xMTMsIF9fcTE0LCBfX3ExNSwKKyAgICBfX3ExNiwgX19xMTcsIF9fcTE4LCBfX3ExOSwgX19xMjAsIF9fcTIxLCBfX3EyMiwgX19xMjMsCisgICAgX19xMjQsIF9fcTI1LCBfX3EyNiwgX19xMjcsIF9fcTI4LCBfX3EyOSwgX19xMzAsIF9fcTMxCisgIH07Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldF9lcGk2NHggKGxvbmcgbG9uZyBfX0EsIGxvbmcgbG9uZyBfX0IsIGxvbmcgbG9uZyBfX0MsCisJCSAgIGxvbmcgbG9uZyBfX0QpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20yNTZpKShfX3Y0ZGkpeyBfX0QsIF9fQywgX19CLCBfX0EgfTsKK30KKworLyogQ3JlYXRlIGEgdmVjdG9yIHdpdGggYWxsIGVsZW1lbnRzIGVxdWFsIHRvIEEuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0MV9wZCAoZG91YmxlIF9fQSkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTI1NmQpeyBfX0EsIF9fQSwgX19BLCBfX0EgfTsKK30KKworLyogQ3JlYXRlIGEgdmVjdG9yIHdpdGggYWxsIGVsZW1lbnRzIGVxdWFsIHRvIEEuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXQxX3BzIChmbG9hdCBfX0EpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20yNTYpeyBfX0EsIF9fQSwgX19BLCBfX0EsCisJCQkJIF9fQSwgX19BLCBfX0EsIF9fQSB9OworfQorCisvKiBDcmVhdGUgYSB2ZWN0b3Igd2l0aCBhbGwgZWxlbWVudHMgZXF1YWwgdG8gQS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXQxX2VwaTMyIChpbnQgX19BKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMjU2aSkoX192OHNpKXsgX19BLCBfX0EsIF9fQSwgX19BLAorCQkJCQkgIF9fQSwgX19BLCBfX0EsIF9fQSB9OworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXQxX2VwaTE2IChzaG9ydCBfX0EpCit7CisgIHJldHVybiBfbW0yNTZfc2V0X2VwaTE2IChfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwKKwkJCSAgIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0MV9lcGk4IChjaGFyIF9fQSkKK3sKKyAgcmV0dXJuIF9tbTI1Nl9zZXRfZXBpOCAoX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsCisJCQkgIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLAorCQkJICBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwKKwkJCSAgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXQxX2VwaTY0eCAobG9uZyBsb25nIF9fQSkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTI1NmkpKF9fdjRkaSl7IF9fQSwgX19BLCBfX0EsIF9fQSB9OworfQorCisvKiBDcmVhdGUgdmVjdG9ycyBvZiBlbGVtZW50cyBpbiB0aGUgcmV2ZXJzZWQgb3JkZXIgZnJvbSB0aGUKKyAgIF9tbTI1Nl9zZXRfWFhYIGZ1bmN0aW9ucy4gICovCisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldHJfcGQgKGRvdWJsZSBfX0EsIGRvdWJsZSBfX0IsIGRvdWJsZSBfX0MsIGRvdWJsZSBfX0QpCit7CisgIHJldHVybiBfbW0yNTZfc2V0X3BkIChfX0QsIF9fQywgX19CLCBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldHJfcHMgKGZsb2F0IF9fQSwgZmxvYXQgX19CLCBmbG9hdCBfX0MsIGZsb2F0IF9fRCwKKwkJZmxvYXQgX19FLCBmbG9hdCBfX0YsIGZsb2F0IF9fRywgZmxvYXQgX19IKQoreworICByZXR1cm4gX21tMjU2X3NldF9wcyAoX19ILCBfX0csIF9fRiwgX19FLCBfX0QsIF9fQywgX19CLCBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXRyX2VwaTMyIChpbnQgX19BLCBpbnQgX19CLCBpbnQgX19DLCBpbnQgX19ELAorCQkgICBpbnQgX19FLCBpbnQgX19GLCBpbnQgX19HLCBpbnQgX19IKQoreworICByZXR1cm4gX21tMjU2X3NldF9lcGkzMiAoX19ILCBfX0csIF9fRiwgX19FLCBfX0QsIF9fQywgX19CLCBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXRyX2VwaTE2IChzaG9ydCBfX3ExNSwgc2hvcnQgX19xMTQsIHNob3J0IF9fcTEzLCBzaG9ydCBfX3ExMiwKKwkJICAgc2hvcnQgX19xMTEsIHNob3J0IF9fcTEwLCBzaG9ydCBfX3EwOSwgc2hvcnQgX19xMDgsCisJCSAgIHNob3J0IF9fcTA3LCBzaG9ydCBfX3EwNiwgc2hvcnQgX19xMDUsIHNob3J0IF9fcTA0LAorCQkgICBzaG9ydCBfX3EwMywgc2hvcnQgX19xMDIsIHNob3J0IF9fcTAxLCBzaG9ydCBfX3EwMCkKK3sKKyAgcmV0dXJuIF9tbTI1Nl9zZXRfZXBpMTYgKF9fcTAwLCBfX3EwMSwgX19xMDIsIF9fcTAzLAorCQkJICAgX19xMDQsIF9fcTA1LCBfX3EwNiwgX19xMDcsCisJCQkgICBfX3EwOCwgX19xMDksIF9fcTEwLCBfX3ExMSwKKwkJCSAgIF9fcTEyLCBfX3ExMywgX19xMTQsIF9fcTE1KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0cl9lcGk4ICAoY2hhciBfX3EzMSwgY2hhciBfX3EzMCwgY2hhciBfX3EyOSwgY2hhciBfX3EyOCwKKwkJICAgY2hhciBfX3EyNywgY2hhciBfX3EyNiwgY2hhciBfX3EyNSwgY2hhciBfX3EyNCwKKwkJICAgY2hhciBfX3EyMywgY2hhciBfX3EyMiwgY2hhciBfX3EyMSwgY2hhciBfX3EyMCwKKwkJICAgY2hhciBfX3ExOSwgY2hhciBfX3ExOCwgY2hhciBfX3ExNywgY2hhciBfX3ExNiwKKwkJICAgY2hhciBfX3ExNSwgY2hhciBfX3ExNCwgY2hhciBfX3ExMywgY2hhciBfX3ExMiwKKwkJICAgY2hhciBfX3ExMSwgY2hhciBfX3ExMCwgY2hhciBfX3EwOSwgY2hhciBfX3EwOCwKKwkJICAgY2hhciBfX3EwNywgY2hhciBfX3EwNiwgY2hhciBfX3EwNSwgY2hhciBfX3EwNCwKKwkJICAgY2hhciBfX3EwMywgY2hhciBfX3EwMiwgY2hhciBfX3EwMSwgY2hhciBfX3EwMCkKK3sKKyAgcmV0dXJuIF9tbTI1Nl9zZXRfZXBpOCAoX19xMDAsIF9fcTAxLCBfX3EwMiwgX19xMDMsCisJCQkgIF9fcTA0LCBfX3EwNSwgX19xMDYsIF9fcTA3LAorCQkJICBfX3EwOCwgX19xMDksIF9fcTEwLCBfX3ExMSwKKwkJCSAgX19xMTIsIF9fcTEzLCBfX3ExNCwgX19xMTUsCisJCQkgIF9fcTE2LCBfX3ExNywgX19xMTgsIF9fcTE5LAorCQkJICBfX3EyMCwgX19xMjEsIF9fcTIyLCBfX3EyMywKKwkJCSAgX19xMjQsIF9fcTI1LCBfX3EyNiwgX19xMjcsCisJCQkgIF9fcTI4LCBfX3EyOSwgX19xMzAsIF9fcTMxKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0cl9lcGk2NHggKGxvbmcgbG9uZyBfX0EsIGxvbmcgbG9uZyBfX0IsIGxvbmcgbG9uZyBfX0MsCisJCSAgICBsb25nIGxvbmcgX19EKQoreworICByZXR1cm4gX21tMjU2X3NldF9lcGk2NHggKF9fRCwgX19DLCBfX0IsIF9fQSk7Cit9CisKKy8qIENhc3RzIGJldHdlZW4gdmFyaW91cyBTUCwgRFAsIElOVCB2ZWN0b3IgdHlwZXMuICBOb3RlIHRoYXQgdGhlc2UgZG8gbm8KKyAgIGNvbnZlcnNpb24gb2YgdmFsdWVzLCB0aGV5IGp1c3QgY2hhbmdlIHRoZSB0eXBlLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY2FzdHBkX3BzIChfX20yNTZkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fQTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY2FzdHBkX3NpMjU2IChfX20yNTZkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX0E7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Nhc3Rwc19wZCAoX19tMjU2IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX0E7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Nhc3Rwc19zaTI1NihfX20yNTYgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fQTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jYXN0c2kyNTZfcHMgKF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTI1NikgX19BOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jYXN0c2kyNTZfcGQgKF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fQTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY2FzdHBkMjU2X3BkMTI4IChfX20yNTZkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9wZF9wZDI1NiAoKF9fdjRkZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Nhc3RwczI1Nl9wczEyOCAoX19tMjU2IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3BzX3BzMjU2ICgoX192OHNmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Nhc3RzaTI1Nl9zaTEyOCAoX19tMjU2aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfc2lfc2kyNTYgKChfX3Y4c2kpX19BKTsKK30KKworLyogV2hlbiBjYXN0IGlzIGRvbmUgZnJvbSBhIDEyOCB0byAyNTYtYml0IHR5cGUsIHRoZSBsb3cgMTI4IGJpdHMgb2YKKyAgIHRoZSAyNTYtYml0IHJlc3VsdCBjb250YWluIHNvdXJjZSBwYXJhbWV0ZXIgdmFsdWUgYW5kIHRoZSB1cHBlciAxMjgKKyAgIGJpdHMgb2YgdGhlIHJlc3VsdCBhcmUgdW5kZWZpbmVkLiAgVGhvc2UgaW50cmluc2ljcyBzaG91bGRuJ3QKKyAgIGdlbmVyYXRlIGFueSBleHRyYSBtb3Zlcy4gICovCisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Nhc3RwZDEyOF9wZDI1NiAoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfcGQyNTZfcGQgKChfX3YyZGYpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jYXN0cHMxMjhfcHMyNTYgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9wczI1Nl9wcyAoKF9fdjRzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jYXN0c2kxMjhfc2kyNTYgKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3NpMjU2X3NpICgoX192NHNpKV9fQSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9ibWkyaW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9ibWkyaW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI5ZWEyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2JtaTJpbnRyaW4uaApAQCAtMCwwICsxLDEwMiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZiAhZGVmaW5lZCBfWDg2SU5UUklOX0hfSU5DTFVERUQgJiYgIWRlZmluZWQgX0lNTUlOVFJJTl9IX0lOQ0xVREVECisjIGVycm9yICJOZXZlciB1c2UgPGJtaTJpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHg4NmludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fQk1JMl9fCisjIGVycm9yICJCTUkyIGluc3RydWN0aW9uIHNldCBub3QgZW5hYmxlZCIKKyNlbmRpZiAvKiBfX0JNSTJfXyAqLworCisjaWZuZGVmIF9CTUkySU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX0JNSTJJTlRSSU5fSF9JTkNMVURFRAorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19iemhpX3UzMiAodW5zaWduZWQgaW50IF9fWCwgdW5zaWduZWQgaW50IF9fWSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2J6aGlfc2kgKF9fWCwgX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfcGRlcF91MzIgKHVuc2lnbmVkIGludCBfX1gsIHVuc2lnbmVkIGludCBfX1kpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wZGVwX3NpIChfX1gsIF9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX3BleHRfdTMyICh1bnNpZ25lZCBpbnQgX19YLCB1bnNpZ25lZCBpbnQgX19ZKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcGV4dF9zaSAoX19YLCBfX1kpOworfQorCisjaWZkZWYgIF9feDg2XzY0X18KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZworX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfYnpoaV91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX1kpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9iemhpX2RpIChfX1gsIF9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX3BkZXBfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YLCB1bnNpZ25lZCBsb25nIGxvbmcgX19ZKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcGRlcF9kaSAoX19YLCBfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19wZXh0X3U2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCwgdW5zaWduZWQgbG9uZyBsb25nIF9fWSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3BleHRfZGkgKF9fWCwgX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZworX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbXVseF91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX1ksCisJICAgdW5zaWduZWQgbG9uZyBsb25nICpfX1ApCit7CisgIHVuc2lnbmVkIF9faW50MTI4IF9fcmVzID0gKHVuc2lnbmVkIF9faW50MTI4KSBfX1ggKiBfX1k7CisgICpfX1AgPSAodW5zaWduZWQgbG9uZyBsb25nKSAoX19yZXMgPj4gNjQpOworICByZXR1cm4gKHVuc2lnbmVkIGxvbmcgbG9uZykgX19yZXM7Cit9CisKKyNlbHNlIC8qICFfX3g4Nl82NF9fICovCisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX211bHhfdTMyICh1bnNpZ25lZCBpbnQgX19YLCB1bnNpZ25lZCBpbnQgX19ZLCB1bnNpZ25lZCBpbnQgKl9fUCkKK3sKKyAgdW5zaWduZWQgbG9uZyBsb25nIF9fcmVzID0gKHVuc2lnbmVkIGxvbmcgbG9uZykgX19YICogX19ZOworICAqX19QID0gKHVuc2lnbmVkIGludCkgKF9fcmVzID4+IDMyKTsKKyAgcmV0dXJuICh1bnNpZ25lZCBpbnQpIF9fcmVzOworfQorCisjZW5kaWYgLyogIV9feDg2XzY0X18gICovCisKKyNlbmRpZiAvKiBfQk1JMklOVFJJTl9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9ibWlpbnRyaW4uaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2JtaWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjN2YyZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9ibWlpbnRyaW4uaApAQCAtMCwwICsxLDE3NyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZiAhZGVmaW5lZCBfWDg2SU5UUklOX0hfSU5DTFVERUQgJiYgIWRlZmluZWQgX0lNTUlOVFJJTl9IX0lOQ0xVREVECisjIGVycm9yICJOZXZlciB1c2UgPGJtaWludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8eDg2aW50cmluLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX19CTUlfXworIyBlcnJvciAiQk1JIGluc3RydWN0aW9uIHNldCBub3QgZW5hYmxlZCIKKyNlbmRpZiAvKiBfX0JNSV9fICovCisKKyNpZm5kZWYgX0JNSUlOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9CTUlJTlRSSU5fSF9JTkNMVURFRAorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgc2hvcnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX3R6Y250X3UxNiAodW5zaWduZWQgc2hvcnQgX19YKQoreworICByZXR1cm4gX19idWlsdGluX2N0enMgKF9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2FuZG5fdTMyICh1bnNpZ25lZCBpbnQgX19YLCB1bnNpZ25lZCBpbnQgX19ZKQoreworICByZXR1cm4gfl9fWCAmIF9fWTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmV4dHJfdTMyICh1bnNpZ25lZCBpbnQgX19YLCB1bnNpZ25lZCBpbnQgX19ZKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfYmV4dHJfdTMyIChfX1gsIF9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfYmV4dHJfdTMyICh1bnNpZ25lZCBpbnQgX19YLCB1bnNpZ25lZCBpbnQgX19ZLCB1bnNpZ25lZCBfX1opCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9iZXh0cl91MzIgKF9fWCwgKChfX1kgJiAweGZmKSB8ICgoX19aICYgMHhmZikgPDwgOCkpKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxzaV91MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHJldHVybiBfX1ggJiAtX19YOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX2Jsc2lfdTMyICh1bnNpZ25lZCBpbnQgX19YKQoreworICByZXR1cm4gX19ibHNpX3UzMiAoX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxzbXNrX3UzMiAodW5zaWduZWQgaW50IF9fWCkKK3sKKyAgcmV0dXJuIF9fWCBeIChfX1ggLSAxKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19ibHNtc2tfdTMyICh1bnNpZ25lZCBpbnQgX19YKQoreworICByZXR1cm4gX19ibHNtc2tfdTMyIChfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ibHNyX3UzMiAodW5zaWduZWQgaW50IF9fWCkKK3sKKyAgcmV0dXJuIF9fWCAmIChfX1ggLSAxKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19ibHNyX3UzMiAodW5zaWduZWQgaW50IF9fWCkKK3sKKyAgcmV0dXJuIF9fYmxzcl91MzIgKF9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX3R6Y250X3UzMiAodW5zaWduZWQgaW50IF9fWCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9jdHogKF9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfdHpjbnRfdTMyICh1bnNpZ25lZCBpbnQgX19YKQoreworICByZXR1cm4gX19idWlsdGluX2N0eiAoX19YKTsKK30KKworCisjaWZkZWYgIF9feDg2XzY0X18KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2FuZG5fdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YLCB1bnNpZ25lZCBsb25nIGxvbmcgX19ZKQoreworICByZXR1cm4gfl9fWCAmIF9fWTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmV4dHJfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YLCB1bnNpZ25lZCBsb25nIGxvbmcgX19ZKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfYmV4dHJfdTY0IChfX1gsIF9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfYmV4dHJfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YLCB1bnNpZ25lZCBpbnQgX19ZLCB1bnNpZ25lZCBpbnQgX19aKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfYmV4dHJfdTY0IChfX1gsICgoX19ZICYgMHhmZikgfCAoKF9fWiAmIDB4ZmYpIDw8IDgpKSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2Jsc2lfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YKQoreworICByZXR1cm4gX19YICYgLV9fWDsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19ibHNpX3U2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIF9fYmxzaV91NjQgKF9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2Jsc21za191NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX1ggXiAoX19YIC0gMSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfYmxzbXNrX3U2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIF9fYmxzbXNrX3U2NCAoX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxzcl91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX1ggJiAoX19YIC0gMSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfYmxzcl91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX2Jsc3JfdTY0IChfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX190emNudF91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fY3R6bGwgKF9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfdHpjbnRfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YKQoreworICByZXR1cm4gX19idWlsdGluX2N0emxsIChfX1gpOworfQorCisjZW5kaWYgLyogX194ODZfNjRfXyAgKi8KKworI2VuZGlmIC8qIF9CTUlJTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvYm1taW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9ibW1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDY4Y2VjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvYm1taW50cmluLmgKQEAgLTAsMCArMSwyOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX0JNTUlOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9CTU1JTlRSSU5fSF9JTkNMVURFRAorCisjIGVycm9yICJTU0U1IGluc3RydWN0aW9uIHNldCByZW1vdmVkIGZyb20gY29tcGlsZXIiCisKKyNlbmRpZiAvKiBfQk1NSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2NwdWlkLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9jcHVpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZTFlYmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9jcHVpZC5oCkBAIC0wLDAgKzEsMjY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgKiBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgKiAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAqIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgKiBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAqIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisvKiAlZWN4ICovCisjZGVmaW5lIGJpdF9TU0UzCSgxIDw8IDApCisjZGVmaW5lIGJpdF9QQ0xNVUwJKDEgPDwgMSkKKyNkZWZpbmUgYml0X0xaQ05UCSgxIDw8IDUpCisjZGVmaW5lIGJpdF9TU1NFMwkoMSA8PCA5KQorI2RlZmluZSBiaXRfRk1BCQkoMSA8PCAxMikKKyNkZWZpbmUgYml0X0NNUFhDSEcxNkIJKDEgPDwgMTMpCisjZGVmaW5lIGJpdF9TU0U0XzEJKDEgPDwgMTkpCisjZGVmaW5lIGJpdF9TU0U0XzIJKDEgPDwgMjApCisjZGVmaW5lIGJpdF9NT1ZCRQkoMSA8PCAyMikKKyNkZWZpbmUgYml0X1BPUENOVAkoMSA8PCAyMykKKyNkZWZpbmUgYml0X0FFUwkJKDEgPDwgMjUpCisjZGVmaW5lIGJpdF9YU0FWRQkoMSA8PCAyNikKKyNkZWZpbmUgYml0X09TWFNBVkUJKDEgPDwgMjcpCisjZGVmaW5lIGJpdF9BVlgJCSgxIDw8IDI4KQorI2RlZmluZSBiaXRfRjE2QwkoMSA8PCAyOSkKKyNkZWZpbmUgYml0X1JEUk5ECSgxIDw8IDMwKQorCisvKiAlZWR4ICovCisjZGVmaW5lIGJpdF9DTVBYQ0hHOEIJKDEgPDwgOCkKKyNkZWZpbmUgYml0X0NNT1YJKDEgPDwgMTUpCisjZGVmaW5lIGJpdF9NTVgJCSgxIDw8IDIzKQorI2RlZmluZSBiaXRfRlhTQVZFCSgxIDw8IDI0KQorI2RlZmluZSBiaXRfU1NFCQkoMSA8PCAyNSkKKyNkZWZpbmUgYml0X1NTRTIJKDEgPDwgMjYpCisKKy8qIEV4dGVuZGVkIEZlYXR1cmVzICovCisvKiAlZWN4ICovCisjZGVmaW5lIGJpdF9MQUhGX0xNCSgxIDw8IDApCisjZGVmaW5lIGJpdF9BQk0JCSgxIDw8IDUpCisjZGVmaW5lIGJpdF9TU0U0YQkoMSA8PCA2KQorI2RlZmluZSBiaXRfUFJGQ0hXCSgxIDw8IDgpCisjZGVmaW5lIGJpdF9YT1AgICAgICAgICAoMSA8PCAxMSkKKyNkZWZpbmUgYml0X0xXUCAJKDEgPDwgMTUpCisjZGVmaW5lIGJpdF9GTUE0ICAgICAgICAoMSA8PCAxNikKKyNkZWZpbmUgYml0X1RCTSAgICAgICAgICgxIDw8IDIxKQorCisvKiAlZWR4ICovCisjZGVmaW5lIGJpdF9NTVhFWFQJKDEgPDwgMjIpCisjZGVmaW5lIGJpdF9MTQkJKDEgPDwgMjkpCisjZGVmaW5lIGJpdF8zRE5PV1AJKDEgPDwgMzApCisjZGVmaW5lIGJpdF8zRE5PVwkoMSA8PCAzMSkKKworLyogRXh0ZW5kZWQgRmVhdHVyZXMgKCVlYXggPT0gNykgKi8KKyNkZWZpbmUgYml0X0ZTR1NCQVNFCSgxIDw8IDApCisjZGVmaW5lIGJpdF9CTUkJKDEgPDwgMykKKyNkZWZpbmUgYml0X0hMRQkoMSA8PCA0KQorI2RlZmluZSBiaXRfQVZYMgkoMSA8PCA1KQorI2RlZmluZSBiaXRfQk1JMgkoMSA8PCA4KQorI2RlZmluZSBiaXRfUlRNCSgxIDw8IDExKQorI2RlZmluZSBiaXRfUkRTRUVECSgxIDw8IDE4KQorI2RlZmluZSBiaXRfQURYCSgxIDw8IDE5KQorCisvKiBFeHRlbmRlZCBTdGF0ZSBFbnVtZXJhdGlvbiBTdWItbGVhZiAoJWVheCA9PSAxMywgJWVjeCA9PSAxKSAqLworI2RlZmluZSBiaXRfWFNBVkVPUFQJKDEgPDwgMCkKKworLyogU2lnbmF0dXJlcyBmb3IgZGlmZmVyZW50IENQVSBpbXBsZW1lbnRhdGlvbnMgYXMgcmV0dXJuZWQgaW4gdXNlcworICAgb2YgY3B1aWQgd2l0aCBsZXZlbCAwLiAgKi8KKyNkZWZpbmUgc2lnbmF0dXJlX0FNRF9lYngJMHg2ODc0NzU0MQorI2RlZmluZSBzaWduYXR1cmVfQU1EX2VjeAkweDQ0NGQ0MTYzCisjZGVmaW5lIHNpZ25hdHVyZV9BTURfZWR4CTB4Njk3NDZlNjUKKworI2RlZmluZSBzaWduYXR1cmVfQ0VOVEFVUl9lYngJMHg3NDZlNjU0MworI2RlZmluZSBzaWduYXR1cmVfQ0VOVEFVUl9lY3gJMHg3MzZjNzU2MQorI2RlZmluZSBzaWduYXR1cmVfQ0VOVEFVUl9lZHgJMHg0ODcyNzU2MQorCisjZGVmaW5lIHNpZ25hdHVyZV9DWVJJWF9lYngJMHg2OTcyNzk0MworI2RlZmluZSBzaWduYXR1cmVfQ1lSSVhfZWN4CTB4NjQ2MTY1NzQKKyNkZWZpbmUgc2lnbmF0dXJlX0NZUklYX2VkeAkweDczNmU0OTc4CisKKyNkZWZpbmUgc2lnbmF0dXJlX0lOVEVMX2VieAkweDc1NmU2NTQ3CisjZGVmaW5lIHNpZ25hdHVyZV9JTlRFTF9lY3gJMHg2YzY1NzQ2ZQorI2RlZmluZSBzaWduYXR1cmVfSU5URUxfZWR4CTB4NDk2NTZlNjkKKworI2RlZmluZSBzaWduYXR1cmVfVE0xX2VieAkweDZlNjE3MjU0CisjZGVmaW5lIHNpZ25hdHVyZV9UTTFfZWN4CTB4NTU1MDQzNjEKKyNkZWZpbmUgc2lnbmF0dXJlX1RNMV9lZHgJMHg3NDY1NmQ3MworCisjZGVmaW5lIHNpZ25hdHVyZV9UTTJfZWJ4CTB4NzU2ZTY1NDcKKyNkZWZpbmUgc2lnbmF0dXJlX1RNMl9lY3gJMHgzNjM4Nzg0ZAorI2RlZmluZSBzaWduYXR1cmVfVE0yX2VkeAkweDU0NjU2ZTY5CisKKyNkZWZpbmUgc2lnbmF0dXJlX05TQ19lYngJMHg2NDZmNjU0NworI2RlZmluZSBzaWduYXR1cmVfTlNDX2VjeAkweDQzNTM0ZTIwCisjZGVmaW5lIHNpZ25hdHVyZV9OU0NfZWR4CTB4Nzk2MjIwNjUKKworI2RlZmluZSBzaWduYXR1cmVfTkVYR0VOX2VieAkweDQ3Nzg2NTRlCisjZGVmaW5lIHNpZ25hdHVyZV9ORVhHRU5fZWN4CTB4NmU2NTc2NjkKKyNkZWZpbmUgc2lnbmF0dXJlX05FWEdFTl9lZHgJMHg3MjQ0NmU2NQorCisjZGVmaW5lIHNpZ25hdHVyZV9SSVNFX2VieAkweDY1NzM2OTUyCisjZGVmaW5lIHNpZ25hdHVyZV9SSVNFX2VjeAkweDY1NzM2OTUyCisjZGVmaW5lIHNpZ25hdHVyZV9SSVNFX2VkeAkweDY1NzM2OTUyCisKKyNkZWZpbmUgc2lnbmF0dXJlX1NJU19lYngJMHgyMDUzNjk1MworI2RlZmluZSBzaWduYXR1cmVfU0lTX2VjeAkweDIwNTM2OTUzCisjZGVmaW5lIHNpZ25hdHVyZV9TSVNfZWR4CTB4MjA1MzY5NTMKKworI2RlZmluZSBzaWduYXR1cmVfVU1DX2VieAkweDIwNDM0ZDU1CisjZGVmaW5lIHNpZ25hdHVyZV9VTUNfZWN4CTB4MjA0MzRkNTUKKyNkZWZpbmUgc2lnbmF0dXJlX1VNQ19lZHgJMHgyMDQzNGQ1NQorCisjZGVmaW5lIHNpZ25hdHVyZV9WSUFfZWJ4CTB4MjA0MTQ5NTYKKyNkZWZpbmUgc2lnbmF0dXJlX1ZJQV9lY3gJMHgyMDQxNDk1NgorI2RlZmluZSBzaWduYXR1cmVfVklBX2VkeAkweDIwNDE0OTU2CisKKyNkZWZpbmUgc2lnbmF0dXJlX1ZPUlRFWF9lYngJMHg3NDcyNmY1NgorI2RlZmluZSBzaWduYXR1cmVfVk9SVEVYX2VjeAkweDQzNmY1MzIwCisjZGVmaW5lIHNpZ25hdHVyZV9WT1JURVhfZWR4CTB4MzYzODc4NjUKKworI2lmIGRlZmluZWQoX19pMzg2X18pICYmIGRlZmluZWQoX19QSUNfXykKKy8qICVlYnggbWF5IGJlIHRoZSBQSUMgcmVnaXN0ZXIuICAqLworI2lmIF9fR05VQ19fID49IDMKKyNkZWZpbmUgX19jcHVpZChsZXZlbCwgYSwgYiwgYywgZCkJCQlcCisgIF9fYXNtX18gKCJ4Y2hne2x9XHR7JSV9ZWJ4LCAlazFcblx0IgkJCVwKKwkgICAiY3B1aWRcblx0IgkJCQkJXAorCSAgICJ4Y2hne2x9XHR7JSV9ZWJ4LCAlazFcblx0IgkJCVwKKwkgICA6ICI9YSIgKGEpLCAiPSZyIiAoYiksICI9YyIgKGMpLCAiPWQiIChkKQlcCisJICAgOiAiMCIgKGxldmVsKSkKKworI2RlZmluZSBfX2NwdWlkX2NvdW50KGxldmVsLCBjb3VudCwgYSwgYiwgYywgZCkJCVwKKyAgX19hc21fXyAoInhjaGd7bH1cdHslJX1lYngsICVrMVxuXHQiCQkJXAorCSAgICJjcHVpZFxuXHQiCQkJCQlcCisJICAgInhjaGd7bH1cdHslJX1lYngsICVrMVxuXHQiCQkJXAorCSAgIDogIj1hIiAoYSksICI9JnIiIChiKSwgIj1jIiAoYyksICI9ZCIgKGQpCVwKKwkgICA6ICIwIiAobGV2ZWwpLCAiMiIgKGNvdW50KSkKKyNlbHNlCisvKiBIb3N0IEdDQ3Mgb2xkZXIgdGhhbiAzLjAgd2VyZW4ndCBzdXBwb3J0aW5nIEludGVsIGFzbSBzeW50YXgKKyAgIG5vciBhbHRlcm5hdGl2ZXMgaW4gaTM4NiBjb2RlLiAgKi8KKyNkZWZpbmUgX19jcHVpZChsZXZlbCwgYSwgYiwgYywgZCkJCQlcCisgIF9fYXNtX18gKCJ4Y2hnbFx0JSVlYngsICVrMVxuXHQiCQkJXAorCSAgICJjcHVpZFxuXHQiCQkJCQlcCisJICAgInhjaGdsXHQlJWVieCwgJWsxXG5cdCIJCQlcCisJICAgOiAiPWEiIChhKSwgIj0mciIgKGIpLCAiPWMiIChjKSwgIj1kIiAoZCkJXAorCSAgIDogIjAiIChsZXZlbCkpCisKKyNkZWZpbmUgX19jcHVpZF9jb3VudChsZXZlbCwgY291bnQsIGEsIGIsIGMsIGQpCQlcCisgIF9fYXNtX18gKCJ4Y2hnbFx0JSVlYngsICVrMVxuXHQiCQkJXAorCSAgICJjcHVpZFxuXHQiCQkJCQlcCisJICAgInhjaGdsXHQlJWVieCwgJWsxXG5cdCIJCQlcCisJICAgOiAiPWEiIChhKSwgIj0mciIgKGIpLCAiPWMiIChjKSwgIj1kIiAoZCkJXAorCSAgIDogIjAiIChsZXZlbCksICIyIiAoY291bnQpKQorI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmIChkZWZpbmVkKF9fY29kZV9tb2RlbF9tZWRpdW1fXykgfHwgZGVmaW5lZChfX2NvZGVfbW9kZWxfbGFyZ2VfXykpICYmIGRlZmluZWQoX19QSUNfXykKKy8qICVyYnggbWF5IGJlIHRoZSBQSUMgcmVnaXN0ZXIuICAqLworI2RlZmluZSBfX2NwdWlkKGxldmVsLCBhLCBiLCBjLCBkKQkJCVwKKyAgX19hc21fXyAoInhjaGd7cX1cdHslJX1yYngsICVxMVxuXHQiCQkJXAorCSAgICJjcHVpZFxuXHQiCQkJCQlcCisJICAgInhjaGd7cX1cdHslJX1yYngsICVxMVxuXHQiCQkJXAorCSAgIDogIj1hIiAoYSksICI9JnIiIChiKSwgIj1jIiAoYyksICI9ZCIgKGQpCVwKKwkgICA6ICIwIiAobGV2ZWwpKQorCisjZGVmaW5lIF9fY3B1aWRfY291bnQobGV2ZWwsIGNvdW50LCBhLCBiLCBjLCBkKQkJXAorICBfX2FzbV9fICgieGNoZ3txfVx0eyUlfXJieCwgJXExXG5cdCIJCQlcCisJICAgImNwdWlkXG5cdCIJCQkJCVwKKwkgICAieGNoZ3txfVx0eyUlfXJieCwgJXExXG5cdCIJCQlcCisJICAgOiAiPWEiIChhKSwgIj0mciIgKGIpLCAiPWMiIChjKSwgIj1kIiAoZCkJXAorCSAgIDogIjAiIChsZXZlbCksICIyIiAoY291bnQpKQorI2Vsc2UKKyNkZWZpbmUgX19jcHVpZChsZXZlbCwgYSwgYiwgYywgZCkJCQlcCisgIF9fYXNtX18gKCJjcHVpZFxuXHQiCQkJCQlcCisJICAgOiAiPWEiIChhKSwgIj1iIiAoYiksICI9YyIgKGMpLCAiPWQiIChkKQlcCisJICAgOiAiMCIgKGxldmVsKSkKKworI2RlZmluZSBfX2NwdWlkX2NvdW50KGxldmVsLCBjb3VudCwgYSwgYiwgYywgZCkJCVwKKyAgX19hc21fXyAoImNwdWlkXG5cdCIJCQkJCVwKKwkgICA6ICI9YSIgKGEpLCAiPWIiIChiKSwgIj1jIiAoYyksICI9ZCIgKGQpCVwKKwkgICA6ICIwIiAobGV2ZWwpLCAiMiIgKGNvdW50KSkKKyNlbmRpZgorCisvKiBSZXR1cm4gaGlnaGVzdCBzdXBwb3J0ZWQgaW5wdXQgdmFsdWUgZm9yIGNwdWlkIGluc3RydWN0aW9uLiAgZXh0IGNhbgorICAgYmUgZWl0aGVyIDB4MCBvciAweDgwMDAwMDAgdG8gcmV0dXJuIGhpZ2hlc3Qgc3VwcG9ydGVkIHZhbHVlIGZvcgorICAgYmFzaWMgb3IgZXh0ZW5kZWQgY3B1aWQgaW5mb3JtYXRpb24uICBGdW5jdGlvbiByZXR1cm5zIDAgaWYgY3B1aWQKKyAgIGlzIG5vdCBzdXBwb3J0ZWQgb3Igd2hhdGV2ZXIgY3B1aWQgcmV0dXJucyBpbiBlYXggcmVnaXN0ZXIuICBJZiBzaWcKKyAgIHBvaW50ZXIgaXMgbm9uLW51bGwsIHRoZW4gZmlyc3QgZm91ciBieXRlcyBvZiB0aGUgc2lnbmF0dXJlCisgICAoYXMgZm91bmQgaW4gZWJ4IHJlZ2lzdGVyKSBhcmUgcmV0dXJuZWQgaW4gbG9jYXRpb24gcG9pbnRlZCBieSBzaWcuICAqLworCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitfX2dldF9jcHVpZF9tYXggKHVuc2lnbmVkIGludCBfX2V4dCwgdW5zaWduZWQgaW50ICpfX3NpZykKK3sKKyAgdW5zaWduZWQgaW50IF9fZWF4LCBfX2VieCwgX19lY3gsIF9fZWR4OworCisjaWZuZGVmIF9feDg2XzY0X18KKyAgLyogU2VlIGlmIHdlIGNhbiB1c2UgY3B1aWQuICBPbiBBTUQ2NCB3ZSBhbHdheXMgY2FuLiAgKi8KKyNpZiBfX0dOVUNfXyA+PSAzCisgIF9fYXNtX18gKCJwdXNoZntsfGR9XG5cdCIKKwkgICAicHVzaGZ7bHxkfVxuXHQiCisJICAgInBvcHtsfVx0JTBcblx0IgorCSAgICJtb3Z7bH1cdHslMCwgJTF8JTEsICUwfVxuXHQiCisJICAgInhvcntsfVx0eyUyLCAlMHwlMCwgJTJ9XG5cdCIKKwkgICAicHVzaHtsfVx0JTBcblx0IgorCSAgICJwb3Bme2x8ZH1cblx0IgorCSAgICJwdXNoZntsfGR9XG5cdCIKKwkgICAicG9we2x9XHQlMFxuXHQiCisJICAgInBvcGZ7bHxkfVxuXHQiCisJICAgOiAiPSZyIiAoX19lYXgpLCAiPSZyIiAoX19lYngpCisJICAgOiAiaSIgKDB4MDAyMDAwMDApKTsKKyNlbHNlCisvKiBIb3N0IEdDQ3Mgb2xkZXIgdGhhbiAzLjAgd2VyZW4ndCBzdXBwb3J0aW5nIEludGVsIGFzbSBzeW50YXgKKyAgIG5vciBhbHRlcm5hdGl2ZXMgaW4gaTM4NiBjb2RlLiAgKi8KKyAgX19hc21fXyAoInB1c2hmbFxuXHQiCisJICAgInB1c2hmbFxuXHQiCisJICAgInBvcGxcdCUwXG5cdCIKKwkgICAibW92bFx0JTAsICUxXG5cdCIKKwkgICAieG9ybFx0JTIsICUwXG5cdCIKKwkgICAicHVzaGxcdCUwXG5cdCIKKwkgICAicG9wZmxcblx0IgorCSAgICJwdXNoZmxcblx0IgorCSAgICJwb3BsXHQlMFxuXHQiCisJICAgInBvcGZsXG5cdCIKKwkgICA6ICI9JnIiIChfX2VheCksICI9JnIiIChfX2VieCkKKwkgICA6ICJpIiAoMHgwMDIwMDAwMCkpOworI2VuZGlmCisKKyAgaWYgKCEoKF9fZWF4IF4gX19lYngpICYgMHgwMDIwMDAwMCkpCisgICAgcmV0dXJuIDA7CisjZW5kaWYKKworICAvKiBIb3N0IHN1cHBvcnRzIGNwdWlkLiAgUmV0dXJuIGhpZ2hlc3Qgc3VwcG9ydGVkIGNwdWlkIGlucHV0IHZhbHVlLiAgKi8KKyAgX19jcHVpZCAoX19leHQsIF9fZWF4LCBfX2VieCwgX19lY3gsIF9fZWR4KTsKKworICBpZiAoX19zaWcpCisgICAgKl9fc2lnID0gX19lYng7CisKKyAgcmV0dXJuIF9fZWF4OworfQorCisvKiBSZXR1cm4gY3B1aWQgZGF0YSBmb3IgcmVxdWVzdGVkIGNwdWlkIGxldmVsLCBhcyBmb3VuZCBpbiByZXR1cm5lZAorICAgZWF4LCBlYngsIGVjeCBhbmQgZWR4IHJlZ2lzdGVycy4gIFRoZSBmdW5jdGlvbiBjaGVja3MgaWYgY3B1aWQgaXMKKyAgIHN1cHBvcnRlZCBhbmQgcmV0dXJucyAxIGZvciB2YWxpZCBjcHVpZCBpbmZvcm1hdGlvbiBvciAwIGZvcgorICAgdW5zdXBwb3J0ZWQgY3B1aWQgbGV2ZWwuICBBbGwgcG9pbnRlcnMgYXJlIHJlcXVpcmVkIHRvIGJlIG5vbi1udWxsLiAgKi8KKworc3RhdGljIF9faW5saW5lIGludAorX19nZXRfY3B1aWQgKHVuc2lnbmVkIGludCBfX2xldmVsLAorCSAgICAgdW5zaWduZWQgaW50ICpfX2VheCwgdW5zaWduZWQgaW50ICpfX2VieCwKKwkgICAgIHVuc2lnbmVkIGludCAqX19lY3gsIHVuc2lnbmVkIGludCAqX19lZHgpCit7CisgIHVuc2lnbmVkIGludCBfX2V4dCA9IF9fbGV2ZWwgJiAweDgwMDAwMDAwOworCisgIGlmIChfX2dldF9jcHVpZF9tYXggKF9fZXh0LCAwKSA8IF9fbGV2ZWwpCisgICAgcmV0dXJuIDA7CisKKyAgX19jcHVpZCAoX19sZXZlbCwgKl9fZWF4LCAqX19lYngsICpfX2VjeCwgKl9fZWR4KTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9jcm9zcy1zdGRhcmcuaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2Nyb3NzLXN0ZGFyZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MzRjZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9jcm9zcy1zdGRhcmcuaApAQCAtMCwwICsxLDcyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfX0NST1NTX1NUREFSR19IX0lOQ0xVREVECisjZGVmaW5lIF9fQ1JPU1NfU1REQVJHX0hfSU5DTFVERUQKKworLyogTWFrZSBzdXJlIHRoYXQgZm9yIG5vbiB4NjQgdGFyZ2V0cyBjcm9zcyBidWlsdGlucyBhcmUgZGVmaW5lZC4gICovCisjaWZuZGVmIF9feDg2XzY0X18KKy8qIENhbGwgYWJpIG1zX2FiaS4gICovCisjZGVmaW5lIF9fYnVpbHRpbl9tc192YV9saXN0IF9fYnVpbHRpbl92YV9saXN0CisjZGVmaW5lIF9fYnVpbHRpbl9tc192YV9jb3B5IF9fYnVpbHRpbl92YV9jb3B5CisjZGVmaW5lIF9fYnVpbHRpbl9tc192YV9zdGFydCBfX2J1aWx0aW5fdmFfc3RhcnQKKyNkZWZpbmUgX19idWlsdGluX21zX3ZhX2VuZCBfX2J1aWx0aW5fdmFfZW5kCisKKy8qIENhbGwgYWJpIHN5c3ZfYWJpLiAgKi8KKyNkZWZpbmUgX19idWlsdGluX3N5c3ZfdmFfbGlzdCBfX2J1aWx0aW5fdmFfbGlzdAorI2RlZmluZSBfX2J1aWx0aW5fc3lzdl92YV9jb3B5IF9fYnVpbHRpbl92YV9jb3B5CisjZGVmaW5lIF9fYnVpbHRpbl9zeXN2X3ZhX3N0YXJ0IF9fYnVpbHRpbl92YV9zdGFydAorI2RlZmluZSBfX2J1aWx0aW5fc3lzdl92YV9lbmQgX19idWlsdGluX3ZhX2VuZAorI2VuZGlmCisKKyNkZWZpbmUgX19tc192YV9jb3B5KF9fZCxfX3MpIF9fYnVpbHRpbl9tc192YV9jb3B5KF9fZCxfX3MpCisjZGVmaW5lIF9fbXNfdmFfc3RhcnQoX192LF9fbCkgX19idWlsdGluX21zX3ZhX3N0YXJ0KF9fdixfX2wpCisjZGVmaW5lIF9fbXNfdmFfYXJnKF9fdixfX2wpCV9fYnVpbHRpbl92YV9hcmcoX192LF9fbCkKKyNkZWZpbmUgX19tc192YV9lbmQoX192KSBfX2J1aWx0aW5fbXNfdmFfZW5kKF9fdikKKworI2RlZmluZSBfX3N5c3ZfdmFfY29weShfX2QsX19zKSBfX2J1aWx0aW5fc3lzdl92YV9jb3B5KF9fZCxfX3MpCisjZGVmaW5lIF9fc3lzdl92YV9zdGFydChfX3YsX19sKSBfX2J1aWx0aW5fc3lzdl92YV9zdGFydChfX3YsX19sKQorI2RlZmluZSBfX3N5c3ZfdmFfYXJnKF9fdixfX2wpCV9fYnVpbHRpbl92YV9hcmcoX192LF9fbCkKKyNkZWZpbmUgX19zeXN2X3ZhX2VuZChfX3YpIF9fYnVpbHRpbl9zeXN2X3ZhX2VuZChfX3YpCisKKyNpZm5kZWYgX19HTlVDX1NZU1ZfVkFfTElTVAorI2RlZmluZSBfX0dOVUNfU1lTVl9WQV9MSVNUCisgIHR5cGVkZWYgX19idWlsdGluX3N5c3ZfdmFfbGlzdCBfX2dudWNfc3lzdl92YV9saXN0OworI2VuZGlmCisKKyNpZm5kZWYgX1NZU1ZfVkFfTElTVF9ERUZJTkVECisjZGVmaW5lIF9TWVNWX1ZBX0xJU1RfREVGSU5FRAorICB0eXBlZGVmIF9fZ251Y19zeXN2X3ZhX2xpc3Qgc3lzdl92YV9saXN0OworI2VuZGlmCisKKyNpZm5kZWYgX19HTlVDX01TX1ZBX0xJU1QKKyNkZWZpbmUgX19HTlVDX01TX1ZBX0xJU1QKKyAgdHlwZWRlZiBfX2J1aWx0aW5fbXNfdmFfbGlzdCBfX2dudWNfbXNfdmFfbGlzdDsKKyNlbmRpZgorCisjaWZuZGVmIF9NU19WQV9MSVNUX0RFRklORUQKKyNkZWZpbmUgX01TX1ZBX0xJU1RfREVGSU5FRAorICB0eXBlZGVmIF9fZ251Y19tc192YV9saXN0IG1zX3ZhX2xpc3Q7CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQ1JPU1NfU1REQVJHX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2VtbWludHJpbi5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvZW1taW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y0MDRhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2VtbWludHJpbi5oCkBAIC0wLDAgKzEsMTUyMCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAzLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIEltcGxlbWVudGVkIGZyb20gdGhlIHNwZWNpZmljYXRpb24gaW5jbHVkZWQgaW4gdGhlIEludGVsIEMrKyBDb21waWxlcgorICAgVXNlciBHdWlkZSBhbmQgUmVmZXJlbmNlLCB2ZXJzaW9uIDkuMC4gICovCisKKyNpZm5kZWYgX0VNTUlOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9FTU1JTlRSSU5fSF9JTkNMVURFRAorCisjaWZuZGVmIF9fU1NFMl9fCisjIGVycm9yICJTU0UyIGluc3RydWN0aW9uIHNldCBub3QgZW5hYmxlZCIKKyNlbHNlCisKKy8qIFdlIG5lZWQgZGVmaW5pdGlvbnMgZnJvbSB0aGUgU1NFIGhlYWRlciBmaWxlcyovCisjaW5jbHVkZSA8eG1taW50cmluLmg+CisKKy8qIFNTRTIgKi8KK3R5cGVkZWYgZG91YmxlIF9fdjJkZiBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgxNikpKTsKK3R5cGVkZWYgbG9uZyBsb25nIF9fdjJkaSBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgxNikpKTsKK3R5cGVkZWYgaW50IF9fdjRzaSBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgxNikpKTsKK3R5cGVkZWYgc2hvcnQgX192OGhpIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDE2KSkpOwordHlwZWRlZiBjaGFyIF9fdjE2cWkgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMTYpKSk7CisKKy8qIFRoZSBJbnRlbCBBUEkgaXMgZmxleGlibGUgZW5vdWdoIHRoYXQgd2UgbXVzdCBhbGxvdyBhbGlhc2luZyB3aXRoIG90aGVyCisgICB2ZWN0b3IgdHlwZXMsIGFuZCB0aGVpciBzY2FsYXIgY29tcG9uZW50cy4gICovCit0eXBlZGVmIGxvbmcgbG9uZyBfX20xMjhpIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDE2KSwgX19tYXlfYWxpYXNfXykpOwordHlwZWRlZiBkb3VibGUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgxNiksIF9fbWF5X2FsaWFzX18pKTsKKworLyogQ3JlYXRlIGEgc2VsZWN0b3IgZm9yIHVzZSB3aXRoIHRoZSBTSFVGUEQgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBfTU1fU0hVRkZMRTIoZnAxLGZwMCkgXAorICgoKGZwMSkgPDwgMSkgfCAoZnAwKSkKKworLyogQ3JlYXRlIGEgdmVjdG9yIHdpdGggZWxlbWVudCAwIGFzIEYgYW5kIHRoZSByZXN0IHplcm8uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0X3NkIChkb3VibGUgX19GKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMTI4ZCl7IF9fRiwgMC4wIH07Cit9CisKKy8qIENyZWF0ZSBhIHZlY3RvciB3aXRoIGJvdGggZWxlbWVudHMgZXF1YWwgdG8gRi4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXQxX3BkIChkb3VibGUgX19GKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMTI4ZCl7IF9fRiwgX19GIH07Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldF9wZDEgKGRvdWJsZSBfX0YpCit7CisgIHJldHVybiBfbW1fc2V0MV9wZCAoX19GKTsKK30KKworLyogQ3JlYXRlIGEgdmVjdG9yIHdpdGggdGhlIGxvd2VyIHZhbHVlIFggYW5kIHVwcGVyIHZhbHVlIFcuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0X3BkIChkb3VibGUgX19XLCBkb3VibGUgX19YKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMTI4ZCl7IF9fWCwgX19XIH07Cit9CisKKy8qIENyZWF0ZSBhIHZlY3RvciB3aXRoIHRoZSBsb3dlciB2YWx1ZSBXIGFuZCB1cHBlciB2YWx1ZSBYLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldHJfcGQgKGRvdWJsZSBfX1csIGRvdWJsZSBfX1gpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20xMjhkKXsgX19XLCBfX1ggfTsKK30KKworLyogQ3JlYXRlIGEgdmVjdG9yIG9mIHplcm9zLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldHplcm9fcGQgKHZvaWQpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20xMjhkKXsgMC4wLCAwLjAgfTsKK30KKworLyogU2V0cyB0aGUgbG93IERQRlAgdmFsdWUgb2YgQSBmcm9tIHRoZSBsb3cgdmFsdWUgb2YgQi4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tb3ZlX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfbW92c2QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKKy8qIExvYWQgdHdvIERQRlAgdmFsdWVzIGZyb20gUC4gIFRoZSBhZGRyZXNzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xvYWRfcGQgKGRvdWJsZSBjb25zdCAqX19QKQoreworICByZXR1cm4gKihfX20xMjhkICopX19QOworfQorCisvKiBMb2FkIHR3byBEUEZQIHZhbHVlcyBmcm9tIFAuICBUaGUgYWRkcmVzcyBuZWVkIG5vdCBiZSAxNi1ieXRlIGFsaWduZWQuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbG9hZHVfcGQgKGRvdWJsZSBjb25zdCAqX19QKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfbG9hZHVwZCAoX19QKTsKK30KKworLyogQ3JlYXRlIGEgdmVjdG9yIHdpdGggYWxsIHR3byBlbGVtZW50cyBlcXVhbCB0byAqUC4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sb2FkMV9wZCAoZG91YmxlIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiBfbW1fc2V0MV9wZCAoKl9fUCk7Cit9CisKKy8qIENyZWF0ZSBhIHZlY3RvciB3aXRoIGVsZW1lbnQgMCBhcyAqUCBhbmQgdGhlIHJlc3QgemVyby4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sb2FkX3NkIChkb3VibGUgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIF9tbV9zZXRfc2QgKCpfX1ApOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sb2FkX3BkMSAoZG91YmxlIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiBfbW1fbG9hZDFfcGQgKF9fUCk7Cit9CisKKy8qIExvYWQgdHdvIERQRlAgdmFsdWVzIGluIHJldmVyc2Ugb3JkZXIuICBUaGUgYWRkcmVzcyBtdXN0IGJlIGFsaWduZWQuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbG9hZHJfcGQgKGRvdWJsZSBjb25zdCAqX19QKQoreworICBfX20xMjhkIF9fdG1wID0gX21tX2xvYWRfcGQgKF9fUCk7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9zaHVmcGQgKF9fdG1wLCBfX3RtcCwgX01NX1NIVUZGTEUyICgwLDEpKTsKK30KKworLyogU3RvcmUgdHdvIERQRlAgdmFsdWVzLiAgVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmVfcGQgKGRvdWJsZSAqX19QLCBfX20xMjhkIF9fQSkKK3sKKyAgKihfX20xMjhkICopX19QID0gX19BOworfQorCisvKiBTdG9yZSB0d28gRFBGUCB2YWx1ZXMuICBUaGUgYWRkcmVzcyBuZWVkIG5vdCBiZSAxNi1ieXRlIGFsaWduZWQuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmV1X3BkIChkb3VibGUgKl9fUCwgX19tMTI4ZCBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3N0b3JldXBkIChfX1AsIF9fQSk7Cit9CisKKy8qIFN0b3JlcyB0aGUgbG93ZXIgRFBGUCB2YWx1ZS4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZV9zZCAoZG91YmxlICpfX1AsIF9fbTEyOGQgX19BKQoreworICAqX19QID0gX19idWlsdGluX2lhMzJfdmVjX2V4dF92MmRmIChfX0EsIDApOworfQorCitleHRlcm4gX19pbmxpbmUgZG91YmxlIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNkX2Y2NCAoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3YyZGYgKF9fQSwgMCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0b3JlbF9wZCAoZG91YmxlICpfX1AsIF9fbTEyOGQgX19BKQoreworICBfbW1fc3RvcmVfc2QgKF9fUCwgX19BKTsKK30KKworLyogU3RvcmVzIHRoZSB1cHBlciBEUEZQIHZhbHVlLiAgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0b3JlaF9wZCAoZG91YmxlICpfX1AsIF9fbTEyOGQgX19BKQoreworICAqX19QID0gX19idWlsdGluX2lhMzJfdmVjX2V4dF92MmRmIChfX0EsIDEpOworfQorCisvKiBTdG9yZSB0aGUgbG93ZXIgRFBGUCB2YWx1ZSBhY3Jvc3MgdHdvIHdvcmRzLgorICAgVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmUxX3BkIChkb3VibGUgKl9fUCwgX19tMTI4ZCBfX0EpCit7CisgIF9tbV9zdG9yZV9wZCAoX19QLCBfX2J1aWx0aW5faWEzMl9zaHVmcGQgKF9fQSwgX19BLCBfTU1fU0hVRkZMRTIgKDAsMCkpKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmVfcGQxIChkb3VibGUgKl9fUCwgX19tMTI4ZCBfX0EpCit7CisgIF9tbV9zdG9yZTFfcGQgKF9fUCwgX19BKTsKK30KKworLyogU3RvcmUgdHdvIERQRlAgdmFsdWVzIGluIHJldmVyc2Ugb3JkZXIuICBUaGUgYWRkcmVzcyBtdXN0IGJlIGFsaWduZWQuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmVyX3BkIChkb3VibGUgKl9fUCwgX19tMTI4ZCBfX0EpCit7CisgIF9tbV9zdG9yZV9wZCAoX19QLCBfX2J1aWx0aW5faWEzMl9zaHVmcGQgKF9fQSwgX19BLCBfTU1fU0hVRkZMRTIgKDAsMSkpKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzaTEyOF9zaTMyIChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjRzaSAoKF9fdjRzaSlfX0EsIDApOworfQorCisjaWZkZWYgX194ODZfNjRfXworLyogSW50ZWwgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2kxMjhfc2k2NCAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3YyZGkgKChfX3YyZGkpX19BLCAwKTsKK30KKworLyogTWljcm9zb2Z0IGludHJpbnNpYy4gICovCitleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNpMTI4X3NpNjR4IChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjJkaSAoKF9fdjJkaSlfX0EsIDApOworfQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZF9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfYWRkcGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZF9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfYWRkc2QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1Yl9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfc3VicGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1Yl9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfc3Vic2QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX211bF9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfbXVscGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX211bF9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfbXVsc2QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Rpdl9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfZGl2cGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Rpdl9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfZGl2c2QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NxcnRfcGQgKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfc3FydHBkICgoX192MmRmKV9fQSk7Cit9CisKKy8qIFJldHVybiBwYWlyIHtzcXJ0IChBWzApLCBCWzFdfS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcXJ0X3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIF9fdjJkZiBfX3RtcCA9IF9fYnVpbHRpbl9pYTMyX21vdnNkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfc3FydHNkICgoX192MmRmKV9fdG1wKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWluX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9taW5wZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWluX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9taW5zZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWF4X3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9tYXhwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWF4X3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9tYXhzZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYW5kX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9hbmRwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYW5kbm90X3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9hbmRucGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX29yX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9vcnBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV94b3JfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3hvcnBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBlcV9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wZXFwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbHRfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcGx0cGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGxlX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBsZXBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBndF9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wZ3RwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZ2VfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcGdlcGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcG5lcV9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wbmVxcGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcG5sdF9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wbmx0cGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcG5sZV9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wbmxlcGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcG5ndF9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wbmd0cGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcG5nZV9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wbmdlcGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcG9yZF9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wb3JkcGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcHVub3JkX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXB1bm9yZHBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBlcV9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wZXFzZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbHRfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcGx0c2QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGxlX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBsZXNkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBndF9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX21vdnNkICgoX192MmRmKSBfX0EsCisJCQkJCSAoX192MmRmKQorCQkJCQkgX19idWlsdGluX2lhMzJfY21wbHRzZCAoKF9fdjJkZikgX19CLAorCQkJCQkJCQkgKF9fdjJkZikKKwkJCQkJCQkJIF9fQSkpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBnZV9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX21vdnNkICgoX192MmRmKSBfX0EsCisJCQkJCSAoX192MmRmKQorCQkJCQkgX19idWlsdGluX2lhMzJfY21wbGVzZCAoKF9fdjJkZikgX19CLAorCQkJCQkJCQkgKF9fdjJkZikKKwkJCQkJCQkJIF9fQSkpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBuZXFfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcG5lcXNkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBubHRfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcG5sdHNkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBubGVfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcG5sZXNkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBuZ3Rfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9tb3ZzZCAoKF9fdjJkZikgX19BLAorCQkJCQkgKF9fdjJkZikKKwkJCQkJIF9fYnVpbHRpbl9pYTMyX2NtcG5sdHNkICgoX192MmRmKSBfX0IsCisJCQkJCQkJCSAgKF9fdjJkZikKKwkJCQkJCQkJICBfX0EpKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmdlX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfbW92c2QgKChfX3YyZGYpIF9fQSwKKwkJCQkJIChfX3YyZGYpCisJCQkJCSBfX2J1aWx0aW5faWEzMl9jbXBubGVzZCAoKF9fdjJkZikgX19CLAorCQkJCQkJCQkgIChfX3YyZGYpCisJCQkJCQkJCSAgX19BKSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcG9yZF9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wb3Jkc2QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcHVub3JkX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXB1bm9yZHNkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWllcV9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY29taXNkZXEgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29taWx0X3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jb21pc2RsdCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21pbGVfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NvbWlzZGxlICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWlndF9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY29taXNkZ3QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29taWdlX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jb21pc2RnZSAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21pbmVxX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jb21pc2RuZXEgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdWNvbWllcV9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdWNvbWlzZGVxICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Vjb21pbHRfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Vjb21pc2RsdCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91Y29taWxlX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl91Y29taXNkbGUgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdWNvbWlndF9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdWNvbWlzZGd0ICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Vjb21pZ2Vfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Vjb21pc2RnZSAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91Y29taW5lcV9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdWNvbWlzZG5lcSAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworLyogQ3JlYXRlIGEgdmVjdG9yIG9mIFFpLCB3aGVyZSBpIGlzIHRoZSBlbGVtZW50IG51bWJlci4gICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldF9lcGk2NHggKGxvbmcgbG9uZyBfX3ExLCBsb25nIGxvbmcgX19xMCkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTEyOGkpKF9fdjJkaSl7IF9fcTAsIF9fcTEgfTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0X2VwaTY0IChfX202NCBfX3ExLCAgX19tNjQgX19xMCkKK3sKKyAgcmV0dXJuIF9tbV9zZXRfZXBpNjR4ICgobG9uZyBsb25nKV9fcTEsIChsb25nIGxvbmcpX19xMCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldF9lcGkzMiAoaW50IF9fcTMsIGludCBfX3EyLCBpbnQgX19xMSwgaW50IF9fcTApCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20xMjhpKShfX3Y0c2kpeyBfX3EwLCBfX3ExLCBfX3EyLCBfX3EzIH07Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldF9lcGkxNiAoc2hvcnQgX19xNywgc2hvcnQgX19xNiwgc2hvcnQgX19xNSwgc2hvcnQgX19xNCwKKwkgICAgICAgc2hvcnQgX19xMywgc2hvcnQgX19xMiwgc2hvcnQgX19xMSwgc2hvcnQgX19xMCkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTEyOGkpKF9fdjhoaSl7CisgICAgX19xMCwgX19xMSwgX19xMiwgX19xMywgX19xNCwgX19xNSwgX19xNiwgX19xNyB9OworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRfZXBpOCAoY2hhciBfX3ExNSwgY2hhciBfX3ExNCwgY2hhciBfX3ExMywgY2hhciBfX3ExMiwKKwkgICAgICBjaGFyIF9fcTExLCBjaGFyIF9fcTEwLCBjaGFyIF9fcTA5LCBjaGFyIF9fcTA4LAorCSAgICAgIGNoYXIgX19xMDcsIGNoYXIgX19xMDYsIGNoYXIgX19xMDUsIGNoYXIgX19xMDQsCisJICAgICAgY2hhciBfX3EwMywgY2hhciBfX3EwMiwgY2hhciBfX3EwMSwgY2hhciBfX3EwMCkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTEyOGkpKF9fdjE2cWkpeworICAgIF9fcTAwLCBfX3EwMSwgX19xMDIsIF9fcTAzLCBfX3EwNCwgX19xMDUsIF9fcTA2LCBfX3EwNywKKyAgICBfX3EwOCwgX19xMDksIF9fcTEwLCBfX3ExMSwgX19xMTIsIF9fcTEzLCBfX3ExNCwgX19xMTUKKyAgfTsKK30KKworLyogU2V0IGFsbCBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIHZlY3RvciB0byBBLiAgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0MV9lcGk2NHggKGxvbmcgbG9uZyBfX0EpCit7CisgIHJldHVybiBfbW1fc2V0X2VwaTY0eCAoX19BLCBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXQxX2VwaTY0IChfX202NCBfX0EpCit7CisgIHJldHVybiBfbW1fc2V0X2VwaTY0IChfX0EsIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldDFfZXBpMzIgKGludCBfX0EpCit7CisgIHJldHVybiBfbW1fc2V0X2VwaTMyIChfX0EsIF9fQSwgX19BLCBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXQxX2VwaTE2IChzaG9ydCBfX0EpCit7CisgIHJldHVybiBfbW1fc2V0X2VwaTE2IChfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldDFfZXBpOCAoY2hhciBfX0EpCit7CisgIHJldHVybiBfbW1fc2V0X2VwaTggKF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLAorCQkgICAgICAgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EpOworfQorCisvKiBDcmVhdGUgYSB2ZWN0b3Igb2YgUWksIHdoZXJlIGkgaXMgdGhlIGVsZW1lbnQgbnVtYmVyLgorICAgVGhlIHBhcmFtZXRlciBvcmRlciBpcyByZXZlcnNlZCBmcm9tIHRoZSBfbW1fc2V0X2VwaSogZnVuY3Rpb25zLiAgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0cl9lcGk2NCAoX19tNjQgX19xMCwgX19tNjQgX19xMSkKK3sKKyAgcmV0dXJuIF9tbV9zZXRfZXBpNjQgKF9fcTEsIF9fcTApOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRyX2VwaTMyIChpbnQgX19xMCwgaW50IF9fcTEsIGludCBfX3EyLCBpbnQgX19xMykKK3sKKyAgcmV0dXJuIF9tbV9zZXRfZXBpMzIgKF9fcTMsIF9fcTIsIF9fcTEsIF9fcTApOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRyX2VwaTE2IChzaG9ydCBfX3EwLCBzaG9ydCBfX3ExLCBzaG9ydCBfX3EyLCBzaG9ydCBfX3EzLAorCSAgICAgICAgc2hvcnQgX19xNCwgc2hvcnQgX19xNSwgc2hvcnQgX19xNiwgc2hvcnQgX19xNykKK3sKKyAgcmV0dXJuIF9tbV9zZXRfZXBpMTYgKF9fcTcsIF9fcTYsIF9fcTUsIF9fcTQsIF9fcTMsIF9fcTIsIF9fcTEsIF9fcTApOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRyX2VwaTggKGNoYXIgX19xMDAsIGNoYXIgX19xMDEsIGNoYXIgX19xMDIsIGNoYXIgX19xMDMsCisJICAgICAgIGNoYXIgX19xMDQsIGNoYXIgX19xMDUsIGNoYXIgX19xMDYsIGNoYXIgX19xMDcsCisJICAgICAgIGNoYXIgX19xMDgsIGNoYXIgX19xMDksIGNoYXIgX19xMTAsIGNoYXIgX19xMTEsCisJICAgICAgIGNoYXIgX19xMTIsIGNoYXIgX19xMTMsIGNoYXIgX19xMTQsIGNoYXIgX19xMTUpCit7CisgIHJldHVybiBfbW1fc2V0X2VwaTggKF9fcTE1LCBfX3ExNCwgX19xMTMsIF9fcTEyLCBfX3ExMSwgX19xMTAsIF9fcTA5LCBfX3EwOCwKKwkJICAgICAgIF9fcTA3LCBfX3EwNiwgX19xMDUsIF9fcTA0LCBfX3EwMywgX19xMDIsIF9fcTAxLCBfX3EwMCk7Cit9CisKKy8qIENyZWF0ZSBhIHZlY3RvciB3aXRoIGVsZW1lbnQgMCBhcyAqUCBhbmQgdGhlIHJlc3QgemVyby4gICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xvYWRfc2kxMjggKF9fbTEyOGkgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuICpfX1A7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xvYWR1X3NpMTI4IChfX20xMjhpIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfbG9hZGRxdSAoKGNoYXIgY29uc3QgKilfX1ApOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sb2FkbF9lcGk2NCAoX19tMTI4aSBjb25zdCAqX19QKQoreworICByZXR1cm4gX21tX3NldF9lcGk2NCAoKF9fbTY0KTBMTCwgKihfX202NCAqKV9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0b3JlX3NpMTI4IChfX20xMjhpICpfX1AsIF9fbTEyOGkgX19CKQoreworICAqX19QID0gX19COworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZXVfc2kxMjggKF9fbTEyOGkgKl9fUCwgX19tMTI4aSBfX0IpCit7CisgIF9fYnVpbHRpbl9pYTMyX3N0b3JlZHF1ICgoY2hhciAqKV9fUCwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmVsX2VwaTY0IChfX20xMjhpICpfX1AsIF9fbTEyOGkgX19CKQoreworICAqKGxvbmcgbG9uZyAqKV9fUCA9IF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjJkaSAoKF9fdjJkaSlfX0IsIDApOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbW92ZXBpNjRfcGk2NCAoX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjJkaSAoKF9fdjJkaSlfX0IsIDApOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tb3ZwaTY0X2VwaTY0IChfX202NCBfX0EpCit7CisgIHJldHVybiBfbW1fc2V0X2VwaTY0ICgoX19tNjQpMExMLCBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tb3ZlX2VwaTY0IChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX21vdnExMjggKChfX3YyZGkpIF9fQSk7Cit9CisKKy8qIENyZWF0ZSBhIHZlY3RvciBvZiB6ZXJvcy4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXR6ZXJvX3NpMTI4ICh2b2lkKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMTI4aSkoX192NHNpKXsgMCwgMCwgMCwgMCB9OworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRlcGkzMl9wZCAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jdnRkcTJwZCAoKF9fdjRzaSkgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRlcGkzMl9wcyAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2N2dGRxMnBzICgoX192NHNpKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRwZF9lcGkzMiAoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9jdnRwZDJkcSAoKF9fdjJkZikgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHBkX3BpMzIgKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX2N2dHBkMnBpICgoX192MmRmKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHBkX3BzIChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfY3Z0cGQycHMgKChfX3YyZGYpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHRwZF9lcGkzMiAoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9jdnR0cGQyZHEgKChfX3YyZGYpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnR0cGRfcGkzMiAoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfY3Z0dHBkMnBpICgoX192MmRmKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRwaTMyX3BkIChfX202NCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jdnRwaTJwZCAoKF9fdjJzaSkgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0cHNfZXBpMzIgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9jdnRwczJkcSAoKF9fdjRzZikgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0dHBzX2VwaTMyIChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfY3Z0dHBzMmRxICgoX192NHNmKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRwc19wZCAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2N2dHBzMnBkICgoX192NHNmKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNkX3NpMzIgKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3Z0c2Qyc2kgKChfX3YyZGYpIF9fQSk7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCisvKiBJbnRlbCBpbnRyaW5zaWMuICAqLworZXh0ZXJuIF9faW5saW5lIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzZF9zaTY0IChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2N2dHNkMnNpNjQgKChfX3YyZGYpIF9fQSk7Cit9CisKKy8qIE1pY3Jvc29mdCBpbnRyaW5zaWMuICAqLworZXh0ZXJuIF9faW5saW5lIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzZF9zaTY0eCAoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jdnRzZDJzaTY0ICgoX192MmRmKSBfX0EpOworfQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0dHNkX3NpMzIgKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3Z0dHNkMnNpICgoX192MmRmKSBfX0EpOworfQorCisjaWZkZWYgX194ODZfNjRfXworLyogSW50ZWwgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0dHNkX3NpNjQgKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3Z0dHNkMnNpNjQgKChfX3YyZGYpIF9fQSk7Cit9CisKKy8qIE1pY3Jvc29mdCBpbnRyaW5zaWMuICAqLworZXh0ZXJuIF9faW5saW5lIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnR0c2Rfc2k2NHggKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3Z0dHNkMnNpNjQgKChfX3YyZGYpIF9fQSk7Cit9CisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzZF9zcyAoX19tMTI4IF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2N2dHNkMnNzICgoX192NHNmKSBfX0EsIChfX3YyZGYpIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNpMzJfc2QgKF9fbTEyOGQgX19BLCBpbnQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY3Z0c2kyc2QgKChfX3YyZGYpIF9fQSwgX19CKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KKy8qIEludGVsIGludHJpbnNpYy4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzaTY0X3NkIChfX20xMjhkIF9fQSwgbG9uZyBsb25nIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2N2dHNpNjQyc2QgKChfX3YyZGYpIF9fQSwgX19CKTsKK30KKworLyogTWljcm9zb2Z0IGludHJpbnNpYy4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzaTY0eF9zZCAoX19tMTI4ZCBfX0EsIGxvbmcgbG9uZyBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jdnRzaTY0MnNkICgoX192MmRmKSBfX0EsIF9fQik7Cit9CisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c3Nfc2QgKF9fbTEyOGQgX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY3Z0c3Myc2QgKChfX3YyZGYpIF9fQSwgKF9fdjRzZilfX0IpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaHVmZmxlX3BkKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgY29uc3QgaW50IF9fbWFzaykKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3NodWZwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLCBfX21hc2spOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX3NodWZmbGVfcGQoQSwgQiwgTikJCQkJCQlcCisgICgoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9zaHVmcGQgKChfX3YyZGYpKF9fbTEyOGQpKEEpLAkJXAorCQkJCSAgIChfX3YyZGYpKF9fbTEyOGQpKEIpLCAoaW50KShOKSkpCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdW5wYWNraGlfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3VucGNraHBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91bnBhY2tsb19wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdW5wY2tscGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xvYWRoX3BkIChfX20xMjhkIF9fQSwgZG91YmxlIGNvbnN0ICpfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9sb2FkaHBkICgoX192MmRmKV9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbG9hZGxfcGQgKF9fbTEyOGQgX19BLCBkb3VibGUgY29uc3QgKl9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2xvYWRscGQgKChfX3YyZGYpX19BLCBfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21vdmVtYXNrX3BkIChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX21vdm1za3BkICgoX192MmRmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3BhY2tzX2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYWNrc3N3YjEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcGFja3NfZXBpMzIgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhY2tzc2R3MTI4ICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9wYWNrdXNfZXBpMTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhY2t1c3diMTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91bnBhY2toaV9lcGk4IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wdW5wY2toYncxMjggKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdW5wYWNraGlfZXBpMTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3B1bnBja2h3ZDEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdW5wYWNraGlfZXBpMzIgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3B1bnBja2hkcTEyOCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdW5wYWNraGlfZXBpNjQgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3B1bnBja2hxZHExMjggKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3VucGFja2xvX2VwaTggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3B1bnBja2xidzEyOCAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91bnBhY2tsb19lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHVucGNrbHdkMTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91bnBhY2tsb19lcGkzMiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHVucGNrbGRxMTI4ICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91bnBhY2tsb19lcGk2NCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHVucGNrbHFkcTEyOCAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWRkX2VwaTggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhZGRiMTI4ICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZF9lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGFkZHcxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZF9lcGkzMiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGFkZGQxMjggKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZF9lcGk2NCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGFkZHExMjggKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZHNfZXBpOCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGFkZHNiMTI4ICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZHNfZXBpMTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhZGRzdzEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWRkc19lcHU4IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYWRkdXNiMTI4ICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZHNfZXB1MTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhZGR1c3cxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1Yl9lcGk4IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3ViYjEyOCAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdWJfZXBpMTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzdWJ3MTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdWJfZXBpMzIgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzdWJkMTI4ICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdWJfZXBpNjQgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzdWJxMTI4ICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdWJzX2VwaTggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzdWJzYjEyOCAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdWJzX2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3Vic3cxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1YnNfZXB1OCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHN1YnVzYjEyOCAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdWJzX2VwdTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3VidXN3MTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWRkX2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wbWFkZHdkMTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tdWxoaV9lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcG11bGh3MTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tdWxsb19lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcG11bGx3MTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbXVsX3N1MzIgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BtdWx1ZHEgKChfX3Yyc2kpX19BLCAoX192MnNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX211bF9lcHUzMiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcG11bHVkcTEyOCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2xsaV9lcGkxNiAoX19tMTI4aSBfX0EsIGludCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc2xsd2kxMjggKChfX3Y4aGkpX19BLCBfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zbGxpX2VwaTMyIChfX20xMjhpIF9fQSwgaW50IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzbGxkaTEyOCAoKF9fdjRzaSlfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NsbGlfZXBpNjQgKF9fbTEyOGkgX19BLCBpbnQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNsbHFpMTI4ICgoX192MmRpKV9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JhaV9lcGkxNiAoX19tMTI4aSBfX0EsIGludCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3Jhd2kxMjggKChfX3Y4aGkpX19BLCBfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmFpX2VwaTMyIChfX20xMjhpIF9fQSwgaW50IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzcmFkaTEyOCAoKF9fdjRzaSlfX0EsIF9fQik7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NybGlfc2kxMjggKF9fbTEyOGkgX19BLCBjb25zdCBpbnQgX19OKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNybGRxaTEyOCAoX19BLCBfX04gKiA4KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2xsaV9zaTEyOCAoX19tMTI4aSBfX0EsIGNvbnN0IGludCBfX04pCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc2xsZHFpMTI4IChfX0EsIF9fTiAqIDgpOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX3NybGlfc2kxMjgoQSwgTikgXAorICAoKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNybGRxaTEyOCAoKF9fbTEyOGkpKEEpLCAoaW50KShOKSAqIDgpKQorI2RlZmluZSBfbW1fc2xsaV9zaTEyOChBLCBOKSBcCisgICgoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc2xsZHFpMTI4ICgoX19tMTI4aSkoQSksIChpbnQpKE4pICogOCkpCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JsaV9lcGkxNiAoX19tMTI4aSBfX0EsIGludCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3Jsd2kxMjggKChfX3Y4aGkpX19BLCBfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmxpX2VwaTMyIChfX20xMjhpIF9fQSwgaW50IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzcmxkaTEyOCAoKF9fdjRzaSlfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NybGlfZXBpNjQgKF9fbTEyOGkgX19BLCBpbnQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNybHFpMTI4ICgoX192MmRpKV9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2xsX2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc2xsdzEyOCgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zbGxfZXBpMzIgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzbGxkMTI4KChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NsbF9lcGk2NCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNsbHExMjgoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JhX2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3JhdzEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JhX2VwaTMyIChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3JhZDEyOCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JsX2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3JsdzEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JsX2VwaTMyIChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3JsZDEyOCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JsX2VwaTY0IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3JscTEyOCAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYW5kX3NpMTI4IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYW5kMTI4ICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hbmRub3Rfc2kxMjggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhbmRuMTI4ICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9vcl9zaTEyOCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcG9yMTI4ICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV94b3Jfc2kxMjggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3B4b3IxMjggKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGVxX2VwaTggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BjbXBlcWIxMjggKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZXFfZXBpMTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BjbXBlcXcxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGVxX2VwaTMyIChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wY21wZXFkMTI4ICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBsdF9lcGk4IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wY21wZ3RiMTI4ICgoX192MTZxaSlfX0IsIChfX3YxNnFpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGx0X2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wY21wZ3R3MTI4ICgoX192OGhpKV9fQiwgKF9fdjhoaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBsdF9lcGkzMiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGNtcGd0ZDEyOCAoKF9fdjRzaSlfX0IsIChfX3Y0c2kpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZ3RfZXBpOCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGNtcGd0YjEyOCAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBndF9lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGNtcGd0dzEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZ3RfZXBpMzIgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BjbXBndGQxMjggKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZXh0cmFjdF9lcGkxNiAoX19tMTI4aSBjb25zdCBfX0EsIGludCBjb25zdCBfX04pCit7CisgIHJldHVybiAodW5zaWduZWQgc2hvcnQpIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjhoaSAoKF9fdjhoaSlfX0EsIF9fTik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2luc2VydF9lcGkxNiAoX19tMTI4aSBjb25zdCBfX0EsIGludCBjb25zdCBfX0QsIGludCBjb25zdCBfX04pCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdmVjX3NldF92OGhpICgoX192OGhpKV9fQSwgX19ELCBfX04pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX2V4dHJhY3RfZXBpMTYoQSwgTikgXAorICAoKGludCkgKHVuc2lnbmVkIHNob3J0KSBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3Y4aGkgKChfX3Y4aGkpKF9fbTEyOGkpKEEpLCAoaW50KShOKSkpCisjZGVmaW5lIF9tbV9pbnNlcnRfZXBpMTYoQSwgRCwgTikJCQkJXAorICAoKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZlY19zZXRfdjhoaSAoKF9fdjhoaSkoX19tMTI4aSkoQSksCVwKKwkJCQkJICAoaW50KShEKSwgKGludCkoTikpKQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21heF9lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcG1heHN3MTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXhfZXB1OCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcG1heHViMTI4ICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21pbl9lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcG1pbnN3MTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9taW5fZXB1OCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcG1pbnViMTI4ICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbW92ZW1hc2tfZXBpOCAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wbW92bXNrYjEyOCAoKF9fdjE2cWkpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbXVsaGlfZXB1MTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BtdWxodXcxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NodWZmbGVoaV9lcGkxNiAoX19tMTI4aSBfX0EsIGNvbnN0IGludCBfX21hc2spCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc2h1Zmh3ICgoX192OGhpKV9fQSwgX19tYXNrKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2h1ZmZsZWxvX2VwaTE2IChfX20xMjhpIF9fQSwgY29uc3QgaW50IF9fbWFzaykKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzaHVmbHcgKChfX3Y4aGkpX19BLCBfX21hc2spOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaHVmZmxlX2VwaTMyIChfX20xMjhpIF9fQSwgY29uc3QgaW50IF9fbWFzaykKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzaHVmZCAoKF9fdjRzaSlfX0EsIF9fbWFzayk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fc2h1ZmZsZWhpX2VwaTE2KEEsIE4pIFwKKyAgKChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzaHVmaHcgKChfX3Y4aGkpKF9fbTEyOGkpKEEpLCAoaW50KShOKSkpCisjZGVmaW5lIF9tbV9zaHVmZmxlbG9fZXBpMTYoQSwgTikgXAorICAoKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNodWZsdyAoKF9fdjhoaSkoX19tMTI4aSkoQSksIChpbnQpKE4pKSkKKyNkZWZpbmUgX21tX3NodWZmbGVfZXBpMzIoQSwgTikgXAorICAoKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNodWZkICgoX192NHNpKShfX20xMjhpKShBKSwgKGludCkoTikpKQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hc2ttb3ZldV9zaTEyOCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBjaGFyICpfX0MpCit7CisgIF9fYnVpbHRpbl9pYTMyX21hc2ttb3ZkcXUgKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CLCBfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hdmdfZXB1OCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGF2Z2IxMjggKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYXZnX2VwdTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYXZndzEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2FkX2VwdTggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzYWRidzEyOCAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdHJlYW1fc2kzMiAoaW50ICpfX0EsIGludCBfX0IpCit7CisgIF9fYnVpbHRpbl9pYTMyX21vdm50aSAoX19BLCBfX0IpOworfQorCisjaWZkZWYgX194ODZfNjRfXworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RyZWFtX3NpNjQgKGxvbmcgbG9uZyBpbnQgKl9fQSwgbG9uZyBsb25nIGludCBfX0IpCit7CisgIF9fYnVpbHRpbl9pYTMyX21vdm50aTY0IChfX0EsIF9fQik7Cit9CisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RyZWFtX3NpMTI4IChfX20xMjhpICpfX0EsIF9fbTEyOGkgX19CKQoreworICBfX2J1aWx0aW5faWEzMl9tb3ZudGRxICgoX192MmRpICopX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0cmVhbV9wZCAoZG91YmxlICpfX0EsIF9fbTEyOGQgX19CKQoreworICBfX2J1aWx0aW5faWEzMl9tb3ZudHBkIChfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY2xmbHVzaCAodm9pZCBjb25zdCAqX19BKQoreworICBfX2J1aWx0aW5faWEzMl9jbGZsdXNoIChfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sZmVuY2UgKHZvaWQpCit7CisgIF9fYnVpbHRpbl9pYTMyX2xmZW5jZSAoKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWZlbmNlICh2b2lkKQoreworICBfX2J1aWx0aW5faWEzMl9tZmVuY2UgKCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNpMzJfc2kxMjggKGludCBfX0EpCit7CisgIHJldHVybiBfbW1fc2V0X2VwaTMyICgwLCAwLCAwLCBfX0EpOworfQorCisjaWZkZWYgX194ODZfNjRfXworLyogSW50ZWwgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNpNjRfc2kxMjggKGxvbmcgbG9uZyBfX0EpCit7CisgIHJldHVybiBfbW1fc2V0X2VwaTY0eCAoMCwgX19BKTsKK30KKworLyogTWljcm9zb2Z0IGludHJpbnNpYy4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzaTY0eF9zaTEyOCAobG9uZyBsb25nIF9fQSkKK3sKKyAgcmV0dXJuIF9tbV9zZXRfZXBpNjR4ICgwLCBfX0EpOworfQorI2VuZGlmCisKKy8qIENhc3RzIGJldHdlZW4gdmFyaW91cyBTUCwgRFAsIElOVCB2ZWN0b3IgdHlwZXMuICBOb3RlIHRoYXQgdGhlc2UgZG8gbm8KKyAgIGNvbnZlcnNpb24gb2YgdmFsdWVzLCB0aGV5IGp1c3QgY2hhbmdlIHRoZSB0eXBlLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY2FzdHBkX3BzKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKF9fbTEyOCkgX19BOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jYXN0cGRfc2kxMjgoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19BOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jYXN0cHNfcGQoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX0E7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Nhc3Rwc19zaTEyOChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fQTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jYXN0c2kxMjhfcHMoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4KSBfX0E7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Nhc3RzaTEyOF9wZChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX0E7Cit9CisKKyNlbmRpZiAvKiBfX1NTRTJfXyAgKi8KKworI2VuZGlmIC8qIF9FTU1JTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvZjE2Y2ludHJpbi5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvZjE2Y2ludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMjlmY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9mMTZjaW50cmluLmgKQEAgLTAsMCArMSw5MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZiAhZGVmaW5lZCBfWDg2SU5UUklOX0hfSU5DTFVERUQgJiYgIWRlZmluZWQgX0lNTUlOVFJJTl9IX0lOQ0xVREVECisjIGVycm9yICJOZXZlciB1c2UgPGYxNmludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8eDg2aW50cmluLmg+IG9yIDxpbW1pbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfX0YxNkNfXworIyBlcnJvciAiRjE2QyBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZWxzZQorCisjaWZuZGVmIF9GMTZDSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX0YxNkNJTlRSSU5fSF9JTkNMVURFRAorCitleHRlcm4gX19pbmxpbmUgZmxvYXQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfY3Z0c2hfc3MgKHVuc2lnbmVkIHNob3J0IF9fUykKK3sKKyAgX192OGhpIF9fSCA9IF9fZXh0ZW5zaW9uX18gKF9fdjhoaSl7IChzaG9ydCkgX19TLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CisgIF9fdjRzZiBfX0EgPSBfX2J1aWx0aW5faWEzMl92Y3Z0cGgycHMgKF9fSCk7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3Y0c2YgKF9fQSwgMCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0cGhfcHMgKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmN2dHBoMnBzICgoX192OGhpKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2N2dHBoX3BzIChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZjdnRwaDJwczI1NiAoKF9fdjhoaSkgX19BKTsKK30KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIHNob3J0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX2N2dHNzX3NoIChmbG9hdCBfX0YsIGNvbnN0IGludCBfX0kpCit7CisgIF9fdjRzZiBfX0EgPSAgX19leHRlbnNpb25fXyAoX192NHNmKXsgX19GLCAwLCAwLCAwIH07CisgIF9fdjhoaSBfX0ggPSBfX2J1aWx0aW5faWEzMl92Y3Z0cHMycGggKF9fQSwgX19JKTsKKyAgcmV0dXJuICh1bnNpZ25lZCBzaG9ydCkgX19idWlsdGluX2lhMzJfdmVjX2V4dF92OGhpIChfX0gsIDApOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRwc19waCAoX19tMTI4IF9fQSwgY29uc3QgaW50IF9fSSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92Y3Z0cHMycGggKChfX3Y0c2YpIF9fQSwgX19JKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0cHNfcGggKF9fbTI1NiBfX0EsIGNvbnN0IGludCBfX0kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdmN2dHBzMnBoMjU2ICgoX192OHNmKSBfX0EsIF9fSSk7Cit9CisjZWxzZQorI2RlZmluZSBfY3Z0c3Nfc2goX19GLCBfX0kpCQkJCQkJXAorICAoX19leHRlbnNpb25fXyAJCQkJCQkJXAorICAgKHsJCQkJCQkJCQlcCisgICAgICBfX3Y0c2YgX19BID0gIF9fZXh0ZW5zaW9uX18gKF9fdjRzZil7IF9fRiwgMCwgMCwgMCB9OwkJXAorICAgICAgX192OGhpIF9fSCA9IF9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaCAoX19BLCBfX0kpOwkJCVwKKyAgICAgICh1bnNpZ25lZCBzaG9ydCkgX19idWlsdGluX2lhMzJfdmVjX2V4dF92OGhpIChfX0gsIDApOwkJXAorICAgIH0pKQorCisjZGVmaW5lIF9tbV9jdnRwc19waChBLCBJKSBcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdmN2dHBzMnBoICgoX192NHNmKShfX20xMjgpIEEsIChpbnQpIChJKSkpCisKKyNkZWZpbmUgX21tMjU2X2N2dHBzX3BoKEEsIEkpIFwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92Y3Z0cHMycGgyNTYgKChfX3Y4c2YpKF9fbTI1NikgQSwgKGludCkgKEkpKSkKKyNlbmRpZiAvKiBfX09QVElNSVpFICovCisKKyNlbmRpZiAvKiBfRjE2Q0lOVFJJTl9IX0lOQ0xVREVEICovCisjZW5kaWYgLyogX19GMTZDX18gKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2Zsb2F0LmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9mbG9hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNDYxZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9mbG9hdC5oCkBAIC0wLDAgKzEsMjc3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyoKKyAqIElTTyBDIFN0YW5kYXJkOiAgNS4yLjQuMi4yICBDaGFyYWN0ZXJpc3RpY3Mgb2YgZmxvYXRpbmcgdHlwZXMgPGZsb2F0Lmg+CisgKi8KKworI2lmbmRlZiBfRkxPQVRfSF9fXworI2RlZmluZSBfRkxPQVRfSF9fXworCisvKiBSYWRpeCBvZiBleHBvbmVudCByZXByZXNlbnRhdGlvbiwgYi4gKi8KKyN1bmRlZiBGTFRfUkFESVgKKyNkZWZpbmUgRkxUX1JBRElYCV9fRkxUX1JBRElYX18KKworLyogTnVtYmVyIG9mIGJhc2UtRkxUX1JBRElYIGRpZ2l0cyBpbiB0aGUgc2lnbmlmaWNhbmQsIHAuICAqLworI3VuZGVmIEZMVF9NQU5UX0RJRworI3VuZGVmIERCTF9NQU5UX0RJRworI3VuZGVmIExEQkxfTUFOVF9ESUcKKyNkZWZpbmUgRkxUX01BTlRfRElHCV9fRkxUX01BTlRfRElHX18KKyNkZWZpbmUgREJMX01BTlRfRElHCV9fREJMX01BTlRfRElHX18KKyNkZWZpbmUgTERCTF9NQU5UX0RJRwlfX0xEQkxfTUFOVF9ESUdfXworCisvKiBOdW1iZXIgb2YgZGVjaW1hbCBkaWdpdHMsIHEsIHN1Y2ggdGhhdCBhbnkgZmxvYXRpbmctcG9pbnQgbnVtYmVyIHdpdGggcQorICAgZGVjaW1hbCBkaWdpdHMgY2FuIGJlIHJvdW5kZWQgaW50byBhIGZsb2F0aW5nLXBvaW50IG51bWJlciB3aXRoIHAgcmFkaXggYgorICAgZGlnaXRzIGFuZCBiYWNrIGFnYWluIHdpdGhvdXQgY2hhbmdlIHRvIHRoZSBxIGRlY2ltYWwgZGlnaXRzLAorCisJcCAqIGxvZzEwKGIpCQkJaWYgYiBpcyBhIHBvd2VyIG9mIDEwCisJZmxvb3IoKHAgLSAxKSAqIGxvZzEwKGIpKQlvdGhlcndpc2UKKyovCisjdW5kZWYgRkxUX0RJRworI3VuZGVmIERCTF9ESUcKKyN1bmRlZiBMREJMX0RJRworI2RlZmluZSBGTFRfRElHCQlfX0ZMVF9ESUdfXworI2RlZmluZSBEQkxfRElHCQlfX0RCTF9ESUdfXworI2RlZmluZSBMREJMX0RJRwlfX0xEQkxfRElHX18KKworLyogTWluaW11bSBpbnQgeCBzdWNoIHRoYXQgRkxUX1JBRElYKiooeC0xKSBpcyBhIG5vcm1hbGl6ZWQgZmxvYXQsIGVtaW4gKi8KKyN1bmRlZiBGTFRfTUlOX0VYUAorI3VuZGVmIERCTF9NSU5fRVhQCisjdW5kZWYgTERCTF9NSU5fRVhQCisjZGVmaW5lIEZMVF9NSU5fRVhQCV9fRkxUX01JTl9FWFBfXworI2RlZmluZSBEQkxfTUlOX0VYUAlfX0RCTF9NSU5fRVhQX18KKyNkZWZpbmUgTERCTF9NSU5fRVhQCV9fTERCTF9NSU5fRVhQX18KKworLyogTWluaW11bSBuZWdhdGl2ZSBpbnRlZ2VyIHN1Y2ggdGhhdCAxMCByYWlzZWQgdG8gdGhhdCBwb3dlciBpcyBpbiB0aGUKKyAgIHJhbmdlIG9mIG5vcm1hbGl6ZWQgZmxvYXRpbmctcG9pbnQgbnVtYmVycywKKworCWNlaWwobG9nMTAoYikgKiAoZW1pbiAtIDEpKQorKi8KKyN1bmRlZiBGTFRfTUlOXzEwX0VYUAorI3VuZGVmIERCTF9NSU5fMTBfRVhQCisjdW5kZWYgTERCTF9NSU5fMTBfRVhQCisjZGVmaW5lIEZMVF9NSU5fMTBfRVhQCV9fRkxUX01JTl8xMF9FWFBfXworI2RlZmluZSBEQkxfTUlOXzEwX0VYUAlfX0RCTF9NSU5fMTBfRVhQX18KKyNkZWZpbmUgTERCTF9NSU5fMTBfRVhQCV9fTERCTF9NSU5fMTBfRVhQX18KKworLyogTWF4aW11bSBpbnQgeCBzdWNoIHRoYXQgRkxUX1JBRElYKiooeC0xKSBpcyBhIHJlcHJlc2VudGFibGUgZmxvYXQsIGVtYXguICAqLworI3VuZGVmIEZMVF9NQVhfRVhQCisjdW5kZWYgREJMX01BWF9FWFAKKyN1bmRlZiBMREJMX01BWF9FWFAKKyNkZWZpbmUgRkxUX01BWF9FWFAJX19GTFRfTUFYX0VYUF9fCisjZGVmaW5lIERCTF9NQVhfRVhQCV9fREJMX01BWF9FWFBfXworI2RlZmluZSBMREJMX01BWF9FWFAJX19MREJMX01BWF9FWFBfXworCisvKiBNYXhpbXVtIGludGVnZXIgc3VjaCB0aGF0IDEwIHJhaXNlZCB0byB0aGF0IHBvd2VyIGlzIGluIHRoZSByYW5nZSBvZgorICAgcmVwcmVzZW50YWJsZSBmaW5pdGUgZmxvYXRpbmctcG9pbnQgbnVtYmVycywKKworCWZsb29yKGxvZzEwKCgxIC0gYioqLXApICogYioqZW1heCkpCisqLworI3VuZGVmIEZMVF9NQVhfMTBfRVhQCisjdW5kZWYgREJMX01BWF8xMF9FWFAKKyN1bmRlZiBMREJMX01BWF8xMF9FWFAKKyNkZWZpbmUgRkxUX01BWF8xMF9FWFAJX19GTFRfTUFYXzEwX0VYUF9fCisjZGVmaW5lIERCTF9NQVhfMTBfRVhQCV9fREJMX01BWF8xMF9FWFBfXworI2RlZmluZSBMREJMX01BWF8xMF9FWFAJX19MREJMX01BWF8xMF9FWFBfXworCisvKiBNYXhpbXVtIHJlcHJlc2VudGFibGUgZmluaXRlIGZsb2F0aW5nLXBvaW50IG51bWJlciwKKworCSgxIC0gYioqLXApICogYioqZW1heAorKi8KKyN1bmRlZiBGTFRfTUFYCisjdW5kZWYgREJMX01BWAorI3VuZGVmIExEQkxfTUFYCisjZGVmaW5lIEZMVF9NQVgJCV9fRkxUX01BWF9fCisjZGVmaW5lIERCTF9NQVgJCV9fREJMX01BWF9fCisjZGVmaW5lIExEQkxfTUFYCV9fTERCTF9NQVhfXworCisvKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDEgYW5kIHRoZSBsZWFzdCB2YWx1ZSBncmVhdGVyIHRoYW4gMSB0aGF0IGlzCisgICByZXByZXNlbnRhYmxlIGluIHRoZSBnaXZlbiBmbG9hdGluZyBwb2ludCB0eXBlLCBiKioxLXAuICAqLworI3VuZGVmIEZMVF9FUFNJTE9OCisjdW5kZWYgREJMX0VQU0lMT04KKyN1bmRlZiBMREJMX0VQU0lMT04KKyNkZWZpbmUgRkxUX0VQU0lMT04JX19GTFRfRVBTSUxPTl9fCisjZGVmaW5lIERCTF9FUFNJTE9OCV9fREJMX0VQU0lMT05fXworI2RlZmluZSBMREJMX0VQU0lMT04JX19MREJMX0VQU0lMT05fXworCisvKiBNaW5pbXVtIG5vcm1hbGl6ZWQgcG9zaXRpdmUgZmxvYXRpbmctcG9pbnQgbnVtYmVyLCBiKiooZW1pbiAtIDEpLiAgKi8KKyN1bmRlZiBGTFRfTUlOCisjdW5kZWYgREJMX01JTgorI3VuZGVmIExEQkxfTUlOCisjZGVmaW5lIEZMVF9NSU4JCV9fRkxUX01JTl9fCisjZGVmaW5lIERCTF9NSU4JCV9fREJMX01JTl9fCisjZGVmaW5lIExEQkxfTUlOCV9fTERCTF9NSU5fXworCisvKiBBZGRpdGlvbiByb3VuZHMgdG8gMDogemVybywgMTogbmVhcmVzdCwgMjogK2luZiwgMzogLWluZiwgLTE6IHVua25vd24uICAqLworLyogPz8/IFRoaXMgaXMgc3VwcG9zZWQgdG8gY2hhbmdlIHdpdGggY2FsbHMgdG8gZmVzZXRyb3VuZCBpbiA8ZmVudi5oPi4gICovCisjdW5kZWYgRkxUX1JPVU5EUworI2RlZmluZSBGTFRfUk9VTkRTIDEKKworI2lmIGRlZmluZWQgKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorLyogVGhlIGZsb2F0aW5nLXBvaW50IGV4cHJlc3Npb24gZXZhbHVhdGlvbiBtZXRob2QuCisgICAgICAgIC0xICBpbmRldGVybWluYXRlCisgICAgICAgICAwICBldmFsdWF0ZSBhbGwgb3BlcmF0aW9ucyBhbmQgY29uc3RhbnRzIGp1c3QgdG8gdGhlIHJhbmdlIGFuZAorICAgICAgICAgICAgcHJlY2lzaW9uIG9mIHRoZSB0eXBlCisgICAgICAgICAxICBldmFsdWF0ZSBvcGVyYXRpb25zIGFuZCBjb25zdGFudHMgb2YgdHlwZSBmbG9hdCBhbmQgZG91YmxlCisgICAgICAgICAgICB0byB0aGUgcmFuZ2UgYW5kIHByZWNpc2lvbiBvZiB0aGUgZG91YmxlIHR5cGUsIGV2YWx1YXRlCisgICAgICAgICAgICBsb25nIGRvdWJsZSBvcGVyYXRpb25zIGFuZCBjb25zdGFudHMgdG8gdGhlIHJhbmdlIGFuZAorICAgICAgICAgICAgcHJlY2lzaW9uIG9mIHRoZSBsb25nIGRvdWJsZSB0eXBlCisgICAgICAgICAyICBldmFsdWF0ZSBhbGwgb3BlcmF0aW9ucyBhbmQgY29uc3RhbnRzIHRvIHRoZSByYW5nZSBhbmQKKyAgICAgICAgICAgIHByZWNpc2lvbiBvZiB0aGUgbG9uZyBkb3VibGUgdHlwZQorCisgICA/Pz8gVGhpcyBvdWdodCB0byBjaGFuZ2Ugd2l0aCB0aGUgc2V0dGluZyBvZiB0aGUgZnAgY29udHJvbCB3b3JkOworICAgdGhlIHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBjb21waWxlciBhc3N1bWVzIHRoZSB3aWRlc3Qgc2V0dGluZy4gICovCisjdW5kZWYgRkxUX0VWQUxfTUVUSE9ECisjZGVmaW5lIEZMVF9FVkFMX01FVEhPRAlfX0ZMVF9FVkFMX01FVEhPRF9fCisKKy8qIE51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cywgbiwgc3VjaCB0aGF0IGFueSBmbG9hdGluZy1wb2ludCBudW1iZXIgaW4gdGhlCisgICB3aWRlc3Qgc3VwcG9ydGVkIGZsb2F0aW5nIHR5cGUgd2l0aCBwbWF4IHJhZGl4IGIgZGlnaXRzIGNhbiBiZSByb3VuZGVkCisgICB0byBhIGZsb2F0aW5nLXBvaW50IG51bWJlciB3aXRoIG4gZGVjaW1hbCBkaWdpdHMgYW5kIGJhY2sgYWdhaW4gd2l0aG91dAorICAgY2hhbmdlIHRvIHRoZSB2YWx1ZSwKKworCXBtYXggKiBsb2cxMChiKQkJCWlmIGIgaXMgYSBwb3dlciBvZiAxMAorCWNlaWwoMSArIHBtYXggKiBsb2cxMChiKSkJb3RoZXJ3aXNlCisqLworI3VuZGVmIERFQ0lNQUxfRElHCisjZGVmaW5lIERFQ0lNQUxfRElHCV9fREVDSU1BTF9ESUdfXworCisjZW5kaWYgLyogQzk5ICovCisKKyNpZiBkZWZpbmVkIChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDIwMTExMkwKKy8qIFZlcnNpb25zIG9mIERFQ0lNQUxfRElHIGZvciBlYWNoIGZsb2F0aW5nLXBvaW50IHR5cGUuICAqLworI3VuZGVmIEZMVF9ERUNJTUFMX0RJRworI3VuZGVmIERCTF9ERUNJTUFMX0RJRworI3VuZGVmIExEQkxfREVDSU1BTF9ESUcKKyNkZWZpbmUgRkxUX0RFQ0lNQUxfRElHCQlfX0ZMVF9ERUNJTUFMX0RJR19fCisjZGVmaW5lIERCTF9ERUNJTUFMX0RJRwkJX19EQkxfREVDSU1BTF9ESUdfXworI2RlZmluZSBMREJMX0RFQ0lNQUxfRElHCV9fREVDSU1BTF9ESUdfXworCisvKiBXaGV0aGVyIHR5cGVzIHN1cHBvcnQgc3Vibm9ybWFsIG51bWJlcnMuICAqLworI3VuZGVmIEZMVF9IQVNfU1VCTk9STQorI3VuZGVmIERCTF9IQVNfU1VCTk9STQorI3VuZGVmIExEQkxfSEFTX1NVQk5PUk0KKyNkZWZpbmUgRkxUX0hBU19TVUJOT1JNCQlfX0ZMVF9IQVNfREVOT1JNX18KKyNkZWZpbmUgREJMX0hBU19TVUJOT1JNCQlfX0RCTF9IQVNfREVOT1JNX18KKyNkZWZpbmUgTERCTF9IQVNfU1VCTk9STQlfX0xEQkxfSEFTX0RFTk9STV9fCisKKy8qIE1pbmltdW0gcG9zaXRpdmUgdmFsdWVzLCBpbmNsdWRpbmcgc3Vibm9ybWFscy4gICovCisjdW5kZWYgRkxUX1RSVUVfTUlOCisjdW5kZWYgREJMX1RSVUVfTUlOCisjdW5kZWYgTERCTF9UUlVFX01JTgorI2lmIF9fRkxUX0hBU19ERU5PUk1fXworI2RlZmluZSBGTFRfVFJVRV9NSU4JX19GTFRfREVOT1JNX01JTl9fCisjZWxzZQorI2RlZmluZSBGTFRfVFJVRV9NSU4JX19GTFRfTUlOX18KKyNlbmRpZgorI2lmIF9fREJMX0hBU19ERU5PUk1fXworI2RlZmluZSBEQkxfVFJVRV9NSU4JX19EQkxfREVOT1JNX01JTl9fCisjZWxzZQorI2RlZmluZSBEQkxfVFJVRV9NSU4JX19EQkxfTUlOX18KKyNlbmRpZgorI2lmIF9fTERCTF9IQVNfREVOT1JNX18KKyNkZWZpbmUgTERCTF9UUlVFX01JTglfX0xEQkxfREVOT1JNX01JTl9fCisjZWxzZQorI2RlZmluZSBMREJMX1RSVUVfTUlOCV9fTERCTF9NSU5fXworI2VuZGlmCisKKyNlbmRpZiAvKiBDMTEgKi8KKworI2lmZGVmIF9fU1REQ19XQU5UX0RFQ19GUF9fCisvKiBEcmFmdCBUZWNobmljYWwgUmVwb3J0IDI0NzMyLCBleHRlbnNpb24gZm9yIGRlY2ltYWwgZmxvYXRpbmctcG9pbnQKKyAgIGFyaXRobWV0aWM6IENoYXJhY3RlcmlzdGljIG9mIGRlY2ltYWwgZmxvYXRpbmcgdHlwZXMgPGZsb2F0Lmg+LiAgKi8KKworLyogTnVtYmVyIG9mIGJhc2UtRkxUX1JBRElYIGRpZ2l0cyBpbiB0aGUgc2lnbmlmaWNhbmQsIHAuICAqLworI3VuZGVmIERFQzMyX01BTlRfRElHCisjdW5kZWYgREVDNjRfTUFOVF9ESUcKKyN1bmRlZiBERUMxMjhfTUFOVF9ESUcKKyNkZWZpbmUgREVDMzJfTUFOVF9ESUcJX19ERUMzMl9NQU5UX0RJR19fCisjZGVmaW5lIERFQzY0X01BTlRfRElHCV9fREVDNjRfTUFOVF9ESUdfXworI2RlZmluZSBERUMxMjhfTUFOVF9ESUcJX19ERUMxMjhfTUFOVF9ESUdfXworCisvKiBNaW5pbXVtIGV4cG9uZW50LiAqLworI3VuZGVmIERFQzMyX01JTl9FWFAKKyN1bmRlZiBERUM2NF9NSU5fRVhQCisjdW5kZWYgREVDMTI4X01JTl9FWFAKKyNkZWZpbmUgREVDMzJfTUlOX0VYUAlfX0RFQzMyX01JTl9FWFBfXworI2RlZmluZSBERUM2NF9NSU5fRVhQCV9fREVDNjRfTUlOX0VYUF9fCisjZGVmaW5lIERFQzEyOF9NSU5fRVhQCV9fREVDMTI4X01JTl9FWFBfXworCisvKiBNYXhpbXVtIGV4cG9uZW50LiAqLworI3VuZGVmIERFQzMyX01BWF9FWFAKKyN1bmRlZiBERUM2NF9NQVhfRVhQCisjdW5kZWYgREVDMTI4X01BWF9FWFAKKyNkZWZpbmUgREVDMzJfTUFYX0VYUAlfX0RFQzMyX01BWF9FWFBfXworI2RlZmluZSBERUM2NF9NQVhfRVhQCV9fREVDNjRfTUFYX0VYUF9fCisjZGVmaW5lIERFQzEyOF9NQVhfRVhQCV9fREVDMTI4X01BWF9FWFBfXworCisvKiBNYXhpbXVtIHJlcHJlc2VudGFibGUgZmluaXRlIGRlY2ltYWwgZmxvYXRpbmctcG9pbnQgbnVtYmVyCisgICAodGhlcmUgYXJlIDYsIDE1LCBhbmQgMzMgOXMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnRzIHJlc3BlY3RpdmVseSkuICovCisjdW5kZWYgREVDMzJfTUFYCisjdW5kZWYgREVDNjRfTUFYCisjdW5kZWYgREVDMTI4X01BWAorI2RlZmluZSBERUMzMl9NQVggICBfX0RFQzMyX01BWF9fCisjZGVmaW5lIERFQzY0X01BWCAgIF9fREVDNjRfTUFYX18KKyNkZWZpbmUgREVDMTI4X01BWCAgX19ERUMxMjhfTUFYX18KKworLyogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAxIGFuZCB0aGUgbGVhc3QgdmFsdWUgZ3JlYXRlciB0aGFuIDEgdGhhdCBpcworICAgcmVwcmVzZW50YWJsZSBpbiB0aGUgZ2l2ZW4gZmxvYXRpbmcgcG9pbnQgdHlwZS4gKi8KKyN1bmRlZiBERUMzMl9FUFNJTE9OCisjdW5kZWYgREVDNjRfRVBTSUxPTgorI3VuZGVmIERFQzEyOF9FUFNJTE9OCisjZGVmaW5lIERFQzMyX0VQU0lMT04JX19ERUMzMl9FUFNJTE9OX18KKyNkZWZpbmUgREVDNjRfRVBTSUxPTglfX0RFQzY0X0VQU0lMT05fXworI2RlZmluZSBERUMxMjhfRVBTSUxPTglfX0RFQzEyOF9FUFNJTE9OX18KKworLyogTWluaW11bSBub3JtYWxpemVkIHBvc2l0aXZlIGZsb2F0aW5nLXBvaW50IG51bWJlci4gKi8KKyN1bmRlZiBERUMzMl9NSU4KKyN1bmRlZiBERUM2NF9NSU4KKyN1bmRlZiBERUMxMjhfTUlOCisjZGVmaW5lIERFQzMyX01JTglfX0RFQzMyX01JTl9fCisjZGVmaW5lIERFQzY0X01JTglfX0RFQzY0X01JTl9fCisjZGVmaW5lIERFQzEyOF9NSU4JX19ERUMxMjhfTUlOX18KKworLyogTWluaW11bSBzdWJub3JtYWwgcG9zaXRpdmUgZmxvYXRpbmctcG9pbnQgbnVtYmVyLiAqLworI3VuZGVmIERFQzMyX1NVQk5PUk1BTF9NSU4KKyN1bmRlZiBERUM2NF9TVUJOT1JNQUxfTUlOCisjdW5kZWYgREVDMTI4X1NVQk5PUk1BTF9NSU4KKyNkZWZpbmUgREVDMzJfU1VCTk9STUFMX01JTiAgICAgICBfX0RFQzMyX1NVQk5PUk1BTF9NSU5fXworI2RlZmluZSBERUM2NF9TVUJOT1JNQUxfTUlOICAgICAgIF9fREVDNjRfU1VCTk9STUFMX01JTl9fCisjZGVmaW5lIERFQzEyOF9TVUJOT1JNQUxfTUlOICAgICAgX19ERUMxMjhfU1VCTk9STUFMX01JTl9fCisKKy8qIFRoZSBmbG9hdGluZy1wb2ludCBleHByZXNzaW9uIGV2YWx1YXRpb24gbWV0aG9kLgorICAgICAgICAgLTEgIGluZGV0ZXJtaW5hdGUKKyAgICAgICAgIDAgIGV2YWx1YXRlIGFsbCBvcGVyYXRpb25zIGFuZCBjb25zdGFudHMganVzdCB0byB0aGUgcmFuZ2UgYW5kCisgICAgICAgICAgICBwcmVjaXNpb24gb2YgdGhlIHR5cGUKKyAgICAgICAgIDEgIGV2YWx1YXRlIG9wZXJhdGlvbnMgYW5kIGNvbnN0YW50cyBvZiB0eXBlIF9EZWNpbWFsMzIgCisJICAgIGFuZCBfRGVjaW1hbDY0IHRvIHRoZSByYW5nZSBhbmQgcHJlY2lzaW9uIG9mIHRoZSBfRGVjaW1hbDY0IAorICAgICAgICAgICAgdHlwZSwgZXZhbHVhdGUgX0RlY2ltYWwxMjggb3BlcmF0aW9ucyBhbmQgY29uc3RhbnRzIHRvIHRoZSAKKwkgICAgcmFuZ2UgYW5kIHByZWNpc2lvbiBvZiB0aGUgX0RlY2ltYWwxMjggdHlwZTsKKwkgMiAgZXZhbHVhdGUgYWxsIG9wZXJhdGlvbnMgYW5kIGNvbnN0YW50cyB0byB0aGUgcmFuZ2UgYW5kCisJICAgIHByZWNpc2lvbiBvZiB0aGUgX0RlY2ltYWwxMjggdHlwZS4gICovCisKKyN1bmRlZiBERUNfRVZBTF9NRVRIT0QKKyNkZWZpbmUgREVDX0VWQUxfTUVUSE9ECV9fREVDX0VWQUxfTUVUSE9EX18KKworI2VuZGlmIC8qIF9fU1REQ19XQU5UX0RFQ19GUF9fICovCisKKyNlbmRpZiAvKiBfRkxPQVRfSF9fXyAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvZm1hNGludHJpbi5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvZm1hNGludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYmE3ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9mbWE0aW50cmluLmgKQEAgLTAsMCArMSwyMzYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9YODZJTlRSSU5fSF9JTkNMVURFRAorIyBlcnJvciAiTmV2ZXIgdXNlIDxmbWE0aW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDx4ODZpbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfRk1BNElOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9GTUE0SU5UUklOX0hfSU5DTFVERUQKKworI2lmbmRlZiBfX0ZNQTRfXworIyBlcnJvciAiRk1BNCBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZWxzZQorCisvKiBXZSBuZWVkIGRlZmluaXRpb25zIGZyb20gdGhlIFNTRTRBLCBTU0UzLCBTU0UyIGFuZCBTU0UgaGVhZGVyIGZpbGVzLiAgKi8KKyNpbmNsdWRlIDxhbW1pbnRyaW4uaD4KKworLyogMTI4YiBGbG9hdGluZyBwb2ludCBtdWx0aXBseS9hZGQgdHlwZSBpbnN0cnVjdGlvbnMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWNjX3BzIChfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkcHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQiwgKF9fdjRzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWNjX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IsIChfX3YyZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWNjX3NzIChfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3MgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQiwgKF9fdjRzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWNjX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IsIChfX3YyZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tc3ViX3BzIChfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQorCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLCAtKF9fdjRzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tc3ViX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IsIC0oX192MmRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbXN1Yl9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IsIC0oX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21zdWJfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkc2QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQiwgLShfX3YyZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9ubWFjY19wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzICgtKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLCAoX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX25tYWNjX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkICgtKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLCAoX192MmRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbm1hY2Nfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzcyAoLShfX3Y0c2YpX19BLCAoX192NHNmKV9fQiwgKF9fdjRzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9ubWFjY19zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzZCAoLShfX3YyZGYpX19BLCAoX192MmRmKV9fQiwgKF9fdjJkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX25tc3ViX3BzIChfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkcHMgKC0oX192NHNmKV9fQSwgKF9fdjRzZilfX0IsIC0oX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX25tc3ViX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkICgtKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLCAtKF9fdjJkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX25tc3ViX3NzIChfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3MgKC0oX192NHNmKV9fQSwgKF9fdjRzZilfX0IsIC0oX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX25tc3ViX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkICgtKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLCAtKF9fdjJkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hZGRzdWJfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLCAoX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hZGRzdWJfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQiwgKF9fdjJkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21zdWJhZGRfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLCAtKF9fdjRzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tc3ViYWRkX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IsIC0oX192MmRmKV9fQyk7Cit9CisKKy8qIDI1NmIgRmxvYXRpbmcgcG9pbnQgbXVsdGlwbHkvYWRkIHR5cGUgaW5zdHJ1Y3Rpb25zLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbWFjY19wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQiwgX19tMjU2IF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMjU2ICgoX192OHNmKV9fQSwgKF9fdjhzZilfX0IsIChfX3Y4c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbWFjY19wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CLCAoX192NGRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbXN1Yl9wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQiwgX19tMjU2IF9fQykKKworeworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmZtYWRkcHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQiwgLShfX3Y4c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbXN1Yl9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CLCAtKF9fdjRkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X25tYWNjX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmZtYWRkcHMyNTYgKC0oX192OHNmKV9fQSwgKF9fdjhzZilfX0IsIChfX3Y4c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbm1hY2NfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQiwgX19tMjU2ZCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkcGQyNTYgKC0oX192NGRmKV9fQSwgKF9fdjRkZilfX0IsIChfX3Y0ZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9ubXN1Yl9wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQiwgX19tMjU2IF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMjU2ICgtKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CLCAtKF9fdjhzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9ubXN1Yl9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDI1NiAoLShfX3Y0ZGYpX19BLCAoX192NGRmKV9fQiwgLShfX3Y0ZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYWRkc3ViX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQiwgKF9fdjhzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYWRkc3ViX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IsIF9fbTI1NmQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkMjU2ICgoX192NGRmKV9fQSwgKF9fdjRkZilfX0IsIChfX3Y0ZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tc3ViYWRkX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQiwgLShfX3Y4c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbXN1YmFkZF9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CLCAtKF9fdjRkZilfX0MpOworfQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9mbWFpbnRyaW4uaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2ZtYWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZGU4NGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9mbWFpbnRyaW4uaApAQCAtMCwwICsxLDI5NyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX0lNTUlOVFJJTl9IX0lOQ0xVREVECisjIGVycm9yICJOZXZlciB1c2UgPGZtYWludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8aW1taW50cmluLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX0ZNQUlOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9GTUFJTlRSSU5fSF9JTkNMVURFRAorCisjaWZuZGVmIF9fRk1BX18KKyMgZXJyb3IgIkZNQSBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZWxzZQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZm1hZGRfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl92Zm1hZGRwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3YyZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2ZtYWRkX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IsIF9fbTI1NmQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpX19idWlsdGluX2lhMzJfdmZtYWRkcGQyNTYgKChfX3Y0ZGYpX19BLCAoX192NGRmKV9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjgKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2ZtYWRkX3BzIChfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl92Zm1hZGRwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9mbWFkZF9wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQiwgX19tMjU2IF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTYpX19idWlsdGluX2lhMzJfdmZtYWRkcHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2ZtYWRkX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkMyAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9mbWFkZF9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzMyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9mbXN1Yl9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3YyZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Ztc3ViX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IsIF9fbTI1NmQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpX19idWlsdGluX2lhMzJfdmZtYWRkcGQyNTYgKChfX3Y0ZGYpX19BLCAoX192NGRmKV9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjRkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9mbXN1Yl9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZtYWRkcHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Ztc3ViX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NilfX2J1aWx0aW5faWEzMl92Zm1hZGRwczI1NiAoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3Y4c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Ztc3ViX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZtYWRkc2QzICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192MmRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjgKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Ztc3ViX3NzIChfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl92Zm1hZGRzczMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjRzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZm5tYWRkX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZtYWRkcGQgKC0oX192MmRmKV9fQSwgKF9fdjJkZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfZm5tYWRkX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IsIF9fbTI1NmQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpX19idWlsdGluX2lhMzJfdmZtYWRkcGQyNTYgKC0oX192NGRmKV9fQSwgKF9fdjRkZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9mbm1hZGRfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzICgtKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9mbm1hZGRfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IsIF9fbTI1NiBfX0MpCit7CisgIHJldHVybiAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMjU2ICgtKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZm5tYWRkX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfdmZtYWRkc2QzICgoX192MmRmKV9fQSwgLShfX3YyZGYpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192MmRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjgKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2ZubWFkZF9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZtYWRkc3MzICgoX192NHNmKV9fQSwgLShfX3Y0c2YpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2ZubXN1Yl9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkICgtKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192MmRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9mbm1zdWJfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQiwgX19tMjU2ZCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDI1NiAoLShfX3Y0ZGYpX19BLCAoX192NGRmKV9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjRkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9mbm1zdWJfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzICgtKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShfX3Y0c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NgorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfZm5tc3ViX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NilfX2J1aWx0aW5faWEzMl92Zm1hZGRwczI1NiAoLShfX3Y4c2YpX19BLCAoX192OHNmKV9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192OHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9mbm1zdWJfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl92Zm1hZGRzZDMgKChfX3YyZGYpX19BLCAtKF9fdjJkZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192MmRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjgKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2ZubXN1Yl9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZtYWRkc3MzICgoX192NHNmKV9fQSwgLShfX3Y0c2YpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9mbWFkZHN1Yl9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjJkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfZm1hZGRzdWJfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQiwgX19tMjU2ZCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2ZClfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDI1NiAoKF9fdjRkZilfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZilfX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjRkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9mbWFkZHN1Yl9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y0c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NgorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfZm1hZGRzdWJfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IsIF9fbTI1NiBfX0MpCit7CisgIHJldHVybiAoX19tMjU2KV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzMjU2ICgoX192OHNmKV9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX3Y4c2YpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdjhzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZm1zdWJhZGRfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192MmRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9mbXN1YmFkZF9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkMjU2ICgoX192NGRmKV9fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192NGRmKV9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKF9fdjRkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9mbXN1YmFkZF9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Ztc3ViYWRkX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NilfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczI1NiAoKF9fdjhzZilfX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX192OHNmKV9fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oX192OHNmKV9fQyk7Cit9CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2Z4c3JpbnRyaW4uaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2Z4c3JpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjYzMjIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvZnhzcmludHJpbi5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiAjaWYgIWRlZmluZWQgX1g4NklOVFJJTl9IX0lOQ0xVREVEICYmICFkZWZpbmVkIF9JTU1JTlRSSU5fSF9JTkNMVURFRCAqLworLyogIyBlcnJvciAiTmV2ZXIgdXNlIDxmeHNyaW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDx4ODZpbnRyaW4uaD4gaW5zdGVhZC4iICovCisvKiAjZW5kaWYgKi8KKworI2lmbmRlZiBfRlhTUklOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9GWFNSSU5UUklOX0hfSU5DTFVERUQKKworZXh0ZXJuIF9faW5saW5lIHZvaWQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX2Z4c2F2ZSAodm9pZCAqX19QKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfZnhzYXZlIChfX1ApOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfZnhyc3RvciAodm9pZCAqX19QKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfZnhyc3RvciAoX19QKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KK2V4dGVybiBfX2lubGluZSB2b2lkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19meHNhdmU2NCAodm9pZCAqX19QKQoreworICAgIHJldHVybiBfX2J1aWx0aW5faWEzMl9meHNhdmU2NCAoX19QKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX2Z4cnN0b3I2NCAodm9pZCAqX19QKQoreworICAgIHJldHVybiBfX2J1aWx0aW5faWEzMl9meHJzdG9yNjQgKF9fUCk7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9GWFNSSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2lhMzJpbnRyaW4uaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2lhMzJpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzFhZjBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvaWEzMmludHJpbi5oCkBAIC0wLDAgKzEsMjQyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfWDg2SU5UUklOX0hfSU5DTFVERUQKKyMgZXJyb3IgIk5ldmVyIHVzZSA8aWEzMmludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8eDg2aW50cmluLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIDMyYml0IGJzZiAqLworZXh0ZXJuIF9faW5saW5lIGludAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2JzZmQgKGludCBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fY3R6IChfX1gpOworfQorCisvKiAzMmJpdCBic3IgKi8KK2V4dGVybiBfX2lubGluZSBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ic3JkIChpbnQgX19YKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfYnNyc2kgKF9fWCk7Cit9CisKKy8qIDMyYml0IGJzd2FwICovCitleHRlcm4gX19pbmxpbmUgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYnN3YXBkIChpbnQgX19YKQoreworICByZXR1cm4gX19idWlsdGluX2Jzd2FwMzIgKF9fWCk7Cit9CisKKyNpZmRlZiBfX1NTRTRfMl9fCisvKiAzMmJpdCBhY2N1bXVsYXRlIENSQzMyIChwb2x5bm9taWFsIDB4MTFFREM2RjQxKSB2YWx1ZS4gICovCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fY3JjMzJiICh1bnNpZ25lZCBpbnQgX19DLCB1bnNpZ25lZCBjaGFyIF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NyYzMycWkgKF9fQywgX19WKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2NyYzMydyAodW5zaWduZWQgaW50IF9fQywgdW5zaWduZWQgc2hvcnQgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3JjMzJoaSAoX19DLCBfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fY3JjMzJkICh1bnNpZ25lZCBpbnQgX19DLCB1bnNpZ25lZCBpbnQgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3JjMzJzaSAoX19DLCBfX1YpOworfQorI2VuZGlmIC8qIFNTRTQuMiAqLworCisvKiAzMmJpdCBwb3BjbnQgKi8KK2V4dGVybiBfX2lubGluZSBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19wb3BjbnRkICh1bnNpZ25lZCBpbnQgX19YKQoreworICByZXR1cm4gX19idWlsdGluX3BvcGNvdW50IChfX1gpOworfQorCisvKiByZHBtYyAqLworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZworX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX3JkcG1jIChpbnQgX19TKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcmRwbWMgKF9fUyk7Cit9CisKKy8qIHJkdHNjICovCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fcmR0c2MgKHZvaWQpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZHRzYyAoKTsKK30KKworLyogcmR0c2NwICovCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fcmR0c2NwICh1bnNpZ25lZCBpbnQgKl9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3JkdHNjcCAoX19BKTsKK30KKworLyogOGJpdCByb2wgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBjaGFyCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fcm9sYiAodW5zaWduZWQgY2hhciBfX1gsIGludCBfX0MpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yb2xxaSAoX19YLCBfX0MpOworfQorCisvKiAxNmJpdCByb2wgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBzaG9ydAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX3JvbHcgKHVuc2lnbmVkIHNob3J0IF9fWCwgaW50IF9fQykKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3JvbGhpIChfX1gsIF9fQyk7Cit9CisKKy8qIDMyYml0IHJvbCAqLworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX3JvbGQgKHVuc2lnbmVkIGludCBfX1gsIGludCBfX0MpCit7CisgIHJldHVybiAoX19YIDw8IF9fQykgfCAoX19YID4+ICgzMiAtIF9fQykpOworfQorCisvKiA4Yml0IHJvciAqLworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGNoYXIKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19yb3JiICh1bnNpZ25lZCBjaGFyIF9fWCwgaW50IF9fQykKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3JvcnFpIChfX1gsIF9fQyk7Cit9CisKKy8qIDE2Yml0IHJvciAqLworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIHNob3J0CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fcm9ydyAodW5zaWduZWQgc2hvcnQgX19YLCBpbnQgX19DKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcm9yaGkgKF9fWCwgX19DKTsKK30KKworLyogMzJiaXQgcm9yICovCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fcm9yZCAodW5zaWduZWQgaW50IF9fWCwgaW50IF9fQykKK3sKKyAgcmV0dXJuIChfX1ggPj4gX19DKSB8IChfX1ggPDwgKDMyIC0gX19DKSk7Cit9CisKKy8qIFBhdXNlICovCitleHRlcm4gX19pbmxpbmUgdm9pZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX3BhdXNlICh2b2lkKQoreworICBfX2J1aWx0aW5faWEzMl9wYXVzZSAoKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KKy8qIDY0Yml0IGJzZiAqLworZXh0ZXJuIF9faW5saW5lIGludAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2JzZnEgKGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fY3R6bGwgKF9fWCk7Cit9CisKKy8qIDY0Yml0IGJzciAqLworZXh0ZXJuIF9faW5saW5lIGludAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2JzcnEgKGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9ic3JkaSAoX19YKTsKK30KKworLyogNjRiaXQgYnN3YXAgKi8KK2V4dGVybiBfX2lubGluZSBsb25nIGxvbmcKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ic3dhcHEgKGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fYnN3YXA2NCAoX19YKTsKK30KKworI2lmZGVmIF9fU1NFNF8yX18KKy8qIDY0Yml0IGFjY3VtdWxhdGUgQ1JDMzIgKHBvbHlub21pYWwgMHgxMUVEQzZGNDEpIHZhbHVlLiAgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19jcmMzMnEgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX0MsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jcmMzMmRpIChfX0MsIF9fVik7Cit9CisjZW5kaWYKKworLyogNjRiaXQgcG9wY250ICovCitleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fcG9wY250cSAodW5zaWduZWQgbG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudGxsIChfX1gpOworfQorCisvKiA2NGJpdCByb2wgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19yb2xxICh1bnNpZ25lZCBsb25nIGxvbmcgX19YLCBpbnQgX19DKQoreworICByZXR1cm4gKF9fWCA8PCBfX0MpIHwgKF9fWCA+PiAoNjQgLSBfX0MpKTsKK30KKworLyogNjRiaXQgcm9yICovCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fcm9ycSAodW5zaWduZWQgbG9uZyBsb25nIF9fWCwgaW50IF9fQykKK3sKKyAgcmV0dXJuIChfX1ggPj4gX19DKSB8IChfX1ggPDwgKDY0IC0gX19DKSk7Cit9CisKKyNkZWZpbmUgX2Jzd2FwNjQoYSkJCV9fYnN3YXBxKGEpCisjZGVmaW5lIF9wb3BjbnQ2NChhKQkJX19wb3BjbnRxKGEpCisjZGVmaW5lIF9scm90bChhLGIpCQlfX3JvbHEoKGEpLCAoYikpCisjZGVmaW5lIF9scm90cihhLGIpCQlfX3JvcnEoKGEpLCAoYikpCisjZWxzZQorI2RlZmluZSBfbHJvdGwoYSxiKQkJX19yb2xkKChhKSwgKGIpKQorI2RlZmluZSBfbHJvdHIoYSxiKQkJX19yb3JkKChhKSwgKGIpKQorI2VuZGlmCisKKyNkZWZpbmUgX2JpdF9zY2FuX2ZvcndhcmQoYSkJX19ic2ZkKGEpCisjZGVmaW5lIF9iaXRfc2Nhbl9yZXZlcnNlKGEpCV9fYnNyZChhKQorI2RlZmluZSBfYnN3YXAoYSkJCV9fYnN3YXBkKGEpCisjZGVmaW5lIF9wb3BjbnQzMihhKQkJX19wb3BjbnRkKGEpCisjZGVmaW5lIF9yZHBtYyhhKQkJX19yZHBtYyhhKQorI2RlZmluZSBfcmR0c2MoKQkJX19yZHRzYygpCisjZGVmaW5lIF9yZHRzY3AoYSkJCV9fcmR0c2NwKGEpCisjZGVmaW5lIF9yb3R3bChhLGIpCQlfX3JvbHcoKGEpLCAoYikpCisjZGVmaW5lIF9yb3R3cihhLGIpCQlfX3JvcncoKGEpLCAoYikpCisjZGVmaW5lIF9yb3RsKGEsYikJCV9fcm9sZCgoYSksIChiKSkKKyNkZWZpbmUgX3JvdHIoYSxiKQkJX19yb3JkKChhKSwgKGIpKQpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvaW1taW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9pbW1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTM3NzUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvaW1taW50cmluLmgKQEAgLTAsMCArMSwxNzYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9JTU1JTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfSU1NSU5UUklOX0hfSU5DTFVERUQKKworI2lmZGVmIF9fTU1YX18KKyNpbmNsdWRlIDxtbWludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX1NTRV9fCisjaW5jbHVkZSA8eG1taW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fU1NFMl9fCisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fU1NFM19fCisjaW5jbHVkZSA8cG1taW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fU1NTRTNfXworI2luY2x1ZGUgPHRtbWludHJpbi5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX1NTRTRfMl9fKSB8fCBkZWZpbmVkIChfX1NTRTRfMV9fKQorI2luY2x1ZGUgPHNtbWludHJpbi5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0FFU19fKSB8fCBkZWZpbmVkIChfX1BDTE1VTF9fKQorI2luY2x1ZGUgPHdtbWludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0FWWF9fCisjaW5jbHVkZSA8YXZ4aW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fQVZYMl9fCisjaW5jbHVkZSA8YXZ4MmludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0xaQ05UX18KKyNpbmNsdWRlIDxsemNudGludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0JNSV9fCisjaW5jbHVkZSA8Ym1paW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fQk1JMl9fCisjaW5jbHVkZSA8Ym1pMmludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0ZNQV9fCisjaW5jbHVkZSA8Zm1haW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fRjE2Q19fCisjaW5jbHVkZSA8ZjE2Y2ludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX1JUTV9fCisjaW5jbHVkZSA8cnRtaW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fUlRNX18KKyNpbmNsdWRlIDx4dGVzdGludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX1JEUk5EX18KK2V4dGVybiBfX2lubGluZSBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX3JkcmFuZDE2X3N0ZXAgKHVuc2lnbmVkIHNob3J0ICpfX1ApCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZHJhbmQxNl9zdGVwIChfX1ApOworfQorCitleHRlcm4gX19pbmxpbmUgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19yZHJhbmQzMl9zdGVwICh1bnNpZ25lZCBpbnQgKl9fUCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3JkcmFuZDMyX3N0ZXAgKF9fUCk7Cit9CisjZW5kaWYgLyogX19SRFJORF9fICovCisKKyNpZmRlZiAgX194ODZfNjRfXworI2lmZGVmIF9fRlNHU0JBU0VfXworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfcmVhZGZzYmFzZV91MzIgKHZvaWQpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZGZzYmFzZTMyICgpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19yZWFkZnNiYXNlX3U2NCAodm9pZCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3JkZnNiYXNlNjQgKCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX3JlYWRnc2Jhc2VfdTMyICh2b2lkKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcmRnc2Jhc2UzMiAoKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZworX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfcmVhZGdzYmFzZV91NjQgKHZvaWQpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZGdzYmFzZTY0ICgpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfd3JpdGVmc2Jhc2VfdTMyICh1bnNpZ25lZCBpbnQgX19CKQoreworICBfX2J1aWx0aW5faWEzMl93cmZzYmFzZTMyIChfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfd3JpdGVmc2Jhc2VfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19CKQoreworICBfX2J1aWx0aW5faWEzMl93cmZzYmFzZTY0IChfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfd3JpdGVnc2Jhc2VfdTMyICh1bnNpZ25lZCBpbnQgX19CKQoreworICBfX2J1aWx0aW5faWEzMl93cmdzYmFzZTMyIChfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfd3JpdGVnc2Jhc2VfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19CKQoreworICBfX2J1aWx0aW5faWEzMl93cmdzYmFzZTY0IChfX0IpOworfQorI2VuZGlmIC8qIF9fRlNHU0JBU0VfXyAqLworCisjaWZkZWYgX19SRFJORF9fCitleHRlcm4gX19pbmxpbmUgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19yZHJhbmQ2NF9zdGVwICh1bnNpZ25lZCBsb25nIGxvbmcgKl9fUCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3JkcmFuZDY0X3N0ZXAgKF9fUCk7Cit9CisjZW5kaWYgLyogX19SRFJORF9fICovCisjZW5kaWYgLyogX194ODZfNjRfXyAgKi8KKworI2VuZGlmIC8qIF9JTU1JTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvaXNvNjQ2LmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9pc282NDYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmRlYzkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvaXNvNjQ2LmgKQEAgLTAsMCArMSw0NSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qCisgKiBJU08gQyBTdGFuZGFyZDogIDcuOSAgQWx0ZXJuYXRpdmUgc3BlbGxpbmdzICA8aXNvNjQ2Lmg+CisgKi8KKworI2lmbmRlZiBfSVNPNjQ2X0gKKyNkZWZpbmUgX0lTTzY0Nl9ICisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgYW5kCSYmCisjZGVmaW5lIGFuZF9lcQkmPQorI2RlZmluZSBiaXRhbmQJJgorI2RlZmluZSBiaXRvcgl8CisjZGVmaW5lIGNvbXBsCX4KKyNkZWZpbmUgbm90CSEKKyNkZWZpbmUgbm90X2VxCSE9CisjZGVmaW5lIG9yCXx8CisjZGVmaW5lIG9yX2VxCXw9CisjZGVmaW5lIHhvcgleCisjZGVmaW5lIHhvcl9lcQlePQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvbHdwaW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9sd3BpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzcwODUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvbHdwaW50cmluLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9YODZJTlRSSU5fSF9JTkNMVURFRAorIyBlcnJvciAiTmV2ZXIgdXNlIDxsd3BpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHg4NmludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9MV1BJTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfTFdQSU5UUklOX0hfSU5DTFVERUQKKworI2lmbmRlZiBfX0xXUF9fCisjIGVycm9yICJMV1AgaW5zdHJ1Y3Rpb24gc2V0IG5vdCBlbmFibGVkIgorI2Vsc2UKKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2xsd3BjYiAodm9pZCAqcGNiQWRkcmVzcykKK3sKKyAgX19idWlsdGluX2lhMzJfbGx3cGNiIChwY2JBZGRyZXNzKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgKiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fc2x3cGNiICh2b2lkKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfc2x3cGNiICgpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fbHdwdmFsMzIgKHVuc2lnbmVkIGludCBkYXRhMiwgdW5zaWduZWQgaW50IGRhdGExLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisgIF9fYnVpbHRpbl9pYTMyX2x3cHZhbDMyIChkYXRhMiwgZGF0YTEsIGZsYWdzKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19sd3B2YWw2NCAodW5zaWduZWQgbG9uZyBsb25nIGRhdGEyLCB1bnNpZ25lZCBpbnQgZGF0YTEsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKyAgX19idWlsdGluX2lhMzJfbHdwdmFsNjQgKGRhdGEyLCBkYXRhMSwgZmxhZ3MpOworfQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBfX2x3cHZhbDMyKEQyLCBEMSwgRikgXAorICAoX19idWlsdGluX2lhMzJfbHdwdmFsMzIgKCh1bnNpZ25lZCBpbnQpIChEMiksICh1bnNpZ25lZCBpbnQpIChEMSksIFwKKwkJCSAgICAodW5zaWduZWQgaW50KSAoRikpKQorI2lmZGVmIF9feDg2XzY0X18KKyNkZWZpbmUgX19sd3B2YWw2NChEMiwgRDEsIEYpIFwKKyAgKF9fYnVpbHRpbl9pYTMyX2x3cHZhbDY0ICgodW5zaWduZWQgbG9uZyBsb25nKSAoRDIpLCAodW5zaWduZWQgaW50KSAoRDEpLCBcCisJCQkgICAgKHVuc2lnbmVkIGludCkgKEYpKSkKKyNlbmRpZgorI2VuZGlmCisKKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGNoYXIgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2x3cGluczMyICh1bnNpZ25lZCBpbnQgZGF0YTIsIHVuc2lnbmVkIGludCBkYXRhMSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfbHdwaW5zMzIgKGRhdGEyLCBkYXRhMSwgZmxhZ3MpOworfQorCisjaWZkZWYgX194ODZfNjRfXworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGNoYXIgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2x3cGluczY0ICh1bnNpZ25lZCBsb25nIGxvbmcgZGF0YTIsIHVuc2lnbmVkIGludCBkYXRhMSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfbHdwaW5zNjQgKGRhdGEyLCBkYXRhMSwgZmxhZ3MpOworfQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBfX2x3cGluczMyKEQyLCBEMSwgRikgXAorICAoX19idWlsdGluX2lhMzJfbHdwaW5zMzIgKCh1bnNpZ25lZCBpbnQpIChEMiksICh1bnNpZ25lZCBpbnQpIChEMSksIFwKKwkJCSAgICAodW5zaWduZWQgaW50KSAoRikpKQorI2lmZGVmIF9feDg2XzY0X18KKyNkZWZpbmUgX19sd3BpbnM2NChEMiwgRDEsIEYpIFwKKyAgKF9fYnVpbHRpbl9pYTMyX2x3cGluczY0ICgodW5zaWduZWQgbG9uZyBsb25nKSAoRDIpLCAodW5zaWduZWQgaW50KSAoRDEpLCBcCisJCQkgICAgKHVuc2lnbmVkIGludCkgKEYpKSkKKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0xXUF9fICovCisKKyNlbmRpZiAvKiBfTFdQSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL2x6Y250aW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9semNudGludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzODJiYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9semNudGludHJpbi5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWYgIWRlZmluZWQgX1g4NklOVFJJTl9IX0lOQ0xVREVEICYmICFkZWZpbmVkIF9JTU1JTlRSSU5fSF9JTkNMVURFRAorIyBlcnJvciAiTmV2ZXIgdXNlIDxsemNudGludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8eDg2aW50cmluLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX19MWkNOVF9fCisjIGVycm9yICJMWkNOVCBpbnN0cnVjdGlvbiBpcyBub3QgZW5hYmxlZCIKKyNlbmRpZiAvKiBfX0xaQ05UX18gKi8KKworI2lmbmRlZiBfTFpDTlRJTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfTFpDTlRJTlRSSU5fSF9JTkNMVURFRAorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgc2hvcnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2x6Y250MTYgKHVuc2lnbmVkIHNob3J0IF9fWCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9jbHpzIChfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19semNudDMyICh1bnNpZ25lZCBpbnQgX19YKQoreworICByZXR1cm4gX19idWlsdGluX2NseiAoX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19semNudF91MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fY2x6IChfX1gpOworfQorCisjaWZkZWYgX194ODZfNjRfXworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fbHpjbnQ2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9jbHpsbCAoX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19semNudF91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fY2x6bGwgKF9fWCk7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9MWkNOVElOVFJJTl9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9tbTNkbm93LmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9tbTNkbm93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U4MDZiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL21tM2Rub3cuaApAQCAtMCwwICsxLDIxMCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIEltcGxlbWVudGVkIGZyb20gdGhlIG1tM2Rub3cuaCAob2Ygc3VwcG9zZWRseSBBTUQgb3JpZ2luKSBpbmNsdWRlZCB3aXRoCisgICBNU1ZDIDcuMS4gICovCisKKyNpZm5kZWYgX01NM0ROT1dfSF9JTkNMVURFRAorI2RlZmluZSBfTU0zRE5PV19IX0lOQ0xVREVECisKKyNpZmRlZiBfXzNkTk9XX18KKworI2luY2x1ZGUgPG1taW50cmluLmg+CisjaW5jbHVkZSA8cHJmY2h3aW50cmluLmg+CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fZmVtbXMgKHZvaWQpCit7CisgIF9fYnVpbHRpbl9pYTMyX2ZlbW1zKCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3Bhdmd1c2IgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3Bhdmd1c2IgKChfX3Y4cWkpX19BLCAoX192OHFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmMmlkIChfX202NCBfX0EpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGYyaWQgKChfX3Yyc2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGZhY2MgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmYWNjICgoX192MnNmKV9fQSwgKF9fdjJzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wZmFkZCAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZhZGQgKChfX3Yyc2YpX19BLCAoX192MnNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmY21wZXEgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmY21wZXEgKChfX3Yyc2YpX19BLCAoX192MnNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmY21wZ2UgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmY21wZ2UgKChfX3Yyc2YpX19BLCAoX192MnNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmY21wZ3QgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmY21wZ3QgKChfX3Yyc2YpX19BLCAoX192MnNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmbWF4IChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wZm1heCAoKF9fdjJzZilfX0EsIChfX3Yyc2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGZtaW4gKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmbWluICgoX192MnNmKV9fQSwgKF9fdjJzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wZm11bCAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZtdWwgKChfX3Yyc2YpX19BLCAoX192MnNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmcmNwIChfX202NCBfX0EpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZyY3AgKChfX3Yyc2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGZyY3BpdDEgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmcmNwaXQxICgoX192MnNmKV9fQSwgKF9fdjJzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wZnJjcGl0MiAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZyY3BpdDIgKChfX3Yyc2YpX19BLCAoX192MnNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmcnNxcnQgKF9fbTY0IF9fQSkKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wZnJzcXJ0ICgoX192MnNmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmcnNxaXQxIChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wZnJzcWl0MSAoKF9fdjJzZilfX0EsIChfX3Yyc2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGZzdWIgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3Bmc3ViICgoX192MnNmKV9fQSwgKF9fdjJzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wZnN1YnIgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3Bmc3ViciAoKF9fdjJzZilfX0EsIChfX3Yyc2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGkyZmQgKF9fbTY0IF9fQSkKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9waTJmZCAoKF9fdjJzaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wbXVsaHJ3IChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wbXVsaHJ3ICgoX192NGhpKV9fQSwgKF9fdjRoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3ByZWZldGNoICh2b2lkICpfX1ApCit7CisgIF9fYnVpbHRpbl9wcmVmZXRjaCAoX19QLCAwLCAzIC8qIF9NTV9ISU5UX1QwICovKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fZnJvbV9mbG9hdCAoZmxvYXQgX19BKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tNjQpKF9fdjJzZil7IF9fQSwgMC4wZiB9OworfQorCitleHRlcm4gX19pbmxpbmUgZmxvYXQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV90b19mbG9hdCAoX19tNjQgX19BKQoreworICB1bmlvbiB7IF9fdjJzZiB2OyBmbG9hdCBhWzJdOyB9IF9fdG1wOworICBfX3RtcC52ID0gKF9fdjJzZilfX0E7CisgIHJldHVybiBfX3RtcC5hWzBdOworfQorCisjaWZkZWYgX18zZE5PV19BX18KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGYyaXcgKF9fbTY0IF9fQSkKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wZjJpdyAoKF9fdjJzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wZm5hY2MgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmbmFjYyAoKF9fdjJzZilfX0EsIChfX3Yyc2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGZwbmFjYyAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZwbmFjYyAoKF9fdjJzZilfX0EsIChfX3Yyc2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGkyZncgKF9fbTY0IF9fQSkKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9waTJmdyAoKF9fdjJzaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc3dhcGQgKF9fbTY0IF9fQSkKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wc3dhcGRzZiAoKF9fdjJzZilfX0EpOworfQorCisjZW5kaWYgLyogX18zZE5PV19BX18gKi8KKyNlbmRpZiAvKiBfXzNkTk9XX18gKi8KKworI2VuZGlmIC8qIF9NTTNETk9XX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL21tX21hbGxvYy5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvbW1fbWFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyZDFhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL21tX21hbGxvYy5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9NTV9NQUxMT0NfSF9JTkNMVURFRAorI2RlZmluZSBfTU1fTUFMTE9DX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWYgIWRlZmluZWQoX19BTkRST0lEX18pIHx8IGRlZmluZWQoSEFWRV9QT1NJWF9NRU1BTElHTikKKy8qIFdlIGNhbid0IGRlcGVuZCBvbiA8c3RkbGliLmg+IHNpbmNlIHRoZSBwcm90b3R5cGUgb2YgcG9zaXhfbWVtYWxpZ24KKyAgIG1heSBub3QgYmUgdmlzaWJsZS4gICovCisjaWZuZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gaW50IHBvc2l4X21lbWFsaWduICh2b2lkICoqLCBzaXplX3QsIHNpemVfdCk7CisjZWxzZQorZXh0ZXJuICJDIiBpbnQgcG9zaXhfbWVtYWxpZ24gKHZvaWQgKiosIHNpemVfdCwgc2l6ZV90KSB0aHJvdyAoKTsKKyNlbmRpZgorI2VuZGlmCisKK3N0YXRpYyBfX2lubGluZSB2b2lkICoKK19tbV9tYWxsb2MgKHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ25tZW50KQoreworICB2b2lkICpwdHI7CisgIGlmIChhbGlnbm1lbnQgPT0gMSkKKyAgICByZXR1cm4gbWFsbG9jIChzaXplKTsKKyAgaWYgKGFsaWdubWVudCA9PSAyIHx8IChzaXplb2YgKHZvaWQgKikgPT0gOCAmJiBhbGlnbm1lbnQgPT0gNCkpCisgICAgYWxpZ25tZW50ID0gc2l6ZW9mICh2b2lkICopOworI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9fKSB8fCBkZWZpbmVkKEhBVkVfUE9TSVhfTUVNQUxJR04pCisgIGlmIChwb3NpeF9tZW1hbGlnbiAoJnB0ciwgYWxpZ25tZW50LCBzaXplKSA9PSAwKQorICAgIHJldHVybiBwdHI7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKKyNlbHNlCisgIHJldHVybiBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitfbW1fZnJlZSAodm9pZCAqIHB0cikKK3sKKyAgZnJlZSAocHRyKTsKK30KKworI2VuZGlmIC8qIF9NTV9NQUxMT0NfSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvbW1pbnRyaW4uaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL21taW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc2MjAzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL21taW50cmluLmgKQEAgLTAsMCArMSw5MjAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBJbXBsZW1lbnRlZCBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGluY2x1ZGVkIGluIHRoZSBJbnRlbCBDKysgQ29tcGlsZXIKKyAgIFVzZXIgR3VpZGUgYW5kIFJlZmVyZW5jZSwgdmVyc2lvbiA5LjAuICAqLworCisjaWZuZGVmIF9NTUlOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9NTUlOVFJJTl9IX0lOQ0xVREVECisKKyNpZm5kZWYgX19NTVhfXworIyBlcnJvciAiTU1YIGluc3RydWN0aW9uIHNldCBub3QgZW5hYmxlZCIKKyNlbHNlCisvKiBUaGUgSW50ZWwgQVBJIGlzIGZsZXhpYmxlIGVub3VnaCB0aGF0IHdlIG11c3QgYWxsb3cgYWxpYXNpbmcgd2l0aCBvdGhlcgorICAgdmVjdG9yIHR5cGVzLCBhbmQgdGhlaXIgc2NhbGFyIGNvbXBvbmVudHMuICAqLwordHlwZWRlZiBpbnQgX19tNjQgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoOCksIF9fbWF5X2FsaWFzX18pKTsKKworLyogSW50ZXJuYWwgZGF0YSB0eXBlcyBmb3IgaW1wbGVtZW50aW5nIHRoZSBpbnRyaW5zaWNzLiAgKi8KK3R5cGVkZWYgaW50IF9fdjJzaSBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICg4KSkpOwordHlwZWRlZiBzaG9ydCBfX3Y0aGkgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoOCkpKTsKK3R5cGVkZWYgY2hhciBfX3Y4cWkgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoOCkpKTsKK3R5cGVkZWYgbG9uZyBsb25nIF9fdjFkaSBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICg4KSkpOwordHlwZWRlZiBmbG9hdCBfX3Yyc2YgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoOCkpKTsKKworLyogRW1wdHkgdGhlIG11bHRpbWVkaWEgc3RhdGUuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZW1wdHkgKHZvaWQpCit7CisgIF9fYnVpbHRpbl9pYTMyX2VtbXMgKCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fZW1wdHkgKHZvaWQpCit7CisgIF9tbV9lbXB0eSAoKTsKK30KKworLyogQ29udmVydCBJIHRvIGEgX19tNjQgb2JqZWN0LiAgVGhlIGludGVnZXIgaXMgemVyby1leHRlbmRlZCB0byA2NC1iaXRzLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCAgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2kzMl9zaTY0IChpbnQgX19pKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl92ZWNfaW5pdF92MnNpIChfX2ksIDApOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fZnJvbV9pbnQgKGludCBfX2kpCit7CisgIHJldHVybiBfbW1fY3Z0c2kzMl9zaTY0IChfX2kpOworfQorCisjaWZkZWYgX194ODZfNjRfXworLyogQ29udmVydCBJIHRvIGEgX19tNjQgb2JqZWN0LiAgKi8KKworLyogSW50ZWwgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCAgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9mcm9tX2ludDY0IChsb25nIGxvbmcgX19pKQoreworICByZXR1cm4gKF9fbTY0KSBfX2k7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCAgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2k2NF9tNjQgKGxvbmcgbG9uZyBfX2kpCit7CisgIHJldHVybiAoX19tNjQpIF9faTsKK30KKworLyogTWljcm9zb2Z0IGludHJpbnNpYy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNpNjR4X3NpNjQgKGxvbmcgbG9uZyBfX2kpCit7CisgIHJldHVybiAoX19tNjQpIF9faTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0ICBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRfcGk2NHggKGxvbmcgbG9uZyBfX2kpCit7CisgIHJldHVybiAoX19tNjQpIF9faTsKK30KKyNlbmRpZgorCisvKiBDb252ZXJ0IHRoZSBsb3dlciAzMiBiaXRzIG9mIHRoZSBfX202NCBvYmplY3QgaW50byBhbiBpbnRlZ2VyLiAgKi8KK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2k2NF9zaTMyIChfX202NCBfX2kpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3Yyc2kgKChfX3Yyc2kpX19pLCAwKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3RvX2ludCAoX19tNjQgX19pKQoreworICByZXR1cm4gX21tX2N2dHNpNjRfc2kzMiAoX19pKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KKy8qIENvbnZlcnQgdGhlIF9fbTY0IG9iamVjdCB0byBhIDY0Yml0IGludGVnZXIuICAqLworCisvKiBJbnRlbCBpbnRyaW5zaWMuICAqLworZXh0ZXJuIF9faW5saW5lIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3RvX2ludDY0IChfX202NCBfX2kpCit7CisgIHJldHVybiAobG9uZyBsb25nKV9faTsKK30KKworZXh0ZXJuIF9faW5saW5lIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRtNjRfc2k2NCAoX19tNjQgX19pKQoreworICByZXR1cm4gKGxvbmcgbG9uZylfX2k7Cit9CisKKy8qIE1pY3Jvc29mdCBpbnRyaW5zaWMuICAqLworZXh0ZXJuIF9faW5saW5lIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzaTY0X3NpNjR4IChfX202NCBfX2kpCit7CisgIHJldHVybiAobG9uZyBsb25nKV9faTsKK30KKyNlbmRpZgorCisvKiBQYWNrIHRoZSBmb3VyIDE2LWJpdCB2YWx1ZXMgZnJvbSBNMSBpbnRvIHRoZSBsb3dlciBmb3VyIDgtYml0IHZhbHVlcyBvZgorICAgdGhlIHJlc3VsdCwgYW5kIHRoZSBmb3VyIDE2LWJpdCB2YWx1ZXMgZnJvbSBNMiBpbnRvIHRoZSB1cHBlciBmb3VyIDgtYml0CisgICB2YWx1ZXMgb2YgdGhlIHJlc3VsdCwgYWxsIHdpdGggc2lnbmVkIHNhdHVyYXRpb24uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3BhY2tzX3BpMTYgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BhY2tzc3diICgoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BhY2tzc3diIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX3BhY2tzX3BpMTYgKF9fbTEsIF9fbTIpOworfQorCisvKiBQYWNrIHRoZSB0d28gMzItYml0IHZhbHVlcyBmcm9tIE0xIGluIHRvIHRoZSBsb3dlciB0d28gMTYtYml0IHZhbHVlcyBvZgorICAgdGhlIHJlc3VsdCwgYW5kIHRoZSB0d28gMzItYml0IHZhbHVlcyBmcm9tIE0yIGludG8gdGhlIHVwcGVyIHR3byAxNi1iaXQKKyAgIHZhbHVlcyBvZiB0aGUgcmVzdWx0LCBhbGwgd2l0aCBzaWduZWQgc2F0dXJhdGlvbi4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcGFja3NfcGkzMiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGFja3NzZHcgKChfX3Yyc2kpX19tMSwgKF9fdjJzaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGFja3NzZHcgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fcGFja3NfcGkzMiAoX19tMSwgX19tMik7Cit9CisKKy8qIFBhY2sgdGhlIGZvdXIgMTYtYml0IHZhbHVlcyBmcm9tIE0xIGludG8gdGhlIGxvd2VyIGZvdXIgOC1iaXQgdmFsdWVzIG9mCisgICB0aGUgcmVzdWx0LCBhbmQgdGhlIGZvdXIgMTYtYml0IHZhbHVlcyBmcm9tIE0yIGludG8gdGhlIHVwcGVyIGZvdXIgOC1iaXQKKyAgIHZhbHVlcyBvZiB0aGUgcmVzdWx0LCBhbGwgd2l0aCB1bnNpZ25lZCBzYXR1cmF0aW9uLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9wYWNrc19wdTE2IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wYWNrdXN3YiAoKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wYWNrdXN3YiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9wYWNrc19wdTE2IChfX20xLCBfX20yKTsKK30KKworLyogSW50ZXJsZWF2ZSB0aGUgZm91ciA4LWJpdCB2YWx1ZXMgZnJvbSB0aGUgaGlnaCBoYWxmIG9mIE0xIHdpdGggdGhlIGZvdXIKKyAgIDgtYml0IHZhbHVlcyBmcm9tIHRoZSBoaWdoIGhhbGYgb2YgTTIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3VucGFja2hpX3BpOCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHVucGNraGJ3ICgoX192OHFpKV9fbTEsIChfX3Y4cWkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3B1bnBja2hidyAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV91bnBhY2toaV9waTggKF9fbTEsIF9fbTIpOworfQorCisvKiBJbnRlcmxlYXZlIHRoZSB0d28gMTYtYml0IHZhbHVlcyBmcm9tIHRoZSBoaWdoIGhhbGYgb2YgTTEgd2l0aCB0aGUgdHdvCisgICAxNi1iaXQgdmFsdWVzIGZyb20gdGhlIGhpZ2ggaGFsZiBvZiBNMi4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdW5wYWNraGlfcGkxNiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHVucGNraHdkICgoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3B1bnBja2h3ZCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV91bnBhY2toaV9waTE2IChfX20xLCBfX20yKTsKK30KKworLyogSW50ZXJsZWF2ZSB0aGUgMzItYml0IHZhbHVlIGZyb20gdGhlIGhpZ2ggaGFsZiBvZiBNMSB3aXRoIHRoZSAzMi1iaXQKKyAgIHZhbHVlIGZyb20gdGhlIGhpZ2ggaGFsZiBvZiBNMi4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdW5wYWNraGlfcGkzMiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHVucGNraGRxICgoX192MnNpKV9fbTEsIChfX3Yyc2kpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3B1bnBja2hkcSAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV91bnBhY2toaV9waTMyIChfX20xLCBfX20yKTsKK30KKworLyogSW50ZXJsZWF2ZSB0aGUgZm91ciA4LWJpdCB2YWx1ZXMgZnJvbSB0aGUgbG93IGhhbGYgb2YgTTEgd2l0aCB0aGUgZm91cgorICAgOC1iaXQgdmFsdWVzIGZyb20gdGhlIGxvdyBoYWxmIG9mIE0yLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91bnBhY2tsb19waTggKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3B1bnBja2xidyAoKF9fdjhxaSlfX20xLCAoX192OHFpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wdW5wY2tsYncgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fdW5wYWNrbG9fcGk4IChfX20xLCBfX20yKTsKK30KKworLyogSW50ZXJsZWF2ZSB0aGUgdHdvIDE2LWJpdCB2YWx1ZXMgZnJvbSB0aGUgbG93IGhhbGYgb2YgTTEgd2l0aCB0aGUgdHdvCisgICAxNi1iaXQgdmFsdWVzIGZyb20gdGhlIGxvdyBoYWxmIG9mIE0yLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91bnBhY2tsb19waTE2IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wdW5wY2tsd2QgKChfX3Y0aGkpX19tMSwgKF9fdjRoaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHVucGNrbHdkIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX3VucGFja2xvX3BpMTYgKF9fbTEsIF9fbTIpOworfQorCisvKiBJbnRlcmxlYXZlIHRoZSAzMi1iaXQgdmFsdWUgZnJvbSB0aGUgbG93IGhhbGYgb2YgTTEgd2l0aCB0aGUgMzItYml0CisgICB2YWx1ZSBmcm9tIHRoZSBsb3cgaGFsZiBvZiBNMi4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdW5wYWNrbG9fcGkzMiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHVucGNrbGRxICgoX192MnNpKV9fbTEsIChfX3Yyc2kpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3B1bnBja2xkcSAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV91bnBhY2tsb19waTMyIChfX20xLCBfX20yKTsKK30KKworLyogQWRkIHRoZSA4LWJpdCB2YWx1ZXMgaW4gTTEgdG8gdGhlIDgtYml0IHZhbHVlcyBpbiBNMi4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWRkX3BpOCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGFkZGIgKChfX3Y4cWkpX19tMSwgKF9fdjhxaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGFkZGIgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fYWRkX3BpOCAoX19tMSwgX19tMik7Cit9CisKKy8qIEFkZCB0aGUgMTYtYml0IHZhbHVlcyBpbiBNMSB0byB0aGUgMTYtYml0IHZhbHVlcyBpbiBNMi4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWRkX3BpMTYgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BhZGR3ICgoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BhZGR3IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX2FkZF9waTE2IChfX20xLCBfX20yKTsKK30KKworLyogQWRkIHRoZSAzMi1iaXQgdmFsdWVzIGluIE0xIHRvIHRoZSAzMi1iaXQgdmFsdWVzIGluIE0yLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRfcGkzMiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGFkZGQgKChfX3Yyc2kpX19tMSwgKF9fdjJzaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGFkZGQgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fYWRkX3BpMzIgKF9fbTEsIF9fbTIpOworfQorCisvKiBBZGQgdGhlIDY0LWJpdCB2YWx1ZXMgaW4gTTEgdG8gdGhlIDY0LWJpdCB2YWx1ZXMgaW4gTTIuICAqLworI2lmZGVmIF9fU1NFMl9fCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWRkX3NpNjQgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BhZGRxICgoX192MWRpKV9fbTEsIChfX3YxZGkpX19tMik7Cit9CisjZW5kaWYKKworLyogQWRkIHRoZSA4LWJpdCB2YWx1ZXMgaW4gTTEgdG8gdGhlIDgtYml0IHZhbHVlcyBpbiBNMiB1c2luZyBzaWduZWQKKyAgIHNhdHVyYXRlZCBhcml0aG1ldGljLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRzX3BpOCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGFkZHNiICgoX192OHFpKV9fbTEsIChfX3Y4cWkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BhZGRzYiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9hZGRzX3BpOCAoX19tMSwgX19tMik7Cit9CisKKy8qIEFkZCB0aGUgMTYtYml0IHZhbHVlcyBpbiBNMSB0byB0aGUgMTYtYml0IHZhbHVlcyBpbiBNMiB1c2luZyBzaWduZWQKKyAgIHNhdHVyYXRlZCBhcml0aG1ldGljLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRzX3BpMTYgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BhZGRzdyAoKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wYWRkc3cgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fYWRkc19waTE2IChfX20xLCBfX20yKTsKK30KKworLyogQWRkIHRoZSA4LWJpdCB2YWx1ZXMgaW4gTTEgdG8gdGhlIDgtYml0IHZhbHVlcyBpbiBNMiB1c2luZyB1bnNpZ25lZAorICAgc2F0dXJhdGVkIGFyaXRobWV0aWMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZHNfcHU4IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wYWRkdXNiICgoX192OHFpKV9fbTEsIChfX3Y4cWkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BhZGR1c2IgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fYWRkc19wdTggKF9fbTEsIF9fbTIpOworfQorCisvKiBBZGQgdGhlIDE2LWJpdCB2YWx1ZXMgaW4gTTEgdG8gdGhlIDE2LWJpdCB2YWx1ZXMgaW4gTTIgdXNpbmcgdW5zaWduZWQKKyAgIHNhdHVyYXRlZCBhcml0aG1ldGljLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRzX3B1MTYgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BhZGR1c3cgKChfX3Y0aGkpX19tMSwgKF9fdjRoaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGFkZHVzdyAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9hZGRzX3B1MTYgKF9fbTEsIF9fbTIpOworfQorCisvKiBTdWJ0cmFjdCB0aGUgOC1iaXQgdmFsdWVzIGluIE0yIGZyb20gdGhlIDgtYml0IHZhbHVlcyBpbiBNMS4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3ViX3BpOCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHN1YmIgKChfX3Y4cWkpX19tMSwgKF9fdjhxaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHN1YmIgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fc3ViX3BpOCAoX19tMSwgX19tMik7Cit9CisKKy8qIFN1YnRyYWN0IHRoZSAxNi1iaXQgdmFsdWVzIGluIE0yIGZyb20gdGhlIDE2LWJpdCB2YWx1ZXMgaW4gTTEuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1Yl9waTE2IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc3VidyAoKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc3VidyAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9zdWJfcGkxNiAoX19tMSwgX19tMik7Cit9CisKKy8qIFN1YnRyYWN0IHRoZSAzMi1iaXQgdmFsdWVzIGluIE0yIGZyb20gdGhlIDMyLWJpdCB2YWx1ZXMgaW4gTTEuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1Yl9waTMyIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc3ViZCAoKF9fdjJzaSlfX20xLCAoX192MnNpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc3ViZCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9zdWJfcGkzMiAoX19tMSwgX19tMik7Cit9CisKKy8qIEFkZCB0aGUgNjQtYml0IHZhbHVlcyBpbiBNMSB0byB0aGUgNjQtYml0IHZhbHVlcyBpbiBNMi4gICovCisjaWZkZWYgX19TU0UyX18KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdWJfc2k2NCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHN1YnEgKChfX3YxZGkpX19tMSwgKF9fdjFkaSlfX20yKTsKK30KKyNlbmRpZgorCisvKiBTdWJ0cmFjdCB0aGUgOC1iaXQgdmFsdWVzIGluIE0yIGZyb20gdGhlIDgtYml0IHZhbHVlcyBpbiBNMSB1c2luZyBzaWduZWQKKyAgIHNhdHVyYXRpbmcgYXJpdGhtZXRpYy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3Vic19waTggKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzdWJzYiAoKF9fdjhxaSlfX20xLCAoX192OHFpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc3Vic2IgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fc3Vic19waTggKF9fbTEsIF9fbTIpOworfQorCisvKiBTdWJ0cmFjdCB0aGUgMTYtYml0IHZhbHVlcyBpbiBNMiBmcm9tIHRoZSAxNi1iaXQgdmFsdWVzIGluIE0xIHVzaW5nCisgICBzaWduZWQgc2F0dXJhdGluZyBhcml0aG1ldGljLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdWJzX3BpMTYgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzdWJzdyAoKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc3Vic3cgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fc3Vic19waTE2IChfX20xLCBfX20yKTsKK30KKworLyogU3VidHJhY3QgdGhlIDgtYml0IHZhbHVlcyBpbiBNMiBmcm9tIHRoZSA4LWJpdCB2YWx1ZXMgaW4gTTEgdXNpbmcKKyAgIHVuc2lnbmVkIHNhdHVyYXRpbmcgYXJpdGhtZXRpYy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3Vic19wdTggKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzdWJ1c2IgKChfX3Y4cWkpX19tMSwgKF9fdjhxaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHN1YnVzYiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9zdWJzX3B1OCAoX19tMSwgX19tMik7Cit9CisKKy8qIFN1YnRyYWN0IHRoZSAxNi1iaXQgdmFsdWVzIGluIE0yIGZyb20gdGhlIDE2LWJpdCB2YWx1ZXMgaW4gTTEgdXNpbmcKKyAgIHVuc2lnbmVkIHNhdHVyYXRpbmcgYXJpdGhtZXRpYy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3Vic19wdTE2IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc3VidXN3ICgoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzdWJ1c3cgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fc3Vic19wdTE2IChfX20xLCBfX20yKTsKK30KKworLyogTXVsdGlwbHkgZm91ciAxNi1iaXQgdmFsdWVzIGluIE0xIGJ5IGZvdXIgMTYtYml0IHZhbHVlcyBpbiBNMiBwcm9kdWNpbmcKKyAgIGZvdXIgMzItYml0IGludGVybWVkaWF0ZSByZXN1bHRzLCB3aGljaCBhcmUgdGhlbiBzdW1tZWQgYnkgcGFpcnMgdG8KKyAgIHByb2R1Y2UgdHdvIDMyLWJpdCByZXN1bHRzLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWRkX3BpMTYgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BtYWRkd2QgKChfX3Y0aGkpX19tMSwgKF9fdjRoaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcG1hZGR3ZCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9tYWRkX3BpMTYgKF9fbTEsIF9fbTIpOworfQorCisvKiBNdWx0aXBseSBmb3VyIHNpZ25lZCAxNi1iaXQgdmFsdWVzIGluIE0xIGJ5IGZvdXIgc2lnbmVkIDE2LWJpdCB2YWx1ZXMgaW4KKyAgIE0yIGFuZCBwcm9kdWNlIHRoZSBoaWdoIDE2IGJpdHMgb2YgdGhlIDMyLWJpdCByZXN1bHRzLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tdWxoaV9waTE2IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wbXVsaHcgKChfX3Y0aGkpX19tMSwgKF9fdjRoaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcG11bGh3IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX211bGhpX3BpMTYgKF9fbTEsIF9fbTIpOworfQorCisvKiBNdWx0aXBseSBmb3VyIDE2LWJpdCB2YWx1ZXMgaW4gTTEgYnkgZm91ciAxNi1iaXQgdmFsdWVzIGluIE0yIGFuZCBwcm9kdWNlCisgICB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIHJlc3VsdHMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX211bGxvX3BpMTYgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BtdWxsdyAoKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wbXVsbHcgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fbXVsbG9fcGkxNiAoX19tMSwgX19tMik7Cit9CisKKy8qIFNoaWZ0IGZvdXIgMTYtYml0IHZhbHVlcyBpbiBNIGxlZnQgYnkgQ09VTlQuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NsbF9waTE2IChfX202NCBfX20sIF9fbTY0IF9fY291bnQpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzbGx3ICgoX192NGhpKV9fbSwgKF9fdjRoaSlfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHNsbHcgKF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgcmV0dXJuIF9tbV9zbGxfcGkxNiAoX19tLCBfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NsbGlfcGkxNiAoX19tNjQgX19tLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHNsbHdpICgoX192NGhpKV9fbSwgX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzbGx3aSAoX19tNjQgX19tLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIF9tbV9zbGxpX3BpMTYgKF9fbSwgX19jb3VudCk7Cit9CisKKy8qIFNoaWZ0IHR3byAzMi1iaXQgdmFsdWVzIGluIE0gbGVmdCBieSBDT1VOVC4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2xsX3BpMzIgKF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHNsbGQgKChfX3Yyc2kpX19tLCAoX192MnNpKV9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc2xsZCAoX19tNjQgX19tLCBfX202NCBfX2NvdW50KQoreworICByZXR1cm4gX21tX3NsbF9waTMyIChfX20sIF9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2xsaV9waTMyIChfX202NCBfX20sIGludCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc2xsZGkgKChfX3Yyc2kpX19tLCBfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHNsbGRpIChfX202NCBfX20sIGludCBfX2NvdW50KQoreworICByZXR1cm4gX21tX3NsbGlfcGkzMiAoX19tLCBfX2NvdW50KTsKK30KKworLyogU2hpZnQgdGhlIDY0LWJpdCB2YWx1ZSBpbiBNIGxlZnQgYnkgQ09VTlQuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NsbF9zaTY0IChfX202NCBfX20sIF9fbTY0IF9fY291bnQpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzbGxxICgoX192MWRpKV9fbSwgKF9fdjFkaSlfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHNsbHEgKF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgcmV0dXJuIF9tbV9zbGxfc2k2NCAoX19tLCBfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NsbGlfc2k2NCAoX19tNjQgX19tLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHNsbHFpICgoX192MWRpKV9fbSwgX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzbGxxaSAoX19tNjQgX19tLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIF9tbV9zbGxpX3NpNjQgKF9fbSwgX19jb3VudCk7Cit9CisKKy8qIFNoaWZ0IGZvdXIgMTYtYml0IHZhbHVlcyBpbiBNIHJpZ2h0IGJ5IENPVU5UOyBzaGlmdCBpbiB0aGUgc2lnbiBiaXQuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NyYV9waTE2IChfX202NCBfX20sIF9fbTY0IF9fY291bnQpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzcmF3ICgoX192NGhpKV9fbSwgKF9fdjRoaSlfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHNyYXcgKF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgcmV0dXJuIF9tbV9zcmFfcGkxNiAoX19tLCBfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NyYWlfcGkxNiAoX19tNjQgX19tLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHNyYXdpICgoX192NGhpKV9fbSwgX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzcmF3aSAoX19tNjQgX19tLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIF9tbV9zcmFpX3BpMTYgKF9fbSwgX19jb3VudCk7Cit9CisKKy8qIFNoaWZ0IHR3byAzMi1iaXQgdmFsdWVzIGluIE0gcmlnaHQgYnkgQ09VTlQ7IHNoaWZ0IGluIHRoZSBzaWduIGJpdC4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JhX3BpMzIgKF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHNyYWQgKChfX3Yyc2kpX19tLCAoX192MnNpKV9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc3JhZCAoX19tNjQgX19tLCBfX202NCBfX2NvdW50KQoreworICByZXR1cm4gX21tX3NyYV9waTMyIChfX20sIF9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JhaV9waTMyIChfX202NCBfX20sIGludCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc3JhZGkgKChfX3Yyc2kpX19tLCBfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHNyYWRpIChfX202NCBfX20sIGludCBfX2NvdW50KQoreworICByZXR1cm4gX21tX3NyYWlfcGkzMiAoX19tLCBfX2NvdW50KTsKK30KKworLyogU2hpZnQgZm91ciAxNi1iaXQgdmFsdWVzIGluIE0gcmlnaHQgYnkgQ09VTlQ7IHNoaWZ0IGluIHplcm9zLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmxfcGkxNiAoX19tNjQgX19tLCBfX202NCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc3JsdyAoKF9fdjRoaSlfX20sIChfX3Y0aGkpX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3Bzcmx3IChfX202NCBfX20sIF9fbTY0IF9fY291bnQpCit7CisgIHJldHVybiBfbW1fc3JsX3BpMTYgKF9fbSwgX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmxpX3BpMTYgKF9fbTY0IF9fbSwgaW50IF9fY291bnQpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3Bzcmx3aSAoKF9fdjRoaSlfX20sIF9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc3Jsd2kgKF9fbTY0IF9fbSwgaW50IF9fY291bnQpCit7CisgIHJldHVybiBfbW1fc3JsaV9waTE2IChfX20sIF9fY291bnQpOworfQorCisvKiBTaGlmdCB0d28gMzItYml0IHZhbHVlcyBpbiBNIHJpZ2h0IGJ5IENPVU5UOyBzaGlmdCBpbiB6ZXJvcy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JsX3BpMzIgKF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHNybGQgKChfX3Yyc2kpX19tLCAoX192MnNpKV9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc3JsZCAoX19tNjQgX19tLCBfX202NCBfX2NvdW50KQoreworICByZXR1cm4gX21tX3NybF9waTMyIChfX20sIF9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JsaV9waTMyIChfX202NCBfX20sIGludCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc3JsZGkgKChfX3Yyc2kpX19tLCBfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHNybGRpIChfX202NCBfX20sIGludCBfX2NvdW50KQoreworICByZXR1cm4gX21tX3NybGlfcGkzMiAoX19tLCBfX2NvdW50KTsKK30KKworLyogU2hpZnQgdGhlIDY0LWJpdCB2YWx1ZSBpbiBNIGxlZnQgYnkgQ09VTlQ7IHNoaWZ0IGluIHplcm9zLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmxfc2k2NCAoX19tNjQgX19tLCBfX202NCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc3JscSAoKF9fdjFkaSlfX20sIChfX3YxZGkpX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzcmxxIChfX202NCBfX20sIF9fbTY0IF9fY291bnQpCit7CisgIHJldHVybiBfbW1fc3JsX3NpNjQgKF9fbSwgX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmxpX3NpNjQgKF9fbTY0IF9fbSwgaW50IF9fY291bnQpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzcmxxaSAoKF9fdjFkaSlfX20sIF9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc3JscWkgKF9fbTY0IF9fbSwgaW50IF9fY291bnQpCit7CisgIHJldHVybiBfbW1fc3JsaV9zaTY0IChfX20sIF9fY291bnQpOworfQorCisvKiBCaXQtd2lzZSBBTkQgdGhlIDY0LWJpdCB2YWx1ZXMgaW4gTTEgYW5kIE0yLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hbmRfc2k2NCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3BhbmQgKF9fbTEsIF9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wYW5kIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX2FuZF9zaTY0IChfX20xLCBfX20yKTsKK30KKworLyogQml0LXdpc2UgY29tcGxlbWVudCB0aGUgNjQtYml0IHZhbHVlIGluIE0xIGFuZCBiaXQtd2lzZSBBTkQgaXQgd2l0aCB0aGUKKyAgIDY0LWJpdCB2YWx1ZSBpbiBNMi4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYW5kbm90X3NpNjQgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wYW5kbiAoX19tMSwgX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BhbmRuIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX2FuZG5vdF9zaTY0IChfX20xLCBfX20yKTsKK30KKworLyogQml0LXdpc2UgaW5jbHVzaXZlIE9SIHRoZSA2NC1iaXQgdmFsdWVzIGluIE0xIGFuZCBNMi4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fb3Jfc2k2NCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3BvciAoX19tMSwgX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BvciAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9vcl9zaTY0IChfX20xLCBfX20yKTsKK30KKworLyogQml0LXdpc2UgZXhjbHVzaXZlIE9SIHRoZSA2NC1iaXQgdmFsdWVzIGluIE0xIGFuZCBNMi4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1feG9yX3NpNjQgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9weG9yIChfX20xLCBfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHhvciAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV94b3Jfc2k2NCAoX19tMSwgX19tMik7Cit9CisKKy8qIENvbXBhcmUgZWlnaHQgOC1iaXQgdmFsdWVzLiAgVGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBpcyAweEZGIGlmIHRoZQorICAgdGVzdCBpcyB0cnVlIGFuZCB6ZXJvIGlmIGZhbHNlLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBlcV9waTggKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BjbXBlcWIgKChfX3Y4cWkpX19tMSwgKF9fdjhxaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGNtcGVxYiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9jbXBlcV9waTggKF9fbTEsIF9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZ3RfcGk4IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wY21wZ3RiICgoX192OHFpKV9fbTEsIChfX3Y4cWkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BjbXBndGIgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fY21wZ3RfcGk4IChfX20xLCBfX20yKTsKK30KKworLyogQ29tcGFyZSBmb3VyIDE2LWJpdCB2YWx1ZXMuICBUaGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGlzIDB4RkZGRiBpZgorICAgdGhlIHRlc3QgaXMgdHJ1ZSBhbmQgemVybyBpZiBmYWxzZS4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZXFfcGkxNiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGNtcGVxdyAoKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wY21wZXF3IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX2NtcGVxX3BpMTYgKF9fbTEsIF9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZ3RfcGkxNiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGNtcGd0dyAoKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wY21wZ3R3IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX2NtcGd0X3BpMTYgKF9fbTEsIF9fbTIpOworfQorCisvKiBDb21wYXJlIHR3byAzMi1iaXQgdmFsdWVzLiAgVGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBpcyAweEZGRkZGRkZGIGlmCisgICB0aGUgdGVzdCBpcyB0cnVlIGFuZCB6ZXJvIGlmIGZhbHNlLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBlcV9waTMyIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wY21wZXFkICgoX192MnNpKV9fbTEsIChfX3Yyc2kpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BjbXBlcWQgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fY21wZXFfcGkzMiAoX19tMSwgX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBndF9waTMyIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wY21wZ3RkICgoX192MnNpKV9fbTEsIChfX3Yyc2kpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BjbXBndGQgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fY21wZ3RfcGkzMiAoX19tMSwgX19tMik7Cit9CisKKy8qIENyZWF0ZXMgYSA2NC1iaXQgemVyby4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0emVyb19zaTY0ICh2b2lkKQoreworICByZXR1cm4gKF9fbTY0KTBMTDsKK30KKworLyogQ3JlYXRlcyBhIHZlY3RvciBvZiB0d28gMzItYml0IHZhbHVlczsgSTAgaXMgbGVhc3Qgc2lnbmlmaWNhbnQuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldF9waTMyIChpbnQgX19pMSwgaW50IF9faTApCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3ZlY19pbml0X3Yyc2kgKF9faTAsIF9faTEpOworfQorCisvKiBDcmVhdGVzIGEgdmVjdG9yIG9mIGZvdXIgMTYtYml0IHZhbHVlczsgVzAgaXMgbGVhc3Qgc2lnbmlmaWNhbnQuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldF9waTE2IChzaG9ydCBfX3czLCBzaG9ydCBfX3cyLCBzaG9ydCBfX3cxLCBzaG9ydCBfX3cwKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl92ZWNfaW5pdF92NGhpIChfX3cwLCBfX3cxLCBfX3cyLCBfX3czKTsKK30KKworLyogQ3JlYXRlcyBhIHZlY3RvciBvZiBlaWdodCA4LWJpdCB2YWx1ZXM7IEIwIGlzIGxlYXN0IHNpZ25pZmljYW50LiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRfcGk4IChjaGFyIF9fYjcsIGNoYXIgX19iNiwgY2hhciBfX2I1LCBjaGFyIF9fYjQsCisJICAgICBjaGFyIF9fYjMsIGNoYXIgX19iMiwgY2hhciBfX2IxLCBjaGFyIF9fYjApCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3ZlY19pbml0X3Y4cWkgKF9fYjAsIF9fYjEsIF9fYjIsIF9fYjMsCisJCQkJCSAgICAgICBfX2I0LCBfX2I1LCBfX2I2LCBfX2I3KTsKK30KKworLyogU2ltaWxhciwgYnV0IHdpdGggdGhlIGFyZ3VtZW50cyBpbiByZXZlcnNlIG9yZGVyLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRyX3BpMzIgKGludCBfX2kwLCBpbnQgX19pMSkKK3sKKyAgcmV0dXJuIF9tbV9zZXRfcGkzMiAoX19pMSwgX19pMCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRyX3BpMTYgKHNob3J0IF9fdzAsIHNob3J0IF9fdzEsIHNob3J0IF9fdzIsIHNob3J0IF9fdzMpCit7CisgIHJldHVybiBfbW1fc2V0X3BpMTYgKF9fdzMsIF9fdzIsIF9fdzEsIF9fdzApOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0cl9waTggKGNoYXIgX19iMCwgY2hhciBfX2IxLCBjaGFyIF9fYjIsIGNoYXIgX19iMywKKwkgICAgICBjaGFyIF9fYjQsIGNoYXIgX19iNSwgY2hhciBfX2I2LCBjaGFyIF9fYjcpCit7CisgIHJldHVybiBfbW1fc2V0X3BpOCAoX19iNywgX19iNiwgX19iNSwgX19iNCwgX19iMywgX19iMiwgX19iMSwgX19iMCk7Cit9CisKKy8qIENyZWF0ZXMgYSB2ZWN0b3Igb2YgdHdvIDMyLWJpdCB2YWx1ZXMsIGJvdGggZWxlbWVudHMgY29udGFpbmluZyBJLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXQxX3BpMzIgKGludCBfX2kpCit7CisgIHJldHVybiBfbW1fc2V0X3BpMzIgKF9faSwgX19pKTsKK30KKworLyogQ3JlYXRlcyBhIHZlY3RvciBvZiBmb3VyIDE2LWJpdCB2YWx1ZXMsIGFsbCBlbGVtZW50cyBjb250YWluaW5nIFcuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldDFfcGkxNiAoc2hvcnQgX193KQoreworICByZXR1cm4gX21tX3NldF9waTE2IChfX3csIF9fdywgX193LCBfX3cpOworfQorCisvKiBDcmVhdGVzIGEgdmVjdG9yIG9mIGVpZ2h0IDgtYml0IHZhbHVlcywgYWxsIGVsZW1lbnRzIGNvbnRhaW5pbmcgQi4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0MV9waTggKGNoYXIgX19iKQoreworICByZXR1cm4gX21tX3NldF9waTggKF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iKTsKK30KKworI2VuZGlmIC8qIF9fTU1YX18gKi8KKyNlbmRpZiAvKiBfTU1JTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvbm1taW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9ubW1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGZiZWQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvbm1taW50cmluLmgKQEAgLTAsMCArMSwzNyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIEltcGxlbWVudGVkIGZyb20gdGhlIHNwZWNpZmljYXRpb24gaW5jbHVkZWQgaW4gdGhlIEludGVsIEMrKyBDb21waWxlcgorICAgVXNlciBHdWlkZSBhbmQgUmVmZXJlbmNlLCB2ZXJzaW9uIDEwLjAuICAqLworCisjaWZuZGVmIF9OTU1JTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfTk1NSU5UUklOX0hfSU5DTFVERUQKKworI2lmbmRlZiBfX1NTRTRfMl9fCisjIGVycm9yICJTU0U0LjIgaW5zdHJ1Y3Rpb24gc2V0IG5vdCBlbmFibGVkIgorI2Vsc2UKKy8qIFdlIGp1c3QgaW5jbHVkZSBTU0U0LjEgaGVhZGVyIGZpbGUuICAqLworI2luY2x1ZGUgPHNtbWludHJpbi5oPgorI2VuZGlmIC8qIF9fU1NFNF8yX18gKi8KKworI2VuZGlmIC8qIF9OTU1JTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvcG1taW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9wbW1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzY5NTZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvcG1taW50cmluLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBJbXBsZW1lbnRlZCBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGluY2x1ZGVkIGluIHRoZSBJbnRlbCBDKysgQ29tcGlsZXIKKyAgIFVzZXIgR3VpZGUgYW5kIFJlZmVyZW5jZSwgdmVyc2lvbiA5LjAuICAqLworCisjaWZuZGVmIF9QTU1JTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfUE1NSU5UUklOX0hfSU5DTFVERUQKKworI2lmbmRlZiBfX1NTRTNfXworIyBlcnJvciAiU1NFMyBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZWxzZQorCisvKiBXZSBuZWVkIGRlZmluaXRpb25zIGZyb20gdGhlIFNTRTIgYW5kIFNTRSBoZWFkZXIgZmlsZXMqLworI2luY2x1ZGUgPGVtbWludHJpbi5oPgorCisvKiBBZGRpdGlvbmFsIGJpdHMgaW4gdGhlIE1YQ1NSLiAgKi8KKyNkZWZpbmUgX01NX0RFTk9STUFMU19aRVJPX01BU0sJCTB4MDA0MAorI2RlZmluZSBfTU1fREVOT1JNQUxTX1pFUk9fT04JCTB4MDA0MAorI2RlZmluZSBfTU1fREVOT1JNQUxTX1pFUk9fT0ZGCQkweDAwMDAKKworI2RlZmluZSBfTU1fU0VUX0RFTk9STUFMU19aRVJPX01PREUobW9kZSkgXAorICBfbW1fc2V0Y3NyICgoX21tX2dldGNzciAoKSAmIH5fTU1fREVOT1JNQUxTX1pFUk9fTUFTSykgfCAobW9kZSkpCisjZGVmaW5lIF9NTV9HRVRfREVOT1JNQUxTX1pFUk9fTU9ERSgpIFwKKyAgKF9tbV9nZXRjc3IoKSAmIF9NTV9ERU5PUk1BTFNfWkVST19NQVNLKQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZHN1Yl9wcyAoX19tMTI4IF9fWCwgX19tMTI4IF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2FkZHN1YnBzICgoX192NHNmKV9fWCwgKF9fdjRzZilfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hhZGRfcHMgKF9fbTEyOCBfX1gsIF9fbTEyOCBfX1kpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9oYWRkcHMgKChfX3Y0c2YpX19YLCAoX192NHNmKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faHN1Yl9wcyAoX19tMTI4IF9fWCwgX19tMTI4IF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2hzdWJwcyAoKF9fdjRzZilfX1gsIChfX3Y0c2YpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tb3ZlaGR1cF9wcyAoX19tMTI4IF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21vdnNoZHVwICgoX192NHNmKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbW92ZWxkdXBfcHMgKF9fbTEyOCBfX1gpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tb3ZzbGR1cCAoKF9fdjRzZilfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRzdWJfcGQgKF9fbTEyOGQgX19YLCBfX20xMjhkIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9hZGRzdWJwZCAoKF9fdjJkZilfX1gsIChfX3YyZGYpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZF9wZCAoX19tMTI4ZCBfX1gsIF9fbTEyOGQgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2hhZGRwZCAoKF9fdjJkZilfX1gsIChfX3YyZGYpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faHN1Yl9wZCAoX19tMTI4ZCBfX1gsIF9fbTEyOGQgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2hzdWJwZCAoKF9fdjJkZilfX1gsIChfX3YyZGYpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbG9hZGR1cF9wZCAoZG91YmxlIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiBfbW1fbG9hZDFfcGQgKF9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21vdmVkdXBfcGQgKF9fbTEyOGQgX19YKQoreworICByZXR1cm4gX21tX3NodWZmbGVfcGQgKF9fWCwgX19YLCBfTU1fU0hVRkZMRTIgKDAsMCkpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sZGRxdV9zaTEyOCAoX19tMTI4aSBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2xkZHF1ICgoY2hhciBjb25zdCAqKV9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21vbml0b3IgKHZvaWQgY29uc3QgKiBfX1AsIHVuc2lnbmVkIGludCBfX0UsIHVuc2lnbmVkIGludCBfX0gpCit7CisgIF9fYnVpbHRpbl9pYTMyX21vbml0b3IgKF9fUCwgX19FLCBfX0gpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9td2FpdCAodW5zaWduZWQgaW50IF9fRSwgdW5zaWduZWQgaW50IF9fSCkKK3sKKyAgX19idWlsdGluX2lhMzJfbXdhaXQgKF9fRSwgX19IKTsKK30KKworI2VuZGlmIC8qIF9fU1NFM19fICovCisKKyNlbmRpZiAvKiBfUE1NSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3BvcGNudGludHJpbi5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvcG9wY250aW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3ZWZkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3BvcGNudGludHJpbi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9fUE9QQ05UX18KKyMgZXJyb3IgIlBPUENOVCBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZW5kaWYgLyogX19QT1BDTlRfXyAqLworCisjaWZuZGVmIF9QT1BDTlRJTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfUE9QQ05USU5UUklOX0hfSU5DTFVERUQKKworLyogQ2FsY3VsYXRlIGEgbnVtYmVyIG9mIGJpdHMgc2V0IHRvIDEuICAqLworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9wb3BjbnRfdTMyICh1bnNpZ25lZCBpbnQgX19YKQoreworICByZXR1cm4gX19idWlsdGluX3BvcGNvdW50IChfX1gpOworfQorCisjaWZkZWYgX194ODZfNjRfXworZXh0ZXJuIF9faW5saW5lIGxvbmcgbG9uZyAgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcG9wY250X3U2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudGxsIChfX1gpOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfUE9QQ05USU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3ByZmNod2ludHJpbi5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvcHJmY2h3aW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwMTFiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3ByZmNod2ludHJpbi5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWYgIWRlZmluZWQgX1g4NklOVFJJTl9IX0lOQ0xVREVEICYmICFkZWZpbmVkIF9NTTNETk9XX0hfSU5DTFVERUQKKyMgZXJyb3IgIk5ldmVyIHVzZSA8cHJmY2h3aW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDx4ODZpbnRyaW4uaD4gb3IgPG1tM2Rub3cuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCisjaWYgIWRlZmluZWQgKF9fUFJGQ0hXX18pICYmICFkZWZpbmVkIChfXzNkTk9XX18pCisjIGVycm9yICJQUkZDSFcgaW5zdHJ1Y3Rpb24gbm90IGVuYWJsZWQiCisjZW5kaWYgLyogX19QUkZDSFdfXyBvciAgX18zZE5PV19fKi8KKworI2lmbmRlZiBfUFJGQ0hXSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX1BSRkNIV0lOVFJJTl9IX0lOQ0xVREVECisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHJlZmV0Y2h3ICh2b2lkICpfX1ApCit7CisgIF9fYnVpbHRpbl9wcmVmZXRjaCAoX19QLCAxLCAzIC8qIF9NTV9ISU5UX1QwICovKTsKK30KKworI2VuZGlmIC8qIF9QUkZDSFdJTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvcmRzZWVkaW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9yZHNlZWRpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzBjMjM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvcmRzZWVkaW50cmluLmgKQEAgLTAsMCArMSw1OCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZiAhZGVmaW5lZCBfWDg2SU5UUklOX0hfSU5DTFVERUQKKyMgZXJyb3IgIk5ldmVyIHVzZSA8cmRzZWVkaW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDx4ODZpbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfX1JEU0VFRF9fCisjIGVycm9yICJSRFNFRUQgaW5zdHJ1Y3Rpb24gbm90IGVuYWJsZWQiCisjZW5kaWYgLyogX19SRFNFRURfXyAqLworCisjaWZuZGVmIF9SRFNFRURJTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfUkRTRUVESU5UUklOX0hfSU5DTFVERUQKKworZXh0ZXJuIF9faW5saW5lIGludAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfcmRzZWVkMTZfc3RlcCAodW5zaWduZWQgc2hvcnQgKnApCit7CisgICAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Jkc2VlZF9oaV9zdGVwIChwKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfcmRzZWVkMzJfc3RlcCAodW5zaWduZWQgaW50ICpwKQoreworICAgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZHNlZWRfc2lfc3RlcCAocCk7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCitleHRlcm4gX19pbmxpbmUgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19yZHNlZWQ2NF9zdGVwICh1bnNpZ25lZCBsb25nIGxvbmcgKnApCit7CisgICAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Jkc2VlZF9kaV9zdGVwIChwKTsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX1JEU0VFRElOVFJJTl9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9ydG1pbnRyaW4uaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3J0bWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwM2E3NzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9ydG1pbnRyaW4uaApAQCAtMCwwICsxLDc3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfSU1NSU5UUklOX0hfSU5DTFVERUQKKyMgZXJyb3IgIk5ldmVyIHVzZSA8cnRtaW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxpbW1pbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfX1JUTV9fCisjIGVycm9yICJSVE0gaW5zdHJ1Y3Rpb24gc2V0IG5vdCBlbmFibGVkIgorI2VuZGlmIC8qIF9fUlRNX18gKi8KKworI2lmbmRlZiBfUlRNSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX1JUTUlOVFJJTl9IX0lOQ0xVREVECisKKyNkZWZpbmUgX1hCRUdJTl9TVEFSVEVECQkofjB1KQorI2RlZmluZSBfWEFCT1JUX0VYUExJQ0lUCSgxIDw8IDApCisjZGVmaW5lIF9YQUJPUlRfUkVUUlkJCSgxIDw8IDEpCisjZGVmaW5lIF9YQUJPUlRfQ09ORkxJQ1QJKDEgPDwgMikKKyNkZWZpbmUgX1hBQk9SVF9DQVBBQ0lUWQkoMSA8PCAzKQorI2RlZmluZSBfWEFCT1JUX0RFQlVHCQkoMSA8PCA0KQorI2RlZmluZSBfWEFCT1JUX05FU1RFRAkJKDEgPDwgNSkKKyNkZWZpbmUgX1hBQk9SVF9DT0RFKHgpCQkoKCh4KSA+PiAyNCkgJiAweEZGKQorCisvKiBTdGFydCBhbiBSVE0gY29kZSByZWdpb24uICBSZXR1cm4gX1hCRUdJTl9TVEFSVEVEIG9uIHN1Y2Nlc3MgYW5kIHRoZQorICAgYWJvcnQgY29uZGl0aW9uIG90aGVyd2lzZS4gICovCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK194YmVnaW4gKHZvaWQpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl94YmVnaW4gKCk7Cit9CisKKy8qIFNwZWNpZnkgdGhlIGVuZCBvZiBhbiBSVE0gY29kZSByZWdpb24uICBJZiBpdCBjb3JyZXNwb25kcyB0byB0aGUKKyAgIG91dGVybW9zdCB0cmFuc2FjdGlvbiwgdGhlbiBhdHRlbXB0cyB0aGUgdHJhbnNhY3Rpb24gY29tbWl0LiAgSWYgdGhlCisgICBjb21taXQgZmFpbHMsIHRoZW4gY29udHJvbCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgb3V0ZXJtb3N0IHRyYW5zYWN0aW9uCisgICBmYWxsYmFjayBoYW5kbGVyLiAgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK194ZW5kICh2b2lkKQoreworICBfX2J1aWx0aW5faWEzMl94ZW5kICgpOworfQorCisvKiBGb3JjZSBhbiBSVE0gYWJvcnQgY29uZGl0aW9uLiBUaGUgY29udHJvbCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUKKyAgIG91dGVybW9zdCB0cmFuc2FjdGlvbiBmYWxsYmFjayBoYW5kbGVyIHdpdGggdGhlIGFib3J0IGNvbmRpdGlvbiBJTU0uICAqLworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIHZvaWQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX3hhYm9ydCAoY29uc3QgdW5zaWduZWQgaW50IGltbSkKK3sKKyAgX19idWlsdGluX2lhMzJfeGFib3J0IChpbW0pOworfQorI2Vsc2UKKyNkZWZpbmUgX3hhYm9ydChOKSAgX19idWlsdGluX2lhMzJfeGFib3J0IChOKQorI2VuZGlmIC8qIF9fT1BUSU1JWkVfXyAqLworCisjZW5kaWYgLyogX1JUTUlOVFJJTl9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zbW1pbnRyaW4uaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3NtbWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZTkxNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zbW1pbnRyaW4uaApAQCAtMCwwICsxLDgzMCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIEltcGxlbWVudGVkIGZyb20gdGhlIHNwZWNpZmljYXRpb24gaW5jbHVkZWQgaW4gdGhlIEludGVsIEMrKyBDb21waWxlcgorICAgVXNlciBHdWlkZSBhbmQgUmVmZXJlbmNlLCB2ZXJzaW9uIDEwLjAuICAqLworCisjaWZuZGVmIF9TTU1JTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfU01NSU5UUklOX0hfSU5DTFVERUQKKworI2lmbmRlZiBfX1NTRTRfMV9fCisjIGVycm9yICJTU0U0LjEgaW5zdHJ1Y3Rpb24gc2V0IG5vdCBlbmFibGVkIgorI2Vsc2UKKworLyogV2UgbmVlZCBkZWZpbml0aW9ucyBmcm9tIHRoZSBTU1NFMywgU1NFMywgU1NFMiBhbmQgU1NFIGhlYWRlcgorICAgZmlsZXMuICAqLworI2luY2x1ZGUgPHRtbWludHJpbi5oPgorCisvKiBSb3VuZGluZyBtb2RlIG1hY3Jvcy4gKi8KKyNkZWZpbmUgX01NX0ZST1VORF9UT19ORUFSRVNUX0lOVAkweDAwCisjZGVmaW5lIF9NTV9GUk9VTkRfVE9fTkVHX0lORgkJMHgwMQorI2RlZmluZSBfTU1fRlJPVU5EX1RPX1BPU19JTkYJCTB4MDIKKyNkZWZpbmUgX01NX0ZST1VORF9UT19aRVJPCQkweDAzCisjZGVmaW5lIF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTgkweDA0CisKKyNkZWZpbmUgX01NX0ZST1VORF9SQUlTRV9FWEMJCTB4MDAKKyNkZWZpbmUgX01NX0ZST1VORF9OT19FWEMJCTB4MDgKKworI2RlZmluZSBfTU1fRlJPVU5EX05JTlQJCVwKKyAgKF9NTV9GUk9VTkRfVE9fTkVBUkVTVF9JTlQgfCBfTU1fRlJPVU5EX1JBSVNFX0VYQykKKyNkZWZpbmUgX01NX0ZST1VORF9GTE9PUglcCisgIChfTU1fRlJPVU5EX1RPX05FR19JTkYgfCBfTU1fRlJPVU5EX1JBSVNFX0VYQykKKyNkZWZpbmUgX01NX0ZST1VORF9DRUlMCQlcCisgIChfTU1fRlJPVU5EX1RPX1BPU19JTkYgfCBfTU1fRlJPVU5EX1JBSVNFX0VYQykKKyNkZWZpbmUgX01NX0ZST1VORF9UUlVOQwlcCisgIChfTU1fRlJPVU5EX1RPX1pFUk8gfCBfTU1fRlJPVU5EX1JBSVNFX0VYQykKKyNkZWZpbmUgX01NX0ZST1VORF9SSU5UCQlcCisgIChfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04gfCBfTU1fRlJPVU5EX1JBSVNFX0VYQykKKyNkZWZpbmUgX01NX0ZST1VORF9ORUFSQllJTlQJXAorICAoX01NX0ZST1VORF9DVVJfRElSRUNUSU9OIHwgX01NX0ZST1VORF9OT19FWEMpCisKKy8qIFRlc3QgSW5zdHJ1Y3Rpb24gKi8KKy8qIFBhY2tlZCBpbnRlZ2VyIDEyOC1iaXQgYml0d2lzZSBjb21wYXJpc29uLiBSZXR1cm4gMSBpZgorICAgKF9fViAmIF9fTSkgPT0gMC4gICovCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Rlc3R6X3NpMTI4IChfX20xMjhpIF9fTSwgX19tMTI4aSBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wdGVzdHoxMjggKChfX3YyZGkpX19NLCAoX192MmRpKV9fVik7Cit9CisKKy8qIFBhY2tlZCBpbnRlZ2VyIDEyOC1iaXQgYml0d2lzZSBjb21wYXJpc29uLiBSZXR1cm4gMSBpZgorICAgKF9fViAmIH5fX00pID09IDAuICAqLworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV90ZXN0Y19zaTEyOCAoX19tMTI4aSBfX00sIF9fbTEyOGkgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcHRlc3RjMTI4ICgoX192MmRpKV9fTSwgKF9fdjJkaSlfX1YpOworfQorCisvKiBQYWNrZWQgaW50ZWdlciAxMjgtYml0IGJpdHdpc2UgY29tcGFyaXNvbi4gUmV0dXJuIDEgaWYKKyAgIChfX1YgJiBfX00pICE9IDAgJiYgKF9fViAmIH5fX00pICE9IDAuICAqLworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV90ZXN0bnpjX3NpMTI4IChfX20xMjhpIF9fTSwgX19tMTI4aSBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wdGVzdG56YzEyOCAoKF9fdjJkaSlfX00sIChfX3YyZGkpX19WKTsKK30KKworLyogTWFjcm9zIGZvciBwYWNrZWQgaW50ZWdlciAxMjgtYml0IGNvbXBhcmlzb24gaW50cmluc2ljcy4gICovCisjZGVmaW5lIF9tbV90ZXN0X2FsbF96ZXJvcyhNLCBWKSBfbW1fdGVzdHpfc2kxMjggKChNKSwgKFYpKQorCisjZGVmaW5lIF9tbV90ZXN0X2FsbF9vbmVzKFYpIFwKKyAgX21tX3Rlc3RjX3NpMTI4ICgoViksIF9tbV9jbXBlcV9lcGkzMiAoKFYpLCAoVikpKQorCisjZGVmaW5lIF9tbV90ZXN0X21peF9vbmVzX3plcm9zKE0sIFYpIF9tbV90ZXN0bnpjX3NpMTI4ICgoTSksIChWKSkKKworLyogUGFja2VkL3NjYWxhciBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nLiAgKi8KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcm91bmRfcGQgKF9fbTEyOGQgX19WLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3JvdW5kcGQgKChfX3YyZGYpX19WLCBfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9yb3VuZF9zZChfX20xMjhkIF9fRCwgX19tMTI4ZCBfX1YsIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfcm91bmRzZCAoKF9fdjJkZilfX0QsCisJCQkJCSAgIChfX3YyZGYpX19WLAorCQkJCQkgICBfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX3JvdW5kX3BkKFYsIE0pIFwKKyAgKChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9yb3VuZHBkICgoX192MmRmKShfX20xMjhkKShWKSwgKGludCkoTSkpKQorCisjZGVmaW5lIF9tbV9yb3VuZF9zZChELCBWLCBNKQkJCQkJCVwKKyAgKChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9yb3VuZHNkICgoX192MmRmKShfX20xMjhkKShEKSwJCVwKKwkJCQkgICAgIChfX3YyZGYpKF9fbTEyOGQpKFYpLCAoaW50KShNKSkpCisjZW5kaWYKKworLyogUGFja2VkL3NjYWxhciBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nLiAgKi8KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9yb3VuZF9wcyAoX19tMTI4IF9fViwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3JvdW5kcHMgKChfX3Y0c2YpX19WLCBfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3JvdW5kX3NzIChfX20xMjggX19ELCBfX20xMjggX19WLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfcm91bmRzcyAoKF9fdjRzZilfX0QsCisJCQkJCSAgKF9fdjRzZilfX1YsCisJCQkJCSAgX19NKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9yb3VuZF9wcyhWLCBNKSBcCisgICgoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9yb3VuZHBzICgoX192NHNmKShfX20xMjgpKFYpLCAoaW50KShNKSkpCisKKyNkZWZpbmUgX21tX3JvdW5kX3NzKEQsIFYsIE0pCQkJCQkJXAorICAoKF9fbTEyOCkgX19idWlsdGluX2lhMzJfcm91bmRzcyAoKF9fdjRzZikoX19tMTI4KShEKSwJCVwKKwkJCQkgICAgKF9fdjRzZikoX19tMTI4KShWKSwgKGludCkoTSkpKQorI2VuZGlmCisKKy8qIE1hY3JvcyBmb3IgY2VpbC9mbG9vciBpbnRyaW5zaWNzLiAgKi8KKyNkZWZpbmUgX21tX2NlaWxfcGQoVikJICAgX21tX3JvdW5kX3BkICgoViksIF9NTV9GUk9VTkRfQ0VJTCkKKyNkZWZpbmUgX21tX2NlaWxfc2QoRCwgVikgIF9tbV9yb3VuZF9zZCAoKEQpLCAoViksIF9NTV9GUk9VTkRfQ0VJTCkKKworI2RlZmluZSBfbW1fZmxvb3JfcGQoVikJICAgX21tX3JvdW5kX3BkKChWKSwgX01NX0ZST1VORF9GTE9PUikKKyNkZWZpbmUgX21tX2Zsb29yX3NkKEQsIFYpIF9tbV9yb3VuZF9zZCAoKEQpLCAoViksIF9NTV9GUk9VTkRfRkxPT1IpCisKKyNkZWZpbmUgX21tX2NlaWxfcHMoVikJICAgX21tX3JvdW5kX3BzICgoViksIF9NTV9GUk9VTkRfQ0VJTCkKKyNkZWZpbmUgX21tX2NlaWxfc3MoRCwgVikgIF9tbV9yb3VuZF9zcyAoKEQpLCAoViksIF9NTV9GUk9VTkRfQ0VJTCkKKworI2RlZmluZSBfbW1fZmxvb3JfcHMoVikJICAgX21tX3JvdW5kX3BzICgoViksIF9NTV9GUk9VTkRfRkxPT1IpCisjZGVmaW5lIF9tbV9mbG9vcl9zcyhELCBWKSBfbW1fcm91bmRfc3MgKChEKSwgKFYpLCBfTU1fRlJPVU5EX0ZMT09SKQorCisvKiBTU0U0LjEgKi8KKworLyogSW50ZWdlciBibGVuZCBpbnN0cnVjdGlvbnMgLSBzZWxlY3QgZGF0YSBmcm9tIDIgc291cmNlcyB1c2luZworICAgY29uc3RhbnQvdmFyaWFibGUgbWFzay4gICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2JsZW5kX2VwaTE2IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGJsZW5kdzEyOCAoKF9fdjhoaSlfX1gsCisJCQkJCSAgICAgIChfX3Y4aGkpX19ZLAorCQkJCQkgICAgICBfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX2JsZW5kX2VwaTE2KFgsIFksIE0pCQkJCQlcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGJsZW5kdzEyOCAoKF9fdjhoaSkoX19tMTI4aSkoWCksCQlcCisJCQkJCShfX3Y4aGkpKF9fbTEyOGkpKFkpLCAoaW50KShNKSkpCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYmxlbmR2X2VwaTggKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSwgX19tMTI4aSBfX00pCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGJsZW5kdmIxMjggKChfX3YxNnFpKV9fWCwKKwkJCQkJICAgICAgIChfX3YxNnFpKV9fWSwKKwkJCQkJICAgICAgIChfX3YxNnFpKV9fTSk7Cit9CisKKy8qIFNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgYmxlbmQgaW5zdHJ1Y3Rpb25zIC0gc2VsZWN0IGRhdGEKKyAgIGZyb20gMiBzb3VyY2VzIHVzaW5nIGNvbnN0YW50L3ZhcmlhYmxlIG1hc2suICAqLworCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2JsZW5kX3BzIChfX20xMjggX19YLCBfX20xMjggX19ZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfYmxlbmRwcyAoKF9fdjRzZilfX1gsCisJCQkJCSAgKF9fdjRzZilfX1ksCisJCQkJCSAgX19NKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9ibGVuZF9wcyhYLCBZLCBNKQkJCQkJCVwKKyAgKChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2JsZW5kcHMgKChfX3Y0c2YpKF9fbTEyOCkoWCksCQlcCisJCQkJICAgIChfX3Y0c2YpKF9fbTEyOCkoWSksIChpbnQpKE0pKSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2JsZW5kdl9wcyAoX19tMTI4IF9fWCwgX19tMTI4IF9fWSwgX19tMTI4IF9fTSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2JsZW5kdnBzICgoX192NHNmKV9fWCwKKwkJCQkJICAgKF9fdjRzZilfX1ksCisJCQkJCSAgIChfX3Y0c2YpX19NKTsKK30KKworLyogRG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBibGVuZCBpbnN0cnVjdGlvbnMgLSBzZWxlY3QgZGF0YQorICAgZnJvbSAyIHNvdXJjZXMgdXNpbmcgY29uc3RhbnQvdmFyaWFibGUgbWFzay4gICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2JsZW5kX3BkIChfX20xMjhkIF9fWCwgX19tMTI4ZCBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfYmxlbmRwZCAoKF9fdjJkZilfX1gsCisJCQkJCSAgIChfX3YyZGYpX19ZLAorCQkJCQkgICBfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX2JsZW5kX3BkKFgsIFksIE0pCQkJCQkJXAorICAoKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2JsZW5kcGQgKChfX3YyZGYpKF9fbTEyOGQpKFgpLAkJXAorCQkJCSAgICAgKF9fdjJkZikoX19tMTI4ZCkoWSksIChpbnQpKE0pKSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9ibGVuZHZfcGQgKF9fbTEyOGQgX19YLCBfX20xMjhkIF9fWSwgX19tMTI4ZCBfX00pCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfYmxlbmR2cGQgKChfX3YyZGYpX19YLAorCQkJCQkgICAgKF9fdjJkZilfX1ksCisJCQkJCSAgICAoX192MmRmKV9fTSk7Cit9CisKKy8qIERvdCBwcm9kdWN0IGluc3RydWN0aW9ucyB3aXRoIG1hc2stZGVmaW5lZCBzdW1taW5nIGFuZCB6ZXJvaW5nIHBhcnRzCisgICBvZiByZXN1bHQuICAqLworCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2RwX3BzIChfX20xMjggX19YLCBfX20xMjggX19ZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfZHBwcyAoKF9fdjRzZilfX1gsCisJCQkJICAgICAgIChfX3Y0c2YpX19ZLAorCQkJCSAgICAgICBfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9kcF9wZCAoX19tMTI4ZCBfX1gsIF9fbTEyOGQgX19ZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2RwcGQgKChfX3YyZGYpX19YLAorCQkJCQkoX192MmRmKV9fWSwKKwkJCQkJX19NKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9kcF9wcyhYLCBZLCBNKQkJCQkJCVwKKyAgKChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2RwcHMgKChfX3Y0c2YpKF9fbTEyOCkoWCksCQkJXAorCQkJCSAoX192NHNmKShfX20xMjgpKFkpLCAoaW50KShNKSkpCisKKyNkZWZpbmUgX21tX2RwX3BkKFgsIFksIE0pCQkJCQkJXAorICAoKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2RwcGQgKChfX3YyZGYpKF9fbTEyOGQpKFgpLAkJCVwKKwkJCQkgIChfX3YyZGYpKF9fbTEyOGQpKFkpLCAoaW50KShNKSkpCisjZW5kaWYKKworLyogUGFja2VkIGludGVnZXIgNjQtYml0IGNvbXBhcmlzb24sIHplcm9pbmcgb3IgZmlsbGluZyB3aXRoIG9uZXMKKyAgIGNvcnJlc3BvbmRpbmcgcGFydHMgb2YgcmVzdWx0LiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGVxX2VwaTY0IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGNtcGVxcSAoKF9fdjJkaSlfX1gsIChfX3YyZGkpX19ZKTsKK30KKworLyogIE1pbi9tYXggcGFja2VkIGludGVnZXIgaW5zdHJ1Y3Rpb25zLiAgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWluX2VwaTggKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWluc2IxMjggKChfX3YxNnFpKV9fWCwgKF9fdjE2cWkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWF4X2VwaTggKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWF4c2IxMjggKChfX3YxNnFpKV9fWCwgKF9fdjE2cWkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWluX2VwdTE2IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1pbnV3MTI4ICgoX192OGhpKV9fWCwgKF9fdjhoaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXhfZXB1MTYgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWF4dXcxMjggKChfX3Y4aGkpX19YLCAoX192OGhpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21pbl9lcGkzMiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtaW5zZDEyOCAoKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWF4X2VwaTMyIChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1heHNkMTI4ICgoX192NHNpKV9fWCwgKF9fdjRzaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9taW5fZXB1MzIgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWludWQxMjggKChfX3Y0c2kpX19YLCAoX192NHNpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21heF9lcHUzMiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtYXh1ZDEyOCAoKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19ZKTsKK30KKworLyogUGFja2VkIGludGVnZXIgMzItYml0IG11bHRpcGxpY2F0aW9uIHdpdGggdHJ1bmNhdGlvbiBvZiB1cHBlcgorICAgaGFsdmVzIG9mIHJlc3VsdHMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbXVsbG9fZXBpMzIgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbXVsbGQxMjggKChfX3Y0c2kpX19YLCAoX192NHNpKV9fWSk7Cit9CisKKy8qIFBhY2tlZCBpbnRlZ2VyIDMyLWJpdCBtdWx0aXBsaWNhdGlvbiBvZiAyIHBhaXJzIG9mIG9wZXJhbmRzCisgICB3aXRoIHR3byA2NC1iaXQgcmVzdWx0cy4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tdWxfZXBpMzIgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbXVsZHExMjggKChfX3Y0c2kpX19YLCAoX192NHNpKV9fWSk7Cit9CisKKy8qIEluc2VydCBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0IGludG8gcGFja2VkIHNpbmdsZSBwcmVjaXNpb24gYXJyYXkKKyAgIGVsZW1lbnQgc2VsZWN0ZWQgYnkgaW5kZXggTi4gIFRoZSBiaXRzIFs3LTZdIG9mIE4gZGVmaW5lIFMKKyAgIGluZGV4LCB0aGUgYml0cyBbNS00XSBkZWZpbmUgRCBpbmRleCwgYW5kIGJpdHMgWzMtMF0gZGVmaW5lCisgICB6ZXJvaW5nIG1hc2sgZm9yIEQuICAqLworCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2luc2VydF9wcyAoX19tMTI4IF9fRCwgX19tMTI4IF9fUywgY29uc3QgaW50IF9fTikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2luc2VydHBzMTI4ICgoX192NHNmKV9fRCwKKwkJCQkJICAgICAgKF9fdjRzZilfX1MsCisJCQkJCSAgICAgIF9fTik7Cit9CisjZWxzZQorI2RlZmluZSBfbW1faW5zZXJ0X3BzKEQsIFMsIE4pCQkJCQkJXAorICAoKF9fbTEyOCkgX19idWlsdGluX2lhMzJfaW5zZXJ0cHMxMjggKChfX3Y0c2YpKF9fbTEyOCkoRCksCQlcCisJCQkJCShfX3Y0c2YpKF9fbTEyOCkoUyksIChpbnQpKE4pKSkKKyNlbmRpZgorCisvKiBIZWxwZXIgbWFjcm8gdG8gY3JlYXRlIHRoZSBOIHZhbHVlIGZvciBfbW1faW5zZXJ0X3BzLiAgKi8KKyNkZWZpbmUgX01NX01LX0lOU0VSVFBTX05EWChTLCBELCBNKSAoKChTKSA8PCA2KSB8ICgoRCkgPDwgNCkgfCAoTSkpCisKKy8qIEV4dHJhY3QgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHNpbmdsZSBwcmVjaXNpb24gZmxvYXQgZnJvbSBwYWNrZWQKKyAgIHNpbmdsZSBwcmVjaXNpb24gYXJyYXkgZWxlbWVudCBvZiBYIHNlbGVjdGVkIGJ5IGluZGV4IE4uICAqLworCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2V4dHJhY3RfcHMgKF9fbTEyOCBfX1gsIGNvbnN0IGludCBfX04pCit7CisgIHVuaW9uIHsgaW50IGk7IGZsb2F0IGY7IH0gX190bXA7CisgIF9fdG1wLmYgPSBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3Y0c2YgKChfX3Y0c2YpX19YLCBfX04pOworICByZXR1cm4gX190bXAuaTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9leHRyYWN0X3BzKFgsIE4pCQkJCQkJXAorICAoX19leHRlbnNpb25fXwkJCQkJCQlcCisgICAoewkJCQkJCQkJCVwKKyAgICAgdW5pb24geyBpbnQgaTsgZmxvYXQgZjsgfSBfX3RtcDsJCQkJCVwKKyAgICAgX190bXAuZiA9IF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjRzZiAoKF9fdjRzZikoX19tMTI4KShYKSwgKGludCkoTikpOyBcCisgICAgIF9fdG1wLmk7CQkJCQkJCQlcCisgICB9KSkKKyNlbmRpZgorCisvKiBFeHRyYWN0IGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0IGludG8KKyAgIEQgZnJvbSBwYWNrZWQgc2luZ2xlIHByZWNpc2lvbiBhcnJheSBlbGVtZW50IG9mIFMgc2VsZWN0ZWQKKyAgIGJ5IGluZGV4IE4uICAqLworI2RlZmluZSBfTU1fRVhUUkFDVF9GTE9BVChELCBTLCBOKSBcCisgIHsgKEQpID0gX19idWlsdGluX2lhMzJfdmVjX2V4dF92NHNmICgoX192NHNmKShTKSwgKE4pKTsgfQorICAKKy8qIEV4dHJhY3Qgc3BlY2lmaWVkIHNpbmdsZSBwcmVjaXNpb24gZmxvYXQgZWxlbWVudCBpbnRvIHRoZSBsb3dlcgorICAgcGFydCBvZiBfX20xMjguICAqLworI2RlZmluZSBfTU1fUElDS19PVVRfUFMoWCwgTikJCQkJXAorICBfbW1faW5zZXJ0X3BzIChfbW1fc2V0emVyb19wcyAoKSwgKFgpLCAJCVwKKwkJIF9NTV9NS19JTlNFUlRQU19ORFggKChOKSwgMCwgMHgwZSkpCisKKy8qIEluc2VydCBpbnRlZ2VyLCBTLCBpbnRvIHBhY2tlZCBpbnRlZ2VyIGFycmF5IGVsZW1lbnQgb2YgRAorICAgc2VsZWN0ZWQgYnkgaW5kZXggTi4gICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2luc2VydF9lcGk4IChfX20xMjhpIF9fRCwgaW50IF9fUywgY29uc3QgaW50IF9fTikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92ZWNfc2V0X3YxNnFpICgoX192MTZxaSlfX0QsCisJCQkJCQkgX19TLCBfX04pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9pbnNlcnRfZXBpMzIgKF9fbTEyOGkgX19ELCBpbnQgX19TLCBjb25zdCBpbnQgX19OKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZlY19zZXRfdjRzaSAoKF9fdjRzaSlfX0QsCisJCQkJCQkgX19TLCBfX04pOworfQorCisjaWZkZWYgX194ODZfNjRfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faW5zZXJ0X2VwaTY0IChfX20xMjhpIF9fRCwgbG9uZyBsb25nIF9fUywgY29uc3QgaW50IF9fTikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92ZWNfc2V0X3YyZGkgKChfX3YyZGkpX19ELAorCQkJCQkJIF9fUywgX19OKTsKK30KKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgX21tX2luc2VydF9lcGk4KEQsIFMsIE4pCQkJCQlcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdmVjX3NldF92MTZxaSAoKF9fdjE2cWkpKF9fbTEyOGkpKEQpLAlcCisJCQkJCSAgIChpbnQpKFMpLCAoaW50KShOKSkpCisKKyNkZWZpbmUgX21tX2luc2VydF9lcGkzMihELCBTLCBOKQkJCQlcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdmVjX3NldF92NHNpICgoX192NHNpKShfX20xMjhpKShEKSwJXAorCQkJCQkgIChpbnQpKFMpLCAoaW50KShOKSkpCisKKyNpZmRlZiBfX3g4Nl82NF9fCisjZGVmaW5lIF9tbV9pbnNlcnRfZXBpNjQoRCwgUywgTikJCQkJCVwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92ZWNfc2V0X3YyZGkgKChfX3YyZGkpKF9fbTEyOGkpKEQpLAkJXAorCQkJCQkgIChsb25nIGxvbmcpKFMpLCAoaW50KShOKSkpCisjZW5kaWYKKyNlbmRpZgorCisvKiBFeHRyYWN0IGludGVnZXIgZnJvbSBwYWNrZWQgaW50ZWdlciBhcnJheSBlbGVtZW50IG9mIFggc2VsZWN0ZWQgYnkKKyAgIGluZGV4IE4uICAqLworCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2V4dHJhY3RfZXBpOCAoX19tMTI4aSBfX1gsIGNvbnN0IGludCBfX04pCit7CisgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjE2cWkgKChfX3YxNnFpKV9fWCwgX19OKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9leHRyYWN0X2VwaTMyIChfX20xMjhpIF9fWCwgY29uc3QgaW50IF9fTikKK3sKKyAgIHJldHVybiBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3Y0c2kgKChfX3Y0c2kpX19YLCBfX04pOworfQorCisjaWZkZWYgX194ODZfNjRfXworZXh0ZXJuIF9faW5saW5lIGxvbmcgbG9uZyAgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZXh0cmFjdF9lcGk2NCAoX19tMTI4aSBfX1gsIGNvbnN0IGludCBfX04pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3YyZGkgKChfX3YyZGkpX19YLCBfX04pOworfQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBfbW1fZXh0cmFjdF9lcGk4KFgsIE4pIFwKKyAgKChpbnQpICh1bnNpZ25lZCBjaGFyKSBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3YxNnFpICgoX192MTZxaSkoX19tMTI4aSkoWCksIChpbnQpKE4pKSkKKyNkZWZpbmUgX21tX2V4dHJhY3RfZXBpMzIoWCwgTikgXAorICAoKGludCkgX19idWlsdGluX2lhMzJfdmVjX2V4dF92NHNpICgoX192NHNpKShfX20xMjhpKShYKSwgKGludCkoTikpKQorCisjaWZkZWYgX194ODZfNjRfXworI2RlZmluZSBfbW1fZXh0cmFjdF9lcGk2NChYLCBOKSBcCisgICgobG9uZyBsb25nKSBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3YyZGkgKChfX3YyZGkpKF9fbTEyOGkpKFgpLCAoaW50KShOKSkpCisjZW5kaWYKKyNlbmRpZgorCisvKiBSZXR1cm4gaG9yaXpvbnRhbCBwYWNrZWQgd29yZCBtaW5pbXVtIGFuZCBpdHMgaW5kZXggaW4gYml0cyBbMTU6MF0KKyAgIGFuZCBiaXRzIFsxODoxNl0gcmVzcGVjdGl2ZWx5LiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21pbnBvc19lcHUxNiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGhtaW5wb3N1dzEyOCAoKF9fdjhoaSlfX1gpOworfQorCisvKiBQYWNrZWQgaW50ZWdlciBzaWduLWV4dGVuc2lvbi4gICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dGVwaThfZXBpMzIgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzeGJkMTI4ICgoX192MTZxaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRlcGkxNl9lcGkzMiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnN4d2QxMjggKChfX3Y4aGkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0ZXBpOF9lcGk2NCAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnN4YnExMjggKChfX3YxNnFpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dGVwaTMyX2VwaTY0IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3hkcTEyOCAoKF9fdjRzaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRlcGkxNl9lcGk2NCAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnN4d3ExMjggKChfX3Y4aGkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0ZXBpOF9lcGkxNiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnN4YncxMjggKChfX3YxNnFpKV9fWCk7Cit9CisKKy8qIFBhY2tlZCBpbnRlZ2VyIHplcm8tZXh0ZW5zaW9uLiAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRlcHU4X2VwaTMyIChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92enhiZDEyOCAoKF9fdjE2cWkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0ZXB1MTZfZXBpMzIgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eHdkMTI4ICgoX192OGhpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dGVwdThfZXBpNjQgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eGJxMTI4ICgoX192MTZxaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRlcHUzMl9lcGk2NCAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnp4ZHExMjggKChfX3Y0c2kpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0ZXB1MTZfZXBpNjQgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eHdxMTI4ICgoX192OGhpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dGVwdThfZXBpMTYgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eGJ3MTI4ICgoX192MTZxaSlfX1gpOworfQorCisvKiBQYWNrIDggZG91YmxlIHdvcmRzIGZyb20gMiBvcGVyYW5kcyBpbnRvIDggd29yZHMgb2YgcmVzdWx0IHdpdGgKKyAgIHVuc2lnbmVkIHNhdHVyYXRpb24uICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9wYWNrdXNfZXBpMzIgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYWNrdXNkdzEyOCAoKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19ZKTsKK30KKworLyogU3VtIGFic29sdXRlIDgtYml0IGludGVnZXIgZGlmZmVyZW5jZSBvZiBhZGphY2VudCBncm91cHMgb2YgNAorICAgYnl0ZSBpbnRlZ2VycyBpbiB0aGUgZmlyc3QgMiBvcGVyYW5kcy4gIFN0YXJ0aW5nIG9mZnNldHMgd2l0aGluCisgICBvcGVyYW5kcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgM3JkIG1hc2sgb3BlcmFuZC4gICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21wc2FkYndfZXB1OCAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX21wc2FkYncxMjggKChfX3YxNnFpKV9fWCwKKwkJCQkJICAgICAgKF9fdjE2cWkpX19ZLCBfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX21wc2FkYndfZXB1OChYLCBZLCBNKQkJCQkJXAorICAoKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX21wc2FkYncxMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwJCVwKKwkJCQkJKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCAoaW50KShNKSkpCisjZW5kaWYKKworLyogTG9hZCBkb3VibGUgcXVhZHdvcmQgdXNpbmcgbm9uLXRlbXBvcmFsIGFsaWduZWQgaGludC4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdHJlYW1fbG9hZF9zaTEyOCAoX19tMTI4aSAqX19YKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX21vdm50ZHFhICgoX192MmRpICopIF9fWCk7Cit9CisKKyNpZmRlZiBfX1NTRTRfMl9fCisKKy8qIFRoZXNlIG1hY3JvcyBzcGVjaWZ5IHRoZSBzb3VyY2UgZGF0YSBmb3JtYXQuICAqLworI2RlZmluZSBfU0lERF9VQllURV9PUFMJCQkweDAwCisjZGVmaW5lIF9TSUREX1VXT1JEX09QUwkJCTB4MDEKKyNkZWZpbmUgX1NJRERfU0JZVEVfT1BTCQkJMHgwMgorI2RlZmluZSBfU0lERF9TV09SRF9PUFMJCQkweDAzCisKKy8qIFRoZXNlIG1hY3JvcyBzcGVjaWZ5IHRoZSBjb21wYXJpc29uIG9wZXJhdGlvbi4gICovCisjZGVmaW5lIF9TSUREX0NNUF9FUVVBTF9BTlkJCTB4MDAKKyNkZWZpbmUgX1NJRERfQ01QX1JBTkdFUwkJMHgwNAorI2RlZmluZSBfU0lERF9DTVBfRVFVQUxfRUFDSAkJMHgwOAorI2RlZmluZSBfU0lERF9DTVBfRVFVQUxfT1JERVJFRAkJMHgwYworCisvKiBUaGVzZSBtYWNyb3Mgc3BlY2lmeSB0aGUgcG9sYXJpdHkuICAqLworI2RlZmluZSBfU0lERF9QT1NJVElWRV9QT0xBUklUWQkJMHgwMAorI2RlZmluZSBfU0lERF9ORUdBVElWRV9QT0xBUklUWQkJMHgxMAorI2RlZmluZSBfU0lERF9NQVNLRURfUE9TSVRJVkVfUE9MQVJJVFkJMHgyMAorI2RlZmluZSBfU0lERF9NQVNLRURfTkVHQVRJVkVfUE9MQVJJVFkJMHgzMAorCisvKiBUaGVzZSBtYWNyb3Mgc3BlY2lmeSB0aGUgb3V0cHV0IHNlbGVjdGlvbiBpbiBfbW1fY21wWHN0cmkgKCkuICAqLworI2RlZmluZSBfU0lERF9MRUFTVF9TSUdOSUZJQ0FOVAkJMHgwMAorI2RlZmluZSBfU0lERF9NT1NUX1NJR05JRklDQU5UCQkweDQwCisKKy8qIFRoZXNlIG1hY3JvcyBzcGVjaWZ5IHRoZSBvdXRwdXQgc2VsZWN0aW9uIGluIF9tbV9jbXBYc3RybSAoKS4gICovCisjZGVmaW5lIF9TSUREX0JJVF9NQVNLCQkJMHgwMAorI2RlZmluZSBfU0lERF9VTklUX01BU0sJCQkweDQwCisKKy8qIEludHJpbnNpY3MgZm9yIHRleHQvc3RyaW5nIHByb2Nlc3NpbmcuICAqLworCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBpc3RybSAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RybTEyOCAoKF9fdjE2cWkpX19YLAorCQkJCQkJKF9fdjE2cWkpX19ZLAorCQkJCQkJX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBpc3RyaSAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcGNtcGlzdHJpMTI4ICgoX192MTZxaSlfX1gsCisJCQkJICAgICAgKF9fdjE2cWkpX19ZLAorCQkJCSAgICAgIF9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGVzdHJtIChfX20xMjhpIF9fWCwgaW50IF9fTFgsIF9fbTEyOGkgX19ZLCBpbnQgX19MWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wY21wZXN0cm0xMjggKChfX3YxNnFpKV9fWCwgX19MWCwKKwkJCQkJCShfX3YxNnFpKV9fWSwgX19MWSwKKwkJCQkJCV9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZXN0cmkgKF9fbTEyOGkgX19YLCBpbnQgX19MWCwgX19tMTI4aSBfX1ksIGludCBfX0xZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcGNtcGVzdHJpMTI4ICgoX192MTZxaSlfX1gsIF9fTFgsCisJCQkJICAgICAgKF9fdjE2cWkpX19ZLCBfX0xZLAorCQkJCSAgICAgIF9fTSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fY21waXN0cm0oWCwgWSwgTSkJCQkJCQlcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGNtcGlzdHJtMTI4ICgoX192MTZxaSkoX19tMTI4aSkoWCksCVwKKwkJCQkJICAoX192MTZxaSkoX19tMTI4aSkoWSksIChpbnQpKE0pKSkKKyNkZWZpbmUgX21tX2NtcGlzdHJpKFgsIFksIE0pCQkJCQkJXAorICAoKGludCkgX19idWlsdGluX2lhMzJfcGNtcGlzdHJpMTI4ICgoX192MTZxaSkoX19tMTI4aSkoWCksCQlcCisJCQkJICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCAoaW50KShNKSkpCisKKyNkZWZpbmUgX21tX2NtcGVzdHJtKFgsIExYLCBZLCBMWSwgTSkJCQkJCVwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wY21wZXN0cm0xMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwJXAorCQkJCQkgIChpbnQpKExYKSwgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCBcCisJCQkJCSAgKGludCkoTFkpLCAoaW50KShNKSkpCisjZGVmaW5lIF9tbV9jbXBlc3RyaShYLCBMWCwgWSwgTFksIE0pCQkJCQlcCisgICgoaW50KSBfX2J1aWx0aW5faWEzMl9wY21wZXN0cmkxMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwgKGludCkoTFgpLAlcCisJCQkJICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCAoaW50KShMWSksCVwKKwkJCQkgICAgICAoaW50KShNKSkpCisjZW5kaWYKKworLyogSW50cmluc2ljcyBmb3IgdGV4dC9zdHJpbmcgcHJvY2Vzc2luZyBhbmQgcmVhZGluZyB2YWx1ZXMgb2YKKyAgIEVGbGFncy4gICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21waXN0cmEgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaWExMjggKChfX3YxNnFpKV9fWCwKKwkJCQkgICAgICAgKF9fdjE2cWkpX19ZLAorCQkJCSAgICAgICBfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGlzdHJjIChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wY21waXN0cmljMTI4ICgoX192MTZxaSlfX1gsCisJCQkJICAgICAgIChfX3YxNnFpKV9fWSwKKwkJCQkgICAgICAgX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBpc3RybyAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcGNtcGlzdHJpbzEyOCAoKF9fdjE2cWkpX19YLAorCQkJCSAgICAgICAoX192MTZxaSlfX1ksCisJCQkJICAgICAgIF9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21waXN0cnMgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaXMxMjggKChfX3YxNnFpKV9fWCwKKwkJCQkgICAgICAgKF9fdjE2cWkpX19ZLAorCQkJCSAgICAgICBfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGlzdHJ6IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wY21waXN0cml6MTI4ICgoX192MTZxaSlfX1gsCisJCQkJICAgICAgIChfX3YxNnFpKV9fWSwKKwkJCQkgICAgICAgX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBlc3RyYSAoX19tMTI4aSBfX1gsIGludCBfX0xYLCBfX20xMjhpIF9fWSwgaW50IF9fTFksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wY21wZXN0cmlhMTI4ICgoX192MTZxaSlfX1gsIF9fTFgsCisJCQkJICAgICAgIChfX3YxNnFpKV9fWSwgX19MWSwKKwkJCQkgICAgICAgX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBlc3RyYyAoX19tMTI4aSBfX1gsIGludCBfX0xYLCBfX20xMjhpIF9fWSwgaW50IF9fTFksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wY21wZXN0cmljMTI4ICgoX192MTZxaSlfX1gsIF9fTFgsCisJCQkJICAgICAgIChfX3YxNnFpKV9fWSwgX19MWSwKKwkJCQkgICAgICAgX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBlc3RybyAoX19tMTI4aSBfX1gsIGludCBfX0xYLCBfX20xMjhpIF9fWSwgaW50IF9fTFksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wY21wZXN0cmlvMTI4ICgoX192MTZxaSlfX1gsIF9fTFgsCisJCQkJICAgICAgIChfX3YxNnFpKV9fWSwgX19MWSwKKwkJCQkgICAgICAgX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBlc3RycyAoX19tMTI4aSBfX1gsIGludCBfX0xYLCBfX20xMjhpIF9fWSwgaW50IF9fTFksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wY21wZXN0cmlzMTI4ICgoX192MTZxaSlfX1gsIF9fTFgsCisJCQkJICAgICAgIChfX3YxNnFpKV9fWSwgX19MWSwKKwkJCQkgICAgICAgX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBlc3RyeiAoX19tMTI4aSBfX1gsIGludCBfX0xYLCBfX20xMjhpIF9fWSwgaW50IF9fTFksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wY21wZXN0cml6MTI4ICgoX192MTZxaSlfX1gsIF9fTFgsCisJCQkJICAgICAgIChfX3YxNnFpKV9fWSwgX19MWSwKKwkJCQkgICAgICAgX19NKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9jbXBpc3RyYShYLCBZLCBNKQkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaWExMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwJCVwKKwkJCQkgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCAoaW50KShNKSkpCisjZGVmaW5lIF9tbV9jbXBpc3RyYyhYLCBZLCBNKQkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaWMxMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwJCVwKKwkJCQkgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCAoaW50KShNKSkpCisjZGVmaW5lIF9tbV9jbXBpc3RybyhYLCBZLCBNKQkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaW8xMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwJCVwKKwkJCQkgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCAoaW50KShNKSkpCisjZGVmaW5lIF9tbV9jbXBpc3RycyhYLCBZLCBNKQkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaXMxMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwJCVwKKwkJCQkgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCAoaW50KShNKSkpCisjZGVmaW5lIF9tbV9jbXBpc3RyeihYLCBZLCBNKQkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaXoxMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwJCVwKKwkJCQkgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCAoaW50KShNKSkpCisKKyNkZWZpbmUgX21tX2NtcGVzdHJhKFgsIExYLCBZLCBMWSwgTSkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaWExMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwgKGludCkoTFgpLCBcCisJCQkJICAgICAgIChfX3YxNnFpKShfX20xMjhpKShZKSwgKGludCkoTFkpLCBcCisJCQkJICAgICAgIChpbnQpKE0pKSkKKyNkZWZpbmUgX21tX2NtcGVzdHJjKFgsIExYLCBZLCBMWSwgTSkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaWMxMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwgKGludCkoTFgpLCBcCisJCQkJICAgICAgIChfX3YxNnFpKShfX20xMjhpKShZKSwgKGludCkoTFkpLCBcCisJCQkJICAgICAgIChpbnQpKE0pKSkKKyNkZWZpbmUgX21tX2NtcGVzdHJvKFgsIExYLCBZLCBMWSwgTSkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaW8xMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwgKGludCkoTFgpLCBcCisJCQkJICAgICAgIChfX3YxNnFpKShfX20xMjhpKShZKSwgKGludCkoTFkpLCBcCisJCQkJICAgICAgIChpbnQpKE0pKSkKKyNkZWZpbmUgX21tX2NtcGVzdHJzKFgsIExYLCBZLCBMWSwgTSkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaXMxMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwgKGludCkoTFgpLCBcCisJCQkJICAgICAgIChfX3YxNnFpKShfX20xMjhpKShZKSwgKGludCkoTFkpLCBcCisJCQkJICAgICAgIChpbnQpKE0pKSkKKyNkZWZpbmUgX21tX2NtcGVzdHJ6KFgsIExYLCBZLCBMWSwgTSkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaXoxMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwgKGludCkoTFgpLCBcCisJCQkJICAgICAgIChfX3YxNnFpKShfX20xMjhpKShZKSwgKGludCkoTFkpLCBcCisJCQkJICAgICAgIChpbnQpKE0pKSkKKyNlbmRpZgorCisvKiBQYWNrZWQgaW50ZWdlciA2NC1iaXQgY29tcGFyaXNvbiwgemVyb2luZyBvciBmaWxsaW5nIHdpdGggb25lcworICAgY29ycmVzcG9uZGluZyBwYXJ0cyBvZiByZXN1bHQuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZ3RfZXBpNjQgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wY21wZ3RxICgoX192MmRpKV9fWCwgKF9fdjJkaSlfX1kpOworfQorCisjaWZkZWYgX19QT1BDTlRfXworI2luY2x1ZGUgPHBvcGNudGludHJpbi5oPgorI2VuZGlmCisKKy8qIEFjY3VtdWxhdGUgQ1JDMzIgKHBvbHlub21pYWwgMHgxMUVEQzZGNDEpIHZhbHVlLiAgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3JjMzJfdTggKHVuc2lnbmVkIGludCBfX0MsIHVuc2lnbmVkIGNoYXIgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3JjMzJxaSAoX19DLCBfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NyYzMyX3UxNiAodW5zaWduZWQgaW50IF9fQywgdW5zaWduZWQgc2hvcnQgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3JjMzJoaSAoX19DLCBfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NyYzMyX3UzMiAodW5zaWduZWQgaW50IF9fQywgdW5zaWduZWQgaW50IF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NyYzMyc2kgKF9fQywgX19WKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3JjMzJfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19DLCB1bnNpZ25lZCBsb25nIGxvbmcgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3JjMzJkaSAoX19DLCBfX1YpOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NTRTRfMl9fICovCisKKyNlbmRpZiAvKiBfX1NTRTRfMV9fICovCisKKyNlbmRpZiAvKiBfU01NSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3NzcC9zc3AuaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3NzcC9zc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWZlMGUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3NwL3NzcC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qIE9iamVjdCBzaXplIGNoZWNraW5nIHN1cHBvcnQgbWFjcm9zLgorICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK0luIGFkZGl0aW9uIHRvIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzIHlvdSB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBsaW5rIHRoZQorY29tcGlsZWQgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaW50byBjb21iaW5hdGlvbnMgd2l0aCBvdGhlciBwcm9ncmFtcywKK2FuZCB0byBkaXN0cmlidXRlIHRob3NlIGNvbWJpbmF0aW9ucyB3aXRob3V0IGFueSByZXN0cmljdGlvbiBjb21pbmcKK2Zyb20gdGhlIHVzZSBvZiB0aGlzIGZpbGUuICAoVGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmVzdHJpY3Rpb25zCitkbyBhcHBseSBpbiBvdGhlciByZXNwZWN0czsgZm9yIGV4YW1wbGUsIHRoZXkgY292ZXIgbW9kaWZpY2F0aW9uIG9mCit0aGUgZmlsZSwgYW5kIGRpc3RyaWJ1dGlvbiB3aGVuIG5vdCBsaW5rZWQgaW50byBhIGNvbWJpbmUKK2V4ZWN1dGFibGUuKQorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworCisjaWZuZGVmIF9TU1BfSAorI2RlZmluZSBfU1NQX0ggMQorCisjaWYgX0ZPUlRJRllfU09VUkNFID4gMCAmJiBfX09QVElNSVpFX18gPiAwIFwKKyAgICAmJiBkZWZpbmVkIF9fR05VQ19fIFwKKyAgICAmJiAoX19HTlVDX18gPiA0IHx8IChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDEpKSBcCisgICAgJiYgIWRlZmluZWQgX19jcGx1c3BsdXMKKyMgaWYgX0ZPUlRJRllfU09VUkNFID09IDEKKyMgIGRlZmluZSBfX1NTUF9GT1JUSUZZX0xFVkVMIDEKKyMgZWxpZiBfRk9SVElGWV9TT1VSQ0UgPiAxCisjICBkZWZpbmUgX19TU1BfRk9SVElGWV9MRVZFTCAyCisjIGVuZGlmCisjZW5kaWYKKworI2lmIF9fU1NQX0ZPUlRJRllfTEVWRUwgPiAwCisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorIyBkZWZpbmUgX19zc3BfYm9zKHB0cikgX19idWlsdGluX29iamVjdF9zaXplIChwdHIsIF9fU1NQX0ZPUlRJRllfTEVWRUwgPiAxKQorIyBkZWZpbmUgX19zc3BfYm9zMChwdHIpIF9fYnVpbHRpbl9vYmplY3Rfc2l6ZSAocHRyLCAwKQorCisjIGRlZmluZSBfX1NTUF9SRURJUkVDVChuYW1lLCBwcm90bywgYWxpYXMpIFwKKyAgbmFtZSBwcm90byBfX2FzbV9fIChfX1NTUF9BU01OQU1FICgjYWxpYXMpKQorIyBkZWZpbmUgX19TU1BfQVNNTkFNRShjbmFtZSkgIF9fU1NQX0FTTU5BTUUyIChfX1VTRVJfTEFCRUxfUFJFRklYX18sIGNuYW1lKQorIyBkZWZpbmUgX19TU1BfQVNNTkFNRTIocHJlZml4LCBjbmFtZSkgX19TU1BfQVNNTkFNRTMgKHByZWZpeCkgY25hbWUKKyMgZGVmaW5lIF9fU1NQX0FTTU5BTUUzKHByZWZpeCkgI3ByZWZpeAorCisjIHVuZGVmIF9fU1NQX0hBVkVfVlNOUFJJTlRGCisKK2V4dGVybiB2b2lkIF9fY2hrX2ZhaWwgKHZvaWQpIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworI2VuZGlmCisKKyNlbmRpZiAvKiBfU1NQX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3NzcC9zdGRpby5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3NwL3N0ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgzY2E2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3NzcC9zdGRpby5oCkBAIC0wLDAgKzEsMTAwIEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHN0ZGlvIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitJbiBhZGRpdGlvbiB0byB0aGUgcGVybWlzc2lvbnMgaW4gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcyB5b3UgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gbGluayB0aGUKK2NvbXBpbGVkIHZlcnNpb24gb2YgdGhpcyBmaWxlIGludG8gY29tYmluYXRpb25zIHdpdGggb3RoZXIgcHJvZ3JhbXMsCithbmQgdG8gZGlzdHJpYnV0ZSB0aG9zZSBjb21iaW5hdGlvbnMgd2l0aG91dCBhbnkgcmVzdHJpY3Rpb24gY29taW5nCitmcm9tIHRoZSB1c2Ugb2YgdGhpcyBmaWxlLiAgKFRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHJlc3RyaWN0aW9ucworZG8gYXBwbHkgaW4gb3RoZXIgcmVzcGVjdHM7IGZvciBleGFtcGxlLCB0aGV5IGNvdmVyIG1vZGlmaWNhdGlvbiBvZgordGhlIGZpbGUsIGFuZCBkaXN0cmlidXRpb24gd2hlbiBub3QgbGlua2VkIGludG8gYSBjb21iaW5lCitleGVjdXRhYmxlLikKKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKworI2lmbmRlZiBfU1NQX1NURElPX0gKKyNkZWZpbmUgX1NTUF9TVERJT19IIDEKKworI2luY2x1ZGUgPHNzcC5oPgorI2luY2x1ZGVfbmV4dCA8c3RkaW8uaD4KKworI2lmIF9fU1NQX0ZPUlRJRllfTEVWRUwgPiAwCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI3VuZGVmIHNwcmludGYKKyN1bmRlZiB2c3ByaW50ZgorI3VuZGVmIHNucHJpbnRmCisjdW5kZWYgdnNucHJpbnRmCisjdW5kZWYgZ2V0cworI3VuZGVmIGZnZXRzCisKK2V4dGVybiBpbnQgX19zcHJpbnRmX2NoayAoY2hhciAqX19yZXN0cmljdF9fIF9fcywgaW50IF9fZmxhZywgc2l6ZV90IF9fc2xlbiwKKwkJCSAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0X18gX19mb3JtYXQsIC4uLik7CitleHRlcm4gaW50IF9fdnNwcmludGZfY2hrIChjaGFyICpfX3Jlc3RyaWN0X18gX19zLCBpbnQgX19mbGFnLCBzaXplX3QgX19zbGVuLAorCQkJICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0X18gX19mb3JtYXQsCisJCQkgICB2YV9saXN0IF9fYXApOworCisjZGVmaW5lIHNwcmludGYoc3RyLCAuLi4pIFwKKyAgX19idWlsdGluX19fc3ByaW50Zl9jaGsgKHN0ciwgMCwgX19zc3BfYm9zIChzdHIpLCBcCisJCQkgICBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgdnNwcmludGYoc3RyLCBmbXQsIGFwKSBcCisgIF9fYnVpbHRpbl9fX3ZzcHJpbnRmX2NoayAoc3RyLCAwLCBfX3NzcF9ib3MgKHN0ciksIGZtdCwgYXApCisKK2V4dGVybiBpbnQgX19zbnByaW50Zl9jaGsgKGNoYXIgKl9fcmVzdHJpY3RfXyBfX3MsIHNpemVfdCBfX24sIGludCBfX2ZsYWcsCisJCQkgICBzaXplX3QgX19zbGVuLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3RfXyBfX2Zvcm1hdCwKKwkJCSAgIC4uLik7CitleHRlcm4gaW50IF9fdnNucHJpbnRmX2NoayAoY2hhciAqX19yZXN0cmljdF9fIF9fcywgc2l6ZV90IF9fbiwgaW50IF9fZmxhZywKKwkJCSAgICBzaXplX3QgX19zbGVuLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3RfXyBfX2Zvcm1hdCwKKwkJCSAgICB2YV9saXN0IF9fYXApOworCisjZGVmaW5lIHNucHJpbnRmKHN0ciwgbGVuLCAuLi4pIFwKKyAgX19idWlsdGluX19fc25wcmludGZfY2hrIChzdHIsIGxlbiwgMCwgX19zc3BfYm9zIChzdHIpLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgdnNucHJpbnRmKHN0ciwgbGVuLCBmbXQsIGFwKSBcCisgIF9fYnVpbHRpbl9fX3ZzbnByaW50Zl9jaGsgKHN0ciwgbGVuLCAwLCBfX3NzcF9ib3MgKHN0ciksIGZtdCwgYXApCisKK2V4dGVybiBjaGFyICpfX2dldHNfY2hrIChjaGFyICpfX3N0ciwgc2l6ZV90KTsKK2V4dGVybiBjaGFyICpfX1NTUF9SRURJUkVDVCAoX19nZXRzX2FsaWFzLCAoY2hhciAqX19zdHIpLCBnZXRzKTsKKworZXh0ZXJuIGlubGluZSBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpIGNoYXIgKgorZ2V0cyAoY2hhciAqX19zdHIpCit7CisgIGlmIChfX3NzcF9ib3MgKF9fc3RyKSAhPSAoc2l6ZV90KSAtMSkKKyAgICByZXR1cm4gX19nZXRzX2NoayAoX19zdHIsIF9fc3NwX2JvcyAoX19zdHIpKTsKKyAgcmV0dXJuIF9fZ2V0c19hbGlhcyAoX19zdHIpOworfQorCitleHRlcm4gY2hhciAqX19TU1BfUkVESVJFQ1QgKF9fZmdldHNfYWxpYXMsCisJCQkgICAgIChjaGFyICpfX3Jlc3RyaWN0X18gX19zLCBpbnQgX19uLAorCQkJICAgICAgRklMRSAqX19yZXN0cmljdF9fIF9fc3RyZWFtKSwgZmdldHMpOworCitleHRlcm4gaW5saW5lIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkgY2hhciAqCitmZ2V0cyAoY2hhciAqX19yZXN0cmljdF9fIF9fcywgaW50IF9fbiwgRklMRSAqX19yZXN0cmljdF9fIF9fc3RyZWFtKQoreworICBpZiAoX19zc3BfYm9zIChfX3MpICE9IChzaXplX3QpIC0xICYmIChzaXplX3QpIF9fbiA+IF9fc3NwX2JvcyAoX19zKSkKKyAgICBfX2Noa19mYWlsICgpOworICByZXR1cm4gX19mZ2V0c19hbGlhcyAoX19zLCBfX24sIF9fc3RyZWFtKTsKK30KKworI2VuZGlmIC8qIF9fU1NQX0ZPUlRJRllfTEVWRUwgPiAwICovCisjZW5kaWYgLyogX1NTUF9TVERJT19IICovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zc3Avc3RyaW5nLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zc3Avc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0NzU0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3NzcC9zdHJpbmcuaApAQCAtMCwwICsxLDE2NyBAQAorLyogQ2hlY2tpbmcgbWFjcm9zIGZvciBzdHJpbmcgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK0luIGFkZGl0aW9uIHRvIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzIHlvdSB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBsaW5rIHRoZQorY29tcGlsZWQgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaW50byBjb21iaW5hdGlvbnMgd2l0aCBvdGhlciBwcm9ncmFtcywKK2FuZCB0byBkaXN0cmlidXRlIHRob3NlIGNvbWJpbmF0aW9ucyB3aXRob3V0IGFueSByZXN0cmljdGlvbiBjb21pbmcKK2Zyb20gdGhlIHVzZSBvZiB0aGlzIGZpbGUuICAoVGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmVzdHJpY3Rpb25zCitkbyBhcHBseSBpbiBvdGhlciByZXNwZWN0czsgZm9yIGV4YW1wbGUsIHRoZXkgY292ZXIgbW9kaWZpY2F0aW9uIG9mCit0aGUgZmlsZSwgYW5kIGRpc3RyaWJ1dGlvbiB3aGVuIG5vdCBsaW5rZWQgaW50byBhIGNvbWJpbmUKK2V4ZWN1dGFibGUuKQorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworCisjaWZuZGVmIF9TU1BfU1RSSU5HX0gKKyNkZWZpbmUgX1NTUF9TVFJJTkdfSCAxCisKKyNpbmNsdWRlIDxzc3AuaD4KKyNpbmNsdWRlX25leHQgPHN0cmluZy5oPgorCisjaWYgX19TU1BfRk9SVElGWV9MRVZFTCA+IDAKKworI3VuZGVmIG1lbWNweQorI3VuZGVmIG1lbW1vdmUKKyN1bmRlZiBtZW1zZXQKKyN1bmRlZiBzdHJjYXQKKyN1bmRlZiBzdHJjcHkKKyN1bmRlZiBzdHJuY2F0CisjdW5kZWYgc3RybmNweQorI3VuZGVmIG1lbXBjcHkKKyN1bmRlZiBzdHBjcHkKKyN1bmRlZiBiY29weQorI3VuZGVmIGJ6ZXJvCisKKyNkZWZpbmUgbWVtY3B5KGRlc3QsIHNyYywgbGVuKSBcCisgICgoX19zc3BfYm9zMCAoZGVzdCkgIT0gKHNpemVfdCkgLTEpCQkJCQlcCisgICA/IF9fYnVpbHRpbl9fX21lbWNweV9jaGsgKGRlc3QsIHNyYywgbGVuLCBfX3NzcF9ib3MwIChkZXN0KSkJCVwKKyAgIDogX19tZW1jcHlfaWNoayAoZGVzdCwgc3JjLCBsZW4pKQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpIHZvaWQgKgorX19tZW1jcHlfaWNoayAodm9pZCAqX19yZXN0cmljdF9fIF9fZGVzdCwgY29uc3Qgdm9pZCAqX19yZXN0cmljdF9fIF9fc3JjLAorCSAgICAgICBzaXplX3QgX19sZW4pCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19tZW1jcHlfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2xlbiwgX19zc3BfYm9zMCAoX19kZXN0KSk7Cit9CisKKworI2RlZmluZSBtZW1tb3ZlKGRlc3QsIHNyYywgbGVuKSBcCisgICgoX19zc3BfYm9zMCAoZGVzdCkgIT0gKHNpemVfdCkgLTEpCQkJCQlcCisgICA/IF9fYnVpbHRpbl9fX21lbW1vdmVfY2hrIChkZXN0LCBzcmMsIGxlbiwgX19zc3BfYm9zMCAoZGVzdCkpCQlcCisgICA6IF9fbWVtbW92ZV9pY2hrIChkZXN0LCBzcmMsIGxlbikpCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkgdm9pZCAqCitfX21lbW1vdmVfaWNoayAodm9pZCAqX19kZXN0LCBjb25zdCB2b2lkICpfX3NyYywgc2l6ZV90IF9fbGVuKQoreworICByZXR1cm4gX19idWlsdGluX19fbWVtbW92ZV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbGVuLCBfX3NzcF9ib3MwIChfX2Rlc3QpKTsKK30KKworCisjZGVmaW5lIG1lbXBjcHkoZGVzdCwgc3JjLCBsZW4pIFwKKyAgKChfX3NzcF9ib3MwIChkZXN0KSAhPSAoc2l6ZV90KSAtMSkJCQkJCVwKKyAgID8gX19idWlsdGluX19fbWVtcGNweV9jaGsgKGRlc3QsIHNyYywgbGVuLCBfX3NzcF9ib3MwIChkZXN0KSkJXAorICAgOiBfX21lbXBjcHlfaWNoayAoZGVzdCwgc3JjLCBsZW4pKQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpIHZvaWQgKgorX19tZW1wY3B5X2ljaGsgKHZvaWQgKl9fcmVzdHJpY3RfXyBfX2Rlc3QsIGNvbnN0IHZvaWQgKl9fcmVzdHJpY3RfXyBfX3NyYywKKwkJc2l6ZV90IF9fbGVuKQoreworICByZXR1cm4gX19idWlsdGluX19fbWVtcGNweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbGVuLCBfX3NzcF9ib3MwIChfX2Rlc3QpKTsKK30KKworCisjZGVmaW5lIG1lbXNldChkZXN0LCBjaCwgbGVuKSBcCisgICgoX19zc3BfYm9zMCAoZGVzdCkgIT0gKHNpemVfdCkgLTEpCQkJCQlcCisgICA/IF9fYnVpbHRpbl9fX21lbXNldF9jaGsgKGRlc3QsIGNoLCBsZW4sIF9fc3NwX2JvczAgKGRlc3QpKQkJXAorICAgOiBfX21lbXNldF9pY2hrIChkZXN0LCBjaCwgbGVuKSkKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKSB2b2lkICoKK19fbWVtc2V0X2ljaGsgKHZvaWQgKl9fZGVzdCwgaW50IF9fY2gsIHNpemVfdCBfX2xlbikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX21lbXNldF9jaGsgKF9fZGVzdCwgX19jaCwgX19sZW4sIF9fc3NwX2JvczAgKF9fZGVzdCkpOworfQorCisjZGVmaW5lIGJjb3B5KHNyYywgZGVzdCwgbGVuKSAoKHZvaWQpIFwKKyAoKF9fc3NwX2JvczAgKGRlc3QpICE9IChzaXplX3QpIC0xKQkJCQkJXAorICAgPyBfX2J1aWx0aW5fX19tZW1tb3ZlX2NoayAoZGVzdCwgc3JjLCBsZW4sIF9fc3NwX2JvczAgKGRlc3QpKQlcCisgICA6IF9fbWVtbW92ZV9pY2hrIChkZXN0LCBzcmMsIGxlbikpKQorI2RlZmluZSBiemVybyhkZXN0LCBsZW4pICgodm9pZCkgXAorICAoKF9fc3NwX2JvczAgKGRlc3QpICE9IChzaXplX3QpIC0xKQkJCQkJXAorICAgPyBfX2J1aWx0aW5fX19tZW1zZXRfY2hrIChkZXN0LCAnXDAnLCBsZW4sIF9fc3NwX2JvczAgKGRlc3QpKQlcCisgICA6IF9fbWVtc2V0X2ljaGsgKGRlc3QsICdcMCcsIGxlbikpKQorCisKKyNkZWZpbmUgc3RyY3B5KGRlc3QsIHNyYykgXAorICAoKF9fc3NwX2JvcyAoZGVzdCkgIT0gKHNpemVfdCkgLTEpCQkJCQlcCisgICA/IF9fYnVpbHRpbl9fX3N0cmNweV9jaGsgKGRlc3QsIHNyYywgX19zc3BfYm9zIChkZXN0KSkJCVwKKyAgIDogX19zdHJjcHlfaWNoayAoZGVzdCwgc3JjKSkKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKSBjaGFyICoKK19fc3RyY3B5X2ljaGsgKGNoYXIgKl9fcmVzdHJpY3RfXyBfX2Rlc3QsIGNvbnN0IGNoYXIgKl9fcmVzdHJpY3RfXyBfX3NyYykKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX3N0cmNweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fc3NwX2JvcyAoX19kZXN0KSk7Cit9CisKKworI2RlZmluZSBzdHBjcHkoZGVzdCwgc3JjKSBcCisgICgoX19zc3BfYm9zIChkZXN0KSAhPSAoc2l6ZV90KSAtMSkJCQkJCVwKKyAgID8gX19idWlsdGluX19fc3RwY3B5X2NoayAoZGVzdCwgc3JjLCBfX3NzcF9ib3MgKGRlc3QpKQkJXAorICAgOiBfX3N0cGNweV9pY2hrIChkZXN0LCBzcmMpKQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpIGNoYXIgKgorX19zdHBjcHlfaWNoayAoY2hhciAqX19yZXN0cmljdF9fIF9fZGVzdCwgY29uc3QgY2hhciAqX19yZXN0cmljdF9fIF9fc3JjKQoreworICByZXR1cm4gX19idWlsdGluX19fc3RwY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19zc3BfYm9zIChfX2Rlc3QpKTsKK30KKworCisjZGVmaW5lIHN0cm5jcHkoZGVzdCwgc3JjLCBsZW4pIFwKKyAgKChfX3NzcF9ib3MgKGRlc3QpICE9IChzaXplX3QpIC0xKQkJCQkJXAorICAgPyBfX2J1aWx0aW5fX19zdHJuY3B5X2NoayAoZGVzdCwgc3JjLCBsZW4sIF9fc3NwX2JvcyAoZGVzdCkpCQlcCisgICA6IF9fc3RybmNweV9pY2hrIChkZXN0LCBzcmMsIGxlbikpCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkgY2hhciAqCitfX3N0cm5jcHlfaWNoayAoY2hhciAqX19yZXN0cmljdF9fIF9fZGVzdCwgY29uc3QgY2hhciAqX19yZXN0cmljdF9fIF9fc3JjLAorCQlzaXplX3QgX19sZW4pCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19zdHJuY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19sZW4sIF9fc3NwX2JvcyAoX19kZXN0KSk7Cit9CisKKworI2RlZmluZSBzdHJjYXQoZGVzdCwgc3JjKSBcCisgICgoX19zc3BfYm9zIChkZXN0KSAhPSAoc2l6ZV90KSAtMSkJCQkJCVwKKyAgID8gX19idWlsdGluX19fc3RyY2F0X2NoayAoZGVzdCwgc3JjLCBfX3NzcF9ib3MgKGRlc3QpKQkJXAorICAgOiBfX3N0cmNhdF9pY2hrIChkZXN0LCBzcmMpKQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpIGNoYXIgKgorX19zdHJjYXRfaWNoayAoY2hhciAqX19yZXN0cmljdF9fIF9fZGVzdCwgY29uc3QgY2hhciAqX19yZXN0cmljdF9fIF9fc3JjKQoreworICByZXR1cm4gX19idWlsdGluX19fc3RyY2F0X2NoayAoX19kZXN0LCBfX3NyYywgX19zc3BfYm9zIChfX2Rlc3QpKTsKK30KKworCisjZGVmaW5lIHN0cm5jYXQoZGVzdCwgc3JjLCBsZW4pIFwKKyAgKChfX3NzcF9ib3MgKGRlc3QpICE9IChzaXplX3QpIC0xKQkJCQkJXAorICAgPyBfX2J1aWx0aW5fX19zdHJuY2F0X2NoayAoZGVzdCwgc3JjLCBsZW4sIF9fc3NwX2JvcyAoZGVzdCkpCQlcCisgICA6IF9fc3RybmNhdF9pY2hrIChkZXN0LCBzcmMsIGxlbikpCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkgY2hhciAqCitfX3N0cm5jYXRfaWNoayAoY2hhciAqX19yZXN0cmljdF9fIF9fZGVzdCwgY29uc3QgY2hhciAqX19yZXN0cmljdF9fIF9fc3JjLAorCQlzaXplX3QgX19sZW4pCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19zdHJuY2F0X2NoayAoX19kZXN0LCBfX3NyYywgX19sZW4sIF9fc3NwX2JvcyAoX19kZXN0KSk7Cit9CisKKyNlbmRpZiAvKiBfX1NTUF9GT1JUSUZZX0xFVkVMID4gMCAqLworI2VuZGlmIC8qIF9TU1BfU1RSSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3NzcC91bmlzdGQuaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3NzcC91bmlzdGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDNmZTUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3NwL3VuaXN0ZC5oCkBAIC0wLDAgKzEsODQgQEAKKy8qIENoZWNraW5nIG1hY3JvcyBmb3IgdW5pc3RkIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitJbiBhZGRpdGlvbiB0byB0aGUgcGVybWlzc2lvbnMgaW4gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcyB5b3UgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gbGluayB0aGUKK2NvbXBpbGVkIHZlcnNpb24gb2YgdGhpcyBmaWxlIGludG8gY29tYmluYXRpb25zIHdpdGggb3RoZXIgcHJvZ3JhbXMsCithbmQgdG8gZGlzdHJpYnV0ZSB0aG9zZSBjb21iaW5hdGlvbnMgd2l0aG91dCBhbnkgcmVzdHJpY3Rpb24gY29taW5nCitmcm9tIHRoZSB1c2Ugb2YgdGhpcyBmaWxlLiAgKFRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHJlc3RyaWN0aW9ucworZG8gYXBwbHkgaW4gb3RoZXIgcmVzcGVjdHM7IGZvciBleGFtcGxlLCB0aGV5IGNvdmVyIG1vZGlmaWNhdGlvbiBvZgordGhlIGZpbGUsIGFuZCBkaXN0cmlidXRpb24gd2hlbiBub3QgbGlua2VkIGludG8gYSBjb21iaW5lCitleGVjdXRhYmxlLikKKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKworI2lmbmRlZiBfU1NQX1VOSVNURF9ICisjZGVmaW5lIF9TU1BfVU5JU1REX0ggMQorCisjaW5jbHVkZSA8c3NwLmg+CisjaW5jbHVkZV9uZXh0IDx1bmlzdGQuaD4KKworI2lmIF9fU1NQX0ZPUlRJRllfTEVWRUwgPiAwCisKKyN1bmRlZiByZWFkCisjdW5kZWYgcmVhZGxpbmsKKyN1bmRlZiBnZXRjd2QKKworZXh0ZXJuIHNzaXplX3QgX19TU1BfUkVESVJFQ1QgKF9fcmVhZF9hbGlhcywgKGludCBfX2ZkLCB2b2lkICpfX2J1ZiwKKwkJCQkJICAgICAgc2l6ZV90IF9fbmJ5dGVzKSwgcmVhZCk7CisKK2V4dGVybiBpbmxpbmUgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKSBzc2l6ZV90CityZWFkIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcykKK3sKKyAgaWYgKF9fc3NwX2JvczAgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSAmJiBfX25ieXRlcyA+IF9fc3NwX2JvczAgKF9fYnVmKSkKKyAgICBfX2Noa19mYWlsICgpOworICByZXR1cm4gX19yZWFkX2FsaWFzIChfX2ZkLCBfX2J1ZiwgX19uYnl0ZXMpOworfQorCitleHRlcm4gaW50IF9fU1NQX1JFRElSRUNUIChfX3JlYWRsaW5rX2FsaWFzLAorCQkJICAgKGNvbnN0IGNoYXIgKl9fcmVzdHJpY3RfXyBfX3BhdGgsCisJCQkgICAgY2hhciAqX19yZXN0cmljdF9fIF9fYnVmLCBzaXplX3QgX19sZW4pLAorCQkJICAgcmVhZGxpbmspOworCitleHRlcm4gaW5saW5lIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkgaW50CityZWFkbGluayAoY29uc3QgY2hhciAqX19yZXN0cmljdF9fIF9fcGF0aCwgY2hhciAqX19yZXN0cmljdF9fIF9fYnVmLAorCSAgc2l6ZV90IF9fbGVuKQoreworICBpZiAoX19zc3BfYm9zIChfX2J1ZikgIT0gKHNpemVfdCkgLTEgJiYgX19sZW4gPiBfX3NzcF9ib3MgKF9fYnVmKSkKKyAgICBfX2Noa19mYWlsICgpOworICByZXR1cm4gX19yZWFkbGlua19hbGlhcyAoX19wYXRoLCBfX2J1ZiwgX19sZW4pOworfQorCitleHRlcm4gY2hhciAqX19TU1BfUkVESVJFQ1QgKF9fZ2V0Y3dkX2FsaWFzLAorCQkJICAgICAoY2hhciAqX19idWYsIHNpemVfdCBfX3NpemUpLCBnZXRjd2QpOworCitleHRlcm4gaW5saW5lIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkgY2hhciAqCitnZXRjd2QgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19zaXplKQoreworICBpZiAoX19zc3BfYm9zIChfX2J1ZikgIT0gKHNpemVfdCkgLTEgJiYgX19zaXplID4gX19zc3BfYm9zIChfX2J1ZikpCisgICAgX19jaGtfZmFpbCAoKTsKKyAgcmV0dXJuIF9fZ2V0Y3dkX2FsaWFzIChfX2J1ZiwgX19zaXplKTsKK30KKworI2VuZGlmIC8qIF9fU1NQX0ZPUlRJRllfTEVWRUwgPiAwICovCisjZW5kaWYgLyogX1NTUF9VTklTVERfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3RkYWxpZ24uaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3N0ZGFsaWduLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU1NDVkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3N0ZGFsaWduLmgKQEAgLTAsMCArMSwzOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIElTTyBDMVg6IDcuMTUgQWxpZ25tZW50IDxzdGRhbGlnbi5oPi4gICovCisKKyNpZm5kZWYgX1NUREFMSUdOX0gKKyNkZWZpbmUgX1NUREFMSUdOX0gKKworI2lmbmRlZiBfX2NwbHVzcGx1cworCisjZGVmaW5lIGFsaWduYXMgX0FsaWduYXMKKyNkZWZpbmUgYWxpZ25vZiBfQWxpZ25vZgorCisjZGVmaW5lIF9fYWxpZ25hc19pc19kZWZpbmVkIDEKKyNkZWZpbmUgX19hbGlnbm9mX2lzX2RlZmluZWQgMQorCisjZW5kaWYKKworI2VuZGlmCS8qIHN0ZGFsaWduLmggKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3N0ZGFyZy5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3RkYXJnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI0ZTBkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3N0ZGFyZy5oCkBAIC0wLDAgKzEsMTI2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5ODktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyoKKyAqIElTTyBDIFN0YW5kYXJkOiAgNy4xNSAgVmFyaWFibGUgYXJndW1lbnRzICA8c3RkYXJnLmg+CisgKi8KKworI2lmbmRlZiBfU1REQVJHX0gKKyNpZm5kZWYgX0FOU0lfU1REQVJHX0hfCisjaWZuZGVmIF9fbmVlZF9fX3ZhX2xpc3QKKyNkZWZpbmUgX1NUREFSR19ICisjZGVmaW5lIF9BTlNJX1NUREFSR19IXworI2VuZGlmIC8qIG5vdCBfX25lZWRfX192YV9saXN0ICovCisjdW5kZWYgX19uZWVkX19fdmFfbGlzdAorCisvKiBEZWZpbmUgX19nbnVjX3ZhX2xpc3QuICAqLworCisjaWZuZGVmIF9fR05VQ19WQV9MSVNUCisjZGVmaW5lIF9fR05VQ19WQV9MSVNUCit0eXBlZGVmIF9fYnVpbHRpbl92YV9saXN0IF9fZ251Y192YV9saXN0OworI2VuZGlmCisKKy8qIERlZmluZSB0aGUgc3RhbmRhcmQgbWFjcm9zIGZvciB0aGUgdXNlciwKKyAgIGlmIHRoaXMgaW52b2NhdGlvbiB3YXMgZnJvbSB0aGUgdXNlciBwcm9ncmFtLiAgKi8KKyNpZmRlZiBfU1REQVJHX0gKKworI2RlZmluZSB2YV9zdGFydCh2LGwpCV9fYnVpbHRpbl92YV9zdGFydCh2LGwpCisjZGVmaW5lIHZhX2VuZCh2KQlfX2J1aWx0aW5fdmFfZW5kKHYpCisjZGVmaW5lIHZhX2FyZyh2LGwpCV9fYnVpbHRpbl92YV9hcmcodixsKQorI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgX19TVERDX1ZFUlNJT05fXyArIDAgPj0gMTk5OTAwTCB8fCBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKQorI2RlZmluZSB2YV9jb3B5KGQscykJX19idWlsdGluX3ZhX2NvcHkoZCxzKQorI2VuZGlmCisjZGVmaW5lIF9fdmFfY29weShkLHMpCV9fYnVpbHRpbl92YV9jb3B5KGQscykKKworLyogRGVmaW5lIHZhX2xpc3QsIGlmIGRlc2lyZWQsIGZyb20gX19nbnVjX3ZhX2xpc3QuICovCisvKiBXZSBkZWxpYmVyYXRlbHkgZG8gbm90IGRlZmluZSB2YV9saXN0IHdoZW4gY2FsbGVkIGZyb20KKyAgIHN0ZGlvLmgsIGJlY2F1c2UgQU5TSSBDIHNheXMgdGhhdCBzdGRpby5oIGlzIG5vdCBzdXBwb3NlZCB0byBkZWZpbmUKKyAgIHZhX2xpc3QuICBzdGRpby5oIG5lZWRzIHRvIGhhdmUgYWNjZXNzIHRvIHRoYXQgZGF0YSB0eXBlLCAKKyAgIGJ1dCBtdXN0IG5vdCB1c2UgdGhhdCBuYW1lLiAgSXQgc2hvdWxkIHVzZSB0aGUgbmFtZSBfX2dudWNfdmFfbGlzdCwKKyAgIHdoaWNoIGlzIHNhZmUgYmVjYXVzZSBpdCBpcyByZXNlcnZlZCBmb3IgdGhlIGltcGxlbWVudGF0aW9uLiAgKi8KKworI2lmZGVmIF9CU0RfVkFfTElTVAorI3VuZGVmIF9CU0RfVkFfTElTVAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fc3ZyNF9fKSB8fCAoZGVmaW5lZChfU0NPX0RTKSAmJiAhZGVmaW5lZChfX1ZBX0xJU1QpKQorLyogU1ZSNC4yIHVzZXMgX1ZBX0xJU1QgZm9yIGFuIGludGVybmFsIGFsaWFzIGZvciB2YV9saXN0LAorICAgc28gd2UgbXVzdCBhdm9pZCB0ZXN0aW5nIGl0IGFuZCBzZXR0aW5nIGl0IGhlcmUuCisgICBTVlI0IHVzZXMgX1ZBX0xJU1QgYXMgYSBmbGFnIGluIHN0ZGFyZy5oLCBidXQgd2Ugc2hvdWxkCisgICBoYXZlIG5vIGNvbmZsaWN0IHdpdGggdGhhdC4gICovCisjaWZuZGVmIF9WQV9MSVNUXworI2RlZmluZSBfVkFfTElTVF8KKyNpZmRlZiBfX2k4NjBfXworI2lmbmRlZiBfVkFfTElTVAorI2RlZmluZSBfVkFfTElTVCB2YV9saXN0CisjZW5kaWYKKyNlbmRpZiAvKiBfX2k4NjBfXyAqLwordHlwZWRlZiBfX2dudWNfdmFfbGlzdCB2YV9saXN0OworI2lmZGVmIF9TQ09fRFMKKyNkZWZpbmUgX19WQV9MSVNUCisjZW5kaWYKKyNlbmRpZiAvKiBfVkFfTElTVF8gKi8KKyNlbHNlIC8qIG5vdCBfX3N2cjRfXyB8fCBfU0NPX0RTICovCisKKy8qIFRoZSBtYWNybyBfVkFfTElTVF8gaXMgdGhlIHNhbWUgdGhpbmcgdXNlZCBieSB0aGlzIGZpbGUgaW4gVWx0cml4LgorICAgQnV0IG9uIEJTRCBORVQyIHdlIG11c3Qgbm90IHRlc3Qgb3IgZGVmaW5lIG9yIHVuZGVmIGl0LgorICAgKE5vdGUgdGhhdCB0aGUgY29tbWVudHMgaW4gTkVUIDIncyBhbnNpLmgKKyAgIGFyZSBpbmNvcnJlY3QgZm9yIF9WQV9MSVNUXy0tc2VlIHN0ZGlvLmghKSAgKi8KKyNpZiAhZGVmaW5lZCAoX1ZBX0xJU1RfKSB8fCBkZWZpbmVkIChfX0JTRF9ORVQyX18pIHx8IGRlZmluZWQgKF9fX18zODZCU0RfX19fKSB8fCBkZWZpbmVkIChfX2JzZGlfXykgfHwgZGVmaW5lZCAoX19zZXF1ZW50X18pIHx8IGRlZmluZWQgKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKFdJTk5UKQorLyogVGhlIG1hY3JvIF9WQV9MSVNUX0RFRklORUQgaXMgdXNlZCBpbiBXaW5kb3dzIE5UIDMuNSAgKi8KKyNpZm5kZWYgX1ZBX0xJU1RfREVGSU5FRAorLyogVGhlIG1hY3JvIF9WQV9MSVNUIGlzIHVzZWQgaW4gU0NPIFVuaXggMy4yLiAgKi8KKyNpZm5kZWYgX1ZBX0xJU1QKKy8qIFRoZSBtYWNybyBfVkFfTElTVF9UX0ggaXMgdXNlZCBpbiB0aGUgQnVsbCBkcHgyICAqLworI2lmbmRlZiBfVkFfTElTVF9UX0gKKy8qIFRoZSBtYWNybyBfX3ZhX2xpc3RfXyBpcyB1c2VkIGJ5IEJlT1MuICAqLworI2lmbmRlZiBfX3ZhX2xpc3RfXwordHlwZWRlZiBfX2dudWNfdmFfbGlzdCB2YV9saXN0OworI2VuZGlmIC8qIG5vdCBfX3ZhX2xpc3RfXyAqLworI2VuZGlmIC8qIG5vdCBfVkFfTElTVF9UX0ggKi8KKyNlbmRpZiAvKiBub3QgX1ZBX0xJU1QgKi8KKyNlbmRpZiAvKiBub3QgX1ZBX0xJU1RfREVGSU5FRCAqLworI2lmICEoZGVmaW5lZCAoX19CU0RfTkVUMl9fKSB8fCBkZWZpbmVkIChfX19fMzg2QlNEX19fXykgfHwgZGVmaW5lZCAoX19ic2RpX18pIHx8IGRlZmluZWQgKF9fc2VxdWVudF9fKSB8fCBkZWZpbmVkIChfX0ZyZWVCU0RfXykpCisjZGVmaW5lIF9WQV9MSVNUXworI2VuZGlmCisjaWZuZGVmIF9WQV9MSVNUCisjZGVmaW5lIF9WQV9MSVNUCisjZW5kaWYKKyNpZm5kZWYgX1ZBX0xJU1RfREVGSU5FRAorI2RlZmluZSBfVkFfTElTVF9ERUZJTkVECisjZW5kaWYKKyNpZm5kZWYgX1ZBX0xJU1RfVF9ICisjZGVmaW5lIF9WQV9MSVNUX1RfSAorI2VuZGlmCisjaWZuZGVmIF9fdmFfbGlzdF9fCisjZGVmaW5lIF9fdmFfbGlzdF9fCisjZW5kaWYKKworI2VuZGlmIC8qIG5vdCBfVkFfTElTVF8sIGV4Y2VwdCBvbiBjZXJ0YWluIHN5c3RlbXMgKi8KKworI2VuZGlmIC8qIG5vdCBfX3N2cjRfXyAqLworCisjZW5kaWYgLyogX1NUREFSR19IICovCisKKyNlbmRpZiAvKiBub3QgX0FOU0lfU1REQVJHX0hfICovCisjZW5kaWYgLyogbm90IF9TVERBUkdfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3RkYm9vbC5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3RkYm9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNDZlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zdGRib29sLmgKQEAgLTAsMCArMSw1MCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk4LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qCisgKiBJU08gQyBTdGFuZGFyZDogIDcuMTYgIEJvb2xlYW4gdHlwZSBhbmQgdmFsdWVzICA8c3RkYm9vbC5oPgorICovCisKKyNpZm5kZWYgX1NUREJPT0xfSAorI2RlZmluZSBfU1REQk9PTF9ICisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKworI2RlZmluZSBib29sCV9Cb29sCisjZGVmaW5lIHRydWUJMQorI2RlZmluZSBmYWxzZQkwCisKKyNlbHNlIC8qIF9fY3BsdXNwbHVzICovCisKKy8qIFN1cHBvcnRpbmcgPHN0ZGJvb2wuaD4gaW4gQysrIGlzIGEgR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIF9Cb29sCWJvb2wKKyNkZWZpbmUgYm9vbAlib29sCisjZGVmaW5lIGZhbHNlCWZhbHNlCisjZGVmaW5lIHRydWUJdHJ1ZQorCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyogU2lnbmFsIHRoYXQgYWxsIHRoZSBkZWZpbml0aW9ucyBhcmUgcHJlc2VudC4gICovCisjZGVmaW5lIF9fYm9vbF90cnVlX2ZhbHNlX2FyZV9kZWZpbmVkCTEKKworI2VuZGlmCS8qIHN0ZGJvb2wuaCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3RkZGVmLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zdGRkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDRkZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3RkZGVmLmgKQEAgLTAsMCArMSw0MzkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk4OS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1VuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKgorICogSVNPIEMgU3RhbmRhcmQ6ICA3LjE3ICBDb21tb24gZGVmaW5pdGlvbnMgIDxzdGRkZWYuaD4KKyAqLworI2lmICghZGVmaW5lZChfU1REREVGX0gpICYmICFkZWZpbmVkKF9TVERERUZfSF8pICYmICFkZWZpbmVkKF9BTlNJX1NURERFRl9IKSBcCisgICAgICYmICFkZWZpbmVkKF9fU1REREVGX0hfXykpIFwKKyAgICB8fCBkZWZpbmVkKF9fbmVlZF93Y2hhcl90KSB8fCBkZWZpbmVkKF9fbmVlZF9zaXplX3QpIFwKKyAgICB8fCBkZWZpbmVkKF9fbmVlZF9wdHJkaWZmX3QpIHx8IGRlZmluZWQoX19uZWVkX05VTEwpIFwKKyAgICB8fCBkZWZpbmVkKF9fbmVlZF93aW50X3QpCisKKy8qIEFueSBvbmUgb2YgdGhlc2Ugc3ltYm9scyBfX25lZWRfKiBtZWFucyB0aGF0IEdOVSBsaWJjCisgICB3YW50cyB1cyBqdXN0IHRvIGRlZmluZSBvbmUgZGF0YSB0eXBlLiAgU28gZG9uJ3QgZGVmaW5lCisgICB0aGUgc3ltYm9scyB0aGF0IGluZGljYXRlIHRoaXMgZmlsZSdzIGVudGlyZSBqb2IgaGFzIGJlZW4gZG9uZS4gICovCisjaWYgKCFkZWZpbmVkKF9fbmVlZF93Y2hhcl90KSAmJiAhZGVmaW5lZChfX25lZWRfc2l6ZV90KQlcCisgICAgICYmICFkZWZpbmVkKF9fbmVlZF9wdHJkaWZmX3QpICYmICFkZWZpbmVkKF9fbmVlZF9OVUxMKQlcCisgICAgICYmICFkZWZpbmVkKF9fbmVlZF93aW50X3QpKQorI2RlZmluZSBfU1REREVGX0gKKyNkZWZpbmUgX1NURERFRl9IXworLyogc25hcm9mZkBuZXh0LmNvbSBzYXlzIHRoZSBOZVhUIG5lZWRzIHRoaXMuICAqLworI2RlZmluZSBfQU5TSV9TVERERUZfSAorI2VuZGlmCisKKyNpZm5kZWYgX19zeXNfc3RkdHlwZXNfaAorLyogVGhpcyBhdm9pZHMgbG9zc2FnZSBvbiBTdW5PUyBidXQgb25seSBpZiBzdGR0eXBlcy5oIGNvbWVzIGZpcnN0LgorICAgVGhlcmUncyBubyB3YXkgdG8gd2luIHdpdGggdGhlIG90aGVyIG9yZGVyISAgU3VuIGxvc3NhZ2UuICAqLworCisvKiBPbiA0LjNic2QtbmV0MiwgbWFrZSBzdXJlIGFuc2kuaCBpcyBpbmNsdWRlZCwgc28gd2UgaGF2ZQorICAgb25lIGxlc3MgY2FzZSB0byBkZWFsIHdpdGggaW4gdGhlIGZvbGxvd2luZy4gICovCisjaWYgZGVmaW5lZCAoX19CU0RfTkVUMl9fKSB8fCBkZWZpbmVkIChfX19fMzg2QlNEX19fXykgfHwgKGRlZmluZWQgKF9fRnJlZUJTRF9fKSAmJiAoX19GcmVlQlNEX18gPCA1KSkgfHwgZGVmaW5lZChfX05ldEJTRF9fKQorI2luY2x1ZGUgPG1hY2hpbmUvYW5zaS5oPgorI2VuZGlmCisvKiBPbiBGcmVlQlNEIDUsIG1hY2hpbmUvYW5zaS5oIGRvZXMgbm90IGV4aXN0IGFueW1vcmUuLi4gKi8KKyNpZiBkZWZpbmVkIChfX0ZyZWVCU0RfXykgJiYgKF9fRnJlZUJTRF9fID49IDUpCisjaW5jbHVkZSA8c3lzL190eXBlcy5oPgorI2VuZGlmCisKKy8qIEluIDQuM2JzZC1uZXQyLCBtYWNoaW5lL2Fuc2kuaCBkZWZpbmVzIHRoZXNlIHN5bWJvbHMsIHdoaWNoIGFyZQorICAgZGVmaW5lZCBpZiB0aGUgY29ycmVzcG9uZGluZyB0eXBlIGlzICpub3QqIGRlZmluZWQuCisgICBGcmVlQlNELTIuMSBkZWZpbmVzIF9NQUNISU5FX0FOU0lfSF8gaW5zdGVhZCBvZiBfQU5TSV9IXy4KKyAgIE5ldEJTRCBkZWZpbmVzIF9JMzg2X0FOU0lfSF8gYW5kIF9YODZfNjRfQU5TSV9IXyBpbnN0ZWFkIG9mIF9BTlNJX0hfICovCisjaWYgZGVmaW5lZChfQU5TSV9IXykgfHwgZGVmaW5lZChfTUFDSElORV9BTlNJX0hfKSB8fCBkZWZpbmVkKF9YODZfNjRfQU5TSV9IXykgIHx8IGRlZmluZWQoX0kzODZfQU5TSV9IXykKKyNpZiAhZGVmaW5lZChfU0laRV9UXykgJiYgIWRlZmluZWQoX0JTRF9TSVpFX1RfKQorI2RlZmluZSBfU0laRV9UCisjZW5kaWYKKyNpZiAhZGVmaW5lZChfUFRSRElGRl9UXykgJiYgIWRlZmluZWQoX0JTRF9QVFJESUZGX1RfKQorI2RlZmluZSBfUFRSRElGRl9UCisjZW5kaWYKKy8qIE9uIEJTRC8zODYgMS4xLCBhdCBsZWFzdCwgbWFjaGluZS9hbnNpLmggZGVmaW5lcyBfQlNEX1dDSEFSX1RfCisgICBpbnN0ZWFkIG9mIF9XQ0hBUl9UXy4gKi8KKyNpZiAhZGVmaW5lZChfV0NIQVJfVF8pICYmICFkZWZpbmVkKF9CU0RfV0NIQVJfVF8pCisjaWZuZGVmIF9CU0RfV0NIQVJfVF8KKyNkZWZpbmUgX1dDSEFSX1QKKyNlbmRpZgorI2VuZGlmCisvKiBVbmRlZiBfRk9PX1RfIGlmIHdlIGFyZSBzdXBwb3NlZCB0byBkZWZpbmUgZm9vX3QuICAqLworI2lmIGRlZmluZWQgKF9fbmVlZF9wdHJkaWZmX3QpIHx8IGRlZmluZWQgKF9TVERERUZfSF8pCisjdW5kZWYgX1BUUkRJRkZfVF8KKyN1bmRlZiBfQlNEX1BUUkRJRkZfVF8KKyNlbmRpZgorI2lmIGRlZmluZWQgKF9fbmVlZF9zaXplX3QpIHx8IGRlZmluZWQgKF9TVERERUZfSF8pCisjdW5kZWYgX1NJWkVfVF8KKyN1bmRlZiBfQlNEX1NJWkVfVF8KKyNlbmRpZgorI2lmIGRlZmluZWQgKF9fbmVlZF93Y2hhcl90KSB8fCBkZWZpbmVkIChfU1REREVGX0hfKQorI3VuZGVmIF9XQ0hBUl9UXworI3VuZGVmIF9CU0RfV0NIQVJfVF8KKyNlbmRpZgorI2VuZGlmIC8qIGRlZmluZWQoX0FOU0lfSF8pIHx8IGRlZmluZWQoX01BQ0hJTkVfQU5TSV9IXykgfHwgZGVmaW5lZChfWDg2XzY0X0FOU0lfSF8pIHx8IGRlZmluZWQoX0kzODZfQU5TSV9IXykgKi8KKworLyogU2VxdWVudCdzIGhlYWRlciBmaWxlcyB1c2UgX1BUUkRJRkZfVF8gaW4gc29tZSBjb25mbGljdGluZyB3YXkuCisgICBKdXN0IGlnbm9yZSBpdC4gICovCisjaWYgZGVmaW5lZCAoX19zZXF1ZW50X18pICYmIGRlZmluZWQgKF9QVFJESUZGX1RfKQorI3VuZGVmIF9QVFJESUZGX1RfCisjZW5kaWYKKworLyogT24gVnhXb3JrcywgPHR5cGUvdnhUeXBlc0Jhc2UuaD4gbWF5IGhhdmUgZGVmaW5lZCBtYWNyb3MgbGlrZQorICAgX1RZUEVfc2l6ZV90IHdoaWNoIHdpbGwgdHlwZWRlZiBzaXplX3QuICBmaXhpbmNsdWRlcyBwYXRjaGVkIHRoZQorICAgdnhUeXBlc0Jhc2UuaCBzbyB0aGF0IHRoaXMgbWFjcm8gaXMgb25seSBkZWZpbmVkIGlmIF9HQ0NfU0laRV9UIGlzCisgICBub3QgZGVmaW5lZCwgYW5kIHNvIHRoYXQgZGVmaW5pbmcgdGhpcyBtYWNybyBkZWZpbmVzIF9HQ0NfU0laRV9ULgorICAgSWYgd2UgZmluZCB0aGF0IHRoZSBtYWNyb3MgYXJlIHN0aWxsIGRlZmluZWQgYXQgdGhpcyBwb2ludCwgd2UgbXVzdAorICAgaW52b2tlIHRoZW0gc28gdGhhdCB0aGUgdHlwZSBpcyBkZWZpbmVkIGFzIGV4cGVjdGVkLiAgKi8KKyNpZiBkZWZpbmVkIChfVFlQRV9wdHJkaWZmX3QpICYmIChkZWZpbmVkIChfX25lZWRfcHRyZGlmZl90KSB8fCBkZWZpbmVkIChfU1REREVGX0hfKSkKK19UWVBFX3B0cmRpZmZfdDsKKyN1bmRlZiBfVFlQRV9wdHJkaWZmX3QKKyNlbmRpZgorI2lmIGRlZmluZWQgKF9UWVBFX3NpemVfdCkgJiYgKGRlZmluZWQgKF9fbmVlZF9zaXplX3QpIHx8IGRlZmluZWQgKF9TVERERUZfSF8pKQorX1RZUEVfc2l6ZV90OworI3VuZGVmIF9UWVBFX3NpemVfdAorI2VuZGlmCisjaWYgZGVmaW5lZCAoX1RZUEVfd2NoYXJfdCkgJiYgKGRlZmluZWQgKF9fbmVlZF93Y2hhcl90KSB8fCBkZWZpbmVkIChfU1REREVGX0hfKSkKK19UWVBFX3djaGFyX3Q7CisjdW5kZWYgX1RZUEVfd2NoYXJfdAorI2VuZGlmCisKKy8qIEluIGNhc2Ugbm9ib2R5IGhhcyBkZWZpbmVkIHRoZXNlIHR5cGVzLCBidXQgd2UgYXJlbid0IHJ1bm5pbmcgdW5kZXIKKyAgIEdDQyAyLjAwLCBtYWtlIHN1cmUgdGhhdCBfX1BUUkRJRkZfVFlQRV9fLCBfX1NJWkVfVFlQRV9fLCBhbmQKKyAgIF9fV0NIQVJfVFlQRV9fIGhhdmUgcmVhc29uYWJsZSB2YWx1ZXMuICBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlCisgICBwYXJ0cyBvZiBHQ0MgaXMgY29tcGlsZWQgYnkgYW4gb2xkZXIgY29tcGlsZXIsIHRoYXQgYWN0dWFsbHkKKyAgIGluY2x1ZGUgZ3N0ZGRlZi5oLCBzdWNoIGFzIGNvbGxlY3QyLiAgKi8KKworLyogU2lnbmVkIHR5cGUgb2YgZGlmZmVyZW5jZSBvZiB0d28gcG9pbnRlcnMuICAqLworCisvKiBEZWZpbmUgdGhpcyB0eXBlIGlmIHdlIGFyZSBkb2luZyB0aGUgd2hvbGUgam9iLAorICAgb3IgaWYgd2Ugd2FudCB0aGlzIHR5cGUgaW4gcGFydGljdWxhci4gICovCisjaWYgZGVmaW5lZCAoX1NURERFRl9IKSB8fCBkZWZpbmVkIChfX25lZWRfcHRyZGlmZl90KQorI2lmbmRlZiBfUFRSRElGRl9UCS8qIGluIGNhc2UgPHN5cy90eXBlcy5oPiBoYXMgZGVmaW5lZCBpdC4gKi8KKyNpZm5kZWYgX1RfUFRSRElGRl8KKyNpZm5kZWYgX1RfUFRSRElGRgorI2lmbmRlZiBfX1BUUkRJRkZfVAorI2lmbmRlZiBfUFRSRElGRl9UXworI2lmbmRlZiBfQlNEX1BUUkRJRkZfVF8KKyNpZm5kZWYgX19faW50X3B0cmRpZmZfdF9oCisjaWZuZGVmIF9HQ0NfUFRSRElGRl9UCisjZGVmaW5lIF9QVFJESUZGX1QKKyNkZWZpbmUgX1RfUFRSRElGRl8KKyNkZWZpbmUgX1RfUFRSRElGRgorI2RlZmluZSBfX1BUUkRJRkZfVAorI2RlZmluZSBfUFRSRElGRl9UXworI2RlZmluZSBfQlNEX1BUUkRJRkZfVF8KKyNkZWZpbmUgX19faW50X3B0cmRpZmZfdF9oCisjZGVmaW5lIF9HQ0NfUFRSRElGRl9UCisjaWZuZGVmIF9fUFRSRElGRl9UWVBFX18KKyNkZWZpbmUgX19QVFJESUZGX1RZUEVfXyBsb25nIGludAorI2VuZGlmCit0eXBlZGVmIF9fUFRSRElGRl9UWVBFX18gcHRyZGlmZl90OworI2VuZGlmIC8qIF9HQ0NfUFRSRElGRl9UICovCisjZW5kaWYgLyogX19faW50X3B0cmRpZmZfdF9oICovCisjZW5kaWYgLyogX0JTRF9QVFJESUZGX1RfICovCisjZW5kaWYgLyogX1BUUkRJRkZfVF8gKi8KKyNlbmRpZiAvKiBfX1BUUkRJRkZfVCAqLworI2VuZGlmIC8qIF9UX1BUUkRJRkYgKi8KKyNlbmRpZiAvKiBfVF9QVFJESUZGXyAqLworI2VuZGlmIC8qIF9QVFJESUZGX1QgKi8KKworLyogSWYgdGhpcyBzeW1ib2wgaGFzIGRvbmUgaXRzIGpvYiwgZ2V0IHJpZCBvZiBpdC4gICovCisjdW5kZWYJX19uZWVkX3B0cmRpZmZfdAorCisjZW5kaWYgLyogX1NURERFRl9IIG9yIF9fbmVlZF9wdHJkaWZmX3QuICAqLworCisvKiBVbnNpZ25lZCB0eXBlIG9mIGBzaXplb2YnIHNvbWV0aGluZy4gICovCisKKy8qIERlZmluZSB0aGlzIHR5cGUgaWYgd2UgYXJlIGRvaW5nIHRoZSB3aG9sZSBqb2IsCisgICBvciBpZiB3ZSB3YW50IHRoaXMgdHlwZSBpbiBwYXJ0aWN1bGFyLiAgKi8KKyNpZiBkZWZpbmVkIChfU1REREVGX0gpIHx8IGRlZmluZWQgKF9fbmVlZF9zaXplX3QpCisjaWZuZGVmIF9fc2l6ZV90X18JLyogQmVPUyAqLworI2lmbmRlZiBfX1NJWkVfVF9fCS8qIENyYXkgVW5pY29zL01rICovCisjaWZuZGVmIF9TSVpFX1QJLyogaW4gY2FzZSA8c3lzL3R5cGVzLmg+IGhhcyBkZWZpbmVkIGl0LiAqLworI2lmbmRlZiBfU1lTX1NJWkVfVF9ICisjaWZuZGVmIF9UX1NJWkVfCisjaWZuZGVmIF9UX1NJWkUKKyNpZm5kZWYgX19TSVpFX1QKKyNpZm5kZWYgX1NJWkVfVF8KKyNpZm5kZWYgX0JTRF9TSVpFX1RfCisjaWZuZGVmIF9TSVpFX1RfREVGSU5FRF8KKyNpZm5kZWYgX1NJWkVfVF9ERUZJTkVECisjaWZuZGVmIF9CU0RfU0laRV9UX0RFRklORURfCS8qIERhcndpbiAqLworI2lmbmRlZiBfU0laRV9UX0RFQ0xBUkVECS8qIEZyZWVCU0QgNSAqLworI2lmbmRlZiBfX19pbnRfc2l6ZV90X2gKKyNpZm5kZWYgX0dDQ19TSVpFX1QKKyNpZm5kZWYgX1NJWkVUXworI2lmbmRlZiBfX3NpemVfdAorI2RlZmluZSBfX3NpemVfdF9fCS8qIEJlT1MgKi8KKyNkZWZpbmUgX19TSVpFX1RfXwkvKiBDcmF5IFVuaWNvcy9NayAqLworI2RlZmluZSBfU0laRV9UCisjZGVmaW5lIF9TWVNfU0laRV9UX0gKKyNkZWZpbmUgX1RfU0laRV8KKyNkZWZpbmUgX1RfU0laRQorI2RlZmluZSBfX1NJWkVfVAorI2RlZmluZSBfU0laRV9UXworI2RlZmluZSBfQlNEX1NJWkVfVF8KKyNkZWZpbmUgX1NJWkVfVF9ERUZJTkVEXworI2RlZmluZSBfU0laRV9UX0RFRklORUQKKyNkZWZpbmUgX0JTRF9TSVpFX1RfREVGSU5FRF8JLyogRGFyd2luICovCisjZGVmaW5lIF9TSVpFX1RfREVDTEFSRUQJLyogRnJlZUJTRCA1ICovCisjZGVmaW5lIF9fX2ludF9zaXplX3RfaAorI2RlZmluZSBfR0NDX1NJWkVfVAorI2RlZmluZSBfU0laRVRfCisjaWYgKGRlZmluZWQgKF9fRnJlZUJTRF9fKSAmJiAoX19GcmVlQlNEX18gPj0gNSkpIFwKKyAgfHwgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pCisvKiBfX3NpemVfdCBpcyBhIHR5cGVkZWYgb24gRnJlZUJTRCA1LCBtdXN0IG5vdCB0cmFzaCBpdC4gKi8KKyNlbGlmIGRlZmluZWQgKF9fVk1TX18pCisvKiBfX3NpemVfdCBpcyBhbHNvIGEgdHlwZWRlZiBvbiBWTVMuICAqLworI2Vsc2UKKyNkZWZpbmUgX19zaXplX3QKKyNlbmRpZgorI2lmbmRlZiBfX1NJWkVfVFlQRV9fCisjZGVmaW5lIF9fU0laRV9UWVBFX18gbG9uZyB1bnNpZ25lZCBpbnQKKyNlbmRpZgorI2lmICEoZGVmaW5lZCAoX19HTlVHX18pICYmIGRlZmluZWQgKHNpemVfdCkpCit0eXBlZGVmIF9fU0laRV9UWVBFX18gc2l6ZV90OworI2lmZGVmIF9fQkVPU19fCit0eXBlZGVmIGxvbmcgc3NpemVfdDsKKyNlbmRpZiAvKiBfX0JFT1NfXyAqLworI2VuZGlmIC8qICEoZGVmaW5lZCAoX19HTlVHX18pICYmIGRlZmluZWQgKHNpemVfdCkpICovCisjZW5kaWYgLyogX19zaXplX3QgKi8KKyNlbmRpZiAvKiBfU0laRVRfICovCisjZW5kaWYgLyogX0dDQ19TSVpFX1QgKi8KKyNlbmRpZiAvKiBfX19pbnRfc2l6ZV90X2ggKi8KKyNlbmRpZiAvKiBfU0laRV9UX0RFQ0xBUkVEICovCisjZW5kaWYgLyogX0JTRF9TSVpFX1RfREVGSU5FRF8gKi8KKyNlbmRpZiAvKiBfU0laRV9UX0RFRklORUQgKi8KKyNlbmRpZiAvKiBfU0laRV9UX0RFRklORURfICovCisjZW5kaWYgLyogX0JTRF9TSVpFX1RfICovCisjZW5kaWYgLyogX1NJWkVfVF8gKi8KKyNlbmRpZiAvKiBfX1NJWkVfVCAqLworI2VuZGlmIC8qIF9UX1NJWkUgKi8KKyNlbmRpZiAvKiBfVF9TSVpFXyAqLworI2VuZGlmIC8qIF9TWVNfU0laRV9UX0ggKi8KKyNlbmRpZiAvKiBfU0laRV9UICovCisjZW5kaWYgLyogX19TSVpFX1RfXyAqLworI2VuZGlmIC8qIF9fc2l6ZV90X18gKi8KKyN1bmRlZglfX25lZWRfc2l6ZV90CisjZW5kaWYgLyogX1NURERFRl9IIG9yIF9fbmVlZF9zaXplX3QuICAqLworCisKKy8qIFdpZGUgY2hhcmFjdGVyIHR5cGUuCisgICBMb2NhbGUtd3JpdGVycyBzaG91bGQgY2hhbmdlIHRoaXMgYXMgbmVjZXNzYXJ5IHRvCisgICBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgdW5pcXVlIHZhbHVlcyBub3QgYmV0d2VlbiAwIGFuZCAxMjcsCisgICBhbmQgbm90ICh3Y2hhcl90KSAtMSwgZm9yIGVhY2ggZGVmaW5lZCBtdWx0aWJ5dGUgY2hhcmFjdGVyLiAgKi8KKworLyogRGVmaW5lIHRoaXMgdHlwZSBpZiB3ZSBhcmUgZG9pbmcgdGhlIHdob2xlIGpvYiwKKyAgIG9yIGlmIHdlIHdhbnQgdGhpcyB0eXBlIGluIHBhcnRpY3VsYXIuICAqLworI2lmIGRlZmluZWQgKF9TVERERUZfSCkgfHwgZGVmaW5lZCAoX19uZWVkX3djaGFyX3QpCisjaWZuZGVmIF9fd2NoYXJfdF9fCS8qIEJlT1MgKi8KKyNpZm5kZWYgX19XQ0hBUl9UX18JLyogQ3JheSBVbmljb3MvTWsgKi8KKyNpZm5kZWYgX1dDSEFSX1QKKyNpZm5kZWYgX1RfV0NIQVJfCisjaWZuZGVmIF9UX1dDSEFSCisjaWZuZGVmIF9fV0NIQVJfVAorI2lmbmRlZiBfV0NIQVJfVF8KKyNpZm5kZWYgX0JTRF9XQ0hBUl9UXworI2lmbmRlZiBfQlNEX1dDSEFSX1RfREVGSU5FRF8gICAgLyogRGFyd2luICovCisjaWZuZGVmIF9CU0RfUlVORV9UX0RFRklORURfCS8qIERhcndpbiAqLworI2lmbmRlZiBfV0NIQVJfVF9ERUNMQVJFRCAvKiBGcmVlQlNEIDUgKi8KKyNpZm5kZWYgX1dDSEFSX1RfREVGSU5FRF8KKyNpZm5kZWYgX1dDSEFSX1RfREVGSU5FRAorI2lmbmRlZiBfV0NIQVJfVF9ICisjaWZuZGVmIF9fX2ludF93Y2hhcl90X2gKKyNpZm5kZWYgX19JTlRfV0NIQVJfVF9ICisjaWZuZGVmIF9HQ0NfV0NIQVJfVAorI2RlZmluZSBfX3djaGFyX3RfXwkvKiBCZU9TICovCisjZGVmaW5lIF9fV0NIQVJfVF9fCS8qIENyYXkgVW5pY29zL01rICovCisjZGVmaW5lIF9XQ0hBUl9UCisjZGVmaW5lIF9UX1dDSEFSXworI2RlZmluZSBfVF9XQ0hBUgorI2RlZmluZSBfX1dDSEFSX1QKKyNkZWZpbmUgX1dDSEFSX1RfCisjZGVmaW5lIF9CU0RfV0NIQVJfVF8KKyNkZWZpbmUgX1dDSEFSX1RfREVGSU5FRF8KKyNkZWZpbmUgX1dDSEFSX1RfREVGSU5FRAorI2RlZmluZSBfV0NIQVJfVF9ICisjZGVmaW5lIF9fX2ludF93Y2hhcl90X2gKKyNkZWZpbmUgX19JTlRfV0NIQVJfVF9ICisjZGVmaW5lIF9HQ0NfV0NIQVJfVAorI2RlZmluZSBfV0NIQVJfVF9ERUNMQVJFRAorCisvKiBPbiBCU0QvMzg2IDEuMSwgYXQgbGVhc3QsIG1hY2hpbmUvYW5zaS5oIGRlZmluZXMgX0JTRF9XQ0hBUl9UXworICAgaW5zdGVhZCBvZiBfV0NIQVJfVF8sIGFuZCBfQlNEX1JVTkVfVF8gKHdoaWNoLCB1bmxpa2UgdGhlIG90aGVyCisgICBzeW1ib2xzIGluIHRoZSBfRk9PX1RfIGZhbWlseSwgc3RheXMgZGVmaW5lZCBldmVuIGFmdGVyIGl0cworICAgY29ycmVzcG9uZGluZyB0eXBlIGlzIGRlZmluZWQpLiAgSWYgd2UgZGVmaW5lIHdjaGFyX3QsIHRoZW4gd2UKKyAgIG11c3QgdW5kZWYgX1dDSEFSX1RfOyBmb3IgQlNELzM4NiAxLjEgKGFuZCBwZXJoYXBzIG90aGVycyksIGlmCisgICB3ZSB1bmRlZiBfV0NIQVJfVF8sIHRoZW4gd2UgbXVzdCBhbHNvIGRlZmluZSBydW5lX3QsIHNpbmNlIAorICAgaGVhZGVycyBsaWtlIHJ1bmV0eXBlLmggYXNzdW1lIHRoYXQgaWYgbWFjaGluZS9hbnNpLmggaXMgaW5jbHVkZWQsCisgICBhbmQgX0JTRF9XQ0hBUl9UXyBpcyBub3QgZGVmaW5lZCwgdGhlbiBydW5lX3QgaXMgYXZhaWxhYmxlLgorICAgbWFjaGluZS9hbnNpLmggc2F5cywgIk5vdGUgdGhhdCBfV0NIQVJfVF8gYW5kIF9SVU5FX1RfIG11c3QgYmUgb2YKKyAgIHRoZSBzYW1lIHR5cGUuIiAqLworI2lmZGVmIF9CU0RfV0NIQVJfVF8KKyN1bmRlZiBfQlNEX1dDSEFSX1RfCisjaWZkZWYgX0JTRF9SVU5FX1RfCisjaWYgIWRlZmluZWQgKF9BTlNJX1NPVVJDRSkgJiYgIWRlZmluZWQgKF9QT1NJWF9TT1VSQ0UpCit0eXBlZGVmIF9CU0RfUlVORV9UXyBydW5lX3Q7CisjZGVmaW5lIF9CU0RfV0NIQVJfVF9ERUZJTkVEXworI2RlZmluZSBfQlNEX1JVTkVfVF9ERUZJTkVEXwkvKiBEYXJ3aW4gKi8KKyNpZiBkZWZpbmVkIChfX0ZyZWVCU0RfXykgJiYgKF9fRnJlZUJTRF9fIDwgNSkKKy8qIFdoeSBpcyB0aGlzIGZpbGUgc28gaGFyZCB0byBtYWludGFpbiBwcm9wZXJseT8gIEluIGNvbnRyYXN0IHRvCisgICB0aGUgY29tbWVudCBhYm92ZSByZWdhcmRpbmcgQlNELzM4NiAxLjEsIG9uIEZyZWVCU0QgZm9yIGFzIGxvbmcKKyAgIGFzIHRoZSBzeW1ib2wgaGFzIGV4aXN0ZWQsIF9CU0RfUlVORV9UXyBtdXN0IG5vdCBzdGF5IGRlZmluZWQgb3IKKyAgIHJlZHVuZGFudCB0eXBlZGVmcyB3aWxsIG9jY3VyIHdoZW4gc3RkbGliLmggaXMgaW5jbHVkZWQgYWZ0ZXIgdGhpcyBmaWxlLiAqLworI3VuZGVmIF9CU0RfUlVORV9UXworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisvKiBGcmVlQlNEIDUgY2FuJ3QgYmUgaGFuZGxlZCB3ZWxsIHVzaW5nICJ0cmFkaXRpb25hbCIgbG9naWMgYWJvdmUKKyAgIHNpbmNlIGl0IG5vIGxvbmdlciBkZWZpbmVzIF9CU0RfUlVORV9UXyB5ZXQgc3RpbGwgZGVzaXJlcyB0byBleHBvcnQKKyAgIHJ1bmVfdCBpbiBzb21lIGNhc2VzLi4uICovCisjaWYgZGVmaW5lZCAoX19GcmVlQlNEX18pICYmIChfX0ZyZWVCU0RfXyA+PSA1KQorI2lmICFkZWZpbmVkIChfQU5TSV9TT1VSQ0UpICYmICFkZWZpbmVkIChfUE9TSVhfU09VUkNFKQorI2lmIF9fQlNEX1ZJU0lCTEUKKyNpZm5kZWYgX1JVTkVfVF9ERUNMQVJFRAordHlwZWRlZiBfX3J1bmVfdCAgICAgICAgcnVuZV90OworI2RlZmluZSBfUlVORV9UX0RFQ0xBUkVECisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfX1dDSEFSX1RZUEVfXworI2RlZmluZSBfX1dDSEFSX1RZUEVfXyBpbnQKKyNlbmRpZgorI2lmbmRlZiBfX2NwbHVzcGx1cwordHlwZWRlZiBfX1dDSEFSX1RZUEVfXyB3Y2hhcl90OworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYgLyogX1dDSEFSX1RfREVDTEFSRUQgKi8KKyNlbmRpZiAvKiBfQlNEX1JVTkVfVF9ERUZJTkVEXyAqLworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYgLyogX19XQ0hBUl9UX18gKi8KKyNlbmRpZiAvKiBfX3djaGFyX3RfXyAqLworI3VuZGVmCV9fbmVlZF93Y2hhcl90CisjZW5kaWYgLyogX1NURERFRl9IIG9yIF9fbmVlZF93Y2hhcl90LiAgKi8KKworI2lmIGRlZmluZWQgKF9fbmVlZF93aW50X3QpCisjaWZuZGVmIF9XSU5UX1QKKyNkZWZpbmUgX1dJTlRfVAorCisjaWZuZGVmIF9fV0lOVF9UWVBFX18KKyNkZWZpbmUgX19XSU5UX1RZUEVfXyB1bnNpZ25lZCBpbnQKKyNlbmRpZgordHlwZWRlZiBfX1dJTlRfVFlQRV9fIHdpbnRfdDsKKyNlbmRpZgorI3VuZGVmIF9fbmVlZF93aW50X3QKKyNlbmRpZgorCisvKiAgSW4gNC4zYnNkLW5ldDIsIGxlYXZlIHRoZXNlIHVuZGVmaW5lZCB0byBpbmRpY2F0ZSB0aGF0IHNpemVfdCwgZXRjLgorICAgIGFyZSBhbHJlYWR5IGRlZmluZWQuICAqLworLyogIEJTRC9PUyAzLjEgYW5kIEZyZWVCU0QgWzIzXS54IHJlcXVpcmUgdGhlIE1BQ0hJTkVfQU5TSV9IIGNoZWNrIGhlcmUuICAqLworLyogIE5ldEJTRCA1IHJlcXVpcmVzIHRoZSBJMzg2X0FOU0lfSCBhbmQgWDg2XzY0X0FOU0lfSCBjaGVja3MgaGVyZS4gICovCisjaWYgZGVmaW5lZChfQU5TSV9IXykgfHwgZGVmaW5lZChfTUFDSElORV9BTlNJX0hfKSB8fCBkZWZpbmVkKF9YODZfNjRfQU5TSV9IXykgfHwgZGVmaW5lZChfSTM4Nl9BTlNJX0hfKQorLyogIFRoZSByZWZlcmVuY2VzIHRvIF9HQ0NfUFRSRElGRl9UXywgX0dDQ19TSVpFX1RfLCBhbmQgX0dDQ19XQ0hBUl9UXworICAgIGFyZSBwcm9iYWJseSB0eXBvcyBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgYmVmb3JlIDIuOCBpcyByZWxlYXNlZC4gICovCisjaWZkZWYgX0dDQ19QVFJESUZGX1RfCisjdW5kZWYgX1BUUkRJRkZfVF8KKyN1bmRlZiBfQlNEX1BUUkRJRkZfVF8KKyNlbmRpZgorI2lmZGVmIF9HQ0NfU0laRV9UXworI3VuZGVmIF9TSVpFX1RfCisjdW5kZWYgX0JTRF9TSVpFX1RfCisjZW5kaWYKKyNpZmRlZiBfR0NDX1dDSEFSX1RfCisjdW5kZWYgX1dDSEFSX1RfCisjdW5kZWYgX0JTRF9XQ0hBUl9UXworI2VuZGlmCisvKiAgVGhlIGZvbGxvd2luZyBvbmVzIGFyZSB0aGUgcmVhbCBvbmVzLiAgKi8KKyNpZmRlZiBfR0NDX1BUUkRJRkZfVAorI3VuZGVmIF9QVFJESUZGX1RfCisjdW5kZWYgX0JTRF9QVFJESUZGX1RfCisjZW5kaWYKKyNpZmRlZiBfR0NDX1NJWkVfVAorI3VuZGVmIF9TSVpFX1RfCisjdW5kZWYgX0JTRF9TSVpFX1RfCisjZW5kaWYKKyNpZmRlZiBfR0NDX1dDSEFSX1QKKyN1bmRlZiBfV0NIQVJfVF8KKyN1bmRlZiBfQlNEX1dDSEFSX1RfCisjZW5kaWYKKyNlbmRpZiAvKiBfQU5TSV9IXyB8fCBfTUFDSElORV9BTlNJX0hfIHx8IF9YODZfNjRfQU5TSV9IXyB8fCBfSTM4Nl9BTlNJX0hfICovCisKKyNlbmRpZiAvKiBfX3N5c19zdGR0eXBlc19oICovCisKKy8qIEEgbnVsbCBwb2ludGVyIGNvbnN0YW50LiAgKi8KKworI2lmIGRlZmluZWQgKF9TVERERUZfSCkgfHwgZGVmaW5lZCAoX19uZWVkX05VTEwpCisjdW5kZWYgTlVMTAkJLyogaW4gY2FzZSA8c3RkaW8uaD4gaGFzIGRlZmluZWQgaXQuICovCisjaWZkZWYgX19HTlVHX18KKyNkZWZpbmUgTlVMTCBfX251bGwKKyNlbHNlICAgLyogRysrICovCisjaWZuZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIE5VTEwgKCh2b2lkICopMCkKKyNlbHNlICAgLyogQysrICovCisjZGVmaW5lIE5VTEwgMAorI2VuZGlmICAvKiBDKysgKi8KKyNlbmRpZiAgLyogRysrICovCisjZW5kaWYJLyogTlVMTCBub3QgZGVmaW5lZCBhbmQgPHN0ZGRlZi5oPiBvciBuZWVkIE5VTEwuICAqLworI3VuZGVmCV9fbmVlZF9OVUxMCisKKyNpZmRlZiBfU1REREVGX0gKKworLyogT2Zmc2V0IG9mIG1lbWJlciBNRU1CRVIgaW4gYSBzdHJ1Y3Qgb2YgdHlwZSBUWVBFLiAqLworI2RlZmluZSBvZmZzZXRvZihUWVBFLCBNRU1CRVIpIF9fYnVpbHRpbl9vZmZzZXRvZiAoVFlQRSwgTUVNQkVSKQorCisjaWYgKGRlZmluZWQgKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMjAxMTEyTCkgXAorICB8fCAoZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTCkKKyNpZm5kZWYgX0dDQ19NQVhfQUxJR05fVAorI2RlZmluZSBfR0NDX01BWF9BTElHTl9UCisvKiBUeXBlIHdob3NlIGFsaWdubWVudCBpcyBzdXBwb3J0ZWQgaW4gZXZlcnkgY29udGV4dCBhbmQgaXMgYXQgbGVhc3QKKyAgIGFzIGdyZWF0IGFzIHRoYXQgb2YgYW55IHN0YW5kYXJkIHR5cGUgbm90IHVzaW5nIGFsaWdubWVudAorICAgc3BlY2lmaWVycy4gICovCit0eXBlZGVmIHN0cnVjdCB7CisgIGxvbmcgbG9uZyBfX21heF9hbGlnbl9sbCBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhfX2FsaWdub2ZfXyhsb25nIGxvbmcpKSkpOworICBsb25nIGRvdWJsZSBfX21heF9hbGlnbl9sZCBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhfX2FsaWdub2ZfXyhsb25nIGRvdWJsZSkpKSk7Cit9IG1heF9hbGlnbl90OworI2VuZGlmCisjZW5kaWYgLyogQzExIG9yIEMrKzExLiAgKi8KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNpZm5kZWYgX0dYWF9OVUxMUFRSX1QKKyNkZWZpbmUgX0dYWF9OVUxMUFRSX1QKKyAgdHlwZWRlZiBkZWNsdHlwZShudWxscHRyKSBudWxscHRyX3Q7CisjZW5kaWYKKyNlbmRpZiAvKiBDKysxMS4gICovCisKKyNlbmRpZiAvKiBfU1REREVGX0ggd2FzIGRlZmluZWQgdGhpcyB0aW1lICovCisKKyNlbmRpZiAvKiAhX1NURERFRl9IICYmICFfU1REREVGX0hfICYmICFfQU5TSV9TVERERUZfSCAmJiAhX19TVERERUZfSF9fCisJICB8fCBfX25lZWRfWFhYIHdhcyBub3QgZGVmaW5lZCBiZWZvcmUgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3N0ZGZpeC5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3RkZml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjZWYxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3N0ZGZpeC5oCkBAIC0wLDAgKzEsMjA0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogSVNPL0lFQyBKVEMxIFNDMjIgV0cxNCBOMTE2OQorICogRGF0ZTogMjAwNi0wNC0wNAorICogSVNPL0lFQyBUUiAxODAzNworICogUHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIC0gQyAtIEV4dGVuc2lvbnMgdG8gc3VwcG9ydCBlbWJlZGRlZCBwcm9jZXNzb3JzCisgKi8KKworI2lmbmRlZiBfU1RERklYX0gKKyNkZWZpbmUgX1NUREZJWF9ICisKKy8qIDcuMThhLjEgSW50cm9kdWN0aW9uLiAgKi8KKworI3VuZGVmIGZyYWN0CisjdW5kZWYgYWNjdW0KKyN1bmRlZiBzYXQKKyNkZWZpbmUgZnJhY3QJCV9GcmFjdAorI2RlZmluZSBhY2N1bQkJX0FjY3VtCisjZGVmaW5lIHNhdAkJX1NhdAorCisvKiA3LjE4YS4zIFByZWNpc2lvbiBtYWNyb3MuICAqLworCisjdW5kZWYgU0ZSQUNUX0ZCSVQKKyN1bmRlZiBTRlJBQ1RfTUlOCisjdW5kZWYgU0ZSQUNUX01BWAorI3VuZGVmIFNGUkFDVF9FUFNJTE9OCisjZGVmaW5lIFNGUkFDVF9GQklUCV9fU0ZSQUNUX0ZCSVRfXworI2RlZmluZSBTRlJBQ1RfTUlOCV9fU0ZSQUNUX01JTl9fCisjZGVmaW5lIFNGUkFDVF9NQVgJX19TRlJBQ1RfTUFYX18KKyNkZWZpbmUgU0ZSQUNUX0VQU0lMT04JX19TRlJBQ1RfRVBTSUxPTl9fCisKKyN1bmRlZiBVU0ZSQUNUX0ZCSVQKKyN1bmRlZiBVU0ZSQUNUX01JTgorI3VuZGVmIFVTRlJBQ1RfTUFYCisjdW5kZWYgVVNGUkFDVF9FUFNJTE9OCisjZGVmaW5lIFVTRlJBQ1RfRkJJVAlfX1VTRlJBQ1RfRkJJVF9fCisjZGVmaW5lIFVTRlJBQ1RfTUlOCV9fVVNGUkFDVF9NSU5fXwkJLyogR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIFVTRlJBQ1RfTUFYCV9fVVNGUkFDVF9NQVhfXworI2RlZmluZSBVU0ZSQUNUX0VQU0lMT04JX19VU0ZSQUNUX0VQU0lMT05fXworCisjdW5kZWYgRlJBQ1RfRkJJVAorI3VuZGVmIEZSQUNUX01JTgorI3VuZGVmIEZSQUNUX01BWAorI3VuZGVmIEZSQUNUX0VQU0lMT04KKyNkZWZpbmUgRlJBQ1RfRkJJVAlfX0ZSQUNUX0ZCSVRfXworI2RlZmluZSBGUkFDVF9NSU4JX19GUkFDVF9NSU5fXworI2RlZmluZSBGUkFDVF9NQVgJX19GUkFDVF9NQVhfXworI2RlZmluZSBGUkFDVF9FUFNJTE9OCV9fRlJBQ1RfRVBTSUxPTl9fCisKKyN1bmRlZiBVRlJBQ1RfRkJJVAorI3VuZGVmIFVGUkFDVF9NSU4KKyN1bmRlZiBVRlJBQ1RfTUFYCisjdW5kZWYgVUZSQUNUX0VQU0lMT04KKyNkZWZpbmUgVUZSQUNUX0ZCSVQJX19VRlJBQ1RfRkJJVF9fCisjZGVmaW5lIFVGUkFDVF9NSU4JX19VRlJBQ1RfTUlOX18JCS8qIEdDQyBleHRlbnNpb24uICAqLworI2RlZmluZSBVRlJBQ1RfTUFYCV9fVUZSQUNUX01BWF9fCisjZGVmaW5lIFVGUkFDVF9FUFNJTE9OCV9fVUZSQUNUX0VQU0lMT05fXworCisjdW5kZWYgTEZSQUNUX0ZCSVQKKyN1bmRlZiBMRlJBQ1RfTUlOCisjdW5kZWYgTEZSQUNUX01BWAorI3VuZGVmIExGUkFDVF9FUFNJTE9OCisjZGVmaW5lIExGUkFDVF9GQklUCV9fTEZSQUNUX0ZCSVRfXworI2RlZmluZSBMRlJBQ1RfTUlOCV9fTEZSQUNUX01JTl9fCisjZGVmaW5lIExGUkFDVF9NQVgJX19MRlJBQ1RfTUFYX18KKyNkZWZpbmUgTEZSQUNUX0VQU0lMT04JX19MRlJBQ1RfRVBTSUxPTl9fCisKKyN1bmRlZiBVTEZSQUNUX0ZCSVQKKyN1bmRlZiBVTEZSQUNUX01JTgorI3VuZGVmIFVMRlJBQ1RfTUFYCisjdW5kZWYgVUxGUkFDVF9FUFNJTE9OCisjZGVmaW5lIFVMRlJBQ1RfRkJJVAlfX1VMRlJBQ1RfRkJJVF9fCisjZGVmaW5lIFVMRlJBQ1RfTUlOCV9fVUxGUkFDVF9NSU5fXwkJLyogR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIFVMRlJBQ1RfTUFYCV9fVUxGUkFDVF9NQVhfXworI2RlZmluZSBVTEZSQUNUX0VQU0lMT04JX19VTEZSQUNUX0VQU0lMT05fXworCisjdW5kZWYgTExGUkFDVF9GQklUCisjdW5kZWYgTExGUkFDVF9NSU4KKyN1bmRlZiBMTEZSQUNUX01BWAorI3VuZGVmIExMRlJBQ1RfRVBTSUxPTgorI2RlZmluZSBMTEZSQUNUX0ZCSVQJX19MTEZSQUNUX0ZCSVRfXwkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgTExGUkFDVF9NSU4JX19MTEZSQUNUX01JTl9fCQkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgTExGUkFDVF9NQVgJX19MTEZSQUNUX01BWF9fCQkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgTExGUkFDVF9FUFNJTE9OCV9fTExGUkFDVF9FUFNJTE9OX18JLyogR0NDIGV4dGVuc2lvbi4gICovCisKKyN1bmRlZiBVTExGUkFDVF9GQklUCisjdW5kZWYgVUxMRlJBQ1RfTUlOCisjdW5kZWYgVUxMRlJBQ1RfTUFYCisjdW5kZWYgVUxMRlJBQ1RfRVBTSUxPTgorI2RlZmluZSBVTExGUkFDVF9GQklUCV9fVUxMRlJBQ1RfRkJJVF9fCS8qIEdDQyBleHRlbnNpb24uICAqLworI2RlZmluZSBVTExGUkFDVF9NSU4JX19VTExGUkFDVF9NSU5fXwkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgVUxMRlJBQ1RfTUFYCV9fVUxMRlJBQ1RfTUFYX18JLyogR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIFVMTEZSQUNUX0VQU0lMT04JX19VTExGUkFDVF9FUFNJTE9OX18JLyogR0NDIGV4dGVuc2lvbi4gICovCisKKyN1bmRlZiBTQUNDVU1fRkJJVAorI3VuZGVmIFNBQ0NVTV9JQklUCisjdW5kZWYgU0FDQ1VNX01JTgorI3VuZGVmIFNBQ0NVTV9NQVgKKyN1bmRlZiBTQUNDVU1fRVBTSUxPTgorI2RlZmluZSBTQUNDVU1fRkJJVAlfX1NBQ0NVTV9GQklUX18KKyNkZWZpbmUgU0FDQ1VNX0lCSVQJX19TQUNDVU1fSUJJVF9fCisjZGVmaW5lIFNBQ0NVTV9NSU4JX19TQUNDVU1fTUlOX18KKyNkZWZpbmUgU0FDQ1VNX01BWAlfX1NBQ0NVTV9NQVhfXworI2RlZmluZSBTQUNDVU1fRVBTSUxPTglfX1NBQ0NVTV9FUFNJTE9OX18KKworI3VuZGVmIFVTQUNDVU1fRkJJVAorI3VuZGVmIFVTQUNDVU1fSUJJVAorI3VuZGVmIFVTQUNDVU1fTUlOCisjdW5kZWYgVVNBQ0NVTV9NQVgKKyN1bmRlZiBVU0FDQ1VNX0VQU0lMT04KKyNkZWZpbmUgVVNBQ0NVTV9GQklUCV9fVVNBQ0NVTV9GQklUX18KKyNkZWZpbmUgVVNBQ0NVTV9JQklUCV9fVVNBQ0NVTV9JQklUX18KKyNkZWZpbmUgVVNBQ0NVTV9NSU4JX19VU0FDQ1VNX01JTl9fCQkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgVVNBQ0NVTV9NQVgJX19VU0FDQ1VNX01BWF9fCisjZGVmaW5lIFVTQUNDVU1fRVBTSUxPTglfX1VTQUNDVU1fRVBTSUxPTl9fCisKKyN1bmRlZiBBQ0NVTV9GQklUCisjdW5kZWYgQUNDVU1fSUJJVAorI3VuZGVmIEFDQ1VNX01JTgorI3VuZGVmIEFDQ1VNX01BWAorI3VuZGVmIEFDQ1VNX0VQU0lMT04KKyNkZWZpbmUgQUNDVU1fRkJJVAlfX0FDQ1VNX0ZCSVRfXworI2RlZmluZSBBQ0NVTV9JQklUCV9fQUNDVU1fSUJJVF9fCisjZGVmaW5lIEFDQ1VNX01JTglfX0FDQ1VNX01JTl9fCisjZGVmaW5lIEFDQ1VNX01BWAlfX0FDQ1VNX01BWF9fCisjZGVmaW5lIEFDQ1VNX0VQU0lMT04JX19BQ0NVTV9FUFNJTE9OX18KKworI3VuZGVmIFVBQ0NVTV9GQklUCisjdW5kZWYgVUFDQ1VNX0lCSVQKKyN1bmRlZiBVQUNDVU1fTUlOCisjdW5kZWYgVUFDQ1VNX01BWAorI3VuZGVmIFVBQ0NVTV9FUFNJTE9OCisjZGVmaW5lIFVBQ0NVTV9GQklUCV9fVUFDQ1VNX0ZCSVRfXworI2RlZmluZSBVQUNDVU1fSUJJVAlfX1VBQ0NVTV9JQklUX18KKyNkZWZpbmUgVUFDQ1VNX01JTglfX1VBQ0NVTV9NSU5fXwkJLyogR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIFVBQ0NVTV9NQVgJX19VQUNDVU1fTUFYX18KKyNkZWZpbmUgVUFDQ1VNX0VQU0lMT04JX19VQUNDVU1fRVBTSUxPTl9fCisKKyN1bmRlZiBMQUNDVU1fRkJJVAorI3VuZGVmIExBQ0NVTV9JQklUCisjdW5kZWYgTEFDQ1VNX01JTgorI3VuZGVmIExBQ0NVTV9NQVgKKyN1bmRlZiBMQUNDVU1fRVBTSUxPTgorI2RlZmluZSBMQUNDVU1fRkJJVAlfX0xBQ0NVTV9GQklUX18KKyNkZWZpbmUgTEFDQ1VNX0lCSVQJX19MQUNDVU1fSUJJVF9fCisjZGVmaW5lIExBQ0NVTV9NSU4JX19MQUNDVU1fTUlOX18KKyNkZWZpbmUgTEFDQ1VNX01BWAlfX0xBQ0NVTV9NQVhfXworI2RlZmluZSBMQUNDVU1fRVBTSUxPTglfX0xBQ0NVTV9FUFNJTE9OX18KKworI3VuZGVmIFVMQUNDVU1fRkJJVAorI3VuZGVmIFVMQUNDVU1fSUJJVAorI3VuZGVmIFVMQUNDVU1fTUlOCisjdW5kZWYgVUxBQ0NVTV9NQVgKKyN1bmRlZiBVTEFDQ1VNX0VQU0lMT04KKyNkZWZpbmUgVUxBQ0NVTV9GQklUCV9fVUxBQ0NVTV9GQklUX18KKyNkZWZpbmUgVUxBQ0NVTV9JQklUCV9fVUxBQ0NVTV9JQklUX18KKyNkZWZpbmUgVUxBQ0NVTV9NSU4JX19VTEFDQ1VNX01JTl9fCQkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgVUxBQ0NVTV9NQVgJX19VTEFDQ1VNX01BWF9fCisjZGVmaW5lIFVMQUNDVU1fRVBTSUxPTglfX1VMQUNDVU1fRVBTSUxPTl9fCisKKyN1bmRlZiBMTEFDQ1VNX0ZCSVQKKyN1bmRlZiBMTEFDQ1VNX0lCSVQKKyN1bmRlZiBMTEFDQ1VNX01JTgorI3VuZGVmIExMQUNDVU1fTUFYCisjdW5kZWYgTExBQ0NVTV9FUFNJTE9OCisjZGVmaW5lIExMQUNDVU1fRkJJVAlfX0xMQUNDVU1fRkJJVF9fCS8qIEdDQyBleHRlbnNpb24uICAqLworI2RlZmluZSBMTEFDQ1VNX0lCSVQJX19MTEFDQ1VNX0lCSVRfXwkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgTExBQ0NVTV9NSU4JX19MTEFDQ1VNX01JTl9fCQkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgTExBQ0NVTV9NQVgJX19MTEFDQ1VNX01BWF9fCQkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgTExBQ0NVTV9FUFNJTE9OCV9fTExBQ0NVTV9FUFNJTE9OX18JLyogR0NDIGV4dGVuc2lvbi4gICovCisKKyN1bmRlZiBVTExBQ0NVTV9GQklUCisjdW5kZWYgVUxMQUNDVU1fSUJJVAorI3VuZGVmIFVMTEFDQ1VNX01JTgorI3VuZGVmIFVMTEFDQ1VNX01BWAorI3VuZGVmIFVMTEFDQ1VNX0VQU0lMT04KKyNkZWZpbmUgVUxMQUNDVU1fRkJJVAlfX1VMTEFDQ1VNX0ZCSVRfXwkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgVUxMQUNDVU1fSUJJVAlfX1VMTEFDQ1VNX0lCSVRfXwkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgVUxMQUNDVU1fTUlOCV9fVUxMQUNDVU1fTUlOX18JLyogR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIFVMTEFDQ1VNX01BWAlfX1VMTEFDQ1VNX01BWF9fCS8qIEdDQyBleHRlbnNpb24uICAqLworI2RlZmluZSBVTExBQ0NVTV9FUFNJTE9OCV9fVUxMQUNDVU1fRVBTSUxPTl9fCS8qIEdDQyBleHRlbnNpb24uICAqLworCisjZW5kaWYgLyogX1NUREZJWF9IICovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zdGRpbnQtZ2NjLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zdGRpbnQtZ2NjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczMzllMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3N0ZGludC1nY2MuaApAQCAtMCwwICsxLDI2MyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qCisgKiBJU08gQyBTdGFuZGFyZDogIDcuMTggIEludGVnZXIgdHlwZXMgIDxzdGRpbnQuaD4KKyAqLworCisjaWZuZGVmIF9HQ0NfU1RESU5UX0gKKyNkZWZpbmUgX0dDQ19TVERJTlRfSAorCisvKiA3LjguMS4xIEV4YWN0LXdpZHRoIGludGVnZXIgdHlwZXMgKi8KKworI2lmZGVmIF9fSU5UOF9UWVBFX18KK3R5cGVkZWYgX19JTlQ4X1RZUEVfXyBpbnQ4X3Q7CisjZW5kaWYKKyNpZmRlZiBfX0lOVDE2X1RZUEVfXwordHlwZWRlZiBfX0lOVDE2X1RZUEVfXyBpbnQxNl90OworI2VuZGlmCisjaWZkZWYgX19JTlQzMl9UWVBFX18KK3R5cGVkZWYgX19JTlQzMl9UWVBFX18gaW50MzJfdDsKKyNlbmRpZgorI2lmZGVmIF9fSU5UNjRfVFlQRV9fCit0eXBlZGVmIF9fSU5UNjRfVFlQRV9fIGludDY0X3Q7CisjZW5kaWYKKyNpZmRlZiBfX1VJTlQ4X1RZUEVfXwordHlwZWRlZiBfX1VJTlQ4X1RZUEVfXyB1aW50OF90OworI2VuZGlmCisjaWZkZWYgX19VSU5UMTZfVFlQRV9fCit0eXBlZGVmIF9fVUlOVDE2X1RZUEVfXyB1aW50MTZfdDsKKyNlbmRpZgorI2lmZGVmIF9fVUlOVDMyX1RZUEVfXwordHlwZWRlZiBfX1VJTlQzMl9UWVBFX18gdWludDMyX3Q7CisjZW5kaWYKKyNpZmRlZiBfX1VJTlQ2NF9UWVBFX18KK3R5cGVkZWYgX19VSU5UNjRfVFlQRV9fIHVpbnQ2NF90OworI2VuZGlmCisKKy8qIDcuOC4xLjIgTWluaW11bS13aWR0aCBpbnRlZ2VyIHR5cGVzICovCisKK3R5cGVkZWYgX19JTlRfTEVBU1Q4X1RZUEVfXyBpbnRfbGVhc3Q4X3Q7Cit0eXBlZGVmIF9fSU5UX0xFQVNUMTZfVFlQRV9fIGludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIF9fSU5UX0xFQVNUMzJfVFlQRV9fIGludF9sZWFzdDMyX3Q7Cit0eXBlZGVmIF9fSU5UX0xFQVNUNjRfVFlQRV9fIGludF9sZWFzdDY0X3Q7Cit0eXBlZGVmIF9fVUlOVF9MRUFTVDhfVFlQRV9fIHVpbnRfbGVhc3Q4X3Q7Cit0eXBlZGVmIF9fVUlOVF9MRUFTVDE2X1RZUEVfXyB1aW50X2xlYXN0MTZfdDsKK3R5cGVkZWYgX19VSU5UX0xFQVNUMzJfVFlQRV9fIHVpbnRfbGVhc3QzMl90OwordHlwZWRlZiBfX1VJTlRfTEVBU1Q2NF9UWVBFX18gdWludF9sZWFzdDY0X3Q7CisKKy8qIDcuOC4xLjMgRmFzdGVzdCBtaW5pbXVtLXdpZHRoIGludGVnZXIgdHlwZXMgKi8KKwordHlwZWRlZiBfX0lOVF9GQVNUOF9UWVBFX18gaW50X2Zhc3Q4X3Q7Cit0eXBlZGVmIF9fSU5UX0ZBU1QxNl9UWVBFX18gaW50X2Zhc3QxNl90OwordHlwZWRlZiBfX0lOVF9GQVNUMzJfVFlQRV9fIGludF9mYXN0MzJfdDsKK3R5cGVkZWYgX19JTlRfRkFTVDY0X1RZUEVfXyBpbnRfZmFzdDY0X3Q7Cit0eXBlZGVmIF9fVUlOVF9GQVNUOF9UWVBFX18gdWludF9mYXN0OF90OwordHlwZWRlZiBfX1VJTlRfRkFTVDE2X1RZUEVfXyB1aW50X2Zhc3QxNl90OwordHlwZWRlZiBfX1VJTlRfRkFTVDMyX1RZUEVfXyB1aW50X2Zhc3QzMl90OwordHlwZWRlZiBfX1VJTlRfRkFTVDY0X1RZUEVfXyB1aW50X2Zhc3Q2NF90OworCisvKiA3LjguMS40IEludGVnZXIgdHlwZXMgY2FwYWJsZSBvZiBob2xkaW5nIG9iamVjdCBwb2ludGVycyAqLworCisjaWZkZWYgX19JTlRQVFJfVFlQRV9fCit0eXBlZGVmIF9fSU5UUFRSX1RZUEVfXyBpbnRwdHJfdDsKKyNlbmRpZgorI2lmZGVmIF9fVUlOVFBUUl9UWVBFX18KK3R5cGVkZWYgX19VSU5UUFRSX1RZUEVfXyB1aW50cHRyX3Q7CisjZW5kaWYKKworLyogNy44LjEuNSBHcmVhdGVzdC13aWR0aCBpbnRlZ2VyIHR5cGVzICovCisKK3R5cGVkZWYgX19JTlRNQVhfVFlQRV9fIGludG1heF90OwordHlwZWRlZiBfX1VJTlRNQVhfVFlQRV9fIHVpbnRtYXhfdDsKKworI2lmICghZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBfX2NwbHVzcGx1cyA+PSAyMDExMDNMIFwKKyAgICAgfHwgZGVmaW5lZCBfX1NURENfTElNSVRfTUFDUk9TKQorCisvKiA3LjE4LjIgTGltaXRzIG9mIHNwZWNpZmllZC13aWR0aCBpbnRlZ2VyIHR5cGVzICovCisKKyNpZmRlZiBfX0lOVDhfTUFYX18KKyMgdW5kZWYgSU5UOF9NQVgKKyMgZGVmaW5lIElOVDhfTUFYIF9fSU5UOF9NQVhfXworIyB1bmRlZiBJTlQ4X01JTgorIyBkZWZpbmUgSU5UOF9NSU4gKC1JTlQ4X01BWCAtIDEpCisjZW5kaWYKKyNpZmRlZiBfX1VJTlQ4X01BWF9fCisjIHVuZGVmIFVJTlQ4X01BWAorIyBkZWZpbmUgVUlOVDhfTUFYIF9fVUlOVDhfTUFYX18KKyNlbmRpZgorI2lmZGVmIF9fSU5UMTZfTUFYX18KKyMgdW5kZWYgSU5UMTZfTUFYCisjIGRlZmluZSBJTlQxNl9NQVggX19JTlQxNl9NQVhfXworIyB1bmRlZiBJTlQxNl9NSU4KKyMgZGVmaW5lIElOVDE2X01JTiAoLUlOVDE2X01BWCAtIDEpCisjZW5kaWYKKyNpZmRlZiBfX1VJTlQxNl9NQVhfXworIyB1bmRlZiBVSU5UMTZfTUFYCisjIGRlZmluZSBVSU5UMTZfTUFYIF9fVUlOVDE2X01BWF9fCisjZW5kaWYKKyNpZmRlZiBfX0lOVDMyX01BWF9fCisjIHVuZGVmIElOVDMyX01BWAorIyBkZWZpbmUgSU5UMzJfTUFYIF9fSU5UMzJfTUFYX18KKyMgdW5kZWYgSU5UMzJfTUlOCisjIGRlZmluZSBJTlQzMl9NSU4gKC1JTlQzMl9NQVggLSAxKQorI2VuZGlmCisjaWZkZWYgX19VSU5UMzJfTUFYX18KKyMgdW5kZWYgVUlOVDMyX01BWAorIyBkZWZpbmUgVUlOVDMyX01BWCBfX1VJTlQzMl9NQVhfXworI2VuZGlmCisjaWZkZWYgX19JTlQ2NF9NQVhfXworIyB1bmRlZiBJTlQ2NF9NQVgKKyMgZGVmaW5lIElOVDY0X01BWCBfX0lOVDY0X01BWF9fCisjIHVuZGVmIElOVDY0X01JTgorIyBkZWZpbmUgSU5UNjRfTUlOICgtSU5UNjRfTUFYIC0gMSkKKyNlbmRpZgorI2lmZGVmIF9fVUlOVDY0X01BWF9fCisjIHVuZGVmIFVJTlQ2NF9NQVgKKyMgZGVmaW5lIFVJTlQ2NF9NQVggX19VSU5UNjRfTUFYX18KKyNlbmRpZgorCisjdW5kZWYgSU5UX0xFQVNUOF9NQVgKKyNkZWZpbmUgSU5UX0xFQVNUOF9NQVggX19JTlRfTEVBU1Q4X01BWF9fCisjdW5kZWYgSU5UX0xFQVNUOF9NSU4KKyNkZWZpbmUgSU5UX0xFQVNUOF9NSU4gKC1JTlRfTEVBU1Q4X01BWCAtIDEpCisjdW5kZWYgVUlOVF9MRUFTVDhfTUFYCisjZGVmaW5lIFVJTlRfTEVBU1Q4X01BWCBfX1VJTlRfTEVBU1Q4X01BWF9fCisjdW5kZWYgSU5UX0xFQVNUMTZfTUFYCisjZGVmaW5lIElOVF9MRUFTVDE2X01BWCBfX0lOVF9MRUFTVDE2X01BWF9fCisjdW5kZWYgSU5UX0xFQVNUMTZfTUlOCisjZGVmaW5lIElOVF9MRUFTVDE2X01JTiAoLUlOVF9MRUFTVDE2X01BWCAtIDEpCisjdW5kZWYgVUlOVF9MRUFTVDE2X01BWAorI2RlZmluZSBVSU5UX0xFQVNUMTZfTUFYIF9fVUlOVF9MRUFTVDE2X01BWF9fCisjdW5kZWYgSU5UX0xFQVNUMzJfTUFYCisjZGVmaW5lIElOVF9MRUFTVDMyX01BWCBfX0lOVF9MRUFTVDMyX01BWF9fCisjdW5kZWYgSU5UX0xFQVNUMzJfTUlOCisjZGVmaW5lIElOVF9MRUFTVDMyX01JTiAoLUlOVF9MRUFTVDMyX01BWCAtIDEpCisjdW5kZWYgVUlOVF9MRUFTVDMyX01BWAorI2RlZmluZSBVSU5UX0xFQVNUMzJfTUFYIF9fVUlOVF9MRUFTVDMyX01BWF9fCisjdW5kZWYgSU5UX0xFQVNUNjRfTUFYCisjZGVmaW5lIElOVF9MRUFTVDY0X01BWCBfX0lOVF9MRUFTVDY0X01BWF9fCisjdW5kZWYgSU5UX0xFQVNUNjRfTUlOCisjZGVmaW5lIElOVF9MRUFTVDY0X01JTiAoLUlOVF9MRUFTVDY0X01BWCAtIDEpCisjdW5kZWYgVUlOVF9MRUFTVDY0X01BWAorI2RlZmluZSBVSU5UX0xFQVNUNjRfTUFYIF9fVUlOVF9MRUFTVDY0X01BWF9fCisKKyN1bmRlZiBJTlRfRkFTVDhfTUFYCisjZGVmaW5lIElOVF9GQVNUOF9NQVggX19JTlRfRkFTVDhfTUFYX18KKyN1bmRlZiBJTlRfRkFTVDhfTUlOCisjZGVmaW5lIElOVF9GQVNUOF9NSU4gKC1JTlRfRkFTVDhfTUFYIC0gMSkKKyN1bmRlZiBVSU5UX0ZBU1Q4X01BWAorI2RlZmluZSBVSU5UX0ZBU1Q4X01BWCBfX1VJTlRfRkFTVDhfTUFYX18KKyN1bmRlZiBJTlRfRkFTVDE2X01BWAorI2RlZmluZSBJTlRfRkFTVDE2X01BWCBfX0lOVF9GQVNUMTZfTUFYX18KKyN1bmRlZiBJTlRfRkFTVDE2X01JTgorI2RlZmluZSBJTlRfRkFTVDE2X01JTiAoLUlOVF9GQVNUMTZfTUFYIC0gMSkKKyN1bmRlZiBVSU5UX0ZBU1QxNl9NQVgKKyNkZWZpbmUgVUlOVF9GQVNUMTZfTUFYIF9fVUlOVF9GQVNUMTZfTUFYX18KKyN1bmRlZiBJTlRfRkFTVDMyX01BWAorI2RlZmluZSBJTlRfRkFTVDMyX01BWCBfX0lOVF9GQVNUMzJfTUFYX18KKyN1bmRlZiBJTlRfRkFTVDMyX01JTgorI2RlZmluZSBJTlRfRkFTVDMyX01JTiAoLUlOVF9GQVNUMzJfTUFYIC0gMSkKKyN1bmRlZiBVSU5UX0ZBU1QzMl9NQVgKKyNkZWZpbmUgVUlOVF9GQVNUMzJfTUFYIF9fVUlOVF9GQVNUMzJfTUFYX18KKyN1bmRlZiBJTlRfRkFTVDY0X01BWAorI2RlZmluZSBJTlRfRkFTVDY0X01BWCBfX0lOVF9GQVNUNjRfTUFYX18KKyN1bmRlZiBJTlRfRkFTVDY0X01JTgorI2RlZmluZSBJTlRfRkFTVDY0X01JTiAoLUlOVF9GQVNUNjRfTUFYIC0gMSkKKyN1bmRlZiBVSU5UX0ZBU1Q2NF9NQVgKKyNkZWZpbmUgVUlOVF9GQVNUNjRfTUFYIF9fVUlOVF9GQVNUNjRfTUFYX18KKworI2lmZGVmIF9fSU5UUFRSX01BWF9fCisjIHVuZGVmIElOVFBUUl9NQVgKKyMgZGVmaW5lIElOVFBUUl9NQVggX19JTlRQVFJfTUFYX18KKyMgdW5kZWYgSU5UUFRSX01JTgorIyBkZWZpbmUgSU5UUFRSX01JTiAoLUlOVFBUUl9NQVggLSAxKQorI2VuZGlmCisjaWZkZWYgX19VSU5UUFRSX01BWF9fCisjIHVuZGVmIFVJTlRQVFJfTUFYCisjIGRlZmluZSBVSU5UUFRSX01BWCBfX1VJTlRQVFJfTUFYX18KKyNlbmRpZgorCisjdW5kZWYgSU5UTUFYX01BWAorI2RlZmluZSBJTlRNQVhfTUFYIF9fSU5UTUFYX01BWF9fCisjdW5kZWYgSU5UTUFYX01JTgorI2RlZmluZSBJTlRNQVhfTUlOICgtSU5UTUFYX01BWCAtIDEpCisjdW5kZWYgVUlOVE1BWF9NQVgKKyNkZWZpbmUgVUlOVE1BWF9NQVggX19VSU5UTUFYX01BWF9fCisKKy8qIDcuMTguMyBMaW1pdHMgb2Ygb3RoZXIgaW50ZWdlciB0eXBlcyAqLworCisjdW5kZWYgUFRSRElGRl9NQVgKKyNkZWZpbmUgUFRSRElGRl9NQVggX19QVFJESUZGX01BWF9fCisjdW5kZWYgUFRSRElGRl9NSU4KKyNkZWZpbmUgUFRSRElGRl9NSU4gKC1QVFJESUZGX01BWCAtIDEpCisKKyN1bmRlZiBTSUdfQVRPTUlDX01BWAorI2RlZmluZSBTSUdfQVRPTUlDX01BWCBfX1NJR19BVE9NSUNfTUFYX18KKyN1bmRlZiBTSUdfQVRPTUlDX01JTgorI2RlZmluZSBTSUdfQVRPTUlDX01JTiBfX1NJR19BVE9NSUNfTUlOX18KKworI3VuZGVmIFNJWkVfTUFYCisjZGVmaW5lIFNJWkVfTUFYIF9fU0laRV9NQVhfXworCisjdW5kZWYgV0NIQVJfTUFYCisjZGVmaW5lIFdDSEFSX01BWCBfX1dDSEFSX01BWF9fCisjdW5kZWYgV0NIQVJfTUlOCisjZGVmaW5lIFdDSEFSX01JTiBfX1dDSEFSX01JTl9fCisKKyN1bmRlZiBXSU5UX01BWAorI2RlZmluZSBXSU5UX01BWCBfX1dJTlRfTUFYX18KKyN1bmRlZiBXSU5UX01JTgorI2RlZmluZSBXSU5UX01JTiBfX1dJTlRfTUlOX18KKworI2VuZGlmIC8qICghZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisJICAgfHwgZGVmaW5lZCBfX1NURENfTElNSVRfTUFDUk9TKSAgKi8KKworI2lmICghZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBfX2NwbHVzcGx1cyA+PSAyMDExMDNMIFwKKyAgICAgfHwgZGVmaW5lZCBfX1NURENfQ09OU1RBTlRfTUFDUk9TKQorCisjdW5kZWYgSU5UOF9DCisjZGVmaW5lIElOVDhfQyhjKSBfX0lOVDhfQyhjKQorI3VuZGVmIElOVDE2X0MKKyNkZWZpbmUgSU5UMTZfQyhjKSBfX0lOVDE2X0MoYykKKyN1bmRlZiBJTlQzMl9DCisjZGVmaW5lIElOVDMyX0MoYykgX19JTlQzMl9DKGMpCisjdW5kZWYgSU5UNjRfQworI2RlZmluZSBJTlQ2NF9DKGMpIF9fSU5UNjRfQyhjKQorI3VuZGVmIFVJTlQ4X0MKKyNkZWZpbmUgVUlOVDhfQyhjKSBfX1VJTlQ4X0MoYykKKyN1bmRlZiBVSU5UMTZfQworI2RlZmluZSBVSU5UMTZfQyhjKSBfX1VJTlQxNl9DKGMpCisjdW5kZWYgVUlOVDMyX0MKKyNkZWZpbmUgVUlOVDMyX0MoYykgX19VSU5UMzJfQyhjKQorI3VuZGVmIFVJTlQ2NF9DCisjZGVmaW5lIFVJTlQ2NF9DKGMpIF9fVUlOVDY0X0MoYykKKyN1bmRlZiBJTlRNQVhfQworI2RlZmluZSBJTlRNQVhfQyhjKSBfX0lOVE1BWF9DKGMpCisjdW5kZWYgVUlOVE1BWF9DCisjZGVmaW5lIFVJTlRNQVhfQyhjKSBfX1VJTlRNQVhfQyhjKQorCisjZW5kaWYgLyogKCFkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKwkgICB8fCBkZWZpbmVkIF9fU1REQ19DT05TVEFOVF9NQUNST1MpICovCisKKyNlbmRpZiAvKiBfR0NDX1NURElOVF9IICovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zdGRpbnQuaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3N0ZGludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYjZmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zdGRpbnQuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIF9HQ0NfV1JBUF9TVERJTlRfSAorI2lmIF9fU1REQ19IT1NURURfXworIyBpZiBkZWZpbmVkIF9fY3BsdXNwbHVzICYmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyMgIHVuZGVmIF9fU1REQ19MSU1JVF9NQUNST1MKKyMgIGRlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCisjICB1bmRlZiBfX1NURENfQ09OU1RBTlRfTUFDUk9TCisjICBkZWZpbmUgX19TVERDX0NPTlNUQU5UX01BQ1JPUworIyBlbmRpZgorIyBpbmNsdWRlX25leHQgPHN0ZGludC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAic3RkaW50LWdjYy5oIgorI2VuZGlmCisjZGVmaW5lIF9HQ0NfV1JBUF9TVERJTlRfSAorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS9zdGRub3JldHVybi5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3Rkbm9yZXR1cm4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTRiZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvc3Rkbm9yZXR1cm4uaApAQCAtMCwwICsxLDM1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogSVNPIEMxWDogNy4yMyBfTm9yZXR1cm4gPHN0ZG5vcmV0dXJuLmg+LiAgKi8KKworI2lmbmRlZiBfU1RETk9SRVRVUk5fSAorI2RlZmluZSBfU1RETk9SRVRVUk5fSAorCisjaWZuZGVmIF9fY3BsdXNwbHVzCisKKyNkZWZpbmUgbm9yZXR1cm4gX05vcmV0dXJuCisKKyNlbmRpZgorCisjZW5kaWYJLyogc3Rkbm9yZXR1cm4uaCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvdGJtaW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS90Ym1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2M0Zjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvdGJtaW50cmluLmgKQEAgLTAsMCArMSwxNzIgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9YODZJTlRSSU5fSF9JTkNMVURFRAorIyBlcnJvciAiTmV2ZXIgdXNlIDx0Ym1pbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHg4NmludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fVEJNX18KKyMgZXJyb3IgIlRCTSBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZW5kaWYgLyogX19UQk1fXyAqLworCisjaWZuZGVmIF9UQk1JTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfVEJNSU5UUklOX0hfSU5DTFVERUQKKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmV4dHJpX3UzMiAodW5zaWduZWQgaW50IF9fWCwgY29uc3QgdW5zaWduZWQgaW50IF9fSSkKK3sKKwlyZXR1cm4gX19idWlsdGluX2lhMzJfYmV4dHJpX3UzMiAoX19YLCBfX0kpOworfQorI2Vsc2UKKyNkZWZpbmUgX19iZXh0cmlfdTMyKFgsIEkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCh1bnNpZ25lZCBpbnQpX19idWlsdGluX2lhMzJfYmV4dHJpX3UzMiAoKHVuc2lnbmVkIGludCkoWCksIFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KShJKSkpCisjZW5kaWYgLypfX09QVElNSVpFX18gKi8KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxjZmlsbF91MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHJldHVybiBfX1ggJiAoX19YICsgMSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2JsY2lfdTMyICh1bnNpZ25lZCBpbnQgX19YKQoreworICByZXR1cm4gX19YIHwgfihfX1ggKyAxKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxjaWNfdTMyICh1bnNpZ25lZCBpbnQgX19YKQoreworICByZXR1cm4gfl9fWCAmIChfX1ggKyAxKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxjbXNrX3UzMiAodW5zaWduZWQgaW50IF9fWCkKK3sKKyAgcmV0dXJuIF9fWCBeIChfX1ggKyAxKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxjc191MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHJldHVybiBfX1ggfCAoX19YICsgMSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2Jsc2ZpbGxfdTMyICh1bnNpZ25lZCBpbnQgX19YKQoreworICByZXR1cm4gX19YIHwgKF9fWCAtIDEpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ibHNpY191MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHJldHVybiB+X19YIHwgKF9fWCAtIDEpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX190MW1za2NfdTMyICh1bnNpZ25lZCBpbnQgX19YKQoreworICByZXR1cm4gfl9fWCB8IChfX1ggKyAxKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fdHptc2tfdTMyICh1bnNpZ25lZCBpbnQgX19YKQoreworICByZXR1cm4gfl9fWCAmIChfX1ggLSAxKTsKK30KKworCisKKyNpZmRlZiBfX3g4Nl82NF9fCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19iZXh0cmlfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YLCBjb25zdCB1bnNpZ25lZCBpbnQgX19JKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfYmV4dHJpX3U2NCAoX19YLCBfX0kpOworfQorI2Vsc2UKKyNkZWZpbmUgX19iZXh0cmlfdTY0KFgsIEkpCQkJCQkJICAgXAorICAoKHVuc2lnbmVkIGxvbmcgbG9uZylfX2J1aWx0aW5faWEzMl9iZXh0cmlfdTY0ICgodW5zaWduZWQgbG9uZyBsb25nKShYKSwgXAorCQkJCQkJICAodW5zaWduZWQgbG9uZyBsb25nKShJKSkpCisjZW5kaWYgLypfX09QVElNSVpFX18gKi8KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxjZmlsbF91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX1ggJiAoX19YICsgMSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2JsY2lfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YKQoreworICByZXR1cm4gX19YIHwgfihfX1ggKyAxKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxjaWNfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YKQoreworICByZXR1cm4gfl9fWCAmIChfX1ggKyAxKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxjbXNrX3U2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIF9fWCBeIChfX1ggKyAxKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxjc191NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX1ggfCAoX19YICsgMSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2Jsc2ZpbGxfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YKQoreworICByZXR1cm4gX19YIHwgKF9fWCAtIDEpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ibHNpY191NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiB+X19YIHwgKF9fWCAtIDEpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX190MW1za2NfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YKQoreworICByZXR1cm4gfl9fWCB8IChfX1ggKyAxKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fdHptc2tfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YKQoreworICByZXR1cm4gfl9fWCAmIChfX1ggLSAxKTsKK30KKworCisjZW5kaWYgLyogX194ODZfNjRfXyAgKi8KKyNlbmRpZiAvKiBfVEJNSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3RtbWludHJpbi5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvdG1taW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY3YjE5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3RtbWludHJpbi5oCkBAIC0wLDAgKzEsMjQ0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogSW1wbGVtZW50ZWQgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBpbmNsdWRlZCBpbiB0aGUgSW50ZWwgQysrIENvbXBpbGVyCisgICBVc2VyIEd1aWRlIGFuZCBSZWZlcmVuY2UsIHZlcnNpb24gOS4xLiAgKi8KKworI2lmbmRlZiBfVE1NSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX1RNTUlOVFJJTl9IX0lOQ0xVREVECisKKyNpZm5kZWYgX19TU1NFM19fCisjIGVycm9yICJTU1NFMyBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZWxzZQorCisvKiBXZSBuZWVkIGRlZmluaXRpb25zIGZyb20gdGhlIFNTRTMsIFNTRTIgYW5kIFNTRSBoZWFkZXIgZmlsZXMqLworI2luY2x1ZGUgPHBtbWludHJpbi5oPgorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oYWRkX2VwaTE2IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGhhZGR3MTI4ICgoX192OGhpKV9fWCwgKF9fdjhoaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oYWRkX2VwaTMyIChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGhhZGRkMTI4ICgoX192NHNpKV9fWCwgKF9fdjRzaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oYWRkc19lcGkxNiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BoYWRkc3cxMjggKChfX3Y4aGkpX19YLCAoX192OGhpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oYWRkX3BpMTYgKF9fbTY0IF9fWCwgX19tNjQgX19ZKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9waGFkZHcgKChfX3Y0aGkpX19YLCAoX192NGhpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oYWRkX3BpMzIgKF9fbTY0IF9fWCwgX19tNjQgX19ZKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9waGFkZGQgKChfX3Yyc2kpX19YLCAoX192MnNpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oYWRkc19waTE2IChfX202NCBfX1gsIF9fbTY0IF9fWSkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGhhZGRzdyAoKF9fdjRoaSlfX1gsIChfX3Y0aGkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faHN1Yl9lcGkxNiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Boc3VidzEyOCAoKF9fdjhoaSlfX1gsIChfX3Y4aGkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faHN1Yl9lcGkzMiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Boc3ViZDEyOCAoKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faHN1YnNfZXBpMTYgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9waHN1YnN3MTI4ICgoX192OGhpKV9fWCwgKF9fdjhoaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faHN1Yl9waTE2IChfX202NCBfX1gsIF9fbTY0IF9fWSkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGhzdWJ3ICgoX192NGhpKV9fWCwgKF9fdjRoaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faHN1Yl9waTMyIChfX202NCBfX1gsIF9fbTY0IF9fWSkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGhzdWJkICgoX192MnNpKV9fWCwgKF9fdjJzaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faHN1YnNfcGkxNiAoX19tNjQgX19YLCBfX202NCBfX1kpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3Boc3Vic3cgKChfX3Y0aGkpX19YLCAoX192NGhpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hZGR1YnNfZXBpMTYgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWFkZHVic3cxMjggKChfX3YxNnFpKV9fWCwgKF9fdjE2cWkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hZGR1YnNfcGkxNiAoX19tNjQgX19YLCBfX202NCBfX1kpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BtYWRkdWJzdyAoKF9fdjhxaSlfX1gsIChfX3Y4cWkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbXVsaHJzX2VwaTE2IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG11bGhyc3cxMjggKChfX3Y4aGkpX19YLCAoX192OGhpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tdWxocnNfcGkxNiAoX19tNjQgX19YLCBfX202NCBfX1kpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BtdWxocnN3ICgoX192NGhpKV9fWCwgKF9fdjRoaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaHVmZmxlX2VwaTggKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc2h1ZmIxMjggKChfX3YxNnFpKV9fWCwgKF9fdjE2cWkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NodWZmbGVfcGk4IChfX202NCBfX1gsIF9fbTY0IF9fWSkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHNodWZiICgoX192OHFpKV9fWCwgKF9fdjhxaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaWduX2VwaTggKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc2lnbmIxMjggKChfX3YxNnFpKV9fWCwgKF9fdjE2cWkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2lnbl9lcGkxNiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzaWdudzEyOCAoKF9fdjhoaSlfX1gsIChfX3Y4aGkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2lnbl9lcGkzMiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BzaWduZDEyOCAoKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NpZ25fcGk4IChfX202NCBfX1gsIF9fbTY0IF9fWSkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHNpZ25iICgoX192OHFpKV9fWCwgKF9fdjhxaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2lnbl9waTE2IChfX202NCBfX1gsIF9fbTY0IF9fWSkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHNpZ253ICgoX192NGhpKV9fWCwgKF9fdjRoaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2lnbl9waTMyIChfX202NCBfX1gsIF9fbTY0IF9fWSkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHNpZ25kICgoX192MnNpKV9fWCwgKF9fdjJzaSlfX1kpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hbGlnbnJfZXBpOChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1ksIGNvbnN0IGludCBfX04pCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGFsaWducjEyOCAoKF9fdjJkaSlfX1gsCisJCQkJCSAgICAgIChfX3YyZGkpX19ZLCBfX04gKiA4KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FsaWducl9waTgoX19tNjQgX19YLCBfX202NCBfX1ksIGNvbnN0IGludCBfX04pCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BhbGlnbnIgKChfX3YxZGkpX19YLAorCQkJCQkgKF9fdjFkaSlfX1ksIF9fTiAqIDgpOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX2FsaWducl9lcGk4KFgsIFksIE4pCQkJCQlcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGFsaWducjEyOCAoKF9fdjJkaSkoX19tMTI4aSkoWCksCQlcCisJCQkJCShfX3YyZGkpKF9fbTEyOGkpKFkpLAkJXAorCQkJCQkoaW50KShOKSAqIDgpKQorI2RlZmluZSBfbW1fYWxpZ25yX3BpOChYLCBZLCBOKQkJCQkJCVwKKyAgKChfX202NCkgX19idWlsdGluX2lhMzJfcGFsaWduciAoKF9fdjFkaSkoX19tNjQpKFgpLAkJCVwKKwkJCQkgICAoX192MWRpKShfX202NCkoWSksCQkJXAorCQkJCSAgIChpbnQpKE4pICogOCkpCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWJzX2VwaTggKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BhYnNiMTI4ICgoX192MTZxaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hYnNfZXBpMTYgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BhYnN3MTI4ICgoX192OGhpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Fic19lcGkzMiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGFic2QxMjggKChfX3Y0c2kpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Fic19waTggKF9fbTY0IF9fWCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGFic2IgKChfX3Y4cWkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Fic19waTE2IChfX202NCBfX1gpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BhYnN3ICgoX192NGhpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hYnNfcGkzMiAoX19tNjQgX19YKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wYWJzZCAoKF9fdjJzaSlfX1gpOworfQorCisjZW5kaWYgLyogX19TU1NFM19fICovCisKKyNlbmRpZiAvKiBfVE1NSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3Vud2luZC5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvdW53aW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhkNzhiOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3Vud2luZC5oCkBAIC0wLDAgKzEsMjkzIEBACisvKiBFeGNlcHRpb24gaGFuZGxpbmcgYW5kIGZyYW1lIHVud2luZCBydW50aW1lIGludGVyZmFjZSByb3V0aW5lcy4KKyAgIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCisgICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBUaGlzIGlzIGRlcml2ZWQgZnJvbSB0aGUgQysrIEFCSSBmb3IgSUEtNjQuICBXaGVyZSB3ZSBkaXZlcmdlCisgICBmb3IgY3Jvc3MtYXJjaGl0ZWN0dXJlIGNvbXBhdGliaWxpdHkgYXJlIG5vdGVkIHdpdGggIkBAQCIuICAqLworCisjaWZuZGVmIF9VTldJTkRfSAorI2RlZmluZSBfVU5XSU5EX0gKKworI2lmIGRlZmluZWQgKF9fU0VIX18pICYmICFkZWZpbmVkIChfX1VTSU5HX1NKTEpfRVhDRVBUSU9OU19fKQorLyogT25seSBmb3IgX0dDQ19zcGVjaWZpY19oYW5kbGVyLiAgKi8KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmbmRlZiBISURFX0VYUE9SVFMKKyNwcmFnbWEgR0NDIHZpc2liaWxpdHkgcHVzaChkZWZhdWx0KQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogTGV2ZWwgMTogQmFzZSBBQkkgICovCisKKy8qIEBAQCBUaGUgSUEtNjQgQUJJIHVzZXMgdWludDY0IHRocm91Z2hvdXQuICBNb3N0IHBsYWNlcyB0aGlzIGlzCisgICBpbmVmZmljaWVudCBmb3IgMzItYml0IGFuZCBzbWFsbGVyIG1hY2hpbmVzLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgX1Vud2luZF9Xb3JkIF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fdW53aW5kX3dvcmRfXykpKTsKK3R5cGVkZWYgc2lnbmVkIF9VbndpbmRfU3dvcmQgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX191bndpbmRfd29yZF9fKSkpOworI2lmIGRlZmluZWQoX19pYTY0X18pICYmIGRlZmluZWQoX19ocHV4X18pCit0eXBlZGVmIHVuc2lnbmVkIF9VbndpbmRfUHRyIF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fd29yZF9fKSkpOworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgX1Vud2luZF9QdHIgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19wb2ludGVyX18pKSk7CisjZW5kaWYKK3R5cGVkZWYgdW5zaWduZWQgX1Vud2luZF9JbnRlcm5hbF9QdHIgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19wb2ludGVyX18pKSk7CisKKy8qIEBAQCBUaGUgSUEtNjQgQUJJIHVzZXMgYSA2NC1iaXQgd29yZCB0byBpZGVudGlmeSB0aGUgcHJvZHVjZXIgYW5kCisgICBjb25zdW1lciBvZiBhbiBleGNlcHRpb24uICBXZSdsbCBnbyBhbG9uZyB3aXRoIHRoaXMgZm9yIG5vdyBldmVuIG9uCisgICAzMi1iaXQgbWFjaGluZXMuICBXZSdsbCBuZWVkIHRvIHByb3ZpZGUgc29tZSBvdGhlciBvcHRpb24gZm9yCisgICAxNi1iaXQgbWFjaGluZXMgYW5kIGZvciBtYWNoaW5lcyB3aXRoID4gOCBiaXRzIHBlciBieXRlLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgX1Vud2luZF9FeGNlcHRpb25fQ2xhc3MgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19ESV9fKSkpOworCisvKiBUaGUgdW53aW5kIGludGVyZmFjZSB1c2VzIHJlYXNvbiBjb2RlcyBpbiBzZXZlcmFsIGNvbnRleHRzIHRvCisgICBpZGVudGlmeSB0aGUgcmVhc29ucyBmb3IgZmFpbHVyZXMgb3Igb3RoZXIgYWN0aW9ucy4gICovCit0eXBlZGVmIGVudW0KK3sKKyAgX1VSQ19OT19SRUFTT04gPSAwLAorICBfVVJDX0ZPUkVJR05fRVhDRVBUSU9OX0NBVUdIVCA9IDEsCisgIF9VUkNfRkFUQUxfUEhBU0UyX0VSUk9SID0gMiwKKyAgX1VSQ19GQVRBTF9QSEFTRTFfRVJST1IgPSAzLAorICBfVVJDX05PUk1BTF9TVE9QID0gNCwKKyAgX1VSQ19FTkRfT0ZfU1RBQ0sgPSA1LAorICBfVVJDX0hBTkRMRVJfRk9VTkQgPSA2LAorICBfVVJDX0lOU1RBTExfQ09OVEVYVCA9IDcsCisgIF9VUkNfQ09OVElOVUVfVU5XSU5EID0gOAorfSBfVW53aW5kX1JlYXNvbl9Db2RlOworCisKKy8qIFRoZSB1bndpbmQgaW50ZXJmYWNlIHVzZXMgYSBwb2ludGVyIHRvIGFuIGV4Y2VwdGlvbiBoZWFkZXIgb2JqZWN0CisgICBhcyBpdHMgcmVwcmVzZW50YXRpb24gb2YgYW4gZXhjZXB0aW9uIGJlaW5nIHRocm93bi4gSW4gZ2VuZXJhbCwgdGhlCisgICBmdWxsIHJlcHJlc2VudGF0aW9uIG9mIGFuIGV4Y2VwdGlvbiBvYmplY3QgaXMgbGFuZ3VhZ2UtIGFuZAorICAgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMsIGJ1dCBpdCB3aWxsIGJlIHByZWZpeGVkIGJ5IGEgaGVhZGVyCisgICB1bmRlcnN0b29kIGJ5IHRoZSB1bndpbmQgaW50ZXJmYWNlLiAgKi8KKworc3RydWN0IF9VbndpbmRfRXhjZXB0aW9uOworCit0eXBlZGVmIHZvaWQgKCpfVW53aW5kX0V4Y2VwdGlvbl9DbGVhbnVwX0ZuKSAoX1Vud2luZF9SZWFzb25fQ29kZSwKKwkJCQkJICAgICAgc3RydWN0IF9VbndpbmRfRXhjZXB0aW9uICopOworCitzdHJ1Y3QgX1Vud2luZF9FeGNlcHRpb24KK3sKKyAgX1Vud2luZF9FeGNlcHRpb25fQ2xhc3MgZXhjZXB0aW9uX2NsYXNzOworICBfVW53aW5kX0V4Y2VwdGlvbl9DbGVhbnVwX0ZuIGV4Y2VwdGlvbl9jbGVhbnVwOworCisjaWYgIWRlZmluZWQgKF9fVVNJTkdfU0pMSl9FWENFUFRJT05TX18pICYmIGRlZmluZWQgKF9fU0VIX18pCisgIF9VbndpbmRfV29yZCBwcml2YXRlX1s2XTsKKyNlbHNlCisgIF9VbndpbmRfV29yZCBwcml2YXRlXzE7CisgIF9VbndpbmRfV29yZCBwcml2YXRlXzI7CisjZW5kaWYKKworICAvKiBAQEAgVGhlIElBLTY0IEFCSSBzYXlzIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgbXVzdCBiZSBkb3VibGUtd29yZCBhbGlnbmVkLgorICAgICBUYWtpbmcgdGhhdCBsaXRlcmFsbHkgZG9lcyBub3QgbWFrZSBtdWNoIHNlbnNlIGdlbmVyaWNhbGx5LiAgSW5zdGVhZCB3ZQorICAgICBwcm92aWRlIHRoZSBtYXhpbXVtIGFsaWdubWVudCByZXF1aXJlZCBieSBhbnkgdHlwZSBmb3IgdGhlIG1hY2hpbmUuICAqLworfSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXykpOworCisKKy8qIFRoZSBBQ1RJT05TIGFyZ3VtZW50IHRvIHRoZSBwZXJzb25hbGl0eSByb3V0aW5lIGlzIGEgYml0d2lzZSBPUiBvZiBvbmUKKyAgIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBjb25zdGFudHMuICAqLwordHlwZWRlZiBpbnQgX1Vud2luZF9BY3Rpb247CisKKyNkZWZpbmUgX1VBX1NFQVJDSF9QSEFTRQkxCisjZGVmaW5lIF9VQV9DTEVBTlVQX1BIQVNFCTIKKyNkZWZpbmUgX1VBX0hBTkRMRVJfRlJBTUUJNAorI2RlZmluZSBfVUFfRk9SQ0VfVU5XSU5ECTgKKyNkZWZpbmUgX1VBX0VORF9PRl9TVEFDSwkxNgorCisvKiBUaGUgdGFyZ2V0IGNhbiBvdmVycmlkZSB0aGlzIG1hY3JvIHRvIGRlZmluZSBhbnkgYmFjay1lbmQtc3BlY2lmaWMKKyAgIGF0dHJpYnV0ZXMgcmVxdWlyZWQgZm9yIHRoZSBsb3dlc3QtbGV2ZWwgc3RhY2sgZnJhbWUuICAqLworI2lmbmRlZiBMSUJHQ0MyX1VOV0lORF9BVFRSSUJVVEUKKyNkZWZpbmUgTElCR0NDMl9VTldJTkRfQVRUUklCVVRFCisjZW5kaWYKKworLyogVGhpcyBpcyBhbiBvcGFxdWUgdHlwZSB1c2VkIHRvIHJlZmVyIHRvIGEgc3lzdGVtLXNwZWNpZmljIGRhdGEKKyAgIHN0cnVjdHVyZSB1c2VkIGJ5IHRoZSBzeXN0ZW0gdW53aW5kZXIuIFRoaXMgY29udGV4dCBpcyBjcmVhdGVkIGFuZAorICAgZGVzdHJveWVkIGJ5IHRoZSBzeXN0ZW0sIGFuZCBwYXNzZWQgdG8gdGhlIHBlcnNvbmFsaXR5IHJvdXRpbmUKKyAgIGR1cmluZyB1bndpbmRpbmcuICAqLworc3RydWN0IF9VbndpbmRfQ29udGV4dDsKKworLyogUmFpc2UgYW4gZXhjZXB0aW9uLCBwYXNzaW5nIGFsb25nIHRoZSBnaXZlbiBleGNlcHRpb24gb2JqZWN0LiAgKi8KK2V4dGVybiBfVW53aW5kX1JlYXNvbl9Db2RlIExJQkdDQzJfVU5XSU5EX0FUVFJJQlVURQorX1Vud2luZF9SYWlzZUV4Y2VwdGlvbiAoc3RydWN0IF9VbndpbmRfRXhjZXB0aW9uICopOworCisvKiBSYWlzZSBhbiBleGNlcHRpb24gZm9yIGZvcmNlZCB1bndpbmRpbmcuICAqLworCit0eXBlZGVmIF9VbndpbmRfUmVhc29uX0NvZGUgKCpfVW53aW5kX1N0b3BfRm4pCisgICAgIChpbnQsIF9VbndpbmRfQWN0aW9uLCBfVW53aW5kX0V4Y2VwdGlvbl9DbGFzcywKKyAgICAgIHN0cnVjdCBfVW53aW5kX0V4Y2VwdGlvbiAqLCBzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICosIHZvaWQgKik7CisKK2V4dGVybiBfVW53aW5kX1JlYXNvbl9Db2RlIExJQkdDQzJfVU5XSU5EX0FUVFJJQlVURQorX1Vud2luZF9Gb3JjZWRVbndpbmQgKHN0cnVjdCBfVW53aW5kX0V4Y2VwdGlvbiAqLCBfVW53aW5kX1N0b3BfRm4sIHZvaWQgKik7CisKKy8qIEhlbHBlciB0byBpbnZva2UgdGhlIGV4Y2VwdGlvbl9jbGVhbnVwIHJvdXRpbmUuICAqLworZXh0ZXJuIHZvaWQgX1Vud2luZF9EZWxldGVFeGNlcHRpb24gKHN0cnVjdCBfVW53aW5kX0V4Y2VwdGlvbiAqKTsKKworLyogUmVzdW1lIHByb3BhZ2F0aW9uIG9mIGFuIGV4aXN0aW5nIGV4Y2VwdGlvbi4gIFRoaXMgaXMgdXNlZCBhZnRlcgorICAgZS5nLiBleGVjdXRpbmcgY2xlYW51cCBjb2RlLCBhbmQgbm90IHRvIGltcGxlbWVudCByZXRocm93aW5nLiAgKi8KK2V4dGVybiB2b2lkIExJQkdDQzJfVU5XSU5EX0FUVFJJQlVURQorX1Vud2luZF9SZXN1bWUgKHN0cnVjdCBfVW53aW5kX0V4Y2VwdGlvbiAqKTsKKworLyogQEBAIFJlc3VtZSBwcm9wYWdhdGlvbiBvZiBhIEZPUkNFX1VOV0lORCBleGNlcHRpb24sIG9yIHRvIHJldGhyb3cKKyAgIGEgbm9ybWFsIGV4Y2VwdGlvbiB0aGF0IHdhcyBoYW5kbGVkLiAgKi8KK2V4dGVybiBfVW53aW5kX1JlYXNvbl9Db2RlIExJQkdDQzJfVU5XSU5EX0FUVFJJQlVURQorX1Vud2luZF9SZXN1bWVfb3JfUmV0aHJvdyAoc3RydWN0IF9VbndpbmRfRXhjZXB0aW9uICopOworCisvKiBAQEAgVXNlIHVud2luZCBkYXRhIHRvIHBlcmZvcm0gYSBzdGFjayBiYWNrdHJhY2UuICBUaGUgdHJhY2UgY2FsbGJhY2sKKyAgIGlzIGNhbGxlZCBmb3IgZXZlcnkgc3RhY2sgZnJhbWUgaW4gdGhlIGNhbGwgY2hhaW4sIGJ1dCBubyBjbGVhbnVwCisgICBhY3Rpb25zIGFyZSBwZXJmb3JtZWQuICAqLwordHlwZWRlZiBfVW53aW5kX1JlYXNvbl9Db2RlICgqX1Vud2luZF9UcmFjZV9GbikKKyAgICAgKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKiwgdm9pZCAqKTsKKworZXh0ZXJuIF9VbndpbmRfUmVhc29uX0NvZGUgTElCR0NDMl9VTldJTkRfQVRUUklCVVRFCitfVW53aW5kX0JhY2t0cmFjZSAoX1Vud2luZF9UcmFjZV9Gbiwgdm9pZCAqKTsKKworLyogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciBjb21tdW5pY2F0aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1bndpbmQKKyAgIGNvbnRleHQgKGkuZS4gdGhlIHVud2luZCBkZXNjcmlwdG9ycyBhbmQgdGhlIHVzZXIgcmVnaXN0ZXIgc3RhdGUpIGJldHdlZW4KKyAgIHRoZSB1bndpbmQgbGlicmFyeSBhbmQgdGhlIHBlcnNvbmFsaXR5IHJvdXRpbmUgYW5kIGxhbmRpbmcgcGFkLiAgT25seQorICAgc2VsZWN0ZWQgcmVnaXN0ZXJzIG1heSBiZSBtYW5pcHVsYXRlZC4gICovCisKK2V4dGVybiBfVW53aW5kX1dvcmQgX1Vud2luZF9HZXRHUiAoc3RydWN0IF9VbndpbmRfQ29udGV4dCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgX1Vud2luZF9TZXRHUiAoc3RydWN0IF9VbndpbmRfQ29udGV4dCAqLCBpbnQsIF9VbndpbmRfV29yZCk7CisKK2V4dGVybiBfVW53aW5kX1B0ciBfVW53aW5kX0dldElQIChzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICopOworZXh0ZXJuIF9VbndpbmRfUHRyIF9VbndpbmRfR2V0SVBJbmZvIChzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICosIGludCAqKTsKK2V4dGVybiB2b2lkIF9VbndpbmRfU2V0SVAgKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKiwgX1Vud2luZF9QdHIpOworCisvKiBAQEAgUmV0cmlldmUgdGhlIENGQSBvZiB0aGUgZ2l2ZW4gY29udGV4dC4gICovCitleHRlcm4gX1Vud2luZF9Xb3JkIF9VbndpbmRfR2V0Q0ZBIChzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICopOworCitleHRlcm4gdm9pZCAqX1Vud2luZF9HZXRMYW5ndWFnZVNwZWNpZmljRGF0YSAoc3RydWN0IF9VbndpbmRfQ29udGV4dCAqKTsKKworZXh0ZXJuIF9VbndpbmRfUHRyIF9VbndpbmRfR2V0UmVnaW9uU3RhcnQgKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKik7CisKKworLyogVGhlIHBlcnNvbmFsaXR5IHJvdXRpbmUgaXMgdGhlIGZ1bmN0aW9uIGluIHRoZSBDKysgKG9yIG90aGVyIGxhbmd1YWdlKQorICAgcnVudGltZSBsaWJyYXJ5IHdoaWNoIHNlcnZlcyBhcyBhbiBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgc3lzdGVtIHVud2luZAorICAgbGlicmFyeSBhbmQgbGFuZ3VhZ2Utc3BlY2lmaWMgZXhjZXB0aW9uIGhhbmRsaW5nIHNlbWFudGljcy4gIEl0IGlzCisgICBzcGVjaWZpYyB0byB0aGUgY29kZSBmcmFnbWVudCBkZXNjcmliZWQgYnkgYW4gdW53aW5kIGluZm8gYmxvY2ssIGFuZAorICAgaXQgaXMgYWx3YXlzIHJlZmVyZW5jZWQgdmlhIHRoZSBwb2ludGVyIGluIHRoZSB1bndpbmQgaW5mbyBibG9jaywgYW5kCisgICBoZW5jZSBpdCBoYXMgbm8gQUJJLXNwZWNpZmllZCBuYW1lLgorCisgICBOb3RlIHRoYXQgdGhpcyBpbXBsaWVzIHRoYXQgdHdvIGRpZmZlcmVudCBDKysgaW1wbGVtZW50YXRpb25zIGNhbgorICAgdXNlIGRpZmZlcmVudCBuYW1lcywgYW5kIGhhdmUgZGlmZmVyZW50IGNvbnRlbnRzIGluIHRoZSBsYW5ndWFnZQorICAgc3BlY2lmaWMgZGF0YSBhcmVhLiAgTW9yZW92ZXIsIHRoYXQgdGhlIGxhbmd1YWdlIHNwZWNpZmljIGRhdGEKKyAgIGFyZWEgY29udGFpbnMgbm8gdmVyc2lvbiBpbmZvIGJlY2F1c2UgbmFtZSBvZiB0aGUgZnVuY3Rpb24gaW52b2tlZAorICAgcHJvdmlkZXMgbW9yZSBlZmZlY3RpdmUgdmVyc2lvbmluZyBieSBkZXRlY3RpbmcgYXQgbGluayB0aW1lIHRoZQorICAgbGFjayBvZiBjb2RlIHRvIGhhbmRsZSB0aGUgZGlmZmVyZW50IGRhdGEgZm9ybWF0LiAgKi8KKwordHlwZWRlZiBfVW53aW5kX1JlYXNvbl9Db2RlICgqX1Vud2luZF9QZXJzb25hbGl0eV9GbikKKyAgICAgKGludCwgX1Vud2luZF9BY3Rpb24sIF9VbndpbmRfRXhjZXB0aW9uX0NsYXNzLAorICAgICAgc3RydWN0IF9VbndpbmRfRXhjZXB0aW9uICosIHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKik7CisKKy8qIEBAQCBUaGUgZm9sbG93aW5nIGFsdGVybmF0ZSBlbnRyeSBwb2ludHMgYXJlIGZvciBzZXRqbXAvbG9uZ2ptcAorICAgYmFzZWQgdW53aW5kaW5nLiAgKi8KKworc3RydWN0IFNqTGpfRnVuY3Rpb25fQ29udGV4dDsKK2V4dGVybiB2b2lkIF9VbndpbmRfU2pMal9SZWdpc3RlciAoc3RydWN0IFNqTGpfRnVuY3Rpb25fQ29udGV4dCAqKTsKK2V4dGVybiB2b2lkIF9VbndpbmRfU2pMal9VbnJlZ2lzdGVyIChzdHJ1Y3QgU2pMal9GdW5jdGlvbl9Db250ZXh0ICopOworCitleHRlcm4gX1Vud2luZF9SZWFzb25fQ29kZSBMSUJHQ0MyX1VOV0lORF9BVFRSSUJVVEUKK19VbndpbmRfU2pMal9SYWlzZUV4Y2VwdGlvbiAoc3RydWN0IF9VbndpbmRfRXhjZXB0aW9uICopOworZXh0ZXJuIF9VbndpbmRfUmVhc29uX0NvZGUgTElCR0NDMl9VTldJTkRfQVRUUklCVVRFCitfVW53aW5kX1NqTGpfRm9yY2VkVW53aW5kIChzdHJ1Y3QgX1Vud2luZF9FeGNlcHRpb24gKiwgX1Vud2luZF9TdG9wX0ZuLCB2b2lkICopOworZXh0ZXJuIHZvaWQgTElCR0NDMl9VTldJTkRfQVRUUklCVVRFCitfVW53aW5kX1NqTGpfUmVzdW1lIChzdHJ1Y3QgX1Vud2luZF9FeGNlcHRpb24gKik7CitleHRlcm4gX1Vud2luZF9SZWFzb25fQ29kZSBMSUJHQ0MyX1VOV0lORF9BVFRSSUJVVEUKK19VbndpbmRfU2pMal9SZXN1bWVfb3JfUmV0aHJvdyAoc3RydWN0IF9VbndpbmRfRXhjZXB0aW9uICopOworCisvKiBAQEAgVGhlIGZvbGxvd2luZyBwcm92aWRlIGFjY2VzcyB0byB0aGUgYmFzZSBhZGRyZXNzZXMgZm9yIHRleHQKKyAgIGFuZCBkYXRhLXJlbGF0aXZlIGFkZHJlc3NpbmcgaW4gdGhlIExEU0EuICBJbiBvcmRlciB0byBzdGF5IGxpbmsKKyAgIGNvbXBhdGlibGUgd2l0aCB0aGUgc3RhbmRhcmQgQUJJIGZvciBJQS02NCwgd2UgaW5saW5lIHRoZXNlLiAgKi8KKworI2lmZGVmIF9faWE2NF9fCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyBpbmxpbmUgX1Vud2luZF9QdHIKK19VbndpbmRfR2V0RGF0YVJlbEJhc2UgKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKl9DKQoreworICAvKiBUaGUgR1AgaXMgc3RvcmVkIGluIFIxLiAgKi8KKyAgcmV0dXJuIF9VbndpbmRfR2V0R1IgKF9DLCAxKTsKK30KKworc3RhdGljIGlubGluZSBfVW53aW5kX1B0cgorX1Vud2luZF9HZXRUZXh0UmVsQmFzZSAoc3RydWN0IF9VbndpbmRfQ29udGV4dCAqX0MgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKSkKK3sKKyAgYWJvcnQgKCk7CisgIHJldHVybiAwOworfQorCisvKiBAQEAgUmV0cmlldmUgdGhlIEJhY2tpbmcgU3RvcmUgUG9pbnRlciBvZiB0aGUgZ2l2ZW4gY29udGV4dC4gICovCitleHRlcm4gX1Vud2luZF9Xb3JkIF9VbndpbmRfR2V0QlNQIChzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICopOworI2Vsc2UKK2V4dGVybiBfVW53aW5kX1B0ciBfVW53aW5kX0dldERhdGFSZWxCYXNlIChzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICopOworZXh0ZXJuIF9VbndpbmRfUHRyIF9VbndpbmRfR2V0VGV4dFJlbEJhc2UgKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKik7CisjZW5kaWYKKworLyogQEBAIEdpdmVuIGFuIGFkZHJlc3MsIHJldHVybiB0aGUgZW50cnkgcG9pbnQgb2YgdGhlIGZ1bmN0aW9uIHRoYXQKKyAgIGNvbnRhaW5zIGl0LiAgKi8KK2V4dGVybiB2b2lkICogX1Vud2luZF9GaW5kRW5jbG9zaW5nRnVuY3Rpb24gKHZvaWQgKnBjKTsKKworI2lmbmRlZiBfX1NJWkVPRl9MT05HX18KKyAgI2Vycm9yICJfX1NJWkVPRl9MT05HX18gbWFjcm8gbm90IGRlZmluZWQiCisjZW5kaWYKKworI2lmbmRlZiBfX1NJWkVPRl9QT0lOVEVSX18KKyAgI2Vycm9yICJfX1NJWkVPRl9QT0lOVEVSX18gbWFjcm8gbm90IGRlZmluZWQiCisjZW5kaWYKKworCisvKiBsZWIxMjggdHlwZSBudW1iZXJzIGhhdmUgYSBwb3RlbnRpYWxseSB1bmxpbWl0ZWQgc2l6ZS4KKyAgIFRoZSB0YXJnZXQgb2YgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBvZiBfc2xlYjEyOF90IGFuZCBfdWxlYjEyOF90CisgICBpcyB0byBoYXZlIGVmZmljaWVudCBkYXRhIHR5cGVzIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBsZWIxMjggdHlwZQorICAgbnVtYmVycyB1c2VkIGluIHRoZSB1bndpbmQgY29kZS4KKyAgIE1vc3RseSB0aGVzZSB0eXBlcyB3aWxsIHNpbXBseSBiZSBkZWZpbmVkIHRvIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcKKyAgIGV4Y2VwdCB3aGVuIGEgdW5zaWduZWQgbG9uZyBkYXRhIHR5cGUgb24gdGhlIHRhcmdldCBtYWNoaW5lIGlzIG5vdAorICAgY2FwYWJsZSBvZiBzdG9yaW5nIGEgcG9pbnRlci4gICovCisKKyNpZiBfX1NJWkVPRl9MT05HX18gPj0gX19TSVpFT0ZfUE9JTlRFUl9fCisgIHR5cGVkZWYgbG9uZyBfc2xlYjEyOF90OworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX3VsZWIxMjhfdDsKKyNlbGlmIF9fU0laRU9GX0xPTkdfTE9OR19fID49IF9fU0laRU9GX1BPSU5URVJfXworICB0eXBlZGVmIGxvbmcgbG9uZyBfc2xlYjEyOF90OworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBfdWxlYjEyOF90OworI2Vsc2UKKyMgZXJyb3IgIldoYXQgdHlwZSBzaGFsbCB3ZSB1c2UgZm9yIF9zbGViMTI4X3Q/IgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX1NFSF9fKSAmJiAhZGVmaW5lZCAoX19VU0lOR19TSkxKX0VYQ0VQVElPTlNfXykKKy8qIEhhbmRsZXMgdGhlIG1hcHBpbmcgZnJvbSBTRUggdG8gR0NDIGludGVyZmFjZXMuICAqLworRVhDRVBUSU9OX0RJU1BPU0lUSU9OIF9HQ0Nfc3BlY2lmaWNfaGFuZGxlciAoUEVYQ0VQVElPTl9SRUNPUkQsIHZvaWQgKiwKKwkJCQkJICAgICBQQ09OVEVYVCwgUERJU1BBVENIRVJfQ09OVEVYVCwKKwkJCQkJICAgICBfVW53aW5kX1BlcnNvbmFsaXR5X0ZuKTsKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjaWZuZGVmIEhJREVfRVhQT1JUUworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwb3AKKyNlbmRpZgorCisjZW5kaWYgLyogdW53aW5kLmggKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3ZhcmFyZ3MuaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3ZhcmFyZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yjk4MDNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUvdmFyYXJncy5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfVkFSQVJHU19ICisjZGVmaW5lIF9WQVJBUkdTX0gKKworI2Vycm9yICJHQ0Mgbm8gbG9uZ2VyIGltcGxlbWVudHMgPHZhcmFyZ3MuaD4uIgorI2Vycm9yICJSZXZpc2UgeW91ciBjb2RlIHRvIHVzZSA8c3RkYXJnLmg+LiIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS93bW1pbnRyaW4uaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3dtbWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYzI0ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS93bW1pbnRyaW4uaApAQCAtMCwwICsxLDEyMCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIEltcGxlbWVudGVkIGZyb20gdGhlIHNwZWNpZmljYXRpb24gaW5jbHVkZWQgaW4gdGhlIEludGVsIEMrKyBDb21waWxlcgorICAgVXNlciBHdWlkZSBhbmQgUmVmZXJlbmNlLCB2ZXJzaW9uIDEwLjEuICAqLworCisjaWZuZGVmIF9XTU1JTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfV01NSU5UUklOX0hfSU5DTFVERUQKKworLyogV2UgbmVlZCBkZWZpbml0aW9ucyBmcm9tIHRoZSBTU0UyIGhlYWRlciBmaWxlLiAgKi8KKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKworI2lmICFkZWZpbmVkIChfX0FFU19fKSAmJiAhZGVmaW5lZCAoX19QQ0xNVUxfXykKKyMgZXJyb3IgIkFFUy9QQ0xNVUwgaW5zdHJ1Y3Rpb25zIG5vdCBlbmFibGVkIgorI2Vsc2UKKworLyogQUVTICovCisKKyNpZmRlZiBfX0FFU19fCisvKiBQZXJmb3JtcyAxIHJvdW5kIG9mIEFFUyBkZWNyeXB0aW9uIG9mIHRoZSBmaXJzdCBtMTI4aSB1c2luZyAKKyAgIHRoZSBzZWNvbmQgbTEyOGkgYXMgYSByb3VuZCBrZXkuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWVzZGVjX3NpMTI4IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfYWVzZGVjMTI4ICgoX192MmRpKV9fWCwgKF9fdjJkaSlfX1kpOworfQorCisvKiBQZXJmb3JtcyB0aGUgbGFzdCByb3VuZCBvZiBBRVMgZGVjcnlwdGlvbiBvZiB0aGUgZmlyc3QgbTEyOGkgCisgICB1c2luZyB0aGUgc2Vjb25kIG0xMjhpIGFzIGEgcm91bmQga2V5LiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Flc2RlY2xhc3Rfc2kxMjggKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9hZXNkZWNsYXN0MTI4ICgoX192MmRpKV9fWCwKKwkJCQkJCSAoX192MmRpKV9fWSk7Cit9CisKKy8qIFBlcmZvcm1zIDEgcm91bmQgb2YgQUVTIGVuY3J5cHRpb24gb2YgdGhlIGZpcnN0IG0xMjhpIHVzaW5nIAorICAgdGhlIHNlY29uZCBtMTI4aSBhcyBhIHJvdW5kIGtleS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZXNlbmNfc2kxMjggKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9hZXNlbmMxMjggKChfX3YyZGkpX19YLCAoX192MmRpKV9fWSk7Cit9CisKKy8qIFBlcmZvcm1zIHRoZSBsYXN0IHJvdW5kIG9mIEFFUyBlbmNyeXB0aW9uIG9mIHRoZSBmaXJzdCBtMTI4aQorICAgdXNpbmcgdGhlIHNlY29uZCBtMTI4aSBhcyBhIHJvdW5kIGtleS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZXNlbmNsYXN0X3NpMTI4IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfYWVzZW5jbGFzdDEyOCAoKF9fdjJkaSlfX1gsIChfX3YyZGkpX19ZKTsKK30KKworLyogUGVyZm9ybXMgdGhlIEludmVyc2VNaXhDb2x1bW4gb3BlcmF0aW9uIG9uIHRoZSBzb3VyY2UgbTEyOGkgCisgICBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW50byBtMTI4aSBkZXN0aW5hdGlvbi4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZXNpbWNfc2kxMjggKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2Flc2ltYzEyOCAoKF9fdjJkaSlfX1gpOworfQorCisvKiBHZW5lcmF0ZXMgYSBtMTI4aSByb3VuZCBrZXkgZm9yIHRoZSBpbnB1dCBtMTI4aSBBRVMgY2lwaGVyIGtleSBhbmQKKyAgIGJ5dGUgcm91bmQgY29uc3RhbnQuICBUaGUgc2Vjb25kIHBhcmFtZXRlciBtdXN0IGJlIGEgY29tcGlsZSB0aW1lCisgICBjb25zdGFudC4gICovCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZXNrZXlnZW5hc3Npc3Rfc2kxMjggKF9fbTEyOGkgX19YLCBjb25zdCBpbnQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2Flc2tleWdlbmFzc2lzdDEyOCAoKF9fdjJkaSlfX1gsIF9fQyk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fYWVza2V5Z2VuYXNzaXN0X3NpMTI4KFgsIEMpCQkJCQlcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfYWVza2V5Z2VuYXNzaXN0MTI4ICgoX192MmRpKShfX20xMjhpKShYKSwJXAorCQkJCQkJKGludCkoQykpKQorI2VuZGlmCisjZW5kaWYgIC8qIF9fQUVTX18gKi8KKworLyogUENMTVVMICovCisKKyNpZmRlZiBfX1BDTE1VTF9fCisvKiBQZXJmb3JtcyBjYXJyeS1sZXNzIGludGVnZXIgbXVsdGlwbGljYXRpb24gb2YgNjQtYml0IGhhbHZlcyBvZgorICAgMTI4LWJpdCBpbnB1dCBvcGVyYW5kcy4gIFRoZSB0aGlyZCBwYXJhbWV0ZXIgaW5kdWNhdGVzIHdoaWNoIDY0LWJpdAorICAgaGF2ZXMgb2YgdGhlIGlucHV0IHBhcmFtZXRlcnMgdjEgYW5kIHYyIHNob3VsZCBiZSB1c2VkLiBJdCBtdXN0IGJlCisgICBhIGNvbXBpbGUgdGltZSBjb25zdGFudC4gICovCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbG11bGVwaTY0X3NpMTI4IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1ksIGNvbnN0IGludCBfX0kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGNsbXVscWRxMTI4ICgoX192MmRpKV9fWCwKKwkJCQkJCShfX3YyZGkpX19ZLCBfX0kpOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX2NsbXVsZXBpNjRfc2kxMjgoWCwgWSwgSSkJCQkJCVwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wY2xtdWxxZHExMjggKChfX3YyZGkpKF9fbTEyOGkpKFgpLAkJXAorCQkJCQkgIChfX3YyZGkpKF9fbTEyOGkpKFkpLCAoaW50KShJKSkpCisjZW5kaWYKKyNlbmRpZiAgLyogX19QQ0xNVUxfXyAgKi8KKworI2VuZGlmIC8qIF9fQUVTX18vX19QQ0xNVUxfXyAqLworCisjZW5kaWYgLyogX1dNTUlOVFJJTl9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS94ODZpbnRyaW4uaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3g4NmludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZjI5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS94ODZpbnRyaW4uaApAQCAtMCwwICsxLDEyMiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX1g4NklOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9YODZJTlRSSU5fSF9JTkNMVURFRAorCisjaW5jbHVkZSA8aWEzMmludHJpbi5oPgorCisjaWZkZWYgX19NTVhfXworI2luY2x1ZGUgPG1taW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fU1NFX18KKyNpbmNsdWRlIDx4bW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19TU0UyX18KKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19TU0UzX18KKyNpbmNsdWRlIDxwbW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19TU1NFM19fCisjaW5jbHVkZSA8dG1taW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fU1NFNEFfXworI2luY2x1ZGUgPGFtbWludHJpbi5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX1NTRTRfMl9fKSB8fCBkZWZpbmVkIChfX1NTRTRfMV9fKQorI2luY2x1ZGUgPHNtbWludHJpbi5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0FFU19fKSB8fCBkZWZpbmVkIChfX1BDTE1VTF9fKQorI2luY2x1ZGUgPHdtbWludHJpbi5oPgorI2VuZGlmCisKKy8qIEZvciBpbmNsdWRpbmcgQVZYIGluc3RydWN0aW9ucyAqLworI2luY2x1ZGUgPGltbWludHJpbi5oPgorCisjaWZkZWYgX18zZE5PV19fCisjaW5jbHVkZSA8bW0zZG5vdy5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0ZNQTRfXworI2luY2x1ZGUgPGZtYTRpbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19YT1BfXworI2luY2x1ZGUgPHhvcGludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0xXUF9fCisjaW5jbHVkZSA8bHdwaW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fQk1JX18KKyNpbmNsdWRlIDxibWlpbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19CTUkyX18KKyNpbmNsdWRlIDxibWkyaW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fVEJNX18KKyNpbmNsdWRlIDx0Ym1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19MWkNOVF9fCisjaW5jbHVkZSA8bHpjbnRpbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19QT1BDTlRfXworI2luY2x1ZGUgPHBvcGNudGludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX1JEU0VFRF9fCisjaW5jbHVkZSA8cmRzZWVkaW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fUFJGQ0hXX18KKyNpbmNsdWRlIDxwcmZjaHdpbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19GWFNSX18KKyNpbmNsdWRlIDxmeHNyaW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fWFNBVkVfXworI2luY2x1ZGUgPHhzYXZlaW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fWFNBVkVPUFRfXworI2luY2x1ZGUgPHhzYXZlb3B0aW50cmluLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFkeGludHJpbi5oPgorCisjZW5kaWYgLyogX1g4NklOVFJJTl9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS94bW1pbnRyaW4uaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbmNsdWRlL3htbWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMjM1NjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS94bW1pbnRyaW4uaApAQCAtMCwwICsxLDEyNTAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBJbXBsZW1lbnRlZCBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGluY2x1ZGVkIGluIHRoZSBJbnRlbCBDKysgQ29tcGlsZXIKKyAgIFVzZXIgR3VpZGUgYW5kIFJlZmVyZW5jZSwgdmVyc2lvbiA5LjAuICAqLworCisjaWZuZGVmIF9YTU1JTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfWE1NSU5UUklOX0hfSU5DTFVERUQKKworI2lmbmRlZiBfX1NTRV9fCisjIGVycm9yICJTU0UgaW5zdHJ1Y3Rpb24gc2V0IG5vdCBlbmFibGVkIgorI2Vsc2UKKworLyogV2UgbmVlZCB0eXBlIGRlZmluaXRpb25zIGZyb20gdGhlIE1NWCBoZWFkZXIgZmlsZS4gICovCisjaW5jbHVkZSA8bW1pbnRyaW4uaD4KKworLyogR2V0IF9tbV9tYWxsb2MgKCkgYW5kIF9tbV9mcmVlICgpLiAgKi8KKyNpbmNsdWRlIDxtbV9tYWxsb2MuaD4KKworLyogVGhlIEludGVsIEFQSSBpcyBmbGV4aWJsZSBlbm91Z2ggdGhhdCB3ZSBtdXN0IGFsbG93IGFsaWFzaW5nIHdpdGggb3RoZXIKKyAgIHZlY3RvciB0eXBlcywgYW5kIHRoZWlyIHNjYWxhciBjb21wb25lbnRzLiAgKi8KK3R5cGVkZWYgZmxvYXQgX19tMTI4IF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDE2KSwgX19tYXlfYWxpYXNfXykpOworCisvKiBJbnRlcm5hbCBkYXRhIHR5cGVzIGZvciBpbXBsZW1lbnRpbmcgdGhlIGludHJpbnNpY3MuICAqLwordHlwZWRlZiBmbG9hdCBfX3Y0c2YgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMTYpKSk7CisKKy8qIENyZWF0ZSBhIHNlbGVjdG9yIGZvciB1c2Ugd2l0aCB0aGUgU0hVRlBTIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgX01NX1NIVUZGTEUoZnAzLGZwMixmcDEsZnAwKSBcCisgKCgoZnAzKSA8PCA2KSB8ICgoZnAyKSA8PCA0KSB8ICgoZnAxKSA8PCAyKSB8IChmcDApKQorCisvKiBDb25zdGFudHMgZm9yIHVzZSB3aXRoIF9tbV9wcmVmZXRjaC4gICovCitlbnVtIF9tbV9oaW50Cit7CisgIF9NTV9ISU5UX1QwID0gMywKKyAgX01NX0hJTlRfVDEgPSAyLAorICBfTU1fSElOVF9UMiA9IDEsCisgIF9NTV9ISU5UX05UQSA9IDAKK307CisKKy8qIEJpdHMgaW4gdGhlIE1YQ1NSLiAgKi8KKyNkZWZpbmUgX01NX0VYQ0VQVF9NQVNLICAgICAgIDB4MDAzZgorI2RlZmluZSBfTU1fRVhDRVBUX0lOVkFMSUQgICAgMHgwMDAxCisjZGVmaW5lIF9NTV9FWENFUFRfREVOT1JNICAgICAweDAwMDIKKyNkZWZpbmUgX01NX0VYQ0VQVF9ESVZfWkVSTyAgIDB4MDAwNAorI2RlZmluZSBfTU1fRVhDRVBUX09WRVJGTE9XICAgMHgwMDA4CisjZGVmaW5lIF9NTV9FWENFUFRfVU5ERVJGTE9XICAweDAwMTAKKyNkZWZpbmUgX01NX0VYQ0VQVF9JTkVYQUNUICAgIDB4MDAyMAorCisjZGVmaW5lIF9NTV9NQVNLX01BU0sgICAgICAgICAweDFmODAKKyNkZWZpbmUgX01NX01BU0tfSU5WQUxJRCAgICAgIDB4MDA4MAorI2RlZmluZSBfTU1fTUFTS19ERU5PUk0gICAgICAgMHgwMTAwCisjZGVmaW5lIF9NTV9NQVNLX0RJVl9aRVJPICAgICAweDAyMDAKKyNkZWZpbmUgX01NX01BU0tfT1ZFUkZMT1cgICAgIDB4MDQwMAorI2RlZmluZSBfTU1fTUFTS19VTkRFUkZMT1cgICAgMHgwODAwCisjZGVmaW5lIF9NTV9NQVNLX0lORVhBQ1QgICAgICAweDEwMDAKKworI2RlZmluZSBfTU1fUk9VTkRfTUFTSyAgICAgICAgMHg2MDAwCisjZGVmaW5lIF9NTV9ST1VORF9ORUFSRVNUICAgICAweDAwMDAKKyNkZWZpbmUgX01NX1JPVU5EX0RPV04gICAgICAgIDB4MjAwMAorI2RlZmluZSBfTU1fUk9VTkRfVVAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIF9NTV9ST1VORF9UT1dBUkRfWkVSTyAweDYwMDAKKworI2RlZmluZSBfTU1fRkxVU0hfWkVST19NQVNLICAgMHg4MDAwCisjZGVmaW5lIF9NTV9GTFVTSF9aRVJPX09OICAgICAweDgwMDAKKyNkZWZpbmUgX01NX0ZMVVNIX1pFUk9fT0ZGICAgIDB4MDAwMAorCisvKiBDcmVhdGUgYSB2ZWN0b3Igb2YgemVyb3MuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXR6ZXJvX3BzICh2b2lkKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMTI4KXsgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiB9OworfQorCisvKiBQZXJmb3JtIHRoZSByZXNwZWN0aXZlIG9wZXJhdGlvbiBvbiB0aGUgbG93ZXIgU1BGUCAoc2luZ2xlLXByZWNpc2lvbgorICAgZmxvYXRpbmctcG9pbnQpIHZhbHVlcyBvZiBBIGFuZCBCOyB0aGUgdXBwZXIgdGhyZWUgU1BGUCB2YWx1ZXMgYXJlCisgICBwYXNzZWQgdGhyb3VnaCBmcm9tIEEuICAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZF9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2FkZHNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1Yl9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3N1YnNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX211bF9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX211bHNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Rpdl9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2RpdnNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NxcnRfc3MgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9zcXJ0c3MgKChfX3Y0c2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9yY3Bfc3MgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9yY3BzcyAoKF9fdjRzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3JzcXJ0X3NzIChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfcnNxcnRzcyAoKF9fdjRzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21pbl9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21pbnNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21heF9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21heHNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCisvKiBQZXJmb3JtIHRoZSByZXNwZWN0aXZlIG9wZXJhdGlvbiBvbiB0aGUgZm91ciBTUEZQIHZhbHVlcyBpbiBBIGFuZCBCLiAgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9hZGRwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdWJfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9zdWJwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tdWxfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tdWxwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9kaXZfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9kaXZwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcXJ0X3BzIChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfc3FydHBzICgoX192NHNmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcmNwX3BzIChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfcmNwcHMgKChfX3Y0c2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9yc3FydF9wcyAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3JzcXJ0cHMgKChfX3Y0c2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9taW5fcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9taW5wcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXhfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tYXhwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworLyogUGVyZm9ybSBsb2dpY2FsIGJpdC13aXNlIG9wZXJhdGlvbnMgb24gMTI4LWJpdCB2YWx1ZXMuICAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FuZF9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2FuZHBzIChfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYW5kbm90X3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfYW5kbnBzIChfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fb3JfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9vcnBzIChfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1feG9yX3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfeG9ycHMgKF9fQSwgX19CKTsKK30KKworLyogUGVyZm9ybSBhIGNvbXBhcmlzb24gb24gdGhlIGxvd2VyIFNQRlAgdmFsdWVzIG9mIEEgYW5kIEIuICBJZiB0aGUKKyAgIGNvbXBhcmlzb24gaXMgdHJ1ZSwgcGxhY2UgYSBtYXNrIG9mIGFsbCBvbmVzIGluIHRoZSByZXN1bHQsIG90aGVyd2lzZSBhCisgICBtYXNrIG9mIHplcm9zLiAgVGhlIHVwcGVyIHRocmVlIFNQRlAgdmFsdWVzIGFyZSBwYXNzZWQgdGhyb3VnaCBmcm9tIEEuICAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGVxX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wZXFzcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBsdF9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2NtcGx0c3MgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbGVfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXBsZXNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGd0X3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbW92c3MgKChfX3Y0c2YpIF9fQSwKKwkJCQkJKF9fdjRzZikKKwkJCQkJX19idWlsdGluX2lhMzJfY21wbHRzcyAoKF9fdjRzZikgX19CLAorCQkJCQkJCQkoX192NHNmKQorCQkJCQkJCQlfX0EpKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBnZV9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21vdnNzICgoX192NHNmKSBfX0EsCisJCQkJCShfX3Y0c2YpCisJCQkJCV9fYnVpbHRpbl9pYTMyX2NtcGxlc3MgKChfX3Y0c2YpIF9fQiwKKwkJCQkJCQkJKF9fdjRzZikKKwkJCQkJCQkJX19BKSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmVxX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wbmVxc3MgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmx0X3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wbmx0c3MgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmxlX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wbmxlc3MgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmd0X3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbW92c3MgKChfX3Y0c2YpIF9fQSwKKwkJCQkJKF9fdjRzZikKKwkJCQkJX19idWlsdGluX2lhMzJfY21wbmx0c3MgKChfX3Y0c2YpIF9fQiwKKwkJCQkJCQkJIChfX3Y0c2YpCisJCQkJCQkJCSBfX0EpKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBuZ2Vfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tb3ZzcyAoKF9fdjRzZikgX19BLAorCQkJCQkoX192NHNmKQorCQkJCQlfX2J1aWx0aW5faWEzMl9jbXBubGVzcyAoKF9fdjRzZikgX19CLAorCQkJCQkJCQkgKF9fdjRzZikKKwkJCQkJCQkJIF9fQSkpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcG9yZF9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2NtcG9yZHNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcHVub3JkX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wdW5vcmRzcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworLyogUGVyZm9ybSBhIGNvbXBhcmlzb24gb24gdGhlIGZvdXIgU1BGUCB2YWx1ZXMgb2YgQSBhbmQgQi4gIEZvciBlYWNoCisgICBlbGVtZW50LCBpZiB0aGUgY29tcGFyaXNvbiBpcyB0cnVlLCBwbGFjZSBhIG1hc2sgb2YgYWxsIG9uZXMgaW4gdGhlCisgICByZXN1bHQsIG90aGVyd2lzZSBhIG1hc2sgb2YgemVyb3MuICAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGVxX3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wZXFwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBsdF9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2NtcGx0cHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbGVfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXBsZXBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGd0X3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wZ3RwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBnZV9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2NtcGdlcHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmVxX3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wbmVxcHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmx0X3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wbmx0cHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmxlX3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wbmxlcHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmd0X3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wbmd0cHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmdlX3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wbmdlcHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wb3JkX3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wb3JkcHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wdW5vcmRfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXB1bm9yZHBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCisvKiBDb21wYXJlIHRoZSBsb3dlciBTUEZQIHZhbHVlcyBvZiBBIGFuZCBCIGFuZCByZXR1cm4gMSBpZiB0cnVlCisgICBhbmQgMCBpZiBmYWxzZS4gICovCisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29taWVxX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY29taWVxICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWlsdF9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NvbWlsdCAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21pbGVfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jb21pbGUgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29taWd0X3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY29taWd0ICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWlnZV9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NvbWlnZSAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21pbmVxX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY29taW5lcSAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91Y29taWVxX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdWNvbWllcSAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91Y29taWx0X3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdWNvbWlsdCAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91Y29taWxlX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdWNvbWlsZSAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91Y29taWd0X3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdWNvbWlndCAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91Y29taWdlX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdWNvbWlnZSAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91Y29taW5lcV9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Vjb21pbmVxICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCisvKiBDb252ZXJ0IHRoZSBsb3dlciBTUEZQIHZhbHVlIHRvIGEgMzItYml0IGludGVnZXIgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50CisgICByb3VuZGluZyBtb2RlLiAgKi8KK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c3Nfc2kzMiAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2N2dHNzMnNpICgoX192NHNmKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dF9zczJzaSAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIF9tbV9jdnRzc19zaTMyIChfX0EpOworfQorCisjaWZkZWYgX194ODZfNjRfXworLyogQ29udmVydCB0aGUgbG93ZXIgU1BGUCB2YWx1ZSB0byBhIDMyLWJpdCBpbnRlZ2VyIGFjY29yZGluZyB0byB0aGUKKyAgIGN1cnJlbnQgcm91bmRpbmcgbW9kZS4gICovCisKKy8qIEludGVsIGludHJpbnNpYy4gICovCitleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNzX3NpNjQgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jdnRzczJzaTY0ICgoX192NHNmKSBfX0EpOworfQorCisvKiBNaWNyb3NvZnQgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c3Nfc2k2NHggKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jdnRzczJzaTY0ICgoX192NHNmKSBfX0EpOworfQorI2VuZGlmCisKKy8qIENvbnZlcnQgdGhlIHR3byBsb3dlciBTUEZQIHZhbHVlcyB0byAzMi1iaXQgaW50ZWdlcnMgYWNjb3JkaW5nIHRvIHRoZQorICAgY3VycmVudCByb3VuZGluZyBtb2RlLiAgUmV0dXJuIHRoZSBpbnRlZ2VycyBpbiBwYWNrZWQgZm9ybS4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0cHNfcGkzMiAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfY3Z0cHMycGkgKChfX3Y0c2YpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRfcHMycGkgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiBfbW1fY3Z0cHNfcGkzMiAoX19BKTsKK30KKworLyogVHJ1bmNhdGUgdGhlIGxvd2VyIFNQRlAgdmFsdWUgdG8gYSAzMi1iaXQgaW50ZWdlci4gICovCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHRzc19zaTMyIChfX20xMjggX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3Z0dHNzMnNpICgoX192NHNmKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHRfc3Myc2kgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiBfbW1fY3Z0dHNzX3NpMzIgKF9fQSk7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCisvKiBUcnVuY2F0ZSB0aGUgbG93ZXIgU1BGUCB2YWx1ZSB0byBhIDMyLWJpdCBpbnRlZ2VyLiAgKi8KKworLyogSW50ZWwgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0dHNzX3NpNjQgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jdnR0c3Myc2k2NCAoKF9fdjRzZikgX19BKTsKK30KKworLyogTWljcm9zb2Z0IGludHJpbnNpYy4gICovCitleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHRzc19zaTY0eCAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2N2dHRzczJzaTY0ICgoX192NHNmKSBfX0EpOworfQorI2VuZGlmCisKKy8qIFRydW5jYXRlIHRoZSB0d28gbG93ZXIgU1BGUCB2YWx1ZXMgdG8gMzItYml0IGludGVnZXJzLiAgUmV0dXJuIHRoZQorICAgaW50ZWdlcnMgaW4gcGFja2VkIGZvcm0uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHRwc19waTMyIChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9jdnR0cHMycGkgKChfX3Y0c2YpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnR0X3BzMnBpIChfX20xMjggX19BKQoreworICByZXR1cm4gX21tX2N2dHRwc19waTMyIChfX0EpOworfQorCisvKiBDb252ZXJ0IEIgdG8gYSBTUEZQIHZhbHVlIGFuZCBpbnNlcnQgaXQgYXMgZWxlbWVudCB6ZXJvIGluIEEuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzaTMyX3NzIChfX20xMjggX19BLCBpbnQgX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY3Z0c2kyc3MgKChfX3Y0c2YpIF9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRfc2kyc3MgKF9fbTEyOCBfX0EsIGludCBfX0IpCit7CisgIHJldHVybiBfbW1fY3Z0c2kzMl9zcyAoX19BLCBfX0IpOworfQorCisjaWZkZWYgX194ODZfNjRfXworLyogQ29udmVydCBCIHRvIGEgU1BGUCB2YWx1ZSBhbmQgaW5zZXJ0IGl0IGFzIGVsZW1lbnQgemVybyBpbiBBLiAgKi8KKworLyogSW50ZWwgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2k2NF9zcyAoX19tMTI4IF9fQSwgbG9uZyBsb25nIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2N2dHNpNjQyc3MgKChfX3Y0c2YpIF9fQSwgX19CKTsKK30KKworLyogTWljcm9zb2Z0IGludHJpbnNpYy4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNpNjR4X3NzIChfX20xMjggX19BLCBsb25nIGxvbmcgX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY3Z0c2k2NDJzcyAoKF9fdjRzZikgX19BLCBfX0IpOworfQorI2VuZGlmCisKKy8qIENvbnZlcnQgdGhlIHR3byAzMi1iaXQgdmFsdWVzIGluIEIgdG8gU1BGUCBmb3JtIGFuZCBpbnNlcnQgdGhlbQorICAgYXMgdGhlIHR3byBsb3dlciBlbGVtZW50cyBpbiBBLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0cGkzMl9wcyAoX19tMTI4IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY3Z0cGkycHMgKChfX3Y0c2YpIF9fQSwgKF9fdjJzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dF9waTJwcyAoX19tMTI4IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gX21tX2N2dHBpMzJfcHMgKF9fQSwgX19CKTsKK30KKworLyogQ29udmVydCB0aGUgZm91ciBzaWduZWQgMTYtYml0IHZhbHVlcyBpbiBBIHRvIFNQRlAgZm9ybS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHBpMTZfcHMgKF9fbTY0IF9fQSkKK3sKKyAgX192NGhpIF9fc2lnbjsKKyAgX192MnNpIF9faGlzaSwgX19sb3NpOworICBfX3Y0c2YgX196ZXJvLCBfX3JhLCBfX3JiOworCisgIC8qIFRoaXMgY29tcGFyaXNvbiBhZ2FpbnN0IHplcm8gZ2l2ZXMgdXMgYSBtYXNrIHRoYXQgY2FuIGJlIHVzZWQgdG8KKyAgICAgZmlsbCBpbiB0aGUgbWlzc2luZyBzaWduIGJpdHMgaW4gdGhlIHVucGFjayBvcGVyYXRpb25zIGJlbG93LCBzbworICAgICB0aGF0IHdlIGdldCBzaWduZWQgdmFsdWVzIGFmdGVyIHVucGFja2luZy4gICovCisgIF9fc2lnbiA9IF9fYnVpbHRpbl9pYTMyX3BjbXBndHcgKChfX3Y0aGkpMExMLCAoX192NGhpKV9fQSk7CisKKyAgLyogQ29udmVydCB0aGUgZm91ciB3b3JkcyB0byBkb3VibGV3b3Jkcy4gICovCisgIF9fbG9zaSA9IChfX3Yyc2kpIF9fYnVpbHRpbl9pYTMyX3B1bnBja2x3ZCAoKF9fdjRoaSlfX0EsIF9fc2lnbik7CisgIF9faGlzaSA9IChfX3Yyc2kpIF9fYnVpbHRpbl9pYTMyX3B1bnBja2h3ZCAoKF9fdjRoaSlfX0EsIF9fc2lnbik7CisKKyAgLyogQ29udmVydCB0aGUgZG91Ymxld29yZHMgdG8gZmxvYXRpbmcgcG9pbnQgdHdvIGF0IGEgdGltZS4gICovCisgIF9femVybyA9IChfX3Y0c2YpIF9tbV9zZXR6ZXJvX3BzICgpOworICBfX3JhID0gX19idWlsdGluX2lhMzJfY3Z0cGkycHMgKF9femVybywgX19sb3NpKTsKKyAgX19yYiA9IF9fYnVpbHRpbl9pYTMyX2N2dHBpMnBzIChfX3JhLCBfX2hpc2kpOworCisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tb3ZsaHBzIChfX3JhLCBfX3JiKTsKK30KKworLyogQ29udmVydCB0aGUgZm91ciB1bnNpZ25lZCAxNi1iaXQgdmFsdWVzIGluIEEgdG8gU1BGUCBmb3JtLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0cHUxNl9wcyAoX19tNjQgX19BKQoreworICBfX3Yyc2kgX19oaXNpLCBfX2xvc2k7CisgIF9fdjRzZiBfX3plcm8sIF9fcmEsIF9fcmI7CisKKyAgLyogQ29udmVydCB0aGUgZm91ciB3b3JkcyB0byBkb3VibGV3b3Jkcy4gICovCisgIF9fbG9zaSA9IChfX3Yyc2kpIF9fYnVpbHRpbl9pYTMyX3B1bnBja2x3ZCAoKF9fdjRoaSlfX0EsIChfX3Y0aGkpMExMKTsKKyAgX19oaXNpID0gKF9fdjJzaSkgX19idWlsdGluX2lhMzJfcHVucGNraHdkICgoX192NGhpKV9fQSwgKF9fdjRoaSkwTEwpOworCisgIC8qIENvbnZlcnQgdGhlIGRvdWJsZXdvcmRzIHRvIGZsb2F0aW5nIHBvaW50IHR3byBhdCBhIHRpbWUuICAqLworICBfX3plcm8gPSAoX192NHNmKSBfbW1fc2V0emVyb19wcyAoKTsKKyAgX19yYSA9IF9fYnVpbHRpbl9pYTMyX2N2dHBpMnBzIChfX3plcm8sIF9fbG9zaSk7CisgIF9fcmIgPSBfX2J1aWx0aW5faWEzMl9jdnRwaTJwcyAoX19yYSwgX19oaXNpKTsKKworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbW92bGhwcyAoX19yYSwgX19yYik7Cit9CisKKy8qIENvbnZlcnQgdGhlIGxvdyBmb3VyIHNpZ25lZCA4LWJpdCB2YWx1ZXMgaW4gQSB0byBTUEZQIGZvcm0uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRwaThfcHMgKF9fbTY0IF9fQSkKK3sKKyAgX192OHFpIF9fc2lnbjsKKworICAvKiBUaGlzIGNvbXBhcmlzb24gYWdhaW5zdCB6ZXJvIGdpdmVzIHVzIGEgbWFzayB0aGF0IGNhbiBiZSB1c2VkIHRvCisgICAgIGZpbGwgaW4gdGhlIG1pc3Npbmcgc2lnbiBiaXRzIGluIHRoZSB1bnBhY2sgb3BlcmF0aW9ucyBiZWxvdywgc28KKyAgICAgdGhhdCB3ZSBnZXQgc2lnbmVkIHZhbHVlcyBhZnRlciB1bnBhY2tpbmcuICAqLworICBfX3NpZ24gPSBfX2J1aWx0aW5faWEzMl9wY21wZ3RiICgoX192OHFpKTBMTCwgKF9fdjhxaSlfX0EpOworCisgIC8qIENvbnZlcnQgdGhlIGZvdXIgbG93IGJ5dGVzIHRvIHdvcmRzLiAgKi8KKyAgX19BID0gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wdW5wY2tsYncgKChfX3Y4cWkpX19BLCBfX3NpZ24pOworCisgIHJldHVybiBfbW1fY3Z0cGkxNl9wcyhfX0EpOworfQorCisvKiBDb252ZXJ0IHRoZSBsb3cgZm91ciB1bnNpZ25lZCA4LWJpdCB2YWx1ZXMgaW4gQSB0byBTUEZQIGZvcm0uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRwdThfcHMoX19tNjQgX19BKQoreworICBfX0EgPSAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3B1bnBja2xidyAoKF9fdjhxaSlfX0EsIChfX3Y4cWkpMExMKTsKKyAgcmV0dXJuIF9tbV9jdnRwdTE2X3BzKF9fQSk7Cit9CisKKy8qIENvbnZlcnQgdGhlIGZvdXIgc2lnbmVkIDMyLWJpdCB2YWx1ZXMgaW4gQSBhbmQgQiB0byBTUEZQIGZvcm0uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRwaTMyeDJfcHMoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIF9fdjRzZiBfX3plcm8gPSAoX192NHNmKSBfbW1fc2V0emVyb19wcyAoKTsKKyAgX192NHNmIF9fc2ZhID0gX19idWlsdGluX2lhMzJfY3Z0cGkycHMgKF9femVybywgKF9fdjJzaSlfX0EpOworICBfX3Y0c2YgX19zZmIgPSBfX2J1aWx0aW5faWEzMl9jdnRwaTJwcyAoX19zZmEsIChfX3Yyc2kpX19CKTsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21vdmxocHMgKF9fc2ZhLCBfX3NmYik7Cit9CisKKy8qIENvbnZlcnQgdGhlIGZvdXIgU1BGUCB2YWx1ZXMgaW4gQSB0byBmb3VyIHNpZ25lZCAxNi1iaXQgaW50ZWdlcnMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHBzX3BpMTYoX19tMTI4IF9fQSkKK3sKKyAgX192NHNmIF9faGlzZiA9IChfX3Y0c2YpX19BOworICBfX3Y0c2YgX19sb3NmID0gX19idWlsdGluX2lhMzJfbW92aGxwcyAoX19oaXNmLCBfX2hpc2YpOworICBfX3Yyc2kgX19oaXNpID0gX19idWlsdGluX2lhMzJfY3Z0cHMycGkgKF9faGlzZik7CisgIF9fdjJzaSBfX2xvc2kgPSBfX2J1aWx0aW5faWEzMl9jdnRwczJwaSAoX19sb3NmKTsKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGFja3NzZHcgKF9faGlzaSwgX19sb3NpKTsKK30KKworLyogQ29udmVydCB0aGUgZm91ciBTUEZQIHZhbHVlcyBpbiBBIHRvIGZvdXIgc2lnbmVkIDgtYml0IGludGVnZXJzLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRwc19waTgoX19tMTI4IF9fQSkKK3sKKyAgX192NGhpIF9fdG1wID0gKF9fdjRoaSkgX21tX2N2dHBzX3BpMTYgKF9fQSk7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BhY2tzc3diIChfX3RtcCwgKF9fdjRoaSkwTEwpOworfQorCisvKiBTZWxlY3RzIGZvdXIgc3BlY2lmaWMgU1BGUCB2YWx1ZXMgZnJvbSBBIGFuZCBCIGJhc2VkIG9uIE1BU0suICAqLworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaHVmZmxlX3BzIChfX20xMjggX19BLCBfX20xMjggX19CLCBpbnQgY29uc3QgX19tYXNrKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfc2h1ZnBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IsIF9fbWFzayk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fc2h1ZmZsZV9wcyhBLCBCLCBNQVNLKQkJCQkJXAorICAoKF9fbTEyOCkgX19idWlsdGluX2lhMzJfc2h1ZnBzICgoX192NHNmKShfX20xMjgpKEEpLAkJCVwKKwkJCQkgICAoX192NHNmKShfX20xMjgpKEIpLCAoaW50KShNQVNLKSkpCisjZW5kaWYKKworLyogU2VsZWN0cyBhbmQgaW50ZXJsZWF2ZXMgdGhlIHVwcGVyIHR3byBTUEZQIHZhbHVlcyBmcm9tIEEgYW5kIEIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91bnBhY2toaV9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3VucGNraHBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCisvKiBTZWxlY3RzIGFuZCBpbnRlcmxlYXZlcyB0aGUgbG93ZXIgdHdvIFNQRlAgdmFsdWVzIGZyb20gQSBhbmQgQi4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3VucGFja2xvX3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdW5wY2tscHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKKy8qIFNldHMgdGhlIHVwcGVyIHR3byBTUEZQIHZhbHVlcyB3aXRoIDY0LWJpdHMgb2YgZGF0YSBsb2FkZWQgZnJvbSBQOworICAgdGhlIGxvd2VyIHR3byB2YWx1ZXMgYXJlIHBhc3NlZCB0aHJvdWdoIGZyb20gQS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xvYWRoX3BpIChfX20xMjggX19BLCBfX202NCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbG9hZGhwcyAoKF9fdjRzZilfX0EsIChjb25zdCBfX3Yyc2YgKilfX1ApOworfQorCisvKiBTdG9yZXMgdGhlIHVwcGVyIHR3byBTUEZQIHZhbHVlcyBvZiBBIGludG8gUC4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZWhfcGkgKF9fbTY0ICpfX1AsIF9fbTEyOCBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3N0b3JlaHBzICgoX192MnNmICopX19QLCAoX192NHNmKV9fQSk7Cit9CisKKy8qIE1vdmVzIHRoZSB1cHBlciB0d28gdmFsdWVzIG9mIEIgaW50byB0aGUgbG93ZXIgdHdvIHZhbHVlcyBvZiBBLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbW92ZWhsX3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbW92aGxwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworLyogTW92ZXMgdGhlIGxvd2VyIHR3byB2YWx1ZXMgb2YgQiBpbnRvIHRoZSB1cHBlciB0d28gdmFsdWVzIG9mIEEuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tb3ZlbGhfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tb3ZsaHBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCisvKiBTZXRzIHRoZSBsb3dlciB0d28gU1BGUCB2YWx1ZXMgd2l0aCA2NC1iaXRzIG9mIGRhdGEgbG9hZGVkIGZyb20gUDsKKyAgIHRoZSB1cHBlciB0d28gdmFsdWVzIGFyZSBwYXNzZWQgdGhyb3VnaCBmcm9tIEEuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sb2FkbF9waSAoX19tMTI4IF9fQSwgX19tNjQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2xvYWRscHMgKChfX3Y0c2YpX19BLCAoY29uc3QgX192MnNmICopX19QKTsKK30KKworLyogU3RvcmVzIHRoZSBsb3dlciB0d28gU1BGUCB2YWx1ZXMgb2YgQSBpbnRvIFAuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmVsX3BpIChfX202NCAqX19QLCBfX20xMjggX19BKQoreworICBfX2J1aWx0aW5faWEzMl9zdG9yZWxwcyAoKF9fdjJzZiAqKV9fUCwgKF9fdjRzZilfX0EpOworfQorCisvKiBDcmVhdGVzIGEgNC1iaXQgbWFzayBmcm9tIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIFNQRlAgdmFsdWVzLiAgKi8KK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbW92ZW1hc2tfcHMgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9tb3Ztc2twcyAoKF9fdjRzZilfX0EpOworfQorCisvKiBSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBjb250cm9sIHJlZ2lzdGVyLiAgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZ2V0Y3NyICh2b2lkKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfc3RteGNzciAoKTsKK30KKworLyogUmVhZCBleGNlcHRpb24gYml0cyBmcm9tIHRoZSBjb250cm9sIHJlZ2lzdGVyLiAgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfTU1fR0VUX0VYQ0VQVElPTl9TVEFURSAodm9pZCkKK3sKKyAgcmV0dXJuIF9tbV9nZXRjc3IoKSAmIF9NTV9FWENFUFRfTUFTSzsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19NTV9HRVRfRVhDRVBUSU9OX01BU0sgKHZvaWQpCit7CisgIHJldHVybiBfbW1fZ2V0Y3NyKCkgJiBfTU1fTUFTS19NQVNLOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX01NX0dFVF9ST1VORElOR19NT0RFICh2b2lkKQoreworICByZXR1cm4gX21tX2dldGNzcigpICYgX01NX1JPVU5EX01BU0s7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfTU1fR0VUX0ZMVVNIX1pFUk9fTU9ERSAodm9pZCkKK3sKKyAgcmV0dXJuIF9tbV9nZXRjc3IoKSAmIF9NTV9GTFVTSF9aRVJPX01BU0s7Cit9CisKKy8qIFNldCB0aGUgY29udHJvbCByZWdpc3RlciB0byBJLiAgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldGNzciAodW5zaWduZWQgaW50IF9fSSkKK3sKKyAgX19idWlsdGluX2lhMzJfbGRteGNzciAoX19JKTsKK30KKworLyogU2V0IGV4Y2VwdGlvbiBiaXRzIGluIHRoZSBjb250cm9sIHJlZ2lzdGVyLiAgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX01NX1NFVF9FWENFUFRJT05fU1RBVEUodW5zaWduZWQgaW50IF9fbWFzaykKK3sKKyAgX21tX3NldGNzcigoX21tX2dldGNzcigpICYgfl9NTV9FWENFUFRfTUFTSykgfCBfX21hc2spOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19NTV9TRVRfRVhDRVBUSU9OX01BU0sgKHVuc2lnbmVkIGludCBfX21hc2spCit7CisgIF9tbV9zZXRjc3IoKF9tbV9nZXRjc3IoKSAmIH5fTU1fTUFTS19NQVNLKSB8IF9fbWFzayk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX01NX1NFVF9ST1VORElOR19NT0RFICh1bnNpZ25lZCBpbnQgX19tb2RlKQoreworICBfbW1fc2V0Y3NyKChfbW1fZ2V0Y3NyKCkgJiB+X01NX1JPVU5EX01BU0spIHwgX19tb2RlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfTU1fU0VUX0ZMVVNIX1pFUk9fTU9ERSAodW5zaWduZWQgaW50IF9fbW9kZSkKK3sKKyAgX21tX3NldGNzcigoX21tX2dldGNzcigpICYgfl9NTV9GTFVTSF9aRVJPX01BU0spIHwgX19tb2RlKTsKK30KKworLyogQ3JlYXRlIGEgdmVjdG9yIHdpdGggZWxlbWVudCAwIGFzIEYgYW5kIHRoZSByZXN0IHplcm8uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRfc3MgKGZsb2F0IF9fRikKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTEyOCkoX192NHNmKXsgX19GLCAwLjBmLCAwLjBmLCAwLjBmIH07Cit9CisKKy8qIENyZWF0ZSBhIHZlY3RvciB3aXRoIGFsbCBmb3VyIGVsZW1lbnRzIGVxdWFsIHRvIEYuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXQxX3BzIChmbG9hdCBfX0YpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20xMjgpKF9fdjRzZil7IF9fRiwgX19GLCBfX0YsIF9fRiB9OworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldF9wczEgKGZsb2F0IF9fRikKK3sKKyAgcmV0dXJuIF9tbV9zZXQxX3BzIChfX0YpOworfQorCisvKiBDcmVhdGUgYSB2ZWN0b3Igd2l0aCBlbGVtZW50IDAgYXMgKlAgYW5kIHRoZSByZXN0IHplcm8uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sb2FkX3NzIChmbG9hdCBjb25zdCAqX19QKQoreworICByZXR1cm4gX21tX3NldF9zcyAoKl9fUCk7Cit9CisKKy8qIENyZWF0ZSBhIHZlY3RvciB3aXRoIGFsbCBmb3VyIGVsZW1lbnRzIGVxdWFsIHRvICpQLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbG9hZDFfcHMgKGZsb2F0IGNvbnN0ICpfX1ApCit7CisgIHJldHVybiBfbW1fc2V0MV9wcyAoKl9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbG9hZF9wczEgKGZsb2F0IGNvbnN0ICpfX1ApCit7CisgIHJldHVybiBfbW1fbG9hZDFfcHMgKF9fUCk7Cit9CisKKy8qIExvYWQgZm91ciBTUEZQIHZhbHVlcyBmcm9tIFAuICBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xvYWRfcHMgKGZsb2F0IGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMTI4KSAqKF9fdjRzZiAqKV9fUDsKK30KKworLyogTG9hZCBmb3VyIFNQRlAgdmFsdWVzIGZyb20gUC4gIFRoZSBhZGRyZXNzIG5lZWQgbm90IGJlIDE2LWJ5dGUgYWxpZ25lZC4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xvYWR1X3BzIChmbG9hdCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbG9hZHVwcyAoX19QKTsKK30KKworLyogTG9hZCBmb3VyIFNQRlAgdmFsdWVzIGluIHJldmVyc2Ugb3JkZXIuICBUaGUgYWRkcmVzcyBtdXN0IGJlIGFsaWduZWQuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sb2Fkcl9wcyAoZmxvYXQgY29uc3QgKl9fUCkKK3sKKyAgX192NHNmIF9fdG1wID0gKihfX3Y0c2YgKilfX1A7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9zaHVmcHMgKF9fdG1wLCBfX3RtcCwgX01NX1NIVUZGTEUgKDAsMSwyLDMpKTsKK30KKworLyogQ3JlYXRlIHRoZSB2ZWN0b3IgW1ogWSBYIFddLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0X3BzIChjb25zdCBmbG9hdCBfX1osIGNvbnN0IGZsb2F0IF9fWSwgY29uc3QgZmxvYXQgX19YLCBjb25zdCBmbG9hdCBfX1cpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20xMjgpKF9fdjRzZil7IF9fVywgX19YLCBfX1ksIF9fWiB9OworfQorCisvKiBDcmVhdGUgdGhlIHZlY3RvciBbVyBYIFkgWl0uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRyX3BzIChmbG9hdCBfX1osIGZsb2F0IF9fWSwgZmxvYXQgX19YLCBmbG9hdCBfX1cpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20xMjgpKF9fdjRzZil7IF9fWiwgX19ZLCBfX1gsIF9fVyB9OworfQorCisvKiBTdG9yZXMgdGhlIGxvd2VyIFNQRlAgdmFsdWUuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmVfc3MgKGZsb2F0ICpfX1AsIF9fbTEyOCBfX0EpCit7CisgICpfX1AgPSBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3Y0c2YgKChfX3Y0c2YpX19BLCAwKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGZsb2F0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNzX2YzMiAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjRzZiAoKF9fdjRzZilfX0EsIDApOworfQorCisvKiBTdG9yZSBmb3VyIFNQRlAgdmFsdWVzLiAgVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmVfcHMgKGZsb2F0ICpfX1AsIF9fbTEyOCBfX0EpCit7CisgICooX192NHNmICopX19QID0gKF9fdjRzZilfX0E7Cit9CisKKy8qIFN0b3JlIGZvdXIgU1BGUCB2YWx1ZXMuICBUaGUgYWRkcmVzcyBuZWVkIG5vdCBiZSAxNi1ieXRlIGFsaWduZWQuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmV1X3BzIChmbG9hdCAqX19QLCBfX20xMjggX19BKQoreworICBfX2J1aWx0aW5faWEzMl9zdG9yZXVwcyAoX19QLCAoX192NHNmKV9fQSk7Cit9CisKKy8qIFN0b3JlIHRoZSBsb3dlciBTUEZQIHZhbHVlIGFjcm9zcyBmb3VyIHdvcmRzLiAgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0b3JlMV9wcyAoZmxvYXQgKl9fUCwgX19tMTI4IF9fQSkKK3sKKyAgX192NHNmIF9fdmEgPSAoX192NHNmKV9fQTsKKyAgX192NHNmIF9fdG1wID0gX19idWlsdGluX2lhMzJfc2h1ZnBzIChfX3ZhLCBfX3ZhLCBfTU1fU0hVRkZMRSAoMCwwLDAsMCkpOworICBfbW1fc3RvcmV1X3BzIChfX1AsIF9fdG1wKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmVfcHMxIChmbG9hdCAqX19QLCBfX20xMjggX19BKQoreworICBfbW1fc3RvcmUxX3BzIChfX1AsIF9fQSk7Cit9CisKKy8qIFN0b3JlIGZvdXIgU1BGUCB2YWx1ZXMgaW4gcmV2ZXJzZSBvcmRlci4gIFRoZSBhZGRyZXNzIG11c3QgYmUgYWxpZ25lZC4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZXJfcHMgKGZsb2F0ICpfX1AsIF9fbTEyOCBfX0EpCit7CisgIF9fdjRzZiBfX3ZhID0gKF9fdjRzZilfX0E7CisgIF9fdjRzZiBfX3RtcCA9IF9fYnVpbHRpbl9pYTMyX3NodWZwcyAoX192YSwgX192YSwgX01NX1NIVUZGTEUgKDAsMSwyLDMpKTsKKyAgX21tX3N0b3JlX3BzIChfX1AsIF9fdG1wKTsKK30KKworLyogU2V0cyB0aGUgbG93IFNQRlAgdmFsdWUgb2YgQSBmcm9tIHRoZSBsb3cgdmFsdWUgb2YgQi4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21vdmVfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tb3ZzcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworLyogRXh0cmFjdHMgb25lIG9mIHRoZSBmb3VyIHdvcmRzIG9mIEEuICBUaGUgc2VsZWN0b3IgTiBtdXN0IGJlIGltbWVkaWF0ZS4gICovCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2V4dHJhY3RfcGkxNiAoX19tNjQgY29uc3QgX19BLCBpbnQgY29uc3QgX19OKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdmVjX2V4dF92NGhpICgoX192NGhpKV9fQSwgX19OKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BleHRydyAoX19tNjQgY29uc3QgX19BLCBpbnQgY29uc3QgX19OKQoreworICByZXR1cm4gX21tX2V4dHJhY3RfcGkxNiAoX19BLCBfX04pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX2V4dHJhY3RfcGkxNihBLCBOKQlcCisgICgoaW50KSBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3Y0aGkgKChfX3Y0aGkpKF9fbTY0KShBKSwgKGludCkoTikpKQorCisjZGVmaW5lIF9tX3BleHRydyhBLCBOKSBfbW1fZXh0cmFjdF9waTE2KEEsIE4pCisjZW5kaWYKKworLyogSW5zZXJ0cyB3b3JkIEQgaW50byBvbmUgb2YgZm91ciB3b3JkcyBvZiBBLiAgVGhlIHNlbGVjdG9yIE4gbXVzdCBiZQorICAgaW1tZWRpYXRlLiAgKi8KKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9pbnNlcnRfcGkxNiAoX19tNjQgY29uc3QgX19BLCBpbnQgY29uc3QgX19ELCBpbnQgY29uc3QgX19OKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl92ZWNfc2V0X3Y0aGkgKChfX3Y0aGkpX19BLCBfX0QsIF9fTik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BpbnNydyAoX19tNjQgY29uc3QgX19BLCBpbnQgY29uc3QgX19ELCBpbnQgY29uc3QgX19OKQoreworICByZXR1cm4gX21tX2luc2VydF9waTE2IChfX0EsIF9fRCwgX19OKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9pbnNlcnRfcGkxNihBLCBELCBOKQkJCQlcCisgICgoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3ZlY19zZXRfdjRoaSAoKF9fdjRoaSkoX19tNjQpKEEpLAlcCisJCQkJCShpbnQpKEQpLCAoaW50KShOKSkpCisKKyNkZWZpbmUgX21fcGluc3J3KEEsIEQsIE4pIF9tbV9pbnNlcnRfcGkxNihBLCBELCBOKQorI2VuZGlmCisKKy8qIENvbXB1dGUgdGhlIGVsZW1lbnQtd2lzZSBtYXhpbXVtIG9mIHNpZ25lZCAxNi1iaXQgdmFsdWVzLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXhfcGkxNiAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BtYXhzdyAoKF9fdjRoaSlfX0EsIChfX3Y0aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcG1heHN3IChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIF9tbV9tYXhfcGkxNiAoX19BLCBfX0IpOworfQorCisvKiBDb21wdXRlIHRoZSBlbGVtZW50LXdpc2UgbWF4aW11bSBvZiB1bnNpZ25lZCA4LWJpdCB2YWx1ZXMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21heF9wdTggKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wbWF4dWIgKChfX3Y4cWkpX19BLCAoX192OHFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BtYXh1YiAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiBfbW1fbWF4X3B1OCAoX19BLCBfX0IpOworfQorCisvKiBDb21wdXRlIHRoZSBlbGVtZW50LXdpc2UgbWluaW11bSBvZiBzaWduZWQgMTYtYml0IHZhbHVlcy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWluX3BpMTYgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wbWluc3cgKChfX3Y0aGkpX19BLCAoX192NGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BtaW5zdyAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiBfbW1fbWluX3BpMTYgKF9fQSwgX19CKTsKK30KKworLyogQ29tcHV0ZSB0aGUgZWxlbWVudC13aXNlIG1pbmltdW0gb2YgdW5zaWduZWQgOC1iaXQgdmFsdWVzLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9taW5fcHU4IChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcG1pbnViICgoX192OHFpKV9fQSwgKF9fdjhxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wbWludWIgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gX21tX21pbl9wdTggKF9fQSwgX19CKTsKK30KKworLyogQ3JlYXRlIGFuIDgtYml0IG1hc2sgb2YgdGhlIHNpZ25zIG9mIDgtYml0IHZhbHVlcy4gICovCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21vdmVtYXNrX3BpOCAoX19tNjQgX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcG1vdm1za2IgKChfX3Y4cWkpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3Btb3Ztc2tiIChfX202NCBfX0EpCit7CisgIHJldHVybiBfbW1fbW92ZW1hc2tfcGk4IChfX0EpOworfQorCisvKiBNdWx0aXBseSBmb3VyIHVuc2lnbmVkIDE2LWJpdCB2YWx1ZXMgaW4gQSBieSBmb3VyIHVuc2lnbmVkIDE2LWJpdCB2YWx1ZXMKKyAgIGluIEIgYW5kIHByb2R1Y2UgdGhlIGhpZ2ggMTYgYml0cyBvZiB0aGUgMzItYml0IHJlc3VsdHMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX211bGhpX3B1MTYgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wbXVsaHV3ICgoX192NGhpKV9fQSwgKF9fdjRoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wbXVsaHV3IChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIF9tbV9tdWxoaV9wdTE2IChfX0EsIF9fQik7Cit9CisKKy8qIFJldHVybiBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb3VyIDE2LWJpdCB2YWx1ZXMgaW4gQS4gIFRoZSBzZWxlY3RvcgorICAgbXVzdCBiZSBhbiBpbW1lZGlhdGUuICAqLworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NodWZmbGVfcGkxNiAoX19tNjQgX19BLCBpbnQgY29uc3QgX19OKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc2h1ZncgKChfX3Y0aGkpX19BLCBfX04pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc2h1ZncgKF9fbTY0IF9fQSwgaW50IGNvbnN0IF9fTikKK3sKKyAgcmV0dXJuIF9tbV9zaHVmZmxlX3BpMTYgKF9fQSwgX19OKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9zaHVmZmxlX3BpMTYoQSwgTikgXAorICAoKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc2h1ZncgKChfX3Y0aGkpKF9fbTY0KShBKSwgKGludCkoTikpKQorCisjZGVmaW5lIF9tX3BzaHVmdyhBLCBOKSBfbW1fc2h1ZmZsZV9waTE2IChBLCBOKQorI2VuZGlmCisKKy8qIENvbmRpdGlvbmFsbHkgc3RvcmUgYnl0ZSBlbGVtZW50cyBvZiBBIGludG8gUC4gIFRoZSBoaWdoIGJpdCBvZiBlYWNoCisgICBieXRlIGluIHRoZSBzZWxlY3RvciBOIGRldGVybWluZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBieXRlIGZyb20KKyAgIEEgaXMgc3RvcmVkLiAgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hc2ttb3ZlX3NpNjQgKF9fbTY0IF9fQSwgX19tNjQgX19OLCBjaGFyICpfX1ApCit7CisgIF9fYnVpbHRpbl9pYTMyX21hc2ttb3ZxICgoX192OHFpKV9fQSwgKF9fdjhxaSlfX04sIF9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fbWFza21vdnEgKF9fbTY0IF9fQSwgX19tNjQgX19OLCBjaGFyICpfX1ApCit7CisgIF9tbV9tYXNrbW92ZV9zaTY0IChfX0EsIF9fTiwgX19QKTsKK30KKworLyogQ29tcHV0ZSB0aGUgcm91bmRlZCBhdmVyYWdlcyBvZiB0aGUgdW5zaWduZWQgOC1iaXQgdmFsdWVzIGluIEEgYW5kIEIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2F2Z19wdTggKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wYXZnYiAoKF9fdjhxaSlfX0EsIChfX3Y4cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGF2Z2IgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gX21tX2F2Z19wdTggKF9fQSwgX19CKTsKK30KKworLyogQ29tcHV0ZSB0aGUgcm91bmRlZCBhdmVyYWdlcyBvZiB0aGUgdW5zaWduZWQgMTYtYml0IHZhbHVlcyBpbiBBIGFuZCBCLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hdmdfcHUxNiAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3Bhdmd3ICgoX192NGhpKV9fQSwgKF9fdjRoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wYXZndyAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiBfbW1fYXZnX3B1MTYgKF9fQSwgX19CKTsKK30KKworLyogQ29tcHV0ZSB0aGUgc3VtIG9mIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBvZiB0aGUgdW5zaWduZWQgOC1iaXQKKyAgIHZhbHVlcyBpbiBBIGFuZCBCLiAgUmV0dXJuIHRoZSB2YWx1ZSBpbiB0aGUgbG93ZXIgMTYtYml0IHdvcmQ7IHRoZQorICAgdXBwZXIgd29yZHMgYXJlIGNsZWFyZWQuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NhZF9wdTggKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc2FkYncgKChfX3Y4cWkpX19BLCAoX192OHFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzYWRidyAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiBfbW1fc2FkX3B1OCAoX19BLCBfX0IpOworfQorCisvKiBMb2FkcyBvbmUgY2FjaGUgbGluZSBmcm9tIGFkZHJlc3MgUCB0byBhIGxvY2F0aW9uICJjbG9zZXIiIHRvIHRoZQorICAgcHJvY2Vzc29yLiAgVGhlIHNlbGVjdG9yIEkgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHByZWZldGNoIG9wZXJhdGlvbi4gICovCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9wcmVmZXRjaCAoY29uc3Qgdm9pZCAqX19QLCBlbnVtIF9tbV9oaW50IF9fSSkKK3sKKyAgX19idWlsdGluX3ByZWZldGNoIChfX1AsIDAsIF9fSSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fcHJlZmV0Y2goUCwgSSkgXAorICBfX2J1aWx0aW5fcHJlZmV0Y2ggKChQKSwgMCwgKEkpKQorI2VuZGlmCisKKy8qIFN0b3JlcyB0aGUgZGF0YSBpbiBBIHRvIHRoZSBhZGRyZXNzIFAgd2l0aG91dCBwb2xsdXRpbmcgdGhlIGNhY2hlcy4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdHJlYW1fcGkgKF9fbTY0ICpfX1AsIF9fbTY0IF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfbW92bnRxICgodW5zaWduZWQgbG9uZyBsb25nICopX19QLCAodW5zaWduZWQgbG9uZyBsb25nKV9fQSk7Cit9CisKKy8qIExpa2V3aXNlLiAgVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RyZWFtX3BzIChmbG9hdCAqX19QLCBfX20xMjggX19BKQoreworICBfX2J1aWx0aW5faWEzMl9tb3ZudHBzIChfX1AsIChfX3Y0c2YpX19BKTsKK30KKworLyogR3VhcmFudGVlcyB0aGF0IGV2ZXJ5IHByZWNlZGluZyBzdG9yZSBpcyBnbG9iYWxseSB2aXNpYmxlIGJlZm9yZQorICAgYW55IHN1YnNlcXVlbnQgc3RvcmUuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2ZlbmNlICh2b2lkKQoreworICBfX2J1aWx0aW5faWEzMl9zZmVuY2UgKCk7Cit9CisKKy8qIFRoZSBleGVjdXRpb24gb2YgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaXMgZGVsYXllZCBieSBhbiBpbXBsZW1lbnRhdGlvbgorICAgc3BlY2lmaWMgYW1vdW50IG9mIHRpbWUuICBUaGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgbW9kaWZ5IHRoZQorICAgYXJjaGl0ZWN0dXJhbCBzdGF0ZS4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9wYXVzZSAodm9pZCkKK3sKKyAgX19idWlsdGluX2lhMzJfcGF1c2UgKCk7Cit9CisKKy8qIFRyYW5zcG9zZSB0aGUgNHg0IG1hdHJpeCBjb21wb3NlZCBvZiByb3dbMC0zXS4gICovCisjZGVmaW5lIF9NTV9UUkFOU1BPU0U0X1BTKHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMpCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgX192NHNmIF9fcjAgPSAocm93MCksIF9fcjEgPSAocm93MSksIF9fcjIgPSAocm93MiksIF9fcjMgPSAocm93Myk7CVwKKyAgX192NHNmIF9fdDAgPSBfX2J1aWx0aW5faWEzMl91bnBja2xwcyAoX19yMCwgX19yMSk7CQkJXAorICBfX3Y0c2YgX190MSA9IF9fYnVpbHRpbl9pYTMyX3VucGNrbHBzIChfX3IyLCBfX3IzKTsJCQlcCisgIF9fdjRzZiBfX3QyID0gX19idWlsdGluX2lhMzJfdW5wY2tocHMgKF9fcjAsIF9fcjEpOwkJCVwKKyAgX192NHNmIF9fdDMgPSBfX2J1aWx0aW5faWEzMl91bnBja2hwcyAoX19yMiwgX19yMyk7CQkJXAorICAocm93MCkgPSBfX2J1aWx0aW5faWEzMl9tb3ZsaHBzIChfX3QwLCBfX3QxKTsJCQkJXAorICAocm93MSkgPSBfX2J1aWx0aW5faWEzMl9tb3ZobHBzIChfX3QxLCBfX3QwKTsJCQkJXAorICAocm93MikgPSBfX2J1aWx0aW5faWEzMl9tb3ZsaHBzIChfX3QyLCBfX3QzKTsJCQkJXAorICAocm93MykgPSBfX2J1aWx0aW5faWEzMl9tb3ZobHBzIChfX3QzLCBfX3QyKTsJCQkJXAorfSB3aGlsZSAoMCkKKworLyogRm9yIGJhY2t3YXJkIHNvdXJjZSBjb21wYXRpYmlsaXR5LiAgKi8KKyNpZmRlZiBfX1NTRTJfXworIyBpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKyNlbmRpZgorCisjZW5kaWYgLyogX19TU0VfXyAqLworI2VuZGlmIC8qIF9YTU1JTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUveG9waW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS94b3BpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmE5OWExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUveG9waW50cmluLmgKQEAgLTAsMCArMSw4MzkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9YODZJTlRSSU5fSF9JTkNMVURFRAorIyBlcnJvciAiTmV2ZXIgdXNlIDx4b3BpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHg4NmludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9YT1BNTUlOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9YT1BNTUlOVFJJTl9IX0lOQ0xVREVECisKKyNpZm5kZWYgX19YT1BfXworIyBlcnJvciAiWE9QIGluc3RydWN0aW9uIHNldCBub3QgZW5hYmxlZCIKKyNlbHNlCisKKyNpbmNsdWRlIDxmbWE0aW50cmluLmg+CisKKy8qIEludGVnZXIgbXVsdGlwbHkvYWRkIGludHJ1Y3Rpb25zLiAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFjY3NfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cG1hY3Nzd3cgKChfX3Y4aGkpX19BLChfX3Y4aGkpX19CLCAoX192OGhpKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hY2NfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cG1hY3N3dyAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CLCAoX192OGhpKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hY2NzZF9lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IsIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cG1hY3Nzd2QgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQiwgKF9fdjRzaSlfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWNjZF9lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IsIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cG1hY3N3ZCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CLCAoX192NHNpKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hY2NzX2VwaTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQiwgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFjc3NkZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CLCAoX192NHNpKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hY2NfZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBtYWNzZGQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQiwgKF9fdjRzaSlfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWNjc2xvX2VwaTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQiwgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFjc3NkcWwgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQiwgKF9fdjJkaSlfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWNjbG9fZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBtYWNzZHFsICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IsIChfX3YyZGkpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFjY3NoaV9lcGkzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IsIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cG1hY3NzZHFoICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IsIChfX3YyZGkpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFjY2hpX2VwaTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQiwgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFjc2RxaCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CLCAoX192MmRpKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hZGRzZF9lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IsIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cG1hZGNzc3dkICgoX192OGhpKV9fQSwoX192OGhpKV9fQiwoX192NHNpKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hZGRkX2VwaTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQiwgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFkY3N3ZCAoKF9fdjhoaSlfX0EsKF9fdjhoaSlfX0IsKF9fdjRzaSlfX0MpOworfQorCisvKiBQYWNrZWQgSW50ZWdlciBIb3Jpem9udGFsIEFkZCBhbmQgU3VidHJhY3QgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hhZGR3X2VwaTgoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZGJ3ICgoX192MTZxaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oYWRkZF9lcGk4KF9fbTEyOGkgX19BKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGhhZGRiZCAoKF9fdjE2cWkpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZHFfZXBpOChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBoYWRkYnEgKChfX3YxNnFpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hhZGRkX2VwaTE2KF9fbTEyOGkgX19BKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGhhZGR3ZCAoKF9fdjhoaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oYWRkcV9lcGkxNihfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBoYWRkd3EgKChfX3Y4aGkpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZHFfZXBpMzIoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZGRxICgoX192NHNpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hhZGR3X2VwdTgoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZHVidyAoKF9fdjE2cWkpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZGRfZXB1OChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBoYWRkdWJkICgoX192MTZxaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oYWRkcV9lcHU4KF9fbTEyOGkgX19BKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGhhZGR1YnEgKChfX3YxNnFpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hhZGRkX2VwdTE2KF9fbTEyOGkgX19BKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGhhZGR1d2QgKChfX3Y4aGkpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZHFfZXB1MTYoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZHV3cSAoKF9fdjhoaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oYWRkcV9lcHUzMihfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBoYWRkdWRxICgoX192NHNpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hzdWJ3X2VwaTgoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwaHN1YmJ3ICgoX192MTZxaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oc3ViZF9lcGkxNihfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBoc3Vid2QgKChfX3Y4aGkpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faHN1YnFfZXBpMzIoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwaHN1YmRxICgoX192NHNpKV9fQSk7Cit9CisKKy8qIFZlY3RvciBjb25kaXRpb25hbCBtb3ZlIGFuZCBwZXJtdXRlICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Ntb3Zfc2kxMjgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjbW92IChfX0EsIF9fQiwgX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcGVybV9lcGk4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQiwgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwcGVybSAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IsIChfX3YxNnFpKV9fQyk7Cit9CisKKy8qIFBhY2tlZCBJbnRlZ2VyIFJvdGF0ZXMgYW5kIFNoaWZ0cworICAgUm90YXRlcyAtIE5vbi1JbW1lZGlhdGUgZm9ybSAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9yb3RfZXBpOChfX20xMjhpIF9fQSwgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cHJvdGIgKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcm90X2VwaTE2KF9fbTEyOGkgX19BLCAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Zwcm90dyAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcm90X2VwaTMyKF9fbTEyOGkgX19BLCAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Zwcm90ZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcm90X2VwaTY0KF9fbTEyOGkgX19BLCAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgIF9fYnVpbHRpbl9pYTMyX3Zwcm90cSAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworLyogUm90YXRlcyAtIEltbWVkaWF0ZSBmb3JtICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3JvdGlfZXBpOChfX20xMjhpIF9fQSwgY29uc3QgaW50IF9fQikKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnByb3RiaSAoKF9fdjE2cWkpX19BLCBfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9yb3RpX2VwaTE2KF9fbTEyOGkgX19BLCBjb25zdCBpbnQgX19CKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cHJvdHdpICgoX192OGhpKV9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcm90aV9lcGkzMihfX20xMjhpIF9fQSwgY29uc3QgaW50IF9fQikKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnByb3RkaSAoKF9fdjRzaSlfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3JvdGlfZXBpNjQoX19tMTI4aSBfX0EsIGNvbnN0IGludCBfX0IpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Zwcm90cWkgKChfX3YyZGkpX19BLCBfX0IpOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX3JvdGlfZXBpOChBLCBOKSBcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnByb3RiaSAoKF9fdjE2cWkpKF9fbTEyOGkpKEEpLCAoaW50KShOKSkpCisjZGVmaW5lIF9tbV9yb3RpX2VwaTE2KEEsIE4pIFwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cHJvdHdpICgoX192OGhpKShfX20xMjhpKShBKSwgKGludCkoTikpKQorI2RlZmluZSBfbW1fcm90aV9lcGkzMihBLCBOKSBcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnByb3RkaSAoKF9fdjRzaSkoX19tMTI4aSkoQSksIChpbnQpKE4pKSkKKyNkZWZpbmUgX21tX3JvdGlfZXBpNjQoQSwgTikgXAorICAoKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Zwcm90cWkgKChfX3YyZGkpKF9fbTEyOGkpKEEpLCAoaW50KShOKSkpCisjZW5kaWYKKworLyogU2hpZnRzICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NobF9lcGk4KF9fbTEyOGkgX19BLCAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Zwc2hsYiAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaGxfZXBpMTYoX19tMTI4aSBfX0EsICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBzaGx3ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaGxfZXBpMzIoX19tMTI4aSBfX0EsICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBzaGxkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaGxfZXBpNjQoX19tMTI4aSBfX0EsICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBzaGxxICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NoYV9lcGk4KF9fbTEyOGkgX19BLCAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Zwc2hhYiAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaGFfZXBpMTYoX19tMTI4aSBfX0EsICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBzaGF3ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaGFfZXBpMzIoX19tMTI4aSBfX0EsICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBzaGFkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaGFfZXBpNjQoX19tMTI4aSBfX0EsICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBzaGFxICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCisvKiBDb21wYXJlIGFuZCBQcmVkaWNhdGUgR2VuZXJhdGlvbgorICAgcGNvbSAoaW50ZWdlciwgdW5zaW5nZWQgYnl0ZXMpICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWx0X2VwdTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbHR1YiAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21sZV9lcHU4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWxldWIgKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZ3RfZXB1OChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21ndHViICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWdlX2VwdTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZ2V1YiAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21lcV9lcHU4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWVxdWIgKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbmVxX2VwdTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbmVxdWIgKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZmFsc2VfZXB1OChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21mYWxzZXViICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbXRydWVfZXB1OChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb210cnVldWIgKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworLypwY29tIChpbnRlZ2VyLCB1bnNpbmdlZCB3b3JkcykgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbHRfZXB1MTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbHR1dyAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbGVfZXB1MTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbGV1dyAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZ3RfZXB1MTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZ3R1dyAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZ2VfZXB1MTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZ2V1dyAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZXFfZXB1MTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZXF1dyAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbmVxX2VwdTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbW5lcXV3ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21mYWxzZV9lcHUxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21mYWxzZXV3ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb210cnVlX2VwdTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbXRydWV1dyAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworLypwY29tIChpbnRlZ2VyLCB1bnNpbmdlZCBkb3VibGUgd29yZHMpICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWx0X2VwdTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWx0dWQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWxlX2VwdTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWxldWQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWd0X2VwdTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWd0dWQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWdlX2VwdTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWdldWQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWVxX2VwdTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWVxdWQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbW5lcV9lcHUzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21uZXF1ZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZmFsc2VfZXB1MzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZmFsc2V1ZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tdHJ1ZV9lcHUzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb210cnVldWQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKKy8qcGNvbSAoaW50ZWdlciwgdW5zaW5nZWQgcXVhZCB3b3JkcykgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbHRfZXB1NjQoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbHR1cSAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbGVfZXB1NjQoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbGV1cSAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZ3RfZXB1NjQoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZ3R1cSAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZ2VfZXB1NjQoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZ2V1cSAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZXFfZXB1NjQoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZXF1cSAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbmVxX2VwdTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbW5lcXVxICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21mYWxzZV9lcHU2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21mYWxzZXVxICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb210cnVlX2VwdTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbXRydWV1cSAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworLypwY29tIChpbnRlZ2VyLCBzaWduZWQgYnl0ZXMpICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWx0X2VwaTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbHRiICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWxlX2VwaTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbGViICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWd0X2VwaTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZ3RiICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWdlX2VwaTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZ2ViICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWVxX2VwaTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZXFiICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbW5lcV9lcGk4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbW5lcWIgKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZmFsc2VfZXBpOChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21mYWxzZWIgKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tdHJ1ZV9lcGk4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbXRydWViICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKKy8qcGNvbSAoaW50ZWdlciwgc2lnbmVkIHdvcmRzKSAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21sdF9lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21sdHcgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWxlX2VwaTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWxldyAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZ3RfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZ3R3ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21nZV9lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21nZXcgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWVxX2VwaTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWVxdyAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbmVxX2VwaTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbW5lcXcgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWZhbHNlX2VwaTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWZhbHNldyAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tdHJ1ZV9lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb210cnVldyAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworLypwY29tIChpbnRlZ2VyLCBzaWduZWQgZG91YmxlIHdvcmRzKSAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21sdF9lcGkzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21sdGQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWxlX2VwaTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWxlZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZ3RfZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZ3RkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21nZV9lcGkzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21nZWQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWVxX2VwaTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWVxZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbmVxX2VwaTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbW5lcWQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWZhbHNlX2VwaTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWZhbHNlZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tdHJ1ZV9lcGkzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb210cnVlZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworLypwY29tIChpbnRlZ2VyLCBzaWduZWQgcXVhZCB3b3JkcykgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbHRfZXBpNjQoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbHRxICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21sZV9lcGk2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21sZXEgKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWd0X2VwaTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWd0cSAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZ2VfZXBpNjQoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZ2VxICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21lcV9lcGk2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21lcXEgKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbW5lcV9lcGk2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21uZXFxICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21mYWxzZV9lcGk2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21mYWxzZXEgKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbXRydWVfZXBpNjQoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tdHJ1ZXEgKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKKy8qIEZSQ1ogKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9mcmN6X3BzIChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZyY3pwcyAoKF9fdjRzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9mcmN6X3BkIChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92ZnJjenBkICgoX192MmRmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZnJjel9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21vdnNzICgoX192NHNmKV9fQSwKKwkJCQkJKF9fdjRzZikKKwkJCQkJX19idWlsdGluX2lhMzJfdmZyY3pzcyAoKF9fdjRzZilfX0IpKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZnJjel9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX21vdnNkICgoX192MmRmKV9fQSwKKwkJCQkJIChfX3YyZGYpCisJCQkJCSBfX2J1aWx0aW5faWEzMl92ZnJjenNkICgoX192MmRmKV9fQikpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2ZyY3pfcHMgKF9fbTI1NiBfX0EpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92ZnJjenBzMjU2ICgoX192OHNmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2ZyY3pfcGQgKF9fbTI1NmQgX19BKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZmcmN6cGQyNTYgKChfX3Y0ZGYpX19BKTsKK30KKworLyogUEVSTUlMMiAqLworCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9wZXJtdXRlMl9wZCAoX19tMTI4ZCBfX1gsIF9fbTEyOGQgX19ZLCBfX20xMjhpIF9fQywgY29uc3QgaW50IF9fSSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92cGVybWlsMnBkICgoX192MmRmKV9fWCwKKwkJCQkJICAgICAgKF9fdjJkZilfX1ksCisJCQkJCSAgICAgIChfX3YyZGkpX19DLAorCQkJCQkgICAgICBfX0kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9wZXJtdXRlMl9wZCAoX19tMjU2ZCBfX1gsIF9fbTI1NmQgX19ZLCBfX20yNTZpIF9fQywgY29uc3QgaW50IF9fSSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92cGVybWlsMnBkMjU2ICgoX192NGRmKV9fWCwKKwkJCQkJCSAoX192NGRmKV9fWSwKKwkJCQkJCSAoX192NGRpKV9fQywKKwkJCQkJCSBfX0kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Blcm11dGUyX3BzIChfX20xMjggX19YLCBfX20xMjggX19ZLCBfX20xMjhpIF9fQywgY29uc3QgaW50IF9fSSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWwycHMgKChfX3Y0c2YpX19YLAorCQkJCQkgICAgIChfX3Y0c2YpX19ZLAorCQkJCQkgICAgIChfX3Y0c2kpX19DLAorCQkJCQkgICAgIF9fSSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfcGVybXV0ZTJfcHMgKF9fbTI1NiBfX1gsIF9fbTI1NiBfX1ksIF9fbTI1NmkgX19DLCBjb25zdCBpbnQgX19JKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdnBlcm1pbDJwczI1NiAoKF9fdjhzZilfX1gsCisJCQkJCQkoX192OHNmKV9fWSwKKwkJCQkJCShfX3Y4c2kpX19DLAorCQkJCQkJX19JKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9wZXJtdXRlMl9wZChYLCBZLCBDLCBJKQkJCQkJXAorICAoKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWwycGQgKChfX3YyZGYpKF9fbTEyOGQpKFgpLAkJXAorCQkJCQkoX192MmRmKShfX20xMjhkKShZKSwJCVwKKwkJCQkJKF9fdjJkaSkoX19tMTI4ZCkoQyksCQlcCisJCQkJCShpbnQpKEkpKSkKKworI2RlZmluZSBfbW0yNTZfcGVybXV0ZTJfcGQoWCwgWSwgQywgSSkJCQkJCVwKKyAgKChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92cGVybWlsMnBkMjU2ICgoX192NGRmKShfX20yNTZkKShYKSwJXAorCQkJCQkgICAoX192NGRmKShfX20yNTZkKShZKSwJXAorCQkJCQkgICAoX192NGRpKShfX20yNTZkKShDKSwJXAorCQkJCQkgICAoaW50KShJKSkpCisKKyNkZWZpbmUgX21tX3Blcm11dGUyX3BzKFgsIFksIEMsIEkpCQkJCQlcCisgICgoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92cGVybWlsMnBzICgoX192NHNmKShfX20xMjgpKFgpLAkJXAorCQkJCSAgICAgICAoX192NHNmKShfX20xMjgpKFkpLAkJXAorCQkJCSAgICAgICAoX192NHNpKShfX20xMjgpKEMpLAkJXAorCQkJCSAgICAgICAoaW50KShJKSkpCisKKyNkZWZpbmUgX21tMjU2X3Blcm11dGUyX3BzKFgsIFksIEMsIEkpCQkJCQlcCisgICgoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92cGVybWlsMnBzMjU2ICgoX192OHNmKShfX20yNTYpKFgpLAkJXAorCQkJCQkgIChfX3Y4c2YpKF9fbTI1NikoWSksICAJXAorCQkJCQkgIChfX3Y4c2kpKF9fbTI1NikoQyksCQlcCisgCQkJCQkgIChpbnQpKEkpKSkKKyNlbmRpZiAvKiBfX09QVElNSVpFX18gKi8KKworI2VuZGlmIC8qIF9fWE9QX18gKi8KKworI2VuZGlmIC8qIF9YT1BNTUlOVFJJTl9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS94c2F2ZWludHJpbi5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUveHNhdmVpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTY2NTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUveHNhdmVpbnRyaW4uaApAQCAtMCwwICsxLDYxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogI2lmICFkZWZpbmVkIF9YODZJTlRSSU5fSF9JTkNMVURFRCAmJiAhZGVmaW5lZCBfSU1NSU5UUklOX0hfSU5DTFVERUQgKi8KKy8qICMgZXJyb3IgIk5ldmVyIHVzZSA8eHNhdmVpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHg4NmludHJpbi5oPiBpbnN0ZWFkLiIgKi8KKy8qICNlbmRpZiAqLworCisjaWZuZGVmIF9YU0FWRUlOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9YU0FWRUlOVFJJTl9IX0lOQ0xVREVECisKK2V4dGVybiBfX2lubGluZSB2b2lkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK194c2F2ZSAodm9pZCAqX19QLCBsb25nIGxvbmcgX19NKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfeHNhdmUgKF9fUCwgX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX3hyc3RvciAodm9pZCAqX19QLCBsb25nIGxvbmcgX19NKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfeHJzdG9yIChfX1AsIF9fTSk7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCitleHRlcm4gX19pbmxpbmUgdm9pZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfeHNhdmU2NCAodm9pZCAqX19QLCBsb25nIGxvbmcgX19NKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfeHNhdmU2NCAoX19QLCBfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfeHJzdG9yNjQgKHZvaWQgKl9fUCwgbG9uZyBsb25nIF9fTSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3hyc3RvcjY0IChfX1AsIF9fTSk7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9YU0FWRUlOVFJJTl9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS94c2F2ZW9wdGludHJpbi5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUveHNhdmVvcHRpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDczZTM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUveHNhdmVvcHRpbnRyaW4uaApAQCAtMCwwICsxLDQ3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogI2lmICFkZWZpbmVkIF9YODZJTlRSSU5fSF9JTkNMVURFRCAmJiAhZGVmaW5lZCBfSU1NSU5UUklOX0hfSU5DTFVERUQgKi8KKy8qICMgZXJyb3IgIk5ldmVyIHVzZSA8eHNhdmVvcHRpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHg4NmludHJpbi5oPiBpbnN0ZWFkLiIgKi8KKy8qICNlbmRpZiAqLworCisjaWZuZGVmIF9YU0FWRU9QVElOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9YU0FWRU9QVElOVFJJTl9IX0lOQ0xVREVECisKK2V4dGVybiBfX2lubGluZSB2b2lkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK194c2F2ZW9wdCAodm9pZCAqX19QLCBsb25nIGxvbmcgX19NKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfeHNhdmVvcHQgKF9fUCwgX19NKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KK2V4dGVybiBfX2lubGluZSB2b2lkCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK194c2F2ZW9wdDY0ICh2b2lkICpfX1AsIGxvbmcgbG9uZyBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl94c2F2ZW9wdDY0IChfX1AsIF9fTSk7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9YU0FWRU9QVElOVFJJTl9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5jbHVkZS94dGVzdGludHJpbi5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUveHRlc3RpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODJmYjdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luY2x1ZGUveHRlc3RpbnRyaW4uaApAQCAtMCwwICsxLDQ0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfSU1NSU5UUklOX0hfSU5DTFVERUQKKyMgZXJyb3IgIk5ldmVyIHVzZSA8eHRlc3RpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fUlRNX18KKyMgZXJyb3IgIlJUTSBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZW5kaWYgLyogX19SVE1fXyAqLworCisjaWZuZGVmIF9YVEVTVElOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9YVEVTVElOVFJJTl9IX0lOQ0xVREVECisKKy8qIFJldHVybiBub24temVybyBpZiB0aGUgaW5zdHJ1Y3Rpb24gZXhlY3V0ZXMgaW5zaWRlIGFuIFJUTSBvciBITEUgY29kZQorICAgcmVnaW9uLiAgUmV0dXJuIHplcm8gb3RoZXJ3aXNlLiAgICovCitleHRlcm4gX19pbmxpbmUgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK194dGVzdCAodm9pZCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3h0ZXN0ICgpOworfQorCisjZW5kaWYgLyogX1hURVNUSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbnN0YWxsLXRvb2xzL2ZpeGluY19saXN0IGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvZml4aW5jX2xpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyYmMyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbnN0YWxsLXRvb2xzL2ZpeGluY19saXN0CkBAIC0wLDAgKzEgQEAKKzsKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbnN0YWxsLXRvb2xzL2dzeXNsaW1pdHMuaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbnN0YWxsLXRvb2xzL2dzeXNsaW1pdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzYyODAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvZ3N5c2xpbWl0cy5oCkBAIC0wLDAgKzEsOCBAQAorLyogc3lzbGltaXRzLmggc3RhbmRzIGZvciB0aGUgc3lzdGVtJ3Mgb3duIGxpbWl0cy5oIGZpbGUuCisgICBJZiB3ZSBjYW4gdXNlIGl0IG9rIHVubW9kaWZpZWQsIHRoZW4gd2UgaW5zdGFsbCB0aGlzIHRleHQuCisgICBJZiBmaXhpbmNsdWRlcyBmaXhlcyBpdCwgdGhlbiB0aGUgZml4ZWQgdmVyc2lvbiBpcyBpbnN0YWxsZWQKKyAgIGluc3RlYWQgb2YgdGhpcyB0ZXh0LiAgKi8KKworI2RlZmluZSBfR0NDX05FWFRfTElNSVRTX0gJCS8qIHRlbGwgZ2NjJ3MgbGltaXRzLmggdG8gcmVjdXJzZSAqLworI2luY2x1ZGVfbmV4dCA8bGltaXRzLmg+CisjdW5kZWYgX0dDQ19ORVhUX0xJTUlUU19ICmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5zdGFsbC10b29scy9pbmNsdWRlL1JFQURNRSBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbnN0YWxsLXRvb2xzL2luY2x1ZGUvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwODZhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5zdGFsbC10b29scy9pbmNsdWRlL1JFQURNRQpAQCAtMCwwICsxLDE0IEBACitUaGlzIFJFQURNRSBmaWxlIGlzIGNvcGllZCBpbnRvIHRoZSBkaXJlY3RvcnkgZm9yIEdDQy1vbmx5IGhlYWRlciBmaWxlcword2hlbiBmaXhpbmNsdWRlcyBpcyBydW4gYnkgdGhlIG1ha2VmaWxlIGZvciBHQ0MuCisKK01hbnkgb2YgdGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IHdlcmUgYXV0b21hdGljYWxseSBlZGl0ZWQgZnJvbSB0aGUKK3N0YW5kYXJkIHN5c3RlbSBoZWFkZXIgZmlsZXMgYnkgdGhlIGZpeGluY2x1ZGVzIHByb2Nlc3MuICBUaGV5IGFyZQorc3lzdGVtLXNwZWNpZmljLCBhbmQgd2lsbCBub3Qgd29yayBvbiBhbnkgb3RoZXIga2luZCBvZiBzeXN0ZW0uICBUaGV5CithcmUgYWxzbyBub3QgcGFydCBvZiBHQ0MuICBUaGUgcmVhc29uIHdlIGhhdmUgdG8gZG8gdGhpcyBpcyBiZWNhdXNlCitHQ0MgcmVxdWlyZXMgQU5TSSBDIGhlYWRlcnMgYW5kIG1hbnkgdmVuZG9ycyBzdXBwbHkgQU5TSS1pbmNvbXBhdGlibGUKK2hlYWRlcnMuCisKK0JlY2F1c2UgdGhpcyBpcyBhbiBhdXRvbWF0ZWQgcHJvY2Vzcywgc29tZXRpbWVzIGhlYWRlcnMgZ2V0ICJmaXhlZCIKK3RoYXQgZG8gbm90LCBzdHJpY3RseSBzcGVha2luZywgbmVlZCBhIGZpeC4gIEFzIGxvbmcgYXMgbm90aGluZyBpcyBicm9rZW4KK2J5IHRoZSBwcm9jZXNzLCBpdCBpcyBqdXN0IGFuIHVuZm9ydHVuYXRlIGNvbGxhdGVyYWwgaW5jb252ZW5pZW5jZS4KK1dlIHdvdWxkIGxpa2UgdG8gcmVjdGlmeSBpdCwgaWYgaXQgaXMgbm90ICJ0b28gaW5jb252ZW5pZW50Ii4KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbnN0YWxsLXRvb2xzL2luY2x1ZGUvbGltaXRzLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5zdGFsbC10b29scy9pbmNsdWRlL2xpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NDBhODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5zdGFsbC10b29scy9pbmNsdWRlL2xpbWl0cy5oCkBAIC0wLDAgKzEsMTcxIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogVGhpcyBhZG1pbmlzdHJpdmlhIGdldHMgYWRkZWQgdG8gdGhlIGJlZ2lubmluZyBvZiBsaW1pdHMuaAorICAgaWYgdGhlIHN5c3RlbSBoYXMgaXRzIG93biB2ZXJzaW9uIG9mIGxpbWl0cy5oLiAgKi8KKworLyogV2UgdXNlIF9HQ0NfTElNSVRTX0hfIGJlY2F1c2Ugd2Ugd2FudCB0aGlzIG5vdCB0byBtYXRjaAorICAgYW55IG1hY3JvcyB0aGF0IHRoZSBzeXN0ZW0ncyBsaW1pdHMuaCB1c2VzIGZvciBpdHMgb3duIHB1cnBvc2VzLiAgKi8KKyNpZm5kZWYgX0dDQ19MSU1JVFNfSF8gIC8qIFRlcm1pbmF0ZWQgaW4gbGltaXR5LmguICAqLworI2RlZmluZSBfR0NDX0xJTUlUU19IXworCisjaWZuZGVmIF9MSUJDX0xJTUlUU19IXworLyogVXNlICIuLi4iIHNvIHRoYXQgd2UgZmluZCBzeXNsaW1pdHMuaCBvbmx5IGluIHRoaXMgc2FtZSBkaXJlY3RvcnkuICAqLworI2luY2x1ZGUgInN5c2xpbWl0cy5oIgorI2VuZGlmCisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfTElNSVRTX0hfX18KKyNkZWZpbmUgX0xJTUlUU19IX19fCisKKy8qIE51bWJlciBvZiBiaXRzIGluIGEgYGNoYXInLiAgKi8KKyN1bmRlZiBDSEFSX0JJVAorI2RlZmluZSBDSEFSX0JJVCBfX0NIQVJfQklUX18KKworLyogTWF4aW11bSBsZW5ndGggb2YgYSBtdWx0aWJ5dGUgY2hhcmFjdGVyLiAgKi8KKyNpZm5kZWYgTUJfTEVOX01BWAorI2RlZmluZSBNQl9MRU5fTUFYIDEKKyNlbmRpZgorCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhIGBzaWduZWQgY2hhcicgY2FuIGhvbGQuICAqLworI3VuZGVmIFNDSEFSX01JTgorI2RlZmluZSBTQ0hBUl9NSU4gKC1TQ0hBUl9NQVggLSAxKQorI3VuZGVmIFNDSEFSX01BWAorI2RlZmluZSBTQ0hBUl9NQVggX19TQ0hBUl9NQVhfXworCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBjaGFyJyBjYW4gaG9sZC4gIChNaW5pbXVtIGlzIDApLiAgKi8KKyN1bmRlZiBVQ0hBUl9NQVgKKyNpZiBfX1NDSEFSX01BWF9fID09IF9fSU5UX01BWF9fCisjIGRlZmluZSBVQ0hBUl9NQVggKFNDSEFSX01BWCAqIDJVICsgMVUpCisjZWxzZQorIyBkZWZpbmUgVUNIQVJfTUFYIChTQ0hBUl9NQVggKiAyICsgMSkKKyNlbmRpZgorCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhIGBjaGFyJyBjYW4gaG9sZC4gICovCisjaWZkZWYgX19DSEFSX1VOU0lHTkVEX18KKyMgdW5kZWYgQ0hBUl9NSU4KKyMgaWYgX19TQ0hBUl9NQVhfXyA9PSBfX0lOVF9NQVhfXworIyAgZGVmaW5lIENIQVJfTUlOIDBVCisjIGVsc2UKKyMgIGRlZmluZSBDSEFSX01JTiAwCisjIGVuZGlmCisjIHVuZGVmIENIQVJfTUFYCisjIGRlZmluZSBDSEFSX01BWCBVQ0hBUl9NQVgKKyNlbHNlCisjIHVuZGVmIENIQVJfTUlOCisjIGRlZmluZSBDSEFSX01JTiBTQ0hBUl9NSU4KKyMgdW5kZWYgQ0hBUl9NQVgKKyMgZGVmaW5lIENIQVJfTUFYIFNDSEFSX01BWAorI2VuZGlmCisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBzaG9ydCBpbnQnIGNhbiBob2xkLiAgKi8KKyN1bmRlZiBTSFJUX01JTgorI2RlZmluZSBTSFJUX01JTiAoLVNIUlRfTUFYIC0gMSkKKyN1bmRlZiBTSFJUX01BWAorI2RlZmluZSBTSFJUX01BWCBfX1NIUlRfTUFYX18KKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgc2hvcnQgaW50JyBjYW4gaG9sZC4gIChNaW5pbXVtIGlzIDApLiAgKi8KKyN1bmRlZiBVU0hSVF9NQVgKKyNpZiBfX1NIUlRfTUFYX18gPT0gX19JTlRfTUFYX18KKyMgZGVmaW5lIFVTSFJUX01BWCAoU0hSVF9NQVggKiAyVSArIDFVKQorI2Vsc2UKKyMgZGVmaW5lIFVTSFJUX01BWCAoU0hSVF9NQVggKiAyICsgMSkKKyNlbmRpZgorCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhIGBzaWduZWQgaW50JyBjYW4gaG9sZC4gICovCisjdW5kZWYgSU5UX01JTgorI2RlZmluZSBJTlRfTUlOICgtSU5UX01BWCAtIDEpCisjdW5kZWYgSU5UX01BWAorI2RlZmluZSBJTlRfTUFYIF9fSU5UX01BWF9fCisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIGludCcgY2FuIGhvbGQuICAoTWluaW11bSBpcyAwKS4gICovCisjdW5kZWYgVUlOVF9NQVgKKyNkZWZpbmUgVUlOVF9NQVggKElOVF9NQVggKiAyVSArIDFVKQorCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhIGBzaWduZWQgbG9uZyBpbnQnIGNhbiBob2xkLgorICAgKFNhbWUgYXMgYGludCcpLiAgKi8KKyN1bmRlZiBMT05HX01JTgorI2RlZmluZSBMT05HX01JTiAoLUxPTkdfTUFYIC0gMUwpCisjdW5kZWYgTE9OR19NQVgKKyNkZWZpbmUgTE9OR19NQVggX19MT05HX01BWF9fCisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIGxvbmcgaW50JyBjYW4gaG9sZC4gIChNaW5pbXVtIGlzIDApLiAgKi8KKyN1bmRlZiBVTE9OR19NQVgKKyNkZWZpbmUgVUxPTkdfTUFYIChMT05HX01BWCAqIDJVTCArIDFVTCkKKworI2lmIGRlZmluZWQgKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGxvbmcgbG9uZyBpbnQnIGNhbiBob2xkLiAgKi8KKyMgdW5kZWYgTExPTkdfTUlOCisjIGRlZmluZSBMTE9OR19NSU4gKC1MTE9OR19NQVggLSAxTEwpCisjIHVuZGVmIExMT05HX01BWAorIyBkZWZpbmUgTExPTkdfTUFYIF9fTE9OR19MT05HX01BWF9fCisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQnIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMCkuICAqLworIyB1bmRlZiBVTExPTkdfTUFYCisjIGRlZmluZSBVTExPTkdfTUFYIChMTE9OR19NQVggKiAyVUxMICsgMVVMTCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTlVfTElCUkFSWV9fKSA/IGRlZmluZWQgKF9fVVNFX0dOVSkgOiAhZGVmaW5lZCAoX19TVFJJQ1RfQU5TSV9fKQorLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGxvbmcgbG9uZyBpbnQnIGNhbiBob2xkLiAgKi8KKyMgdW5kZWYgTE9OR19MT05HX01JTgorIyBkZWZpbmUgTE9OR19MT05HX01JTiAoLUxPTkdfTE9OR19NQVggLSAxTEwpCisjIHVuZGVmIExPTkdfTE9OR19NQVgKKyMgZGVmaW5lIExPTkdfTE9OR19NQVggX19MT05HX0xPTkdfTUFYX18KKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgbG9uZyBsb25nIGludCcgY2FuIGhvbGQuICAoTWluaW11bSBpcyAwKS4gICovCisjIHVuZGVmIFVMT05HX0xPTkdfTUFYCisjIGRlZmluZSBVTE9OR19MT05HX01BWCAoTE9OR19MT05HX01BWCAqIDJVTEwgKyAxVUxMKQorI2VuZGlmCisKKyNlbmRpZiAvKiBfTElNSVRTX0hfX18gKi8KKy8qIFRoaXMgYWRtaW5pc3RyaXZpYSBnZXRzIGFkZGVkIHRvIHRoZSBlbmQgb2YgbGltaXRzLmgKKyAgIGlmIHRoZSBzeXN0ZW0gaGFzIGl0cyBvd24gdmVyc2lvbiBvZiBsaW1pdHMuaC4gICovCisKKyNlbHNlIC8qIG5vdCBfR0NDX0xJTUlUU19IXyAqLworCisjaWZkZWYgX0dDQ19ORVhUX0xJTUlUU19ICisjaW5jbHVkZV9uZXh0IDxsaW1pdHMuaD4JCS8qIHJlY3Vyc2UgZG93biB0byB0aGUgcmVhbCBvbmUgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogbm90IF9HQ0NfTElNSVRTX0hfICovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5zdGFsbC10b29scy9tYWNyb19saXN0IGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvbWFjcm9fbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvbWFjcm9fbGlzdApkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvbWtoZWFkZXJzLmNvbmYgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5zdGFsbC10b29scy9ta2hlYWRlcnMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjZiMWVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvbWtoZWFkZXJzLmNvbmYKQEAgLTAsMCArMSwzIEBACitTWVNURU1fSEVBREVSX0RJUj0iL3Vzci9sb2NhbC9nb29nbGUvaG9tZS9jaGgvd29ya2Rpci9wcmVjaXNlNy8xL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3N5c3Jvb3Qke3N5c3Jvb3RfaGVhZGVyc19zdWZmaXh9L3Vzci9pbmNsdWRlIgorT1RIRVJfRklYSU5DTFVERVNfRElSUz0iIgorU1RNUF9GSVhJTkM9InN0bXAtZml4aW5jIgpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2xpYmdjYy5hIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2xpYmdjYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZGNiZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvbGliZ2NjLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2xpYmdjY19laC5hIGIvbGliL2djYy94ODZfNjQtbGludXgvNC44L2xpYmdjY19laC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YmU1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjgvbGliZ2NjX2VoLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC44L2xpYmdjb3YuYSBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9saWJnY292LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0ZDA4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuOC9saWJnY292LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2xpYmNsb29nLWlzbC5hIGIvbGliL2xpYmNsb29nLWlzbC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNzI2NWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbGliY2xvb2ctaXNsLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2xpYmdtcC5hIGIvbGliL2xpYmdtcC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZGMyZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbGliZ21wLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2xpYmlzbC5hIGIvbGliL2xpYmlzbC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOGU5ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbGliaXNsLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2xpYm1wYy5hIGIvbGliL2xpYm1wYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YTczNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbGlibXBjLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2xpYm1wZnIuYSBiL2xpYi9saWJtcGZyLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJlY2VmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9saWJtcGZyLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3BrZ2NvbmZpZy9jbG9vZy1pc2wucGMgYi9saWIvcGtnY29uZmlnL2Nsb29nLWlzbC5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDNiYjUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BrZ2NvbmZpZy9jbG9vZy1pc2wucGMKQEAgLTAsMCArMSwxOCBAQAorIyBnZW5lcmF0ZWQgYnkgY29uZmlndXJlIC8gcmVtb3ZlIHRoaXMgbGluZSB0byBkaXNhYmxlIHJlZ2VuZXJhdGlvbgorcHJlZml4PS91c3IvbG9jYWwvZ29vZ2xlL2hvbWUvY2hoL3dvcmtkaXIvcHJlY2lzZTcvMS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOAorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitiaW5kaXI9JHtleGVjX3ByZWZpeH0vYmluCitsaWJkaXI9JHtleGVjX3ByZWZpeH0vbGliCitkYXRhcm9vdGRpcj0ke3ByZWZpeH0vc2hhcmUKK2RhdGFkaXI9JHtkYXRhcm9vdGRpcn0KK3N5c2NvbmZkaXI9JHtwcmVmaXh9L2V0YworaW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorcGFja2FnZT1jbG9vZy1pc2wKK3N1ZmZpeD0KKworTmFtZTogY2xvb2ctaXNsCitEZXNjcmlwdGlvbjogY2xvb2ctaXNsIExpYnJhcnkKK1ZlcnNpb246IDAuMTguMAorUmVxdWlyZXM6IAorTGliczogLUwke2xpYmRpcn0gLUwvdXNyL2xvY2FsL2dvb2dsZS9ob21lL2NoaC93b3JrZGlyL3ByZWNpc2U3LzEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgvbGliIC1sY2xvb2ctaXNsIC1sZ21wCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfSAtSS91c3IvbG9jYWwvZ29vZ2xlL2hvbWUvY2hoL3dvcmtkaXIvcHJlY2lzZTcvMS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9pbmNsdWRlIC1EQ0xPT0dfSU5UX0dNUD0xCmRpZmYgLS1naXQgYS9saWIvcGtnY29uZmlnL2lzbC5wYyBiL2xpYi9wa2djb25maWcvaXNsLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlN2ZmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGtnY29uZmlnL2lzbC5wYwpAQCAtMCwwICsxLDE4IEBACisjIGdlbmVyYXRlZCBieSBjb25maWd1cmUgLyByZW1vdmUgdGhpcyBsaW5lIHRvIGRpc2FibGUgcmVnZW5lcmF0aW9uCitwcmVmaXg9L3Vzci9sb2NhbC9nb29nbGUvaG9tZS9jaGgvd29ya2Rpci9wcmVjaXNlNy8xL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44CitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2JpbmRpcj0ke2V4ZWNfcHJlZml4fS9iaW4KK2xpYmRpcj0ke2V4ZWNfcHJlZml4fS9saWIKK2RhdGFyb290ZGlyPSR7cHJlZml4fS9zaGFyZQorZGF0YWRpcj0ke2RhdGFyb290ZGlyfQorc3lzY29uZmRpcj0ke3ByZWZpeH0vZXRjCitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCitwYWNrYWdlPWlzbAorc3VmZml4PQorCitOYW1lOiBpc2wKK0Rlc2NyaXB0aW9uOiBpc2wgTGlicmFyeQorVmVyc2lvbjogMC4xMS4xCitSZXF1aXJlczogCitMaWJzOiAtTCR7bGliZGlyfSAtTC91c3IvbG9jYWwvZ29vZ2xlL2hvbWUvY2hoL3dvcmtkaXIvcHJlY2lzZTcvMS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9saWIgLWxpc2wgLWxnbXAKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9IC1JL3Vzci9sb2NhbC9nb29nbGUvaG9tZS9jaGgvd29ya2Rpci9wcmVjaXNlNy8xL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L2luY2x1ZGUKZGlmZiAtLWdpdCBhL2xpYjY0L2xpYmliZXJ0eS5hIGIvbGliNjQvbGliaWJlcnR5LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlYTMzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYjY0L2xpYmliZXJ0eS5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvY2MxIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9jYzEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2EwYzY4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvY2MxCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvY2MxcGx1cyBiL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvY2MxcGx1cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZjdlZTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9jYzFwbHVzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvY29sbGVjdDIgYi9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2NvbGxlY3QyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIyZGU1NTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2NvbGxlY3QyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5zdGFsbC10b29scy9maXhpbmMuc2ggYi9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvZml4aW5jLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY3YjhkOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvZml4aW5jLnNoCkBAIC0wLDAgKzEsNTE0IEBACisjIS9iaW4vc2gKKyMKKyMgSW5zdGFsbCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBjZXJ0YWluIEFOU0ktaW5jb21wYXRpYmxlIHN5c3RlbSBoZWFkZXIKKyMgZmlsZXMgd2hpY2ggYXJlIGZpeGVkIHRvIHdvcmsgY29ycmVjdGx5IHdpdGggQU5TSSBDIGFuZCBwbGFjZWQgaW4gYQorIyBkaXJlY3RvcnkgdGhhdCBHQ0Mgd2lsbCBzZWFyY2guCisjCisjIFNlZSBSRUFETUUtZml4aW5jIGZvciBtb3JlIGluZm9ybWF0aW9uLgorIworIyAgZml4aW5jbHVkZXMgY29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDA5CisjICBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIGZpeGluY2x1ZGVzIGlzIGZyZWUgc29mdHdhcmUuCisjIAorIyBZb3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgZml4aW5jbHVkZXMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorIyBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIGZpeGluY2x1ZGVzOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCisjIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyMKKyMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjCisKKyMgVXNhZ2U6IGZpeGluYy5zaCBvdXRwdXQtZGlyIGlucHV0LWRpcgorIworIyBEaXJlY3RvcnkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHJlc3VsdHMuCisjIEZhaWwgaWYgbm8gYXJnIHRvIHNwZWNpZnkgYSBkaXJlY3RvcnkgZm9yIHRoZSBvdXRwdXQuCitpZiBbICJ4JDEiID0gIngiIF0KK3RoZW4KKyAgZWNobyBmaXhpbmNsdWRlczogbm8gb3V0cHV0IGRpcmVjdG9yeSBzcGVjaWZpZWQKKyAgZXhpdCAxCitmaQorCitMSUI9JHsxfQorc2hpZnQKKworIyBNYWtlIHN1cmUgaXQgZXhpc3RzLgoraWYgWyAhIC1kICRMSUIgXTsgdGhlbgorICBta2RpciAkTElCIHx8IHsKKyAgICBlY2hvIGZpeGluY2x1ZGVzOiAgb3V0cHV0IGRpciAnYCckTElCIicgY2Fubm90IGJlIGNyZWF0ZWQiCisgICAgZXhpdCAxCisgIH0KK2Vsc2UKKyAgKCBjZCAkTElCICYmIHRvdWNoIERPTkUgJiYgcm0gRE9ORSApIHx8IHsKKyAgICBlY2hvIGZpeGluY2x1ZGVzOiAgb3V0cHV0IGRpciAnYCckTElCIicgaXMgYW4gaW52YWxpZCBkaXJlY3RvcnkiCisgICAgZXhpdCAxCisgIH0KK2ZpCisKK2lmIHRlc3QgLXogIiRWRVJCT1NFIgordGhlbgorICBWRVJCT1NFPTIKKyAgZXhwb3J0IFZFUkJPU0UKK2Vsc2UKKyAgY2FzZSAiJFZFUkJPU0UiIGluCisgIFswLTldICkgOiA7OworICAqICkgIFZFUkJPU0U9MyA7OworICBlc2FjCitmaQorCisjIERlZmluZSB3aGF0IHRhcmdldCBzeXN0ZW0gd2UncmUgZml4aW5nLgorIworaWYgdGVzdCAtciAuL01ha2VmaWxlOyB0aGVuCisgIHRhcmdldF9jYW5vbmljYWw9ImBzZWQgLW4gLWUgJ3MsXnRhcmdldFsgCV0qPVsgCV0qXCguKlwpJCxcMSxwJyA8IE1ha2VmaWxlYCIKK2ZpCisKKyMgSWYgbm90IGZyb20gdGhlIE1ha2VmaWxlLCB0aGVuIHRyeSBjb25maWcuZ3Vlc3MKKyMKK2lmIHRlc3QgLXogIiR7dGFyZ2V0X2Nhbm9uaWNhbH0iIDsgdGhlbgorICBpZiB0ZXN0IC14IC4vY29uZmlnLmd1ZXNzIDsgdGhlbgorICAgIHRhcmdldF9jYW5vbmljYWw9ImBjb25maWcuZ3Vlc3NgIiA7IGZpCisgIHRlc3QgLXogIiR7dGFyZ2V0X2Nhbm9uaWNhbH0iICYmIHRhcmdldF9jYW5vbmljYWw9dW5rbm93bgorZmkKK2V4cG9ydCB0YXJnZXRfY2Fub25pY2FsCisKKyMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjCisjCisjIERlZmluZSBQV0RDTUQgYXMgYSBjb21tYW5kIHRvIHVzZSB0byBnZXQgdGhlIHdvcmtpbmcgZGlyCisjIGluIHRoZSBmb3JtIHRoYXQgd2Ugd2FudC4KK1BXRENNRD0ke1BXRENNRC1wd2R9CisKK2Nhc2UgImAkUFdEQ01EYCIgaW4KKy8vKikKKyAgICAjIE9uIGFuIEFwb2xsbywgZGlzY2FyZCBldmVyeXRoaW5nIGJlZm9yZSBgL3VzcicuCisgICAgUFdEQ01EPSJldmFsIHB3ZCB8IHNlZCAtZSAncywuKi91c3IvLC91c3IvLCciCisgICAgOzsKK2VzYWMKKworIyBPcmlnaW5hbCBkaXJlY3RvcnkuCitPUklHRElSPWAke1BXRENNRH1gCitleHBvcnQgT1JJR0RJUgorRklYSU5DTD1gJHtQV0RDTUR9YC9maXhpbmNsCitpZiBbICEgLXggJEZJWElOQ0wgXSA7IHRoZW4KKyAgZWNobyAiQ2Fubm90IGZpbmQgZml4aW5jbCIgPiYyCisgIGV4aXQgMQorZmkKK2V4cG9ydCBGSVhJTkNMCisKKyMgTWFrZSBMSUIgYWJzb2x1dGUgb25seSBpZiBuZWVkZWQgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCB0aGUgYW1kLgorY2FzZSAkTElCIGluCisvKikKKyAgICA7OworKikKKyAgICBjZCAkTElCOyBMSUI9YCR7UFdEQ01EfWAKKyAgICA7OworZXNhYworCitpZiB0ZXN0ICRWRVJCT1NFIC1ndCAwCit0aGVuIGVjaG8gRml4aW5nIGhlYWRlcnMgaW50byAke0xJQn0gZm9yICR7dGFyZ2V0X2Nhbm9uaWNhbH0gdGFyZ2V0IDsgZmkKKworIyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHN5c3RlbSBoYXMgc3ltYm9saWMgbGlua3MuCitpZiB0ZXN0IC1uICIkREpESVIiOyB0aGVuCisgIExJTktTPWZhbHNlCitlbGlmIGxuIC1zIFggJExJQi9TaG91bGROb3RFeGlzdCAyPi9kZXYvbnVsbDsgdGhlbgorICBybSAtZiAkTElCL1Nob3VsZE5vdEV4aXN0CisgIExJTktTPXRydWUKK2VsaWYgbG4gLXMgWCAvdG1wL1Nob3VsZE5vdEV4aXN0IDI+L2Rldi9udWxsOyB0aGVuCisgIHJtIC1mIC90bXAvU2hvdWxkTm90RXhpc3QKKyAgTElOS1M9dHJ1ZQorZWxzZQorICBMSU5LUz1mYWxzZQorZmkKKworIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMKKyMKKyMgIENoZWNrIHRvIHNlZSBpZiB0aGUgbWFjaGluZV9uYW1lIGZpeCBuZWVkcyB0byBiZSBkaXNhYmxlZC4KKyMKKyMgIE9uIHNvbWUgcGxhdGZvcm1zLCBtYWNoaW5lX25hbWUgZG9lc24ndCB3b3JrIHByb3Blcmx5IGFuZAorIyAgYnJlYWtzIHNvbWUgb2YgdGhlIGhlYWRlciBmaWxlcy4gIFNpbmNlIGV2ZXJ5dGhpbmcgd29ya3MKKyMgIHByb3Blcmx5IHdpdGhvdXQgaXQsIGp1c3Qgd2lwZSB0aGUgbWFjcm8gbGlzdCB0bworIyAgZGlzYWJsZSB0aGUgZml4LgorCitjYXNlICIke3RhcmdldF9jYW5vbmljYWx9IiBpbgorICAgICotKi12eHdvcmtzKikKKwl0ZXN0IC1mICR7TUFDUk9fTElTVH0gJiYgIGVjaG8gPiAke01BQ1JPX0xJU1R9CisgICAgICAgIDs7Citlc2FjCisKKworIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMKKyMKKyMgIEluIHRoZSBmaWxlIG1hY3JvX2xpc3QgYXJlIGxpc3RlZCBhbGwgdGhlIHByZWRlZmluZWQKKyMgIG1hY3JvcyB0aGF0IGFyZSBub3QgaW4gdGhlIEM4OSByZXNlcnZlZCBuYW1lc3BhY2UgKHRoZSByZXNlcnZlZAorIyAgbmFtZXNwYWNlIGlzIGFsbCBpZGVudGlmaWVycyBiZWdpbm5uaW5nIHdpdGggdHdvIHVuZGVyc2NvcmVzIG9yIG9uZQorIyAgdW5kZXJzY29yZSBmb2xsb3dlZCBieSBhIGNhcGl0YWwgbGV0dGVyKS4gIEEgcmVndWxhciBleHByZXNzaW9uIHRvIGZpbmQKKyMgIGFueSBvZiB0aG9zZSBtYWNyb3MgaW4gYSBoZWFkZXIgZmlsZSBpcyB3cml0dGVuIHRvIE1OX05BTUVfUEFULgorIworIyAgTm90ZSBkZXBlbmRlbmN5IG9uIEFTQ0lJLiBcMDEyID0gbmV3bGluZS4KKyMgIHRyICcgJyAnXG4nIGlzLCBhbGFzLCBub3QgcG9ydGFibGUuCisKK2lmIHRlc3QgLXMgJHtNQUNST19MSVNUfQordGhlbgorICBpZiB0ZXN0ICRWRVJCT1NFIC1ndCAwOyB0aGVuCisgICAgZWNobyAiRm9yYmlkZGVuIGlkZW50aWZpZXJzOiBgdHIgJ1wwMTInICcgJyA8ICR7TUFDUk9fTElTVH1gIgorICBmaQorICBNTl9OQU1FX1BBVD0iYHNlZCAncy9eL1xcXFw8Lzsgcy8kL1xcXFw+LzsgJCFzLyQvfC8nIFwKKyAgICAgIDwgJHtNQUNST19MSVNUfSB8IHRyIC1kICdcMDEyJ2AiCisgIGV4cG9ydCBNTl9OQU1FX1BBVAorZWxzZQorICBpZiB0ZXN0ICRWRVJCT1NFIC1ndCAwCisgIHRoZW4gZWNobyAiTm8gZm9yYmlkZGVuIGlkZW50aWZpZXJzIGRlZmluZWQgYnkgdGhpcyB0YXJnZXQiIDsgZmkKK2ZpCisKKyMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjCisjCisjICBTZWFyY2ggZWFjaCBpbnB1dCBkaXJlY3RvcnkgZm9yIGJyb2tlbiBoZWFkZXIgZmlsZXMuCisjICBUaGlzIGxvb3AgZW5kcyBuZWFyIHRoZSBlbmQgb2YgdGhlIGZpbGUuCisjCitpZiB0ZXN0ICQjIC1lcSAwCit0aGVuCisgICAgSU5QVVRMSVNUPSIvdXNyL2luY2x1ZGUiCitlbHNlCisgICAgSU5QVVRMSVNUPSIkQCIKK2ZpCisKK2ZvciBJTlBVVCBpbiAke0lOUFVUTElTVH0gOyBkbworCitjZCAke09SSUdESVJ9CisKKyMgIE1ha2Ugc3VyZSBhIGRpcmVjdG9yeSBleGlzdHMgYmVmb3JlIGNoYW5naW5nIGludG8gaXQsCisjICBvdGhlcndpc2UgU29sYXJpczIgd2lsbCBmYWlsLWV4aXQgdGhlIHNjcmlwdC4KKyMKK2lmIFsgISAtZCAke0lOUFVUfSBdOyB0aGVuCisgIGNvbnRpbnVlCitmaQorY2QgJHtJTlBVVH0KKworSU5QVVQ9YCR7UFdEQ01EfWAKK2V4cG9ydCBJTlBVVAorCisjCisjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIworIworaWYgdGVzdCAkVkVSQk9TRSAtZ3QgMQordGhlbiBlY2hvIEZpbmRpbmcgZGlyZWN0b3JpZXMgYW5kIGxpbmtzIHRvIGRpcmVjdG9yaWVzIDsgZmkKKworIyBGaW5kIGFsbCBkaXJlY3RvcmllcyBhbmQgYWxsIHN5bWxpbmtzIHRoYXQgcG9pbnQgdG8gZGlyZWN0b3JpZXMuCisjIFB1dCB0aGUgbGlzdCBpbiAkYWxsX2RpcnMuCisjIEVhY2ggdGltZSB3ZSBmaW5kIGEgc3ltbGluaywgYWRkIGl0IHRvIG5ld2RpcnMKKyMgc28gdGhhdCB3ZSBkbyBhbm90aGVyIGZpbmQgd2l0aGluIHRoZSBkaXIgdGhlIGxpbmsgcG9pbnRzIHRvLgorIyBOb3RlIHRoYXQgJGFsbF9kaXJzIG1heSBoYXZlIGR1cGxpY2F0ZXMgaW4gaXQ7CisjIGxhdGVyIHBhcnRzIG9mIHRoaXMgZmlsZSBhcmUgc3VwcG9zZWQgdG8gaWdub3JlIHRoZW0uCitkaXJzPSIuIgorbGV2ZWxzPTIKK2FsbF9kaXJzPSIiCitzZWFyY2hfZGlycz0iIgorCit3aGlsZSBbIC1uICIkZGlycyIgXSAmJiBbICRsZXZlbHMgLWd0IDAgXQorZG8KKyAgbGV2ZWxzPWBleHByICRsZXZlbHMgLSAxYAorICBuZXdkaXJzPQorICBmb3IgZCBpbiAkZGlycworICBkbworICAgIGlmIHRlc3QgJFZFUkJPU0UgLWd0IDEKKyAgICB0aGVuIGVjaG8gIiBTZWFyY2hpbmcgJElOUFVULyRkIiA7IGZpCisKKyAgICAjIEZpbmQgYWxsIGRpcmVjdG9yaWVzIHVuZGVyICRkLCByZWxhdGl2ZSB0byAkZCwgZXhjbHVkaW5nICRkIGl0c2VsZi4KKyAgICAjIChUaGUgLy4gaXMgbmVlZGVkIGFmdGVyICRkIGluIGNhc2UgJGQgaXMgYSBzeW1saW5rLikKKyAgICBhbGxfZGlycz0iJGFsbF9kaXJzIGBmaW5kICRkLy4gLXR5cGUgZCAtcHJpbnQgfCBcCisgICAgICAgICAgICAgICBzZWQgLWUgJy9cL1wuJC9kJyAtZSAnc0AvLi9AL0BnJ2AiCisgICAgIyBGaW5kIGFsbCBsaW5rcyB0byBkaXJlY3Rvcmllcy4KKyAgICAjIFVzaW5nIGAtZXhlYyB0ZXN0IC1kJyBpbiBmaW5kIGZhaWxzIG9uIHNvbWUgc3lzdGVtcywKKyAgICAjIGFuZCB0cnlpbmcgdG8gcnVuIHRlc3QgdmlhIHNoIGZhaWxzIG9uIG90aGVycywKKyAgICAjIHNvIHRoaXMgaXMgdGhlIHNpbXBsZXN0IGFsdGVybmF0aXZlIGxlZnQuCisgICAgIyBGaXJzdCBmaW5kIGFsbCB0aGUgbGlua3MsIHRoZW4gdGVzdCBlYWNoIG9uZS4KKyAgICB0aGVzZWxpbmtzPQorICAgICRMSU5LUyAmJiBcCisgICAgICB0aGVzZWxpbmtzPWBmaW5kICRkLy4gLXR5cGUgbCAtcHJpbnQgfCBzZWQgLWUgJ3NALy4vQC9AZydgCisgICAgZm9yIGQxIGluICR0aGVzZWxpbmtzIC0tZHVtbXktLQorICAgIGRvCisgICAgICAjIElmIHRoZSBsaW5rIHBvaW50cyB0byBhIGRpcmVjdG9yeSwKKyAgICAgICMgYWRkIHRoYXQgZGlyIHRvICRuZXdkaXJzCisgICAgICBpZiBbIC1kICRkMSBdCisgICAgICB0aGVuCisgICAgICAgIGFsbF9kaXJzPSIkYWxsX2RpcnMgJGQxIgorICAgICAgICBpZiBbICJgbHMgLWxkICRkMSB8IHNlZCAtbiAncy8uKi0+IC8vcCdgIiAhPSAiLiIgXQorICAgICAgICB0aGVuCisgICAgICAgICAgbmV3ZGlycz0iJG5ld2RpcnMgJGQxIgorICAgICAgICAgIHNlYXJjaF9kaXJzPSIkc2VhcmNoX2RpcnMgJGQxIgorICAgICAgICBmaQorICAgICAgZmkKKyAgICBkb25lCisgIGRvbmUKKworICBkaXJzPSIkbmV3ZGlycyIKK2RvbmUKKworIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMKKyMKK2RpcnM9CitpZiB0ZXN0ICRWRVJCT1NFIC1ndCAyCit0aGVuIGVjaG8gIkFsbCBkaXJlY3RvcmllcyAoaW5jbHVkaW5nIGxpbmtzIHRvIGRpcmVjdG9yaWVzKToiCisgICAgIGVjaG8gJGFsbF9kaXJzCitmaQorCitmb3IgZmlsZSBpbiAkYWxsX2RpcnM7IGRvCisgIHJtIC1yZiAkTElCLyRmaWxlCisgIGlmIFsgISAtZCAkTElCLyRmaWxlIF0KKyAgdGhlbiBta2RpciAkTElCLyRmaWxlCisgIGZpCitkb25lCitta2RpciAkTElCL3Jvb3QKKworIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMKKyMKKyMgdHJlZXRvcHMgZ2V0cyBhbiBhbHRlcm5hdGluZyBsaXN0CisjIG9mIG9sZCBkaXJlY3RvcmllcyB0byBjb3B5CisjIGFuZCB0aGUgbmV3IGRpcmVjdG9yaWVzIHRvIGNvcHkgdG8uCit0cmVldG9wcz0iLiAke0xJQn0iCisKK2lmICRMSU5LUzsgdGhlbgorICBpZiB0ZXN0ICRWRVJCT1NFIC1ndCAxCisgIHRoZW4gZWNobyAnTWFraW5nIHN5bWJvbGljIGRpcmVjdG9yeSBsaW5rcycgOyBmaQorICBjd2Q9YCR7UFdEQ01EfWAKKworICBmb3Igc3ltX2xpbmsgaW4gJHNlYXJjaF9kaXJzOyBkbworICAgIGNkICR7SU5QVVR9CisgICAgZGVzdD1gbHMgLWxkICR7c3ltX2xpbmt9IHwgc2VkIC1uICdzLy4qLT4gLy9wJ2AKKworICAgICMgSW4gY2FzZSAkZGVzdCBpcyByZWxhdGl2ZSwgZ2V0IHRvICR7c3ltX2xpbmt9J3MgZGlyIGZpcnN0LgorICAgICMKKyAgICBjZCAuL2BlY2hvICR7c3ltX2xpbmt9IHwgc2VkICdzOy9bXi9dKiQ7OydgCisKKyAgICAjIENoZWNrIHRoYXQgdGhlIHRhcmdldCBkaXJlY3RvcnkgZXhpc3RzLgorICAgICMgUmVkaXJlY3Rpb25zIGNoYW5nZWQgdG8gYXZvaWQgYnVnIGluIHNoIG9uIFVsdHJpeC4KKyAgICAjCisgICAgKGNkICRkZXN0KSA+IC9kZXYvbnVsbCAyPiYxCisgICAgaWYgWyAkPyA9IDAgXTsgdGhlbgorICAgICAgY2QgJGRlc3QKKworICAgICAgIyBmdWxsX2Rlc3RfZGlyIGdldHMgdGhlIGRpciB0aGF0IHRoZSBsaW5rIGFjdHVhbGx5IGxlYWRzIHRvLgorICAgICAgIworICAgICAgZnVsbF9kZXN0X2Rpcj1gJHtQV0RDTUR9YAorCisgICAgICAjIENhbm9uaWNhbGl6ZSAke0lOUFVUfSBub3cgdG8gbWluaW1pemUgdGhlIHRpbWUgYW4KKyAgICAgICMgYXV0b21vdW50ZXIgaGFzIHRvIGNoYW5nZSB0aGUgcmVzdWx0IG9mICR7UFdEQ01EfS4KKyAgICAgICMKKyAgICAgIGNpbnB1dD1gY2QgJHtJTlBVVH07ICR7UFdEQ01EfWAKKworICAgICAgIyBJZiBhIGxpbmsgcG9pbnRzIHRvIC4sIG1ha2UgYSBzaW1pbGFyIGxpbmsgdG8gLgorICAgICAgIworICAgICAgaWYgWyAke2Z1bGxfZGVzdF9kaXJ9ID0gJHtjaW5wdXR9IF07IHRoZW4KKyAgICAgICAgaWYgdGVzdCAkVkVSQk9TRSAtZ3QgMgorICAgICAgICB0aGVuIGVjaG8gJHtzeW1fbGlua30gJy0+JyAuICc6IE1ha2luZyBzZWxmIGxpbmsnIDsgZmkKKyAgICAgICAgcm0gLWZyICR7TElCfS8ke3N5bV9saW5rfSA+IC9kZXYvbnVsbCAyPiYxCisgICAgICAgIGxuIC1zIC4gJHtMSUJ9LyR7c3ltX2xpbmt9ID4gL2Rldi9udWxsIDI+JjEKKworICAgICAgIyBJZiBsaW5rIGxlYWRzIGJhY2sgaW50byAke0lOUFVUfSwKKyAgICAgICMgbWFrZSBhIHNpbWlsYXIgbGluayBoZXJlLgorICAgICAgIworICAgICAgZWxpZiBleHByICR7ZnVsbF9kZXN0X2Rpcn0gOiAiJHtjaW5wdXR9Ly4qIiA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICAjIFkgZ2V0cyB0aGUgYWN0dWFsIHRhcmdldCBkaXIgbmFtZSwgcmVsYXRpdmUgdG8gJHtJTlBVVH0uCisgICAgICAgIHk9YGVjaG8gJHtmdWxsX2Rlc3RfZGlyfSB8IHNlZCAtbiAicyYke2NpbnB1dH0vJiZwImAKKyAgICAgICAgIyBET1RTIGlzIHRoZSByZWxhdGl2ZSBwYXRoIGZyb20gJHtMSUJ9LyR7c3ltX2xpbmt9IGJhY2sgdG8gJHtMSUJ9LgorICAgICAgICBkb3RzPWBlY2hvICIke3N5bV9saW5rfSIgfAorICAgICAgICAgIHNlZCAtZSAnc0BeLi9AQCcgLWUgJ3NALy4vQC9AZycgLWUgJ3NAW14vXVteL10qQC4uQGcnIC1lICdzQC4uJEBAJ2AKKyAgICAgICAgaWYgdGVzdCAkVkVSQk9TRSAtZ3QgMgorICAgICAgICB0aGVuIGVjaG8gJHtzeW1fbGlua30gJy0+JyAkZG90cyR5ICc6IE1ha2luZyBsb2NhbCBsaW5rJyA7IGZpCisgICAgICAgIHJtIC1mciAke0xJQn0vJHtzeW1fbGlua30gPiAvZGV2L251bGwgMj4mMQorICAgICAgICBsbiAtcyAkZG90cyR5ICR7TElCfS8ke3N5bV9saW5rfSA+IC9kZXYvbnVsbCAyPiYxCisKKyAgICAgIGVsc2UKKyAgICAgICAgIyBJZiB0aGUgbGluayBpcyB0byBhIGRpciAkdGFyZ2V0IG91dHNpZGUgJHtJTlBVVH0sCisgICAgICAgICMgcmVwb2ludCB0aGUgbGluayBhdCAke0lOUFVUfS9yb290JHRhcmdldAorICAgICAgICAjIGFuZCBwcm9jZXNzICR0YXJnZXQgaW50byAke0lOUFVUfS9yb290JHRhcmdldAorICAgICAgICAjIHRyZWF0IHRoaXMgZGlyZWN0b3J5IGFzIGlmIGl0IGFjdHVhbGx5IGNvbnRhaW5lZCB0aGUgZmlsZXMuCisgICAgICAgICMKKyAgICAgICAgaWYgdGVzdCAkVkVSQk9TRSAtZ3QgMgorICAgICAgICB0aGVuIGVjaG8gJHtzeW1fbGlua30gJy0+JyByb290JHtmdWxsX2Rlc3RfZGlyfSAnOiBNYWtpbmcgcm9vdGVkIGxpbmsnCisgICAgICAgIGZpCisgICAgICAgIGlmIFsgLWQgJExJQi9yb290JHtmdWxsX2Rlc3RfZGlyfSBdCisgICAgICAgIHRoZW4gdHJ1ZQorICAgICAgICBlbHNlCisgICAgICAgICAgZGlybmFtZT1yb290JHtmdWxsX2Rlc3RfZGlyfS8KKyAgICAgICAgICBkaXJtYWRlPS4KKyAgICAgICAgICBjZCAkTElCCisgICAgICAgICAgd2hpbGUgWyB4JGRpcm5hbWUgIT0geCBdOyBkbworICAgICAgICAgICAgY29tcG9uZW50PWBlY2hvICRkaXJuYW1lIHwgc2VkIC1lICdzfC8uKiR8fCdgCisgICAgICAgICAgICBta2RpciAkY29tcG9uZW50ID4vZGV2L251bGwgMj4mMQorICAgICAgICAgICAgY2QgJGNvbXBvbmVudAorICAgICAgICAgICAgZGlybWFkZT0kZGlybWFkZS8kY29tcG9uZW50CisgICAgICAgICAgICBkaXJuYW1lPWBlY2hvICRkaXJuYW1lIHwgc2VkIC1lICdzfFteL10qL3x8J2AKKyAgICAgICAgICBkb25lCisgICAgICAgIGZpCisKKyAgICAgICAgIyBEdXBsaWNhdGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBjcmVhdGVkIGluICR7TElCfS8ke3N5bV9saW5rfSBpbiBuZXcKKyAgICAgICAgIyByb290IGFyZWEuCisgICAgICAgICMKKyAgICAgICAgZm9yIGZpbGUyIGluICRhbGxfZGlyczsgZG8KKyAgICAgICAgICBjYXNlICRmaWxlMiBpbgorICAgICAgICAgICAgJHtzeW1fbGlua30vKikKKyAgICAgICAgICAgICAgZHVwZGlyPSR7TElCfS9yb290JHtmdWxsX2Rlc3RfZGlyfS9gZWNobyAkZmlsZTIgfAorICAgICAgICAgICAgICAgICAgICAgIHNlZCAtbiAic3xeJHtzeW1fbGlua30vfHxwImAKKyAgICAgICAgICAgICAgaWYgdGVzdCAkVkVSQk9TRSAtZ3QgMgorICAgICAgICAgICAgICB0aGVuIGVjaG8gIkR1cGxpY2F0aW5nICR7c3ltX2xpbmt9J3MgJHtkdXBkaXJ9IiA7IGZpCisgICAgICAgICAgICAgIGlmIFsgLWQgJHtkdXBkaXJ9IF0KKyAgICAgICAgICAgICAgdGhlbiB0cnVlCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBta2RpciAke2R1cGRpcn0KKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICopCisgICAgICAgICAgICAgIDs7CisgICAgICAgICAgZXNhYworICAgICAgICBkb25lCisKKyAgICAgICAgIyBHZXQgdGhlIHBhdGggZnJvbSAke0xJQn0gdG8gJHtzeW1fbGlua30sIGFjY291bnRpbmcgZm9yIHN5bWxpbmtzLgorICAgICAgICAjCisgICAgICAgIHBhcmVudD1gZWNobyAiJHtzeW1fbGlua30iIHwgc2VkIC1lICdzQC9bXi9dKiRAQCdgCisgICAgICAgIGxpYmFicz1gY2QgJHtMSUJ9OyAke1BXRENNRH1gCisgICAgICAgIGZpbGUyPWBjZCAke0xJQn07IGNkICRwYXJlbnQ7ICR7UFdEQ01EfSB8IHNlZCAtZSAic0BeJHtsaWJhYnN9QEAiYAorCisgICAgICAgICMgRE9UUyBpcyB0aGUgcmVsYXRpdmUgcGF0aCBmcm9tICR7TElCfS8ke3N5bV9saW5rfSBiYWNrIHRvICR7TElCfS4KKyAgICAgICAgIworICAgICAgICBkb3RzPWBlY2hvICIkZmlsZTIiIHwgc2VkIC1lICdzQC9bXi9dKkAuLi9AZydgCisgICAgICAgIHJtIC1mciAke0xJQn0vJHtzeW1fbGlua30gPiAvZGV2L251bGwgMj4mMQorICAgICAgICBsbiAtcyAke2RvdHN9cm9vdCR7ZnVsbF9kZXN0X2Rpcn0gJHtMSUJ9LyR7c3ltX2xpbmt9ID4gL2Rldi9udWxsIDI+JjEKKyAgICAgICAgdHJlZXRvcHM9IiR0cmVldG9wcyAke3N5bV9saW5rfSAke0xJQn0vcm9vdCR7ZnVsbF9kZXN0X2Rpcn0iCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKK2ZpCisKKyMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjCisjCityZXF1aXJlZD0KK3NldCB4ICR0cmVldG9wcworc2hpZnQKK3doaWxlIFsgJCMgIT0gMCBdOyBkbworICAjICQxIGlzIGFuIG9sZCBkaXJlY3RvcnkgdG8gY29weSwgYW5kICQyIGlzIHRoZSBuZXcgZGlyZWN0b3J5IHRvIGNvcHkgdG8uCisgICMKKyAgU1JDRElSPWBjZCAke0lOUFVUfSA7IGNkICQxIDsgJHtQV0RDTUR9YAorICBleHBvcnQgU1JDRElSCisKKyAgRklORF9CQVNFPSQxCisgIGV4cG9ydCBGSU5EX0JBU0UKKyAgc2hpZnQKKworICBERVNURElSPWBjZCAkMTske1BXRENNRH1gCisgIGV4cG9ydCBERVNURElSCisgIHNoaWZ0CisKKyAgIyBUaGUgc2FtZSBkaXIgY2FuIGFwcGVhciBtb3JlIHRoYW4gb25jZSBpbiB0cmVldG9wcy4KKyAgIyBUaGVyZSdzIG5vIG5lZWQgdG8gc2NhbiBpdCBtb3JlIHRoYW4gb25jZS4KKyAgIworICBpZiBbIC1mICR7REVTVERJUn0vRE9ORSBdCisgIHRoZW4gY29udGludWUgOyBmaQorCisgIHRvdWNoICR7REVTVERJUn0vRE9ORQorICBpZiB0ZXN0ICRWRVJCT1NFIC1ndCAxCisgIHRoZW4gZWNobyBGaXhpbmcgZGlyZWN0b3J5ICR7U1JDRElSfSBpbnRvICR7REVTVERJUn0gOyBmaQorCisgICMgQ2hlY2sgZmlsZXMgd2hpY2ggYXJlIHN5bWxpbmtzIGFzIHdlbGwgYXMgdGhvc2Ugd2hpY2ggYXJlIGZpbGVzLgorICAjCisgIGNkICR7SU5QVVR9CisgIHJlcXVpcmVkPSIkcmVxdWlyZWQgYGlmICRMSU5LUzsgdGhlbgorICAgIGZpbmQgJHtGSU5EX0JBU0V9Ly4gLW5hbWUgJyouaCcgXCggLXR5cGUgZiAtbyAtdHlwZSBsIFwpIC1wcmludAorICBlbHNlCisgICAgZmluZCAke0ZJTkRfQkFTRX0vLiAtbmFtZSAnKi5oJyAtdHlwZSBmIC1wcmludAorICBmaSB8IFwKKyAgICBzZWQgLWUgJ3M7L1wuLzsvO2cnIC1lICdzOy8vKjsvO2cnIHwgXAorICAgICR7RklYSU5DTH1gIgorZG9uZQorCisjIyBNYWtlIHN1cmUgdGhhdCBhbnkgaW5jbHVkZSBmaWxlcyByZWZlcmVuY2VkIHVzaW5nIGRvdWJsZSBxdW90ZXMKKyMjIGV4aXN0IGluIHRoZSBmaXhlZCBkaXJlY3RvcnkuICBUaGlzIGNvbWVzIGxhc3Qgc2luY2Ugb3RoZXJ3aXNlCisjIyB3ZSBtaWdodCBlbmQgdXAgZGVsZXRpbmcgc29tZSBvZiB0aGVzZSBmaWxlcyAiYmVjYXVzZSB0aGV5IGRvbid0CisjIyBuZWVkIGFueSBjaGFuZ2UuIgorc2V0IHggYGVjaG8gJHJlcXVpcmVkYAorc2hpZnQKK3doaWxlIFsgJCMgIT0gMCBdOyBkbworICBuZXdyZXE9CisgIHdoaWxlIFsgJCMgIT0gMCBdOyBkbworICAgICMgJDEgaXMgdGhlIGRpcmVjdG9yeSB0byBjb3B5IGZyb20sCisgICAgIyAkMiBpcyB0aGUgdW5maXhlZCBmaWxlLAorICAgICMgJDMgaXMgdGhlIGZpeGVkIGZpbGUgbmFtZS4KKyAgICAjCisgICAgY2QgJHtJTlBVVH0KKyAgICBjZCAkMQorICAgIGlmIFsgLWYgJDIgXSA7IHRoZW4KKyAgICAgIGlmIFsgLXIgJDIgXSAmJiBbICEgLXIgJDMgXTsgdGhlbgorICAgICAgICBjcCAkMiAkMyA+L2Rldi9udWxsIDI+JjEgfHwgZWNobyAiQ2FuJ3QgY29weSAkMiIgPiYyCisgICAgICAgIGNobW9kICt3ICQzIDI+L2Rldi9udWxsCisgICAgICAgIGNobW9kIGErciAkMyAyPi9kZXYvbnVsbAorICAgICAgICBpZiB0ZXN0ICRWRVJCT1NFIC1ndCAyCisgICAgICAgIHRoZW4gZWNobyBDb3BpZWQgJDIgOyBmaQorICAgICAgICBmb3IgaW5jbHVkZSBpbiBgZWdyZXAgJ15bIAldKiNbIAldKmluY2x1ZGVbIAldKiJbXi9dJyAkMyB8CisgICAgICAgICAgICAgc2VkIC1lICdzL15bIAldKiNbIAldKmluY2x1ZGVbIAldKiJcKFteIl0qXCkiLiokL1wxLydgCisgICAgICAgIGRvCisJICBkaXI9YGVjaG8gJDIgfCBzZWQgLWUgcyd8L1teL10qJHx8J2AKKwkgIGRpcjI9YGVjaG8gJDMgfCBzZWQgLWUgcyd8L1teL10qJHx8J2AKKwkgIG5ld3JlcT0iJG5ld3JlcSAkMSAkZGlyLyRpbmNsdWRlICRkaXIyLyRpbmNsdWRlIgorICAgICAgICBkb25lCisgICAgICBmaQorICAgIGZpCisgICAgc2hpZnQ7IHNoaWZ0OyBzaGlmdAorICBkb25lCisgIHNldCB4ICRuZXdyZXEKKyAgc2hpZnQKK2RvbmUKKworaWYgdGVzdCAkVkVSQk9TRSAtZ3QgMgordGhlbiBlY2hvICdDbGVhbmluZyB1cCBET05FIGZpbGVzLicgOyBmaQorY2QgJExJQgorIyBMb29rIGZvciBmaWxlcyBjYXNlLWluc2Vuc2l0aXZlbHksIGZvciB0aGUgYmVuZWZpdCBvZgorIyBET1MvV2luZG93cyBmaWxlc3lzdGVtcy4KK2ZpbmQgLiAtbmFtZSAnW0RkXVtPb11bTm5dW0VlXScgLWV4ZWMgcm0gLWYgJ3t9JyAnOycKKworaWYgdGVzdCAkVkVSQk9TRSAtZ3QgMQordGhlbiBlY2hvICdDbGVhbmluZyB1cCB1bm5lZWRlZCBkaXJlY3RvcmllczonIDsgZmkKK2NkICRMSUIKK2FsbF9kaXJzPWBmaW5kIC4gLXR5cGUgZCBcISAtbmFtZSAnLicgLXByaW50IHwgc29ydCAtcmAKK2ZvciBmaWxlIGluICRhbGxfZGlyczsgZG8KKyAgaWYgcm1kaXIgJExJQi8kZmlsZSA+IC9kZXYvbnVsbAorICB0aGVuCisgICAgdGVzdCAkVkVSQk9TRSAtZ3QgMyAmJiBlY2hvICIgIHJlbW92ZWQgJGZpbGUiCisgIGZpCitkb25lIDI+IC9kZXYvbnVsbAorCisjIE9uIHN5c3RlbXMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCBzeW1saW5rcywgYGZpbmQnIG1heSBiYXJmCisjIGlmIGNhbGxlZCB3aXRoICItdHlwZSBsIiBwcmVkaWNhdGUuICBTbyBvbmx5IHVzZSB0aGF0IGlmCisjIHdlIGtub3cgd2Ugc2hvdWxkIGxvb2sgZm9yIHN5bWxpbmtzLgoraWYgJExJTktTOyB0aGVuCisgIHRlc3QgJFZFUkJPU0UgLWd0IDIgJiYgZWNobyAiUmVtb3ZpbmcgdW51c2VkIHN5bWxpbmtzIgorCisgIGFsbF9kaXJzPWBmaW5kIC4gLXR5cGUgbCAtcHJpbnRgCisgIGZvciBmaWxlIGluICRhbGxfZGlycworICBkbworICAgIGlmIHRlc3QgISAtZCAkZmlsZQorICAgIHRoZW4KKyAgICAgIHJtIC1mICRmaWxlCisgICAgICB0ZXN0ICRWRVJCT1NFIC1ndCAzICYmIGVjaG8gIiAgcmVtb3ZlZCAkZmlsZSIKKyAgICAgIHJtZGlyIGBkaXJuYW1lICRmaWxlYCA+IC9kZXYvbnVsbCAmJiBcCisgICAgICAgICAgIHRlc3QgJFZFUkJPU0UgLWd0IDMgJiYgXAorICAgICAgICAgICBlY2hvICIgIHJlbW92ZWQgYGRpcm5hbWUgJGZpbGVgIgorICAgIGZpCisgIGRvbmUgMj4gL2Rldi9udWxsCitmaQorCitpZiB0ZXN0ICRWRVJCT1NFIC1ndCAwCit0aGVuIGVjaG8gZml4aW5jbHVkZXMgaXMgZG9uZSA7IGZpCisKKyMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjCisjCisjIEVuZCBvZiBmb3IgSU5QVVQgZGlyZWN0b3JpZXMKKyMKK2RvbmUKKyMKKyMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjCmRpZmYgLS1naXQgYS9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvZml4aW5jbCBiL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvaW5zdGFsbC10b29scy9maXhpbmNsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcwNDgyNmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvZml4aW5jbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvbWtoZWFkZXJzIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbnN0YWxsLXRvb2xzL21raGVhZGVycwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNTljODJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbnN0YWxsLXRvb2xzL21raGVhZGVycwpAQCAtMCwwICsxLDEwNCBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA3LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisjR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKKyN0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorI1NvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisjdmVyc2lvbi4KKworI0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorI0FOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorI0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorI2ZvciBtb3JlIGRldGFpbHMuCisKKyNZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorI2Fsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCisjPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisjIEJhc2ljIGluZm9ybWF0aW9uCit0YXJnZXQ9eDg2XzY0LXBjLWxpbnV4LWdudQordGFyZ2V0X25vbmNhbm9uaWNhbD14ODZfNjQtbGludXgKK3ZlcnNpb249NC44CisKK1ZFUkJPU0U9MAord2hpbGUgWyB4JDEgPSB4LXYgXSA7IGRvCisgICAgc2hpZnQKKyAgICBWRVJCT1NFPWBleHByICRWRVJCT1NFICsgMWAKK2RvbmUKK2V4cG9ydCBWRVJCT1NFCisKK2lmIFsgeCQxID0geC0taGVscCBdIDsgdGhlbgorICAgIGVjaG8gIlVzYWdlOiBta2hlYWRlcnMgW29wdGlvbnNdIFtwcmVmaXggW2lzeXNyb290XV0iCisgICAgZWNobyAiT3B0aW9uczoiCisgICAgZWNobyAiICAtdiAgICAgICAgUHJpbnQgbW9yZSBvdXRwdXQgKG1heSBiZSByZXBlYXRlZCBmb3IgZXZlbiBtb3JlIG91dHB1dCkiCisgICAgZWNobyAiICAtLWhlbHAgICAgVGhpcyBoZWxwIgorICAgIGVjaG8gIiAgLS12ZXJzaW9uIFByaW50IHZlcnNpb24gaW5mb3JtYXRpb24iCisgICAgZXhpdCAwCitmaQorCitpZiBbIHgkMSA9IHgtLXZlcnNpb24gXSA7IHRoZW4KKyAgICBlY2hvICJta2hlYWRlcnMgKEdDQykgdmVyc2lvbiAkdmVyc2lvbiIKKyAgICBlY2hvICJDb3B5cmlnaHQgMjAwMiwgMjAwNywgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4iCisgICAgZWNobyAiVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSIKKyAgICBlY2hvICJ0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIgorICAgIGVjaG8gImFic29sdXRlbHkgbm8gd2FycmFudHkuIgorICAgIGV4aXQgMAorZmkKKworIyBDb21tb24gcHJlZml4IGZvciBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuCitpZiBbIHgkMSAhPSB4IF0gOyB0aGVuCisgIHByZWZpeD0kMQorICBzaGlmdAorZWxzZQorICBwcmVmaXg9L3Vzci9sb2NhbC9nb29nbGUvaG9tZS9jaGgvd29ya2Rpci9wcmVjaXNlNy8xL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44CitmaQorCisjIEFsbG93IGZvciBhbHRlcm5hdGUgaXN5c3Jvb3QgaW4gd2hpY2ggdG8gZmluZCBoZWFkZXJzCitpZiBbIHgkMSAhPSB4IF0gOyB0aGVuCisgIGlzeXNyb290PSQxCisgIHNoaWZ0CitlbHNlCisgIGlzeXNyb290PQorZmkKKworIyBEaXJlY3RvcnkgaW4gd2hpY2ggdG8gcHV0IGhvc3QgZGVwZW5kZW50IHByb2dyYW1zIGFuZCBsaWJyYXJpZXMKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorIyBEaXJlY3RvcnkgaW4gd2hpY2ggdG8gcHV0IHRoZSBkaXJlY3RvcmllcyB1c2VkIGJ5IHRoZSBjb21waWxlci4KK2xpYmRpcj0ke2V4ZWNfcHJlZml4fS9saWIKK2xpYmV4ZWNkaXI9JHtleGVjX3ByZWZpeH0vbGliZXhlYworIyBEaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGNvbXBpbGVyIGZpbmRzIGxpYnJhcmllcywgZXRjLgorbGlic3ViZGlyPSR7bGliZGlyfS9nY2MvJHt0YXJnZXRfbm9uY2Fub25pY2FsfS8ke3ZlcnNpb259CisjIERpcmVjdG9yeSBpbiB3aGljaCB0aGUgY29tcGlsZXIgZmluZHMgZXhlY3V0YWJsZXMKK2xpYmV4ZWNzdWJkaXI9JHtsaWJleGVjZGlyfS9nY2MvJHt0YXJnZXRfbm9uY2Fub25pY2FsfS8ke3ZlcnNpb259CisKK2l0b29sc2Rpcj0ke2xpYmV4ZWNzdWJkaXJ9L2luc3RhbGwtdG9vbHMKK2l0b29sc2RhdGFkaXI9JHtsaWJzdWJkaXJ9L2luc3RhbGwtdG9vbHMKK2luY2Rpcj0ke2xpYnN1YmRpcn0vaW5jbHVkZS1maXhlZAorbWtpbnN0YWxsZGlycz0iL2Jpbi9zaCAke2l0b29sc2Rpcn0vbWtpbnN0YWxsZGlycyIKKworY2QgJHtpdG9vbHNkaXJ9CitybSAtcmYgJHtpbmNkaXJ9LyoKKworZm9yIG1sIGluIGBjYXQgJHtpdG9vbHNkYXRhZGlyfS9maXhpbmNfbGlzdGA7IGRvCisgIHN5c3Jvb3RfaGVhZGVyc19zdWZmaXg9YGVjaG8gJHttbH0gfCBzZWQgLWUgJ3MvOy4qJC8vJ2AKKyAgbXVsdGlfZGlyPWBlY2hvICR7bWx9IHwgc2VkIC1lICdzL15bXjtdKjsvLydgCisgIHN1YmluY2Rpcj0ke2luY2Rpcn0ke211bHRpX2Rpcn0KKyAgLiAke2l0b29sc2RhdGFkaXJ9L21raGVhZGVycy5jb25mCisgIGlmIFsgeCR7U1RNUF9GSVhJTkN9ICE9IHggXSA7IHRoZW4KKwlUQVJHRVRfTUFDSElORT0iJHt0YXJnZXR9IiB0YXJnZXRfY2Fub25pY2FsPSIke3RhcmdldH0iIFwKKwkgICAgTUFDUk9fTElTVD0iJHtpdG9vbHNkYXRhZGlyfS9tYWNyb19saXN0IiBcCisJICAgIC9iaW4vc2ggLi9maXhpbmMuc2ggJHtzdWJpbmNkaXJ9IFwKKwkgICAgJHtpc3lzcm9vdH0ke1NZU1RFTV9IRUFERVJfRElSfSAke09USEVSX0ZJWElOQ0xVREVTX0RJUlN9CisJcm0gLWYgJHtzdWJpbmNkaXJ9L3N5c2xpbWl0cy5oCisJaWYgWyAtZiAke3N1YmluY2Rpcn0vbGltaXRzLmggXTsgdGhlbgorCSAgbXYgJHtzdWJpbmNkaXJ9L2xpbWl0cy5oICR7c3ViaW5jZGlyfS9zeXNsaW1pdHMuaAorCWVsc2UKKwkgIGNwICR7aXRvb2xzZGF0YWRpcn0vZ3N5c2xpbWl0cy5oICR7c3ViaW5jZGlyfS9zeXNsaW1pdHMuaAorCWZpCisgIGZpCisKKyAgY3AgJHtpdG9vbHNkYXRhZGlyfS9pbmNsdWRlJHttdWx0aV9kaXJ9L2xpbWl0cy5oICR7c3ViaW5jZGlyfQorZG9uZQpkaWZmIC0tZ2l0IGEvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbnN0YWxsLXRvb2xzL21raW5zdGFsbGRpcnMgYi9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2luc3RhbGwtdG9vbHMvbWtpbnN0YWxsZGlycwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MTkxYTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9pbnN0YWxsLXRvb2xzL21raW5zdGFsbGRpcnMKQEAgLTAsMCArMSwxNjIgQEAKKyMhIC9iaW4vc2gKKyMgbWtpbnN0YWxsZGlycyAtLS0gbWFrZSBkaXJlY3RvcnkgaGllcmFyY2h5CisKK3NjcmlwdHZlcnNpb249MjAwOS0wNC0yOC4yMTsgIyBVVEMKKworIyBPcmlnaW5hbCBhdXRob3I6IE5vYWggRnJpZWRtYW4gPGZyaWVkbWFuQHByZXAuYWkubWl0LmVkdT4KKyMgQ3JlYXRlZDogMTk5My0wNS0xNgorIyBQdWJsaWMgZG9tYWluLgorIworIyBUaGlzIGZpbGUgaXMgbWFpbnRhaW5lZCBpbiBBdXRvbWFrZSwgcGxlYXNlIHJlcG9ydAorIyBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4gb3Igc2VuZCBwYXRjaGVzIHRvCisjIDxhdXRvbWFrZS1wYXRjaGVzQGdudS5vcmc+LgorCitubD0nCisnCitJRlM9IiAiIgkkbmwiCitlcnJzdGF0dXM9MAorZGlybW9kZT0KKwordXNhZ2U9IlwKK1VzYWdlOiBta2luc3RhbGxkaXJzIFstaF0gWy0taGVscF0gWy0tdmVyc2lvbl0gWy1tIE1PREVdIERJUiAuLi4KKworQ3JlYXRlIGVhY2ggZGlyZWN0b3J5IERJUiAod2l0aCBtb2RlIE1PREUsIGlmIHNwZWNpZmllZCksIGluY2x1ZGluZyBhbGwKK2xlYWRpbmcgZmlsZSBuYW1lIGNvbXBvbmVudHMuCisKK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uIgorCisjIHByb2Nlc3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50cword2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtaCB8IC0taGVscCB8IC0taCopICAgICAgICAgIyAtaCBmb3IgaGVscAorICAgICAgZWNobyAiJHVzYWdlIgorICAgICAgZXhpdCAkPworICAgICAgOzsKKyAgICAtbSkgICAgICAgICAgICAgICAgICAgICAgICAgIyAtbSBQRVJNIGFyZworICAgICAgc2hpZnQKKyAgICAgIHRlc3QgJCMgLWVxIDAgJiYgeyBlY2hvICIkdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgICAgZGlybW9kZT0kMQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgLS12ZXJzaW9uKQorICAgICAgZWNobyAiJDAgJHNjcmlwdHZlcnNpb24iCisgICAgICBleGl0ICQ/CisgICAgICA7OworICAgIC0tKSAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKKyAgICAgIHNoaWZ0CisgICAgICBicmVhaworICAgICAgOzsKKyAgICAtKikgICAgICAgICAgICAgICAgICAgICAgICAgIyB1bmtub3duIG9wdGlvbgorICAgICAgZWNobyAiJHVzYWdlIiAxPiYyCisgICAgICBleGl0IDEKKyAgICAgIDs7CisgICAgKikgICAgICAgICAgICAgICAgICAgICAgICAgICMgZmlyc3Qgbm9uLW9wdCBhcmcKKyAgICAgIGJyZWFrCisgICAgICA7OworICBlc2FjCitkb25lCisKK2ZvciBmaWxlCitkbworICBpZiB0ZXN0IC1kICIkZmlsZSI7IHRoZW4KKyAgICBzaGlmdAorICBlbHNlCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKKworY2FzZSAkIyBpbgorICAwKSBleGl0IDAgOzsKK2VzYWMKKworIyBTb2xhcmlzIDgncyBta2RpciAtcCBpc24ndCB0aHJlYWQtc2FmZS4gIElmIHlvdSBta2RpciAtcCBhL2IgYW5kCisjIG1rZGlyIC1wIGEvYyBhdCB0aGUgc2FtZSB0aW1lLCBib3RoIHdpbGwgZGV0ZWN0IHRoYXQgYSBpcyBtaXNzaW5nLAorIyBvbmUgd2lsbCBjcmVhdGUgYSwgdGhlbiB0aGUgb3RoZXIgd2lsbCB0cnkgdG8gY3JlYXRlIGEgYW5kIGRpZSB3aXRoCisjIGEgIkZpbGUgZXhpc3RzIiBlcnJvci4gIFRoaXMgaXMgYSBwcm9ibGVtIHdoZW4gY2FsbGluZyBta2luc3RhbGxkaXJzCisjIGZyb20gYSBwYXJhbGxlbCBtYWtlLiAgV2UgdXNlIC0tdmVyc2lvbiBpbiB0aGUgcHJvYmUgdG8gcmVzdHJpY3QKKyMgb3Vyc2VsdmVzIHRvIEdOVSBta2Rpciwgd2hpY2ggaXMgdGhyZWFkLXNhZmUuCitjYXNlICRkaXJtb2RlIGluCisgICcnKQorICAgIGlmIG1rZGlyIC1wIC0tdmVyc2lvbiAuID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICEgLWQgLi8tLXZlcnNpb247IHRoZW4KKyAgICAgIGVjaG8gIm1rZGlyIC1wIC0tICQqIgorICAgICAgZXhlYyBta2RpciAtcCAtLSAiJEAiCisgICAgZWxzZQorICAgICAgIyBPbiBOZXh0U3RlcCBhbmQgT3BlblN0ZXAsIHRoZSBgbWtkaXInIGNvbW1hbmQgZG9lcyBub3QKKyAgICAgICMgcmVjb2duaXplIGFueSBvcHRpb24uICBJdCB3aWxsIGludGVycHJldCBhbGwgb3B0aW9ucyBhcworICAgICAgIyBkaXJlY3RvcmllcyB0byBjcmVhdGUsIGFuZCB0aGVuIGFib3J0IGJlY2F1c2UgYC4nIGFscmVhZHkKKyAgICAgICMgZXhpc3RzLgorICAgICAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKyAgICAgIHRlc3QgLWQgLi8tLXZlcnNpb24gJiYgcm1kaXIgLi8tLXZlcnNpb24KKyAgICBmaQorICAgIDs7CisgICopCisgICAgaWYgbWtkaXIgLW0gIiRkaXJtb2RlIiAtcCAtLXZlcnNpb24gLiA+L2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICB0ZXN0ICEgLWQgLi8tLXZlcnNpb247IHRoZW4KKyAgICAgIGVjaG8gIm1rZGlyIC1tICRkaXJtb2RlIC1wIC0tICQqIgorICAgICAgZXhlYyBta2RpciAtbSAiJGRpcm1vZGUiIC1wIC0tICIkQCIKKyAgICBlbHNlCisgICAgICAjIENsZWFuIHVwIGFmdGVyIE5leHRTdGVwIGFuZCBPcGVuU3RlcCBta2Rpci4KKyAgICAgIGZvciBkIGluIC4vLW0gLi8tcCAuLy0tdmVyc2lvbiAiLi8kZGlybW9kZSI7CisgICAgICBkbworICAgICAgICB0ZXN0IC1kICRkICYmIHJtZGlyICRkCisgICAgICBkb25lCisgICAgZmkKKyAgICA7OworZXNhYworCitmb3IgZmlsZQorZG8KKyAgY2FzZSAkZmlsZSBpbgorICAgIC8qKSBwYXRoY29tcD0vIDs7CisgICAgKikgIHBhdGhjb21wPSA7OworICBlc2FjCisgIG9JRlM9JElGUworICBJRlM9LworICBzZXQgZm5vcmQgJGZpbGUKKyAgc2hpZnQKKyAgSUZTPSRvSUZTCisKKyAgZm9yIGQKKyAgZG8KKyAgICB0ZXN0ICJ4JGQiID0geCAmJiBjb250aW51ZQorCisgICAgcGF0aGNvbXA9JHBhdGhjb21wJGQKKyAgICBjYXNlICRwYXRoY29tcCBpbgorICAgICAgLSopIHBhdGhjb21wPS4vJHBhdGhjb21wIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCisgICAgICBlY2hvICJta2RpciAkcGF0aGNvbXAiCisKKyAgICAgIG1rZGlyICIkcGF0aGNvbXAiIHx8IGxhc3RlcnI9JD8KKworICAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCisJZXJyc3RhdHVzPSRsYXN0ZXJyCisgICAgICBlbHNlCisJaWYgdGVzdCAhIC16ICIkZGlybW9kZSI7IHRoZW4KKwkgIGVjaG8gImNobW9kICRkaXJtb2RlICRwYXRoY29tcCIKKwkgIGxhc3RlcnI9CisJICBjaG1vZCAiJGRpcm1vZGUiICIkcGF0aGNvbXAiIHx8IGxhc3RlcnI9JD8KKworCSAgaWYgdGVzdCAhIC16ICIkbGFzdGVyciI7IHRoZW4KKwkgICAgZXJyc3RhdHVzPSRsYXN0ZXJyCisJICBmaQorCWZpCisgICAgICBmaQorICAgIGZpCisKKyAgICBwYXRoY29tcD0kcGF0aGNvbXAvCisgIGRvbmUKK2RvbmUKKworZXhpdCAkZXJyc3RhdHVzCisKKyMgTG9jYWwgVmFyaWFibGVzOgorIyBtb2RlOiBzaGVsbC1zY3JpcHQKKyMgc2gtaW5kZW50YXRpb246IDIKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgorIyB0aW1lLXN0YW1wLXRpbWUtem9uZTogIlVUQyIKKyMgdGltZS1zdGFtcC1lbmQ6ICI7ICMgVVRDIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2xpYmx0b19wbHVnaW4uc28gYi9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2xpYmx0b19wbHVnaW4uc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZjI1YmE4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvbGlibHRvX3BsdWdpbi5zbwpAQCAtMCwwICsxIEBACitsaWJsdG9fcGx1Z2luLnNvLjAuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9saWJsdG9fcGx1Z2luLnNvLjAgYi9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2xpYmx0b19wbHVnaW4uc28uMApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5mMjViYTg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9saWJsdG9fcGx1Z2luLnNvLjAKQEAgLTAsMCArMSBAQAorbGlibHRvX3BsdWdpbi5zby4wLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvbGlibHRvX3BsdWdpbi5zby4wLjAuMCBiL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvbGlibHRvX3BsdWdpbi5zby4wLjAuMApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YTRkY2FjCi0tLSAvZGV2L251bGwKKysrIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9saWJsdG9fcGx1Z2luLnNvLjAuMC4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvbHRvLXdyYXBwZXIgYi9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2x0by13cmFwcGVyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBjODk3MWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC44L2x0by13cmFwcGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvbHRvMSBiL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjgvbHRvMQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNDhmNzliCi0tLSAvZGV2L251bGwKKysrIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuOC9sdG8xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvZ2wuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvZ2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjVlMWJjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbC5oCkBAIC0wLDAgKzEsMjIzNSBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqIFZlcnNpb246ICA3LjYKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFZNd2FyZSwgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIEJSSUFOIFBBVUwgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKyNpZm5kZWYgX19nbF9oXworI2RlZmluZSBfX2dsX2hfCisKKyNpZiBkZWZpbmVkKFVTRV9NR0xfTkFNRVNQQUNFKQorI2luY2x1ZGUgImdsX21hbmdsZS5oIgorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEJlZ2luIHN5c3RlbS1zcGVjaWZpYyBzdHVmZi4gRG8gbm90IGRvIGFueSBvZiB0aGlzIHdoZW4gYnVpbGRpbmcKKyAqIGZvciBTY2lUZWNoIFNOQVAsIGFzIHRoaXMgaXMgYWxsIGRvbmUgYmVmb3JlIHRoaXMgaGVhZGVyIGZpbGUgaXMKKyAqIGluY2x1ZGVkLiAKKyAqLworI2lmICFkZWZpbmVkKF9fU0NJVEVDSF9TTkFQX18pCisKKyNpZiBkZWZpbmVkKF9fQkVPU19fKQorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgICAgLyogdG8gZ2V0IHNvbWUgQmVPUy1pc21zICovCisjZW5kaWYKKworI2lmICFkZWZpbmVkKE9QRU5TVEVQKSAmJiAoZGVmaW5lZChOZVhUKSB8fCBkZWZpbmVkKE5lWFRfUERPKSkKKyNkZWZpbmUgT1BFTlNURVAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fV0lOMzJfXykgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKKyNkZWZpbmUgX19XSU4zMl9fCisjZW5kaWYKKworI2lmICFkZWZpbmVkKE9QRU5TVEVQKSAmJiAoZGVmaW5lZChfX1dJTjMyX18pICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pKQorIyAgaWYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKSAmJiBkZWZpbmVkKEJVSUxEX0dMMzIpIC8qIHRhZyBzcGVjaWZ5IHdlJ3JlIGJ1aWxkaW5nIG1lc2EgYXMgYSBETEwgKi8KKyMgICAgZGVmaW5lIEdMQVBJIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgZWxpZiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykpICYmIGRlZmluZWQoX0RMTCkgLyogdGFnIHNwZWNpZnlpbmcgd2UncmUgYnVpbGRpbmcgZm9yIERMTCBydW50aW1lIHN1cHBvcnQgKi8KKyMgICAgZGVmaW5lIEdMQVBJIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgZWxzZSAvKiBmb3IgdXNlIHdpdGggc3RhdGljIGxpbmsgbGliIGJ1aWxkIG9mIFdpbjMyIGVkaXRpb24gb25seSAqLworIyAgICBkZWZpbmUgR0xBUEkgZXh0ZXJuCisjICBlbmRpZiAvKiBfU1RBVElDX01FU0Egc3VwcG9ydCAqLworIyAgaWYgZGVmaW5lZChfX01JTkdXMzJfXykgJiYgZGVmaW5lZChHTF9OT19TVERDQUxMKSB8fCBkZWZpbmVkKFVOREVSX0NFKSAgLyogVGhlIGdlbmVyYXRlZCBETExzIGJ5IE1pbmdXIHdpdGggU1REQ0FMTCBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgb25lcyBkb25lIGJ5IE1pY3Jvc29mdCdzIGNvbXBpbGVycyAqLworIyAgICBkZWZpbmUgR0xBUElFTlRSWSAKKyMgIGVsc2UKKyMgICAgZGVmaW5lIEdMQVBJRU5UUlkgX19zdGRjYWxsCisjICBlbmRpZgorI2VsaWYgZGVmaW5lZChfX0NZR1dJTl9fKSAmJiBkZWZpbmVkKFVTRV9PUEVOR0wzMikgLyogdXNlIG5hdGl2ZSB3aW5kb3dzIG9wZW5nbDMyICovCisjICBkZWZpbmUgR0xBUEkgZXh0ZXJuCisjICBkZWZpbmUgR0xBUElFTlRSWSBfX3N0ZGNhbGwKKyNlbGlmIChkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSA0KSB8fCAoZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU5MCkpCisjICBkZWZpbmUgR0xBUEkgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyMgIGRlZmluZSBHTEFQSUVOVFJZCisjZW5kaWYgLyogV0lOMzIgJiYgIUNZR1dJTiAqLworCisjaWYgKGRlZmluZWQoX19CRU9TX18pICYmIGRlZmluZWQoX19QT1dFUlBDX18pKSB8fCBkZWZpbmVkKF9fUVVJQ0tEUkFXX18pCisjICBkZWZpbmUgUFJBR01BX0VYUE9SVF9TVVBQT1JURUQJCTEKKyNlbmRpZgorCisvKgorICogV0lORE9XUzogSW5jbHVkZSB3aW5kb3dzLmggaGVyZSB0byBkZWZpbmUgQVBJRU5UUlkuCisgKiBJdCBpcyBhbHNvIHVzZWZ1bCB3aGVuIGFwcGxpY2F0aW9ucyBpbmNsdWRlIHRoaXMgZmlsZSBieQorICogaW5jbHVkaW5nIG9ubHkgZ2x1dC5oLCBzaW5jZSBnbHV0LmggZGVwZW5kcyBvbiB3aW5kb3dzLmguCisgKiBBcHBsaWNhdGlvbnMgbmVlZGluZyB0byBpbmNsdWRlIHdpbmRvd3MuaCB3aXRoIHBhcm1zIG90aGVyCisgKiB0aGFuICJXSU4zMl9MRUFOX0FORF9NRUFOIiBtYXkgaW5jbHVkZSB3aW5kb3dzLmggYmVmb3JlCisgKiBnbHV0Lmggb3IgZ2wuaC4KKyAqLworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChBUElFTlRSWSkgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKKyNpZm5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKKyNlbmRpZgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChtYWNpbnRvc2gpICYmIFBSQUdNQV9JTVBPUlRfU1VQUE9SVEVECisjcHJhZ21hIGltcG9ydCBvbgorI2VuZGlmCisKKyNpZm5kZWYgR0xBUEkKKyNkZWZpbmUgR0xBUEkgZXh0ZXJuCisjZW5kaWYKKworI2lmbmRlZiBHTEFQSUVOVFJZCisjZGVmaW5lIEdMQVBJRU5UUlkKKyNlbmRpZgorCisjaWZuZGVmIEFQSUVOVFJZCisjZGVmaW5lIEFQSUVOVFJZIEdMQVBJRU5UUlkKKyNlbmRpZgorCisvKiAiUCIgc3VmZml4IHRvIGJlIHVzZWQgZm9yIGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uICovCisjaWZuZGVmIEFQSUVOVFJZUAorI2RlZmluZSBBUElFTlRSWVAgQVBJRU5UUlkgKgorI2VuZGlmCisKKyNpZm5kZWYgR0xBUElFTlRSWVAKKyNkZWZpbmUgR0xBUElFTlRSWVAgR0xBUElFTlRSWSAqCisjZW5kaWYKKworI2lmZGVmIENFTlRFUkxJTkVfQ0xQUAorI2RlZmluZSBzaWduZWQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQUkFHTUFfRVhQT1JUX1NVUFBPUlRFRCkKKyNwcmFnbWEgZXhwb3J0IG9uCisjZW5kaWYKKworI2VuZGlmIC8qICFfX1NDSVRFQ0hfU05BUF9fICovCisvKgorICogRW5kIHN5c3RlbS1zcGVjaWZpYyBzdHVmZi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKworI2RlZmluZSBHTF9WRVJTSU9OXzFfMSAgIDEKKyNkZWZpbmUgR0xfVkVSU0lPTl8xXzIgICAxCisjZGVmaW5lIEdMX1ZFUlNJT05fMV8zICAgMQorI2RlZmluZSBHTF9BUkJfaW1hZ2luZyAgIDEKKworCisvKgorICogRGF0YXR5cGVzCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50CUdMZW51bTsKK3R5cGVkZWYgdW5zaWduZWQgY2hhcglHTGJvb2xlYW47Cit0eXBlZGVmIHVuc2lnbmVkIGludAlHTGJpdGZpZWxkOwordHlwZWRlZiB2b2lkCQlHTHZvaWQ7Cit0eXBlZGVmIHNpZ25lZCBjaGFyCUdMYnl0ZTsJCS8qIDEtYnl0ZSBzaWduZWQgKi8KK3R5cGVkZWYgc2hvcnQJCUdMc2hvcnQ7CS8qIDItYnl0ZSBzaWduZWQgKi8KK3R5cGVkZWYgaW50CQlHTGludDsJCS8qIDQtYnl0ZSBzaWduZWQgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhcglHTHVieXRlOwkvKiAxLWJ5dGUgdW5zaWduZWQgKi8KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJR0x1c2hvcnQ7CS8qIDItYnl0ZSB1bnNpZ25lZCAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQJR0x1aW50OwkJLyogNC1ieXRlIHVuc2lnbmVkICovCit0eXBlZGVmIGludAkJR0xzaXplaTsJLyogNC1ieXRlIHNpZ25lZCAqLwordHlwZWRlZiBmbG9hdAkJR0xmbG9hdDsJLyogc2luZ2xlIHByZWNpc2lvbiBmbG9hdCAqLwordHlwZWRlZiBmbG9hdAkJR0xjbGFtcGY7CS8qIHNpbmdsZSBwcmVjaXNpb24gZmxvYXQgaW4gWzAsMV0gKi8KK3R5cGVkZWYgZG91YmxlCQlHTGRvdWJsZTsJLyogZG91YmxlIHByZWNpc2lvbiBmbG9hdCAqLwordHlwZWRlZiBkb3VibGUJCUdMY2xhbXBkOwkvKiBkb3VibGUgcHJlY2lzaW9uIGZsb2F0IGluIFswLDFdICovCisKKworCisvKgorICogQ29uc3RhbnRzCisgKi8KKworLyogQm9vbGVhbiB2YWx1ZXMgKi8KKyNkZWZpbmUgR0xfRkFMU0UJCQkJMHgwCisjZGVmaW5lIEdMX1RSVUUJCQkJCTB4MQorCisvKiBEYXRhIHR5cGVzICovCisjZGVmaW5lIEdMX0JZVEUJCQkJCTB4MTQwMAorI2RlZmluZSBHTF9VTlNJR05FRF9CWVRFCQkJMHgxNDAxCisjZGVmaW5lIEdMX1NIT1JUCQkJCTB4MTQwMgorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVAkJCTB4MTQwMworI2RlZmluZSBHTF9JTlQJCQkJCTB4MTQwNAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlQJCQkJMHgxNDA1CisjZGVmaW5lIEdMX0ZMT0FUCQkJCTB4MTQwNgorI2RlZmluZSBHTF8yX0JZVEVTCQkJCTB4MTQwNworI2RlZmluZSBHTF8zX0JZVEVTCQkJCTB4MTQwOAorI2RlZmluZSBHTF80X0JZVEVTCQkJCTB4MTQwOQorI2RlZmluZSBHTF9ET1VCTEUJCQkJMHgxNDBBCisKKy8qIFByaW1pdGl2ZXMgKi8KKyNkZWZpbmUgR0xfUE9JTlRTCQkJCTB4MDAwMAorI2RlZmluZSBHTF9MSU5FUwkJCQkweDAwMDEKKyNkZWZpbmUgR0xfTElORV9MT09QCQkJCTB4MDAwMgorI2RlZmluZSBHTF9MSU5FX1NUUklQCQkJCTB4MDAwMworI2RlZmluZSBHTF9UUklBTkdMRVMJCQkJMHgwMDA0CisjZGVmaW5lIEdMX1RSSUFOR0xFX1NUUklQCQkJMHgwMDA1CisjZGVmaW5lIEdMX1RSSUFOR0xFX0ZBTgkJCQkweDAwMDYKKyNkZWZpbmUgR0xfUVVBRFMJCQkJMHgwMDA3CisjZGVmaW5lIEdMX1FVQURfU1RSSVAJCQkJMHgwMDA4CisjZGVmaW5lIEdMX1BPTFlHT04JCQkJMHgwMDA5CisKKy8qIFZlcnRleCBBcnJheXMgKi8KKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZCQkJCTB4ODA3NAorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVkJCQkJMHg4MDc1CisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZCQkJCTB4ODA3NgorI2RlZmluZSBHTF9JTkRFWF9BUlJBWQkJCQkweDgwNzcKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWQkJCTB4ODA3OAorI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVkJCQkweDgwNzkKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1NJWkUJCQkweDgwN0EKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1RZUEUJCQkweDgwN0IKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1NUUklERQkJCTB4ODA3QworI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfVFlQRQkJCTB4ODA3RQorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfU1RSSURFCQkJMHg4MDdGCisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX1NJWkUJCQkweDgwODEKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfVFlQRQkJCTB4ODA4MgorI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9TVFJJREUJCQkweDgwODMKKyNkZWZpbmUgR0xfSU5ERVhfQVJSQVlfVFlQRQkJCTB4ODA4NQorI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9TVFJJREUJCQkweDgwODYKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFCQkweDgwODgKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9UWVBFCQkweDgwODkKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREUJCTB4ODA4QQorI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfU1RSSURFCQkweDgwOEMKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1BPSU5URVIJCQkweDgwOEUKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX1BPSU5URVIJCQkweDgwOEYKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfUE9JTlRFUgkJCTB4ODA5MAorI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9QT0lOVEVSCQkJMHg4MDkxCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfUE9JTlRFUgkJMHg4MDkyCisjZGVmaW5lIEdMX0VER0VfRkxBR19BUlJBWV9QT0lOVEVSCQkweDgwOTMKKyNkZWZpbmUgR0xfVjJGCQkJCQkweDJBMjAKKyNkZWZpbmUgR0xfVjNGCQkJCQkweDJBMjEKKyNkZWZpbmUgR0xfQzRVQl9WMkYJCQkJMHgyQTIyCisjZGVmaW5lIEdMX0M0VUJfVjNGCQkJCTB4MkEyMworI2RlZmluZSBHTF9DM0ZfVjNGCQkJCTB4MkEyNAorI2RlZmluZSBHTF9OM0ZfVjNGCQkJCTB4MkEyNQorI2RlZmluZSBHTF9DNEZfTjNGX1YzRgkJCQkweDJBMjYKKyNkZWZpbmUgR0xfVDJGX1YzRgkJCQkweDJBMjcKKyNkZWZpbmUgR0xfVDRGX1Y0RgkJCQkweDJBMjgKKyNkZWZpbmUgR0xfVDJGX0M0VUJfVjNGCQkJCTB4MkEyOQorI2RlZmluZSBHTF9UMkZfQzNGX1YzRgkJCQkweDJBMkEKKyNkZWZpbmUgR0xfVDJGX04zRl9WM0YJCQkJMHgyQTJCCisjZGVmaW5lIEdMX1QyRl9DNEZfTjNGX1YzRgkJCTB4MkEyQworI2RlZmluZSBHTF9UNEZfQzRGX04zRl9WNEYJCQkweDJBMkQKKworLyogTWF0cml4IE1vZGUgKi8KKyNkZWZpbmUgR0xfTUFUUklYX01PREUJCQkJMHgwQkEwCisjZGVmaW5lIEdMX01PREVMVklFVwkJCQkweDE3MDAKKyNkZWZpbmUgR0xfUFJPSkVDVElPTgkJCQkweDE3MDEKKyNkZWZpbmUgR0xfVEVYVFVSRQkJCQkweDE3MDIKKworLyogUG9pbnRzICovCisjZGVmaW5lIEdMX1BPSU5UX1NNT09USAkJCQkweDBCMTAKKyNkZWZpbmUgR0xfUE9JTlRfU0laRQkJCQkweDBCMTEKKyNkZWZpbmUgR0xfUE9JTlRfU0laRV9HUkFOVUxBUklUWSAJCTB4MEIxMworI2RlZmluZSBHTF9QT0lOVF9TSVpFX1JBTkdFCQkJMHgwQjEyCisKKy8qIExpbmVzICovCisjZGVmaW5lIEdMX0xJTkVfU01PT1RICQkJCTB4MEIyMAorI2RlZmluZSBHTF9MSU5FX1NUSVBQTEUJCQkJMHgwQjI0CisjZGVmaW5lIEdMX0xJTkVfU1RJUFBMRV9QQVRURVJOCQkJMHgwQjI1CisjZGVmaW5lIEdMX0xJTkVfU1RJUFBMRV9SRVBFQVQJCQkweDBCMjYKKyNkZWZpbmUgR0xfTElORV9XSURUSAkJCQkweDBCMjEKKyNkZWZpbmUgR0xfTElORV9XSURUSF9HUkFOVUxBUklUWQkJMHgwQjIzCisjZGVmaW5lIEdMX0xJTkVfV0lEVEhfUkFOR0UJCQkweDBCMjIKKworLyogUG9seWdvbnMgKi8KKyNkZWZpbmUgR0xfUE9JTlQJCQkJMHgxQjAwCisjZGVmaW5lIEdMX0xJTkUJCQkJCTB4MUIwMQorI2RlZmluZSBHTF9GSUxMCQkJCQkweDFCMDIKKyNkZWZpbmUgR0xfQ1cJCQkJCTB4MDkwMAorI2RlZmluZSBHTF9DQ1cJCQkJCTB4MDkwMQorI2RlZmluZSBHTF9GUk9OVAkJCQkweDA0MDQKKyNkZWZpbmUgR0xfQkFDSwkJCQkJMHgwNDA1CisjZGVmaW5lIEdMX1BPTFlHT05fTU9ERQkJCQkweDBCNDAKKyNkZWZpbmUgR0xfUE9MWUdPTl9TTU9PVEgJCQkweDBCNDEKKyNkZWZpbmUgR0xfUE9MWUdPTl9TVElQUExFCQkJMHgwQjQyCisjZGVmaW5lIEdMX0VER0VfRkxBRwkJCQkweDBCNDMKKyNkZWZpbmUgR0xfQ1VMTF9GQUNFCQkJCTB4MEI0NAorI2RlZmluZSBHTF9DVUxMX0ZBQ0VfTU9ERQkJCTB4MEI0NQorI2RlZmluZSBHTF9GUk9OVF9GQUNFCQkJCTB4MEI0NgorI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IJCTB4ODAzOAorI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9VTklUUwkJCTB4MkEwMAorI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9QT0lOVAkJCTB4MkEwMQorI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9MSU5FCQkJMHgyQTAyCisjZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwJCQkweDgwMzcKKworLyogRGlzcGxheSBMaXN0cyAqLworI2RlZmluZSBHTF9DT01QSUxFCQkJCTB4MTMwMAorI2RlZmluZSBHTF9DT01QSUxFX0FORF9FWEVDVVRFCQkJMHgxMzAxCisjZGVmaW5lIEdMX0xJU1RfQkFTRQkJCQkweDBCMzIKKyNkZWZpbmUgR0xfTElTVF9JTkRFWAkJCQkweDBCMzMKKyNkZWZpbmUgR0xfTElTVF9NT0RFCQkJCTB4MEIzMAorCisvKiBEZXB0aCBidWZmZXIgKi8KKyNkZWZpbmUgR0xfTkVWRVIJCQkJMHgwMjAwCisjZGVmaW5lIEdMX0xFU1MJCQkJCTB4MDIwMQorI2RlZmluZSBHTF9FUVVBTAkJCQkweDAyMDIKKyNkZWZpbmUgR0xfTEVRVUFMCQkJCTB4MDIwMworI2RlZmluZSBHTF9HUkVBVEVSCQkJCTB4MDIwNAorI2RlZmluZSBHTF9OT1RFUVVBTAkJCQkweDAyMDUKKyNkZWZpbmUgR0xfR0VRVUFMCQkJCTB4MDIwNgorI2RlZmluZSBHTF9BTFdBWVMJCQkJMHgwMjA3CisjZGVmaW5lIEdMX0RFUFRIX1RFU1QJCQkJMHgwQjcxCisjZGVmaW5lIEdMX0RFUFRIX0JJVFMJCQkJMHgwRDU2CisjZGVmaW5lIEdMX0RFUFRIX0NMRUFSX1ZBTFVFCQkJMHgwQjczCisjZGVmaW5lIEdMX0RFUFRIX0ZVTkMJCQkJMHgwQjc0CisjZGVmaW5lIEdMX0RFUFRIX1JBTkdFCQkJCTB4MEI3MAorI2RlZmluZSBHTF9ERVBUSF9XUklURU1BU0sJCQkweDBCNzIKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UCQkJMHgxOTAyCisKKy8qIExpZ2h0aW5nICovCisjZGVmaW5lIEdMX0xJR0hUSU5HCQkJCTB4MEI1MAorI2RlZmluZSBHTF9MSUdIVDAJCQkJMHg0MDAwCisjZGVmaW5lIEdMX0xJR0hUMQkJCQkweDQwMDEKKyNkZWZpbmUgR0xfTElHSFQyCQkJCTB4NDAwMgorI2RlZmluZSBHTF9MSUdIVDMJCQkJMHg0MDAzCisjZGVmaW5lIEdMX0xJR0hUNAkJCQkweDQwMDQKKyNkZWZpbmUgR0xfTElHSFQ1CQkJCTB4NDAwNQorI2RlZmluZSBHTF9MSUdIVDYJCQkJMHg0MDA2CisjZGVmaW5lIEdMX0xJR0hUNwkJCQkweDQwMDcKKyNkZWZpbmUgR0xfU1BPVF9FWFBPTkVOVAkJCTB4MTIwNQorI2RlZmluZSBHTF9TUE9UX0NVVE9GRgkJCQkweDEyMDYKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQVRURU5VQVRJT04JCQkweDEyMDcKKyNkZWZpbmUgR0xfTElORUFSX0FUVEVOVUFUSU9OCQkJMHgxMjA4CisjZGVmaW5lIEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTgkJMHgxMjA5CisjZGVmaW5lIEdMX0FNQklFTlQJCQkJMHgxMjAwCisjZGVmaW5lIEdMX0RJRkZVU0UJCQkJMHgxMjAxCisjZGVmaW5lIEdMX1NQRUNVTEFSCQkJCTB4MTIwMgorI2RlZmluZSBHTF9TSElOSU5FU1MJCQkJMHgxNjAxCisjZGVmaW5lIEdMX0VNSVNTSU9OCQkJCTB4MTYwMAorI2RlZmluZSBHTF9QT1NJVElPTgkJCQkweDEyMDMKKyNkZWZpbmUgR0xfU1BPVF9ESVJFQ1RJT04JCQkweDEyMDQKKyNkZWZpbmUgR0xfQU1CSUVOVF9BTkRfRElGRlVTRQkJCTB4MTYwMgorI2RlZmluZSBHTF9DT0xPUl9JTkRFWEVTCQkJMHgxNjAzCisjZGVmaW5lIEdMX0xJR0hUX01PREVMX1RXT19TSURFCQkJMHgwQjUyCisjZGVmaW5lIEdMX0xJR0hUX01PREVMX0xPQ0FMX1ZJRVdFUgkJMHgwQjUxCisjZGVmaW5lIEdMX0xJR0hUX01PREVMX0FNQklFTlQJCQkweDBCNTMKKyNkZWZpbmUgR0xfRlJPTlRfQU5EX0JBQ0sJCQkweDA0MDgKKyNkZWZpbmUgR0xfU0hBREVfTU9ERUwJCQkJMHgwQjU0CisjZGVmaW5lIEdMX0ZMQVQJCQkJCTB4MUQwMAorI2RlZmluZSBHTF9TTU9PVEgJCQkJMHgxRDAxCisjZGVmaW5lIEdMX0NPTE9SX01BVEVSSUFMCQkJMHgwQjU3CisjZGVmaW5lIEdMX0NPTE9SX01BVEVSSUFMX0ZBQ0UJCQkweDBCNTUKKyNkZWZpbmUgR0xfQ09MT1JfTUFURVJJQUxfUEFSQU1FVEVSCQkweDBCNTYKKyNkZWZpbmUgR0xfTk9STUFMSVpFCQkJCTB4MEJBMQorCisvKiBVc2VyIGNsaXBwaW5nIHBsYW5lcyAqLworI2RlZmluZSBHTF9DTElQX1BMQU5FMAkJCQkweDMwMDAKKyNkZWZpbmUgR0xfQ0xJUF9QTEFORTEJCQkJMHgzMDAxCisjZGVmaW5lIEdMX0NMSVBfUExBTkUyCQkJCTB4MzAwMgorI2RlZmluZSBHTF9DTElQX1BMQU5FMwkJCQkweDMwMDMKKyNkZWZpbmUgR0xfQ0xJUF9QTEFORTQJCQkJMHgzMDA0CisjZGVmaW5lIEdMX0NMSVBfUExBTkU1CQkJCTB4MzAwNQorCisvKiBBY2N1bXVsYXRpb24gYnVmZmVyICovCisjZGVmaW5lIEdMX0FDQ1VNX1JFRF9CSVRTCQkJMHgwRDU4CisjZGVmaW5lIEdMX0FDQ1VNX0dSRUVOX0JJVFMJCQkweDBENTkKKyNkZWZpbmUgR0xfQUNDVU1fQkxVRV9CSVRTCQkJMHgwRDVBCisjZGVmaW5lIEdMX0FDQ1VNX0FMUEhBX0JJVFMJCQkweDBENUIKKyNkZWZpbmUgR0xfQUNDVU1fQ0xFQVJfVkFMVUUJCQkweDBCODAKKyNkZWZpbmUgR0xfQUNDVU0JCQkJMHgwMTAwCisjZGVmaW5lIEdMX0FERAkJCQkJMHgwMTA0CisjZGVmaW5lIEdMX0xPQUQJCQkJCTB4MDEwMQorI2RlZmluZSBHTF9NVUxUCQkJCQkweDAxMDMKKyNkZWZpbmUgR0xfUkVUVVJOCQkJCTB4MDEwMgorCisvKiBBbHBoYSB0ZXN0aW5nICovCisjZGVmaW5lIEdMX0FMUEhBX1RFU1QJCQkJMHgwQkMwCisjZGVmaW5lIEdMX0FMUEhBX1RFU1RfUkVGCQkJMHgwQkMyCisjZGVmaW5lIEdMX0FMUEhBX1RFU1RfRlVOQwkJCTB4MEJDMQorCisvKiBCbGVuZGluZyAqLworI2RlZmluZSBHTF9CTEVORAkJCQkweDBCRTIKKyNkZWZpbmUgR0xfQkxFTkRfU1JDCQkJCTB4MEJFMQorI2RlZmluZSBHTF9CTEVORF9EU1QJCQkJMHgwQkUwCisjZGVmaW5lIEdMX1pFUk8JCQkJCTB4MAorI2RlZmluZSBHTF9PTkUJCQkJCTB4MQorI2RlZmluZSBHTF9TUkNfQ09MT1IJCQkJMHgwMzAwCisjZGVmaW5lIEdMX09ORV9NSU5VU19TUkNfQ09MT1IJCQkweDAzMDEKKyNkZWZpbmUgR0xfU1JDX0FMUEhBCQkJCTB4MDMwMgorI2RlZmluZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBCQkJMHgwMzAzCisjZGVmaW5lIEdMX0RTVF9BTFBIQQkJCQkweDAzMDQKKyNkZWZpbmUgR0xfT05FX01JTlVTX0RTVF9BTFBIQQkJCTB4MDMwNQorI2RlZmluZSBHTF9EU1RfQ09MT1IJCQkJMHgwMzA2CisjZGVmaW5lIEdMX09ORV9NSU5VU19EU1RfQ09MT1IJCQkweDAzMDcKKyNkZWZpbmUgR0xfU1JDX0FMUEhBX1NBVFVSQVRFCQkJMHgwMzA4CisKKy8qIFJlbmRlciBNb2RlICovCisjZGVmaW5lIEdMX0ZFRURCQUNLCQkJCTB4MUMwMQorI2RlZmluZSBHTF9SRU5ERVIJCQkJMHgxQzAwCisjZGVmaW5lIEdMX1NFTEVDVAkJCQkweDFDMDIKKworLyogRmVlZGJhY2sgKi8KKyNkZWZpbmUgR0xfMkQJCQkJCTB4MDYwMAorI2RlZmluZSBHTF8zRAkJCQkJMHgwNjAxCisjZGVmaW5lIEdMXzNEX0NPTE9SCQkJCTB4MDYwMgorI2RlZmluZSBHTF8zRF9DT0xPUl9URVhUVVJFCQkJMHgwNjAzCisjZGVmaW5lIEdMXzREX0NPTE9SX1RFWFRVUkUJCQkweDA2MDQKKyNkZWZpbmUgR0xfUE9JTlRfVE9LRU4JCQkJMHgwNzAxCisjZGVmaW5lIEdMX0xJTkVfVE9LRU4JCQkJMHgwNzAyCisjZGVmaW5lIEdMX0xJTkVfUkVTRVRfVE9LRU4JCQkweDA3MDcKKyNkZWZpbmUgR0xfUE9MWUdPTl9UT0tFTgkJCTB4MDcwMworI2RlZmluZSBHTF9CSVRNQVBfVE9LRU4JCQkJMHgwNzA0CisjZGVmaW5lIEdMX0RSQVdfUElYRUxfVE9LRU4JCQkweDA3MDUKKyNkZWZpbmUgR0xfQ09QWV9QSVhFTF9UT0tFTgkJCTB4MDcwNgorI2RlZmluZSBHTF9QQVNTX1RIUk9VR0hfVE9LRU4JCQkweDA3MDAKKyNkZWZpbmUgR0xfRkVFREJBQ0tfQlVGRkVSX1BPSU5URVIJCTB4MERGMAorI2RlZmluZSBHTF9GRUVEQkFDS19CVUZGRVJfU0laRQkJCTB4MERGMQorI2RlZmluZSBHTF9GRUVEQkFDS19CVUZGRVJfVFlQRQkJCTB4MERGMgorCisvKiBTZWxlY3Rpb24gKi8KKyNkZWZpbmUgR0xfU0VMRUNUSU9OX0JVRkZFUl9QT0lOVEVSCQkweDBERjMKKyNkZWZpbmUgR0xfU0VMRUNUSU9OX0JVRkZFUl9TSVpFCQkweDBERjQKKworLyogRm9nICovCisjZGVmaW5lIEdMX0ZPRwkJCQkJMHgwQjYwCisjZGVmaW5lIEdMX0ZPR19NT0RFCQkJCTB4MEI2NQorI2RlZmluZSBHTF9GT0dfREVOU0lUWQkJCQkweDBCNjIKKyNkZWZpbmUgR0xfRk9HX0NPTE9SCQkJCTB4MEI2NgorI2RlZmluZSBHTF9GT0dfSU5ERVgJCQkJMHgwQjYxCisjZGVmaW5lIEdMX0ZPR19TVEFSVAkJCQkweDBCNjMKKyNkZWZpbmUgR0xfRk9HX0VORAkJCQkweDBCNjQKKyNkZWZpbmUgR0xfTElORUFSCQkJCTB4MjYwMQorI2RlZmluZSBHTF9FWFAJCQkJCTB4MDgwMAorI2RlZmluZSBHTF9FWFAyCQkJCQkweDA4MDEKKworLyogTG9naWMgT3BzICovCisjZGVmaW5lIEdMX0xPR0lDX09QCQkJCTB4MEJGMQorI2RlZmluZSBHTF9JTkRFWF9MT0dJQ19PUAkJCTB4MEJGMQorI2RlZmluZSBHTF9DT0xPUl9MT0dJQ19PUAkJCTB4MEJGMgorI2RlZmluZSBHTF9MT0dJQ19PUF9NT0RFCQkJMHgwQkYwCisjZGVmaW5lIEdMX0NMRUFSCQkJCTB4MTUwMAorI2RlZmluZSBHTF9TRVQJCQkJCTB4MTUwRgorI2RlZmluZSBHTF9DT1BZCQkJCQkweDE1MDMKKyNkZWZpbmUgR0xfQ09QWV9JTlZFUlRFRAkJCTB4MTUwQworI2RlZmluZSBHTF9OT09QCQkJCQkweDE1MDUKKyNkZWZpbmUgR0xfSU5WRVJUCQkJCTB4MTUwQQorI2RlZmluZSBHTF9BTkQJCQkJCTB4MTUwMQorI2RlZmluZSBHTF9OQU5ECQkJCQkweDE1MEUKKyNkZWZpbmUgR0xfT1IJCQkJCTB4MTUwNworI2RlZmluZSBHTF9OT1IJCQkJCTB4MTUwOAorI2RlZmluZSBHTF9YT1IJCQkJCTB4MTUwNgorI2RlZmluZSBHTF9FUVVJVgkJCQkweDE1MDkKKyNkZWZpbmUgR0xfQU5EX1JFVkVSU0UJCQkJMHgxNTAyCisjZGVmaW5lIEdMX0FORF9JTlZFUlRFRAkJCQkweDE1MDQKKyNkZWZpbmUgR0xfT1JfUkVWRVJTRQkJCQkweDE1MEIKKyNkZWZpbmUgR0xfT1JfSU5WRVJURUQJCQkJMHgxNTBECisKKy8qIFN0ZW5jaWwgKi8KKyNkZWZpbmUgR0xfU1RFTkNJTF9CSVRTCQkJCTB4MEQ1NworI2RlZmluZSBHTF9TVEVOQ0lMX1RFU1QJCQkJMHgwQjkwCisjZGVmaW5lIEdMX1NURU5DSUxfQ0xFQVJfVkFMVUUJCQkweDBCOTEKKyNkZWZpbmUgR0xfU1RFTkNJTF9GVU5DCQkJCTB4MEI5MgorI2RlZmluZSBHTF9TVEVOQ0lMX1ZBTFVFX01BU0sJCQkweDBCOTMKKyNkZWZpbmUgR0xfU1RFTkNJTF9GQUlMCQkJCTB4MEI5NAorI2RlZmluZSBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfRkFJTAkJMHgwQjk1CisjZGVmaW5lIEdMX1NURU5DSUxfUEFTU19ERVBUSF9QQVNTCQkweDBCOTYKKyNkZWZpbmUgR0xfU1RFTkNJTF9SRUYJCQkJMHgwQjk3CisjZGVmaW5lIEdMX1NURU5DSUxfV1JJVEVNQVNLCQkJMHgwQjk4CisjZGVmaW5lIEdMX1NURU5DSUxfSU5ERVgJCQkweDE5MDEKKyNkZWZpbmUgR0xfS0VFUAkJCQkJMHgxRTAwCisjZGVmaW5lIEdMX1JFUExBQ0UJCQkJMHgxRTAxCisjZGVmaW5lIEdMX0lOQ1IJCQkJCTB4MUUwMgorI2RlZmluZSBHTF9ERUNSCQkJCQkweDFFMDMKKworLyogQnVmZmVycywgUGl4ZWwgRHJhd2luZy9SZWFkaW5nICovCisjZGVmaW5lIEdMX05PTkUJCQkJCTB4MAorI2RlZmluZSBHTF9MRUZUCQkJCQkweDA0MDYKKyNkZWZpbmUgR0xfUklHSFQJCQkJMHgwNDA3CisvKkdMX0ZST05UCQkJCQkweDA0MDQgKi8KKy8qR0xfQkFDSwkJCQkJMHgwNDA1ICovCisvKkdMX0ZST05UX0FORF9CQUNLCQkJCTB4MDQwOCAqLworI2RlZmluZSBHTF9GUk9OVF9MRUZUCQkJCTB4MDQwMAorI2RlZmluZSBHTF9GUk9OVF9SSUdIVAkJCQkweDA0MDEKKyNkZWZpbmUgR0xfQkFDS19MRUZUCQkJCTB4MDQwMgorI2RlZmluZSBHTF9CQUNLX1JJR0hUCQkJCTB4MDQwMworI2RlZmluZSBHTF9BVVgwCQkJCQkweDA0MDkKKyNkZWZpbmUgR0xfQVVYMQkJCQkJMHgwNDBBCisjZGVmaW5lIEdMX0FVWDIJCQkJCTB4MDQwQgorI2RlZmluZSBHTF9BVVgzCQkJCQkweDA0MEMKKyNkZWZpbmUgR0xfQ09MT1JfSU5ERVgJCQkJMHgxOTAwCisjZGVmaW5lIEdMX1JFRAkJCQkJMHgxOTAzCisjZGVmaW5lIEdMX0dSRUVOCQkJCTB4MTkwNAorI2RlZmluZSBHTF9CTFVFCQkJCQkweDE5MDUKKyNkZWZpbmUgR0xfQUxQSEEJCQkJMHgxOTA2CisjZGVmaW5lIEdMX0xVTUlOQU5DRQkJCQkweDE5MDkKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBCQkJMHgxOTBBCisjZGVmaW5lIEdMX0FMUEhBX0JJVFMJCQkJMHgwRDU1CisjZGVmaW5lIEdMX1JFRF9CSVRTCQkJCTB4MEQ1MgorI2RlZmluZSBHTF9HUkVFTl9CSVRTCQkJCTB4MEQ1MworI2RlZmluZSBHTF9CTFVFX0JJVFMJCQkJMHgwRDU0CisjZGVmaW5lIEdMX0lOREVYX0JJVFMJCQkJMHgwRDUxCisjZGVmaW5lIEdMX1NVQlBJWEVMX0JJVFMJCQkweDBENTAKKyNkZWZpbmUgR0xfQVVYX0JVRkZFUlMJCQkJMHgwQzAwCisjZGVmaW5lIEdMX1JFQURfQlVGRkVSCQkJCTB4MEMwMgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUgkJCQkweDBDMDEKKyNkZWZpbmUgR0xfRE9VQkxFQlVGRkVSCQkJCTB4MEMzMgorI2RlZmluZSBHTF9TVEVSRU8JCQkJMHgwQzMzCisjZGVmaW5lIEdMX0JJVE1BUAkJCQkweDFBMDAKKyNkZWZpbmUgR0xfQ09MT1IJCQkJMHgxODAwCisjZGVmaW5lIEdMX0RFUFRICQkJCTB4MTgwMQorI2RlZmluZSBHTF9TVEVOQ0lMCQkJCTB4MTgwMgorI2RlZmluZSBHTF9ESVRIRVIJCQkJMHgwQkQwCisjZGVmaW5lIEdMX1JHQgkJCQkJMHgxOTA3CisjZGVmaW5lIEdMX1JHQkEJCQkJCTB4MTkwOAorCisvKiBJbXBsZW1lbnRhdGlvbiBsaW1pdHMgKi8KKyNkZWZpbmUgR0xfTUFYX0xJU1RfTkVTVElORwkJCTB4MEIzMQorI2RlZmluZSBHTF9NQVhfRVZBTF9PUkRFUgkJCTB4MEQzMAorI2RlZmluZSBHTF9NQVhfTElHSFRTCQkJCTB4MEQzMQorI2RlZmluZSBHTF9NQVhfQ0xJUF9QTEFORVMJCQkweDBEMzIKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfU0laRQkJCTB4MEQzMworI2RlZmluZSBHTF9NQVhfUElYRUxfTUFQX1RBQkxFCQkJMHgwRDM0CisjZGVmaW5lIEdMX01BWF9BVFRSSUJfU1RBQ0tfREVQVEgJCTB4MEQzNQorI2RlZmluZSBHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRICQkweDBEMzYKKyNkZWZpbmUgR0xfTUFYX05BTUVfU1RBQ0tfREVQVEgJCQkweDBEMzcKKyNkZWZpbmUgR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEgJCTB4MEQzOAorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSAkJMHgwRDM5CisjZGVmaW5lIEdMX01BWF9WSUVXUE9SVF9ESU1TCQkJMHgwRDNBCisjZGVmaW5lIEdMX01BWF9DTElFTlRfQVRUUklCX1NUQUNLX0RFUFRICTB4MEQzQgorCisvKiBHZXRzICovCisjZGVmaW5lIEdMX0FUVFJJQl9TVEFDS19ERVBUSAkJCTB4MEJCMAorI2RlZmluZSBHTF9DTElFTlRfQVRUUklCX1NUQUNLX0RFUFRICQkweDBCQjEKKyNkZWZpbmUgR0xfQ09MT1JfQ0xFQVJfVkFMVUUJCQkweDBDMjIKKyNkZWZpbmUgR0xfQ09MT1JfV1JJVEVNQVNLCQkJMHgwQzIzCisjZGVmaW5lIEdMX0NVUlJFTlRfSU5ERVgJCQkweDBCMDEKKyNkZWZpbmUgR0xfQ1VSUkVOVF9DT0xPUgkJCTB4MEIwMAorI2RlZmluZSBHTF9DVVJSRU5UX05PUk1BTAkJCTB4MEIwMgorI2RlZmluZSBHTF9DVVJSRU5UX1JBU1RFUl9DT0xPUgkJCTB4MEIwNAorI2RlZmluZSBHTF9DVVJSRU5UX1JBU1RFUl9ESVNUQU5DRQkJMHgwQjA5CisjZGVmaW5lIEdMX0NVUlJFTlRfUkFTVEVSX0lOREVYCQkJMHgwQjA1CisjZGVmaW5lIEdMX0NVUlJFTlRfUkFTVEVSX1BPU0lUSU9OCQkweDBCMDcKKyNkZWZpbmUgR0xfQ1VSUkVOVF9SQVNURVJfVEVYVFVSRV9DT09SRFMJMHgwQjA2CisjZGVmaW5lIEdMX0NVUlJFTlRfUkFTVEVSX1BPU0lUSU9OX1ZBTElECTB4MEIwOAorI2RlZmluZSBHTF9DVVJSRU5UX1RFWFRVUkVfQ09PUkRTCQkweDBCMDMKKyNkZWZpbmUgR0xfSU5ERVhfQ0xFQVJfVkFMVUUJCQkweDBDMjAKKyNkZWZpbmUgR0xfSU5ERVhfTU9ERQkJCQkweDBDMzAKKyNkZWZpbmUgR0xfSU5ERVhfV1JJVEVNQVNLCQkJMHgwQzIxCisjZGVmaW5lIEdMX01PREVMVklFV19NQVRSSVgJCQkweDBCQTYKKyNkZWZpbmUgR0xfTU9ERUxWSUVXX1NUQUNLX0RFUFRICQkweDBCQTMKKyNkZWZpbmUgR0xfTkFNRV9TVEFDS19ERVBUSAkJCTB4MEQ3MAorI2RlZmluZSBHTF9QUk9KRUNUSU9OX01BVFJJWAkJCTB4MEJBNworI2RlZmluZSBHTF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRICQkweDBCQTQKKyNkZWZpbmUgR0xfUkVOREVSX01PREUJCQkJMHgwQzQwCisjZGVmaW5lIEdMX1JHQkFfTU9ERQkJCQkweDBDMzEKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQVRSSVgJCQkweDBCQTgKKyNkZWZpbmUgR0xfVEVYVFVSRV9TVEFDS19ERVBUSAkJCTB4MEJBNQorI2RlZmluZSBHTF9WSUVXUE9SVAkJCQkweDBCQTIKKworLyogRXZhbHVhdG9ycyAqLworI2RlZmluZSBHTF9BVVRPX05PUk1BTAkJCQkweDBEODAKKyNkZWZpbmUgR0xfTUFQMV9DT0xPUl80CQkJCTB4MEQ5MAorI2RlZmluZSBHTF9NQVAxX0lOREVYCQkJCTB4MEQ5MQorI2RlZmluZSBHTF9NQVAxX05PUk1BTAkJCQkweDBEOTIKKyNkZWZpbmUgR0xfTUFQMV9URVhUVVJFX0NPT1JEXzEJCQkweDBEOTMKKyNkZWZpbmUgR0xfTUFQMV9URVhUVVJFX0NPT1JEXzIJCQkweDBEOTQKKyNkZWZpbmUgR0xfTUFQMV9URVhUVVJFX0NPT1JEXzMJCQkweDBEOTUKKyNkZWZpbmUgR0xfTUFQMV9URVhUVVJFX0NPT1JEXzQJCQkweDBEOTYKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfMwkJCTB4MEQ5NworI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF80CQkJMHgwRDk4CisjZGVmaW5lIEdMX01BUDJfQ09MT1JfNAkJCQkweDBEQjAKKyNkZWZpbmUgR0xfTUFQMl9JTkRFWAkJCQkweDBEQjEKKyNkZWZpbmUgR0xfTUFQMl9OT1JNQUwJCQkJMHgwREIyCisjZGVmaW5lIEdMX01BUDJfVEVYVFVSRV9DT09SRF8xCQkJMHgwREIzCisjZGVmaW5lIEdMX01BUDJfVEVYVFVSRV9DT09SRF8yCQkJMHgwREI0CisjZGVmaW5lIEdMX01BUDJfVEVYVFVSRV9DT09SRF8zCQkJMHgwREI1CisjZGVmaW5lIEdMX01BUDJfVEVYVFVSRV9DT09SRF80CQkJMHgwREI2CisjZGVmaW5lIEdMX01BUDJfVkVSVEVYXzMJCQkweDBEQjcKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfNAkJCTB4MERCOAorI2RlZmluZSBHTF9NQVAxX0dSSURfRE9NQUlOCQkJMHgwREQwCisjZGVmaW5lIEdMX01BUDFfR1JJRF9TRUdNRU5UUwkJCTB4MEREMQorI2RlZmluZSBHTF9NQVAyX0dSSURfRE9NQUlOCQkJMHgwREQyCisjZGVmaW5lIEdMX01BUDJfR1JJRF9TRUdNRU5UUwkJCTB4MEREMworI2RlZmluZSBHTF9DT0VGRgkJCQkweDBBMDAKKyNkZWZpbmUgR0xfT1JERVIJCQkJMHgwQTAxCisjZGVmaW5lIEdMX0RPTUFJTgkJCQkweDBBMDIKKworLyogSGludHMgKi8KKyNkZWZpbmUgR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5UCQkweDBDNTAKKyNkZWZpbmUgR0xfUE9JTlRfU01PT1RIX0hJTlQJCQkweDBDNTEKKyNkZWZpbmUgR0xfTElORV9TTU9PVEhfSElOVAkJCTB4MEM1MgorI2RlZmluZSBHTF9QT0xZR09OX1NNT09USF9ISU5UCQkJMHgwQzUzCisjZGVmaW5lIEdMX0ZPR19ISU5UCQkJCTB4MEM1NAorI2RlZmluZSBHTF9ET05UX0NBUkUJCQkJMHgxMTAwCisjZGVmaW5lIEdMX0ZBU1RFU1QJCQkJMHgxMTAxCisjZGVmaW5lIEdMX05JQ0VTVAkJCQkweDExMDIKKworLyogU2Npc3NvciBib3ggKi8KKyNkZWZpbmUgR0xfU0NJU1NPUl9CT1gJCQkJMHgwQzEwCisjZGVmaW5lIEdMX1NDSVNTT1JfVEVTVAkJCQkweDBDMTEKKworLyogUGl4ZWwgTW9kZSAvIFRyYW5zZmVyICovCisjZGVmaW5lIEdMX01BUF9DT0xPUgkJCQkweDBEMTAKKyNkZWZpbmUgR0xfTUFQX1NURU5DSUwJCQkJMHgwRDExCisjZGVmaW5lIEdMX0lOREVYX1NISUZUCQkJCTB4MEQxMgorI2RlZmluZSBHTF9JTkRFWF9PRkZTRVQJCQkJMHgwRDEzCisjZGVmaW5lIEdMX1JFRF9TQ0FMRQkJCQkweDBEMTQKKyNkZWZpbmUgR0xfUkVEX0JJQVMJCQkJMHgwRDE1CisjZGVmaW5lIEdMX0dSRUVOX1NDQUxFCQkJCTB4MEQxOAorI2RlZmluZSBHTF9HUkVFTl9CSUFTCQkJCTB4MEQxOQorI2RlZmluZSBHTF9CTFVFX1NDQUxFCQkJCTB4MEQxQQorI2RlZmluZSBHTF9CTFVFX0JJQVMJCQkJMHgwRDFCCisjZGVmaW5lIEdMX0FMUEhBX1NDQUxFCQkJCTB4MEQxQworI2RlZmluZSBHTF9BTFBIQV9CSUFTCQkJCTB4MEQxRAorI2RlZmluZSBHTF9ERVBUSF9TQ0FMRQkJCQkweDBEMUUKKyNkZWZpbmUgR0xfREVQVEhfQklBUwkJCQkweDBEMUYKKyNkZWZpbmUgR0xfUElYRUxfTUFQX1NfVE9fU19TSVpFCQkweDBDQjEKKyNkZWZpbmUgR0xfUElYRUxfTUFQX0lfVE9fSV9TSVpFCQkweDBDQjAKKyNkZWZpbmUgR0xfUElYRUxfTUFQX0lfVE9fUl9TSVpFCQkweDBDQjIKKyNkZWZpbmUgR0xfUElYRUxfTUFQX0lfVE9fR19TSVpFCQkweDBDQjMKKyNkZWZpbmUgR0xfUElYRUxfTUFQX0lfVE9fQl9TSVpFCQkweDBDQjQKKyNkZWZpbmUgR0xfUElYRUxfTUFQX0lfVE9fQV9TSVpFCQkweDBDQjUKKyNkZWZpbmUgR0xfUElYRUxfTUFQX1JfVE9fUl9TSVpFCQkweDBDQjYKKyNkZWZpbmUgR0xfUElYRUxfTUFQX0dfVE9fR19TSVpFCQkweDBDQjcKKyNkZWZpbmUgR0xfUElYRUxfTUFQX0JfVE9fQl9TSVpFCQkweDBDQjgKKyNkZWZpbmUgR0xfUElYRUxfTUFQX0FfVE9fQV9TSVpFCQkweDBDQjkKKyNkZWZpbmUgR0xfUElYRUxfTUFQX1NfVE9fUwkJCTB4MEM3MQorI2RlZmluZSBHTF9QSVhFTF9NQVBfSV9UT19JCQkJMHgwQzcwCisjZGVmaW5lIEdMX1BJWEVMX01BUF9JX1RPX1IJCQkweDBDNzIKKyNkZWZpbmUgR0xfUElYRUxfTUFQX0lfVE9fRwkJCTB4MEM3MworI2RlZmluZSBHTF9QSVhFTF9NQVBfSV9UT19CCQkJMHgwQzc0CisjZGVmaW5lIEdMX1BJWEVMX01BUF9JX1RPX0EJCQkweDBDNzUKKyNkZWZpbmUgR0xfUElYRUxfTUFQX1JfVE9fUgkJCTB4MEM3NgorI2RlZmluZSBHTF9QSVhFTF9NQVBfR19UT19HCQkJMHgwQzc3CisjZGVmaW5lIEdMX1BJWEVMX01BUF9CX1RPX0IJCQkweDBDNzgKKyNkZWZpbmUgR0xfUElYRUxfTUFQX0FfVE9fQQkJCTB4MEM3OQorI2RlZmluZSBHTF9QQUNLX0FMSUdOTUVOVAkJCTB4MEQwNQorI2RlZmluZSBHTF9QQUNLX0xTQl9GSVJTVAkJCTB4MEQwMQorI2RlZmluZSBHTF9QQUNLX1JPV19MRU5HVEgJCQkweDBEMDIKKyNkZWZpbmUgR0xfUEFDS19TS0lQX1BJWEVMUwkJCTB4MEQwNAorI2RlZmluZSBHTF9QQUNLX1NLSVBfUk9XUwkJCTB4MEQwMworI2RlZmluZSBHTF9QQUNLX1NXQVBfQllURVMJCQkweDBEMDAKKyNkZWZpbmUgR0xfVU5QQUNLX0FMSUdOTUVOVAkJCTB4MENGNQorI2RlZmluZSBHTF9VTlBBQ0tfTFNCX0ZJUlNUCQkJMHgwQ0YxCisjZGVmaW5lIEdMX1VOUEFDS19ST1dfTEVOR1RICQkJMHgwQ0YyCisjZGVmaW5lIEdMX1VOUEFDS19TS0lQX1BJWEVMUwkJCTB4MENGNAorI2RlZmluZSBHTF9VTlBBQ0tfU0tJUF9ST1dTCQkJMHgwQ0YzCisjZGVmaW5lIEdMX1VOUEFDS19TV0FQX0JZVEVTCQkJMHgwQ0YwCisjZGVmaW5lIEdMX1pPT01fWAkJCQkweDBEMTYKKyNkZWZpbmUgR0xfWk9PTV9ZCQkJCTB4MEQxNworCisvKiBUZXh0dXJlIG1hcHBpbmcgKi8KKyNkZWZpbmUgR0xfVEVYVFVSRV9FTlYJCQkJMHgyMzAwCisjZGVmaW5lIEdMX1RFWFRVUkVfRU5WX01PREUJCQkweDIyMDAKKyNkZWZpbmUgR0xfVEVYVFVSRV8xRAkJCQkweDBERTAKKyNkZWZpbmUgR0xfVEVYVFVSRV8yRAkJCQkweDBERTEKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1MJCQkweDI4MDIKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1QJCQkweDI4MDMKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQUdfRklMVEVSCQkJMHgyODAwCisjZGVmaW5lIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUgkJCTB4MjgwMQorI2RlZmluZSBHTF9URVhUVVJFX0VOVl9DT0xPUgkJCTB4MjIwMQorI2RlZmluZSBHTF9URVhUVVJFX0dFTl9TCQkJMHgwQzYwCisjZGVmaW5lIEdMX1RFWFRVUkVfR0VOX1QJCQkweDBDNjEKKyNkZWZpbmUgR0xfVEVYVFVSRV9HRU5fUgkJCTB4MEM2MgorI2RlZmluZSBHTF9URVhUVVJFX0dFTl9RCQkJMHgwQzYzCisjZGVmaW5lIEdMX1RFWFRVUkVfR0VOX01PREUJCQkweDI1MDAKKyNkZWZpbmUgR0xfVEVYVFVSRV9CT1JERVJfQ09MT1IJCQkweDEwMDQKKyNkZWZpbmUgR0xfVEVYVFVSRV9XSURUSAkJCTB4MTAwMAorI2RlZmluZSBHTF9URVhUVVJFX0hFSUdIVAkJCTB4MTAwMQorI2RlZmluZSBHTF9URVhUVVJFX0JPUkRFUgkJCTB4MTAwNQorI2RlZmluZSBHTF9URVhUVVJFX0NPTVBPTkVOVFMJCQkweDEwMDMKKyNkZWZpbmUgR0xfVEVYVFVSRV9SRURfU0laRQkJCTB4ODA1QworI2RlZmluZSBHTF9URVhUVVJFX0dSRUVOX1NJWkUJCQkweDgwNUQKKyNkZWZpbmUgR0xfVEVYVFVSRV9CTFVFX1NJWkUJCQkweDgwNUUKKyNkZWZpbmUgR0xfVEVYVFVSRV9BTFBIQV9TSVpFCQkJMHg4MDVGCisjZGVmaW5lIEdMX1RFWFRVUkVfTFVNSU5BTkNFX1NJWkUJCTB4ODA2MAorI2RlZmluZSBHTF9URVhUVVJFX0lOVEVOU0lUWV9TSVpFCQkweDgwNjEKKyNkZWZpbmUgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVAkJMHgyNzAwCisjZGVmaW5lIEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUgkJMHgyNzAyCisjZGVmaW5lIEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVAkJMHgyNzAxCisjZGVmaW5lIEdMX0xJTkVBUl9NSVBNQVBfTElORUFSCQkJMHgyNzAzCisjZGVmaW5lIEdMX09CSkVDVF9MSU5FQVIJCQkweDI0MDEKKyNkZWZpbmUgR0xfT0JKRUNUX1BMQU5FCQkJCTB4MjUwMQorI2RlZmluZSBHTF9FWUVfTElORUFSCQkJCTB4MjQwMAorI2RlZmluZSBHTF9FWUVfUExBTkUJCQkJMHgyNTAyCisjZGVmaW5lIEdMX1NQSEVSRV9NQVAJCQkJMHgyNDAyCisjZGVmaW5lIEdMX0RFQ0FMCQkJCTB4MjEwMQorI2RlZmluZSBHTF9NT0RVTEFURQkJCQkweDIxMDAKKyNkZWZpbmUgR0xfTkVBUkVTVAkJCQkweDI2MDAKKyNkZWZpbmUgR0xfUkVQRUFUCQkJCTB4MjkwMQorI2RlZmluZSBHTF9DTEFNUAkJCQkweDI5MDAKKyNkZWZpbmUgR0xfUwkJCQkJMHgyMDAwCisjZGVmaW5lIEdMX1QJCQkJCTB4MjAwMQorI2RlZmluZSBHTF9SCQkJCQkweDIwMDIKKyNkZWZpbmUgR0xfUQkJCQkJMHgyMDAzCisKKy8qIFV0aWxpdHkgKi8KKyNkZWZpbmUgR0xfVkVORE9SCQkJCTB4MUYwMAorI2RlZmluZSBHTF9SRU5ERVJFUgkJCQkweDFGMDEKKyNkZWZpbmUgR0xfVkVSU0lPTgkJCQkweDFGMDIKKyNkZWZpbmUgR0xfRVhURU5TSU9OUwkJCQkweDFGMDMKKworLyogRXJyb3JzICovCisjZGVmaW5lIEdMX05PX0VSUk9SIAkJCQkweDAKKyNkZWZpbmUgR0xfSU5WQUxJRF9FTlVNCQkJCTB4MDUwMAorI2RlZmluZSBHTF9JTlZBTElEX1ZBTFVFCQkJMHgwNTAxCisjZGVmaW5lIEdMX0lOVkFMSURfT1BFUkFUSU9OCQkJMHgwNTAyCisjZGVmaW5lIEdMX1NUQUNLX09WRVJGTE9XCQkJMHgwNTAzCisjZGVmaW5lIEdMX1NUQUNLX1VOREVSRkxPVwkJCTB4MDUwNAorI2RlZmluZSBHTF9PVVRfT0ZfTUVNT1JZCQkJMHgwNTA1CisKKy8qIGdsUHVzaC9Qb3BBdHRyaWIgYml0cyAqLworI2RlZmluZSBHTF9DVVJSRU5UX0JJVAkJCQkweDAwMDAwMDAxCisjZGVmaW5lIEdMX1BPSU5UX0JJVAkJCQkweDAwMDAwMDAyCisjZGVmaW5lIEdMX0xJTkVfQklUCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgR0xfUE9MWUdPTl9CSVQJCQkJMHgwMDAwMDAwOAorI2RlZmluZSBHTF9QT0xZR09OX1NUSVBQTEVfQklUCQkJMHgwMDAwMDAxMAorI2RlZmluZSBHTF9QSVhFTF9NT0RFX0JJVAkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgR0xfTElHSFRJTkdfQklUCQkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgR0xfRk9HX0JJVAkJCQkweDAwMDAwMDgwCisjZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQJCQkweDAwMDAwMTAwCisjZGVmaW5lIEdMX0FDQ1VNX0JVRkZFUl9CSVQJCQkweDAwMDAwMjAwCisjZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVAkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgR0xfVklFV1BPUlRfQklUCQkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0JJVAkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgR0xfRU5BQkxFX0JJVAkJCQkweDAwMDAyMDAwCisjZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQJCQkweDAwMDA0MDAwCisjZGVmaW5lIEdMX0hJTlRfQklUCQkJCTB4MDAwMDgwMDAKKyNkZWZpbmUgR0xfRVZBTF9CSVQJCQkJMHgwMDAxMDAwMAorI2RlZmluZSBHTF9MSVNUX0JJVAkJCQkweDAwMDIwMDAwCisjZGVmaW5lIEdMX1RFWFRVUkVfQklUCQkJCTB4MDAwNDAwMDAKKyNkZWZpbmUgR0xfU0NJU1NPUl9CSVQJCQkJMHgwMDA4MDAwMAorI2RlZmluZSBHTF9BTExfQVRUUklCX0JJVFMJCQkweDAwMEZGRkZGCisKKworLyogT3BlbkdMIDEuMSAqLworI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFXzFECQkJMHg4MDYzCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfMkQJCQkweDgwNjQKKyNkZWZpbmUgR0xfVEVYVFVSRV9QUklPUklUWQkJCTB4ODA2NgorI2RlZmluZSBHTF9URVhUVVJFX1JFU0lERU5UCQkJMHg4MDY3CisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18xRAkJCTB4ODA2OAorI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfMkQJCQkweDgwNjkKKyNkZWZpbmUgR0xfVEVYVFVSRV9JTlRFUk5BTF9GT1JNQVQJCTB4MTAwMworI2RlZmluZSBHTF9BTFBIQTQJCQkJMHg4MDNCCisjZGVmaW5lIEdMX0FMUEhBOAkJCQkweDgwM0MKKyNkZWZpbmUgR0xfQUxQSEExMgkJCQkweDgwM0QKKyNkZWZpbmUgR0xfQUxQSEExNgkJCQkweDgwM0UKKyNkZWZpbmUgR0xfTFVNSU5BTkNFNAkJCQkweDgwM0YKKyNkZWZpbmUgR0xfTFVNSU5BTkNFOAkJCQkweDgwNDAKKyNkZWZpbmUgR0xfTFVNSU5BTkNFMTIJCQkJMHg4MDQxCisjZGVmaW5lIEdMX0xVTUlOQU5DRTE2CQkJCTB4ODA0MgorI2RlZmluZSBHTF9MVU1JTkFOQ0U0X0FMUEhBNAkJCTB4ODA0MworI2RlZmluZSBHTF9MVU1JTkFOQ0U2X0FMUEhBMgkJCTB4ODA0NAorI2RlZmluZSBHTF9MVU1JTkFOQ0U4X0FMUEhBOAkJCTB4ODA0NQorI2RlZmluZSBHTF9MVU1JTkFOQ0UxMl9BTFBIQTQJCQkweDgwNDYKKyNkZWZpbmUgR0xfTFVNSU5BTkNFMTJfQUxQSEExMgkJCTB4ODA0NworI2RlZmluZSBHTF9MVU1JTkFOQ0UxNl9BTFBIQTE2CQkJMHg4MDQ4CisjZGVmaW5lIEdMX0lOVEVOU0lUWQkJCQkweDgwNDkKKyNkZWZpbmUgR0xfSU5URU5TSVRZNAkJCQkweDgwNEEKKyNkZWZpbmUgR0xfSU5URU5TSVRZOAkJCQkweDgwNEIKKyNkZWZpbmUgR0xfSU5URU5TSVRZMTIJCQkJMHg4MDRDCisjZGVmaW5lIEdMX0lOVEVOU0lUWTE2CQkJCTB4ODA0RAorI2RlZmluZSBHTF9SM19HM19CMgkJCQkweDJBMTAKKyNkZWZpbmUgR0xfUkdCNAkJCQkJMHg4MDRGCisjZGVmaW5lIEdMX1JHQjUJCQkJCTB4ODA1MAorI2RlZmluZSBHTF9SR0I4CQkJCQkweDgwNTEKKyNkZWZpbmUgR0xfUkdCMTAJCQkJMHg4MDUyCisjZGVmaW5lIEdMX1JHQjEyCQkJCTB4ODA1MworI2RlZmluZSBHTF9SR0IxNgkJCQkweDgwNTQKKyNkZWZpbmUgR0xfUkdCQTIJCQkJMHg4MDU1CisjZGVmaW5lIEdMX1JHQkE0CQkJCTB4ODA1NgorI2RlZmluZSBHTF9SR0I1X0ExCQkJCTB4ODA1NworI2RlZmluZSBHTF9SR0JBOAkJCQkweDgwNTgKKyNkZWZpbmUgR0xfUkdCMTBfQTIJCQkJMHg4MDU5CisjZGVmaW5lIEdMX1JHQkExMgkJCQkweDgwNUEKKyNkZWZpbmUgR0xfUkdCQTE2CQkJCTB4ODA1QgorI2RlZmluZSBHTF9DTElFTlRfUElYRUxfU1RPUkVfQklUCQkweDAwMDAwMDAxCisjZGVmaW5lIEdMX0NMSUVOVF9WRVJURVhfQVJSQVlfQklUCQkweDAwMDAwMDAyCisjZGVmaW5lIEdMX0FMTF9DTElFTlRfQVRUUklCX0JJVFMgCQkweEZGRkZGRkZGCisjZGVmaW5lIEdMX0NMSUVOVF9BTExfQVRUUklCX0JJVFMgCQkweEZGRkZGRkZGCisKKworCisvKgorICogTWlzY2VsbGFuZW91cworICovCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENsZWFySW5kZXgoIEdMZmxvYXQgYyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDbGVhckNvbG9yKCBHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDbGVhciggR0xiaXRmaWVsZCBtYXNrICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEluZGV4TWFzayggR0x1aW50IG1hc2sgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3JNYXNrKCBHTGJvb2xlYW4gcmVkLCBHTGJvb2xlYW4gZ3JlZW4sIEdMYm9vbGVhbiBibHVlLCBHTGJvb2xlYW4gYWxwaGEgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQWxwaGFGdW5jKCBHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEJsZW5kRnVuYyggR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbExvZ2ljT3AoIEdMZW51bSBvcGNvZGUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ3VsbEZhY2UoIEdMZW51bSBtb2RlICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEZyb250RmFjZSggR0xlbnVtIG1vZGUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUG9pbnRTaXplKCBHTGZsb2F0IHNpemUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTGluZVdpZHRoKCBHTGZsb2F0IHdpZHRoICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbExpbmVTdGlwcGxlKCBHTGludCBmYWN0b3IsIEdMdXNob3J0IHBhdHRlcm4gKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUG9seWdvbk1vZGUoIEdMZW51bSBmYWNlLCBHTGVudW0gbW9kZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQb2x5Z29uT2Zmc2V0KCBHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQb2x5Z29uU3RpcHBsZSggY29uc3QgR0x1Ynl0ZSAqbWFzayApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRQb2x5Z29uU3RpcHBsZSggR0x1Ynl0ZSAqbWFzayApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xFZGdlRmxhZyggR0xib29sZWFuIGZsYWcgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRWRnZUZsYWd2KCBjb25zdCBHTGJvb2xlYW4gKmZsYWcgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsU2Npc3NvciggR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDbGlwUGxhbmUoIEdMZW51bSBwbGFuZSwgY29uc3QgR0xkb3VibGUgKmVxdWF0aW9uICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldENsaXBQbGFuZSggR0xlbnVtIHBsYW5lLCBHTGRvdWJsZSAqZXF1YXRpb24gKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRHJhd0J1ZmZlciggR0xlbnVtIG1vZGUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmVhZEJ1ZmZlciggR0xlbnVtIG1vZGUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRW5hYmxlKCBHTGVudW0gY2FwICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbERpc2FibGUoIEdMZW51bSBjYXAgKTsKKworR0xBUEkgR0xib29sZWFuIEdMQVBJRU5UUlkgZ2xJc0VuYWJsZWQoIEdMZW51bSBjYXAgKTsKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xFbmFibGVDbGllbnRTdGF0ZSggR0xlbnVtIGNhcCApOyAgLyogMS4xICovCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbERpc2FibGVDbGllbnRTdGF0ZSggR0xlbnVtIGNhcCApOyAgLyogMS4xICovCisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0Qm9vbGVhbnYoIEdMZW51bSBwbmFtZSwgR0xib29sZWFuICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0RG91YmxldiggR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldEZsb2F0diggR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0SW50ZWdlcnYoIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFB1c2hBdHRyaWIoIEdMYml0ZmllbGQgbWFzayApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQb3BBdHRyaWIoIHZvaWQgKTsKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQdXNoQ2xpZW50QXR0cmliKCBHTGJpdGZpZWxkIG1hc2sgKTsgIC8qIDEuMSAqLworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQb3BDbGllbnRBdHRyaWIoIHZvaWQgKTsgIC8qIDEuMSAqLworCisKK0dMQVBJIEdMaW50IEdMQVBJRU5UUlkgZ2xSZW5kZXJNb2RlKCBHTGVudW0gbW9kZSApOworCitHTEFQSSBHTGVudW0gR0xBUElFTlRSWSBnbEdldEVycm9yKCB2b2lkICk7CisKK0dMQVBJIGNvbnN0IEdMdWJ5dGUgKiBHTEFQSUVOVFJZIGdsR2V0U3RyaW5nKCBHTGVudW0gbmFtZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xGaW5pc2goIHZvaWQgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRmx1c2goIHZvaWQgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsSGludCggR0xlbnVtIHRhcmdldCwgR0xlbnVtIG1vZGUgKTsKKworCisvKgorICogRGVwdGggQnVmZmVyCisgKi8KKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ2xlYXJEZXB0aCggR0xjbGFtcGQgZGVwdGggKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRGVwdGhGdW5jKCBHTGVudW0gZnVuYyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xEZXB0aE1hc2soIEdMYm9vbGVhbiBmbGFnICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbERlcHRoUmFuZ2UoIEdMY2xhbXBkIG5lYXJfdmFsLCBHTGNsYW1wZCBmYXJfdmFsICk7CisKKworLyoKKyAqIEFjY3VtdWxhdGlvbiBCdWZmZXIKKyAqLworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDbGVhckFjY3VtKCBHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlLCBHTGZsb2F0IGFscGhhICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEFjY3VtKCBHTGVudW0gb3AsIEdMZmxvYXQgdmFsdWUgKTsKKworCisvKgorICogVHJhbnNmb3JtYXRpb24KKyAqLworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNYXRyaXhNb2RlKCBHTGVudW0gbW9kZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xPcnRobyggR0xkb3VibGUgbGVmdCwgR0xkb3VibGUgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGRvdWJsZSBib3R0b20sIEdMZG91YmxlIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZG91YmxlIG5lYXJfdmFsLCBHTGRvdWJsZSBmYXJfdmFsICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEZydXN0dW0oIEdMZG91YmxlIGxlZnQsIEdMZG91YmxlIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGRvdWJsZSBib3R0b20sIEdMZG91YmxlIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xkb3VibGUgbmVhcl92YWwsIEdMZG91YmxlIGZhcl92YWwgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmlld3BvcnQoIEdMaW50IHgsIEdMaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQdXNoTWF0cml4KCB2b2lkICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFBvcE1hdHJpeCggdm9pZCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xMb2FkSWRlbnRpdHkoIHZvaWQgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTG9hZE1hdHJpeGQoIGNvbnN0IEdMZG91YmxlICptICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xMb2FkTWF0cml4ZiggY29uc3QgR0xmbG9hdCAqbSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0TWF0cml4ZCggY29uc3QgR0xkb3VibGUgKm0gKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRNYXRyaXhmKCBjb25zdCBHTGZsb2F0ICptICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJvdGF0ZWQoIEdMZG91YmxlIGFuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSb3RhdGVmKCBHTGZsb2F0IGFuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFNjYWxlZCggR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsU2NhbGVmKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRyYW5zbGF0ZWQoIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHogKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRyYW5zbGF0ZWYoIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKTsKKworCisvKgorICogRGlzcGxheSBMaXN0cworICovCisKK0dMQVBJIEdMYm9vbGVhbiBHTEFQSUVOVFJZIGdsSXNMaXN0KCBHTHVpbnQgbGlzdCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xEZWxldGVMaXN0cyggR0x1aW50IGxpc3QsIEdMc2l6ZWkgcmFuZ2UgKTsKKworR0xBUEkgR0x1aW50IEdMQVBJRU5UUlkgZ2xHZW5MaXN0cyggR0xzaXplaSByYW5nZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xOZXdMaXN0KCBHTHVpbnQgbGlzdCwgR0xlbnVtIG1vZGUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRW5kTGlzdCggdm9pZCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDYWxsTGlzdCggR0x1aW50IGxpc3QgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ2FsbExpc3RzKCBHTHNpemVpIG4sIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqbGlzdHMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTGlzdEJhc2UoIEdMdWludCBiYXNlICk7CisKKworLyoKKyAqIERyYXdpbmcgRnVuY3Rpb25zCisgKi8KKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQmVnaW4oIEdMZW51bSBtb2RlICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEVuZCggdm9pZCApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDJkKCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXgyZiggR0xmbG9hdCB4LCBHTGZsb2F0IHkgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDJpKCBHTGludCB4LCBHTGludCB5ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXgycyggR0xzaG9ydCB4LCBHTHNob3J0IHkgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4M2QoIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHogKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDNmKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXgzaSggR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4M3MoIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHogKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4NGQoIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDRmKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDRpKCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXg0cyggR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDJkdiggY29uc3QgR0xkb3VibGUgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDJmdiggY29uc3QgR0xmbG9hdCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4Mml2KCBjb25zdCBHTGludCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4MnN2KCBjb25zdCBHTHNob3J0ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDNkdiggY29uc3QgR0xkb3VibGUgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDNmdiggY29uc3QgR0xmbG9hdCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4M2l2KCBjb25zdCBHTGludCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4M3N2KCBjb25zdCBHTHNob3J0ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDRkdiggY29uc3QgR0xkb3VibGUgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDRmdiggY29uc3QgR0xmbG9hdCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4NGl2KCBjb25zdCBHTGludCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4NHN2KCBjb25zdCBHTHNob3J0ICp2ICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTm9ybWFsM2IoIEdMYnl0ZSBueCwgR0xieXRlIG55LCBHTGJ5dGUgbnogKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE5vcm1hbDNkKCBHTGRvdWJsZSBueCwgR0xkb3VibGUgbnksIEdMZG91YmxlIG56ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xOb3JtYWwzZiggR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTm9ybWFsM2koIEdMaW50IG54LCBHTGludCBueSwgR0xpbnQgbnogKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE5vcm1hbDNzKCBHTHNob3J0IG54LCBHTHNob3J0IG55LCBHTHNob3J0IG56ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE5vcm1hbDNidiggY29uc3QgR0xieXRlICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xOb3JtYWwzZHYoIGNvbnN0IEdMZG91YmxlICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xOb3JtYWwzZnYoIGNvbnN0IEdMZmxvYXQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE5vcm1hbDNpdiggY29uc3QgR0xpbnQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE5vcm1hbDNzdiggY29uc3QgR0xzaG9ydCAqdiApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEluZGV4ZCggR0xkb3VibGUgYyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsSW5kZXhmKCBHTGZsb2F0IGMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEluZGV4aSggR0xpbnQgYyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsSW5kZXhzKCBHTHNob3J0IGMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEluZGV4dWIoIEdMdWJ5dGUgYyApOyAgLyogMS4xICovCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEluZGV4ZHYoIGNvbnN0IEdMZG91YmxlICpjICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xJbmRleGZ2KCBjb25zdCBHTGZsb2F0ICpjICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xJbmRleGl2KCBjb25zdCBHTGludCAqYyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsSW5kZXhzdiggY29uc3QgR0xzaG9ydCAqYyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsSW5kZXh1YnYoIGNvbnN0IEdMdWJ5dGUgKmMgKTsgIC8qIDEuMSAqLworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjNiKCBHTGJ5dGUgcmVkLCBHTGJ5dGUgZ3JlZW4sIEdMYnl0ZSBibHVlICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjNkKCBHTGRvdWJsZSByZWQsIEdMZG91YmxlIGdyZWVuLCBHTGRvdWJsZSBibHVlICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjNmKCBHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjNpKCBHTGludCByZWQsIEdMaW50IGdyZWVuLCBHTGludCBibHVlICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjNzKCBHTHNob3J0IHJlZCwgR0xzaG9ydCBncmVlbiwgR0xzaG9ydCBibHVlICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjN1YiggR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sIEdMdWJ5dGUgYmx1ZSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3IzdWkoIEdMdWludCByZWQsIEdMdWludCBncmVlbiwgR0x1aW50IGJsdWUgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yM3VzKCBHTHVzaG9ydCByZWQsIEdMdXNob3J0IGdyZWVuLCBHTHVzaG9ydCBibHVlICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yNGIoIEdMYnl0ZSByZWQsIEdMYnl0ZSBncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xieXRlIGJsdWUsIEdMYnl0ZSBhbHBoYSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3I0ZCggR0xkb3VibGUgcmVkLCBHTGRvdWJsZSBncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xkb3VibGUgYmx1ZSwgR0xkb3VibGUgYWxwaGEgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yNGYoIEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yNGkoIEdMaW50IHJlZCwgR0xpbnQgZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGJsdWUsIEdMaW50IGFscGhhICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjRzKCBHTHNob3J0IHJlZCwgR0xzaG9ydCBncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaG9ydCBibHVlLCBHTHNob3J0IGFscGhhICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjR1YiggR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yNHVpKCBHTHVpbnQgcmVkLCBHTHVpbnQgZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgYmx1ZSwgR0x1aW50IGFscGhhICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjR1cyggR0x1c2hvcnQgcmVkLCBHTHVzaG9ydCBncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdXNob3J0IGJsdWUsIEdMdXNob3J0IGFscGhhICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3IzYnYoIGNvbnN0IEdMYnl0ZSAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3IzZHYoIGNvbnN0IEdMZG91YmxlICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjNmdiggY29uc3QgR0xmbG9hdCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3IzaXYoIGNvbnN0IEdMaW50ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjNzdiggY29uc3QgR0xzaG9ydCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3IzdWJ2KCBjb25zdCBHTHVieXRlICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjN1aXYoIGNvbnN0IEdMdWludCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3IzdXN2KCBjb25zdCBHTHVzaG9ydCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjRidiggY29uc3QgR0xieXRlICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjRkdiggY29uc3QgR0xkb3VibGUgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yNGZ2KCBjb25zdCBHTGZsb2F0ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjRpdiggY29uc3QgR0xpbnQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yNHN2KCBjb25zdCBHTHNob3J0ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjR1YnYoIGNvbnN0IEdMdWJ5dGUgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yNHVpdiggY29uc3QgR0x1aW50ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjR1c3YoIGNvbnN0IEdMdXNob3J0ICp2ICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQxZCggR0xkb3VibGUgcyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQxZiggR0xmbG9hdCBzICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDFpKCBHTGludCBzICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDFzKCBHTHNob3J0IHMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQyZCggR0xkb3VibGUgcywgR0xkb3VibGUgdCApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQyZiggR0xmbG9hdCBzLCBHTGZsb2F0IHQgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkMmkoIEdMaW50IHMsIEdMaW50IHQgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkMnMoIEdMc2hvcnQgcywgR0xzaG9ydCB0ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkM2QoIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkM2YoIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkM2koIEdMaW50IHMsIEdMaW50IHQsIEdMaW50IHIgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkM3MoIEdMc2hvcnQgcywgR0xzaG9ydCB0LCBHTHNob3J0IHIgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQ0ZCggR0xkb3VibGUgcywgR0xkb3VibGUgdCwgR0xkb3VibGUgciwgR0xkb3VibGUgcSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQ0ZiggR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDRpKCBHTGludCBzLCBHTGludCB0LCBHTGludCByLCBHTGludCBxICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDRzKCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByLCBHTHNob3J0IHEgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQxZHYoIGNvbnN0IEdMZG91YmxlICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDFmdiggY29uc3QgR0xmbG9hdCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQxaXYoIGNvbnN0IEdMaW50ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDFzdiggY29uc3QgR0xzaG9ydCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDJkdiggY29uc3QgR0xkb3VibGUgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkMmZ2KCBjb25zdCBHTGZsb2F0ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDJpdiggY29uc3QgR0xpbnQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkMnN2KCBjb25zdCBHTHNob3J0ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkM2R2KCBjb25zdCBHTGRvdWJsZSAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQzZnYoIGNvbnN0IEdMZmxvYXQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkM2l2KCBjb25zdCBHTGludCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQzc3YoIGNvbnN0IEdMc2hvcnQgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQ0ZHYoIGNvbnN0IEdMZG91YmxlICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDRmdiggY29uc3QgR0xmbG9hdCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQ0aXYoIGNvbnN0IEdMaW50ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDRzdiggY29uc3QgR0xzaG9ydCAqdiApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczJkKCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3MyZiggR0xmbG9hdCB4LCBHTGZsb2F0IHkgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczJpKCBHTGludCB4LCBHTGludCB5ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3MycyggR0xzaG9ydCB4LCBHTHNob3J0IHkgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zM2QoIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHogKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczNmKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3MzaSggR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zM3MoIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHogKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zNGQoIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczRmKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczRpKCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3M0cyggR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczJkdiggY29uc3QgR0xkb3VibGUgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczJmdiggY29uc3QgR0xmbG9hdCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zMml2KCBjb25zdCBHTGludCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zMnN2KCBjb25zdCBHTHNob3J0ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczNkdiggY29uc3QgR0xkb3VibGUgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczNmdiggY29uc3QgR0xmbG9hdCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zM2l2KCBjb25zdCBHTGludCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zM3N2KCBjb25zdCBHTHNob3J0ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczRkdiggY29uc3QgR0xkb3VibGUgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczRmdiggY29uc3QgR0xmbG9hdCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zNGl2KCBjb25zdCBHTGludCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zNHN2KCBjb25zdCBHTHNob3J0ICp2ICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmVjdGQoIEdMZG91YmxlIHgxLCBHTGRvdWJsZSB5MSwgR0xkb3VibGUgeDIsIEdMZG91YmxlIHkyICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSZWN0ZiggR0xmbG9hdCB4MSwgR0xmbG9hdCB5MSwgR0xmbG9hdCB4MiwgR0xmbG9hdCB5MiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmVjdGkoIEdMaW50IHgxLCBHTGludCB5MSwgR0xpbnQgeDIsIEdMaW50IHkyICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSZWN0cyggR0xzaG9ydCB4MSwgR0xzaG9ydCB5MSwgR0xzaG9ydCB4MiwgR0xzaG9ydCB5MiApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJlY3RkdiggY29uc3QgR0xkb3VibGUgKnYxLCBjb25zdCBHTGRvdWJsZSAqdjIgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJlY3RmdiggY29uc3QgR0xmbG9hdCAqdjEsIGNvbnN0IEdMZmxvYXQgKnYyICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSZWN0aXYoIGNvbnN0IEdMaW50ICp2MSwgY29uc3QgR0xpbnQgKnYyICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSZWN0c3YoIGNvbnN0IEdMc2hvcnQgKnYxLCBjb25zdCBHTHNob3J0ICp2MiApOworCisKKy8qCisgKiBWZXJ0ZXggQXJyYXlzICAoMS4xKQorICovCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleFBvaW50ZXIoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcHRyICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE5vcm1hbFBvaW50ZXIoIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqcHRyICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yUG9pbnRlciggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnB0ciApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xJbmRleFBvaW50ZXIoIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x2b2lkICpwdHIgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmRQb2ludGVyKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcHRyICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEVkZ2VGbGFnUG9pbnRlciggR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcHRyICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldFBvaW50ZXJ2KCBHTGVudW0gcG5hbWUsIEdMdm9pZCAqKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xBcnJheUVsZW1lbnQoIEdMaW50IGkgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRHJhd0FycmF5cyggR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbERyYXdFbGVtZW50cyggR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsSW50ZXJsZWF2ZWRBcnJheXMoIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApOworCisvKgorICogTGlnaHRpbmcKKyAqLworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xTaGFkZU1vZGVsKCBHTGVudW0gbW9kZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xMaWdodGYoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xMaWdodGkoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTGlnaHRmdiggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbExpZ2h0aXYoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xpbnQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRMaWdodGZ2KCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgKnBhcmFtcyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0TGlnaHRpdiggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbExpZ2h0TW9kZWxmKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbExpZ2h0TW9kZWxpKCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xMaWdodE1vZGVsZnYoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xMaWdodE1vZGVsaXYoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNYXRlcmlhbGYoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE1hdGVyaWFsaSggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE1hdGVyaWFsZnYoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTWF0ZXJpYWxpdiggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRNYXRlcmlhbGZ2KCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldE1hdGVyaWFsaXYoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3JNYXRlcmlhbCggR0xlbnVtIGZhY2UsIEdMZW51bSBtb2RlICk7CisKKworLyoKKyAqIFJhc3RlciBmdW5jdGlvbnMKKyAqLworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQaXhlbFpvb20oIEdMZmxvYXQgeGZhY3RvciwgR0xmbG9hdCB5ZmFjdG9yICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFBpeGVsU3RvcmVmKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFBpeGVsU3RvcmVpKCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFBpeGVsVHJhbnNmZXJmKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFBpeGVsVHJhbnNmZXJpKCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFBpeGVsTWFwZnYoIEdMZW51bSBtYXAsIEdMc2l6ZWkgbWFwc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgKnZhbHVlcyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUGl4ZWxNYXB1aXYoIEdMZW51bSBtYXAsIEdMc2l6ZWkgbWFwc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHVpbnQgKnZhbHVlcyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUGl4ZWxNYXB1c3YoIEdMZW51bSBtYXAsIEdMc2l6ZWkgbWFwc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHVzaG9ydCAqdmFsdWVzICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldFBpeGVsTWFwZnYoIEdMZW51bSBtYXAsIEdMZmxvYXQgKnZhbHVlcyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0UGl4ZWxNYXB1aXYoIEdMZW51bSBtYXAsIEdMdWludCAqdmFsdWVzICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRQaXhlbE1hcHVzdiggR0xlbnVtIG1hcCwgR0x1c2hvcnQgKnZhbHVlcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xCaXRtYXAoIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZsb2F0IHhvcmlnLCBHTGZsb2F0IHlvcmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZsb2F0IHhtb3ZlLCBHTGZsb2F0IHltb3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHVieXRlICpiaXRtYXAgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmVhZFBpeGVscyggR0xpbnQgeCwgR0xpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHZvaWQgKnBpeGVscyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xEcmF3UGl4ZWxzKCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x2b2lkICpwaXhlbHMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29weVBpeGVscyggR0xpbnQgeCwgR0xpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHR5cGUgKTsKKworLyoKKyAqIFN0ZW5jaWxpbmcKKyAqLworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xTdGVuY2lsRnVuYyggR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2sgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsU3RlbmNpbE1hc2soIEdMdWludCBtYXNrICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFN0ZW5jaWxPcCggR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENsZWFyU3RlbmNpbCggR0xpbnQgcyApOworCisKKworLyoKKyAqIFRleHR1cmUgbWFwcGluZworICovCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleEdlbmQoIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSBwYXJhbSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4R2VuZiggR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleEdlbmkoIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhHZW5kdiggR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZG91YmxlICpwYXJhbXMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleEdlbmZ2KCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhHZW5pdiggR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0VGV4R2VuZHYoIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSAqcGFyYW1zICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRUZXhHZW5mdiggR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0VGV4R2VuaXYoIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4RW52ZiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhFbnZpKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleEVudmZ2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4RW52aXYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRUZXhFbnZmdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldFRleEVudml2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKTsKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJmKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleFBhcmFtZXRlcmkoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4UGFyYW1ldGVyZnYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4UGFyYW1ldGVyaXYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMaW50ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0VGV4UGFyYW1ldGVyZnYoIEdMZW51bSB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0VGV4UGFyYW1ldGVyaXYoIEdMZW51bSB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldFRleExldmVsUGFyYW1ldGVyZnYoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldFRleExldmVsUGFyYW1ldGVyaXYoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4SW1hZ2UxRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBpbnRlcm5hbEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMaW50IGJvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x2b2lkICpwaXhlbHMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4SW1hZ2UyRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBpbnRlcm5hbEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqcGl4ZWxzICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldFRleEltYWdlKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHZvaWQgKnBpeGVscyApOworCisKKy8qIDEuMSBmdW5jdGlvbnMgKi8KKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2VuVGV4dHVyZXMoIEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xEZWxldGVUZXh0dXJlcyggR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQmluZFRleHR1cmUoIEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFByaW9yaXRpemVUZXh0dXJlcyggR0xzaXplaSBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHVpbnQgKnRleHR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGNsYW1wZiAqcHJpb3JpdGllcyApOworCitHTEFQSSBHTGJvb2xlYW4gR0xBUElFTlRSWSBnbEFyZVRleHR1cmVzUmVzaWRlbnQoIEdMc2l6ZWkgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x1aW50ICp0ZXh0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xib29sZWFuICpyZXNpZGVuY2VzICk7CisKK0dMQVBJIEdMYm9vbGVhbiBHTEFQSUVOVFJZIGdsSXNUZXh0dXJlKCBHTHVpbnQgdGV4dHVyZSApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleFN1YkltYWdlMUQoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMgKTsKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhTdWJJbWFnZTJEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x2b2lkICpwaXhlbHMgKTsKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb3B5VGV4SW1hZ2UxRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGludGVybmFsZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHgsIEdMaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29weVRleEltYWdlMkQoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB4LCBHTGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGJvcmRlciApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvcHlUZXhTdWJJbWFnZTFEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB4b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGggKTsKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb3B5VGV4U3ViSW1hZ2UyRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB4LCBHTGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICk7CisKKworLyoKKyAqIEV2YWx1YXRvcnMKKyAqLworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNYXAxZCggR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgdTEsIEdMZG91YmxlIHUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBvcmRlciwgY29uc3QgR0xkb3VibGUgKnBvaW50cyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTWFwMWYoIEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgdTEsIEdMZmxvYXQgdTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IG9yZGVyLCBjb25zdCBHTGZsb2F0ICpwb2ludHMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTWFwMmQoIEdMZW51bSB0YXJnZXQsCisJCSAgICAgR0xkb3VibGUgdTEsIEdMZG91YmxlIHUyLCBHTGludCB1c3RyaWRlLCBHTGludCB1b3JkZXIsCisJCSAgICAgR0xkb3VibGUgdjEsIEdMZG91YmxlIHYyLCBHTGludCB2c3RyaWRlLCBHTGludCB2b3JkZXIsCisJCSAgICAgY29uc3QgR0xkb3VibGUgKnBvaW50cyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTWFwMmYoIEdMZW51bSB0YXJnZXQsCisJCSAgICAgR0xmbG9hdCB1MSwgR0xmbG9hdCB1MiwgR0xpbnQgdXN0cmlkZSwgR0xpbnQgdW9yZGVyLAorCQkgICAgIEdMZmxvYXQgdjEsIEdMZmxvYXQgdjIsIEdMaW50IHZzdHJpZGUsIEdMaW50IHZvcmRlciwKKwkJICAgICBjb25zdCBHTGZsb2F0ICpwb2ludHMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0TWFwZHYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBxdWVyeSwgR0xkb3VibGUgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldE1hcGZ2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcXVlcnksIEdMZmxvYXQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldE1hcGl2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcXVlcnksIEdMaW50ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEV2YWxDb29yZDFkKCBHTGRvdWJsZSB1ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xFdmFsQ29vcmQxZiggR0xmbG9hdCB1ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEV2YWxDb29yZDFkdiggY29uc3QgR0xkb3VibGUgKnUgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEV2YWxDb29yZDFmdiggY29uc3QgR0xmbG9hdCAqdSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xFdmFsQ29vcmQyZCggR0xkb3VibGUgdSwgR0xkb3VibGUgdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRXZhbENvb3JkMmYoIEdMZmxvYXQgdSwgR0xmbG9hdCB2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEV2YWxDb29yZDJkdiggY29uc3QgR0xkb3VibGUgKnUgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEV2YWxDb29yZDJmdiggY29uc3QgR0xmbG9hdCAqdSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNYXBHcmlkMWQoIEdMaW50IHVuLCBHTGRvdWJsZSB1MSwgR0xkb3VibGUgdTIgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE1hcEdyaWQxZiggR0xpbnQgdW4sIEdMZmxvYXQgdTEsIEdMZmxvYXQgdTIgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTWFwR3JpZDJkKCBHTGludCB1biwgR0xkb3VibGUgdTEsIEdMZG91YmxlIHUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB2biwgR0xkb3VibGUgdjEsIEdMZG91YmxlIHYyICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNYXBHcmlkMmYoIEdMaW50IHVuLCBHTGZsb2F0IHUxLCBHTGZsb2F0IHUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB2biwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2MiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xFdmFsUG9pbnQxKCBHTGludCBpICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEV2YWxQb2ludDIoIEdMaW50IGksIEdMaW50IGogKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRXZhbE1lc2gxKCBHTGVudW0gbW9kZSwgR0xpbnQgaTEsIEdMaW50IGkyICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEV2YWxNZXNoMiggR0xlbnVtIG1vZGUsIEdMaW50IGkxLCBHTGludCBpMiwgR0xpbnQgajEsIEdMaW50IGoyICk7CisKKworLyoKKyAqIEZvZworICovCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEZvZ2YoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xGb2dpKCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEZvZ2Z2KCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xGb2dpdiggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zICk7CisKKworLyoKKyAqIFNlbGVjdGlvbiBhbmQgRmVlZGJhY2sKKyAqLworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xGZWVkYmFja0J1ZmZlciggR0xzaXplaSBzaXplLCBHTGVudW0gdHlwZSwgR0xmbG9hdCAqYnVmZmVyICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFBhc3NUaHJvdWdoKCBHTGZsb2F0IHRva2VuICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFNlbGVjdEJ1ZmZlciggR0xzaXplaSBzaXplLCBHTHVpbnQgKmJ1ZmZlciApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xJbml0TmFtZXMoIHZvaWQgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTG9hZE5hbWUoIEdMdWludCBuYW1lICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFB1c2hOYW1lKCBHTHVpbnQgbmFtZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQb3BOYW1lKCB2b2lkICk7CisKKworCisvKgorICogT3BlbkdMIDEuMgorICovCisKKyNkZWZpbmUgR0xfUkVTQ0FMRV9OT1JNQUwJCQkweDgwM0EKKyNkZWZpbmUgR0xfQ0xBTVBfVE9fRURHRQkJCTB4ODEyRgorI2RlZmluZSBHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVMJCTB4ODBFOAorI2RlZmluZSBHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUwkJCTB4ODBFOQorI2RlZmluZSBHTF9CR1IJCQkJCTB4ODBFMAorI2RlZmluZSBHTF9CR1JBCQkJCQkweDgwRTEKKyNkZWZpbmUgR0xfVU5TSUdORURfQllURV8zXzNfMgkJCTB4ODAzMgorI2RlZmluZSBHTF9VTlNJR05FRF9CWVRFXzJfM18zX1JFVgkJMHg4MzYyCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81CQkJMHg4MzYzCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81X1JFVgkJMHg4MzY0CisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQJCTB4ODAzMworI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80X1JFVgkJMHg4MzY1CisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEJCTB4ODAzNAorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF8xXzVfNV81X1JFVgkJMHg4MzY2CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84CQkJMHg4MDM1CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFVgkJMHg4MzY3CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF8xMF8xMF8xMF8yCQkweDgwMzYKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWCQkweDgzNjgKKyNkZWZpbmUgR0xfTElHSFRfTU9ERUxfQ09MT1JfQ09OVFJPTAkJMHg4MUY4CisjZGVmaW5lIEdMX1NJTkdMRV9DT0xPUgkJCQkweDgxRjkKKyNkZWZpbmUgR0xfU0VQQVJBVEVfU1BFQ1VMQVJfQ09MT1IJCTB4ODFGQQorI2RlZmluZSBHTF9URVhUVVJFX01JTl9MT0QJCQkweDgxM0EKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQVhfTE9ECQkJMHg4MTNCCisjZGVmaW5lIEdMX1RFWFRVUkVfQkFTRV9MRVZFTAkJCTB4ODEzQworI2RlZmluZSBHTF9URVhUVVJFX01BWF9MRVZFTAkJCTB4ODEzRAorI2RlZmluZSBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRQkJMHgwQjEyCisjZGVmaW5lIEdMX1NNT09USF9QT0lOVF9TSVpFX0dSQU5VTEFSSVRZCTB4MEIxMworI2RlZmluZSBHTF9TTU9PVEhfTElORV9XSURUSF9SQU5HRQkJMHgwQjIyCisjZGVmaW5lIEdMX1NNT09USF9MSU5FX1dJRFRIX0dSQU5VTEFSSVRZCTB4MEIyMworI2RlZmluZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UJCTB4ODQ2RAorI2RlZmluZSBHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UJCTB4ODQ2RQorI2RlZmluZSBHTF9QQUNLX1NLSVBfSU1BR0VTCQkJMHg4MDZCCisjZGVmaW5lIEdMX1BBQ0tfSU1BR0VfSEVJR0hUCQkJMHg4MDZDCisjZGVmaW5lIEdMX1VOUEFDS19TS0lQX0lNQUdFUwkJCTB4ODA2RAorI2RlZmluZSBHTF9VTlBBQ0tfSU1BR0VfSEVJR0hUCQkJMHg4MDZFCisjZGVmaW5lIEdMX1RFWFRVUkVfM0QJCQkJMHg4MDZGCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfM0QJCQkweDgwNzAKKyNkZWZpbmUgR0xfVEVYVFVSRV9ERVBUSAkJCTB4ODA3MQorI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfUgkJCTB4ODA3MgorI2RlZmluZSBHTF9NQVhfM0RfVEVYVFVSRV9TSVpFCQkJMHg4MDczCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18zRAkJCTB4ODA2QQorCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xEcmF3UmFuZ2VFbGVtZW50cyggR0xlbnVtIG1vZGUsIEdMdWludCBzdGFydCwKKwlHTHVpbnQgZW5kLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleEltYWdlM0QoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBpbnRlcm5hbEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqcGl4ZWxzICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleFN1YkltYWdlM0QoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlM0QoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHpvZmZzZXQsIEdMaW50IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB5LCBHTHNpemVpIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSBoZWlnaHQgKTsKKwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXUkFOR0VFTEVNRU5UU1BST0MpIChHTGVudW0gbW9kZSwgR0x1aW50IHN0YXJ0LCBHTHVpbnQgZW5kLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYSU1BR0UzRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFNVQklNQUdFM0RQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZVEVYU1VCSU1BR0UzRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworCisKKy8qCisgKiBHTF9BUkJfaW1hZ2luZworICovCisKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQ09MT1IJCQkweDgwMDEKKyNkZWZpbmUgR0xfT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SCQkweDgwMDIKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQUxQSEEJCQkweDgwMDMKKyNkZWZpbmUgR0xfT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBCQkweDgwMDQKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEUJCQkJMHg4MEQwCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fQ09MT1JfVEFCTEUJCTB4ODBEMQorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9DT0xPUl9UQUJMRQkweDgwRDIKKyNkZWZpbmUgR0xfUFJPWFlfQ09MT1JfVEFCTEUJCQkweDgwRDMKKyNkZWZpbmUgR0xfUFJPWFlfUE9TVF9DT05WT0xVVElPTl9DT0xPUl9UQUJMRQkweDgwRDQKKyNkZWZpbmUgR0xfUFJPWFlfUE9TVF9DT0xPUl9NQVRSSVhfQ09MT1JfVEFCTEUJMHg4MEQ1CisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX1NDQUxFCQkJMHg4MEQ2CisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0JJQVMJCQkweDgwRDcKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfRk9STUFUCQkJMHg4MEQ4CisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX1dJRFRICQkJMHg4MEQ5CisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX1JFRF9TSVpFCQkJMHg4MERBCisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0dSRUVOX1NJWkUJCTB4ODBEQgorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9CTFVFX1NJWkUJCTB4ODBEQworI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9BTFBIQV9TSVpFCQkweDgwREQKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfTFVNSU5BTkNFX1NJWkUJCTB4ODBERQorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9JTlRFTlNJVFlfU0laRQkJMHg4MERGCisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OXzFECQkJMHg4MDEwCisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OXzJECQkJMHg4MDExCisjZGVmaW5lIEdMX1NFUEFSQUJMRV8yRAkJCQkweDgwMTIKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fQk9SREVSX01PREUJCTB4ODAxMworI2RlZmluZSBHTF9DT05WT0xVVElPTl9GSUxURVJfU0NBTEUJCTB4ODAxNAorI2RlZmluZSBHTF9DT05WT0xVVElPTl9GSUxURVJfQklBUwkJMHg4MDE1CisjZGVmaW5lIEdMX1JFRFVDRQkJCQkweDgwMTYKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fRk9STUFUCQkJMHg4MDE3CisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX1dJRFRICQkJMHg4MDE4CisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0hFSUdIVAkJCTB4ODAxOQorI2RlZmluZSBHTF9NQVhfQ09OVk9MVVRJT05fV0lEVEgJCTB4ODAxQQorI2RlZmluZSBHTF9NQVhfQ09OVk9MVVRJT05fSEVJR0hUCQkweDgwMUIKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9SRURfU0NBTEUJCTB4ODAxQworI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0dSRUVOX1NDQUxFCQkweDgwMUQKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9CTFVFX1NDQUxFCQkweDgwMUUKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9BTFBIQV9TQ0FMRQkJMHg4MDFGCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fUkVEX0JJQVMJCTB4ODAyMAorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0dSRUVOX0JJQVMJCTB4ODAyMQorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0JMVUVfQklBUwkJMHg4MDIyCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fQUxQSEFfQklBUwkJMHg4MDIzCisjZGVmaW5lIEdMX0NPTlNUQU5UX0JPUkRFUgkJCTB4ODE1MQorI2RlZmluZSBHTF9SRVBMSUNBVEVfQk9SREVSCQkJMHg4MTUzCisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0JPUkRFUl9DT0xPUgkJMHg4MTU0CisjZGVmaW5lIEdMX0NPTE9SX01BVFJJWAkJCQkweDgwQjEKKyNkZWZpbmUgR0xfQ09MT1JfTUFUUklYX1NUQUNLX0RFUFRICQkweDgwQjIKKyNkZWZpbmUgR0xfTUFYX0NPTE9SX01BVFJJWF9TVEFDS19ERVBUSAkJMHg4MEIzCisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX1JFRF9TQ0FMRQkJMHg4MEI0CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0dSRUVOX1NDQUxFCTB4ODBCNQorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9CTFVFX1NDQUxFCQkweDgwQjYKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQUxQSEFfU0NBTEUJMHg4MEI3CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX1JFRF9CSUFTCQkweDgwQjgKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfR1JFRU5fQklBUwkJMHg4MEI5CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0JMVUVfQklBUwkJMHg4MEJBCisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0FMUEhBX0JJQVMJCTB4ODBCQgorI2RlZmluZSBHTF9ISVNUT0dSQU0JCQkJMHg4MDI0CisjZGVmaW5lIEdMX1BST1hZX0hJU1RPR1JBTQkJCTB4ODAyNQorI2RlZmluZSBHTF9ISVNUT0dSQU1fV0lEVEgJCQkweDgwMjYKKyNkZWZpbmUgR0xfSElTVE9HUkFNX0ZPUk1BVAkJCTB4ODAyNworI2RlZmluZSBHTF9ISVNUT0dSQU1fUkVEX1NJWkUJCQkweDgwMjgKKyNkZWZpbmUgR0xfSElTVE9HUkFNX0dSRUVOX1NJWkUJCQkweDgwMjkKKyNkZWZpbmUgR0xfSElTVE9HUkFNX0JMVUVfU0laRQkJCTB4ODAyQQorI2RlZmluZSBHTF9ISVNUT0dSQU1fQUxQSEFfU0laRQkJCTB4ODAyQgorI2RlZmluZSBHTF9ISVNUT0dSQU1fTFVNSU5BTkNFX1NJWkUJCTB4ODAyQworI2RlZmluZSBHTF9ISVNUT0dSQU1fU0lOSwkJCTB4ODAyRAorI2RlZmluZSBHTF9NSU5NQVgJCQkJMHg4MDJFCisjZGVmaW5lIEdMX01JTk1BWF9GT1JNQVQJCQkweDgwMkYKKyNkZWZpbmUgR0xfTUlOTUFYX1NJTksJCQkJMHg4MDMwCisjZGVmaW5lIEdMX1RBQkxFX1RPT19MQVJHRQkJCTB4ODAzMQorI2RlZmluZSBHTF9CTEVORF9FUVVBVElPTgkJCTB4ODAwOQorI2RlZmluZSBHTF9NSU4JCQkJCTB4ODAwNworI2RlZmluZSBHTF9NQVgJCQkJCTB4ODAwOAorI2RlZmluZSBHTF9GVU5DX0FERAkJCQkweDgwMDYKKyNkZWZpbmUgR0xfRlVOQ19TVUJUUkFDVAkJCTB4ODAwQQorI2RlZmluZSBHTF9GVU5DX1JFVkVSU0VfU1VCVFJBQ1QJCTB4ODAwQgorI2RlZmluZSBHTF9CTEVORF9DT0xPUgkJCQkweDgwMDUKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvclRhYmxlKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqdGFibGUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3JTdWJUYWJsZSggR0xlbnVtIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgc3RhcnQsIEdMc2l6ZWkgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqZGF0YSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvclRhYmxlUGFyYW1ldGVyaXYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMaW50ICpwYXJhbXMpOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvclRhYmxlUGFyYW1ldGVyZnYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvcHlDb2xvclN1YlRhYmxlKCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGggKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29weUNvbG9yVGFibGUoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldENvbG9yVGFibGUoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gdHlwZSwgR0x2b2lkICp0YWJsZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyZnYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldENvbG9yVGFibGVQYXJhbWV0ZXJpdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEJsZW5kRXF1YXRpb24oIEdMZW51bSBtb2RlICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEJsZW5kQ29sb3IoIEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xIaXN0b2dyYW0oIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgd2lkdGgsCisJCQkJICAgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGJvb2xlYW4gc2luayApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSZXNldEhpc3RvZ3JhbSggR0xlbnVtIHRhcmdldCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRIaXN0b2dyYW0oIEdMZW51bSB0YXJnZXQsIEdMYm9vbGVhbiByZXNldCwKKwkJCQkgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKKwkJCQkgICAgICBHTHZvaWQgKnZhbHVlcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRIaXN0b2dyYW1QYXJhbWV0ZXJmdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLAorCQkJCQkJIEdMZmxvYXQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRIaXN0b2dyYW1QYXJhbWV0ZXJpdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLAorCQkJCQkJIEdMaW50ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTWlubWF4KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsCisJCQkJR0xib29sZWFuIHNpbmsgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmVzZXRNaW5tYXgoIEdMZW51bSB0YXJnZXQgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0TWlubWF4KCBHTGVudW0gdGFyZ2V0LCBHTGJvb2xlYW4gcmVzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x2b2lkICp2YWx1ZXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0TWlubWF4UGFyYW1ldGVyZnYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwKKwkJCQkJICAgICAgR0xmbG9hdCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldE1pbm1heFBhcmFtZXRlcml2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsCisJCQkJCSAgICAgIEdMaW50ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29udm9sdXRpb25GaWx0ZXIxRCggR0xlbnVtIHRhcmdldCwKKwlHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAorCWNvbnN0IEdMdm9pZCAqaW1hZ2UgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29udm9sdXRpb25GaWx0ZXIyRCggR0xlbnVtIHRhcmdldCwKKwlHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LAorCUdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmltYWdlICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyZiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLAorCUdMZmxvYXQgcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyZnYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwKKwljb25zdCBHTGZsb2F0ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJpKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsCisJR0xpbnQgcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyaXYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwKKwljb25zdCBHTGludCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvcHlDb252b2x1dGlvbkZpbHRlcjFEKCBHTGVudW0gdGFyZ2V0LAorCUdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb3B5Q29udm9sdXRpb25GaWx0ZXIyRCggR0xlbnVtIHRhcmdldCwKKwlHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsCisJR0xzaXplaSBoZWlnaHQpOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRDb252b2x1dGlvbkZpbHRlciggR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwKKwlHTGVudW0gdHlwZSwgR0x2b2lkICppbWFnZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRDb252b2x1dGlvblBhcmFtZXRlcmZ2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsCisJR0xmbG9hdCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldENvbnZvbHV0aW9uUGFyYW1ldGVyaXYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwKKwlHTGludCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFNlcGFyYWJsZUZpbHRlcjJEKCBHTGVudW0gdGFyZ2V0LAorCUdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsCisJR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcm93LCBjb25zdCBHTHZvaWQgKmNvbHVtbiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRTZXBhcmFibGVGaWx0ZXIoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsCisJR0xlbnVtIHR5cGUsIEdMdm9pZCAqcm93LCBHTHZvaWQgKmNvbHVtbiwgR0x2b2lkICpzcGFuICk7CisKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkxFTkRDT0xPUlBST0MpIChHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERVFVQVRJT05QUk9DKSAoR0xlbnVtIG1vZGUpOworCisKKworLyoKKyAqIE9wZW5HTCAxLjMKKyAqLworCisvKiBtdWx0aXRleHR1cmUgKi8KKyNkZWZpbmUgR0xfVEVYVFVSRTAJCQkJMHg4NEMwCisjZGVmaW5lIEdMX1RFWFRVUkUxCQkJCTB4ODRDMQorI2RlZmluZSBHTF9URVhUVVJFMgkJCQkweDg0QzIKKyNkZWZpbmUgR0xfVEVYVFVSRTMJCQkJMHg4NEMzCisjZGVmaW5lIEdMX1RFWFRVUkU0CQkJCTB4ODRDNAorI2RlZmluZSBHTF9URVhUVVJFNQkJCQkweDg0QzUKKyNkZWZpbmUgR0xfVEVYVFVSRTYJCQkJMHg4NEM2CisjZGVmaW5lIEdMX1RFWFRVUkU3CQkJCTB4ODRDNworI2RlZmluZSBHTF9URVhUVVJFOAkJCQkweDg0QzgKKyNkZWZpbmUgR0xfVEVYVFVSRTkJCQkJMHg4NEM5CisjZGVmaW5lIEdMX1RFWFRVUkUxMAkJCQkweDg0Q0EKKyNkZWZpbmUgR0xfVEVYVFVSRTExCQkJCTB4ODRDQgorI2RlZmluZSBHTF9URVhUVVJFMTIJCQkJMHg4NENDCisjZGVmaW5lIEdMX1RFWFRVUkUxMwkJCQkweDg0Q0QKKyNkZWZpbmUgR0xfVEVYVFVSRTE0CQkJCTB4ODRDRQorI2RlZmluZSBHTF9URVhUVVJFMTUJCQkJMHg4NENGCisjZGVmaW5lIEdMX1RFWFRVUkUxNgkJCQkweDg0RDAKKyNkZWZpbmUgR0xfVEVYVFVSRTE3CQkJCTB4ODREMQorI2RlZmluZSBHTF9URVhUVVJFMTgJCQkJMHg4NEQyCisjZGVmaW5lIEdMX1RFWFRVUkUxOQkJCQkweDg0RDMKKyNkZWZpbmUgR0xfVEVYVFVSRTIwCQkJCTB4ODRENAorI2RlZmluZSBHTF9URVhUVVJFMjEJCQkJMHg4NEQ1CisjZGVmaW5lIEdMX1RFWFRVUkUyMgkJCQkweDg0RDYKKyNkZWZpbmUgR0xfVEVYVFVSRTIzCQkJCTB4ODRENworI2RlZmluZSBHTF9URVhUVVJFMjQJCQkJMHg4NEQ4CisjZGVmaW5lIEdMX1RFWFRVUkUyNQkJCQkweDg0RDkKKyNkZWZpbmUgR0xfVEVYVFVSRTI2CQkJCTB4ODREQQorI2RlZmluZSBHTF9URVhUVVJFMjcJCQkJMHg4NERCCisjZGVmaW5lIEdMX1RFWFRVUkUyOAkJCQkweDg0REMKKyNkZWZpbmUgR0xfVEVYVFVSRTI5CQkJCTB4ODRERAorI2RlZmluZSBHTF9URVhUVVJFMzAJCQkJMHg4NERFCisjZGVmaW5lIEdMX1RFWFRVUkUzMQkJCQkweDg0REYKKyNkZWZpbmUgR0xfQUNUSVZFX1RFWFRVUkUJCQkweDg0RTAKKyNkZWZpbmUgR0xfQ0xJRU5UX0FDVElWRV9URVhUVVJFCQkweDg0RTEKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfVU5JVFMJCQkweDg0RTIKKy8qIHRleHR1cmVfY3ViZV9tYXAgKi8KKyNkZWZpbmUgR0xfTk9STUFMX01BUAkJCQkweDg1MTEKKyNkZWZpbmUgR0xfUkVGTEVDVElPTl9NQVAJCQkweDg1MTIKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUAkJCTB4ODUxMworI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVAJCTB4ODUxNAorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gJCTB4ODUxNQorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1gJCTB4ODUxNgorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1kJCTB4ODUxNworI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1kJCTB4ODUxOAorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1oJCTB4ODUxOQorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1oJCTB4ODUxQQorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFX0NVQkVfTUFQCQkweDg1MUIKKyNkZWZpbmUgR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRQkJMHg4NTFDCisvKiB0ZXh0dXJlX2NvbXByZXNzaW9uICovCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfQUxQSEEJCQkweDg0RTkKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9MVU1JTkFOQ0UJCQkweDg0RUEKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9MVU1JTkFOQ0VfQUxQSEEJCTB4ODRFQgorI2RlZmluZSBHTF9DT01QUkVTU0VEX0lOVEVOU0lUWQkJCTB4ODRFQworI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQgkJCTB4ODRFRAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkEJCQkweDg0RUUKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QUkVTU0lPTl9ISU5UCQkweDg0RUYKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QUkVTU0VEX0lNQUdFX1NJWkUJMHg4NkEwCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUFJFU1NFRAkJCTB4ODZBMQorI2RlZmluZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMJMHg4NkEyCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTCQkweDg2QTMKKy8qIG11bHRpc2FtcGxlICovCisjZGVmaW5lIEdMX01VTFRJU0FNUExFCQkJCTB4ODA5RAorI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UJCTB4ODA5RQorI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fT05FCQkJMHg4MDlGCisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRQkJCTB4ODBBMAorI2RlZmluZSBHTF9TQU1QTEVfQlVGRkVSUwkJCTB4ODBBOAorI2RlZmluZSBHTF9TQU1QTEVTCQkJCTB4ODBBOQorI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0VfVkFMVUUJCTB4ODBBQQorI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0VfSU5WRVJUCQkweDgwQUIKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQklUCQkJMHgyMDAwMDAwMAorLyogdHJhbnNwb3NlX21hdHJpeCAqLworI2RlZmluZSBHTF9UUkFOU1BPU0VfTU9ERUxWSUVXX01BVFJJWAkJMHg4NEUzCisjZGVmaW5lIEdMX1RSQU5TUE9TRV9QUk9KRUNUSU9OX01BVFJJWAkJMHg4NEU0CisjZGVmaW5lIEdMX1RSQU5TUE9TRV9URVhUVVJFX01BVFJJWAkJMHg4NEU1CisjZGVmaW5lIEdMX1RSQU5TUE9TRV9DT0xPUl9NQVRSSVgJCTB4ODRFNgorLyogdGV4dHVyZV9lbnZfY29tYmluZSAqLworI2RlZmluZSBHTF9DT01CSU5FCQkJCTB4ODU3MAorI2RlZmluZSBHTF9DT01CSU5FX1JHQgkJCQkweDg1NzEKKyNkZWZpbmUgR0xfQ09NQklORV9BTFBIQQkJCTB4ODU3MgorI2RlZmluZSBHTF9TT1VSQ0UwX1JHQgkJCQkweDg1ODAKKyNkZWZpbmUgR0xfU09VUkNFMV9SR0IJCQkJMHg4NTgxCisjZGVmaW5lIEdMX1NPVVJDRTJfUkdCCQkJCTB4ODU4MgorI2RlZmluZSBHTF9TT1VSQ0UwX0FMUEhBCQkJMHg4NTg4CisjZGVmaW5lIEdMX1NPVVJDRTFfQUxQSEEJCQkweDg1ODkKKyNkZWZpbmUgR0xfU09VUkNFMl9BTFBIQQkJCTB4ODU4QQorI2RlZmluZSBHTF9PUEVSQU5EMF9SR0IJCQkJMHg4NTkwCisjZGVmaW5lIEdMX09QRVJBTkQxX1JHQgkJCQkweDg1OTEKKyNkZWZpbmUgR0xfT1BFUkFORDJfUkdCCQkJCTB4ODU5MgorI2RlZmluZSBHTF9PUEVSQU5EMF9BTFBIQQkJCTB4ODU5OAorI2RlZmluZSBHTF9PUEVSQU5EMV9BTFBIQQkJCTB4ODU5OQorI2RlZmluZSBHTF9PUEVSQU5EMl9BTFBIQQkJCTB4ODU5QQorI2RlZmluZSBHTF9SR0JfU0NBTEUJCQkJMHg4NTczCisjZGVmaW5lIEdMX0FERF9TSUdORUQJCQkJMHg4NTc0CisjZGVmaW5lIEdMX0lOVEVSUE9MQVRFCQkJCTB4ODU3NQorI2RlZmluZSBHTF9TVUJUUkFDVAkJCQkweDg0RTcKKyNkZWZpbmUgR0xfQ09OU1RBTlQJCQkJMHg4NTc2CisjZGVmaW5lIEdMX1BSSU1BUllfQ09MT1IJCQkweDg1NzcKKyNkZWZpbmUgR0xfUFJFVklPVVMJCQkJMHg4NTc4CisvKiB0ZXh0dXJlX2Vudl9kb3QzICovCisjZGVmaW5lIEdMX0RPVDNfUkdCCQkJCTB4ODZBRQorI2RlZmluZSBHTF9ET1QzX1JHQkEJCQkJMHg4NkFGCisvKiB0ZXh0dXJlX2JvcmRlcl9jbGFtcCAqLworI2RlZmluZSBHTF9DTEFNUF9UT19CT1JERVIJCQkweDgxMkQKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQWN0aXZlVGV4dHVyZSggR0xlbnVtIHRleHR1cmUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ2xpZW50QWN0aXZlVGV4dHVyZSggR0xlbnVtIHRleHR1cmUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleEltYWdlMUQoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UzRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UxRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldENvbXByZXNzZWRUZXhJbWFnZSggR0xlbnVtIHRhcmdldCwgR0xpbnQgbG9kLCBHTHZvaWQgKmltZyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWQoIEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFkdiggR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFmKCBHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFmdiggR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWkoIEdMZW51bSB0YXJnZXQsIEdMaW50IHMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFpdiggR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFzKCBHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFzdiggR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmQoIEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJkdiggR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJmKCBHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmZ2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyaSggR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMml2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMnMoIEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyc3YoIEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNkKCBHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzLCBHTGRvdWJsZSB0LCBHTGRvdWJsZSByICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzZHYoIEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzZiggR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2Z2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzaSggR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgciApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2l2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM3MoIEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0LCBHTHNob3J0IHIgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNzdiggR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGQoIEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIsIEdMZG91YmxlIHEgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRkdiggR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRmKCBHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRmdiggR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGkoIEdMZW51bSB0YXJnZXQsIEdMaW50IHMsIEdMaW50IHQsIEdMaW50IHIsIEdMaW50IHEgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRpdiggR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRzKCBHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByLCBHTHNob3J0IHEgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRzdiggR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdiApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbExvYWRUcmFuc3Bvc2VNYXRyaXhkKCBjb25zdCBHTGRvdWJsZSBtWzE2XSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xMb2FkVHJhbnNwb3NlTWF0cml4ZiggY29uc3QgR0xmbG9hdCBtWzE2XSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0VHJhbnNwb3NlTWF0cml4ZCggY29uc3QgR0xkb3VibGUgbVsxNl0gKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdFRyYW5zcG9zZU1hdHJpeGYoIGNvbnN0IEdMZmxvYXQgbVsxNl0gKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsU2FtcGxlQ292ZXJhZ2UoIEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0ICk7CisKKwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBQ1RJVkVURVhUVVJFUFJPQykgKEdMZW51bSB0ZXh0dXJlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0FNUExFQ09WRVJBR0VQUk9DKSAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYSU1BR0UzRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWElNQUdFMkRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhJTUFHRTFEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhTVUJJTUFHRTNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhTVUJJTUFHRTJEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhTVUJJTUFHRTFEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09NUFJFU1NFRFRFWElNQUdFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTHZvaWQgKmltZyk7CisKKworCisvKgorICogR0xfQVJCX211bHRpdGV4dHVyZSAoQVJCIGV4dGVuc2lvbiAxIGFuZCBPcGVuR0wgMS4yLjEpCisgKi8KKyNpZm5kZWYgR0xfQVJCX211bHRpdGV4dHVyZQorI2RlZmluZSBHTF9BUkJfbXVsdGl0ZXh0dXJlIDEKKworI2RlZmluZSBHTF9URVhUVVJFMF9BUkIJCQkJMHg4NEMwCisjZGVmaW5lIEdMX1RFWFRVUkUxX0FSQgkJCQkweDg0QzEKKyNkZWZpbmUgR0xfVEVYVFVSRTJfQVJCCQkJCTB4ODRDMgorI2RlZmluZSBHTF9URVhUVVJFM19BUkIJCQkJMHg4NEMzCisjZGVmaW5lIEdMX1RFWFRVUkU0X0FSQgkJCQkweDg0QzQKKyNkZWZpbmUgR0xfVEVYVFVSRTVfQVJCCQkJCTB4ODRDNQorI2RlZmluZSBHTF9URVhUVVJFNl9BUkIJCQkJMHg4NEM2CisjZGVmaW5lIEdMX1RFWFRVUkU3X0FSQgkJCQkweDg0QzcKKyNkZWZpbmUgR0xfVEVYVFVSRThfQVJCCQkJCTB4ODRDOAorI2RlZmluZSBHTF9URVhUVVJFOV9BUkIJCQkJMHg4NEM5CisjZGVmaW5lIEdMX1RFWFRVUkUxMF9BUkIJCQkweDg0Q0EKKyNkZWZpbmUgR0xfVEVYVFVSRTExX0FSQgkJCTB4ODRDQgorI2RlZmluZSBHTF9URVhUVVJFMTJfQVJCCQkJMHg4NENDCisjZGVmaW5lIEdMX1RFWFRVUkUxM19BUkIJCQkweDg0Q0QKKyNkZWZpbmUgR0xfVEVYVFVSRTE0X0FSQgkJCTB4ODRDRQorI2RlZmluZSBHTF9URVhUVVJFMTVfQVJCCQkJMHg4NENGCisjZGVmaW5lIEdMX1RFWFRVUkUxNl9BUkIJCQkweDg0RDAKKyNkZWZpbmUgR0xfVEVYVFVSRTE3X0FSQgkJCTB4ODREMQorI2RlZmluZSBHTF9URVhUVVJFMThfQVJCCQkJMHg4NEQyCisjZGVmaW5lIEdMX1RFWFRVUkUxOV9BUkIJCQkweDg0RDMKKyNkZWZpbmUgR0xfVEVYVFVSRTIwX0FSQgkJCTB4ODRENAorI2RlZmluZSBHTF9URVhUVVJFMjFfQVJCCQkJMHg4NEQ1CisjZGVmaW5lIEdMX1RFWFRVUkUyMl9BUkIJCQkweDg0RDYKKyNkZWZpbmUgR0xfVEVYVFVSRTIzX0FSQgkJCTB4ODRENworI2RlZmluZSBHTF9URVhUVVJFMjRfQVJCCQkJMHg4NEQ4CisjZGVmaW5lIEdMX1RFWFRVUkUyNV9BUkIJCQkweDg0RDkKKyNkZWZpbmUgR0xfVEVYVFVSRTI2X0FSQgkJCTB4ODREQQorI2RlZmluZSBHTF9URVhUVVJFMjdfQVJCCQkJMHg4NERCCisjZGVmaW5lIEdMX1RFWFRVUkUyOF9BUkIJCQkweDg0REMKKyNkZWZpbmUgR0xfVEVYVFVSRTI5X0FSQgkJCTB4ODRERAorI2RlZmluZSBHTF9URVhUVVJFMzBfQVJCCQkJMHg4NERFCisjZGVmaW5lIEdMX1RFWFRVUkUzMV9BUkIJCQkweDg0REYKKyNkZWZpbmUgR0xfQUNUSVZFX1RFWFRVUkVfQVJCCQkJMHg4NEUwCisjZGVmaW5lIEdMX0NMSUVOVF9BQ1RJVkVfVEVYVFVSRV9BUkIJCTB4ODRFMQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9VTklUU19BUkIJCTB4ODRFMgorCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xBY3RpdmVUZXh0dXJlQVJCKEdMZW51bSB0ZXh0dXJlKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENsaWVudEFjdGl2ZVRleHR1cmVBUkIoR0xlbnVtIHRleHR1cmUpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFkQVJCKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFkdkFSQihHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWZBUkIoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxZnZBUkIoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWlBUkIoR0xlbnVtIHRhcmdldCwgR0xpbnQgcyk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWl2QVJCKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxc0FSQihHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFzdkFSQihHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyZEFSQihHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzLCBHTGRvdWJsZSB0KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyZHZBUkIoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJmQVJCKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyZnZBUkIoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmlBUkIoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMml2QVJCKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyc0FSQihHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMnN2QVJCKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNkQVJCKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNkdkFSQihHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2ZBUkIoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgcik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2Z2QVJCKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNpQVJCKEdMZW51bSB0YXJnZXQsIEdMaW50IHMsIEdMaW50IHQsIEdMaW50IHIpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNpdkFSQihHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM3NBUkIoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQsIEdMc2hvcnQgcik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM3N2QVJCKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRkQVJCKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIsIEdMZG91YmxlIHEpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRkdkFSQihHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGZBUkIoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZnZBUkIoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGlBUkIoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgciwgR0xpbnQgcSk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGl2QVJCKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0c0FSQihHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByLCBHTHNob3J0IHEpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRzdkFSQihHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKKwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBQ1RJVkVURVhUVVJFQVJCUFJPQykgKEdMZW51bSB0ZXh0dXJlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ0xJRU5UQUNUSVZFVEVYVFVSRUFSQlBST0MpIChHTGVudW0gdGV4dHVyZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxREFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFEVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxRkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUlBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxSVZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMVNBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFTVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJEQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkRWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJGQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJGVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJJQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IHMsIEdMaW50IHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMklWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJTQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJTVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNEQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0RWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNGQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0ZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0lBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzSVZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM1NBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQsIEdMc2hvcnQgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzU1ZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0REFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzLCBHTGRvdWJsZSB0LCBHTGRvdWJsZSByLCBHTGRvdWJsZSBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDREVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0RkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENEZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENElBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgciwgR0xpbnQgcSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0SVZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENFNBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQsIEdMc2hvcnQgciwgR0xzaG9ydCBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRTVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKKworI2VuZGlmIC8qIEdMX0FSQl9tdWx0aXRleHR1cmUgKi8KKworCisKKy8qCisgKiBEZWZpbmUgdGhpcyB0b2tlbiBpZiB5b3Ugd2FudCAib2xkLXN0eWxlIiBoZWFkZXIgZmlsZSBiZWhhdmlvdXIgKGV4dGVuc2lvbnMKKyAqIGRlZmluZWQgaW4gZ2wuaCkuICBPdGhlcndpc2UsIGV4dGVuc2lvbnMgd2lsbCBiZSBpbmNsdWRlZCBmcm9tIGdsZXh0LmguCisgKi8KKyNpZiBkZWZpbmVkKEdMX0dMRVhUX0xFR0FDWSkKKworLyogQWxsIGV4dGVuc2lvbnMgdGhhdCB1c2VkIHRvIGJlIGhlcmUgYXJlIG5vdyBmb3VuZCBpbiBnbGV4dC5oICovCisKKyNlbHNlICAvKiBHTF9HTEVYVF9MRUdBQ1kgKi8KKworI2luY2x1ZGUgPEdML2dsZXh0Lmg+CisKKyNlbmRpZiAgLyogR0xfR0xFWFRfTEVHQUNZICovCisKKworCisjaWYgR0xfQVJCX3NoYWRlcl9vYmplY3RzCisKKyNpZm5kZWYgR0xfTUVTQV9zaGFkZXJfZGVidWcKKyNkZWZpbmUgR0xfTUVTQV9zaGFkZXJfZGVidWcgMQorCisjZGVmaW5lIEdMX0RFQlVHX09CSkVDVF9NRVNBICAgICAgICAgICAgICAweDg3NTkKKyNkZWZpbmUgR0xfREVCVUdfUFJJTlRfTUVTQSAgICAgICAgICAgICAgIDB4ODc1QQorI2RlZmluZSBHTF9ERUJVR19BU1NFUlRfTUVTQSAgICAgICAgICAgICAgMHg4NzVCCisKK0dMQVBJIEdMaGFuZGxlQVJCIEdMQVBJRU5UUlkgZ2xDcmVhdGVEZWJ1Z09iamVjdE1FU0EgKHZvaWQpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ2xlYXJEZWJ1Z0xvZ01FU0EgKEdMaGFuZGxlQVJCIG9iaiwgR0xlbnVtIGxvZ1R5cGUsIEdMZW51bSBzaGFkZXJUeXBlKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldERlYnVnTG9nTUVTQSAoR0xoYW5kbGVBUkIgb2JqLCBHTGVudW0gbG9nVHlwZSwgR0xlbnVtIHNoYWRlclR5cGUsIEdMc2l6ZWkgbWF4TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpICpsZW5ndGgsIEdMY2hhckFSQiAqZGVidWdMb2cpOworR0xBUEkgR0xzaXplaSBHTEFQSUVOVFJZIGdsR2V0RGVidWdMb2dMZW5ndGhNRVNBIChHTGhhbmRsZUFSQiBvYmosIEdMZW51bSBsb2dUeXBlLCBHTGVudW0gc2hhZGVyVHlwZSk7CisKKyNlbmRpZiAvKiBHTF9NRVNBX3NoYWRlcl9kZWJ1ZyAqLworCisjZW5kaWYgLyogR0xfQVJCX3NoYWRlcl9vYmplY3RzICovCisKKworLyoKKyAqID8/Py4gR0xfTUVTQV9wYWNrZWRfZGVwdGhfc3RlbmNpbAorICogWFhYIG9ic29sZXRlCisgKi8KKyNpZm5kZWYgR0xfTUVTQV9wYWNrZWRfZGVwdGhfc3RlbmNpbAorI2RlZmluZSBHTF9NRVNBX3BhY2tlZF9kZXB0aF9zdGVuY2lsIDEKKworI2RlZmluZSBHTF9ERVBUSF9TVEVOQ0lMX01FU0EJCQkweDg3NTAKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzI0XzhfTUVTQQkJMHg4NzUxCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF84XzI0X1JFVl9NRVNBCQkweDg3NTIKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfMTVfMV9NRVNBCQkweDg3NTMKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfMV8xNV9SRVZfTUVTQQkJMHg4NzU0CisKKyNlbmRpZiAvKiBHTF9NRVNBX3BhY2tlZF9kZXB0aF9zdGVuY2lsICovCisKKworI2lmbmRlZiBHTF9NRVNBX3Byb2dyYW1fZGVidWcKKyNkZWZpbmUgR0xfTUVTQV9wcm9ncmFtX2RlYnVnIDEKKworI2RlZmluZSBHTF9GUkFHTUVOVF9QUk9HUkFNX1BPU0lUSU9OX01FU0EgICAgICAgMHg4YmIwCisjZGVmaW5lIEdMX0ZSQUdNRU5UX1BST0dSQU1fQ0FMTEJBQ0tfTUVTQSAgICAgICAweDhiYjEKKyNkZWZpbmUgR0xfRlJBR01FTlRfUFJPR1JBTV9DQUxMQkFDS19GVU5DX01FU0EgIDB4OGJiMgorI2RlZmluZSBHTF9GUkFHTUVOVF9QUk9HUkFNX0NBTExCQUNLX0RBVEFfTUVTQSAgMHg4YmIzCisjZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX1BPU0lUSU9OX01FU0EgICAgICAgICAweDhiYjQKKyNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fQ0FMTEJBQ0tfTUVTQSAgICAgICAgIDB4OGJiNQorI2RlZmluZSBHTF9WRVJURVhfUFJPR1JBTV9DQUxMQkFDS19GVU5DX01FU0EgICAgMHg4YmI2CisjZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX0NBTExCQUNLX0RBVEFfTUVTQSAgICAweDhiYjcKKwordHlwZWRlZiB2b2lkICgqR0xwcm9ncmFtY2FsbGJhY2tNRVNBKShHTGVudW0gdGFyZ2V0LCBHTHZvaWQgKmRhdGEpOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQcm9ncmFtQ2FsbGJhY2tNRVNBKEdMZW51bSB0YXJnZXQsIEdMcHJvZ3JhbWNhbGxiYWNrTUVTQSBjYWxsYmFjaywgR0x2b2lkICpkYXRhKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0UHJvZ3JhbVJlZ2lzdGVyZnZNRVNBKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHVieXRlICpuYW1lLCBHTGZsb2F0ICp2KTsKKworI2VuZGlmIC8qIEdMX01FU0FfcHJvZ3JhbV9kZWJ1ZyAqLworCisKKyNpZm5kZWYgR0xfTUVTQV90ZXh0dXJlX2FycmF5CisjZGVmaW5lIEdMX01FU0FfdGV4dHVyZV9hcnJheSAxCisKKy8qIEdMX01FU0FfdGV4dHVyZV9hcnJheSB1c2VzIHRoZSBzYW1lIGVudW0gdmFsdWVzIGFzIEdMX0VYVF90ZXh0dXJlX2FycmF5LgorICovCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2FycmF5CisKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVidWZmZXJUZXh0dXJlTGF5ZXJFWFQoR0xlbnVtIHRhcmdldCwKKyAgICBHTGVudW0gYXR0YWNobWVudCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTGludCBsYXllcik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLworCisjaWYgMAorLyogKHRlbXBvcmFyaWx5KSBkaXNhYmxlZCBiZWNhdXNlIG9mIGNvbGxpc2lvbiB3aXRoIHR5cGVkZWYgaW4gZ2xleHQuaAorICogdGhhdCBoYXBwZW5zIGlmIGFwcHMgaW5jbHVkZSBib3RoIGdsLmggYW5kIGdsZXh0LmgKKyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkVMQVlFUkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LAorICAgIEdMZW51bSBhdHRhY2htZW50LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IGxheWVyKTsKKyNlbmRpZgorCisjZGVmaW5lIEdMX1RFWFRVUkVfMURfQVJSQVlfRVhUICAgICAgICAgMHg4QzE4CisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfMURfQVJSQVlfRVhUICAgMHg4QzE5CisjZGVmaW5lIEdMX1RFWFRVUkVfMkRfQVJSQVlfRVhUICAgICAgICAgMHg4QzFBCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfMkRfQVJSQVlfRVhUICAgMHg4QzFCCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18xRF9BUlJBWV9FWFQgMHg4QzFDCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18yRF9BUlJBWV9FWFQgMHg4QzFECisjZGVmaW5lIEdMX01BWF9BUlJBWV9URVhUVVJFX0xBWUVSU19FWFQgMHg4OEZGCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MQVlFUl9FWFQgMHg4Q0Q0CisjZW5kaWYKKworI2VuZGlmCisKKworI2lmbmRlZiBHTF9BVElfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUKKyNkZWZpbmUgR0xfQVRJX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlIDEKKworI2RlZmluZSBHTF9BTFBIQV9CTEVORF9FUVVBVElPTl9BVEkJICAgICAgICAweDg4M0QKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlQVRJKCBHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBICk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERVFVQVRJT05TRVBBUkFURUFUSVBST0MpIChHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBKTsKKworI2VuZGlmIC8qIEdMX0FUSV9ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZSAqLworCisKKy8qIEdMX09FU19FR0xfaW1hZ2UgKi8KKyNpZm5kZWYgR0xfT0VTX0VHTF9pbWFnZQordHlwZWRlZiB2b2lkKiBHTGVnbEltYWdlT0VTOworI2VuZGlmCisKKyNpZm5kZWYgR0xfT0VTX0VHTF9pbWFnZQorI2RlZmluZSBHTF9PRVNfRUdMX2ltYWdlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMgKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUyAoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSk7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRUdMSU1BR0VUQVJHRVRURVhUVVJFMkRPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVHTElNQUdFVEFSR0VUUkVOREVSQlVGRkVSU1RPUkFHRU9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKKyNlbmRpZgorCisKKy8qKgorICoqIE5PVEUhISEhISAgSWYgeW91IGFkZCBuZXcgZnVuY3Rpb25zIHRvIHRoaXMgZmlsZSwgb3IgdXBkYXRlCisgKiogZ2xleHQuaCBiZSBzdXJlIHRvIHJlZ2VuZXJhdGUgdGhlIGdsX21hbmdsZS5oIGZpbGUuICBTZWUgY29tbWVudHMKKyAqKiBpbiB0aGF0IGZpbGUgZm9yIGRldGFpbHMuCisgKiovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQmVnaW4gc3lzdGVtLXNwZWNpZmljIHN0dWZmCisgKi8KKyNpZiBkZWZpbmVkKFBSQUdNQV9FWFBPUlRfU1VQUE9SVEVEKQorI3ByYWdtYSBleHBvcnQgb2ZmCisjZW5kaWYKKworI2lmIGRlZmluZWQobWFjaW50b3NoKSAmJiBQUkFHTUFfSU1QT1JUX1NVUFBPUlRFRAorI3ByYWdtYSBpbXBvcnQgb2ZmCisjZW5kaWYKKy8qCisgKiBFbmQgc3lzdGVtLXNwZWNpZmljIHN0dWZmCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19nbF9oXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbF9tYW5nbGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvZ2xfbWFuZ2xlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4NDgwMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvZ2xfbWFuZ2xlLmgKQEAgLTAsMCArMSwyMzExIEBACisjaWYgMAorI2RlZmluZSBHTF9NQU5HTEVfQzEgIkRPIE5PVCBFRElUISEhIC0gVE8gUkVHRU5FUkFURSBmcm9tIGdsLmgsIEVYRUNVVEUgVEhJUyBGSUxFIElOIFNIRUxMICgvYmluL3NoKSBhbmQgc2F2ZSB0aGUgb3V0cHV0IgorI2RlZmluZSBHTF9NQU5HTEVfQzIgIlRoaXMgZmlsZSBpcyB1c2VkIHRvIGNyZWF0ZSBHTCBmdW5jdGlvbiBwcm90eXBlcyBhbmQgYWxpYXNlcyBmb3IgdGhlIGZ1bmN0aW9uIG5hbWVzIgorCWZpbGVzPSJnbC5oIGdsZXh0LmgiCisjZGVmaW5lIEdMX01BTkdMRV9DMyAiZ2V0IHJlZ2VuZXJhdGlvbiBoZWFkZXIgLSBjb3B5IGV2ZXJ5dGhpbmcgaW4gdGhpcyBmaWxlIGFib3ZlIHRoZSAnUkVHRU5FUkFURV9UT19FTkQnIGxpbmUiCisJYXdrIAknIWRvbmU7IC9eXC9cKlJFR0VORVJBVEVfVE9fRU5ELyB7ZG9uZT0xfScgJDAKKwllY2hvICIiCisjZGVmaW5lIEdMX01BTkdMRV9DNCBnZXQgYWxpYXNlcworCWdyZXAgJ15HTEFQSScgJGZpbGVzIHwgc2VkIC1lICdzLy4qRU5UUlkgZ2xcKFteKCBdKlwpLiokLyNkZWZpbmUgZ2xcMQkJTUFOR0xFKFwxKS8nIHwgc29ydCB8IHVuaXEKKwllY2hvICIiCisJZWNobyAiI2VuZGlmIC8qIEdMX01BTkdMRV9IICovIgorCWV4aXQKKyNlbmRpZiAvKiBSRUdFTkVSQVRJT04gKi8KKworLyoKKyAqIElmIHlvdSBjb21waWxlIE1lc2Egd2l0aCBVU0VfTUdMX05BTUVTUEFDRSBkZWZpbmVkIHRoZW4geW91IGNhbiBsaW5rCisgKiB5b3VyIGFwcGxpY2F0aW9uIGJvdGggd2l0aCBPcGVuR0wgYW5kIE1lc2EuICBUaGUgTWVzYSBmdW5jdGlvbnMgd2lsbAorICogYmUgcmVkZWZpbmVkIHNvIHRoZXkgYXJlIHByZWZpeGVkIHdpdGggIm1nbCIgaW5zdGVhZCBvZiAiZ2wiLgorICogTWdsIGNvbnRyaWJ1dGVkIGJ5IFJhbmR5IEZyYW5rIChyZnJhbmtAcnNpbmMuY29tKQorICogUmVnbmVyYXRpb24gY29kZSBjb250cmlidXRlZCBieSBSYXkgVGljZSAocmF5dEBtYS51bHRyYS5uZXQpCisgKi8KKworI2lmbmRlZiBHTF9NQU5HTEVfSAorI2RlZmluZSBHTF9NQU5HTEVfSAorCisjaWZuZGVmICAgTUFOR0xFCisjZGVmaW5lICAgTUFOR0xFKHgpIG1nbCMjeAorI2VuZGlmICAvKk1BTkdMRSovCisKKy8qUkVHRU5FUkFURV9UT19FTkQtLS0tLS0tLS0tLUFMTCBMSU5FUyBCRUxPVyBIRVJFIEdFVCBSRVBMQUNFRCBPTiBSRUdFTkVSQVRJT04gKi8KKworI2RlZmluZSBnbEFjY3VtCQlNQU5HTEUoQWNjdW0pCisjZGVmaW5lIGdsQWN0aXZlUHJvZ3JhbUVYVAkJTUFOR0xFKEFjdGl2ZVByb2dyYW1FWFQpCisjZGVmaW5lIGdsQWN0aXZlU2hhZGVyUHJvZ3JhbQkJTUFOR0xFKEFjdGl2ZVNoYWRlclByb2dyYW0pCisjZGVmaW5lIGdsQWN0aXZlU3RlbmNpbEZhY2VFWFQJCU1BTkdMRShBY3RpdmVTdGVuY2lsRmFjZUVYVCkKKyNkZWZpbmUgZ2xBY3RpdmVUZXh0dXJlQVJCCQlNQU5HTEUoQWN0aXZlVGV4dHVyZUFSQikKKyNkZWZpbmUgZ2xBY3RpdmVUZXh0dXJlCQlNQU5HTEUoQWN0aXZlVGV4dHVyZSkKKyNkZWZpbmUgZ2xBY3RpdmVWYXJ5aW5nTlYJCU1BTkdMRShBY3RpdmVWYXJ5aW5nTlYpCisjZGVmaW5lIGdsQWxwaGFGcmFnbWVudE9wMUFUSQkJTUFOR0xFKEFscGhhRnJhZ21lbnRPcDFBVEkpCisjZGVmaW5lIGdsQWxwaGFGcmFnbWVudE9wMkFUSQkJTUFOR0xFKEFscGhhRnJhZ21lbnRPcDJBVEkpCisjZGVmaW5lIGdsQWxwaGFGcmFnbWVudE9wM0FUSQkJTUFOR0xFKEFscGhhRnJhZ21lbnRPcDNBVEkpCisjZGVmaW5lIGdsQWxwaGFGdW5jCQlNQU5HTEUoQWxwaGFGdW5jKQorI2RlZmluZSBnbEFwcGx5VGV4dHVyZUVYVAkJTUFOR0xFKEFwcGx5VGV4dHVyZUVYVCkKKyNkZWZpbmUgZ2xBcmVQcm9ncmFtc1Jlc2lkZW50TlYJCU1BTkdMRShBcmVQcm9ncmFtc1Jlc2lkZW50TlYpCisjZGVmaW5lIGdsQXJlVGV4dHVyZXNSZXNpZGVudEVYVAkJTUFOR0xFKEFyZVRleHR1cmVzUmVzaWRlbnRFWFQpCisjZGVmaW5lIGdsQXJlVGV4dHVyZXNSZXNpZGVudAkJTUFOR0xFKEFyZVRleHR1cmVzUmVzaWRlbnQpCisjZGVmaW5lIGdsQXJyYXlFbGVtZW50RVhUCQlNQU5HTEUoQXJyYXlFbGVtZW50RVhUKQorI2RlZmluZSBnbEFycmF5RWxlbWVudAkJTUFOR0xFKEFycmF5RWxlbWVudCkKKyNkZWZpbmUgZ2xBcnJheU9iamVjdEFUSQkJTUFOR0xFKEFycmF5T2JqZWN0QVRJKQorI2RlZmluZSBnbEFzeW5jTWFya2VyU0dJWAkJTUFOR0xFKEFzeW5jTWFya2VyU0dJWCkKKyNkZWZpbmUgZ2xBdHRhY2hPYmplY3RBUkIJCU1BTkdMRShBdHRhY2hPYmplY3RBUkIpCisjZGVmaW5lIGdsQXR0YWNoU2hhZGVyCQlNQU5HTEUoQXR0YWNoU2hhZGVyKQorI2RlZmluZSBnbEJlZ2luQ29uZGl0aW9uYWxSZW5kZXIJCU1BTkdMRShCZWdpbkNvbmRpdGlvbmFsUmVuZGVyKQorI2RlZmluZSBnbEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJOVgkJTUFOR0xFKEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJOVikKKyNkZWZpbmUgZ2xCZWdpbkZyYWdtZW50U2hhZGVyQVRJCQlNQU5HTEUoQmVnaW5GcmFnbWVudFNoYWRlckFUSSkKKyNkZWZpbmUgZ2xCZWdpbgkJTUFOR0xFKEJlZ2luKQorI2RlZmluZSBnbEJlZ2luT2NjbHVzaW9uUXVlcnlOVgkJTUFOR0xFKEJlZ2luT2NjbHVzaW9uUXVlcnlOVikKKyNkZWZpbmUgZ2xCZWdpblBlcmZNb25pdG9yQU1ECQlNQU5HTEUoQmVnaW5QZXJmTW9uaXRvckFNRCkKKyNkZWZpbmUgZ2xCZWdpblF1ZXJ5QVJCCQlNQU5HTEUoQmVnaW5RdWVyeUFSQikKKyNkZWZpbmUgZ2xCZWdpblF1ZXJ5SW5kZXhlZAkJTUFOR0xFKEJlZ2luUXVlcnlJbmRleGVkKQorI2RlZmluZSBnbEJlZ2luUXVlcnkJCU1BTkdMRShCZWdpblF1ZXJ5KQorI2RlZmluZSBnbEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tFWFQJCU1BTkdMRShCZWdpblRyYW5zZm9ybUZlZWRiYWNrRVhUKQorI2RlZmluZSBnbEJlZ2luVHJhbnNmb3JtRmVlZGJhY2sJCU1BTkdMRShCZWdpblRyYW5zZm9ybUZlZWRiYWNrKQorI2RlZmluZSBnbEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tOVgkJTUFOR0xFKEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tOVikKKyNkZWZpbmUgZ2xCZWdpblZlcnRleFNoYWRlckVYVAkJTUFOR0xFKEJlZ2luVmVydGV4U2hhZGVyRVhUKQorI2RlZmluZSBnbEJlZ2luVmlkZW9DYXB0dXJlTlYJCU1BTkdMRShCZWdpblZpZGVvQ2FwdHVyZU5WKQorI2RlZmluZSBnbEJpbmRBdHRyaWJMb2NhdGlvbkFSQgkJTUFOR0xFKEJpbmRBdHRyaWJMb2NhdGlvbkFSQikKKyNkZWZpbmUgZ2xCaW5kQXR0cmliTG9jYXRpb24JCU1BTkdMRShCaW5kQXR0cmliTG9jYXRpb24pCisjZGVmaW5lIGdsQmluZEJ1ZmZlckFSQgkJTUFOR0xFKEJpbmRCdWZmZXJBUkIpCisjZGVmaW5lIGdsQmluZEJ1ZmZlckJhc2VFWFQJCU1BTkdMRShCaW5kQnVmZmVyQmFzZUVYVCkKKyNkZWZpbmUgZ2xCaW5kQnVmZmVyQmFzZQkJTUFOR0xFKEJpbmRCdWZmZXJCYXNlKQorI2RlZmluZSBnbEJpbmRCdWZmZXJCYXNlTlYJCU1BTkdMRShCaW5kQnVmZmVyQmFzZU5WKQorI2RlZmluZSBnbEJpbmRCdWZmZXIJCU1BTkdMRShCaW5kQnVmZmVyKQorI2RlZmluZSBnbEJpbmRCdWZmZXJPZmZzZXRFWFQJCU1BTkdMRShCaW5kQnVmZmVyT2Zmc2V0RVhUKQorI2RlZmluZSBnbEJpbmRCdWZmZXJPZmZzZXROVgkJTUFOR0xFKEJpbmRCdWZmZXJPZmZzZXROVikKKyNkZWZpbmUgZ2xCaW5kQnVmZmVyUmFuZ2VFWFQJCU1BTkdMRShCaW5kQnVmZmVyUmFuZ2VFWFQpCisjZGVmaW5lIGdsQmluZEJ1ZmZlclJhbmdlCQlNQU5HTEUoQmluZEJ1ZmZlclJhbmdlKQorI2RlZmluZSBnbEJpbmRCdWZmZXJSYW5nZU5WCQlNQU5HTEUoQmluZEJ1ZmZlclJhbmdlTlYpCisjZGVmaW5lIGdsQmluZEZyYWdEYXRhTG9jYXRpb25FWFQJCU1BTkdMRShCaW5kRnJhZ0RhdGFMb2NhdGlvbkVYVCkKKyNkZWZpbmUgZ2xCaW5kRnJhZ0RhdGFMb2NhdGlvbkluZGV4ZWQJCU1BTkdMRShCaW5kRnJhZ0RhdGFMb2NhdGlvbkluZGV4ZWQpCisjZGVmaW5lIGdsQmluZEZyYWdEYXRhTG9jYXRpb24JCU1BTkdMRShCaW5kRnJhZ0RhdGFMb2NhdGlvbikKKyNkZWZpbmUgZ2xCaW5kRnJhZ21lbnRTaGFkZXJBVEkJCU1BTkdMRShCaW5kRnJhZ21lbnRTaGFkZXJBVEkpCisjZGVmaW5lIGdsQmluZEZyYW1lYnVmZmVyRVhUCQlNQU5HTEUoQmluZEZyYW1lYnVmZmVyRVhUKQorI2RlZmluZSBnbEJpbmRGcmFtZWJ1ZmZlcgkJTUFOR0xFKEJpbmRGcmFtZWJ1ZmZlcikKKyNkZWZpbmUgZ2xCaW5kSW1hZ2VUZXh0dXJlRVhUCQlNQU5HTEUoQmluZEltYWdlVGV4dHVyZUVYVCkKKyNkZWZpbmUgZ2xCaW5kTGlnaHRQYXJhbWV0ZXJFWFQJCU1BTkdMRShCaW5kTGlnaHRQYXJhbWV0ZXJFWFQpCisjZGVmaW5lIGdsQmluZE1hdGVyaWFsUGFyYW1ldGVyRVhUCQlNQU5HTEUoQmluZE1hdGVyaWFsUGFyYW1ldGVyRVhUKQorI2RlZmluZSBnbEJpbmRNdWx0aVRleHR1cmVFWFQJCU1BTkdMRShCaW5kTXVsdGlUZXh0dXJlRVhUKQorI2RlZmluZSBnbEJpbmRQYXJhbWV0ZXJFWFQJCU1BTkdMRShCaW5kUGFyYW1ldGVyRVhUKQorI2RlZmluZSBnbEJpbmRQcm9ncmFtQVJCCQlNQU5HTEUoQmluZFByb2dyYW1BUkIpCisjZGVmaW5lIGdsQmluZFByb2dyYW1OVgkJTUFOR0xFKEJpbmRQcm9ncmFtTlYpCisjZGVmaW5lIGdsQmluZFByb2dyYW1QaXBlbGluZQkJTUFOR0xFKEJpbmRQcm9ncmFtUGlwZWxpbmUpCisjZGVmaW5lIGdsQmluZFJlbmRlcmJ1ZmZlckVYVAkJTUFOR0xFKEJpbmRSZW5kZXJidWZmZXJFWFQpCisjZGVmaW5lIGdsQmluZFJlbmRlcmJ1ZmZlcgkJTUFOR0xFKEJpbmRSZW5kZXJidWZmZXIpCisjZGVmaW5lIGdsQmluZFNhbXBsZXIJCU1BTkdMRShCaW5kU2FtcGxlcikKKyNkZWZpbmUgZ2xCaW5kVGV4R2VuUGFyYW1ldGVyRVhUCQlNQU5HTEUoQmluZFRleEdlblBhcmFtZXRlckVYVCkKKyNkZWZpbmUgZ2xCaW5kVGV4dHVyZUVYVAkJTUFOR0xFKEJpbmRUZXh0dXJlRVhUKQorI2RlZmluZSBnbEJpbmRUZXh0dXJlCQlNQU5HTEUoQmluZFRleHR1cmUpCisjZGVmaW5lIGdsQmluZFRleHR1cmVVbml0UGFyYW1ldGVyRVhUCQlNQU5HTEUoQmluZFRleHR1cmVVbml0UGFyYW1ldGVyRVhUKQorI2RlZmluZSBnbEJpbmRUcmFuc2Zvcm1GZWVkYmFjawkJTUFOR0xFKEJpbmRUcmFuc2Zvcm1GZWVkYmFjaykKKyNkZWZpbmUgZ2xCaW5kVHJhbnNmb3JtRmVlZGJhY2tOVgkJTUFOR0xFKEJpbmRUcmFuc2Zvcm1GZWVkYmFja05WKQorI2RlZmluZSBnbEJpbmRWZXJ0ZXhBcnJheUFQUExFCQlNQU5HTEUoQmluZFZlcnRleEFycmF5QVBQTEUpCisjZGVmaW5lIGdsQmluZFZlcnRleEFycmF5CQlNQU5HTEUoQmluZFZlcnRleEFycmF5KQorI2RlZmluZSBnbEJpbmRWZXJ0ZXhTaGFkZXJFWFQJCU1BTkdMRShCaW5kVmVydGV4U2hhZGVyRVhUKQorI2RlZmluZSBnbEJpbmRWaWRlb0NhcHR1cmVTdHJlYW1CdWZmZXJOVgkJTUFOR0xFKEJpbmRWaWRlb0NhcHR1cmVTdHJlYW1CdWZmZXJOVikKKyNkZWZpbmUgZ2xCaW5kVmlkZW9DYXB0dXJlU3RyZWFtVGV4dHVyZU5WCQlNQU5HTEUoQmluZFZpZGVvQ2FwdHVyZVN0cmVhbVRleHR1cmVOVikKKyNkZWZpbmUgZ2xCaW5vcm1hbDNiRVhUCQlNQU5HTEUoQmlub3JtYWwzYkVYVCkKKyNkZWZpbmUgZ2xCaW5vcm1hbDNidkVYVAkJTUFOR0xFKEJpbm9ybWFsM2J2RVhUKQorI2RlZmluZSBnbEJpbm9ybWFsM2RFWFQJCU1BTkdMRShCaW5vcm1hbDNkRVhUKQorI2RlZmluZSBnbEJpbm9ybWFsM2R2RVhUCQlNQU5HTEUoQmlub3JtYWwzZHZFWFQpCisjZGVmaW5lIGdsQmlub3JtYWwzZkVYVAkJTUFOR0xFKEJpbm9ybWFsM2ZFWFQpCisjZGVmaW5lIGdsQmlub3JtYWwzZnZFWFQJCU1BTkdMRShCaW5vcm1hbDNmdkVYVCkKKyNkZWZpbmUgZ2xCaW5vcm1hbDNpRVhUCQlNQU5HTEUoQmlub3JtYWwzaUVYVCkKKyNkZWZpbmUgZ2xCaW5vcm1hbDNpdkVYVAkJTUFOR0xFKEJpbm9ybWFsM2l2RVhUKQorI2RlZmluZSBnbEJpbm9ybWFsM3NFWFQJCU1BTkdMRShCaW5vcm1hbDNzRVhUKQorI2RlZmluZSBnbEJpbm9ybWFsM3N2RVhUCQlNQU5HTEUoQmlub3JtYWwzc3ZFWFQpCisjZGVmaW5lIGdsQmlub3JtYWxQb2ludGVyRVhUCQlNQU5HTEUoQmlub3JtYWxQb2ludGVyRVhUKQorI2RlZmluZSBnbEJpdG1hcAkJTUFOR0xFKEJpdG1hcCkKKyNkZWZpbmUgZ2xCbGVuZENvbG9yRVhUCQlNQU5HTEUoQmxlbmRDb2xvckVYVCkKKyNkZWZpbmUgZ2xCbGVuZENvbG9yCQlNQU5HTEUoQmxlbmRDb2xvcikKKyNkZWZpbmUgZ2xCbGVuZEVxdWF0aW9uRVhUCQlNQU5HTEUoQmxlbmRFcXVhdGlvbkVYVCkKKyNkZWZpbmUgZ2xCbGVuZEVxdWF0aW9uaUFSQgkJTUFOR0xFKEJsZW5kRXF1YXRpb25pQVJCKQorI2RlZmluZSBnbEJsZW5kRXF1YXRpb25pCQlNQU5HTEUoQmxlbmRFcXVhdGlvbmkpCisjZGVmaW5lIGdsQmxlbmRFcXVhdGlvbkluZGV4ZWRBTUQJCU1BTkdMRShCbGVuZEVxdWF0aW9uSW5kZXhlZEFNRCkKKyNkZWZpbmUgZ2xCbGVuZEVxdWF0aW9uCQlNQU5HTEUoQmxlbmRFcXVhdGlvbikKKyNkZWZpbmUgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVBVEkJCU1BTkdMRShCbGVuZEVxdWF0aW9uU2VwYXJhdGVBVEkpCisjZGVmaW5lIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlRVhUCQlNQU5HTEUoQmxlbmRFcXVhdGlvblNlcGFyYXRlRVhUKQorI2RlZmluZSBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZWlBUkIJCU1BTkdMRShCbGVuZEVxdWF0aW9uU2VwYXJhdGVpQVJCKQorI2RlZmluZSBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZWkJCU1BTkdMRShCbGVuZEVxdWF0aW9uU2VwYXJhdGVpKQorI2RlZmluZSBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZUluZGV4ZWRBTUQJCU1BTkdMRShCbGVuZEVxdWF0aW9uU2VwYXJhdGVJbmRleGVkQU1EKQorI2RlZmluZSBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZQkJTUFOR0xFKEJsZW5kRXF1YXRpb25TZXBhcmF0ZSkKKyNkZWZpbmUgZ2xCbGVuZEZ1bmNpQVJCCQlNQU5HTEUoQmxlbmRGdW5jaUFSQikKKyNkZWZpbmUgZ2xCbGVuZEZ1bmNpCQlNQU5HTEUoQmxlbmRGdW5jaSkKKyNkZWZpbmUgZ2xCbGVuZEZ1bmNJbmRleGVkQU1ECQlNQU5HTEUoQmxlbmRGdW5jSW5kZXhlZEFNRCkKKyNkZWZpbmUgZ2xCbGVuZEZ1bmMJCU1BTkdMRShCbGVuZEZ1bmMpCisjZGVmaW5lIGdsQmxlbmRGdW5jU2VwYXJhdGVFWFQJCU1BTkdMRShCbGVuZEZ1bmNTZXBhcmF0ZUVYVCkKKyNkZWZpbmUgZ2xCbGVuZEZ1bmNTZXBhcmF0ZWlBUkIJCU1BTkdMRShCbGVuZEZ1bmNTZXBhcmF0ZWlBUkIpCisjZGVmaW5lIGdsQmxlbmRGdW5jU2VwYXJhdGVpCQlNQU5HTEUoQmxlbmRGdW5jU2VwYXJhdGVpKQorI2RlZmluZSBnbEJsZW5kRnVuY1NlcGFyYXRlSW5kZXhlZEFNRAkJTUFOR0xFKEJsZW5kRnVuY1NlcGFyYXRlSW5kZXhlZEFNRCkKKyNkZWZpbmUgZ2xCbGVuZEZ1bmNTZXBhcmF0ZUlOR1IJCU1BTkdMRShCbGVuZEZ1bmNTZXBhcmF0ZUlOR1IpCisjZGVmaW5lIGdsQmxlbmRGdW5jU2VwYXJhdGUJCU1BTkdMRShCbGVuZEZ1bmNTZXBhcmF0ZSkKKyNkZWZpbmUgZ2xCbGl0RnJhbWVidWZmZXJFWFQJCU1BTkdMRShCbGl0RnJhbWVidWZmZXJFWFQpCisjZGVmaW5lIGdsQmxpdEZyYW1lYnVmZmVyCQlNQU5HTEUoQmxpdEZyYW1lYnVmZmVyKQorI2RlZmluZSBnbEJ1ZmZlckFkZHJlc3NSYW5nZU5WCQlNQU5HTEUoQnVmZmVyQWRkcmVzc1JhbmdlTlYpCisjZGVmaW5lIGdsQnVmZmVyRGF0YUFSQgkJTUFOR0xFKEJ1ZmZlckRhdGFBUkIpCisjZGVmaW5lIGdsQnVmZmVyRGF0YQkJTUFOR0xFKEJ1ZmZlckRhdGEpCisjZGVmaW5lIGdsQnVmZmVyUGFyYW1ldGVyaUFQUExFCQlNQU5HTEUoQnVmZmVyUGFyYW1ldGVyaUFQUExFKQorI2RlZmluZSBnbEJ1ZmZlclN1YkRhdGFBUkIJCU1BTkdMRShCdWZmZXJTdWJEYXRhQVJCKQorI2RlZmluZSBnbEJ1ZmZlclN1YkRhdGEJCU1BTkdMRShCdWZmZXJTdWJEYXRhKQorI2RlZmluZSBnbENhbGxMaXN0CQlNQU5HTEUoQ2FsbExpc3QpCisjZGVmaW5lIGdsQ2FsbExpc3RzCQlNQU5HTEUoQ2FsbExpc3RzKQorI2RlZmluZSBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNFWFQJCU1BTkdMRShDaGVja0ZyYW1lYnVmZmVyU3RhdHVzRVhUKQorI2RlZmluZSBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXMJCU1BTkdMRShDaGVja0ZyYW1lYnVmZmVyU3RhdHVzKQorI2RlZmluZSBnbENoZWNrTmFtZWRGcmFtZWJ1ZmZlclN0YXR1c0VYVAkJTUFOR0xFKENoZWNrTmFtZWRGcmFtZWJ1ZmZlclN0YXR1c0VYVCkKKyNkZWZpbmUgZ2xDbGFtcENvbG9yQVJCCQlNQU5HTEUoQ2xhbXBDb2xvckFSQikKKyNkZWZpbmUgZ2xDbGFtcENvbG9yCQlNQU5HTEUoQ2xhbXBDb2xvcikKKyNkZWZpbmUgZ2xDbGVhckFjY3VtCQlNQU5HTEUoQ2xlYXJBY2N1bSkKKyNkZWZpbmUgZ2xDbGVhckJ1ZmZlcmZpCQlNQU5HTEUoQ2xlYXJCdWZmZXJmaSkKKyNkZWZpbmUgZ2xDbGVhckJ1ZmZlcmZ2CQlNQU5HTEUoQ2xlYXJCdWZmZXJmdikKKyNkZWZpbmUgZ2xDbGVhckJ1ZmZlcml2CQlNQU5HTEUoQ2xlYXJCdWZmZXJpdikKKyNkZWZpbmUgZ2xDbGVhckJ1ZmZlcnVpdgkJTUFOR0xFKENsZWFyQnVmZmVydWl2KQorI2RlZmluZSBnbENsZWFyQ29sb3JJaUVYVAkJTUFOR0xFKENsZWFyQ29sb3JJaUVYVCkKKyNkZWZpbmUgZ2xDbGVhckNvbG9ySXVpRVhUCQlNQU5HTEUoQ2xlYXJDb2xvckl1aUVYVCkKKyNkZWZpbmUgZ2xDbGVhckNvbG9yCQlNQU5HTEUoQ2xlYXJDb2xvcikKKyNkZWZpbmUgZ2xDbGVhckRlYnVnTG9nTUVTQQkJTUFOR0xFKENsZWFyRGVidWdMb2dNRVNBKQorI2RlZmluZSBnbENsZWFyRGVwdGhkTlYJCU1BTkdMRShDbGVhckRlcHRoZE5WKQorI2RlZmluZSBnbENsZWFyRGVwdGhmCQlNQU5HTEUoQ2xlYXJEZXB0aGYpCisjZGVmaW5lIGdsQ2xlYXJEZXB0aAkJTUFOR0xFKENsZWFyRGVwdGgpCisjZGVmaW5lIGdsQ2xlYXJJbmRleAkJTUFOR0xFKENsZWFySW5kZXgpCisjZGVmaW5lIGdsQ2xlYXIJCU1BTkdMRShDbGVhcikKKyNkZWZpbmUgZ2xDbGVhclN0ZW5jaWwJCU1BTkdMRShDbGVhclN0ZW5jaWwpCisjZGVmaW5lIGdsQ2xpZW50QWN0aXZlVGV4dHVyZUFSQgkJTUFOR0xFKENsaWVudEFjdGl2ZVRleHR1cmVBUkIpCisjZGVmaW5lIGdsQ2xpZW50QWN0aXZlVGV4dHVyZQkJTUFOR0xFKENsaWVudEFjdGl2ZVRleHR1cmUpCisjZGVmaW5lIGdsQ2xpZW50QWN0aXZlVmVydGV4U3RyZWFtQVRJCQlNQU5HTEUoQ2xpZW50QWN0aXZlVmVydGV4U3RyZWFtQVRJKQorI2RlZmluZSBnbENsaWVudEF0dHJpYkRlZmF1bHRFWFQJCU1BTkdMRShDbGllbnRBdHRyaWJEZWZhdWx0RVhUKQorI2RlZmluZSBnbENsaWVudFdhaXRTeW5jCQlNQU5HTEUoQ2xpZW50V2FpdFN5bmMpCisjZGVmaW5lIGdsQ2xpcFBsYW5lCQlNQU5HTEUoQ2xpcFBsYW5lKQorI2RlZmluZSBnbENvbG9yM2IJCU1BTkdMRShDb2xvcjNiKQorI2RlZmluZSBnbENvbG9yM2J2CQlNQU5HTEUoQ29sb3IzYnYpCisjZGVmaW5lIGdsQ29sb3IzZAkJTUFOR0xFKENvbG9yM2QpCisjZGVmaW5lIGdsQ29sb3IzZHYJCU1BTkdMRShDb2xvcjNkdikKKyNkZWZpbmUgZ2xDb2xvcjNmCQlNQU5HTEUoQ29sb3IzZikKKyNkZWZpbmUgZ2xDb2xvcjNmVmVydGV4M2ZTVU4JCU1BTkdMRShDb2xvcjNmVmVydGV4M2ZTVU4pCisjZGVmaW5lIGdsQ29sb3IzZlZlcnRleDNmdlNVTgkJTUFOR0xFKENvbG9yM2ZWZXJ0ZXgzZnZTVU4pCisjZGVmaW5lIGdsQ29sb3IzZnYJCU1BTkdMRShDb2xvcjNmdikKKyNkZWZpbmUgZ2xDb2xvcjNoTlYJCU1BTkdMRShDb2xvcjNoTlYpCisjZGVmaW5lIGdsQ29sb3IzaHZOVgkJTUFOR0xFKENvbG9yM2h2TlYpCisjZGVmaW5lIGdsQ29sb3IzaQkJTUFOR0xFKENvbG9yM2kpCisjZGVmaW5lIGdsQ29sb3IzaXYJCU1BTkdMRShDb2xvcjNpdikKKyNkZWZpbmUgZ2xDb2xvcjNzCQlNQU5HTEUoQ29sb3IzcykKKyNkZWZpbmUgZ2xDb2xvcjNzdgkJTUFOR0xFKENvbG9yM3N2KQorI2RlZmluZSBnbENvbG9yM3ViCQlNQU5HTEUoQ29sb3IzdWIpCisjZGVmaW5lIGdsQ29sb3IzdWJ2CQlNQU5HTEUoQ29sb3IzdWJ2KQorI2RlZmluZSBnbENvbG9yM3VpCQlNQU5HTEUoQ29sb3IzdWkpCisjZGVmaW5lIGdsQ29sb3IzdWl2CQlNQU5HTEUoQ29sb3IzdWl2KQorI2RlZmluZSBnbENvbG9yM3VzCQlNQU5HTEUoQ29sb3IzdXMpCisjZGVmaW5lIGdsQ29sb3IzdXN2CQlNQU5HTEUoQ29sb3IzdXN2KQorI2RlZmluZSBnbENvbG9yNGIJCU1BTkdMRShDb2xvcjRiKQorI2RlZmluZSBnbENvbG9yNGJ2CQlNQU5HTEUoQ29sb3I0YnYpCisjZGVmaW5lIGdsQ29sb3I0ZAkJTUFOR0xFKENvbG9yNGQpCisjZGVmaW5lIGdsQ29sb3I0ZHYJCU1BTkdMRShDb2xvcjRkdikKKyNkZWZpbmUgZ2xDb2xvcjRmCQlNQU5HTEUoQ29sb3I0ZikKKyNkZWZpbmUgZ2xDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZlNVTgkJTUFOR0xFKENvbG9yNGZOb3JtYWwzZlZlcnRleDNmU1VOKQorI2RlZmluZSBnbENvbG9yNGZOb3JtYWwzZlZlcnRleDNmdlNVTgkJTUFOR0xFKENvbG9yNGZOb3JtYWwzZlZlcnRleDNmdlNVTikKKyNkZWZpbmUgZ2xDb2xvcjRmdgkJTUFOR0xFKENvbG9yNGZ2KQorI2RlZmluZSBnbENvbG9yNGhOVgkJTUFOR0xFKENvbG9yNGhOVikKKyNkZWZpbmUgZ2xDb2xvcjRodk5WCQlNQU5HTEUoQ29sb3I0aHZOVikKKyNkZWZpbmUgZ2xDb2xvcjRpCQlNQU5HTEUoQ29sb3I0aSkKKyNkZWZpbmUgZ2xDb2xvcjRpdgkJTUFOR0xFKENvbG9yNGl2KQorI2RlZmluZSBnbENvbG9yNHMJCU1BTkdMRShDb2xvcjRzKQorI2RlZmluZSBnbENvbG9yNHN2CQlNQU5HTEUoQ29sb3I0c3YpCisjZGVmaW5lIGdsQ29sb3I0dWIJCU1BTkdMRShDb2xvcjR1YikKKyNkZWZpbmUgZ2xDb2xvcjR1YlZlcnRleDJmU1VOCQlNQU5HTEUoQ29sb3I0dWJWZXJ0ZXgyZlNVTikKKyNkZWZpbmUgZ2xDb2xvcjR1YlZlcnRleDJmdlNVTgkJTUFOR0xFKENvbG9yNHViVmVydGV4MmZ2U1VOKQorI2RlZmluZSBnbENvbG9yNHViVmVydGV4M2ZTVU4JCU1BTkdMRShDb2xvcjR1YlZlcnRleDNmU1VOKQorI2RlZmluZSBnbENvbG9yNHViVmVydGV4M2Z2U1VOCQlNQU5HTEUoQ29sb3I0dWJWZXJ0ZXgzZnZTVU4pCisjZGVmaW5lIGdsQ29sb3I0dWJ2CQlNQU5HTEUoQ29sb3I0dWJ2KQorI2RlZmluZSBnbENvbG9yNHVpCQlNQU5HTEUoQ29sb3I0dWkpCisjZGVmaW5lIGdsQ29sb3I0dWl2CQlNQU5HTEUoQ29sb3I0dWl2KQorI2RlZmluZSBnbENvbG9yNHVzCQlNQU5HTEUoQ29sb3I0dXMpCisjZGVmaW5lIGdsQ29sb3I0dXN2CQlNQU5HTEUoQ29sb3I0dXN2KQorI2RlZmluZSBnbENvbG9yRm9ybWF0TlYJCU1BTkdMRShDb2xvckZvcm1hdE5WKQorI2RlZmluZSBnbENvbG9yRnJhZ21lbnRPcDFBVEkJCU1BTkdMRShDb2xvckZyYWdtZW50T3AxQVRJKQorI2RlZmluZSBnbENvbG9yRnJhZ21lbnRPcDJBVEkJCU1BTkdMRShDb2xvckZyYWdtZW50T3AyQVRJKQorI2RlZmluZSBnbENvbG9yRnJhZ21lbnRPcDNBVEkJCU1BTkdMRShDb2xvckZyYWdtZW50T3AzQVRJKQorI2RlZmluZSBnbENvbG9yTWFza2kJCU1BTkdMRShDb2xvck1hc2tpKQorI2RlZmluZSBnbENvbG9yTWFza0luZGV4ZWRFWFQJCU1BTkdMRShDb2xvck1hc2tJbmRleGVkRVhUKQorI2RlZmluZSBnbENvbG9yTWFzawkJTUFOR0xFKENvbG9yTWFzaykKKyNkZWZpbmUgZ2xDb2xvck1hdGVyaWFsCQlNQU5HTEUoQ29sb3JNYXRlcmlhbCkKKyNkZWZpbmUgZ2xDb2xvclAzdWkJCU1BTkdMRShDb2xvclAzdWkpCisjZGVmaW5lIGdsQ29sb3JQM3VpdgkJTUFOR0xFKENvbG9yUDN1aXYpCisjZGVmaW5lIGdsQ29sb3JQNHVpCQlNQU5HTEUoQ29sb3JQNHVpKQorI2RlZmluZSBnbENvbG9yUDR1aXYJCU1BTkdMRShDb2xvclA0dWl2KQorI2RlZmluZSBnbENvbG9yUG9pbnRlckVYVAkJTUFOR0xFKENvbG9yUG9pbnRlckVYVCkKKyNkZWZpbmUgZ2xDb2xvclBvaW50ZXJMaXN0SUJNCQlNQU5HTEUoQ29sb3JQb2ludGVyTGlzdElCTSkKKyNkZWZpbmUgZ2xDb2xvclBvaW50ZXIJCU1BTkdMRShDb2xvclBvaW50ZXIpCisjZGVmaW5lIGdsQ29sb3JQb2ludGVydklOVEVMCQlNQU5HTEUoQ29sb3JQb2ludGVydklOVEVMKQorI2RlZmluZSBnbENvbG9yU3ViVGFibGVFWFQJCU1BTkdMRShDb2xvclN1YlRhYmxlRVhUKQorI2RlZmluZSBnbENvbG9yU3ViVGFibGUJCU1BTkdMRShDb2xvclN1YlRhYmxlKQorI2RlZmluZSBnbENvbG9yVGFibGVFWFQJCU1BTkdMRShDb2xvclRhYmxlRVhUKQorI2RlZmluZSBnbENvbG9yVGFibGUJCU1BTkdMRShDb2xvclRhYmxlKQorI2RlZmluZSBnbENvbG9yVGFibGVQYXJhbWV0ZXJmdgkJTUFOR0xFKENvbG9yVGFibGVQYXJhbWV0ZXJmdikKKyNkZWZpbmUgZ2xDb2xvclRhYmxlUGFyYW1ldGVyZnZTR0kJCU1BTkdMRShDb2xvclRhYmxlUGFyYW1ldGVyZnZTR0kpCisjZGVmaW5lIGdsQ29sb3JUYWJsZVBhcmFtZXRlcml2CQlNQU5HTEUoQ29sb3JUYWJsZVBhcmFtZXRlcml2KQorI2RlZmluZSBnbENvbG9yVGFibGVQYXJhbWV0ZXJpdlNHSQkJTUFOR0xFKENvbG9yVGFibGVQYXJhbWV0ZXJpdlNHSSkKKyNkZWZpbmUgZ2xDb2xvclRhYmxlU0dJCQlNQU5HTEUoQ29sb3JUYWJsZVNHSSkKKyNkZWZpbmUgZ2xDb21iaW5lcklucHV0TlYJCU1BTkdMRShDb21iaW5lcklucHV0TlYpCisjZGVmaW5lIGdsQ29tYmluZXJPdXRwdXROVgkJTUFOR0xFKENvbWJpbmVyT3V0cHV0TlYpCisjZGVmaW5lIGdsQ29tYmluZXJQYXJhbWV0ZXJmTlYJCU1BTkdMRShDb21iaW5lclBhcmFtZXRlcmZOVikKKyNkZWZpbmUgZ2xDb21iaW5lclBhcmFtZXRlcmZ2TlYJCU1BTkdMRShDb21iaW5lclBhcmFtZXRlcmZ2TlYpCisjZGVmaW5lIGdsQ29tYmluZXJQYXJhbWV0ZXJpTlYJCU1BTkdMRShDb21iaW5lclBhcmFtZXRlcmlOVikKKyNkZWZpbmUgZ2xDb21iaW5lclBhcmFtZXRlcml2TlYJCU1BTkdMRShDb21iaW5lclBhcmFtZXRlcml2TlYpCisjZGVmaW5lIGdsQ29tYmluZXJTdGFnZVBhcmFtZXRlcmZ2TlYJCU1BTkdMRShDb21iaW5lclN0YWdlUGFyYW1ldGVyZnZOVikKKyNkZWZpbmUgZ2xDb21waWxlU2hhZGVyQVJCCQlNQU5HTEUoQ29tcGlsZVNoYWRlckFSQikKKyNkZWZpbmUgZ2xDb21waWxlU2hhZGVySW5jbHVkZUFSQgkJTUFOR0xFKENvbXBpbGVTaGFkZXJJbmNsdWRlQVJCKQorI2RlZmluZSBnbENvbXBpbGVTaGFkZXIJCU1BTkdMRShDb21waWxlU2hhZGVyKQorI2RlZmluZSBnbENvbXByZXNzZWRNdWx0aVRleEltYWdlMURFWFQJCU1BTkdMRShDb21wcmVzc2VkTXVsdGlUZXhJbWFnZTFERVhUKQorI2RlZmluZSBnbENvbXByZXNzZWRNdWx0aVRleEltYWdlMkRFWFQJCU1BTkdMRShDb21wcmVzc2VkTXVsdGlUZXhJbWFnZTJERVhUKQorI2RlZmluZSBnbENvbXByZXNzZWRNdWx0aVRleEltYWdlM0RFWFQJCU1BTkdMRShDb21wcmVzc2VkTXVsdGlUZXhJbWFnZTNERVhUKQorI2RlZmluZSBnbENvbXByZXNzZWRNdWx0aVRleFN1YkltYWdlMURFWFQJCU1BTkdMRShDb21wcmVzc2VkTXVsdGlUZXhTdWJJbWFnZTFERVhUKQorI2RlZmluZSBnbENvbXByZXNzZWRNdWx0aVRleFN1YkltYWdlMkRFWFQJCU1BTkdMRShDb21wcmVzc2VkTXVsdGlUZXhTdWJJbWFnZTJERVhUKQorI2RlZmluZSBnbENvbXByZXNzZWRNdWx0aVRleFN1YkltYWdlM0RFWFQJCU1BTkdMRShDb21wcmVzc2VkTXVsdGlUZXhTdWJJbWFnZTNERVhUKQorI2RlZmluZSBnbENvbXByZXNzZWRUZXhJbWFnZTFEQVJCCQlNQU5HTEUoQ29tcHJlc3NlZFRleEltYWdlMURBUkIpCisjZGVmaW5lIGdsQ29tcHJlc3NlZFRleEltYWdlMUQJCU1BTkdMRShDb21wcmVzc2VkVGV4SW1hZ2UxRCkKKyNkZWZpbmUgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyREFSQgkJTUFOR0xFKENvbXByZXNzZWRUZXhJbWFnZTJEQVJCKQorI2RlZmluZSBnbENvbXByZXNzZWRUZXhJbWFnZTJECQlNQU5HTEUoQ29tcHJlc3NlZFRleEltYWdlMkQpCisjZGVmaW5lIGdsQ29tcHJlc3NlZFRleEltYWdlM0RBUkIJCU1BTkdMRShDb21wcmVzc2VkVGV4SW1hZ2UzREFSQikKKyNkZWZpbmUgZ2xDb21wcmVzc2VkVGV4SW1hZ2UzRAkJTUFOR0xFKENvbXByZXNzZWRUZXhJbWFnZTNEKQorI2RlZmluZSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTFEQVJCCQlNQU5HTEUoQ29tcHJlc3NlZFRleFN1YkltYWdlMURBUkIpCisjZGVmaW5lIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMUQJCU1BTkdMRShDb21wcmVzc2VkVGV4U3ViSW1hZ2UxRCkKKyNkZWZpbmUgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyREFSQgkJTUFOR0xFKENvbXByZXNzZWRUZXhTdWJJbWFnZTJEQVJCKQorI2RlZmluZSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJECQlNQU5HTEUoQ29tcHJlc3NlZFRleFN1YkltYWdlMkQpCisjZGVmaW5lIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlM0RBUkIJCU1BTkdMRShDb21wcmVzc2VkVGV4U3ViSW1hZ2UzREFSQikKKyNkZWZpbmUgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzRAkJTUFOR0xFKENvbXByZXNzZWRUZXhTdWJJbWFnZTNEKQorI2RlZmluZSBnbENvbXByZXNzZWRUZXh0dXJlSW1hZ2UxREVYVAkJTUFOR0xFKENvbXByZXNzZWRUZXh0dXJlSW1hZ2UxREVYVCkKKyNkZWZpbmUgZ2xDb21wcmVzc2VkVGV4dHVyZUltYWdlMkRFWFQJCU1BTkdMRShDb21wcmVzc2VkVGV4dHVyZUltYWdlMkRFWFQpCisjZGVmaW5lIGdsQ29tcHJlc3NlZFRleHR1cmVJbWFnZTNERVhUCQlNQU5HTEUoQ29tcHJlc3NlZFRleHR1cmVJbWFnZTNERVhUKQorI2RlZmluZSBnbENvbXByZXNzZWRUZXh0dXJlU3ViSW1hZ2UxREVYVAkJTUFOR0xFKENvbXByZXNzZWRUZXh0dXJlU3ViSW1hZ2UxREVYVCkKKyNkZWZpbmUgZ2xDb21wcmVzc2VkVGV4dHVyZVN1YkltYWdlMkRFWFQJCU1BTkdMRShDb21wcmVzc2VkVGV4dHVyZVN1YkltYWdlMkRFWFQpCisjZGVmaW5lIGdsQ29tcHJlc3NlZFRleHR1cmVTdWJJbWFnZTNERVhUCQlNQU5HTEUoQ29tcHJlc3NlZFRleHR1cmVTdWJJbWFnZTNERVhUKQorI2RlZmluZSBnbENvbnZvbHV0aW9uRmlsdGVyMURFWFQJCU1BTkdMRShDb252b2x1dGlvbkZpbHRlcjFERVhUKQorI2RlZmluZSBnbENvbnZvbHV0aW9uRmlsdGVyMUQJCU1BTkdMRShDb252b2x1dGlvbkZpbHRlcjFEKQorI2RlZmluZSBnbENvbnZvbHV0aW9uRmlsdGVyMkRFWFQJCU1BTkdMRShDb252b2x1dGlvbkZpbHRlcjJERVhUKQorI2RlZmluZSBnbENvbnZvbHV0aW9uRmlsdGVyMkQJCU1BTkdMRShDb252b2x1dGlvbkZpbHRlcjJEKQorI2RlZmluZSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyZkVYVAkJTUFOR0xFKENvbnZvbHV0aW9uUGFyYW1ldGVyZkVYVCkKKyNkZWZpbmUgZ2xDb252b2x1dGlvblBhcmFtZXRlcmYJCU1BTkdMRShDb252b2x1dGlvblBhcmFtZXRlcmYpCisjZGVmaW5lIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJmdkVYVAkJTUFOR0xFKENvbnZvbHV0aW9uUGFyYW1ldGVyZnZFWFQpCisjZGVmaW5lIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJmdgkJTUFOR0xFKENvbnZvbHV0aW9uUGFyYW1ldGVyZnYpCisjZGVmaW5lIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJpRVhUCQlNQU5HTEUoQ29udm9sdXRpb25QYXJhbWV0ZXJpRVhUKQorI2RlZmluZSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyaQkJTUFOR0xFKENvbnZvbHV0aW9uUGFyYW1ldGVyaSkKKyNkZWZpbmUgZ2xDb252b2x1dGlvblBhcmFtZXRlcml2RVhUCQlNQU5HTEUoQ29udm9sdXRpb25QYXJhbWV0ZXJpdkVYVCkKKyNkZWZpbmUgZ2xDb252b2x1dGlvblBhcmFtZXRlcml2CQlNQU5HTEUoQ29udm9sdXRpb25QYXJhbWV0ZXJpdikKKyNkZWZpbmUgZ2xDb3B5QnVmZmVyU3ViRGF0YQkJTUFOR0xFKENvcHlCdWZmZXJTdWJEYXRhKQorI2RlZmluZSBnbENvcHlDb2xvclN1YlRhYmxlRVhUCQlNQU5HTEUoQ29weUNvbG9yU3ViVGFibGVFWFQpCisjZGVmaW5lIGdsQ29weUNvbG9yU3ViVGFibGUJCU1BTkdMRShDb3B5Q29sb3JTdWJUYWJsZSkKKyNkZWZpbmUgZ2xDb3B5Q29sb3JUYWJsZQkJTUFOR0xFKENvcHlDb2xvclRhYmxlKQorI2RlZmluZSBnbENvcHlDb2xvclRhYmxlU0dJCQlNQU5HTEUoQ29weUNvbG9yVGFibGVTR0kpCisjZGVmaW5lIGdsQ29weUNvbnZvbHV0aW9uRmlsdGVyMURFWFQJCU1BTkdMRShDb3B5Q29udm9sdXRpb25GaWx0ZXIxREVYVCkKKyNkZWZpbmUgZ2xDb3B5Q29udm9sdXRpb25GaWx0ZXIxRAkJTUFOR0xFKENvcHlDb252b2x1dGlvbkZpbHRlcjFEKQorI2RlZmluZSBnbENvcHlDb252b2x1dGlvbkZpbHRlcjJERVhUCQlNQU5HTEUoQ29weUNvbnZvbHV0aW9uRmlsdGVyMkRFWFQpCisjZGVmaW5lIGdsQ29weUNvbnZvbHV0aW9uRmlsdGVyMkQJCU1BTkdMRShDb3B5Q29udm9sdXRpb25GaWx0ZXIyRCkKKyNkZWZpbmUgZ2xDb3B5SW1hZ2VTdWJEYXRhTlYJCU1BTkdMRShDb3B5SW1hZ2VTdWJEYXRhTlYpCisjZGVmaW5lIGdsQ29weU11bHRpVGV4SW1hZ2UxREVYVAkJTUFOR0xFKENvcHlNdWx0aVRleEltYWdlMURFWFQpCisjZGVmaW5lIGdsQ29weU11bHRpVGV4SW1hZ2UyREVYVAkJTUFOR0xFKENvcHlNdWx0aVRleEltYWdlMkRFWFQpCisjZGVmaW5lIGdsQ29weU11bHRpVGV4U3ViSW1hZ2UxREVYVAkJTUFOR0xFKENvcHlNdWx0aVRleFN1YkltYWdlMURFWFQpCisjZGVmaW5lIGdsQ29weU11bHRpVGV4U3ViSW1hZ2UyREVYVAkJTUFOR0xFKENvcHlNdWx0aVRleFN1YkltYWdlMkRFWFQpCisjZGVmaW5lIGdsQ29weU11bHRpVGV4U3ViSW1hZ2UzREVYVAkJTUFOR0xFKENvcHlNdWx0aVRleFN1YkltYWdlM0RFWFQpCisjZGVmaW5lIGdsQ29weVBpeGVscwkJTUFOR0xFKENvcHlQaXhlbHMpCisjZGVmaW5lIGdsQ29weVRleEltYWdlMURFWFQJCU1BTkdMRShDb3B5VGV4SW1hZ2UxREVYVCkKKyNkZWZpbmUgZ2xDb3B5VGV4SW1hZ2UxRAkJTUFOR0xFKENvcHlUZXhJbWFnZTFEKQorI2RlZmluZSBnbENvcHlUZXhJbWFnZTJERVhUCQlNQU5HTEUoQ29weVRleEltYWdlMkRFWFQpCisjZGVmaW5lIGdsQ29weVRleEltYWdlMkQJCU1BTkdMRShDb3B5VGV4SW1hZ2UyRCkKKyNkZWZpbmUgZ2xDb3B5VGV4U3ViSW1hZ2UxREVYVAkJTUFOR0xFKENvcHlUZXhTdWJJbWFnZTFERVhUKQorI2RlZmluZSBnbENvcHlUZXhTdWJJbWFnZTFECQlNQU5HTEUoQ29weVRleFN1YkltYWdlMUQpCisjZGVmaW5lIGdsQ29weVRleFN1YkltYWdlMkRFWFQJCU1BTkdMRShDb3B5VGV4U3ViSW1hZ2UyREVYVCkKKyNkZWZpbmUgZ2xDb3B5VGV4U3ViSW1hZ2UyRAkJTUFOR0xFKENvcHlUZXhTdWJJbWFnZTJEKQorI2RlZmluZSBnbENvcHlUZXhTdWJJbWFnZTNERVhUCQlNQU5HTEUoQ29weVRleFN1YkltYWdlM0RFWFQpCisjZGVmaW5lIGdsQ29weVRleFN1YkltYWdlM0QJCU1BTkdMRShDb3B5VGV4U3ViSW1hZ2UzRCkKKyNkZWZpbmUgZ2xDb3B5VGV4dHVyZUltYWdlMURFWFQJCU1BTkdMRShDb3B5VGV4dHVyZUltYWdlMURFWFQpCisjZGVmaW5lIGdsQ29weVRleHR1cmVJbWFnZTJERVhUCQlNQU5HTEUoQ29weVRleHR1cmVJbWFnZTJERVhUKQorI2RlZmluZSBnbENvcHlUZXh0dXJlU3ViSW1hZ2UxREVYVAkJTUFOR0xFKENvcHlUZXh0dXJlU3ViSW1hZ2UxREVYVCkKKyNkZWZpbmUgZ2xDb3B5VGV4dHVyZVN1YkltYWdlMkRFWFQJCU1BTkdMRShDb3B5VGV4dHVyZVN1YkltYWdlMkRFWFQpCisjZGVmaW5lIGdsQ29weVRleHR1cmVTdWJJbWFnZTNERVhUCQlNQU5HTEUoQ29weVRleHR1cmVTdWJJbWFnZTNERVhUKQorI2RlZmluZSBnbENyZWF0ZURlYnVnT2JqZWN0TUVTQQkJTUFOR0xFKENyZWF0ZURlYnVnT2JqZWN0TUVTQSkKKyNkZWZpbmUgZ2xDcmVhdGVQcm9ncmFtCQlNQU5HTEUoQ3JlYXRlUHJvZ3JhbSkKKyNkZWZpbmUgZ2xDcmVhdGVQcm9ncmFtT2JqZWN0QVJCCQlNQU5HTEUoQ3JlYXRlUHJvZ3JhbU9iamVjdEFSQikKKyNkZWZpbmUgZ2xDcmVhdGVTaGFkZXIJCU1BTkdMRShDcmVhdGVTaGFkZXIpCisjZGVmaW5lIGdsQ3JlYXRlU2hhZGVyT2JqZWN0QVJCCQlNQU5HTEUoQ3JlYXRlU2hhZGVyT2JqZWN0QVJCKQorI2RlZmluZSBnbENyZWF0ZVNoYWRlclByb2dyYW1FWFQJCU1BTkdMRShDcmVhdGVTaGFkZXJQcm9ncmFtRVhUKQorI2RlZmluZSBnbENyZWF0ZVNoYWRlclByb2dyYW12CQlNQU5HTEUoQ3JlYXRlU2hhZGVyUHJvZ3JhbXYpCisjZGVmaW5lIGdsQ3JlYXRlU3luY0Zyb21DTGV2ZW50QVJCCQlNQU5HTEUoQ3JlYXRlU3luY0Zyb21DTGV2ZW50QVJCKQorI2RlZmluZSBnbEN1bGxGYWNlCQlNQU5HTEUoQ3VsbEZhY2UpCisjZGVmaW5lIGdsQ3VsbFBhcmFtZXRlcmR2RVhUCQlNQU5HTEUoQ3VsbFBhcmFtZXRlcmR2RVhUKQorI2RlZmluZSBnbEN1bGxQYXJhbWV0ZXJmdkVYVAkJTUFOR0xFKEN1bGxQYXJhbWV0ZXJmdkVYVCkKKyNkZWZpbmUgZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeEFSQgkJTUFOR0xFKEN1cnJlbnRQYWxldHRlTWF0cml4QVJCKQorI2RlZmluZSBnbERlYnVnTWVzc2FnZUNhbGxiYWNrQU1ECQlNQU5HTEUoRGVidWdNZXNzYWdlQ2FsbGJhY2tBTUQpCisjZGVmaW5lIGdsRGVidWdNZXNzYWdlQ2FsbGJhY2tBUkIJCU1BTkdMRShEZWJ1Z01lc3NhZ2VDYWxsYmFja0FSQikKKyNkZWZpbmUgZ2xEZWJ1Z01lc3NhZ2VDb250cm9sQVJCCQlNQU5HTEUoRGVidWdNZXNzYWdlQ29udHJvbEFSQikKKyNkZWZpbmUgZ2xEZWJ1Z01lc3NhZ2VFbmFibGVBTUQJCU1BTkdMRShEZWJ1Z01lc3NhZ2VFbmFibGVBTUQpCisjZGVmaW5lIGdsRGVidWdNZXNzYWdlSW5zZXJ0QU1ECQlNQU5HTEUoRGVidWdNZXNzYWdlSW5zZXJ0QU1EKQorI2RlZmluZSBnbERlYnVnTWVzc2FnZUluc2VydEFSQgkJTUFOR0xFKERlYnVnTWVzc2FnZUluc2VydEFSQikKKyNkZWZpbmUgZ2xEZWZvcm1hdGlvbk1hcDNkU0dJWAkJTUFOR0xFKERlZm9ybWF0aW9uTWFwM2RTR0lYKQorI2RlZmluZSBnbERlZm9ybWF0aW9uTWFwM2ZTR0lYCQlNQU5HTEUoRGVmb3JtYXRpb25NYXAzZlNHSVgpCisjZGVmaW5lIGdsRGVmb3JtU0dJWAkJTUFOR0xFKERlZm9ybVNHSVgpCisjZGVmaW5lIGdsRGVsZXRlQXN5bmNNYXJrZXJzU0dJWAkJTUFOR0xFKERlbGV0ZUFzeW5jTWFya2Vyc1NHSVgpCisjZGVmaW5lIGdsRGVsZXRlQnVmZmVyc0FSQgkJTUFOR0xFKERlbGV0ZUJ1ZmZlcnNBUkIpCisjZGVmaW5lIGdsRGVsZXRlQnVmZmVycwkJTUFOR0xFKERlbGV0ZUJ1ZmZlcnMpCisjZGVmaW5lIGdsRGVsZXRlRmVuY2VzQVBQTEUJCU1BTkdMRShEZWxldGVGZW5jZXNBUFBMRSkKKyNkZWZpbmUgZ2xEZWxldGVGZW5jZXNOVgkJTUFOR0xFKERlbGV0ZUZlbmNlc05WKQorI2RlZmluZSBnbERlbGV0ZUZyYWdtZW50U2hhZGVyQVRJCQlNQU5HTEUoRGVsZXRlRnJhZ21lbnRTaGFkZXJBVEkpCisjZGVmaW5lIGdsRGVsZXRlRnJhbWVidWZmZXJzRVhUCQlNQU5HTEUoRGVsZXRlRnJhbWVidWZmZXJzRVhUKQorI2RlZmluZSBnbERlbGV0ZUZyYW1lYnVmZmVycwkJTUFOR0xFKERlbGV0ZUZyYW1lYnVmZmVycykKKyNkZWZpbmUgZ2xEZWxldGVMaXN0cwkJTUFOR0xFKERlbGV0ZUxpc3RzKQorI2RlZmluZSBnbERlbGV0ZU5hbWVkU3RyaW5nQVJCCQlNQU5HTEUoRGVsZXRlTmFtZWRTdHJpbmdBUkIpCisjZGVmaW5lIGdsRGVsZXRlTmFtZXNBTUQJCU1BTkdMRShEZWxldGVOYW1lc0FNRCkKKyNkZWZpbmUgZ2xEZWxldGVPYmplY3RBUkIJCU1BTkdMRShEZWxldGVPYmplY3RBUkIpCisjZGVmaW5lIGdsRGVsZXRlT2NjbHVzaW9uUXVlcmllc05WCQlNQU5HTEUoRGVsZXRlT2NjbHVzaW9uUXVlcmllc05WKQorI2RlZmluZSBnbERlbGV0ZVBlcmZNb25pdG9yc0FNRAkJTUFOR0xFKERlbGV0ZVBlcmZNb25pdG9yc0FNRCkKKyNkZWZpbmUgZ2xEZWxldGVQcm9ncmFtCQlNQU5HTEUoRGVsZXRlUHJvZ3JhbSkKKyNkZWZpbmUgZ2xEZWxldGVQcm9ncmFtUGlwZWxpbmVzCQlNQU5HTEUoRGVsZXRlUHJvZ3JhbVBpcGVsaW5lcykKKyNkZWZpbmUgZ2xEZWxldGVQcm9ncmFtc0FSQgkJTUFOR0xFKERlbGV0ZVByb2dyYW1zQVJCKQorI2RlZmluZSBnbERlbGV0ZVByb2dyYW1zTlYJCU1BTkdMRShEZWxldGVQcm9ncmFtc05WKQorI2RlZmluZSBnbERlbGV0ZVF1ZXJpZXNBUkIJCU1BTkdMRShEZWxldGVRdWVyaWVzQVJCKQorI2RlZmluZSBnbERlbGV0ZVF1ZXJpZXMJCU1BTkdMRShEZWxldGVRdWVyaWVzKQorI2RlZmluZSBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNFWFQJCU1BTkdMRShEZWxldGVSZW5kZXJidWZmZXJzRVhUKQorI2RlZmluZSBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnMJCU1BTkdMRShEZWxldGVSZW5kZXJidWZmZXJzKQorI2RlZmluZSBnbERlbGV0ZVNhbXBsZXJzCQlNQU5HTEUoRGVsZXRlU2FtcGxlcnMpCisjZGVmaW5lIGdsRGVsZXRlU2hhZGVyCQlNQU5HTEUoRGVsZXRlU2hhZGVyKQorI2RlZmluZSBnbERlbGV0ZVN5bmMJCU1BTkdMRShEZWxldGVTeW5jKQorI2RlZmluZSBnbERlbGV0ZVRleHR1cmVzRVhUCQlNQU5HTEUoRGVsZXRlVGV4dHVyZXNFWFQpCisjZGVmaW5lIGdsRGVsZXRlVGV4dHVyZXMJCU1BTkdMRShEZWxldGVUZXh0dXJlcykKKyNkZWZpbmUgZ2xEZWxldGVUcmFuc2Zvcm1GZWVkYmFja3MJCU1BTkdMRShEZWxldGVUcmFuc2Zvcm1GZWVkYmFja3MpCisjZGVmaW5lIGdsRGVsZXRlVHJhbnNmb3JtRmVlZGJhY2tzTlYJCU1BTkdMRShEZWxldGVUcmFuc2Zvcm1GZWVkYmFja3NOVikKKyNkZWZpbmUgZ2xEZWxldGVWZXJ0ZXhBcnJheXNBUFBMRQkJTUFOR0xFKERlbGV0ZVZlcnRleEFycmF5c0FQUExFKQorI2RlZmluZSBnbERlbGV0ZVZlcnRleEFycmF5cwkJTUFOR0xFKERlbGV0ZVZlcnRleEFycmF5cykKKyNkZWZpbmUgZ2xEZWxldGVWZXJ0ZXhTaGFkZXJFWFQJCU1BTkdMRShEZWxldGVWZXJ0ZXhTaGFkZXJFWFQpCisjZGVmaW5lIGdsRGVwdGhCb3VuZHNkTlYJCU1BTkdMRShEZXB0aEJvdW5kc2ROVikKKyNkZWZpbmUgZ2xEZXB0aEJvdW5kc0VYVAkJTUFOR0xFKERlcHRoQm91bmRzRVhUKQorI2RlZmluZSBnbERlcHRoRnVuYwkJTUFOR0xFKERlcHRoRnVuYykKKyNkZWZpbmUgZ2xEZXB0aE1hc2sJCU1BTkdMRShEZXB0aE1hc2spCisjZGVmaW5lIGdsRGVwdGhSYW5nZUFycmF5dgkJTUFOR0xFKERlcHRoUmFuZ2VBcnJheXYpCisjZGVmaW5lIGdsRGVwdGhSYW5nZWROVgkJTUFOR0xFKERlcHRoUmFuZ2VkTlYpCisjZGVmaW5lIGdsRGVwdGhSYW5nZWYJCU1BTkdMRShEZXB0aFJhbmdlZikKKyNkZWZpbmUgZ2xEZXB0aFJhbmdlSW5kZXhlZAkJTUFOR0xFKERlcHRoUmFuZ2VJbmRleGVkKQorI2RlZmluZSBnbERlcHRoUmFuZ2UJCU1BTkdMRShEZXB0aFJhbmdlKQorI2RlZmluZSBnbERldGFjaE9iamVjdEFSQgkJTUFOR0xFKERldGFjaE9iamVjdEFSQikKKyNkZWZpbmUgZ2xEZXRhY2hTaGFkZXIJCU1BTkdMRShEZXRhY2hTaGFkZXIpCisjZGVmaW5lIGdsRGV0YWlsVGV4RnVuY1NHSVMJCU1BTkdMRShEZXRhaWxUZXhGdW5jU0dJUykKKyNkZWZpbmUgZ2xEaXNhYmxlQ2xpZW50U3RhdGVJbmRleGVkRVhUCQlNQU5HTEUoRGlzYWJsZUNsaWVudFN0YXRlSW5kZXhlZEVYVCkKKyNkZWZpbmUgZ2xEaXNhYmxlQ2xpZW50U3RhdGUJCU1BTkdMRShEaXNhYmxlQ2xpZW50U3RhdGUpCisjZGVmaW5lIGdsRGlzYWJsZWkJCU1BTkdMRShEaXNhYmxlaSkKKyNkZWZpbmUgZ2xEaXNhYmxlSW5kZXhlZEVYVAkJTUFOR0xFKERpc2FibGVJbmRleGVkRVhUKQorI2RlZmluZSBnbERpc2FibGUJCU1BTkdMRShEaXNhYmxlKQorI2RlZmluZSBnbERpc2FibGVWYXJpYW50Q2xpZW50U3RhdGVFWFQJCU1BTkdMRShEaXNhYmxlVmFyaWFudENsaWVudFN0YXRlRVhUKQorI2RlZmluZSBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBUFBMRQkJTUFOR0xFKERpc2FibGVWZXJ0ZXhBdHRyaWJBUFBMRSkKKyNkZWZpbmUgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXlBUkIJCU1BTkdMRShEaXNhYmxlVmVydGV4QXR0cmliQXJyYXlBUkIpCisjZGVmaW5lIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5CQlNQU5HTEUoRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KQorI2RlZmluZSBnbERyYXdBcnJheXNFWFQJCU1BTkdMRShEcmF3QXJyYXlzRVhUKQorI2RlZmluZSBnbERyYXdBcnJheXNJbmRpcmVjdAkJTUFOR0xFKERyYXdBcnJheXNJbmRpcmVjdCkKKyNkZWZpbmUgZ2xEcmF3QXJyYXlzSW5zdGFuY2VkQVJCCQlNQU5HTEUoRHJhd0FycmF5c0luc3RhbmNlZEFSQikKKyNkZWZpbmUgZ2xEcmF3QXJyYXlzSW5zdGFuY2VkRVhUCQlNQU5HTEUoRHJhd0FycmF5c0luc3RhbmNlZEVYVCkKKyNkZWZpbmUgZ2xEcmF3QXJyYXlzSW5zdGFuY2VkCQlNQU5HTEUoRHJhd0FycmF5c0luc3RhbmNlZCkKKyNkZWZpbmUgZ2xEcmF3QXJyYXlzCQlNQU5HTEUoRHJhd0FycmF5cykKKyNkZWZpbmUgZ2xEcmF3QnVmZmVyCQlNQU5HTEUoRHJhd0J1ZmZlcikKKyNkZWZpbmUgZ2xEcmF3QnVmZmVyc0FSQgkJTUFOR0xFKERyYXdCdWZmZXJzQVJCKQorI2RlZmluZSBnbERyYXdCdWZmZXJzQVRJCQlNQU5HTEUoRHJhd0J1ZmZlcnNBVEkpCisjZGVmaW5lIGdsRHJhd0J1ZmZlcnMJCU1BTkdMRShEcmF3QnVmZmVycykKKyNkZWZpbmUgZ2xEcmF3RWxlbWVudEFycmF5QVBQTEUJCU1BTkdMRShEcmF3RWxlbWVudEFycmF5QVBQTEUpCisjZGVmaW5lIGdsRHJhd0VsZW1lbnRBcnJheUFUSQkJTUFOR0xFKERyYXdFbGVtZW50QXJyYXlBVEkpCisjZGVmaW5lIGdsRHJhd0VsZW1lbnRzQmFzZVZlcnRleAkJTUFOR0xFKERyYXdFbGVtZW50c0Jhc2VWZXJ0ZXgpCisjZGVmaW5lIGdsRHJhd0VsZW1lbnRzSW5kaXJlY3QJCU1BTkdMRShEcmF3RWxlbWVudHNJbmRpcmVjdCkKKyNkZWZpbmUgZ2xEcmF3RWxlbWVudHNJbnN0YW5jZWRBUkIJCU1BTkdMRShEcmF3RWxlbWVudHNJbnN0YW5jZWRBUkIpCisjZGVmaW5lIGdsRHJhd0VsZW1lbnRzSW5zdGFuY2VkQmFzZVZlcnRleAkJTUFOR0xFKERyYXdFbGVtZW50c0luc3RhbmNlZEJhc2VWZXJ0ZXgpCisjZGVmaW5lIGdsRHJhd0VsZW1lbnRzSW5zdGFuY2VkRVhUCQlNQU5HTEUoRHJhd0VsZW1lbnRzSW5zdGFuY2VkRVhUKQorI2RlZmluZSBnbERyYXdFbGVtZW50c0luc3RhbmNlZAkJTUFOR0xFKERyYXdFbGVtZW50c0luc3RhbmNlZCkKKyNkZWZpbmUgZ2xEcmF3RWxlbWVudHMJCU1BTkdMRShEcmF3RWxlbWVudHMpCisjZGVmaW5lIGdsRHJhd01lc2hBcnJheXNTVU4JCU1BTkdMRShEcmF3TWVzaEFycmF5c1NVTikKKyNkZWZpbmUgZ2xEcmF3UGl4ZWxzCQlNQU5HTEUoRHJhd1BpeGVscykKKyNkZWZpbmUgZ2xEcmF3UmFuZ2VFbGVtZW50QXJyYXlBUFBMRQkJTUFOR0xFKERyYXdSYW5nZUVsZW1lbnRBcnJheUFQUExFKQorI2RlZmluZSBnbERyYXdSYW5nZUVsZW1lbnRBcnJheUFUSQkJTUFOR0xFKERyYXdSYW5nZUVsZW1lbnRBcnJheUFUSSkKKyNkZWZpbmUgZ2xEcmF3UmFuZ2VFbGVtZW50c0Jhc2VWZXJ0ZXgJCU1BTkdMRShEcmF3UmFuZ2VFbGVtZW50c0Jhc2VWZXJ0ZXgpCisjZGVmaW5lIGdsRHJhd1JhbmdlRWxlbWVudHNFWFQJCU1BTkdMRShEcmF3UmFuZ2VFbGVtZW50c0VYVCkKKyNkZWZpbmUgZ2xEcmF3UmFuZ2VFbGVtZW50cwkJTUFOR0xFKERyYXdSYW5nZUVsZW1lbnRzKQorI2RlZmluZSBnbERyYXdUcmFuc2Zvcm1GZWVkYmFjawkJTUFOR0xFKERyYXdUcmFuc2Zvcm1GZWVkYmFjaykKKyNkZWZpbmUgZ2xEcmF3VHJhbnNmb3JtRmVlZGJhY2tOVgkJTUFOR0xFKERyYXdUcmFuc2Zvcm1GZWVkYmFja05WKQorI2RlZmluZSBnbERyYXdUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbQkJTUFOR0xFKERyYXdUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbSkKKyNkZWZpbmUgZ2xFZGdlRmxhZ0Zvcm1hdE5WCQlNQU5HTEUoRWRnZUZsYWdGb3JtYXROVikKKyNkZWZpbmUgZ2xFZGdlRmxhZwkJTUFOR0xFKEVkZ2VGbGFnKQorI2RlZmluZSBnbEVkZ2VGbGFnUG9pbnRlckVYVAkJTUFOR0xFKEVkZ2VGbGFnUG9pbnRlckVYVCkKKyNkZWZpbmUgZ2xFZGdlRmxhZ1BvaW50ZXJMaXN0SUJNCQlNQU5HTEUoRWRnZUZsYWdQb2ludGVyTGlzdElCTSkKKyNkZWZpbmUgZ2xFZGdlRmxhZ1BvaW50ZXIJCU1BTkdMRShFZGdlRmxhZ1BvaW50ZXIpCisjZGVmaW5lIGdsRWRnZUZsYWd2CQlNQU5HTEUoRWRnZUZsYWd2KQorI2RlZmluZSBnbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUwkJTUFOR0xFKEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUykKKyNkZWZpbmUgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUwkJTUFOR0xFKEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTKQorI2RlZmluZSBnbEVsZW1lbnRQb2ludGVyQVBQTEUJCU1BTkdMRShFbGVtZW50UG9pbnRlckFQUExFKQorI2RlZmluZSBnbEVsZW1lbnRQb2ludGVyQVRJCQlNQU5HTEUoRWxlbWVudFBvaW50ZXJBVEkpCisjZGVmaW5lIGdsRW5hYmxlQ2xpZW50U3RhdGVJbmRleGVkRVhUCQlNQU5HTEUoRW5hYmxlQ2xpZW50U3RhdGVJbmRleGVkRVhUKQorI2RlZmluZSBnbEVuYWJsZUNsaWVudFN0YXRlCQlNQU5HTEUoRW5hYmxlQ2xpZW50U3RhdGUpCisjZGVmaW5lIGdsRW5hYmxlaQkJTUFOR0xFKEVuYWJsZWkpCisjZGVmaW5lIGdsRW5hYmxlSW5kZXhlZEVYVAkJTUFOR0xFKEVuYWJsZUluZGV4ZWRFWFQpCisjZGVmaW5lIGdsRW5hYmxlCQlNQU5HTEUoRW5hYmxlKQorI2RlZmluZSBnbEVuYWJsZVZhcmlhbnRDbGllbnRTdGF0ZUVYVAkJTUFOR0xFKEVuYWJsZVZhcmlhbnRDbGllbnRTdGF0ZUVYVCkKKyNkZWZpbmUgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBUFBMRQkJTUFOR0xFKEVuYWJsZVZlcnRleEF0dHJpYkFQUExFKQorI2RlZmluZSBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5QVJCCQlNQU5HTEUoRW5hYmxlVmVydGV4QXR0cmliQXJyYXlBUkIpCisjZGVmaW5lIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkJCU1BTkdMRShFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSkKKyNkZWZpbmUgZ2xFbmRDb25kaXRpb25hbFJlbmRlcgkJTUFOR0xFKEVuZENvbmRpdGlvbmFsUmVuZGVyKQorI2RlZmluZSBnbEVuZENvbmRpdGlvbmFsUmVuZGVyTlYJCU1BTkdMRShFbmRDb25kaXRpb25hbFJlbmRlck5WKQorI2RlZmluZSBnbEVuZEZyYWdtZW50U2hhZGVyQVRJCQlNQU5HTEUoRW5kRnJhZ21lbnRTaGFkZXJBVEkpCisjZGVmaW5lIGdsRW5kTGlzdAkJTUFOR0xFKEVuZExpc3QpCisjZGVmaW5lIGdsRW5kCQlNQU5HTEUoRW5kKQorI2RlZmluZSBnbEVuZE9jY2x1c2lvblF1ZXJ5TlYJCU1BTkdMRShFbmRPY2NsdXNpb25RdWVyeU5WKQorI2RlZmluZSBnbEVuZFBlcmZNb25pdG9yQU1ECQlNQU5HTEUoRW5kUGVyZk1vbml0b3JBTUQpCisjZGVmaW5lIGdsRW5kUXVlcnlBUkIJCU1BTkdMRShFbmRRdWVyeUFSQikKKyNkZWZpbmUgZ2xFbmRRdWVyeUluZGV4ZWQJCU1BTkdMRShFbmRRdWVyeUluZGV4ZWQpCisjZGVmaW5lIGdsRW5kUXVlcnkJCU1BTkdMRShFbmRRdWVyeSkKKyNkZWZpbmUgZ2xFbmRUcmFuc2Zvcm1GZWVkYmFja0VYVAkJTUFOR0xFKEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUKQorI2RlZmluZSBnbEVuZFRyYW5zZm9ybUZlZWRiYWNrCQlNQU5HTEUoRW5kVHJhbnNmb3JtRmVlZGJhY2spCisjZGVmaW5lIGdsRW5kVHJhbnNmb3JtRmVlZGJhY2tOVgkJTUFOR0xFKEVuZFRyYW5zZm9ybUZlZWRiYWNrTlYpCisjZGVmaW5lIGdsRW5kVmVydGV4U2hhZGVyRVhUCQlNQU5HTEUoRW5kVmVydGV4U2hhZGVyRVhUKQorI2RlZmluZSBnbEVuZFZpZGVvQ2FwdHVyZU5WCQlNQU5HTEUoRW5kVmlkZW9DYXB0dXJlTlYpCisjZGVmaW5lIGdsRXZhbENvb3JkMWQJCU1BTkdMRShFdmFsQ29vcmQxZCkKKyNkZWZpbmUgZ2xFdmFsQ29vcmQxZHYJCU1BTkdMRShFdmFsQ29vcmQxZHYpCisjZGVmaW5lIGdsRXZhbENvb3JkMWYJCU1BTkdMRShFdmFsQ29vcmQxZikKKyNkZWZpbmUgZ2xFdmFsQ29vcmQxZnYJCU1BTkdMRShFdmFsQ29vcmQxZnYpCisjZGVmaW5lIGdsRXZhbENvb3JkMmQJCU1BTkdMRShFdmFsQ29vcmQyZCkKKyNkZWZpbmUgZ2xFdmFsQ29vcmQyZHYJCU1BTkdMRShFdmFsQ29vcmQyZHYpCisjZGVmaW5lIGdsRXZhbENvb3JkMmYJCU1BTkdMRShFdmFsQ29vcmQyZikKKyNkZWZpbmUgZ2xFdmFsQ29vcmQyZnYJCU1BTkdMRShFdmFsQ29vcmQyZnYpCisjZGVmaW5lIGdsRXZhbE1hcHNOVgkJTUFOR0xFKEV2YWxNYXBzTlYpCisjZGVmaW5lIGdsRXZhbE1lc2gxCQlNQU5HTEUoRXZhbE1lc2gxKQorI2RlZmluZSBnbEV2YWxNZXNoMgkJTUFOR0xFKEV2YWxNZXNoMikKKyNkZWZpbmUgZ2xFdmFsUG9pbnQxCQlNQU5HTEUoRXZhbFBvaW50MSkKKyNkZWZpbmUgZ2xFdmFsUG9pbnQyCQlNQU5HTEUoRXZhbFBvaW50MikKKyNkZWZpbmUgZ2xFeGVjdXRlUHJvZ3JhbU5WCQlNQU5HTEUoRXhlY3V0ZVByb2dyYW1OVikKKyNkZWZpbmUgZ2xFeHRyYWN0Q29tcG9uZW50RVhUCQlNQU5HTEUoRXh0cmFjdENvbXBvbmVudEVYVCkKKyNkZWZpbmUgZ2xGZWVkYmFja0J1ZmZlcgkJTUFOR0xFKEZlZWRiYWNrQnVmZmVyKQorI2RlZmluZSBnbEZlbmNlU3luYwkJTUFOR0xFKEZlbmNlU3luYykKKyNkZWZpbmUgZ2xGaW5hbENvbWJpbmVySW5wdXROVgkJTUFOR0xFKEZpbmFsQ29tYmluZXJJbnB1dE5WKQorI2RlZmluZSBnbEZpbmlzaEFzeW5jU0dJWAkJTUFOR0xFKEZpbmlzaEFzeW5jU0dJWCkKKyNkZWZpbmUgZ2xGaW5pc2hGZW5jZUFQUExFCQlNQU5HTEUoRmluaXNoRmVuY2VBUFBMRSkKKyNkZWZpbmUgZ2xGaW5pc2hGZW5jZU5WCQlNQU5HTEUoRmluaXNoRmVuY2VOVikKKyNkZWZpbmUgZ2xGaW5pc2gJCU1BTkdMRShGaW5pc2gpCisjZGVmaW5lIGdsRmluaXNoT2JqZWN0QVBQTEUJCU1BTkdMRShGaW5pc2hPYmplY3RBUFBMRSkKKyNkZWZpbmUgZ2xGaW5pc2hUZXh0dXJlU1VOWAkJTUFOR0xFKEZpbmlzaFRleHR1cmVTVU5YKQorI2RlZmluZSBnbEZsdXNoCQlNQU5HTEUoRmx1c2gpCisjZGVmaW5lIGdsRmx1c2hNYXBwZWRCdWZmZXJSYW5nZUFQUExFCQlNQU5HTEUoRmx1c2hNYXBwZWRCdWZmZXJSYW5nZUFQUExFKQorI2RlZmluZSBnbEZsdXNoTWFwcGVkQnVmZmVyUmFuZ2UJCU1BTkdMRShGbHVzaE1hcHBlZEJ1ZmZlclJhbmdlKQorI2RlZmluZSBnbEZsdXNoTWFwcGVkTmFtZWRCdWZmZXJSYW5nZUVYVAkJTUFOR0xFKEZsdXNoTWFwcGVkTmFtZWRCdWZmZXJSYW5nZUVYVCkKKyNkZWZpbmUgZ2xGbHVzaFBpeGVsRGF0YVJhbmdlTlYJCU1BTkdMRShGbHVzaFBpeGVsRGF0YVJhbmdlTlYpCisjZGVmaW5lIGdsRmx1c2hSYXN0ZXJTR0lYCQlNQU5HTEUoRmx1c2hSYXN0ZXJTR0lYKQorI2RlZmluZSBnbEZsdXNoVmVydGV4QXJyYXlSYW5nZUFQUExFCQlNQU5HTEUoRmx1c2hWZXJ0ZXhBcnJheVJhbmdlQVBQTEUpCisjZGVmaW5lIGdsRmx1c2hWZXJ0ZXhBcnJheVJhbmdlTlYJCU1BTkdMRShGbHVzaFZlcnRleEFycmF5UmFuZ2VOVikKKyNkZWZpbmUgZ2xGb2dDb29yZGRFWFQJCU1BTkdMRShGb2dDb29yZGRFWFQpCisjZGVmaW5lIGdsRm9nQ29vcmRkCQlNQU5HTEUoRm9nQ29vcmRkKQorI2RlZmluZSBnbEZvZ0Nvb3JkZHZFWFQJCU1BTkdMRShGb2dDb29yZGR2RVhUKQorI2RlZmluZSBnbEZvZ0Nvb3JkZHYJCU1BTkdMRShGb2dDb29yZGR2KQorI2RlZmluZSBnbEZvZ0Nvb3JkZkVYVAkJTUFOR0xFKEZvZ0Nvb3JkZkVYVCkKKyNkZWZpbmUgZ2xGb2dDb29yZGYJCU1BTkdMRShGb2dDb29yZGYpCisjZGVmaW5lIGdsRm9nQ29vcmRGb3JtYXROVgkJTUFOR0xFKEZvZ0Nvb3JkRm9ybWF0TlYpCisjZGVmaW5lIGdsRm9nQ29vcmRmdkVYVAkJTUFOR0xFKEZvZ0Nvb3JkZnZFWFQpCisjZGVmaW5lIGdsRm9nQ29vcmRmdgkJTUFOR0xFKEZvZ0Nvb3JkZnYpCisjZGVmaW5lIGdsRm9nQ29vcmRoTlYJCU1BTkdMRShGb2dDb29yZGhOVikKKyNkZWZpbmUgZ2xGb2dDb29yZGh2TlYJCU1BTkdMRShGb2dDb29yZGh2TlYpCisjZGVmaW5lIGdsRm9nQ29vcmRQb2ludGVyRVhUCQlNQU5HTEUoRm9nQ29vcmRQb2ludGVyRVhUKQorI2RlZmluZSBnbEZvZ0Nvb3JkUG9pbnRlckxpc3RJQk0JCU1BTkdMRShGb2dDb29yZFBvaW50ZXJMaXN0SUJNKQorI2RlZmluZSBnbEZvZ0Nvb3JkUG9pbnRlcgkJTUFOR0xFKEZvZ0Nvb3JkUG9pbnRlcikKKyNkZWZpbmUgZ2xGb2dmCQlNQU5HTEUoRm9nZikKKyNkZWZpbmUgZ2xGb2dGdW5jU0dJUwkJTUFOR0xFKEZvZ0Z1bmNTR0lTKQorI2RlZmluZSBnbEZvZ2Z2CQlNQU5HTEUoRm9nZnYpCisjZGVmaW5lIGdsRm9naQkJTUFOR0xFKEZvZ2kpCisjZGVmaW5lIGdsRm9naXYJCU1BTkdMRShGb2dpdikKKyNkZWZpbmUgZ2xGcmFnbWVudENvbG9yTWF0ZXJpYWxTR0lYCQlNQU5HTEUoRnJhZ21lbnRDb2xvck1hdGVyaWFsU0dJWCkKKyNkZWZpbmUgZ2xGcmFnbWVudExpZ2h0ZlNHSVgJCU1BTkdMRShGcmFnbWVudExpZ2h0ZlNHSVgpCisjZGVmaW5lIGdsRnJhZ21lbnRMaWdodGZ2U0dJWAkJTUFOR0xFKEZyYWdtZW50TGlnaHRmdlNHSVgpCisjZGVmaW5lIGdsRnJhZ21lbnRMaWdodGlTR0lYCQlNQU5HTEUoRnJhZ21lbnRMaWdodGlTR0lYKQorI2RlZmluZSBnbEZyYWdtZW50TGlnaHRpdlNHSVgJCU1BTkdMRShGcmFnbWVudExpZ2h0aXZTR0lYKQorI2RlZmluZSBnbEZyYWdtZW50TGlnaHRNb2RlbGZTR0lYCQlNQU5HTEUoRnJhZ21lbnRMaWdodE1vZGVsZlNHSVgpCisjZGVmaW5lIGdsRnJhZ21lbnRMaWdodE1vZGVsZnZTR0lYCQlNQU5HTEUoRnJhZ21lbnRMaWdodE1vZGVsZnZTR0lYKQorI2RlZmluZSBnbEZyYWdtZW50TGlnaHRNb2RlbGlTR0lYCQlNQU5HTEUoRnJhZ21lbnRMaWdodE1vZGVsaVNHSVgpCisjZGVmaW5lIGdsRnJhZ21lbnRMaWdodE1vZGVsaXZTR0lYCQlNQU5HTEUoRnJhZ21lbnRMaWdodE1vZGVsaXZTR0lYKQorI2RlZmluZSBnbEZyYWdtZW50TWF0ZXJpYWxmU0dJWAkJTUFOR0xFKEZyYWdtZW50TWF0ZXJpYWxmU0dJWCkKKyNkZWZpbmUgZ2xGcmFnbWVudE1hdGVyaWFsZnZTR0lYCQlNQU5HTEUoRnJhZ21lbnRNYXRlcmlhbGZ2U0dJWCkKKyNkZWZpbmUgZ2xGcmFnbWVudE1hdGVyaWFsaVNHSVgJCU1BTkdMRShGcmFnbWVudE1hdGVyaWFsaVNHSVgpCisjZGVmaW5lIGdsRnJhZ21lbnRNYXRlcmlhbGl2U0dJWAkJTUFOR0xFKEZyYWdtZW50TWF0ZXJpYWxpdlNHSVgpCisjZGVmaW5lIGdsRnJhbWVidWZmZXJEcmF3QnVmZmVyRVhUCQlNQU5HTEUoRnJhbWVidWZmZXJEcmF3QnVmZmVyRVhUKQorI2RlZmluZSBnbEZyYW1lYnVmZmVyRHJhd0J1ZmZlcnNFWFQJCU1BTkdMRShGcmFtZWJ1ZmZlckRyYXdCdWZmZXJzRVhUKQorI2RlZmluZSBnbEZyYW1lYnVmZmVyUmVhZEJ1ZmZlckVYVAkJTUFOR0xFKEZyYW1lYnVmZmVyUmVhZEJ1ZmZlckVYVCkKKyNkZWZpbmUgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVAkJTUFOR0xFKEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKQorI2RlZmluZSBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyCQlNQU5HTEUoRnJhbWVidWZmZXJSZW5kZXJidWZmZXIpCisjZGVmaW5lIGdsRnJhbWVidWZmZXJUZXh0dXJlMURFWFQJCU1BTkdMRShGcmFtZWJ1ZmZlclRleHR1cmUxREVYVCkKKyNkZWZpbmUgZ2xGcmFtZWJ1ZmZlclRleHR1cmUxRAkJTUFOR0xFKEZyYW1lYnVmZmVyVGV4dHVyZTFEKQorI2RlZmluZSBnbEZyYW1lYnVmZmVyVGV4dHVyZTJERVhUCQlNQU5HTEUoRnJhbWVidWZmZXJUZXh0dXJlMkRFWFQpCisjZGVmaW5lIGdsRnJhbWVidWZmZXJUZXh0dXJlMkQJCU1BTkdMRShGcmFtZWJ1ZmZlclRleHR1cmUyRCkKKyNkZWZpbmUgZ2xGcmFtZWJ1ZmZlclRleHR1cmUzREVYVAkJTUFOR0xFKEZyYW1lYnVmZmVyVGV4dHVyZTNERVhUKQorI2RlZmluZSBnbEZyYW1lYnVmZmVyVGV4dHVyZTNECQlNQU5HTEUoRnJhbWVidWZmZXJUZXh0dXJlM0QpCisjZGVmaW5lIGdsRnJhbWVidWZmZXJUZXh0dXJlQVJCCQlNQU5HTEUoRnJhbWVidWZmZXJUZXh0dXJlQVJCKQorI2RlZmluZSBnbEZyYW1lYnVmZmVyVGV4dHVyZUVYVAkJTUFOR0xFKEZyYW1lYnVmZmVyVGV4dHVyZUVYVCkKKyNkZWZpbmUgZ2xGcmFtZWJ1ZmZlclRleHR1cmVGYWNlQVJCCQlNQU5HTEUoRnJhbWVidWZmZXJUZXh0dXJlRmFjZUFSQikKKyNkZWZpbmUgZ2xGcmFtZWJ1ZmZlclRleHR1cmVGYWNlRVhUCQlNQU5HTEUoRnJhbWVidWZmZXJUZXh0dXJlRmFjZUVYVCkKKyNkZWZpbmUgZ2xGcmFtZWJ1ZmZlclRleHR1cmVMYXllckFSQgkJTUFOR0xFKEZyYW1lYnVmZmVyVGV4dHVyZUxheWVyQVJCKQorI2RlZmluZSBnbEZyYW1lYnVmZmVyVGV4dHVyZUxheWVyRVhUCQlNQU5HTEUoRnJhbWVidWZmZXJUZXh0dXJlTGF5ZXJFWFQpCisjZGVmaW5lIGdsRnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIJCU1BTkdMRShGcmFtZWJ1ZmZlclRleHR1cmVMYXllcikKKyNkZWZpbmUgZ2xGcmFtZWJ1ZmZlclRleHR1cmUJCU1BTkdMRShGcmFtZWJ1ZmZlclRleHR1cmUpCisjZGVmaW5lIGdsRnJhbWVUZXJtaW5hdG9yR1JFTUVEWQkJTUFOR0xFKEZyYW1lVGVybWluYXRvckdSRU1FRFkpCisjZGVmaW5lIGdsRnJhbWVab29tU0dJWAkJTUFOR0xFKEZyYW1lWm9vbVNHSVgpCisjZGVmaW5lIGdsRnJlZU9iamVjdEJ1ZmZlckFUSQkJTUFOR0xFKEZyZWVPYmplY3RCdWZmZXJBVEkpCisjZGVmaW5lIGdsRnJvbnRGYWNlCQlNQU5HTEUoRnJvbnRGYWNlKQorI2RlZmluZSBnbEZydXN0dW0JCU1BTkdMRShGcnVzdHVtKQorI2RlZmluZSBnbEdlbkFzeW5jTWFya2Vyc1NHSVgJCU1BTkdMRShHZW5Bc3luY01hcmtlcnNTR0lYKQorI2RlZmluZSBnbEdlbkJ1ZmZlcnNBUkIJCU1BTkdMRShHZW5CdWZmZXJzQVJCKQorI2RlZmluZSBnbEdlbkJ1ZmZlcnMJCU1BTkdMRShHZW5CdWZmZXJzKQorI2RlZmluZSBnbEdlbmVyYXRlTWlwbWFwRVhUCQlNQU5HTEUoR2VuZXJhdGVNaXBtYXBFWFQpCisjZGVmaW5lIGdsR2VuZXJhdGVNaXBtYXAJCU1BTkdMRShHZW5lcmF0ZU1pcG1hcCkKKyNkZWZpbmUgZ2xHZW5lcmF0ZU11bHRpVGV4TWlwbWFwRVhUCQlNQU5HTEUoR2VuZXJhdGVNdWx0aVRleE1pcG1hcEVYVCkKKyNkZWZpbmUgZ2xHZW5lcmF0ZVRleHR1cmVNaXBtYXBFWFQJCU1BTkdMRShHZW5lcmF0ZVRleHR1cmVNaXBtYXBFWFQpCisjZGVmaW5lIGdsR2VuRmVuY2VzQVBQTEUJCU1BTkdMRShHZW5GZW5jZXNBUFBMRSkKKyNkZWZpbmUgZ2xHZW5GZW5jZXNOVgkJTUFOR0xFKEdlbkZlbmNlc05WKQorI2RlZmluZSBnbEdlbkZyYWdtZW50U2hhZGVyc0FUSQkJTUFOR0xFKEdlbkZyYWdtZW50U2hhZGVyc0FUSSkKKyNkZWZpbmUgZ2xHZW5GcmFtZWJ1ZmZlcnNFWFQJCU1BTkdMRShHZW5GcmFtZWJ1ZmZlcnNFWFQpCisjZGVmaW5lIGdsR2VuRnJhbWVidWZmZXJzCQlNQU5HTEUoR2VuRnJhbWVidWZmZXJzKQorI2RlZmluZSBnbEdlbkxpc3RzCQlNQU5HTEUoR2VuTGlzdHMpCisjZGVmaW5lIGdsR2VuTmFtZXNBTUQJCU1BTkdMRShHZW5OYW1lc0FNRCkKKyNkZWZpbmUgZ2xHZW5PY2NsdXNpb25RdWVyaWVzTlYJCU1BTkdMRShHZW5PY2NsdXNpb25RdWVyaWVzTlYpCisjZGVmaW5lIGdsR2VuUGVyZk1vbml0b3JzQU1ECQlNQU5HTEUoR2VuUGVyZk1vbml0b3JzQU1EKQorI2RlZmluZSBnbEdlblByb2dyYW1QaXBlbGluZXMJCU1BTkdMRShHZW5Qcm9ncmFtUGlwZWxpbmVzKQorI2RlZmluZSBnbEdlblByb2dyYW1zQVJCCQlNQU5HTEUoR2VuUHJvZ3JhbXNBUkIpCisjZGVmaW5lIGdsR2VuUHJvZ3JhbXNOVgkJTUFOR0xFKEdlblByb2dyYW1zTlYpCisjZGVmaW5lIGdsR2VuUXVlcmllc0FSQgkJTUFOR0xFKEdlblF1ZXJpZXNBUkIpCisjZGVmaW5lIGdsR2VuUXVlcmllcwkJTUFOR0xFKEdlblF1ZXJpZXMpCisjZGVmaW5lIGdsR2VuUmVuZGVyYnVmZmVyc0VYVAkJTUFOR0xFKEdlblJlbmRlcmJ1ZmZlcnNFWFQpCisjZGVmaW5lIGdsR2VuUmVuZGVyYnVmZmVycwkJTUFOR0xFKEdlblJlbmRlcmJ1ZmZlcnMpCisjZGVmaW5lIGdsR2VuU2FtcGxlcnMJCU1BTkdMRShHZW5TYW1wbGVycykKKyNkZWZpbmUgZ2xHZW5TeW1ib2xzRVhUCQlNQU5HTEUoR2VuU3ltYm9sc0VYVCkKKyNkZWZpbmUgZ2xHZW5UZXh0dXJlc0VYVAkJTUFOR0xFKEdlblRleHR1cmVzRVhUKQorI2RlZmluZSBnbEdlblRleHR1cmVzCQlNQU5HTEUoR2VuVGV4dHVyZXMpCisjZGVmaW5lIGdsR2VuVHJhbnNmb3JtRmVlZGJhY2tzCQlNQU5HTEUoR2VuVHJhbnNmb3JtRmVlZGJhY2tzKQorI2RlZmluZSBnbEdlblRyYW5zZm9ybUZlZWRiYWNrc05WCQlNQU5HTEUoR2VuVHJhbnNmb3JtRmVlZGJhY2tzTlYpCisjZGVmaW5lIGdsR2VuVmVydGV4QXJyYXlzQVBQTEUJCU1BTkdMRShHZW5WZXJ0ZXhBcnJheXNBUFBMRSkKKyNkZWZpbmUgZ2xHZW5WZXJ0ZXhBcnJheXMJCU1BTkdMRShHZW5WZXJ0ZXhBcnJheXMpCisjZGVmaW5lIGdsR2VuVmVydGV4U2hhZGVyc0VYVAkJTUFOR0xFKEdlblZlcnRleFNoYWRlcnNFWFQpCisjZGVmaW5lIGdsR2V0QWN0aXZlQXR0cmliQVJCCQlNQU5HTEUoR2V0QWN0aXZlQXR0cmliQVJCKQorI2RlZmluZSBnbEdldEFjdGl2ZUF0dHJpYgkJTUFOR0xFKEdldEFjdGl2ZUF0dHJpYikKKyNkZWZpbmUgZ2xHZXRBY3RpdmVTdWJyb3V0aW5lTmFtZQkJTUFOR0xFKEdldEFjdGl2ZVN1YnJvdXRpbmVOYW1lKQorI2RlZmluZSBnbEdldEFjdGl2ZVN1YnJvdXRpbmVVbmlmb3JtaXYJCU1BTkdMRShHZXRBY3RpdmVTdWJyb3V0aW5lVW5pZm9ybWl2KQorI2RlZmluZSBnbEdldEFjdGl2ZVN1YnJvdXRpbmVVbmlmb3JtTmFtZQkJTUFOR0xFKEdldEFjdGl2ZVN1YnJvdXRpbmVVbmlmb3JtTmFtZSkKKyNkZWZpbmUgZ2xHZXRBY3RpdmVVbmlmb3JtQVJCCQlNQU5HTEUoR2V0QWN0aXZlVW5pZm9ybUFSQikKKyNkZWZpbmUgZ2xHZXRBY3RpdmVVbmlmb3JtQmxvY2tpdgkJTUFOR0xFKEdldEFjdGl2ZVVuaWZvcm1CbG9ja2l2KQorI2RlZmluZSBnbEdldEFjdGl2ZVVuaWZvcm1CbG9ja05hbWUJCU1BTkdMRShHZXRBY3RpdmVVbmlmb3JtQmxvY2tOYW1lKQorI2RlZmluZSBnbEdldEFjdGl2ZVVuaWZvcm0JCU1BTkdMRShHZXRBY3RpdmVVbmlmb3JtKQorI2RlZmluZSBnbEdldEFjdGl2ZVVuaWZvcm1OYW1lCQlNQU5HTEUoR2V0QWN0aXZlVW5pZm9ybU5hbWUpCisjZGVmaW5lIGdsR2V0QWN0aXZlVW5pZm9ybXNpdgkJTUFOR0xFKEdldEFjdGl2ZVVuaWZvcm1zaXYpCisjZGVmaW5lIGdsR2V0QWN0aXZlVmFyeWluZ05WCQlNQU5HTEUoR2V0QWN0aXZlVmFyeWluZ05WKQorI2RlZmluZSBnbEdldEFycmF5T2JqZWN0ZnZBVEkJCU1BTkdMRShHZXRBcnJheU9iamVjdGZ2QVRJKQorI2RlZmluZSBnbEdldEFycmF5T2JqZWN0aXZBVEkJCU1BTkdMRShHZXRBcnJheU9iamVjdGl2QVRJKQorI2RlZmluZSBnbEdldEF0dGFjaGVkT2JqZWN0c0FSQgkJTUFOR0xFKEdldEF0dGFjaGVkT2JqZWN0c0FSQikKKyNkZWZpbmUgZ2xHZXRBdHRhY2hlZFNoYWRlcnMJCU1BTkdMRShHZXRBdHRhY2hlZFNoYWRlcnMpCisjZGVmaW5lIGdsR2V0QXR0cmliTG9jYXRpb25BUkIJCU1BTkdMRShHZXRBdHRyaWJMb2NhdGlvbkFSQikKKyNkZWZpbmUgZ2xHZXRBdHRyaWJMb2NhdGlvbgkJTUFOR0xFKEdldEF0dHJpYkxvY2F0aW9uKQorI2RlZmluZSBnbEdldEJvb2xlYW5JbmRleGVkdkVYVAkJTUFOR0xFKEdldEJvb2xlYW5JbmRleGVkdkVYVCkKKyNkZWZpbmUgZ2xHZXRCb29sZWFuaV92CQlNQU5HTEUoR2V0Qm9vbGVhbmlfdikKKyNkZWZpbmUgZ2xHZXRCb29sZWFudgkJTUFOR0xFKEdldEJvb2xlYW52KQorI2RlZmluZSBnbEdldEJ1ZmZlclBhcmFtZXRlcmk2NHYJCU1BTkdMRShHZXRCdWZmZXJQYXJhbWV0ZXJpNjR2KQorI2RlZmluZSBnbEdldEJ1ZmZlclBhcmFtZXRlcml2QVJCCQlNQU5HTEUoR2V0QnVmZmVyUGFyYW1ldGVyaXZBUkIpCisjZGVmaW5lIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYJCU1BTkdMRShHZXRCdWZmZXJQYXJhbWV0ZXJpdikKKyNkZWZpbmUgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJ1aTY0dk5WCQlNQU5HTEUoR2V0QnVmZmVyUGFyYW1ldGVydWk2NHZOVikKKyNkZWZpbmUgZ2xHZXRCdWZmZXJQb2ludGVydkFSQgkJTUFOR0xFKEdldEJ1ZmZlclBvaW50ZXJ2QVJCKQorI2RlZmluZSBnbEdldEJ1ZmZlclBvaW50ZXJ2CQlNQU5HTEUoR2V0QnVmZmVyUG9pbnRlcnYpCisjZGVmaW5lIGdsR2V0QnVmZmVyU3ViRGF0YUFSQgkJTUFOR0xFKEdldEJ1ZmZlclN1YkRhdGFBUkIpCisjZGVmaW5lIGdsR2V0QnVmZmVyU3ViRGF0YQkJTUFOR0xFKEdldEJ1ZmZlclN1YkRhdGEpCisjZGVmaW5lIGdsR2V0Q2xpcFBsYW5lCQlNQU5HTEUoR2V0Q2xpcFBsYW5lKQorI2RlZmluZSBnbEdldENvbG9yVGFibGVFWFQJCU1BTkdMRShHZXRDb2xvclRhYmxlRVhUKQorI2RlZmluZSBnbEdldENvbG9yVGFibGUJCU1BTkdMRShHZXRDb2xvclRhYmxlKQorI2RlZmluZSBnbEdldENvbG9yVGFibGVQYXJhbWV0ZXJmdkVYVAkJTUFOR0xFKEdldENvbG9yVGFibGVQYXJhbWV0ZXJmdkVYVCkKKyNkZWZpbmUgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyZnYJCU1BTkdMRShHZXRDb2xvclRhYmxlUGFyYW1ldGVyZnYpCisjZGVmaW5lIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcmZ2U0dJCQlNQU5HTEUoR2V0Q29sb3JUYWJsZVBhcmFtZXRlcmZ2U0dJKQorI2RlZmluZSBnbEdldENvbG9yVGFibGVQYXJhbWV0ZXJpdkVYVAkJTUFOR0xFKEdldENvbG9yVGFibGVQYXJhbWV0ZXJpdkVYVCkKKyNkZWZpbmUgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyaXYJCU1BTkdMRShHZXRDb2xvclRhYmxlUGFyYW1ldGVyaXYpCisjZGVmaW5lIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcml2U0dJCQlNQU5HTEUoR2V0Q29sb3JUYWJsZVBhcmFtZXRlcml2U0dJKQorI2RlZmluZSBnbEdldENvbG9yVGFibGVTR0kJCU1BTkdMRShHZXRDb2xvclRhYmxlU0dJKQorI2RlZmluZSBnbEdldENvbWJpbmVySW5wdXRQYXJhbWV0ZXJmdk5WCQlNQU5HTEUoR2V0Q29tYmluZXJJbnB1dFBhcmFtZXRlcmZ2TlYpCisjZGVmaW5lIGdsR2V0Q29tYmluZXJJbnB1dFBhcmFtZXRlcml2TlYJCU1BTkdMRShHZXRDb21iaW5lcklucHV0UGFyYW1ldGVyaXZOVikKKyNkZWZpbmUgZ2xHZXRDb21iaW5lck91dHB1dFBhcmFtZXRlcmZ2TlYJCU1BTkdMRShHZXRDb21iaW5lck91dHB1dFBhcmFtZXRlcmZ2TlYpCisjZGVmaW5lIGdsR2V0Q29tYmluZXJPdXRwdXRQYXJhbWV0ZXJpdk5WCQlNQU5HTEUoR2V0Q29tYmluZXJPdXRwdXRQYXJhbWV0ZXJpdk5WKQorI2RlZmluZSBnbEdldENvbWJpbmVyU3RhZ2VQYXJhbWV0ZXJmdk5WCQlNQU5HTEUoR2V0Q29tYmluZXJTdGFnZVBhcmFtZXRlcmZ2TlYpCisjZGVmaW5lIGdsR2V0Q29tcHJlc3NlZE11bHRpVGV4SW1hZ2VFWFQJCU1BTkdMRShHZXRDb21wcmVzc2VkTXVsdGlUZXhJbWFnZUVYVCkKKyNkZWZpbmUgZ2xHZXRDb21wcmVzc2VkVGV4SW1hZ2VBUkIJCU1BTkdMRShHZXRDb21wcmVzc2VkVGV4SW1hZ2VBUkIpCisjZGVmaW5lIGdsR2V0Q29tcHJlc3NlZFRleEltYWdlCQlNQU5HTEUoR2V0Q29tcHJlc3NlZFRleEltYWdlKQorI2RlZmluZSBnbEdldENvbXByZXNzZWRUZXh0dXJlSW1hZ2VFWFQJCU1BTkdMRShHZXRDb21wcmVzc2VkVGV4dHVyZUltYWdlRVhUKQorI2RlZmluZSBnbEdldENvbnZvbHV0aW9uRmlsdGVyRVhUCQlNQU5HTEUoR2V0Q29udm9sdXRpb25GaWx0ZXJFWFQpCisjZGVmaW5lIGdsR2V0Q29udm9sdXRpb25GaWx0ZXIJCU1BTkdMRShHZXRDb252b2x1dGlvbkZpbHRlcikKKyNkZWZpbmUgZ2xHZXRDb252b2x1dGlvblBhcmFtZXRlcmZ2RVhUCQlNQU5HTEUoR2V0Q29udm9sdXRpb25QYXJhbWV0ZXJmdkVYVCkKKyNkZWZpbmUgZ2xHZXRDb252b2x1dGlvblBhcmFtZXRlcmZ2CQlNQU5HTEUoR2V0Q29udm9sdXRpb25QYXJhbWV0ZXJmdikKKyNkZWZpbmUgZ2xHZXRDb252b2x1dGlvblBhcmFtZXRlcml2RVhUCQlNQU5HTEUoR2V0Q29udm9sdXRpb25QYXJhbWV0ZXJpdkVYVCkKKyNkZWZpbmUgZ2xHZXRDb252b2x1dGlvblBhcmFtZXRlcml2CQlNQU5HTEUoR2V0Q29udm9sdXRpb25QYXJhbWV0ZXJpdikKKyNkZWZpbmUgZ2xHZXREZWJ1Z0xvZ0xlbmd0aE1FU0EJCU1BTkdMRShHZXREZWJ1Z0xvZ0xlbmd0aE1FU0EpCisjZGVmaW5lIGdsR2V0RGVidWdMb2dNRVNBCQlNQU5HTEUoR2V0RGVidWdMb2dNRVNBKQorI2RlZmluZSBnbEdldERlYnVnTWVzc2FnZUxvZ0FNRAkJTUFOR0xFKEdldERlYnVnTWVzc2FnZUxvZ0FNRCkKKyNkZWZpbmUgZ2xHZXREZWJ1Z01lc3NhZ2VMb2dBUkIJCU1BTkdMRShHZXREZWJ1Z01lc3NhZ2VMb2dBUkIpCisjZGVmaW5lIGdsR2V0RGV0YWlsVGV4RnVuY1NHSVMJCU1BTkdMRShHZXREZXRhaWxUZXhGdW5jU0dJUykKKyNkZWZpbmUgZ2xHZXREb3VibGVJbmRleGVkdkVYVAkJTUFOR0xFKEdldERvdWJsZUluZGV4ZWR2RVhUKQorI2RlZmluZSBnbEdldERvdWJsZWlfdgkJTUFOR0xFKEdldERvdWJsZWlfdikKKyNkZWZpbmUgZ2xHZXREb3VibGV2CQlNQU5HTEUoR2V0RG91YmxldikKKyNkZWZpbmUgZ2xHZXRFcnJvcgkJTUFOR0xFKEdldEVycm9yKQorI2RlZmluZSBnbEdldEZlbmNlaXZOVgkJTUFOR0xFKEdldEZlbmNlaXZOVikKKyNkZWZpbmUgZ2xHZXRGaW5hbENvbWJpbmVySW5wdXRQYXJhbWV0ZXJmdk5WCQlNQU5HTEUoR2V0RmluYWxDb21iaW5lcklucHV0UGFyYW1ldGVyZnZOVikKKyNkZWZpbmUgZ2xHZXRGaW5hbENvbWJpbmVySW5wdXRQYXJhbWV0ZXJpdk5WCQlNQU5HTEUoR2V0RmluYWxDb21iaW5lcklucHV0UGFyYW1ldGVyaXZOVikKKyNkZWZpbmUgZ2xHZXRGbG9hdEluZGV4ZWR2RVhUCQlNQU5HTEUoR2V0RmxvYXRJbmRleGVkdkVYVCkKKyNkZWZpbmUgZ2xHZXRGbG9hdGlfdgkJTUFOR0xFKEdldEZsb2F0aV92KQorI2RlZmluZSBnbEdldEZsb2F0dgkJTUFOR0xFKEdldEZsb2F0dikKKyNkZWZpbmUgZ2xHZXRGb2dGdW5jU0dJUwkJTUFOR0xFKEdldEZvZ0Z1bmNTR0lTKQorI2RlZmluZSBnbEdldEZyYWdEYXRhSW5kZXgJCU1BTkdMRShHZXRGcmFnRGF0YUluZGV4KQorI2RlZmluZSBnbEdldEZyYWdEYXRhTG9jYXRpb25FWFQJCU1BTkdMRShHZXRGcmFnRGF0YUxvY2F0aW9uRVhUKQorI2RlZmluZSBnbEdldEZyYWdEYXRhTG9jYXRpb24JCU1BTkdMRShHZXRGcmFnRGF0YUxvY2F0aW9uKQorI2RlZmluZSBnbEdldEZyYWdtZW50TGlnaHRmdlNHSVgJCU1BTkdMRShHZXRGcmFnbWVudExpZ2h0ZnZTR0lYKQorI2RlZmluZSBnbEdldEZyYWdtZW50TGlnaHRpdlNHSVgJCU1BTkdMRShHZXRGcmFnbWVudExpZ2h0aXZTR0lYKQorI2RlZmluZSBnbEdldEZyYWdtZW50TWF0ZXJpYWxmdlNHSVgJCU1BTkdMRShHZXRGcmFnbWVudE1hdGVyaWFsZnZTR0lYKQorI2RlZmluZSBnbEdldEZyYWdtZW50TWF0ZXJpYWxpdlNHSVgJCU1BTkdMRShHZXRGcmFnbWVudE1hdGVyaWFsaXZTR0lYKQorI2RlZmluZSBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2RVhUCQlNQU5HTEUoR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZFWFQpCisjZGVmaW5lIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYJCU1BTkdMRShHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdikKKyNkZWZpbmUgZ2xHZXRGcmFtZWJ1ZmZlclBhcmFtZXRlcml2RVhUCQlNQU5HTEUoR2V0RnJhbWVidWZmZXJQYXJhbWV0ZXJpdkVYVCkKKyNkZWZpbmUgZ2xHZXRHcmFwaGljc1Jlc2V0U3RhdHVzQVJCCQlNQU5HTEUoR2V0R3JhcGhpY3NSZXNldFN0YXR1c0FSQikKKyNkZWZpbmUgZ2xHZXRIYW5kbGVBUkIJCU1BTkdMRShHZXRIYW5kbGVBUkIpCisjZGVmaW5lIGdsR2V0SGlzdG9ncmFtRVhUCQlNQU5HTEUoR2V0SGlzdG9ncmFtRVhUKQorI2RlZmluZSBnbEdldEhpc3RvZ3JhbQkJTUFOR0xFKEdldEhpc3RvZ3JhbSkKKyNkZWZpbmUgZ2xHZXRIaXN0b2dyYW1QYXJhbWV0ZXJmdkVYVAkJTUFOR0xFKEdldEhpc3RvZ3JhbVBhcmFtZXRlcmZ2RVhUKQorI2RlZmluZSBnbEdldEhpc3RvZ3JhbVBhcmFtZXRlcmZ2CQlNQU5HTEUoR2V0SGlzdG9ncmFtUGFyYW1ldGVyZnYpCisjZGVmaW5lIGdsR2V0SGlzdG9ncmFtUGFyYW1ldGVyaXZFWFQJCU1BTkdMRShHZXRIaXN0b2dyYW1QYXJhbWV0ZXJpdkVYVCkKKyNkZWZpbmUgZ2xHZXRIaXN0b2dyYW1QYXJhbWV0ZXJpdgkJTUFOR0xFKEdldEhpc3RvZ3JhbVBhcmFtZXRlcml2KQorI2RlZmluZSBnbEdldEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyZnZIUAkJTUFOR0xFKEdldEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyZnZIUCkKKyNkZWZpbmUgZ2xHZXRJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcml2SFAJCU1BTkdMRShHZXRJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcml2SFApCisjZGVmaW5lIGdsR2V0SW5mb0xvZ0FSQgkJTUFOR0xFKEdldEluZm9Mb2dBUkIpCisjZGVmaW5lIGdsR2V0SW5zdHJ1bWVudHNTR0lYCQlNQU5HTEUoR2V0SW5zdHJ1bWVudHNTR0lYKQorI2RlZmluZSBnbEdldEludGVnZXI2NGlfdgkJTUFOR0xFKEdldEludGVnZXI2NGlfdikKKyNkZWZpbmUgZ2xHZXRJbnRlZ2VyNjR2CQlNQU5HTEUoR2V0SW50ZWdlcjY0dikKKyNkZWZpbmUgZ2xHZXRJbnRlZ2VySW5kZXhlZHZFWFQJCU1BTkdMRShHZXRJbnRlZ2VySW5kZXhlZHZFWFQpCisjZGVmaW5lIGdsR2V0SW50ZWdlcmlfdgkJTUFOR0xFKEdldEludGVnZXJpX3YpCisjZGVmaW5lIGdsR2V0SW50ZWdlcnVpNjRpX3ZOVgkJTUFOR0xFKEdldEludGVnZXJ1aTY0aV92TlYpCisjZGVmaW5lIGdsR2V0SW50ZWdlcnVpNjR2TlYJCU1BTkdMRShHZXRJbnRlZ2VydWk2NHZOVikKKyNkZWZpbmUgZ2xHZXRJbnRlZ2VydgkJTUFOR0xFKEdldEludGVnZXJ2KQorI2RlZmluZSBnbEdldEludmFyaWFudEJvb2xlYW52RVhUCQlNQU5HTEUoR2V0SW52YXJpYW50Qm9vbGVhbnZFWFQpCisjZGVmaW5lIGdsR2V0SW52YXJpYW50RmxvYXR2RVhUCQlNQU5HTEUoR2V0SW52YXJpYW50RmxvYXR2RVhUKQorI2RlZmluZSBnbEdldEludmFyaWFudEludGVnZXJ2RVhUCQlNQU5HTEUoR2V0SW52YXJpYW50SW50ZWdlcnZFWFQpCisjZGVmaW5lIGdsR2V0TGlnaHRmdgkJTUFOR0xFKEdldExpZ2h0ZnYpCisjZGVmaW5lIGdsR2V0TGlnaHRpdgkJTUFOR0xFKEdldExpZ2h0aXYpCisjZGVmaW5lIGdsR2V0TGlzdFBhcmFtZXRlcmZ2U0dJWAkJTUFOR0xFKEdldExpc3RQYXJhbWV0ZXJmdlNHSVgpCisjZGVmaW5lIGdsR2V0TGlzdFBhcmFtZXRlcml2U0dJWAkJTUFOR0xFKEdldExpc3RQYXJhbWV0ZXJpdlNHSVgpCisjZGVmaW5lIGdsR2V0TG9jYWxDb25zdGFudEJvb2xlYW52RVhUCQlNQU5HTEUoR2V0TG9jYWxDb25zdGFudEJvb2xlYW52RVhUKQorI2RlZmluZSBnbEdldExvY2FsQ29uc3RhbnRGbG9hdHZFWFQJCU1BTkdMRShHZXRMb2NhbENvbnN0YW50RmxvYXR2RVhUKQorI2RlZmluZSBnbEdldExvY2FsQ29uc3RhbnRJbnRlZ2VydkVYVAkJTUFOR0xFKEdldExvY2FsQ29uc3RhbnRJbnRlZ2VydkVYVCkKKyNkZWZpbmUgZ2xHZXRNYXBBdHRyaWJQYXJhbWV0ZXJmdk5WCQlNQU5HTEUoR2V0TWFwQXR0cmliUGFyYW1ldGVyZnZOVikKKyNkZWZpbmUgZ2xHZXRNYXBBdHRyaWJQYXJhbWV0ZXJpdk5WCQlNQU5HTEUoR2V0TWFwQXR0cmliUGFyYW1ldGVyaXZOVikKKyNkZWZpbmUgZ2xHZXRNYXBDb250cm9sUG9pbnRzTlYJCU1BTkdMRShHZXRNYXBDb250cm9sUG9pbnRzTlYpCisjZGVmaW5lIGdsR2V0TWFwZHYJCU1BTkdMRShHZXRNYXBkdikKKyNkZWZpbmUgZ2xHZXRNYXBmdgkJTUFOR0xFKEdldE1hcGZ2KQorI2RlZmluZSBnbEdldE1hcGl2CQlNQU5HTEUoR2V0TWFwaXYpCisjZGVmaW5lIGdsR2V0TWFwUGFyYW1ldGVyZnZOVgkJTUFOR0xFKEdldE1hcFBhcmFtZXRlcmZ2TlYpCisjZGVmaW5lIGdsR2V0TWFwUGFyYW1ldGVyaXZOVgkJTUFOR0xFKEdldE1hcFBhcmFtZXRlcml2TlYpCisjZGVmaW5lIGdsR2V0TWF0ZXJpYWxmdgkJTUFOR0xFKEdldE1hdGVyaWFsZnYpCisjZGVmaW5lIGdsR2V0TWF0ZXJpYWxpdgkJTUFOR0xFKEdldE1hdGVyaWFsaXYpCisjZGVmaW5lIGdsR2V0TWlubWF4RVhUCQlNQU5HTEUoR2V0TWlubWF4RVhUKQorI2RlZmluZSBnbEdldE1pbm1heAkJTUFOR0xFKEdldE1pbm1heCkKKyNkZWZpbmUgZ2xHZXRNaW5tYXhQYXJhbWV0ZXJmdkVYVAkJTUFOR0xFKEdldE1pbm1heFBhcmFtZXRlcmZ2RVhUKQorI2RlZmluZSBnbEdldE1pbm1heFBhcmFtZXRlcmZ2CQlNQU5HTEUoR2V0TWlubWF4UGFyYW1ldGVyZnYpCisjZGVmaW5lIGdsR2V0TWlubWF4UGFyYW1ldGVyaXZFWFQJCU1BTkdMRShHZXRNaW5tYXhQYXJhbWV0ZXJpdkVYVCkKKyNkZWZpbmUgZ2xHZXRNaW5tYXhQYXJhbWV0ZXJpdgkJTUFOR0xFKEdldE1pbm1heFBhcmFtZXRlcml2KQorI2RlZmluZSBnbEdldE11bHRpc2FtcGxlZnYJCU1BTkdMRShHZXRNdWx0aXNhbXBsZWZ2KQorI2RlZmluZSBnbEdldE11bHRpc2FtcGxlZnZOVgkJTUFOR0xFKEdldE11bHRpc2FtcGxlZnZOVikKKyNkZWZpbmUgZ2xHZXRNdWx0aVRleEVudmZ2RVhUCQlNQU5HTEUoR2V0TXVsdGlUZXhFbnZmdkVYVCkKKyNkZWZpbmUgZ2xHZXRNdWx0aVRleEVudml2RVhUCQlNQU5HTEUoR2V0TXVsdGlUZXhFbnZpdkVYVCkKKyNkZWZpbmUgZ2xHZXRNdWx0aVRleEdlbmR2RVhUCQlNQU5HTEUoR2V0TXVsdGlUZXhHZW5kdkVYVCkKKyNkZWZpbmUgZ2xHZXRNdWx0aVRleEdlbmZ2RVhUCQlNQU5HTEUoR2V0TXVsdGlUZXhHZW5mdkVYVCkKKyNkZWZpbmUgZ2xHZXRNdWx0aVRleEdlbml2RVhUCQlNQU5HTEUoR2V0TXVsdGlUZXhHZW5pdkVYVCkKKyNkZWZpbmUgZ2xHZXRNdWx0aVRleEltYWdlRVhUCQlNQU5HTEUoR2V0TXVsdGlUZXhJbWFnZUVYVCkKKyNkZWZpbmUgZ2xHZXRNdWx0aVRleExldmVsUGFyYW1ldGVyZnZFWFQJCU1BTkdMRShHZXRNdWx0aVRleExldmVsUGFyYW1ldGVyZnZFWFQpCisjZGVmaW5lIGdsR2V0TXVsdGlUZXhMZXZlbFBhcmFtZXRlcml2RVhUCQlNQU5HTEUoR2V0TXVsdGlUZXhMZXZlbFBhcmFtZXRlcml2RVhUKQorI2RlZmluZSBnbEdldE11bHRpVGV4UGFyYW1ldGVyZnZFWFQJCU1BTkdMRShHZXRNdWx0aVRleFBhcmFtZXRlcmZ2RVhUKQorI2RlZmluZSBnbEdldE11bHRpVGV4UGFyYW1ldGVySWl2RVhUCQlNQU5HTEUoR2V0TXVsdGlUZXhQYXJhbWV0ZXJJaXZFWFQpCisjZGVmaW5lIGdsR2V0TXVsdGlUZXhQYXJhbWV0ZXJJdWl2RVhUCQlNQU5HTEUoR2V0TXVsdGlUZXhQYXJhbWV0ZXJJdWl2RVhUKQorI2RlZmluZSBnbEdldE11bHRpVGV4UGFyYW1ldGVyaXZFWFQJCU1BTkdMRShHZXRNdWx0aVRleFBhcmFtZXRlcml2RVhUKQorI2RlZmluZSBnbEdldE5hbWVkQnVmZmVyUGFyYW1ldGVyaXZFWFQJCU1BTkdMRShHZXROYW1lZEJ1ZmZlclBhcmFtZXRlcml2RVhUKQorI2RlZmluZSBnbEdldE5hbWVkQnVmZmVyUGFyYW1ldGVydWk2NHZOVgkJTUFOR0xFKEdldE5hbWVkQnVmZmVyUGFyYW1ldGVydWk2NHZOVikKKyNkZWZpbmUgZ2xHZXROYW1lZEJ1ZmZlclBvaW50ZXJ2RVhUCQlNQU5HTEUoR2V0TmFtZWRCdWZmZXJQb2ludGVydkVYVCkKKyNkZWZpbmUgZ2xHZXROYW1lZEJ1ZmZlclN1YkRhdGFFWFQJCU1BTkdMRShHZXROYW1lZEJ1ZmZlclN1YkRhdGFFWFQpCisjZGVmaW5lIGdsR2V0TmFtZWRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdkVYVAkJTUFOR0xFKEdldE5hbWVkRnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZFWFQpCisjZGVmaW5lIGdsR2V0TmFtZWRQcm9ncmFtaXZFWFQJCU1BTkdMRShHZXROYW1lZFByb2dyYW1pdkVYVCkKKyNkZWZpbmUgZ2xHZXROYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcmR2RVhUCQlNQU5HTEUoR2V0TmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJkdkVYVCkKKyNkZWZpbmUgZ2xHZXROYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcmZ2RVhUCQlNQU5HTEUoR2V0TmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJmdkVYVCkKKyNkZWZpbmUgZ2xHZXROYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcklpdkVYVAkJTUFOR0xFKEdldE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVySWl2RVhUKQorI2RlZmluZSBnbEdldE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVySXVpdkVYVAkJTUFOR0xFKEdldE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVySXVpdkVYVCkKKyNkZWZpbmUgZ2xHZXROYW1lZFByb2dyYW1TdHJpbmdFWFQJCU1BTkdMRShHZXROYW1lZFByb2dyYW1TdHJpbmdFWFQpCisjZGVmaW5lIGdsR2V0TmFtZWRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdkVYVAkJTUFOR0xFKEdldE5hbWVkUmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZFWFQpCisjZGVmaW5lIGdsR2V0TmFtZWRTdHJpbmdBUkIJCU1BTkdMRShHZXROYW1lZFN0cmluZ0FSQikKKyNkZWZpbmUgZ2xHZXROYW1lZFN0cmluZ2l2QVJCCQlNQU5HTEUoR2V0TmFtZWRTdHJpbmdpdkFSQikKKyNkZWZpbmUgZ2xHZXRuQ29sb3JUYWJsZUFSQgkJTUFOR0xFKEdldG5Db2xvclRhYmxlQVJCKQorI2RlZmluZSBnbEdldG5Db21wcmVzc2VkVGV4SW1hZ2VBUkIJCU1BTkdMRShHZXRuQ29tcHJlc3NlZFRleEltYWdlQVJCKQorI2RlZmluZSBnbEdldG5Db252b2x1dGlvbkZpbHRlckFSQgkJTUFOR0xFKEdldG5Db252b2x1dGlvbkZpbHRlckFSQikKKyNkZWZpbmUgZ2xHZXRuSGlzdG9ncmFtQVJCCQlNQU5HTEUoR2V0bkhpc3RvZ3JhbUFSQikKKyNkZWZpbmUgZ2xHZXRuTWFwZHZBUkIJCU1BTkdMRShHZXRuTWFwZHZBUkIpCisjZGVmaW5lIGdsR2V0bk1hcGZ2QVJCCQlNQU5HTEUoR2V0bk1hcGZ2QVJCKQorI2RlZmluZSBnbEdldG5NYXBpdkFSQgkJTUFOR0xFKEdldG5NYXBpdkFSQikKKyNkZWZpbmUgZ2xHZXRuTWlubWF4QVJCCQlNQU5HTEUoR2V0bk1pbm1heEFSQikKKyNkZWZpbmUgZ2xHZXRuUGl4ZWxNYXBmdkFSQgkJTUFOR0xFKEdldG5QaXhlbE1hcGZ2QVJCKQorI2RlZmluZSBnbEdldG5QaXhlbE1hcHVpdkFSQgkJTUFOR0xFKEdldG5QaXhlbE1hcHVpdkFSQikKKyNkZWZpbmUgZ2xHZXRuUGl4ZWxNYXB1c3ZBUkIJCU1BTkdMRShHZXRuUGl4ZWxNYXB1c3ZBUkIpCisjZGVmaW5lIGdsR2V0blBvbHlnb25TdGlwcGxlQVJCCQlNQU5HTEUoR2V0blBvbHlnb25TdGlwcGxlQVJCKQorI2RlZmluZSBnbEdldG5TZXBhcmFibGVGaWx0ZXJBUkIJCU1BTkdMRShHZXRuU2VwYXJhYmxlRmlsdGVyQVJCKQorI2RlZmluZSBnbEdldG5UZXhJbWFnZUFSQgkJTUFOR0xFKEdldG5UZXhJbWFnZUFSQikKKyNkZWZpbmUgZ2xHZXRuVW5pZm9ybWR2QVJCCQlNQU5HTEUoR2V0blVuaWZvcm1kdkFSQikKKyNkZWZpbmUgZ2xHZXRuVW5pZm9ybWZ2QVJCCQlNQU5HTEUoR2V0blVuaWZvcm1mdkFSQikKKyNkZWZpbmUgZ2xHZXRuVW5pZm9ybWl2QVJCCQlNQU5HTEUoR2V0blVuaWZvcm1pdkFSQikKKyNkZWZpbmUgZ2xHZXRuVW5pZm9ybXVpdkFSQgkJTUFOR0xFKEdldG5Vbmlmb3JtdWl2QVJCKQorI2RlZmluZSBnbEdldE9iamVjdEJ1ZmZlcmZ2QVRJCQlNQU5HTEUoR2V0T2JqZWN0QnVmZmVyZnZBVEkpCisjZGVmaW5lIGdsR2V0T2JqZWN0QnVmZmVyaXZBVEkJCU1BTkdMRShHZXRPYmplY3RCdWZmZXJpdkFUSSkKKyNkZWZpbmUgZ2xHZXRPYmplY3RQYXJhbWV0ZXJmdkFSQgkJTUFOR0xFKEdldE9iamVjdFBhcmFtZXRlcmZ2QVJCKQorI2RlZmluZSBnbEdldE9iamVjdFBhcmFtZXRlcml2QVBQTEUJCU1BTkdMRShHZXRPYmplY3RQYXJhbWV0ZXJpdkFQUExFKQorI2RlZmluZSBnbEdldE9iamVjdFBhcmFtZXRlcml2QVJCCQlNQU5HTEUoR2V0T2JqZWN0UGFyYW1ldGVyaXZBUkIpCisjZGVmaW5lIGdsR2V0T2NjbHVzaW9uUXVlcnlpdk5WCQlNQU5HTEUoR2V0T2NjbHVzaW9uUXVlcnlpdk5WKQorI2RlZmluZSBnbEdldE9jY2x1c2lvblF1ZXJ5dWl2TlYJCU1BTkdMRShHZXRPY2NsdXNpb25RdWVyeXVpdk5WKQorI2RlZmluZSBnbEdldFBlcmZNb25pdG9yQ291bnRlckRhdGFBTUQJCU1BTkdMRShHZXRQZXJmTW9uaXRvckNvdW50ZXJEYXRhQU1EKQorI2RlZmluZSBnbEdldFBlcmZNb25pdG9yQ291bnRlckluZm9BTUQJCU1BTkdMRShHZXRQZXJmTW9uaXRvckNvdW50ZXJJbmZvQU1EKQorI2RlZmluZSBnbEdldFBlcmZNb25pdG9yQ291bnRlcnNBTUQJCU1BTkdMRShHZXRQZXJmTW9uaXRvckNvdW50ZXJzQU1EKQorI2RlZmluZSBnbEdldFBlcmZNb25pdG9yQ291bnRlclN0cmluZ0FNRAkJTUFOR0xFKEdldFBlcmZNb25pdG9yQ291bnRlclN0cmluZ0FNRCkKKyNkZWZpbmUgZ2xHZXRQZXJmTW9uaXRvckdyb3Vwc0FNRAkJTUFOR0xFKEdldFBlcmZNb25pdG9yR3JvdXBzQU1EKQorI2RlZmluZSBnbEdldFBlcmZNb25pdG9yR3JvdXBTdHJpbmdBTUQJCU1BTkdMRShHZXRQZXJmTW9uaXRvckdyb3VwU3RyaW5nQU1EKQorI2RlZmluZSBnbEdldFBpeGVsTWFwZnYJCU1BTkdMRShHZXRQaXhlbE1hcGZ2KQorI2RlZmluZSBnbEdldFBpeGVsTWFwdWl2CQlNQU5HTEUoR2V0UGl4ZWxNYXB1aXYpCisjZGVmaW5lIGdsR2V0UGl4ZWxNYXB1c3YJCU1BTkdMRShHZXRQaXhlbE1hcHVzdikKKyNkZWZpbmUgZ2xHZXRQaXhlbFRleEdlblBhcmFtZXRlcmZ2U0dJUwkJTUFOR0xFKEdldFBpeGVsVGV4R2VuUGFyYW1ldGVyZnZTR0lTKQorI2RlZmluZSBnbEdldFBpeGVsVGV4R2VuUGFyYW1ldGVyaXZTR0lTCQlNQU5HTEUoR2V0UGl4ZWxUZXhHZW5QYXJhbWV0ZXJpdlNHSVMpCisjZGVmaW5lIGdsR2V0UG9pbnRlckluZGV4ZWR2RVhUCQlNQU5HTEUoR2V0UG9pbnRlckluZGV4ZWR2RVhUKQorI2RlZmluZSBnbEdldFBvaW50ZXJ2RVhUCQlNQU5HTEUoR2V0UG9pbnRlcnZFWFQpCisjZGVmaW5lIGdsR2V0UG9pbnRlcnYJCU1BTkdMRShHZXRQb2ludGVydikKKyNkZWZpbmUgZ2xHZXRQb2x5Z29uU3RpcHBsZQkJTUFOR0xFKEdldFBvbHlnb25TdGlwcGxlKQorI2RlZmluZSBnbEdldFByb2dyYW1CaW5hcnkJCU1BTkdMRShHZXRQcm9ncmFtQmluYXJ5KQorI2RlZmluZSBnbEdldFByb2dyYW1FbnZQYXJhbWV0ZXJkdkFSQgkJTUFOR0xFKEdldFByb2dyYW1FbnZQYXJhbWV0ZXJkdkFSQikKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtRW52UGFyYW1ldGVyZnZBUkIJCU1BTkdMRShHZXRQcm9ncmFtRW52UGFyYW1ldGVyZnZBUkIpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbUVudlBhcmFtZXRlcklpdk5WCQlNQU5HTEUoR2V0UHJvZ3JhbUVudlBhcmFtZXRlcklpdk5WKQorI2RlZmluZSBnbEdldFByb2dyYW1FbnZQYXJhbWV0ZXJJdWl2TlYJCU1BTkdMRShHZXRQcm9ncmFtRW52UGFyYW1ldGVySXVpdk5WKQorI2RlZmluZSBnbEdldFByb2dyYW1JbmZvTG9nCQlNQU5HTEUoR2V0UHJvZ3JhbUluZm9Mb2cpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbWl2QVJCCQlNQU5HTEUoR2V0UHJvZ3JhbWl2QVJCKQorI2RlZmluZSBnbEdldFByb2dyYW1pdgkJTUFOR0xFKEdldFByb2dyYW1pdikKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtaXZOVgkJTUFOR0xFKEdldFByb2dyYW1pdk5WKQorI2RlZmluZSBnbEdldFByb2dyYW1Mb2NhbFBhcmFtZXRlcmR2QVJCCQlNQU5HTEUoR2V0UHJvZ3JhbUxvY2FsUGFyYW1ldGVyZHZBUkIpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbUxvY2FsUGFyYW1ldGVyZnZBUkIJCU1BTkdMRShHZXRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJmdkFSQikKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJaXZOVgkJTUFOR0xFKEdldFByb2dyYW1Mb2NhbFBhcmFtZXRlcklpdk5WKQorI2RlZmluZSBnbEdldFByb2dyYW1Mb2NhbFBhcmFtZXRlckl1aXZOVgkJTUFOR0xFKEdldFByb2dyYW1Mb2NhbFBhcmFtZXRlckl1aXZOVikKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtTmFtZWRQYXJhbWV0ZXJkdk5WCQlNQU5HTEUoR2V0UHJvZ3JhbU5hbWVkUGFyYW1ldGVyZHZOVikKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtTmFtZWRQYXJhbWV0ZXJmdk5WCQlNQU5HTEUoR2V0UHJvZ3JhbU5hbWVkUGFyYW1ldGVyZnZOVikKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtUGFyYW1ldGVyZHZOVgkJTUFOR0xFKEdldFByb2dyYW1QYXJhbWV0ZXJkdk5WKQorI2RlZmluZSBnbEdldFByb2dyYW1QYXJhbWV0ZXJmdk5WCQlNQU5HTEUoR2V0UHJvZ3JhbVBhcmFtZXRlcmZ2TlYpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbVBpcGVsaW5lSW5mb0xvZwkJTUFOR0xFKEdldFByb2dyYW1QaXBlbGluZUluZm9Mb2cpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbVBpcGVsaW5laXYJCU1BTkdMRShHZXRQcm9ncmFtUGlwZWxpbmVpdikKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtUmVnaXN0ZXJmdk1FU0EJCU1BTkdMRShHZXRQcm9ncmFtUmVnaXN0ZXJmdk1FU0EpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbVN0YWdlaXYJCU1BTkdMRShHZXRQcm9ncmFtU3RhZ2VpdikKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtU3RyaW5nQVJCCQlNQU5HTEUoR2V0UHJvZ3JhbVN0cmluZ0FSQikKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtU3RyaW5nTlYJCU1BTkdMRShHZXRQcm9ncmFtU3RyaW5nTlYpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbVN1YnJvdXRpbmVQYXJhbWV0ZXJ1aXZOVgkJTUFOR0xFKEdldFByb2dyYW1TdWJyb3V0aW5lUGFyYW1ldGVydWl2TlYpCisjZGVmaW5lIGdsR2V0UXVlcnlJbmRleGVkaXYJCU1BTkdMRShHZXRRdWVyeUluZGV4ZWRpdikKKyNkZWZpbmUgZ2xHZXRRdWVyeWl2QVJCCQlNQU5HTEUoR2V0UXVlcnlpdkFSQikKKyNkZWZpbmUgZ2xHZXRRdWVyeWl2CQlNQU5HTEUoR2V0UXVlcnlpdikKKyNkZWZpbmUgZ2xHZXRRdWVyeU9iamVjdGk2NHZFWFQJCU1BTkdMRShHZXRRdWVyeU9iamVjdGk2NHZFWFQpCisjZGVmaW5lIGdsR2V0UXVlcnlPYmplY3RpNjR2CQlNQU5HTEUoR2V0UXVlcnlPYmplY3RpNjR2KQorI2RlZmluZSBnbEdldFF1ZXJ5T2JqZWN0aXZBUkIJCU1BTkdMRShHZXRRdWVyeU9iamVjdGl2QVJCKQorI2RlZmluZSBnbEdldFF1ZXJ5T2JqZWN0aXYJCU1BTkdMRShHZXRRdWVyeU9iamVjdGl2KQorI2RlZmluZSBnbEdldFF1ZXJ5T2JqZWN0dWk2NHZFWFQJCU1BTkdMRShHZXRRdWVyeU9iamVjdHVpNjR2RVhUKQorI2RlZmluZSBnbEdldFF1ZXJ5T2JqZWN0dWk2NHYJCU1BTkdMRShHZXRRdWVyeU9iamVjdHVpNjR2KQorI2RlZmluZSBnbEdldFF1ZXJ5T2JqZWN0dWl2QVJCCQlNQU5HTEUoR2V0UXVlcnlPYmplY3R1aXZBUkIpCisjZGVmaW5lIGdsR2V0UXVlcnlPYmplY3R1aXYJCU1BTkdMRShHZXRRdWVyeU9iamVjdHVpdikKKyNkZWZpbmUgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdkVYVAkJTUFOR0xFKEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2RVhUKQorI2RlZmluZSBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2CQlNQU5HTEUoR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXYpCisjZGVmaW5lIGdsR2V0U2FtcGxlclBhcmFtZXRlcmZ2CQlNQU5HTEUoR2V0U2FtcGxlclBhcmFtZXRlcmZ2KQorI2RlZmluZSBnbEdldFNhbXBsZXJQYXJhbWV0ZXJJaXYJCU1BTkdMRShHZXRTYW1wbGVyUGFyYW1ldGVySWl2KQorI2RlZmluZSBnbEdldFNhbXBsZXJQYXJhbWV0ZXJJdWl2CQlNQU5HTEUoR2V0U2FtcGxlclBhcmFtZXRlckl1aXYpCisjZGVmaW5lIGdsR2V0U2FtcGxlclBhcmFtZXRlcml2CQlNQU5HTEUoR2V0U2FtcGxlclBhcmFtZXRlcml2KQorI2RlZmluZSBnbEdldFNlcGFyYWJsZUZpbHRlckVYVAkJTUFOR0xFKEdldFNlcGFyYWJsZUZpbHRlckVYVCkKKyNkZWZpbmUgZ2xHZXRTZXBhcmFibGVGaWx0ZXIJCU1BTkdMRShHZXRTZXBhcmFibGVGaWx0ZXIpCisjZGVmaW5lIGdsR2V0U2hhZGVySW5mb0xvZwkJTUFOR0xFKEdldFNoYWRlckluZm9Mb2cpCisjZGVmaW5lIGdsR2V0U2hhZGVyaXYJCU1BTkdMRShHZXRTaGFkZXJpdikKKyNkZWZpbmUgZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQJCU1BTkdMRShHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQpCisjZGVmaW5lIGdsR2V0U2hhZGVyU291cmNlQVJCCQlNQU5HTEUoR2V0U2hhZGVyU291cmNlQVJCKQorI2RlZmluZSBnbEdldFNoYWRlclNvdXJjZQkJTUFOR0xFKEdldFNoYWRlclNvdXJjZSkKKyNkZWZpbmUgZ2xHZXRTaGFycGVuVGV4RnVuY1NHSVMJCU1BTkdMRShHZXRTaGFycGVuVGV4RnVuY1NHSVMpCisjZGVmaW5lIGdsR2V0U3RyaW5naQkJTUFOR0xFKEdldFN0cmluZ2kpCisjZGVmaW5lIGdsR2V0U3RyaW5nCQlNQU5HTEUoR2V0U3RyaW5nKQorI2RlZmluZSBnbEdldFN1YnJvdXRpbmVJbmRleAkJTUFOR0xFKEdldFN1YnJvdXRpbmVJbmRleCkKKyNkZWZpbmUgZ2xHZXRTdWJyb3V0aW5lVW5pZm9ybUxvY2F0aW9uCQlNQU5HTEUoR2V0U3Vicm91dGluZVVuaWZvcm1Mb2NhdGlvbikKKyNkZWZpbmUgZ2xHZXRTeW5jaXYJCU1BTkdMRShHZXRTeW5jaXYpCisjZGVmaW5lIGdsR2V0VGV4QnVtcFBhcmFtZXRlcmZ2QVRJCQlNQU5HTEUoR2V0VGV4QnVtcFBhcmFtZXRlcmZ2QVRJKQorI2RlZmluZSBnbEdldFRleEJ1bXBQYXJhbWV0ZXJpdkFUSQkJTUFOR0xFKEdldFRleEJ1bXBQYXJhbWV0ZXJpdkFUSSkKKyNkZWZpbmUgZ2xHZXRUZXhFbnZmdgkJTUFOR0xFKEdldFRleEVudmZ2KQorI2RlZmluZSBnbEdldFRleEVudml2CQlNQU5HTEUoR2V0VGV4RW52aXYpCisjZGVmaW5lIGdsR2V0VGV4RmlsdGVyRnVuY1NHSVMJCU1BTkdMRShHZXRUZXhGaWx0ZXJGdW5jU0dJUykKKyNkZWZpbmUgZ2xHZXRUZXhHZW5kdgkJTUFOR0xFKEdldFRleEdlbmR2KQorI2RlZmluZSBnbEdldFRleEdlbmZ2CQlNQU5HTEUoR2V0VGV4R2VuZnYpCisjZGVmaW5lIGdsR2V0VGV4R2VuaXYJCU1BTkdMRShHZXRUZXhHZW5pdikKKyNkZWZpbmUgZ2xHZXRUZXhJbWFnZQkJTUFOR0xFKEdldFRleEltYWdlKQorI2RlZmluZSBnbEdldFRleExldmVsUGFyYW1ldGVyZnYJCU1BTkdMRShHZXRUZXhMZXZlbFBhcmFtZXRlcmZ2KQorI2RlZmluZSBnbEdldFRleExldmVsUGFyYW1ldGVyaXYJCU1BTkdMRShHZXRUZXhMZXZlbFBhcmFtZXRlcml2KQorI2RlZmluZSBnbEdldFRleFBhcmFtZXRlcmZ2CQlNQU5HTEUoR2V0VGV4UGFyYW1ldGVyZnYpCisjZGVmaW5lIGdsR2V0VGV4UGFyYW1ldGVySWl2RVhUCQlNQU5HTEUoR2V0VGV4UGFyYW1ldGVySWl2RVhUKQorI2RlZmluZSBnbEdldFRleFBhcmFtZXRlcklpdgkJTUFOR0xFKEdldFRleFBhcmFtZXRlcklpdikKKyNkZWZpbmUgZ2xHZXRUZXhQYXJhbWV0ZXJJdWl2RVhUCQlNQU5HTEUoR2V0VGV4UGFyYW1ldGVySXVpdkVYVCkKKyNkZWZpbmUgZ2xHZXRUZXhQYXJhbWV0ZXJJdWl2CQlNQU5HTEUoR2V0VGV4UGFyYW1ldGVySXVpdikKKyNkZWZpbmUgZ2xHZXRUZXhQYXJhbWV0ZXJpdgkJTUFOR0xFKEdldFRleFBhcmFtZXRlcml2KQorI2RlZmluZSBnbEdldFRleFBhcmFtZXRlclBvaW50ZXJ2QVBQTEUJCU1BTkdMRShHZXRUZXhQYXJhbWV0ZXJQb2ludGVydkFQUExFKQorI2RlZmluZSBnbEdldFRleHR1cmVJbWFnZUVYVAkJTUFOR0xFKEdldFRleHR1cmVJbWFnZUVYVCkKKyNkZWZpbmUgZ2xHZXRUZXh0dXJlTGV2ZWxQYXJhbWV0ZXJmdkVYVAkJTUFOR0xFKEdldFRleHR1cmVMZXZlbFBhcmFtZXRlcmZ2RVhUKQorI2RlZmluZSBnbEdldFRleHR1cmVMZXZlbFBhcmFtZXRlcml2RVhUCQlNQU5HTEUoR2V0VGV4dHVyZUxldmVsUGFyYW1ldGVyaXZFWFQpCisjZGVmaW5lIGdsR2V0VGV4dHVyZVBhcmFtZXRlcmZ2RVhUCQlNQU5HTEUoR2V0VGV4dHVyZVBhcmFtZXRlcmZ2RVhUKQorI2RlZmluZSBnbEdldFRleHR1cmVQYXJhbWV0ZXJJaXZFWFQJCU1BTkdMRShHZXRUZXh0dXJlUGFyYW1ldGVySWl2RVhUKQorI2RlZmluZSBnbEdldFRleHR1cmVQYXJhbWV0ZXJJdWl2RVhUCQlNQU5HTEUoR2V0VGV4dHVyZVBhcmFtZXRlckl1aXZFWFQpCisjZGVmaW5lIGdsR2V0VGV4dHVyZVBhcmFtZXRlcml2RVhUCQlNQU5HTEUoR2V0VGV4dHVyZVBhcmFtZXRlcml2RVhUKQorI2RlZmluZSBnbEdldFRyYWNrTWF0cml4aXZOVgkJTUFOR0xFKEdldFRyYWNrTWF0cml4aXZOVikKKyNkZWZpbmUgZ2xHZXRUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdFWFQJCU1BTkdMRShHZXRUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdFWFQpCisjZGVmaW5lIGdsR2V0VHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5nCQlNQU5HTEUoR2V0VHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5nKQorI2RlZmluZSBnbEdldFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ05WCQlNQU5HTEUoR2V0VHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5nTlYpCisjZGVmaW5lIGdsR2V0VW5pZm9ybUJsb2NrSW5kZXgJCU1BTkdMRShHZXRVbmlmb3JtQmxvY2tJbmRleCkKKyNkZWZpbmUgZ2xHZXRVbmlmb3JtQnVmZmVyU2l6ZUVYVAkJTUFOR0xFKEdldFVuaWZvcm1CdWZmZXJTaXplRVhUKQorI2RlZmluZSBnbEdldFVuaWZvcm1kdgkJTUFOR0xFKEdldFVuaWZvcm1kdikKKyNkZWZpbmUgZ2xHZXRVbmlmb3JtZnZBUkIJCU1BTkdMRShHZXRVbmlmb3JtZnZBUkIpCisjZGVmaW5lIGdsR2V0VW5pZm9ybWZ2CQlNQU5HTEUoR2V0VW5pZm9ybWZ2KQorI2RlZmluZSBnbEdldFVuaWZvcm1pNjR2TlYJCU1BTkdMRShHZXRVbmlmb3JtaTY0dk5WKQorI2RlZmluZSBnbEdldFVuaWZvcm1JbmRpY2VzCQlNQU5HTEUoR2V0VW5pZm9ybUluZGljZXMpCisjZGVmaW5lIGdsR2V0VW5pZm9ybWl2QVJCCQlNQU5HTEUoR2V0VW5pZm9ybWl2QVJCKQorI2RlZmluZSBnbEdldFVuaWZvcm1pdgkJTUFOR0xFKEdldFVuaWZvcm1pdikKKyNkZWZpbmUgZ2xHZXRVbmlmb3JtTG9jYXRpb25BUkIJCU1BTkdMRShHZXRVbmlmb3JtTG9jYXRpb25BUkIpCisjZGVmaW5lIGdsR2V0VW5pZm9ybUxvY2F0aW9uCQlNQU5HTEUoR2V0VW5pZm9ybUxvY2F0aW9uKQorI2RlZmluZSBnbEdldFVuaWZvcm1PZmZzZXRFWFQJCU1BTkdMRShHZXRVbmlmb3JtT2Zmc2V0RVhUKQorI2RlZmluZSBnbEdldFVuaWZvcm1TdWJyb3V0aW5ldWl2CQlNQU5HTEUoR2V0VW5pZm9ybVN1YnJvdXRpbmV1aXYpCisjZGVmaW5lIGdsR2V0VW5pZm9ybXVpNjR2TlYJCU1BTkdMRShHZXRVbmlmb3JtdWk2NHZOVikKKyNkZWZpbmUgZ2xHZXRVbmlmb3JtdWl2RVhUCQlNQU5HTEUoR2V0VW5pZm9ybXVpdkVYVCkKKyNkZWZpbmUgZ2xHZXRVbmlmb3JtdWl2CQlNQU5HTEUoR2V0VW5pZm9ybXVpdikKKyNkZWZpbmUgZ2xHZXRWYXJpYW50QXJyYXlPYmplY3RmdkFUSQkJTUFOR0xFKEdldFZhcmlhbnRBcnJheU9iamVjdGZ2QVRJKQorI2RlZmluZSBnbEdldFZhcmlhbnRBcnJheU9iamVjdGl2QVRJCQlNQU5HTEUoR2V0VmFyaWFudEFycmF5T2JqZWN0aXZBVEkpCisjZGVmaW5lIGdsR2V0VmFyaWFudEJvb2xlYW52RVhUCQlNQU5HTEUoR2V0VmFyaWFudEJvb2xlYW52RVhUKQorI2RlZmluZSBnbEdldFZhcmlhbnRGbG9hdHZFWFQJCU1BTkdMRShHZXRWYXJpYW50RmxvYXR2RVhUKQorI2RlZmluZSBnbEdldFZhcmlhbnRJbnRlZ2VydkVYVAkJTUFOR0xFKEdldFZhcmlhbnRJbnRlZ2VydkVYVCkKKyNkZWZpbmUgZ2xHZXRWYXJpYW50UG9pbnRlcnZFWFQJCU1BTkdMRShHZXRWYXJpYW50UG9pbnRlcnZFWFQpCisjZGVmaW5lIGdsR2V0VmFyeWluZ0xvY2F0aW9uTlYJCU1BTkdMRShHZXRWYXJ5aW5nTG9jYXRpb25OVikKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJBcnJheU9iamVjdGZ2QVRJCQlNQU5HTEUoR2V0VmVydGV4QXR0cmliQXJyYXlPYmplY3RmdkFUSSkKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJBcnJheU9iamVjdGl2QVRJCQlNQU5HTEUoR2V0VmVydGV4QXR0cmliQXJyYXlPYmplY3RpdkFUSSkKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJkdkFSQgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYmR2QVJCKQorI2RlZmluZSBnbEdldFZlcnRleEF0dHJpYmR2CQlNQU5HTEUoR2V0VmVydGV4QXR0cmliZHYpCisjZGVmaW5lIGdsR2V0VmVydGV4QXR0cmliZHZOVgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYmR2TlYpCisjZGVmaW5lIGdsR2V0VmVydGV4QXR0cmliZnZBUkIJCU1BTkdMRShHZXRWZXJ0ZXhBdHRyaWJmdkFSQikKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJmdgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYmZ2KQorI2RlZmluZSBnbEdldFZlcnRleEF0dHJpYmZ2TlYJCU1BTkdMRShHZXRWZXJ0ZXhBdHRyaWJmdk5WKQorI2RlZmluZSBnbEdldFZlcnRleEF0dHJpYklpdkVYVAkJTUFOR0xFKEdldFZlcnRleEF0dHJpYklpdkVYVCkKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJJaXYJCU1BTkdMRShHZXRWZXJ0ZXhBdHRyaWJJaXYpCisjZGVmaW5lIGdsR2V0VmVydGV4QXR0cmliSXVpdkVYVAkJTUFOR0xFKEdldFZlcnRleEF0dHJpYkl1aXZFWFQpCisjZGVmaW5lIGdsR2V0VmVydGV4QXR0cmliSXVpdgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYkl1aXYpCisjZGVmaW5lIGdsR2V0VmVydGV4QXR0cmliaXZBUkIJCU1BTkdMRShHZXRWZXJ0ZXhBdHRyaWJpdkFSQikKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJpdgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYml2KQorI2RlZmluZSBnbEdldFZlcnRleEF0dHJpYml2TlYJCU1BTkdMRShHZXRWZXJ0ZXhBdHRyaWJpdk5WKQorI2RlZmluZSBnbEdldFZlcnRleEF0dHJpYkxkdkVYVAkJTUFOR0xFKEdldFZlcnRleEF0dHJpYkxkdkVYVCkKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJMZHYJCU1BTkdMRShHZXRWZXJ0ZXhBdHRyaWJMZHYpCisjZGVmaW5lIGdsR2V0VmVydGV4QXR0cmliTGk2NHZOVgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYkxpNjR2TlYpCisjZGVmaW5lIGdsR2V0VmVydGV4QXR0cmliTHVpNjR2TlYJCU1BTkdMRShHZXRWZXJ0ZXhBdHRyaWJMdWk2NHZOVikKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydkFSQgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2QVJCKQorI2RlZmluZSBnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2CQlNQU5HTEUoR2V0VmVydGV4QXR0cmliUG9pbnRlcnYpCisjZGVmaW5lIGdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnZOVgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2TlYpCisjZGVmaW5lIGdsR2V0VmlkZW9DYXB0dXJlaXZOVgkJTUFOR0xFKEdldFZpZGVvQ2FwdHVyZWl2TlYpCisjZGVmaW5lIGdsR2V0VmlkZW9DYXB0dXJlU3RyZWFtZHZOVgkJTUFOR0xFKEdldFZpZGVvQ2FwdHVyZVN0cmVhbWR2TlYpCisjZGVmaW5lIGdsR2V0VmlkZW9DYXB0dXJlU3RyZWFtZnZOVgkJTUFOR0xFKEdldFZpZGVvQ2FwdHVyZVN0cmVhbWZ2TlYpCisjZGVmaW5lIGdsR2V0VmlkZW9DYXB0dXJlU3RyZWFtaXZOVgkJTUFOR0xFKEdldFZpZGVvQ2FwdHVyZVN0cmVhbWl2TlYpCisjZGVmaW5lIGdsR2V0VmlkZW9pNjR2TlYJCU1BTkdMRShHZXRWaWRlb2k2NHZOVikKKyNkZWZpbmUgZ2xHZXRWaWRlb2l2TlYJCU1BTkdMRShHZXRWaWRlb2l2TlYpCisjZGVmaW5lIGdsR2V0VmlkZW91aTY0dk5WCQlNQU5HTEUoR2V0VmlkZW91aTY0dk5WKQorI2RlZmluZSBnbEdldFZpZGVvdWl2TlYJCU1BTkdMRShHZXRWaWRlb3Vpdk5WKQorI2RlZmluZSBnbEdsb2JhbEFscGhhRmFjdG9yYlNVTgkJTUFOR0xFKEdsb2JhbEFscGhhRmFjdG9yYlNVTikKKyNkZWZpbmUgZ2xHbG9iYWxBbHBoYUZhY3RvcmRTVU4JCU1BTkdMRShHbG9iYWxBbHBoYUZhY3RvcmRTVU4pCisjZGVmaW5lIGdsR2xvYmFsQWxwaGFGYWN0b3JmU1VOCQlNQU5HTEUoR2xvYmFsQWxwaGFGYWN0b3JmU1VOKQorI2RlZmluZSBnbEdsb2JhbEFscGhhRmFjdG9yaVNVTgkJTUFOR0xFKEdsb2JhbEFscGhhRmFjdG9yaVNVTikKKyNkZWZpbmUgZ2xHbG9iYWxBbHBoYUZhY3RvcnNTVU4JCU1BTkdMRShHbG9iYWxBbHBoYUZhY3RvcnNTVU4pCisjZGVmaW5lIGdsR2xvYmFsQWxwaGFGYWN0b3J1YlNVTgkJTUFOR0xFKEdsb2JhbEFscGhhRmFjdG9ydWJTVU4pCisjZGVmaW5lIGdsR2xvYmFsQWxwaGFGYWN0b3J1aVNVTgkJTUFOR0xFKEdsb2JhbEFscGhhRmFjdG9ydWlTVU4pCisjZGVmaW5lIGdsR2xvYmFsQWxwaGFGYWN0b3J1c1NVTgkJTUFOR0xFKEdsb2JhbEFscGhhRmFjdG9ydXNTVU4pCisjZGVmaW5lIGdsSGludAkJTUFOR0xFKEhpbnQpCisjZGVmaW5lIGdsSGludFBHSQkJTUFOR0xFKEhpbnRQR0kpCisjZGVmaW5lIGdsSGlzdG9ncmFtRVhUCQlNQU5HTEUoSGlzdG9ncmFtRVhUKQorI2RlZmluZSBnbEhpc3RvZ3JhbQkJTUFOR0xFKEhpc3RvZ3JhbSkKKyNkZWZpbmUgZ2xJZ2xvb0ludGVyZmFjZVNHSVgJCU1BTkdMRShJZ2xvb0ludGVyZmFjZVNHSVgpCisjZGVmaW5lIGdsSW1hZ2VUcmFuc2Zvcm1QYXJhbWV0ZXJmSFAJCU1BTkdMRShJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcmZIUCkKKyNkZWZpbmUgZ2xJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcmZ2SFAJCU1BTkdMRShJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcmZ2SFApCisjZGVmaW5lIGdsSW1hZ2VUcmFuc2Zvcm1QYXJhbWV0ZXJpSFAJCU1BTkdMRShJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcmlIUCkKKyNkZWZpbmUgZ2xJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcml2SFAJCU1BTkdMRShJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcml2SFApCisjZGVmaW5lIGdsSW5kZXhkCQlNQU5HTEUoSW5kZXhkKQorI2RlZmluZSBnbEluZGV4ZHYJCU1BTkdMRShJbmRleGR2KQorI2RlZmluZSBnbEluZGV4ZgkJTUFOR0xFKEluZGV4ZikKKyNkZWZpbmUgZ2xJbmRleEZvcm1hdE5WCQlNQU5HTEUoSW5kZXhGb3JtYXROVikKKyNkZWZpbmUgZ2xJbmRleEZ1bmNFWFQJCU1BTkdMRShJbmRleEZ1bmNFWFQpCisjZGVmaW5lIGdsSW5kZXhmdgkJTUFOR0xFKEluZGV4ZnYpCisjZGVmaW5lIGdsSW5kZXhpCQlNQU5HTEUoSW5kZXhpKQorI2RlZmluZSBnbEluZGV4aXYJCU1BTkdMRShJbmRleGl2KQorI2RlZmluZSBnbEluZGV4TWFzawkJTUFOR0xFKEluZGV4TWFzaykKKyNkZWZpbmUgZ2xJbmRleE1hdGVyaWFsRVhUCQlNQU5HTEUoSW5kZXhNYXRlcmlhbEVYVCkKKyNkZWZpbmUgZ2xJbmRleFBvaW50ZXJFWFQJCU1BTkdMRShJbmRleFBvaW50ZXJFWFQpCisjZGVmaW5lIGdsSW5kZXhQb2ludGVyTGlzdElCTQkJTUFOR0xFKEluZGV4UG9pbnRlckxpc3RJQk0pCisjZGVmaW5lIGdsSW5kZXhQb2ludGVyCQlNQU5HTEUoSW5kZXhQb2ludGVyKQorI2RlZmluZSBnbEluZGV4cwkJTUFOR0xFKEluZGV4cykKKyNkZWZpbmUgZ2xJbmRleHN2CQlNQU5HTEUoSW5kZXhzdikKKyNkZWZpbmUgZ2xJbmRleHViCQlNQU5HTEUoSW5kZXh1YikKKyNkZWZpbmUgZ2xJbmRleHVidgkJTUFOR0xFKEluZGV4dWJ2KQorI2RlZmluZSBnbEluaXROYW1lcwkJTUFOR0xFKEluaXROYW1lcykKKyNkZWZpbmUgZ2xJbnNlcnRDb21wb25lbnRFWFQJCU1BTkdMRShJbnNlcnRDb21wb25lbnRFWFQpCisjZGVmaW5lIGdsSW5zdHJ1bWVudHNCdWZmZXJTR0lYCQlNQU5HTEUoSW5zdHJ1bWVudHNCdWZmZXJTR0lYKQorI2RlZmluZSBnbEludGVybGVhdmVkQXJyYXlzCQlNQU5HTEUoSW50ZXJsZWF2ZWRBcnJheXMpCisjZGVmaW5lIGdsSXNBc3luY01hcmtlclNHSVgJCU1BTkdMRShJc0FzeW5jTWFya2VyU0dJWCkKKyNkZWZpbmUgZ2xJc0J1ZmZlckFSQgkJTUFOR0xFKElzQnVmZmVyQVJCKQorI2RlZmluZSBnbElzQnVmZmVyCQlNQU5HTEUoSXNCdWZmZXIpCisjZGVmaW5lIGdsSXNCdWZmZXJSZXNpZGVudE5WCQlNQU5HTEUoSXNCdWZmZXJSZXNpZGVudE5WKQorI2RlZmluZSBnbElzRW5hYmxlZGkJCU1BTkdMRShJc0VuYWJsZWRpKQorI2RlZmluZSBnbElzRW5hYmxlZEluZGV4ZWRFWFQJCU1BTkdMRShJc0VuYWJsZWRJbmRleGVkRVhUKQorI2RlZmluZSBnbElzRW5hYmxlZAkJTUFOR0xFKElzRW5hYmxlZCkKKyNkZWZpbmUgZ2xJc0ZlbmNlQVBQTEUJCU1BTkdMRShJc0ZlbmNlQVBQTEUpCisjZGVmaW5lIGdsSXNGZW5jZU5WCQlNQU5HTEUoSXNGZW5jZU5WKQorI2RlZmluZSBnbElzRnJhbWVidWZmZXJFWFQJCU1BTkdMRShJc0ZyYW1lYnVmZmVyRVhUKQorI2RlZmluZSBnbElzRnJhbWVidWZmZXIJCU1BTkdMRShJc0ZyYW1lYnVmZmVyKQorI2RlZmluZSBnbElzTGlzdAkJTUFOR0xFKElzTGlzdCkKKyNkZWZpbmUgZ2xJc05hbWVBTUQJCU1BTkdMRShJc05hbWVBTUQpCisjZGVmaW5lIGdsSXNOYW1lZEJ1ZmZlclJlc2lkZW50TlYJCU1BTkdMRShJc05hbWVkQnVmZmVyUmVzaWRlbnROVikKKyNkZWZpbmUgZ2xJc05hbWVkU3RyaW5nQVJCCQlNQU5HTEUoSXNOYW1lZFN0cmluZ0FSQikKKyNkZWZpbmUgZ2xJc09iamVjdEJ1ZmZlckFUSQkJTUFOR0xFKElzT2JqZWN0QnVmZmVyQVRJKQorI2RlZmluZSBnbElzT2NjbHVzaW9uUXVlcnlOVgkJTUFOR0xFKElzT2NjbHVzaW9uUXVlcnlOVikKKyNkZWZpbmUgZ2xJc1Byb2dyYW1BUkIJCU1BTkdMRShJc1Byb2dyYW1BUkIpCisjZGVmaW5lIGdsSXNQcm9ncmFtCQlNQU5HTEUoSXNQcm9ncmFtKQorI2RlZmluZSBnbElzUHJvZ3JhbU5WCQlNQU5HTEUoSXNQcm9ncmFtTlYpCisjZGVmaW5lIGdsSXNQcm9ncmFtUGlwZWxpbmUJCU1BTkdMRShJc1Byb2dyYW1QaXBlbGluZSkKKyNkZWZpbmUgZ2xJc1F1ZXJ5QVJCCQlNQU5HTEUoSXNRdWVyeUFSQikKKyNkZWZpbmUgZ2xJc1F1ZXJ5CQlNQU5HTEUoSXNRdWVyeSkKKyNkZWZpbmUgZ2xJc1JlbmRlcmJ1ZmZlckVYVAkJTUFOR0xFKElzUmVuZGVyYnVmZmVyRVhUKQorI2RlZmluZSBnbElzUmVuZGVyYnVmZmVyCQlNQU5HTEUoSXNSZW5kZXJidWZmZXIpCisjZGVmaW5lIGdsSXNTYW1wbGVyCQlNQU5HTEUoSXNTYW1wbGVyKQorI2RlZmluZSBnbElzU2hhZGVyCQlNQU5HTEUoSXNTaGFkZXIpCisjZGVmaW5lIGdsSXNTeW5jCQlNQU5HTEUoSXNTeW5jKQorI2RlZmluZSBnbElzVGV4dHVyZUVYVAkJTUFOR0xFKElzVGV4dHVyZUVYVCkKKyNkZWZpbmUgZ2xJc1RleHR1cmUJCU1BTkdMRShJc1RleHR1cmUpCisjZGVmaW5lIGdsSXNUcmFuc2Zvcm1GZWVkYmFjawkJTUFOR0xFKElzVHJhbnNmb3JtRmVlZGJhY2spCisjZGVmaW5lIGdsSXNUcmFuc2Zvcm1GZWVkYmFja05WCQlNQU5HTEUoSXNUcmFuc2Zvcm1GZWVkYmFja05WKQorI2RlZmluZSBnbElzVmFyaWFudEVuYWJsZWRFWFQJCU1BTkdMRShJc1ZhcmlhbnRFbmFibGVkRVhUKQorI2RlZmluZSBnbElzVmVydGV4QXJyYXlBUFBMRQkJTUFOR0xFKElzVmVydGV4QXJyYXlBUFBMRSkKKyNkZWZpbmUgZ2xJc1ZlcnRleEFycmF5CQlNQU5HTEUoSXNWZXJ0ZXhBcnJheSkKKyNkZWZpbmUgZ2xJc1ZlcnRleEF0dHJpYkVuYWJsZWRBUFBMRQkJTUFOR0xFKElzVmVydGV4QXR0cmliRW5hYmxlZEFQUExFKQorI2RlZmluZSBnbExpZ2h0RW52aVNHSVgJCU1BTkdMRShMaWdodEVudmlTR0lYKQorI2RlZmluZSBnbExpZ2h0ZgkJTUFOR0xFKExpZ2h0ZikKKyNkZWZpbmUgZ2xMaWdodGZ2CQlNQU5HTEUoTGlnaHRmdikKKyNkZWZpbmUgZ2xMaWdodGkJCU1BTkdMRShMaWdodGkpCisjZGVmaW5lIGdsTGlnaHRpdgkJTUFOR0xFKExpZ2h0aXYpCisjZGVmaW5lIGdsTGlnaHRNb2RlbGYJCU1BTkdMRShMaWdodE1vZGVsZikKKyNkZWZpbmUgZ2xMaWdodE1vZGVsZnYJCU1BTkdMRShMaWdodE1vZGVsZnYpCisjZGVmaW5lIGdsTGlnaHRNb2RlbGkJCU1BTkdMRShMaWdodE1vZGVsaSkKKyNkZWZpbmUgZ2xMaWdodE1vZGVsaXYJCU1BTkdMRShMaWdodE1vZGVsaXYpCisjZGVmaW5lIGdsTGluZVN0aXBwbGUJCU1BTkdMRShMaW5lU3RpcHBsZSkKKyNkZWZpbmUgZ2xMaW5lV2lkdGgJCU1BTkdMRShMaW5lV2lkdGgpCisjZGVmaW5lIGdsTGlua1Byb2dyYW1BUkIJCU1BTkdMRShMaW5rUHJvZ3JhbUFSQikKKyNkZWZpbmUgZ2xMaW5rUHJvZ3JhbQkJTUFOR0xFKExpbmtQcm9ncmFtKQorI2RlZmluZSBnbExpc3RCYXNlCQlNQU5HTEUoTGlzdEJhc2UpCisjZGVmaW5lIGdsTGlzdFBhcmFtZXRlcmZTR0lYCQlNQU5HTEUoTGlzdFBhcmFtZXRlcmZTR0lYKQorI2RlZmluZSBnbExpc3RQYXJhbWV0ZXJmdlNHSVgJCU1BTkdMRShMaXN0UGFyYW1ldGVyZnZTR0lYKQorI2RlZmluZSBnbExpc3RQYXJhbWV0ZXJpU0dJWAkJTUFOR0xFKExpc3RQYXJhbWV0ZXJpU0dJWCkKKyNkZWZpbmUgZ2xMaXN0UGFyYW1ldGVyaXZTR0lYCQlNQU5HTEUoTGlzdFBhcmFtZXRlcml2U0dJWCkKKyNkZWZpbmUgZ2xMb2FkSWRlbnRpdHlEZWZvcm1hdGlvbk1hcFNHSVgJCU1BTkdMRShMb2FkSWRlbnRpdHlEZWZvcm1hdGlvbk1hcFNHSVgpCisjZGVmaW5lIGdsTG9hZElkZW50aXR5CQlNQU5HTEUoTG9hZElkZW50aXR5KQorI2RlZmluZSBnbExvYWRNYXRyaXhkCQlNQU5HTEUoTG9hZE1hdHJpeGQpCisjZGVmaW5lIGdsTG9hZE1hdHJpeGYJCU1BTkdMRShMb2FkTWF0cml4ZikKKyNkZWZpbmUgZ2xMb2FkTmFtZQkJTUFOR0xFKExvYWROYW1lKQorI2RlZmluZSBnbExvYWRQcm9ncmFtTlYJCU1BTkdMRShMb2FkUHJvZ3JhbU5WKQorI2RlZmluZSBnbExvYWRUcmFuc3Bvc2VNYXRyaXhkQVJCCQlNQU5HTEUoTG9hZFRyYW5zcG9zZU1hdHJpeGRBUkIpCisjZGVmaW5lIGdsTG9hZFRyYW5zcG9zZU1hdHJpeGQJCU1BTkdMRShMb2FkVHJhbnNwb3NlTWF0cml4ZCkKKyNkZWZpbmUgZ2xMb2FkVHJhbnNwb3NlTWF0cml4ZkFSQgkJTUFOR0xFKExvYWRUcmFuc3Bvc2VNYXRyaXhmQVJCKQorI2RlZmluZSBnbExvYWRUcmFuc3Bvc2VNYXRyaXhmCQlNQU5HTEUoTG9hZFRyYW5zcG9zZU1hdHJpeGYpCisjZGVmaW5lIGdsTG9ja0FycmF5c0VYVAkJTUFOR0xFKExvY2tBcnJheXNFWFQpCisjZGVmaW5lIGdsTG9naWNPcAkJTUFOR0xFKExvZ2ljT3ApCisjZGVmaW5lIGdsTWFrZUJ1ZmZlck5vblJlc2lkZW50TlYJCU1BTkdMRShNYWtlQnVmZmVyTm9uUmVzaWRlbnROVikKKyNkZWZpbmUgZ2xNYWtlQnVmZmVyUmVzaWRlbnROVgkJTUFOR0xFKE1ha2VCdWZmZXJSZXNpZGVudE5WKQorI2RlZmluZSBnbE1ha2VOYW1lZEJ1ZmZlck5vblJlc2lkZW50TlYJCU1BTkdMRShNYWtlTmFtZWRCdWZmZXJOb25SZXNpZGVudE5WKQorI2RlZmluZSBnbE1ha2VOYW1lZEJ1ZmZlclJlc2lkZW50TlYJCU1BTkdMRShNYWtlTmFtZWRCdWZmZXJSZXNpZGVudE5WKQorI2RlZmluZSBnbE1hcDFkCQlNQU5HTEUoTWFwMWQpCisjZGVmaW5lIGdsTWFwMWYJCU1BTkdMRShNYXAxZikKKyNkZWZpbmUgZ2xNYXAyZAkJTUFOR0xFKE1hcDJkKQorI2RlZmluZSBnbE1hcDJmCQlNQU5HTEUoTWFwMmYpCisjZGVmaW5lIGdsTWFwQnVmZmVyQVJCCQlNQU5HTEUoTWFwQnVmZmVyQVJCKQorI2RlZmluZSBnbE1hcEJ1ZmZlcgkJTUFOR0xFKE1hcEJ1ZmZlcikKKyNkZWZpbmUgZ2xNYXBCdWZmZXJSYW5nZQkJTUFOR0xFKE1hcEJ1ZmZlclJhbmdlKQorI2RlZmluZSBnbE1hcENvbnRyb2xQb2ludHNOVgkJTUFOR0xFKE1hcENvbnRyb2xQb2ludHNOVikKKyNkZWZpbmUgZ2xNYXBHcmlkMWQJCU1BTkdMRShNYXBHcmlkMWQpCisjZGVmaW5lIGdsTWFwR3JpZDFmCQlNQU5HTEUoTWFwR3JpZDFmKQorI2RlZmluZSBnbE1hcEdyaWQyZAkJTUFOR0xFKE1hcEdyaWQyZCkKKyNkZWZpbmUgZ2xNYXBHcmlkMmYJCU1BTkdMRShNYXBHcmlkMmYpCisjZGVmaW5lIGdsTWFwTmFtZWRCdWZmZXJFWFQJCU1BTkdMRShNYXBOYW1lZEJ1ZmZlckVYVCkKKyNkZWZpbmUgZ2xNYXBOYW1lZEJ1ZmZlclJhbmdlRVhUCQlNQU5HTEUoTWFwTmFtZWRCdWZmZXJSYW5nZUVYVCkKKyNkZWZpbmUgZ2xNYXBPYmplY3RCdWZmZXJBVEkJCU1BTkdMRShNYXBPYmplY3RCdWZmZXJBVEkpCisjZGVmaW5lIGdsTWFwUGFyYW1ldGVyZnZOVgkJTUFOR0xFKE1hcFBhcmFtZXRlcmZ2TlYpCisjZGVmaW5lIGdsTWFwUGFyYW1ldGVyaXZOVgkJTUFOR0xFKE1hcFBhcmFtZXRlcml2TlYpCisjZGVmaW5lIGdsTWFwVmVydGV4QXR0cmliMWRBUFBMRQkJTUFOR0xFKE1hcFZlcnRleEF0dHJpYjFkQVBQTEUpCisjZGVmaW5lIGdsTWFwVmVydGV4QXR0cmliMWZBUFBMRQkJTUFOR0xFKE1hcFZlcnRleEF0dHJpYjFmQVBQTEUpCisjZGVmaW5lIGdsTWFwVmVydGV4QXR0cmliMmRBUFBMRQkJTUFOR0xFKE1hcFZlcnRleEF0dHJpYjJkQVBQTEUpCisjZGVmaW5lIGdsTWFwVmVydGV4QXR0cmliMmZBUFBMRQkJTUFOR0xFKE1hcFZlcnRleEF0dHJpYjJmQVBQTEUpCisjZGVmaW5lIGdsTWF0ZXJpYWxmCQlNQU5HTEUoTWF0ZXJpYWxmKQorI2RlZmluZSBnbE1hdGVyaWFsZnYJCU1BTkdMRShNYXRlcmlhbGZ2KQorI2RlZmluZSBnbE1hdGVyaWFsaQkJTUFOR0xFKE1hdGVyaWFsaSkKKyNkZWZpbmUgZ2xNYXRlcmlhbGl2CQlNQU5HTEUoTWF0ZXJpYWxpdikKKyNkZWZpbmUgZ2xNYXRyaXhGcnVzdHVtRVhUCQlNQU5HTEUoTWF0cml4RnJ1c3R1bUVYVCkKKyNkZWZpbmUgZ2xNYXRyaXhJbmRleFBvaW50ZXJBUkIJCU1BTkdMRShNYXRyaXhJbmRleFBvaW50ZXJBUkIpCisjZGVmaW5lIGdsTWF0cml4SW5kZXh1YnZBUkIJCU1BTkdMRShNYXRyaXhJbmRleHVidkFSQikKKyNkZWZpbmUgZ2xNYXRyaXhJbmRleHVpdkFSQgkJTUFOR0xFKE1hdHJpeEluZGV4dWl2QVJCKQorI2RlZmluZSBnbE1hdHJpeEluZGV4dXN2QVJCCQlNQU5HTEUoTWF0cml4SW5kZXh1c3ZBUkIpCisjZGVmaW5lIGdsTWF0cml4TG9hZGRFWFQJCU1BTkdMRShNYXRyaXhMb2FkZEVYVCkKKyNkZWZpbmUgZ2xNYXRyaXhMb2FkZkVYVAkJTUFOR0xFKE1hdHJpeExvYWRmRVhUKQorI2RlZmluZSBnbE1hdHJpeExvYWRJZGVudGl0eUVYVAkJTUFOR0xFKE1hdHJpeExvYWRJZGVudGl0eUVYVCkKKyNkZWZpbmUgZ2xNYXRyaXhMb2FkVHJhbnNwb3NlZEVYVAkJTUFOR0xFKE1hdHJpeExvYWRUcmFuc3Bvc2VkRVhUKQorI2RlZmluZSBnbE1hdHJpeExvYWRUcmFuc3Bvc2VmRVhUCQlNQU5HTEUoTWF0cml4TG9hZFRyYW5zcG9zZWZFWFQpCisjZGVmaW5lIGdsTWF0cml4TW9kZQkJTUFOR0xFKE1hdHJpeE1vZGUpCisjZGVmaW5lIGdsTWF0cml4TXVsdGRFWFQJCU1BTkdMRShNYXRyaXhNdWx0ZEVYVCkKKyNkZWZpbmUgZ2xNYXRyaXhNdWx0ZkVYVAkJTUFOR0xFKE1hdHJpeE11bHRmRVhUKQorI2RlZmluZSBnbE1hdHJpeE11bHRUcmFuc3Bvc2VkRVhUCQlNQU5HTEUoTWF0cml4TXVsdFRyYW5zcG9zZWRFWFQpCisjZGVmaW5lIGdsTWF0cml4TXVsdFRyYW5zcG9zZWZFWFQJCU1BTkdMRShNYXRyaXhNdWx0VHJhbnNwb3NlZkVYVCkKKyNkZWZpbmUgZ2xNYXRyaXhPcnRob0VYVAkJTUFOR0xFKE1hdHJpeE9ydGhvRVhUKQorI2RlZmluZSBnbE1hdHJpeFBvcEVYVAkJTUFOR0xFKE1hdHJpeFBvcEVYVCkKKyNkZWZpbmUgZ2xNYXRyaXhQdXNoRVhUCQlNQU5HTEUoTWF0cml4UHVzaEVYVCkKKyNkZWZpbmUgZ2xNYXRyaXhSb3RhdGVkRVhUCQlNQU5HTEUoTWF0cml4Um90YXRlZEVYVCkKKyNkZWZpbmUgZ2xNYXRyaXhSb3RhdGVmRVhUCQlNQU5HTEUoTWF0cml4Um90YXRlZkVYVCkKKyNkZWZpbmUgZ2xNYXRyaXhTY2FsZWRFWFQJCU1BTkdMRShNYXRyaXhTY2FsZWRFWFQpCisjZGVmaW5lIGdsTWF0cml4U2NhbGVmRVhUCQlNQU5HTEUoTWF0cml4U2NhbGVmRVhUKQorI2RlZmluZSBnbE1hdHJpeFRyYW5zbGF0ZWRFWFQJCU1BTkdMRShNYXRyaXhUcmFuc2xhdGVkRVhUKQorI2RlZmluZSBnbE1hdHJpeFRyYW5zbGF0ZWZFWFQJCU1BTkdMRShNYXRyaXhUcmFuc2xhdGVmRVhUKQorI2RlZmluZSBnbE1lbW9yeUJhcnJpZXJFWFQJCU1BTkdMRShNZW1vcnlCYXJyaWVyRVhUKQorI2RlZmluZSBnbE1pbm1heEVYVAkJTUFOR0xFKE1pbm1heEVYVCkKKyNkZWZpbmUgZ2xNaW5tYXgJCU1BTkdMRShNaW5tYXgpCisjZGVmaW5lIGdsTWluU2FtcGxlU2hhZGluZ0FSQgkJTUFOR0xFKE1pblNhbXBsZVNoYWRpbmdBUkIpCisjZGVmaW5lIGdsTWluU2FtcGxlU2hhZGluZwkJTUFOR0xFKE1pblNhbXBsZVNoYWRpbmcpCisjZGVmaW5lIGdsTXVsdGlEcmF3QXJyYXlzRVhUCQlNQU5HTEUoTXVsdGlEcmF3QXJyYXlzRVhUKQorI2RlZmluZSBnbE11bHRpRHJhd0FycmF5cwkJTUFOR0xFKE11bHRpRHJhd0FycmF5cykKKyNkZWZpbmUgZ2xNdWx0aURyYXdFbGVtZW50QXJyYXlBUFBMRQkJTUFOR0xFKE11bHRpRHJhd0VsZW1lbnRBcnJheUFQUExFKQorI2RlZmluZSBnbE11bHRpRHJhd0VsZW1lbnRzQmFzZVZlcnRleAkJTUFOR0xFKE11bHRpRHJhd0VsZW1lbnRzQmFzZVZlcnRleCkKKyNkZWZpbmUgZ2xNdWx0aURyYXdFbGVtZW50c0VYVAkJTUFOR0xFKE11bHRpRHJhd0VsZW1lbnRzRVhUKQorI2RlZmluZSBnbE11bHRpRHJhd0VsZW1lbnRzCQlNQU5HTEUoTXVsdGlEcmF3RWxlbWVudHMpCisjZGVmaW5lIGdsTXVsdGlEcmF3UmFuZ2VFbGVtZW50QXJyYXlBUFBMRQkJTUFOR0xFKE11bHRpRHJhd1JhbmdlRWxlbWVudEFycmF5QVBQTEUpCisjZGVmaW5lIGdsTXVsdGlNb2RlRHJhd0FycmF5c0lCTQkJTUFOR0xFKE11bHRpTW9kZURyYXdBcnJheXNJQk0pCisjZGVmaW5lIGdsTXVsdGlNb2RlRHJhd0VsZW1lbnRzSUJNCQlNQU5HTEUoTXVsdGlNb2RlRHJhd0VsZW1lbnRzSUJNKQorI2RlZmluZSBnbE11bHRpVGV4QnVmZmVyRVhUCQlNQU5HTEUoTXVsdGlUZXhCdWZmZXJFWFQpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDFkQVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDFkQVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQxZAkJTUFOR0xFKE11bHRpVGV4Q29vcmQxZCkKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMWR2QVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDFkdkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMWR2CQlNQU5HTEUoTXVsdGlUZXhDb29yZDFkdikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMWZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkMWZBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDFmCQlNQU5HTEUoTXVsdGlUZXhDb29yZDFmKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQxZnZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkMWZ2QVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQxZnYJCU1BTkdMRShNdWx0aVRleENvb3JkMWZ2KQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQxaE5WCQlNQU5HTEUoTXVsdGlUZXhDb29yZDFoTlYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDFodk5WCQlNQU5HTEUoTXVsdGlUZXhDb29yZDFodk5WKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQxaUFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQxaUFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMWkJCU1BTkdMRShNdWx0aVRleENvb3JkMWkpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDFpdkFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQxaXZBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDFpdgkJTUFOR0xFKE11bHRpVGV4Q29vcmQxaXYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDFzQVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDFzQVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQxcwkJTUFOR0xFKE11bHRpVGV4Q29vcmQxcykKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMXN2QVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDFzdkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMXN2CQlNQU5HTEUoTXVsdGlUZXhDb29yZDFzdikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMmRBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkMmRBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDJkCQlNQU5HTEUoTXVsdGlUZXhDb29yZDJkKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQyZHZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkMmR2QVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQyZHYJCU1BTkdMRShNdWx0aVRleENvb3JkMmR2KQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQyZkFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyZkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMmYJCU1BTkdMRShNdWx0aVRleENvb3JkMmYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDJmdkFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyZnZBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDJmdgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyZnYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDJoTlYJCU1BTkdMRShNdWx0aVRleENvb3JkMmhOVikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMmh2TlYJCU1BTkdMRShNdWx0aVRleENvb3JkMmh2TlYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDJpQVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDJpQVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQyaQkJTUFOR0xFKE11bHRpVGV4Q29vcmQyaSkKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMml2QVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDJpdkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMml2CQlNQU5HTEUoTXVsdGlUZXhDb29yZDJpdikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMnNBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkMnNBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDJzCQlNQU5HTEUoTXVsdGlUZXhDb29yZDJzKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQyc3ZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkMnN2QVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQyc3YJCU1BTkdMRShNdWx0aVRleENvb3JkMnN2KQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQzZEFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQzZEFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkM2QJCU1BTkdMRShNdWx0aVRleENvb3JkM2QpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDNkdkFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQzZHZBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDNkdgkJTUFOR0xFKE11bHRpVGV4Q29vcmQzZHYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDNmQVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDNmQVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQzZgkJTUFOR0xFKE11bHRpVGV4Q29vcmQzZikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkM2Z2QVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDNmdkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkM2Z2CQlNQU5HTEUoTXVsdGlUZXhDb29yZDNmdikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkM2hOVgkJTUFOR0xFKE11bHRpVGV4Q29vcmQzaE5WKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQzaHZOVgkJTUFOR0xFKE11bHRpVGV4Q29vcmQzaHZOVikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkM2lBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkM2lBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDNpCQlNQU5HTEUoTXVsdGlUZXhDb29yZDNpKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQzaXZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkM2l2QVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQzaXYJCU1BTkdMRShNdWx0aVRleENvb3JkM2l2KQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQzc0FSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQzc0FSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkM3MJCU1BTkdMRShNdWx0aVRleENvb3JkM3MpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDNzdkFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQzc3ZBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDNzdgkJTUFOR0xFKE11bHRpVGV4Q29vcmQzc3YpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDRkQVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDRkQVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQ0ZAkJTUFOR0xFKE11bHRpVGV4Q29vcmQ0ZCkKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkNGR2QVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDRkdkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkNGR2CQlNQU5HTEUoTXVsdGlUZXhDb29yZDRkdikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkNGZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkNGZBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDRmCQlNQU5HTEUoTXVsdGlUZXhDb29yZDRmKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQ0ZnZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkNGZ2QVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQ0ZnYJCU1BTkdMRShNdWx0aVRleENvb3JkNGZ2KQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQ0aE5WCQlNQU5HTEUoTXVsdGlUZXhDb29yZDRoTlYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDRodk5WCQlNQU5HTEUoTXVsdGlUZXhDb29yZDRodk5WKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQ0aUFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQ0aUFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkNGkJCU1BTkdMRShNdWx0aVRleENvb3JkNGkpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDRpdkFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQ0aXZBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDRpdgkJTUFOR0xFKE11bHRpVGV4Q29vcmQ0aXYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDRzQVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDRzQVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQ0cwkJTUFOR0xFKE11bHRpVGV4Q29vcmQ0cykKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkNHN2QVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDRzdkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkNHN2CQlNQU5HTEUoTXVsdGlUZXhDb29yZDRzdikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkUDF1aQkJTUFOR0xFKE11bHRpVGV4Q29vcmRQMXVpKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmRQMXVpdgkJTUFOR0xFKE11bHRpVGV4Q29vcmRQMXVpdikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkUDJ1aQkJTUFOR0xFKE11bHRpVGV4Q29vcmRQMnVpKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmRQMnVpdgkJTUFOR0xFKE11bHRpVGV4Q29vcmRQMnVpdikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkUDN1aQkJTUFOR0xFKE11bHRpVGV4Q29vcmRQM3VpKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmRQM3VpdgkJTUFOR0xFKE11bHRpVGV4Q29vcmRQM3VpdikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkUDR1aQkJTUFOR0xFKE11bHRpVGV4Q29vcmRQNHVpKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmRQNHVpdgkJTUFOR0xFKE11bHRpVGV4Q29vcmRQNHVpdikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkUG9pbnRlckVYVAkJTUFOR0xFKE11bHRpVGV4Q29vcmRQb2ludGVyRVhUKQorI2RlZmluZSBnbE11bHRpVGV4RW52ZkVYVAkJTUFOR0xFKE11bHRpVGV4RW52ZkVYVCkKKyNkZWZpbmUgZ2xNdWx0aVRleEVudmZ2RVhUCQlNQU5HTEUoTXVsdGlUZXhFbnZmdkVYVCkKKyNkZWZpbmUgZ2xNdWx0aVRleEVudmlFWFQJCU1BTkdMRShNdWx0aVRleEVudmlFWFQpCisjZGVmaW5lIGdsTXVsdGlUZXhFbnZpdkVYVAkJTUFOR0xFKE11bHRpVGV4RW52aXZFWFQpCisjZGVmaW5lIGdsTXVsdGlUZXhHZW5kRVhUCQlNQU5HTEUoTXVsdGlUZXhHZW5kRVhUKQorI2RlZmluZSBnbE11bHRpVGV4R2VuZHZFWFQJCU1BTkdMRShNdWx0aVRleEdlbmR2RVhUKQorI2RlZmluZSBnbE11bHRpVGV4R2VuZkVYVAkJTUFOR0xFKE11bHRpVGV4R2VuZkVYVCkKKyNkZWZpbmUgZ2xNdWx0aVRleEdlbmZ2RVhUCQlNQU5HTEUoTXVsdGlUZXhHZW5mdkVYVCkKKyNkZWZpbmUgZ2xNdWx0aVRleEdlbmlFWFQJCU1BTkdMRShNdWx0aVRleEdlbmlFWFQpCisjZGVmaW5lIGdsTXVsdGlUZXhHZW5pdkVYVAkJTUFOR0xFKE11bHRpVGV4R2VuaXZFWFQpCisjZGVmaW5lIGdsTXVsdGlUZXhJbWFnZTFERVhUCQlNQU5HTEUoTXVsdGlUZXhJbWFnZTFERVhUKQorI2RlZmluZSBnbE11bHRpVGV4SW1hZ2UyREVYVAkJTUFOR0xFKE11bHRpVGV4SW1hZ2UyREVYVCkKKyNkZWZpbmUgZ2xNdWx0aVRleEltYWdlM0RFWFQJCU1BTkdMRShNdWx0aVRleEltYWdlM0RFWFQpCisjZGVmaW5lIGdsTXVsdGlUZXhQYXJhbWV0ZXJmRVhUCQlNQU5HTEUoTXVsdGlUZXhQYXJhbWV0ZXJmRVhUKQorI2RlZmluZSBnbE11bHRpVGV4UGFyYW1ldGVyZnZFWFQJCU1BTkdMRShNdWx0aVRleFBhcmFtZXRlcmZ2RVhUKQorI2RlZmluZSBnbE11bHRpVGV4UGFyYW1ldGVyaUVYVAkJTUFOR0xFKE11bHRpVGV4UGFyYW1ldGVyaUVYVCkKKyNkZWZpbmUgZ2xNdWx0aVRleFBhcmFtZXRlcklpdkVYVAkJTUFOR0xFKE11bHRpVGV4UGFyYW1ldGVySWl2RVhUKQorI2RlZmluZSBnbE11bHRpVGV4UGFyYW1ldGVySXVpdkVYVAkJTUFOR0xFKE11bHRpVGV4UGFyYW1ldGVySXVpdkVYVCkKKyNkZWZpbmUgZ2xNdWx0aVRleFBhcmFtZXRlcml2RVhUCQlNQU5HTEUoTXVsdGlUZXhQYXJhbWV0ZXJpdkVYVCkKKyNkZWZpbmUgZ2xNdWx0aVRleFJlbmRlcmJ1ZmZlckVYVAkJTUFOR0xFKE11bHRpVGV4UmVuZGVyYnVmZmVyRVhUKQorI2RlZmluZSBnbE11bHRpVGV4U3ViSW1hZ2UxREVYVAkJTUFOR0xFKE11bHRpVGV4U3ViSW1hZ2UxREVYVCkKKyNkZWZpbmUgZ2xNdWx0aVRleFN1YkltYWdlMkRFWFQJCU1BTkdMRShNdWx0aVRleFN1YkltYWdlMkRFWFQpCisjZGVmaW5lIGdsTXVsdGlUZXhTdWJJbWFnZTNERVhUCQlNQU5HTEUoTXVsdGlUZXhTdWJJbWFnZTNERVhUKQorI2RlZmluZSBnbE11bHRNYXRyaXhkCQlNQU5HTEUoTXVsdE1hdHJpeGQpCisjZGVmaW5lIGdsTXVsdE1hdHJpeGYJCU1BTkdMRShNdWx0TWF0cml4ZikKKyNkZWZpbmUgZ2xNdWx0VHJhbnNwb3NlTWF0cml4ZEFSQgkJTUFOR0xFKE11bHRUcmFuc3Bvc2VNYXRyaXhkQVJCKQorI2RlZmluZSBnbE11bHRUcmFuc3Bvc2VNYXRyaXhkCQlNQU5HTEUoTXVsdFRyYW5zcG9zZU1hdHJpeGQpCisjZGVmaW5lIGdsTXVsdFRyYW5zcG9zZU1hdHJpeGZBUkIJCU1BTkdMRShNdWx0VHJhbnNwb3NlTWF0cml4ZkFSQikKKyNkZWZpbmUgZ2xNdWx0VHJhbnNwb3NlTWF0cml4ZgkJTUFOR0xFKE11bHRUcmFuc3Bvc2VNYXRyaXhmKQorI2RlZmluZSBnbE5hbWVkQnVmZmVyRGF0YUVYVAkJTUFOR0xFKE5hbWVkQnVmZmVyRGF0YUVYVCkKKyNkZWZpbmUgZ2xOYW1lZEJ1ZmZlclN1YkRhdGFFWFQJCU1BTkdMRShOYW1lZEJ1ZmZlclN1YkRhdGFFWFQpCisjZGVmaW5lIGdsTmFtZWRDb3B5QnVmZmVyU3ViRGF0YUVYVAkJTUFOR0xFKE5hbWVkQ29weUJ1ZmZlclN1YkRhdGFFWFQpCisjZGVmaW5lIGdsTmFtZWRGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVAkJTUFOR0xFKE5hbWVkRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQpCisjZGVmaW5lIGdsTmFtZWRGcmFtZWJ1ZmZlclRleHR1cmUxREVYVAkJTUFOR0xFKE5hbWVkRnJhbWVidWZmZXJUZXh0dXJlMURFWFQpCisjZGVmaW5lIGdsTmFtZWRGcmFtZWJ1ZmZlclRleHR1cmUyREVYVAkJTUFOR0xFKE5hbWVkRnJhbWVidWZmZXJUZXh0dXJlMkRFWFQpCisjZGVmaW5lIGdsTmFtZWRGcmFtZWJ1ZmZlclRleHR1cmUzREVYVAkJTUFOR0xFKE5hbWVkRnJhbWVidWZmZXJUZXh0dXJlM0RFWFQpCisjZGVmaW5lIGdsTmFtZWRGcmFtZWJ1ZmZlclRleHR1cmVFWFQJCU1BTkdMRShOYW1lZEZyYW1lYnVmZmVyVGV4dHVyZUVYVCkKKyNkZWZpbmUgZ2xOYW1lZEZyYW1lYnVmZmVyVGV4dHVyZUZhY2VFWFQJCU1BTkdMRShOYW1lZEZyYW1lYnVmZmVyVGV4dHVyZUZhY2VFWFQpCisjZGVmaW5lIGdsTmFtZWRGcmFtZWJ1ZmZlclRleHR1cmVMYXllckVYVAkJTUFOR0xFKE5hbWVkRnJhbWVidWZmZXJUZXh0dXJlTGF5ZXJFWFQpCisjZGVmaW5lIGdsTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXI0ZEVYVAkJTUFOR0xFKE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGRFWFQpCisjZGVmaW5lIGdsTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXI0ZHZFWFQJCU1BTkdMRShOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRkdkVYVCkKKyNkZWZpbmUgZ2xOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRmRVhUCQlNQU5HTEUoTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXI0ZkVYVCkKKyNkZWZpbmUgZ2xOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRmdkVYVAkJTUFOR0xFKE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGZ2RVhUKQorI2RlZmluZSBnbE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVySTRpRVhUCQlNQU5HTEUoTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJNGlFWFQpCisjZGVmaW5lIGdsTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJNGl2RVhUCQlNQU5HTEUoTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJNGl2RVhUKQorI2RlZmluZSBnbE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVySTR1aUVYVAkJTUFOR0xFKE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVySTR1aUVYVCkKKyNkZWZpbmUgZ2xOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0dWl2RVhUCQlNQU5HTEUoTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJNHVpdkVYVCkKKyNkZWZpbmUgZ2xOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcnM0ZnZFWFQJCU1BTkdMRShOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcnM0ZnZFWFQpCisjZGVmaW5lIGdsTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJzSTRpdkVYVAkJTUFOR0xFKE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVyc0k0aXZFWFQpCisjZGVmaW5lIGdsTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJzSTR1aXZFWFQJCU1BTkdMRShOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcnNJNHVpdkVYVCkKKyNkZWZpbmUgZ2xOYW1lZFByb2dyYW1TdHJpbmdFWFQJCU1BTkdMRShOYW1lZFByb2dyYW1TdHJpbmdFWFQpCisjZGVmaW5lIGdsTmFtZWRSZW5kZXJidWZmZXJTdG9yYWdlRVhUCQlNQU5HTEUoTmFtZWRSZW5kZXJidWZmZXJTdG9yYWdlRVhUKQorI2RlZmluZSBnbE5hbWVkUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQ292ZXJhZ2VFWFQJCU1BTkdMRShOYW1lZFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUNvdmVyYWdlRVhUKQorI2RlZmluZSBnbE5hbWVkUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUCQlNQU5HTEUoTmFtZWRSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQpCisjZGVmaW5lIGdsTmFtZWRTdHJpbmdBUkIJCU1BTkdMRShOYW1lZFN0cmluZ0FSQikKKyNkZWZpbmUgZ2xOZXdMaXN0CQlNQU5HTEUoTmV3TGlzdCkKKyNkZWZpbmUgZ2xOZXdPYmplY3RCdWZmZXJBVEkJCU1BTkdMRShOZXdPYmplY3RCdWZmZXJBVEkpCisjZGVmaW5lIGdsTm9ybWFsM2IJCU1BTkdMRShOb3JtYWwzYikKKyNkZWZpbmUgZ2xOb3JtYWwzYnYJCU1BTkdMRShOb3JtYWwzYnYpCisjZGVmaW5lIGdsTm9ybWFsM2QJCU1BTkdMRShOb3JtYWwzZCkKKyNkZWZpbmUgZ2xOb3JtYWwzZHYJCU1BTkdMRShOb3JtYWwzZHYpCisjZGVmaW5lIGdsTm9ybWFsM2YJCU1BTkdMRShOb3JtYWwzZikKKyNkZWZpbmUgZ2xOb3JtYWwzZlZlcnRleDNmU1VOCQlNQU5HTEUoTm9ybWFsM2ZWZXJ0ZXgzZlNVTikKKyNkZWZpbmUgZ2xOb3JtYWwzZlZlcnRleDNmdlNVTgkJTUFOR0xFKE5vcm1hbDNmVmVydGV4M2Z2U1VOKQorI2RlZmluZSBnbE5vcm1hbDNmdgkJTUFOR0xFKE5vcm1hbDNmdikKKyNkZWZpbmUgZ2xOb3JtYWwzaE5WCQlNQU5HTEUoTm9ybWFsM2hOVikKKyNkZWZpbmUgZ2xOb3JtYWwzaHZOVgkJTUFOR0xFKE5vcm1hbDNodk5WKQorI2RlZmluZSBnbE5vcm1hbDNpCQlNQU5HTEUoTm9ybWFsM2kpCisjZGVmaW5lIGdsTm9ybWFsM2l2CQlNQU5HTEUoTm9ybWFsM2l2KQorI2RlZmluZSBnbE5vcm1hbDNzCQlNQU5HTEUoTm9ybWFsM3MpCisjZGVmaW5lIGdsTm9ybWFsM3N2CQlNQU5HTEUoTm9ybWFsM3N2KQorI2RlZmluZSBnbE5vcm1hbEZvcm1hdE5WCQlNQU5HTEUoTm9ybWFsRm9ybWF0TlYpCisjZGVmaW5lIGdsTm9ybWFsUDN1aQkJTUFOR0xFKE5vcm1hbFAzdWkpCisjZGVmaW5lIGdsTm9ybWFsUDN1aXYJCU1BTkdMRShOb3JtYWxQM3VpdikKKyNkZWZpbmUgZ2xOb3JtYWxQb2ludGVyRVhUCQlNQU5HTEUoTm9ybWFsUG9pbnRlckVYVCkKKyNkZWZpbmUgZ2xOb3JtYWxQb2ludGVyTGlzdElCTQkJTUFOR0xFKE5vcm1hbFBvaW50ZXJMaXN0SUJNKQorI2RlZmluZSBnbE5vcm1hbFBvaW50ZXIJCU1BTkdMRShOb3JtYWxQb2ludGVyKQorI2RlZmluZSBnbE5vcm1hbFBvaW50ZXJ2SU5URUwJCU1BTkdMRShOb3JtYWxQb2ludGVydklOVEVMKQorI2RlZmluZSBnbE5vcm1hbFN0cmVhbTNiQVRJCQlNQU5HTEUoTm9ybWFsU3RyZWFtM2JBVEkpCisjZGVmaW5lIGdsTm9ybWFsU3RyZWFtM2J2QVRJCQlNQU5HTEUoTm9ybWFsU3RyZWFtM2J2QVRJKQorI2RlZmluZSBnbE5vcm1hbFN0cmVhbTNkQVRJCQlNQU5HTEUoTm9ybWFsU3RyZWFtM2RBVEkpCisjZGVmaW5lIGdsTm9ybWFsU3RyZWFtM2R2QVRJCQlNQU5HTEUoTm9ybWFsU3RyZWFtM2R2QVRJKQorI2RlZmluZSBnbE5vcm1hbFN0cmVhbTNmQVRJCQlNQU5HTEUoTm9ybWFsU3RyZWFtM2ZBVEkpCisjZGVmaW5lIGdsTm9ybWFsU3RyZWFtM2Z2QVRJCQlNQU5HTEUoTm9ybWFsU3RyZWFtM2Z2QVRJKQorI2RlZmluZSBnbE5vcm1hbFN0cmVhbTNpQVRJCQlNQU5HTEUoTm9ybWFsU3RyZWFtM2lBVEkpCisjZGVmaW5lIGdsTm9ybWFsU3RyZWFtM2l2QVRJCQlNQU5HTEUoTm9ybWFsU3RyZWFtM2l2QVRJKQorI2RlZmluZSBnbE5vcm1hbFN0cmVhbTNzQVRJCQlNQU5HTEUoTm9ybWFsU3RyZWFtM3NBVEkpCisjZGVmaW5lIGdsTm9ybWFsU3RyZWFtM3N2QVRJCQlNQU5HTEUoTm9ybWFsU3RyZWFtM3N2QVRJKQorI2RlZmluZSBnbE9iamVjdFB1cmdlYWJsZUFQUExFCQlNQU5HTEUoT2JqZWN0UHVyZ2VhYmxlQVBQTEUpCisjZGVmaW5lIGdsT2JqZWN0VW5wdXJnZWFibGVBUFBMRQkJTUFOR0xFKE9iamVjdFVucHVyZ2VhYmxlQVBQTEUpCisjZGVmaW5lIGdsT3J0aG8JCU1BTkdMRShPcnRobykKKyNkZWZpbmUgZ2xQYXNzVGV4Q29vcmRBVEkJCU1BTkdMRShQYXNzVGV4Q29vcmRBVEkpCisjZGVmaW5lIGdsUGFzc1Rocm91Z2gJCU1BTkdMRShQYXNzVGhyb3VnaCkKKyNkZWZpbmUgZ2xQYXRjaFBhcmFtZXRlcmZ2CQlNQU5HTEUoUGF0Y2hQYXJhbWV0ZXJmdikKKyNkZWZpbmUgZ2xQYXRjaFBhcmFtZXRlcmkJCU1BTkdMRShQYXRjaFBhcmFtZXRlcmkpCisjZGVmaW5lIGdsUGF1c2VUcmFuc2Zvcm1GZWVkYmFjawkJTUFOR0xFKFBhdXNlVHJhbnNmb3JtRmVlZGJhY2spCisjZGVmaW5lIGdsUGF1c2VUcmFuc2Zvcm1GZWVkYmFja05WCQlNQU5HTEUoUGF1c2VUcmFuc2Zvcm1GZWVkYmFja05WKQorI2RlZmluZSBnbFBpeGVsRGF0YVJhbmdlTlYJCU1BTkdMRShQaXhlbERhdGFSYW5nZU5WKQorI2RlZmluZSBnbFBpeGVsTWFwZnYJCU1BTkdMRShQaXhlbE1hcGZ2KQorI2RlZmluZSBnbFBpeGVsTWFwdWl2CQlNQU5HTEUoUGl4ZWxNYXB1aXYpCisjZGVmaW5lIGdsUGl4ZWxNYXB1c3YJCU1BTkdMRShQaXhlbE1hcHVzdikKKyNkZWZpbmUgZ2xQaXhlbFN0b3JlZgkJTUFOR0xFKFBpeGVsU3RvcmVmKQorI2RlZmluZSBnbFBpeGVsU3RvcmVpCQlNQU5HTEUoUGl4ZWxTdG9yZWkpCisjZGVmaW5lIGdsUGl4ZWxUZXhHZW5QYXJhbWV0ZXJmU0dJUwkJTUFOR0xFKFBpeGVsVGV4R2VuUGFyYW1ldGVyZlNHSVMpCisjZGVmaW5lIGdsUGl4ZWxUZXhHZW5QYXJhbWV0ZXJmdlNHSVMJCU1BTkdMRShQaXhlbFRleEdlblBhcmFtZXRlcmZ2U0dJUykKKyNkZWZpbmUgZ2xQaXhlbFRleEdlblBhcmFtZXRlcmlTR0lTCQlNQU5HTEUoUGl4ZWxUZXhHZW5QYXJhbWV0ZXJpU0dJUykKKyNkZWZpbmUgZ2xQaXhlbFRleEdlblBhcmFtZXRlcml2U0dJUwkJTUFOR0xFKFBpeGVsVGV4R2VuUGFyYW1ldGVyaXZTR0lTKQorI2RlZmluZSBnbFBpeGVsVGV4R2VuU0dJWAkJTUFOR0xFKFBpeGVsVGV4R2VuU0dJWCkKKyNkZWZpbmUgZ2xQaXhlbFRyYW5zZmVyZgkJTUFOR0xFKFBpeGVsVHJhbnNmZXJmKQorI2RlZmluZSBnbFBpeGVsVHJhbnNmZXJpCQlNQU5HTEUoUGl4ZWxUcmFuc2ZlcmkpCisjZGVmaW5lIGdsUGl4ZWxUcmFuc2Zvcm1QYXJhbWV0ZXJmRVhUCQlNQU5HTEUoUGl4ZWxUcmFuc2Zvcm1QYXJhbWV0ZXJmRVhUKQorI2RlZmluZSBnbFBpeGVsVHJhbnNmb3JtUGFyYW1ldGVyZnZFWFQJCU1BTkdMRShQaXhlbFRyYW5zZm9ybVBhcmFtZXRlcmZ2RVhUKQorI2RlZmluZSBnbFBpeGVsVHJhbnNmb3JtUGFyYW1ldGVyaUVYVAkJTUFOR0xFKFBpeGVsVHJhbnNmb3JtUGFyYW1ldGVyaUVYVCkKKyNkZWZpbmUgZ2xQaXhlbFRyYW5zZm9ybVBhcmFtZXRlcml2RVhUCQlNQU5HTEUoUGl4ZWxUcmFuc2Zvcm1QYXJhbWV0ZXJpdkVYVCkKKyNkZWZpbmUgZ2xQaXhlbFpvb20JCU1BTkdMRShQaXhlbFpvb20pCisjZGVmaW5lIGdsUE5UcmlhbmdsZXNmQVRJCQlNQU5HTEUoUE5UcmlhbmdsZXNmQVRJKQorI2RlZmluZSBnbFBOVHJpYW5nbGVzaUFUSQkJTUFOR0xFKFBOVHJpYW5nbGVzaUFUSSkKKyNkZWZpbmUgZ2xQb2ludFBhcmFtZXRlcmZBUkIJCU1BTkdMRShQb2ludFBhcmFtZXRlcmZBUkIpCisjZGVmaW5lIGdsUG9pbnRQYXJhbWV0ZXJmRVhUCQlNQU5HTEUoUG9pbnRQYXJhbWV0ZXJmRVhUKQorI2RlZmluZSBnbFBvaW50UGFyYW1ldGVyZgkJTUFOR0xFKFBvaW50UGFyYW1ldGVyZikKKyNkZWZpbmUgZ2xQb2ludFBhcmFtZXRlcmZTR0lTCQlNQU5HTEUoUG9pbnRQYXJhbWV0ZXJmU0dJUykKKyNkZWZpbmUgZ2xQb2ludFBhcmFtZXRlcmZ2QVJCCQlNQU5HTEUoUG9pbnRQYXJhbWV0ZXJmdkFSQikKKyNkZWZpbmUgZ2xQb2ludFBhcmFtZXRlcmZ2RVhUCQlNQU5HTEUoUG9pbnRQYXJhbWV0ZXJmdkVYVCkKKyNkZWZpbmUgZ2xQb2ludFBhcmFtZXRlcmZ2CQlNQU5HTEUoUG9pbnRQYXJhbWV0ZXJmdikKKyNkZWZpbmUgZ2xQb2ludFBhcmFtZXRlcmZ2U0dJUwkJTUFOR0xFKFBvaW50UGFyYW1ldGVyZnZTR0lTKQorI2RlZmluZSBnbFBvaW50UGFyYW1ldGVyaQkJTUFOR0xFKFBvaW50UGFyYW1ldGVyaSkKKyNkZWZpbmUgZ2xQb2ludFBhcmFtZXRlcmlOVgkJTUFOR0xFKFBvaW50UGFyYW1ldGVyaU5WKQorI2RlZmluZSBnbFBvaW50UGFyYW1ldGVyaXYJCU1BTkdMRShQb2ludFBhcmFtZXRlcml2KQorI2RlZmluZSBnbFBvaW50UGFyYW1ldGVyaXZOVgkJTUFOR0xFKFBvaW50UGFyYW1ldGVyaXZOVikKKyNkZWZpbmUgZ2xQb2ludFNpemUJCU1BTkdMRShQb2ludFNpemUpCisjZGVmaW5lIGdsUG9sbEFzeW5jU0dJWAkJTUFOR0xFKFBvbGxBc3luY1NHSVgpCisjZGVmaW5lIGdsUG9sbEluc3RydW1lbnRzU0dJWAkJTUFOR0xFKFBvbGxJbnN0cnVtZW50c1NHSVgpCisjZGVmaW5lIGdsUG9seWdvbk1vZGUJCU1BTkdMRShQb2x5Z29uTW9kZSkKKyNkZWZpbmUgZ2xQb2x5Z29uT2Zmc2V0RVhUCQlNQU5HTEUoUG9seWdvbk9mZnNldEVYVCkKKyNkZWZpbmUgZ2xQb2x5Z29uT2Zmc2V0CQlNQU5HTEUoUG9seWdvbk9mZnNldCkKKyNkZWZpbmUgZ2xQb2x5Z29uU3RpcHBsZQkJTUFOR0xFKFBvbHlnb25TdGlwcGxlKQorI2RlZmluZSBnbFBvcEF0dHJpYgkJTUFOR0xFKFBvcEF0dHJpYikKKyNkZWZpbmUgZ2xQb3BDbGllbnRBdHRyaWIJCU1BTkdMRShQb3BDbGllbnRBdHRyaWIpCisjZGVmaW5lIGdsUG9wTWF0cml4CQlNQU5HTEUoUG9wTWF0cml4KQorI2RlZmluZSBnbFBvcE5hbWUJCU1BTkdMRShQb3BOYW1lKQorI2RlZmluZSBnbFByZXNlbnRGcmFtZUR1YWxGaWxsTlYJCU1BTkdMRShQcmVzZW50RnJhbWVEdWFsRmlsbE5WKQorI2RlZmluZSBnbFByZXNlbnRGcmFtZUtleWVkTlYJCU1BTkdMRShQcmVzZW50RnJhbWVLZXllZE5WKQorI2RlZmluZSBnbFByaW1pdGl2ZVJlc3RhcnRJbmRleAkJTUFOR0xFKFByaW1pdGl2ZVJlc3RhcnRJbmRleCkKKyNkZWZpbmUgZ2xQcmltaXRpdmVSZXN0YXJ0SW5kZXhOVgkJTUFOR0xFKFByaW1pdGl2ZVJlc3RhcnRJbmRleE5WKQorI2RlZmluZSBnbFByaW1pdGl2ZVJlc3RhcnROVgkJTUFOR0xFKFByaW1pdGl2ZVJlc3RhcnROVikKKyNkZWZpbmUgZ2xQcmlvcml0aXplVGV4dHVyZXNFWFQJCU1BTkdMRShQcmlvcml0aXplVGV4dHVyZXNFWFQpCisjZGVmaW5lIGdsUHJpb3JpdGl6ZVRleHR1cmVzCQlNQU5HTEUoUHJpb3JpdGl6ZVRleHR1cmVzKQorI2RlZmluZSBnbFByb2dyYW1CaW5hcnkJCU1BTkdMRShQcm9ncmFtQmluYXJ5KQorI2RlZmluZSBnbFByb2dyYW1CdWZmZXJQYXJhbWV0ZXJzZnZOVgkJTUFOR0xFKFByb2dyYW1CdWZmZXJQYXJhbWV0ZXJzZnZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtQnVmZmVyUGFyYW1ldGVyc0lpdk5WCQlNQU5HTEUoUHJvZ3JhbUJ1ZmZlclBhcmFtZXRlcnNJaXZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtQnVmZmVyUGFyYW1ldGVyc0l1aXZOVgkJTUFOR0xFKFByb2dyYW1CdWZmZXJQYXJhbWV0ZXJzSXVpdk5WKQorI2RlZmluZSBnbFByb2dyYW1DYWxsYmFja01FU0EJCU1BTkdMRShQcm9ncmFtQ2FsbGJhY2tNRVNBKQorI2RlZmluZSBnbFByb2dyYW1FbnZQYXJhbWV0ZXI0ZEFSQgkJTUFOR0xFKFByb2dyYW1FbnZQYXJhbWV0ZXI0ZEFSQikKKyNkZWZpbmUgZ2xQcm9ncmFtRW52UGFyYW1ldGVyNGR2QVJCCQlNQU5HTEUoUHJvZ3JhbUVudlBhcmFtZXRlcjRkdkFSQikKKyNkZWZpbmUgZ2xQcm9ncmFtRW52UGFyYW1ldGVyNGZBUkIJCU1BTkdMRShQcm9ncmFtRW52UGFyYW1ldGVyNGZBUkIpCisjZGVmaW5lIGdsUHJvZ3JhbUVudlBhcmFtZXRlcjRmdkFSQgkJTUFOR0xFKFByb2dyYW1FbnZQYXJhbWV0ZXI0ZnZBUkIpCisjZGVmaW5lIGdsUHJvZ3JhbUVudlBhcmFtZXRlckk0aU5WCQlNQU5HTEUoUHJvZ3JhbUVudlBhcmFtZXRlckk0aU5WKQorI2RlZmluZSBnbFByb2dyYW1FbnZQYXJhbWV0ZXJJNGl2TlYJCU1BTkdMRShQcm9ncmFtRW52UGFyYW1ldGVySTRpdk5WKQorI2RlZmluZSBnbFByb2dyYW1FbnZQYXJhbWV0ZXJJNHVpTlYJCU1BTkdMRShQcm9ncmFtRW52UGFyYW1ldGVySTR1aU5WKQorI2RlZmluZSBnbFByb2dyYW1FbnZQYXJhbWV0ZXJJNHVpdk5WCQlNQU5HTEUoUHJvZ3JhbUVudlBhcmFtZXRlckk0dWl2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbUVudlBhcmFtZXRlcnM0ZnZFWFQJCU1BTkdMRShQcm9ncmFtRW52UGFyYW1ldGVyczRmdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtRW52UGFyYW1ldGVyc0k0aXZOVgkJTUFOR0xFKFByb2dyYW1FbnZQYXJhbWV0ZXJzSTRpdk5WKQorI2RlZmluZSBnbFByb2dyYW1FbnZQYXJhbWV0ZXJzSTR1aXZOVgkJTUFOR0xFKFByb2dyYW1FbnZQYXJhbWV0ZXJzSTR1aXZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXI0ZEFSQgkJTUFOR0xFKFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRkQVJCKQorI2RlZmluZSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRkdkFSQgkJTUFOR0xFKFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRkdkFSQikKKyNkZWZpbmUgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXI0ZkFSQgkJTUFOR0xFKFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRmQVJCKQorI2RlZmluZSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRmdkFSQgkJTUFOR0xFKFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRmdkFSQikKKyNkZWZpbmUgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJNGlOVgkJTUFOR0xFKFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0aU5WKQorI2RlZmluZSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0aXZOVgkJTUFOR0xFKFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0aXZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJNHVpTlYJCU1BTkdMRShQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJNHVpTlYpCisjZGVmaW5lIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVySTR1aXZOVgkJTUFOR0xFKFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0dWl2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVyczRmdkVYVAkJTUFOR0xFKFByb2dyYW1Mb2NhbFBhcmFtZXRlcnM0ZnZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVyc0k0aXZOVgkJTUFOR0xFKFByb2dyYW1Mb2NhbFBhcmFtZXRlcnNJNGl2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVyc0k0dWl2TlYJCU1BTkdMRShQcm9ncmFtTG9jYWxQYXJhbWV0ZXJzSTR1aXZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtTmFtZWRQYXJhbWV0ZXI0ZE5WCQlNQU5HTEUoUHJvZ3JhbU5hbWVkUGFyYW1ldGVyNGROVikKKyNkZWZpbmUgZ2xQcm9ncmFtTmFtZWRQYXJhbWV0ZXI0ZHZOVgkJTUFOR0xFKFByb2dyYW1OYW1lZFBhcmFtZXRlcjRkdk5WKQorI2RlZmluZSBnbFByb2dyYW1OYW1lZFBhcmFtZXRlcjRmTlYJCU1BTkdMRShQcm9ncmFtTmFtZWRQYXJhbWV0ZXI0Zk5WKQorI2RlZmluZSBnbFByb2dyYW1OYW1lZFBhcmFtZXRlcjRmdk5WCQlNQU5HTEUoUHJvZ3JhbU5hbWVkUGFyYW1ldGVyNGZ2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbVBhcmFtZXRlcjRkTlYJCU1BTkdMRShQcm9ncmFtUGFyYW1ldGVyNGROVikKKyNkZWZpbmUgZ2xQcm9ncmFtUGFyYW1ldGVyNGR2TlYJCU1BTkdMRShQcm9ncmFtUGFyYW1ldGVyNGR2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbVBhcmFtZXRlcjRmTlYJCU1BTkdMRShQcm9ncmFtUGFyYW1ldGVyNGZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtUGFyYW1ldGVyNGZ2TlYJCU1BTkdMRShQcm9ncmFtUGFyYW1ldGVyNGZ2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbVBhcmFtZXRlcmlBUkIJCU1BTkdMRShQcm9ncmFtUGFyYW1ldGVyaUFSQikKKyNkZWZpbmUgZ2xQcm9ncmFtUGFyYW1ldGVyaUVYVAkJTUFOR0xFKFByb2dyYW1QYXJhbWV0ZXJpRVhUKQorI2RlZmluZSBnbFByb2dyYW1QYXJhbWV0ZXJpCQlNQU5HTEUoUHJvZ3JhbVBhcmFtZXRlcmkpCisjZGVmaW5lIGdsUHJvZ3JhbVBhcmFtZXRlcnM0ZHZOVgkJTUFOR0xFKFByb2dyYW1QYXJhbWV0ZXJzNGR2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbVBhcmFtZXRlcnM0ZnZOVgkJTUFOR0xFKFByb2dyYW1QYXJhbWV0ZXJzNGZ2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbVN0cmluZ0FSQgkJTUFOR0xFKFByb2dyYW1TdHJpbmdBUkIpCisjZGVmaW5lIGdsUHJvZ3JhbVN1YnJvdXRpbmVQYXJhbWV0ZXJzdWl2TlYJCU1BTkdMRShQcm9ncmFtU3Vicm91dGluZVBhcmFtZXRlcnN1aXZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTFkRVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0xZEVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTFkCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0xZCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTFkdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMWR2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMWR2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0xZHYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0xZkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMWZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0xZgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMWYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0xZnZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTFmdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTFmdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMWZ2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMWk2NE5WCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0xaTY0TlYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0xaTY0dk5WCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0xaTY0dk5WKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMWlFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTFpRVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMWkJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTFpKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMWl2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0xaXZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0xaXYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTFpdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTF1aTY0TlYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTF1aTY0TlYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0xdWk2NHZOVgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMXVpNjR2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0xdWlFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTF1aUVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTF1aQkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMXVpKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMXVpdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMXVpdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTF1aXYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTF1aXYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0yZEVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMmRFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0yZAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMmQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0yZHZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTJkdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTJkdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMmR2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMmZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTJmRVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMmYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTJmKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMmZ2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0yZnZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0yZnYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTJmdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTJpNjROVgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMmk2NE5WKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMmk2NHZOVgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMmk2NHZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTJpRVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0yaUVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTJpCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0yaSkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTJpdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtMml2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMml2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0yaXYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0ydWk2NE5WCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0ydWk2NE5WKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMnVpNjR2TlYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTJ1aTY0dk5WKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtMnVpRVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0ydWlFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0ydWkJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTJ1aSkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTJ1aXZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTJ1aXZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0ydWl2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0ydWl2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtM2RFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTNkRVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtM2QJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTNkKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtM2R2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0zZHZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0zZHYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTNkdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTNmRVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0zZkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTNmCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0zZikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTNmdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtM2Z2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtM2Z2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0zZnYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0zaTY0TlYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTNpNjROVikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTNpNjR2TlYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTNpNjR2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0zaUVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtM2lFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0zaQkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtM2kpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0zaXZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTNpdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTNpdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtM2l2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtM3VpNjROVgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtM3VpNjROVikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTN1aTY0dk5WCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0zdWk2NHZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTN1aUVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtM3VpRVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtM3VpCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0zdWkpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm0zdWl2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm0zdWl2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtM3VpdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtM3VpdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTRkRVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm00ZEVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTRkCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm00ZCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTRkdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtNGR2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtNGR2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm00ZHYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm00ZkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtNGZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm00ZgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtNGYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm00ZnZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTRmdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTRmdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtNGZ2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtNGk2NE5WCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm00aTY0TlYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm00aTY0dk5WCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm00aTY0dk5WKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtNGlFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTRpRVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtNGkJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTRpKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtNGl2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm00aXZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm00aXYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTRpdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTR1aTY0TlYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTR1aTY0TlYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm00dWk2NHZOVgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtNHVpNjR2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm00dWlFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTR1aUVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTR1aQkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtNHVpKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtNHVpdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtNHVpdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybTR1aXYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybTR1aXYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyZHZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDJkdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJkdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4MmR2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4MmZ2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXgyZnZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyZnYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDJmdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4M2R2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXgyeDNkdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4M2R2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXgyeDNkdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4M2Z2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXgyeDNmdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4M2Z2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXgyeDNmdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4NGR2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXgyeDRkdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4NGR2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXgyeDRkdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4NGZ2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXgyeDRmdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4NGZ2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXgyeDRmdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDNkdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4M2R2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M2R2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZHYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZnZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDNmdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDNmdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4M2Z2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M3gyZHZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDN4MmR2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M3gyZHYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDN4MmR2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M3gyZnZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDN4MmZ2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M3gyZnYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDN4MmZ2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M3g0ZHZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDN4NGR2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M3g0ZHYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDN4NGR2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M3g0ZnZFWFQJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDN4NGZ2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M3g0ZnYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDN4NGZ2KQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4NGR2RVhUCQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXg0ZHZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0ZHYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybU1hdHJpeDRkdikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDRmdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4NGZ2RVhUKQorI2RlZmluZSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4NGZ2CQlNQU5HTEUoUHJvZ3JhbVVuaWZvcm1NYXRyaXg0ZnYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDJkdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4NHgyZHZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDJkdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4NHgyZHYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDJmdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4NHgyZnZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDJmdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4NHgyZnYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDNkdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4NHgzZHZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDNkdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4NHgzZHYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDNmdkVYVAkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4NHgzZnZFWFQpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDNmdgkJTUFOR0xFKFByb2dyYW1Vbmlmb3JtTWF0cml4NHgzZnYpCisjZGVmaW5lIGdsUHJvZ3JhbVVuaWZvcm11aTY0TlYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybXVpNjROVikKKyNkZWZpbmUgZ2xQcm9ncmFtVW5pZm9ybXVpNjR2TlYJCU1BTkdMRShQcm9ncmFtVW5pZm9ybXVpNjR2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbVZlcnRleExpbWl0TlYJCU1BTkdMRShQcm9ncmFtVmVydGV4TGltaXROVikKKyNkZWZpbmUgZ2xQcm92b2tpbmdWZXJ0ZXhFWFQJCU1BTkdMRShQcm92b2tpbmdWZXJ0ZXhFWFQpCisjZGVmaW5lIGdsUHJvdm9raW5nVmVydGV4CQlNQU5HTEUoUHJvdm9raW5nVmVydGV4KQorI2RlZmluZSBnbFB1c2hBdHRyaWIJCU1BTkdMRShQdXNoQXR0cmliKQorI2RlZmluZSBnbFB1c2hDbGllbnRBdHRyaWJEZWZhdWx0RVhUCQlNQU5HTEUoUHVzaENsaWVudEF0dHJpYkRlZmF1bHRFWFQpCisjZGVmaW5lIGdsUHVzaENsaWVudEF0dHJpYgkJTUFOR0xFKFB1c2hDbGllbnRBdHRyaWIpCisjZGVmaW5lIGdsUHVzaE1hdHJpeAkJTUFOR0xFKFB1c2hNYXRyaXgpCisjZGVmaW5lIGdsUHVzaE5hbWUJCU1BTkdMRShQdXNoTmFtZSkKKyNkZWZpbmUgZ2xRdWVyeUNvdW50ZXIJCU1BTkdMRShRdWVyeUNvdW50ZXIpCisjZGVmaW5lIGdsUmFzdGVyUG9zMmQJCU1BTkdMRShSYXN0ZXJQb3MyZCkKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MyZHYJCU1BTkdMRShSYXN0ZXJQb3MyZHYpCisjZGVmaW5lIGdsUmFzdGVyUG9zMmYJCU1BTkdMRShSYXN0ZXJQb3MyZikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MyZnYJCU1BTkdMRShSYXN0ZXJQb3MyZnYpCisjZGVmaW5lIGdsUmFzdGVyUG9zMmkJCU1BTkdMRShSYXN0ZXJQb3MyaSkKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MyaXYJCU1BTkdMRShSYXN0ZXJQb3MyaXYpCisjZGVmaW5lIGdsUmFzdGVyUG9zMnMJCU1BTkdMRShSYXN0ZXJQb3MycykKKyNkZWZpbmUgZ2xSYXN0ZXJQb3Myc3YJCU1BTkdMRShSYXN0ZXJQb3Myc3YpCisjZGVmaW5lIGdsUmFzdGVyUG9zM2QJCU1BTkdMRShSYXN0ZXJQb3MzZCkKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MzZHYJCU1BTkdMRShSYXN0ZXJQb3MzZHYpCisjZGVmaW5lIGdsUmFzdGVyUG9zM2YJCU1BTkdMRShSYXN0ZXJQb3MzZikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MzZnYJCU1BTkdMRShSYXN0ZXJQb3MzZnYpCisjZGVmaW5lIGdsUmFzdGVyUG9zM2kJCU1BTkdMRShSYXN0ZXJQb3MzaSkKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MzaXYJCU1BTkdMRShSYXN0ZXJQb3MzaXYpCisjZGVmaW5lIGdsUmFzdGVyUG9zM3MJCU1BTkdMRShSYXN0ZXJQb3MzcykKKyNkZWZpbmUgZ2xSYXN0ZXJQb3Mzc3YJCU1BTkdMRShSYXN0ZXJQb3Mzc3YpCisjZGVmaW5lIGdsUmFzdGVyUG9zNGQJCU1BTkdMRShSYXN0ZXJQb3M0ZCkKKyNkZWZpbmUgZ2xSYXN0ZXJQb3M0ZHYJCU1BTkdMRShSYXN0ZXJQb3M0ZHYpCisjZGVmaW5lIGdsUmFzdGVyUG9zNGYJCU1BTkdMRShSYXN0ZXJQb3M0ZikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3M0ZnYJCU1BTkdMRShSYXN0ZXJQb3M0ZnYpCisjZGVmaW5lIGdsUmFzdGVyUG9zNGkJCU1BTkdMRShSYXN0ZXJQb3M0aSkKKyNkZWZpbmUgZ2xSYXN0ZXJQb3M0aXYJCU1BTkdMRShSYXN0ZXJQb3M0aXYpCisjZGVmaW5lIGdsUmFzdGVyUG9zNHMJCU1BTkdMRShSYXN0ZXJQb3M0cykKKyNkZWZpbmUgZ2xSYXN0ZXJQb3M0c3YJCU1BTkdMRShSYXN0ZXJQb3M0c3YpCisjZGVmaW5lIGdsUmVhZEJ1ZmZlcgkJTUFOR0xFKFJlYWRCdWZmZXIpCisjZGVmaW5lIGdsUmVhZEluc3RydW1lbnRzU0dJWAkJTUFOR0xFKFJlYWRJbnN0cnVtZW50c1NHSVgpCisjZGVmaW5lIGdsUmVhZG5QaXhlbHNBUkIJCU1BTkdMRShSZWFkblBpeGVsc0FSQikKKyNkZWZpbmUgZ2xSZWFkUGl4ZWxzCQlNQU5HTEUoUmVhZFBpeGVscykKKyNkZWZpbmUgZ2xSZWN0ZAkJTUFOR0xFKFJlY3RkKQorI2RlZmluZSBnbFJlY3RkdgkJTUFOR0xFKFJlY3RkdikKKyNkZWZpbmUgZ2xSZWN0ZgkJTUFOR0xFKFJlY3RmKQorI2RlZmluZSBnbFJlY3RmdgkJTUFOR0xFKFJlY3RmdikKKyNkZWZpbmUgZ2xSZWN0aQkJTUFOR0xFKFJlY3RpKQorI2RlZmluZSBnbFJlY3RpdgkJTUFOR0xFKFJlY3RpdikKKyNkZWZpbmUgZ2xSZWN0cwkJTUFOR0xFKFJlY3RzKQorI2RlZmluZSBnbFJlY3RzdgkJTUFOR0xFKFJlY3RzdikKKyNkZWZpbmUgZ2xSZWZlcmVuY2VQbGFuZVNHSVgJCU1BTkdMRShSZWZlcmVuY2VQbGFuZVNHSVgpCisjZGVmaW5lIGdsUmVsZWFzZVNoYWRlckNvbXBpbGVyCQlNQU5HTEUoUmVsZWFzZVNoYWRlckNvbXBpbGVyKQorI2RlZmluZSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VFWFQJCU1BTkdMRShSZW5kZXJidWZmZXJTdG9yYWdlRVhUKQorI2RlZmluZSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UJCU1BTkdMRShSZW5kZXJidWZmZXJTdG9yYWdlKQorI2RlZmluZSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUNvdmVyYWdlTlYJCU1BTkdMRShSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVDb3ZlcmFnZU5WKQorI2RlZmluZSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVAkJTUFOR0xFKFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVCkKKyNkZWZpbmUgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUJCU1BTkdMRShSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUpCisjZGVmaW5lIGdsUmVuZGVyTW9kZQkJTUFOR0xFKFJlbmRlck1vZGUpCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RlUG9pbnRlclNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZVBvaW50ZXJTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldWJTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1YlNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1YnZTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1YnZTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldWlDb2xvcjNmVmVydGV4M2ZTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1aUNvbG9yM2ZWZXJ0ZXgzZlNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1aUNvbG9yM2ZWZXJ0ZXgzZnZTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1aUNvbG9yM2ZWZXJ0ZXgzZnZTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldWlDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZlNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVpQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2ZTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldWlDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1aUNvbG9yNGZOb3JtYWwzZlZlcnRleDNmdlNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1aUNvbG9yNHViVmVydGV4M2ZTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1aUNvbG9yNHViVmVydGV4M2ZTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldWlDb2xvcjR1YlZlcnRleDNmdlNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVpQ29sb3I0dWJWZXJ0ZXgzZnZTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldWlOb3JtYWwzZlZlcnRleDNmU1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldWlOb3JtYWwzZlZlcnRleDNmU1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVpTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1aU5vcm1hbDNmVmVydGV4M2Z2U1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVpU1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldWlTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldWlUZXhDb29yZDJmQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2ZTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1aVRleENvb3JkMmZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZlNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1aVRleENvb3JkMmZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1aVRleENvb3JkMmZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldWlUZXhDb29yZDJmTm9ybWFsM2ZWZXJ0ZXgzZlNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZk5vcm1hbDNmVmVydGV4M2ZTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldWlUZXhDb29yZDJmTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1aVRleENvb3JkMmZOb3JtYWwzZlZlcnRleDNmdlNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1aVRleENvb3JkMmZWZXJ0ZXgzZlNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZlZlcnRleDNmU1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZlZlcnRleDNmdlNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZlZlcnRleDNmdlNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1aVZlcnRleDNmU1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldWlWZXJ0ZXgzZlNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1aVZlcnRleDNmdlNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVpVmVydGV4M2Z2U1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVpdlNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVpdlNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1c1NVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVzU1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVzdlNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVzdlNVTikKKyNkZWZpbmUgZ2xSZXF1ZXN0UmVzaWRlbnRQcm9ncmFtc05WCQlNQU5HTEUoUmVxdWVzdFJlc2lkZW50UHJvZ3JhbXNOVikKKyNkZWZpbmUgZ2xSZXNldEhpc3RvZ3JhbUVYVAkJTUFOR0xFKFJlc2V0SGlzdG9ncmFtRVhUKQorI2RlZmluZSBnbFJlc2V0SGlzdG9ncmFtCQlNQU5HTEUoUmVzZXRIaXN0b2dyYW0pCisjZGVmaW5lIGdsUmVzZXRNaW5tYXhFWFQJCU1BTkdMRShSZXNldE1pbm1heEVYVCkKKyNkZWZpbmUgZ2xSZXNldE1pbm1heAkJTUFOR0xFKFJlc2V0TWlubWF4KQorI2RlZmluZSBnbFJlc2l6ZUJ1ZmZlcnNNRVNBCQlNQU5HTEUoUmVzaXplQnVmZmVyc01FU0EpCisjZGVmaW5lIGdsUmVzdW1lVHJhbnNmb3JtRmVlZGJhY2sJCU1BTkdMRShSZXN1bWVUcmFuc2Zvcm1GZWVkYmFjaykKKyNkZWZpbmUgZ2xSZXN1bWVUcmFuc2Zvcm1GZWVkYmFja05WCQlNQU5HTEUoUmVzdW1lVHJhbnNmb3JtRmVlZGJhY2tOVikKKyNkZWZpbmUgZ2xSb3RhdGVkCQlNQU5HTEUoUm90YXRlZCkKKyNkZWZpbmUgZ2xSb3RhdGVmCQlNQU5HTEUoUm90YXRlZikKKyNkZWZpbmUgZ2xTYW1wbGVDb3ZlcmFnZUFSQgkJTUFOR0xFKFNhbXBsZUNvdmVyYWdlQVJCKQorI2RlZmluZSBnbFNhbXBsZUNvdmVyYWdlCQlNQU5HTEUoU2FtcGxlQ292ZXJhZ2UpCisjZGVmaW5lIGdsU2FtcGxlTWFwQVRJCQlNQU5HTEUoU2FtcGxlTWFwQVRJKQorI2RlZmluZSBnbFNhbXBsZU1hc2tFWFQJCU1BTkdMRShTYW1wbGVNYXNrRVhUKQorI2RlZmluZSBnbFNhbXBsZU1hc2tpCQlNQU5HTEUoU2FtcGxlTWFza2kpCisjZGVmaW5lIGdsU2FtcGxlTWFza0luZGV4ZWROVgkJTUFOR0xFKFNhbXBsZU1hc2tJbmRleGVkTlYpCisjZGVmaW5lIGdsU2FtcGxlTWFza1NHSVMJCU1BTkdMRShTYW1wbGVNYXNrU0dJUykKKyNkZWZpbmUgZ2xTYW1wbGVQYXR0ZXJuRVhUCQlNQU5HTEUoU2FtcGxlUGF0dGVybkVYVCkKKyNkZWZpbmUgZ2xTYW1wbGVQYXR0ZXJuU0dJUwkJTUFOR0xFKFNhbXBsZVBhdHRlcm5TR0lTKQorI2RlZmluZSBnbFNhbXBsZXJQYXJhbWV0ZXJmCQlNQU5HTEUoU2FtcGxlclBhcmFtZXRlcmYpCisjZGVmaW5lIGdsU2FtcGxlclBhcmFtZXRlcmZ2CQlNQU5HTEUoU2FtcGxlclBhcmFtZXRlcmZ2KQorI2RlZmluZSBnbFNhbXBsZXJQYXJhbWV0ZXJJaXYJCU1BTkdMRShTYW1wbGVyUGFyYW1ldGVySWl2KQorI2RlZmluZSBnbFNhbXBsZXJQYXJhbWV0ZXJpCQlNQU5HTEUoU2FtcGxlclBhcmFtZXRlcmkpCisjZGVmaW5lIGdsU2FtcGxlclBhcmFtZXRlckl1aXYJCU1BTkdMRShTYW1wbGVyUGFyYW1ldGVySXVpdikKKyNkZWZpbmUgZ2xTYW1wbGVyUGFyYW1ldGVyaXYJCU1BTkdMRShTYW1wbGVyUGFyYW1ldGVyaXYpCisjZGVmaW5lIGdsU2NhbGVkCQlNQU5HTEUoU2NhbGVkKQorI2RlZmluZSBnbFNjYWxlZgkJTUFOR0xFKFNjYWxlZikKKyNkZWZpbmUgZ2xTY2lzc29yQXJyYXl2CQlNQU5HTEUoU2Npc3NvckFycmF5dikKKyNkZWZpbmUgZ2xTY2lzc29ySW5kZXhlZAkJTUFOR0xFKFNjaXNzb3JJbmRleGVkKQorI2RlZmluZSBnbFNjaXNzb3JJbmRleGVkdgkJTUFOR0xFKFNjaXNzb3JJbmRleGVkdikKKyNkZWZpbmUgZ2xTY2lzc29yCQlNQU5HTEUoU2Npc3NvcikKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNiRVhUCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzYkVYVCkKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNiCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzYikKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNidkVYVAkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM2J2RVhUKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM2J2CQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzYnYpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzZEVYVAkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM2RFWFQpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzZAkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM2QpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzZHZFWFQJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNkdkVYVCkKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNkdgkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM2R2KQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM2ZFWFQJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNmRVhUKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM2YJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNmKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM2Z2RVhUCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzZnZFWFQpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzZnYJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNmdikKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNoTlYJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNoTlYpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzaHZOVgkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM2h2TlYpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzaUVYVAkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM2lFWFQpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzaQkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM2kpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzaXZFWFQJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNpdkVYVCkKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNpdgkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM2l2KQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM3NFWFQJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNzRVhUKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM3MJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNzKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM3N2RVhUCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3Izc3ZFWFQpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3Izc3YJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNzdikKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjN1YkVYVAkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM3ViRVhUKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM3ViCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzdWIpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzdWJ2RVhUCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzdWJ2RVhUKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM3VidgkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM3VidikKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjN1aUVYVAkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM3VpRVhUKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM3VpCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzdWkpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzdWl2RVhUCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzdWl2RVhUKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM3VpdgkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM3VpdikKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjN1c0VYVAkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM3VzRVhUKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM3VzCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzdXMpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzdXN2RVhUCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzdXN2RVhUKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM3VzdgkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM3VzdikKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvckZvcm1hdE5WCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3JGb3JtYXROVikKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvclAzdWkJCU1BTkdMRShTZWNvbmRhcnlDb2xvclAzdWkpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3JQM3VpdgkJTUFOR0xFKFNlY29uZGFyeUNvbG9yUDN1aXYpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3JQb2ludGVyRVhUCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3JQb2ludGVyRVhUKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yUG9pbnRlckxpc3RJQk0JCU1BTkdMRShTZWNvbmRhcnlDb2xvclBvaW50ZXJMaXN0SUJNKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yUG9pbnRlcgkJTUFOR0xFKFNlY29uZGFyeUNvbG9yUG9pbnRlcikKKyNkZWZpbmUgZ2xTZWxlY3RCdWZmZXIJCU1BTkdMRShTZWxlY3RCdWZmZXIpCisjZGVmaW5lIGdsU2VsZWN0UGVyZk1vbml0b3JDb3VudGVyc0FNRAkJTUFOR0xFKFNlbGVjdFBlcmZNb25pdG9yQ291bnRlcnNBTUQpCisjZGVmaW5lIGdsU2VwYXJhYmxlRmlsdGVyMkRFWFQJCU1BTkdMRShTZXBhcmFibGVGaWx0ZXIyREVYVCkKKyNkZWZpbmUgZ2xTZXBhcmFibGVGaWx0ZXIyRAkJTUFOR0xFKFNlcGFyYWJsZUZpbHRlcjJEKQorI2RlZmluZSBnbFNldEZlbmNlQVBQTEUJCU1BTkdMRShTZXRGZW5jZUFQUExFKQorI2RlZmluZSBnbFNldEZlbmNlTlYJCU1BTkdMRShTZXRGZW5jZU5WKQorI2RlZmluZSBnbFNldEZyYWdtZW50U2hhZGVyQ29uc3RhbnRBVEkJCU1BTkdMRShTZXRGcmFnbWVudFNoYWRlckNvbnN0YW50QVRJKQorI2RlZmluZSBnbFNldEludmFyaWFudEVYVAkJTUFOR0xFKFNldEludmFyaWFudEVYVCkKKyNkZWZpbmUgZ2xTZXRMb2NhbENvbnN0YW50RVhUCQlNQU5HTEUoU2V0TG9jYWxDb25zdGFudEVYVCkKKyNkZWZpbmUgZ2xTaGFkZU1vZGVsCQlNQU5HTEUoU2hhZGVNb2RlbCkKKyNkZWZpbmUgZ2xTaGFkZXJCaW5hcnkJCU1BTkdMRShTaGFkZXJCaW5hcnkpCisjZGVmaW5lIGdsU2hhZGVyT3AxRVhUCQlNQU5HTEUoU2hhZGVyT3AxRVhUKQorI2RlZmluZSBnbFNoYWRlck9wMkVYVAkJTUFOR0xFKFNoYWRlck9wMkVYVCkKKyNkZWZpbmUgZ2xTaGFkZXJPcDNFWFQJCU1BTkdMRShTaGFkZXJPcDNFWFQpCisjZGVmaW5lIGdsU2hhZGVyU291cmNlQVJCCQlNQU5HTEUoU2hhZGVyU291cmNlQVJCKQorI2RlZmluZSBnbFNoYWRlclNvdXJjZQkJTUFOR0xFKFNoYWRlclNvdXJjZSkKKyNkZWZpbmUgZ2xTaGFycGVuVGV4RnVuY1NHSVMJCU1BTkdMRShTaGFycGVuVGV4RnVuY1NHSVMpCisjZGVmaW5lIGdsU3ByaXRlUGFyYW1ldGVyZlNHSVgJCU1BTkdMRShTcHJpdGVQYXJhbWV0ZXJmU0dJWCkKKyNkZWZpbmUgZ2xTcHJpdGVQYXJhbWV0ZXJmdlNHSVgJCU1BTkdMRShTcHJpdGVQYXJhbWV0ZXJmdlNHSVgpCisjZGVmaW5lIGdsU3ByaXRlUGFyYW1ldGVyaVNHSVgJCU1BTkdMRShTcHJpdGVQYXJhbWV0ZXJpU0dJWCkKKyNkZWZpbmUgZ2xTcHJpdGVQYXJhbWV0ZXJpdlNHSVgJCU1BTkdMRShTcHJpdGVQYXJhbWV0ZXJpdlNHSVgpCisjZGVmaW5lIGdsU3RhcnRJbnN0cnVtZW50c1NHSVgJCU1BTkdMRShTdGFydEluc3RydW1lbnRzU0dJWCkKKyNkZWZpbmUgZ2xTdGVuY2lsQ2xlYXJUYWdFWFQJCU1BTkdMRShTdGVuY2lsQ2xlYXJUYWdFWFQpCisjZGVmaW5lIGdsU3RlbmNpbEZ1bmMJCU1BTkdMRShTdGVuY2lsRnVuYykKKyNkZWZpbmUgZ2xTdGVuY2lsRnVuY1NlcGFyYXRlQVRJCQlNQU5HTEUoU3RlbmNpbEZ1bmNTZXBhcmF0ZUFUSSkKKyNkZWZpbmUgZ2xTdGVuY2lsRnVuY1NlcGFyYXRlCQlNQU5HTEUoU3RlbmNpbEZ1bmNTZXBhcmF0ZSkKKyNkZWZpbmUgZ2xTdGVuY2lsTWFzawkJTUFOR0xFKFN0ZW5jaWxNYXNrKQorI2RlZmluZSBnbFN0ZW5jaWxNYXNrU2VwYXJhdGUJCU1BTkdMRShTdGVuY2lsTWFza1NlcGFyYXRlKQorI2RlZmluZSBnbFN0ZW5jaWxPcAkJTUFOR0xFKFN0ZW5jaWxPcCkKKyNkZWZpbmUgZ2xTdGVuY2lsT3BTZXBhcmF0ZUFUSQkJTUFOR0xFKFN0ZW5jaWxPcFNlcGFyYXRlQVRJKQorI2RlZmluZSBnbFN0ZW5jaWxPcFNlcGFyYXRlCQlNQU5HTEUoU3RlbmNpbE9wU2VwYXJhdGUpCisjZGVmaW5lIGdsU3RvcEluc3RydW1lbnRzU0dJWAkJTUFOR0xFKFN0b3BJbnN0cnVtZW50c1NHSVgpCisjZGVmaW5lIGdsU3RyaW5nTWFya2VyR1JFTUVEWQkJTUFOR0xFKFN0cmluZ01hcmtlckdSRU1FRFkpCisjZGVmaW5lIGdsU3dpenpsZUVYVAkJTUFOR0xFKFN3aXp6bGVFWFQpCisjZGVmaW5lIGdsVGFnU2FtcGxlQnVmZmVyU0dJWAkJTUFOR0xFKFRhZ1NhbXBsZUJ1ZmZlclNHSVgpCisjZGVmaW5lIGdsVGFuZ2VudDNiRVhUCQlNQU5HTEUoVGFuZ2VudDNiRVhUKQorI2RlZmluZSBnbFRhbmdlbnQzYnZFWFQJCU1BTkdMRShUYW5nZW50M2J2RVhUKQorI2RlZmluZSBnbFRhbmdlbnQzZEVYVAkJTUFOR0xFKFRhbmdlbnQzZEVYVCkKKyNkZWZpbmUgZ2xUYW5nZW50M2R2RVhUCQlNQU5HTEUoVGFuZ2VudDNkdkVYVCkKKyNkZWZpbmUgZ2xUYW5nZW50M2ZFWFQJCU1BTkdMRShUYW5nZW50M2ZFWFQpCisjZGVmaW5lIGdsVGFuZ2VudDNmdkVYVAkJTUFOR0xFKFRhbmdlbnQzZnZFWFQpCisjZGVmaW5lIGdsVGFuZ2VudDNpRVhUCQlNQU5HTEUoVGFuZ2VudDNpRVhUKQorI2RlZmluZSBnbFRhbmdlbnQzaXZFWFQJCU1BTkdMRShUYW5nZW50M2l2RVhUKQorI2RlZmluZSBnbFRhbmdlbnQzc0VYVAkJTUFOR0xFKFRhbmdlbnQzc0VYVCkKKyNkZWZpbmUgZ2xUYW5nZW50M3N2RVhUCQlNQU5HTEUoVGFuZ2VudDNzdkVYVCkKKyNkZWZpbmUgZ2xUYW5nZW50UG9pbnRlckVYVAkJTUFOR0xFKFRhbmdlbnRQb2ludGVyRVhUKQorI2RlZmluZSBnbFRidWZmZXJNYXNrM0RGWAkJTUFOR0xFKFRidWZmZXJNYXNrM0RGWCkKKyNkZWZpbmUgZ2xUZXNzZWxsYXRpb25GYWN0b3JBTUQJCU1BTkdMRShUZXNzZWxsYXRpb25GYWN0b3JBTUQpCisjZGVmaW5lIGdsVGVzc2VsbGF0aW9uTW9kZUFNRAkJTUFOR0xFKFRlc3NlbGxhdGlvbk1vZGVBTUQpCisjZGVmaW5lIGdsVGVzdEZlbmNlQVBQTEUJCU1BTkdMRShUZXN0RmVuY2VBUFBMRSkKKyNkZWZpbmUgZ2xUZXN0RmVuY2VOVgkJTUFOR0xFKFRlc3RGZW5jZU5WKQorI2RlZmluZSBnbFRlc3RPYmplY3RBUFBMRQkJTUFOR0xFKFRlc3RPYmplY3RBUFBMRSkKKyNkZWZpbmUgZ2xUZXhCdWZmZXJBUkIJCU1BTkdMRShUZXhCdWZmZXJBUkIpCisjZGVmaW5lIGdsVGV4QnVmZmVyRVhUCQlNQU5HTEUoVGV4QnVmZmVyRVhUKQorI2RlZmluZSBnbFRleEJ1ZmZlcgkJTUFOR0xFKFRleEJ1ZmZlcikKKyNkZWZpbmUgZ2xUZXhCdW1wUGFyYW1ldGVyZnZBVEkJCU1BTkdMRShUZXhCdW1wUGFyYW1ldGVyZnZBVEkpCisjZGVmaW5lIGdsVGV4QnVtcFBhcmFtZXRlcml2QVRJCQlNQU5HTEUoVGV4QnVtcFBhcmFtZXRlcml2QVRJKQorI2RlZmluZSBnbFRleENvb3JkMWQJCU1BTkdMRShUZXhDb29yZDFkKQorI2RlZmluZSBnbFRleENvb3JkMWR2CQlNQU5HTEUoVGV4Q29vcmQxZHYpCisjZGVmaW5lIGdsVGV4Q29vcmQxZgkJTUFOR0xFKFRleENvb3JkMWYpCisjZGVmaW5lIGdsVGV4Q29vcmQxZnYJCU1BTkdMRShUZXhDb29yZDFmdikKKyNkZWZpbmUgZ2xUZXhDb29yZDFoTlYJCU1BTkdMRShUZXhDb29yZDFoTlYpCisjZGVmaW5lIGdsVGV4Q29vcmQxaHZOVgkJTUFOR0xFKFRleENvb3JkMWh2TlYpCisjZGVmaW5lIGdsVGV4Q29vcmQxaQkJTUFOR0xFKFRleENvb3JkMWkpCisjZGVmaW5lIGdsVGV4Q29vcmQxaXYJCU1BTkdMRShUZXhDb29yZDFpdikKKyNkZWZpbmUgZ2xUZXhDb29yZDFzCQlNQU5HTEUoVGV4Q29vcmQxcykKKyNkZWZpbmUgZ2xUZXhDb29yZDFzdgkJTUFOR0xFKFRleENvb3JkMXN2KQorI2RlZmluZSBnbFRleENvb3JkMmQJCU1BTkdMRShUZXhDb29yZDJkKQorI2RlZmluZSBnbFRleENvb3JkMmR2CQlNQU5HTEUoVGV4Q29vcmQyZHYpCisjZGVmaW5lIGdsVGV4Q29vcmQyZkNvbG9yM2ZWZXJ0ZXgzZlNVTgkJTUFOR0xFKFRleENvb3JkMmZDb2xvcjNmVmVydGV4M2ZTVU4pCisjZGVmaW5lIGdsVGV4Q29vcmQyZkNvbG9yM2ZWZXJ0ZXgzZnZTVU4JCU1BTkdMRShUZXhDb29yZDJmQ29sb3IzZlZlcnRleDNmdlNVTikKKyNkZWZpbmUgZ2xUZXhDb29yZDJmQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2ZTVU4JCU1BTkdMRShUZXhDb29yZDJmQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2ZTVU4pCisjZGVmaW5lIGdsVGV4Q29vcmQyZkNvbG9yNGZOb3JtYWwzZlZlcnRleDNmdlNVTgkJTUFOR0xFKFRleENvb3JkMmZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4pCisjZGVmaW5lIGdsVGV4Q29vcmQyZkNvbG9yNHViVmVydGV4M2ZTVU4JCU1BTkdMRShUZXhDb29yZDJmQ29sb3I0dWJWZXJ0ZXgzZlNVTikKKyNkZWZpbmUgZ2xUZXhDb29yZDJmQ29sb3I0dWJWZXJ0ZXgzZnZTVU4JCU1BTkdMRShUZXhDb29yZDJmQ29sb3I0dWJWZXJ0ZXgzZnZTVU4pCisjZGVmaW5lIGdsVGV4Q29vcmQyZgkJTUFOR0xFKFRleENvb3JkMmYpCisjZGVmaW5lIGdsVGV4Q29vcmQyZk5vcm1hbDNmVmVydGV4M2ZTVU4JCU1BTkdMRShUZXhDb29yZDJmTm9ybWFsM2ZWZXJ0ZXgzZlNVTikKKyNkZWZpbmUgZ2xUZXhDb29yZDJmTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4JCU1BTkdMRShUZXhDb29yZDJmTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4pCisjZGVmaW5lIGdsVGV4Q29vcmQyZlZlcnRleDNmU1VOCQlNQU5HTEUoVGV4Q29vcmQyZlZlcnRleDNmU1VOKQorI2RlZmluZSBnbFRleENvb3JkMmZWZXJ0ZXgzZnZTVU4JCU1BTkdMRShUZXhDb29yZDJmVmVydGV4M2Z2U1VOKQorI2RlZmluZSBnbFRleENvb3JkMmZ2CQlNQU5HTEUoVGV4Q29vcmQyZnYpCisjZGVmaW5lIGdsVGV4Q29vcmQyaE5WCQlNQU5HTEUoVGV4Q29vcmQyaE5WKQorI2RlZmluZSBnbFRleENvb3JkMmh2TlYJCU1BTkdMRShUZXhDb29yZDJodk5WKQorI2RlZmluZSBnbFRleENvb3JkMmkJCU1BTkdMRShUZXhDb29yZDJpKQorI2RlZmluZSBnbFRleENvb3JkMml2CQlNQU5HTEUoVGV4Q29vcmQyaXYpCisjZGVmaW5lIGdsVGV4Q29vcmQycwkJTUFOR0xFKFRleENvb3JkMnMpCisjZGVmaW5lIGdsVGV4Q29vcmQyc3YJCU1BTkdMRShUZXhDb29yZDJzdikKKyNkZWZpbmUgZ2xUZXhDb29yZDNkCQlNQU5HTEUoVGV4Q29vcmQzZCkKKyNkZWZpbmUgZ2xUZXhDb29yZDNkdgkJTUFOR0xFKFRleENvb3JkM2R2KQorI2RlZmluZSBnbFRleENvb3JkM2YJCU1BTkdMRShUZXhDb29yZDNmKQorI2RlZmluZSBnbFRleENvb3JkM2Z2CQlNQU5HTEUoVGV4Q29vcmQzZnYpCisjZGVmaW5lIGdsVGV4Q29vcmQzaE5WCQlNQU5HTEUoVGV4Q29vcmQzaE5WKQorI2RlZmluZSBnbFRleENvb3JkM2h2TlYJCU1BTkdMRShUZXhDb29yZDNodk5WKQorI2RlZmluZSBnbFRleENvb3JkM2kJCU1BTkdMRShUZXhDb29yZDNpKQorI2RlZmluZSBnbFRleENvb3JkM2l2CQlNQU5HTEUoVGV4Q29vcmQzaXYpCisjZGVmaW5lIGdsVGV4Q29vcmQzcwkJTUFOR0xFKFRleENvb3JkM3MpCisjZGVmaW5lIGdsVGV4Q29vcmQzc3YJCU1BTkdMRShUZXhDb29yZDNzdikKKyNkZWZpbmUgZ2xUZXhDb29yZDRkCQlNQU5HTEUoVGV4Q29vcmQ0ZCkKKyNkZWZpbmUgZ2xUZXhDb29yZDRkdgkJTUFOR0xFKFRleENvb3JkNGR2KQorI2RlZmluZSBnbFRleENvb3JkNGZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXg0ZlNVTgkJTUFOR0xFKFRleENvb3JkNGZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXg0ZlNVTikKKyNkZWZpbmUgZ2xUZXhDb29yZDRmQ29sb3I0Zk5vcm1hbDNmVmVydGV4NGZ2U1VOCQlNQU5HTEUoVGV4Q29vcmQ0ZkNvbG9yNGZOb3JtYWwzZlZlcnRleDRmdlNVTikKKyNkZWZpbmUgZ2xUZXhDb29yZDRmCQlNQU5HTEUoVGV4Q29vcmQ0ZikKKyNkZWZpbmUgZ2xUZXhDb29yZDRmVmVydGV4NGZTVU4JCU1BTkdMRShUZXhDb29yZDRmVmVydGV4NGZTVU4pCisjZGVmaW5lIGdsVGV4Q29vcmQ0ZlZlcnRleDRmdlNVTgkJTUFOR0xFKFRleENvb3JkNGZWZXJ0ZXg0ZnZTVU4pCisjZGVmaW5lIGdsVGV4Q29vcmQ0ZnYJCU1BTkdMRShUZXhDb29yZDRmdikKKyNkZWZpbmUgZ2xUZXhDb29yZDRoTlYJCU1BTkdMRShUZXhDb29yZDRoTlYpCisjZGVmaW5lIGdsVGV4Q29vcmQ0aHZOVgkJTUFOR0xFKFRleENvb3JkNGh2TlYpCisjZGVmaW5lIGdsVGV4Q29vcmQ0aQkJTUFOR0xFKFRleENvb3JkNGkpCisjZGVmaW5lIGdsVGV4Q29vcmQ0aXYJCU1BTkdMRShUZXhDb29yZDRpdikKKyNkZWZpbmUgZ2xUZXhDb29yZDRzCQlNQU5HTEUoVGV4Q29vcmQ0cykKKyNkZWZpbmUgZ2xUZXhDb29yZDRzdgkJTUFOR0xFKFRleENvb3JkNHN2KQorI2RlZmluZSBnbFRleENvb3JkRm9ybWF0TlYJCU1BTkdMRShUZXhDb29yZEZvcm1hdE5WKQorI2RlZmluZSBnbFRleENvb3JkUDF1aQkJTUFOR0xFKFRleENvb3JkUDF1aSkKKyNkZWZpbmUgZ2xUZXhDb29yZFAxdWl2CQlNQU5HTEUoVGV4Q29vcmRQMXVpdikKKyNkZWZpbmUgZ2xUZXhDb29yZFAydWkJCU1BTkdMRShUZXhDb29yZFAydWkpCisjZGVmaW5lIGdsVGV4Q29vcmRQMnVpdgkJTUFOR0xFKFRleENvb3JkUDJ1aXYpCisjZGVmaW5lIGdsVGV4Q29vcmRQM3VpCQlNQU5HTEUoVGV4Q29vcmRQM3VpKQorI2RlZmluZSBnbFRleENvb3JkUDN1aXYJCU1BTkdMRShUZXhDb29yZFAzdWl2KQorI2RlZmluZSBnbFRleENvb3JkUDR1aQkJTUFOR0xFKFRleENvb3JkUDR1aSkKKyNkZWZpbmUgZ2xUZXhDb29yZFA0dWl2CQlNQU5HTEUoVGV4Q29vcmRQNHVpdikKKyNkZWZpbmUgZ2xUZXhDb29yZFBvaW50ZXJFWFQJCU1BTkdMRShUZXhDb29yZFBvaW50ZXJFWFQpCisjZGVmaW5lIGdsVGV4Q29vcmRQb2ludGVyTGlzdElCTQkJTUFOR0xFKFRleENvb3JkUG9pbnRlckxpc3RJQk0pCisjZGVmaW5lIGdsVGV4Q29vcmRQb2ludGVyCQlNQU5HTEUoVGV4Q29vcmRQb2ludGVyKQorI2RlZmluZSBnbFRleENvb3JkUG9pbnRlcnZJTlRFTAkJTUFOR0xFKFRleENvb3JkUG9pbnRlcnZJTlRFTCkKKyNkZWZpbmUgZ2xUZXhFbnZmCQlNQU5HTEUoVGV4RW52ZikKKyNkZWZpbmUgZ2xUZXhFbnZmdgkJTUFOR0xFKFRleEVudmZ2KQorI2RlZmluZSBnbFRleEVudmkJCU1BTkdMRShUZXhFbnZpKQorI2RlZmluZSBnbFRleEVudml2CQlNQU5HTEUoVGV4RW52aXYpCisjZGVmaW5lIGdsVGV4RmlsdGVyRnVuY1NHSVMJCU1BTkdMRShUZXhGaWx0ZXJGdW5jU0dJUykKKyNkZWZpbmUgZ2xUZXhHZW5kCQlNQU5HTEUoVGV4R2VuZCkKKyNkZWZpbmUgZ2xUZXhHZW5kdgkJTUFOR0xFKFRleEdlbmR2KQorI2RlZmluZSBnbFRleEdlbmYJCU1BTkdMRShUZXhHZW5mKQorI2RlZmluZSBnbFRleEdlbmZ2CQlNQU5HTEUoVGV4R2VuZnYpCisjZGVmaW5lIGdsVGV4R2VuaQkJTUFOR0xFKFRleEdlbmkpCisjZGVmaW5lIGdsVGV4R2VuaXYJCU1BTkdMRShUZXhHZW5pdikKKyNkZWZpbmUgZ2xUZXhJbWFnZTFECQlNQU5HTEUoVGV4SW1hZ2UxRCkKKyNkZWZpbmUgZ2xUZXhJbWFnZTJECQlNQU5HTEUoVGV4SW1hZ2UyRCkKKyNkZWZpbmUgZ2xUZXhJbWFnZTJETXVsdGlzYW1wbGUJCU1BTkdMRShUZXhJbWFnZTJETXVsdGlzYW1wbGUpCisjZGVmaW5lIGdsVGV4SW1hZ2UzREVYVAkJTUFOR0xFKFRleEltYWdlM0RFWFQpCisjZGVmaW5lIGdsVGV4SW1hZ2UzRAkJTUFOR0xFKFRleEltYWdlM0QpCisjZGVmaW5lIGdsVGV4SW1hZ2UzRE11bHRpc2FtcGxlCQlNQU5HTEUoVGV4SW1hZ2UzRE11bHRpc2FtcGxlKQorI2RlZmluZSBnbFRleEltYWdlNERTR0lTCQlNQU5HTEUoVGV4SW1hZ2U0RFNHSVMpCisjZGVmaW5lIGdsVGV4UGFyYW1ldGVyZgkJTUFOR0xFKFRleFBhcmFtZXRlcmYpCisjZGVmaW5lIGdsVGV4UGFyYW1ldGVyZnYJCU1BTkdMRShUZXhQYXJhbWV0ZXJmdikKKyNkZWZpbmUgZ2xUZXhQYXJhbWV0ZXJJaXZFWFQJCU1BTkdMRShUZXhQYXJhbWV0ZXJJaXZFWFQpCisjZGVmaW5lIGdsVGV4UGFyYW1ldGVySWl2CQlNQU5HTEUoVGV4UGFyYW1ldGVySWl2KQorI2RlZmluZSBnbFRleFBhcmFtZXRlcmkJCU1BTkdMRShUZXhQYXJhbWV0ZXJpKQorI2RlZmluZSBnbFRleFBhcmFtZXRlckl1aXZFWFQJCU1BTkdMRShUZXhQYXJhbWV0ZXJJdWl2RVhUKQorI2RlZmluZSBnbFRleFBhcmFtZXRlckl1aXYJCU1BTkdMRShUZXhQYXJhbWV0ZXJJdWl2KQorI2RlZmluZSBnbFRleFBhcmFtZXRlcml2CQlNQU5HTEUoVGV4UGFyYW1ldGVyaXYpCisjZGVmaW5lIGdsVGV4UmVuZGVyYnVmZmVyTlYJCU1BTkdMRShUZXhSZW5kZXJidWZmZXJOVikKKyNkZWZpbmUgZ2xUZXhTdWJJbWFnZTFERVhUCQlNQU5HTEUoVGV4U3ViSW1hZ2UxREVYVCkKKyNkZWZpbmUgZ2xUZXhTdWJJbWFnZTFECQlNQU5HTEUoVGV4U3ViSW1hZ2UxRCkKKyNkZWZpbmUgZ2xUZXhTdWJJbWFnZTJERVhUCQlNQU5HTEUoVGV4U3ViSW1hZ2UyREVYVCkKKyNkZWZpbmUgZ2xUZXhTdWJJbWFnZTJECQlNQU5HTEUoVGV4U3ViSW1hZ2UyRCkKKyNkZWZpbmUgZ2xUZXhTdWJJbWFnZTNERVhUCQlNQU5HTEUoVGV4U3ViSW1hZ2UzREVYVCkKKyNkZWZpbmUgZ2xUZXhTdWJJbWFnZTNECQlNQU5HTEUoVGV4U3ViSW1hZ2UzRCkKKyNkZWZpbmUgZ2xUZXhTdWJJbWFnZTREU0dJUwkJTUFOR0xFKFRleFN1YkltYWdlNERTR0lTKQorI2RlZmluZSBnbFRleHR1cmVCYXJyaWVyTlYJCU1BTkdMRShUZXh0dXJlQmFycmllck5WKQorI2RlZmluZSBnbFRleHR1cmVCdWZmZXJFWFQJCU1BTkdMRShUZXh0dXJlQnVmZmVyRVhUKQorI2RlZmluZSBnbFRleHR1cmVDb2xvck1hc2tTR0lTCQlNQU5HTEUoVGV4dHVyZUNvbG9yTWFza1NHSVMpCisjZGVmaW5lIGdsVGV4dHVyZUltYWdlMURFWFQJCU1BTkdMRShUZXh0dXJlSW1hZ2UxREVYVCkKKyNkZWZpbmUgZ2xUZXh0dXJlSW1hZ2UyREVYVAkJTUFOR0xFKFRleHR1cmVJbWFnZTJERVhUKQorI2RlZmluZSBnbFRleHR1cmVJbWFnZTNERVhUCQlNQU5HTEUoVGV4dHVyZUltYWdlM0RFWFQpCisjZGVmaW5lIGdsVGV4dHVyZUxpZ2h0RVhUCQlNQU5HTEUoVGV4dHVyZUxpZ2h0RVhUKQorI2RlZmluZSBnbFRleHR1cmVNYXRlcmlhbEVYVAkJTUFOR0xFKFRleHR1cmVNYXRlcmlhbEVYVCkKKyNkZWZpbmUgZ2xUZXh0dXJlTm9ybWFsRVhUCQlNQU5HTEUoVGV4dHVyZU5vcm1hbEVYVCkKKyNkZWZpbmUgZ2xUZXh0dXJlUGFyYW1ldGVyZkVYVAkJTUFOR0xFKFRleHR1cmVQYXJhbWV0ZXJmRVhUKQorI2RlZmluZSBnbFRleHR1cmVQYXJhbWV0ZXJmdkVYVAkJTUFOR0xFKFRleHR1cmVQYXJhbWV0ZXJmdkVYVCkKKyNkZWZpbmUgZ2xUZXh0dXJlUGFyYW1ldGVyaUVYVAkJTUFOR0xFKFRleHR1cmVQYXJhbWV0ZXJpRVhUKQorI2RlZmluZSBnbFRleHR1cmVQYXJhbWV0ZXJJaXZFWFQJCU1BTkdMRShUZXh0dXJlUGFyYW1ldGVySWl2RVhUKQorI2RlZmluZSBnbFRleHR1cmVQYXJhbWV0ZXJJdWl2RVhUCQlNQU5HTEUoVGV4dHVyZVBhcmFtZXRlckl1aXZFWFQpCisjZGVmaW5lIGdsVGV4dHVyZVBhcmFtZXRlcml2RVhUCQlNQU5HTEUoVGV4dHVyZVBhcmFtZXRlcml2RVhUKQorI2RlZmluZSBnbFRleHR1cmVSYW5nZUFQUExFCQlNQU5HTEUoVGV4dHVyZVJhbmdlQVBQTEUpCisjZGVmaW5lIGdsVGV4dHVyZVJlbmRlcmJ1ZmZlckVYVAkJTUFOR0xFKFRleHR1cmVSZW5kZXJidWZmZXJFWFQpCisjZGVmaW5lIGdsVGV4dHVyZVN1YkltYWdlMURFWFQJCU1BTkdMRShUZXh0dXJlU3ViSW1hZ2UxREVYVCkKKyNkZWZpbmUgZ2xUZXh0dXJlU3ViSW1hZ2UyREVYVAkJTUFOR0xFKFRleHR1cmVTdWJJbWFnZTJERVhUKQorI2RlZmluZSBnbFRleHR1cmVTdWJJbWFnZTNERVhUCQlNQU5HTEUoVGV4dHVyZVN1YkltYWdlM0RFWFQpCisjZGVmaW5lIGdsVHJhY2tNYXRyaXhOVgkJTUFOR0xFKFRyYWNrTWF0cml4TlYpCisjZGVmaW5lIGdsVHJhbnNmb3JtRmVlZGJhY2tBdHRyaWJzTlYJCU1BTkdMRShUcmFuc2Zvcm1GZWVkYmFja0F0dHJpYnNOVikKKyNkZWZpbmUgZ2xUcmFuc2Zvcm1GZWVkYmFja1N0cmVhbUF0dHJpYnNOVgkJTUFOR0xFKFRyYW5zZm9ybUZlZWRiYWNrU3RyZWFtQXR0cmlic05WKQorI2RlZmluZSBnbFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3NFWFQJCU1BTkdMRShUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdzRVhUKQorI2RlZmluZSBnbFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3MJCU1BTkdMRShUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdzKQorI2RlZmluZSBnbFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3NOVgkJTUFOR0xFKFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3NOVikKKyNkZWZpbmUgZ2xUcmFuc2xhdGVkCQlNQU5HTEUoVHJhbnNsYXRlZCkKKyNkZWZpbmUgZ2xUcmFuc2xhdGVmCQlNQU5HTEUoVHJhbnNsYXRlZikKKyNkZWZpbmUgZ2xVbmlmb3JtMWQJCU1BTkdMRShVbmlmb3JtMWQpCisjZGVmaW5lIGdsVW5pZm9ybTFkdgkJTUFOR0xFKFVuaWZvcm0xZHYpCisjZGVmaW5lIGdsVW5pZm9ybTFmQVJCCQlNQU5HTEUoVW5pZm9ybTFmQVJCKQorI2RlZmluZSBnbFVuaWZvcm0xZgkJTUFOR0xFKFVuaWZvcm0xZikKKyNkZWZpbmUgZ2xVbmlmb3JtMWZ2QVJCCQlNQU5HTEUoVW5pZm9ybTFmdkFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtMWZ2CQlNQU5HTEUoVW5pZm9ybTFmdikKKyNkZWZpbmUgZ2xVbmlmb3JtMWk2NE5WCQlNQU5HTEUoVW5pZm9ybTFpNjROVikKKyNkZWZpbmUgZ2xVbmlmb3JtMWk2NHZOVgkJTUFOR0xFKFVuaWZvcm0xaTY0dk5WKQorI2RlZmluZSBnbFVuaWZvcm0xaUFSQgkJTUFOR0xFKFVuaWZvcm0xaUFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtMWkJCU1BTkdMRShVbmlmb3JtMWkpCisjZGVmaW5lIGdsVW5pZm9ybTFpdkFSQgkJTUFOR0xFKFVuaWZvcm0xaXZBUkIpCisjZGVmaW5lIGdsVW5pZm9ybTFpdgkJTUFOR0xFKFVuaWZvcm0xaXYpCisjZGVmaW5lIGdsVW5pZm9ybTF1aTY0TlYJCU1BTkdMRShVbmlmb3JtMXVpNjROVikKKyNkZWZpbmUgZ2xVbmlmb3JtMXVpNjR2TlYJCU1BTkdMRShVbmlmb3JtMXVpNjR2TlYpCisjZGVmaW5lIGdsVW5pZm9ybTF1aUVYVAkJTUFOR0xFKFVuaWZvcm0xdWlFWFQpCisjZGVmaW5lIGdsVW5pZm9ybTF1aQkJTUFOR0xFKFVuaWZvcm0xdWkpCisjZGVmaW5lIGdsVW5pZm9ybTF1aXZFWFQJCU1BTkdMRShVbmlmb3JtMXVpdkVYVCkKKyNkZWZpbmUgZ2xVbmlmb3JtMXVpdgkJTUFOR0xFKFVuaWZvcm0xdWl2KQorI2RlZmluZSBnbFVuaWZvcm0yZAkJTUFOR0xFKFVuaWZvcm0yZCkKKyNkZWZpbmUgZ2xVbmlmb3JtMmR2CQlNQU5HTEUoVW5pZm9ybTJkdikKKyNkZWZpbmUgZ2xVbmlmb3JtMmZBUkIJCU1BTkdMRShVbmlmb3JtMmZBUkIpCisjZGVmaW5lIGdsVW5pZm9ybTJmCQlNQU5HTEUoVW5pZm9ybTJmKQorI2RlZmluZSBnbFVuaWZvcm0yZnZBUkIJCU1BTkdMRShVbmlmb3JtMmZ2QVJCKQorI2RlZmluZSBnbFVuaWZvcm0yZnYJCU1BTkdMRShVbmlmb3JtMmZ2KQorI2RlZmluZSBnbFVuaWZvcm0yaTY0TlYJCU1BTkdMRShVbmlmb3JtMmk2NE5WKQorI2RlZmluZSBnbFVuaWZvcm0yaTY0dk5WCQlNQU5HTEUoVW5pZm9ybTJpNjR2TlYpCisjZGVmaW5lIGdsVW5pZm9ybTJpQVJCCQlNQU5HTEUoVW5pZm9ybTJpQVJCKQorI2RlZmluZSBnbFVuaWZvcm0yaQkJTUFOR0xFKFVuaWZvcm0yaSkKKyNkZWZpbmUgZ2xVbmlmb3JtMml2QVJCCQlNQU5HTEUoVW5pZm9ybTJpdkFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtMml2CQlNQU5HTEUoVW5pZm9ybTJpdikKKyNkZWZpbmUgZ2xVbmlmb3JtMnVpNjROVgkJTUFOR0xFKFVuaWZvcm0ydWk2NE5WKQorI2RlZmluZSBnbFVuaWZvcm0ydWk2NHZOVgkJTUFOR0xFKFVuaWZvcm0ydWk2NHZOVikKKyNkZWZpbmUgZ2xVbmlmb3JtMnVpRVhUCQlNQU5HTEUoVW5pZm9ybTJ1aUVYVCkKKyNkZWZpbmUgZ2xVbmlmb3JtMnVpCQlNQU5HTEUoVW5pZm9ybTJ1aSkKKyNkZWZpbmUgZ2xVbmlmb3JtMnVpdkVYVAkJTUFOR0xFKFVuaWZvcm0ydWl2RVhUKQorI2RlZmluZSBnbFVuaWZvcm0ydWl2CQlNQU5HTEUoVW5pZm9ybTJ1aXYpCisjZGVmaW5lIGdsVW5pZm9ybTNkCQlNQU5HTEUoVW5pZm9ybTNkKQorI2RlZmluZSBnbFVuaWZvcm0zZHYJCU1BTkdMRShVbmlmb3JtM2R2KQorI2RlZmluZSBnbFVuaWZvcm0zZkFSQgkJTUFOR0xFKFVuaWZvcm0zZkFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtM2YJCU1BTkdMRShVbmlmb3JtM2YpCisjZGVmaW5lIGdsVW5pZm9ybTNmdkFSQgkJTUFOR0xFKFVuaWZvcm0zZnZBUkIpCisjZGVmaW5lIGdsVW5pZm9ybTNmdgkJTUFOR0xFKFVuaWZvcm0zZnYpCisjZGVmaW5lIGdsVW5pZm9ybTNpNjROVgkJTUFOR0xFKFVuaWZvcm0zaTY0TlYpCisjZGVmaW5lIGdsVW5pZm9ybTNpNjR2TlYJCU1BTkdMRShVbmlmb3JtM2k2NHZOVikKKyNkZWZpbmUgZ2xVbmlmb3JtM2lBUkIJCU1BTkdMRShVbmlmb3JtM2lBUkIpCisjZGVmaW5lIGdsVW5pZm9ybTNpCQlNQU5HTEUoVW5pZm9ybTNpKQorI2RlZmluZSBnbFVuaWZvcm0zaXZBUkIJCU1BTkdMRShVbmlmb3JtM2l2QVJCKQorI2RlZmluZSBnbFVuaWZvcm0zaXYJCU1BTkdMRShVbmlmb3JtM2l2KQorI2RlZmluZSBnbFVuaWZvcm0zdWk2NE5WCQlNQU5HTEUoVW5pZm9ybTN1aTY0TlYpCisjZGVmaW5lIGdsVW5pZm9ybTN1aTY0dk5WCQlNQU5HTEUoVW5pZm9ybTN1aTY0dk5WKQorI2RlZmluZSBnbFVuaWZvcm0zdWlFWFQJCU1BTkdMRShVbmlmb3JtM3VpRVhUKQorI2RlZmluZSBnbFVuaWZvcm0zdWkJCU1BTkdMRShVbmlmb3JtM3VpKQorI2RlZmluZSBnbFVuaWZvcm0zdWl2RVhUCQlNQU5HTEUoVW5pZm9ybTN1aXZFWFQpCisjZGVmaW5lIGdsVW5pZm9ybTN1aXYJCU1BTkdMRShVbmlmb3JtM3VpdikKKyNkZWZpbmUgZ2xVbmlmb3JtNGQJCU1BTkdMRShVbmlmb3JtNGQpCisjZGVmaW5lIGdsVW5pZm9ybTRkdgkJTUFOR0xFKFVuaWZvcm00ZHYpCisjZGVmaW5lIGdsVW5pZm9ybTRmQVJCCQlNQU5HTEUoVW5pZm9ybTRmQVJCKQorI2RlZmluZSBnbFVuaWZvcm00ZgkJTUFOR0xFKFVuaWZvcm00ZikKKyNkZWZpbmUgZ2xVbmlmb3JtNGZ2QVJCCQlNQU5HTEUoVW5pZm9ybTRmdkFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtNGZ2CQlNQU5HTEUoVW5pZm9ybTRmdikKKyNkZWZpbmUgZ2xVbmlmb3JtNGk2NE5WCQlNQU5HTEUoVW5pZm9ybTRpNjROVikKKyNkZWZpbmUgZ2xVbmlmb3JtNGk2NHZOVgkJTUFOR0xFKFVuaWZvcm00aTY0dk5WKQorI2RlZmluZSBnbFVuaWZvcm00aUFSQgkJTUFOR0xFKFVuaWZvcm00aUFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtNGkJCU1BTkdMRShVbmlmb3JtNGkpCisjZGVmaW5lIGdsVW5pZm9ybTRpdkFSQgkJTUFOR0xFKFVuaWZvcm00aXZBUkIpCisjZGVmaW5lIGdsVW5pZm9ybTRpdgkJTUFOR0xFKFVuaWZvcm00aXYpCisjZGVmaW5lIGdsVW5pZm9ybTR1aTY0TlYJCU1BTkdMRShVbmlmb3JtNHVpNjROVikKKyNkZWZpbmUgZ2xVbmlmb3JtNHVpNjR2TlYJCU1BTkdMRShVbmlmb3JtNHVpNjR2TlYpCisjZGVmaW5lIGdsVW5pZm9ybTR1aUVYVAkJTUFOR0xFKFVuaWZvcm00dWlFWFQpCisjZGVmaW5lIGdsVW5pZm9ybTR1aQkJTUFOR0xFKFVuaWZvcm00dWkpCisjZGVmaW5lIGdsVW5pZm9ybTR1aXZFWFQJCU1BTkdMRShVbmlmb3JtNHVpdkVYVCkKKyNkZWZpbmUgZ2xVbmlmb3JtNHVpdgkJTUFOR0xFKFVuaWZvcm00dWl2KQorI2RlZmluZSBnbFVuaWZvcm1CbG9ja0JpbmRpbmcJCU1BTkdMRShVbmlmb3JtQmxvY2tCaW5kaW5nKQorI2RlZmluZSBnbFVuaWZvcm1CdWZmZXJFWFQJCU1BTkdMRShVbmlmb3JtQnVmZmVyRVhUKQorI2RlZmluZSBnbFVuaWZvcm1NYXRyaXgyZHYJCU1BTkdMRShVbmlmb3JtTWF0cml4MmR2KQorI2RlZmluZSBnbFVuaWZvcm1NYXRyaXgyZnZBUkIJCU1BTkdMRShVbmlmb3JtTWF0cml4MmZ2QVJCKQorI2RlZmluZSBnbFVuaWZvcm1NYXRyaXgyZnYJCU1BTkdMRShVbmlmb3JtTWF0cml4MmZ2KQorI2RlZmluZSBnbFVuaWZvcm1NYXRyaXgyeDNkdgkJTUFOR0xFKFVuaWZvcm1NYXRyaXgyeDNkdikKKyNkZWZpbmUgZ2xVbmlmb3JtTWF0cml4MngzZnYJCU1BTkdMRShVbmlmb3JtTWF0cml4MngzZnYpCisjZGVmaW5lIGdsVW5pZm9ybU1hdHJpeDJ4NGR2CQlNQU5HTEUoVW5pZm9ybU1hdHJpeDJ4NGR2KQorI2RlZmluZSBnbFVuaWZvcm1NYXRyaXgyeDRmdgkJTUFOR0xFKFVuaWZvcm1NYXRyaXgyeDRmdikKKyNkZWZpbmUgZ2xVbmlmb3JtTWF0cml4M2R2CQlNQU5HTEUoVW5pZm9ybU1hdHJpeDNkdikKKyNkZWZpbmUgZ2xVbmlmb3JtTWF0cml4M2Z2QVJCCQlNQU5HTEUoVW5pZm9ybU1hdHJpeDNmdkFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtTWF0cml4M2Z2CQlNQU5HTEUoVW5pZm9ybU1hdHJpeDNmdikKKyNkZWZpbmUgZ2xVbmlmb3JtTWF0cml4M3gyZHYJCU1BTkdMRShVbmlmb3JtTWF0cml4M3gyZHYpCisjZGVmaW5lIGdsVW5pZm9ybU1hdHJpeDN4MmZ2CQlNQU5HTEUoVW5pZm9ybU1hdHJpeDN4MmZ2KQorI2RlZmluZSBnbFVuaWZvcm1NYXRyaXgzeDRkdgkJTUFOR0xFKFVuaWZvcm1NYXRyaXgzeDRkdikKKyNkZWZpbmUgZ2xVbmlmb3JtTWF0cml4M3g0ZnYJCU1BTkdMRShVbmlmb3JtTWF0cml4M3g0ZnYpCisjZGVmaW5lIGdsVW5pZm9ybU1hdHJpeDRkdgkJTUFOR0xFKFVuaWZvcm1NYXRyaXg0ZHYpCisjZGVmaW5lIGdsVW5pZm9ybU1hdHJpeDRmdkFSQgkJTUFOR0xFKFVuaWZvcm1NYXRyaXg0ZnZBUkIpCisjZGVmaW5lIGdsVW5pZm9ybU1hdHJpeDRmdgkJTUFOR0xFKFVuaWZvcm1NYXRyaXg0ZnYpCisjZGVmaW5lIGdsVW5pZm9ybU1hdHJpeDR4MmR2CQlNQU5HTEUoVW5pZm9ybU1hdHJpeDR4MmR2KQorI2RlZmluZSBnbFVuaWZvcm1NYXRyaXg0eDJmdgkJTUFOR0xFKFVuaWZvcm1NYXRyaXg0eDJmdikKKyNkZWZpbmUgZ2xVbmlmb3JtTWF0cml4NHgzZHYJCU1BTkdMRShVbmlmb3JtTWF0cml4NHgzZHYpCisjZGVmaW5lIGdsVW5pZm9ybU1hdHJpeDR4M2Z2CQlNQU5HTEUoVW5pZm9ybU1hdHJpeDR4M2Z2KQorI2RlZmluZSBnbFVuaWZvcm1TdWJyb3V0aW5lc3VpdgkJTUFOR0xFKFVuaWZvcm1TdWJyb3V0aW5lc3VpdikKKyNkZWZpbmUgZ2xVbmlmb3JtdWk2NE5WCQlNQU5HTEUoVW5pZm9ybXVpNjROVikKKyNkZWZpbmUgZ2xVbmlmb3JtdWk2NHZOVgkJTUFOR0xFKFVuaWZvcm11aTY0dk5WKQorI2RlZmluZSBnbFVubG9ja0FycmF5c0VYVAkJTUFOR0xFKFVubG9ja0FycmF5c0VYVCkKKyNkZWZpbmUgZ2xVbm1hcEJ1ZmZlckFSQgkJTUFOR0xFKFVubWFwQnVmZmVyQVJCKQorI2RlZmluZSBnbFVubWFwQnVmZmVyCQlNQU5HTEUoVW5tYXBCdWZmZXIpCisjZGVmaW5lIGdsVW5tYXBOYW1lZEJ1ZmZlckVYVAkJTUFOR0xFKFVubWFwTmFtZWRCdWZmZXJFWFQpCisjZGVmaW5lIGdsVW5tYXBPYmplY3RCdWZmZXJBVEkJCU1BTkdMRShVbm1hcE9iamVjdEJ1ZmZlckFUSSkKKyNkZWZpbmUgZ2xVcGRhdGVPYmplY3RCdWZmZXJBVEkJCU1BTkdMRShVcGRhdGVPYmplY3RCdWZmZXJBVEkpCisjZGVmaW5lIGdsVXNlUHJvZ3JhbQkJTUFOR0xFKFVzZVByb2dyYW0pCisjZGVmaW5lIGdsVXNlUHJvZ3JhbU9iamVjdEFSQgkJTUFOR0xFKFVzZVByb2dyYW1PYmplY3RBUkIpCisjZGVmaW5lIGdsVXNlUHJvZ3JhbVN0YWdlcwkJTUFOR0xFKFVzZVByb2dyYW1TdGFnZXMpCisjZGVmaW5lIGdsVXNlU2hhZGVyUHJvZ3JhbUVYVAkJTUFOR0xFKFVzZVNoYWRlclByb2dyYW1FWFQpCisjZGVmaW5lIGdsVmFsaWRhdGVQcm9ncmFtQVJCCQlNQU5HTEUoVmFsaWRhdGVQcm9ncmFtQVJCKQorI2RlZmluZSBnbFZhbGlkYXRlUHJvZ3JhbQkJTUFOR0xFKFZhbGlkYXRlUHJvZ3JhbSkKKyNkZWZpbmUgZ2xWYWxpZGF0ZVByb2dyYW1QaXBlbGluZQkJTUFOR0xFKFZhbGlkYXRlUHJvZ3JhbVBpcGVsaW5lKQorI2RlZmluZSBnbFZhcmlhbnRBcnJheU9iamVjdEFUSQkJTUFOR0xFKFZhcmlhbnRBcnJheU9iamVjdEFUSSkKKyNkZWZpbmUgZ2xWYXJpYW50YnZFWFQJCU1BTkdMRShWYXJpYW50YnZFWFQpCisjZGVmaW5lIGdsVmFyaWFudGR2RVhUCQlNQU5HTEUoVmFyaWFudGR2RVhUKQorI2RlZmluZSBnbFZhcmlhbnRmdkVYVAkJTUFOR0xFKFZhcmlhbnRmdkVYVCkKKyNkZWZpbmUgZ2xWYXJpYW50aXZFWFQJCU1BTkdMRShWYXJpYW50aXZFWFQpCisjZGVmaW5lIGdsVmFyaWFudFBvaW50ZXJFWFQJCU1BTkdMRShWYXJpYW50UG9pbnRlckVYVCkKKyNkZWZpbmUgZ2xWYXJpYW50c3ZFWFQJCU1BTkdMRShWYXJpYW50c3ZFWFQpCisjZGVmaW5lIGdsVmFyaWFudHVidkVYVAkJTUFOR0xFKFZhcmlhbnR1YnZFWFQpCisjZGVmaW5lIGdsVmFyaWFudHVpdkVYVAkJTUFOR0xFKFZhcmlhbnR1aXZFWFQpCisjZGVmaW5lIGdsVmFyaWFudHVzdkVYVAkJTUFOR0xFKFZhcmlhbnR1c3ZFWFQpCisjZGVmaW5lIGdsVkRQQVVGaW5pTlYJCU1BTkdMRShWRFBBVUZpbmlOVikKKyNkZWZpbmUgZ2xWRFBBVUdldFN1cmZhY2Vpdk5WCQlNQU5HTEUoVkRQQVVHZXRTdXJmYWNlaXZOVikKKyNkZWZpbmUgZ2xWRFBBVUluaXROVgkJTUFOR0xFKFZEUEFVSW5pdE5WKQorI2RlZmluZSBnbFZEUEFVSXNTdXJmYWNlTlYJCU1BTkdMRShWRFBBVUlzU3VyZmFjZU5WKQorI2RlZmluZSBnbFZEUEFVTWFwU3VyZmFjZXNOVgkJTUFOR0xFKFZEUEFVTWFwU3VyZmFjZXNOVikKKyNkZWZpbmUgZ2xWRFBBVVJlZ2lzdGVyT3V0cHV0U3VyZmFjZU5WCQlNQU5HTEUoVkRQQVVSZWdpc3Rlck91dHB1dFN1cmZhY2VOVikKKyNkZWZpbmUgZ2xWRFBBVVJlZ2lzdGVyVmlkZW9TdXJmYWNlTlYJCU1BTkdMRShWRFBBVVJlZ2lzdGVyVmlkZW9TdXJmYWNlTlYpCisjZGVmaW5lIGdsVkRQQVVTdXJmYWNlQWNjZXNzTlYJCU1BTkdMRShWRFBBVVN1cmZhY2VBY2Nlc3NOVikKKyNkZWZpbmUgZ2xWRFBBVVVubWFwU3VyZmFjZXNOVgkJTUFOR0xFKFZEUEFVVW5tYXBTdXJmYWNlc05WKQorI2RlZmluZSBnbFZEUEFVVW5yZWdpc3RlclN1cmZhY2VOVgkJTUFOR0xFKFZEUEFVVW5yZWdpc3RlclN1cmZhY2VOVikKKyNkZWZpbmUgZ2xWZXJ0ZXgyZAkJTUFOR0xFKFZlcnRleDJkKQorI2RlZmluZSBnbFZlcnRleDJkdgkJTUFOR0xFKFZlcnRleDJkdikKKyNkZWZpbmUgZ2xWZXJ0ZXgyZgkJTUFOR0xFKFZlcnRleDJmKQorI2RlZmluZSBnbFZlcnRleDJmdgkJTUFOR0xFKFZlcnRleDJmdikKKyNkZWZpbmUgZ2xWZXJ0ZXgyaE5WCQlNQU5HTEUoVmVydGV4MmhOVikKKyNkZWZpbmUgZ2xWZXJ0ZXgyaHZOVgkJTUFOR0xFKFZlcnRleDJodk5WKQorI2RlZmluZSBnbFZlcnRleDJpCQlNQU5HTEUoVmVydGV4MmkpCisjZGVmaW5lIGdsVmVydGV4Mml2CQlNQU5HTEUoVmVydGV4Mml2KQorI2RlZmluZSBnbFZlcnRleDJzCQlNQU5HTEUoVmVydGV4MnMpCisjZGVmaW5lIGdsVmVydGV4MnN2CQlNQU5HTEUoVmVydGV4MnN2KQorI2RlZmluZSBnbFZlcnRleDNkCQlNQU5HTEUoVmVydGV4M2QpCisjZGVmaW5lIGdsVmVydGV4M2R2CQlNQU5HTEUoVmVydGV4M2R2KQorI2RlZmluZSBnbFZlcnRleDNmCQlNQU5HTEUoVmVydGV4M2YpCisjZGVmaW5lIGdsVmVydGV4M2Z2CQlNQU5HTEUoVmVydGV4M2Z2KQorI2RlZmluZSBnbFZlcnRleDNoTlYJCU1BTkdMRShWZXJ0ZXgzaE5WKQorI2RlZmluZSBnbFZlcnRleDNodk5WCQlNQU5HTEUoVmVydGV4M2h2TlYpCisjZGVmaW5lIGdsVmVydGV4M2kJCU1BTkdMRShWZXJ0ZXgzaSkKKyNkZWZpbmUgZ2xWZXJ0ZXgzaXYJCU1BTkdMRShWZXJ0ZXgzaXYpCisjZGVmaW5lIGdsVmVydGV4M3MJCU1BTkdMRShWZXJ0ZXgzcykKKyNkZWZpbmUgZ2xWZXJ0ZXgzc3YJCU1BTkdMRShWZXJ0ZXgzc3YpCisjZGVmaW5lIGdsVmVydGV4NGQJCU1BTkdMRShWZXJ0ZXg0ZCkKKyNkZWZpbmUgZ2xWZXJ0ZXg0ZHYJCU1BTkdMRShWZXJ0ZXg0ZHYpCisjZGVmaW5lIGdsVmVydGV4NGYJCU1BTkdMRShWZXJ0ZXg0ZikKKyNkZWZpbmUgZ2xWZXJ0ZXg0ZnYJCU1BTkdMRShWZXJ0ZXg0ZnYpCisjZGVmaW5lIGdsVmVydGV4NGhOVgkJTUFOR0xFKFZlcnRleDRoTlYpCisjZGVmaW5lIGdsVmVydGV4NGh2TlYJCU1BTkdMRShWZXJ0ZXg0aHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXg0aQkJTUFOR0xFKFZlcnRleDRpKQorI2RlZmluZSBnbFZlcnRleDRpdgkJTUFOR0xFKFZlcnRleDRpdikKKyNkZWZpbmUgZ2xWZXJ0ZXg0cwkJTUFOR0xFKFZlcnRleDRzKQorI2RlZmluZSBnbFZlcnRleDRzdgkJTUFOR0xFKFZlcnRleDRzdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBcnJheVBhcmFtZXRlcmlBUFBMRQkJTUFOR0xFKFZlcnRleEFycmF5UGFyYW1ldGVyaUFQUExFKQorI2RlZmluZSBnbFZlcnRleEFycmF5UmFuZ2VBUFBMRQkJTUFOR0xFKFZlcnRleEFycmF5UmFuZ2VBUFBMRSkKKyNkZWZpbmUgZ2xWZXJ0ZXhBcnJheVJhbmdlTlYJCU1BTkdMRShWZXJ0ZXhBcnJheVJhbmdlTlYpCisjZGVmaW5lIGdsVmVydGV4QXJyYXlWZXJ0ZXhBdHRyaWJMT2Zmc2V0RVhUCQlNQU5HTEUoVmVydGV4QXJyYXlWZXJ0ZXhBdHRyaWJMT2Zmc2V0RVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjFkQVJCCQlNQU5HTEUoVmVydGV4QXR0cmliMWRBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMWQJCU1BTkdMRShWZXJ0ZXhBdHRyaWIxZCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIxZE5WCQlNQU5HTEUoVmVydGV4QXR0cmliMWROVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIxZHZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWIxZHZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMWR2CQlNQU5HTEUoVmVydGV4QXR0cmliMWR2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjFkdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliMWR2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMWZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWIxZkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIxZgkJTUFOR0xFKFZlcnRleEF0dHJpYjFmKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjFmTlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIxZk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjFmdkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjFmdkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIxZnYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIxZnYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMWZ2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIxZnZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIxaE5WCQlNQU5HTEUoVmVydGV4QXR0cmliMWhOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIxaHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjFodk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjFzQVJCCQlNQU5HTEUoVmVydGV4QXR0cmliMXNBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMXMJCU1BTkdMRShWZXJ0ZXhBdHRyaWIxcykKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIxc05WCQlNQU5HTEUoVmVydGV4QXR0cmliMXNOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIxc3ZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWIxc3ZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMXN2CQlNQU5HTEUoVmVydGV4QXR0cmliMXN2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjFzdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliMXN2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMmRBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWIyZEFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIyZAkJTUFOR0xFKFZlcnRleEF0dHJpYjJkKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjJkTlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIyZE5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjJkdkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjJkdkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIyZHYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIyZHYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMmR2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIyZHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIyZkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjJmQVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjJmCQlNQU5HTEUoVmVydGV4QXR0cmliMmYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMmZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjJmTlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMmZ2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliMmZ2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjJmdgkJTUFOR0xFKFZlcnRleEF0dHJpYjJmdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIyZnZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjJmdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjJoTlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIyaE5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjJodk5WCQlNQU5HTEUoVmVydGV4QXR0cmliMmh2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMnNBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWIyc0FSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIycwkJTUFOR0xFKFZlcnRleEF0dHJpYjJzKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjJzTlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIyc05WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjJzdkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjJzdkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIyc3YJCU1BTkdMRShWZXJ0ZXhBdHRyaWIyc3YpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMnN2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIyc3ZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIzZEFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjNkQVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjNkCQlNQU5HTEUoVmVydGV4QXR0cmliM2QpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliM2ROVgkJTUFOR0xFKFZlcnRleEF0dHJpYjNkTlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliM2R2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliM2R2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjNkdgkJTUFOR0xFKFZlcnRleEF0dHJpYjNkdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIzZHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjNkdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjNmQVJCCQlNQU5HTEUoVmVydGV4QXR0cmliM2ZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliM2YJCU1BTkdMRShWZXJ0ZXhBdHRyaWIzZikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIzZk5WCQlNQU5HTEUoVmVydGV4QXR0cmliM2ZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIzZnZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWIzZnZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliM2Z2CQlNQU5HTEUoVmVydGV4QXR0cmliM2Z2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjNmdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliM2Z2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliM2hOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjNoTlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliM2h2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIzaHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIzc0FSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjNzQVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjNzCQlNQU5HTEUoVmVydGV4QXR0cmliM3MpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliM3NOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjNzTlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliM3N2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliM3N2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjNzdgkJTUFOR0xFKFZlcnRleEF0dHJpYjNzdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIzc3ZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjNzdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRidkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjRidkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0YnYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0YnYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNGRBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0ZEFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0ZAkJTUFOR0xFKFZlcnRleEF0dHJpYjRkKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRkTlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0ZE5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRkdkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjRkdkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0ZHYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0ZHYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNGR2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0ZHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0ZkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjRmQVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRmCQlNQU5HTEUoVmVydGV4QXR0cmliNGYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNGZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjRmTlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNGZ2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliNGZ2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRmdgkJTUFOR0xFKFZlcnRleEF0dHJpYjRmdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0ZnZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjRmdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRoTlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0aE5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRodk5WCQlNQU5HTEUoVmVydGV4QXR0cmliNGh2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNGl2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliNGl2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRpdgkJTUFOR0xFKFZlcnRleEF0dHJpYjRpdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0TmJ2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliNE5idkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0TmJ2CQlNQU5HTEUoVmVydGV4QXR0cmliNE5idikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0Tml2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliNE5pdkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0Tml2CQlNQU5HTEUoVmVydGV4QXR0cmliNE5pdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0TnN2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliNE5zdkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0TnN2CQlNQU5HTEUoVmVydGV4QXR0cmliNE5zdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0TnViQVJCCQlNQU5HTEUoVmVydGV4QXR0cmliNE51YkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0TnViCQlNQU5HTEUoVmVydGV4QXR0cmliNE51YikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0TnVidkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjROdWJ2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjROdWJ2CQlNQU5HTEUoVmVydGV4QXR0cmliNE51YnYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNE51aXZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0TnVpdkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0TnVpdgkJTUFOR0xFKFZlcnRleEF0dHJpYjROdWl2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjROdXN2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliNE51c3ZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNE51c3YJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0TnVzdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0c0FSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjRzQVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRzCQlNQU5HTEUoVmVydGV4QXR0cmliNHMpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNHNOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjRzTlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNHN2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliNHN2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRzdgkJTUFOR0xFKFZlcnRleEF0dHJpYjRzdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0c3ZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjRzdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjR1Yk5WCQlNQU5HTEUoVmVydGV4QXR0cmliNHViTlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNHVidkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjR1YnZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNHVidgkJTUFOR0xFKFZlcnRleEF0dHJpYjR1YnYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNHVidk5WCQlNQU5HTEUoVmVydGV4QXR0cmliNHVidk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjR1aXZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0dWl2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjR1aXYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0dWl2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjR1c3ZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0dXN2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjR1c3YJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0dXN2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkFycmF5T2JqZWN0QVRJCQlNQU5HTEUoVmVydGV4QXR0cmliQXJyYXlPYmplY3RBVEkpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliRGl2aXNvckFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYkRpdmlzb3JBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliRGl2aXNvcgkJTUFOR0xFKFZlcnRleEF0dHJpYkRpdmlzb3IpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliRm9ybWF0TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJGb3JtYXROVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJMWlFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJMWlFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTFpCQlNQU5HTEUoVmVydGV4QXR0cmliSTFpKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkxaXZFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJMWl2RVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkxaXYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJMWl2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkxdWlFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJMXVpRVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkxdWkJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJMXVpKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkxdWl2RVhUCQlNQU5HTEUoVmVydGV4QXR0cmliSTF1aXZFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTF1aXYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJMXVpdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJMmlFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJMmlFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTJpCQlNQU5HTEUoVmVydGV4QXR0cmliSTJpKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkyaXZFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJMml2RVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkyaXYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJMml2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkydWlFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJMnVpRVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkydWkJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJMnVpKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkydWl2RVhUCQlNQU5HTEUoVmVydGV4QXR0cmliSTJ1aXZFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTJ1aXYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJMnVpdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJM2lFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJM2lFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTNpCQlNQU5HTEUoVmVydGV4QXR0cmliSTNpKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkzaXZFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJM2l2RVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkzaXYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJM2l2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkzdWlFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJM3VpRVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkzdWkJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJM3VpKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkzdWl2RVhUCQlNQU5HTEUoVmVydGV4QXR0cmliSTN1aXZFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTN1aXYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJM3VpdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJNGJ2RVhUCQlNQU5HTEUoVmVydGV4QXR0cmliSTRidkVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJNGJ2CQlNQU5HTEUoVmVydGV4QXR0cmliSTRidikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJNGlFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJNGlFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTRpCQlNQU5HTEUoVmVydGV4QXR0cmliSTRpKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkk0aXZFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJNGl2RVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkk0aXYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJNGl2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkk0c3ZFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJNHN2RVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkk0c3YJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJNHN2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkk0dWJ2RVhUCQlNQU5HTEUoVmVydGV4QXR0cmliSTR1YnZFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTR1YnYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJNHVidikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJNHVpRVhUCQlNQU5HTEUoVmVydGV4QXR0cmliSTR1aUVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJNHVpCQlNQU5HTEUoVmVydGV4QXR0cmliSTR1aSkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJNHVpdkVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkk0dWl2RVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkk0dWl2CQlNQU5HTEUoVmVydGV4QXR0cmliSTR1aXYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTR1c3ZFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJNHVzdkVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJNHVzdgkJTUFOR0xFKFZlcnRleEF0dHJpYkk0dXN2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYklGb3JtYXROVgkJTUFOR0xFKFZlcnRleEF0dHJpYklGb3JtYXROVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJUG9pbnRlckVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYklQb2ludGVyRVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYklQb2ludGVyCQlNQU5HTEUoVmVydGV4QXR0cmliSVBvaW50ZXIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTDFkRVhUCQlNQU5HTEUoVmVydGV4QXR0cmliTDFkRVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkwxZAkJTUFOR0xFKFZlcnRleEF0dHJpYkwxZCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMMWR2RVhUCQlNQU5HTEUoVmVydGV4QXR0cmliTDFkdkVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMMWR2CQlNQU5HTEUoVmVydGV4QXR0cmliTDFkdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMMWk2NE5WCQlNQU5HTEUoVmVydGV4QXR0cmliTDFpNjROVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMMWk2NHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYkwxaTY0dk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkwxdWk2NE5WCQlNQU5HTEUoVmVydGV4QXR0cmliTDF1aTY0TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTDF1aTY0dk5WCQlNQU5HTEUoVmVydGV4QXR0cmliTDF1aTY0dk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkwyZEVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkwyZEVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMMmQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMMmQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTDJkdkVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkwyZHZFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTDJkdgkJTUFOR0xFKFZlcnRleEF0dHJpYkwyZHYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTDJpNjROVgkJTUFOR0xFKFZlcnRleEF0dHJpYkwyaTY0TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTDJpNjR2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMMmk2NHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMMnVpNjROVgkJTUFOR0xFKFZlcnRleEF0dHJpYkwydWk2NE5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkwydWk2NHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYkwydWk2NHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMM2RFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMM2RFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTDNkCQlNQU5HTEUoVmVydGV4QXR0cmliTDNkKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkwzZHZFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMM2R2RVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkwzZHYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMM2R2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkwzaTY0TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMM2k2NE5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkwzaTY0dk5WCQlNQU5HTEUoVmVydGV4QXR0cmliTDNpNjR2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTDN1aTY0TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMM3VpNjROVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMM3VpNjR2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJMM3VpNjR2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTDRkRVhUCQlNQU5HTEUoVmVydGV4QXR0cmliTDRkRVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkw0ZAkJTUFOR0xFKFZlcnRleEF0dHJpYkw0ZCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMNGR2RVhUCQlNQU5HTEUoVmVydGV4QXR0cmliTDRkdkVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMNGR2CQlNQU5HTEUoVmVydGV4QXR0cmliTDRkdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMNGk2NE5WCQlNQU5HTEUoVmVydGV4QXR0cmliTDRpNjROVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMNGk2NHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYkw0aTY0dk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkw0dWk2NE5WCQlNQU5HTEUoVmVydGV4QXR0cmliTDR1aTY0TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliTDR1aTY0dk5WCQlNQU5HTEUoVmVydGV4QXR0cmliTDR1aTY0dk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkxGb3JtYXROVgkJTUFOR0xFKFZlcnRleEF0dHJpYkxGb3JtYXROVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJMUG9pbnRlckVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkxQb2ludGVyRVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkxQb2ludGVyCQlNQU5HTEUoVmVydGV4QXR0cmliTFBvaW50ZXIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliUDF1aQkJTUFOR0xFKFZlcnRleEF0dHJpYlAxdWkpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliUDF1aXYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJQMXVpdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJQMnVpCQlNQU5HTEUoVmVydGV4QXR0cmliUDJ1aSkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJQMnVpdgkJTUFOR0xFKFZlcnRleEF0dHJpYlAydWl2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYlAzdWkJCU1BTkdMRShWZXJ0ZXhBdHRyaWJQM3VpKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYlAzdWl2CQlNQU5HTEUoVmVydGV4QXR0cmliUDN1aXYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliUDR1aQkJTUFOR0xFKFZlcnRleEF0dHJpYlA0dWkpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliUDR1aXYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJQNHVpdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyQVJCCQlNQU5HTEUoVmVydGV4QXR0cmliUG9pbnRlckFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyCQlNQU5HTEUoVmVydGV4QXR0cmliUG9pbnRlcikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyTlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJQb2ludGVyTlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliczFkdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliczFkdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYnMxZnZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYnMxZnZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJzMWh2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJzMWh2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliczFzdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliczFzdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYnMyZHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYnMyZHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJzMmZ2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJzMmZ2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliczJodk5WCQlNQU5HTEUoVmVydGV4QXR0cmliczJodk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYnMyc3ZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYnMyc3ZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJzM2R2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJzM2R2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliczNmdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliczNmdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYnMzaHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYnMzaHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJzM3N2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJzM3N2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliczRkdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliczRkdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYnM0ZnZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYnM0ZnZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJzNGh2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJzNGh2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliczRzdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliczRzdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYnM0dWJ2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJzNHVidk5WKQorI2RlZmluZSBnbFZlcnRleEJsZW5kQVJCCQlNQU5HTEUoVmVydGV4QmxlbmRBUkIpCisjZGVmaW5lIGdsVmVydGV4QmxlbmRFbnZmQVRJCQlNQU5HTEUoVmVydGV4QmxlbmRFbnZmQVRJKQorI2RlZmluZSBnbFZlcnRleEJsZW5kRW52aUFUSQkJTUFOR0xFKFZlcnRleEJsZW5kRW52aUFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhGb3JtYXROVgkJTUFOR0xFKFZlcnRleEZvcm1hdE5WKQorI2RlZmluZSBnbFZlcnRleFAydWkJCU1BTkdMRShWZXJ0ZXhQMnVpKQorI2RlZmluZSBnbFZlcnRleFAydWl2CQlNQU5HTEUoVmVydGV4UDJ1aXYpCisjZGVmaW5lIGdsVmVydGV4UDN1aQkJTUFOR0xFKFZlcnRleFAzdWkpCisjZGVmaW5lIGdsVmVydGV4UDN1aXYJCU1BTkdMRShWZXJ0ZXhQM3VpdikKKyNkZWZpbmUgZ2xWZXJ0ZXhQNHVpCQlNQU5HTEUoVmVydGV4UDR1aSkKKyNkZWZpbmUgZ2xWZXJ0ZXhQNHVpdgkJTUFOR0xFKFZlcnRleFA0dWl2KQorI2RlZmluZSBnbFZlcnRleFBvaW50ZXJFWFQJCU1BTkdMRShWZXJ0ZXhQb2ludGVyRVhUKQorI2RlZmluZSBnbFZlcnRleFBvaW50ZXJMaXN0SUJNCQlNQU5HTEUoVmVydGV4UG9pbnRlckxpc3RJQk0pCisjZGVmaW5lIGdsVmVydGV4UG9pbnRlcgkJTUFOR0xFKFZlcnRleFBvaW50ZXIpCisjZGVmaW5lIGdsVmVydGV4UG9pbnRlcnZJTlRFTAkJTUFOR0xFKFZlcnRleFBvaW50ZXJ2SU5URUwpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtMWRBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0xZEFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0xZHZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0xZHZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtMWZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0xZkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0xZnZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0xZnZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtMWlBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0xaUFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0xaXZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0xaXZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtMXNBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0xc0FUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0xc3ZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0xc3ZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtMmRBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0yZEFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0yZHZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0yZHZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtMmZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0yZkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0yZnZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0yZnZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtMmlBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0yaUFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0yaXZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0yaXZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtMnNBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0yc0FUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0yc3ZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0yc3ZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtM2RBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0zZEFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0zZHZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0zZHZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtM2ZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0zZkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0zZnZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0zZnZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtM2lBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0zaUFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0zaXZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0zaXZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtM3NBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0zc0FUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0zc3ZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0zc3ZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtNGRBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW00ZEFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW00ZHZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW00ZHZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtNGZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW00ZkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW00ZnZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW00ZnZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtNGlBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW00aUFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW00aXZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW00aXZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtNHNBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW00c0FUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW00c3ZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW00c3ZBVEkpCisjZGVmaW5lIGdsVmVydGV4V2VpZ2h0ZkVYVAkJTUFOR0xFKFZlcnRleFdlaWdodGZFWFQpCisjZGVmaW5lIGdsVmVydGV4V2VpZ2h0ZnZFWFQJCU1BTkdMRShWZXJ0ZXhXZWlnaHRmdkVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhXZWlnaHRoTlYJCU1BTkdMRShWZXJ0ZXhXZWlnaHRoTlYpCisjZGVmaW5lIGdsVmVydGV4V2VpZ2h0aHZOVgkJTUFOR0xFKFZlcnRleFdlaWdodGh2TlYpCisjZGVmaW5lIGdsVmVydGV4V2VpZ2h0UG9pbnRlckVYVAkJTUFOR0xFKFZlcnRleFdlaWdodFBvaW50ZXJFWFQpCisjZGVmaW5lIGdsVmlkZW9DYXB0dXJlTlYJCU1BTkdMRShWaWRlb0NhcHR1cmVOVikKKyNkZWZpbmUgZ2xWaWRlb0NhcHR1cmVTdHJlYW1QYXJhbWV0ZXJkdk5WCQlNQU5HTEUoVmlkZW9DYXB0dXJlU3RyZWFtUGFyYW1ldGVyZHZOVikKKyNkZWZpbmUgZ2xWaWRlb0NhcHR1cmVTdHJlYW1QYXJhbWV0ZXJmdk5WCQlNQU5HTEUoVmlkZW9DYXB0dXJlU3RyZWFtUGFyYW1ldGVyZnZOVikKKyNkZWZpbmUgZ2xWaWRlb0NhcHR1cmVTdHJlYW1QYXJhbWV0ZXJpdk5WCQlNQU5HTEUoVmlkZW9DYXB0dXJlU3RyZWFtUGFyYW1ldGVyaXZOVikKKyNkZWZpbmUgZ2xWaWV3cG9ydEFycmF5dgkJTUFOR0xFKFZpZXdwb3J0QXJyYXl2KQorI2RlZmluZSBnbFZpZXdwb3J0SW5kZXhlZGYJCU1BTkdMRShWaWV3cG9ydEluZGV4ZWRmKQorI2RlZmluZSBnbFZpZXdwb3J0SW5kZXhlZGZ2CQlNQU5HTEUoVmlld3BvcnRJbmRleGVkZnYpCisjZGVmaW5lIGdsVmlld3BvcnQJCU1BTkdMRShWaWV3cG9ydCkKKyNkZWZpbmUgZ2xXYWl0U3luYwkJTUFOR0xFKFdhaXRTeW5jKQorI2RlZmluZSBnbFdlaWdodGJ2QVJCCQlNQU5HTEUoV2VpZ2h0YnZBUkIpCisjZGVmaW5lIGdsV2VpZ2h0ZHZBUkIJCU1BTkdMRShXZWlnaHRkdkFSQikKKyNkZWZpbmUgZ2xXZWlnaHRmdkFSQgkJTUFOR0xFKFdlaWdodGZ2QVJCKQorI2RlZmluZSBnbFdlaWdodGl2QVJCCQlNQU5HTEUoV2VpZ2h0aXZBUkIpCisjZGVmaW5lIGdsV2VpZ2h0UG9pbnRlckFSQgkJTUFOR0xFKFdlaWdodFBvaW50ZXJBUkIpCisjZGVmaW5lIGdsV2VpZ2h0c3ZBUkIJCU1BTkdMRShXZWlnaHRzdkFSQikKKyNkZWZpbmUgZ2xXZWlnaHR1YnZBUkIJCU1BTkdMRShXZWlnaHR1YnZBUkIpCisjZGVmaW5lIGdsV2VpZ2h0dWl2QVJCCQlNQU5HTEUoV2VpZ2h0dWl2QVJCKQorI2RlZmluZSBnbFdlaWdodHVzdkFSQgkJTUFOR0xFKFdlaWdodHVzdkFSQikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MyZEFSQgkJTUFOR0xFKFdpbmRvd1BvczJkQVJCKQorI2RlZmluZSBnbFdpbmRvd1BvczJkCQlNQU5HTEUoV2luZG93UG9zMmQpCisjZGVmaW5lIGdsV2luZG93UG9zMmRNRVNBCQlNQU5HTEUoV2luZG93UG9zMmRNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczJkdkFSQgkJTUFOR0xFKFdpbmRvd1BvczJkdkFSQikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MyZHYJCU1BTkdMRShXaW5kb3dQb3MyZHYpCisjZGVmaW5lIGdsV2luZG93UG9zMmR2TUVTQQkJTUFOR0xFKFdpbmRvd1BvczJkdk1FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zMmZBUkIJCU1BTkdMRShXaW5kb3dQb3MyZkFSQikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MyZgkJTUFOR0xFKFdpbmRvd1BvczJmKQorI2RlZmluZSBnbFdpbmRvd1BvczJmTUVTQQkJTUFOR0xFKFdpbmRvd1BvczJmTUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3MyZnZBUkIJCU1BTkdMRShXaW5kb3dQb3MyZnZBUkIpCisjZGVmaW5lIGdsV2luZG93UG9zMmZ2CQlNQU5HTEUoV2luZG93UG9zMmZ2KQorI2RlZmluZSBnbFdpbmRvd1BvczJmdk1FU0EJCU1BTkdMRShXaW5kb3dQb3MyZnZNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczJpQVJCCQlNQU5HTEUoV2luZG93UG9zMmlBUkIpCisjZGVmaW5lIGdsV2luZG93UG9zMmkJCU1BTkdMRShXaW5kb3dQb3MyaSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3MyaU1FU0EJCU1BTkdMRShXaW5kb3dQb3MyaU1FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zMml2QVJCCQlNQU5HTEUoV2luZG93UG9zMml2QVJCKQorI2RlZmluZSBnbFdpbmRvd1BvczJpdgkJTUFOR0xFKFdpbmRvd1BvczJpdikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MyaXZNRVNBCQlNQU5HTEUoV2luZG93UG9zMml2TUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3Myc0FSQgkJTUFOR0xFKFdpbmRvd1BvczJzQVJCKQorI2RlZmluZSBnbFdpbmRvd1BvczJzCQlNQU5HTEUoV2luZG93UG9zMnMpCisjZGVmaW5lIGdsV2luZG93UG9zMnNNRVNBCQlNQU5HTEUoV2luZG93UG9zMnNNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczJzdkFSQgkJTUFOR0xFKFdpbmRvd1BvczJzdkFSQikKKyNkZWZpbmUgZ2xXaW5kb3dQb3Myc3YJCU1BTkdMRShXaW5kb3dQb3Myc3YpCisjZGVmaW5lIGdsV2luZG93UG9zMnN2TUVTQQkJTUFOR0xFKFdpbmRvd1BvczJzdk1FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zM2RBUkIJCU1BTkdMRShXaW5kb3dQb3MzZEFSQikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MzZAkJTUFOR0xFKFdpbmRvd1BvczNkKQorI2RlZmluZSBnbFdpbmRvd1BvczNkTUVTQQkJTUFOR0xFKFdpbmRvd1BvczNkTUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3MzZHZBUkIJCU1BTkdMRShXaW5kb3dQb3MzZHZBUkIpCisjZGVmaW5lIGdsV2luZG93UG9zM2R2CQlNQU5HTEUoV2luZG93UG9zM2R2KQorI2RlZmluZSBnbFdpbmRvd1BvczNkdk1FU0EJCU1BTkdMRShXaW5kb3dQb3MzZHZNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczNmQVJCCQlNQU5HTEUoV2luZG93UG9zM2ZBUkIpCisjZGVmaW5lIGdsV2luZG93UG9zM2YJCU1BTkdMRShXaW5kb3dQb3MzZikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MzZk1FU0EJCU1BTkdMRShXaW5kb3dQb3MzZk1FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zM2Z2QVJCCQlNQU5HTEUoV2luZG93UG9zM2Z2QVJCKQorI2RlZmluZSBnbFdpbmRvd1BvczNmdgkJTUFOR0xFKFdpbmRvd1BvczNmdikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MzZnZNRVNBCQlNQU5HTEUoV2luZG93UG9zM2Z2TUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3MzaUFSQgkJTUFOR0xFKFdpbmRvd1BvczNpQVJCKQorI2RlZmluZSBnbFdpbmRvd1BvczNpCQlNQU5HTEUoV2luZG93UG9zM2kpCisjZGVmaW5lIGdsV2luZG93UG9zM2lNRVNBCQlNQU5HTEUoV2luZG93UG9zM2lNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczNpdkFSQgkJTUFOR0xFKFdpbmRvd1BvczNpdkFSQikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MzaXYJCU1BTkdMRShXaW5kb3dQb3MzaXYpCisjZGVmaW5lIGdsV2luZG93UG9zM2l2TUVTQQkJTUFOR0xFKFdpbmRvd1BvczNpdk1FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zM3NBUkIJCU1BTkdMRShXaW5kb3dQb3Mzc0FSQikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MzcwkJTUFOR0xFKFdpbmRvd1BvczNzKQorI2RlZmluZSBnbFdpbmRvd1BvczNzTUVTQQkJTUFOR0xFKFdpbmRvd1BvczNzTUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3Mzc3ZBUkIJCU1BTkdMRShXaW5kb3dQb3Mzc3ZBUkIpCisjZGVmaW5lIGdsV2luZG93UG9zM3N2CQlNQU5HTEUoV2luZG93UG9zM3N2KQorI2RlZmluZSBnbFdpbmRvd1BvczNzdk1FU0EJCU1BTkdMRShXaW5kb3dQb3Mzc3ZNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczRkTUVTQQkJTUFOR0xFKFdpbmRvd1BvczRkTUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3M0ZHZNRVNBCQlNQU5HTEUoV2luZG93UG9zNGR2TUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3M0Zk1FU0EJCU1BTkdMRShXaW5kb3dQb3M0Zk1FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zNGZ2TUVTQQkJTUFOR0xFKFdpbmRvd1BvczRmdk1FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zNGlNRVNBCQlNQU5HTEUoV2luZG93UG9zNGlNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczRpdk1FU0EJCU1BTkdMRShXaW5kb3dQb3M0aXZNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczRzTUVTQQkJTUFOR0xFKFdpbmRvd1BvczRzTUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3M0c3ZNRVNBCQlNQU5HTEUoV2luZG93UG9zNHN2TUVTQSkKKyNkZWZpbmUgZ2xXcml0ZU1hc2tFWFQJCU1BTkdMRShXcml0ZU1hc2tFWFQpCisKKyNlbmRpZiAvKiBHTF9NQU5HTEVfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbGV4dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NDAwMjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL0dML2dsZXh0LmgKQEAgLTAsMCArMSwxMTQ4OCBAQAorI2lmbmRlZiBfX2dsZXh0X2hfCisjZGVmaW5lIF9fZ2xleHRfaF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorKiogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTEgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorKiogCisqKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorKiogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZC9vciBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorKiogIk1hdGVyaWFscyIpLCB0byBkZWFsIGluIHRoZSBNYXRlcmlhbHMgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisqKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisqKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIE1hdGVyaWFscywgYW5kIHRvCisqKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBNYXRlcmlhbHMgYXJlIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworKiogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorKiogCisqKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorKiogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgTWF0ZXJpYWxzLgorKiogCisqKiBUSEUgTUFURVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisqKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisqKiBNQVRFUklBTFMgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgTUFURVJJQUxTLgorKi8KKworLyogSGVhZGVyIGZpbGUgdmVyc2lvbiBudW1iZXIsIHJlcXVpcmVkIGJ5IE9wZW5HTCBBQkkgZm9yIExpbnV4ICovCisvKiBnbGV4dC5oIGxhc3QgdXBkYXRlZCAkRGF0ZTogMjAxMS0wOC0wOCAwMDozNDoyOSAtMDcwMCAoTW9uLCAwOCBBdWcgMjAxMSkgJCAqLworLyogQ3VycmVudCB2ZXJzaW9uIGF0IGh0dHA6Ly93d3cub3BlbmdsLm9yZy9yZWdpc3RyeS8gKi8KKyNkZWZpbmUgR0xfR0xFWFRfVkVSU0lPTiA3MgorLyogRnVuY3Rpb24gZGVjbGFyYXRpb24gbWFjcm9zIC0gdG8gbW92ZSBpbnRvIGdscGxhdGZvcm0uaCAqLworCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKEFQSUVOVFJZKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKSAmJiAhZGVmaW5lZChfX1NDSVRFQ0hfU05BUF9fKQorI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmbmRlZiBBUElFTlRSWQorI2RlZmluZSBBUElFTlRSWQorI2VuZGlmCisjaWZuZGVmIEFQSUVOVFJZUAorI2RlZmluZSBBUElFTlRSWVAgQVBJRU5UUlkgKgorI2VuZGlmCisjaWZuZGVmIEdMQVBJCisjZGVmaW5lIEdMQVBJIGV4dGVybgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEdMX1ZFUlNJT05fMV8yCisjZGVmaW5lIEdMX1VOU0lHTkVEX0JZVEVfM18zXzIgICAgICAgICAgICAweDgwMzIKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAgICAgICAgIDB4ODAzMworI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICAgICAgICAgMHg4MDM0CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84ICAgICAgICAgICAweDgwMzUKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzEwXzEwXzEwXzIgICAgICAgIDB4ODAzNgorI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfM0QgICAgICAgICAgICAgMHg4MDZBCisjZGVmaW5lIEdMX1BBQ0tfU0tJUF9JTUFHRVMgICAgICAgICAgICAgICAweDgwNkIKKyNkZWZpbmUgR0xfUEFDS19JTUFHRV9IRUlHSFQgICAgICAgICAgICAgIDB4ODA2QworI2RlZmluZSBHTF9VTlBBQ0tfU0tJUF9JTUFHRVMgICAgICAgICAgICAgMHg4MDZECisjZGVmaW5lIEdMX1VOUEFDS19JTUFHRV9IRUlHSFQgICAgICAgICAgICAweDgwNkUKKyNkZWZpbmUgR0xfVEVYVFVSRV8zRCAgICAgICAgICAgICAgICAgICAgIDB4ODA2RgorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFXzNEICAgICAgICAgICAgICAgMHg4MDcwCisjZGVmaW5lIEdMX1RFWFRVUkVfREVQVEggICAgICAgICAgICAgICAgICAweDgwNzEKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1IgICAgICAgICAgICAgICAgIDB4ODA3MgorI2RlZmluZSBHTF9NQVhfM0RfVEVYVFVSRV9TSVpFICAgICAgICAgICAgMHg4MDczCisjZGVmaW5lIEdMX1VOU0lHTkVEX0JZVEVfMl8zXzNfUkVWICAgICAgICAweDgzNjIKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV82XzUgICAgICAgICAgIDB4ODM2MworI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNV9SRVYgICAgICAgMHg4MzY0CisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzRfUkVWICAgICAweDgzNjUKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfMV81XzVfNV9SRVYgICAgIDB4ODM2NgorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYgICAgICAgMHg4MzY3CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF8yXzEwXzEwXzEwX1JFViAgICAweDgzNjgKKyNkZWZpbmUgR0xfQkdSICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBFMAorI2RlZmluZSBHTF9CR1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEUxCisjZGVmaW5lIEdMX01BWF9FTEVNRU5UU19WRVJUSUNFUyAgICAgICAgICAweDgwRTgKKyNkZWZpbmUgR0xfTUFYX0VMRU1FTlRTX0lORElDRVMgICAgICAgICAgIDB4ODBFOQorI2RlZmluZSBHTF9DTEFNUF9UT19FREdFICAgICAgICAgICAgICAgICAgMHg4MTJGCisjZGVmaW5lIEdMX1RFWFRVUkVfTUlOX0xPRCAgICAgICAgICAgICAgICAweDgxM0EKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQVhfTE9EICAgICAgICAgICAgICAgIDB4ODEzQgorI2RlZmluZSBHTF9URVhUVVJFX0JBU0VfTEVWRUwgICAgICAgICAgICAgMHg4MTNDCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFYX0xFVkVMICAgICAgICAgICAgICAweDgxM0QKKyNkZWZpbmUgR0xfU01PT1RIX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgIDB4MEIxMgorI2RlZmluZSBHTF9TTU9PVEhfUE9JTlRfU0laRV9HUkFOVUxBUklUWSAgMHgwQjEzCisjZGVmaW5lIEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFICAgICAgICAweDBCMjIKKyNkZWZpbmUgR0xfU01PT1RIX0xJTkVfV0lEVEhfR1JBTlVMQVJJVFkgIDB4MEIyMworI2RlZmluZSBHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgMHg4NDZFCisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzFfMl9ERVBSRUNBVEVECisjZGVmaW5lIEdMX1JFU0NBTEVfTk9STUFMICAgICAgICAgICAgICAgICAweDgwM0EKKyNkZWZpbmUgR0xfTElHSFRfTU9ERUxfQ09MT1JfQ09OVFJPTCAgICAgIDB4ODFGOAorI2RlZmluZSBHTF9TSU5HTEVfQ09MT1IgICAgICAgICAgICAgICAgICAgMHg4MUY5CisjZGVmaW5lIEdMX1NFUEFSQVRFX1NQRUNVTEFSX0NPTE9SICAgICAgICAweDgxRkEKKyNkZWZpbmUgR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFICAgICAgIDB4ODQ2RAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2ltYWdpbmcKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQ09MT1IgICAgICAgICAgICAgICAgIDB4ODAwMQorI2RlZmluZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1IgICAgICAgMHg4MDAyCisjZGVmaW5lIEdMX0NPTlNUQU5UX0FMUEhBICAgICAgICAgICAgICAgICAweDgwMDMKKyNkZWZpbmUgR0xfT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBICAgICAgIDB4ODAwNAorI2RlZmluZSBHTF9CTEVORF9DT0xPUiAgICAgICAgICAgICAgICAgICAgMHg4MDA1CisjZGVmaW5lIEdMX0ZVTkNfQUREICAgICAgICAgICAgICAgICAgICAgICAweDgwMDYKKyNkZWZpbmUgR0xfTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwNworI2RlZmluZSBHTF9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA4CisjZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OICAgICAgICAgICAgICAgICAweDgwMDkKKyNkZWZpbmUgR0xfRlVOQ19TVUJUUkFDVCAgICAgICAgICAgICAgICAgIDB4ODAwQQorI2RlZmluZSBHTF9GVU5DX1JFVkVSU0VfU1VCVFJBQ1QgICAgICAgICAgMHg4MDBCCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfaW1hZ2luZ19ERVBSRUNBVEVECisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OXzFEICAgICAgICAgICAgICAgICAweDgwMTAKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fMkQgICAgICAgICAgICAgICAgIDB4ODAxMQorI2RlZmluZSBHTF9TRVBBUkFCTEVfMkQgICAgICAgICAgICAgICAgICAgMHg4MDEyCisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0JPUkRFUl9NT0RFICAgICAgICAweDgwMTMKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fRklMVEVSX1NDQUxFICAgICAgIDB4ODAxNAorI2RlZmluZSBHTF9DT05WT0xVVElPTl9GSUxURVJfQklBUyAgICAgICAgMHg4MDE1CisjZGVmaW5lIEdMX1JFRFVDRSAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMTYKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fRk9STUFUICAgICAgICAgICAgIDB4ODAxNworI2RlZmluZSBHTF9DT05WT0xVVElPTl9XSURUSCAgICAgICAgICAgICAgMHg4MDE4CisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0hFSUdIVCAgICAgICAgICAgICAweDgwMTkKKyNkZWZpbmUgR0xfTUFYX0NPTlZPTFVUSU9OX1dJRFRIICAgICAgICAgIDB4ODAxQQorI2RlZmluZSBHTF9NQVhfQ09OVk9MVVRJT05fSEVJR0hUICAgICAgICAgMHg4MDFCCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fUkVEX1NDQUxFICAgICAweDgwMUMKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9HUkVFTl9TQ0FMRSAgIDB4ODAxRAorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0JMVUVfU0NBTEUgICAgMHg4MDFFCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fQUxQSEFfU0NBTEUgICAweDgwMUYKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9SRURfQklBUyAgICAgIDB4ODAyMAorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0dSRUVOX0JJQVMgICAgMHg4MDIxCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fQkxVRV9CSUFTICAgICAweDgwMjIKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9BTFBIQV9CSUFTICAgIDB4ODAyMworI2RlZmluZSBHTF9ISVNUT0dSQU0gICAgICAgICAgICAgICAgICAgICAgMHg4MDI0CisjZGVmaW5lIEdMX1BST1hZX0hJU1RPR1JBTSAgICAgICAgICAgICAgICAweDgwMjUKKyNkZWZpbmUgR0xfSElTVE9HUkFNX1dJRFRIICAgICAgICAgICAgICAgIDB4ODAyNgorI2RlZmluZSBHTF9ISVNUT0dSQU1fRk9STUFUICAgICAgICAgICAgICAgMHg4MDI3CisjZGVmaW5lIEdMX0hJU1RPR1JBTV9SRURfU0laRSAgICAgICAgICAgICAweDgwMjgKKyNkZWZpbmUgR0xfSElTVE9HUkFNX0dSRUVOX1NJWkUgICAgICAgICAgIDB4ODAyOQorI2RlZmluZSBHTF9ISVNUT0dSQU1fQkxVRV9TSVpFICAgICAgICAgICAgMHg4MDJBCisjZGVmaW5lIEdMX0hJU1RPR1JBTV9BTFBIQV9TSVpFICAgICAgICAgICAweDgwMkIKKyNkZWZpbmUgR0xfSElTVE9HUkFNX0xVTUlOQU5DRV9TSVpFICAgICAgIDB4ODAyQworI2RlZmluZSBHTF9ISVNUT0dSQU1fU0lOSyAgICAgICAgICAgICAgICAgMHg4MDJECisjZGVmaW5lIEdMX01JTk1BWCAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMkUKKyNkZWZpbmUgR0xfTUlOTUFYX0ZPUk1BVCAgICAgICAgICAgICAgICAgIDB4ODAyRgorI2RlZmluZSBHTF9NSU5NQVhfU0lOSyAgICAgICAgICAgICAgICAgICAgMHg4MDMwCisjZGVmaW5lIEdMX1RBQkxFX1RPT19MQVJHRSAgICAgICAgICAgICAgICAweDgwMzEKKyNkZWZpbmUgR0xfQ09MT1JfTUFUUklYICAgICAgICAgICAgICAgICAgIDB4ODBCMQorI2RlZmluZSBHTF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEggICAgICAgMHg4MEIyCisjZGVmaW5lIEdMX01BWF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEggICAweDgwQjMKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfUkVEX1NDQUxFICAgIDB4ODBCNAorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9HUkVFTl9TQ0FMRSAgMHg4MEI1CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0JMVUVfU0NBTEUgICAweDgwQjYKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQUxQSEFfU0NBTEUgIDB4ODBCNworI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9SRURfQklBUyAgICAgMHg4MEI4CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0dSRUVOX0JJQVMgICAweDgwQjkKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQkxVRV9CSUFTICAgIDB4ODBCQQorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9BTFBIQV9CSUFTICAgMHg4MEJCCisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFICAgICAgICAgICAgICAgICAgICAweDgwRDAKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9DT0xPUl9UQUJMRSAgIDB4ODBEMQorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9DT0xPUl9UQUJMRSAgMHg4MEQyCisjZGVmaW5lIEdMX1BST1hZX0NPTE9SX1RBQkxFICAgICAgICAgICAgICAweDgwRDMKKyNkZWZpbmUgR0xfUFJPWFlfUE9TVF9DT05WT0xVVElPTl9DT0xPUl9UQUJMRSAweDgwRDQKKyNkZWZpbmUgR0xfUFJPWFlfUE9TVF9DT0xPUl9NQVRSSVhfQ09MT1JfVEFCTEUgMHg4MEQ1CisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX1NDQUxFICAgICAgICAgICAgICAweDgwRDYKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfQklBUyAgICAgICAgICAgICAgIDB4ODBENworI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9GT1JNQVQgICAgICAgICAgICAgMHg4MEQ4CisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX1dJRFRIICAgICAgICAgICAgICAweDgwRDkKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfUkVEX1NJWkUgICAgICAgICAgIDB4ODBEQQorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9HUkVFTl9TSVpFICAgICAgICAgMHg4MERCCisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0JMVUVfU0laRSAgICAgICAgICAweDgwREMKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfQUxQSEFfU0laRSAgICAgICAgIDB4ODBERAorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9MVU1JTkFOQ0VfU0laRSAgICAgMHg4MERFCisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0lOVEVOU0lUWV9TSVpFICAgICAweDgwREYKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQk9SREVSICAgICAgICAgICAgICAgIDB4ODE1MQorI2RlZmluZSBHTF9SRVBMSUNBVEVfQk9SREVSICAgICAgICAgICAgICAgMHg4MTUzCisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0JPUkRFUl9DT0xPUiAgICAgICAweDgxNTQKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fMV8zCisjZGVmaW5lIEdMX1RFWFRVUkUwICAgICAgICAgICAgICAgICAgICAgICAweDg0QzAKKyNkZWZpbmUgR0xfVEVYVFVSRTEgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMQorI2RlZmluZSBHTF9URVhUVVJFMiAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMyCisjZGVmaW5lIEdMX1RFWFRVUkUzICAgICAgICAgICAgICAgICAgICAgICAweDg0QzMKKyNkZWZpbmUgR0xfVEVYVFVSRTQgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNAorI2RlZmluZSBHTF9URVhUVVJFNSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM1CisjZGVmaW5lIEdMX1RFWFRVUkU2ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzYKKyNkZWZpbmUgR0xfVEVYVFVSRTcgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNworI2RlZmluZSBHTF9URVhUVVJFOCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM4CisjZGVmaW5lIEdMX1RFWFRVUkU5ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzkKKyNkZWZpbmUgR0xfVEVYVFVSRTEwICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQQorI2RlZmluZSBHTF9URVhUVVJFMTEgICAgICAgICAgICAgICAgICAgICAgMHg4NENCCisjZGVmaW5lIEdMX1RFWFRVUkUxMiAgICAgICAgICAgICAgICAgICAgICAweDg0Q0MKKyNkZWZpbmUgR0xfVEVYVFVSRTEzICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRAorI2RlZmluZSBHTF9URVhUVVJFMTQgICAgICAgICAgICAgICAgICAgICAgMHg4NENFCisjZGVmaW5lIEdMX1RFWFRVUkUxNSAgICAgICAgICAgICAgICAgICAgICAweDg0Q0YKKyNkZWZpbmUgR0xfVEVYVFVSRTE2ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMAorI2RlZmluZSBHTF9URVhUVVJFMTcgICAgICAgICAgICAgICAgICAgICAgMHg4NEQxCisjZGVmaW5lIEdMX1RFWFRVUkUxOCAgICAgICAgICAgICAgICAgICAgICAweDg0RDIKKyNkZWZpbmUgR0xfVEVYVFVSRTE5ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMworI2RlZmluZSBHTF9URVhUVVJFMjAgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ0CisjZGVmaW5lIEdMX1RFWFRVUkUyMSAgICAgICAgICAgICAgICAgICAgICAweDg0RDUKKyNkZWZpbmUgR0xfVEVYVFVSRTIyICAgICAgICAgICAgICAgICAgICAgIDB4ODRENgorI2RlZmluZSBHTF9URVhUVVJFMjMgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ3CisjZGVmaW5lIEdMX1RFWFRVUkUyNCAgICAgICAgICAgICAgICAgICAgICAweDg0RDgKKyNkZWZpbmUgR0xfVEVYVFVSRTI1ICAgICAgICAgICAgICAgICAgICAgIDB4ODREOQorI2RlZmluZSBHTF9URVhUVVJFMjYgICAgICAgICAgICAgICAgICAgICAgMHg4NERBCisjZGVmaW5lIEdMX1RFWFRVUkUyNyAgICAgICAgICAgICAgICAgICAgICAweDg0REIKKyNkZWZpbmUgR0xfVEVYVFVSRTI4ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQworI2RlZmluZSBHTF9URVhUVVJFMjkgICAgICAgICAgICAgICAgICAgICAgMHg4NERECisjZGVmaW5lIEdMX1RFWFRVUkUzMCAgICAgICAgICAgICAgICAgICAgICAweDg0REUKKyNkZWZpbmUgR0xfVEVYVFVSRTMxICAgICAgICAgICAgICAgICAgICAgIDB4ODRERgorI2RlZmluZSBHTF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAgICAgICAgMHg4NEUwCisjZGVmaW5lIEdMX01VTFRJU0FNUExFICAgICAgICAgICAgICAgICAgICAweDgwOUQKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFICAgICAgIDB4ODA5RQorI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fT05FICAgICAgICAgICAgMHg4MDlGCisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRSAgICAgICAgICAgICAgICAweDgwQTAKKyNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlMgICAgICAgICAgICAgICAgIDB4ODBBOAorI2RlZmluZSBHTF9TQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEE5CisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRSAgICAgICAgICAweDgwQUEKKyNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVCAgICAgICAgIDB4ODBBQgorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQICAgICAgICAgICAgICAgMHg4NTEzCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUCAgICAgICAweDg1MTQKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICAgIDB4ODUxNQorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ggICAgMHg4NTE2CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWSAgICAweDg1MTcKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZICAgIDB4ODUxOAorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ogICAgMHg4NTE5CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWiAgICAweDg1MUEKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV9DVUJFX01BUCAgICAgICAgIDB4ODUxQgorI2RlZmluZSBHTF9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFICAgICAgMHg4NTFDCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCICAgICAgICAgICAgICAgICAweDg0RUQKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBICAgICAgICAgICAgICAgIDB4ODRFRQorI2RlZmluZSBHTF9URVhUVVJFX0NPTVBSRVNTSU9OX0hJTlQgICAgICAgMHg4NEVGCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUFJFU1NFRF9JTUFHRV9TSVpFICAweDg2QTAKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QUkVTU0VEICAgICAgICAgICAgIDB4ODZBMQorI2RlZmluZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgMHg4NkEyCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAweDg2QTMKKyNkZWZpbmUgR0xfQ0xBTVBfVE9fQk9SREVSICAgICAgICAgICAgICAgIDB4ODEyRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8xXzNfREVQUkVDQVRFRAorI2RlZmluZSBHTF9DTElFTlRfQUNUSVZFX1RFWFRVUkUgICAgICAgICAgMHg4NEUxCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX1VOSVRTICAgICAgICAgICAgICAweDg0RTIKKyNkZWZpbmUgR0xfVFJBTlNQT1NFX01PREVMVklFV19NQVRSSVggICAgIDB4ODRFMworI2RlZmluZSBHTF9UUkFOU1BPU0VfUFJPSkVDVElPTl9NQVRSSVggICAgMHg4NEU0CisjZGVmaW5lIEdMX1RSQU5TUE9TRV9URVhUVVJFX01BVFJJWCAgICAgICAweDg0RTUKKyNkZWZpbmUgR0xfVFJBTlNQT1NFX0NPTE9SX01BVFJJWCAgICAgICAgIDB4ODRFNgorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CSVQgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBHTF9OT1JNQUxfTUFQICAgICAgICAgICAgICAgICAgICAgMHg4NTExCisjZGVmaW5lIEdMX1JFRkxFQ1RJT05fTUFQICAgICAgICAgICAgICAgICAweDg1MTIKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9BTFBIQSAgICAgICAgICAgICAgIDB4ODRFOQorI2RlZmluZSBHTF9DT01QUkVTU0VEX0xVTUlOQU5DRSAgICAgICAgICAgMHg4NEVBCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfTFVNSU5BTkNFX0FMUEhBICAgICAweDg0RUIKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9JTlRFTlNJVFkgICAgICAgICAgIDB4ODRFQworI2RlZmluZSBHTF9DT01CSU5FICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTcwCisjZGVmaW5lIEdMX0NPTUJJTkVfUkdCICAgICAgICAgICAgICAgICAgICAweDg1NzEKKyNkZWZpbmUgR0xfQ09NQklORV9BTFBIQSAgICAgICAgICAgICAgICAgIDB4ODU3MgorI2RlZmluZSBHTF9TT1VSQ0UwX1JHQiAgICAgICAgICAgICAgICAgICAgMHg4NTgwCisjZGVmaW5lIEdMX1NPVVJDRTFfUkdCICAgICAgICAgICAgICAgICAgICAweDg1ODEKKyNkZWZpbmUgR0xfU09VUkNFMl9SR0IgICAgICAgICAgICAgICAgICAgIDB4ODU4MgorI2RlZmluZSBHTF9TT1VSQ0UwX0FMUEhBICAgICAgICAgICAgICAgICAgMHg4NTg4CisjZGVmaW5lIEdMX1NPVVJDRTFfQUxQSEEgICAgICAgICAgICAgICAgICAweDg1ODkKKyNkZWZpbmUgR0xfU09VUkNFMl9BTFBIQSAgICAgICAgICAgICAgICAgIDB4ODU4QQorI2RlZmluZSBHTF9PUEVSQU5EMF9SR0IgICAgICAgICAgICAgICAgICAgMHg4NTkwCisjZGVmaW5lIEdMX09QRVJBTkQxX1JHQiAgICAgICAgICAgICAgICAgICAweDg1OTEKKyNkZWZpbmUgR0xfT1BFUkFORDJfUkdCICAgICAgICAgICAgICAgICAgIDB4ODU5MgorI2RlZmluZSBHTF9PUEVSQU5EMF9BTFBIQSAgICAgICAgICAgICAgICAgMHg4NTk4CisjZGVmaW5lIEdMX09QRVJBTkQxX0FMUEhBICAgICAgICAgICAgICAgICAweDg1OTkKKyNkZWZpbmUgR0xfT1BFUkFORDJfQUxQSEEgICAgICAgICAgICAgICAgIDB4ODU5QQorI2RlZmluZSBHTF9SR0JfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMHg4NTczCisjZGVmaW5lIEdMX0FERF9TSUdORUQgICAgICAgICAgICAgICAgICAgICAweDg1NzQKKyNkZWZpbmUgR0xfSU5URVJQT0xBVEUgICAgICAgICAgICAgICAgICAgIDB4ODU3NQorI2RlZmluZSBHTF9TVUJUUkFDVCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEU3CisjZGVmaW5lIEdMX0NPTlNUQU5UICAgICAgICAgICAgICAgICAgICAgICAweDg1NzYKKyNkZWZpbmUgR0xfUFJJTUFSWV9DT0xPUiAgICAgICAgICAgICAgICAgIDB4ODU3NworI2RlZmluZSBHTF9QUkVWSU9VUyAgICAgICAgICAgICAgICAgICAgICAgMHg4NTc4CisjZGVmaW5lIEdMX0RPVDNfUkdCICAgICAgICAgICAgICAgICAgICAgICAweDg2QUUKKyNkZWZpbmUgR0xfRE9UM19SR0JBICAgICAgICAgICAgICAgICAgICAgIDB4ODZBRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8xXzQKKyNkZWZpbmUgR0xfQkxFTkRfRFNUX1JHQiAgICAgICAgICAgICAgICAgIDB4ODBDOAorI2RlZmluZSBHTF9CTEVORF9TUkNfUkdCICAgICAgICAgICAgICAgICAgMHg4MEM5CisjZGVmaW5lIEdMX0JMRU5EX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAweDgwQ0EKKyNkZWZpbmUgR0xfQkxFTkRfU1JDX0FMUEhBICAgICAgICAgICAgICAgIDB4ODBDQgorI2RlZmluZSBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFICAgICAgMHg4MTI4CisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDE2ICAgICAgICAgICAgICAweDgxQTUKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMjQgICAgICAgICAgICAgIDB4ODFBNgorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQzMiAgICAgICAgICAgICAgMHg4MUE3CisjZGVmaW5lIEdMX01JUlJPUkVEX1JFUEVBVCAgICAgICAgICAgICAgICAweDgzNzAKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfTE9EX0JJQVMgICAgICAgICAgIDB4ODRGRAorI2RlZmluZSBHTF9URVhUVVJFX0xPRF9CSUFTICAgICAgICAgICAgICAgMHg4NTAxCisjZGVmaW5lIEdMX0lOQ1JfV1JBUCAgICAgICAgICAgICAgICAgICAgICAweDg1MDcKKyNkZWZpbmUgR0xfREVDUl9XUkFQICAgICAgICAgICAgICAgICAgICAgIDB4ODUwOAorI2RlZmluZSBHTF9URVhUVVJFX0RFUFRIX1NJWkUgICAgICAgICAgICAgMHg4ODRBCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUEFSRV9NT0RFICAgICAgICAgICAweDg4NEMKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QQVJFX0ZVTkMgICAgICAgICAgIDB4ODg0RAorI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8xXzRfREVQUkVDQVRFRAorI2RlZmluZSBHTF9QT0lOVF9TSVpFX01JTiAgICAgICAgICAgICAgICAgMHg4MTI2CisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfTUFYICAgICAgICAgICAgICAgICAweDgxMjcKKyNkZWZpbmUgR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT04gICAgIDB4ODEyOQorI2RlZmluZSBHTF9HRU5FUkFURV9NSVBNQVAgICAgICAgICAgICAgICAgMHg4MTkxCisjZGVmaW5lIEdMX0dFTkVSQVRFX01JUE1BUF9ISU5UICAgICAgICAgICAweDgxOTIKKyNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFICAgICAgICAgIDB4ODQ1MAorI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURSAgICAgICAgICAgICAgICAgMHg4NDUxCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0RFUFRIICAgICAgICAgICAgICAgICAweDg0NTIKKyNkZWZpbmUgR0xfQ1VSUkVOVF9GT0dfQ09PUkRJTkFURSAgICAgICAgIDB4ODQ1MworI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9UWVBFICAgICAgMHg4NDU0CisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX1NUUklERSAgICAweDg0NTUKKyNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfUE9JTlRFUiAgIDB4ODQ1NgorI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWSAgICAgICAgICAgMHg4NDU3CisjZGVmaW5lIEdMX0NPTE9SX1NVTSAgICAgICAgICAgICAgICAgICAgICAweDg0NTgKKyNkZWZpbmUgR0xfQ1VSUkVOVF9TRUNPTkRBUllfQ09MT1IgICAgICAgIDB4ODQ1OQorI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfU0laRSAgICAgMHg4NDVBCisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9UWVBFICAgICAweDg0NUIKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX1NUUklERSAgIDB4ODQ1QworI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfUE9JTlRFUiAgMHg4NDVECisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWSAgICAgICAgICAweDg0NUUKKyNkZWZpbmUgR0xfVEVYVFVSRV9GSUxURVJfQ09OVFJPTCAgICAgICAgIDB4ODUwMAorI2RlZmluZSBHTF9ERVBUSF9URVhUVVJFX01PREUgICAgICAgICAgICAgMHg4ODRCCisjZGVmaW5lIEdMX0NPTVBBUkVfUl9UT19URVhUVVJFICAgICAgICAgICAweDg4NEUKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fMV81CisjZGVmaW5lIEdMX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAweDg3NjQKKyNkZWZpbmUgR0xfQlVGRkVSX1VTQUdFICAgICAgICAgICAgICAgICAgIDB4ODc2NQorI2RlZmluZSBHTF9RVUVSWV9DT1VOVEVSX0JJVFMgICAgICAgICAgICAgMHg4ODY0CisjZGVmaW5lIEdMX0NVUlJFTlRfUVVFUlkgICAgICAgICAgICAgICAgICAweDg4NjUKKyNkZWZpbmUgR0xfUVVFUllfUkVTVUxUICAgICAgICAgICAgICAgICAgIDB4ODg2NgorI2RlZmluZSBHTF9RVUVSWV9SRVNVTFRfQVZBSUxBQkxFICAgICAgICAgMHg4ODY3CisjZGVmaW5lIEdMX0FSUkFZX0JVRkZFUiAgICAgICAgICAgICAgICAgICAweDg4OTIKKyNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIgICAgICAgICAgIDB4ODg5MworI2RlZmluZSBHTF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgMHg4ODk0CisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAweDg4OTUKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORyAweDg4OUYKKyNkZWZpbmUgR0xfUkVBRF9PTkxZICAgICAgICAgICAgICAgICAgICAgIDB4ODhCOAorI2RlZmluZSBHTF9XUklURV9PTkxZICAgICAgICAgICAgICAgICAgICAgMHg4OEI5CisjZGVmaW5lIEdMX1JFQURfV1JJVEUgICAgICAgICAgICAgICAgICAgICAweDg4QkEKKyNkZWZpbmUgR0xfQlVGRkVSX0FDQ0VTUyAgICAgICAgICAgICAgICAgIDB4ODhCQgorI2RlZmluZSBHTF9CVUZGRVJfTUFQUEVEICAgICAgICAgICAgICAgICAgMHg4OEJDCisjZGVmaW5lIEdMX0JVRkZFUl9NQVBfUE9JTlRFUiAgICAgICAgICAgICAweDg4QkQKKyNkZWZpbmUgR0xfU1RSRUFNX0RSQVcgICAgICAgICAgICAgICAgICAgIDB4ODhFMAorI2RlZmluZSBHTF9TVFJFQU1fUkVBRCAgICAgICAgICAgICAgICAgICAgMHg4OEUxCisjZGVmaW5lIEdMX1NUUkVBTV9DT1BZICAgICAgICAgICAgICAgICAgICAweDg4RTIKKyNkZWZpbmUgR0xfU1RBVElDX0RSQVcgICAgICAgICAgICAgICAgICAgIDB4ODhFNAorI2RlZmluZSBHTF9TVEFUSUNfUkVBRCAgICAgICAgICAgICAgICAgICAgMHg4OEU1CisjZGVmaW5lIEdMX1NUQVRJQ19DT1BZICAgICAgICAgICAgICAgICAgICAweDg4RTYKKyNkZWZpbmUgR0xfRFlOQU1JQ19EUkFXICAgICAgICAgICAgICAgICAgIDB4ODhFOAorI2RlZmluZSBHTF9EWU5BTUlDX1JFQUQgICAgICAgICAgICAgICAgICAgMHg4OEU5CisjZGVmaW5lIEdMX0RZTkFNSUNfQ09QWSAgICAgICAgICAgICAgICAgICAweDg4RUEKKyNkZWZpbmUgR0xfU0FNUExFU19QQVNTRUQgICAgICAgICAgICAgICAgIDB4ODkxNAorI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8xXzVfREVQUkVDQVRFRAorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgMHg4ODk2CisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElORyAgICAweDg4OTcKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgIDB4ODg5OAorI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgMHg4ODk5CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgMHg4ODlBCisjZGVmaW5lIEdMX0VER0VfRkxBR19BUlJBWV9CVUZGRVJfQklORElORyAweDg4OUIKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HIDB4ODg5QworI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9CVUZGRVJfQklORElORyAweDg4OUQKKyNkZWZpbmUgR0xfV0VJR0hUX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgIDB4ODg5RQorI2RlZmluZSBHTF9GT0dfQ09PUkRfU1JDICAgICAgICAgICAgICAgICAgMHg4NDUwCisjZGVmaW5lIEdMX0ZPR19DT09SRCAgICAgICAgICAgICAgICAgICAgICAweDg0NTEKKyNkZWZpbmUgR0xfQ1VSUkVOVF9GT0dfQ09PUkQgICAgICAgICAgICAgIDB4ODQ1MworI2RlZmluZSBHTF9GT0dfQ09PUkRfQVJSQVlfVFlQRSAgICAgICAgICAgMHg4NDU0CisjZGVmaW5lIEdMX0ZPR19DT09SRF9BUlJBWV9TVFJJREUgICAgICAgICAweDg0NTUKKyNkZWZpbmUgR0xfRk9HX0NPT1JEX0FSUkFZX1BPSU5URVIgICAgICAgIDB4ODQ1NgorI2RlZmluZSBHTF9GT0dfQ09PUkRfQVJSQVkgICAgICAgICAgICAgICAgMHg4NDU3CisjZGVmaW5lIEdMX0ZPR19DT09SRF9BUlJBWV9CVUZGRVJfQklORElORyAweDg4OUQKKyNkZWZpbmUgR0xfU1JDMF9SR0IgICAgICAgICAgICAgICAgICAgICAgIDB4ODU4MAorI2RlZmluZSBHTF9TUkMxX1JHQiAgICAgICAgICAgICAgICAgICAgICAgMHg4NTgxCisjZGVmaW5lIEdMX1NSQzJfUkdCICAgICAgICAgICAgICAgICAgICAgICAweDg1ODIKKyNkZWZpbmUgR0xfU1JDMF9BTFBIQSAgICAgICAgICAgICAgICAgICAgIDB4ODU4OAorI2RlZmluZSBHTF9TUkMxX0FMUEhBICAgICAgICAgICAgICAgICAgICAgMHg4NTg5CisjZGVmaW5lIEdMX1NSQzJfQUxQSEEgICAgICAgICAgICAgICAgICAgICAweDg1OEEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fMl8wCisjZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OX1JHQiAgICAgICAgICAgICAweDgwMDkKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9FTkFCTEVEICAgIDB4ODYyMgorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NJWkUgICAgICAgMHg4NjIzCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFICAgICAweDg2MjQKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFICAgICAgIDB4ODYyNQorI2RlZmluZSBHTF9DVVJSRU5UX1ZFUlRFWF9BVFRSSUIgICAgICAgICAgMHg4NjI2CisjZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX1BPSU5UX1NJWkUgICAgICAweDg2NDIKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9QT0lOVEVSICAgIDB4ODY0NQorI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfRlVOQyAgICAgICAgICAgICAgMHg4ODAwCisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19GQUlMICAgICAgICAgICAgICAweDg4MDEKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTCAgIDB4ODgwMgorI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9QQVNTICAgMHg4ODAzCisjZGVmaW5lIEdMX01BWF9EUkFXX0JVRkZFUlMgICAgICAgICAgICAgICAweDg4MjQKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIwICAgICAgICAgICAgICAgICAgIDB4ODgyNQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjEgICAgICAgICAgICAgICAgICAgMHg4ODI2CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMiAgICAgICAgICAgICAgICAgICAweDg4MjcKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIzICAgICAgICAgICAgICAgICAgIDB4ODgyOAorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjQgICAgICAgICAgICAgICAgICAgMHg4ODI5CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSNSAgICAgICAgICAgICAgICAgICAweDg4MkEKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI2ICAgICAgICAgICAgICAgICAgIDB4ODgyQgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjcgICAgICAgICAgICAgICAgICAgMHg4ODJDCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSOCAgICAgICAgICAgICAgICAgICAweDg4MkQKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI5ICAgICAgICAgICAgICAgICAgIDB4ODgyRQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjEwICAgICAgICAgICAgICAgICAgMHg4ODJGCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTEgICAgICAgICAgICAgICAgICAweDg4MzAKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMiAgICAgICAgICAgICAgICAgIDB4ODgzMQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjEzICAgICAgICAgICAgICAgICAgMHg4ODMyCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTQgICAgICAgICAgICAgICAgICAweDg4MzMKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxNSAgICAgICAgICAgICAgICAgIDB4ODgzNAorI2RlZmluZSBHTF9CTEVORF9FUVVBVElPTl9BTFBIQSAgICAgICAgICAgMHg4ODNECisjZGVmaW5lIEdMX01BWF9WRVJURVhfQVRUUklCUyAgICAgICAgICAgICAweDg4NjkKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9OT1JNQUxJWkVEIDB4ODg2QQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9JTUFHRV9VTklUUyAgICAgICAgMHg4ODcyCisjZGVmaW5lIEdMX0ZSQUdNRU5UX1NIQURFUiAgICAgICAgICAgICAgICAweDhCMzAKKyNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUiAgICAgICAgICAgICAgICAgIDB4OEIzMQorI2RlZmluZSBHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTIDB4OEI0OQorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UUyAgMHg4QjRBCisjZGVmaW5lIEdMX01BWF9WQVJZSU5HX0ZMT0FUUyAgICAgICAgICAgICAweDhCNEIKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTIDB4OEI0QworI2RlZmluZSBHTF9NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyAweDhCNEQKKyNkZWZpbmUgR0xfU0hBREVSX1RZUEUgICAgICAgICAgICAgICAgICAgIDB4OEI0RgorI2RlZmluZSBHTF9GTE9BVF9WRUMyICAgICAgICAgICAgICAgICAgICAgMHg4QjUwCisjZGVmaW5lIEdMX0ZMT0FUX1ZFQzMgICAgICAgICAgICAgICAgICAgICAweDhCNTEKKyNkZWZpbmUgR0xfRkxPQVRfVkVDNCAgICAgICAgICAgICAgICAgICAgIDB4OEI1MgorI2RlZmluZSBHTF9JTlRfVkVDMiAgICAgICAgICAgICAgICAgICAgICAgMHg4QjUzCisjZGVmaW5lIEdMX0lOVF9WRUMzICAgICAgICAgICAgICAgICAgICAgICAweDhCNTQKKyNkZWZpbmUgR0xfSU5UX1ZFQzQgICAgICAgICAgICAgICAgICAgICAgIDB4OEI1NQorI2RlZmluZSBHTF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QjU2CisjZGVmaW5lIEdMX0JPT0xfVkVDMiAgICAgICAgICAgICAgICAgICAgICAweDhCNTcKKyNkZWZpbmUgR0xfQk9PTF9WRUMzICAgICAgICAgICAgICAgICAgICAgIDB4OEI1OAorI2RlZmluZSBHTF9CT09MX1ZFQzQgICAgICAgICAgICAgICAgICAgICAgMHg4QjU5CisjZGVmaW5lIEdMX0ZMT0FUX01BVDIgICAgICAgICAgICAgICAgICAgICAweDhCNUEKKyNkZWZpbmUgR0xfRkxPQVRfTUFUMyAgICAgICAgICAgICAgICAgICAgIDB4OEI1QgorI2RlZmluZSBHTF9GTE9BVF9NQVQ0ICAgICAgICAgICAgICAgICAgICAgMHg4QjVDCisjZGVmaW5lIEdMX1NBTVBMRVJfMUQgICAgICAgICAgICAgICAgICAgICAweDhCNUQKKyNkZWZpbmUgR0xfU0FNUExFUl8yRCAgICAgICAgICAgICAgICAgICAgIDB4OEI1RQorI2RlZmluZSBHTF9TQU1QTEVSXzNEICAgICAgICAgICAgICAgICAgICAgMHg4QjVGCisjZGVmaW5lIEdMX1NBTVBMRVJfQ1VCRSAgICAgICAgICAgICAgICAgICAweDhCNjAKKyNkZWZpbmUgR0xfU0FNUExFUl8xRF9TSEFET1cgICAgICAgICAgICAgIDB4OEI2MQorI2RlZmluZSBHTF9TQU1QTEVSXzJEX1NIQURPVyAgICAgICAgICAgICAgMHg4QjYyCisjZGVmaW5lIEdMX0RFTEVURV9TVEFUVVMgICAgICAgICAgICAgICAgICAweDhCODAKKyNkZWZpbmUgR0xfQ09NUElMRV9TVEFUVVMgICAgICAgICAgICAgICAgIDB4OEI4MQorI2RlZmluZSBHTF9MSU5LX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgMHg4QjgyCisjZGVmaW5lIEdMX1ZBTElEQVRFX1NUQVRVUyAgICAgICAgICAgICAgICAweDhCODMKKyNkZWZpbmUgR0xfSU5GT19MT0dfTEVOR1RIICAgICAgICAgICAgICAgIDB4OEI4NAorI2RlZmluZSBHTF9BVFRBQ0hFRF9TSEFERVJTICAgICAgICAgICAgICAgMHg4Qjg1CisjZGVmaW5lIEdMX0FDVElWRV9VTklGT1JNUyAgICAgICAgICAgICAgICAweDhCODYKKyNkZWZpbmUgR0xfQUNUSVZFX1VOSUZPUk1fTUFYX0xFTkdUSCAgICAgIDB4OEI4NworI2RlZmluZSBHTF9TSEFERVJfU09VUkNFX0xFTkdUSCAgICAgICAgICAgMHg4Qjg4CisjZGVmaW5lIEdMX0FDVElWRV9BVFRSSUJVVEVTICAgICAgICAgICAgICAweDhCODkKKyNkZWZpbmUgR0xfQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RIICAgIDB4OEI4QQorI2RlZmluZSBHTF9GUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UIDB4OEI4QgorI2RlZmluZSBHTF9TSEFESU5HX0xBTkdVQUdFX1ZFUlNJT04gICAgICAgMHg4QjhDCisjZGVmaW5lIEdMX0NVUlJFTlRfUFJPR1JBTSAgICAgICAgICAgICAgICAweDhCOEQKKyNkZWZpbmUgR0xfUE9JTlRfU1BSSVRFX0NPT1JEX09SSUdJTiAgICAgIDB4OENBMAorI2RlZmluZSBHTF9MT1dFUl9MRUZUICAgICAgICAgICAgICAgICAgICAgMHg4Q0ExCisjZGVmaW5lIEdMX1VQUEVSX0xFRlQgICAgICAgICAgICAgICAgICAgICAweDhDQTIKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1JFRiAgICAgICAgICAgICAgIDB4OENBMworI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfVkFMVUVfTUFTSyAgICAgICAgMHg4Q0E0CisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19XUklURU1BU0sgICAgICAgICAweDhDQTUKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fMl8wX0RFUFJFQ0FURUQKKyNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fVFdPX1NJREUgICAgICAgIDB4ODY0MworI2RlZmluZSBHTF9QT0lOVF9TUFJJVEUgICAgICAgICAgICAgICAgICAgMHg4ODYxCisjZGVmaW5lIEdMX0NPT1JEX1JFUExBQ0UgICAgICAgICAgICAgICAgICAweDg4NjIKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfQ09PUkRTICAgICAgICAgICAgIDB4ODg3MQorI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8yXzEKKyNkZWZpbmUgR0xfUElYRUxfUEFDS19CVUZGRVIgICAgICAgICAgICAgIDB4ODhFQgorI2RlZmluZSBHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSICAgICAgICAgICAgMHg4OEVDCisjZGVmaW5lIEdMX1BJWEVMX1BBQ0tfQlVGRkVSX0JJTkRJTkcgICAgICAweDg4RUQKKyNkZWZpbmUgR0xfUElYRUxfVU5QQUNLX0JVRkZFUl9CSU5ESU5HICAgIDB4ODhFRgorI2RlZmluZSBHTF9GTE9BVF9NQVQyeDMgICAgICAgICAgICAgICAgICAgMHg4QjY1CisjZGVmaW5lIEdMX0ZMT0FUX01BVDJ4NCAgICAgICAgICAgICAgICAgICAweDhCNjYKKyNkZWZpbmUgR0xfRkxPQVRfTUFUM3gyICAgICAgICAgICAgICAgICAgIDB4OEI2NworI2RlZmluZSBHTF9GTE9BVF9NQVQzeDQgICAgICAgICAgICAgICAgICAgMHg4QjY4CisjZGVmaW5lIEdMX0ZMT0FUX01BVDR4MiAgICAgICAgICAgICAgICAgICAweDhCNjkKKyNkZWZpbmUgR0xfRkxPQVRfTUFUNHgzICAgICAgICAgICAgICAgICAgIDB4OEI2QQorI2RlZmluZSBHTF9TUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzQwCisjZGVmaW5lIEdMX1NSR0I4ICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDNDEKKyNkZWZpbmUgR0xfU1JHQl9BTFBIQSAgICAgICAgICAgICAgICAgICAgIDB4OEM0MgorI2RlZmluZSBHTF9TUkdCOF9BTFBIQTggICAgICAgICAgICAgICAgICAgMHg4QzQzCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQiAgICAgICAgICAgICAgICAweDhDNDgKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCX0FMUEhBICAgICAgICAgIDB4OEM0OQorI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8yXzFfREVQUkVDQVRFRAorI2RlZmluZSBHTF9DVVJSRU5UX1JBU1RFUl9TRUNPTkRBUllfQ09MT1IgMHg4NDVGCisjZGVmaW5lIEdMX1NMVU1JTkFOQ0VfQUxQSEEgICAgICAgICAgICAgICAweDhDNDQKKyNkZWZpbmUgR0xfU0xVTUlOQU5DRThfQUxQSEE4ICAgICAgICAgICAgIDB4OEM0NQorI2RlZmluZSBHTF9TTFVNSU5BTkNFICAgICAgICAgICAgICAgICAgICAgMHg4QzQ2CisjZGVmaW5lIEdMX1NMVU1JTkFOQ0U4ICAgICAgICAgICAgICAgICAgICAweDhDNDcKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TTFVNSU5BTkNFICAgICAgICAgIDB4OEM0QQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NMVU1JTkFOQ0VfQUxQSEEgICAgMHg4QzRCCisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzNfMAorI2RlZmluZSBHTF9DT01QQVJFX1JFRl9UT19URVhUVVJFICAgICAgICAgMHg4ODRFCisjZGVmaW5lIEdMX0NMSVBfRElTVEFOQ0UwICAgICAgICAgICAgICAgICAweDMwMDAKKyNkZWZpbmUgR0xfQ0xJUF9ESVNUQU5DRTEgICAgICAgICAgICAgICAgIDB4MzAwMQorI2RlZmluZSBHTF9DTElQX0RJU1RBTkNFMiAgICAgICAgICAgICAgICAgMHgzMDAyCisjZGVmaW5lIEdMX0NMSVBfRElTVEFOQ0UzICAgICAgICAgICAgICAgICAweDMwMDMKKyNkZWZpbmUgR0xfQ0xJUF9ESVNUQU5DRTQgICAgICAgICAgICAgICAgIDB4MzAwNAorI2RlZmluZSBHTF9DTElQX0RJU1RBTkNFNSAgICAgICAgICAgICAgICAgMHgzMDA1CisjZGVmaW5lIEdMX0NMSVBfRElTVEFOQ0U2ICAgICAgICAgICAgICAgICAweDMwMDYKKyNkZWZpbmUgR0xfQ0xJUF9ESVNUQU5DRTcgICAgICAgICAgICAgICAgIDB4MzAwNworI2RlZmluZSBHTF9NQVhfQ0xJUF9ESVNUQU5DRVMgICAgICAgICAgICAgMHgwRDMyCisjZGVmaW5lIEdMX01BSk9SX1ZFUlNJT04gICAgICAgICAgICAgICAgICAweDgyMUIKKyNkZWZpbmUgR0xfTUlOT1JfVkVSU0lPTiAgICAgICAgICAgICAgICAgIDB4ODIxQworI2RlZmluZSBHTF9OVU1fRVhURU5TSU9OUyAgICAgICAgICAgICAgICAgMHg4MjFECisjZGVmaW5lIEdMX0NPTlRFWFRfRkxBR1MgICAgICAgICAgICAgICAgICAweDgyMUUKKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSICAgICAgICAgICAgICAgICAgIDB4ODIyMworI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUiAgICAgICAgICAgICAgICAgMHg4MjI0CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkVEICAgICAgICAgICAgICAgICAweDgyMjUKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SRyAgICAgICAgICAgICAgICAgIDB4ODIyNgorI2RlZmluZSBHTF9DT05URVhUX0ZMQUdfRk9SV0FSRF9DT01QQVRJQkxFX0JJVCAweDAwMDEKKyNkZWZpbmUgR0xfUkdCQTMyRiAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgxNAorI2RlZmluZSBHTF9SR0IzMkYgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODE1CisjZGVmaW5lIEdMX1JHQkExNkYgICAgICAgICAgICAgICAgICAgICAgICAweDg4MUEKKyNkZWZpbmUgR0xfUkdCMTZGICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgxQgorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0lOVEVHRVIgICAgMHg4OEZECisjZGVmaW5lIEdMX01BWF9BUlJBWV9URVhUVVJFX0xBWUVSUyAgICAgICAweDg4RkYKKyNkZWZpbmUgR0xfTUlOX1BST0dSQU1fVEVYRUxfT0ZGU0VUICAgICAgIDB4ODkwNAorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9URVhFTF9PRkZTRVQgICAgICAgMHg4OTA1CisjZGVmaW5lIEdMX0NMQU1QX1JFQURfQ09MT1IgICAgICAgICAgICAgICAweDg5MUMKKyNkZWZpbmUgR0xfRklYRURfT05MWSAgICAgICAgICAgICAgICAgICAgIDB4ODkxRAorI2RlZmluZSBHTF9NQVhfVkFSWUlOR19DT01QT05FTlRTICAgICAgICAgMHg4QjRCCisjZGVmaW5lIEdMX1RFWFRVUkVfMURfQVJSQVkgICAgICAgICAgICAgICAweDhDMTgKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV8xRF9BUlJBWSAgICAgICAgIDB4OEMxOQorI2RlZmluZSBHTF9URVhUVVJFXzJEX0FSUkFZICAgICAgICAgICAgICAgMHg4QzFBCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfMkRfQVJSQVkgICAgICAgICAweDhDMUIKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HXzFEX0FSUkFZICAgICAgIDB4OEMxQworI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfMkRfQVJSQVkgICAgICAgMHg4QzFECisjZGVmaW5lIEdMX1IxMUZfRzExRl9CMTBGICAgICAgICAgICAgICAgICAweDhDM0EKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzEwRl8xMUZfMTFGX1JFViAgIDB4OEMzQgorI2RlZmluZSBHTF9SR0I5X0U1ICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzNECisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF81XzlfOV85X1JFViAgICAgICAweDhDM0UKKyNkZWZpbmUgR0xfVEVYVFVSRV9TSEFSRURfU0laRSAgICAgICAgICAgIDB4OEMzRgorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfVkFSWUlOR19NQVhfTEVOR1RIIDB4OEM3NgorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX01PREUgMHg4QzdGCisjZGVmaW5lIEdMX01BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfU0VQQVJBVEVfQ09NUE9ORU5UUyAweDhDODAKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX1ZBUllJTkdTICAgIDB4OEM4MworI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX1NUQVJUIDB4OEM4NAorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX1NJWkUgMHg4Qzg1CisjZGVmaW5lIEdMX1BSSU1JVElWRVNfR0VORVJBVEVEICAgICAgICAgICAweDhDODcKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX1BSSU1JVElWRVNfV1JJVFRFTiAweDhDODgKKyNkZWZpbmUgR0xfUkFTVEVSSVpFUl9ESVNDQVJEICAgICAgICAgICAgIDB4OEM4OQorI2RlZmluZSBHTF9NQVhfVFJBTlNGT1JNX0ZFRURCQUNLX0lOVEVSTEVBVkVEX0NPTVBPTkVOVFMgMHg4QzhBCisjZGVmaW5lIEdMX01BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfU0VQQVJBVEVfQVRUUklCUyAweDhDOEIKKyNkZWZpbmUgR0xfSU5URVJMRUFWRURfQVRUUklCUyAgICAgICAgICAgIDB4OEM4QworI2RlZmluZSBHTF9TRVBBUkFURV9BVFRSSUJTICAgICAgICAgICAgICAgMHg4QzhECisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVIgICAgICAweDhDOEUKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9CSU5ESU5HIDB4OEM4RgorI2RlZmluZSBHTF9SR0JBMzJVSSAgICAgICAgICAgICAgICAgICAgICAgMHg4RDcwCisjZGVmaW5lIEdMX1JHQjMyVUkgICAgICAgICAgICAgICAgICAgICAgICAweDhENzEKKyNkZWZpbmUgR0xfUkdCQTE2VUkgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ3NgorI2RlZmluZSBHTF9SR0IxNlVJICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDc3CisjZGVmaW5lIEdMX1JHQkE4VUkgICAgICAgICAgICAgICAgICAgICAgICAweDhEN0MKKyNkZWZpbmUgR0xfUkdCOFVJICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ3RAorI2RlZmluZSBHTF9SR0JBMzJJICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDgyCisjZGVmaW5lIEdMX1JHQjMySSAgICAgICAgICAgICAgICAgICAgICAgICAweDhEODMKKyNkZWZpbmUgR0xfUkdCQTE2SSAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ4OAorI2RlZmluZSBHTF9SR0IxNkkgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDg5CisjZGVmaW5lIEdMX1JHQkE4SSAgICAgICAgICAgICAgICAgICAgICAgICAweDhEOEUKKyNkZWZpbmUgR0xfUkdCOEkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ4RgorI2RlZmluZSBHTF9SRURfSU5URUdFUiAgICAgICAgICAgICAgICAgICAgMHg4RDk0CisjZGVmaW5lIEdMX0dSRUVOX0lOVEVHRVIgICAgICAgICAgICAgICAgICAweDhEOTUKKyNkZWZpbmUgR0xfQkxVRV9JTlRFR0VSICAgICAgICAgICAgICAgICAgIDB4OEQ5NgorI2RlZmluZSBHTF9SR0JfSU5URUdFUiAgICAgICAgICAgICAgICAgICAgMHg4RDk4CisjZGVmaW5lIEdMX1JHQkFfSU5URUdFUiAgICAgICAgICAgICAgICAgICAweDhEOTkKKyNkZWZpbmUgR0xfQkdSX0lOVEVHRVIgICAgICAgICAgICAgICAgICAgIDB4OEQ5QQorI2RlZmluZSBHTF9CR1JBX0lOVEVHRVIgICAgICAgICAgICAgICAgICAgMHg4RDlCCisjZGVmaW5lIEdMX1NBTVBMRVJfMURfQVJSQVkgICAgICAgICAgICAgICAweDhEQzAKKyNkZWZpbmUgR0xfU0FNUExFUl8yRF9BUlJBWSAgICAgICAgICAgICAgIDB4OERDMQorI2RlZmluZSBHTF9TQU1QTEVSXzFEX0FSUkFZX1NIQURPVyAgICAgICAgMHg4REMzCisjZGVmaW5lIEdMX1NBTVBMRVJfMkRfQVJSQVlfU0hBRE9XICAgICAgICAweDhEQzQKKyNkZWZpbmUgR0xfU0FNUExFUl9DVUJFX1NIQURPVyAgICAgICAgICAgIDB4OERDNQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfVkVDMiAgICAgICAgICAgICAgMHg4REM2CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9WRUMzICAgICAgICAgICAgICAweDhEQzcKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1ZFQzQgICAgICAgICAgICAgIDB4OERDOAorI2RlZmluZSBHTF9JTlRfU0FNUExFUl8xRCAgICAgICAgICAgICAgICAgMHg4REM5CisjZGVmaW5lIEdMX0lOVF9TQU1QTEVSXzJEICAgICAgICAgICAgICAgICAweDhEQ0EKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfM0QgICAgICAgICAgICAgICAgIDB4OERDQgorI2RlZmluZSBHTF9JTlRfU0FNUExFUl9DVUJFICAgICAgICAgICAgICAgMHg4RENDCisjZGVmaW5lIEdMX0lOVF9TQU1QTEVSXzFEX0FSUkFZICAgICAgICAgICAweDhEQ0UKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfMkRfQVJSQVkgICAgICAgICAgIDB4OERDRgorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8xRCAgICAgICAgMHg4REQxCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzJEICAgICAgICAweDhERDIKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfM0QgICAgICAgIDB4OEREMworI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl9DVUJFICAgICAgMHg4REQ0CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzFEX0FSUkFZICAweDhERDYKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfQVJSQVkgIDB4OERENworI2RlZmluZSBHTF9RVUVSWV9XQUlUICAgICAgICAgICAgICAgICAgICAgMHg4RTEzCisjZGVmaW5lIEdMX1FVRVJZX05PX1dBSVQgICAgICAgICAgICAgICAgICAweDhFMTQKKyNkZWZpbmUgR0xfUVVFUllfQllfUkVHSU9OX1dBSVQgICAgICAgICAgIDB4OEUxNQorI2RlZmluZSBHTF9RVUVSWV9CWV9SRUdJT05fTk9fV0FJVCAgICAgICAgMHg4RTE2CisjZGVmaW5lIEdMX0JVRkZFUl9BQ0NFU1NfRkxBR1MgICAgICAgICAgICAweDkxMUYKKyNkZWZpbmUgR0xfQlVGRkVSX01BUF9MRU5HVEggICAgICAgICAgICAgIDB4OTEyMAorI2RlZmluZSBHTF9CVUZGRVJfTUFQX09GRlNFVCAgICAgICAgICAgICAgMHg5MTIxCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfZGVwdGhfYnVmZmVyX2Zsb2F0ICovCisvKiByZXVzZSBHTF9ERVBUSF9DT01QT05FTlQzMkYgKi8KKy8qIHJldXNlIEdMX0RFUFRIMzJGX1NURU5DSUw4ICovCisvKiByZXVzZSBHTF9GTE9BVF8zMl9VTlNJR05FRF9JTlRfMjRfOF9SRVYgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9mcmFtZWJ1ZmZlcl9vYmplY3QgKi8KKy8qIHJldXNlIEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0NPTE9SX0VOQ09ESU5HICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0NPTVBPTkVOVF9UWVBFICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1JFRF9TSVpFICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0dSRUVOX1NJWkUgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQkxVRV9TSVpFICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0FMUEhBX1NJWkUgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfREVQVEhfU0laRSAqLworLyogcmV1c2UgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9TVEVOQ0lMX1NJWkUgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0RFRkFVTFQgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX1VOREVGSU5FRCAqLworLyogcmV1c2UgR0xfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UICovCisvKiByZXVzZSBHTF9JTkRFWCAqLworLyogcmV1c2UgR0xfTUFYX1JFTkRFUkJVRkZFUl9TSVpFICovCisvKiByZXVzZSBHTF9ERVBUSF9TVEVOQ0lMICovCisvKiByZXVzZSBHTF9VTlNJR05FRF9JTlRfMjRfOCAqLworLyogcmV1c2UgR0xfREVQVEgyNF9TVEVOQ0lMOCAqLworLyogcmV1c2UgR0xfVEVYVFVSRV9TVEVOQ0lMX1NJWkUgKi8KKy8qIHJldXNlIEdMX1RFWFRVUkVfUkVEX1RZUEUgKi8KKy8qIHJldXNlIEdMX1RFWFRVUkVfR1JFRU5fVFlQRSAqLworLyogcmV1c2UgR0xfVEVYVFVSRV9CTFVFX1RZUEUgKi8KKy8qIHJldXNlIEdMX1RFWFRVUkVfQUxQSEFfVFlQRSAqLworLyogcmV1c2UgR0xfVEVYVFVSRV9ERVBUSF9UWVBFICovCisvKiByZXVzZSBHTF9VTlNJR05FRF9OT1JNQUxJWkVEICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HICovCisvKiByZXVzZSBHTF9EUkFXX0ZSQU1FQlVGRkVSX0JJTkRJTkcgKi8KKy8qIHJldXNlIEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HICovCisvKiByZXVzZSBHTF9SRUFEX0ZSQU1FQlVGRkVSICovCisvKiByZXVzZSBHTF9EUkFXX0ZSQU1FQlVGRkVSICovCisvKiByZXVzZSBHTF9SRUFEX0ZSQU1FQlVGRkVSX0JJTkRJTkcgKi8KKy8qIHJldXNlIEdMX1JFTkRFUkJVRkZFUl9TQU1QTEVTICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUwgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEFZRVIgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RSQVdfQlVGRkVSICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX1JFQURfQlVGRkVSICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCAqLworLyogcmV1c2UgR0xfTUFYX0NPTE9SX0FUVEFDSE1FTlRTICovCisvKiByZXVzZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMCAqLworLyogcmV1c2UgR0xfQ09MT1JfQVRUQUNITUVOVDEgKi8KKy8qIHJldXNlIEdMX0NPTE9SX0FUVEFDSE1FTlQyICovCisvKiByZXVzZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMyAqLworLyogcmV1c2UgR0xfQ09MT1JfQVRUQUNITUVOVDQgKi8KKy8qIHJldXNlIEdMX0NPTE9SX0FUVEFDSE1FTlQ1ICovCisvKiByZXVzZSBHTF9DT0xPUl9BVFRBQ0hNRU5UNiAqLworLyogcmV1c2UgR0xfQ09MT1JfQVRUQUNITUVOVDcgKi8KKy8qIHJldXNlIEdMX0NPTE9SX0FUVEFDSE1FTlQ4ICovCisvKiByZXVzZSBHTF9DT0xPUl9BVFRBQ0hNRU5UOSAqLworLyogcmV1c2UgR0xfQ09MT1JfQVRUQUNITUVOVDEwICovCisvKiByZXVzZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTEgKi8KKy8qIHJldXNlIEdMX0NPTE9SX0FUVEFDSE1FTlQxMiAqLworLyogcmV1c2UgR0xfQ09MT1JfQVRUQUNITUVOVDEzICovCisvKiByZXVzZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTQgKi8KKy8qIHJldXNlIEdMX0NPTE9SX0FUVEFDSE1FTlQxNSAqLworLyogcmV1c2UgR0xfREVQVEhfQVRUQUNITUVOVCAqLworLyogcmV1c2UgR0xfU1RFTkNJTF9BVFRBQ0hNRU5UICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUiAqLworLyogcmV1c2UgR0xfUkVOREVSQlVGRkVSICovCisvKiByZXVzZSBHTF9SRU5ERVJCVUZGRVJfV0lEVEggKi8KKy8qIHJldXNlIEdMX1JFTkRFUkJVRkZFUl9IRUlHSFQgKi8KKy8qIHJldXNlIEdMX1JFTkRFUkJVRkZFUl9JTlRFUk5BTF9GT1JNQVQgKi8KKy8qIHJldXNlIEdMX1NURU5DSUxfSU5ERVgxICovCisvKiByZXVzZSBHTF9TVEVOQ0lMX0lOREVYNCAqLworLyogcmV1c2UgR0xfU1RFTkNJTF9JTkRFWDggKi8KKy8qIHJldXNlIEdMX1NURU5DSUxfSU5ERVgxNiAqLworLyogcmV1c2UgR0xfUkVOREVSQlVGRkVSX1JFRF9TSVpFICovCisvKiByZXVzZSBHTF9SRU5ERVJCVUZGRVJfR1JFRU5fU0laRSAqLworLyogcmV1c2UgR0xfUkVOREVSQlVGRkVSX0JMVUVfU0laRSAqLworLyogcmV1c2UgR0xfUkVOREVSQlVGRkVSX0FMUEhBX1NJWkUgKi8KKy8qIHJldXNlIEdMX1JFTkRFUkJVRkZFUl9ERVBUSF9TSVpFICovCisvKiByZXVzZSBHTF9SRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01VTFRJU0FNUExFICovCisvKiByZXVzZSBHTF9NQVhfU0FNUExFUyAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX2ZyYW1lYnVmZmVyX3NSR0IgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX1NSR0IgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9oYWxmX2Zsb2F0X3ZlcnRleCAqLworLyogcmV1c2UgR0xfSEFMRl9GTE9BVCAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX21hcF9idWZmZXJfcmFuZ2UgKi8KKy8qIHJldXNlIEdMX01BUF9SRUFEX0JJVCAqLworLyogcmV1c2UgR0xfTUFQX1dSSVRFX0JJVCAqLworLyogcmV1c2UgR0xfTUFQX0lOVkFMSURBVEVfUkFOR0VfQklUICovCisvKiByZXVzZSBHTF9NQVBfSU5WQUxJREFURV9CVUZGRVJfQklUICovCisvKiByZXVzZSBHTF9NQVBfRkxVU0hfRVhQTElDSVRfQklUICovCisvKiByZXVzZSBHTF9NQVBfVU5TWU5DSFJPTklaRURfQklUICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfdGV4dHVyZV9jb21wcmVzc2lvbl9yZ3RjICovCisvKiByZXVzZSBHTF9DT01QUkVTU0VEX1JFRF9SR1RDMSAqLworLyogcmV1c2UgR0xfQ09NUFJFU1NFRF9TSUdORURfUkVEX1JHVEMxICovCisvKiByZXVzZSBHTF9DT01QUkVTU0VEX1JHX1JHVEMyICovCisvKiByZXVzZSBHTF9DT01QUkVTU0VEX1NJR05FRF9SR19SR1RDMiAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX3RleHR1cmVfcmcgKi8KKy8qIHJldXNlIEdMX1JHICovCisvKiByZXVzZSBHTF9SR19JTlRFR0VSICovCisvKiByZXVzZSBHTF9SOCAqLworLyogcmV1c2UgR0xfUjE2ICovCisvKiByZXVzZSBHTF9SRzggKi8KKy8qIHJldXNlIEdMX1JHMTYgKi8KKy8qIHJldXNlIEdMX1IxNkYgKi8KKy8qIHJldXNlIEdMX1IzMkYgKi8KKy8qIHJldXNlIEdMX1JHMTZGICovCisvKiByZXVzZSBHTF9SRzMyRiAqLworLyogcmV1c2UgR0xfUjhJICovCisvKiByZXVzZSBHTF9SOFVJICovCisvKiByZXVzZSBHTF9SMTZJICovCisvKiByZXVzZSBHTF9SMTZVSSAqLworLyogcmV1c2UgR0xfUjMySSAqLworLyogcmV1c2UgR0xfUjMyVUkgKi8KKy8qIHJldXNlIEdMX1JHOEkgKi8KKy8qIHJldXNlIEdMX1JHOFVJICovCisvKiByZXVzZSBHTF9SRzE2SSAqLworLyogcmV1c2UgR0xfUkcxNlVJICovCisvKiByZXVzZSBHTF9SRzMySSAqLworLyogcmV1c2UgR0xfUkczMlVJICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfdmVydGV4X2FycmF5X29iamVjdCAqLworLyogcmV1c2UgR0xfVkVSVEVYX0FSUkFZX0JJTkRJTkcgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fM18wX0RFUFJFQ0FURUQKKyNkZWZpbmUgR0xfQ0xBTVBfVkVSVEVYX0NPTE9SICAgICAgICAgICAgIDB4ODkxQQorI2RlZmluZSBHTF9DTEFNUF9GUkFHTUVOVF9DT0xPUiAgICAgICAgICAgMHg4OTFCCisjZGVmaW5lIEdMX0FMUEhBX0lOVEVHRVIgICAgICAgICAgICAgICAgICAweDhEOTcKKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9mcmFtZWJ1ZmZlcl9vYmplY3QgKi8KKy8qIHJldXNlIEdMX1RFWFRVUkVfTFVNSU5BTkNFX1RZUEUgKi8KKy8qIHJldXNlIEdMX1RFWFRVUkVfSU5URU5TSVRZX1RZUEUgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fM18xCisjZGVmaW5lIEdMX1NBTVBMRVJfMkRfUkVDVCAgICAgICAgICAgICAgICAweDhCNjMKKyNkZWZpbmUgR0xfU0FNUExFUl8yRF9SRUNUX1NIQURPVyAgICAgICAgIDB4OEI2NAorI2RlZmluZSBHTF9TQU1QTEVSX0JVRkZFUiAgICAgICAgICAgICAgICAgMHg4REMyCisjZGVmaW5lIEdMX0lOVF9TQU1QTEVSXzJEX1JFQ1QgICAgICAgICAgICAweDhEQ0QKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfQlVGRkVSICAgICAgICAgICAgIDB4OEREMAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRF9SRUNUICAgMHg4REQ1CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSX0JVRkZFUiAgICAweDhERDgKKyNkZWZpbmUgR0xfVEVYVFVSRV9CVUZGRVIgICAgICAgICAgICAgICAgIDB4OEMyQQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9CVUZGRVJfU0laRSAgICAgICAgMHg4QzJCCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19CVUZGRVIgICAgICAgICAweDhDMkMKKyNkZWZpbmUgR0xfVEVYVFVSRV9CVUZGRVJfREFUQV9TVE9SRV9CSU5ESU5HIDB4OEMyRAorI2RlZmluZSBHTF9URVhUVVJFX0JVRkZFUl9GT1JNQVQgICAgICAgICAgMHg4QzJFCisjZGVmaW5lIEdMX1RFWFRVUkVfUkVDVEFOR0xFICAgICAgICAgICAgICAweDg0RjUKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX1JFQ1RBTkdMRSAgICAgIDB4ODRGNgorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFX1JFQ1RBTkdMRSAgICAgICAgMHg4NEY3CisjZGVmaW5lIEdMX01BWF9SRUNUQU5HTEVfVEVYVFVSRV9TSVpFICAgICAweDg0RjgKKyNkZWZpbmUgR0xfUkVEX1NOT1JNICAgICAgICAgICAgICAgICAgICAgIDB4OEY5MAorI2RlZmluZSBHTF9SR19TTk9STSAgICAgICAgICAgICAgICAgICAgICAgMHg4RjkxCisjZGVmaW5lIEdMX1JHQl9TTk9STSAgICAgICAgICAgICAgICAgICAgICAweDhGOTIKKyNkZWZpbmUgR0xfUkdCQV9TTk9STSAgICAgICAgICAgICAgICAgICAgIDB4OEY5MworI2RlZmluZSBHTF9SOF9TTk9STSAgICAgICAgICAgICAgICAgICAgICAgMHg4Rjk0CisjZGVmaW5lIEdMX1JHOF9TTk9STSAgICAgICAgICAgICAgICAgICAgICAweDhGOTUKKyNkZWZpbmUgR0xfUkdCOF9TTk9STSAgICAgICAgICAgICAgICAgICAgIDB4OEY5NgorI2RlZmluZSBHTF9SR0JBOF9TTk9STSAgICAgICAgICAgICAgICAgICAgMHg4Rjk3CisjZGVmaW5lIEdMX1IxNl9TTk9STSAgICAgICAgICAgICAgICAgICAgICAweDhGOTgKKyNkZWZpbmUgR0xfUkcxNl9TTk9STSAgICAgICAgICAgICAgICAgICAgIDB4OEY5OQorI2RlZmluZSBHTF9SR0IxNl9TTk9STSAgICAgICAgICAgICAgICAgICAgMHg4RjlBCisjZGVmaW5lIEdMX1JHQkExNl9TTk9STSAgICAgICAgICAgICAgICAgICAweDhGOUIKKyNkZWZpbmUgR0xfU0lHTkVEX05PUk1BTElaRUQgICAgICAgICAgICAgIDB4OEY5QworI2RlZmluZSBHTF9QUklNSVRJVkVfUkVTVEFSVCAgICAgICAgICAgICAgMHg4RjlECisjZGVmaW5lIEdMX1BSSU1JVElWRV9SRVNUQVJUX0lOREVYICAgICAgICAweDhGOUUKKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9jb3B5X2J1ZmZlciAqLworLyogcmV1c2UgR0xfQ09QWV9SRUFEX0JVRkZFUiAqLworLyogcmV1c2UgR0xfQ09QWV9XUklURV9CVUZGRVIgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9kcmF3X2luc3RhbmNlZCAobm9uZSkgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl91bmlmb3JtX2J1ZmZlcl9vYmplY3QgKi8KKy8qIHJldXNlIEdMX1VOSUZPUk1fQlVGRkVSICovCisvKiByZXVzZSBHTF9VTklGT1JNX0JVRkZFUl9CSU5ESU5HICovCisvKiByZXVzZSBHTF9VTklGT1JNX0JVRkZFUl9TVEFSVCAqLworLyogcmV1c2UgR0xfVU5JRk9STV9CVUZGRVJfU0laRSAqLworLyogcmV1c2UgR0xfTUFYX1ZFUlRFWF9VTklGT1JNX0JMT0NLUyAqLworLyogcmV1c2UgR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQkxPQ0tTICovCisvKiByZXVzZSBHTF9NQVhfQ09NQklORURfVU5JRk9STV9CTE9DS1MgKi8KKy8qIHJldXNlIEdMX01BWF9VTklGT1JNX0JVRkZFUl9CSU5ESU5HUyAqLworLyogcmV1c2UgR0xfTUFYX1VOSUZPUk1fQkxPQ0tfU0laRSAqLworLyogcmV1c2UgR0xfTUFYX0NPTUJJTkVEX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFMgKi8KKy8qIHJldXNlIEdMX01BWF9DT01CSU5FRF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFMgKi8KKy8qIHJldXNlIEdMX1VOSUZPUk1fQlVGRkVSX09GRlNFVF9BTElHTk1FTlQgKi8KKy8qIHJldXNlIEdMX0FDVElWRV9VTklGT1JNX0JMT0NLX01BWF9OQU1FX0xFTkdUSCAqLworLyogcmV1c2UgR0xfQUNUSVZFX1VOSUZPUk1fQkxPQ0tTICovCisvKiByZXVzZSBHTF9VTklGT1JNX1RZUEUgKi8KKy8qIHJldXNlIEdMX1VOSUZPUk1fU0laRSAqLworLyogcmV1c2UgR0xfVU5JRk9STV9OQU1FX0xFTkdUSCAqLworLyogcmV1c2UgR0xfVU5JRk9STV9CTE9DS19JTkRFWCAqLworLyogcmV1c2UgR0xfVU5JRk9STV9PRkZTRVQgKi8KKy8qIHJldXNlIEdMX1VOSUZPUk1fQVJSQVlfU1RSSURFICovCisvKiByZXVzZSBHTF9VTklGT1JNX01BVFJJWF9TVFJJREUgKi8KKy8qIHJldXNlIEdMX1VOSUZPUk1fSVNfUk9XX01BSk9SICovCisvKiByZXVzZSBHTF9VTklGT1JNX0JMT0NLX0JJTkRJTkcgKi8KKy8qIHJldXNlIEdMX1VOSUZPUk1fQkxPQ0tfREFUQV9TSVpFICovCisvKiByZXVzZSBHTF9VTklGT1JNX0JMT0NLX05BTUVfTEVOR1RIICovCisvKiByZXVzZSBHTF9VTklGT1JNX0JMT0NLX0FDVElWRV9VTklGT1JNUyAqLworLyogcmV1c2UgR0xfVU5JRk9STV9CTE9DS19BQ1RJVkVfVU5JRk9STV9JTkRJQ0VTICovCisvKiByZXVzZSBHTF9VTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfVkVSVEVYX1NIQURFUiAqLworLyogcmV1c2UgR0xfVU5JRk9STV9CTE9DS19SRUZFUkVOQ0VEX0JZX0ZSQUdNRU5UX1NIQURFUiAqLworLyogcmV1c2UgR0xfSU5WQUxJRF9JTkRFWCAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8zXzIKKyNkZWZpbmUgR0xfQ09OVEVYVF9DT1JFX1BST0ZJTEVfQklUICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xfQ09OVEVYVF9DT01QQVRJQklMSVRZX1BST0ZJTEVfQklUIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0xfTElORVNfQURKQUNFTkNZICAgICAgICAgICAgICAgIDB4MDAwQQorI2RlZmluZSBHTF9MSU5FX1NUUklQX0FESkFDRU5DWSAgICAgICAgICAgMHgwMDBCCisjZGVmaW5lIEdMX1RSSUFOR0xFU19BREpBQ0VOQ1kgICAgICAgICAgICAweDAwMEMKKyNkZWZpbmUgR0xfVFJJQU5HTEVfU1RSSVBfQURKQUNFTkNZICAgICAgIDB4MDAwRAorI2RlZmluZSBHTF9QUk9HUkFNX1BPSU5UX1NJWkUgICAgICAgICAgICAgMHg4NjQyCisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9URVhUVVJFX0lNQUdFX1VOSVRTIDB4OEMyOQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0xBWUVSRUQgMHg4REE3CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTEFZRVJfVEFSR0VUUyAweDhEQTgKKyNkZWZpbmUgR0xfR0VPTUVUUllfU0hBREVSICAgICAgICAgICAgICAgIDB4OEREOQorI2RlZmluZSBHTF9HRU9NRVRSWV9WRVJUSUNFU19PVVQgICAgICAgICAgMHg4OTE2CisjZGVmaW5lIEdMX0dFT01FVFJZX0lOUFVUX1RZUEUgICAgICAgICAgICAweDg5MTcKKyNkZWZpbmUgR0xfR0VPTUVUUllfT1VUUFVUX1RZUEUgICAgICAgICAgIDB4ODkxOAorI2RlZmluZSBHTF9NQVhfR0VPTUVUUllfVU5JRk9STV9DT01QT05FTlRTIDB4OERERgorI2RlZmluZSBHTF9NQVhfR0VPTUVUUllfT1VUUFVUX1ZFUlRJQ0VTICAgMHg4REUwCisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9UT1RBTF9PVVRQVVRfQ09NUE9ORU5UUyAweDhERTEKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9PVVRQVVRfQ09NUE9ORU5UUyAgIDB4OTEyMgorI2RlZmluZSBHTF9NQVhfR0VPTUVUUllfSU5QVVRfQ09NUE9ORU5UUyAgMHg5MTIzCisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9PVVRQVVRfQ09NUE9ORU5UUyAweDkxMjQKKyNkZWZpbmUgR0xfTUFYX0ZSQUdNRU5UX0lOUFVUX0NPTVBPTkVOVFMgIDB4OTEyNQorI2RlZmluZSBHTF9DT05URVhUX1BST0ZJTEVfTUFTSyAgICAgICAgICAgMHg5MTI2CisvKiByZXVzZSBHTF9NQVhfVkFSWUlOR19DT01QT05FTlRTICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEFZRVIgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9kZXB0aF9jbGFtcCAqLworLyogcmV1c2UgR0xfREVQVEhfQ0xBTVAgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9kcmF3X2VsZW1lbnRzX2Jhc2VfdmVydGV4IChub25lKSAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX2ZyYWdtZW50X2Nvb3JkX2NvbnZlbnRpb25zIChub25lKSAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX3Byb3Zva2luZ192ZXJ0ZXggKi8KKy8qIHJldXNlIEdMX1FVQURTX0ZPTExPV19QUk9WT0tJTkdfVkVSVEVYX0NPTlZFTlRJT04gKi8KKy8qIHJldXNlIEdMX0ZJUlNUX1ZFUlRFWF9DT05WRU5USU9OICovCisvKiByZXVzZSBHTF9MQVNUX1ZFUlRFWF9DT05WRU5USU9OICovCisvKiByZXVzZSBHTF9QUk9WT0tJTkdfVkVSVEVYICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfc2VhbWxlc3NfY3ViZV9tYXAgKi8KKy8qIHJldXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfU0VBTUxFU1MgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9zeW5jICovCisvKiByZXVzZSBHTF9NQVhfU0VSVkVSX1dBSVRfVElNRU9VVCAqLworLyogcmV1c2UgR0xfT0JKRUNUX1RZUEUgKi8KKy8qIHJldXNlIEdMX1NZTkNfQ09ORElUSU9OICovCisvKiByZXVzZSBHTF9TWU5DX1NUQVRVUyAqLworLyogcmV1c2UgR0xfU1lOQ19GTEFHUyAqLworLyogcmV1c2UgR0xfU1lOQ19GRU5DRSAqLworLyogcmV1c2UgR0xfU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEUgKi8KKy8qIHJldXNlIEdMX1VOU0lHTkFMRUQgKi8KKy8qIHJldXNlIEdMX1NJR05BTEVEICovCisvKiByZXVzZSBHTF9BTFJFQURZX1NJR05BTEVEICovCisvKiByZXVzZSBHTF9USU1FT1VUX0VYUElSRUQgKi8KKy8qIHJldXNlIEdMX0NPTkRJVElPTl9TQVRJU0ZJRUQgKi8KKy8qIHJldXNlIEdMX1dBSVRfRkFJTEVEICovCisvKiByZXVzZSBHTF9USU1FT1VUX0lHTk9SRUQgKi8KKy8qIHJldXNlIEdMX1NZTkNfRkxVU0hfQ09NTUFORFNfQklUICovCisvKiByZXVzZSBHTF9USU1FT1VUX0lHTk9SRUQgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl90ZXh0dXJlX211bHRpc2FtcGxlICovCisvKiByZXVzZSBHTF9TQU1QTEVfUE9TSVRJT04gKi8KKy8qIHJldXNlIEdMX1NBTVBMRV9NQVNLICovCisvKiByZXVzZSBHTF9TQU1QTEVfTUFTS19WQUxVRSAqLworLyogcmV1c2UgR0xfTUFYX1NBTVBMRV9NQVNLX1dPUkRTICovCisvKiByZXVzZSBHTF9URVhUVVJFXzJEX01VTFRJU0FNUExFICovCisvKiByZXVzZSBHTF9QUk9YWV9URVhUVVJFXzJEX01VTFRJU0FNUExFICovCisvKiByZXVzZSBHTF9URVhUVVJFXzJEX01VTFRJU0FNUExFX0FSUkFZICovCisvKiByZXVzZSBHTF9QUk9YWV9URVhUVVJFXzJEX01VTFRJU0FNUExFX0FSUkFZICovCisvKiByZXVzZSBHTF9URVhUVVJFX0JJTkRJTkdfMkRfTVVMVElTQU1QTEUgKi8KKy8qIHJldXNlIEdMX1RFWFRVUkVfQklORElOR18yRF9NVUxUSVNBTVBMRV9BUlJBWSAqLworLyogcmV1c2UgR0xfVEVYVFVSRV9TQU1QTEVTICovCisvKiByZXVzZSBHTF9URVhUVVJFX0ZJWEVEX1NBTVBMRV9MT0NBVElPTlMgKi8KKy8qIHJldXNlIEdMX1NBTVBMRVJfMkRfTVVMVElTQU1QTEUgKi8KKy8qIHJldXNlIEdMX0lOVF9TQU1QTEVSXzJEX01VTFRJU0FNUExFICovCisvKiByZXVzZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRF9NVUxUSVNBTVBMRSAqLworLyogcmV1c2UgR0xfU0FNUExFUl8yRF9NVUxUSVNBTVBMRV9BUlJBWSAqLworLyogcmV1c2UgR0xfSU5UX1NBTVBMRVJfMkRfTVVMVElTQU1QTEVfQVJSQVkgKi8KKy8qIHJldXNlIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzJEX01VTFRJU0FNUExFX0FSUkFZICovCisvKiByZXVzZSBHTF9NQVhfQ09MT1JfVEVYVFVSRV9TQU1QTEVTICovCisvKiByZXVzZSBHTF9NQVhfREVQVEhfVEVYVFVSRV9TQU1QTEVTICovCisvKiByZXVzZSBHTF9NQVhfSU5URUdFUl9TQU1QTEVTICovCisvKiBEb24ndCBuZWVkIHRvIHJldXNlIHRva2VucyBmcm9tIEFSQl92ZXJ0ZXhfYXJyYXlfYmdyYSBzaW5jZSB0aGV5J3JlIGFscmVhZHkgaW4gMS4yIGNvcmUgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fM18zCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfRElWSVNPUiAgICAweDg4RkUKKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9ibGVuZF9mdW5jX2V4dGVuZGVkICovCisvKiByZXVzZSBHTF9TUkMxX0NPTE9SICovCisvKiByZXVzZSBHTF9PTkVfTUlOVVNfU1JDMV9DT0xPUiAqLworLyogcmV1c2UgR0xfT05FX01JTlVTX1NSQzFfQUxQSEEgKi8KKy8qIHJldXNlIEdMX01BWF9EVUFMX1NPVVJDRV9EUkFXX0JVRkZFUlMgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9leHBsaWNpdF9hdHRyaWJfbG9jYXRpb24gKG5vbmUpICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfb2NjbHVzaW9uX3F1ZXJ5MiAqLworLyogcmV1c2UgR0xfQU5ZX1NBTVBMRVNfUEFTU0VEICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfc2FtcGxlcl9vYmplY3RzICovCisvKiByZXVzZSBHTF9TQU1QTEVSX0JJTkRJTkcgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9zaGFkZXJfYml0X2VuY29kaW5nIChub25lKSAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX3RleHR1cmVfcmdiMTBfYTJ1aSAqLworLyogcmV1c2UgR0xfUkdCMTBfQTJVSSAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX3RleHR1cmVfc3dpenpsZSAqLworLyogcmV1c2UgR0xfVEVYVFVSRV9TV0laWkxFX1IgKi8KKy8qIHJldXNlIEdMX1RFWFRVUkVfU1dJWlpMRV9HICovCisvKiByZXVzZSBHTF9URVhUVVJFX1NXSVpaTEVfQiAqLworLyogcmV1c2UgR0xfVEVYVFVSRV9TV0laWkxFX0EgKi8KKy8qIHJldXNlIEdMX1RFWFRVUkVfU1dJWlpMRV9SR0JBICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfdGltZXJfcXVlcnkgKi8KKy8qIHJldXNlIEdMX1RJTUVfRUxBUFNFRCAqLworLyogcmV1c2UgR0xfVElNRVNUQU1QICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfdmVydGV4X3R5cGVfMl8xMF8xMF8xMF9yZXYgKi8KKy8qIHJldXNlIEdMX0lOVF8yXzEwXzEwXzEwX1JFViAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl80XzAKKyNkZWZpbmUgR0xfU0FNUExFX1NIQURJTkcgICAgICAgICAgICAgICAgIDB4OEMzNgorI2RlZmluZSBHTF9NSU5fU0FNUExFX1NIQURJTkdfVkFMVUUgICAgICAgMHg4QzM3CisjZGVmaW5lIEdMX01JTl9QUk9HUkFNX1RFWFRVUkVfR0FUSEVSX09GRlNFVCAweDhFNUUKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fVEVYVFVSRV9HQVRIRVJfT0ZGU0VUIDB4OEU1RgorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX0FSUkFZICAgICAgICAgMHg5MDA5CisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUF9BUlJBWSAweDkwMEEKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV9DVUJFX01BUF9BUlJBWSAgIDB4OTAwQgorI2RlZmluZSBHTF9TQU1QTEVSX0NVQkVfTUFQX0FSUkFZICAgICAgICAgMHg5MDBDCisjZGVmaW5lIEdMX1NBTVBMRVJfQ1VCRV9NQVBfQVJSQVlfU0hBRE9XICAweDkwMEQKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfQ1VCRV9NQVBfQVJSQVkgICAgIDB4OTAwRQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl9DVUJFX01BUF9BUlJBWSAweDkwMEYKKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl90ZXh0dXJlX3F1ZXJ5X2xvZCAobm9uZSkgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9kcmF3X2J1ZmZlcnNfYmxlbmQgKG5vbmUpICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfZHJhd19pbmRpcmVjdCAqLworLyogcmV1c2UgR0xfRFJBV19JTkRJUkVDVF9CVUZGRVIgKi8KKy8qIHJldXNlIEdMX0RSQVdfSU5ESVJFQ1RfQlVGRkVSX0JJTkRJTkcgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9ncHVfc2hhZGVyNSAqLworLyogcmV1c2UgR0xfR0VPTUVUUllfU0hBREVSX0lOVk9DQVRJT05TICovCisvKiByZXVzZSBHTF9NQVhfR0VPTUVUUllfU0hBREVSX0lOVk9DQVRJT05TICovCisvKiByZXVzZSBHTF9NSU5fRlJBR01FTlRfSU5URVJQT0xBVElPTl9PRkZTRVQgKi8KKy8qIHJldXNlIEdMX01BWF9GUkFHTUVOVF9JTlRFUlBPTEFUSU9OX09GRlNFVCAqLworLyogcmV1c2UgR0xfRlJBR01FTlRfSU5URVJQT0xBVElPTl9PRkZTRVRfQklUUyAqLworLyogcmV1c2UgR0xfTUFYX1ZFUlRFWF9TVFJFQU1TICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfZ3B1X3NoYWRlcl9mcDY0ICovCisvKiByZXVzZSBHTF9ET1VCTEVfVkVDMiAqLworLyogcmV1c2UgR0xfRE9VQkxFX1ZFQzMgKi8KKy8qIHJldXNlIEdMX0RPVUJMRV9WRUM0ICovCisvKiByZXVzZSBHTF9ET1VCTEVfTUFUMiAqLworLyogcmV1c2UgR0xfRE9VQkxFX01BVDMgKi8KKy8qIHJldXNlIEdMX0RPVUJMRV9NQVQ0ICovCisvKiByZXVzZSBHTF9ET1VCTEVfTUFUMngzICovCisvKiByZXVzZSBHTF9ET1VCTEVfTUFUMng0ICovCisvKiByZXVzZSBHTF9ET1VCTEVfTUFUM3gyICovCisvKiByZXVzZSBHTF9ET1VCTEVfTUFUM3g0ICovCisvKiByZXVzZSBHTF9ET1VCTEVfTUFUNHgyICovCisvKiByZXVzZSBHTF9ET1VCTEVfTUFUNHgzICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfc2hhZGVyX3N1YnJvdXRpbmUgKi8KKy8qIHJldXNlIEdMX0FDVElWRV9TVUJST1VUSU5FUyAqLworLyogcmV1c2UgR0xfQUNUSVZFX1NVQlJPVVRJTkVfVU5JRk9STVMgKi8KKy8qIHJldXNlIEdMX0FDVElWRV9TVUJST1VUSU5FX1VOSUZPUk1fTE9DQVRJT05TICovCisvKiByZXVzZSBHTF9BQ1RJVkVfU1VCUk9VVElORV9NQVhfTEVOR1RIICovCisvKiByZXVzZSBHTF9BQ1RJVkVfU1VCUk9VVElORV9VTklGT1JNX01BWF9MRU5HVEggKi8KKy8qIHJldXNlIEdMX01BWF9TVUJST1VUSU5FUyAqLworLyogcmV1c2UgR0xfTUFYX1NVQlJPVVRJTkVfVU5JRk9STV9MT0NBVElPTlMgKi8KKy8qIHJldXNlIEdMX05VTV9DT01QQVRJQkxFX1NVQlJPVVRJTkVTICovCisvKiByZXVzZSBHTF9DT01QQVRJQkxFX1NVQlJPVVRJTkVTICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfdGVzc2VsbGF0aW9uX3NoYWRlciAqLworLyogcmV1c2UgR0xfUEFUQ0hFUyAqLworLyogcmV1c2UgR0xfUEFUQ0hfVkVSVElDRVMgKi8KKy8qIHJldXNlIEdMX1BBVENIX0RFRkFVTFRfSU5ORVJfTEVWRUwgKi8KKy8qIHJldXNlIEdMX1BBVENIX0RFRkFVTFRfT1VURVJfTEVWRUwgKi8KKy8qIHJldXNlIEdMX1RFU1NfQ09OVFJPTF9PVVRQVVRfVkVSVElDRVMgKi8KKy8qIHJldXNlIEdMX1RFU1NfR0VOX01PREUgKi8KKy8qIHJldXNlIEdMX1RFU1NfR0VOX1NQQUNJTkcgKi8KKy8qIHJldXNlIEdMX1RFU1NfR0VOX1ZFUlRFWF9PUkRFUiAqLworLyogcmV1c2UgR0xfVEVTU19HRU5fUE9JTlRfTU9ERSAqLworLyogcmV1c2UgR0xfSVNPTElORVMgKi8KKy8qIHJldXNlIEdMX0ZSQUNUSU9OQUxfT0REICovCisvKiByZXVzZSBHTF9GUkFDVElPTkFMX0VWRU4gKi8KKy8qIHJldXNlIEdMX01BWF9QQVRDSF9WRVJUSUNFUyAqLworLyogcmV1c2UgR0xfTUFYX1RFU1NfR0VOX0xFVkVMICovCisvKiByZXVzZSBHTF9NQVhfVEVTU19DT05UUk9MX1VOSUZPUk1fQ09NUE9ORU5UUyAqLworLyogcmV1c2UgR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9VTklGT1JNX0NPTVBPTkVOVFMgKi8KKy8qIHJldXNlIEdMX01BWF9URVNTX0NPTlRST0xfVEVYVFVSRV9JTUFHRV9VTklUUyAqLworLyogcmV1c2UgR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9URVhUVVJFX0lNQUdFX1VOSVRTICovCisvKiByZXVzZSBHTF9NQVhfVEVTU19DT05UUk9MX09VVFBVVF9DT01QT05FTlRTICovCisvKiByZXVzZSBHTF9NQVhfVEVTU19QQVRDSF9DT01QT05FTlRTICovCisvKiByZXVzZSBHTF9NQVhfVEVTU19DT05UUk9MX1RPVEFMX09VVFBVVF9DT01QT05FTlRTICovCisvKiByZXVzZSBHTF9NQVhfVEVTU19FVkFMVUFUSU9OX09VVFBVVF9DT01QT05FTlRTICovCisvKiByZXVzZSBHTF9NQVhfVEVTU19DT05UUk9MX1VOSUZPUk1fQkxPQ0tTICovCisvKiByZXVzZSBHTF9NQVhfVEVTU19FVkFMVUFUSU9OX1VOSUZPUk1fQkxPQ0tTICovCisvKiByZXVzZSBHTF9NQVhfVEVTU19DT05UUk9MX0lOUFVUX0NPTVBPTkVOVFMgKi8KKy8qIHJldXNlIEdMX01BWF9URVNTX0VWQUxVQVRJT05fSU5QVVRfQ09NUE9ORU5UUyAqLworLyogcmV1c2UgR0xfTUFYX0NPTUJJTkVEX1RFU1NfQ09OVFJPTF9VTklGT1JNX0NPTVBPTkVOVFMgKi8KKy8qIHJldXNlIEdMX01BWF9DT01CSU5FRF9URVNTX0VWQUxVQVRJT05fVU5JRk9STV9DT01QT05FTlRTICovCisvKiByZXVzZSBHTF9VTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfVEVTU19DT05UUk9MX1NIQURFUiAqLworLyogcmV1c2UgR0xfVU5JRk9STV9CTE9DS19SRUZFUkVOQ0VEX0JZX1RFU1NfRVZBTFVBVElPTl9TSEFERVIgKi8KKy8qIHJldXNlIEdMX1RFU1NfRVZBTFVBVElPTl9TSEFERVIgKi8KKy8qIHJldXNlIEdMX1RFU1NfQ09OVFJPTF9TSEFERVIgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl90ZXh0dXJlX2J1ZmZlcl9vYmplY3RfcmdiMzIgKG5vbmUpICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfdHJhbnNmb3JtX2ZlZWRiYWNrMiAqLworLyogcmV1c2UgR0xfVFJBTlNGT1JNX0ZFRURCQUNLICovCisvKiByZXVzZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX1BBVVNFRCAqLworLyogcmV1c2UgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9BQ1RJVkUgKi8KKy8qIHJldXNlIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CSU5ESU5HICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfdHJhbnNmb3JtX2ZlZWRiYWNrMyAqLworLyogcmV1c2UgR0xfTUFYX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJTICovCisvKiByZXVzZSBHTF9NQVhfVkVSVEVYX1NUUkVBTVMgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fNF8xCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfRVMyX2NvbXBhdGliaWxpdHkgKi8KKy8qIHJldXNlIEdMX0ZJWEVEICovCisvKiByZXVzZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEUgKi8KKy8qIHJldXNlIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUICovCisvKiByZXVzZSBHTF9MT1dfRkxPQVQgKi8KKy8qIHJldXNlIEdMX01FRElVTV9GTE9BVCAqLworLyogcmV1c2UgR0xfSElHSF9GTE9BVCAqLworLyogcmV1c2UgR0xfTE9XX0lOVCAqLworLyogcmV1c2UgR0xfTUVESVVNX0lOVCAqLworLyogcmV1c2UgR0xfSElHSF9JTlQgKi8KKy8qIHJldXNlIEdMX1NIQURFUl9DT01QSUxFUiAqLworLyogcmV1c2UgR0xfTlVNX1NIQURFUl9CSU5BUllfRk9STUFUUyAqLworLyogcmV1c2UgR0xfTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMgKi8KKy8qIHJldXNlIEdMX01BWF9WQVJZSU5HX1ZFQ1RPUlMgKi8KKy8qIHJldXNlIEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9nZXRfcHJvZ3JhbV9iaW5hcnkgKi8KKy8qIHJldXNlIEdMX1BST0dSQU1fQklOQVJZX1JFVFJJRVZBQkxFX0hJTlQgKi8KKy8qIHJldXNlIEdMX1BST0dSQU1fQklOQVJZX0xFTkdUSCAqLworLyogcmV1c2UgR0xfTlVNX1BST0dSQU1fQklOQVJZX0ZPUk1BVFMgKi8KKy8qIHJldXNlIEdMX1BST0dSQU1fQklOQVJZX0ZPUk1BVFMgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0cyAqLworLyogcmV1c2UgR0xfVkVSVEVYX1NIQURFUl9CSVQgKi8KKy8qIHJldXNlIEdMX0ZSQUdNRU5UX1NIQURFUl9CSVQgKi8KKy8qIHJldXNlIEdMX0dFT01FVFJZX1NIQURFUl9CSVQgKi8KKy8qIHJldXNlIEdMX1RFU1NfQ09OVFJPTF9TSEFERVJfQklUICovCisvKiByZXVzZSBHTF9URVNTX0VWQUxVQVRJT05fU0hBREVSX0JJVCAqLworLyogcmV1c2UgR0xfQUxMX1NIQURFUl9CSVRTICovCisvKiByZXVzZSBHTF9QUk9HUkFNX1NFUEFSQUJMRSAqLworLyogcmV1c2UgR0xfQUNUSVZFX1BST0dSQU0gKi8KKy8qIHJldXNlIEdMX1BST0dSQU1fUElQRUxJTkVfQklORElORyAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX3NoYWRlcl9wcmVjaXNpb24gKG5vbmUpICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfdmVydGV4X2F0dHJpYl82NGJpdCAtIGFsbCBhcmUgaW4gR0wgMy4wIGFuZCA0LjAgYWxyZWFkeSAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX3ZpZXdwb3J0X2FycmF5IC0gc29tZSBhcmUgaW4gR0wgMS4xIGFuZCBBUkJfcHJvdm9raW5nX3ZlcnRleCBhbHJlYWR5ICovCisvKiByZXVzZSBHTF9NQVhfVklFV1BPUlRTICovCisvKiByZXVzZSBHTF9WSUVXUE9SVF9TVUJQSVhFTF9CSVRTICovCisvKiByZXVzZSBHTF9WSUVXUE9SVF9CT1VORFNfUkFOR0UgKi8KKy8qIHJldXNlIEdMX0xBWUVSX1BST1ZPS0lOR19WRVJURVggKi8KKy8qIHJldXNlIEdMX1ZJRVdQT1JUX0lOREVYX1BST1ZPS0lOR19WRVJURVggKi8KKy8qIHJldXNlIEdMX1VOREVGSU5FRF9WRVJURVggKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fNF8yCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfYmFzZV9pbnN0YW5jZSAobm9uZSkgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9zaGFkaW5nX2xhbmd1YWdlXzQyMHBhY2sgKG5vbmUpICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfdHJhbnNmb3JtX2ZlZWRiYWNrX2luc3RhbmNlZCAobm9uZSkgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9jb21wcmVzc2VkX3RleHR1cmVfcGl4ZWxfc3RvcmFnZSAqLworLyogcmV1c2UgR0xfVU5QQUNLX0NPTVBSRVNTRURfQkxPQ0tfV0lEVEggKi8KKy8qIHJldXNlIEdMX1VOUEFDS19DT01QUkVTU0VEX0JMT0NLX0hFSUdIVCAqLworLyogcmV1c2UgR0xfVU5QQUNLX0NPTVBSRVNTRURfQkxPQ0tfREVQVEggKi8KKy8qIHJldXNlIEdMX1VOUEFDS19DT01QUkVTU0VEX0JMT0NLX1NJWkUgKi8KKy8qIHJldXNlIEdMX1BBQ0tfQ09NUFJFU1NFRF9CTE9DS19XSURUSCAqLworLyogcmV1c2UgR0xfUEFDS19DT01QUkVTU0VEX0JMT0NLX0hFSUdIVCAqLworLyogcmV1c2UgR0xfUEFDS19DT01QUkVTU0VEX0JMT0NLX0RFUFRIICovCisvKiByZXVzZSBHTF9QQUNLX0NPTVBSRVNTRURfQkxPQ0tfU0laRSAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX2NvbnNlcnZhdGl2ZV9kZXB0aCAobm9uZSkgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9pbnRlcm5hbGZvcm1hdF9xdWVyeSAqLworLyogcmV1c2UgR0xfTlVNX1NBTVBMRV9DT1VOVFMgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9tYXBfYnVmZmVyX2FsaWdubWVudCAqLworLyogcmV1c2UgR0xfTUlOX01BUF9CVUZGRVJfQUxJR05NRU5UICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfc2hhZGVyX2F0b21pY19jb3VudGVycyAqLworLyogcmV1c2UgR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSICovCisvKiByZXVzZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfQklORElORyAqLworLyogcmV1c2UgR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX1NUQVJUICovCisvKiByZXVzZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfU0laRSAqLworLyogcmV1c2UgR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX0RBVEFfU0laRSAqLworLyogcmV1c2UgR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX0FDVElWRV9BVE9NSUNfQ09VTlRFUlMgKi8KKy8qIHJldXNlIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9BQ1RJVkVfQVRPTUlDX0NPVU5URVJfSU5ESUNFUyAqLworLyogcmV1c2UgR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX1JFRkVSRU5DRURfQllfVkVSVEVYX1NIQURFUiAqLworLyogcmV1c2UgR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX1JFRkVSRU5DRURfQllfVEVTU19DT05UUk9MX1NIQURFUiAqLworLyogcmV1c2UgR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX1JFRkVSRU5DRURfQllfVEVTU19FVkFMVUFUSU9OX1NIQURFUiAqLworLyogcmV1c2UgR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX1JFRkVSRU5DRURfQllfR0VPTUVUUllfU0hBREVSICovCisvKiByZXVzZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfUkVGRVJFTkNFRF9CWV9GUkFHTUVOVF9TSEFERVIgKi8KKy8qIHJldXNlIEdMX01BWF9WRVJURVhfQVRPTUlDX0NPVU5URVJfQlVGRkVSUyAqLworLyogcmV1c2UgR0xfTUFYX1RFU1NfQ09OVFJPTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJTICovCisvKiByZXVzZSBHTF9NQVhfVEVTU19FVkFMVUFUSU9OX0FUT01JQ19DT1VOVEVSX0JVRkZFUlMgKi8KKy8qIHJldXNlIEdMX01BWF9HRU9NRVRSWV9BVE9NSUNfQ09VTlRFUl9CVUZGRVJTICovCisvKiByZXVzZSBHTF9NQVhfRlJBR01FTlRfQVRPTUlDX0NPVU5URVJfQlVGRkVSUyAqLworLyogcmV1c2UgR0xfTUFYX0NPTUJJTkVEX0FUT01JQ19DT1VOVEVSX0JVRkZFUlMgKi8KKy8qIHJldXNlIEdMX01BWF9WRVJURVhfQVRPTUlDX0NPVU5URVJTICovCisvKiByZXVzZSBHTF9NQVhfVEVTU19DT05UUk9MX0FUT01JQ19DT1VOVEVSUyAqLworLyogcmV1c2UgR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9BVE9NSUNfQ09VTlRFUlMgKi8KKy8qIHJldXNlIEdMX01BWF9HRU9NRVRSWV9BVE9NSUNfQ09VTlRFUlMgKi8KKy8qIHJldXNlIEdMX01BWF9GUkFHTUVOVF9BVE9NSUNfQ09VTlRFUlMgKi8KKy8qIHJldXNlIEdMX01BWF9DT01CSU5FRF9BVE9NSUNfQ09VTlRFUlMgKi8KKy8qIHJldXNlIEdMX01BWF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfU0laRSAqLworLyogcmV1c2UgR0xfTUFYX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9CSU5ESU5HUyAqLworLyogcmV1c2UgR0xfQUNUSVZFX0FUT01JQ19DT1VOVEVSX0JVRkZFUlMgKi8KKy8qIHJldXNlIEdMX1VOSUZPUk1fQVRPTUlDX0NPVU5URVJfQlVGRkVSX0lOREVYICovCisvKiByZXVzZSBHTF9VTlNJR05FRF9JTlRfQVRPTUlDX0NPVU5URVIgKi8KKy8qIFJldXNlIHRva2VucyBmcm9tIEFSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZSAqLworLyogcmV1c2UgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9CQVJSSUVSX0JJVCAqLworLyogcmV1c2UgR0xfRUxFTUVOVF9BUlJBWV9CQVJSSUVSX0JJVCAqLworLyogcmV1c2UgR0xfVU5JRk9STV9CQVJSSUVSX0JJVCAqLworLyogcmV1c2UgR0xfVEVYVFVSRV9GRVRDSF9CQVJSSUVSX0JJVCAqLworLyogcmV1c2UgR0xfU0hBREVSX0lNQUdFX0FDQ0VTU19CQVJSSUVSX0JJVCAqLworLyogcmV1c2UgR0xfQ09NTUFORF9CQVJSSUVSX0JJVCAqLworLyogcmV1c2UgR0xfUElYRUxfQlVGRkVSX0JBUlJJRVJfQklUICovCisvKiByZXVzZSBHTF9URVhUVVJFX1VQREFURV9CQVJSSUVSX0JJVCAqLworLyogcmV1c2UgR0xfQlVGRkVSX1VQREFURV9CQVJSSUVSX0JJVCAqLworLyogcmV1c2UgR0xfRlJBTUVCVUZGRVJfQkFSUklFUl9CSVQgKi8KKy8qIHJldXNlIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CQVJSSUVSX0JJVCAqLworLyogcmV1c2UgR0xfQVRPTUlDX0NPVU5URVJfQkFSUklFUl9CSVQgKi8KKy8qIHJldXNlIEdMX0FMTF9CQVJSSUVSX0JJVFMgKi8KKy8qIHJldXNlIEdMX01BWF9JTUFHRV9VTklUUyAqLworLyogcmV1c2UgR0xfTUFYX0NPTUJJTkVEX0lNQUdFX1VOSVRTX0FORF9GUkFHTUVOVF9PVVRQVVRTICovCisvKiByZXVzZSBHTF9JTUFHRV9CSU5ESU5HX05BTUUgKi8KKy8qIHJldXNlIEdMX0lNQUdFX0JJTkRJTkdfTEVWRUwgKi8KKy8qIHJldXNlIEdMX0lNQUdFX0JJTkRJTkdfTEFZRVJFRCAqLworLyogcmV1c2UgR0xfSU1BR0VfQklORElOR19MQVlFUiAqLworLyogcmV1c2UgR0xfSU1BR0VfQklORElOR19BQ0NFU1MgKi8KKy8qIHJldXNlIEdMX0lNQUdFXzFEICovCisvKiByZXVzZSBHTF9JTUFHRV8yRCAqLworLyogcmV1c2UgR0xfSU1BR0VfM0QgKi8KKy8qIHJldXNlIEdMX0lNQUdFXzJEX1JFQ1QgKi8KKy8qIHJldXNlIEdMX0lNQUdFX0NVQkUgKi8KKy8qIHJldXNlIEdMX0lNQUdFX0JVRkZFUiAqLworLyogcmV1c2UgR0xfSU1BR0VfMURfQVJSQVkgKi8KKy8qIHJldXNlIEdMX0lNQUdFXzJEX0FSUkFZICovCisvKiByZXVzZSBHTF9JTUFHRV9DVUJFX01BUF9BUlJBWSAqLworLyogcmV1c2UgR0xfSU1BR0VfMkRfTVVMVElTQU1QTEUgKi8KKy8qIHJldXNlIEdMX0lNQUdFXzJEX01VTFRJU0FNUExFX0FSUkFZICovCisvKiByZXVzZSBHTF9JTlRfSU1BR0VfMUQgKi8KKy8qIHJldXNlIEdMX0lOVF9JTUFHRV8yRCAqLworLyogcmV1c2UgR0xfSU5UX0lNQUdFXzNEICovCisvKiByZXVzZSBHTF9JTlRfSU1BR0VfMkRfUkVDVCAqLworLyogcmV1c2UgR0xfSU5UX0lNQUdFX0NVQkUgKi8KKy8qIHJldXNlIEdMX0lOVF9JTUFHRV9CVUZGRVIgKi8KKy8qIHJldXNlIEdMX0lOVF9JTUFHRV8xRF9BUlJBWSAqLworLyogcmV1c2UgR0xfSU5UX0lNQUdFXzJEX0FSUkFZICovCisvKiByZXVzZSBHTF9JTlRfSU1BR0VfQ1VCRV9NQVBfQVJSQVkgKi8KKy8qIHJldXNlIEdMX0lOVF9JTUFHRV8yRF9NVUxUSVNBTVBMRSAqLworLyogcmV1c2UgR0xfSU5UX0lNQUdFXzJEX01VTFRJU0FNUExFX0FSUkFZICovCisvKiByZXVzZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMUQgKi8KKy8qIHJldXNlIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8yRCAqLworLyogcmV1c2UgR0xfVU5TSUdORURfSU5UX0lNQUdFXzNEICovCisvKiByZXVzZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMkRfUkVDVCAqLworLyogcmV1c2UgR0xfVU5TSUdORURfSU5UX0lNQUdFX0NVQkUgKi8KKy8qIHJldXNlIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV9CVUZGRVIgKi8KKy8qIHJldXNlIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8xRF9BUlJBWSAqLworLyogcmV1c2UgR0xfVU5TSUdORURfSU5UX0lNQUdFXzJEX0FSUkFZICovCisvKiByZXVzZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfQ1VCRV9NQVBfQVJSQVkgKi8KKy8qIHJldXNlIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8yRF9NVUxUSVNBTVBMRSAqLworLyogcmV1c2UgR0xfVU5TSUdORURfSU5UX0lNQUdFXzJEX01VTFRJU0FNUExFX0FSUkFZICovCisvKiByZXVzZSBHTF9NQVhfSU1BR0VfU0FNUExFUyAqLworLyogcmV1c2UgR0xfSU1BR0VfQklORElOR19GT1JNQVQgKi8KKy8qIHJldXNlIEdMX0lNQUdFX0ZPUk1BVF9DT01QQVRJQklMSVRZX1RZUEUgKi8KKy8qIHJldXNlIEdMX0lNQUdFX0ZPUk1BVF9DT01QQVRJQklMSVRZX0JZX1NJWkUgKi8KKy8qIHJldXNlIEdMX0lNQUdFX0ZPUk1BVF9DT01QQVRJQklMSVRZX0JZX0NMQVNTICovCisvKiByZXVzZSBHTF9NQVhfVkVSVEVYX0lNQUdFX1VOSUZPUk1TICovCisvKiByZXVzZSBHTF9NQVhfVEVTU19DT05UUk9MX0lNQUdFX1VOSUZPUk1TICovCisvKiByZXVzZSBHTF9NQVhfVEVTU19FVkFMVUFUSU9OX0lNQUdFX1VOSUZPUk1TICovCisvKiByZXVzZSBHTF9NQVhfR0VPTUVUUllfSU1BR0VfVU5JRk9STVMgKi8KKy8qIHJldXNlIEdMX01BWF9GUkFHTUVOVF9JTUFHRV9VTklGT1JNUyAqLworLyogcmV1c2UgR0xfTUFYX0NPTUJJTkVEX0lNQUdFX1VOSUZPUk1TICovCisvKiBSZXVzZSB0b2tlbnMgZnJvbSBBUkJfc2hhZGluZ19sYW5ndWFnZV9wYWNraW5nIChub25lKSAqLworLyogUmV1c2UgdG9rZW5zIGZyb20gQVJCX3RleHR1cmVfc3RvcmFnZSAqLworLyogcmV1c2UgR0xfVEVYVFVSRV9JTU1VVEFCTEVfRk9STUFUICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfbXVsdGl0ZXh0dXJlCisjZGVmaW5lIEdMX1RFWFRVUkUwX0FSQiAgICAgICAgICAgICAgICAgICAweDg0QzAKKyNkZWZpbmUgR0xfVEVYVFVSRTFfQVJCICAgICAgICAgICAgICAgICAgIDB4ODRDMQorI2RlZmluZSBHTF9URVhUVVJFMl9BUkIgICAgICAgICAgICAgICAgICAgMHg4NEMyCisjZGVmaW5lIEdMX1RFWFRVUkUzX0FSQiAgICAgICAgICAgICAgICAgICAweDg0QzMKKyNkZWZpbmUgR0xfVEVYVFVSRTRfQVJCICAgICAgICAgICAgICAgICAgIDB4ODRDNAorI2RlZmluZSBHTF9URVhUVVJFNV9BUkIgICAgICAgICAgICAgICAgICAgMHg4NEM1CisjZGVmaW5lIEdMX1RFWFRVUkU2X0FSQiAgICAgICAgICAgICAgICAgICAweDg0QzYKKyNkZWZpbmUgR0xfVEVYVFVSRTdfQVJCICAgICAgICAgICAgICAgICAgIDB4ODRDNworI2RlZmluZSBHTF9URVhUVVJFOF9BUkIgICAgICAgICAgICAgICAgICAgMHg4NEM4CisjZGVmaW5lIEdMX1RFWFRVUkU5X0FSQiAgICAgICAgICAgICAgICAgICAweDg0QzkKKyNkZWZpbmUgR0xfVEVYVFVSRTEwX0FSQiAgICAgICAgICAgICAgICAgIDB4ODRDQQorI2RlZmluZSBHTF9URVhUVVJFMTFfQVJCICAgICAgICAgICAgICAgICAgMHg4NENCCisjZGVmaW5lIEdMX1RFWFRVUkUxMl9BUkIgICAgICAgICAgICAgICAgICAweDg0Q0MKKyNkZWZpbmUgR0xfVEVYVFVSRTEzX0FSQiAgICAgICAgICAgICAgICAgIDB4ODRDRAorI2RlZmluZSBHTF9URVhUVVJFMTRfQVJCICAgICAgICAgICAgICAgICAgMHg4NENFCisjZGVmaW5lIEdMX1RFWFRVUkUxNV9BUkIgICAgICAgICAgICAgICAgICAweDg0Q0YKKyNkZWZpbmUgR0xfVEVYVFVSRTE2X0FSQiAgICAgICAgICAgICAgICAgIDB4ODREMAorI2RlZmluZSBHTF9URVhUVVJFMTdfQVJCICAgICAgICAgICAgICAgICAgMHg4NEQxCisjZGVmaW5lIEdMX1RFWFRVUkUxOF9BUkIgICAgICAgICAgICAgICAgICAweDg0RDIKKyNkZWZpbmUgR0xfVEVYVFVSRTE5X0FSQiAgICAgICAgICAgICAgICAgIDB4ODREMworI2RlZmluZSBHTF9URVhUVVJFMjBfQVJCICAgICAgICAgICAgICAgICAgMHg4NEQ0CisjZGVmaW5lIEdMX1RFWFRVUkUyMV9BUkIgICAgICAgICAgICAgICAgICAweDg0RDUKKyNkZWZpbmUgR0xfVEVYVFVSRTIyX0FSQiAgICAgICAgICAgICAgICAgIDB4ODRENgorI2RlZmluZSBHTF9URVhUVVJFMjNfQVJCICAgICAgICAgICAgICAgICAgMHg4NEQ3CisjZGVmaW5lIEdMX1RFWFRVUkUyNF9BUkIgICAgICAgICAgICAgICAgICAweDg0RDgKKyNkZWZpbmUgR0xfVEVYVFVSRTI1X0FSQiAgICAgICAgICAgICAgICAgIDB4ODREOQorI2RlZmluZSBHTF9URVhUVVJFMjZfQVJCICAgICAgICAgICAgICAgICAgMHg4NERBCisjZGVmaW5lIEdMX1RFWFRVUkUyN19BUkIgICAgICAgICAgICAgICAgICAweDg0REIKKyNkZWZpbmUgR0xfVEVYVFVSRTI4X0FSQiAgICAgICAgICAgICAgICAgIDB4ODREQworI2RlZmluZSBHTF9URVhUVVJFMjlfQVJCICAgICAgICAgICAgICAgICAgMHg4NERECisjZGVmaW5lIEdMX1RFWFRVUkUzMF9BUkIgICAgICAgICAgICAgICAgICAweDg0REUKKyNkZWZpbmUgR0xfVEVYVFVSRTMxX0FSQiAgICAgICAgICAgICAgICAgIDB4ODRERgorI2RlZmluZSBHTF9BQ1RJVkVfVEVYVFVSRV9BUkIgICAgICAgICAgICAgMHg4NEUwCisjZGVmaW5lIEdMX0NMSUVOVF9BQ1RJVkVfVEVYVFVSRV9BUkIgICAgICAweDg0RTEKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfVU5JVFNfQVJCICAgICAgICAgIDB4ODRFMgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RyYW5zcG9zZV9tYXRyaXgKKyNkZWZpbmUgR0xfVFJBTlNQT1NFX01PREVMVklFV19NQVRSSVhfQVJCIDB4ODRFMworI2RlZmluZSBHTF9UUkFOU1BPU0VfUFJPSkVDVElPTl9NQVRSSVhfQVJCIDB4ODRFNAorI2RlZmluZSBHTF9UUkFOU1BPU0VfVEVYVFVSRV9NQVRSSVhfQVJCICAgMHg4NEU1CisjZGVmaW5lIEdMX1RSQU5TUE9TRV9DT0xPUl9NQVRSSVhfQVJCICAgICAweDg0RTYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9BUkIgICAgICAgICAgICAgICAgMHg4MDlECisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRV9BUkIgICAweDgwOUUKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX09ORV9BUkIgICAgICAgIDB4ODA5RgorI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0VfQVJCICAgICAgICAgICAgMHg4MEEwCisjZGVmaW5lIEdMX1NBTVBMRV9CVUZGRVJTX0FSQiAgICAgICAgICAgICAweDgwQTgKKyNkZWZpbmUgR0xfU0FNUExFU19BUkIgICAgICAgICAgICAgICAgICAgIDB4ODBBOQorI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0VfVkFMVUVfQVJCICAgICAgMHg4MEFBCisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlRfQVJCICAgICAweDgwQUIKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQklUX0FSQiAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2Vudl9hZGQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2N1YmVfbWFwCisjZGVmaW5lIEdMX05PUk1BTF9NQVBfQVJCICAgICAgICAgICAgICAgICAweDg1MTEKKyNkZWZpbmUgR0xfUkVGTEVDVElPTl9NQVBfQVJCICAgICAgICAgICAgIDB4ODUxMgorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX0FSQiAgICAgICAgICAgMHg4NTEzCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUF9BUkIgICAweDg1MTQKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YX0FSQiAweDg1MTUKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YX0FSQiAweDg1MTYKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZX0FSQiAweDg1MTcKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZX0FSQiAweDg1MTgKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aX0FSQiAweDg1MTkKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aX0FSQiAweDg1MUEKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV9DVUJFX01BUF9BUkIgICAgIDB4ODUxQgorI2RlZmluZSBHTF9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFX0FSQiAgMHg4NTFDCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9jb21wcmVzc2lvbgorI2RlZmluZSBHTF9DT01QUkVTU0VEX0FMUEhBX0FSQiAgICAgICAgICAgMHg4NEU5CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfTFVNSU5BTkNFX0FSQiAgICAgICAweDg0RUEKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9MVU1JTkFOQ0VfQUxQSEFfQVJCIDB4ODRFQgorI2RlZmluZSBHTF9DT01QUkVTU0VEX0lOVEVOU0lUWV9BUkIgICAgICAgMHg4NEVDCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCX0FSQiAgICAgICAgICAgICAweDg0RUQKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX0FSQiAgICAgICAgICAgIDB4ODRFRQorI2RlZmluZSBHTF9URVhUVVJFX0NPTVBSRVNTSU9OX0hJTlRfQVJCICAgMHg4NEVGCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUFJFU1NFRF9JTUFHRV9TSVpFX0FSQiAweDg2QTAKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QUkVTU0VEX0FSQiAgICAgICAgIDB4ODZBMQorI2RlZmluZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFNfQVJCIDB4ODZBMgorI2RlZmluZSBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUU19BUkIgMHg4NkEzCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9ib3JkZXJfY2xhbXAKKyNkZWZpbmUgR0xfQ0xBTVBfVE9fQk9SREVSX0FSQiAgICAgICAgICAgIDB4ODEyRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3BvaW50X3BhcmFtZXRlcnMKKyNkZWZpbmUgR0xfUE9JTlRfU0laRV9NSU5fQVJCICAgICAgICAgICAgIDB4ODEyNgorI2RlZmluZSBHTF9QT0lOVF9TSVpFX01BWF9BUkIgICAgICAgICAgICAgMHg4MTI3CisjZGVmaW5lIEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkVfQVJCICAweDgxMjgKKyNkZWZpbmUgR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT05fQVJCIDB4ODEyOQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3ZlcnRleF9ibGVuZAorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1VOSVRTX0FSQiAgICAgICAgICAgMHg4NkE0CisjZGVmaW5lIEdMX0FDVElWRV9WRVJURVhfVU5JVFNfQVJCICAgICAgICAweDg2QTUKKyNkZWZpbmUgR0xfV0VJR0hUX1NVTV9VTklUWV9BUkIgICAgICAgICAgIDB4ODZBNgorI2RlZmluZSBHTF9WRVJURVhfQkxFTkRfQVJCICAgICAgICAgICAgICAgMHg4NkE3CisjZGVmaW5lIEdMX0NVUlJFTlRfV0VJR0hUX0FSQiAgICAgICAgICAgICAweDg2QTgKKyNkZWZpbmUgR0xfV0VJR0hUX0FSUkFZX1RZUEVfQVJCICAgICAgICAgIDB4ODZBOQorI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfU1RSSURFX0FSQiAgICAgICAgMHg4NkFBCisjZGVmaW5lIEdMX1dFSUdIVF9BUlJBWV9TSVpFX0FSQiAgICAgICAgICAweDg2QUIKKyNkZWZpbmUgR0xfV0VJR0hUX0FSUkFZX1BPSU5URVJfQVJCICAgICAgIDB4ODZBQworI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfQVJCICAgICAgICAgICAgICAgMHg4NkFECisjZGVmaW5lIEdMX01PREVMVklFVzBfQVJCICAgICAgICAgICAgICAgICAweDE3MDAKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMV9BUkIgICAgICAgICAgICAgICAgIDB4ODUwQQorI2RlZmluZSBHTF9NT0RFTFZJRVcyX0FSQiAgICAgICAgICAgICAgICAgMHg4NzIyCisjZGVmaW5lIEdMX01PREVMVklFVzNfQVJCICAgICAgICAgICAgICAgICAweDg3MjMKKyNkZWZpbmUgR0xfTU9ERUxWSUVXNF9BUkIgICAgICAgICAgICAgICAgIDB4ODcyNAorI2RlZmluZSBHTF9NT0RFTFZJRVc1X0FSQiAgICAgICAgICAgICAgICAgMHg4NzI1CisjZGVmaW5lIEdMX01PREVMVklFVzZfQVJCICAgICAgICAgICAgICAgICAweDg3MjYKKyNkZWZpbmUgR0xfTU9ERUxWSUVXN19BUkIgICAgICAgICAgICAgICAgIDB4ODcyNworI2RlZmluZSBHTF9NT0RFTFZJRVc4X0FSQiAgICAgICAgICAgICAgICAgMHg4NzI4CisjZGVmaW5lIEdMX01PREVMVklFVzlfQVJCICAgICAgICAgICAgICAgICAweDg3MjkKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMTBfQVJCICAgICAgICAgICAgICAgIDB4ODcyQQorI2RlZmluZSBHTF9NT0RFTFZJRVcxMV9BUkIgICAgICAgICAgICAgICAgMHg4NzJCCisjZGVmaW5lIEdMX01PREVMVklFVzEyX0FSQiAgICAgICAgICAgICAgICAweDg3MkMKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMTNfQVJCICAgICAgICAgICAgICAgIDB4ODcyRAorI2RlZmluZSBHTF9NT0RFTFZJRVcxNF9BUkIgICAgICAgICAgICAgICAgMHg4NzJFCisjZGVmaW5lIEdMX01PREVMVklFVzE1X0FSQiAgICAgICAgICAgICAgICAweDg3MkYKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMTZfQVJCICAgICAgICAgICAgICAgIDB4ODczMAorI2RlZmluZSBHTF9NT0RFTFZJRVcxN19BUkIgICAgICAgICAgICAgICAgMHg4NzMxCisjZGVmaW5lIEdMX01PREVMVklFVzE4X0FSQiAgICAgICAgICAgICAgICAweDg3MzIKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMTlfQVJCICAgICAgICAgICAgICAgIDB4ODczMworI2RlZmluZSBHTF9NT0RFTFZJRVcyMF9BUkIgICAgICAgICAgICAgICAgMHg4NzM0CisjZGVmaW5lIEdMX01PREVMVklFVzIxX0FSQiAgICAgICAgICAgICAgICAweDg3MzUKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMjJfQVJCICAgICAgICAgICAgICAgIDB4ODczNgorI2RlZmluZSBHTF9NT0RFTFZJRVcyM19BUkIgICAgICAgICAgICAgICAgMHg4NzM3CisjZGVmaW5lIEdMX01PREVMVklFVzI0X0FSQiAgICAgICAgICAgICAgICAweDg3MzgKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMjVfQVJCICAgICAgICAgICAgICAgIDB4ODczOQorI2RlZmluZSBHTF9NT0RFTFZJRVcyNl9BUkIgICAgICAgICAgICAgICAgMHg4NzNBCisjZGVmaW5lIEdMX01PREVMVklFVzI3X0FSQiAgICAgICAgICAgICAgICAweDg3M0IKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMjhfQVJCICAgICAgICAgICAgICAgIDB4ODczQworI2RlZmluZSBHTF9NT0RFTFZJRVcyOV9BUkIgICAgICAgICAgICAgICAgMHg4NzNECisjZGVmaW5lIEdMX01PREVMVklFVzMwX0FSQiAgICAgICAgICAgICAgICAweDg3M0UKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMzFfQVJCICAgICAgICAgICAgICAgIDB4ODczRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX21hdHJpeF9wYWxldHRlCisjZGVmaW5lIEdMX01BVFJJWF9QQUxFVFRFX0FSQiAgICAgICAgICAgICAweDg4NDAKKyNkZWZpbmUgR0xfTUFYX01BVFJJWF9QQUxFVFRFX1NUQUNLX0RFUFRIX0FSQiAweDg4NDEKKyNkZWZpbmUgR0xfTUFYX1BBTEVUVEVfTUFUUklDRVNfQVJCICAgICAgIDB4ODg0MgorI2RlZmluZSBHTF9DVVJSRU5UX1BBTEVUVEVfTUFUUklYX0FSQiAgICAgMHg4ODQzCisjZGVmaW5lIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9BUkIgICAgICAgICAweDg4NDQKKyNkZWZpbmUgR0xfQ1VSUkVOVF9NQVRSSVhfSU5ERVhfQVJCICAgICAgIDB4ODg0NQorI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU0laRV9BUkIgICAgMHg4ODQ2CisjZGVmaW5lIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9UWVBFX0FSQiAgICAweDg4NDcKKyNkZWZpbmUgR0xfTUFUUklYX0lOREVYX0FSUkFZX1NUUklERV9BUkIgIDB4ODg0OAorI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfUE9JTlRFUl9BUkIgMHg4ODQ5CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9lbnZfY29tYmluZQorI2RlZmluZSBHTF9DT01CSU5FX0FSQiAgICAgICAgICAgICAgICAgICAgMHg4NTcwCisjZGVmaW5lIEdMX0NPTUJJTkVfUkdCX0FSQiAgICAgICAgICAgICAgICAweDg1NzEKKyNkZWZpbmUgR0xfQ09NQklORV9BTFBIQV9BUkIgICAgICAgICAgICAgIDB4ODU3MgorI2RlZmluZSBHTF9TT1VSQ0UwX1JHQl9BUkIgICAgICAgICAgICAgICAgMHg4NTgwCisjZGVmaW5lIEdMX1NPVVJDRTFfUkdCX0FSQiAgICAgICAgICAgICAgICAweDg1ODEKKyNkZWZpbmUgR0xfU09VUkNFMl9SR0JfQVJCICAgICAgICAgICAgICAgIDB4ODU4MgorI2RlZmluZSBHTF9TT1VSQ0UwX0FMUEhBX0FSQiAgICAgICAgICAgICAgMHg4NTg4CisjZGVmaW5lIEdMX1NPVVJDRTFfQUxQSEFfQVJCICAgICAgICAgICAgICAweDg1ODkKKyNkZWZpbmUgR0xfU09VUkNFMl9BTFBIQV9BUkIgICAgICAgICAgICAgIDB4ODU4QQorI2RlZmluZSBHTF9PUEVSQU5EMF9SR0JfQVJCICAgICAgICAgICAgICAgMHg4NTkwCisjZGVmaW5lIEdMX09QRVJBTkQxX1JHQl9BUkIgICAgICAgICAgICAgICAweDg1OTEKKyNkZWZpbmUgR0xfT1BFUkFORDJfUkdCX0FSQiAgICAgICAgICAgICAgIDB4ODU5MgorI2RlZmluZSBHTF9PUEVSQU5EMF9BTFBIQV9BUkIgICAgICAgICAgICAgMHg4NTk4CisjZGVmaW5lIEdMX09QRVJBTkQxX0FMUEhBX0FSQiAgICAgICAgICAgICAweDg1OTkKKyNkZWZpbmUgR0xfT1BFUkFORDJfQUxQSEFfQVJCICAgICAgICAgICAgIDB4ODU5QQorI2RlZmluZSBHTF9SR0JfU0NBTEVfQVJCICAgICAgICAgICAgICAgICAgMHg4NTczCisjZGVmaW5lIEdMX0FERF9TSUdORURfQVJCICAgICAgICAgICAgICAgICAweDg1NzQKKyNkZWZpbmUgR0xfSU5URVJQT0xBVEVfQVJCICAgICAgICAgICAgICAgIDB4ODU3NQorI2RlZmluZSBHTF9TVUJUUkFDVF9BUkIgICAgICAgICAgICAgICAgICAgMHg4NEU3CisjZGVmaW5lIEdMX0NPTlNUQU5UX0FSQiAgICAgICAgICAgICAgICAgICAweDg1NzYKKyNkZWZpbmUgR0xfUFJJTUFSWV9DT0xPUl9BUkIgICAgICAgICAgICAgIDB4ODU3NworI2RlZmluZSBHTF9QUkVWSU9VU19BUkIgICAgICAgICAgICAgICAgICAgMHg4NTc4CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9lbnZfY3Jvc3NiYXIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2Vudl9kb3QzCisjZGVmaW5lIEdMX0RPVDNfUkdCX0FSQiAgICAgICAgICAgICAgICAgICAweDg2QUUKKyNkZWZpbmUgR0xfRE9UM19SR0JBX0FSQiAgICAgICAgICAgICAgICAgIDB4ODZBRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfbWlycm9yZWRfcmVwZWF0CisjZGVmaW5lIEdMX01JUlJPUkVEX1JFUEVBVF9BUkIgICAgICAgICAgICAweDgzNzAKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9kZXB0aF90ZXh0dXJlCisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDE2X0FSQiAgICAgICAgICAweDgxQTUKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMjRfQVJCICAgICAgICAgIDB4ODFBNgorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQzMl9BUkIgICAgICAgICAgMHg4MUE3CisjZGVmaW5lIEdMX1RFWFRVUkVfREVQVEhfU0laRV9BUkIgICAgICAgICAweDg4NEEKKyNkZWZpbmUgR0xfREVQVEhfVEVYVFVSRV9NT0RFX0FSQiAgICAgICAgIDB4ODg0QgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRvdworI2RlZmluZSBHTF9URVhUVVJFX0NPTVBBUkVfTU9ERV9BUkIgICAgICAgMHg4ODRDCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUEFSRV9GVU5DX0FSQiAgICAgICAweDg4NEQKKyNkZWZpbmUgR0xfQ09NUEFSRV9SX1RPX1RFWFRVUkVfQVJCICAgICAgIDB4ODg0RQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRvd19hbWJpZW50CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUEFSRV9GQUlMX1ZBTFVFX0FSQiAweDgwQkYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl93aW5kb3dfcG9zCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdmVydGV4X3Byb2dyYW0KKyNkZWZpbmUgR0xfQ09MT1JfU1VNX0FSQiAgICAgICAgICAgICAgICAgIDB4ODQ1OAorI2RlZmluZSBHTF9WRVJURVhfUFJPR1JBTV9BUkIgICAgICAgICAgICAgMHg4NjIwCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRF9BUkIgMHg4NjIyCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU0laRV9BUkIgICAweDg2MjMKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9TVFJJREVfQVJCIDB4ODYyNAorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1RZUEVfQVJCICAgMHg4NjI1CisjZGVmaW5lIEdMX0NVUlJFTlRfVkVSVEVYX0FUVFJJQl9BUkIgICAgICAweDg2MjYKKyNkZWZpbmUgR0xfUFJPR1JBTV9MRU5HVEhfQVJCICAgICAgICAgICAgIDB4ODYyNworI2RlZmluZSBHTF9QUk9HUkFNX1NUUklOR19BUkIgICAgICAgICAgICAgMHg4NjI4CisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX01BVFJJWF9TVEFDS19ERVBUSF9BUkIgMHg4NjJFCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX01BVFJJQ0VTX0FSQiAgICAgICAweDg2MkYKKyNkZWZpbmUgR0xfQ1VSUkVOVF9NQVRSSVhfU1RBQ0tfREVQVEhfQVJCIDB4ODY0MAorI2RlZmluZSBHTF9DVVJSRU5UX01BVFJJWF9BUkIgICAgICAgICAgICAgMHg4NjQxCisjZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX1BPSU5UX1NJWkVfQVJCICAweDg2NDIKKyNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fVFdPX1NJREVfQVJCICAgIDB4ODY0MworI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVJfQVJCIDB4ODY0NQorI2RlZmluZSBHTF9QUk9HUkFNX0VSUk9SX1BPU0lUSU9OX0FSQiAgICAgMHg4NjRCCisjZGVmaW5lIEdMX1BST0dSQU1fQklORElOR19BUkIgICAgICAgICAgICAweDg2NzcKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9BVFRSSUJTX0FSQiAgICAgICAgIDB4ODg2OQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX05PUk1BTElaRURfQVJCIDB4ODg2QQorI2RlZmluZSBHTF9QUk9HUkFNX0VSUk9SX1NUUklOR19BUkIgICAgICAgMHg4ODc0CisjZGVmaW5lIEdMX1BST0dSQU1fRk9STUFUX0FTQ0lJX0FSQiAgICAgICAweDg4NzUKKyNkZWZpbmUgR0xfUFJPR1JBTV9GT1JNQVRfQVJCICAgICAgICAgICAgIDB4ODg3NgorI2RlZmluZSBHTF9QUk9HUkFNX0lOU1RSVUNUSU9OU19BUkIgICAgICAgMHg4OEEwCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0lOU1RSVUNUSU9OU19BUkIgICAweDg4QTEKKyNkZWZpbmUgR0xfUFJPR1JBTV9OQVRJVkVfSU5TVFJVQ1RJT05TX0FSQiAweDg4QTIKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTkFUSVZFX0lOU1RSVUNUSU9OU19BUkIgMHg4OEEzCisjZGVmaW5lIEdMX1BST0dSQU1fVEVNUE9SQVJJRVNfQVJCICAgICAgICAweDg4QTQKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fVEVNUE9SQVJJRVNfQVJCICAgIDB4ODhBNQorI2RlZmluZSBHTF9QUk9HUkFNX05BVElWRV9URU1QT1JBUklFU19BUkIgMHg4OEE2CisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX05BVElWRV9URU1QT1JBUklFU19BUkIgMHg4OEE3CisjZGVmaW5lIEdMX1BST0dSQU1fUEFSQU1FVEVSU19BUkIgICAgICAgICAweDg4QTgKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fUEFSQU1FVEVSU19BUkIgICAgIDB4ODhBOQorI2RlZmluZSBHTF9QUk9HUkFNX05BVElWRV9QQVJBTUVURVJTX0FSQiAgMHg4OEFBCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX05BVElWRV9QQVJBTUVURVJTX0FSQiAweDg4QUIKKyNkZWZpbmUgR0xfUFJPR1JBTV9BVFRSSUJTX0FSQiAgICAgICAgICAgIDB4ODhBQworI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9BVFRSSUJTX0FSQiAgICAgICAgMHg4OEFECisjZGVmaW5lIEdMX1BST0dSQU1fTkFUSVZFX0FUVFJJQlNfQVJCICAgICAweDg4QUUKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTkFUSVZFX0FUVFJJQlNfQVJCIDB4ODhBRgorI2RlZmluZSBHTF9QUk9HUkFNX0FERFJFU1NfUkVHSVNURVJTX0FSQiAgMHg4OEIwCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0FERFJFU1NfUkVHSVNURVJTX0FSQiAweDg4QjEKKyNkZWZpbmUgR0xfUFJPR1JBTV9OQVRJVkVfQUREUkVTU19SRUdJU1RFUlNfQVJCIDB4ODhCMgorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfQUREUkVTU19SRUdJU1RFUlNfQVJCIDB4ODhCMworI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9MT0NBTF9QQVJBTUVURVJTX0FSQiAweDg4QjQKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fRU5WX1BBUkFNRVRFUlNfQVJCIDB4ODhCNQorI2RlZmluZSBHTF9QUk9HUkFNX1VOREVSX05BVElWRV9MSU1JVFNfQVJCIDB4ODhCNgorI2RlZmluZSBHTF9UUkFOU1BPU0VfQ1VSUkVOVF9NQVRSSVhfQVJCICAgMHg4OEI3CisjZGVmaW5lIEdMX01BVFJJWDBfQVJCICAgICAgICAgICAgICAgICAgICAweDg4QzAKKyNkZWZpbmUgR0xfTUFUUklYMV9BUkIgICAgICAgICAgICAgICAgICAgIDB4ODhDMQorI2RlZmluZSBHTF9NQVRSSVgyX0FSQiAgICAgICAgICAgICAgICAgICAgMHg4OEMyCisjZGVmaW5lIEdMX01BVFJJWDNfQVJCICAgICAgICAgICAgICAgICAgICAweDg4QzMKKyNkZWZpbmUgR0xfTUFUUklYNF9BUkIgICAgICAgICAgICAgICAgICAgIDB4ODhDNAorI2RlZmluZSBHTF9NQVRSSVg1X0FSQiAgICAgICAgICAgICAgICAgICAgMHg4OEM1CisjZGVmaW5lIEdMX01BVFJJWDZfQVJCICAgICAgICAgICAgICAgICAgICAweDg4QzYKKyNkZWZpbmUgR0xfTUFUUklYN19BUkIgICAgICAgICAgICAgICAgICAgIDB4ODhDNworI2RlZmluZSBHTF9NQVRSSVg4X0FSQiAgICAgICAgICAgICAgICAgICAgMHg4OEM4CisjZGVmaW5lIEdMX01BVFJJWDlfQVJCICAgICAgICAgICAgICAgICAgICAweDg4QzkKKyNkZWZpbmUgR0xfTUFUUklYMTBfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhDQQorI2RlZmluZSBHTF9NQVRSSVgxMV9BUkIgICAgICAgICAgICAgICAgICAgMHg4OENCCisjZGVmaW5lIEdMX01BVFJJWDEyX0FSQiAgICAgICAgICAgICAgICAgICAweDg4Q0MKKyNkZWZpbmUgR0xfTUFUUklYMTNfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhDRAorI2RlZmluZSBHTF9NQVRSSVgxNF9BUkIgICAgICAgICAgICAgICAgICAgMHg4OENFCisjZGVmaW5lIEdMX01BVFJJWDE1X0FSQiAgICAgICAgICAgICAgICAgICAweDg4Q0YKKyNkZWZpbmUgR0xfTUFUUklYMTZfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhEMAorI2RlZmluZSBHTF9NQVRSSVgxN19BUkIgICAgICAgICAgICAgICAgICAgMHg4OEQxCisjZGVmaW5lIEdMX01BVFJJWDE4X0FSQiAgICAgICAgICAgICAgICAgICAweDg4RDIKKyNkZWZpbmUgR0xfTUFUUklYMTlfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhEMworI2RlZmluZSBHTF9NQVRSSVgyMF9BUkIgICAgICAgICAgICAgICAgICAgMHg4OEQ0CisjZGVmaW5lIEdMX01BVFJJWDIxX0FSQiAgICAgICAgICAgICAgICAgICAweDg4RDUKKyNkZWZpbmUgR0xfTUFUUklYMjJfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhENgorI2RlZmluZSBHTF9NQVRSSVgyM19BUkIgICAgICAgICAgICAgICAgICAgMHg4OEQ3CisjZGVmaW5lIEdMX01BVFJJWDI0X0FSQiAgICAgICAgICAgICAgICAgICAweDg4RDgKKyNkZWZpbmUgR0xfTUFUUklYMjVfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhEOQorI2RlZmluZSBHTF9NQVRSSVgyNl9BUkIgICAgICAgICAgICAgICAgICAgMHg4OERBCisjZGVmaW5lIEdMX01BVFJJWDI3X0FSQiAgICAgICAgICAgICAgICAgICAweDg4REIKKyNkZWZpbmUgR0xfTUFUUklYMjhfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhEQworI2RlZmluZSBHTF9NQVRSSVgyOV9BUkIgICAgICAgICAgICAgICAgICAgMHg4OERECisjZGVmaW5lIEdMX01BVFJJWDMwX0FSQiAgICAgICAgICAgICAgICAgICAweDg4REUKKyNkZWZpbmUgR0xfTUFUUklYMzFfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhERgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2ZyYWdtZW50X3Byb2dyYW0KKyNkZWZpbmUgR0xfRlJBR01FTlRfUFJPR1JBTV9BUkIgICAgICAgICAgIDB4ODgwNAorI2RlZmluZSBHTF9QUk9HUkFNX0FMVV9JTlNUUlVDVElPTlNfQVJCICAgMHg4ODA1CisjZGVmaW5lIEdMX1BST0dSQU1fVEVYX0lOU1RSVUNUSU9OU19BUkIgICAweDg4MDYKKyNkZWZpbmUgR0xfUFJPR1JBTV9URVhfSU5ESVJFQ1RJT05TX0FSQiAgIDB4ODgwNworI2RlZmluZSBHTF9QUk9HUkFNX05BVElWRV9BTFVfSU5TVFJVQ1RJT05TX0FSQiAweDg4MDgKKyNkZWZpbmUgR0xfUFJPR1JBTV9OQVRJVkVfVEVYX0lOU1RSVUNUSU9OU19BUkIgMHg4ODA5CisjZGVmaW5lIEdMX1BST0dSQU1fTkFUSVZFX1RFWF9JTkRJUkVDVElPTlNfQVJCIDB4ODgwQQorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9BTFVfSU5TVFJVQ1RJT05TX0FSQiAweDg4MEIKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fVEVYX0lOU1RSVUNUSU9OU19BUkIgMHg4ODBDCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX1RFWF9JTkRJUkVDVElPTlNfQVJCIDB4ODgwRAorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfQUxVX0lOU1RSVUNUSU9OU19BUkIgMHg4ODBFCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX05BVElWRV9URVhfSU5TVFJVQ1RJT05TX0FSQiAweDg4MEYKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTkFUSVZFX1RFWF9JTkRJUkVDVElPTlNfQVJCIDB4ODgxMAorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9DT09SRFNfQVJCICAgICAgICAgMHg4ODcxCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX0lNQUdFX1VOSVRTX0FSQiAgICAweDg4NzIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9CVUZGRVJfU0laRV9BUkIgICAgICAgICAgICAgICAgMHg4NzY0CisjZGVmaW5lIEdMX0JVRkZFUl9VU0FHRV9BUkIgICAgICAgICAgICAgICAweDg3NjUKKyNkZWZpbmUgR0xfQVJSQVlfQlVGRkVSX0FSQiAgICAgICAgICAgICAgIDB4ODg5MgorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9BUkIgICAgICAgMHg4ODkzCisjZGVmaW5lIEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAgICAgICAweDg4OTQKKyNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElOR19BUkIgMHg4ODk1CisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElOR19BUkIgMHg4ODk2CisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElOR19BUkIgMHg4ODk3CisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAweDg4OTgKKyNkZWZpbmUgR0xfSU5ERVhfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5OQorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAweDg4OUEKKyNkZWZpbmUgR0xfRURHRV9GTEFHX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAweDg4OUIKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAweDg4OUMKKyNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5RAorI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5RQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAweDg4OUYKKyNkZWZpbmUgR0xfUkVBRF9PTkxZX0FSQiAgICAgICAgICAgICAgICAgIDB4ODhCOAorI2RlZmluZSBHTF9XUklURV9PTkxZX0FSQiAgICAgICAgICAgICAgICAgMHg4OEI5CisjZGVmaW5lIEdMX1JFQURfV1JJVEVfQVJCICAgICAgICAgICAgICAgICAweDg4QkEKKyNkZWZpbmUgR0xfQlVGRkVSX0FDQ0VTU19BUkIgICAgICAgICAgICAgIDB4ODhCQgorI2RlZmluZSBHTF9CVUZGRVJfTUFQUEVEX0FSQiAgICAgICAgICAgICAgMHg4OEJDCisjZGVmaW5lIEdMX0JVRkZFUl9NQVBfUE9JTlRFUl9BUkIgICAgICAgICAweDg4QkQKKyNkZWZpbmUgR0xfU1RSRUFNX0RSQVdfQVJCICAgICAgICAgICAgICAgIDB4ODhFMAorI2RlZmluZSBHTF9TVFJFQU1fUkVBRF9BUkIgICAgICAgICAgICAgICAgMHg4OEUxCisjZGVmaW5lIEdMX1NUUkVBTV9DT1BZX0FSQiAgICAgICAgICAgICAgICAweDg4RTIKKyNkZWZpbmUgR0xfU1RBVElDX0RSQVdfQVJCICAgICAgICAgICAgICAgIDB4ODhFNAorI2RlZmluZSBHTF9TVEFUSUNfUkVBRF9BUkIgICAgICAgICAgICAgICAgMHg4OEU1CisjZGVmaW5lIEdMX1NUQVRJQ19DT1BZX0FSQiAgICAgICAgICAgICAgICAweDg4RTYKKyNkZWZpbmUgR0xfRFlOQU1JQ19EUkFXX0FSQiAgICAgICAgICAgICAgIDB4ODhFOAorI2RlZmluZSBHTF9EWU5BTUlDX1JFQURfQVJCICAgICAgICAgICAgICAgMHg4OEU5CisjZGVmaW5lIEdMX0RZTkFNSUNfQ09QWV9BUkIgICAgICAgICAgICAgICAweDg4RUEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9vY2NsdXNpb25fcXVlcnkKKyNkZWZpbmUgR0xfUVVFUllfQ09VTlRFUl9CSVRTX0FSQiAgICAgICAgIDB4ODg2NAorI2RlZmluZSBHTF9DVVJSRU5UX1FVRVJZX0FSQiAgICAgICAgICAgICAgMHg4ODY1CisjZGVmaW5lIEdMX1FVRVJZX1JFU1VMVF9BUkIgICAgICAgICAgICAgICAweDg4NjYKKyNkZWZpbmUgR0xfUVVFUllfUkVTVUxUX0FWQUlMQUJMRV9BUkIgICAgIDB4ODg2NworI2RlZmluZSBHTF9TQU1QTEVTX1BBU1NFRF9BUkIgICAgICAgICAgICAgMHg4OTE0CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZGVyX29iamVjdHMKKyNkZWZpbmUgR0xfUFJPR1JBTV9PQkpFQ1RfQVJCICAgICAgICAgICAgIDB4OEI0MAorI2RlZmluZSBHTF9TSEFERVJfT0JKRUNUX0FSQiAgICAgICAgICAgICAgMHg4QjQ4CisjZGVmaW5lIEdMX09CSkVDVF9UWVBFX0FSQiAgICAgICAgICAgICAgICAweDhCNEUKKyNkZWZpbmUgR0xfT0JKRUNUX1NVQlRZUEVfQVJCICAgICAgICAgICAgIDB4OEI0RgorI2RlZmluZSBHTF9GTE9BVF9WRUMyX0FSQiAgICAgICAgICAgICAgICAgMHg4QjUwCisjZGVmaW5lIEdMX0ZMT0FUX1ZFQzNfQVJCICAgICAgICAgICAgICAgICAweDhCNTEKKyNkZWZpbmUgR0xfRkxPQVRfVkVDNF9BUkIgICAgICAgICAgICAgICAgIDB4OEI1MgorI2RlZmluZSBHTF9JTlRfVkVDMl9BUkIgICAgICAgICAgICAgICAgICAgMHg4QjUzCisjZGVmaW5lIEdMX0lOVF9WRUMzX0FSQiAgICAgICAgICAgICAgICAgICAweDhCNTQKKyNkZWZpbmUgR0xfSU5UX1ZFQzRfQVJCICAgICAgICAgICAgICAgICAgIDB4OEI1NQorI2RlZmluZSBHTF9CT09MX0FSQiAgICAgICAgICAgICAgICAgICAgICAgMHg4QjU2CisjZGVmaW5lIEdMX0JPT0xfVkVDMl9BUkIgICAgICAgICAgICAgICAgICAweDhCNTcKKyNkZWZpbmUgR0xfQk9PTF9WRUMzX0FSQiAgICAgICAgICAgICAgICAgIDB4OEI1OAorI2RlZmluZSBHTF9CT09MX1ZFQzRfQVJCICAgICAgICAgICAgICAgICAgMHg4QjU5CisjZGVmaW5lIEdMX0ZMT0FUX01BVDJfQVJCICAgICAgICAgICAgICAgICAweDhCNUEKKyNkZWZpbmUgR0xfRkxPQVRfTUFUM19BUkIgICAgICAgICAgICAgICAgIDB4OEI1QgorI2RlZmluZSBHTF9GTE9BVF9NQVQ0X0FSQiAgICAgICAgICAgICAgICAgMHg4QjVDCisjZGVmaW5lIEdMX1NBTVBMRVJfMURfQVJCICAgICAgICAgICAgICAgICAweDhCNUQKKyNkZWZpbmUgR0xfU0FNUExFUl8yRF9BUkIgICAgICAgICAgICAgICAgIDB4OEI1RQorI2RlZmluZSBHTF9TQU1QTEVSXzNEX0FSQiAgICAgICAgICAgICAgICAgMHg4QjVGCisjZGVmaW5lIEdMX1NBTVBMRVJfQ1VCRV9BUkIgICAgICAgICAgICAgICAweDhCNjAKKyNkZWZpbmUgR0xfU0FNUExFUl8xRF9TSEFET1dfQVJCICAgICAgICAgIDB4OEI2MQorI2RlZmluZSBHTF9TQU1QTEVSXzJEX1NIQURPV19BUkIgICAgICAgICAgMHg4QjYyCisjZGVmaW5lIEdMX1NBTVBMRVJfMkRfUkVDVF9BUkIgICAgICAgICAgICAweDhCNjMKKyNkZWZpbmUgR0xfU0FNUExFUl8yRF9SRUNUX1NIQURPV19BUkIgICAgIDB4OEI2NAorI2RlZmluZSBHTF9PQkpFQ1RfREVMRVRFX1NUQVRVU19BUkIgICAgICAgMHg4QjgwCisjZGVmaW5lIEdMX09CSkVDVF9DT01QSUxFX1NUQVRVU19BUkIgICAgICAweDhCODEKKyNkZWZpbmUgR0xfT0JKRUNUX0xJTktfU1RBVFVTX0FSQiAgICAgICAgIDB4OEI4MgorI2RlZmluZSBHTF9PQkpFQ1RfVkFMSURBVEVfU1RBVFVTX0FSQiAgICAgMHg4QjgzCisjZGVmaW5lIEdMX09CSkVDVF9JTkZPX0xPR19MRU5HVEhfQVJCICAgICAweDhCODQKKyNkZWZpbmUgR0xfT0JKRUNUX0FUVEFDSEVEX09CSkVDVFNfQVJCICAgIDB4OEI4NQorI2RlZmluZSBHTF9PQkpFQ1RfQUNUSVZFX1VOSUZPUk1TX0FSQiAgICAgMHg4Qjg2CisjZGVmaW5lIEdMX09CSkVDVF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RIX0FSQiAweDhCODcKKyNkZWZpbmUgR0xfT0JKRUNUX1NIQURFUl9TT1VSQ0VfTEVOR1RIX0FSQiAweDhCODgKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfc2hhZGVyCisjZGVmaW5lIEdMX1ZFUlRFWF9TSEFERVJfQVJCICAgICAgICAgICAgICAweDhCMzEKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFNfQVJCIDB4OEI0QQorI2RlZmluZSBHTF9NQVhfVkFSWUlOR19GTE9BVFNfQVJCICAgICAgICAgMHg4QjRCCisjZGVmaW5lIEdMX01BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUU19BUkIgMHg4QjRDCisjZGVmaW5lIEdMX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTX0FSQiAweDhCNEQKKyNkZWZpbmUgR0xfT0JKRUNUX0FDVElWRV9BVFRSSUJVVEVTX0FSQiAgIDB4OEI4OQorI2RlZmluZSBHTF9PQkpFQ1RfQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RIX0FSQiAweDhCOEEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9mcmFnbWVudF9zaGFkZXIKKyNkZWZpbmUgR0xfRlJBR01FTlRfU0hBREVSX0FSQiAgICAgICAgICAgIDB4OEIzMAorI2RlZmluZSBHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTX0FSQiAweDhCNDkKKyNkZWZpbmUgR0xfRlJBR01FTlRfU0hBREVSX0RFUklWQVRJVkVfSElOVF9BUkIgMHg4QjhCCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZGluZ19sYW5ndWFnZV8xMDAKKyNkZWZpbmUgR0xfU0hBRElOR19MQU5HVUFHRV9WRVJTSU9OX0FSQiAgIDB4OEI4QworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfbm9uX3Bvd2VyX29mX3R3bworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3BvaW50X3Nwcml0ZQorI2RlZmluZSBHTF9QT0lOVF9TUFJJVEVfQVJCICAgICAgICAgICAgICAgMHg4ODYxCisjZGVmaW5lIEdMX0NPT1JEX1JFUExBQ0VfQVJCICAgICAgICAgICAgICAweDg4NjIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9mcmFnbWVudF9wcm9ncmFtX3NoYWRvdworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2RyYXdfYnVmZmVycworI2RlZmluZSBHTF9NQVhfRFJBV19CVUZGRVJTX0FSQiAgICAgICAgICAgMHg4ODI0CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMF9BUkIgICAgICAgICAgICAgICAweDg4MjUKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxX0FSQiAgICAgICAgICAgICAgIDB4ODgyNgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjJfQVJCICAgICAgICAgICAgICAgMHg4ODI3CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSM19BUkIgICAgICAgICAgICAgICAweDg4MjgKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI0X0FSQiAgICAgICAgICAgICAgIDB4ODgyOQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjVfQVJCICAgICAgICAgICAgICAgMHg4ODJBCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSNl9BUkIgICAgICAgICAgICAgICAweDg4MkIKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI3X0FSQiAgICAgICAgICAgICAgIDB4ODgyQworI2RlZmluZSBHTF9EUkFXX0JVRkZFUjhfQVJCICAgICAgICAgICAgICAgMHg4ODJECisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSOV9BUkIgICAgICAgICAgICAgICAweDg4MkUKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMF9BUkIgICAgICAgICAgICAgIDB4ODgyRgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjExX0FSQiAgICAgICAgICAgICAgMHg4ODMwCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTJfQVJCICAgICAgICAgICAgICAweDg4MzEKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxM19BUkIgICAgICAgICAgICAgIDB4ODgzMgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjE0X0FSQiAgICAgICAgICAgICAgMHg4ODMzCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTVfQVJCICAgICAgICAgICAgICAweDg4MzQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX3JlY3RhbmdsZQorI2RlZmluZSBHTF9URVhUVVJFX1JFQ1RBTkdMRV9BUkIgICAgICAgICAgMHg4NEY1CisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19SRUNUQU5HTEVfQVJCICAweDg0RjYKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV9SRUNUQU5HTEVfQVJCICAgIDB4ODRGNworI2RlZmluZSBHTF9NQVhfUkVDVEFOR0xFX1RFWFRVUkVfU0laRV9BUkIgMHg4NEY4CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfY29sb3JfYnVmZmVyX2Zsb2F0CisjZGVmaW5lIEdMX1JHQkFfRkxPQVRfTU9ERV9BUkIgICAgICAgICAgICAweDg4MjAKKyNkZWZpbmUgR0xfQ0xBTVBfVkVSVEVYX0NPTE9SX0FSQiAgICAgICAgIDB4ODkxQQorI2RlZmluZSBHTF9DTEFNUF9GUkFHTUVOVF9DT0xPUl9BUkIgICAgICAgMHg4OTFCCisjZGVmaW5lIEdMX0NMQU1QX1JFQURfQ09MT1JfQVJCICAgICAgICAgICAweDg5MUMKKyNkZWZpbmUgR0xfRklYRURfT05MWV9BUkIgICAgICAgICAgICAgICAgIDB4ODkxRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2hhbGZfZmxvYXRfcGl4ZWwKKyNkZWZpbmUgR0xfSEFMRl9GTE9BVF9BUkIgICAgICAgICAgICAgICAgIDB4MTQwQgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfZmxvYXQKKyNkZWZpbmUgR0xfVEVYVFVSRV9SRURfVFlQRV9BUkIgICAgICAgICAgIDB4OEMxMAorI2RlZmluZSBHTF9URVhUVVJFX0dSRUVOX1RZUEVfQVJCICAgICAgICAgMHg4QzExCisjZGVmaW5lIEdMX1RFWFRVUkVfQkxVRV9UWVBFX0FSQiAgICAgICAgICAweDhDMTIKKyNkZWZpbmUgR0xfVEVYVFVSRV9BTFBIQV9UWVBFX0FSQiAgICAgICAgIDB4OEMxMworI2RlZmluZSBHTF9URVhUVVJFX0xVTUlOQU5DRV9UWVBFX0FSQiAgICAgMHg4QzE0CisjZGVmaW5lIEdMX1RFWFRVUkVfSU5URU5TSVRZX1RZUEVfQVJCICAgICAweDhDMTUKKyNkZWZpbmUgR0xfVEVYVFVSRV9ERVBUSF9UWVBFX0FSQiAgICAgICAgIDB4OEMxNgorI2RlZmluZSBHTF9VTlNJR05FRF9OT1JNQUxJWkVEX0FSQiAgICAgICAgMHg4QzE3CisjZGVmaW5lIEdMX1JHQkEzMkZfQVJCICAgICAgICAgICAgICAgICAgICAweDg4MTQKKyNkZWZpbmUgR0xfUkdCMzJGX0FSQiAgICAgICAgICAgICAgICAgICAgIDB4ODgxNQorI2RlZmluZSBHTF9BTFBIQTMyRl9BUkIgICAgICAgICAgICAgICAgICAgMHg4ODE2CisjZGVmaW5lIEdMX0lOVEVOU0lUWTMyRl9BUkIgICAgICAgICAgICAgICAweDg4MTcKKyNkZWZpbmUgR0xfTFVNSU5BTkNFMzJGX0FSQiAgICAgICAgICAgICAgIDB4ODgxOAorI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEEzMkZfQVJCICAgICAgICAgMHg4ODE5CisjZGVmaW5lIEdMX1JHQkExNkZfQVJCICAgICAgICAgICAgICAgICAgICAweDg4MUEKKyNkZWZpbmUgR0xfUkdCMTZGX0FSQiAgICAgICAgICAgICAgICAgICAgIDB4ODgxQgorI2RlZmluZSBHTF9BTFBIQTE2Rl9BUkIgICAgICAgICAgICAgICAgICAgMHg4ODFDCisjZGVmaW5lIEdMX0lOVEVOU0lUWTE2Rl9BUkIgICAgICAgICAgICAgICAweDg4MUQKKyNkZWZpbmUgR0xfTFVNSU5BTkNFMTZGX0FSQiAgICAgICAgICAgICAgIDB4ODgxRQorI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEExNkZfQVJCICAgICAgICAgMHg4ODFGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfcGl4ZWxfYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9QSVhFTF9QQUNLX0JVRkZFUl9BUkIgICAgICAgICAgMHg4OEVCCisjZGVmaW5lIEdMX1BJWEVMX1VOUEFDS19CVUZGRVJfQVJCICAgICAgICAweDg4RUMKKyNkZWZpbmUgR0xfUElYRUxfUEFDS19CVUZGRVJfQklORElOR19BUkIgIDB4ODhFRAorI2RlZmluZSBHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODhFRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2RlcHRoX2J1ZmZlcl9mbG9hdAorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQzMkYgICAgICAgICAgICAgMHg4Q0FDCisjZGVmaW5lIEdMX0RFUFRIMzJGX1NURU5DSUw4ICAgICAgICAgICAgICAweDhDQUQKKyNkZWZpbmUgR0xfRkxPQVRfMzJfVU5TSUdORURfSU5UXzI0XzhfUkVWIDB4OERBRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2RyYXdfaW5zdGFuY2VkCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZnJhbWVidWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OICAweDA1MDYKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9DT0xPUl9FTkNPRElORyAweDgyMTAKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9DT01QT05FTlRfVFlQRSAweDgyMTEKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9SRURfU0laRSAweDgyMTIKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9HUkVFTl9TSVpFIDB4ODIxMworI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0JMVUVfU0laRSAweDgyMTQKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9BTFBIQV9TSVpFIDB4ODIxNQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0RFUFRIX1NJWkUgMHg4MjE2CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfU1RFTkNJTF9TSVpFIDB4ODIxNworI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9ERUZBVUxUICAgICAgICAgICAgMHg4MjE4CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX1VOREVGSU5FRCAgICAgICAgICAweDgyMTkKKyNkZWZpbmUgR0xfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UICAgICAgIDB4ODIxQQorI2RlZmluZSBHTF9NQVhfUkVOREVSQlVGRkVSX1NJWkUgICAgICAgICAgMHg4NEU4CisjZGVmaW5lIEdMX0RFUFRIX1NURU5DSUwgICAgICAgICAgICAgICAgICAweDg0RjkKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzI0XzggICAgICAgICAgICAgIDB4ODRGQQorI2RlZmluZSBHTF9ERVBUSDI0X1NURU5DSUw4ICAgICAgICAgICAgICAgMHg4OEYwCisjZGVmaW5lIEdMX1RFWFRVUkVfU1RFTkNJTF9TSVpFICAgICAgICAgICAweDg4RjEKKyNkZWZpbmUgR0xfVEVYVFVSRV9SRURfVFlQRSAgICAgICAgICAgICAgIDB4OEMxMAorI2RlZmluZSBHTF9URVhUVVJFX0dSRUVOX1RZUEUgICAgICAgICAgICAgMHg4QzExCisjZGVmaW5lIEdMX1RFWFRVUkVfQkxVRV9UWVBFICAgICAgICAgICAgICAweDhDMTIKKyNkZWZpbmUgR0xfVEVYVFVSRV9BTFBIQV9UWVBFICAgICAgICAgICAgIDB4OEMxMworI2RlZmluZSBHTF9URVhUVVJFX0RFUFRIX1RZUEUgICAgICAgICAgICAgMHg4QzE2CisjZGVmaW5lIEdMX1VOU0lHTkVEX05PUk1BTElaRUQgICAgICAgICAgICAweDhDMTcKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQklORElORyAgICAgICAgICAgIDB4OENBNgorI2RlZmluZSBHTF9EUkFXX0ZSQU1FQlVGRkVSX0JJTkRJTkcgICAgICAgR0xfRlJBTUVCVUZGRVJfQklORElORworI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQklORElORyAgICAgICAgICAgMHg4Q0E3CisjZGVmaW5lIEdMX1JFQURfRlJBTUVCVUZGRVIgICAgICAgICAgICAgICAweDhDQTgKKyNkZWZpbmUgR0xfRFJBV19GUkFNRUJVRkZFUiAgICAgICAgICAgICAgIDB4OENBOQorI2RlZmluZSBHTF9SRUFEX0ZSQU1FQlVGRkVSX0JJTkRJTkcgICAgICAgMHg4Q0FBCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9TQU1QTEVTICAgICAgICAgICAweDhDQUIKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRSAweDhDRDAKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRSAweDhDRDEKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMIDB4OENEMgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRSAweDhDRDMKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xBWUVSIDB4OENENAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSAgICAgICAgICAgMHg4Q0Q1CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVCAweDhDRDYKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQgMHg4Q0Q3CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRFJBV19CVUZGRVIgMHg4Q0RCCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfUkVBRF9CVUZGRVIgMHg4Q0RDCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEICAgICAgICAweDhDREQKKyNkZWZpbmUgR0xfTUFYX0NPTE9SX0FUVEFDSE1FTlRTICAgICAgICAgIDB4OENERgorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMCAgICAgICAgICAgICAgMHg4Q0UwCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxICAgICAgICAgICAgICAweDhDRTEKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDIgICAgICAgICAgICAgIDB4OENFMgorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMyAgICAgICAgICAgICAgMHg4Q0UzCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ0ICAgICAgICAgICAgICAweDhDRTQKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDUgICAgICAgICAgICAgIDB4OENFNQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UNiAgICAgICAgICAgICAgMHg4Q0U2CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ3ICAgICAgICAgICAgICAweDhDRTcKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDggICAgICAgICAgICAgIDB4OENFOAorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UOSAgICAgICAgICAgICAgMHg4Q0U5CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxMCAgICAgICAgICAgICAweDhDRUEKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDExICAgICAgICAgICAgIDB4OENFQgorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTIgICAgICAgICAgICAgMHg4Q0VDCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxMyAgICAgICAgICAgICAweDhDRUQKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDE0ICAgICAgICAgICAgIDB4OENFRQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTUgICAgICAgICAgICAgMHg4Q0VGCisjZGVmaW5lIEdMX0RFUFRIX0FUVEFDSE1FTlQgICAgICAgICAgICAgICAweDhEMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9BVFRBQ0hNRU5UICAgICAgICAgICAgIDB4OEQyMAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUiAgICAgICAgICAgICAgICAgICAgMHg4RDQwCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUiAgICAgICAgICAgICAgICAgICAweDhENDEKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1dJRFRIICAgICAgICAgICAgIDB4OEQ0MgorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfSEVJR0hUICAgICAgICAgICAgMHg4RDQzCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9JTlRFUk5BTF9GT1JNQVQgICAweDhENDQKKyNkZWZpbmUgR0xfU1RFTkNJTF9JTkRFWDEgICAgICAgICAgICAgICAgIDB4OEQ0NgorI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYNCAgICAgICAgICAgICAgICAgMHg4RDQ3CisjZGVmaW5lIEdMX1NURU5DSUxfSU5ERVg4ICAgICAgICAgICAgICAgICAweDhENDgKKyNkZWZpbmUgR0xfU1RFTkNJTF9JTkRFWDE2ICAgICAgICAgICAgICAgIDB4OEQ0OQorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfUkVEX1NJWkUgICAgICAgICAgMHg4RDUwCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9HUkVFTl9TSVpFICAgICAgICAweDhENTEKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0JMVUVfU0laRSAgICAgICAgIDB4OEQ1MgorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRSAgICAgICAgMHg4RDUzCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9ERVBUSF9TSVpFICAgICAgICAweDhENTQKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRSAgICAgIDB4OEQ1NQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01VTFRJU0FNUExFIDB4OEQ1NgorI2RlZmluZSBHTF9NQVhfU0FNUExFUyAgICAgICAgICAgICAgICAgICAgMHg4RDU3CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZnJhbWVidWZmZXJfb2JqZWN0X0RFUFJFQ0FURUQKKyNkZWZpbmUgR0xfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIyMgorI2RlZmluZSBHTF9URVhUVVJFX0xVTUlOQU5DRV9UWVBFICAgICAgICAgMHg4QzE0CisjZGVmaW5lIEdMX1RFWFRVUkVfSU5URU5TSVRZX1RZUEUgICAgICAgICAweDhDMTUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9mcmFtZWJ1ZmZlcl9zUkdCCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX1NSR0IgICAgICAgICAgICAgICAweDhEQjkKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9nZW9tZXRyeV9zaGFkZXI0CisjZGVmaW5lIEdMX0xJTkVTX0FESkFDRU5DWV9BUkIgICAgICAgICAgICAweDAwMEEKKyNkZWZpbmUgR0xfTElORV9TVFJJUF9BREpBQ0VOQ1lfQVJCICAgICAgIDB4MDAwQgorI2RlZmluZSBHTF9UUklBTkdMRVNfQURKQUNFTkNZX0FSQiAgICAgICAgMHgwMDBDCisjZGVmaW5lIEdMX1RSSUFOR0xFX1NUUklQX0FESkFDRU5DWV9BUkIgICAweDAwMEQKKyNkZWZpbmUgR0xfUFJPR1JBTV9QT0lOVF9TSVpFX0FSQiAgICAgICAgIDB4ODY0MgorI2RlZmluZSBHTF9NQVhfR0VPTUVUUllfVEVYVFVSRV9JTUFHRV9VTklUU19BUkIgMHg4QzI5CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfTEFZRVJFRF9BUkIgMHg4REE3CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTEFZRVJfVEFSR0VUU19BUkIgMHg4REE4CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTEFZRVJfQ09VTlRfQVJCIDB4OERBOQorI2RlZmluZSBHTF9HRU9NRVRSWV9TSEFERVJfQVJCICAgICAgICAgICAgMHg4REQ5CisjZGVmaW5lIEdMX0dFT01FVFJZX1ZFUlRJQ0VTX09VVF9BUkIgICAgICAweDhEREEKKyNkZWZpbmUgR0xfR0VPTUVUUllfSU5QVVRfVFlQRV9BUkIgICAgICAgIDB4OEREQgorI2RlZmluZSBHTF9HRU9NRVRSWV9PVVRQVVRfVFlQRV9BUkIgICAgICAgMHg4RERDCisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9WQVJZSU5HX0NPTVBPTkVOVFNfQVJCIDB4OERERAorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1ZBUllJTkdfQ09NUE9ORU5UU19BUkIgMHg4RERFCisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9VTklGT1JNX0NPTVBPTkVOVFNfQVJCIDB4OERERgorI2RlZmluZSBHTF9NQVhfR0VPTUVUUllfT1VUUFVUX1ZFUlRJQ0VTX0FSQiAweDhERTAKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX1RPVEFMX09VVFBVVF9DT01QT05FTlRTX0FSQiAweDhERTEKKy8qIHJldXNlIEdMX01BWF9WQVJZSU5HX0NPTVBPTkVOVFMgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MQVlFUiAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2hhbGZfZmxvYXRfdmVydGV4CisjZGVmaW5lIEdMX0hBTEZfRkxPQVQgICAgICAgICAgICAgICAgICAgICAweDE0MEIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9pbnN0YW5jZWRfYXJyYXlzCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfRElWSVNPUl9BUkIgMHg4OEZFCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfbWFwX2J1ZmZlcl9yYW5nZQorI2RlZmluZSBHTF9NQVBfUkVBRF9CSVQgICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEdMX01BUF9XUklURV9CSVQgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgR0xfTUFQX0lOVkFMSURBVEVfUkFOR0VfQklUICAgICAgIDB4MDAwNAorI2RlZmluZSBHTF9NQVBfSU5WQUxJREFURV9CVUZGRVJfQklUICAgICAgMHgwMDA4CisjZGVmaW5lIEdMX01BUF9GTFVTSF9FWFBMSUNJVF9CSVQgICAgICAgICAweDAwMTAKKyNkZWZpbmUgR0xfTUFQX1VOU1lOQ0hST05JWkVEX0JJVCAgICAgICAgIDB4MDAyMAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9URVhUVVJFX0JVRkZFUl9BUkIgICAgICAgICAgICAgMHg4QzJBCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX0JVRkZFUl9TSVpFX0FSQiAgICAweDhDMkIKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX0JVRkZFUl9BUkIgICAgIDB4OEMyQworI2RlZmluZSBHTF9URVhUVVJFX0JVRkZFUl9EQVRBX1NUT1JFX0JJTkRJTkdfQVJCIDB4OEMyRAorI2RlZmluZSBHTF9URVhUVVJFX0JVRkZFUl9GT1JNQVRfQVJCICAgICAgMHg4QzJFCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9jb21wcmVzc2lvbl9yZ3RjCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkVEX1JHVEMxICAgICAgICAgICAweDhEQkIKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TSUdORURfUkVEX1JHVEMxICAgIDB4OERCQworI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHX1JHVEMyICAgICAgICAgICAgMHg4REJECisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU0lHTkVEX1JHX1JHVEMyICAgICAweDhEQkUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX3JnCisjZGVmaW5lIEdMX1JHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMjcKKyNkZWZpbmUgR0xfUkdfSU5URUdFUiAgICAgICAgICAgICAgICAgICAgIDB4ODIyOAorI2RlZmluZSBHTF9SOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjI5CisjZGVmaW5lIEdMX1IxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMkEKKyNkZWZpbmUgR0xfUkc4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIyQgorI2RlZmluZSBHTF9SRzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjJDCisjZGVmaW5lIEdMX1IxNkYgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMkQKKyNkZWZpbmUgR0xfUjMyRiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIyRQorI2RlZmluZSBHTF9SRzE2RiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjJGCisjZGVmaW5lIEdMX1JHMzJGICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMzAKKyNkZWZpbmUgR0xfUjhJICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIzMQorI2RlZmluZSBHTF9SOFVJICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjMyCisjZGVmaW5lIEdMX1IxNkkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMzMKKyNkZWZpbmUgR0xfUjE2VUkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIzNAorI2RlZmluZSBHTF9SMzJJICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjM1CisjZGVmaW5lIEdMX1IzMlVJICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMzYKKyNkZWZpbmUgR0xfUkc4SSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIzNworI2RlZmluZSBHTF9SRzhVSSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjM4CisjZGVmaW5lIEdMX1JHMTZJICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMzkKKyNkZWZpbmUgR0xfUkcxNlVJICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIzQQorI2RlZmluZSBHTF9SRzMySSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjNCCisjZGVmaW5lIEdMX1JHMzJVSSAgICAgICAgICAgICAgICAgICAgICAgICAweDgyM0MKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfYXJyYXlfb2JqZWN0CisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9CSU5ESU5HICAgICAgICAgICAweDg1QjUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl91bmlmb3JtX2J1ZmZlcl9vYmplY3QKKyNkZWZpbmUgR0xfVU5JRk9STV9CVUZGRVIgICAgICAgICAgICAgICAgIDB4OEExMQorI2RlZmluZSBHTF9VTklGT1JNX0JVRkZFUl9CSU5ESU5HICAgICAgICAgMHg4QTI4CisjZGVmaW5lIEdMX1VOSUZPUk1fQlVGRkVSX1NUQVJUICAgICAgICAgICAweDhBMjkKKyNkZWZpbmUgR0xfVU5JRk9STV9CVUZGRVJfU0laRSAgICAgICAgICAgIDB4OEEyQQorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fQkxPQ0tTICAgICAgMHg4QTJCCisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9VTklGT1JNX0JMT0NLUyAgICAweDhBMkMKKyNkZWZpbmUgR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQkxPQ0tTICAgIDB4OEEyRAorI2RlZmluZSBHTF9NQVhfQ09NQklORURfVU5JRk9STV9CTE9DS1MgICAgMHg4QTJFCisjZGVmaW5lIEdMX01BWF9VTklGT1JNX0JVRkZFUl9CSU5ESU5HUyAgICAweDhBMkYKKyNkZWZpbmUgR0xfTUFYX1VOSUZPUk1fQkxPQ0tfU0laRSAgICAgICAgIDB4OEEzMAorI2RlZmluZSBHTF9NQVhfQ09NQklORURfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UUyAweDhBMzEKKyNkZWZpbmUgR0xfTUFYX0NPTUJJTkVEX0dFT01FVFJZX1VOSUZPUk1fQ09NUE9ORU5UUyAweDhBMzIKKyNkZWZpbmUgR0xfTUFYX0NPTUJJTkVEX0ZSQUdNRU5UX1VOSUZPUk1fQ09NUE9ORU5UUyAweDhBMzMKKyNkZWZpbmUgR0xfVU5JRk9STV9CVUZGRVJfT0ZGU0VUX0FMSUdOTUVOVCAweDhBMzQKKyNkZWZpbmUgR0xfQUNUSVZFX1VOSUZPUk1fQkxPQ0tfTUFYX05BTUVfTEVOR1RIIDB4OEEzNQorI2RlZmluZSBHTF9BQ1RJVkVfVU5JRk9STV9CTE9DS1MgICAgICAgICAgMHg4QTM2CisjZGVmaW5lIEdMX1VOSUZPUk1fVFlQRSAgICAgICAgICAgICAgICAgICAweDhBMzcKKyNkZWZpbmUgR0xfVU5JRk9STV9TSVpFICAgICAgICAgICAgICAgICAgIDB4OEEzOAorI2RlZmluZSBHTF9VTklGT1JNX05BTUVfTEVOR1RIICAgICAgICAgICAgMHg4QTM5CisjZGVmaW5lIEdMX1VOSUZPUk1fQkxPQ0tfSU5ERVggICAgICAgICAgICAweDhBM0EKKyNkZWZpbmUgR0xfVU5JRk9STV9PRkZTRVQgICAgICAgICAgICAgICAgIDB4OEEzQgorI2RlZmluZSBHTF9VTklGT1JNX0FSUkFZX1NUUklERSAgICAgICAgICAgMHg4QTNDCisjZGVmaW5lIEdMX1VOSUZPUk1fTUFUUklYX1NUUklERSAgICAgICAgICAweDhBM0QKKyNkZWZpbmUgR0xfVU5JRk9STV9JU19ST1dfTUFKT1IgICAgICAgICAgIDB4OEEzRQorI2RlZmluZSBHTF9VTklGT1JNX0JMT0NLX0JJTkRJTkcgICAgICAgICAgMHg4QTNGCisjZGVmaW5lIEdMX1VOSUZPUk1fQkxPQ0tfREFUQV9TSVpFICAgICAgICAweDhBNDAKKyNkZWZpbmUgR0xfVU5JRk9STV9CTE9DS19OQU1FX0xFTkdUSCAgICAgIDB4OEE0MQorI2RlZmluZSBHTF9VTklGT1JNX0JMT0NLX0FDVElWRV9VTklGT1JNUyAgMHg4QTQyCisjZGVmaW5lIEdMX1VOSUZPUk1fQkxPQ0tfQUNUSVZFX1VOSUZPUk1fSU5ESUNFUyAweDhBNDMKKyNkZWZpbmUgR0xfVU5JRk9STV9CTE9DS19SRUZFUkVOQ0VEX0JZX1ZFUlRFWF9TSEFERVIgMHg4QTQ0CisjZGVmaW5lIEdMX1VOSUZPUk1fQkxPQ0tfUkVGRVJFTkNFRF9CWV9HRU9NRVRSWV9TSEFERVIgMHg4QTQ1CisjZGVmaW5lIEdMX1VOSUZPUk1fQkxPQ0tfUkVGRVJFTkNFRF9CWV9GUkFHTUVOVF9TSEFERVIgMHg4QTQ2CisjZGVmaW5lIEdMX0lOVkFMSURfSU5ERVggICAgICAgICAgICAgICAgICAweEZGRkZGRkZGdQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2NvbXBhdGliaWxpdHkKKy8qIEFSQl9jb21wYXRpYmlsaXR5IGp1c3QgZGVmaW5lcyB0b2tlbnMgZnJvbSBjb3JlIDMuMCAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2NvcHlfYnVmZmVyCisjZGVmaW5lIEdMX0NPUFlfUkVBRF9CVUZGRVIgICAgICAgICAgICAgICAweDhGMzYKKyNkZWZpbmUgR0xfQ09QWV9XUklURV9CVUZGRVIgICAgICAgICAgICAgIDB4OEYzNworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRlcl90ZXh0dXJlX2xvZAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2RlcHRoX2NsYW1wCisjZGVmaW5lIEdMX0RFUFRIX0NMQU1QICAgICAgICAgICAgICAgICAgICAweDg2NEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9kcmF3X2VsZW1lbnRzX2Jhc2VfdmVydGV4CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZnJhZ21lbnRfY29vcmRfY29udmVudGlvbnMKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9wcm92b2tpbmdfdmVydGV4CisjZGVmaW5lIEdMX1FVQURTX0ZPTExPV19QUk9WT0tJTkdfVkVSVEVYX0NPTlZFTlRJT04gMHg4RTRDCisjZGVmaW5lIEdMX0ZJUlNUX1ZFUlRFWF9DT05WRU5USU9OICAgICAgICAweDhFNEQKKyNkZWZpbmUgR0xfTEFTVF9WRVJURVhfQ09OVkVOVElPTiAgICAgICAgIDB4OEU0RQorI2RlZmluZSBHTF9QUk9WT0tJTkdfVkVSVEVYICAgICAgICAgICAgICAgMHg4RTRGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2VhbWxlc3NfY3ViZV9tYXAKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9TRUFNTEVTUyAgICAgIDB4ODg0RgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3N5bmMKKyNkZWZpbmUgR0xfTUFYX1NFUlZFUl9XQUlUX1RJTUVPVVQgICAgICAgIDB4OTExMQorI2RlZmluZSBHTF9PQkpFQ1RfVFlQRSAgICAgICAgICAgICAgICAgICAgMHg5MTEyCisjZGVmaW5lIEdMX1NZTkNfQ09ORElUSU9OICAgICAgICAgICAgICAgICAweDkxMTMKKyNkZWZpbmUgR0xfU1lOQ19TVEFUVVMgICAgICAgICAgICAgICAgICAgIDB4OTExNAorI2RlZmluZSBHTF9TWU5DX0ZMQUdTICAgICAgICAgICAgICAgICAgICAgMHg5MTE1CisjZGVmaW5lIEdMX1NZTkNfRkVOQ0UgICAgICAgICAgICAgICAgICAgICAweDkxMTYKKyNkZWZpbmUgR0xfU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEUgICAgIDB4OTExNworI2RlZmluZSBHTF9VTlNJR05BTEVEICAgICAgICAgICAgICAgICAgICAgMHg5MTE4CisjZGVmaW5lIEdMX1NJR05BTEVEICAgICAgICAgICAgICAgICAgICAgICAweDkxMTkKKyNkZWZpbmUgR0xfQUxSRUFEWV9TSUdOQUxFRCAgICAgICAgICAgICAgIDB4OTExQQorI2RlZmluZSBHTF9USU1FT1VUX0VYUElSRUQgICAgICAgICAgICAgICAgMHg5MTFCCisjZGVmaW5lIEdMX0NPTkRJVElPTl9TQVRJU0ZJRUQgICAgICAgICAgICAweDkxMUMKKyNkZWZpbmUgR0xfV0FJVF9GQUlMRUQgICAgICAgICAgICAgICAgICAgIDB4OTExRAorI2RlZmluZSBHTF9TWU5DX0ZMVVNIX0NPTU1BTkRTX0JJVCAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTF9USU1FT1VUX0lHTk9SRUQgICAgICAgICAgICAgICAgMHhGRkZGRkZGRkZGRkZGRkZGdWxsCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9TQU1QTEVfUE9TSVRJT04gICAgICAgICAgICAgICAgMHg4RTUwCisjZGVmaW5lIEdMX1NBTVBMRV9NQVNLICAgICAgICAgICAgICAgICAgICAweDhFNTEKKyNkZWZpbmUgR0xfU0FNUExFX01BU0tfVkFMVUUgICAgICAgICAgICAgIDB4OEU1MgorI2RlZmluZSBHTF9NQVhfU0FNUExFX01BU0tfV09SRFMgICAgICAgICAgMHg4RTU5CisjZGVmaW5lIEdMX1RFWFRVUkVfMkRfTVVMVElTQU1QTEUgICAgICAgICAweDkxMDAKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV8yRF9NVUxUSVNBTVBMRSAgIDB4OTEwMQorI2RlZmluZSBHTF9URVhUVVJFXzJEX01VTFRJU0FNUExFX0FSUkFZICAgMHg5MTAyCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfMkRfTVVMVElTQU1QTEVfQVJSQVkgMHg5MTAzCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18yRF9NVUxUSVNBTVBMRSAweDkxMDQKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HXzJEX01VTFRJU0FNUExFX0FSUkFZIDB4OTEwNQorI2RlZmluZSBHTF9URVhUVVJFX1NBTVBMRVMgICAgICAgICAgICAgICAgMHg5MTA2CisjZGVmaW5lIEdMX1RFWFRVUkVfRklYRURfU0FNUExFX0xPQ0FUSU9OUyAweDkxMDcKKyNkZWZpbmUgR0xfU0FNUExFUl8yRF9NVUxUSVNBTVBMRSAgICAgICAgIDB4OTEwOAorI2RlZmluZSBHTF9JTlRfU0FNUExFUl8yRF9NVUxUSVNBTVBMRSAgICAgMHg5MTA5CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzJEX01VTFRJU0FNUExFIDB4OTEwQQorI2RlZmluZSBHTF9TQU1QTEVSXzJEX01VTFRJU0FNUExFX0FSUkFZICAgMHg5MTBCCisjZGVmaW5lIEdMX0lOVF9TQU1QTEVSXzJEX01VTFRJU0FNUExFX0FSUkFZIDB4OTEwQworI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRF9NVUxUSVNBTVBMRV9BUlJBWSAweDkxMEQKKyNkZWZpbmUgR0xfTUFYX0NPTE9SX1RFWFRVUkVfU0FNUExFUyAgICAgIDB4OTEwRQorI2RlZmluZSBHTF9NQVhfREVQVEhfVEVYVFVSRV9TQU1QTEVTICAgICAgMHg5MTBGCisjZGVmaW5lIEdMX01BWF9JTlRFR0VSX1NBTVBMRVMgICAgICAgICAgICAweDkxMTAKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfYXJyYXlfYmdyYQorLyogcmV1c2UgR0xfQkdSQSAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2RyYXdfYnVmZmVyc19ibGVuZAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NhbXBsZV9zaGFkaW5nCisjZGVmaW5lIEdMX1NBTVBMRV9TSEFESU5HX0FSQiAgICAgICAgICAgICAweDhDMzYKKyNkZWZpbmUgR0xfTUlOX1NBTVBMRV9TSEFESU5HX1ZBTFVFX0FSQiAgIDB4OEMzNworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfY3ViZV9tYXBfYXJyYXkKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9BUlJBWV9BUkIgICAgIDB4OTAwOQorI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVBfQVJSQVlfQVJCIDB4OTAwQQorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFX0NVQkVfTUFQX0FSUkFZX0FSQiAweDkwMEIKKyNkZWZpbmUgR0xfU0FNUExFUl9DVUJFX01BUF9BUlJBWV9BUkIgICAgIDB4OTAwQworI2RlZmluZSBHTF9TQU1QTEVSX0NVQkVfTUFQX0FSUkFZX1NIQURPV19BUkIgMHg5MDBECisjZGVmaW5lIEdMX0lOVF9TQU1QTEVSX0NVQkVfTUFQX0FSUkFZX0FSQiAweDkwMEUKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfQ1VCRV9NQVBfQVJSQVlfQVJCIDB4OTAwRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfZ2F0aGVyCisjZGVmaW5lIEdMX01JTl9QUk9HUkFNX1RFWFRVUkVfR0FUSEVSX09GRlNFVF9BUkIgMHg4RTVFCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX1RFWFRVUkVfR0FUSEVSX09GRlNFVF9BUkIgMHg4RTVGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9xdWVyeV9sb2QKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkaW5nX2xhbmd1YWdlX2luY2x1ZGUKKyNkZWZpbmUgR0xfU0hBREVSX0lOQ0xVREVfQVJCICAgICAgICAgICAgIDB4OERBRQorI2RlZmluZSBHTF9OQU1FRF9TVFJJTkdfTEVOR1RIX0FSQiAgICAgICAgMHg4REU5CisjZGVmaW5lIEdMX05BTUVEX1NUUklOR19UWVBFX0FSQiAgICAgICAgICAweDhERUEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2NvbXByZXNzaW9uX2JwdGMKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX0JQVENfVU5PUk1fQVJCIDB4OEU4QworI2RlZmluZSBHTF9DT01QUkVTU0VEX1NSR0JfQUxQSEFfQlBUQ19VTk9STV9BUkIgMHg4RThECisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCX0JQVENfU0lHTkVEX0ZMT0FUX0FSQiAweDhFOEUKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JfQlBUQ19VTlNJR05FRF9GTE9BVF9BUkIgMHg4RThGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfYmxlbmRfZnVuY19leHRlbmRlZAorI2RlZmluZSBHTF9TUkMxX0NPTE9SICAgICAgICAgICAgICAgICAgICAgMHg4OEY5CisvKiByZXVzZSBHTF9TUkMxX0FMUEhBICovCisjZGVmaW5lIEdMX09ORV9NSU5VU19TUkMxX0NPTE9SICAgICAgICAgICAweDg4RkEKKyNkZWZpbmUgR0xfT05FX01JTlVTX1NSQzFfQUxQSEEgICAgICAgICAgIDB4ODhGQgorI2RlZmluZSBHTF9NQVhfRFVBTF9TT1VSQ0VfRFJBV19CVUZGRVJTICAgMHg4OEZDCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZXhwbGljaXRfYXR0cmliX2xvY2F0aW9uCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfb2NjbHVzaW9uX3F1ZXJ5MgorI2RlZmluZSBHTF9BTllfU0FNUExFU19QQVNTRUQgICAgICAgICAgICAgMHg4QzJGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2FtcGxlcl9vYmplY3RzCisjZGVmaW5lIEdMX1NBTVBMRVJfQklORElORyAgICAgICAgICAgICAgICAweDg5MTkKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkZXJfYml0X2VuY29kaW5nCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9yZ2IxMF9hMnVpCisjZGVmaW5lIEdMX1JHQjEwX0EyVUkgICAgICAgICAgICAgICAgICAgICAweDkwNkYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX3N3aXp6bGUKKyNkZWZpbmUgR0xfVEVYVFVSRV9TV0laWkxFX1IgICAgICAgICAgICAgIDB4OEU0MgorI2RlZmluZSBHTF9URVhUVVJFX1NXSVpaTEVfRyAgICAgICAgICAgICAgMHg4RTQzCisjZGVmaW5lIEdMX1RFWFRVUkVfU1dJWlpMRV9CICAgICAgICAgICAgICAweDhFNDQKKyNkZWZpbmUgR0xfVEVYVFVSRV9TV0laWkxFX0EgICAgICAgICAgICAgIDB4OEU0NQorI2RlZmluZSBHTF9URVhUVVJFX1NXSVpaTEVfUkdCQSAgICAgICAgICAgMHg4RTQ2CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGltZXJfcXVlcnkKKyNkZWZpbmUgR0xfVElNRV9FTEFQU0VEICAgICAgICAgICAgICAgICAgIDB4ODhCRgorI2RlZmluZSBHTF9USU1FU1RBTVAgICAgICAgICAgICAgICAgICAgICAgMHg4RTI4CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdmVydGV4X3R5cGVfMl8xMF8xMF8xMF9yZXYKKy8qIHJldXNlIEdMX1VOU0lHTkVEX0lOVF8yXzEwXzEwXzEwX1JFViAqLworI2RlZmluZSBHTF9JTlRfMl8xMF8xMF8xMF9SRVYgICAgICAgICAgICAgMHg4RDlGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZHJhd19pbmRpcmVjdAorI2RlZmluZSBHTF9EUkFXX0lORElSRUNUX0JVRkZFUiAgICAgICAgICAgMHg4RjNGCisjZGVmaW5lIEdMX0RSQVdfSU5ESVJFQ1RfQlVGRkVSX0JJTkRJTkcgICAweDhGNDMKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9ncHVfc2hhZGVyNQorI2RlZmluZSBHTF9HRU9NRVRSWV9TSEFERVJfSU5WT0NBVElPTlMgICAgMHg4ODdGCisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9TSEFERVJfSU5WT0NBVElPTlMgMHg4RTVBCisjZGVmaW5lIEdMX01JTl9GUkFHTUVOVF9JTlRFUlBPTEFUSU9OX09GRlNFVCAweDhFNUIKKyNkZWZpbmUgR0xfTUFYX0ZSQUdNRU5UX0lOVEVSUE9MQVRJT05fT0ZGU0VUIDB4OEU1QworI2RlZmluZSBHTF9GUkFHTUVOVF9JTlRFUlBPTEFUSU9OX09GRlNFVF9CSVRTIDB4OEU1RAorLyogcmV1c2UgR0xfTUFYX1ZFUlRFWF9TVFJFQU1TICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZ3B1X3NoYWRlcl9mcDY0CisvKiByZXVzZSBHTF9ET1VCTEUgKi8KKyNkZWZpbmUgR0xfRE9VQkxFX1ZFQzIgICAgICAgICAgICAgICAgICAgIDB4OEZGQworI2RlZmluZSBHTF9ET1VCTEVfVkVDMyAgICAgICAgICAgICAgICAgICAgMHg4RkZECisjZGVmaW5lIEdMX0RPVUJMRV9WRUM0ICAgICAgICAgICAgICAgICAgICAweDhGRkUKKyNkZWZpbmUgR0xfRE9VQkxFX01BVDIgICAgICAgICAgICAgICAgICAgIDB4OEY0NgorI2RlZmluZSBHTF9ET1VCTEVfTUFUMyAgICAgICAgICAgICAgICAgICAgMHg4RjQ3CisjZGVmaW5lIEdMX0RPVUJMRV9NQVQ0ICAgICAgICAgICAgICAgICAgICAweDhGNDgKKyNkZWZpbmUgR0xfRE9VQkxFX01BVDJ4MyAgICAgICAgICAgICAgICAgIDB4OEY0OQorI2RlZmluZSBHTF9ET1VCTEVfTUFUMng0ICAgICAgICAgICAgICAgICAgMHg4RjRBCisjZGVmaW5lIEdMX0RPVUJMRV9NQVQzeDIgICAgICAgICAgICAgICAgICAweDhGNEIKKyNkZWZpbmUgR0xfRE9VQkxFX01BVDN4NCAgICAgICAgICAgICAgICAgIDB4OEY0QworI2RlZmluZSBHTF9ET1VCTEVfTUFUNHgyICAgICAgICAgICAgICAgICAgMHg4RjRECisjZGVmaW5lIEdMX0RPVUJMRV9NQVQ0eDMgICAgICAgICAgICAgICAgICAweDhGNEUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkZXJfc3Vicm91dGluZQorI2RlZmluZSBHTF9BQ1RJVkVfU1VCUk9VVElORVMgICAgICAgICAgICAgMHg4REU1CisjZGVmaW5lIEdMX0FDVElWRV9TVUJST1VUSU5FX1VOSUZPUk1TICAgICAweDhERTYKKyNkZWZpbmUgR0xfQUNUSVZFX1NVQlJPVVRJTkVfVU5JRk9STV9MT0NBVElPTlMgMHg4RTQ3CisjZGVmaW5lIEdMX0FDVElWRV9TVUJST1VUSU5FX01BWF9MRU5HVEggICAweDhFNDgKKyNkZWZpbmUgR0xfQUNUSVZFX1NVQlJPVVRJTkVfVU5JRk9STV9NQVhfTEVOR1RIIDB4OEU0OQorI2RlZmluZSBHTF9NQVhfU1VCUk9VVElORVMgICAgICAgICAgICAgICAgMHg4REU3CisjZGVmaW5lIEdMX01BWF9TVUJST1VUSU5FX1VOSUZPUk1fTE9DQVRJT05TIDB4OERFOAorI2RlZmluZSBHTF9OVU1fQ09NUEFUSUJMRV9TVUJST1VUSU5FUyAgICAgMHg4RTRBCisjZGVmaW5lIEdMX0NPTVBBVElCTEVfU1VCUk9VVElORVMgICAgICAgICAweDhFNEIKKy8qIHJldXNlIEdMX1VOSUZPUk1fU0laRSAqLworLyogcmV1c2UgR0xfVU5JRk9STV9OQU1FX0xFTkdUSCAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3Rlc3NlbGxhdGlvbl9zaGFkZXIKKyNkZWZpbmUgR0xfUEFUQ0hFUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRQorI2RlZmluZSBHTF9QQVRDSF9WRVJUSUNFUyAgICAgICAgICAgICAgICAgMHg4RTcyCisjZGVmaW5lIEdMX1BBVENIX0RFRkFVTFRfSU5ORVJfTEVWRUwgICAgICAweDhFNzMKKyNkZWZpbmUgR0xfUEFUQ0hfREVGQVVMVF9PVVRFUl9MRVZFTCAgICAgIDB4OEU3NAorI2RlZmluZSBHTF9URVNTX0NPTlRST0xfT1VUUFVUX1ZFUlRJQ0VTICAgMHg4RTc1CisjZGVmaW5lIEdMX1RFU1NfR0VOX01PREUgICAgICAgICAgICAgICAgICAweDhFNzYKKyNkZWZpbmUgR0xfVEVTU19HRU5fU1BBQ0lORyAgICAgICAgICAgICAgIDB4OEU3NworI2RlZmluZSBHTF9URVNTX0dFTl9WRVJURVhfT1JERVIgICAgICAgICAgMHg4RTc4CisjZGVmaW5lIEdMX1RFU1NfR0VOX1BPSU5UX01PREUgICAgICAgICAgICAweDhFNzkKKy8qIHJldXNlIEdMX1RSSUFOR0xFUyAqLworLyogcmV1c2UgR0xfUVVBRFMgKi8KKyNkZWZpbmUgR0xfSVNPTElORVMgICAgICAgICAgICAgICAgICAgICAgIDB4OEU3QQorLyogcmV1c2UgR0xfRVFVQUwgKi8KKyNkZWZpbmUgR0xfRlJBQ1RJT05BTF9PREQgICAgICAgICAgICAgICAgIDB4OEU3QgorI2RlZmluZSBHTF9GUkFDVElPTkFMX0VWRU4gICAgICAgICAgICAgICAgMHg4RTdDCisvKiByZXVzZSBHTF9DQ1cgKi8KKy8qIHJldXNlIEdMX0NXICovCisjZGVmaW5lIEdMX01BWF9QQVRDSF9WRVJUSUNFUyAgICAgICAgICAgICAweDhFN0QKKyNkZWZpbmUgR0xfTUFYX1RFU1NfR0VOX0xFVkVMICAgICAgICAgICAgIDB4OEU3RQorI2RlZmluZSBHTF9NQVhfVEVTU19DT05UUk9MX1VOSUZPUk1fQ09NUE9ORU5UUyAweDhFN0YKKyNkZWZpbmUgR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9VTklGT1JNX0NPTVBPTkVOVFMgMHg4RTgwCisjZGVmaW5lIEdMX01BWF9URVNTX0NPTlRST0xfVEVYVFVSRV9JTUFHRV9VTklUUyAweDhFODEKKyNkZWZpbmUgR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9URVhUVVJFX0lNQUdFX1VOSVRTIDB4OEU4MgorI2RlZmluZSBHTF9NQVhfVEVTU19DT05UUk9MX09VVFBVVF9DT01QT05FTlRTIDB4OEU4MworI2RlZmluZSBHTF9NQVhfVEVTU19QQVRDSF9DT01QT05FTlRTICAgICAgMHg4RTg0CisjZGVmaW5lIEdMX01BWF9URVNTX0NPTlRST0xfVE9UQUxfT1VUUFVUX0NPTVBPTkVOVFMgMHg4RTg1CisjZGVmaW5lIEdMX01BWF9URVNTX0VWQUxVQVRJT05fT1VUUFVUX0NPTVBPTkVOVFMgMHg4RTg2CisjZGVmaW5lIEdMX01BWF9URVNTX0NPTlRST0xfVU5JRk9STV9CTE9DS1MgMHg4RTg5CisjZGVmaW5lIEdMX01BWF9URVNTX0VWQUxVQVRJT05fVU5JRk9STV9CTE9DS1MgMHg4RThBCisjZGVmaW5lIEdMX01BWF9URVNTX0NPTlRST0xfSU5QVVRfQ09NUE9ORU5UUyAweDg4NkMKKyNkZWZpbmUgR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9JTlBVVF9DT01QT05FTlRTIDB4ODg2RAorI2RlZmluZSBHTF9NQVhfQ09NQklORURfVEVTU19DT05UUk9MX1VOSUZPUk1fQ09NUE9ORU5UUyAweDhFMUUKKyNkZWZpbmUgR0xfTUFYX0NPTUJJTkVEX1RFU1NfRVZBTFVBVElPTl9VTklGT1JNX0NPTVBPTkVOVFMgMHg4RTFGCisjZGVmaW5lIEdMX1VOSUZPUk1fQkxPQ0tfUkVGRVJFTkNFRF9CWV9URVNTX0NPTlRST0xfU0hBREVSIDB4ODRGMAorI2RlZmluZSBHTF9VTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfVEVTU19FVkFMVUFUSU9OX1NIQURFUiAweDg0RjEKKyNkZWZpbmUgR0xfVEVTU19FVkFMVUFUSU9OX1NIQURFUiAgICAgICAgIDB4OEU4NworI2RlZmluZSBHTF9URVNTX0NPTlRST0xfU0hBREVSICAgICAgICAgICAgMHg4RTg4CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9idWZmZXJfb2JqZWN0X3JnYjMyCisvKiByZXVzZSBHTF9SR0IzMkYgKi8KKy8qIHJldXNlIEdMX1JHQjMyVUkgKi8KKy8qIHJldXNlIEdMX1JHQjMySSAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RyYW5zZm9ybV9mZWVkYmFjazIKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLICAgICAgICAgICAgIDB4OEUyMgorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX1BBVVNFRCAweDhFMjMKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9BQ1RJVkUgMHg4RTI0CisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CSU5ESU5HICAgICAweDhFMjUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90cmFuc2Zvcm1fZmVlZGJhY2szCisjZGVmaW5lIEdMX01BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSUyAweDhFNzAKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9TVFJFQU1TICAgICAgICAgICAgIDB4OEU3MQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX0VTMl9jb21wYXRpYmlsaXR5CisjZGVmaW5lIEdMX0ZJWEVEICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MEMKKyNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFIDB4OEI5QQorI2RlZmluZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVCAweDhCOUIKKyNkZWZpbmUgR0xfTE9XX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgIDB4OERGMAorI2RlZmluZSBHTF9NRURJVU1fRkxPQVQgICAgICAgICAgICAgICAgICAgMHg4REYxCisjZGVmaW5lIEdMX0hJR0hfRkxPQVQgICAgICAgICAgICAgICAgICAgICAweDhERjIKKyNkZWZpbmUgR0xfTE9XX0lOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4OERGMworI2RlZmluZSBHTF9NRURJVU1fSU5UICAgICAgICAgICAgICAgICAgICAgMHg4REY0CisjZGVmaW5lIEdMX0hJR0hfSU5UICAgICAgICAgICAgICAgICAgICAgICAweDhERjUKKyNkZWZpbmUgR0xfU0hBREVSX0NPTVBJTEVSICAgICAgICAgICAgICAgIDB4OERGQQorI2RlZmluZSBHTF9OVU1fU0hBREVSX0JJTkFSWV9GT1JNQVRTICAgICAgMHg4REY5CisjZGVmaW5lIEdMX01BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTICAgICAweDhERkIKKyNkZWZpbmUgR0xfTUFYX1ZBUllJTkdfVkVDVE9SUyAgICAgICAgICAgIDB4OERGQworI2RlZmluZSBHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTICAgMHg4REZECisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZ2V0X3Byb2dyYW1fYmluYXJ5CisjZGVmaW5lIEdMX1BST0dSQU1fQklOQVJZX1JFVFJJRVZBQkxFX0hJTlQgMHg4MjU3CisjZGVmaW5lIEdMX1BST0dSQU1fQklOQVJZX0xFTkdUSCAgICAgICAgICAweDg3NDEKKyNkZWZpbmUgR0xfTlVNX1BST0dSQU1fQklOQVJZX0ZPUk1BVFMgICAgIDB4ODdGRQorI2RlZmluZSBHTF9QUk9HUkFNX0JJTkFSWV9GT1JNQVRTICAgICAgICAgMHg4N0ZGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2VwYXJhdGVfc2hhZGVyX29iamVjdHMKKyNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUl9CSVQgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xfRlJBR01FTlRfU0hBREVSX0JJVCAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0xfR0VPTUVUUllfU0hBREVSX0JJVCAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgR0xfVEVTU19DT05UUk9MX1NIQURFUl9CSVQgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgR0xfVEVTU19FVkFMVUFUSU9OX1NIQURFUl9CSVQgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgR0xfQUxMX1NIQURFUl9CSVRTICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKKyNkZWZpbmUgR0xfUFJPR1JBTV9TRVBBUkFCTEUgICAgICAgICAgICAgIDB4ODI1OAorI2RlZmluZSBHTF9BQ1RJVkVfUFJPR1JBTSAgICAgICAgICAgICAgICAgMHg4MjU5CisjZGVmaW5lIEdMX1BST0dSQU1fUElQRUxJTkVfQklORElORyAgICAgICAweDgyNUEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkZXJfcHJlY2lzaW9uCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdmVydGV4X2F0dHJpYl82NGJpdAorLyogcmV1c2UgR0xfUkdCMzJJICovCisvKiByZXVzZSBHTF9ET1VCTEVfVkVDMiAqLworLyogcmV1c2UgR0xfRE9VQkxFX1ZFQzMgKi8KKy8qIHJldXNlIEdMX0RPVUJMRV9WRUM0ICovCisvKiByZXVzZSBHTF9ET1VCTEVfTUFUMiAqLworLyogcmV1c2UgR0xfRE9VQkxFX01BVDMgKi8KKy8qIHJldXNlIEdMX0RPVUJMRV9NQVQ0ICovCisvKiByZXVzZSBHTF9ET1VCTEVfTUFUMngzICovCisvKiByZXVzZSBHTF9ET1VCTEVfTUFUMng0ICovCisvKiByZXVzZSBHTF9ET1VCTEVfTUFUM3gyICovCisvKiByZXVzZSBHTF9ET1VCTEVfTUFUM3g0ICovCisvKiByZXVzZSBHTF9ET1VCTEVfTUFUNHgyICovCisvKiByZXVzZSBHTF9ET1VCTEVfTUFUNHgzICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdmlld3BvcnRfYXJyYXkKKy8qIHJldXNlIEdMX1NDSVNTT1JfQk9YICovCisvKiByZXVzZSBHTF9WSUVXUE9SVCAqLworLyogcmV1c2UgR0xfREVQVEhfUkFOR0UgKi8KKy8qIHJldXNlIEdMX1NDSVNTT1JfVEVTVCAqLworI2RlZmluZSBHTF9NQVhfVklFV1BPUlRTICAgICAgICAgICAgICAgICAgMHg4MjVCCisjZGVmaW5lIEdMX1ZJRVdQT1JUX1NVQlBJWEVMX0JJVFMgICAgICAgICAweDgyNUMKKyNkZWZpbmUgR0xfVklFV1BPUlRfQk9VTkRTX1JBTkdFICAgICAgICAgIDB4ODI1RAorI2RlZmluZSBHTF9MQVlFUl9QUk9WT0tJTkdfVkVSVEVYICAgICAgICAgMHg4MjVFCisjZGVmaW5lIEdMX1ZJRVdQT1JUX0lOREVYX1BST1ZPS0lOR19WRVJURVggMHg4MjVGCisjZGVmaW5lIEdMX1VOREVGSU5FRF9WRVJURVggICAgICAgICAgICAgICAweDgyNjAKKy8qIHJldXNlIEdMX0ZJUlNUX1ZFUlRFWF9DT05WRU5USU9OICovCisvKiByZXVzZSBHTF9MQVNUX1ZFUlRFWF9DT05WRU5USU9OICovCisvKiByZXVzZSBHTF9QUk9WT0tJTkdfVkVSVEVYICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfY2xfZXZlbnQKKyNkZWZpbmUgR0xfU1lOQ19DTF9FVkVOVF9BUkIgICAgICAgICAgICAgIDB4ODI0MAorI2RlZmluZSBHTF9TWU5DX0NMX0VWRU5UX0NPTVBMRVRFX0FSQiAgICAgMHg4MjQxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZGVidWdfb3V0cHV0CisjZGVmaW5lIEdMX0RFQlVHX09VVFBVVF9TWU5DSFJPTk9VU19BUkIgICAweDgyNDIKKyNkZWZpbmUgR0xfREVCVUdfTkVYVF9MT0dHRURfTUVTU0FHRV9MRU5HVEhfQVJCIDB4ODI0MworI2RlZmluZSBHTF9ERUJVR19DQUxMQkFDS19GVU5DVElPTl9BUkIgICAgMHg4MjQ0CisjZGVmaW5lIEdMX0RFQlVHX0NBTExCQUNLX1VTRVJfUEFSQU1fQVJCICAweDgyNDUKKyNkZWZpbmUgR0xfREVCVUdfU09VUkNFX0FQSV9BUkIgICAgICAgICAgIDB4ODI0NgorI2RlZmluZSBHTF9ERUJVR19TT1VSQ0VfV0lORE9XX1NZU1RFTV9BUkIgMHg4MjQ3CisjZGVmaW5lIEdMX0RFQlVHX1NPVVJDRV9TSEFERVJfQ09NUElMRVJfQVJCIDB4ODI0OAorI2RlZmluZSBHTF9ERUJVR19TT1VSQ0VfVEhJUkRfUEFSVFlfQVJCICAgMHg4MjQ5CisjZGVmaW5lIEdMX0RFQlVHX1NPVVJDRV9BUFBMSUNBVElPTl9BUkIgICAweDgyNEEKKyNkZWZpbmUgR0xfREVCVUdfU09VUkNFX09USEVSX0FSQiAgICAgICAgIDB4ODI0QgorI2RlZmluZSBHTF9ERUJVR19UWVBFX0VSUk9SX0FSQiAgICAgICAgICAgMHg4MjRDCisjZGVmaW5lIEdMX0RFQlVHX1RZUEVfREVQUkVDQVRFRF9CRUhBVklPUl9BUkIgMHg4MjRECisjZGVmaW5lIEdMX0RFQlVHX1RZUEVfVU5ERUZJTkVEX0JFSEFWSU9SX0FSQiAweDgyNEUKKyNkZWZpbmUgR0xfREVCVUdfVFlQRV9QT1JUQUJJTElUWV9BUkIgICAgIDB4ODI0RgorI2RlZmluZSBHTF9ERUJVR19UWVBFX1BFUkZPUk1BTkNFX0FSQiAgICAgMHg4MjUwCisjZGVmaW5lIEdMX0RFQlVHX1RZUEVfT1RIRVJfQVJCICAgICAgICAgICAweDgyNTEKKyNkZWZpbmUgR0xfTUFYX0RFQlVHX01FU1NBR0VfTEVOR1RIX0FSQiAgIDB4OTE0MworI2RlZmluZSBHTF9NQVhfREVCVUdfTE9HR0VEX01FU1NBR0VTX0FSQiAgMHg5MTQ0CisjZGVmaW5lIEdMX0RFQlVHX0xPR0dFRF9NRVNTQUdFU19BUkIgICAgICAweDkxNDUKKyNkZWZpbmUgR0xfREVCVUdfU0VWRVJJVFlfSElHSF9BUkIgICAgICAgIDB4OTE0NgorI2RlZmluZSBHTF9ERUJVR19TRVZFUklUWV9NRURJVU1fQVJCICAgICAgMHg5MTQ3CisjZGVmaW5lIEdMX0RFQlVHX1NFVkVSSVRZX0xPV19BUkIgICAgICAgICAweDkxNDgKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9yb2J1c3RuZXNzCisvKiByZXVzZSBHTF9OT19FUlJPUiAqLworI2RlZmluZSBHTF9DT05URVhUX0ZMQUdfUk9CVVNUX0FDQ0VTU19CSVRfQVJCIDB4MDAwMDAwMDQKKyNkZWZpbmUgR0xfTE9TRV9DT05URVhUX09OX1JFU0VUX0FSQiAgICAgIDB4ODI1MgorI2RlZmluZSBHTF9HVUlMVFlfQ09OVEVYVF9SRVNFVF9BUkIgICAgICAgMHg4MjUzCisjZGVmaW5lIEdMX0lOTk9DRU5UX0NPTlRFWFRfUkVTRVRfQVJCICAgICAweDgyNTQKKyNkZWZpbmUgR0xfVU5LTk9XTl9DT05URVhUX1JFU0VUX0FSQiAgICAgIDB4ODI1NQorI2RlZmluZSBHTF9SRVNFVF9OT1RJRklDQVRJT05fU1RSQVRFR1lfQVJCIDB4ODI1NgorI2RlZmluZSBHTF9OT19SRVNFVF9OT1RJRklDQVRJT05fQVJCICAgICAgMHg4MjYxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZGVyX3N0ZW5jaWxfZXhwb3J0CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfYmFzZV9pbnN0YW5jZQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfNDIwcGFjaworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RyYW5zZm9ybV9mZWVkYmFja19pbnN0YW5jZWQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9jb21wcmVzc2VkX3RleHR1cmVfcGl4ZWxfc3RvcmFnZQorI2RlZmluZSBHTF9VTlBBQ0tfQ09NUFJFU1NFRF9CTE9DS19XSURUSCAgMHg5MTI3CisjZGVmaW5lIEdMX1VOUEFDS19DT01QUkVTU0VEX0JMT0NLX0hFSUdIVCAweDkxMjgKKyNkZWZpbmUgR0xfVU5QQUNLX0NPTVBSRVNTRURfQkxPQ0tfREVQVEggIDB4OTEyOQorI2RlZmluZSBHTF9VTlBBQ0tfQ09NUFJFU1NFRF9CTE9DS19TSVpFICAgMHg5MTJBCisjZGVmaW5lIEdMX1BBQ0tfQ09NUFJFU1NFRF9CTE9DS19XSURUSCAgICAweDkxMkIKKyNkZWZpbmUgR0xfUEFDS19DT01QUkVTU0VEX0JMT0NLX0hFSUdIVCAgIDB4OTEyQworI2RlZmluZSBHTF9QQUNLX0NPTVBSRVNTRURfQkxPQ0tfREVQVEggICAgMHg5MTJECisjZGVmaW5lIEdMX1BBQ0tfQ09NUFJFU1NFRF9CTE9DS19TSVpFICAgICAweDkxMkUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9jb25zZXJ2YXRpdmVfZGVwdGgKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9pbnRlcm5hbGZvcm1hdF9xdWVyeQorI2RlZmluZSBHTF9OVU1fU0FNUExFX0NPVU5UUyAgICAgICAgICAgICAgMHg5MzgwCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfbWFwX2J1ZmZlcl9hbGlnbm1lbnQKKyNkZWZpbmUgR0xfTUlOX01BUF9CVUZGRVJfQUxJR05NRU5UICAgICAgIDB4OTBCQworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRlcl9hdG9taWNfY291bnRlcnMKKyNkZWZpbmUgR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSICAgICAgICAgIDB4OTJDMAorI2RlZmluZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfQklORElORyAgMHg5MkMxCisjZGVmaW5lIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9TVEFSVCAgICAweDkyQzIKKyNkZWZpbmUgR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX1NJWkUgICAgIDB4OTJDMworI2RlZmluZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfREFUQV9TSVpFIDB4OTJDNAorI2RlZmluZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfQUNUSVZFX0FUT01JQ19DT1VOVEVSUyAweDkyQzUKKyNkZWZpbmUgR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX0FDVElWRV9BVE9NSUNfQ09VTlRFUl9JTkRJQ0VTIDB4OTJDNgorI2RlZmluZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfUkVGRVJFTkNFRF9CWV9WRVJURVhfU0hBREVSIDB4OTJDNworI2RlZmluZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfUkVGRVJFTkNFRF9CWV9URVNTX0NPTlRST0xfU0hBREVSIDB4OTJDOAorI2RlZmluZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfUkVGRVJFTkNFRF9CWV9URVNTX0VWQUxVQVRJT05fU0hBREVSIDB4OTJDOQorI2RlZmluZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfUkVGRVJFTkNFRF9CWV9HRU9NRVRSWV9TSEFERVIgMHg5MkNBCisjZGVmaW5lIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9SRUZFUkVOQ0VEX0JZX0ZSQUdNRU5UX1NIQURFUiAweDkyQ0IKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJTIDB4OTJDQworI2RlZmluZSBHTF9NQVhfVEVTU19DT05UUk9MX0FUT01JQ19DT1VOVEVSX0JVRkZFUlMgMHg5MkNECisjZGVmaW5lIEdMX01BWF9URVNTX0VWQUxVQVRJT05fQVRPTUlDX0NPVU5URVJfQlVGRkVSUyAweDkyQ0UKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX0FUT01JQ19DT1VOVEVSX0JVRkZFUlMgMHg5MkNGCisjZGVmaW5lIEdMX01BWF9GUkFHTUVOVF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJTIDB4OTJEMAorI2RlZmluZSBHTF9NQVhfQ09NQklORURfQVRPTUlDX0NPVU5URVJfQlVGRkVSUyAweDkyRDEKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9BVE9NSUNfQ09VTlRFUlMgICAgIDB4OTJEMgorI2RlZmluZSBHTF9NQVhfVEVTU19DT05UUk9MX0FUT01JQ19DT1VOVEVSUyAweDkyRDMKKyNkZWZpbmUgR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9BVE9NSUNfQ09VTlRFUlMgMHg5MkQ0CisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9BVE9NSUNfQ09VTlRFUlMgICAweDkyRDUKKyNkZWZpbmUgR0xfTUFYX0ZSQUdNRU5UX0FUT01JQ19DT1VOVEVSUyAgIDB4OTJENgorI2RlZmluZSBHTF9NQVhfQ09NQklORURfQVRPTUlDX0NPVU5URVJTICAgMHg5MkQ3CisjZGVmaW5lIEdMX01BWF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfU0laRSAweDkyRDgKKyNkZWZpbmUgR0xfTUFYX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9CSU5ESU5HUyAweDkyREMKKyNkZWZpbmUgR0xfQUNUSVZFX0FUT01JQ19DT1VOVEVSX0JVRkZFUlMgIDB4OTJEOQorI2RlZmluZSBHTF9VTklGT1JNX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9JTkRFWCAweDkyREEKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0FUT01JQ19DT1VOVEVSICAgIDB4OTJEQgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfQkFSUklFUl9CSVQgMHgwMDAwMDAwMQorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX0JBUlJJRVJfQklUICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTF9VTklGT1JNX0JBUlJJRVJfQklUICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTF9URVhUVVJFX0ZFVENIX0JBUlJJRVJfQklUICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBHTF9TSEFERVJfSU1BR0VfQUNDRVNTX0JBUlJJRVJfQklUIDB4MDAwMDAwMjAKKyNkZWZpbmUgR0xfQ09NTUFORF9CQVJSSUVSX0JJVCAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgR0xfUElYRUxfQlVGRkVSX0JBUlJJRVJfQklUICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgR0xfVEVYVFVSRV9VUERBVEVfQkFSUklFUl9CSVQgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgR0xfQlVGRkVSX1VQREFURV9CQVJSSUVSX0JJVCAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQkFSUklFUl9CSVQgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JBUlJJRVJfQklUIDB4MDAwMDA4MDAKKyNkZWZpbmUgR0xfQVRPTUlDX0NPVU5URVJfQkFSUklFUl9CSVQgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgR0xfQUxMX0JBUlJJRVJfQklUUyAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKKyNkZWZpbmUgR0xfTUFYX0lNQUdFX1VOSVRTICAgICAgICAgICAgICAgIDB4OEYzOAorI2RlZmluZSBHTF9NQVhfQ09NQklORURfSU1BR0VfVU5JVFNfQU5EX0ZSQUdNRU5UX09VVFBVVFMgMHg4RjM5CisjZGVmaW5lIEdMX0lNQUdFX0JJTkRJTkdfTkFNRSAgICAgICAgICAgICAweDhGM0EKKyNkZWZpbmUgR0xfSU1BR0VfQklORElOR19MRVZFTCAgICAgICAgICAgIDB4OEYzQgorI2RlZmluZSBHTF9JTUFHRV9CSU5ESU5HX0xBWUVSRUQgICAgICAgICAgMHg4RjNDCisjZGVmaW5lIEdMX0lNQUdFX0JJTkRJTkdfTEFZRVIgICAgICAgICAgICAweDhGM0QKKyNkZWZpbmUgR0xfSU1BR0VfQklORElOR19BQ0NFU1MgICAgICAgICAgIDB4OEYzRQorI2RlZmluZSBHTF9JTUFHRV8xRCAgICAgICAgICAgICAgICAgICAgICAgMHg5MDRDCisjZGVmaW5lIEdMX0lNQUdFXzJEICAgICAgICAgICAgICAgICAgICAgICAweDkwNEQKKyNkZWZpbmUgR0xfSU1BR0VfM0QgICAgICAgICAgICAgICAgICAgICAgIDB4OTA0RQorI2RlZmluZSBHTF9JTUFHRV8yRF9SRUNUICAgICAgICAgICAgICAgICAgMHg5MDRGCisjZGVmaW5lIEdMX0lNQUdFX0NVQkUgICAgICAgICAgICAgICAgICAgICAweDkwNTAKKyNkZWZpbmUgR0xfSU1BR0VfQlVGRkVSICAgICAgICAgICAgICAgICAgIDB4OTA1MQorI2RlZmluZSBHTF9JTUFHRV8xRF9BUlJBWSAgICAgICAgICAgICAgICAgMHg5MDUyCisjZGVmaW5lIEdMX0lNQUdFXzJEX0FSUkFZICAgICAgICAgICAgICAgICAweDkwNTMKKyNkZWZpbmUgR0xfSU1BR0VfQ1VCRV9NQVBfQVJSQVkgICAgICAgICAgIDB4OTA1NAorI2RlZmluZSBHTF9JTUFHRV8yRF9NVUxUSVNBTVBMRSAgICAgICAgICAgMHg5MDU1CisjZGVmaW5lIEdMX0lNQUdFXzJEX01VTFRJU0FNUExFX0FSUkFZICAgICAweDkwNTYKKyNkZWZpbmUgR0xfSU5UX0lNQUdFXzFEICAgICAgICAgICAgICAgICAgIDB4OTA1NworI2RlZmluZSBHTF9JTlRfSU1BR0VfMkQgICAgICAgICAgICAgICAgICAgMHg5MDU4CisjZGVmaW5lIEdMX0lOVF9JTUFHRV8zRCAgICAgICAgICAgICAgICAgICAweDkwNTkKKyNkZWZpbmUgR0xfSU5UX0lNQUdFXzJEX1JFQ1QgICAgICAgICAgICAgIDB4OTA1QQorI2RlZmluZSBHTF9JTlRfSU1BR0VfQ1VCRSAgICAgICAgICAgICAgICAgMHg5MDVCCisjZGVmaW5lIEdMX0lOVF9JTUFHRV9CVUZGRVIgICAgICAgICAgICAgICAweDkwNUMKKyNkZWZpbmUgR0xfSU5UX0lNQUdFXzFEX0FSUkFZICAgICAgICAgICAgIDB4OTA1RAorI2RlZmluZSBHTF9JTlRfSU1BR0VfMkRfQVJSQVkgICAgICAgICAgICAgMHg5MDVFCisjZGVmaW5lIEdMX0lOVF9JTUFHRV9DVUJFX01BUF9BUlJBWSAgICAgICAweDkwNUYKKyNkZWZpbmUgR0xfSU5UX0lNQUdFXzJEX01VTFRJU0FNUExFICAgICAgIDB4OTA2MAorI2RlZmluZSBHTF9JTlRfSU1BR0VfMkRfTVVMVElTQU1QTEVfQVJSQVkgMHg5MDYxCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8xRCAgICAgICAgICAweDkwNjIKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0lNQUdFXzJEICAgICAgICAgIDB4OTA2MworI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfM0QgICAgICAgICAgMHg5MDY0CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8yRF9SRUNUICAgICAweDkwNjUKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0lNQUdFX0NVQkUgICAgICAgIDB4OTA2NgorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfQlVGRkVSICAgICAgMHg5MDY3CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8xRF9BUlJBWSAgICAweDkwNjgKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0lNQUdFXzJEX0FSUkFZICAgIDB4OTA2OQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfQ1VCRV9NQVBfQVJSQVkgMHg5MDZBCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8yRF9NVUxUSVNBTVBMRSAweDkwNkIKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0lNQUdFXzJEX01VTFRJU0FNUExFX0FSUkFZIDB4OTA2QworI2RlZmluZSBHTF9NQVhfSU1BR0VfU0FNUExFUyAgICAgICAgICAgICAgMHg5MDZECisjZGVmaW5lIEdMX0lNQUdFX0JJTkRJTkdfRk9STUFUICAgICAgICAgICAweDkwNkUKKyNkZWZpbmUgR0xfSU1BR0VfRk9STUFUX0NPTVBBVElCSUxJVFlfVFlQRSAweDkwQzcKKyNkZWZpbmUgR0xfSU1BR0VfRk9STUFUX0NPTVBBVElCSUxJVFlfQllfU0laRSAweDkwQzgKKyNkZWZpbmUgR0xfSU1BR0VfRk9STUFUX0NPTVBBVElCSUxJVFlfQllfQ0xBU1MgMHg5MEM5CisjZGVmaW5lIEdMX01BWF9WRVJURVhfSU1BR0VfVU5JRk9STVMgICAgICAweDkwQ0EKKyNkZWZpbmUgR0xfTUFYX1RFU1NfQ09OVFJPTF9JTUFHRV9VTklGT1JNUyAweDkwQ0IKKyNkZWZpbmUgR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9JTUFHRV9VTklGT1JNUyAweDkwQ0MKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX0lNQUdFX1VOSUZPUk1TICAgIDB4OTBDRAorI2RlZmluZSBHTF9NQVhfRlJBR01FTlRfSU1BR0VfVU5JRk9STVMgICAgMHg5MENFCisjZGVmaW5lIEdMX01BWF9DT01CSU5FRF9JTUFHRV9VTklGT1JNUyAgICAweDkwQ0YKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkaW5nX2xhbmd1YWdlX3BhY2tpbmcKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX3N0b3JhZ2UKKyNkZWZpbmUgR0xfVEVYVFVSRV9JTU1VVEFCTEVfRk9STUFUICAgICAgIDB4OTEyRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2FiZ3IKKyNkZWZpbmUgR0xfQUJHUl9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2JsZW5kX2NvbG9yCisjZGVmaW5lIEdMX0NPTlNUQU5UX0NPTE9SX0VYVCAgICAgICAgICAgICAweDgwMDEKKyNkZWZpbmUgR0xfT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SX0VYVCAgIDB4ODAwMgorI2RlZmluZSBHTF9DT05TVEFOVF9BTFBIQV9FWFQgICAgICAgICAgICAgMHg4MDAzCisjZGVmaW5lIEdMX09ORV9NSU5VU19DT05TVEFOVF9BTFBIQV9FWFQgICAweDgwMDQKKyNkZWZpbmUgR0xfQkxFTkRfQ09MT1JfRVhUICAgICAgICAgICAgICAgIDB4ODAwNQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3BvbHlnb25fb2Zmc2V0CisjZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0VYVCAgICAgICAgICAgICAweDgwMzcKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SX0VYVCAgICAgIDB4ODAzOAorI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9CSUFTX0VYVCAgICAgICAgMHg4MDM5CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZQorI2RlZmluZSBHTF9BTFBIQTRfRVhUICAgICAgICAgICAgICAgICAgICAgMHg4MDNCCisjZGVmaW5lIEdMX0FMUEhBOF9FWFQgICAgICAgICAgICAgICAgICAgICAweDgwM0MKKyNkZWZpbmUgR0xfQUxQSEExMl9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODAzRAorI2RlZmluZSBHTF9BTFBIQTE2X0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MDNFCisjZGVmaW5lIEdMX0xVTUlOQU5DRTRfRVhUICAgICAgICAgICAgICAgICAweDgwM0YKKyNkZWZpbmUgR0xfTFVNSU5BTkNFOF9FWFQgICAgICAgICAgICAgICAgIDB4ODA0MAorI2RlZmluZSBHTF9MVU1JTkFOQ0UxMl9FWFQgICAgICAgICAgICAgICAgMHg4MDQxCisjZGVmaW5lIEdMX0xVTUlOQU5DRTE2X0VYVCAgICAgICAgICAgICAgICAweDgwNDIKKyNkZWZpbmUgR0xfTFVNSU5BTkNFNF9BTFBIQTRfRVhUICAgICAgICAgIDB4ODA0MworI2RlZmluZSBHTF9MVU1JTkFOQ0U2X0FMUEhBMl9FWFQgICAgICAgICAgMHg4MDQ0CisjZGVmaW5lIEdMX0xVTUlOQU5DRThfQUxQSEE4X0VYVCAgICAgICAgICAweDgwNDUKKyNkZWZpbmUgR0xfTFVNSU5BTkNFMTJfQUxQSEE0X0VYVCAgICAgICAgIDB4ODA0NgorI2RlZmluZSBHTF9MVU1JTkFOQ0UxMl9BTFBIQTEyX0VYVCAgICAgICAgMHg4MDQ3CisjZGVmaW5lIEdMX0xVTUlOQU5DRTE2X0FMUEhBMTZfRVhUICAgICAgICAweDgwNDgKKyNkZWZpbmUgR0xfSU5URU5TSVRZX0VYVCAgICAgICAgICAgICAgICAgIDB4ODA0OQorI2RlZmluZSBHTF9JTlRFTlNJVFk0X0VYVCAgICAgICAgICAgICAgICAgMHg4MDRBCisjZGVmaW5lIEdMX0lOVEVOU0lUWThfRVhUICAgICAgICAgICAgICAgICAweDgwNEIKKyNkZWZpbmUgR0xfSU5URU5TSVRZMTJfRVhUICAgICAgICAgICAgICAgIDB4ODA0QworI2RlZmluZSBHTF9JTlRFTlNJVFkxNl9FWFQgICAgICAgICAgICAgICAgMHg4MDRECisjZGVmaW5lIEdMX1JHQjJfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDgwNEUKKyNkZWZpbmUgR0xfUkdCNF9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODA0RgorI2RlZmluZSBHTF9SR0I1X0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MDUwCisjZGVmaW5lIEdMX1JHQjhfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDgwNTEKKyNkZWZpbmUgR0xfUkdCMTBfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4ODA1MgorI2RlZmluZSBHTF9SR0IxMl9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4MDUzCisjZGVmaW5lIEdMX1JHQjE2X0VYVCAgICAgICAgICAgICAgICAgICAgICAweDgwNTQKKyNkZWZpbmUgR0xfUkdCQTJfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4ODA1NQorI2RlZmluZSBHTF9SR0JBNF9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4MDU2CisjZGVmaW5lIEdMX1JHQjVfQTFfRVhUICAgICAgICAgICAgICAgICAgICAweDgwNTcKKyNkZWZpbmUgR0xfUkdCQThfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4ODA1OAorI2RlZmluZSBHTF9SR0IxMF9BMl9FWFQgICAgICAgICAgICAgICAgICAgMHg4MDU5CisjZGVmaW5lIEdMX1JHQkExMl9FWFQgICAgICAgICAgICAgICAgICAgICAweDgwNUEKKyNkZWZpbmUgR0xfUkdCQTE2X0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODA1QgorI2RlZmluZSBHTF9URVhUVVJFX1JFRF9TSVpFX0VYVCAgICAgICAgICAgMHg4MDVDCisjZGVmaW5lIEdMX1RFWFRVUkVfR1JFRU5fU0laRV9FWFQgICAgICAgICAweDgwNUQKKyNkZWZpbmUgR0xfVEVYVFVSRV9CTFVFX1NJWkVfRVhUICAgICAgICAgIDB4ODA1RQorI2RlZmluZSBHTF9URVhUVVJFX0FMUEhBX1NJWkVfRVhUICAgICAgICAgMHg4MDVGCisjZGVmaW5lIEdMX1RFWFRVUkVfTFVNSU5BTkNFX1NJWkVfRVhUICAgICAweDgwNjAKKyNkZWZpbmUgR0xfVEVYVFVSRV9JTlRFTlNJVFlfU0laRV9FWFQgICAgIDB4ODA2MQorI2RlZmluZSBHTF9SRVBMQUNFX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MDYyCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfMURfRVhUICAgICAgICAgICAweDgwNjMKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV8yRF9FWFQgICAgICAgICAgIDB4ODA2NAorI2RlZmluZSBHTF9URVhUVVJFX1RPT19MQVJHRV9FWFQgICAgICAgICAgMHg4MDY1CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZTNECisjZGVmaW5lIEdMX1BBQ0tfU0tJUF9JTUFHRVNfRVhUICAgICAgICAgICAweDgwNkIKKyNkZWZpbmUgR0xfUEFDS19JTUFHRV9IRUlHSFRfRVhUICAgICAgICAgIDB4ODA2QworI2RlZmluZSBHTF9VTlBBQ0tfU0tJUF9JTUFHRVNfRVhUICAgICAgICAgMHg4MDZECisjZGVmaW5lIEdMX1VOUEFDS19JTUFHRV9IRUlHSFRfRVhUICAgICAgICAweDgwNkUKKyNkZWZpbmUgR0xfVEVYVFVSRV8zRF9FWFQgICAgICAgICAgICAgICAgIDB4ODA2RgorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFXzNEX0VYVCAgICAgICAgICAgMHg4MDcwCisjZGVmaW5lIEdMX1RFWFRVUkVfREVQVEhfRVhUICAgICAgICAgICAgICAweDgwNzEKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1JfRVhUICAgICAgICAgICAgIDB4ODA3MgorI2RlZmluZSBHTF9NQVhfM0RfVEVYVFVSRV9TSVpFX0VYVCAgICAgICAgMHg4MDczCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfZmlsdGVyNAorI2RlZmluZSBHTF9GSUxURVI0X1NHSVMgICAgICAgICAgICAgICAgICAgMHg4MTQ2CisjZGVmaW5lIEdMX1RFWFRVUkVfRklMVEVSNF9TSVpFX1NHSVMgICAgICAweDgxNDcKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zdWJ0ZXh0dXJlCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY29weV90ZXh0dXJlCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfaGlzdG9ncmFtCisjZGVmaW5lIEdMX0hJU1RPR1JBTV9FWFQgICAgICAgICAgICAgICAgICAweDgwMjQKKyNkZWZpbmUgR0xfUFJPWFlfSElTVE9HUkFNX0VYVCAgICAgICAgICAgIDB4ODAyNQorI2RlZmluZSBHTF9ISVNUT0dSQU1fV0lEVEhfRVhUICAgICAgICAgICAgMHg4MDI2CisjZGVmaW5lIEdMX0hJU1RPR1JBTV9GT1JNQVRfRVhUICAgICAgICAgICAweDgwMjcKKyNkZWZpbmUgR0xfSElTVE9HUkFNX1JFRF9TSVpFX0VYVCAgICAgICAgIDB4ODAyOAorI2RlZmluZSBHTF9ISVNUT0dSQU1fR1JFRU5fU0laRV9FWFQgICAgICAgMHg4MDI5CisjZGVmaW5lIEdMX0hJU1RPR1JBTV9CTFVFX1NJWkVfRVhUICAgICAgICAweDgwMkEKKyNkZWZpbmUgR0xfSElTVE9HUkFNX0FMUEhBX1NJWkVfRVhUICAgICAgIDB4ODAyQgorI2RlZmluZSBHTF9ISVNUT0dSQU1fTFVNSU5BTkNFX1NJWkVfRVhUICAgMHg4MDJDCisjZGVmaW5lIEdMX0hJU1RPR1JBTV9TSU5LX0VYVCAgICAgICAgICAgICAweDgwMkQKKyNkZWZpbmUgR0xfTUlOTUFYX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODAyRQorI2RlZmluZSBHTF9NSU5NQVhfRk9STUFUX0VYVCAgICAgICAgICAgICAgMHg4MDJGCisjZGVmaW5lIEdMX01JTk1BWF9TSU5LX0VYVCAgICAgICAgICAgICAgICAweDgwMzAKKyNkZWZpbmUgR0xfVEFCTEVfVE9PX0xBUkdFX0VYVCAgICAgICAgICAgIDB4ODAzMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2NvbnZvbHV0aW9uCisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OXzFEX0VYVCAgICAgICAgICAgICAweDgwMTAKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fMkRfRVhUICAgICAgICAgICAgIDB4ODAxMQorI2RlZmluZSBHTF9TRVBBUkFCTEVfMkRfRVhUICAgICAgICAgICAgICAgMHg4MDEyCisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0JPUkRFUl9NT0RFX0VYVCAgICAweDgwMTMKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fRklMVEVSX1NDQUxFX0VYVCAgIDB4ODAxNAorI2RlZmluZSBHTF9DT05WT0xVVElPTl9GSUxURVJfQklBU19FWFQgICAgMHg4MDE1CisjZGVmaW5lIEdMX1JFRFVDRV9FWFQgICAgICAgICAgICAgICAgICAgICAweDgwMTYKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fRk9STUFUX0VYVCAgICAgICAgIDB4ODAxNworI2RlZmluZSBHTF9DT05WT0xVVElPTl9XSURUSF9FWFQgICAgICAgICAgMHg4MDE4CisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0hFSUdIVF9FWFQgICAgICAgICAweDgwMTkKKyNkZWZpbmUgR0xfTUFYX0NPTlZPTFVUSU9OX1dJRFRIX0VYVCAgICAgIDB4ODAxQQorI2RlZmluZSBHTF9NQVhfQ09OVk9MVVRJT05fSEVJR0hUX0VYVCAgICAgMHg4MDFCCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fUkVEX1NDQUxFX0VYVCAweDgwMUMKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9HUkVFTl9TQ0FMRV9FWFQgMHg4MDFECisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fQkxVRV9TQ0FMRV9FWFQgMHg4MDFFCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fQUxQSEFfU0NBTEVfRVhUIDB4ODAxRgorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX1JFRF9CSUFTX0VYVCAgMHg4MDIwCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fR1JFRU5fQklBU19FWFQgMHg4MDIxCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fQkxVRV9CSUFTX0VYVCAweDgwMjIKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9BTFBIQV9CSUFTX0VYVCAweDgwMjMKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSV9jb2xvcl9tYXRyaXgKKyNkZWZpbmUgR0xfQ09MT1JfTUFUUklYX1NHSSAgICAgICAgICAgICAgIDB4ODBCMQorI2RlZmluZSBHTF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEhfU0dJICAgMHg4MEIyCisjZGVmaW5lIEdMX01BWF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEhfU0dJIDB4ODBCMworI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9SRURfU0NBTEVfU0dJIDB4ODBCNAorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9HUkVFTl9TQ0FMRV9TR0kgMHg4MEI1CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0JMVUVfU0NBTEVfU0dJIDB4ODBCNgorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9BTFBIQV9TQ0FMRV9TR0kgMHg4MEI3CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX1JFRF9CSUFTX1NHSSAweDgwQjgKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfR1JFRU5fQklBU19TR0kgMHg4MEI5CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0JMVUVfQklBU19TR0kgMHg4MEJBCisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0FMUEhBX0JJQVNfU0dJIDB4ODBCQgorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJX2NvbG9yX3RhYmxlCisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX1NHSSAgICAgICAgICAgICAgICAweDgwRDAKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9DT0xPUl9UQUJMRV9TR0kgMHg4MEQxCisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0NPTE9SX1RBQkxFX1NHSSAweDgwRDIKKyNkZWZpbmUgR0xfUFJPWFlfQ09MT1JfVEFCTEVfU0dJICAgICAgICAgIDB4ODBEMworI2RlZmluZSBHTF9QUk9YWV9QT1NUX0NPTlZPTFVUSU9OX0NPTE9SX1RBQkxFX1NHSSAweDgwRDQKKyNkZWZpbmUgR0xfUFJPWFlfUE9TVF9DT0xPUl9NQVRSSVhfQ09MT1JfVEFCTEVfU0dJIDB4ODBENQorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9TQ0FMRV9TR0kgICAgICAgICAgMHg4MEQ2CisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0JJQVNfU0dJICAgICAgICAgICAweDgwRDcKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfRk9STUFUX1NHSSAgICAgICAgIDB4ODBEOAorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9XSURUSF9TR0kgICAgICAgICAgMHg4MEQ5CisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX1JFRF9TSVpFX1NHSSAgICAgICAweDgwREEKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfR1JFRU5fU0laRV9TR0kgICAgIDB4ODBEQgorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9CTFVFX1NJWkVfU0dJICAgICAgMHg4MERDCisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0FMUEhBX1NJWkVfU0dJICAgICAweDgwREQKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfTFVNSU5BTkNFX1NJWkVfU0dJIDB4ODBERQorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9JTlRFTlNJVFlfU0laRV9TR0kgMHg4MERGCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3BpeGVsX3RleHR1cmUKKyNkZWZpbmUgR0xfUElYRUxfVEVYVFVSRV9TR0lTICAgICAgICAgICAgIDB4ODM1MworI2RlZmluZSBHTF9QSVhFTF9GUkFHTUVOVF9SR0JfU09VUkNFX1NHSVMgMHg4MzU0CisjZGVmaW5lIEdMX1BJWEVMX0ZSQUdNRU5UX0FMUEhBX1NPVVJDRV9TR0lTIDB4ODM1NQorI2RlZmluZSBHTF9QSVhFTF9HUk9VUF9DT0xPUl9TR0lTICAgICAgICAgMHg4MzU2CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3BpeGVsX3RleHR1cmUKKyNkZWZpbmUgR0xfUElYRUxfVEVYX0dFTl9TR0lYICAgICAgICAgICAgIDB4ODEzOQorI2RlZmluZSBHTF9QSVhFTF9URVhfR0VOX01PREVfU0dJWCAgICAgICAgMHg4MzJCCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3RleHR1cmU0RAorI2RlZmluZSBHTF9QQUNLX1NLSVBfVk9MVU1FU19TR0lTICAgICAgICAgMHg4MTMwCisjZGVmaW5lIEdMX1BBQ0tfSU1BR0VfREVQVEhfU0dJUyAgICAgICAgICAweDgxMzEKKyNkZWZpbmUgR0xfVU5QQUNLX1NLSVBfVk9MVU1FU19TR0lTICAgICAgIDB4ODEzMgorI2RlZmluZSBHTF9VTlBBQ0tfSU1BR0VfREVQVEhfU0dJUyAgICAgICAgMHg4MTMzCisjZGVmaW5lIEdMX1RFWFRVUkVfNERfU0dJUyAgICAgICAgICAgICAgICAweDgxMzQKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV80RF9TR0lTICAgICAgICAgIDB4ODEzNQorI2RlZmluZSBHTF9URVhUVVJFXzREU0laRV9TR0lTICAgICAgICAgICAgMHg4MTM2CisjZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9RX1NHSVMgICAgICAgICAgICAweDgxMzcKKyNkZWZpbmUgR0xfTUFYXzREX1RFWFRVUkVfU0laRV9TR0lTICAgICAgIDB4ODEzOAorI2RlZmluZSBHTF9URVhUVVJFXzREX0JJTkRJTkdfU0dJUyAgICAgICAgMHg4MTRGCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lfdGV4dHVyZV9jb2xvcl90YWJsZQorI2RlZmluZSBHTF9URVhUVVJFX0NPTE9SX1RBQkxFX1NHSSAgICAgICAgMHg4MEJDCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfQ09MT1JfVEFCTEVfU0dJICAweDgwQkQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9jbXlrYQorI2RlZmluZSBHTF9DTVlLX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MDBDCisjZGVmaW5lIEdMX0NNWUtBX0VYVCAgICAgICAgICAgICAgICAgICAgICAweDgwMEQKKyNkZWZpbmUgR0xfUEFDS19DTVlLX0hJTlRfRVhUICAgICAgICAgICAgIDB4ODAwRQorI2RlZmluZSBHTF9VTlBBQ0tfQ01ZS19ISU5UX0VYVCAgICAgICAgICAgMHg4MDBGCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9vYmplY3QKKyNkZWZpbmUgR0xfVEVYVFVSRV9QUklPUklUWV9FWFQgICAgICAgICAgIDB4ODA2NgorI2RlZmluZSBHTF9URVhUVVJFX1JFU0lERU5UX0VYVCAgICAgICAgICAgMHg4MDY3CisjZGVmaW5lIEdMX1RFWFRVUkVfMURfQklORElOR19FWFQgICAgICAgICAweDgwNjgKKyNkZWZpbmUgR0xfVEVYVFVSRV8yRF9CSU5ESU5HX0VYVCAgICAgICAgIDB4ODA2OQorI2RlZmluZSBHTF9URVhUVVJFXzNEX0JJTkRJTkdfRVhUICAgICAgICAgMHg4MDZBCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX2RldGFpbF90ZXh0dXJlCisjZGVmaW5lIEdMX0RFVEFJTF9URVhUVVJFXzJEX1NHSVMgICAgICAgICAweDgwOTUKKyNkZWZpbmUgR0xfREVUQUlMX1RFWFRVUkVfMkRfQklORElOR19TR0lTIDB4ODA5NgorI2RlZmluZSBHTF9MSU5FQVJfREVUQUlMX1NHSVMgICAgICAgICAgICAgMHg4MDk3CisjZGVmaW5lIEdMX0xJTkVBUl9ERVRBSUxfQUxQSEFfU0dJUyAgICAgICAweDgwOTgKKyNkZWZpbmUgR0xfTElORUFSX0RFVEFJTF9DT0xPUl9TR0lTICAgICAgIDB4ODA5OQorI2RlZmluZSBHTF9ERVRBSUxfVEVYVFVSRV9MRVZFTF9TR0lTICAgICAgMHg4MDlBCisjZGVmaW5lIEdMX0RFVEFJTF9URVhUVVJFX01PREVfU0dJUyAgICAgICAweDgwOUIKKyNkZWZpbmUgR0xfREVUQUlMX1RFWFRVUkVfRlVOQ19QT0lOVFNfU0dJUyAweDgwOUMKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfc2hhcnBlbl90ZXh0dXJlCisjZGVmaW5lIEdMX0xJTkVBUl9TSEFSUEVOX1NHSVMgICAgICAgICAgICAweDgwQUQKKyNkZWZpbmUgR0xfTElORUFSX1NIQVJQRU5fQUxQSEFfU0dJUyAgICAgIDB4ODBBRQorI2RlZmluZSBHTF9MSU5FQVJfU0hBUlBFTl9DT0xPUl9TR0lTICAgICAgMHg4MEFGCisjZGVmaW5lIEdMX1NIQVJQRU5fVEVYVFVSRV9GVU5DX1BPSU5UU19TR0lTIDB4ODBCMAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3BhY2tlZF9waXhlbHMKKyNkZWZpbmUgR0xfVU5TSUdORURfQllURV8zXzNfMl9FWFQgICAgICAgIDB4ODAzMgorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80X0VYVCAgICAgMHg4MDMzCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzFfRVhUICAgICAweDgwMzQKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzhfOF84XzhfRVhUICAgICAgIDB4ODAzNQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMTBfMTBfMTBfMl9FWFQgICAgMHg4MDM2CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfbG9kCisjZGVmaW5lIEdMX1RFWFRVUkVfTUlOX0xPRF9TR0lTICAgICAgICAgICAweDgxM0EKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQVhfTE9EX1NHSVMgICAgICAgICAgIDB4ODEzQgorI2RlZmluZSBHTF9URVhUVVJFX0JBU0VfTEVWRUxfU0dJUyAgICAgICAgMHg4MTNDCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFYX0xFVkVMX1NHSVMgICAgICAgICAweDgxM0QKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEVfU0dJUyAgICAgICAgICAgICAgIDB4ODA5RAorI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fTUFTS19TR0lTICAgICAgMHg4MDlFCisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19PTkVfU0dJUyAgICAgICAweDgwOUYKKyNkZWZpbmUgR0xfU0FNUExFX01BU0tfU0dJUyAgICAgICAgICAgICAgIDB4ODBBMAorI2RlZmluZSBHTF8xUEFTU19TR0lTICAgICAgICAgICAgICAgICAgICAgMHg4MEExCisjZGVmaW5lIEdMXzJQQVNTXzBfU0dJUyAgICAgICAgICAgICAgICAgICAweDgwQTIKKyNkZWZpbmUgR0xfMlBBU1NfMV9TR0lTICAgICAgICAgICAgICAgICAgIDB4ODBBMworI2RlZmluZSBHTF80UEFTU18wX1NHSVMgICAgICAgICAgICAgICAgICAgMHg4MEE0CisjZGVmaW5lIEdMXzRQQVNTXzFfU0dJUyAgICAgICAgICAgICAgICAgICAweDgwQTUKKyNkZWZpbmUgR0xfNFBBU1NfMl9TR0lTICAgICAgICAgICAgICAgICAgIDB4ODBBNgorI2RlZmluZSBHTF80UEFTU18zX1NHSVMgICAgICAgICAgICAgICAgICAgMHg4MEE3CisjZGVmaW5lIEdMX1NBTVBMRV9CVUZGRVJTX1NHSVMgICAgICAgICAgICAweDgwQTgKKyNkZWZpbmUgR0xfU0FNUExFU19TR0lTICAgICAgICAgICAgICAgICAgIDB4ODBBOQorI2RlZmluZSBHTF9TQU1QTEVfTUFTS19WQUxVRV9TR0lTICAgICAgICAgMHg4MEFBCisjZGVmaW5lIEdMX1NBTVBMRV9NQVNLX0lOVkVSVF9TR0lTICAgICAgICAweDgwQUIKKyNkZWZpbmUgR0xfU0FNUExFX1BBVFRFUk5fU0dJUyAgICAgICAgICAgIDB4ODBBQworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3Jlc2NhbGVfbm9ybWFsCisjZGVmaW5lIEdMX1JFU0NBTEVfTk9STUFMX0VYVCAgICAgICAgICAgICAweDgwM0EKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF92ZXJ0ZXhfYXJyYXkKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0VYVCAgICAgICAgICAgICAgIDB4ODA3NAorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfRVhUICAgICAgICAgICAgICAgMHg4MDc1CisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX0VYVCAgICAgICAgICAgICAgICAweDgwNzYKKyNkZWZpbmUgR0xfSU5ERVhfQVJSQVlfRVhUICAgICAgICAgICAgICAgIDB4ODA3NworI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0VYVCAgICAgICAgMHg4MDc4CisjZGVmaW5lIEdMX0VER0VfRkxBR19BUlJBWV9FWFQgICAgICAgICAgICAweDgwNzkKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1NJWkVfRVhUICAgICAgICAgIDB4ODA3QQorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfVFlQRV9FWFQgICAgICAgICAgMHg4MDdCCisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9TVFJJREVfRVhUICAgICAgICAweDgwN0MKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0NPVU5UX0VYVCAgICAgICAgIDB4ODA3RAorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfVFlQRV9FWFQgICAgICAgICAgMHg4MDdFCisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9TVFJJREVfRVhUICAgICAgICAweDgwN0YKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX0NPVU5UX0VYVCAgICAgICAgIDB4ODA4MAorI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9TSVpFX0VYVCAgICAgICAgICAgMHg4MDgxCisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX1RZUEVfRVhUICAgICAgICAgICAweDgwODIKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfU1RSSURFX0VYVCAgICAgICAgIDB4ODA4MworI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9DT1VOVF9FWFQgICAgICAgICAgMHg4MDg0CisjZGVmaW5lIEdMX0lOREVYX0FSUkFZX1RZUEVfRVhUICAgICAgICAgICAweDgwODUKKyNkZWZpbmUgR0xfSU5ERVhfQVJSQVlfU1RSSURFX0VYVCAgICAgICAgIDB4ODA4NgorI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9DT1VOVF9FWFQgICAgICAgICAgMHg4MDg3CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRV9FWFQgICAweDgwODgKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9UWVBFX0VYVCAgIDB4ODA4OQorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NUUklERV9FWFQgMHg4MDhBCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfQ09VTlRfRVhUICAweDgwOEIKKyNkZWZpbmUgR0xfRURHRV9GTEFHX0FSUkFZX1NUUklERV9FWFQgICAgIDB4ODA4QworI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfQ09VTlRfRVhUICAgICAgMHg4MDhECisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9QT0lOVEVSX0VYVCAgICAgICAweDgwOEUKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX1BPSU5URVJfRVhUICAgICAgIDB4ODA4RgorI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSX0VYVCAgICAgICAgMHg4MDkwCisjZGVmaW5lIEdMX0lOREVYX0FSUkFZX1BPSU5URVJfRVhUICAgICAgICAweDgwOTEKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9QT0lOVEVSX0VYVCAweDgwOTIKKyNkZWZpbmUgR0xfRURHRV9GTEFHX0FSUkFZX1BPSU5URVJfRVhUICAgIDB4ODA5MworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX21pc2NfYXR0cmlidXRlCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX2dlbmVyYXRlX21pcG1hcAorI2RlZmluZSBHTF9HRU5FUkFURV9NSVBNQVBfU0dJUyAgICAgICAgICAgMHg4MTkxCisjZGVmaW5lIEdMX0dFTkVSQVRFX01JUE1BUF9ISU5UX1NHSVMgICAgICAweDgxOTIKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfY2xpcG1hcAorI2RlZmluZSBHTF9MSU5FQVJfQ0xJUE1BUF9MSU5FQVJfU0dJWCAgICAgMHg4MTcwCisjZGVmaW5lIEdMX1RFWFRVUkVfQ0xJUE1BUF9DRU5URVJfU0dJWCAgICAweDgxNzEKKyNkZWZpbmUgR0xfVEVYVFVSRV9DTElQTUFQX0ZSQU1FX1NHSVggICAgIDB4ODE3MgorI2RlZmluZSBHTF9URVhUVVJFX0NMSVBNQVBfT0ZGU0VUX1NHSVggICAgMHg4MTczCisjZGVmaW5lIEdMX1RFWFRVUkVfQ0xJUE1BUF9WSVJUVUFMX0RFUFRIX1NHSVggMHg4MTc0CisjZGVmaW5lIEdMX1RFWFRVUkVfQ0xJUE1BUF9MT0RfT0ZGU0VUX1NHSVggMHg4MTc1CisjZGVmaW5lIEdMX1RFWFRVUkVfQ0xJUE1BUF9ERVBUSF9TR0lYICAgICAweDgxNzYKKyNkZWZpbmUgR0xfTUFYX0NMSVBNQVBfREVQVEhfU0dJWCAgICAgICAgIDB4ODE3NworI2RlZmluZSBHTF9NQVhfQ0xJUE1BUF9WSVJUVUFMX0RFUFRIX1NHSVggMHg4MTc4CisjZGVmaW5lIEdMX05FQVJFU1RfQ0xJUE1BUF9ORUFSRVNUX1NHSVggICAweDg0NEQKKyNkZWZpbmUgR0xfTkVBUkVTVF9DTElQTUFQX0xJTkVBUl9TR0lYICAgIDB4ODQ0RQorI2RlZmluZSBHTF9MSU5FQVJfQ0xJUE1BUF9ORUFSRVNUX1NHSVggICAgMHg4NDRGCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3NoYWRvdworI2RlZmluZSBHTF9URVhUVVJFX0NPTVBBUkVfU0dJWCAgICAgICAgICAgMHg4MTlBCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUEFSRV9PUEVSQVRPUl9TR0lYICAweDgxOUIKKyNkZWZpbmUgR0xfVEVYVFVSRV9MRVFVQUxfUl9TR0lYICAgICAgICAgIDB4ODE5QworI2RlZmluZSBHTF9URVhUVVJFX0dFUVVBTF9SX1NHSVggICAgICAgICAgMHg4MTlECisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfZWRnZV9jbGFtcAorI2RlZmluZSBHTF9DTEFNUF9UT19FREdFX1NHSVMgICAgICAgICAgICAgMHg4MTJGCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfYm9yZGVyX2NsYW1wCisjZGVmaW5lIEdMX0NMQU1QX1RPX0JPUkRFUl9TR0lTICAgICAgICAgICAweDgxMkQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9ibGVuZF9taW5tYXgKKyNkZWZpbmUgR0xfRlVOQ19BRERfRVhUICAgICAgICAgICAgICAgICAgIDB4ODAwNgorI2RlZmluZSBHTF9NSU5fRVhUICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA3CisjZGVmaW5lIEdMX01BWF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDgKKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fRVhUICAgICAgICAgICAgIDB4ODAwOQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2JsZW5kX3N1YnRyYWN0CisjZGVmaW5lIEdMX0ZVTkNfU1VCVFJBQ1RfRVhUICAgICAgICAgICAgICAweDgwMEEKKyNkZWZpbmUgR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUX0VYVCAgICAgIDB4ODAwQgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2JsZW5kX2xvZ2ljX29wCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2ludGVybGFjZQorI2RlZmluZSBHTF9JTlRFUkxBQ0VfU0dJWCAgICAgICAgICAgICAgICAgMHg4MDk0CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3BpeGVsX3RpbGVzCisjZGVmaW5lIEdMX1BJWEVMX1RJTEVfQkVTVF9BTElHTk1FTlRfU0dJWCAweDgxM0UKKyNkZWZpbmUgR0xfUElYRUxfVElMRV9DQUNIRV9JTkNSRU1FTlRfU0dJWCAweDgxM0YKKyNkZWZpbmUgR0xfUElYRUxfVElMRV9XSURUSF9TR0lYICAgICAgICAgIDB4ODE0MAorI2RlZmluZSBHTF9QSVhFTF9USUxFX0hFSUdIVF9TR0lYICAgICAgICAgMHg4MTQxCisjZGVmaW5lIEdMX1BJWEVMX1RJTEVfR1JJRF9XSURUSF9TR0lYICAgICAweDgxNDIKKyNkZWZpbmUgR0xfUElYRUxfVElMRV9HUklEX0hFSUdIVF9TR0lYICAgIDB4ODE0MworI2RlZmluZSBHTF9QSVhFTF9USUxFX0dSSURfREVQVEhfU0dJWCAgICAgMHg4MTQ0CisjZGVmaW5lIEdMX1BJWEVMX1RJTEVfQ0FDSEVfU0laRV9TR0lYICAgICAweDgxNDUKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9zZWxlY3QKKyNkZWZpbmUgR0xfRFVBTF9BTFBIQTRfU0dJUyAgICAgICAgICAgICAgIDB4ODExMAorI2RlZmluZSBHTF9EVUFMX0FMUEhBOF9TR0lTICAgICAgICAgICAgICAgMHg4MTExCisjZGVmaW5lIEdMX0RVQUxfQUxQSEExMl9TR0lTICAgICAgICAgICAgICAweDgxMTIKKyNkZWZpbmUgR0xfRFVBTF9BTFBIQTE2X1NHSVMgICAgICAgICAgICAgIDB4ODExMworI2RlZmluZSBHTF9EVUFMX0xVTUlOQU5DRTRfU0dJUyAgICAgICAgICAgMHg4MTE0CisjZGVmaW5lIEdMX0RVQUxfTFVNSU5BTkNFOF9TR0lTICAgICAgICAgICAweDgxMTUKKyNkZWZpbmUgR0xfRFVBTF9MVU1JTkFOQ0UxMl9TR0lTICAgICAgICAgIDB4ODExNgorI2RlZmluZSBHTF9EVUFMX0xVTUlOQU5DRTE2X1NHSVMgICAgICAgICAgMHg4MTE3CisjZGVmaW5lIEdMX0RVQUxfSU5URU5TSVRZNF9TR0lTICAgICAgICAgICAweDgxMTgKKyNkZWZpbmUgR0xfRFVBTF9JTlRFTlNJVFk4X1NHSVMgICAgICAgICAgIDB4ODExOQorI2RlZmluZSBHTF9EVUFMX0lOVEVOU0lUWTEyX1NHSVMgICAgICAgICAgMHg4MTFBCisjZGVmaW5lIEdMX0RVQUxfSU5URU5TSVRZMTZfU0dJUyAgICAgICAgICAweDgxMUIKKyNkZWZpbmUgR0xfRFVBTF9MVU1JTkFOQ0VfQUxQSEE0X1NHSVMgICAgIDB4ODExQworI2RlZmluZSBHTF9EVUFMX0xVTUlOQU5DRV9BTFBIQThfU0dJUyAgICAgMHg4MTFECisjZGVmaW5lIEdMX1FVQURfQUxQSEE0X1NHSVMgICAgICAgICAgICAgICAweDgxMUUKKyNkZWZpbmUgR0xfUVVBRF9BTFBIQThfU0dJUyAgICAgICAgICAgICAgIDB4ODExRgorI2RlZmluZSBHTF9RVUFEX0xVTUlOQU5DRTRfU0dJUyAgICAgICAgICAgMHg4MTIwCisjZGVmaW5lIEdMX1FVQURfTFVNSU5BTkNFOF9TR0lTICAgICAgICAgICAweDgxMjEKKyNkZWZpbmUgR0xfUVVBRF9JTlRFTlNJVFk0X1NHSVMgICAgICAgICAgIDB4ODEyMgorI2RlZmluZSBHTF9RVUFEX0lOVEVOU0lUWThfU0dJUyAgICAgICAgICAgMHg4MTIzCisjZGVmaW5lIEdMX0RVQUxfVEVYVFVSRV9TRUxFQ1RfU0dJUyAgICAgICAweDgxMjQKKyNkZWZpbmUgR0xfUVVBRF9URVhUVVJFX1NFTEVDVF9TR0lTICAgICAgIDB4ODEyNQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9zcHJpdGUKKyNkZWZpbmUgR0xfU1BSSVRFX1NHSVggICAgICAgICAgICAgICAgICAgIDB4ODE0OAorI2RlZmluZSBHTF9TUFJJVEVfTU9ERV9TR0lYICAgICAgICAgICAgICAgMHg4MTQ5CisjZGVmaW5lIEdMX1NQUklURV9BWElTX1NHSVggICAgICAgICAgICAgICAweDgxNEEKKyNkZWZpbmUgR0xfU1BSSVRFX1RSQU5TTEFUSU9OX1NHSVggICAgICAgIDB4ODE0QgorI2RlZmluZSBHTF9TUFJJVEVfQVhJQUxfU0dJWCAgICAgICAgICAgICAgMHg4MTRDCisjZGVmaW5lIEdMX1NQUklURV9PQkpFQ1RfQUxJR05FRF9TR0lYICAgICAweDgxNEQKKyNkZWZpbmUgR0xfU1BSSVRFX0VZRV9BTElHTkVEX1NHSVggICAgICAgIDB4ODE0RQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF90ZXh0dXJlX211bHRpX2J1ZmZlcgorI2RlZmluZSBHTF9URVhUVVJFX01VTFRJX0JVRkZFUl9ISU5UX1NHSVggMHg4MTJFCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcG9pbnRfcGFyYW1ldGVycworI2RlZmluZSBHTF9QT0lOVF9TSVpFX01JTl9FWFQgICAgICAgICAgICAgMHg4MTI2CisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfTUFYX0VYVCAgICAgICAgICAgICAweDgxMjcKKyNkZWZpbmUgR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRV9FWFQgIDB4ODEyOAorI2RlZmluZSBHTF9ESVNUQU5DRV9BVFRFTlVBVElPTl9FWFQgICAgICAgMHg4MTI5CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3BvaW50X3BhcmFtZXRlcnMKKyNkZWZpbmUgR0xfUE9JTlRfU0laRV9NSU5fU0dJUyAgICAgICAgICAgIDB4ODEyNgorI2RlZmluZSBHTF9QT0lOVF9TSVpFX01BWF9TR0lTICAgICAgICAgICAgMHg4MTI3CisjZGVmaW5lIEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkVfU0dJUyAweDgxMjgKKyNkZWZpbmUgR0xfRElTVEFOQ0VfQVRURU5VQVRJT05fU0dJUyAgICAgIDB4ODEyOQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9pbnN0cnVtZW50cworI2RlZmluZSBHTF9JTlNUUlVNRU5UX0JVRkZFUl9QT0lOVEVSX1NHSVggMHg4MTgwCisjZGVmaW5lIEdMX0lOU1RSVU1FTlRfTUVBU1VSRU1FTlRTX1NHSVggICAweDgxODEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfdGV4dHVyZV9zY2FsZV9iaWFzCisjZGVmaW5lIEdMX1BPU1RfVEVYVFVSRV9GSUxURVJfQklBU19TR0lYICAweDgxNzkKKyNkZWZpbmUgR0xfUE9TVF9URVhUVVJFX0ZJTFRFUl9TQ0FMRV9TR0lYIDB4ODE3QQorI2RlZmluZSBHTF9QT1NUX1RFWFRVUkVfRklMVEVSX0JJQVNfUkFOR0VfU0dJWCAweDgxN0IKKyNkZWZpbmUgR0xfUE9TVF9URVhUVVJFX0ZJTFRFUl9TQ0FMRV9SQU5HRV9TR0lYIDB4ODE3QworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9mcmFtZXpvb20KKyNkZWZpbmUgR0xfRlJBTUVaT09NX1NHSVggICAgICAgICAgICAgICAgIDB4ODE4QgorI2RlZmluZSBHTF9GUkFNRVpPT01fRkFDVE9SX1NHSVggICAgICAgICAgMHg4MThDCisjZGVmaW5lIEdMX01BWF9GUkFNRVpPT01fRkFDVE9SX1NHSVggICAgICAweDgxOEQKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfdGFnX3NhbXBsZV9idWZmZXIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0ZmZE1hc2tTR0lYCisjZGVmaW5lIEdMX1RFWFRVUkVfREVGT1JNQVRJT05fQklUX1NHSVggICAweDAwMDAwMDAxCisjZGVmaW5lIEdMX0dFT01FVFJZX0RFRk9STUFUSU9OX0JJVF9TR0lYICAweDAwMDAwMDAyCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3BvbHlub21pYWxfZmZkCisjZGVmaW5lIEdMX0dFT01FVFJZX0RFRk9STUFUSU9OX1NHSVggICAgICAweDgxOTQKKyNkZWZpbmUgR0xfVEVYVFVSRV9ERUZPUk1BVElPTl9TR0lYICAgICAgIDB4ODE5NQorI2RlZmluZSBHTF9ERUZPUk1BVElPTlNfTUFTS19TR0lYICAgICAgICAgMHg4MTk2CisjZGVmaW5lIEdMX01BWF9ERUZPUk1BVElPTl9PUkRFUl9TR0lYICAgICAweDgxOTcKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfcmVmZXJlbmNlX3BsYW5lCisjZGVmaW5lIEdMX1JFRkVSRU5DRV9QTEFORV9TR0lYICAgICAgICAgICAweDgxN0QKKyNkZWZpbmUgR0xfUkVGRVJFTkNFX1BMQU5FX0VRVUFUSU9OX1NHSVggIDB4ODE3RQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9mbHVzaF9yYXN0ZXIKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfZGVwdGhfdGV4dHVyZQorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQxNl9TR0lYICAgICAgICAgMHg4MUE1CisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDI0X1NHSVggICAgICAgICAweDgxQTYKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMzJfU0dJWCAgICAgICAgIDB4ODFBNworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19mb2dfZnVuY3Rpb24KKyNkZWZpbmUgR0xfRk9HX0ZVTkNfU0dJUyAgICAgICAgICAgICAgICAgIDB4ODEyQQorI2RlZmluZSBHTF9GT0dfRlVOQ19QT0lOVFNfU0dJUyAgICAgICAgICAgMHg4MTJCCisjZGVmaW5lIEdMX01BWF9GT0dfRlVOQ19QT0lOVFNfU0dJUyAgICAgICAweDgxMkMKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfZm9nX29mZnNldAorI2RlZmluZSBHTF9GT0dfT0ZGU0VUX1NHSVggICAgICAgICAgICAgICAgMHg4MTk4CisjZGVmaW5lIEdMX0ZPR19PRkZTRVRfVkFMVUVfU0dJWCAgICAgICAgICAweDgxOTkKKyNlbmRpZgorCisjaWZuZGVmIEdMX0hQX2ltYWdlX3RyYW5zZm9ybQorI2RlZmluZSBHTF9JTUFHRV9TQ0FMRV9YX0hQICAgICAgICAgICAgICAgMHg4MTU1CisjZGVmaW5lIEdMX0lNQUdFX1NDQUxFX1lfSFAgICAgICAgICAgICAgICAweDgxNTYKKyNkZWZpbmUgR0xfSU1BR0VfVFJBTlNMQVRFX1hfSFAgICAgICAgICAgIDB4ODE1NworI2RlZmluZSBHTF9JTUFHRV9UUkFOU0xBVEVfWV9IUCAgICAgICAgICAgMHg4MTU4CisjZGVmaW5lIEdMX0lNQUdFX1JPVEFURV9BTkdMRV9IUCAgICAgICAgICAweDgxNTkKKyNkZWZpbmUgR0xfSU1BR0VfUk9UQVRFX09SSUdJTl9YX0hQICAgICAgIDB4ODE1QQorI2RlZmluZSBHTF9JTUFHRV9ST1RBVEVfT1JJR0lOX1lfSFAgICAgICAgMHg4MTVCCisjZGVmaW5lIEdMX0lNQUdFX01BR19GSUxURVJfSFAgICAgICAgICAgICAweDgxNUMKKyNkZWZpbmUgR0xfSU1BR0VfTUlOX0ZJTFRFUl9IUCAgICAgICAgICAgIDB4ODE1RAorI2RlZmluZSBHTF9JTUFHRV9DVUJJQ19XRUlHSFRfSFAgICAgICAgICAgMHg4MTVFCisjZGVmaW5lIEdMX0NVQklDX0hQICAgICAgICAgICAgICAgICAgICAgICAweDgxNUYKKyNkZWZpbmUgR0xfQVZFUkFHRV9IUCAgICAgICAgICAgICAgICAgICAgIDB4ODE2MAorI2RlZmluZSBHTF9JTUFHRV9UUkFOU0ZPUk1fMkRfSFAgICAgICAgICAgMHg4MTYxCisjZGVmaW5lIEdMX1BPU1RfSU1BR0VfVFJBTlNGT1JNX0NPTE9SX1RBQkxFX0hQIDB4ODE2MgorI2RlZmluZSBHTF9QUk9YWV9QT1NUX0lNQUdFX1RSQU5TRk9STV9DT0xPUl9UQUJMRV9IUCAweDgxNjMKKyNlbmRpZgorCisjaWZuZGVmIEdMX0hQX2NvbnZvbHV0aW9uX2JvcmRlcl9tb2RlcworI2RlZmluZSBHTF9JR05PUkVfQk9SREVSX0hQICAgICAgICAgICAgICAgMHg4MTUwCisjZGVmaW5lIEdMX0NPTlNUQU5UX0JPUkRFUl9IUCAgICAgICAgICAgICAweDgxNTEKKyNkZWZpbmUgR0xfUkVQTElDQVRFX0JPUkRFUl9IUCAgICAgICAgICAgIDB4ODE1MworI2RlZmluZSBHTF9DT05WT0xVVElPTl9CT1JERVJfQ09MT1JfSFAgICAgMHg4MTU0CisjZW5kaWYKKworI2lmbmRlZiBHTF9JTkdSX3BhbGV0dGVfYnVmZmVyCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfYWRkX2VudgorI2RlZmluZSBHTF9URVhUVVJFX0VOVl9CSUFTX1NHSVggICAgICAgICAgMHg4MEJFCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY29sb3Jfc3VidGFibGUKKyNlbmRpZgorCisjaWZuZGVmIEdMX1BHSV92ZXJ0ZXhfaGludHMKKyNkZWZpbmUgR0xfVkVSVEVYX0RBVEFfSElOVF9QR0kgICAgICAgICAgIDB4MUEyMkEKKyNkZWZpbmUgR0xfVkVSVEVYX0NPTlNJU1RFTlRfSElOVF9QR0kgICAgIDB4MUEyMkIKKyNkZWZpbmUgR0xfTUFURVJJQUxfU0lERV9ISU5UX1BHSSAgICAgICAgIDB4MUEyMkMKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9ISU5UX1BHSSAgICAgICAgICAgIDB4MUEyMkQKKyNkZWZpbmUgR0xfQ09MT1IzX0JJVF9QR0kgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgR0xfQ09MT1I0X0JJVF9QR0kgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgR0xfRURHRUZMQUdfQklUX1BHSSAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgR0xfSU5ERVhfQklUX1BHSSAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgR0xfTUFUX0FNQklFTlRfQklUX1BHSSAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgR0xfTUFUX0FNQklFTlRfQU5EX0RJRkZVU0VfQklUX1BHSSAweDAwMjAwMDAwCisjZGVmaW5lIEdMX01BVF9ESUZGVVNFX0JJVF9QR0kgICAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEdMX01BVF9FTUlTU0lPTl9CSVRfUEdJICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIEdMX01BVF9DT0xPUl9JTkRFWEVTX0JJVF9QR0kgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIEdMX01BVF9TSElOSU5FU1NfQklUX1BHSSAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIEdMX01BVF9TUEVDVUxBUl9CSVRfUEdJICAgICAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIEdMX05PUk1BTF9CSVRfUEdJICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIEdMX1RFWENPT1JEMV9CSVRfUEdJICAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIEdMX1RFWENPT1JEMl9CSVRfUEdJICAgICAgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIEdMX1RFWENPT1JEM19CSVRfUEdJICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIEdMX1RFWENPT1JENF9CSVRfUEdJICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIEdMX1ZFUlRFWDIzX0JJVF9QR0kgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEdMX1ZFUlRFWDRfQklUX1BHSSAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZW5kaWYKKworI2lmbmRlZiBHTF9QR0lfbWlzY19oaW50cworI2RlZmluZSBHTF9QUkVGRVJfRE9VQkxFQlVGRkVSX0hJTlRfUEdJICAgMHgxQTFGOAorI2RlZmluZSBHTF9DT05TRVJWRV9NRU1PUllfSElOVF9QR0kgICAgICAgMHgxQTFGRAorI2RlZmluZSBHTF9SRUNMQUlNX01FTU9SWV9ISU5UX1BHSSAgICAgICAgMHgxQTFGRQorI2RlZmluZSBHTF9OQVRJVkVfR1JBUEhJQ1NfSEFORExFX1BHSSAgICAgMHgxQTIwMgorI2RlZmluZSBHTF9OQVRJVkVfR1JBUEhJQ1NfQkVHSU5fSElOVF9QR0kgMHgxQTIwMworI2RlZmluZSBHTF9OQVRJVkVfR1JBUEhJQ1NfRU5EX0hJTlRfUEdJICAgMHgxQTIwNAorI2RlZmluZSBHTF9BTFdBWVNfRkFTVF9ISU5UX1BHSSAgICAgICAgICAgMHgxQTIwQworI2RlZmluZSBHTF9BTFdBWVNfU09GVF9ISU5UX1BHSSAgICAgICAgICAgMHgxQTIwRAorI2RlZmluZSBHTF9BTExPV19EUkFXX09CSl9ISU5UX1BHSSAgICAgICAgMHgxQTIwRQorI2RlZmluZSBHTF9BTExPV19EUkFXX1dJTl9ISU5UX1BHSSAgICAgICAgMHgxQTIwRgorI2RlZmluZSBHTF9BTExPV19EUkFXX0ZSR19ISU5UX1BHSSAgICAgICAgMHgxQTIxMAorI2RlZmluZSBHTF9BTExPV19EUkFXX01FTV9ISU5UX1BHSSAgICAgICAgMHgxQTIxMQorI2RlZmluZSBHTF9TVFJJQ1RfREVQVEhGVU5DX0hJTlRfUEdJICAgICAgMHgxQTIxNgorI2RlZmluZSBHTF9TVFJJQ1RfTElHSFRJTkdfSElOVF9QR0kgICAgICAgMHgxQTIxNworI2RlZmluZSBHTF9TVFJJQ1RfU0NJU1NPUl9ISU5UX1BHSSAgICAgICAgMHgxQTIxOAorI2RlZmluZSBHTF9GVUxMX1NUSVBQTEVfSElOVF9QR0kgICAgICAgICAgMHgxQTIxOQorI2RlZmluZSBHTF9DTElQX05FQVJfSElOVF9QR0kgICAgICAgICAgICAgMHgxQTIyMAorI2RlZmluZSBHTF9DTElQX0ZBUl9ISU5UX1BHSSAgICAgICAgICAgICAgMHgxQTIyMQorI2RlZmluZSBHTF9XSURFX0xJTkVfSElOVF9QR0kgICAgICAgICAgICAgMHgxQTIyMgorI2RlZmluZSBHTF9CQUNLX05PUk1BTFNfSElOVF9QR0kgICAgICAgICAgMHgxQTIyMworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3BhbGV0dGVkX3RleHR1cmUKKyNkZWZpbmUgR0xfQ09MT1JfSU5ERVgxX0VYVCAgICAgICAgICAgICAgIDB4ODBFMgorI2RlZmluZSBHTF9DT0xPUl9JTkRFWDJfRVhUICAgICAgICAgICAgICAgMHg4MEUzCisjZGVmaW5lIEdMX0NPTE9SX0lOREVYNF9FWFQgICAgICAgICAgICAgICAweDgwRTQKKyNkZWZpbmUgR0xfQ09MT1JfSU5ERVg4X0VYVCAgICAgICAgICAgICAgIDB4ODBFNQorI2RlZmluZSBHTF9DT0xPUl9JTkRFWDEyX0VYVCAgICAgICAgICAgICAgMHg4MEU2CisjZGVmaW5lIEdMX0NPTE9SX0lOREVYMTZfRVhUICAgICAgICAgICAgICAweDgwRTcKKyNkZWZpbmUgR0xfVEVYVFVSRV9JTkRFWF9TSVpFX0VYVCAgICAgICAgIDB4ODBFRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2NsaXBfdm9sdW1lX2hpbnQKKyNkZWZpbmUgR0xfQ0xJUF9WT0xVTUVfQ0xJUFBJTkdfSElOVF9FWFQgIDB4ODBGMAorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9saXN0X3ByaW9yaXR5CisjZGVmaW5lIEdMX0xJU1RfUFJJT1JJVFlfU0dJWCAgICAgICAgICAgICAweDgxODIKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfaXJfaW5zdHJ1bWVudDEKKyNkZWZpbmUgR0xfSVJfSU5TVFJVTUVOVDFfU0dJWCAgICAgICAgICAgIDB4ODE3RgorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9jYWxsaWdyYXBoaWNfZnJhZ21lbnQKKyNkZWZpbmUgR0xfQ0FMTElHUkFQSElDX0ZSQUdNRU5UX1NHSVggICAgIDB4ODE4MworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF90ZXh0dXJlX2xvZF9iaWFzCisjZGVmaW5lIEdMX1RFWFRVUkVfTE9EX0JJQVNfU19TR0lYICAgICAgICAweDgxOEUKKyNkZWZpbmUgR0xfVEVYVFVSRV9MT0RfQklBU19UX1NHSVggICAgICAgIDB4ODE4RgorI2RlZmluZSBHTF9URVhUVVJFX0xPRF9CSUFTX1JfU0dJWCAgICAgICAgMHg4MTkwCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3NoYWRvd19hbWJpZW50CisjZGVmaW5lIEdMX1NIQURPV19BTUJJRU5UX1NHSVggICAgICAgICAgICAweDgwQkYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9pbmRleF90ZXh0dXJlCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfaW5kZXhfbWF0ZXJpYWwKKyNkZWZpbmUgR0xfSU5ERVhfTUFURVJJQUxfRVhUICAgICAgICAgICAgIDB4ODFCOAorI2RlZmluZSBHTF9JTkRFWF9NQVRFUklBTF9QQVJBTUVURVJfRVhUICAgMHg4MUI5CisjZGVmaW5lIEdMX0lOREVYX01BVEVSSUFMX0ZBQ0VfRVhUICAgICAgICAweDgxQkEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9pbmRleF9mdW5jCisjZGVmaW5lIEdMX0lOREVYX1RFU1RfRVhUICAgICAgICAgICAgICAgICAweDgxQjUKKyNkZWZpbmUgR0xfSU5ERVhfVEVTVF9GVU5DX0VYVCAgICAgICAgICAgIDB4ODFCNgorI2RlZmluZSBHTF9JTkRFWF9URVNUX1JFRl9FWFQgICAgICAgICAgICAgMHg4MUI3CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfaW5kZXhfYXJyYXlfZm9ybWF0cworI2RlZmluZSBHTF9JVUlfVjJGX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MUFECisjZGVmaW5lIEdMX0lVSV9WM0ZfRVhUICAgICAgICAgICAgICAgICAgICAweDgxQUUKKyNkZWZpbmUgR0xfSVVJX04zRl9WMkZfRVhUICAgICAgICAgICAgICAgIDB4ODFBRgorI2RlZmluZSBHTF9JVUlfTjNGX1YzRl9FWFQgICAgICAgICAgICAgICAgMHg4MUIwCisjZGVmaW5lIEdMX1QyRl9JVUlfVjJGX0VYVCAgICAgICAgICAgICAgICAweDgxQjEKKyNkZWZpbmUgR0xfVDJGX0lVSV9WM0ZfRVhUICAgICAgICAgICAgICAgIDB4ODFCMgorI2RlZmluZSBHTF9UMkZfSVVJX04zRl9WMkZfRVhUICAgICAgICAgICAgMHg4MUIzCisjZGVmaW5lIEdMX1QyRl9JVUlfTjNGX1YzRl9FWFQgICAgICAgICAgICAweDgxQjQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9jb21waWxlZF92ZXJ0ZXhfYXJyYXkKKyNkZWZpbmUgR0xfQVJSQVlfRUxFTUVOVF9MT0NLX0ZJUlNUX0VYVCAgIDB4ODFBOAorI2RlZmluZSBHTF9BUlJBWV9FTEVNRU5UX0xPQ0tfQ09VTlRfRVhUICAgMHg4MUE5CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY3VsbF92ZXJ0ZXgKKyNkZWZpbmUgR0xfQ1VMTF9WRVJURVhfRVhUICAgICAgICAgICAgICAgIDB4ODFBQQorI2RlZmluZSBHTF9DVUxMX1ZFUlRFWF9FWUVfUE9TSVRJT05fRVhUICAgMHg4MUFCCisjZGVmaW5lIEdMX0NVTExfVkVSVEVYX09CSkVDVF9QT1NJVElPTl9FWFQgMHg4MUFDCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3ljcmNiCisjZGVmaW5lIEdMX1lDUkNCXzQyMl9TR0lYICAgICAgICAgICAgICAgICAweDgxQkIKKyNkZWZpbmUgR0xfWUNSQ0JfNDQ0X1NHSVggICAgICAgICAgICAgICAgIDB4ODFCQworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9mcmFnbWVudF9saWdodGluZworI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVElOR19TR0lYICAgICAgICAgMHg4NDAwCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0NPTE9SX01BVEVSSUFMX1NHSVggICAweDg0MDEKKyNkZWZpbmUgR0xfRlJBR01FTlRfQ09MT1JfTUFURVJJQUxfRkFDRV9TR0lYIDB4ODQwMgorI2RlZmluZSBHTF9GUkFHTUVOVF9DT0xPUl9NQVRFUklBTF9QQVJBTUVURVJfU0dJWCAweDg0MDMKKyNkZWZpbmUgR0xfTUFYX0ZSQUdNRU5UX0xJR0hUU19TR0lYICAgICAgIDB4ODQwNAorI2RlZmluZSBHTF9NQVhfQUNUSVZFX0xJR0hUU19TR0lYICAgICAgICAgMHg4NDA1CisjZGVmaW5lIEdMX0NVUlJFTlRfUkFTVEVSX05PUk1BTF9TR0lYICAgICAweDg0MDYKKyNkZWZpbmUgR0xfTElHSFRfRU5WX01PREVfU0dJWCAgICAgICAgICAgIDB4ODQwNworI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVF9NT0RFTF9MT0NBTF9WSUVXRVJfU0dJWCAweDg0MDgKKyNkZWZpbmUgR0xfRlJBR01FTlRfTElHSFRfTU9ERUxfVFdPX1NJREVfU0dJWCAweDg0MDkKKyNkZWZpbmUgR0xfRlJBR01FTlRfTElHSFRfTU9ERUxfQU1CSUVOVF9TR0lYIDB4ODQwQQorI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVF9NT0RFTF9OT1JNQUxfSU5URVJQT0xBVElPTl9TR0lYIDB4ODQwQgorI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVDBfU0dJWCAgICAgICAgICAgMHg4NDBDCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUMV9TR0lYICAgICAgICAgICAweDg0MEQKKyNkZWZpbmUgR0xfRlJBR01FTlRfTElHSFQyX1NHSVggICAgICAgICAgIDB4ODQwRQorI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVDNfU0dJWCAgICAgICAgICAgMHg4NDBGCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUNF9TR0lYICAgICAgICAgICAweDg0MTAKKyNkZWZpbmUgR0xfRlJBR01FTlRfTElHSFQ1X1NHSVggICAgICAgICAgIDB4ODQxMQorI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVDZfU0dJWCAgICAgICAgICAgMHg4NDEyCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUN19TR0lYICAgICAgICAgICAweDg0MTMKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lCTV9yYXN0ZXJwb3NfY2xpcAorI2RlZmluZSBHTF9SQVNURVJfUE9TSVRJT05fVU5DTElQUEVEX0lCTSAgMHgxOTI2MgorI2VuZGlmCisKKyNpZm5kZWYgR0xfSFBfdGV4dHVyZV9saWdodGluZworI2RlZmluZSBHTF9URVhUVVJFX0xJR0hUSU5HX01PREVfSFAgICAgICAgMHg4MTY3CisjZGVmaW5lIEdMX1RFWFRVUkVfUE9TVF9TUEVDVUxBUl9IUCAgICAgICAweDgxNjgKKyNkZWZpbmUgR0xfVEVYVFVSRV9QUkVfU1BFQ1VMQVJfSFAgICAgICAgIDB4ODE2OQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2RyYXdfcmFuZ2VfZWxlbWVudHMKKyNkZWZpbmUgR0xfTUFYX0VMRU1FTlRTX1ZFUlRJQ0VTX0VYVCAgICAgIDB4ODBFOAorI2RlZmluZSBHTF9NQVhfRUxFTUVOVFNfSU5ESUNFU19FWFQgICAgICAgMHg4MEU5CisjZW5kaWYKKworI2lmbmRlZiBHTF9XSU5fcGhvbmdfc2hhZGluZworI2RlZmluZSBHTF9QSE9OR19XSU4gICAgICAgICAgICAgICAgICAgICAgMHg4MEVBCisjZGVmaW5lIEdMX1BIT05HX0hJTlRfV0lOICAgICAgICAgICAgICAgICAweDgwRUIKKyNlbmRpZgorCisjaWZuZGVmIEdMX1dJTl9zcGVjdWxhcl9mb2cKKyNkZWZpbmUgR0xfRk9HX1NQRUNVTEFSX1RFWFRVUkVfV0lOICAgICAgIDB4ODBFQworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2xpZ2h0X3RleHR1cmUKKyNkZWZpbmUgR0xfRlJBR01FTlRfTUFURVJJQUxfRVhUICAgICAgICAgIDB4ODM0OQorI2RlZmluZSBHTF9GUkFHTUVOVF9OT1JNQUxfRVhUICAgICAgICAgICAgMHg4MzRBCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0NPTE9SX0VYVCAgICAgICAgICAgICAweDgzNEMKKyNkZWZpbmUgR0xfQVRURU5VQVRJT05fRVhUICAgICAgICAgICAgICAgIDB4ODM0RAorI2RlZmluZSBHTF9TSEFET1dfQVRURU5VQVRJT05fRVhUICAgICAgICAgMHg4MzRFCisjZGVmaW5lIEdMX1RFWFRVUkVfQVBQTElDQVRJT05fTU9ERV9FWFQgICAweDgzNEYKKyNkZWZpbmUgR0xfVEVYVFVSRV9MSUdIVF9FWFQgICAgICAgICAgICAgIDB4ODM1MAorI2RlZmluZSBHTF9URVhUVVJFX01BVEVSSUFMX0ZBQ0VfRVhUICAgICAgMHg4MzUxCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFURVJJQUxfUEFSQU1FVEVSX0VYVCAweDgzNTIKKy8qIHJldXNlIEdMX0ZSQUdNRU5UX0RFUFRIX0VYVCAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9ibGVuZF9hbHBoYV9taW5tYXgKKyNkZWZpbmUgR0xfQUxQSEFfTUlOX1NHSVggICAgICAgICAgICAgICAgIDB4ODMyMAorI2RlZmluZSBHTF9BTFBIQV9NQVhfU0dJWCAgICAgICAgICAgICAgICAgMHg4MzIxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2ltcGFjdF9waXhlbF90ZXh0dXJlCisjZGVmaW5lIEdMX1BJWEVMX1RFWF9HRU5fUV9DRUlMSU5HX1NHSVggICAweDgxODQKKyNkZWZpbmUgR0xfUElYRUxfVEVYX0dFTl9RX1JPVU5EX1NHSVggICAgIDB4ODE4NQorI2RlZmluZSBHTF9QSVhFTF9URVhfR0VOX1FfRkxPT1JfU0dJWCAgICAgMHg4MTg2CisjZGVmaW5lIEdMX1BJWEVMX1RFWF9HRU5fQUxQSEFfUkVQTEFDRV9TR0lYIDB4ODE4NworI2RlZmluZSBHTF9QSVhFTF9URVhfR0VOX0FMUEhBX05PX1JFUExBQ0VfU0dJWCAweDgxODgKKyNkZWZpbmUgR0xfUElYRUxfVEVYX0dFTl9BTFBIQV9MU19TR0lYICAgIDB4ODE4OQorI2RlZmluZSBHTF9QSVhFTF9URVhfR0VOX0FMUEhBX01TX1NHSVggICAgMHg4MThBCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmdyYQorI2RlZmluZSBHTF9CR1JfRVhUICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEUwCisjZGVmaW5lIEdMX0JHUkFfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDgwRTEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfYXN5bmMKKyNkZWZpbmUgR0xfQVNZTkNfTUFSS0VSX1NHSVggICAgICAgICAgICAgIDB4ODMyOQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9hc3luY19waXhlbAorI2RlZmluZSBHTF9BU1lOQ19URVhfSU1BR0VfU0dJWCAgICAgICAgICAgMHg4MzVDCisjZGVmaW5lIEdMX0FTWU5DX0RSQVdfUElYRUxTX1NHSVggICAgICAgICAweDgzNUQKKyNkZWZpbmUgR0xfQVNZTkNfUkVBRF9QSVhFTFNfU0dJWCAgICAgICAgIDB4ODM1RQorI2RlZmluZSBHTF9NQVhfQVNZTkNfVEVYX0lNQUdFX1NHSVggICAgICAgMHg4MzVGCisjZGVmaW5lIEdMX01BWF9BU1lOQ19EUkFXX1BJWEVMU19TR0lYICAgICAweDgzNjAKKyNkZWZpbmUgR0xfTUFYX0FTWU5DX1JFQURfUElYRUxTX1NHSVggICAgIDB4ODM2MQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9hc3luY19oaXN0b2dyYW0KKyNkZWZpbmUgR0xfQVNZTkNfSElTVE9HUkFNX1NHSVggICAgICAgICAgIDB4ODMyQworI2RlZmluZSBHTF9NQVhfQVNZTkNfSElTVE9HUkFNX1NHSVggICAgICAgMHg4MzJECisjZW5kaWYKKworI2lmbmRlZiBHTF9JTlRFTF90ZXh0dXJlX3NjaXNzb3IKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lOVEVMX3BhcmFsbGVsX2FycmF5cworI2RlZmluZSBHTF9QQVJBTExFTF9BUlJBWVNfSU5URUwgICAgICAgICAgMHg4M0Y0CisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9QQVJBTExFTF9QT0lOVEVSU19JTlRFTCAweDgzRjUKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX1BBUkFMTEVMX1BPSU5URVJTX0lOVEVMIDB4ODNGNgorI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9QQVJBTExFTF9QT0lOVEVSU19JTlRFTCAweDgzRjcKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9QQVJBTExFTF9QT0lOVEVSU19JTlRFTCAweDgzRjgKKyNlbmRpZgorCisjaWZuZGVmIEdMX0hQX29jY2x1c2lvbl90ZXN0CisjZGVmaW5lIEdMX09DQ0xVU0lPTl9URVNUX0hQICAgICAgICAgICAgICAweDgxNjUKKyNkZWZpbmUgR0xfT0NDTFVTSU9OX1RFU1RfUkVTVUxUX0hQICAgICAgIDB4ODE2NgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3BpeGVsX3RyYW5zZm9ybQorI2RlZmluZSBHTF9QSVhFTF9UUkFOU0ZPUk1fMkRfRVhUICAgICAgICAgMHg4MzMwCisjZGVmaW5lIEdMX1BJWEVMX01BR19GSUxURVJfRVhUICAgICAgICAgICAweDgzMzEKKyNkZWZpbmUgR0xfUElYRUxfTUlOX0ZJTFRFUl9FWFQgICAgICAgICAgIDB4ODMzMgorI2RlZmluZSBHTF9QSVhFTF9DVUJJQ19XRUlHSFRfRVhUICAgICAgICAgMHg4MzMzCisjZGVmaW5lIEdMX0NVQklDX0VYVCAgICAgICAgICAgICAgICAgICAgICAweDgzMzQKKyNkZWZpbmUgR0xfQVZFUkFHRV9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODMzNQorI2RlZmluZSBHTF9QSVhFTF9UUkFOU0ZPUk1fMkRfU1RBQ0tfREVQVEhfRVhUIDB4ODMzNgorI2RlZmluZSBHTF9NQVhfUElYRUxfVFJBTlNGT1JNXzJEX1NUQUNLX0RFUFRIX0VYVCAweDgzMzcKKyNkZWZpbmUgR0xfUElYRUxfVFJBTlNGT1JNXzJEX01BVFJJWF9FWFQgIDB4ODMzOAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3BpeGVsX3RyYW5zZm9ybV9jb2xvcl90YWJsZQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3NoYXJlZF90ZXh0dXJlX3BhbGV0dGUKKyNkZWZpbmUgR0xfU0hBUkVEX1RFWFRVUkVfUEFMRVRURV9FWFQgICAgIDB4ODFGQgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3NlcGFyYXRlX3NwZWN1bGFyX2NvbG9yCisjZGVmaW5lIEdMX0xJR0hUX01PREVMX0NPTE9SX0NPTlRST0xfRVhUICAweDgxRjgKKyNkZWZpbmUgR0xfU0lOR0xFX0NPTE9SX0VYVCAgICAgICAgICAgICAgIDB4ODFGOQorI2RlZmluZSBHTF9TRVBBUkFURV9TUEVDVUxBUl9DT0xPUl9FWFQgICAgMHg4MUZBCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc2Vjb25kYXJ5X2NvbG9yCisjZGVmaW5lIEdMX0NPTE9SX1NVTV9FWFQgICAgICAgICAgICAgICAgICAweDg0NTgKKyNkZWZpbmUgR0xfQ1VSUkVOVF9TRUNPTkRBUllfQ09MT1JfRVhUICAgIDB4ODQ1OQorI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfU0laRV9FWFQgMHg4NDVBCisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9UWVBFX0VYVCAweDg0NUIKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX1NUUklERV9FWFQgMHg4NDVDCisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9QT0lOVEVSX0VYVCAweDg0NUQKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX0VYVCAgICAgIDB4ODQ1RQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfcGVydHVyYl9ub3JtYWwKKyNkZWZpbmUgR0xfUEVSVFVSQl9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODVBRQorI2RlZmluZSBHTF9URVhUVVJFX05PUk1BTF9FWFQgICAgICAgICAgICAgMHg4NUFGCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfbXVsdGlfZHJhd19hcnJheXMKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9mb2dfY29vcmQKKyNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFX0VYVCAgICAgIDB4ODQ1MAorI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9FWFQgICAgICAgICAgICAgMHg4NDUxCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0RFUFRIX0VYVCAgICAgICAgICAgICAweDg0NTIKKyNkZWZpbmUgR0xfQ1VSUkVOVF9GT0dfQ09PUkRJTkFURV9FWFQgICAgIDB4ODQ1MworI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9UWVBFX0VYVCAgMHg4NDU0CisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX1NUUklERV9FWFQgMHg4NDU1CisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX1BPSU5URVJfRVhUIDB4ODQ1NgorI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9FWFQgICAgICAgMHg4NDU3CisjZW5kaWYKKworI2lmbmRlZiBHTF9SRU5EX3NjcmVlbl9jb29yZGluYXRlcworI2RlZmluZSBHTF9TQ1JFRU5fQ09PUkRJTkFURVNfUkVORCAgICAgICAgMHg4NDkwCisjZGVmaW5lIEdMX0lOVkVSVEVEX1NDUkVFTl9XX1JFTkQgICAgICAgICAweDg0OTEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9jb29yZGluYXRlX2ZyYW1lCisjZGVmaW5lIEdMX1RBTkdFTlRfQVJSQVlfRVhUICAgICAgICAgICAgICAweDg0MzkKKyNkZWZpbmUgR0xfQklOT1JNQUxfQVJSQVlfRVhUICAgICAgICAgICAgIDB4ODQzQQorI2RlZmluZSBHTF9DVVJSRU5UX1RBTkdFTlRfRVhUICAgICAgICAgICAgMHg4NDNCCisjZGVmaW5lIEdMX0NVUlJFTlRfQklOT1JNQUxfRVhUICAgICAgICAgICAweDg0M0MKKyNkZWZpbmUgR0xfVEFOR0VOVF9BUlJBWV9UWVBFX0VYVCAgICAgICAgIDB4ODQzRQorI2RlZmluZSBHTF9UQU5HRU5UX0FSUkFZX1NUUklERV9FWFQgICAgICAgMHg4NDNGCisjZGVmaW5lIEdMX0JJTk9STUFMX0FSUkFZX1RZUEVfRVhUICAgICAgICAweDg0NDAKKyNkZWZpbmUgR0xfQklOT1JNQUxfQVJSQVlfU1RSSURFX0VYVCAgICAgIDB4ODQ0MQorI2RlZmluZSBHTF9UQU5HRU5UX0FSUkFZX1BPSU5URVJfRVhUICAgICAgMHg4NDQyCisjZGVmaW5lIEdMX0JJTk9STUFMX0FSUkFZX1BPSU5URVJfRVhUICAgICAweDg0NDMKKyNkZWZpbmUgR0xfTUFQMV9UQU5HRU5UX0VYVCAgICAgICAgICAgICAgIDB4ODQ0NAorI2RlZmluZSBHTF9NQVAyX1RBTkdFTlRfRVhUICAgICAgICAgICAgICAgMHg4NDQ1CisjZGVmaW5lIEdMX01BUDFfQklOT1JNQUxfRVhUICAgICAgICAgICAgICAweDg0NDYKKyNkZWZpbmUgR0xfTUFQMl9CSU5PUk1BTF9FWFQgICAgICAgICAgICAgIDB4ODQ0NworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZW52X2NvbWJpbmUKKyNkZWZpbmUgR0xfQ09NQklORV9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODU3MAorI2RlZmluZSBHTF9DT01CSU5FX1JHQl9FWFQgICAgICAgICAgICAgICAgMHg4NTcxCisjZGVmaW5lIEdMX0NPTUJJTkVfQUxQSEFfRVhUICAgICAgICAgICAgICAweDg1NzIKKyNkZWZpbmUgR0xfUkdCX1NDQUxFX0VYVCAgICAgICAgICAgICAgICAgIDB4ODU3MworI2RlZmluZSBHTF9BRERfU0lHTkVEX0VYVCAgICAgICAgICAgICAgICAgMHg4NTc0CisjZGVmaW5lIEdMX0lOVEVSUE9MQVRFX0VYVCAgICAgICAgICAgICAgICAweDg1NzUKKyNkZWZpbmUgR0xfQ09OU1RBTlRfRVhUICAgICAgICAgICAgICAgICAgIDB4ODU3NgorI2RlZmluZSBHTF9QUklNQVJZX0NPTE9SX0VYVCAgICAgICAgICAgICAgMHg4NTc3CisjZGVmaW5lIEdMX1BSRVZJT1VTX0VYVCAgICAgICAgICAgICAgICAgICAweDg1NzgKKyNkZWZpbmUgR0xfU09VUkNFMF9SR0JfRVhUICAgICAgICAgICAgICAgIDB4ODU4MAorI2RlZmluZSBHTF9TT1VSQ0UxX1JHQl9FWFQgICAgICAgICAgICAgICAgMHg4NTgxCisjZGVmaW5lIEdMX1NPVVJDRTJfUkdCX0VYVCAgICAgICAgICAgICAgICAweDg1ODIKKyNkZWZpbmUgR0xfU09VUkNFMF9BTFBIQV9FWFQgICAgICAgICAgICAgIDB4ODU4OAorI2RlZmluZSBHTF9TT1VSQ0UxX0FMUEhBX0VYVCAgICAgICAgICAgICAgMHg4NTg5CisjZGVmaW5lIEdMX1NPVVJDRTJfQUxQSEFfRVhUICAgICAgICAgICAgICAweDg1OEEKKyNkZWZpbmUgR0xfT1BFUkFORDBfUkdCX0VYVCAgICAgICAgICAgICAgIDB4ODU5MAorI2RlZmluZSBHTF9PUEVSQU5EMV9SR0JfRVhUICAgICAgICAgICAgICAgMHg4NTkxCisjZGVmaW5lIEdMX09QRVJBTkQyX1JHQl9FWFQgICAgICAgICAgICAgICAweDg1OTIKKyNkZWZpbmUgR0xfT1BFUkFORDBfQUxQSEFfRVhUICAgICAgICAgICAgIDB4ODU5OAorI2RlZmluZSBHTF9PUEVSQU5EMV9BTFBIQV9FWFQgICAgICAgICAgICAgMHg4NTk5CisjZGVmaW5lIEdMX09QRVJBTkQyX0FMUEhBX0VYVCAgICAgICAgICAgICAweDg1OUEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX3NwZWN1bGFyX3ZlY3RvcgorI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9TUEVDVUxBUl9WRUNUT1JfQVBQTEUgMHg4NUIwCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV90cmFuc2Zvcm1faGludAorI2RlZmluZSBHTF9UUkFOU0ZPUk1fSElOVF9BUFBMRSAgICAgICAgICAgMHg4NUIxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2ZvZ19zY2FsZQorI2RlZmluZSBHTF9GT0dfU0NBTEVfU0dJWCAgICAgICAgICAgICAgICAgMHg4MUZDCisjZGVmaW5lIEdMX0ZPR19TQ0FMRV9WQUxVRV9TR0lYICAgICAgICAgICAweDgxRkQKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NVTlhfY29uc3RhbnRfZGF0YQorI2RlZmluZSBHTF9VTlBBQ0tfQ09OU1RBTlRfREFUQV9TVU5YICAgICAgMHg4MUQ1CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09OU1RBTlRfREFUQV9TVU5YICAgICAweDgxRDYKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NVTl9nbG9iYWxfYWxwaGEKKyNkZWZpbmUgR0xfR0xPQkFMX0FMUEhBX1NVTiAgICAgICAgICAgICAgIDB4ODFEOQorI2RlZmluZSBHTF9HTE9CQUxfQUxQSEFfRkFDVE9SX1NVTiAgICAgICAgMHg4MURBCisjZW5kaWYKKworI2lmbmRlZiBHTF9TVU5fdHJpYW5nbGVfbGlzdAorI2RlZmluZSBHTF9SRVNUQVJUX1NVTiAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEdMX1JFUExBQ0VfTUlERExFX1NVTiAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgR0xfUkVQTEFDRV9PTERFU1RfU1VOICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBHTF9UUklBTkdMRV9MSVNUX1NVTiAgICAgICAgICAgICAgMHg4MUQ3CisjZGVmaW5lIEdMX1JFUExBQ0VNRU5UX0NPREVfU1VOICAgICAgICAgICAweDgxRDgKKyNkZWZpbmUgR0xfUkVQTEFDRU1FTlRfQ09ERV9BUlJBWV9TVU4gICAgIDB4ODVDMAorI2RlZmluZSBHTF9SRVBMQUNFTUVOVF9DT0RFX0FSUkFZX1RZUEVfU1VOIDB4ODVDMQorI2RlZmluZSBHTF9SRVBMQUNFTUVOVF9DT0RFX0FSUkFZX1NUUklERV9TVU4gMHg4NUMyCisjZGVmaW5lIEdMX1JFUExBQ0VNRU5UX0NPREVfQVJSQVlfUE9JTlRFUl9TVU4gMHg4NUMzCisjZGVmaW5lIEdMX1IxVUlfVjNGX1NVTiAgICAgICAgICAgICAgICAgICAweDg1QzQKKyNkZWZpbmUgR0xfUjFVSV9DNFVCX1YzRl9TVU4gICAgICAgICAgICAgIDB4ODVDNQorI2RlZmluZSBHTF9SMVVJX0MzRl9WM0ZfU1VOICAgICAgICAgICAgICAgMHg4NUM2CisjZGVmaW5lIEdMX1IxVUlfTjNGX1YzRl9TVU4gICAgICAgICAgICAgICAweDg1QzcKKyNkZWZpbmUgR0xfUjFVSV9DNEZfTjNGX1YzRl9TVU4gICAgICAgICAgIDB4ODVDOAorI2RlZmluZSBHTF9SMVVJX1QyRl9WM0ZfU1VOICAgICAgICAgICAgICAgMHg4NUM5CisjZGVmaW5lIEdMX1IxVUlfVDJGX04zRl9WM0ZfU1VOICAgICAgICAgICAweDg1Q0EKKyNkZWZpbmUgR0xfUjFVSV9UMkZfQzRGX04zRl9WM0ZfU1VOICAgICAgIDB4ODVDQgorI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOX3ZlcnRleAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2JsZW5kX2Z1bmNfc2VwYXJhdGUKKyNkZWZpbmUgR0xfQkxFTkRfRFNUX1JHQl9FWFQgICAgICAgICAgICAgIDB4ODBDOAorI2RlZmluZSBHTF9CTEVORF9TUkNfUkdCX0VYVCAgICAgICAgICAgICAgMHg4MEM5CisjZGVmaW5lIEdMX0JMRU5EX0RTVF9BTFBIQV9FWFQgICAgICAgICAgICAweDgwQ0EKKyNkZWZpbmUgR0xfQkxFTkRfU1JDX0FMUEhBX0VYVCAgICAgICAgICAgIDB4ODBDQgorI2VuZGlmCisKKyNpZm5kZWYgR0xfSU5HUl9jb2xvcl9jbGFtcAorI2RlZmluZSBHTF9SRURfTUlOX0NMQU1QX0lOR1IgICAgICAgICAgICAgMHg4NTYwCisjZGVmaW5lIEdMX0dSRUVOX01JTl9DTEFNUF9JTkdSICAgICAgICAgICAweDg1NjEKKyNkZWZpbmUgR0xfQkxVRV9NSU5fQ0xBTVBfSU5HUiAgICAgICAgICAgIDB4ODU2MgorI2RlZmluZSBHTF9BTFBIQV9NSU5fQ0xBTVBfSU5HUiAgICAgICAgICAgMHg4NTYzCisjZGVmaW5lIEdMX1JFRF9NQVhfQ0xBTVBfSU5HUiAgICAgICAgICAgICAweDg1NjQKKyNkZWZpbmUgR0xfR1JFRU5fTUFYX0NMQU1QX0lOR1IgICAgICAgICAgIDB4ODU2NQorI2RlZmluZSBHTF9CTFVFX01BWF9DTEFNUF9JTkdSICAgICAgICAgICAgMHg4NTY2CisjZGVmaW5lIEdMX0FMUEhBX01BWF9DTEFNUF9JTkdSICAgICAgICAgICAweDg1NjcKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lOR1JfaW50ZXJsYWNlX3JlYWQKKyNkZWZpbmUgR0xfSU5URVJMQUNFX1JFQURfSU5HUiAgICAgICAgICAgIDB4ODU2OAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3N0ZW5jaWxfd3JhcAorI2RlZmluZSBHTF9JTkNSX1dSQVBfRVhUICAgICAgICAgICAgICAgICAgMHg4NTA3CisjZGVmaW5lIEdMX0RFQ1JfV1JBUF9FWFQgICAgICAgICAgICAgICAgICAweDg1MDgKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF80MjJfcGl4ZWxzCisjZGVmaW5lIEdMXzQyMl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAweDgwQ0MKKyNkZWZpbmUgR0xfNDIyX1JFVl9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODBDRAorI2RlZmluZSBHTF80MjJfQVZFUkFHRV9FWFQgICAgICAgICAgICAgICAgMHg4MENFCisjZGVmaW5lIEdMXzQyMl9SRVZfQVZFUkFHRV9FWFQgICAgICAgICAgICAweDgwQ0YKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleGdlbl9yZWZsZWN0aW9uCisjZGVmaW5lIEdMX05PUk1BTF9NQVBfTlYgICAgICAgICAgICAgICAgICAweDg1MTEKKyNkZWZpbmUgR0xfUkVGTEVDVElPTl9NQVBfTlYgICAgICAgICAgICAgIDB4ODUxMgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfY3ViZV9tYXAKKyNkZWZpbmUgR0xfTk9STUFMX01BUF9FWFQgICAgICAgICAgICAgICAgIDB4ODUxMQorI2RlZmluZSBHTF9SRUZMRUNUSU9OX01BUF9FWFQgICAgICAgICAgICAgMHg4NTEyCisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfRVhUICAgICAgICAgICAweDg1MTMKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQX0VYVCAgIDB4ODUxNAorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1hfRVhUIDB4ODUxNQorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1hfRVhUIDB4ODUxNgorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1lfRVhUIDB4ODUxNworI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1lfRVhUIDB4ODUxOAorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1pfRVhUIDB4ODUxOQorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1pfRVhUIDB4ODUxQQorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFX0NVQkVfTUFQX0VYVCAgICAgMHg4NTFCCisjZGVmaW5lIEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkVfRVhUICAweDg1MUMKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NVTl9jb252b2x1dGlvbl9ib3JkZXJfbW9kZXMKKyNkZWZpbmUgR0xfV1JBUF9CT1JERVJfU1VOICAgICAgICAgICAgICAgIDB4ODFENAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZW52X2FkZAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfbG9kX2JpYXMKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfTE9EX0JJQVNfRVhUICAgICAgIDB4ODRGRAorI2RlZmluZSBHTF9URVhUVVJFX0ZJTFRFUl9DT05UUk9MX0VYVCAgICAgMHg4NTAwCisjZGVmaW5lIEdMX1RFWFRVUkVfTE9EX0JJQVNfRVhUICAgICAgICAgICAweDg1MDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYworI2RlZmluZSBHTF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCAgICAgMHg4NEZFCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCAweDg0RkYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF92ZXJ0ZXhfd2VpZ2h0aW5nCisjZGVmaW5lIEdMX01PREVMVklFVzBfU1RBQ0tfREVQVEhfRVhUICAgICBHTF9NT0RFTFZJRVdfU1RBQ0tfREVQVEgKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMV9TVEFDS19ERVBUSF9FWFQgICAgIDB4ODUwMgorI2RlZmluZSBHTF9NT0RFTFZJRVcwX01BVFJJWF9FWFQgICAgICAgICAgR0xfTU9ERUxWSUVXX01BVFJJWAorI2RlZmluZSBHTF9NT0RFTFZJRVcxX01BVFJJWF9FWFQgICAgICAgICAgMHg4NTA2CisjZGVmaW5lIEdMX1ZFUlRFWF9XRUlHSFRJTkdfRVhUICAgICAgICAgICAweDg1MDkKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMF9FWFQgICAgICAgICAgICAgICAgIEdMX01PREVMVklFVworI2RlZmluZSBHTF9NT0RFTFZJRVcxX0VYVCAgICAgICAgICAgICAgICAgMHg4NTBBCisjZGVmaW5lIEdMX0NVUlJFTlRfVkVSVEVYX1dFSUdIVF9FWFQgICAgICAweDg1MEIKKyNkZWZpbmUgR0xfVkVSVEVYX1dFSUdIVF9BUlJBWV9FWFQgICAgICAgIDB4ODUwQworI2RlZmluZSBHTF9WRVJURVhfV0VJR0hUX0FSUkFZX1NJWkVfRVhUICAgMHg4NTBECisjZGVmaW5lIEdMX1ZFUlRFWF9XRUlHSFRfQVJSQVlfVFlQRV9FWFQgICAweDg1MEUKKyNkZWZpbmUgR0xfVkVSVEVYX1dFSUdIVF9BUlJBWV9TVFJJREVfRVhUIDB4ODUwRgorI2RlZmluZSBHTF9WRVJURVhfV0VJR0hUX0FSUkFZX1BPSU5URVJfRVhUIDB4ODUxMAorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfbGlnaHRfbWF4X2V4cG9uZW50CisjZGVmaW5lIEdMX01BWF9TSElOSU5FU1NfTlYgICAgICAgICAgICAgICAweDg1MDQKKyNkZWZpbmUgR0xfTUFYX1NQT1RfRVhQT05FTlRfTlYgICAgICAgICAgIDB4ODUwNQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X2FycmF5X3JhbmdlCisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9SQU5HRV9OViAgICAgICAgICAweDg1MUQKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1JBTkdFX0xFTkdUSF9OViAgIDB4ODUxRQorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUkFOR0VfVkFMSURfTlYgICAgMHg4NTFGCisjZGVmaW5lIEdMX01BWF9WRVJURVhfQVJSQVlfUkFOR0VfRUxFTUVOVF9OViAweDg1MjAKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1JBTkdFX1BPSU5URVJfTlYgIDB4ODUyMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfcmVnaXN0ZXJfY29tYmluZXJzCisjZGVmaW5lIEdMX1JFR0lTVEVSX0NPTUJJTkVSU19OViAgICAgICAgICAweDg1MjIKKyNkZWZpbmUgR0xfVkFSSUFCTEVfQV9OViAgICAgICAgICAgICAgICAgIDB4ODUyMworI2RlZmluZSBHTF9WQVJJQUJMRV9CX05WICAgICAgICAgICAgICAgICAgMHg4NTI0CisjZGVmaW5lIEdMX1ZBUklBQkxFX0NfTlYgICAgICAgICAgICAgICAgICAweDg1MjUKKyNkZWZpbmUgR0xfVkFSSUFCTEVfRF9OViAgICAgICAgICAgICAgICAgIDB4ODUyNgorI2RlZmluZSBHTF9WQVJJQUJMRV9FX05WICAgICAgICAgICAgICAgICAgMHg4NTI3CisjZGVmaW5lIEdMX1ZBUklBQkxFX0ZfTlYgICAgICAgICAgICAgICAgICAweDg1MjgKKyNkZWZpbmUgR0xfVkFSSUFCTEVfR19OViAgICAgICAgICAgICAgICAgIDB4ODUyOQorI2RlZmluZSBHTF9DT05TVEFOVF9DT0xPUjBfTlYgICAgICAgICAgICAgMHg4NTJBCisjZGVmaW5lIEdMX0NPTlNUQU5UX0NPTE9SMV9OViAgICAgICAgICAgICAweDg1MkIKKyNkZWZpbmUgR0xfUFJJTUFSWV9DT0xPUl9OViAgICAgICAgICAgICAgIDB4ODUyQworI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfTlYgICAgICAgICAgICAgMHg4NTJECisjZGVmaW5lIEdMX1NQQVJFMF9OViAgICAgICAgICAgICAgICAgICAgICAweDg1MkUKKyNkZWZpbmUgR0xfU1BBUkUxX05WICAgICAgICAgICAgICAgICAgICAgIDB4ODUyRgorI2RlZmluZSBHTF9ESVNDQVJEX05WICAgICAgICAgICAgICAgICAgICAgMHg4NTMwCisjZGVmaW5lIEdMX0VfVElNRVNfRl9OViAgICAgICAgICAgICAgICAgICAweDg1MzEKKyNkZWZpbmUgR0xfU1BBUkUwX1BMVVNfU0VDT05EQVJZX0NPTE9SX05WIDB4ODUzMgorI2RlZmluZSBHTF9VTlNJR05FRF9JREVOVElUWV9OViAgICAgICAgICAgMHg4NTM2CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVkVSVF9OViAgICAgICAgICAgICAweDg1MzcKKyNkZWZpbmUgR0xfRVhQQU5EX05PUk1BTF9OViAgICAgICAgICAgICAgIDB4ODUzOAorI2RlZmluZSBHTF9FWFBBTkRfTkVHQVRFX05WICAgICAgICAgICAgICAgMHg4NTM5CisjZGVmaW5lIEdMX0hBTEZfQklBU19OT1JNQUxfTlYgICAgICAgICAgICAweDg1M0EKKyNkZWZpbmUgR0xfSEFMRl9CSUFTX05FR0FURV9OViAgICAgICAgICAgIDB4ODUzQgorI2RlZmluZSBHTF9TSUdORURfSURFTlRJVFlfTlYgICAgICAgICAgICAgMHg4NTNDCisjZGVmaW5lIEdMX1NJR05FRF9ORUdBVEVfTlYgICAgICAgICAgICAgICAweDg1M0QKKyNkZWZpbmUgR0xfU0NBTEVfQllfVFdPX05WICAgICAgICAgICAgICAgIDB4ODUzRQorI2RlZmluZSBHTF9TQ0FMRV9CWV9GT1VSX05WICAgICAgICAgICAgICAgMHg4NTNGCisjZGVmaW5lIEdMX1NDQUxFX0JZX09ORV9IQUxGX05WICAgICAgICAgICAweDg1NDAKKyNkZWZpbmUgR0xfQklBU19CWV9ORUdBVElWRV9PTkVfSEFMRl9OViAgIDB4ODU0MQorI2RlZmluZSBHTF9DT01CSU5FUl9JTlBVVF9OViAgICAgICAgICAgICAgMHg4NTQyCisjZGVmaW5lIEdMX0NPTUJJTkVSX01BUFBJTkdfTlYgICAgICAgICAgICAweDg1NDMKKyNkZWZpbmUgR0xfQ09NQklORVJfQ09NUE9ORU5UX1VTQUdFX05WICAgIDB4ODU0NAorI2RlZmluZSBHTF9DT01CSU5FUl9BQl9ET1RfUFJPRFVDVF9OViAgICAgMHg4NTQ1CisjZGVmaW5lIEdMX0NPTUJJTkVSX0NEX0RPVF9QUk9EVUNUX05WICAgICAweDg1NDYKKyNkZWZpbmUgR0xfQ09NQklORVJfTVVYX1NVTV9OViAgICAgICAgICAgIDB4ODU0NworI2RlZmluZSBHTF9DT01CSU5FUl9TQ0FMRV9OViAgICAgICAgICAgICAgMHg4NTQ4CisjZGVmaW5lIEdMX0NPTUJJTkVSX0JJQVNfTlYgICAgICAgICAgICAgICAweDg1NDkKKyNkZWZpbmUgR0xfQ09NQklORVJfQUJfT1VUUFVUX05WICAgICAgICAgIDB4ODU0QQorI2RlZmluZSBHTF9DT01CSU5FUl9DRF9PVVRQVVRfTlYgICAgICAgICAgMHg4NTRCCisjZGVmaW5lIEdMX0NPTUJJTkVSX1NVTV9PVVRQVVRfTlYgICAgICAgICAweDg1NEMKKyNkZWZpbmUgR0xfTUFYX0dFTkVSQUxfQ09NQklORVJTX05WICAgICAgIDB4ODU0RAorI2RlZmluZSBHTF9OVU1fR0VORVJBTF9DT01CSU5FUlNfTlYgICAgICAgMHg4NTRFCisjZGVmaW5lIEdMX0NPTE9SX1NVTV9DTEFNUF9OViAgICAgICAgICAgICAweDg1NEYKKyNkZWZpbmUgR0xfQ09NQklORVIwX05WICAgICAgICAgICAgICAgICAgIDB4ODU1MAorI2RlZmluZSBHTF9DT01CSU5FUjFfTlYgICAgICAgICAgICAgICAgICAgMHg4NTUxCisjZGVmaW5lIEdMX0NPTUJJTkVSMl9OViAgICAgICAgICAgICAgICAgICAweDg1NTIKKyNkZWZpbmUgR0xfQ09NQklORVIzX05WICAgICAgICAgICAgICAgICAgIDB4ODU1MworI2RlZmluZSBHTF9DT01CSU5FUjRfTlYgICAgICAgICAgICAgICAgICAgMHg4NTU0CisjZGVmaW5lIEdMX0NPTUJJTkVSNV9OViAgICAgICAgICAgICAgICAgICAweDg1NTUKKyNkZWZpbmUgR0xfQ09NQklORVI2X05WICAgICAgICAgICAgICAgICAgIDB4ODU1NgorI2RlZmluZSBHTF9DT01CSU5FUjdfTlYgICAgICAgICAgICAgICAgICAgMHg4NTU3CisvKiByZXVzZSBHTF9URVhUVVJFMF9BUkIgKi8KKy8qIHJldXNlIEdMX1RFWFRVUkUxX0FSQiAqLworLyogcmV1c2UgR0xfWkVSTyAqLworLyogcmV1c2UgR0xfTk9ORSAqLworLyogcmV1c2UgR0xfRk9HICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mb2dfZGlzdGFuY2UKKyNkZWZpbmUgR0xfRk9HX0RJU1RBTkNFX01PREVfTlYgICAgICAgICAgIDB4ODU1QQorI2RlZmluZSBHTF9FWUVfUkFESUFMX05WICAgICAgICAgICAgICAgICAgMHg4NTVCCisjZGVmaW5lIEdMX0VZRV9QTEFORV9BQlNPTFVURV9OViAgICAgICAgICAweDg1NUMKKy8qIHJldXNlIEdMX0VZRV9QTEFORSAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4Z2VuX2VtYm9zcworI2RlZmluZSBHTF9FTUJPU1NfTElHSFRfTlYgICAgICAgICAgICAgICAgMHg4NTVECisjZGVmaW5lIEdMX0VNQk9TU19DT05TVEFOVF9OViAgICAgICAgICAgICAweDg1NUUKKyNkZWZpbmUgR0xfRU1CT1NTX01BUF9OViAgICAgICAgICAgICAgICAgIDB4ODU1RgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfYmxlbmRfc3F1YXJlCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXh0dXJlX2Vudl9jb21iaW5lNAorI2RlZmluZSBHTF9DT01CSU5FNF9OViAgICAgICAgICAgICAgICAgICAgMHg4NTAzCisjZGVmaW5lIEdMX1NPVVJDRTNfUkdCX05WICAgICAgICAgICAgICAgICAweDg1ODMKKyNkZWZpbmUgR0xfU09VUkNFM19BTFBIQV9OViAgICAgICAgICAgICAgIDB4ODU4QgorI2RlZmluZSBHTF9PUEVSQU5EM19SR0JfTlYgICAgICAgICAgICAgICAgMHg4NTkzCisjZGVmaW5lIEdMX09QRVJBTkQzX0FMUEhBX05WICAgICAgICAgICAgICAweDg1OUIKKyNlbmRpZgorCisjaWZuZGVmIEdMX01FU0FfcmVzaXplX2J1ZmZlcnMKKyNlbmRpZgorCisjaWZuZGVmIEdMX01FU0Ffd2luZG93X3BvcworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fczN0YworI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUICAgMHg4M0YwCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUICAweDgzRjEKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQgIDB4ODNGMgorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVCAgMHg4M0YzCisjZW5kaWYKKworI2lmbmRlZiBHTF9JQk1fY3VsbF92ZXJ0ZXgKKyNkZWZpbmUgR0xfQ1VMTF9WRVJURVhfSUJNICAgICAgICAgICAgICAgIDEwMzA1MAorI2VuZGlmCisKKyNpZm5kZWYgR0xfSUJNX211bHRpbW9kZV9kcmF3X2FycmF5cworI2VuZGlmCisKKyNpZm5kZWYgR0xfSUJNX3ZlcnRleF9hcnJheV9saXN0cworI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfTElTVF9JQk0gICAgICAgICAgMTAzMDcwCisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9MSVNUX0lCTSAgICAgICAgICAxMDMwNzEKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfTElTVF9JQk0gICAgICAgICAgIDEwMzA3MgorI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9MSVNUX0lCTSAgICAgICAgICAgMTAzMDczCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfTElTVF9JQk0gICAxMDMwNzQKKyNkZWZpbmUgR0xfRURHRV9GTEFHX0FSUkFZX0xJU1RfSUJNICAgICAgIDEwMzA3NQorI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9MSVNUX0lCTSAgMTAzMDc2CisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9MSVNUX0lCTSAxMDMwNzcKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0xJU1RfU1RSSURFX0lCTSAgIDEwMzA4MAorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfTElTVF9TVFJJREVfSUJNICAgMTAzMDgxCisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX0xJU1RfU1RSSURFX0lCTSAgICAxMDMwODIKKyNkZWZpbmUgR0xfSU5ERVhfQVJSQVlfTElTVF9TVFJJREVfSUJNICAgIDEwMzA4MworI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0xJU1RfU1RSSURFX0lCTSAxMDMwODQKKyNkZWZpbmUgR0xfRURHRV9GTEFHX0FSUkFZX0xJU1RfU1RSSURFX0lCTSAxMDMwODUKKyNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfTElTVF9TVFJJREVfSUJNIDEwMzA4NgorI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfTElTVF9TVFJJREVfSUJNIDEwMzA4NworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9zdWJzYW1wbGUKKyNkZWZpbmUgR0xfUEFDS19TVUJTQU1QTEVfUkFURV9TR0lYICAgICAgIDB4ODVBMAorI2RlZmluZSBHTF9VTlBBQ0tfU1VCU0FNUExFX1JBVEVfU0dJWCAgICAgMHg4NUExCisjZGVmaW5lIEdMX1BJWEVMX1NVQlNBTVBMRV80NDQ0X1NHSVggICAgICAweDg1QTIKKyNkZWZpbmUgR0xfUElYRUxfU1VCU0FNUExFXzI0MjRfU0dJWCAgICAgIDB4ODVBMworI2RlZmluZSBHTF9QSVhFTF9TVUJTQU1QTEVfNDI0Ml9TR0lYICAgICAgMHg4NUE0CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3ljcmNiX3N1YnNhbXBsZQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF95Y3JjYmEKKyNkZWZpbmUgR0xfWUNSQ0JfU0dJWCAgICAgICAgICAgICAgICAgICAgIDB4ODMxOAorI2RlZmluZSBHTF9ZQ1JDQkFfU0dJWCAgICAgICAgICAgICAgICAgICAgMHg4MzE5CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lfZGVwdGhfcGFzc19pbnN0cnVtZW50CisjZGVmaW5lIEdMX0RFUFRIX1BBU1NfSU5TVFJVTUVOVF9TR0lYICAgICAweDgzMTAKKyNkZWZpbmUgR0xfREVQVEhfUEFTU19JTlNUUlVNRU5UX0NPVU5URVJTX1NHSVggMHg4MzExCisjZGVmaW5lIEdMX0RFUFRIX1BBU1NfSU5TVFJVTUVOVF9NQVhfU0dJWCAweDgzMTIKKyNlbmRpZgorCisjaWZuZGVmIEdMXzNERlhfdGV4dHVyZV9jb21wcmVzc2lvbl9GWFQxCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCX0ZYVDFfM0RGWCAgICAgICAweDg2QjAKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX0ZYVDFfM0RGWCAgICAgIDB4ODZCMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfM0RGWF9tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV8zREZYICAgICAgICAgICAgICAgMHg4NkIyCisjZGVmaW5lIEdMX1NBTVBMRV9CVUZGRVJTXzNERlggICAgICAgICAgICAweDg2QjMKKyNkZWZpbmUgR0xfU0FNUExFU18zREZYICAgICAgICAgICAgICAgICAgIDB4ODZCNAorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CSVRfM0RGWCAgICAgICAgICAgMHgyMDAwMDAwMAorI2VuZGlmCisKKyNpZm5kZWYgR0xfM0RGWF90YnVmZmVyCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEVfRVhUICAgICAgICAgICAgICAgIDB4ODA5RAorI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fTUFTS19FWFQgICAgICAgMHg4MDlFCisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19PTkVfRVhUICAgICAgICAweDgwOUYKKyNkZWZpbmUgR0xfU0FNUExFX01BU0tfRVhUICAgICAgICAgICAgICAgIDB4ODBBMAorI2RlZmluZSBHTF8xUEFTU19FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4MEExCisjZGVmaW5lIEdMXzJQQVNTXzBfRVhUICAgICAgICAgICAgICAgICAgICAweDgwQTIKKyNkZWZpbmUgR0xfMlBBU1NfMV9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODBBMworI2RlZmluZSBHTF80UEFTU18wX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MEE0CisjZGVmaW5lIEdMXzRQQVNTXzFfRVhUICAgICAgICAgICAgICAgICAgICAweDgwQTUKKyNkZWZpbmUgR0xfNFBBU1NfMl9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODBBNgorI2RlZmluZSBHTF80UEFTU18zX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MEE3CisjZGVmaW5lIEdMX1NBTVBMRV9CVUZGRVJTX0VYVCAgICAgICAgICAgICAweDgwQTgKKyNkZWZpbmUgR0xfU0FNUExFU19FWFQgICAgICAgICAgICAgICAgICAgIDB4ODBBOQorI2RlZmluZSBHTF9TQU1QTEVfTUFTS19WQUxVRV9FWFQgICAgICAgICAgMHg4MEFBCisjZGVmaW5lIEdMX1NBTVBMRV9NQVNLX0lOVkVSVF9FWFQgICAgICAgICAweDgwQUIKKyNkZWZpbmUgR0xfU0FNUExFX1BBVFRFUk5fRVhUICAgICAgICAgICAgIDB4ODBBQworI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CSVRfRVhUICAgICAgICAgICAgMHgyMDAwMDAwMAorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF92ZXJ0ZXhfcHJlY2xpcAorI2RlZmluZSBHTF9WRVJURVhfUFJFQ0xJUF9TR0lYICAgICAgICAgICAgMHg4M0VFCisjZGVmaW5lIEdMX1ZFUlRFWF9QUkVDTElQX0hJTlRfU0dJWCAgICAgICAweDgzRUYKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfY29udm9sdXRpb25fYWNjdXJhY3kKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fSElOVF9TR0lYICAgICAgICAgIDB4ODMxNgorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9yZXNhbXBsZQorI2RlZmluZSBHTF9QQUNLX1JFU0FNUExFX1NHSVggICAgICAgICAgICAgMHg4NDJDCisjZGVmaW5lIEdMX1VOUEFDS19SRVNBTVBMRV9TR0lYICAgICAgICAgICAweDg0MkQKKyNkZWZpbmUgR0xfUkVTQU1QTEVfUkVQTElDQVRFX1NHSVggICAgICAgIDB4ODQyRQorI2RlZmluZSBHTF9SRVNBTVBMRV9aRVJPX0ZJTExfU0dJWCAgICAgICAgMHg4NDJGCisjZGVmaW5lIEdMX1JFU0FNUExFX0RFQ0lNQVRFX1NHSVggICAgICAgICAweDg0MzAKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfcG9pbnRfbGluZV90ZXhnZW4KKyNkZWZpbmUgR0xfRVlFX0RJU1RBTkNFX1RPX1BPSU5UX1NHSVMgICAgIDB4ODFGMAorI2RlZmluZSBHTF9PQkpFQ1RfRElTVEFOQ0VfVE9fUE9JTlRfU0dJUyAgMHg4MUYxCisjZGVmaW5lIEdMX0VZRV9ESVNUQU5DRV9UT19MSU5FX1NHSVMgICAgICAweDgxRjIKKyNkZWZpbmUgR0xfT0JKRUNUX0RJU1RBTkNFX1RPX0xJTkVfU0dJUyAgIDB4ODFGMworI2RlZmluZSBHTF9FWUVfUE9JTlRfU0dJUyAgICAgICAgICAgICAgICAgMHg4MUY0CisjZGVmaW5lIEdMX09CSkVDVF9QT0lOVF9TR0lTICAgICAgICAgICAgICAweDgxRjUKKyNkZWZpbmUgR0xfRVlFX0xJTkVfU0dJUyAgICAgICAgICAgICAgICAgIDB4ODFGNgorI2RlZmluZSBHTF9PQkpFQ1RfTElORV9TR0lTICAgICAgICAgICAgICAgMHg4MUY3CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfY29sb3JfbWFzaworI2RlZmluZSBHTF9URVhUVVJFX0NPTE9SX1dSSVRFTUFTS19TR0lTICAgMHg4MUVGCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9lbnZfZG90MworI2RlZmluZSBHTF9ET1QzX1JHQl9FWFQgICAgICAgICAgICAgICAgICAgMHg4NzQwCisjZGVmaW5lIEdMX0RPVDNfUkdCQV9FWFQgICAgICAgICAgICAgICAgICAweDg3NDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV90ZXh0dXJlX21pcnJvcl9vbmNlCisjZGVmaW5lIEdMX01JUlJPUl9DTEFNUF9BVEkgICAgICAgICAgICAgICAweDg3NDIKKyNkZWZpbmUgR0xfTUlSUk9SX0NMQU1QX1RPX0VER0VfQVRJICAgICAgIDB4ODc0MworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZmVuY2UKKyNkZWZpbmUgR0xfQUxMX0NPTVBMRVRFRF9OViAgICAgICAgICAgICAgIDB4ODRGMgorI2RlZmluZSBHTF9GRU5DRV9TVEFUVVNfTlYgICAgICAgICAgICAgICAgMHg4NEYzCisjZGVmaW5lIEdMX0ZFTkNFX0NPTkRJVElPTl9OViAgICAgICAgICAgICAweDg0RjQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lCTV90ZXh0dXJlX21pcnJvcmVkX3JlcGVhdAorI2RlZmluZSBHTF9NSVJST1JFRF9SRVBFQVRfSUJNICAgICAgICAgICAgMHg4MzcwCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9ldmFsdWF0b3JzCisjZGVmaW5lIEdMX0VWQUxfMkRfTlYgICAgICAgICAgICAgICAgICAgICAweDg2QzAKKyNkZWZpbmUgR0xfRVZBTF9UUklBTkdVTEFSXzJEX05WICAgICAgICAgIDB4ODZDMQorI2RlZmluZSBHTF9NQVBfVEVTU0VMTEFUSU9OX05WICAgICAgICAgICAgMHg4NkMyCisjZGVmaW5lIEdMX01BUF9BVFRSSUJfVV9PUkRFUl9OViAgICAgICAgICAweDg2QzMKKyNkZWZpbmUgR0xfTUFQX0FUVFJJQl9WX09SREVSX05WICAgICAgICAgIDB4ODZDNAorI2RlZmluZSBHTF9FVkFMX0ZSQUNUSU9OQUxfVEVTU0VMTEFUSU9OX05WIDB4ODZDNQorI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUIwX05WICAgICAgICAgMHg4NkM2CisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjFfTlYgICAgICAgICAweDg2QzcKKyNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCMl9OViAgICAgICAgIDB4ODZDOAorI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUIzX05WICAgICAgICAgMHg4NkM5CisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjRfTlYgICAgICAgICAweDg2Q0EKKyNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCNV9OViAgICAgICAgIDB4ODZDQgorI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUI2X05WICAgICAgICAgMHg4NkNDCisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjdfTlYgICAgICAgICAweDg2Q0QKKyNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCOF9OViAgICAgICAgIDB4ODZDRQorI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUI5X05WICAgICAgICAgMHg4NkNGCisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjEwX05WICAgICAgICAweDg2RDAKKyNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCMTFfTlYgICAgICAgIDB4ODZEMQorI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUIxMl9OViAgICAgICAgMHg4NkQyCisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjEzX05WICAgICAgICAweDg2RDMKKyNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCMTRfTlYgICAgICAgIDB4ODZENAorI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUIxNV9OViAgICAgICAgMHg4NkQ1CisjZGVmaW5lIEdMX01BWF9NQVBfVEVTU0VMTEFUSU9OX05WICAgICAgICAweDg2RDYKKyNkZWZpbmUgR0xfTUFYX1JBVElPTkFMX0VWQUxfT1JERVJfTlYgICAgIDB4ODZENworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfcGFja2VkX2RlcHRoX3N0ZW5jaWwKKyNkZWZpbmUgR0xfREVQVEhfU1RFTkNJTF9OViAgICAgICAgICAgICAgIDB4ODRGOQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMjRfOF9OViAgICAgICAgICAgMHg4NEZBCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9yZWdpc3Rlcl9jb21iaW5lcnMyCisjZGVmaW5lIEdMX1BFUl9TVEFHRV9DT05TVEFOVFNfTlYgICAgICAgICAweDg1MzUKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfY29tcHJlc3Npb25fdnRjCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXh0dXJlX3JlY3RhbmdsZQorI2RlZmluZSBHTF9URVhUVVJFX1JFQ1RBTkdMRV9OViAgICAgICAgICAgMHg4NEY1CisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19SRUNUQU5HTEVfTlYgICAweDg0RjYKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV9SRUNUQU5HTEVfTlYgICAgIDB4ODRGNworI2RlZmluZSBHTF9NQVhfUkVDVEFOR0xFX1RFWFRVUkVfU0laRV9OViAgMHg4NEY4CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXh0dXJlX3NoYWRlcgorI2RlZmluZSBHTF9PRkZTRVRfVEVYVFVSRV9SRUNUQU5HTEVfTlYgICAgMHg4NjRDCisjZGVmaW5lIEdMX09GRlNFVF9URVhUVVJFX1JFQ1RBTkdMRV9TQ0FMRV9OViAweDg2NEQKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfVEVYVFVSRV9SRUNUQU5HTEVfTlYgMHg4NjRFCisjZGVmaW5lIEdMX1JHQkFfVU5TSUdORURfRE9UX1BST0RVQ1RfTUFQUElOR19OViAweDg2RDkKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1M4X1M4XzhfOF9OViAgICAgIDB4ODZEQQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfOF84X1M4X1M4X1JFVl9OViAgMHg4NkRCCisjZGVmaW5lIEdMX0RTRFRfTUFHX0lOVEVOU0lUWV9OViAgICAgICAgICAweDg2REMKKyNkZWZpbmUgR0xfU0hBREVSX0NPTlNJU1RFTlRfTlYgICAgICAgICAgIDB4ODZERAorI2RlZmluZSBHTF9URVhUVVJFX1NIQURFUl9OViAgICAgICAgICAgICAgMHg4NkRFCisjZGVmaW5lIEdMX1NIQURFUl9PUEVSQVRJT05fTlYgICAgICAgICAgICAweDg2REYKKyNkZWZpbmUgR0xfQ1VMTF9NT0RFU19OViAgICAgICAgICAgICAgICAgIDB4ODZFMAorI2RlZmluZSBHTF9PRkZTRVRfVEVYVFVSRV9NQVRSSVhfTlYgICAgICAgMHg4NkUxCisjZGVmaW5lIEdMX09GRlNFVF9URVhUVVJFX1NDQUxFX05WICAgICAgICAweDg2RTIKKyNkZWZpbmUgR0xfT0ZGU0VUX1RFWFRVUkVfQklBU19OViAgICAgICAgIDB4ODZFMworI2RlZmluZSBHTF9PRkZTRVRfVEVYVFVSRV8yRF9NQVRSSVhfTlYgICAgR0xfT0ZGU0VUX1RFWFRVUkVfTUFUUklYX05WCisjZGVmaW5lIEdMX09GRlNFVF9URVhUVVJFXzJEX1NDQUxFX05WICAgICBHTF9PRkZTRVRfVEVYVFVSRV9TQ0FMRV9OVgorI2RlZmluZSBHTF9PRkZTRVRfVEVYVFVSRV8yRF9CSUFTX05WICAgICAgR0xfT0ZGU0VUX1RFWFRVUkVfQklBU19OVgorI2RlZmluZSBHTF9QUkVWSU9VU19URVhUVVJFX0lOUFVUX05WICAgICAgMHg4NkU0CisjZGVmaW5lIEdMX0NPTlNUX0VZRV9OViAgICAgICAgICAgICAgICAgICAweDg2RTUKKyNkZWZpbmUgR0xfUEFTU19USFJPVUdIX05WICAgICAgICAgICAgICAgIDB4ODZFNgorI2RlZmluZSBHTF9DVUxMX0ZSQUdNRU5UX05WICAgICAgICAgICAgICAgMHg4NkU3CisjZGVmaW5lIEdMX09GRlNFVF9URVhUVVJFXzJEX05WICAgICAgICAgICAweDg2RTgKKyNkZWZpbmUgR0xfREVQRU5ERU5UX0FSX1RFWFRVUkVfMkRfTlYgICAgIDB4ODZFOQorI2RlZmluZSBHTF9ERVBFTkRFTlRfR0JfVEVYVFVSRV8yRF9OViAgICAgMHg4NkVBCisjZGVmaW5lIEdMX0RPVF9QUk9EVUNUX05WICAgICAgICAgICAgICAgICAweDg2RUMKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfREVQVEhfUkVQTEFDRV9OViAgIDB4ODZFRAorI2RlZmluZSBHTF9ET1RfUFJPRFVDVF9URVhUVVJFXzJEX05WICAgICAgMHg4NkVFCisjZGVmaW5lIEdMX0RPVF9QUk9EVUNUX1RFWFRVUkVfQ1VCRV9NQVBfTlYgMHg4NkYwCisjZGVmaW5lIEdMX0RPVF9QUk9EVUNUX0RJRkZVU0VfQ1VCRV9NQVBfTlYgMHg4NkYxCisjZGVmaW5lIEdMX0RPVF9QUk9EVUNUX1JFRkxFQ1RfQ1VCRV9NQVBfTlYgMHg4NkYyCisjZGVmaW5lIEdMX0RPVF9QUk9EVUNUX0NPTlNUX0VZRV9SRUZMRUNUX0NVQkVfTUFQX05WIDB4ODZGMworI2RlZmluZSBHTF9ISUxPX05WICAgICAgICAgICAgICAgICAgICAgICAgMHg4NkY0CisjZGVmaW5lIEdMX0RTRFRfTlYgICAgICAgICAgICAgICAgICAgICAgICAweDg2RjUKKyNkZWZpbmUgR0xfRFNEVF9NQUdfTlYgICAgICAgICAgICAgICAgICAgIDB4ODZGNgorI2RlZmluZSBHTF9EU0RUX01BR19WSUJfTlYgICAgICAgICAgICAgICAgMHg4NkY3CisjZGVmaW5lIEdMX0hJTE8xNl9OViAgICAgICAgICAgICAgICAgICAgICAweDg2RjgKKyNkZWZpbmUgR0xfU0lHTkVEX0hJTE9fTlYgICAgICAgICAgICAgICAgIDB4ODZGOQorI2RlZmluZSBHTF9TSUdORURfSElMTzE2X05WICAgICAgICAgICAgICAgMHg4NkZBCisjZGVmaW5lIEdMX1NJR05FRF9SR0JBX05WICAgICAgICAgICAgICAgICAweDg2RkIKKyNkZWZpbmUgR0xfU0lHTkVEX1JHQkE4X05WICAgICAgICAgICAgICAgIDB4ODZGQworI2RlZmluZSBHTF9TSUdORURfUkdCX05WICAgICAgICAgICAgICAgICAgMHg4NkZFCisjZGVmaW5lIEdMX1NJR05FRF9SR0I4X05WICAgICAgICAgICAgICAgICAweDg2RkYKKyNkZWZpbmUgR0xfU0lHTkVEX0xVTUlOQU5DRV9OViAgICAgICAgICAgIDB4ODcwMQorI2RlZmluZSBHTF9TSUdORURfTFVNSU5BTkNFOF9OViAgICAgICAgICAgMHg4NzAyCisjZGVmaW5lIEdMX1NJR05FRF9MVU1JTkFOQ0VfQUxQSEFfTlYgICAgICAweDg3MDMKKyNkZWZpbmUgR0xfU0lHTkVEX0xVTUlOQU5DRThfQUxQSEE4X05WICAgIDB4ODcwNAorI2RlZmluZSBHTF9TSUdORURfQUxQSEFfTlYgICAgICAgICAgICAgICAgMHg4NzA1CisjZGVmaW5lIEdMX1NJR05FRF9BTFBIQThfTlYgICAgICAgICAgICAgICAweDg3MDYKKyNkZWZpbmUgR0xfU0lHTkVEX0lOVEVOU0lUWV9OViAgICAgICAgICAgIDB4ODcwNworI2RlZmluZSBHTF9TSUdORURfSU5URU5TSVRZOF9OViAgICAgICAgICAgMHg4NzA4CisjZGVmaW5lIEdMX0RTRFQ4X05WICAgICAgICAgICAgICAgICAgICAgICAweDg3MDkKKyNkZWZpbmUgR0xfRFNEVDhfTUFHOF9OViAgICAgICAgICAgICAgICAgIDB4ODcwQQorI2RlZmluZSBHTF9EU0RUOF9NQUc4X0lOVEVOU0lUWThfTlYgICAgICAgMHg4NzBCCisjZGVmaW5lIEdMX1NJR05FRF9SR0JfVU5TSUdORURfQUxQSEFfTlYgICAweDg3MEMKKyNkZWZpbmUgR0xfU0lHTkVEX1JHQjhfVU5TSUdORURfQUxQSEE4X05WIDB4ODcwRAorI2RlZmluZSBHTF9ISV9TQ0FMRV9OViAgICAgICAgICAgICAgICAgICAgMHg4NzBFCisjZGVmaW5lIEdMX0xPX1NDQUxFX05WICAgICAgICAgICAgICAgICAgICAweDg3MEYKKyNkZWZpbmUgR0xfRFNfU0NBTEVfTlYgICAgICAgICAgICAgICAgICAgIDB4ODcxMAorI2RlZmluZSBHTF9EVF9TQ0FMRV9OViAgICAgICAgICAgICAgICAgICAgMHg4NzExCisjZGVmaW5lIEdMX01BR05JVFVERV9TQ0FMRV9OViAgICAgICAgICAgICAweDg3MTIKKyNkZWZpbmUgR0xfVklCUkFOQ0VfU0NBTEVfTlYgICAgICAgICAgICAgIDB4ODcxMworI2RlZmluZSBHTF9ISV9CSUFTX05WICAgICAgICAgICAgICAgICAgICAgMHg4NzE0CisjZGVmaW5lIEdMX0xPX0JJQVNfTlYgICAgICAgICAgICAgICAgICAgICAweDg3MTUKKyNkZWZpbmUgR0xfRFNfQklBU19OViAgICAgICAgICAgICAgICAgICAgIDB4ODcxNgorI2RlZmluZSBHTF9EVF9CSUFTX05WICAgICAgICAgICAgICAgICAgICAgMHg4NzE3CisjZGVmaW5lIEdMX01BR05JVFVERV9CSUFTX05WICAgICAgICAgICAgICAweDg3MTgKKyNkZWZpbmUgR0xfVklCUkFOQ0VfQklBU19OViAgICAgICAgICAgICAgIDB4ODcxOQorI2RlZmluZSBHTF9URVhUVVJFX0JPUkRFUl9WQUxVRVNfTlYgICAgICAgMHg4NzFBCisjZGVmaW5lIEdMX1RFWFRVUkVfSElfU0laRV9OViAgICAgICAgICAgICAweDg3MUIKKyNkZWZpbmUgR0xfVEVYVFVSRV9MT19TSVpFX05WICAgICAgICAgICAgIDB4ODcxQworI2RlZmluZSBHTF9URVhUVVJFX0RTX1NJWkVfTlYgICAgICAgICAgICAgMHg4NzFECisjZGVmaW5lIEdMX1RFWFRVUkVfRFRfU0laRV9OViAgICAgICAgICAgICAweDg3MUUKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQUdfU0laRV9OViAgICAgICAgICAgIDB4ODcxRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4dHVyZV9zaGFkZXIyCisjZGVmaW5lIEdMX0RPVF9QUk9EVUNUX1RFWFRVUkVfM0RfTlYgICAgICAweDg2RUYKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9hcnJheV9yYW5nZTIKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1JBTkdFX1dJVEhPVVRfRkxVU0hfTlYgMHg4NTMzCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbQorI2RlZmluZSBHTF9WRVJURVhfUFJPR1JBTV9OViAgICAgICAgICAgICAgMHg4NjIwCisjZGVmaW5lIEdMX1ZFUlRFWF9TVEFURV9QUk9HUkFNX05WICAgICAgICAweDg2MjEKKyNkZWZpbmUgR0xfQVRUUklCX0FSUkFZX1NJWkVfTlYgICAgICAgICAgIDB4ODYyMworI2RlZmluZSBHTF9BVFRSSUJfQVJSQVlfU1RSSURFX05WICAgICAgICAgMHg4NjI0CisjZGVmaW5lIEdMX0FUVFJJQl9BUlJBWV9UWVBFX05WICAgICAgICAgICAweDg2MjUKKyNkZWZpbmUgR0xfQ1VSUkVOVF9BVFRSSUJfTlYgICAgICAgICAgICAgIDB4ODYyNgorI2RlZmluZSBHTF9QUk9HUkFNX0xFTkdUSF9OViAgICAgICAgICAgICAgMHg4NjI3CisjZGVmaW5lIEdMX1BST0dSQU1fU1RSSU5HX05WICAgICAgICAgICAgICAweDg2MjgKKyNkZWZpbmUgR0xfTU9ERUxWSUVXX1BST0pFQ1RJT05fTlYgICAgICAgIDB4ODYyOQorI2RlZmluZSBHTF9JREVOVElUWV9OViAgICAgICAgICAgICAgICAgICAgMHg4NjJBCisjZGVmaW5lIEdMX0lOVkVSU0VfTlYgICAgICAgICAgICAgICAgICAgICAweDg2MkIKKyNkZWZpbmUgR0xfVFJBTlNQT1NFX05WICAgICAgICAgICAgICAgICAgIDB4ODYyQworI2RlZmluZSBHTF9JTlZFUlNFX1RSQU5TUE9TRV9OViAgICAgICAgICAgMHg4NjJECisjZGVmaW5lIEdMX01BWF9UUkFDS19NQVRSSVhfU1RBQ0tfREVQVEhfTlYgMHg4NjJFCisjZGVmaW5lIEdMX01BWF9UUkFDS19NQVRSSUNFU19OViAgICAgICAgICAweDg2MkYKKyNkZWZpbmUgR0xfTUFUUklYMF9OViAgICAgICAgICAgICAgICAgICAgIDB4ODYzMAorI2RlZmluZSBHTF9NQVRSSVgxX05WICAgICAgICAgICAgICAgICAgICAgMHg4NjMxCisjZGVmaW5lIEdMX01BVFJJWDJfTlYgICAgICAgICAgICAgICAgICAgICAweDg2MzIKKyNkZWZpbmUgR0xfTUFUUklYM19OViAgICAgICAgICAgICAgICAgICAgIDB4ODYzMworI2RlZmluZSBHTF9NQVRSSVg0X05WICAgICAgICAgICAgICAgICAgICAgMHg4NjM0CisjZGVmaW5lIEdMX01BVFJJWDVfTlYgICAgICAgICAgICAgICAgICAgICAweDg2MzUKKyNkZWZpbmUgR0xfTUFUUklYNl9OViAgICAgICAgICAgICAgICAgICAgIDB4ODYzNgorI2RlZmluZSBHTF9NQVRSSVg3X05WICAgICAgICAgICAgICAgICAgICAgMHg4NjM3CisjZGVmaW5lIEdMX0NVUlJFTlRfTUFUUklYX1NUQUNLX0RFUFRIX05WICAweDg2NDAKKyNkZWZpbmUgR0xfQ1VSUkVOVF9NQVRSSVhfTlYgICAgICAgICAgICAgIDB4ODY0MQorI2RlZmluZSBHTF9WRVJURVhfUFJPR1JBTV9QT0lOVF9TSVpFX05WICAgMHg4NjQyCisjZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX1RXT19TSURFX05WICAgICAweDg2NDMKKyNkZWZpbmUgR0xfUFJPR1JBTV9QQVJBTUVURVJfTlYgICAgICAgICAgIDB4ODY0NAorI2RlZmluZSBHTF9BVFRSSUJfQVJSQVlfUE9JTlRFUl9OViAgICAgICAgMHg4NjQ1CisjZGVmaW5lIEdMX1BST0dSQU1fVEFSR0VUX05WICAgICAgICAgICAgICAweDg2NDYKKyNkZWZpbmUgR0xfUFJPR1JBTV9SRVNJREVOVF9OViAgICAgICAgICAgIDB4ODY0NworI2RlZmluZSBHTF9UUkFDS19NQVRSSVhfTlYgICAgICAgICAgICAgICAgMHg4NjQ4CisjZGVmaW5lIEdMX1RSQUNLX01BVFJJWF9UUkFOU0ZPUk1fTlYgICAgICAweDg2NDkKKyNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fQklORElOR19OViAgICAgIDB4ODY0QQorI2RlZmluZSBHTF9QUk9HUkFNX0VSUk9SX1BPU0lUSU9OX05WICAgICAgMHg4NjRCCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkwX05WICAgICAgICAweDg2NTAKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTFfTlYgICAgICAgIDB4ODY1MQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZMl9OViAgICAgICAgMHg4NjUyCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkzX05WICAgICAgICAweDg2NTMKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTRfTlYgICAgICAgIDB4ODY1NAorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZNV9OViAgICAgICAgMHg4NjU1CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVk2X05WICAgICAgICAweDg2NTYKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTdfTlYgICAgICAgIDB4ODY1NworI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZOF9OViAgICAgICAgMHg4NjU4CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVk5X05WICAgICAgICAweDg2NTkKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTEwX05WICAgICAgIDB4ODY1QQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZMTFfTlYgICAgICAgMHg4NjVCCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxMl9OViAgICAgICAweDg2NUMKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTEzX05WICAgICAgIDB4ODY1RAorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZMTRfTlYgICAgICAgMHg4NjVFCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxNV9OViAgICAgICAweDg2NUYKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCMF80X05WICAgICAgIDB4ODY2MAorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxXzRfTlYgICAgICAgMHg4NjYxCisjZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjJfNF9OViAgICAgICAweDg2NjIKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCM180X05WICAgICAgIDB4ODY2MworI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUI0XzRfTlYgICAgICAgMHg4NjY0CisjZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjVfNF9OViAgICAgICAweDg2NjUKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCNl80X05WICAgICAgIDB4ODY2NgorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUI3XzRfTlYgICAgICAgMHg4NjY3CisjZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjhfNF9OViAgICAgICAweDg2NjgKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCOV80X05WICAgICAgIDB4ODY2OQorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxMF80X05WICAgICAgMHg4NjZBCisjZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjExXzRfTlYgICAgICAweDg2NkIKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCMTJfNF9OViAgICAgIDB4ODY2QworI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxM180X05WICAgICAgMHg4NjZECisjZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjE0XzRfTlYgICAgICAweDg2NkUKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCMTVfNF9OViAgICAgIDB4ODY2RgorI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIwXzRfTlYgICAgICAgMHg4NjcwCisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjFfNF9OViAgICAgICAweDg2NzEKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCMl80X05WICAgICAgIDB4ODY3MgorI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIzXzRfTlYgICAgICAgMHg4NjczCisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjRfNF9OViAgICAgICAweDg2NzQKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCNV80X05WICAgICAgIDB4ODY3NQorI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUI2XzRfTlYgICAgICAgMHg4Njc2CisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjdfNF9OViAgICAgICAweDg2NzcKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCOF80X05WICAgICAgIDB4ODY3OAorI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUI5XzRfTlYgICAgICAgMHg4Njc5CisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjEwXzRfTlYgICAgICAweDg2N0EKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCMTFfNF9OViAgICAgIDB4ODY3QgorI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxMl80X05WICAgICAgMHg4NjdDCisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjEzXzRfTlYgICAgICAweDg2N0QKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCMTRfNF9OViAgICAgIDB4ODY3RQorI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxNV80X05WICAgICAgMHg4NjdGCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfY29vcmRpbmF0ZV9jbGFtcAorI2RlZmluZSBHTF9URVhUVVJFX01BWF9DTEFNUF9TX1NHSVggICAgICAgMHg4MzY5CisjZGVmaW5lIEdMX1RFWFRVUkVfTUFYX0NMQU1QX1RfU0dJWCAgICAgICAweDgzNkEKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQVhfQ0xBTVBfUl9TR0lYICAgICAgIDB4ODM2QgorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9zY2FsZWJpYXNfaGludAorI2RlZmluZSBHTF9TQ0FMRUJJQVNfSElOVF9TR0lYICAgICAgICAgICAgMHg4MzIyCisjZW5kaWYKKworI2lmbmRlZiBHTF9PTUxfaW50ZXJsYWNlCisjZGVmaW5lIEdMX0lOVEVSTEFDRV9PTUwgICAgICAgICAgICAgICAgICAweDg5ODAKKyNkZWZpbmUgR0xfSU5URVJMQUNFX1JFQURfT01MICAgICAgICAgICAgIDB4ODk4MQorI2VuZGlmCisKKyNpZm5kZWYgR0xfT01MX3N1YnNhbXBsZQorI2RlZmluZSBHTF9GT1JNQVRfU1VCU0FNUExFXzI0XzI0X09NTCAgICAgMHg4OTgyCisjZGVmaW5lIEdMX0ZPUk1BVF9TVUJTQU1QTEVfMjQ0XzI0NF9PTUwgICAweDg5ODMKKyNlbmRpZgorCisjaWZuZGVmIEdMX09NTF9yZXNhbXBsZQorI2RlZmluZSBHTF9QQUNLX1JFU0FNUExFX09NTCAgICAgICAgICAgICAgMHg4OTg0CisjZGVmaW5lIEdMX1VOUEFDS19SRVNBTVBMRV9PTUwgICAgICAgICAgICAweDg5ODUKKyNkZWZpbmUgR0xfUkVTQU1QTEVfUkVQTElDQVRFX09NTCAgICAgICAgIDB4ODk4NgorI2RlZmluZSBHTF9SRVNBTVBMRV9aRVJPX0ZJTExfT01MICAgICAgICAgMHg4OTg3CisjZGVmaW5lIEdMX1JFU0FNUExFX0FWRVJBR0VfT01MICAgICAgICAgICAweDg5ODgKKyNkZWZpbmUgR0xfUkVTQU1QTEVfREVDSU1BVEVfT01MICAgICAgICAgIDB4ODk4OQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfY29weV9kZXB0aF90b19jb2xvcgorI2RlZmluZSBHTF9ERVBUSF9TVEVOQ0lMX1RPX1JHQkFfTlYgICAgICAgMHg4ODZFCisjZGVmaW5lIEdMX0RFUFRIX1NURU5DSUxfVE9fQkdSQV9OViAgICAgICAweDg4NkYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV9lbnZtYXBfYnVtcG1hcAorI2RlZmluZSBHTF9CVU1QX1JPVF9NQVRSSVhfQVRJICAgICAgICAgICAgMHg4Nzc1CisjZGVmaW5lIEdMX0JVTVBfUk9UX01BVFJJWF9TSVpFX0FUSSAgICAgICAweDg3NzYKKyNkZWZpbmUgR0xfQlVNUF9OVU1fVEVYX1VOSVRTX0FUSSAgICAgICAgIDB4ODc3NworI2RlZmluZSBHTF9CVU1QX1RFWF9VTklUU19BVEkgICAgICAgICAgICAgMHg4Nzc4CisjZGVmaW5lIEdMX0RVRFZfQVRJICAgICAgICAgICAgICAgICAgICAgICAweDg3NzkKKyNkZWZpbmUgR0xfRFU4RFY4X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODc3QQorI2RlZmluZSBHTF9CVU1QX0VOVk1BUF9BVEkgICAgICAgICAgICAgICAgMHg4NzdCCisjZGVmaW5lIEdMX0JVTVBfVEFSR0VUX0FUSSAgICAgICAgICAgICAgICAweDg3N0MKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV9mcmFnbWVudF9zaGFkZXIKKyNkZWZpbmUgR0xfRlJBR01FTlRfU0hBREVSX0FUSSAgICAgICAgICAgIDB4ODkyMAorI2RlZmluZSBHTF9SRUdfMF9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTIxCisjZGVmaW5lIEdMX1JFR18xX0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5MjIKKyNkZWZpbmUgR0xfUkVHXzJfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODkyMworI2RlZmluZSBHTF9SRUdfM19BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTI0CisjZGVmaW5lIEdMX1JFR180X0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5MjUKKyNkZWZpbmUgR0xfUkVHXzVfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODkyNgorI2RlZmluZSBHTF9SRUdfNl9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTI3CisjZGVmaW5lIEdMX1JFR183X0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5MjgKKyNkZWZpbmUgR0xfUkVHXzhfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODkyOQorI2RlZmluZSBHTF9SRUdfOV9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTJBCisjZGVmaW5lIEdMX1JFR18xMF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MkIKKyNkZWZpbmUgR0xfUkVHXzExX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkyQworI2RlZmluZSBHTF9SRUdfMTJfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTJECisjZGVmaW5lIEdMX1JFR18xM19BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MkUKKyNkZWZpbmUgR0xfUkVHXzE0X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkyRgorI2RlZmluZSBHTF9SRUdfMTVfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTMwCisjZGVmaW5lIEdMX1JFR18xNl9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MzEKKyNkZWZpbmUgR0xfUkVHXzE3X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzMgorI2RlZmluZSBHTF9SRUdfMThfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTMzCisjZGVmaW5lIEdMX1JFR18xOV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MzQKKyNkZWZpbmUgR0xfUkVHXzIwX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzNQorI2RlZmluZSBHTF9SRUdfMjFfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTM2CisjZGVmaW5lIEdMX1JFR18yMl9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MzcKKyNkZWZpbmUgR0xfUkVHXzIzX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzOAorI2RlZmluZSBHTF9SRUdfMjRfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTM5CisjZGVmaW5lIEdMX1JFR18yNV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5M0EKKyNkZWZpbmUgR0xfUkVHXzI2X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzQgorI2RlZmluZSBHTF9SRUdfMjdfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTNDCisjZGVmaW5lIEdMX1JFR18yOF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5M0QKKyNkZWZpbmUgR0xfUkVHXzI5X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzRQorI2RlZmluZSBHTF9SRUdfMzBfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTNGCisjZGVmaW5lIEdMX1JFR18zMV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NDAKKyNkZWZpbmUgR0xfQ09OXzBfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODk0MQorI2RlZmluZSBHTF9DT05fMV9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTQyCisjZGVmaW5lIEdMX0NPTl8yX0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5NDMKKyNkZWZpbmUgR0xfQ09OXzNfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODk0NAorI2RlZmluZSBHTF9DT05fNF9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTQ1CisjZGVmaW5lIEdMX0NPTl81X0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5NDYKKyNkZWZpbmUgR0xfQ09OXzZfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODk0NworI2RlZmluZSBHTF9DT05fN19BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTQ4CisjZGVmaW5lIEdMX0NPTl84X0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5NDkKKyNkZWZpbmUgR0xfQ09OXzlfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODk0QQorI2RlZmluZSBHTF9DT05fMTBfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTRCCisjZGVmaW5lIEdMX0NPTl8xMV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NEMKKyNkZWZpbmUgR0xfQ09OXzEyX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk0RAorI2RlZmluZSBHTF9DT05fMTNfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTRFCisjZGVmaW5lIEdMX0NPTl8xNF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NEYKKyNkZWZpbmUgR0xfQ09OXzE1X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1MAorI2RlZmluZSBHTF9DT05fMTZfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTUxCisjZGVmaW5lIEdMX0NPTl8xN19BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NTIKKyNkZWZpbmUgR0xfQ09OXzE4X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1MworI2RlZmluZSBHTF9DT05fMTlfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTU0CisjZGVmaW5lIEdMX0NPTl8yMF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NTUKKyNkZWZpbmUgR0xfQ09OXzIxX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1NgorI2RlZmluZSBHTF9DT05fMjJfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTU3CisjZGVmaW5lIEdMX0NPTl8yM19BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NTgKKyNkZWZpbmUgR0xfQ09OXzI0X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1OQorI2RlZmluZSBHTF9DT05fMjVfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTVBCisjZGVmaW5lIEdMX0NPTl8yNl9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NUIKKyNkZWZpbmUgR0xfQ09OXzI3X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1QworI2RlZmluZSBHTF9DT05fMjhfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTVECisjZGVmaW5lIEdMX0NPTl8yOV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NUUKKyNkZWZpbmUgR0xfQ09OXzMwX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1RgorI2RlZmluZSBHTF9DT05fMzFfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTYwCisjZGVmaW5lIEdMX01PVl9BVEkgICAgICAgICAgICAgICAgICAgICAgICAweDg5NjEKKyNkZWZpbmUgR0xfQUREX0FUSSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODk2MworI2RlZmluZSBHTF9NVUxfQVRJICAgICAgICAgICAgICAgICAgICAgICAgMHg4OTY0CisjZGVmaW5lIEdMX1NVQl9BVEkgICAgICAgICAgICAgICAgICAgICAgICAweDg5NjUKKyNkZWZpbmUgR0xfRE9UM19BVEkgICAgICAgICAgICAgICAgICAgICAgIDB4ODk2NgorI2RlZmluZSBHTF9ET1Q0X0FUSSAgICAgICAgICAgICAgICAgICAgICAgMHg4OTY3CisjZGVmaW5lIEdMX01BRF9BVEkgICAgICAgICAgICAgICAgICAgICAgICAweDg5NjgKKyNkZWZpbmUgR0xfTEVSUF9BVEkgICAgICAgICAgICAgICAgICAgICAgIDB4ODk2OQorI2RlZmluZSBHTF9DTkRfQVRJICAgICAgICAgICAgICAgICAgICAgICAgMHg4OTZBCisjZGVmaW5lIEdMX0NORDBfQVRJICAgICAgICAgICAgICAgICAgICAgICAweDg5NkIKKyNkZWZpbmUgR0xfRE9UMl9BRERfQVRJICAgICAgICAgICAgICAgICAgIDB4ODk2QworI2RlZmluZSBHTF9TRUNPTkRBUllfSU5URVJQT0xBVE9SX0FUSSAgICAgMHg4OTZECisjZGVmaW5lIEdMX05VTV9GUkFHTUVOVF9SRUdJU1RFUlNfQVRJICAgICAweDg5NkUKKyNkZWZpbmUgR0xfTlVNX0ZSQUdNRU5UX0NPTlNUQU5UU19BVEkgICAgIDB4ODk2RgorI2RlZmluZSBHTF9OVU1fUEFTU0VTX0FUSSAgICAgICAgICAgICAgICAgMHg4OTcwCisjZGVmaW5lIEdMX05VTV9JTlNUUlVDVElPTlNfUEVSX1BBU1NfQVRJICAweDg5NzEKKyNkZWZpbmUgR0xfTlVNX0lOU1RSVUNUSU9OU19UT1RBTF9BVEkgICAgIDB4ODk3MgorI2RlZmluZSBHTF9OVU1fSU5QVVRfSU5URVJQT0xBVE9SX0NPTVBPTkVOVFNfQVRJIDB4ODk3MworI2RlZmluZSBHTF9OVU1fTE9PUEJBQ0tfQ09NUE9ORU5UU19BVEkgICAgMHg4OTc0CisjZGVmaW5lIEdMX0NPTE9SX0FMUEhBX1BBSVJJTkdfQVRJICAgICAgICAweDg5NzUKKyNkZWZpbmUgR0xfU1dJWlpMRV9TVFJfQVRJICAgICAgICAgICAgICAgIDB4ODk3NgorI2RlZmluZSBHTF9TV0laWkxFX1NUUV9BVEkgICAgICAgICAgICAgICAgMHg4OTc3CisjZGVmaW5lIEdMX1NXSVpaTEVfU1RSX0RSX0FUSSAgICAgICAgICAgICAweDg5NzgKKyNkZWZpbmUgR0xfU1dJWlpMRV9TVFFfRFFfQVRJICAgICAgICAgICAgIDB4ODk3OQorI2RlZmluZSBHTF9TV0laWkxFX1NUUlFfQVRJICAgICAgICAgICAgICAgMHg4OTdBCisjZGVmaW5lIEdMX1NXSVpaTEVfU1RSUV9EUV9BVEkgICAgICAgICAgICAweDg5N0IKKyNkZWZpbmUgR0xfUkVEX0JJVF9BVEkgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xfR1JFRU5fQklUX0FUSSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0xfQkxVRV9CSVRfQVRJICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgR0xfMlhfQklUX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xfNFhfQklUX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0xfOFhfQklUX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgR0xfSEFMRl9CSVRfQVRJICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgR0xfUVVBUlRFUl9CSVRfQVRJICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgR0xfRUlHSFRIX0JJVF9BVEkgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgR0xfU0FUVVJBVEVfQklUX0FUSSAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgR0xfQ09NUF9CSVRfQVRJICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0xfTkVHQVRFX0JJVF9BVEkgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgR0xfQklBU19CSVRfQVRJICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV9wbl90cmlhbmdsZXMKKyNkZWZpbmUgR0xfUE5fVFJJQU5HTEVTX0FUSSAgICAgICAgICAgICAgIDB4ODdGMAorI2RlZmluZSBHTF9NQVhfUE5fVFJJQU5HTEVTX1RFU1NFTEFUSU9OX0xFVkVMX0FUSSAweDg3RjEKKyNkZWZpbmUgR0xfUE5fVFJJQU5HTEVTX1BPSU5UX01PREVfQVRJICAgIDB4ODdGMgorI2RlZmluZSBHTF9QTl9UUklBTkdMRVNfTk9STUFMX01PREVfQVRJICAgMHg4N0YzCisjZGVmaW5lIEdMX1BOX1RSSUFOR0xFU19URVNTRUxBVElPTl9MRVZFTF9BVEkgMHg4N0Y0CisjZGVmaW5lIEdMX1BOX1RSSUFOR0xFU19QT0lOVF9NT0RFX0xJTkVBUl9BVEkgMHg4N0Y1CisjZGVmaW5lIEdMX1BOX1RSSUFOR0xFU19QT0lOVF9NT0RFX0NVQklDX0FUSSAweDg3RjYKKyNkZWZpbmUgR0xfUE5fVFJJQU5HTEVTX05PUk1BTF9NT0RFX0xJTkVBUl9BVEkgMHg4N0Y3CisjZGVmaW5lIEdMX1BOX1RSSUFOR0xFU19OT1JNQUxfTU9ERV9RVUFEUkFUSUNfQVRJIDB4ODdGOAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3ZlcnRleF9hcnJheV9vYmplY3QKKyNkZWZpbmUgR0xfU1RBVElDX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODc2MAorI2RlZmluZSBHTF9EWU5BTUlDX0FUSSAgICAgICAgICAgICAgICAgICAgMHg4NzYxCisjZGVmaW5lIEdMX1BSRVNFUlZFX0FUSSAgICAgICAgICAgICAgICAgICAweDg3NjIKKyNkZWZpbmUgR0xfRElTQ0FSRF9BVEkgICAgICAgICAgICAgICAgICAgIDB4ODc2MworI2RlZmluZSBHTF9PQkpFQ1RfQlVGRkVSX1NJWkVfQVRJICAgICAgICAgMHg4NzY0CisjZGVmaW5lIEdMX09CSkVDVF9CVUZGRVJfVVNBR0VfQVRJICAgICAgICAweDg3NjUKKyNkZWZpbmUgR0xfQVJSQVlfT0JKRUNUX0JVRkZFUl9BVEkgICAgICAgIDB4ODc2NgorI2RlZmluZSBHTF9BUlJBWV9PQkpFQ1RfT0ZGU0VUX0FUSSAgICAgICAgMHg4NzY3CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdmVydGV4X3NoYWRlcgorI2RlZmluZSBHTF9WRVJURVhfU0hBREVSX0VYVCAgICAgICAgICAgICAgMHg4NzgwCisjZGVmaW5lIEdMX1ZFUlRFWF9TSEFERVJfQklORElOR19FWFQgICAgICAweDg3ODEKKyNkZWZpbmUgR0xfT1BfSU5ERVhfRVhUICAgICAgICAgICAgICAgICAgIDB4ODc4MgorI2RlZmluZSBHTF9PUF9ORUdBVEVfRVhUICAgICAgICAgICAgICAgICAgMHg4NzgzCisjZGVmaW5lIEdMX09QX0RPVDNfRVhUICAgICAgICAgICAgICAgICAgICAweDg3ODQKKyNkZWZpbmUgR0xfT1BfRE9UNF9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODc4NQorI2RlZmluZSBHTF9PUF9NVUxfRVhUICAgICAgICAgICAgICAgICAgICAgMHg4Nzg2CisjZGVmaW5lIEdMX09QX0FERF9FWFQgICAgICAgICAgICAgICAgICAgICAweDg3ODcKKyNkZWZpbmUgR0xfT1BfTUFERF9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODc4OAorI2RlZmluZSBHTF9PUF9GUkFDX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4Nzg5CisjZGVmaW5lIEdMX09QX01BWF9FWFQgICAgICAgICAgICAgICAgICAgICAweDg3OEEKKyNkZWZpbmUgR0xfT1BfTUlOX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODc4QgorI2RlZmluZSBHTF9PUF9TRVRfR0VfRVhUICAgICAgICAgICAgICAgICAgMHg4NzhDCisjZGVmaW5lIEdMX09QX1NFVF9MVF9FWFQgICAgICAgICAgICAgICAgICAweDg3OEQKKyNkZWZpbmUgR0xfT1BfQ0xBTVBfRVhUICAgICAgICAgICAgICAgICAgIDB4ODc4RQorI2RlZmluZSBHTF9PUF9GTE9PUl9FWFQgICAgICAgICAgICAgICAgICAgMHg4NzhGCisjZGVmaW5lIEdMX09QX1JPVU5EX0VYVCAgICAgICAgICAgICAgICAgICAweDg3OTAKKyNkZWZpbmUgR0xfT1BfRVhQX0JBU0VfMl9FWFQgICAgICAgICAgICAgIDB4ODc5MQorI2RlZmluZSBHTF9PUF9MT0dfQkFTRV8yX0VYVCAgICAgICAgICAgICAgMHg4NzkyCisjZGVmaW5lIEdMX09QX1BPV0VSX0VYVCAgICAgICAgICAgICAgICAgICAweDg3OTMKKyNkZWZpbmUgR0xfT1BfUkVDSVBfRVhUICAgICAgICAgICAgICAgICAgIDB4ODc5NAorI2RlZmluZSBHTF9PUF9SRUNJUF9TUVJUX0VYVCAgICAgICAgICAgICAgMHg4Nzk1CisjZGVmaW5lIEdMX09QX1NVQl9FWFQgICAgICAgICAgICAgICAgICAgICAweDg3OTYKKyNkZWZpbmUgR0xfT1BfQ1JPU1NfUFJPRFVDVF9FWFQgICAgICAgICAgIDB4ODc5NworI2RlZmluZSBHTF9PUF9NVUxUSVBMWV9NQVRSSVhfRVhUICAgICAgICAgMHg4Nzk4CisjZGVmaW5lIEdMX09QX01PVl9FWFQgICAgICAgICAgICAgICAgICAgICAweDg3OTkKKyNkZWZpbmUgR0xfT1VUUFVUX1ZFUlRFWF9FWFQgICAgICAgICAgICAgIDB4ODc5QQorI2RlZmluZSBHTF9PVVRQVVRfQ09MT1IwX0VYVCAgICAgICAgICAgICAgMHg4NzlCCisjZGVmaW5lIEdMX09VVFBVVF9DT0xPUjFfRVhUICAgICAgICAgICAgICAweDg3OUMKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQwX0VYVCAgICAgIDB4ODc5RAorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDFfRVhUICAgICAgMHg4NzlFCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMl9FWFQgICAgICAweDg3OUYKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQzX0VYVCAgICAgIDB4ODdBMAorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDRfRVhUICAgICAgMHg4N0ExCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JENV9FWFQgICAgICAweDg3QTIKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQ2X0VYVCAgICAgIDB4ODdBMworI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDdfRVhUICAgICAgMHg4N0E0CisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEOF9FWFQgICAgICAweDg3QTUKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQ5X0VYVCAgICAgIDB4ODdBNgorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDEwX0VYVCAgICAgMHg4N0E3CisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMTFfRVhUICAgICAweDg3QTgKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQxMl9FWFQgICAgIDB4ODdBOQorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDEzX0VYVCAgICAgMHg4N0FBCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMTRfRVhUICAgICAweDg3QUIKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQxNV9FWFQgICAgIDB4ODdBQworI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDE2X0VYVCAgICAgMHg4N0FECisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMTdfRVhUICAgICAweDg3QUUKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQxOF9FWFQgICAgIDB4ODdBRgorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDE5X0VYVCAgICAgMHg4N0IwCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMjBfRVhUICAgICAweDg3QjEKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyMV9FWFQgICAgIDB4ODdCMgorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDIyX0VYVCAgICAgMHg4N0IzCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMjNfRVhUICAgICAweDg3QjQKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyNF9FWFQgICAgIDB4ODdCNQorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDI1X0VYVCAgICAgMHg4N0I2CisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMjZfRVhUICAgICAweDg3QjcKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyN19FWFQgICAgIDB4ODdCOAorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDI4X0VYVCAgICAgMHg4N0I5CisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMjlfRVhUICAgICAweDg3QkEKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQzMF9FWFQgICAgIDB4ODdCQgorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDMxX0VYVCAgICAgMHg4N0JDCisjZGVmaW5lIEdMX09VVFBVVF9GT0dfRVhUICAgICAgICAgICAgICAgICAweDg3QkQKKyNkZWZpbmUgR0xfU0NBTEFSX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODdCRQorI2RlZmluZSBHTF9WRUNUT1JfRVhUICAgICAgICAgICAgICAgICAgICAgMHg4N0JGCisjZGVmaW5lIEdMX01BVFJJWF9FWFQgICAgICAgICAgICAgICAgICAgICAweDg3QzAKKyNkZWZpbmUgR0xfVkFSSUFOVF9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODdDMQorI2RlZmluZSBHTF9JTlZBUklBTlRfRVhUICAgICAgICAgICAgICAgICAgMHg4N0MyCisjZGVmaW5lIEdMX0xPQ0FMX0NPTlNUQU5UX0VYVCAgICAgICAgICAgICAweDg3QzMKKyNkZWZpbmUgR0xfTE9DQUxfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4ODdDNAorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1NIQURFUl9JTlNUUlVDVElPTlNfRVhUIDB4ODdDNQorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1NIQURFUl9WQVJJQU5UU19FWFQgMHg4N0M2CisjZGVmaW5lIEdMX01BWF9WRVJURVhfU0hBREVSX0lOVkFSSUFOVFNfRVhUIDB4ODdDNworI2RlZmluZSBHTF9NQVhfVkVSVEVYX1NIQURFUl9MT0NBTF9DT05TVEFOVFNfRVhUIDB4ODdDOAorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1NIQURFUl9MT0NBTFNfRVhUICAgMHg4N0M5CisjZGVmaW5lIEdMX01BWF9PUFRJTUlaRURfVkVSVEVYX1NIQURFUl9JTlNUUlVDVElPTlNfRVhUIDB4ODdDQQorI2RlZmluZSBHTF9NQVhfT1BUSU1JWkVEX1ZFUlRFWF9TSEFERVJfVkFSSUFOVFNfRVhUIDB4ODdDQgorI2RlZmluZSBHTF9NQVhfT1BUSU1JWkVEX1ZFUlRFWF9TSEFERVJfTE9DQUxfQ09OU1RBTlRTX0VYVCAweDg3Q0MKKyNkZWZpbmUgR0xfTUFYX09QVElNSVpFRF9WRVJURVhfU0hBREVSX0lOVkFSSUFOVFNfRVhUIDB4ODdDRAorI2RlZmluZSBHTF9NQVhfT1BUSU1JWkVEX1ZFUlRFWF9TSEFERVJfTE9DQUxTX0VYVCAweDg3Q0UKKyNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUl9JTlNUUlVDVElPTlNfRVhUIDB4ODdDRgorI2RlZmluZSBHTF9WRVJURVhfU0hBREVSX1ZBUklBTlRTX0VYVCAgICAgMHg4N0QwCisjZGVmaW5lIEdMX1ZFUlRFWF9TSEFERVJfSU5WQVJJQU5UU19FWFQgICAweDg3RDEKKyNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUl9MT0NBTF9DT05TVEFOVFNfRVhUIDB4ODdEMgorI2RlZmluZSBHTF9WRVJURVhfU0hBREVSX0xPQ0FMU19FWFQgICAgICAgMHg4N0QzCisjZGVmaW5lIEdMX1ZFUlRFWF9TSEFERVJfT1BUSU1JWkVEX0VYVCAgICAweDg3RDQKKyNkZWZpbmUgR0xfWF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODdENQorI2RlZmluZSBHTF9ZX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4N0Q2CisjZGVmaW5lIEdMX1pfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3RDcKKyNkZWZpbmUgR0xfV19FWFQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODdEOAorI2RlZmluZSBHTF9ORUdBVElWRV9YX0VYVCAgICAgICAgICAgICAgICAgMHg4N0Q5CisjZGVmaW5lIEdMX05FR0FUSVZFX1lfRVhUICAgICAgICAgICAgICAgICAweDg3REEKKyNkZWZpbmUgR0xfTkVHQVRJVkVfWl9FWFQgICAgICAgICAgICAgICAgIDB4ODdEQgorI2RlZmluZSBHTF9ORUdBVElWRV9XX0VYVCAgICAgICAgICAgICAgICAgMHg4N0RDCisjZGVmaW5lIEdMX1pFUk9fRVhUICAgICAgICAgICAgICAgICAgICAgICAweDg3REQKKyNkZWZpbmUgR0xfT05FX0VYVCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODdERQorI2RlZmluZSBHTF9ORUdBVElWRV9PTkVfRVhUICAgICAgICAgICAgICAgMHg4N0RGCisjZGVmaW5lIEdMX05PUk1BTElaRURfUkFOR0VfRVhUICAgICAgICAgICAweDg3RTAKKyNkZWZpbmUgR0xfRlVMTF9SQU5HRV9FWFQgICAgICAgICAgICAgICAgIDB4ODdFMQorI2RlZmluZSBHTF9DVVJSRU5UX1ZFUlRFWF9FWFQgICAgICAgICAgICAgMHg4N0UyCisjZGVmaW5lIEdMX01WUF9NQVRSSVhfRVhUICAgICAgICAgICAgICAgICAweDg3RTMKKyNkZWZpbmUgR0xfVkFSSUFOVF9WQUxVRV9FWFQgICAgICAgICAgICAgIDB4ODdFNAorI2RlZmluZSBHTF9WQVJJQU5UX0RBVEFUWVBFX0VYVCAgICAgICAgICAgMHg4N0U1CisjZGVmaW5lIEdMX1ZBUklBTlRfQVJSQVlfU1RSSURFX0VYVCAgICAgICAweDg3RTYKKyNkZWZpbmUgR0xfVkFSSUFOVF9BUlJBWV9UWVBFX0VYVCAgICAgICAgIDB4ODdFNworI2RlZmluZSBHTF9WQVJJQU5UX0FSUkFZX0VYVCAgICAgICAgICAgICAgMHg4N0U4CisjZGVmaW5lIEdMX1ZBUklBTlRfQVJSQVlfUE9JTlRFUl9FWFQgICAgICAweDg3RTkKKyNkZWZpbmUgR0xfSU5WQVJJQU5UX1ZBTFVFX0VYVCAgICAgICAgICAgIDB4ODdFQQorI2RlZmluZSBHTF9JTlZBUklBTlRfREFUQVRZUEVfRVhUICAgICAgICAgMHg4N0VCCisjZGVmaW5lIEdMX0xPQ0FMX0NPTlNUQU5UX1ZBTFVFX0VYVCAgICAgICAweDg3RUMKKyNkZWZpbmUgR0xfTE9DQUxfQ09OU1RBTlRfREFUQVRZUEVfRVhUICAgIDB4ODdFRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3ZlcnRleF9zdHJlYW1zCisjZGVmaW5lIEdMX01BWF9WRVJURVhfU1RSRUFNU19BVEkgICAgICAgICAweDg3NkIKKyNkZWZpbmUgR0xfVkVSVEVYX1NUUkVBTTBfQVRJICAgICAgICAgICAgIDB4ODc2QworI2RlZmluZSBHTF9WRVJURVhfU1RSRUFNMV9BVEkgICAgICAgICAgICAgMHg4NzZECisjZGVmaW5lIEdMX1ZFUlRFWF9TVFJFQU0yX0FUSSAgICAgICAgICAgICAweDg3NkUKKyNkZWZpbmUgR0xfVkVSVEVYX1NUUkVBTTNfQVRJICAgICAgICAgICAgIDB4ODc2RgorI2RlZmluZSBHTF9WRVJURVhfU1RSRUFNNF9BVEkgICAgICAgICAgICAgMHg4NzcwCisjZGVmaW5lIEdMX1ZFUlRFWF9TVFJFQU01X0FUSSAgICAgICAgICAgICAweDg3NzEKKyNkZWZpbmUgR0xfVkVSVEVYX1NUUkVBTTZfQVRJICAgICAgICAgICAgIDB4ODc3MgorI2RlZmluZSBHTF9WRVJURVhfU1RSRUFNN19BVEkgICAgICAgICAgICAgMHg4NzczCisjZGVmaW5lIEdMX1ZFUlRFWF9TT1VSQ0VfQVRJICAgICAgICAgICAgICAweDg3NzQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV9lbGVtZW50X2FycmF5CisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfQVRJICAgICAgICAgICAgICAweDg3NjgKKyNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9UWVBFX0FUSSAgICAgICAgIDB4ODc2OQorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX1BPSU5URVJfQVRJICAgICAgMHg4NzZBCisjZW5kaWYKKworI2lmbmRlZiBHTF9TVU5fbWVzaF9hcnJheQorI2RlZmluZSBHTF9RVUFEX01FU0hfU1VOICAgICAgICAgICAgICAgICAgMHg4NjE0CisjZGVmaW5lIEdMX1RSSUFOR0xFX01FU0hfU1VOICAgICAgICAgICAgICAweDg2MTUKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NVTl9zbGljZV9hY2N1bQorI2RlZmluZSBHTF9TTElDRV9BQ0NVTV9TVU4gICAgICAgICAgICAgICAgMHg4NUNDCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9tdWx0aXNhbXBsZV9maWx0ZXJfaGludAorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9GSUxURVJfSElOVF9OViAgICAgMHg4NTM0CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9kZXB0aF9jbGFtcAorI2RlZmluZSBHTF9ERVBUSF9DTEFNUF9OViAgICAgICAgICAgICAgICAgMHg4NjRGCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9vY2NsdXNpb25fcXVlcnkKKyNkZWZpbmUgR0xfUElYRUxfQ09VTlRFUl9CSVRTX05WICAgICAgICAgIDB4ODg2NAorI2RlZmluZSBHTF9DVVJSRU5UX09DQ0xVU0lPTl9RVUVSWV9JRF9OViAgMHg4ODY1CisjZGVmaW5lIEdMX1BJWEVMX0NPVU5UX05WICAgICAgICAgICAgICAgICAweDg4NjYKKyNkZWZpbmUgR0xfUElYRUxfQ09VTlRfQVZBSUxBQkxFX05WICAgICAgIDB4ODg2NworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfcG9pbnRfc3ByaXRlCisjZGVmaW5lIEdMX1BPSU5UX1NQUklURV9OViAgICAgICAgICAgICAgICAweDg4NjEKKyNkZWZpbmUgR0xfQ09PUkRfUkVQTEFDRV9OViAgICAgICAgICAgICAgIDB4ODg2MgorI2RlZmluZSBHTF9QT0lOVF9TUFJJVEVfUl9NT0RFX05WICAgICAgICAgMHg4ODYzCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXh0dXJlX3NoYWRlcjMKKyNkZWZpbmUgR0xfT0ZGU0VUX1BST0pFQ1RJVkVfVEVYVFVSRV8yRF9OViAweDg4NTAKKyNkZWZpbmUgR0xfT0ZGU0VUX1BST0pFQ1RJVkVfVEVYVFVSRV8yRF9TQ0FMRV9OViAweDg4NTEKKyNkZWZpbmUgR0xfT0ZGU0VUX1BST0pFQ1RJVkVfVEVYVFVSRV9SRUNUQU5HTEVfTlYgMHg4ODUyCisjZGVmaW5lIEdMX09GRlNFVF9QUk9KRUNUSVZFX1RFWFRVUkVfUkVDVEFOR0xFX1NDQUxFX05WIDB4ODg1MworI2RlZmluZSBHTF9PRkZTRVRfSElMT19URVhUVVJFXzJEX05WICAgICAgMHg4ODU0CisjZGVmaW5lIEdMX09GRlNFVF9ISUxPX1RFWFRVUkVfUkVDVEFOR0xFX05WIDB4ODg1NQorI2RlZmluZSBHTF9PRkZTRVRfSElMT19QUk9KRUNUSVZFX1RFWFRVUkVfMkRfTlYgMHg4ODU2CisjZGVmaW5lIEdMX09GRlNFVF9ISUxPX1BST0pFQ1RJVkVfVEVYVFVSRV9SRUNUQU5HTEVfTlYgMHg4ODU3CisjZGVmaW5lIEdMX0RFUEVOREVOVF9ISUxPX1RFWFRVUkVfMkRfTlYgICAweDg4NTgKKyNkZWZpbmUgR0xfREVQRU5ERU5UX1JHQl9URVhUVVJFXzNEX05WICAgIDB4ODg1OQorI2RlZmluZSBHTF9ERVBFTkRFTlRfUkdCX1RFWFRVUkVfQ1VCRV9NQVBfTlYgMHg4ODVBCisjZGVmaW5lIEdMX0RPVF9QUk9EVUNUX1BBU1NfVEhST1VHSF9OViAgICAweDg4NUIKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfVEVYVFVSRV8xRF9OViAgICAgIDB4ODg1QworI2RlZmluZSBHTF9ET1RfUFJPRFVDVF9BRkZJTkVfREVQVEhfUkVQTEFDRV9OViAweDg4NUQKKyNkZWZpbmUgR0xfSElMTzhfTlYgICAgICAgICAgICAgICAgICAgICAgIDB4ODg1RQorI2RlZmluZSBHTF9TSUdORURfSElMTzhfTlYgICAgICAgICAgICAgICAgMHg4ODVGCisjZGVmaW5lIEdMX0ZPUkNFX0JMVUVfVE9fT05FX05WICAgICAgICAgICAweDg4NjAKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9wcm9ncmFtMV8xCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc2hhZG93X2Z1bmNzCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc3RlbmNpbF90d29fc2lkZQorI2RlZmluZSBHTF9TVEVOQ0lMX1RFU1RfVFdPX1NJREVfRVhUICAgICAgMHg4OTEwCisjZGVmaW5lIEdMX0FDVElWRV9TVEVOQ0lMX0ZBQ0VfRVhUICAgICAgICAweDg5MTEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV90ZXh0X2ZyYWdtZW50X3NoYWRlcgorI2RlZmluZSBHTF9URVhUX0ZSQUdNRU5UX1NIQURFUl9BVEkgICAgICAgMHg4MjAwCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV9jbGllbnRfc3RvcmFnZQorI2RlZmluZSBHTF9VTlBBQ0tfQ0xJRU5UX1NUT1JBR0VfQVBQTEUgICAgMHg4NUIyCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV9lbGVtZW50X2FycmF5CisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfQVBQTEUgICAgICAgICAgICAweDhBMEMKKyNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9UWVBFX0FQUExFICAgICAgIDB4OEEwRAorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX1BPSU5URVJfQVBQTEUgICAgMHg4QTBFCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV9mZW5jZQorI2RlZmluZSBHTF9EUkFXX1BJWEVMU19BUFBMRSAgICAgICAgICAgICAgMHg4QTBBCisjZGVmaW5lIEdMX0ZFTkNFX0FQUExFICAgICAgICAgICAgICAgICAgICAweDhBMEIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX3ZlcnRleF9hcnJheV9vYmplY3QKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0JJTkRJTkdfQVBQTEUgICAgIDB4ODVCNQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfdmVydGV4X2FycmF5X3JhbmdlCisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9SQU5HRV9BUFBMRSAgICAgICAweDg1MUQKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1JBTkdFX0xFTkdUSF9BUFBMRSAweDg1MUUKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1NUT1JBR0VfSElOVF9BUFBMRSAweDg1MUYKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1JBTkdFX1BPSU5URVJfQVBQTEUgMHg4NTIxCisjZGVmaW5lIEdMX1NUT1JBR0VfQ0xJRU5UX0FQUExFICAgICAgICAgICAweDg1QjQKKyNkZWZpbmUgR0xfU1RPUkFHRV9DQUNIRURfQVBQTEUgICAgICAgICAgIDB4ODVCRQorI2RlZmluZSBHTF9TVE9SQUdFX1NIQVJFRF9BUFBMRSAgICAgICAgICAgMHg4NUJGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV95Y2Jjcl80MjIKKyNkZWZpbmUgR0xfWUNCQ1JfNDIyX0FQUExFICAgICAgICAgICAgICAgIDB4ODVCOQorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF84XzhfQVBQTEUgICAgICAgMHg4NUJBCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9SRVZfQVBQTEUgICAweDg1QkIKKyNlbmRpZgorCisjaWZuZGVmIEdMX1MzX3MzdGMKKyNkZWZpbmUgR0xfUkdCX1MzVEMgICAgICAgICAgICAgICAgICAgICAgIDB4ODNBMAorI2RlZmluZSBHTF9SR0I0X1MzVEMgICAgICAgICAgICAgICAgICAgICAgMHg4M0ExCisjZGVmaW5lIEdMX1JHQkFfUzNUQyAgICAgICAgICAgICAgICAgICAgICAweDgzQTIKKyNkZWZpbmUgR0xfUkdCQTRfUzNUQyAgICAgICAgICAgICAgICAgICAgIDB4ODNBMworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX2RyYXdfYnVmZmVycworI2RlZmluZSBHTF9NQVhfRFJBV19CVUZGRVJTX0FUSSAgICAgICAgICAgMHg4ODI0CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMF9BVEkgICAgICAgICAgICAgICAweDg4MjUKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxX0FUSSAgICAgICAgICAgICAgIDB4ODgyNgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjJfQVRJICAgICAgICAgICAgICAgMHg4ODI3CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSM19BVEkgICAgICAgICAgICAgICAweDg4MjgKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI0X0FUSSAgICAgICAgICAgICAgIDB4ODgyOQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjVfQVRJICAgICAgICAgICAgICAgMHg4ODJBCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSNl9BVEkgICAgICAgICAgICAgICAweDg4MkIKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI3X0FUSSAgICAgICAgICAgICAgIDB4ODgyQworI2RlZmluZSBHTF9EUkFXX0JVRkZFUjhfQVRJICAgICAgICAgICAgICAgMHg4ODJECisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSOV9BVEkgICAgICAgICAgICAgICAweDg4MkUKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMF9BVEkgICAgICAgICAgICAgIDB4ODgyRgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjExX0FUSSAgICAgICAgICAgICAgMHg4ODMwCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTJfQVRJICAgICAgICAgICAgICAweDg4MzEKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxM19BVEkgICAgICAgICAgICAgIDB4ODgzMgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjE0X0FUSSAgICAgICAgICAgICAgMHg4ODMzCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTVfQVRJICAgICAgICAgICAgICAweDg4MzQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV9waXhlbF9mb3JtYXRfZmxvYXQKKyNkZWZpbmUgR0xfVFlQRV9SR0JBX0ZMT0FUX0FUSSAgICAgICAgICAgIDB4ODgyMAorI2RlZmluZSBHTF9DT0xPUl9DTEVBUl9VTkNMQU1QRURfVkFMVUVfQVRJIDB4ODgzNQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3RleHR1cmVfZW52X2NvbWJpbmUzCisjZGVmaW5lIEdMX01PRFVMQVRFX0FERF9BVEkgICAgICAgICAgICAgICAweDg3NDQKKyNkZWZpbmUgR0xfTU9EVUxBVEVfU0lHTkVEX0FERF9BVEkgICAgICAgIDB4ODc0NQorI2RlZmluZSBHTF9NT0RVTEFURV9TVUJUUkFDVF9BVEkgICAgICAgICAgMHg4NzQ2CisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfdGV4dHVyZV9mbG9hdAorI2RlZmluZSBHTF9SR0JBX0ZMT0FUMzJfQVRJICAgICAgICAgICAgICAgMHg4ODE0CisjZGVmaW5lIEdMX1JHQl9GTE9BVDMyX0FUSSAgICAgICAgICAgICAgICAweDg4MTUKKyNkZWZpbmUgR0xfQUxQSEFfRkxPQVQzMl9BVEkgICAgICAgICAgICAgIDB4ODgxNgorI2RlZmluZSBHTF9JTlRFTlNJVFlfRkxPQVQzMl9BVEkgICAgICAgICAgMHg4ODE3CisjZGVmaW5lIEdMX0xVTUlOQU5DRV9GTE9BVDMyX0FUSSAgICAgICAgICAweDg4MTgKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBX0ZMT0FUMzJfQVRJICAgIDB4ODgxOQorI2RlZmluZSBHTF9SR0JBX0ZMT0FUMTZfQVRJICAgICAgICAgICAgICAgMHg4ODFBCisjZGVmaW5lIEdMX1JHQl9GTE9BVDE2X0FUSSAgICAgICAgICAgICAgICAweDg4MUIKKyNkZWZpbmUgR0xfQUxQSEFfRkxPQVQxNl9BVEkgICAgICAgICAgICAgIDB4ODgxQworI2RlZmluZSBHTF9JTlRFTlNJVFlfRkxPQVQxNl9BVEkgICAgICAgICAgMHg4ODFECisjZGVmaW5lIEdMX0xVTUlOQU5DRV9GTE9BVDE2X0FUSSAgICAgICAgICAweDg4MUUKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBX0ZMT0FUMTZfQVRJICAgIDB4ODgxRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZmxvYXRfYnVmZmVyCisjZGVmaW5lIEdMX0ZMT0FUX1JfTlYgICAgICAgICAgICAgICAgICAgICAweDg4ODAKKyNkZWZpbmUgR0xfRkxPQVRfUkdfTlYgICAgICAgICAgICAgICAgICAgIDB4ODg4MQorI2RlZmluZSBHTF9GTE9BVF9SR0JfTlYgICAgICAgICAgICAgICAgICAgMHg4ODgyCisjZGVmaW5lIEdMX0ZMT0FUX1JHQkFfTlYgICAgICAgICAgICAgICAgICAweDg4ODMKKyNkZWZpbmUgR0xfRkxPQVRfUjE2X05WICAgICAgICAgICAgICAgICAgIDB4ODg4NAorI2RlZmluZSBHTF9GTE9BVF9SMzJfTlYgICAgICAgICAgICAgICAgICAgMHg4ODg1CisjZGVmaW5lIEdMX0ZMT0FUX1JHMTZfTlYgICAgICAgICAgICAgICAgICAweDg4ODYKKyNkZWZpbmUgR0xfRkxPQVRfUkczMl9OViAgICAgICAgICAgICAgICAgIDB4ODg4NworI2RlZmluZSBHTF9GTE9BVF9SR0IxNl9OViAgICAgICAgICAgICAgICAgMHg4ODg4CisjZGVmaW5lIEdMX0ZMT0FUX1JHQjMyX05WICAgICAgICAgICAgICAgICAweDg4ODkKKyNkZWZpbmUgR0xfRkxPQVRfUkdCQTE2X05WICAgICAgICAgICAgICAgIDB4ODg4QQorI2RlZmluZSBHTF9GTE9BVF9SR0JBMzJfTlYgICAgICAgICAgICAgICAgMHg4ODhCCisjZGVmaW5lIEdMX1RFWFRVUkVfRkxPQVRfQ09NUE9ORU5UU19OViAgICAweDg4OEMKKyNkZWZpbmUgR0xfRkxPQVRfQ0xFQVJfQ09MT1JfVkFMVUVfTlYgICAgIDB4ODg4RAorI2RlZmluZSBHTF9GTE9BVF9SR0JBX01PREVfTlYgICAgICAgICAgICAgMHg4ODhFCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mcmFnbWVudF9wcm9ncmFtCisjZGVmaW5lIEdMX01BWF9GUkFHTUVOVF9QUk9HUkFNX0xPQ0FMX1BBUkFNRVRFUlNfTlYgMHg4ODY4CisjZGVmaW5lIEdMX0ZSQUdNRU5UX1BST0dSQU1fTlYgICAgICAgICAgICAweDg4NzAKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfQ09PUkRTX05WICAgICAgICAgIDB4ODg3MQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9JTUFHRV9VTklUU19OViAgICAgMHg4ODcyCisjZGVmaW5lIEdMX0ZSQUdNRU5UX1BST0dSQU1fQklORElOR19OViAgICAweDg4NzMKKyNkZWZpbmUgR0xfUFJPR1JBTV9FUlJPUl9TVFJJTkdfTlYgICAgICAgIDB4ODg3NAorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfaGFsZl9mbG9hdAorI2RlZmluZSBHTF9IQUxGX0ZMT0FUX05WICAgICAgICAgICAgICAgICAgMHgxNDBCCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9waXhlbF9kYXRhX3JhbmdlCisjZGVmaW5lIEdMX1dSSVRFX1BJWEVMX0RBVEFfUkFOR0VfTlYgICAgICAweDg4NzgKKyNkZWZpbmUgR0xfUkVBRF9QSVhFTF9EQVRBX1JBTkdFX05WICAgICAgIDB4ODg3OQorI2RlZmluZSBHTF9XUklURV9QSVhFTF9EQVRBX1JBTkdFX0xFTkdUSF9OViAweDg4N0EKKyNkZWZpbmUgR0xfUkVBRF9QSVhFTF9EQVRBX1JBTkdFX0xFTkdUSF9OViAweDg4N0IKKyNkZWZpbmUgR0xfV1JJVEVfUElYRUxfREFUQV9SQU5HRV9QT0lOVEVSX05WIDB4ODg3QworI2RlZmluZSBHTF9SRUFEX1BJWEVMX0RBVEFfUkFOR0VfUE9JTlRFUl9OViAweDg4N0QKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ByaW1pdGl2ZV9yZXN0YXJ0CisjZGVmaW5lIEdMX1BSSU1JVElWRV9SRVNUQVJUX05WICAgICAgICAgICAweDg1NTgKKyNkZWZpbmUgR0xfUFJJTUlUSVZFX1JFU1RBUlRfSU5ERVhfTlYgICAgIDB4ODU1OQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4dHVyZV9leHBhbmRfbm9ybWFsCisjZGVmaW5lIEdMX1RFWFRVUkVfVU5TSUdORURfUkVNQVBfTU9ERV9OViAweDg4OEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9wcm9ncmFtMgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX21hcF9vYmplY3RfYnVmZmVyCisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfc2VwYXJhdGVfc3RlbmNpbAorI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfRlVOQ19BVEkgICAgICAgICAgMHg4ODAwCisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19GQUlMX0FUSSAgICAgICAgICAweDg4MDEKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTF9BVEkgMHg4ODAyCisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1NfQVRJIDB4ODgwMworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3ZlcnRleF9hdHRyaWJfYXJyYXlfb2JqZWN0CisjZW5kaWYKKworI2lmbmRlZiBHTF9PRVNfcmVhZF9mb3JtYXQKKyNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUyAweDhCOUEKKyNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTIDB4OEI5QgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2RlcHRoX2JvdW5kc190ZXN0CisjZGVmaW5lIEdMX0RFUFRIX0JPVU5EU19URVNUX0VYVCAgICAgICAgICAweDg4OTAKKyNkZWZpbmUgR0xfREVQVEhfQk9VTkRTX0VYVCAgICAgICAgICAgICAgIDB4ODg5MQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfbWlycm9yX2NsYW1wCisjZGVmaW5lIEdMX01JUlJPUl9DTEFNUF9FWFQgICAgICAgICAgICAgICAweDg3NDIKKyNkZWZpbmUgR0xfTUlSUk9SX0NMQU1QX1RPX0VER0VfRVhUICAgICAgIDB4ODc0MworI2RlZmluZSBHTF9NSVJST1JfQ0xBTVBfVE9fQk9SREVSX0VYVCAgICAgMHg4OTEyCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUKKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fUkdCX0VYVCAgICAgICAgIDB4ODAwOQorI2RlZmluZSBHTF9CTEVORF9FUVVBVElPTl9BTFBIQV9FWFQgICAgICAgMHg4ODNECisjZW5kaWYKKworI2lmbmRlZiBHTF9NRVNBX3BhY2tfaW52ZXJ0CisjZGVmaW5lIEdMX1BBQ0tfSU5WRVJUX01FU0EgICAgICAgICAgICAgICAweDg3NTgKKyNlbmRpZgorCisjaWZuZGVmIEdMX01FU0FfeWNiY3JfdGV4dHVyZQorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF84XzhfTUVTQSAgICAgICAgMHg4NUJBCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9SRVZfTUVTQSAgICAweDg1QkIKKyNkZWZpbmUgR0xfWUNCQ1JfTUVTQSAgICAgICAgICAgICAgICAgICAgIDB4ODc1NworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3BpeGVsX2J1ZmZlcl9vYmplY3QKKyNkZWZpbmUgR0xfUElYRUxfUEFDS19CVUZGRVJfRVhUICAgICAgICAgIDB4ODhFQgorI2RlZmluZSBHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSX0VYVCAgICAgICAgMHg4OEVDCisjZGVmaW5lIEdMX1BJWEVMX1BBQ0tfQlVGRkVSX0JJTkRJTkdfRVhUICAweDg4RUQKKyNkZWZpbmUgR0xfUElYRUxfVU5QQUNLX0JVRkZFUl9CSU5ESU5HX0VYVCAweDg4RUYKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2ZyYWdtZW50X3Byb2dyYW1fb3B0aW9uCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mcmFnbWVudF9wcm9ncmFtMgorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9FWEVDX0lOU1RSVUNUSU9OU19OViAweDg4RjQKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fQ0FMTF9ERVBUSF9OViAgICAgIDB4ODhGNQorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9JRl9ERVBUSF9OViAgICAgICAgMHg4OEY2CisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0xPT1BfREVQVEhfTlYgICAgICAweDg4RjcKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTE9PUF9DT1VOVF9OViAgICAgIDB4ODhGOAorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0yX29wdGlvbgorLyogcmV1c2UgR0xfTUFYX1BST0dSQU1fRVhFQ19JTlNUUlVDVElPTlNfTlYgKi8KKy8qIHJldXNlIEdMX01BWF9QUk9HUkFNX0NBTExfREVQVEhfTlYgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9wcm9ncmFtMworLyogcmV1c2UgR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTX0FSQiAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2ZyYW1lYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTl9FWFQgMHgwNTA2CisjZGVmaW5lIEdMX01BWF9SRU5ERVJCVUZGRVJfU0laRV9FWFQgICAgICAweDg0RTgKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQklORElOR19FWFQgICAgICAgIDB4OENBNgorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQklORElOR19FWFQgICAgICAgMHg4Q0E3CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEVfRVhUIDB4OENEMAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FX0VYVCAweDhDRDEKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMX0VYVCAweDhDRDIKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0VfRVhUIDB4OENEMworI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfM0RfWk9GRlNFVF9FWFQgMHg4Q0Q0CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFX0VYVCAgICAgICAweDhDRDUKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UX0VYVCAweDhDRDYKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlRfRVhUIDB4OENENworI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlNfRVhUIDB4OENEOQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0ZPUk1BVFNfRVhUIDB4OENEQQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RSQVdfQlVGRkVSX0VYVCAweDhDREIKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9SRUFEX0JVRkZFUl9FWFQgMHg4Q0RDCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEX0VYVCAgICAweDhDREQKKyNkZWZpbmUgR0xfTUFYX0NPTE9SX0FUVEFDSE1FTlRTX0VYVCAgICAgIDB4OENERgorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9FWFQgICAgICAgICAgMHg4Q0UwCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxX0VYVCAgICAgICAgICAweDhDRTEKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDJfRVhUICAgICAgICAgIDB4OENFMgorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UM19FWFQgICAgICAgICAgMHg4Q0UzCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ0X0VYVCAgICAgICAgICAweDhDRTQKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDVfRVhUICAgICAgICAgIDB4OENFNQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UNl9FWFQgICAgICAgICAgMHg4Q0U2CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ3X0VYVCAgICAgICAgICAweDhDRTcKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDhfRVhUICAgICAgICAgIDB4OENFOAorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UOV9FWFQgICAgICAgICAgMHg4Q0U5CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxMF9FWFQgICAgICAgICAweDhDRUEKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDExX0VYVCAgICAgICAgIDB4OENFQgorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTJfRVhUICAgICAgICAgMHg4Q0VDCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxM19FWFQgICAgICAgICAweDhDRUQKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDE0X0VYVCAgICAgICAgIDB4OENFRQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTVfRVhUICAgICAgICAgMHg4Q0VGCisjZGVmaW5lIEdMX0RFUFRIX0FUVEFDSE1FTlRfRVhUICAgICAgICAgICAweDhEMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9BVFRBQ0hNRU5UX0VYVCAgICAgICAgIDB4OEQyMAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9FWFQgICAgICAgICAgICAgICAgMHg4RDQwCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9FWFQgICAgICAgICAgICAgICAweDhENDEKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1dJRFRIX0VYVCAgICAgICAgIDB4OEQ0MgorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfSEVJR0hUX0VYVCAgICAgICAgMHg4RDQzCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9JTlRFUk5BTF9GT1JNQVRfRVhUIDB4OEQ0NAorI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYMV9FWFQgICAgICAgICAgICAgMHg4RDQ2CisjZGVmaW5lIEdMX1NURU5DSUxfSU5ERVg0X0VYVCAgICAgICAgICAgICAweDhENDcKKyNkZWZpbmUgR0xfU1RFTkNJTF9JTkRFWDhfRVhUICAgICAgICAgICAgIDB4OEQ0OAorI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYMTZfRVhUICAgICAgICAgICAgMHg4RDQ5CisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9SRURfU0laRV9FWFQgICAgICAweDhENTAKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0dSRUVOX1NJWkVfRVhUICAgIDB4OEQ1MQorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQkxVRV9TSVpFX0VYVCAgICAgMHg4RDUyCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9BTFBIQV9TSVpFX0VYVCAgICAweDhENTMKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0RFUFRIX1NJWkVfRVhUICAgIDB4OEQ1NAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFX0VYVCAgMHg4RDU1CisjZW5kaWYKKworI2lmbmRlZiBHTF9HUkVNRURZX3N0cmluZ19tYXJrZXIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9wYWNrZWRfZGVwdGhfc3RlbmNpbAorI2RlZmluZSBHTF9ERVBUSF9TVEVOQ0lMX0VYVCAgICAgICAgICAgICAgMHg4NEY5CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF8yNF84X0VYVCAgICAgICAgICAweDg0RkEKKyNkZWZpbmUgR0xfREVQVEgyNF9TVEVOQ0lMOF9FWFQgICAgICAgICAgIDB4ODhGMAorI2RlZmluZSBHTF9URVhUVVJFX1NURU5DSUxfU0laRV9FWFQgICAgICAgMHg4OEYxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc3RlbmNpbF9jbGVhcl90YWcKKyNkZWZpbmUgR0xfU1RFTkNJTF9UQUdfQklUU19FWFQgICAgICAgICAgIDB4ODhGMgorI2RlZmluZSBHTF9TVEVOQ0lMX0NMRUFSX1RBR19WQUxVRV9FWFQgICAgMHg4OEYzCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9zUkdCCisjZGVmaW5lIEdMX1NSR0JfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDhDNDAKKyNkZWZpbmUgR0xfU1JHQjhfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4OEM0MQorI2RlZmluZSBHTF9TUkdCX0FMUEhBX0VYVCAgICAgICAgICAgICAgICAgMHg4QzQyCisjZGVmaW5lIEdMX1NSR0I4X0FMUEhBOF9FWFQgICAgICAgICAgICAgICAweDhDNDMKKyNkZWZpbmUgR0xfU0xVTUlOQU5DRV9BTFBIQV9FWFQgICAgICAgICAgIDB4OEM0NAorI2RlZmluZSBHTF9TTFVNSU5BTkNFOF9BTFBIQThfRVhUICAgICAgICAgMHg4QzQ1CisjZGVmaW5lIEdMX1NMVU1JTkFOQ0VfRVhUICAgICAgICAgICAgICAgICAweDhDNDYKKyNkZWZpbmUgR0xfU0xVTUlOQU5DRThfRVhUICAgICAgICAgICAgICAgIDB4OEM0NworI2RlZmluZSBHTF9DT01QUkVTU0VEX1NSR0JfRVhUICAgICAgICAgICAgMHg4QzQ4CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQl9BTFBIQV9FWFQgICAgICAweDhDNDkKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TTFVNSU5BTkNFX0VYVCAgICAgIDB4OEM0QQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NMVU1JTkFOQ0VfQUxQSEFfRVhUIDB4OEM0QgorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NSR0JfUzNUQ19EWFQxX0VYVCAgMHg4QzRDCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDFfRVhUIDB4OEM0RAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NSR0JfQUxQSEFfUzNUQ19EWFQzX0VYVCAweDhDNEUKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCX0FMUEhBX1MzVENfRFhUNV9FWFQgMHg4QzRGCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZnJhbWVidWZmZXJfYmxpdAorI2RlZmluZSBHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCAgICAgICAgICAgMHg4Q0E4CisjZGVmaW5lIEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhUICAgICAgICAgICAweDhDQTkKKyNkZWZpbmUgR0xfRFJBV19GUkFNRUJVRkZFUl9CSU5ESU5HX0VYVCAgIEdMX0ZSQU1FQlVGRkVSX0JJTkRJTkdfRVhUCisjZGVmaW5lIEdMX1JFQURfRlJBTUVCVUZGRVJfQklORElOR19FWFQgICAweDhDQUEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfU0FNUExFU19FWFQgICAgICAgMHg4Q0FCCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTVVMVElTQU1QTEVfRVhUIDB4OEQ1NgorI2RlZmluZSBHTF9NQVhfU0FNUExFU19FWFQgICAgICAgICAgICAgICAgMHg4RDU3CisjZW5kaWYKKworI2lmbmRlZiBHTF9NRVNBWF90ZXh0dXJlX3N0YWNrCisjZGVmaW5lIEdMX1RFWFRVUkVfMURfU1RBQ0tfTUVTQVggICAgICAgICAweDg3NTkKKyNkZWZpbmUgR0xfVEVYVFVSRV8yRF9TVEFDS19NRVNBWCAgICAgICAgIDB4ODc1QQorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFXzFEX1NUQUNLX01FU0FYICAgMHg4NzVCCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfMkRfU1RBQ0tfTUVTQVggICAweDg3NUMKKyNkZWZpbmUgR0xfVEVYVFVSRV8xRF9TVEFDS19CSU5ESU5HX01FU0FYIDB4ODc1RAorI2RlZmluZSBHTF9URVhUVVJFXzJEX1NUQUNLX0JJTkRJTkdfTUVTQVggMHg4NzVFCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGltZXJfcXVlcnkKKyNkZWZpbmUgR0xfVElNRV9FTEFQU0VEX0VYVCAgICAgICAgICAgICAgIDB4ODhCRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2dwdV9wcm9ncmFtX3BhcmFtZXRlcnMKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX2ZsdXNoX2J1ZmZlcl9yYW5nZQorI2RlZmluZSBHTF9CVUZGRVJfU0VSSUFMSVpFRF9NT0RJRllfQVBQTEUgMHg4QTEyCisjZGVmaW5lIEdMX0JVRkZFUl9GTFVTSElOR19VTk1BUF9BUFBMRSAgICAweDhBMTMKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2dwdV9wcm9ncmFtNAorI2RlZmluZSBHTF9NSU5fUFJPR1JBTV9URVhFTF9PRkZTRVRfTlYgICAgMHg4OTA0CisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX1RFWEVMX09GRlNFVF9OViAgICAweDg5MDUKKyNkZWZpbmUgR0xfUFJPR1JBTV9BVFRSSUJfQ09NUE9ORU5UU19OViAgIDB4ODkwNgorI2RlZmluZSBHTF9QUk9HUkFNX1JFU1VMVF9DT01QT05FTlRTX05WICAgMHg4OTA3CisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0FUVFJJQl9DT01QT05FTlRTX05WIDB4ODkwOAorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9SRVNVTFRfQ09NUE9ORU5UU19OViAweDg5MDkKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fR0VORVJJQ19BVFRSSUJTX05WIDB4OERBNQorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9HRU5FUklDX1JFU1VMVFNfTlYgMHg4REE2CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9nZW9tZXRyeV9wcm9ncmFtNAorI2RlZmluZSBHTF9MSU5FU19BREpBQ0VOQ1lfRVhUICAgICAgICAgICAgMHgwMDBBCisjZGVmaW5lIEdMX0xJTkVfU1RSSVBfQURKQUNFTkNZX0VYVCAgICAgICAweDAwMEIKKyNkZWZpbmUgR0xfVFJJQU5HTEVTX0FESkFDRU5DWV9FWFQgICAgICAgIDB4MDAwQworI2RlZmluZSBHTF9UUklBTkdMRV9TVFJJUF9BREpBQ0VOQ1lfRVhUICAgMHgwMDBECisjZGVmaW5lIEdMX0dFT01FVFJZX1BST0dSQU1fTlYgICAgICAgICAgICAweDhDMjYKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fT1VUUFVUX1ZFUlRJQ0VTX05WIDB4OEMyNworI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9UT1RBTF9PVVRQVVRfQ09NUE9ORU5UU19OViAweDhDMjgKKyNkZWZpbmUgR0xfR0VPTUVUUllfVkVSVElDRVNfT1VUX0VYVCAgICAgIDB4OEREQQorI2RlZmluZSBHTF9HRU9NRVRSWV9JTlBVVF9UWVBFX0VYVCAgICAgICAgMHg4RERCCisjZGVmaW5lIEdMX0dFT01FVFJZX09VVFBVVF9UWVBFX0VYVCAgICAgICAweDhEREMKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX1RFWFRVUkVfSU1BR0VfVU5JVFNfRVhUIDB4OEMyOQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0xBWUVSRURfRVhUIDB4OERBNworI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0xBWUVSX1RBUkdFVFNfRVhUIDB4OERBOAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0xBWUVSX0NPVU5UX0VYVCAweDhEQTkKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xBWUVSX0VYVCAweDhDRDQKKyNkZWZpbmUgR0xfUFJPR1JBTV9QT0lOVF9TSVpFX0VYVCAgICAgICAgIDB4ODY0MgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2dlb21ldHJ5X3NoYWRlcjQKKyNkZWZpbmUgR0xfR0VPTUVUUllfU0hBREVSX0VYVCAgICAgICAgICAgIDB4OEREOQorLyogcmV1c2UgR0xfR0VPTUVUUllfVkVSVElDRVNfT1VUX0VYVCAqLworLyogcmV1c2UgR0xfR0VPTUVUUllfSU5QVVRfVFlQRV9FWFQgKi8KKy8qIHJldXNlIEdMX0dFT01FVFJZX09VVFBVVF9UWVBFX0VYVCAqLworLyogcmV1c2UgR0xfTUFYX0dFT01FVFJZX1RFWFRVUkVfSU1BR0VfVU5JVFNfRVhUICovCisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9WQVJZSU5HX0NPTVBPTkVOVFNfRVhUIDB4OERERAorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1ZBUllJTkdfQ09NUE9ORU5UU19FWFQgMHg4RERFCisjZGVmaW5lIEdMX01BWF9WQVJZSU5HX0NPTVBPTkVOVFNfRVhUICAgICAweDhCNEIKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX1VOSUZPUk1fQ09NUE9ORU5UU19FWFQgMHg4RERGCisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9PVVRQVVRfVkVSVElDRVNfRVhUIDB4OERFMAorI2RlZmluZSBHTF9NQVhfR0VPTUVUUllfVE9UQUxfT1VUUFVUX0NPTVBPTkVOVFNfRVhUIDB4OERFMQorLyogcmV1c2UgR0xfTElORVNfQURKQUNFTkNZX0VYVCAqLworLyogcmV1c2UgR0xfTElORV9TVFJJUF9BREpBQ0VOQ1lfRVhUICovCisvKiByZXVzZSBHTF9UUklBTkdMRVNfQURKQUNFTkNZX0VYVCAqLworLyogcmV1c2UgR0xfVFJJQU5HTEVfU1RSSVBfQURKQUNFTkNZX0VYVCAqLworLyogcmV1c2UgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9MQVlFUl9UQVJHRVRTX0VYVCAqLworLyogcmV1c2UgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9MQVlFUl9DT1VOVF9FWFQgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfTEFZRVJFRF9FWFQgKi8KKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MQVlFUl9FWFQgKi8KKy8qIHJldXNlIEdMX1BST0dSQU1fUE9JTlRfU0laRV9FWFQgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9wcm9ncmFtNAorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0lOVEVHRVJfTlYgMHg4OEZECisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZ3B1X3NoYWRlcjQKKyNkZWZpbmUgR0xfU0FNUExFUl8xRF9BUlJBWV9FWFQgICAgICAgICAgIDB4OERDMAorI2RlZmluZSBHTF9TQU1QTEVSXzJEX0FSUkFZX0VYVCAgICAgICAgICAgMHg4REMxCisjZGVmaW5lIEdMX1NBTVBMRVJfQlVGRkVSX0VYVCAgICAgICAgICAgICAweDhEQzIKKyNkZWZpbmUgR0xfU0FNUExFUl8xRF9BUlJBWV9TSEFET1dfRVhUICAgIDB4OERDMworI2RlZmluZSBHTF9TQU1QTEVSXzJEX0FSUkFZX1NIQURPV19FWFQgICAgMHg4REM0CisjZGVmaW5lIEdMX1NBTVBMRVJfQ1VCRV9TSEFET1dfRVhUICAgICAgICAweDhEQzUKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1ZFQzJfRVhUICAgICAgICAgIDB4OERDNgorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfVkVDM19FWFQgICAgICAgICAgMHg4REM3CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9WRUM0X0VYVCAgICAgICAgICAweDhEQzgKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfMURfRVhUICAgICAgICAgICAgIDB4OERDOQorI2RlZmluZSBHTF9JTlRfU0FNUExFUl8yRF9FWFQgICAgICAgICAgICAgMHg4RENBCisjZGVmaW5lIEdMX0lOVF9TQU1QTEVSXzNEX0VYVCAgICAgICAgICAgICAweDhEQ0IKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfQ1VCRV9FWFQgICAgICAgICAgIDB4OERDQworI2RlZmluZSBHTF9JTlRfU0FNUExFUl8yRF9SRUNUX0VYVCAgICAgICAgMHg4RENECisjZGVmaW5lIEdMX0lOVF9TQU1QTEVSXzFEX0FSUkFZX0VYVCAgICAgICAweDhEQ0UKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfMkRfQVJSQVlfRVhUICAgICAgIDB4OERDRgorI2RlZmluZSBHTF9JTlRfU0FNUExFUl9CVUZGRVJfRVhUICAgICAgICAgMHg4REQwCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzFEX0VYVCAgICAweDhERDEKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfRVhUICAgIDB4OEREMgorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8zRF9FWFQgICAgMHg4REQzCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSX0NVQkVfRVhUICAweDhERDQKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfUkVDVF9FWFQgMHg4REQ1CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzFEX0FSUkFZX0VYVCAweDhERDYKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfQVJSQVlfRVhUIDB4OERENworI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl9CVUZGRVJfRVhUIDB4OEREOAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2RyYXdfaW5zdGFuY2VkCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGFja2VkX2Zsb2F0CisjZGVmaW5lIEdMX1IxMUZfRzExRl9CMTBGX0VYVCAgICAgICAgICAgICAweDhDM0EKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzEwRl8xMUZfMTFGX1JFVl9FWFQgMHg4QzNCCisjZGVmaW5lIEdMX1JHQkFfU0lHTkVEX0NPTVBPTkVOVFNfRVhUICAgICAweDhDM0MKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2FycmF5CisjZGVmaW5lIEdMX1RFWFRVUkVfMURfQVJSQVlfRVhUICAgICAgICAgICAweDhDMTgKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV8xRF9BUlJBWV9FWFQgICAgIDB4OEMxOQorI2RlZmluZSBHTF9URVhUVVJFXzJEX0FSUkFZX0VYVCAgICAgICAgICAgMHg4QzFBCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfMkRfQVJSQVlfRVhUICAgICAweDhDMUIKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HXzFEX0FSUkFZX0VYVCAgIDB4OEMxQworI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfMkRfQVJSQVlfRVhUICAgMHg4QzFECisjZGVmaW5lIEdMX01BWF9BUlJBWV9URVhUVVJFX0xBWUVSU19FWFQgICAweDg4RkYKKyNkZWZpbmUgR0xfQ09NUEFSRV9SRUZfREVQVEhfVE9fVEVYVFVSRV9FWFQgMHg4ODRFCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEFZRVJfRVhUICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9idWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX1RFWFRVUkVfQlVGRkVSX0VYVCAgICAgICAgICAgICAweDhDMkEKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfQlVGRkVSX1NJWkVfRVhUICAgIDB4OEMyQgorI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfQlVGRkVSX0VYVCAgICAgMHg4QzJDCisjZGVmaW5lIEdMX1RFWFRVUkVfQlVGRkVSX0RBVEFfU1RPUkVfQklORElOR19FWFQgMHg4QzJECisjZGVmaW5lIEdMX1RFWFRVUkVfQlVGRkVSX0ZPUk1BVF9FWFQgICAgICAweDhDMkUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX2xhdGMKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9MVU1JTkFOQ0VfTEFUQzFfRVhUIDB4OEM3MAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NJR05FRF9MVU1JTkFOQ0VfTEFUQzFfRVhUIDB4OEM3MQorI2RlZmluZSBHTF9DT01QUkVTU0VEX0xVTUlOQU5DRV9BTFBIQV9MQVRDMl9FWFQgMHg4QzcyCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU0lHTkVEX0xVTUlOQU5DRV9BTFBIQV9MQVRDMl9FWFQgMHg4QzczCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9yZ3RjCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkVEX1JHVEMxX0VYVCAgICAgICAweDhEQkIKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TSUdORURfUkVEX1JHVEMxX0VYVCAweDhEQkMKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SRURfR1JFRU5fUkdUQzJfRVhUIDB4OERCRAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NJR05FRF9SRURfR1JFRU5fUkdUQzJfRVhUIDB4OERCRQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfc2hhcmVkX2V4cG9uZW50CisjZGVmaW5lIEdMX1JHQjlfRTVfRVhUICAgICAgICAgICAgICAgICAgICAweDhDM0QKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzVfOV85XzlfUkVWX0VYVCAgIDB4OEMzRQorI2RlZmluZSBHTF9URVhUVVJFX1NIQVJFRF9TSVpFX0VYVCAgICAgICAgMHg4QzNGCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9kZXB0aF9idWZmZXJfZmxvYXQKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMzJGX05WICAgICAgICAgIDB4OERBQgorI2RlZmluZSBHTF9ERVBUSDMyRl9TVEVOQ0lMOF9OViAgICAgICAgICAgMHg4REFDCisjZGVmaW5lIEdMX0ZMT0FUXzMyX1VOU0lHTkVEX0lOVF8yNF84X1JFVl9OViAweDhEQUQKKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0ZMT0FUX01PREVfTlYgICAgIDB4OERBRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbTQKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlX2NvdmVyYWdlCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9DT1ZFUkFHRV9TQU1QTEVTX05WIDB4OENBQgorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQ09MT1JfU0FNUExFU19OViAgMHg4RTEwCisjZGVmaW5lIEdMX01BWF9NVUxUSVNBTVBMRV9DT1ZFUkFHRV9NT0RFU19OViAweDhFMTEKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQ09WRVJBR0VfTU9ERVNfTlYgIDB4OEUxMgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2ZyYW1lYnVmZmVyX3NSR0IKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfU1JHQl9FWFQgICAgICAgICAgIDB4OERCOQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9TUkdCX0NBUEFCTEVfRVhUICAgMHg4REJBCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9nZW9tZXRyeV9zaGFkZXI0CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9wYXJhbWV0ZXJfYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9QQVJBTUVURVJfQlVGRkVSX0JJTkRJTkdTX05WIDB4OERBMAorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9QQVJBTUVURVJfQlVGRkVSX1NJWkVfTlYgMHg4REExCisjZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX1BBUkFNRVRFUl9CVUZGRVJfTlYgMHg4REEyCisjZGVmaW5lIEdMX0dFT01FVFJZX1BST0dSQU1fUEFSQU1FVEVSX0JVRkZFUl9OViAweDhEQTMKKyNkZWZpbmUgR0xfRlJBR01FTlRfUFJPR1JBTV9QQVJBTUVURVJfQlVGRkVSX05WIDB4OERBNAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2RyYXdfYnVmZmVyczIKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RyYW5zZm9ybV9mZWVkYmFjaworI2RlZmluZSBHTF9CQUNLX1BSSU1BUllfQ09MT1JfTlYgICAgICAgICAgMHg4Qzc3CisjZGVmaW5lIEdMX0JBQ0tfU0VDT05EQVJZX0NPTE9SX05WICAgICAgICAweDhDNzgKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9OViAgICAgICAgICAgICAgIDB4OEM3OQorI2RlZmluZSBHTF9DTElQX0RJU1RBTkNFX05WICAgICAgICAgICAgICAgMHg4QzdBCisjZGVmaW5lIEdMX1ZFUlRFWF9JRF9OViAgICAgICAgICAgICAgICAgICAweDhDN0IKKyNkZWZpbmUgR0xfUFJJTUlUSVZFX0lEX05WICAgICAgICAgICAgICAgIDB4OEM3QworI2RlZmluZSBHTF9HRU5FUklDX0FUVFJJQl9OViAgICAgICAgICAgICAgMHg4QzdECisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19BVFRSSUJTX05WICAweDhDN0UKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9NT0RFX05WIDB4OEM3RgorI2RlZmluZSBHTF9NQVhfVFJBTlNGT1JNX0ZFRURCQUNLX1NFUEFSQVRFX0NPTVBPTkVOVFNfTlYgMHg4QzgwCisjZGVmaW5lIEdMX0FDVElWRV9WQVJZSU5HU19OViAgICAgICAgICAgICAweDhDODEKKyNkZWZpbmUgR0xfQUNUSVZFX1ZBUllJTkdfTUFYX0xFTkdUSF9OViAgIDB4OEM4MgorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfVkFSWUlOR1NfTlYgMHg4QzgzCisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfU1RBUlRfTlYgMHg4Qzg0CisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfU0laRV9OViAweDhDODUKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX1JFQ09SRF9OViAgIDB4OEM4NgorI2RlZmluZSBHTF9QUklNSVRJVkVTX0dFTkVSQVRFRF9OViAgICAgICAgMHg4Qzg3CisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19QUklNSVRJVkVTX1dSSVRURU5fTlYgMHg4Qzg4CisjZGVmaW5lIEdMX1JBU1RFUklaRVJfRElTQ0FSRF9OViAgICAgICAgICAweDhDODkKKyNkZWZpbmUgR0xfTUFYX1RSQU5TRk9STV9GRUVEQkFDS19JTlRFUkxFQVZFRF9BVFRSSUJTX05WIDB4OEM4QQorI2RlZmluZSBHTF9NQVhfVFJBTlNGT1JNX0ZFRURCQUNLX1NFUEFSQVRFX0FUVFJJQlNfTlYgMHg4QzhCCisjZGVmaW5lIEdMX0lOVEVSTEVBVkVEX0FUVFJJQlNfTlYgICAgICAgICAweDhDOEMKKyNkZWZpbmUgR0xfU0VQQVJBVEVfQVRUUklCU19OViAgICAgICAgICAgIDB4OEM4RAorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX05WICAgMHg4QzhFCisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfQklORElOR19OViAweDhDOEYKKyNkZWZpbmUgR0xfTEFZRVJfTlYgICAgICAgICAgICAgICAgICAgICAgIDB4OERBQQorI2RlZmluZSBHTF9ORVhUX0JVRkZFUl9OViAgICAgICAgICAgICAgICAgLTIKKyNkZWZpbmUgR0xfU0tJUF9DT01QT05FTlRTNF9OViAgICAgICAgICAgIC0zCisjZGVmaW5lIEdMX1NLSVBfQ09NUE9ORU5UUzNfTlYgICAgICAgICAgICAtNAorI2RlZmluZSBHTF9TS0lQX0NPTVBPTkVOVFMyX05WICAgICAgICAgICAgLTUKKyNkZWZpbmUgR0xfU0tJUF9DT01QT05FTlRTMV9OViAgICAgICAgICAgIC02CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmluZGFibGVfdW5pZm9ybQorI2RlZmluZSBHTF9NQVhfVkVSVEVYX0JJTkRBQkxFX1VOSUZPUk1TX0VYVCAweDhERTIKKyNkZWZpbmUgR0xfTUFYX0ZSQUdNRU5UX0JJTkRBQkxFX1VOSUZPUk1TX0VYVCAweDhERTMKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX0JJTkRBQkxFX1VOSUZPUk1TX0VYVCAweDhERTQKKyNkZWZpbmUgR0xfTUFYX0JJTkRBQkxFX1VOSUZPUk1fU0laRV9FWFQgIDB4OERFRAorI2RlZmluZSBHTF9VTklGT1JNX0JVRkZFUl9FWFQgICAgICAgICAgICAgMHg4REVFCisjZGVmaW5lIEdMX1VOSUZPUk1fQlVGRkVSX0JJTkRJTkdfRVhUICAgICAweDhERUYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2ludGVnZXIKKyNkZWZpbmUgR0xfUkdCQTMyVUlfRVhUICAgICAgICAgICAgICAgICAgIDB4OEQ3MAorI2RlZmluZSBHTF9SR0IzMlVJX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4RDcxCisjZGVmaW5lIEdMX0FMUEhBMzJVSV9FWFQgICAgICAgICAgICAgICAgICAweDhENzIKKyNkZWZpbmUgR0xfSU5URU5TSVRZMzJVSV9FWFQgICAgICAgICAgICAgIDB4OEQ3MworI2RlZmluZSBHTF9MVU1JTkFOQ0UzMlVJX0VYVCAgICAgICAgICAgICAgMHg4RDc0CisjZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQTMyVUlfRVhUICAgICAgICAweDhENzUKKyNkZWZpbmUgR0xfUkdCQTE2VUlfRVhUICAgICAgICAgICAgICAgICAgIDB4OEQ3NgorI2RlZmluZSBHTF9SR0IxNlVJX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4RDc3CisjZGVmaW5lIEdMX0FMUEhBMTZVSV9FWFQgICAgICAgICAgICAgICAgICAweDhENzgKKyNkZWZpbmUgR0xfSU5URU5TSVRZMTZVSV9FWFQgICAgICAgICAgICAgIDB4OEQ3OQorI2RlZmluZSBHTF9MVU1JTkFOQ0UxNlVJX0VYVCAgICAgICAgICAgICAgMHg4RDdBCisjZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQTE2VUlfRVhUICAgICAgICAweDhEN0IKKyNkZWZpbmUgR0xfUkdCQThVSV9FWFQgICAgICAgICAgICAgICAgICAgIDB4OEQ3QworI2RlZmluZSBHTF9SR0I4VUlfRVhUICAgICAgICAgICAgICAgICAgICAgMHg4RDdECisjZGVmaW5lIEdMX0FMUEhBOFVJX0VYVCAgICAgICAgICAgICAgICAgICAweDhEN0UKKyNkZWZpbmUgR0xfSU5URU5TSVRZOFVJX0VYVCAgICAgICAgICAgICAgIDB4OEQ3RgorI2RlZmluZSBHTF9MVU1JTkFOQ0U4VUlfRVhUICAgICAgICAgICAgICAgMHg4RDgwCisjZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQThVSV9FWFQgICAgICAgICAweDhEODEKKyNkZWZpbmUgR0xfUkdCQTMySV9FWFQgICAgICAgICAgICAgICAgICAgIDB4OEQ4MgorI2RlZmluZSBHTF9SR0IzMklfRVhUICAgICAgICAgICAgICAgICAgICAgMHg4RDgzCisjZGVmaW5lIEdMX0FMUEhBMzJJX0VYVCAgICAgICAgICAgICAgICAgICAweDhEODQKKyNkZWZpbmUgR0xfSU5URU5TSVRZMzJJX0VYVCAgICAgICAgICAgICAgIDB4OEQ4NQorI2RlZmluZSBHTF9MVU1JTkFOQ0UzMklfRVhUICAgICAgICAgICAgICAgMHg4RDg2CisjZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQTMySV9FWFQgICAgICAgICAweDhEODcKKyNkZWZpbmUgR0xfUkdCQTE2SV9FWFQgICAgICAgICAgICAgICAgICAgIDB4OEQ4OAorI2RlZmluZSBHTF9SR0IxNklfRVhUICAgICAgICAgICAgICAgICAgICAgMHg4RDg5CisjZGVmaW5lIEdMX0FMUEhBMTZJX0VYVCAgICAgICAgICAgICAgICAgICAweDhEOEEKKyNkZWZpbmUgR0xfSU5URU5TSVRZMTZJX0VYVCAgICAgICAgICAgICAgIDB4OEQ4QgorI2RlZmluZSBHTF9MVU1JTkFOQ0UxNklfRVhUICAgICAgICAgICAgICAgMHg4RDhDCisjZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQTE2SV9FWFQgICAgICAgICAweDhEOEQKKyNkZWZpbmUgR0xfUkdCQThJX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4OEQ4RQorI2RlZmluZSBHTF9SR0I4SV9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4RDhGCisjZGVmaW5lIEdMX0FMUEhBOElfRVhUICAgICAgICAgICAgICAgICAgICAweDhEOTAKKyNkZWZpbmUgR0xfSU5URU5TSVRZOElfRVhUICAgICAgICAgICAgICAgIDB4OEQ5MQorI2RlZmluZSBHTF9MVU1JTkFOQ0U4SV9FWFQgICAgICAgICAgICAgICAgMHg4RDkyCisjZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQThJX0VYVCAgICAgICAgICAweDhEOTMKKyNkZWZpbmUgR0xfUkVEX0lOVEVHRVJfRVhUICAgICAgICAgICAgICAgIDB4OEQ5NAorI2RlZmluZSBHTF9HUkVFTl9JTlRFR0VSX0VYVCAgICAgICAgICAgICAgMHg4RDk1CisjZGVmaW5lIEdMX0JMVUVfSU5URUdFUl9FWFQgICAgICAgICAgICAgICAweDhEOTYKKyNkZWZpbmUgR0xfQUxQSEFfSU5URUdFUl9FWFQgICAgICAgICAgICAgIDB4OEQ5NworI2RlZmluZSBHTF9SR0JfSU5URUdFUl9FWFQgICAgICAgICAgICAgICAgMHg4RDk4CisjZGVmaW5lIEdMX1JHQkFfSU5URUdFUl9FWFQgICAgICAgICAgICAgICAweDhEOTkKKyNkZWZpbmUgR0xfQkdSX0lOVEVHRVJfRVhUICAgICAgICAgICAgICAgIDB4OEQ5QQorI2RlZmluZSBHTF9CR1JBX0lOVEVHRVJfRVhUICAgICAgICAgICAgICAgMHg4RDlCCisjZGVmaW5lIEdMX0xVTUlOQU5DRV9JTlRFR0VSX0VYVCAgICAgICAgICAweDhEOUMKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBX0lOVEVHRVJfRVhUICAgIDB4OEQ5RAorI2RlZmluZSBHTF9SR0JBX0lOVEVHRVJfTU9ERV9FWFQgICAgICAgICAgMHg4RDlFCisjZW5kaWYKKworI2lmbmRlZiBHTF9HUkVNRURZX2ZyYW1lX3Rlcm1pbmF0b3IKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2NvbmRpdGlvbmFsX3JlbmRlcgorI2RlZmluZSBHTF9RVUVSWV9XQUlUX05WICAgICAgICAgICAgICAgICAgMHg4RTEzCisjZGVmaW5lIEdMX1FVRVJZX05PX1dBSVRfTlYgICAgICAgICAgICAgICAweDhFMTQKKyNkZWZpbmUgR0xfUVVFUllfQllfUkVHSU9OX1dBSVRfTlYgICAgICAgIDB4OEUxNQorI2RlZmluZSBHTF9RVUVSWV9CWV9SRUdJT05fTk9fV0FJVF9OViAgICAgMHg4RTE2CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9wcmVzZW50X3ZpZGVvCisjZGVmaW5lIEdMX0ZSQU1FX05WICAgICAgICAgICAgICAgICAgICAgICAweDhFMjYKKyNkZWZpbmUgR0xfRklFTERTX05WICAgICAgICAgICAgICAgICAgICAgIDB4OEUyNworI2RlZmluZSBHTF9DVVJSRU5UX1RJTUVfTlYgICAgICAgICAgICAgICAgMHg4RTI4CisjZGVmaW5lIEdMX05VTV9GSUxMX1NUUkVBTVNfTlYgICAgICAgICAgICAweDhFMjkKKyNkZWZpbmUgR0xfUFJFU0VOVF9USU1FX05WICAgICAgICAgICAgICAgIDB4OEUyQQorI2RlZmluZSBHTF9QUkVTRU5UX0RVUkFUSU9OX05WICAgICAgICAgICAgMHg4RTJCCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrCisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfRVhUICAweDhDOEUKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9TVEFSVF9FWFQgMHg4Qzg0CisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfU0laRV9FWFQgMHg4Qzg1CisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfQklORElOR19FWFQgMHg4QzhGCisjZGVmaW5lIEdMX0lOVEVSTEVBVkVEX0FUVFJJQlNfRVhUICAgICAgICAweDhDOEMKKyNkZWZpbmUgR0xfU0VQQVJBVEVfQVRUUklCU19FWFQgICAgICAgICAgIDB4OEM4RAorI2RlZmluZSBHTF9QUklNSVRJVkVTX0dFTkVSQVRFRF9FWFQgICAgICAgMHg4Qzg3CisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19QUklNSVRJVkVTX1dSSVRURU5fRVhUIDB4OEM4OAorI2RlZmluZSBHTF9SQVNURVJJWkVSX0RJU0NBUkRfRVhUICAgICAgICAgMHg4Qzg5CisjZGVmaW5lIEdMX01BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfSU5URVJMRUFWRURfQ09NUE9ORU5UU19FWFQgMHg4QzhBCisjZGVmaW5lIEdMX01BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfU0VQQVJBVEVfQVRUUklCU19FWFQgMHg4QzhCCisjZGVmaW5lIEdMX01BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfU0VQQVJBVEVfQ09NUE9ORU5UU19FWFQgMHg4QzgwCisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19WQVJZSU5HU19FWFQgMHg4QzgzCisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfTU9ERV9FWFQgMHg4QzdGCisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19WQVJZSU5HX01BWF9MRU5HVEhfRVhUIDB4OEM3NgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2RpcmVjdF9zdGF0ZV9hY2Nlc3MKKyNkZWZpbmUgR0xfUFJPR1JBTV9NQVRSSVhfRVhUICAgICAgICAgICAgIDB4OEUyRAorI2RlZmluZSBHTF9UUkFOU1BPU0VfUFJPR1JBTV9NQVRSSVhfRVhUICAgMHg4RTJFCisjZGVmaW5lIEdMX1BST0dSQU1fTUFUUklYX1NUQUNLX0RFUFRIX0VYVCAweDhFMkYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF92ZXJ0ZXhfYXJyYXlfYmdyYQorLyogcmV1c2UgR0xfQkdSQSAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfc3dpenpsZQorI2RlZmluZSBHTF9URVhUVVJFX1NXSVpaTEVfUl9FWFQgICAgICAgICAgMHg4RTQyCisjZGVmaW5lIEdMX1RFWFRVUkVfU1dJWlpMRV9HX0VYVCAgICAgICAgICAweDhFNDMKKyNkZWZpbmUgR0xfVEVYVFVSRV9TV0laWkxFX0JfRVhUICAgICAgICAgIDB4OEU0NAorI2RlZmluZSBHTF9URVhUVVJFX1NXSVpaTEVfQV9FWFQgICAgICAgICAgMHg4RTQ1CisjZGVmaW5lIEdMX1RFWFRVUkVfU1dJWlpMRV9SR0JBX0VYVCAgICAgICAweDhFNDYKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2V4cGxpY2l0X211bHRpc2FtcGxlCisjZGVmaW5lIEdMX1NBTVBMRV9QT1NJVElPTl9OViAgICAgICAgICAgICAweDhFNTAKKyNkZWZpbmUgR0xfU0FNUExFX01BU0tfTlYgICAgICAgICAgICAgICAgIDB4OEU1MQorI2RlZmluZSBHTF9TQU1QTEVfTUFTS19WQUxVRV9OViAgICAgICAgICAgMHg4RTUyCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19SRU5ERVJCVUZGRVJfTlYgMHg4RTUzCisjZGVmaW5lIEdMX1RFWFRVUkVfUkVOREVSQlVGRkVSX0RBVEFfU1RPUkVfQklORElOR19OViAweDhFNTQKKyNkZWZpbmUgR0xfVEVYVFVSRV9SRU5ERVJCVUZGRVJfTlYgICAgICAgIDB4OEU1NQorI2RlZmluZSBHTF9TQU1QTEVSX1JFTkRFUkJVRkZFUl9OViAgICAgICAgMHg4RTU2CisjZGVmaW5lIEdMX0lOVF9TQU1QTEVSX1JFTkRFUkJVRkZFUl9OViAgICAweDhFNTcKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfUkVOREVSQlVGRkVSX05WIDB4OEU1OAorI2RlZmluZSBHTF9NQVhfU0FNUExFX01BU0tfV09SRFNfTlYgICAgICAgMHg4RTU5CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90cmFuc2Zvcm1fZmVlZGJhY2syCisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19OViAgICAgICAgICAweDhFMjIKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9QQVVTRURfTlYgMHg4RTIzCisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfQUNUSVZFX05WIDB4OEUyNAorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQklORElOR19OViAgMHg4RTI1CisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfbWVtaW5mbworI2RlZmluZSBHTF9WQk9fRlJFRV9NRU1PUllfQVRJICAgICAgICAgICAgMHg4N0ZCCisjZGVmaW5lIEdMX1RFWFRVUkVfRlJFRV9NRU1PUllfQVRJICAgICAgICAweDg3RkMKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0ZSRUVfTUVNT1JZX0FUSSAgIDB4ODdGRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX3BlcmZvcm1hbmNlX21vbml0b3IKKyNkZWZpbmUgR0xfQ09VTlRFUl9UWVBFX0FNRCAgICAgICAgICAgICAgIDB4OEJDMAorI2RlZmluZSBHTF9DT1VOVEVSX1JBTkdFX0FNRCAgICAgICAgICAgICAgMHg4QkMxCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVDY0X0FNRCAgICAgICAgICAgICAweDhCQzIKKyNkZWZpbmUgR0xfUEVSQ0VOVEFHRV9BTUQgICAgICAgICAgICAgICAgIDB4OEJDMworI2RlZmluZSBHTF9QRVJGTU9OX1JFU1VMVF9BVkFJTEFCTEVfQU1EICAgMHg4QkM0CisjZGVmaW5lIEdMX1BFUkZNT05fUkVTVUxUX1NJWkVfQU1EICAgICAgICAweDhCQzUKKyNkZWZpbmUgR0xfUEVSRk1PTl9SRVNVTFRfQU1EICAgICAgICAgICAgIDB4OEJDNgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX3RleHR1cmVfdGV4dHVyZTQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FNRF92ZXJ0ZXhfc2hhZGVyX3Rlc3NlbGF0b3IKKyNkZWZpbmUgR0xfU0FNUExFUl9CVUZGRVJfQU1EICAgICAgICAgICAgIDB4OTAwMQorI2RlZmluZSBHTF9JTlRfU0FNUExFUl9CVUZGRVJfQU1EICAgICAgICAgMHg5MDAyCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSX0JVRkZFUl9BTUQgMHg5MDAzCisjZGVmaW5lIEdMX1RFU1NFTExBVElPTl9NT0RFX0FNRCAgICAgICAgICAweDkwMDQKKyNkZWZpbmUgR0xfVEVTU0VMTEFUSU9OX0ZBQ1RPUl9BTUQgICAgICAgIDB4OTAwNQorI2RlZmluZSBHTF9ESVNDUkVURV9BTUQgICAgICAgICAgICAgICAgICAgMHg5MDA2CisjZGVmaW5lIEdMX0NPTlRJTlVPVVNfQU1EICAgICAgICAgICAgICAgICAweDkwMDcKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9wcm92b2tpbmdfdmVydGV4CisjZGVmaW5lIEdMX1FVQURTX0ZPTExPV19QUk9WT0tJTkdfVkVSVEVYX0NPTlZFTlRJT05fRVhUIDB4OEU0QworI2RlZmluZSBHTF9GSVJTVF9WRVJURVhfQ09OVkVOVElPTl9FWFQgICAgMHg4RTRECisjZGVmaW5lIEdMX0xBU1RfVkVSVEVYX0NPTlZFTlRJT05fRVhUICAgICAweDhFNEUKKyNkZWZpbmUgR0xfUFJPVk9LSU5HX1ZFUlRFWF9FWFQgICAgICAgICAgIDB4OEU0RgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfc25vcm0KKyNkZWZpbmUgR0xfQUxQSEFfU05PUk0gICAgICAgICAgICAgICAgICAgIDB4OTAxMAorI2RlZmluZSBHTF9MVU1JTkFOQ0VfU05PUk0gICAgICAgICAgICAgICAgMHg5MDExCisjZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQV9TTk9STSAgICAgICAgICAweDkwMTIKKyNkZWZpbmUgR0xfSU5URU5TSVRZX1NOT1JNICAgICAgICAgICAgICAgIDB4OTAxMworI2RlZmluZSBHTF9BTFBIQThfU05PUk0gICAgICAgICAgICAgICAgICAgMHg5MDE0CisjZGVmaW5lIEdMX0xVTUlOQU5DRThfU05PUk0gICAgICAgICAgICAgICAweDkwMTUKKyNkZWZpbmUgR0xfTFVNSU5BTkNFOF9BTFBIQThfU05PUk0gICAgICAgIDB4OTAxNgorI2RlZmluZSBHTF9JTlRFTlNJVFk4X1NOT1JNICAgICAgICAgICAgICAgMHg5MDE3CisjZGVmaW5lIEdMX0FMUEhBMTZfU05PUk0gICAgICAgICAgICAgICAgICAweDkwMTgKKyNkZWZpbmUgR0xfTFVNSU5BTkNFMTZfU05PUk0gICAgICAgICAgICAgIDB4OTAxOQorI2RlZmluZSBHTF9MVU1JTkFOQ0UxNl9BTFBIQTE2X1NOT1JNICAgICAgMHg5MDFBCisjZGVmaW5lIEdMX0lOVEVOU0lUWTE2X1NOT1JNICAgICAgICAgICAgICAweDkwMUIKKy8qIHJldXNlIEdMX1JFRF9TTk9STSAqLworLyogcmV1c2UgR0xfUkdfU05PUk0gKi8KKy8qIHJldXNlIEdMX1JHQl9TTk9STSAqLworLyogcmV1c2UgR0xfUkdCQV9TTk9STSAqLworLyogcmV1c2UgR0xfUjhfU05PUk0gKi8KKy8qIHJldXNlIEdMX1JHOF9TTk9STSAqLworLyogcmV1c2UgR0xfUkdCOF9TTk9STSAqLworLyogcmV1c2UgR0xfUkdCQThfU05PUk0gKi8KKy8qIHJldXNlIEdMX1IxNl9TTk9STSAqLworLyogcmV1c2UgR0xfUkcxNl9TTk9STSAqLworLyogcmV1c2UgR0xfUkdCMTZfU05PUk0gKi8KKy8qIHJldXNlIEdMX1JHQkExNl9TTk9STSAqLworLyogcmV1c2UgR0xfU0lHTkVEX05PUk1BTElaRUQgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX0FNRF9kcmF3X2J1ZmZlcnNfYmxlbmQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX3RleHR1cmVfcmFuZ2UKKyNkZWZpbmUgR0xfVEVYVFVSRV9SQU5HRV9MRU5HVEhfQVBQTEUgICAgIDB4ODVCNworI2RlZmluZSBHTF9URVhUVVJFX1JBTkdFX1BPSU5URVJfQVBQTEUgICAgMHg4NUI4CisjZGVmaW5lIEdMX1RFWFRVUkVfU1RPUkFHRV9ISU5UX0FQUExFICAgICAweDg1QkMKKyNkZWZpbmUgR0xfU1RPUkFHRV9QUklWQVRFX0FQUExFICAgICAgICAgIDB4ODVCRAorLyogcmV1c2UgR0xfU1RPUkFHRV9DQUNIRURfQVBQTEUgKi8KKy8qIHJldXNlIEdMX1NUT1JBR0VfU0hBUkVEX0FQUExFICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV9mbG9hdF9waXhlbHMKKyNkZWZpbmUgR0xfSEFMRl9BUFBMRSAgICAgICAgICAgICAgICAgICAgIDB4MTQwQgorI2RlZmluZSBHTF9SR0JBX0ZMT0FUMzJfQVBQTEUgICAgICAgICAgICAgMHg4ODE0CisjZGVmaW5lIEdMX1JHQl9GTE9BVDMyX0FQUExFICAgICAgICAgICAgICAweDg4MTUKKyNkZWZpbmUgR0xfQUxQSEFfRkxPQVQzMl9BUFBMRSAgICAgICAgICAgIDB4ODgxNgorI2RlZmluZSBHTF9JTlRFTlNJVFlfRkxPQVQzMl9BUFBMRSAgICAgICAgMHg4ODE3CisjZGVmaW5lIEdMX0xVTUlOQU5DRV9GTE9BVDMyX0FQUExFICAgICAgICAweDg4MTgKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBX0ZMT0FUMzJfQVBQTEUgIDB4ODgxOQorI2RlZmluZSBHTF9SR0JBX0ZMT0FUMTZfQVBQTEUgICAgICAgICAgICAgMHg4ODFBCisjZGVmaW5lIEdMX1JHQl9GTE9BVDE2X0FQUExFICAgICAgICAgICAgICAweDg4MUIKKyNkZWZpbmUgR0xfQUxQSEFfRkxPQVQxNl9BUFBMRSAgICAgICAgICAgIDB4ODgxQworI2RlZmluZSBHTF9JTlRFTlNJVFlfRkxPQVQxNl9BUFBMRSAgICAgICAgMHg4ODFECisjZGVmaW5lIEdMX0xVTUlOQU5DRV9GTE9BVDE2X0FQUExFICAgICAgICAweDg4MUUKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBX0ZMT0FUMTZfQVBQTEUgIDB4ODgxRgorI2RlZmluZSBHTF9DT0xPUl9GTE9BVF9BUFBMRSAgICAgICAgICAgICAgMHg4QTBGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV92ZXJ0ZXhfcHJvZ3JhbV9ldmFsdWF0b3JzCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfTUFQMV9BUFBMRSAgICAgICAweDhBMDAKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9NQVAyX0FQUExFICAgICAgIDB4OEEwMQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX01BUDFfU0laRV9BUFBMRSAgMHg4QTAyCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfTUFQMV9DT0VGRl9BUFBMRSAweDhBMDMKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9NQVAxX09SREVSX0FQUExFIDB4OEEwNAorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX01BUDFfRE9NQUlOX0FQUExFIDB4OEEwNQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX01BUDJfU0laRV9BUFBMRSAgMHg4QTA2CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfTUFQMl9DT0VGRl9BUFBMRSAweDhBMDcKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9NQVAyX09SREVSX0FQUExFIDB4OEEwOAorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX01BUDJfRE9NQUlOX0FQUExFIDB4OEEwOQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfYXV4X2RlcHRoX3N0ZW5jaWwKKyNkZWZpbmUgR0xfQVVYX0RFUFRIX1NURU5DSUxfQVBQTEUgICAgICAgIDB4OEExNAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfb2JqZWN0X3B1cmdlYWJsZQorI2RlZmluZSBHTF9CVUZGRVJfT0JKRUNUX0FQUExFICAgICAgICAgICAgMHg4NUIzCisjZGVmaW5lIEdMX1JFTEVBU0VEX0FQUExFICAgICAgICAgICAgICAgICAweDhBMTkKKyNkZWZpbmUgR0xfVk9MQVRJTEVfQVBQTEUgICAgICAgICAgICAgICAgIDB4OEExQQorI2RlZmluZSBHTF9SRVRBSU5FRF9BUFBMRSAgICAgICAgICAgICAgICAgMHg4QTFCCisjZGVmaW5lIEdMX1VOREVGSU5FRF9BUFBMRSAgICAgICAgICAgICAgICAweDhBMUMKKyNkZWZpbmUgR0xfUFVSR0VBQkxFX0FQUExFICAgICAgICAgICAgICAgIDB4OEExRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfcm93X2J5dGVzCisjZGVmaW5lIEdMX1BBQ0tfUk9XX0JZVEVTX0FQUExFICAgICAgICAgICAweDhBMTUKKyNkZWZpbmUgR0xfVU5QQUNLX1JPV19CWVRFU19BUFBMRSAgICAgICAgIDB4OEExNgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfcmdiXzQyMgorI2RlZmluZSBHTF9SR0JfNDIyX0FQUExFICAgICAgICAgICAgICAgICAgMHg4QTFGCisvKiByZXVzZSBHTF9VTlNJR05FRF9TSE9SVF84XzhfQVBQTEUgKi8KKy8qIHJldXNlIEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9SRVZfQVBQTEUgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZpZGVvX2NhcHR1cmUKKyNkZWZpbmUgR0xfVklERU9fQlVGRkVSX05WICAgICAgICAgICAgICAgIDB4OTAyMAorI2RlZmluZSBHTF9WSURFT19CVUZGRVJfQklORElOR19OViAgICAgICAgMHg5MDIxCisjZGVmaW5lIEdMX0ZJRUxEX1VQUEVSX05WICAgICAgICAgICAgICAgICAweDkwMjIKKyNkZWZpbmUgR0xfRklFTERfTE9XRVJfTlYgICAgICAgICAgICAgICAgIDB4OTAyMworI2RlZmluZSBHTF9OVU1fVklERU9fQ0FQVFVSRV9TVFJFQU1TX05WICAgMHg5MDI0CisjZGVmaW5lIEdMX05FWFRfVklERU9fQ0FQVFVSRV9CVUZGRVJfU1RBVFVTX05WIDB4OTAyNQorI2RlZmluZSBHTF9WSURFT19DQVBUVVJFX1RPXzQyMl9TVVBQT1JURURfTlYgMHg5MDI2CisjZGVmaW5lIEdMX0xBU1RfVklERU9fQ0FQVFVSRV9TVEFUVVNfTlYgICAweDkwMjcKKyNkZWZpbmUgR0xfVklERU9fQlVGRkVSX1BJVENIX05WICAgICAgICAgIDB4OTAyOAorI2RlZmluZSBHTF9WSURFT19DT0xPUl9DT05WRVJTSU9OX01BVFJJWF9OViAweDkwMjkKKyNkZWZpbmUgR0xfVklERU9fQ09MT1JfQ09OVkVSU0lPTl9NQVhfTlYgIDB4OTAyQQorI2RlZmluZSBHTF9WSURFT19DT0xPUl9DT05WRVJTSU9OX01JTl9OViAgMHg5MDJCCisjZGVmaW5lIEdMX1ZJREVPX0NPTE9SX0NPTlZFUlNJT05fT0ZGU0VUX05WIDB4OTAyQworI2RlZmluZSBHTF9WSURFT19CVUZGRVJfSU5URVJOQUxfRk9STUFUX05WIDB4OTAyRAorI2RlZmluZSBHTF9QQVJUSUFMX1NVQ0NFU1NfTlYgICAgICAgICAgICAgMHg5MDJFCisjZGVmaW5lIEdMX1NVQ0NFU1NfTlYgICAgICAgICAgICAgICAgICAgICAweDkwMkYKKyNkZWZpbmUgR0xfRkFJTFVSRV9OViAgICAgICAgICAgICAgICAgICAgIDB4OTAzMAorI2RlZmluZSBHTF9ZQ0JZQ1I4XzQyMl9OViAgICAgICAgICAgICAgICAgMHg5MDMxCisjZGVmaW5lIEdMX1lDQkFZQ1I4QV80MjI0X05WICAgICAgICAgICAgICAweDkwMzIKKyNkZWZpbmUgR0xfWjZZMTBaNkNCMTBaNlkxMFo2Q1IxMF80MjJfTlYgIDB4OTAzMworI2RlZmluZSBHTF9aNlkxMFo2Q0IxMFo2QTEwWjZZMTBaNkNSMTBaNkExMF80MjI0X05WIDB4OTAzNAorI2RlZmluZSBHTF9aNFkxMlo0Q0IxMlo0WTEyWjRDUjEyXzQyMl9OViAgMHg5MDM1CisjZGVmaW5lIEdMX1o0WTEyWjRDQjEyWjRBMTJaNFkxMlo0Q1IxMlo0QTEyXzQyMjRfTlYgMHg5MDM2CisjZGVmaW5lIEdMX1o0WTEyWjRDQjEyWjRDUjEyXzQ0NF9OViAgICAgICAweDkwMzcKKyNkZWZpbmUgR0xfVklERU9fQ0FQVFVSRV9GUkFNRV9XSURUSF9OViAgIDB4OTAzOAorI2RlZmluZSBHTF9WSURFT19DQVBUVVJFX0ZSQU1FX0hFSUdIVF9OViAgMHg5MDM5CisjZGVmaW5lIEdMX1ZJREVPX0NBUFRVUkVfRklFTERfVVBQRVJfSEVJR0hUX05WIDB4OTAzQQorI2RlZmluZSBHTF9WSURFT19DQVBUVVJFX0ZJRUxEX0xPV0VSX0hFSUdIVF9OViAweDkwM0IKKyNkZWZpbmUgR0xfVklERU9fQ0FQVFVSRV9TVVJGQUNFX09SSUdJTl9OViAweDkwM0MKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2NvcHlfaW1hZ2UKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0cworI2RlZmluZSBHTF9BQ1RJVkVfUFJPR1JBTV9FWFQgICAgICAgICAgICAgMHg4QjhECisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9wYXJhbWV0ZXJfYnVmZmVyX29iamVjdDIKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3NoYWRlcl9idWZmZXJfbG9hZAorI2RlZmluZSBHTF9CVUZGRVJfR1BVX0FERFJFU1NfTlYgICAgICAgICAgMHg4RjFECisjZGVmaW5lIEdMX0dQVV9BRERSRVNTX05WICAgICAgICAgICAgICAgICAweDhGMzQKKyNkZWZpbmUgR0xfTUFYX1NIQURFUl9CVUZGRVJfQUREUkVTU19OViAgIDB4OEYzNQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X2J1ZmZlcl91bmlmaWVkX21lbW9yeQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1VOSUZJRURfTlYgMHg4RjFFCisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfVU5JRklFRF9OViAgICAgICAweDhGMUYKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9BRERSRVNTX05WIDB4OEYyMAorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfQUREUkVTU19OViAgICAgICAgMHg4RjIxCisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9BRERSRVNTX05WICAgICAgICAweDhGMjIKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfQUREUkVTU19OViAgICAgICAgIDB4OEYyMworI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9BRERSRVNTX05WICAgICAgICAgMHg4RjI0CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfQUREUkVTU19OViAweDhGMjUKKyNkZWZpbmUgR0xfRURHRV9GTEFHX0FSUkFZX0FERFJFU1NfTlYgICAgIDB4OEYyNgorI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfQUREUkVTU19OViAweDhGMjcKKyNkZWZpbmUgR0xfRk9HX0NPT1JEX0FSUkFZX0FERFJFU1NfTlYgICAgIDB4OEYyOAorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX0FERFJFU1NfTlYgICAgICAgMHg4RjI5CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTEVOR1RIX05WICAweDhGMkEKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0xFTkdUSF9OViAgICAgICAgIDB4OEYyQgorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfTEVOR1RIX05WICAgICAgICAgMHg4RjJDCisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX0xFTkdUSF9OViAgICAgICAgICAweDhGMkQKKyNkZWZpbmUgR0xfSU5ERVhfQVJSQVlfTEVOR1RIX05WICAgICAgICAgIDB4OEYyRQorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0xFTkdUSF9OViAgMHg4RjJGCisjZGVmaW5lIEdMX0VER0VfRkxBR19BUlJBWV9MRU5HVEhfTlYgICAgICAweDhGMzAKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX0xFTkdUSF9OViAweDhGMzEKKyNkZWZpbmUgR0xfRk9HX0NPT1JEX0FSUkFZX0xFTkdUSF9OViAgICAgIDB4OEYzMgorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX0xFTkdUSF9OViAgICAgICAgMHg4RjMzCisjZGVmaW5lIEdMX0RSQVdfSU5ESVJFQ1RfVU5JRklFRF9OViAgICAgICAweDhGNDAKKyNkZWZpbmUgR0xfRFJBV19JTkRJUkVDVF9BRERSRVNTX05WICAgICAgIDB4OEY0MQorI2RlZmluZSBHTF9EUkFXX0lORElSRUNUX0xFTkdUSF9OViAgICAgICAgMHg4RjQyCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXh0dXJlX2JhcnJpZXIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FNRF9zaGFkZXJfc3RlbmNpbF9leHBvcnQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FNRF9zZWFtbGVzc19jdWJlbWFwX3Blcl90ZXh0dXJlCisvKiByZXVzZSBHTF9URVhUVVJFX0NVQkVfTUFQX1NFQU1MRVNTICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9BTURfY29uc2VydmF0aXZlX2RlcHRoCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmUKKyNkZWZpbmUgR0xfTUFYX0lNQUdFX1VOSVRTX0VYVCAgICAgICAgICAgIDB4OEYzOAorI2RlZmluZSBHTF9NQVhfQ09NQklORURfSU1BR0VfVU5JVFNfQU5EX0ZSQUdNRU5UX09VVFBVVFNfRVhUIDB4OEYzOQorI2RlZmluZSBHTF9JTUFHRV9CSU5ESU5HX05BTUVfRVhUICAgICAgICAgMHg4RjNBCisjZGVmaW5lIEdMX0lNQUdFX0JJTkRJTkdfTEVWRUxfRVhUICAgICAgICAweDhGM0IKKyNkZWZpbmUgR0xfSU1BR0VfQklORElOR19MQVlFUkVEX0VYVCAgICAgIDB4OEYzQworI2RlZmluZSBHTF9JTUFHRV9CSU5ESU5HX0xBWUVSX0VYVCAgICAgICAgMHg4RjNECisjZGVmaW5lIEdMX0lNQUdFX0JJTkRJTkdfQUNDRVNTX0VYVCAgICAgICAweDhGM0UKKyNkZWZpbmUgR0xfSU1BR0VfMURfRVhUICAgICAgICAgICAgICAgICAgIDB4OTA0QworI2RlZmluZSBHTF9JTUFHRV8yRF9FWFQgICAgICAgICAgICAgICAgICAgMHg5MDRECisjZGVmaW5lIEdMX0lNQUdFXzNEX0VYVCAgICAgICAgICAgICAgICAgICAweDkwNEUKKyNkZWZpbmUgR0xfSU1BR0VfMkRfUkVDVF9FWFQgICAgICAgICAgICAgIDB4OTA0RgorI2RlZmluZSBHTF9JTUFHRV9DVUJFX0VYVCAgICAgICAgICAgICAgICAgMHg5MDUwCisjZGVmaW5lIEdMX0lNQUdFX0JVRkZFUl9FWFQgICAgICAgICAgICAgICAweDkwNTEKKyNkZWZpbmUgR0xfSU1BR0VfMURfQVJSQVlfRVhUICAgICAgICAgICAgIDB4OTA1MgorI2RlZmluZSBHTF9JTUFHRV8yRF9BUlJBWV9FWFQgICAgICAgICAgICAgMHg5MDUzCisjZGVmaW5lIEdMX0lNQUdFX0NVQkVfTUFQX0FSUkFZX0VYVCAgICAgICAweDkwNTQKKyNkZWZpbmUgR0xfSU1BR0VfMkRfTVVMVElTQU1QTEVfRVhUICAgICAgIDB4OTA1NQorI2RlZmluZSBHTF9JTUFHRV8yRF9NVUxUSVNBTVBMRV9BUlJBWV9FWFQgMHg5MDU2CisjZGVmaW5lIEdMX0lOVF9JTUFHRV8xRF9FWFQgICAgICAgICAgICAgICAweDkwNTcKKyNkZWZpbmUgR0xfSU5UX0lNQUdFXzJEX0VYVCAgICAgICAgICAgICAgIDB4OTA1OAorI2RlZmluZSBHTF9JTlRfSU1BR0VfM0RfRVhUICAgICAgICAgICAgICAgMHg5MDU5CisjZGVmaW5lIEdMX0lOVF9JTUFHRV8yRF9SRUNUX0VYVCAgICAgICAgICAweDkwNUEKKyNkZWZpbmUgR0xfSU5UX0lNQUdFX0NVQkVfRVhUICAgICAgICAgICAgIDB4OTA1QgorI2RlZmluZSBHTF9JTlRfSU1BR0VfQlVGRkVSX0VYVCAgICAgICAgICAgMHg5MDVDCisjZGVmaW5lIEdMX0lOVF9JTUFHRV8xRF9BUlJBWV9FWFQgICAgICAgICAweDkwNUQKKyNkZWZpbmUgR0xfSU5UX0lNQUdFXzJEX0FSUkFZX0VYVCAgICAgICAgIDB4OTA1RQorI2RlZmluZSBHTF9JTlRfSU1BR0VfQ1VCRV9NQVBfQVJSQVlfRVhUICAgMHg5MDVGCisjZGVmaW5lIEdMX0lOVF9JTUFHRV8yRF9NVUxUSVNBTVBMRV9FWFQgICAweDkwNjAKKyNkZWZpbmUgR0xfSU5UX0lNQUdFXzJEX01VTFRJU0FNUExFX0FSUkFZX0VYVCAweDkwNjEKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0lNQUdFXzFEX0VYVCAgICAgIDB4OTA2MgorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfMkRfRVhUICAgICAgMHg5MDYzCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8zRF9FWFQgICAgICAweDkwNjQKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0lNQUdFXzJEX1JFQ1RfRVhUIDB4OTA2NQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfQ1VCRV9FWFQgICAgMHg5MDY2CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV9CVUZGRVJfRVhUICAweDkwNjcKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0lNQUdFXzFEX0FSUkFZX0VYVCAweDkwNjgKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0lNQUdFXzJEX0FSUkFZX0VYVCAweDkwNjkKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0lNQUdFX0NVQkVfTUFQX0FSUkFZX0VYVCAweDkwNkEKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0lNQUdFXzJEX01VTFRJU0FNUExFX0VYVCAweDkwNkIKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0lNQUdFXzJEX01VTFRJU0FNUExFX0FSUkFZX0VYVCAweDkwNkMKKyNkZWZpbmUgR0xfTUFYX0lNQUdFX1NBTVBMRVNfRVhUICAgICAgICAgIDB4OTA2RAorI2RlZmluZSBHTF9JTUFHRV9CSU5ESU5HX0ZPUk1BVF9FWFQgICAgICAgMHg5MDZFCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfQkFSUklFUl9CSVRfRVhUIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9CQVJSSUVSX0JJVF9FWFQgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0xfVU5JRk9STV9CQVJSSUVSX0JJVF9FWFQgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgR0xfVEVYVFVSRV9GRVRDSF9CQVJSSUVSX0JJVF9FWFQgIDB4MDAwMDAwMDgKKyNkZWZpbmUgR0xfU0hBREVSX0lNQUdFX0FDQ0VTU19CQVJSSUVSX0JJVF9FWFQgMHgwMDAwMDAyMAorI2RlZmluZSBHTF9DT01NQU5EX0JBUlJJRVJfQklUX0VYVCAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBHTF9QSVhFTF9CVUZGRVJfQkFSUklFUl9CSVRfRVhUICAgMHgwMDAwMDA4MAorI2RlZmluZSBHTF9URVhUVVJFX1VQREFURV9CQVJSSUVSX0JJVF9FWFQgMHgwMDAwMDEwMAorI2RlZmluZSBHTF9CVUZGRVJfVVBEQVRFX0JBUlJJRVJfQklUX0VYVCAgMHgwMDAwMDIwMAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9CQVJSSUVSX0JJVF9FWFQgICAgMHgwMDAwMDQwMAorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQkFSUklFUl9CSVRfRVhUIDB4MDAwMDA4MDAKKyNkZWZpbmUgR0xfQVRPTUlDX0NPVU5URVJfQkFSUklFUl9CSVRfRVhUIDB4MDAwMDEwMDAKKyNkZWZpbmUgR0xfQUxMX0JBUlJJRVJfQklUU19FWFQgICAgICAgICAgIDB4RkZGRkZGRkYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF92ZXJ0ZXhfYXR0cmliXzY0Yml0CisvKiByZXVzZSBHTF9ET1VCTEUgKi8KKyNkZWZpbmUgR0xfRE9VQkxFX1ZFQzJfRVhUICAgICAgICAgICAgICAgIDB4OEZGQworI2RlZmluZSBHTF9ET1VCTEVfVkVDM19FWFQgICAgICAgICAgICAgICAgMHg4RkZECisjZGVmaW5lIEdMX0RPVUJMRV9WRUM0X0VYVCAgICAgICAgICAgICAgICAweDhGRkUKKyNkZWZpbmUgR0xfRE9VQkxFX01BVDJfRVhUICAgICAgICAgICAgICAgIDB4OEY0NgorI2RlZmluZSBHTF9ET1VCTEVfTUFUM19FWFQgICAgICAgICAgICAgICAgMHg4RjQ3CisjZGVmaW5lIEdMX0RPVUJMRV9NQVQ0X0VYVCAgICAgICAgICAgICAgICAweDhGNDgKKyNkZWZpbmUgR0xfRE9VQkxFX01BVDJ4M19FWFQgICAgICAgICAgICAgIDB4OEY0OQorI2RlZmluZSBHTF9ET1VCTEVfTUFUMng0X0VYVCAgICAgICAgICAgICAgMHg4RjRBCisjZGVmaW5lIEdMX0RPVUJMRV9NQVQzeDJfRVhUICAgICAgICAgICAgICAweDhGNEIKKyNkZWZpbmUgR0xfRE9VQkxFX01BVDN4NF9FWFQgICAgICAgICAgICAgIDB4OEY0QworI2RlZmluZSBHTF9ET1VCTEVfTUFUNHgyX0VYVCAgICAgICAgICAgICAgMHg4RjRECisjZGVmaW5lIEdMX0RPVUJMRV9NQVQ0eDNfRVhUICAgICAgICAgICAgICAweDhGNEUKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2dwdV9wcm9ncmFtNQorI2RlZmluZSBHTF9NQVhfR0VPTUVUUllfUFJPR1JBTV9JTlZPQ0FUSU9OU19OViAweDhFNUEKKyNkZWZpbmUgR0xfTUlOX0ZSQUdNRU5UX0lOVEVSUE9MQVRJT05fT0ZGU0VUX05WIDB4OEU1QgorI2RlZmluZSBHTF9NQVhfRlJBR01FTlRfSU5URVJQT0xBVElPTl9PRkZTRVRfTlYgMHg4RTVDCisjZGVmaW5lIEdMX0ZSQUdNRU5UX1BST0dSQU1fSU5URVJQT0xBVElPTl9PRkZTRVRfQklUU19OViAweDhFNUQKKyNkZWZpbmUgR0xfTUlOX1BST0dSQU1fVEVYVFVSRV9HQVRIRVJfT0ZGU0VUX05WIDB4OEU1RQorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9URVhUVVJFX0dBVEhFUl9PRkZTRVRfTlYgMHg4RTVGCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX1NVQlJPVVRJTkVfUEFSQU1FVEVSU19OViAweDhGNDQKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fU1VCUk9VVElORV9OVU1fTlYgIDB4OEY0NQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZ3B1X3NoYWRlcjUKKyNkZWZpbmUgR0xfSU5UNjRfTlYgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwRQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlQ2NF9OViAgICAgICAgICAgICAgMHgxNDBGCisjZGVmaW5lIEdMX0lOVDhfTlYgICAgICAgICAgICAgICAgICAgICAgICAweDhGRTAKKyNkZWZpbmUgR0xfSU5UOF9WRUMyX05WICAgICAgICAgICAgICAgICAgIDB4OEZFMQorI2RlZmluZSBHTF9JTlQ4X1ZFQzNfTlYgICAgICAgICAgICAgICAgICAgMHg4RkUyCisjZGVmaW5lIEdMX0lOVDhfVkVDNF9OViAgICAgICAgICAgICAgICAgICAweDhGRTMKKyNkZWZpbmUgR0xfSU5UMTZfTlYgICAgICAgICAgICAgICAgICAgICAgIDB4OEZFNAorI2RlZmluZSBHTF9JTlQxNl9WRUMyX05WICAgICAgICAgICAgICAgICAgMHg4RkU1CisjZGVmaW5lIEdMX0lOVDE2X1ZFQzNfTlYgICAgICAgICAgICAgICAgICAweDhGRTYKKyNkZWZpbmUgR0xfSU5UMTZfVkVDNF9OViAgICAgICAgICAgICAgICAgIDB4OEZFNworI2RlZmluZSBHTF9JTlQ2NF9WRUMyX05WICAgICAgICAgICAgICAgICAgMHg4RkU5CisjZGVmaW5lIEdMX0lOVDY0X1ZFQzNfTlYgICAgICAgICAgICAgICAgICAweDhGRUEKKyNkZWZpbmUgR0xfSU5UNjRfVkVDNF9OViAgICAgICAgICAgICAgICAgIDB4OEZFQgorI2RlZmluZSBHTF9VTlNJR05FRF9JTlQ4X05WICAgICAgICAgICAgICAgMHg4RkVDCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVDhfVkVDMl9OViAgICAgICAgICAweDhGRUQKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UOF9WRUMzX05WICAgICAgICAgIDB4OEZFRQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlQ4X1ZFQzRfTlYgICAgICAgICAgMHg4RkVGCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVDE2X05WICAgICAgICAgICAgICAweDhGRjAKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UMTZfVkVDMl9OViAgICAgICAgIDB4OEZGMQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlQxNl9WRUMzX05WICAgICAgICAgMHg4RkYyCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVDE2X1ZFQzRfTlYgICAgICAgICAweDhGRjMKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UNjRfVkVDMl9OViAgICAgICAgIDB4OEZGNQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlQ2NF9WRUMzX05WICAgICAgICAgMHg4RkY2CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVDY0X1ZFQzRfTlYgICAgICAgICAweDhGRjcKKyNkZWZpbmUgR0xfRkxPQVQxNl9OViAgICAgICAgICAgICAgICAgICAgIDB4OEZGOAorI2RlZmluZSBHTF9GTE9BVDE2X1ZFQzJfTlYgICAgICAgICAgICAgICAgMHg4RkY5CisjZGVmaW5lIEdMX0ZMT0FUMTZfVkVDM19OViAgICAgICAgICAgICAgICAweDhGRkEKKyNkZWZpbmUgR0xfRkxPQVQxNl9WRUM0X05WICAgICAgICAgICAgICAgIDB4OEZGQgorLyogcmV1c2UgR0xfUEFUQ0hFUyAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfc2hhZGVyX2J1ZmZlcl9zdG9yZQorI2RlZmluZSBHTF9TSEFERVJfR0xPQkFMX0FDQ0VTU19CQVJSSUVSX0JJVF9OViAweDAwMDAwMDEwCisvKiByZXVzZSBHTF9SRUFEX1dSSVRFICovCisvKiByZXVzZSBHTF9XUklURV9PTkxZICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXNzZWxsYXRpb25fcHJvZ3JhbTUKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fUEFUQ0hfQVRUUklCU19OViAgIDB4ODZEOAorI2RlZmluZSBHTF9URVNTX0NPTlRST0xfUFJPR1JBTV9OViAgICAgICAgMHg4OTFFCisjZGVmaW5lIEdMX1RFU1NfRVZBTFVBVElPTl9QUk9HUkFNX05WICAgICAweDg5MUYKKyNkZWZpbmUgR0xfVEVTU19DT05UUk9MX1BST0dSQU1fUEFSQU1FVEVSX0JVRkZFUl9OViAweDhDNzQKKyNkZWZpbmUgR0xfVEVTU19FVkFMVUFUSU9OX1BST0dSQU1fUEFSQU1FVEVSX0JVRkZFUl9OViAweDhDNzUKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9hdHRyaWJfaW50ZWdlcl82NGJpdAorLyogcmV1c2UgR0xfSU5UNjRfTlYgKi8KKy8qIHJldXNlIEdMX1VOU0lHTkVEX0lOVDY0X05WICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9tdWx0aXNhbXBsZV9jb3ZlcmFnZQorI2RlZmluZSBHTF9DT1ZFUkFHRV9TQU1QTEVTX05WICAgICAgICAgICAgMHg4MEE5CisjZGVmaW5lIEdMX0NPTE9SX1NBTVBMRVNfTlYgICAgICAgICAgICAgICAweDhFMjAKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FNRF9uYW1lX2dlbl9kZWxldGUKKyNkZWZpbmUgR0xfREFUQV9CVUZGRVJfQU1EICAgICAgICAgICAgICAgIDB4OTE1MQorI2RlZmluZSBHTF9QRVJGT1JNQU5DRV9NT05JVE9SX0FNRCAgICAgICAgMHg5MTUyCisjZGVmaW5lIEdMX1FVRVJZX09CSkVDVF9BTUQgICAgICAgICAgICAgICAweDkxNTMKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX09CSkVDVF9BTUQgICAgICAgIDB4OTE1NAorI2RlZmluZSBHTF9TQU1QTEVSX09CSkVDVF9BTUQgICAgICAgICAgICAgMHg5MTU1CisjZW5kaWYKKworI2lmbmRlZiBHTF9BTURfZGVidWdfb3V0cHV0CisjZGVmaW5lIEdMX01BWF9ERUJVR19MT0dHRURfTUVTU0FHRVNfQU1EICAweDkxNDQKKyNkZWZpbmUgR0xfREVCVUdfTE9HR0VEX01FU1NBR0VTX0FNRCAgICAgIDB4OTE0NQorI2RlZmluZSBHTF9ERUJVR19TRVZFUklUWV9ISUdIX0FNRCAgICAgICAgMHg5MTQ2CisjZGVmaW5lIEdMX0RFQlVHX1NFVkVSSVRZX01FRElVTV9BTUQgICAgICAweDkxNDcKKyNkZWZpbmUgR0xfREVCVUdfU0VWRVJJVFlfTE9XX0FNRCAgICAgICAgIDB4OTE0OAorI2RlZmluZSBHTF9ERUJVR19DQVRFR09SWV9BUElfRVJST1JfQU1EICAgMHg5MTQ5CisjZGVmaW5lIEdMX0RFQlVHX0NBVEVHT1JZX1dJTkRPV19TWVNURU1fQU1EIDB4OTE0QQorI2RlZmluZSBHTF9ERUJVR19DQVRFR09SWV9ERVBSRUNBVElPTl9BTUQgMHg5MTRCCisjZGVmaW5lIEdMX0RFQlVHX0NBVEVHT1JZX1VOREVGSU5FRF9CRUhBVklPUl9BTUQgMHg5MTRDCisjZGVmaW5lIEdMX0RFQlVHX0NBVEVHT1JZX1BFUkZPUk1BTkNFX0FNRCAweDkxNEQKKyNkZWZpbmUgR0xfREVCVUdfQ0FURUdPUllfU0hBREVSX0NPTVBJTEVSX0FNRCAweDkxNEUKKyNkZWZpbmUgR0xfREVCVUdfQ0FURUdPUllfQVBQTElDQVRJT05fQU1EIDB4OTE0RgorI2RlZmluZSBHTF9ERUJVR19DQVRFR09SWV9PVEhFUl9BTUQgICAgICAgMHg5MTUwCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92ZHBhdV9pbnRlcm9wCisjZGVmaW5lIEdMX1NVUkZBQ0VfU1RBVEVfTlYgICAgICAgICAgICAgICAweDg2RUIKKyNkZWZpbmUgR0xfU1VSRkFDRV9SRUdJU1RFUkVEX05WICAgICAgICAgIDB4ODZGRAorI2RlZmluZSBHTF9TVVJGQUNFX01BUFBFRF9OViAgICAgICAgICAgICAgMHg4NzAwCisjZGVmaW5lIEdMX1dSSVRFX0RJU0NBUkRfTlYgICAgICAgICAgICAgICAweDg4QkUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FNRF90cmFuc2Zvcm1fZmVlZGJhY2szX2xpbmVzX3RyaWFuZ2xlcworI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX2RlcHRoX2NsYW1wX3NlcGFyYXRlCisjZGVmaW5lIEdMX0RFUFRIX0NMQU1QX05FQVJfQU1EICAgICAgICAgICAweDkwMUUKKyNkZWZpbmUgR0xfREVQVEhfQ0xBTVBfRkFSX0FNRCAgICAgICAgICAgIDB4OTAxRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfc1JHQl9kZWNvZGUKKyNkZWZpbmUgR0xfVEVYVFVSRV9TUkdCX0RFQ09ERV9FWFQgICAgICAgIDB4OEE0OAorI2RlZmluZSBHTF9ERUNPREVfRVhUICAgICAgICAgICAgICAgICAgICAgMHg4QTQ5CisjZGVmaW5lIEdMX1NLSVBfREVDT0RFX0VYVCAgICAgICAgICAgICAgICAweDhBNEEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT1ZFUkFHRV9TQU1QTEVTX05WICAgIDB4OTA0NQorI2RlZmluZSBHTF9URVhUVVJFX0NPTE9SX1NBTVBMRVNfTlYgICAgICAgMHg5MDQ2CisjZW5kaWYKKworI2lmbmRlZiBHTF9BTURfYmxlbmRfbWlubWF4X2ZhY3RvcgorI2RlZmluZSBHTF9GQUNUT1JfTUlOX0FNRCAgICAgICAgICAgICAgICAgMHg5MDFDCisjZGVmaW5lIEdMX0ZBQ1RPUl9NQVhfQU1EICAgICAgICAgICAgICAgICAweDkwMUQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FNRF9zYW1wbGVfcG9zaXRpb25zCisjZGVmaW5lIEdMX1NVQlNBTVBMRV9ESVNUQU5DRV9BTUQgICAgICAgICAweDg4M0YKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF94MTFfc3luY19vYmplY3QKKyNkZWZpbmUgR0xfU1lOQ19YMTFfRkVOQ0VfRVhUICAgICAgICAgICAgIDB4OTBFMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX211bHRpX2RyYXdfaW5kaXJlY3QKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZV9ibGl0X3NjYWxlZAorI2RlZmluZSBHTF9TQ0FMRURfUkVTT0xWRV9GQVNURVNUX0VYVCAgICAgMHg5MEJBCisjZGVmaW5lIEdMX1NDQUxFRF9SRVNPTFZFX05JQ0VTVF9FWFQgICAgICAweDkwQkIKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaWZuZGVmIEdMX1ZFUlNJT05fMl8wCisvKiBHTCB0eXBlIGZvciBwcm9ncmFtL3NoYWRlciB0ZXh0ICovCit0eXBlZGVmIGNoYXIgR0xjaGFyOworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8xXzUKKy8qIEdMIHR5cGVzIGZvciBoYW5kbGluZyBsYXJnZSB2ZXJ0ZXggYnVmZmVyIG9iamVjdHMgKi8KK3R5cGVkZWYgcHRyZGlmZl90IEdMaW50cHRyOwordHlwZWRlZiBwdHJkaWZmX3QgR0xzaXplaXB0cjsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfYnVmZmVyX29iamVjdAorLyogR0wgdHlwZXMgZm9yIGhhbmRsaW5nIGxhcmdlIHZlcnRleCBidWZmZXIgb2JqZWN0cyAqLwordHlwZWRlZiBwdHJkaWZmX3QgR0xpbnRwdHJBUkI7Cit0eXBlZGVmIHB0cmRpZmZfdCBHTHNpemVpcHRyQVJCOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRlcl9vYmplY3RzCisvKiBHTCB0eXBlcyBmb3IgcHJvZ3JhbS9zaGFkZXIgdGV4dCBhbmQgc2hhZGVyIG9iamVjdCBoYW5kbGVzICovCit0eXBlZGVmIGNoYXIgR0xjaGFyQVJCOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgR0xoYW5kbGVBUkI7CisjZW5kaWYKKworLyogR0wgdHlwZSBmb3IgImhhbGYiIHByZWNpc2lvbiAoczEwZTUpIGZsb2F0IGRhdGEgaW4gaG9zdCBtZW1vcnkgKi8KKyNpZm5kZWYgR0xfQVJCX2hhbGZfZmxvYXRfcGl4ZWwKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgR0xoYWxmQVJCOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfaGFsZl9mbG9hdAordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBHTGhhbGZOVjsKKyNlbmRpZgorCisjaWZuZGVmIEdMRVhUXzY0X1RZUEVTX0RFRklORUQKKy8qIFRoaXMgY29kZSBibG9jayBpcyBkdXBsaWNhdGVkIGluIGdseGV4dC5oLCBzbyBtdXN0IGJlIHByb3RlY3RlZCAqLworI2RlZmluZSBHTEVYVF82NF9UWVBFU19ERUZJTkVECisvKiBEZWZpbmUgaW50MzJfdCwgaW50NjRfdCwgYW5kIHVpbnQ2NF90IHR5cGVzIGZvciBVU1QvTVNDICovCisvKiAoYXMgdXNlZCBpbiB0aGUgR0xfRVhUX3RpbWVyX3F1ZXJ5IGV4dGVuc2lvbikuICovCisjaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VsaWYgZGVmaW5lZChfX3N1bl9fKSB8fCBkZWZpbmVkKF9fZGlnaXRhbF9fKQorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaWYgZGVmaW5lZChfX1NURENfXykKKyNpZiBkZWZpbmVkKF9fYXJjaDY0X18pIHx8IGRlZmluZWQoX0xQNjQpCit0eXBlZGVmIGxvbmcgaW50IGludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHVpbnQ2NF90OworI2Vsc2UKK3R5cGVkZWYgbG9uZyBsb25nIGludCBpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHVpbnQ2NF90OworI2VuZGlmIC8qIF9fYXJjaDY0X18gKi8KKyNlbmRpZiAvKiBfX1NURENfXyAqLworI2VsaWYgZGVmaW5lZCggX19WTVMgKSB8fCBkZWZpbmVkKF9fc2dpKQorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZWxpZiBkZWZpbmVkKF9fU0NPX18pIHx8IGRlZmluZWQoX19VU0xDX18pCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZWxpZiBkZWZpbmVkKF9fVU5JWE9TMl9fKSB8fCBkZWZpbmVkKF9fU09MNjRfXykKK3R5cGVkZWYgbG9uZyBpbnQgaW50MzJfdDsKK3R5cGVkZWYgbG9uZyBsb25nIGludCBpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHVpbnQ2NF90OworI2VsaWYgZGVmaW5lZChfV0lOMzIpICYmIGRlZmluZWQoX19HTlVDX18pCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZWxpZiBkZWZpbmVkKF9XSU4zMikKK3R5cGVkZWYgX19pbnQzMiBpbnQzMl90OwordHlwZWRlZiBfX2ludDY0IGludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdWludDY0X3Q7CisjZWxzZQorLyogRmFsbGJhY2sgaWYgbm90aGluZyBhYm92ZSB3b3JrcyAqLworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90aW1lcl9xdWVyeQordHlwZWRlZiBpbnQ2NF90IEdMaW50NjRFWFQ7Cit0eXBlZGVmIHVpbnQ2NF90IEdMdWludDY0RVhUOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3N5bmMKK3R5cGVkZWYgaW50NjRfdCBHTGludDY0OwordHlwZWRlZiB1aW50NjRfdCBHTHVpbnQ2NDsKK3R5cGVkZWYgc3RydWN0IF9fR0xzeW5jICpHTHN5bmM7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfY2xfZXZlbnQKKy8qIFRoZXNlIGluY29tcGxldGUgdHlwZXMgbGV0IHVzIGRlY2xhcmUgdHlwZXMgY29tcGF0aWJsZSB3aXRoIE9wZW5DTCdzIGNsX2NvbnRleHQgYW5kIGNsX2V2ZW50ICovCitzdHJ1Y3QgX2NsX2NvbnRleHQ7CitzdHJ1Y3QgX2NsX2V2ZW50OworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2RlYnVnX291dHB1dAordHlwZWRlZiB2b2lkIChBUElFTlRSWSAqR0xERUJVR1BST0NBUkIpKEdMZW51bSBzb3VyY2UsR0xlbnVtIHR5cGUsR0x1aW50IGlkLEdMZW51bSBzZXZlcml0eSxHTHNpemVpIGxlbmd0aCxjb25zdCBHTGNoYXIgKm1lc3NhZ2UsR0x2b2lkICp1c2VyUGFyYW0pOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX2RlYnVnX291dHB1dAordHlwZWRlZiB2b2lkIChBUElFTlRSWSAqR0xERUJVR1BST0NBTUQpKEdMdWludCBpZCxHTGVudW0gY2F0ZWdvcnksR0xlbnVtIHNldmVyaXR5LEdMc2l6ZWkgbGVuZ3RoLGNvbnN0IEdMY2hhciAqbWVzc2FnZSxHTHZvaWQgKnVzZXJQYXJhbSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92ZHBhdV9pbnRlcm9wCit0eXBlZGVmIEdMaW50cHRyIEdMdmRwYXVTdXJmYWNlTlY7CisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzFfMgorI2RlZmluZSBHTF9WRVJTSU9OXzFfMiAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kQ29sb3IgKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uIChHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd1JhbmdlRWxlbWVudHMgKEdMZW51bSBtb2RlLCBHTHVpbnQgc3RhcnQsIEdMdWludCBlbmQsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEltYWdlM0QgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhTdWJJbWFnZTNEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlM0QgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVORENPTE9SUFJPQykgKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkxFTkRFUVVBVElPTlBST0MpIChHTGVudW0gbW9kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdSQU5HRUVMRU1FTlRTUFJPQykgKEdMZW51bSBtb2RlLCBHTHVpbnQgc3RhcnQsIEdMdWludCBlbmQsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhJTUFHRTNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYU1VCSU1BR0UzRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlURVhTVUJJTUFHRTNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzFfMl9ERVBSRUNBVEVECisjZGVmaW5lIEdMX1ZFUlNJT05fMV8yX0RFUFJFQ0FURUQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclRhYmxlIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnRhYmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclRhYmxlUGFyYW1ldGVyZnYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclRhYmxlUGFyYW1ldGVyaXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weUNvbG9yVGFibGUgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29sb3JUYWJsZSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdGFibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbG9yVGFibGVQYXJhbWV0ZXJmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbG9yVGFibGVQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclN1YlRhYmxlIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHN0YXJ0LCBHTHNpemVpIGNvdW50LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5Q29sb3JTdWJUYWJsZSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzdGFydCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25GaWx0ZXIxRCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbWFnZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25GaWx0ZXIyRCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW1hZ2UpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyZiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyaSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyaXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weUNvbnZvbHV0aW9uRmlsdGVyMUQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weUNvbnZvbHV0aW9uRmlsdGVyMkQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbnZvbHV0aW9uRmlsdGVyIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICppbWFnZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29udm9sdXRpb25QYXJhbWV0ZXJmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbnZvbHV0aW9uUGFyYW1ldGVyaXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0U2VwYXJhYmxlRmlsdGVyIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpyb3csIEdMdm9pZCAqY29sdW1uLCBHTHZvaWQgKnNwYW4pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlcGFyYWJsZUZpbHRlcjJEIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpyb3csIGNvbnN0IEdMdm9pZCAqY29sdW1uKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRIaXN0b2dyYW0gKEdMZW51bSB0YXJnZXQsIEdMYm9vbGVhbiByZXNldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdmFsdWVzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRIaXN0b2dyYW1QYXJhbWV0ZXJmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEhpc3RvZ3JhbVBhcmFtZXRlcml2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE1pbm1heCAoR0xlbnVtIHRhcmdldCwgR0xib29sZWFuIHJlc2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp2YWx1ZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE1pbm1heFBhcmFtZXRlcmZ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWlubWF4UGFyYW1ldGVyaXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSGlzdG9ncmFtIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMYm9vbGVhbiBzaW5rKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNaW5tYXggKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xib29sZWFuIHNpbmspOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlc2V0SGlzdG9ncmFtIChHTGVudW0gdGFyZ2V0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXNldE1pbm1heCAoR0xlbnVtIHRhcmdldCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlRBQkxFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqdGFibGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlRBQkxFUEFSQU1FVEVSRlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlRBQkxFUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWUNPTE9SVEFCTEVQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09MT1JUQUJMRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp0YWJsZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTE9SVEFCTEVQQVJBTUVURVJGVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTE9SVEFCTEVQQVJBTUVURVJJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlNVQlRBQkxFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc3RhcnQsIEdMc2l6ZWkgY291bnQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZQ09MT1JTVUJUQUJMRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHN0YXJ0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05GSUxURVIxRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmltYWdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05GSUxURVIyRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbWFnZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9OUEFSQU1FVEVSRlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05QQVJBTUVURVJGVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9OUEFSQU1FVEVSSVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9OUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWUNPTlZPTFVUSU9ORklMVEVSMURQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWUNPTlZPTFVUSU9ORklMVEVSMkRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTlZPTFVUSU9ORklMVEVSUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKmltYWdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09OVk9MVVRJT05QQVJBTUVURVJGVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTlZPTFVUSU9OUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUU0VQQVJBQkxFRklMVEVSUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnJvdywgR0x2b2lkICpjb2x1bW4sIEdMdm9pZCAqc3Bhbik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFUEFSQUJMRUZJTFRFUjJEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnJvdywgY29uc3QgR0x2b2lkICpjb2x1bW4pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRISVNUT0dSQU1QUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xib29sZWFuIHJlc2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp2YWx1ZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRISVNUT0dSQU1QQVJBTUVURVJGVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEhJU1RPR1JBTVBBUkFNRVRFUklWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1JTk1BWFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGJvb2xlYW4gcmVzZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnZhbHVlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1JTk1BWFBBUkFNRVRFUkZWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTUlOTUFYUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSElTVE9HUkFNUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xib29sZWFuIHNpbmspOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNSU5NQVhQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGJvb2xlYW4gc2luayk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFU0VUSElTVE9HUkFNUFJPQykgKEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVNFVE1JTk1BWFBST0MpIChHTGVudW0gdGFyZ2V0KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fMV8zCisjZGVmaW5lIEdMX1ZFUlNJT05fMV8zIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWN0aXZlVGV4dHVyZSAoR0xlbnVtIHRleHR1cmUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZUNvdmVyYWdlIChHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleEltYWdlM0QgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UxRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UxRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbXByZXNzZWRUZXhJbWFnZSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMdm9pZCAqaW1nKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEFDVElWRVRFWFRVUkVQUk9DKSAoR0xlbnVtIHRleHR1cmUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVDT1ZFUkFHRVBST0MpIChHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhJTUFHRTNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYSU1BR0UyRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWElNQUdFMURQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFNVQklNQUdFM0RQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFNVQklNQUdFMkRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFNVQklNQUdFMURQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT01QUkVTU0VEVEVYSU1BR0VQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMdm9pZCAqaW1nKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fMV8zX0RFUFJFQ0FURUQKKyNkZWZpbmUgR0xfVkVSU0lPTl8xXzNfREVQUkVDQVRFRCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsaWVudEFjdGl2ZVRleHR1cmUgKEdMZW51bSB0ZXh0dXJlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWQgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxZHYgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWYgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFmdiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWl2IChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFzIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxc3YgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyZCAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJkdiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyZiAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyZnYgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyaSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJpdiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQycyAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyc3YgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzZCAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCwgR0xkb3VibGUgcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNkdiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzZiAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNmdiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0LCBHTGludCByKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2l2IChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNzIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM3N2IChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGQgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIsIEdMZG91YmxlIHEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZHYgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGYgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRmdiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0LCBHTGludCByLCBHTGludCBxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGl2IChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRzIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByLCBHTHNob3J0IHEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0c3YgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvYWRUcmFuc3Bvc2VNYXRyaXhmIChjb25zdCBHTGZsb2F0ICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkVHJhbnNwb3NlTWF0cml4ZCAoY29uc3QgR0xkb3VibGUgKm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRUcmFuc3Bvc2VNYXRyaXhmIChjb25zdCBHTGZsb2F0ICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0VHJhbnNwb3NlTWF0cml4ZCAoY29uc3QgR0xkb3VibGUgKm0pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ0xJRU5UQUNUSVZFVEVYVFVSRVBST0MpIChHTGVudW0gdGV4dHVyZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFEVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxRlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUZWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUlQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFTVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkRWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJGUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJGVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJJUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IHMsIEdMaW50IHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMklWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJTVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0RWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNGUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0ZWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0lQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM1NQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQsIEdMc2hvcnQgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzU1ZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0RFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzLCBHTGRvdWJsZSB0LCBHTGRvdWJsZSByLCBHTGRvdWJsZSBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDREVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0RlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENEZWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENElQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgciwgR0xpbnQgcSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0SVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENFNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQsIEdMc2hvcnQgciwgR0xzaG9ydCBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRTVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTE9BRFRSQU5TUE9TRU1BVFJJWEZQUk9DKSAoY29uc3QgR0xmbG9hdCAqbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExPQURUUkFOU1BPU0VNQVRSSVhEUFJPQykgKGNvbnN0IEdMZG91YmxlICptKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVFRSQU5TUE9TRU1BVFJJWEZQUk9DKSAoY29uc3QgR0xmbG9hdCAqbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRUUkFOU1BPU0VNQVRSSVhEUFJPQykgKGNvbnN0IEdMZG91YmxlICptKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fMV80CisjZGVmaW5lIEdMX1ZFUlNJT05fMV80IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRGdW5jU2VwYXJhdGUgKEdMZW51bSBzZmFjdG9yUkdCLCBHTGVudW0gZGZhY3RvclJHQiwgR0xlbnVtIHNmYWN0b3JBbHBoYSwgR0xlbnVtIGRmYWN0b3JBbHBoYSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlEcmF3QXJyYXlzIChHTGVudW0gbW9kZSwgY29uc3QgR0xpbnQgKmZpcnN0LCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpRHJhd0VsZW1lbnRzIChHTGVudW0gbW9kZSwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJmIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyZnYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcmkgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyaXYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREZVTkNTRVBBUkFURVBST0MpIChHTGVudW0gc2ZhY3RvclJHQiwgR0xlbnVtIGRmYWN0b3JSR0IsIEdMZW51bSBzZmFjdG9yQWxwaGEsIEdMZW51bSBkZmFjdG9yQWxwaGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSURSQVdBUlJBWVNQUk9DKSAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMaW50ICpmaXJzdCwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElEUkFXRUxFTUVOVFNQUk9DKSAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUkZQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE9JTlRQQVJBTUVURVJGVlBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSSVBST0MpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE9JTlRQQVJBTUVURVJJVlBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8xXzRfREVQUkVDQVRFRAorI2RlZmluZSBHTF9WRVJTSU9OXzFfNF9ERVBSRUNBVEVEIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nQ29vcmRmIChHTGZsb2F0IGNvb3JkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGZ2IChjb25zdCBHTGZsb2F0ICpjb29yZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nQ29vcmRkIChHTGRvdWJsZSBjb29yZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nQ29vcmRkdiAoY29uc3QgR0xkb3VibGUgKmNvb3JkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZFBvaW50ZXIgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNiIChHTGJ5dGUgcmVkLCBHTGJ5dGUgZ3JlZW4sIEdMYnl0ZSBibHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNidiAoY29uc3QgR0xieXRlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNkIChHTGRvdWJsZSByZWQsIEdMZG91YmxlIGdyZWVuLCBHTGRvdWJsZSBibHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNkdiAoY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2YgKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2Z2IChjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNpIChHTGludCByZWQsIEdMaW50IGdyZWVuLCBHTGludCBibHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNpdiAoY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3MgKEdMc2hvcnQgcmVkLCBHTHNob3J0IGdyZWVuLCBHTHNob3J0IGJsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3N2IChjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1YiAoR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sIEdMdWJ5dGUgYmx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzdWJ2IChjb25zdCBHTHVieXRlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1aSAoR0x1aW50IHJlZCwgR0x1aW50IGdyZWVuLCBHTHVpbnQgYmx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzdWl2IChjb25zdCBHTHVpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3VzIChHTHVzaG9ydCByZWQsIEdMdXNob3J0IGdyZWVuLCBHTHVzaG9ydCBibHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1c3YgKGNvbnN0IEdMdXNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvclBvaW50ZXIgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZCAoR0xkb3VibGUgeCwgR0xkb3VibGUgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmR2IChjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmYgKEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZnYgKGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJpIChHTGludCB4LCBHTGludCB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyaXYgKGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MycyAoR0xzaG9ydCB4LCBHTHNob3J0IHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJzdiAoY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2QgKEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNkdiAoY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNmIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZnYgKGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNpIChHTGludCB4LCBHTGludCB5LCBHTGludCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzaXYgKGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzcyAoR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM3N2IChjb25zdCBHTHNob3J0ICp2KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZPR0NPT1JERlBST0MpIChHTGZsb2F0IGNvb3JkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRGVlBST0MpIChjb25zdCBHTGZsb2F0ICpjb29yZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZPR0NPT1JERFBST0MpIChHTGRvdWJsZSBjb29yZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZPR0NPT1JERFZQUk9DKSAoY29uc3QgR0xkb3VibGUgKmNvb3JkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRQT0lOVEVSUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzQlBST0MpIChHTGJ5dGUgcmVkLCBHTGJ5dGUgZ3JlZW4sIEdMYnl0ZSBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzQlZQUk9DKSAoY29uc3QgR0xieXRlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzRFBST0MpIChHTGRvdWJsZSByZWQsIEdMZG91YmxlIGdyZWVuLCBHTGRvdWJsZSBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzRFZQUk9DKSAoY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNGUFJPQykgKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNGVlBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzSVBST0MpIChHTGludCByZWQsIEdMaW50IGdyZWVuLCBHTGludCBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzSVZQUk9DKSAoY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNTUFJPQykgKEdMc2hvcnQgcmVkLCBHTHNob3J0IGdyZWVuLCBHTHNob3J0IGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNTVlBST0MpIChjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVUJQUk9DKSAoR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sIEdMdWJ5dGUgYmx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1VCVlBST0MpIChjb25zdCBHTHVieXRlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVUlQUk9DKSAoR0x1aW50IHJlZCwgR0x1aW50IGdyZWVuLCBHTHVpbnQgYmx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1VJVlBST0MpIChjb25zdCBHTHVpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNVU1BST0MpIChHTHVzaG9ydCByZWQsIEdMdXNob3J0IGdyZWVuLCBHTHVzaG9ydCBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVVNWUFJPQykgKGNvbnN0IEdMdXNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1JQT0lOVEVSUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMkRQUk9DKSAoR0xkb3VibGUgeCwgR0xkb3VibGUgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJEVlBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJGUFJPQykgKEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMkZWUFJPQykgKGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MySVBST0MpIChHTGludCB4LCBHTGludCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMklWUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMlNQUk9DKSAoR0xzaG9ydCB4LCBHTHNob3J0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyU1ZQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNEUFJPQykgKEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzRFZQUk9DKSAoY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzRlBST0MpIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0ZWUFJPQykgKGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzSVBST0MpIChHTGludCB4LCBHTGludCB5LCBHTGludCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0lWUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM1NQUk9DKSAoR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNTVlBST0MpIChjb25zdCBHTHNob3J0ICp2KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fMV81CisjZGVmaW5lIEdMX1ZFUlNJT05fMV81IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuUXVlcmllcyAoR0xzaXplaSBuLCBHTHVpbnQgKmlkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlUXVlcmllcyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmlkcyk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc1F1ZXJ5IChHTHVpbnQgaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJlZ2luUXVlcnkgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5kUXVlcnkgKEdMZW51bSB0YXJnZXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFF1ZXJ5aXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UXVlcnlPYmplY3RpdiAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFF1ZXJ5T2JqZWN0dWl2IChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRCdWZmZXIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZUJ1ZmZlcnMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpidWZmZXJzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5CdWZmZXJzIChHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycyk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc0J1ZmZlciAoR0x1aW50IGJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQnVmZmVyRGF0YSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEsIEdMZW51bSB1c2FnZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQnVmZmVyU3ViRGF0YSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QnVmZmVyU3ViRGF0YSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIEdMdm9pZCAqZGF0YSk7CitHTEFQSSBHTHZvaWQqIEFQSUVOVFJZIGdsTWFwQnVmZmVyIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYWNjZXNzKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbFVubWFwQnVmZmVyIChHTGVudW0gdGFyZ2V0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRCdWZmZXJQb2ludGVydiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VOUVVFUklFU1BST0MpIChHTHNpemVpIG4sIEdMdWludCAqaWRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFUVVFUklFU1BST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqaWRzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1FVRVJZUFJPQykgKEdMdWludCBpZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJFR0lOUVVFUllQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5EUVVFUllQUk9DKSAoR0xlbnVtIHRhcmdldCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFFVRVJZSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUVVFUllPQkpFQ1RJVlBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFFVRVJZT0JKRUNUVUlWUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRCVUZGRVJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURUJVRkZFUlNQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmJ1ZmZlcnMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5CVUZGRVJTUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU0JVRkZFUlBST0MpIChHTHVpbnQgYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQlVGRkVSREFUQVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwgR0xlbnVtIHVzYWdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQlVGRkVSU1VCREFUQVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQlVGRkVSU1VCREFUQVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgR0x2b2lkKiAoQVBJRU5UUllQIFBGTkdMTUFQQlVGRkVSUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhY2Nlc3MpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTFVOTUFQQlVGRkVSUFJPQykgKEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRCVUZGRVJQQVJBTUVURVJJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRCVUZGRVJQT0lOVEVSVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdm9pZCogKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzJfMAorI2RlZmluZSBHTF9WRVJTSU9OXzJfMCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZSAoR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdCdWZmZXJzIChHTHNpemVpIG4sIGNvbnN0IEdMZW51bSAqYnVmcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbE9wU2VwYXJhdGUgKEdMZW51bSBmYWNlLCBHTGVudW0gc2ZhaWwsIEdMZW51bSBkcGZhaWwsIEdMZW51bSBkcHBhc3MpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0ZW5jaWxGdW5jU2VwYXJhdGUgKEdMZW51bSBmYWNlLCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbE1hc2tTZXBhcmF0ZSAoR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBdHRhY2hTaGFkZXIgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kQXR0cmliTG9jYXRpb24gKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMY2hhciAqbmFtZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcGlsZVNoYWRlciAoR0x1aW50IHNoYWRlcik7CitHTEFQSSBHTHVpbnQgQVBJRU5UUlkgZ2xDcmVhdGVQcm9ncmFtICh2b2lkKTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbENyZWF0ZVNoYWRlciAoR0xlbnVtIHR5cGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVByb2dyYW0gKEdMdWludCBwcm9ncmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVTaGFkZXIgKEdMdWludCBzaGFkZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERldGFjaFNoYWRlciAoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSAoR0x1aW50IGluZGV4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSAoR0x1aW50IGluZGV4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRBY3RpdmVBdHRyaWIgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqc2l6ZSwgR0xlbnVtICp0eXBlLCBHTGNoYXIgKm5hbWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEFjdGl2ZVVuaWZvcm0gKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqc2l6ZSwgR0xlbnVtICp0eXBlLCBHTGNoYXIgKm5hbWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEF0dGFjaGVkU2hhZGVycyAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4Q291bnQsIEdMc2l6ZWkgKmNvdW50LCBHTHVpbnQgKm9iaik7CitHTEFQSSBHTGludCBBUElFTlRSWSBnbEdldEF0dHJpYkxvY2F0aW9uIChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyICpuYW1lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtaXYgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1JbmZvTG9nIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqaW5mb0xvZyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0U2hhZGVyaXYgKEdMdWludCBzaGFkZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0U2hhZGVySW5mb0xvZyAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqaW5mb0xvZyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0U2hhZGVyU291cmNlIChHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpzb3VyY2UpOworR0xBUEkgR0xpbnQgQVBJRU5UUlkgZ2xHZXRVbmlmb3JtTG9jYXRpb24gKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKm5hbWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFVuaWZvcm1mdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFVuaWZvcm1pdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJkdiAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYmZ2IChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJpdiAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2IChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiAqcG9pbnRlcik7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc1Byb2dyYW0gKEdMdWludCBwcm9ncmFtKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzU2hhZGVyIChHTHVpbnQgc2hhZGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaW5rUHJvZ3JhbSAoR0x1aW50IHByb2dyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNoYWRlclNvdXJjZSAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyKiAqc3RyaW5nLCBjb25zdCBHTGludCAqbGVuZ3RoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVc2VQcm9ncmFtIChHTHVpbnQgcHJvZ3JhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFmIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJmIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNmIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2Mik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRmIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2MiwgR0xmbG9hdCB2Myk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjApOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0yaSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2Mik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2MiwgR0xpbnQgdjMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0xZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM2Z2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm00ZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFpdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJpdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNpdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRpdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDJmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4M2Z2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1NYXRyaXg0ZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmFsaWRhdGVQcm9ncmFtIChHTHVpbnQgcHJvZ3JhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWQgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWR2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZiAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFmdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxcyAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFzdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZCAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZHYgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJmIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZnYgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMnMgKEdMdWludCBpbmRleCwgR0xzaG9ydCB4LCBHTHNob3J0IHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJzdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZCAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZHYgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNmIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNmdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzcyAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzc3YgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE5idiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGJ5dGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjROaXYgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjROc3YgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE51YiAoR0x1aW50IGluZGV4LCBHTHVieXRlIHgsIEdMdWJ5dGUgeSwgR0x1Ynl0ZSB6LCBHTHVieXRlIHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjROdWJ2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWJ5dGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjROdWl2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE51c3YgKEdMdWludCBpbmRleCwgY29uc3QgR0x1c2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRidiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGJ5dGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRkIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRkdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGYgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0ZnYgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGl2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0cyAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRzdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0dWJ2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWJ5dGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjR1aXYgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0dXN2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdXNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREVRVUFUSU9OU0VQQVJBVEVQUk9DKSAoR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXQlVGRkVSU1BST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMZW51bSAqYnVmcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNURU5DSUxPUFNFUEFSQVRFUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gc2ZhaWwsIEdMZW51bSBkcGZhaWwsIEdMZW51bSBkcHBhc3MpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTVEVOQ0lMRlVOQ1NFUEFSQVRFUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNURU5DSUxNQVNLU0VQQVJBVEVQUk9DKSAoR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQVRUQUNIU0hBREVSUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREFUVFJJQkxPQ0FUSU9OUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMY2hhciAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBJTEVTSEFERVJQUk9DKSAoR0x1aW50IHNoYWRlcik7Cit0eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMQ1JFQVRFUFJPR1JBTVBST0MpICh2b2lkKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xDUkVBVEVTSEFERVJQUk9DKSAoR0xlbnVtIHR5cGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVQUk9HUkFNUFJPQykgKEdMdWludCBwcm9ncmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFU0hBREVSUFJPQykgKEdMdWludCBzaGFkZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERVRBQ0hTSEFERVJQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xESVNBQkxFVkVSVEVYQVRUUklCQVJSQVlQUk9DKSAoR0x1aW50IGluZGV4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5BQkxFVkVSVEVYQVRUUklCQVJSQVlQUk9DKSAoR0x1aW50IGluZGV4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQUNUSVZFQVRUUklCUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqc2l6ZSwgR0xlbnVtICp0eXBlLCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBQ1RJVkVVTklGT1JNUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqc2l6ZSwgR0xlbnVtICp0eXBlLCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBVFRBQ0hFRFNIQURFUlNQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4Q291bnQsIEdMc2l6ZWkgKmNvdW50LCBHTHVpbnQgKm9iaik7Cit0eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xHRVRBVFRSSUJMT0NBVElPTlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyICpuYW1lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUlWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNSU5GT0xPR1BST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqaW5mb0xvZyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNIQURFUklWUFJPQykgKEdMdWludCBzaGFkZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNIQURFUklORk9MT0dQUk9DKSAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqaW5mb0xvZyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNIQURFUlNPVVJDRVBST0MpIChHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpzb3VyY2UpOwordHlwZWRlZiBHTGludCAoQVBJRU5UUllQIFBGTkdMR0VUVU5JRk9STUxPQ0FUSU9OUFJPQykgKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNRlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNSVZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCRFZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJGVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCSVZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJQT0lOVEVSVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiAqcG9pbnRlcik7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNQUk9HUkFNUFJPQykgKEdMdWludCBwcm9ncmFtKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1NIQURFUlBST0MpIChHTHVpbnQgc2hhZGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTElOS1BST0dSQU1QUk9DKSAoR0x1aW50IHByb2dyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTSEFERVJTT1VSQ0VQUk9DKSAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyKiAqc3RyaW5nLCBjb25zdCBHTGludCAqbGVuZ3RoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVVNFUFJPR1JBTVBST0MpIChHTHVpbnQgcHJvZ3JhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0xRlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0yRlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0zRlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2Mik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk00RlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2MiwgR0xmbG9hdCB2Myk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0xSVBST0MpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjApOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMklQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0zSVBST0MpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2Mik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk00SVBST0MpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2MiwgR0xpbnQgdjMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMUZWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0yRlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNGVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNEZWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0xSVZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0ySVZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0zSVZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk00SVZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1NQVRSSVgyRlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDNGVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYNEZWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZBTElEQVRFUFJPR1JBTVBST0MpIChHTHVpbnQgcHJvZ3JhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFEUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFEVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMUZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxRlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMVNQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxU1ZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMkRQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMkRWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMkZWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJTUFJPQykgKEdMdWludCBpbmRleCwgR0xzaG9ydCB4LCBHTHNob3J0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyU1ZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM0RQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM0RWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzRlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzRlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM1NQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM1NWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROQlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0TklWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0TlNWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROVUJQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVieXRlIHgsIEdMdWJ5dGUgeSwgR0x1Ynl0ZSB6LCBHTHVieXRlIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0TlVCVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0TlVJVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROVVNWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1c2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0QlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0RFBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0RFZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRGUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNEZWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRJVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNFNQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0U1ZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNFVCVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0VUlWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNFVTVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdXNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUE9JTlRFUlBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzJfMQorI2RlZmluZSBHTF9WRVJTSU9OXzJfMSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgyeDNmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4M3gyZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDJ4NGZ2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1NYXRyaXg0eDJmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4M3g0ZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDR4M2Z2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDJYM0ZWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1NQVRSSVgzWDJGVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYMlg0RlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDRYMkZWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1NQVRSSVgzWDRGVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYNFgzRlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fM18wCisjZGVmaW5lIEdMX1ZFUlNJT05fM18wIDEKKy8qIE9wZW5HTCAzLjAgYWxzbyByZXVzZXMgZW50cnkgcG9pbnRzIGZyb20gdGhlc2UgZXh0ZW5zaW9uczogKi8KKy8qIEFSQl9mcmFtZWJ1ZmZlcl9vYmplY3QgKi8KKy8qIEFSQl9tYXBfYnVmZmVyX3JhbmdlICovCisvKiBBUkJfdmVydGV4X2FycmF5X29iamVjdCAqLworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvck1hc2tpIChHTHVpbnQgaW5kZXgsIEdMYm9vbGVhbiByLCBHTGJvb2xlYW4gZywgR0xib29sZWFuIGIsIEdMYm9vbGVhbiBhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRCb29sZWFuaV92IChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMYm9vbGVhbiAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SW50ZWdlcmlfdiAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGludCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5hYmxlaSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEaXNhYmxlaSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4KTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzRW5hYmxlZGkgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmVnaW5UcmFuc2Zvcm1GZWVkYmFjayAoR0xlbnVtIHByaW1pdGl2ZU1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuZFRyYW5zZm9ybUZlZWRiYWNrICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kQnVmZmVyUmFuZ2UgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IGJ1ZmZlciwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRCdWZmZXJCYXNlIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCBidWZmZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3MgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIqICp2YXJ5aW5ncywgR0xlbnVtIGJ1ZmZlck1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZyAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMc2l6ZWkgKnNpemUsIEdMZW51bSAqdHlwZSwgR0xjaGFyICpuYW1lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGFtcENvbG9yIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gY2xhbXApOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJlZ2luQ29uZGl0aW9uYWxSZW5kZXIgKEdMdWludCBpZCwgR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuZENvbmRpdGlvbmFsUmVuZGVyICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJUG9pbnRlciAoR0x1aW50IGluZGV4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliSWl2IChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliSXVpdiAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdWludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJMWkgKEdMdWludCBpbmRleCwgR0xpbnQgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTJpIChHTHVpbnQgaW5kZXgsIEdMaW50IHgsIEdMaW50IHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkkzaSAoR0x1aW50IGluZGV4LCBHTGludCB4LCBHTGludCB5LCBHTGludCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJNGkgKEdMdWludCBpbmRleCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTF1aSAoR0x1aW50IGluZGV4LCBHTHVpbnQgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTJ1aSAoR0x1aW50IGluZGV4LCBHTHVpbnQgeCwgR0x1aW50IHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkkzdWkgKEdMdWludCBpbmRleCwgR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTR1aSAoR0x1aW50IGluZGV4LCBHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB6LCBHTHVpbnQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTFpdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTJpdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTNpdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTRpdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTF1aXYgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJMnVpdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkkzdWl2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTR1aXYgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJNGJ2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMYnl0ZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTRzdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJNHVidiAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVieXRlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJNHVzdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VW5pZm9ybXVpdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEZyYWdEYXRhTG9jYXRpb24gKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgY29sb3IsIGNvbnN0IEdMY2hhciAqbmFtZSk7CitHTEFQSSBHTGludCBBUElFTlRSWSBnbEdldEZyYWdEYXRhTG9jYXRpb24gKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKm5hbWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0xdWkgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjApOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0ydWkgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTN1aSAoR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxLCBHTHVpbnQgdjIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm00dWkgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSwgR0x1aW50IHYyLCBHTHVpbnQgdjMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0xdWl2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJ1aXYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM3VpdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm00dWl2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4UGFyYW1ldGVySWl2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFBhcmFtZXRlckl1aXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0x1aW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFRleFBhcmFtZXRlcklpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUZXhQYXJhbWV0ZXJJdWl2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdWludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckJ1ZmZlcml2IChHTGVudW0gYnVmZmVyLCBHTGludCBkcmF3YnVmZmVyLCBjb25zdCBHTGludCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyQnVmZmVydWl2IChHTGVudW0gYnVmZmVyLCBHTGludCBkcmF3YnVmZmVyLCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckJ1ZmZlcmZ2IChHTGVudW0gYnVmZmVyLCBHTGludCBkcmF3YnVmZmVyLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXJCdWZmZXJmaSAoR0xlbnVtIGJ1ZmZlciwgR0xpbnQgZHJhd2J1ZmZlciwgR0xmbG9hdCBkZXB0aCwgR0xpbnQgc3RlbmNpbCk7CitHTEFQSSBjb25zdCBHTHVieXRlICogQVBJRU5UUlkgZ2xHZXRTdHJpbmdpIChHTGVudW0gbmFtZSwgR0x1aW50IGluZGV4KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9STUFTS0lQUk9DKSAoR0x1aW50IGluZGV4LCBHTGJvb2xlYW4gciwgR0xib29sZWFuIGcsIEdMYm9vbGVhbiBiLCBHTGJvb2xlYW4gYSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEJPT0xFQU5JX1ZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGJvb2xlYW4gKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRJTlRFR0VSSV9WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xpbnQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkFCTEVJUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERJU0FCTEVJUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNFTkFCTEVESVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCRUdJTlRSQU5TRk9STUZFRURCQUNLUFJPQykgKEdMZW51bSBwcmltaXRpdmVNb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5EVFJBTlNGT1JNRkVFREJBQ0tQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRCVUZGRVJSQU5HRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCBidWZmZXIsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREJVRkZFUkJBU0VQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVFJBTlNGT1JNRkVFREJBQ0tWQVJZSU5HU1BST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyKiAqdmFyeWluZ3MsIEdMZW51bSBidWZmZXJNb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVFJBTlNGT1JNRkVFREJBQ0tWQVJZSU5HUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTHNpemVpICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhciAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENMQU1QQ09MT1JQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGNsYW1wKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkVHSU5DT05ESVRJT05BTFJFTkRFUlBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBtb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5EQ09ORElUSU9OQUxSRU5ERVJQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQklQT0lOVEVSUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJJSVZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJJVUlWUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkxSVBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50IHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJMklQUk9DKSAoR0x1aW50IGluZGV4LCBHTGludCB4LCBHTGludCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTNJUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkk0SVBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJMVVJUFJPQykgKEdMdWludCBpbmRleCwgR0x1aW50IHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJMlVJUFJPQykgKEdMdWludCBpbmRleCwgR0x1aW50IHgsIEdMdWludCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTNVSVBST0MpIChHTHVpbnQgaW5kZXgsIEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJNFVJUFJPQykgKEdMdWludCBpbmRleCwgR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgeiwgR0x1aW50IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJMUlWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJMklWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJM0lWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJNElWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJMVVJVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkyVUlWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTNVSVZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJNFVJVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkk0QlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJNFNWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkk0VUJWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkk0VVNWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1c2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNVUlWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5ERlJBR0RBVEFMT0NBVElPTlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGNvbG9yLCBjb25zdCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiBHTGludCAoQVBJRU5UUllQIFBGTkdMR0VURlJBR0RBVEFMT0NBVElPTlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyICpuYW1lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFVSVBST0MpIChHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJVSVBST0MpIChHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwLCBHTHVpbnQgdjEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM1VJUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSwgR0x1aW50IHYyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRVSVBST0MpIChHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwLCBHTHVpbnQgdjEsIEdMdWludCB2MiwgR0x1aW50IHYzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFVSVZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMlVJVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0zVUlWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRVSVZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhQQVJBTUVURVJJSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYUEFSQU1FVEVSSVVJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVEVYUEFSQU1FVEVSSUlWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFRFWFBBUkFNRVRFUklVSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENMRUFSQlVGRkVSSVZQUk9DKSAoR0xlbnVtIGJ1ZmZlciwgR0xpbnQgZHJhd2J1ZmZlciwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ0xFQVJCVUZGRVJVSVZQUk9DKSAoR0xlbnVtIGJ1ZmZlciwgR0xpbnQgZHJhd2J1ZmZlciwgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENMRUFSQlVGRkVSRlZQUk9DKSAoR0xlbnVtIGJ1ZmZlciwgR0xpbnQgZHJhd2J1ZmZlciwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDTEVBUkJVRkZFUkZJUFJPQykgKEdMZW51bSBidWZmZXIsIEdMaW50IGRyYXdidWZmZXIsIEdMZmxvYXQgZGVwdGgsIEdMaW50IHN0ZW5jaWwpOwordHlwZWRlZiBjb25zdCBHTHVieXRlICogKEFQSUVOVFJZUCBQRk5HTEdFVFNUUklOR0lQUk9DKSAoR0xlbnVtIG5hbWUsIEdMdWludCBpbmRleCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzNfMQorI2RlZmluZSBHTF9WRVJTSU9OXzNfMSAxCisvKiBPcGVuR0wgMy4xIGFsc28gcmV1c2VzIGVudHJ5IHBvaW50cyBmcm9tIHRoZXNlIGV4dGVuc2lvbnM6ICovCisvKiBBUkJfY29weV9idWZmZXIgKi8KKy8qIEFSQl91bmlmb3JtX2J1ZmZlcl9vYmplY3QgKi8KKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0FycmF5c0luc3RhbmNlZCAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0VsZW1lbnRzSW5zdGFuY2VkIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEJ1ZmZlciAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHVpbnQgYnVmZmVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcmltaXRpdmVSZXN0YXJ0SW5kZXggKEdMdWludCBpbmRleCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXQVJSQVlTSU5TVEFOQ0VEUFJPQykgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCwgR0xzaXplaSBwcmltY291bnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXRUxFTUVOVFNJTlNUQU5DRURQUk9DKSAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQlVGRkVSUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0x1aW50IGJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBSSU1JVElWRVJFU1RBUlRJTkRFWFBST0MpIChHTHVpbnQgaW5kZXgpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8zXzIKKyNkZWZpbmUgR0xfVkVSU0lPTl8zXzIgMQorLyogT3BlbkdMIDMuMiBhbHNvIHJldXNlcyBlbnRyeSBwb2ludHMgZnJvbSB0aGVzZSBleHRlbnNpb25zOiAqLworLyogQVJCX2RyYXdfZWxlbWVudHNfYmFzZV92ZXJ0ZXggKi8KKy8qIEFSQl9wcm92b2tpbmdfdmVydGV4ICovCisvKiBBUkJfc3luYyAqLworLyogQVJCX3RleHR1cmVfbXVsdGlzYW1wbGUgKi8KKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SW50ZWdlcjY0aV92IChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMaW50NjQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEJ1ZmZlclBhcmFtZXRlcmk2NHYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQ2NCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSU5URUdFUjY0SV9WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xpbnQ2NCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEJVRkZFUlBBUkFNRVRFUkk2NFZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludDY0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkVQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzNfMworI2RlZmluZSBHTF9WRVJTSU9OXzNfMyAxCisvKiBPcGVuR0wgMy4zIGFsc28gcmV1c2VzIGVudHJ5IHBvaW50cyBmcm9tIHRoZXNlIGV4dGVuc2lvbnM6ICovCisvKiBBUkJfYmxlbmRfZnVuY19leHRlbmRlZCAqLworLyogQVJCX3NhbXBsZXJfb2JqZWN0cyAqLworLyogQVJCX2V4cGxpY2l0X2F0dHJpYl9sb2NhdGlvbiwgYnV0IGl0IGhhcyBub25lICovCisvKiBBUkJfb2NjbHVzaW9uX3F1ZXJ5MiAobm8gZW50cnkgcG9pbnRzKSAqLworLyogQVJCX3NoYWRlcl9iaXRfZW5jb2RpbmcgKG5vIGVudHJ5IHBvaW50cykgKi8KKy8qIEFSQl90ZXh0dXJlX3JnYjEwX2EydWkgKG5vIGVudHJ5IHBvaW50cykgKi8KKy8qIEFSQl90ZXh0dXJlX3N3aXp6bGUgKG5vIGVudHJ5IHBvaW50cykgKi8KKy8qIEFSQl90aW1lcl9xdWVyeSAqLworLyogQVJCX3ZlcnRleF90eXBlXzJfMTBfMTBfMTBfcmV2ICovCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkRpdmlzb3IgKEdMdWludCBpbmRleCwgR0x1aW50IGRpdmlzb3IpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCRElWSVNPUlBST0MpIChHTHVpbnQgaW5kZXgsIEdMdWludCBkaXZpc29yKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fNF8wCisjZGVmaW5lIEdMX1ZFUlNJT05fNF8wIDEKKy8qIE9wZW5HTCA0LjAgYWxzbyByZXVzZXMgZW50cnkgcG9pbnRzIGZyb20gdGhlc2UgZXh0ZW5zaW9uczogKi8KKy8qIEFSQl90ZXh0dXJlX3F1ZXJ5X2xvZCAobm8gZW50cnkgcG9pbnRzKSAqLworLyogQVJCX2RyYXdfaW5kaXJlY3QgKi8KKy8qIEFSQl9ncHVfc2hhZGVyNSAobm8gZW50cnkgcG9pbnRzKSAqLworLyogQVJCX2dwdV9zaGFkZXJfZnA2NCAqLworLyogQVJCX3NoYWRlcl9zdWJyb3V0aW5lICovCisvKiBBUkJfdGVzc2VsbGF0aW9uX3NoYWRlciAqLworLyogQVJCX3RleHR1cmVfYnVmZmVyX29iamVjdF9yZ2IzMiAobm8gZW50cnkgcG9pbnRzKSAqLworLyogQVJCX3RleHR1cmVfY3ViZV9tYXBfYXJyYXkgKG5vIGVudHJ5IHBvaW50cykgKi8KKy8qIEFSQl90ZXh0dXJlX2dhdGhlciAobm8gZW50cnkgcG9pbnRzKSAqLworLyogQVJCX3RyYW5zZm9ybV9mZWVkYmFjazIgKi8KKy8qIEFSQl90cmFuc2Zvcm1fZmVlZGJhY2szICovCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1pblNhbXBsZVNoYWRpbmcgKEdMY2xhbXBmIHZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uaSAoR0x1aW50IGJ1ZiwgR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZWkgKEdMdWludCBidWYsIEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEZ1bmNpIChHTHVpbnQgYnVmLCBHTGVudW0gc3JjLCBHTGVudW0gZHN0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEZ1bmNTZXBhcmF0ZWkgKEdMdWludCBidWYsIEdMZW51bSBzcmNSR0IsIEdMZW51bSBkc3RSR0IsIEdMZW51bSBzcmNBbHBoYSwgR0xlbnVtIGRzdEFscGhhKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1JTlNBTVBMRVNIQURJTkdQUk9DKSAoR0xjbGFtcGYgdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREVRVUFUSU9OSVBST0MpIChHTHVpbnQgYnVmLCBHTGVudW0gbW9kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERVFVQVRJT05TRVBBUkFURUlQUk9DKSAoR0x1aW50IGJ1ZiwgR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREZVTkNJUFJPQykgKEdMdWludCBidWYsIEdMZW51bSBzcmMsIEdMZW51bSBkc3QpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREZVTkNTRVBBUkFURUlQUk9DKSAoR0x1aW50IGJ1ZiwgR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl80XzEKKyNkZWZpbmUgR0xfVkVSU0lPTl80XzEgMQorLyogT3BlbkdMIDQuMSByZXVzZXMgZW50cnkgcG9pbnRzIGZyb20gdGhlc2UgZXh0ZW5zaW9uczogKi8KKy8qIEFSQl9FUzJfY29tcGF0aWJpbGl0eSAqLworLyogQVJCX2dldF9wcm9ncmFtX2JpbmFyeSAqLworLyogQVJCX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzICovCisvKiBBUkJfc2hhZGVyX3ByZWNpc2lvbiAobm8gZW50cnkgcG9pbnRzKSAqLworLyogQVJCX3ZlcnRleF9hdHRyaWJfNjRiaXQgKi8KKy8qIEFSQl92aWV3cG9ydF9hcnJheSAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl80XzIKKyNkZWZpbmUgR0xfVkVSU0lPTl80XzIgMQorLyogT3BlbkdMIDQuMiByZXVzZXMgZW50cnkgcG9pbnRzIGZyb20gdGhlc2UgZXh0ZW5zaW9uczogKi8KKy8qIEFSQl9iYXNlX2luc3RhbmNlICovCisvKiBBUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrIChubyBlbnRyeSBwb2ludHMpICovCisvKiBBUkJfdHJhbnNmb3JtX2ZlZWRiYWNrX2luc3RhbmNlZCAqLworLyogQVJCX2NvbXByZXNzZWRfdGV4dHVyZV9waXhlbF9zdG9yYWdlIChubyBlbnRyeSBwb2ludHMpICovCisvKiBBUkJfY29uc2VydmF0aXZlX2RlcHRoIChubyBlbnRyeSBwb2ludHMpICovCisvKiBBUkJfaW50ZXJuYWxmb3JtYXRfcXVlcnkgKi8KKy8qIEFSQl9tYXBfYnVmZmVyX2FsaWdubWVudCAobm8gZW50cnkgcG9pbnRzKSAqLworLyogQVJCX3NoYWRlcl9hdG9taWNfY291bnRlcnMgKi8KKy8qIEFSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZSAqLworLyogQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfcGFja2luZyAobm8gZW50cnkgcG9pbnRzKSAqLworLyogQVJCX3RleHR1cmVfc3RvcmFnZSAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX211bHRpdGV4dHVyZQorI2RlZmluZSBHTF9BUkJfbXVsdGl0ZXh0dXJlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWN0aXZlVGV4dHVyZUFSQiAoR0xlbnVtIHRleHR1cmUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsaWVudEFjdGl2ZVRleHR1cmVBUkIgKEdMZW51bSB0ZXh0dXJlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWRBUkIgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxZHZBUkIgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWZBUkIgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFmdkFSQiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFpQVJCIChHTGVudW0gdGFyZ2V0LCBHTGludCBzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWl2QVJCIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFzQVJCIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxc3ZBUkIgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyZEFSQiAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJkdkFSQiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyZkFSQiAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyZnZBUkIgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyaUFSQiAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJpdkFSQiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyc0FSQiAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyc3ZBUkIgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzZEFSQiAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCwgR0xkb3VibGUgcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNkdkFSQiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzZkFSQiAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNmdkFSQiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNpQVJCIChHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0LCBHTGludCByKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2l2QVJCIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNzQVJCIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM3N2QVJCIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGRBUkIgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIsIEdMZG91YmxlIHEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZHZBUkIgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGZBUkIgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRmdkFSQiAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRpQVJCIChHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0LCBHTGludCByLCBHTGludCBxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGl2QVJCIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRzQVJCIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByLCBHTHNob3J0IHEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0c3ZBUkIgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQUNUSVZFVEVYVFVSRUFSQlBST0MpIChHTGVudW0gdGV4dHVyZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENMSUVOVEFDVElWRVRFWFRVUkVBUkJQUk9DKSAoR0xlbnVtIHRleHR1cmUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMURBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxRFZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFGVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFJQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUlWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFTQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxU1ZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQyREFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzLCBHTGRvdWJsZSB0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJEVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQyRkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQyRlZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQySUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJJVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQyU0FSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQyU1ZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzREFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzLCBHTGRvdWJsZSB0LCBHTGRvdWJsZSByKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNEVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzRkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNGVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNJQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IHMsIEdMaW50IHQsIEdMaW50IHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0lWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNTQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0LCBHTHNob3J0IHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM1NWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENERBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCwgR0xkb3VibGUgciwgR0xkb3VibGUgcSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0RFZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENEZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRGVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRJQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IHMsIEdMaW50IHQsIEdMaW50IHIsIEdMaW50IHEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENElWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRTQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0LCBHTHNob3J0IHIsIEdMc2hvcnQgcSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0U1ZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdHJhbnNwb3NlX21hdHJpeAorI2RlZmluZSBHTF9BUkJfdHJhbnNwb3NlX21hdHJpeCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvYWRUcmFuc3Bvc2VNYXRyaXhmQVJCIChjb25zdCBHTGZsb2F0ICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkVHJhbnNwb3NlTWF0cml4ZEFSQiAoY29uc3QgR0xkb3VibGUgKm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRUcmFuc3Bvc2VNYXRyaXhmQVJCIChjb25zdCBHTGZsb2F0ICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0VHJhbnNwb3NlTWF0cml4ZEFSQiAoY29uc3QgR0xkb3VibGUgKm0pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTE9BRFRSQU5TUE9TRU1BVFJJWEZBUkJQUk9DKSAoY29uc3QgR0xmbG9hdCAqbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExPQURUUkFOU1BPU0VNQVRSSVhEQVJCUFJPQykgKGNvbnN0IEdMZG91YmxlICptKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVFRSQU5TUE9TRU1BVFJJWEZBUkJQUk9DKSAoY29uc3QgR0xmbG9hdCAqbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRUUkFOU1BPU0VNQVRSSVhEQVJCUFJPQykgKGNvbnN0IEdMZG91YmxlICptKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9BUkJfbXVsdGlzYW1wbGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVDb3ZlcmFnZUFSQiAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0FNUExFQ09WRVJBR0VBUkJQUk9DKSAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfZW52X2FkZAorI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9lbnZfYWRkIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2N1YmVfbWFwCisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX2N1YmVfbWFwIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2NvbXByZXNzaW9uCisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX2NvbXByZXNzaW9uIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleEltYWdlM0RBUkIgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTJEQVJCIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UxREFSQiAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzREFSQiAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyREFSQiAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UxREFSQiAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbXByZXNzZWRUZXhJbWFnZUFSQiAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMdm9pZCAqaW1nKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhJTUFHRTNEQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYSU1BR0UyREFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWElNQUdFMURBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFNVQklNQUdFM0RBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFNVQklNQUdFMkRBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFNVQklNQUdFMURBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT01QUkVTU0VEVEVYSU1BR0VBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMdm9pZCAqaW1nKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2JvcmRlcl9jbGFtcAorI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9ib3JkZXJfY2xhbXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3BvaW50X3BhcmFtZXRlcnMKKyNkZWZpbmUgR0xfQVJCX3BvaW50X3BhcmFtZXRlcnMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcmZBUkIgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJmdkFSQiAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE9JTlRQQVJBTUVURVJGQVJCUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSRlZBUkJQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3ZlcnRleF9ibGVuZAorI2RlZmluZSBHTF9BUkJfdmVydGV4X2JsZW5kIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2VpZ2h0YnZBUkIgKEdMaW50IHNpemUsIGNvbnN0IEdMYnl0ZSAqd2VpZ2h0cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2VpZ2h0c3ZBUkIgKEdMaW50IHNpemUsIGNvbnN0IEdMc2hvcnQgKndlaWdodHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdlaWdodGl2QVJCIChHTGludCBzaXplLCBjb25zdCBHTGludCAqd2VpZ2h0cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2VpZ2h0ZnZBUkIgKEdMaW50IHNpemUsIGNvbnN0IEdMZmxvYXQgKndlaWdodHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdlaWdodGR2QVJCIChHTGludCBzaXplLCBjb25zdCBHTGRvdWJsZSAqd2VpZ2h0cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2VpZ2h0dWJ2QVJCIChHTGludCBzaXplLCBjb25zdCBHTHVieXRlICp3ZWlnaHRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXZWlnaHR1c3ZBUkIgKEdMaW50IHNpemUsIGNvbnN0IEdMdXNob3J0ICp3ZWlnaHRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXZWlnaHR1aXZBUkIgKEdMaW50IHNpemUsIGNvbnN0IEdMdWludCAqd2VpZ2h0cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2VpZ2h0UG9pbnRlckFSQiAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEJsZW5kQVJCIChHTGludCBjb3VudCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXRUlHSFRCVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTGJ5dGUgKndlaWdodHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXRUlHSFRTVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTHNob3J0ICp3ZWlnaHRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0VJR0hUSVZBUkJQUk9DKSAoR0xpbnQgc2l6ZSwgY29uc3QgR0xpbnQgKndlaWdodHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXRUlHSFRGVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTGZsb2F0ICp3ZWlnaHRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0VJR0hURFZBUkJQUk9DKSAoR0xpbnQgc2l6ZSwgY29uc3QgR0xkb3VibGUgKndlaWdodHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXRUlHSFRVQlZBUkJQUk9DKSAoR0xpbnQgc2l6ZSwgY29uc3QgR0x1Ynl0ZSAqd2VpZ2h0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdFSUdIVFVTVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTHVzaG9ydCAqd2VpZ2h0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdFSUdIVFVJVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTHVpbnQgKndlaWdodHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXRUlHSFRQT0lOVEVSQVJCUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQkxFTkRBUkJQUk9DKSAoR0xpbnQgY291bnQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX21hdHJpeF9wYWxldHRlCisjZGVmaW5lIEdMX0FSQl9tYXRyaXhfcGFsZXR0ZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEN1cnJlbnRQYWxldHRlTWF0cml4QVJCIChHTGludCBpbmRleCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4SW5kZXh1YnZBUkIgKEdMaW50IHNpemUsIGNvbnN0IEdMdWJ5dGUgKmluZGljZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeEluZGV4dXN2QVJCIChHTGludCBzaXplLCBjb25zdCBHTHVzaG9ydCAqaW5kaWNlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4SW5kZXh1aXZBUkIgKEdMaW50IHNpemUsIGNvbnN0IEdMdWludCAqaW5kaWNlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4SW5kZXhQb2ludGVyQVJCIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDVVJSRU5UUEFMRVRURU1BVFJJWEFSQlBST0MpIChHTGludCBpbmRleCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWElOREVYVUJWQVJCUFJPQykgKEdMaW50IHNpemUsIGNvbnN0IEdMdWJ5dGUgKmluZGljZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVRSSVhJTkRFWFVTVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTHVzaG9ydCAqaW5kaWNlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWElOREVYVUlWQVJCUFJPQykgKEdMaW50IHNpemUsIGNvbnN0IEdMdWludCAqaW5kaWNlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWElOREVYUE9JTlRFUkFSQlBST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9lbnZfY29tYmluZQorI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9lbnZfY29tYmluZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9lbnZfY3Jvc3NiYXIKKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfZW52X2Nyb3NzYmFyIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2Vudl9kb3QzCisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX2Vudl9kb3QzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX21pcnJvcmVkX3JlcGVhdAorI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9taXJyb3JlZF9yZXBlYXQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2RlcHRoX3RleHR1cmUKKyNkZWZpbmUgR0xfQVJCX2RlcHRoX3RleHR1cmUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRvdworI2RlZmluZSBHTF9BUkJfc2hhZG93IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkb3dfYW1iaWVudAorI2RlZmluZSBHTF9BUkJfc2hhZG93X2FtYmllbnQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3dpbmRvd19wb3MKKyNkZWZpbmUgR0xfQVJCX3dpbmRvd19wb3MgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZEFSQiAoR0xkb3VibGUgeCwgR0xkb3VibGUgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmR2QVJCIChjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmZBUkIgKEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZnZBUkIgKGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJpQVJCIChHTGludCB4LCBHTGludCB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyaXZBUkIgKGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3Myc0FSQiAoR0xzaG9ydCB4LCBHTHNob3J0IHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJzdkFSQiAoY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2RBUkIgKEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNkdkFSQiAoY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNmQVJCIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZnZBUkIgKGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNpQVJCIChHTGludCB4LCBHTGludCB5LCBHTGludCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzaXZBUkIgKGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3Mzc0FSQiAoR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM3N2QVJCIChjb25zdCBHTHNob3J0ICp2KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJEQVJCUFJPQykgKEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyRFZBUkJQUk9DKSAoY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyRkFSQlBST0MpIChHTGZsb2F0IHgsIEdMZmxvYXQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJGVkFSQlBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMklBUkJQUk9DKSAoR0xpbnQgeCwgR0xpbnQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJJVkFSQlBST0MpIChjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJTQVJCUFJPQykgKEdMc2hvcnQgeCwgR0xzaG9ydCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMlNWQVJCUFJPQykgKGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzREFSQlBST0MpIChHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0RWQVJCUFJPQykgKGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0ZBUkJQUk9DKSAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNGVkFSQlBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0lBUkJQUk9DKSAoR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNJVkFSQlBST0MpIChjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNTQVJCUFJPQykgKEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzU1ZBUkJQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdmVydGV4X3Byb2dyYW0KKyNkZWZpbmUgR0xfQVJCX3ZlcnRleF9wcm9ncmFtIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWRBUkIgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWR2QVJCIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZkFSQiAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFmdkFSQiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxc0FSQiAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFzdkFSQiAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZEFSQiAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZHZBUkIgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJmQVJCIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZnZBUkIgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMnNBUkIgKEdMdWludCBpbmRleCwgR0xzaG9ydCB4LCBHTHNob3J0IHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJzdkFSQiAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZEFSQiAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZHZBUkIgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNmQVJCIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNmdkFSQiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzc0FSQiAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzc3ZBUkIgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE5idkFSQiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGJ5dGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjROaXZBUkIgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjROc3ZBUkIgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE51YkFSQiAoR0x1aW50IGluZGV4LCBHTHVieXRlIHgsIEdMdWJ5dGUgeSwgR0x1Ynl0ZSB6LCBHTHVieXRlIHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjROdWJ2QVJCIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWJ5dGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjROdWl2QVJCIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE51c3ZBUkIgKEdMdWludCBpbmRleCwgY29uc3QgR0x1c2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRidkFSQiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGJ5dGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRkQVJCIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRkdkFSQiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGZBUkIgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0ZnZBUkIgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGl2QVJCIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0c0FSQiAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRzdkFSQiAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0dWJ2QVJCIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWJ5dGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjR1aXZBUkIgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0dXN2QVJCIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdXNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyQVJCIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXlBUkIgKEdMdWludCBpbmRleCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5QVJCIChHTHVpbnQgaW5kZXgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1TdHJpbmdBUkIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHZvaWQgKnN0cmluZyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZFByb2dyYW1BUkIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBwcm9ncmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVQcm9ncmFtc0FSQiAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnByb2dyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5Qcm9ncmFtc0FSQiAoR0xzaXplaSBuLCBHTHVpbnQgKnByb2dyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtRW52UGFyYW1ldGVyNGRBUkIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUVudlBhcmFtZXRlcjRkdkFSQiAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtRW52UGFyYW1ldGVyNGZBUkIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtRW52UGFyYW1ldGVyNGZ2QVJCIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGRBUkIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGR2QVJCIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRmQVJCIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGZ2QVJCIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbUVudlBhcmFtZXRlcmR2QVJCIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZG91YmxlICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1FbnZQYXJhbWV0ZXJmdkFSQiAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1Mb2NhbFBhcmFtZXRlcmR2QVJCIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZG91YmxlICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1Mb2NhbFBhcmFtZXRlcmZ2QVJCIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbWl2QVJCIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1TdHJpbmdBUkIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x2b2lkICpzdHJpbmcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYmR2QVJCIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xkb3VibGUgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliZnZBUkIgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYml2QVJCIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnZBUkIgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqICpwb2ludGVyKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzUHJvZ3JhbUFSQiAoR0x1aW50IHByb2dyYW0pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMURBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMURWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxRkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFGVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxU0FSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFTVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyREFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRFZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJGQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRlZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMlNBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJTVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzREFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzRFZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNGQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNGVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzU0FSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzU1ZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNE5CVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMYnl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROSVZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROU1ZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNE5VQkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMdWJ5dGUgeCwgR0x1Ynl0ZSB5LCBHTHVieXRlIHosIEdMdWJ5dGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROVUJWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROVUlWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNE5VU1ZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRCVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMYnl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjREQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjREVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNEZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0RlZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNElWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0U0FSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRTVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0VUJWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRVSVZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0VVNWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1c2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJQT0lOVEVSQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5BQkxFVkVSVEVYQVRUUklCQVJSQVlBUkJQUk9DKSAoR0x1aW50IGluZGV4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRElTQUJMRVZFUlRFWEFUVFJJQkFSUkFZQVJCUFJPQykgKEdMdWludCBpbmRleCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1TVFJJTkdBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdm9pZCAqc3RyaW5nKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklORFBST0dSQU1BUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHByb2dyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVQUk9HUkFNU0FSQlBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcHJvZ3JhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5QUk9HUkFNU0FSQlBST0MpIChHTHNpemVpIG4sIEdMdWludCAqcHJvZ3JhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNRU5WUEFSQU1FVEVSNERBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUVOVlBBUkFNRVRFUjREVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNRU5WUEFSQU1FVEVSNEZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNRU5WUEFSQU1FVEVSNEZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUxPQ0FMUEFSQU1FVEVSNERBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUxPQ0FMUEFSQU1FVEVSNERWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1MT0NBTFBBUkFNRVRFUjRGQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUxPQ0FMUEFSQU1FVEVSNEZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUVOVlBBUkFNRVRFUkRWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xkb3VibGUgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1FTlZQQVJBTUVURVJGVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1MT0NBTFBBUkFNRVRFUkRWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xkb3VibGUgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1MT0NBTFBBUkFNRVRFUkZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUlWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1TVFJJTkdBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKnN0cmluZyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQkRWQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCRlZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQklWQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCUE9JTlRFUlZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdm9pZCogKnBvaW50ZXIpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTUFJPR1JBTUFSQlBST0MpIChHTHVpbnQgcHJvZ3JhbSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbQorI2RlZmluZSBHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbSAxCisvKiBBbGwgQVJCX2ZyYWdtZW50X3Byb2dyYW0gZW50cnkgcG9pbnRzIGFyZSBzaGFyZWQgd2l0aCBBUkJfdmVydGV4X3Byb2dyYW0uICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdmVydGV4X2J1ZmZlcl9vYmplY3QKKyNkZWZpbmUgR0xfQVJCX3ZlcnRleF9idWZmZXJfb2JqZWN0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEJ1ZmZlckFSQiAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlQnVmZmVyc0FSQiAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmJ1ZmZlcnMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlbkJ1ZmZlcnNBUkIgKEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzQnVmZmVyQVJCIChHTHVpbnQgYnVmZmVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCdWZmZXJEYXRhQVJCIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyQVJCIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwgR0xlbnVtIHVzYWdlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCdWZmZXJTdWJEYXRhQVJCIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ckFSQiBvZmZzZXQsIEdMc2l6ZWlwdHJBUkIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRCdWZmZXJTdWJEYXRhQVJCIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ckFSQiBvZmZzZXQsIEdMc2l6ZWlwdHJBUkIgc2l6ZSwgR0x2b2lkICpkYXRhKTsKK0dMQVBJIEdMdm9pZCogQVBJRU5UUlkgZ2xNYXBCdWZmZXJBUkIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhY2Nlc3MpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsVW5tYXBCdWZmZXJBUkIgKEdMZW51bSB0YXJnZXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEJ1ZmZlclBhcmFtZXRlcml2QVJCIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEJ1ZmZlclBvaW50ZXJ2QVJCIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdm9pZCogKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EQlVGRkVSQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVCVUZGRVJTQVJCUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpidWZmZXJzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VOQlVGRkVSU0FSQlBST0MpIChHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNCVUZGRVJBUkJQUk9DKSAoR0x1aW50IGJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJVRkZFUkRBVEFBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaXB0ckFSQiBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEsIEdMZW51bSB1c2FnZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJVRkZFUlNVQkRBVEFBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHJBUkIgb2Zmc2V0LCBHTHNpemVpcHRyQVJCIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEJVRkZFUlNVQkRBVEFBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHJBUkIgb2Zmc2V0LCBHTHNpemVpcHRyQVJCIHNpemUsIEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIEdMdm9pZCogKEFQSUVOVFJZUCBQRk5HTE1BUEJVRkZFUkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYWNjZXNzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xVTk1BUEJVRkZFUkFSQlBST0MpIChHTGVudW0gdGFyZ2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQlVGRkVSUEFSQU1FVEVSSVZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQlVGRkVSUE9JTlRFUlZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX29jY2x1c2lvbl9xdWVyeQorI2RlZmluZSBHTF9BUkJfb2NjbHVzaW9uX3F1ZXJ5IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuUXVlcmllc0FSQiAoR0xzaXplaSBuLCBHTHVpbnQgKmlkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlUXVlcmllc0FSQiAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmlkcyk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc1F1ZXJ5QVJCIChHTHVpbnQgaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJlZ2luUXVlcnlBUkIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5kUXVlcnlBUkIgKEdMZW51bSB0YXJnZXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFF1ZXJ5aXZBUkIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UXVlcnlPYmplY3RpdkFSQiAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFF1ZXJ5T2JqZWN0dWl2QVJCIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VOUVVFUklFU0FSQlBST0MpIChHTHNpemVpIG4sIEdMdWludCAqaWRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFUVVFUklFU0FSQlBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqaWRzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1FVRVJZQVJCUFJPQykgKEdMdWludCBpZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJFR0lOUVVFUllBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5EUVVFUllBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFFVRVJZSVZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUVVFUllPQkpFQ1RJVkFSQlBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFFVRVJZT0JKRUNUVUlWQVJCUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZGVyX29iamVjdHMKKyNkZWZpbmUgR0xfQVJCX3NoYWRlcl9vYmplY3RzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlT2JqZWN0QVJCIChHTGhhbmRsZUFSQiBvYmopOworR0xBUEkgR0xoYW5kbGVBUkIgQVBJRU5UUlkgZ2xHZXRIYW5kbGVBUkIgKEdMZW51bSBwbmFtZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGV0YWNoT2JqZWN0QVJCIChHTGhhbmRsZUFSQiBjb250YWluZXJPYmosIEdMaGFuZGxlQVJCIGF0dGFjaGVkT2JqKTsKK0dMQVBJIEdMaGFuZGxlQVJCIEFQSUVOVFJZIGdsQ3JlYXRlU2hhZGVyT2JqZWN0QVJCIChHTGVudW0gc2hhZGVyVHlwZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2hhZGVyU291cmNlQVJCIChHTGhhbmRsZUFSQiBzaGFkZXJPYmosIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhckFSQiogKnN0cmluZywgY29uc3QgR0xpbnQgKmxlbmd0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcGlsZVNoYWRlckFSQiAoR0xoYW5kbGVBUkIgc2hhZGVyT2JqKTsKK0dMQVBJIEdMaGFuZGxlQVJCIEFQSUVOVFJZIGdsQ3JlYXRlUHJvZ3JhbU9iamVjdEFSQiAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQXR0YWNoT2JqZWN0QVJCIChHTGhhbmRsZUFSQiBjb250YWluZXJPYmosIEdMaGFuZGxlQVJCIG9iaik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlua1Byb2dyYW1BUkIgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVzZVByb2dyYW1PYmplY3RBUkIgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhbGlkYXRlUHJvZ3JhbUFSQiAoR0xoYW5kbGVBUkIgcHJvZ3JhbU9iaik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFmQVJCIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJmQVJCIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNmQVJCIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2Mik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRmQVJCIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2MiwgR0xmbG9hdCB2Myk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFpQVJCIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjApOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0yaUFSQiAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNpQVJCIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2Mik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRpQVJCIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2MiwgR0xpbnQgdjMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0xZnZBUkIgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJmdkFSQiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM2Z2QVJCIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm00ZnZBUkIgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFpdkFSQiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJpdkFSQiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNpdkFSQiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRpdkFSQiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDJmdkFSQiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4M2Z2QVJCIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1NYXRyaXg0ZnZBUkIgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0T2JqZWN0UGFyYW1ldGVyZnZBUkIgKEdMaGFuZGxlQVJCIG9iaiwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE9iamVjdFBhcmFtZXRlcml2QVJCIChHTGhhbmRsZUFSQiBvYmosIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SW5mb0xvZ0FSQiAoR0xoYW5kbGVBUkIgb2JqLCBHTHNpemVpIG1heExlbmd0aCwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXJBUkIgKmluZm9Mb2cpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEF0dGFjaGVkT2JqZWN0c0FSQiAoR0xoYW5kbGVBUkIgY29udGFpbmVyT2JqLCBHTHNpemVpIG1heENvdW50LCBHTHNpemVpICpjb3VudCwgR0xoYW5kbGVBUkIgKm9iaik7CitHTEFQSSBHTGludCBBUElFTlRSWSBnbEdldFVuaWZvcm1Mb2NhdGlvbkFSQiAoR0xoYW5kbGVBUkIgcHJvZ3JhbU9iaiwgY29uc3QgR0xjaGFyQVJCICpuYW1lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRBY3RpdmVVbmlmb3JtQVJCIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgbWF4TGVuZ3RoLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhckFSQiAqbmFtZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VW5pZm9ybWZ2QVJCIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRVbmlmb3JtaXZBUkIgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmosIEdMaW50IGxvY2F0aW9uLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRTaGFkZXJTb3VyY2VBUkIgKEdMaGFuZGxlQVJCIG9iaiwgR0xzaXplaSBtYXhMZW5ndGgsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyQVJCICpzb3VyY2UpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFT0JKRUNUQVJCUFJPQykgKEdMaGFuZGxlQVJCIG9iaik7Cit0eXBlZGVmIEdMaGFuZGxlQVJCIChBUElFTlRSWVAgUEZOR0xHRVRIQU5ETEVBUkJQUk9DKSAoR0xlbnVtIHBuYW1lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVUQUNIT0JKRUNUQVJCUFJPQykgKEdMaGFuZGxlQVJCIGNvbnRhaW5lck9iaiwgR0xoYW5kbGVBUkIgYXR0YWNoZWRPYmopOwordHlwZWRlZiBHTGhhbmRsZUFSQiAoQVBJRU5UUllQIFBGTkdMQ1JFQVRFU0hBREVST0JKRUNUQVJCUFJPQykgKEdMZW51bSBzaGFkZXJUeXBlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0hBREVSU09VUkNFQVJCUFJPQykgKEdMaGFuZGxlQVJCIHNoYWRlck9iaiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyQVJCKiAqc3RyaW5nLCBjb25zdCBHTGludCAqbGVuZ3RoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUElMRVNIQURFUkFSQlBST0MpIChHTGhhbmRsZUFSQiBzaGFkZXJPYmopOwordHlwZWRlZiBHTGhhbmRsZUFSQiAoQVBJRU5UUllQIFBGTkdMQ1JFQVRFUFJPR1JBTU9CSkVDVEFSQlBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQVRUQUNIT0JKRUNUQVJCUFJPQykgKEdMaGFuZGxlQVJCIGNvbnRhaW5lck9iaiwgR0xoYW5kbGVBUkIgb2JqKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTElOS1BST0dSQU1BUkJQUk9DKSAoR0xoYW5kbGVBUkIgcHJvZ3JhbU9iaik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVTRVBST0dSQU1PQkpFQ1RBUkJQUk9DKSAoR0xoYW5kbGVBUkIgcHJvZ3JhbU9iaik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZBTElEQVRFUFJPR1JBTUFSQlBST0MpIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFGQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJGQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNGQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRGQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyLCBHTGZsb2F0IHYzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFJQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0ySUFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNJQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRJQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyLCBHTGludCB2Myk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0xRlZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJGVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM0ZWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk00RlZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFJVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJJVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNJVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRJVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDJGVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYM0ZWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1NQVRSSVg0RlZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUT0JKRUNUUEFSQU1FVEVSRlZBUkJQUk9DKSAoR0xoYW5kbGVBUkIgb2JqLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE9CSkVDVFBBUkFNRVRFUklWQVJCUFJPQykgKEdMaGFuZGxlQVJCIG9iaiwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSU5GT0xPR0FSQlBST0MpIChHTGhhbmRsZUFSQiBvYmosIEdMc2l6ZWkgbWF4TGVuZ3RoLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhckFSQiAqaW5mb0xvZyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFUVEFDSEVET0JKRUNUU0FSQlBST0MpIChHTGhhbmRsZUFSQiBjb250YWluZXJPYmosIEdMc2l6ZWkgbWF4Q291bnQsIEdMc2l6ZWkgKmNvdW50LCBHTGhhbmRsZUFSQiAqb2JqKTsKK3R5cGVkZWYgR0xpbnQgKEFQSUVOVFJZUCBQRk5HTEdFVFVOSUZPUk1MT0NBVElPTkFSQlBST0MpIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqLCBjb25zdCBHTGNoYXJBUkIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBQ1RJVkVVTklGT1JNQVJCUFJPQykgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmosIEdMdWludCBpbmRleCwgR0xzaXplaSBtYXhMZW5ndGgsIEdMc2l6ZWkgKmxlbmd0aCwgR0xpbnQgKnNpemUsIEdMZW51bSAqdHlwZSwgR0xjaGFyQVJCICpuYW1lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVU5JRk9STUZWQVJCUFJPQykgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmosIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNSVZBUkJQUk9DKSAoR0xoYW5kbGVBUkIgcHJvZ3JhbU9iaiwgR0xpbnQgbG9jYXRpb24sIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRTSEFERVJTT1VSQ0VBUkJQUk9DKSAoR0xoYW5kbGVBUkIgb2JqLCBHTHNpemVpIG1heExlbmd0aCwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXJBUkIgKnNvdXJjZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdmVydGV4X3NoYWRlcgorI2RlZmluZSBHTF9BUkJfdmVydGV4X3NoYWRlciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRBdHRyaWJMb2NhdGlvbkFSQiAoR0xoYW5kbGVBUkIgcHJvZ3JhbU9iaiwgR0x1aW50IGluZGV4LCBjb25zdCBHTGNoYXJBUkIgKm5hbWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEFjdGl2ZUF0dHJpYkFSQiAoR0xoYW5kbGVBUkIgcHJvZ3JhbU9iaiwgR0x1aW50IGluZGV4LCBHTHNpemVpIG1heExlbmd0aCwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqc2l6ZSwgR0xlbnVtICp0eXBlLCBHTGNoYXJBUkIgKm5hbWUpOworR0xBUEkgR0xpbnQgQVBJRU5UUlkgZ2xHZXRBdHRyaWJMb2NhdGlvbkFSQiAoR0xoYW5kbGVBUkIgcHJvZ3JhbU9iaiwgY29uc3QgR0xjaGFyQVJCICpuYW1lKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRBVFRSSUJMT0NBVElPTkFSQlBST0MpIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqLCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMY2hhckFSQiAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFDVElWRUFUVFJJQkFSQlBST0MpIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgbWF4TGVuZ3RoLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhckFSQiAqbmFtZSk7Cit0eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xHRVRBVFRSSUJMT0NBVElPTkFSQlBST0MpIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqLCBjb25zdCBHTGNoYXJBUkIgKm5hbWUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2ZyYWdtZW50X3NoYWRlcgorI2RlZmluZSBHTF9BUkJfZnJhZ21lbnRfc2hhZGVyIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkaW5nX2xhbmd1YWdlXzEwMAorI2RlZmluZSBHTF9BUkJfc2hhZGluZ19sYW5ndWFnZV8xMDAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfbm9uX3Bvd2VyX29mX3R3bworI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9ub25fcG93ZXJfb2ZfdHdvIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9wb2ludF9zcHJpdGUKKyNkZWZpbmUgR0xfQVJCX3BvaW50X3Nwcml0ZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbV9zaGFkb3cKKyNkZWZpbmUgR0xfQVJCX2ZyYWdtZW50X3Byb2dyYW1fc2hhZG93IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9kcmF3X2J1ZmZlcnMKKyNkZWZpbmUgR0xfQVJCX2RyYXdfYnVmZmVycyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdCdWZmZXJzQVJCIChHTHNpemVpIG4sIGNvbnN0IEdMZW51bSAqYnVmcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXQlVGRkVSU0FSQlBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMZW51bSAqYnVmcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9yZWN0YW5nbGUKKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfcmVjdGFuZ2xlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9jb2xvcl9idWZmZXJfZmxvYXQKKyNkZWZpbmUgR0xfQVJCX2NvbG9yX2J1ZmZlcl9mbG9hdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsYW1wQ29sb3JBUkIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBjbGFtcCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDTEFNUENPTE9SQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBjbGFtcCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfaGFsZl9mbG9hdF9waXhlbAorI2RlZmluZSBHTF9BUkJfaGFsZl9mbG9hdF9waXhlbCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9mbG9hdAorI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9mbG9hdCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfcGl4ZWxfYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9BUkJfcGl4ZWxfYnVmZmVyX29iamVjdCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZGVwdGhfYnVmZmVyX2Zsb2F0CisjZGVmaW5lIEdMX0FSQl9kZXB0aF9idWZmZXJfZmxvYXQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2RyYXdfaW5zdGFuY2VkCisjZGVmaW5lIEdMX0FSQl9kcmF3X2luc3RhbmNlZCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdBcnJheXNJbnN0YW5jZWRBUkIgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCwgR0xzaXplaSBwcmltY291bnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdFbGVtZW50c0luc3RhbmNlZEFSQiAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdBUlJBWVNJTlNUQU5DRURBUkJQUk9DKSAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdFTEVNRU5UU0lOU1RBTkNFREFSQlBST0MpIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2ZyYW1lYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9BUkJfZnJhbWVidWZmZXJfb2JqZWN0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc1JlbmRlcmJ1ZmZlciAoR0x1aW50IHJlbmRlcmJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZFJlbmRlcmJ1ZmZlciAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlUmVuZGVyYnVmZmVycyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlblJlbmRlcmJ1ZmZlcnMgKEdMc2l6ZWkgbiwgR0x1aW50ICpyZW5kZXJidWZmZXJzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZW5kZXJidWZmZXJTdG9yYWdlIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzRnJhbWVidWZmZXIgKEdMdWludCBmcmFtZWJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEZyYW1lYnVmZmVyIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZUZyYW1lYnVmZmVycyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmZyYW1lYnVmZmVycyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuRnJhbWVidWZmZXJzIChHTHNpemVpIG4sIEdMdWludCAqZnJhbWVidWZmZXJzKTsKK0dMQVBJIEdMZW51bSBBUElFTlRSWSBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXMgKEdMZW51bSB0YXJnZXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZTFEIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVidWZmZXJUZXh0dXJlM0QgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IHpvZmZzZXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlbmVyYXRlTWlwbWFwIChHTGVudW0gdGFyZ2V0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGl0RnJhbWVidWZmZXIgKEdMaW50IHNyY1gwLCBHTGludCBzcmNZMCwgR0xpbnQgc3JjWDEsIEdMaW50IHNyY1kxLCBHTGludCBkc3RYMCwgR0xpbnQgZHN0WTAsIEdMaW50IGRzdFgxLCBHTGludCBkc3RZMSwgR0xiaXRmaWVsZCBtYXNrLCBHTGVudW0gZmlsdGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IGxheWVyKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNSRU5ERVJCVUZGRVJQUk9DKSAoR0x1aW50IHJlbmRlcmJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRSRU5ERVJCVUZGRVJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVJFTkRFUkJVRkZFUlNQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5SRU5ERVJCVUZGRVJTUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpyZW5kZXJidWZmZXJzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVOREVSQlVGRkVSU1RPUkFHRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUkVOREVSQlVGRkVSUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU0ZSQU1FQlVGRkVSUFJPQykgKEdMdWludCBmcmFtZWJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRGUkFNRUJVRkZFUlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVGUkFNRUJVRkZFUlNQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmZyYW1lYnVmZmVycyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTkZSQU1FQlVGRkVSU1BST0MpIChHTHNpemVpIG4sIEdMdWludCAqZnJhbWVidWZmZXJzKTsKK3R5cGVkZWYgR0xlbnVtIChBUElFTlRSWVAgUEZOR0xDSEVDS0ZSQU1FQlVGRkVSU1RBVFVTUFJPQykgKEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkUxRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJURVhUVVJFMkRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRTNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IHpvZmZzZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlJFTkRFUkJVRkZFUlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZSQU1FQlVGRkVSQVRUQUNITUVOVFBBUkFNRVRFUklWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5FUkFURU1JUE1BUFBST0MpIChHTGVudW0gdGFyZ2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkxJVEZSQU1FQlVGRkVSUFJPQykgKEdMaW50IHNyY1gwLCBHTGludCBzcmNZMCwgR0xpbnQgc3JjWDEsIEdMaW50IHNyY1kxLCBHTGludCBkc3RYMCwgR0xpbnQgZHN0WTAsIEdMaW50IGRzdFgxLCBHTGludCBkc3RZMSwgR0xiaXRmaWVsZCBtYXNrLCBHTGVudW0gZmlsdGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVOREVSQlVGRkVSU1RPUkFHRU1VTFRJU0FNUExFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRUxBWUVSUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IGxheWVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9mcmFtZWJ1ZmZlcl9zUkdCCisjZGVmaW5lIEdMX0FSQl9mcmFtZWJ1ZmZlcl9zUkdCIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9nZW9tZXRyeV9zaGFkZXI0CisjZGVmaW5lIEdMX0FSQl9nZW9tZXRyeV9zaGFkZXI0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVBhcmFtZXRlcmlBUkIgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50IHZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmVBUkIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZUxheWVyQVJCIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTGludCBsYXllcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVidWZmZXJUZXh0dXJlRmFjZUFSQiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xlbnVtIGZhY2UpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVBBUkFNRVRFUklBUkJQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQgdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkVBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRUxBWUVSQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IGxheWVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJURVhUVVJFRkFDRUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTGVudW0gZmFjZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfaGFsZl9mbG9hdF92ZXJ0ZXgKKyNkZWZpbmUgR0xfQVJCX2hhbGZfZmxvYXRfdmVydGV4IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9pbnN0YW5jZWRfYXJyYXlzCisjZGVmaW5lIEdMX0FSQl9pbnN0YW5jZWRfYXJyYXlzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliRGl2aXNvckFSQiAoR0x1aW50IGluZGV4LCBHTHVpbnQgZGl2aXNvcik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJESVZJU09SQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0x1aW50IGRpdmlzb3IpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX21hcF9idWZmZXJfcmFuZ2UKKyNkZWZpbmUgR0xfQVJCX21hcF9idWZmZXJfcmFuZ2UgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIEdMdm9pZCogQVBJRU5UUlkgZ2xNYXBCdWZmZXJSYW5nZSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIGxlbmd0aCwgR0xiaXRmaWVsZCBhY2Nlc3MpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZsdXNoTWFwcGVkQnVmZmVyUmFuZ2UgKEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBsZW5ndGgpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0x2b2lkKiAoQVBJRU5UUllQIFBGTkdMTUFQQlVGRkVSUkFOR0VQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIGxlbmd0aCwgR0xiaXRmaWVsZCBhY2Nlc3MpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGTFVTSE1BUFBFREJVRkZFUlJBTkdFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBsZW5ndGgpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9idWZmZXJfb2JqZWN0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4QnVmZmVyQVJCIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMdWludCBidWZmZXIpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQlVGRkVSQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0x1aW50IGJ1ZmZlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9jb21wcmVzc2lvbl9yZ3RjCisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX2NvbXByZXNzaW9uX3JndGMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfcmcKKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfcmcgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3ZlcnRleF9hcnJheV9vYmplY3QKKyNkZWZpbmUgR0xfQVJCX3ZlcnRleF9hcnJheV9vYmplY3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kVmVydGV4QXJyYXkgKEdMdWludCBhcnJheSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlVmVydGV4QXJyYXlzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYXJyYXlzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5WZXJ0ZXhBcnJheXMgKEdMc2l6ZWkgbiwgR0x1aW50ICphcnJheXMpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNWZXJ0ZXhBcnJheSAoR0x1aW50IGFycmF5KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRWRVJURVhBUlJBWVBST0MpIChHTHVpbnQgYXJyYXkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVWRVJURVhBUlJBWVNQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmFycmF5cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTlZFUlRFWEFSUkFZU1BST0MpIChHTHNpemVpIG4sIEdMdWludCAqYXJyYXlzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1ZFUlRFWEFSUkFZUFJPQykgKEdMdWludCBhcnJheSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdW5pZm9ybV9idWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX0FSQl91bmlmb3JtX2J1ZmZlcl9vYmplY3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRVbmlmb3JtSW5kaWNlcyAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgdW5pZm9ybUNvdW50LCBjb25zdCBHTGNoYXIqICp1bmlmb3JtTmFtZXMsIEdMdWludCAqdW5pZm9ybUluZGljZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEFjdGl2ZVVuaWZvcm1zaXYgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIHVuaWZvcm1Db3VudCwgY29uc3QgR0x1aW50ICp1bmlmb3JtSW5kaWNlcywgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRBY3RpdmVVbmlmb3JtTmFtZSAoR0x1aW50IHByb2dyYW0sIEdMdWludCB1bmlmb3JtSW5kZXgsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKnVuaWZvcm1OYW1lKTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbEdldFVuaWZvcm1CbG9ja0luZGV4IChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyICp1bmlmb3JtQmxvY2tOYW1lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRBY3RpdmVVbmlmb3JtQmxvY2tpdiAoR0x1aW50IHByb2dyYW0sIEdMdWludCB1bmlmb3JtQmxvY2tJbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRBY3RpdmVVbmlmb3JtQmxvY2tOYW1lIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHVuaWZvcm1CbG9ja0luZGV4LCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICp1bmlmb3JtQmxvY2tOYW1lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtQmxvY2tCaW5kaW5nIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHVuaWZvcm1CbG9ja0luZGV4LCBHTHVpbnQgdW5pZm9ybUJsb2NrQmluZGluZyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNSU5ESUNFU1BST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSB1bmlmb3JtQ291bnQsIGNvbnN0IEdMY2hhciogKnVuaWZvcm1OYW1lcywgR0x1aW50ICp1bmlmb3JtSW5kaWNlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFDVElWRVVOSUZPUk1TSVZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgdW5pZm9ybUNvdW50LCBjb25zdCBHTHVpbnQgKnVuaWZvcm1JbmRpY2VzLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBQ1RJVkVVTklGT1JNTkFNRVBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHVuaWZvcm1JbmRleCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqdW5pZm9ybU5hbWUpOwordHlwZWRlZiBHTHVpbnQgKEFQSUVOVFJZUCBQRk5HTEdFVFVOSUZPUk1CTE9DS0lOREVYUFJPQykgKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKnVuaWZvcm1CbG9ja05hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBQ1RJVkVVTklGT1JNQkxPQ0tJVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHVuaWZvcm1CbG9ja0luZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBQ1RJVkVVTklGT1JNQkxPQ0tOQU1FUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgdW5pZm9ybUJsb2NrSW5kZXgsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKnVuaWZvcm1CbG9ja05hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNQkxPQ0tCSU5ESU5HUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgdW5pZm9ybUJsb2NrSW5kZXgsIEdMdWludCB1bmlmb3JtQmxvY2tCaW5kaW5nKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9jb21wYXRpYmlsaXR5CisjZGVmaW5lIEdMX0FSQl9jb21wYXRpYmlsaXR5IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9jb3B5X2J1ZmZlcgorI2RlZmluZSBHTF9BUkJfY29weV9idWZmZXIgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5QnVmZmVyU3ViRGF0YSAoR0xlbnVtIHJlYWRUYXJnZXQsIEdMZW51bSB3cml0ZVRhcmdldCwgR0xpbnRwdHIgcmVhZE9mZnNldCwgR0xpbnRwdHIgd3JpdGVPZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZQlVGRkVSU1VCREFUQVBST0MpIChHTGVudW0gcmVhZFRhcmdldCwgR0xlbnVtIHdyaXRlVGFyZ2V0LCBHTGludHB0ciByZWFkT2Zmc2V0LCBHTGludHB0ciB3cml0ZU9mZnNldCwgR0xzaXplaXB0ciBzaXplKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkZXJfdGV4dHVyZV9sb2QKKyNkZWZpbmUgR0xfQVJCX3NoYWRlcl90ZXh0dXJlX2xvZCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZGVwdGhfY2xhbXAKKyNkZWZpbmUgR0xfQVJCX2RlcHRoX2NsYW1wIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9kcmF3X2VsZW1lbnRzX2Jhc2VfdmVydGV4CisjZGVmaW5lIEdMX0FSQl9kcmF3X2VsZW1lbnRzX2Jhc2VfdmVydGV4IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0VsZW1lbnRzQmFzZVZlcnRleCAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMsIEdMaW50IGJhc2V2ZXJ0ZXgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdSYW5nZUVsZW1lbnRzQmFzZVZlcnRleCAoR0xlbnVtIG1vZGUsIEdMdWludCBzdGFydCwgR0x1aW50IGVuZCwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcywgR0xpbnQgYmFzZXZlcnRleCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0VsZW1lbnRzSW5zdGFuY2VkQmFzZVZlcnRleCAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50LCBHTGludCBiYXNldmVydGV4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aURyYXdFbGVtZW50c0Jhc2VWZXJ0ZXggKEdMZW51bSBtb2RlLCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50LCBjb25zdCBHTGludCAqYmFzZXZlcnRleCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXRUxFTUVOVFNCQVNFVkVSVEVYUFJPQykgKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzLCBHTGludCBiYXNldmVydGV4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV1JBTkdFRUxFTUVOVFNCQVNFVkVSVEVYUFJPQykgKEdMZW51bSBtb2RlLCBHTHVpbnQgc3RhcnQsIEdMdWludCBlbmQsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMsIEdMaW50IGJhc2V2ZXJ0ZXgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXRUxFTUVOVFNJTlNUQU5DRURCQVNFVkVSVEVYUFJPQykgKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCwgR0xpbnQgYmFzZXZlcnRleCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJRFJBV0VMRU1FTlRTQkFTRVZFUlRFWFBST0MpIChHTGVudW0gbW9kZSwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCwgY29uc3QgR0xpbnQgKmJhc2V2ZXJ0ZXgpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2ZyYWdtZW50X2Nvb3JkX2NvbnZlbnRpb25zCisjZGVmaW5lIEdMX0FSQl9mcmFnbWVudF9jb29yZF9jb252ZW50aW9ucyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfcHJvdm9raW5nX3ZlcnRleAorI2RlZmluZSBHTF9BUkJfcHJvdm9raW5nX3ZlcnRleCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb3Zva2luZ1ZlcnRleCAoR0xlbnVtIG1vZGUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPVk9LSU5HVkVSVEVYUFJPQykgKEdMZW51bSBtb2RlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zZWFtbGVzc19jdWJlX21hcAorI2RlZmluZSBHTF9BUkJfc2VhbWxlc3NfY3ViZV9tYXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3N5bmMKKyNkZWZpbmUgR0xfQVJCX3N5bmMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIEdMc3luYyBBUElFTlRSWSBnbEZlbmNlU3luYyAoR0xlbnVtIGNvbmRpdGlvbiwgR0xiaXRmaWVsZCBmbGFncyk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc1N5bmMgKEdMc3luYyBzeW5jKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVTeW5jIChHTHN5bmMgc3luYyk7CitHTEFQSSBHTGVudW0gQVBJRU5UUlkgZ2xDbGllbnRXYWl0U3luYyAoR0xzeW5jIHN5bmMsIEdMYml0ZmllbGQgZmxhZ3MsIEdMdWludDY0IHRpbWVvdXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdhaXRTeW5jIChHTHN5bmMgc3luYywgR0xiaXRmaWVsZCBmbGFncywgR0x1aW50NjQgdGltZW91dCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SW50ZWdlcjY0diAoR0xlbnVtIHBuYW1lLCBHTGludDY0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFN5bmNpdiAoR0xzeW5jIHN5bmMsIEdMZW51bSBwbmFtZSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICp2YWx1ZXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0xzeW5jIChBUElFTlRSWVAgUEZOR0xGRU5DRVNZTkNQUk9DKSAoR0xlbnVtIGNvbmRpdGlvbiwgR0xiaXRmaWVsZCBmbGFncyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNTWU5DUFJPQykgKEdMc3luYyBzeW5jKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFU1lOQ1BST0MpIChHTHN5bmMgc3luYyk7Cit0eXBlZGVmIEdMZW51bSAoQVBJRU5UUllQIFBGTkdMQ0xJRU5UV0FJVFNZTkNQUk9DKSAoR0xzeW5jIHN5bmMsIEdMYml0ZmllbGQgZmxhZ3MsIEdMdWludDY0IHRpbWVvdXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXQUlUU1lOQ1BST0MpIChHTHN5bmMgc3luYywgR0xiaXRmaWVsZCBmbGFncywgR0x1aW50NjQgdGltZW91dCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVElOVEVHRVI2NFZQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludDY0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRTWU5DSVZQUk9DKSAoR0xzeW5jIHN5bmMsIEdMZW51bSBwbmFtZSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICp2YWx1ZXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfbXVsdGlzYW1wbGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhJbWFnZTJETXVsdGlzYW1wbGUgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGJvb2xlYW4gZml4ZWRzYW1wbGVsb2NhdGlvbnMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEltYWdlM0RNdWx0aXNhbXBsZSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMYm9vbGVhbiBmaXhlZHNhbXBsZWxvY2F0aW9ucyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TXVsdGlzYW1wbGVmdiAoR0xlbnVtIHBuYW1lLCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgKnZhbCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2FtcGxlTWFza2kgKEdMdWludCBpbmRleCwgR0xiaXRmaWVsZCBtYXNrKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWElNQUdFMkRNVUxUSVNBTVBMRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xib29sZWFuIGZpeGVkc2FtcGxlbG9jYXRpb25zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYSU1BR0UzRE1VTFRJU0FNUExFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGJvb2xlYW4gZml4ZWRzYW1wbGVsb2NhdGlvbnMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNVUxUSVNBTVBMRUZWUFJPQykgKEdMZW51bSBwbmFtZSwgR0x1aW50IGluZGV4LCBHTGZsb2F0ICp2YWwpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVNQVNLSVBST0MpIChHTHVpbnQgaW5kZXgsIEdMYml0ZmllbGQgbWFzayk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdmVydGV4X2FycmF5X2JncmEKKyNkZWZpbmUgR0xfQVJCX3ZlcnRleF9hcnJheV9iZ3JhIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9kcmF3X2J1ZmZlcnNfYmxlbmQKKyNkZWZpbmUgR0xfQVJCX2RyYXdfYnVmZmVyc19ibGVuZCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRXF1YXRpb25pQVJCIChHTHVpbnQgYnVmLCBHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlaUFSQiAoR0x1aW50IGJ1ZiwgR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRnVuY2lBUkIgKEdMdWludCBidWYsIEdMZW51bSBzcmMsIEdMZW51bSBkc3QpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRnVuY1NlcGFyYXRlaUFSQiAoR0x1aW50IGJ1ZiwgR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkxFTkRFUVVBVElPTklBUkJQUk9DKSAoR0x1aW50IGJ1ZiwgR0xlbnVtIG1vZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREVRVUFUSU9OU0VQQVJBVEVJQVJCUFJPQykgKEdMdWludCBidWYsIEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkxFTkRGVU5DSUFSQlBST0MpIChHTHVpbnQgYnVmLCBHTGVudW0gc3JjLCBHTGVudW0gZHN0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkxFTkRGVU5DU0VQQVJBVEVJQVJCUFJPQykgKEdMdWludCBidWYsIEdMZW51bSBzcmNSR0IsIEdMZW51bSBkc3RSR0IsIEdMZW51bSBzcmNBbHBoYSwgR0xlbnVtIGRzdEFscGhhKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zYW1wbGVfc2hhZGluZworI2RlZmluZSBHTF9BUkJfc2FtcGxlX3NoYWRpbmcgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNaW5TYW1wbGVTaGFkaW5nQVJCIChHTGNsYW1wZiB2YWx1ZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNSU5TQU1QTEVTSEFESU5HQVJCUFJPQykgKEdMY2xhbXBmIHZhbHVlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2N1YmVfbWFwX2FycmF5CisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX2N1YmVfbWFwX2FycmF5IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2dhdGhlcgorI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9nYXRoZXIgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfcXVlcnlfbG9kCisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX3F1ZXJ5X2xvZCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZGluZ19sYW5ndWFnZV9pbmNsdWRlCisjZGVmaW5lIEdMX0FSQl9zaGFkaW5nX2xhbmd1YWdlX2luY2x1ZGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOYW1lZFN0cmluZ0FSQiAoR0xlbnVtIHR5cGUsIEdMaW50IG5hbWVsZW4sIGNvbnN0IEdMY2hhciAqbmFtZSwgR0xpbnQgc3RyaW5nbGVuLCBjb25zdCBHTGNoYXIgKnN0cmluZyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlTmFtZWRTdHJpbmdBUkIgKEdMaW50IG5hbWVsZW4sIGNvbnN0IEdMY2hhciAqbmFtZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcGlsZVNoYWRlckluY2x1ZGVBUkIgKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhciogKnBhdGgsIGNvbnN0IEdMaW50ICpsZW5ndGgpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNOYW1lZFN0cmluZ0FSQiAoR0xpbnQgbmFtZWxlbiwgY29uc3QgR0xjaGFyICpuYW1lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXROYW1lZFN0cmluZ0FSQiAoR0xpbnQgbmFtZWxlbiwgY29uc3QgR0xjaGFyICpuYW1lLCBHTHNpemVpIGJ1ZlNpemUsIEdMaW50ICpzdHJpbmdsZW4sIEdMY2hhciAqc3RyaW5nKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXROYW1lZFN0cmluZ2l2QVJCIChHTGludCBuYW1lbGVuLCBjb25zdCBHTGNoYXIgKm5hbWUsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOQU1FRFNUUklOR0FSQlBST0MpIChHTGVudW0gdHlwZSwgR0xpbnQgbmFtZWxlbiwgY29uc3QgR0xjaGFyICpuYW1lLCBHTGludCBzdHJpbmdsZW4sIGNvbnN0IEdMY2hhciAqc3RyaW5nKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFTkFNRURTVFJJTkdBUkJQUk9DKSAoR0xpbnQgbmFtZWxlbiwgY29uc3QgR0xjaGFyICpuYW1lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUElMRVNIQURFUklOQ0xVREVBUkJQUk9DKSAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyKiAqcGF0aCwgY29uc3QgR0xpbnQgKmxlbmd0aCk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNOQU1FRFNUUklOR0FSQlBST0MpIChHTGludCBuYW1lbGVuLCBjb25zdCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROQU1FRFNUUklOR0FSQlBST0MpIChHTGludCBuYW1lbGVuLCBjb25zdCBHTGNoYXIgKm5hbWUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xpbnQgKnN0cmluZ2xlbiwgR0xjaGFyICpzdHJpbmcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROQU1FRFNUUklOR0lWQVJCUFJPQykgKEdMaW50IG5hbWVsZW4sIGNvbnN0IEdMY2hhciAqbmFtZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2NvbXByZXNzaW9uX2JwdGMKKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfY29tcHJlc3Npb25fYnB0YyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfYmxlbmRfZnVuY19leHRlbmRlZAorI2RlZmluZSBHTF9BUkJfYmxlbmRfZnVuY19leHRlbmRlZCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRGcmFnRGF0YUxvY2F0aW9uSW5kZXhlZCAoR0x1aW50IHByb2dyYW0sIEdMdWludCBjb2xvck51bWJlciwgR0x1aW50IGluZGV4LCBjb25zdCBHTGNoYXIgKm5hbWUpOworR0xBUEkgR0xpbnQgQVBJRU5UUlkgZ2xHZXRGcmFnRGF0YUluZGV4IChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyICpuYW1lKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRGUkFHREFUQUxPQ0FUSU9OSU5ERVhFRFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGNvbG9yTnVtYmVyLCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMY2hhciAqbmFtZSk7Cit0eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xHRVRGUkFHREFUQUlOREVYUFJPQykgKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKm5hbWUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2V4cGxpY2l0X2F0dHJpYl9sb2NhdGlvbgorI2RlZmluZSBHTF9BUkJfZXhwbGljaXRfYXR0cmliX2xvY2F0aW9uIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9vY2NsdXNpb25fcXVlcnkyCisjZGVmaW5lIEdMX0FSQl9vY2NsdXNpb25fcXVlcnkyIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zYW1wbGVyX29iamVjdHMKKyNkZWZpbmUgR0xfQVJCX3NhbXBsZXJfb2JqZWN0cyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlblNhbXBsZXJzIChHTHNpemVpIGNvdW50LCBHTHVpbnQgKnNhbXBsZXJzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVTYW1wbGVycyAoR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICpzYW1wbGVycyk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc1NhbXBsZXIgKEdMdWludCBzYW1wbGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kU2FtcGxlciAoR0x1aW50IHVuaXQsIEdMdWludCBzYW1wbGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVyUGFyYW1ldGVyaSAoR0x1aW50IHNhbXBsZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZXJQYXJhbWV0ZXJpdiAoR0x1aW50IHNhbXBsZXIsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVyUGFyYW1ldGVyZiAoR0x1aW50IHNhbXBsZXIsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2FtcGxlclBhcmFtZXRlcmZ2IChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2FtcGxlclBhcmFtZXRlcklpdiAoR0x1aW50IHNhbXBsZXIsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVyUGFyYW1ldGVySXVpdiAoR0x1aW50IHNhbXBsZXIsIEdMZW51bSBwbmFtZSwgY29uc3QgR0x1aW50ICpwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0U2FtcGxlclBhcmFtZXRlcml2IChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRTYW1wbGVyUGFyYW1ldGVySWl2IChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRTYW1wbGVyUGFyYW1ldGVyZnYgKEdMdWludCBzYW1wbGVyLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0U2FtcGxlclBhcmFtZXRlckl1aXYgKEdMdWludCBzYW1wbGVyLCBHTGVudW0gcG5hbWUsIEdMdWludCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTlNBTVBMRVJTUFJPQykgKEdMc2l6ZWkgY291bnQsIEdMdWludCAqc2FtcGxlcnMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVTQU1QTEVSU1BST0MpIChHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnNhbXBsZXJzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1NBTVBMRVJQUk9DKSAoR0x1aW50IHNhbXBsZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EU0FNUExFUlBST0MpIChHTHVpbnQgdW5pdCwgR0x1aW50IHNhbXBsZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVSUEFSQU1FVEVSSVBST0MpIChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNBTVBMRVJQQVJBTUVURVJJVlBST0MpIChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVSUEFSQU1FVEVSRlBST0MpIChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0FNUExFUlBBUkFNRVRFUkZWUFJPQykgKEdMdWludCBzYW1wbGVyLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0FNUExFUlBBUkFNRVRFUklJVlBST0MpIChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVSUEFSQU1FVEVSSVVJVlBST0MpIChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTHVpbnQgKnBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUU0FNUExFUlBBUkFNRVRFUklWUFJPQykgKEdMdWludCBzYW1wbGVyLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRTQU1QTEVSUEFSQU1FVEVSSUlWUFJPQykgKEdMdWludCBzYW1wbGVyLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRTQU1QTEVSUEFSQU1FVEVSRlZQUk9DKSAoR0x1aW50IHNhbXBsZXIsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUU0FNUExFUlBBUkFNRVRFUklVSVZQUk9DKSAoR0x1aW50IHNhbXBsZXIsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRlcl9iaXRfZW5jb2RpbmcKKyNkZWZpbmUgR0xfQVJCX3NoYWRlcl9iaXRfZW5jb2RpbmcgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfcmdiMTBfYTJ1aQorI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9yZ2IxMF9hMnVpIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX3N3aXp6bGUKKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfc3dpenpsZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGltZXJfcXVlcnkKKyNkZWZpbmUgR0xfQVJCX3RpbWVyX3F1ZXJ5IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUXVlcnlDb3VudGVyIChHTHVpbnQgaWQsIEdMZW51bSB0YXJnZXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFF1ZXJ5T2JqZWN0aTY0diAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50NjQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UXVlcnlPYmplY3R1aTY0diAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMdWludDY0ICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUVVFUllDT1VOVEVSUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHRhcmdldCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFFVRVJZT0JKRUNUSTY0VlBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0xpbnQ2NCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUVVFUllPQkpFQ1RVSTY0VlBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50NjQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdmVydGV4X3R5cGVfMl8xMF8xMF8xMF9yZXYKKyNkZWZpbmUgR0xfQVJCX3ZlcnRleF90eXBlXzJfMTBfMTBfMTBfcmV2IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4UDJ1aSAoR0xlbnVtIHR5cGUsIEdMdWludCB2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4UDJ1aXYgKEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhQM3VpIChHTGVudW0gdHlwZSwgR0x1aW50IHZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhQM3VpdiAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFA0dWkgKEdMZW51bSB0eXBlLCBHTHVpbnQgdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFA0dWl2IChHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmRQMXVpIChHTGVudW0gdHlwZSwgR0x1aW50IGNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmRQMXVpdiAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZFAydWkgKEdMZW51bSB0eXBlLCBHTHVpbnQgY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZFAydWl2IChHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICpjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkUDN1aSAoR0xlbnVtIHR5cGUsIEdMdWludCBjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkUDN1aXYgKEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKmNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmRQNHVpIChHTGVudW0gdHlwZSwgR0x1aW50IGNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmRQNHVpdiAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkUDF1aSAoR0xlbnVtIHRleHR1cmUsIEdMZW51bSB0eXBlLCBHTHVpbnQgY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkUDF1aXYgKEdMZW51bSB0ZXh0dXJlLCBHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICpjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmRQMnVpIChHTGVudW0gdGV4dHVyZSwgR0xlbnVtIHR5cGUsIEdMdWludCBjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmRQMnVpdiAoR0xlbnVtIHRleHR1cmUsIEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKmNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZFAzdWkgKEdMZW51bSB0ZXh0dXJlLCBHTGVudW0gdHlwZSwgR0x1aW50IGNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZFAzdWl2IChHTGVudW0gdGV4dHVyZSwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkUDR1aSAoR0xlbnVtIHRleHR1cmUsIEdMZW51bSB0eXBlLCBHTHVpbnQgY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkUDR1aXYgKEdMZW51bSB0ZXh0dXJlLCBHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICpjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbFAzdWkgKEdMZW51bSB0eXBlLCBHTHVpbnQgY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxQM3VpdiAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclAzdWkgKEdMZW51bSB0eXBlLCBHTHVpbnQgY29sb3IpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yUDN1aXYgKEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKmNvbG9yKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclA0dWkgKEdMZW51bSB0eXBlLCBHTHVpbnQgY29sb3IpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yUDR1aXYgKEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKmNvbG9yKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvclAzdWkgKEdMZW51bSB0eXBlLCBHTHVpbnQgY29sb3IpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yUDN1aXYgKEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKmNvbG9yKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJQMXVpIChHTHVpbnQgaW5kZXgsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0x1aW50IHZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJQMXVpdiAoR0x1aW50IGluZGV4LCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYlAydWkgKEdMdWludCBpbmRleCwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHVpbnQgdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYlAydWl2IChHTHVpbnQgaW5kZXgsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliUDN1aSAoR0x1aW50IGluZGV4LCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMdWludCB2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliUDN1aXYgKEdMdWludCBpbmRleCwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJQNHVpIChHTHVpbnQgaW5kZXgsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0x1aW50IHZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJQNHVpdiAoR0x1aW50IGluZGV4LCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYUDJVSVBST0MpIChHTGVudW0gdHlwZSwgR0x1aW50IHZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYUDJVSVZQUk9DKSAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhQM1VJUFJPQykgKEdMZW51bSB0eXBlLCBHTHVpbnQgdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhQM1VJVlBST0MpIChHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFA0VUlQUk9DKSAoR0xlbnVtIHR5cGUsIEdMdWludCB2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFA0VUlWUFJPQykgKEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkRQMVVJUFJPQykgKEdMZW51bSB0eXBlLCBHTHVpbnQgY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkRQMVVJVlBST0MpIChHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRFAyVUlQUk9DKSAoR0xlbnVtIHR5cGUsIEdMdWludCBjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRFAyVUlWUFJPQykgKEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEUDNVSVBST0MpIChHTGVudW0gdHlwZSwgR0x1aW50IGNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEUDNVSVZQUk9DKSAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkRQNFVJUFJPQykgKEdMZW51bSB0eXBlLCBHTHVpbnQgY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkRQNFVJVlBST0MpIChHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEUDFVSVBST0MpIChHTGVudW0gdGV4dHVyZSwgR0xlbnVtIHR5cGUsIEdMdWludCBjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEUDFVSVZQUk9DKSAoR0xlbnVtIHRleHR1cmUsIEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkRQMlVJUFJPQykgKEdMZW51bSB0ZXh0dXJlLCBHTGVudW0gdHlwZSwgR0x1aW50IGNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkRQMlVJVlBST0MpIChHTGVudW0gdGV4dHVyZSwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRFAzVUlQUk9DKSAoR0xlbnVtIHRleHR1cmUsIEdMZW51bSB0eXBlLCBHTHVpbnQgY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRFAzVUlWUFJPQykgKEdMZW51bSB0ZXh0dXJlLCBHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEUDRVSVBST0MpIChHTGVudW0gdGV4dHVyZSwgR0xlbnVtIHR5cGUsIEdMdWludCBjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEUDRVSVZQUk9DKSAoR0xlbnVtIHRleHR1cmUsIEdMZW51bSB0eXBlLCBjb25zdCBHTHVpbnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFAzVUlQUk9DKSAoR0xlbnVtIHR5cGUsIEdMdWludCBjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxQM1VJVlBST0MpIChHTGVudW0gdHlwZSwgY29uc3QgR0x1aW50ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlAzVUlQUk9DKSAoR0xlbnVtIHR5cGUsIEdMdWludCBjb2xvcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SUDNVSVZQUk9DKSAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29sb3IpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlA0VUlQUk9DKSAoR0xlbnVtIHR5cGUsIEdMdWludCBjb2xvcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SUDRVSVZQUk9DKSAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29sb3IpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUlAzVUlQUk9DKSAoR0xlbnVtIHR5cGUsIEdMdWludCBjb2xvcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SUDNVSVZQUk9DKSAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdWludCAqY29sb3IpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJQMVVJUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHVpbnQgdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJQMVVJVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlAyVUlQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMdWludCB2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlAyVUlWUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUDNVSVBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0x1aW50IHZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUDNVSVZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIGNvbnN0IEdMdWludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJQNFVJUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHVpbnQgdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJQNFVJVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZHJhd19pbmRpcmVjdAorI2RlZmluZSBHTF9BUkJfZHJhd19pbmRpcmVjdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdBcnJheXNJbmRpcmVjdCAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMdm9pZCAqaW5kaXJlY3QpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdFbGVtZW50c0luZGlyZWN0IChHTGVudW0gbW9kZSwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaXJlY3QpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV0FSUkFZU0lORElSRUNUUFJPQykgKEdMZW51bSBtb2RlLCBjb25zdCBHTHZvaWQgKmluZGlyZWN0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV0VMRU1FTlRTSU5ESVJFQ1RQUk9DKSAoR0xlbnVtIG1vZGUsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGlyZWN0KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9ncHVfc2hhZGVyNQorI2RlZmluZSBHTF9BUkJfZ3B1X3NoYWRlcjUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2dwdV9zaGFkZXJfZnA2NAorI2RlZmluZSBHTF9BUkJfZ3B1X3NoYWRlcl9mcDY0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFkIChHTGludCBsb2NhdGlvbiwgR0xkb3VibGUgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJkIChHTGludCBsb2NhdGlvbiwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNkIChHTGludCBsb2NhdGlvbiwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRkIChHTGludCBsb2NhdGlvbiwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFkdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJkdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNkdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRkdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDJkdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDNkdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDRkdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDJ4M2R2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4Mng0ZHYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgzeDJkdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDN4NGR2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4NHgyZHYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1NYXRyaXg0eDNkdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VW5pZm9ybWR2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZG91YmxlICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFEUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGRvdWJsZSB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJEUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNEUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTREUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFEVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJEVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNEVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTREVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDJEVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDNEVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDREVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDJYM0RWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYMlg0RFZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1NQVRSSVgzWDJEVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDNYNERWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYNFgyRFZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1NQVRSSVg0WDNEVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVU5JRk9STURWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xkb3VibGUgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZGVyX3N1YnJvdXRpbmUKKyNkZWZpbmUgR0xfQVJCX3NoYWRlcl9zdWJyb3V0aW5lIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSBHTGludCBBUElFTlRSWSBnbEdldFN1YnJvdXRpbmVVbmlmb3JtTG9jYXRpb24gKEdMdWludCBwcm9ncmFtLCBHTGVudW0gc2hhZGVydHlwZSwgY29uc3QgR0xjaGFyICpuYW1lKTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbEdldFN1YnJvdXRpbmVJbmRleCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBzaGFkZXJ0eXBlLCBjb25zdCBHTGNoYXIgKm5hbWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEFjdGl2ZVN1YnJvdXRpbmVVbmlmb3JtaXYgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gc2hhZGVydHlwZSwgR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50ICp2YWx1ZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEFjdGl2ZVN1YnJvdXRpbmVVbmlmb3JtTmFtZSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBzaGFkZXJ0eXBlLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKm5hbWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEFjdGl2ZVN1YnJvdXRpbmVOYW1lIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqbmFtZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybVN1YnJvdXRpbmVzdWl2IChHTGVudW0gc2hhZGVydHlwZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICppbmRpY2VzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRVbmlmb3JtU3Vicm91dGluZXVpdiAoR0xlbnVtIHNoYWRlcnR5cGUsIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbVN0YWdlaXYgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gc2hhZGVydHlwZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqdmFsdWVzKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xHRVRTVUJST1VUSU5FVU5JRk9STUxPQ0FUSU9OUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gc2hhZGVydHlwZSwgY29uc3QgR0xjaGFyICpuYW1lKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xHRVRTVUJST1VUSU5FSU5ERVhQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBzaGFkZXJ0eXBlLCBjb25zdCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBQ1RJVkVTVUJST1VUSU5FVU5JRk9STUlWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gc2hhZGVydHlwZSwgR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50ICp2YWx1ZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBQ1RJVkVTVUJST1VUSU5FVU5JRk9STU5BTUVQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBzaGFkZXJ0eXBlLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBQ1RJVkVTVUJST1VUSU5FTkFNRVBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1TVUJST1VUSU5FU1VJVlBST0MpIChHTGVudW0gc2hhZGVydHlwZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICppbmRpY2VzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVU5JRk9STVNVQlJPVVRJTkVVSVZQUk9DKSAoR0xlbnVtIHNoYWRlcnR5cGUsIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1TVEFHRUlWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gc2hhZGVydHlwZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqdmFsdWVzKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXNzZWxsYXRpb25fc2hhZGVyCisjZGVmaW5lIEdMX0FSQl90ZXNzZWxsYXRpb25fc2hhZGVyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGF0Y2hQYXJhbWV0ZXJpIChHTGVudW0gcG5hbWUsIEdMaW50IHZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQYXRjaFBhcmFtZXRlcmZ2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnZhbHVlcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQQVRDSFBBUkFNRVRFUklQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCB2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBBVENIUEFSQU1FVEVSRlZQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICp2YWx1ZXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfYnVmZmVyX29iamVjdF9yZ2IzMgorI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9idWZmZXJfb2JqZWN0X3JnYjMyIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90cmFuc2Zvcm1fZmVlZGJhY2syCisjZGVmaW5lIEdMX0FSQl90cmFuc2Zvcm1fZmVlZGJhY2syIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZFRyYW5zZm9ybUZlZWRiYWNrIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVRyYW5zZm9ybUZlZWRiYWNrcyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmlkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuVHJhbnNmb3JtRmVlZGJhY2tzIChHTHNpemVpIG4sIEdMdWludCAqaWRzKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzVHJhbnNmb3JtRmVlZGJhY2sgKEdMdWludCBpZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGF1c2VUcmFuc2Zvcm1GZWVkYmFjayAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVzdW1lVHJhbnNmb3JtRmVlZGJhY2sgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdUcmFuc2Zvcm1GZWVkYmFjayAoR0xlbnVtIG1vZGUsIEdMdWludCBpZCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EVFJBTlNGT1JNRkVFREJBQ0tQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFVFJBTlNGT1JNRkVFREJBQ0tTUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICppZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5UUkFOU0ZPUk1GRUVEQkFDS1NQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKmlkcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNUUkFOU0ZPUk1GRUVEQkFDS1BST0MpIChHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQQVVTRVRSQU5TRk9STUZFRURCQUNLUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVNVTUVUUkFOU0ZPUk1GRUVEQkFDS1BST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV1RSQU5TRk9STUZFRURCQUNLUFJPQykgKEdMZW51bSBtb2RlLCBHTHVpbnQgaWQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RyYW5zZm9ybV9mZWVkYmFjazMKKyNkZWZpbmUgR0xfQVJCX3RyYW5zZm9ybV9mZWVkYmFjazMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3VHJhbnNmb3JtRmVlZGJhY2tTdHJlYW0gKEdMZW51bSBtb2RlLCBHTHVpbnQgaWQsIEdMdWludCBzdHJlYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJlZ2luUXVlcnlJbmRleGVkIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCBpZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5kUXVlcnlJbmRleGVkIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFF1ZXJ5SW5kZXhlZGl2IChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXVFJBTlNGT1JNRkVFREJBQ0tTVFJFQU1QUk9DKSAoR0xlbnVtIG1vZGUsIEdMdWludCBpZCwgR0x1aW50IHN0cmVhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJFR0lOUVVFUllJTkRFWEVEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IGlkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5EUVVFUllJTkRFWEVEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFFVRVJZSU5ERVhFRElWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9FUzJfY29tcGF0aWJpbGl0eQorI2RlZmluZSBHTF9BUkJfRVMyX2NvbXBhdGliaWxpdHkgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZWxlYXNlU2hhZGVyQ29tcGlsZXIgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNoYWRlckJpbmFyeSAoR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICpzaGFkZXJzLCBHTGVudW0gYmluYXJ5Zm9ybWF0LCBjb25zdCBHTHZvaWQgKmJpbmFyeSwgR0xzaXplaSBsZW5ndGgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFNoYWRlclByZWNpc2lvbkZvcm1hdCAoR0xlbnVtIHNoYWRlcnR5cGUsIEdMZW51bSBwcmVjaXNpb250eXBlLCBHTGludCAqcmFuZ2UsIEdMaW50ICpwcmVjaXNpb24pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlcHRoUmFuZ2VmIChHTGNsYW1wZiBuLCBHTGNsYW1wZiBmKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckRlcHRoZiAoR0xjbGFtcGYgZCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRUxFQVNFU0hBREVSQ09NUElMRVJQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNIQURFUkJJTkFSWVBST0MpIChHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnNoYWRlcnMsIEdMZW51bSBiaW5hcnlmb3JtYXQsIGNvbnN0IEdMdm9pZCAqYmluYXJ5LCBHTHNpemVpIGxlbmd0aCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNIQURFUlBSRUNJU0lPTkZPUk1BVFBST0MpIChHTGVudW0gc2hhZGVydHlwZSwgR0xlbnVtIHByZWNpc2lvbnR5cGUsIEdMaW50ICpyYW5nZSwgR0xpbnQgKnByZWNpc2lvbik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFUFRIUkFOR0VGUFJPQykgKEdMY2xhbXBmIG4sIEdMY2xhbXBmIGYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDTEVBUkRFUFRIRlBST0MpIChHTGNsYW1wZiBkKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9nZXRfcHJvZ3JhbV9iaW5hcnkKKyNkZWZpbmUgR0xfQVJCX2dldF9wcm9ncmFtX2JpbmFyeSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1CaW5hcnkgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xlbnVtICpiaW5hcnlGb3JtYXQsIEdMdm9pZCAqYmluYXJ5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtQmluYXJ5IChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIGJpbmFyeUZvcm1hdCwgY29uc3QgR0x2b2lkICpiaW5hcnksIEdMc2l6ZWkgbGVuZ3RoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtUGFyYW1ldGVyaSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQgdmFsdWUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUJJTkFSWVBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMZW51bSAqYmluYXJ5Rm9ybWF0LCBHTHZvaWQgKmJpbmFyeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1CSU5BUllQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBiaW5hcnlGb3JtYXQsIGNvbnN0IEdMdm9pZCAqYmluYXJ5LCBHTHNpemVpIGxlbmd0aCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1QQVJBTUVURVJJUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50IHZhbHVlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0cworI2RlZmluZSBHTF9BUkJfc2VwYXJhdGVfc2hhZGVyX29iamVjdHMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVc2VQcm9ncmFtU3RhZ2VzIChHTHVpbnQgcGlwZWxpbmUsIEdMYml0ZmllbGQgc3RhZ2VzLCBHTHVpbnQgcHJvZ3JhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWN0aXZlU2hhZGVyUHJvZ3JhbSAoR0x1aW50IHBpcGVsaW5lLCBHTHVpbnQgcHJvZ3JhbSk7CitHTEFQSSBHTHVpbnQgQVBJRU5UUlkgZ2xDcmVhdGVTaGFkZXJQcm9ncmFtdiAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhciogKnN0cmluZ3MpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRQcm9ncmFtUGlwZWxpbmUgKEdMdWludCBwaXBlbGluZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlUHJvZ3JhbVBpcGVsaW5lcyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnBpcGVsaW5lcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuUHJvZ3JhbVBpcGVsaW5lcyAoR0xzaXplaSBuLCBHTHVpbnQgKnBpcGVsaW5lcyk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc1Byb2dyYW1QaXBlbGluZSAoR0x1aW50IHBpcGVsaW5lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtUGlwZWxpbmVpdiAoR0x1aW50IHBpcGVsaW5lLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMWkgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgdjApOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMWl2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xZiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTFmdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xZCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGRvdWJsZSB2MCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xZHYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTF1aSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjApOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMXVpdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0yaXYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJmIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMmZ2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJkIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZG91YmxlIHYwLCBHTGRvdWJsZSB2MSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0yZHYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJ1aSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0ydWl2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM2kgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2Mik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0zaXYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTNmIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEsIEdMZmxvYXQgdjIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM2Z2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTNkIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZG91YmxlIHYwLCBHTGRvdWJsZSB2MSwgR0xkb3VibGUgdjIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM2R2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0zdWkgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwLCBHTHVpbnQgdjEsIEdMdWludCB2Mik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0zdWl2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtNGkgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2MiwgR0xpbnQgdjMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtNGl2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00ZiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyLCBHTGZsb2F0IHYzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTRmdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00ZCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGRvdWJsZSB2MCwgR0xkb3VibGUgdjEsIEdMZG91YmxlIHYyLCBHTGRvdWJsZSB2Myk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00ZHYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTR1aSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSwgR0x1aW50IHYyLCBHTHVpbnQgdjMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtNHVpdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJmdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4NGZ2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJkdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M2R2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0ZHYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4M2Z2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDN4MmZ2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4NGZ2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDR4MmZ2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDN4NGZ2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDR4M2Z2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4M2R2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzeDJkdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4Mng0ZHYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDR4MmR2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzeDRkdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4NHgzZHYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYWxpZGF0ZVByb2dyYW1QaXBlbGluZSAoR0x1aW50IHBpcGVsaW5lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtUGlwZWxpbmVJbmZvTG9nIChHTHVpbnQgcGlwZWxpbmUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmluZm9Mb2cpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVVNFUFJPR1JBTVNUQUdFU1BST0MpIChHTHVpbnQgcGlwZWxpbmUsIEdMYml0ZmllbGQgc3RhZ2VzLCBHTHVpbnQgcHJvZ3JhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEFDVElWRVNIQURFUlBST0dSQU1QUk9DKSAoR0x1aW50IHBpcGVsaW5lLCBHTHVpbnQgcHJvZ3JhbSk7Cit0eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMQ1JFQVRFU0hBREVSUFJPR1JBTVZQUk9DKSAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhciogKnN0cmluZ3MpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EUFJPR1JBTVBJUEVMSU5FUFJPQykgKEdMdWludCBwaXBlbGluZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVBST0dSQU1QSVBFTElORVNQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnBpcGVsaW5lcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTlBST0dSQU1QSVBFTElORVNQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKnBpcGVsaW5lcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNQUk9HUkFNUElQRUxJTkVQUk9DKSAoR0x1aW50IHBpcGVsaW5lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTVBJUEVMSU5FSVZQUk9DKSAoR0x1aW50IHBpcGVsaW5lLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTFJUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgdjApOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTFJVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMUZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0xRlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMURQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGRvdWJsZSB2MCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMURWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0xVUlQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjApOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTFVSVZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0ySVBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMklWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0yRlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTJGVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0yRFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZG91YmxlIHYwLCBHTGRvdWJsZSB2MSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMkRWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0yVUlQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMlVJVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTNJUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2Mik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNM0lWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0zRlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEsIEdMZmxvYXQgdjIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTNGVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0zRFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZG91YmxlIHYwLCBHTGRvdWJsZSB2MSwgR0xkb3VibGUgdjIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTNEVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNM1VJUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwLCBHTHVpbnQgdjEsIEdMdWludCB2Mik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNM1VJVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTRJUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2MiwgR0xpbnQgdjMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTRJVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNNEZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyLCBHTGZsb2F0IHYzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk00RlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNNERQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGRvdWJsZSB2MCwgR0xkb3VibGUgdjEsIEdMZG91YmxlIHYyLCBHTGRvdWJsZSB2Myk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNNERWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk00VUlQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSwgR0x1aW50IHYyLCBHTHVpbnQgdjMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTRVSVZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgyRlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNTUFUUklYM0ZWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDRGVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgyRFZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDNEVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNTUFUUklYNERWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgyWDNGVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgzWDJGVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgyWDRGVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVg0WDJGVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgzWDRGVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVg0WDNGVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgyWDNEVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNTUFUUklYM1gyRFZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDJYNERWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVg0WDJEVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNTUFUUklYM1g0RFZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDRYM0RWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFMSURBVEVQUk9HUkFNUElQRUxJTkVQUk9DKSAoR0x1aW50IHBpcGVsaW5lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTVBJUEVMSU5FSU5GT0xPR1BST0MpIChHTHVpbnQgcGlwZWxpbmUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmluZm9Mb2cpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3ZlcnRleF9hdHRyaWJfNjRiaXQKKyNkZWZpbmUgR0xfQVJCX3ZlcnRleF9hdHRyaWJfNjRiaXQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMMWQgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliTDJkIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkwzZCAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMNGQgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliTDFkdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliTDJkdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliTDNkdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliTDRkdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliTFBvaW50ZXIgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYkxkdiAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDFEUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkwyRFBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMM0RQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDREUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkwxRFZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkwyRFZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkwzRFZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkw0RFZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkxQT0lOVEVSUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJMRFZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3ZpZXdwb3J0X2FycmF5CisjZGVmaW5lIEdMX0FSQl92aWV3cG9ydF9hcnJheSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZpZXdwb3J0QXJyYXl2IChHTHVpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZpZXdwb3J0SW5kZXhlZGYgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgdywgR0xmbG9hdCBoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWaWV3cG9ydEluZGV4ZWRmdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTY2lzc29yQXJyYXl2IChHTHVpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTY2lzc29ySW5kZXhlZCAoR0x1aW50IGluZGV4LCBHTGludCBsZWZ0LCBHTGludCBib3R0b20sIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTY2lzc29ySW5kZXhlZHYgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlcHRoUmFuZ2VBcnJheXYgKEdMdWludCBmaXJzdCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjbGFtcGQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlcHRoUmFuZ2VJbmRleGVkIChHTHVpbnQgaW5kZXgsIEdMY2xhbXBkIG4sIEdMY2xhbXBkIGYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEZsb2F0aV92IChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldERvdWJsZWlfdiAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGRvdWJsZSAqZGF0YSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWSUVXUE9SVEFSUkFZVlBST0MpIChHTHVpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWSUVXUE9SVElOREVYRURGUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgdywgR0xmbG9hdCBoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVklFV1BPUlRJTkRFWEVERlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0NJU1NPUkFSUkFZVlBST0MpIChHTHVpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0NJU1NPUklOREVYRURQUk9DKSAoR0x1aW50IGluZGV4LCBHTGludCBsZWZ0LCBHTGludCBib3R0b20sIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0NJU1NPUklOREVYRURWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERVBUSFJBTkdFQVJSQVlWUFJPQykgKEdMdWludCBmaXJzdCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjbGFtcGQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERVBUSFJBTkdFSU5ERVhFRFBST0MpIChHTHVpbnQgaW5kZXgsIEdMY2xhbXBkIG4sIEdMY2xhbXBkIGYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRGTE9BVElfVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRET1VCTEVJX1ZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGRvdWJsZSAqZGF0YSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfY2xfZXZlbnQKKyNkZWZpbmUgR0xfQVJCX2NsX2V2ZW50IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSBHTHN5bmMgQVBJRU5UUlkgZ2xDcmVhdGVTeW5jRnJvbUNMZXZlbnRBUkIgKHN0cnVjdCBfY2xfY29udGV4dCAqIGNvbnRleHQsIHN0cnVjdCBfY2xfZXZlbnQgKiBldmVudCwgR0xiaXRmaWVsZCBmbGFncyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBHTHN5bmMgKEFQSUVOVFJZUCBQRk5HTENSRUFURVNZTkNGUk9NQ0xFVkVOVEFSQlBST0MpIChzdHJ1Y3QgX2NsX2NvbnRleHQgKiBjb250ZXh0LCBzdHJ1Y3QgX2NsX2V2ZW50ICogZXZlbnQsIEdMYml0ZmllbGQgZmxhZ3MpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2RlYnVnX291dHB1dAorI2RlZmluZSBHTF9BUkJfZGVidWdfb3V0cHV0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVidWdNZXNzYWdlQ29udHJvbEFSQiAoR0xlbnVtIHNvdXJjZSwgR0xlbnVtIHR5cGUsIEdMZW51bSBzZXZlcml0eSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICppZHMsIEdMYm9vbGVhbiBlbmFibGVkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWJ1Z01lc3NhZ2VJbnNlcnRBUkIgKEdMZW51bSBzb3VyY2UsIEdMZW51bSB0eXBlLCBHTHVpbnQgaWQsIEdMZW51bSBzZXZlcml0eSwgR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqYnVmKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWJ1Z01lc3NhZ2VDYWxsYmFja0FSQiAoR0xERUJVR1BST0NBUkIgY2FsbGJhY2ssIGNvbnN0IEdMdm9pZCAqdXNlclBhcmFtKTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbEdldERlYnVnTWVzc2FnZUxvZ0FSQiAoR0x1aW50IGNvdW50LCBHTHNpemVpIGJ1ZnNpemUsIEdMZW51bSAqc291cmNlcywgR0xlbnVtICp0eXBlcywgR0x1aW50ICppZHMsIEdMZW51bSAqc2V2ZXJpdGllcywgR0xzaXplaSAqbGVuZ3RocywgR0xjaGFyICptZXNzYWdlTG9nKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFQlVHTUVTU0FHRUNPTlRST0xBUkJQUk9DKSAoR0xlbnVtIHNvdXJjZSwgR0xlbnVtIHR5cGUsIEdMZW51bSBzZXZlcml0eSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICppZHMsIEdMYm9vbGVhbiBlbmFibGVkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVCVUdNRVNTQUdFSU5TRVJUQVJCUFJPQykgKEdMZW51bSBzb3VyY2UsIEdMZW51bSB0eXBlLCBHTHVpbnQgaWQsIEdMZW51bSBzZXZlcml0eSwgR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqYnVmKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVCVUdNRVNTQUdFQ0FMTEJBQ0tBUkJQUk9DKSAoR0xERUJVR1BST0NBUkIgY2FsbGJhY2ssIGNvbnN0IEdMdm9pZCAqdXNlclBhcmFtKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xHRVRERUJVR01FU1NBR0VMT0dBUkJQUk9DKSAoR0x1aW50IGNvdW50LCBHTHNpemVpIGJ1ZnNpemUsIEdMZW51bSAqc291cmNlcywgR0xlbnVtICp0eXBlcywgR0x1aW50ICppZHMsIEdMZW51bSAqc2V2ZXJpdGllcywgR0xzaXplaSAqbGVuZ3RocywgR0xjaGFyICptZXNzYWdlTG9nKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9yb2J1c3RuZXNzCisjZGVmaW5lIEdMX0FSQl9yb2J1c3RuZXNzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSBHTGVudW0gQVBJRU5UUlkgZ2xHZXRHcmFwaGljc1Jlc2V0U3RhdHVzQVJCICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRuTWFwZHZBUkIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBxdWVyeSwgR0xzaXplaSBidWZTaXplLCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0bk1hcGZ2QVJCIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcXVlcnksIEdMc2l6ZWkgYnVmU2l6ZSwgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0bk1hcGl2QVJCIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcXVlcnksIEdMc2l6ZWkgYnVmU2l6ZSwgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldG5QaXhlbE1hcGZ2QVJCIChHTGVudW0gbWFwLCBHTHNpemVpIGJ1ZlNpemUsIEdMZmxvYXQgKnZhbHVlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0blBpeGVsTWFwdWl2QVJCIChHTGVudW0gbWFwLCBHTHNpemVpIGJ1ZlNpemUsIEdMdWludCAqdmFsdWVzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRuUGl4ZWxNYXB1c3ZBUkIgKEdMZW51bSBtYXAsIEdMc2l6ZWkgYnVmU2l6ZSwgR0x1c2hvcnQgKnZhbHVlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0blBvbHlnb25TdGlwcGxlQVJCIChHTHNpemVpIGJ1ZlNpemUsIEdMdWJ5dGUgKnBhdHRlcm4pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldG5Db2xvclRhYmxlQVJCIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xzaXplaSBidWZTaXplLCBHTHZvaWQgKnRhYmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRuQ29udm9sdXRpb25GaWx0ZXJBUkIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHNpemVpIGJ1ZlNpemUsIEdMdm9pZCAqaW1hZ2UpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldG5TZXBhcmFibGVGaWx0ZXJBUkIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHNpemVpIHJvd0J1ZlNpemUsIEdMdm9pZCAqcm93LCBHTHNpemVpIGNvbHVtbkJ1ZlNpemUsIEdMdm9pZCAqY29sdW1uLCBHTHZvaWQgKnNwYW4pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldG5IaXN0b2dyYW1BUkIgKEdMZW51bSB0YXJnZXQsIEdMYm9vbGVhbiByZXNldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0x2b2lkICp2YWx1ZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldG5NaW5tYXhBUkIgKEdMZW51bSB0YXJnZXQsIEdMYm9vbGVhbiByZXNldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0x2b2lkICp2YWx1ZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldG5UZXhJbWFnZUFSQiAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHNpemVpIGJ1ZlNpemUsIEdMdm9pZCAqaW1nKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZWFkblBpeGVsc0FSQiAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHNpemVpIGJ1ZlNpemUsIEdMdm9pZCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0bkNvbXByZXNzZWRUZXhJbWFnZUFSQiAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbG9kLCBHTHNpemVpIGJ1ZlNpemUsIEdMdm9pZCAqaW1nKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRuVW5pZm9ybWZ2QVJCIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRuVW5pZm9ybWl2QVJCIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0blVuaWZvcm11aXZBUkIgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBidWZTaXplLCBHTHVpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0blVuaWZvcm1kdkFSQiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGJ1ZlNpemUsIEdMZG91YmxlICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0xlbnVtIChBUElFTlRSWVAgUEZOR0xHRVRHUkFQSElDU1JFU0VUU1RBVFVTQVJCUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROTUFQRFZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHF1ZXJ5LCBHTHNpemVpIGJ1ZlNpemUsIEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTk1BUEZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBxdWVyeSwgR0xzaXplaSBidWZTaXplLCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTk1BUElWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBxdWVyeSwgR0xzaXplaSBidWZTaXplLCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5QSVhFTE1BUEZWQVJCUFJPQykgKEdMZW51bSBtYXAsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xmbG9hdCAqdmFsdWVzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTlBJWEVMTUFQVUlWQVJCUFJPQykgKEdMZW51bSBtYXAsIEdMc2l6ZWkgYnVmU2l6ZSwgR0x1aW50ICp2YWx1ZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROUElYRUxNQVBVU1ZBUkJQUk9DKSAoR0xlbnVtIG1hcCwgR0xzaXplaSBidWZTaXplLCBHTHVzaG9ydCAqdmFsdWVzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTlBPTFlHT05TVElQUExFQVJCUFJPQykgKEdMc2l6ZWkgYnVmU2l6ZSwgR0x1Ynl0ZSAqcGF0dGVybik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5DT0xPUlRBQkxFQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHNpemVpIGJ1ZlNpemUsIEdMdm9pZCAqdGFibGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROQ09OVk9MVVRJT05GSUxURVJBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0x2b2lkICppbWFnZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5TRVBBUkFCTEVGSUxURVJBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgcm93QnVmU2l6ZSwgR0x2b2lkICpyb3csIEdMc2l6ZWkgY29sdW1uQnVmU2l6ZSwgR0x2b2lkICpjb2x1bW4sIEdMdm9pZCAqc3Bhbik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5ISVNUT0dSQU1BUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xib29sZWFuIHJlc2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xzaXplaSBidWZTaXplLCBHTHZvaWQgKnZhbHVlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5NSU5NQVhBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xib29sZWFuIHJlc2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xzaXplaSBidWZTaXplLCBHTHZvaWQgKnZhbHVlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5URVhJTUFHRUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0x2b2lkICppbWcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRUFETlBJWEVMU0FSQlBST0MpIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTkNPTVBSRVNTRURURVhJTUFHRUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsb2QsIEdMc2l6ZWkgYnVmU2l6ZSwgR0x2b2lkICppbWcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROVU5JRk9STUZWQVJCUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBidWZTaXplLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROVU5JRk9STUlWQVJCUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBidWZTaXplLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTlVOSUZPUk1VSVZBUkJQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGJ1ZlNpemUsIEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTlVOSUZPUk1EVkFSQlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xkb3VibGUgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZGVyX3N0ZW5jaWxfZXhwb3J0CisjZGVmaW5lIEdMX0FSQl9zaGFkZXJfc3RlbmNpbF9leHBvcnQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2Jhc2VfaW5zdGFuY2UKKyNkZWZpbmUgR0xfQVJCX2Jhc2VfaW5zdGFuY2UgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3QXJyYXlzSW5zdGFuY2VkQmFzZUluc3RhbmNlIChHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50LCBHTHVpbnQgYmFzZWluc3RhbmNlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3RWxlbWVudHNJbnN0YW5jZWRCYXNlSW5zdGFuY2UgKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3Qgdm9pZCAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQsIEdMdWludCBiYXNlaW5zdGFuY2UpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdFbGVtZW50c0luc3RhbmNlZEJhc2VWZXJ0ZXhCYXNlSW5zdGFuY2UgKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3Qgdm9pZCAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQsIEdMaW50IGJhc2V2ZXJ0ZXgsIEdMdWludCBiYXNlaW5zdGFuY2UpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV0FSUkFZU0lOU1RBTkNFREJBU0VJTlNUQU5DRVBST0MpIChHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50LCBHTHVpbnQgYmFzZWluc3RhbmNlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV0VMRU1FTlRTSU5TVEFOQ0VEQkFTRUlOU1RBTkNFUFJPQykgKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3Qgdm9pZCAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQsIEdMdWludCBiYXNlaW5zdGFuY2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXRUxFTUVOVFNJTlNUQU5DRURCQVNFVkVSVEVYQkFTRUlOU1RBTkNFUFJPQykgKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3Qgdm9pZCAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQsIEdMaW50IGJhc2V2ZXJ0ZXgsIEdMdWludCBiYXNlaW5zdGFuY2UpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfNDIwcGFjaworI2RlZmluZSBHTF9BUkJfc2hhZGluZ19sYW5ndWFnZV80MjBwYWNrIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90cmFuc2Zvcm1fZmVlZGJhY2tfaW5zdGFuY2VkCisjZGVmaW5lIEdMX0FSQl90cmFuc2Zvcm1fZmVlZGJhY2tfaW5zdGFuY2VkIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd1RyYW5zZm9ybUZlZWRiYWNrSW5zdGFuY2VkIChHTGVudW0gbW9kZSwgR0x1aW50IGlkLCBHTHNpemVpIHByaW1jb3VudCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd1RyYW5zZm9ybUZlZWRiYWNrU3RyZWFtSW5zdGFuY2VkIChHTGVudW0gbW9kZSwgR0x1aW50IGlkLCBHTHVpbnQgc3RyZWFtLCBHTHNpemVpIHByaW1jb3VudCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXVFJBTlNGT1JNRkVFREJBQ0tJTlNUQU5DRURQUk9DKSAoR0xlbnVtIG1vZGUsIEdMdWludCBpZCwgR0xzaXplaSBwcmltY291bnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXVFJBTlNGT1JNRkVFREJBQ0tTVFJFQU1JTlNUQU5DRURQUk9DKSAoR0xlbnVtIG1vZGUsIEdMdWludCBpZCwgR0x1aW50IHN0cmVhbSwgR0xzaXplaSBwcmltY291bnQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2NvbXByZXNzZWRfdGV4dHVyZV9waXhlbF9zdG9yYWdlCisjZGVmaW5lIEdMX0FSQl9jb21wcmVzc2VkX3RleHR1cmVfcGl4ZWxfc3RvcmFnZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfY29uc2VydmF0aXZlX2RlcHRoCisjZGVmaW5lIEdMX0FSQl9jb25zZXJ2YXRpdmVfZGVwdGggMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2ludGVybmFsZm9ybWF0X3F1ZXJ5CisjZGVmaW5lIEdMX0FSQl9pbnRlcm5hbGZvcm1hdF9xdWVyeSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEludGVybmFsZm9ybWF0aXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xlbnVtIHBuYW1lLCBHTHNpemVpIGJ1ZlNpemUsIEdMaW50ICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSU5URVJOQUxGT1JNQVRJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMZW51bSBwbmFtZSwgR0xzaXplaSBidWZTaXplLCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9tYXBfYnVmZmVyX2FsaWdubWVudAorI2RlZmluZSBHTF9BUkJfbWFwX2J1ZmZlcl9hbGlnbm1lbnQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRlcl9hdG9taWNfY291bnRlcnMKKyNkZWZpbmUgR0xfQVJCX3NoYWRlcl9hdG9taWNfY291bnRlcnMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRBY3RpdmVBdG9taWNDb3VudGVyQnVmZmVyaXYgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgYnVmZmVySW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBQ1RJVkVBVE9NSUNDT1VOVEVSQlVGRkVSSVZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMdWludCBidWZmZXJJbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkZXJfaW1hZ2VfbG9hZF9zdG9yZQorI2RlZmluZSBHTF9BUkJfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kSW1hZ2VUZXh0dXJlIChHTHVpbnQgdW5pdCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTGJvb2xlYW4gbGF5ZXJlZCwgR0xpbnQgbGF5ZXIsIEdMZW51bSBhY2Nlc3MsIEdMZW51bSBmb3JtYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1lbW9yeUJhcnJpZXIgKEdMYml0ZmllbGQgYmFycmllcnMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklORElNQUdFVEVYVFVSRVBST0MpIChHTHVpbnQgdW5pdCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTGJvb2xlYW4gbGF5ZXJlZCwgR0xpbnQgbGF5ZXIsIEdMZW51bSBhY2Nlc3MsIEdMZW51bSBmb3JtYXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNRU1PUllCQVJSSUVSUFJPQykgKEdMYml0ZmllbGQgYmFycmllcnMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfcGFja2luZworI2RlZmluZSBHTF9BUkJfc2hhZGluZ19sYW5ndWFnZV9wYWNraW5nIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX3N0b3JhZ2UKKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfc3RvcmFnZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFN0b3JhZ2UxRCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4U3RvcmFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4U3RvcmFnZTNEIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZVN0b3JhZ2UxREVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleHR1cmVTdG9yYWdlMkRFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZVN0b3JhZ2UzREVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFNUT1JBR0UxRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYU1RPUkFHRTJEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYU1RPUkFHRTNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRVNUT1JBR0UxREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVTVE9SQUdFMkRFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRVNUT1JBR0UzREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2FiZ3IKKyNkZWZpbmUgR0xfRVhUX2FiZ3IgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2JsZW5kX2NvbG9yCisjZGVmaW5lIEdMX0VYVF9ibGVuZF9jb2xvciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kQ29sb3JFWFQgKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5EQ09MT1JFWFRQUk9DKSAoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3BvbHlnb25fb2Zmc2V0CisjZGVmaW5lIEdMX0VYVF9wb2x5Z29uX29mZnNldCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvbHlnb25PZmZzZXRFWFQgKEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IGJpYXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE9MWUdPTk9GRlNFVEVYVFBST0MpIChHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCBiaWFzKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlM0QKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmUzRCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEltYWdlM0RFWFQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4U3ViSW1hZ2UzREVYVCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYSU1BR0UzREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhTVUJJTUFHRTNERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9maWx0ZXI0CisjZGVmaW5lIEdMX1NHSVNfdGV4dHVyZV9maWx0ZXI0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VGV4RmlsdGVyRnVuY1NHSVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmaWx0ZXIsIEdMZmxvYXQgKndlaWdodHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEZpbHRlckZ1bmNTR0lTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZmlsdGVyLCBHTHNpemVpIG4sIGNvbnN0IEdMZmxvYXQgKndlaWdodHMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVEVYRklMVEVSRlVOQ1NHSVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZpbHRlciwgR0xmbG9hdCAqd2VpZ2h0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWEZJTFRFUkZVTkNTR0lTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmaWx0ZXIsIEdMc2l6ZWkgbiwgY29uc3QgR0xmbG9hdCAqd2VpZ2h0cyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc3VidGV4dHVyZQorI2RlZmluZSBHTF9FWFRfc3VidGV4dHVyZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFN1YkltYWdlMURFWFQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFN1YkltYWdlMkRFWFQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFNVQklNQUdFMURFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFNVQklNQUdFMkRFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2NvcHlfdGV4dHVyZQorI2RlZmluZSBHTF9FWFRfY29weV90ZXh0dXJlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleEltYWdlMURFWFQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMaW50IGJvcmRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleEltYWdlMkRFWFQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlUZXhTdWJJbWFnZTFERVhUIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlMkRFWFQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlM0RFWFQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZVEVYSU1BR0UxREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTGludCBib3JkZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZVEVYSU1BR0UyREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWVRFWFNVQklNQUdFMURFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZVEVYU1VCSU1BR0UyREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZVEVYU1VCSU1BR0UzREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2hpc3RvZ3JhbQorI2RlZmluZSBHTF9FWFRfaGlzdG9ncmFtIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SGlzdG9ncmFtRVhUIChHTGVudW0gdGFyZ2V0LCBHTGJvb2xlYW4gcmVzZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnZhbHVlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SGlzdG9ncmFtUGFyYW1ldGVyZnZFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRIaXN0b2dyYW1QYXJhbWV0ZXJpdkVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNaW5tYXhFWFQgKEdMZW51bSB0YXJnZXQsIEdMYm9vbGVhbiByZXNldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdmFsdWVzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNaW5tYXhQYXJhbWV0ZXJmdkVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE1pbm1heFBhcmFtZXRlcml2RVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEhpc3RvZ3JhbUVYVCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGJvb2xlYW4gc2luayk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWlubWF4RVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMYm9vbGVhbiBzaW5rKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXNldEhpc3RvZ3JhbUVYVCAoR0xlbnVtIHRhcmdldCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVzZXRNaW5tYXhFWFQgKEdMZW51bSB0YXJnZXQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSElTVE9HUkFNRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMYm9vbGVhbiByZXNldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdmFsdWVzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSElTVE9HUkFNUEFSQU1FVEVSRlZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRISVNUT0dSQU1QQVJBTUVURVJJVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNSU5NQVhFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xib29sZWFuIHJlc2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp2YWx1ZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNSU5NQVhQQVJBTUVURVJGVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1JTk1BWFBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEhJU1RPR1JBTUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMYm9vbGVhbiBzaW5rKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUlOTUFYRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xib29sZWFuIHNpbmspOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVNFVEhJU1RPR1JBTUVYVFBST0MpIChHTGVudW0gdGFyZ2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVTRVRNSU5NQVhFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY29udm9sdXRpb24KKyNkZWZpbmUgR0xfRVhUX2NvbnZvbHV0aW9uIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25GaWx0ZXIxREVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbWFnZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25GaWx0ZXIyREVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW1hZ2UpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyZkVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJmdkVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyaUVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyaXZFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weUNvbnZvbHV0aW9uRmlsdGVyMURFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weUNvbnZvbHV0aW9uRmlsdGVyMkRFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbnZvbHV0aW9uRmlsdGVyRVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICppbWFnZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29udm9sdXRpb25QYXJhbWV0ZXJmdkVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbnZvbHV0aW9uUGFyYW1ldGVyaXZFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0U2VwYXJhYmxlRmlsdGVyRVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpyb3csIEdMdm9pZCAqY29sdW1uLCBHTHZvaWQgKnNwYW4pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlcGFyYWJsZUZpbHRlcjJERVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpyb3csIGNvbnN0IEdMdm9pZCAqY29sdW1uKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9ORklMVEVSMURFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbWFnZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9ORklMVEVSMkRFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW1hZ2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTlBBUkFNRVRFUkZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9OUEFSQU1FVEVSRlZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTlBBUkFNRVRFUklFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTlBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlDT05WT0xVVElPTkZJTFRFUjFERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlDT05WT0xVVElPTkZJTFRFUjJERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT05WT0xVVElPTkZJTFRFUkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICppbWFnZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTlZPTFVUSU9OUEFSQU1FVEVSRlZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT05WT0xVVElPTlBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNFUEFSQUJMRUZJTFRFUkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpyb3csIEdMdm9pZCAqY29sdW1uLCBHTHZvaWQgKnNwYW4pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRVBBUkFCTEVGSUxURVIyREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpyb3csIGNvbnN0IEdMdm9pZCAqY29sdW1uKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSV9jb2xvcl9tYXRyaXgKKyNkZWZpbmUgR0xfU0dJX2NvbG9yX21hdHJpeCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lfY29sb3JfdGFibGUKKyNkZWZpbmUgR0xfU0dJX2NvbG9yX3RhYmxlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JUYWJsZVNHSSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICp0YWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JUYWJsZVBhcmFtZXRlcmZ2U0dJIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JUYWJsZVBhcmFtZXRlcml2U0dJIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlDb2xvclRhYmxlU0dJIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbG9yVGFibGVTR0kgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnRhYmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyZnZTR0kgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyaXZTR0kgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlRBQkxFU0dJUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqdGFibGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlRBQkxFUEFSQU1FVEVSRlZTR0lQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlRBQkxFUEFSQU1FVEVSSVZTR0lQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWUNPTE9SVEFCTEVTR0lQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09MT1JUQUJMRVNHSVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp0YWJsZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTE9SVEFCTEVQQVJBTUVURVJGVlNHSVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTE9SVEFCTEVQQVJBTUVURVJJVlNHSVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9waXhlbF90ZXh0dXJlCisjZGVmaW5lIEdMX1NHSVhfcGl4ZWxfdGV4dHVyZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsVGV4R2VuU0dJWCAoR0xlbnVtIG1vZGUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUElYRUxURVhHRU5TR0lYUFJPQykgKEdMZW51bSBtb2RlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfcGl4ZWxfdGV4dHVyZQorI2RlZmluZSBHTF9TR0lTX3BpeGVsX3RleHR1cmUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQaXhlbFRleEdlblBhcmFtZXRlcmlTR0lTIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQaXhlbFRleEdlblBhcmFtZXRlcml2U0dJUyAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQaXhlbFRleEdlblBhcmFtZXRlcmZTR0lTIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsVGV4R2VuUGFyYW1ldGVyZnZTR0lTIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UGl4ZWxUZXhHZW5QYXJhbWV0ZXJpdlNHSVMgKEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UGl4ZWxUZXhHZW5QYXJhbWV0ZXJmdlNHSVMgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBJWEVMVEVYR0VOUEFSQU1FVEVSSVNHSVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBJWEVMVEVYR0VOUEFSQU1FVEVSSVZTR0lTUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBJWEVMVEVYR0VOUEFSQU1FVEVSRlNHSVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUElYRUxURVhHRU5QQVJBTUVURVJGVlNHSVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQSVhFTFRFWEdFTlBBUkFNRVRFUklWU0dJU1BST0MpIChHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQSVhFTFRFWEdFTlBBUkFNRVRFUkZWU0dJU1BST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3RleHR1cmU0RAorI2RlZmluZSBHTF9TR0lTX3RleHR1cmU0RCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEltYWdlNERTR0lTIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xzaXplaSBzaXplNGQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhTdWJJbWFnZTREU0dJUyAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMaW50IHdvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTHNpemVpIHNpemU0ZCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWElNQUdFNERTR0lTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTHNpemVpIHNpemU0ZCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhTVUJJTUFHRTREU0dJU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xpbnQgd29mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMc2l6ZWkgc2l6ZTRkLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJX3RleHR1cmVfY29sb3JfdGFibGUKKyNkZWZpbmUgR0xfU0dJX3RleHR1cmVfY29sb3JfdGFibGUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2NteWthCisjZGVmaW5lIEdMX0VYVF9jbXlrYSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9vYmplY3QKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfb2JqZWN0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xBcmVUZXh0dXJlc1Jlc2lkZW50RVhUIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMsIEdMYm9vbGVhbiAqcmVzaWRlbmNlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZFRleHR1cmVFWFQgKEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVUZXh0dXJlc0VYVCAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5UZXh0dXJlc0VYVCAoR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzVGV4dHVyZUVYVCAoR0x1aW50IHRleHR1cmUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByaW9yaXRpemVUZXh0dXJlc0VYVCAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzLCBjb25zdCBHTGNsYW1wZiAqcHJpb3JpdGllcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTEFSRVRFWFRVUkVTUkVTSURFTlRFWFRQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzLCBHTGJvb2xlYW4gKnJlc2lkZW5jZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EVEVYVFVSRUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVRFWFRVUkVTRVhUUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTlRFWFRVUkVTRVhUUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNURVhUVVJFRVhUUFJPQykgKEdMdWludCB0ZXh0dXJlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJJT1JJVElaRVRFWFRVUkVTRVhUUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcywgY29uc3QgR0xjbGFtcGYgKnByaW9yaXRpZXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19kZXRhaWxfdGV4dHVyZQorI2RlZmluZSBHTF9TR0lTX2RldGFpbF90ZXh0dXJlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGV0YWlsVGV4RnVuY1NHSVMgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbiwgY29uc3QgR0xmbG9hdCAqcG9pbnRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXREZXRhaWxUZXhGdW5jU0dJUyAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCAqcG9pbnRzKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFVEFJTFRFWEZVTkNTR0lTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbiwgY29uc3QgR0xmbG9hdCAqcG9pbnRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUREVUQUlMVEVYRlVOQ1NHSVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCAqcG9pbnRzKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfc2hhcnBlbl90ZXh0dXJlCisjZGVmaW5lIEdMX1NHSVNfc2hhcnBlbl90ZXh0dXJlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2hhcnBlblRleEZ1bmNTR0lTIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG4sIGNvbnN0IEdMZmxvYXQgKnBvaW50cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0U2hhcnBlblRleEZ1bmNTR0lTIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0ICpwb2ludHMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0hBUlBFTlRFWEZVTkNTR0lTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbiwgY29uc3QgR0xmbG9hdCAqcG9pbnRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUU0hBUlBFTlRFWEZVTkNTR0lTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgKnBvaW50cyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGFja2VkX3BpeGVscworI2RlZmluZSBHTF9FWFRfcGFja2VkX3BpeGVscyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfbG9kCisjZGVmaW5lIEdMX1NHSVNfdGV4dHVyZV9sb2QgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9TR0lTX211bHRpc2FtcGxlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2FtcGxlTWFza1NHSVMgKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVQYXR0ZXJuU0dJUyAoR0xlbnVtIHBhdHRlcm4pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0FNUExFTUFTS1NHSVNQUk9DKSAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVQQVRURVJOU0dJU1BST0MpIChHTGVudW0gcGF0dGVybik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcmVzY2FsZV9ub3JtYWwKKyNkZWZpbmUgR0xfRVhUX3Jlc2NhbGVfbm9ybWFsIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF92ZXJ0ZXhfYXJyYXkKKyNkZWZpbmUgR0xfRVhUX3ZlcnRleF9hcnJheSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFycmF5RWxlbWVudEVYVCAoR0xpbnQgaSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JQb2ludGVyRVhUIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0FycmF5c0VYVCAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFZGdlRmxhZ1BvaW50ZXJFWFQgKEdMc2l6ZWkgc3RyaWRlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGJvb2xlYW4gKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFBvaW50ZXJ2RVhUIChHTGVudW0gcG5hbWUsIEdMdm9pZCogKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSW5kZXhQb2ludGVyRVhUIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsUG9pbnRlckVYVCAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkUG9pbnRlckVYVCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFBvaW50ZXJFWFQgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEFSUkFZRUxFTUVOVEVYVFBST0MpIChHTGludCBpKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JQT0lOVEVSRVhUUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV0FSUkFZU0VYVFBST0MpIChHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFREdFRkxBR1BPSU5URVJFWFRQUk9DKSAoR0xzaXplaSBzdHJpZGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMYm9vbGVhbiAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBPSU5URVJWRVhUUFJPQykgKEdMZW51bSBwbmFtZSwgR0x2b2lkKiAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSU5ERVhQT0lOVEVSRVhUUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMUE9JTlRFUkVYVFBST0MpIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEUE9JTlRFUkVYVFBST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFBPSU5URVJFWFRQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX21pc2NfYXR0cmlidXRlCisjZGVmaW5lIEdMX0VYVF9taXNjX2F0dHJpYnV0ZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX2dlbmVyYXRlX21pcG1hcAorI2RlZmluZSBHTF9TR0lTX2dlbmVyYXRlX21pcG1hcCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2NsaXBtYXAKKyNkZWZpbmUgR0xfU0dJWF9jbGlwbWFwIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfc2hhZG93CisjZGVmaW5lIEdMX1NHSVhfc2hhZG93IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9lZGdlX2NsYW1wCisjZGVmaW5lIEdMX1NHSVNfdGV4dHVyZV9lZGdlX2NsYW1wIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9ib3JkZXJfY2xhbXAKKyNkZWZpbmUgR0xfU0dJU190ZXh0dXJlX2JvcmRlcl9jbGFtcCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfbWlubWF4CisjZGVmaW5lIEdMX0VYVF9ibGVuZF9taW5tYXggMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uRVhUIChHTGVudW0gbW9kZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREVRVUFUSU9ORVhUUFJPQykgKEdMZW51bSBtb2RlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9ibGVuZF9zdWJ0cmFjdAorI2RlZmluZSBHTF9FWFRfYmxlbmRfc3VidHJhY3QgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2JsZW5kX2xvZ2ljX29wCisjZGVmaW5lIEdMX0VYVF9ibGVuZF9sb2dpY19vcCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2ludGVybGFjZQorI2RlZmluZSBHTF9TR0lYX2ludGVybGFjZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3BpeGVsX3RpbGVzCisjZGVmaW5lIEdMX1NHSVhfcGl4ZWxfdGlsZXMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF90ZXh0dXJlX3NlbGVjdAorI2RlZmluZSBHTF9TR0lYX3RleHR1cmVfc2VsZWN0IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfc3ByaXRlCisjZGVmaW5lIEdMX1NHSVhfc3ByaXRlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3ByaXRlUGFyYW1ldGVyZlNHSVggKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3ByaXRlUGFyYW1ldGVyZnZTR0lYIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3ByaXRlUGFyYW1ldGVyaVNHSVggKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNwcml0ZVBhcmFtZXRlcml2U0dJWCAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNQUklURVBBUkFNRVRFUkZTR0lYUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNQUklURVBBUkFNRVRFUkZWU0dJWFBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNQUklURVBBUkFNRVRFUklTR0lYUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTUFJJVEVQQVJBTUVURVJJVlNHSVhQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfdGV4dHVyZV9tdWx0aV9idWZmZXIKKyNkZWZpbmUgR0xfU0dJWF90ZXh0dXJlX211bHRpX2J1ZmZlciAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcG9pbnRfcGFyYW1ldGVycworI2RlZmluZSBHTF9FWFRfcG9pbnRfcGFyYW1ldGVycyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyZkVYVCAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcmZ2RVhUIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUkZFWFRQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE9JTlRQQVJBTUVURVJGVkVYVFBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3BvaW50X3BhcmFtZXRlcnMKKyNkZWZpbmUgR0xfU0dJU19wb2ludF9wYXJhbWV0ZXJzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJmU0dJUyAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcmZ2U0dJUyAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE9JTlRQQVJBTUVURVJGU0dJU1BST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUkZWU0dJU1BST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2luc3RydW1lbnRzCisjZGVmaW5lIEdMX1NHSVhfaW5zdHJ1bWVudHMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIEdMaW50IEFQSUVOVFJZIGdsR2V0SW5zdHJ1bWVudHNTR0lYICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xJbnN0cnVtZW50c0J1ZmZlclNHSVggKEdMc2l6ZWkgc2l6ZSwgR0xpbnQgKmJ1ZmZlcik7CitHTEFQSSBHTGludCBBUElFTlRSWSBnbFBvbGxJbnN0cnVtZW50c1NHSVggKEdMaW50ICptYXJrZXJfcCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVhZEluc3RydW1lbnRzU0dJWCAoR0xpbnQgbWFya2VyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdGFydEluc3RydW1lbnRzU0dJWCAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RvcEluc3RydW1lbnRzU0dJWCAoR0xpbnQgbWFya2VyKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xHRVRJTlNUUlVNRU5UU1NHSVhQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTElOU1RSVU1FTlRTQlVGRkVSU0dJWFBST0MpIChHTHNpemVpIHNpemUsIEdMaW50ICpidWZmZXIpOwordHlwZWRlZiBHTGludCAoQVBJRU5UUllQIFBGTkdMUE9MTElOU1RSVU1FTlRTU0dJWFBST0MpIChHTGludCAqbWFya2VyX3ApOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRUFESU5TVFJVTUVOVFNTR0lYUFJPQykgKEdMaW50IG1hcmtlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNUQVJUSU5TVFJVTUVOVFNTR0lYUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTVE9QSU5TVFJVTUVOVFNTR0lYUFJPQykgKEdMaW50IG1hcmtlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfc2NhbGVfYmlhcworI2RlZmluZSBHTF9TR0lYX3RleHR1cmVfc2NhbGVfYmlhcyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2ZyYW1lem9vbQorI2RlZmluZSBHTF9TR0lYX2ZyYW1lem9vbSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lWm9vbVNHSVggKEdMaW50IGZhY3Rvcik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRVpPT01TR0lYUFJPQykgKEdMaW50IGZhY3Rvcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3RhZ19zYW1wbGVfYnVmZmVyCisjZGVmaW5lIEdMX1NHSVhfdGFnX3NhbXBsZV9idWZmZXIgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYWdTYW1wbGVCdWZmZXJTR0lYICh2b2lkKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRBR1NBTVBMRUJVRkZFUlNHSVhQUk9DKSAodm9pZCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3BvbHlub21pYWxfZmZkCisjZGVmaW5lIEdMX1NHSVhfcG9seW5vbWlhbF9mZmQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWZvcm1hdGlvbk1hcDNkU0dJWCAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgdTEsIEdMZG91YmxlIHUyLCBHTGludCB1c3RyaWRlLCBHTGludCB1b3JkZXIsIEdMZG91YmxlIHYxLCBHTGRvdWJsZSB2MiwgR0xpbnQgdnN0cmlkZSwgR0xpbnQgdm9yZGVyLCBHTGRvdWJsZSB3MSwgR0xkb3VibGUgdzIsIEdMaW50IHdzdHJpZGUsIEdMaW50IHdvcmRlciwgY29uc3QgR0xkb3VibGUgKnBvaW50cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVmb3JtYXRpb25NYXAzZlNHSVggKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgdTEsIEdMZmxvYXQgdTIsIEdMaW50IHVzdHJpZGUsIEdMaW50IHVvcmRlciwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2MiwgR0xpbnQgdnN0cmlkZSwgR0xpbnQgdm9yZGVyLCBHTGZsb2F0IHcxLCBHTGZsb2F0IHcyLCBHTGludCB3c3RyaWRlLCBHTGludCB3b3JkZXIsIGNvbnN0IEdMZmxvYXQgKnBvaW50cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVmb3JtU0dJWCAoR0xiaXRmaWVsZCBtYXNrKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkSWRlbnRpdHlEZWZvcm1hdGlvbk1hcFNHSVggKEdMYml0ZmllbGQgbWFzayk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUZPUk1BVElPTk1BUDNEU0dJWFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSB1MSwgR0xkb3VibGUgdTIsIEdMaW50IHVzdHJpZGUsIEdMaW50IHVvcmRlciwgR0xkb3VibGUgdjEsIEdMZG91YmxlIHYyLCBHTGludCB2c3RyaWRlLCBHTGludCB2b3JkZXIsIEdMZG91YmxlIHcxLCBHTGRvdWJsZSB3MiwgR0xpbnQgd3N0cmlkZSwgR0xpbnQgd29yZGVyLCBjb25zdCBHTGRvdWJsZSAqcG9pbnRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVGT1JNQVRJT05NQVAzRlNHSVhQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCB1MSwgR0xmbG9hdCB1MiwgR0xpbnQgdXN0cmlkZSwgR0xpbnQgdW9yZGVyLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyLCBHTGludCB2c3RyaWRlLCBHTGludCB2b3JkZXIsIEdMZmxvYXQgdzEsIEdMZmxvYXQgdzIsIEdMaW50IHdzdHJpZGUsIEdMaW50IHdvcmRlciwgY29uc3QgR0xmbG9hdCAqcG9pbnRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVGT1JNU0dJWFBST0MpIChHTGJpdGZpZWxkIG1hc2spOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xMT0FESURFTlRJVFlERUZPUk1BVElPTk1BUFNHSVhQUk9DKSAoR0xiaXRmaWVsZCBtYXNrKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfcmVmZXJlbmNlX3BsYW5lCisjZGVmaW5lIEdMX1NHSVhfcmVmZXJlbmNlX3BsYW5lIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVmZXJlbmNlUGxhbmVTR0lYIChjb25zdCBHTGRvdWJsZSAqZXF1YXRpb24pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVGRVJFTkNFUExBTkVTR0lYUFJPQykgKGNvbnN0IEdMZG91YmxlICplcXVhdGlvbik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2ZsdXNoX3Jhc3RlcgorI2RlZmluZSBHTF9TR0lYX2ZsdXNoX3Jhc3RlciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZsdXNoUmFzdGVyU0dJWCAodm9pZCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGTFVTSFJBU1RFUlNHSVhQUk9DKSAodm9pZCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2RlcHRoX3RleHR1cmUKKyNkZWZpbmUgR0xfU0dJWF9kZXB0aF90ZXh0dXJlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfZm9nX2Z1bmN0aW9uCisjZGVmaW5lIEdMX1NHSVNfZm9nX2Z1bmN0aW9uIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nRnVuY1NHSVMgKEdMc2l6ZWkgbiwgY29uc3QgR0xmbG9hdCAqcG9pbnRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRGb2dGdW5jU0dJUyAoR0xmbG9hdCAqcG9pbnRzKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZPR0ZVTkNTR0lTUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0xmbG9hdCAqcG9pbnRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VURk9HRlVOQ1NHSVNQUk9DKSAoR0xmbG9hdCAqcG9pbnRzKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfZm9nX29mZnNldAorI2RlZmluZSBHTF9TR0lYX2ZvZ19vZmZzZXQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfSFBfaW1hZ2VfdHJhbnNmb3JtCisjZGVmaW5lIEdMX0hQX2ltYWdlX3RyYW5zZm9ybSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyaUhQIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcmZIUCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcml2SFAgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSW1hZ2VUcmFuc2Zvcm1QYXJhbWV0ZXJmdkhQIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SW1hZ2VUcmFuc2Zvcm1QYXJhbWV0ZXJpdkhQIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyZnZIUCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSU1BR0VUUkFOU0ZPUk1QQVJBTUVURVJJSFBQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTElNQUdFVFJBTlNGT1JNUEFSQU1FVEVSRkhQUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTElNQUdFVFJBTlNGT1JNUEFSQU1FVEVSSVZIUFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xJTUFHRVRSQU5TRk9STVBBUkFNRVRFUkZWSFBQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRJTUFHRVRSQU5TRk9STVBBUkFNRVRFUklWSFBQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSU1BR0VUUkFOU0ZPUk1QQVJBTUVURVJGVkhQUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0hQX2NvbnZvbHV0aW9uX2JvcmRlcl9tb2RlcworI2RlZmluZSBHTF9IUF9jb252b2x1dGlvbl9ib3JkZXJfbW9kZXMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF90ZXh0dXJlX2FkZF9lbnYKKyNkZWZpbmUgR0xfU0dJWF90ZXh0dXJlX2FkZF9lbnYgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2NvbG9yX3N1YnRhYmxlCisjZGVmaW5lIEdMX0VYVF9jb2xvcl9zdWJ0YWJsZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yU3ViVGFibGVFWFQgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc3RhcnQsIEdMc2l6ZWkgY291bnQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlDb2xvclN1YlRhYmxlRVhUIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHN0YXJ0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SU1VCVEFCTEVFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzdGFydCwgR0xzaXplaSBjb3VudCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlDT0xPUlNVQlRBQkxFRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc3RhcnQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfUEdJX3ZlcnRleF9oaW50cworI2RlZmluZSBHTF9QR0lfdmVydGV4X2hpbnRzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1BHSV9taXNjX2hpbnRzCisjZGVmaW5lIEdMX1BHSV9taXNjX2hpbnRzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSGludFBHSSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbW9kZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xISU5UUEdJUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IG1vZGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3BhbGV0dGVkX3RleHR1cmUKKyNkZWZpbmUgR0xfRVhUX3BhbGV0dGVkX3RleHR1cmUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclRhYmxlRVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxGb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnRhYmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb2xvclRhYmxlRVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyaXZFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcmZ2RVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlRBQkxFRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbEZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqdGFibGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT0xPUlRBQkxFRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT0xPUlRBQkxFUEFSQU1FVEVSSVZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09MT1JUQUJMRVBBUkFNRVRFUkZWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9jbGlwX3ZvbHVtZV9oaW50CisjZGVmaW5lIEdMX0VYVF9jbGlwX3ZvbHVtZV9oaW50IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfbGlzdF9wcmlvcml0eQorI2RlZmluZSBHTF9TR0lYX2xpc3RfcHJpb3JpdHkgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRMaXN0UGFyYW1ldGVyZnZTR0lYIChHTHVpbnQgbGlzdCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldExpc3RQYXJhbWV0ZXJpdlNHSVggKEdMdWludCBsaXN0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpc3RQYXJhbWV0ZXJmU0dJWCAoR0x1aW50IGxpc3QsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlzdFBhcmFtZXRlcmZ2U0dJWCAoR0x1aW50IGxpc3QsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaXN0UGFyYW1ldGVyaVNHSVggKEdMdWludCBsaXN0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaXN0UGFyYW1ldGVyaXZTR0lYIChHTHVpbnQgbGlzdCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVExJU1RQQVJBTUVURVJGVlNHSVhQUk9DKSAoR0x1aW50IGxpc3QsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTElTVFBBUkFNRVRFUklWU0dJWFBST0MpIChHTHVpbnQgbGlzdCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTElTVFBBUkFNRVRFUkZTR0lYUFJPQykgKEdMdWludCBsaXN0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xMSVNUUEFSQU1FVEVSRlZTR0lYUFJPQykgKEdMdWludCBsaXN0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExJU1RQQVJBTUVURVJJU0dJWFBST0MpIChHTHVpbnQgbGlzdCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExJU1RQQVJBTUVURVJJVlNHSVhQUk9DKSAoR0x1aW50IGxpc3QsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2lyX2luc3RydW1lbnQxCisjZGVmaW5lIEdMX1NHSVhfaXJfaW5zdHJ1bWVudDEgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9jYWxsaWdyYXBoaWNfZnJhZ21lbnQKKyNkZWZpbmUgR0xfU0dJWF9jYWxsaWdyYXBoaWNfZnJhZ21lbnQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF90ZXh0dXJlX2xvZF9iaWFzCisjZGVmaW5lIEdMX1NHSVhfdGV4dHVyZV9sb2RfYmlhcyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3NoYWRvd19hbWJpZW50CisjZGVmaW5lIEdMX1NHSVhfc2hhZG93X2FtYmllbnQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2luZGV4X3RleHR1cmUKKyNkZWZpbmUgR0xfRVhUX2luZGV4X3RleHR1cmUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2luZGV4X21hdGVyaWFsCisjZGVmaW5lIEdMX0VYVF9pbmRleF9tYXRlcmlhbCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEluZGV4TWF0ZXJpYWxFWFQgKEdMZW51bSBmYWNlLCBHTGVudW0gbW9kZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xJTkRFWE1BVEVSSUFMRVhUUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gbW9kZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfaW5kZXhfZnVuYworI2RlZmluZSBHTF9FWFRfaW5kZXhfZnVuYyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEluZGV4RnVuY0VYVCAoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xJTkRFWEZVTkNFWFRQUk9DKSAoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfaW5kZXhfYXJyYXlfZm9ybWF0cworI2RlZmluZSBHTF9FWFRfaW5kZXhfYXJyYXlfZm9ybWF0cyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY29tcGlsZWRfdmVydGV4X2FycmF5CisjZGVmaW5lIEdMX0VYVF9jb21waWxlZF92ZXJ0ZXhfYXJyYXkgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2NrQXJyYXlzRVhUIChHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5sb2NrQXJyYXlzRVhUICh2b2lkKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExPQ0tBUlJBWVNFWFRQUk9DKSAoR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTkxPQ0tBUlJBWVNFWFRQUk9DKSAodm9pZCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY3VsbF92ZXJ0ZXgKKyNkZWZpbmUgR0xfRVhUX2N1bGxfdmVydGV4IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ3VsbFBhcmFtZXRlcmR2RVhUIChHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEN1bGxQYXJhbWV0ZXJmdkVYVCAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ1VMTFBBUkFNRVRFUkRWRVhUUFJPQykgKEdMZW51bSBwbmFtZSwgR0xkb3VibGUgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENVTExQQVJBTUVURVJGVkVYVFBST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3ljcmNiCisjZGVmaW5lIEdMX1NHSVhfeWNyY2IgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9mcmFnbWVudF9saWdodGluZworI2RlZmluZSBHTF9TR0lYX2ZyYWdtZW50X2xpZ2h0aW5nIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRDb2xvck1hdGVyaWFsU0dJWCAoR0xlbnVtIGZhY2UsIEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFnbWVudExpZ2h0ZlNHSVggKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFnbWVudExpZ2h0ZnZTR0lYIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFnbWVudExpZ2h0aVNHSVggKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRMaWdodGl2U0dJWCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TGlnaHRNb2RlbGZTR0lYIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TGlnaHRNb2RlbGZ2U0dJWCAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TGlnaHRNb2RlbGlTR0lYIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFnbWVudExpZ2h0TW9kZWxpdlNHSVggKEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRNYXRlcmlhbGZTR0lYIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFnbWVudE1hdGVyaWFsZnZTR0lYIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TWF0ZXJpYWxpU0dJWCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TWF0ZXJpYWxpdlNHSVggKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEZyYWdtZW50TGlnaHRmdlNHSVggKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEZyYWdtZW50TGlnaHRpdlNHSVggKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRGcmFnbWVudE1hdGVyaWFsZnZTR0lYIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEZyYWdtZW50TWF0ZXJpYWxpdlNHSVggKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0RW52aVNHSVggKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRDT0xPUk1BVEVSSUFMU0dJWFBST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIG1vZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFHTUVOVExJR0hURlNHSVhQUk9DKSAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFHTUVOVExJR0hURlZTR0lYUFJPQykgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFHTUVOVExJR0hUSVNHSVhQUk9DKSAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRMSUdIVElWU0dJWFBST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTElHSFRNT0RFTEZTR0lYUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTElHSFRNT0RFTEZWU0dJWFBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTElHSFRNT0RFTElTR0lYUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFHTUVOVExJR0hUTU9ERUxJVlNHSVhQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRNQVRFUklBTEZTR0lYUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFHTUVOVE1BVEVSSUFMRlZTR0lYUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTUFURVJJQUxJU0dJWFBST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTUFURVJJQUxJVlNHSVhQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZSQUdNRU5UTElHSFRGVlNHSVhQUk9DKSAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZSQUdNRU5UTElHSFRJVlNHSVhQUk9DKSAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRGUkFHTUVOVE1BVEVSSUFMRlZTR0lYUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZSQUdNRU5UTUFURVJJQUxJVlNHSVhQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExJR0hURU5WSVNHSVhQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9JQk1fcmFzdGVycG9zX2NsaXAKKyNkZWZpbmUgR0xfSUJNX3Jhc3RlcnBvc19jbGlwIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0hQX3RleHR1cmVfbGlnaHRpbmcKKyNkZWZpbmUgR0xfSFBfdGV4dHVyZV9saWdodGluZyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZHJhd19yYW5nZV9lbGVtZW50cworI2RlZmluZSBHTF9FWFRfZHJhd19yYW5nZV9lbGVtZW50cyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdSYW5nZUVsZW1lbnRzRVhUIChHTGVudW0gbW9kZSwgR0x1aW50IHN0YXJ0LCBHTHVpbnQgZW5kLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdSQU5HRUVMRU1FTlRTRVhUUFJPQykgKEdMZW51bSBtb2RlLCBHTHVpbnQgc3RhcnQsIEdMdWludCBlbmQsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfV0lOX3Bob25nX3NoYWRpbmcKKyNkZWZpbmUgR0xfV0lOX3Bob25nX3NoYWRpbmcgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfV0lOX3NwZWN1bGFyX2ZvZworI2RlZmluZSBHTF9XSU5fc3BlY3VsYXJfZm9nIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9saWdodF90ZXh0dXJlCisjZGVmaW5lIEdMX0VYVF9saWdodF90ZXh0dXJlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQXBwbHlUZXh0dXJlRVhUIChHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZUxpZ2h0RVhUIChHTGVudW0gcG5hbWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleHR1cmVNYXRlcmlhbEVYVCAoR0xlbnVtIGZhY2UsIEdMZW51bSBtb2RlKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEFQUExZVEVYVFVSRUVYVFBST0MpIChHTGVudW0gbW9kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVMSUdIVEVYVFBST0MpIChHTGVudW0gcG5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhUVVJFTUFURVJJQUxFWFRQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBtb2RlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfYmxlbmRfYWxwaGFfbWlubWF4CisjZGVmaW5lIEdMX1NHSVhfYmxlbmRfYWxwaGFfbWlubWF4IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9iZ3JhCisjZGVmaW5lIEdMX0VYVF9iZ3JhIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfYXN5bmMKKyNkZWZpbmUgR0xfU0dJWF9hc3luYyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFzeW5jTWFya2VyU0dJWCAoR0x1aW50IG1hcmtlcik7CitHTEFQSSBHTGludCBBUElFTlRSWSBnbEZpbmlzaEFzeW5jU0dJWCAoR0x1aW50ICptYXJrZXJwKTsKK0dMQVBJIEdMaW50IEFQSUVOVFJZIGdsUG9sbEFzeW5jU0dJWCAoR0x1aW50ICptYXJrZXJwKTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbEdlbkFzeW5jTWFya2Vyc1NHSVggKEdMc2l6ZWkgcmFuZ2UpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZUFzeW5jTWFya2Vyc1NHSVggKEdMdWludCBtYXJrZXIsIEdMc2l6ZWkgcmFuZ2UpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNBc3luY01hcmtlclNHSVggKEdMdWludCBtYXJrZXIpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQVNZTkNNQVJLRVJTR0lYUFJPQykgKEdMdWludCBtYXJrZXIpOwordHlwZWRlZiBHTGludCAoQVBJRU5UUllQIFBGTkdMRklOSVNIQVNZTkNTR0lYUFJPQykgKEdMdWludCAqbWFya2VycCk7Cit0eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xQT0xMQVNZTkNTR0lYUFJPQykgKEdMdWludCAqbWFya2VycCk7Cit0eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMR0VOQVNZTkNNQVJLRVJTU0dJWFBST0MpIChHTHNpemVpIHJhbmdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFQVNZTkNNQVJLRVJTU0dJWFBST0MpIChHTHVpbnQgbWFya2VyLCBHTHNpemVpIHJhbmdlKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU0FTWU5DTUFSS0VSU0dJWFBST0MpIChHTHVpbnQgbWFya2VyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfYXN5bmNfcGl4ZWwKKyNkZWZpbmUgR0xfU0dJWF9hc3luY19waXhlbCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2FzeW5jX2hpc3RvZ3JhbQorI2RlZmluZSBHTF9TR0lYX2FzeW5jX2hpc3RvZ3JhbSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9JTlRFTF9wYXJhbGxlbF9hcnJheXMKKyNkZWZpbmUgR0xfSU5URUxfcGFyYWxsZWxfYXJyYXlzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4UG9pbnRlcnZJTlRFTCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbFBvaW50ZXJ2SU5URUwgKEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclBvaW50ZXJ2SU5URUwgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZFBvaW50ZXJ2SU5URUwgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFBPSU5URVJWSU5URUxQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxQT0lOVEVSVklOVEVMUFJPQykgKEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JQT0lOVEVSVklOVEVMUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkRQT0lOVEVSVklOVEVMUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0hQX29jY2x1c2lvbl90ZXN0CisjZGVmaW5lIEdMX0hQX29jY2x1c2lvbl90ZXN0IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9waXhlbF90cmFuc2Zvcm0KKyNkZWZpbmUgR0xfRVhUX3BpeGVsX3RyYW5zZm9ybSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsVHJhbnNmb3JtUGFyYW1ldGVyaUVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGl4ZWxUcmFuc2Zvcm1QYXJhbWV0ZXJmRVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsVHJhbnNmb3JtUGFyYW1ldGVyaXZFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGl4ZWxUcmFuc2Zvcm1QYXJhbWV0ZXJmdkVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUElYRUxUUkFOU0ZPUk1QQVJBTUVURVJJRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTFRSQU5TRk9STVBBUkFNRVRFUkZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUElYRUxUUkFOU0ZPUk1QQVJBTUVURVJJVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTFRSQU5TRk9STVBBUkFNRVRFUkZWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9waXhlbF90cmFuc2Zvcm1fY29sb3JfdGFibGUKKyNkZWZpbmUgR0xfRVhUX3BpeGVsX3RyYW5zZm9ybV9jb2xvcl90YWJsZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc2hhcmVkX3RleHR1cmVfcGFsZXR0ZQorI2RlZmluZSBHTF9FWFRfc2hhcmVkX3RleHR1cmVfcGFsZXR0ZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc2VwYXJhdGVfc3BlY3VsYXJfY29sb3IKKyNkZWZpbmUgR0xfRVhUX3NlcGFyYXRlX3NwZWN1bGFyX2NvbG9yIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zZWNvbmRhcnlfY29sb3IKKyNkZWZpbmUgR0xfRVhUX3NlY29uZGFyeV9jb2xvciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2JFWFQgKEdMYnl0ZSByZWQsIEdMYnl0ZSBncmVlbiwgR0xieXRlIGJsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2J2RVhUIChjb25zdCBHTGJ5dGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2RFWFQgKEdMZG91YmxlIHJlZCwgR0xkb3VibGUgZ3JlZW4sIEdMZG91YmxlIGJsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2R2RVhUIChjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzZkVYVCAoR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzZnZFWFQgKGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2lFWFQgKEdMaW50IHJlZCwgR0xpbnQgZ3JlZW4sIEdMaW50IGJsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2l2RVhUIChjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3Izc0VYVCAoR0xzaG9ydCByZWQsIEdMc2hvcnQgZ3JlZW4sIEdMc2hvcnQgYmx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3Izc3ZFWFQgKGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3ViRVhUIChHTHVieXRlIHJlZCwgR0x1Ynl0ZSBncmVlbiwgR0x1Ynl0ZSBibHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1YnZFWFQgKGNvbnN0IEdMdWJ5dGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3VpRVhUIChHTHVpbnQgcmVkLCBHTHVpbnQgZ3JlZW4sIEdMdWludCBibHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1aXZFWFQgKGNvbnN0IEdMdWludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzdXNFWFQgKEdMdXNob3J0IHJlZCwgR0x1c2hvcnQgZ3JlZW4sIEdMdXNob3J0IGJsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3VzdkVYVCAoY29uc3QgR0x1c2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yUG9pbnRlckVYVCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzQkVYVFBST0MpIChHTGJ5dGUgcmVkLCBHTGJ5dGUgZ3JlZW4sIEdMYnl0ZSBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzQlZFWFRQUk9DKSAoY29uc3QgR0xieXRlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzREVYVFBST0MpIChHTGRvdWJsZSByZWQsIEdMZG91YmxlIGdyZWVuLCBHTGRvdWJsZSBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzRFZFWFRQUk9DKSAoY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNGRVhUUFJPQykgKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNGVkVYVFBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzSUVYVFBST0MpIChHTGludCByZWQsIEdMaW50IGdyZWVuLCBHTGludCBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzSVZFWFRQUk9DKSAoY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNTRVhUUFJPQykgKEdMc2hvcnQgcmVkLCBHTHNob3J0IGdyZWVuLCBHTHNob3J0IGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNTVkVYVFBST0MpIChjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVUJFWFRQUk9DKSAoR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sIEdMdWJ5dGUgYmx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1VCVkVYVFBST0MpIChjb25zdCBHTHVieXRlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVUlFWFRQUk9DKSAoR0x1aW50IHJlZCwgR0x1aW50IGdyZWVuLCBHTHVpbnQgYmx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1VJVkVYVFBST0MpIChjb25zdCBHTHVpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNVU0VYVFBST0MpIChHTHVzaG9ydCByZWQsIEdMdXNob3J0IGdyZWVuLCBHTHVzaG9ydCBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVVNWRVhUUFJPQykgKGNvbnN0IEdMdXNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1JQT0lOVEVSRVhUUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX3BlcnR1cmJfbm9ybWFsCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX3BlcnR1cmJfbm9ybWFsIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZU5vcm1hbEVYVCAoR0xlbnVtIG1vZGUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRU5PUk1BTEVYVFBST0MpIChHTGVudW0gbW9kZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfbXVsdGlfZHJhd19hcnJheXMKKyNkZWZpbmUgR0xfRVhUX211bHRpX2RyYXdfYXJyYXlzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlEcmF3QXJyYXlzRVhUIChHTGVudW0gbW9kZSwgY29uc3QgR0xpbnQgKmZpcnN0LCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpRHJhd0VsZW1lbnRzRVhUIChHTGVudW0gbW9kZSwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSURSQVdBUlJBWVNFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMaW50ICpmaXJzdCwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElEUkFXRUxFTUVOVFNFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2ZvZ19jb29yZAorI2RlZmluZSBHTF9FWFRfZm9nX2Nvb3JkIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nQ29vcmRmRVhUIChHTGZsb2F0IGNvb3JkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGZ2RVhUIChjb25zdCBHTGZsb2F0ICpjb29yZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nQ29vcmRkRVhUIChHTGRvdWJsZSBjb29yZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nQ29vcmRkdkVYVCAoY29uc3QgR0xkb3VibGUgKmNvb3JkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZFBvaW50ZXJFWFQgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZPR0NPT1JERkVYVFBST0MpIChHTGZsb2F0IGNvb3JkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRGVkVYVFBST0MpIChjb25zdCBHTGZsb2F0ICpjb29yZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZPR0NPT1JEREVYVFBST0MpIChHTGRvdWJsZSBjb29yZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZPR0NPT1JERFZFWFRQUk9DKSAoY29uc3QgR0xkb3VibGUgKmNvb3JkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRQT0lOVEVSRVhUUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1JFTkRfc2NyZWVuX2Nvb3JkaW5hdGVzCisjZGVmaW5lIEdMX1JFTkRfc2NyZWVuX2Nvb3JkaW5hdGVzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9jb29yZGluYXRlX2ZyYW1lCisjZGVmaW5lIEdMX0VYVF9jb29yZGluYXRlX2ZyYW1lIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGFuZ2VudDNiRVhUIChHTGJ5dGUgdHgsIEdMYnl0ZSB0eSwgR0xieXRlIHR6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYW5nZW50M2J2RVhUIChjb25zdCBHTGJ5dGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhbmdlbnQzZEVYVCAoR0xkb3VibGUgdHgsIEdMZG91YmxlIHR5LCBHTGRvdWJsZSB0eik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGFuZ2VudDNkdkVYVCAoY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhbmdlbnQzZkVYVCAoR0xmbG9hdCB0eCwgR0xmbG9hdCB0eSwgR0xmbG9hdCB0eik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGFuZ2VudDNmdkVYVCAoY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGFuZ2VudDNpRVhUIChHTGludCB0eCwgR0xpbnQgdHksIEdMaW50IHR6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYW5nZW50M2l2RVhUIChjb25zdCBHTGludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGFuZ2VudDNzRVhUIChHTHNob3J0IHR4LCBHTHNob3J0IHR5LCBHTHNob3J0IHR6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYW5nZW50M3N2RVhUIChjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbDNiRVhUIChHTGJ5dGUgYngsIEdMYnl0ZSBieSwgR0xieXRlIGJ6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbDNidkVYVCAoY29uc3QgR0xieXRlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbDNkRVhUIChHTGRvdWJsZSBieCwgR0xkb3VibGUgYnksIEdMZG91YmxlIGJ6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbDNkdkVYVCAoY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbm9ybWFsM2ZFWFQgKEdMZmxvYXQgYngsIEdMZmxvYXQgYnksIEdMZmxvYXQgYnopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbm9ybWFsM2Z2RVhUIChjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbDNpRVhUIChHTGludCBieCwgR0xpbnQgYnksIEdMaW50IGJ6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbDNpdkVYVCAoY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbm9ybWFsM3NFWFQgKEdMc2hvcnQgYngsIEdMc2hvcnQgYnksIEdMc2hvcnQgYnopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbm9ybWFsM3N2RVhUIChjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYW5nZW50UG9pbnRlckVYVCAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbm9ybWFsUG9pbnRlckVYVCAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEFOR0VOVDNCRVhUUFJPQykgKEdMYnl0ZSB0eCwgR0xieXRlIHR5LCBHTGJ5dGUgdHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM0JWRVhUUFJPQykgKGNvbnN0IEdMYnl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRBTkdFTlQzREVYVFBST0MpIChHTGRvdWJsZSB0eCwgR0xkb3VibGUgdHksIEdMZG91YmxlIHR6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEFOR0VOVDNEVkVYVFBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRBTkdFTlQzRkVYVFBST0MpIChHTGZsb2F0IHR4LCBHTGZsb2F0IHR5LCBHTGZsb2F0IHR6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEFOR0VOVDNGVkVYVFBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEFOR0VOVDNJRVhUUFJPQykgKEdMaW50IHR4LCBHTGludCB0eSwgR0xpbnQgdHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM0lWRVhUUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEFOR0VOVDNTRVhUUFJPQykgKEdMc2hvcnQgdHgsIEdMc2hvcnQgdHksIEdMc2hvcnQgdHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM1NWRVhUUFJPQykgKGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5PUk1BTDNCRVhUUFJPQykgKEdMYnl0ZSBieCwgR0xieXRlIGJ5LCBHTGJ5dGUgYnopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5PUk1BTDNCVkVYVFBST0MpIChjb25zdCBHTGJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5PUk1BTDNERVhUUFJPQykgKEdMZG91YmxlIGJ4LCBHTGRvdWJsZSBieSwgR0xkb3VibGUgYnopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5PUk1BTDNEVkVYVFBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0ZFWFRQUk9DKSAoR0xmbG9hdCBieCwgR0xmbG9hdCBieSwgR0xmbG9hdCBieik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0ZWRVhUUFJPQykgKGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5PUk1BTDNJRVhUUFJPQykgKEdMaW50IGJ4LCBHTGludCBieSwgR0xpbnQgYnopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5PUk1BTDNJVkVYVFBST0MpIChjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM1NFWFRQUk9DKSAoR0xzaG9ydCBieCwgR0xzaG9ydCBieSwgR0xzaG9ydCBieik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM1NWRVhUUFJPQykgKGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UUE9JTlRFUkVYVFBST0MpIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMUE9JTlRFUkVYVFBST0MpIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9lbnZfY29tYmluZQorI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9lbnZfY29tYmluZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV9zcGVjdWxhcl92ZWN0b3IKKyNkZWZpbmUgR0xfQVBQTEVfc3BlY3VsYXJfdmVjdG9yIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX3RyYW5zZm9ybV9oaW50CisjZGVmaW5lIEdMX0FQUExFX3RyYW5zZm9ybV9oaW50IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfZm9nX3NjYWxlCisjZGVmaW5lIEdMX1NHSVhfZm9nX3NjYWxlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NVTlhfY29uc3RhbnRfZGF0YQorI2RlZmluZSBHTF9TVU5YX2NvbnN0YW50X2RhdGEgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGaW5pc2hUZXh0dXJlU1VOWCAodm9pZCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGSU5JU0hURVhUVVJFU1VOWFBST0MpICh2b2lkKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NVTl9nbG9iYWxfYWxwaGEKKyNkZWZpbmUgR0xfU1VOX2dsb2JhbF9hbHBoYSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdsb2JhbEFscGhhRmFjdG9yYlNVTiAoR0xieXRlIGZhY3Rvcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2xvYmFsQWxwaGFGYWN0b3JzU1VOIChHTHNob3J0IGZhY3Rvcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2xvYmFsQWxwaGFGYWN0b3JpU1VOIChHTGludCBmYWN0b3IpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdsb2JhbEFscGhhRmFjdG9yZlNVTiAoR0xmbG9hdCBmYWN0b3IpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdsb2JhbEFscGhhRmFjdG9yZFNVTiAoR0xkb3VibGUgZmFjdG9yKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHbG9iYWxBbHBoYUZhY3RvcnViU1VOIChHTHVieXRlIGZhY3Rvcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2xvYmFsQWxwaGFGYWN0b3J1c1NVTiAoR0x1c2hvcnQgZmFjdG9yKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHbG9iYWxBbHBoYUZhY3RvcnVpU1VOIChHTHVpbnQgZmFjdG9yKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdMT0JBTEFMUEhBRkFDVE9SQlNVTlBST0MpIChHTGJ5dGUgZmFjdG9yKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0xPQkFMQUxQSEFGQUNUT1JTU1VOUFJPQykgKEdMc2hvcnQgZmFjdG9yKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0xPQkFMQUxQSEFGQUNUT1JJU1VOUFJPQykgKEdMaW50IGZhY3Rvcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdMT0JBTEFMUEhBRkFDVE9SRlNVTlBST0MpIChHTGZsb2F0IGZhY3Rvcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdMT0JBTEFMUEhBRkFDVE9SRFNVTlBST0MpIChHTGRvdWJsZSBmYWN0b3IpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHTE9CQUxBTFBIQUZBQ1RPUlVCU1VOUFJPQykgKEdMdWJ5dGUgZmFjdG9yKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0xPQkFMQUxQSEFGQUNUT1JVU1NVTlBST0MpIChHTHVzaG9ydCBmYWN0b3IpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHTE9CQUxBTFBIQUZBQ1RPUlVJU1VOUFJPQykgKEdMdWludCBmYWN0b3IpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOX3RyaWFuZ2xlX2xpc3QKKyNkZWZpbmUgR0xfU1VOX3RyaWFuZ2xlX2xpc3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aVNVTiAoR0x1aW50IGNvZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVzU1VOIChHTHVzaG9ydCBjb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1YlNVTiAoR0x1Ynl0ZSBjb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aXZTVU4gKGNvbnN0IEdMdWludCAqY29kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldXN2U1VOIChjb25zdCBHTHVzaG9ydCAqY29kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWJ2U1VOIChjb25zdCBHTHVieXRlICpjb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGVQb2ludGVyU1VOIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlTVU5QUk9DKSAoR0x1aW50IGNvZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVU1NVTlBST0MpIChHTHVzaG9ydCBjb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUJTVU5QUk9DKSAoR0x1Ynl0ZSBjb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlWU1VOUFJPQykgKGNvbnN0IEdMdWludCAqY29kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVTVlNVTlBST0MpIChjb25zdCBHTHVzaG9ydCAqY29kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVCVlNVTlBST0MpIChjb25zdCBHTHVieXRlICpjb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFUE9JTlRFUlNVTlBST0MpIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOX3ZlcnRleAorI2RlZmluZSBHTF9TVU5fdmVydGV4IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0dWJWZXJ0ZXgyZlNVTiAoR0x1Ynl0ZSByLCBHTHVieXRlIGcsIEdMdWJ5dGUgYiwgR0x1Ynl0ZSBhLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0dWJWZXJ0ZXgyZnZTVU4gKGNvbnN0IEdMdWJ5dGUgKmMsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yNHViVmVydGV4M2ZTVU4gKEdMdWJ5dGUgciwgR0x1Ynl0ZSBnLCBHTHVieXRlIGIsIEdMdWJ5dGUgYSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0dWJWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMdWJ5dGUgKmMsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yM2ZWZXJ0ZXgzZlNVTiAoR0xmbG9hdCByLCBHTGZsb2F0IGcsIEdMZmxvYXQgYiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3IzZlZlcnRleDNmdlNVTiAoY29uc3QgR0xmbG9hdCAqYywgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsM2ZWZXJ0ZXgzZlNVTiAoR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yNGZOb3JtYWwzZlZlcnRleDNmU1VOIChHTGZsb2F0IHIsIEdMZmxvYXQgZywgR0xmbG9hdCBiLCBHTGZsb2F0IGEsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yNGZOb3JtYWwzZlZlcnRleDNmdlNVTiAoY29uc3QgR0xmbG9hdCAqYywgY29uc3QgR0xmbG9hdCAqbiwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyZlZlcnRleDNmU1VOIChHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyZlZlcnRleDNmdlNVTiAoY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkNGZWZXJ0ZXg0ZlNVTiAoR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgcCwgR0xmbG9hdCBxLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkNGZWZXJ0ZXg0ZnZTVU4gKGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJmQ29sb3I0dWJWZXJ0ZXgzZlNVTiAoR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMdWJ5dGUgciwgR0x1Ynl0ZSBnLCBHTHVieXRlIGIsIEdMdWJ5dGUgYSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyZkNvbG9yNHViVmVydGV4M2Z2U1VOIChjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0x1Ynl0ZSAqYywgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyZkNvbG9yM2ZWZXJ0ZXgzZlNVTiAoR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkMmZDb2xvcjNmVmVydGV4M2Z2U1VOIChjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0xmbG9hdCAqYywgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyZk5vcm1hbDNmVmVydGV4M2ZTVU4gKEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJmTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJmQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2ZTVU4gKEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgZywgR0xmbG9hdCBiLCBHTGZsb2F0IGEsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkMmZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICpjLCBjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDRmQ29sb3I0Zk5vcm1hbDNmVmVydGV4NGZTVU4gKEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHAsIEdMZmxvYXQgcSwgR0xmbG9hdCByLCBHTGZsb2F0IGcsIEdMZmxvYXQgYiwgR0xmbG9hdCBhLCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkNGZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXg0ZnZTVU4gKGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICpjLCBjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aVZlcnRleDNmU1VOIChHTHVpbnQgcmMsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpVmVydGV4M2Z2U1VOIChjb25zdCBHTHVpbnQgKnJjLCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aUNvbG9yNHViVmVydGV4M2ZTVU4gKEdMdWludCByYywgR0x1Ynl0ZSByLCBHTHVieXRlIGcsIEdMdWJ5dGUgYiwgR0x1Ynl0ZSBhLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aUNvbG9yNHViVmVydGV4M2Z2U1VOIChjb25zdCBHTHVpbnQgKnJjLCBjb25zdCBHTHVieXRlICpjLCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aUNvbG9yM2ZWZXJ0ZXgzZlNVTiAoR0x1aW50IHJjLCBHTGZsb2F0IHIsIEdMZmxvYXQgZywgR0xmbG9hdCBiLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aUNvbG9yM2ZWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMdWludCAqcmMsIGNvbnN0IEdMZmxvYXQgKmMsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpTm9ybWFsM2ZWZXJ0ZXgzZlNVTiAoR0x1aW50IHJjLCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aU5vcm1hbDNmVmVydGV4M2Z2U1VOIChjb25zdCBHTHVpbnQgKnJjLCBjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aUNvbG9yNGZOb3JtYWwzZlZlcnRleDNmU1VOIChHTHVpbnQgcmMsIEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgYSwgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMdWludCAqcmMsIGNvbnN0IEdMZmxvYXQgKmMsIGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZlZlcnRleDNmU1VOIChHTHVpbnQgcmMsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aVRleENvb3JkMmZWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMdWludCAqcmMsIGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aVRleENvb3JkMmZOb3JtYWwzZlZlcnRleDNmU1VOIChHTHVpbnQgcmMsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aVRleENvb3JkMmZOb3JtYWwzZlZlcnRleDNmdlNVTiAoY29uc3QgR0x1aW50ICpyYywgY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZkNvbG9yNGZOb3JtYWwzZlZlcnRleDNmU1VOIChHTHVpbnQgcmMsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgZywgR0xmbG9hdCBiLCBHTGZsb2F0IGEsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZkNvbG9yNGZOb3JtYWwzZlZlcnRleDNmdlNVTiAoY29uc3QgR0x1aW50ICpyYywgY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKmMsIGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1I0VUJWRVJURVgyRlNVTlBST0MpIChHTHVieXRlIHIsIEdMdWJ5dGUgZywgR0x1Ynl0ZSBiLCBHTHVieXRlIGEsIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1I0VUJWRVJURVgyRlZTVU5QUk9DKSAoY29uc3QgR0x1Ynl0ZSAqYywgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SNFVCVkVSVEVYM0ZTVU5QUk9DKSAoR0x1Ynl0ZSByLCBHTHVieXRlIGcsIEdMdWJ5dGUgYiwgR0x1Ynl0ZSBhLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1I0VUJWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0x1Ynl0ZSAqYywgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SM0ZWRVJURVgzRlNVTlBST0MpIChHTGZsb2F0IHIsIEdMZmxvYXQgZywgR0xmbG9hdCBiLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1IzRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTGZsb2F0ICpjLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMM0ZWRVJURVgzRlNVTlBST0MpIChHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMM0ZWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0xmbG9hdCAqbiwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SNEZOT1JNQUwzRlZFUlRFWDNGU1VOUFJPQykgKEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgYSwgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SNEZOT1JNQUwzRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTGZsb2F0ICpjLCBjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQyRlZFUlRFWDNGU1VOUFJPQykgKEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQyRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JENEZWRVJURVg0RlNVTlBST0MpIChHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCBwLCBHTGZsb2F0IHEsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JENEZWRVJURVg0RlZTVU5QUk9DKSAoY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDJGQ09MT1I0VUJWRVJURVgzRlNVTlBST0MpIChHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0x1Ynl0ZSByLCBHTHVieXRlIGcsIEdMdWJ5dGUgYiwgR0x1Ynl0ZSBhLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQyRkNPTE9SNFVCVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTHVieXRlICpjLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQyRkNPTE9SM0ZWRVJURVgzRlNVTlBST0MpIChHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IGcsIEdMZmxvYXQgYiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkZDT0xPUjNGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICpjLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQyRk5PUk1BTDNGVkVSVEVYM0ZTVU5QUk9DKSAoR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDJGTk9STUFMM0ZWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDJGQ09MT1I0Rk5PUk1BTDNGVkVSVEVYM0ZTVU5QUk9DKSAoR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgYSwgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkZDT0xPUjRGTk9STUFMM0ZWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKmMsIGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDRGQ09MT1I0Rk5PUk1BTDNGVkVSVEVYNEZTVU5QUk9DKSAoR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgcCwgR0xmbG9hdCBxLCBHTGZsb2F0IHIsIEdMZmxvYXQgZywgR0xmbG9hdCBiLCBHTGZsb2F0IGEsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JENEZDT0xPUjRGTk9STUFMM0ZWRVJURVg0RlZTVU5QUk9DKSAoY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKmMsIGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSVZFUlRFWDNGU1VOUFJPQykgKEdMdWludCByYywgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMdWludCAqcmMsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSUNPTE9SNFVCVkVSVEVYM0ZTVU5QUk9DKSAoR0x1aW50IHJjLCBHTHVieXRlIHIsIEdMdWJ5dGUgZywgR0x1Ynl0ZSBiLCBHTHVieXRlIGEsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSUNPTE9SNFVCVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMdWludCAqcmMsIGNvbnN0IEdMdWJ5dGUgKmMsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSUNPTE9SM0ZWRVJURVgzRlNVTlBST0MpIChHTHVpbnQgcmMsIEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSUNPTE9SM0ZWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0x1aW50ICpyYywgY29uc3QgR0xmbG9hdCAqYywgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJTk9STUFMM0ZWRVJURVgzRlNVTlBST0MpIChHTHVpbnQgcmMsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSU5PUk1BTDNGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMdWludCAqcmMsIGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSUNPTE9SNEZOT1JNQUwzRlZFUlRFWDNGU1VOUFJPQykgKEdMdWludCByYywgR0xmbG9hdCByLCBHTGZsb2F0IGcsIEdMZmxvYXQgYiwgR0xmbG9hdCBhLCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlDT0xPUjRGTk9STUFMM0ZWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0x1aW50ICpyYywgY29uc3QgR0xmbG9hdCAqYywgY29uc3QgR0xmbG9hdCAqbiwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJVEVYQ09PUkQyRlZFUlRFWDNGU1VOUFJPQykgKEdMdWludCByYywgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSVRFWENPT1JEMkZWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0x1aW50ICpyYywgY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSVRFWENPT1JEMkZOT1JNQUwzRlZFUlRFWDNGU1VOUFJPQykgKEdMdWludCByYywgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSVRFWENPT1JEMkZOT1JNQUwzRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTHVpbnQgKnJjLCBjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0xmbG9hdCAqbiwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJVEVYQ09PUkQyRkNPTE9SNEZOT1JNQUwzRlZFUlRFWDNGU1VOUFJPQykgKEdMdWludCByYywgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgYSwgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJVEVYQ09PUkQyRkNPTE9SNEZOT1JNQUwzRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTHVpbnQgKnJjLCBjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0xmbG9hdCAqYywgY29uc3QgR0xmbG9hdCAqbiwgY29uc3QgR0xmbG9hdCAqdik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfZnVuY19zZXBhcmF0ZQorI2RlZmluZSBHTF9FWFRfYmxlbmRfZnVuY19zZXBhcmF0ZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRnVuY1NlcGFyYXRlRVhUIChHTGVudW0gc2ZhY3RvclJHQiwgR0xlbnVtIGRmYWN0b3JSR0IsIEdMZW51bSBzZmFjdG9yQWxwaGEsIEdMZW51bSBkZmFjdG9yQWxwaGEpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkxFTkRGVU5DU0VQQVJBVEVFWFRQUk9DKSAoR0xlbnVtIHNmYWN0b3JSR0IsIEdMZW51bSBkZmFjdG9yUkdCLCBHTGVudW0gc2ZhY3RvckFscGhhLCBHTGVudW0gZGZhY3RvckFscGhhKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lOR1JfYmxlbmRfZnVuY19zZXBhcmF0ZQorI2RlZmluZSBHTF9JTkdSX2JsZW5kX2Z1bmNfc2VwYXJhdGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEZ1bmNTZXBhcmF0ZUlOR1IgKEdMZW51bSBzZmFjdG9yUkdCLCBHTGVudW0gZGZhY3RvclJHQiwgR0xlbnVtIHNmYWN0b3JBbHBoYSwgR0xlbnVtIGRmYWN0b3JBbHBoYSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREZVTkNTRVBBUkFURUlOR1JQUk9DKSAoR0xlbnVtIHNmYWN0b3JSR0IsIEdMZW51bSBkZmFjdG9yUkdCLCBHTGVudW0gc2ZhY3RvckFscGhhLCBHTGVudW0gZGZhY3RvckFscGhhKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lOR1JfY29sb3JfY2xhbXAKKyNkZWZpbmUgR0xfSU5HUl9jb2xvcl9jbGFtcCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9JTkdSX2ludGVybGFjZV9yZWFkCisjZGVmaW5lIEdMX0lOR1JfaW50ZXJsYWNlX3JlYWQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3N0ZW5jaWxfd3JhcAorI2RlZmluZSBHTF9FWFRfc3RlbmNpbF93cmFwIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF80MjJfcGl4ZWxzCisjZGVmaW5lIEdMX0VYVF80MjJfcGl4ZWxzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleGdlbl9yZWZsZWN0aW9uCisjZGVmaW5lIEdMX05WX3RleGdlbl9yZWZsZWN0aW9uIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NVTl9jb252b2x1dGlvbl9ib3JkZXJfbW9kZXMKKyNkZWZpbmUgR0xfU1VOX2NvbnZvbHV0aW9uX2JvcmRlcl9tb2RlcyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9lbnZfYWRkCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2Vudl9hZGQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfbG9kX2JpYXMKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfbG9kX2JpYXMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdmVydGV4X3dlaWdodGluZworI2RlZmluZSBHTF9FWFRfdmVydGV4X3dlaWdodGluZyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFdlaWdodGZFWFQgKEdMZmxvYXQgd2VpZ2h0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhXZWlnaHRmdkVYVCAoY29uc3QgR0xmbG9hdCAqd2VpZ2h0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhXZWlnaHRQb2ludGVyRVhUIChHTHNpemVpIHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFdFSUdIVEZFWFRQUk9DKSAoR0xmbG9hdCB3ZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhXRUlHSFRGVkVYVFBST0MpIChjb25zdCBHTGZsb2F0ICp3ZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhXRUlHSFRQT0lOVEVSRVhUUFJPQykgKEdMc2l6ZWkgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfbGlnaHRfbWF4X2V4cG9uZW50CisjZGVmaW5lIEdMX05WX2xpZ2h0X21heF9leHBvbmVudCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfYXJyYXlfcmFuZ2UKKyNkZWZpbmUgR0xfTlZfdmVydGV4X2FycmF5X3JhbmdlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmx1c2hWZXJ0ZXhBcnJheVJhbmdlTlYgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEFycmF5UmFuZ2VOViAoR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGTFVTSFZFUlRFWEFSUkFZUkFOR0VOVlBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVJSQVlSQU5HRU5WUFJPQykgKEdMc2l6ZWkgbGVuZ3RoLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfcmVnaXN0ZXJfY29tYmluZXJzCisjZGVmaW5lIEdMX05WX3JlZ2lzdGVyX2NvbWJpbmVycyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbWJpbmVyUGFyYW1ldGVyZnZOViAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbWJpbmVyUGFyYW1ldGVyZk5WIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbWJpbmVyUGFyYW1ldGVyaXZOViAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21iaW5lclBhcmFtZXRlcmlOViAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tYmluZXJJbnB1dE5WIChHTGVudW0gc3RhZ2UsIEdMZW51bSBwb3J0aW9uLCBHTGVudW0gdmFyaWFibGUsIEdMZW51bSBpbnB1dCwgR0xlbnVtIG1hcHBpbmcsIEdMZW51bSBjb21wb25lbnRVc2FnZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tYmluZXJPdXRwdXROViAoR0xlbnVtIHN0YWdlLCBHTGVudW0gcG9ydGlvbiwgR0xlbnVtIGFiT3V0cHV0LCBHTGVudW0gY2RPdXRwdXQsIEdMZW51bSBzdW1PdXRwdXQsIEdMZW51bSBzY2FsZSwgR0xlbnVtIGJpYXMsIEdMYm9vbGVhbiBhYkRvdFByb2R1Y3QsIEdMYm9vbGVhbiBjZERvdFByb2R1Y3QsIEdMYm9vbGVhbiBtdXhTdW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZpbmFsQ29tYmluZXJJbnB1dE5WIChHTGVudW0gdmFyaWFibGUsIEdMZW51bSBpbnB1dCwgR0xlbnVtIG1hcHBpbmcsIEdMZW51bSBjb21wb25lbnRVc2FnZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29tYmluZXJJbnB1dFBhcmFtZXRlcmZ2TlYgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBvcnRpb24sIEdMZW51bSB2YXJpYWJsZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbWJpbmVySW5wdXRQYXJhbWV0ZXJpdk5WIChHTGVudW0gc3RhZ2UsIEdMZW51bSBwb3J0aW9uLCBHTGVudW0gdmFyaWFibGUsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29tYmluZXJPdXRwdXRQYXJhbWV0ZXJmdk5WIChHTGVudW0gc3RhZ2UsIEdMZW51bSBwb3J0aW9uLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29tYmluZXJPdXRwdXRQYXJhbWV0ZXJpdk5WIChHTGVudW0gc3RhZ2UsIEdMZW51bSBwb3J0aW9uLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEZpbmFsQ29tYmluZXJJbnB1dFBhcmFtZXRlcmZ2TlYgKEdMZW51bSB2YXJpYWJsZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEZpbmFsQ29tYmluZXJJbnB1dFBhcmFtZXRlcml2TlYgKEdMZW51bSB2YXJpYWJsZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTUJJTkVSUEFSQU1FVEVSRlZOVlBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTUJJTkVSUEFSQU1FVEVSRk5WUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTUJJTkVSUEFSQU1FVEVSSVZOVlBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01CSU5FUlBBUkFNRVRFUklOVlBST0MpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NQklORVJJTlBVVE5WUFJPQykgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBvcnRpb24sIEdMZW51bSB2YXJpYWJsZSwgR0xlbnVtIGlucHV0LCBHTGVudW0gbWFwcGluZywgR0xlbnVtIGNvbXBvbmVudFVzYWdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NQklORVJPVVRQVVROVlBST0MpIChHTGVudW0gc3RhZ2UsIEdMZW51bSBwb3J0aW9uLCBHTGVudW0gYWJPdXRwdXQsIEdMZW51bSBjZE91dHB1dCwgR0xlbnVtIHN1bU91dHB1dCwgR0xlbnVtIHNjYWxlLCBHTGVudW0gYmlhcywgR0xib29sZWFuIGFiRG90UHJvZHVjdCwgR0xib29sZWFuIGNkRG90UHJvZHVjdCwgR0xib29sZWFuIG11eFN1bSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZJTkFMQ09NQklORVJJTlBVVE5WUFJPQykgKEdMZW51bSB2YXJpYWJsZSwgR0xlbnVtIGlucHV0LCBHTGVudW0gbWFwcGluZywgR0xlbnVtIGNvbXBvbmVudFVzYWdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09NQklORVJJTlBVVFBBUkFNRVRFUkZWTlZQUk9DKSAoR0xlbnVtIHN0YWdlLCBHTGVudW0gcG9ydGlvbiwgR0xlbnVtIHZhcmlhYmxlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTUJJTkVSSU5QVVRQQVJBTUVURVJJVk5WUFJPQykgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBvcnRpb24sIEdMZW51bSB2YXJpYWJsZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09NQklORVJPVVRQVVRQQVJBTUVURVJGVk5WUFJPQykgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBvcnRpb24sIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09NQklORVJPVVRQVVRQQVJBTUVURVJJVk5WUFJPQykgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBvcnRpb24sIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZJTkFMQ09NQklORVJJTlBVVFBBUkFNRVRFUkZWTlZQUk9DKSAoR0xlbnVtIHZhcmlhYmxlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZJTkFMQ09NQklORVJJTlBVVFBBUkFNRVRFUklWTlZQUk9DKSAoR0xlbnVtIHZhcmlhYmxlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZm9nX2Rpc3RhbmNlCisjZGVmaW5lIEdMX05WX2ZvZ19kaXN0YW5jZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXhnZW5fZW1ib3NzCisjZGVmaW5lIEdMX05WX3RleGdlbl9lbWJvc3MgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfYmxlbmRfc3F1YXJlCisjZGVmaW5lIEdMX05WX2JsZW5kX3NxdWFyZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXh0dXJlX2Vudl9jb21iaW5lNAorI2RlZmluZSBHTF9OVl90ZXh0dXJlX2Vudl9jb21iaW5lNCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9NRVNBX3Jlc2l6ZV9idWZmZXJzCisjZGVmaW5lIEdMX01FU0FfcmVzaXplX2J1ZmZlcnMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXNpemVCdWZmZXJzTUVTQSAodm9pZCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVNJWkVCVUZGRVJTTUVTQVBST0MpICh2b2lkKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX01FU0Ffd2luZG93X3BvcworI2RlZmluZSBHTF9NRVNBX3dpbmRvd19wb3MgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZE1FU0EgKEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJkdk1FU0EgKGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZk1FU0EgKEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZnZNRVNBIChjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyaU1FU0EgKEdMaW50IHgsIEdMaW50IHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJpdk1FU0EgKGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3Myc01FU0EgKEdMc2hvcnQgeCwgR0xzaG9ydCB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3Myc3ZNRVNBIChjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZE1FU0EgKEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNkdk1FU0EgKGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZk1FU0EgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNmdk1FU0EgKGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNpTUVTQSAoR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2l2TUVTQSAoY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNzTUVTQSAoR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM3N2TUVTQSAoY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zNGRNRVNBIChHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3M0ZHZNRVNBIChjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zNGZNRVNBIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczRmdk1FU0EgKGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczRpTUVTQSAoR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zNGl2TUVTQSAoY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczRzTUVTQSAoR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3M0c3ZNRVNBIChjb25zdCBHTHNob3J0ICp2KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJETUVTQVBST0MpIChHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMkRWTUVTQVBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJGTUVTQVBST0MpIChHTGZsb2F0IHgsIEdMZmxvYXQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJGVk1FU0FQUk9DKSAoY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJJTUVTQVBST0MpIChHTGludCB4LCBHTGludCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMklWTUVTQVBST0MpIChjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJTTUVTQVBST0MpIChHTHNob3J0IHgsIEdMc2hvcnQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJTVk1FU0FQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNETUVTQVBST0MpIChHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0RWTUVTQVBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNGTUVTQVBST0MpIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0ZWTUVTQVBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0lNRVNBUFJPQykgKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzSVZNRVNBUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM1NNRVNBUFJPQykgKEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzU1ZNRVNBUFJPQykgKGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1M0RE1FU0FQUk9DKSAoR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzREVk1FU0FQUk9DKSAoY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1M0Rk1FU0FQUk9DKSAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TNEZWTUVTQVBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TNElNRVNBUFJPQykgKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1M0SVZNRVNBUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TNFNNRVNBUFJPQykgKEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzRTVk1FU0FQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9JQk1fY3VsbF92ZXJ0ZXgKKyNkZWZpbmUgR0xfSUJNX2N1bGxfdmVydGV4IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lCTV9tdWx0aW1vZGVfZHJhd19hcnJheXMKKyNkZWZpbmUgR0xfSUJNX211bHRpbW9kZV9kcmF3X2FycmF5cyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpTW9kZURyYXdBcnJheXNJQk0gKGNvbnN0IEdMZW51bSAqbW9kZSwgY29uc3QgR0xpbnQgKmZpcnN0LCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQsIEdMaW50IG1vZGVzdHJpZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpTW9kZURyYXdFbGVtZW50c0lCTSAoY29uc3QgR0xlbnVtICptb2RlLCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogY29uc3QgKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50LCBHTGludCBtb2Rlc3RyaWRlKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJTU9ERURSQVdBUlJBWVNJQk1QUk9DKSAoY29uc3QgR0xlbnVtICptb2RlLCBjb25zdCBHTGludCAqZmlyc3QsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCwgR0xpbnQgbW9kZXN0cmlkZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJTU9ERURSQVdFTEVNRU5UU0lCTVBST0MpIChjb25zdCBHTGVudW0gKm1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBjb25zdCAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQsIEdMaW50IG1vZGVzdHJpZGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfSUJNX3ZlcnRleF9hcnJheV9saXN0cworI2RlZmluZSBHTF9JQk1fdmVydGV4X2FycmF5X2xpc3RzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JQb2ludGVyTGlzdElCTSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMaW50IHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvclBvaW50ZXJMaXN0SUJNIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xpbnQgc3RyaWRlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyLCBHTGludCBwdHJzdHJpZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVkZ2VGbGFnUG9pbnRlckxpc3RJQk0gKEdMaW50IHN0cmlkZSwgY29uc3QgR0xib29sZWFuKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZFBvaW50ZXJMaXN0SUJNIChHTGVudW0gdHlwZSwgR0xpbnQgc3RyaWRlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyLCBHTGludCBwdHJzdHJpZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEluZGV4UG9pbnRlckxpc3RJQk0gKEdMZW51bSB0eXBlLCBHTGludCBzdHJpZGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIsIEdMaW50IHB0cnN0cmlkZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsUG9pbnRlckxpc3RJQk0gKEdMZW51bSB0eXBlLCBHTGludCBzdHJpZGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIsIEdMaW50IHB0cnN0cmlkZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmRQb2ludGVyTGlzdElCTSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMaW50IHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhQb2ludGVyTGlzdElCTSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMaW50IHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SUE9JTlRFUkxJU1RJQk1QUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMaW50IHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1JQT0lOVEVSTElTVElCTVBST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xpbnQgc3RyaWRlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyLCBHTGludCBwdHJzdHJpZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFREdFRkxBR1BPSU5URVJMSVNUSUJNUFJPQykgKEdMaW50IHN0cmlkZSwgY29uc3QgR0xib29sZWFuKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRQT0lOVEVSTElTVElCTVBST0MpIChHTGVudW0gdHlwZSwgR0xpbnQgc3RyaWRlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyLCBHTGludCBwdHJzdHJpZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xJTkRFWFBPSU5URVJMSVNUSUJNUFJPQykgKEdMZW51bSB0eXBlLCBHTGludCBzdHJpZGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIsIEdMaW50IHB0cnN0cmlkZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFBPSU5URVJMSVNUSUJNUFJPQykgKEdMZW51bSB0eXBlLCBHTGludCBzdHJpZGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIsIEdMaW50IHB0cnN0cmlkZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEUE9JTlRFUkxJU1RJQk1QUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMaW50IHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYUE9JTlRFUkxJU1RJQk1QUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMaW50IHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfc3Vic2FtcGxlCisjZGVmaW5lIEdMX1NHSVhfc3Vic2FtcGxlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfeWNyY2JhCisjZGVmaW5lIEdMX1NHSVhfeWNyY2JhIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfeWNyY2Jfc3Vic2FtcGxlCisjZGVmaW5lIEdMX1NHSVhfeWNyY2Jfc3Vic2FtcGxlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfZGVwdGhfcGFzc19pbnN0cnVtZW50CisjZGVmaW5lIEdMX1NHSVhfZGVwdGhfcGFzc19pbnN0cnVtZW50IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMXzNERlhfdGV4dHVyZV9jb21wcmVzc2lvbl9GWFQxCisjZGVmaW5lIEdMXzNERlhfdGV4dHVyZV9jb21wcmVzc2lvbl9GWFQxIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMXzNERlhfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xfM0RGWF9tdWx0aXNhbXBsZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF8zREZYX3RidWZmZXIKKyNkZWZpbmUgR0xfM0RGWF90YnVmZmVyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGJ1ZmZlck1hc2szREZYIChHTHVpbnQgbWFzayk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQlVGRkVSTUFTSzNERlhQUk9DKSAoR0x1aW50IG1hc2spOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX211bHRpc2FtcGxlCisjZGVmaW5lIEdMX0VYVF9tdWx0aXNhbXBsZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZU1hc2tFWFQgKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVQYXR0ZXJuRVhUIChHTGVudW0gcGF0dGVybik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVNQVNLRVhUUFJPQykgKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0FNUExFUEFUVEVSTkVYVFBST0MpIChHTGVudW0gcGF0dGVybik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3ZlcnRleF9wcmVjbGlwCisjZGVmaW5lIEdMX1NHSVhfdmVydGV4X3ByZWNsaXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9jb252b2x1dGlvbl9hY2N1cmFjeQorI2RlZmluZSBHTF9TR0lYX2NvbnZvbHV0aW9uX2FjY3VyYWN5IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfcmVzYW1wbGUKKyNkZWZpbmUgR0xfU0dJWF9yZXNhbXBsZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3BvaW50X2xpbmVfdGV4Z2VuCisjZGVmaW5lIEdMX1NHSVNfcG9pbnRfbGluZV90ZXhnZW4gMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU190ZXh0dXJlX2NvbG9yX21hc2sKKyNkZWZpbmUgR0xfU0dJU190ZXh0dXJlX2NvbG9yX21hc2sgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXh0dXJlQ29sb3JNYXNrU0dJUyAoR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVDT0xPUk1BU0tTR0lTUFJPQykgKEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2lnbG9vX2ludGVyZmFjZQorI2RlZmluZSBHTF9TR0lYX2lnbG9vX2ludGVyZmFjZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbElnbG9vSW50ZXJmYWNlU0dJWCAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTHZvaWQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xJR0xPT0lOVEVSRkFDRVNHSVhQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTHZvaWQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9lbnZfZG90MworI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9lbnZfZG90MyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfdGV4dHVyZV9taXJyb3Jfb25jZQorI2RlZmluZSBHTF9BVElfdGV4dHVyZV9taXJyb3Jfb25jZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mZW5jZQorI2RlZmluZSBHTF9OVl9mZW5jZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZUZlbmNlc05WIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZmVuY2VzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5GZW5jZXNOViAoR0xzaXplaSBuLCBHTHVpbnQgKmZlbmNlcyk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc0ZlbmNlTlYgKEdMdWludCBmZW5jZSk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xUZXN0RmVuY2VOViAoR0x1aW50IGZlbmNlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRGZW5jZWl2TlYgKEdMdWludCBmZW5jZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGaW5pc2hGZW5jZU5WIChHTHVpbnQgZmVuY2UpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNldEZlbmNlTlYgKEdMdWludCBmZW5jZSwgR0xlbnVtIGNvbmRpdGlvbik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVGRU5DRVNOVlBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZmVuY2VzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VORkVOQ0VTTlZQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKmZlbmNlcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNGRU5DRU5WUFJPQykgKEdMdWludCBmZW5jZSk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMVEVTVEZFTkNFTlZQUk9DKSAoR0x1aW50IGZlbmNlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VURkVOQ0VJVk5WUFJPQykgKEdMdWludCBmZW5jZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRklOSVNIRkVOQ0VOVlBST0MpIChHTHVpbnQgZmVuY2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRVRGRU5DRU5WUFJPQykgKEdMdWludCBmZW5jZSwgR0xlbnVtIGNvbmRpdGlvbik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9ldmFsdWF0b3JzCisjZGVmaW5lIEdMX05WX2V2YWx1YXRvcnMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXBDb250cm9sUG9pbnRzTlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgdXN0cmlkZSwgR0xzaXplaSB2c3RyaWRlLCBHTGludCB1b3JkZXIsIEdMaW50IHZvcmRlciwgR0xib29sZWFuIHBhY2tlZCwgY29uc3QgR0x2b2lkICpwb2ludHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hcFBhcmFtZXRlcml2TlYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWFwUGFyYW1ldGVyZnZOViAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE1hcENvbnRyb2xQb2ludHNOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGVudW0gdHlwZSwgR0xzaXplaSB1c3RyaWRlLCBHTHNpemVpIHZzdHJpZGUsIEdMYm9vbGVhbiBwYWNrZWQsIEdMdm9pZCAqcG9pbnRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNYXBQYXJhbWV0ZXJpdk5WIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE1hcFBhcmFtZXRlcmZ2TlYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNYXBBdHRyaWJQYXJhbWV0ZXJpdk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWFwQXR0cmliUGFyYW1ldGVyZnZOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRXZhbE1hcHNOViAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIG1vZGUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFQQ09OVFJPTFBPSU5UU05WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgdXN0cmlkZSwgR0xzaXplaSB2c3RyaWRlLCBHTGludCB1b3JkZXIsIEdMaW50IHZvcmRlciwgR0xib29sZWFuIHBhY2tlZCwgY29uc3QgR0x2b2lkICpwb2ludHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVBQQVJBTUVURVJJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BUFBBUkFNRVRFUkZWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNQVBDT05UUk9MUE9JTlRTTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGVudW0gdHlwZSwgR0xzaXplaSB1c3RyaWRlLCBHTHNpemVpIHZzdHJpZGUsIEdMYm9vbGVhbiBwYWNrZWQsIEdMdm9pZCAqcG9pbnRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTUFQUEFSQU1FVEVSSVZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNQVBQQVJBTUVURVJGVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTUFQQVRUUklCUEFSQU1FVEVSSVZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1BUEFUVFJJQlBBUkFNRVRFUkZWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVWQUxNQVBTTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIG1vZGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfcGFja2VkX2RlcHRoX3N0ZW5jaWwKKyNkZWZpbmUgR0xfTlZfcGFja2VkX2RlcHRoX3N0ZW5jaWwgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfcmVnaXN0ZXJfY29tYmluZXJzMgorI2RlZmluZSBHTF9OVl9yZWdpc3Rlcl9jb21iaW5lcnMyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tYmluZXJTdGFnZVBhcmFtZXRlcmZ2TlYgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbWJpbmVyU3RhZ2VQYXJhbWV0ZXJmdk5WIChHTGVudW0gc3RhZ2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTUJJTkVSU1RBR0VQQVJBTUVURVJGVk5WUFJPQykgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT01CSU5FUlNUQUdFUEFSQU1FVEVSRlZOVlBST0MpIChHTGVudW0gc3RhZ2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfY29tcHJlc3Npb25fdnRjCisjZGVmaW5lIEdMX05WX3RleHR1cmVfY29tcHJlc3Npb25fdnRjIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfcmVjdGFuZ2xlCisjZGVmaW5lIEdMX05WX3RleHR1cmVfcmVjdGFuZ2xlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfc2hhZGVyCisjZGVmaW5lIEdMX05WX3RleHR1cmVfc2hhZGVyIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfc2hhZGVyMgorI2RlZmluZSBHTF9OVl90ZXh0dXJlX3NoYWRlcjIgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X2FycmF5X3JhbmdlMgorI2RlZmluZSBHTF9OVl92ZXJ0ZXhfYXJyYXlfcmFuZ2UyIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9wcm9ncmFtCisjZGVmaW5lIEdMX05WX3ZlcnRleF9wcm9ncmFtIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xBcmVQcm9ncmFtc1Jlc2lkZW50TlYgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpwcm9ncmFtcywgR0xib29sZWFuICpyZXNpZGVuY2VzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kUHJvZ3JhbU5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVByb2dyYW1zTlYgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpwcm9ncmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRXhlY3V0ZVByb2dyYW1OViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlblByb2dyYW1zTlYgKEdMc2l6ZWkgbiwgR0x1aW50ICpwcm9ncmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbVBhcmFtZXRlcmR2TlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtUGFyYW1ldGVyZnZOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbWl2TlYgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtU3RyaW5nTlYgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTHVieXRlICpwcm9ncmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUcmFja01hdHJpeGl2TlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBhZGRyZXNzLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYmR2TlYgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJmdk5WIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJpdk5WIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnZOViAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdm9pZCogKnBvaW50ZXIpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNQcm9ncmFtTlYgKEdMdWludCBpZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9hZFByb2dyYW1OViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkLCBHTHNpemVpIGxlbiwgY29uc3QgR0x1Ynl0ZSAqcHJvZ3JhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVBhcmFtZXRlcjRkTlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVBhcmFtZXRlcjRkdk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtUGFyYW1ldGVyNGZOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1QYXJhbWV0ZXI0ZnZOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtUGFyYW1ldGVyczRkdk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtUGFyYW1ldGVyczRmdk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcXVlc3RSZXNpZGVudFByb2dyYW1zTlYgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpwcm9ncmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVHJhY2tNYXRyaXhOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGFkZHJlc3MsIEdMZW51bSBtYXRyaXgsIEdMZW51bSB0cmFuc2Zvcm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYlBvaW50ZXJOViAoR0x1aW50IGluZGV4LCBHTGludCBmc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFkTlYgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWR2TlYgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFmTlYgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZnZOViAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxc05WIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMXN2TlYgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMmROViAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZHZOViAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMmZOViAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMmZ2TlYgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMnNOViAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMnN2TlYgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2ROViAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZHZOViAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2ZOViAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZnZOViAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzc05WIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNzdk5WIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRkTlYgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGR2TlYgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRmTlYgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0ZnZOViAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0c05WIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNHN2TlYgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNHViTlYgKEdMdWludCBpbmRleCwgR0x1Ynl0ZSB4LCBHTHVieXRlIHksIEdMdWJ5dGUgeiwgR0x1Ynl0ZSB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0dWJ2TlYgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczFkdk5WIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzMWZ2TlYgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczFzdk5WIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnMyZHZOViAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczJmdk5WIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnMyc3ZOViAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzM2R2TlYgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnMzZnZOViAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzM3N2TlYgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczRkdk5WIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzNGZ2TlYgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczRzdk5WIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnM0dWJ2TlYgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1Ynl0ZSAqdik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTEFSRVBST0dSQU1TUkVTSURFTlROVlBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcHJvZ3JhbXMsIEdMYm9vbGVhbiAqcmVzaWRlbmNlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRQUk9HUkFNTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFUFJPR1JBTVNOVlBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcHJvZ3JhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFWEVDVVRFUFJPR1JBTU5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VOUFJPR1JBTVNOVlBST0MpIChHTHNpemVpIG4sIEdMdWludCAqcHJvZ3JhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNUEFSQU1FVEVSRFZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xkb3VibGUgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1QQVJBTUVURVJGVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNSVZOVlBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1TVFJJTkdOVlBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1Ynl0ZSAqcHJvZ3JhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFRSQUNLTUFUUklYSVZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYWRkcmVzcywgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCRFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xkb3VibGUgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQkZWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQklWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJQT0lOVEVSVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqICpwb2ludGVyKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1BST0dSQU1OVlBST0MpIChHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xMT0FEUFJPR1JBTU5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdWJ5dGUgKnByb2dyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNUEFSQU1FVEVSNEROVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNUEFSQU1FVEVSNERWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1QQVJBTUVURVI0Rk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVBBUkFNRVRFUjRGVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1QQVJBTUVURVJTNERWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1QQVJBTUVURVJTNEZWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVRVUVTVFJFU0lERU5UUFJPR1JBTVNOVlBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcHJvZ3JhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUUkFDS01BVFJJWE5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBhZGRyZXNzLCBHTGVudW0gbWF0cml4LCBHTGVudW0gdHJhbnNmb3JtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUE9JTlRFUk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgZnNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMUROVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxRFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMUZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFGVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFTTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxU1ZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJEVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRlZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyU05WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaG9ydCB4LCBHTHNob3J0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyU1ZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzRE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNEVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzRk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNGVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNTTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM1NWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNEROVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0RFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNEZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRGVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRTTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0U1ZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0VUJOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMdWJ5dGUgeCwgR0x1Ynl0ZSB5LCBHTHVieXRlIHosIEdMdWJ5dGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRVQlZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTMURWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlMxRlZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTMVNWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzJEVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTMkZWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzJTVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlMzRFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzNGVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlMzU1ZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTNERWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlM0RlZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTNFNWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzRVQlZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWJ5dGUgKnYpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF90ZXh0dXJlX2Nvb3JkaW5hdGVfY2xhbXAKKyNkZWZpbmUgR0xfU0dJWF90ZXh0dXJlX2Nvb3JkaW5hdGVfY2xhbXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9zY2FsZWJpYXNfaGludAorI2RlZmluZSBHTF9TR0lYX3NjYWxlYmlhc19oaW50IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX09NTF9pbnRlcmxhY2UKKyNkZWZpbmUgR0xfT01MX2ludGVybGFjZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9PTUxfc3Vic2FtcGxlCisjZGVmaW5lIEdMX09NTF9zdWJzYW1wbGUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfT01MX3Jlc2FtcGxlCisjZGVmaW5lIEdMX09NTF9yZXNhbXBsZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9jb3B5X2RlcHRoX3RvX2NvbG9yCisjZGVmaW5lIEdMX05WX2NvcHlfZGVwdGhfdG9fY29sb3IgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX2Vudm1hcF9idW1wbWFwCisjZGVmaW5lIEdMX0FUSV9lbnZtYXBfYnVtcG1hcCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEJ1bXBQYXJhbWV0ZXJpdkFUSSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEJ1bXBQYXJhbWV0ZXJmdkFUSSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VGV4QnVtcFBhcmFtZXRlcml2QVRJIChHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VGV4QnVtcFBhcmFtZXRlcmZ2QVRJIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWEJVTVBQQVJBTUVURVJJVkFUSVBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWEJVTVBQQVJBTUVURVJGVkFUSVBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVEVYQlVNUFBBUkFNRVRFUklWQVRJUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVEVYQlVNUFBBUkFNRVRFUkZWQVRJUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW0pOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX2ZyYWdtZW50X3NoYWRlcgorI2RlZmluZSBHTF9BVElfZnJhZ21lbnRfc2hhZGVyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSBHTHVpbnQgQVBJRU5UUlkgZ2xHZW5GcmFnbWVudFNoYWRlcnNBVEkgKEdMdWludCByYW5nZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEZyYWdtZW50U2hhZGVyQVRJIChHTHVpbnQgaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZUZyYWdtZW50U2hhZGVyQVRJIChHTHVpbnQgaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJlZ2luRnJhZ21lbnRTaGFkZXJBVEkgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuZEZyYWdtZW50U2hhZGVyQVRJICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQYXNzVGV4Q29vcmRBVEkgKEdMdWludCBkc3QsIEdMdWludCBjb29yZCwgR0xlbnVtIHN3aXp6bGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZU1hcEFUSSAoR0x1aW50IGRzdCwgR0x1aW50IGludGVycCwgR0xlbnVtIHN3aXp6bGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yRnJhZ21lbnRPcDFBVEkgKEdMZW51bSBvcCwgR0x1aW50IGRzdCwgR0x1aW50IGRzdE1hc2ssIEdMdWludCBkc3RNb2QsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMVJlcCwgR0x1aW50IGFyZzFNb2QpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yRnJhZ21lbnRPcDJBVEkgKEdMZW51bSBvcCwgR0x1aW50IGRzdCwgR0x1aW50IGRzdE1hc2ssIEdMdWludCBkc3RNb2QsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMVJlcCwgR0x1aW50IGFyZzFNb2QsIEdMdWludCBhcmcyLCBHTHVpbnQgYXJnMlJlcCwgR0x1aW50IGFyZzJNb2QpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yRnJhZ21lbnRPcDNBVEkgKEdMZW51bSBvcCwgR0x1aW50IGRzdCwgR0x1aW50IGRzdE1hc2ssIEdMdWludCBkc3RNb2QsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMVJlcCwgR0x1aW50IGFyZzFNb2QsIEdMdWludCBhcmcyLCBHTHVpbnQgYXJnMlJlcCwgR0x1aW50IGFyZzJNb2QsIEdMdWludCBhcmczLCBHTHVpbnQgYXJnM1JlcCwgR0x1aW50IGFyZzNNb2QpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFscGhhRnJhZ21lbnRPcDFBVEkgKEdMZW51bSBvcCwgR0x1aW50IGRzdCwgR0x1aW50IGRzdE1vZCwgR0x1aW50IGFyZzEsIEdMdWludCBhcmcxUmVwLCBHTHVpbnQgYXJnMU1vZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWxwaGFGcmFnbWVudE9wMkFUSSAoR0xlbnVtIG9wLCBHTHVpbnQgZHN0LCBHTHVpbnQgZHN0TW9kLCBHTHVpbnQgYXJnMSwgR0x1aW50IGFyZzFSZXAsIEdMdWludCBhcmcxTW9kLCBHTHVpbnQgYXJnMiwgR0x1aW50IGFyZzJSZXAsIEdMdWludCBhcmcyTW9kKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBbHBoYUZyYWdtZW50T3AzQVRJIChHTGVudW0gb3AsIEdMdWludCBkc3QsIEdMdWludCBkc3RNb2QsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMVJlcCwgR0x1aW50IGFyZzFNb2QsIEdMdWludCBhcmcyLCBHTHVpbnQgYXJnMlJlcCwgR0x1aW50IGFyZzJNb2QsIEdMdWludCBhcmczLCBHTHVpbnQgYXJnM1JlcCwgR0x1aW50IGFyZzNNb2QpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNldEZyYWdtZW50U2hhZGVyQ29uc3RhbnRBVEkgKEdMdWludCBkc3QsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMR0VORlJBR01FTlRTSEFERVJTQVRJUFJPQykgKEdMdWludCByYW5nZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRGUkFHTUVOVFNIQURFUkFUSVBST0MpIChHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVGUkFHTUVOVFNIQURFUkFUSVBST0MpIChHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCRUdJTkZSQUdNRU5UU0hBREVSQVRJUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkRGUkFHTUVOVFNIQURFUkFUSVBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUEFTU1RFWENPT1JEQVRJUFJPQykgKEdMdWludCBkc3QsIEdMdWludCBjb29yZCwgR0xlbnVtIHN3aXp6bGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVNQVBBVElQUk9DKSAoR0x1aW50IGRzdCwgR0x1aW50IGludGVycCwgR0xlbnVtIHN3aXp6bGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUkZSQUdNRU5UT1AxQVRJUFJPQykgKEdMZW51bSBvcCwgR0x1aW50IGRzdCwgR0x1aW50IGRzdE1hc2ssIEdMdWludCBkc3RNb2QsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMVJlcCwgR0x1aW50IGFyZzFNb2QpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUkZSQUdNRU5UT1AyQVRJUFJPQykgKEdMZW51bSBvcCwgR0x1aW50IGRzdCwgR0x1aW50IGRzdE1hc2ssIEdMdWludCBkc3RNb2QsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMVJlcCwgR0x1aW50IGFyZzFNb2QsIEdMdWludCBhcmcyLCBHTHVpbnQgYXJnMlJlcCwgR0x1aW50IGFyZzJNb2QpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUkZSQUdNRU5UT1AzQVRJUFJPQykgKEdMZW51bSBvcCwgR0x1aW50IGRzdCwgR0x1aW50IGRzdE1hc2ssIEdMdWludCBkc3RNb2QsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMVJlcCwgR0x1aW50IGFyZzFNb2QsIEdMdWludCBhcmcyLCBHTHVpbnQgYXJnMlJlcCwgR0x1aW50IGFyZzJNb2QsIEdMdWludCBhcmczLCBHTHVpbnQgYXJnM1JlcCwgR0x1aW50IGFyZzNNb2QpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBTFBIQUZSQUdNRU5UT1AxQVRJUFJPQykgKEdMZW51bSBvcCwgR0x1aW50IGRzdCwgR0x1aW50IGRzdE1vZCwgR0x1aW50IGFyZzEsIEdMdWludCBhcmcxUmVwLCBHTHVpbnQgYXJnMU1vZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEFMUEhBRlJBR01FTlRPUDJBVElQUk9DKSAoR0xlbnVtIG9wLCBHTHVpbnQgZHN0LCBHTHVpbnQgZHN0TW9kLCBHTHVpbnQgYXJnMSwgR0x1aW50IGFyZzFSZXAsIEdMdWludCBhcmcxTW9kLCBHTHVpbnQgYXJnMiwgR0x1aW50IGFyZzJSZXAsIEdMdWludCBhcmcyTW9kKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQUxQSEFGUkFHTUVOVE9QM0FUSVBST0MpIChHTGVudW0gb3AsIEdMdWludCBkc3QsIEdMdWludCBkc3RNb2QsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMVJlcCwgR0x1aW50IGFyZzFNb2QsIEdMdWludCBhcmcyLCBHTHVpbnQgYXJnMlJlcCwgR0x1aW50IGFyZzJNb2QsIEdMdWludCBhcmczLCBHTHVpbnQgYXJnM1JlcCwgR0x1aW50IGFyZzNNb2QpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRVRGUkFHTUVOVFNIQURFUkNPTlNUQU5UQVRJUFJPQykgKEdMdWludCBkc3QsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV9wbl90cmlhbmdsZXMKKyNkZWZpbmUgR0xfQVRJX3BuX3RyaWFuZ2xlcyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBOVHJpYW5nbGVzaUFUSSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUE5UcmlhbmdsZXNmQVRJIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE5UUklBTkdMRVNJQVRJUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQTlRSSUFOR0xFU0ZBVElQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV92ZXJ0ZXhfYXJyYXlfb2JqZWN0CisjZGVmaW5lIEdMX0FUSV92ZXJ0ZXhfYXJyYXlfb2JqZWN0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSBHTHVpbnQgQVBJRU5UUlkgZ2xOZXdPYmplY3RCdWZmZXJBVEkgKEdMc2l6ZWkgc2l6ZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTGVudW0gdXNhZ2UpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNPYmplY3RCdWZmZXJBVEkgKEdMdWludCBidWZmZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVwZGF0ZU9iamVjdEJ1ZmZlckFUSSAoR0x1aW50IGJ1ZmZlciwgR0x1aW50IG9mZnNldCwgR0xzaXplaSBzaXplLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIsIEdMZW51bSBwcmVzZXJ2ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0T2JqZWN0QnVmZmVyZnZBVEkgKEdMdWludCBidWZmZXIsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRPYmplY3RCdWZmZXJpdkFUSSAoR0x1aW50IGJ1ZmZlciwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmVlT2JqZWN0QnVmZmVyQVRJIChHTHVpbnQgYnVmZmVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBcnJheU9iamVjdEFUSSAoR0xlbnVtIGFycmF5LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMdWludCBidWZmZXIsIEdMdWludCBvZmZzZXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEFycmF5T2JqZWN0ZnZBVEkgKEdMZW51bSBhcnJheSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEFycmF5T2JqZWN0aXZBVEkgKEdMZW51bSBhcnJheSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYXJpYW50QXJyYXlPYmplY3RBVEkgKEdMdWludCBpZCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHVpbnQgYnVmZmVyLCBHTHVpbnQgb2Zmc2V0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWYXJpYW50QXJyYXlPYmplY3RmdkFUSSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmFyaWFudEFycmF5T2JqZWN0aXZBVEkgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMTkVXT0JKRUNUQlVGRkVSQVRJUFJPQykgKEdMc2l6ZWkgc2l6ZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTGVudW0gdXNhZ2UpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTT0JKRUNUQlVGRkVSQVRJUFJPQykgKEdMdWludCBidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVUERBVEVPQkpFQ1RCVUZGRVJBVElQUk9DKSAoR0x1aW50IGJ1ZmZlciwgR0x1aW50IG9mZnNldCwgR0xzaXplaSBzaXplLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIsIEdMZW51bSBwcmVzZXJ2ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE9CSkVDVEJVRkZFUkZWQVRJUFJPQykgKEdMdWludCBidWZmZXIsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUT0JKRUNUQlVGRkVSSVZBVElQUk9DKSAoR0x1aW50IGJ1ZmZlciwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJFRU9CSkVDVEJVRkZFUkFUSVBST0MpIChHTHVpbnQgYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQVJSQVlPQkpFQ1RBVElQUk9DKSAoR0xlbnVtIGFycmF5LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMdWludCBidWZmZXIsIEdMdWludCBvZmZzZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBUlJBWU9CSkVDVEZWQVRJUFJPQykgKEdMZW51bSBhcnJheSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBUlJBWU9CSkVDVElWQVRJUFJPQykgKEdMZW51bSBhcnJheSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFSSUFOVEFSUkFZT0JKRUNUQVRJUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHVpbnQgYnVmZmVyLCBHTHVpbnQgb2Zmc2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkFSSUFOVEFSUkFZT0JKRUNURlZBVElQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZBUklBTlRBUlJBWU9CSkVDVElWQVRJUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF92ZXJ0ZXhfc2hhZGVyCisjZGVmaW5lIEdMX0VYVF92ZXJ0ZXhfc2hhZGVyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmVnaW5WZXJ0ZXhTaGFkZXJFWFQgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuZFZlcnRleFNoYWRlckVYVCAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZFZlcnRleFNoYWRlckVYVCAoR0x1aW50IGlkKTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbEdlblZlcnRleFNoYWRlcnNFWFQgKEdMdWludCByYW5nZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlVmVydGV4U2hhZGVyRVhUIChHTHVpbnQgaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNoYWRlck9wMUVYVCAoR0xlbnVtIG9wLCBHTHVpbnQgcmVzLCBHTHVpbnQgYXJnMSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2hhZGVyT3AyRVhUIChHTGVudW0gb3AsIEdMdWludCByZXMsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2hhZGVyT3AzRVhUIChHTGVudW0gb3AsIEdMdWludCByZXMsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMiwgR0x1aW50IGFyZzMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN3aXp6bGVFWFQgKEdMdWludCByZXMsIEdMdWludCBpbiwgR0xlbnVtIG91dFgsIEdMZW51bSBvdXRZLCBHTGVudW0gb3V0WiwgR0xlbnVtIG91dFcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdyaXRlTWFza0VYVCAoR0x1aW50IHJlcywgR0x1aW50IGluLCBHTGVudW0gb3V0WCwgR0xlbnVtIG91dFksIEdMZW51bSBvdXRaLCBHTGVudW0gb3V0Vyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSW5zZXJ0Q29tcG9uZW50RVhUIChHTHVpbnQgcmVzLCBHTHVpbnQgc3JjLCBHTHVpbnQgbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFeHRyYWN0Q29tcG9uZW50RVhUIChHTHVpbnQgcmVzLCBHTHVpbnQgc3JjLCBHTHVpbnQgbnVtKTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbEdlblN5bWJvbHNFWFQgKEdMZW51bSBkYXRhdHlwZSwgR0xlbnVtIHN0b3JhZ2V0eXBlLCBHTGVudW0gcmFuZ2UsIEdMdWludCBjb21wb25lbnRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZXRJbnZhcmlhbnRFWFQgKEdMdWludCBpZCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqYWRkcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2V0TG9jYWxDb25zdGFudEVYVCAoR0x1aW50IGlkLCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICphZGRyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYXJpYW50YnZFWFQgKEdMdWludCBpZCwgY29uc3QgR0xieXRlICphZGRyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYXJpYW50c3ZFWFQgKEdMdWludCBpZCwgY29uc3QgR0xzaG9ydCAqYWRkcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmFyaWFudGl2RVhUIChHTHVpbnQgaWQsIGNvbnN0IEdMaW50ICphZGRyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYXJpYW50ZnZFWFQgKEdMdWludCBpZCwgY29uc3QgR0xmbG9hdCAqYWRkcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmFyaWFudGR2RVhUIChHTHVpbnQgaWQsIGNvbnN0IEdMZG91YmxlICphZGRyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYXJpYW50dWJ2RVhUIChHTHVpbnQgaWQsIGNvbnN0IEdMdWJ5dGUgKmFkZHIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhcmlhbnR1c3ZFWFQgKEdMdWludCBpZCwgY29uc3QgR0x1c2hvcnQgKmFkZHIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhcmlhbnR1aXZFWFQgKEdMdWludCBpZCwgY29uc3QgR0x1aW50ICphZGRyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYXJpYW50UG9pbnRlckVYVCAoR0x1aW50IGlkLCBHTGVudW0gdHlwZSwgR0x1aW50IHN0cmlkZSwgY29uc3QgR0x2b2lkICphZGRyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmFibGVWYXJpYW50Q2xpZW50U3RhdGVFWFQgKEdMdWludCBpZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGlzYWJsZVZhcmlhbnRDbGllbnRTdGF0ZUVYVCAoR0x1aW50IGlkKTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbEJpbmRMaWdodFBhcmFtZXRlckVYVCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gdmFsdWUpOworR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsQmluZE1hdGVyaWFsUGFyYW1ldGVyRVhUIChHTGVudW0gZmFjZSwgR0xlbnVtIHZhbHVlKTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbEJpbmRUZXhHZW5QYXJhbWV0ZXJFWFQgKEdMZW51bSB1bml0LCBHTGVudW0gY29vcmQsIEdMZW51bSB2YWx1ZSk7CitHTEFQSSBHTHVpbnQgQVBJRU5UUlkgZ2xCaW5kVGV4dHVyZVVuaXRQYXJhbWV0ZXJFWFQgKEdMZW51bSB1bml0LCBHTGVudW0gdmFsdWUpOworR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsQmluZFBhcmFtZXRlckVYVCAoR0xlbnVtIHZhbHVlKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzVmFyaWFudEVuYWJsZWRFWFQgKEdMdWludCBpZCwgR0xlbnVtIGNhcCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmFyaWFudEJvb2xlYW52RVhUIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xib29sZWFuICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWYXJpYW50SW50ZWdlcnZFWFQgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGludCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmFyaWFudEZsb2F0dkVYVCAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMZmxvYXQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZhcmlhbnRQb2ludGVydkVYVCAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMdm9pZCogKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEludmFyaWFudEJvb2xlYW52RVhUIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xib29sZWFuICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbnZhcmlhbnRJbnRlZ2VydkVYVCAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMaW50ICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbnZhcmlhbnRGbG9hdHZFWFQgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGZsb2F0ICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRMb2NhbENvbnN0YW50Qm9vbGVhbnZFWFQgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGJvb2xlYW4gKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldExvY2FsQ29uc3RhbnRJbnRlZ2VydkVYVCAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMaW50ICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRMb2NhbENvbnN0YW50RmxvYXR2RVhUIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xmbG9hdCAqZGF0YSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCRUdJTlZFUlRFWFNIQURFUkVYVFBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5EVkVSVEVYU0hBREVSRVhUUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EVkVSVEVYU0hBREVSRVhUUFJPQykgKEdMdWludCBpZCk7Cit0eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMR0VOVkVSVEVYU0hBREVSU0VYVFBST0MpIChHTHVpbnQgcmFuZ2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVWRVJURVhTSEFERVJFWFRQUk9DKSAoR0x1aW50IGlkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0hBREVST1AxRVhUUFJPQykgKEdMZW51bSBvcCwgR0x1aW50IHJlcywgR0x1aW50IGFyZzEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTSEFERVJPUDJFWFRQUk9DKSAoR0xlbnVtIG9wLCBHTHVpbnQgcmVzLCBHTHVpbnQgYXJnMSwgR0x1aW50IGFyZzIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTSEFERVJPUDNFWFRQUk9DKSAoR0xlbnVtIG9wLCBHTHVpbnQgcmVzLCBHTHVpbnQgYXJnMSwgR0x1aW50IGFyZzIsIEdMdWludCBhcmczKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1dJWlpMRUVYVFBST0MpIChHTHVpbnQgcmVzLCBHTHVpbnQgaW4sIEdMZW51bSBvdXRYLCBHTGVudW0gb3V0WSwgR0xlbnVtIG91dFosIEdMZW51bSBvdXRXKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV1JJVEVNQVNLRVhUUFJPQykgKEdMdWludCByZXMsIEdMdWludCBpbiwgR0xlbnVtIG91dFgsIEdMZW51bSBvdXRZLCBHTGVudW0gb3V0WiwgR0xlbnVtIG91dFcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xJTlNFUlRDT01QT05FTlRFWFRQUk9DKSAoR0x1aW50IHJlcywgR0x1aW50IHNyYywgR0x1aW50IG51bSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVYVFJBQ1RDT01QT05FTlRFWFRQUk9DKSAoR0x1aW50IHJlcywgR0x1aW50IHNyYywgR0x1aW50IG51bSk7Cit0eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMR0VOU1lNQk9MU0VYVFBST0MpIChHTGVudW0gZGF0YXR5cGUsIEdMZW51bSBzdG9yYWdldHlwZSwgR0xlbnVtIHJhbmdlLCBHTHVpbnQgY29tcG9uZW50cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFVElOVkFSSUFOVEVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmFkZHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRVRMT0NBTENPTlNUQU5URVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqYWRkcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZBUklBTlRCVkVYVFBST0MpIChHTHVpbnQgaWQsIGNvbnN0IEdMYnl0ZSAqYWRkcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZBUklBTlRTVkVYVFBST0MpIChHTHVpbnQgaWQsIGNvbnN0IEdMc2hvcnQgKmFkZHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWQVJJQU5USVZFWFRQUk9DKSAoR0x1aW50IGlkLCBjb25zdCBHTGludCAqYWRkcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZBUklBTlRGVkVYVFBST0MpIChHTHVpbnQgaWQsIGNvbnN0IEdMZmxvYXQgKmFkZHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWQVJJQU5URFZFWFRQUk9DKSAoR0x1aW50IGlkLCBjb25zdCBHTGRvdWJsZSAqYWRkcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZBUklBTlRVQlZFWFRQUk9DKSAoR0x1aW50IGlkLCBjb25zdCBHTHVieXRlICphZGRyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFSSUFOVFVTVkVYVFBST0MpIChHTHVpbnQgaWQsIGNvbnN0IEdMdXNob3J0ICphZGRyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFSSUFOVFVJVkVYVFBST0MpIChHTHVpbnQgaWQsIGNvbnN0IEdMdWludCAqYWRkcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZBUklBTlRQT0lOVEVSRVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHR5cGUsIEdMdWludCBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqYWRkcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVOQUJMRVZBUklBTlRDTElFTlRTVEFURUVYVFBST0MpIChHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xESVNBQkxFVkFSSUFOVENMSUVOVFNUQVRFRVhUUFJPQykgKEdMdWludCBpZCk7Cit0eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMQklORExJR0hUUEFSQU1FVEVSRVhUUFJPQykgKEdMZW51bSBsaWdodCwgR0xlbnVtIHZhbHVlKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xCSU5ETUFURVJJQUxQQVJBTUVURVJFWFRQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSB2YWx1ZSk7Cit0eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMQklORFRFWEdFTlBBUkFNRVRFUkVYVFBST0MpIChHTGVudW0gdW5pdCwgR0xlbnVtIGNvb3JkLCBHTGVudW0gdmFsdWUpOwordHlwZWRlZiBHTHVpbnQgKEFQSUVOVFJZUCBQRk5HTEJJTkRURVhUVVJFVU5JVFBBUkFNRVRFUkVYVFBST0MpIChHTGVudW0gdW5pdCwgR0xlbnVtIHZhbHVlKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xCSU5EUEFSQU1FVEVSRVhUUFJPQykgKEdMZW51bSB2YWx1ZSk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNWQVJJQU5URU5BQkxFREVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBjYXApOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWQVJJQU5UQk9PTEVBTlZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMYm9vbGVhbiAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZBUklBTlRJTlRFR0VSVkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xpbnQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWQVJJQU5URkxPQVRWRVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGZsb2F0ICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkFSSUFOVFBPSU5URVJWRVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTHZvaWQqICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSU5WQVJJQU5UQk9PTEVBTlZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMYm9vbGVhbiAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVElOVkFSSUFOVElOVEVHRVJWRVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGludCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVElOVkFSSUFOVEZMT0FUVkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xmbG9hdCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVExPQ0FMQ09OU1RBTlRCT09MRUFOVkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xib29sZWFuICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTE9DQUxDT05TVEFOVElOVEVHRVJWRVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGludCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVExPQ0FMQ09OU1RBTlRGTE9BVFZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMZmxvYXQgKmRhdGEpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3ZlcnRleF9zdHJlYW1zCisjZGVmaW5lIEdMX0FUSV92ZXJ0ZXhfc3RyZWFtcyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTFzQVRJIChHTGVudW0gc3RyZWFtLCBHTHNob3J0IHgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTFzdkFUSSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xzaG9ydCAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0xaUFUSSAoR0xlbnVtIHN0cmVhbSwgR0xpbnQgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMWl2QVRJIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGludCAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0xZkFUSSAoR0xlbnVtIHN0cmVhbSwgR0xmbG9hdCB4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0xZnZBVEkgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZmxvYXQgKmNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMWRBVEkgKEdMZW51bSBzdHJlYW0sIEdMZG91YmxlIHgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTFkdkFUSSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xkb3VibGUgKmNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMnNBVEkgKEdMZW51bSBzdHJlYW0sIEdMc2hvcnQgeCwgR0xzaG9ydCB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0yc3ZBVEkgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMc2hvcnQgKmNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMmlBVEkgKEdMZW51bSBzdHJlYW0sIEdMaW50IHgsIEdMaW50IHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTJpdkFUSSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xpbnQgKmNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMmZBVEkgKEdMZW51bSBzdHJlYW0sIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0yZnZBVEkgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZmxvYXQgKmNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMmRBVEkgKEdMZW51bSBzdHJlYW0sIEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTJkdkFUSSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xkb3VibGUgKmNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtM3NBVEkgKEdMZW51bSBzdHJlYW0sIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTNzdkFUSSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xzaG9ydCAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0zaUFUSSAoR0xlbnVtIHN0cmVhbSwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtM2l2QVRJIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGludCAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0zZkFUSSAoR0xlbnVtIHN0cmVhbSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtM2Z2QVRJIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGZsb2F0ICpjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTNkQVRJIChHTGVudW0gc3RyZWFtLCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0zZHZBVEkgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZG91YmxlICpjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTRzQVRJIChHTGVudW0gc3RyZWFtLCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTRzdkFUSSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xzaG9ydCAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW00aUFUSSAoR0xlbnVtIHN0cmVhbSwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtNGl2QVRJIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGludCAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW00ZkFUSSAoR0xlbnVtIHN0cmVhbSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW00ZnZBVEkgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZmxvYXQgKmNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtNGRBVEkgKEdMZW51bSBzdHJlYW0sIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTRkdkFUSSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xkb3VibGUgKmNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2JBVEkgKEdMZW51bSBzdHJlYW0sIEdMYnl0ZSBueCwgR0xieXRlIG55LCBHTGJ5dGUgbnopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbFN0cmVhbTNidkFUSSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xieXRlICpjb29yZHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbFN0cmVhbTNzQVRJIChHTGVudW0gc3RyZWFtLCBHTHNob3J0IG54LCBHTHNob3J0IG55LCBHTHNob3J0IG56KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxTdHJlYW0zc3ZBVEkgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMc2hvcnQgKmNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2lBVEkgKEdMZW51bSBzdHJlYW0sIEdMaW50IG54LCBHTGludCBueSwgR0xpbnQgbnopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbFN0cmVhbTNpdkFUSSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xpbnQgKmNvb3Jkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2ZBVEkgKEdMZW51bSBzdHJlYW0sIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbFN0cmVhbTNmdkFUSSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xmbG9hdCAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxTdHJlYW0zZEFUSSAoR0xlbnVtIHN0cmVhbSwgR0xkb3VibGUgbngsIEdMZG91YmxlIG55LCBHTGRvdWJsZSBueik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2R2QVRJIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGRvdWJsZSAqY29vcmRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGllbnRBY3RpdmVWZXJ0ZXhTdHJlYW1BVEkgKEdMZW51bSBzdHJlYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEJsZW5kRW52aUFUSSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QmxlbmRFbnZmQVRJIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMVNBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xzaG9ydCB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMVNWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMc2hvcnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTFJQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMaW50IHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0xSVZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xpbnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTFGQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMZmxvYXQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTFGVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGZsb2F0ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0xREFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGRvdWJsZSB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMURWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZG91YmxlICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0yU0FUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTHNob3J0IHgsIEdMc2hvcnQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTJTVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTHNob3J0ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0ySUFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGludCB4LCBHTGludCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMklWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMaW50ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0yRkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTJGVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGZsb2F0ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0yREFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMkRWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZG91YmxlICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0zU0FUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNM1NWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMc2hvcnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTNJQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0zSVZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xpbnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTNGQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0zRlZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xmbG9hdCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNM0RBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTNEVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGRvdWJsZSAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNNFNBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNNFNWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMc2hvcnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTRJQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU00SVZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xpbnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTRGQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTRGVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGZsb2F0ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU00REFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNNERWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZG91YmxlICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxTVFJFQU0zQkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGJ5dGUgbngsIEdMYnl0ZSBueSwgR0xieXRlIG56KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMU1RSRUFNM0JWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMYnl0ZSAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMU1RSRUFNM1NBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xzaG9ydCBueCwgR0xzaG9ydCBueSwgR0xzaG9ydCBueik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFNUUkVBTTNTVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTHNob3J0ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxTVFJFQU0zSUFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGludCBueCwgR0xpbnQgbnksIEdMaW50IG56KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMU1RSRUFNM0lWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMaW50ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxTVFJFQU0zRkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMU1RSRUFNM0ZWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZmxvYXQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFNUUkVBTTNEQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMZG91YmxlIG54LCBHTGRvdWJsZSBueSwgR0xkb3VibGUgbnopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxTVFJFQU0zRFZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xkb3VibGUgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENMSUVOVEFDVElWRVZFUlRFWFNUUkVBTUFUSVBST0MpIChHTGVudW0gc3RyZWFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQkxFTkRFTlZJQVRJUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhCTEVOREVOVkZBVElQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV9lbGVtZW50X2FycmF5CisjZGVmaW5lIEdMX0FUSV9lbGVtZW50X2FycmF5IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRWxlbWVudFBvaW50ZXJBVEkgKEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdFbGVtZW50QXJyYXlBVEkgKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3UmFuZ2VFbGVtZW50QXJyYXlBVEkgKEdMZW51bSBtb2RlLCBHTHVpbnQgc3RhcnQsIEdMdWludCBlbmQsIEdMc2l6ZWkgY291bnQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRUxFTUVOVFBPSU5URVJBVElQUk9DKSAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdFTEVNRU5UQVJSQVlBVElQUk9DKSAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXUkFOR0VFTEVNRU5UQVJSQVlBVElQUk9DKSAoR0xlbnVtIG1vZGUsIEdMdWludCBzdGFydCwgR0x1aW50IGVuZCwgR0xzaXplaSBjb3VudCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TVU5fbWVzaF9hcnJheQorI2RlZmluZSBHTF9TVU5fbWVzaF9hcnJheSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdNZXNoQXJyYXlzU1VOIChHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQsIEdMc2l6ZWkgd2lkdGgpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV01FU0hBUlJBWVNTVU5QUk9DKSAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50LCBHTHNpemVpIHdpZHRoKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NVTl9zbGljZV9hY2N1bQorI2RlZmluZSBHTF9TVU5fc2xpY2VfYWNjdW0gMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfbXVsdGlzYW1wbGVfZmlsdGVyX2hpbnQKKyNkZWZpbmUgR0xfTlZfbXVsdGlzYW1wbGVfZmlsdGVyX2hpbnQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZGVwdGhfY2xhbXAKKyNkZWZpbmUgR0xfTlZfZGVwdGhfY2xhbXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfb2NjbHVzaW9uX3F1ZXJ5CisjZGVmaW5lIEdMX05WX29jY2x1c2lvbl9xdWVyeSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlbk9jY2x1c2lvblF1ZXJpZXNOViAoR0xzaXplaSBuLCBHTHVpbnQgKmlkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlT2NjbHVzaW9uUXVlcmllc05WIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqaWRzKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzT2NjbHVzaW9uUXVlcnlOViAoR0x1aW50IGlkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCZWdpbk9jY2x1c2lvblF1ZXJ5TlYgKEdMdWludCBpZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5kT2NjbHVzaW9uUXVlcnlOViAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0T2NjbHVzaW9uUXVlcnlpdk5WIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0T2NjbHVzaW9uUXVlcnl1aXZOViAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMdWludCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTk9DQ0xVU0lPTlFVRVJJRVNOVlBST0MpIChHTHNpemVpIG4sIEdMdWludCAqaWRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFT0NDTFVTSU9OUVVFUklFU05WUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICppZHMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTT0NDTFVTSU9OUVVFUllOVlBST0MpIChHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCRUdJTk9DQ0xVU0lPTlFVRVJZTlZQUk9DKSAoR0x1aW50IGlkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5ET0NDTFVTSU9OUVVFUllOVlBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUT0NDTFVTSU9OUVVFUllJVk5WUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUT0NDTFVTSU9OUVVFUllVSVZOVlBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfcG9pbnRfc3ByaXRlCisjZGVmaW5lIEdMX05WX3BvaW50X3Nwcml0ZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyaU5WIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcml2TlYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUklOVlBST0MpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE9JTlRQQVJBTUVURVJJVk5WUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXh0dXJlX3NoYWRlcjMKKyNkZWZpbmUgR0xfTlZfdGV4dHVyZV9zaGFkZXIzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9wcm9ncmFtMV8xCisjZGVmaW5lIEdMX05WX3ZlcnRleF9wcm9ncmFtMV8xIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zaGFkb3dfZnVuY3MKKyNkZWZpbmUgR0xfRVhUX3NoYWRvd19mdW5jcyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc3RlbmNpbF90d29fc2lkZQorI2RlZmluZSBHTF9FWFRfc3RlbmNpbF90d29fc2lkZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFjdGl2ZVN0ZW5jaWxGYWNlRVhUIChHTGVudW0gZmFjZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBQ1RJVkVTVEVOQ0lMRkFDRUVYVFBST0MpIChHTGVudW0gZmFjZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfdGV4dF9mcmFnbWVudF9zaGFkZXIKKyNkZWZpbmUgR0xfQVRJX3RleHRfZnJhZ21lbnRfc2hhZGVyIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX2NsaWVudF9zdG9yYWdlCisjZGVmaW5lIEdMX0FQUExFX2NsaWVudF9zdG9yYWdlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX2VsZW1lbnRfYXJyYXkKKyNkZWZpbmUgR0xfQVBQTEVfZWxlbWVudF9hcnJheSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVsZW1lbnRQb2ludGVyQVBQTEUgKEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdFbGVtZW50QXJyYXlBUFBMRSAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3UmFuZ2VFbGVtZW50QXJyYXlBUFBMRSAoR0xlbnVtIG1vZGUsIEdMdWludCBzdGFydCwgR0x1aW50IGVuZCwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpRHJhd0VsZW1lbnRBcnJheUFQUExFIChHTGVudW0gbW9kZSwgY29uc3QgR0xpbnQgKmZpcnN0LCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpRHJhd1JhbmdlRWxlbWVudEFycmF5QVBQTEUgKEdMZW51bSBtb2RlLCBHTHVpbnQgc3RhcnQsIEdMdWludCBlbmQsIGNvbnN0IEdMaW50ICpmaXJzdCwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVMRU1FTlRQT0lOVEVSQVBQTEVQUk9DKSAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdFTEVNRU5UQVJSQVlBUFBMRVBST0MpIChHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXUkFOR0VFTEVNRU5UQVJSQVlBUFBMRVBST0MpIChHTGVudW0gbW9kZSwgR0x1aW50IHN0YXJ0LCBHTHVpbnQgZW5kLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJRFJBV0VMRU1FTlRBUlJBWUFQUExFUFJPQykgKEdMZW51bSBtb2RlLCBjb25zdCBHTGludCAqZmlyc3QsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJRFJBV1JBTkdFRUxFTUVOVEFSUkFZQVBQTEVQUk9DKSAoR0xlbnVtIG1vZGUsIEdMdWludCBzdGFydCwgR0x1aW50IGVuZCwgY29uc3QgR0xpbnQgKmZpcnN0LCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfZmVuY2UKKyNkZWZpbmUgR0xfQVBQTEVfZmVuY2UgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5GZW5jZXNBUFBMRSAoR0xzaXplaSBuLCBHTHVpbnQgKmZlbmNlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlRmVuY2VzQVBQTEUgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmZW5jZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNldEZlbmNlQVBQTEUgKEdMdWludCBmZW5jZSk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc0ZlbmNlQVBQTEUgKEdMdWludCBmZW5jZSk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xUZXN0RmVuY2VBUFBMRSAoR0x1aW50IGZlbmNlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGaW5pc2hGZW5jZUFQUExFIChHTHVpbnQgZmVuY2UpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsVGVzdE9iamVjdEFQUExFIChHTGVudW0gb2JqZWN0LCBHTHVpbnQgbmFtZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmluaXNoT2JqZWN0QVBQTEUgKEdMZW51bSBvYmplY3QsIEdMaW50IG5hbWUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VORkVOQ0VTQVBQTEVQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKmZlbmNlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURUZFTkNFU0FQUExFUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmZW5jZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRVRGRU5DRUFQUExFUFJPQykgKEdMdWludCBmZW5jZSk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNGRU5DRUFQUExFUFJPQykgKEdMdWludCBmZW5jZSk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMVEVTVEZFTkNFQVBQTEVQUk9DKSAoR0x1aW50IGZlbmNlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRklOSVNIRkVOQ0VBUFBMRVBST0MpIChHTHVpbnQgZmVuY2UpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTFRFU1RPQkpFQ1RBUFBMRVBST0MpIChHTGVudW0gb2JqZWN0LCBHTHVpbnQgbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZJTklTSE9CSkVDVEFQUExFUFJPQykgKEdMZW51bSBvYmplY3QsIEdMaW50IG5hbWUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfdmVydGV4X2FycmF5X29iamVjdAorI2RlZmluZSBHTF9BUFBMRV92ZXJ0ZXhfYXJyYXlfb2JqZWN0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZFZlcnRleEFycmF5QVBQTEUgKEdMdWludCBhcnJheSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlVmVydGV4QXJyYXlzQVBQTEUgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICphcnJheXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlblZlcnRleEFycmF5c0FQUExFIChHTHNpemVpIG4sIEdMdWludCAqYXJyYXlzKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzVmVydGV4QXJyYXlBUFBMRSAoR0x1aW50IGFycmF5KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRWRVJURVhBUlJBWUFQUExFUFJPQykgKEdMdWludCBhcnJheSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVZFUlRFWEFSUkFZU0FQUExFUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICphcnJheXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5WRVJURVhBUlJBWVNBUFBMRVBST0MpIChHTHNpemVpIG4sIEdMdWludCAqYXJyYXlzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1ZFUlRFWEFSUkFZQVBQTEVQUk9DKSAoR0x1aW50IGFycmF5KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX3ZlcnRleF9hcnJheV9yYW5nZQorI2RlZmluZSBHTF9BUFBMRV92ZXJ0ZXhfYXJyYXlfcmFuZ2UgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBcnJheVJhbmdlQVBQTEUgKEdMc2l6ZWkgbGVuZ3RoLCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZsdXNoVmVydGV4QXJyYXlSYW5nZUFQUExFIChHTHNpemVpIGxlbmd0aCwgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBcnJheVBhcmFtZXRlcmlBUFBMRSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBUlJBWVJBTkdFQVBQTEVQUk9DKSAoR0xzaXplaSBsZW5ndGgsIEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZMVVNIVkVSVEVYQVJSQVlSQU5HRUFQUExFUFJPQykgKEdMc2l6ZWkgbGVuZ3RoLCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBUlJBWVBBUkFNRVRFUklBUFBMRVBST0MpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX3ljYmNyXzQyMgorI2RlZmluZSBHTF9BUFBMRV95Y2Jjcl80MjIgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfUzNfczN0YworI2RlZmluZSBHTF9TM19zM3RjIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV9kcmF3X2J1ZmZlcnMKKyNkZWZpbmUgR0xfQVRJX2RyYXdfYnVmZmVycyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdCdWZmZXJzQVRJIChHTHNpemVpIG4sIGNvbnN0IEdMZW51bSAqYnVmcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXQlVGRkVSU0FUSVBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMZW51bSAqYnVmcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfcGl4ZWxfZm9ybWF0X2Zsb2F0CisjZGVmaW5lIEdMX0FUSV9waXhlbF9mb3JtYXRfZmxvYXQgMQorLyogVGhpcyBpcyByZWFsbHkgYSBXR0wgZXh0ZW5zaW9uLCBidXQgZGVmaW5lcyBzb21lIGFzc29jaWF0ZWQgR0wgZW51bXMuCisgKiBBVEkgZG9lcyBub3QgZXhwb3J0ICJHTF9BVElfcGl4ZWxfZm9ybWF0X2Zsb2F0IiBpbiB0aGUgR0xfRVhURU5TSU9OUyBzdHJpbmcuCisgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV90ZXh0dXJlX2Vudl9jb21iaW5lMworI2RlZmluZSBHTF9BVElfdGV4dHVyZV9lbnZfY29tYmluZTMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3RleHR1cmVfZmxvYXQKKyNkZWZpbmUgR0xfQVRJX3RleHR1cmVfZmxvYXQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZmxvYXRfYnVmZmVyCisjZGVmaW5lIEdMX05WX2Zsb2F0X2J1ZmZlciAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mcmFnbWVudF9wcm9ncmFtCisjZGVmaW5lIEdMX05WX2ZyYWdtZW50X3Byb2dyYW0gMQorLyogU29tZSBOVl9mcmFnbWVudF9wcm9ncmFtIGVudHJ5IHBvaW50cyBhcmUgc2hhcmVkIHdpdGggQVJCX3ZlcnRleF9wcm9ncmFtLiAqLworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtTmFtZWRQYXJhbWV0ZXI0Zk5WIChHTHVpbnQgaWQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHVieXRlICpuYW1lLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1OYW1lZFBhcmFtZXRlcjRkTlYgKEdMdWludCBpZCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdWJ5dGUgKm5hbWUsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1OYW1lZFBhcmFtZXRlcjRmdk5WIChHTHVpbnQgaWQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHVieXRlICpuYW1lLCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtTmFtZWRQYXJhbWV0ZXI0ZHZOViAoR0x1aW50IGlkLCBHTHNpemVpIGxlbiwgY29uc3QgR0x1Ynl0ZSAqbmFtZSwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1OYW1lZFBhcmFtZXRlcmZ2TlYgKEdMdWludCBpZCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdWJ5dGUgKm5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbU5hbWVkUGFyYW1ldGVyZHZOViAoR0x1aW50IGlkLCBHTHNpemVpIGxlbiwgY29uc3QgR0x1Ynl0ZSAqbmFtZSwgR0xkb3VibGUgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNTkFNRURQQVJBTUVURVI0Rk5WUFJPQykgKEdMdWludCBpZCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdWJ5dGUgKm5hbWUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1OQU1FRFBBUkFNRVRFUjRETlZQUk9DKSAoR0x1aW50IGlkLCBHTHNpemVpIGxlbiwgY29uc3QgR0x1Ynl0ZSAqbmFtZSwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1OQU1FRFBBUkFNRVRFUjRGVk5WUFJPQykgKEdMdWludCBpZCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdWJ5dGUgKm5hbWUsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNTkFNRURQQVJBTUVURVI0RFZOVlBST0MpIChHTHVpbnQgaWQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHVieXRlICpuYW1lLCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1OQU1FRFBBUkFNRVRFUkZWTlZQUk9DKSAoR0x1aW50IGlkLCBHTHNpemVpIGxlbiwgY29uc3QgR0x1Ynl0ZSAqbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTU5BTUVEUEFSQU1FVEVSRFZOVlBST0MpIChHTHVpbnQgaWQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHVieXRlICpuYW1lLCBHTGRvdWJsZSAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2hhbGZfZmxvYXQKKyNkZWZpbmUgR0xfTlZfaGFsZl9mbG9hdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleDJoTlYgKEdMaGFsZk5WIHgsIEdMaGFsZk5WIHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleDJodk5WIChjb25zdCBHTGhhbGZOViAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4M2hOViAoR0xoYWxmTlYgeCwgR0xoYWxmTlYgeSwgR0xoYWxmTlYgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4M2h2TlYgKGNvbnN0IEdMaGFsZk5WICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXg0aE5WIChHTGhhbGZOViB4LCBHTGhhbGZOViB5LCBHTGhhbGZOViB6LCBHTGhhbGZOViB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXg0aHZOViAoY29uc3QgR0xoYWxmTlYgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbDNoTlYgKEdMaGFsZk5WIG54LCBHTGhhbGZOViBueSwgR0xoYWxmTlYgbnopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbDNodk5WIChjb25zdCBHTGhhbGZOViAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3IzaE5WIChHTGhhbGZOViByZWQsIEdMaGFsZk5WIGdyZWVuLCBHTGhhbGZOViBibHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjNodk5WIChjb25zdCBHTGhhbGZOViAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0aE5WIChHTGhhbGZOViByZWQsIEdMaGFsZk5WIGdyZWVuLCBHTGhhbGZOViBibHVlLCBHTGhhbGZOViBhbHBoYSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0aHZOViAoY29uc3QgR0xoYWxmTlYgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkMWhOViAoR0xoYWxmTlYgcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQxaHZOViAoY29uc3QgR0xoYWxmTlYgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkMmhOViAoR0xoYWxmTlYgcywgR0xoYWxmTlYgdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyaHZOViAoY29uc3QgR0xoYWxmTlYgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkM2hOViAoR0xoYWxmTlYgcywgR0xoYWxmTlYgdCwgR0xoYWxmTlYgcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQzaHZOViAoY29uc3QgR0xoYWxmTlYgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkNGhOViAoR0xoYWxmTlYgcywgR0xoYWxmTlYgdCwgR0xoYWxmTlYgciwgR0xoYWxmTlYgcSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQ0aHZOViAoY29uc3QgR0xoYWxmTlYgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxaE5WIChHTGVudW0gdGFyZ2V0LCBHTGhhbGZOViBzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWh2TlYgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaGFsZk5WICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmhOViAoR0xlbnVtIHRhcmdldCwgR0xoYWxmTlYgcywgR0xoYWxmTlYgdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJodk5WIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGhhbGZOViAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNoTlYgKEdMZW51bSB0YXJnZXQsIEdMaGFsZk5WIHMsIEdMaGFsZk5WIHQsIEdMaGFsZk5WIHIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzaHZOViAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xoYWxmTlYgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0aE5WIChHTGVudW0gdGFyZ2V0LCBHTGhhbGZOViBzLCBHTGhhbGZOViB0LCBHTGhhbGZOViByLCBHTGhhbGZOViBxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGh2TlYgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaGFsZk5WICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGhOViAoR0xoYWxmTlYgZm9nKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGh2TlYgKGNvbnN0IEdMaGFsZk5WICpmb2cpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2hOViAoR0xoYWxmTlYgcmVkLCBHTGhhbGZOViBncmVlbiwgR0xoYWxmTlYgYmx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzaHZOViAoY29uc3QgR0xoYWxmTlYgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFdlaWdodGhOViAoR0xoYWxmTlYgd2VpZ2h0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhXZWlnaHRodk5WIChjb25zdCBHTGhhbGZOViAqd2VpZ2h0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxaE5WIChHTHVpbnQgaW5kZXgsIEdMaGFsZk5WIHgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFodk5WIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaGFsZk5WICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyaE5WIChHTHVpbnQgaW5kZXgsIEdMaGFsZk5WIHgsIEdMaGFsZk5WIHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJodk5WIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaGFsZk5WICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzaE5WIChHTHVpbnQgaW5kZXgsIEdMaGFsZk5WIHgsIEdMaGFsZk5WIHksIEdMaGFsZk5WIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNodk5WIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaGFsZk5WICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0aE5WIChHTHVpbnQgaW5kZXgsIEdMaGFsZk5WIHgsIEdMaGFsZk5WIHksIEdMaGFsZk5WIHosIEdMaGFsZk5WIHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRodk5WIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaGFsZk5WICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzMWh2TlYgKEdMdWludCBpbmRleCwgR0xzaXplaSBuLCBjb25zdCBHTGhhbGZOViAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczJodk5WIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgbiwgY29uc3QgR0xoYWxmTlYgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnMzaHZOViAoR0x1aW50IGluZGV4LCBHTHNpemVpIG4sIGNvbnN0IEdMaGFsZk5WICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzNGh2TlYgKEdMdWludCBpbmRleCwgR0xzaXplaSBuLCBjb25zdCBHTGhhbGZOViAqdik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVgySE5WUFJPQykgKEdMaGFsZk5WIHgsIEdMaGFsZk5WIHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVgySFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWDNITlZQUk9DKSAoR0xoYWxmTlYgeCwgR0xoYWxmTlYgeSwgR0xoYWxmTlYgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWDNIVk5WUFJPQykgKGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYNEhOVlBST0MpIChHTGhhbGZOViB4LCBHTGhhbGZOViB5LCBHTGhhbGZOViB6LCBHTGhhbGZOViB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYNEhWTlZQUk9DKSAoY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUwzSE5WUFJPQykgKEdMaGFsZk5WIG54LCBHTGhhbGZOViBueSwgR0xoYWxmTlYgbnopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUwzSFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SM0hOVlBST0MpIChHTGhhbGZOViByZWQsIEdMaGFsZk5WIGdyZWVuLCBHTGhhbGZOViBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1IzSFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SNEhOVlBST0MpIChHTGhhbGZOViByZWQsIEdMaGFsZk5WIGdyZWVuLCBHTGhhbGZOViBibHVlLCBHTGhhbGZOViBhbHBoYSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SNEhWTlZQUk9DKSAoY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDFITlZQUk9DKSAoR0xoYWxmTlYgcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMUhWTlZQUk9DKSAoY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDJITlZQUk9DKSAoR0xoYWxmTlYgcywgR0xoYWxmTlYgdCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkhWTlZQUk9DKSAoY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDNITlZQUk9DKSAoR0xoYWxmTlYgcywgR0xoYWxmTlYgdCwgR0xoYWxmTlYgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEM0hWTlZQUk9DKSAoY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDRITlZQUk9DKSAoR0xoYWxmTlYgcywgR0xoYWxmTlYgdCwgR0xoYWxmTlYgciwgR0xoYWxmTlYgcSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JENEhWTlZQUk9DKSAoY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUhOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGhhbGZOViBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFIVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJITlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xoYWxmTlYgcywgR0xoYWxmTlYgdCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQySFZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzSE5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaGFsZk5WIHMsIEdMaGFsZk5WIHQsIEdMaGFsZk5WIHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0hWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENEhOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGhhbGZOViBzLCBHTGhhbGZOViB0LCBHTGhhbGZOViByLCBHTGhhbGZOViBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRIVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRITlZQUk9DKSAoR0xoYWxmTlYgZm9nKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRIVk5WUFJPQykgKGNvbnN0IEdMaGFsZk5WICpmb2cpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNITlZQUk9DKSAoR0xoYWxmTlYgcmVkLCBHTGhhbGZOViBncmVlbiwgR0xoYWxmTlYgYmx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM0hWTlZQUk9DKSAoY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhXRUlHSFRITlZQUk9DKSAoR0xoYWxmTlYgd2VpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYV0VJR0hUSFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqd2VpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMUhOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMaGFsZk5WIHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxSFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMkhOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMaGFsZk5WIHgsIEdMaGFsZk5WIHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIySFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM0hOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMaGFsZk5WIHgsIEdMaGFsZk5WIHksIEdMaGFsZk5WIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzSFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNEhOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMaGFsZk5WIHgsIEdMaGFsZk5WIHksIEdMaGFsZk5WIHosIEdMaGFsZk5WIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0SFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzFIVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBuLCBjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlMySFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgbiwgY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTM0hWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIG4sIGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzRIVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBuLCBjb25zdCBHTGhhbGZOViAqdik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9waXhlbF9kYXRhX3JhbmdlCisjZGVmaW5lIEdMX05WX3BpeGVsX2RhdGFfcmFuZ2UgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQaXhlbERhdGFSYW5nZU5WIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxlbmd0aCwgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGbHVzaFBpeGVsRGF0YVJhbmdlTlYgKEdMZW51bSB0YXJnZXQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUElYRUxEQVRBUkFOR0VOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxlbmd0aCwgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRkxVU0hQSVhFTERBVEFSQU5HRU5WUFJPQykgKEdMZW51bSB0YXJnZXQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfcHJpbWl0aXZlX3Jlc3RhcnQKKyNkZWZpbmUgR0xfTlZfcHJpbWl0aXZlX3Jlc3RhcnQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcmltaXRpdmVSZXN0YXJ0TlYgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByaW1pdGl2ZVJlc3RhcnRJbmRleE5WIChHTHVpbnQgaW5kZXgpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJJTUlUSVZFUkVTVEFSVE5WUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUklNSVRJVkVSRVNUQVJUSU5ERVhOVlBST0MpIChHTHVpbnQgaW5kZXgpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4dHVyZV9leHBhbmRfbm9ybWFsCisjZGVmaW5lIEdMX05WX3RleHR1cmVfZXhwYW5kX25vcm1hbCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbTIKKyNkZWZpbmUgR0xfTlZfdmVydGV4X3Byb2dyYW0yIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV9tYXBfb2JqZWN0X2J1ZmZlcgorI2RlZmluZSBHTF9BVElfbWFwX29iamVjdF9idWZmZXIgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIEdMdm9pZCogQVBJRU5UUlkgZ2xNYXBPYmplY3RCdWZmZXJBVEkgKEdMdWludCBidWZmZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVubWFwT2JqZWN0QnVmZmVyQVRJIChHTHVpbnQgYnVmZmVyKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMdm9pZCogKEFQSUVOVFJZUCBQRk5HTE1BUE9CSkVDVEJVRkZFUkFUSVBST0MpIChHTHVpbnQgYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5NQVBPQkpFQ1RCVUZGRVJBVElQUk9DKSAoR0x1aW50IGJ1ZmZlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfc2VwYXJhdGVfc3RlbmNpbAorI2RlZmluZSBHTF9BVElfc2VwYXJhdGVfc3RlbmNpbCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0ZW5jaWxPcFNlcGFyYXRlQVRJIChHTGVudW0gZmFjZSwgR0xlbnVtIHNmYWlsLCBHTGVudW0gZHBmYWlsLCBHTGVudW0gZHBwYXNzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdGVuY2lsRnVuY1NlcGFyYXRlQVRJIChHTGVudW0gZnJvbnRmdW5jLCBHTGVudW0gYmFja2Z1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1RFTkNJTE9QU0VQQVJBVEVBVElQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBzZmFpbCwgR0xlbnVtIGRwZmFpbCwgR0xlbnVtIGRwcGFzcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNURU5DSUxGVU5DU0VQQVJBVEVBVElQUk9DKSAoR0xlbnVtIGZyb250ZnVuYywgR0xlbnVtIGJhY2tmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV92ZXJ0ZXhfYXR0cmliX2FycmF5X29iamVjdAorI2RlZmluZSBHTF9BVElfdmVydGV4X2F0dHJpYl9hcnJheV9vYmplY3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJBcnJheU9iamVjdEFUSSAoR0x1aW50IGluZGV4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCBHTHVpbnQgYnVmZmVyLCBHTHVpbnQgb2Zmc2V0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJBcnJheU9iamVjdGZ2QVRJIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJBcnJheU9iamVjdGl2QVRJIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJBUlJBWU9CSkVDVEFUSVBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIEdMdWludCBidWZmZXIsIEdMdWludCBvZmZzZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJBUlJBWU9CSkVDVEZWQVRJUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJBUlJBWU9CSkVDVElWQVRJUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX09FU19yZWFkX2Zvcm1hdAorI2RlZmluZSBHTF9PRVNfcmVhZF9mb3JtYXQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2RlcHRoX2JvdW5kc190ZXN0CisjZGVmaW5lIEdMX0VYVF9kZXB0aF9ib3VuZHNfdGVzdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlcHRoQm91bmRzRVhUIChHTGNsYW1wZCB6bWluLCBHTGNsYW1wZCB6bWF4KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFUFRIQk9VTkRTRVhUUFJPQykgKEdMY2xhbXBkIHptaW4sIEdMY2xhbXBkIHptYXgpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfbWlycm9yX2NsYW1wCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX21pcnJvcl9jbGFtcCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUKKyNkZWZpbmUgR0xfRVhUX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlRVhUIChHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREVRVUFUSU9OU0VQQVJBVEVFWFRQUk9DKSAoR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTUVTQV9wYWNrX2ludmVydAorI2RlZmluZSBHTF9NRVNBX3BhY2tfaW52ZXJ0IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX01FU0FfeWNiY3JfdGV4dHVyZQorI2RlZmluZSBHTF9NRVNBX3ljYmNyX3RleHR1cmUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3BpeGVsX2J1ZmZlcl9vYmplY3QKKyNkZWZpbmUgR0xfRVhUX3BpeGVsX2J1ZmZlcl9vYmplY3QgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbV9vcHRpb24KKyNkZWZpbmUgR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbV9vcHRpb24gMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbTIKKyNkZWZpbmUgR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbTIgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0yX29wdGlvbgorI2RlZmluZSBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbTJfb3B0aW9uIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9wcm9ncmFtMworI2RlZmluZSBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbTMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2ZyYW1lYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9FWFRfZnJhbWVidWZmZXJfb2JqZWN0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc1JlbmRlcmJ1ZmZlckVYVCAoR0x1aW50IHJlbmRlcmJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZFJlbmRlcmJ1ZmZlckVYVCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlUmVuZGVyYnVmZmVyc0VYVCAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlblJlbmRlcmJ1ZmZlcnNFWFQgKEdMc2l6ZWkgbiwgR0x1aW50ICpyZW5kZXJidWZmZXJzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZW5kZXJidWZmZXJTdG9yYWdlRVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdkVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzRnJhbWVidWZmZXJFWFQgKEdMdWludCBmcmFtZWJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEZyYW1lYnVmZmVyRVhUIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZUZyYW1lYnVmZmVyc0VYVCAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmZyYW1lYnVmZmVycyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuRnJhbWVidWZmZXJzRVhUIChHTHNpemVpIG4sIEdMdWludCAqZnJhbWVidWZmZXJzKTsKK0dMQVBJIEdMZW51bSBBUElFTlRSWSBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNFWFQgKEdMZW51bSB0YXJnZXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZTFERVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyREVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVidWZmZXJUZXh0dXJlM0RFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IHpvZmZzZXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlbmVyYXRlTWlwbWFwRVhUIChHTGVudW0gdGFyZ2V0KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNSRU5ERVJCVUZGRVJFWFRQUk9DKSAoR0x1aW50IHJlbmRlcmJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRSRU5ERVJCVUZGRVJFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVJFTkRFUkJVRkZFUlNFWFRQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5SRU5ERVJCVUZGRVJTRVhUUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpyZW5kZXJidWZmZXJzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVOREVSQlVGRkVSU1RPUkFHRUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUkVOREVSQlVGRkVSUEFSQU1FVEVSSVZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU0ZSQU1FQlVGRkVSRVhUUFJPQykgKEdMdWludCBmcmFtZWJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRGUkFNRUJVRkZFUkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVGUkFNRUJVRkZFUlNFWFRQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmZyYW1lYnVmZmVycyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTkZSQU1FQlVGRkVSU0VYVFBST0MpIChHTHNpemVpIG4sIEdMdWludCAqZnJhbWVidWZmZXJzKTsKK3R5cGVkZWYgR0xlbnVtIChBUElFTlRSWVAgUEZOR0xDSEVDS0ZSQU1FQlVGRkVSU1RBVFVTRVhUUFJPQykgKEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkUxREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJURVhUVVJFMkRFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRTNERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IHpvZmZzZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlJFTkRFUkJVRkZFUkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZSQU1FQlVGRkVSQVRUQUNITUVOVFBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5FUkFURU1JUE1BUEVYVFBST0MpIChHTGVudW0gdGFyZ2V0KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0dSRU1FRFlfc3RyaW5nX21hcmtlcgorI2RlZmluZSBHTF9HUkVNRURZX3N0cmluZ19tYXJrZXIgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdHJpbmdNYXJrZXJHUkVNRURZIChHTHNpemVpIGxlbiwgY29uc3QgR0x2b2lkICpzdHJpbmcpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1RSSU5HTUFSS0VSR1JFTUVEWVBST0MpIChHTHNpemVpIGxlbiwgY29uc3QgR0x2b2lkICpzdHJpbmcpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3BhY2tlZF9kZXB0aF9zdGVuY2lsCisjZGVmaW5lIEdMX0VYVF9wYWNrZWRfZGVwdGhfc3RlbmNpbCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc3RlbmNpbF9jbGVhcl90YWcKKyNkZWZpbmUgR0xfRVhUX3N0ZW5jaWxfY2xlYXJfdGFnIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbENsZWFyVGFnRVhUIChHTHNpemVpIHN0ZW5jaWxUYWdCaXRzLCBHTHVpbnQgc3RlbmNpbENsZWFyVGFnKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNURU5DSUxDTEVBUlRBR0VYVFBST0MpIChHTHNpemVpIHN0ZW5jaWxUYWdCaXRzLCBHTHVpbnQgc3RlbmNpbENsZWFyVGFnKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX3NSR0IKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfc1JHQiAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZnJhbWVidWZmZXJfYmxpdAorI2RlZmluZSBHTF9FWFRfZnJhbWVidWZmZXJfYmxpdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsaXRGcmFtZWJ1ZmZlckVYVCAoR0xpbnQgc3JjWDAsIEdMaW50IHNyY1kwLCBHTGludCBzcmNYMSwgR0xpbnQgc3JjWTEsIEdMaW50IGRzdFgwLCBHTGludCBkc3RZMCwgR0xpbnQgZHN0WDEsIEdMaW50IGRzdFkxLCBHTGJpdGZpZWxkIG1hc2ssIEdMZW51bSBmaWx0ZXIpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkxJVEZSQU1FQlVGRkVSRVhUUFJPQykgKEdMaW50IHNyY1gwLCBHTGludCBzcmNZMCwgR0xpbnQgc3JjWDEsIEdMaW50IHNyY1kxLCBHTGludCBkc3RYMCwgR0xpbnQgZHN0WTAsIEdMaW50IGRzdFgxLCBHTGludCBkc3RZMSwgR0xiaXRmaWVsZCBtYXNrLCBHTGVudW0gZmlsdGVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9FWFRfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRU5ERVJCVUZGRVJTVE9SQUdFTVVMVElTQU1QTEVFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX01FU0FYX3RleHR1cmVfc3RhY2sKKyNkZWZpbmUgR0xfTUVTQVhfdGV4dHVyZV9zdGFjayAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGltZXJfcXVlcnkKKyNkZWZpbmUgR0xfRVhUX3RpbWVyX3F1ZXJ5IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UXVlcnlPYmplY3RpNjR2RVhUIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0xpbnQ2NEVYVCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRRdWVyeU9iamVjdHVpNjR2RVhUIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50NjRFWFQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRRVUVSWU9CSkVDVEk2NFZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50NjRFWFQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFFVRVJZT0JKRUNUVUk2NFZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMdWludDY0RVhUICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2dwdV9wcm9ncmFtX3BhcmFtZXRlcnMKKyNkZWZpbmUgR0xfRVhUX2dwdV9wcm9ncmFtX3BhcmFtZXRlcnMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtRW52UGFyYW1ldGVyczRmdkVYVCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlcnM0ZnZFWFQgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1FTlZQQVJBTUVURVJTNEZWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUxPQ0FMUEFSQU1FVEVSUzRGVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV9mbHVzaF9idWZmZXJfcmFuZ2UKKyNkZWZpbmUgR0xfQVBQTEVfZmx1c2hfYnVmZmVyX3JhbmdlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQnVmZmVyUGFyYW1ldGVyaUFQUExFIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGbHVzaE1hcHBlZEJ1ZmZlclJhbmdlQVBQTEUgKEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJVRkZFUlBBUkFNRVRFUklBUFBMRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRkxVU0hNQVBQRURCVUZGRVJSQU5HRUFQUExFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2dwdV9wcm9ncmFtNAorI2RlZmluZSBHTF9OVl9ncHVfcHJvZ3JhbTQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJNGlOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJNGl2TlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVyc0k0aXZOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJNHVpTlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgeiwgR0x1aW50IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0dWl2TlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlcnNJNHVpdk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtRW52UGFyYW1ldGVySTRpTlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUVudlBhcmFtZXRlckk0aXZOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtRW52UGFyYW1ldGVyc0k0aXZOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtRW52UGFyYW1ldGVySTR1aU5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHosIEdMdWludCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtRW52UGFyYW1ldGVySTR1aXZOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUVudlBhcmFtZXRlcnNJNHVpdk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJaXZOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJdWl2TlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1FbnZQYXJhbWV0ZXJJaXZOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtRW52UGFyYW1ldGVySXVpdk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1MT0NBTFBBUkFNRVRFUkk0SU5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1MT0NBTFBBUkFNRVRFUkk0SVZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNTE9DQUxQQVJBTUVURVJTSTRJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1MT0NBTFBBUkFNRVRFUkk0VUlOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHosIEdMdWludCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUxPQ0FMUEFSQU1FVEVSSTRVSVZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUxPQ0FMUEFSQU1FVEVSU0k0VUlWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1FTlZQQVJBTUVURVJJNElOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNRU5WUEFSQU1FVEVSSTRJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1FTlZQQVJBTUVURVJTSTRJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1FTlZQQVJBTUVURVJJNFVJTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB6LCBHTHVpbnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1FTlZQQVJBTUVURVJJNFVJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNRU5WUEFSQU1FVEVSU0k0VUlWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1MT0NBTFBBUkFNRVRFUklJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1MT0NBTFBBUkFNRVRFUklVSVZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUVOVlBBUkFNRVRFUklJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1FTlZQQVJBTUVURVJJVUlWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9nZW9tZXRyeV9wcm9ncmFtNAorI2RlZmluZSBHTF9OVl9nZW9tZXRyeV9wcm9ncmFtNCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1WZXJ0ZXhMaW1pdE5WIChHTGVudW0gdGFyZ2V0LCBHTGludCBsaW1pdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVidWZmZXJUZXh0dXJlRVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmVMYXllckVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgbGF5ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZUZhY2VFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMZW51bSBmYWNlKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1WRVJURVhMSU1JVE5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxpbWl0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJURVhUVVJFRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkVMQVlFUkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTGludCBsYXllcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRUZBQ0VFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xlbnVtIGZhY2UpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2dlb21ldHJ5X3NoYWRlcjQKKyNkZWZpbmUgR0xfRVhUX2dlb21ldHJ5X3NoYWRlcjQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtUGFyYW1ldGVyaUVYVCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQgdmFsdWUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVBBUkFNRVRFUklFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQgdmFsdWUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW00CisjZGVmaW5lIEdMX05WX3ZlcnRleF9wcm9ncmFtNCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkkxaUVYVCAoR0x1aW50IGluZGV4LCBHTGludCB4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJMmlFWFQgKEdMdWludCBpbmRleCwgR0xpbnQgeCwgR0xpbnQgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTNpRVhUIChHTHVpbnQgaW5kZXgsIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkk0aUVYVCAoR0x1aW50IGluZGV4LCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJMXVpRVhUIChHTHVpbnQgaW5kZXgsIEdMdWludCB4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJMnVpRVhUIChHTHVpbnQgaW5kZXgsIEdMdWludCB4LCBHTHVpbnQgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTN1aUVYVCAoR0x1aW50IGluZGV4LCBHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJNHVpRVhUIChHTHVpbnQgaW5kZXgsIEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHosIEdMdWludCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJMWl2RVhUIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJMml2RVhUIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJM2l2RVhUIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJNGl2RVhUIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJMXVpdkVYVCAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkkydWl2RVhUIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTN1aXZFWFQgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJNHVpdkVYVCAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkk0YnZFWFQgKEdMdWludCBpbmRleCwgY29uc3QgR0xieXRlICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJNHN2RVhUIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkk0dWJ2RVhUIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWJ5dGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkk0dXN2RVhUIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdXNob3J0ICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJUG9pbnRlckVYVCAoR0x1aW50IGluZGV4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliSWl2RVhUIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliSXVpdkVYVCAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdWludCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkxSUVYVFBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50IHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJMklFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBHTGludCB4LCBHTGludCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTNJRVhUUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkk0SUVYVFBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJMVVJRVhUUFJPQykgKEdMdWludCBpbmRleCwgR0x1aW50IHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJMlVJRVhUUFJPQykgKEdMdWludCBpbmRleCwgR0x1aW50IHgsIEdMdWludCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTNVSUVYVFBST0MpIChHTHVpbnQgaW5kZXgsIEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJNFVJRVhUUFJPQykgKEdMdWludCBpbmRleCwgR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgeiwgR0x1aW50IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJMUlWRVhUUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJMklWRVhUUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJM0lWRVhUUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJNElWRVhUUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJMVVJVkVYVFBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkyVUlWRVhUUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTNVSVZFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJNFVJVkVYVFBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkk0QlZFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJNFNWRVhUUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkk0VUJWRVhUUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkk0VVNWRVhUUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1c2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJUE9JTlRFUkVYVFBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCSUlWRVhUUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCSVVJVkVYVFBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2dwdV9zaGFkZXI0CisjZGVmaW5lIEdMX0VYVF9ncHVfc2hhZGVyNCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFVuaWZvcm11aXZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRGcmFnRGF0YUxvY2F0aW9uRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGNvbG9yLCBjb25zdCBHTGNoYXIgKm5hbWUpOworR0xBUEkgR0xpbnQgQVBJRU5UUlkgZ2xHZXRGcmFnRGF0YUxvY2F0aW9uRVhUIChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyICpuYW1lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMXVpRVhUIChHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMnVpRVhUIChHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwLCBHTHVpbnQgdjEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0zdWlFWFQgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSwgR0x1aW50IHYyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNHVpRVhUIChHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwLCBHTHVpbnQgdjEsIEdMdWludCB2MiwgR0x1aW50IHYzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMXVpdkVYVCAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0ydWl2RVhUIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTN1aXZFWFQgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNHVpdkVYVCAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVU5JRk9STVVJVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREZSQUdEQVRBTE9DQVRJT05FWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMdWludCBjb2xvciwgY29uc3QgR0xjaGFyICpuYW1lKTsKK3R5cGVkZWYgR0xpbnQgKEFQSUVOVFJZUCBQRk5HTEdFVEZSQUdEQVRBTE9DQVRJT05FWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0xVUlFWFRQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0yVUlFWFRQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNVSUVYVFBST0MpIChHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwLCBHTHVpbnQgdjEsIEdMdWludCB2Mik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk00VUlFWFRQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxLCBHTHVpbnQgdjIsIEdMdWludCB2Myk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0xVUlWRVhUUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJVSVZFWFRQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM1VJVkVYVFBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk00VUlWRVhUUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9kcmF3X2luc3RhbmNlZAorI2RlZmluZSBHTF9FWFRfZHJhd19pbnN0YW5jZWQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3QXJyYXlzSW5zdGFuY2VkRVhUIChHTGVudW0gbW9kZSwgR0xpbnQgc3RhcnQsIEdMc2l6ZWkgY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3RWxlbWVudHNJbnN0YW5jZWRFWFQgKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXQVJSQVlTSU5TVEFOQ0VERVhUUFJPQykgKEdMZW51bSBtb2RlLCBHTGludCBzdGFydCwgR0xzaXplaSBjb3VudCwgR0xzaXplaSBwcmltY291bnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXRUxFTUVOVFNJTlNUQU5DRURFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9wYWNrZWRfZmxvYXQKKyNkZWZpbmUgR0xfRVhUX3BhY2tlZF9mbG9hdCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9hcnJheQorI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9hcnJheSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9idWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2J1ZmZlcl9vYmplY3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhCdWZmZXJFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0x1aW50IGJ1ZmZlcik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhCVUZGRVJFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHVpbnQgYnVmZmVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX2xhdGMKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fbGF0YyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9yZ3RjCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX3JndGMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfc2hhcmVkX2V4cG9uZW50CisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX3NoYXJlZF9leHBvbmVudCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9kZXB0aF9idWZmZXJfZmxvYXQKKyNkZWZpbmUgR0xfTlZfZGVwdGhfYnVmZmVyX2Zsb2F0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVwdGhSYW5nZWROViAoR0xkb3VibGUgek5lYXIsIEdMZG91YmxlIHpGYXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyRGVwdGhkTlYgKEdMZG91YmxlIGRlcHRoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXB0aEJvdW5kc2ROViAoR0xkb3VibGUgem1pbiwgR0xkb3VibGUgem1heCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERVBUSFJBTkdFRE5WUFJPQykgKEdMZG91YmxlIHpOZWFyLCBHTGRvdWJsZSB6RmFyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ0xFQVJERVBUSEROVlBST0MpIChHTGRvdWJsZSBkZXB0aCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFUFRIQk9VTkRTRE5WUFJPQykgKEdMZG91YmxlIHptaW4sIEdMZG91YmxlIHptYXgpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbTQKKyNkZWZpbmUgR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbTQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGVfY292ZXJhZ2UKKyNkZWZpbmUgR0xfTlZfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGVfY292ZXJhZ2UgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVDb3ZlcmFnZU5WIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGNvdmVyYWdlU2FtcGxlcywgR0xzaXplaSBjb2xvclNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVOREVSQlVGRkVSU1RPUkFHRU1VTFRJU0FNUExFQ09WRVJBR0VOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGNvdmVyYWdlU2FtcGxlcywgR0xzaXplaSBjb2xvclNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2ZyYW1lYnVmZmVyX3NSR0IKKyNkZWZpbmUgR0xfRVhUX2ZyYW1lYnVmZmVyX3NSR0IgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZ2VvbWV0cnlfc2hhZGVyNAorI2RlZmluZSBHTF9OVl9nZW9tZXRyeV9zaGFkZXI0IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3BhcmFtZXRlcl9idWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX05WX3BhcmFtZXRlcl9idWZmZXJfb2JqZWN0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUJ1ZmZlclBhcmFtZXRlcnNmdk5WIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUJ1ZmZlclBhcmFtZXRlcnNJaXZOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlciwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtQnVmZmVyUGFyYW1ldGVyc0l1aXZOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlciwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNQlVGRkVSUEFSQU1FVEVSU0ZWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlciwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNQlVGRkVSUEFSQU1FVEVSU0lJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIsIEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1CVUZGRVJQQVJBTUVURVJTSVVJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIsIEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2RyYXdfYnVmZmVyczIKKyNkZWZpbmUgR0xfRVhUX2RyYXdfYnVmZmVyczIgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvck1hc2tJbmRleGVkRVhUIChHTHVpbnQgaW5kZXgsIEdMYm9vbGVhbiByLCBHTGJvb2xlYW4gZywgR0xib29sZWFuIGIsIEdMYm9vbGVhbiBhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRCb29sZWFuSW5kZXhlZHZFWFQgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xib29sZWFuICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbnRlZ2VySW5kZXhlZHZFWFQgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xpbnQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuYWJsZUluZGV4ZWRFWFQgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGlzYWJsZUluZGV4ZWRFWFQgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc0VuYWJsZWRJbmRleGVkRVhUIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JNQVNLSU5ERVhFREVYVFBST0MpIChHTHVpbnQgaW5kZXgsIEdMYm9vbGVhbiByLCBHTGJvb2xlYW4gZywgR0xib29sZWFuIGIsIEdMYm9vbGVhbiBhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQk9PTEVBTklOREVYRURWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xib29sZWFuICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSU5URUdFUklOREVYRURWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xpbnQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkFCTEVJTkRFWEVERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERJU0FCTEVJTkRFWEVERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNFTkFCTEVESU5ERVhFREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdHJhbnNmb3JtX2ZlZWRiYWNrCisjZGVmaW5lIEdMX05WX3RyYW5zZm9ybV9mZWVkYmFjayAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJlZ2luVHJhbnNmb3JtRmVlZGJhY2tOViAoR0xlbnVtIHByaW1pdGl2ZU1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuZFRyYW5zZm9ybUZlZWRiYWNrTlYgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRyYW5zZm9ybUZlZWRiYWNrQXR0cmlic05WIChHTHVpbnQgY291bnQsIGNvbnN0IEdMaW50ICphdHRyaWJzLCBHTGVudW0gYnVmZmVyTW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEJ1ZmZlclJhbmdlTlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IGJ1ZmZlciwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRCdWZmZXJPZmZzZXROViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgYnVmZmVyLCBHTGludHB0ciBvZmZzZXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRCdWZmZXJCYXNlTlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IGJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5nc05WIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKmxvY2F0aW9ucywgR0xlbnVtIGJ1ZmZlck1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFjdGl2ZVZhcnlpbmdOViAoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciAqbmFtZSk7CitHTEFQSSBHTGludCBBUElFTlRSWSBnbEdldFZhcnlpbmdMb2NhdGlvbk5WIChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyICpuYW1lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRBY3RpdmVWYXJ5aW5nTlYgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTHNpemVpICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhciAqbmFtZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5nTlYgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMaW50ICpsb2NhdGlvbik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVHJhbnNmb3JtRmVlZGJhY2tTdHJlYW1BdHRyaWJzTlYgKEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICphdHRyaWJzLCBHTHNpemVpIG5idWZmZXJzLCBjb25zdCBHTGludCAqYnVmc3RyZWFtcywgR0xlbnVtIGJ1ZmZlck1vZGUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkVHSU5UUkFOU0ZPUk1GRUVEQkFDS05WUFJPQykgKEdMZW51bSBwcmltaXRpdmVNb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5EVFJBTlNGT1JNRkVFREJBQ0tOVlBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVFJBTlNGT1JNRkVFREJBQ0tBVFRSSUJTTlZQUk9DKSAoR0x1aW50IGNvdW50LCBjb25zdCBHTGludCAqYXR0cmlicywgR0xlbnVtIGJ1ZmZlck1vZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EQlVGRkVSUkFOR0VOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCBidWZmZXIsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREJVRkZFUk9GRlNFVE5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IGJ1ZmZlciwgR0xpbnRwdHIgb2Zmc2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREJVRkZFUkJBU0VOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCBidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUUkFOU0ZPUk1GRUVEQkFDS1ZBUllJTkdTTlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICpsb2NhdGlvbnMsIEdMZW51bSBidWZmZXJNb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQUNUSVZFVkFSWUlOR05WUFJPQykgKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiBHTGludCAoQVBJRU5UUllQIFBGTkdMR0VUVkFSWUlOR0xPQ0FUSU9OTlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFDVElWRVZBUllJTkdOVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xzaXplaSAqc2l6ZSwgR0xlbnVtICp0eXBlLCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRUUkFOU0ZPUk1GRUVEQkFDS1ZBUllJTkdOVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTGludCAqbG9jYXRpb24pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUUkFOU0ZPUk1GRUVEQkFDS1NUUkVBTUFUVFJJQlNOVlBST0MpIChHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqYXR0cmlicywgR0xzaXplaSBuYnVmZmVycywgY29uc3QgR0xpbnQgKmJ1ZnN0cmVhbXMsIEdMZW51bSBidWZmZXJNb2RlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9iaW5kYWJsZV91bmlmb3JtCisjZGVmaW5lIEdMX0VYVF9iaW5kYWJsZV91bmlmb3JtIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybUJ1ZmZlckVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgYnVmZmVyKTsKK0dMQVBJIEdMaW50IEFQSUVOVFJZIGdsR2V0VW5pZm9ybUJ1ZmZlclNpemVFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbik7CitHTEFQSSBHTGludHB0ciBBUElFTlRSWSBnbEdldFVuaWZvcm1PZmZzZXRFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNQlVGRkVSRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50IGJ1ZmZlcik7Cit0eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNQlVGRkVSU0laRUVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24pOwordHlwZWRlZiBHTGludHB0ciAoQVBJRU5UUllQIFBGTkdMR0VUVU5JRk9STU9GRlNFVEVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24pOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfaW50ZWdlcgorI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9pbnRlZ2VyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4UGFyYW1ldGVySWl2RVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFBhcmFtZXRlckl1aXZFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0x1aW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFRleFBhcmFtZXRlcklpdkVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUZXhQYXJhbWV0ZXJJdWl2RVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdWludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckNvbG9ySWlFWFQgKEdMaW50IHJlZCwgR0xpbnQgZ3JlZW4sIEdMaW50IGJsdWUsIEdMaW50IGFscGhhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckNvbG9ySXVpRVhUIChHTHVpbnQgcmVkLCBHTHVpbnQgZ3JlZW4sIEdMdWludCBibHVlLCBHTHVpbnQgYWxwaGEpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYUEFSQU1FVEVSSUlWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFBBUkFNRVRFUklVSVZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTHVpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFRFWFBBUkFNRVRFUklJVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRURVhQQVJBTUVURVJJVUlWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDTEVBUkNPTE9SSUlFWFRQUk9DKSAoR0xpbnQgcmVkLCBHTGludCBncmVlbiwgR0xpbnQgYmx1ZSwgR0xpbnQgYWxwaGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDTEVBUkNPTE9SSVVJRVhUUFJPQykgKEdMdWludCByZWQsIEdMdWludCBncmVlbiwgR0x1aW50IGJsdWUsIEdMdWludCBhbHBoYSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9HUkVNRURZX2ZyYW1lX3Rlcm1pbmF0b3IKKyNkZWZpbmUgR0xfR1JFTUVEWV9mcmFtZV90ZXJtaW5hdG9yIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVUZXJtaW5hdG9yR1JFTUVEWSAodm9pZCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRVRFUk1JTkFUT1JHUkVNRURZUFJPQykgKHZvaWQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfY29uZGl0aW9uYWxfcmVuZGVyCisjZGVmaW5lIEdMX05WX2NvbmRpdGlvbmFsX3JlbmRlciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJlZ2luQ29uZGl0aW9uYWxSZW5kZXJOViAoR0x1aW50IGlkLCBHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5kQ29uZGl0aW9uYWxSZW5kZXJOViAodm9pZCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCRUdJTkNPTkRJVElPTkFMUkVOREVSTlZQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gbW9kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVORENPTkRJVElPTkFMUkVOREVSTlZQUk9DKSAodm9pZCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9wcmVzZW50X3ZpZGVvCisjZGVmaW5lIEdMX05WX3ByZXNlbnRfdmlkZW8gMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcmVzZW50RnJhbWVLZXllZE5WIChHTHVpbnQgdmlkZW9fc2xvdCwgR0x1aW50NjRFWFQgbWluUHJlc2VudFRpbWUsIEdMdWludCBiZWdpblByZXNlbnRUaW1lSWQsIEdMdWludCBwcmVzZW50RHVyYXRpb25JZCwgR0xlbnVtIHR5cGUsIEdMZW51bSB0YXJnZXQwLCBHTHVpbnQgZmlsbDAsIEdMdWludCBrZXkwLCBHTGVudW0gdGFyZ2V0MSwgR0x1aW50IGZpbGwxLCBHTHVpbnQga2V5MSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJlc2VudEZyYW1lRHVhbEZpbGxOViAoR0x1aW50IHZpZGVvX3Nsb3QsIEdMdWludDY0RVhUIG1pblByZXNlbnRUaW1lLCBHTHVpbnQgYmVnaW5QcmVzZW50VGltZUlkLCBHTHVpbnQgcHJlc2VudER1cmF0aW9uSWQsIEdMZW51bSB0eXBlLCBHTGVudW0gdGFyZ2V0MCwgR0x1aW50IGZpbGwwLCBHTGVudW0gdGFyZ2V0MSwgR0x1aW50IGZpbGwxLCBHTGVudW0gdGFyZ2V0MiwgR0x1aW50IGZpbGwyLCBHTGVudW0gdGFyZ2V0MywgR0x1aW50IGZpbGwzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWaWRlb2l2TlYgKEdMdWludCB2aWRlb19zbG90LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZpZGVvdWl2TlYgKEdMdWludCB2aWRlb19zbG90LCBHTGVudW0gcG5hbWUsIEdMdWludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWaWRlb2k2NHZOViAoR0x1aW50IHZpZGVvX3Nsb3QsIEdMZW51bSBwbmFtZSwgR0xpbnQ2NEVYVCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWaWRlb3VpNjR2TlYgKEdMdWludCB2aWRlb19zbG90LCBHTGVudW0gcG5hbWUsIEdMdWludDY0RVhUICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJFU0VOVEZSQU1FS0VZRUROVlBST0MpIChHTHVpbnQgdmlkZW9fc2xvdCwgR0x1aW50NjRFWFQgbWluUHJlc2VudFRpbWUsIEdMdWludCBiZWdpblByZXNlbnRUaW1lSWQsIEdMdWludCBwcmVzZW50RHVyYXRpb25JZCwgR0xlbnVtIHR5cGUsIEdMZW51bSB0YXJnZXQwLCBHTHVpbnQgZmlsbDAsIEdMdWludCBrZXkwLCBHTGVudW0gdGFyZ2V0MSwgR0x1aW50IGZpbGwxLCBHTHVpbnQga2V5MSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBSRVNFTlRGUkFNRURVQUxGSUxMTlZQUk9DKSAoR0x1aW50IHZpZGVvX3Nsb3QsIEdMdWludDY0RVhUIG1pblByZXNlbnRUaW1lLCBHTHVpbnQgYmVnaW5QcmVzZW50VGltZUlkLCBHTHVpbnQgcHJlc2VudER1cmF0aW9uSWQsIEdMZW51bSB0eXBlLCBHTGVudW0gdGFyZ2V0MCwgR0x1aW50IGZpbGwwLCBHTGVudW0gdGFyZ2V0MSwgR0x1aW50IGZpbGwxLCBHTGVudW0gdGFyZ2V0MiwgR0x1aW50IGZpbGwyLCBHTGVudW0gdGFyZ2V0MywgR0x1aW50IGZpbGwzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVklERU9JVk5WUFJPQykgKEdMdWludCB2aWRlb19zbG90LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWSURFT1VJVk5WUFJPQykgKEdMdWludCB2aWRlb19zbG90LCBHTGVudW0gcG5hbWUsIEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVklERU9JNjRWTlZQUk9DKSAoR0x1aW50IHZpZGVvX3Nsb3QsIEdMZW51bSBwbmFtZSwgR0xpbnQ2NEVYVCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVklERU9VSTY0Vk5WUFJPQykgKEdMdWludCB2aWRlb19zbG90LCBHTGVudW0gcG5hbWUsIEdMdWludDY0RVhUICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RyYW5zZm9ybV9mZWVkYmFjaworI2RlZmluZSBHTF9FWFRfdHJhbnNmb3JtX2ZlZWRiYWNrIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmVnaW5UcmFuc2Zvcm1GZWVkYmFja0VYVCAoR0xlbnVtIHByaW1pdGl2ZU1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuZFRyYW5zZm9ybUZlZWRiYWNrRVhUICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kQnVmZmVyUmFuZ2VFWFQgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IGJ1ZmZlciwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRCdWZmZXJPZmZzZXRFWFQgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IGJ1ZmZlciwgR0xpbnRwdHIgb2Zmc2V0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kQnVmZmVyQmFzZUVYVCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgYnVmZmVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdzRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyKiAqdmFyeWluZ3MsIEdMZW51bSBidWZmZXJNb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdFWFQgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTHNpemVpICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhciAqbmFtZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCRUdJTlRSQU5TRk9STUZFRURCQUNLRVhUUFJPQykgKEdMZW51bSBwcmltaXRpdmVNb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5EVFJBTlNGT1JNRkVFREJBQ0tFWFRQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRCVUZGRVJSQU5HRUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCBidWZmZXIsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREJVRkZFUk9GRlNFVEVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCBidWZmZXIsIEdMaW50cHRyIG9mZnNldCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRCVUZGRVJCQVNFRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IGJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRSQU5TRk9STUZFRURCQUNLVkFSWUlOR1NFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhciogKnZhcnlpbmdzLCBHTGVudW0gYnVmZmVyTW9kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFRSQU5TRk9STUZFRURCQUNLVkFSWUlOR0VYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xzaXplaSAqc2l6ZSwgR0xlbnVtICp0eXBlLCBHTGNoYXIgKm5hbWUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2RpcmVjdF9zdGF0ZV9hY2Nlc3MKKyNkZWZpbmUgR0xfRVhUX2RpcmVjdF9zdGF0ZV9hY2Nlc3MgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGllbnRBdHRyaWJEZWZhdWx0RVhUIChHTGJpdGZpZWxkIG1hc2spOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFB1c2hDbGllbnRBdHRyaWJEZWZhdWx0RVhUIChHTGJpdGZpZWxkIG1hc2spOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeExvYWRmRVhUIChHTGVudW0gbW9kZSwgY29uc3QgR0xmbG9hdCAqbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4TG9hZGRFWFQgKEdMZW51bSBtb2RlLCBjb25zdCBHTGRvdWJsZSAqbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4TXVsdGZFWFQgKEdMZW51bSBtb2RlLCBjb25zdCBHTGZsb2F0ICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhNdWx0ZEVYVCAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMZG91YmxlICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhMb2FkSWRlbnRpdHlFWFQgKEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhSb3RhdGVmRVhUIChHTGVudW0gbW9kZSwgR0xmbG9hdCBhbmdsZSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4Um90YXRlZEVYVCAoR0xlbnVtIG1vZGUsIEdMZG91YmxlIGFuZ2xlLCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhTY2FsZWZFWFQgKEdMZW51bSBtb2RlLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhTY2FsZWRFWFQgKEdMZW51bSBtb2RlLCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhUcmFuc2xhdGVmRVhUIChHTGVudW0gbW9kZSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4VHJhbnNsYXRlZEVYVCAoR0xlbnVtIG1vZGUsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeEZydXN0dW1FWFQgKEdMZW51bSBtb2RlLCBHTGRvdWJsZSBsZWZ0LCBHTGRvdWJsZSByaWdodCwgR0xkb3VibGUgYm90dG9tLCBHTGRvdWJsZSB0b3AsIEdMZG91YmxlIHpOZWFyLCBHTGRvdWJsZSB6RmFyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhPcnRob0VYVCAoR0xlbnVtIG1vZGUsIEdMZG91YmxlIGxlZnQsIEdMZG91YmxlIHJpZ2h0LCBHTGRvdWJsZSBib3R0b20sIEdMZG91YmxlIHRvcCwgR0xkb3VibGUgek5lYXIsIEdMZG91YmxlIHpGYXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeFBvcEVYVCAoR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeFB1c2hFWFQgKEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhMb2FkVHJhbnNwb3NlZkVYVCAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMZmxvYXQgKm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeExvYWRUcmFuc3Bvc2VkRVhUIChHTGVudW0gbW9kZSwgY29uc3QgR0xkb3VibGUgKm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeE11bHRUcmFuc3Bvc2VmRVhUIChHTGVudW0gbW9kZSwgY29uc3QgR0xmbG9hdCAqbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4TXVsdFRyYW5zcG9zZWRFWFQgKEdMZW51bSBtb2RlLCBjb25zdCBHTGRvdWJsZSAqbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZVBhcmFtZXRlcmZFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleHR1cmVQYXJhbWV0ZXJmdkVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXh0dXJlUGFyYW1ldGVyaUVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleHR1cmVQYXJhbWV0ZXJpdkVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZUltYWdlMURFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZUltYWdlMkRFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleHR1cmVTdWJJbWFnZTFERVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZVN1YkltYWdlMkRFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleHR1cmVJbWFnZTFERVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4dHVyZUltYWdlMkRFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4dHVyZVN1YkltYWdlMURFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleHR1cmVTdWJJbWFnZTJERVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUZXh0dXJlSW1hZ2VFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUZXh0dXJlUGFyYW1ldGVyZnZFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VGV4dHVyZVBhcmFtZXRlcml2RVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUZXh0dXJlTGV2ZWxQYXJhbWV0ZXJmdkVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VGV4dHVyZUxldmVsUGFyYW1ldGVyaXZFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXh0dXJlSW1hZ2UzREVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZVN1YkltYWdlM0RFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleHR1cmVTdWJJbWFnZTNERVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleFBhcmFtZXRlcmZFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4UGFyYW1ldGVyZnZFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhQYXJhbWV0ZXJpRVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhQYXJhbWV0ZXJpdkVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhJbWFnZTFERVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4SW1hZ2UyREVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhTdWJJbWFnZTFERVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhTdWJJbWFnZTJERVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlNdWx0aVRleEltYWdlMURFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTGludCBib3JkZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlNdWx0aVRleEltYWdlMkRFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5TXVsdGlUZXhTdWJJbWFnZTFERVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlNdWx0aVRleFN1YkltYWdlMkRFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE11bHRpVGV4SW1hZ2VFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNdWx0aVRleFBhcmFtZXRlcmZ2RVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE11bHRpVGV4UGFyYW1ldGVyaXZFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE11bHRpVGV4TGV2ZWxQYXJhbWV0ZXJmdkVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TXVsdGlUZXhMZXZlbFBhcmFtZXRlcml2RVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhJbWFnZTNERVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleFN1YkltYWdlM0RFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weU11bHRpVGV4U3ViSW1hZ2UzREVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZE11bHRpVGV4dHVyZUVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmFibGVDbGllbnRTdGF0ZUluZGV4ZWRFWFQgKEdMZW51bSBhcnJheSwgR0x1aW50IGluZGV4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEaXNhYmxlQ2xpZW50U3RhdGVJbmRleGVkRVhUIChHTGVudW0gYXJyYXksIEdMdWludCBpbmRleCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZFBvaW50ZXJFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhFbnZmRVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleEVudmZ2RVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4RW52aUVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4RW52aXZFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4R2VuZEVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhHZW5kdkVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGRvdWJsZSAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleEdlbmZFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhHZW5mdkVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4R2VuaUVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhHZW5pdkVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNdWx0aVRleEVudmZ2RVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE11bHRpVGV4RW52aXZFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE11bHRpVGV4R2VuZHZFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xkb3VibGUgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TXVsdGlUZXhHZW5mdkVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE11bHRpVGV4R2VuaXZFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0RmxvYXRJbmRleGVkdkVYVCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGZsb2F0ICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXREb3VibGVJbmRleGVkdkVYVCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGRvdWJsZSAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UG9pbnRlckluZGV4ZWR2RVhUIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdm9pZCogKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXh0dXJlSW1hZ2UzREVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmJpdHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXh0dXJlSW1hZ2UyREVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmJpdHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXh0dXJlSW1hZ2UxREVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqYml0cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleHR1cmVTdWJJbWFnZTNERVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpiaXRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4dHVyZVN1YkltYWdlMkRFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmJpdHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXh0dXJlU3ViSW1hZ2UxREVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpiaXRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb21wcmVzc2VkVGV4dHVyZUltYWdlRVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbG9kLCBHTHZvaWQgKmltZyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZE11bHRpVGV4SW1hZ2UzREVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmJpdHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRNdWx0aVRleEltYWdlMkRFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpiaXRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkTXVsdGlUZXhJbWFnZTFERVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpiaXRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkTXVsdGlUZXhTdWJJbWFnZTNERVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpiaXRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkTXVsdGlUZXhTdWJJbWFnZTJERVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpiaXRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkTXVsdGlUZXhTdWJJbWFnZTFERVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmJpdHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbXByZXNzZWRNdWx0aVRleEltYWdlRVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbG9kLCBHTHZvaWQgKmltZyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTmFtZWRQcm9ncmFtU3RyaW5nRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdm9pZCAqc3RyaW5nKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRkRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRkdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXI0ZkVYVCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRmdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXROYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcmR2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGRvdWJsZSAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXROYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcmZ2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE5hbWVkUHJvZ3JhbWl2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXROYW1lZFByb2dyYW1TdHJpbmdFWFQgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdm9pZCAqc3RyaW5nKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOYW1lZFByb2dyYW1Mb2NhbFBhcmFtZXRlcnM0ZnZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJNGlFWFQgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVySTRpdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJzSTRpdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJNHVpRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB6LCBHTHVpbnQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJNHVpdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVyc0k0dWl2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TmFtZWRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJaXZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE5hbWVkUHJvZ3JhbUxvY2FsUGFyYW1ldGVySXVpdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleHR1cmVQYXJhbWV0ZXJJaXZFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleHR1cmVQYXJhbWV0ZXJJdWl2RVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTHVpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VGV4dHVyZVBhcmFtZXRlcklpdkVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VGV4dHVyZVBhcmFtZXRlckl1aXZFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdWludCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleFBhcmFtZXRlcklpdkVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhQYXJhbWV0ZXJJdWl2RVhUIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTHVpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TXVsdGlUZXhQYXJhbWV0ZXJJaXZFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE11bHRpVGV4UGFyYW1ldGVySXVpdkVYVCAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMWZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0yZkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTNmRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEsIEdMZmxvYXQgdjIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtNGZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2MiwgR0xmbG9hdCB2Myk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xaUVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0yaUVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM2lFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2Mik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00aUVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyLCBHTGludCB2Myk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xZnZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMmZ2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTNmdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00ZnZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMWl2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0yaXZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTNpdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtNGl2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyZnZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M2Z2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDRmdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyeDNmdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzeDJmdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyeDRmdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDJmdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzeDRmdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDNmdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xdWlFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJ1aUVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0zdWlFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwLCBHTHVpbnQgdjEsIEdMdWludCB2Mik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00dWlFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwLCBHTHVpbnQgdjEsIEdMdWludCB2MiwgR0x1aW50IHYzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTF1aXZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0ydWl2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM3VpdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTR1aXZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTmFtZWRCdWZmZXJEYXRhRVhUIChHTHVpbnQgYnVmZmVyLCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwgR0xlbnVtIHVzYWdlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOYW1lZEJ1ZmZlclN1YkRhdGFFWFQgKEdMdWludCBidWZmZXIsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xBUEkgR0x2b2lkKiBBUElFTlRSWSBnbE1hcE5hbWVkQnVmZmVyRVhUIChHTHVpbnQgYnVmZmVyLCBHTGVudW0gYWNjZXNzKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbFVubWFwTmFtZWRCdWZmZXJFWFQgKEdMdWludCBidWZmZXIpOworR0xBUEkgR0x2b2lkKiBBUElFTlRSWSBnbE1hcE5hbWVkQnVmZmVyUmFuZ2VFWFQgKEdMdWludCBidWZmZXIsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBsZW5ndGgsIEdMYml0ZmllbGQgYWNjZXNzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGbHVzaE1hcHBlZE5hbWVkQnVmZmVyUmFuZ2VFWFQgKEdMdWludCBidWZmZXIsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBsZW5ndGgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5hbWVkQ29weUJ1ZmZlclN1YkRhdGFFWFQgKEdMdWludCByZWFkQnVmZmVyLCBHTHVpbnQgd3JpdGVCdWZmZXIsIEdMaW50cHRyIHJlYWRPZmZzZXQsIEdMaW50cHRyIHdyaXRlT2Zmc2V0LCBHTHNpemVpcHRyIHNpemUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE5hbWVkQnVmZmVyUGFyYW1ldGVyaXZFWFQgKEdMdWludCBidWZmZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TmFtZWRCdWZmZXJQb2ludGVydkVYVCAoR0x1aW50IGJ1ZmZlciwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE5hbWVkQnVmZmVyU3ViRGF0YUVYVCAoR0x1aW50IGJ1ZmZlciwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIEdMdm9pZCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZUJ1ZmZlckVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0x1aW50IGJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhCdWZmZXJFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMdWludCBidWZmZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5hbWVkUmVuZGVyYnVmZmVyU3RvcmFnZUVYVCAoR0x1aW50IHJlbmRlcmJ1ZmZlciwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TmFtZWRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdkVYVCAoR0x1aW50IHJlbmRlcmJ1ZmZlciwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIEdMZW51bSBBUElFTlRSWSBnbENoZWNrTmFtZWRGcmFtZWJ1ZmZlclN0YXR1c0VYVCAoR0x1aW50IGZyYW1lYnVmZmVyLCBHTGVudW0gdGFyZ2V0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOYW1lZEZyYW1lYnVmZmVyVGV4dHVyZTFERVhUIChHTHVpbnQgZnJhbWVidWZmZXIsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5hbWVkRnJhbWVidWZmZXJUZXh0dXJlMkRFWFQgKEdMdWludCBmcmFtZWJ1ZmZlciwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTmFtZWRGcmFtZWJ1ZmZlclRleHR1cmUzREVYVCAoR0x1aW50IGZyYW1lYnVmZmVyLCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTGludCB6b2Zmc2V0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOYW1lZEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUIChHTHVpbnQgZnJhbWVidWZmZXIsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXROYW1lZEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2RVhUIChHTHVpbnQgZnJhbWVidWZmZXIsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlbmVyYXRlVGV4dHVyZU1pcG1hcEVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlbmVyYXRlTXVsdGlUZXhNaXBtYXBFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlckRyYXdCdWZmZXJFWFQgKEdMdWludCBmcmFtZWJ1ZmZlciwgR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyRHJhd0J1ZmZlcnNFWFQgKEdMdWludCBmcmFtZWJ1ZmZlciwgR0xzaXplaSBuLCBjb25zdCBHTGVudW0gKmJ1ZnMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyUmVhZEJ1ZmZlckVYVCAoR0x1aW50IGZyYW1lYnVmZmVyLCBHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0RnJhbWVidWZmZXJQYXJhbWV0ZXJpdkVYVCAoR0x1aW50IGZyYW1lYnVmZmVyLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5hbWVkUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUIChHTHVpbnQgcmVuZGVyYnVmZmVyLCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5hbWVkUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQ292ZXJhZ2VFWFQgKEdMdWludCByZW5kZXJidWZmZXIsIEdMc2l6ZWkgY292ZXJhZ2VTYW1wbGVzLCBHTHNpemVpIGNvbG9yU2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTmFtZWRGcmFtZWJ1ZmZlclRleHR1cmVFWFQgKEdMdWludCBmcmFtZWJ1ZmZlciwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTmFtZWRGcmFtZWJ1ZmZlclRleHR1cmVMYXllckVYVCAoR0x1aW50IGZyYW1lYnVmZmVyLCBHTGVudW0gYXR0YWNobWVudCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTGludCBsYXllcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTmFtZWRGcmFtZWJ1ZmZlclRleHR1cmVGYWNlRVhUIChHTHVpbnQgZnJhbWVidWZmZXIsIEdMZW51bSBhdHRhY2htZW50LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMZW51bSBmYWNlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXh0dXJlUmVuZGVyYnVmZmVyRVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhSZW5kZXJidWZmZXJFWFQgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTFkRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZG91YmxlIHgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMmRFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0zZEVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTRkRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMWR2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0yZHZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTNkdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtNGR2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyZHZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDNkdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4NGR2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyeDNkdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4Mng0ZHZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDN4MmR2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzeDRkdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4NHgyZHZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDR4M2R2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDTElFTlRBVFRSSUJERUZBVUxURVhUUFJPQykgKEdMYml0ZmllbGQgbWFzayk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBVU0hDTElFTlRBVFRSSUJERUZBVUxURVhUUFJPQykgKEdMYml0ZmllbGQgbWFzayk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWExPQURGRVhUUFJPQykgKEdMZW51bSBtb2RlLCBjb25zdCBHTGZsb2F0ICptKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFUUklYTE9BRERFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMZG91YmxlICptKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFUUklYTVVMVEZFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMZmxvYXQgKm0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVRSSVhNVUxUREVYVFBST0MpIChHTGVudW0gbW9kZSwgY29uc3QgR0xkb3VibGUgKm0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVRSSVhMT0FESURFTlRJVFlFWFRQUk9DKSAoR0xlbnVtIG1vZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVRSSVhST1RBVEVGRVhUUFJPQykgKEdMZW51bSBtb2RlLCBHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFUUklYUk9UQVRFREVYVFBST0MpIChHTGVudW0gbW9kZSwgR0xkb3VibGUgYW5nbGUsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVRSSVhTQ0FMRUZFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVRSSVhTQ0FMRURFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVRSSVhUUkFOU0xBVEVGRVhUUFJPQykgKEdMZW51bSBtb2RlLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFUUklYVFJBTlNMQVRFREVYVFBST0MpIChHTGVudW0gbW9kZSwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWEZSVVNUVU1FWFRQUk9DKSAoR0xlbnVtIG1vZGUsIEdMZG91YmxlIGxlZnQsIEdMZG91YmxlIHJpZ2h0LCBHTGRvdWJsZSBib3R0b20sIEdMZG91YmxlIHRvcCwgR0xkb3VibGUgek5lYXIsIEdMZG91YmxlIHpGYXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVRSSVhPUlRIT0VYVFBST0MpIChHTGVudW0gbW9kZSwgR0xkb3VibGUgbGVmdCwgR0xkb3VibGUgcmlnaHQsIEdMZG91YmxlIGJvdHRvbSwgR0xkb3VibGUgdG9wLCBHTGRvdWJsZSB6TmVhciwgR0xkb3VibGUgekZhcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWFBPUEVYVFBST0MpIChHTGVudW0gbW9kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWFBVU0hFWFRQUk9DKSAoR0xlbnVtIG1vZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVRSSVhMT0FEVFJBTlNQT1NFRkVYVFBST0MpIChHTGVudW0gbW9kZSwgY29uc3QgR0xmbG9hdCAqbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWExPQURUUkFOU1BPU0VERVhUUFJPQykgKEdMZW51bSBtb2RlLCBjb25zdCBHTGRvdWJsZSAqbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWE1VTFRUUkFOU1BPU0VGRVhUUFJPQykgKEdMZW51bSBtb2RlLCBjb25zdCBHTGZsb2F0ICptKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFUUklYTVVMVFRSQU5TUE9TRURFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMZG91YmxlICptKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRVBBUkFNRVRFUkZFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVQQVJBTUVURVJGVkVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhUVVJFUEFSQU1FVEVSSUVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVQQVJBTUVURVJJVkVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRUlNQUdFMURFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRUlNQUdFMkRFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVTVUJJTUFHRTFERVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRVNVQklNQUdFMkRFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWVRFWFRVUkVJTUFHRTFERVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTGludCBib3JkZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZVEVYVFVSRUlNQUdFMkRFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZVEVYVFVSRVNVQklNQUdFMURFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWVRFWFRVUkVTVUJJTUFHRTJERVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRURVhUVVJFSU1BR0VFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpwaXhlbHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRURVhUVVJFUEFSQU1FVEVSRlZFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVEVYVFVSRVBBUkFNRVRFUklWRVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRURVhUVVJFTEVWRUxQQVJBTUVURVJGVkVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVEVYVFVSRUxFVkVMUEFSQU1FVEVSSVZFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhUVVJFSU1BR0UzREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRVNVQklNQUdFM0RFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWVRFWFRVUkVTVUJJTUFHRTNERVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWFBBUkFNRVRFUkZFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYUEFSQU1FVEVSRlZFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhQQVJBTUVURVJJRVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhQQVJBTUVURVJJVkVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhJTUFHRTFERVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYSU1BR0UyREVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhTVUJJTUFHRTFERVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhTVUJJTUFHRTJERVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlNVUxUSVRFWElNQUdFMURFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMaW50IGJvcmRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlNVUxUSVRFWElNQUdFMkRFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZTVVMVElURVhTVUJJTUFHRTFERVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlNVUxUSVRFWFNVQklNQUdFMkRFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1VTFRJVEVYSU1BR0VFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpwaXhlbHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNVUxUSVRFWFBBUkFNRVRFUkZWRVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1VTFRJVEVYUEFSQU1FVEVSSVZFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1VTFRJVEVYTEVWRUxQQVJBTUVURVJGVkVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTVVMVElURVhMRVZFTFBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhJTUFHRTNERVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWFNVQklNQUdFM0RFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWU1VTFRJVEVYU1VCSU1BR0UzREVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklORE1VTFRJVEVYVFVSRUVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkFCTEVDTElFTlRTVEFURUlOREVYRURFWFRQUk9DKSAoR0xlbnVtIGFycmF5LCBHTHVpbnQgaW5kZXgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xESVNBQkxFQ0xJRU5UU1RBVEVJTkRFWEVERVhUUFJPQykgKEdMZW51bSBhcnJheSwgR0x1aW50IGluZGV4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRFBPSU5URVJFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhFTlZGRVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWEVOVkZWRVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYRU5WSUVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYRU5WSVZFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYR0VOREVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZG91YmxlIHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhHRU5EVkVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZG91YmxlICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWEdFTkZFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhHRU5GVkVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYR0VOSUVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhHRU5JVkVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNVUxUSVRFWEVOVkZWRVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1VTFRJVEVYRU5WSVZFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1VTFRJVEVYR0VORFZFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTVVMVElURVhHRU5GVkVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1VTFRJVEVYR0VOSVZFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VURkxPQVRJTkRFWEVEVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRET1VCTEVJTkRFWEVEVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZG91YmxlICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUE9JTlRFUklOREVYRURWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x2b2lkKiAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhUVVJFSU1BR0UzREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqYml0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhUVVJFSU1BR0UyREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqYml0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhUVVJFSU1BR0UxREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpiaXRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFRVUkVTVUJJTUFHRTNERVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmJpdHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYVFVSRVNVQklNQUdFMkRFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqYml0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhUVVJFU1VCSU1BR0UxREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmJpdHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT01QUkVTU0VEVEVYVFVSRUlNQUdFRVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsb2QsIEdMdm9pZCAqaW1nKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRE1VTFRJVEVYSU1BR0UzREVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqYml0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURNVUxUSVRFWElNQUdFMkRFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmJpdHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VETVVMVElURVhJTUFHRTFERVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmJpdHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VETVVMVElURVhTVUJJTUFHRTNERVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmJpdHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VETVVMVElURVhTVUJJTUFHRTJERVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmJpdHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VETVVMVElURVhTVUJJTUFHRTFERVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqYml0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTVBSRVNTRURNVUxUSVRFWElNQUdFRVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGludCBsb2QsIEdMdm9pZCAqaW1nKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTkFNRURQUk9HUkFNU1RSSU5HRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGxlbiwgY29uc3QgR0x2b2lkICpzdHJpbmcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOQU1FRFBST0dSQU1MT0NBTFBBUkFNRVRFUjRERVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOQU1FRFBST0dSQU1MT0NBTFBBUkFNRVRFUjREVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTkFNRURQUk9HUkFNTE9DQUxQQVJBTUVURVI0RkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOQU1FRFBST0dSQU1MT0NBTFBBUkFNRVRFUjRGVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROQU1FRFBST0dSQU1MT0NBTFBBUkFNRVRFUkRWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZG91YmxlICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROQU1FRFBST0dSQU1MT0NBTFBBUkFNRVRFUkZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5BTUVEUFJPR1JBTUlWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROQU1FRFBST0dSQU1TVFJJTkdFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x2b2lkICpzdHJpbmcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOQU1FRFBST0dSQU1MT0NBTFBBUkFNRVRFUlM0RlZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTkFNRURQUk9HUkFNTE9DQUxQQVJBTUVURVJJNElFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5BTUVEUFJPR1JBTUxPQ0FMUEFSQU1FVEVSSTRJVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTkFNRURQUk9HUkFNTE9DQUxQQVJBTUVURVJTSTRJVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTkFNRURQUk9HUkFNTE9DQUxQQVJBTUVURVJJNFVJRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHosIEdMdWludCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTkFNRURQUk9HUkFNTE9DQUxQQVJBTUVURVJJNFVJVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5BTUVEUFJPR1JBTUxPQ0FMUEFSQU1FVEVSU0k0VUlWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTkFNRURQUk9HUkFNTE9DQUxQQVJBTUVURVJJSVZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5BTUVEUFJPR1JBTUxPQ0FMUEFSQU1FVEVSSVVJVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVQQVJBTUVURVJJSVZFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVQQVJBTUVURVJJVUlWRVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVEVYVFVSRVBBUkFNRVRFUklJVkVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVEVYVFVSRVBBUkFNRVRFUklVSVZFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWFBBUkFNRVRFUklJVkVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhQQVJBTUVURVJJVUlWRVhUUFJPQykgKEdMZW51bSB0ZXh1bml0LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTVVMVElURVhQQVJBTUVURVJJSVZFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1VTFRJVEVYUEFSQU1FVEVSSVVJVkVYVFBST0MpIChHTGVudW0gdGV4dW5pdCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMUZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0yRkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTNGRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2Mik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNNEZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyLCBHTGZsb2F0IHYzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0xSUVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0ySUVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNM0lFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk00SUVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSwgR0xpbnQgdjIsIEdMaW50IHYzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0xRlZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMkZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTNGVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk00RlZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMUlWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0ySVZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTNJVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNNElWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgyRlZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNTUFUUklYM0ZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDRGVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgyWDNGVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgzWDJGVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgyWDRGVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVg0WDJGVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgzWDRGVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVg0WDNGVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0xVUlFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjApOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTJVSUVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0zVUlFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSwgR0x1aW50IHYyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk00VUlFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSwgR0x1aW50IHYyLCBHTHVpbnQgdjMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTFVSVZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0yVUlWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNM1VJVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTRVSVZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTkFNRURCVUZGRVJEQVRBRVhUUFJPQykgKEdMdWludCBidWZmZXIsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhLCBHTGVudW0gdXNhZ2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOQU1FREJVRkZFUlNVQkRBVEFFWFRQUk9DKSAoR0x1aW50IGJ1ZmZlciwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIEdMdm9pZCogKEFQSUVOVFJZUCBQRk5HTE1BUE5BTUVEQlVGRkVSRVhUUFJPQykgKEdMdWludCBidWZmZXIsIEdMZW51bSBhY2Nlc3MpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTFVOTUFQTkFNRURCVUZGRVJFWFRQUk9DKSAoR0x1aW50IGJ1ZmZlcik7Cit0eXBlZGVmIEdMdm9pZCogKEFQSUVOVFJZUCBQRk5HTE1BUE5BTUVEQlVGRkVSUkFOR0VFWFRQUk9DKSAoR0x1aW50IGJ1ZmZlciwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIGxlbmd0aCwgR0xiaXRmaWVsZCBhY2Nlc3MpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGTFVTSE1BUFBFRE5BTUVEQlVGRkVSUkFOR0VFWFRQUk9DKSAoR0x1aW50IGJ1ZmZlciwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIGxlbmd0aCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5BTUVEQ09QWUJVRkZFUlNVQkRBVEFFWFRQUk9DKSAoR0x1aW50IHJlYWRCdWZmZXIsIEdMdWludCB3cml0ZUJ1ZmZlciwgR0xpbnRwdHIgcmVhZE9mZnNldCwgR0xpbnRwdHIgd3JpdGVPZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5BTUVEQlVGRkVSUEFSQU1FVEVSSVZFWFRQUk9DKSAoR0x1aW50IGJ1ZmZlciwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTkFNRURCVUZGRVJQT0lOVEVSVkVYVFBST0MpIChHTHVpbnQgYnVmZmVyLCBHTGVudW0gcG5hbWUsIEdMdm9pZCogKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE5BTUVEQlVGRkVSU1VCREFUQUVYVFBST0MpIChHTHVpbnQgYnVmZmVyLCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRUJVRkZFUkVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHVpbnQgYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhCVUZGRVJFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0x1aW50IGJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5BTUVEUkVOREVSQlVGRkVSU1RPUkFHRUVYVFBST0MpIChHTHVpbnQgcmVuZGVyYnVmZmVyLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTkFNRURSRU5ERVJCVUZGRVJQQVJBTUVURVJJVkVYVFBST0MpIChHTHVpbnQgcmVuZGVyYnVmZmVyLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiBHTGVudW0gKEFQSUVOVFJZUCBQRk5HTENIRUNLTkFNRURGUkFNRUJVRkZFUlNUQVRVU0VYVFBST0MpIChHTHVpbnQgZnJhbWVidWZmZXIsIEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOQU1FREZSQU1FQlVGRkVSVEVYVFVSRTFERVhUUFJPQykgKEdMdWludCBmcmFtZWJ1ZmZlciwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5BTUVERlJBTUVCVUZGRVJURVhUVVJFMkRFWFRQUk9DKSAoR0x1aW50IGZyYW1lYnVmZmVyLCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTkFNRURGUkFNRUJVRkZFUlRFWFRVUkUzREVYVFBST0MpIChHTHVpbnQgZnJhbWVidWZmZXIsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IHpvZmZzZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOQU1FREZSQU1FQlVGRkVSUkVOREVSQlVGRkVSRVhUUFJPQykgKEdMdWludCBmcmFtZWJ1ZmZlciwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROQU1FREZSQU1FQlVGRkVSQVRUQUNITUVOVFBBUkFNRVRFUklWRVhUUFJPQykgKEdMdWludCBmcmFtZWJ1ZmZlciwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTkVSQVRFVEVYVFVSRU1JUE1BUEVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTkVSQVRFTVVMVElURVhNSVBNQVBFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUkRSQVdCVUZGRVJFWFRQUk9DKSAoR0x1aW50IGZyYW1lYnVmZmVyLCBHTGVudW0gbW9kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSRFJBV0JVRkZFUlNFWFRQUk9DKSAoR0x1aW50IGZyYW1lYnVmZmVyLCBHTHNpemVpIG4sIGNvbnN0IEdMZW51bSAqYnVmcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSUkVBREJVRkZFUkVYVFBST0MpIChHTHVpbnQgZnJhbWVidWZmZXIsIEdMZW51bSBtb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VURlJBTUVCVUZGRVJQQVJBTUVURVJJVkVYVFBST0MpIChHTHVpbnQgZnJhbWVidWZmZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5BTUVEUkVOREVSQlVGRkVSU1RPUkFHRU1VTFRJU0FNUExFRVhUUFJPQykgKEdMdWludCByZW5kZXJidWZmZXIsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5BTUVEUkVOREVSQlVGRkVSU1RPUkFHRU1VTFRJU0FNUExFQ09WRVJBR0VFWFRQUk9DKSAoR0x1aW50IHJlbmRlcmJ1ZmZlciwgR0xzaXplaSBjb3ZlcmFnZVNhbXBsZXMsIEdMc2l6ZWkgY29sb3JTYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTkFNRURGUkFNRUJVRkZFUlRFWFRVUkVFWFRQUk9DKSAoR0x1aW50IGZyYW1lYnVmZmVyLCBHTGVudW0gYXR0YWNobWVudCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTkFNRURGUkFNRUJVRkZFUlRFWFRVUkVMQVlFUkVYVFBST0MpIChHTHVpbnQgZnJhbWVidWZmZXIsIEdMZW51bSBhdHRhY2htZW50LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IGxheWVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTkFNRURGUkFNRUJVRkZFUlRFWFRVUkVGQUNFRVhUUFJPQykgKEdMdWludCBmcmFtZWJ1ZmZlciwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xlbnVtIGZhY2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhUVVJFUkVOREVSQlVGRkVSRVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhSRU5ERVJCVUZGRVJFWFRQUk9DKSAoR0xlbnVtIHRleHVuaXQsIEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTFERVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xkb3VibGUgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMkRFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0zREVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTRERVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMURWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0yRFZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTNEVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNNERWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgyRFZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDNEVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNTUFUUklYNERWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgyWDNEVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNTUFUUklYMlg0RFZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDNYMkRWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgzWDREVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZG91YmxlICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNTUFUUklYNFgyRFZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGRvdWJsZSAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDRYM0RWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xkb3VibGUgKnZhbHVlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF92ZXJ0ZXhfYXJyYXlfYmdyYQorI2RlZmluZSBHTF9FWFRfdmVydGV4X2FycmF5X2JncmEgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfc3dpenpsZQorI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9zd2l6emxlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2V4cGxpY2l0X211bHRpc2FtcGxlCisjZGVmaW5lIEdMX05WX2V4cGxpY2l0X211bHRpc2FtcGxlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TXVsdGlzYW1wbGVmdk5WIChHTGVudW0gcG5hbWUsIEdMdWludCBpbmRleCwgR0xmbG9hdCAqdmFsKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVNYXNrSW5kZXhlZE5WIChHTHVpbnQgaW5kZXgsIEdMYml0ZmllbGQgbWFzayk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4UmVuZGVyYnVmZmVyTlYgKEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTVVMVElTQU1QTEVGVk5WUFJPQykgKEdMZW51bSBwbmFtZSwgR0x1aW50IGluZGV4LCBHTGZsb2F0ICp2YWwpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVNQVNLSU5ERVhFRE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xiaXRmaWVsZCBtYXNrKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYUkVOREVSQlVGRkVSTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90cmFuc2Zvcm1fZmVlZGJhY2syCisjZGVmaW5lIEdMX05WX3RyYW5zZm9ybV9mZWVkYmFjazIgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kVHJhbnNmb3JtRmVlZGJhY2tOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVUcmFuc2Zvcm1GZWVkYmFja3NOViAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmlkcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuVHJhbnNmb3JtRmVlZGJhY2tzTlYgKEdMc2l6ZWkgbiwgR0x1aW50ICppZHMpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNUcmFuc2Zvcm1GZWVkYmFja05WIChHTHVpbnQgaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBhdXNlVHJhbnNmb3JtRmVlZGJhY2tOViAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVzdW1lVHJhbnNmb3JtRmVlZGJhY2tOViAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd1RyYW5zZm9ybUZlZWRiYWNrTlYgKEdMZW51bSBtb2RlLCBHTHVpbnQgaWQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklORFRSQU5TRk9STUZFRURCQUNLTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFVFJBTlNGT1JNRkVFREJBQ0tTTlZQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmlkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTlRSQU5TRk9STUZFRURCQUNLU05WUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICppZHMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTVFJBTlNGT1JNRkVFREJBQ0tOVlBST0MpIChHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQQVVTRVRSQU5TRk9STUZFRURCQUNLTlZQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFU1VNRVRSQU5TRk9STUZFRURCQUNLTlZQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdUUkFOU0ZPUk1GRUVEQkFDS05WUFJPQykgKEdMZW51bSBtb2RlLCBHTHVpbnQgaWQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX21lbWluZm8KKyNkZWZpbmUgR0xfQVRJX21lbWluZm8gMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX3BlcmZvcm1hbmNlX21vbml0b3IKKyNkZWZpbmUgR0xfQU1EX3BlcmZvcm1hbmNlX21vbml0b3IgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQZXJmTW9uaXRvckdyb3Vwc0FNRCAoR0xpbnQgKm51bUdyb3VwcywgR0xzaXplaSBncm91cHNTaXplLCBHTHVpbnQgKmdyb3Vwcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UGVyZk1vbml0b3JDb3VudGVyc0FNRCAoR0x1aW50IGdyb3VwLCBHTGludCAqbnVtQ291bnRlcnMsIEdMaW50ICptYXhBY3RpdmVDb3VudGVycywgR0xzaXplaSBjb3VudGVyU2l6ZSwgR0x1aW50ICpjb3VudGVycyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UGVyZk1vbml0b3JHcm91cFN0cmluZ0FNRCAoR0x1aW50IGdyb3VwLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpncm91cFN0cmluZyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UGVyZk1vbml0b3JDb3VudGVyU3RyaW5nQU1EIChHTHVpbnQgZ3JvdXAsIEdMdWludCBjb3VudGVyLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpjb3VudGVyU3RyaW5nKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJJbmZvQU1EIChHTHVpbnQgZ3JvdXAsIEdMdWludCBjb3VudGVyLCBHTGVudW0gcG5hbWUsIEdMdm9pZCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuUGVyZk1vbml0b3JzQU1EIChHTHNpemVpIG4sIEdMdWludCAqbW9uaXRvcnMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVBlcmZNb25pdG9yc0FNRCAoR0xzaXplaSBuLCBHTHVpbnQgKm1vbml0b3JzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWxlY3RQZXJmTW9uaXRvckNvdW50ZXJzQU1EIChHTHVpbnQgbW9uaXRvciwgR0xib29sZWFuIGVuYWJsZSwgR0x1aW50IGdyb3VwLCBHTGludCBudW1Db3VudGVycywgR0x1aW50ICpjb3VudGVyTGlzdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmVnaW5QZXJmTW9uaXRvckFNRCAoR0x1aW50IG1vbml0b3IpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuZFBlcmZNb25pdG9yQU1EIChHTHVpbnQgbW9uaXRvcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UGVyZk1vbml0b3JDb3VudGVyRGF0YUFNRCAoR0x1aW50IG1vbml0b3IsIEdMZW51bSBwbmFtZSwgR0xzaXplaSBkYXRhU2l6ZSwgR0x1aW50ICpkYXRhLCBHTGludCAqYnl0ZXNXcml0dGVuKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBFUkZNT05JVE9SR1JPVVBTQU1EUFJPQykgKEdMaW50ICpudW1Hcm91cHMsIEdMc2l6ZWkgZ3JvdXBzU2l6ZSwgR0x1aW50ICpncm91cHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQRVJGTU9OSVRPUkNPVU5URVJTQU1EUFJPQykgKEdMdWludCBncm91cCwgR0xpbnQgKm51bUNvdW50ZXJzLCBHTGludCAqbWF4QWN0aXZlQ291bnRlcnMsIEdMc2l6ZWkgY291bnRlclNpemUsIEdMdWludCAqY291bnRlcnMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQRVJGTU9OSVRPUkdST1VQU1RSSU5HQU1EUFJPQykgKEdMdWludCBncm91cCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqZ3JvdXBTdHJpbmcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQRVJGTU9OSVRPUkNPVU5URVJTVFJJTkdBTURQUk9DKSAoR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqY291bnRlclN0cmluZyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBFUkZNT05JVE9SQ09VTlRFUklORk9BTURQUk9DKSAoR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5QRVJGTU9OSVRPUlNBTURQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKm1vbml0b3JzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFUEVSRk1PTklUT1JTQU1EUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICptb25pdG9ycyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFTEVDVFBFUkZNT05JVE9SQ09VTlRFUlNBTURQUk9DKSAoR0x1aW50IG1vbml0b3IsIEdMYm9vbGVhbiBlbmFibGUsIEdMdWludCBncm91cCwgR0xpbnQgbnVtQ291bnRlcnMsIEdMdWludCAqY291bnRlckxpc3QpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCRUdJTlBFUkZNT05JVE9SQU1EUFJPQykgKEdMdWludCBtb25pdG9yKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5EUEVSRk1PTklUT1JBTURQUk9DKSAoR0x1aW50IG1vbml0b3IpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQRVJGTU9OSVRPUkNPVU5URVJEQVRBQU1EUFJPQykgKEdMdWludCBtb25pdG9yLCBHTGVudW0gcG5hbWUsIEdMc2l6ZWkgZGF0YVNpemUsIEdMdWludCAqZGF0YSwgR0xpbnQgKmJ5dGVzV3JpdHRlbik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BTURfdGV4dHVyZV90ZXh0dXJlNAorI2RlZmluZSBHTF9BTURfdGV4dHVyZV90ZXh0dXJlNCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BTURfdmVydGV4X3NoYWRlcl90ZXNzZWxhdG9yCisjZGVmaW5lIEdMX0FNRF92ZXJ0ZXhfc2hhZGVyX3Rlc3NlbGF0b3IgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXNzZWxsYXRpb25GYWN0b3JBTUQgKEdMZmxvYXQgZmFjdG9yKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXNzZWxsYXRpb25Nb2RlQU1EIChHTGVudW0gbW9kZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVNTRUxMQVRJT05GQUNUT1JBTURQUk9DKSAoR0xmbG9hdCBmYWN0b3IpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVNTRUxMQVRJT05NT0RFQU1EUFJPQykgKEdMZW51bSBtb2RlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9wcm92b2tpbmdfdmVydGV4CisjZGVmaW5lIEdMX0VYVF9wcm92b2tpbmdfdmVydGV4IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvdm9raW5nVmVydGV4RVhUIChHTGVudW0gbW9kZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9WT0tJTkdWRVJURVhFWFRQUk9DKSAoR0xlbnVtIG1vZGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfc25vcm0KKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfc25vcm0gMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX2RyYXdfYnVmZmVyc19ibGVuZAorI2RlZmluZSBHTF9BTURfZHJhd19idWZmZXJzX2JsZW5kIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRGdW5jSW5kZXhlZEFNRCAoR0x1aW50IGJ1ZiwgR0xlbnVtIHNyYywgR0xlbnVtIGRzdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRGdW5jU2VwYXJhdGVJbmRleGVkQU1EIChHTHVpbnQgYnVmLCBHTGVudW0gc3JjUkdCLCBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQWxwaGEsIEdMZW51bSBkc3RBbHBoYSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRFcXVhdGlvbkluZGV4ZWRBTUQgKEdMdWludCBidWYsIEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVJbmRleGVkQU1EIChHTHVpbnQgYnVmLCBHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREZVTkNJTkRFWEVEQU1EUFJPQykgKEdMdWludCBidWYsIEdMZW51bSBzcmMsIEdMZW51bSBkc3QpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREZVTkNTRVBBUkFURUlOREVYRURBTURQUk9DKSAoR0x1aW50IGJ1ZiwgR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREVRVUFUSU9OSU5ERVhFREFNRFBST0MpIChHTHVpbnQgYnVmLCBHTGVudW0gbW9kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERVFVQVRJT05TRVBBUkFURUlOREVYRURBTURQUk9DKSAoR0x1aW50IGJ1ZiwgR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfdGV4dHVyZV9yYW5nZQorI2RlZmluZSBHTF9BUFBMRV90ZXh0dXJlX3JhbmdlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZVJhbmdlQVBQTEUgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGVuZ3RoLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFRleFBhcmFtZXRlclBvaW50ZXJ2QVBQTEUgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVSQU5HRUFQUExFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGVuZ3RoLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRURVhQQVJBTUVURVJQT0lOVEVSVkFQUExFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX2Zsb2F0X3BpeGVscworI2RlZmluZSBHTF9BUFBMRV9mbG9hdF9waXhlbHMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfdmVydGV4X3Byb2dyYW1fZXZhbHVhdG9ycworI2RlZmluZSBHTF9BUFBMRV92ZXJ0ZXhfcHJvZ3JhbV9ldmFsdWF0b3JzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5hYmxlVmVydGV4QXR0cmliQVBQTEUgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEaXNhYmxlVmVydGV4QXR0cmliQVBQTEUgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzVmVydGV4QXR0cmliRW5hYmxlZEFQUExFIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWFwVmVydGV4QXR0cmliMWRBUFBMRSAoR0x1aW50IGluZGV4LCBHTHVpbnQgc2l6ZSwgR0xkb3VibGUgdTEsIEdMZG91YmxlIHUyLCBHTGludCBzdHJpZGUsIEdMaW50IG9yZGVyLCBjb25zdCBHTGRvdWJsZSAqcG9pbnRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXBWZXJ0ZXhBdHRyaWIxZkFQUExFIChHTHVpbnQgaW5kZXgsIEdMdWludCBzaXplLCBHTGZsb2F0IHUxLCBHTGZsb2F0IHUyLCBHTGludCBzdHJpZGUsIEdMaW50IG9yZGVyLCBjb25zdCBHTGZsb2F0ICpwb2ludHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hcFZlcnRleEF0dHJpYjJkQVBQTEUgKEdMdWludCBpbmRleCwgR0x1aW50IHNpemUsIEdMZG91YmxlIHUxLCBHTGRvdWJsZSB1MiwgR0xpbnQgdXN0cmlkZSwgR0xpbnQgdW9yZGVyLCBHTGRvdWJsZSB2MSwgR0xkb3VibGUgdjIsIEdMaW50IHZzdHJpZGUsIEdMaW50IHZvcmRlciwgY29uc3QgR0xkb3VibGUgKnBvaW50cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWFwVmVydGV4QXR0cmliMmZBUFBMRSAoR0x1aW50IGluZGV4LCBHTHVpbnQgc2l6ZSwgR0xmbG9hdCB1MSwgR0xmbG9hdCB1MiwgR0xpbnQgdXN0cmlkZSwgR0xpbnQgdW9yZGVyLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyLCBHTGludCB2c3RyaWRlLCBHTGludCB2b3JkZXIsIGNvbnN0IEdMZmxvYXQgKnBvaW50cyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkFCTEVWRVJURVhBVFRSSUJBUFBMRVBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERJU0FCTEVWRVJURVhBVFRSSUJBUFBMRVBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNWRVJURVhBVFRSSUJFTkFCTEVEQVBQTEVQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVBWRVJURVhBVFRSSUIxREFQUExFUFJPQykgKEdMdWludCBpbmRleCwgR0x1aW50IHNpemUsIEdMZG91YmxlIHUxLCBHTGRvdWJsZSB1MiwgR0xpbnQgc3RyaWRlLCBHTGludCBvcmRlciwgY29uc3QgR0xkb3VibGUgKnBvaW50cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BUFZFUlRFWEFUVFJJQjFGQVBQTEVQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVpbnQgc2l6ZSwgR0xmbG9hdCB1MSwgR0xmbG9hdCB1MiwgR0xpbnQgc3RyaWRlLCBHTGludCBvcmRlciwgY29uc3QgR0xmbG9hdCAqcG9pbnRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFQVkVSVEVYQVRUUklCMkRBUFBMRVBST0MpIChHTHVpbnQgaW5kZXgsIEdMdWludCBzaXplLCBHTGRvdWJsZSB1MSwgR0xkb3VibGUgdTIsIEdMaW50IHVzdHJpZGUsIEdMaW50IHVvcmRlciwgR0xkb3VibGUgdjEsIEdMZG91YmxlIHYyLCBHTGludCB2c3RyaWRlLCBHTGludCB2b3JkZXIsIGNvbnN0IEdMZG91YmxlICpwb2ludHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVBWRVJURVhBVFRSSUIyRkFQUExFUFJPQykgKEdMdWludCBpbmRleCwgR0x1aW50IHNpemUsIEdMZmxvYXQgdTEsIEdMZmxvYXQgdTIsIEdMaW50IHVzdHJpZGUsIEdMaW50IHVvcmRlciwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2MiwgR0xpbnQgdnN0cmlkZSwgR0xpbnQgdm9yZGVyLCBjb25zdCBHTGZsb2F0ICpwb2ludHMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfYXV4X2RlcHRoX3N0ZW5jaWwKKyNkZWZpbmUgR0xfQVBQTEVfYXV4X2RlcHRoX3N0ZW5jaWwgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfb2JqZWN0X3B1cmdlYWJsZQorI2RlZmluZSBHTF9BUFBMRV9vYmplY3RfcHVyZ2VhYmxlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSBHTGVudW0gQVBJRU5UUlkgZ2xPYmplY3RQdXJnZWFibGVBUFBMRSAoR0xlbnVtIG9iamVjdFR5cGUsIEdMdWludCBuYW1lLCBHTGVudW0gb3B0aW9uKTsKK0dMQVBJIEdMZW51bSBBUElFTlRSWSBnbE9iamVjdFVucHVyZ2VhYmxlQVBQTEUgKEdMZW51bSBvYmplY3RUeXBlLCBHTHVpbnQgbmFtZSwgR0xlbnVtIG9wdGlvbik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0T2JqZWN0UGFyYW1ldGVyaXZBUFBMRSAoR0xlbnVtIG9iamVjdFR5cGUsIEdMdWludCBuYW1lLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0xlbnVtIChBUElFTlRSWVAgUEZOR0xPQkpFQ1RQVVJHRUFCTEVBUFBMRVBST0MpIChHTGVudW0gb2JqZWN0VHlwZSwgR0x1aW50IG5hbWUsIEdMZW51bSBvcHRpb24pOwordHlwZWRlZiBHTGVudW0gKEFQSUVOVFJZUCBQRk5HTE9CSkVDVFVOUFVSR0VBQkxFQVBQTEVQUk9DKSAoR0xlbnVtIG9iamVjdFR5cGUsIEdMdWludCBuYW1lLCBHTGVudW0gb3B0aW9uKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUT0JKRUNUUEFSQU1FVEVSSVZBUFBMRVBST0MpIChHTGVudW0gb2JqZWN0VHlwZSwgR0x1aW50IG5hbWUsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV9yb3dfYnl0ZXMKKyNkZWZpbmUgR0xfQVBQTEVfcm93X2J5dGVzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX3JnYl80MjIKKyNkZWZpbmUgR0xfQVBQTEVfcmdiXzQyMiAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92aWRlb19jYXB0dXJlCisjZGVmaW5lIEdMX05WX3ZpZGVvX2NhcHR1cmUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCZWdpblZpZGVvQ2FwdHVyZU5WIChHTHVpbnQgdmlkZW9fY2FwdHVyZV9zbG90KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kVmlkZW9DYXB0dXJlU3RyZWFtQnVmZmVyTlYgKEdMdWludCB2aWRlb19jYXB0dXJlX3Nsb3QsIEdMdWludCBzdHJlYW0sIEdMZW51bSBmcmFtZV9yZWdpb24sIEdMaW50cHRyQVJCIG9mZnNldCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZFZpZGVvQ2FwdHVyZVN0cmVhbVRleHR1cmVOViAoR0x1aW50IHZpZGVvX2NhcHR1cmVfc2xvdCwgR0x1aW50IHN0cmVhbSwgR0xlbnVtIGZyYW1lX3JlZ2lvbiwgR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuZFZpZGVvQ2FwdHVyZU5WIChHTHVpbnQgdmlkZW9fY2FwdHVyZV9zbG90KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWaWRlb0NhcHR1cmVpdk5WIChHTHVpbnQgdmlkZW9fY2FwdHVyZV9zbG90LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZpZGVvQ2FwdHVyZVN0cmVhbWl2TlYgKEdMdWludCB2aWRlb19jYXB0dXJlX3Nsb3QsIEdMdWludCBzdHJlYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmlkZW9DYXB0dXJlU3RyZWFtZnZOViAoR0x1aW50IHZpZGVvX2NhcHR1cmVfc2xvdCwgR0x1aW50IHN0cmVhbSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZpZGVvQ2FwdHVyZVN0cmVhbWR2TlYgKEdMdWludCB2aWRlb19jYXB0dXJlX3Nsb3QsIEdMdWludCBzdHJlYW0sIEdMZW51bSBwbmFtZSwgR0xkb3VibGUgKnBhcmFtcyk7CitHTEFQSSBHTGVudW0gQVBJRU5UUlkgZ2xWaWRlb0NhcHR1cmVOViAoR0x1aW50IHZpZGVvX2NhcHR1cmVfc2xvdCwgR0x1aW50ICpzZXF1ZW5jZV9udW0sIEdMdWludDY0RVhUICpjYXB0dXJlX3RpbWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZpZGVvQ2FwdHVyZVN0cmVhbVBhcmFtZXRlcml2TlYgKEdMdWludCB2aWRlb19jYXB0dXJlX3Nsb3QsIEdMdWludCBzdHJlYW0sIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmlkZW9DYXB0dXJlU3RyZWFtUGFyYW1ldGVyZnZOViAoR0x1aW50IHZpZGVvX2NhcHR1cmVfc2xvdCwgR0x1aW50IHN0cmVhbSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZpZGVvQ2FwdHVyZVN0cmVhbVBhcmFtZXRlcmR2TlYgKEdMdWludCB2aWRlb19jYXB0dXJlX3Nsb3QsIEdMdWludCBzdHJlYW0sIEdMZW51bSBwbmFtZSwgY29uc3QgR0xkb3VibGUgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCRUdJTlZJREVPQ0FQVFVSRU5WUFJPQykgKEdMdWludCB2aWRlb19jYXB0dXJlX3Nsb3QpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EVklERU9DQVBUVVJFU1RSRUFNQlVGRkVSTlZQUk9DKSAoR0x1aW50IHZpZGVvX2NhcHR1cmVfc2xvdCwgR0x1aW50IHN0cmVhbSwgR0xlbnVtIGZyYW1lX3JlZ2lvbiwgR0xpbnRwdHJBUkIgb2Zmc2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklORFZJREVPQ0FQVFVSRVNUUkVBTVRFWFRVUkVOVlBST0MpIChHTHVpbnQgdmlkZW9fY2FwdHVyZV9zbG90LCBHTHVpbnQgc3RyZWFtLCBHTGVudW0gZnJhbWVfcmVnaW9uLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVORFZJREVPQ0FQVFVSRU5WUFJPQykgKEdMdWludCB2aWRlb19jYXB0dXJlX3Nsb3QpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWSURFT0NBUFRVUkVJVk5WUFJPQykgKEdMdWludCB2aWRlb19jYXB0dXJlX3Nsb3QsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZJREVPQ0FQVFVSRVNUUkVBTUlWTlZQUk9DKSAoR0x1aW50IHZpZGVvX2NhcHR1cmVfc2xvdCwgR0x1aW50IHN0cmVhbSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVklERU9DQVBUVVJFU1RSRUFNRlZOVlBST0MpIChHTHVpbnQgdmlkZW9fY2FwdHVyZV9zbG90LCBHTHVpbnQgc3RyZWFtLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZJREVPQ0FQVFVSRVNUUkVBTURWTlZQUk9DKSAoR0x1aW50IHZpZGVvX2NhcHR1cmVfc2xvdCwgR0x1aW50IHN0cmVhbSwgR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSAqcGFyYW1zKTsKK3R5cGVkZWYgR0xlbnVtIChBUElFTlRSWVAgUEZOR0xWSURFT0NBUFRVUkVOVlBST0MpIChHTHVpbnQgdmlkZW9fY2FwdHVyZV9zbG90LCBHTHVpbnQgKnNlcXVlbmNlX251bSwgR0x1aW50NjRFWFQgKmNhcHR1cmVfdGltZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZJREVPQ0FQVFVSRVNUUkVBTVBBUkFNRVRFUklWTlZQUk9DKSAoR0x1aW50IHZpZGVvX2NhcHR1cmVfc2xvdCwgR0x1aW50IHN0cmVhbSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVklERU9DQVBUVVJFU1RSRUFNUEFSQU1FVEVSRlZOVlBST0MpIChHTHVpbnQgdmlkZW9fY2FwdHVyZV9zbG90LCBHTHVpbnQgc3RyZWFtLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZJREVPQ0FQVFVSRVNUUkVBTVBBUkFNRVRFUkRWTlZQUk9DKSAoR0x1aW50IHZpZGVvX2NhcHR1cmVfc2xvdCwgR0x1aW50IHN0cmVhbSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGRvdWJsZSAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2NvcHlfaW1hZ2UKKyNkZWZpbmUgR0xfTlZfY29weV9pbWFnZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlJbWFnZVN1YkRhdGFOViAoR0x1aW50IHNyY05hbWUsIEdMZW51bSBzcmNUYXJnZXQsIEdMaW50IHNyY0xldmVsLCBHTGludCBzcmNYLCBHTGludCBzcmNZLCBHTGludCBzcmNaLCBHTHVpbnQgZHN0TmFtZSwgR0xlbnVtIGRzdFRhcmdldCwgR0xpbnQgZHN0TGV2ZWwsIEdMaW50IGRzdFgsIEdMaW50IGRzdFksIEdMaW50IGRzdFosIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlJTUFHRVNVQkRBVEFOVlBST0MpIChHTHVpbnQgc3JjTmFtZSwgR0xlbnVtIHNyY1RhcmdldCwgR0xpbnQgc3JjTGV2ZWwsIEdMaW50IHNyY1gsIEdMaW50IHNyY1ksIEdMaW50IHNyY1osIEdMdWludCBkc3ROYW1lLCBHTGVudW0gZHN0VGFyZ2V0LCBHTGludCBkc3RMZXZlbCwgR0xpbnQgZHN0WCwgR0xpbnQgZHN0WSwgR0xpbnQgZHN0WiwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzCisjZGVmaW5lIEdMX0VYVF9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0cyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVzZVNoYWRlclByb2dyYW1FWFQgKEdMZW51bSB0eXBlLCBHTHVpbnQgcHJvZ3JhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWN0aXZlUHJvZ3JhbUVYVCAoR0x1aW50IHByb2dyYW0pOworR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsQ3JlYXRlU2hhZGVyUHJvZ3JhbUVYVCAoR0xlbnVtIHR5cGUsIGNvbnN0IEdMY2hhciAqc3RyaW5nKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVTRVNIQURFUlBST0dSQU1FWFRQUk9DKSAoR0xlbnVtIHR5cGUsIEdMdWludCBwcm9ncmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQUNUSVZFUFJPR1JBTUVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSk7Cit0eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMQ1JFQVRFU0hBREVSUFJPR1JBTUVYVFBST0MpIChHTGVudW0gdHlwZSwgY29uc3QgR0xjaGFyICpzdHJpbmcpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfcGFyYW1ldGVyX2J1ZmZlcl9vYmplY3QyCisjZGVmaW5lIEdMX05WX3BhcmFtZXRlcl9idWZmZXJfb2JqZWN0MiAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9zaGFkZXJfYnVmZmVyX2xvYWQKKyNkZWZpbmUgR0xfTlZfc2hhZGVyX2J1ZmZlcl9sb2FkIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWFrZUJ1ZmZlclJlc2lkZW50TlYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhY2Nlc3MpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1ha2VCdWZmZXJOb25SZXNpZGVudE5WIChHTGVudW0gdGFyZ2V0KTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzQnVmZmVyUmVzaWRlbnROViAoR0xlbnVtIHRhcmdldCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWFrZU5hbWVkQnVmZmVyUmVzaWRlbnROViAoR0x1aW50IGJ1ZmZlciwgR0xlbnVtIGFjY2Vzcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWFrZU5hbWVkQnVmZmVyTm9uUmVzaWRlbnROViAoR0x1aW50IGJ1ZmZlcik7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc05hbWVkQnVmZmVyUmVzaWRlbnROViAoR0x1aW50IGJ1ZmZlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QnVmZmVyUGFyYW1ldGVydWk2NHZOViAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQ2NEVYVCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXROYW1lZEJ1ZmZlclBhcmFtZXRlcnVpNjR2TlYgKEdMdWludCBidWZmZXIsIEdMZW51bSBwbmFtZSwgR0x1aW50NjRFWFQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SW50ZWdlcnVpNjR2TlYgKEdMZW51bSB2YWx1ZSwgR0x1aW50NjRFWFQgKnJlc3VsdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybXVpNjROViAoR0xpbnQgbG9jYXRpb24sIEdMdWludDY0RVhUIHZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtdWk2NHZOViAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludDY0RVhUICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VW5pZm9ybXVpNjR2TlYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50NjRFWFQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm11aTY0TlYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50NjRFWFQgdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtdWk2NHZOViAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQ2NEVYVCAqdmFsdWUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFLRUJVRkZFUlJFU0lERU5UTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGFjY2Vzcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BS0VCVUZGRVJOT05SRVNJREVOVE5WUFJPQykgKEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTQlVGRkVSUkVTSURFTlROVlBST0MpIChHTGVudW0gdGFyZ2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFLRU5BTUVEQlVGRkVSUkVTSURFTlROVlBST0MpIChHTHVpbnQgYnVmZmVyLCBHTGVudW0gYWNjZXNzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFLRU5BTUVEQlVGRkVSTk9OUkVTSURFTlROVlBST0MpIChHTHVpbnQgYnVmZmVyKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU05BTUVEQlVGRkVSUkVTSURFTlROVlBST0MpIChHTHVpbnQgYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQlVGRkVSUEFSQU1FVEVSVUk2NFZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdWludDY0RVhUICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVROQU1FREJVRkZFUlBBUkFNRVRFUlVJNjRWTlZQUk9DKSAoR0x1aW50IGJ1ZmZlciwgR0xlbnVtIHBuYW1lLCBHTHVpbnQ2NEVYVCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSU5URUdFUlVJNjRWTlZQUk9DKSAoR0xlbnVtIHZhbHVlLCBHTHVpbnQ2NEVYVCAqcmVzdWx0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STVVJNjROVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0x1aW50NjRFWFQgdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNVUk2NFZOVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50NjRFWFQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVU5JRk9STVVJNjRWTlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQ2NEVYVCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1VSTY0TlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQ2NEVYVCB2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNVUk2NFZOVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludDY0RVhUICp2YWx1ZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfYnVmZmVyX3VuaWZpZWRfbWVtb3J5CisjZGVmaW5lIEdMX05WX3ZlcnRleF9idWZmZXJfdW5pZmllZF9tZW1vcnkgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCdWZmZXJBZGRyZXNzUmFuZ2VOViAoR0xlbnVtIHBuYW1lLCBHTHVpbnQgaW5kZXgsIEdMdWludDY0RVhUIGFkZHJlc3MsIEdMc2l6ZWlwdHIgbGVuZ3RoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhGb3JtYXROViAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxGb3JtYXROViAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvckZvcm1hdE5WIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEluZGV4Rm9ybWF0TlYgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmRGb3JtYXROViAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFZGdlRmxhZ0Zvcm1hdE5WIChHTHNpemVpIHN0cmlkZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3JGb3JtYXROViAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZEZvcm1hdE5WIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkZvcm1hdE5WIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYklGb3JtYXROViAoR0x1aW50IGluZGV4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEludGVnZXJ1aTY0aV92TlYgKEdMZW51bSB2YWx1ZSwgR0x1aW50IGluZGV4LCBHTHVpbnQ2NEVYVCAqcmVzdWx0KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJVRkZFUkFERFJFU1NSQU5HRU5WUFJPQykgKEdMZW51bSBwbmFtZSwgR0x1aW50IGluZGV4LCBHTHVpbnQ2NEVYVCBhZGRyZXNzLCBHTHNpemVpcHRyIGxlbmd0aCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEZPUk1BVE5WUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTEZPUk1BVE5WUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SRk9STUFUTlZQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSU5ERVhGT1JNQVROVlBST0MpIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SREZPUk1BVE5WUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVER0VGTEFHRk9STUFUTlZQUk9DKSAoR0xzaXplaSBzdHJpZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUkZPUk1BVE5WUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZPR0NPT1JERk9STUFUTlZQUk9DKSAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCRk9STUFUTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSUZPUk1BVE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSU5URUdFUlVJNjRJX1ZOVlBST0MpIChHTGVudW0gdmFsdWUsIEdMdWludCBpbmRleCwgR0x1aW50NjRFWFQgKnJlc3VsdCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXh0dXJlX2JhcnJpZXIKKyNkZWZpbmUgR0xfTlZfdGV4dHVyZV9iYXJyaWVyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZUJhcnJpZXJOViAodm9pZCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhUVVJFQkFSUklFUk5WUFJPQykgKHZvaWQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX3NoYWRlcl9zdGVuY2lsX2V4cG9ydAorI2RlZmluZSBHTF9BTURfc2hhZGVyX3N0ZW5jaWxfZXhwb3J0IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FNRF9zZWFtbGVzc19jdWJlbWFwX3Blcl90ZXh0dXJlCisjZGVmaW5lIEdMX0FNRF9zZWFtbGVzc19jdWJlbWFwX3Blcl90ZXh0dXJlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FNRF9jb25zZXJ2YXRpdmVfZGVwdGgKKyNkZWZpbmUgR0xfQU1EX2NvbnNlcnZhdGl2ZV9kZXB0aCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc2hhZGVyX2ltYWdlX2xvYWRfc3RvcmUKKyNkZWZpbmUgR0xfRVhUX3NoYWRlcl9pbWFnZV9sb2FkX3N0b3JlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEltYWdlVGV4dHVyZUVYVCAoR0x1aW50IGluZGV4LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMYm9vbGVhbiBsYXllcmVkLCBHTGludCBsYXllciwgR0xlbnVtIGFjY2VzcywgR0xpbnQgZm9ybWF0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNZW1vcnlCYXJyaWVyRVhUIChHTGJpdGZpZWxkIGJhcnJpZXJzKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRJTUFHRVRFWFRVUkVFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMYm9vbGVhbiBsYXllcmVkLCBHTGludCBsYXllciwgR0xlbnVtIGFjY2VzcywgR0xpbnQgZm9ybWF0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUVNT1JZQkFSUklFUkVYVFBST0MpIChHTGJpdGZpZWxkIGJhcnJpZXJzKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF92ZXJ0ZXhfYXR0cmliXzY0Yml0CisjZGVmaW5lIEdMX0VYVF92ZXJ0ZXhfYXR0cmliXzY0Yml0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliTDFkRVhUIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkwyZEVYVCAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMM2RFWFQgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliTDRkRVhUIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkwxZHZFWFQgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkwyZHZFWFQgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkwzZHZFWFQgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkw0ZHZFWFQgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkxQb2ludGVyRVhUIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJMZHZFWFQgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBcnJheVZlcnRleEF0dHJpYkxPZmZzZXRFWFQgKEdMdWludCB2YW9iaiwgR0x1aW50IGJ1ZmZlciwgR0x1aW50IGluZGV4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50cHRyIG9mZnNldCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMMURFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDJERVhUUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkwzREVYVFBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMNERFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDFEVkVYVFBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDJEVkVYVFBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDNEVkVYVFBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDREVkVYVFBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTFBPSU5URVJFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQkxEVkVYVFBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xkb3VibGUgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFSUkFZVkVSVEVYQVRUUklCTE9GRlNFVEVYVFBST0MpIChHTHVpbnQgdmFvYmosIEdMdWludCBidWZmZXIsIEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTGludHB0ciBvZmZzZXQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZ3B1X3Byb2dyYW01CisjZGVmaW5lIEdMX05WX2dwdV9wcm9ncmFtNSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1TdWJyb3V0aW5lUGFyYW1ldGVyc3Vpdk5WIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbVN1YnJvdXRpbmVQYXJhbWV0ZXJ1aXZOViAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgKnBhcmFtKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1TVUJST1VUSU5FUEFSQU1FVEVSU1VJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTVNVQlJPVVRJTkVQQVJBTUVURVJVSVZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCAqcGFyYW0pOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZ3B1X3NoYWRlcjUKKyNkZWZpbmUgR0xfTlZfZ3B1X3NoYWRlcjUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMWk2NE5WIChHTGludCBsb2NhdGlvbiwgR0xpbnQ2NEVYVCB4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMmk2NE5WIChHTGludCBsb2NhdGlvbiwgR0xpbnQ2NEVYVCB4LCBHTGludDY0RVhUIHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0zaTY0TlYgKEdMaW50IGxvY2F0aW9uLCBHTGludDY0RVhUIHgsIEdMaW50NjRFWFQgeSwgR0xpbnQ2NEVYVCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNGk2NE5WIChHTGludCBsb2NhdGlvbiwgR0xpbnQ2NEVYVCB4LCBHTGludDY0RVhUIHksIEdMaW50NjRFWFQgeiwgR0xpbnQ2NEVYVCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMWk2NHZOViAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50NjRFWFQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMmk2NHZOViAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50NjRFWFQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM2k2NHZOViAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50NjRFWFQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNGk2NHZOViAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50NjRFWFQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMXVpNjROViAoR0xpbnQgbG9jYXRpb24sIEdMdWludDY0RVhUIHgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0ydWk2NE5WIChHTGludCBsb2NhdGlvbiwgR0x1aW50NjRFWFQgeCwgR0x1aW50NjRFWFQgeSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTN1aTY0TlYgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQ2NEVYVCB4LCBHTHVpbnQ2NEVYVCB5LCBHTHVpbnQ2NEVYVCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNHVpNjROViAoR0xpbnQgbG9jYXRpb24sIEdMdWludDY0RVhUIHgsIEdMdWludDY0RVhUIHksIEdMdWludDY0RVhUIHosIEdMdWludDY0RVhUIHcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0xdWk2NHZOViAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludDY0RVhUICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJ1aTY0dk5WIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50NjRFWFQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM3VpNjR2TlYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQ2NEVYVCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm00dWk2NHZOViAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludDY0RVhUICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VW5pZm9ybWk2NHZOViAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludDY0RVhUICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMWk2NE5WIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50NjRFWFQgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0yaTY0TlYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQ2NEVYVCB4LCBHTGludDY0RVhUIHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM2k2NE5WIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50NjRFWFQgeCwgR0xpbnQ2NEVYVCB5LCBHTGludDY0RVhUIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtNGk2NE5WIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50NjRFWFQgeCwgR0xpbnQ2NEVYVCB5LCBHTGludDY0RVhUIHosIEdMaW50NjRFWFQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xaTY0dk5WIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50NjRFWFQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJpNjR2TlYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQ2NEVYVCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM2k2NHZOViAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludDY0RVhUICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00aTY0dk5WIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50NjRFWFQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTF1aTY0TlYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50NjRFWFQgeCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0ydWk2NE5WIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludDY0RVhUIHgsIEdMdWludDY0RVhUIHkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM3VpNjROViAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQ2NEVYVCB4LCBHTHVpbnQ2NEVYVCB5LCBHTHVpbnQ2NEVYVCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTR1aTY0TlYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50NjRFWFQgeCwgR0x1aW50NjRFWFQgeSwgR0x1aW50NjRFWFQgeiwgR0x1aW50NjRFWFQgdyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xdWk2NHZOViAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQ2NEVYVCAqdmFsdWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMnVpNjR2TlYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50NjRFWFQgKnZhbHVlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTN1aTY0dk5WIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludDY0RVhUICp2YWx1ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00dWk2NHZOViAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQ2NEVYVCAqdmFsdWUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFJNjROVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xpbnQ2NEVYVCB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJJNjROVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xpbnQ2NEVYVCB4LCBHTGludDY0RVhUIHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM0k2NE5WUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGludDY0RVhUIHgsIEdMaW50NjRFWFQgeSwgR0xpbnQ2NEVYVCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRJNjROVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xpbnQ2NEVYVCB4LCBHTGludDY0RVhUIHksIEdMaW50NjRFWFQgeiwgR0xpbnQ2NEVYVCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFJNjRWTlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50NjRFWFQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJJNjRWTlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50NjRFWFQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNJNjRWTlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50NjRFWFQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRJNjRWTlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50NjRFWFQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFVSTY0TlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMdWludDY0RVhUIHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMlVJNjROVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0x1aW50NjRFWFQgeCwgR0x1aW50NjRFWFQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0zVUk2NE5WUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQ2NEVYVCB4LCBHTHVpbnQ2NEVYVCB5LCBHTHVpbnQ2NEVYVCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRVSTY0TlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMdWludDY0RVhUIHgsIEdMdWludDY0RVhUIHksIEdMdWludDY0RVhUIHosIEdMdWludDY0RVhUIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMVVJNjRWTlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludDY0RVhUICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0yVUk2NFZOVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50NjRFWFQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNVSTY0Vk5WUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQ2NEVYVCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNFVJNjRWTlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludDY0RVhUICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFVOSUZPUk1JNjRWTlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludDY0RVhUICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTFJNjROVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50NjRFWFQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMkk2NE5WUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQ2NEVYVCB4LCBHTGludDY0RVhUIHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTNJNjROVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50NjRFWFQgeCwgR0xpbnQ2NEVYVCB5LCBHTGludDY0RVhUIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTRJNjROVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50NjRFWFQgeCwgR0xpbnQ2NEVYVCB5LCBHTGludDY0RVhUIHosIEdMaW50NjRFWFQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMUk2NFZOVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50NjRFWFQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0ySTY0Vk5WUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQ2NEVYVCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTNJNjRWTlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludDY0RVhUICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNNEk2NFZOVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50NjRFWFQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0xVUk2NE5WUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50NjRFWFQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMlVJNjROVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludDY0RVhUIHgsIEdMdWludDY0RVhUIHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTNVSTY0TlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQ2NEVYVCB4LCBHTHVpbnQ2NEVYVCB5LCBHTHVpbnQ2NEVYVCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk00VUk2NE5WUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50NjRFWFQgeCwgR0x1aW50NjRFWFQgeSwgR0x1aW50NjRFWFQgeiwgR0x1aW50NjRFWFQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMVVJNjRWTlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQ2NEVYVCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTJVSTY0Vk5WUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50NjRFWFQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0zVUk2NFZOVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludDY0RVhUICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNNFVJNjRWTlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQ2NEVYVCAqdmFsdWUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfc2hhZGVyX2J1ZmZlcl9zdG9yZQorI2RlZmluZSBHTF9OVl9zaGFkZXJfYnVmZmVyX3N0b3JlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3Rlc3NlbGxhdGlvbl9wcm9ncmFtNQorI2RlZmluZSBHTF9OVl90ZXNzZWxsYXRpb25fcHJvZ3JhbTUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X2F0dHJpYl9pbnRlZ2VyXzY0Yml0CisjZGVmaW5lIEdMX05WX3ZlcnRleF9hdHRyaWJfaW50ZWdlcl82NGJpdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkwxaTY0TlYgKEdMdWludCBpbmRleCwgR0xpbnQ2NEVYVCB4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMMmk2NE5WIChHTHVpbnQgaW5kZXgsIEdMaW50NjRFWFQgeCwgR0xpbnQ2NEVYVCB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMM2k2NE5WIChHTHVpbnQgaW5kZXgsIEdMaW50NjRFWFQgeCwgR0xpbnQ2NEVYVCB5LCBHTGludDY0RVhUIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkw0aTY0TlYgKEdMdWludCBpbmRleCwgR0xpbnQ2NEVYVCB4LCBHTGludDY0RVhUIHksIEdMaW50NjRFWFQgeiwgR0xpbnQ2NEVYVCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMMWk2NHZOViAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludDY0RVhUICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMMmk2NHZOViAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludDY0RVhUICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMM2k2NHZOViAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludDY0RVhUICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMNGk2NHZOViAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludDY0RVhUICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMMXVpNjROViAoR0x1aW50IGluZGV4LCBHTHVpbnQ2NEVYVCB4KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMMnVpNjROViAoR0x1aW50IGluZGV4LCBHTHVpbnQ2NEVYVCB4LCBHTHVpbnQ2NEVYVCB5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMM3VpNjROViAoR0x1aW50IGluZGV4LCBHTHVpbnQ2NEVYVCB4LCBHTHVpbnQ2NEVYVCB5LCBHTHVpbnQ2NEVYVCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMNHVpNjROViAoR0x1aW50IGluZGV4LCBHTHVpbnQ2NEVYVCB4LCBHTHVpbnQ2NEVYVCB5LCBHTHVpbnQ2NEVYVCB6LCBHTHVpbnQ2NEVYVCB3KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMMXVpNjR2TlYgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50NjRFWFQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkwydWk2NHZOViAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQ2NEVYVCAqdik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliTDN1aTY0dk5WIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludDY0RVhUICp2KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJMNHVpNjR2TlYgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50NjRFWFQgKnYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYkxpNjR2TlYgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludDY0RVhUICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYkx1aTY0dk5WIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0x1aW50NjRFWFQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliTEZvcm1hdE5WIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMMUk2NE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQ2NEVYVCB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDJJNjROVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50NjRFWFQgeCwgR0xpbnQ2NEVYVCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDNJNjROVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50NjRFWFQgeCwgR0xpbnQ2NEVYVCB5LCBHTGludDY0RVhUIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMNEk2NE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQ2NEVYVCB4LCBHTGludDY0RVhUIHksIEdMaW50NjRFWFQgeiwgR0xpbnQ2NEVYVCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDFJNjRWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludDY0RVhUICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDJJNjRWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludDY0RVhUICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDNJNjRWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludDY0RVhUICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDRJNjRWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludDY0RVhUICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDFVSTY0TlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVpbnQ2NEVYVCB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDJVSTY0TlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVpbnQ2NEVYVCB4LCBHTHVpbnQ2NEVYVCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDNVSTY0TlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVpbnQ2NEVYVCB4LCBHTHVpbnQ2NEVYVCB5LCBHTHVpbnQ2NEVYVCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDRVSTY0TlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVpbnQ2NEVYVCB4LCBHTHVpbnQ2NEVYVCB5LCBHTHVpbnQ2NEVYVCB6LCBHTHVpbnQ2NEVYVCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDFVSTY0Vk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50NjRFWFQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJMMlVJNjRWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQ2NEVYVCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkwzVUk2NFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludDY0RVhUICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCTDRVSTY0Vk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50NjRFWFQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJMSTY0Vk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludDY0RVhUICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJMVUk2NFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0x1aW50NjRFWFQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkxGT1JNQVROVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9tdWx0aXNhbXBsZV9jb3ZlcmFnZQorI2RlZmluZSBHTF9OVl9tdWx0aXNhbXBsZV9jb3ZlcmFnZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BTURfbmFtZV9nZW5fZGVsZXRlCisjZGVmaW5lIEdMX0FNRF9uYW1lX2dlbl9kZWxldGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5OYW1lc0FNRCAoR0xlbnVtIGlkZW50aWZpZXIsIEdMdWludCBudW0sIEdMdWludCAqbmFtZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZU5hbWVzQU1EIChHTGVudW0gaWRlbnRpZmllciwgR0x1aW50IG51bSwgY29uc3QgR0x1aW50ICpuYW1lcyk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc05hbWVBTUQgKEdMZW51bSBpZGVudGlmaWVyLCBHTHVpbnQgbmFtZSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5OQU1FU0FNRFBST0MpIChHTGVudW0gaWRlbnRpZmllciwgR0x1aW50IG51bSwgR0x1aW50ICpuYW1lcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURU5BTUVTQU1EUFJPQykgKEdMZW51bSBpZGVudGlmaWVyLCBHTHVpbnQgbnVtLCBjb25zdCBHTHVpbnQgKm5hbWVzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU05BTUVBTURQUk9DKSAoR0xlbnVtIGlkZW50aWZpZXIsIEdMdWludCBuYW1lKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FNRF9kZWJ1Z19vdXRwdXQKKyNkZWZpbmUgR0xfQU1EX2RlYnVnX291dHB1dCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlYnVnTWVzc2FnZUVuYWJsZUFNRCAoR0xlbnVtIGNhdGVnb3J5LCBHTGVudW0gc2V2ZXJpdHksIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqaWRzLCBHTGJvb2xlYW4gZW5hYmxlZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVidWdNZXNzYWdlSW5zZXJ0QU1EIChHTGVudW0gY2F0ZWdvcnksIEdMZW51bSBzZXZlcml0eSwgR0x1aW50IGlkLCBHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICpidWYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlYnVnTWVzc2FnZUNhbGxiYWNrQU1EIChHTERFQlVHUFJPQ0FNRCBjYWxsYmFjaywgR0x2b2lkICp1c2VyUGFyYW0pOworR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsR2V0RGVidWdNZXNzYWdlTG9nQU1EIChHTHVpbnQgY291bnQsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xlbnVtICpjYXRlZ29yaWVzLCBHTHVpbnQgKnNldmVyaXRpZXMsIEdMdWludCAqaWRzLCBHTHNpemVpICpsZW5ndGhzLCBHTGNoYXIgKm1lc3NhZ2UpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVCVUdNRVNTQUdFRU5BQkxFQU1EUFJPQykgKEdMZW51bSBjYXRlZ29yeSwgR0xlbnVtIHNldmVyaXR5LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKmlkcywgR0xib29sZWFuIGVuYWJsZWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUJVR01FU1NBR0VJTlNFUlRBTURQUk9DKSAoR0xlbnVtIGNhdGVnb3J5LCBHTGVudW0gc2V2ZXJpdHksIEdMdWludCBpZCwgR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqYnVmKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVCVUdNRVNTQUdFQ0FMTEJBQ0tBTURQUk9DKSAoR0xERUJVR1BST0NBTUQgY2FsbGJhY2ssIEdMdm9pZCAqdXNlclBhcmFtKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xHRVRERUJVR01FU1NBR0VMT0dBTURQUk9DKSAoR0x1aW50IGNvdW50LCBHTHNpemVpIGJ1ZnNpemUsIEdMZW51bSAqY2F0ZWdvcmllcywgR0x1aW50ICpzZXZlcml0aWVzLCBHTHVpbnQgKmlkcywgR0xzaXplaSAqbGVuZ3RocywgR0xjaGFyICptZXNzYWdlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZkcGF1X2ludGVyb3AKKyNkZWZpbmUgR0xfTlZfdmRwYXVfaW50ZXJvcCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZEUEFVSW5pdE5WIChjb25zdCBHTHZvaWQgKnZkcERldmljZSwgY29uc3QgR0x2b2lkICpnZXRQcm9jQWRkcmVzcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVkRQQVVGaW5pTlYgKHZvaWQpOworR0xBUEkgR0x2ZHBhdVN1cmZhY2VOViBBUElFTlRSWSBnbFZEUEFVUmVnaXN0ZXJWaWRlb1N1cmZhY2VOViAoR0x2b2lkICp2ZHBTdXJmYWNlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG51bVRleHR1cmVOYW1lcywgY29uc3QgR0x1aW50ICp0ZXh0dXJlTmFtZXMpOworR0xBUEkgR0x2ZHBhdVN1cmZhY2VOViBBUElFTlRSWSBnbFZEUEFVUmVnaXN0ZXJPdXRwdXRTdXJmYWNlTlYgKEdMdm9pZCAqdmRwU3VyZmFjZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBudW1UZXh0dXJlTmFtZXMsIGNvbnN0IEdMdWludCAqdGV4dHVyZU5hbWVzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWRFBBVUlzU3VyZmFjZU5WIChHTHZkcGF1U3VyZmFjZU5WIHN1cmZhY2UpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZEUEFVVW5yZWdpc3RlclN1cmZhY2VOViAoR0x2ZHBhdVN1cmZhY2VOViBzdXJmYWNlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWRFBBVUdldFN1cmZhY2Vpdk5WIChHTHZkcGF1U3VyZmFjZU5WIHN1cmZhY2UsIEdMZW51bSBwbmFtZSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICp2YWx1ZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZEUEFVU3VyZmFjZUFjY2Vzc05WIChHTHZkcGF1U3VyZmFjZU5WIHN1cmZhY2UsIEdMZW51bSBhY2Nlc3MpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZEUEFVTWFwU3VyZmFjZXNOViAoR0xzaXplaSBudW1TdXJmYWNlcywgY29uc3QgR0x2ZHBhdVN1cmZhY2VOViAqc3VyZmFjZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZEUEFVVW5tYXBTdXJmYWNlc05WIChHTHNpemVpIG51bVN1cmZhY2UsIGNvbnN0IEdMdmRwYXVTdXJmYWNlTlYgKnN1cmZhY2VzKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZEUEFVSU5JVE5WUFJPQykgKGNvbnN0IEdMdm9pZCAqdmRwRGV2aWNlLCBjb25zdCBHTHZvaWQgKmdldFByb2NBZGRyZXNzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkRQQVVGSU5JTlZQUk9DKSAodm9pZCk7Cit0eXBlZGVmIEdMdmRwYXVTdXJmYWNlTlYgKEFQSUVOVFJZUCBQRk5HTFZEUEFVUkVHSVNURVJWSURFT1NVUkZBQ0VOVlBST0MpIChHTHZvaWQgKnZkcFN1cmZhY2UsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbnVtVGV4dHVyZU5hbWVzLCBjb25zdCBHTHVpbnQgKnRleHR1cmVOYW1lcyk7Cit0eXBlZGVmIEdMdmRwYXVTdXJmYWNlTlYgKEFQSUVOVFJZUCBQRk5HTFZEUEFVUkVHSVNURVJPVVRQVVRTVVJGQUNFTlZQUk9DKSAoR0x2b2lkICp2ZHBTdXJmYWNlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG51bVRleHR1cmVOYW1lcywgY29uc3QgR0x1aW50ICp0ZXh0dXJlTmFtZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRFBBVUlTU1VSRkFDRU5WUFJPQykgKEdMdmRwYXVTdXJmYWNlTlYgc3VyZmFjZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZEUEFVVU5SRUdJU1RFUlNVUkZBQ0VOVlBST0MpIChHTHZkcGF1U3VyZmFjZU5WIHN1cmZhY2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRFBBVUdFVFNVUkZBQ0VJVk5WUFJPQykgKEdMdmRwYXVTdXJmYWNlTlYgc3VyZmFjZSwgR0xlbnVtIHBuYW1lLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xpbnQgKnZhbHVlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZEUEFVU1VSRkFDRUFDQ0VTU05WUFJPQykgKEdMdmRwYXVTdXJmYWNlTlYgc3VyZmFjZSwgR0xlbnVtIGFjY2Vzcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZEUEFVTUFQU1VSRkFDRVNOVlBST0MpIChHTHNpemVpIG51bVN1cmZhY2VzLCBjb25zdCBHTHZkcGF1U3VyZmFjZU5WICpzdXJmYWNlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZEUEFVVU5NQVBTVVJGQUNFU05WUFJPQykgKEdMc2l6ZWkgbnVtU3VyZmFjZSwgY29uc3QgR0x2ZHBhdVN1cmZhY2VOViAqc3VyZmFjZXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX3RyYW5zZm9ybV9mZWVkYmFjazNfbGluZXNfdHJpYW5nbGVzCisjZGVmaW5lIEdMX0FNRF90cmFuc2Zvcm1fZmVlZGJhY2szX2xpbmVzX3RyaWFuZ2xlcyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BTURfZGVwdGhfY2xhbXBfc2VwYXJhdGUKKyNkZWZpbmUgR0xfQU1EX2RlcHRoX2NsYW1wX3NlcGFyYXRlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX3NSR0JfZGVjb2RlCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX3NSR0JfZGVjb2RlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xfTlZfdGV4dHVyZV9tdWx0aXNhbXBsZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEltYWdlMkRNdWx0aXNhbXBsZUNvdmVyYWdlTlYgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgY292ZXJhZ2VTYW1wbGVzLCBHTHNpemVpIGNvbG9yU2FtcGxlcywgR0xpbnQgaW50ZXJuYWxGb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGJvb2xlYW4gZml4ZWRTYW1wbGVMb2NhdGlvbnMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEltYWdlM0RNdWx0aXNhbXBsZUNvdmVyYWdlTlYgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgY292ZXJhZ2VTYW1wbGVzLCBHTHNpemVpIGNvbG9yU2FtcGxlcywgR0xpbnQgaW50ZXJuYWxGb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGJvb2xlYW4gZml4ZWRTYW1wbGVMb2NhdGlvbnMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleHR1cmVJbWFnZTJETXVsdGlzYW1wbGVOViAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xpbnQgaW50ZXJuYWxGb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGJvb2xlYW4gZml4ZWRTYW1wbGVMb2NhdGlvbnMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleHR1cmVJbWFnZTNETXVsdGlzYW1wbGVOViAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xpbnQgaW50ZXJuYWxGb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGJvb2xlYW4gZml4ZWRTYW1wbGVMb2NhdGlvbnMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleHR1cmVJbWFnZTJETXVsdGlzYW1wbGVDb3ZlcmFnZU5WIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBjb3ZlcmFnZVNhbXBsZXMsIEdMc2l6ZWkgY29sb3JTYW1wbGVzLCBHTGludCBpbnRlcm5hbEZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMYm9vbGVhbiBmaXhlZFNhbXBsZUxvY2F0aW9ucyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZUltYWdlM0RNdWx0aXNhbXBsZUNvdmVyYWdlTlYgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGNvdmVyYWdlU2FtcGxlcywgR0xzaXplaSBjb2xvclNhbXBsZXMsIEdMaW50IGludGVybmFsRm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xib29sZWFuIGZpeGVkU2FtcGxlTG9jYXRpb25zKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWElNQUdFMkRNVUxUSVNBTVBMRUNPVkVSQUdFTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBjb3ZlcmFnZVNhbXBsZXMsIEdMc2l6ZWkgY29sb3JTYW1wbGVzLCBHTGludCBpbnRlcm5hbEZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMYm9vbGVhbiBmaXhlZFNhbXBsZUxvY2F0aW9ucyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWElNQUdFM0RNVUxUSVNBTVBMRUNPVkVSQUdFTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBjb3ZlcmFnZVNhbXBsZXMsIEdMc2l6ZWkgY29sb3JTYW1wbGVzLCBHTGludCBpbnRlcm5hbEZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMYm9vbGVhbiBmaXhlZFNhbXBsZUxvY2F0aW9ucyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVJTUFHRTJETVVMVElTQU1QTEVOVlBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGludCBpbnRlcm5hbEZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMYm9vbGVhbiBmaXhlZFNhbXBsZUxvY2F0aW9ucyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVJTUFHRTNETVVMVElTQU1QTEVOVlBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGludCBpbnRlcm5hbEZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMYm9vbGVhbiBmaXhlZFNhbXBsZUxvY2F0aW9ucyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVJTUFHRTJETVVMVElTQU1QTEVDT1ZFUkFHRU5WUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGNvdmVyYWdlU2FtcGxlcywgR0xzaXplaSBjb2xvclNhbXBsZXMsIEdMaW50IGludGVybmFsRm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xib29sZWFuIGZpeGVkU2FtcGxlTG9jYXRpb25zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRUlNQUdFM0RNVUxUSVNBTVBMRUNPVkVSQUdFTlZQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgY292ZXJhZ2VTYW1wbGVzLCBHTHNpemVpIGNvbG9yU2FtcGxlcywgR0xpbnQgaW50ZXJuYWxGb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGJvb2xlYW4gZml4ZWRTYW1wbGVMb2NhdGlvbnMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX2JsZW5kX21pbm1heF9mYWN0b3IKKyNkZWZpbmUgR0xfQU1EX2JsZW5kX21pbm1heF9mYWN0b3IgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX3NhbXBsZV9wb3NpdGlvbnMKKyNkZWZpbmUgR0xfQU1EX3NhbXBsZV9wb3NpdGlvbnMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZXRNdWx0aXNhbXBsZWZ2QU1EIChHTGVudW0gcG5hbWUsIEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdmFsKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFVE1VTFRJU0FNUExFRlZBTURQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnZhbCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfeDExX3N5bmNfb2JqZWN0CisjZGVmaW5lIEdMX0VYVF94MTFfc3luY19vYmplY3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIEdMc3luYyBBUElFTlRSWSBnbEltcG9ydFN5bmNFWFQgKEdMZW51bSBleHRlcm5hbF9zeW5jX3R5cGUsIEdMaW50cHRyIGV4dGVybmFsX3N5bmMsIEdMYml0ZmllbGQgZmxhZ3MpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0xzeW5jIChBUElFTlRSWVAgUEZOR0xJTVBPUlRTWU5DRVhUUFJPQykgKEdMZW51bSBleHRlcm5hbF9zeW5jX3R5cGUsIEdMaW50cHRyIGV4dGVybmFsX3N5bmMsIEdMYml0ZmllbGQgZmxhZ3MpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQU1EX211bHRpX2RyYXdfaW5kaXJlY3QKKyNkZWZpbmUgR0xfQU1EX211bHRpX2RyYXdfaW5kaXJlY3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aURyYXdBcnJheXNJbmRpcmVjdEFNRCAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMdm9pZCAqaW5kaXJlY3QsIEdMc2l6ZWkgcHJpbWNvdW50LCBHTHNpemVpIHN0cmlkZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlEcmF3RWxlbWVudHNJbmRpcmVjdEFNRCAoR0xlbnVtIG1vZGUsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGlyZWN0LCBHTHNpemVpIHByaW1jb3VudCwgR0xzaXplaSBzdHJpZGUpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElEUkFXQVJSQVlTSU5ESVJFQ1RBTURQUk9DKSAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMdm9pZCAqaW5kaXJlY3QsIEdMc2l6ZWkgcHJpbWNvdW50LCBHTHNpemVpIHN0cmlkZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJRFJBV0VMRU1FTlRTSU5ESVJFQ1RBTURQUk9DKSAoR0xlbnVtIG1vZGUsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGlyZWN0LCBHTHNpemVpIHByaW1jb3VudCwgR0xzaXplaSBzdHJpZGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlX2JsaXRfc2NhbGVkCisjZGVmaW5lIEdMX0VYVF9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZV9ibGl0X3NjYWxlZCAxCisjZW5kaWYKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvZ2x4LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL0dML2dseC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYTdkOTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL0dML2dseC5oCkBAIC0wLDAgKzEsNTI2IEBACisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICogVmVyc2lvbjogIDYuNQorICogCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBCUklBTiBQQVVMIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworCisjaWZuZGVmIEdMWF9ICisjZGVmaW5lIEdMWF9ICisKKworI2lmZGVmIF9fVk1TCisjaW5jbHVkZSA8R0wvdm1zX3hfZml4Lmg+CisjIGlmZGVmIF9fY3BsdXNwbHVzCisvKiBWTVMgWGxpYi5oIGdpdmVzIHByb2JsZW1zIHdpdGggQysrLgorICogdGhpcyBhdm9pZHMgYSBidW5jaCBvZiB0cml2aWFsIHdhcm5pbmdzICovCisjcHJhZ21hIG1lc3NhZ2UgZGlzYWJsZSBub3NpbXBpbnQKKyNlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KKyNpZmRlZiBfX1ZNUworIyBpZmRlZiBfX2NwbHVzcGx1cworI3ByYWdtYSBtZXNzYWdlIGVuYWJsZSBub3NpbXBpbnQKKyNlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8R0wvZ2wuaD4KKworCisjaWYgZGVmaW5lZChVU0VfTUdMX05BTUVTUEFDRSkKKyNpbmNsdWRlICJnbHhfbWFuZ2xlLmgiCisjZW5kaWYKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworI2RlZmluZSBHTFhfVkVSU0lPTl8xXzEJCTEKKyNkZWZpbmUgR0xYX1ZFUlNJT05fMV8yCQkxCisjZGVmaW5lIEdMWF9WRVJTSU9OXzFfMwkJMQorI2RlZmluZSBHTFhfVkVSU0lPTl8xXzQJCTEKKworI2RlZmluZSBHTFhfRVhURU5TSU9OX05BTUUgICAiR0xYIgorCisKKworLyoKKyAqIFRva2VucyBmb3IgZ2xYQ2hvb3NlVmlzdWFsIGFuZCBnbFhHZXRDb25maWc6CisgKi8KKyNkZWZpbmUgR0xYX1VTRV9HTAkJMQorI2RlZmluZSBHTFhfQlVGRkVSX1NJWkUJCTIKKyNkZWZpbmUgR0xYX0xFVkVMCQkzCisjZGVmaW5lIEdMWF9SR0JBCQk0CisjZGVmaW5lIEdMWF9ET1VCTEVCVUZGRVIJNQorI2RlZmluZSBHTFhfU1RFUkVPCQk2CisjZGVmaW5lIEdMWF9BVVhfQlVGRkVSUwkJNworI2RlZmluZSBHTFhfUkVEX1NJWkUJCTgKKyNkZWZpbmUgR0xYX0dSRUVOX1NJWkUJCTkKKyNkZWZpbmUgR0xYX0JMVUVfU0laRQkJMTAKKyNkZWZpbmUgR0xYX0FMUEhBX1NJWkUJCTExCisjZGVmaW5lIEdMWF9ERVBUSF9TSVpFCQkxMgorI2RlZmluZSBHTFhfU1RFTkNJTF9TSVpFCTEzCisjZGVmaW5lIEdMWF9BQ0NVTV9SRURfU0laRQkxNAorI2RlZmluZSBHTFhfQUNDVU1fR1JFRU5fU0laRQkxNQorI2RlZmluZSBHTFhfQUNDVU1fQkxVRV9TSVpFCTE2CisjZGVmaW5lIEdMWF9BQ0NVTV9BTFBIQV9TSVpFCTE3CisKKworLyoKKyAqIEVycm9yIGNvZGVzIHJldHVybmVkIGJ5IGdsWEdldENvbmZpZzoKKyAqLworI2RlZmluZSBHTFhfQkFEX1NDUkVFTgkJMQorI2RlZmluZSBHTFhfQkFEX0FUVFJJQlVURQkyCisjZGVmaW5lIEdMWF9OT19FWFRFTlNJT04JMworI2RlZmluZSBHTFhfQkFEX1ZJU1VBTAkJNAorI2RlZmluZSBHTFhfQkFEX0NPTlRFWFQJCTUKKyNkZWZpbmUgR0xYX0JBRF9WQUxVRSAgICAgICAJNgorI2RlZmluZSBHTFhfQkFEX0VOVU0JCTcKKworCisvKgorICogR0xYIDEuMSBhbmQgbGF0ZXI6CisgKi8KKyNkZWZpbmUgR0xYX1ZFTkRPUgkJMQorI2RlZmluZSBHTFhfVkVSU0lPTgkJMgorI2RlZmluZSBHTFhfRVhURU5TSU9OUyAJCTMKKworCisvKgorICogR0xYIDEuMyBhbmQgbGF0ZXI6CisgKi8KKyNkZWZpbmUgR0xYX0NPTkZJR19DQVZFQVQJCTB4MjAKKyNkZWZpbmUgR0xYX0RPTlRfQ0FSRQkJCTB4RkZGRkZGRkYKKyNkZWZpbmUgR0xYX1hfVklTVUFMX1RZUEUJCTB4MjIKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX1RZUEUJCTB4MjMKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX0lOREVYX1ZBTFVFCTB4MjQKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX1JFRF9WQUxVRQkweDI1CisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRQkweDI2CisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFCTB4MjcKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX0FMUEhBX1ZBTFVFCTB4MjgKKyNkZWZpbmUgR0xYX1dJTkRPV19CSVQJCQkweDAwMDAwMDAxCisjZGVmaW5lIEdMWF9QSVhNQVBfQklUCQkJMHgwMDAwMDAwMgorI2RlZmluZSBHTFhfUEJVRkZFUl9CSVQJCQkweDAwMDAwMDA0CisjZGVmaW5lIEdMWF9BVVhfQlVGRkVSU19CSVQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgR0xYX0ZST05UX0xFRlRfQlVGRkVSX0JJVAkweDAwMDAwMDAxCisjZGVmaW5lIEdMWF9GUk9OVF9SSUdIVF9CVUZGRVJfQklUCTB4MDAwMDAwMDIKKyNkZWZpbmUgR0xYX0JBQ0tfTEVGVF9CVUZGRVJfQklUCTB4MDAwMDAwMDQKKyNkZWZpbmUgR0xYX0JBQ0tfUklHSFRfQlVGRkVSX0JJVAkweDAwMDAwMDA4CisjZGVmaW5lIEdMWF9ERVBUSF9CVUZGRVJfQklUCQkweDAwMDAwMDIwCisjZGVmaW5lIEdMWF9TVEVOQ0lMX0JVRkZFUl9CSVQJCTB4MDAwMDAwNDAKKyNkZWZpbmUgR0xYX0FDQ1VNX0JVRkZFUl9CSVQJCTB4MDAwMDAwODAKKyNkZWZpbmUgR0xYX05PTkUJCQkweDgwMDAKKyNkZWZpbmUgR0xYX1NMT1dfQ09ORklHCQkJMHg4MDAxCisjZGVmaW5lIEdMWF9UUlVFX0NPTE9SCQkJMHg4MDAyCisjZGVmaW5lIEdMWF9ESVJFQ1RfQ09MT1IJCTB4ODAwMworI2RlZmluZSBHTFhfUFNFVURPX0NPTE9SCQkweDgwMDQKKyNkZWZpbmUgR0xYX1NUQVRJQ19DT0xPUgkJMHg4MDA1CisjZGVmaW5lIEdMWF9HUkFZX1NDQUxFCQkJMHg4MDA2CisjZGVmaW5lIEdMWF9TVEFUSUNfR1JBWQkJCTB4ODAwNworI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfUkdCCQkweDgwMDgKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX0lOREVYCQkweDgwMDkKKyNkZWZpbmUgR0xYX1ZJU1VBTF9JRAkJCTB4ODAwQgorI2RlZmluZSBHTFhfU0NSRUVOCQkJMHg4MDBDCisjZGVmaW5lIEdMWF9OT05fQ09ORk9STUFOVF9DT05GSUcJMHg4MDBECisjZGVmaW5lIEdMWF9EUkFXQUJMRV9UWVBFCQkweDgwMTAKKyNkZWZpbmUgR0xYX1JFTkRFUl9UWVBFCQkJMHg4MDExCisjZGVmaW5lIEdMWF9YX1JFTkRFUkFCTEUJCTB4ODAxMgorI2RlZmluZSBHTFhfRkJDT05GSUdfSUQJCQkweDgwMTMKKyNkZWZpbmUgR0xYX1JHQkFfVFlQRQkJCTB4ODAxNAorI2RlZmluZSBHTFhfQ09MT1JfSU5ERVhfVFlQRQkJMHg4MDE1CisjZGVmaW5lIEdMWF9NQVhfUEJVRkZFUl9XSURUSAkJMHg4MDE2CisjZGVmaW5lIEdMWF9NQVhfUEJVRkZFUl9IRUlHSFQJCTB4ODAxNworI2RlZmluZSBHTFhfTUFYX1BCVUZGRVJfUElYRUxTCQkweDgwMTgKKyNkZWZpbmUgR0xYX1BSRVNFUlZFRF9DT05URU5UUwkJMHg4MDFCCisjZGVmaW5lIEdMWF9MQVJHRVNUX1BCVUZGRVIJCTB4ODAxQworI2RlZmluZSBHTFhfV0lEVEgJCQkweDgwMUQKKyNkZWZpbmUgR0xYX0hFSUdIVAkJCTB4ODAxRQorI2RlZmluZSBHTFhfRVZFTlRfTUFTSwkJCTB4ODAxRgorI2RlZmluZSBHTFhfREFNQUdFRAkJCTB4ODAyMAorI2RlZmluZSBHTFhfU0FWRUQJCQkweDgwMjEKKyNkZWZpbmUgR0xYX1dJTkRPVwkJCTB4ODAyMgorI2RlZmluZSBHTFhfUEJVRkZFUgkJCTB4ODAyMworI2RlZmluZSBHTFhfUEJVRkZFUl9IRUlHSFQgICAgICAgICAgICAgIDB4ODA0MAorI2RlZmluZSBHTFhfUEJVRkZFUl9XSURUSCAgICAgICAgICAgICAgIDB4ODA0MQorI2RlZmluZSBHTFhfUkdCQV9CSVQJCQkweDAwMDAwMDAxCisjZGVmaW5lIEdMWF9DT0xPUl9JTkRFWF9CSVQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgR0xYX1BCVUZGRVJfQ0xPQkJFUl9NQVNLCTB4MDgwMDAwMDAKKworCisvKgorICogR0xYIDEuNCBhbmQgbGF0ZXI6CisgKi8KKyNkZWZpbmUgR0xYX1NBTVBMRV9CVUZGRVJTICAgICAgICAgICAgICAweDE4NmEwIC8qMTAwMDAwKi8KKyNkZWZpbmUgR0xYX1NBTVBMRVMgICAgICAgICAgICAgICAgICAgICAweDE4NmExIC8qMTAwMDAxKi8KKworCisKK3R5cGVkZWYgc3RydWN0IF9fR0xYY29udGV4dFJlYyAqR0xYQ29udGV4dDsKK3R5cGVkZWYgWElEIEdMWFBpeG1hcDsKK3R5cGVkZWYgWElEIEdMWERyYXdhYmxlOworLyogR0xYIDEuMyBhbmQgbGF0ZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9fR0xYRkJDb25maWdSZWMgKkdMWEZCQ29uZmlnOwordHlwZWRlZiBYSUQgR0xYRkJDb25maWdJRDsKK3R5cGVkZWYgWElEIEdMWENvbnRleHRJRDsKK3R5cGVkZWYgWElEIEdMWFdpbmRvdzsKK3R5cGVkZWYgWElEIEdMWFBidWZmZXI7CisKKworLyoKKyoqIEV2ZW50cy4KKyoqIF9fR0xYX05VTUJFUl9FVkVOVFMgaXMgc2V0IHRvIDE3IHRvIGFjY291bnQgZm9yIHRoZSBCdWZmZXJDbG9iYmVyU0dJWAorKiogIGV2ZW50IC0gdGhpcyBoZWxwcyBpbml0aWFsaXphdGlvbiBpZiB0aGUgc2VydmVyIHN1cHBvcnRzIHRoZSBwYnVmZmVyCisqKiAgZXh0ZW5zaW9uIGFuZCB0aGUgY2xpZW50IGRvZXNuJ3QuCisqLworI2RlZmluZSBHTFhfUGJ1ZmZlckNsb2JiZXIJMAorI2RlZmluZSBHTFhfQnVmZmVyU3dhcENvbXBsZXRlCTEKKworI2RlZmluZSBfX0dMWF9OVU1CRVJfRVZFTlRTIDE3CisKK2V4dGVybiBYVmlzdWFsSW5mbyogZ2xYQ2hvb3NlVmlzdWFsKCBEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sCisJCQkJICAgICBpbnQgKmF0dHJpYkxpc3QgKTsKKworZXh0ZXJuIEdMWENvbnRleHQgZ2xYQ3JlYXRlQ29udGV4dCggRGlzcGxheSAqZHB5LCBYVmlzdWFsSW5mbyAqdmlzLAorCQkJCSAgICBHTFhDb250ZXh0IHNoYXJlTGlzdCwgQm9vbCBkaXJlY3QgKTsKKworZXh0ZXJuIHZvaWQgZ2xYRGVzdHJveUNvbnRleHQoIERpc3BsYXkgKmRweSwgR0xYQ29udGV4dCBjdHggKTsKKworZXh0ZXJuIEJvb2wgZ2xYTWFrZUN1cnJlbnQoIERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsCisJCQkgICAgR0xYQ29udGV4dCBjdHgpOworCitleHRlcm4gdm9pZCBnbFhDb3B5Q29udGV4dCggRGlzcGxheSAqZHB5LCBHTFhDb250ZXh0IHNyYywgR0xYQ29udGV4dCBkc3QsCisJCQkgICAgdW5zaWduZWQgbG9uZyBtYXNrICk7CisKK2V4dGVybiB2b2lkIGdsWFN3YXBCdWZmZXJzKCBEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlICk7CisKK2V4dGVybiBHTFhQaXhtYXAgZ2xYQ3JlYXRlR0xYUGl4bWFwKCBEaXNwbGF5ICpkcHksIFhWaXN1YWxJbmZvICp2aXN1YWwsCisJCQkJICAgICBQaXhtYXAgcGl4bWFwICk7CisKK2V4dGVybiB2b2lkIGdsWERlc3Ryb3lHTFhQaXhtYXAoIERpc3BsYXkgKmRweSwgR0xYUGl4bWFwIHBpeG1hcCApOworCitleHRlcm4gQm9vbCBnbFhRdWVyeUV4dGVuc2lvbiggRGlzcGxheSAqZHB5LCBpbnQgKmVycm9yYiwgaW50ICpldmVudCApOworCitleHRlcm4gQm9vbCBnbFhRdWVyeVZlcnNpb24oIERpc3BsYXkgKmRweSwgaW50ICptYWosIGludCAqbWluICk7CisKK2V4dGVybiBCb29sIGdsWElzRGlyZWN0KCBEaXNwbGF5ICpkcHksIEdMWENvbnRleHQgY3R4ICk7CisKK2V4dGVybiBpbnQgZ2xYR2V0Q29uZmlnKCBEaXNwbGF5ICpkcHksIFhWaXN1YWxJbmZvICp2aXN1YWwsCisJCQkgaW50IGF0dHJpYiwgaW50ICp2YWx1ZSApOworCitleHRlcm4gR0xYQ29udGV4dCBnbFhHZXRDdXJyZW50Q29udGV4dCggdm9pZCApOworCitleHRlcm4gR0xYRHJhd2FibGUgZ2xYR2V0Q3VycmVudERyYXdhYmxlKCB2b2lkICk7CisKK2V4dGVybiB2b2lkIGdsWFdhaXRHTCggdm9pZCApOworCitleHRlcm4gdm9pZCBnbFhXYWl0WCggdm9pZCApOworCitleHRlcm4gdm9pZCBnbFhVc2VYRm9udCggRm9udCBmb250LCBpbnQgZmlyc3QsIGludCBjb3VudCwgaW50IGxpc3QgKTsKKworCisKKy8qIEdMWCAxLjEgYW5kIGxhdGVyICovCitleHRlcm4gY29uc3QgY2hhciAqZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nKCBEaXNwbGF5ICpkcHksIGludCBzY3JlZW4gKTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmdsWFF1ZXJ5U2VydmVyU3RyaW5nKCBEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIGludCBuYW1lICk7CisKK2V4dGVybiBjb25zdCBjaGFyICpnbFhHZXRDbGllbnRTdHJpbmcoIERpc3BsYXkgKmRweSwgaW50IG5hbWUgKTsKKworCisvKiBHTFggMS4yIGFuZCBsYXRlciAqLworZXh0ZXJuIERpc3BsYXkgKmdsWEdldEN1cnJlbnREaXNwbGF5KCB2b2lkICk7CisKKworLyogR0xYIDEuMyBhbmQgbGF0ZXIgKi8KK2V4dGVybiBHTFhGQkNvbmZpZyAqZ2xYQ2hvb3NlRkJDb25maWcoIERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqYXR0cmliTGlzdCwgaW50ICpuaXRlbXMgKTsKKworZXh0ZXJuIGludCBnbFhHZXRGQkNvbmZpZ0F0dHJpYiggRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZyBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXR0cmlidXRlLCBpbnQgKnZhbHVlICk7CisKK2V4dGVybiBHTFhGQkNvbmZpZyAqZ2xYR2V0RkJDb25maWdzKCBEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpuZWxlbWVudHMgKTsKKworZXh0ZXJuIFhWaXN1YWxJbmZvICpnbFhHZXRWaXN1YWxGcm9tRkJDb25maWcoIERpc3BsYXkgKmRweSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTFhGQkNvbmZpZyBjb25maWcgKTsKKworZXh0ZXJuIEdMWFdpbmRvdyBnbFhDcmVhdGVXaW5kb3coIERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvdyB3aW4sIGNvbnN0IGludCAqYXR0cmliTGlzdCApOworCitleHRlcm4gdm9pZCBnbFhEZXN0cm95V2luZG93KCBEaXNwbGF5ICpkcHksIEdMWFdpbmRvdyB3aW5kb3cgKTsKKworZXh0ZXJuIEdMWFBpeG1hcCBnbFhDcmVhdGVQaXhtYXAoIERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpeG1hcCBwaXhtYXAsIGNvbnN0IGludCAqYXR0cmliTGlzdCApOworCitleHRlcm4gdm9pZCBnbFhEZXN0cm95UGl4bWFwKCBEaXNwbGF5ICpkcHksIEdMWFBpeG1hcCBwaXhtYXAgKTsKKworZXh0ZXJuIEdMWFBidWZmZXIgZ2xYQ3JlYXRlUGJ1ZmZlciggRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZyBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKmF0dHJpYkxpc3QgKTsKKworZXh0ZXJuIHZvaWQgZ2xYRGVzdHJveVBidWZmZXIoIERpc3BsYXkgKmRweSwgR0xYUGJ1ZmZlciBwYnVmICk7CisKK2V4dGVybiB2b2lkIGdsWFF1ZXJ5RHJhd2FibGUoIERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhdywgaW50IGF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqdmFsdWUgKTsKKworZXh0ZXJuIEdMWENvbnRleHQgZ2xYQ3JlYXRlTmV3Q29udGV4dCggRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZyBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVuZGVyVHlwZSwgR0xYQ29udGV4dCBzaGFyZUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sIGRpcmVjdCApOworCitleHRlcm4gQm9vbCBnbFhNYWtlQ29udGV4dEN1cnJlbnQoIERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xYRHJhd2FibGUgcmVhZCwgR0xYQ29udGV4dCBjdHggKTsKKworZXh0ZXJuIEdMWERyYXdhYmxlIGdsWEdldEN1cnJlbnRSZWFkRHJhd2FibGUoIHZvaWQgKTsKKworZXh0ZXJuIGludCBnbFhRdWVyeUNvbnRleHQoIERpc3BsYXkgKmRweSwgR0xYQ29udGV4dCBjdHgsIGludCBhdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp2YWx1ZSApOworCitleHRlcm4gdm9pZCBnbFhTZWxlY3RFdmVudCggRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG1hc2sgKTsKKworZXh0ZXJuIHZvaWQgZ2xYR2V0U2VsZWN0ZWRFdmVudCggRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKm1hc2sgKTsKKworLyogR0xYIDEuMyBmdW5jdGlvbiBwb2ludGVyIHR5cGVkZWZzICovCit0eXBlZGVmIEdMWEZCQ29uZmlnICogKCogUEZOR0xYR0VURkJDT05GSUdTUFJPQykgKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgaW50ICpuZWxlbWVudHMpOwordHlwZWRlZiBHTFhGQkNvbmZpZyAqICgqIFBGTkdMWENIT09TRUZCQ09ORklHUFJPQykgKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgY29uc3QgaW50ICphdHRyaWJfbGlzdCwgaW50ICpuZWxlbWVudHMpOwordHlwZWRlZiBpbnQgKCogUEZOR0xYR0VURkJDT05GSUdBVFRSSUJQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZyBjb25maWcsIGludCBhdHRyaWJ1dGUsIGludCAqdmFsdWUpOwordHlwZWRlZiBYVmlzdWFsSW5mbyAqICgqIFBGTkdMWEdFVFZJU1VBTEZST01GQkNPTkZJR1BST0MpIChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZyk7Cit0eXBlZGVmIEdMWFdpbmRvdyAoKiBQRk5HTFhDUkVBVEVXSU5ET1dQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZyBjb25maWcsIFdpbmRvdyB3aW4sIGNvbnN0IGludCAqYXR0cmliX2xpc3QpOwordHlwZWRlZiB2b2lkICgqIFBGTkdMWERFU1RST1lXSU5ET1dQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhXaW5kb3cgd2luKTsKK3R5cGVkZWYgR0xYUGl4bWFwICgqIFBGTkdMWENSRUFURVBJWE1BUFBST0MpIChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZywgUGl4bWFwIHBpeG1hcCwgY29uc3QgaW50ICphdHRyaWJfbGlzdCk7Cit0eXBlZGVmIHZvaWQgKCogUEZOR0xYREVTVFJPWVBJWE1BUFBST0MpIChEaXNwbGF5ICpkcHksIEdMWFBpeG1hcCBwaXhtYXApOwordHlwZWRlZiBHTFhQYnVmZmVyICgqIFBGTkdMWENSRUFURVBCVUZGRVJQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZyBjb25maWcsIGNvbnN0IGludCAqYXR0cmliX2xpc3QpOwordHlwZWRlZiB2b2lkICgqIFBGTkdMWERFU1RST1lQQlVGRkVSUFJPQykgKERpc3BsYXkgKmRweSwgR0xYUGJ1ZmZlciBwYnVmKTsKK3R5cGVkZWYgdm9pZCAoKiBQRk5HTFhRVUVSWURSQVdBQkxFUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhdywgaW50IGF0dHJpYnV0ZSwgdW5zaWduZWQgaW50ICp2YWx1ZSk7Cit0eXBlZGVmIEdMWENvbnRleHQgKCogUEZOR0xYQ1JFQVRFTkVXQ09OVEVYVFBST0MpIChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZywgaW50IHJlbmRlcl90eXBlLCBHTFhDb250ZXh0IHNoYXJlX2xpc3QsIEJvb2wgZGlyZWN0KTsKK3R5cGVkZWYgQm9vbCAoKiBQRk5HTFhNQUtFQ09OVEVYVENVUlJFTlRQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3LCBHTFhEcmF3YWJsZSByZWFkLCBHTFhDb250ZXh0IGN0eCk7Cit0eXBlZGVmIEdMWERyYXdhYmxlICgqIFBGTkdMWEdFVENVUlJFTlRSRUFERFJBV0FCTEVQUk9DKSAodm9pZCk7Cit0eXBlZGVmIERpc3BsYXkgKiAoKiBQRk5HTFhHRVRDVVJSRU5URElTUExBWVBST0MpICh2b2lkKTsKK3R5cGVkZWYgaW50ICgqIFBGTkdMWFFVRVJZQ09OVEVYVFBST0MpIChEaXNwbGF5ICpkcHksIEdMWENvbnRleHQgY3R4LCBpbnQgYXR0cmlidXRlLCBpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoKiBQRk5HTFhTRUxFQ1RFVkVOVFBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXcsIHVuc2lnbmVkIGxvbmcgZXZlbnRfbWFzayk7Cit0eXBlZGVmIHZvaWQgKCogUEZOR0xYR0VUU0VMRUNURURFVkVOVFBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXcsIHVuc2lnbmVkIGxvbmcgKmV2ZW50X21hc2spOworCisKKy8qCisgKiBBUkIgMi4gR0xYX0FSQl9nZXRfcHJvY19hZGRyZXNzCisgKi8KKyNpZm5kZWYgR0xYX0FSQl9nZXRfcHJvY19hZGRyZXNzCisjZGVmaW5lIEdMWF9BUkJfZ2V0X3Byb2NfYWRkcmVzcyAxCisKK3R5cGVkZWYgdm9pZCAoKl9fR0xYZXh0RnVuY1B0cikodm9pZCk7CitleHRlcm4gX19HTFhleHRGdW5jUHRyIGdsWEdldFByb2NBZGRyZXNzQVJCIChjb25zdCBHTHVieXRlICopOworCisjZW5kaWYgLyogR0xYX0FSQl9nZXRfcHJvY19hZGRyZXNzICovCisKKworCisvKiBHTFggMS40IGFuZCBsYXRlciAqLworZXh0ZXJuIHZvaWQgKCpnbFhHZXRQcm9jQWRkcmVzcyhjb25zdCBHTHVieXRlICpwcm9jbmFtZSkpKCB2b2lkICk7CisKKy8qIEdMWCAxLjQgZnVuY3Rpb24gcG9pbnRlciB0eXBlZGVmcyAqLwordHlwZWRlZiBfX0dMWGV4dEZ1bmNQdHIgKCogUEZOR0xYR0VUUFJPQ0FERFJFU1NQUk9DKSAoY29uc3QgR0x1Ynl0ZSAqcHJvY05hbWUpOworCisKKyNpZm5kZWYgR0xYX0dMWEVYVF9MRUdBQ1kKKworI2luY2x1ZGUgPEdML2dseGV4dC5oPgorCisjZW5kaWYgLyogR0xYX0dMWEVYVF9MRUdBQ1kgKi8KKworCisvKioKKyAqKiBUaGUgZm9sbG93aW5nIGFyZW4ndCBpbiBnbHhleHQuaCB5ZXQuCisgKiovCisKKworLyoKKyAqID8/Py4gR0xYX05WX3ZlcnRleF9hcnJheV9yYW5nZQorICovCisjaWZuZGVmIEdMWF9OVl92ZXJ0ZXhfYXJyYXlfcmFuZ2UKKyNkZWZpbmUgR0xYX05WX3ZlcnRleF9hcnJheV9yYW5nZQorCitleHRlcm4gdm9pZCAqZ2xYQWxsb2NhdGVNZW1vcnlOVihHTHNpemVpIHNpemUsIEdMZmxvYXQgcmVhZGZyZXEsIEdMZmxvYXQgd3JpdGVmcmVxLCBHTGZsb2F0IHByaW9yaXR5KTsKK2V4dGVybiB2b2lkIGdsWEZyZWVNZW1vcnlOVihHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkICogKCAqIFBGTkdMWEFMTE9DQVRFTUVNT1JZTlZQUk9DKSAoR0xzaXplaSBzaXplLCBHTGZsb2F0IHJlYWRmcmVxLCBHTGZsb2F0IHdyaXRlZnJlcSwgR0xmbG9hdCBwcmlvcml0eSk7Cit0eXBlZGVmIHZvaWQgKCAqIFBGTkdMWEZSRUVNRU1PUllOVlBST0MpIChHTHZvaWQgKnBvaW50ZXIpOworCisjZW5kaWYgLyogR0xYX05WX3ZlcnRleF9hcnJheV9yYW5nZSAqLworCisKKy8qCisgKiBBUkIgPy4gR0xYX0FSQl9yZW5kZXJfdGV4dHVyZQorICogWFhYIFRoaXMgd2FzIG5ldmVyIGZpbmFsaXplZCEKKyAqLworI2lmbmRlZiBHTFhfQVJCX3JlbmRlcl90ZXh0dXJlCisjZGVmaW5lIEdMWF9BUkJfcmVuZGVyX3RleHR1cmUgMQorCitleHRlcm4gQm9vbCBnbFhCaW5kVGV4SW1hZ2VBUkIoRGlzcGxheSAqZHB5LCBHTFhQYnVmZmVyIHBidWZmZXIsIGludCBidWZmZXIpOworZXh0ZXJuIEJvb2wgZ2xYUmVsZWFzZVRleEltYWdlQVJCKERpc3BsYXkgKmRweSwgR0xYUGJ1ZmZlciBwYnVmZmVyLCBpbnQgYnVmZmVyKTsKK2V4dGVybiBCb29sIGdsWERyYXdhYmxlQXR0cmliQVJCKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhdywgY29uc3QgaW50ICphdHRyaWJMaXN0KTsKKworI2VuZGlmIC8qIEdMWF9BUkJfcmVuZGVyX3RleHR1cmUgKi8KKworCisvKgorICogUmVtb3ZlIHRoaXMgd2hlbiBnbHhleHQuaCBpcyB1cGRhdGVkLgorICovCisjaWZuZGVmIEdMWF9OVl9mbG9hdF9idWZmZXIKKyNkZWZpbmUgR0xYX05WX2Zsb2F0X2J1ZmZlciAxCisKKyNkZWZpbmUgR0xYX0ZMT0FUX0NPTVBPTkVOVFNfTlYgICAgICAgICAweDIwQjAKKworI2VuZGlmIC8qIEdMWF9OVl9mbG9hdF9idWZmZXIgKi8KKworCisKKy8qCisgKiAjPy4gR0xYX01FU0Ffc3dhcF9mcmFtZV91c2FnZQorICovCisjaWZuZGVmIEdMWF9NRVNBX3N3YXBfZnJhbWVfdXNhZ2UKKyNkZWZpbmUgR0xYX01FU0Ffc3dhcF9mcmFtZV91c2FnZSAxCisKK2V4dGVybiBpbnQgZ2xYR2V0RnJhbWVVc2FnZU1FU0EoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgZmxvYXQgKnVzYWdlKTsKK2V4dGVybiBpbnQgZ2xYQmVnaW5GcmFtZVRyYWNraW5nTUVTQShEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlKTsKK2V4dGVybiBpbnQgZ2xYRW5kRnJhbWVUcmFja2luZ01FU0EoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSk7CitleHRlcm4gaW50IGdsWFF1ZXJ5RnJhbWVUcmFja2luZ01FU0EoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgaW50NjRfdCAqc3dhcENvdW50LCBpbnQ2NF90ICptaXNzZWRGcmFtZXMsIGZsb2F0ICpsYXN0TWlzc2VkVXNhZ2UpOworCit0eXBlZGVmIGludCAoKlBGTkdMWEdFVEZSQU1FVVNBR0VNRVNBUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGZsb2F0ICp1c2FnZSk7Cit0eXBlZGVmIGludCAoKlBGTkdMWEJFR0lORlJBTUVUUkFDS0lOR01FU0FQUk9DKShEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlKTsKK3R5cGVkZWYgaW50ICgqUEZOR0xYRU5ERlJBTUVUUkFDS0lOR01FU0FQUk9DKShEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlKTsKK3R5cGVkZWYgaW50ICgqUEZOR0xYUVVFUllGUkFNRVRSQUNLSU5HTUVTQVBST0MpKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludDY0X3QgKnN3YXBDb3VudCwgaW50NjRfdCAqbWlzc2VkRnJhbWVzLCBmbG9hdCAqbGFzdE1pc3NlZFVzYWdlKTsKKworI2VuZGlmIC8qIEdMWF9NRVNBX3N3YXBfZnJhbWVfdXNhZ2UgKi8KKworCisKKy8qCisgKiAjPy4gR0xYX01FU0Ffc3dhcF9jb250cm9sCisgKi8KKyNpZm5kZWYgR0xYX01FU0Ffc3dhcF9jb250cm9sCisjZGVmaW5lIEdMWF9NRVNBX3N3YXBfY29udHJvbCAxCisKK2V4dGVybiBpbnQgZ2xYU3dhcEludGVydmFsTUVTQSh1bnNpZ25lZCBpbnQgaW50ZXJ2YWwpOworZXh0ZXJuIGludCBnbFhHZXRTd2FwSW50ZXJ2YWxNRVNBKHZvaWQpOworCit0eXBlZGVmIGludCAoKlBGTkdMWFNXQVBJTlRFUlZBTE1FU0FQUk9DKSh1bnNpZ25lZCBpbnQgaW50ZXJ2YWwpOwordHlwZWRlZiBpbnQgKCpQRk5HTFhHRVRTV0FQSU5URVJWQUxNRVNBUFJPQykodm9pZCk7CisKKyNlbmRpZiAvKiBHTFhfTUVTQV9zd2FwX2NvbnRyb2wgKi8KKworCisKKy8qCisgKiAjPy4gR0xYX0VYVF90ZXh0dXJlX2Zyb21fcGl4bWFwCisgKiBYWFggbm90IGZpbmlzaGVkPworICovCisjaWZuZGVmIEdMWF9FWFRfdGV4dHVyZV9mcm9tX3BpeG1hcAorI2RlZmluZSBHTFhfRVhUX3RleHR1cmVfZnJvbV9waXhtYXAgMQorCisjZGVmaW5lIEdMWF9CSU5EX1RPX1RFWFRVUkVfUkdCX0VYVCAgICAgICAgMHgyMEQwCisjZGVmaW5lIEdMWF9CSU5EX1RPX1RFWFRVUkVfUkdCQV9FWFQgICAgICAgMHgyMEQxCisjZGVmaW5lIEdMWF9CSU5EX1RPX01JUE1BUF9URVhUVVJFX0VYVCAgICAgMHgyMEQyCisjZGVmaW5lIEdMWF9CSU5EX1RPX1RFWFRVUkVfVEFSR0VUU19FWFQgICAgMHgyMEQzCisjZGVmaW5lIEdMWF9ZX0lOVkVSVEVEX0VYVCAgICAgICAgICAgICAgICAgMHgyMEQ0CisKKyNkZWZpbmUgR0xYX1RFWFRVUkVfRk9STUFUX0VYVCAgICAgICAgICAgICAweDIwRDUKKyNkZWZpbmUgR0xYX1RFWFRVUkVfVEFSR0VUX0VYVCAgICAgICAgICAgICAweDIwRDYKKyNkZWZpbmUgR0xYX01JUE1BUF9URVhUVVJFX0VYVCAgICAgICAgICAgICAweDIwRDcKKworI2RlZmluZSBHTFhfVEVYVFVSRV9GT1JNQVRfTk9ORV9FWFQgICAgICAgIDB4MjBEOAorI2RlZmluZSBHTFhfVEVYVFVSRV9GT1JNQVRfUkdCX0VYVCAgICAgICAgIDB4MjBEOQorI2RlZmluZSBHTFhfVEVYVFVSRV9GT1JNQVRfUkdCQV9FWFQgICAgICAgIDB4MjBEQQorCisjZGVmaW5lIEdMWF9URVhUVVJFXzFEX0JJVF9FWFQgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTFhfVEVYVFVSRV8yRF9CSVRfRVhUICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0xYX1RFWFRVUkVfUkVDVEFOR0xFX0JJVF9FWFQgICAgICAweDAwMDAwMDA0CisKKyNkZWZpbmUgR0xYX1RFWFRVUkVfMURfRVhUICAgICAgICAgICAgICAgICAweDIwREIKKyNkZWZpbmUgR0xYX1RFWFRVUkVfMkRfRVhUICAgICAgICAgICAgICAgICAweDIwREMKKyNkZWZpbmUgR0xYX1RFWFRVUkVfUkVDVEFOR0xFX0VYVCAgICAgICAgICAweDIwREQKKworI2RlZmluZSBHTFhfRlJPTlRfTEVGVF9FWFQgICAgICAgICAgICAgICAgIDB4MjBERQorI2RlZmluZSBHTFhfRlJPTlRfUklHSFRfRVhUICAgICAgICAgICAgICAgIDB4MjBERgorI2RlZmluZSBHTFhfQkFDS19MRUZUX0VYVCAgICAgICAgICAgICAgICAgIDB4MjBFMAorI2RlZmluZSBHTFhfQkFDS19SSUdIVF9FWFQgICAgICAgICAgICAgICAgIDB4MjBFMQorI2RlZmluZSBHTFhfRlJPTlRfRVhUICAgICAgICAgICAgICAgICAgICAgIEdMWF9GUk9OVF9MRUZUX0VYVAorI2RlZmluZSBHTFhfQkFDS19FWFQgICAgICAgICAgICAgICAgICAgICAgIEdMWF9CQUNLX0xFRlRfRVhUCisjZGVmaW5lIEdMWF9BVVgwX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMEUyCisjZGVmaW5lIEdMWF9BVVgxX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMEUzIAorI2RlZmluZSBHTFhfQVVYMl9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4MjBFNCAKKyNkZWZpbmUgR0xYX0FVWDNfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRTUgCisjZGVmaW5lIEdMWF9BVVg0X0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMEU2IAorI2RlZmluZSBHTFhfQVVYNV9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4MjBFNyAKKyNkZWZpbmUgR0xYX0FVWDZfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRTgKKyNkZWZpbmUgR0xYX0FVWDdfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRTkgCisjZGVmaW5lIEdMWF9BVVg4X0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMEVBIAorI2RlZmluZSBHTFhfQVVYOV9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4MjBFQgorCitleHRlcm4gdm9pZCBnbFhCaW5kVGV4SW1hZ2VFWFQoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgaW50IGJ1ZmZlciwgY29uc3QgaW50ICphdHRyaWJfbGlzdCk7CitleHRlcm4gdm9pZCBnbFhSZWxlYXNlVGV4SW1hZ2VFWFQoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgaW50IGJ1ZmZlcik7CisKKyNlbmRpZiAvKiBHTFhfRVhUX3RleHR1cmVfZnJvbV9waXhtYXAgKi8KKworCisKKworLyoqKiBTaG91bGQgdGhlc2UgZ28gaGVyZSwgb3IgaW4gYW5vdGhlciBoZWFkZXI/ICovCisvKgorKiogR0xYIEV2ZW50cworKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgZXZlbnRfdHlwZTsJCS8qIEdMWF9EQU1BR0VEIG9yIEdMWF9TQVZFRCAqLworICAgIGludCBkcmF3X3R5cGU7CQkvKiBHTFhfV0lORE9XIG9yIEdMWF9QQlVGRkVSICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sIHNlbmRfZXZlbnQ7CQkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmb3IgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICpkaXNwbGF5OwkJLyogZGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIEdMWERyYXdhYmxlIGRyYXdhYmxlOwkvKiBYSUQgb2YgRHJhd2FibGUgKi8KKyAgICB1bnNpZ25lZCBpbnQgYnVmZmVyX21hc2s7CS8qIG1hc2sgaW5kaWNhdGluZyB3aGljaCBidWZmZXJzIGFyZSBhZmZlY3RlZCAqLworICAgIHVuc2lnbmVkIGludCBhdXhfYnVmZmVyOwkvKiB3aGljaCBhdXggYnVmZmVyIHdhcyBhZmZlY3RlZCAqLworICAgIGludCB4LCB5OworICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgIGludCBjb3VudDsJCQkvKiBpZiBub256ZXJvLCBhdCBsZWFzdCB0aGlzIG1hbnkgbW9yZSAqLworfSBHTFhQYnVmZmVyQ2xvYmJlckV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHR5cGU7CisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sIHNlbmRfZXZlbnQ7CQkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICpkaXNwbGF5OwkJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIEdMWERyYXdhYmxlIGRyYXdhYmxlOwkvKiBkcmF3YWJsZSBvbiB3aGljaCBldmVudCB3YXMgcmVxdWVzdGVkIGluIGV2ZW50IG1hc2sgKi8KKyAgICBpbnQgZXZlbnRfdHlwZTsKKyAgICBpbnQ2NF90IHVzdDsKKyAgICBpbnQ2NF90IG1zYzsKKyAgICBpbnQ2NF90IHNiYzsKK30gR0xYQnVmZmVyU3dhcENvbXBsZXRlOworCit0eXBlZGVmIHVuaW9uIF9fR0xYRXZlbnQgeworICAgIEdMWFBidWZmZXJDbG9iYmVyRXZlbnQgZ2x4cGJ1ZmZlcmNsb2JiZXI7CisgICAgR0xYQnVmZmVyU3dhcENvbXBsZXRlIGdseGJ1ZmZlcnN3YXBjb21wbGV0ZTsKKyAgICBsb25nIHBhZFsyNF07Cit9IEdMWEV2ZW50OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvZ2x4X21hbmdsZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbHhfbWFuZ2xlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2NjRhNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvZ2x4X21hbmdsZS5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisgKiBWZXJzaW9uOiAgNi41CisgKiAKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIEJSSUFOIFBBVUwgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKyNpZm5kZWYgR0xYX01BTkdMRV9ICisjZGVmaW5lIEdMWF9NQU5HTEVfSAorCisjZGVmaW5lIGdsWENob29zZVZpc3VhbCBtZ2xYQ2hvb3NlVmlzdWFsCisjZGVmaW5lIGdsWENyZWF0ZUNvbnRleHQgbWdsWENyZWF0ZUNvbnRleHQKKyNkZWZpbmUgZ2xYRGVzdHJveUNvbnRleHQgbWdsWERlc3Ryb3lDb250ZXh0CisjZGVmaW5lIGdsWE1ha2VDdXJyZW50IG1nbFhNYWtlQ3VycmVudAorI2RlZmluZSBnbFhDb3B5Q29udGV4dCBtZ2xYQ29weUNvbnRleHQKKyNkZWZpbmUgZ2xYU3dhcEJ1ZmZlcnMgbWdsWFN3YXBCdWZmZXJzCisjZGVmaW5lIGdsWENyZWF0ZUdMWFBpeG1hcCBtZ2xYQ3JlYXRlR0xYUGl4bWFwCisjZGVmaW5lIGdsWERlc3Ryb3lHTFhQaXhtYXAgbWdsWERlc3Ryb3lHTFhQaXhtYXAKKyNkZWZpbmUgZ2xYUXVlcnlFeHRlbnNpb24gbWdsWFF1ZXJ5RXh0ZW5zaW9uCisjZGVmaW5lIGdsWFF1ZXJ5VmVyc2lvbiBtZ2xYUXVlcnlWZXJzaW9uCisjZGVmaW5lIGdsWElzRGlyZWN0IG1nbFhJc0RpcmVjdAorI2RlZmluZSBnbFhHZXRDb25maWcgbWdsWEdldENvbmZpZworI2RlZmluZSBnbFhHZXRDdXJyZW50Q29udGV4dCBtZ2xYR2V0Q3VycmVudENvbnRleHQKKyNkZWZpbmUgZ2xYR2V0Q3VycmVudERyYXdhYmxlIG1nbFhHZXRDdXJyZW50RHJhd2FibGUKKyNkZWZpbmUgZ2xYV2FpdEdMIG1nbFhXYWl0R0wKKyNkZWZpbmUgZ2xYV2FpdFggbWdsWFdhaXRYCisjZGVmaW5lIGdsWFVzZVhGb250IG1nbFhVc2VYRm9udAorI2RlZmluZSBnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmcgbWdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZworI2RlZmluZSBnbFhRdWVyeVNlcnZlclN0cmluZyBtZ2xYUXVlcnlTZXJ2ZXJTdHJpbmcKKyNkZWZpbmUgZ2xYR2V0Q2xpZW50U3RyaW5nIG1nbFhHZXRDbGllbnRTdHJpbmcKKyNkZWZpbmUgZ2xYQ3JlYXRlR0xYUGl4bWFwTUVTQSBtZ2xYQ3JlYXRlR0xYUGl4bWFwTUVTQQorI2RlZmluZSBnbFhSZWxlYXNlQnVmZmVyc01FU0EgbWdsWFJlbGVhc2VCdWZmZXJzTUVTQQorI2RlZmluZSBnbFhDb3B5U3ViQnVmZmVyTUVTQSBtZ2xYQ29weVN1YkJ1ZmZlck1FU0EKKyNkZWZpbmUgZ2xYR2V0VmlkZW9TeW5jU0dJIG1nbFhHZXRWaWRlb1N5bmNTR0kKKyNkZWZpbmUgZ2xYV2FpdFZpZGVvU3luY1NHSSBtZ2xYV2FpdFZpZGVvU3luY1NHSQorCisvKiBHTFggMS4yICovCisjZGVmaW5lIGdsWEdldEN1cnJlbnREaXNwbGF5IG1nbFhHZXRDdXJyZW50RGlzcGxheSAKKworLyogR0xYIDEuMyAqLworI2RlZmluZSBnbFhDaG9vc2VGQkNvbmZpZyBtZ2xYQ2hvb3NlRkJDb25maWcgICAgICAgICAgCisjZGVmaW5lIGdsWEdldEZCQ29uZmlnQXR0cmliIG1nbFhHZXRGQkNvbmZpZ0F0dHJpYiAgICAgICAKKyNkZWZpbmUgZ2xYR2V0RkJDb25maWdzIG1nbFhHZXRGQkNvbmZpZ3MgICAgICAgICAgICAKKyNkZWZpbmUgZ2xYR2V0VmlzdWFsRnJvbUZCQ29uZmlnIG1nbFhHZXRWaXN1YWxGcm9tRkJDb25maWcgICAKKyNkZWZpbmUgZ2xYQ3JlYXRlV2luZG93IG1nbFhDcmVhdGVXaW5kb3cgICAgICAgICAgICAKKyNkZWZpbmUgZ2xYRGVzdHJveVdpbmRvdyBtZ2xYRGVzdHJveVdpbmRvdyAgICAgICAgICAgCisjZGVmaW5lIGdsWENyZWF0ZVBpeG1hcCBtZ2xYQ3JlYXRlUGl4bWFwICAgICAgICAgICAgCisjZGVmaW5lIGdsWERlc3Ryb3lQaXhtYXAgbWdsWERlc3Ryb3lQaXhtYXAgICAgICAgICAgIAorI2RlZmluZSBnbFhDcmVhdGVQYnVmZmVyIG1nbFhDcmVhdGVQYnVmZmVyICAgICAgICAgICAKKyNkZWZpbmUgZ2xYRGVzdHJveVBidWZmZXIgbWdsWERlc3Ryb3lQYnVmZmVyICAgICAgICAgIAorI2RlZmluZSBnbFhRdWVyeURyYXdhYmxlIG1nbFhRdWVyeURyYXdhYmxlICAgICAgICAgICAKKyNkZWZpbmUgZ2xYQ3JlYXRlTmV3Q29udGV4dCBtZ2xYQ3JlYXRlTmV3Q29udGV4dCAgICAgICAgCisjZGVmaW5lIGdsWE1ha2VDb250ZXh0Q3VycmVudCBtZ2xYTWFrZUNvbnRleHRDdXJyZW50ICAgICAgCisjZGVmaW5lIGdsWEdldEN1cnJlbnRSZWFkRHJhd2FibGUgbWdsWEdldEN1cnJlbnRSZWFkRHJhd2FibGUgIAorI2RlZmluZSBnbFhRdWVyeUNvbnRleHQgbWdsWFF1ZXJ5Q29udGV4dCAgICAgICAgICAgIAorI2RlZmluZSBnbFhTZWxlY3RFdmVudCBtZ2xYU2VsZWN0RXZlbnQgICAgICAgICAgICAgCisjZGVmaW5lIGdsWEdldFNlbGVjdGVkRXZlbnQgbWdsWEdldFNlbGVjdGVkRXZlbnQgICAgCisKKy8qIEdMWCAxLjQgKi8KKyNkZWZpbmUgZ2xYR2V0UHJvY0FkZHJlc3MgbWdsWEdldFByb2NBZGRyZXNzCisjZGVmaW5lIGdsWEdldFByb2NBZGRyZXNzQVJCIG1nbFhHZXRQcm9jQWRkcmVzc0FSQgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbHhleHQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvZ2x4ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M0N2RjMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvZ2x4ZXh0LmgKQEAgLTAsMCArMSw5OTMgQEAKKyNpZm5kZWYgX19nbHhleHRfaF8KKyNkZWZpbmUgX19nbHhleHRfaF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorKiogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTAgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorKiogCisqKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorKiogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZC9vciBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorKiogIk1hdGVyaWFscyIpLCB0byBkZWFsIGluIHRoZSBNYXRlcmlhbHMgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisqKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisqKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIE1hdGVyaWFscywgYW5kIHRvCisqKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBNYXRlcmlhbHMgYXJlIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworKiogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorKiogCisqKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorKiogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgTWF0ZXJpYWxzLgorKiogCisqKiBUSEUgTUFURVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisqKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisqKiBNQVRFUklBTFMgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgTUFURVJJQUxTLgorKi8KKworLyogRnVuY3Rpb24gZGVjbGFyYXRpb24gbWFjcm9zIC0gdG8gbW92ZSBpbnRvIGdscGxhdGZvcm0uaCAqLworCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKEFQSUVOVFJZKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKSAmJiAhZGVmaW5lZChfX1NDSVRFQ0hfU05BUF9fKQorI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmbmRlZiBBUElFTlRSWQorI2RlZmluZSBBUElFTlRSWQorI2VuZGlmCisjaWZuZGVmIEFQSUVOVFJZUAorI2RlZmluZSBBUElFTlRSWVAgQVBJRU5UUlkgKgorI2VuZGlmCisjaWZuZGVmIEdMQVBJCisjZGVmaW5lIEdMQVBJIGV4dGVybgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBIZWFkZXIgZmlsZSB2ZXJzaW9uIG51bWJlciwgcmVxdWlyZWQgYnkgT3BlbkdMIEFCSSBmb3IgTGludXggKi8KKy8qIGdseGV4dC5oIGxhc3QgdXBkYXRlZCAyMDEwLzA4LzA2ICovCisvKiBDdXJyZW50IHZlcnNpb24gYXQgaHR0cDovL3d3dy5vcGVuZ2wub3JnL3JlZ2lzdHJ5LyAqLworI2RlZmluZSBHTFhfR0xYRVhUX1ZFUlNJT04gMzIKKworI2lmbmRlZiBHTFhfVkVSU0lPTl8xXzMKKyNkZWZpbmUgR0xYX1dJTkRPV19CSVQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEdMWF9QSVhNQVBfQklUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTFhfUEJVRkZFUl9CSVQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgR0xYX1JHQkFfQklUICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEdMWF9DT0xPUl9JTkRFWF9CSVQgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTFhfUEJVRkZFUl9DTE9CQkVSX01BU0sgICAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgR0xYX0ZST05UX0xFRlRfQlVGRkVSX0JJVCAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEdMWF9GUk9OVF9SSUdIVF9CVUZGRVJfQklUICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTFhfQkFDS19MRUZUX0JVRkZFUl9CSVQgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgR0xYX0JBQ0tfUklHSFRfQlVGRkVSX0JJVCAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEdMWF9BVVhfQlVGRkVSU19CSVQgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBHTFhfREVQVEhfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgR0xYX1NURU5DSUxfQlVGRkVSX0JJVCAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEdMWF9BQ0NVTV9CVUZGRVJfQklUICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBHTFhfQ09ORklHX0NBVkVBVCAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgR0xYX1hfVklTVUFMX1RZUEUgICAgICAgICAgICAgICAgICAweDIyCisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9UWVBFICAgICAgICAgICAgICAgMHgyMworI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfSU5ERVhfVkFMVUUgICAgICAgIDB4MjQKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSAgICAgICAgICAweDI1CisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRSAgICAgICAgMHgyNgorI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRSAgICAgICAgIDB4MjcKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX0FMUEhBX1ZBTFVFICAgICAgICAweDI4CisjZGVmaW5lIEdMWF9ET05UX0NBUkUgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgorI2RlZmluZSBHTFhfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBHTFhfU0xPV19DT05GSUcgICAgICAgICAgICAgICAgICAgIDB4ODAwMQorI2RlZmluZSBHTFhfVFJVRV9DT0xPUiAgICAgICAgICAgICAgICAgICAgIDB4ODAwMgorI2RlZmluZSBHTFhfRElSRUNUX0NPTE9SICAgICAgICAgICAgICAgICAgIDB4ODAwMworI2RlZmluZSBHTFhfUFNFVURPX0NPTE9SICAgICAgICAgICAgICAgICAgIDB4ODAwNAorI2RlZmluZSBHTFhfU1RBVElDX0NPTE9SICAgICAgICAgICAgICAgICAgIDB4ODAwNQorI2RlZmluZSBHTFhfR1JBWV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDB4ODAwNgorI2RlZmluZSBHTFhfU1RBVElDX0dSQVkgICAgICAgICAgICAgICAgICAgIDB4ODAwNworI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfUkdCICAgICAgICAgICAgICAgIDB4ODAwOAorI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfSU5ERVggICAgICAgICAgICAgIDB4ODAwOQorI2RlZmluZSBHTFhfVklTVUFMX0lEICAgICAgICAgICAgICAgICAgICAgIDB4ODAwQgorI2RlZmluZSBHTFhfU0NSRUVOICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwQworI2RlZmluZSBHTFhfTk9OX0NPTkZPUk1BTlRfQ09ORklHICAgICAgICAgIDB4ODAwRAorI2RlZmluZSBHTFhfRFJBV0FCTEVfVFlQRSAgICAgICAgICAgICAgICAgIDB4ODAxMAorI2RlZmluZSBHTFhfUkVOREVSX1RZUEUgICAgICAgICAgICAgICAgICAgIDB4ODAxMQorI2RlZmluZSBHTFhfWF9SRU5ERVJBQkxFICAgICAgICAgICAgICAgICAgIDB4ODAxMgorI2RlZmluZSBHTFhfRkJDT05GSUdfSUQgICAgICAgICAgICAgICAgICAgIDB4ODAxMworI2RlZmluZSBHTFhfUkdCQV9UWVBFICAgICAgICAgICAgICAgICAgICAgIDB4ODAxNAorI2RlZmluZSBHTFhfQ09MT1JfSU5ERVhfVFlQRSAgICAgICAgICAgICAgIDB4ODAxNQorI2RlZmluZSBHTFhfTUFYX1BCVUZGRVJfV0lEVEggICAgICAgICAgICAgIDB4ODAxNgorI2RlZmluZSBHTFhfTUFYX1BCVUZGRVJfSEVJR0hUICAgICAgICAgICAgIDB4ODAxNworI2RlZmluZSBHTFhfTUFYX1BCVUZGRVJfUElYRUxTICAgICAgICAgICAgIDB4ODAxOAorI2RlZmluZSBHTFhfUFJFU0VSVkVEX0NPTlRFTlRTICAgICAgICAgICAgIDB4ODAxQgorI2RlZmluZSBHTFhfTEFSR0VTVF9QQlVGRkVSICAgICAgICAgICAgICAgIDB4ODAxQworI2RlZmluZSBHTFhfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAxRAorI2RlZmluZSBHTFhfSEVJR0hUICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAxRQorI2RlZmluZSBHTFhfRVZFTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4ODAxRgorI2RlZmluZSBHTFhfREFNQUdFRCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAyMAorI2RlZmluZSBHTFhfU0FWRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAyMQorI2RlZmluZSBHTFhfV0lORE9XICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAyMgorI2RlZmluZSBHTFhfUEJVRkZFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAyMworI2RlZmluZSBHTFhfUEJVRkZFUl9IRUlHSFQgICAgICAgICAgICAgICAgIDB4ODA0MAorI2RlZmluZSBHTFhfUEJVRkZFUl9XSURUSCAgICAgICAgICAgICAgICAgIDB4ODA0MQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX1ZFUlNJT05fMV80CisjZGVmaW5lIEdMWF9TQU1QTEVfQlVGRkVSUyAgICAgICAgICAgICAgICAgMTAwMDAwCisjZGVmaW5lIEdMWF9TQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfQVJCX2dldF9wcm9jX2FkZHJlc3MKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9BUkJfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xYX1NBTVBMRV9CVUZGRVJTX0FSQiAgICAgICAgICAgICAxMDAwMDAKKyNkZWZpbmUgR0xYX1NBTVBMRVNfQVJCICAgICAgICAgICAgICAgICAgICAxMDAwMDEKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9BUkJfdmVydGV4X2J1ZmZlcl9vYmplY3QKKyNkZWZpbmUgR0xYX0NPTlRFWFRfQUxMT1dfQlVGRkVSX0JZVEVfT1JERVJfTUlTTUFUQ0hfQVJCIDB4MjA5NQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX0FSQl9mYmNvbmZpZ19mbG9hdAorI2RlZmluZSBHTFhfUkdCQV9GTE9BVF9UWVBFX0FSQiAgICAgICAgICAgIDB4MjBCOQorI2RlZmluZSBHTFhfUkdCQV9GTE9BVF9CSVRfQVJCICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9BUkJfZnJhbWVidWZmZXJfc1JHQgorI2RlZmluZSBHTFhfRlJBTUVCVUZGRVJfU1JHQl9DQVBBQkxFX0FSQiAgIDB4MjBCMgorI2VuZGlmCisKKyNpZm5kZWYgR0xYX0FSQl9jcmVhdGVfY29udGV4dAorI2RlZmluZSBHTFhfQ09OVEVYVF9ERUJVR19CSVRfQVJCICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xYX0NPTlRFWFRfRk9SV0FSRF9DT01QQVRJQkxFX0JJVF9BUkIgMHgwMDAwMDAwMgorI2RlZmluZSBHTFhfQ09OVEVYVF9NQUpPUl9WRVJTSU9OX0FSQiAgICAgIDB4MjA5MQorI2RlZmluZSBHTFhfQ09OVEVYVF9NSU5PUl9WRVJTSU9OX0FSQiAgICAgIDB4MjA5MgorI2RlZmluZSBHTFhfQ09OVEVYVF9GTEFHU19BUkIgICAgICAgICAgICAgIDB4MjA5NAorI2VuZGlmCisKKyNpZm5kZWYgR0xYX0FSQl9jcmVhdGVfY29udGV4dF9wcm9maWxlCisjZGVmaW5lIEdMWF9DT05URVhUX0NPUkVfUFJPRklMRV9CSVRfQVJCICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTFhfQ09OVEVYVF9DT01QQVRJQklMSVRZX1BST0ZJTEVfQklUX0FSQiAweDAwMDAwMDAyCisjZGVmaW5lIEdMWF9DT05URVhUX1BST0ZJTEVfTUFTS19BUkIgICAgICAgMHg5MTI2CisjZW5kaWYKKworI2lmbmRlZiBHTFhfQVJCX2NyZWF0ZV9jb250ZXh0X3JvYnVzdG5lc3MKKyNkZWZpbmUgR0xYX0NPTlRFWFRfUk9CVVNUX0FDQ0VTU19CSVRfQVJCICAweDAwMDAwMDA0CisjZGVmaW5lIEdMWF9MT1NFX0NPTlRFWFRfT05fUkVTRVRfQVJCICAgICAgMHg4MjUyCisjZGVmaW5lIEdMWF9DT05URVhUX1JFU0VUX05PVElGSUNBVElPTl9TVFJBVEVHWV9BUkIgMHg4MjU2CisjZGVmaW5lIEdMWF9OT19SRVNFVF9OT1RJRklDQVRJT05fQVJCICAgICAgMHg4MjYxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJU19tdWx0aXNhbXBsZQorI2RlZmluZSBHTFhfU0FNUExFX0JVRkZFUlNfU0dJUyAgICAgICAgICAgIDEwMDAwMAorI2RlZmluZSBHTFhfU0FNUExFU19TR0lTICAgICAgICAgICAgICAgICAgIDEwMDAwMQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX0VYVF92aXN1YWxfaW5mbworI2RlZmluZSBHTFhfWF9WSVNVQUxfVFlQRV9FWFQgICAgICAgICAgICAgIDB4MjIKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX1RZUEVfRVhUICAgICAgICAgICAweDIzCisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9JTkRFWF9WQUxVRV9FWFQgICAgMHgyNAorI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFX0VYVCAgICAgIDB4MjUKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFX0VYVCAgICAweDI2CisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFX0VYVCAgICAgMHgyNworI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfQUxQSEFfVkFMVUVfRVhUICAgIDB4MjgKKyNkZWZpbmUgR0xYX05PTkVfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgR0xYX1RSVUVfQ09MT1JfRVhUICAgICAgICAgICAgICAgICAweDgwMDIKKyNkZWZpbmUgR0xYX0RJUkVDVF9DT0xPUl9FWFQgICAgICAgICAgICAgICAweDgwMDMKKyNkZWZpbmUgR0xYX1BTRVVET19DT0xPUl9FWFQgICAgICAgICAgICAgICAweDgwMDQKKyNkZWZpbmUgR0xYX1NUQVRJQ19DT0xPUl9FWFQgICAgICAgICAgICAgICAweDgwMDUKKyNkZWZpbmUgR0xYX0dSQVlfU0NBTEVfRVhUICAgICAgICAgICAgICAgICAweDgwMDYKKyNkZWZpbmUgR0xYX1NUQVRJQ19HUkFZX0VYVCAgICAgICAgICAgICAgICAweDgwMDcKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX1JHQl9FWFQgICAgICAgICAgICAweDgwMDgKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX0lOREVYX0VYVCAgICAgICAgICAweDgwMDkKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lfc3dhcF9jb250cm9sCisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJX3ZpZGVvX3N5bmMKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lfbWFrZV9jdXJyZW50X3JlYWQKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX3ZpZGVvX3NvdXJjZQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX0VYVF92aXN1YWxfcmF0aW5nCisjZGVmaW5lIEdMWF9WSVNVQUxfQ0FWRUFUX0VYVCAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBHTFhfU0xPV19WSVNVQUxfRVhUICAgICAgICAgICAgICAgIDB4ODAwMQorI2RlZmluZSBHTFhfTk9OX0NPTkZPUk1BTlRfVklTVUFMX0VYVCAgICAgIDB4ODAwRAorLyogcmV1c2UgR0xYX05PTkVfRVhUICovCisjZW5kaWYKKworI2lmbmRlZiBHTFhfRVhUX2ltcG9ydF9jb250ZXh0CisjZGVmaW5lIEdMWF9TSEFSRV9DT05URVhUX0VYVCAgICAgICAgICAgICAgMHg4MDBBCisjZGVmaW5lIEdMWF9WSVNVQUxfSURfRVhUICAgICAgICAgICAgICAgICAgMHg4MDBCCisjZGVmaW5lIEdMWF9TQ1JFRU5fRVhUICAgICAgICAgICAgICAgICAgICAgMHg4MDBDCisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF9mYmNvbmZpZworI2RlZmluZSBHTFhfV0lORE9XX0JJVF9TR0lYICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xYX1BJWE1BUF9CSVRfU0dJWCAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEdMWF9SR0JBX0JJVF9TR0lYICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTFhfQ09MT1JfSU5ERVhfQklUX1NHSVggICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0xYX0RSQVdBQkxFX1RZUEVfU0dJWCAgICAgICAgICAgICAweDgwMTAKKyNkZWZpbmUgR0xYX1JFTkRFUl9UWVBFX1NHSVggICAgICAgICAgICAgICAweDgwMTEKKyNkZWZpbmUgR0xYX1hfUkVOREVSQUJMRV9TR0lYICAgICAgICAgICAgICAweDgwMTIKKyNkZWZpbmUgR0xYX0ZCQ09ORklHX0lEX1NHSVggICAgICAgICAgICAgICAweDgwMTMKKyNkZWZpbmUgR0xYX1JHQkFfVFlQRV9TR0lYICAgICAgICAgICAgICAgICAweDgwMTQKKyNkZWZpbmUgR0xYX0NPTE9SX0lOREVYX1RZUEVfU0dJWCAgICAgICAgICAweDgwMTUKKy8qIHJldXNlIEdMWF9TQ1JFRU5fRVhUICovCisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF9wYnVmZmVyCisjZGVmaW5lIEdMWF9QQlVGRkVSX0JJVF9TR0lYICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTFhfQlVGRkVSX0NMT0JCRVJfTUFTS19TR0lYICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgR0xYX0ZST05UX0xFRlRfQlVGRkVSX0JJVF9TR0lYICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEdMWF9GUk9OVF9SSUdIVF9CVUZGRVJfQklUX1NHSVggICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTFhfQkFDS19MRUZUX0JVRkZFUl9CSVRfU0dJWCAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgR0xYX0JBQ0tfUklHSFRfQlVGRkVSX0JJVF9TR0lYICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEdMWF9BVVhfQlVGRkVSU19CSVRfU0dJWCAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBHTFhfREVQVEhfQlVGRkVSX0JJVF9TR0lYICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgR0xYX1NURU5DSUxfQlVGRkVSX0JJVF9TR0lYICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEdMWF9BQ0NVTV9CVUZGRVJfQklUX1NHSVggICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBHTFhfU0FNUExFX0JVRkZFUlNfQklUX1NHSVggICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgR0xYX01BWF9QQlVGRkVSX1dJRFRIX1NHSVggICAgICAgICAweDgwMTYKKyNkZWZpbmUgR0xYX01BWF9QQlVGRkVSX0hFSUdIVF9TR0lYICAgICAgICAweDgwMTcKKyNkZWZpbmUgR0xYX01BWF9QQlVGRkVSX1BJWEVMU19TR0lYICAgICAgICAweDgwMTgKKyNkZWZpbmUgR0xYX09QVElNQUxfUEJVRkZFUl9XSURUSF9TR0lYICAgICAweDgwMTkKKyNkZWZpbmUgR0xYX09QVElNQUxfUEJVRkZFUl9IRUlHSFRfU0dJWCAgICAweDgwMUEKKyNkZWZpbmUgR0xYX1BSRVNFUlZFRF9DT05URU5UU19TR0lYICAgICAgICAweDgwMUIKKyNkZWZpbmUgR0xYX0xBUkdFU1RfUEJVRkZFUl9TR0lYICAgICAgICAgICAweDgwMUMKKyNkZWZpbmUgR0xYX1dJRFRIX1NHSVggICAgICAgICAgICAgICAgICAgICAweDgwMUQKKyNkZWZpbmUgR0xYX0hFSUdIVF9TR0lYICAgICAgICAgICAgICAgICAgICAweDgwMUUKKyNkZWZpbmUgR0xYX0VWRU5UX01BU0tfU0dJWCAgICAgICAgICAgICAgICAweDgwMUYKKyNkZWZpbmUgR0xYX0RBTUFHRURfU0dJWCAgICAgICAgICAgICAgICAgICAweDgwMjAKKyNkZWZpbmUgR0xYX1NBVkVEX1NHSVggICAgICAgICAgICAgICAgICAgICAweDgwMjEKKyNkZWZpbmUgR0xYX1dJTkRPV19TR0lYICAgICAgICAgICAgICAgICAgICAweDgwMjIKKyNkZWZpbmUgR0xYX1BCVUZGRVJfU0dJWCAgICAgICAgICAgICAgICAgICAweDgwMjMKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lfY3VzaGlvbgorI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfdmlkZW9fcmVzaXplCisjZGVmaW5lIEdMWF9TWU5DX0ZSQU1FX1NHSVggICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBHTFhfU1lOQ19TV0FQX1NHSVggICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX2RtYnVmZmVyCisjZGVmaW5lIEdMWF9ESUdJVEFMX01FRElBX1BCVUZGRVJfU0dJWCAgICAgMHg4MDI0CisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF9zd2FwX2dyb3VwCisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF9zd2FwX2JhcnJpZXIKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lTX2JsZW5kZWRfb3ZlcmxheQorI2RlZmluZSBHTFhfQkxFTkRFRF9SR0JBX1NHSVMgICAgICAgICAgICAgIDB4ODAyNQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVNfc2hhcmVkX211bHRpc2FtcGxlCisjZGVmaW5lIEdMWF9NVUxUSVNBTVBMRV9TVUJfUkVDVF9XSURUSF9TR0lTIDB4ODAyNgorI2RlZmluZSBHTFhfTVVMVElTQU1QTEVfU1VCX1JFQ1RfSEVJR0hUX1NHSVMgMHg4MDI3CisjZW5kaWYKKworI2lmbmRlZiBHTFhfU1VOX2dldF90cmFuc3BhcmVudF9pbmRleAorI2VuZGlmCisKKyNpZm5kZWYgR0xYXzNERlhfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xYX1NBTVBMRV9CVUZGRVJTXzNERlggICAgICAgICAgICAweDgwNTAKKyNkZWZpbmUgR0xYX1NBTVBMRVNfM0RGWCAgICAgICAgICAgICAgICAgICAweDgwNTEKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9NRVNBX2NvcHlfc3ViX2J1ZmZlcgorI2VuZGlmCisKKyNpZm5kZWYgR0xYX01FU0FfcGl4bWFwX2NvbG9ybWFwCisjZW5kaWYKKworI2lmbmRlZiBHTFhfTUVTQV9yZWxlYXNlX2J1ZmZlcnMKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9NRVNBX3NldF8zZGZ4X21vZGUKKyNkZWZpbmUgR0xYXzNERlhfV0lORE9XX01PREVfTUVTQSAgICAgICAgICAweDEKKyNkZWZpbmUgR0xYXzNERlhfRlVMTFNDUkVFTl9NT0RFX01FU0EgICAgICAweDIKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX3Zpc3VhbF9zZWxlY3RfZ3JvdXAKKyNkZWZpbmUgR0xYX1ZJU1VBTF9TRUxFQ1RfR1JPVVBfU0dJWCAgICAgICAweDgwMjgKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9PTUxfc3dhcF9tZXRob2QKKyNkZWZpbmUgR0xYX1NXQVBfTUVUSE9EX09NTCAgICAgICAgICAgICAgICAweDgwNjAKKyNkZWZpbmUgR0xYX1NXQVBfRVhDSEFOR0VfT01MICAgICAgICAgICAgICAweDgwNjEKKyNkZWZpbmUgR0xYX1NXQVBfQ09QWV9PTUwgICAgICAgICAgICAgICAgICAweDgwNjIKKyNkZWZpbmUgR0xYX1NXQVBfVU5ERUZJTkVEX09NTCAgICAgICAgICAgICAweDgwNjMKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9PTUxfc3luY19jb250cm9sCisjZW5kaWYKKworI2lmbmRlZiBHTFhfTlZfZmxvYXRfYnVmZmVyCisjZGVmaW5lIEdMWF9GTE9BVF9DT01QT05FTlRTX05WICAgICAgICAgICAgMHgyMEIwCisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF9oeXBlcnBpcGUKKyNkZWZpbmUgR0xYX0hZUEVSUElQRV9QSVBFX05BTUVfTEVOR1RIX1NHSVggODAKKyNkZWZpbmUgR0xYX0JBRF9IWVBFUlBJUEVfQ09ORklHX1NHSVggICAgICA5MQorI2RlZmluZSBHTFhfQkFEX0hZUEVSUElQRV9TR0lYICAgICAgICAgICAgIDkyCisjZGVmaW5lIEdMWF9IWVBFUlBJUEVfRElTUExBWV9QSVBFX1NHSVggICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTFhfSFlQRVJQSVBFX1JFTkRFUl9QSVBFX1NHSVggICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0xYX1BJUEVfUkVDVF9TR0lYICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEdMWF9QSVBFX1JFQ1RfTElNSVRTX1NHSVggICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTFhfSFlQRVJQSVBFX1NURVJFT19TR0lYICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgR0xYX0hZUEVSUElQRV9QSVhFTF9BVkVSQUdFX1NHSVggICAweDAwMDAwMDA0CisjZGVmaW5lIEdMWF9IWVBFUlBJUEVfSURfU0dJWCAgICAgICAgICAgICAgMHg4MDMwCisjZW5kaWYKKworI2lmbmRlZiBHTFhfTUVTQV9hZ3Bfb2Zmc2V0CisjZW5kaWYKKworI2lmbmRlZiBHTFhfRVhUX2ZiY29uZmlnX3BhY2tlZF9mbG9hdAorI2RlZmluZSBHTFhfUkdCQV9VTlNJR05FRF9GTE9BVF9UWVBFX0VYVCAgIDB4MjBCMQorI2RlZmluZSBHTFhfUkdCQV9VTlNJR05FRF9GTE9BVF9CSVRfRVhUICAgIDB4MDAwMDAwMDgKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9FWFRfZnJhbWVidWZmZXJfc1JHQgorI2RlZmluZSBHTFhfRlJBTUVCVUZGRVJfU1JHQl9DQVBBQkxFX0VYVCAgIDB4MjBCMgorI2VuZGlmCisKKyNpZm5kZWYgR0xYX0VYVF90ZXh0dXJlX2Zyb21fcGl4bWFwCisjZGVmaW5lIEdMWF9URVhUVVJFXzFEX0JJVF9FWFQgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTFhfVEVYVFVSRV8yRF9CSVRfRVhUICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0xYX1RFWFRVUkVfUkVDVEFOR0xFX0JJVF9FWFQgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEdMWF9CSU5EX1RPX1RFWFRVUkVfUkdCX0VYVCAgICAgICAgMHgyMEQwCisjZGVmaW5lIEdMWF9CSU5EX1RPX1RFWFRVUkVfUkdCQV9FWFQgICAgICAgMHgyMEQxCisjZGVmaW5lIEdMWF9CSU5EX1RPX01JUE1BUF9URVhUVVJFX0VYVCAgICAgMHgyMEQyCisjZGVmaW5lIEdMWF9CSU5EX1RPX1RFWFRVUkVfVEFSR0VUU19FWFQgICAgMHgyMEQzCisjZGVmaW5lIEdMWF9ZX0lOVkVSVEVEX0VYVCAgICAgICAgICAgICAgICAgMHgyMEQ0CisjZGVmaW5lIEdMWF9URVhUVVJFX0ZPUk1BVF9FWFQgICAgICAgICAgICAgMHgyMEQ1CisjZGVmaW5lIEdMWF9URVhUVVJFX1RBUkdFVF9FWFQgICAgICAgICAgICAgMHgyMEQ2CisjZGVmaW5lIEdMWF9NSVBNQVBfVEVYVFVSRV9FWFQgICAgICAgICAgICAgMHgyMEQ3CisjZGVmaW5lIEdMWF9URVhUVVJFX0ZPUk1BVF9OT05FX0VYVCAgICAgICAgMHgyMEQ4CisjZGVmaW5lIEdMWF9URVhUVVJFX0ZPUk1BVF9SR0JfRVhUICAgICAgICAgMHgyMEQ5CisjZGVmaW5lIEdMWF9URVhUVVJFX0ZPUk1BVF9SR0JBX0VYVCAgICAgICAgMHgyMERBCisjZGVmaW5lIEdMWF9URVhUVVJFXzFEX0VYVCAgICAgICAgICAgICAgICAgMHgyMERCCisjZGVmaW5lIEdMWF9URVhUVVJFXzJEX0VYVCAgICAgICAgICAgICAgICAgMHgyMERDCisjZGVmaW5lIEdMWF9URVhUVVJFX1JFQ1RBTkdMRV9FWFQgICAgICAgICAgMHgyMERECisjZGVmaW5lIEdMWF9GUk9OVF9MRUZUX0VYVCAgICAgICAgICAgICAgICAgMHgyMERFCisjZGVmaW5lIEdMWF9GUk9OVF9SSUdIVF9FWFQgICAgICAgICAgICAgICAgMHgyMERGCisjZGVmaW5lIEdMWF9CQUNLX0xFRlRfRVhUICAgICAgICAgICAgICAgICAgMHgyMEUwCisjZGVmaW5lIEdMWF9CQUNLX1JJR0hUX0VYVCAgICAgICAgICAgICAgICAgMHgyMEUxCisjZGVmaW5lIEdMWF9GUk9OVF9FWFQgICAgICAgICAgICAgICAgICAgICAgR0xYX0ZST05UX0xFRlRfRVhUCisjZGVmaW5lIEdMWF9CQUNLX0VYVCAgICAgICAgICAgICAgICAgICAgICAgR0xYX0JBQ0tfTEVGVF9FWFQKKyNkZWZpbmUgR0xYX0FVWDBfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRTIKKyNkZWZpbmUgR0xYX0FVWDFfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRTMKKyNkZWZpbmUgR0xYX0FVWDJfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRTQKKyNkZWZpbmUgR0xYX0FVWDNfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRTUKKyNkZWZpbmUgR0xYX0FVWDRfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRTYKKyNkZWZpbmUgR0xYX0FVWDVfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRTcKKyNkZWZpbmUgR0xYX0FVWDZfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRTgKKyNkZWZpbmUgR0xYX0FVWDdfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRTkKKyNkZWZpbmUgR0xYX0FVWDhfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRUEKKyNkZWZpbmUgR0xYX0FVWDlfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRUIKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9OVl9wcmVzZW50X3ZpZGVvCisjZGVmaW5lIEdMWF9OVU1fVklERU9fU0xPVFNfTlYgICAgICAgICAgICAgMHgyMEYwCisjZW5kaWYKKworI2lmbmRlZiBHTFhfTlZfdmlkZW9fb3V0CisjZGVmaW5lIEdMWF9WSURFT19PVVRfQ09MT1JfTlYgICAgICAgICAgICAgMHgyMEMzCisjZGVmaW5lIEdMWF9WSURFT19PVVRfQUxQSEFfTlYgICAgICAgICAgICAgMHgyMEM0CisjZGVmaW5lIEdMWF9WSURFT19PVVRfREVQVEhfTlYgICAgICAgICAgICAgMHgyMEM1CisjZGVmaW5lIEdMWF9WSURFT19PVVRfQ09MT1JfQU5EX0FMUEhBX05WICAgMHgyMEM2CisjZGVmaW5lIEdMWF9WSURFT19PVVRfQ09MT1JfQU5EX0RFUFRIX05WICAgMHgyMEM3CisjZGVmaW5lIEdMWF9WSURFT19PVVRfRlJBTUVfTlYgICAgICAgICAgICAgMHgyMEM4CisjZGVmaW5lIEdMWF9WSURFT19PVVRfRklFTERfMV9OViAgICAgICAgICAgMHgyMEM5CisjZGVmaW5lIEdMWF9WSURFT19PVVRfRklFTERfMl9OViAgICAgICAgICAgMHgyMENBCisjZGVmaW5lIEdMWF9WSURFT19PVVRfU1RBQ0tFRF9GSUVMRFNfMV8yX05WIDB4MjBDQgorI2RlZmluZSBHTFhfVklERU9fT1VUX1NUQUNLRURfRklFTERTXzJfMV9OViAweDIwQ0MKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9OVl9zd2FwX2dyb3VwCisjZW5kaWYKKworI2lmbmRlZiBHTFhfTlZfdmlkZW9fY2FwdHVyZQorI2RlZmluZSBHTFhfREVWSUNFX0lEX05WICAgICAgICAgICAgICAgICAgIDB4MjBDRAorI2RlZmluZSBHTFhfVU5JUVVFX0lEX05WICAgICAgICAgICAgICAgICAgIDB4MjBDRQorI2RlZmluZSBHTFhfTlVNX1ZJREVPX0NBUFRVUkVfU0xPVFNfTlYgICAgIDB4MjBDRgorI2VuZGlmCisKKyNpZm5kZWYgR0xYX0VYVF9zd2FwX2NvbnRyb2wKKyNkZWZpbmUgR0xYX1NXQVBfSU5URVJWQUxfRVhUICAgICAgICAgICAgICAweDIwRjEKKyNkZWZpbmUgR0xYX01BWF9TV0FQX0lOVEVSVkFMX0VYVCAgICAgICAgICAweDIwRjIKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9OVl9jb3B5X2ltYWdlCisjZW5kaWYKKworI2lmbmRlZiBHTFhfSU5URUxfc3dhcF9ldmVudAorI2RlZmluZSBHTFhfQlVGRkVSX1NXQVBfQ09NUExFVEVfSU5URUxfTUFTSyAweDA0MDAwMDAwCisjZGVmaW5lIEdMWF9FWENIQU5HRV9DT01QTEVURV9JTlRFTCAgICAgICAgMHg4MTgwCisjZGVmaW5lIEdMWF9DT1BZX0NPTVBMRVRFX0lOVEVMICAgICAgICAgICAgMHg4MTgxCisjZGVmaW5lIEdMWF9GTElQX0NPTVBMRVRFX0lOVEVMICAgICAgICAgICAgMHg4MTgyCisjZW5kaWYKKworI2lmbmRlZiBHTFhfTlZfbXVsdGlzYW1wbGVfY292ZXJhZ2UKKyNkZWZpbmUgR0xYX0NPVkVSQUdFX1NBTVBMRVNfTlYgICAgICAgICAgICAxMDAwMDEKKyNkZWZpbmUgR0xYX0NPTE9SX1NBTVBMRVNfTlYgICAgICAgICAgICAgICAweDIwQjMKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9BTURfZ3B1X2Fzc29jaWF0aW9uCisjZGVmaW5lIEdMWF9HUFVfVkVORE9SX0FNRCAgICAgICAgICAgICAgICAgMHgxRjAwCisjZGVmaW5lIEdMWF9HUFVfUkVOREVSRVJfU1RSSU5HX0FNRCAgICAgICAgMHgxRjAxCisjZGVmaW5lIEdMWF9HUFVfT1BFTkdMX1ZFUlNJT05fU1RSSU5HX0FNRCAgMHgxRjAyCisjZGVmaW5lIEdMWF9HUFVfRkFTVEVTVF9UQVJHRVRfR1BVU19BTUQgICAgMHgyMUEyCisjZGVmaW5lIEdMWF9HUFVfUkFNX0FNRCAgICAgICAgICAgICAgICAgICAgMHgyMUEzCisjZGVmaW5lIEdMWF9HUFVfQ0xPQ0tfQU1EICAgICAgICAgICAgICAgICAgMHgyMUE0CisjZGVmaW5lIEdMWF9HUFVfTlVNX1BJUEVTX0FNRCAgICAgICAgICAgICAgMHgyMUE1CisjZGVmaW5lIEdMWF9HUFVfTlVNX1NJTURfQU1EICAgICAgICAgICAgICAgMHgyMUE2CisjZGVmaW5lIEdMWF9HUFVfTlVNX1JCX0FNRCAgICAgICAgICAgICAgICAgMHgyMUE3CisjZGVmaW5lIEdMWF9HUFVfTlVNX1NQSV9BTUQgICAgICAgICAgICAgICAgMHgyMUE4CisjZW5kaWYKKworI2lmbmRlZiBHTFhfRVhUX2NyZWF0ZV9jb250ZXh0X2VzMl9wcm9maWxlCisjZGVmaW5lIEdMWF9DT05URVhUX0VTMl9QUk9GSUxFX0JJVF9FWFQgICAgMHgwMDAwMDAwNAorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgR0xYX0FSQl9nZXRfcHJvY19hZGRyZXNzCit0eXBlZGVmIHZvaWQgKCpfX0dMWGV4dEZ1bmNQdHIpKHZvaWQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfdmlkZW9fc291cmNlCit0eXBlZGVmIFhJRCBHTFhWaWRlb1NvdXJjZVNHSVg7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF9mYmNvbmZpZwordHlwZWRlZiBYSUQgR0xYRkJDb25maWdJRFNHSVg7Cit0eXBlZGVmIHN0cnVjdCBfX0dMWEZCQ29uZmlnUmVjICpHTFhGQkNvbmZpZ1NHSVg7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF9wYnVmZmVyCit0eXBlZGVmIFhJRCBHTFhQYnVmZmVyU0dJWDsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgdHlwZTsKKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsJICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCBzZW5kX2V2ZW50OwkJICAvKiB0cnVlIGlmIHRoaXMgY2FtZSBmb3IgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICpkaXNwbGF5OwkJICAvKiBkaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgR0xYRHJhd2FibGUgZHJhd2FibGU7CSAgLyogaS5kLiBvZiBEcmF3YWJsZSAqLworICAgIGludCBldmVudF90eXBlOwkJICAvKiBHTFhfREFNQUdFRF9TR0lYIG9yIEdMWF9TQVZFRF9TR0lYICovCisgICAgaW50IGRyYXdfdHlwZTsJCSAgLyogR0xYX1dJTkRPV19TR0lYIG9yIEdMWF9QQlVGRkVSX1NHSVggKi8KKyAgICB1bnNpZ25lZCBpbnQgbWFzazsJICAvKiBtYXNrIGluZGljYXRpbmcgd2hpY2ggYnVmZmVycyBhcmUgYWZmZWN0ZWQqLworICAgIGludCB4LCB5OworICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgIGludCBjb3VudDsJCSAgLyogaWYgbm9uemVybywgYXQgbGVhc3QgdGhpcyBtYW55IG1vcmUgKi8KK30gR0xYQnVmZmVyQ2xvYmJlckV2ZW50U0dJWDsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9OVl92aWRlb19vdXRwdXQKK3R5cGVkZWYgdW5zaWduZWQgaW50IEdMWFZpZGVvRGV2aWNlTlY7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfTlZfdmlkZW9fY2FwdHVyZQordHlwZWRlZiBYSUQgR0xYVmlkZW9DYXB0dXJlRGV2aWNlTlY7CisjZW5kaWYKKworI2lmbmRlZiBHTEVYVF82NF9UWVBFU19ERUZJTkVECisvKiBUaGlzIGNvZGUgYmxvY2sgaXMgZHVwbGljYXRlZCBpbiBnbGV4dC5oLCBzbyBtdXN0IGJlIHByb3RlY3RlZCAqLworI2RlZmluZSBHTEVYVF82NF9UWVBFU19ERUZJTkVECisvKiBEZWZpbmUgaW50MzJfdCwgaW50NjRfdCwgYW5kIHVpbnQ2NF90IHR5cGVzIGZvciBVU1QvTVNDICovCisvKiAoYXMgdXNlZCBpbiB0aGUgR0xYX09NTF9zeW5jX2NvbnRyb2wgZXh0ZW5zaW9uKS4gKi8KKyNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZWxpZiBkZWZpbmVkKF9fc3VuX18pIHx8IGRlZmluZWQoX19kaWdpdGFsX18pCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpZiBkZWZpbmVkKF9fU1REQ19fKQorI2lmIGRlZmluZWQoX19hcmNoNjRfXykgfHwgZGVmaW5lZChfTFA2NCkKK3R5cGVkZWYgbG9uZyBpbnQgaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgdWludDY0X3Q7CisjZWxzZQordHlwZWRlZiBsb25nIGxvbmcgaW50IGludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgdWludDY0X3Q7CisjZW5kaWYgLyogX19hcmNoNjRfXyAqLworI2VuZGlmIC8qIF9fU1REQ19fICovCisjZWxpZiBkZWZpbmVkKCBfX1ZNUyApIHx8IGRlZmluZWQoX19zZ2kpCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbGlmIGRlZmluZWQoX19TQ09fXykgfHwgZGVmaW5lZChfX1VTTENfXykKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbGlmIGRlZmluZWQoX19VTklYT1MyX18pIHx8IGRlZmluZWQoX19TT0w2NF9fKQordHlwZWRlZiBsb25nIGludCBpbnQzMl90OwordHlwZWRlZiBsb25nIGxvbmcgaW50IGludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgdWludDY0X3Q7CisjZWxpZiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChfX0dOVUNfXykKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbGlmIGRlZmluZWQoX1dJTjMyKQordHlwZWRlZiBfX2ludDMyIGludDMyX3Q7Cit0eXBlZGVmIF9faW50NjQgaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB1aW50NjRfdDsKKyNlbHNlCisjaW5jbHVkZSA8aW50dHlwZXMuaD4gICAgIC8qIEZhbGxiYWNrIG9wdGlvbiAqLworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBHTFhfVkVSU0lPTl8xXzMKKyNkZWZpbmUgR0xYX1ZFUlNJT05fMV8zIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBHTFhGQkNvbmZpZyAqIGdsWEdldEZCQ29uZmlncyAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBpbnQgKm5lbGVtZW50cyk7CitleHRlcm4gR0xYRkJDb25maWcgKiBnbFhDaG9vc2VGQkNvbmZpZyAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBjb25zdCBpbnQgKmF0dHJpYl9saXN0LCBpbnQgKm5lbGVtZW50cyk7CitleHRlcm4gaW50IGdsWEdldEZCQ29uZmlnQXR0cmliIChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZywgaW50IGF0dHJpYnV0ZSwgaW50ICp2YWx1ZSk7CitleHRlcm4gWFZpc3VhbEluZm8gKiBnbFhHZXRWaXN1YWxGcm9tRkJDb25maWcgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnKTsKK2V4dGVybiBHTFhXaW5kb3cgZ2xYQ3JlYXRlV2luZG93IChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZywgV2luZG93IHdpbiwgY29uc3QgaW50ICphdHRyaWJfbGlzdCk7CitleHRlcm4gdm9pZCBnbFhEZXN0cm95V2luZG93IChEaXNwbGF5ICpkcHksIEdMWFdpbmRvdyB3aW4pOworZXh0ZXJuIEdMWFBpeG1hcCBnbFhDcmVhdGVQaXhtYXAgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnLCBQaXhtYXAgcGl4bWFwLCBjb25zdCBpbnQgKmF0dHJpYl9saXN0KTsKK2V4dGVybiB2b2lkIGdsWERlc3Ryb3lQaXhtYXAgKERpc3BsYXkgKmRweSwgR0xYUGl4bWFwIHBpeG1hcCk7CitleHRlcm4gR0xYUGJ1ZmZlciBnbFhDcmVhdGVQYnVmZmVyIChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZywgY29uc3QgaW50ICphdHRyaWJfbGlzdCk7CitleHRlcm4gdm9pZCBnbFhEZXN0cm95UGJ1ZmZlciAoRGlzcGxheSAqZHB5LCBHTFhQYnVmZmVyIHBidWYpOworZXh0ZXJuIHZvaWQgZ2xYUXVlcnlEcmF3YWJsZSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3LCBpbnQgYXR0cmlidXRlLCB1bnNpZ25lZCBpbnQgKnZhbHVlKTsKK2V4dGVybiBHTFhDb250ZXh0IGdsWENyZWF0ZU5ld0NvbnRleHQgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnLCBpbnQgcmVuZGVyX3R5cGUsIEdMWENvbnRleHQgc2hhcmVfbGlzdCwgQm9vbCBkaXJlY3QpOworZXh0ZXJuIEJvb2wgZ2xYTWFrZUNvbnRleHRDdXJyZW50IChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXcsIEdMWERyYXdhYmxlIHJlYWQsIEdMWENvbnRleHQgY3R4KTsKK2V4dGVybiBHTFhEcmF3YWJsZSBnbFhHZXRDdXJyZW50UmVhZERyYXdhYmxlICh2b2lkKTsKK2V4dGVybiBEaXNwbGF5ICogZ2xYR2V0Q3VycmVudERpc3BsYXkgKHZvaWQpOworZXh0ZXJuIGludCBnbFhRdWVyeUNvbnRleHQgKERpc3BsYXkgKmRweSwgR0xYQ29udGV4dCBjdHgsIGludCBhdHRyaWJ1dGUsIGludCAqdmFsdWUpOworZXh0ZXJuIHZvaWQgZ2xYU2VsZWN0RXZlbnQgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhdywgdW5zaWduZWQgbG9uZyBldmVudF9tYXNrKTsKK2V4dGVybiB2b2lkIGdsWEdldFNlbGVjdGVkRXZlbnQgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhdywgdW5zaWduZWQgbG9uZyAqZXZlbnRfbWFzayk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMWEZCQ29uZmlnICogKCAqIFBGTkdMWEdFVEZCQ09ORklHU1BST0MpIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIGludCAqbmVsZW1lbnRzKTsKK3R5cGVkZWYgR0xYRkJDb25maWcgKiAoICogUEZOR0xYQ0hPT1NFRkJDT05GSUdQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBjb25zdCBpbnQgKmF0dHJpYl9saXN0LCBpbnQgKm5lbGVtZW50cyk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYR0VURkJDT05GSUdBVFRSSUJQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZyBjb25maWcsIGludCBhdHRyaWJ1dGUsIGludCAqdmFsdWUpOwordHlwZWRlZiBYVmlzdWFsSW5mbyAqICggKiBQRk5HTFhHRVRWSVNVQUxGUk9NRkJDT05GSUdQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZyBjb25maWcpOwordHlwZWRlZiBHTFhXaW5kb3cgKCAqIFBGTkdMWENSRUFURVdJTkRPV1BST0MpIChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZywgV2luZG93IHdpbiwgY29uc3QgaW50ICphdHRyaWJfbGlzdCk7Cit0eXBlZGVmIHZvaWQgKCAqIFBGTkdMWERFU1RST1lXSU5ET1dQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhXaW5kb3cgd2luKTsKK3R5cGVkZWYgR0xYUGl4bWFwICggKiBQRk5HTFhDUkVBVEVQSVhNQVBQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZyBjb25maWcsIFBpeG1hcCBwaXhtYXAsIGNvbnN0IGludCAqYXR0cmliX2xpc3QpOwordHlwZWRlZiB2b2lkICggKiBQRk5HTFhERVNUUk9ZUElYTUFQUFJPQykgKERpc3BsYXkgKmRweSwgR0xYUGl4bWFwIHBpeG1hcCk7Cit0eXBlZGVmIEdMWFBidWZmZXIgKCAqIFBGTkdMWENSRUFURVBCVUZGRVJQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZyBjb25maWcsIGNvbnN0IGludCAqYXR0cmliX2xpc3QpOwordHlwZWRlZiB2b2lkICggKiBQRk5HTFhERVNUUk9ZUEJVRkZFUlBST0MpIChEaXNwbGF5ICpkcHksIEdMWFBidWZmZXIgcGJ1Zik7Cit0eXBlZGVmIHZvaWQgKCAqIFBGTkdMWFFVRVJZRFJBV0FCTEVQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3LCBpbnQgYXR0cmlidXRlLCB1bnNpZ25lZCBpbnQgKnZhbHVlKTsKK3R5cGVkZWYgR0xYQ29udGV4dCAoICogUEZOR0xYQ1JFQVRFTkVXQ09OVEVYVFBST0MpIChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZywgaW50IHJlbmRlcl90eXBlLCBHTFhDb250ZXh0IHNoYXJlX2xpc3QsIEJvb2wgZGlyZWN0KTsKK3R5cGVkZWYgQm9vbCAoICogUEZOR0xYTUFLRUNPTlRFWFRDVVJSRU5UUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhdywgR0xYRHJhd2FibGUgcmVhZCwgR0xYQ29udGV4dCBjdHgpOwordHlwZWRlZiBHTFhEcmF3YWJsZSAoICogUEZOR0xYR0VUQ1VSUkVOVFJFQUREUkFXQUJMRVBST0MpICh2b2lkKTsKK3R5cGVkZWYgRGlzcGxheSAqICggKiBQRk5HTFhHRVRDVVJSRU5URElTUExBWVBST0MpICh2b2lkKTsKK3R5cGVkZWYgaW50ICggKiBQRk5HTFhRVUVSWUNPTlRFWFRQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhDb250ZXh0IGN0eCwgaW50IGF0dHJpYnV0ZSwgaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKCAqIFBGTkdMWFNFTEVDVEVWRU5UUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhdywgdW5zaWduZWQgbG9uZyBldmVudF9tYXNrKTsKK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYR0VUU0VMRUNURURFVkVOVFBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXcsIHVuc2lnbmVkIGxvbmcgKmV2ZW50X21hc2spOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX1ZFUlNJT05fMV80CisjZGVmaW5lIEdMWF9WRVJTSU9OXzFfNCAxCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gX19HTFhleHRGdW5jUHRyIGdsWEdldFByb2NBZGRyZXNzIChjb25zdCBHTHVieXRlICpwcm9jTmFtZSk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIF9fR0xYZXh0RnVuY1B0ciAoICogUEZOR0xYR0VUUFJPQ0FERFJFU1NQUk9DKSAoY29uc3QgR0x1Ynl0ZSAqcHJvY05hbWUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX0FSQl9nZXRfcHJvY19hZGRyZXNzCisjZGVmaW5lIEdMWF9BUkJfZ2V0X3Byb2NfYWRkcmVzcyAxCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gX19HTFhleHRGdW5jUHRyIGdsWEdldFByb2NBZGRyZXNzQVJCIChjb25zdCBHTHVieXRlICpwcm9jTmFtZSk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIF9fR0xYZXh0RnVuY1B0ciAoICogUEZOR0xYR0VUUFJPQ0FERFJFU1NBUkJQUk9DKSAoY29uc3QgR0x1Ynl0ZSAqcHJvY05hbWUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX0FSQl9tdWx0aXNhbXBsZQorI2RlZmluZSBHTFhfQVJCX211bHRpc2FtcGxlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9BUkJfZmJjb25maWdfZmxvYXQKKyNkZWZpbmUgR0xYX0FSQl9mYmNvbmZpZ19mbG9hdCAxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfQVJCX2ZyYW1lYnVmZmVyX3NSR0IKKyNkZWZpbmUgR0xYX0FSQl9mcmFtZWJ1ZmZlcl9zUkdCIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9BUkJfY3JlYXRlX2NvbnRleHQKKyNkZWZpbmUgR0xYX0FSQl9jcmVhdGVfY29udGV4dCAxCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gR0xYQ29udGV4dCBnbFhDcmVhdGVDb250ZXh0QXR0cmlic0FSQiAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZyBjb25maWcsIEdMWENvbnRleHQgc2hhcmVfY29udGV4dCwgQm9vbCBkaXJlY3QsIGNvbnN0IGludCAqYXR0cmliX2xpc3QpOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBHTFhDb250ZXh0ICggKiBQRk5HTFhDUkVBVEVDT05URVhUQVRUUklCU0FSQlBST0MpIChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZywgR0xYQ29udGV4dCBzaGFyZV9jb250ZXh0LCBCb29sIGRpcmVjdCwgY29uc3QgaW50ICphdHRyaWJfbGlzdCk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfQVJCX2NyZWF0ZV9jb250ZXh0X3Byb2ZpbGUKKyNkZWZpbmUgR0xYX0FSQl9jcmVhdGVfY29udGV4dF9wcm9maWxlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9BUkJfY3JlYXRlX2NvbnRleHRfcm9idXN0bmVzcworI2RlZmluZSBHTFhfQVJCX2NyZWF0ZV9jb250ZXh0X3JvYnVzdG5lc3MgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVNfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xYX1NHSVNfbXVsdGlzYW1wbGUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX0VYVF92aXN1YWxfaW5mbworI2RlZmluZSBHTFhfRVhUX3Zpc3VhbF9pbmZvIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lfc3dhcF9jb250cm9sCisjZGVmaW5lIEdMWF9TR0lfc3dhcF9jb250cm9sIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBpbnQgZ2xYU3dhcEludGVydmFsU0dJIChpbnQgaW50ZXJ2YWwpOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWFNXQVBJTlRFUlZBTFNHSVBST0MpIChpbnQgaW50ZXJ2YWwpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSV92aWRlb19zeW5jCisjZGVmaW5lIEdMWF9TR0lfdmlkZW9fc3luYyAxCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gaW50IGdsWEdldFZpZGVvU3luY1NHSSAodW5zaWduZWQgaW50ICpjb3VudCk7CitleHRlcm4gaW50IGdsWFdhaXRWaWRlb1N5bmNTR0kgKGludCBkaXZpc29yLCBpbnQgcmVtYWluZGVyLCB1bnNpZ25lZCBpbnQgKmNvdW50KTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgaW50ICggKiBQRk5HTFhHRVRWSURFT1NZTkNTR0lQUk9DKSAodW5zaWduZWQgaW50ICpjb3VudCk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYV0FJVFZJREVPU1lOQ1NHSVBST0MpIChpbnQgZGl2aXNvciwgaW50IHJlbWFpbmRlciwgdW5zaWduZWQgaW50ICpjb3VudCk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJX21ha2VfY3VycmVudF9yZWFkCisjZGVmaW5lIEdMWF9TR0lfbWFrZV9jdXJyZW50X3JlYWQgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIEJvb2wgZ2xYTWFrZUN1cnJlbnRSZWFkU0dJIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXcsIEdMWERyYXdhYmxlIHJlYWQsIEdMWENvbnRleHQgY3R4KTsKK2V4dGVybiBHTFhEcmF3YWJsZSBnbFhHZXRDdXJyZW50UmVhZERyYXdhYmxlU0dJICh2b2lkKTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgQm9vbCAoICogUEZOR0xYTUFLRUNVUlJFTlRSRUFEU0dJUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhdywgR0xYRHJhd2FibGUgcmVhZCwgR0xYQ29udGV4dCBjdHgpOwordHlwZWRlZiBHTFhEcmF3YWJsZSAoICogUEZOR0xYR0VUQ1VSUkVOVFJFQUREUkFXQUJMRVNHSVBST0MpICh2b2lkKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX3ZpZGVvX3NvdXJjZQorI2RlZmluZSBHTFhfU0dJWF92aWRlb19zb3VyY2UgMQorI2lmZGVmIF9WTF9ICisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gR0xYVmlkZW9Tb3VyY2VTR0lYIGdsWENyZWF0ZUdMWFZpZGVvU291cmNlU0dJWCAoRGlzcGxheSAqZGlzcGxheSwgaW50IHNjcmVlbiwgVkxTZXJ2ZXIgc2VydmVyLCBWTFBhdGggcGF0aCwgaW50IG5vZGVDbGFzcywgVkxOb2RlIGRyYWluTm9kZSk7CitleHRlcm4gdm9pZCBnbFhEZXN0cm95R0xYVmlkZW9Tb3VyY2VTR0lYIChEaXNwbGF5ICpkcHksIEdMWFZpZGVvU291cmNlU0dJWCBnbHh2aWRlb3NvdXJjZSk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMWFZpZGVvU291cmNlU0dJWCAoICogUEZOR0xYQ1JFQVRFR0xYVklERU9TT1VSQ0VTR0lYUFJPQykgKERpc3BsYXkgKmRpc3BsYXksIGludCBzY3JlZW4sIFZMU2VydmVyIHNlcnZlciwgVkxQYXRoIHBhdGgsIGludCBub2RlQ2xhc3MsIFZMTm9kZSBkcmFpbk5vZGUpOwordHlwZWRlZiB2b2lkICggKiBQRk5HTFhERVNUUk9ZR0xYVklERU9TT1VSQ0VTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgR0xYVmlkZW9Tb3VyY2VTR0lYIGdseHZpZGVvc291cmNlKTsKKyNlbmRpZiAvKiBfVkxfSCAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xYX0VYVF92aXN1YWxfcmF0aW5nCisjZGVmaW5lIEdMWF9FWFRfdmlzdWFsX3JhdGluZyAxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfRVhUX2ltcG9ydF9jb250ZXh0CisjZGVmaW5lIEdMWF9FWFRfaW1wb3J0X2NvbnRleHQgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIERpc3BsYXkgKiBnbFhHZXRDdXJyZW50RGlzcGxheUVYVCAodm9pZCk7CitleHRlcm4gaW50IGdsWFF1ZXJ5Q29udGV4dEluZm9FWFQgKERpc3BsYXkgKmRweSwgR0xYQ29udGV4dCBjb250ZXh0LCBpbnQgYXR0cmlidXRlLCBpbnQgKnZhbHVlKTsKK2V4dGVybiBHTFhDb250ZXh0SUQgZ2xYR2V0Q29udGV4dElERVhUIChjb25zdCBHTFhDb250ZXh0IGNvbnRleHQpOworZXh0ZXJuIEdMWENvbnRleHQgZ2xYSW1wb3J0Q29udGV4dEVYVCAoRGlzcGxheSAqZHB5LCBHTFhDb250ZXh0SUQgY29udGV4dElEKTsKK2V4dGVybiB2b2lkIGdsWEZyZWVDb250ZXh0RVhUIChEaXNwbGF5ICpkcHksIEdMWENvbnRleHQgY29udGV4dCk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIERpc3BsYXkgKiAoICogUEZOR0xYR0VUQ1VSUkVOVERJU1BMQVlFWFRQUk9DKSAodm9pZCk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYUVVFUllDT05URVhUSU5GT0VYVFBST0MpIChEaXNwbGF5ICpkcHksIEdMWENvbnRleHQgY29udGV4dCwgaW50IGF0dHJpYnV0ZSwgaW50ICp2YWx1ZSk7Cit0eXBlZGVmIEdMWENvbnRleHRJRCAoICogUEZOR0xYR0VUQ09OVEVYVElERVhUUFJPQykgKGNvbnN0IEdMWENvbnRleHQgY29udGV4dCk7Cit0eXBlZGVmIEdMWENvbnRleHQgKCAqIFBGTkdMWElNUE9SVENPTlRFWFRFWFRQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhDb250ZXh0SUQgY29udGV4dElEKTsKK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYRlJFRUNPTlRFWFRFWFRQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhDb250ZXh0IGNvbnRleHQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfZmJjb25maWcKKyNkZWZpbmUgR0xYX1NHSVhfZmJjb25maWcgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIGludCBnbFhHZXRGQkNvbmZpZ0F0dHJpYlNHSVggKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWdTR0lYIGNvbmZpZywgaW50IGF0dHJpYnV0ZSwgaW50ICp2YWx1ZSk7CitleHRlcm4gR0xYRkJDb25maWdTR0lYICogZ2xYQ2hvb3NlRkJDb25maWdTR0lYIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIGludCAqYXR0cmliX2xpc3QsIGludCAqbmVsZW1lbnRzKTsKK2V4dGVybiBHTFhQaXhtYXAgZ2xYQ3JlYXRlR0xYUGl4bWFwV2l0aENvbmZpZ1NHSVggKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWdTR0lYIGNvbmZpZywgUGl4bWFwIHBpeG1hcCk7CitleHRlcm4gR0xYQ29udGV4dCBnbFhDcmVhdGVDb250ZXh0V2l0aENvbmZpZ1NHSVggKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWdTR0lYIGNvbmZpZywgaW50IHJlbmRlcl90eXBlLCBHTFhDb250ZXh0IHNoYXJlX2xpc3QsIEJvb2wgZGlyZWN0KTsKK2V4dGVybiBYVmlzdWFsSW5mbyAqIGdsWEdldFZpc3VhbEZyb21GQkNvbmZpZ1NHSVggKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWdTR0lYIGNvbmZpZyk7CitleHRlcm4gR0xYRkJDb25maWdTR0lYIGdsWEdldEZCQ29uZmlnRnJvbVZpc3VhbFNHSVggKERpc3BsYXkgKmRweSwgWFZpc3VhbEluZm8gKnZpcyk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIGludCAoICogUEZOR0xYR0VURkJDT05GSUdBVFRSSUJTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWdTR0lYIGNvbmZpZywgaW50IGF0dHJpYnV0ZSwgaW50ICp2YWx1ZSk7Cit0eXBlZGVmIEdMWEZCQ29uZmlnU0dJWCAqICggKiBQRk5HTFhDSE9PU0VGQkNPTkZJR1NHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBpbnQgKmF0dHJpYl9saXN0LCBpbnQgKm5lbGVtZW50cyk7Cit0eXBlZGVmIEdMWFBpeG1hcCAoICogUEZOR0xYQ1JFQVRFR0xYUElYTUFQV0lUSENPTkZJR1NHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZ1NHSVggY29uZmlnLCBQaXhtYXAgcGl4bWFwKTsKK3R5cGVkZWYgR0xYQ29udGV4dCAoICogUEZOR0xYQ1JFQVRFQ09OVEVYVFdJVEhDT05GSUdTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWdTR0lYIGNvbmZpZywgaW50IHJlbmRlcl90eXBlLCBHTFhDb250ZXh0IHNoYXJlX2xpc3QsIEJvb2wgZGlyZWN0KTsKK3R5cGVkZWYgWFZpc3VhbEluZm8gKiAoICogUEZOR0xYR0VUVklTVUFMRlJPTUZCQ09ORklHU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnU0dJWCBjb25maWcpOwordHlwZWRlZiBHTFhGQkNvbmZpZ1NHSVggKCAqIFBGTkdMWEdFVEZCQ09ORklHRlJPTVZJU1VBTFNHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBYVmlzdWFsSW5mbyAqdmlzKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX3BidWZmZXIKKyNkZWZpbmUgR0xYX1NHSVhfcGJ1ZmZlciAxCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gR0xYUGJ1ZmZlclNHSVggZ2xYQ3JlYXRlR0xYUGJ1ZmZlclNHSVggKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWdTR0lYIGNvbmZpZywgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCBpbnQgKmF0dHJpYl9saXN0KTsKK2V4dGVybiB2b2lkIGdsWERlc3Ryb3lHTFhQYnVmZmVyU0dJWCAoRGlzcGxheSAqZHB5LCBHTFhQYnVmZmVyU0dJWCBwYnVmKTsKK2V4dGVybiBpbnQgZ2xYUXVlcnlHTFhQYnVmZmVyU0dJWCAoRGlzcGxheSAqZHB5LCBHTFhQYnVmZmVyU0dJWCBwYnVmLCBpbnQgYXR0cmlidXRlLCB1bnNpZ25lZCBpbnQgKnZhbHVlKTsKK2V4dGVybiB2b2lkIGdsWFNlbGVjdEV2ZW50U0dJWCAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgdW5zaWduZWQgbG9uZyBtYXNrKTsKK2V4dGVybiB2b2lkIGdsWEdldFNlbGVjdGVkRXZlbnRTR0lYIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCB1bnNpZ25lZCBsb25nICptYXNrKTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0xYUGJ1ZmZlclNHSVggKCAqIFBGTkdMWENSRUFURUdMWFBCVUZGRVJTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWdTR0lYIGNvbmZpZywgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCBpbnQgKmF0dHJpYl9saXN0KTsKK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYREVTVFJPWUdMWFBCVUZGRVJTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgR0xYUGJ1ZmZlclNHSVggcGJ1Zik7Cit0eXBlZGVmIGludCAoICogUEZOR0xYUVVFUllHTFhQQlVGRkVSU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIEdMWFBidWZmZXJTR0lYIHBidWYsIGludCBhdHRyaWJ1dGUsIHVuc2lnbmVkIGludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkICggKiBQRk5HTFhTRUxFQ1RFVkVOVFNHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgdW5zaWduZWQgbG9uZyBtYXNrKTsKK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYR0VUU0VMRUNURURFVkVOVFNHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgdW5zaWduZWQgbG9uZyAqbWFzayk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJX2N1c2hpb24KKyNkZWZpbmUgR0xYX1NHSV9jdXNoaW9uIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiB2b2lkIGdsWEN1c2hpb25TR0kgKERpc3BsYXkgKmRweSwgV2luZG93IHdpbmRvdywgZmxvYXQgY3VzaGlvbik7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKCAqIFBGTkdMWENVU0hJT05TR0lQUk9DKSAoRGlzcGxheSAqZHB5LCBXaW5kb3cgd2luZG93LCBmbG9hdCBjdXNoaW9uKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX3ZpZGVvX3Jlc2l6ZQorI2RlZmluZSBHTFhfU0dJWF92aWRlb19yZXNpemUgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIGludCBnbFhCaW5kQ2hhbm5lbFRvV2luZG93U0dJWCAoRGlzcGxheSAqZGlzcGxheSwgaW50IHNjcmVlbiwgaW50IGNoYW5uZWwsIFdpbmRvdyB3aW5kb3cpOworZXh0ZXJuIGludCBnbFhDaGFubmVsUmVjdFNHSVggKERpc3BsYXkgKmRpc3BsYXksIGludCBzY3JlZW4sIGludCBjaGFubmVsLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCk7CitleHRlcm4gaW50IGdsWFF1ZXJ5Q2hhbm5lbFJlY3RTR0lYIChEaXNwbGF5ICpkaXNwbGF5LCBpbnQgc2NyZWVuLCBpbnQgY2hhbm5lbCwgaW50ICpkeCwgaW50ICpkeSwgaW50ICpkdywgaW50ICpkaCk7CitleHRlcm4gaW50IGdsWFF1ZXJ5Q2hhbm5lbERlbHRhc1NHSVggKERpc3BsYXkgKmRpc3BsYXksIGludCBzY3JlZW4sIGludCBjaGFubmVsLCBpbnQgKngsIGludCAqeSwgaW50ICp3LCBpbnQgKmgpOworZXh0ZXJuIGludCBnbFhDaGFubmVsUmVjdFN5bmNTR0lYIChEaXNwbGF5ICpkaXNwbGF5LCBpbnQgc2NyZWVuLCBpbnQgY2hhbm5lbCwgR0xlbnVtIHN5bmN0eXBlKTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgaW50ICggKiBQRk5HTFhCSU5EQ0hBTk5FTFRPV0lORE9XU0dJWFBST0MpIChEaXNwbGF5ICpkaXNwbGF5LCBpbnQgc2NyZWVuLCBpbnQgY2hhbm5lbCwgV2luZG93IHdpbmRvdyk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYQ0hBTk5FTFJFQ1RTR0lYUFJPQykgKERpc3BsYXkgKmRpc3BsYXksIGludCBzY3JlZW4sIGludCBjaGFubmVsLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYUVVFUllDSEFOTkVMUkVDVFNHSVhQUk9DKSAoRGlzcGxheSAqZGlzcGxheSwgaW50IHNjcmVlbiwgaW50IGNoYW5uZWwsIGludCAqZHgsIGludCAqZHksIGludCAqZHcsIGludCAqZGgpOwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWFFVRVJZQ0hBTk5FTERFTFRBU1NHSVhQUk9DKSAoRGlzcGxheSAqZGlzcGxheSwgaW50IHNjcmVlbiwgaW50IGNoYW5uZWwsIGludCAqeCwgaW50ICp5LCBpbnQgKncsIGludCAqaCk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYQ0hBTk5FTFJFQ1RTWU5DU0dJWFBST0MpIChEaXNwbGF5ICpkaXNwbGF5LCBpbnQgc2NyZWVuLCBpbnQgY2hhbm5lbCwgR0xlbnVtIHN5bmN0eXBlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX2RtYnVmZmVyCisjZGVmaW5lIEdMWF9TR0lYX2RtYnVmZmVyIDEKKyNpZmRlZiBfRE1fQlVGRkVSX0hfCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gQm9vbCBnbFhBc3NvY2lhdGVETVBidWZmZXJTR0lYIChEaXNwbGF5ICpkcHksIEdMWFBidWZmZXJTR0lYIHBidWZmZXIsIERNcGFyYW1zICpwYXJhbXMsIERNYnVmZmVyIGRtYnVmZmVyKTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgQm9vbCAoICogUEZOR0xYQVNTT0NJQVRFRE1QQlVGRkVSU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIEdMWFBidWZmZXJTR0lYIHBidWZmZXIsIERNcGFyYW1zICpwYXJhbXMsIERNYnVmZmVyIGRtYnVmZmVyKTsKKyNlbmRpZiAvKiBfRE1fQlVGRkVSX0hfICovCisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF9zd2FwX2dyb3VwCisjZGVmaW5lIEdMWF9TR0lYX3N3YXBfZ3JvdXAgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIHZvaWQgZ2xYSm9pblN3YXBHcm91cFNHSVggKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIEdMWERyYXdhYmxlIG1lbWJlcik7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKCAqIFBGTkdMWEpPSU5TV0FQR1JPVVBTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIEdMWERyYXdhYmxlIG1lbWJlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF9zd2FwX2JhcnJpZXIKKyNkZWZpbmUgR0xYX1NHSVhfc3dhcF9iYXJyaWVyIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiB2b2lkIGdsWEJpbmRTd2FwQmFycmllclNHSVggKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludCBiYXJyaWVyKTsKK2V4dGVybiBCb29sIGdsWFF1ZXJ5TWF4U3dhcEJhcnJpZXJzU0dJWCAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBpbnQgKm1heCk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKCAqIFBGTkdMWEJJTkRTV0FQQkFSUklFUlNHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgaW50IGJhcnJpZXIpOwordHlwZWRlZiBCb29sICggKiBQRk5HTFhRVUVSWU1BWFNXQVBCQVJSSUVSU1NHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBpbnQgKm1heCk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfU1VOX2dldF90cmFuc3BhcmVudF9pbmRleAorI2RlZmluZSBHTFhfU1VOX2dldF90cmFuc3BhcmVudF9pbmRleCAxCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gU3RhdHVzIGdsWEdldFRyYW5zcGFyZW50SW5kZXhTVU4gKERpc3BsYXkgKmRweSwgV2luZG93IG92ZXJsYXksIFdpbmRvdyB1bmRlcmxheSwgbG9uZyAqcFRyYW5zcGFyZW50SW5kZXgpOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBTdGF0dXMgKCAqIFBGTkdMWEdFVFRSQU5TUEFSRU5USU5ERVhTVU5QUk9DKSAoRGlzcGxheSAqZHB5LCBXaW5kb3cgb3ZlcmxheSwgV2luZG93IHVuZGVybGF5LCBsb25nICpwVHJhbnNwYXJlbnRJbmRleCk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfTUVTQV9jb3B5X3N1Yl9idWZmZXIKKyNkZWZpbmUgR0xYX01FU0FfY29weV9zdWJfYnVmZmVyIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiB2b2lkIGdsWENvcHlTdWJCdWZmZXJNRVNBIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKCAqIFBGTkdMWENPUFlTVUJCVUZGRVJNRVNBUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9NRVNBX3BpeG1hcF9jb2xvcm1hcAorI2RlZmluZSBHTFhfTUVTQV9waXhtYXBfY29sb3JtYXAgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIEdMWFBpeG1hcCBnbFhDcmVhdGVHTFhQaXhtYXBNRVNBIChEaXNwbGF5ICpkcHksIFhWaXN1YWxJbmZvICp2aXN1YWwsIFBpeG1hcCBwaXhtYXAsIENvbG9ybWFwIGNtYXApOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBHTFhQaXhtYXAgKCAqIFBGTkdMWENSRUFURUdMWFBJWE1BUE1FU0FQUk9DKSAoRGlzcGxheSAqZHB5LCBYVmlzdWFsSW5mbyAqdmlzdWFsLCBQaXhtYXAgcGl4bWFwLCBDb2xvcm1hcCBjbWFwKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9NRVNBX3JlbGVhc2VfYnVmZmVycworI2RlZmluZSBHTFhfTUVTQV9yZWxlYXNlX2J1ZmZlcnMgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIEJvb2wgZ2xYUmVsZWFzZUJ1ZmZlcnNNRVNBIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlKTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgQm9vbCAoICogUEZOR0xYUkVMRUFTRUJVRkZFUlNNRVNBUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX01FU0Ffc2V0XzNkZnhfbW9kZQorI2RlZmluZSBHTFhfTUVTQV9zZXRfM2RmeF9tb2RlIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBCb29sIGdsWFNldDNEZnhNb2RlTUVTQSAoaW50IG1vZGUpOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBCb29sICggKiBQRk5HTFhTRVQzREZYTU9ERU1FU0FQUk9DKSAoaW50IG1vZGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfdmlzdWFsX3NlbGVjdF9ncm91cAorI2RlZmluZSBHTFhfU0dJWF92aXN1YWxfc2VsZWN0X2dyb3VwIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9PTUxfc3dhcF9tZXRob2QKKyNkZWZpbmUgR0xYX09NTF9zd2FwX21ldGhvZCAxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfT01MX3N5bmNfY29udHJvbAorI2RlZmluZSBHTFhfT01MX3N5bmNfY29udHJvbCAxCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gQm9vbCBnbFhHZXRTeW5jVmFsdWVzT01MIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQ2NF90ICp1c3QsIGludDY0X3QgKm1zYywgaW50NjRfdCAqc2JjKTsKK2V4dGVybiBCb29sIGdsWEdldE1zY1JhdGVPTUwgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludDMyX3QgKm51bWVyYXRvciwgaW50MzJfdCAqZGVub21pbmF0b3IpOworZXh0ZXJuIGludDY0X3QgZ2xYU3dhcEJ1ZmZlcnNNc2NPTUwgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludDY0X3QgdGFyZ2V0X21zYywgaW50NjRfdCBkaXZpc29yLCBpbnQ2NF90IHJlbWFpbmRlcik7CitleHRlcm4gQm9vbCBnbFhXYWl0Rm9yTXNjT01MIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQ2NF90IHRhcmdldF9tc2MsIGludDY0X3QgZGl2aXNvciwgaW50NjRfdCByZW1haW5kZXIsIGludDY0X3QgKnVzdCwgaW50NjRfdCAqbXNjLCBpbnQ2NF90ICpzYmMpOworZXh0ZXJuIEJvb2wgZ2xYV2FpdEZvclNiY09NTCAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgaW50NjRfdCB0YXJnZXRfc2JjLCBpbnQ2NF90ICp1c3QsIGludDY0X3QgKm1zYywgaW50NjRfdCAqc2JjKTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgQm9vbCAoICogUEZOR0xYR0VUU1lOQ1ZBTFVFU09NTFBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQ2NF90ICp1c3QsIGludDY0X3QgKm1zYywgaW50NjRfdCAqc2JjKTsKK3R5cGVkZWYgQm9vbCAoICogUEZOR0xYR0VUTVNDUkFURU9NTFBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQzMl90ICpudW1lcmF0b3IsIGludDMyX3QgKmRlbm9taW5hdG9yKTsKK3R5cGVkZWYgaW50NjRfdCAoICogUEZOR0xYU1dBUEJVRkZFUlNNU0NPTUxQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgaW50NjRfdCB0YXJnZXRfbXNjLCBpbnQ2NF90IGRpdmlzb3IsIGludDY0X3QgcmVtYWluZGVyKTsKK3R5cGVkZWYgQm9vbCAoICogUEZOR0xYV0FJVEZPUk1TQ09NTFBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQ2NF90IHRhcmdldF9tc2MsIGludDY0X3QgZGl2aXNvciwgaW50NjRfdCByZW1haW5kZXIsIGludDY0X3QgKnVzdCwgaW50NjRfdCAqbXNjLCBpbnQ2NF90ICpzYmMpOwordHlwZWRlZiBCb29sICggKiBQRk5HTFhXQUlURk9SU0JDT01MUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludDY0X3QgdGFyZ2V0X3NiYywgaW50NjRfdCAqdXN0LCBpbnQ2NF90ICptc2MsIGludDY0X3QgKnNiYyk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfTlZfZmxvYXRfYnVmZmVyCisjZGVmaW5lIEdMWF9OVl9mbG9hdF9idWZmZXIgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfaHlwZXJwaXBlCisjZGVmaW5lIEdMWF9TR0lYX2h5cGVycGlwZSAxCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyICAgIHBpcGVOYW1lW0dMWF9IWVBFUlBJUEVfUElQRV9OQU1FX0xFTkdUSF9TR0lYXTsKKyAgICBpbnQgICAgIG5ldHdvcmtJZDsKK30gR0xYSHlwZXJwaXBlTmV0d29ya1NHSVg7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyICAgIHBpcGVOYW1lW0dMWF9IWVBFUlBJUEVfUElQRV9OQU1FX0xFTkdUSF9TR0lYXTsKKyAgICBpbnQgICAgIGNoYW5uZWw7CisgICAgdW5zaWduZWQgaW50CisgICAgICBwYXJ0aWNpcGF0aW9uVHlwZTsKKyAgICBpbnQgICAgIHRpbWVTbGljZTsKK30gR0xYSHlwZXJwaXBlQ29uZmlnU0dJWDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgcGlwZU5hbWVbR0xYX0hZUEVSUElQRV9QSVBFX05BTUVfTEVOR1RIX1NHSVhdOworICAgIGludCBzcmNYT3JpZ2luLCBzcmNZT3JpZ2luLCBzcmNXaWR0aCwgc3JjSGVpZ2h0OworICAgIGludCBkZXN0WE9yaWdpbiwgZGVzdFlPcmlnaW4sIGRlc3RXaWR0aCwgZGVzdEhlaWdodDsKK30gR0xYUGlwZVJlY3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyIHBpcGVOYW1lW0dMWF9IWVBFUlBJUEVfUElQRV9OQU1FX0xFTkdUSF9TR0lYXTsKKyAgICBpbnQgWE9yaWdpbiwgWU9yaWdpbiwgbWF4SGVpZ2h0LCBtYXhXaWR0aDsKK30gR0xYUGlwZVJlY3RMaW1pdHM7CisKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBHTFhIeXBlcnBpcGVOZXR3b3JrU0dJWCAqIGdsWFF1ZXJ5SHlwZXJwaXBlTmV0d29ya1NHSVggKERpc3BsYXkgKmRweSwgaW50ICpucGlwZXMpOworZXh0ZXJuIGludCBnbFhIeXBlcnBpcGVDb25maWdTR0lYIChEaXNwbGF5ICpkcHksIGludCBuZXR3b3JrSWQsIGludCBucGlwZXMsIEdMWEh5cGVycGlwZUNvbmZpZ1NHSVggKmNmZywgaW50ICpocElkKTsKK2V4dGVybiBHTFhIeXBlcnBpcGVDb25maWdTR0lYICogZ2xYUXVlcnlIeXBlcnBpcGVDb25maWdTR0lYIChEaXNwbGF5ICpkcHksIGludCBocElkLCBpbnQgKm5waXBlcyk7CitleHRlcm4gaW50IGdsWERlc3Ryb3lIeXBlcnBpcGVDb25maWdTR0lYIChEaXNwbGF5ICpkcHksIGludCBocElkKTsKK2V4dGVybiBpbnQgZ2xYQmluZEh5cGVycGlwZVNHSVggKERpc3BsYXkgKmRweSwgaW50IGhwSWQpOworZXh0ZXJuIGludCBnbFhRdWVyeUh5cGVycGlwZUJlc3RBdHRyaWJTR0lYIChEaXNwbGF5ICpkcHksIGludCB0aW1lU2xpY2UsIGludCBhdHRyaWIsIGludCBzaXplLCB2b2lkICphdHRyaWJMaXN0LCB2b2lkICpyZXR1cm5BdHRyaWJMaXN0KTsKK2V4dGVybiBpbnQgZ2xYSHlwZXJwaXBlQXR0cmliU0dJWCAoRGlzcGxheSAqZHB5LCBpbnQgdGltZVNsaWNlLCBpbnQgYXR0cmliLCBpbnQgc2l6ZSwgdm9pZCAqYXR0cmliTGlzdCk7CitleHRlcm4gaW50IGdsWFF1ZXJ5SHlwZXJwaXBlQXR0cmliU0dJWCAoRGlzcGxheSAqZHB5LCBpbnQgdGltZVNsaWNlLCBpbnQgYXR0cmliLCBpbnQgc2l6ZSwgdm9pZCAqcmV0dXJuQXR0cmliTGlzdCk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMWEh5cGVycGlwZU5ldHdvcmtTR0lYICogKCAqIFBGTkdMWFFVRVJZSFlQRVJQSVBFTkVUV09SS1NHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgKm5waXBlcyk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYSFlQRVJQSVBFQ09ORklHU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIGludCBuZXR3b3JrSWQsIGludCBucGlwZXMsIEdMWEh5cGVycGlwZUNvbmZpZ1NHSVggKmNmZywgaW50ICpocElkKTsKK3R5cGVkZWYgR0xYSHlwZXJwaXBlQ29uZmlnU0dJWCAqICggKiBQRk5HTFhRVUVSWUhZUEVSUElQRUNPTkZJR1NHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgaHBJZCwgaW50ICpucGlwZXMpOwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWERFU1RST1lIWVBFUlBJUEVDT05GSUdTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgaW50IGhwSWQpOwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWEJJTkRIWVBFUlBJUEVTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgaW50IGhwSWQpOwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWFFVRVJZSFlQRVJQSVBFQkVTVEFUVFJJQlNHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgdGltZVNsaWNlLCBpbnQgYXR0cmliLCBpbnQgc2l6ZSwgdm9pZCAqYXR0cmliTGlzdCwgdm9pZCAqcmV0dXJuQXR0cmliTGlzdCk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYSFlQRVJQSVBFQVRUUklCU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIGludCB0aW1lU2xpY2UsIGludCBhdHRyaWIsIGludCBzaXplLCB2b2lkICphdHRyaWJMaXN0KTsKK3R5cGVkZWYgaW50ICggKiBQRk5HTFhRVUVSWUhZUEVSUElQRUFUVFJJQlNHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgdGltZVNsaWNlLCBpbnQgYXR0cmliLCBpbnQgc2l6ZSwgdm9pZCAqcmV0dXJuQXR0cmliTGlzdCk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfTUVTQV9hZ3Bfb2Zmc2V0CisjZGVmaW5lIEdMWF9NRVNBX2FncF9vZmZzZXQgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIHVuc2lnbmVkIGludCBnbFhHZXRBR1BPZmZzZXRNRVNBIChjb25zdCB2b2lkICpwb2ludGVyKTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50ICggKiBQRk5HTFhHRVRBR1BPRkZTRVRNRVNBUFJPQykgKGNvbnN0IHZvaWQgKnBvaW50ZXIpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX0VYVF9mYmNvbmZpZ19wYWNrZWRfZmxvYXQKKyNkZWZpbmUgR0xYX0VYVF9mYmNvbmZpZ19wYWNrZWRfZmxvYXQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX0VYVF9mcmFtZWJ1ZmZlcl9zUkdCCisjZGVmaW5lIEdMWF9FWFRfZnJhbWVidWZmZXJfc1JHQiAxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfRVhUX3RleHR1cmVfZnJvbV9waXhtYXAKKyNkZWZpbmUgR0xYX0VYVF90ZXh0dXJlX2Zyb21fcGl4bWFwIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiB2b2lkIGdsWEJpbmRUZXhJbWFnZUVYVCAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgaW50IGJ1ZmZlciwgY29uc3QgaW50ICphdHRyaWJfbGlzdCk7CitleHRlcm4gdm9pZCBnbFhSZWxlYXNlVGV4SW1hZ2VFWFQgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludCBidWZmZXIpOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkICggKiBQRk5HTFhCSU5EVEVYSU1BR0VFWFRQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgaW50IGJ1ZmZlciwgY29uc3QgaW50ICphdHRyaWJfbGlzdCk7Cit0eXBlZGVmIHZvaWQgKCAqIFBGTkdMWFJFTEVBU0VURVhJTUFHRUVYVFBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQgYnVmZmVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9OVl9wcmVzZW50X3ZpZGVvCisjZGVmaW5lIEdMWF9OVl9wcmVzZW50X3ZpZGVvIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiB1bnNpZ25lZCBpbnQgKiBnbFhFbnVtZXJhdGVWaWRlb0RldmljZXNOViAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBpbnQgKm5lbGVtZW50cyk7CitleHRlcm4gaW50IGdsWEJpbmRWaWRlb0RldmljZU5WIChEaXNwbGF5ICpkcHksIHVuc2lnbmVkIGludCB2aWRlb19zbG90LCB1bnNpZ25lZCBpbnQgdmlkZW9fZGV2aWNlLCBjb25zdCBpbnQgKmF0dHJpYl9saXN0KTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50ICogKCAqIFBGTkdMWEVOVU1FUkFURVZJREVPREVWSUNFU05WUFJPQykgKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgaW50ICpuZWxlbWVudHMpOwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWEJJTkRWSURFT0RFVklDRU5WUFJPQykgKERpc3BsYXkgKmRweSwgdW5zaWduZWQgaW50IHZpZGVvX3Nsb3QsIHVuc2lnbmVkIGludCB2aWRlb19kZXZpY2UsIGNvbnN0IGludCAqYXR0cmliX2xpc3QpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX05WX3ZpZGVvX291dHB1dAorI2RlZmluZSBHTFhfTlZfdmlkZW9fb3V0cHV0IDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBpbnQgZ2xYR2V0VmlkZW9EZXZpY2VOViAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBpbnQgbnVtVmlkZW9EZXZpY2VzLCBHTFhWaWRlb0RldmljZU5WICpwVmlkZW9EZXZpY2UpOworZXh0ZXJuIGludCBnbFhSZWxlYXNlVmlkZW9EZXZpY2VOViAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBHTFhWaWRlb0RldmljZU5WIFZpZGVvRGV2aWNlKTsKK2V4dGVybiBpbnQgZ2xYQmluZFZpZGVvSW1hZ2VOViAoRGlzcGxheSAqZHB5LCBHTFhWaWRlb0RldmljZU5WIFZpZGVvRGV2aWNlLCBHTFhQYnVmZmVyIHBidWYsIGludCBpVmlkZW9CdWZmZXIpOworZXh0ZXJuIGludCBnbFhSZWxlYXNlVmlkZW9JbWFnZU5WIChEaXNwbGF5ICpkcHksIEdMWFBidWZmZXIgcGJ1Zik7CitleHRlcm4gaW50IGdsWFNlbmRQYnVmZmVyVG9WaWRlb05WIChEaXNwbGF5ICpkcHksIEdMWFBidWZmZXIgcGJ1ZiwgaW50IGlCdWZmZXJUeXBlLCB1bnNpZ25lZCBsb25nICpwdWxDb3VudGVyUGJ1ZmZlciwgR0xib29sZWFuIGJCbG9jayk7CitleHRlcm4gaW50IGdsWEdldFZpZGVvSW5mb05WIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIEdMWFZpZGVvRGV2aWNlTlYgVmlkZW9EZXZpY2UsIHVuc2lnbmVkIGxvbmcgKnB1bENvdW50ZXJPdXRwdXRQYnVmZmVyLCB1bnNpZ25lZCBsb25nICpwdWxDb3VudGVyT3V0cHV0VmlkZW8pOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWEdFVFZJREVPREVWSUNFTlZQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBpbnQgbnVtVmlkZW9EZXZpY2VzLCBHTFhWaWRlb0RldmljZU5WICpwVmlkZW9EZXZpY2UpOwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWFJFTEVBU0VWSURFT0RFVklDRU5WUFJPQykgKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgR0xYVmlkZW9EZXZpY2VOViBWaWRlb0RldmljZSk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYQklORFZJREVPSU1BR0VOVlBST0MpIChEaXNwbGF5ICpkcHksIEdMWFZpZGVvRGV2aWNlTlYgVmlkZW9EZXZpY2UsIEdMWFBidWZmZXIgcGJ1ZiwgaW50IGlWaWRlb0J1ZmZlcik7Cit0eXBlZGVmIGludCAoICogUEZOR0xYUkVMRUFTRVZJREVPSU1BR0VOVlBST0MpIChEaXNwbGF5ICpkcHksIEdMWFBidWZmZXIgcGJ1Zik7Cit0eXBlZGVmIGludCAoICogUEZOR0xYU0VORFBCVUZGRVJUT1ZJREVPTlZQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhQYnVmZmVyIHBidWYsIGludCBpQnVmZmVyVHlwZSwgdW5zaWduZWQgbG9uZyAqcHVsQ291bnRlclBidWZmZXIsIEdMYm9vbGVhbiBiQmxvY2spOwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWEdFVFZJREVPSU5GT05WUFJPQykgKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgR0xYVmlkZW9EZXZpY2VOViBWaWRlb0RldmljZSwgdW5zaWduZWQgbG9uZyAqcHVsQ291bnRlck91dHB1dFBidWZmZXIsIHVuc2lnbmVkIGxvbmcgKnB1bENvdW50ZXJPdXRwdXRWaWRlbyk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfTlZfc3dhcF9ncm91cAorI2RlZmluZSBHTFhfTlZfc3dhcF9ncm91cCAxCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gQm9vbCBnbFhKb2luU3dhcEdyb3VwTlYgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIEdMdWludCBncm91cCk7CitleHRlcm4gQm9vbCBnbFhCaW5kU3dhcEJhcnJpZXJOViAoRGlzcGxheSAqZHB5LCBHTHVpbnQgZ3JvdXAsIEdMdWludCBiYXJyaWVyKTsKK2V4dGVybiBCb29sIGdsWFF1ZXJ5U3dhcEdyb3VwTlYgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIEdMdWludCAqZ3JvdXAsIEdMdWludCAqYmFycmllcik7CitleHRlcm4gQm9vbCBnbFhRdWVyeU1heFN3YXBHcm91cHNOViAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBHTHVpbnQgKm1heEdyb3VwcywgR0x1aW50ICptYXhCYXJyaWVycyk7CitleHRlcm4gQm9vbCBnbFhRdWVyeUZyYW1lQ291bnROViAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBHTHVpbnQgKmNvdW50KTsKK2V4dGVybiBCb29sIGdsWFJlc2V0RnJhbWVDb3VudE5WIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4pOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBCb29sICggKiBQRk5HTFhKT0lOU1dBUEdST1VQTlZQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgR0x1aW50IGdyb3VwKTsKK3R5cGVkZWYgQm9vbCAoICogUEZOR0xYQklORFNXQVBCQVJSSUVSTlZQUk9DKSAoRGlzcGxheSAqZHB5LCBHTHVpbnQgZ3JvdXAsIEdMdWludCBiYXJyaWVyKTsKK3R5cGVkZWYgQm9vbCAoICogUEZOR0xYUVVFUllTV0FQR1JPVVBOVlBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBHTHVpbnQgKmdyb3VwLCBHTHVpbnQgKmJhcnJpZXIpOwordHlwZWRlZiBCb29sICggKiBQRk5HTFhRVUVSWU1BWFNXQVBHUk9VUFNOVlBST0MpIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIEdMdWludCAqbWF4R3JvdXBzLCBHTHVpbnQgKm1heEJhcnJpZXJzKTsKK3R5cGVkZWYgQm9vbCAoICogUEZOR0xYUVVFUllGUkFNRUNPVU5UTlZQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBHTHVpbnQgKmNvdW50KTsKK3R5cGVkZWYgQm9vbCAoICogUEZOR0xYUkVTRVRGUkFNRUNPVU5UTlZQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9OVl92aWRlb19jYXB0dXJlCisjZGVmaW5lIEdMWF9OVl92aWRlb19jYXB0dXJlIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBpbnQgZ2xYQmluZFZpZGVvQ2FwdHVyZURldmljZU5WIChEaXNwbGF5ICpkcHksIHVuc2lnbmVkIGludCB2aWRlb19jYXB0dXJlX3Nsb3QsIEdMWFZpZGVvQ2FwdHVyZURldmljZU5WIGRldmljZSk7CitleHRlcm4gR0xYVmlkZW9DYXB0dXJlRGV2aWNlTlYgKiBnbFhFbnVtZXJhdGVWaWRlb0NhcHR1cmVEZXZpY2VzTlYgKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgaW50ICpuZWxlbWVudHMpOworZXh0ZXJuIHZvaWQgZ2xYTG9ja1ZpZGVvQ2FwdHVyZURldmljZU5WIChEaXNwbGF5ICpkcHksIEdMWFZpZGVvQ2FwdHVyZURldmljZU5WIGRldmljZSk7CitleHRlcm4gaW50IGdsWFF1ZXJ5VmlkZW9DYXB0dXJlRGV2aWNlTlYgKERpc3BsYXkgKmRweSwgR0xYVmlkZW9DYXB0dXJlRGV2aWNlTlYgZGV2aWNlLCBpbnQgYXR0cmlidXRlLCBpbnQgKnZhbHVlKTsKK2V4dGVybiB2b2lkIGdsWFJlbGVhc2VWaWRlb0NhcHR1cmVEZXZpY2VOViAoRGlzcGxheSAqZHB5LCBHTFhWaWRlb0NhcHR1cmVEZXZpY2VOViBkZXZpY2UpOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWEJJTkRWSURFT0NBUFRVUkVERVZJQ0VOVlBST0MpIChEaXNwbGF5ICpkcHksIHVuc2lnbmVkIGludCB2aWRlb19jYXB0dXJlX3Nsb3QsIEdMWFZpZGVvQ2FwdHVyZURldmljZU5WIGRldmljZSk7Cit0eXBlZGVmIEdMWFZpZGVvQ2FwdHVyZURldmljZU5WICogKCAqIFBGTkdMWEVOVU1FUkFURVZJREVPQ0FQVFVSRURFVklDRVNOVlBST0MpIChEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sIGludCAqbmVsZW1lbnRzKTsKK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYTE9DS1ZJREVPQ0FQVFVSRURFVklDRU5WUFJPQykgKERpc3BsYXkgKmRweSwgR0xYVmlkZW9DYXB0dXJlRGV2aWNlTlYgZGV2aWNlKTsKK3R5cGVkZWYgaW50ICggKiBQRk5HTFhRVUVSWVZJREVPQ0FQVFVSRURFVklDRU5WUFJPQykgKERpc3BsYXkgKmRweSwgR0xYVmlkZW9DYXB0dXJlRGV2aWNlTlYgZGV2aWNlLCBpbnQgYXR0cmlidXRlLCBpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYUkVMRUFTRVZJREVPQ0FQVFVSRURFVklDRU5WUFJPQykgKERpc3BsYXkgKmRweSwgR0xYVmlkZW9DYXB0dXJlRGV2aWNlTlYgZGV2aWNlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9FWFRfc3dhcF9jb250cm9sCisjZGVmaW5lIEdMWF9FWFRfc3dhcF9jb250cm9sIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBpbnQgZ2xYU3dhcEludGVydmFsRVhUIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQgaW50ZXJ2YWwpOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWFNXQVBJTlRFUlZBTEVYVFBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQgaW50ZXJ2YWwpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX05WX2NvcHlfaW1hZ2UKKyNkZWZpbmUgR0xYX05WX2NvcHlfaW1hZ2UgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIHZvaWQgZ2xYQ29weUltYWdlU3ViRGF0YU5WIChEaXNwbGF5ICpkcHksIEdMWENvbnRleHQgc3JjQ3R4LCBHTHVpbnQgc3JjTmFtZSwgR0xlbnVtIHNyY1RhcmdldCwgR0xpbnQgc3JjTGV2ZWwsIEdMaW50IHNyY1gsIEdMaW50IHNyY1ksIEdMaW50IHNyY1osIEdMWENvbnRleHQgZHN0Q3R4LCBHTHVpbnQgZHN0TmFtZSwgR0xlbnVtIGRzdFRhcmdldCwgR0xpbnQgZHN0TGV2ZWwsIEdMaW50IGRzdFgsIEdMaW50IGRzdFksIEdMaW50IGRzdFosIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYQ09QWUlNQUdFU1VCREFUQU5WUFJPQykgKERpc3BsYXkgKmRweSwgR0xYQ29udGV4dCBzcmNDdHgsIEdMdWludCBzcmNOYW1lLCBHTGVudW0gc3JjVGFyZ2V0LCBHTGludCBzcmNMZXZlbCwgR0xpbnQgc3JjWCwgR0xpbnQgc3JjWSwgR0xpbnQgc3JjWiwgR0xYQ29udGV4dCBkc3RDdHgsIEdMdWludCBkc3ROYW1lLCBHTGVudW0gZHN0VGFyZ2V0LCBHTGludCBkc3RMZXZlbCwgR0xpbnQgZHN0WCwgR0xpbnQgZHN0WSwgR0xpbnQgZHN0WiwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX0lOVEVMX3N3YXBfZXZlbnQKKyNkZWZpbmUgR0xYX0lOVEVMX3N3YXBfZXZlbnQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX05WX211bHRpc2FtcGxlX2NvdmVyYWdlCisjZGVmaW5lIEdMWF9OVl9tdWx0aXNhbXBsZV9jb3ZlcmFnZSAxCisjZW5kaWYKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvaW50ZXJuYWwvZHJpX2ludGVyZmFjZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9pbnRlcm5hbC9kcmlfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIxNDQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvaW50ZXJuYWwvZHJpX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsOTg2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTgtMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IFJlZCBIYXQsIEluYy4KKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDQKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiBvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViCisgKiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBUSEVJUiBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBcZmlsZSBkcmlfaW50ZXJmYWNlLmgKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYWxsIHRoZSB0eXBlcyBhbmQgZnVuY3Rpb25zIHRoYXQgZGVmaW5lIHRoZSBpbnRlcmZhY2UKKyAqIGJldHdlZW4gYSBEUkkgZHJpdmVyIGFuZCBkcml2ZXIgbG9hZGVyLiAgQ3VycmVudGx5LCB0aGUgbW9zdCBjb21tb24gZHJpdmVyCisgKiBsb2FkZXIgaXMgdGhlIFhGcmVlODYgbGliR0wuc28uICBIb3dldmVyLCBvdGhlciBsb2FkZXJzIGRvIGV4aXN0LCBhbmQgaW4KKyAqIHRoZSBmdXR1cmUgdGhlIHNlcnZlci1zaWRlIGxpYmdseC5hIHdpbGwgYWxzbyBiZSBhIGxvYWRlci4KKyAqIAorICogXGF1dGhvciBLZXZpbiBFLiBNYXJ0aW4gPGtldmluQHByZWNpc2lvbmluc2lnaHQuY29tPgorICogXGF1dGhvciBJYW4gUm9tYW5pY2sgPGlkckB1cy5pYm0uY29tPgorICogXGF1dGhvciBLcmlzdGlhbiBIw7hnc2JlcmcgPGtyaEByZWRoYXQuY29tPgorICovCisKKyNpZm5kZWYgRFJJX0lOVEVSRkFDRV9ICisjZGVmaW5lIERSSV9JTlRFUkZBQ0VfSAorCisvKiBGb3IgYXJjaHMgd2l0aCBubyBkcm0uaCAqLworI2lmIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX19HTlVfXykKKyNpZm5kZWYgX19OT1RfSEFWRV9EUk1fSAorI2RlZmluZSBfX05PVF9IQVZFX0RSTV9ICisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9fTk9UX0hBVkVfRFJNX0gKKyNpbmNsdWRlIDxkcm0uaD4KKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGludCBkcm1fY29udGV4dF90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgZHJtX2RyYXdhYmxlX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fY2xpcF9yZWN0IGRybV9jbGlwX3JlY3RfdDsKKyNlbmRpZgorCisvKioKKyAqIFxuYW1lIERSSSBpbnRlcmZhY2Ugc3RydWN0dXJlcworICoKKyAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlcyBkZWZpbmUgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBHTFggY2xpZW50CisgKiBzaWRlIGxpYnJhcnkgYW5kIHRoZSBEUkkgKGRpcmVjdCByZW5kZXJpbmcgaW5mcmFzdHJ1Y3R1cmUpLgorICovCisvKkB7Ki8KK3R5cGVkZWYgc3RydWN0IF9fRFJJZGlzcGxheVJlYwkJX19EUklkaXNwbGF5OwordHlwZWRlZiBzdHJ1Y3QgX19EUklzY3JlZW5SZWMJCV9fRFJJc2NyZWVuOwordHlwZWRlZiBzdHJ1Y3QgX19EUkljb250ZXh0UmVjCQlfX0RSSWNvbnRleHQ7Cit0eXBlZGVmIHN0cnVjdCBfX0RSSWRyYXdhYmxlUmVjCQlfX0RSSWRyYXdhYmxlOwordHlwZWRlZiBzdHJ1Y3QgX19EUkljb25maWdSZWMJCV9fRFJJY29uZmlnOwordHlwZWRlZiBzdHJ1Y3QgX19EUklmcmFtZWJ1ZmZlclJlYwlfX0RSSWZyYW1lYnVmZmVyOwordHlwZWRlZiBzdHJ1Y3QgX19EUkl2ZXJzaW9uUmVjCQlfX0RSSXZlcnNpb247CisKK3R5cGVkZWYgc3RydWN0IF9fRFJJY29yZUV4dGVuc2lvblJlYwkJX19EUkljb3JlRXh0ZW5zaW9uOwordHlwZWRlZiBzdHJ1Y3QgX19EUklleHRlbnNpb25SZWMJCV9fRFJJZXh0ZW5zaW9uOwordHlwZWRlZiBzdHJ1Y3QgX19EUkljb3B5U3ViQnVmZmVyRXh0ZW5zaW9uUmVjCV9fRFJJY29weVN1YkJ1ZmZlckV4dGVuc2lvbjsKK3R5cGVkZWYgc3RydWN0IF9fRFJJc3dhcENvbnRyb2xFeHRlbnNpb25SZWMJX19EUklzd2FwQ29udHJvbEV4dGVuc2lvbjsKK3R5cGVkZWYgc3RydWN0IF9fRFJJZnJhbWVUcmFja2luZ0V4dGVuc2lvblJlYwlfX0RSSWZyYW1lVHJhY2tpbmdFeHRlbnNpb247Cit0eXBlZGVmIHN0cnVjdCBfX0RSSW1lZGlhU3RyZWFtQ291bnRlckV4dGVuc2lvblJlYwlfX0RSSW1lZGlhU3RyZWFtQ291bnRlckV4dGVuc2lvbjsKK3R5cGVkZWYgc3RydWN0IF9fRFJJdGV4T2Zmc2V0RXh0ZW5zaW9uUmVjCV9fRFJJdGV4T2Zmc2V0RXh0ZW5zaW9uOwordHlwZWRlZiBzdHJ1Y3QgX19EUkl0ZXhCdWZmZXJFeHRlbnNpb25SZWMJX19EUkl0ZXhCdWZmZXJFeHRlbnNpb247Cit0eXBlZGVmIHN0cnVjdCBfX0RSSWxlZ2FjeUV4dGVuc2lvblJlYwkJX19EUklsZWdhY3lFeHRlbnNpb247Cit0eXBlZGVmIHN0cnVjdCBfX0RSSXN3cmFzdEV4dGVuc2lvblJlYwkJX19EUklzd3Jhc3RFeHRlbnNpb247Cit0eXBlZGVmIHN0cnVjdCBfX0RSSWJ1ZmZlclJlYwkJCV9fRFJJYnVmZmVyOwordHlwZWRlZiBzdHJ1Y3QgX19EUklkcmkyRXh0ZW5zaW9uUmVjCQlfX0RSSWRyaTJFeHRlbnNpb247Cit0eXBlZGVmIHN0cnVjdCBfX0RSSWRyaTJMb2FkZXJFeHRlbnNpb25SZWMJX19EUklkcmkyTG9hZGVyRXh0ZW5zaW9uOwordHlwZWRlZiBzdHJ1Y3QgX19EUkkyZmx1c2hFeHRlbnNpb25SZWMJX19EUkkyZmx1c2hFeHRlbnNpb247Cit0eXBlZGVmIHN0cnVjdCBfX0RSSTJ0aHJvdHRsZUV4dGVuc2lvblJlYwlfX0RSSTJ0aHJvdHRsZUV4dGVuc2lvbjsKKworLypAfSovCisKKworLyoqCisgKiBFeHRlbnNpb24gc3RydWN0LiAgRHJpdmVycyAnaW5oZXJpdCcgZnJvbSB0aGlzIHN0cnVjdCBieSBlbWJlZGRpbmcKKyAqIGl0IGFzIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBleHRlbnNpb24gc3RydWN0LgorICoKKyAqIFdlIG5ldmVyIGJyZWFrIEFQSSBpbiBmb3IgYSBEUkkgZXh0ZW5zaW9uLiAgSWYgd2UgbmVlZCB0byBjaGFuZ2UKKyAqIHRoZSB3YXkgdGhpbmdzIHdvcmsgaW4gYSBub24tYmFja3dhcmRzIGNvbXBhdGlibGUgbWFubmVyLCB3ZQorICogaW50cm9kdWNlIGEgbmV3IGV4dGVuc2lvbi4gIER1cmluZyBhIHRyYW5zaXRpb24gcGVyaW9kLCB3ZSBjYW4KKyAqIGxlYXZlIGJvdGggdGhlIG9sZCBhbmQgdGhlIG5ldyBleHRlbnNpb24gaW4gdGhlIGRyaXZlciwgd2hpY2gKKyAqIGFsbG93cyB1cyB0byBtb3ZlIHRvIHRoZSBuZXcgaW50ZXJmYWNlIHdpdGhvdXQgaGF2aW5nIHRvIHVwZGF0ZSB0aGUKKyAqIGxvYWRlcihzKSBpbiBsb2NrIHN0ZXAuCisgKgorICogSG93ZXZlciwgd2UgY2FuIGFkZCBlbnRyeSBwb2ludHMgdG8gYW4gZXh0ZW5zaW9uIG92ZXIgdGltZSBhcyBsb25nCisgKiBhcyB3ZSBkb24ndCBicmVhayB0aGUgb2xkIG9uZXMuICBBcyB3ZSBhZGQgZW50cnkgcG9pbnRzIHRvIGFuCisgKiBleHRlbnNpb24sIHdlIGluY3JlYXNlIHRoZSB2ZXJzaW9uIG51bWJlci4gIFRoZSBjb3JyZXNwb25kaW5nCisgKiAjZGVmaW5lIGNhbiBiZSB1c2VkIHRvIGd1YXJkIGNvZGUgdGhhdCBhY2Nlc3NlcyB0aGUgbmV3IGVudHJ5CisgKiBwb2ludHMgYXQgY29tcGlsZSB0aW1lIGFuZCB0aGUgdmVyc2lvbiBmaWVsZCBpbiB0aGUgZXh0ZW5zaW9uCisgKiBzdHJ1Y3QgY2FuIGJlIHVzZWQgYXQgcnVuLXRpbWUgdG8gZGV0ZXJtaW5lIGhvdyB0byB1c2UgdGhlCisgKiBleHRlbnNpb24uCisgKi8KK3N0cnVjdCBfX0RSSWV4dGVuc2lvblJlYyB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBpbnQgdmVyc2lvbjsKK307CisKKy8qKgorICogVGhlIGZpcnN0IHNldCBvZiBleHRlbnNpb24gYXJlIHRoZSBzY3JlZW4gZXh0ZW5zaW9ucywgcmV0dXJuZWQgYnkKKyAqIF9fRFJJY29yZTo6Z2V0RXh0ZW5zaW9ucygpLiAgVGhpcyBlbnRyeSBwb2ludCB3aWxsIHJldHVybiBhIGxpc3Qgb2YKKyAqIGV4dGVuc2lvbnMgYW5kIHRoZSBsb2FkZXIgY2FuIHVzZSB0aGUgb25lcyBpdCBrbm93cyBhYm91dCBieQorICogY2FzdGluZyB0aGVtIHRvIG1vcmUgc3BlY2lmaWMgZXh0ZW5zaW9ucyBhbmQgYWR2ZXJ0aXNpbmcgYW55IEdMWAorICogZXh0ZW5zaW9ucyB0aGUgRFJJIGV4dGVuc2lvbnMgZW5hYmxlcy4KKyAqLworCisvKioKKyAqIFVzZWQgYnkgZHJpdmVycyB0byBpbmRpY2F0ZSBzdXBwb3J0IGZvciBzZXR0aW5nIHRoZSByZWFkIGRyYXdhYmxlLgorICovCisjZGVmaW5lIF9fRFJJX1JFQURfRFJBV0FCTEUgIkRSSV9SZWFkRHJhd2FibGUiCisjZGVmaW5lIF9fRFJJX1JFQURfRFJBV0FCTEVfVkVSU0lPTiAxCisKKy8qKgorICogVXNlZCBieSBkcml2ZXJzIHRoYXQgaW1wbGVtZW50IHRoZSBHTFhfTUVTQV9jb3B5X3N1Yl9idWZmZXIgZXh0ZW5zaW9uLgorICovCisjZGVmaW5lIF9fRFJJX0NPUFlfU1VCX0JVRkZFUiAiRFJJX0NvcHlTdWJCdWZmZXIiCisjZGVmaW5lIF9fRFJJX0NPUFlfU1VCX0JVRkZFUl9WRVJTSU9OIDEKK3N0cnVjdCBfX0RSSWNvcHlTdWJCdWZmZXJFeHRlbnNpb25SZWMgeworICAgIF9fRFJJZXh0ZW5zaW9uIGJhc2U7CisgICAgdm9pZCAoKmNvcHlTdWJCdWZmZXIpKF9fRFJJZHJhd2FibGUgKmRyYXdhYmxlLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCk7Cit9OworCisvKioKKyAqIFVzZWQgYnkgZHJpdmVycyB0aGF0IGltcGxlbWVudCB0aGUgR0xYX1NHSV9zd2FwX2NvbnRyb2wgb3IKKyAqIEdMWF9NRVNBX3N3YXBfY29udHJvbCBleHRlbnNpb24uCisgKi8KKyNkZWZpbmUgX19EUklfU1dBUF9DT05UUk9MICJEUklfU3dhcENvbnRyb2wiCisjZGVmaW5lIF9fRFJJX1NXQVBfQ09OVFJPTF9WRVJTSU9OIDEKK3N0cnVjdCBfX0RSSXN3YXBDb250cm9sRXh0ZW5zaW9uUmVjIHsKKyAgICBfX0RSSWV4dGVuc2lvbiBiYXNlOworICAgIHZvaWQgKCpzZXRTd2FwSW50ZXJ2YWwpKF9fRFJJZHJhd2FibGUgKmRyYXdhYmxlLCB1bnNpZ25lZCBpbnQgaW50ZXZhbCk7CisgICAgdW5zaWduZWQgaW50ICgqZ2V0U3dhcEludGVydmFsKShfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSk7Cit9OworCisvKioKKyAqIFVzZWQgYnkgZHJpdmVycyB0aGF0IGltcGxlbWVudCB0aGUgR0xYX01FU0Ffc3dhcF9mcmFtZV91c2FnZSBleHRlbnNpb24uCisgKi8KKyNkZWZpbmUgX19EUklfRlJBTUVfVFJBQ0tJTkcgIkRSSV9GcmFtZVRyYWNraW5nIgorI2RlZmluZSBfX0RSSV9GUkFNRV9UUkFDS0lOR19WRVJTSU9OIDEKK3N0cnVjdCBfX0RSSWZyYW1lVHJhY2tpbmdFeHRlbnNpb25SZWMgeworICAgIF9fRFJJZXh0ZW5zaW9uIGJhc2U7CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgb3IgZGlzYWJsZSBmcmFtZSB1c2FnZSB0cmFja2luZy4KKyAgICAgKiAKKyAgICAgKiBcc2luY2UgSW50ZXJuYWwgQVBJIHZlcnNpb24gMjAwMzAzMTcuCisgICAgICovCisgICAgaW50ICgqZnJhbWVUcmFja2luZykoX19EUklkcmF3YWJsZSAqZHJhd2FibGUsIEdMYm9vbGVhbiBlbmFibGUpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgZnJhbWUgdXNhZ2UgaW5mb3JtYXRpb24uCisgICAgICogCisgICAgICogXHNpbmNlIEludGVybmFsIEFQSSB2ZXJzaW9uIDIwMDMwMzE3LgorICAgICAqLworICAgIGludCAoKnF1ZXJ5RnJhbWVUcmFja2luZykoX19EUklkcmF3YWJsZSAqZHJhd2FibGUsCisJCQkgICAgICBpbnQ2NF90ICogc2JjLCBpbnQ2NF90ICogbWlzc2VkRnJhbWVzLAorCQkJICAgICAgZmxvYXQgKiBsYXN0TWlzc2VkVXNhZ2UsIGZsb2F0ICogdXNhZ2UpOworfTsKKworCisvKioKKyAqIFVzZWQgYnkgZHJpdmVycyB0aGF0IGltcGxlbWVudCB0aGUgR0xYX1NHSV92aWRlb19zeW5jIGV4dGVuc2lvbi4KKyAqLworI2RlZmluZSBfX0RSSV9NRURJQV9TVFJFQU1fQ09VTlRFUiAiRFJJX01lZGlhU3RyZWFtQ291bnRlciIKKyNkZWZpbmUgX19EUklfTUVESUFfU1RSRUFNX0NPVU5URVJfVkVSU0lPTiAxCitzdHJ1Y3QgX19EUkltZWRpYVN0cmVhbUNvdW50ZXJFeHRlbnNpb25SZWMgeworICAgIF9fRFJJZXh0ZW5zaW9uIGJhc2U7CisKKyAgICAvKioKKyAgICAgKiBXYWl0IGZvciB0aGUgTVNDIHRvIGVxdWFsIHRhcmdldF9tc2MsIG9yLCBpZiB0aGF0IGhhcyBhbHJlYWR5IHBhc3NlZCwKKyAgICAgKiB0aGUgbmV4dCB0aW1lIChNU0MgJSBkaXZpc29yKSBpcyBlcXVhbCB0byByZW1haW5kZXIuICBJZiBkaXZpc29yIGlzCisgICAgICogemVybywgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFzIHNvb24gYXMgTVNDIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbAorICAgICAqIHRvIHRhcmdldF9tc2MuCisgICAgICovCisgICAgaW50ICgqd2FpdEZvck1TQykoX19EUklkcmF3YWJsZSAqZHJhd2FibGUsCisJCSAgICAgIGludDY0X3QgdGFyZ2V0X21zYywgaW50NjRfdCBkaXZpc29yLCBpbnQ2NF90IHJlbWFpbmRlciwKKwkJICAgICAgaW50NjRfdCAqIG1zYywgaW50NjRfdCAqIHNiYyk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG51bWJlciBvZiB2ZXJ0aWNhbCByZWZyZXNoZXMgc2luY2Ugc29tZSBwb2ludCBpbiB0aW1lIGJlZm9yZQorICAgICAqIHRoaXMgZnVuY3Rpb24gd2FzIGZpcnN0IGNhbGxlZCAoaS5lLiwgc3lzdGVtIHN0YXJ0IHVwKS4KKyAgICAgKi8KKyAgICBpbnQgKCpnZXREcmF3YWJsZU1TQykoX19EUklzY3JlZW4gKnNjcmVlbiwgX19EUklkcmF3YWJsZSAqZHJhd2FibGUsCisJCQkgIGludDY0X3QgKm1zYyk7Cit9OworCisKKyNkZWZpbmUgX19EUklfVEVYX09GRlNFVCAiRFJJX1RleE9mZnNldCIKKyNkZWZpbmUgX19EUklfVEVYX09GRlNFVF9WRVJTSU9OIDEKK3N0cnVjdCBfX0RSSXRleE9mZnNldEV4dGVuc2lvblJlYyB7CisgICAgX19EUklleHRlbnNpb24gYmFzZTsKKworICAgIC8qKgorICAgICAqIE1ldGhvZCB0byBvdmVycmlkZSBiYXNlIHRleHR1cmUgaW1hZ2Ugd2l0aCBhIGRyaXZlciBzcGVjaWZpYyAnb2Zmc2V0Jy4KKyAgICAgKiBUaGUgZGVwdGggcGFzc2VkIGluIGFsbG93cyBlLmcuIHRvIGlnbm9yZSB0aGUgYWxwaGEgY2hhbm5lbCBvZiB0ZXh0dXJlCisgICAgICogaW1hZ2VzIHdoZXJlIHRoZSBub24tYWxwaGEgY29tcG9uZW50cyBkb24ndCBvY2N1cHkgYSB3aG9sZSB0ZXhlbC4KKyAgICAgKgorICAgICAqIEZvciBHTFhfRVhUX3RleHR1cmVfZnJvbV9waXhtYXAgd2l0aCBBSUdMWC4KKyAgICAgKi8KKyAgICB2b2lkICgqc2V0VGV4T2Zmc2V0KShfX0RSSWNvbnRleHQgKnBEUklDdHgsIEdMaW50IHRleG5hbWUsCisJCQkgdW5zaWduZWQgbG9uZyBsb25nIG9mZnNldCwgR0xpbnQgZGVwdGgsIEdMdWludCBwaXRjaCk7Cit9OworCisKKy8qIFZhbGlkIHZhbHVlcyBmb3IgZm9ybWF0IGluIHRoZSBzZXRUZXhCdWZmZXIyIGZ1bmN0aW9uIGJlbG93LiAgVGhlc2UKKyAqIHZhbHVlcyBtYXRjaCB0aGUgR0xYIHRva2VucyBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCBidXQgd2UKKyAqIGRlZmluZSB0aGVtIGhlcmUgc2luY2UgdGhlIERSSSBpbnRlcmZhY2UgY2FuJ3QgZGVwZW5kIG9uIEdMWC4gKi8KKyNkZWZpbmUgX19EUklfVEVYVFVSRV9GT1JNQVRfTk9ORSAgICAgICAgMHgyMEQ4CisjZGVmaW5lIF9fRFJJX1RFWFRVUkVfRk9STUFUX1JHQiAgICAgICAgIDB4MjBEOQorI2RlZmluZSBfX0RSSV9URVhUVVJFX0ZPUk1BVF9SR0JBICAgICAgICAweDIwREEKKworI2RlZmluZSBfX0RSSV9URVhfQlVGRkVSICJEUklfVGV4QnVmZmVyIgorI2RlZmluZSBfX0RSSV9URVhfQlVGRkVSX1ZFUlNJT04gMgorc3RydWN0IF9fRFJJdGV4QnVmZmVyRXh0ZW5zaW9uUmVjIHsKKyAgICBfX0RSSWV4dGVuc2lvbiBiYXNlOworCisgICAgLyoqCisgICAgICogTWV0aG9kIHRvIG92ZXJyaWRlIGJhc2UgdGV4dHVyZSBpbWFnZSB3aXRoIHRoZSBjb250ZW50cyBvZiBhCisgICAgICogX19EUklkcmF3YWJsZS4gCisgICAgICoKKyAgICAgKiBGb3IgR0xYX0VYVF90ZXh0dXJlX2Zyb21fcGl4bWFwIHdpdGggQUlHTFguICBEZXByZWNhdGVkIGluIGZhdm9yIG9mCisgICAgICogc2V0VGV4QnVmZmVyMiBpbiB2ZXJzaW9uIDIgb2YgdGhpcyBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICB2b2lkICgqc2V0VGV4QnVmZmVyKShfX0RSSWNvbnRleHQgKnBEUklDdHgsCisJCQkgR0xpbnQgdGFyZ2V0LAorCQkJIF9fRFJJZHJhd2FibGUgKnBEcmF3KTsKKworICAgIC8qKgorICAgICAqIE1ldGhvZCB0byBvdmVycmlkZSBiYXNlIHRleHR1cmUgaW1hZ2Ugd2l0aCB0aGUgY29udGVudHMgb2YgYQorICAgICAqIF9fRFJJZHJhd2FibGUsIGluY2x1ZGluZyB0aGUgcmVxdWlyZWQgdGV4dHVyZSBmb3JtYXQgYXR0cmlidXRlLgorICAgICAqCisgICAgICogRm9yIEdMWF9FWFRfdGV4dHVyZV9mcm9tX3BpeG1hcCB3aXRoIEFJR0xYLgorICAgICAqLworICAgIHZvaWQgKCpzZXRUZXhCdWZmZXIyKShfX0RSSWNvbnRleHQgKnBEUklDdHgsCisJCQkgIEdMaW50IHRhcmdldCwKKwkJCSAgR0xpbnQgZm9ybWF0LAorCQkJICBfX0RSSWRyYXdhYmxlICpwRHJhdyk7CisgICAgLyoqCisgICAgICogTWV0aG9kIHRvIHJlbGVhc2UgdGV4dHVyZSBidWZmZXIgaW4gY2FzZSBzb21lIHNwZWNpYWwgcGxhdGZvcm0KKyAgICAgKiBuZWVkIHRoaXMuCisgICAgICoKKyAgICAgKiBGb3IgR0xYX0VYVF90ZXh0dXJlX2Zyb21fcGl4bWFwIHdpdGggQUlHTFguCisgICAgICovCisgICAgdm9pZCAoKnJlbGVhc2VUZXhCdWZmZXIpKF9fRFJJY29udGV4dCAqcERSSUN0eCwKKwkJCUdMaW50IHRhcmdldCwKKwkJCV9fRFJJZHJhd2FibGUgKnBEcmF3KTsKK307CisKKy8qKgorICogVXNlZCBieSBkcml2ZXJzIHRoYXQgaW1wbGVtZW50IERSSTIKKyAqLworI2RlZmluZSBfX0RSSTJfRkxVU0ggIkRSSTJfRmx1c2giCisjZGVmaW5lIF9fRFJJMl9GTFVTSF9WRVJTSU9OIDMKK3N0cnVjdCBfX0RSSTJmbHVzaEV4dGVuc2lvblJlYyB7CisgICAgX19EUklleHRlbnNpb24gYmFzZTsKKyAgICB2b2lkICgqZmx1c2gpKF9fRFJJZHJhd2FibGUgKmRyYXdhYmxlKTsKKworICAgIC8qKgorICAgICAqIEFzayB0aGUgZHJpdmVyIHRvIGNhbGwgZ2V0QnVmZmVycy9nZXRCdWZmZXJzV2l0aEZvcm1hdCBiZWZvcmUKKyAgICAgKiBpdCBzdGFydHMgcmVuZGVyaW5nIGFnYWluLgorICAgICAqCisgICAgICogXHBhcmFtIGRyYXdhYmxlIHRoZSBkcmF3YWJsZSB0byBpbnZhbGlkYXRlCisgICAgICoKKyAgICAgKiBcc2luY2UgMworICAgICAqLworICAgIHZvaWQgKCppbnZhbGlkYXRlKShfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSk7Cit9OworCisKKy8qKgorICogRXh0ZW5zaW9uIHRoYXQgdGhlIGRyaXZlciB1c2VzIHRvIHJlcXVlc3QKKyAqIHRocm90dGxlIGNhbGxiYWNrcy4KKyAqLworCisjZGVmaW5lIF9fRFJJMl9USFJPVFRMRSAiRFJJMl9UaHJvdHRsZSIKKyNkZWZpbmUgX19EUkkyX1RIUk9UVExFX1ZFUlNJT04gMQorCitlbnVtIF9fRFJJMnRocm90dGxlUmVhc29uIHsKKyAgIF9fRFJJMl9USFJPVFRMRV9TV0FQQlVGRkVSLAorICAgX19EUkkyX1RIUk9UVExFX0NPUFlTVUJCVUZGRVIsCisgICBfX0RSSTJfVEhST1RUTEVfRkxVU0hGUk9OVAorfTsKKworc3RydWN0IF9fRFJJMnRocm90dGxlRXh0ZW5zaW9uUmVjIHsKKyAgIF9fRFJJZXh0ZW5zaW9uIGJhc2U7CisgICB2b2lkICgqdGhyb3R0bGUpKF9fRFJJY29udGV4dCAqY3R4LAorCQkgICAgX19EUklkcmF3YWJsZSAqZHJhd2FibGUsCisJCSAgICBlbnVtIF9fRFJJMnRocm90dGxlUmVhc29uIHJlYXNvbik7Cit9OworCisvKioKKyAqIFhNTCBkb2N1bWVudCBkZXNjcmliaW5nIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgc3VwcG9ydGVkIGJ5IHRoZQorICogZHJpdmVyLgorICovCitleHRlcm4gY29uc3QgY2hhciBfX2RyaUNvbmZpZ09wdGlvbnNbXTsKKworLypAfSovCisKKy8qKgorICogVGhlIGZvbGxvd2luZyBleHRlbnNpb25zIGRlc2NyaWJlIGxvYWRlciBmZWF0dXJlcyB0aGF0IHRoZSBEUkkKKyAqIGRyaXZlciBjYW4gbWFrZSB1c2Ugb2YuICBTb21lIG9mIHRoZXNlIGFyZSBtYW5kYXRvcnksIHN1Y2ggYXMgdGhlCisgKiBnZXREcmF3YWJsZUluZm8gZXh0ZW5zaW9uIGZvciBEUkkgYW5kIHRoZSBEUkkgTG9hZGVyIGV4dGVuc2lvbnMgZm9yCisgKiBEUkkyLCB3aGlsZSBvdGhlcnMgYXJlIG9wdGlvbmFsLCBhbmQgaWYgcHJlc2VudCBhbGxvdyB0aGUgZHJpdmVyIHRvCisgKiBleHBvc2UgY2VydGFpbiBmZWF0dXJlcy4gIFRoZSBsb2FkZXIgcGFzcyBpbiBhIE5VTEwgdGVybWluYXRlZAorICogYXJyYXkgb2YgdGhlc2UgZXh0ZW5zaW9ucyB0byB0aGUgZHJpdmVyIGluIHRoZSBjcmVhdGVOZXdTY3JlZW4KKyAqIGNvbnN0cnVjdG9yLgorICovCisKK3R5cGVkZWYgc3RydWN0IF9fRFJJZ2V0RHJhd2FibGVJbmZvRXh0ZW5zaW9uUmVjIF9fRFJJZ2V0RHJhd2FibGVJbmZvRXh0ZW5zaW9uOwordHlwZWRlZiBzdHJ1Y3QgX19EUklzeXN0ZW1UaW1lRXh0ZW5zaW9uUmVjIF9fRFJJc3lzdGVtVGltZUV4dGVuc2lvbjsKK3R5cGVkZWYgc3RydWN0IF9fRFJJZGFtYWdlRXh0ZW5zaW9uUmVjIF9fRFJJZGFtYWdlRXh0ZW5zaW9uOwordHlwZWRlZiBzdHJ1Y3QgX19EUklsb2FkZXJFeHRlbnNpb25SZWMgX19EUklsb2FkZXJFeHRlbnNpb247Cit0eXBlZGVmIHN0cnVjdCBfX0RSSXN3cmFzdExvYWRlckV4dGVuc2lvblJlYyBfX0RSSXN3cmFzdExvYWRlckV4dGVuc2lvbjsKKworCisvKioKKyAqIENhbGxiYWNrIHRvIGdldERyYXdhYmxlSW5mbyBwcm90b2NvbAorICovCisjZGVmaW5lIF9fRFJJX0dFVF9EUkFXQUJMRV9JTkZPICJEUklfR2V0RHJhd2FibGVJbmZvIgorI2RlZmluZSBfX0RSSV9HRVRfRFJBV0FCTEVfSU5GT19WRVJTSU9OIDEKK3N0cnVjdCBfX0RSSWdldERyYXdhYmxlSW5mb0V4dGVuc2lvblJlYyB7CisgICAgX19EUklleHRlbnNpb24gYmFzZTsKKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBvc2l0aW9uLCBzaXplLCBhbmQKKyAgICAgKiBjbGlwIHJlY3RzIG9mIGEgZHJhd2FibGUuCisgICAgICovCisgICAgR0xib29sZWFuICgqIGdldERyYXdhYmxlSW5mbykgKCBfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSwKKwl1bnNpZ25lZCBpbnQgKiBpbmRleCwgdW5zaWduZWQgaW50ICogc3RhbXAsCisgICAgICAgIGludCAqIHgsIGludCAqIHksIGludCAqIHdpZHRoLCBpbnQgKiBoZWlnaHQsCisgICAgICAgIGludCAqIG51bUNsaXBSZWN0cywgZHJtX2NsaXBfcmVjdF90ICoqIHBDbGlwUmVjdHMsCisgICAgICAgIGludCAqIGJhY2tYLCBpbnQgKiBiYWNrWSwKKwlpbnQgKiBudW1CYWNrQ2xpcFJlY3RzLCBkcm1fY2xpcF9yZWN0X3QgKiogcEJhY2tDbGlwUmVjdHMsCisJdm9pZCAqbG9hZGVyUHJpdmF0ZSk7Cit9OworCisvKioKKyAqIENhbGxiYWNrIHRvIGdldCBzeXN0ZW0gdGltZSBmb3IgbWVkaWEgc3RyZWFtIGNvdW50ZXIgZXh0ZW5zaW9ucy4KKyAqLworI2RlZmluZSBfX0RSSV9TWVNURU1fVElNRSAiRFJJX1N5c3RlbVRpbWUiCisjZGVmaW5lIF9fRFJJX1NZU1RFTV9USU1FX1ZFUlNJT04gMQorc3RydWN0IF9fRFJJc3lzdGVtVGltZUV4dGVuc2lvblJlYyB7CisgICAgX19EUklleHRlbnNpb24gYmFzZTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgNjQtYml0IHVuYWRqdXN0ZWQgc3lzdGVtIHRpbWUgKFVTVCkuCisgICAgICovCisgICAgaW50ICgqZ2V0VVNUKShpbnQ2NF90ICogdXN0KTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbWVkaWEgc3RyZWFtIGNvdW50ZXIgKE1TQykgcmF0ZS4KKyAgICAgKiAKKyAgICAgKiBNYXRjaGluZyB0aGUgZGVmaW5pdGlvbiBpbiBHTFhfT01MX3N5bmNfY29udHJvbCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgICAgICogdGhlIHJhdGUgb2YgdGhlICJtZWRpYSBzdHJlYW0gY291bnRlciIuICBJbiBwcmFjdGljYWwgdGVybXMsIHRoaXMgaXMKKyAgICAgKiB0aGUgZnJhbWUgcmVmcmVzaCByYXRlIG9mIHRoZSBkaXNwbGF5LgorICAgICAqLworICAgIEdMYm9vbGVhbiAoKmdldE1TQ1JhdGUpKF9fRFJJZHJhd2FibGUgKmRyYXcsCisJCQkgICAgaW50MzJfdCAqIG51bWVyYXRvciwgaW50MzJfdCAqIGRlbm9taW5hdG9yLAorCQkJICAgIHZvaWQgKmxvYWRlclByaXZhdGUpOworfTsKKworLyoqCisgKiBEYW1hZ2UgcmVwb3J0aW5nCisgKi8KKyNkZWZpbmUgX19EUklfREFNQUdFICJEUklfRGFtYWdlIgorI2RlZmluZSBfX0RSSV9EQU1BR0VfVkVSU0lPTiAxCitzdHJ1Y3QgX19EUklkYW1hZ2VFeHRlbnNpb25SZWMgeworICAgIF9fRFJJZXh0ZW5zaW9uIGJhc2U7CisKKyAgICAvKioKKyAgICAgKiBSZXBvcnRzIGFyZWFzIG9mIHRoZSBnaXZlbiBkcmF3YWJsZSB3aGljaCBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgdGhlCisgICAgICogZHJpdmVyLgorICAgICAqCisgICAgICogXHBhcmFtIGRyYXdhYmxlIHdoaWNoIHRoZSBkcmF3aW5nIHdhcyBkb25lIHRvLgorICAgICAqIFxwYXJhbSByZWN0cyByZWN0YW5nbGVzIGFmZmVjdGVkLCB3aXRoIHRoZSBkcmF3YWJsZSBvcmlnaW4gYXMgdGhlCisgICAgICoJICAgICAgb3JpZ2luLgorICAgICAqIFxwYXJhbSB4IFggb2Zmc2V0IG9mIHRoZSBkcmF3YWJsZSB3aXRoaW4gdGhlIHNjcmVlbiAodXNlZCBpbiB0aGUKKyAgICAgKgkgICAgICBmcm9udF9idWZmZXIgY2FzZSkKKyAgICAgKiBccGFyYW0geSBZIG9mZnNldCBvZiB0aGUgZHJhd2FibGUgd2l0aGluIHRoZSBzY3JlZW4uCisgICAgICogXHBhcmFtIGZyb250X2J1ZmZlciBib29sZWFuIGZsYWcgZm9yIHdoZXRoZXIgdGhlIGRyYXdpbmcgdG8gdGhlCisgICAgICogCSAgICAgIGRyYXdhYmxlIHdhcyBhY3R1YWxseSBkb25lIGRpcmVjdGx5IHRvIHRoZSBmcm9udCBidWZmZXIgKGluc3RlYWQKKyAgICAgKgkgICAgICBvZiBiYWNraW5nIHN0b3JhZ2UsIGZvciBleGFtcGxlKQorICAgICAqIFxwYXJhbSBsb2FkZXJQcml2YXRlIHRoZSBkYXRhIHBhc3NlZCBpbiBhdCBjcmVhdGVOZXdEcmF3YWJsZSB0aW1lCisgICAgICovCisgICAgdm9pZCAoKnJlcG9ydERhbWFnZSkoX19EUklkcmF3YWJsZSAqZHJhdywKKwkJCSBpbnQgeCwgaW50IHksCisJCQkgZHJtX2NsaXBfcmVjdF90ICpyZWN0cywgaW50IG51bV9yZWN0cywKKwkJCSBHTGJvb2xlYW4gZnJvbnRfYnVmZmVyLAorCQkJIHZvaWQgKmxvYWRlclByaXZhdGUpOworfTsKKworI2RlZmluZSBfX0RSSV9TV1JBU1RfSU1BR0VfT1BfRFJBVwkxCisjZGVmaW5lIF9fRFJJX1NXUkFTVF9JTUFHRV9PUF9DTEVBUgkyCisjZGVmaW5lIF9fRFJJX1NXUkFTVF9JTUFHRV9PUF9TV0FQCTMKKworLyoqCisgKiBTV1Jhc3QgTG9hZGVyIGV4dGVuc2lvbi4KKyAqLworI2RlZmluZSBfX0RSSV9TV1JBU1RfTE9BREVSICJEUklfU1dSYXN0TG9hZGVyIgorI2RlZmluZSBfX0RSSV9TV1JBU1RfTE9BREVSX1ZFUlNJT04gMQorc3RydWN0IF9fRFJJc3dyYXN0TG9hZGVyRXh0ZW5zaW9uUmVjIHsKKyAgICBfX0RSSWV4dGVuc2lvbiBiYXNlOworCisgICAgLyoKKyAgICAgKiBEcmF3YWJsZSBwb3NpdGlvbiBhbmQgc2l6ZQorICAgICAqLworICAgIHZvaWQgKCpnZXREcmF3YWJsZUluZm8pKF9fRFJJZHJhd2FibGUgKmRyYXdhYmxlLAorCQkJICAgIGludCAqeCwgaW50ICp5LCBpbnQgKndpZHRoLCBpbnQgKmhlaWdodCwKKwkJCSAgICB2b2lkICpsb2FkZXJQcml2YXRlKTsKKworICAgIC8qKgorICAgICAqIFB1dCBpbWFnZSB0byBkcmF3YWJsZQorICAgICAqLworICAgIHZvaWQgKCpwdXRJbWFnZSkoX19EUklkcmF3YWJsZSAqZHJhd2FibGUsIGludCBvcCwKKwkJICAgICBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJICAgICBjaGFyICpkYXRhLCB2b2lkICpsb2FkZXJQcml2YXRlKTsKKworICAgIC8qKgorICAgICAqIEdldCBpbWFnZSBmcm9tIHJlYWRhYmxlCisgICAgICovCisgICAgdm9pZCAoKmdldEltYWdlKShfX0RSSWRyYXdhYmxlICpyZWFkYWJsZSwKKwkJICAgICBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJICAgICBjaGFyICpkYXRhLCB2b2lkICpsb2FkZXJQcml2YXRlKTsKK307CisKKy8qKgorICogSW52YWxpZGF0ZSBsb2FkZXIgZXh0ZW5zaW9uLiAgVGhlIHByZXNlbmNlIG9mIHRoaXMgZXh0ZW5zaW9uCisgKiBpbmRpY2F0ZXMgdG8gdGhlIERSSSBkcml2ZXIgdGhhdCB0aGUgbG9hZGVyIHdpbGwgY2FsbCBpbnZhbGlkYXRlIGluCisgKiB0aGUgX19EUkkyX0ZMVVNIIGV4dGVuc2lvbiwgd2hlbmV2ZXIgdGhlIG5lZWRzIHRvIHF1ZXJ5IGZvciBuZXcKKyAqIGJ1ZmZlcnMuICBUaGlzIG1lYW5zIHRoYXQgdGhlIERSSSBkcml2ZXIgY2FuIGRyb3AgdGhlIHBvbGxpbmcgaW4KKyAqIGdsVmlld3BvcnQoKS4KKyAqCisgKiBUaGUgZXh0ZW5zaW9uIGRvZXNuJ3QgcHJvdmlkZSBhbnkgZnVuY3Rpb25hbGl0eSwgaXQncyBvbmx5IHVzZSB0bworICogaW5kaWNhdGUgdG8gdGhlIGRyaXZlciB0aGF0IGl0IGNhbiB1c2UgdGhlIG5ldyBzZW1hbnRpY3MuICBBIERSSQorICogZHJpdmVyIGNhbiB1c2UgdGhpcyB0byBzd2l0Y2ggYmV0d2VlbiB0aGUgZGlmZmVyZW50IHNlbWFudGljcyBvcgorICoganVzdCByZWZ1c2UgdG8gaW5pdGlhbGl6ZSBpZiB0aGlzIGV4dGVuc2lvbiBpc24ndCBwcmVzZW50LgorICovCisjZGVmaW5lIF9fRFJJX1VTRV9JTlZBTElEQVRFICJEUklfVXNlSW52YWxpZGF0ZSIKKyNkZWZpbmUgX19EUklfVVNFX0lOVkFMSURBVEVfVkVSU0lPTiAxCisKK3R5cGVkZWYgc3RydWN0IF9fRFJJdXNlSW52YWxpZGF0ZUV4dGVuc2lvblJlYyBfX0RSSXVzZUludmFsaWRhdGVFeHRlbnNpb247CitzdHJ1Y3QgX19EUkl1c2VJbnZhbGlkYXRlRXh0ZW5zaW9uUmVjIHsKKyAgIF9fRFJJZXh0ZW5zaW9uIGJhc2U7Cit9OworCisvKioKKyAqIFRoZSByZW1haW5pbmcgZXh0ZW5zaW9ucyBkZXNjcmliZSBkcml2ZXIgZXh0ZW5zaW9ucywgaW1tZWRpYXRlbHkKKyAqIGF2YWlsYWJsZSBpbnRlcmZhY2VzIHByb3ZpZGVkIGJ5IHRoZSBkcml2ZXIuICBUbyBzdGFydCB1c2luZyB0aGUKKyAqIGRyaXZlciwgZGxzeW0oKSBmb3IgdGhlIF9fRFJJX0RSSVZFUl9FWFRFTlNJT05TIHN5bWJvbCBhbmQgbG9vayBmb3IKKyAqIHRoZSBleHRlbnNpb24geW91IG5lZWQgaW4gdGhlIGFycmF5LgorICovCisjZGVmaW5lIF9fRFJJX0RSSVZFUl9FWFRFTlNJT05TICJfX2RyaURyaXZlckV4dGVuc2lvbnMiCisKKy8qKgorICogVG9rZW5zIGZvciBfX0RSSWNvbmZpZyBhdHRyaWJzLiAgQSBudW1iZXIgb2YgYXR0cmlidXRlcyBkZWZpbmVkIGJ5CisgKiBHTFggb3IgRUdMIHN0YW5kYXJkcyBhcmUgbm90IGluIHRoZSB0YWJsZSwgYXMgdGhleSBtdXN0IGJlIHByb3ZpZGVkCisgKiBieSB0aGUgbG9hZGVyLiAgRm9yIGV4YW1wbGUsIEZCQ29uZmlnIElEIG9yIHZpc3VhbCBJRCwgZHJhd2FibGUgdHlwZS4KKyAqLworCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9CVUZGRVJfU0laRQkJIDEKKyNkZWZpbmUgX19EUklfQVRUUklCX0xFVkVMCQkJIDIKKyNkZWZpbmUgX19EUklfQVRUUklCX1JFRF9TSVpFCQkJIDMKKyNkZWZpbmUgX19EUklfQVRUUklCX0dSRUVOX1NJWkUJCQkgNAorI2RlZmluZSBfX0RSSV9BVFRSSUJfQkxVRV9TSVpFCQkJIDUKKyNkZWZpbmUgX19EUklfQVRUUklCX0xVTUlOQU5DRV9TSVpFCQkgNgorI2RlZmluZSBfX0RSSV9BVFRSSUJfQUxQSEFfU0laRQkJCSA3CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9BTFBIQV9NQVNLX1NJWkUJCSA4CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9ERVBUSF9TSVpFCQkJIDkKKyNkZWZpbmUgX19EUklfQVRUUklCX1NURU5DSUxfU0laRQkJMTAKKyNkZWZpbmUgX19EUklfQVRUUklCX0FDQ1VNX1JFRF9TSVpFCQkxMQorI2RlZmluZSBfX0RSSV9BVFRSSUJfQUNDVU1fR1JFRU5fU0laRQkJMTIKKyNkZWZpbmUgX19EUklfQVRUUklCX0FDQ1VNX0JMVUVfU0laRQkJMTMKKyNkZWZpbmUgX19EUklfQVRUUklCX0FDQ1VNX0FMUEhBX1NJWkUJCTE0CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9TQU1QTEVfQlVGRkVSUwkJMTUKKyNkZWZpbmUgX19EUklfQVRUUklCX1NBTVBMRVMJCQkxNgorI2RlZmluZSBfX0RSSV9BVFRSSUJfUkVOREVSX1RZUEUJCTE3CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9DT05GSUdfQ0FWRUFUCQkxOAorI2RlZmluZSBfX0RSSV9BVFRSSUJfQ09ORk9STUFOVAkJCTE5CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9ET1VCTEVfQlVGRkVSCQkyMAorI2RlZmluZSBfX0RSSV9BVFRSSUJfU1RFUkVPCQkJMjEKKyNkZWZpbmUgX19EUklfQVRUUklCX0FVWF9CVUZGRVJTCQkyMgorI2RlZmluZSBfX0RSSV9BVFRSSUJfVFJBTlNQQVJFTlRfVFlQRQkJMjMKKyNkZWZpbmUgX19EUklfQVRUUklCX1RSQU5TUEFSRU5UX0lOREVYX1ZBTFVFCTI0CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9UUkFOU1BBUkVOVF9SRURfVkFMVUUJMjUKKyNkZWZpbmUgX19EUklfQVRUUklCX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFCTI2CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFCTI3CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9UUkFOU1BBUkVOVF9BTFBIQV9WQUxVRQkyOAorI2RlZmluZSBfX0RSSV9BVFRSSUJfRkxPQVRfTU9ERQkJCTI5CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9SRURfTUFTSwkJCTMwCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9HUkVFTl9NQVNLCQkJMzEKKyNkZWZpbmUgX19EUklfQVRUUklCX0JMVUVfTUFTSwkJCTMyCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9BTFBIQV9NQVNLCQkJMzMKKyNkZWZpbmUgX19EUklfQVRUUklCX01BWF9QQlVGRkVSX1dJRFRICQkzNAorI2RlZmluZSBfX0RSSV9BVFRSSUJfTUFYX1BCVUZGRVJfSEVJR0hUCQkzNQorI2RlZmluZSBfX0RSSV9BVFRSSUJfTUFYX1BCVUZGRVJfUElYRUxTCQkzNgorI2RlZmluZSBfX0RSSV9BVFRSSUJfT1BUSU1BTF9QQlVGRkVSX1dJRFRICTM3CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9PUFRJTUFMX1BCVUZGRVJfSEVJR0hUCTM4CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9WSVNVQUxfU0VMRUNUX0dST1VQCTM5CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9TV0FQX01FVEhPRAkJNDAKKyNkZWZpbmUgX19EUklfQVRUUklCX01BWF9TV0FQX0lOVEVSVkFMCQk0MQorI2RlZmluZSBfX0RSSV9BVFRSSUJfTUlOX1NXQVBfSU5URVJWQUwJCTQyCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9CSU5EX1RPX1RFWFRVUkVfUkdCCTQzCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9CSU5EX1RPX1RFWFRVUkVfUkdCQQk0NAorI2RlZmluZSBfX0RSSV9BVFRSSUJfQklORF9UT19NSVBNQVBfVEVYVFVSRQk0NQorI2RlZmluZSBfX0RSSV9BVFRSSUJfQklORF9UT19URVhUVVJFX1RBUkdFVFMJNDYKKyNkZWZpbmUgX19EUklfQVRUUklCX1lJTlZFUlRFRAkJCTQ3CisjZGVmaW5lIF9fRFJJX0FUVFJJQl9GUkFNRUJVRkZFUl9TUkdCX0NBUEFCTEUJNDgKKworLyogX19EUklfQVRUUklCX1JFTkRFUl9UWVBFICovCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9SR0JBX0JJVAkJCTB4MDEJCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9DT0xPUl9JTkRFWF9CSVQJCTB4MDIKKyNkZWZpbmUgX19EUklfQVRUUklCX0xVTUlOQU5DRV9CSVQJCTB4MDQKKworLyogX19EUklfQVRUUklCX0NPTkZJR19DQVZFQVQgKi8KKyNkZWZpbmUgX19EUklfQVRUUklCX1NMT1dfQklUCQkJMHgwMQorI2RlZmluZSBfX0RSSV9BVFRSSUJfTk9OX0NPTkZPUk1BTlRfQ09ORklHCTB4MDIKKworLyogX19EUklfQVRUUklCX1RSQU5TUEFSRU5UX1RZUEUgKi8KKyNkZWZpbmUgX19EUklfQVRUUklCX1RSQU5TUEFSRU5UX1JHQgkJMHgwMAorI2RlZmluZSBfX0RSSV9BVFRSSUJfVFJBTlNQQVJFTlRfSU5ERVgJCTB4MDEKKworLyogX19EUklfQVRUUklCX0JJTkRfVE9fVEVYVFVSRV9UQVJHRVRTCSAqLworI2RlZmluZSBfX0RSSV9BVFRSSUJfVEVYVFVSRV8xRF9CSVQJCTB4MDEKKyNkZWZpbmUgX19EUklfQVRUUklCX1RFWFRVUkVfMkRfQklUCQkweDAyCisjZGVmaW5lIF9fRFJJX0FUVFJJQl9URVhUVVJFX1JFQ1RBTkdMRV9CSVQJMHgwNAorCisvKioKKyAqIFRoaXMgZXh0ZW5zaW9uIGRlZmluZXMgdGhlIGNvcmUgRFJJIGZ1bmN0aW9uYWxpdHkuCisgKi8KKyNkZWZpbmUgX19EUklfQ09SRSAiRFJJX0NvcmUiCisjZGVmaW5lIF9fRFJJX0NPUkVfVkVSU0lPTiAxCisKK3N0cnVjdCBfX0RSSWNvcmVFeHRlbnNpb25SZWMgeworICAgIF9fRFJJZXh0ZW5zaW9uIGJhc2U7CisKKyAgICBfX0RSSXNjcmVlbiAqKCpjcmVhdGVOZXdTY3JlZW4pKGludCBzY3JlZW4sIGludCBmZCwKKwkJCQkgICAgdW5zaWduZWQgaW50IHNhcmVhX2hhbmRsZSwKKwkJCQkgICAgY29uc3QgX19EUklleHRlbnNpb24gKipleHRlbnNpb25zLAorCQkJCSAgICBjb25zdCBfX0RSSWNvbmZpZyAqKipkcml2ZXJDb25maWdzLAorCQkJCSAgICB2b2lkICpsb2FkZXJQcml2YXRlKTsKKworICAgIHZvaWQgKCpkZXN0cm95U2NyZWVuKShfX0RSSXNjcmVlbiAqc2NyZWVuKTsKKworICAgIGNvbnN0IF9fRFJJZXh0ZW5zaW9uICoqKCpnZXRFeHRlbnNpb25zKShfX0RSSXNjcmVlbiAqc2NyZWVuKTsKKworICAgIGludCAoKmdldENvbmZpZ0F0dHJpYikoY29uc3QgX19EUkljb25maWcgKmNvbmZpZywKKwkJCSAgIHVuc2lnbmVkIGludCBhdHRyaWIsCisJCQkgICB1bnNpZ25lZCBpbnQgKnZhbHVlKTsKKworICAgIGludCAoKmluZGV4Q29uZmlnQXR0cmliKShjb25zdCBfX0RSSWNvbmZpZyAqY29uZmlnLCBpbnQgaW5kZXgsCisJCQkgICAgIHVuc2lnbmVkIGludCAqYXR0cmliLCB1bnNpZ25lZCBpbnQgKnZhbHVlKTsKKworICAgIF9fRFJJZHJhd2FibGUgKigqY3JlYXRlTmV3RHJhd2FibGUpKF9fRFJJc2NyZWVuICpzY3JlZW4sCisJCQkJCWNvbnN0IF9fRFJJY29uZmlnICpjb25maWcsCisJCQkJCXVuc2lnbmVkIGludCBkcmF3YWJsZV9pZCwKKwkJCQkJdW5zaWduZWQgaW50IGhlYWQsCisJCQkJCXZvaWQgKmxvYWRlclByaXZhdGUpOworCisgICAgdm9pZCAoKmRlc3Ryb3lEcmF3YWJsZSkoX19EUklkcmF3YWJsZSAqZHJhd2FibGUpOworCisgICAgdm9pZCAoKnN3YXBCdWZmZXJzKShfX0RSSWRyYXdhYmxlICpkcmF3YWJsZSk7CisKKyAgICBfX0RSSWNvbnRleHQgKigqY3JlYXRlTmV3Q29udGV4dCkoX19EUklzY3JlZW4gKnNjcmVlbiwKKwkJCQkgICAgICBjb25zdCBfX0RSSWNvbmZpZyAqY29uZmlnLAorCQkJCSAgICAgIF9fRFJJY29udGV4dCAqc2hhcmVkLAorCQkJCSAgICAgIHZvaWQgKmxvYWRlclByaXZhdGUpOworCisgICAgaW50ICgqY29weUNvbnRleHQpKF9fRFJJY29udGV4dCAqZGVzdCwKKwkJICAgICAgIF9fRFJJY29udGV4dCAqc3JjLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBtYXNrKTsKKworICAgIHZvaWQgKCpkZXN0cm95Q29udGV4dCkoX19EUkljb250ZXh0ICpjb250ZXh0KTsKKworICAgIGludCAoKmJpbmRDb250ZXh0KShfX0RSSWNvbnRleHQgKmN0eCwKKwkJICAgICAgIF9fRFJJZHJhd2FibGUgKnBkcmF3LAorCQkgICAgICAgX19EUklkcmF3YWJsZSAqcHJlYWQpOworCisgICAgaW50ICgqdW5iaW5kQ29udGV4dCkoX19EUkljb250ZXh0ICpjdHgpOworfTsKKworLyoqCisgKiBTdG9yZWQgdmVyc2lvbiBvZiBzb21lIGNvbXBvbmVudCAoaS5lLiwgc2VydmVyLXNpZGUgRFJJIG1vZHVsZSwga2VybmVsLXNpZGUKKyAqIERSTSwgZXRjLikuCisgKiAKKyAqIFx0b2RvCisgKiBUaGVyZSBhcmUgc2V2ZXJhbCBkYXRhIHN0cnVjdHVyZXMgdGhhdCBleHBsaWNpdGx5IHN0b3JlIGEgbWFqb3IgdmVyc2lvbiwKKyAqIG1pbm9yIHZlcnNpb24sIGFuZCBwYXRjaCBsZXZlbC4gIFRoZXNlIHN0cnVjdHVyZXMgc2hvdWxkIGJlIG1vZGlmaWVkIHRvCisgKiBoYXZlIGEgXGMgX19EUkl2ZXJzaW9uUmVjIGluc3RlYWQuCisgKi8KK3N0cnVjdCBfX0RSSXZlcnNpb25SZWMgeworICAgIGludCAgICBtYWpvcjsgICAgICAgIC8qKjwgTWFqb3IgdmVyc2lvbiBudW1iZXIuICovCisgICAgaW50ICAgIG1pbm9yOyAgICAgICAgLyoqPCBNaW5vciB2ZXJzaW9uIG51bWJlci4gKi8KKyAgICBpbnQgICAgcGF0Y2g7ICAgICAgICAvKio8IFBhdGNoLWxldmVsLiAqLworfTsKKworLyoqCisgKiBGcmFtZWJ1ZmZlciBpbmZvcm1hdGlvbiByZWNvcmQuICBVc2VkIGJ5IGxpYkdMIHRvIGNvbW11bmljYXRlIGluZm9ybWF0aW9uCisgKiBhYm91dCB0aGUgZnJhbWVidWZmZXIgdG8gdGhlIGRyaXZlcidzIFxjIF9fZHJpQ3JlYXRlTmV3U2NyZWVuIGZ1bmN0aW9uLgorICogCisgKiBJbiBYRnJlZTg2LCBtb3N0IG9mIHRoaXMgaW5mb3JtYXRpb24gaXMgZGVycml2ZWQgZnJvbSBkYXRhIHJldHVybmVkIGJ5CisgKiBjYWxsaW5nIFxjIFhGODZEUklHZXREZXZpY2VJbmZvLgorICoKKyAqIFxzYSBYRjg2RFJJR2V0RGV2aWNlSW5mbyBfX0RSSWRpc3BsYXlSZWM6OmNyZWF0ZU5ld1NjcmVlbgorICogICAgIF9fZHJpVXRpbENyZWF0ZU5ld1NjcmVlbiBDYWxsQ3JlYXRlTmV3U2NyZWVuCisgKgorICogXGJ1ZyBUaGlzIHN0cnVjdHVyZSBjb3VsZCBiZSBiZXR0ZXIgbmFtZWQuCisgKi8KK3N0cnVjdCBfX0RSSWZyYW1lYnVmZmVyUmVjIHsKKyAgICB1bnNpZ25lZCBjaGFyICpiYXNlOyAgICAvKio8IEZyYW1lYnVmZmVyIGJhc2UgYWRkcmVzcyBpbiB0aGUgQ1BVJ3MKKwkJCSAgICAgKiBhZGRyZXNzIHNwYWNlLiAgVGhpcyB2YWx1ZSBpcyBjYWxjdWxhdGVkIGJ5CisJCQkgICAgICogY2FsbGluZyBcYyBkcm1NYXAgb24gdGhlIGZyYW1lYnVmZmVyIGhhbmRsZQorCQkJICAgICAqIHJldHVybmVkIGJ5IFxjIFhGODZEUklHZXREZXZpY2VJbmZvIChvciBhCisJCQkgICAgICogc2ltaWxhciBmdW5jdGlvbikuCisJCQkgICAgICovCisgICAgaW50IHNpemU7ICAgICAgICAgICAgICAgLyoqPCBGcmFtZWJ1ZmZlciBzaXplLCBpbiBieXRlcy4gKi8KKyAgICBpbnQgc3RyaWRlOyAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBieXRlcyBmcm9tIG9uZSBsaW5lIHRvIHRoZSBuZXh0LiAqLworICAgIGludCB3aWR0aDsgICAgICAgICAgICAgIC8qKjwgUGl4ZWwgd2lkdGggb2YgdGhlIGZyYW1lYnVmZmVyLiAqLworICAgIGludCBoZWlnaHQ7ICAgICAgICAgICAgIC8qKjwgUGl4ZWwgaGVpZ2h0IG9mIHRoZSBmcmFtZWJ1ZmZlci4gKi8KKyAgICBpbnQgZGV2X3ByaXZfc2l6ZTsgICAgICAvKio8IFNpemUgb2YgdGhlIGRyaXZlcidzIGRldi1wcml2IHN0cnVjdHVyZS4gKi8KKyAgICB2b2lkICpkZXZfcHJpdjsgICAgICAgICAvKio8IFBvaW50ZXIgdG8gdGhlIGRyaXZlcidzIGRldi1wcml2IHN0cnVjdHVyZS4gKi8KK307CisKKworLyoqCisgKiBUaGlzIGV4dGVuc2lvbiBwcm92aWRlcyBhbHRlcm5hdGl2ZSBzY3JlZW4sIGRyYXdhYmxlIGFuZCBjb250ZXh0CisgKiBjb25zdHJ1Y3RvcnMgZm9yIGxlZ2FjeSBEUkkgZnVuY3Rpb25hbGl0eS4gIFRoaXMgaXMgdXNlZCBpbgorICogY29uanVuY3Rpb24gd2l0aCB0aGUgY29yZSBleHRlbnNpb24uCisgKi8KKyNkZWZpbmUgX19EUklfTEVHQUNZICJEUklfTGVnYWN5IgorI2RlZmluZSBfX0RSSV9MRUdBQ1lfVkVSU0lPTiAxCisKK3N0cnVjdCBfX0RSSWxlZ2FjeUV4dGVuc2lvblJlYyB7CisgICAgX19EUklleHRlbnNpb24gYmFzZTsKKworICAgIF9fRFJJc2NyZWVuICooKmNyZWF0ZU5ld1NjcmVlbikoaW50IHNjcmVlbiwKKwkJCQkgICAgY29uc3QgX19EUkl2ZXJzaW9uICpkZHhfdmVyc2lvbiwKKwkJCQkgICAgY29uc3QgX19EUkl2ZXJzaW9uICpkcmlfdmVyc2lvbiwKKwkJCQkgICAgY29uc3QgX19EUkl2ZXJzaW9uICpkcm1fdmVyc2lvbiwKKwkJCQkgICAgY29uc3QgX19EUklmcmFtZWJ1ZmZlciAqZnJhbWVfYnVmZmVyLAorCQkJCSAgICB2b2lkICpwU0FSRUEsIGludCBmZCwgCisJCQkJICAgIGNvbnN0IF9fRFJJZXh0ZW5zaW9uICoqZXh0ZW5zaW9ucywKKwkJCQkgICAgY29uc3QgX19EUkljb25maWcgKioqZHJpdmVyX2NvbmZpZ3MsCisJCQkJICAgIHZvaWQgKmxvYWRlclByaXZhdGUpOworCisgICAgX19EUklkcmF3YWJsZSAqKCpjcmVhdGVOZXdEcmF3YWJsZSkoX19EUklzY3JlZW4gKnNjcmVlbiwKKwkJCQkJY29uc3QgX19EUkljb25maWcgKmNvbmZpZywKKwkJCQkJZHJtX2RyYXdhYmxlX3QgaHdEcmF3YWJsZSwKKwkJCQkJaW50IHJlbmRlclR5cGUsIGNvbnN0IGludCAqYXR0cnMsCisJCQkJCXZvaWQgKmxvYWRlclByaXZhdGUpOworCisgICAgX19EUkljb250ZXh0ICooKmNyZWF0ZU5ld0NvbnRleHQpKF9fRFJJc2NyZWVuICpzY3JlZW4sCisJCQkJICAgICAgY29uc3QgX19EUkljb25maWcgKmNvbmZpZywKKwkJCQkgICAgICBpbnQgcmVuZGVyX3R5cGUsCisJCQkJICAgICAgX19EUkljb250ZXh0ICpzaGFyZWQsCisJCQkJICAgICAgZHJtX2NvbnRleHRfdCBod0NvbnRleHQsCisJCQkJICAgICAgdm9pZCAqbG9hZGVyUHJpdmF0ZSk7Cit9OworCisvKioKKyAqIFRoaXMgZXh0ZW5zaW9uIHByb3ZpZGVzIGFsdGVybmF0aXZlIHNjcmVlbiwgZHJhd2FibGUgYW5kIGNvbnRleHQKKyAqIGNvbnN0cnVjdG9ycyBmb3Igc3dyYXN0IERSSSBmdW5jdGlvbmFsaXR5LiAgVGhpcyBpcyB1c2VkIGluCisgKiBjb25qdW5jdGlvbiB3aXRoIHRoZSBjb3JlIGV4dGVuc2lvbi4KKyAqLworI2RlZmluZSBfX0RSSV9TV1JBU1QgIkRSSV9TV1Jhc3QiCisjZGVmaW5lIF9fRFJJX1NXUkFTVF9WRVJTSU9OIDMKKworc3RydWN0IF9fRFJJc3dyYXN0RXh0ZW5zaW9uUmVjIHsKKyAgICBfX0RSSWV4dGVuc2lvbiBiYXNlOworCisgICAgX19EUklzY3JlZW4gKigqY3JlYXRlTmV3U2NyZWVuKShpbnQgc2NyZWVuLAorCQkJCSAgICBjb25zdCBfX0RSSWV4dGVuc2lvbiAqKmV4dGVuc2lvbnMsCisJCQkJICAgIGNvbnN0IF9fRFJJY29uZmlnICoqKmRyaXZlcl9jb25maWdzLAorCQkJCSAgICB2b2lkICpsb2FkZXJQcml2YXRlKTsKKworICAgIF9fRFJJZHJhd2FibGUgKigqY3JlYXRlTmV3RHJhd2FibGUpKF9fRFJJc2NyZWVuICpzY3JlZW4sCisJCQkJCWNvbnN0IF9fRFJJY29uZmlnICpjb25maWcsCisJCQkJCXZvaWQgKmxvYWRlclByaXZhdGUpOworCisgICAvKiBTaW5jZSB2ZXJzaW9uIDIgKi8KKyAgIF9fRFJJY29udGV4dCAqKCpjcmVhdGVOZXdDb250ZXh0Rm9yQVBJKShfX0RSSXNjcmVlbiAqc2NyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19EUkljb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0RSSWNvbnRleHQgKnNoYXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKTsKKworICAgLyoqCisgICAgKiBDcmVhdGUgYSBjb250ZXh0IGZvciBhIHBhcnRpY3VsYXIgQVBJIHdpdGggYSBzZXQgb2YgYXR0cmlidXRlcworICAgICoKKyAgICAqIFxzaW5jZSB2ZXJzaW9uIDMKKyAgICAqCisgICAgKiBcc2EgX19EUklkcmkyRXh0ZW5zaW9uUmVjOjpjcmVhdGVDb250ZXh0QXR0cmlicworICAgICovCisgICBfX0RSSWNvbnRleHQgKigqY3JlYXRlQ29udGV4dEF0dHJpYnMpKF9fRFJJc2NyZWVuICpzY3JlZW4sCisJCQkJCSBpbnQgYXBpLAorCQkJCQkgY29uc3QgX19EUkljb25maWcgKmNvbmZpZywKKwkJCQkJIF9fRFJJY29udGV4dCAqc2hhcmVkLAorCQkJCQkgdW5zaWduZWQgbnVtX2F0dHJpYnMsCisJCQkJCSBjb25zdCB1aW50MzJfdCAqYXR0cmlicywKKwkJCQkJIHVuc2lnbmVkICplcnJvciwKKwkJCQkJIHZvaWQgKmxvYWRlclByaXZhdGUpOworfTsKKworLyoqCisgKiBEUkkyIExvYWRlciBleHRlbnNpb24uCisgKi8KKyNkZWZpbmUgX19EUklfQlVGRkVSX0ZST05UX0xFRlQJCTAKKyNkZWZpbmUgX19EUklfQlVGRkVSX0JBQ0tfTEVGVAkJMQorI2RlZmluZSBfX0RSSV9CVUZGRVJfRlJPTlRfUklHSFQJMgorI2RlZmluZSBfX0RSSV9CVUZGRVJfQkFDS19SSUdIVAkJMworI2RlZmluZSBfX0RSSV9CVUZGRVJfREVQVEgJCTQKKyNkZWZpbmUgX19EUklfQlVGRkVSX1NURU5DSUwJCTUKKyNkZWZpbmUgX19EUklfQlVGRkVSX0FDQ1VNCQk2CisjZGVmaW5lIF9fRFJJX0JVRkZFUl9GQUtFX0ZST05UX0xFRlQJNworI2RlZmluZSBfX0RSSV9CVUZGRVJfRkFLRV9GUk9OVF9SSUdIVAk4CisjZGVmaW5lIF9fRFJJX0JVRkZFUl9ERVBUSF9TVEVOQ0lMCTkgIC8qKjwgT25seSBhdmFpbGFibGUgd2l0aCBEUkkyIDEuMSAqLworI2RlZmluZSBfX0RSSV9CVUZGRVJfSElaCQkxMAorCisvKiBJbm9mZmljaWFsIGFuZCBmb3IgaW50ZXJuYWwgdXNlLiBJbmNyZWFzZSB3aGVuIGFkZGluZyBhIG5ldyBidWZmZXIgdG9rZW4uICovCisjZGVmaW5lIF9fRFJJX0JVRkZFUl9DT1VOVAkJMTEKKworc3RydWN0IF9fRFJJYnVmZmVyUmVjIHsKKyAgICB1bnNpZ25lZCBpbnQgYXR0YWNobWVudDsKKyAgICB1bnNpZ25lZCBpbnQgbmFtZTsKKyAgICB1bnNpZ25lZCBpbnQgcGl0Y2g7CisgICAgdW5zaWduZWQgaW50IGNwcDsKKyAgICB1bnNpZ25lZCBpbnQgZmxhZ3M7Cit9OworCisjZGVmaW5lIF9fRFJJX0RSSTJfTE9BREVSICJEUklfRFJJMkxvYWRlciIKKyNkZWZpbmUgX19EUklfRFJJMl9MT0FERVJfVkVSU0lPTiAzCitzdHJ1Y3QgX19EUklkcmkyTG9hZGVyRXh0ZW5zaW9uUmVjIHsKKyAgICBfX0RSSWV4dGVuc2lvbiBiYXNlOworCisgICAgX19EUklidWZmZXIgKigqZ2V0QnVmZmVycykoX19EUklkcmF3YWJsZSAqZHJpRHJhd2FibGUsCisJCQkgICAgICAgaW50ICp3aWR0aCwgaW50ICpoZWlnaHQsCisJCQkgICAgICAgdW5zaWduZWQgaW50ICphdHRhY2htZW50cywgaW50IGNvdW50LAorCQkJICAgICAgIGludCAqb3V0X2NvdW50LCB2b2lkICpsb2FkZXJQcml2YXRlKTsKKworICAgIC8qKgorICAgICAqIEZsdXNoIHBlbmRpbmcgZnJvbnQtYnVmZmVyIHJlbmRlcmluZworICAgICAqCisgICAgICogQW55IHJlbmRlcmluZyB0aGF0IGhhcyBiZWVuIHBlcmZvcm1lZCB0byB0aGUKKyAgICAgKiBcYyBfX0RSSV9CVUZGRVJfRkFLRV9GUk9OVF9MRUZUIHdpbGwgYmUgZmx1c2hlZCB0byB0aGUKKyAgICAgKiBcYyBfX0RSSV9CVUZGRVJfRlJPTlRfTEVGVC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBkcmlEcmF3YWJsZSAgICBEcmF3YWJsZSB3aG9zZSBmcm9udC1idWZmZXIgaXMgdG8gYmUgZmx1c2hlZAorICAgICAqIFxwYXJhbSBsb2FkZXJQcml2YXRlICBMb2FkZXIncyBwcml2YXRlIGRhdGEgdGhhdCB3YXMgcHJldmlvdXNseSBwYXNzZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgaW50byBfX0RSSWRyaTJFeHRlbnNpb25SZWM6OmNyZWF0ZU5ld0RyYXdhYmxlCisgICAgICovCisgICAgdm9pZCAoKmZsdXNoRnJvbnRCdWZmZXIpKF9fRFJJZHJhd2FibGUgKmRyaURyYXdhYmxlLCB2b2lkICpsb2FkZXJQcml2YXRlKTsKKworCisgICAgLyoqCisgICAgICogR2V0IGxpc3Qgb2YgYnVmZmVycyBmcm9tIHRoZSBzZXJ2ZXIKKyAgICAgKgorICAgICAqIEdldHMgYSBsaXN0IG9mIGJ1ZmZlciBmb3IgdGhlIHNwZWNpZmllZCBzZXQgb2YgYXR0YWNobWVudHMuICBVbmxpa2UKKyAgICAgKiBcYyA6OmdldEJ1ZmZlcnMsIHRoaXMgZnVuY3Rpb24gdGFrZXMgYSBsaXN0IG9mIGF0dGFjaG1lbnRzIHBhaXJlZCB3aXRoCisgICAgICogb3BhcXVlIFxjIHVuc2lnbmVkIFxjIGludCB2YWx1ZSBkZXNjcmliaW5nIHRoZSBmb3JtYXQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBrbm93IHdoYXQgdGhlIHNlcnZpY2UgdGhhdAorICAgICAqIGFsbG9jYXRlcyB0aGUgYnVmZmVycyB3aWxsIGV4cGVjdCB0byByZWNlaXZlIGZvciB0aGUgZm9ybWF0LgorICAgICAqCisgICAgICogXHBhcmFtIGRyaURyYXdhYmxlICAgIERyYXdhYmxlIHdob3NlIGJ1ZmZlcnMgYXJlIGJlaW5nIHF1ZXJpZWQuCisgICAgICogXHBhcmFtIHdpZHRoICAgICAgICAgIE91dHB1dCB3aGVyZSB0aGUgd2lkdGggb2YgdGhlIGJ1ZmZlcnMgaXMgc3RvcmVkLgorICAgICAqIFxwYXJhbSBoZWlnaHQgICAgICAgICBPdXRwdXQgd2hlcmUgdGhlIGhlaWdodCBvZiB0aGUgYnVmZmVycyBpcyBzdG9yZWQuCisgICAgICogXHBhcmFtIGF0dGFjaG1lbnRzICAgIExpc3Qgb2YgcGFpcnMgb2YgYXR0YWNobWVudCBJRCBhbmQgb3BhcXVlIGZvcm1hdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQgZm9yIHRoZSBkcmF3YWJsZS4KKyAgICAgKiBccGFyYW0gY291bnQgICAgICAgICAgTnVtYmVyIG9mIGF0dGFjaG1lbnQgLyBmb3JtYXQgcGFpcnMgc3RvcmVkIGluCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIFxjIGF0dGFjaG1lbnRzLgorICAgICAqIFxwYXJhbSBsb2FkZXJQcml2YXRlICBMb2FkZXIncyBwcml2YXRlIGRhdGEgdGhhdCB3YXMgcHJldmlvdXNseSBwYXNzZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgaW50byBfX0RSSWRyaTJFeHRlbnNpb25SZWM6OmNyZWF0ZU5ld0RyYXdhYmxlLgorICAgICAqLworICAgIF9fRFJJYnVmZmVyICooKmdldEJ1ZmZlcnNXaXRoRm9ybWF0KShfX0RSSWRyYXdhYmxlICpkcmlEcmF3YWJsZSwKKwkJCQkJIGludCAqd2lkdGgsIGludCAqaGVpZ2h0LAorCQkJCQkgdW5zaWduZWQgaW50ICphdHRhY2htZW50cywgaW50IGNvdW50LAorCQkJCQkgaW50ICpvdXRfY291bnQsIHZvaWQgKmxvYWRlclByaXZhdGUpOworfTsKKworLyoqCisgKiBUaGlzIGV4dGVuc2lvbiBwcm92aWRlcyBhbHRlcm5hdGl2ZSBzY3JlZW4sIGRyYXdhYmxlIGFuZCBjb250ZXh0CisgKiBjb25zdHJ1Y3RvcnMgZm9yIERSSTIuCisgKi8KKyNkZWZpbmUgX19EUklfRFJJMiAiRFJJX0RSSTIiCisjZGVmaW5lIF9fRFJJX0RSSTJfVkVSU0lPTiAzCisKKyNkZWZpbmUgX19EUklfQVBJX09QRU5HTAkwCS8qKjwgT3BlbkdMIGNvbXBhdGliaWxpdHkgcHJvZmlsZSAqLworI2RlZmluZSBfX0RSSV9BUElfR0xFUwkJMQorI2RlZmluZSBfX0RSSV9BUElfR0xFUzIJCTIKKyNkZWZpbmUgX19EUklfQVBJX09QRU5HTF9DT1JFCTMJLyoqPCBPcGVuR0wgMy4yKyBjb3JlIHByb2ZpbGUgKi8KKworI2RlZmluZSBfX0RSSV9DVFhfQVRUUklCX01BSk9SX1ZFUlNJT04JCTAKKyNkZWZpbmUgX19EUklfQ1RYX0FUVFJJQl9NSU5PUl9WRVJTSU9OCQkxCisjZGVmaW5lIF9fRFJJX0NUWF9BVFRSSUJfRkxBR1MJCQkyCisKKyNkZWZpbmUgX19EUklfQ1RYX0ZMQUdfREVCVUcJCQkweDAwMDAwMDAxCisjZGVmaW5lIF9fRFJJX0NUWF9GTEFHX0ZPUldBUkRfQ09NUEFUSUJMRQkweDAwMDAwMDAyCisKKy8qKgorICogXG5hbWUgUmVhc29ucyB0aGF0IF9fRFJJZHJpMkV4dGVuc2lvbjo6Y3JlYXRlQ29udGV4dEF0dHJpYnMgbWlnaHQgZmFpbAorICovCisvKkB7Ki8KKy8qKiBTdWNjZXNzISAqLworI2RlZmluZSBfX0RSSV9DVFhfRVJST1JfU1VDQ0VTUwkJCTAKKworLyoqIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgKi8KKyNkZWZpbmUgX19EUklfQ1RYX0VSUk9SX05PX01FTU9SWQkJMQorCisvKiogQ2xpZW50IHJlcXVlc3RlZCBhbiBBUEkgKGUuZy4sIE9wZW5HTCBFUyAyLjApIHRoYXQgdGhlIGRyaXZlciBjYW4ndCBkby4gKi8KKyNkZWZpbmUgX19EUklfQ1RYX0VSUk9SX0JBRF9BUEkJCQkyCisKKy8qKiBDbGllbnQgcmVxdWVzdGVkIGFuIEFQSSB2ZXJzaW9uIHRoYXQgdGhlIGRyaXZlciBjYW4ndCBkby4gKi8KKyNkZWZpbmUgX19EUklfQ1RYX0VSUk9SX0JBRF9WRVJTSU9OCQkzCisKKy8qKiBDbGllbnQgcmVxdWVzdGVkIGEgZmxhZyBvciBjb21iaW5hdGlvbiBvZiBmbGFncyB0aGUgZHJpdmVyIGNhbid0IGRvLiAqLworI2RlZmluZSBfX0RSSV9DVFhfRVJST1JfQkFEX0ZMQUcJCTQKKworLyoqIENsaWVudCByZXF1ZXN0ZWQgYW4gYXR0cmlidXRlIHRoZSBkcml2ZXIgZG9lc24ndCB1bmRlcnN0YW5kLiAqLworI2RlZmluZSBfX0RSSV9DVFhfRVJST1JfVU5LTk9XTl9BVFRSSUJVVEUJNQorCisvKiogQ2xpZW50IHJlcXVlc3RlZCBhIGZsYWcgdGhlIGRyaXZlciBkb2Vzbid0IHVuZGVyc3RhbmQuICovCisjZGVmaW5lIF9fRFJJX0NUWF9FUlJPUl9VTktOT1dOX0ZMQUcJCTYKKy8qQH0qLworCitzdHJ1Y3QgX19EUklkcmkyRXh0ZW5zaW9uUmVjIHsKKyAgICBfX0RSSWV4dGVuc2lvbiBiYXNlOworCisgICAgX19EUklzY3JlZW4gKigqY3JlYXRlTmV3U2NyZWVuKShpbnQgc2NyZWVuLCBpbnQgZmQsCisJCQkJICAgIGNvbnN0IF9fRFJJZXh0ZW5zaW9uICoqZXh0ZW5zaW9ucywKKwkJCQkgICAgY29uc3QgX19EUkljb25maWcgKioqZHJpdmVyX2NvbmZpZ3MsCisJCQkJICAgIHZvaWQgKmxvYWRlclByaXZhdGUpOworCisgICAgX19EUklkcmF3YWJsZSAqKCpjcmVhdGVOZXdEcmF3YWJsZSkoX19EUklzY3JlZW4gKnNjcmVlbiwKKwkJCQkJY29uc3QgX19EUkljb25maWcgKmNvbmZpZywKKwkJCQkJdm9pZCAqbG9hZGVyUHJpdmF0ZSk7CisKKyAgICBfX0RSSWNvbnRleHQgKigqY3JlYXRlTmV3Q29udGV4dCkoX19EUklzY3JlZW4gKnNjcmVlbiwKKwkJCQkgICAgICBjb25zdCBfX0RSSWNvbmZpZyAqY29uZmlnLAorCQkJCSAgICAgIF9fRFJJY29udGV4dCAqc2hhcmVkLAorCQkJCSAgICAgIHZvaWQgKmxvYWRlclByaXZhdGUpOworCisgICAvKiBTaW5jZSB2ZXJzaW9uIDIgKi8KKyAgIHVuc2lnbmVkIGludCAoKmdldEFQSU1hc2spKF9fRFJJc2NyZWVuICpzY3JlZW4pOworCisgICBfX0RSSWNvbnRleHQgKigqY3JlYXRlTmV3Q29udGV4dEZvckFQSSkoX19EUklzY3JlZW4gKnNjcmVlbiwKKwkJCQkJICAgaW50IGFwaSwKKwkJCQkJICAgY29uc3QgX19EUkljb25maWcgKmNvbmZpZywKKwkJCQkJICAgX19EUkljb250ZXh0ICpzaGFyZWQsCisJCQkJCSAgIHZvaWQgKmRhdGEpOworCisgICBfX0RSSWJ1ZmZlciAqKCphbGxvY2F0ZUJ1ZmZlcikoX19EUklzY3JlZW4gKnNjcmVlbiwKKwkJCQkgIHVuc2lnbmVkIGludCBhdHRhY2htZW50LAorCQkJCSAgdW5zaWduZWQgaW50IGZvcm1hdCwKKwkJCQkgIGludCB3aWR0aCwKKwkJCQkgIGludCBoZWlnaHQpOworICAgdm9pZCAoKnJlbGVhc2VCdWZmZXIpKF9fRFJJc2NyZWVuICpzY3JlZW4sCisJCQkgX19EUklidWZmZXIgKmJ1ZmZlcik7CisKKyAgIC8qKgorICAgICogQ3JlYXRlIGEgY29udGV4dCBmb3IgYSBwYXJ0aWN1bGFyIEFQSSB3aXRoIGEgc2V0IG9mIGF0dHJpYnV0ZXMKKyAgICAqCisgICAgKiBcc2luY2UgdmVyc2lvbiAzCisgICAgKgorICAgICogXHNhIF9fRFJJc3dyYXN0RXh0ZW5zaW9uUmVjOjpjcmVhdGVDb250ZXh0QXR0cmlicworICAgICovCisgICBfX0RSSWNvbnRleHQgKigqY3JlYXRlQ29udGV4dEF0dHJpYnMpKF9fRFJJc2NyZWVuICpzY3JlZW4sCisJCQkJCSBpbnQgYXBpLAorCQkJCQkgY29uc3QgX19EUkljb25maWcgKmNvbmZpZywKKwkJCQkJIF9fRFJJY29udGV4dCAqc2hhcmVkLAorCQkJCQkgdW5zaWduZWQgbnVtX2F0dHJpYnMsCisJCQkJCSBjb25zdCB1aW50MzJfdCAqYXR0cmlicywKKwkJCQkJIHVuc2lnbmVkICplcnJvciwKKwkJCQkJIHZvaWQgKmxvYWRlclByaXZhdGUpOworfTsKKworCisvKioKKyAqIFRoaXMgZXh0ZW5zaW9uIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgdG8gZW5hYmxlIHZhcmlvdXMgRUdMSW1hZ2UKKyAqIGV4dGVuc2lvbnMuCisgKi8KKyNkZWZpbmUgX19EUklfSU1BR0UgIkRSSV9JTUFHRSIKKyNkZWZpbmUgX19EUklfSU1BR0VfVkVSU0lPTiAxCisKKy8qKgorICogVGhlc2UgZm9ybWF0cyBjb3JyZXNwb25kIHRvIHRoZSBzaW1pbGFybHkgbmFtZWQgTUVTQV9GT1JNQVRfKgorICogdG9rZW5zLCBleGNlcHQgaW4gdGhlIG5hdGl2ZSBlbmRpYW4gb2YgdGhlIENQVS4gIEZvciBleGFtcGxlLCBvbgorICogbGl0dGxlIGVuZGlhbiBfX0RSSV9JTUFHRV9GT1JNQVRfWFJHQjg4ODggY29ycmVzcG9uZHMgdG8KKyAqIE1FU0FfRk9STUFUX1hSR0I4ODg4LCBidXQgTUVTQV9GT1JNQVRfWFJHQjg4ODhfUkVWIG9uIGJpZyBlbmRpYW4uCisgKi8KKyNkZWZpbmUgX19EUklfSU1BR0VfRk9STUFUX1JHQjU2NSAgICAgICAweDEwMDEKKyNkZWZpbmUgX19EUklfSU1BR0VfRk9STUFUX1hSR0I4ODg4ICAgICAweDEwMDIKKyNkZWZpbmUgX19EUklfSU1BR0VfRk9STUFUX0FSR0I4ODg4ICAgICAweDEwMDMKKyNkZWZpbmUgX19EUklfSU1BR0VfRk9STUFUX0FCR1I4ODg4ICAgICAweDEwMDQKKworI2RlZmluZSBfX0RSSV9JTUFHRV9VU0VfU0hBUkUJCTB4MDAwMQorI2RlZmluZSBfX0RSSV9JTUFHRV9VU0VfU0NBTk9VVAkJMHgwMDAyCisjZGVmaW5lIF9fRFJJX0lNQUdFX1VTRV9DVVJTT1IJCTB4MDAwNAorCisvKioKKyAqIHF1ZXJ5SW1hZ2UgYXR0cmlidXRlcworICovCisKKyNkZWZpbmUgX19EUklfSU1BR0VfQVRUUklCX1NUUklERQkweDIwMDAKKyNkZWZpbmUgX19EUklfSU1BR0VfQVRUUklCX0hBTkRMRQkweDIwMDEKKyNkZWZpbmUgX19EUklfSU1BR0VfQVRUUklCX05BTUUJCTB4MjAwMgorCit0eXBlZGVmIHN0cnVjdCBfX0RSSWltYWdlUmVjICAgICAgICAgIF9fRFJJaW1hZ2U7Cit0eXBlZGVmIHN0cnVjdCBfX0RSSWltYWdlRXh0ZW5zaW9uUmVjIF9fRFJJaW1hZ2VFeHRlbnNpb247CitzdHJ1Y3QgX19EUklpbWFnZUV4dGVuc2lvblJlYyB7CisgICAgX19EUklleHRlbnNpb24gYmFzZTsKKworICAgIF9fRFJJaW1hZ2UgKigqY3JlYXRlSW1hZ2VGcm9tTmFtZSkoX19EUklzY3JlZW4gKnNjcmVlbiwKKwkJCQkgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LAorCQkJCSAgICAgICBpbnQgbmFtZSwgaW50IHBpdGNoLAorCQkJCSAgICAgICB2b2lkICpsb2FkZXJQcml2YXRlKTsKKworICAgIF9fRFJJaW1hZ2UgKigqY3JlYXRlSW1hZ2VGcm9tUmVuZGVyYnVmZmVyKShfX0RSSWNvbnRleHQgKmNvbnRleHQsCisJCQkJCSAgICAgICBpbnQgcmVuZGVyYnVmZmVyLAorCQkJCQkgICAgICAgdm9pZCAqbG9hZGVyUHJpdmF0ZSk7CisKKyAgICB2b2lkICgqZGVzdHJveUltYWdlKShfX0RSSWltYWdlICppbWFnZSk7CisKKyAgICBfX0RSSWltYWdlICooKmNyZWF0ZUltYWdlKShfX0RSSXNjcmVlbiAqc2NyZWVuLAorCQkJICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgdXNlLAorCQkJICAgICAgIHZvaWQgKmxvYWRlclByaXZhdGUpOworCisgICBHTGJvb2xlYW4gKCpxdWVyeUltYWdlKShfX0RSSWltYWdlICppbWFnZSwgaW50IGF0dHJpYiwgaW50ICp2YWx1ZSk7CisKKyAgIC8qKgorICAgICogVGhlIG5ldyBfX0RSSWltYWdlIHdpbGwgc2hhcmUgdGhlIGNvbnRlbnQgd2l0aCB0aGUgb2xkIG9uZSwgc2VlIGR1cCgyKS4KKyAgICAqLworICAgX19EUklpbWFnZSAqKCpkdXBJbWFnZSkoX19EUklpbWFnZSAqaW1hZ2UsIHZvaWQgKmxvYWRlclByaXZhdGUpOworfTsKKworCisvKioKKyAqIFRoaXMgZXh0ZW5zaW9uIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGxvYWRlciBhbmQgcGFzc2VkIHRvIHRoZQorICogZHJpdmVyIGF0IHNjcmVlbiBjcmVhdGlvbiB0aW1lLiAgVGhlIEVHTEltYWdlIGVudHJ5IHBvaW50cyBpbiB0aGUKKyAqIHZhcmlvdXMgY2xpZW50IEFQSXMgdGFrZSBvcGFxdWUgRUdMSW1hZ2UgaGFuZGxlcyBhbmQgdXNlIHRoaXMKKyAqIGV4dGVuc2lvbiB0byBtYXAgdGhlbSB0byBhIF9fRFJJaW1hZ2UuICBBdCB2ZXJzaW9uIDEsIHRoaXMKKyAqIGV4dGVuc2lvbnMgYWxsb3dzIG1hcHBpbmcgRUdMSW1hZ2UgcG9pbnRlcnMgdG8gX19EUklpbWFnZSBwb2ludGVycywKKyAqIGJ1dCBmdXR1cmUgdmVyc2lvbnMgY291bGQgc3VwcG9ydCBvdGhlciBFR0xJbWFnZS1saWtlLCBvcGFxdWUgdHlwZXMKKyAqIHdpdGggbmV3IGxvb2t1cCBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUgX19EUklfSU1BR0VfTE9PS1VQICJEUklfSU1BR0VfTE9PS1VQIgorI2RlZmluZSBfX0RSSV9JTUFHRV9MT09LVVBfVkVSU0lPTiAxCisKK3R5cGVkZWYgc3RydWN0IF9fRFJJaW1hZ2VMb29rdXBFeHRlbnNpb25SZWMgX19EUklpbWFnZUxvb2t1cEV4dGVuc2lvbjsKK3N0cnVjdCBfX0RSSWltYWdlTG9va3VwRXh0ZW5zaW9uUmVjIHsKKyAgICBfX0RSSWV4dGVuc2lvbiBiYXNlOworCisgICAgX19EUklpbWFnZSAqKCpsb29rdXBFR0xJbWFnZSkoX19EUklzY3JlZW4gKnNjcmVlbiwgdm9pZCAqaW1hZ2UsCisJCQkJICB2b2lkICpsb2FkZXJQcml2YXRlKTsKK307CisKKy8qKgorICogVGhpcyBleHRlbnNpb24gYWxsb3dzIGZvciBjb21tb24gRFJJMiBvcHRpb25zCisgKi8KKyNkZWZpbmUgX19EUkkyX0NPTkZJR19RVUVSWSAiRFJJX0NPTkZJR19RVUVSWSIKKyNkZWZpbmUgX19EUkkyX0NPTkZJR19RVUVSWV9WRVJTSU9OIDEKKwordHlwZWRlZiBzdHJ1Y3QgX19EUkkyY29uZmlnUXVlcnlFeHRlbnNpb25SZWMgX19EUkkyY29uZmlnUXVlcnlFeHRlbnNpb247CitzdHJ1Y3QgX19EUkkyY29uZmlnUXVlcnlFeHRlbnNpb25SZWMgeworICAgX19EUklleHRlbnNpb24gYmFzZTsKKworICAgaW50ICgqY29uZmlnUXVlcnliKShfX0RSSXNjcmVlbiAqc2NyZWVuLCBjb25zdCBjaGFyICp2YXIsIEdMYm9vbGVhbiAqdmFsKTsKKyAgIGludCAoKmNvbmZpZ1F1ZXJ5aSkoX19EUklzY3JlZW4gKnNjcmVlbiwgY29uc3QgY2hhciAqdmFyLCBHTGludCAqdmFsKTsKKyAgIGludCAoKmNvbmZpZ1F1ZXJ5ZikoX19EUklzY3JlZW4gKnNjcmVlbiwgY29uc3QgY2hhciAqdmFyLCBHTGZsb2F0ICp2YWwpOworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvREVDa2V5c3ltLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9ERUNrZXlzeW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzMwNzE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvREVDa2V5c3ltLmgKQEAgLTAsMCArMSw2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg4LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisKK0NvcHlyaWdodCAxOTg4IGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLgorCisgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyAKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCitwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Citib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIERpZ2l0YWwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK3NvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIAorCitESUdJVEFMIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKK0FMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTAorRElHSVRBTCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKK0FOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKK0FSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKK1NPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBERUMgcHJpdmF0ZSBrZXlzeW1zCisgKiAoMjl0aCBiaXQgc2V0KQorICovCisKKy8qIHR3by1rZXkgY29tcG9zZSBzZXF1ZW5jZSBpbml0aWF0b3JzLCBjaG9zZW4gdG8gbWFwIHRvIExhdGluMSBjaGFyYWN0ZXJzICovCisKKyNkZWZpbmUgRFhLX3JpbmdfYWNjZW50ICAgICAgICAgMHgxMDAwRkVCMAorI2RlZmluZSBEWEtfY2lyY3VtZmxleF9hY2NlbnQgICAweDEwMDBGRTVFCisjZGVmaW5lIERYS19jZWRpbGxhX2FjY2VudCAgICAgIDB4MTAwMEZFMkMKKyNkZWZpbmUgRFhLX2FjdXRlX2FjY2VudCAgICAgICAgMHgxMDAwRkUyNworI2RlZmluZSBEWEtfZ3JhdmVfYWNjZW50ICAgICAgICAweDEwMDBGRTYwCisjZGVmaW5lIERYS190aWxkZSAgICAgICAgICAgICAgIDB4MTAwMEZFN0UKKyNkZWZpbmUgRFhLX2RpYWVyZXNpcyAgICAgICAgICAgMHgxMDAwRkUyMgorCisvKiBzcGVjaWFsIGtleXN5bSBmb3IgTEsyKiogIlJlbW92ZSIga2V5IG9uIGVkaXRpbmcga2V5cGFkICovCisKKyNkZWZpbmUgRFhLX1JlbW92ZQkweDEwMDBGRjAwICAgLyogUmVtb3ZlICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9IUGtleXN5bS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvSFBrZXlzeW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDAwMGIxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvSFBrZXlzeW0uaApAQCAtMCwwICsxLDE2NCBAQAorLyoKKworQ29weXJpZ2h0IDE5ODcsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKK2luIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKK09USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCitPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsCitub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yCitvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uCitmcm9tIFRoZSBPcGVuIEdyb3VwLgorCitDb3B5cmlnaHQgMTk4NyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cywKKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKK3Byb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKK2JvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZXMgb2YgSGV3bGV0dCBQYWNrYXJkCitvciBEaWdpdGFsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisKK0RJR0lUQUwgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORworQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCitESUdJVEFMIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgorQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLAorQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworU09GVFdBUkUuCisKK0hFV0xFVFQtUEFDS0FSRCBNQUtFUyBOTyBXQVJSQU5UWSBPRiBBTlkgS0lORCBXSVRIIFJFR0FSRAorVE8gVEhJUyBTT0ZXQVJFLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuICBIZXdsZXR0LVBhY2thcmQgc2hhbGwgbm90IGJlIGxpYWJsZSBmb3IgZXJyb3JzCitjb250YWluZWQgaGVyZWluIG9yIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgb3IKK2NvbnNlcXVlbnRpYWwgZGFtYWdlcyBpbiBjb25uZWN0aW9uIHdpdGggdGhlIGZ1cm5pc2hpbmcsCitwZXJmb3JtYW5jZSwgb3IgdXNlIG9mIHRoaXMgbWF0ZXJpYWwuCisKKyovCisKKyNpZm5kZWYgX0hQS0VZU1lNX0gKKworI2RlZmluZSBfSFBLRVlTWU0KKworI2RlZmluZSBocFhLX0NsZWFyTGluZQkJMHgxMDAwRkY2RgorI2RlZmluZSBocFhLX0luc2VydExpbmUJCTB4MTAwMEZGNzAKKyNkZWZpbmUgaHBYS19EZWxldGVMaW5lCQkweDEwMDBGRjcxCisjZGVmaW5lIGhwWEtfSW5zZXJ0Q2hhcgkJMHgxMDAwRkY3MgorI2RlZmluZSBocFhLX0RlbGV0ZUNoYXIJCTB4MTAwMEZGNzMKKyNkZWZpbmUgaHBYS19CYWNrVGFiCQkweDEwMDBGRjc0CisjZGVmaW5lIGhwWEtfS1BfQmFja1RhYgkJMHgxMDAwRkY3NQorI2RlZmluZSBocFhLX01vZGVsb2NrMQkJMHgxMDAwRkY0OAorI2RlZmluZSBocFhLX01vZGVsb2NrMgkJMHgxMDAwRkY0OQorI2RlZmluZSBocFhLX1Jlc2V0CQkweDEwMDBGRjZDCisjZGVmaW5lIGhwWEtfU3lzdGVtCQkweDEwMDBGRjZECisjZGVmaW5lIGhwWEtfVXNlcgkJMHgxMDAwRkY2RQorI2RlZmluZSBocFhLX211dGVfYWN1dGUJCTB4MTAwMDAwQTgKKyNkZWZpbmUgaHBYS19tdXRlX2dyYXZlCQkweDEwMDAwMEE5CisjZGVmaW5lIGhwWEtfbXV0ZV9hc2NpaWNpcmN1bQkweDEwMDAwMEFBCisjZGVmaW5lIGhwWEtfbXV0ZV9kaWFlcmVzaXMJMHgxMDAwMDBBQgorI2RlZmluZSBocFhLX211dGVfYXNjaWl0aWxkZQkweDEwMDAwMEFDCisjZGVmaW5lIGhwWEtfbGlyYQkJMHgxMDAwMDBBRgorI2RlZmluZSBocFhLX2d1aWxkZXIJCTB4MTAwMDAwQkUKKyNkZWZpbmUgaHBYS19ZZGlhZXJlc2lzCQkweDEwMDAwMEVFCisjZGVmaW5lIGhwWEtfSU8JCQkweDEwMDAwMEVFCisjZGVmaW5lIGhwWEtfbG9uZ21pbnVzCQkweDEwMDAwMEY2CisjZGVmaW5lIGhwWEtfYmxvY2sJCTB4MTAwMDAwRkMKKworCisjaWZuZGVmIF9PU0ZfS2V5c3ltcworI2RlZmluZSBfT1NGX0tleXN5bXMKKworI2RlZmluZSBvc2ZYS19Db3B5CQkweDEwMDRGRjAyCisjZGVmaW5lIG9zZlhLX0N1dAkJMHgxMDA0RkYwMworI2RlZmluZSBvc2ZYS19QYXN0ZQkJMHgxMDA0RkYwNAorI2RlZmluZSBvc2ZYS19CYWNrVGFiCQkweDEwMDRGRjA3CisjZGVmaW5lIG9zZlhLX0JhY2tTcGFjZQkJMHgxMDA0RkYwOAorI2RlZmluZSBvc2ZYS19DbGVhcgkJMHgxMDA0RkYwQgorI2RlZmluZSBvc2ZYS19Fc2NhcGUJCTB4MTAwNEZGMUIKKyNkZWZpbmUgb3NmWEtfQWRkTW9kZQkJMHgxMDA0RkYzMQorI2RlZmluZSBvc2ZYS19QcmltYXJ5UGFzdGUJMHgxMDA0RkYzMgorI2RlZmluZSBvc2ZYS19RdWlja1Bhc3RlCTB4MTAwNEZGMzMKKyNkZWZpbmUgb3NmWEtfUGFnZUxlZnQJCTB4MTAwNEZGNDAKKyNkZWZpbmUgb3NmWEtfUGFnZVVwCQkweDEwMDRGRjQxCisjZGVmaW5lIG9zZlhLX1BhZ2VEb3duCQkweDEwMDRGRjQyCisjZGVmaW5lIG9zZlhLX1BhZ2VSaWdodAkJMHgxMDA0RkY0MworI2RlZmluZSBvc2ZYS19BY3RpdmF0ZQkJMHgxMDA0RkY0NAorI2RlZmluZSBvc2ZYS19NZW51QmFyCQkweDEwMDRGRjQ1CisjZGVmaW5lIG9zZlhLX0xlZnQJCTB4MTAwNEZGNTEKKyNkZWZpbmUgb3NmWEtfVXAJCTB4MTAwNEZGNTIKKyNkZWZpbmUgb3NmWEtfUmlnaHQJCTB4MTAwNEZGNTMKKyNkZWZpbmUgb3NmWEtfRG93bgkJMHgxMDA0RkY1NAorI2RlZmluZSBvc2ZYS19FbmRMaW5lCQkweDEwMDRGRjU3CisjZGVmaW5lIG9zZlhLX0JlZ2luTGluZQkJMHgxMDA0RkY1OAorI2RlZmluZSBvc2ZYS19FbmREYXRhCQkweDEwMDRGRjU5CisjZGVmaW5lIG9zZlhLX0JlZ2luRGF0YQkJMHgxMDA0RkY1QQorI2RlZmluZSBvc2ZYS19QcmV2TWVudQkJMHgxMDA0RkY1QgorI2RlZmluZSBvc2ZYS19OZXh0TWVudQkJMHgxMDA0RkY1QworI2RlZmluZSBvc2ZYS19QcmV2RmllbGQJCTB4MTAwNEZGNUQKKyNkZWZpbmUgb3NmWEtfTmV4dEZpZWxkCQkweDEwMDRGRjVFCisjZGVmaW5lIG9zZlhLX1NlbGVjdAkJMHgxMDA0RkY2MAorI2RlZmluZSBvc2ZYS19JbnNlcnQJCTB4MTAwNEZGNjMKKyNkZWZpbmUgb3NmWEtfVW5kbwkJMHgxMDA0RkY2NQorI2RlZmluZSBvc2ZYS19NZW51CQkweDEwMDRGRjY3CisjZGVmaW5lIG9zZlhLX0NhbmNlbAkJMHgxMDA0RkY2OQorI2RlZmluZSBvc2ZYS19IZWxwCQkweDEwMDRGRjZBCisjZGVmaW5lIG9zZlhLX1NlbGVjdEFsbAkJMHgxMDA0RkY3MQorI2RlZmluZSBvc2ZYS19EZXNlbGVjdEFsbAkweDEwMDRGRjcyCisjZGVmaW5lIG9zZlhLX1Jlc2VsZWN0CQkweDEwMDRGRjczCisjZGVmaW5lIG9zZlhLX0V4dGVuZAkJMHgxMDA0RkY3NAorI2RlZmluZSBvc2ZYS19SZXN0b3JlCQkweDEwMDRGRjc4CisjZGVmaW5lIG9zZlhLX0RlbGV0ZQkJMHgxMDA0RkZGRgorCisjZW5kaWYgLyogX09TRl9LZXlzeW1zICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGUgdXNlIG9mIHRoZSBmb2xsb3dpbmcgbWFjcm9zIGlzIGRlcHJlY2F0ZWQuCisgKiBUaGV5IGFyZSBsaXN0ZWQgYmVsb3cgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgKi8KKyNkZWZpbmUgWEtfUmVzZXQgICAgICAgICAgICAgICAgMHgxMDAwRkY2QworI2RlZmluZSBYS19TeXN0ZW0gICAgICAgICAgICAgICAweDEwMDBGRjZECisjZGVmaW5lIFhLX1VzZXIgICAgICAgICAgICAgICAgIDB4MTAwMEZGNkUKKyNkZWZpbmUgWEtfQ2xlYXJMaW5lICAgICAgICAgICAgMHgxMDAwRkY2RgorI2RlZmluZSBYS19JbnNlcnRMaW5lICAgICAgICAgICAweDEwMDBGRjcwCisjZGVmaW5lIFhLX0RlbGV0ZUxpbmUgICAgICAgICAgIDB4MTAwMEZGNzEKKyNkZWZpbmUgWEtfSW5zZXJ0Q2hhciAgICAgICAgICAgMHgxMDAwRkY3MgorI2RlZmluZSBYS19EZWxldGVDaGFyICAgICAgICAgICAweDEwMDBGRjczCisjZGVmaW5lIFhLX0JhY2tUYWIgICAgICAgICAgICAgIDB4MTAwMEZGNzQKKyNkZWZpbmUgWEtfS1BfQmFja1RhYiAgICAgICAgICAgMHgxMDAwRkY3NQorI2RlZmluZSBYS19FeHQxNmJpdF9MICAgICAgICAgICAweDEwMDBGRjc2CisjZGVmaW5lIFhLX0V4dDE2Yml0X1IgICAgICAgICAgIDB4MTAwMEZGNzcKKyNkZWZpbmUgWEtfbXV0ZV9hY3V0ZSAgICAgICAgICAgMHgxMDAwMDBhOAorI2RlZmluZSBYS19tdXRlX2dyYXZlICAgICAgICAgICAweDEwMDAwMGE5CisjZGVmaW5lIFhLX211dGVfYXNjaWljaXJjdW0gICAgIDB4MTAwMDAwYWEKKyNkZWZpbmUgWEtfbXV0ZV9kaWFlcmVzaXMgICAgICAgMHgxMDAwMDBhYgorI2RlZmluZSBYS19tdXRlX2FzY2lpdGlsZGUgICAgICAweDEwMDAwMGFjCisjZGVmaW5lIFhLX2xpcmEgICAgICAgICAgICAgICAgIDB4MTAwMDAwYWYKKyNkZWZpbmUgWEtfZ3VpbGRlciAgICAgICAgICAgICAgMHgxMDAwMDBiZQorI2lmbmRlZiBYS19ZZGlhZXJlc2lzCisjZGVmaW5lIFhLX1lkaWFlcmVzaXMgICAgICAgICAgIDB4MTAwMDAwZWUKKyNlbmRpZgorI2RlZmluZSBYS19JTyAgICAgICAgICAgICAgICAgICAweDEwMDAwMGVlCisjZGVmaW5lIFhLX2xvbmdtaW51cyAgICAgICAgICAgIDB4MTAwMDAwZjYKKyNkZWZpbmUgWEtfYmxvY2sgICAgICAgICAgICAgICAgMHgxMDAwMDBmYworCisjZW5kaWYgLyogX0hQS0VZU1lNX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL0ltVXRpbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvSW1VdGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZkYmExYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL0ltVXRpbC5oCkBAIC0wLDAgKzEsMzAgQEAKKworI2lmbmRlZiBfWDExX0lNVVRJTF9IXworI2RlZmluZSBfWDExX0lNVVRJTF9IXworCitleHRlcm4gaW50CitfWEdldFNjYW5saW5lUGFkKAorICAgIERpc3BsYXkgKmRweSwKKyAgICBpbnQgZGVwdGgpOworCitleHRlcm4gaW50CitfWEdldEJpdHNQZXJQaXhlbCgKKyBEaXNwbGF5ICpkcHksCisgaW50IGRlcHRoKTsKKworZXh0ZXJuIGludAorX1hTZXRJbWFnZSgKKyAgICBYSW1hZ2UgKnNyY2ltZywKKyAgICByZWdpc3RlciBYSW1hZ2UgKmRzdGltZywKKyAgICByZWdpc3RlciBpbnQgeCwKKyAgICByZWdpc3RlciBpbnQgeSk7CisKK2V4dGVybiBpbnQKK19YUmV2ZXJzZV9CeXRlcygKKyAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpicHQsCisgICAgcmVnaXN0ZXIgaW50IG5iKTsKK2V4dGVybiB2b2lkCitfWEluaXRJbWFnZUZ1bmNQdHJzKAorICAgIHJlZ2lzdGVyIFhJbWFnZSAqaW1hZ2UpOworCisjZW5kaWYgLyogX1gxMV9JTVVUSUxfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1N1bmtleXN5bS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvU3Vua2V5c3ltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhkMTI4NgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1N1bmtleXN5bS5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkxLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk5MSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBGbG9hdGluZyBBY2NlbnQKKyAqLworCisjZGVmaW5lCVN1blhLX0ZBX0dyYXZlCQkweDEwMDVGRjAwCisjZGVmaW5lCVN1blhLX0ZBX0NpcmN1bQkJMHgxMDA1RkYwMQorI2RlZmluZQlTdW5YS19GQV9UaWxkZQkJMHgxMDA1RkYwMgorI2RlZmluZQlTdW5YS19GQV9BY3V0ZQkJMHgxMDA1RkYwMworI2RlZmluZQlTdW5YS19GQV9EaWFlcmVzaXMJMHgxMDA1RkYwNAorI2RlZmluZQlTdW5YS19GQV9DZWRpbGxhCTB4MTAwNUZGMDUKKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgRnVuY3Rpb25zCisgKi8KKworI2RlZmluZQlTdW5YS19GMzYJCTB4MTAwNUZGMTAJLyogTGFiZWxlZCBGMTEgKi8KKyNkZWZpbmUJU3VuWEtfRjM3CQkweDEwMDVGRjExCS8qIExhYmVsZWQgRjEyICovCisKKyNkZWZpbmUgU3VuWEtfU3lzX1JlcSAgIAkweDEwMDVGRjYwCisjZGVmaW5lIFN1blhLX1ByaW50X1NjcmVlbgkweDAwMDBGRjYxCS8qIFNhbWUgYXMgWEtfUHJpbnQgKi8KKworLyoKKyAqIEludGVybmF0aW9uYWwgJiBNdWx0aS1LZXkgQ2hhcmFjdGVyIENvbXBvc2l0aW9uCisgKi8KKworI2RlZmluZSBTdW5YS19Db21wb3NlCQkweDAwMDBGRjIwCS8qIFNhbWUgYXMgWEtfTXVsdGlfa2V5ICovCisjZGVmaW5lIFN1blhLX0FsdEdyYXBoCQkweDAwMDBGRjdFCS8qIFNhbWUgYXMgWEtfTW9kZV9zd2l0Y2ggKi8KKworLyoKKyAqIEN1cnNvciBDb250cm9sCisgKi8KKworI2RlZmluZSBTdW5YS19QYWdlVXAJCTB4MDAwMEZGNTUgCS8qIFNhbWUgYXMgWEtfUHJpb3IgKi8KKyNkZWZpbmUgU3VuWEtfUGFnZURvd24JCTB4MDAwMEZGNTYJLyogU2FtZSBhcyBYS19OZXh0ICovCisKKy8qCisgKiBPcGVuIExvb2sgRnVuY3Rpb25zCisgKi8KKworI2RlZmluZSBTdW5YS19VbmRvCQkweDAwMDBGRjY1CS8qIFNhbWUgYXMgWEtfVW5kbyAqLworI2RlZmluZSBTdW5YS19BZ2FpbgkJMHgwMDAwRkY2NgkvKiBTYW1lIGFzIFhLX1JlZG8gKi8KKyNkZWZpbmUgU3VuWEtfRmluZAkJMHgwMDAwRkY2OAkvKiBTYW1lIGFzIFhLX0ZpbmQgKi8KKyNkZWZpbmUgU3VuWEtfU3RvcAkJMHgwMDAwRkY2OQkvKiBTYW1lIGFzIFhLX0NhbmNlbCAqLworI2RlZmluZSBTdW5YS19Qcm9wcwkJMHgxMDA1RkY3MAorI2RlZmluZSBTdW5YS19Gcm9udAkJMHgxMDA1RkY3MQorI2RlZmluZSBTdW5YS19Db3B5CQkweDEwMDVGRjcyCisjZGVmaW5lIFN1blhLX09wZW4JCTB4MTAwNUZGNzMKKyNkZWZpbmUgU3VuWEtfUGFzdGUJCTB4MTAwNUZGNzQKKyNkZWZpbmUgU3VuWEtfQ3V0CQkweDEwMDVGRjc1CisKKyNkZWZpbmUgU3VuWEtfUG93ZXJTd2l0Y2gJCTB4MTAwNUZGNzYKKyNkZWZpbmUgU3VuWEtfQXVkaW9Mb3dlclZvbHVtZQkJMHgxMDA1RkY3NworI2RlZmluZSBTdW5YS19BdWRpb011dGUJCQkweDEwMDVGRjc4CisjZGVmaW5lIFN1blhLX0F1ZGlvUmFpc2VWb2x1bWUJCTB4MTAwNUZGNzkKKyNkZWZpbmUgU3VuWEtfVmlkZW9EZWdhdXNzCQkweDEwMDVGRjdBCisjZGVmaW5lIFN1blhLX1ZpZGVvTG93ZXJCcmlnaHRuZXNzCTB4MTAwNUZGN0IKKyNkZWZpbmUgU3VuWEtfVmlkZW9SYWlzZUJyaWdodG5lc3MJMHgxMDA1RkY3QworI2RlZmluZSBTdW5YS19Qb3dlclN3aXRjaFNoaWZ0CQkweDEwMDVGRjdECmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNmNjk1ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1guaApAQCAtMCwwICsxLDcxNyBAQAorLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBYIHdpbmRvdyBzeXN0ZW0gbGlrZWx5IHRvIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zICovCisKKyNpZm5kZWYgWF9ICisjZGVmaW5lIFhfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IDE5ODcsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKworQ29weXJpZ2h0IDE5ODcgYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIAorZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCAKK3Byb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKK2JvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiAKK3N1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgRGlnaXRhbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgCisKK0RJR0lUQUwgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORworQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCitESUdJVEFMIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgorQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLAorQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBYX1BST1RPQ09MCTExCQkvKiBjdXJyZW50IHByb3RvY29sIHZlcnNpb24gKi8KKyNkZWZpbmUgWF9QUk9UT0NPTF9SRVZJU0lPTiAwCQkvKiBjdXJyZW50IG1pbm9yIHZlcnNpb24gKi8KKworLyogUmVzb3VyY2VzICovCisKKy8qCisgKiBfWFNFUlZFUjY0IG11c3QgT05MWSBiZSBkZWZpbmVkIHdoZW4gY29tcGlsaW5nIFggc2VydmVyIHNvdXJjZXMgb24KKyAqIHN5c3RlbXMgd2hlcmUgdW5zaWduZWQgbG9uZyBpcyBub3QgMzIgYml0cywgbXVzdCBOT1QgYmUgdXNlZCBpbgorICogY2xpZW50IG9yIGxpYnJhcnkgY29kZS4KKyAqLworI2lmbmRlZiBfWFNFUlZFUjY0CisjICBpZm5kZWYgX1hUWVBFREVGX1hJRAorIyAgICBkZWZpbmUgX1hUWVBFREVGX1hJRAordHlwZWRlZiB1bnNpZ25lZCBsb25nIFhJRDsKKyMgIGVuZGlmCisjICBpZm5kZWYgX1hUWVBFREVGX01BU0sKKyMgICAgZGVmaW5lIF9YVFlQRURFRl9NQVNLCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgTWFzazsKKyMgIGVuZGlmCisjICBpZm5kZWYgX1hUWVBFREVGX0FUT00KKyMgICAgZGVmaW5lIF9YVFlQRURFRl9BVE9NCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgQXRvbTsJCS8qIEFsc28gaW4gWGRlZnMuaCAqLworIyAgZW5kaWYKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBWaXN1YWxJRDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBUaW1lOworI2Vsc2UKKyMgIGluY2x1ZGUgPFgxMS9YbWQuaD4KKyMgIGlmbmRlZiBfWFRZUEVERUZfWElECisjICAgIGRlZmluZSBfWFRZUEVERUZfWElECit0eXBlZGVmIENBUkQzMiBYSUQ7CisjICBlbmRpZgorIyAgaWZuZGVmIF9YVFlQRURFRl9NQVNLCisjICAgIGRlZmluZSBfWFRZUEVERUZfTUFTSwordHlwZWRlZiBDQVJEMzIgTWFzazsKKyMgIGVuZGlmCisjICBpZm5kZWYgX1hUWVBFREVGX0FUT00KKyMgICAgZGVmaW5lIF9YVFlQRURFRl9BVE9NCit0eXBlZGVmIENBUkQzMiBBdG9tOworIyAgZW5kaWYKK3R5cGVkZWYgQ0FSRDMyIFZpc3VhbElEOwordHlwZWRlZiBDQVJEMzIgVGltZTsKKyNlbmRpZgorCit0eXBlZGVmIFhJRCBXaW5kb3c7Cit0eXBlZGVmIFhJRCBEcmF3YWJsZTsKKyNpZm5kZWYgX1hUWVBFREVGX0ZPTlQKKyMgIGRlZmluZSBfWFRZUEVERUZfRk9OVAordHlwZWRlZiBYSUQgRm9udDsKKyNlbmRpZgordHlwZWRlZiBYSUQgUGl4bWFwOwordHlwZWRlZiBYSUQgQ3Vyc29yOwordHlwZWRlZiBYSUQgQ29sb3JtYXA7Cit0eXBlZGVmIFhJRCBHQ29udGV4dDsKK3R5cGVkZWYgWElEIEtleVN5bTsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEtleUNvZGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUkVTRVJWRUQgUkVTT1VSQ0UgQU5EIENPTlNUQU5UIERFRklOSVRJT05TCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTm9uZQorI2RlZmluZSBOb25lICAgICAgICAgICAgICAgICAwTAkvKiB1bml2ZXJzYWwgbnVsbCByZXNvdXJjZSBvciBudWxsIGF0b20gKi8KKyNlbmRpZgorCisjZGVmaW5lIFBhcmVudFJlbGF0aXZlICAgICAgIDFMCS8qIGJhY2tncm91bmQgcGl4bWFwIGluIENyZWF0ZVdpbmRvdworCQkJCSAgICBhbmQgQ2hhbmdlV2luZG93QXR0cmlidXRlcyAqLworCisjZGVmaW5lIENvcHlGcm9tUGFyZW50ICAgICAgIDBMCS8qIGJvcmRlciBwaXhtYXAgaW4gQ3JlYXRlV2luZG93CisJCQkJICAgICAgIGFuZCBDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzCisJCQkJICAgc3BlY2lhbCBWaXN1YWxJRCBhbmQgc3BlY2lhbCB3aW5kb3cKKwkJCQkgICAgICAgY2xhc3MgcGFzc2VkIHRvIENyZWF0ZVdpbmRvdyAqLworCisjZGVmaW5lIFBvaW50ZXJXaW5kb3cgICAgICAgIDBMCS8qIGRlc3RpbmF0aW9uIHdpbmRvdyBpbiBTZW5kRXZlbnQgKi8KKyNkZWZpbmUgSW5wdXRGb2N1cyAgICAgICAgICAgMUwJLyogZGVzdGluYXRpb24gd2luZG93IGluIFNlbmRFdmVudCAqLworCisjZGVmaW5lIFBvaW50ZXJSb290ICAgICAgICAgIDFMCS8qIGZvY3VzIHdpbmRvdyBpbiBTZXRJbnB1dEZvY3VzICovCisKKyNkZWZpbmUgQW55UHJvcGVydHlUeXBlICAgICAgMEwJLyogc3BlY2lhbCBBdG9tLCBwYXNzZWQgdG8gR2V0UHJvcGVydHkgKi8KKworI2RlZmluZSBBbnlLZXkJCSAgICAgMEwJLyogc3BlY2lhbCBLZXkgQ29kZSwgcGFzc2VkIHRvIEdyYWJLZXkgKi8KKworI2RlZmluZSBBbnlCdXR0b24gICAgICAgICAgICAwTAkvKiBzcGVjaWFsIEJ1dHRvbiBDb2RlLCBwYXNzZWQgdG8gR3JhYkJ1dHRvbiAqLworCisjZGVmaW5lIEFsbFRlbXBvcmFyeSAgICAgICAgIDBMCS8qIHNwZWNpYWwgUmVzb3VyY2UgSUQgcGFzc2VkIHRvIEtpbGxDbGllbnQgKi8KKworI2RlZmluZSBDdXJyZW50VGltZSAgICAgICAgICAwTAkvKiBzcGVjaWFsIFRpbWUgKi8KKworI2RlZmluZSBOb1N5bWJvbAkgICAgIDBMCS8qIHNwZWNpYWwgS2V5U3ltICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIEVWRU5UIERFRklOSVRJT05TIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbnB1dCBFdmVudCBNYXNrcy4gVXNlZCBhcyBldmVudC1tYXNrIHdpbmRvdyBhdHRyaWJ1dGUgYW5kIGFzIGFyZ3VtZW50cworICAgdG8gR3JhYiByZXF1ZXN0cy4gIE5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGV2ZW50IG5hbWVzLiAgKi8KKworI2RlZmluZSBOb0V2ZW50TWFzawkJCTBMCisjZGVmaW5lIEtleVByZXNzTWFzawkJCSgxTDw8MCkgIAorI2RlZmluZSBLZXlSZWxlYXNlTWFzawkJCSgxTDw8MSkgIAorI2RlZmluZSBCdXR0b25QcmVzc01hc2sJCQkoMUw8PDIpICAKKyNkZWZpbmUgQnV0dG9uUmVsZWFzZU1hc2sJCSgxTDw8MykgIAorI2RlZmluZSBFbnRlcldpbmRvd01hc2sJCQkoMUw8PDQpICAKKyNkZWZpbmUgTGVhdmVXaW5kb3dNYXNrCQkJKDFMPDw1KSAgCisjZGVmaW5lIFBvaW50ZXJNb3Rpb25NYXNrCQkoMUw8PDYpICAKKyNkZWZpbmUgUG9pbnRlck1vdGlvbkhpbnRNYXNrCQkoMUw8PDcpICAKKyNkZWZpbmUgQnV0dG9uMU1vdGlvbk1hc2sJCSgxTDw8OCkgIAorI2RlZmluZSBCdXR0b24yTW90aW9uTWFzawkJKDFMPDw5KSAgCisjZGVmaW5lIEJ1dHRvbjNNb3Rpb25NYXNrCQkoMUw8PDEwKSAKKyNkZWZpbmUgQnV0dG9uNE1vdGlvbk1hc2sJCSgxTDw8MTEpIAorI2RlZmluZSBCdXR0b241TW90aW9uTWFzawkJKDFMPDwxMikgCisjZGVmaW5lIEJ1dHRvbk1vdGlvbk1hc2sJCSgxTDw8MTMpIAorI2RlZmluZSBLZXltYXBTdGF0ZU1hc2sJCQkoMUw8PDE0KQorI2RlZmluZSBFeHBvc3VyZU1hc2sJCQkoMUw8PDE1KSAKKyNkZWZpbmUgVmlzaWJpbGl0eUNoYW5nZU1hc2sJCSgxTDw8MTYpIAorI2RlZmluZSBTdHJ1Y3R1cmVOb3RpZnlNYXNrCQkoMUw8PDE3KSAKKyNkZWZpbmUgUmVzaXplUmVkaXJlY3RNYXNrCQkoMUw8PDE4KSAKKyNkZWZpbmUgU3Vic3RydWN0dXJlTm90aWZ5TWFzawkJKDFMPDwxOSkgCisjZGVmaW5lIFN1YnN0cnVjdHVyZVJlZGlyZWN0TWFzawkoMUw8PDIwKSAKKyNkZWZpbmUgRm9jdXNDaGFuZ2VNYXNrCQkJKDFMPDwyMSkgCisjZGVmaW5lIFByb3BlcnR5Q2hhbmdlTWFzawkJKDFMPDwyMikgCisjZGVmaW5lIENvbG9ybWFwQ2hhbmdlTWFzawkJKDFMPDwyMykgCisjZGVmaW5lIE93bmVyR3JhYkJ1dHRvbk1hc2sJCSgxTDw8MjQpIAorCisvKiBFdmVudCBuYW1lcy4gIFVzZWQgaW4gInR5cGUiIGZpZWxkIGluIFhFdmVudCBzdHJ1Y3R1cmVzLiAgTm90IHRvIGJlCitjb25mdXNlZCB3aXRoIGV2ZW50IG1hc2tzIGFib3ZlLiAgVGhleSBzdGFydCBmcm9tIDIgYmVjYXVzZSAwIGFuZCAxCithcmUgcmVzZXJ2ZWQgaW4gdGhlIHByb3RvY29sIGZvciBlcnJvcnMgYW5kIHJlcGxpZXMuICovCisKKyNkZWZpbmUgS2V5UHJlc3MJCTIKKyNkZWZpbmUgS2V5UmVsZWFzZQkJMworI2RlZmluZSBCdXR0b25QcmVzcwkJNAorI2RlZmluZSBCdXR0b25SZWxlYXNlCQk1CisjZGVmaW5lIE1vdGlvbk5vdGlmeQkJNgorI2RlZmluZSBFbnRlck5vdGlmeQkJNworI2RlZmluZSBMZWF2ZU5vdGlmeQkJOAorI2RlZmluZSBGb2N1c0luCQkJOQorI2RlZmluZSBGb2N1c091dAkJMTAKKyNkZWZpbmUgS2V5bWFwTm90aWZ5CQkxMQorI2RlZmluZSBFeHBvc2UJCQkxMgorI2RlZmluZSBHcmFwaGljc0V4cG9zZQkJMTMKKyNkZWZpbmUgTm9FeHBvc2UJCTE0CisjZGVmaW5lIFZpc2liaWxpdHlOb3RpZnkJMTUKKyNkZWZpbmUgQ3JlYXRlTm90aWZ5CQkxNgorI2RlZmluZSBEZXN0cm95Tm90aWZ5CQkxNworI2RlZmluZSBVbm1hcE5vdGlmeQkJMTgKKyNkZWZpbmUgTWFwTm90aWZ5CQkxOQorI2RlZmluZSBNYXBSZXF1ZXN0CQkyMAorI2RlZmluZSBSZXBhcmVudE5vdGlmeQkJMjEKKyNkZWZpbmUgQ29uZmlndXJlTm90aWZ5CQkyMgorI2RlZmluZSBDb25maWd1cmVSZXF1ZXN0CTIzCisjZGVmaW5lIEdyYXZpdHlOb3RpZnkJCTI0CisjZGVmaW5lIFJlc2l6ZVJlcXVlc3QJCTI1CisjZGVmaW5lIENpcmN1bGF0ZU5vdGlmeQkJMjYKKyNkZWZpbmUgQ2lyY3VsYXRlUmVxdWVzdAkyNworI2RlZmluZSBQcm9wZXJ0eU5vdGlmeQkJMjgKKyNkZWZpbmUgU2VsZWN0aW9uQ2xlYXIJCTI5CisjZGVmaW5lIFNlbGVjdGlvblJlcXVlc3QJMzAKKyNkZWZpbmUgU2VsZWN0aW9uTm90aWZ5CQkzMQorI2RlZmluZSBDb2xvcm1hcE5vdGlmeQkJMzIKKyNkZWZpbmUgQ2xpZW50TWVzc2FnZQkJMzMKKyNkZWZpbmUgTWFwcGluZ05vdGlmeQkJMzQKKyNkZWZpbmUgR2VuZXJpY0V2ZW50CQkzNQorI2RlZmluZSBMQVNURXZlbnQJCTM2CS8qIG11c3QgYmUgYmlnZ2VyIHRoYW4gYW55IGV2ZW50ICMgKi8KKworCisvKiBLZXkgbWFza3MuIFVzZWQgYXMgbW9kaWZpZXJzIHRvIEdyYWJCdXR0b24gYW5kIEdyYWJLZXksIHJlc3VsdHMgb2YgUXVlcnlQb2ludGVyLAorICAgc3RhdGUgaW4gdmFyaW91cyBrZXktLCBtb3VzZS0sIGFuZCBidXR0b24tcmVsYXRlZCBldmVudHMuICovCisKKyNkZWZpbmUgU2hpZnRNYXNrCQkoMTw8MCkKKyNkZWZpbmUgTG9ja01hc2sJCSgxPDwxKQorI2RlZmluZSBDb250cm9sTWFzawkJKDE8PDIpCisjZGVmaW5lIE1vZDFNYXNrCQkoMTw8MykKKyNkZWZpbmUgTW9kMk1hc2sJCSgxPDw0KQorI2RlZmluZSBNb2QzTWFzawkJKDE8PDUpCisjZGVmaW5lIE1vZDRNYXNrCQkoMTw8NikKKyNkZWZpbmUgTW9kNU1hc2sJCSgxPDw3KQorCisvKiBtb2RpZmllciBuYW1lcy4gIFVzZWQgdG8gYnVpbGQgYSBTZXRNb2RpZmllck1hcHBpbmcgcmVxdWVzdCBvcgorICAgdG8gcmVhZCBhIEdldE1vZGlmaWVyTWFwcGluZyByZXF1ZXN0LiAgVGhlc2UgY29ycmVzcG9uZCB0byB0aGUKKyAgIG1hc2tzIGRlZmluZWQgYWJvdmUuICovCisjZGVmaW5lIFNoaWZ0TWFwSW5kZXgJCTAKKyNkZWZpbmUgTG9ja01hcEluZGV4CQkxCisjZGVmaW5lIENvbnRyb2xNYXBJbmRleAkJMgorI2RlZmluZSBNb2QxTWFwSW5kZXgJCTMKKyNkZWZpbmUgTW9kMk1hcEluZGV4CQk0CisjZGVmaW5lIE1vZDNNYXBJbmRleAkJNQorI2RlZmluZSBNb2Q0TWFwSW5kZXgJCTYKKyNkZWZpbmUgTW9kNU1hcEluZGV4CQk3CisKKworLyogYnV0dG9uIG1hc2tzLiAgVXNlZCBpbiBzYW1lIG1hbm5lciBhcyBLZXkgbWFza3MgYWJvdmUuIE5vdCB0byBiZSBjb25mdXNlZAorICAgd2l0aCBidXR0b24gbmFtZXMgYmVsb3cuICovCisKKyNkZWZpbmUgQnV0dG9uMU1hc2sJCSgxPDw4KQorI2RlZmluZSBCdXR0b24yTWFzawkJKDE8PDkpCisjZGVmaW5lIEJ1dHRvbjNNYXNrCQkoMTw8MTApCisjZGVmaW5lIEJ1dHRvbjRNYXNrCQkoMTw8MTEpCisjZGVmaW5lIEJ1dHRvbjVNYXNrCQkoMTw8MTIpCisKKyNkZWZpbmUgQW55TW9kaWZpZXIJCSgxPDwxNSkgIC8qIHVzZWQgaW4gR3JhYkJ1dHRvbiwgR3JhYktleSAqLworCisKKy8qIGJ1dHRvbiBuYW1lcy4gVXNlZCBhcyBhcmd1bWVudHMgdG8gR3JhYkJ1dHRvbiBhbmQgYXMgZGV0YWlsIGluIEJ1dHRvblByZXNzCisgICBhbmQgQnV0dG9uUmVsZWFzZSBldmVudHMuICBOb3QgdG8gYmUgY29uZnVzZWQgd2l0aCBidXR0b24gbWFza3MgYWJvdmUuCisgICBOb3RlIHRoYXQgMCBpcyBhbHJlYWR5IGRlZmluZWQgYWJvdmUgYXMgIkFueUJ1dHRvbiIuICAqLworCisjZGVmaW5lIEJ1dHRvbjEJCQkxCisjZGVmaW5lIEJ1dHRvbjIJCQkyCisjZGVmaW5lIEJ1dHRvbjMJCQkzCisjZGVmaW5lIEJ1dHRvbjQJCQk0CisjZGVmaW5lIEJ1dHRvbjUJCQk1CisKKy8qIE5vdGlmeSBtb2RlcyAqLworCisjZGVmaW5lIE5vdGlmeU5vcm1hbAkJMAorI2RlZmluZSBOb3RpZnlHcmFiCQkxCisjZGVmaW5lIE5vdGlmeVVuZ3JhYgkJMgorI2RlZmluZSBOb3RpZnlXaGlsZUdyYWJiZWQJMworCisjZGVmaW5lIE5vdGlmeUhpbnQJCTEJLyogZm9yIE1vdGlvbk5vdGlmeSBldmVudHMgKi8KKwkJICAgICAgIAorLyogTm90aWZ5IGRldGFpbCAqLworCisjZGVmaW5lIE5vdGlmeUFuY2VzdG9yCQkwCisjZGVmaW5lIE5vdGlmeVZpcnR1YWwJCTEKKyNkZWZpbmUgTm90aWZ5SW5mZXJpb3IJCTIKKyNkZWZpbmUgTm90aWZ5Tm9ubGluZWFyCQkzCisjZGVmaW5lIE5vdGlmeU5vbmxpbmVhclZpcnR1YWwJNAorI2RlZmluZSBOb3RpZnlQb2ludGVyCQk1CisjZGVmaW5lIE5vdGlmeVBvaW50ZXJSb290CTYKKyNkZWZpbmUgTm90aWZ5RGV0YWlsTm9uZQk3CisKKy8qIFZpc2liaWxpdHkgbm90aWZ5ICovCisKKyNkZWZpbmUgVmlzaWJpbGl0eVVub2JzY3VyZWQJCTAKKyNkZWZpbmUgVmlzaWJpbGl0eVBhcnRpYWxseU9ic2N1cmVkCTEKKyNkZWZpbmUgVmlzaWJpbGl0eUZ1bGx5T2JzY3VyZWQJCTIKKworLyogQ2lyY3VsYXRpb24gcmVxdWVzdCAqLworCisjZGVmaW5lIFBsYWNlT25Ub3AJCTAKKyNkZWZpbmUgUGxhY2VPbkJvdHRvbQkJMQorCisvKiBwcm90b2NvbCBmYW1pbGllcyAqLworCisjZGVmaW5lIEZhbWlseUludGVybmV0CQkwCS8qIElQdjQgKi8KKyNkZWZpbmUgRmFtaWx5REVDbmV0CQkxCisjZGVmaW5lIEZhbWlseUNoYW9zCQkyCisjZGVmaW5lIEZhbWlseUludGVybmV0NgkJNgkvKiBJUHY2ICovCisKKy8qIGF1dGhlbnRpY2F0aW9uIGZhbWlsaWVzIG5vdCB0aWVkIHRvIGEgc3BlY2lmaWMgcHJvdG9jb2wgKi8KKyNkZWZpbmUgRmFtaWx5U2VydmVySW50ZXJwcmV0ZWQgNQorCisvKiBQcm9wZXJ0eSBub3RpZmljYXRpb24gKi8KKworI2RlZmluZSBQcm9wZXJ0eU5ld1ZhbHVlCTAKKyNkZWZpbmUgUHJvcGVydHlEZWxldGUJCTEKKworLyogQ29sb3IgTWFwIG5vdGlmaWNhdGlvbiAqLworCisjZGVmaW5lIENvbG9ybWFwVW5pbnN0YWxsZWQJMAorI2RlZmluZSBDb2xvcm1hcEluc3RhbGxlZAkxCisKKy8qIEdyYWJQb2ludGVyLCBHcmFiQnV0dG9uLCBHcmFiS2V5Ym9hcmQsIEdyYWJLZXkgTW9kZXMgKi8KKworI2RlZmluZSBHcmFiTW9kZVN5bmMJCTAKKyNkZWZpbmUgR3JhYk1vZGVBc3luYwkJMQorCisvKiBHcmFiUG9pbnRlciwgR3JhYktleWJvYXJkIHJlcGx5IHN0YXR1cyAqLworCisjZGVmaW5lIEdyYWJTdWNjZXNzCQkwCisjZGVmaW5lIEFscmVhZHlHcmFiYmVkCQkxCisjZGVmaW5lIEdyYWJJbnZhbGlkVGltZQkJMgorI2RlZmluZSBHcmFiTm90Vmlld2FibGUJCTMKKyNkZWZpbmUgR3JhYkZyb3plbgkJNAorCisvKiBBbGxvd0V2ZW50cyBtb2RlcyAqLworCisjZGVmaW5lIEFzeW5jUG9pbnRlcgkJMAorI2RlZmluZSBTeW5jUG9pbnRlcgkJMQorI2RlZmluZSBSZXBsYXlQb2ludGVyCQkyCisjZGVmaW5lIEFzeW5jS2V5Ym9hcmQJCTMKKyNkZWZpbmUgU3luY0tleWJvYXJkCQk0CisjZGVmaW5lIFJlcGxheUtleWJvYXJkCQk1CisjZGVmaW5lIEFzeW5jQm90aAkJNgorI2RlZmluZSBTeW5jQm90aAkJNworCisvKiBVc2VkIGluIFNldElucHV0Rm9jdXMsIEdldElucHV0Rm9jdXMgKi8KKworI2RlZmluZSBSZXZlcnRUb05vbmUJCShpbnQpTm9uZQorI2RlZmluZSBSZXZlcnRUb1BvaW50ZXJSb290CShpbnQpUG9pbnRlclJvb3QKKyNkZWZpbmUgUmV2ZXJ0VG9QYXJlbnQJCTIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFUlJPUiBDT0RFUyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTdWNjZXNzCQkgICAwCS8qIGV2ZXJ5dGhpbmcncyBva2F5ICovCisjZGVmaW5lIEJhZFJlcXVlc3QJICAgMQkvKiBiYWQgcmVxdWVzdCBjb2RlICovCisjZGVmaW5lIEJhZFZhbHVlCSAgIDIJLyogaW50IHBhcmFtZXRlciBvdXQgb2YgcmFuZ2UgKi8KKyNkZWZpbmUgQmFkV2luZG93CSAgIDMJLyogcGFyYW1ldGVyIG5vdCBhIFdpbmRvdyAqLworI2RlZmluZSBCYWRQaXhtYXAJICAgNAkvKiBwYXJhbWV0ZXIgbm90IGEgUGl4bWFwICovCisjZGVmaW5lIEJhZEF0b20JCSAgIDUJLyogcGFyYW1ldGVyIG5vdCBhbiBBdG9tICovCisjZGVmaW5lIEJhZEN1cnNvcgkgICA2CS8qIHBhcmFtZXRlciBub3QgYSBDdXJzb3IgKi8KKyNkZWZpbmUgQmFkRm9udAkJICAgNwkvKiBwYXJhbWV0ZXIgbm90IGEgRm9udCAqLworI2RlZmluZSBCYWRNYXRjaAkgICA4CS8qIHBhcmFtZXRlciBtaXNtYXRjaCAqLworI2RlZmluZSBCYWREcmF3YWJsZQkgICA5CS8qIHBhcmFtZXRlciBub3QgYSBQaXhtYXAgb3IgV2luZG93ICovCisjZGVmaW5lIEJhZEFjY2VzcwkgIDEwCS8qIGRlcGVuZGluZyBvbiBjb250ZXh0OgorCQkJCSAtIGtleS9idXR0b24gYWxyZWFkeSBncmFiYmVkCisJCQkJIC0gYXR0ZW1wdCB0byBmcmVlIGFuIGlsbGVnYWwgCisJCQkJICAgY21hcCBlbnRyeSAKKwkJCQktIGF0dGVtcHQgdG8gc3RvcmUgaW50byBhIHJlYWQtb25seSAKKwkJCQkgICBjb2xvciBtYXAgZW50cnkuCisgCQkJCS0gYXR0ZW1wdCB0byBtb2RpZnkgdGhlIGFjY2VzcyBjb250cm9sCisJCQkJICAgbGlzdCBmcm9tIG90aGVyIHRoYW4gdGhlIGxvY2FsIGhvc3QuCisJCQkJKi8KKyNkZWZpbmUgQmFkQWxsb2MJICAxMQkvKiBpbnN1ZmZpY2llbnQgcmVzb3VyY2VzICovCisjZGVmaW5lIEJhZENvbG9yCSAgMTIJLyogbm8gc3VjaCBjb2xvcm1hcCAqLworI2RlZmluZSBCYWRHQwkJICAxMwkvKiBwYXJhbWV0ZXIgbm90IGEgR0MgKi8KKyNkZWZpbmUgQmFkSURDaG9pY2UJICAxNAkvKiBjaG9pY2Ugbm90IGluIHJhbmdlIG9yIGFscmVhZHkgdXNlZCAqLworI2RlZmluZSBCYWROYW1lCQkgIDE1CS8qIGZvbnQgb3IgY29sb3IgbmFtZSBkb2Vzbid0IGV4aXN0ICovCisjZGVmaW5lIEJhZExlbmd0aAkgIDE2CS8qIFJlcXVlc3QgbGVuZ3RoIGluY29ycmVjdCAqLworI2RlZmluZSBCYWRJbXBsZW1lbnRhdGlvbiAxNwkvKiBzZXJ2ZXIgaXMgZGVmZWN0aXZlICovCisKKyNkZWZpbmUgRmlyc3RFeHRlbnNpb25FcnJvcgkxMjgKKyNkZWZpbmUgTGFzdEV4dGVuc2lvbkVycm9yCTI1NQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFdJTkRPVyBERUZJTklUSU9OUyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogV2luZG93IGNsYXNzZXMgdXNlZCBieSBDcmVhdGVXaW5kb3cgKi8KKy8qIE5vdGUgdGhhdCBDb3B5RnJvbVBhcmVudCBpcyBhbHJlYWR5IGRlZmluZWQgYXMgMCBhYm92ZSAqLworCisjZGVmaW5lIElucHV0T3V0cHV0CQkxCisjZGVmaW5lIElucHV0T25seQkJMgorCisvKiBXaW5kb3cgYXR0cmlidXRlcyBmb3IgQ3JlYXRlV2luZG93IGFuZCBDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzICovCisKKyNkZWZpbmUgQ1dCYWNrUGl4bWFwCQkoMUw8PDApCisjZGVmaW5lIENXQmFja1BpeGVsCQkoMUw8PDEpCisjZGVmaW5lIENXQm9yZGVyUGl4bWFwCQkoMUw8PDIpCisjZGVmaW5lIENXQm9yZGVyUGl4ZWwgICAgICAgICAgICgxTDw8MykKKyNkZWZpbmUgQ1dCaXRHcmF2aXR5CQkoMUw8PDQpCisjZGVmaW5lIENXV2luR3Jhdml0eQkJKDFMPDw1KQorI2RlZmluZSBDV0JhY2tpbmdTdG9yZSAgICAgICAgICAoMUw8PDYpCisjZGVmaW5lIENXQmFja2luZ1BsYW5lcwkgICAgICAgICgxTDw8NykKKyNkZWZpbmUgQ1dCYWNraW5nUGl4ZWwJICAgICAgICAoMUw8PDgpCisjZGVmaW5lIENXT3ZlcnJpZGVSZWRpcmVjdAkoMUw8PDkpCisjZGVmaW5lIENXU2F2ZVVuZGVyCQkoMUw8PDEwKQorI2RlZmluZSBDV0V2ZW50TWFzawkJKDFMPDwxMSkKKyNkZWZpbmUgQ1dEb250UHJvcGFnYXRlCSAgICAgICAgKDFMPDwxMikKKyNkZWZpbmUgQ1dDb2xvcm1hcAkJKDFMPDwxMykKKyNkZWZpbmUgQ1dDdXJzb3IJICAgICAgICAoMUw8PDE0KQorCisvKiBDb25maWd1cmVXaW5kb3cgc3RydWN0dXJlICovCisKKyNkZWZpbmUgQ1dYCQkJKDE8PDApCisjZGVmaW5lIENXWQkJCSgxPDwxKQorI2RlZmluZSBDV1dpZHRoCQkJKDE8PDIpCisjZGVmaW5lIENXSGVpZ2h0CQkoMTw8MykKKyNkZWZpbmUgQ1dCb3JkZXJXaWR0aAkJKDE8PDQpCisjZGVmaW5lIENXU2libGluZwkJKDE8PDUpCisjZGVmaW5lIENXU3RhY2tNb2RlCQkoMTw8NikKKworCisvKiBCaXQgR3Jhdml0eSAqLworCisjZGVmaW5lIEZvcmdldEdyYXZpdHkJCTAKKyNkZWZpbmUgTm9ydGhXZXN0R3Jhdml0eQkxCisjZGVmaW5lIE5vcnRoR3Jhdml0eQkJMgorI2RlZmluZSBOb3J0aEVhc3RHcmF2aXR5CTMKKyNkZWZpbmUgV2VzdEdyYXZpdHkJCTQKKyNkZWZpbmUgQ2VudGVyR3Jhdml0eQkJNQorI2RlZmluZSBFYXN0R3Jhdml0eQkJNgorI2RlZmluZSBTb3V0aFdlc3RHcmF2aXR5CTcKKyNkZWZpbmUgU291dGhHcmF2aXR5CQk4CisjZGVmaW5lIFNvdXRoRWFzdEdyYXZpdHkJOQorI2RlZmluZSBTdGF0aWNHcmF2aXR5CQkxMAorCisvKiBXaW5kb3cgZ3Jhdml0eSArIGJpdCBncmF2aXR5IGFib3ZlICovCisKKyNkZWZpbmUgVW5tYXBHcmF2aXR5CQkwCisKKy8qIFVzZWQgaW4gQ3JlYXRlV2luZG93IGZvciBiYWNraW5nLXN0b3JlIGhpbnQgKi8KKworI2RlZmluZSBOb3RVc2VmdWwgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdoZW5NYXBwZWQgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQWx3YXlzICAgICAgICAgICAgICAgICAgMgorCisvKiBVc2VkIGluIEdldFdpbmRvd0F0dHJpYnV0ZXMgcmVwbHkgKi8KKworI2RlZmluZSBJc1VubWFwcGVkCQkwCisjZGVmaW5lIElzVW52aWV3YWJsZQkJMQorI2RlZmluZSBJc1ZpZXdhYmxlCQkyCisKKy8qIFVzZWQgaW4gQ2hhbmdlU2F2ZVNldCAqLworCisjZGVmaW5lIFNldE1vZGVJbnNlcnQgICAgICAgICAgIDAKKyNkZWZpbmUgU2V0TW9kZURlbGV0ZSAgICAgICAgICAgMQorCisvKiBVc2VkIGluIENoYW5nZUNsb3NlRG93bk1vZGUgKi8KKworI2RlZmluZSBEZXN0cm95QWxsICAgICAgICAgICAgICAwCisjZGVmaW5lIFJldGFpblBlcm1hbmVudCAgICAgICAgIDEKKyNkZWZpbmUgUmV0YWluVGVtcG9yYXJ5ICAgICAgICAgMgorCisvKiBXaW5kb3cgc3RhY2tpbmcgbWV0aG9kIChpbiBjb25maWd1cmVXaW5kb3cpICovCisKKyNkZWZpbmUgQWJvdmUgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBCZWxvdyAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFRvcElmICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQm90dG9tSWYgICAgICAgICAgICAgICAgMworI2RlZmluZSBPcHBvc2l0ZSAgICAgICAgICAgICAgICA0CisKKy8qIENpcmN1bGF0aW9uIGRpcmVjdGlvbiAqLworCisjZGVmaW5lIFJhaXNlTG93ZXN0ICAgICAgICAgICAgIDAKKyNkZWZpbmUgTG93ZXJIaWdoZXN0ICAgICAgICAgICAgMQorCisvKiBQcm9wZXJ0eSBtb2RlcyAqLworCisjZGVmaW5lIFByb3BNb2RlUmVwbGFjZSAgICAgICAgIDAKKyNkZWZpbmUgUHJvcE1vZGVQcmVwZW5kICAgICAgICAgMQorI2RlZmluZSBQcm9wTW9kZUFwcGVuZCAgICAgICAgICAyCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR1JBUEhJQ1MgREVGSU5JVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZ3JhcGhpY3MgZnVuY3Rpb25zLCBhcyBpbiBHQy5hbHUgKi8KKworI2RlZmluZQlHWGNsZWFyCQkJMHgwCQkvKiAwICovCisjZGVmaW5lIEdYYW5kCQkJMHgxCQkvKiBzcmMgQU5EIGRzdCAqLworI2RlZmluZSBHWGFuZFJldmVyc2UJCTB4MgkJLyogc3JjIEFORCBOT1QgZHN0ICovCisjZGVmaW5lIEdYY29weQkJCTB4MwkJLyogc3JjICovCisjZGVmaW5lIEdYYW5kSW52ZXJ0ZWQJCTB4NAkJLyogTk9UIHNyYyBBTkQgZHN0ICovCisjZGVmaW5lCUdYbm9vcAkJCTB4NQkJLyogZHN0ICovCisjZGVmaW5lIEdYeG9yCQkJMHg2CQkvKiBzcmMgWE9SIGRzdCAqLworI2RlZmluZSBHWG9yCQkJMHg3CQkvKiBzcmMgT1IgZHN0ICovCisjZGVmaW5lIEdYbm9yCQkJMHg4CQkvKiBOT1Qgc3JjIEFORCBOT1QgZHN0ICovCisjZGVmaW5lIEdYZXF1aXYJCQkweDkJCS8qIE5PVCBzcmMgWE9SIGRzdCAqLworI2RlZmluZSBHWGludmVydAkJMHhhCQkvKiBOT1QgZHN0ICovCisjZGVmaW5lIEdYb3JSZXZlcnNlCQkweGIJCS8qIHNyYyBPUiBOT1QgZHN0ICovCisjZGVmaW5lIEdYY29weUludmVydGVkCQkweGMJCS8qIE5PVCBzcmMgKi8KKyNkZWZpbmUgR1hvckludmVydGVkCQkweGQJCS8qIE5PVCBzcmMgT1IgZHN0ICovCisjZGVmaW5lIEdYbmFuZAkJCTB4ZQkJLyogTk9UIHNyYyBPUiBOT1QgZHN0ICovCisjZGVmaW5lIEdYc2V0CQkJMHhmCQkvKiAxICovCisKKy8qIExpbmVTdHlsZSAqLworCisjZGVmaW5lIExpbmVTb2xpZAkJMAorI2RlZmluZSBMaW5lT25PZmZEYXNoCQkxCisjZGVmaW5lIExpbmVEb3VibGVEYXNoCQkyCisKKy8qIGNhcFN0eWxlICovCisKKyNkZWZpbmUgQ2FwTm90TGFzdAkJMAorI2RlZmluZSBDYXBCdXR0CQkJMQorI2RlZmluZSBDYXBSb3VuZAkJMgorI2RlZmluZSBDYXBQcm9qZWN0aW5nCQkzCisKKy8qIGpvaW5TdHlsZSAqLworCisjZGVmaW5lIEpvaW5NaXRlcgkJMAorI2RlZmluZSBKb2luUm91bmQJCTEKKyNkZWZpbmUgSm9pbkJldmVsCQkyCisKKy8qIGZpbGxTdHlsZSAqLworCisjZGVmaW5lIEZpbGxTb2xpZAkJMAorI2RlZmluZSBGaWxsVGlsZWQJCTEKKyNkZWZpbmUgRmlsbFN0aXBwbGVkCQkyCisjZGVmaW5lIEZpbGxPcGFxdWVTdGlwcGxlZAkzCisKKy8qIGZpbGxSdWxlICovCisKKyNkZWZpbmUgRXZlbk9kZFJ1bGUJCTAKKyNkZWZpbmUgV2luZGluZ1J1bGUJCTEKKworLyogc3Vid2luZG93IG1vZGUgKi8KKworI2RlZmluZSBDbGlwQnlDaGlsZHJlbgkJMAorI2RlZmluZSBJbmNsdWRlSW5mZXJpb3JzCTEKKworLyogU2V0Q2xpcFJlY3RhbmdsZXMgb3JkZXJpbmcgKi8KKworI2RlZmluZSBVbnNvcnRlZAkJMAorI2RlZmluZSBZU29ydGVkCQkJMQorI2RlZmluZSBZWFNvcnRlZAkJMgorI2RlZmluZSBZWEJhbmRlZAkJMworCisvKiBDb29yZGluYXRlTW9kZSBmb3IgZHJhd2luZyByb3V0aW5lcyAqLworCisjZGVmaW5lIENvb3JkTW9kZU9yaWdpbgkJMAkvKiByZWxhdGl2ZSB0byB0aGUgb3JpZ2luICovCisjZGVmaW5lIENvb3JkTW9kZVByZXZpb3VzICAgICAgIDEJLyogcmVsYXRpdmUgdG8gcHJldmlvdXMgcG9pbnQgKi8KKworLyogUG9seWdvbiBzaGFwZXMgKi8KKworI2RlZmluZSBDb21wbGV4CQkJMAkvKiBwYXRocyBtYXkgaW50ZXJzZWN0ICovCisjZGVmaW5lIE5vbmNvbnZleAkJMQkvKiBubyBwYXRocyBpbnRlcnNlY3QsIGJ1dCBub3QgY29udmV4ICovCisjZGVmaW5lIENvbnZleAkJCTIJLyogd2hvbGx5IGNvbnZleCAqLworCisvKiBBcmMgbW9kZXMgZm9yIFBvbHlGaWxsQXJjICovCisKKyNkZWZpbmUgQXJjQ2hvcmQJCTAJLyogam9pbiBlbmRwb2ludHMgb2YgYXJjICovCisjZGVmaW5lIEFyY1BpZVNsaWNlCQkxCS8qIGpvaW4gZW5kcG9pbnRzIHRvIGNlbnRlciBvZiBhcmMgKi8KKworLyogR0MgY29tcG9uZW50czogbWFza3MgdXNlZCBpbiBDcmVhdGVHQywgQ29weUdDLCBDaGFuZ2VHQywgT1InZWQgaW50bworICAgR0Muc3RhdGVDaGFuZ2VzICovCisKKyNkZWZpbmUgR0NGdW5jdGlvbiAgICAgICAgICAgICAgKDFMPDwwKQorI2RlZmluZSBHQ1BsYW5lTWFzayAgICAgICAgICAgICAoMUw8PDEpCisjZGVmaW5lIEdDRm9yZWdyb3VuZCAgICAgICAgICAgICgxTDw8MikKKyNkZWZpbmUgR0NCYWNrZ3JvdW5kICAgICAgICAgICAgKDFMPDwzKQorI2RlZmluZSBHQ0xpbmVXaWR0aCAgICAgICAgICAgICAoMUw8PDQpCisjZGVmaW5lIEdDTGluZVN0eWxlICAgICAgICAgICAgICgxTDw8NSkKKyNkZWZpbmUgR0NDYXBTdHlsZSAgICAgICAgICAgICAgKDFMPDw2KQorI2RlZmluZSBHQ0pvaW5TdHlsZQkJKDFMPDw3KQorI2RlZmluZSBHQ0ZpbGxTdHlsZQkJKDFMPDw4KQorI2RlZmluZSBHQ0ZpbGxSdWxlCQkoMUw8PDkpIAorI2RlZmluZSBHQ1RpbGUJCQkoMUw8PDEwKQorI2RlZmluZSBHQ1N0aXBwbGUJCSgxTDw8MTEpCisjZGVmaW5lIEdDVGlsZVN0aXBYT3JpZ2luCSgxTDw8MTIpCisjZGVmaW5lIEdDVGlsZVN0aXBZT3JpZ2luCSgxTDw8MTMpCisjZGVmaW5lIEdDRm9udCAJCQkoMUw8PDE0KQorI2RlZmluZSBHQ1N1YndpbmRvd01vZGUJCSgxTDw8MTUpCisjZGVmaW5lIEdDR3JhcGhpY3NFeHBvc3VyZXMgICAgICgxTDw8MTYpCisjZGVmaW5lIEdDQ2xpcFhPcmlnaW4JCSgxTDw8MTcpCisjZGVmaW5lIEdDQ2xpcFlPcmlnaW4JCSgxTDw8MTgpCisjZGVmaW5lIEdDQ2xpcE1hc2sJCSgxTDw8MTkpCisjZGVmaW5lIEdDRGFzaE9mZnNldAkJKDFMPDwyMCkKKyNkZWZpbmUgR0NEYXNoTGlzdAkJKDFMPDwyMSkKKyNkZWZpbmUgR0NBcmNNb2RlCQkoMUw8PDIyKQorCisjZGVmaW5lIEdDTGFzdEJpdAkJMjIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRk9OVFMgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHVzZWQgaW4gUXVlcnlGb250IC0tIGRyYXcgZGlyZWN0aW9uICovCisKKyNkZWZpbmUgRm9udExlZnRUb1JpZ2h0CQkwCisjZGVmaW5lIEZvbnRSaWdodFRvTGVmdAkJMQorCisjZGVmaW5lIEZvbnRDaGFuZ2UJCTI1NQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBJTUFHSU5HIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbWFnZUZvcm1hdCAtLSBQdXRJbWFnZSwgR2V0SW1hZ2UgKi8KKworI2RlZmluZSBYWUJpdG1hcAkJMAkvKiBkZXB0aCAxLCBYWUZvcm1hdCAqLworI2RlZmluZSBYWVBpeG1hcAkJMQkvKiBkZXB0aCA9PSBkcmF3YWJsZSBkZXB0aCAqLworI2RlZmluZSBaUGl4bWFwCQkJMgkvKiBkZXB0aCA9PSBkcmF3YWJsZSBkZXB0aCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDT0xPUiBNQVAgU1RVRkYgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZvciBDcmVhdGVDb2xvcm1hcCAqLworCisjZGVmaW5lIEFsbG9jTm9uZQkJMAkvKiBjcmVhdGUgbWFwIHdpdGggbm8gZW50cmllcyAqLworI2RlZmluZSBBbGxvY0FsbAkJMQkvKiBhbGxvY2F0ZSBlbnRpcmUgbWFwIHdyaXRlYWJsZSAqLworCisKKy8qIEZsYWdzIHVzZWQgaW4gU3RvcmVOYW1lZENvbG9yLCBTdG9yZUNvbG9ycyAqLworCisjZGVmaW5lIERvUmVkCQkJKDE8PDApCisjZGVmaW5lIERvR3JlZW4JCQkoMTw8MSkKKyNkZWZpbmUgRG9CbHVlCQkJKDE8PDIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ1VSU09SIFNUVUZGCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFF1ZXJ5QmVzdFNpemUgQ2xhc3MgKi8KKworI2RlZmluZSBDdXJzb3JTaGFwZQkJMAkvKiBsYXJnZXN0IHNpemUgdGhhdCBjYW4gYmUgZGlzcGxheWVkICovCisjZGVmaW5lIFRpbGVTaGFwZQkJMQkvKiBzaXplIHRpbGVkIGZhc3Rlc3QgKi8KKyNkZWZpbmUgU3RpcHBsZVNoYXBlCQkyCS8qIHNpemUgc3RpcHBsZWQgZmFzdGVzdCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBLRVlCT0FSRC9QT0lOVEVSIFNUVUZGCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQXV0b1JlcGVhdE1vZGVPZmYJMAorI2RlZmluZSBBdXRvUmVwZWF0TW9kZU9uCTEKKyNkZWZpbmUgQXV0b1JlcGVhdE1vZGVEZWZhdWx0CTIKKworI2RlZmluZSBMZWRNb2RlT2ZmCQkwCisjZGVmaW5lIExlZE1vZGVPbgkJMQorCisvKiBtYXNrcyBmb3IgQ2hhbmdlS2V5Ym9hcmRDb250cm9sICovCisKKyNkZWZpbmUgS0JLZXlDbGlja1BlcmNlbnQJKDFMPDwwKQorI2RlZmluZSBLQkJlbGxQZXJjZW50CQkoMUw8PDEpCisjZGVmaW5lIEtCQmVsbFBpdGNoCQkoMUw8PDIpCisjZGVmaW5lIEtCQmVsbER1cmF0aW9uCQkoMUw8PDMpCisjZGVmaW5lIEtCTGVkCQkJKDFMPDw0KQorI2RlZmluZSBLQkxlZE1vZGUJCSgxTDw8NSkKKyNkZWZpbmUgS0JLZXkJCQkoMUw8PDYpCisjZGVmaW5lIEtCQXV0b1JlcGVhdE1vZGUJKDFMPDw3KQorCisjZGVmaW5lIE1hcHBpbmdTdWNjZXNzICAgICAJMAorI2RlZmluZSBNYXBwaW5nQnVzeSAgICAgICAgCTEKKyNkZWZpbmUgTWFwcGluZ0ZhaWxlZAkJMgorCisjZGVmaW5lIE1hcHBpbmdNb2RpZmllcgkJMAorI2RlZmluZSBNYXBwaW5nS2V5Ym9hcmQJCTEKKyNkZWZpbmUgTWFwcGluZ1BvaW50ZXIJCTIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTQ1JFRU4gU0FWRVIgU1RVRkYgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRG9udFByZWZlckJsYW5raW5nCTAKKyNkZWZpbmUgUHJlZmVyQmxhbmtpbmcJCTEKKyNkZWZpbmUgRGVmYXVsdEJsYW5raW5nCQkyCisKKyNkZWZpbmUgRGlzYWJsZVNjcmVlblNhdmVyCTAKKyNkZWZpbmUgRGlzYWJsZVNjcmVlbkludGVydmFsCTAKKworI2RlZmluZSBEb250QWxsb3dFeHBvc3VyZXMJMAorI2RlZmluZSBBbGxvd0V4cG9zdXJlcwkJMQorI2RlZmluZSBEZWZhdWx0RXhwb3N1cmVzCTIKKworLyogZm9yIEZvcmNlU2NyZWVuU2F2ZXIgKi8KKworI2RlZmluZSBTY3JlZW5TYXZlclJlc2V0IDAKKyNkZWZpbmUgU2NyZWVuU2F2ZXJBY3RpdmUgMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEhPU1RTIEFORCBDT05ORUNUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBmb3IgQ2hhbmdlSG9zdHMgKi8KKworI2RlZmluZSBIb3N0SW5zZXJ0CQkwCisjZGVmaW5lIEhvc3REZWxldGUJCTEKKworLyogZm9yIENoYW5nZUFjY2Vzc0NvbnRyb2wgKi8KKworI2RlZmluZSBFbmFibGVBY2Nlc3MJCTEgICAgICAKKyNkZWZpbmUgRGlzYWJsZUFjY2VzcwkJMAorCisvKiBEaXNwbGF5IGNsYXNzZXMgIHVzZWQgaW4gb3BlbmluZyB0aGUgY29ubmVjdGlvbiAKKyAqIE5vdGUgdGhhdCB0aGUgc3RhdGljYWxseSBhbGxvY2F0ZWQgb25lcyBhcmUgZXZlbiBudW1iZXJlZCBhbmQgdGhlCisgKiBkeW5hbWljYWxseSBjaGFuZ2VhYmxlIG9uZXMgYXJlIG9kZCBudW1iZXJlZCAqLworCisjZGVmaW5lIFN0YXRpY0dyYXkJCTAKKyNkZWZpbmUgR3JheVNjYWxlCQkxCisjZGVmaW5lIFN0YXRpY0NvbG9yCQkyCisjZGVmaW5lIFBzZXVkb0NvbG9yCQkzCisjZGVmaW5lIFRydWVDb2xvcgkJNAorI2RlZmluZSBEaXJlY3RDb2xvcgkJNQorCisKKy8qIEJ5dGUgb3JkZXIgIHVzZWQgaW4gaW1hZ2VCeXRlT3JkZXIgYW5kIGJpdG1hcEJpdE9yZGVyICovCisKKyNkZWZpbmUgTFNCRmlyc3QJCTAKKyNkZWZpbmUgTVNCRmlyc3QJCTEKKworI2VuZGlmIC8qIFhfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWEY4NmtleXN5bS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWEY4NmtleXN5bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNWU5Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YRjg2a2V5c3ltLmgKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiBYRnJlZTg2IHZlbmRvciBzcGVjaWZpYyBrZXlzeW1zLgorICoKKyAqIFRoZSBYRnJlZTg2IGtleXN5bSByYW5nZSBpcyAweDEwMDgwMDAxIC0gMHgxMDA4RkZGRi4KKyAqCisgKiBXaGVuIGFkZGluZyBuZXcgZW50cmllcywgdGhlIHhjL2xpYi9YS2V5c3ltREIgZmlsZSBzaG91bGQgYWxzbyBiZQorICogdXBkYXRlZCB0byBtYWtlIHRoZSBuZXcgZW50cmllcyB2aXNpYmxlIHRvIFhsaWIuCisgKi8KKworLyoKKyAqIE1vZGVMb2NrCisgKgorICogVGhpcyBvbmUgaXMgb2xkLCBhbmQgbm90IHJlYWxseSB1c2VkIGFueSBtb3JlIHNpbmNlIFhLQiBvZmZlcnMgdGhpcworICogZnVuY3Rpb25hbGl0eS4KKyAqLworCisjZGVmaW5lIFhGODZYS19Nb2RlTG9jawkJMHgxMDA4RkYwMQkvKiBNb2RlIFN3aXRjaCBMb2NrICovCisKKy8qCisgKiBOb3RlLCAweDEwMDhGRjA3IC0gMHgxMDA4RkYwRiBhcmUgZnJlZSBhbmQgc2hvdWxkIGJlIHVzZWQgZm9yIG1pc2MgbmV3CisgKiBrZXlzeW1zIHRoYXQgZG9uJ3QgZml0IGludG8gYW55IG9mIHRoZSBncm91cHMgYmVsb3cuCisgKgorICogMHgxMDA4RkY2NCwgMHgxMDA4RkY2RiwgMHgxMDA4RkY3MSwgMHgxMDA4RkY4MyBhcmUgbm8gbG9uZ2VyIHVzZWQsCisgKiBhbmQgc2hvdWxkIGJlIHVzZWQgZmlyc3QgZm9yIG5ldyBrZXlzeW1zLgorICoKKyAqIENoZWNrIGluIGtleXN5bWRlZi5oIGZvciBnZW5lcmljIHN5bWJvbHMgYmVmb3JlIGFkZGluZyBuZXcgWEZyZWU4Ni1zcGVjaWZpYworICogc3ltYm9scyBoZXJlLgorICoKKyAqIFguT3JnIHdpbGwgbm90IGJlIGFkZGluZyB0byB0aGUgWEY4NiBzZXQgb2Yga2V5c3ltcywgdGhvdWdoIHRoZXkgaGF2ZQorICogYmVlbiBhZG9wdGVkIGFuZCBhcmUgY29uc2lkZXJlZCBhICJzdGFuZGFyZCIgcGFydCBvZiBYIGtleXN5bSBkZWZpbml0aW9ucy4KKyAqIFhGcmVlODYgbmV2ZXIgcHJvcGVybHkgY29tbWVudGVkIHRoZXNlIGtleXN5bXMsIHNvIHdlIGhhdmUgZG9uZSBvdXIKKyAqIGJlc3QgdG8gZXhwbGFpbiB0aGUgc2VtYW50aWMgbWVhbmluZyBvZiB0aGVzZSBrZXlzLgorICoKKyAqIFhGcmVlODYgaGFzIHJlbW92ZWQgdGhlaXIgbWFpbCBhcmNoaXZlcyBvZiB0aGUgcGVyaW9kLCB0aGF0IG1pZ2h0IGhhdmUKKyAqIHNoZWQgbW9yZSBsaWdodCBvbiBzb21lIG9mIHRoZXNlIGRlZmluaXRpb25zLiBVbnRpbC91bmxlc3Mgd2UgcmVzdXJyZWN0CisgKiB0aGVzZSBhcmNoaXZlcywgdGhlc2UgYXJlIGZyb20gbWVtb3J5IGFuZCB1c2FnZS4KKyAqLworCisKKy8qIEJhY2tsaWdodCBjb250cm9scy4gKi8KKyNkZWZpbmUgWEY4NlhLX01vbkJyaWdodG5lc3NVcCAgIDB4MTAwOEZGMDIgIC8qIE1vbml0b3IvcGFuZWwgYnJpZ2h0bmVzcyAqLworI2RlZmluZSBYRjg2WEtfTW9uQnJpZ2h0bmVzc0Rvd24gMHgxMDA4RkYwMyAgLyogTW9uaXRvci9wYW5lbCBicmlnaHRuZXNzICovCisjZGVmaW5lIFhGODZYS19LYmRMaWdodE9uT2ZmICAgICAweDEwMDhGRjA0ICAvKiBLZXlib2FyZHMgbWF5IGJlIGxpdCAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0tiZEJyaWdodG5lc3NVcCAgIDB4MTAwOEZGMDUgIC8qIEtleWJvYXJkcyBtYXkgYmUgbGl0ICAgICAqLworI2RlZmluZSBYRjg2WEtfS2JkQnJpZ2h0bmVzc0Rvd24gMHgxMDA4RkYwNiAgLyogS2V5Ym9hcmRzIG1heSBiZSBsaXQgICAgICovCisKKy8qCisgKiBLZXlzIGZvdW5kIG9uIHNvbWUgIkludGVybmV0IiBrZXlib2FyZHMuCisgKi8KKyNkZWZpbmUgWEY4NlhLX1N0YW5kYnkJCTB4MTAwOEZGMTAgICAvKiBTeXN0ZW0gaW50byBzdGFuZGJ5IG1vZGUgICAqLworI2RlZmluZSBYRjg2WEtfQXVkaW9Mb3dlclZvbHVtZQkweDEwMDhGRjExICAgLyogVm9sdW1lIGNvbnRyb2wgZG93biAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0F1ZGlvTXV0ZQkweDEwMDhGRjEyICAgLyogTXV0ZSBzb3VuZCBmcm9tIHRoZSBzeXN0ZW0gKi8KKyNkZWZpbmUgWEY4NlhLX0F1ZGlvUmFpc2VWb2x1bWUJMHgxMDA4RkYxMyAgIC8qIFZvbHVtZSBjb250cm9sIHVwICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19BdWRpb1BsYXkJMHgxMDA4RkYxNCAgIC8qIFN0YXJ0IHBsYXlpbmcgb2YgYXVkaW8gPiAgICovCisjZGVmaW5lIFhGODZYS19BdWRpb1N0b3AJMHgxMDA4RkYxNSAgIC8qIFN0b3AgcGxheWluZyBhdWRpbyAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19BdWRpb1ByZXYJMHgxMDA4RkYxNiAgIC8qIFByZXZpb3VzIHRyYWNrICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19BdWRpb05leHQJMHgxMDA4RkYxNyAgIC8qIE5leHQgdHJhY2sgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19Ib21lUGFnZQkJMHgxMDA4RkYxOCAgIC8qIERpc3BsYXkgdXNlcidzIGhvbWUgcGFnZSAgICovCisjZGVmaW5lIFhGODZYS19NYWlsCQkweDEwMDhGRjE5ICAgLyogSW52b2tlIHVzZXIncyBtYWlsIHByb2dyYW0gKi8KKyNkZWZpbmUgWEY4NlhLX1N0YXJ0CQkweDEwMDhGRjFBICAgLyogU3RhcnQgYXBwbGljYXRpb24gICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1NlYXJjaAkJMHgxMDA4RkYxQiAgIC8qIFNlYXJjaCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19BdWRpb1JlY29yZAkweDEwMDhGRjFDICAgLyogUmVjb3JkIGF1ZGlvIGFwcGxpY2F0aW9uICAgKi8KKworLyogVGhlc2UgYXJlIHNvbWV0aW1lcyBmb3VuZCBvbiBQREEncyAoZS5nLiBQYWxtLCBQb2NrZXRQQyBvciBlbHNld2hlcmUpICAgKi8KKyNkZWZpbmUgWEY4NlhLX0NhbGN1bGF0b3IJMHgxMDA4RkYxRCAgIC8qIEludm9rZSBjYWxjdWxhdG9yIHByb2dyYW0gICovCisjZGVmaW5lIFhGODZYS19NZW1vCQkweDEwMDhGRjFFICAgLyogSW52b2tlIE1lbW8gdGFraW5nIHByb2dyYW0gKi8KKyNkZWZpbmUgWEY4NlhLX1RvRG9MaXN0CQkweDEwMDhGRjFGICAgLyogSW52b2tlIFRvIERvIExpc3QgcHJvZ3JhbSAgKi8KKyNkZWZpbmUgWEY4NlhLX0NhbGVuZGFyCQkweDEwMDhGRjIwICAgLyogSW52b2tlIENhbGVuZGFyIHByb2dyYW0gICAgKi8KKyNkZWZpbmUgWEY4NlhLX1Bvd2VyRG93bgkweDEwMDhGRjIxICAgLyogRGVlcCBzbGVlcCB0aGUgc3lzdGVtICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0NvbnRyYXN0QWRqdXN0CTB4MTAwOEZGMjIgICAvKiBBZGp1c3Qgc2NyZWVuIGNvbnRyYXN0ICAgICAqLworI2RlZmluZSBYRjg2WEtfUm9ja2VyVXAJCTB4MTAwOEZGMjMgICAvKiBSb2NrZXIgc3dpdGNoZXMgZXhpc3QgdXAgICAqLworI2RlZmluZSBYRjg2WEtfUm9ja2VyRG93bgkweDEwMDhGRjI0ICAgLyogYW5kIGRvd24gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1JvY2tlckVudGVyCTB4MTAwOEZGMjUgICAvKiBhbmQgbGV0IHlvdSBwcmVzcyB0aGVtICAgICAqLworCisvKiBTb21lIG1vcmUgIkludGVybmV0IiBrZXlib2FyZCBzeW1ib2xzICovCisjZGVmaW5lIFhGODZYS19CYWNrCQkweDEwMDhGRjI2ICAgLyogTGlrZSBiYWNrIG9uIGEgYnJvd3NlciAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0ZvcndhcmQJCTB4MTAwOEZGMjcgICAvKiBMaWtlIGZvcndhcmQgb24gYSBicm93c2VyICAqLworI2RlZmluZSBYRjg2WEtfU3RvcAkJMHgxMDA4RkYyOCAgIC8qIFN0b3AgY3VycmVudCBvcGVyYXRpb24gICAgICovCisjZGVmaW5lIFhGODZYS19SZWZyZXNoCQkweDEwMDhGRjI5ICAgLyogUmVmcmVzaCB0aGUgcGFnZSAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1Bvd2VyT2ZmCQkweDEwMDhGRjJBICAgLyogUG93ZXIgb2ZmIHN5c3RlbSBlbnRpcmVseSAgKi8KKyNkZWZpbmUgWEY4NlhLX1dha2VVcAkJMHgxMDA4RkYyQiAgIC8qIFdha2UgdXAgc3lzdGVtIGZyb20gc2xlZXAgICovCisjZGVmaW5lIFhGODZYS19FamVjdCAgICAgICAgICAgIDB4MTAwOEZGMkMgICAvKiBFamVjdCBkZXZpY2UgKGUuZy4gRFZEKSAgICAqLworI2RlZmluZSBYRjg2WEtfU2NyZWVuU2F2ZXIgICAgICAweDEwMDhGRjJEICAgLyogSW52b2tlIHNjcmVlbnNhdmVyICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1dXVyAgICAgICAgICAgICAgMHgxMDA4RkYyRSAgIC8qIEludm9rZSB3ZWIgYnJvd3NlciAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19TbGVlcCAgICAgICAgICAgIDB4MTAwOEZGMkYgICAvKiBQdXQgc3lzdGVtIHRvIHNsZWVwICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfRmF2b3JpdGVzCTB4MTAwOEZGMzAgICAvKiBTaG93IGZhdm9yaXRlIGxvY2F0aW9ucyAgICAqLworI2RlZmluZSBYRjg2WEtfQXVkaW9QYXVzZQkweDEwMDhGRjMxICAgLyogUGF1c2UgYXVkaW8gcGxheWluZyAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0F1ZGlvTWVkaWEJMHgxMDA4RkYzMiAgIC8qIExhdW5jaCBtZWRpYSBjb2xsZWN0aW9uIGFwcCAqLworI2RlZmluZSBYRjg2WEtfTXlDb21wdXRlcgkweDEwMDhGRjMzICAgLyogRGlzcGxheSAiTXkgQ29tcHV0ZXIiIHdpbmRvdyAqLworI2RlZmluZSBYRjg2WEtfVmVuZG9ySG9tZQkweDEwMDhGRjM0ICAgLyogRGlzcGxheSB2ZW5kb3IgaG9tZSB3ZWIgc2l0ZSAqLworI2RlZmluZSBYRjg2WEtfTGlnaHRCdWxiCTB4MTAwOEZGMzUgICAvKiBMaWdodCBidWxiIGtleXMgZXhpc3QgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1Nob3AJCTB4MTAwOEZGMzYgICAvKiBEaXNwbGF5IHNob3BwaW5nIHdlYiBzaXRlICAgKi8KKyNkZWZpbmUgWEY4NlhLX0hpc3RvcnkJCTB4MTAwOEZGMzcgICAvKiBTaG93IGhpc3Rvcnkgb2Ygd2ViIHN1cmZpbmcgKi8KKyNkZWZpbmUgWEY4NlhLX09wZW5VUkwJCTB4MTAwOEZGMzggICAvKiBPcGVuIHNlbGVjdGVkIFVSTCAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0FkZEZhdm9yaXRlCTB4MTAwOEZGMzkgICAvKiBBZGQgVVJMIHRvIGZhdm9yaXRlcyBsaXN0ICAgKi8KKyNkZWZpbmUgWEY4NlhLX0hvdExpbmtzCQkweDEwMDhGRjNBICAgLyogU2hvdyAiaG90IiBsaW5rcyAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19CcmlnaHRuZXNzQWRqdXN0CTB4MTAwOEZGM0IgICAvKiBJbnZva2UgYnJpZ2h0bmVzcyBhZGouIFVJICAgKi8KKyNkZWZpbmUgWEY4NlhLX0ZpbmFuY2UJCTB4MTAwOEZGM0MgICAvKiBEaXNwbGF5IGZpbmFuY2lhbCBzaXRlICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0NvbW11bml0eQkweDEwMDhGRjNEICAgLyogRGlzcGxheSB1c2VyJ3MgY29tbXVuaXR5ICAgICovCisjZGVmaW5lIFhGODZYS19BdWRpb1Jld2luZAkweDEwMDhGRjNFICAgLyogInJld2luZCIgYXVkaW8gdHJhY2sgICAgICAgICovCisjZGVmaW5lIFhGODZYS19CYWNrRm9yd2FyZAkweDEwMDhGRjNGICAgLyogPz8/ICovCisjZGVmaW5lIFhGODZYS19MYXVuY2gwCQkweDEwMDhGRjQwICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2gxCQkweDEwMDhGRjQxICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2gyCQkweDEwMDhGRjQyICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2gzCQkweDEwMDhGRjQzICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2g0CQkweDEwMDhGRjQ0ICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2g1CQkweDEwMDhGRjQ1ICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2g2CQkweDEwMDhGRjQ2ICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2g3CQkweDEwMDhGRjQ3ICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2g4CQkweDEwMDhGRjQ4ICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2g5CQkweDEwMDhGRjQ5ICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2hBCQkweDEwMDhGRjRBICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2hCCQkweDEwMDhGRjRCICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2hDCQkweDEwMDhGRjRDICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2hECQkweDEwMDhGRjREICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2hFCQkweDEwMDhGRjRFICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2hGCQkweDEwMDhGRjRGICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisKKyNkZWZpbmUgWEY4NlhLX0FwcGxpY2F0aW9uTGVmdAkweDEwMDhGRjUwICAgLyogc3dpdGNoIHRvIGFwcGxpY2F0aW9uLCBsZWZ0ICovCisjZGVmaW5lIFhGODZYS19BcHBsaWNhdGlvblJpZ2h0CTB4MTAwOEZGNTEgICAvKiBzd2l0Y2ggdG8gYXBwbGljYXRpb24sIHJpZ2h0Ki8KKyNkZWZpbmUgWEY4NlhLX0Jvb2sJCTB4MTAwOEZGNTIgICAvKiBMYXVuY2ggYm9va3JlYWRlciAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0NECQkweDEwMDhGRjUzICAgLyogTGF1bmNoIENEL0RWRCBwbGF5ZXIgICAgICAgICovCisjZGVmaW5lIFhGODZYS19DYWxjdWxhdGVyCTB4MTAwOEZGNTQgICAvKiBMYXVuY2ggQ2FsY3VsYXRlciAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0NsZWFyCQkweDEwMDhGRjU1ICAgLyogQ2xlYXIgd2luZG93LCBzY3JlZW4gICAgICAgICovCisjZGVmaW5lIFhGODZYS19DbG9zZQkJMHgxMDA4RkY1NiAgIC8qIENsb3NlIHdpbmRvdyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfQ29weQkJMHgxMDA4RkY1NyAgIC8qIENvcHkgc2VsZWN0aW9uICAgICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfQ3V0CQkweDEwMDhGRjU4ICAgLyogQ3V0IHNlbGVjdGlvbiAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19EaXNwbGF5CQkweDEwMDhGRjU5ICAgLyogT3V0cHV0IHN3aXRjaCBrZXkgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19ET1MJCTB4MTAwOEZGNUEgICAvKiBMYXVuY2ggRE9TIChlbXVsYXRpb24pICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0RvY3VtZW50cwkweDEwMDhGRjVCICAgLyogT3BlbiBkb2N1bWVudHMgd2luZG93ICAgICAgICovCisjZGVmaW5lIFhGODZYS19FeGNlbAkJMHgxMDA4RkY1QyAgIC8qIExhdW5jaCBzcHJlYWQgc2hlZXQgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfRXhwbG9yZXIJCTB4MTAwOEZGNUQgICAvKiBMYXVuY2ggZmlsZSBleHBsb3JlciAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0dhbWUJCTB4MTAwOEZGNUUgICAvKiBMYXVuY2ggZ2FtZSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0dvCQkweDEwMDhGRjVGICAgLyogR28gdG8gVVJMICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19pVG91Y2gJCTB4MTAwOEZGNjAgICAvKiBMb2dpdGNoIGlUb3VjaC0gZG9uJ3QgdXNlICAgKi8KKyNkZWZpbmUgWEY4NlhLX0xvZ09mZgkJMHgxMDA4RkY2MSAgIC8qIExvZyBvZmYgc3lzdGVtICAgICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfTWFya2V0CQkweDEwMDhGRjYyICAgLyogPz8gICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19NZWV0aW5nCQkweDEwMDhGRjYzICAgLyogZW50ZXIgbWVldGluZyBpbiBjYWxlbmRhciAgICovCisjZGVmaW5lIFhGODZYS19NZW51S0IJCTB4MTAwOEZGNjUgICAvKiBkaXN0aW5ndXNoIGtleWJvYXJkIGZyb20gUEIgKi8KKyNkZWZpbmUgWEY4NlhLX01lbnVQQgkJMHgxMDA4RkY2NiAgIC8qIGRpc3RpbnVpc2ggUEIgZnJvbSBrZXlib2FyZCAqLworI2RlZmluZSBYRjg2WEtfTXlTaXRlcwkJMHgxMDA4RkY2NyAgIC8qIEZhdm91cml0ZXMgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfTmV3CQkweDEwMDhGRjY4ICAgLyogTmV3IChmb2xkZXIsIGRvY3VtZW50Li4uICAgICovCisjZGVmaW5lIFhGODZYS19OZXdzCQkweDEwMDhGRjY5ICAgLyogTmV3cyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19PZmZpY2VIb21lCTB4MTAwOEZGNkEgICAvKiBPZmZpY2UgaG9tZSAob2xkIFN0YXJvZmZpY2UpKi8KKyNkZWZpbmUgWEY4NlhLX09wZW4JCTB4MTAwOEZGNkIgICAvKiBPcGVuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX09wdGlvbgkJMHgxMDA4RkY2QyAgIC8qID8/ICovCisjZGVmaW5lIFhGODZYS19QYXN0ZQkJMHgxMDA4RkY2RCAgIC8qIFBhc3RlICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfUGhvbmUJCTB4MTAwOEZGNkUgICAvKiBMYXVuY2ggcGhvbmU7IGRpYWwgbnVtYmVyICAgKi8KKyNkZWZpbmUgWEY4NlhLX1EJCTB4MTAwOEZGNzAgICAvKiBDb21wYXEncyBRIC0gZG9uJ3QgdXNlICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1JlcGx5CQkweDEwMDhGRjcyICAgLyogUmVwbHkgZS5nLiwgbWFpbCAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19SZWxvYWQJCTB4MTAwOEZGNzMgICAvKiBSZWxvYWQgd2ViIHBhZ2UsIGZpbGUsIGV0Yy4gKi8KKyNkZWZpbmUgWEY4NlhLX1JvdGF0ZVdpbmRvd3MJMHgxMDA4RkY3NCAgIC8qIFJvdGF0ZSB3aW5kb3dzIGUuZy4geHJhbmRyICAqLworI2RlZmluZSBYRjg2WEtfUm90YXRpb25QQgkweDEwMDhGRjc1ICAgLyogZG9uJ3QgdXNlICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19Sb3RhdGlvbktCCTB4MTAwOEZGNzYgICAvKiBkb24ndCB1c2UgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1NhdmUJCTB4MTAwOEZGNzcgICAvKiBTYXZlIChmaWxlLCBkb2N1bWVudCwgc3RhdGUgKi8KKyNkZWZpbmUgWEY4NlhLX1Njcm9sbFVwCQkweDEwMDhGRjc4ICAgLyogU2Nyb2xsIHdpbmRvdy9jb250ZW50cyB1cCAgICovCisjZGVmaW5lIFhGODZYS19TY3JvbGxEb3duCTB4MTAwOEZGNzkgICAvKiBTY3Jvb2wgd2luZG93L2NvbnRlbnRkIGRvd24gKi8KKyNkZWZpbmUgWEY4NlhLX1Njcm9sbENsaWNrCTB4MTAwOEZGN0EgICAvKiBVc2UgWEtCIG1vdXNla2V5cyBpbnN0ZWFkICAgKi8KKyNkZWZpbmUgWEY4NlhLX1NlbmQJCTB4MTAwOEZGN0IgICAvKiBTZW5kIG1haWwsIGZpbGUsIG9iamVjdCAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1NwZWxsCQkweDEwMDhGRjdDICAgLyogU3BlbGwgY2hlY2tlciAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19TcGxpdFNjcmVlbgkweDEwMDhGRjdEICAgLyogU3BsaXQgd2luZG93IG9yIHNjcmVlbiAgICAgICovCisjZGVmaW5lIFhGODZYS19TdXBwb3J0CQkweDEwMDhGRjdFICAgLyogR2V0IHN1cHBvcnQgKD8/KSAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19UYXNrUGFuZQkJMHgxMDA4RkY3RiAgIC8qIFNob3cgdGFza3MgKi8KKyNkZWZpbmUgWEY4NlhLX1Rlcm1pbmFsCQkweDEwMDhGRjgwICAgLyogTGF1bmNoIHRlcm1pbmFsIGVtdWxhdG9yICAgICovCisjZGVmaW5lIFhGODZYS19Ub29scwkJMHgxMDA4RkY4MSAgIC8qIHRvb2xib3ggb2YgZGVza3RvcC9hcHAuICAgICAqLworI2RlZmluZSBYRjg2WEtfVHJhdmVsCQkweDEwMDhGRjgyICAgLyogPz8gKi8KKyNkZWZpbmUgWEY4NlhLX1VzZXJQQgkJMHgxMDA4RkY4NCAgIC8qID8/ICovCisjZGVmaW5lIFhGODZYS19Vc2VyMUtCCQkweDEwMDhGRjg1ICAgLyogPz8gKi8KKyNkZWZpbmUgWEY4NlhLX1VzZXIyS0IJCTB4MTAwOEZGODYgICAvKiA/PyAqLworI2RlZmluZSBYRjg2WEtfVmlkZW8JCTB4MTAwOEZGODcgICAvKiBMYXVuY2ggdmlkZW8gcGxheWVyICAgICAgICovCisjZGVmaW5lIFhGODZYS19XaGVlbEJ1dHRvbgkweDEwMDhGRjg4ICAgLyogYnV0dG9uIGZyb20gYSBtb3VzZSB3aGVlbCAqLworI2RlZmluZSBYRjg2WEtfV29yZAkJMHgxMDA4RkY4OSAgIC8qIExhdW5jaCB3b3JkIHByb2Nlc3NvciAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1hmZXIJCTB4MTAwOEZGOEEKKyNkZWZpbmUgWEY4NlhLX1pvb21JbgkJMHgxMDA4RkY4QiAgIC8qIHpvb20gaW4gdmlldywgbWFwLCBldGMuICAgKi8KKyNkZWZpbmUgWEY4NlhLX1pvb21PdXQJCTB4MTAwOEZGOEMgICAvKiB6b29tIG91dCB2aWV3LCBtYXAsIGV0Yy4gICovCisKKyNkZWZpbmUgWEY4NlhLX0F3YXkJCTB4MTAwOEZGOEQgICAvKiBtYXJrIHlvdXJzZWxmIGFzIGF3YXkgICAgICovCisjZGVmaW5lIFhGODZYS19NZXNzZW5nZXIJMHgxMDA4RkY4RSAgIC8qIGFzIGluIGluc3RhbnQgbWVzc2FnaW5nICAgKi8KKyNkZWZpbmUgWEY4NlhLX1dlYkNhbQkJMHgxMDA4RkY4RiAgIC8qIExhdW5jaCB3ZWIgY2FtZXJhIGFwcC4gICAgKi8KKyNkZWZpbmUgWEY4NlhLX01haWxGb3J3YXJkCTB4MTAwOEZGOTAgICAvKiBGb3J3YXJkIGluIG1haWwgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19QaWN0dXJlcwkJMHgxMDA4RkY5MSAgIC8qIFNob3cgcGljdHVyZXMgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX011c2ljCQkweDEwMDhGRjkyICAgLyogTGF1bmNoIG11c2ljIGFwcGxpY2F0aW9uICAqLworCisjZGVmaW5lIFhGODZYS19CYXR0ZXJ5CQkweDEwMDhGRjkzICAgLyogRGlzcGxheSBiYXR0ZXJ5IGluZm9ybWF0aW9uICovCisjZGVmaW5lIFhGODZYS19CbHVldG9vdGgJMHgxMDA4RkY5NCAgIC8qIEVuYWJsZS9kaXNhYmxlIEJsdWV0b290aCAgICAqLworI2RlZmluZSBYRjg2WEtfV0xBTgkJMHgxMDA4RkY5NSAgIC8qIEVuYWJsZS9kaXNhYmxlIFdMQU4gICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfVVdCCQkweDEwMDhGRjk2ICAgLyogRW5hYmxlL2Rpc2FibGUgVVdCCSAgICAqLworCisjZGVmaW5lIFhGODZYS19BdWRpb0ZvcndhcmQJMHgxMDA4RkY5NyAgIC8qIGZhc3QtZm9yd2FyZCBhdWRpbyB0cmFjayAgICAqLworI2RlZmluZSBYRjg2WEtfQXVkaW9SZXBlYXQJMHgxMDA4RkY5OCAgIC8qIHRvZ2dsZSByZXBlYXQgbW9kZSAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfQXVkaW9SYW5kb21QbGF5CTB4MTAwOEZGOTkgICAvKiB0b2dnbGUgc2h1ZmZsZSBtb2RlICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1N1YnRpdGxlCQkweDEwMDhGRjlBICAgLyogY3ljbGUgdGhyb3VnaCBzdWJ0aXRsZSAgICAgICovCisjZGVmaW5lIFhGODZYS19BdWRpb0N5Y2xlVHJhY2sJMHgxMDA4RkY5QiAgIC8qIGN5Y2xlIHRocm91Z2ggYXVkaW8gdHJhY2tzICAqLworI2RlZmluZSBYRjg2WEtfQ3ljbGVBbmdsZQkweDEwMDhGRjlDICAgLyogY3ljbGUgdGhyb3VnaCBhbmdsZXMgICAgICAgICovCisjZGVmaW5lIFhGODZYS19GcmFtZUJhY2sJMHgxMDA4RkY5RCAgIC8qIHZpZGVvOiBnbyBvbmUgZnJhbWUgYmFjayAgICAqLworI2RlZmluZSBYRjg2WEtfRnJhbWVGb3J3YXJkCTB4MTAwOEZGOUUgICAvKiB2aWRlbzogZ28gb25lIGZyYW1lIGZvcndhcmQgKi8KKyNkZWZpbmUgWEY4NlhLX1RpbWUJCTB4MTAwOEZGOUYgICAvKiBkaXNwbGF5LCBvciBzaG93cyBhbiBlbnRyeSBmb3IgdGltZSBzZWVraW5nICovCisjZGVmaW5lIFhGODZYS19TZWxlY3QJCTB4MTAwOEZGQTAgICAvKiBTZWxlY3QgYnV0dG9uIG9uIGpveXBhZHMgYW5kIHJlbW90ZXMgKi8KKyNkZWZpbmUgWEY4NlhLX1ZpZXcJCTB4MTAwOEZGQTEgICAvKiBTaG93IGEgdmlldyBvcHRpb25zL3Byb3BlcnRpZXMgKi8KKyNkZWZpbmUgWEY4NlhLX1RvcE1lbnUJCTB4MTAwOEZGQTIgICAvKiBHbyB0byBhIHRvcC1sZXZlbCBtZW51IGluIGEgdmlkZW8gKi8KKworI2RlZmluZSBYRjg2WEtfUmVkCQkweDEwMDhGRkEzICAgLyogUmVkIGJ1dHRvbiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19HcmVlbgkJMHgxMDA4RkZBNCAgIC8qIEdyZWVuIGJ1dHRvbiAgICAgICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfWWVsbG93CQkweDEwMDhGRkE1ICAgLyogWWVsbG93IGJ1dHRvbiAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19CbHVlICAgICAgICAgICAgIDB4MTAwOEZGQTYgICAvKiBCbHVlIGJ1dHRvbiAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBYRjg2WEtfU3VzcGVuZAkJMHgxMDA4RkZBNyAgIC8qIFNsZWVwIHRvIFJBTSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfSGliZXJuYXRlCTB4MTAwOEZGQTggICAvKiBTbGVlcCB0byBkaXNrICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1RvdWNocGFkVG9nZ2xlCTB4MTAwOEZGQTkgICAvKiBUb2dnbGUgYmV0d2VlbiB0b3VjaHBhZC90cmFja3N0aWNrICovCisjZGVmaW5lIFhGODZYS19Ub3VjaHBhZE9uCTB4MTAwOEZGQjAgICAvKiBUaGUgdG91Y2hwYWQgZ290IHN3aXRjaGVkIG9uICovCisjZGVmaW5lIFhGODZYS19Ub3VjaHBhZE9mZgkweDEwMDhGRkIxICAgLyogVGhlIHRvdWNocGFkIGdvdCBzd2l0Y2hlZCBvZmYgKi8KKworLyogS2V5cyBmb3Igc3BlY2lhbCBhY3Rpb24ga2V5cyAoaG90IGtleXMpICovCisvKiBWaXJ0dWFsIHRlcm1pbmFscyBvbiBzb21lIG9wZXJhdGluZyBzeXN0ZW1zICovCisjZGVmaW5lIFhGODZYS19Td2l0Y2hfVlRfMQkweDEwMDhGRTAxCisjZGVmaW5lIFhGODZYS19Td2l0Y2hfVlRfMgkweDEwMDhGRTAyCisjZGVmaW5lIFhGODZYS19Td2l0Y2hfVlRfMwkweDEwMDhGRTAzCisjZGVmaW5lIFhGODZYS19Td2l0Y2hfVlRfNAkweDEwMDhGRTA0CisjZGVmaW5lIFhGODZYS19Td2l0Y2hfVlRfNQkweDEwMDhGRTA1CisjZGVmaW5lIFhGODZYS19Td2l0Y2hfVlRfNgkweDEwMDhGRTA2CisjZGVmaW5lIFhGODZYS19Td2l0Y2hfVlRfNwkweDEwMDhGRTA3CisjZGVmaW5lIFhGODZYS19Td2l0Y2hfVlRfOAkweDEwMDhGRTA4CisjZGVmaW5lIFhGODZYS19Td2l0Y2hfVlRfOQkweDEwMDhGRTA5CisjZGVmaW5lIFhGODZYS19Td2l0Y2hfVlRfMTAJMHgxMDA4RkUwQQorI2RlZmluZSBYRjg2WEtfU3dpdGNoX1ZUXzExCTB4MTAwOEZFMEIKKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF8xMgkweDEwMDhGRTBDCisKKyNkZWZpbmUgWEY4NlhLX1VuZ3JhYgkJMHgxMDA4RkUyMCAgIC8qIGZvcmNlIHVuZ3JhYiAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19DbGVhckdyYWIJMHgxMDA4RkUyMSAgIC8qIGtpbGwgYXBwbGljYXRpb24gd2l0aCBncmFiICovCisjZGVmaW5lIFhGODZYS19OZXh0X1ZNb2RlCTB4MTAwOEZFMjIgICAvKiBuZXh0IHZpZGVvIG1vZGUgYXZhaWxhYmxlICAqLworI2RlZmluZSBYRjg2WEtfUHJldl9WTW9kZQkweDEwMDhGRTIzICAgLyogcHJldi4gdmlkZW8gbW9kZSBhdmFpbGFibGUgKi8KKyNkZWZpbmUgWEY4NlhLX0xvZ1dpbmRvd1RyZWUJMHgxMDA4RkUyNCAgIC8qIHByaW50IHdpbmRvdyB0cmVlIHRvIGxvZyAgICovCisjZGVmaW5lIFhGODZYS19Mb2dHcmFiSW5mbwkweDEwMDhGRTI1ICAgLyogcHJpbnQgYWxsIGFjdGl2ZSBncmFicyB0byBsb2cgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hLQmxpYi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWEtCbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY2YzcyYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hLQmxpYi5oCkBAIC0wLDAgKzEsMTE0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAxOTkzIGJ5IFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCitzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0CitmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKK25vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgU2lsaWNvbiBHcmFwaGljcyBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uCitvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eQorb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKK3dpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworU0lMSUNPTiBHUkFQSElDUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUworU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQorQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBJTiBOTyBFVkVOVCBTSEFMTCBTSUxJQ09OCitHUkFQSElDUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMCitEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCitEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFCitPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gIFdJVEgKK1RIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1gxMV9YS0JMSUJfSF8KKyNkZWZpbmUgX1gxMV9YS0JMSUJfSF8KKworI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWEtCc3RyLmg+CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JBbnlFdmVudCB7CisJaW50IAkJdHlwZTsJCS8qIFhrYkFueUV2ZW50ICovCisJdW5zaWduZWQgbG9uZyAJc2VyaWFsOwkJLyogIyBvZiBsYXN0IHJlcSBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCAJCXNlbmRfZXZlbnQ7CS8qIGlzIHRoaXMgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0PyAqLworCURpc3BsYXkgKglkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJVGltZSAJCXRpbWU7CQkvKiBtaWxsaXNlY29uZHMgKi8KKwlpbnQgCQl4a2JfdHlwZTsJLyogWEtCIGV2ZW50IG1pbm9yIGNvZGUgKi8KKwl1bnNpZ25lZCBpbnQgCWRldmljZTsJCS8qIGRldmljZSBJRCAqLworfSBYa2JBbnlFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYk5ld0tleWJvYXJkTm90aWZ5IHsKKwlpbnQgCQl0eXBlOwkJLyogWGtiQW55RXZlbnQgKi8KKwl1bnNpZ25lZCBsb25nIAlzZXJpYWw7CQkvKiBvZiBsYXN0IHJlcSBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCAJCXNlbmRfZXZlbnQ7CS8qIGlzIHRoaXMgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0PyAqLworCURpc3BsYXkgKglkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJVGltZSAJCXRpbWU7CQkvKiBtaWxsaXNlY29uZHMgKi8KKwlpbnQgCQl4a2JfdHlwZTsJLyogWGtiTmV3S2V5Ym9hcmROb3RpZnkgKi8KKwlpbnQJIAlkZXZpY2U7CQkvKiBkZXZpY2UgSUQgKi8KKwlpbnQJIAlvbGRfZGV2aWNlOwkvKiBkZXZpY2UgSUQgb2YgcHJldmlvdXMga2V5Ym9hcmQgKi8KKwlpbnQJIAltaW5fa2V5X2NvZGU7CS8qIG1pbmltdW0ga2V5IGNvZGUgKi8KKwlpbnQJCW1heF9rZXlfY29kZTsJLyogbWF4aW11bSBrZXkgY29kZSAqLworCWludAkgCW9sZF9taW5fa2V5X2NvZGU7LyogbWluIGtleSBjb2RlIG9mIHByZXZpb3VzIGtiZCAqLworCWludAkJb2xkX21heF9rZXlfY29kZTsvKiBtYXgga2V5IGNvZGUgb2YgcHJldmlvdXMga2JkICovCisJdW5zaWduZWQgaW50CWNoYW5nZWQ7CS8qIGNoYW5nZWQgYXNwZWN0cyBvZiB0aGUga2V5Ym9hcmQgKi8KKwljaGFyCSAJcmVxX21ham9yOwkvKiBtYWpvciBhbmQgbWlub3Igb3Bjb2RlIG9mIHJlcSAqLworCWNoYXIJIAlyZXFfbWlub3I7CS8qIHRoYXQgY2F1c2VkIGNoYW5nZSwgaWYgYXBwbGljYWJsZSAqLworfSBYa2JOZXdLZXlib2FyZE5vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCBfWGtiTWFwTm90aWZ5RXZlbnQgeworCWludCAJCXR5cGU7CQkvKiBYa2JBbnlFdmVudCAqLworCXVuc2lnbmVkIGxvbmcgCXNlcmlhbDsJCS8qIG9mIGxhc3QgcmVxIHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIAkJc2VuZF9ldmVudDsJLyogaXMgdGhpcyBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICoJZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVRpbWUgCQl0aW1lOwkJLyogbWlsbGlzZWNvbmRzICovCisJaW50IAkJeGtiX3R5cGU7CS8qIFhrYk1hcE5vdGlmeSAqLworCWludCAJCWRldmljZTsJCS8qIGRldmljZSBJRCAqLworCXVuc2lnbmVkIGludCAJY2hhbmdlZDsJLyogZmllbGRzIHdoaWNoIGhhdmUgYmVlbiBjaGFuZ2VkICovCisJdW5zaWduZWQgaW50IAlmbGFnczsJCS8qIHJlc2VydmVkICovCisJaW50IAkJZmlyc3RfdHlwZTsJLyogZmlyc3QgY2hhbmdlZCBrZXkgdHlwZSAqLworCWludCAJCW51bV90eXBlczsJLyogbnVtYmVyIG9mIGNoYW5nZWQga2V5IHR5cGVzICovCisJS2V5Q29kZQkJbWluX2tleV9jb2RlOworCUtleUNvZGUJCW1heF9rZXlfY29kZTsKKwlLZXlDb2RlCQlmaXJzdF9rZXlfc3ltOworCUtleUNvZGUJCWZpcnN0X2tleV9hY3Q7CisJS2V5Q29kZQkJZmlyc3Rfa2V5X2JlaGF2aW9yOworCUtleUNvZGUJCWZpcnN0X2tleV9leHBsaWNpdDsKKwlLZXlDb2RlCQlmaXJzdF9tb2RtYXBfa2V5OworCUtleUNvZGUJCWZpcnN0X3Ztb2RtYXBfa2V5OworCWludAkJbnVtX2tleV9zeW1zOworCWludAkJbnVtX2tleV9hY3RzOworCWludAkJbnVtX2tleV9iZWhhdmlvcnM7CisJaW50CQludW1fa2V5X2V4cGxpY2l0OworCWludCAJCW51bV9tb2RtYXBfa2V5czsKKwlpbnQgCQludW1fdm1vZG1hcF9rZXlzOworCXVuc2lnbmVkIGludCAJdm1vZHM7CQkvKiBtYXNrIG9mIGNoYW5nZWQgdmlydHVhbCBtb2RzICovCit9IFhrYk1hcE5vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCBfWGtiU3RhdGVOb3RpZnlFdmVudCB7CisJaW50IAkJdHlwZTsJCS8qIFhrYkFueUV2ZW50ICovCisJdW5zaWduZWQgbG9uZyAJc2VyaWFsOwkJLyogIyBvZiBsYXN0IHJlcSBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCAJCXNlbmRfZXZlbnQ7CS8qIGlzIHRoaXMgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0PyAqLworCURpc3BsYXkgKglkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJVGltZSAJCXRpbWU7CQkvKiBtaWxsaXNlY29uZHMgKi8KKwlpbnQgCQl4a2JfdHlwZTsJLyogWGtiU3RhdGVOb3RpZnkgKi8KKwlpbnQgCQlkZXZpY2U7CQkvKiBkZXZpY2UgSUQgKi8KKwl1bnNpZ25lZCBpbnQgCWNoYW5nZWQ7CS8qIG1hc2sgb2YgY2hhbmdlZCBzdGF0ZSBjb21wb25lbnRzICovCisJaW50IAkJZ3JvdXA7CQkvKiBrZXlib2FyZCBncm91cCAqLworCWludCAJCWJhc2VfZ3JvdXA7CS8qIGJhc2Uga2V5Ym9hcmQgZ3JvdXAgKi8KKwlpbnQgCQlsYXRjaGVkX2dyb3VwOwkvKiBsYXRjaGVkIGtleWJvYXJkIGdyb3VwICovCisJaW50IAkJbG9ja2VkX2dyb3VwOwkvKiBsb2NrZWQga2V5Ym9hcmQgZ3JvdXAgKi8KKwl1bnNpZ25lZCBpbnQJbW9kczsJCS8qIG1vZGlmaWVyIHN0YXRlICovCisJdW5zaWduZWQgaW50IAliYXNlX21vZHM7CS8qIGJhc2UgbW9kaWZpZXIgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQJbGF0Y2hlZF9tb2RzOwkvKiBsYXRjaGVkIG1vZGlmaWVycyAqLworCXVuc2lnbmVkIGludAlsb2NrZWRfbW9kczsJLyogbG9ja2VkIG1vZGlmaWVycyAqLworCWludCAJCWNvbXBhdF9zdGF0ZTsJLyogY29tcGF0aWJpbGl0eSBzdGF0ZSAqLworCXVuc2lnbmVkIGNoYXIJZ3JhYl9tb2RzOwkvKiBtb2RzIHVzZWQgZm9yIGdyYWJzICovCisJdW5zaWduZWQgY2hhcgljb21wYXRfZ3JhYl9tb2RzOy8qIGdyYWIgbW9kcyBmb3Igbm9uLVhLQiBjbGllbnRzICovCisJdW5zaWduZWQgY2hhcglsb29rdXBfbW9kczsJLyogbW9kcyBzZW50IHRvIGNsaWVudHMgKi8KKwl1bnNpZ25lZCBjaGFyCWNvbXBhdF9sb29rdXBfbW9kczsgLyogbW9kcyBzZW50IHRvIG5vbi1YS0IgY2xpZW50cyAqLworCWludCAJCXB0cl9idXR0b25zOwkvKiBwb2ludGVyIGJ1dHRvbiBzdGF0ZSAqLworCUtleUNvZGUJCWtleWNvZGU7CS8qIGtleWNvZGUgdGhhdCBjYXVzZWQgdGhlIGNoYW5nZSAqLworCWNoYXIgCQlldmVudF90eXBlOwkvKiBLZXlQcmVzcyBvciBLZXlSZWxlYXNlICovCisJY2hhciAJCXJlcV9tYWpvcjsJLyogTWFqb3Igb3Bjb2RlIG9mIHJlcXVlc3QgKi8KKwljaGFyIAkJcmVxX21pbm9yOwkvKiBNaW5vciBvcGNvZGUgb2YgcmVxdWVzdCAqLworfSBYa2JTdGF0ZU5vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCBfWGtiQ29udHJvbHNOb3RpZnkgeworCWludCAJCXR5cGU7CQkvKiBYa2JBbnlFdmVudCAqLworCXVuc2lnbmVkIGxvbmcgCXNlcmlhbDsJCS8qIG9mIGxhc3QgcmVxIHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIAkJc2VuZF9ldmVudDsJLyogaXMgdGhpcyBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3Q/ICovCisJRGlzcGxheSAqCWRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlUaW1lIAkJdGltZTsJCS8qIG1pbGxpc2Vjb25kcyAqLworCWludCAJCXhrYl90eXBlOwkvKiBYa2JDb250cm9sc05vdGlmeSAqLworCWludCAJCWRldmljZTsJCS8qIGRldmljZSBJRCAqLworCXVuc2lnbmVkIGludAljaGFuZ2VkX2N0cmxzOwkvKiBjb250cm9scyB3aXRoIGNoYW5nZWQgc3ViLXZhbHVlcyAqLworCXVuc2lnbmVkIGludCAJZW5hYmxlZF9jdHJsczsJLyogY29udHJvbHMgY3VycmVudGx5IGVuYWJsZWQgKi8KKwl1bnNpZ25lZCBpbnQJZW5hYmxlZF9jdHJsX2NoYW5nZXM7LyogY29udHJvbHMganVzdCB7ZW4sZGlzfWFibGVkICovCisJaW50IAkJbnVtX2dyb3VwczsJLyogdG90YWwgZ3JvdXBzIG9uIGtleWJvYXJkICovCisJS2V5Q29kZQkJa2V5Y29kZTsJLyoga2V5IHRoYXQgY2F1c2VkIGNoYW5nZSBvciAwICovCisJY2hhciAJCWV2ZW50X3R5cGU7CS8qIHR5cGUgb2YgZXZlbnQgdGhhdCBjYXVzZWQgY2hhbmdlICovCisJY2hhciAJCXJlcV9tYWpvcjsJLyogaWYga2V5Y29kZT09MCwgbWFqb3IgYW5kIG1pbm9yICovCisJY2hhciAJCXJlcV9taW5vcjsJLyogb3Bjb2RlIG9mIHJlcSB0aGF0IGNhdXNlZCBjaGFuZ2UgKi8KK30gWGtiQ29udHJvbHNOb3RpZnlFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkluZGljYXRvck5vdGlmeSB7CisJaW50IAkJdHlwZTsJCS8qIFhrYkFueUV2ZW50ICovCisJdW5zaWduZWQgbG9uZyAJc2VyaWFsOwkJLyogb2YgbGFzdCByZXEgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgCQlzZW5kX2V2ZW50OwkvKiBpcyB0aGlzIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdD8gKi8KKwlEaXNwbGF5ICoJZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVRpbWUgCQl0aW1lOwkJLyogbWlsbGlzZWNvbmRzICovCisJaW50IAkJeGtiX3R5cGU7CS8qIFhrYkluZGljYXRvck5vdGlmeSAqLworCWludCAJCWRldmljZTsJCS8qIGRldmljZSBJRCAqLworCXVuc2lnbmVkIGludAljaGFuZ2VkOwkvKiBpbmRpY2F0b3JzIHdpdGggbmV3IHN0YXRlIG9yIG1hcCAqLworCXVuc2lnbmVkIGludAlzdGF0ZTsJIAkvKiBjdXJyZW50IHN0YXRlIG9mIGFsbCBpbmRpY2F0b3JzICovCit9IFhrYkluZGljYXRvck5vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCBfWGtiTmFtZXNOb3RpZnkgeworCWludCAJCXR5cGU7CQkvKiBYa2JBbnlFdmVudCAqLworCXVuc2lnbmVkIGxvbmcgCXNlcmlhbDsJCS8qIG9mIGxhc3QgcmVxIHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIAkJc2VuZF9ldmVudDsJLyogaXMgdGhpcyBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3Q/ICovCisJRGlzcGxheSAqCWRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlUaW1lIAkJdGltZTsJCS8qIG1pbGxpc2Vjb25kcyAqLworCWludCAJCXhrYl90eXBlOwkvKiBYa2JOYW1lc05vdGlmeSAqLworCWludAkgCWRldmljZTsJCS8qIGRldmljZSBJRCAqLworCXVuc2lnbmVkIGludCAJY2hhbmdlZDsJLyogbmFtZXMgdGhhdCBoYXZlIGNoYW5nZWQgKi8KKwlpbnQJIAlmaXJzdF90eXBlOwkvKiBmaXJzdCBrZXkgdHlwZSB3aXRoIG5ldyBuYW1lICovCisJaW50CSAJbnVtX3R5cGVzOwkvKiBudW1iZXIgb2Yga2V5IHR5cGVzIHdpdGggbmV3IG5hbWVzICovCisJaW50CSAJZmlyc3RfbHZsOwkvKiBmaXJzdCBrZXkgdHlwZSBuZXcgbmV3IGxldmVsIG5hbWVzICovCisJaW50CSAJbnVtX2x2bHM7CS8qICMgb2Yga2V5IHR5cGVzIHcvbmV3IGxldmVsIG5hbWVzICovCisJaW50CSAJbnVtX2FsaWFzZXM7CS8qIHRvdGFsIG51bWJlciBvZiBrZXkgYWxpYXNlcyovCisJaW50CSAJbnVtX3JhZGlvX2dyb3VwczsvKiB0b3RhbCBudW1iZXIgb2YgcmFkaW8gZ3JvdXBzICovCisJdW5zaWduZWQgaW50IAljaGFuZ2VkX3Ztb2RzOwkvKiB2aXJ0dWFsIG1vZGlmaWVycyB3aXRoIG5ldyBuYW1lcyAqLworCXVuc2lnbmVkIGludCAJY2hhbmdlZF9ncm91cHM7CS8qIGdyb3VwcyB3aXRoIG5ldyBuYW1lcyAqLworCXVuc2lnbmVkIGludCAJY2hhbmdlZF9pbmRpY2F0b3JzOy8qIGluZGljYXRvcnMgd2l0aCBuZXcgbmFtZXMgKi8KKwlpbnQJCWZpcnN0X2tleTsJLyogZmlyc3Qga2V5IHdpdGggbmV3IG5hbWUgKi8KKwlpbnQJCW51bV9rZXlzOwkvKiBudW1iZXIgb2Yga2V5cyB3aXRoIG5ldyBuYW1lcyAqLworfSBYa2JOYW1lc05vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCBfWGtiQ29tcGF0TWFwTm90aWZ5IHsKKwlpbnQgCQl0eXBlOwkJLyogWGtiQW55RXZlbnQgKi8KKwl1bnNpZ25lZCBsb25nIAlzZXJpYWw7CQkvKiBvZiBsYXN0IHJlcSBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCAJCXNlbmRfZXZlbnQ7CS8qIGlzIHRoaXMgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0PyAqLworCURpc3BsYXkgKglkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJVGltZSAJCXRpbWU7CQkvKiBtaWxsaXNlY29uZHMgKi8KKwlpbnQgCQl4a2JfdHlwZTsJLyogWGtiQ29tcGF0TWFwTm90aWZ5ICovCisJaW50CSAJZGV2aWNlOwkJLyogZGV2aWNlIElEICovCisJdW5zaWduZWQgaW50IAljaGFuZ2VkX2dyb3VwczsgLyogZ3JvdXBzIHdpdGggbmV3IGNvbXBhdCBtYXBzICovCisJaW50CSAJZmlyc3Rfc2k7CS8qIGZpcnN0IG5ldyBzeW1ib2wgaW50ZXJwICovCisJaW50CSAJbnVtX3NpOwkJLyogbnVtYmVyIG9mIG5ldyBzeW1ib2wgaW50ZXJwcyAqLworCWludAkgCW51bV90b3RhbF9zaTsJLyogdG90YWwgIyBvZiBzeW1ib2wgaW50ZXJwcyAqLworfSBYa2JDb21wYXRNYXBOb3RpZnlFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkJlbGxOb3RpZnkgeworCWludCAJCXR5cGU7CQkvKiBYa2JBbnlFdmVudCAqLworCXVuc2lnbmVkIGxvbmcgCXNlcmlhbDsJCS8qIG9mIGxhc3QgcmVxIHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIAkJc2VuZF9ldmVudDsJLyogaXMgdGhpcyBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3Q/ICovCisJRGlzcGxheSAqCWRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlUaW1lIAkJdGltZTsJCS8qIG1pbGxpc2Vjb25kcyAqLworCWludCAJCXhrYl90eXBlOwkvKiBYa2JCZWxsTm90aWZ5ICovCisJaW50CSAJZGV2aWNlOwkJLyogZGV2aWNlIElEICovCisJaW50CSAJcGVyY2VudDsJLyogcmVxdWVzdGVkIHZvbHVtZSBhcyBhICUgb2YgbWF4aW11bSAqLworCWludAkgCXBpdGNoOwkJLyogcmVxdWVzdGVkIHBpdGNoIGluIEh6ICovCisJaW50CSAJZHVyYXRpb247CS8qIHJlcXVlc3RlZCBkdXJhdGlvbiBpbiB1c2Vjb25kcyAqLworCWludAkgCWJlbGxfY2xhc3M7CS8qIChpbnB1dCBleHRlbnNpb24pIGZlZWRiYWNrIGNsYXNzICovCisJaW50CSAJYmVsbF9pZDsJLyogKGlucHV0IGV4dGVuc2lvbikgSUQgb2YgZmVlZGJhY2sgKi8KKwlBdG9tIAkJbmFtZTsJCS8qICJuYW1lIiBvZiByZXF1ZXN0ZWQgYmVsbCAqLworCVdpbmRvdyAJCXdpbmRvdzsJCS8qIHdpbmRvdyBhc3NvY2lhdGVkIHdpdGggZXZlbnQgKi8KKwlCb29sCQlldmVudF9vbmx5OwkvKiAiZXZlbnQgb25seSIgcmVxdWVzdGVkICovCit9IFhrYkJlbGxOb3RpZnlFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkFjdGlvbk1lc3NhZ2UgeworCWludCAJCXR5cGU7CQkvKiBYa2JBbnlFdmVudCAqLworCXVuc2lnbmVkIGxvbmcgCXNlcmlhbDsJCS8qIG9mIGxhc3QgcmVxIHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIAkJc2VuZF9ldmVudDsJLyogaXMgdGhpcyBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3Q/ICovCisJRGlzcGxheSAqCWRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlUaW1lIAkJdGltZTsJCS8qIG1pbGxpc2Vjb25kcyAqLworCWludCAJCXhrYl90eXBlOwkvKiBYa2JBY3Rpb25NZXNzYWdlICovCisJaW50CSAJZGV2aWNlOwkJLyogZGV2aWNlIElEICovCisJS2V5Q29kZQkJa2V5Y29kZTsJLyoga2V5IHRoYXQgZ2VuZXJhdGVkIHRoZSBldmVudCAqLworCUJvb2wgCQlwcmVzczsJCS8qIHRydWUgaWYgYWN0IGNhdXNlZCBieSBrZXkgcHJlc3MgKi8KKwlCb29sIAkJa2V5X2V2ZW50X2ZvbGxvd3M7LyogdHJ1ZSBpZiBrZXkgZXZlbnQgYWxzbyBnZW5lcmF0ZWQgKi8KKwlpbnQJCWdyb3VwOwkJLyogZWZmZWN0aXZlIGdyb3VwICovCisJdW5zaWduZWQgaW50CW1vZHM7CQkvKiBlZmZlY3RpdmUgbW9kcyAqLworCWNoYXIgCQltZXNzYWdlW1hrYkFjdGlvbk1lc3NhZ2VMZW5ndGgrMV07CisJCQkJCS8qIG1lc3NhZ2UgLS0gbGVhdmUgc3BhY2UgZm9yIE5VTCAqLworfSBYa2JBY3Rpb25NZXNzYWdlRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JBY2Nlc3NYTm90aWZ5IHsKKwlpbnQgCQl0eXBlOwkJLyogWGtiQW55RXZlbnQgKi8KKwl1bnNpZ25lZCBsb25nIAlzZXJpYWw7CQkvKiBvZiBsYXN0IHJlcSBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCAJCXNlbmRfZXZlbnQ7CS8qIGlzIHRoaXMgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0PyAqLworCURpc3BsYXkgKglkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJVGltZSAJCXRpbWU7CQkvKiBtaWxsaXNlY29uZHMgKi8KKwlpbnQgCQl4a2JfdHlwZTsJLyogWGtiQWNjZXNzWE5vdGlmeSAqLworCWludAkgCWRldmljZTsJCS8qIGRldmljZSBJRCAqLworCWludAkgCWRldGFpbDsJCS8qIFhrYkFYTl8qICovCisJaW50CSAJa2V5Y29kZTsJLyoga2V5IG9mIGV2ZW50ICovCisJaW50CSAJc2tfZGVsYXk7CS8qIGN1cnJlbnQgc2xvdyBrZXlzIGRlbGF5ICovCisJaW50CQlkZWJvdW5jZV9kZWxheTsJLyogY3VycmVudCBkZWJvdW5jZSBkZWxheSAqLworfSBYa2JBY2Nlc3NYTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JFeHRlbnNpb25EZXZpY2VOb3RpZnkgeworCWludCAJCXR5cGU7CQkvKiBYa2JBbnlFdmVudCAqLworCXVuc2lnbmVkIGxvbmcgCXNlcmlhbDsJCS8qIG9mIGxhc3QgcmVxIHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIAkJc2VuZF9ldmVudDsJLyogaXMgdGhpcyBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3Q/ICovCisJRGlzcGxheSAqCWRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlUaW1lIAkJdGltZTsJCS8qIG1pbGxpc2Vjb25kcyAqLworCWludCAJCXhrYl90eXBlOwkvKiBYa2JFeHRlbnNpb25EZXZpY2VOb3RpZnkgKi8KKwlpbnQJIAlkZXZpY2U7CQkvKiBkZXZpY2UgSUQgKi8KKwl1bnNpZ25lZCBpbnQJcmVhc29uOwkJLyogcmVhc29uIGZvciB0aGUgZXZlbnQgKi8KKwl1bnNpZ25lZCBpbnQJc3VwcG9ydGVkOwkvKiBtYXNrIG9mIHN1cHBvcnRlZCBmZWF0dXJlcyAqLworCXVuc2lnbmVkIGludAl1bnN1cHBvcnRlZDsJLyogbWFzayBvZiB1bnN1cHBvcnRlZCBmZWF0dXJlcyAqLworCQkJCQkvKiB0aGF0IHNvbWUgYXBwIHRyaWVkIHRvIHVzZSAqLworCWludAkgCWZpcnN0X2J0bjsJLyogZmlyc3QgYnV0dG9uIHRoYXQgY2hhbmdlZCAqLworCWludAkgCW51bV9idG5zOwkvKiByYW5nZSBvZiBidXR0b25zIGNoYW5nZWQgKi8KKwl1bnNpZ25lZCBpbnQJbGVkc19kZWZpbmVkOyAgIC8qIGluZGljYXRvcnMgd2l0aCBuYW1lcyBvciBtYXBzICovCisJdW5zaWduZWQgaW50CWxlZF9zdGF0ZTsJLyogY3VycmVudCBzdGF0ZSBvZiB0aGUgaW5kaWNhdG9ycyAqLworCWludAkJbGVkX2NsYXNzOwkvKiBmZWVkYmFjayBjbGFzcyBmb3IgbGVkIGNoYW5nZXMgKi8KKwlpbnQJCWxlZF9pZDsgICAJLyogZmVlZGJhY2sgaWQgZm9yIGxlZCBjaGFuZ2VzICovCit9IFhrYkV4dGVuc2lvbkRldmljZU5vdGlmeUV2ZW50OworCit0eXBlZGVmIHVuaW9uIF9Ya2JFdmVudCB7CisJaW50CQkJCXR5cGU7CisJWGtiQW55RXZlbnQJCQlhbnk7CisJWGtiTmV3S2V5Ym9hcmROb3RpZnlFdmVudAluZXdfa2JkOworCVhrYk1hcE5vdGlmeUV2ZW50CQltYXA7CisJWGtiU3RhdGVOb3RpZnlFdmVudAkJc3RhdGU7CisJWGtiQ29udHJvbHNOb3RpZnlFdmVudAkJY3RybHM7CisJWGtiSW5kaWNhdG9yTm90aWZ5RXZlbnQgCWluZGljYXRvcnM7CisJWGtiTmFtZXNOb3RpZnlFdmVudAkJbmFtZXM7CisJWGtiQ29tcGF0TWFwTm90aWZ5RXZlbnQJCWNvbXBhdDsKKwlYa2JCZWxsTm90aWZ5RXZlbnQJCWJlbGw7CisJWGtiQWN0aW9uTWVzc2FnZUV2ZW50CQltZXNzYWdlOworCVhrYkFjY2Vzc1hOb3RpZnlFdmVudAkJYWNjZXNzeDsKKwlYa2JFeHRlbnNpb25EZXZpY2VOb3RpZnlFdmVudCAJZGV2aWNlOworCVhFdmVudAkJCQljb3JlOworfSBYa2JFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QJX1hrYktiZERweVN0YXRlCVhrYktiZERweVN0YXRlUmVjLCpYa2JLYmREcHlTdGF0ZVB0cjsKKworCS8qIFhrYk9wZW5EaXNwbGF5IGVycm9yIGNvZGVzICovCisjZGVmaW5lCVhrYk9EX1N1Y2Nlc3MJCTAKKyNkZWZpbmUJWGtiT0RfQmFkTGlicmFyeVZlcnNpb24JMQorI2RlZmluZQlYa2JPRF9Db25uZWN0aW9uUmVmdXNlZAkyCisjZGVmaW5lCVhrYk9EX05vblhrYlNlcnZlcgkzCisjZGVmaW5lCVhrYk9EX0JhZFNlcnZlclZlcnNpb24JNAorCisJLyogVmFsdWVzIGZvciBYbGliRmxhZ3MgKi8KKyNkZWZpbmUJWGtiTENfRm9yY2VMYXRpbjFMb29rdXAJCSgxPDwwKQorI2RlZmluZQlYa2JMQ19Db25zdW1lTG9va3VwTW9kcwkJKDE8PDEpCisjZGVmaW5lCVhrYkxDX0Fsd2F5c0NvbnN1bWVTaGlmdEFuZExvY2sgKDE8PDIpCisjZGVmaW5lCVhrYkxDX0lnbm9yZU5ld0tleWJvYXJkcwkoMTw8MykKKyNkZWZpbmUJWGtiTENfQ29udHJvbEZhbGxiYWNrCQkoMTw8NCkKKyNkZWZpbmUJWGtiTENfQ29uc3VtZUtleXNPbkNvbXBvc2VGYWlsCSgxPDwyOSkKKyNkZWZpbmUJWGtiTENfQ29tcG9zZUxFRAkJKDE8PDMwKQorI2RlZmluZQlYa2JMQ19CZWVwT25Db21wb3NlRmFpbAkJKDE8PDMxKQorCisjZGVmaW5lCVhrYkxDX0FsbENvbXBvc2VDb250cm9scwkoMHhjMDAwMDAwMCkKKyNkZWZpbmUJWGtiTENfQWxsQ29udHJvbHMJCSgweGMwMDAwMDFmKQorCitfWEZVTkNQUk9UT0JFR0lOCisKK2V4dGVybglCb29sCVhrYklnbm9yZUV4dGVuc2lvbigKKwlCb29sCQkJLyogaWdub3JlICovCispOworCitleHRlcm4JRGlzcGxheSAqWGtiT3BlbkRpc3BsYXkoCisJY2hhciAqCQkJLyogbmFtZSAqLywKKwlpbnQgKgkJCS8qIGV2X3J0cm4gKi8sCisJaW50ICoJCQkvKiBlcnJfcnRybiAqLywKKwlpbnQgKgkJCS8qIG1ham9yX3J0cm4gKi8sCisJaW50ICoJCQkvKiBtaW5vcl9ydHJuICovLAorCWludCAqCQkJLyogcmVhc29uICovCispOworCitleHRlcm4JQm9vbAlYa2JRdWVyeUV4dGVuc2lvbigKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwlpbnQgKgkJCS8qIG9wY29kZVJldHVybiAqLywKKwlpbnQgKgkJCS8qIGV2ZW50QmFzZVJldHVybiAqLywKKwlpbnQgKgkJCS8qIGVycm9yQmFzZVJldHVybiAqLywKKwlpbnQgKgkJCS8qIG1ham9yUnRybiAqLywKKwlpbnQgKgkJCS8qIG1pbm9yUnRybiAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiVXNlRXh0ZW5zaW9uKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCWludCAqCQkJLyogbWFqb3JfcnRybiAqLywKKwlpbnQgKgkJCS8qIG1pbm9yX3J0cm4gKi8KKyk7CisKK2V4dGVybglCb29sCVhrYkxpYnJhcnlWZXJzaW9uKAorCWludCAqCQkJLyogbGliTWFqb3JSdHJuICovLAorCWludCAqCQkJLyogbGliTWlub3JSdHJuICovCispOworCitleHRlcm4JdW5zaWduZWQgaW50CVhrYlNldFhsaWJDb250cm9scygKKwlEaXNwbGF5KgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludAkJLyogYWZmZWN0ICovLAorCXVuc2lnbmVkIGludAkJLyogdmFsdWVzICovCispOworCitleHRlcm4JdW5zaWduZWQgaW50CVhrYkdldFhsaWJDb250cm9scygKKwlEaXNwbGF5KgkJLyogZHB5ICovCispOworCitleHRlcm4JdW5zaWduZWQgaW50CVhrYlhsaWJDb250cm9sc0ltcGxlbWVudGVkKHZvaWQpOworCit0eXBlZGVmCUF0b20JKCpYa2JJbnRlcm5BdG9tRnVuYykoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJX1hjb25zdCBjaGFyICoJCS8qIG5hbWUgKi8sCisJQm9vbAkJCS8qIG9ubHlfaWZfZXhpc3RzICovCispOworCit0eXBlZGVmIGNoYXIgKgkoKlhrYkdldEF0b21OYW1lRnVuYykoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJQXRvbQkJCS8qIGF0b20gKi8KKyk7CisKK2V4dGVybiB2b2lkCQlYa2JTZXRBdG9tRnVuY3MoCisJWGtiSW50ZXJuQXRvbUZ1bmMJLyogZ2V0QXRvbSAqLywKKwlYa2JHZXRBdG9tTmFtZUZ1bmMJLyogZ2V0TmFtZSAqLworKTsKKworZXh0ZXJuCUtleVN5bSBYa2JLZXljb2RlVG9LZXlzeW0oCisJCURpc3BsYXkgKgkvKiBkcHkgKi8sCisjaWYgTmVlZFdpZGVQcm90b3R5cGVzCisJCSB1bnNpZ25lZCBpbnQgCS8qIGtjICovLAorI2Vsc2UKKwkJIEtleUNvZGUgCS8qIGtjICovLAorI2VuZGlmCisJCSBpbnQgCQkvKiBncm91cCAqLywKKwkJIGludAkJLyogbGV2ZWwgKi8KKyk7CisKK2V4dGVybgl1bnNpZ25lZCBpbnQJWGtiS2V5c3ltVG9Nb2RpZmllcnMoCisgICAgRGlzcGxheSAqCQkJLyogZHB5ICovLAorICAgIEtleVN5bSAJCQkvKiBrcyAqLworKTsKKworZXh0ZXJuCUJvb2wJCVhrYkxvb2t1cEtleVN5bSgKKyAgICBEaXNwbGF5ICoJCQkvKiBkcHkgKi8sCisgICAgS2V5Q29kZSAJCQkvKiBrZXljb2RlICovLAorICAgIHVuc2lnbmVkIGludCAJCS8qIG1vZGlmaWVycyAqLywKKyAgICB1bnNpZ25lZCBpbnQgKgkJLyogbW9kaWZpZXJzX3JldHVybiAqLywKKyAgICBLZXlTeW0gKgkJCS8qIGtleXN5bV9yZXR1cm4gKi8KKyk7CisKK2V4dGVybglpbnQJCVhrYkxvb2t1cEtleUJpbmRpbmcoCisgICAgRGlzcGxheSAqCQkJLyogZHB5ICovLAorICAgIEtleVN5bSAJCQkvKiBzeW1fcnRybiAqLywKKyAgICB1bnNpZ25lZCBpbnQgCQkvKiBtb2RzICovLAorICAgIGNoYXIgKgkJCS8qIGJ1ZmZlciAqLywKKyAgICBpbnQgCQkJLyogbmJ5dGVzICovLAorICAgIGludCAqIAkJCS8qIGV4dHJhX3J0cm4gKi8KKyk7CisKK2V4dGVybglCb29sCQlYa2JUcmFuc2xhdGVLZXlDb2RlKAorICAgIFhrYkRlc2NQdHIJCQkvKiB4a2IgKi8sCisgICAgS2V5Q29kZSAJCQkvKiBrZXljb2RlICovLAorICAgIHVuc2lnbmVkIGludCAJCS8qIG1vZGlmaWVycyAqLywKKyAgICB1bnNpZ25lZCBpbnQgKgkJLyogbW9kaWZpZXJzX3JldHVybiAqLywKKyAgICBLZXlTeW0gKgkJCS8qIGtleXN5bV9yZXR1cm4gKi8KKyk7CisKK2V4dGVybglpbnQJCVhrYlRyYW5zbGF0ZUtleVN5bSgKKyAgICBEaXNwbGF5ICoJCQkvKiBkcHkgKi8sCisgICAgcmVnaXN0ZXIgS2V5U3ltICoJCS8qIHN5bV9yZXR1cm4gKi8sCisgICAgdW5zaWduZWQgaW50IAkJLyogbW9kaWZpZXJzICovLAorICAgIGNoYXIgKgkJCS8qIGJ1ZmZlciAqLywKKyAgICBpbnQgCQkJLyogbmJ5dGVzICovLAorICAgIGludCAqCQkJLyogZXh0cmFfcnRybiAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiU2V0QXV0b1JlcGVhdFJhdGUoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBkZXZpY2VTcGVjICovLAorCXVuc2lnbmVkIGludAkJLyogZGVsYXkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBpbnRlcnZhbCAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiR2V0QXV0b1JlcGVhdFJhdGUoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBkZXZpY2VTcGVjICovLAorCXVuc2lnbmVkIGludCAqCQkvKiBkZWxheVJ0cm4gKi8sCisJdW5zaWduZWQgaW50ICoJCS8qIGludGVydmFsUnRybiAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiQ2hhbmdlRW5hYmxlZENvbnRyb2xzKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludAkJLyogZGV2aWNlU3BlYyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGFmZmVjdCAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHZhbHVlcyAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiRGV2aWNlQmVsbCgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwlXaW5kb3cJCQkvKiB3aW4gKi8sCisJaW50CQkJLyogZGV2aWNlU3BlYyAqLywKKwlpbnQJCQkvKiBiZWxsQ2xhc3MgKi8sCisJaW50CQkJLyogYmVsbElEICovLAorCWludAkJCS8qIHBlcmNlbnQgKi8sCisJQXRvbQkJCS8qIG5hbWUgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYkZvcmNlRGV2aWNlQmVsbCgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwlpbnQJCQkvKiBkZXZpY2VTcGVjICovLAorCWludAkJCS8qIGJlbGxDbGFzcyAqLywKKwlpbnQJCQkvKiBiZWxsSUQgKi8sCisJaW50CQkJLyogcGVyY2VudCAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiRGV2aWNlQmVsbEV2ZW50KAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCVdpbmRvdwkJCS8qIHdpbiAqLywKKwlpbnQJCQkvKiBkZXZpY2VTcGVjICovLAorCWludAkJCS8qIGJlbGxDbGFzcyAqLywKKwlpbnQJCQkvKiBiZWxsSUQgKi8sCisJaW50CQkJLyogcGVyY2VudCAqLywKKwlBdG9tCQkJLyogbmFtZSAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiQmVsbCgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwlXaW5kb3cJCQkvKiB3aW4gKi8sCisJaW50CQkJLyogcGVyY2VudCAqLywKKwlBdG9tCQkJLyogbmFtZSAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiRm9yY2VCZWxsKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCWludAkJCS8qIHBlcmNlbnQgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYkJlbGxFdmVudCgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwlXaW5kb3cJCQkvKiB3aW4gKi8sCisJaW50CQkJLyogcGVyY2VudCAqLywKKwlBdG9tCQkJLyogbmFtZSAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiU2VsZWN0RXZlbnRzKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludAkJLyogZGV2aWNlSUQgKi8sCisJdW5zaWduZWQgaW50IAkJLyogYWZmZWN0ICovLAorCXVuc2lnbmVkIGludCAJCS8qIHZhbHVlcyAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiU2VsZWN0RXZlbnREZXRhaWxzKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludCAJCS8qIGRldmljZUlEICovLAorCXVuc2lnbmVkIGludCAJCS8qIGV2ZW50VHlwZSAqLywKKwl1bnNpZ25lZCBsb25nIAkJLyogYWZmZWN0ICovLAorCXVuc2lnbmVkIGxvbmcgCQkvKiBkZXRhaWxzICovCispOworCitleHRlcm4Jdm9pZAlYa2JOb3RlTWFwQ2hhbmdlcygKKyAgICBYa2JNYXBDaGFuZ2VzUHRyCQkvKiBvbGQgKi8sCisgICAgWGtiTWFwTm90aWZ5RXZlbnQJKgkvKiBuZXcgKi8sCisgICAgdW5zaWduZWQgaW50CSAJLyogd2FudGVkICovCispOworCitleHRlcm4Jdm9pZAlYa2JOb3RlTmFtZUNoYW5nZXMoCisgICAgWGtiTmFtZUNoYW5nZXNQdHIJCS8qIG9sZCAqLywKKyAgICBYa2JOYW1lc05vdGlmeUV2ZW50CSoJLyogbmV3ICovLAorICAgIHVuc2lnbmVkIGludAkgCS8qIHdhbnRlZCAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JHZXRJbmRpY2F0b3JTdGF0ZSgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGRldmljZVNwZWMgKi8sCisJdW5zaWduZWQgaW50ICoJCS8qIHBTdGF0ZVJ0cm4gKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiR2V0RGV2aWNlSW5kaWNhdG9yU3RhdGUoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBkZXZpY2VTcGVjICovLAorCXVuc2lnbmVkIGludAkJLyogbGVkQ2xhc3MgKi8sCisJdW5zaWduZWQgaW50CQkvKiBsZWRJRCAqLywKKwl1bnNpZ25lZCBpbnQgKgkJLyogcFN0YXRlUnRybiAqLworKTsKKworZXh0ZXJuCVN0YXR1cwkgWGtiR2V0SW5kaWNhdG9yTWFwKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGxvbmcJCS8qIHdoaWNoICovLAorCVhrYkRlc2NQdHIJCS8qIGRlc2MgKi8KKyk7CisKK2V4dGVybglCb29sCSBYa2JTZXRJbmRpY2F0b3JNYXAoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgbG9uZyAJCS8qIHdoaWNoICovLAorCVhrYkRlc2NQdHIJCS8qIGRlc2MgKi8KKyk7CisKKyNkZWZpbmUJWGtiTm90ZUluZGljYXRvck1hcENoYW5nZXMobyxuLHcpIFwKKwkJCQkoKG8pLT5tYXBfY2hhbmdlc3w9KChuKS0+bWFwX2NoYW5nZXMmKHcpKSkKKyNkZWZpbmUJWGtiTm90ZUluZGljYXRvclN0YXRlQ2hhbmdlcyhvLG4sdylcCisJCQkJKChvKS0+c3RhdGVfY2hhbmdlc3w9KChuKS0+c3RhdGVfY2hhbmdlcyYodykpKQorI2RlZmluZQlYa2JHZXRJbmRpY2F0b3JNYXBDaGFuZ2VzKGQseCxjKSBcCisJCQkJKFhrYkdldEluZGljYXRvck1hcCgoZCksKGMpLT5tYXBfY2hhbmdlcyx4KSkKKyNkZWZpbmUJWGtiQ2hhbmdlSW5kaWNhdG9yTWFwcyhkLHgsYykgXAorCQkJCShYa2JTZXRJbmRpY2F0b3JNYXAoKGQpLChjKS0+bWFwX2NoYW5nZXMseCkpCisKK2V4dGVybglCb29sCVhrYkdldE5hbWVkSW5kaWNhdG9yKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCUF0b20JCQkvKiBuYW1lICovLAorCWludCAqCQkJLyogcE5keFJ0cm4gKi8sCisJQm9vbCAqCQkJLyogcFN0YXRlUnRybiAqLywKKwlYa2JJbmRpY2F0b3JNYXBQdHIJLyogcE1hcFJ0cm4gKi8sCisJQm9vbCAqCQkJLyogcFJlYWxSdHJuICovCispOworCitleHRlcm4JQm9vbAlYa2JHZXROYW1lZERldmljZUluZGljYXRvcigKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGRldmljZVNwZWMgKi8sCisJdW5zaWduZWQgaW50CQkvKiBsZWRDbGFzcyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGxlZElEICovLAorCUF0b20JCQkvKiBuYW1lICovLAorCWludCAqCQkJLyogcE5keFJ0cm4gKi8sCisJQm9vbCAqCQkJLyogcFN0YXRlUnRybiAqLywKKwlYa2JJbmRpY2F0b3JNYXBQdHIJLyogcE1hcFJ0cm4gKi8sCisJQm9vbCAqCQkJLyogcFJlYWxSdHJuICovCispOworCitleHRlcm4JQm9vbAlYa2JTZXROYW1lZEluZGljYXRvcigKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwlBdG9tCQkJLyogbmFtZSAqLywKKwlCb29sCQkJLyogY2hhbmdlU3RhdGUgKi8sCisJQm9vbCAJCQkvKiBzdGF0ZSAqLywKKwlCb29sCQkJLyogY3JlYXRlTmV3TWFwICovLAorCVhrYkluZGljYXRvck1hcFB0cgkvKiBwTWFwICovCispOworCitleHRlcm4JQm9vbAlYa2JTZXROYW1lZERldmljZUluZGljYXRvcigKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGRldmljZVNwZWMgKi8sCisJdW5zaWduZWQgaW50CQkvKiBsZWRDbGFzcyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGxlZElEICovLAorCUF0b20JCQkvKiBuYW1lICovLAorCUJvb2wJCQkvKiBjaGFuZ2VTdGF0ZSAqLywKKwlCb29sIAkJCS8qIHN0YXRlICovLAorCUJvb2wJCQkvKiBjcmVhdGVOZXdNYXAgKi8sCisJWGtiSW5kaWNhdG9yTWFwUHRyCS8qIHBNYXAgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYkxvY2tNb2RpZmllcnMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50IAkJLyogZGV2aWNlU3BlYyAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBhZmZlY3QgKi8sCisJdW5zaWduZWQgaW50IAkJLyogdmFsdWVzICovCispOworCitleHRlcm4JQm9vbAlYa2JMYXRjaE1vZGlmaWVycygKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBkZXZpY2VTcGVjICovLAorCXVuc2lnbmVkIGludCAJCS8qIGFmZmVjdCAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiB2YWx1ZXMgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYkxvY2tHcm91cCgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBkZXZpY2VTcGVjICovLAorCXVuc2lnbmVkIGludCAJCS8qIGdyb3VwICovCispOworCitleHRlcm4JQm9vbAlYa2JMYXRjaEdyb3VwKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludCAJCS8qIGRldmljZVNwZWMgKi8sCisJdW5zaWduZWQgaW50IAkJLyogZ3JvdXAgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYlNldFNlcnZlckludGVybmFsTW9kcygKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBkZXZpY2VTcGVjICovLAorCXVuc2lnbmVkIGludCAJCS8qIGFmZmVjdFJlYWwgKi8sCisJdW5zaWduZWQgaW50IAkJLyogcmVhbFZhbHVlcyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGFmZmVjdFZpcnR1YWwgKi8sCisJdW5zaWduZWQgaW50CQkvKiB2aXJ0dWFsVmFsdWVzICovCispOworCitleHRlcm4JQm9vbAlYa2JTZXRJZ25vcmVMb2NrTW9kcygKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBkZXZpY2VTcGVjICovLAorCXVuc2lnbmVkIGludCAJCS8qIGFmZmVjdFJlYWwgKi8sCisJdW5zaWduZWQgaW50IAkJLyogcmVhbFZhbHVlcyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGFmZmVjdFZpcnR1YWwgKi8sCisJdW5zaWduZWQgaW50CQkvKiB2aXJ0dWFsVmFsdWVzICovCispOworCisKK2V4dGVybglCb29sCVhrYlZpcnR1YWxNb2RzVG9SZWFsKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHZpcnR1YWxfbWFzayAqLywKKwl1bnNpZ25lZCBpbnQgKgkJLyogbWFza19ydHJuICovCispOworCitleHRlcm4JQm9vbAlYa2JDb21wdXRlRWZmZWN0aXZlTWFwKAorCVhrYkRlc2NQdHIgCQkvKiB4a2IgKi8sCisJWGtiS2V5VHlwZVB0cgkJLyogdHlwZSAqLywKKwl1bnNpZ25lZCBjaGFyICoJCS8qIG1hcF9ydHJuICovCispOworCitleHRlcm4JU3RhdHVzIFhrYkluaXRDYW5vbmljYWxLZXlUeXBlcygKKyAgICBYa2JEZXNjUHRyCQkJLyogeGtiICovLAorICAgIHVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisgICAgaW50CQkJCS8qIGtleXBhZFZNb2QgKi8KKyk7CisKK2V4dGVybglYa2JEZXNjUHRyIFhrYkFsbG9jS2V5Ym9hcmQoCisJdm9pZAorKTsKKworZXh0ZXJuCXZvaWQJWGtiRnJlZUtleWJvYXJkKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorCUJvb2wJCQkvKiBmcmVlRGVzYyAqLworKTsKKworZXh0ZXJuCVN0YXR1cyBYa2JBbGxvY0NsaWVudE1hcCgKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIG5UeXBlcyAqLworKTsKKworZXh0ZXJuCVN0YXR1cyBYa2JBbGxvY1NlcnZlck1hcCgKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIG5BY3Rpb25zICovCispOworCitleHRlcm4Jdm9pZAlYa2JGcmVlQ2xpZW50TWFwKAorICAgIFhrYkRlc2NQdHIJCQkvKiB4a2IgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiB3aGF0ICovLAorICAgIEJvb2wJCQkvKiBmcmVlTWFwICovCispOworCitleHRlcm4Jdm9pZAlYa2JGcmVlU2VydmVyTWFwKAorICAgIFhrYkRlc2NQdHIJCQkvKiB4a2IgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiB3aGF0ICovLAorICAgIEJvb2wJCQkvKiBmcmVlTWFwICovCispOworCitleHRlcm4JWGtiS2V5VHlwZVB0cglYa2JBZGRLZXlUeXBlKAorICAgIFhrYkRlc2NQdHIJCQkvKiB4a2IgKi8sCisgICAgQXRvbQkJCS8qIG5hbWUgKi8sCisgICAgaW50CQkJCS8qIG1hcF9jb3VudCAqLywKKyAgICBCb29sCQkJLyogd2FudF9wcmVzZXJ2ZSAqLywKKyAgICBpbnQJCQkJLyogbnVtX2x2bHMgKi8KKyk7CisKK2V4dGVybglTdGF0dXMgWGtiQWxsb2NJbmRpY2F0b3JNYXBzKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiRnJlZUluZGljYXRvck1hcHMoCisgICAgWGtiRGVzY1B0cgkJCS8qIHhrYiAqLworKTsKKworZXh0ZXJuCVhrYkRlc2NQdHIgWGtiR2V0TWFwKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludCAJCS8qIHdoaWNoICovLAorCXVuc2lnbmVkIGludCAJCS8qIGRldmljZVNwZWMgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiR2V0VXBkYXRlZE1hcCgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiB3aGljaCAqLywKKwlYa2JEZXNjUHRyCQkvKiBkZXNjICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkdldE1hcENoYW5nZXMoCisgICAgRGlzcGxheSAqCQkJLyogZHB5ICovLAorICAgIFhrYkRlc2NQdHIJCQkvKiB4a2IgKi8sCisgICAgWGtiTWFwQ2hhbmdlc1B0cgkJLyogY2hhbmdlcyAqLworKTsKKworCitleHRlcm4JU3RhdHVzCVhrYlJlZnJlc2hLZXlib2FyZE1hcHBpbmcoCisgICAgWGtiTWFwTm90aWZ5RXZlbnQgKgkJLyogZXZlbnQgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiR2V0S2V5VHlwZXMoCisgICAgRGlzcGxheSAqCQkJLyogZHB5ICovLAorICAgIHVuc2lnbmVkIGludAkJLyogZmlyc3QgKi8sCisgICAgdW5zaWduZWQgaW50IAkJLyogbnVtICovLAorICAgIFhrYkRlc2NQdHIJCQkvKiB4a2IgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiR2V0S2V5U3ltcygKKyAgICBEaXNwbGF5ICoJCQkvKiBkcHkgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBmaXJzdCAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIG51bSAqLywKKyAgICBYa2JEZXNjUHRyCQkJLyogeGtiICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkdldEtleUFjdGlvbnMoCisgICAgRGlzcGxheSAqCQkJLyogZHB5ICovLAorICAgIHVuc2lnbmVkIGludCAJCS8qIGZpcnN0ICovLAorICAgIHVuc2lnbmVkIGludCAJCS8qIG51bSAqLywKKyAgICBYa2JEZXNjUHRyCQkJLyogeGtiICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkdldEtleUJlaGF2aW9ycygKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBmaXJzdEtleSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIG5LZXlzICovLAorCVhrYkRlc2NQdHIJCS8qIGRlc2MgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiR2V0VmlydHVhbE1vZHMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50IAkJLyogd2hpY2ggKi8sCisJWGtiRGVzY1B0cgkJLyogZGVzYyAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JHZXRLZXlFeHBsaWNpdENvbXBvbmVudHMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50IAkJLyogZmlyc3RLZXkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBuS2V5cyAqLywKKwlYa2JEZXNjUHRyCQkvKiBkZXNjICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkdldEtleU1vZGlmaWVyTWFwKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludCAJCS8qIGZpcnN0S2V5ICovLAorCXVuc2lnbmVkIGludAkJLyogbktleXMgKi8sCisJWGtiRGVzY1B0cgkJLyogZGVzYyAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JHZXRLZXlWaXJ0dWFsTW9kTWFwKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludAkJLyogZmlyc3QgKi8sCisJdW5zaWduZWQgaW50CQkvKiBudW0gKi8sCisJWGtiRGVzY1B0cgkJLyogeGtiICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkFsbG9jQ29udHJvbHMoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2gqLworKTsKKworZXh0ZXJuCXZvaWQJWGtiRnJlZUNvbnRyb2xzKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorCUJvb2wJCQkvKiBmcmVlTWFwICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkdldENvbnRyb2xzKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGxvbmcJCS8qIHdoaWNoICovLAorCVhrYkRlc2NQdHIJCS8qIGRlc2MgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYlNldENvbnRyb2xzKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGxvbmcJCS8qIHdoaWNoICovLAorCVhrYkRlc2NQdHIJCS8qIGRlc2MgKi8KKyk7CisKK2V4dGVybgl2b2lkCVhrYk5vdGVDb250cm9sc0NoYW5nZXMoCisgICAgWGtiQ29udHJvbHNDaGFuZ2VzUHRyCS8qIG9sZCAqLywKKyAgICBYa2JDb250cm9sc05vdGlmeUV2ZW50ICoJLyogbmV3ICovLAorICAgIHVuc2lnbmVkIGludAkgCS8qIHdhbnRlZCAqLworKTsKKworI2RlZmluZQlYa2JHZXRDb250cm9sc0NoYW5nZXMoZCx4LGMpCVhrYkdldENvbnRyb2xzKGQsKGMpLT5jaGFuZ2VkX2N0cmxzLHgpCisjZGVmaW5lCVhrYkNoYW5nZUNvbnRyb2xzKGQseCxjKQlYa2JTZXRDb250cm9scyhkLChjKS0+Y2hhbmdlZF9jdHJscyx4KQorCitleHRlcm4JU3RhdHVzCVhrYkFsbG9jQ29tcGF0TWFwKAorICAgIFhrYkRlc2NQdHIJCQkvKiB4a2IgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIG5JbnRlcnByZXQgKi8KKyk7CisKK2V4dGVybgl2b2lkCVhrYkZyZWVDb21wYXRNYXAoCisgICAgWGtiRGVzY1B0cgkJCS8qIHhrYiAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorICAgIEJvb2wJCQkvKiBmcmVlTWFwICovCispOworCitleHRlcm4gU3RhdHVzIFhrYkdldENvbXBhdE1hcCgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiB3aGljaCAqLywKKwlYa2JEZXNjUHRyIAkJLyogeGtiICovCispOworCitleHRlcm4gQm9vbCBYa2JTZXRDb21wYXRNYXAoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50IAkJLyogd2hpY2ggKi8sCisJWGtiRGVzY1B0ciAJCS8qIHhrYiAqLywKKwlCb29sCQkJLyogdXBkYXRlQWN0aW9ucyAqLworKTsKKworZXh0ZXJuCVhrYlN5bUludGVycHJldFB0ciBYa2JBZGRTeW1JbnRlcnByZXQoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCVhrYlN5bUludGVycHJldFB0cgkvKiBzaSAqLywKKwlCb29sCQkJLyogdXBkYXRlTWFwICovLAorCVhrYkNoYW5nZXNQdHIJCS8qIGNoYW5nZXMgKi8KKyk7CisKK2V4dGVybglTdGF0dXMgWGtiQWxsb2NOYW1lcygKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKwlpbnQJCQkvKiBuVG90YWxSRyAqLywKKwlpbnQJCQkvKiBuVG90YWxBbGlhc2VzICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkdldE5hbWVzKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisJWGtiRGVzY1B0cgkJLyogZGVzYyAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiU2V0TmFtZXMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGZpcnN0VHlwZSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIG5UeXBlcyAqLywKKwlYa2JEZXNjUHRyCQkvKiBkZXNjICovCispOworCitleHRlcm4JQm9vbAlYa2JDaGFuZ2VOYW1lcygKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJWGtiTmFtZUNoYW5nZXNQdHIJLyogY2hhbmdlcyAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiRnJlZU5hbWVzKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorCUJvb2wJCQkvKiBmcmVlTWFwICovCispOworCisKK2V4dGVybglTdGF0dXMJWGtiR2V0U3RhdGUoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50IAkJLyogZGV2aWNlU3BlYyAqLywKKwlYa2JTdGF0ZVB0cgkJLyogcnRyblN0YXRlICovCispOworCitleHRlcm4JQm9vbAlYa2JTZXRNYXAoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKwlYa2JEZXNjUHRyCQkvKiBkZXNjICovCispOworCitleHRlcm4JQm9vbAlYa2JDaGFuZ2VNYXAoCisJRGlzcGxheSoJCS8qIGRweSAqLywKKwlYa2JEZXNjUHRyCQkvKiBkZXNjICovLAorCVhrYk1hcENoYW5nZXNQdHIJLyogY2hhbmdlcyAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiU2V0RGV0ZWN0YWJsZUF1dG9SZXBlYXQoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJQm9vbAkJCS8qIGRldGVjdGFibGUgKi8sCisJQm9vbCAqCQkJLyogc3VwcG9ydGVkICovCispOworCitleHRlcm4JQm9vbAlYa2JHZXREZXRlY3RhYmxlQXV0b1JlcGVhdCgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwlCb29sICoJCQkvKiBzdXBwb3J0ZWQgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYlNldEF1dG9SZXNldENvbnRyb2xzKAorICAgIERpc3BsYXkgKgkJCS8qIGRweSAqLywKKyAgICB1bnNpZ25lZCBpbnQgCQkvKiBjaGFuZ2VzICovLAorICAgIHVuc2lnbmVkIGludCAqCQkvKiBhdXRvX2N0cmxzICovLAorICAgIHVuc2lnbmVkIGludCAqCQkvKiBhdXRvX3ZhbHVlcyAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiR2V0QXV0b1Jlc2V0Q29udHJvbHMoCisgICAgRGlzcGxheSAqCQkJLyogZHB5ICovLAorICAgIHVuc2lnbmVkIGludCAqCQkvKiBhdXRvX2N0cmxzICovLAorICAgIHVuc2lnbmVkIGludCAqCQkvKiBhdXRvX2N0cmxfdmFsdWVzICovCispOworCitleHRlcm4JQm9vbAlYa2JTZXRQZXJDbGllbnRDb250cm9scygKKyAgICBEaXNwbGF5ICoJCQkvKiBkcHkgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBjaGFuZ2UgKi8sCisgICAgdW5zaWduZWQgaW50ICoJCS8qIHZhbHVlcyAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiR2V0UGVyQ2xpZW50Q29udHJvbHMoCisgICAgRGlzcGxheSAqCQkJLyogZHB5ICovLAorICAgIHVuc2lnbmVkIGludCAqCQkvKiBjdHJscyAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYa2JDb3B5S2V5VHlwZSgKKyAgICBYa2JLZXlUeXBlUHRyCS8qIGZyb20gKi8sCisgICAgWGtiS2V5VHlwZVB0cgkvKiBpbnRvICovCispOworCitleHRlcm4gU3RhdHVzIFhrYkNvcHlLZXlUeXBlcygKKyAgICBYa2JLZXlUeXBlUHRyCS8qIGZyb20gKi8sCisgICAgWGtiS2V5VHlwZVB0cgkvKiBpbnRvICovLAorICAgIGludAkJCS8qIG51bV90eXBlcyAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JSZXNpemVLZXlUeXBlKAorICAgIFhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKyAgICBpbnQJCQkvKiB0eXBlX25keCAqLywKKyAgICBpbnQJCQkvKiBtYXBfY291bnQgKi8sCisgICAgQm9vbAkJLyogd2FudF9wcmVzZXJ2ZSAqLywKKyAgICBpbnQJCQkvKiBuZXdfbnVtX2x2bHMgKi8KKyk7CisKK2V4dGVybglLZXlTeW0gKlhrYlJlc2l6ZUtleVN5bXMoCisJWGtiRGVzY1B0cgkJLyogZGVzYyAqLywKKwlpbnQgCQkJLyogZm9yS2V5ICovLAorCWludCAJCQkvKiBzeW1zTmVlZGVkICovCispOworCitleHRlcm4JWGtiQWN0aW9uICpYa2JSZXNpemVLZXlBY3Rpb25zKAorCVhrYkRlc2NQdHIJCS8qIGRlc2MgKi8sCisJaW50IAkJCS8qIGZvcktleSAqLywKKwlpbnQgCQkJLyogYWN0c05lZWRlZCAqLworKTsKKworZXh0ZXJuCVN0YXR1cyBYa2JDaGFuZ2VUeXBlc09mS2V5KAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwlpbnQgCQkJLyoga2V5ICovLAorCWludAkJCS8qIG51bV9ncm91cHMgKi8sCisJdW5zaWduZWQgaW50CQkvKiBncm91cHMgKi8sCisJaW50ICoJCQkvKiBuZXdUeXBlcyAqLywKKwlYa2JNYXBDaGFuZ2VzUHRyCS8qIHBDaGFuZ2VzICovCispOworCitleHRlcm4gIFN0YXR1cyAgIFhrYkNoYW5nZUtleWNvZGVSYW5nZSgKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJaW50CQkJLyogbWluS0MgKi8sCisJaW50CQkJLyogbWF4S0MgKi8sCisJWGtiQ2hhbmdlc1B0cgkJLyogY2hhbmdlcyAqLworKTsKKworLyoqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KioqLworCitleHRlcm4JWGtiQ29tcG9uZW50TGlzdFB0cglYa2JMaXN0Q29tcG9uZW50cygKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGRldmljZVNwZWMgKi8sCisJWGtiQ29tcG9uZW50TmFtZXNQdHIJLyogcHRybnMgKi8sCisJaW50ICoJCQkvKiBtYXhfaW5vdXQgKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYkZyZWVDb21wb25lbnRMaXN0KAorCVhrYkNvbXBvbmVudExpc3RQdHIJLyogbGlzdCAqLworKTsKKworZXh0ZXJuCVhrYkRlc2NQdHIgWGtiR2V0S2V5Ym9hcmQoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50IAkJLyogd2hpY2ggKi8sCisJdW5zaWduZWQgaW50IAkJLyogZGV2aWNlU3BlYyAqLworKTsKKworZXh0ZXJuIFhrYkRlc2NQdHIgWGtiR2V0S2V5Ym9hcmRCeU5hbWUoCisgICAgRGlzcGxheSAqCQkJLyogZHB5ICovLAorICAgIHVuc2lnbmVkIGludAkJLyogZGV2aWNlU3BlYyAqLywKKyAgICBYa2JDb21wb25lbnROYW1lc1B0cgkvKiBuYW1lcyAqLywKKyAgICB1bnNpZ25lZCBpbnQgCQkvKiB3YW50ICovLAorICAgIHVuc2lnbmVkIGludCAJCS8qIG5lZWQgKi8sCisgICAgQm9vbAkJCS8qIGxvYWQgKi8KKyk7CisKKy8qKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSoqKi8KKworZXh0ZXJuCWludAlYa2JLZXlUeXBlc0ZvckNvcmVTeW1ib2xzKAkvKiByZXR1cm5zICMgb2YgZ3JvdXBzICovCisgICAgWGtiRGVzY1B0cgkvKiB4a2IgKi8sCQkJLyoga2V5Ym9hcmQgZGV2aWNlICovCisgICAgaW50CQkvKiBtYXBfd2lkdGggKi8sCQkvKiB3aWR0aCBvZiBjb3JlIEtleVN5bSBhcnJheSAqLworICAgIEtleVN5bSAqCS8qIGNvcmVfc3ltcyAqLywJCS8qIGFsd2F5cyBtYXBXaWR0aCBzeW1ib2xzICovCisgICAgdW5zaWduZWQgaW50CS8qIHByb3RlY3RlZCAqLywJLyogZXhwbGljaXQga2V5IHR5cGVzICovCisgICAgaW50ICoJLyogdHlwZXNfaW5vdXQgKi8sCQkvKiBhbHdheXMgZm91ciB0eXBlIGluZGljZXMgKi8KKyAgICBLZXlTeW0gKiAJLyogeGtiX3N5bXNfcnRybiAqLwkJLyogbXVzdCBoYXZlIGVub3VnaCBzcGFjZSAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiQXBwbHlDb21wYXRNYXBUb0tleSgJLyogRmFsc2Ugb25seSBvbiBlcnJvciAqLworICAgIFhrYkRlc2NQdHIJCS8qIHhrYiAqLywJCS8qIGtleW1hcCB0byBiZSBlZGl0ZWQgKi8KKyAgICBLZXlDb2RlCQkvKiBrZXkgKi8sCQkvKiBrZXkgdG8gYmUgdXBkYXRlZCAqLworICAgIFhrYkNoYW5nZXNQdHIJLyogY2hhbmdlcyAqLwkJLyogcmVzdWx0aW5nIGNoYW5nZXMgdG8gbWFwICovCispOworCitleHRlcm4JQm9vbAlYa2JVcGRhdGVNYXBGcm9tQ29yZSggLyogRmFsc2Ugb25seSBvbiBlcnJvciAqLworICAgIFhrYkRlc2NQdHIJCS8qIHhrYiAqLywJCS8qIFhLQiBrZXlib2FyZCB0byBiZSBlZGl0ZWQgKi8KKyAgICBLZXlDb2RlCQkvKiBmaXJzdF9rZXkgKi8sCS8qIGZpcnN0IGNoYW5nZWQga2V5ICovCisgICAgaW50CQkJLyogbnVtX2tleXMgKi8sIAkvKiBudW1iZXIgb2YgY2hhbmdlZCBrZXlzICovCisgICAgaW50CQkJLyogbWFwX3dpZHRoICovLAkvKiB3aWR0aCBvZiBjb3JlIGtleW1hcCAqLworICAgIEtleVN5bSAqCQkvKiBjb3JlX2tleXN5bXMgKi8sCS8qIHN5bWJvbHMgZnJvbSBjb3JlIGtleW1hcCAqLworICAgIFhrYkNoYW5nZXNQdHIJLyogY2hhbmdlcyAqLwkJLyogcmVzdWx0aW5nIGNoYW5nZXMgKi8KKyk7CisKKy8qKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSoqKi8KKworZXh0ZXJuCVhrYkRldmljZUxlZEluZm9QdHIJWGtiQWRkRGV2aWNlTGVkSW5mbygKKwlYa2JEZXZpY2VJbmZvUHRyCS8qIGRldmkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBsZWRDbGFzcyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGxlZElkICovCispOworCitleHRlcm4JU3RhdHVzCQkJWGtiUmVzaXplRGV2aWNlQnV0dG9uQWN0aW9ucygKKwlYa2JEZXZpY2VJbmZvUHRyCS8qIGRldmkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBuZXdUb3RhbCAqLworKTsKKworZXh0ZXJuCVhrYkRldmljZUluZm9QdHIJWGtiQWxsb2NEZXZpY2VJbmZvKAorCXVuc2lnbmVkIGludAkJLyogZGV2aWNlU3BlYyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIG5CdXR0b25zICovLAorCXVuc2lnbmVkIGludAkJLyogc3pMZWRzICovCispOworCitleHRlcm4Jdm9pZCBYa2JGcmVlRGV2aWNlSW5mbygKKwlYa2JEZXZpY2VJbmZvUHRyCS8qIGRldmkgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKwlCb29sCQkJLyogZnJlZURldkkgKi8KKyk7CisKK2V4dGVybgl2b2lkCVhrYk5vdGVEZXZpY2VDaGFuZ2VzKAorICAgIFhrYkRldmljZUNoYW5nZXNQdHIJCQkvKiBvbGQgKi8sCisgICAgWGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5RXZlbnQgKgkvKiBuZXcgKi8sCisgICAgdW5zaWduZWQgaW50CSAJCS8qIHdhbnRlZCAqLworKTsKKworZXh0ZXJuCVhrYkRldmljZUluZm9QdHIgWGtiR2V0RGV2aWNlSW5mbygKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiB3aGljaCAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGRldmljZVNwZWMgKi8sCisJdW5zaWduZWQgaW50CQkvKiBsZWRDbGFzcyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGxlZElEICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkdldERldmljZUluZm9DaGFuZ2VzKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCVhrYkRldmljZUluZm9QdHIJLyogZGV2aSAqLywKKwlYa2JEZXZpY2VDaGFuZ2VzUHRyIAkvKiBjaGFuZ2VzICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkdldERldmljZUJ1dHRvbkFjdGlvbnMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJWGtiRGV2aWNlSW5mb1B0cgkvKiBkZXZpICovLAorCUJvb2wJCQkvKiBhbGwgKi8sCisJdW5zaWduZWQgaW50CQkvKiBmaXJzdCAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIG5CdG5zICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkdldERldmljZUxlZEluZm8oCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJWGtiRGV2aWNlSW5mb1B0cgkvKiBkZXZpICovLAorCXVuc2lnbmVkIGludAkJLyogbGVkQ2xhc3MgKGNsYXNzLCBYSURmbHQsIFhJQWxsKSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGxlZElkIChpZCwgWElEZmx0LCBYSUFsbCkgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAoWGtiWElfSW5kaWNhdG9ye05hbWVzLE1hcH1NYXNrICovCispOworCitleHRlcm4JQm9vbAlYa2JTZXREZXZpY2VJbmZvKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisJWGtiRGV2aWNlSW5mb1B0cgkvKiBkZXZpICovCispOworCitleHRlcm4JQm9vbAlYa2JDaGFuZ2VEZXZpY2VJbmZvKAorCURpc3BsYXkqCQkvKiBkcHkgKi8sCisJWGtiRGV2aWNlSW5mb1B0cgkvKiBkZXNjICovLAorCVhrYkRldmljZUNoYW5nZXNQdHIJLyogY2hhbmdlcyAqLworKTsKKworZXh0ZXJuICBCb29sIFhrYlNldERldmljZUxlZEluZm8oCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJWGtiRGV2aWNlSW5mb1B0cgkvKiBkZXZpICovLAorCXVuc2lnbmVkIGludCAJCS8qIGxlZENsYXNzICovLAorCXVuc2lnbmVkIGludAkJLyogbGVkSUQgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLworKTsKKworZXh0ZXJuCUJvb2wgWGtiU2V0RGV2aWNlQnV0dG9uQWN0aW9ucygKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwlYa2JEZXZpY2VJbmZvUHRyCS8qIGRldmkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBmaXJzdCAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIG5CdG5zICovCispOworCisvKioqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qKiovCisKK2V4dGVybgljaGFyCVhrYlRvQ29udHJvbCgKKwljaGFyCQkvKiBjICovCispOworCisvKioqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qKiovCisKK2V4dGVybglCb29sIFhrYlNldERlYnVnZ2luZ0ZsYWdzKAorICAgIERpc3BsYXkgKgkJLyogZHB5ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBtYXNrICovLAorICAgIHVuc2lnbmVkIGludAkvKiBmbGFncyAqLywKKyAgICBjaGFyICoJCS8qIG1zZyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogY3RybHNfbWFzayAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogY3RybHMgKi8sCisgICAgdW5zaWduZWQgaW50ICoJLyogcnRybl9mbGFncyAqLywKKyAgICB1bnNpZ25lZCBpbnQgKgkvKiBydHJuX2N0cmxzICovCispOworCitleHRlcm4JQm9vbCBYa2JBcHBseVZpcnR1YWxNb2RDaGFuZ2VzKAorICAgWGtiRGVzY1B0cgkJLyogeGtiICovLAorICAgdW5zaWduZWQgaW50CQkvKiBjaGFuZ2VkICovLAorICAgWGtiQ2hhbmdlc1B0cgkvKiBjaGFuZ2VzICovCispOworCitleHRlcm4gQm9vbCBYa2JVcGRhdGVBY3Rpb25WaXJ0dWFsTW9kcygKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJWGtiQWN0aW9uICoJCS8qIGFjdCAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGNoYW5nZWQgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYlVwZGF0ZUtleVR5cGVWaXJ0dWFsTW9kcygKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJWGtiS2V5VHlwZVB0cgkJLyogdHlwZSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGNoYW5nZWQgKi8sCisJWGtiQ2hhbmdlc1B0cgkJLyogY2hhbmdlcyAqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9YMTFfWEtCTElCX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YV0RGaWxlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YV0RGaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBlMTdkZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hXREZpbGUuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKworQ29weXJpZ2h0IDE5ODUsIDE5ODYsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKyovCisKKy8qCisgKiBYV0RGaWxlLmgJTUlUIFByb2plY3QgQXRoZW5hLCBYIFdpbmRvdyBzeXN0ZW0gd2luZG93IHJhc3RlcgorICoJCWltYWdlIGR1bXBlciwgZHVtcCBmaWxlIGZvcm1hdCBoZWFkZXIgZmlsZS4KKyAqCisgKiAgQXV0aG9yOglUb255IERlbGxhIEZlcmEsIERFQworICoJCTI3LUp1bi04NQorICogCisgKiBNb2RpZmllcjogICAgV2lsbGlhbSBGLiBXeWF0dCwgU0FPCisgKiAgICAgICAgICAgICAgMTgtTm92LTg2ICAtIHZlcnNpb24gNiBmb3Igc2F2aW5nL3Jlc3RvcmluZyBjb2xvciBtYXBzCisgKi8KKworI2lmbmRlZiBYV0RGSUxFX0gKKyNkZWZpbmUgWFdERklMRV9ICisKKyNpbmNsdWRlIDxYMTEvWG1kLmg+CisKKyNkZWZpbmUgWFdEX0ZJTEVfVkVSU0lPTiA3CisjZGVmaW5lIHN6X1hXRGhlYWRlciAxMDAKKyNkZWZpbmUgc3pfWFdEQ29sb3IgMTIKKwordHlwZWRlZiBDQVJEMzIgeHdkdmFsOwkJLyogZm9yIG9sZCBicm9rZW4gcHJvZ3JhbXMgKi8KKworLyogVmFsdWVzIGluIHRoZSBmaWxlIGFyZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QuICovCisKK3R5cGVkZWYgc3RydWN0IF94d2RfZmlsZV9oZWFkZXIgeworCS8qIGhlYWRlcl9zaXplID0gU0laRU9GKFhXRGhlYWRlcikgKyBsZW5ndGggb2YgbnVsbC10ZXJtaW5hdGVkCisJICogd2luZG93IG5hbWUuICovCisJQ0FSRDMyIGhlYWRlcl9zaXplIEIzMjsJCQorCisJQ0FSRDMyIGZpbGVfdmVyc2lvbiBCMzI7CS8qID0gWFdEX0ZJTEVfVkVSU0lPTiBhYm92ZSAqLworCUNBUkQzMiBwaXhtYXBfZm9ybWF0IEIzMjsJLyogWlBpeG1hcCBvciBYWVBpeG1hcCAqLworCUNBUkQzMiBwaXhtYXBfZGVwdGggQjMyOwkvKiBQaXhtYXAgZGVwdGggKi8KKwlDQVJEMzIgcGl4bWFwX3dpZHRoIEIzMjsJLyogUGl4bWFwIHdpZHRoICovCisJQ0FSRDMyIHBpeG1hcF9oZWlnaHQgQjMyOwkvKiBQaXhtYXAgaGVpZ2h0ICovCisJQ0FSRDMyIHhvZmZzZXQgQjMyOwkJLyogQml0bWFwIHggb2Zmc2V0LCBub3JtYWxseSAwICovCisJQ0FSRDMyIGJ5dGVfb3JkZXIgQjMyOwkJLyogb2YgaW1hZ2UgZGF0YTogTVNCRmlyc3QsIExTQkZpcnN0ICovCisKKwkvKiBiaXRtYXBfdW5pdCBhcHBsaWVzIHRvIGJpdG1hcHMgKGRlcHRoIDEgZm9ybWF0IFhZKSBvbmx5LgorCSAqIEl0IGlzIHRoZSBudW1iZXIgb2YgYml0cyB0aGF0IGVhY2ggc2NhbmxpbmUgaXMgcGFkZGVkIHRvLiAqLworCUNBUkQzMiBiaXRtYXBfdW5pdCBCMzI7CQkKKworCUNBUkQzMiBiaXRtYXBfYml0X29yZGVyIEIzMjsJLyogYml0bWFwcyBvbmx5OiBNU0JGaXJzdCwgTFNCRmlyc3QgKi8KKworCS8qIGJpdG1hcF9wYWQgYXBwbGllcyB0byBwaXhtYXBzIChub24tYml0bWFwcykgb25seS4KKwkgKiBJdCBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgdGhhdCBlYWNoIHNjYW5saW5lIGlzIHBhZGRlZCB0by4gKi8KKwlDQVJEMzIgYml0bWFwX3BhZCBCMzI7CQkKKworCUNBUkQzMiBiaXRzX3Blcl9waXhlbCBCMzI7CS8qIEJpdHMgcGVyIHBpeGVsICovCisKKwkvKiBieXRlc19wZXJfbGluZSBpcyBwaXhtYXBfd2lkdGggcGFkZGVkIHRvIGJpdG1hcF91bml0IChiaXRtYXBzKQorCSAqIG9yIGJpdG1hcF9wYWQgKHBpeG1hcHMpLiAgSXQgaXMgdGhlIGRlbHRhIChpbiBieXRlcykgdG8gZ2V0CisJICogdG8gdGhlIHNhbWUgeCBwb3NpdGlvbiBvbiBhbiBhZGphY2VudCByb3cuICovCisJQ0FSRDMyIGJ5dGVzX3Blcl9saW5lIEIzMjsKKwlDQVJEMzIgdmlzdWFsX2NsYXNzIEIzMjsJLyogQ2xhc3Mgb2YgY29sb3JtYXAgKi8KKwlDQVJEMzIgcmVkX21hc2sgQjMyOwkJLyogWiByZWQgbWFzayAqLworCUNBUkQzMiBncmVlbl9tYXNrIEIzMjsJCS8qIFogZ3JlZW4gbWFzayAqLworCUNBUkQzMiBibHVlX21hc2sgQjMyOwkJLyogWiBibHVlIG1hc2sgKi8KKwlDQVJEMzIgYml0c19wZXJfcmdiIEIzMjsJLyogTG9nMiBvZiBkaXN0aW5jdCBjb2xvciB2YWx1ZXMgKi8KKwlDQVJEMzIgY29sb3JtYXBfZW50cmllcyBCMzI7CS8qIE51bWJlciBvZiBlbnRyaWVzIGluIGNvbG9ybWFwOyBub3QgdXNlZD8gKi8KKwlDQVJEMzIgbmNvbG9ycyBCMzI7CQkvKiBOdW1iZXIgb2YgWFdEQ29sb3Igc3RydWN0dXJlcyAqLworCUNBUkQzMiB3aW5kb3dfd2lkdGggQjMyOwkvKiBXaW5kb3cgd2lkdGggKi8KKwlDQVJEMzIgd2luZG93X2hlaWdodCBCMzI7CS8qIFdpbmRvdyBoZWlnaHQgKi8KKwlDQVJEMzIgd2luZG93X3ggQjMyOwkJLyogV2luZG93IHVwcGVyIGxlZnQgWCBjb29yZGluYXRlICovCisJQ0FSRDMyIHdpbmRvd195IEIzMjsJCS8qIFdpbmRvdyB1cHBlciBsZWZ0IFkgY29vcmRpbmF0ZSAqLworCUNBUkQzMiB3aW5kb3dfYmRyd2lkdGggQjMyOwkvKiBXaW5kb3cgYm9yZGVyIHdpZHRoICovCit9IFhXREZpbGVIZWFkZXI7CisKKy8qIE51bGwtdGVybWluYXRlZCB3aW5kb3cgbmFtZSBmb2xsb3dzIHRoZSBhYm92ZSBzdHJ1Y3R1cmUuICovCisKKy8qIE5leHQgY29tZXMgWFdEQ29sb3Igc3RydWN0dXJlcywgYXQgb2Zmc2V0IFhXREZpbGVIZWFkZXIuaGVhZGVyX3NpemUgaW4KKyAqIHRoZSBmaWxlLiAgWFdERmlsZUhlYWRlci5uY29sb3JzIHRlbGxzIGhvdyBtYW55IFhXRENvbG9yIHN0cnVjdHVyZXMKKyAqIHRoZXJlIGFyZS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIENBUkQzMglwaXhlbCBCMzI7CisgICAgICAgIENBUkQxNglyZWQgQjE2OworCUNBUkQxNglncmVlbiBCMTY7CisJQ0FSRDE2CWJsdWUgQjE2OworICAgICAgICBDQVJEOAlmbGFnczsKKyAgICAgICAgQ0FSRDgJcGFkOworfSBYV0RDb2xvcjsKKworLyogTGFzdCBjb21lcyB0aGUgaW1hZ2UgZGF0YSBpbiB0aGUgZm9ybWF0IGRlc2NyaWJlZCBieSBYV0RGaWxlSGVhZGVyLiAqLworCisjZW5kaWYgLyogWFdERklMRV9IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hhbGxvY2EuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hhbGxvY2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTE5ODg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGFsbG9jYS5oCkBAIC0wLDAgKzEsMTIxIEBACisvKgorCitDb3B5cmlnaHQgMTk5NSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQoraW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCitBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKK09USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwKK25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3IKK290aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KK2Zyb20gVGhlIE9wZW4gR3JvdXAuCisKKyovCisvKgorICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBoZWFkZXIgaXMgdG8gZGVmaW5lIHRoZSBtYWNyb3MgQUxMT0NBVEVfTE9DQUwgYW5kCisgKiBERUFMTE9DQVRFX0xPQ0FMIGFwcHJvcHJpYXRlbHkgZm9yIHRoZSBwbGF0Zm9ybSBiZWluZyBjb21waWxlZCBvbi4KKyAqIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCB0byBtYWtlIGZhc3QsIGZ1bmN0aW9uLWxvY2FsIG1lbW9yeSBhbGxvY2F0aW9ucy4KKyAqIFRoZWlyIGNoYXJhY3RlcmlzdGljcyBhcmUgYXMgZm9sbG93czoKKyAqCisgKiB2b2lkICpBTExPQ0FURV9MT0NBTChpbnQgc2l6ZSkKKyAqICAgIFJldHVybnMgYSBwb2ludGVyIHRvIHNpemUgYnl0ZXMgb2YgbWVtb3J5LCBvciBOVUxMIGlmIHRoZSBhbGxvY2F0aW9uCisgKiAgICBmYWlsZWQuICBUaGUgbWVtb3J5IG11c3QgYmUgZnJlZWQgd2l0aCBERUFMTE9DQVRFX0xPQ0FMIGJlZm9yZSB0aGUKKyAqICAgIGZ1bmN0aW9uIHRoYXQgbWFkZSB0aGUgYWxsb2NhdGlvbiByZXR1cm5zLiAgWW91IHNob3VsZCBub3QgYXNrIGZvcgorICogICAgbGFyZ2UgYmxvY2tzIG9mIG1lbW9yeSB3aXRoIHRoaXMgZnVuY3Rpb24sIHNpbmNlIG9uIG1hbnkgcGxhdGZvcm1zCisgKiAgICB0aGUgbWVtb3J5IGNvbWVzIGZyb20gdGhlIHN0YWNrLCB3aGljaCBtYXkgaGF2ZSBsaW1pdGVkIHNpemUuCisgKgorICogdm9pZCBERUFMTE9DQVRFX0xPQ0FMKHZvaWQgKikKKyAqICAgIEZyZWVzIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IEFMTE9DQVRFX0xPQ0FMLiAgT21pc3Npb24gb2YgdGhpcworICogICAgc3RlcCBtYXkgYmUgaGFybWxlc3Mgb24gc29tZSBwbGF0Zm9ybXMsIGJ1dCB3aWxsIHJlc3VsdCBpbgorICogICAgbWVtb3J5IGxlYWtzIG9yIHdvcnNlIG9uIG90aGVycy4KKyAqCisgKiBCZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZSwgeW91IHNob3VsZCBkZWZpbmUgdHdvIG1hY3JvcywKKyAqIEFMTE9DQVRFX0xPQ0FMX0ZBTExCQUNLIGFuZCBERUFMTE9DQVRFX0xPQ0FMX0ZBTExCQUNLLCB0aGF0IGhhdmUgdGhlCisgKiBzYW1lIGNoYXJhY3RlcmlzdGljcyBhcyBBTExPQ0FURV9MT0NBTCBhbmQgREVBTExPQ0FURV9MT0NBTC4gIFRoZQorICogaGVhZGVyIHVzZXMgdGhlIGZhbGxiYWNrcyBpZiBpdCBkb2Vzbid0IGtub3cgYSAiYmV0dGVyIiB3YXkgdG8gZGVmaW5lCisgKiBBTExPQ0FURV9MT0NBTCBhbmQgREVBTExPQ0FURV9MT0NBTC4gIFR5cGljYWwgdXNhZ2Ugd291bGQgYmU6CisgKgorICogICAgI2RlZmluZSBBTExPQ0FURV9MT0NBTF9GQUxMQkFDSyhfc2l6ZSkgbWFsbG9jKF9zaXplKQorICogICAgI2RlZmluZSBERUFMTE9DQVRFX0xPQ0FMX0ZBTExCQUNLKF9wdHIpIGZyZWUoX3B0cikKKyAqICAgICNpbmNsdWRlICJYYWxsb2NhLmgiCisgKi8KKworI2lmbmRlZiBYQUxMT0NBX0gKKyNkZWZpbmUgWEFMTE9DQV9IIDEKKworI2lmbmRlZiBJTkNMVURFX0FMTE9DQV9ICisvKiBOZWVkIHRvIGFkZCBtb3JlIGhlcmUgdG8gbWF0Y2ggSW1ha2UgKi5jZidzICovCisjIGlmIGRlZmluZWQoSEFWRV9BTExPQ0FfSCkgfHwgZGVmaW5lZChfX1NVTlBST19DKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0NDKQorIyAgZGVmaW5lIElOQ0xVREVfQUxMT0NBX0gKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSU5DTFVERV9BTExPQ0FfSAorIyAgaW5jbHVkZSA8YWxsb2NhLmg+CisjZW5kaWYKKworI2lmbmRlZiBOT19BTExPQ0EKKy8qCisgKiBvcy1kZXBlbmRlbnQgZGVmaW5pdGlvbiBvZiBsb2NhbCBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24KKyAqIElmIHlvdSB3YW50IHNvbWV0aGluZyBvdGhlciB0aGFuIChERSlBTExPQ0FURV9MT0NBTF9GQUxMQkFDSworICogZm9yIEFMTE9DQVRFL0RFQUxMT0NBVEVfTE9DQUwgdGhlbiB5b3UgYWRkIHRoYXQgaW4gaGVyZS4KKyAqLworCisKKyMgIGlmZGVmIF9fR05VQ19fCisjICAgIGlmbmRlZiBhbGxvY2EKKyMgICAgICBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyMgICAgZW5kaWYgLyogIWFsbG9jYSAqLworIyAgICBkZWZpbmUgQUxMT0NBVEVfTE9DQUwoc2l6ZSkgYWxsb2NhKChpbnQpKHNpemUpKQorIyAgZWxzZSAvKiAhIF9fR05VQ19fICovCisKKy8qCisgKiB3YXJuaW5nOiBvbGQgbWlwcyBhbGxvY2EgKHByZSAyLjEwKSBpcyB1bnVzYWJsZSwgbmV3IG9uZSBpcyBidWlsdCBpbgorICogVGVzdCBpcyBlYXN5LCB0aGUgbmV3IG9uZSBpcyBuYW1lZCBfX2J1aWx0aW5fYWxsb2NhIGFuZCBjb21lcworICogZnJvbSBhbGxvY2EuaCB3aGljaCAjZGVmaW5lcyBhbGxvY2EuCisgKi8KKyMgICAgICBpZiBkZWZpbmVkKF9fc3VuKSB8fCBkZWZpbmVkKGFsbG9jYSkKKy8qCisgKiBTb21lIFN5c3RlbSBWIGJveGVzIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSAvbGliL2xpYlBXLmE7IGlmIHlvdQorICogZGVjaWRlIHRoYXQgeW91IGRvbid0IHdhbnQgdG8gdXNlIGFsbG9jYSwgeW91IG1pZ2h0IHdhbnQgdG8gZml4IGl0IGhlcmUuCisgKi8KKy8qIGFsbG9jYSBtaWdodCBiZSBhIG1hY3JvIHRha2luZyBvbmUgYXJnIChoaSwgU3VuISksIHNvIGdpdmUgaXQgb25lLiAqLworIyAgICAgICAgaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpCisjICAgICAgICAgIGRlZmluZSBfX1hudWxsYXJnCQkvKiBhcyBub3RoaW5nICovCisgICAgICAgICAgIGV4dGVybiB2b2lkICphbGxvY2EoX19YbnVsbGFyZyk7CisjICAgICAgICBlbmRpZgorIyAgICAgICAgZGVmaW5lIEFMTE9DQVRFX0xPQ0FMKHNpemUpIGFsbG9jYSgoaW50KShzaXplKSkKKyMgICAgICBlbmRpZiAvKiB3aG8gZG9lcyBhbGxvY2EgKi8KKyMgIGVuZGlmIC8qIF9fR05VQ19fICovCisKKyNlbmRpZiAvKiBOT19BTExPQ0EgKi8KKworI2lmICFkZWZpbmVkKEFMTE9DQVRFX0xPQ0FMKQorIyAgaWYgZGVmaW5lZChBTExPQ0FURV9MT0NBTF9GQUxMQkFDSykgJiYgZGVmaW5lZChERUFMTE9DQVRFX0xPQ0FMX0ZBTExCQUNLKQorIyAgICBkZWZpbmUgQUxMT0NBVEVfTE9DQUwoX3NpemUpICBBTExPQ0FURV9MT0NBTF9GQUxMQkFDSyhfc2l6ZSkKKyMgICAgZGVmaW5lIERFQUxMT0NBVEVfTE9DQUwoX3B0cikgREVBTExPQ0FURV9MT0NBTF9GQUxMQkFDSyhfcHRyKQorIyAgZWxzZSAvKiBubyBmYWxsYmFja3Mgc3VwcGxpZWQ7IGVycm9yICovCisjICAgIGRlZmluZSBBTExPQ0FURV9MT0NBTChfc2l6ZSkgIEFMTE9DQVRFX0xPQ0FMX0ZBTExCQUNLIHVuZGVmaW5lZCEKKyMgICAgZGVmaW5lIERFQUxMT0NBVEVfTE9DQUwoX3B0cikgREVBTExPQ0FURV9MT0NBTF9GQUxMQkFDSyB1bmRlZmluZWQhCisjICBlbmRpZiAvKiBkZWZpbmVkKEFMTE9DQVRFX0xPQ0FMX0ZBTExCQUNLICYmIERFQUxMT0NBVEVfTE9DQUxfRkFMTEJBQ0spICovCisjZWxzZQorIyAgaWYgIWRlZmluZWQoREVBTExPQ0FURV9MT0NBTCkKKyMgICAgZGVmaW5lIERFQUxMT0NBVEVfTE9DQUwoX3B0cikgZG8ge30gd2hpbGUoMCkKKyMgIGVuZGlmCisjZW5kaWYgLyogZGVmaW5lZChBTExPQ0FURV9MT0NBTCkgKi8KKworI2VuZGlmIC8qIFhBTExPQ0FfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGFyY2guaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hhcmNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgwYzU4MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hhcmNoLmgKQEAgLTAsMCArMSw5NCBAQAorI2lmbmRlZiBfWEFSQ0hfSF8KKyMgZGVmaW5lIF9YQVJDSF9IXworCisvKgorICogQ29weXJpZ2h0IDE5OTcgTWV0cm8gTGluayBJbmNvcnBvcmF0ZWQKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUgbGlzdGVkIGNvcHlyaWdodCBob2xkZXIocykKKyAqIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZgorICogdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhYm92ZSBsaXN0ZWQKKyAqIGNvcHlyaWdodCBob2xkZXIocykgbWFrZShzKSBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yCisgKiBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIFRIRSBBQk9WRSBMSVNURUQgQ09QWVJJR0hUIEhPTERFUihTKSBESVNDTEFJTShTKSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRAorICogVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCisgKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIExJU1RFRCBDT1BZUklHSFQgSE9MREVSKFMpIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZCisgKiBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORworICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworCisvKgorICogRGV0ZXJtaW5lIHRoZSBtYWNoaW5lJ3MgYnl0ZSBvcmRlci4KKyAqLworCisvKiBTZWUgaWYgaXQgaXMgc2V0IGluIHRoZSBpbWFrZSBjb25maWcgZmlyc3QgKi8KKyMgaWZkZWYgWF9CWVRFX09SREVSCisKKyMgIGRlZmluZSBYX0JJR19FTkRJQU4gNDMyMQorIyAgZGVmaW5lIFhfTElUVExFX0VORElBTiAxMjM0CisKKyMgZWxzZQorCisjICBpZiBkZWZpbmVkKFNWUjQpIHx8IGRlZmluZWQoX19TVlI0KQorIyAgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyAgIGluY2x1ZGUgPHN5cy9ieXRlb3JkZXIuaD4KKyMgIGVsaWYgZGVmaW5lZChDU1JHX0JBU0VEKQorIyAgIGlmIGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykKKyMgICAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjICAgZW5kaWYKKyMgICBpbmNsdWRlIDxtYWNoaW5lL2VuZGlhbi5oPgorIyAgZWxpZiBkZWZpbmVkKGxpbnV4KQorIyAgIGlmIGRlZmluZWQgX19TVFJJQ1RfQU5TSV9fCisjICAgIHVuZGVmIF9fU1RSSUNUX0FOU0lfXworIyAgICBpbmNsdWRlIDxlbmRpYW4uaD4KKyMgICAgZGVmaW5lIF9fU1RSSUNUX0FOU0lfXworIyAgIGVsc2UKKyMgICAgaW5jbHVkZSA8ZW5kaWFuLmg+CisjICAgZW5kaWYKKy8qICdlbmRpYW4uaCcgbWlnaHQgaGF2ZSBiZWVuIGluY2x1ZGVkIGJlZm9yZSAnWGFyY2guaCcgKi8KKyMgICBpZiAhZGVmaW5lZChMSVRUTEVfRU5ESUFOKSAmJiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKyMgICAgZGVmaW5lIExJVFRMRV9FTkRJQU4gX19MSVRUTEVfRU5ESUFOCisjICAgZW5kaWYKKyMgICBpZiAhZGVmaW5lZChCSUdfRU5ESUFOKSAmJiBkZWZpbmVkKF9fQklHX0VORElBTikKKyMgICAgZGVmaW5lIEJJR19FTkRJQU4gX19CSUdfRU5ESUFOCisjICAgZW5kaWYKKyMgICBpZiAhZGVmaW5lZChQRFBfRU5ESUFOKSAmJiBkZWZpbmVkKF9fUERQX0VORElBTikKKyMgICAgZGVmaW5lIFBEUF9FTkRJQU4gX19QRFBfRU5ESUFOCisjICAgZW5kaWYKKyMgICBpZiAhZGVmaW5lZChCWVRFX09SREVSKSAmJiBkZWZpbmVkKF9fQllURV9PUkRFUikKKyMgICAgZGVmaW5lIEJZVEVfT1JERVIgX19CWVRFX09SREVSCisjICAgZW5kaWYKKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBCWVRFX09SREVSCisjICAgZGVmaW5lIExJVFRMRV9FTkRJQU4gMTIzNAorIyAgIGRlZmluZSBCSUdfRU5ESUFOICAgIDQzMjEKKworIyAgIGlmIGRlZmluZWQoX19zdW4pICYmIGRlZmluZWQoX19TVlI0KQorIyAgICBpbmNsdWRlIDxzeXMvaXNhX2RlZnMuaD4KKyMgICAgaWZkZWYgX0xJVFRMRV9FTkRJQU4KKyMgICAgIGRlZmluZSBCWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKyMgICAgZW5kaWYKKyMgICAgaWZkZWYgX0JJR19FTkRJQU4KKyMgICAgIGRlZmluZSBCWVRFX09SREVSIEJJR19FTkRJQU4KKyMgICAgZW5kaWYKKyMgICBlbmRpZiAvKiBzdW4gKi8KKyMgIGVuZGlmIC8qIEJZVEVfT1JERVIgKi8KKworIyAgZGVmaW5lIFhfQllURV9PUkRFUiBCWVRFX09SREVSCisjICBkZWZpbmUgWF9CSUdfRU5ESUFOIEJJR19FTkRJQU4KKyMgIGRlZmluZSBYX0xJVFRMRV9FTkRJQU4gTElUVExFX0VORElBTgorCisjIGVuZGlmIC8qIG5vdCBpbiBpbWFrZSBjb25maWcgKi8KKworI2VuZGlmIC8qIF9YQVJDSF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGF0b20uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hhdG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg1YTQyMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hhdG9tLmgKQEAgLTAsMCArMSw3OSBAQAorI2lmbmRlZiBYQVRPTV9ICisjZGVmaW5lIFhBVE9NX0ggMQorCisvKiBUSElTIElTIEEgR0VORVJBVEVEIEZJTEUKKyAqCisgKiBEbyBub3QgY2hhbmdlISAgQ2hhbmdpbmcgdGhpcyBmaWxlIGltcGxpZXMgYSBwcm90b2NvbCBjaGFuZ2UhCisgKi8KKworI2RlZmluZSBYQV9QUklNQVJZICgoQXRvbSkgMSkKKyNkZWZpbmUgWEFfU0VDT05EQVJZICgoQXRvbSkgMikKKyNkZWZpbmUgWEFfQVJDICgoQXRvbSkgMykKKyNkZWZpbmUgWEFfQVRPTSAoKEF0b20pIDQpCisjZGVmaW5lIFhBX0JJVE1BUCAoKEF0b20pIDUpCisjZGVmaW5lIFhBX0NBUkRJTkFMICgoQXRvbSkgNikKKyNkZWZpbmUgWEFfQ09MT1JNQVAgKChBdG9tKSA3KQorI2RlZmluZSBYQV9DVVJTT1IgKChBdG9tKSA4KQorI2RlZmluZSBYQV9DVVRfQlVGRkVSMCAoKEF0b20pIDkpCisjZGVmaW5lIFhBX0NVVF9CVUZGRVIxICgoQXRvbSkgMTApCisjZGVmaW5lIFhBX0NVVF9CVUZGRVIyICgoQXRvbSkgMTEpCisjZGVmaW5lIFhBX0NVVF9CVUZGRVIzICgoQXRvbSkgMTIpCisjZGVmaW5lIFhBX0NVVF9CVUZGRVI0ICgoQXRvbSkgMTMpCisjZGVmaW5lIFhBX0NVVF9CVUZGRVI1ICgoQXRvbSkgMTQpCisjZGVmaW5lIFhBX0NVVF9CVUZGRVI2ICgoQXRvbSkgMTUpCisjZGVmaW5lIFhBX0NVVF9CVUZGRVI3ICgoQXRvbSkgMTYpCisjZGVmaW5lIFhBX0RSQVdBQkxFICgoQXRvbSkgMTcpCisjZGVmaW5lIFhBX0ZPTlQgKChBdG9tKSAxOCkKKyNkZWZpbmUgWEFfSU5URUdFUiAoKEF0b20pIDE5KQorI2RlZmluZSBYQV9QSVhNQVAgKChBdG9tKSAyMCkKKyNkZWZpbmUgWEFfUE9JTlQgKChBdG9tKSAyMSkKKyNkZWZpbmUgWEFfUkVDVEFOR0xFICgoQXRvbSkgMjIpCisjZGVmaW5lIFhBX1JFU09VUkNFX01BTkFHRVIgKChBdG9tKSAyMykKKyNkZWZpbmUgWEFfUkdCX0NPTE9SX01BUCAoKEF0b20pIDI0KQorI2RlZmluZSBYQV9SR0JfQkVTVF9NQVAgKChBdG9tKSAyNSkKKyNkZWZpbmUgWEFfUkdCX0JMVUVfTUFQICgoQXRvbSkgMjYpCisjZGVmaW5lIFhBX1JHQl9ERUZBVUxUX01BUCAoKEF0b20pIDI3KQorI2RlZmluZSBYQV9SR0JfR1JBWV9NQVAgKChBdG9tKSAyOCkKKyNkZWZpbmUgWEFfUkdCX0dSRUVOX01BUCAoKEF0b20pIDI5KQorI2RlZmluZSBYQV9SR0JfUkVEX01BUCAoKEF0b20pIDMwKQorI2RlZmluZSBYQV9TVFJJTkcgKChBdG9tKSAzMSkKKyNkZWZpbmUgWEFfVklTVUFMSUQgKChBdG9tKSAzMikKKyNkZWZpbmUgWEFfV0lORE9XICgoQXRvbSkgMzMpCisjZGVmaW5lIFhBX1dNX0NPTU1BTkQgKChBdG9tKSAzNCkKKyNkZWZpbmUgWEFfV01fSElOVFMgKChBdG9tKSAzNSkKKyNkZWZpbmUgWEFfV01fQ0xJRU5UX01BQ0hJTkUgKChBdG9tKSAzNikKKyNkZWZpbmUgWEFfV01fSUNPTl9OQU1FICgoQXRvbSkgMzcpCisjZGVmaW5lIFhBX1dNX0lDT05fU0laRSAoKEF0b20pIDM4KQorI2RlZmluZSBYQV9XTV9OQU1FICgoQXRvbSkgMzkpCisjZGVmaW5lIFhBX1dNX05PUk1BTF9ISU5UUyAoKEF0b20pIDQwKQorI2RlZmluZSBYQV9XTV9TSVpFX0hJTlRTICgoQXRvbSkgNDEpCisjZGVmaW5lIFhBX1dNX1pPT01fSElOVFMgKChBdG9tKSA0MikKKyNkZWZpbmUgWEFfTUlOX1NQQUNFICgoQXRvbSkgNDMpCisjZGVmaW5lIFhBX05PUk1fU1BBQ0UgKChBdG9tKSA0NCkKKyNkZWZpbmUgWEFfTUFYX1NQQUNFICgoQXRvbSkgNDUpCisjZGVmaW5lIFhBX0VORF9TUEFDRSAoKEF0b20pIDQ2KQorI2RlZmluZSBYQV9TVVBFUlNDUklQVF9YICgoQXRvbSkgNDcpCisjZGVmaW5lIFhBX1NVUEVSU0NSSVBUX1kgKChBdG9tKSA0OCkKKyNkZWZpbmUgWEFfU1VCU0NSSVBUX1ggKChBdG9tKSA0OSkKKyNkZWZpbmUgWEFfU1VCU0NSSVBUX1kgKChBdG9tKSA1MCkKKyNkZWZpbmUgWEFfVU5ERVJMSU5FX1BPU0lUSU9OICgoQXRvbSkgNTEpCisjZGVmaW5lIFhBX1VOREVSTElORV9USElDS05FU1MgKChBdG9tKSA1MikKKyNkZWZpbmUgWEFfU1RSSUtFT1VUX0FTQ0VOVCAoKEF0b20pIDUzKQorI2RlZmluZSBYQV9TVFJJS0VPVVRfREVTQ0VOVCAoKEF0b20pIDU0KQorI2RlZmluZSBYQV9JVEFMSUNfQU5HTEUgKChBdG9tKSA1NSkKKyNkZWZpbmUgWEFfWF9IRUlHSFQgKChBdG9tKSA1NikKKyNkZWZpbmUgWEFfUVVBRF9XSURUSCAoKEF0b20pIDU3KQorI2RlZmluZSBYQV9XRUlHSFQgKChBdG9tKSA1OCkKKyNkZWZpbmUgWEFfUE9JTlRfU0laRSAoKEF0b20pIDU5KQorI2RlZmluZSBYQV9SRVNPTFVUSU9OICgoQXRvbSkgNjApCisjZGVmaW5lIFhBX0NPUFlSSUdIVCAoKEF0b20pIDYxKQorI2RlZmluZSBYQV9OT1RJQ0UgKChBdG9tKSA2MikKKyNkZWZpbmUgWEFfRk9OVF9OQU1FICgoQXRvbSkgNjMpCisjZGVmaW5lIFhBX0ZBTUlMWV9OQU1FICgoQXRvbSkgNjQpCisjZGVmaW5lIFhBX0ZVTExfTkFNRSAoKEF0b20pIDY1KQorI2RlZmluZSBYQV9DQVBfSEVJR0hUICgoQXRvbSkgNjYpCisjZGVmaW5lIFhBX1dNX0NMQVNTICgoQXRvbSkgNjcpCisjZGVmaW5lIFhBX1dNX1RSQU5TSUVOVF9GT1IgKChBdG9tKSA2OCkKKworI2RlZmluZSBYQV9MQVNUX1BSRURFRklORUQgKChBdG9tKSA2OCkKKyNlbmRpZiAvKiBYQVRPTV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YY21zLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YY21zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1MWZkMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hjbXMuaApAQCAtMCwwICsxLDgwMyBAQAorCisvKgorICogQ29kZSBhbmQgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uIChjKSBDb3B5cmlnaHQgMTk5MCAxOTkxIFRla3Ryb25peCwgSW5jLgorICogCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgYSBjb21wb25lbnQgb2YgYW4gWCBXaW5kb3cgU3lzdGVtLXNwZWNpZmljIGltcGxlbWVudGF0aW9uCisgKiBvZiBYY21zIGJhc2VkIG9uIHRoZSBUZWtDb2xvciBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbS4gIFBlcm1pc3Npb24gaXMKKyAqIGhlcmVieSBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgb3RoZXJ3aXNlIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IHRoaXMgY29weXJpZ2h0LCBwZXJtaXNzaW9uLCBhbmQgZGlzY2xhaW1lciBub3RpY2UgaXMgcmVwcm9kdWNlZCBpbgorICogYWxsIGNvcGllcyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBUZWtDb2xvcgorICogaXMgYSB0cmFkZW1hcmsgb2YgVGVrdHJvbml4LCBJbmMuCisgKgorICogVGVrdHJvbml4IG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlCisgKiBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIGFuZCB3aXRoIGFsbCBmYXVsdHMuCisgKgorICogVEVLVFJPTklYIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBBUFBMSUNBQkxFIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKKyAqIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIElOIE5PIEVWRU5UIFNIQUxMIFRFS1RST05JWCBCRSBMSUFCTEUgRk9SIEFOWQorICogU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIKKyAqIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRgorICogQ09OVFJBQ1QsIE5FR0xJR0VOQ0UsIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFRIRSBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqCisgKglERVNDUklQVElPTgorICoJCVB1YmxpYyBpbmNsdWRlIGZpbGUgZm9yIFggQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KKyAqLworI2lmbmRlZiBfWDExX1hDTVNfSF8KKyNkZWZpbmUgX1gxMV9YQ01TX0hfCisKKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorCisgICAgLyoKKyAgICAgKiBYQ01TIFN0YXR1cyBWYWx1ZXMKKyAgICAgKi8KKyNkZWZpbmUgWGNtc0ZhaWx1cmUJCQkwCisjZGVmaW5lIFhjbXNTdWNjZXNzCQkJMQorI2RlZmluZSBYY21zU3VjY2Vzc1dpdGhDb21wcmVzc2lvbgkyCisKKyAgICAvKgorICAgICAqIENvbG9yIFNwYWNlIEZvcm1hdCBJRCdzCisgICAgICogICAgQ29sb3IgU3BhY2UgSUQncyBhcmUgb2YgWGNtc0NvbG9yRm9ybWF0IHR5cGUuCisgICAgICoKKyAgICAgKiAgICBiaXQgMzEKKyAgICAgKgkgICAgMCA9PSBEZXZpY2UtSW5kZXBlbmRlbnQKKyAgICAgKgkgICAgMSA9PSBEZXZpY2UtRGVwZW5kZW50CisgICAgICoKKyAgICAgKiAgICBiaXQgMzA6CisgICAgICoJICAgIDAgPT0gUmVnaXN0ZXJlZCB3aXRoIFggQ29uc29ydGl1bQorICAgICAqCSAgICAxID09IFVucmVnaXN0ZXJlZAorICAgICAqLworI2RlZmluZSBYY21zVW5kZWZpbmVkRm9ybWF0CShYY21zQ29sb3JGb3JtYXQpMHgwMDAwMDAwMAorI2RlZmluZSBYY21zQ0lFWFlaRm9ybWF0CShYY21zQ29sb3JGb3JtYXQpMHgwMDAwMDAwMQorI2RlZmluZSBYY21zQ0lFdXZZRm9ybWF0CShYY21zQ29sb3JGb3JtYXQpMHgwMDAwMDAwMgorI2RlZmluZSBYY21zQ0lFeHlZRm9ybWF0CShYY21zQ29sb3JGb3JtYXQpMHgwMDAwMDAwMworI2RlZmluZSBYY21zQ0lFTGFiRm9ybWF0CShYY21zQ29sb3JGb3JtYXQpMHgwMDAwMDAwNAorI2RlZmluZSBYY21zQ0lFTHV2Rm9ybWF0CShYY21zQ29sb3JGb3JtYXQpMHgwMDAwMDAwNQorI2RlZmluZSBYY21zVGVrSFZDRm9ybWF0CShYY21zQ29sb3JGb3JtYXQpMHgwMDAwMDAwNgorI2RlZmluZSBYY21zUkdCRm9ybWF0CQkoWGNtc0NvbG9yRm9ybWF0KTB4ODAwMDAwMDAKKyNkZWZpbmUgWGNtc1JHQmlGb3JtYXQJCShYY21zQ29sb3JGb3JtYXQpMHg4MDAwMDAwMQorCisgICAgLyoKKyAgICAgKiBTdGF0ZSBvZiBYY21zUGVyU2NybkluZm8KKyAgICAgKi8KKyNkZWZpbmUgWGNtc0luaXROb25lCQkweDAwCS8qIG5vIGluaXRpYWxpemF0aW9uIGF0dGVtcHRlZCAqLworI2RlZmluZSBYY21zSW5pdFN1Y2Nlc3MJCTB4MDEJLyogaW5pdGlhbGl6YXRpb24gc3VjY2Vzc2Z1bCAqLworI2RlZmluZSBYY21zSW5pdEZhaWx1cmUJCTB4ZmYJLyogZmFpbHVyZSwgdXNlIGRlZmF1bHRzICovCisKKyNkZWZpbmUgRGlzcGxheU9mQ0NDKGNjYykJCSgoY2NjKS0+ZHB5KQorI2RlZmluZSBTY3JlZW5OdW1iZXJPZkNDQyhjY2MpCQkoKGNjYyktPnNjcmVlbk51bWJlcikKKyNkZWZpbmUgVmlzdWFsT2ZDQ0MoY2NjKQkJKChjY2MpLT52aXN1YWwpCisjZGVmaW5lIENsaWVudFdoaXRlUG9pbnRPZkNDQyhjY2MpCSgmKGNjYyktPmNsaWVudFdoaXRlUHQpCisjZGVmaW5lIFNjcmVlbldoaXRlUG9pbnRPZkNDQyhjY2MpCSgmKGNjYyktPnBQZXJTY3JuSW5mby0+c2NyZWVuV2hpdGVQdCkKKyNkZWZpbmUgRnVuY3Rpb25TZXRPZkNDQyhjY2MpCQkoKGNjYyktPnBQZXJTY3JuSW5mby0+ZnVuY3Rpb25TZXQpCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBYY21zQ29sb3JGb3JtYXQ7CS8qIENvbG9yIFNwYWNlIEZvcm1hdCBJRCAqLworCit0eXBlZGVmIGRvdWJsZSBYY21zRmxvYXQ7CisKKyAgICAvKgorICAgICAqIERldmljZSBSR0IKKyAgICAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBzaG9ydCByZWQ7CQkvKiBzY2FsZWQgZnJvbSAweDAwMDAgdG8gMHhmZmZmICovCisgICAgdW5zaWduZWQgc2hvcnQgZ3JlZW47CS8qIHNjYWxlZCBmcm9tIDB4MDAwMCB0byAweGZmZmYgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBibHVlOwkvKiBzY2FsZWQgZnJvbSAweDAwMDAgdG8gMHhmZmZmICovCit9IFhjbXNSR0I7CisKKyAgICAvKgorICAgICAqIFJHQiBJbnRlbnNpdHkKKyAgICAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYY21zRmxvYXQgcmVkOwkvKiAwLjAgLSAxLjAgKi8KKyAgICBYY21zRmxvYXQgZ3JlZW47CS8qIDAuMCAtIDEuMCAqLworICAgIFhjbXNGbG9hdCBibHVlOwkvKiAwLjAgLSAxLjAgKi8KK30gWGNtc1JHQmk7CisKKyAgICAvKgorICAgICAqIENJRSBYWVoKKyAgICAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYY21zRmxvYXQgWDsKKyAgICBYY21zRmxvYXQgWTsKKyAgICBYY21zRmxvYXQgWjsKK30gWGNtc0NJRVhZWjsKKworICAgIC8qCisgICAgICogQ0lFIHUndidZCisgICAgICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWGNtc0Zsb2F0IHVfcHJpbWU7CQkvKiAwLjAgLSAxLjAgKi8KKyAgICBYY21zRmxvYXQgdl9wcmltZTsJCS8qIDAuMCAtIDEuMCAqLworICAgIFhjbXNGbG9hdCBZOwkJLyogMC4wIC0gMS4wICovCit9IFhjbXNDSUV1dlk7CisKKyAgICAvKgorICAgICAqIENJRSB4eVkKKyAgICAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYY21zRmxvYXQgeDsJCS8qIDAuMCAtIDEuMCAqLworICAgIFhjbXNGbG9hdCB5OwkJLyogMC4wIC0gMS4wICovCisgICAgWGNtc0Zsb2F0IFk7CQkvKiAwLjAgLSAxLjAgKi8KK30gWGNtc0NJRXh5WTsKKworICAgIC8qCisgICAgICogQ0lFIEwqYSpiKgorICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhjbXNGbG9hdCBMX3N0YXI7CQkvKiAwLjAgLSAxMDAuMCAqLworICAgIFhjbXNGbG9hdCBhX3N0YXI7CisgICAgWGNtc0Zsb2F0IGJfc3RhcjsKK30gWGNtc0NJRUxhYjsKKworICAgIC8qCisgICAgICogQ0lFIEwqdSp2KgorICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhjbXNGbG9hdCBMX3N0YXI7CQkvKiAwLjAgLSAxMDAuMCAqLworICAgIFhjbXNGbG9hdCB1X3N0YXI7CisgICAgWGNtc0Zsb2F0IHZfc3RhcjsKK30gWGNtc0NJRUx1djsKKworICAgIC8qCisgICAgICogVGVrSFZDCisgICAgICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWGNtc0Zsb2F0IEg7CQkvKiAwLjAgLSAzNjAuMCAqLworICAgIFhjbXNGbG9hdCBWOwkJLyogMC4wIC0gMTAwLjAgKi8KKyAgICBYY21zRmxvYXQgQzsJCS8qIDAuMCAtIDEwMC4wICovCit9IFhjbXNUZWtIVkM7CisKKyAgICAvKgorICAgICAqIFBBRAorICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhjbXNGbG9hdCBwYWQwOworICAgIFhjbXNGbG9hdCBwYWQxOworICAgIFhjbXNGbG9hdCBwYWQyOworICAgIFhjbXNGbG9hdCBwYWQzOworfSBYY21zUGFkOworCisKKyAgICAvKgorICAgICAqIFhDTVMgQ29sb3IgU3RydWN0dXJlCisgICAgICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5pb24geworCVhjbXNSR0IgUkdCOworCVhjbXNSR0JpIFJHQmk7CisJWGNtc0NJRVhZWiBDSUVYWVo7CisJWGNtc0NJRXV2WSBDSUV1dlk7CisJWGNtc0NJRXh5WSBDSUV4eVk7CisJWGNtc0NJRUxhYiBDSUVMYWI7CisJWGNtc0NJRUx1diBDSUVMdXY7CisJWGNtc1Rla0hWQyBUZWtIVkM7CisJWGNtc1BhZCBQYWQ7CisgICAgfSBzcGVjOwkJCS8qIHRoZSBjb2xvciBzcGVjaWZpY2F0aW9uCSovCisgICAgdW5zaWduZWQgbG9uZyBwaXhlbDsJLyogcGl4ZWwgdmFsdWUgKGFzIG5lZWRlZCkJKi8KKyAgICBYY21zQ29sb3JGb3JtYXQJZm9ybWF0OwkJLyogdGhlIHNwZWNpZmljYXRpb24gZm9ybWF0CSovCit9IFhjbXNDb2xvcjsKKworCisgICAgLyoKKyAgICAgKiBYQ01TIFBlciBTY3JlZW4gcmVsYXRlZCBkYXRhCisgICAgICovCisKK3R5cGVkZWYgc3RydWN0IF9YY21zUGVyU2NybkluZm8geworICAgIFhjbXNDb2xvcglzY3JlZW5XaGl0ZVB0OwkvKiBTY3JlZW4gV2hpdGUgcG9pbnQgKi8KKyAgICBYUG9pbnRlcglmdW5jdGlvblNldDsJLyogcG9pbnRlciB0byBTY3JlZW4gQ29sb3IgQ2hhcmFjdGVyaXphdGlvbiAqLworCQkJCS8qICAgICAgRnVuY3Rpb24gU2V0IHN0cnVjdHVyZQkJKi8KKyAgICBYUG9pbnRlcglzY3JlZW5EYXRhOwkvKiBwb2ludGVyIHRvIGNvcnJlc3BvbmRpbmcgU2NyZWVuIENvbG9yKi8KKwkJCQkvKglDaGFyYWN0ZXJpemF0aW9uIERhdGEJCSovCisgICAgdW5zaWduZWQgY2hhciBzdGF0ZTsgICAvKiBYY21zSW5pdE5vbmUsIFhjbXNJbml0U3VjY2VzcywgWGNtc0luaXRGYWlsdXJlICovCisgICAgY2hhcglwYWRbM107Cit9IFhjbXNQZXJTY3JuSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgX1hjbXNDQ0MgKlhjbXNDQ0M7CisKK3R5cGVkZWYgU3RhdHVzICgqWGNtc0NvbXByZXNzaW9uUHJvYykoCQkvKiBHYW11dCBDb21wcmVzc2lvbiBQcm9jICovCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yc19pbl9vdXQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGluZGV4ICovLAorICAgIEJvb2wqCQkvKiBjb21wcmVzc2lvbl9mbGFnc19yZXR1cm4gKi8KKyk7CisKK3R5cGVkZWYgU3RhdHVzICgqWGNtc1doaXRlQWRqdXN0UHJvYykoCSAJLyogV2hpdGUgUG9pbnQgQWRqdXN0IFByb2MgKi8KKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogaW5pdGlhbF93aGl0ZV9wb2ludCovLAorICAgIFhjbXNDb2xvcioJCS8qIHRhcmdldF93aGl0ZV9wb2ludCovLAorICAgIFhjbXNDb2xvckZvcm1hdAkvKiB0YXJnZXRfZm9ybWF0ICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yc19pbl9vdXQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8sCisgICAgQm9vbCoJCS8qIGNvbXByZXNzaW9uX2ZsYWdzX3JldHVybiAqLworKTsKKworICAgIC8qCisgICAgICogWENNUyBDb2xvciBDb252ZXJzaW9uIENvbnRleHQKKyAgICAgKi8KK3R5cGVkZWYgc3RydWN0IF9YY21zQ0NDIHsKKyAgICBEaXNwbGF5CSpkcHk7CQkJLyogWCBEaXNwbGF5ICovCisgICAgaW50CQlzY3JlZW5OdW1iZXI7CQkvKiBYIHNjcmVlbiBudW1iZXIgKi8KKyAgICBWaXN1YWwJKnZpc3VhbDsJCS8qIFggVmlzdWFsICovCisgICAgWGNtc0NvbG9yCWNsaWVudFdoaXRlUHQ7CQkvKiBDbGllbnQgV2hpdGUgUG9pbnQgKi8KKyAgICBYY21zQ29tcHJlc3Npb25Qcm9jCWdhbXV0Q29tcFByb2M7CS8qIEdhbXV0IENvbXByZXNzaW9uIEZ1bmN0aW9uICovCisgICAgWFBvaW50ZXIJZ2FtdXRDb21wQ2xpZW50RGF0YTsJLyogR2FtdXQgQ29tcCBGdW5jIENsaWVudCBEYXRhICovCisgICAgWGNtc1doaXRlQWRqdXN0UHJvYwl3aGl0ZVB0QWRqUHJvYzsJLyogV2hpdGUgUG9pbnQgQWRqdXN0bWVudCBGdW5jdGlvbiAqLworICAgIFhQb2ludGVyCXdoaXRlUHRBZGpDbGllbnREYXRhOwkvKiBXaGl0ZSBQdCBBZGogRnVuYyBDbGllbnQgRGF0YSAqLworICAgIFhjbXNQZXJTY3JuSW5mbyAqcFBlclNjcm5JbmZvOwkvKiBwb2ludGVyIHRvIHBlciBzY3JlZW4gaW5mb3JtYXRpb24gKi8KKwkJCQkJLyogIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWJvdmUgZGlzcGxheSAqLworCQkJCQkvKiAgc2NyZWVuTnVtYmVyICovCit9IFhjbXNDQ0NSZWM7CisKK3R5cGVkZWYgU3RhdHVzICgqWGNtc1NjcmVlbkluaXRQcm9jKSgJLyogU2NyZWVuIEluaXRpYWxpemF0aW9uIFByb2MgKi8KKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8sCisgICAgWGNtc1BlclNjcm5JbmZvKgkvKiBzY3JlZW5faW5mbyAqLworKTsKKwordHlwZWRlZiB2b2lkICgqWGNtc1NjcmVlbkZyZWVQcm9jKSgKKyAgICBYUG9pbnRlcgkJLyogc2NyZWVuRGF0YSAqLworKTsKKworICAgIC8qCisgICAgICogRnVuY3Rpb24gTGlzdCBQb2ludGVyIC0tIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZnVuY3Rpb24gcG9pbnRlcnMuCisgICAgICogICAgVGhlIGVuZCBvZiBsaXN0IGlzIGluZGljYXRlZCBieSBhIE5VTEwgcG9pbnRlci4KKyAgICAgKi8KKy8qCisgKiBYWFg6ICBUaGUgdXNlIG9mIHRoZSBYY21zQ29udmVyc2lvblByb2MgdHlwZSBpcyBicm9rZW4uICBUaGUKKyAqICAgICAgIGRldmljZS1pbmRlcGVuZGVudCBjb2xvdXIgY29udmVyc2lvbiBjb2RlIHVzZXMgaXQgYXM6CisKK3R5cGVkZWYgU3RhdHVzICgqWGNtc0NvbnZlcnNpb25Qcm9jKShYY21zQ0NDLCBYY21zQ29sb3IgKiwgWGNtc0NvbG9yICosCisJCQkJICAgICB1bnNpZ25lZCBpbnQpOworCisgKiAgICAgICB3aGlsZSB0aGUgZGV2aWNlLWRlcGVuZGVudCBjb2RlIHVzZXMgaXQgYXM6CisKK3R5cGVkZWYgU3RhdHVzICgqWGNtc0NvbnZlcnNpb25Qcm9jKShYY21zQ0NDLCBYY21zQ29sb3IgKiwgdW5zaWduZWQgaW50LAorCQkJCSAgICAgQm9vbCAqKTsKKworICogICAgICAgVW50aWwgdGhpcyBpcyByZXdvcmtlZCwgaXQncyBwcm9iYWJseSBiZXN0IHRvIGxlYXZlIGl0IHVucHJvdG9pemVkLgorICogICAgICAgVGhlIGNvZGUgd29ya3MgcmVnYXJkbGVzcy4KKyAqLwordHlwZWRlZiBTdGF0dXMgKCpYY21zRERDb252ZXJzaW9uUHJvYykoIC8qIHVzaW5nIGRldmljZS1kZXBlbmRlbnQgdmVyc2lvbiAqLworICAgIFhjbXNDQ0MgICAgICAgICAgICAgLyogY2NjICovLAorICAgIFhjbXNDb2xvciogICAgICAgICAgLyogcGNvbG9yc19pbl9vdXQgKi8sCisgICAgdW5zaWduZWQgaW50ICAgICAgICAvKiBuY29sb3JzICovLAorICAgIEJvb2wqICAgICAgICAgICAgICAgLyogcENvbXByZXNzZWQgKi8KKyAgICApOworCit0eXBlZGVmIFN0YXR1cyAoKlhjbXNESUNvbnZlcnNpb25Qcm9jKSggLyogdXNpbmcgZGV2aWNlLWluZGVwZW5kZW50IHZlcnNpb24gKi8KKyAgICBYY21zQ0NDICAgICAgICAgICAgIC8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqICAgICAgICAgIC8qIHdoaXRlX3BvaW50ICovLAorICAgIFhjbXNDb2xvciogICAgICAgICAgLyogcGNvbG9yc19pbl9vdXQgKi8sCisgICAgdW5zaWduZWQgaW50ICAgICAgICAvKiBuY29sb3JzICovCisgICAgKTsKKwordHlwZWRlZiBYY21zRElDb252ZXJzaW9uUHJvYyBYY21zQ29udmVyc2lvblByb2M7Cit0eXBlZGVmIFhjbXNDb252ZXJzaW9uUHJvYyAqWGNtc0Z1bmNMaXN0UHRyOworCit0eXBlZGVmIGludCAoKlhjbXNQYXJzZVN0cmluZ1Byb2MpKAkvKiBDb2xvciBTdHJpbmcgUGFyc2luZyBQcm9jICovCisgICAgY2hhcioJCS8qIGNvbG9yX3N0cmluZyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcl9yZXR1cm4gKi8KKyk7CisKKyAgICAvKgorICAgICAqIENvbG9yIFNwYWNlIC0tIHBlciBDb2xvciBTcGFjZSByZWxhdGVkIGRhdGEgKERldmljZS1JbmRlcGVuZGVudAorICAgICAqICAgIG9yIERldmljZS1EZXBlbmRlbnQpCisgICAgICovCit0eXBlZGVmIHN0cnVjdCBfWGNtc0NvbG9yU3BhY2UgeworICAgIGNvbnN0IGNoYXIgKnByZWZpeDsJCS8qIFByZWZpeCBvZiBzdHJpbmcgZm9ybWF0LgkJKi8KKyAgICBYY21zQ29sb3JGb3JtYXQgaWQ7CQkvKiBGb3JtYXQgSUQgbnVtYmVyLgkJCSovCisgICAgWGNtc1BhcnNlU3RyaW5nUHJvYyBwYXJzZVN0cmluZzsKKwkJCQkvKiBTdHJpbmcgZm9ybWF0IHBhcnNpbmcgZnVuY3Rpb24JKi8KKyAgICBYY21zRnVuY0xpc3RQdHIgdG9fQ0lFWFlaOwkvKiBQb2ludGVyIHRvIGFuIGFycmF5IG9mIGZ1bmN0aW9uIAkqLworCQkJCS8qICAgcG9pbnRlcnMgc3VjaCB0aGF0IHdoZW4gdGhlCSovCisJCQkJLyogICBmdW5jdGlvbnMgYXJlIGV4ZWN1dGVkIGluIHNlcXVlbmNlCSovCisJCQkJLyogICB3aWxsIGNvbnZlcnQgYSBYY21zQ29sb3Igc3RydWN0dXJlCSovCisJCQkJLyogICBmcm9tIHRoaXMgY29sb3Igc3BhY2UgdG8gQ0lFWFlaCSovCisJCQkJLyogICBzcGFjZS4JCQkJKi8KKyAgICBYY21zRnVuY0xpc3RQdHIgZnJvbV9DSUVYWVo7LyogUG9pbnRlciB0byBhbiBhcnJheSBvZiBmdW5jdGlvbiAJKi8KKwkJCQkvKiAgIHBvaW50ZXJzIHN1Y2ggdGhhdCB3aGVuIHRoZQkqLworCQkJCS8qICAgZnVuY3Rpb25zIGFyZSBleGVjdXRlZCBpbiBzZXF1ZW5jZQkqLworCQkJCS8qICAgd2lsbCBjb252ZXJ0IGEgWGNtc0NvbG9yIHN0cnVjdHVyZQkqLworCQkJCS8qICAgZnJvbSBDSUVYWVogc3BhY2UgdG8gdGhpcyBjb2xvcgkqLworCQkJCS8qICAgc3BhY2UuCQkJCSovCisgICAgaW50IGludmVyc2VfZmxhZzsJCS8qIElmIDEsIGluZGljYXRlcyB0aGF0IGZvciAwIDw9IGkgPCBuCSovCisJCQkJLyogICB3aGVyZSBuIGlzIHRoZSBudW1iZXIgb2YgZnVuY3Rpb24JKi8KKwkJCQkvKiAgIHBvaW50ZXJzIGluIHRoZSBsaXN0cyB0b19DSUVYWVoJKi8KKwkJCQkvKiAgIGFuZCBmcm9tX0NJRVhZWjsgZm9yIGVhY2ggZnVuY3Rpb24gKi8KKwkJCQkvKiAgIHRvX0NJRVhZWltpXSBpdHMgaW52ZXJzZSBmdW5jdGlvbgkqLworCQkJCS8qICAgaXMgZnJvbV9DSUVYWVpbbiAtIGldLgkJKi8KKworfSBYY21zQ29sb3JTcGFjZTsKKworICAgIC8qCisgICAgICogU2NyZWVuIENvbG9yIENoYXJhY3Rlcml6YXRpb24gRnVuY3Rpb24gU2V0IC0tIHBlciBkZXZpY2UgY2xhc3MKKyAgICAgKiAgICBjb2xvciBzcGFjZSBjb252ZXJzaW9uIGZ1bmN0aW9ucy4KKyAgICAgKi8KK3R5cGVkZWYgc3RydWN0IF9YY21zRnVuY3Rpb25TZXQgeworICAgIFhjbXNDb2xvclNwYWNlICoqRERDb2xvclNwYWNlczsKKwkJCQkvKiBQb2ludGVyIHRvIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvCSovCisJCQkJLyogICBEZXZpY2UtREVQRU5ERU5UIGNvbG9yIHNwYWNlcwkqLworCQkJCS8qICAgdW5kZXJzdG9vZCBieSB0aGlzIFNDQ0Z1bmNTZXQuCSovCisgICAgWGNtc1NjcmVlbkluaXRQcm9jIHNjcmVlbkluaXRQcm9jOworCQkJCS8qIFNjcmVlbiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiB0aGF0CSovCisJCQkJLyogICByZWFkcyBTY3JlZW4gQ29sb3IgQ2hhcmFjdGVyaXphdGlvbiovCisJCQkJLyogICBEYXRhIG9mZiBwcm9wZXJ0aWVzIG9uIHRoZSBzY3JlZW4ncyovCisJCQkJLyogICByb290IHdpbmRvdy4JCQkqLworICAgIFhjbXNTY3JlZW5GcmVlUHJvYyBzY3JlZW5GcmVlUHJvYzsKKwkJCQkvKiBGdW5jdGlvbiB0aGF0IGZyZWVzIHRoZSBTQ0NEYXRhCSovCisJCQkJLyogICBzdHJ1Y3R1cmVzLgkJCSovCit9IFhjbXNGdW5jdGlvblNldDsKKworX1hGVU5DUFJPVE9CRUdJTgorCitleHRlcm4gU3RhdHVzIFhjbXNBZGRDb2xvclNwYWNlICgKKyAgICBYY21zQ29sb3JTcGFjZSoJLyogcENvbG9yU3BhY2UgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0FkZEZ1bmN0aW9uU2V0ICgKKyAgICBYY21zRnVuY3Rpb25TZXQqCS8qIGZ1bmN0aW9uU2V0ICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNBbGxvY0NvbG9yICgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcl9pbl9vdXQgKi8sCisgICAgWGNtc0NvbG9yRm9ybWF0CQkvKiByZXN1bHRfZm9ybWF0ICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNBbGxvY05hbWVkQ29sb3IgKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIF9YY29uc3QgY2hhcioJLyogY29sb3Jfc3RyaW5nICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3Njcm5fcmV0dXJuICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX2V4YWN0X3JldHVybiAqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJCS8qIHJlc3VsdF9mb3JtYXQgKi8KKyk7CisKK2V4dGVybiBYY21zQ0NDIFhjbXNDQ0NPZkNvbG9ybWFwICgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFTGFiQ2xpcGFiKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnNfaW5fb3V0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBpbmRleCAqLywKKyAgICBCb29sKgkJLyogY29tcHJlc3Npb25fZmxhZ3NfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVMYWJDbGlwTCgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzX2luX291dCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaW5kZXggKi8sCisgICAgQm9vbCoJCS8qIGNvbXByZXNzaW9uX2ZsYWdzX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFTGFiQ2xpcExhYigKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzX2luX291dCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaW5kZXggKi8sCisgICAgQm9vbCoJCS8qIGNvbXByZXNzaW9uX2ZsYWdzX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFTGFiUXVlcnlNYXhDICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBodWVfYW5nbGUgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBMX3N0YXIgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVMYWJRdWVyeU1heEwgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zRmxvYXQJCS8qIGh1ZV9hbmdsZSAqLywKKyAgICBYY21zRmxvYXQJCS8qIGNocm9tYSAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRUxhYlF1ZXJ5TWF4TEMgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zRmxvYXQJCS8qIGh1ZV9hbmdsZSAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRUxhYlF1ZXJ5TWluTCAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNGbG9hdAkJLyogaHVlX2FuZ2xlICovLAorICAgIFhjbXNGbG9hdAkJLyogY2hyb21hICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFTGFiVG9DSUVYWVogKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiB3aGl0ZV9wb2ludCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRUxhYldoaXRlU2hpZnRDb2xvcnMoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGluaXRpYWxfd2hpdGVfcG9pbnQqLywKKyAgICBYY21zQ29sb3IqCQkvKiB0YXJnZXRfd2hpdGVfcG9pbnQqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJLyogdGFyZ2V0X2Zvcm1hdCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnNfaW5fb3V0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIEJvb2wqCQkvKiBjb21wcmVzc2lvbl9mbGFnc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRUx1dkNsaXBMKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnNfaW5fb3V0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBpbmRleCAqLywKKyAgICBCb29sKgkJLyogY29tcHJlc3Npb25fZmxhZ3NfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVMdXZDbGlwTHV2KAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnNfaW5fb3V0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBpbmRleCAqLywKKyAgICBCb29sKgkJLyogY29tcHJlc3Npb25fZmxhZ3NfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVMdXZDbGlwdXYoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yc19pbl9vdXQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGluZGV4ICovLAorICAgIEJvb2wqCQkvKiBjb21wcmVzc2lvbl9mbGFnc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRUx1dlF1ZXJ5TWF4QyAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNGbG9hdAkJLyogaHVlX2FuZ2xlICovLAorICAgIFhjbXNGbG9hdAkJLyogTF9zdGFyICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFTHV2UXVlcnlNYXhMICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBodWVfYW5nbGUgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBjaHJvbWEgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVMdXZRdWVyeU1heExDICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBodWVfYW5nbGUgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVMdXZRdWVyeU1pbkwgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zRmxvYXQJCS8qIGh1ZV9hbmdsZSAqLywKKyAgICBYY21zRmxvYXQJCS8qIGNocm9tYSAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRUx1dlRvQ0lFdXZZICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogd2hpdGVfcG9pbnQgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVMdXZXaGl0ZVNoaWZ0Q29sb3JzKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBpbml0aWFsX3doaXRlX3BvaW50Ki8sCisgICAgWGNtc0NvbG9yKgkJLyogdGFyZ2V0X3doaXRlX3BvaW50Ki8sCisgICAgWGNtc0NvbG9yRm9ybWF0CS8qIHRhcmdldF9mb3JtYXQgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzX2luX291dCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLywKKyAgICBCb29sKgkJLyogY29tcHJlc3Npb25fZmxhZ3NfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVYWVpUb0NJRUxhYiAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIHdoaXRlX3BvaW50ICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFWFlaVG9DSUV1dlkgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiB3aGl0ZV9wb2ludCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRVhZWlRvQ0lFeHlZICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogd2hpdGVfcG9pbnQgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVYWVpUb1JHQmkgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8sCisgICAgQm9vbCoJCS8qIGNvbXByZXNzaW9uX2ZsYWdzX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFdXZZVG9DSUVMdXYgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiB3aGl0ZV9wb2ludCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRXV2WVRvQ0lFWFlaICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogd2hpdGVfcG9pbnQgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUV1dllUb1Rla0hWQyAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIHdoaXRlX3BvaW50ICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFeHlZVG9DSUVYWVogKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiB3aGl0ZV9wb2ludCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8KKyk7CisKK2V4dGVybiBYY21zQ29sb3IgKlhjbXNDbGllbnRXaGl0ZVBvaW50T2ZDQ0MgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ29udmVydENvbG9ycyAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yQXJyeV9pbl9vdXQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5Db2xvcnMgKi8sCisgICAgWGNtc0NvbG9yRm9ybWF0CQkvKiB0YXJnZXRGb3JtYXQgKi8sCisgICAgQm9vbCoJCS8qIGNvbXBBcnJ5X3JldHVybiAqLworKTsKKworZXh0ZXJuIFhjbXNDQ0MgWGNtc0NyZWF0ZUNDQyAoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5OdW1iZXIgKi8sCisgICAgVmlzdWFsKgkJLyogdmlzdWFsICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNsaWVudFdoaXRlUHQgKi8sCisgICAgWGNtc0NvbXByZXNzaW9uUHJvYyAvKiBnYW11dENvbXBQcm9jICovLAorICAgIFhQb2ludGVyCQkvKiBnYW11dENvbXBDbGllbnREYXRhICovLAorICAgIFhjbXNXaGl0ZUFkanVzdFByb2MJLyogd2hpdGVQdEFkalByb2MgKi8sCisgICAgWFBvaW50ZXIJCS8qIHdoaXRlUHRBZGpDbGllbnREYXRhICovCispOworCitleHRlcm4gWGNtc0NDQyBYY21zRGVmYXVsdENDQyAoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5OdW1iZXIgKi8KKyk7CisKK2V4dGVybiBEaXNwbGF5ICpYY21zRGlzcGxheU9mQ0NDICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8KKyk7CisKK2V4dGVybiBYY21zQ29sb3JGb3JtYXQgWGNtc0Zvcm1hdE9mUHJlZml4ICgKKyAgICBjaGFyKgkJLyogcHJlZml4ICovCispOworCitleHRlcm4gdm9pZCBYY21zRnJlZUNDQyAoCisgICAgWGNtc0NDQwkJLyogY2NjICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNMb29rdXBDb2xvciAoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBjb2xvcl9zdHJpbmcgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogcENvbG9yX2V4YWN0X2luX291dCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBwQ29sb3Jfc2Nybl9pbl9vdXQgKi8sCisgICAgWGNtc0NvbG9yRm9ybWF0CQkvKiByZXN1bHRfZm9ybWF0ICovCispOworCitleHRlcm4gY2hhciAqWGNtc1ByZWZpeE9mRm9ybWF0ICgKKyAgICBYY21zQ29sb3JGb3JtYXQJCS8qIGlkICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNRdWVyeUJsYWNrICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yRm9ybWF0CS8qIHRhcmdldF9mb3JtYXQgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNRdWVyeUJsdWUgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJLyogdGFyZ2V0X2Zvcm1hdCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1F1ZXJ5Q29sb3IgKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIFhjbXNDb2xvcioJCS8qIHBDb2xvcl9pbl9vdXQgKi8sCisgICAgWGNtc0NvbG9yRm9ybWF0CQkvKiByZXN1bHRfZm9ybWF0ICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNRdWVyeUNvbG9ycyAoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JBcnJ5X2luX291dCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbkNvbG9ycyAqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJLyogcmVzdWx0X2Zvcm1hdCAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zUXVlcnlHcmVlbiAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvckZvcm1hdAkvKiB0YXJnZXRfZm9ybWF0ICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zUXVlcnlSZWQgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJLyogdGFyZ2V0X2Zvcm1hdCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1F1ZXJ5V2hpdGUgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJLyogdGFyZ2V0X2Zvcm1hdCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1JHQmlUb0NJRVhZWiAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLywKKyAgICBCb29sKgkJLyogY29tcHJlc3Npb25fZmxhZ3NfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNSR0JpVG9SR0IgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8sCisgICAgQm9vbCoJCS8qIGNvbXByZXNzaW9uX2ZsYWdzX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zUkdCVG9SR0JpICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIEJvb2wqCQkvKiBjb21wcmVzc2lvbl9mbGFnc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWGNtc1NjcmVlbk51bWJlck9mQ0NDICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8KKyk7CisKK2V4dGVybiBYY21zQ29sb3IgKlhjbXNTY3JlZW5XaGl0ZVBvaW50T2ZDQ0MgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLworKTsKKworZXh0ZXJuIFhjbXNDQ0MgWGNtc1NldENDQ09mQ29sb3JtYXAoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCisgICAgWGNtc0NDQwkJLyogY2NjICovCispOworCitleHRlcm4gWGNtc0NvbXByZXNzaW9uUHJvYyBYY21zU2V0Q29tcHJlc3Npb25Qcm9jICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbXByZXNzaW9uUHJvYwkvKiBjb21wcmVzc2lvbl9wcm9jICovLAorICAgIFhQb2ludGVyCQkvKiBjbGllbnRfZGF0YSAqLworKTsKKworZXh0ZXJuIFhjbXNXaGl0ZUFkanVzdFByb2MgWGNtc1NldFdoaXRlQWRqdXN0UHJvYyAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNXaGl0ZUFkanVzdFByb2MJLyogd2hpdGVfYWRqdXN0X3Byb2MgKi8sCisgICAgWFBvaW50ZXIJCS8qIGNsaWVudF9kYXRhICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNTZXRXaGl0ZVBvaW50ICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3IgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1N0b3JlQ29sb3IgKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIFhjbXNDb2xvcioJCS8qIHBDb2xvcl9pbiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zU3RvcmVDb2xvcnMgKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yQXJyeV9pbiAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbkNvbG9ycyAqLywKKyAgICBCb29sKgkJLyogY29tcEFycnlfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNUZWtIVkNDbGlwQygKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzX2luX291dCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaW5kZXggKi8sCisgICAgQm9vbCoJCS8qIGNvbXByZXNzaW9uX2ZsYWdzX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zVGVrSFZDQ2xpcFYoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yc19pbl9vdXQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGluZGV4ICovLAorICAgIEJvb2wqCQkvKiBjb21wcmVzc2lvbl9mbGFnc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1Rla0hWQ0NsaXBWQygKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzX2luX291dCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaW5kZXggKi8sCisgICAgQm9vbCoJCS8qIGNvbXByZXNzaW9uX2ZsYWdzX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zVGVrSFZDUXVlcnlNYXhDICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBodWUgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiB2YWx1ZSAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1Rla0hWQ1F1ZXJ5TWF4ViAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNGbG9hdAkJLyogaHVlICovLAorICAgIFhjbXNGbG9hdAkJLyogY2hyb21hICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zVGVrSFZDUXVlcnlNYXhWQyAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNGbG9hdAkJLyogaHVlICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zVGVrSFZDUXVlcnlNYXhWU2FtcGxlcyAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNGbG9hdAkJLyogaHVlICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yc19yZXR1cm4gKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5zYW1wbGVzICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNUZWtIVkNRdWVyeU1pblYgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zRmxvYXQJCS8qIGh1ZSAqLywKKyAgICBYY21zRmxvYXQJCS8qIGNocm9tYSAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1Rla0hWQ1RvQ0lFdXZZICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogd2hpdGVfcG9pbnQgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNUZWtIVkNXaGl0ZVNoaWZ0Q29sb3JzKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBpbml0aWFsX3doaXRlX3BvaW50Ki8sCisgICAgWGNtc0NvbG9yKgkJLyogdGFyZ2V0X3doaXRlX3BvaW50Ki8sCisgICAgWGNtc0NvbG9yRm9ybWF0CS8qIHRhcmdldF9mb3JtYXQgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzX2luX291dCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLywKKyAgICBCb29sKgkJLyogY29tcHJlc3Npb25fZmxhZ3NfcmV0dXJuICovCispOworCitleHRlcm4gVmlzdWFsICpYY21zVmlzdWFsT2ZDQ0MgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9YMTFfWENNU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGRlZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmZmRhZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hkZWZzLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIDE5OTkgIFRoZSBYRnJlZTg2IFByb2plY3QgSW5jLgorCitBbGwgUmlnaHRzIFJlc2VydmVkLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIFhGcmVlODYgUHJvamVjdAorSW5jLiBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUKK3NhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBYRnJlZTg2IFByb2plY3QgSW5jLi4KKworKi8KKworLyoqCisgKiogVHlwZXMgZGVmaW5pdGlvbnMgc2hhcmVkIGJldHdlZW4gc2VydmVyIGFuZCBjbGllbnRzIAorICoqLworCisjaWZuZGVmIF9YREVGU19ICisjZGVmaW5lIF9YREVGU19ICisKKyNpZmRlZiBfWFNFUlZFUjY0CisjaW5jbHVkZSA8WDExL1htZC5oPgorI2VuZGlmIAorCisjaWZuZGVmIF9YVFlQRURFRl9BVE9NCisjICBkZWZpbmUgX1hUWVBFREVGX0FUT00KKyMgIGlmbmRlZiBfWFNFUlZFUjY0Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgQXRvbTsKKyMgIGVsc2UKK3R5cGVkZWYgQ0FSRDMyIEF0b207CisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgQm9vbAorIyAgaWZuZGVmIF9YVFlQRURFRl9CT09MCisjICAgZGVmaW5lIF9YVFlQRURFRl9CT09MCit0eXBlZGVmIGludCBCb29sOworIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9YVFlQRURFRl9QT0lOVEVSCisjICBkZWZpbmUgX1hUWVBFREVGX1BPSU5URVIKK3R5cGVkZWYgdm9pZCAqcG9pbnRlcjsKKyNlbmRpZgorCisjaWZuZGVmIF9YVFlQRURFRl9DTElFTlRQVFIKK3R5cGVkZWYgc3RydWN0IF9DbGllbnQgKkNsaWVudFB0cjsKKyMgIGRlZmluZSBfWFRZUEVERUZfQ0xJRU5UUFRSCisjZW5kaWYKKworI2lmbmRlZiBfWFRZUEVERUZfWElECisjICBkZWZpbmUgX1hUWVBFREVGX1hJRAorIyAgaWZuZGVmIF9YU0VSVkVSNjQKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBYSUQ7CisjICBlbHNlCit0eXBlZGVmIENBUkQzMiBYSUQ7CisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX1hUWVBFREVGX01BU0sKKyMgIGRlZmluZSBfWFRZUEVERUZfTUFTSworIyAgaWZuZGVmIF9YU0VSVkVSNjQKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBNYXNrOworIyAgZWxzZQordHlwZWRlZiBDQVJEMzIgTWFzazsKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfWFRZUEVERUZfRk9OVFBUUgorIyAgZGVmaW5lIF9YVFlQRURFRl9GT05UUFRSCit0eXBlZGVmIHN0cnVjdCBfRm9udCAqRm9udFB0cjsgLyogYWxzbyBpbiBmb250cy9pbmNsdWRlL2ZvbnQuaCAqLworI2VuZGlmCisKKyNpZm5kZWYgX1hUWVBFREVGX0ZPTlQKKyMgIGRlZmluZSBfWFRZUEVERUZfRk9OVAordHlwZWRlZiBYSUQJRm9udDsKKyNlbmRpZgorCisjaWZuZGVmIF9YVFlQRURFRl9GU0lECisjICBpZm5kZWYgX1hTRVJWRVI2NAordHlwZWRlZiB1bnNpZ25lZCBsb25nIEZTSUQ7CisjICBlbHNlCit0eXBlZGVmIENBUkQzMiBGU0lEOworIyAgZW5kaWYKKyNlbmRpZgorCit0eXBlZGVmIEZTSUQgQWNjQ29udGV4dDsKKworLyogT1MgaW5kZXBlbmRlbnQgdGltZSB2YWx1ZSAKKyAgIFhYWCBTaG91bGQgcHJvYmFibHkgZ28gaW4gWG9zLmggKi8KK3R5cGVkZWYgc3RydWN0IHRpbWV2YWwgKipPU1RpbWVQdHI7CisKKwordHlwZWRlZiB2b2lkICgqIEJsb2NrSGFuZGxlclByb2NQdHIpKHBvaW50ZXIgLyogYmxvY2tEYXRhICovLAorCQkJCSAgICAgT1NUaW1lUHRyIC8qIHBUaW1lb3V0ICovLAorCQkJCSAgICAgcG9pbnRlciAvKiBwUmVhZG1hc2sgKi8pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hmdW5jcHJvdG8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hmdW5jcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjFjNzkzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGZ1bmNwcm90by5oCkBAIC0wLDAgKzEsMTcyIEBACisvKiBYZnVuY3Byb3RvLmguICBHZW5lcmF0ZWQgZnJvbSBYZnVuY3Byb3RvLmguaW4gYnkgY29uZmlndXJlLiAgKi8KKy8qCisgKgorQ29weXJpZ2h0IDE5ODksIDE5OTEsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisgKgorICovCisKKy8qIERlZmluaXRpb25zIHRvIG1ha2UgZnVuY3Rpb24gcHJvdG90eXBlcyBtYW5hZ2VhYmxlICovCisKKyNpZm5kZWYgX1hGVU5DUFJPVE9fSF8KKyNkZWZpbmUgX1hGVU5DUFJPVE9fSF8KKworI2lmbmRlZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCisjZGVmaW5lIE5lZWRGdW5jdGlvblByb3RvdHlwZXMgMQorI2VuZGlmIC8qIE5lZWRGdW5jdGlvblByb3RvdHlwZXMgKi8KKworI2lmbmRlZiBOZWVkVmFyYXJnc1Byb3RvdHlwZXMKKyNkZWZpbmUgTmVlZFZhcmFyZ3NQcm90b3R5cGVzIDEKKyNlbmRpZiAvKiBOZWVkVmFyYXJnc1Byb3RvdHlwZXMgKi8KKworI2lmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKKworI2lmbmRlZiBOZWVkTmVzdGVkUHJvdG90eXBlcworI2RlZmluZSBOZWVkTmVzdGVkUHJvdG90eXBlcyAxCisjZW5kaWYgLyogTmVlZE5lc3RlZFByb3RvdHlwZXMgKi8KKworI2lmbmRlZiBfWGNvbnN0CisjZGVmaW5lIF9YY29uc3QgY29uc3QKKyNlbmRpZiAvKiBfWGNvbnN0ICovCisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZSBjb25maWd1cmF0aW9uIChzZWUgY29uZmlndXJlIGZvciBtb3JlIGluZm8pICovCisjaWZuZGVmIE5BUlJPV1BST1RPCisjZGVmaW5lIE5BUlJPV1BST1RPIC8qKi8KKyNlbmRpZgorI2lmbmRlZiBGVU5DUFJPVE8KKyNkZWZpbmUgRlVOQ1BST1RPIDE1CisjZW5kaWYKKworI2lmbmRlZiBOZWVkV2lkZVByb3RvdHlwZXMKKyNpZmRlZiBOQVJST1dQUk9UTworI2RlZmluZSBOZWVkV2lkZVByb3RvdHlwZXMgMAorI2Vsc2UKKyNkZWZpbmUgTmVlZFdpZGVQcm90b3R5cGVzIDEJCS8qIGRlZmF1bHQgdG8gbWFrZSBpbnRlcnJvcHQuIGVhc2llciAqLworI2VuZGlmCisjZW5kaWYgLyogTmVlZFdpZGVQcm90b3R5cGVzICovCisKKyNlbmRpZiAvKiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzICovCisKKyNpZm5kZWYgX1hGVU5DUFJPVE9CRUdJTgorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykgLyogZm9yIEMrKyBWMi4wICovCisjZGVmaW5lIF9YRlVOQ1BST1RPQkVHSU4gZXh0ZXJuICJDIiB7CS8qIGRvIG5vdCBsZWF2ZSBvcGVuIGFjcm9zcyBpbmNsdWRlcyAqLworI2RlZmluZSBfWEZVTkNQUk9UT0VORCB9CisjZWxzZQorI2RlZmluZSBfWEZVTkNQUk9UT0JFR0lOCisjZGVmaW5lIF9YRlVOQ1BST1RPRU5ECisjZW5kaWYKKyNlbmRpZiAvKiBfWEZVTkNQUk9UT0JFR0lOICovCisKKy8qIEFkZGVkIGluIFgxMVI2LjksIHNvIGF2YWlsYWJsZSBpbiBhbnkgdmVyc2lvbiBvZiBtb2R1bGFyIHhwcm90byAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA+PSA0KQorIyBkZWZpbmUgX1hfU0VOVElORUwoeCkgX19hdHRyaWJ1dGVfXyAoKF9fc2VudGluZWxfXyh4KSkpCisjZWxzZQorIyBkZWZpbmUgX1hfU0VOVElORUwoeCkKKyNlbmRpZiAvKiBHTlVDID49IDQgKi8KKworLyogQWRkZWQgaW4gWDExUjYuOSwgc28gYXZhaWxhYmxlIGluIGFueSB2ZXJzaW9uIG9mIG1vZHVsYXIgeHByb3RvICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID49IDQpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCisjIGRlZmluZSBfWF9FWFBPUlQgICAgICBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorIyBkZWZpbmUgX1hfSElEREVOICAgICAgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKQorIyBkZWZpbmUgX1hfSU5URVJOQUwgICAgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaW50ZXJuYWwiKSkpCisjZWxpZiBkZWZpbmVkKF9fU1VOUFJPX0MpICYmIChfX1NVTlBST19DID49IDB4NTUwKQorIyBkZWZpbmUgX1hfRVhQT1JUICAgICAgX19nbG9iYWwKKyMgZGVmaW5lIF9YX0hJRERFTiAgICAgIF9faGlkZGVuCisjIGRlZmluZSBfWF9JTlRFUk5BTCAgICBfX2hpZGRlbgorI2Vsc2UgLyogbm90IGdjYyA+PSA0IGFuZCBub3QgU3VuIFN0dWRpbyA+PSA4ICovCisjIGRlZmluZSBfWF9FWFBPUlQKKyMgZGVmaW5lIF9YX0hJRERFTgorIyBkZWZpbmUgX1hfSU5URVJOQUwKKyNlbmRpZiAvKiBHTlVDID49IDQgKi8KKworLyogcmVxdWlyZXMgeHByb3RvID49IDcuMC45ICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKChfX0dOVUNfXyAqIDEwMCArIF9fR05VQ19NSU5PUl9fKSA+PSAzMDMpCisjIGRlZmluZSBfWF9MSUtFTFkoeCkgICBfX2J1aWx0aW5fZXhwZWN0KCEhKHgpLCAxKQorIyBkZWZpbmUgX1hfVU5MSUtFTFkoeCkgX19idWlsdGluX2V4cGVjdCghISh4KSwgMCkKKyNlbHNlIC8qIG5vdCBnY2MgPj0gMy4zICovCisjIGRlZmluZSBfWF9MSUtFTFkoeCkgICAoeCkKKyMgZGVmaW5lIF9YX1VOTElLRUxZKHgpICh4KQorI2VuZGlmCisKKy8qIEFkZGVkIGluIFgxMVI2LjksIHNvIGF2YWlsYWJsZSBpbiBhbnkgdmVyc2lvbiBvZiBtb2R1bGFyIHhwcm90byAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoX19HTlVDX18gKiAxMDAgKyBfX0dOVUNfTUlOT1JfXykgPj0gMzAxKQorIyBkZWZpbmUgX1hfREVQUkVDQVRFRCAgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpCisjZWxzZSAvKiBub3QgZ2NjID49IDMuMSAqLworIyBkZWZpbmUgX1hfREVQUkVDQVRFRAorI2VuZGlmCisKKy8qIHJlcXVpcmVzIHhwcm90byA+PSA3LjAuMTcgKi8KKyNpZiAoZGVmaW5lZChfX0dOVUNfXykgJiYgKChfX0dOVUNfXyAqIDEwMCArIF9fR05VQ19NSU5PUl9fKSA+PSAyMDUpKSBcCisJfHwgKGRlZmluZWQoX19TVU5QUk9fQykgJiYgKF9fU1VOUFJPX0MgPj0gMHg1OTApKQorIyBkZWZpbmUgX1hfTk9SRVRVUk4gX19hdHRyaWJ1dGUoKG5vcmV0dXJuKSkKKyNlbHNlCisjIGRlZmluZSBfWF9OT1JFVFVSTgorI2VuZGlmIC8qIEdOVUMgICovCisKKy8qIEFkZGVkIGluIFgxMVI2LjksIHNvIGF2YWlsYWJsZSBpbiBhbnkgdmVyc2lvbiBvZiBtb2R1bGFyIHhwcm90byAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoX19HTlVDX18gKiAxMDAgKyBfX0dOVUNfTUlOT1JfXykgPj0gMjAzKQorIyBkZWZpbmUgX1hfQVRUUklCVVRFX1BSSU5URih4LHkpIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18oX19wcmludGZfXyx4LHkpKSkKKyNlbHNlIC8qIG5vdCBnY2MgPj0gMi4zICovCisjIGRlZmluZSBfWF9BVFRSSUJVVEVfUFJJTlRGKHgseSkKKyNlbmRpZgorCisvKiByZXF1aXJlcyB4cHJvdG8gPj0gNy4wLjIyICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgICgoX19HTlVDX18gKiAxMDAgKyBfX0dOVUNfTUlOT1JfXykgPj0gMzAzKQorI2RlZmluZSBfWF9OT05OVUxMKGFyZ3MuLi4pICBfX2F0dHJpYnV0ZV9fKChub25udWxsKGFyZ3MpKSkKKyNlbHNlCisjZGVmaW5lIF9YX05PTk5VTEwoLi4uKSAgLyogKi8KKyNlbmRpZgorCisvKiByZXF1aXJlcyB4cHJvdG8gPj0gNy4wLjIyICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgICgoX19HTlVDX18gKiAxMDAgKyBfX0dOVUNfTUlOT1JfXykgPj0gMjA1KQorI2RlZmluZSBfWF9VTlVTRUQgIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKQorI2Vsc2UKKyNkZWZpbmUgX1hfVU5VU0VEICAvKiAqLworI2VuZGlmCisKKy8qIEM5OSBrZXl3b3JkICJpbmxpbmUiIG9yIGVxdWl2YWxlbnQgZXh0ZW5zaW9ucyBpbiBwcmUtQzk5IGNvbXBpbGVycyAqLworLyogcmVxdWlyZXMgeHByb3RvID49IDcuMC45CisgICAoaW50cm9kdWNlZCBpbiA3LjAuOCBidXQgZGlkbid0IHN1cHBvcnQgYWxsIGNvbXBpbGVycyB1bnRpbCA3LjAuOSkgKi8KKyNpZiBkZWZpbmVkKGlubGluZSkgLyogYXNzdW1lIGF1dG9jb25mIHNldCBpdCBjb3JyZWN0bHkgKi8gfHwgXAorICAgKGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgKF9fU1REQ19WRVJTSU9OX18gLSAwID49IDE5OTkwMUwpKSAvKiBDOTkgKi8gfHwgXAorICAgKGRlZmluZWQoX19TVU5QUk9fQykgJiYgKF9fU1VOUFJPX0MgPj0gMHg1NTApKQorIyBkZWZpbmUgX1hfSU5MSU5FIGlubGluZQorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAvKiBnY2Mgdy9DODkrZXh0ZW5zaW9ucyAqLworIyBkZWZpbmUgX1hfSU5MSU5FIF9faW5saW5lX18KKyNlbHNlCisjIGRlZmluZSBfWF9JTkxJTkUKKyNlbmRpZgorCisvKiBDOTkga2V5d29yZCAicmVzdHJpY3QiIG9yIGVxdWl2YWxlbnQgZXh0ZW5zaW9ucyBpbiBwcmUtQzk5IGNvbXBpbGVycyAqLworLyogcmVxdWlyZXMgeHByb3RvID49IDcuMC4yMSAqLworI2lmbmRlZiBfWF9SRVNUUklDVF9LWVdECisjIGlmIGRlZmluZWQocmVzdHJpY3QpIC8qIGFzc3VtZSBhdXRvY29uZiBzZXQgaXQgY29ycmVjdGx5ICovIHx8IFwKKyAgIChkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIChfX1NURENfVkVSU0lPTl9fIC0gMCA+PSAxOTk5MDFMKSkgLyogQzk5ICovCisjICBkZWZpbmUgX1hfUkVTVFJJQ1RfS1lXRCAgcmVzdHJpY3QKKyMgZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIC8qIGdjYyB3L0M4OStleHRlbnNpb25zICovCisjICBkZWZpbmUgX1hfUkVTVFJJQ1RfS1lXRCBfX3Jlc3RyaWN0X18KKyMgZWxzZQorIyAgZGVmaW5lIF9YX1JFU1RSSUNUX0tZV0QKKyMgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogX1hGVU5DUFJPVE9fSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hmdW5jcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGZ1bmNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0YjY2MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hmdW5jcy5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiAKK0NvcHlyaWdodCAxOTkwLCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorICoKKyAqLworCisjaWZuZGVmIF9YRlVOQ1NfSF8KKyMgZGVmaW5lIF9YRlVOQ1NfSF8KKworIyBpbmNsdWRlIDxYMTEvWG9zZGVmcy5oPgorCisvKiB0aGUgb2xkIFhmdW5jcy5oLCBmb3IgcHJlLVI2ICovCisjIGlmICEoZGVmaW5lZChYRnJlZTg2TE9BREVSKSAmJiBkZWZpbmVkKElOX01PRFVMRSkpCisKKyMgIGlmZGVmIFhfVVNFQkZVTkNTCit2b2lkIGJjb3B5KCk7Cit2b2lkIGJ6ZXJvKCk7CitpbnQgYmNtcCgpOworIyAgZWxzZQorIyAgIGlmIGRlZmluZWQoU1lTVikgJiYgIWRlZmluZWQoX19TQ09fXykgJiYgIWRlZmluZWQoX19zdW4pICYmICFkZWZpbmVkKF9fVU5JWFdBUkVfXykKKyMgICAgaW5jbHVkZSA8bWVtb3J5Lmg+Cit2b2lkIGJjb3B5KCk7CisjICAgIGRlZmluZSBiemVybyhiLGxlbikgbWVtc2V0KGIsIDAsIGxlbikKKyMgICAgZGVmaW5lIGJjbXAoYjEsYjIsbGVuKSBtZW1jbXAoYjEsIGIyLCBsZW4pCisjICAgZWxzZQorIyAgICBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgICAgaWYgZGVmaW5lZChfX1NDT19fKSB8fCBkZWZpbmVkKF9fc3VuKSB8fCBkZWZpbmVkKF9fVU5JWFdBUkVfXykKKyMgICAgIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyMgICAgZW5kaWYKKyMgICAgZGVmaW5lIF9YRlVOQ1NfSF9JTkNMVURFRF9TVFJJTkdfSAorIyAgIGVuZGlmCisjICBlbmRpZiAvKiBYX1VTRUJGVU5DUyAqLworCisvKiB0aGUgbmV3IFhmdW5jcy5oICovCisKKy8qIHRoZSBBTlNJIEMgd2F5ICovCisjICBpZm5kZWYgX1hGVU5DU19IX0lOQ0xVREVEX1NUUklOR19ICisjICAgaW5jbHVkZSA8c3RyaW5nLmg+CisjICBlbmRpZgorIyAgdW5kZWYgYnplcm8KKyMgIGRlZmluZSBiemVybyhiLGxlbikgbWVtc2V0KGIsMCxsZW4pCisKKyMgIGlmIGRlZmluZWQgV0lOMzIgJiYgZGVmaW5lZCBfX01JTkdXMzJfXworIyAgIGRlZmluZSBiY29weShiMSxiMixsZW4pIG1lbW1vdmUoYjIsIGIxLCAoc2l6ZV90KShsZW4pKQorIyAgZW5kaWYKKworIyBlbmRpZiAvKiAhKGRlZmluZWQoWEZyZWU4NkxPQURFUikgJiYgZGVmaW5lZChJTl9NT0RVTEUpKSAqLworCisjZW5kaWYgLyogX1hGVU5DU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGxpYi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNGM3YzQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YbGliLmgKQEAgLTAsMCArMSw0MDI0IEBACisvKgorCitDb3B5cmlnaHQgMTk4NSwgMTk4NiwgMTk4NywgMTk5MSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKi8KKworCisvKgorICoJWGxpYi5oIC0gSGVhZGVyIGRlZmluaXRpb24gYW5kIHN1cHBvcnQgZmlsZSBmb3IgdGhlIEMgc3Vicm91dGluZQorICoJaW50ZXJmYWNlIGxpYnJhcnkgKFhsaWIpIHRvIHRoZSBYIFdpbmRvdyBTeXN0ZW0gUHJvdG9jb2wgKFYxMSkuCisgKglTdHJ1Y3R1cmVzIGFuZCBzeW1ib2xzIHN0YXJ0aW5nIHdpdGggIl8iIGFyZSBwcml2YXRlIHRvIHRoZSBsaWJyYXJ5LgorICovCisjaWZuZGVmIF9YMTFfWExJQl9IXworI2RlZmluZSBfWDExX1hMSUJfSF8KKworI2RlZmluZSBYbGliU3BlY2lmaWNhdGlvblJlbGVhc2UgNgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpZiBkZWZpbmVkKF9fU0NPX18pIHx8IGRlZmluZWQoX19VTklYV0FSRV9fKQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxYMTEvWC5oPgorCisvKiBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCBkZXBlbmQgb24gdGhlc2UgdHdvIGhlYWRlcnMgYmVpbmcgaW5jbHVkZWQhICovCisjaW5jbHVkZSA8WDExL1hmdW5jcHJvdG8uaD4KKyNpbmNsdWRlIDxYMTEvWG9zZGVmcy5oPgorCisjaWZuZGVmIFhfV0NIQVIKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbHNlCisjaWZkZWYgX19VTklYT1MyX18KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbHNlCisvKiByZXBsYWNlIHRoaXMgd2l0aCAjaW5jbHVkZSBvciB0eXBlZGVmIGFwcHJvcHJpYXRlIGZvciB5b3VyIHN5c3RlbSAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHdjaGFyX3Q7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChJU0MpICYmIGRlZmluZWQoVVNFX1hNQlRPV0MpCisjZGVmaW5lIHdjdG9tYihhLGIpCV9Yd2N0b21iKGEsYikKKyNkZWZpbmUgbWJsZW4oYSxiKQlfWG1ibGVuKGEsYikKKyNpZm5kZWYgVVNFX1hXQ0hBUl9TVFJJTkcKKyNkZWZpbmUgbWJ0b3djKGEsYixjKQlfWG1idG93YyhhLGIsYykKKyNlbmRpZgorI2VuZGlmCisKK2V4dGVybiBpbnQKK19YbWJsZW4oCisjaWZkZWYgSVNDCisgICAgY2hhciBjb25zdCAqc3RyLAorICAgIHNpemVfdCBsZW4KKyNlbHNlCisgICAgY2hhciAqc3RyLAorICAgIGludCBsZW4KKyNlbmRpZgorICAgICk7CisKKy8qIEFQSSBtZW50aW9uaW5nICJVVEY4IiBvciAidXRmOCIgaXMgYW4gWEZyZWU4NiBleHRlbnNpb24sIGludHJvZHVjZWQgaW4KKyAgIE5vdmVtYmVyIDIwMDAuIEl0cyBwcmVzZW5jZSBpcyBpbmRpY2F0ZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIG1hY3JvLiAqLworI2RlZmluZSBYX0hBVkVfVVRGOF9TVFJJTkcgMQorCit0eXBlZGVmIGNoYXIgKlhQb2ludGVyOworCisjZGVmaW5lIEJvb2wgaW50CisjZGVmaW5lIFN0YXR1cyBpbnQKKyNkZWZpbmUgVHJ1ZSAxCisjZGVmaW5lIEZhbHNlIDAKKworI2RlZmluZSBRdWV1ZWRBbHJlYWR5IDAKKyNkZWZpbmUgUXVldWVkQWZ0ZXJSZWFkaW5nIDEKKyNkZWZpbmUgUXVldWVkQWZ0ZXJGbHVzaCAyCisKKyNkZWZpbmUgQ29ubmVjdGlvbk51bWJlcihkcHkpIAkoKChfWFByaXZEaXNwbGF5KWRweSktPmZkKQorI2RlZmluZSBSb290V2luZG93KGRweSwgc2NyKSAJKFNjcmVlbk9mRGlzcGxheShkcHksc2NyKS0+cm9vdCkKKyNkZWZpbmUgRGVmYXVsdFNjcmVlbihkcHkpIAkoKChfWFByaXZEaXNwbGF5KWRweSktPmRlZmF1bHRfc2NyZWVuKQorI2RlZmluZSBEZWZhdWx0Um9vdFdpbmRvdyhkcHkpIAkoU2NyZWVuT2ZEaXNwbGF5KGRweSxEZWZhdWx0U2NyZWVuKGRweSkpLT5yb290KQorI2RlZmluZSBEZWZhdWx0VmlzdWFsKGRweSwgc2NyKSAoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT5yb290X3Zpc3VhbCkKKyNkZWZpbmUgRGVmYXVsdEdDKGRweSwgc2NyKSAJKFNjcmVlbk9mRGlzcGxheShkcHksc2NyKS0+ZGVmYXVsdF9nYykKKyNkZWZpbmUgQmxhY2tQaXhlbChkcHksIHNjcikgCShTY3JlZW5PZkRpc3BsYXkoZHB5LHNjciktPmJsYWNrX3BpeGVsKQorI2RlZmluZSBXaGl0ZVBpeGVsKGRweSwgc2NyKSAJKFNjcmVlbk9mRGlzcGxheShkcHksc2NyKS0+d2hpdGVfcGl4ZWwpCisjZGVmaW5lIEFsbFBsYW5lcyAJCSgodW5zaWduZWQgbG9uZyl+MEwpCisjZGVmaW5lIFFMZW5ndGgoZHB5KSAJCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+cWxlbikKKyNkZWZpbmUgRGlzcGxheVdpZHRoKGRweSwgc2NyKSAJKFNjcmVlbk9mRGlzcGxheShkcHksc2NyKS0+d2lkdGgpCisjZGVmaW5lIERpc3BsYXlIZWlnaHQoZHB5LCBzY3IpIChTY3JlZW5PZkRpc3BsYXkoZHB5LHNjciktPmhlaWdodCkKKyNkZWZpbmUgRGlzcGxheVdpZHRoTU0oZHB5LCBzY3IpKFNjcmVlbk9mRGlzcGxheShkcHksc2NyKS0+bXdpZHRoKQorI2RlZmluZSBEaXNwbGF5SGVpZ2h0TU0oZHB5LCBzY3IpKFNjcmVlbk9mRGlzcGxheShkcHksc2NyKS0+bWhlaWdodCkKKyNkZWZpbmUgRGlzcGxheVBsYW5lcyhkcHksIHNjcikgKFNjcmVlbk9mRGlzcGxheShkcHksc2NyKS0+cm9vdF9kZXB0aCkKKyNkZWZpbmUgRGlzcGxheUNlbGxzKGRweSwgc2NyKSAJKERlZmF1bHRWaXN1YWwoZHB5LHNjciktPm1hcF9lbnRyaWVzKQorI2RlZmluZSBTY3JlZW5Db3VudChkcHkpIAkoKChfWFByaXZEaXNwbGF5KWRweSktPm5zY3JlZW5zKQorI2RlZmluZSBTZXJ2ZXJWZW5kb3IoZHB5KSAJKCgoX1hQcml2RGlzcGxheSlkcHkpLT52ZW5kb3IpCisjZGVmaW5lIFByb3RvY29sVmVyc2lvbihkcHkpIAkoKChfWFByaXZEaXNwbGF5KWRweSktPnByb3RvX21ham9yX3ZlcnNpb24pCisjZGVmaW5lIFByb3RvY29sUmV2aXNpb24oZHB5KSAJKCgoX1hQcml2RGlzcGxheSlkcHkpLT5wcm90b19taW5vcl92ZXJzaW9uKQorI2RlZmluZSBWZW5kb3JSZWxlYXNlKGRweSkgCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+cmVsZWFzZSkKKyNkZWZpbmUgRGlzcGxheVN0cmluZyhkcHkpIAkoKChfWFByaXZEaXNwbGF5KWRweSktPmRpc3BsYXlfbmFtZSkKKyNkZWZpbmUgRGVmYXVsdERlcHRoKGRweSwgc2NyKSAJKFNjcmVlbk9mRGlzcGxheShkcHksc2NyKS0+cm9vdF9kZXB0aCkKKyNkZWZpbmUgRGVmYXVsdENvbG9ybWFwKGRweSwgc2NyKShTY3JlZW5PZkRpc3BsYXkoZHB5LHNjciktPmNtYXApCisjZGVmaW5lIEJpdG1hcFVuaXQoZHB5KSAJKCgoX1hQcml2RGlzcGxheSlkcHkpLT5iaXRtYXBfdW5pdCkKKyNkZWZpbmUgQml0bWFwQml0T3JkZXIoZHB5KSAJKCgoX1hQcml2RGlzcGxheSlkcHkpLT5iaXRtYXBfYml0X29yZGVyKQorI2RlZmluZSBCaXRtYXBQYWQoZHB5KSAJCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+Yml0bWFwX3BhZCkKKyNkZWZpbmUgSW1hZ2VCeXRlT3JkZXIoZHB5KSAJKCgoX1hQcml2RGlzcGxheSlkcHkpLT5ieXRlX29yZGVyKQorI2lmZGVmIENSQVkgLyogdW5hYmxlIHRvIGdldCBXT1JENjQgd2l0aG91dCBwdWxsaW5nIGluIG90aGVyIHN5bWJvbHMgKi8KKyNkZWZpbmUgTmV4dFJlcXVlc3QoZHB5KQlYTmV4dFJlcXVlc3QoZHB5KQorI2Vsc2UKKyNkZWZpbmUgTmV4dFJlcXVlc3QoZHB5KQkoKChfWFByaXZEaXNwbGF5KWRweSktPnJlcXVlc3QgKyAxKQorI2VuZGlmCisjZGVmaW5lIExhc3RLbm93blJlcXVlc3RQcm9jZXNzZWQoZHB5KQkoKChfWFByaXZEaXNwbGF5KWRweSktPmxhc3RfcmVxdWVzdF9yZWFkKQorCisvKiBtYWNyb3MgZm9yIHNjcmVlbiBvcmllbnRlZCBhcHBsaWNhdGlvbnMgKHRvb2xraXQpICovCisjZGVmaW5lIFNjcmVlbk9mRGlzcGxheShkcHksIHNjcikoJigoX1hQcml2RGlzcGxheSlkcHkpLT5zY3JlZW5zW3Njcl0pCisjZGVmaW5lIERlZmF1bHRTY3JlZW5PZkRpc3BsYXkoZHB5KSBTY3JlZW5PZkRpc3BsYXkoZHB5LERlZmF1bHRTY3JlZW4oZHB5KSkKKyNkZWZpbmUgRGlzcGxheU9mU2NyZWVuKHMpCSgocyktPmRpc3BsYXkpCisjZGVmaW5lIFJvb3RXaW5kb3dPZlNjcmVlbihzKQkoKHMpLT5yb290KQorI2RlZmluZSBCbGFja1BpeGVsT2ZTY3JlZW4ocykJKChzKS0+YmxhY2tfcGl4ZWwpCisjZGVmaW5lIFdoaXRlUGl4ZWxPZlNjcmVlbihzKQkoKHMpLT53aGl0ZV9waXhlbCkKKyNkZWZpbmUgRGVmYXVsdENvbG9ybWFwT2ZTY3JlZW4ocykoKHMpLT5jbWFwKQorI2RlZmluZSBEZWZhdWx0RGVwdGhPZlNjcmVlbihzKQkoKHMpLT5yb290X2RlcHRoKQorI2RlZmluZSBEZWZhdWx0R0NPZlNjcmVlbihzKQkoKHMpLT5kZWZhdWx0X2djKQorI2RlZmluZSBEZWZhdWx0VmlzdWFsT2ZTY3JlZW4ocykoKHMpLT5yb290X3Zpc3VhbCkKKyNkZWZpbmUgV2lkdGhPZlNjcmVlbihzKQkoKHMpLT53aWR0aCkKKyNkZWZpbmUgSGVpZ2h0T2ZTY3JlZW4ocykJKChzKS0+aGVpZ2h0KQorI2RlZmluZSBXaWR0aE1NT2ZTY3JlZW4ocykJKChzKS0+bXdpZHRoKQorI2RlZmluZSBIZWlnaHRNTU9mU2NyZWVuKHMpCSgocyktPm1oZWlnaHQpCisjZGVmaW5lIFBsYW5lc09mU2NyZWVuKHMpCSgocyktPnJvb3RfZGVwdGgpCisjZGVmaW5lIENlbGxzT2ZTY3JlZW4ocykJKERlZmF1bHRWaXN1YWxPZlNjcmVlbigocykpLT5tYXBfZW50cmllcykKKyNkZWZpbmUgTWluQ21hcHNPZlNjcmVlbihzKQkoKHMpLT5taW5fbWFwcykKKyNkZWZpbmUgTWF4Q21hcHNPZlNjcmVlbihzKQkoKHMpLT5tYXhfbWFwcykKKyNkZWZpbmUgRG9lc1NhdmVVbmRlcnMocykJKChzKS0+c2F2ZV91bmRlcnMpCisjZGVmaW5lIERvZXNCYWNraW5nU3RvcmUocykJKChzKS0+YmFja2luZ19zdG9yZSkKKyNkZWZpbmUgRXZlbnRNYXNrT2ZTY3JlZW4ocykJKChzKS0+cm9vdF9pbnB1dF9tYXNrKQorCisvKgorICogRXh0ZW5zaW9ucyBuZWVkIGEgd2F5IHRvIGhhbmcgcHJpdmF0ZSBkYXRhIG9uIHNvbWUgc3RydWN0dXJlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX1hFeHREYXRhIHsKKwlpbnQgbnVtYmVyOwkJLyogbnVtYmVyIHJldHVybmVkIGJ5IFhSZWdpc3RlckV4dGVuc2lvbiAqLworCXN0cnVjdCBfWEV4dERhdGEgKm5leHQ7CS8qIG5leHQgaXRlbSBvbiBsaXN0IG9mIGRhdGEgZm9yIHN0cnVjdHVyZSAqLworCWludCAoKmZyZWVfcHJpdmF0ZSkoCS8qIGNhbGxlZCB0byBmcmVlIHByaXZhdGUgc3RvcmFnZSAqLworCXN0cnVjdCBfWEV4dERhdGEgKmV4dGVuc2lvbgorCSk7CisJWFBvaW50ZXIgcHJpdmF0ZV9kYXRhOwkvKiBkYXRhIHByaXZhdGUgdG8gdGhpcyBleHRlbnNpb24uICovCit9IFhFeHREYXRhOworCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHN0cnVjdHVyZXMgdXNlZCBieSB0aGUgZXh0ZW5zaW9uIG1lY2hhbmlzbS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgewkJLyogcHVibGljIHRvIGV4dGVuc2lvbiwgY2Fubm90IGJlIGNoYW5nZWQgKi8KKwlpbnQgZXh0ZW5zaW9uOwkJLyogZXh0ZW5zaW9uIG51bWJlciAqLworCWludCBtYWpvcl9vcGNvZGU7CS8qIG1ham9yIG9wLWNvZGUgYXNzaWduZWQgYnkgc2VydmVyICovCisJaW50IGZpcnN0X2V2ZW50OwkvKiBmaXJzdCBldmVudCBudW1iZXIgZm9yIHRoZSBleHRlbnNpb24gKi8KKwlpbnQgZmlyc3RfZXJyb3I7CS8qIGZpcnN0IGVycm9yIG51bWJlciBmb3IgdGhlIGV4dGVuc2lvbiAqLworfSBYRXh0Q29kZXM7CisKKy8qCisgKiBEYXRhIHN0cnVjdHVyZSBmb3IgcmV0cmlldmluZyBpbmZvIGFib3V0IHBpeG1hcCBmb3JtYXRzLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgZGVwdGg7CisgICAgaW50IGJpdHNfcGVyX3BpeGVsOworICAgIGludCBzY2FubGluZV9wYWQ7Cit9IFhQaXhtYXBGb3JtYXRWYWx1ZXM7CisKKworLyoKKyAqIERhdGEgc3RydWN0dXJlIGZvciBzZXR0aW5nIGdyYXBoaWNzIGNvbnRleHQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgZnVuY3Rpb247CQkvKiBsb2dpY2FsIG9wZXJhdGlvbiAqLworCXVuc2lnbmVkIGxvbmcgcGxhbmVfbWFzazsvKiBwbGFuZSBtYXNrICovCisJdW5zaWduZWQgbG9uZyBmb3JlZ3JvdW5kOy8qIGZvcmVncm91bmQgcGl4ZWwgKi8KKwl1bnNpZ25lZCBsb25nIGJhY2tncm91bmQ7LyogYmFja2dyb3VuZCBwaXhlbCAqLworCWludCBsaW5lX3dpZHRoOwkJLyogbGluZSB3aWR0aCAqLworCWludCBsaW5lX3N0eWxlOwkgCS8qIExpbmVTb2xpZCwgTGluZU9uT2ZmRGFzaCwgTGluZURvdWJsZURhc2ggKi8KKwlpbnQgY2FwX3N0eWxlOwkgIAkvKiBDYXBOb3RMYXN0LCBDYXBCdXR0LAorCQkJCSAgIENhcFJvdW5kLCBDYXBQcm9qZWN0aW5nICovCisJaW50IGpvaW5fc3R5bGU7CSAJLyogSm9pbk1pdGVyLCBKb2luUm91bmQsIEpvaW5CZXZlbCAqLworCWludCBmaWxsX3N0eWxlOwkgCS8qIEZpbGxTb2xpZCwgRmlsbFRpbGVkLAorCQkJCSAgIEZpbGxTdGlwcGxlZCwgRmlsbE9wYWV1ZVN0aXBwbGVkICovCisJaW50IGZpbGxfcnVsZTsJICAJLyogRXZlbk9kZFJ1bGUsIFdpbmRpbmdSdWxlICovCisJaW50IGFyY19tb2RlOwkJLyogQXJjQ2hvcmQsIEFyY1BpZVNsaWNlICovCisJUGl4bWFwIHRpbGU7CQkvKiB0aWxlIHBpeG1hcCBmb3IgdGlsaW5nIG9wZXJhdGlvbnMgKi8KKwlQaXhtYXAgc3RpcHBsZTsJCS8qIHN0aXBwbGUgMSBwbGFuZSBwaXhtYXAgZm9yIHN0aXBwaW5nICovCisJaW50IHRzX3hfb3JpZ2luOwkvKiBvZmZzZXQgZm9yIHRpbGUgb3Igc3RpcHBsZSBvcGVyYXRpb25zICovCisJaW50IHRzX3lfb3JpZ2luOworICAgICAgICBGb250IGZvbnQ7CSAgICAgICAgLyogZGVmYXVsdCB0ZXh0IGZvbnQgZm9yIHRleHQgb3BlcmF0aW9ucyAqLworCWludCBzdWJ3aW5kb3dfbW9kZTsgICAgIC8qIENsaXBCeUNoaWxkcmVuLCBJbmNsdWRlSW5mZXJpb3JzICovCisJQm9vbCBncmFwaGljc19leHBvc3VyZXM7LyogYm9vbGVhbiwgc2hvdWxkIGV4cG9zdXJlcyBiZSBnZW5lcmF0ZWQgKi8KKwlpbnQgY2xpcF94X29yaWdpbjsJLyogb3JpZ2luIGZvciBjbGlwcGluZyAqLworCWludCBjbGlwX3lfb3JpZ2luOworCVBpeG1hcCBjbGlwX21hc2s7CS8qIGJpdG1hcCBjbGlwcGluZzsgb3RoZXIgY2FsbHMgZm9yIHJlY3RzICovCisJaW50IGRhc2hfb2Zmc2V0OwkvKiBwYXR0ZXJuZWQvZGFzaGVkIGxpbmUgaW5mb3JtYXRpb24gKi8KKwljaGFyIGRhc2hlczsKK30gWEdDVmFsdWVzOworCisvKgorICogR3JhcGhpY3MgY29udGV4dC4gIFRoZSBjb250ZW50cyBvZiB0aGlzIHN0cnVjdHVyZSBhcmUgaW1wbGVtZW50YXRpb24KKyAqIGRlcGVuZGVudC4gIEEgR0Mgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgb3BhcXVlIGJ5IGFwcGxpY2F0aW9uIGNvZGUuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1hHQworI2lmZGVmIFhMSUJfSUxMRUdBTF9BQ0NFU1MKK3sKKyAgICBYRXh0RGF0YSAqZXh0X2RhdGE7CS8qIGhvb2sgZm9yIGV4dGVuc2lvbiB0byBoYW5nIGRhdGEgKi8KKyAgICBHQ29udGV4dCBnaWQ7CS8qIHByb3RvY29sIElEIGZvciBncmFwaGljcyBjb250ZXh0ICovCisgICAgLyogdGhlcmUgaXMgbW9yZSB0byB0aGlzIHN0cnVjdHVyZSwgYnV0IGl0IGlzIHByaXZhdGUgdG8gWGxpYiAqLworfQorI2VuZGlmCisqR0M7CisKKy8qCisgKiBWaXN1YWwgc3RydWN0dXJlOyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBjb2xvcm1hcHBpbmcgcG9zc2libGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlYRXh0RGF0YSAqZXh0X2RhdGE7CS8qIGhvb2sgZm9yIGV4dGVuc2lvbiB0byBoYW5nIGRhdGEgKi8KKwlWaXN1YWxJRCB2aXN1YWxpZDsJLyogdmlzdWFsIGlkIG9mIHRoaXMgdmlzdWFsICovCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorCWludCBjX2NsYXNzOwkJLyogQysrIGNsYXNzIG9mIHNjcmVlbiAobW9ub2Nocm9tZSwgZXRjLikgKi8KKyNlbHNlCisJaW50IGNsYXNzOwkJLyogY2xhc3Mgb2Ygc2NyZWVuIChtb25vY2hyb21lLCBldGMuKSAqLworI2VuZGlmCisJdW5zaWduZWQgbG9uZyByZWRfbWFzaywgZ3JlZW5fbWFzaywgYmx1ZV9tYXNrOwkvKiBtYXNrIHZhbHVlcyAqLworCWludCBiaXRzX3Blcl9yZ2I7CS8qIGxvZyBiYXNlIDIgb2YgZGlzdGluY3QgY29sb3IgdmFsdWVzICovCisJaW50IG1hcF9lbnRyaWVzOwkvKiBjb2xvciBtYXAgZW50cmllcyAqLworfSBWaXN1YWw7CisKKy8qCisgKiBEZXB0aCBzdHJ1Y3R1cmU7IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBlYWNoIHBvc3NpYmxlIGRlcHRoLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGRlcHRoOwkJLyogdGhpcyBkZXB0aCAoWikgb2YgdGhlIGRlcHRoICovCisJaW50IG52aXN1YWxzOwkJLyogbnVtYmVyIG9mIFZpc3VhbCB0eXBlcyBhdCB0aGlzIGRlcHRoICovCisJVmlzdWFsICp2aXN1YWxzOwkvKiBsaXN0IG9mIHZpc3VhbHMgcG9zc2libGUgYXQgdGhpcyBkZXB0aCAqLworfSBEZXB0aDsKKworLyoKKyAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBzY3JlZW4uICBUaGUgY29udGVudHMgb2YgdGhpcyBzdHJ1Y3R1cmUgYXJlCisgKiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuICBBIFNjcmVlbiBzaG91bGQgYmUgdHJlYXRlZCBhcyBvcGFxdWUKKyAqIGJ5IGFwcGxpY2F0aW9uIGNvZGUuCisgKi8KKworc3RydWN0IF9YRGlzcGxheTsJCS8qIEZvcndhcmQgZGVjbGFyZSBiZWZvcmUgdXNlIGZvciBDKysgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCVhFeHREYXRhICpleHRfZGF0YTsJLyogaG9vayBmb3IgZXh0ZW5zaW9uIHRvIGhhbmcgZGF0YSAqLworCXN0cnVjdCBfWERpc3BsYXkgKmRpc3BsYXk7LyogYmFjayBwb2ludGVyIHRvIGRpc3BsYXkgc3RydWN0dXJlICovCisJV2luZG93IHJvb3Q7CQkvKiBSb290IHdpbmRvdyBpZC4gKi8KKwlpbnQgd2lkdGgsIGhlaWdodDsJLyogd2lkdGggYW5kIGhlaWdodCBvZiBzY3JlZW4gKi8KKwlpbnQgbXdpZHRoLCBtaGVpZ2h0OwkvKiB3aWR0aCBhbmQgaGVpZ2h0IG9mICBpbiBtaWxsaW1ldGVycyAqLworCWludCBuZGVwdGhzOwkJLyogbnVtYmVyIG9mIGRlcHRocyBwb3NzaWJsZSAqLworCURlcHRoICpkZXB0aHM7CQkvKiBsaXN0IG9mIGFsbG93YWJsZSBkZXB0aHMgb24gdGhlIHNjcmVlbiAqLworCWludCByb290X2RlcHRoOwkJLyogYml0cyBwZXIgcGl4ZWwgKi8KKwlWaXN1YWwgKnJvb3RfdmlzdWFsOwkvKiByb290IHZpc3VhbCAqLworCUdDIGRlZmF1bHRfZ2M7CQkvKiBHQyBmb3IgdGhlIHJvb3Qgcm9vdCB2aXN1YWwgKi8KKwlDb2xvcm1hcCBjbWFwOwkJLyogZGVmYXVsdCBjb2xvciBtYXAgKi8KKwl1bnNpZ25lZCBsb25nIHdoaXRlX3BpeGVsOworCXVuc2lnbmVkIGxvbmcgYmxhY2tfcGl4ZWw7CS8qIFdoaXRlIGFuZCBCbGFjayBwaXhlbCB2YWx1ZXMgKi8KKwlpbnQgbWF4X21hcHMsIG1pbl9tYXBzOwkvKiBtYXggYW5kIG1pbiBjb2xvciBtYXBzICovCisJaW50IGJhY2tpbmdfc3RvcmU7CS8qIE5ldmVyLCBXaGVuTWFwcGVkLCBBbHdheXMgKi8KKwlCb29sIHNhdmVfdW5kZXJzOworCWxvbmcgcm9vdF9pbnB1dF9tYXNrOwkvKiBpbml0aWFsIHJvb3QgaW5wdXQgbWFzayAqLworfSBTY3JlZW47CisKKy8qCisgKiBGb3JtYXQgc3RydWN0dXJlOyBkZXNjcmliZXMgWkZvcm1hdCBkYXRhIHRoZSBzY3JlZW4gd2lsbCB1bmRlcnN0YW5kLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJWEV4dERhdGEgKmV4dF9kYXRhOwkvKiBob29rIGZvciBleHRlbnNpb24gdG8gaGFuZyBkYXRhICovCisJaW50IGRlcHRoOwkJLyogZGVwdGggb2YgdGhpcyBpbWFnZSBmb3JtYXQgKi8KKwlpbnQgYml0c19wZXJfcGl4ZWw7CS8qIGJpdHMvcGl4ZWwgYXQgdGhpcyBkZXB0aCAqLworCWludCBzY2FubGluZV9wYWQ7CS8qIHNjYW5saW5lIG11c3QgcGFkZGVkIHRvIHRoaXMgbXVsdGlwbGUgKi8KK30gU2NyZWVuRm9ybWF0OworCisvKgorICogRGF0YSBzdHJ1Y3R1cmUgZm9yIHNldHRpbmcgd2luZG93IGF0dHJpYnV0ZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQaXhtYXAgYmFja2dyb3VuZF9waXhtYXA7CS8qIGJhY2tncm91bmQgb3IgTm9uZSBvciBQYXJlbnRSZWxhdGl2ZSAqLworICAgIHVuc2lnbmVkIGxvbmcgYmFja2dyb3VuZF9waXhlbDsJLyogYmFja2dyb3VuZCBwaXhlbCAqLworICAgIFBpeG1hcCBib3JkZXJfcGl4bWFwOwkvKiBib3JkZXIgb2YgdGhlIHdpbmRvdyAqLworICAgIHVuc2lnbmVkIGxvbmcgYm9yZGVyX3BpeGVsOwkvKiBib3JkZXIgcGl4ZWwgdmFsdWUgKi8KKyAgICBpbnQgYml0X2dyYXZpdHk7CQkvKiBvbmUgb2YgYml0IGdyYXZpdHkgdmFsdWVzICovCisgICAgaW50IHdpbl9ncmF2aXR5OwkJLyogb25lIG9mIHRoZSB3aW5kb3cgZ3Jhdml0eSB2YWx1ZXMgKi8KKyAgICBpbnQgYmFja2luZ19zdG9yZTsJCS8qIE5vdFVzZWZ1bCwgV2hlbk1hcHBlZCwgQWx3YXlzICovCisgICAgdW5zaWduZWQgbG9uZyBiYWNraW5nX3BsYW5lczsvKiBwbGFuZXMgdG8gYmUgcHJlc2V2ZWQgaWYgcG9zc2libGUgKi8KKyAgICB1bnNpZ25lZCBsb25nIGJhY2tpbmdfcGl4ZWw7LyogdmFsdWUgdG8gdXNlIGluIHJlc3RvcmluZyBwbGFuZXMgKi8KKyAgICBCb29sIHNhdmVfdW5kZXI7CQkvKiBzaG91bGQgYml0cyB1bmRlciBiZSBzYXZlZD8gKHBvcHVwcykgKi8KKyAgICBsb25nIGV2ZW50X21hc2s7CQkvKiBzZXQgb2YgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIHNhdmVkICovCisgICAgbG9uZyBkb19ub3RfcHJvcGFnYXRlX21hc2s7CS8qIHNldCBvZiBldmVudHMgdGhhdCBzaG91bGQgbm90IHByb3BhZ2F0ZSAqLworICAgIEJvb2wgb3ZlcnJpZGVfcmVkaXJlY3Q7CS8qIGJvb2xlYW4gdmFsdWUgZm9yIG92ZXJyaWRlLXJlZGlyZWN0ICovCisgICAgQ29sb3JtYXAgY29sb3JtYXA7CQkvKiBjb2xvciBtYXAgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHdpbmRvdyAqLworICAgIEN1cnNvciBjdXJzb3I7CQkvKiBjdXJzb3IgdG8gYmUgZGlzcGxheWVkIChvciBOb25lKSAqLworfSBYU2V0V2luZG93QXR0cmlidXRlczsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB4LCB5OwkJCS8qIGxvY2F0aW9uIG9mIHdpbmRvdyAqLworICAgIGludCB3aWR0aCwgaGVpZ2h0OwkJLyogd2lkdGggYW5kIGhlaWdodCBvZiB3aW5kb3cgKi8KKyAgICBpbnQgYm9yZGVyX3dpZHRoOwkJLyogYm9yZGVyIHdpZHRoIG9mIHdpbmRvdyAqLworICAgIGludCBkZXB0aDsgICAgICAgICAgCS8qIGRlcHRoIG9mIHdpbmRvdyAqLworICAgIFZpc3VhbCAqdmlzdWFsOwkJLyogdGhlIGFzc29jaWF0ZWQgdmlzdWFsIHN0cnVjdHVyZSAqLworICAgIFdpbmRvdyByb290OyAgICAgICAgCS8qIHJvb3Qgb2Ygc2NyZWVuIGNvbnRhaW5pbmcgd2luZG93ICovCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIGludCBjX2NsYXNzOwkJLyogQysrIElucHV0T3V0cHV0LCBJbnB1dE9ubHkqLworI2Vsc2UKKyAgICBpbnQgY2xhc3M7CQkJLyogSW5wdXRPdXRwdXQsIElucHV0T25seSovCisjZW5kaWYKKyAgICBpbnQgYml0X2dyYXZpdHk7CQkvKiBvbmUgb2YgYml0IGdyYXZpdHkgdmFsdWVzICovCisgICAgaW50IHdpbl9ncmF2aXR5OwkJLyogb25lIG9mIHRoZSB3aW5kb3cgZ3Jhdml0eSB2YWx1ZXMgKi8KKyAgICBpbnQgYmFja2luZ19zdG9yZTsJCS8qIE5vdFVzZWZ1bCwgV2hlbk1hcHBlZCwgQWx3YXlzICovCisgICAgdW5zaWduZWQgbG9uZyBiYWNraW5nX3BsYW5lczsvKiBwbGFuZXMgdG8gYmUgcHJlc2VydmVkIGlmIHBvc3NpYmxlICovCisgICAgdW5zaWduZWQgbG9uZyBiYWNraW5nX3BpeGVsOy8qIHZhbHVlIHRvIGJlIHVzZWQgd2hlbiByZXN0b3JpbmcgcGxhbmVzICovCisgICAgQm9vbCBzYXZlX3VuZGVyOwkJLyogYm9vbGVhbiwgc2hvdWxkIGJpdHMgdW5kZXIgYmUgc2F2ZWQ/ICovCisgICAgQ29sb3JtYXAgY29sb3JtYXA7CQkvKiBjb2xvciBtYXAgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHdpbmRvdyAqLworICAgIEJvb2wgbWFwX2luc3RhbGxlZDsJCS8qIGJvb2xlYW4sIGlzIGNvbG9yIG1hcCBjdXJyZW50bHkgaW5zdGFsbGVkKi8KKyAgICBpbnQgbWFwX3N0YXRlOwkJLyogSXNVbm1hcHBlZCwgSXNVbnZpZXdhYmxlLCBJc1ZpZXdhYmxlICovCisgICAgbG9uZyBhbGxfZXZlbnRfbWFza3M7CS8qIHNldCBvZiBldmVudHMgYWxsIHBlb3BsZSBoYXZlIGludGVyZXN0IGluKi8KKyAgICBsb25nIHlvdXJfZXZlbnRfbWFzazsJLyogbXkgZXZlbnQgbWFzayAqLworICAgIGxvbmcgZG9fbm90X3Byb3BhZ2F0ZV9tYXNrOyAvKiBzZXQgb2YgZXZlbnRzIHRoYXQgc2hvdWxkIG5vdCBwcm9wYWdhdGUgKi8KKyAgICBCb29sIG92ZXJyaWRlX3JlZGlyZWN0OwkvKiBib29sZWFuIHZhbHVlIGZvciBvdmVycmlkZS1yZWRpcmVjdCAqLworICAgIFNjcmVlbiAqc2NyZWVuOwkJLyogYmFjayBwb2ludGVyIHRvIGNvcnJlY3Qgc2NyZWVuICovCit9IFhXaW5kb3dBdHRyaWJ1dGVzOworCisvKgorICogRGF0YSBzdHJ1Y3R1cmUgZm9yIGhvc3Qgc2V0dGluZzsgZ2V0dGluZyByb3V0aW5lcy4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBmYW1pbHk7CQkvKiBmb3IgZXhhbXBsZSBGYW1pbHlJbnRlcm5ldCAqLworCWludCBsZW5ndGg7CQkvKiBsZW5ndGggb2YgYWRkcmVzcywgaW4gYnl0ZXMgKi8KKwljaGFyICphZGRyZXNzOwkJLyogcG9pbnRlciB0byB3aGVyZSB0byBmaW5kIHRoZSBieXRlcyAqLworfSBYSG9zdEFkZHJlc3M7CisKKy8qCisgKiBEYXRhIHN0cnVjdHVyZSBmb3IgU2VydmVyRmFtaWx5SW50ZXJwcmV0ZWQgYWRkcmVzc2VzIGluIGhvc3Qgcm91dGluZXMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIHR5cGUgc3RyaW5nLCBpbiBieXRlcyAqLworCWludCB2YWx1ZWxlbmd0aDsJLyogbGVuZ3RoIG9mIHZhbHVlIHN0cmluZywgaW4gYnl0ZXMgKi8KKwljaGFyICp0eXBlOwkJLyogcG9pbnRlciB0byB3aGVyZSB0byBmaW5kIHRoZSB0eXBlIHN0cmluZyAqLworCWNoYXIgKnZhbHVlOwkJLyogcG9pbnRlciB0byB3aGVyZSB0byBmaW5kIHRoZSBhZGRyZXNzICovCit9IFhTZXJ2ZXJJbnRlcnByZXRlZEFkZHJlc3M7CisKKy8qCisgKiBEYXRhIHN0cnVjdHVyZSBmb3IgImltYWdlIiBkYXRhLCB1c2VkIGJ5IGltYWdlIG1hbmlwdWxhdGlvbiByb3V0aW5lcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX1hJbWFnZSB7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CQkvKiBzaXplIG9mIGltYWdlICovCisgICAgaW50IHhvZmZzZXQ7CQkvKiBudW1iZXIgb2YgcGl4ZWxzIG9mZnNldCBpbiBYIGRpcmVjdGlvbiAqLworICAgIGludCBmb3JtYXQ7CQkJLyogWFlCaXRtYXAsIFhZUGl4bWFwLCBaUGl4bWFwICovCisgICAgY2hhciAqZGF0YTsJCQkvKiBwb2ludGVyIHRvIGltYWdlIGRhdGEgKi8KKyAgICBpbnQgYnl0ZV9vcmRlcjsJCS8qIGRhdGEgYnl0ZSBvcmRlciwgTFNCRmlyc3QsIE1TQkZpcnN0ICovCisgICAgaW50IGJpdG1hcF91bml0OwkJLyogcXVhbnQuIG9mIHNjYW5saW5lIDgsIDE2LCAzMiAqLworICAgIGludCBiaXRtYXBfYml0X29yZGVyOwkvKiBMU0JGaXJzdCwgTVNCRmlyc3QgKi8KKyAgICBpbnQgYml0bWFwX3BhZDsJCS8qIDgsIDE2LCAzMiBlaXRoZXIgWFkgb3IgWlBpeG1hcCAqLworICAgIGludCBkZXB0aDsJCQkvKiBkZXB0aCBvZiBpbWFnZSAqLworICAgIGludCBieXRlc19wZXJfbGluZTsJCS8qIGFjY2VsYXJhdG9yIHRvIG5leHQgbGluZSAqLworICAgIGludCBiaXRzX3Blcl9waXhlbDsJCS8qIGJpdHMgcGVyIHBpeGVsIChaUGl4bWFwKSAqLworICAgIHVuc2lnbmVkIGxvbmcgcmVkX21hc2s7CS8qIGJpdHMgaW4geiBhcnJhbmdtZW50ICovCisgICAgdW5zaWduZWQgbG9uZyBncmVlbl9tYXNrOworICAgIHVuc2lnbmVkIGxvbmcgYmx1ZV9tYXNrOworICAgIFhQb2ludGVyIG9iZGF0YTsJCS8qIGhvb2sgZm9yIHRoZSBvYmplY3Qgcm91dGluZXMgdG8gaGFuZyBvbiAqLworICAgIHN0cnVjdCBmdW5jcyB7CQkvKiBpbWFnZSBtYW5pcHVsYXRpb24gcm91dGluZXMgKi8KKwlzdHJ1Y3QgX1hJbWFnZSAqKCpjcmVhdGVfaW1hZ2UpKAorCQlzdHJ1Y3QgX1hEaXNwbGF5KiAvKiBkaXNwbGF5ICovLAorCQlWaXN1YWwqCQkvKiB2aXN1YWwgKi8sCisJCXVuc2lnbmVkIGludAkvKiBkZXB0aCAqLywKKwkJaW50CQkvKiBmb3JtYXQgKi8sCisJCWludAkJLyogb2Zmc2V0ICovLAorCQljaGFyKgkJLyogZGF0YSAqLywKKwkJdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorCQl1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAorCQlpbnQJCS8qIGJpdG1hcF9wYWQgKi8sCisJCWludAkJLyogYnl0ZXNfcGVyX2xpbmUgKi8pOworCWludCAoKmRlc3Ryb3lfaW1hZ2UpICAgICAgICAoc3RydWN0IF9YSW1hZ2UgKik7CisJdW5zaWduZWQgbG9uZyAoKmdldF9waXhlbCkgIChzdHJ1Y3QgX1hJbWFnZSAqLCBpbnQsIGludCk7CisJaW50ICgqcHV0X3BpeGVsKSAgICAgICAgICAgIChzdHJ1Y3QgX1hJbWFnZSAqLCBpbnQsIGludCwgdW5zaWduZWQgbG9uZyk7CisJc3RydWN0IF9YSW1hZ2UgKigqc3ViX2ltYWdlKShzdHJ1Y3QgX1hJbWFnZSAqLCBpbnQsIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworCWludCAoKmFkZF9waXhlbCkgICAgICAgICAgICAoc3RydWN0IF9YSW1hZ2UgKiwgbG9uZyk7CisJfSBmOworfSBYSW1hZ2U7CisKKy8qCisgKiBEYXRhIHN0cnVjdHVyZSBmb3IgWFJlY29uZmlndXJlV2luZG93CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBpbnQgYm9yZGVyX3dpZHRoOworICAgIFdpbmRvdyBzaWJsaW5nOworICAgIGludCBzdGFja19tb2RlOworfSBYV2luZG93Q2hhbmdlczsKKworLyoKKyAqIERhdGEgc3RydWN0dXJlIHVzZWQgYnkgY29sb3Igb3BlcmF0aW9ucworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBwaXhlbDsKKwl1bnNpZ25lZCBzaG9ydCByZWQsIGdyZWVuLCBibHVlOworCWNoYXIgZmxhZ3M7ICAvKiBkb19yZWQsIGRvX2dyZWVuLCBkb19ibHVlICovCisJY2hhciBwYWQ7Cit9IFhDb2xvcjsKKworLyoKKyAqIERhdGEgc3RydWN0dXJlcyBmb3IgZ3JhcGhpY3Mgb3BlcmF0aW9ucy4gIE9uIG1vc3QgbWFjaGluZXMsIHRoZXNlIGFyZQorICogY29uZ3J1ZW50IHdpdGggdGhlIHdpcmUgcHJvdG9jb2wgc3RydWN0dXJlcywgc28gcmVmb3JtYXR0aW5nIHRoZSBkYXRhCisgKiBjYW4gYmUgYXZvaWRlZCBvbiB0aGVzZSBhcmNoaXRlY3R1cmVzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc2hvcnQgeDEsIHkxLCB4MiwgeTI7Cit9IFhTZWdtZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc2hvcnQgeCwgeTsKK30gWFBvaW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc2hvcnQgeCwgeTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3aWR0aCwgaGVpZ2h0OworfSBYUmVjdGFuZ2xlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc2hvcnQgeCwgeTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3aWR0aCwgaGVpZ2h0OworICAgIHNob3J0IGFuZ2xlMSwgYW5nbGUyOworfSBYQXJjOworCisKKy8qIERhdGEgc3RydWN0dXJlIGZvciBYQ2hhbmdlS2V5Ym9hcmRDb250cm9sICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgaW50IGtleV9jbGlja19wZXJjZW50OworICAgICAgICBpbnQgYmVsbF9wZXJjZW50OworICAgICAgICBpbnQgYmVsbF9waXRjaDsKKyAgICAgICAgaW50IGJlbGxfZHVyYXRpb247CisgICAgICAgIGludCBsZWQ7CisgICAgICAgIGludCBsZWRfbW9kZTsKKyAgICAgICAgaW50IGtleTsKKyAgICAgICAgaW50IGF1dG9fcmVwZWF0X21vZGU7ICAgLyogT24sIE9mZiwgRGVmYXVsdCAqLworfSBYS2V5Ym9hcmRDb250cm9sOworCisvKiBEYXRhIHN0cnVjdHVyZSBmb3IgWEdldEtleWJvYXJkQ29udHJvbCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGludCBrZXlfY2xpY2tfcGVyY2VudDsKKwlpbnQgYmVsbF9wZXJjZW50OworCXVuc2lnbmVkIGludCBiZWxsX3BpdGNoLCBiZWxsX2R1cmF0aW9uOworCXVuc2lnbmVkIGxvbmcgbGVkX21hc2s7CisJaW50IGdsb2JhbF9hdXRvX3JlcGVhdDsKKwljaGFyIGF1dG9fcmVwZWF0c1szMl07Cit9IFhLZXlib2FyZFN0YXRlOworCisvKiBEYXRhIHN0cnVjdHVyZSBmb3IgWEdldE1vdGlvbkV2ZW50cy4gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgVGltZSB0aW1lOworCXNob3J0IHgsIHk7Cit9IFhUaW1lQ29vcmQ7CisKKy8qIERhdGEgc3RydWN0dXJlIGZvciBYe1NldCxHZXR9TW9kaWZpZXJNYXBwaW5nICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAJaW50IG1heF9rZXlwZXJtb2Q7CS8qIFRoZSBzZXJ2ZXIncyBtYXggIyBvZiBrZXlzIHBlciBtb2RpZmllciAqLworIAlLZXlDb2RlICptb2RpZmllcm1hcDsJLyogQW4gOCBieSBtYXhfa2V5cGVybW9kIGFycmF5IG9mIG1vZGlmaWVycyAqLworfSBYTW9kaWZpZXJLZXltYXA7CisKKworLyoKKyAqIERpc3BsYXkgZGF0YXR5cGUgbWFpbnRhaW5pbmcgZGlzcGxheSBzcGVjaWZpYyBkYXRhLgorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RydWN0dXJlIGFyZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuCisgKiBBIERpc3BsYXkgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgb3BhcXVlIGJ5IGFwcGxpY2F0aW9uIGNvZGUuCisgKi8KKyNpZm5kZWYgWExJQl9JTExFR0FMX0FDQ0VTUwordHlwZWRlZiBzdHJ1Y3QgX1hEaXNwbGF5IERpc3BsYXk7CisjZW5kaWYKKworc3RydWN0IF9YUHJpdmF0ZTsJCS8qIEZvcndhcmQgZGVjbGFyZSBiZWZvcmUgdXNlIGZvciBDKysgKi8KK3N0cnVjdCBfWHJtSGFzaEJ1Y2tldFJlYzsKKwordHlwZWRlZiBzdHJ1Y3QKKyNpZmRlZiBYTElCX0lMTEVHQUxfQUNDRVNTCitfWERpc3BsYXkKKyNlbmRpZgoreworCVhFeHREYXRhICpleHRfZGF0YTsJLyogaG9vayBmb3IgZXh0ZW5zaW9uIHRvIGhhbmcgZGF0YSAqLworCXN0cnVjdCBfWFByaXZhdGUgKnByaXZhdGUxOworCWludCBmZDsJCQkvKiBOZXR3b3JrIHNvY2tldC4gKi8KKwlpbnQgcHJpdmF0ZTI7CisJaW50IHByb3RvX21ham9yX3ZlcnNpb247LyogbWFqb3IgdmVyc2lvbiBvZiBzZXJ2ZXIncyBYIHByb3RvY29sICovCisJaW50IHByb3RvX21pbm9yX3ZlcnNpb247LyogbWlub3IgdmVyc2lvbiBvZiBzZXJ2ZXJzIFggcHJvdG9jb2wgKi8KKwljaGFyICp2ZW5kb3I7CQkvKiB2ZW5kb3Igb2YgdGhlIHNlcnZlciBoYXJkd2FyZSAqLworICAgICAgICBYSUQgcHJpdmF0ZTM7CisJWElEIHByaXZhdGU0OworCVhJRCBwcml2YXRlNTsKKwlpbnQgcHJpdmF0ZTY7CisJWElEICgqcmVzb3VyY2VfYWxsb2MpKAkvKiBhbGxvY2F0b3IgZnVuY3Rpb24gKi8KKwkJc3RydWN0IF9YRGlzcGxheSoKKwkpOworCWludCBieXRlX29yZGVyOwkJLyogc2NyZWVuIGJ5dGUgb3JkZXIsIExTQkZpcnN0LCBNU0JGaXJzdCAqLworCWludCBiaXRtYXBfdW5pdDsJLyogcGFkZGluZyBhbmQgZGF0YSByZXF1aXJlbWVudHMgKi8KKwlpbnQgYml0bWFwX3BhZDsJCS8qIHBhZGRpbmcgcmVxdWlyZW1lbnRzIG9uIGJpdG1hcHMgKi8KKwlpbnQgYml0bWFwX2JpdF9vcmRlcjsJLyogTGVhc3RTaWduaWZpY2FudCBvciBNb3N0U2lnbmlmaWNhbnQgKi8KKwlpbnQgbmZvcm1hdHM7CQkvKiBudW1iZXIgb2YgcGl4bWFwIGZvcm1hdHMgaW4gbGlzdCAqLworCVNjcmVlbkZvcm1hdCAqcGl4bWFwX2Zvcm1hdDsJLyogcGl4bWFwIGZvcm1hdCBsaXN0ICovCisJaW50IHByaXZhdGU4OworCWludCByZWxlYXNlOwkJLyogcmVsZWFzZSBvZiB0aGUgc2VydmVyICovCisJc3RydWN0IF9YUHJpdmF0ZSAqcHJpdmF0ZTksICpwcml2YXRlMTA7CisJaW50IHFsZW47CQkvKiBMZW5ndGggb2YgaW5wdXQgZXZlbnQgcXVldWUgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfcmVxdWVzdF9yZWFkOyAvKiBzZXEgbnVtYmVyIG9mIGxhc3QgZXZlbnQgcmVhZCAqLworCXVuc2lnbmVkIGxvbmcgcmVxdWVzdDsJLyogc2VxdWVuY2UgbnVtYmVyIG9mIGxhc3QgcmVxdWVzdC4gKi8KKwlYUG9pbnRlciBwcml2YXRlMTE7CisJWFBvaW50ZXIgcHJpdmF0ZTEyOworCVhQb2ludGVyIHByaXZhdGUxMzsKKwlYUG9pbnRlciBwcml2YXRlMTQ7CisJdW5zaWduZWQgbWF4X3JlcXVlc3Rfc2l6ZTsgLyogbWF4aW11bSBudW1iZXIgMzIgYml0IHdvcmRzIGluIHJlcXVlc3QqLworCXN0cnVjdCBfWHJtSGFzaEJ1Y2tldFJlYyAqZGI7CisJaW50ICgqcHJpdmF0ZTE1KSgKKwkJc3RydWN0IF9YRGlzcGxheSoKKwkJKTsKKwljaGFyICpkaXNwbGF5X25hbWU7CS8qICJob3N0OmRpc3BsYXkiIHN0cmluZyB1c2VkIG9uIHRoaXMgY29ubmVjdCovCisJaW50IGRlZmF1bHRfc2NyZWVuOwkvKiBkZWZhdWx0IHNjcmVlbiBmb3Igb3BlcmF0aW9ucyAqLworCWludCBuc2NyZWVuczsJCS8qIG51bWJlciBvZiBzY3JlZW5zIG9uIHRoaXMgc2VydmVyKi8KKwlTY3JlZW4gKnNjcmVlbnM7CS8qIHBvaW50ZXIgdG8gbGlzdCBvZiBzY3JlZW5zICovCisJdW5zaWduZWQgbG9uZyBtb3Rpb25fYnVmZmVyOwkvKiBzaXplIG9mIG1vdGlvbiBidWZmZXIgKi8KKwl1bnNpZ25lZCBsb25nIHByaXZhdGUxNjsKKwlpbnQgbWluX2tleWNvZGU7CS8qIG1pbmltdW0gZGVmaW5lZCBrZXljb2RlICovCisJaW50IG1heF9rZXljb2RlOwkvKiBtYXhpbXVtIGRlZmluZWQga2V5Y29kZSAqLworCVhQb2ludGVyIHByaXZhdGUxNzsKKwlYUG9pbnRlciBwcml2YXRlMTg7CisJaW50IHByaXZhdGUxOTsKKwljaGFyICp4ZGVmYXVsdHM7CS8qIGNvbnRlbnRzIG9mIGRlZmF1bHRzIGZyb20gc2VydmVyICovCisJLyogdGhlcmUgaXMgbW9yZSB0byB0aGlzIHN0cnVjdHVyZSwgYnV0IGl0IGlzIHByaXZhdGUgdG8gWGxpYiAqLworfQorI2lmZGVmIFhMSUJfSUxMRUdBTF9BQ0NFU1MKK0Rpc3BsYXksCisjZW5kaWYKKypfWFByaXZEaXNwbGF5OworCisjdW5kZWYgX1hFVkVOVF8KKyNpZm5kZWYgX1hFVkVOVF8KKy8qCisgKiBEZWZpbml0aW9ucyBvZiBzcGVjaWZpYyBldmVudHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsJCS8qIG9mIGV2ZW50ICovCisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgd2luZG93OwkgICAgICAgIC8qICJldmVudCIgd2luZG93IGl0IGlzIHJlcG9ydGVkIHJlbGF0aXZlIHRvICovCisJV2luZG93IHJvb3Q7CSAgICAgICAgLyogcm9vdCB3aW5kb3cgdGhhdCB0aGUgZXZlbnQgb2NjdXJyZWQgb24gKi8KKwlXaW5kb3cgc3Vid2luZG93OwkvKiBjaGlsZCB3aW5kb3cgKi8KKwlUaW1lIHRpbWU7CQkvKiBtaWxsaXNlY29uZHMgKi8KKwlpbnQgeCwgeTsJCS8qIHBvaW50ZXIgeCwgeSBjb29yZGluYXRlcyBpbiBldmVudCB3aW5kb3cgKi8KKwlpbnQgeF9yb290LCB5X3Jvb3Q7CS8qIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHJvb3QgKi8KKwl1bnNpZ25lZCBpbnQgc3RhdGU7CS8qIGtleSBvciBidXR0b24gbWFzayAqLworCXVuc2lnbmVkIGludCBrZXljb2RlOwkvKiBkZXRhaWwgKi8KKwlCb29sIHNhbWVfc2NyZWVuOwkvKiBzYW1lIHNjcmVlbiBmbGFnICovCit9IFhLZXlFdmVudDsKK3R5cGVkZWYgWEtleUV2ZW50IFhLZXlQcmVzc2VkRXZlbnQ7Cit0eXBlZGVmIFhLZXlFdmVudCBYS2V5UmVsZWFzZWRFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOwkJLyogb2YgZXZlbnQgKi8KKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyB3aW5kb3c7CSAgICAgICAgLyogImV2ZW50IiB3aW5kb3cgaXQgaXMgcmVwb3J0ZWQgcmVsYXRpdmUgdG8gKi8KKwlXaW5kb3cgcm9vdDsJICAgICAgICAvKiByb290IHdpbmRvdyB0aGF0IHRoZSBldmVudCBvY2N1cnJlZCBvbiAqLworCVdpbmRvdyBzdWJ3aW5kb3c7CS8qIGNoaWxkIHdpbmRvdyAqLworCVRpbWUgdGltZTsJCS8qIG1pbGxpc2Vjb25kcyAqLworCWludCB4LCB5OwkJLyogcG9pbnRlciB4LCB5IGNvb3JkaW5hdGVzIGluIGV2ZW50IHdpbmRvdyAqLworCWludCB4X3Jvb3QsIHlfcm9vdDsJLyogY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gcm9vdCAqLworCXVuc2lnbmVkIGludCBzdGF0ZTsJLyoga2V5IG9yIGJ1dHRvbiBtYXNrICovCisJdW5zaWduZWQgaW50IGJ1dHRvbjsJLyogZGV0YWlsICovCisJQm9vbCBzYW1lX3NjcmVlbjsJLyogc2FtZSBzY3JlZW4gZmxhZyAqLworfSBYQnV0dG9uRXZlbnQ7Cit0eXBlZGVmIFhCdXR0b25FdmVudCBYQnV0dG9uUHJlc3NlZEV2ZW50OwordHlwZWRlZiBYQnV0dG9uRXZlbnQgWEJ1dHRvblJlbGVhc2VkRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsJCS8qIG9mIGV2ZW50ICovCisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgd2luZG93OwkgICAgICAgIC8qICJldmVudCIgd2luZG93IHJlcG9ydGVkIHJlbGF0aXZlIHRvICovCisJV2luZG93IHJvb3Q7CSAgICAgICAgLyogcm9vdCB3aW5kb3cgdGhhdCB0aGUgZXZlbnQgb2NjdXJyZWQgb24gKi8KKwlXaW5kb3cgc3Vid2luZG93OwkvKiBjaGlsZCB3aW5kb3cgKi8KKwlUaW1lIHRpbWU7CQkvKiBtaWxsaXNlY29uZHMgKi8KKwlpbnQgeCwgeTsJCS8qIHBvaW50ZXIgeCwgeSBjb29yZGluYXRlcyBpbiBldmVudCB3aW5kb3cgKi8KKwlpbnQgeF9yb290LCB5X3Jvb3Q7CS8qIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHJvb3QgKi8KKwl1bnNpZ25lZCBpbnQgc3RhdGU7CS8qIGtleSBvciBidXR0b24gbWFzayAqLworCWNoYXIgaXNfaGludDsJCS8qIGRldGFpbCAqLworCUJvb2wgc2FtZV9zY3JlZW47CS8qIHNhbWUgc2NyZWVuIGZsYWcgKi8KK30gWE1vdGlvbkV2ZW50OwordHlwZWRlZiBYTW90aW9uRXZlbnQgWFBvaW50ZXJNb3ZlZEV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CQkvKiBvZiBldmVudCAqLworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IHdpbmRvdzsJICAgICAgICAvKiAiZXZlbnQiIHdpbmRvdyByZXBvcnRlZCByZWxhdGl2ZSB0byAqLworCVdpbmRvdyByb290OwkgICAgICAgIC8qIHJvb3Qgd2luZG93IHRoYXQgdGhlIGV2ZW50IG9jY3VycmVkIG9uICovCisJV2luZG93IHN1YndpbmRvdzsJLyogY2hpbGQgd2luZG93ICovCisJVGltZSB0aW1lOwkJLyogbWlsbGlzZWNvbmRzICovCisJaW50IHgsIHk7CQkvKiBwb2ludGVyIHgsIHkgY29vcmRpbmF0ZXMgaW4gZXZlbnQgd2luZG93ICovCisJaW50IHhfcm9vdCwgeV9yb290OwkvKiBjb29yZGluYXRlcyByZWxhdGl2ZSB0byByb290ICovCisJaW50IG1vZGU7CQkvKiBOb3RpZnlOb3JtYWwsIE5vdGlmeUdyYWIsIE5vdGlmeVVuZ3JhYiAqLworCWludCBkZXRhaWw7CisJLyoKKwkgKiBOb3RpZnlBbmNlc3RvciwgTm90aWZ5VmlydHVhbCwgTm90aWZ5SW5mZXJpb3IsCisJICogTm90aWZ5Tm9ubGluZWFyLE5vdGlmeU5vbmxpbmVhclZpcnR1YWwKKwkgKi8KKwlCb29sIHNhbWVfc2NyZWVuOwkvKiBzYW1lIHNjcmVlbiBmbGFnICovCisJQm9vbCBmb2N1czsJCS8qIGJvb2xlYW4gZm9jdXMgKi8KKwl1bnNpZ25lZCBpbnQgc3RhdGU7CS8qIGtleSBvciBidXR0b24gbWFzayAqLworfSBYQ3Jvc3NpbmdFdmVudDsKK3R5cGVkZWYgWENyb3NzaW5nRXZlbnQgWEVudGVyV2luZG93RXZlbnQ7Cit0eXBlZGVmIFhDcm9zc2luZ0V2ZW50IFhMZWF2ZVdpbmRvd0V2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CQkvKiBGb2N1c0luIG9yIEZvY3VzT3V0ICovCisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgd2luZG93OwkJLyogd2luZG93IG9mIGV2ZW50ICovCisJaW50IG1vZGU7CQkvKiBOb3RpZnlOb3JtYWwsIE5vdGlmeVdoaWxlR3JhYmJlZCwKKwkJCQkgICBOb3RpZnlHcmFiLCBOb3RpZnlVbmdyYWIgKi8KKwlpbnQgZGV0YWlsOworCS8qCisJICogTm90aWZ5QW5jZXN0b3IsIE5vdGlmeVZpcnR1YWwsIE5vdGlmeUluZmVyaW9yLAorCSAqIE5vdGlmeU5vbmxpbmVhcixOb3RpZnlOb25saW5lYXJWaXJ0dWFsLCBOb3RpZnlQb2ludGVyLAorCSAqIE5vdGlmeVBvaW50ZXJSb290LCBOb3RpZnlEZXRhaWxOb25lCisJICovCit9IFhGb2N1c0NoYW5nZUV2ZW50OwordHlwZWRlZiBYRm9jdXNDaGFuZ2VFdmVudCBYRm9jdXNJbkV2ZW50OwordHlwZWRlZiBYRm9jdXNDaGFuZ2VFdmVudCBYRm9jdXNPdXRFdmVudDsKKworLyogZ2VuZXJhdGVkIG9uIEVudGVyV2luZG93IGFuZCBGb2N1c0luICB3aGVuIEtleU1hcFN0YXRlIHNlbGVjdGVkICovCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgd2luZG93OworCWNoYXIga2V5X3ZlY3RvclszMl07Cit9IFhLZXltYXBFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IHdpbmRvdzsKKwlpbnQgeCwgeTsKKwlpbnQgd2lkdGgsIGhlaWdodDsKKwlpbnQgY291bnQ7CQkvKiBpZiBub24temVybywgYXQgbGVhc3QgdGhpcyBtYW55IG1vcmUgKi8KK30gWEV4cG9zZUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlEcmF3YWJsZSBkcmF3YWJsZTsKKwlpbnQgeCwgeTsKKwlpbnQgd2lkdGgsIGhlaWdodDsKKwlpbnQgY291bnQ7CQkvKiBpZiBub24temVybywgYXQgbGVhc3QgdGhpcyBtYW55IG1vcmUgKi8KKwlpbnQgbWFqb3JfY29kZTsJCS8qIGNvcmUgaXMgQ29weUFyZWEgb3IgQ29weVBsYW5lICovCisJaW50IG1pbm9yX2NvZGU7CQkvKiBub3QgZGVmaW5lZCBpbiB0aGUgY29yZSAqLworfSBYR3JhcGhpY3NFeHBvc2VFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJRHJhd2FibGUgZHJhd2FibGU7CisJaW50IG1ham9yX2NvZGU7CQkvKiBjb3JlIGlzIENvcHlBcmVhIG9yIENvcHlQbGFuZSAqLworCWludCBtaW5vcl9jb2RlOwkJLyogbm90IGRlZmluZWQgaW4gdGhlIGNvcmUgKi8KK30gWE5vRXhwb3NlRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyB3aW5kb3c7CisJaW50IHN0YXRlOwkJLyogVmlzaWJpbGl0eSBzdGF0ZSAqLworfSBYVmlzaWJpbGl0eUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgcGFyZW50OwkJLyogcGFyZW50IG9mIHRoZSB3aW5kb3cgKi8KKwlXaW5kb3cgd2luZG93OwkJLyogd2luZG93IGlkIG9mIHdpbmRvdyBjcmVhdGVkICovCisJaW50IHgsIHk7CQkvKiB3aW5kb3cgbG9jYXRpb24gKi8KKwlpbnQgd2lkdGgsIGhlaWdodDsJLyogc2l6ZSBvZiB3aW5kb3cgKi8KKwlpbnQgYm9yZGVyX3dpZHRoOwkvKiBib3JkZXIgd2lkdGggKi8KKwlCb29sIG92ZXJyaWRlX3JlZGlyZWN0OwkvKiBjcmVhdGlvbiBzaG91bGQgYmUgb3ZlcnJpZGRlbiAqLworfSBYQ3JlYXRlV2luZG93RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyBldmVudDsKKwlXaW5kb3cgd2luZG93OworfSBYRGVzdHJveVdpbmRvd0V2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgZXZlbnQ7CisJV2luZG93IHdpbmRvdzsKKwlCb29sIGZyb21fY29uZmlndXJlOworfSBYVW5tYXBFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IGV2ZW50OworCVdpbmRvdyB3aW5kb3c7CisJQm9vbCBvdmVycmlkZV9yZWRpcmVjdDsJLyogYm9vbGVhbiwgaXMgb3ZlcnJpZGUgc2V0Li4uICovCit9IFhNYXBFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IHBhcmVudDsKKwlXaW5kb3cgd2luZG93OworfSBYTWFwUmVxdWVzdEV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgZXZlbnQ7CisJV2luZG93IHdpbmRvdzsKKwlXaW5kb3cgcGFyZW50OworCWludCB4LCB5OworCUJvb2wgb3ZlcnJpZGVfcmVkaXJlY3Q7Cit9IFhSZXBhcmVudEV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgZXZlbnQ7CisJV2luZG93IHdpbmRvdzsKKwlpbnQgeCwgeTsKKwlpbnQgd2lkdGgsIGhlaWdodDsKKwlpbnQgYm9yZGVyX3dpZHRoOworCVdpbmRvdyBhYm92ZTsKKwlCb29sIG92ZXJyaWRlX3JlZGlyZWN0OworfSBYQ29uZmlndXJlRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyBldmVudDsKKwlXaW5kb3cgd2luZG93OworCWludCB4LCB5OworfSBYR3Jhdml0eUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgd2luZG93OworCWludCB3aWR0aCwgaGVpZ2h0OworfSBYUmVzaXplUmVxdWVzdEV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgcGFyZW50OworCVdpbmRvdyB3aW5kb3c7CisJaW50IHgsIHk7CisJaW50IHdpZHRoLCBoZWlnaHQ7CisJaW50IGJvcmRlcl93aWR0aDsKKwlXaW5kb3cgYWJvdmU7CisJaW50IGRldGFpbDsJCS8qIEFib3ZlLCBCZWxvdywgVG9wSWYsIEJvdHRvbUlmLCBPcHBvc2l0ZSAqLworCXVuc2lnbmVkIGxvbmcgdmFsdWVfbWFzazsKK30gWENvbmZpZ3VyZVJlcXVlc3RFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IGV2ZW50OworCVdpbmRvdyB3aW5kb3c7CisJaW50IHBsYWNlOwkJLyogUGxhY2VPblRvcCwgUGxhY2VPbkJvdHRvbSAqLworfSBYQ2lyY3VsYXRlRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyBwYXJlbnQ7CisJV2luZG93IHdpbmRvdzsKKwlpbnQgcGxhY2U7CQkvKiBQbGFjZU9uVG9wLCBQbGFjZU9uQm90dG9tICovCit9IFhDaXJjdWxhdGVSZXF1ZXN0RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyB3aW5kb3c7CisJQXRvbSBhdG9tOworCVRpbWUgdGltZTsKKwlpbnQgc3RhdGU7CQkvKiBOZXdWYWx1ZSwgRGVsZXRlZCAqLworfSBYUHJvcGVydHlFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IHdpbmRvdzsKKwlBdG9tIHNlbGVjdGlvbjsKKwlUaW1lIHRpbWU7Cit9IFhTZWxlY3Rpb25DbGVhckV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgb3duZXI7CisJV2luZG93IHJlcXVlc3RvcjsKKwlBdG9tIHNlbGVjdGlvbjsKKwlBdG9tIHRhcmdldDsKKwlBdG9tIHByb3BlcnR5OworCVRpbWUgdGltZTsKK30gWFNlbGVjdGlvblJlcXVlc3RFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IHJlcXVlc3RvcjsKKwlBdG9tIHNlbGVjdGlvbjsKKwlBdG9tIHRhcmdldDsKKwlBdG9tIHByb3BlcnR5OwkJLyogQVRPTSBvciBOb25lICovCisJVGltZSB0aW1lOworfSBYU2VsZWN0aW9uRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyB3aW5kb3c7CisJQ29sb3JtYXAgY29sb3JtYXA7CS8qIENPTE9STUFQIG9yIE5vbmUgKi8KKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisJQm9vbCBjX25ldzsJCS8qIEMrKyAqLworI2Vsc2UKKwlCb29sIG5ldzsKKyNlbmRpZgorCWludCBzdGF0ZTsJCS8qIENvbG9ybWFwSW5zdGFsbGVkLCBDb2xvcm1hcFVuaW5zdGFsbGVkICovCit9IFhDb2xvcm1hcEV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgd2luZG93OworCUF0b20gbWVzc2FnZV90eXBlOworCWludCBmb3JtYXQ7CisJdW5pb24geworCQljaGFyIGJbMjBdOworCQlzaG9ydCBzWzEwXTsKKwkJbG9uZyBsWzVdOworCQl9IGRhdGE7Cit9IFhDbGllbnRNZXNzYWdlRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyB3aW5kb3c7CQkvKiB1bnVzZWQgKi8KKwlpbnQgcmVxdWVzdDsJCS8qIG9uZSBvZiBNYXBwaW5nTW9kaWZpZXIsIE1hcHBpbmdLZXlib2FyZCwKKwkJCQkgICBNYXBwaW5nUG9pbnRlciAqLworCWludCBmaXJzdF9rZXljb2RlOwkvKiBmaXJzdCBrZXljb2RlICovCisJaW50IGNvdW50OwkJLyogZGVmaW5lcyByYW5nZSBvZiBjaGFuZ2Ugdy4gZmlyc3Rfa2V5Y29kZSovCit9IFhNYXBwaW5nRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJWElEIHJlc291cmNlaWQ7CQkvKiByZXNvdXJjZSBpZCAqLworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiBzZXJpYWwgbnVtYmVyIG9mIGZhaWxlZCByZXF1ZXN0ICovCisJdW5zaWduZWQgY2hhciBlcnJvcl9jb2RlOwkvKiBlcnJvciBjb2RlIG9mIGZhaWxlZCByZXF1ZXN0ICovCisJdW5zaWduZWQgY2hhciByZXF1ZXN0X2NvZGU7CS8qIE1ham9yIG9wLWNvZGUgb2YgZmFpbGVkIHJlcXVlc3QgKi8KKwl1bnNpZ25lZCBjaGFyIG1pbm9yX2NvZGU7CS8qIE1pbm9yIG9wLWNvZGUgb2YgZmFpbGVkIHJlcXVlc3QgKi8KK30gWEVycm9yRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IHdpbmRvdzsJLyogd2luZG93IG9uIHdoaWNoIGV2ZW50IHdhcyByZXF1ZXN0ZWQgaW4gZXZlbnQgbWFzayAqLworfSBYQW55RXZlbnQ7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdlbmVyaWNFdmVudC4gIFRoaXMgZXZlbnQgaXMgdGhlIHN0YW5kYXJkIGV2ZW50IGZvciBhbGwgbmV3ZXIgZXh0ZW5zaW9ucy4KKyAqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBpbnQgICAgICAgICAgICB0eXBlOyAgICAgICAgIC8qIG9mIGV2ZW50LiBBbHdheXMgR2VuZXJpY0V2ZW50ICovCisgICAgdW5zaWduZWQgbG9uZyAgc2VyaWFsOyAgICAgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgKi8KKyAgICBCb29sICAgICAgICAgICBzZW5kX2V2ZW50OyAgIC8qIHRydWUgaWYgZnJvbSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgICAgICAgICpkaXNwbGF5OyAgICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIGludCAgICAgICAgICAgIGV4dGVuc2lvbjsgICAgLyogbWFqb3Igb3Bjb2RlIG9mIGV4dGVuc2lvbiB0aGF0IGNhdXNlZCB0aGUgZXZlbnQgKi8KKyAgICBpbnQgICAgICAgICAgICBldnR5cGU7ICAgICAgIC8qIGFjdHVhbCBldmVudCB0eXBlLiAqLworICAgIH0gWEdlbmVyaWNFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgIHR5cGU7ICAgICAgICAgLyogb2YgZXZlbnQuIEFsd2F5cyBHZW5lcmljRXZlbnQgKi8KKyAgICB1bnNpZ25lZCBsb25nICBzZXJpYWw7ICAgICAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCAqLworICAgIEJvb2wgICAgICAgICAgIHNlbmRfZXZlbnQ7ICAgLyogdHJ1ZSBpZiBmcm9tIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAgICAgICAgKmRpc3BsYXk7ICAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgaW50ICAgICAgICAgICAgZXh0ZW5zaW9uOyAgICAvKiBtYWpvciBvcGNvZGUgb2YgZXh0ZW5zaW9uIHRoYXQgY2F1c2VkIHRoZSBldmVudCAqLworICAgIGludCAgICAgICAgICAgIGV2dHlwZTsgICAgICAgLyogYWN0dWFsIGV2ZW50IHR5cGUuICovCisgICAgdW5zaWduZWQgaW50ICAgY29va2llOworICAgIHZvaWQgICAgICAgICAgICpkYXRhOworfSBYR2VuZXJpY0V2ZW50Q29va2llOworCisvKgorICogdGhpcyB1bmlvbiBpcyBkZWZpbmVkIHNvIFhsaWIgY2FuIGFsd2F5cyB1c2UgdGhlIHNhbWUgc2l6ZWQKKyAqIGV2ZW50IHN0cnVjdHVyZSBpbnRlcm5hbGx5LCB0byBhdm9pZCBtZW1vcnkgZnJhZ21lbnRhdGlvbi4KKyAqLwordHlwZWRlZiB1bmlvbiBfWEV2ZW50IHsKKyAgICAgICAgaW50IHR5cGU7CQkvKiBtdXN0IG5vdCBiZSBjaGFuZ2VkOyBmaXJzdCBlbGVtZW50ICovCisJWEFueUV2ZW50IHhhbnk7CisJWEtleUV2ZW50IHhrZXk7CisJWEJ1dHRvbkV2ZW50IHhidXR0b247CisJWE1vdGlvbkV2ZW50IHhtb3Rpb247CisJWENyb3NzaW5nRXZlbnQgeGNyb3NzaW5nOworCVhGb2N1c0NoYW5nZUV2ZW50IHhmb2N1czsKKwlYRXhwb3NlRXZlbnQgeGV4cG9zZTsKKwlYR3JhcGhpY3NFeHBvc2VFdmVudCB4Z3JhcGhpY3NleHBvc2U7CisJWE5vRXhwb3NlRXZlbnQgeG5vZXhwb3NlOworCVhWaXNpYmlsaXR5RXZlbnQgeHZpc2liaWxpdHk7CisJWENyZWF0ZVdpbmRvd0V2ZW50IHhjcmVhdGV3aW5kb3c7CisJWERlc3Ryb3lXaW5kb3dFdmVudCB4ZGVzdHJveXdpbmRvdzsKKwlYVW5tYXBFdmVudCB4dW5tYXA7CisJWE1hcEV2ZW50IHhtYXA7CisJWE1hcFJlcXVlc3RFdmVudCB4bWFwcmVxdWVzdDsKKwlYUmVwYXJlbnRFdmVudCB4cmVwYXJlbnQ7CisJWENvbmZpZ3VyZUV2ZW50IHhjb25maWd1cmU7CisJWEdyYXZpdHlFdmVudCB4Z3Jhdml0eTsKKwlYUmVzaXplUmVxdWVzdEV2ZW50IHhyZXNpemVyZXF1ZXN0OworCVhDb25maWd1cmVSZXF1ZXN0RXZlbnQgeGNvbmZpZ3VyZXJlcXVlc3Q7CisJWENpcmN1bGF0ZUV2ZW50IHhjaXJjdWxhdGU7CisJWENpcmN1bGF0ZVJlcXVlc3RFdmVudCB4Y2lyY3VsYXRlcmVxdWVzdDsKKwlYUHJvcGVydHlFdmVudCB4cHJvcGVydHk7CisJWFNlbGVjdGlvbkNsZWFyRXZlbnQgeHNlbGVjdGlvbmNsZWFyOworCVhTZWxlY3Rpb25SZXF1ZXN0RXZlbnQgeHNlbGVjdGlvbnJlcXVlc3Q7CisJWFNlbGVjdGlvbkV2ZW50IHhzZWxlY3Rpb247CisJWENvbG9ybWFwRXZlbnQgeGNvbG9ybWFwOworCVhDbGllbnRNZXNzYWdlRXZlbnQgeGNsaWVudDsKKwlYTWFwcGluZ0V2ZW50IHhtYXBwaW5nOworCVhFcnJvckV2ZW50IHhlcnJvcjsKKwlYS2V5bWFwRXZlbnQgeGtleW1hcDsKKwlYR2VuZXJpY0V2ZW50IHhnZW5lcmljOworCVhHZW5lcmljRXZlbnRDb29raWUgeGNvb2tpZTsKKwlsb25nIHBhZFsyNF07Cit9IFhFdmVudDsKKyNlbmRpZgorCisjZGVmaW5lIFhBbGxvY0lEKGRweSkgKCgqKChfWFByaXZEaXNwbGF5KWRweSktPnJlc291cmNlX2FsbG9jKSgoZHB5KSkpCisKKy8qCisgKiBwZXIgY2hhcmFjdGVyIGZvbnQgbWV0cmljIGluZm9ybWF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc2hvcnQJbGJlYXJpbmc7CS8qIG9yaWdpbiB0byBsZWZ0IGVkZ2Ugb2YgcmFzdGVyICovCisgICAgc2hvcnQJcmJlYXJpbmc7CS8qIG9yaWdpbiB0byByaWdodCBlZGdlIG9mIHJhc3RlciAqLworICAgIHNob3J0CXdpZHRoOwkJLyogYWR2YW5jZSB0byBuZXh0IGNoYXIncyBvcmlnaW4gKi8KKyAgICBzaG9ydAlhc2NlbnQ7CQkvKiBiYXNlbGluZSB0byB0b3AgZWRnZSBvZiByYXN0ZXIgKi8KKyAgICBzaG9ydAlkZXNjZW50OwkvKiBiYXNlbGluZSB0byBib3R0b20gZWRnZSBvZiByYXN0ZXIgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBhdHRyaWJ1dGVzOwkvKiBwZXIgY2hhciBmbGFncyAobm90IHByZWRlZmluZWQpICovCit9IFhDaGFyU3RydWN0OworCisvKgorICogVG8gYWxsb3cgYXJiaXRyYXJ5IGluZm9ybWF0aW9uIHdpdGggZm9udHMsIHRoZXJlIGFyZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMKKyAqIHJldHVybmVkLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQXRvbSBuYW1lOworICAgIHVuc2lnbmVkIGxvbmcgY2FyZDMyOworfSBYRm9udFByb3A7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYRXh0RGF0YQkqZXh0X2RhdGE7CS8qIGhvb2sgZm9yIGV4dGVuc2lvbiB0byBoYW5nIGRhdGEgKi8KKyAgICBGb250ICAgICAgICBmaWQ7ICAgICAgICAgICAgLyogRm9udCBpZCBmb3IgdGhpcyBmb250ICovCisgICAgdW5zaWduZWQJZGlyZWN0aW9uOwkvKiBoaW50IGFib3V0IGRpcmVjdGlvbiB0aGUgZm9udCBpcyBwYWludGVkICovCisgICAgdW5zaWduZWQJbWluX2NoYXJfb3JfYnl0ZTI7LyogZmlyc3QgY2hhcmFjdGVyICovCisgICAgdW5zaWduZWQJbWF4X2NoYXJfb3JfYnl0ZTI7LyogbGFzdCBjaGFyYWN0ZXIgKi8KKyAgICB1bnNpZ25lZAltaW5fYnl0ZTE7CS8qIGZpcnN0IHJvdyB0aGF0IGV4aXN0cyAqLworICAgIHVuc2lnbmVkCW1heF9ieXRlMTsJLyogbGFzdCByb3cgdGhhdCBleGlzdHMgKi8KKyAgICBCb29sCWFsbF9jaGFyc19leGlzdDsvKiBmbGFnIGlmIGFsbCBjaGFyYWN0ZXJzIGhhdmUgbm9uLXplcm8gc2l6ZSovCisgICAgdW5zaWduZWQJZGVmYXVsdF9jaGFyOwkvKiBjaGFyIHRvIHByaW50IGZvciB1bmRlZmluZWQgY2hhcmFjdGVyICovCisgICAgaW50ICAgICAgICAgbl9wcm9wZXJ0aWVzOyAgIC8qIGhvdyBtYW55IHByb3BlcnRpZXMgdGhlcmUgYXJlICovCisgICAgWEZvbnRQcm9wCSpwcm9wZXJ0aWVzOwkvKiBwb2ludGVyIHRvIGFycmF5IG9mIGFkZGl0aW9uYWwgcHJvcGVydGllcyovCisgICAgWENoYXJTdHJ1Y3QJbWluX2JvdW5kczsJLyogbWluaW11bSBib3VuZHMgb3ZlciBhbGwgZXhpc3RpbmcgY2hhciovCisgICAgWENoYXJTdHJ1Y3QJbWF4X2JvdW5kczsJLyogbWF4aW11bSBib3VuZHMgb3ZlciBhbGwgZXhpc3RpbmcgY2hhciovCisgICAgWENoYXJTdHJ1Y3QJKnBlcl9jaGFyOwkvKiBmaXJzdF9jaGFyIHRvIGxhc3RfY2hhciBpbmZvcm1hdGlvbiAqLworICAgIGludAkJYXNjZW50OwkJLyogbG9nLiBleHRlbnQgYWJvdmUgYmFzZWxpbmUgZm9yIHNwYWNpbmcgKi8KKyAgICBpbnQJCWRlc2NlbnQ7CS8qIGxvZy4gZGVzY2VudCBiZWxvdyBiYXNlbGluZSBmb3Igc3BhY2luZyAqLworfSBYRm9udFN0cnVjdDsKKworLyoKKyAqIFBvbHlUZXh0IHJvdXRpbmVzIHRha2UgdGhlc2UgYXMgYXJndW1lbnRzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciAqY2hhcnM7CQkvKiBwb2ludGVyIHRvIHN0cmluZyAqLworICAgIGludCBuY2hhcnM7CQkJLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgKi8KKyAgICBpbnQgZGVsdGE7CQkJLyogZGVsdGEgYmV0d2VlbiBzdHJpbmdzICovCisgICAgRm9udCBmb250OwkJCS8qIGZvbnQgdG8gcHJpbnQgaXQgaW4sIE5vbmUgZG9uJ3QgY2hhbmdlICovCit9IFhUZXh0SXRlbTsKKwordHlwZWRlZiBzdHJ1Y3QgewkJLyogbm9ybWFsIDE2IGJpdCBjaGFyYWN0ZXJzIGFyZSB0d28gYnl0ZXMgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGJ5dGUxOworICAgIHVuc2lnbmVkIGNoYXIgYnl0ZTI7Cit9IFhDaGFyMmI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYQ2hhcjJiICpjaGFyczsJCS8qIHR3byBieXRlIGNoYXJhY3RlcnMgKi8KKyAgICBpbnQgbmNoYXJzOwkJCS8qIG51bWJlciBvZiBjaGFyYWN0ZXJzICovCisgICAgaW50IGRlbHRhOwkJCS8qIGRlbHRhIGJldHdlZW4gc3RyaW5ncyAqLworICAgIEZvbnQgZm9udDsJCQkvKiBmb250IHRvIHByaW50IGl0IGluLCBOb25lIGRvbid0IGNoYW5nZSAqLworfSBYVGV4dEl0ZW0xNjsKKworCit0eXBlZGVmIHVuaW9uIHsgRGlzcGxheSAqZGlzcGxheTsKKwkJR0MgZ2M7CisJCVZpc3VhbCAqdmlzdWFsOworCQlTY3JlZW4gKnNjcmVlbjsKKwkJU2NyZWVuRm9ybWF0ICpwaXhtYXBfZm9ybWF0OworCQlYRm9udFN0cnVjdCAqZm9udDsgfSBYRURhdGFPYmplY3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYUmVjdGFuZ2xlICAgICAgbWF4X2lua19leHRlbnQ7CisgICAgWFJlY3RhbmdsZSAgICAgIG1heF9sb2dpY2FsX2V4dGVudDsKK30gWEZvbnRTZXRFeHRlbnRzOworCisvKiB1bnVzZWQ6Cit0eXBlZGVmIHZvaWQgKCpYT01Qcm9jKSgpOworICovCisKK3R5cGVkZWYgc3RydWN0IF9YT00gKlhPTTsKK3R5cGVkZWYgc3RydWN0IF9YT0MgKlhPQywgKlhGb250U2V0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciAgICAgICAgICAgKmNoYXJzOworICAgIGludCAgICAgICAgICAgICBuY2hhcnM7CisgICAgaW50ICAgICAgICAgICAgIGRlbHRhOworICAgIFhGb250U2V0ICAgICAgICBmb250X3NldDsKK30gWG1iVGV4dEl0ZW07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB3Y2hhcl90ICAgICAgICAqY2hhcnM7CisgICAgaW50ICAgICAgICAgICAgIG5jaGFyczsKKyAgICBpbnQgICAgICAgICAgICAgZGVsdGE7CisgICAgWEZvbnRTZXQgICAgICAgIGZvbnRfc2V0OworfSBYd2NUZXh0SXRlbTsKKworI2RlZmluZSBYTlJlcXVpcmVkQ2hhclNldCAicmVxdWlyZWRDaGFyU2V0IgorI2RlZmluZSBYTlF1ZXJ5T3JpZW50YXRpb24gInF1ZXJ5T3JpZW50YXRpb24iCisjZGVmaW5lIFhOQmFzZUZvbnROYW1lICJiYXNlRm9udE5hbWUiCisjZGVmaW5lIFhOT01BdXRvbWF0aWMgIm9tQXV0b21hdGljIgorI2RlZmluZSBYTk1pc3NpbmdDaGFyU2V0ICJtaXNzaW5nQ2hhclNldCIKKyNkZWZpbmUgWE5EZWZhdWx0U3RyaW5nICJkZWZhdWx0U3RyaW5nIgorI2RlZmluZSBYTk9yaWVudGF0aW9uICJvcmllbnRhdGlvbiIKKyNkZWZpbmUgWE5EaXJlY3Rpb25hbERlcGVuZGVudERyYXdpbmcgImRpcmVjdGlvbmFsRGVwZW5kZW50RHJhd2luZyIKKyNkZWZpbmUgWE5Db250ZXh0dWFsRHJhd2luZyAiY29udGV4dHVhbERyYXdpbmciCisjZGVmaW5lIFhORm9udEluZm8gImZvbnRJbmZvIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGNoYXJzZXRfY291bnQ7CisgICAgY2hhciAqKmNoYXJzZXRfbGlzdDsKK30gWE9NQ2hhclNldExpc3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgWE9NT3JpZW50YXRpb25fTFRSX1RUQiwKKyAgICBYT01PcmllbnRhdGlvbl9SVExfVFRCLAorICAgIFhPTU9yaWVudGF0aW9uX1RUQl9MVFIsCisgICAgWE9NT3JpZW50YXRpb25fVFRCX1JUTCwKKyAgICBYT01PcmllbnRhdGlvbl9Db250ZXh0Cit9IFhPcmllbnRhdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBudW1fb3JpZW50YXRpb247CisgICAgWE9yaWVudGF0aW9uICpvcmllbnRhdGlvbjsJLyogSW5wdXQgVGV4dCBkZXNjcmlwdGlvbiAqLworfSBYT01PcmllbnRhdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBudW1fZm9udDsKKyAgICBYRm9udFN0cnVjdCAqKmZvbnRfc3RydWN0X2xpc3Q7CisgICAgY2hhciAqKmZvbnRfbmFtZV9saXN0OworfSBYT01Gb250SW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgX1hJTSAqWElNOwordHlwZWRlZiBzdHJ1Y3QgX1hJQyAqWElDOworCit0eXBlZGVmIHZvaWQgKCpYSU1Qcm9jKSgKKyAgICBYSU0sCisgICAgWFBvaW50ZXIsCisgICAgWFBvaW50ZXIKKyk7CisKK3R5cGVkZWYgQm9vbCAoKlhJQ1Byb2MpKAorICAgIFhJQywKKyAgICBYUG9pbnRlciwKKyAgICBYUG9pbnRlcgorKTsKKwordHlwZWRlZiB2b2lkICgqWElEUHJvYykoCisgICAgRGlzcGxheSosCisgICAgWFBvaW50ZXIsCisgICAgWFBvaW50ZXIKKyk7CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBYSU1TdHlsZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIHNob3J0IGNvdW50X3N0eWxlczsKKyAgICBYSU1TdHlsZSAqc3VwcG9ydGVkX3N0eWxlczsKK30gWElNU3R5bGVzOworCisjZGVmaW5lIFhJTVByZWVkaXRBcmVhCQkweDAwMDFMCisjZGVmaW5lIFhJTVByZWVkaXRDYWxsYmFja3MJMHgwMDAyTAorI2RlZmluZSBYSU1QcmVlZGl0UG9zaXRpb24JMHgwMDA0TAorI2RlZmluZSBYSU1QcmVlZGl0Tm90aGluZwkweDAwMDhMCisjZGVmaW5lIFhJTVByZWVkaXROb25lCQkweDAwMTBMCisjZGVmaW5lIFhJTVN0YXR1c0FyZWEJCTB4MDEwMEwKKyNkZWZpbmUgWElNU3RhdHVzQ2FsbGJhY2tzCTB4MDIwMEwKKyNkZWZpbmUgWElNU3RhdHVzTm90aGluZwkweDA0MDBMCisjZGVmaW5lIFhJTVN0YXR1c05vbmUJCTB4MDgwMEwKKworI2RlZmluZSBYTlZhTmVzdGVkTGlzdCAiWE5WYU5lc3RlZExpc3QiCisjZGVmaW5lIFhOUXVlcnlJbnB1dFN0eWxlICJxdWVyeUlucHV0U3R5bGUiCisjZGVmaW5lIFhOQ2xpZW50V2luZG93ICJjbGllbnRXaW5kb3ciCisjZGVmaW5lIFhOSW5wdXRTdHlsZSAiaW5wdXRTdHlsZSIKKyNkZWZpbmUgWE5Gb2N1c1dpbmRvdyAiZm9jdXNXaW5kb3ciCisjZGVmaW5lIFhOUmVzb3VyY2VOYW1lICJyZXNvdXJjZU5hbWUiCisjZGVmaW5lIFhOUmVzb3VyY2VDbGFzcyAicmVzb3VyY2VDbGFzcyIKKyNkZWZpbmUgWE5HZW9tZXRyeUNhbGxiYWNrICJnZW9tZXRyeUNhbGxiYWNrIgorI2RlZmluZSBYTkRlc3Ryb3lDYWxsYmFjayAiZGVzdHJveUNhbGxiYWNrIgorI2RlZmluZSBYTkZpbHRlckV2ZW50cyAiZmlsdGVyRXZlbnRzIgorI2RlZmluZSBYTlByZWVkaXRTdGFydENhbGxiYWNrICJwcmVlZGl0U3RhcnRDYWxsYmFjayIKKyNkZWZpbmUgWE5QcmVlZGl0RG9uZUNhbGxiYWNrICJwcmVlZGl0RG9uZUNhbGxiYWNrIgorI2RlZmluZSBYTlByZWVkaXREcmF3Q2FsbGJhY2sgInByZWVkaXREcmF3Q2FsbGJhY2siCisjZGVmaW5lIFhOUHJlZWRpdENhcmV0Q2FsbGJhY2sgInByZWVkaXRDYXJldENhbGxiYWNrIgorI2RlZmluZSBYTlByZWVkaXRTdGF0ZU5vdGlmeUNhbGxiYWNrICJwcmVlZGl0U3RhdGVOb3RpZnlDYWxsYmFjayIKKyNkZWZpbmUgWE5QcmVlZGl0QXR0cmlidXRlcyAicHJlZWRpdEF0dHJpYnV0ZXMiCisjZGVmaW5lIFhOU3RhdHVzU3RhcnRDYWxsYmFjayAic3RhdHVzU3RhcnRDYWxsYmFjayIKKyNkZWZpbmUgWE5TdGF0dXNEb25lQ2FsbGJhY2sgInN0YXR1c0RvbmVDYWxsYmFjayIKKyNkZWZpbmUgWE5TdGF0dXNEcmF3Q2FsbGJhY2sgInN0YXR1c0RyYXdDYWxsYmFjayIKKyNkZWZpbmUgWE5TdGF0dXNBdHRyaWJ1dGVzICJzdGF0dXNBdHRyaWJ1dGVzIgorI2RlZmluZSBYTkFyZWEgImFyZWEiCisjZGVmaW5lIFhOQXJlYU5lZWRlZCAiYXJlYU5lZWRlZCIKKyNkZWZpbmUgWE5TcG90TG9jYXRpb24gInNwb3RMb2NhdGlvbiIKKyNkZWZpbmUgWE5Db2xvcm1hcCAiY29sb3JNYXAiCisjZGVmaW5lIFhOU3RkQ29sb3JtYXAgInN0ZENvbG9yTWFwIgorI2RlZmluZSBYTkZvcmVncm91bmQgImZvcmVncm91bmQiCisjZGVmaW5lIFhOQmFja2dyb3VuZCAiYmFja2dyb3VuZCIKKyNkZWZpbmUgWE5CYWNrZ3JvdW5kUGl4bWFwICJiYWNrZ3JvdW5kUGl4bWFwIgorI2RlZmluZSBYTkZvbnRTZXQgImZvbnRTZXQiCisjZGVmaW5lIFhOTGluZVNwYWNlICJsaW5lU3BhY2UiCisjZGVmaW5lIFhOQ3Vyc29yICJjdXJzb3IiCisKKyNkZWZpbmUgWE5RdWVyeUlNVmFsdWVzTGlzdCAicXVlcnlJTVZhbHVlc0xpc3QiCisjZGVmaW5lIFhOUXVlcnlJQ1ZhbHVlc0xpc3QgInF1ZXJ5SUNWYWx1ZXNMaXN0IgorI2RlZmluZSBYTlZpc2libGVQb3NpdGlvbiAidmlzaWJsZVBvc2l0aW9uIgorI2RlZmluZSBYTlI2UHJlZWRpdENhbGxiYWNrICJyNlByZWVkaXRDYWxsYmFjayIKKyNkZWZpbmUgWE5TdHJpbmdDb252ZXJzaW9uQ2FsbGJhY2sgInN0cmluZ0NvbnZlcnNpb25DYWxsYmFjayIKKyNkZWZpbmUgWE5TdHJpbmdDb252ZXJzaW9uICJzdHJpbmdDb252ZXJzaW9uIgorI2RlZmluZSBYTlJlc2V0U3RhdGUgInJlc2V0U3RhdGUiCisjZGVmaW5lIFhOSG90S2V5ICJob3RLZXkiCisjZGVmaW5lIFhOSG90S2V5U3RhdGUgImhvdEtleVN0YXRlIgorI2RlZmluZSBYTlByZWVkaXRTdGF0ZSAicHJlZWRpdFN0YXRlIgorI2RlZmluZSBYTlNlcGFyYXRvcm9mTmVzdGVkTGlzdCAic2VwYXJhdG9yb2ZOZXN0ZWRMaXN0IgorCisjZGVmaW5lIFhCdWZmZXJPdmVyZmxvdwkJLTEKKyNkZWZpbmUgWExvb2t1cE5vbmUJCTEKKyNkZWZpbmUgWExvb2t1cENoYXJzCQkyCisjZGVmaW5lIFhMb29rdXBLZXlTeW0JCTMKKyNkZWZpbmUgWExvb2t1cEJvdGgJCTQKKwordHlwZWRlZiB2b2lkICpYVmFOZXN0ZWRMaXN0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWFBvaW50ZXIgY2xpZW50X2RhdGE7CisgICAgWElNUHJvYyBjYWxsYmFjazsKK30gWElNQ2FsbGJhY2s7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYUG9pbnRlciBjbGllbnRfZGF0YTsKKyAgICBYSUNQcm9jIGNhbGxiYWNrOworfSBYSUNDYWxsYmFjazsKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFhJTUZlZWRiYWNrOworCisjZGVmaW5lIFhJTVJldmVyc2UJCTFMCisjZGVmaW5lIFhJTVVuZGVybGluZQkJKDFMPDwxKQorI2RlZmluZSBYSU1IaWdobGlnaHQJCSgxTDw8MikKKyNkZWZpbmUgWElNUHJpbWFyeQkgCSgxTDw8NSkKKyNkZWZpbmUgWElNU2Vjb25kYXJ5CQkoMUw8PDYpCisjZGVmaW5lIFhJTVRlcnRpYXJ5CSAJKDFMPDw3KQorI2RlZmluZSBYSU1WaXNpYmxlVG9Gb3J3YXJkIAkoMUw8PDgpCisjZGVmaW5lIFhJTVZpc2libGVUb0JhY2t3b3JkIAkoMUw8PDkpCisjZGVmaW5lIFhJTVZpc2libGVUb0NlbnRlciAJKDFMPDwxMCkKKwordHlwZWRlZiBzdHJ1Y3QgX1hJTVRleHQgeworICAgIHVuc2lnbmVkIHNob3J0IGxlbmd0aDsKKyAgICBYSU1GZWVkYmFjayAqZmVlZGJhY2s7CisgICAgQm9vbCBlbmNvZGluZ19pc193Y2hhcjsKKyAgICB1bmlvbiB7CisJY2hhciAqbXVsdGlfYnl0ZTsKKwl3Y2hhcl90ICp3aWRlX2NoYXI7CisgICAgfSBzdHJpbmc7Cit9IFhJTVRleHQ7CisKK3R5cGVkZWYJdW5zaWduZWQgbG9uZwkgWElNUHJlZWRpdFN0YXRlOworCisjZGVmaW5lCVhJTVByZWVkaXRVbktub3duCTBMCisjZGVmaW5lCVhJTVByZWVkaXRFbmFibGUJMUwKKyNkZWZpbmUJWElNUHJlZWRpdERpc2FibGUJKDFMPDwxKQorCit0eXBlZGVmCXN0cnVjdAlfWElNUHJlZWRpdFN0YXRlTm90aWZ5Q2FsbGJhY2tTdHJ1Y3QgeworICAgIFhJTVByZWVkaXRTdGF0ZSBzdGF0ZTsKK30gWElNUHJlZWRpdFN0YXRlTm90aWZ5Q2FsbGJhY2tTdHJ1Y3Q7CisKK3R5cGVkZWYJdW5zaWduZWQgbG9uZwkgWElNUmVzZXRTdGF0ZTsKKworI2RlZmluZQlYSU1Jbml0aWFsU3RhdGUJCTFMCisjZGVmaW5lCVhJTVByZXNlcnZlU3RhdGUJKDFMPDwxKQorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgWElNU3RyaW5nQ29udmVyc2lvbkZlZWRiYWNrOworCisjZGVmaW5lCVhJTVN0cmluZ0NvbnZlcnNpb25MZWZ0RWRnZQkoMHgwMDAwMDAwMSkKKyNkZWZpbmUJWElNU3RyaW5nQ29udmVyc2lvblJpZ2h0RWRnZQkoMHgwMDAwMDAwMikKKyNkZWZpbmUJWElNU3RyaW5nQ29udmVyc2lvblRvcEVkZ2UJKDB4MDAwMDAwMDQpCisjZGVmaW5lCVhJTVN0cmluZ0NvbnZlcnNpb25Cb3R0b21FZGdlCSgweDAwMDAwMDA4KQorI2RlZmluZQlYSU1TdHJpbmdDb252ZXJzaW9uQ29uY2VhbGVkCSgweDAwMDAwMDEwKQorI2RlZmluZQlYSU1TdHJpbmdDb252ZXJzaW9uV3JhcHBlZAkoMHgwMDAwMDAyMCkKKwordHlwZWRlZiBzdHJ1Y3QgX1hJTVN0cmluZ0NvbnZlcnNpb25UZXh0IHsKKyAgICB1bnNpZ25lZCBzaG9ydCBsZW5ndGg7CisgICAgWElNU3RyaW5nQ29udmVyc2lvbkZlZWRiYWNrICpmZWVkYmFjazsKKyAgICBCb29sIGVuY29kaW5nX2lzX3djaGFyOworICAgIHVuaW9uIHsKKwljaGFyICptYnM7CisJd2NoYXJfdCAqd2NzOworICAgIH0gc3RyaW5nOworfSBYSU1TdHJpbmdDb252ZXJzaW9uVGV4dDsKKwordHlwZWRlZgl1bnNpZ25lZCBzaG9ydAlYSU1TdHJpbmdDb252ZXJzaW9uUG9zaXRpb247CisKK3R5cGVkZWYJdW5zaWduZWQgc2hvcnQJWElNU3RyaW5nQ29udmVyc2lvblR5cGU7CisKKyNkZWZpbmUJWElNU3RyaW5nQ29udmVyc2lvbkJ1ZmZlcgkoMHgwMDAxKQorI2RlZmluZQlYSU1TdHJpbmdDb252ZXJzaW9uTGluZQkJKDB4MDAwMikKKyNkZWZpbmUJWElNU3RyaW5nQ29udmVyc2lvbldvcmQJCSgweDAwMDMpCisjZGVmaW5lCVhJTVN0cmluZ0NvbnZlcnNpb25DaGFyCQkoMHgwMDA0KQorCit0eXBlZGVmCXVuc2lnbmVkIHNob3J0CVhJTVN0cmluZ0NvbnZlcnNpb25PcGVyYXRpb247CisKKyNkZWZpbmUJWElNU3RyaW5nQ29udmVyc2lvblN1YnN0aXR1dGlvbgkoMHgwMDAxKQorI2RlZmluZQlYSU1TdHJpbmdDb252ZXJzaW9uUmV0cmlldmFsCSgweDAwMDIpCisKK3R5cGVkZWYgZW51bSB7CisgICAgWElNRm9yd2FyZENoYXIsIFhJTUJhY2t3YXJkQ2hhciwKKyAgICBYSU1Gb3J3YXJkV29yZCwgWElNQmFja3dhcmRXb3JkLAorICAgIFhJTUNhcmV0VXAsIFhJTUNhcmV0RG93biwKKyAgICBYSU1OZXh0TGluZSwgWElNUHJldmlvdXNMaW5lLAorICAgIFhJTUxpbmVTdGFydCwgWElNTGluZUVuZCwKKyAgICBYSU1BYnNvbHV0ZVBvc2l0aW9uLAorICAgIFhJTURvbnRDaGFuZ2UKK30gWElNQ2FyZXREaXJlY3Rpb247CisKK3R5cGVkZWYgc3RydWN0IF9YSU1TdHJpbmdDb252ZXJzaW9uQ2FsbGJhY2tTdHJ1Y3QgeworICAgIFhJTVN0cmluZ0NvbnZlcnNpb25Qb3NpdGlvbiBwb3NpdGlvbjsKKyAgICBYSU1DYXJldERpcmVjdGlvbiBkaXJlY3Rpb247CisgICAgWElNU3RyaW5nQ29udmVyc2lvbk9wZXJhdGlvbiBvcGVyYXRpb247CisgICAgdW5zaWduZWQgc2hvcnQgZmFjdG9yOworICAgIFhJTVN0cmluZ0NvbnZlcnNpb25UZXh0ICp0ZXh0OworfSBYSU1TdHJpbmdDb252ZXJzaW9uQ2FsbGJhY2tTdHJ1Y3Q7CisKK3R5cGVkZWYgc3RydWN0IF9YSU1QcmVlZGl0RHJhd0NhbGxiYWNrU3RydWN0IHsKKyAgICBpbnQgY2FyZXQ7CQkvKiBDdXJzb3Igb2Zmc2V0IHdpdGhpbiBwcmUtZWRpdCBzdHJpbmcgKi8KKyAgICBpbnQgY2hnX2ZpcnN0OwkvKiBTdGFydGluZyBjaGFuZ2UgcG9zaXRpb24gKi8KKyAgICBpbnQgY2hnX2xlbmd0aDsJLyogTGVuZ3RoIG9mIHRoZSBjaGFuZ2UgaW4gY2hhcmFjdGVyIGNvdW50ICovCisgICAgWElNVGV4dCAqdGV4dDsKK30gWElNUHJlZWRpdERyYXdDYWxsYmFja1N0cnVjdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBYSU1Jc0ludmlzaWJsZSwJLyogRGlzYWJsZSBjYXJldCBmZWVkYmFjayAqLworICAgIFhJTUlzUHJpbWFyeSwJLyogVUkgZGVmaW5lZCBjYXJldCBmZWVkYmFjayAqLworICAgIFhJTUlzU2Vjb25kYXJ5CS8qIFVJIGRlZmluZWQgY2FyZXQgZmVlZGJhY2sgKi8KK30gWElNQ2FyZXRTdHlsZTsKKwordHlwZWRlZiBzdHJ1Y3QgX1hJTVByZWVkaXRDYXJldENhbGxiYWNrU3RydWN0IHsKKyAgICBpbnQgcG9zaXRpb247CQkgLyogQ2FyZXQgb2Zmc2V0IHdpdGhpbiBwcmUtZWRpdCBzdHJpbmcgKi8KKyAgICBYSU1DYXJldERpcmVjdGlvbiBkaXJlY3Rpb247IC8qIENhcmV0IG1vdmVzIGRpcmVjdGlvbiAqLworICAgIFhJTUNhcmV0U3R5bGUgc3R5bGU7CSAvKiBGZWVkYmFjayBvZiB0aGUgY2FyZXQgKi8KK30gWElNUHJlZWRpdENhcmV0Q2FsbGJhY2tTdHJ1Y3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgWElNVGV4dFR5cGUsCisgICAgWElNQml0bWFwVHlwZQorfSBYSU1TdGF0dXNEYXRhVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgX1hJTVN0YXR1c0RyYXdDYWxsYmFja1N0cnVjdCB7CisgICAgWElNU3RhdHVzRGF0YVR5cGUgdHlwZTsKKyAgICB1bmlvbiB7CisJWElNVGV4dCAqdGV4dDsKKwlQaXhtYXAgIGJpdG1hcDsKKyAgICB9IGRhdGE7Cit9IFhJTVN0YXR1c0RyYXdDYWxsYmFja1N0cnVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgX1hJTUhvdEtleVRyaWdnZXIgeworICAgIEtleVN5bQkga2V5c3ltOworICAgIGludAkJIG1vZGlmaWVyOworICAgIGludAkJIG1vZGlmaWVyX21hc2s7Cit9IFhJTUhvdEtleVRyaWdnZXI7CisKK3R5cGVkZWYgc3RydWN0IF9YSU1Ib3RLZXlUcmlnZ2VycyB7CisgICAgaW50CQkJIG51bV9ob3Rfa2V5OworICAgIFhJTUhvdEtleVRyaWdnZXIJKmtleTsKK30gWElNSG90S2V5VHJpZ2dlcnM7CisKK3R5cGVkZWYJdW5zaWduZWQgbG9uZwkgWElNSG90S2V5U3RhdGU7CisKKyNkZWZpbmUJWElNSG90S2V5U3RhdGVPTgkoMHgwMDAxTCkKKyNkZWZpbmUJWElNSG90S2V5U3RhdGVPRkYJKDB4MDAwMkwpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBzaG9ydCBjb3VudF92YWx1ZXM7CisgICAgY2hhciAqKnN1cHBvcnRlZF92YWx1ZXM7Cit9IFhJTVZhbHVlc0xpc3Q7CisKK19YRlVOQ1BST1RPQkVHSU4KKworI2lmIGRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKF9YTElCSU5UXykKKyNkZWZpbmUgX1hkZWJ1ZyAoKl9YZGVidWdfcCkKKyNlbmRpZgorCitleHRlcm4gaW50IF9YZGVidWc7CisKK2V4dGVybiBYRm9udFN0cnVjdCAqWExvYWRRdWVyeUZvbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBuYW1lICovCispOworCitleHRlcm4gWEZvbnRTdHJ1Y3QgKlhRdWVyeUZvbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWElECQkJLyogZm9udF9JRCAqLworKTsKKworCitleHRlcm4gWFRpbWVDb29yZCAqWEdldE1vdGlvbkV2ZW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgVGltZQkJLyogc3RhcnQgKi8sCisgICAgVGltZQkJLyogc3RvcCAqLywKKyAgICBpbnQqCQkvKiBuZXZlbnRzX3JldHVybiAqLworKTsKKworZXh0ZXJuIFhNb2RpZmllcktleW1hcCAqWERlbGV0ZU1vZGlmaWVybWFwRW50cnkoCisgICAgWE1vZGlmaWVyS2V5bWFwKgkvKiBtb2RtYXAgKi8sCisjaWYgTmVlZFdpZGVQcm90b3R5cGVzCisgICAgdW5zaWduZWQgaW50CS8qIGtleWNvZGVfZW50cnkgKi8sCisjZWxzZQorICAgIEtleUNvZGUJCS8qIGtleWNvZGVfZW50cnkgKi8sCisjZW5kaWYKKyAgICBpbnQJCQkvKiBtb2RpZmllciAqLworKTsKKworZXh0ZXJuIFhNb2RpZmllcktleW1hcAkqWEdldE1vZGlmaWVyTWFwcGluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIFhNb2RpZmllcktleW1hcAkqWEluc2VydE1vZGlmaWVybWFwRW50cnkoCisgICAgWE1vZGlmaWVyS2V5bWFwKgkvKiBtb2RtYXAgKi8sCisjaWYgTmVlZFdpZGVQcm90b3R5cGVzCisgICAgdW5zaWduZWQgaW50CS8qIGtleWNvZGVfZW50cnkgKi8sCisjZWxzZQorICAgIEtleUNvZGUJCS8qIGtleWNvZGVfZW50cnkgKi8sCisjZW5kaWYKKyAgICBpbnQJCQkvKiBtb2RpZmllciAqLworKTsKKworZXh0ZXJuIFhNb2RpZmllcktleW1hcCAqWE5ld01vZGlmaWVybWFwKAorICAgIGludAkJCS8qIG1heF9rZXlzX3Blcl9tb2QgKi8KKyk7CisKK2V4dGVybiBYSW1hZ2UgKlhDcmVhdGVJbWFnZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBWaXN1YWwqCQkvKiB2aXN1YWwgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGRlcHRoICovLAorICAgIGludAkJCS8qIGZvcm1hdCAqLywKKyAgICBpbnQJCQkvKiBvZmZzZXQgKi8sCisgICAgY2hhcioJCS8qIGRhdGEgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCisgICAgaW50CQkJLyogYml0bWFwX3BhZCAqLywKKyAgICBpbnQJCQkvKiBieXRlc19wZXJfbGluZSAqLworKTsKK2V4dGVybiBTdGF0dXMgWEluaXRJbWFnZSgKKyAgICBYSW1hZ2UqCQkvKiBpbWFnZSAqLworKTsKK2V4dGVybiBYSW1hZ2UgKlhHZXRJbWFnZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBwbGFuZV9tYXNrICovLAorICAgIGludAkJCS8qIGZvcm1hdCAqLworKTsKK2V4dGVybiBYSW1hZ2UgKlhHZXRTdWJJbWFnZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBwbGFuZV9tYXNrICovLAorICAgIGludAkJCS8qIGZvcm1hdCAqLywKKyAgICBYSW1hZ2UqCQkvKiBkZXN0X2ltYWdlICovLAorICAgIGludAkJCS8qIGRlc3RfeCAqLywKKyAgICBpbnQJCQkvKiBkZXN0X3kgKi8KKyk7CisKKy8qCisgKiBYIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KKyAqLworZXh0ZXJuIERpc3BsYXkgKlhPcGVuRGlzcGxheSgKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGRpc3BsYXlfbmFtZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWHJtSW5pdGlhbGl6ZSgKKyAgICB2b2lkCispOworCitleHRlcm4gY2hhciAqWEZldGNoQnl0ZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50KgkJLyogbmJ5dGVzX3JldHVybiAqLworKTsKK2V4dGVybiBjaGFyICpYRmV0Y2hCdWZmZXIoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50KgkJLyogbmJ5dGVzX3JldHVybiAqLywKKyAgICBpbnQJCQkvKiBidWZmZXIgKi8KKyk7CitleHRlcm4gY2hhciAqWEdldEF0b21OYW1lKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEF0b20JCS8qIGF0b20gKi8KKyk7CitleHRlcm4gU3RhdHVzIFhHZXRBdG9tTmFtZXMoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBBdG9tKgkJLyogYXRvbXMgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgY2hhcioqCQkvKiBuYW1lc19yZXR1cm4gKi8KKyk7CitleHRlcm4gY2hhciAqWEdldERlZmF1bHQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBwcm9ncmFtICovLAorICAgIF9YY29uc3QgY2hhcioJLyogb3B0aW9uICovCispOworZXh0ZXJuIGNoYXIgKlhEaXNwbGF5TmFtZSgKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHN0cmluZyAqLworKTsKK2V4dGVybiBjaGFyICpYS2V5c3ltVG9TdHJpbmcoCisgICAgS2V5U3ltCQkvKiBrZXlzeW0gKi8KKyk7CisKK2V4dGVybiBpbnQgKCpYU3luY2hyb25pemUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQm9vbAkJLyogb25vZmYgKi8KKykpKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworZXh0ZXJuIGludCAoKlhTZXRBZnRlckZ1bmN0aW9uKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludCAoKikgKAorCSAgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLworICAgICAgICAgICAgKQkJLyogcHJvY2VkdXJlICovCispKSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKK2V4dGVybiBBdG9tIFhJbnRlcm5BdG9tKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogYXRvbV9uYW1lICovLAorICAgIEJvb2wJCS8qIG9ubHlfaWZfZXhpc3RzICovCispOworZXh0ZXJuIFN0YXR1cyBYSW50ZXJuQXRvbXMoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBjaGFyKioJCS8qIG5hbWVzICovLAorICAgIGludAkJCS8qIGNvdW50ICovLAorICAgIEJvb2wJCS8qIG9ubHlJZkV4aXN0cyAqLywKKyAgICBBdG9tKgkJLyogYXRvbXNfcmV0dXJuICovCispOworZXh0ZXJuIENvbG9ybWFwIFhDb3B5Q29sb3JtYXBBbmRGcmVlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLworKTsKK2V4dGVybiBDb2xvcm1hcCBYQ3JlYXRlQ29sb3JtYXAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFZpc3VhbCoJCS8qIHZpc3VhbCAqLywKKyAgICBpbnQJCQkvKiBhbGxvYyAqLworKTsKK2V4dGVybiBDdXJzb3IgWENyZWF0ZVBpeG1hcEN1cnNvcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBQaXhtYXAJCS8qIHNvdXJjZSAqLywKKyAgICBQaXhtYXAJCS8qIG1hc2sgKi8sCisgICAgWENvbG9yKgkJLyogZm9yZWdyb3VuZF9jb2xvciAqLywKKyAgICBYQ29sb3IqCQkvKiBiYWNrZ3JvdW5kX2NvbG9yICovLAorICAgIHVuc2lnbmVkIGludAkvKiB4ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB5ICovCispOworZXh0ZXJuIEN1cnNvciBYQ3JlYXRlR2x5cGhDdXJzb3IoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRm9udAkJLyogc291cmNlX2ZvbnQgKi8sCisgICAgRm9udAkJLyogbWFza19mb250ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBzb3VyY2VfY2hhciAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbWFza19jaGFyICovLAorICAgIFhDb2xvciBfWGNvbnN0ICoJLyogZm9yZWdyb3VuZF9jb2xvciAqLywKKyAgICBYQ29sb3IgX1hjb25zdCAqCS8qIGJhY2tncm91bmRfY29sb3IgKi8KKyk7CitleHRlcm4gQ3Vyc29yIFhDcmVhdGVGb250Q3Vyc29yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBzaGFwZSAqLworKTsKK2V4dGVybiBGb250IFhMb2FkRm9udCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIG5hbWUgKi8KKyk7CitleHRlcm4gR0MgWENyZWF0ZUdDKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogdmFsdWVtYXNrICovLAorICAgIFhHQ1ZhbHVlcyoJCS8qIHZhbHVlcyAqLworKTsKK2V4dGVybiBHQ29udGV4dCBYR0NvbnRleHRGcm9tR0MoCisgICAgR0MJCQkvKiBnYyAqLworKTsKK2V4dGVybiB2b2lkIFhGbHVzaEdDKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8KKyk7CitleHRlcm4gUGl4bWFwIFhDcmVhdGVQaXhtYXAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGRlcHRoICovCispOworZXh0ZXJuIFBpeG1hcCBYQ3JlYXRlQml0bWFwRnJvbURhdGEoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBkYXRhICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovCispOworZXh0ZXJuIFBpeG1hcCBYQ3JlYXRlUGl4bWFwRnJvbUJpdG1hcERhdGEoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgY2hhcioJCS8qIGRhdGEgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBmZyAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIGJnICovLAorICAgIHVuc2lnbmVkIGludAkvKiBkZXB0aCAqLworKTsKK2V4dGVybiBXaW5kb3cgWENyZWF0ZVNpbXBsZVdpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHBhcmVudCAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGJvcmRlcl93aWR0aCAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIGJvcmRlciAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIGJhY2tncm91bmQgKi8KKyk7CitleHRlcm4gV2luZG93IFhHZXRTZWxlY3Rpb25Pd25lcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBBdG9tCQkvKiBzZWxlY3Rpb24gKi8KKyk7CitleHRlcm4gV2luZG93IFhDcmVhdGVXaW5kb3coCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiBwYXJlbnQgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBib3JkZXJfd2lkdGggKi8sCisgICAgaW50CQkJLyogZGVwdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGNsYXNzICovLAorICAgIFZpc3VhbCoJCS8qIHZpc3VhbCAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIHZhbHVlbWFzayAqLywKKyAgICBYU2V0V2luZG93QXR0cmlidXRlcyoJLyogYXR0cmlidXRlcyAqLworKTsKK2V4dGVybiBDb2xvcm1hcCAqWExpc3RJbnN0YWxsZWRDb2xvcm1hcHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIGludCoJCS8qIG51bV9yZXR1cm4gKi8KKyk7CitleHRlcm4gY2hhciAqKlhMaXN0Rm9udHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBwYXR0ZXJuICovLAorICAgIGludAkJCS8qIG1heG5hbWVzICovLAorICAgIGludCoJCS8qIGFjdHVhbF9jb3VudF9yZXR1cm4gKi8KKyk7CitleHRlcm4gY2hhciAqKlhMaXN0Rm9udHNXaXRoSW5mbygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHBhdHRlcm4gKi8sCisgICAgaW50CQkJLyogbWF4bmFtZXMgKi8sCisgICAgaW50KgkJLyogY291bnRfcmV0dXJuICovLAorICAgIFhGb250U3RydWN0KioJLyogaW5mb19yZXR1cm4gKi8KKyk7CitleHRlcm4gY2hhciAqKlhHZXRGb250UGF0aCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQqCQkvKiBucGF0aHNfcmV0dXJuICovCispOworZXh0ZXJuIGNoYXIgKipYTGlzdEV4dGVuc2lvbnMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50KgkJLyogbmV4dGVuc2lvbnNfcmV0dXJuICovCispOworZXh0ZXJuIEF0b20gKlhMaXN0UHJvcGVydGllcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgaW50KgkJLyogbnVtX3Byb3BfcmV0dXJuICovCispOworZXh0ZXJuIFhIb3N0QWRkcmVzcyAqWExpc3RIb3N0cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQqCQkvKiBuaG9zdHNfcmV0dXJuICovLAorICAgIEJvb2wqCQkvKiBzdGF0ZV9yZXR1cm4gKi8KKyk7CitfWF9ERVBSRUNBVEVECitleHRlcm4gS2V5U3ltIFhLZXljb2RlVG9LZXlzeW0oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisjaWYgTmVlZFdpZGVQcm90b3R5cGVzCisgICAgdW5zaWduZWQgaW50CS8qIGtleWNvZGUgKi8sCisjZWxzZQorICAgIEtleUNvZGUJCS8qIGtleWNvZGUgKi8sCisjZW5kaWYKKyAgICBpbnQJCQkvKiBpbmRleCAqLworKTsKK2V4dGVybiBLZXlTeW0gWExvb2t1cEtleXN5bSgKKyAgICBYS2V5RXZlbnQqCQkvKiBrZXlfZXZlbnQgKi8sCisgICAgaW50CQkJLyogaW5kZXggKi8KKyk7CitleHRlcm4gS2V5U3ltICpYR2V0S2V5Ym9hcmRNYXBwaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorI2lmIE5lZWRXaWRlUHJvdG90eXBlcworICAgIHVuc2lnbmVkIGludAkvKiBmaXJzdF9rZXljb2RlICovLAorI2Vsc2UKKyAgICBLZXlDb2RlCQkvKiBmaXJzdF9rZXljb2RlICovLAorI2VuZGlmCisgICAgaW50CQkJLyoga2V5Y29kZV9jb3VudCAqLywKKyAgICBpbnQqCQkvKiBrZXlzeW1zX3Blcl9rZXljb2RlX3JldHVybiAqLworKTsKK2V4dGVybiBLZXlTeW0gWFN0cmluZ1RvS2V5c3ltKAorICAgIF9YY29uc3QgY2hhcioJLyogc3RyaW5nICovCispOworZXh0ZXJuIGxvbmcgWE1heFJlcXVlc3RTaXplKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworZXh0ZXJuIGxvbmcgWEV4dGVuZGVkTWF4UmVxdWVzdFNpemUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CitleHRlcm4gY2hhciAqWFJlc291cmNlTWFuYWdlclN0cmluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKK2V4dGVybiBjaGFyICpYU2NyZWVuUmVzb3VyY2VTdHJpbmcoCisJU2NyZWVuKgkJLyogc2NyZWVuICovCispOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgWERpc3BsYXlNb3Rpb25CdWZmZXJTaXplKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworZXh0ZXJuIFZpc3VhbElEIFhWaXN1YWxJREZyb21WaXN1YWwoCisgICAgVmlzdWFsKgkJLyogdmlzdWFsICovCispOworCisvKiBtdWx0aXRocmVhZCByb3V0aW5lcyAqLworCitleHRlcm4gU3RhdHVzIFhJbml0VGhyZWFkcygKKyAgICB2b2lkCispOworCitleHRlcm4gdm9pZCBYTG9ja0Rpc3BsYXkoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhVbmxvY2tEaXNwbGF5KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCisvKiByb3V0aW5lcyBmb3IgZGVhbGluZyB3aXRoIGV4dGVuc2lvbnMgKi8KKworZXh0ZXJuIFhFeHRDb2RlcyAqWEluaXRFeHRlbnNpb24oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBuYW1lICovCispOworCitleHRlcm4gWEV4dENvZGVzICpYQWRkRXh0ZW5zaW9uKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworZXh0ZXJuIFhFeHREYXRhICpYRmluZE9uRXh0ZW5zaW9uTGlzdCgKKyAgICBYRXh0RGF0YSoqCQkvKiBzdHJ1Y3R1cmUgKi8sCisgICAgaW50CQkJLyogbnVtYmVyICovCispOworZXh0ZXJuIFhFeHREYXRhICoqWEVIZWFkT2ZFeHRlbnNpb25MaXN0KAorICAgIFhFRGF0YU9iamVjdAkvKiBvYmplY3QgKi8KKyk7CisKKy8qIHRoZXNlIGFyZSByb3V0aW5lcyBmb3Igd2hpY2ggdGhlcmUgYXJlIGFsc28gbWFjcm9zICovCitleHRlcm4gV2luZG93IFhSb290V2luZG93KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KKyk7CitleHRlcm4gV2luZG93IFhEZWZhdWx0Um9vdFdpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKK2V4dGVybiBXaW5kb3cgWFJvb3RXaW5kb3dPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CitleHRlcm4gVmlzdWFsICpYRGVmYXVsdFZpc3VhbCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovCispOworZXh0ZXJuIFZpc3VhbCAqWERlZmF1bHRWaXN1YWxPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CitleHRlcm4gR0MgWERlZmF1bHRHQygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovCispOworZXh0ZXJuIEdDIFhEZWZhdWx0R0NPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBYQmxhY2tQaXhlbCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovCispOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgWFdoaXRlUGl4ZWwoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLworKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIFhBbGxQbGFuZXMoCisgICAgdm9pZAorKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIFhCbGFja1BpeGVsT2ZTY3JlZW4oCisgICAgU2NyZWVuKgkJLyogc2NyZWVuICovCispOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgWFdoaXRlUGl4ZWxPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBYTmV4dFJlcXVlc3QoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBYTGFzdEtub3duUmVxdWVzdFByb2Nlc3NlZCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKK2V4dGVybiBjaGFyICpYU2VydmVyVmVuZG9yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworZXh0ZXJuIGNoYXIgKlhEaXNwbGF5U3RyaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworZXh0ZXJuIENvbG9ybWFwIFhEZWZhdWx0Q29sb3JtYXAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLworKTsKK2V4dGVybiBDb2xvcm1hcCBYRGVmYXVsdENvbG9ybWFwT2ZTY3JlZW4oCisgICAgU2NyZWVuKgkJLyogc2NyZWVuICovCispOworZXh0ZXJuIERpc3BsYXkgKlhEaXNwbGF5T2ZTY3JlZW4oCisgICAgU2NyZWVuKgkJLyogc2NyZWVuICovCispOworZXh0ZXJuIFNjcmVlbiAqWFNjcmVlbk9mRGlzcGxheSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovCispOworZXh0ZXJuIFNjcmVlbiAqWERlZmF1bHRTY3JlZW5PZkRpc3BsYXkoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CitleHRlcm4gbG9uZyBYRXZlbnRNYXNrT2ZTY3JlZW4oCisgICAgU2NyZWVuKgkJLyogc2NyZWVuICovCispOworCitleHRlcm4gaW50IFhTY3JlZW5OdW1iZXJPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CisKK3R5cGVkZWYgaW50ICgqWEVycm9ySGFuZGxlcikgKAkgICAgLyogV0FSTklORywgdGhpcyB0eXBlIG5vdCBpbiBYbGliIHNwZWMgKi8KKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRXJyb3JFdmVudCoJLyogZXJyb3JfZXZlbnQgKi8KKyk7CisKK2V4dGVybiBYRXJyb3JIYW5kbGVyIFhTZXRFcnJvckhhbmRsZXIgKAorICAgIFhFcnJvckhhbmRsZXIJLyogaGFuZGxlciAqLworKTsKKworCit0eXBlZGVmIGludCAoKlhJT0Vycm9ySGFuZGxlcikgKCAgICAvKiBXQVJOSU5HLCB0aGlzIHR5cGUgbm90IGluIFhsaWIgc3BlYyAqLworICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gWElPRXJyb3JIYW5kbGVyIFhTZXRJT0Vycm9ySGFuZGxlciAoCisgICAgWElPRXJyb3JIYW5kbGVyCS8qIGhhbmRsZXIgKi8KKyk7CisKKworZXh0ZXJuIFhQaXhtYXBGb3JtYXRWYWx1ZXMgKlhMaXN0UGl4bWFwRm9ybWF0cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQqCQkvKiBjb3VudF9yZXR1cm4gKi8KKyk7CitleHRlcm4gaW50ICpYTGlzdERlcHRocygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovLAorICAgIGludCoJCS8qIGNvdW50X3JldHVybiAqLworKTsKKworLyogSUNDQ00gcm91dGluZXMgZm9yIHRoaW5ncyB0aGF0IGRvbid0IHJlcXVpcmUgc3BlY2lhbCBpbmNsdWRlIGZpbGVzOyAqLworLyogb3RoZXIgZGVjbGFyYXRpb25zIGFyZSBnaXZlbiBpbiBYdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworZXh0ZXJuIFN0YXR1cyBYUmVjb25maWd1cmVXTVdpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbWFzayAqLywKKyAgICBYV2luZG93Q2hhbmdlcyoJLyogY2hhbmdlcyAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYR2V0V01Qcm90b2NvbHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIEF0b20qKgkJLyogcHJvdG9jb2xzX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBjb3VudF9yZXR1cm4gKi8KKyk7CitleHRlcm4gU3RhdHVzIFhTZXRXTVByb3RvY29scygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgQXRvbSoJCS8qIHByb3RvY29scyAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLworKTsKK2V4dGVybiBTdGF0dXMgWEljb25pZnlXaW5kb3coCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KKyk7CitleHRlcm4gU3RhdHVzIFhXaXRoZHJhd1dpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLworKTsKK2V4dGVybiBTdGF0dXMgWEdldENvbW1hbmQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIGNoYXIqKioJCS8qIGFyZ3ZfcmV0dXJuICovLAorICAgIGludCoJCS8qIGFyZ2NfcmV0dXJuICovCispOworZXh0ZXJuIFN0YXR1cyBYR2V0V01Db2xvcm1hcFdpbmRvd3MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFdpbmRvdyoqCQkvKiB3aW5kb3dzX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBjb3VudF9yZXR1cm4gKi8KKyk7CitleHRlcm4gU3RhdHVzIFhTZXRXTUNvbG9ybWFwV2luZG93cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgV2luZG93KgkJLyogY29sb3JtYXBfd2luZG93cyAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLworKTsKK2V4dGVybiB2b2lkIFhGcmVlU3RyaW5nTGlzdCgKKyAgICBjaGFyKioJCS8qIGxpc3QgKi8KKyk7CitleHRlcm4gaW50IFhTZXRUcmFuc2llbnRGb3JIaW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBXaW5kb3cJCS8qIHByb3Bfd2luZG93ICovCispOworCisvKiBUaGUgZm9sbG93aW5nIGFyZSBnaXZlbiBpbiBhbHBoYWJldGljYWwgb3JkZXIgKi8KKworZXh0ZXJuIGludCBYQWN0aXZhdGVTY3JlZW5TYXZlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIGludCBYQWRkSG9zdCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYSG9zdEFkZHJlc3MqCS8qIGhvc3QgKi8KKyk7CisKK2V4dGVybiBpbnQgWEFkZEhvc3RzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhIb3N0QWRkcmVzcyoJLyogaG9zdHMgKi8sCisgICAgaW50CQkJLyogbnVtX2hvc3RzICovCispOworCitleHRlcm4gaW50IFhBZGRUb0V4dGVuc2lvbkxpc3QoCisgICAgc3RydWN0IF9YRXh0RGF0YSoqCS8qIHN0cnVjdHVyZSAqLywKKyAgICBYRXh0RGF0YSoJCS8qIGV4dF9kYXRhICovCispOworCitleHRlcm4gaW50IFhBZGRUb1NhdmVTZXQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovCispOworCitleHRlcm4gU3RhdHVzIFhBbGxvY0NvbG9yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKKyAgICBYQ29sb3IqCQkvKiBzY3JlZW5faW5fb3V0ICovCispOworCitleHRlcm4gU3RhdHVzIFhBbGxvY0NvbG9yQ2VsbHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIEJvb2wJICAgICAgICAvKiBjb250aWcgKi8sCisgICAgdW5zaWduZWQgbG9uZyoJLyogcGxhbmVfbWFza3NfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGludAkvKiBucGxhbmVzICovLAorICAgIHVuc2lnbmVkIGxvbmcqCS8qIHBpeGVsc19yZXR1cm4gKi8sCisgICAgdW5zaWduZWQgaW50IAkvKiBucGl4ZWxzICovCispOworCitleHRlcm4gU3RhdHVzIFhBbGxvY0NvbG9yUGxhbmVzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKKyAgICBCb29sCQkvKiBjb250aWcgKi8sCisgICAgdW5zaWduZWQgbG9uZyoJLyogcGl4ZWxzX3JldHVybiAqLywKKyAgICBpbnQJCQkvKiBuY29sb3JzICovLAorICAgIGludAkJCS8qIG5yZWRzICovLAorICAgIGludAkJCS8qIG5ncmVlbnMgKi8sCisgICAgaW50CQkJLyogbmJsdWVzICovLAorICAgIHVuc2lnbmVkIGxvbmcqCS8qIHJtYXNrX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBsb25nKgkvKiBnbWFza19yZXR1cm4gKi8sCisgICAgdW5zaWduZWQgbG9uZyoJLyogYm1hc2tfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhBbGxvY05hbWVkQ29sb3IoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIF9YY29uc3QgY2hhcioJLyogY29sb3JfbmFtZSAqLywKKyAgICBYQ29sb3IqCQkvKiBzY3JlZW5fZGVmX3JldHVybiAqLywKKyAgICBYQ29sb3IqCQkvKiBleGFjdF9kZWZfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhBbGxvd0V2ZW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBldmVudF9tb2RlICovLAorICAgIFRpbWUJCS8qIHRpbWUgKi8KKyk7CisKK2V4dGVybiBpbnQgWEF1dG9SZXBlYXRPZmYoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKK2V4dGVybiBpbnQgWEF1dG9SZXBlYXRPbigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIGludCBYQmVsbCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBwZXJjZW50ICovCispOworCitleHRlcm4gaW50IFhCaXRtYXBCaXRPcmRlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIGludCBYQml0bWFwUGFkKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhCaXRtYXBVbml0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhDZWxsc09mU2NyZWVuKAorICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLworKTsKKworZXh0ZXJuIGludCBYQ2hhbmdlQWN0aXZlUG9pbnRlckdyYWIoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGV2ZW50X21hc2sgKi8sCisgICAgQ3Vyc29yCQkvKiBjdXJzb3IgKi8sCisgICAgVGltZQkJLyogdGltZSAqLworKTsKKworZXh0ZXJuIGludCBYQ2hhbmdlR0MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIHZhbHVlbWFzayAqLywKKyAgICBYR0NWYWx1ZXMqCQkvKiB2YWx1ZXMgKi8KKyk7CisKK2V4dGVybiBpbnQgWENoYW5nZUtleWJvYXJkQ29udHJvbCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIHZhbHVlX21hc2sgKi8sCisgICAgWEtleWJvYXJkQ29udHJvbCoJLyogdmFsdWVzICovCispOworCitleHRlcm4gaW50IFhDaGFuZ2VLZXlib2FyZE1hcHBpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogZmlyc3Rfa2V5Y29kZSAqLywKKyAgICBpbnQJCQkvKiBrZXlzeW1zX3Blcl9rZXljb2RlICovLAorICAgIEtleVN5bSoJCS8qIGtleXN5bXMgKi8sCisgICAgaW50CQkJLyogbnVtX2NvZGVzICovCispOworCitleHRlcm4gaW50IFhDaGFuZ2VQb2ludGVyQ29udHJvbCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBCb29sCQkvKiBkb19hY2NlbCAqLywKKyAgICBCb29sCQkvKiBkb190aHJlc2hvbGQgKi8sCisgICAgaW50CQkJLyogYWNjZWxfbnVtZXJhdG9yICovLAorICAgIGludAkJCS8qIGFjY2VsX2Rlbm9taW5hdG9yICovLAorICAgIGludAkJCS8qIHRocmVzaG9sZCAqLworKTsKKworZXh0ZXJuIGludCBYQ2hhbmdlUHJvcGVydHkoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIEF0b20JCS8qIHByb3BlcnR5ICovLAorICAgIEF0b20JCS8qIHR5cGUgKi8sCisgICAgaW50CQkJLyogZm9ybWF0ICovLAorICAgIGludAkJCS8qIG1vZGUgKi8sCisgICAgX1hjb25zdCB1bnNpZ25lZCBjaGFyKgkvKiBkYXRhICovLAorICAgIGludAkJCS8qIG5lbGVtZW50cyAqLworKTsKKworZXh0ZXJuIGludCBYQ2hhbmdlU2F2ZVNldCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgaW50CQkJLyogY2hhbmdlX21vZGUgKi8KKyk7CisKK2V4dGVybiBpbnQgWENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogdmFsdWVtYXNrICovLAorICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzKiAvKiBhdHRyaWJ1dGVzICovCispOworCitleHRlcm4gQm9vbCBYQ2hlY2tJZkV2ZW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhFdmVudCoJCS8qIGV2ZW50X3JldHVybiAqLywKKyAgICBCb29sICgqKSAoCisJICAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgIFhFdmVudCoJCQkvKiBldmVudCAqLywKKyAgICAgICAgICAgICAgIFhQb2ludGVyCQkJLyogYXJnICovCisgICAgICAgICAgICAgKQkJLyogcHJlZGljYXRlICovLAorICAgIFhQb2ludGVyCQkvKiBhcmcgKi8KKyk7CisKK2V4dGVybiBCb29sIFhDaGVja01hc2tFdmVudCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBsb25nCQkvKiBldmVudF9tYXNrICovLAorICAgIFhFdmVudCoJCS8qIGV2ZW50X3JldHVybiAqLworKTsKKworZXh0ZXJuIEJvb2wgWENoZWNrVHlwZWRFdmVudCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBldmVudF90eXBlICovLAorICAgIFhFdmVudCoJCS8qIGV2ZW50X3JldHVybiAqLworKTsKKworZXh0ZXJuIEJvb2wgWENoZWNrVHlwZWRXaW5kb3dFdmVudCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgaW50CQkJLyogZXZlbnRfdHlwZSAqLywKKyAgICBYRXZlbnQqCQkvKiBldmVudF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBCb29sIFhDaGVja1dpbmRvd0V2ZW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBsb25nCQkvKiBldmVudF9tYXNrICovLAorICAgIFhFdmVudCoJCS8qIGV2ZW50X3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYQ2lyY3VsYXRlU3Vid2luZG93cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgaW50CQkJLyogZGlyZWN0aW9uICovCispOworCitleHRlcm4gaW50IFhDaXJjdWxhdGVTdWJ3aW5kb3dzRG93bigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8KKyk7CisKK2V4dGVybiBpbnQgWENpcmN1bGF0ZVN1YndpbmRvd3NVcCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8KKyk7CisKK2V4dGVybiBpbnQgWENsZWFyQXJlYSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAorICAgIEJvb2wJCS8qIGV4cG9zdXJlcyAqLworKTsKKworZXh0ZXJuIGludCBYQ2xlYXJXaW5kb3coCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovCispOworCitleHRlcm4gaW50IFhDbG9zZURpc3BsYXkoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKK2V4dGVybiBpbnQgWENvbmZpZ3VyZVdpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHZhbHVlX21hc2sgKi8sCisgICAgWFdpbmRvd0NoYW5nZXMqCS8qIHZhbHVlcyAqLworKTsKKworZXh0ZXJuIGludCBYQ29ubmVjdGlvbk51bWJlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIGludCBYQ29udmVydFNlbGVjdGlvbigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBBdG9tCQkvKiBzZWxlY3Rpb24gKi8sCisgICAgQXRvbSAJCS8qIHRhcmdldCAqLywKKyAgICBBdG9tCQkvKiBwcm9wZXJ0eSAqLywKKyAgICBXaW5kb3cJCS8qIHJlcXVlc3RvciAqLywKKyAgICBUaW1lCQkvKiB0aW1lICovCispOworCitleHRlcm4gaW50IFhDb3B5QXJlYSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogc3JjICovLAorICAgIERyYXdhYmxlCQkvKiBkZXN0ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogc3JjX3ggKi8sCisgICAgaW50CQkJLyogc3JjX3kgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCisgICAgaW50CQkJLyogZGVzdF94ICovLAorICAgIGludAkJCS8qIGRlc3RfeSAqLworKTsKKworZXh0ZXJuIGludCBYQ29weUdDKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogc3JjICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogdmFsdWVtYXNrICovLAorICAgIEdDCQkJLyogZGVzdCAqLworKTsKKworZXh0ZXJuIGludCBYQ29weVBsYW5lKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBzcmMgKi8sCisgICAgRHJhd2FibGUJCS8qIGRlc3QgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiBzcmNfeCAqLywKKyAgICBpbnQJCQkvKiBzcmNfeSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICBpbnQJCQkvKiBkZXN0X3ggKi8sCisgICAgaW50CQkJLyogZGVzdF95ICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogcGxhbmUgKi8KKyk7CisKK2V4dGVybiBpbnQgWERlZmF1bHREZXB0aCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovCispOworCitleHRlcm4gaW50IFhEZWZhdWx0RGVwdGhPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CisKK2V4dGVybiBpbnQgWERlZmF1bHRTY3JlZW4oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKK2V4dGVybiBpbnQgWERlZmluZUN1cnNvcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgQ3Vyc29yCQkvKiBjdXJzb3IgKi8KKyk7CisKK2V4dGVybiBpbnQgWERlbGV0ZVByb3BlcnR5KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBBdG9tCQkvKiBwcm9wZXJ0eSAqLworKTsKKworZXh0ZXJuIGludCBYRGVzdHJveVdpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8KKyk7CisKK2V4dGVybiBpbnQgWERlc3Ryb3lTdWJ3aW5kb3dzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLworKTsKKworZXh0ZXJuIGludCBYRG9lc0JhY2tpbmdTdG9yZSgKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CisKK2V4dGVybiBCb29sIFhEb2VzU2F2ZVVuZGVycygKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CisKK2V4dGVybiBpbnQgWERpc2FibGVBY2Nlc3NDb250cm9sKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCisKK2V4dGVybiBpbnQgWERpc3BsYXlDZWxscygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovCispOworCitleHRlcm4gaW50IFhEaXNwbGF5SGVpZ2h0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KKyk7CisKK2V4dGVybiBpbnQgWERpc3BsYXlIZWlnaHRNTSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovCispOworCitleHRlcm4gaW50IFhEaXNwbGF5S2V5Y29kZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50KgkJLyogbWluX2tleWNvZGVzX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBtYXhfa2V5Y29kZXNfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhEaXNwbGF5UGxhbmVzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KKyk7CisKK2V4dGVybiBpbnQgWERpc3BsYXlXaWR0aCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovCispOworCitleHRlcm4gaW50IFhEaXNwbGF5V2lkdGhNTSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovCispOworCitleHRlcm4gaW50IFhEcmF3QXJjKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAorICAgIGludAkJCS8qIGFuZ2xlMSAqLywKKyAgICBpbnQJCQkvKiBhbmdsZTIgKi8KKyk7CisKK2V4dGVybiBpbnQgWERyYXdBcmNzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgWEFyYyoJCS8qIGFyY3MgKi8sCisgICAgaW50CQkJLyogbmFyY3MgKi8KKyk7CisKK2V4dGVybiBpbnQgWERyYXdJbWFnZVN0cmluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHN0cmluZyAqLywKKyAgICBpbnQJCQkvKiBsZW5ndGggKi8KKyk7CisKK2V4dGVybiBpbnQgWERyYXdJbWFnZVN0cmluZzE2KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIF9YY29uc3QgWENoYXIyYioJLyogc3RyaW5nICovLAorICAgIGludAkJCS8qIGxlbmd0aCAqLworKTsKKworZXh0ZXJuIGludCBYRHJhd0xpbmUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4MSAqLywKKyAgICBpbnQJCQkvKiB5MSAqLywKKyAgICBpbnQJCQkvKiB4MiAqLywKKyAgICBpbnQJCQkvKiB5MiAqLworKTsKKworZXh0ZXJuIGludCBYRHJhd0xpbmVzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgWFBvaW50KgkJLyogcG9pbnRzICovLAorICAgIGludAkJCS8qIG5wb2ludHMgKi8sCisgICAgaW50CQkJLyogbW9kZSAqLworKTsKKworZXh0ZXJuIGludCBYRHJhd1BvaW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovCispOworCitleHRlcm4gaW50IFhEcmF3UG9pbnRzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgWFBvaW50KgkJLyogcG9pbnRzICovLAorICAgIGludAkJCS8qIG5wb2ludHMgKi8sCisgICAgaW50CQkJLyogbW9kZSAqLworKTsKKworZXh0ZXJuIGludCBYRHJhd1JlY3RhbmdsZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLworKTsKKworZXh0ZXJuIGludCBYRHJhd1JlY3RhbmdsZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogcmVjdGFuZ2xlcyAqLywKKyAgICBpbnQJCQkvKiBucmVjdGFuZ2xlcyAqLworKTsKKworZXh0ZXJuIGludCBYRHJhd1NlZ21lbnRzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgWFNlZ21lbnQqCQkvKiBzZWdtZW50cyAqLywKKyAgICBpbnQJCQkvKiBuc2VnbWVudHMgKi8KKyk7CisKK2V4dGVybiBpbnQgWERyYXdTdHJpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBzdHJpbmcgKi8sCisgICAgaW50CQkJLyogbGVuZ3RoICovCispOworCitleHRlcm4gaW50IFhEcmF3U3RyaW5nMTYoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgX1hjb25zdCBYQ2hhcjJiKgkvKiBzdHJpbmcgKi8sCisgICAgaW50CQkJLyogbGVuZ3RoICovCispOworCitleHRlcm4gaW50IFhEcmF3VGV4dCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICBYVGV4dEl0ZW0qCQkvKiBpdGVtcyAqLywKKyAgICBpbnQJCQkvKiBuaXRlbXMgKi8KKyk7CisKK2V4dGVybiBpbnQgWERyYXdUZXh0MTYoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgWFRleHRJdGVtMTYqCS8qIGl0ZW1zICovLAorICAgIGludAkJCS8qIG5pdGVtcyAqLworKTsKKworZXh0ZXJuIGludCBYRW5hYmxlQWNjZXNzQ29udHJvbCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIGludCBYRXZlbnRzUXVldWVkKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIG1vZGUgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEZldGNoTmFtZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgY2hhcioqCQkvKiB3aW5kb3dfbmFtZV9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWEZpbGxBcmMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCisgICAgaW50CQkJLyogYW5nbGUxICovLAorICAgIGludAkJCS8qIGFuZ2xlMiAqLworKTsKKworZXh0ZXJuIGludCBYRmlsbEFyY3MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBYQXJjKgkJLyogYXJjcyAqLywKKyAgICBpbnQJCQkvKiBuYXJjcyAqLworKTsKKworZXh0ZXJuIGludCBYRmlsbFBvbHlnb24oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBYUG9pbnQqCQkvKiBwb2ludHMgKi8sCisgICAgaW50CQkJLyogbnBvaW50cyAqLywKKyAgICBpbnQJCQkvKiBzaGFwZSAqLywKKyAgICBpbnQJCQkvKiBtb2RlICovCispOworCitleHRlcm4gaW50IFhGaWxsUmVjdGFuZ2xlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovCispOworCitleHRlcm4gaW50IFhGaWxsUmVjdGFuZ2xlcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIFhSZWN0YW5nbGUqCQkvKiByZWN0YW5nbGVzICovLAorICAgIGludAkJCS8qIG5yZWN0YW5nbGVzICovCispOworCitleHRlcm4gaW50IFhGbHVzaCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIGludCBYRm9yY2VTY3JlZW5TYXZlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBtb2RlICovCispOworCitleHRlcm4gaW50IFhGcmVlKAorICAgIHZvaWQqCQkvKiBkYXRhICovCispOworCitleHRlcm4gaW50IFhGcmVlQ29sb3JtYXAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovCispOworCitleHRlcm4gaW50IFhGcmVlQ29sb3JzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKKyAgICB1bnNpZ25lZCBsb25nKgkvKiBwaXhlbHMgKi8sCisgICAgaW50CQkJLyogbnBpeGVscyAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIHBsYW5lcyAqLworKTsKKworZXh0ZXJuIGludCBYRnJlZUN1cnNvcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBDdXJzb3IJCS8qIGN1cnNvciAqLworKTsKKworZXh0ZXJuIGludCBYRnJlZUV4dGVuc2lvbkxpc3QoCisgICAgY2hhcioqCQkvKiBsaXN0ICovCispOworCitleHRlcm4gaW50IFhGcmVlRm9udCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRm9udFN0cnVjdCoJLyogZm9udF9zdHJ1Y3QgKi8KKyk7CisKK2V4dGVybiBpbnQgWEZyZWVGb250SW5mbygKKyAgICBjaGFyKioJCS8qIG5hbWVzICovLAorICAgIFhGb250U3RydWN0KgkvKiBmcmVlX2luZm8gKi8sCisgICAgaW50CQkJLyogYWN0dWFsX2NvdW50ICovCispOworCitleHRlcm4gaW50IFhGcmVlRm9udE5hbWVzKAorICAgIGNoYXIqKgkJLyogbGlzdCAqLworKTsKKworZXh0ZXJuIGludCBYRnJlZUZvbnRQYXRoKAorICAgIGNoYXIqKgkJLyogbGlzdCAqLworKTsKKworZXh0ZXJuIGludCBYRnJlZUdDKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8KKyk7CisKK2V4dGVybiBpbnQgWEZyZWVNb2RpZmllcm1hcCgKKyAgICBYTW9kaWZpZXJLZXltYXAqCS8qIG1vZG1hcCAqLworKTsKKworZXh0ZXJuIGludCBYRnJlZVBpeG1hcCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBQaXhtYXAJCS8qIHBpeG1hcCAqLworKTsKKworZXh0ZXJuIGludCBYR2VvbWV0cnkoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogc2NyZWVuICovLAorICAgIF9YY29uc3QgY2hhcioJLyogcG9zaXRpb24gKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBkZWZhdWx0X3Bvc2l0aW9uICovLAorICAgIHVuc2lnbmVkIGludAkvKiBid2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGZ3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogZmhlaWdodCAqLywKKyAgICBpbnQJCQkvKiB4YWRkZXIgKi8sCisgICAgaW50CQkJLyogeWFkZGVyICovLAorICAgIGludCoJCS8qIHhfcmV0dXJuICovLAorICAgIGludCoJCS8qIHlfcmV0dXJuICovLAorICAgIGludCoJCS8qIHdpZHRoX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBoZWlnaHRfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhHZXRFcnJvckRhdGFiYXNlVGV4dCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIG5hbWUgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBtZXNzYWdlICovLAorICAgIF9YY29uc3QgY2hhcioJLyogZGVmYXVsdF9zdHJpbmcgKi8sCisgICAgY2hhcioJCS8qIGJ1ZmZlcl9yZXR1cm4gKi8sCisgICAgaW50CQkJLyogbGVuZ3RoICovCispOworCitleHRlcm4gaW50IFhHZXRFcnJvclRleHQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogY29kZSAqLywKKyAgICBjaGFyKgkJLyogYnVmZmVyX3JldHVybiAqLywKKyAgICBpbnQJCQkvKiBsZW5ndGggKi8KKyk7CisKK2V4dGVybiBCb29sIFhHZXRGb250UHJvcGVydHkoCisgICAgWEZvbnRTdHJ1Y3QqCS8qIGZvbnRfc3RydWN0ICovLAorICAgIEF0b20JCS8qIGF0b20gKi8sCisgICAgdW5zaWduZWQgbG9uZyoJLyogdmFsdWVfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhHZXRHQ1ZhbHVlcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogdmFsdWVtYXNrICovLAorICAgIFhHQ1ZhbHVlcyoJCS8qIHZhbHVlc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldEdlb21ldHJ5KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIFdpbmRvdyoJCS8qIHJvb3RfcmV0dXJuICovLAorICAgIGludCoJCS8qIHhfcmV0dXJuICovLAorICAgIGludCoJCS8qIHlfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGludCoJLyogd2lkdGhfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGludCoJLyogaGVpZ2h0X3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIGJvcmRlcl93aWR0aF9yZXR1cm4gKi8sCisgICAgdW5zaWduZWQgaW50KgkvKiBkZXB0aF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldEljb25OYW1lKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBjaGFyKioJCS8qIGljb25fbmFtZV9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWEdldElucHV0Rm9jdXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93KgkJLyogZm9jdXNfcmV0dXJuICovLAorICAgIGludCoJCS8qIHJldmVydF90b19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWEdldEtleWJvYXJkQ29udHJvbCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYS2V5Ym9hcmRTdGF0ZSoJLyogdmFsdWVzX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYR2V0UG9pbnRlckNvbnRyb2woCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50KgkJLyogYWNjZWxfbnVtZXJhdG9yX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBhY2NlbF9kZW5vbWluYXRvcl9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogdGhyZXNob2xkX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYR2V0UG9pbnRlck1hcHBpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgdW5zaWduZWQgY2hhcioJLyogbWFwX3JldHVybiAqLywKKyAgICBpbnQJCQkvKiBubWFwICovCispOworCitleHRlcm4gaW50IFhHZXRTY3JlZW5TYXZlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQqCQkvKiB0aW1lb3V0X3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBpbnRlcnZhbF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogcHJlZmVyX2JsYW5raW5nX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBhbGxvd19leHBvc3VyZXNfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhHZXRUcmFuc2llbnRGb3JIaW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBXaW5kb3cqCQkvKiBwcm9wX3dpbmRvd19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWEdldFdpbmRvd1Byb3BlcnR5KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBBdG9tCQkvKiBwcm9wZXJ0eSAqLywKKyAgICBsb25nCQkvKiBsb25nX29mZnNldCAqLywKKyAgICBsb25nCQkvKiBsb25nX2xlbmd0aCAqLywKKyAgICBCb29sCQkvKiBkZWxldGUgKi8sCisgICAgQXRvbQkJLyogcmVxX3R5cGUgKi8sCisgICAgQXRvbSoJCS8qIGFjdHVhbF90eXBlX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBhY3R1YWxfZm9ybWF0X3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBsb25nKgkvKiBuaXRlbXNfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGxvbmcqCS8qIGJ5dGVzX2FmdGVyX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBjaGFyKioJLyogcHJvcF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldFdpbmRvd0F0dHJpYnV0ZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhXaW5kb3dBdHRyaWJ1dGVzKgkvKiB3aW5kb3dfYXR0cmlidXRlc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWEdyYWJCdXR0b24oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGJ1dHRvbiAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbW9kaWZpZXJzICovLAorICAgIFdpbmRvdwkJLyogZ3JhYl93aW5kb3cgKi8sCisgICAgQm9vbAkJLyogb3duZXJfZXZlbnRzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBldmVudF9tYXNrICovLAorICAgIGludAkJCS8qIHBvaW50ZXJfbW9kZSAqLywKKyAgICBpbnQJCQkvKiBrZXlib2FyZF9tb2RlICovLAorICAgIFdpbmRvdwkJLyogY29uZmluZV90byAqLywKKyAgICBDdXJzb3IJCS8qIGN1cnNvciAqLworKTsKKworZXh0ZXJuIGludCBYR3JhYktleSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBrZXljb2RlICovLAorICAgIHVuc2lnbmVkIGludAkvKiBtb2RpZmllcnMgKi8sCisgICAgV2luZG93CQkvKiBncmFiX3dpbmRvdyAqLywKKyAgICBCb29sCQkvKiBvd25lcl9ldmVudHMgKi8sCisgICAgaW50CQkJLyogcG9pbnRlcl9tb2RlICovLAorICAgIGludAkJCS8qIGtleWJvYXJkX21vZGUgKi8KKyk7CisKK2V4dGVybiBpbnQgWEdyYWJLZXlib2FyZCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIGdyYWJfd2luZG93ICovLAorICAgIEJvb2wJCS8qIG93bmVyX2V2ZW50cyAqLywKKyAgICBpbnQJCQkvKiBwb2ludGVyX21vZGUgKi8sCisgICAgaW50CQkJLyoga2V5Ym9hcmRfbW9kZSAqLywKKyAgICBUaW1lCQkvKiB0aW1lICovCispOworCitleHRlcm4gaW50IFhHcmFiUG9pbnRlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIGdyYWJfd2luZG93ICovLAorICAgIEJvb2wJCS8qIG93bmVyX2V2ZW50cyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogZXZlbnRfbWFzayAqLywKKyAgICBpbnQJCQkvKiBwb2ludGVyX21vZGUgKi8sCisgICAgaW50CQkJLyoga2V5Ym9hcmRfbW9kZSAqLywKKyAgICBXaW5kb3cJCS8qIGNvbmZpbmVfdG8gKi8sCisgICAgQ3Vyc29yCQkvKiBjdXJzb3IgKi8sCisgICAgVGltZQkJLyogdGltZSAqLworKTsKKworZXh0ZXJuIGludCBYR3JhYlNlcnZlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIGludCBYSGVpZ2h0TU1PZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CisKK2V4dGVybiBpbnQgWEhlaWdodE9mU2NyZWVuKAorICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLworKTsKKworZXh0ZXJuIGludCBYSWZFdmVudCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRXZlbnQqCQkvKiBldmVudF9yZXR1cm4gKi8sCisgICAgQm9vbCAoKikgKAorCSAgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgICBYRXZlbnQqCQkJLyogZXZlbnQgKi8sCisgICAgICAgICAgICAgICBYUG9pbnRlcgkJCS8qIGFyZyAqLworICAgICAgICAgICAgICkJCS8qIHByZWRpY2F0ZSAqLywKKyAgICBYUG9pbnRlcgkJLyogYXJnICovCispOworCitleHRlcm4gaW50IFhJbWFnZUJ5dGVPcmRlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIGludCBYSW5zdGFsbENvbG9ybWFwKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLworKTsKKworZXh0ZXJuIEtleUNvZGUgWEtleXN5bVRvS2V5Y29kZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBLZXlTeW0JCS8qIGtleXN5bSAqLworKTsKKworZXh0ZXJuIGludCBYS2lsbENsaWVudCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYSUQJCQkvKiByZXNvdXJjZSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYTG9va3VwQ29sb3IoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIF9YY29uc3QgY2hhcioJLyogY29sb3JfbmFtZSAqLywKKyAgICBYQ29sb3IqCQkvKiBleGFjdF9kZWZfcmV0dXJuICovLAorICAgIFhDb2xvcioJCS8qIHNjcmVlbl9kZWZfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhMb3dlcldpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8KKyk7CisKK2V4dGVybiBpbnQgWE1hcFJhaXNlZCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8KKyk7CisKK2V4dGVybiBpbnQgWE1hcFN1YndpbmRvd3MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovCispOworCitleHRlcm4gaW50IFhNYXBXaW5kb3coCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovCispOworCitleHRlcm4gaW50IFhNYXNrRXZlbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgbG9uZwkJLyogZXZlbnRfbWFzayAqLywKKyAgICBYRXZlbnQqCQkvKiBldmVudF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWE1heENtYXBzT2ZTY3JlZW4oCisgICAgU2NyZWVuKgkJLyogc2NyZWVuICovCispOworCitleHRlcm4gaW50IFhNaW5DbWFwc09mU2NyZWVuKAorICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLworKTsKKworZXh0ZXJuIGludCBYTW92ZVJlc2l6ZVdpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovCispOworCitleHRlcm4gaW50IFhNb3ZlV2luZG93KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8KKyk7CisKK2V4dGVybiBpbnQgWE5leHRFdmVudCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRXZlbnQqCQkvKiBldmVudF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWE5vT3AoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFBhcnNlQ29sb3IoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIF9YY29uc3QgY2hhcioJLyogc3BlYyAqLywKKyAgICBYQ29sb3IqCQkvKiBleGFjdF9kZWZfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhQYXJzZUdlb21ldHJ5KAorICAgIF9YY29uc3QgY2hhcioJLyogcGFyc2VzdHJpbmcgKi8sCisgICAgaW50KgkJLyogeF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogeV9yZXR1cm4gKi8sCisgICAgdW5zaWduZWQgaW50KgkvKiB3aWR0aF9yZXR1cm4gKi8sCisgICAgdW5zaWduZWQgaW50KgkvKiBoZWlnaHRfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhQZWVrRXZlbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWEV2ZW50KgkJLyogZXZlbnRfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhQZWVrSWZFdmVudCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRXZlbnQqCQkvKiBldmVudF9yZXR1cm4gKi8sCisgICAgQm9vbCAoKikgKAorCSAgICAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgIFhFdmVudCoJCS8qIGV2ZW50ICovLAorICAgICAgICAgICAgICAgWFBvaW50ZXIJCS8qIGFyZyAqLworICAgICAgICAgICAgICkJCS8qIHByZWRpY2F0ZSAqLywKKyAgICBYUG9pbnRlcgkJLyogYXJnICovCispOworCitleHRlcm4gaW50IFhQZW5kaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhQbGFuZXNPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFByb3RvY29sUmV2aXNpb24oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKK2V4dGVybiBpbnQgWFByb3RvY29sVmVyc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworCitleHRlcm4gaW50IFhQdXRCYWNrRXZlbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWEV2ZW50KgkJLyogZXZlbnQgKi8KKyk7CisKK2V4dGVybiBpbnQgWFB1dEltYWdlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgWEltYWdlKgkJLyogaW1hZ2UgKi8sCisgICAgaW50CQkJLyogc3JjX3ggKi8sCisgICAgaW50CQkJLyogc3JjX3kgKi8sCisgICAgaW50CQkJLyogZGVzdF94ICovLAorICAgIGludAkJCS8qIGRlc3RfeSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLworKTsKKworZXh0ZXJuIGludCBYUUxlbmd0aCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYUXVlcnlCZXN0Q3Vyc29yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIHVuc2lnbmVkIGludCAgICAgICAgLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIHdpZHRoX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIGhlaWdodF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFF1ZXJ5QmVzdFNpemUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogY2xhc3MgKi8sCisgICAgRHJhd2FibGUJCS8qIHdoaWNoX3NjcmVlbiAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIHdpZHRoX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIGhlaWdodF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFF1ZXJ5QmVzdFN0aXBwbGUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIHdoaWNoX3NjcmVlbiAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIHdpZHRoX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIGhlaWdodF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFF1ZXJ5QmVzdFRpbGUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIHdoaWNoX3NjcmVlbiAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIHdpZHRoX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIGhlaWdodF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFF1ZXJ5Q29sb3IoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIFhDb2xvcioJCS8qIGRlZl9pbl9vdXQgKi8KKyk7CisKK2V4dGVybiBpbnQgWFF1ZXJ5Q29sb3JzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKKyAgICBYQ29sb3IqCQkvKiBkZWZzX2luX291dCAqLywKKyAgICBpbnQJCQkvKiBuY29sb3JzICovCispOworCitleHRlcm4gQm9vbCBYUXVlcnlFeHRlbnNpb24oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBuYW1lICovLAorICAgIGludCoJCS8qIG1ham9yX29wY29kZV9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogZmlyc3RfZXZlbnRfcmV0dXJuICovLAorICAgIGludCoJCS8qIGZpcnN0X2Vycm9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYUXVlcnlLZXltYXAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgY2hhciBbMzJdCQkvKiBrZXlzX3JldHVybiAqLworKTsKKworZXh0ZXJuIEJvb2wgWFF1ZXJ5UG9pbnRlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgV2luZG93KgkJLyogcm9vdF9yZXR1cm4gKi8sCisgICAgV2luZG93KgkJLyogY2hpbGRfcmV0dXJuICovLAorICAgIGludCoJCS8qIHJvb3RfeF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogcm9vdF95X3JldHVybiAqLywKKyAgICBpbnQqCQkvKiB3aW5feF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogd2luX3lfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGludCogICAgICAgLyogbWFza19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFF1ZXJ5VGV4dEV4dGVudHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWElECQkJLyogZm9udF9JRCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHN0cmluZyAqLywKKyAgICBpbnQJCQkvKiBuY2hhcnMgKi8sCisgICAgaW50KgkJLyogZGlyZWN0aW9uX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBmb250X2FzY2VudF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogZm9udF9kZXNjZW50X3JldHVybiAqLywKKyAgICBYQ2hhclN0cnVjdCoJLyogb3ZlcmFsbF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFF1ZXJ5VGV4dEV4dGVudHMxNigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYSUQJCQkvKiBmb250X0lEICovLAorICAgIF9YY29uc3QgWENoYXIyYioJLyogc3RyaW5nICovLAorICAgIGludAkJCS8qIG5jaGFycyAqLywKKyAgICBpbnQqCQkvKiBkaXJlY3Rpb25fcmV0dXJuICovLAorICAgIGludCoJCS8qIGZvbnRfYXNjZW50X3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBmb250X2Rlc2NlbnRfcmV0dXJuICovLAorICAgIFhDaGFyU3RydWN0KgkvKiBvdmVyYWxsX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYUXVlcnlUcmVlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBXaW5kb3cqCQkvKiByb290X3JldHVybiAqLywKKyAgICBXaW5kb3cqCQkvKiBwYXJlbnRfcmV0dXJuICovLAorICAgIFdpbmRvdyoqCQkvKiBjaGlsZHJlbl9yZXR1cm4gKi8sCisgICAgdW5zaWduZWQgaW50KgkvKiBuY2hpbGRyZW5fcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhSYWlzZVdpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8KKyk7CisKK2V4dGVybiBpbnQgWFJlYWRCaXRtYXBGaWxlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlIAkJLyogZCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGZpbGVuYW1lICovLAorICAgIHVuc2lnbmVkIGludCoJLyogd2lkdGhfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGludCoJLyogaGVpZ2h0X3JldHVybiAqLywKKyAgICBQaXhtYXAqCQkvKiBiaXRtYXBfcmV0dXJuICovLAorICAgIGludCoJCS8qIHhfaG90X3JldHVybiAqLywKKyAgICBpbnQqCQkvKiB5X2hvdF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFJlYWRCaXRtYXBGaWxlRGF0YSgKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGZpbGVuYW1lICovLAorICAgIHVuc2lnbmVkIGludCoJLyogd2lkdGhfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGludCoJLyogaGVpZ2h0X3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBjaGFyKioJLyogZGF0YV9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogeF9ob3RfcmV0dXJuICovLAorICAgIGludCoJCS8qIHlfaG90X3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYUmViaW5kS2V5c3ltKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEtleVN5bQkJLyoga2V5c3ltICovLAorICAgIEtleVN5bSoJCS8qIGxpc3QgKi8sCisgICAgaW50CQkJLyogbW9kX2NvdW50ICovLAorICAgIF9YY29uc3QgdW5zaWduZWQgY2hhcioJLyogc3RyaW5nICovLAorICAgIGludAkJCS8qIGJ5dGVzX3N0cmluZyAqLworKTsKKworZXh0ZXJuIGludCBYUmVjb2xvckN1cnNvcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBDdXJzb3IJCS8qIGN1cnNvciAqLywKKyAgICBYQ29sb3IqCQkvKiBmb3JlZ3JvdW5kX2NvbG9yICovLAorICAgIFhDb2xvcioJCS8qIGJhY2tncm91bmRfY29sb3IgKi8KKyk7CisKK2V4dGVybiBpbnQgWFJlZnJlc2hLZXlib2FyZE1hcHBpbmcoCisgICAgWE1hcHBpbmdFdmVudCoJLyogZXZlbnRfbWFwICovCispOworCitleHRlcm4gaW50IFhSZW1vdmVGcm9tU2F2ZVNldCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8KKyk7CisKK2V4dGVybiBpbnQgWFJlbW92ZUhvc3QoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWEhvc3RBZGRyZXNzKgkvKiBob3N0ICovCispOworCitleHRlcm4gaW50IFhSZW1vdmVIb3N0cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYSG9zdEFkZHJlc3MqCS8qIGhvc3RzICovLAorICAgIGludAkJCS8qIG51bV9ob3N0cyAqLworKTsKKworZXh0ZXJuIGludCBYUmVwYXJlbnRXaW5kb3coCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFdpbmRvdwkJLyogcGFyZW50ICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLworKTsKKworZXh0ZXJuIGludCBYUmVzZXRTY3JlZW5TYXZlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIGludCBYUmVzaXplV2luZG93KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLworKTsKKworZXh0ZXJuIGludCBYUmVzdGFja1dpbmRvd3MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93KgkJLyogd2luZG93cyAqLywKKyAgICBpbnQJCQkvKiBud2luZG93cyAqLworKTsKKworZXh0ZXJuIGludCBYUm90YXRlQnVmZmVycygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiByb3RhdGUgKi8KKyk7CisKK2V4dGVybiBpbnQgWFJvdGF0ZVdpbmRvd1Byb3BlcnRpZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIEF0b20qCQkvKiBwcm9wZXJ0aWVzICovLAorICAgIGludAkJCS8qIG51bV9wcm9wICovLAorICAgIGludAkJCS8qIG5wb3NpdGlvbnMgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNjcmVlbkNvdW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhTZWxlY3RJbnB1dCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgbG9uZwkJLyogZXZlbnRfbWFzayAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYU2VuZEV2ZW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBCb29sCQkvKiBwcm9wYWdhdGUgKi8sCisgICAgbG9uZwkJLyogZXZlbnRfbWFzayAqLywKKyAgICBYRXZlbnQqCQkvKiBldmVudF9zZW5kICovCispOworCitleHRlcm4gaW50IFhTZXRBY2Nlc3NDb250cm9sKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIG1vZGUgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldEFyY01vZGUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiBhcmNfbW9kZSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0QmFja2dyb3VuZCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogYmFja2dyb3VuZCAqLworKTsKKworZXh0ZXJuIGludCBYU2V0Q2xpcE1hc2soCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBQaXhtYXAJCS8qIHBpeG1hcCAqLworKTsKKworZXh0ZXJuIGludCBYU2V0Q2xpcE9yaWdpbigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIGNsaXBfeF9vcmlnaW4gKi8sCisgICAgaW50CQkJLyogY2xpcF95X29yaWdpbiAqLworKTsKKworZXh0ZXJuIGludCBYU2V0Q2xpcFJlY3RhbmdsZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiBjbGlwX3hfb3JpZ2luICovLAorICAgIGludAkJCS8qIGNsaXBfeV9vcmlnaW4gKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIHJlY3RhbmdsZXMgKi8sCisgICAgaW50CQkJLyogbiAqLywKKyAgICBpbnQJCQkvKiBvcmRlcmluZyAqLworKTsKKworZXh0ZXJuIGludCBYU2V0Q2xvc2VEb3duTW9kZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBjbG9zZV9tb2RlICovCispOworCitleHRlcm4gaW50IFhTZXRDb21tYW5kKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBjaGFyKioJCS8qIGFyZ3YgKi8sCisgICAgaW50CQkJLyogYXJnYyAqLworKTsKKworZXh0ZXJuIGludCBYU2V0RGFzaGVzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogZGFzaF9vZmZzZXQgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBkYXNoX2xpc3QgKi8sCisgICAgaW50CQkJLyogbiAqLworKTsKKworZXh0ZXJuIGludCBYU2V0RmlsbFJ1bGUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiBmaWxsX3J1bGUgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldEZpbGxTdHlsZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIGZpbGxfc3R5bGUgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldEZvbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBGb250CQkvKiBmb250ICovCispOworCitleHRlcm4gaW50IFhTZXRGb250UGF0aCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBjaGFyKioJCS8qIGRpcmVjdG9yaWVzICovLAorICAgIGludAkJCS8qIG5kaXJzICovCispOworCitleHRlcm4gaW50IFhTZXRGb3JlZ3JvdW5kKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBmb3JlZ3JvdW5kICovCispOworCitleHRlcm4gaW50IFhTZXRGdW5jdGlvbigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIGZ1bmN0aW9uICovCispOworCitleHRlcm4gaW50IFhTZXRHcmFwaGljc0V4cG9zdXJlcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIEJvb2wJCS8qIGdyYXBoaWNzX2V4cG9zdXJlcyAqLworKTsKKworZXh0ZXJuIGludCBYU2V0SWNvbk5hbWUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogaWNvbl9uYW1lICovCispOworCitleHRlcm4gaW50IFhTZXRJbnB1dEZvY3VzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogZm9jdXMgKi8sCisgICAgaW50CQkJLyogcmV2ZXJ0X3RvICovLAorICAgIFRpbWUJCS8qIHRpbWUgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldExpbmVBdHRyaWJ1dGVzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGxpbmVfd2lkdGggKi8sCisgICAgaW50CQkJLyogbGluZV9zdHlsZSAqLywKKyAgICBpbnQJCQkvKiBjYXBfc3R5bGUgKi8sCisgICAgaW50CQkJLyogam9pbl9zdHlsZSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0TW9kaWZpZXJNYXBwaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhNb2RpZmllcktleW1hcCoJLyogbW9kbWFwICovCispOworCitleHRlcm4gaW50IFhTZXRQbGFuZU1hc2soCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIHBsYW5lX21hc2sgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldFBvaW50ZXJNYXBwaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIF9YY29uc3QgdW5zaWduZWQgY2hhcioJLyogbWFwICovLAorICAgIGludAkJCS8qIG5tYXAgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldFNjcmVlblNhdmVyKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHRpbWVvdXQgKi8sCisgICAgaW50CQkJLyogaW50ZXJ2YWwgKi8sCisgICAgaW50CQkJLyogcHJlZmVyX2JsYW5raW5nICovLAorICAgIGludAkJCS8qIGFsbG93X2V4cG9zdXJlcyAqLworKTsKKworZXh0ZXJuIGludCBYU2V0U2VsZWN0aW9uT3duZXIoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQXRvbQkgICAgICAgIC8qIHNlbGVjdGlvbiAqLywKKyAgICBXaW5kb3cJCS8qIG93bmVyICovLAorICAgIFRpbWUJCS8qIHRpbWUgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldFN0YXRlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgdW5zaWduZWQgbG9uZyAJLyogZm9yZWdyb3VuZCAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIGJhY2tncm91bmQgKi8sCisgICAgaW50CQkJLyogZnVuY3Rpb24gKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBwbGFuZV9tYXNrICovCispOworCitleHRlcm4gaW50IFhTZXRTdGlwcGxlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgUGl4bWFwCQkvKiBzdGlwcGxlICovCispOworCitleHRlcm4gaW50IFhTZXRTdWJ3aW5kb3dNb2RlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogc3Vid2luZG93X21vZGUgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldFRTT3JpZ2luKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogdHNfeF9vcmlnaW4gKi8sCisgICAgaW50CQkJLyogdHNfeV9vcmlnaW4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldFRpbGUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBQaXhtYXAJCS8qIHRpbGUgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldFdpbmRvd0JhY2tncm91bmQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogYmFja2dyb3VuZF9waXhlbCAqLworKTsKKworZXh0ZXJuIGludCBYU2V0V2luZG93QmFja2dyb3VuZFBpeG1hcCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgUGl4bWFwCQkvKiBiYWNrZ3JvdW5kX3BpeG1hcCAqLworKTsKKworZXh0ZXJuIGludCBYU2V0V2luZG93Qm9yZGVyKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIGJvcmRlcl9waXhlbCAqLworKTsKKworZXh0ZXJuIGludCBYU2V0V2luZG93Qm9yZGVyUGl4bWFwKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBQaXhtYXAJCS8qIGJvcmRlcl9waXhtYXAgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldFdpbmRvd0JvcmRlcldpZHRoKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldFdpbmRvd0NvbG9ybWFwKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8KKyk7CisKK2V4dGVybiBpbnQgWFN0b3JlQnVmZmVyKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogYnl0ZXMgKi8sCisgICAgaW50CQkJLyogbmJ5dGVzICovLAorICAgIGludAkJCS8qIGJ1ZmZlciAqLworKTsKKworZXh0ZXJuIGludCBYU3RvcmVCeXRlcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGJ5dGVzICovLAorICAgIGludAkJCS8qIG5ieXRlcyAqLworKTsKKworZXh0ZXJuIGludCBYU3RvcmVDb2xvcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCisgICAgWENvbG9yKgkJLyogY29sb3IgKi8KKyk7CisKK2V4dGVybiBpbnQgWFN0b3JlQ29sb3JzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKKyAgICBYQ29sb3IqCQkvKiBjb2xvciAqLywKKyAgICBpbnQJCQkvKiBuY29sb3JzICovCispOworCitleHRlcm4gaW50IFhTdG9yZU5hbWUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogd2luZG93X25hbWUgKi8KKyk7CisKK2V4dGVybiBpbnQgWFN0b3JlTmFtZWRDb2xvcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBjb2xvciAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIHBpeGVsICovLAorICAgIGludAkJCS8qIGZsYWdzICovCispOworCitleHRlcm4gaW50IFhTeW5jKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEJvb2wJCS8qIGRpc2NhcmQgKi8KKyk7CisKK2V4dGVybiBpbnQgWFRleHRFeHRlbnRzKAorICAgIFhGb250U3RydWN0KgkvKiBmb250X3N0cnVjdCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHN0cmluZyAqLywKKyAgICBpbnQJCQkvKiBuY2hhcnMgKi8sCisgICAgaW50KgkJLyogZGlyZWN0aW9uX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBmb250X2FzY2VudF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogZm9udF9kZXNjZW50X3JldHVybiAqLywKKyAgICBYQ2hhclN0cnVjdCoJLyogb3ZlcmFsbF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFRleHRFeHRlbnRzMTYoCisgICAgWEZvbnRTdHJ1Y3QqCS8qIGZvbnRfc3RydWN0ICovLAorICAgIF9YY29uc3QgWENoYXIyYioJLyogc3RyaW5nICovLAorICAgIGludAkJCS8qIG5jaGFycyAqLywKKyAgICBpbnQqCQkvKiBkaXJlY3Rpb25fcmV0dXJuICovLAorICAgIGludCoJCS8qIGZvbnRfYXNjZW50X3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBmb250X2Rlc2NlbnRfcmV0dXJuICovLAorICAgIFhDaGFyU3RydWN0KgkvKiBvdmVyYWxsX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYVGV4dFdpZHRoKAorICAgIFhGb250U3RydWN0KgkvKiBmb250X3N0cnVjdCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHN0cmluZyAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLworKTsKKworZXh0ZXJuIGludCBYVGV4dFdpZHRoMTYoCisgICAgWEZvbnRTdHJ1Y3QqCS8qIGZvbnRfc3RydWN0ICovLAorICAgIF9YY29uc3QgWENoYXIyYioJLyogc3RyaW5nICovLAorICAgIGludAkJCS8qIGNvdW50ICovCispOworCitleHRlcm4gQm9vbCBYVHJhbnNsYXRlQ29vcmRpbmF0ZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiBzcmNfdyAqLywKKyAgICBXaW5kb3cJCS8qIGRlc3RfdyAqLywKKyAgICBpbnQJCQkvKiBzcmNfeCAqLywKKyAgICBpbnQJCQkvKiBzcmNfeSAqLywKKyAgICBpbnQqCQkvKiBkZXN0X3hfcmV0dXJuICovLAorICAgIGludCoJCS8qIGRlc3RfeV9yZXR1cm4gKi8sCisgICAgV2luZG93KgkJLyogY2hpbGRfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhVbmRlZmluZUN1cnNvcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8KKyk7CisKK2V4dGVybiBpbnQgWFVuZ3JhYkJ1dHRvbigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogYnV0dG9uICovLAorICAgIHVuc2lnbmVkIGludAkvKiBtb2RpZmllcnMgKi8sCisgICAgV2luZG93CQkvKiBncmFiX3dpbmRvdyAqLworKTsKKworZXh0ZXJuIGludCBYVW5ncmFiS2V5KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGtleWNvZGUgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG1vZGlmaWVycyAqLywKKyAgICBXaW5kb3cJCS8qIGdyYWJfd2luZG93ICovCispOworCitleHRlcm4gaW50IFhVbmdyYWJLZXlib2FyZCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBUaW1lCQkvKiB0aW1lICovCispOworCitleHRlcm4gaW50IFhVbmdyYWJQb2ludGVyKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFRpbWUJCS8qIHRpbWUgKi8KKyk7CisKK2V4dGVybiBpbnQgWFVuZ3JhYlNlcnZlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIGludCBYVW5pbnN0YWxsQ29sb3JtYXAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovCispOworCitleHRlcm4gaW50IFhVbmxvYWRGb250KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEZvbnQJCS8qIGZvbnQgKi8KKyk7CisKK2V4dGVybiBpbnQgWFVubWFwU3Vid2luZG93cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8KKyk7CisKK2V4dGVybiBpbnQgWFVubWFwV2luZG93KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLworKTsKKworZXh0ZXJuIGludCBYVmVuZG9yUmVsZWFzZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIGludCBYV2FycFBvaW50ZXIoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiBzcmNfdyAqLywKKyAgICBXaW5kb3cJCS8qIGRlc3RfdyAqLywKKyAgICBpbnQJCQkvKiBzcmNfeCAqLywKKyAgICBpbnQJCQkvKiBzcmNfeSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogc3JjX3dpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBzcmNfaGVpZ2h0ICovLAorICAgIGludAkJCS8qIGRlc3RfeCAqLywKKyAgICBpbnQJCQkvKiBkZXN0X3kgKi8KKyk7CisKK2V4dGVybiBpbnQgWFdpZHRoTU1PZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFdpZHRoT2ZTY3JlZW4oCisgICAgU2NyZWVuKgkJLyogc2NyZWVuICovCispOworCitleHRlcm4gaW50IFhXaW5kb3dFdmVudCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgbG9uZwkJLyogZXZlbnRfbWFzayAqLywKKyAgICBYRXZlbnQqCQkvKiBldmVudF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFdyaXRlQml0bWFwRmlsZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGZpbGVuYW1lICovLAorICAgIFBpeG1hcAkJLyogYml0bWFwICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAorICAgIGludAkJCS8qIHhfaG90ICovLAorICAgIGludAkJCS8qIHlfaG90ICovCispOworCitleHRlcm4gQm9vbCBYU3VwcG9ydHNMb2NhbGUgKHZvaWQpOworCitleHRlcm4gY2hhciAqWFNldExvY2FsZU1vZGlmaWVycygKKyAgICBjb25zdCBjaGFyKgkJLyogbW9kaWZpZXJfbGlzdCAqLworKTsKKworZXh0ZXJuIFhPTSBYT3Blbk9NKAorICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICBzdHJ1Y3QgX1hybUhhc2hCdWNrZXRSZWMqCS8qIHJkYiAqLywKKyAgICBfWGNvbnN0IGNoYXIqCQkvKiByZXNfbmFtZSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCQkvKiByZXNfY2xhc3MgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWENsb3NlT00oCisgICAgWE9NCQkJLyogb20gKi8KKyk7CisKK2V4dGVybiBjaGFyICpYU2V0T01WYWx1ZXMoCisgICAgWE9NCQkJLyogb20gKi8sCisgICAgLi4uCispIF9YX1NFTlRJTkVMKDApOworCitleHRlcm4gY2hhciAqWEdldE9NVmFsdWVzKAorICAgIFhPTQkJCS8qIG9tICovLAorICAgIC4uLgorKSBfWF9TRU5USU5FTCgwKTsKKworZXh0ZXJuIERpc3BsYXkgKlhEaXNwbGF5T2ZPTSgKKyAgICBYT00JCQkvKiBvbSAqLworKTsKKworZXh0ZXJuIGNoYXIgKlhMb2NhbGVPZk9NKAorICAgIFhPTQkJCS8qIG9tICovCispOworCitleHRlcm4gWE9DIFhDcmVhdGVPQygKKyAgICBYT00JCQkvKiBvbSAqLywKKyAgICAuLi4KKykgX1hfU0VOVElORUwoMCk7CisKK2V4dGVybiB2b2lkIFhEZXN0cm95T0MoCisgICAgWE9DCQkJLyogb2MgKi8KKyk7CisKK2V4dGVybiBYT00gWE9NT2ZPQygKKyAgICBYT0MJCQkvKiBvYyAqLworKTsKKworZXh0ZXJuIGNoYXIgKlhTZXRPQ1ZhbHVlcygKKyAgICBYT0MJCQkvKiBvYyAqLywKKyAgICAuLi4KKykgX1hfU0VOVElORUwoMCk7CisKK2V4dGVybiBjaGFyICpYR2V0T0NWYWx1ZXMoCisgICAgWE9DCQkJLyogb2MgKi8sCisgICAgLi4uCispIF9YX1NFTlRJTkVMKDApOworCitleHRlcm4gWEZvbnRTZXQgWENyZWF0ZUZvbnRTZXQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBiYXNlX2ZvbnRfbmFtZV9saXN0ICovLAorICAgIGNoYXIqKioJCS8qIG1pc3NpbmdfY2hhcnNldF9saXN0ICovLAorICAgIGludCoJCS8qIG1pc3NpbmdfY2hhcnNldF9jb3VudCAqLywKKyAgICBjaGFyKioJCS8qIGRlZl9zdHJpbmcgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhGcmVlRm9udFNldCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8KKyk7CisKK2V4dGVybiBpbnQgWEZvbnRzT2ZGb250U2V0KAorICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLywKKyAgICBYRm9udFN0cnVjdCoqKgkvKiBmb250X3N0cnVjdF9saXN0ICovLAorICAgIGNoYXIqKioJCS8qIGZvbnRfbmFtZV9saXN0ICovCispOworCitleHRlcm4gY2hhciAqWEJhc2VGb250TmFtZUxpc3RPZkZvbnRTZXQoCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovCispOworCitleHRlcm4gY2hhciAqWExvY2FsZU9mRm9udFNldCgKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8KKyk7CisKK2V4dGVybiBCb29sIFhDb250ZXh0RGVwZW5kZW50RHJhd2luZygKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8KKyk7CisKK2V4dGVybiBCb29sIFhEaXJlY3Rpb25hbERlcGVuZGVudERyYXdpbmcoCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovCispOworCitleHRlcm4gQm9vbCBYQ29udGV4dHVhbERyYXdpbmcoCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovCispOworCitleHRlcm4gWEZvbnRTZXRFeHRlbnRzICpYRXh0ZW50c09mRm9udFNldCgKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8KKyk7CisKK2V4dGVybiBpbnQgWG1iVGV4dEVzY2FwZW1lbnQoCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogdGV4dCAqLywKKyAgICBpbnQJCQkvKiBieXRlc190ZXh0ICovCispOworCitleHRlcm4gaW50IFh3Y1RleHRFc2NhcGVtZW50KAorICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLywKKyAgICBfWGNvbnN0IHdjaGFyX3QqCS8qIHRleHQgKi8sCisgICAgaW50CQkJLyogbnVtX3djaGFycyAqLworKTsKKworZXh0ZXJuIGludCBYdXRmOFRleHRFc2NhcGVtZW50KAorICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHRleHQgKi8sCisgICAgaW50CQkJLyogYnl0ZXNfdGV4dCAqLworKTsKKworZXh0ZXJuIGludCBYbWJUZXh0RXh0ZW50cygKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB0ZXh0ICovLAorICAgIGludAkJCS8qIGJ5dGVzX3RleHQgKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIG92ZXJhbGxfaW5rX3JldHVybiAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogb3ZlcmFsbF9sb2dpY2FsX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYd2NUZXh0RXh0ZW50cygKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCisgICAgX1hjb25zdCB3Y2hhcl90KgkvKiB0ZXh0ICovLAorICAgIGludAkJCS8qIG51bV93Y2hhcnMgKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIG92ZXJhbGxfaW5rX3JldHVybiAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogb3ZlcmFsbF9sb2dpY2FsX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYdXRmOFRleHRFeHRlbnRzKAorICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHRleHQgKi8sCisgICAgaW50CQkJLyogYnl0ZXNfdGV4dCAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogb3ZlcmFsbF9pbmtfcmV0dXJuICovLAorICAgIFhSZWN0YW5nbGUqCQkvKiBvdmVyYWxsX2xvZ2ljYWxfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhtYlRleHRQZXJDaGFyRXh0ZW50cygKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB0ZXh0ICovLAorICAgIGludAkJCS8qIGJ5dGVzX3RleHQgKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIGlua19leHRlbnRzX2J1ZmZlciAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogbG9naWNhbF9leHRlbnRzX2J1ZmZlciAqLywKKyAgICBpbnQJCQkvKiBidWZmZXJfc2l6ZSAqLywKKyAgICBpbnQqCQkvKiBudW1fY2hhcnMgKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIG92ZXJhbGxfaW5rX3JldHVybiAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogb3ZlcmFsbF9sb2dpY2FsX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYd2NUZXh0UGVyQ2hhckV4dGVudHMoCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAorICAgIF9YY29uc3Qgd2NoYXJfdCoJLyogdGV4dCAqLywKKyAgICBpbnQJCQkvKiBudW1fd2NoYXJzICovLAorICAgIFhSZWN0YW5nbGUqCQkvKiBpbmtfZXh0ZW50c19idWZmZXIgKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIGxvZ2ljYWxfZXh0ZW50c19idWZmZXIgKi8sCisgICAgaW50CQkJLyogYnVmZmVyX3NpemUgKi8sCisgICAgaW50KgkJLyogbnVtX2NoYXJzICovLAorICAgIFhSZWN0YW5nbGUqCQkvKiBvdmVyYWxsX2lua19yZXR1cm4gKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIG92ZXJhbGxfbG9naWNhbF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWHV0ZjhUZXh0UGVyQ2hhckV4dGVudHMoCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogdGV4dCAqLywKKyAgICBpbnQJCQkvKiBieXRlc190ZXh0ICovLAorICAgIFhSZWN0YW5nbGUqCQkvKiBpbmtfZXh0ZW50c19idWZmZXIgKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIGxvZ2ljYWxfZXh0ZW50c19idWZmZXIgKi8sCisgICAgaW50CQkJLyogYnVmZmVyX3NpemUgKi8sCisgICAgaW50KgkJLyogbnVtX2NoYXJzICovLAorICAgIFhSZWN0YW5nbGUqCQkvKiBvdmVyYWxsX2lua19yZXR1cm4gKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIG92ZXJhbGxfbG9naWNhbF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiB2b2lkIFhtYkRyYXdUZXh0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIFhtYlRleHRJdGVtKgkvKiB0ZXh0X2l0ZW1zICovLAorICAgIGludAkJCS8qIG5pdGVtcyAqLworKTsKKworZXh0ZXJuIHZvaWQgWHdjRHJhd1RleHQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgWHdjVGV4dEl0ZW0qCS8qIHRleHRfaXRlbXMgKi8sCisgICAgaW50CQkJLyogbml0ZW1zICovCispOworCitleHRlcm4gdm9pZCBYdXRmOERyYXdUZXh0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIFhtYlRleHRJdGVtKgkvKiB0ZXh0X2l0ZW1zICovLAorICAgIGludAkJCS8qIG5pdGVtcyAqLworKTsKKworZXh0ZXJuIHZvaWQgWG1iRHJhd1N0cmluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB0ZXh0ICovLAorICAgIGludAkJCS8qIGJ5dGVzX3RleHQgKi8KKyk7CisKK2V4dGVybiB2b2lkIFh3Y0RyYXdTdHJpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIF9YY29uc3Qgd2NoYXJfdCoJLyogdGV4dCAqLywKKyAgICBpbnQJCQkvKiBudW1fd2NoYXJzICovCispOworCitleHRlcm4gdm9pZCBYdXRmOERyYXdTdHJpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogdGV4dCAqLywKKyAgICBpbnQJCQkvKiBieXRlc190ZXh0ICovCispOworCitleHRlcm4gdm9pZCBYbWJEcmF3SW1hZ2VTdHJpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogdGV4dCAqLywKKyAgICBpbnQJCQkvKiBieXRlc190ZXh0ICovCispOworCitleHRlcm4gdm9pZCBYd2NEcmF3SW1hZ2VTdHJpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIF9YY29uc3Qgd2NoYXJfdCoJLyogdGV4dCAqLywKKyAgICBpbnQJCQkvKiBudW1fd2NoYXJzICovCispOworCitleHRlcm4gdm9pZCBYdXRmOERyYXdJbWFnZVN0cmluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB0ZXh0ICovLAorICAgIGludAkJCS8qIGJ5dGVzX3RleHQgKi8KKyk7CisKK2V4dGVybiBYSU0gWE9wZW5JTSgKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBzdHJ1Y3QgX1hybUhhc2hCdWNrZXRSZWMqCS8qIHJkYiAqLywKKyAgICBjaGFyKgkJCS8qIHJlc19uYW1lICovLAorICAgIGNoYXIqCQkJLyogcmVzX2NsYXNzICovCispOworCitleHRlcm4gU3RhdHVzIFhDbG9zZUlNKAorICAgIFhJTSAvKiBpbSAqLworKTsKKworZXh0ZXJuIGNoYXIgKlhHZXRJTVZhbHVlcygKKyAgICBYSU0gLyogaW0gKi8sIC4uLgorKSBfWF9TRU5USU5FTCgwKTsKKworZXh0ZXJuIGNoYXIgKlhTZXRJTVZhbHVlcygKKyAgICBYSU0gLyogaW0gKi8sIC4uLgorKSBfWF9TRU5USU5FTCgwKTsKKworZXh0ZXJuIERpc3BsYXkgKlhEaXNwbGF5T2ZJTSgKKyAgICBYSU0gLyogaW0gKi8KKyk7CisKK2V4dGVybiBjaGFyICpYTG9jYWxlT2ZJTSgKKyAgICBYSU0gLyogaW0qLworKTsKKworZXh0ZXJuIFhJQyBYQ3JlYXRlSUMoCisgICAgWElNIC8qIGltICovLCAuLi4KKykgX1hfU0VOVElORUwoMCk7CisKK2V4dGVybiB2b2lkIFhEZXN0cm95SUMoCisgICAgWElDIC8qIGljICovCispOworCitleHRlcm4gdm9pZCBYU2V0SUNGb2N1cygKKyAgICBYSUMgLyogaWMgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhVbnNldElDRm9jdXMoCisgICAgWElDIC8qIGljICovCispOworCitleHRlcm4gd2NoYXJfdCAqWHdjUmVzZXRJQygKKyAgICBYSUMgLyogaWMgKi8KKyk7CisKK2V4dGVybiBjaGFyICpYbWJSZXNldElDKAorICAgIFhJQyAvKiBpYyAqLworKTsKKworZXh0ZXJuIGNoYXIgKlh1dGY4UmVzZXRJQygKKyAgICBYSUMgLyogaWMgKi8KKyk7CisKK2V4dGVybiBjaGFyICpYU2V0SUNWYWx1ZXMoCisgICAgWElDIC8qIGljICovLCAuLi4KKykgX1hfU0VOVElORUwoMCk7CisKK2V4dGVybiBjaGFyICpYR2V0SUNWYWx1ZXMoCisgICAgWElDIC8qIGljICovLCAuLi4KKykgX1hfU0VOVElORUwoMCk7CisKK2V4dGVybiBYSU0gWElNT2ZJQygKKyAgICBYSUMgLyogaWMgKi8KKyk7CisKK2V4dGVybiBCb29sIFhGaWx0ZXJFdmVudCgKKyAgICBYRXZlbnQqCS8qIGV2ZW50ICovLAorICAgIFdpbmRvdwkvKiB3aW5kb3cgKi8KKyk7CisKK2V4dGVybiBpbnQgWG1iTG9va3VwU3RyaW5nKAorICAgIFhJQwkJCS8qIGljICovLAorICAgIFhLZXlQcmVzc2VkRXZlbnQqCS8qIGV2ZW50ICovLAorICAgIGNoYXIqCQkvKiBidWZmZXJfcmV0dXJuICovLAorICAgIGludAkJCS8qIGJ5dGVzX2J1ZmZlciAqLywKKyAgICBLZXlTeW0qCQkvKiBrZXlzeW1fcmV0dXJuICovLAorICAgIFN0YXR1cyoJCS8qIHN0YXR1c19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWHdjTG9va3VwU3RyaW5nKAorICAgIFhJQwkJCS8qIGljICovLAorICAgIFhLZXlQcmVzc2VkRXZlbnQqCS8qIGV2ZW50ICovLAorICAgIHdjaGFyX3QqCQkvKiBidWZmZXJfcmV0dXJuICovLAorICAgIGludAkJCS8qIHdjaGFyc19idWZmZXIgKi8sCisgICAgS2V5U3ltKgkJLyoga2V5c3ltX3JldHVybiAqLywKKyAgICBTdGF0dXMqCQkvKiBzdGF0dXNfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFh1dGY4TG9va3VwU3RyaW5nKAorICAgIFhJQwkJCS8qIGljICovLAorICAgIFhLZXlQcmVzc2VkRXZlbnQqCS8qIGV2ZW50ICovLAorICAgIGNoYXIqCQkvKiBidWZmZXJfcmV0dXJuICovLAorICAgIGludAkJCS8qIGJ5dGVzX2J1ZmZlciAqLywKKyAgICBLZXlTeW0qCQkvKiBrZXlzeW1fcmV0dXJuICovLAorICAgIFN0YXR1cyoJCS8qIHN0YXR1c19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBYVmFOZXN0ZWRMaXN0IFhWYUNyZWF0ZU5lc3RlZExpc3QoCisgICAgaW50IC8qdW51c2VkKi8sIC4uLgorKSBfWF9TRU5USU5FTCgwKTsKKworLyogaW50ZXJuYWwgY29ubmVjdGlvbnMgZm9yIElNcyAqLworCitleHRlcm4gQm9vbCBYUmVnaXN0ZXJJTUluc3RhbnRpYXRlQ2FsbGJhY2soCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgc3RydWN0IF9Ycm1IYXNoQnVja2V0UmVjKgkvKiByZGIgKi8sCisgICAgY2hhcioJCQkvKiByZXNfbmFtZSAqLywKKyAgICBjaGFyKgkJCS8qIHJlc19jbGFzcyAqLywKKyAgICBYSURQcm9jCQkJLyogY2FsbGJhY2sgKi8sCisgICAgWFBvaW50ZXIJCQkvKiBjbGllbnRfZGF0YSAqLworKTsKKworZXh0ZXJuIEJvb2wgWFVucmVnaXN0ZXJJTUluc3RhbnRpYXRlQ2FsbGJhY2soCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgc3RydWN0IF9Ycm1IYXNoQnVja2V0UmVjKgkvKiByZGIgKi8sCisgICAgY2hhcioJCQkvKiByZXNfbmFtZSAqLywKKyAgICBjaGFyKgkJCS8qIHJlc19jbGFzcyAqLywKKyAgICBYSURQcm9jCQkJLyogY2FsbGJhY2sgKi8sCisgICAgWFBvaW50ZXIJCQkvKiBjbGllbnRfZGF0YSAqLworKTsKKwordHlwZWRlZiB2b2lkICgqWENvbm5lY3Rpb25XYXRjaFByb2MpKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIFhQb2ludGVyCQkJLyogY2xpZW50X2RhdGEgKi8sCisgICAgaW50CQkJCS8qIGZkICovLAorICAgIEJvb2wJCQkvKiBvcGVuaW5nICovLAkgLyogb3BlbiBvciBjbG9zZSBmbGFnICovCisgICAgWFBvaW50ZXIqCQkJLyogd2F0Y2hfZGF0YSAqLyAvKiBvcGVuIHNldHMsIGNsb3NlIHVzZXMgKi8KKyk7CisKKworZXh0ZXJuIFN0YXR1cyBYSW50ZXJuYWxDb25uZWN0aW9uTnVtYmVycygKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBpbnQqKgkJCS8qIGZkX3JldHVybiAqLywKKyAgICBpbnQqCQkJLyogY291bnRfcmV0dXJuICovCispOworCitleHRlcm4gdm9pZCBYUHJvY2Vzc0ludGVybmFsQ29ubmVjdGlvbigKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBpbnQJCQkJLyogZmQgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEFkZENvbm5lY3Rpb25XYXRjaCgKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBYQ29ubmVjdGlvbldhdGNoUHJvYwkvKiBjYWxsYmFjayAqLywKKyAgICBYUG9pbnRlcgkJCS8qIGNsaWVudF9kYXRhICovCispOworCitleHRlcm4gdm9pZCBYUmVtb3ZlQ29ubmVjdGlvbldhdGNoKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIFhDb25uZWN0aW9uV2F0Y2hQcm9jCS8qIGNhbGxiYWNrICovLAorICAgIFhQb2ludGVyCQkJLyogY2xpZW50X2RhdGEgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhTZXRBdXRob3JpemF0aW9uKAorICAgIGNoYXIgKgkJCS8qIG5hbWUgKi8sCisgICAgaW50CQkJCS8qIG5hbWVsZW4gKi8sCisgICAgY2hhciAqCQkJLyogZGF0YSAqLywKKyAgICBpbnQJCQkJLyogZGF0YWxlbiAqLworKTsKKworZXh0ZXJuIGludCBfWG1idG93YygKKyAgICB3Y2hhcl90ICoJCQkvKiB3c3RyICovLAorI2lmZGVmIElTQworICAgIGNoYXIgY29uc3QgKgkJLyogc3RyICovLAorICAgIHNpemVfdAkJCS8qIGxlbiAqLworI2Vsc2UKKyAgICBjaGFyICoJCQkvKiBzdHIgKi8sCisgICAgaW50CQkJCS8qIGxlbiAqLworI2VuZGlmCispOworCitleHRlcm4gaW50IF9Yd2N0b21iKAorICAgIGNoYXIgKgkJCS8qIHN0ciAqLywKKyAgICB3Y2hhcl90CQkJLyogd2MgKi8KKyk7CisKK2V4dGVybiBCb29sIFhHZXRFdmVudERhdGEoCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgWEdlbmVyaWNFdmVudENvb2tpZSoJLyogY29va2llKi8KKyk7CisKK2V4dGVybiB2b2lkIFhGcmVlRXZlbnREYXRhKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIFhHZW5lcmljRXZlbnRDb29raWUqCS8qIGNvb2tpZSovCispOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYgLyogX1gxMV9YTElCX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YbGliQ29uZi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGxpYkNvbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjliOTQwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGxpYkNvbmYuaApAQCAtMCwwICsxLDM4IEBACisvKiBpbmNsdWRlL1gxMS9YbGliQ29uZi5oLiAgR2VuZXJhdGVkIGZyb20gWGxpYkNvbmYuaC5pbiBieSBjb25maWd1cmUuICAqLworLyoKKyAqIENvcHlyaWdodCDCqSAyMDA1IEtlaXRoIFBhY2thcmQKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KKyAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAorICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCisgKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX1hMSUJDT05GX0hfCisjZGVmaW5lIF9YTElCQ09ORl9IXworLyoKKyAqIFRoaXMgaGVhZGVyIGZpbGUgZXhwb3J0cyBkZWZpbmVzIG5lY2Vzc2FyeSB0byBjb3JyZWN0bHkKKyAqIHVzZSBYbGliaW50LmggYm90aCBpbnNpZGUgWGxpYiBhbmQgYnkgZXh0ZXJuYWwgbGlicmFyaWVzCisgKiBzdWNoIGFzIGV4dGVuc2lvbnMuCisgKi8KKworLyogVGhyZWFkaW5nIHN1cHBvcnQ/ICovCisjZGVmaW5lIFhUSFJFQURTIDEKKworLyogVXNlIG11bHRpLXRocmVhZGVkIGxpYmMgZnVuY3Rpb25zPyAqLworI2RlZmluZSBYVVNFX01UU0FGRV9BUEkgMQorCisjZW5kaWYgLyogX1hMSUJDT05GX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YbGliaW50LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YbGliaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlZGVlYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hsaWJpbnQuaApAQCAtMCwwICsxLDEzNjkgQEAKKworLyoKKworQ29weXJpZ2h0IDE5ODQsIDE5ODUsIDE5ODcsIDE5ODksIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKK2luIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKK09USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCitPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsCitub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yCitvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uCitmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqLworCisjaWZuZGVmIF9YMTFfWExJQklOVF9IXworI2RlZmluZSBfWDExX1hMSUJJTlRfSF8gMQorCisvKgorICoJWGxpYmludC5oIC0gSGVhZGVyIGRlZmluaXRpb24gYW5kIHN1cHBvcnQgZmlsZSBmb3IgdGhlIGludGVybmFsCisgKglzdXBwb3J0IHJvdXRpbmVzIHVzZWQgYnkgdGhlIEMgc3Vicm91dGluZSBpbnRlcmZhY2UKKyAqCWxpYnJhcnkgKFhsaWIpIHRvIHRoZSBYIFdpbmRvdyBTeXN0ZW0uCisgKgorICoJV2FybmluZywgdGhlcmUgYmUgZHJhZ29ucyBoZXJlLi4uLgorICovCisKKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YcHJvdG8uaD4JCS8qIHRvIGRlY2xhcmUgeEV2ZW50ICovCisjaW5jbHVkZSA8WDExL1hsaWJDb25mLmg+CS8qIGZvciBjb25maWd1cmVkIG9wdGlvbnMgbGlrZSBYVEhSRUFEUyAqLworCisjaWZkZWYgV0lOMzIKKyNkZWZpbmUgX1hGbHVzaCBfWEZsdXNoSXQKKyNlbmRpZgorCisvKgorICogSWYgeW91ciBCeXRlc1JlYWRhYmxlIGNvcnJlY3RseSBkZXRlY3RzIGJyb2tlbiBjb25uZWN0aW9ucywgdGhlbgorICogeW91IHNob3VsZCBOT1QgZGVmaW5lIFhDT05OX0NIRUNLX0ZSRVEuCisgKi8KKyNpZm5kZWYgWENPTk5fQ0hFQ0tfRlJFUQorI2RlZmluZSBYQ09OTl9DSEVDS19GUkVRIDI1NgorI2VuZGlmCisKK3N0cnVjdCBfWEdDCit7CisgICAgWEV4dERhdGEgKmV4dF9kYXRhOwkvKiBob29rIGZvciBleHRlbnNpb24gdG8gaGFuZyBkYXRhICovCisgICAgR0NvbnRleHQgZ2lkOwkvKiBwcm90b2NvbCBJRCBmb3IgZ3JhcGhpY3MgY29udGV4dCAqLworICAgIEJvb2wgcmVjdHM7CQkvKiBib29sZWFuOiBUUlVFIGlmIGNsaXBtYXNrIGlzIGxpc3Qgb2YgcmVjdGFuZ2xlcyAqLworICAgIEJvb2wgZGFzaGVzOwkvKiBib29sZWFuOiBUUlVFIGlmIGRhc2gtbGlzdCBpcyByZWFsbHkgYSBsaXN0ICovCisgICAgdW5zaWduZWQgbG9uZyBkaXJ0eTsvKiBjYWNoZSBkaXJ0eSBiaXRzICovCisgICAgWEdDVmFsdWVzIHZhbHVlczsJLyogc2hhZG93IHN0cnVjdHVyZSBvZiB2YWx1ZXMgKi8KK307CisKK3N0cnVjdCBfWERpc3BsYXkKK3sKKwlYRXh0RGF0YSAqZXh0X2RhdGE7CS8qIGhvb2sgZm9yIGV4dGVuc2lvbiB0byBoYW5nIGRhdGEgKi8KKwlzdHJ1Y3QgX1hGcmVlRnVuY3MgKmZyZWVfZnVuY3M7IC8qIGludGVybmFsIGZyZWUgZnVuY3Rpb25zICovCisJaW50IGZkOwkJCS8qIE5ldHdvcmsgc29ja2V0LiAqLworCWludCBjb25uX2NoZWNrZXI7ICAgICAgICAgLyogdWdseSB0aGluZyB1c2VkIGJ5IF9YRXZlbnRzUXVldWVkICovCisJaW50IHByb3RvX21ham9yX3ZlcnNpb247LyogbWFqLiB2ZXJzaW9uIG9mIHNlcnZlcidzIFggcHJvdG9jb2wgKi8KKwlpbnQgcHJvdG9fbWlub3JfdmVyc2lvbjsvKiBtaW5vciB2ZXJzaW9uIG9mIHNlcnZlcidzIFggcHJvdG9jb2wgKi8KKwljaGFyICp2ZW5kb3I7CQkvKiB2ZW5kb3Igb2YgdGhlIHNlcnZlciBoYXJkd2FyZSAqLworICAgICAgICBYSUQgcmVzb3VyY2VfYmFzZTsJLyogcmVzb3VyY2UgSUQgYmFzZSAqLworCVhJRCByZXNvdXJjZV9tYXNrOwkvKiByZXNvdXJjZSBJRCBtYXNrIGJpdHMgKi8KKwlYSUQgcmVzb3VyY2VfaWQ7CS8qIGFsbG9jYXRvciBjdXJyZW50IElEICovCisJaW50IHJlc291cmNlX3NoaWZ0OwkvKiBhbGxvY2F0b3Igc2hpZnQgdG8gY29ycmVjdCBiaXRzICovCisJWElEICgqcmVzb3VyY2VfYWxsb2MpKAkvKiBhbGxvY2F0b3IgZnVuY3Rpb24gKi8KKwkJc3RydWN0IF9YRGlzcGxheSoKKwkJKTsKKwlpbnQgYnl0ZV9vcmRlcjsJCS8qIHNjcmVlbiBieXRlIG9yZGVyLCBMU0JGaXJzdCwgTVNCRmlyc3QgKi8KKwlpbnQgYml0bWFwX3VuaXQ7CS8qIHBhZGRpbmcgYW5kIGRhdGEgcmVxdWlyZW1lbnRzICovCisJaW50IGJpdG1hcF9wYWQ7CQkvKiBwYWRkaW5nIHJlcXVpcmVtZW50cyBvbiBiaXRtYXBzICovCisJaW50IGJpdG1hcF9iaXRfb3JkZXI7CS8qIExlYXN0U2lnbmlmaWNhbnQgb3IgTW9zdFNpZ25pZmljYW50ICovCisJaW50IG5mb3JtYXRzOwkJLyogbnVtYmVyIG9mIHBpeG1hcCBmb3JtYXRzIGluIGxpc3QgKi8KKwlTY3JlZW5Gb3JtYXQgKnBpeG1hcF9mb3JtYXQ7CS8qIHBpeG1hcCBmb3JtYXQgbGlzdCAqLworCWludCB2bnVtYmVyOwkJLyogWGxpYidzIFggcHJvdG9jb2wgdmVyc2lvbiBudW1iZXIuICovCisJaW50IHJlbGVhc2U7CQkvKiByZWxlYXNlIG9mIHRoZSBzZXJ2ZXIgKi8KKwlzdHJ1Y3QgX1hTUUV2ZW50ICpoZWFkLCAqdGFpbDsJLyogSW5wdXQgZXZlbnQgcXVldWUuICovCisJaW50IHFsZW47CQkvKiBMZW5ndGggb2YgaW5wdXQgZXZlbnQgcXVldWUgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfcmVxdWVzdF9yZWFkOyAvKiBzZXEgbnVtYmVyIG9mIGxhc3QgZXZlbnQgcmVhZCAqLworCXVuc2lnbmVkIGxvbmcgcmVxdWVzdDsJLyogc2VxdWVuY2UgbnVtYmVyIG9mIGxhc3QgcmVxdWVzdC4gKi8KKwljaGFyICpsYXN0X3JlcTsJCS8qIGJlZ2lubmluZyBvZiBsYXN0IHJlcXVlc3QsIG9yIGR1bW15ICovCisJY2hhciAqYnVmZmVyOwkJLyogT3V0cHV0IGJ1ZmZlciBzdGFydGluZyBhZGRyZXNzLiAqLworCWNoYXIgKmJ1ZnB0cjsJCS8qIE91dHB1dCBidWZmZXIgaW5kZXggcG9pbnRlci4gKi8KKwljaGFyICpidWZtYXg7CQkvKiBPdXRwdXQgYnVmZmVyIG1heGltdW0rMSBhZGRyZXNzLiAqLworCXVuc2lnbmVkIG1heF9yZXF1ZXN0X3NpemU7IC8qIG1heGltdW0gbnVtYmVyIDMyIGJpdCB3b3JkcyBpbiByZXF1ZXN0Ki8KKwlzdHJ1Y3QgX1hybUhhc2hCdWNrZXRSZWMgKmRiOworCWludCAoKnN5bmNoYW5kbGVyKSgJLyogU3luY2hyb25pemF0aW9uIGhhbmRsZXIgKi8KKwkJc3RydWN0IF9YRGlzcGxheSoKKwkJKTsKKwljaGFyICpkaXNwbGF5X25hbWU7CS8qICJob3N0OmRpc3BsYXkiIHN0cmluZyB1c2VkIG9uIHRoaXMgY29ubmVjdCovCisJaW50IGRlZmF1bHRfc2NyZWVuOwkvKiBkZWZhdWx0IHNjcmVlbiBmb3Igb3BlcmF0aW9ucyAqLworCWludCBuc2NyZWVuczsJCS8qIG51bWJlciBvZiBzY3JlZW5zIG9uIHRoaXMgc2VydmVyKi8KKwlTY3JlZW4gKnNjcmVlbnM7CS8qIHBvaW50ZXIgdG8gbGlzdCBvZiBzY3JlZW5zICovCisJdW5zaWduZWQgbG9uZyBtb3Rpb25fYnVmZmVyOwkvKiBzaXplIG9mIG1vdGlvbiBidWZmZXIgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGZsYWdzOwkgICAvKiBpbnRlcm5hbCBjb25uZWN0aW9uIGZsYWdzICovCisJaW50IG1pbl9rZXljb2RlOwkvKiBtaW5pbXVtIGRlZmluZWQga2V5Y29kZSAqLworCWludCBtYXhfa2V5Y29kZTsJLyogbWF4aW11bSBkZWZpbmVkIGtleWNvZGUgKi8KKwlLZXlTeW0gKmtleXN5bXM7CS8qIFRoaXMgc2VydmVyJ3Mga2V5c3ltcyAqLworCVhNb2RpZmllcktleW1hcCAqbW9kaWZpZXJtYXA7CS8qIFRoaXMgc2VydmVyJ3MgbW9kaWZpZXIga2V5bWFwICovCisJaW50IGtleXN5bXNfcGVyX2tleWNvZGU7LyogbnVtYmVyIG9mIHJvd3MgKi8KKwljaGFyICp4ZGVmYXVsdHM7CS8qIGNvbnRlbnRzIG9mIGRlZmF1bHRzIGZyb20gc2VydmVyICovCisJY2hhciAqc2NyYXRjaF9idWZmZXI7CS8qIHBsYWNlIHRvIGhhbmcgc2NyYXRjaCBidWZmZXIgKi8KKwl1bnNpZ25lZCBsb25nIHNjcmF0Y2hfbGVuZ3RoOwkvKiBsZW5ndGggb2Ygc2NyYXRjaCBidWZmZXIgKi8KKwlpbnQgZXh0X251bWJlcjsJCS8qIGV4dGVuc2lvbiBudW1iZXIgb24gdGhpcyBkaXNwbGF5ICovCisJc3RydWN0IF9YRXh0ZW4gKmV4dF9wcm9jczsgLyogZXh0ZW5zaW9ucyBpbml0aWFsaXplZCBvbiB0aGlzIGRpc3BsYXkgKi8KKwkvKgorCSAqIHRoZSBmb2xsb3dpbmcgY2FuIGJlIGZpeGVkIHNpemUsIGFzIHRoZSBwcm90b2NvbCBkZWZpbmVzIGhvdworCSAqIG11Y2ggYWRkcmVzcyBzcGFjZSBpcyBhdmFpbGFibGUuCisJICogV2hpbGUgdGhpcyBjb3VsZCBiZSBkb25lIHVzaW5nIHRoZSBleHRlbnNpb24gdmVjdG9yLCB0aGVyZQorCSAqIG1heSBiZSBNQU5ZIGV2ZW50cyBwcm9jZXNzZWQsIHNvIGEgc2VhcmNoIHRocm91Z2ggdGhlIGV4dGVuc2lvbgorCSAqIGxpc3QgdG8gZmluZCB0aGUgcmlnaHQgcHJvY2VkdXJlIGZvciBlYWNoIGV2ZW50IG1pZ2h0IGJlCisJICogZXhwZW5zaXZlIGlmIG1hbnkgZXh0ZW5zaW9ucyBhcmUgYmVpbmcgdXNlZC4KKwkgKi8KKwlCb29sICgqZXZlbnRfdmVjWzEyOF0pKAkvKiB2ZWN0b3IgZm9yIHdpcmUgdG8gZXZlbnQgKi8KKwkJRGlzcGxheSAqCS8qIGRweSAqLywKKwkJWEV2ZW50ICoJLyogcmUgKi8sCisJCXhFdmVudCAqCS8qIGV2ZW50ICovCisJCSk7CisJU3RhdHVzICgqd2lyZV92ZWNbMTI4XSkoIC8qIHZlY3RvciBmb3IgZXZlbnQgdG8gd2lyZSAqLworCQlEaXNwbGF5ICoJLyogZHB5ICovLAorCQlYRXZlbnQgKgkvKiByZSAqLywKKwkJeEV2ZW50ICoJLyogZXZlbnQgKi8KKwkJKTsKKwlLZXlTeW0gbG9ja19tZWFuaW5nOwkgICAvKiBmb3IgWExvb2t1cFN0cmluZyAqLworCXN0cnVjdCBfWExvY2tJbmZvICpsb2NrOyAgIC8qIG11bHRpLXRocmVhZCBzdGF0ZSwgZGlzcGxheSBsb2NrICovCisJc3RydWN0IF9YSW50ZXJuYWxBc3luYyAqYXN5bmNfaGFuZGxlcnM7IC8qIGZvciBpbnRlcm5hbCBhc3luYyAqLworCXVuc2lnbmVkIGxvbmcgYmlncmVxX3NpemU7IC8qIG1heCBzaXplIG9mIGJpZyByZXF1ZXN0cyAqLworCXN0cnVjdCBfWExvY2tQdHJzICpsb2NrX2ZuczsgLyogcG9pbnRlcnMgdG8gdGhyZWFkcyBmdW5jdGlvbnMgKi8KKwl2b2lkICgqaWRsaXN0X2FsbG9jKSgJICAgLyogWElEIGxpc3QgYWxsb2NhdG9yIGZ1bmN0aW9uICovCisJCURpc3BsYXkgKgkvKiBkcHkgKi8sCisJCVhJRCAqCQkvKiBpZHMgKi8sCisJCWludAkJLyogY291bnQgKi8KKwkJKTsKKwkvKiB0aGluZ3MgYWJvdmUgdGhpcyBsaW5lIHNob3VsZCBub3QgbW92ZSwgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5ICovCisJc3RydWN0IF9YS2V5dHJhbnMgKmtleV9iaW5kaW5nczsgLyogZm9yIFhMb29rdXBTdHJpbmcgKi8KKwlGb250IGN1cnNvcl9mb250OwkgICAvKiBmb3IgWENyZWF0ZUZvbnRDdXJzb3IgKi8KKwlzdHJ1Y3QgX1hEaXNwbGF5QXRvbXMgKmF0b21zOyAvKiBmb3IgWEludGVybkF0b20gKi8KKwl1bnNpZ25lZCBpbnQgbW9kZV9zd2l0Y2g7ICAvKiBrZXlib2FyZCBncm91cCBtb2RpZmllcnMgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2xvY2s7ICAvKiBrZXlib2FyZCBudW1sb2NrIG1vZGlmaWVycyAqLworCXN0cnVjdCBfWENvbnRleHREQiAqY29udGV4dF9kYjsgLyogY29udGV4dCBkYXRhYmFzZSAqLworCUJvb2wgKCoqZXJyb3JfdmVjKSgJLyogdmVjdG9yIGZvciB3aXJlIHRvIGVycm9yICovCisJCURpc3BsYXkgICAgICoJLyogZGlzcGxheSAqLywKKwkJWEVycm9yRXZlbnQgKgkvKiBoZSAqLywKKwkJeEVycm9yICAgICAgKgkvKiB3ZSAqLworCQkpOworCS8qCisJICogWGNtcyBpbmZvcm1hdGlvbgorCSAqLworCXN0cnVjdCB7CisJICAgWFBvaW50ZXIgZGVmYXVsdENDQ3M7ICAvKiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGRlZmF1bHQgWGNtc0NDQyAqLworCSAgIFhQb2ludGVyIGNsaWVudENtYXBzOyAgLyogcG9pbnRlciB0byBsaW5rZWQgbGlzdCBvZiBYY21zQ21hcFJlYyAqLworCSAgIFhQb2ludGVyIHBlclZpc3VhbEludGVuc2l0eU1hcHM7CisJCQkJICAvKiBsaW5rZWQgbGlzdCBvZiBYY21zSW50ZW5zaXR5TWFwICovCisJfSBjbXM7CisJc3RydWN0IF9YSU1GaWx0ZXIgKmltX2ZpbHRlcnM7CisJc3RydWN0IF9YU1FFdmVudCAqcWZyZWU7IC8qIHVuYWxsb2NhdGVkIGV2ZW50IHF1ZXVlIGVsZW1lbnRzICovCisJdW5zaWduZWQgbG9uZyBuZXh0X2V2ZW50X3NlcmlhbF9udW07IC8qIGluc2VydGVkIGludG8gbmV4dCBxdWV1ZSBlbHQgKi8KKwlzdHJ1Y3QgX1hFeHRlbiAqZmx1c2hlczsgLyogRmx1c2ggaG9va3MgKi8KKwlzdHJ1Y3QgX1hDb25uZWN0aW9uSW5mbyAqaW1fZmRfaW5mbzsgLyogX1hSZWdpc3RlckludGVybmFsQ29ubmVjdGlvbiAqLworCWludCBpbV9mZF9sZW5ndGg7CS8qIG51bWJlciBvZiBpbV9mZF9pbmZvICovCisJc3RydWN0IF9YQ29ubldhdGNoSW5mbyAqY29ubl93YXRjaGVyczsgLyogWEFkZENvbm5lY3Rpb25XYXRjaCAqLworCWludCB3YXRjaGVyX2NvdW50OwkvKiBudW1iZXIgb2YgY29ubl93YXRjaGVycyAqLworCVhQb2ludGVyIGZpbGVkZXM7CS8qIHN0cnVjdCBwb2xsZmQgY2FjaGUgZm9yIF9YV2FpdEZvclJlYWRhYmxlICovCisJaW50ICgqc2F2ZWRzeW5jaGFuZGxlcikoIC8qIHVzZXIgc3luY2hhbmRsZXIgd2hlbiBYbGliIHVzdXJwcyAqLworCQlEaXNwbGF5ICoJLyogZHB5ICovCisJCSk7CisJWElEIHJlc291cmNlX21heDsJLyogYWxsb2NhdG9yIG1heCBJRCAqLworCWludCB4Y21pc2Nfb3Bjb2RlOwkvKiBtYWpvciBvcGNvZGUgZm9yIFhDLU1JU0MgKi8KKwlzdHJ1Y3QgX1hrYkluZm9SZWMgKnhrYl9pbmZvOyAvKiBYS0IgaW5mbyAqLworCXN0cnVjdCBfWHRyYW5zQ29ubkluZm8gKnRyYW5zX2Nvbm47IC8qIHRyYW5zcG9ydCBjb25uZWN0aW9uIG9iamVjdCAqLworCXN0cnVjdCBfWDExWENCUHJpdmF0ZSAqeGNiOyAvKiBYQ0IgZ2x1ZSBwcml2YXRlIGRhdGEgKi8KKworCS8qIEdlbmVyaWMgZXZlbnQgY29va2llIGhhbmRsaW5nICovCisJdW5zaWduZWQgaW50IG5leHRfY29va2llOyAvKiBuZXh0IGV2ZW50IGNvb2tpZSAqLworCS8qIHZlY3RvciBmb3Igd2lyZSB0byBnZW5lcmljIGV2ZW50LCBpbmRleCBpcyAoZXh0ZW5zaW9uIC0gMTI4KSAqLworCUJvb2wgKCpnZW5lcmljX2V2ZW50X3ZlY1sxMjhdKSgKKwkJRGlzcGxheSAqCS8qIGRweSAqLywKKwkJWEdlbmVyaWNFdmVudENvb2tpZSAqCS8qIFhsaWIgZXZlbnQgKi8sCisJCXhFdmVudCAqCS8qIHdpcmUgZXZlbnQgKi8pOworCS8qIHZlY3RvciBmb3IgZXZlbnQgY29weSwgaW5kZXggaXMgKGV4dGVuc2lvbiAtIDEyOCkgKi8KKwlCb29sICgqZ2VuZXJpY19ldmVudF9jb3B5X3ZlY1sxMjhdKSgKKwkJRGlzcGxheSAqCS8qIGRweSAqLywKKwkJWEdlbmVyaWNFdmVudENvb2tpZSAqCS8qIGluICovLAorCQlYR2VuZXJpY0V2ZW50Q29va2llICogICAvKiBvdXQqLyk7CisJdm9pZCAqY29va2llamFyOyAgLyogY29va2llIGV2ZW50cyByZXR1cm5lZCBidXQgbm90IGNsYWltZWQgKi8KK307CisKKyNkZWZpbmUgWEFsbG9jSURzKGRweSxpZHMsbikgKCooZHB5KS0+aWRsaXN0X2FsbG9jKShkcHksaWRzLG4pCisKKy8qCisgKiBkZWZpbmUgdGhlIGZvbGxvd2luZyBpZiB5b3Ugd2FudCB0aGUgRGF0YSBtYWNybyB0byBiZSBhIHByb2NlZHVyZSBpbnN0ZWFkCisgKi8KKyNpZmRlZiBDUkFZCisjZGVmaW5lIERhdGFSb3V0aW5lSXNQcm9jZWR1cmUKKyNlbmRpZiAvKiBDUkFZICovCisKKyNpZm5kZWYgX1hFVkVOVF8KKy8qCisgKiBfUUV2ZW50IGRhdGF0eXBlIGZvciB1c2UgaW4gaW5wdXQgcXVldWVpbmcuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9YU1FFdmVudAoreworICAgIHN0cnVjdCBfWFNRRXZlbnQgKm5leHQ7CisgICAgWEV2ZW50IGV2ZW50OworICAgIHVuc2lnbmVkIGxvbmcgcXNlcmlhbF9udW07CS8qIHNvIG11bHRpLXRocmVhZGVkIGNvZGUgY2FuIGZpbmQgbmV3IG9uZXMgKi8KK30gX1hRRXZlbnQ7CisjZW5kaWYKKworI2luY2x1ZGUgPFgxMS9YcHJvdG8uaD4KKyNpZmRlZiBfX3NnaQorI2RlZmluZSBfU0dJX01QX1NPVVJDRSAgLyogdHVybiB0aGlzIG9uIHRvIGdldCBNUCBzYWZlIGVycm5vICovCisjZW5kaWYKKyNpbmNsdWRlIDxlcnJuby5oPgorI2RlZmluZSBfWEJDT1BZRlVOQyBfWGJjb3B5CisjaW5jbHVkZSA8WDExL1hmdW5jcy5oPgorI2luY2x1ZGUgPFgxMS9Yb3NkZWZzLmg+CisKKy8qIFV0ZWsgbGVhdmVzIGtlcm5lbCBtYWNyb3MgYXJvdW5kIGluIGluY2x1ZGUgZmlsZXMgKGJsZWFoKSAqLworI2lmZGVmIGRpcnR5CisjdW5kZWYgZGlydHkKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorCitfWEZVTkNQUk9UT0JFR0lOCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGNhbiBiZSB1c2VkIGZvciBsb2NraW5nIHJlcXVlc3RzIGluIG11bHRpLXRocmVhZGVkCisgKiBhZGRyZXNzIHNwYWNlcy4KKyAqLworI2lmZGVmIFhUSFJFQURTCisvKiBBdXRob3I6IFN0ZXBoZW4gR2lsZGVhLCBNSVQgWCBDb25zb3J0aXVtCisgKgorICogZGVjbGFyYXRpb25zIGZvciBDIFRocmVhZHMgbG9ja2luZworICovCisKK3R5cGVkZWYgc3RydWN0IF9Mb2NrSW5mb1JlYyAqTG9ja0luZm9QdHI7CisKKy8qIGludGVyZmFjZXMgZm9yIGxvY2tpbmcuYyAqLworc3RydWN0IF9YTG9ja1B0cnMgeworICAgIC8qIHVzZWQgYnkgYWxsLCBpbmNsdWRpbmcgZXh0ZW5zaW9uczsgZG8gbm90IG1vdmUgKi8KKyAgICB2b2lkICgqbG9ja19kaXNwbGF5KSgKKwkJRGlzcGxheSAqZHB5CisjaWYgZGVmaW5lZChYVEhSRUFEU19XQVJOKSB8fCBkZWZpbmVkKFhUSFJFQURTX0ZJTEVfTElORSkKKwkJLCBjaGFyICpmaWxlCisJCSwgaW50IGxpbmUKKyNlbmRpZgorCSk7CisgICAgdm9pZCAoKnVubG9ja19kaXNwbGF5KSgKKwkJRGlzcGxheSAqZHB5CisjaWYgZGVmaW5lZChYVEhSRUFEU19XQVJOKSB8fCBkZWZpbmVkKFhUSFJFQURTX0ZJTEVfTElORSkKKwkJLCBjaGFyICpmaWxlCisJCSwgaW50IGxpbmUKKyNlbmRpZgorCSk7Cit9OworCisjaWYgZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoX1hMSUJJTlRfKQorI2RlZmluZSBfWENyZWF0ZU11dGV4X2ZuICgqX1hDcmVhdGVNdXRleF9mbl9wKQorI2RlZmluZSBfWEZyZWVNdXRleF9mbiAoKl9YRnJlZU11dGV4X2ZuX3ApCisjZGVmaW5lIF9YTG9ja011dGV4X2ZuICgqX1hMb2NrTXV0ZXhfZm5fcCkKKyNkZWZpbmUgX1hVbmxvY2tNdXRleF9mbiAoKl9YVW5sb2NrTXV0ZXhfZm5fcCkKKyNkZWZpbmUgX1hnbG9iYWxfbG9jayAoKl9YZ2xvYmFsX2xvY2tfcCkKKyNlbmRpZgorCisvKiBpbiBYbGliSW50LmMgKi8KK2V4dGVybiB2b2lkICgqX1hDcmVhdGVNdXRleF9mbikoCisgICAgTG9ja0luZm9QdHIgLyogbG9jayAqLworKTsKK2V4dGVybiB2b2lkICgqX1hGcmVlTXV0ZXhfZm4pKAorICAgIExvY2tJbmZvUHRyIC8qIGxvY2sgKi8KKyk7CitleHRlcm4gdm9pZCAoKl9YTG9ja011dGV4X2ZuKSgKKyAgICBMb2NrSW5mb1B0cgkvKiBsb2NrICovCisjaWYgZGVmaW5lZChYVEhSRUFEU19XQVJOKSB8fCBkZWZpbmVkKFhUSFJFQURTX0ZJTEVfTElORSkKKyAgICAsIGNoYXIgKiAvKiBmaWxlICovCisgICAgLCBpbnQgLyogbGluZSAqLworI2VuZGlmCispOworZXh0ZXJuIHZvaWQgKCpfWFVubG9ja011dGV4X2ZuKSgKKyAgICBMb2NrSW5mb1B0cgkvKiBsb2NrICovCisjaWYgZGVmaW5lZChYVEhSRUFEU19XQVJOKSB8fCBkZWZpbmVkKFhUSFJFQURTX0ZJTEVfTElORSkKKyAgICAsIGNoYXIgKiAvKiBmaWxlICovCisgICAgLCBpbnQgLyogbGluZSAqLworI2VuZGlmCispOworCitleHRlcm4gTG9ja0luZm9QdHIgX1hnbG9iYWxfbG9jazsKKworI2lmIGRlZmluZWQoWFRIUkVBRFNfV0FSTikgfHwgZGVmaW5lZChYVEhSRUFEU19GSUxFX0xJTkUpCisjZGVmaW5lIExvY2tEaXNwbGF5KGQpCSAgICAgaWYgKChkKS0+bG9ja19mbnMpICgqKGQpLT5sb2NrX2Zucy0+bG9ja19kaXNwbGF5KSgoZCksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIFVubG9ja0Rpc3BsYXkoZCkgICAgIGlmICgoZCktPmxvY2tfZm5zKSAoKihkKS0+bG9ja19mbnMtPnVubG9ja19kaXNwbGF5KSgoZCksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIF9YTG9ja011dGV4KGxvY2spCQlpZiAoX1hMb2NrTXV0ZXhfZm4pICgqX1hMb2NrTXV0ZXhfZm4pKGxvY2ssX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIF9YVW5sb2NrTXV0ZXgobG9jaykJaWYgKF9YVW5sb2NrTXV0ZXhfZm4pICgqX1hVbmxvY2tNdXRleF9mbikobG9jayxfX0ZJTEVfXyxfX0xJTkVfXykKKyNlbHNlCisvKiB1c2VkIGV2ZXJ5d2hlcmUsIHNvIG11c3QgYmUgZmFzdCBpZiBub3QgdXNpbmcgdGhyZWFkcyAqLworI2RlZmluZSBMb2NrRGlzcGxheShkKQkgICAgIGlmICgoZCktPmxvY2tfZm5zKSAoKihkKS0+bG9ja19mbnMtPmxvY2tfZGlzcGxheSkoZCkKKyNkZWZpbmUgVW5sb2NrRGlzcGxheShkKSAgICAgaWYgKChkKS0+bG9ja19mbnMpICgqKGQpLT5sb2NrX2Zucy0+dW5sb2NrX2Rpc3BsYXkpKGQpCisjZGVmaW5lIF9YTG9ja011dGV4KGxvY2spCQlpZiAoX1hMb2NrTXV0ZXhfZm4pICgqX1hMb2NrTXV0ZXhfZm4pKGxvY2spCisjZGVmaW5lIF9YVW5sb2NrTXV0ZXgobG9jaykJaWYgKF9YVW5sb2NrTXV0ZXhfZm4pICgqX1hVbmxvY2tNdXRleF9mbikobG9jaykKKyNlbmRpZgorI2RlZmluZSBfWENyZWF0ZU11dGV4KGxvY2spCWlmIChfWENyZWF0ZU11dGV4X2ZuKSAoKl9YQ3JlYXRlTXV0ZXhfZm4pKGxvY2spOworI2RlZmluZSBfWEZyZWVNdXRleChsb2NrKQlpZiAoX1hGcmVlTXV0ZXhfZm4pICgqX1hGcmVlTXV0ZXhfZm4pKGxvY2spOworCisjZWxzZSAvKiBYVEhSRUFEUyAqLworI2RlZmluZSBMb2NrRGlzcGxheShkaXMpCisjZGVmaW5lIF9YTG9ja011dGV4KGxvY2spCisjZGVmaW5lIF9YVW5sb2NrTXV0ZXgobG9jaykKKyNkZWZpbmUgVW5sb2NrRGlzcGxheShkaXMpCisjZGVmaW5lIF9YQ3JlYXRlTXV0ZXgobG9jaykKKyNkZWZpbmUgX1hGcmVlTXV0ZXgobG9jaykKKyNlbmRpZgorCisjZGVmaW5lIFhmcmVlKHB0cikgZnJlZSgocHRyKSkKKworLyoKKyAqIE5vdGUgdGhhdCBzb21lIG1hY2hpbmVzIGRvIG5vdCByZXR1cm4gYSB2YWxpZCBwb2ludGVyIGZvciBtYWxsb2MoMCksIGluCisgKiB3aGljaCBjYXNlIHdlIHByb3ZpZGUgYW4gYWx0ZXJuYXRlIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZQorICogZGVmaW5lIE1BTExPQ18wX1JFVFVSTlNfTlVMTC4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc29tZQorICogWGxpYiBjb2RlIGV4cGVjdHMgbWFsbG9jKDApIHRvIHJldHVybiBhIHZhbGlkIHBvaW50ZXIgdG8gc3RvcmFnZS4KKyAqLworI2lmIGRlZmluZWQoTUFMTE9DXzBfUkVUVVJOU19OVUxMKSB8fCBkZWZpbmVkKF9fY2xhbmdfYW5hbHl6ZXJfXykKKworIyBkZWZpbmUgWG1hbGxvYyhzaXplKSBtYWxsb2MoKChzaXplKSA9PSAwID8gMSA6IChzaXplKSkpCisjIGRlZmluZSBYcmVhbGxvYyhwdHIsIHNpemUpIHJlYWxsb2MoKHB0ciksICgoc2l6ZSkgPT0gMCA/IDEgOiAoc2l6ZSkpKQorIyBkZWZpbmUgWGNhbGxvYyhuZWxlbSwgZWxzaXplKSBjYWxsb2MoKChuZWxlbSkgPT0gMCA/IDEgOiAobmVsZW0pKSwgKGVsc2l6ZSkpCisKKyNlbHNlCisKKyMgZGVmaW5lIFhtYWxsb2Moc2l6ZSkgbWFsbG9jKChzaXplKSkKKyMgZGVmaW5lIFhyZWFsbG9jKHB0ciwgc2l6ZSkgcmVhbGxvYygocHRyKSwgKHNpemUpKQorIyBkZWZpbmUgWGNhbGxvYyhuZWxlbSwgZWxzaXplKSBjYWxsb2MoKG5lbGVtKSwgKGVsc2l6ZSkpCisKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNkZWZpbmUgTE9DS0VEIDEKKyNkZWZpbmUgVU5MT0NLRUQgMAorCisjaWZuZGVmIEJVRlNJWkUKKyNkZWZpbmUgQlVGU0laRSAyMDQ4CQkJLyogWCBvdXRwdXQgYnVmZmVyIHNpemUuICovCisjZW5kaWYKKyNpZm5kZWYgUFRTUEVSQkFUQ0gKKyNkZWZpbmUgUFRTUEVSQkFUQ0ggMTAyNAkJLyogcG9pbnQgYmF0Y2hpbmcgKi8KKyNlbmRpZgorI2lmbmRlZiBXTE5TUEVSQkFUQ0gKKyNkZWZpbmUgV0xOU1BFUkJBVENIIDUwCQkJLyogd2lkZSBsaW5lIGJhdGNoaW5nICovCisjZW5kaWYKKyNpZm5kZWYgWkxOU1BFUkJBVENICisjZGVmaW5lIFpMTlNQRVJCQVRDSCAxMDI0CQkvKiB0aGluIGxpbmUgYmF0Y2hpbmcgKi8KKyNlbmRpZgorI2lmbmRlZiBXUkNUU1BFUkJBVENICisjZGVmaW5lIFdSQ1RTUEVSQkFUQ0ggMTAJCS8qIHdpZGUgbGluZSByZWN0YW5nbGUgYmF0Y2hpbmcgKi8KKyNlbmRpZgorI2lmbmRlZiBaUkNUU1BFUkJBVENICisjZGVmaW5lIFpSQ1RTUEVSQkFUQ0ggMjU2CQkvKiB0aGluIGxpbmUgcmVjdGFuZ2xlIGJhdGNoaW5nICovCisjZW5kaWYKKyNpZm5kZWYgRlJDVFNQRVJCQVRDSAorI2RlZmluZSBGUkNUU1BFUkJBVENIIDI1NgkJLyogZmlsbGVkIHJlY3RhbmdsZSBiYXRjaGluZyAqLworI2VuZGlmCisjaWZuZGVmIEZBUkNTUEVSQkFUQ0gKKyNkZWZpbmUgRkFSQ1NQRVJCQVRDSCAyNTYJCS8qIGZpbGxlZCBhcmMgYmF0Y2hpbmcgKi8KKyNlbmRpZgorI2lmbmRlZiBDVVJTT1JGT05UCisjZGVmaW5lIENVUlNPUkZPTlQgImN1cnNvciIJCS8qIHN0YW5kYXJkIGN1cnNvciBmb250cyAqLworI2VuZGlmCisKKy8qCisgKiBEaXNwbGF5IGZsYWdzCisgKi8KKyNkZWZpbmUgWGxpYkRpc3BsYXlJT0Vycm9yCSgxTCA8PCAwKQorI2RlZmluZSBYbGliRGlzcGxheUNsb3NpbmcJKDFMIDw8IDEpCisjZGVmaW5lIFhsaWJEaXNwbGF5Tm9Ya2IJKDFMIDw8IDIpCisjZGVmaW5lIFhsaWJEaXNwbGF5UHJpdlN5bmMJKDFMIDw8IDMpCisjZGVmaW5lIFhsaWJEaXNwbGF5UHJvY0Nvbm5pCSgxTCA8PCA0KSAvKiBpbiBfWFByb2Nlc3NJbnRlcm5hbENvbm5lY3Rpb24gKi8KKyNkZWZpbmUgWGxpYkRpc3BsYXlSZWFkRXZlbnRzCSgxTCA8PCA1KSAvKiBpbiBfWFJlYWRFdmVudHMgKi8KKyNkZWZpbmUgWGxpYkRpc3BsYXlSZXBseQkoMUwgPDwgNSkgLyogaW4gX1hSZXBseSAqLworI2RlZmluZSBYbGliRGlzcGxheVdyaXRpbmcJKDFMIDw8IDYpIC8qIGluIF9YRmx1c2hJbnQsIF9YU2VuZCAqLworI2RlZmluZSBYbGliRGlzcGxheURmbHRSTURCICAgICAoMUwgPDwgNykgLyogbWFyayBpZiBSTSBkYiBmcm9tIFhHZXREZWZhdWx0ICovCisKKy8qCisgKiBYIFByb3RvY29sIHBhY2tldGl6aW5nIG1hY3Jvcy4KKyAqLworCisvKiAgIE5lZWQgdG8gc3RhcnQgcmVxdWVzdHMgb24gNjQgYml0IHdvcmQgYm91bmRhcmllcworICogICBvbiBhIENSQVkgY29tcHV0ZXIgc28gYWRkIGEgTm9PcCAoMTI3KSBpZiBuZWVkZWQuCisgKiAgIEEgY2hhcmFjdGVyIHBvaW50ZXIgb24gYSBDUkFZIGNvbXB1dGVyIHdpbGwgYmUgbm9uLXplcm8KKyAqICAgYWZ0ZXIgc2hpZnRpbmcgcmlnaHQgNjEgYml0cyBvZiBpdCBpcyBub3QgcG9pbnRpbmcgdG8KKyAqICAgYSB3b3JkIGJvdW5kYXJ5LgorICovCisjaWZkZWYgV09SRDY0CisjZGVmaW5lIFdPUkQ2NEFMSUdOIGlmICgobG9uZylkcHktPmJ1ZnB0ciA+PiA2MSkge1wKKyAgICAgICAgICAgZHB5LT5sYXN0X3JlcSA9IGRweS0+YnVmcHRyO1wKKyAgICAgICAgICAgKihkcHktPmJ1ZnB0cikgICA9IFhfTm9PcGVyYXRpb247XAorICAgICAgICAgICAqKGRweS0+YnVmcHRyKzEpID0gIDA7XAorICAgICAgICAgICAqKGRweS0+YnVmcHRyKzIpID0gIDA7XAorICAgICAgICAgICAqKGRweS0+YnVmcHRyKzMpID0gIDE7XAorICAgICAgICAgICAgIGRweS0+cmVxdWVzdCsrO1wKKyAgICAgICAgICAgICBkcHktPmJ1ZnB0ciArPSA0O1wKKyAgICAgICAgIH0KKyNlbHNlIC8qIGVsc2UgZG9lcyBub3QgcmVxdWlyZSBhbGlnbm1lbnQgb24gNjQtYml0IGJvdW5kYXJpZXMgKi8KKyNkZWZpbmUgV09SRDY0QUxJR04KKyNlbmRpZiAvKiBXT1JENjQgKi8KKworLyoqCisgKiBSZXR1cm4gYSBsZW4tc2l6ZWQgcmVxdWVzdCBidWZmZXIgZm9yIHRoZSByZXF1ZXN0IHR5cGUuIFRoaXMgZnVuY3Rpb24gbWF5CisgKiBmbHVzaCB0aGUgb3V0cHV0IHF1ZXVlLgorICoKKyAqIEBwYXJhbSBkcHkgVGhlIGRpc3BsYXkgY29ubmVjdGlvbgorICogQHBhcmFtIHR5cGUgVGhlIHJlcXVlc3QgdHlwZQorICogQHBhcmFtIGxlbiBMZW5ndGggb2YgdGhlIHJlcXVlc3QgaW4gYnl0ZXMKKyAqCisgKiBAcmV0dXJucyBBIHBvaW50ZXIgdG8gdGhlIHJlcXVlc3QgYnVmZmVyIHdpdGggYSBmZXcgZGVmYXVsdCB2YWx1ZXMKKyAqIGluaXRpYWxpemVkLgorICovCitleHRlcm4gdm9pZCAqX1hHZXRSZXF1ZXN0KERpc3BsYXkgKmRweSwgQ0FSRDggdHlwZSwgc2l6ZV90IGxlbik7CisKKy8qIEdldFJlcVNpemVkIGlzIHRoZSBzYW1lIGFzIEdldFJlcSBidXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3BlY2lmeSB0aGUKKyAqIHNpemUgaW4gYnl0ZXMuICdzeicgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQhICovCisKKyNpZiAhZGVmaW5lZChVTklYQ1BQKSB8fCBkZWZpbmVkKEFOU0lDUFApCisjZGVmaW5lIEdldFJlcVNpemVkKG5hbWUsIHN6LCByZXEpIFwKKwlyZXEgPSAoeCMjbmFtZSMjUmVxICopIF9YR2V0UmVxdWVzdChkcHksIFhfIyNuYW1lLCBzeikKKyNlbHNlCisjZGVmaW5lIEdldFJlcVNpemVkKG5hbWUsIHN6LCByZXEpIFwKKwlyZXEgPSAoeC8qKi9uYW1lLyoqL1JlcSAqKSBfWEdldFJlcXVlc3QoZHB5LCBYXy8qKi9uYW1lLCBzeikKKyNlbmRpZgorCisKKy8qCisgKiBHZXRSZXEgLSBHZXQgdGhlIG5leHQgYXZhaWxhYmxlIFggcmVxdWVzdCBwYWNrZXQgaW4gdGhlIGJ1ZmZlciBhbmQKKyAqIHJldHVybiBpdC4KKyAqCisgKiAibmFtZSIgaXMgdGhlIG5hbWUgb2YgdGhlIHJlcXVlc3QsIGUuZy4gQ3JlYXRlUGl4bWFwLCBPcGVuRm9udCwgZXRjLgorICogInJlcSIgaXMgdGhlIG5hbWUgb2YgdGhlIHJlcXVlc3QgcG9pbnRlci4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkKFVOSVhDUFApIHx8IGRlZmluZWQoQU5TSUNQUCkKKyNkZWZpbmUgR2V0UmVxKG5hbWUsIHJlcSkgXAorCUdldFJlcVNpemVkKG5hbWUsIFNJWkVPRih4IyNuYW1lIyNSZXEpLCByZXEpCisjZWxzZSAgLyogbm9uLUFOU0kgQyB1c2VzIGVtcHR5IGNvbW1lbnQgaW5zdGVhZCBvZiAiIyMiIGZvciB0b2tlbiBjb25jYXRlbmF0aW9uICovCisjZGVmaW5lIEdldFJlcShuYW1lLCByZXEpIFwKKwlHZXRSZXFTaXplZChuYW1lLCBTSVpFT0YoeC8qKi9uYW1lLyoqL1JlcSksIHJlcSkKKyNlbmRpZgorCisvKiBHZXRSZXFFeHRyYSBpcyB0aGUgc2FtZSBhcyBHZXRSZXEsIGJ1dCBhbGxvY2F0ZXMgIm4iIGFkZGl0aW9uYWwKKyAgIGJ5dGVzIGFmdGVyIHRoZSByZXF1ZXN0LiAibiIgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQhICAqLworCisjaWYgIWRlZmluZWQoVU5JWENQUCkgfHwgZGVmaW5lZChBTlNJQ1BQKQorI2RlZmluZSBHZXRSZXFFeHRyYShuYW1lLCBuLCByZXEpIFwKKyAgICAgICAgR2V0UmVxU2l6ZWQobmFtZSwgU0laRU9GKHgjI25hbWUjI1JlcSkgKyBuLCByZXEpCisjZWxzZQorI2RlZmluZSBHZXRSZXFFeHRyYShuYW1lLCBuLCByZXEpIFwKKyAgICAgICAgR2V0UmVxU2l6ZWQobmFtZSwgU0laRU9GKHgvKiovbmFtZS8qKi9SZXEpICsgbiwgcmVxKQorI2VuZGlmCisKKworLyoKKyAqIEdldFJlc1JlcSBpcyBmb3IgdGhvc2UgcmVxdWVzdHMgdGhhdCBoYXZlIGEgcmVzb3VyY2UgSUQKKyAqIChXaW5kb3csIFBpeG1hcCwgR0NvbnRleHQsIGV0Yy4pIGFzIHRoZWlyIHNpbmdsZSBhcmd1bWVudC4KKyAqICJyaWQiIGlzIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4KKyAqLworCisjaWYgIWRlZmluZWQoVU5JWENQUCkgfHwgZGVmaW5lZChBTlNJQ1BQKQorI2RlZmluZSBHZXRSZXNSZXEobmFtZSwgcmlkLCByZXEpIFwKKwlyZXEgPSAoeFJlc291cmNlUmVxICopIF9YR2V0UmVxdWVzdChkcHksIFhfIyNuYW1lLCBTSVpFT0YoeFJlc291cmNlUmVxKSk7IFwKKwlyZXEtPmlkID0gKHJpZCkKKyNlbHNlCisjZGVmaW5lIEdldFJlc1JlcShuYW1lLCByaWQsIHJlcSkgXAorCXJlcSA9ICh4UmVzb3VyY2VSZXEgKikgX1hHZXRSZXF1ZXN0KGRweSwgWF8vKiovbmFtZSwgU0laRU9GKHhSZXNvdXJjZVJlcSkpOyBcCisJcmVxLT5pZCA9IChyaWQpCisjZW5kaWYKKworLyoKKyAqIEdldEVtcHR5UmVxIGlzIGZvciB0aG9zZSByZXF1ZXN0cyB0aGF0IGhhdmUgbm8gYXJndW1lbnRzCisgKiBhdCBhbGwuCisgKi8KKyNpZiAhZGVmaW5lZChVTklYQ1BQKSB8fCBkZWZpbmVkKEFOU0lDUFApCisjZGVmaW5lIEdldEVtcHR5UmVxKG5hbWUsIHJlcSkgXAorCXJlcSA9ICh4UmVxICopIF9YR2V0UmVxdWVzdChkcHksIFhfIyNuYW1lLCBTSVpFT0YoeFJlcSkpCisjZWxzZQorI2RlZmluZSBHZXRFbXB0eVJlcShuYW1lLCByZXEpIFwKKwlyZXEgPSAoeFJlcSAqKSBfWEdldFJlcXVlc3QoZHB5LCBYXy8qKi9uYW1lLCBTSVpFT0YoeFJlcSkpCisjZW5kaWYKKworI2lmZGVmIFdPUkQ2NAorI2RlZmluZSBNYWtlQmlnUmVxKHJlcSxuKSBcCisgICAgeyBcCisgICAgY2hhciBfQlJkYXRbNF07IFwKKyAgICB1bnNpZ25lZCBsb25nIF9CUmxlbiA9IHJlcS0+bGVuZ3RoIC0gMTsgXAorICAgIHJlcS0+bGVuZ3RoID0gMDsgXAorICAgIG1lbWNweShfQlJkYXQsICgoY2hhciAqKXJlcSkgKyAoX0JSbGVuIDw8IDIpLCA0KTsgXAorICAgIG1lbW1vdmUoKChjaGFyICopcmVxKSArIDgsICgoY2hhciAqKXJlcSkgKyA0LCBfQlJsZW4gPDwgMik7IFwKKyAgICBtZW1jcHkoKChjaGFyICopcmVxKSArIDQsIF9CUmRhdCwgNCk7IFwKKyAgICBEYXRhMzIoZHB5LCAobG9uZyAqKSZfQlJkYXQsIDQpOyBcCisgICAgfQorI2Vsc2UKKyNpZmRlZiBMT05HNjQKKyNkZWZpbmUgTWFrZUJpZ1JlcShyZXEsbikgXAorICAgIHsgXAorICAgIENBUkQ2NCBfQlJkYXQ7IFwKKyAgICBDQVJEMzIgX0JSbGVuID0gcmVxLT5sZW5ndGggLSAxOyBcCisgICAgcmVxLT5sZW5ndGggPSAwOyBcCisgICAgX0JSZGF0ID0gKChDQVJEMzIgKilyZXEpW19CUmxlbl07IFwKKyAgICBtZW1tb3ZlKCgoY2hhciAqKXJlcSkgKyA4LCAoKGNoYXIgKilyZXEpICsgNCwgX0JSbGVuIDw8IDIpOyBcCisgICAgKChDQVJEMzIgKilyZXEpWzFdID0gX0JSbGVuICsgbiArIDI7IFwKKyAgICBEYXRhMzIoZHB5LCAmX0JSZGF0LCA0KTsgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE1ha2VCaWdSZXEocmVxLG4pIFwKKyAgICB7IFwKKyAgICBDQVJEMzIgX0JSZGF0OyBcCisgICAgQ0FSRDMyIF9CUmxlbiA9IHJlcS0+bGVuZ3RoIC0gMTsgXAorICAgIHJlcS0+bGVuZ3RoID0gMDsgXAorICAgIF9CUmRhdCA9ICgoQ0FSRDMyICopcmVxKVtfQlJsZW5dOyBcCisgICAgbWVtbW92ZSgoKGNoYXIgKilyZXEpICsgOCwgKChjaGFyICopcmVxKSArIDQsIF9CUmxlbiA8PCAyKTsgXAorICAgICgoQ0FSRDMyICopcmVxKVsxXSA9IF9CUmxlbiArIG4gKyAyOyBcCisgICAgRGF0YTMyKGRweSwgJl9CUmRhdCwgNCk7IFwKKyAgICB9CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9fY2xhbmdfYW5hbHl6ZXJfXworI2RlZmluZSBTZXRSZXFMZW4ocmVxLG4sYmFkbGVuKSBcCisgICAgaWYgKChyZXEtPmxlbmd0aCArIG4pID4gKHVuc2lnbmVkKTY1NTM1KSB7IFwKKwlpZiAoZHB5LT5iaWdyZXFfc2l6ZSkgeyBcCisJICAgIE1ha2VCaWdSZXEocmVxLG4pIFwKKwl9IGVsc2UgeyBcCisJICAgIG4gPSBiYWRsZW47IFwKKwkgICAgcmVxLT5sZW5ndGggKz0gbjsgXAorCX0gXAorICAgIH0gZWxzZSBcCisJcmVxLT5sZW5ndGggKz0gbgorI2Vsc2UKKyNkZWZpbmUgU2V0UmVxTGVuKHJlcSxuLGJhZGxlbikgXAorICAgIHJlcS0+bGVuZ3RoICs9IG4KKyNlbmRpZgorCisjZGVmaW5lIFN5bmNIYW5kbGUoKSBcCisJaWYgKGRweS0+c3luY2hhbmRsZXIpICgqZHB5LT5zeW5jaGFuZGxlcikoZHB5KQorCitleHRlcm4gdm9pZCBfWEZsdXNoR0NDYWNoZShEaXNwbGF5ICpkcHksIEdDIGdjKTsKKyNkZWZpbmUgRmx1c2hHQyhkcHksIGdjKSBcCisJaWYgKChnYyktPmRpcnR5KSBfWEZsdXNoR0NDYWNoZSgoZHB5KSwgKGdjKSkKKy8qCisgKiBEYXRhIC0gUGxhY2UgZGF0YSBpbiB0aGUgYnVmZmVyIGFuZCBwYWQgdGhlIGVuZCB0byBwcm92aWRlCisgKiAzMiBiaXQgd29yZCBhbGlnbm1lbnQuICBUcmFuc21pdCBpZiB0aGUgYnVmZmVyIGZpbGxzLgorICoKKyAqICJkcHkiIGlzIGEgcG9pbnRlciB0byBhIERpc3BsYXkuCisgKiAiZGF0YSIgaXMgYSBwaW50ZXIgdG8gYSBkYXRhIGJ1ZmZlci4KKyAqICJsZW4iIGlzIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgYnVmZmVyLgorICovCisjaWZuZGVmIERhdGFSb3V0aW5lSXNQcm9jZWR1cmUKKyNkZWZpbmUgRGF0YShkcHksIGRhdGEsIGxlbikge1wKKwlpZiAoZHB5LT5idWZwdHIgKyAobGVuKSA8PSBkcHktPmJ1Zm1heCkge1wKKwkJbWVtY3B5KGRweS0+YnVmcHRyLCBkYXRhLCAoaW50KWxlbik7XAorCQlkcHktPmJ1ZnB0ciArPSAoKGxlbikgKyAzKSAmIH4zO1wKKwl9IGVsc2VcCisJCV9YU2VuZChkcHksIGRhdGEsIGxlbik7XAorCX0KKyNlbmRpZiAvKiBEYXRhUm91dGluZUlzUHJvY2VkdXJlICovCisKKworLyogQWxsb2NhdGUgYnl0ZXMgZnJvbSB0aGUgYnVmZmVyLiAgTm8gcGFkZGluZyBpcyBkb25lLCBzbyBpZgorICogdGhlIGxlbmd0aCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LCB0aGUgY2FsbGVyIG11c3QgYmUKKyAqIGNhcmVmdWwgdG8gbGVhdmUgdGhlIGJ1ZmZlciBhbGlnbmVkIGFmdGVyIHNlbmRpbmcgdGhlCisgKiBjdXJyZW50IHJlcXVlc3QuCisgKgorICogInR5cGUiIGlzIHRoZSB0eXBlIG9mIHRoZSBwb2ludGVyIGJlaW5nIGFzc2lnbmVkIHRvLgorICogInB0ciIgaXMgdGhlIHBvaW50ZXIgYmVpbmcgYXNzaWduZWQgdG8uCisgKiAibiIgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZS4KKyAqCisgKiBFeGFtcGxlOgorICogICAgeFRleHRFbHQgKmVsdDsKKyAqICAgIEJ1ZkFsbG9jICh4VGV4dEVsdCAqLCBlbHQsIG5ieXRlcykKKyAqLworCisjZGVmaW5lIEJ1ZkFsbG9jKHR5cGUsIHB0ciwgbikgXAorICAgIGlmIChkcHktPmJ1ZnB0ciArIChuKSA+IGRweS0+YnVmbWF4KSBcCisgICAgICAgIF9YRmx1c2ggKGRweSk7IFwKKyAgICBwdHIgPSAodHlwZSkgZHB5LT5idWZwdHI7IFwKKyAgICBtZW1zZXQocHRyLCAnXDAnLCBuKTsgXAorICAgIGRweS0+YnVmcHRyICs9IChuKTsKKworI2lmZGVmIFdPUkQ2NAorI2RlZmluZSBEYXRhMTYoZHB5LCBkYXRhLCBsZW4pIF9YRGF0YTE2KGRweSwgKHNob3J0ICopZGF0YSwgbGVuKQorI2RlZmluZSBEYXRhMzIoZHB5LCBkYXRhLCBsZW4pIF9YRGF0YTMyKGRweSwgKGxvbmcgKilkYXRhLCBsZW4pCisjZWxzZQorI2RlZmluZSBEYXRhMTYoZHB5LCBkYXRhLCBsZW4pIERhdGEoKGRweSksIChjaGFyICopKGRhdGEpLCAobGVuKSkKKyNkZWZpbmUgX1hSZWFkMTZQYWQoZHB5LCBkYXRhLCBsZW4pIF9YUmVhZFBhZCgoZHB5KSwgKGNoYXIgKikoZGF0YSksIChsZW4pKQorI2RlZmluZSBfWFJlYWQxNihkcHksIGRhdGEsIGxlbikgX1hSZWFkKChkcHkpLCAoY2hhciAqKShkYXRhKSwgKGxlbikpCisjaWZkZWYgTE9ORzY0CisjZGVmaW5lIERhdGEzMihkcHksIGRhdGEsIGxlbikgX1hEYXRhMzIoZHB5LCAobG9uZyAqKWRhdGEsIGxlbikKK2V4dGVybiBpbnQgX1hEYXRhMzIoCisJICAgICBEaXNwbGF5ICpkcHksCisJICAgICByZWdpc3RlciBsb25nICpkYXRhLAorCSAgICAgdW5zaWduZWQgbGVuCispOworZXh0ZXJuIHZvaWQgX1hSZWFkMzIoCisJICAgICBEaXNwbGF5ICpkcHksCisJICAgICByZWdpc3RlciBsb25nICpkYXRhLAorCSAgICAgbG9uZyBsZW4KKyk7CisjZWxzZQorI2RlZmluZSBEYXRhMzIoZHB5LCBkYXRhLCBsZW4pIERhdGEoKGRweSksIChjaGFyICopKGRhdGEpLCAobGVuKSkKKyNkZWZpbmUgX1hSZWFkMzIoZHB5LCBkYXRhLCBsZW4pIF9YUmVhZCgoZHB5KSwgKGNoYXIgKikoZGF0YSksIChsZW4pKQorI2VuZGlmCisjZW5kaWYgLyogbm90IFdPUkQ2NCAqLworCisjZGVmaW5lIFBhY2tEYXRhMTYoZHB5LGRhdGEsbGVuKSBEYXRhMTYgKGRweSwgZGF0YSwgbGVuKQorI2RlZmluZSBQYWNrRGF0YTMyKGRweSxkYXRhLGxlbikgRGF0YTMyIChkcHksIGRhdGEsIGxlbikKKworLyogWGxpYiBtYW51YWwgaXMgYm9ndXMgKi8KKyNkZWZpbmUgUGFja0RhdGEoZHB5LGRhdGEsbGVuKSBQYWNrRGF0YTE2IChkcHksIGRhdGEsIGxlbikKKworI2RlZmluZSBtaW4oYSxiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIG1heChhLGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKworI2RlZmluZSBDSV9OT05FWElTVENIQVIoY3MpICgoKGNzKS0+d2lkdGggPT0gMCkgJiYgXAorCQkJICAgICAoKChjcyktPnJiZWFyaW5nfChjcyktPmxiZWFyaW5nfCBcCisJCQkgICAgICAgKGNzKS0+YXNjZW50fChjcyktPmRlc2NlbnQpID09IDApKQorCisvKgorICogQ0lfR0VUX0NIQVJfSU5GT18xRCAtIHJldHVybiB0aGUgY2hhcmluZm8gc3RydWN0IGZvciB0aGUgaW5kaWNhdGVkIDhiaXQKKyAqIGNoYXJhY3Rlci4gIElmIHRoZSBjaGFyYWN0ZXIgaXMgaW4gdGhlIGNvbHVtbiBhbmQgZXhpc3RzLCB0aGVuIHJldHVybiB0aGUKKyAqIGFwcHJvcHJpYXRlIG1ldHJpY3MgKG5vdGUgdGhhdCBmb250cyB3aXRoIGNvbW1vbiBwZXItY2hhcmFjdGVyIG1ldHJpY3Mgd2lsbAorICogcmV0dXJuIG1pbl9ib3VuZHMpLiAgSWYgbm9uZSBvZiB0aGVzZSBob2xkIHRydWUsIHRyeSBhZ2FpbiB3aXRoIHRoZSBkZWZhdWx0CisgKiBjaGFyLgorICovCisjZGVmaW5lIENJX0dFVF9DSEFSX0lORk9fMUQoZnMsY29sLGRlZixjcykgXAoreyBcCisgICAgY3MgPSBkZWY7IFwKKyAgICBpZiAoY29sID49IGZzLT5taW5fY2hhcl9vcl9ieXRlMiAmJiBjb2wgPD0gZnMtPm1heF9jaGFyX29yX2J5dGUyKSB7IFwKKwlpZiAoZnMtPnBlcl9jaGFyID09IE5VTEwpIHsgXAorCSAgICBjcyA9ICZmcy0+bWluX2JvdW5kczsgXAorCX0gZWxzZSB7IFwKKwkgICAgY3MgPSAmZnMtPnBlcl9jaGFyWyhjb2wgLSBmcy0+bWluX2NoYXJfb3JfYnl0ZTIpXTsgXAorCSAgICBpZiAoQ0lfTk9ORVhJU1RDSEFSKGNzKSkgY3MgPSBkZWY7IFwKKwl9IFwKKyAgICB9IFwKK30KKworI2RlZmluZSBDSV9HRVRfREVGQVVMVF9JTkZPXzFEKGZzLGNzKSBcCisgIENJX0dFVF9DSEFSX0lORk9fMUQgKGZzLCBmcy0+ZGVmYXVsdF9jaGFyLCBOVUxMLCBjcykKKworCisKKy8qCisgKiBDSV9HRVRfQ0hBUl9JTkZPXzJEIC0gcmV0dXJuIHRoZSBjaGFyaW5mbyBzdHJ1Y3QgZm9yIHRoZSBpbmRpY2F0ZWQgcm93IGFuZAorICogY29sdW1uLiAgVGhpcyBpcyB1c2VkIGZvciBmb250cyB0aGF0IGhhdmUgbW9yZSB0aGFuIHJvdyB6ZXJvLgorICovCisjZGVmaW5lIENJX0dFVF9DSEFSX0lORk9fMkQoZnMscm93LGNvbCxkZWYsY3MpIFwKK3sgXAorICAgIGNzID0gZGVmOyBcCisgICAgaWYgKHJvdyA+PSBmcy0+bWluX2J5dGUxICYmIHJvdyA8PSBmcy0+bWF4X2J5dGUxICYmIFwKKwljb2wgPj0gZnMtPm1pbl9jaGFyX29yX2J5dGUyICYmIGNvbCA8PSBmcy0+bWF4X2NoYXJfb3JfYnl0ZTIpIHsgXAorCWlmIChmcy0+cGVyX2NoYXIgPT0gTlVMTCkgeyBcCisJICAgIGNzID0gJmZzLT5taW5fYm91bmRzOyBcCisJfSBlbHNlIHsgXAorCSAgICBjcyA9ICZmcy0+cGVyX2NoYXJbKChyb3cgLSBmcy0+bWluX2J5dGUxKSAqIFwKKwkJCSAgICAgICAgKGZzLT5tYXhfY2hhcl9vcl9ieXRlMiAtIFwKKwkJCQkgZnMtPm1pbl9jaGFyX29yX2J5dGUyICsgMSkpICsgXAorCQkJICAgICAgIChjb2wgLSBmcy0+bWluX2NoYXJfb3JfYnl0ZTIpXTsgXAorCSAgICBpZiAoQ0lfTk9ORVhJU1RDSEFSKGNzKSkgY3MgPSBkZWY7IFwKKyAgICAgICAgfSBcCisgICAgfSBcCit9CisKKyNkZWZpbmUgQ0lfR0VUX0RFRkFVTFRfSU5GT18yRChmcyxjcykgXAoreyBcCisgICAgdW5zaWduZWQgaW50IHIgPSAoZnMtPmRlZmF1bHRfY2hhciA+PiA4KTsgXAorICAgIHVuc2lnbmVkIGludCBjID0gKGZzLT5kZWZhdWx0X2NoYXIgJiAweGZmKTsgXAorICAgIENJX0dFVF9DSEFSX0lORk9fMkQgKGZzLCByLCBjLCBOVUxMLCBjcyk7IFwKK30KKworCisjaWZkZWYgTVVTVENPUFkKKworLyogZm9yIHdoZW4gMzItYml0IGFsaWdubWVudCBpcyBub3QgZ29vZCBlbm91Z2ggKi8KKyNkZWZpbmUgT25lRGF0YUNhcmQzMihkcHksZHN0YWRkcixzcmN2YXIpIFwKKyAgeyBkcHktPmJ1ZnB0ciAtPSA0OyBEYXRhMzIgKGRweSwgKGNoYXIgKikgJihzcmN2YXIpLCA0KTsgfQorCisjZWxzZQorCisvKiBzcmN2YXIgbXVzdCBiZSBhIHZhcmlhYmxlIGZvciBsYXJnZSBhcmNoaXRlY3R1cmUgdmVyc2lvbiAqLworI2RlZmluZSBPbmVEYXRhQ2FyZDMyKGRweSxkc3RhZGRyLHNyY3ZhcikgXAorICB7ICooQ0FSRDMyICopKGRzdGFkZHIpID0gKHNyY3Zhcik7IH0KKworI2VuZGlmIC8qIE1VU1RDT1BZICovCisKK3R5cGVkZWYgc3RydWN0IF9YSW50ZXJuYWxBc3luYyB7CisgICAgc3RydWN0IF9YSW50ZXJuYWxBc3luYyAqbmV4dDsKKyAgICAvKgorICAgICAqIGhhbmRsZXIgYXJndW1lbnRzOgorICAgICAqIHJlcCBpcyB0aGUgZ2VuZXJpYyByZXBseSB0aGF0IGNhdXNlZCB0aGlzIGhhbmRsZXIKKyAgICAgKiB0byBiZSBpbnZva2VkLiAgSXQgbXVzdCBhbHNvIGJlIHBhc3NlZCB0byBfWEdldEFzeW5jUmVwbHkuCisgICAgICogYnVmIGFuZCBsZW4gYXJlIG9wYXF1ZSB2YWx1ZXMgdGhhdCBtdXN0IGJlIHBhc3NlZCB0bworICAgICAqIF9YR2V0QXN5bmNSZXBseSBvciBfWEdldEFzeW5jRGF0YS4KKyAgICAgKiBkYXRhIGlzIHRoZSBjbG9zdXJlIHN0b3JlZCBpbiB0aGlzIHN0cnVjdC4KKyAgICAgKiBUaGUgaGFuZGxlciByZXR1cm5zIFRydWUgaWZmIGl0IGhhbmRsZWQgdGhpcyByZXBseS4KKyAgICAgKi8KKyAgICBCb29sICgqaGFuZGxlcikoCisJCSAgICBEaXNwbGF5KgkvKiBkcHkgKi8sCisJCSAgICB4UmVwbHkqCS8qIHJlcCAqLywKKwkJICAgIGNoYXIqCS8qIGJ1ZiAqLywKKwkJICAgIGludAkJLyogbGVuICovLAorCQkgICAgWFBvaW50ZXIJLyogZGF0YSAqLworCQkgICAgKTsKKyAgICBYUG9pbnRlciBkYXRhOworfSBfWEFzeW5jSGFuZGxlcjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hBc3luY0VTdGF0ZSB7CisgICAgdW5zaWduZWQgbG9uZyBtaW5fc2VxdWVuY2VfbnVtYmVyOworICAgIHVuc2lnbmVkIGxvbmcgbWF4X3NlcXVlbmNlX251bWJlcjsKKyAgICB1bnNpZ25lZCBjaGFyIGVycm9yX2NvZGU7CisgICAgdW5zaWduZWQgY2hhciBtYWpvcl9vcGNvZGU7CisgICAgdW5zaWduZWQgc2hvcnQgbWlub3Jfb3Bjb2RlOworICAgIHVuc2lnbmVkIGNoYXIgbGFzdF9lcnJvcl9yZWNlaXZlZDsKKyAgICBpbnQgZXJyb3JfY291bnQ7Cit9IF9YQXN5bmNFcnJvclN0YXRlOworCitleHRlcm4gdm9pZCBfWERlcUFzeW5jSGFuZGxlcihEaXNwbGF5ICpkcHksIF9YQXN5bmNIYW5kbGVyICpoYW5kbGVyKTsKKyNkZWZpbmUgRGVxQXN5bmNIYW5kbGVyKGRweSxoYW5kbGVyKSB7IFwKKyAgICBpZiAoZHB5LT5hc3luY19oYW5kbGVycyA9PSAoaGFuZGxlcikpIFwKKwlkcHktPmFzeW5jX2hhbmRsZXJzID0gKGhhbmRsZXIpLT5uZXh0OyBcCisgICAgZWxzZSBcCisJX1hEZXFBc3luY0hhbmRsZXIoZHB5LCBoYW5kbGVyKTsgXAorICAgIH0KKwordHlwZWRlZiB2b2lkICgqRnJlZUZ1bmNUeXBlKSAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLworKTsKKwordHlwZWRlZiBpbnQgKCpGcmVlTW9kbWFwVHlwZSkgKAorICAgIFhNb2RpZmllcktleW1hcCoJLyogbW9kbWFwICovCispOworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgcHJpdmF0ZSB0byB0aGUgbGlicmFyeS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX1hGcmVlRnVuY3MgeworICAgIEZyZWVGdW5jVHlwZSBhdG9tczsJCS8qIF9YRnJlZUF0b21UYWJsZSAqLworICAgIEZyZWVNb2RtYXBUeXBlIG1vZGlmaWVybWFwOwkvKiBYRnJlZU1vZGlmaWVybWFwICovCisgICAgRnJlZUZ1bmNUeXBlIGtleV9iaW5kaW5nczsJLyogX1hGcmVlS2V5QmluZGluZ3MgKi8KKyAgICBGcmVlRnVuY1R5cGUgY29udGV4dF9kYjsJLyogX1hGcmVlQ29udGV4dERCICovCisgICAgRnJlZUZ1bmNUeXBlIGRlZmF1bHRDQ0NzOwkvKiBfWGNtc0ZyZWVEZWZhdWx0Q0NDcyAqLworICAgIEZyZWVGdW5jVHlwZSBjbGllbnRDbWFwczsJLyogX1hjbXNGcmVlQ2xpZW50Q21hcHMgKi8KKyAgICBGcmVlRnVuY1R5cGUgaW50ZW5zaXR5TWFwczsJLyogX1hjbXNGcmVlSW50ZW5zaXR5TWFwcyAqLworICAgIEZyZWVGdW5jVHlwZSBpbV9maWx0ZXJzOwkvKiBfWEZyZWVJTUZpbHRlcnMgKi8KKyAgICBGcmVlRnVuY1R5cGUgeGtiOwkJLyogX1hrYkZyZWVJbmZvICovCit9IF9YRnJlZUZ1bmNSZWM7CisKKy8qIHR5cGVzIGZvciBJbml0RXh0LmMgKi8KK3R5cGVkZWYgaW50ICgqQ3JlYXRlR0NUeXBlKSAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBHQwkJLyogZ2MgKi8sCisgICAgWEV4dENvZGVzKgkvKiBjb2RlcyAqLworKTsKKwordHlwZWRlZiBpbnQgKCpDb3B5R0NUeXBlKSgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkvKiBnYyAqLywKKyAgICBYRXh0Q29kZXMqCS8qIGNvZGVzICovCispOworCit0eXBlZGVmIGludCAoKkZsdXNoR0NUeXBlKSAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBHQwkJLyogZ2MgKi8sCisgICAgWEV4dENvZGVzKgkvKiBjb2RlcyAqLworKTsKKwordHlwZWRlZiBpbnQgKCpGcmVlR0NUeXBlKSAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBHQwkJLyogZ2MgKi8sCisgICAgWEV4dENvZGVzKgkvKiBjb2RlcyAqLworKTsKKwordHlwZWRlZiBpbnQgKCpDcmVhdGVGb250VHlwZSkgKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgWEZvbnRTdHJ1Y3QqIC8qIGZzICovLAorICAgIFhFeHRDb2RlcyoJLyogY29kZXMgKi8KKyk7CisKK3R5cGVkZWYgaW50ICgqRnJlZUZvbnRUeXBlKSAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBYRm9udFN0cnVjdCogLyogZnMgKi8sCisgICAgWEV4dENvZGVzKgkvKiBjb2RlcyAqLworKTsKKwordHlwZWRlZiBpbnQgKCpDbG9zZURpc3BsYXlUeXBlKSAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBYRXh0Q29kZXMqCS8qIGNvZGVzICovCispOworCit0eXBlZGVmIGludCAoKkVycm9yVHlwZSkgKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgeEVycm9yKgkvKiBlcnIgKi8sCisgICAgWEV4dENvZGVzKgkvKiBjb2RlcyAqLywKKyAgICBpbnQqCS8qIHJldF9jb2RlICovCispOworCit0eXBlZGVmIGNoYXIqICgqRXJyb3JTdHJpbmdUeXBlKSAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCS8qIGNvZGUgKi8sCisgICAgWEV4dENvZGVzKgkvKiBjb2RlcyAqLywKKyAgICBjaGFyKgkvKiBidWZmZXIgKi8sCisgICAgaW50CQkvKiBuYnl0ZXMgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKlByaW50RXJyb3JUeXBlKSgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIFhFcnJvckV2ZW50KiAvKiBldiAqLywKKyAgICB2b2lkKgkvKiBmcCAqLworKTsKKwordHlwZWRlZiB2b2lkICgqQmVmb3JlRmx1c2hUeXBlKSgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIFhFeHRDb2RlcyoJLyogY29kZXMgKi8sCisgICAgX1hjb25zdCBjaGFyKiAvKiBkYXRhICovLAorICAgIGxvbmcJLyogbGVuICovCispOworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgcHJpdmF0ZSB0byB0aGUgbGlicmFyeS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX1hFeHRlbiB7CQkvKiBwcml2YXRlIHRvIGV4dGVuc2lvbiBtZWNoYW5pc20gKi8KKwlzdHJ1Y3QgX1hFeHRlbiAqbmV4dDsJCS8qIG5leHQgaW4gbGlzdCAqLworCVhFeHRDb2RlcyBjb2RlczsJCS8qIHB1YmxpYyBpbmZvcm1hdGlvbiwgYWxsIGV4dGVuc2lvbiB0b2xkICovCisJQ3JlYXRlR0NUeXBlIGNyZWF0ZV9HQzsJCS8qIHJvdXRpbmUgdG8gY2FsbCB3aGVuIEdDIGNyZWF0ZWQgKi8KKwlDb3B5R0NUeXBlIGNvcHlfR0M7CQkvKiByb3V0aW5lIHRvIGNhbGwgd2hlbiBHQyBjb3BpZWQgKi8KKwlGbHVzaEdDVHlwZSBmbHVzaF9HQzsJCS8qIHJvdXRpbmUgdG8gY2FsbCB3aGVuIEdDIGZsdXNoZWQgKi8KKwlGcmVlR0NUeXBlIGZyZWVfR0M7CQkvKiByb3V0aW5lIHRvIGNhbGwgd2hlbiBHQyBmcmVlZCAqLworCUNyZWF0ZUZvbnRUeXBlIGNyZWF0ZV9Gb250OwkvKiByb3V0aW5lIHRvIGNhbGwgd2hlbiBGb250IGNyZWF0ZWQgKi8KKwlGcmVlRm9udFR5cGUgZnJlZV9Gb250OwkJLyogcm91dGluZSB0byBjYWxsIHdoZW4gRm9udCBmcmVlZCAqLworCUNsb3NlRGlzcGxheVR5cGUgY2xvc2VfZGlzcGxheTsJLyogcm91dGluZSB0byBjYWxsIHdoZW4gY29ubmVjdGlvbiBjbG9zZWQgKi8KKwlFcnJvclR5cGUgZXJyb3I7CQkvKiB3aG8gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3VycyAqLworCUVycm9yU3RyaW5nVHlwZSBlcnJvcl9zdHJpbmc7CS8qIHJvdXRpbmUgdG8gc3VwcGx5IGVycm9yIHN0cmluZyAqLworCWNoYXIgKm5hbWU7CQkJLyogbmFtZSBvZiB0aGlzIGV4dGVuc2lvbiAqLworCVByaW50RXJyb3JUeXBlIGVycm9yX3ZhbHVlczsJLyogcm91dGluZSB0byBzdXBwbHkgZXJyb3IgdmFsdWVzICovCisJQmVmb3JlRmx1c2hUeXBlIGJlZm9yZV9mbHVzaDsJLyogcm91dGluZSB0byBjYWxsIHdoZW4gc2VuZGluZyBkYXRhICovCisJc3RydWN0IF9YRXh0ZW4gKm5leHRfZmx1c2g7CS8qIG5leHQgaW4gbGlzdCBvZiB0aG9zZSB3aXRoIGZsdXNoZXMgKi8KK30gX1hFeHRlbnNpb247CisKKy8qIGV4dGVuc2lvbiBob29rcyAqLworCisjaWZkZWYgRGF0YVJvdXRpbmVJc1Byb2NlZHVyZQorZXh0ZXJuIHZvaWQgRGF0YShEaXNwbGF5ICpkcHksIGNoYXIgKmRhdGEsIGxvbmcgbGVuKTsKKyNlbmRpZgorZXh0ZXJuIGludCBfWEVycm9yKAorICAgIERpc3BsYXkqCS8qIGRweSAqLywKKyAgICB4RXJyb3IqCS8qIHJlcCAqLworKTsKK2V4dGVybiBpbnQgX1hJT0Vycm9yKAorICAgIERpc3BsYXkqCS8qIGRweSAqLworKSBfWF9OT1JFVFVSTjsKK2V4dGVybiBpbnQgKCpfWElPRXJyb3JGdW5jdGlvbikoCisgICAgRGlzcGxheSoJLyogZHB5ICovCispOworZXh0ZXJuIGludCAoKl9YRXJyb3JGdW5jdGlvbikoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBYRXJyb3JFdmVudCoJLyogZXJyb3JfZXZlbnQgKi8KKyk7CitleHRlcm4gdm9pZCBfWEVhdERhdGEoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIG4gKi8KKyk7CitleHRlcm4gY2hhciAqX1hBbGxvY1NjcmF0Y2goCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIG5ieXRlcyAqLworKTsKK2V4dGVybiBjaGFyICpfWEFsbG9jVGVtcCgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogbmJ5dGVzICovCispOworZXh0ZXJuIHZvaWQgX1hGcmVlVGVtcCgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIGNoYXIqCQkvKiBidWYgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBuYnl0ZXMgKi8KKyk7CitleHRlcm4gVmlzdWFsICpfWFZJRHRvVmlzdWFsKAorICAgIERpc3BsYXkqCS8qIGRweSAqLywKKyAgICBWaXN1YWxJRAkvKiBpZCAqLworKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIF9YU2V0TGFzdFJlcXVlc3RSZWFkKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgeEdlbmVyaWNSZXBseSoJLyogcmVwICovCispOworZXh0ZXJuIGludCBfWEdldEhvc3RuYW1lKAorICAgIGNoYXIqCS8qIGJ1ZiAqLywKKyAgICBpbnQJCS8qIG1heGxlbiAqLworKTsKK2V4dGVybiBTY3JlZW4gKl9YU2NyZWVuT2ZXaW5kb3coCisgICAgRGlzcGxheSoJLyogZHB5ICovLAorICAgIFdpbmRvdwkvKiB3ICovCispOworZXh0ZXJuIEJvb2wgX1hBc3luY0Vycm9ySGFuZGxlcigKKyAgICBEaXNwbGF5KgkvKiBkcHkgKi8sCisgICAgeFJlcGx5KgkvKiByZXAgKi8sCisgICAgY2hhcioJLyogYnVmICovLAorICAgIGludAkJLyogbGVuICovLAorICAgIFhQb2ludGVyCS8qIGRhdGEgKi8KKyk7CitleHRlcm4gY2hhciAqX1hHZXRBc3luY1JlcGx5KAorICAgIERpc3BsYXkqCS8qIGRweSAqLywKKyAgICBjaGFyKgkvKiByZXBsYnVmICovLAorICAgIHhSZXBseSoJLyogcmVwICovLAorICAgIGNoYXIqCS8qIGJ1ZiAqLywKKyAgICBpbnQJCS8qIGxlbiAqLywKKyAgICBpbnQJCS8qIGV4dHJhICovLAorICAgIEJvb2wJLyogZGlzY2FyZCAqLworKTsKK2V4dGVybiB2b2lkIF9YR2V0QXN5bmNEYXRhKAorICAgIERpc3BsYXkqCS8qIGRweSAqLywKKyAgICBjaGFyICoJLyogZGF0YSAqLywKKyAgICBjaGFyICoJLyogYnVmICovLAorICAgIGludAkJLyogbGVuICovLAorICAgIGludAkJLyogc2tpcCAqLywKKyAgICBpbnQJCS8qIGRhdGFsZW4gKi8sCisgICAgaW50CQkvKiBkaXNjYXJkdG90YWwgKi8KKyk7CitleHRlcm4gdm9pZCBfWEZsdXNoKAorICAgIERpc3BsYXkqCS8qIGRweSAqLworKTsKK2V4dGVybiBpbnQgX1hFdmVudHNRdWV1ZWQoCisgICAgRGlzcGxheSoJLyogZHB5ICovLAorICAgIGludCAJLyogbW9kZSAqLworKTsKK2V4dGVybiB2b2lkIF9YUmVhZEV2ZW50cygKKyAgICBEaXNwbGF5KgkvKiBkcHkgKi8KKyk7CitleHRlcm4gaW50IF9YUmVhZCgKKyAgICBEaXNwbGF5KgkvKiBkcHkgKi8sCisgICAgY2hhcioJLyogZGF0YSAqLywKKyAgICBsb25nCS8qIHNpemUgKi8KKyk7CitleHRlcm4gdm9pZCBfWFJlYWRQYWQoCisgICAgRGlzcGxheSoJLyogZHB5ICovLAorICAgIGNoYXIqCS8qIGRhdGEgKi8sCisgICAgbG9uZwkvKiBzaXplICovCispOworZXh0ZXJuIHZvaWQgX1hTZW5kKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBkYXRhICovLAorICAgIGxvbmcJCS8qIHNpemUgKi8KKyk7CitleHRlcm4gU3RhdHVzIF9YUmVwbHkoCisgICAgRGlzcGxheSoJLyogZHB5ICovLAorICAgIHhSZXBseSoJLyogcmVwICovLAorICAgIGludAkJLyogZXh0cmEgKi8sCisgICAgQm9vbAkvKiBkaXNjYXJkICovCispOworZXh0ZXJuIHZvaWQgX1hFbnEoCisgICAgRGlzcGxheSoJLyogZHB5ICovLAorICAgIHhFdmVudCoJLyogZXZlbnQgKi8KKyk7CitleHRlcm4gdm9pZCBfWERlcSgKKyAgICBEaXNwbGF5KgkvKiBkcHkgKi8sCisgICAgX1hRRXZlbnQqCS8qIHByZXYgKi8sCisgICAgX1hRRXZlbnQqCS8qIHFlbHQgKi8KKyk7CisKK2V4dGVybiBCb29sIF9YVW5rbm93bldpcmVFdmVudCgKKyAgICBEaXNwbGF5KgkvKiBkcHkgKi8sCisgICAgWEV2ZW50KgkvKiByZSAqLywKKyAgICB4RXZlbnQqCS8qIGV2ZW50ICovCispOworCitleHRlcm4gQm9vbCBfWFVua25vd25XaXJlRXZlbnRDb29raWUoCisgICAgRGlzcGxheSoJLyogZHB5ICovLAorICAgIFhHZW5lcmljRXZlbnRDb29raWUqCS8qIHJlICovLAorICAgIHhFdmVudCoJLyogZXZlbnQgKi8KKyk7CisKK2V4dGVybiBCb29sIF9YVW5rbm93bkNvcHlFdmVudENvb2tpZSgKKyAgICBEaXNwbGF5KgkvKiBkcHkgKi8sCisgICAgWEdlbmVyaWNFdmVudENvb2tpZSoJLyogaW4gKi8sCisgICAgWEdlbmVyaWNFdmVudENvb2tpZSoJLyogb3V0ICovCispOworCitleHRlcm4gU3RhdHVzIF9YVW5rbm93bk5hdGl2ZUV2ZW50KAorICAgIERpc3BsYXkqCS8qIGRweSAqLywKKyAgICBYRXZlbnQqCS8qIHJlICovLAorICAgIHhFdmVudCoJLyogZXZlbnQgKi8KKyk7CisKK2V4dGVybiBCb29sIF9YV2lyZVRvRXZlbnQoRGlzcGxheSAqZHB5LCBYRXZlbnQgKnJlLCB4RXZlbnQgKmV2ZW50KTsKK2V4dGVybiBCb29sIF9YRGVmYXVsdFdpcmVFcnJvcihEaXNwbGF5ICpkaXNwbGF5LCBYRXJyb3JFdmVudCAqaGUsIHhFcnJvciAqd2UpOworZXh0ZXJuIEJvb2wgX1hQb2xsZmRDYWNoZUluaXQoRGlzcGxheSAqZHB5KTsKK2V4dGVybiB2b2lkIF9YUG9sbGZkQ2FjaGVBZGQoRGlzcGxheSAqZHB5LCBpbnQgZmQpOworZXh0ZXJuIHZvaWQgX1hQb2xsZmRDYWNoZURlbChEaXNwbGF5ICpkcHksIGludCBmZCk7CitleHRlcm4gWElEIF9YQWxsb2NJRChEaXNwbGF5ICpkcHkpOworZXh0ZXJuIHZvaWQgX1hBbGxvY0lEcyhEaXNwbGF5ICpkcHksIFhJRCAqaWRzLCBpbnQgY291bnQpOworCitleHRlcm4gaW50IF9YRnJlZUV4dERhdGEoCisgICAgWEV4dERhdGEqCS8qIGV4dGVuc2lvbiAqLworKTsKKworZXh0ZXJuIGludCAoKlhFU2V0Q3JlYXRlR0MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogZXh0ZW5zaW9uICovLAorICAgIGludCAoKikgKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKwkgICAgICBHQwkJCS8qIGdjICovLAorCSAgICAgIFhFeHRDb2RlcyoJCS8qIGNvZGVzICovCisJICAgICkJCS8qIHByb2MgKi8KKykpKAorICAgIERpc3BsYXkqLCBHQywgWEV4dENvZGVzKgorKTsKKworZXh0ZXJuIGludCAoKlhFU2V0Q29weUdDKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGV4dGVuc2lvbiAqLywKKyAgICBpbnQgKCopICgKKwkgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgIEdDCQkJLyogZ2MgKi8sCisgICAgICAgICAgICAgIFhFeHRDb2RlcyoJCS8qIGNvZGVzICovCisgICAgICAgICAgICApCQkvKiBwcm9jICovCispKSgKKyAgICBEaXNwbGF5KiwgR0MsIFhFeHRDb2RlcyoKKyk7CisKK2V4dGVybiBpbnQgKCpYRVNldEZsdXNoR0MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogZXh0ZW5zaW9uICovLAorICAgIGludCAoKikgKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgR0MJCQkvKiBnYyAqLywKKyAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8KKyAgICAgICAgICAgICkJCS8qIHByb2MgKi8KKykpKAorICAgIERpc3BsYXkqLCBHQywgWEV4dENvZGVzKgorKTsKKworZXh0ZXJuIGludCAoKlhFU2V0RnJlZUdDKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGV4dGVuc2lvbiAqLywKKyAgICBpbnQgKCopICgKKwkgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgIEdDCQkJLyogZ2MgKi8sCisgICAgICAgICAgICAgIFhFeHRDb2RlcyoJCS8qIGNvZGVzICovCisgICAgICAgICAgICApCQkvKiBwcm9jICovCispKSgKKyAgICBEaXNwbGF5KiwgR0MsIFhFeHRDb2RlcyoKKyk7CisKK2V4dGVybiBpbnQgKCpYRVNldENyZWF0ZUZvbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogZXh0ZW5zaW9uICovLAorICAgIGludCAoKikgKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgWEZvbnRTdHJ1Y3QqCQkvKiBmcyAqLywKKyAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8KKyAgICAgICAgICAgICkJCS8qIHByb2MgKi8KKykpKAorICAgIERpc3BsYXkqLCBYRm9udFN0cnVjdCosIFhFeHRDb2RlcyoKKyk7CisKK2V4dGVybiBpbnQgKCpYRVNldEZyZWVGb250KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGV4dGVuc2lvbiAqLywKKyAgICBpbnQgKCopICgKKwkgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgIFhGb250U3RydWN0KgkJLyogZnMgKi8sCisgICAgICAgICAgICAgIFhFeHRDb2RlcyoJCS8qIGNvZGVzICovCisgICAgICAgICAgICApCQkvKiBwcm9jICovCispKSgKKyAgICBEaXNwbGF5KiwgWEZvbnRTdHJ1Y3QqLCBYRXh0Q29kZXMqCispOworCitleHRlcm4gaW50ICgqWEVTZXRDbG9zZURpc3BsYXkoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogZXh0ZW5zaW9uICovLAorICAgIGludCAoKikgKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8KKyAgICAgICAgICAgICkJCS8qIHByb2MgKi8KKykpKAorICAgIERpc3BsYXkqLCBYRXh0Q29kZXMqCispOworCitleHRlcm4gaW50ICgqWEVTZXRFcnJvcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBleHRlbnNpb24gKi8sCisgICAgaW50ICgqKSAoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICB4RXJyb3IqCQkJLyogZXJyICovLAorICAgICAgICAgICAgICBYRXh0Q29kZXMqCQkvKiBjb2RlcyAqLywKKyAgICAgICAgICAgICAgaW50KgkJCS8qIHJldF9jb2RlICovCisgICAgICAgICAgICApCQkvKiBwcm9jICovCispKSgKKyAgICBEaXNwbGF5KiwgeEVycm9yKiwgWEV4dENvZGVzKiwgaW50KgorKTsKKworZXh0ZXJuIGNoYXIqICgqWEVTZXRFcnJvclN0cmluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBleHRlbnNpb24gKi8sCisgICAgY2hhciogKCopICgKKwkgICAgICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICAgIGludAkJCS8qIGNvZGUgKi8sCisgICAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8sCisgICAgICAgICAgICAgICAgY2hhcioJCQkvKiBidWZmZXIgKi8sCisgICAgICAgICAgICAgICAgaW50CQkJLyogbmJ5dGVzICovCisgICAgICAgICAgICAgICkJCS8qIHByb2MgKi8KKykpKAorICAgIERpc3BsYXkqLCBpbnQsIFhFeHRDb2RlcyosIGNoYXIqLCBpbnQKKyk7CisKK2V4dGVybiB2b2lkICgqWEVTZXRQcmludEVycm9yVmFsdWVzICgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBleHRlbnNpb24gKi8sCisgICAgdm9pZCAoKikoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorCSAgICAgIFhFcnJvckV2ZW50KgkJLyogZXYgKi8sCisJICAgICAgdm9pZCoJCQkvKiBmcCAqLworCSAgICAgKQkJLyogcHJvYyAqLworKSkoCisgICAgRGlzcGxheSosIFhFcnJvckV2ZW50Kiwgdm9pZCoKKyk7CisKK2V4dGVybiBCb29sICgqWEVTZXRXaXJlVG9FdmVudCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBldmVudF9udW1iZXIgKi8sCisgICAgQm9vbCAoKikgKAorCSAgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgICBYRXZlbnQqCQkJLyogcmUgKi8sCisgICAgICAgICAgICAgICB4RXZlbnQqCQkJLyogZXZlbnQgKi8KKyAgICAgICAgICAgICApCQkvKiBwcm9jICovCispKSgKKyAgICBEaXNwbGF5KiwgWEV2ZW50KiwgeEV2ZW50KgorKTsKKworZXh0ZXJuIEJvb2wgKCpYRVNldFdpcmVUb0V2ZW50Q29va2llKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGV4dGVuc2lvbiAqLywKKyAgICBCb29sICgqKSAoCisJICAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgIFhHZW5lcmljRXZlbnRDb29raWUqCS8qIHJlICovLAorICAgICAgICAgICAgICAgeEV2ZW50KgkJCS8qIGV2ZW50ICovCisgICAgICAgICAgICAgKQkJLyogcHJvYyAqLworKSkoCisgICAgRGlzcGxheSosIFhHZW5lcmljRXZlbnRDb29raWUqLCB4RXZlbnQqCispOworCitleHRlcm4gQm9vbCAoKlhFU2V0Q29weUV2ZW50Q29va2llKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGV4dGVuc2lvbiAqLywKKyAgICBCb29sICgqKSAoCisJICAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgIFhHZW5lcmljRXZlbnRDb29raWUqCS8qIGluICovLAorICAgICAgICAgICAgICAgWEdlbmVyaWNFdmVudENvb2tpZSoJLyogb3V0ICovCisgICAgICAgICAgICAgKQkJLyogcHJvYyAqLworKSkoCisgICAgRGlzcGxheSosIFhHZW5lcmljRXZlbnRDb29raWUqLCBYR2VuZXJpY0V2ZW50Q29va2llKgorKTsKKworCitleHRlcm4gU3RhdHVzICgqWEVTZXRFdmVudFRvV2lyZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBldmVudF9udW1iZXIgKi8sCisgICAgU3RhdHVzICgqKSAoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICBYRXZlbnQqCQkJLyogcmUgKi8sCisgICAgICAgICAgICAgIHhFdmVudCoJCQkvKiBldmVudCAqLworICAgICAgICAgICAgKQkJLyogcHJvYyAqLworKSkoCisgICAgRGlzcGxheSosIFhFdmVudCosIHhFdmVudCoKKyk7CisKK2V4dGVybiBCb29sICgqWEVTZXRXaXJlVG9FcnJvcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBlcnJvcl9udW1iZXIgKi8sCisgICAgQm9vbCAoKikgKAorCSAgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisJICAgICAgIFhFcnJvckV2ZW50KgkJLyogaGUgKi8sCisJICAgICAgIHhFcnJvcioJCQkvKiB3ZSAqLworICAgICAgICAgICAgKQkJLyogcHJvYyAqLworKSkoCisgICAgRGlzcGxheSosIFhFcnJvckV2ZW50KiwgeEVycm9yKgorKTsKKworZXh0ZXJuIHZvaWQgKCpYRVNldEJlZm9yZUZsdXNoKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGVycm9yX251bWJlciAqLywKKyAgICB2b2lkICgqKSAoCisJICAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKwkgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8sCisJICAgICAgIF9YY29uc3QgY2hhcioJCS8qIGRhdGEgKi8sCisJICAgICAgIGxvbmcJCQkvKiBsZW4gKi8KKyAgICAgICAgICAgICkJCS8qIHByb2MgKi8KKykpKAorICAgIERpc3BsYXkqLCBYRXh0Q29kZXMqLCBfWGNvbnN0IGNoYXIqLCBsb25nCispOworCisvKiBpbnRlcm5hbCBjb25uZWN0aW9ucyBmb3IgSU1zICovCisKK3R5cGVkZWYgdm9pZCAoKl9YSW50ZXJuYWxDb25uZWN0aW9uUHJvYykoCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgaW50CQkJCS8qIGZkICovLAorICAgIFhQb2ludGVyCQkJLyogY2FsbF9kYXRhICovCispOworCisKK2V4dGVybiBTdGF0dXMgX1hSZWdpc3RlckludGVybmFsQ29ubmVjdGlvbigKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBpbnQJCQkJLyogZmQgKi8sCisgICAgX1hJbnRlcm5hbENvbm5lY3Rpb25Qcm9jCS8qIGNhbGxiYWNrICovLAorICAgIFhQb2ludGVyCQkJLyogY2FsbF9kYXRhICovCispOworCitleHRlcm4gdm9pZCBfWFVucmVnaXN0ZXJJbnRlcm5hbENvbm5lY3Rpb24oCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgaW50CQkJCS8qIGZkICovCispOworCitleHRlcm4gdm9pZCBfWFByb2Nlc3NJbnRlcm5hbENvbm5lY3Rpb24oCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgc3RydWN0IF9YQ29ubmVjdGlvbkluZm8qCS8qIGNvbm5faW5mbyAqLworKTsKKworLyogRGlzcGxheSBzdHJ1Y3R1cmUgaGFzIHBvaW50ZXJzIHRvIHRoZXNlICovCisKK3N0cnVjdCBfWENvbm5lY3Rpb25JbmZvIHsJLyogaW5mbyBmcm9tIF9YUmVnaXN0ZXJJbnRlcm5hbENvbm5lY3Rpb24gKi8KKyAgICBpbnQgZmQ7CisgICAgX1hJbnRlcm5hbENvbm5lY3Rpb25Qcm9jIHJlYWRfY2FsbGJhY2s7CisgICAgWFBvaW50ZXIgY2FsbF9kYXRhOworICAgIFhQb2ludGVyICp3YXRjaF9kYXRhOwkvKiBzZXQvdXNlZCBieSBYQ29ubmVjdGlvbldhdGNoUHJvYyAqLworICAgIHN0cnVjdCBfWENvbm5lY3Rpb25JbmZvICpuZXh0OworfTsKKworc3RydWN0IF9YQ29ubldhdGNoSW5mbyB7CS8qIGluZm8gZnJvbSBYQWRkQ29ubmVjdGlvbldhdGNoICovCisgICAgWENvbm5lY3Rpb25XYXRjaFByb2MgZm47CisgICAgWFBvaW50ZXIgY2xpZW50X2RhdGE7CisgICAgc3RydWN0IF9YQ29ubldhdGNoSW5mbyAqbmV4dDsKK307CisKKyNpZmRlZiBfX1VOSVhPUzJfXworZXh0ZXJuIGNoYXIqIF9fWE9TMlJlZGlyUm9vdCgKKyAgICBjaGFyKgorKTsKKyNlbmRpZgorCitleHRlcm4gaW50IF9YVGV4dEhlaWdodCgKKyAgICBYRm9udFN0cnVjdCoJLyogZm9udF9zdHJ1Y3QgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBzdHJpbmcgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8KKyk7CisKK2V4dGVybiBpbnQgX1hUZXh0SGVpZ2h0MTYoCisgICAgWEZvbnRTdHJ1Y3QqCS8qIGZvbnRfc3RydWN0ICovLAorICAgIF9YY29uc3QgWENoYXIyYioJLyogc3RyaW5nICovLAorICAgIGludAkJCS8qIGNvdW50ICovCispOworCisjaWYgZGVmaW5lZChXSU4zMikKKworZXh0ZXJuIGludCBfWE9wZW5GaWxlKAorICAgIF9YY29uc3QgY2hhcioJLyogcGF0aCAqLywKKyAgICBpbnQJCQkvKiBmbGFncyAqLworKTsKKworZXh0ZXJuIGludCBfWE9wZW5GaWxlTW9kZSgKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHBhdGggKi8sCisgICAgaW50CQkJLyogZmxhZ3MgKi8sCisgICAgbW9kZV90ICAgICAgICAgICAgICAvKiBtb2RlICovCispOworCitleHRlcm4gdm9pZCogX1hGb3BlbkZpbGUoCisgICAgX1hjb25zdCBjaGFyKgkvKiBwYXRoICovLAorICAgIF9YY29uc3QgY2hhcioJLyogbW9kZSAqLworKTsKKworZXh0ZXJuIGludCBfWEFjY2Vzc0ZpbGUoCisgICAgX1hjb25zdCBjaGFyKgkvKiBwYXRoICovCispOworI2Vsc2UKKyNkZWZpbmUgX1hPcGVuRmlsZShwYXRoLGZsYWdzKSBvcGVuKHBhdGgsZmxhZ3MpCisjZGVmaW5lIF9YT3BlbkZpbGVNb2RlKHBhdGgsZmxhZ3MsbW9kZSkgb3BlbihwYXRoLGZsYWdzLG1vZGUpCisjZGVmaW5lIF9YRm9wZW5GaWxlKHBhdGgsbW9kZSkgZm9wZW4ocGF0aCxtb2RlKQorI2VuZGlmCisKKy8qIEV2VG9XaXJlLmMgKi8KK2V4dGVybiBTdGF0dXMgX1hFdmVudFRvV2lyZShEaXNwbGF5ICpkcHksIFhFdmVudCAqcmUsIHhFdmVudCAqZXZlbnQpOworCitleHRlcm4gaW50IF9YRjg2TG9hZFF1ZXJ5TG9jYWxlRm9udCgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogbmFtZSovLAorICAgIFhGb250U3RydWN0KioJLyogeGZwKi8sCisgICAgRm9udCoJCS8qIGZpZHAgKi8KKyk7CisKK2V4dGVybiB2b2lkIF9YUHJvY2Vzc1dpbmRvd0F0dHJpYnV0ZXMgKAorICAgIHJlZ2lzdGVyIERpc3BsYXkgKmRweSwKKyAgICB4Q2hhbmdlV2luZG93QXR0cmlidXRlc1JlcSAqcmVxLAorICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgdmFsdWVtYXNrLAorICAgIHJlZ2lzdGVyIFhTZXRXaW5kb3dBdHRyaWJ1dGVzICphdHRyaWJ1dGVzKTsKKworZXh0ZXJuIGludCBfWERlZmF1bHRFcnJvcigKKyAgICAgICAgRGlzcGxheSAqZHB5LAorICAgICAgICBYRXJyb3JFdmVudCAqZXZlbnQpOworCitleHRlcm4gaW50IF9YRGVmYXVsdElPRXJyb3IoCisgICAgICAgIERpc3BsYXkgKmRweSk7CisKK2V4dGVybiB2b2lkIF9YU2V0Q2xpcFJlY3RhbmdsZXMgKAorICAgIHJlZ2lzdGVyIERpc3BsYXkgKmRweSwKKyAgICBHQyBnYywKKyAgICBpbnQgY2xpcF94X29yaWdpbiwgaW50IGNsaXBfeV9vcmlnaW4sCisgICAgWFJlY3RhbmdsZSAqcmVjdGFuZ2xlcywKKyAgICBpbnQgbiwKKyAgICBpbnQgb3JkZXJpbmcpOworCitTdGF0dXMgX1hHZXRXaW5kb3dBdHRyaWJ1dGVzKAorICAgIHJlZ2lzdGVyIERpc3BsYXkgKmRweSwKKyAgICBXaW5kb3cgdywKKyAgICBYV2luZG93QXR0cmlidXRlcyAqYXR0cik7CisKK2ludCBfWFB1dEJhY2tFdmVudCAoCisgICAgcmVnaXN0ZXIgRGlzcGxheSAqZHB5LAorICAgIHJlZ2lzdGVyIFhFdmVudCAqZXZlbnQpOworCitleHRlcm4gQm9vbCBfWElzRXZlbnRDb29raWUoCisgICAgICAgIERpc3BsYXkgKmRweSwKKyAgICAgICAgWEV2ZW50ICpldik7CisKK2V4dGVybiB2b2lkIF9YRnJlZUV2ZW50Q29va2llcygKKyAgICAgICAgRGlzcGxheSAqZHB5KTsKKworZXh0ZXJuIHZvaWQgX1hTdG9yZUV2ZW50Q29va2llKAorICAgICAgICBEaXNwbGF5ICpkcHksCisgICAgICAgIFhFdmVudCAqZXYpOworCitleHRlcm4gQm9vbCBfWEZldGNoRXZlbnRDb29raWUoCisgICAgICAgIERpc3BsYXkgKmRweSwKKyAgICAgICAgWEdlbmVyaWNFdmVudENvb2tpZSAqZXYpOworCitleHRlcm4gQm9vbCBfWENvcHlFdmVudENvb2tpZSgKKyAgICAgICAgRGlzcGxheSAqZHB5LAorICAgICAgICBYR2VuZXJpY0V2ZW50Q29va2llICppbiwKKyAgICAgICAgWEdlbmVyaWNFdmVudENvb2tpZSAqb3V0KTsKKworLyogbGNGaWxlLmMgKi8KKworZXh0ZXJuIHZvaWQgeGxvY2FsZWRpcigKKyAgICBjaGFyICpidWYsCisgICAgaW50IGJ1Zl9sZW4KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZiAvKiBfWDExX1hMSUJJTlRfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hsb2NhbGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hsb2NhbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODk0NmU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGxvY2FsZS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisKK0NvcHlyaWdodCAxOTkxLCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCitpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKK09SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCitPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbAorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvcgorb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgorZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKi8KKworI2lmbmRlZiBfWDExX1hMT0NBTEVfSF8KKyNkZWZpbmUgX1gxMV9YTE9DQUxFX0hfCisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorI2luY2x1ZGUgPFgxMS9Yb3NkZWZzLmg+CisKKyNpZm5kZWYgWF9MT0NBTEUKKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNlbHNlCisKKyNkZWZpbmUgTENfQUxMICAgICAgMAorI2RlZmluZSBMQ19DT0xMQVRFICAxCisjZGVmaW5lIExDX0NUWVBFICAgIDIKKyNkZWZpbmUgTENfTU9ORVRBUlkgMworI2RlZmluZSBMQ19OVU1FUklDICA0CisjZGVmaW5lIExDX1RJTUUgICAgIDUKKworX1hGVU5DUFJPVE9CRUdJTgorZXh0ZXJuIGNoYXIgKl9Yc2V0bG9jYWxlKAorICAgIGludCAvKiBjYXRlZ29yeSAqLywKKyAgICBfWGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8KKyk7CitfWEZVTkNQUk9UT0VORAorCisjZGVmaW5lIHNldGxvY2FsZSBfWHNldGxvY2FsZQorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNlbmRpZiAvKiBYX0xPQ0FMRSAqLworCisjZW5kaWYgLyogX1gxMV9YTE9DQUxFX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YbWQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1htZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzODY4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YbWQuaApAQCAtMCwwICsxLDE4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg3LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisKK0NvcHlyaWdodCAxOTg3IGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLgorCisgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIERpZ2l0YWwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK3NvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKworRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBYTURfSAorIyBkZWZpbmUgWE1EX0ggMQorLyoKKyAqICBYbWQuaDogTUFDSElORSBERVBFTkRFTlQgREVDTEFSQVRJT05TLgorICovCisKKy8qCisgKiBTcGVjaWFsIHBlci1tYWNoaW5lIGNvbmZpZ3VyYXRpb24gZmxhZ3MuCisgKi8KKyMgaWYgZGVmaW5lZChfX3N1bikgJiYgZGVmaW5lZChfX1NWUjQpCisjICBpbmNsdWRlIDxzeXMvaXNhX2RlZnMuaD4gLyogU29sYXJpczogZGVmaW5lcyBfTFA2NCBpZiBuZWNlc3NhcnkgKi8KKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkIChfTFA2NCkgfHwgZGVmaW5lZChfX0xQNjRfXykgfHwgXAorICAgICBkZWZpbmVkKF9fYWxwaGEpIHx8IGRlZmluZWQoX19hbHBoYV9fKSB8fCBcCisgICAgIGRlZmluZWQoX19pYTY0X18pIHx8IGRlZmluZWQoaWE2NCkgfHwgXAorICAgICBkZWZpbmVkKF9fc3BhcmM2NF9fKSB8fCBcCisgICAgIGRlZmluZWQoX19zMzkweF9fKSB8fCBcCisgICAgIGRlZmluZWQoX19hbWQ2NF9fKSB8fCBkZWZpbmVkKGFtZDY0KSB8fCBcCisgICAgIGRlZmluZWQoX19wb3dlcnBjNjRfXykKKyMgIGRlZmluZSBMT05HNjQJCQkJLyogMzIvNjQtYml0IGFyY2hpdGVjdHVyZSAqLworIyBlbmRpZgorCisvKgorICogU3R1ZmYgdG8gaGFuZGxlIGxhcmdlIGFyY2hpdGVjdHVyZSBtYWNoaW5lczsgdGhlIGNvbnN0YW50cyB3ZXJlIGdlbmVyYXRlZAorICogb24gYSAzMi1iaXQgbWFjaGluZSBhbmQgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBwcm90b2NvbC4KKyAqLworIyBpZmRlZiBXT1JENjQKKyMgIGRlZmluZSBNVVNUQ09QWQorIyBlbmRpZiAvKiBXT1JENjQgKi8KKworCisvKgorICogRGVmaW5pdGlvbiBvZiBtYWNybyB1c2VkIHRvIHNldCBjb25zdGFudHMgZm9yIHNpemUgb2YgbmV0d29yayBzdHJ1Y3R1cmVzOworICogbWFjaGluZXMgd2l0aCBwcmVwcm9jZXNzb3JzIHRoYXQgY2FuJ3QgaGFuZGxlIGFsbCBvZiB0aGUgc3pfIHN5bWJvbHMKKyAqIGNhbiBkZWZpbmUgdGhpcyBtYWNybyB0byBiZSBzaXplb2YoeCkgaWYgYW5kIG9ubHkgaWYgdGhlaXIgY29tcGlsZXIgZG9lc24ndAorICogcGFkIG91dCBzdHJ1Y3R1cmVzIChlc3AuIHRoZSB4VGV4dEVsdCBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgb25seSB0d28KKyAqIG9uZS1ieXRlIGZpZWxkcykuICBOZXR3b3JrIHN0cnVjdHVyZXMgc2hvdWxkIGFsd2F5cyBkZWZpbmUgc3pfc3ltYm9scy4KKyAqCisgKiBUaGUgc3pfIHByZWZpeCBpcyB1c2VkIGluc3RlYWQgb2Ygc29tZXRoaW5nIG1vcmUgZGVzY3JpcHRpdmUgc28gdGhhdCB0aGUKKyAqIHN5bWJvbHMgYXJlIG5vIG1vcmUgdGhhbiAzMiBjaGFyYWN0ZXJzIGxvbmcgKHdoaWNoIGNhdXNlcyBwcm9ibGVtcyBmb3Igc29tZQorICogY29tcGlsZXJzIGFuZCBwcmVwcm9jZXNzb3JzKS4KKyAqCisgKiBUaGUgZXh0cmEgaW5kaXJlY3Rpb24gaXMgdG8gZ2V0IG1hY3JvIGFyZ3VtZW50cyB0byBleHBhbmQgY29ycmVjdGx5IGJlZm9yZQorICogdGhlIGNvbmNhdGVuYXRpb24sIHJhdGhlciB0aGFuIGFmdGVyd2FyZC4KKyAqLworIyBkZWZpbmUgX1NJWkVPRih4KSBzel8jI3gKKyMgZGVmaW5lIFNJWkVPRih4KSBfU0laRU9GKHgpCisKKy8qCisgKiBCaXRmaWVsZCBzdWZmaXhlcyBmb3IgdGhlIHByb3RvY29sIHN0cnVjdHVyZSBlbGVtZW50cywgaWYgeW91CisgKiBuZWVkIHRoZW0uICBOb3RlIHRoYXQgYml0ZmllbGRzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBzaWduZWQKKyAqIChvciBldmVuIHVuc2lnbmVkKSBhY2NvcmRpbmcgdG8gQU5TSSBDLgorICovCisjIGlmZGVmIFdPUkQ2NAordHlwZWRlZiBsb25nIElOVDY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIENBUkQ2NDsKKyMgIGRlZmluZSBCMzIgOjMyCisjICBkZWZpbmUgQjE2IDoxNgorIyAgaWZkZWYgVU5TSUdORURCSVRGSUVMRFMKK3R5cGVkZWYgdW5zaWduZWQgaW50IElOVDMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgSU5UMTY7CisjICBlbHNlCit0eXBlZGVmIHNpZ25lZCBpbnQgSU5UMzI7Cit0eXBlZGVmIHNpZ25lZCBpbnQgSU5UMTY7CisjICBlbmRpZgorIyBlbHNlCisjICBkZWZpbmUgQjMyCisjICBkZWZpbmUgQjE2CisjICBpZmRlZiBMT05HNjQKK3R5cGVkZWYgbG9uZyBJTlQ2NDsKK3R5cGVkZWYgaW50IElOVDMyOworIyAgZWxzZQordHlwZWRlZiBsb25nIElOVDMyOworIyAgZW5kaWYKK3R5cGVkZWYgc2hvcnQgSU5UMTY7CisjIGVuZGlmCisKK3R5cGVkZWYgc2lnbmVkIGNoYXIgICAgSU5UODsKKworIyBpZmRlZiBMT05HNjQKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBDQVJENjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBDQVJEMzI7CisjIGVsc2UKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBDQVJEMzI7CisjIGVuZGlmCisjIGlmICFkZWZpbmVkKFdPUkQ2NCkgJiYgIWRlZmluZWQoTE9ORzY0KQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgQ0FSRDY0OworIyBlbmRpZgordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBDQVJEMTY7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIENBUkQ4OworCit0eXBlZGVmIENBUkQzMgkJQklUUzMyOwordHlwZWRlZiBDQVJEMTYJCUJJVFMxNjsKKwordHlwZWRlZiBDQVJEOAkJQllURTsKK3R5cGVkZWYgQ0FSRDgJCUJPT0w7CisKKy8qCisgKiBkZWZpbml0aW9ucyBmb3Igc2lnbi1leHRlbmRpbmcgYml0ZmllbGRzIG9uIDY0LWJpdCBhcmNoaXRlY3R1cmVzCisgKi8KKyMgaWYgZGVmaW5lZChXT1JENjQpICYmIGRlZmluZWQoVU5TSUdORURCSVRGSUVMRFMpCisjICBkZWZpbmUgY3Z0SU5UOHRvSW50KHZhbCkgICAoKCh2YWwpICYgMHgwMDAwMDA4MCkgPyAoKHZhbCkgfCAweGZmZmZmZmZmZmZmZmZmMDApIDogKHZhbCkpCisjICBkZWZpbmUgY3Z0SU5UMTZ0b0ludCh2YWwpICAoKCh2YWwpICYgMHgwMDAwODAwMCkgPyAoKHZhbCkgfCAweGZmZmZmZmZmZmZmZjAwMDApIDogKHZhbCkpCisjICBkZWZpbmUgY3Z0SU5UMzJ0b0ludCh2YWwpICAoKCh2YWwpICYgMHg4MDAwMDAwMCkgPyAoKHZhbCkgfCAweGZmZmZmZmZmMDAwMDAwMDApIDogKHZhbCkpCisjICBkZWZpbmUgY3Z0SU5UOHRvU2hvcnQodmFsKSAgY3Z0SU5UOHRvSW50KHZhbCkKKyMgIGRlZmluZSBjdnRJTlQxNnRvU2hvcnQodmFsKSBjdnRJTlQxNnRvSW50KHZhbCkKKyMgIGRlZmluZSBjdnRJTlQzMnRvU2hvcnQodmFsKSBjdnRJTlQzMnRvSW50KHZhbCkKKyMgIGRlZmluZSBjdnRJTlQ4dG9Mb25nKHZhbCkgIGN2dElOVDh0b0ludCh2YWwpCisjICBkZWZpbmUgY3Z0SU5UMTZ0b0xvbmcodmFsKSBjdnRJTlQxNnRvSW50KHZhbCkKKyMgIGRlZmluZSBjdnRJTlQzMnRvTG9uZyh2YWwpIGN2dElOVDMydG9JbnQodmFsKQorIyBlbHNlCisjICBkZWZpbmUgY3Z0SU5UOHRvSW50KHZhbCkgKHZhbCkKKyMgIGRlZmluZSBjdnRJTlQxNnRvSW50KHZhbCkgKHZhbCkKKyMgIGRlZmluZSBjdnRJTlQzMnRvSW50KHZhbCkgKHZhbCkKKyMgIGRlZmluZSBjdnRJTlQ4dG9TaG9ydCh2YWwpICh2YWwpCisjICBkZWZpbmUgY3Z0SU5UMTZ0b1Nob3J0KHZhbCkgKHZhbCkKKyMgIGRlZmluZSBjdnRJTlQzMnRvU2hvcnQodmFsKSAodmFsKQorIyAgZGVmaW5lIGN2dElOVDh0b0xvbmcodmFsKSAodmFsKQorIyAgZGVmaW5lIGN2dElOVDE2dG9Mb25nKHZhbCkgKHZhbCkKKyMgIGRlZmluZSBjdnRJTlQzMnRvTG9uZyh2YWwpICh2YWwpCisjIGVuZGlmIC8qIFdPUkQ2NCBhbmQgVU5TSUdORURCSVRGSUVMRFMgKi8KKworCisKKyMgaWZkZWYgTVVTVENPUFkKKy8qCisgKiBUaGlzIG1hY3JvIG11c3Qgbm90IGNhc3Qgb3IgZWxzZSBwb2ludGVycyB3aWxsIGdldCBhbGlnbmVkIGFuZCBiZSB3cm9uZworICovCisjICBkZWZpbmUgTkVYVFBUUihwLHQpICAoKChjaGFyICopIHApICsgU0laRU9GKHQpKQorIyBlbHNlIC8qIGVsc2Ugbm90IE1VU1RDT1BZLCB0aGlzIGlzIHVzZWQgZm9yIDMyLWJpdCBtYWNoaW5lcyAqLworLyoKKyAqIHRoaXMgdmVyc2lvbiBzaG91bGQgbGVhdmUgcmVzdWx0IG9mIHR5cGUgKHQgKiksIGJ1dCB0aGF0IHNob3VsZCBvbmx5IGJlCisgKiB1c2VkIHdoZW4gbm90IGluIE1VU1RDT1BZCisgKi8KKyMgIGRlZmluZSBORVhUUFRSKHAsdCkgKCgodCAqKShwKSkgKyAxKQorIyBlbmRpZiAvKiBNVVNUQ09QWSAtIHVzZWQgbWFjaGluZXMgd2hvc2UgQyBzdHJ1Y3RzIGRvbid0IGxpbmUgdXAgd2l0aCBwcm90byAqLworCisjZW5kaWYgLyogWE1EX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hvcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWG9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ2NzE2YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hvcy5oCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICoKK0NvcHlyaWdodCAxOTg3LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorICoKKyAqIFRoZSBYIFdpbmRvdyBTeXN0ZW0gaXMgYSBUcmFkZW1hcmsgb2YgVGhlIE9wZW4gR3JvdXAuCisgKgorICovCisKKy8qIFRoaXMgaXMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB0byB0cnkgYW5kIG1pbmltaXplIHN5c3RlbSBkZXBlbmRlbmNpZXMKKyAqIGluIGEgInNpZ25pZmljYW50IiBudW1iZXIgb2Ygc291cmNlIGZpbGVzLgorICovCisKKyNpZm5kZWYgX1hPU19IXworIyBkZWZpbmUgX1hPU19IXworCisjIGluY2x1ZGUgPFgxMS9Yb3NkZWZzLmg+CisKKy8qCisgKiBHZXQgbWFqb3IgZGF0YSB0eXBlcyAoZXNwLiBjYWRkcl90KQorICovCisKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyMgaWYgZGVmaW5lZChfX1NDT19fKSB8fCBkZWZpbmVkKF9fVU5JWFdBUkVfXykKKyMgIGluY2x1ZGUgPHN0ZGludC5oPgorIyBlbmRpZgorCisKKy8qCisgKiBKdXN0IGFib3V0IGV2ZXJ5b25lIG5lZWRzIHRoZSBzdHJpbmdzIHJvdXRpbmVzLiAgV2UgcHJvdmlkZSBib3RoIGZvcm1zIGhlcmUsCisgKiBpbmRleC9yaW5kZXggYW5kIHN0cmNoci9zdHJyY2hyLCBzbyBhbnkgc3lzdGVtcyB0aGF0IGRvbid0IHByb3ZpZGUgdGhlbSBhbGwKKyAqIG5lZWQgdG8gaGF2ZSAjZGVmaW5lcyBoZXJlLgorICoKKyAqIFRoZXNlIG1hY3JvcyBhcmUgZGVmaW5lZCB0aGlzIHdheSwgcmF0aGVyIHRoYW4sIGUuZy46CisgKiAgICAjZGVmaW5lZCBpbmRleChzLGMpIHN0cmNocihzLGMpCisgKiBiZWNhdXNlIHNvbWVvbmUgbWlnaHQgYmUgdXNpbmcgdGhlbSBhcyBmdW5jdGlvbiBwb2ludGVycywgYW5kIHN1Y2gKKyAqIGEgY2hhbmdlIHdvdWxkIGJyZWFrIGNvbXBhdGliaWxpdHkgZm9yIGFueW9uZSB3aG8ncyByZWx5aW5nIG9uIHRoZW0KKyAqIGJlaW5nIHRoZSB3YXkgdGhleSBjdXJyZW50bHkgYXJlLiBTbyB3ZSdyZSBzdHVjayB3aXRoIHRoZW0gdGhpcyB3YXksCisgKiB3aGljaCBjYW4gYmUgcmVhbGx5IGluY29udmVuaWVudC4gOi0oCisgKi8KKworIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgaWYgZGVmaW5lZChfX1NDT19fKSB8fCBkZWZpbmVkKF9fVU5JWFdBUkVfXykgfHwgZGVmaW5lZChfX3N1bikKKyMgIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyMgZWxzZQorIyAgaWZuZGVmIGluZGV4CisjICAgZGVmaW5lIGluZGV4KHMsYykgKHN0cmNocigocyksKGMpKSkKKyMgIGVuZGlmCisjICBpZm5kZWYgcmluZGV4CisjICAgZGVmaW5lIHJpbmRleChzLGMpIChzdHJyY2hyKChzKSwoYykpKQorIyAgZW5kaWYKKyMgZW5kaWYKKworLyoKKyAqIEdldCBvcGVuKDIpIGNvbnN0YW50cworICovCisjIGlmIGRlZmluZWQoWF9OT1RfUE9TSVgpCisjICBpbmNsdWRlIDxmY250bC5oPgorIyAgaWYgZGVmaW5lZChVU0wpIHx8IGRlZmluZWQoX19pMzg2X18pICYmIChkZWZpbmVkKFNZU1YpIHx8IGRlZmluZWQoU1ZSNCkpCisjICAgaW5jbHVkZSA8dW5pc3RkLmg+CisjICBlbmRpZgorIyAgaWZkZWYgV0lOMzIKKyMgICBpbmNsdWRlIDxYMTEvWHczMmRlZnMuaD4KKyMgIGVsc2UKKyMgICBpbmNsdWRlIDxzeXMvZmlsZS5oPgorIyAgZW5kaWYKKyMgZWxzZSAvKiBYX05PVF9QT1NJWCAqLworIyAgaW5jbHVkZSA8ZmNudGwuaD4KKyMgIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBlbmRpZiAvKiBYX05PVF9QT1NJWCBlbHNlICovCisKKy8qCisgKiBHZXQgc3RydWN0IHRpbWV2YWwgYW5kIHN0cnVjdCB0bQorICovCisKKyMgaWYgZGVmaW5lZChfUE9TSVhfU09VUkNFKSAmJiBkZWZpbmVkKFNWUjQpCisvKiBuZWVkIHRvIG9taXQgX1BPU0lYX1NPVVJDRSBpbiBvcmRlciB0byBnZXQgd2hhdCB3ZSB3YW50IGluIFNWUjQgKi8KKyMgIHVuZGVmIF9QT1NJWF9TT1VSQ0UKKyMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjICBkZWZpbmUgX1BPU0lYX1NPVVJDRQorIyBlbGlmIGRlZmluZWQoV0lOMzIpCisjICBpbmNsdWRlIDx0aW1lLmg+CisjICBpZiAhZGVmaW5lZChfV0lOU09DS0FQSV8pICYmICFkZWZpbmVkKF9XSUxMV0lOU09DS18pICYmICFkZWZpbmVkKF9USU1FVkFMX0RFRklORUQpICYmICFkZWZpbmVkKF9TVFJVQ1RfVElNRVZBTCkKK3N0cnVjdCB0aW1ldmFsIHsKKyAgICBsb25nICAgIHR2X3NlYzsgICAgICAgICAvKiBzZWNvbmRzICovCisgICAgbG9uZyAgICB0dl91c2VjOyAgICAgICAgLyogYW5kIG1pY3Jvc2Vjb25kcyAqLworfTsKKyMgICBkZWZpbmUgX1RJTUVWQUxfREVGSU5FRAorIyAgZW5kaWYKKyMgIGluY2x1ZGUgPHN5cy90aW1lYi5oPgorIyAgZGVmaW5lIGdldHRpbWVvZmRheSh0KSBcCit7IFwKKyAgICBzdHJ1Y3QgX3RpbWViIF9ndG9kdG1wOyBcCisgICAgX2Z0aW1lICgmX2d0b2R0bXApOyBcCisgICAgKHQpLT50dl9zZWMgPSBfZ3RvZHRtcC50aW1lOyBcCisgICAgKHQpLT50dl91c2VjID0gX2d0b2R0bXAubWlsbGl0bSAqIDEwMDA7IFwKK30KKyMgZWxzZQorIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyMgIGluY2x1ZGUgPHRpbWUuaD4KKyMgZW5kaWYgLyogZGVmaW5lZChfUE9TSVhfU09VUkNFKSAmJiBkZWZpbmVkKFNWUjQpICovCisKKy8qIGRlZmluZSBYX0dFVFRJTUVPRkRBWSBtYWNybywgYSBwb3J0YWJsZSBnZXR0aW1lb2ZkYXkoKSAqLworIyBpZiBkZWZpbmVkKF9YT1BFTl9YUEc0KSB8fCBkZWZpbmVkKF9YT1BFTl9VTklYKSAvKiBfWE9QRU5fVU5JWCBpcyBYUEc0LjIgKi8KKyMgIGRlZmluZSBYX0dFVFRJTUVPRkRBWSh0KSBnZXR0aW1lb2ZkYXkodCwgKHN0cnVjdCB0aW1lem9uZSopMCkKKyMgZWxzZQorIyAgaWYgZGVmaW5lZChTVlI0KSB8fCBkZWZpbmVkKF9fU1ZSNCkgfHwgZGVmaW5lZChXSU4zMikKKyMgICBkZWZpbmUgWF9HRVRUSU1FT0ZEQVkodCkgZ2V0dGltZW9mZGF5KHQpCisjICBlbHNlCisjICAgZGVmaW5lIFhfR0VUVElNRU9GREFZKHQpIGdldHRpbWVvZmRheSh0LCAoc3RydWN0IHRpbWV6b25lKikwKQorIyAgZW5kaWYKKyMgZW5kaWYgLyogWFBHNCBlbHNlICovCisKKworIyBpZmRlZiBfX0dOVV9fCisjICBkZWZpbmUgUEFUSF9NQVggNDA5NgorIyAgZGVmaW5lIE1BWFBBVEhMRU4gNDA5NgorIyAgZGVmaW5lIE9QRU5fTUFYIDI1NiAvKiBXZSBkZWZpbmUgYSByZWFzb25hYmxlIGxpbWl0LiAgKi8KKyMgZW5kaWYKKworLyogdXNlIFBPU0lYIG5hbWUgZm9yIHNpZ25hbCAqLworIyBpZiBkZWZpbmVkKFhfTk9UX1BPU0lYKSAmJiBkZWZpbmVkKFNZU1YpICYmICFkZWZpbmVkKFNJR0NITEQpCisjICBkZWZpbmUgU0lHQ0hMRCBTSUdDTEQKKyMgZW5kaWYKKworIyBpbmNsdWRlIDxYMTEvWGFyY2guaD4KKworI2VuZGlmIC8qIF9YT1NfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hvc19yLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9Yb3Nfci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NjNiNjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9Yb3Nfci5oCkBAIC0wLDAgKzEsMTA5NSBAQAorLyoKK0NvcHlyaWdodCAxOTk2LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorKi8KKworLyoKKyAqIFZhcmlvdXMgYW5kIHN1bmRyeSBUaHJlYWQtU2FmZSBmdW5jdGlvbnMgdXNlZCBieSBYMTEsIE1vdGlmLCBhbmQgQ0RFLgorICoKKyAqIFVzZSB0aGlzIGZpbGUgaW4gTVQtc2FmZSBjb2RlIHdoZXJlIHlvdSB3b3VsZCBoYXZlIGluY2x1ZGVkCisgKgk8ZGlyZW50Lmg+CWZvciByZWFkZGlyKCkKKyAqCTxncnAuaD4JCWZvciBnZXRncmdpZCgpIG9yIGdldGdybmFtKCkKKyAqCTxuZXRkYi5oPglmb3IgZ2V0aG9zdGJ5bmFtZSgpLCBnZXRob3N0YnlhZGRyKCksIG9yIGdldHNlcnZieW5hbWUoKQorICoJPHB3ZC5oPgkJZm9yIGdldHB3bmFtKCkgb3IgZ2V0cHd1aWQoKQorICoJPHN0cmluZy5oPglmb3Igc3RydG9rKCkKKyAqCTx0aW1lLmg+CWZvciBhc2N0aW1lKCksIGN0aW1lKCksIGxvY2FsdGltZSgpLCBvciBnbXRpbWUoKQorICoJPHVuaXN0ZC5oPglmb3IgZ2V0bG9naW4oKSBvciB0dHluYW1lKCkKKyAqIG9yIHRoZWlyIHRocmVhZC1zYWZlIGFuYWxvZ3MuCisgKgorICogSWYgeW91IGFyZSBvbiBhIHBsYXRmb3JtIHRoYXQgZGVmaW5lcyBYVEhSRUFEUyBidXQgZG9lcyBub3QgaGF2ZQorICogTVQtc2FmZSBzeXN0ZW0gQVBJIChlLmcuIFVuaXhXYXJlKSB5b3UgbXVzdCBkZWZpbmUgX1hvc19wcm9jZXNzTG9jaworICogYW5kIF9Yb3NfcHJvY2Vzc1VubG9jayBtYWNyb3MgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGhlYWRlci4KKyAqCisgKiBGb3IgY29udmVuaWVuY2UgWE9TX1VTRV9YTElCX0xPQ0tJTkcgb3IgWE9TX1VTRV9YVF9MT0NLSU5HIG1heSBiZSBkZWZpbmVkCisgKiB0byBvYnRhaW4gZWl0aGVyIFhsaWItb25seSBvciBYdC1iYXNlZCB2ZXJzaW9ucyBvZiB0aGVzZSBtYWNyb3MuICBUaGVzZQorICogbWFjcm9zIHdvbid0IHJlc3VsdCBpbiB0cnVseSB0aHJlYWQtc2FmZSBjYWxscywgYnV0IHRoZXkgYXJlIGJldHRlciB0aGFuCisgKiBub3RoaW5nLiAgSWYgeW91IGRvIG5vdCB3YW50IGxvY2tpbmcgaW4gdGhpcyBzaXR1YXRpb24gZGVmaW5lCisgKiBYT1NfVVNFX05PX0xPQ0tJTkcuCisgKgorICogTk9URTogT24gc3lzdGVtcyBsYWNraW5nIGFwcHJvcHJpYXRlIF9yIGZ1bmN0aW9ucyBHZXRob3N0YnluYW1lKCksCisgKglHZXRob3N0YnlhZGRyKCksIGFuZCBHZXRzZXJ2YnluYW1lKCkgZG8gTk9UIGNvcHkgdGhlIGhvc3Qgb3IKKyAqCXByb3RvY29sIGxpc3RzIQorICoKKyAqIE5PVEU6IE9uIHN5c3RlbXMgbGFja2luZyBhcHByb3ByaWF0ZSBfciBmdW5jdGlvbnMgR2V0Z3JnaWQoKSBhbmQKKyAqCUdldGdybmFtKCkgZG8gTk9UIGNvcHkgdGhlIGxpc3Qgb2YgZ3JvdXAgbWVtYmVycyEKKyAqCisgKiBUaGlzIGhlYWRlciBpcyBub21pbmFsbHkgaW50ZW5kZWQgdG8gc2ltcGxpZnkgcG9ydGluZyBYMTEsIE1vdGlmLCBhbmQKKyAqIENERTsgaXQgbWF5IGJlIHVzZWZ1bCB0byBvdGhlciBwZW9wbGUgdG9vLiAgVGhlIHN0cnVjdHVyZSBiZWxvdyBpcworICogY29tcGxpY2F0ZWQsIG1vc3RseSBiZWNhdXNlIFAxMDAzLjFjICh0aGUgSUVFRSBQT1NJWCBUaHJlYWRzIHNwZWMpCisgKiB3ZW50IHRocm91Z2ggbG90cyBvZiBkcmFmdHMsIGFuZCBzb21lIHZlbmRvcnMgc2hpcHBlZCBzeXN0ZW1zIGJhc2VkCisgKiBvbiBkcmFmdCBBUEkgdGhhdCB3ZXJlIGNoYW5nZWQgbGF0ZXIuICBVbmZvcnR1bmF0ZWx5IFBPU0lYIGRpZCBub3QKKyAqIHByb3ZpZGUgYSBmZWF0dXJlLXRlc3QgbWFjcm8gZm9yIGRpc3Rpbmd1aXNoaW5nIGVhY2ggb2YgdGhlIGRyYWZ0cy4KKyAqLworCisvKgorICogVGhpcyBoZWFkZXIgaGFzIHNldmVyYWwgcGFydHMuICBTZWFyY2ggZm9yICJFZmZlY3RpdmUgcHJvdG90eXBlcyIKKyAqIHRvIGxvY2F0ZSB0aGUgYmVnaW5uaW5nIG9mIGEgc2VjdGlvbi4KKyAqLworCisvKiBUaGlzIGhlYWRlciBjYW4gYmUgaW5jbHVkZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgZGVmaW5lcyEgKi8KKyNpZm5kZWYgX1hPU19SX0hfCisjIGRlZmluZSBfWE9TX1JfSF8KKworIyBpbmNsdWRlIDxYMTEvWG9zLmg+CisjIGluY2x1ZGUgPFgxMS9YZnVuY3MuaD4KKworIyBpZm5kZWYgWF9OT1RfUE9TSVgKKyMgIGlmZGVmIF9QT1NJWF9TT1VSQ0UKKyMgICBpbmNsdWRlIDxsaW1pdHMuaD4KKyMgIGVsc2UKKyMgICBkZWZpbmUgX1BPU0lYX1NPVVJDRQorIyAgIGluY2x1ZGUgPGxpbWl0cy5oPgorIyAgIHVuZGVmIF9QT1NJWF9TT1VSQ0UKKyMgIGVuZGlmCisjICBpZm5kZWYgTElORV9NQVgKKyMgICBkZWZpbmUgWF9MSU5FX01BWCAyMDQ4CisjICBlbHNlCisjICAgZGVmaW5lIFhfTElORV9NQVggTElORV9NQVgKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYgLyogX1hPU19SX0ggKi8KKworI2lmbmRlZiBXSU4zMgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyMgaWYgZGVmaW5lZChYT1NfVVNFX1hMSUJfTE9DS0lORykKKyMgIGlmbmRlZiBYQWxsb2NJRHMgLyogWGxpYmludC5oIGRvZXMgbm90IGhhdmUgbXVsdGlwbGUgaW5jbHVkZSBwcm90ZWN0aW9uICovCit0eXBlZGVmIHN0cnVjdCBfTG9ja0luZm9SZWMgKkxvY2tJbmZvUHRyOworZXh0ZXJuIExvY2tJbmZvUHRyIF9YZ2xvYmFsX2xvY2s7CisjICBlbmRpZgorIyAgaWZuZGVmIF9Yb3NfaXNUaHJlYWRJbml0aWFsaXplZAorIyAgIGRlZmluZSBfWG9zX2lzVGhyZWFkSW5pdGlhbGl6ZWQJKF9YZ2xvYmFsX2xvY2spCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZChYVEhSRUFEU19XQVJOKSB8fCBkZWZpbmVkKFhUSFJFQURTX0ZJTEVfTElORSkKKyMgICBpZm5kZWYgWEFsbG9jSURzIC8qIFhsaWJpbnQuaCBkb2VzIG5vdCBoYXZlIG11bHRpcGxlIGluY2x1ZGUgcHJvdGVjdGlvbiAqLworIyAgICBpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgkvKiBmb3IgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcyAqLworZXh0ZXJuIHZvaWQgKCpfWExvY2tNdXRleF9mbikoCisjICAgIGlmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKKyAgICBMb2NrSW5mb1B0cgkvKiBsb2NrICovLCBjaGFyICogLyogZmlsZSAqLywgaW50IC8qIGxpbmUgKi8KKyMgICAgZW5kaWYKKyk7CitleHRlcm4gdm9pZCAoKl9YVW5sb2NrTXV0ZXhfZm4pKAorIyAgICBpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCisgICAgTG9ja0luZm9QdHIJLyogbG9jayAqLywgY2hhciAqIC8qIGZpbGUgKi8sIGludCAvKiBsaW5lICovCisjICAgIGVuZGlmCispOworIyAgIGVuZGlmCisjICAgaWZuZGVmIF9Yb3NfcHJvY2Vzc0xvY2sKKyMgICAgZGVmaW5lIF9Yb3NfcHJvY2Vzc0xvY2sJXAorICAoX1hMb2NrTXV0ZXhfZm4gPyAoKl9YTG9ja011dGV4X2ZuKShfWGdsb2JhbF9sb2NrLF9fRklMRV9fLF9fTElORV9fKSA6IDApCisjICAgZW5kaWYKKyMgICBpZm5kZWYgX1hvc19wcm9jZXNzVW5sb2NrCisjICAgIGRlZmluZSBfWG9zX3Byb2Nlc3NVbmxvY2sJXAorICAoX1hVbmxvY2tNdXRleF9mbiA/ICgqX1hVbmxvY2tNdXRleF9mbikoX1hnbG9iYWxfbG9jayxfX0ZJTEVfXyxfX0xJTkVfXykgOiAwKQorIyAgIGVuZGlmCisjICBlbHNlCisjICAgaWZuZGVmIFhBbGxvY0lEcyAvKiBYbGliaW50LmggZG9lcyBub3QgaGF2ZSBtdWx0aXBsZSBpbmNsdWRlIHByb3RlY3Rpb24gKi8KKyMgICAgaW5jbHVkZSA8WDExL1hmdW5jcHJvdG8uaD4JLyogZm9yIE5lZWRGdW5jdGlvblByb3RvdHlwZXMgKi8KK2V4dGVybiB2b2lkICgqX1hMb2NrTXV0ZXhfZm4pKAorIyAgICBpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCisgICAgTG9ja0luZm9QdHIJLyogbG9jayAqLworIyAgICBlbmRpZgorKTsKK2V4dGVybiB2b2lkICgqX1hVbmxvY2tNdXRleF9mbikoCisjICAgIGlmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKKyAgICBMb2NrSW5mb1B0cgkvKiBsb2NrICovCisjICAgIGVuZGlmCispOworIyAgIGVuZGlmCisjICAgaWZuZGVmIF9Yb3NfcHJvY2Vzc0xvY2sKKyMgICAgZGVmaW5lIF9Yb3NfcHJvY2Vzc0xvY2sJXAorICAoX1hMb2NrTXV0ZXhfZm4gPyAoKCpfWExvY2tNdXRleF9mbikoX1hnbG9iYWxfbG9jayksIDApIDogMCkKKyMgICBlbmRpZgorIyAgIGlmbmRlZiBfWG9zX3Byb2Nlc3NVbmxvY2sKKyMgICAgZGVmaW5lIF9Yb3NfcHJvY2Vzc1VubG9jawlcCisgIChfWFVubG9ja011dGV4X2ZuID8gKCgqX1hVbmxvY2tNdXRleF9mbikoX1hnbG9iYWxfbG9jayksIDApIDogMCkKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZWxpZiBkZWZpbmVkKFhPU19VU0VfWFRfTE9DS0lORykKKyMgIGlmbmRlZiBfWHRUaHJlYWRzSV9oCitleHRlcm4gdm9pZCAoKl9YdFByb2Nlc3NMb2NrKSh2b2lkKTsKKyMgIGVuZGlmCisjICBpZm5kZWYgX1h0aW50cmluc2ljUF9oCisjICAgaW5jbHVkZSA8WDExL1hmdW5jcHJvdG8uaD4JLyogZm9yIE5lZWRGdW5jdGlvblByb3RvdHlwZXMgKi8KK2V4dGVybiB2b2lkIFh0UHJvY2Vzc0xvY2soCisjICAgaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcworICAgIHZvaWQKKyMgICBlbmRpZgorKTsKK2V4dGVybiB2b2lkIFh0UHJvY2Vzc1VubG9jaygKKyMgICBpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCisgICAgdm9pZAorIyAgIGVuZGlmCispOworIyAgZW5kaWYKKyMgIGlmbmRlZiBfWG9zX2lzVGhyZWFkSW5pdGlhbGl6ZWQKKyMgICBkZWZpbmUgX1hvc19pc1RocmVhZEluaXRpYWxpemVkCV9YdFByb2Nlc3NMb2NrCisjICBlbmRpZgorIyAgaWZuZGVmIF9Yb3NfcHJvY2Vzc0xvY2sKKyMgICBkZWZpbmUgX1hvc19wcm9jZXNzTG9jawkJWHRQcm9jZXNzTG9jaygpCisjICBlbmRpZgorIyAgaWZuZGVmIF9Yb3NfcHJvY2Vzc1VubG9jaworIyAgIGRlZmluZSBfWG9zX3Byb2Nlc3NVbmxvY2sJCVh0UHJvY2Vzc1VubG9jaygpCisjICBlbmRpZgorIyBlbGlmIGRlZmluZWQoWE9TX1VTRV9OT19MT0NLSU5HKQorIyAgaWZuZGVmIF9Yb3NfaXNUaHJlYWRJbml0aWFsaXplZAorIyAgIGRlZmluZSBfWG9zX2lzVGhyZWFkSW5pdGlhbGl6ZWQJMAorIyAgZW5kaWYKKyMgIGlmbmRlZiBfWG9zX3Byb2Nlc3NMb2NrCisjICAgZGVmaW5lIF9Yb3NfcHJvY2Vzc0xvY2sJCTAKKyMgIGVuZGlmCisjICBpZm5kZWYgX1hvc19wcm9jZXNzVW5sb2NrCisjICAgZGVmaW5lIF9Yb3NfcHJvY2Vzc1VubG9jawkJMAorIyAgZW5kaWYKKyMgZW5kaWYKKworI2VuZGlmIC8qICFkZWZpbmVkIFdJTjMyICovCisKKy8qCisgKiBTb2xhcmlzIGRlZmluZXMgdGhlIFBPU0lYIHRocmVhZC1zYWZlIGZlYXR1cmUgdGVzdCBtYWNybywgYnV0CisgKiB1c2VzIHRoZSBvbGRlciBTVlI0IHRocmVhZC1zYWZlIGZ1bmN0aW9ucyB1bmxlc3MgdGhlIFBPU0lYIG9uZXMKKyAqIGFyZSBzcGVjaWZpY2FsbHkgcmVxdWVzdGVkLiAgRml4IHRoZSBmZWF0dXJlIHRlc3QgbWFjcm8uCisgKi8KKyNpZiBkZWZpbmVkKF9fc3VuKSAmJiBkZWZpbmVkKF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMpICYmIFwKKwkoX1BPU0lYX0NfU09VUkNFIC0gMCA8IDE5OTUwNkwpICYmICFkZWZpbmVkKF9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUykKKyMgdW5kZWYgX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUworI2VuZGlmCisKKy8qKioqKiA8cHdkLmg+IHdyYXBwZXJzICoqKioqLworCisvKgorICogRWZmZWN0aXZlIHByb3RvdHlwZXMgZm9yIDxwd2QuaD4gd3JhcHBlcnM6CisgKgorICogI2RlZmluZSBYX0lOQ0xVREVfUFdEX0gKKyAqICNkZWZpbmUgWE9TX1VTRV8uLi5fTE9DS0lORworICogI2luY2x1ZGUgPFgxMS9Yb3Nfci5oPgorICoKKyAqIHR5cGVkZWYgLi4uIF9YZ2V0cHdwYXJhbXM7CisgKgorICogc3RydWN0IHBhc3N3ZCogX1hHZXRwd25hbShjb25zdCBjaGFyICpuYW1lLCBfWGdldHB3cGFyYW1zKTsKKyAqIHN0cnVjdCBwYXNzd2QqIF9YR2V0cHd1aWQodWlkX3QgdWlkLCBfWGdldHB3cGFyYW1zKTsKKyAqLworCisjaWYgZGVmaW5lZChYX0lOQ0xVREVfUFdEX0gpICYmICFkZWZpbmVkKF9YT1NfSU5DTFVERURfUFdEX0gpCisjIGluY2x1ZGUgPHB3ZC5oPgorIyBpZiBkZWZpbmVkKFhVU0VfTVRTQUZFX0FQSSkgfHwgZGVmaW5lZChYVVNFX01UU0FGRV9QV0RBUEkpCisjICBkZWZpbmUgWE9TX1VTRV9NVFNBRkVfUFdEQVBJIDEKKyMgZW5kaWYKKyNlbmRpZgorCisjdW5kZWYgWF9ORUVEU19QV1BBUkFNUworI2lmICFkZWZpbmVkKFhfSU5DTFVERV9QV0RfSCkgfHwgZGVmaW5lZChfWE9TX0lOQ0xVREVEX1BXRF9IKQorLyogRG8gbm90aGluZyAqLworCisjZWxpZiAhZGVmaW5lZChYVEhSRUFEUykgJiYgIWRlZmluZWQoWF9GT1JDRV9VU0VfTVRTQUZFX0FQSSkKKy8qIFVzZSByZWd1bGFyLCB1bnNhZmUgQVBJLiAqLworIyBpZiBkZWZpbmVkKFhfTk9UX1BPU0lYKSAmJiAhZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoU1lTVikKK2V4dGVybiBzdHJ1Y3QgcGFzc3dkICpnZXRwd3VpZCgpLCAqZ2V0cHduYW0oKTsKKyMgZW5kaWYKK3R5cGVkZWYgaW50IF9YZ2V0cHdwYXJhbXM7CS8qIGR1bW15ICovCisjIGRlZmluZSBfWEdldHB3dWlkKHUscCkJZ2V0cHd1aWQoKHUpKQorIyBkZWZpbmUgX1hHZXRwd25hbSh1LHApCWdldHB3bmFtKCh1KSkKKworI2VsaWYgIWRlZmluZWQoWE9TX1VTRV9NVFNBRkVfUFdEQVBJKSB8fCBkZWZpbmVkKFhOT19NVFNBRkVfUFdEQVBJKQorLyogVW5peFdhcmUgMi4wLCBvciBvdGhlciBzeXN0ZW1zIHdpdGggdGhyZWFkIHN1cHBvcnQgYnV0IG5vIF9yIEFQSS4gKi8KKyMgZGVmaW5lIFhfTkVFRFNfUFdQQVJBTVMKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IHBhc3N3ZCBwd3M7CisgIGNoYXIgICBwd2J1ZlsxMDI0XTsKKyAgc3RydWN0IHBhc3N3ZCogcHdwOworICBzaXplX3QgbGVuOworfSBfWGdldHB3cGFyYW1zOworCisvKgorICogTmV0QlNEIGFuZCBGcmVlQlNELCBhdCBsZWFzdCwgYXJlIG1pc3Npbmcgc2V2ZXJhbCBvZiB0aGUgdW5peHdhcmUgcGFzc3dkCisgKiBmaWVsZHMuCisgKi8KKworI2lmIGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykgfHwgXAorICAgIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fRHJhZ29uRmx5X18pCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9YcHdfY29weVBhc3N3ZChfWGdldHB3cGFyYW1zIHApCit7CisgICBtZW1jcHkoJihwKS5wd3MsIChwKS5wd3AsIHNpemVvZihzdHJ1Y3QgcGFzc3dkKSk7CisKKyAgIChwKS5wd3MucHdfbmFtZSA9IChwKS5wd2J1ZjsKKyAgIChwKS5sZW4gPSBzdHJsZW4oKHApLnB3cC0+cHdfbmFtZSk7CisgICBzdHJjcHkoKHApLnB3cy5wd19uYW1lLCAocCkucHdwLT5wd19uYW1lKTsKKworICAgKHApLnB3cy5wd19wYXNzd2QgPSAocCkucHdzLnB3X25hbWUgKyAocCkubGVuICsgMTsKKyAgIChwKS5sZW4gPSBzdHJsZW4oKHApLnB3cC0+cHdfcGFzc3dkKTsKKyAgIHN0cmNweSgocCkucHdzLnB3X3Bhc3N3ZCwocCkucHdwLT5wd19wYXNzd2QpOworCisgICAocCkucHdzLnB3X2NsYXNzID0gKHApLnB3cy5wd19wYXNzd2QgKyAocCkubGVuICsgMTsKKyAgIChwKS5sZW4gPSBzdHJsZW4oKHApLnB3cC0+cHdfY2xhc3MpOworICAgc3RyY3B5KChwKS5wd3MucHdfY2xhc3MsIChwKS5wd3AtPnB3X2NsYXNzKTsKKworICAgKHApLnB3cy5wd19nZWNvcyA9IChwKS5wd3MucHdfY2xhc3MgKyAocCkubGVuICsgMTsKKyAgIChwKS5sZW4gPSBzdHJsZW4oKHApLnB3cC0+cHdfZ2Vjb3MpOworICAgc3RyY3B5KChwKS5wd3MucHdfZ2Vjb3MsIChwKS5wd3AtPnB3X2dlY29zKTsKKworICAgKHApLnB3cy5wd19kaXIgPSAocCkucHdzLnB3X2dlY29zICsgKHApLmxlbiArIDE7CisgICAocCkubGVuID0gc3RybGVuKChwKS5wd3AtPnB3X2Rpcik7CisgICBzdHJjcHkoKHApLnB3cy5wd19kaXIsIChwKS5wd3AtPnB3X2Rpcik7CisKKyAgIChwKS5wd3MucHdfc2hlbGwgPSAocCkucHdzLnB3X2RpciArIChwKS5sZW4gKyAxOworICAgKHApLmxlbiA9IHN0cmxlbigocCkucHdwLT5wd19zaGVsbCk7CisgICBzdHJjcHkoKHApLnB3cy5wd19zaGVsbCwgKHApLnB3cC0+cHdfc2hlbGwpOworCisgICAocCkucHdwID0gJihwKS5wd3M7Cit9CisKKyNlbHNlCisjIGRlZmluZSBfWHB3X2NvcHlQYXNzd2QocCkgXAorICAgKG1lbWNweSgmKHApLnB3cywgKHApLnB3cCwgc2l6ZW9mKHN0cnVjdCBwYXNzd2QpKSwgXAorICAgICgocCkucHdzLnB3X25hbWUgPSAocCkucHdidWYpLCBcCisgICAgKChwKS5sZW4gPSBzdHJsZW4oKHApLnB3cC0+cHdfbmFtZSkpLCBcCisgICAgc3RyY3B5KChwKS5wd3MucHdfbmFtZSwgKHApLnB3cC0+cHdfbmFtZSksIFwKKyAgICAoKHApLnB3cy5wd19wYXNzd2QgPSAocCkucHdzLnB3X25hbWUgKyAocCkubGVuICsgMSksIFwKKyAgICAoKHApLmxlbiA9IHN0cmxlbigocCkucHdwLT5wd19wYXNzd2QpKSwgXAorICAgIHN0cmNweSgocCkucHdzLnB3X3Bhc3N3ZCwocCkucHdwLT5wd19wYXNzd2QpLCBcCisgICAgKChwKS5wd3MucHdfYWdlID0gKHApLnB3cy5wd19wYXNzd2QgKyAocCkubGVuICsgMSksIFwKKyAgICAoKHApLmxlbiA9IHN0cmxlbigocCkucHdwLT5wd19hZ2UpKSwgXAorICAgIHN0cmNweSgocCkucHdzLnB3X2FnZSwgKHApLnB3cC0+cHdfYWdlKSwgXAorICAgICgocCkucHdzLnB3X2NvbW1lbnQgPSAocCkucHdzLnB3X2FnZSArIChwKS5sZW4gKyAxKSwgXAorICAgICgocCkubGVuID0gc3RybGVuKChwKS5wd3AtPnB3X2NvbW1lbnQpKSwgXAorICAgIHN0cmNweSgocCkucHdzLnB3X2NvbW1lbnQsIChwKS5wd3AtPnB3X2NvbW1lbnQpLCBcCisgICAgKChwKS5wd3MucHdfZ2Vjb3MgPSAocCkucHdzLnB3X2NvbW1lbnQgKyAocCkubGVuICsgMSksIFwKKyAgICAoKHApLmxlbiA9IHN0cmxlbigocCkucHdwLT5wd19nZWNvcykpLCBcCisgICAgc3RyY3B5KChwKS5wd3MucHdfZ2Vjb3MsIChwKS5wd3AtPnB3X2dlY29zKSwgXAorICAgICgocCkucHdzLnB3X2RpciA9IChwKS5wd3MucHdfY29tbWVudCArIChwKS5sZW4gKyAxKSwgXAorICAgICgocCkubGVuID0gc3RybGVuKChwKS5wd3AtPnB3X2RpcikpLCBcCisgICAgc3RyY3B5KChwKS5wd3MucHdfZGlyLCAocCkucHdwLT5wd19kaXIpLCBcCisgICAgKChwKS5wd3MucHdfc2hlbGwgPSAocCkucHdzLnB3X2RpciArIChwKS5sZW4gKyAxKSwgXAorICAgICgocCkubGVuID0gc3RybGVuKChwKS5wd3AtPnB3X3NoZWxsKSksIFwKKyAgICBzdHJjcHkoKHApLnB3cy5wd19zaGVsbCwgKHApLnB3cC0+cHdfc2hlbGwpLCBcCisgICAgKChwKS5wd3AgPSAmKHApLnB3cyksIFwKKyAgICAwICkKKyNlbmRpZgorIyBkZWZpbmUgX1hHZXRwd3VpZCh1LHApIFwKKyggKF9Yb3NfcHJvY2Vzc0xvY2spLCBcCisgICgoKHApLnB3cCA9IGdldHB3dWlkKCh1KSkpID8gX1hwd19jb3B5UGFzc3dkKHApLCAwIDogMCksIFwKKyAgKF9Yb3NfcHJvY2Vzc1VubG9jayksIFwKKyAgKHApLnB3cCApCisjIGRlZmluZSBfWEdldHB3bmFtKHUscCkgXAorKCAoX1hvc19wcm9jZXNzTG9jayksIFwKKyAgKCgocCkucHdwID0gZ2V0cHduYW0oKHUpKSkgPyBfWHB3X2NvcHlQYXNzd2QocCksIDAgOiAwKSwgXAorICAoX1hvc19wcm9jZXNzVW5sb2NrKSwgXAorICAocCkucHdwICkKKworI2VsaWYgIWRlZmluZWQoX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUykgJiYgIWRlZmluZWQoX19BUFBMRV9fKQorIyBkZWZpbmUgWF9ORUVEU19QV1BBUkFNUwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QgcGFzc3dkIHB3czsKKyAgY2hhciBwd2J1ZltYX0xJTkVfTUFYXTsKK30gX1hnZXRwd3BhcmFtczsKKyMgaWYgZGVmaW5lZChfUE9TSVhfUkVFTlRSQU5UX0ZVTkNUSU9OUykgfHwgIWRlZmluZWQoU1ZSNCkKKyMgICBkZWZpbmUgX1hHZXRwd3VpZCh1LHApIFwKKygoZ2V0cHd1aWRfcigodSksJihwKS5wd3MsKHApLnB3YnVmLHNpemVvZigocCkucHdidWYpKSA9PSAtMSkgPyBOVUxMIDogJihwKS5wd3MpCisjICAgZGVmaW5lIF9YR2V0cHduYW0odSxwKSBcCisoKGdldHB3bmFtX3IoKHUpLCYocCkucHdzLChwKS5wd2J1ZixzaXplb2YoKHApLnB3YnVmKSkgPT0gLTEpID8gTlVMTCA6ICYocCkucHdzKQorIyBlbHNlIC8qIFNWUjQgKi8KKyMgIGRlZmluZSBfWEdldHB3dWlkKHUscCkgXAorKChnZXRwd3VpZF9yKCh1KSwmKHApLnB3cywocCkucHdidWYsc2l6ZW9mKChwKS5wd2J1ZikpID09IE5VTEwpID8gTlVMTCA6ICYocCkucHdzKQorIyAgZGVmaW5lIF9YR2V0cHduYW0odSxwKSBcCisoKGdldHB3bmFtX3IoKHUpLCYocCkucHdzLChwKS5wd2J1ZixzaXplb2YoKHApLnB3YnVmKSkgPT0gTlVMTCkgPyBOVUxMIDogJihwKS5wd3MpCisjIGVuZGlmIC8qIFNWUjQgKi8KKworI2Vsc2UgLyogX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUyAqLworIyBkZWZpbmUgWF9ORUVEU19QV1BBUkFNUwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QgcGFzc3dkIHB3czsKKyAgY2hhciBwd2J1ZltYX0xJTkVfTUFYXTsKKyAgc3RydWN0IHBhc3N3ZCogcHdwOworfSBfWGdldHB3cGFyYW1zOwordHlwZWRlZiBpbnQgX1hnZXRwd3JldDsKKyMgZGVmaW5lIF9YR2V0cHd1aWQodSxwKSBcCisoKGdldHB3dWlkX3IoKHUpLCYocCkucHdzLChwKS5wd2J1ZixzaXplb2YoKHApLnB3YnVmKSwmKHApLnB3cCkgPT0gMCkgPyBcCisgKHApLnB3cCA6IE5VTEwpCisjIGRlZmluZSBfWEdldHB3bmFtKHUscCkgXAorKChnZXRwd25hbV9yKCh1KSwmKHApLnB3cywocCkucHdidWYsc2l6ZW9mKChwKS5wd2J1ZiksJihwKS5wd3ApID09IDApID8gXAorIChwKS5wd3AgOiBOVUxMKQorI2VuZGlmIC8qIFhfSU5DTFVERV9QV0RfSCAqLworCisjaWYgZGVmaW5lZChYX0lOQ0xVREVfUFdEX0gpICYmICFkZWZpbmVkKF9YT1NfSU5DTFVERURfUFdEX0gpCisjIGRlZmluZSBfWE9TX0lOQ0xVREVEX1BXRF9ICisjZW5kaWYKKworCisvKioqKiogPG5ldGRiLmg+IHdyYXBwZXJzICoqKioqLworCisvKgorICogRWZmZWN0aXZlIHByb3RvdHlwZXMgZm9yIDxuZXRkYi5oPiB3cmFwcGVyczoKKyAqCisgKiBOT1RFOiBPbiBzeXN0ZW1zIGxhY2tpbmcgdGhlIGFwcHJvcHJpYXRlIF9yIGZ1bmN0aW9ucyBHZXRob3N0YnluYW1lKCksCisgKglHZXRob3N0YnlhZGRyKCksIGFuZCBHZXRzZXJ2YnluYW1lKCkgZG8gTk9UIGNvcHkgdGhlIGhvc3Qgb3IKKyAqCXByb3RvY29sIGxpc3RzIQorICoKKyAqICNkZWZpbmUgWF9JTkNMVURFX05FVERCX0gKKyAqICNkZWZpbmUgWE9TX1VTRV8uLi5fTE9DS0lORworICogI2luY2x1ZGUgPFgxMS9Yb3Nfci5oPgorICoKKyAqIHR5cGVkZWYgLi4uIF9YZ2V0aG9zdGJ5bmFtZXBhcmFtczsKKyAqIHR5cGVkZWYgLi4uIF9YZ2V0c2VydmJ5bmFtZXBhcmFtczsKKyAqCisgKiBzdHJ1Y3QgaG9zdGVudCogX1hHZXRob3N0YnluYW1lKGNvbnN0IGNoYXIqIG5hbWUsX1hnZXRob3N0YnluYW1lcGFyYW1zKTsKKyAqIHN0cnVjdCBob3N0ZW50KiBfWEdldGhvc3RieWFkZHIoY29uc3QgY2hhciogYWRkciwgaW50IGxlbiwgaW50IHR5cGUsCisgKgkJCQkgICBfWGdldGhvc3RieW5hbWVwYXJhbXMpOworICogc3RydWN0IHNlcnZlbnQqIF9YR2V0c2VydmJ5bmFtZShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBwcm90bywKKyAqCQkJCSBfWGdldHNlcnZieW5hbWVwYXJhbXMpOworICovCisKKyN1bmRlZiBYVEhSRUFEU19ORUVEU19CWU5BTUVQQVJBTVMKKyNpZiBkZWZpbmVkKFhfSU5DTFVERV9ORVREQl9IKSAmJiAhZGVmaW5lZChfWE9TX0lOQ0xVREVEX05FVERCX0gpIFwKKyAgICAmJiAhZGVmaW5lZChXSU4zMikKKyMgaW5jbHVkZSA8bmV0ZGIuaD4KKyMgaWYgZGVmaW5lZChYVVNFX01UU0FGRV9BUEkpIHx8IGRlZmluZWQoWFVTRV9NVFNBRkVfTkVUREJBUEkpCisjICBkZWZpbmUgWE9TX1VTRV9NVFNBRkVfTkVUREJBUEkgMQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChYX0lOQ0xVREVfTkVUREJfSCkgfHwgZGVmaW5lZChfWE9TX0lOQ0xVREVEX05FVERCX0gpCisvKiBEbyBub3RoaW5nLiAqLworCisjZWxpZiAhZGVmaW5lZChYVEhSRUFEUykgJiYgIWRlZmluZWQoWF9GT1JDRV9VU0VfTVRTQUZFX0FQSSkKKy8qIFVzZSByZWd1bGFyLCB1bnNhZmUgQVBJLiAqLwordHlwZWRlZiBpbnQgX1hnZXRob3N0YnluYW1lcGFyYW1zOyAvKiBkdW1teSAqLwordHlwZWRlZiBpbnQgX1hnZXRzZXJ2YnluYW1lcGFyYW1zOyAvKiBkdW1teSAqLworIyBkZWZpbmUgX1hHZXRob3N0YnluYW1lKGgsaHApCQlnZXRob3N0YnluYW1lKChoKSkKKyMgZGVmaW5lIF9YR2V0aG9zdGJ5YWRkcihhLGFsLHQsaHApCWdldGhvc3RieWFkZHIoKGEpLChhbCksKHQpKQorIyBkZWZpbmUgX1hHZXRzZXJ2YnluYW1lKHMscCxzcCkJZ2V0c2VydmJ5bmFtZSgocyksKHApKQorCisjZWxpZiAhZGVmaW5lZChYT1NfVVNFX01UU0FGRV9ORVREQkFQSSkgfHwgZGVmaW5lZChYTk9fTVRTQUZFX05FVERCQVBJKQorLyogV0FSTklORzogIFRoZSBoX2FkZHJfbGlzdCBhbmQgc19hbGlhc2VzIHZhbHVlcyBhcmUgKm5vdCogY29waWVkISAqLworCisjaWYgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fRHJhZ29uRmx5X18pCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QgaG9zdGVudCBoZW50OworICBjaGFyICAgICAgICAgICBoX25hbWVbTUFYSE9TVE5BTUVMRU5dOworICBzdHJ1Y3QgaG9zdGVudCAqaHB0cjsKK30gX1hnZXRob3N0YnluYW1lcGFyYW1zOwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3Qgc2VydmVudCBzZW50OworICBjaGFyICAgICAgICAgICBzX25hbWVbMjU1XTsKKyAgY2hhcgkJIHNfcHJvdG9bMjU1XTsKKyAgc3RydWN0IHNlcnZlbnQgKnNwdHI7Cit9IF9YZ2V0c2VydmJ5bmFtZXBhcmFtczsKKworIyBkZWZpbmUgWFRIUkVBRFNfTkVFRFNfQllOQU1FUEFSQU1TCisKKyMgZGVmaW5lIF9YZ19jb3B5SG9zdGVudChocCkgXAorICAgKG1lbWNweSgmKGhwKS5oZW50LCAoaHApLmhwdHIsIHNpemVvZihzdHJ1Y3QgaG9zdGVudCkpLCBcCisgICAgc3RyY3B5KChocCkuaF9uYW1lLCAoaHApLmhwdHItPmhfbmFtZSksIFwKKyAgICAoKGhwKS5oZW50LmhfbmFtZSA9IChocCkuaF9uYW1lKSwgXAorICAgICgoaHApLmhwdHIgPSAmKGhwKS5oZW50KSwgXAorICAgICAwICkKKyMgZGVmaW5lIF9YZ19jb3B5U2VydmVudChzcCkgXAorICAgKG1lbWNweSgmKHNwKS5zZW50LCAoc3ApLnNwdHIsIHNpemVvZihzdHJ1Y3Qgc2VydmVudCkpLCBcCisgICAgc3RyY3B5KChzcCkuc19uYW1lLCAoc3ApLnNwdHItPnNfbmFtZSksIFwKKyAgICAoKHNwKS5zZW50LnNfbmFtZSA9IChzcCkuc19uYW1lKSwgXAorICAgIHN0cmNweSgoc3ApLnNfcHJvdG8sIChzcCkuc3B0ci0+c19wcm90byksIFwKKyAgICAoKHNwKS5zZW50LnNfcHJvdG8gPSAoc3ApLnNfcHJvdG8pLCBcCisgICAgKChzcCkuc3B0ciA9ICYoc3ApLnNlbnQpLCBcCisgICAgMCApCisjIGRlZmluZSBfWEdldGhvc3RieW5hbWUoaCxocCkgXAorICAgKChfWG9zX3Byb2Nlc3NMb2NrKSwgXAorICAgICgoKGhwKS5ocHRyID0gZ2V0aG9zdGJ5bmFtZSgoaCkpKSA/IF9YZ19jb3B5SG9zdGVudChocCkgOiAwKSwgXAorICAgIChfWG9zX3Byb2Nlc3NVbmxvY2spLCBcCisgICAgKGhwKS5ocHRyICkKKyMgZGVmaW5lIF9YR2V0aG9zdGJ5YWRkcihhLGFsLHQsaHApIFwKKyAgICgoX1hvc19wcm9jZXNzTG9jayksIFwKKyAgICAoKChocCkuaHB0ciA9IGdldGhvc3RieWFkZHIoKGEpLChhbCksKHQpKSkgPyBfWGdfY29weUhvc3RlbnQoaHApIDogMCksIFwKKyAgICAoX1hvc19wcm9jZXNzVW5sb2NrKSwgXAorICAgIChocCkuaHB0ciApCisjIGRlZmluZSBfWEdldHNlcnZieW5hbWUocyxwLHNwKSBcCisgICAoKF9Yb3NfcHJvY2Vzc0xvY2spLCBcCisgICAgKCgoc3ApLnNwdHIgPSBnZXRzZXJ2YnluYW1lKChzKSwocCkpKSA/IF9YZ19jb3B5U2VydmVudChzcCkgOiAwKSwgXAorICAgIChfWG9zX3Byb2Nlc3NVbmxvY2spLCBcCisgICAgKHNwKS5zcHRyICkKKworI2VsaWYgZGVmaW5lZChYVVNFX05FVERCX1JfQVBJKQorLyoKKyAqIFBPU0lYIGRvZXMgbm90IHNwZWNpZnkgX3IgZXF1aXZhbGVudHMgZm9yIDxuZXRkYi5oPiBBUEksIGJ1dCBzb21lCisgKiB2ZW5kb3JzIHByb3ZpZGUgdGhlbSBhbnl3YXkuICBVc2UgdGhlbSBvbmx5IHdoZW4gZXhwbGljaXRseSBhc2tlZC4KKyAqLworIyBpZmRlZiBfUE9TSVhfUkVFTlRSQU5UX0ZVTkNUSU9OUworIyAgaWZuZGVmIF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMKKyMgIGVuZGlmCisjIGVuZGlmCisjIGlmZGVmIF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMKKyMgIGRlZmluZSBYX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUyAxCisjIGVuZGlmCisKKyMgZGVmaW5lIFhUSFJFQURTX05FRURTX0JZTkFNRVBBUkFNUworCisjIGlmbmRlZiBYX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHN0cnVjdCBob3N0ZW50ICAgICAgaGVudDsKKyAgICBjaGFyICAgICAgICAgICAgICAgIGhidWZbWF9MSU5FX01BWF07CisgICAgaW50ICAgICAgICAgICAgICAgICBoZXJyOworfSBfWGdldGhvc3RieW5hbWVwYXJhbXM7Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgc3RydWN0IHNlcnZlbnQgICAgICBzZW50OworICAgIGNoYXIgICAgICAgICAgICAgICAgc2J1ZltYX0xJTkVfTUFYXTsKK30gX1hnZXRzZXJ2YnluYW1lcGFyYW1zOworIyAgZGVmaW5lIF9YR2V0aG9zdGJ5bmFtZShoLGhwKSBcCisgIGdldGhvc3RieW5hbWVfcigoaCksJihocCkuaGVudCwoaHApLmhidWYsc2l6ZW9mKChocCkuaGJ1ZiksJihocCkuaGVycikKKyMgIGRlZmluZSBfWEdldGhvc3RieWFkZHIoYSxhbCx0LGhwKSBcCisgIGdldGhvc3RieWFkZHJfcigoYSksKGFsKSwodCksJihocCkuaGVudCwoaHApLmhidWYsc2l6ZW9mKChocCkuaGJ1ZiksJihocCkuaGVycikKKyMgIGRlZmluZSBfWEdldHNlcnZieW5hbWUocyxwLHNwKSBcCisgIGdldHNlcnZieW5hbWVfcigocyksKHApLCYoc3ApLnNlbnQsKHNwKS5zYnVmLHNpemVvZigoc3ApLnNidWYpKQorIyBlbHNlCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBob3N0ZW50ICAgICAgaGVudDsKKyAgc3RydWN0IGhvc3RlbnRfZGF0YSBoZGF0YTsKK30gX1hnZXRob3N0YnluYW1lcGFyYW1zOwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3Qgc2VydmVudCAgICAgIHNlbnQ7CisgIHN0cnVjdCBzZXJ2ZW50X2RhdGEgc2RhdGE7Cit9IF9YZ2V0c2VydmJ5bmFtZXBhcmFtczsKKyMgIGRlZmluZSBfWEdldGhvc3RieW5hbWUoaCxocCkgXAorICAoYnplcm8oKGNoYXIqKSYoaHApLmhkYXRhLHNpemVvZigoaHApLmhkYXRhKSksCVwKKyAgICgoZ2V0aG9zdGJ5bmFtZV9yKChoKSwmKGhwKS5oZW50LCYoaHApLmhkYXRhKSA9PSAtMSkgPyBOVUxMIDogJihocCkuaGVudCkpCisjICBkZWZpbmUgX1hHZXRob3N0YnlhZGRyKGEsYWwsdCxocCkgXAorICAoYnplcm8oKGNoYXIqKSYoaHApLmhkYXRhLHNpemVvZigoaHApLmhkYXRhKSksCVwKKyAgICgoZ2V0aG9zdGJ5YWRkcl9yKChhKSwoYWwpLCh0KSwmKGhwKS5oZW50LCYoaHApLmhkYXRhKSA9PSAtMSkgPyBOVUxMIDogJihocCkuaGVudCkpCisjICBkZWZpbmUgX1hHZXRzZXJ2YnluYW1lKHMscCxzcCkgXAorICAoYnplcm8oKGNoYXIqKSYoc3ApLnNkYXRhLHNpemVvZigoc3ApLnNkYXRhKSksCVwKKyAgICgoZ2V0c2VydmJ5bmFtZV9yKChzKSwocCksJihzcCkuc2VudCwmKHNwKS5zZGF0YSkgPT0gLTEpID8gTlVMTCA6ICYoc3ApLnNlbnQpICkKKyMgZW5kaWYKKyMgaWZkZWYgWF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMKKyMgIHVuZGVmIFhfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TCisjIGVuZGlmCisKKyNlbHNlCisvKiBUaGUgcmVndWxhciBBUEkgaXMgYXNzdW1lZCB0byBiZSBNVC1zYWZlIHVuZGVyIFBPU0lYLiAqLwordHlwZWRlZiBpbnQgX1hnZXRob3N0YnluYW1lcGFyYW1zOyAvKiBkdW1teSAqLwordHlwZWRlZiBpbnQgX1hnZXRzZXJ2YnluYW1lcGFyYW1zOyAvKiBkdW1teSAqLworIyBkZWZpbmUgX1hHZXRob3N0YnluYW1lKGgsaHApCQlnZXRob3N0YnluYW1lKChoKSkKKyMgZGVmaW5lIF9YR2V0aG9zdGJ5YWRkcihhLGFsLHQsaHApCWdldGhvc3RieWFkZHIoKGEpLChhbCksKHQpKQorIyBkZWZpbmUgX1hHZXRzZXJ2YnluYW1lKHMscCxzcCkJZ2V0c2VydmJ5bmFtZSgocyksKHApKQorI2VuZGlmIC8qIFhfSU5DTFVERV9ORVREQl9IICovCisKKyNpZiBkZWZpbmVkKFhfSU5DTFVERV9ORVREQl9IKSAmJiAhZGVmaW5lZChfWE9TX0lOQ0xVREVEX05FVERCX0gpCisjIGRlZmluZSBfWE9TX0lOQ0xVREVEX05FVERCX0gKKyNlbmRpZgorCisKKy8qKioqKiA8ZGlyZW50Lmg+IHdyYXBwZXJzICoqKioqLworCisvKgorICogRWZmZWN0aXZlIHByb3RvdHlwZXMgZm9yIDxkaXJlbnQuaD4gd3JhcHBlcnM6CisgKgorICogI2RlZmluZSBYX0lOQ0xVREVfRElSRU5UX0gKKyAqICNkZWZpbmUgWE9TX1VTRV8uLi5fTE9DS0lORworICogI2luY2x1ZGUgPFgxMS9Yb3Nfci5oPgorICoKKyAqIHR5cGVkZWYgLi4uIF9YcmVhZGRpcnBhcmFtczsKKyAqCisgKiBzdHJ1Y3QgZGlyZW50ICpfWFJlYWRkaXIoRElSICpkaXJfcG9pbnRlciwgX1hyZWFkZGlycGFyYW1zKTsKKyAqLworCisjaWYgZGVmaW5lZChYX0lOQ0xVREVfRElSRU5UX0gpICYmICFkZWZpbmVkKF9YT1NfSU5DTFVERURfRElSRU5UX0gpCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpZiAhZGVmaW5lZChYX05PVF9QT1NJWCkgfHwgZGVmaW5lZChTWVNWKQorIyAgaW5jbHVkZSA8ZGlyZW50Lmg+CisjIGVsc2UKKyMgIGluY2x1ZGUgPHN5cy9kaXIuaD4KKyMgIGlmbmRlZiBkaXJlbnQKKyMgICBkZWZpbmUgZGlyZW50IGRpcmVjdAorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChYVVNFX01UU0FGRV9BUEkpIHx8IGRlZmluZWQoWFVTRV9NVFNBRkVfRElSRU5UQVBJKQorIyAgZGVmaW5lIFhPU19VU0VfTVRTQUZFX0RJUkVOVEFQSSAxCisjIGVuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFhfSU5DTFVERV9ESVJFTlRfSCkgfHwgZGVmaW5lZChfWE9TX0lOQ0xVREVEX0RJUkVOVF9IKQorLyogRG8gbm90aGluZy4gKi8KKworI2VsaWYgIWRlZmluZWQoWFRIUkVBRFMpICYmICFkZWZpbmVkKFhfRk9SQ0VfVVNFX01UU0FGRV9BUEkpCisvKiBVc2UgcmVndWxhciwgdW5zYWZlIEFQSS4gKi8KK3R5cGVkZWYgaW50IF9YcmVhZGRpcnBhcmFtczsJLyogZHVtbXkgKi8KKyMgZGVmaW5lIF9YUmVhZGRpcihkLHApCXJlYWRkaXIoZCkKKworI2VsaWYgIWRlZmluZWQoWE9TX1VTRV9NVFNBRkVfRElSRU5UQVBJKSB8fCBkZWZpbmVkKFhOT19NVFNBRkVfRElSRU5UQVBJKQorLyogU3lzdGVtcyB3aXRoIHRocmVhZCBzdXBwb3J0IGJ1dCBubyBfciBBUEkuICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBkaXJlbnQgKnJlc3VsdDsKKyAgc3RydWN0IGRpcmVudCBkaXJfZW50cnk7CisjIGlmZGVmIF9QT1NJWF9QQVRIX01BWAorICBjaGFyIGJ1ZltfUE9TSVhfUEFUSF9NQVhdOworIyBlbGlmIGRlZmluZWQoTkFNRV9NQVgpCisgIGNoYXIgYnVmW05BTUVfTUFYXTsKKyMgZWxzZQorICBjaGFyIGJ1ZlsyNTVdOworIyBlbmRpZgorfSBfWHJlYWRkaXJwYXJhbXM7CisKKyMgZGVmaW5lIF9YUmVhZGRpcihkLHApCVwKKyAoIChfWG9zX3Byb2Nlc3NMb2NrKSwJCQkJCQkgXAorICAgKCgocCkucmVzdWx0ID0gcmVhZGRpcigoZCkpKSA/CQkJCSBcCisgICAgKG1lbWNweSgmKChwKS5kaXJfZW50cnkpLCAocCkucmVzdWx0LCAocCkucmVzdWx0LT5kX3JlY2xlbiksIFwKKyAgICAgKChwKS5yZXN1bHQgPSAmKHApLmRpcl9lbnRyeSksIDApIDoJCQkgXAorICAgIDApLAkJCQkJCQkJIFwKKyAgIChfWG9zX3Byb2Nlc3NVbmxvY2spLAkJCQkJIFwKKyAgIChwKS5yZXN1bHQgKQorCisjZWxzZQordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QgZGlyZW50ICpyZXN1bHQ7CisgIHN0cnVjdCBkaXJlbnQgZGlyX2VudHJ5OworIyBpZmRlZiBfUE9TSVhfUEFUSF9NQVgKKyAgY2hhciBidWZbX1BPU0lYX1BBVEhfTUFYXTsKKyMgZWxpZiBkZWZpbmVkKE5BTUVfTUFYKQorICBjaGFyIGJ1ZltOQU1FX01BWF07CisjIGVsc2UKKyAgY2hhciBidWZbMjU1XTsKKyMgZW5kaWYKK30gX1hyZWFkZGlycGFyYW1zOworCisjIGlmIGRlZmluZWQoX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUykgfHwgZGVmaW5lZChfX0FQUExFX18pCisvKiBQT1NJWCBmaW5hbCBBUEksIHJldHVybnMgKGludCkwIG9uIHN1Y2Nlc3MuICovCisjICBkZWZpbmUgX1hSZWFkZGlyKGQscCkJCQkJCQlcCisgICAgKHJlYWRkaXJfcigoZCksICYoKHApLmRpcl9lbnRyeSksICYoKHApLnJlc3VsdCkpID8gTlVMTCA6IChwKS5yZXN1bHQpCisjIGVsaWYgZGVmaW5lZChfUE9TSVhfUkVFTlRSQU5UX0ZVTkNUSU9OUykKKy8qIFBPU0lYIGRyYWZ0IEFQSSwgcmV0dXJucyAoaW50KTAgb24gc3VjY2Vzcy4gKi8KKyMgIGRlZmluZSBfWFJlYWRkaXIoZCxwKQlcCisgICAgKHJlYWRkaXJfcigoZCksJigocCkuZGlyX2VudHJ5KSkgPyBOVUxMIDogJigocCkuZGlyX2VudHJ5KSkKKyMgZWxpZiBkZWZpbmVkKFNWUjQpCisvKiBQcmUtUE9TSVggQVBJLCByZXR1cm5zIG5vbi1OVUxMIG9uIHN1Y2Nlc3MuICovCisjICBkZWZpbmUgX1hSZWFkZGlyKGQscCkJKHJlYWRkaXJfcigoZCksICYocCkuZGlyX2VudHJ5KSkKKyMgZWxzZQorLyogV2UgaGF2ZSBubyBpZGVhIHdoYXQgaXMgZ29pbmcgb24uICBGYWtlIGl0IGFsbCB1c2luZyBwcm9jZXNzIGxvY2tzLiAqLworIyAgZGVmaW5lIF9YUmVhZGRpcihkLHApCVwKKyAgICAoIChfWG9zX3Byb2Nlc3NMb2NrKSwJCQkJCQlcCisgICAgICAoKChwKS5yZXN1bHQgPSByZWFkZGlyKChkKSkpID8JCQkJCVwKKyAgICAgICAobWVtY3B5KCYoKHApLmRpcl9lbnRyeSksIChwKS5yZXN1bHQsIChwKS5yZXN1bHQtPmRfcmVjbGVuKSwJXAorCSgocCkucmVzdWx0ID0gJihwKS5kaXJfZW50cnkpLCAwKSA6CQkJCVwKKyAgICAgICAwKSwJCQkJCQkJCVwKKyAgICAgIChfWG9zX3Byb2Nlc3NVbmxvY2spLAkJCQkJCVwKKyAgICAgIChwKS5yZXN1bHQgKQorIyBlbmRpZgorI2VuZGlmIC8qIFhfSU5DTFVERV9ESVJFTlRfSCAqLworCisjaWYgZGVmaW5lZChYX0lOQ0xVREVfRElSRU5UX0gpICYmICFkZWZpbmVkKF9YT1NfSU5DTFVERURfRElSRU5UX0gpCisjIGRlZmluZSBfWE9TX0lOQ0xVREVEX0RJUkVOVF9ICisjZW5kaWYKKworCisvKioqKiogPHVuaXN0ZC5oPiB3cmFwcGVycyAqKioqKi8KKworLyoKKyAqIEVmZmVjdGl2ZSBwcm90b3R5cGVzIGZvciA8dW5pc3RkLmg+IHdyYXBwZXJzOgorICoKKyAqICNkZWZpbmUgWF9JTkNMVURFX1VOSVNURF9ICisgKiAjZGVmaW5lIFhPU19VU0VfLi4uX0xPQ0tJTkcKKyAqICNpbmNsdWRlIDxYMTEvWG9zX3IuaD4KKyAqCisgKiB0eXBlZGVmIC4uLiBfWGdldGxvZ2lucGFyYW1zOworICogdHlwZWRlZiAuLi4gX1h0dHluYW1lcGFyYW1zOworICoKKyAqIGNoYXIgKl9YR2V0bG9naW4oX1hnZXRsb2dpbnBhcmFtcyk7CisgKiBjaGFyICpfWFR0eW5hbWUoaW50LCBfWHR0eW5hbWVwYXJhbXMpOworICovCisKKyNpZiBkZWZpbmVkKFhfSU5DTFVERV9VTklTVERfSCkgJiYgIWRlZmluZWQoX1hPU19JTkNMVURFRF9VTklTVERfSCkKKy8qIDx1bmlzdGQuaD4gYWxyZWFkeSBpbmNsdWRlZCBieSA8WDExL1hvcy5oPiAqLworIyBpZiBkZWZpbmVkKFhVU0VfTVRTQUZFX0FQSSkgfHwgZGVmaW5lZChYVVNFX01UU0FGRV9VTklTVERBUEkpCisjICBkZWZpbmUgWE9TX1VTRV9NVFNBRkVfVU5JU1REQVBJIDEKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoWF9JTkNMVURFX1VOSVNURF9IKSB8fCBkZWZpbmVkKF9YT1NfSU5DTFVERURfVU5JU1REX0gpCisvKiBEbyBub3RoaW5nLiAqLworCisjZWxpZiAhZGVmaW5lZChYVEhSRUFEUykgJiYgIWRlZmluZWQoWF9GT1JDRV9VU0VfTVRTQUZFX0FQSSkKKy8qIFVzZSByZWd1bGFyLCB1bnNhZmUgQVBJLiAqLwordHlwZWRlZiBpbnQgX1hnZXRsb2dpbnBhcmFtczsJLyogZHVtbXkgKi8KK3R5cGVkZWYgaW50IF9YdHR5bmFtZXBhcmFtczsJLyogZHVtbXkgKi8KKyMgZGVmaW5lIF9YR2V0bG9naW4ocCkJZ2V0bG9naW4oKQorIyBkZWZpbmUgX1hUdHluYW1lKGYpCXR0eW5hbWUoKGYpKQorCisjZWxpZiAhZGVmaW5lZChYT1NfVVNFX01UU0FGRV9VTklTVERBUEkpIHx8IGRlZmluZWQoWE5PX01UU0FGRV9VTklTVERBUEkpCisvKiBTeXN0ZW1zIHdpdGggdGhyZWFkIHN1cHBvcnQgYnV0IG5vIF9yIEFQSS4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgY2hhciAqcmVzdWx0OworIyBpZiBkZWZpbmVkKE1BWExPR05BTUUpCisgIGNoYXIgYnVmW01BWExPR05BTUVdOworIyBlbGlmIGRlZmluZWQoTE9HSU5fTkFNRV9NQVgpCisgIGNoYXIgYnVmW0xPR0lOX05BTUVfTUFYXTsKKyMgZWxzZQorICBjaGFyIGJ1Zls2NF07CisjIGVuZGlmCit9IF9YZ2V0bG9naW5wYXJhbXM7Cit0eXBlZGVmIHN0cnVjdCB7CisgIGNoYXIgKnJlc3VsdDsKKyMgaWZkZWYgVFRZX05BTUVfTUFYCisgIGNoYXIgYnVmW1RUWV9OQU1FX01BWF07CisjIGVsaWYgZGVmaW5lZChfUE9TSVhfVFRZX05BTUVfTUFYKQorICBjaGFyIGJ1ZltfUE9TSVhfVFRZX05BTUVfTUFYXTsKKyMgZWxpZiBkZWZpbmVkKF9QT1NJWF9QQVRIX01BWCkKKyAgY2hhciBidWZbX1BPU0lYX1BBVEhfTUFYXTsKKyMgZWxzZQorICBjaGFyIGJ1ZlsyNTZdOworIyBlbmRpZgorfSBfWHR0eW5hbWVwYXJhbXM7CisKKyMgZGVmaW5lIF9YR2V0bG9naW4ocCkgXAorICggKF9Yb3NfcHJvY2Vzc0xvY2spLCBcCisgICAoKChwKS5yZXN1bHQgPSBnZXRsb2dpbigpKSA/IFwKKyAgICAoc3RybmNweSgocCkuYnVmLCAocCkucmVzdWx0LCBzaXplb2YoKHApLmJ1ZikpLCBcCisgICAgICgocCkuYnVmW3NpemVvZigocCkuYnVmKS0xXSA9ICdcMCcpLCBcCisgICAgICgocCkucmVzdWx0ID0gKHApLmJ1ZiksIDApIDogMCksIFwKKyAgIChfWG9zX3Byb2Nlc3NVbmxvY2spLCBcCisgICAocCkucmVzdWx0ICkKKyNkZWZpbmUgX1hUdHluYW1lKGYscCkgXAorICggKF9Yb3NfcHJvY2Vzc0xvY2spLCBcCisgICAoKChwKS5yZXN1bHQgPSB0dHluYW1lKGYpKSA/IFwKKyAgICAoc3RybmNweSgocCkuYnVmLCAocCkucmVzdWx0LCBzaXplb2YoKHApLmJ1ZikpLCBcCisgICAgICgocCkuYnVmW3NpemVvZigocCkuYnVmKS0xXSA9ICdcMCcpLCBcCisgICAgICgocCkucmVzdWx0ID0gKHApLmJ1ZiksIDApIDogMCksIFwKKyAgIChfWG9zX3Byb2Nlc3NVbmxvY2spLCBcCisgICAocCkucmVzdWx0ICkKKworI2VsaWYgZGVmaW5lZChfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TKSB8fCBkZWZpbmVkKF9QT1NJWF9SRUVOVFJBTlRfRlVOQ1RJT05TKQorLyogUE9TSVggQVBJLgorICoKKyAqIGV4dGVybiBpbnQgZ2V0bG9naW5fcihjaGFyICosIHNpemVfdCk7CisgKiBleHRlcm4gaW50IHR0eW5hbWVfcihpbnQsIGNoYXIgKiwgc2l6ZV90KTsKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworIyBpZiBkZWZpbmVkKE1BWExPR05BTUUpCisgIGNoYXIgYnVmW01BWExPR05BTUVdOworIyBlbGlmIGRlZmluZWQoTE9HSU5fTkFNRV9NQVgpCisgIGNoYXIgYnVmW0xPR0lOX05BTUVfTUFYXTsKKyMgZWxzZQorICBjaGFyIGJ1Zls2NF07CisjIGVuZGlmCit9IF9YZ2V0bG9naW5wYXJhbXM7Cit0eXBlZGVmIHN0cnVjdCB7CisjIGlmZGVmIFRUWV9OQU1FX01BWAorICBjaGFyIGJ1ZltUVFlfTkFNRV9NQVhdOworIyBlbGlmIGRlZmluZWQoX1BPU0lYX1RUWV9OQU1FX01BWCkKKyAgY2hhciBidWZbX1BPU0lYX1RUWV9OQU1FX01BWF07CisjIGVsaWYgZGVmaW5lZChfUE9TSVhfUEFUSF9NQVgpCisgIGNoYXIgYnVmW19QT1NJWF9QQVRIX01BWF07CisjIGVsc2UKKyAgY2hhciBidWZbMjU2XTsKKyMgZW5kaWYKK30gX1h0dHluYW1lcGFyYW1zOworCisjIGRlZmluZSBfWEdldGxvZ2luKHApCShnZXRsb2dpbl9yKChwKS5idWYsIHNpemVvZigocCkuYnVmKSkgPyBOVUxMIDogKHApLmJ1ZikKKyMgZGVmaW5lIF9YVHR5bmFtZShmLHApCVwKKwkodHR5bmFtZV9yKChmKSwgKHApLmJ1Ziwgc2l6ZW9mKChwKS5idWYpKSA/IE5VTEwgOiAocCkuYnVmKQorCisjZWxzZQorLyogUHJlLVBPU0lYIEFQSS4KKyAqCisgKiBleHRlcm4gY2hhciAqZ2V0bG9naW5fcihjaGFyICosIHNpemVfdCk7CisgKiBleHRlcm4gY2hhciAqdHR5bmFtZV9yKGludCwgY2hhciAqLCBzaXplX3QpOworICovCit0eXBlZGVmIHN0cnVjdCB7CisjIGlmIGRlZmluZWQoTUFYTE9HTkFNRSkKKyAgY2hhciBidWZbTUFYTE9HTkFNRV07CisjIGVsaWYgZGVmaW5lZChMT0dJTl9OQU1FX01BWCkKKyAgY2hhciBidWZbTE9HSU5fTkFNRV9NQVhdOworIyBlbHNlCisgIGNoYXIgYnVmWzY0XTsKKyMgZW5kaWYKK30gX1hnZXRsb2dpbnBhcmFtczsKK3R5cGVkZWYgc3RydWN0IHsKKyMgaWZkZWYgVFRZX05BTUVfTUFYCisgIGNoYXIgYnVmW1RUWV9OQU1FX01BWF07CisjIGVsaWYgZGVmaW5lZChfUE9TSVhfVFRZX05BTUVfTUFYKQorICBjaGFyIGJ1ZltfUE9TSVhfVFRZX05BTUVfTUFYXTsKKyMgZWxpZiBkZWZpbmVkKF9QT1NJWF9QQVRIX01BWCkKKyAgY2hhciBidWZbX1BPU0lYX1BBVEhfTUFYXTsKKyMgZWxzZQorICBjaGFyIGJ1ZlsyNTZdOworIyBlbmRpZgorfSBfWHR0eW5hbWVwYXJhbXM7CisKKyMgZGVmaW5lIF9YR2V0bG9naW4ocCkJZ2V0bG9naW5fcigocCkuYnVmLCBzaXplb2YoKHApLmJ1ZikpCisjIGRlZmluZSBfWFR0eW5hbWUoZixwKQl0dHluYW1lX3IoKGYpLCAocCkuYnVmLCBzaXplb2YoKHApLmJ1ZikpCisjZW5kaWYgLyogWF9JTkNMVURFX1VOSVNURF9IICovCisKKyNpZiBkZWZpbmVkKFhfSU5DTFVERV9VTklTVERfSCkgJiYgIWRlZmluZWQoX1hPU19JTkNMVURFRF9VTklTVERfSCkKKyMgZGVmaW5lIF9YT1NfSU5DTFVERURfVU5JU1REX0gKKyNlbmRpZgorCisKKy8qKioqKiA8c3RyaW5nLmg+IHdyYXBwZXJzICoqKioqLworCisvKgorICogRWZmZWN0aXZlIHByb3RvdHlwZXMgZm9yIDxzdHJpbmcuaD4gd3JhcHBlcnM6CisgKgorICogI2RlZmluZSBYX0lOQ0xVREVfU1RSSU5HX0gKKyAqICNkZWZpbmUgWE9TX1VTRV8uLi5fTE9DS0lORworICogI2luY2x1ZGUgPFgxMS9Yb3Nfci5oPgorICoKKyAqIHR5cGVkZWYgLi4uIF9Yc3RydG9rcGFyYW1zOworICoKKyAqIGNoYXIgKl9YU3RydG9rKGNoYXIgKiwgY29uc3QgY2hhciosIF9Yc3RydG9rcGFyYW1zKTsKKyAqLworCisjaWYgZGVmaW5lZChYX0lOQ0xVREVfU1RSSU5HX0gpICYmICFkZWZpbmVkKF9YT1NfSU5DTFVERURfU1RSSU5HX0gpCisvKiA8c3RyaW5nLmg+IGhhcyBhbHJlYWR5IGJlZW4gaW5jbHVkZWQgYnkgPFgxMS9Yb3MuaD4gKi8KKyMgaWYgZGVmaW5lZChYVVNFX01UU0FGRV9BUEkpIHx8IGRlZmluZWQoWFVTRV9NVFNBRkVfU1RSSU5HQVBJKQorIyAgZGVmaW5lIFhPU19VU0VfTVRTQUZFX1NUUklOR0FQSSAxCisjIGVuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFhfSU5DTFVERV9TVFJJTkdfSCkgfHwgZGVmaW5lZChfWE9TX0lOQ0xVREVEX1NUUklOR19IKQorLyogRG8gbm90aGluZy4gKi8KKworI2VsaWYgIWRlZmluZWQoWFRIUkVBRFMpICYmICFkZWZpbmVkKFhfRk9SQ0VfVVNFX01UU0FGRV9BUEkpCisvKiBVc2UgcmVndWxhciwgdW5zYWZlIEFQSS4gKi8KK3R5cGVkZWYgaW50IF9Yc3RydG9rcGFyYW1zOwkvKiBkdW1teSAqLworIyBkZWZpbmUgX1hTdHJ0b2soczEsczIscCkgXAorICggcCA9IDAsICh2b2lkKXAsIHN0cnRvaygoczEpLChzMikpICkKKworI2VsaWYgIWRlZmluZWQoWE9TX1VTRV9NVFNBRkVfU1RSSU5HQVBJKSB8fCBkZWZpbmVkKFhOT19NVFNBRkVfU1RSSU5HQVBJKQorLyogU3lzdGVtcyB3aXRoIHRocmVhZCBzdXBwb3J0IGJ1dCBubyBfciBBUEkuICovCit0eXBlZGVmIGNoYXIgKl9Yc3RydG9rcGFyYW1zOworIyBkZWZpbmUgX1hTdHJ0b2soczEsczIscCkgXAorICggKF9Yb3NfcHJvY2Vzc0xvY2spLCBcCisgICAoKHApID0gc3RydG9rKChzMSksKHMyKSkpLCBcCisgICAoX1hvc19wcm9jZXNzVW5sb2NrKSwgXAorICAgKHApICkKKworI2Vsc2UKKy8qIFBPU0lYIG9yIHByZS1QT1NJWCBBUEkuICovCit0eXBlZGVmIGNoYXIgKiBfWHN0cnRva3BhcmFtczsKKyMgZGVmaW5lIF9YU3RydG9rKHMxLHMyLHApCXN0cnRva19yKChzMSksKHMyKSwmKHApKQorI2VuZGlmIC8qIFhfSU5DTFVERV9TVFJJTkdfSCAqLworCisKKy8qKioqKiA8dGltZS5oPiB3cmFwcGVycyAqKioqKi8KKworLyoKKyAqIEVmZmVjdGl2ZSBwcm90b3R5cGVzIGZvciA8dGltZS5oPiB3cmFwcGVyczoKKyAqCisgKiAjZGVmaW5lIFhfSU5DTFVERV9USU1FX0gKKyAqICNkZWZpbmUgWE9TX1VTRV8uLi5fTE9DS0lORworICogI2luY2x1ZGUgPFgxMS9Yb3Nfci5oPgorICoKKyAqIHR5cGVkZWYgLi4uIF9YYXRpbWVwYXJhbXM7CisgKiB0eXBlZGVmIC4uLiBfWGN0aW1lcGFyYW1zOworICogdHlwZWRlZiAuLi4gX1hndGltZXBhcmFtczsKKyAqIHR5cGVkZWYgLi4uIF9YbHRpbWVwYXJhbXM7CisgKgorICogY2hhciAqX1hBc2N0aW1lKGNvbnN0IHN0cnVjdCB0bSAqLCBfWGF0aW1lcGFyYW1zKTsKKyAqIGNoYXIgKl9YQ3RpbWUoY29uc3QgdGltZV90ICosIF9YY3RpbWVwYXJhbXMpOworICogc3RydWN0IHRtICpfWEdtdGltZShjb25zdCB0aW1lX3QgKiwgX1hndGltZXBhcmFtcyk7CisgKiBzdHJ1Y3QgdG0gKl9YTG9jYWx0aW1lKGNvbnN0IHRpbWVfdCAqLCBfWGx0aW1lcGFyYW1zKTsKKyAqLworCisjaWYgZGVmaW5lZChYX0lOQ0xVREVfVElNRV9IKSAmJiAhZGVmaW5lZChfWE9TX0lOQ0xVREVEX1RJTUVfSCkKKyMgaW5jbHVkZSA8dGltZS5oPgorIyBpZiBkZWZpbmVkKFhVU0VfTVRTQUZFX0FQSSkgfHwgZGVmaW5lZChYVVNFX01UU0FGRV9USU1FQVBJKQorIyAgZGVmaW5lIFhPU19VU0VfTVRTQUZFX1RJTUVBUEkgMQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChYX0lOQ0xVREVfVElNRV9IKSB8fCBkZWZpbmVkKF9YT1NfSU5DTFVERURfVElNRV9IKQorLyogRG8gbm90aGluZy4gKi8KKworI2VsaWYgIWRlZmluZWQoWFRIUkVBRFMpICYmICFkZWZpbmVkKFhfRk9SQ0VfVVNFX01UU0FGRV9BUEkpCisvKiBVc2UgcmVndWxhciwgdW5zYWZlIEFQSS4gKi8KK3R5cGVkZWYgaW50IF9YYXRpbWVwYXJhbXM7CS8qIGR1bW15ICovCisjIGRlZmluZSBfWEFzY3RpbWUodCxwKQkJYXNjdGltZSgodCkpCit0eXBlZGVmIGludCBfWGN0aW1lcGFyYW1zOwkvKiBkdW1teSAqLworIyBkZWZpbmUgX1hDdGltZSh0LHApCQljdGltZSgodCkpCit0eXBlZGVmIGludCBfWGd0aW1lcGFyYW1zOwkvKiBkdW1teSAqLworIyBkZWZpbmUgX1hHbXRpbWUodCxwKQkJZ210aW1lKCh0KSkKK3R5cGVkZWYgaW50IF9YbHRpbWVwYXJhbXM7CS8qIGR1bW15ICovCisjIGRlZmluZSBfWExvY2FsdGltZSh0LHApCWxvY2FsdGltZSgodCkpCisKKyNlbGlmICFkZWZpbmVkKFhPU19VU0VfTVRTQUZFX1RJTUVBUEkpIHx8IGRlZmluZWQoWE5PX01UU0FGRV9USU1FQVBJKQorLyogU3lzdGVtcyB3aXRoIHRocmVhZCBzdXBwb3J0IGJ1dCBubyBfciBBUEkuICovCit0eXBlZGVmIHN0cnVjdCB7CisjIGlmZGVmIFRJTUVMRU4KKyAgY2hhciBidWZbVElNRUxFTl07CisjIGVsc2UKKyAgY2hhciBidWZbMjZdOworIyBlbmRpZgorICBjaGFyICpyZXN1bHQ7Cit9IF9YY3RpbWVwYXJhbXMsIF9YYXRpbWVwYXJhbXM7Cit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCB0bSBidWY7CisgIHN0cnVjdCB0bSAqcmVzdWx0OworfSBfWGd0aW1lcGFyYW1zLCBfWGx0aW1lcGFyYW1zOworIyBkZWZpbmUgX1hBc2N0aW1lKHQscCkgXAorICggKF9Yb3NfcHJvY2Vzc0xvY2spLCBcCisgICAoKChwKS5yZXN1bHQgPSBhc2N0aW1lKCh0KSkpID8gXAorICAgIChzdHJuY3B5KChwKS5idWYsIChwKS5yZXN1bHQsIHNpemVvZigocCkuYnVmKSksIChwKS5yZXN1bHQgPSAmKHApLmJ1ZikgOiBcCisgICAgMCksIFwKKyAgIChfWG9zX3Byb2Nlc3NVbmxvY2spLCBcCisgICAocCkucmVzdWx0ICkKKyMgZGVmaW5lIF9YQ3RpbWUodCxwKSBcCisgKCAoX1hvc19wcm9jZXNzTG9jayksIFwKKyAgICgoKHApLnJlc3VsdCA9IGN0aW1lKCh0KSkpID8gXAorICAgIChzdHJuY3B5KChwKS5idWYsIChwKS5yZXN1bHQsIHNpemVvZigocCkuYnVmKSksIChwKS5yZXN1bHQgPSAmKHApLmJ1ZikgOiBcCisgICAgMCksIFwKKyAgIChfWG9zX3Byb2Nlc3NVbmxvY2spLCBcCisgICAocCkucmVzdWx0ICkKKyMgZGVmaW5lIF9YR210aW1lKHQscCkgXAorICggKF9Yb3NfcHJvY2Vzc0xvY2spLCBcCisgICAoKChwKS5yZXN1bHQgPSBnbXRpbWUodCkpID8gXAorICAgIChtZW1jcHkoJihwKS5idWYsIChwKS5yZXN1bHQsIHNpemVvZigocCkuYnVmKSksIChwKS5yZXN1bHQgPSAmKHApLmJ1ZikgOiBcCisgICAgMCksIFwKKyAgIChfWG9zX3Byb2Nlc3NVbmxvY2spLCBcCisgICAocCkucmVzdWx0ICkKKyMgZGVmaW5lIF9YTG9jYWx0aW1lKHQscCkgXAorICggKF9Yb3NfcHJvY2Vzc0xvY2spLCBcCisgICAoKChwKS5yZXN1bHQgPSBsb2NhbHRpbWUodCkpID8gXAorICAgIChtZW1jcHkoJihwKS5idWYsIChwKS5yZXN1bHQsIHNpemVvZigocCkuYnVmKSksIChwKS5yZXN1bHQgPSAmKHApLmJ1ZikgOiBcCisgICAgMCksIFwKKyAgIChfWG9zX3Byb2Nlc3NVbmxvY2spLCBcCisgICAocCkucmVzdWx0ICkKKworI2VsaWYgIWRlZmluZWQoX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUykgJiYgIGRlZmluZWQoaHBWNCkKKy8qIFJldHVybnMgKGludCkwIG9uIHN1Y2Nlc3MuCisgKgorICogZXh0ZXJuIGludCBhc2N0aW1lX3IoY29uc3Qgc3RydWN0IHRtICp0aW1lcHRyLCBjaGFyICpidWZmZXIsIGludCBidWZsZW4pOworICogZXh0ZXJuIGludCBjdGltZV9yKGNvbnN0IHRpbWVfdCAqdGltZXIsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1Zmxlbik7CisgKiBleHRlcm4gaW50IGdtdGltZV9yKGNvbnN0IHRpbWVfdCAqdGltZXIsIHN0cnVjdCB0bSAqcmVzdWx0KTsKKyAqIGV4dGVybiBpbnQgbG9jYWx0aW1lX3IoY29uc3QgdGltZV90ICp0aW1lciwgc3RydWN0IHRtICpyZXN1bHQpOworICovCisjIGlmZGVmIFRJTUVMRU4KK3R5cGVkZWYgY2hhciBfWGF0aW1lcGFyYW1zW1RJTUVMRU5dOwordHlwZWRlZiBjaGFyIF9YY3RpbWVwYXJhbXNbVElNRUxFTl07CisjIGVsc2UKK3R5cGVkZWYgY2hhciBfWGF0aW1lcGFyYW1zWzI2XTsKK3R5cGVkZWYgY2hhciBfWGN0aW1lcGFyYW1zWzI2XTsKKyMgZW5kaWYKK3R5cGVkZWYgc3RydWN0IHRtIF9YZ3RpbWVwYXJhbXM7Cit0eXBlZGVmIHN0cnVjdCB0bSBfWGx0aW1lcGFyYW1zOworIyBkZWZpbmUgX1hBc2N0aW1lKHQscCkJCShhc2N0aW1lX3IoKHQpLChwKSxzaXplb2YoKHApKSkgPyBOVUxMIDogKHApKQorIyBkZWZpbmUgX1hDdGltZSh0LHApCQkoY3RpbWVfcigodCksKHApLHNpemVvZigocCkpKSA/IE5VTEwgOiAocCkpCisjIGRlZmluZSBfWEdtdGltZSh0LHApCQkoZ210aW1lX3IoKHQpLCYocCkpID8gTlVMTCA6ICYocCkpCisjIGRlZmluZSBfWExvY2FsdGltZSh0LHApCShsb2NhbHRpbWVfcigodCksJihwKSkgPyBOVUxMIDogJihwKSkKKworI2VsaWYgIWRlZmluZWQoX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUykgJiYgZGVmaW5lZChfX3N1bikKKy8qIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLiAgU29sYXJpcyAyLjUKKyAqCisgKiBleHRlcm4gY2hhciAqYXNjdGltZV9yKGNvbnN0IHN0cnVjdCB0bSAqdG0sY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKKyAqIGV4dGVybiBjaGFyICpjdGltZV9yKGNvbnN0IHRpbWVfdCAqY2xvY2ssIGNoYXIgKmJ1ZiwgaW50IGJ1Zmxlbik7CisgKiBleHRlcm4gc3RydWN0IHRtICpnbXRpbWVfcihjb25zdCB0aW1lX3QgKmNsb2NrLCBzdHJ1Y3QgdG0gKnJlcyk7CisgKiBleHRlcm4gc3RydWN0IHRtICpsb2NhbHRpbWVfcihjb25zdCB0aW1lX3QgKmNsb2NrLCBzdHJ1Y3QgdG0gKnJlcyk7CisgKi8KKyMgaWZkZWYgVElNRUxFTgordHlwZWRlZiBjaGFyIF9YYXRpbWVwYXJhbXNbVElNRUxFTl07Cit0eXBlZGVmIGNoYXIgX1hjdGltZXBhcmFtc1tUSU1FTEVOXTsKKyMgZWxzZQordHlwZWRlZiBjaGFyIF9YYXRpbWVwYXJhbXNbMjZdOwordHlwZWRlZiBjaGFyIF9YY3RpbWVwYXJhbXNbMjZdOworIyBlbmRpZgordHlwZWRlZiBzdHJ1Y3QgdG0gX1hndGltZXBhcmFtczsKK3R5cGVkZWYgc3RydWN0IHRtIF9YbHRpbWVwYXJhbXM7CisjIGRlZmluZSBfWEFzY3RpbWUodCxwKQkJYXNjdGltZV9yKCh0KSwocCksc2l6ZW9mKChwKSkpCisjIGRlZmluZSBfWEN0aW1lKHQscCkJCWN0aW1lX3IoKHQpLChwKSxzaXplb2YoKHApKSkKKyMgZGVmaW5lIF9YR210aW1lKHQscCkJCWdtdGltZV9yKCh0KSwmKHApKQorIyBkZWZpbmUgX1hMb2NhbHRpbWUodCxwKQlsb2NhbHRpbWVfcigodCksJihwKSkKKworI2Vsc2UgLyogZGVmaW5lZChfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TKSAqLworLyogUE9TSVggZmluYWwgQVBJLgorICogZXh0ZXJuIGNoYXIgKmFzY3RpbWVfcihjb25zdCBzdHJ1Y3QgdG0gKnRpbWVwdHIsIGNoYXIgKmJ1ZmZlcik7CisgKiBleHRlcm4gY2hhciAqY3RpbWVfcihjb25zdCB0aW1lX3QgKnRpbWVyLCBjaGFyICpidWZmZXIpOworICogZXh0ZXJuIHN0cnVjdCB0bSAqZ210aW1lX3IoY29uc3QgdGltZV90ICp0aW1lciwgc3RydWN0IHRtICpyZXN1bHQpOworICogZXh0ZXJuIHN0cnVjdCB0bSAqbG9jYWx0aW1lX3IoY29uc3QgdGltZV90ICp0aW1lciwgc3RydWN0IHRtICpyZXN1bHQpOworICovCisjIGlmZGVmIFRJTUVMRU4KK3R5cGVkZWYgY2hhciBfWGF0aW1lcGFyYW1zW1RJTUVMRU5dOwordHlwZWRlZiBjaGFyIF9YY3RpbWVwYXJhbXNbVElNRUxFTl07CisjIGVsc2UKK3R5cGVkZWYgY2hhciBfWGF0aW1lcGFyYW1zWzI2XTsKK3R5cGVkZWYgY2hhciBfWGN0aW1lcGFyYW1zWzI2XTsKKyMgZW5kaWYKK3R5cGVkZWYgc3RydWN0IHRtIF9YZ3RpbWVwYXJhbXM7Cit0eXBlZGVmIHN0cnVjdCB0bSBfWGx0aW1lcGFyYW1zOworIyBkZWZpbmUgX1hBc2N0aW1lKHQscCkJCWFzY3RpbWVfcigodCksKHApKQorIyBkZWZpbmUgX1hDdGltZSh0LHApCQljdGltZV9yKCh0KSwocCkpCisjIGRlZmluZSBfWEdtdGltZSh0LHApCQlnbXRpbWVfcigodCksJihwKSkKKyMgZGVmaW5lIF9YTG9jYWx0aW1lKHQscCkJbG9jYWx0aW1lX3IoKHQpLCYocCkpCisjZW5kaWYgLyogWF9JTkNMVURFX1RJTUVfSCAqLworCisjaWYgZGVmaW5lZChYX0lOQ0xVREVfVElNRV9IKSAmJiAhZGVmaW5lZChfWE9TX0lOQ0xVREVEX1RJTUVfSCkKKyMgZGVmaW5lIF9YT1NfSU5DTFVERURfVElNRV9ICisjZW5kaWYKKworCisvKioqKiogPGdycC5oPiB3cmFwcGVycyAqKioqKi8KKworLyoKKyAqIEVmZmVjdGl2ZSBwcm90b3R5cGVzIGZvciA8Z3JwLmg+IHdyYXBwZXJzOgorICoKKyAqIE5PVEU6IE9uIHN5c3RlbXMgbGFja2luZyBhcHByb3ByaWF0ZSBfciBmdW5jdGlvbnMgR2V0Z3JnaWQoKSBhbmQKKyAqCUdldGdybmFtKCkgZG8gTk9UIGNvcHkgdGhlIGxpc3Qgb2YgZ3JvdXAgbWVtYmVycyEKKyAqCisgKiBSZW1lbWJlciB0aGF0IGZnZXRncmVudCgpLCBzZXRncmVudCgpLCBnZXRncmVudCgpLCBhbmQgZW5kZ3JlbnQoKQorICogYXJlIG5vdCBpbmNsdWRlZCBpbiBQT1NJWC4KKyAqCisgKiAjZGVmaW5lIFhfSU5DTFVERV9HUlBfSAorICogI2RlZmluZSBYT1NfVVNFXy4uLl9MT0NLSU5HCisgKiAjaW5jbHVkZSA8WDExL1hvc19yLmg+CisgKgorICogdHlwZWRlZiAuLi4gX1hnZXRncnBhcmFtczsKKyAqCisgKiBzdHJ1Y3QgZ3JvdXAgKl9YR2V0Z3JnaWQoZ2lkX3QsIF9YZ2V0Z3JwYXJhbXMpOworICogc3RydWN0IGdyb3VwICpfWEdldGdybmFtKGNvbnN0IGNoYXIgKiwgX1hnZXRncnBhcmFtcyk7CisgKi8KKworI2lmIGRlZmluZWQoWF9JTkNMVURFX0dSUF9IKSAmJiAhZGVmaW5lZChfWE9TX0lOQ0xVREVEX0dSUF9IKQorIyBpbmNsdWRlIDxncnAuaD4KKyMgaWYgZGVmaW5lZChYVVNFX01UU0FGRV9BUEkpIHx8IGRlZmluZWQoWFVTRV9NVFNBRkVfR1JQQVBJKQorIyAgZGVmaW5lIFhPU19VU0VfTVRTQUZFX0dSUEFQSSAxCisjIGVuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFhfSU5DTFVERV9HUlBfSCkgfHwgZGVmaW5lZChfWE9TX0lOQ0xVREVEX0dSUF9IKQorLyogRG8gbm90aGluZy4gKi8KKworI2VsaWYgIWRlZmluZWQoWFRIUkVBRFMpICYmICFkZWZpbmVkKFhfRk9SQ0VfVVNFX01UU0FGRV9BUEkpCisvKiBVc2UgcmVndWxhciwgdW5zYWZlIEFQSS4gKi8KK3R5cGVkZWYgaW50IF9YZ2V0Z3JwYXJhbXM7CS8qIGR1bW15ICovCisjZGVmaW5lIF9YR2V0Z3JnaWQoZyxwKQlnZXRncmdpZCgoZykpCisjZGVmaW5lIF9YR2V0Z3JuYW0obixwKQlnZXRncm5hbSgobikpCisKKyNlbGlmICFkZWZpbmVkKFhPU19VU0VfTVRTQUZFX0dSUEFQSSkgfHwgZGVmaW5lZChYTk9fTVRTQUZFX0dSUEFQSSkKKy8qIFN5c3RlbXMgd2l0aCB0aHJlYWQgc3VwcG9ydCBidXQgbm8gX3IgQVBJLiAgVW5peFdhcmUgMi4wLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QgZ3JvdXAgZ3JwOworICBjaGFyIGJ1ZltYX0xJTkVfTUFYXTsJLyogU2hvdWxkIGJlIHN5c2NvbmYoX1NDX0dFVEdSX1JfU0laRV9NQVgpPyAqLworICBzdHJ1Y3QgZ3JvdXAgKnBncnA7CisgIHNpemVfdCBsZW47Cit9IF9YZ2V0Z3JwYXJhbXM7CisjaWZkZWYgU1ZSNAorLyogQ29weSB0aGUgZ3JfcGFzc3dkIGZpZWxkIHRvby4gKi8KKyMgZGVmaW5lIF9YZ3JwX2NvcHlHcm91cChwKSBcCisgKCBtZW1jcHkoJihwKS5ncnAsIChwKS5wZ3JwLCBzaXplb2Yoc3RydWN0IGdyb3VwKSksIFwKKyAgICgocCkuZ3JwLmdyX25hbWUgPSAocCkuYnVmKSwgXAorICAgKChwKS5sZW4gPSBzdHJsZW4oKHApLnBncnAtPmdyX25hbWUpKSwgXAorICAgc3RyY3B5KChwKS5ncnAuZ3JfbmFtZSwgKHApLnBncnAtPmdyX25hbWUpLCBcCisgICAoKHApLmdycC5ncl9wYXNzd2QgPSAocCkuZ3JwLmdyX25hbWUgKyAocCkubGVuICsgMSksIFwKKyAgICgocCkucGdycCA9ICYocCkuZ3JwKSwgXAorICAgMCApCisjZWxzZQorIyBkZWZpbmUgX1hncnBfY29weUdyb3VwKHApIFwKKyAoIG1lbWNweSgmKHApLmdycCwgKHApLnBncnAsIHNpemVvZihzdHJ1Y3QgZ3JvdXApKSwgXAorICAgKChwKS5ncnAuZ3JfbmFtZSA9IChwKS5idWYpLCBcCisgICBzdHJjcHkoKHApLmdycC5ncl9uYW1lLCAocCkucGdycC0+Z3JfbmFtZSksIFwKKyAgICgocCkucGdycCA9ICYocCkuZ3JwKSwgXAorICAgMCApCisjZW5kaWYKKyNkZWZpbmUgX1hHZXRncmdpZChnLHApIFwKKyAoIChfWG9zX3Byb2Nlc3NMb2NrKSwgXAorICAgKCgocCkucGdycCA9IGdldGdyZ2lkKChnKSkpID8gX1hncnBfY29weUdyb3VwKHApIDogMCksIFwKKyAgIChfWG9zX3Byb2Nlc3NVbmxvY2spLCBcCisgICAocCkucGdycCApCisjZGVmaW5lIF9YR2V0Z3JuYW0obixwKSBcCisgKCAoX1hvc19wcm9jZXNzTG9jayksIFwKKyAgICgoKHApLnBncnAgPSBnZXRncm5hbSgobikpKSA/IF9YZ3JwX2NvcHlHcm91cChwKSA6IDApLCBcCisgICAoX1hvc19wcm9jZXNzVW5sb2NrKSwgXAorICAgKHApLnBncnAgKQorCisjZWxpZiAhZGVmaW5lZChfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TKSAmJiBkZWZpbmVkKF9fc3VuKQorLyogTm9uLVBPU0lYIEFQSS4gIFNvbGFyaXMuCisgKgorICogZXh0ZXJuIHN0cnVjdCBncm91cCAqZ2V0Z3JnaWRfcihnaWRfdCwgc3RydWN0IGdyb3VwICosIGNoYXIgKiwgaW50KTsKKyAqIGV4dGVybiBzdHJ1Y3QgZ3JvdXAgKmdldGdybmFtX3IoY29uc3QgY2hhciAqLCBzdHJ1Y3QgZ3JvdXAgKiwgY2hhciAqLCBpbnQpOworICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBncm91cCBncnA7CisgIGNoYXIgYnVmW1hfTElORV9NQVhdOwkvKiBTaG91bGQgYmUgc3lzY29uZihfU0NfR0VUR1JfUl9TSVpFX01BWCk/ICovCit9IF9YZ2V0Z3JwYXJhbXM7CisjZGVmaW5lIF9YR2V0Z3JnaWQoZyxwKQlnZXRncmdpZF9yKChnKSwgJihwKS5ncnAsIChwKS5idWYsIHNpemVvZigocCkuYnVmKSkKKyNkZWZpbmUgX1hHZXRncm5hbShuLHApCWdldGdybmFtX3IoKG4pLCAmKHApLmdycCwgKHApLmJ1Ziwgc2l6ZW9mKChwKS5idWYpKQorCisjZWxpZiAhZGVmaW5lZChfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TKQorLyogTm9uLVBPU0lYIEFQSS4KKyAqIGV4dGVybiBpbnQgZ2V0Z3JnaWRfcihnaWRfdCwgc3RydWN0IGdyb3VwICosIGNoYXIgKiwgaW50KTsKKyAqIGV4dGVybiBpbnQgZ2V0Z3JuYW1fcihjb25zdCBjaGFyICosIHN0cnVjdCBncm91cCAqLCBjaGFyICosIGludCk7CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGdyb3VwIGdycDsKKyAgY2hhciBidWZbWF9MSU5FX01BWF07CS8qIFNob3VsZCBiZSBzeXNjb25mKF9TQ19HRVRHUl9SX1NJWkVfTUFYKT8gKi8KK30gX1hnZXRncnBhcmFtczsKKyNkZWZpbmUgX1hHZXRncmdpZChnLHApCVwKKyAoKGdldGdyZ2lkX3IoKGcpLCAmKHApLmdycCwgKHApLmJ1Ziwgc2l6ZW9mKChwKS5idWYpKSA/IE5VTEwgOiAmKHApLmdycCkpCisjZGVmaW5lIF9YR2V0Z3JuYW0obixwKQlcCisgKChnZXRncm5hbV9yKChuKSwgJihwKS5ncnAsIChwKS5idWYsIHNpemVvZigocCkuYnVmKSkgPyBOVUxMIDogJihwKS5ncnApKQorCisjZWxzZQorLyogUE9TSVggZmluYWwgQVBJLgorICoKKyAqIGludCBnZXRncmdpZF9yKGdpZF90LCBzdHJ1Y3QgZ3JvdXAgKiwgY2hhciAqLCBzaXplX3QsIHN0cnVjdCBncm91cCAqKik7CisgKiBpbnQgZ2V0Z3JuYW1fcihjb25zdCBjaGFyICosIHN0cnVjdCBncm91cCAqLCBjaGFyICosIHNpemVfdCwgc3RydWN0IGdyb3VwICoqKTsKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QgZ3JvdXAgZ3JwOworICBjaGFyIGJ1ZltYX0xJTkVfTUFYXTsJLyogU2hvdWxkIGJlIHN5c2NvbmYoX1NDX0dFVEdSX1JfU0laRV9NQVgpPyAqLworICBzdHJ1Y3QgZ3JvdXAgKnJlc3VsdDsKK30gX1hnZXRncnBhcmFtczsKKworI2RlZmluZSBfWEdldGdyZ2lkKGcscCkJXAorICgoZ2V0Z3JnaWRfcigoZyksICYocCkuZ3JwLCAocCkuYnVmLCBzaXplb2YoKHApLmJ1ZiksICYocCkucmVzdWx0KSA/IFwKKyAgIE5VTEwgOiAocCkucmVzdWx0KSkKKyNkZWZpbmUgX1hHZXRncm5hbShuLHApCVwKKyAoKGdldGdybmFtX3IoKG4pLCAmKHApLmdycCwgKHApLmJ1Ziwgc2l6ZW9mKChwKS5idWYpLCAmKHApLnJlc3VsdCkgPyBcCisgICBOVUxMIDogKHApLnJlc3VsdCkpCisjZW5kaWYKKworI2lmIGRlZmluZWQoWF9JTkNMVURFX0dSUF9IKSAmJiAhZGVmaW5lZChfWE9TX0lOQ0xVREVEX0dSUF9IKQorIyBkZWZpbmUgX1hPU19JTkNMVURFRF9HUlBfSAorI2VuZGlmCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAvKiBDbG9zZSBzY29wZSBvZiAnZXh0ZXJuICJDIicgZGVjbGFyYXRpb24gd2hpY2ggZW5jbG9zZXMgZmlsZS4gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWG9zZGVmcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWG9zZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZWFlZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9Yb3NkZWZzLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBPL1MtZGVwZW5kZW50IChtaXMpZmVhdHVyZSBtYWNybyBkZWZpbml0aW9ucworICoKK0NvcHlyaWdodCAxOTkxLCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorICovCisKKyNpZm5kZWYgX1hPU0RFRlNfSF8KKyMgZGVmaW5lIF9YT1NERUZTX0hfCisKKy8qCisgKiBYX05PVF9QT1NJWCBtZWFucyBkb2VzIG5vdCBoYXZlIFBPU0lYIGhlYWRlciBmaWxlcy4gIExhY2sgb2YgdGhpcworICogc3ltYm9sIGRvZXMgTk9UIG1lYW4gdGhhdCB0aGUgUE9TSVggZW52aXJvbm1lbnQgaXMgdGhlIGRlZmF1bHQuCisgKiBZb3UgbWF5IHN0aWxsIGhhdmUgdG8gZGVmaW5lIF9QT1NJWF9TT1VSQ0UgdG8gZ2V0IGl0LgorICovCisKKworIyBpZmRlZiBfU0NPX0RTCisjICBpZm5kZWYgX19TQ09fXworIyAgIGRlZmluZSBfX1NDT19fCisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmZGVmIF9faTM4Nl9fCisjICBpZmRlZiBTWVNWCisjICAgaWYgIWRlZmluZWQoX19TQ09fXykgJiYgXAorCSFkZWZpbmVkKF9fVU5JWFdBUkVfXykgJiYgIWRlZmluZWQoX19zdW4pCisjICAgIGlmICFkZWZpbmVkKF9QT1NJWF9TT1VSQ0UpCisjICAgICBkZWZpbmUgWF9OT1RfUE9TSVgKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZmRlZiBfX3N1bgorLyogSW1ha2UgY29uZmlncyBkZWZpbmUgU1ZSNCBvbiBTb2xhcmlzLCBidXQgY2MgJiBnY2Mgb25seSBkZWZpbmUgX19TVlI0CisgKiBUaGlzIGNoZWNrIGFsbG93cyBub24tSW1ha2UgY29uZmlndXJlZCBwcm9ncmFtcyB0byBidWlsZCBjb3JyZWN0bHkuCisgKi8KKyMgIGlmIGRlZmluZWQoX19TVlI0KSAmJiAhZGVmaW5lZChTVlI0KQorIyAgIGRlZmluZSBTVlI0IDEKKyMgIGVuZGlmCisjICBpZmRlZiBTVlI0CisvKiBkZWZpbmUgdGhpcyB0byB3aGF0ZXZlciBpdCBuZWVkcyB0byBiZSAqLworIyAgIGRlZmluZSBYX1BPU0lYX0NfU09VUkNFIDE5OTMwMEwKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZkZWYgV0lOMzIKKyMgIGlmbmRlZiBfUE9TSVhfCisjICAgZGVmaW5lIFhfTk9UX1BPU0lYCisjICBlbmRpZgorIyBlbmRpZgorCisKKyMgaWZkZWYgX19BUFBMRV9fCisjICBkZWZpbmUgTlVMTF9OT1RfWkVSTworCisvKiBEZWZpbmluZyBhbnkgb2YgdGhlc2Ugd2lsbCBzYW5pdGl6ZSB0aGUgbmFtZXNwYWNlIHRvIEpVU1Qgd2FudCBpcyBkZWZpbmVkIGJ5CisgKiB0aGF0IHBhcnRpY3VsYXIgc3RhbmRhcmQuICBJZiB0aGF0IGhhcHBlbnMsIHdlIGRvbid0IGdldCBzb21lIGV4cGVjdGVkCisgKiBwcm90b3R5cGVzLCB0eXBlZGVmcywgZXRjIChsaWtlIGZkX21hc2spLiAgV2UgY2FuIGRlZmluZSBfREFSV0lOX0NfU09VUkNFIHRvCisgKiBsb29zZW4gb3VyIGJlbHRzIGEgdGFkLgorICovCisjICBpZiBkZWZpbmVkKF9YT1BFTl9TT1VSQ0UpIHx8IGRlZmluZWQoX1BPU0lYX1NPVVJDRSkgfHwgZGVmaW5lZChfUE9TSVhfQ19TT1VSQ0UpCisjICAgaWZuZGVmIF9EQVJXSU5fQ19TT1VSQ0UKKyMgICAgZGVmaW5lIF9EQVJXSU5fQ19TT1VSQ0UKKyMgICBlbmRpZgorIyAgZW5kaWYKKworIyBlbmRpZgorCisjIGlmZGVmIF9fR05VX18KKyMgIGlmbmRlZiBQQVRIX01BWAorIyAgIGRlZmluZSBQQVRIX01BWCA0MDk2CisjICBlbmRpZgorIyAgaWZuZGVmIE1BWFBBVEhMRU4KKyMgICBkZWZpbmUgTUFYUEFUSExFTiA0MDk2CisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmIGRlZmluZWQoX19TQ09fXykgfHwgZGVmaW5lZChfX1VOSVhXQVJFX18pCisjICBpZm5kZWYgUEFUSF9NQVgKKyMgICBkZWZpbmUgUEFUSF9NQVgJMTAyNAorIyAgZW5kaWYKKyMgIGlmbmRlZiBNQVhQQVRITEVOCisjICAgZGVmaW5lIE1BWFBBVEhMRU4JMTAyNAorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIFwKKwl8fCBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfX0RyYWdvbkZseV9fKQorIyAgaWZuZGVmIENTUkdfQkFTRUQKKyMgICBkZWZpbmUgQ1NSR19CQVNFRAorIyAgZW5kaWYKKyMgZW5kaWYKKworI2VuZGlmIC8qIF9YT1NERUZTX0hfICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hwb2xsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YcG9sbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NmVhMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YcG9sbC5oCkBAIC0wLDAgKzEsMjE4IEBACisvKgorCitDb3B5cmlnaHQgMTk5NCwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCitPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCitBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKK09USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwKK25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3IKK290aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KK2Zyb20gVGhlIE9wZW4gR3JvdXAuCisKKyovCisKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwNSBEYW5pZWwgU3RvbmUKKyAqIAorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBEYW5pZWwgU3RvbmUgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcKKyAqIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyAqIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIERhbmllbCBTdG9uZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlCisgKiBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKKyAqIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIERBTklFTCBTVE9ORSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCisgKiBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIERBTklFTCBTVE9ORSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKKyAqIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqLworCisjaWZuZGVmIF9YUE9MTF9IXworI2RlZmluZSBfWFBPTExfSF8KKworI2lmbmRlZiBXSU4zMgorCisjaWZuZGVmIFVTRV9QT0xMCisKKyNpbmNsdWRlIDxYMTEvWG9zLmg+CisKKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+ICAvKiBHZXQgdGhlIEZEXyogbWFjcm9zLiAqLworCisjaW5jbHVkZSA8WDExL1htZC5oPgorCisjaWZkZWYgQ1NSR19CQVNFRAorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyBpZiBCU0QgPCAxOTkxMDMKK3R5cGVkZWYgbG9uZyBmZF9tYXNrOworIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgWEZEX1NFVFNJWkUJMjU2CisKKyNpZm5kZWYgRkRfU0VUU0laRQorI2RlZmluZSBGRF9TRVRTSVpFCVhGRF9TRVRTSVpFCisjZW5kaWYKKworI2lmbmRlZiBOQkJZCisjZGVmaW5lIE5CQlkJOAkJLyogbnVtYmVyIG9mIGJpdHMgaW4gYSBieXRlICovCisjZW5kaWYKKworI2lmbmRlZiBORkRCSVRTCisjZGVmaW5lIE5GREJJVFMgKHNpemVvZihmZF9tYXNrKSAqIE5CQlkpCS8qIGJpdHMgcGVyIG1hc2sgKi8KKyNlbmRpZgorCisjaWZuZGVmIGhvd21hbnkKKyNkZWZpbmUgaG93bWFueSh4LHkpCSgoKHgpKygoeSktMSkpLyh5KSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCU0QpICYmIEJTRCA8IDE5ODkxMSAKK3R5cGVkZWYgc3RydWN0IGZkX3NldCB7CisJZmRfbWFzayBmZHNfYml0c1tob3dtYW55KEZEX1NFVFNJWkUsIE5GREJJVFMpXTsKK30gZmRfc2V0OworI2VuZGlmCisKKyMgZGVmaW5lIFNlbGVjdChuLHIsdyxlLHQpIHNlbGVjdChuLChmZF9zZXQqKXIsKGZkX3NldCopdywoZmRfc2V0KillLChzdHJ1Y3QgdGltZXZhbCopdCkKKworI2RlZmluZSBfX1hfRkRTX0JJVFMgX19mZHNfYml0cworCisjaWZuZGVmIF9fRkRTX0JJVFMKKyMgZGVmaW5lIF9fRkRTX0JJVFMocCkgICgocCktPl9fWF9GRFNfQklUUykKKyNlbmRpZgorCisjZGVmaW5lIF9fWEZEU19CSVRTKHAsIG4pIChfX0ZEU19CSVRTKHApKVtuXQorCisjaWZuZGVmIEZEX1NFVAorI2RlZmluZSBGRF9TRVQobiwgcCkgICAgKF9fWEZEU19CSVRTKHAsICgobikvTkZEQklUUykpIHw9ICgoZmRfbWFzaykxIDw8ICgobikgJSBORkRCSVRTKSkpCisjZW5kaWYKKyNpZm5kZWYgRkRfQ0xSCisjZGVmaW5lIEZEX0NMUihuLCBwKSAgICAoX19YRkRTX0JJVFMoKHApLCAoKG4pL05GREJJVFMpKSAmPSB+KChmZF9tYXNrKTEgPDwgKChuKSAlIE5GREJJVFMpKSkKKyNlbmRpZgorI2lmbmRlZiBGRF9JU1NFVAorI2RlZmluZSBGRF9JU1NFVChuLCBwKSAgKChfX1hGRFNfQklUUygocCksICgobikvTkZEQklUUykpKSAmICgoZmRfbWFzaykxIDw8ICgobikgJSBORkRCSVRTKSkpCisjZW5kaWYKKyNpZm5kZWYgRkRfWkVSTworI2RlZmluZSBGRF9aRVJPKHApICAgICAgYnplcm8oKGNoYXIgKikocCksIHNpemVvZigqKHApKSkKKyNlbmRpZgorCisvKgorICogVGhlIGhvd21hbnkoRkRfU0VUU0laRSwgTkZEQklUUykgY29tcHV0ZXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUKKyAqIGFycmF5LiBiZWZvcmUgYWNjZXNzaW5nIGFuIGVsZW1lbnQgaW4gdGhlIGFycmF5IHdlIGNoZWNrIGl0IGV4aXN0cy4KKyAqIElmIGl0IGRvZXMgbm90IGV4aXN0IHRoZW4gdGhlIGNvbXBpbGVyIGRpc2NhcmRzIHRoZSBjb2RlIHRvIGFjY2VzcyBpdC4gCisgKi8KKyNkZWZpbmUgWEZEX0FOWVNFVChwKSBcCisgICAgICAgICgoaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKSA+IDAgJiYgKF9fWEZEU19CSVRTKHAsIDApKSkgfHwgXAorICAgICAgICAoaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKSA+IDEgJiYgKF9fWEZEU19CSVRTKHAsIDEpKSkgfHwgXAorICAgICAgICAoaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKSA+IDIgJiYgKF9fWEZEU19CSVRTKHAsIDIpKSkgfHwgXAorICAgICAgICAoaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKSA+IDMgJiYgKF9fWEZEU19CSVRTKHAsIDMpKSkgfHwgXAorICAgICAgICAoaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKSA+IDQgJiYgKF9fWEZEU19CSVRTKHAsIDQpKSkgfHwgXAorICAgICAgICAoaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKSA+IDUgJiYgKF9fWEZEU19CSVRTKHAsIDUpKSkgfHwgXAorICAgICAgICAoaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKSA+IDYgJiYgKF9fWEZEU19CSVRTKHAsIDYpKSkgfHwgXAorICAgICAgICAoaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKSA+IDcgJiYgKF9fWEZEU19CSVRTKHAsIDcpKSkpCisKKyNkZWZpbmUgWEZEX0NPUFlTRVQoc3JjLGRzdCkgeyBcCisgICAgICAgIGludCBfX2lfXzsgXAorCQlmb3IgKF9faV9fID0gMDsgX19pX18gPCBob3dtYW55KEZEX1NFVFNJWkUsIE5GREJJVFMpOyBfX2lfXysrKSBcCisgICAgICAgICAgICBfX1hGRFNfQklUUygoZHN0KSwgX19pX18pID0gX19YRkRTX0JJVFMoKHNyYyksIF9faV9fKTsgXAorICAgICAgICB9CisjZGVmaW5lIFhGRF9BTkRTRVQoZHN0LGIxLGIyKSB7IFwKKyAgICAgICAgaW50IF9faV9fOyBcCisgICAgICAgIGZvciAoX19pX18gPSAwOyBfX2lfXyA8IGhvd21hbnkoRkRfU0VUU0laRSwgTkZEQklUUyk7IF9faV9fKyspIFwKKyAgICAgICAgICAgIF9fWEZEU19CSVRTKChkc3QpLCBfX2lfXykgPSAoKF9fWEZEU19CSVRTKChiMSksIF9faV9fKSkgJiAoX19YRkRTX0JJVFMoKGIyKSwgX19pX18pKSk7IFwKKyAgICAgICAgfQorI2RlZmluZSBYRkRfT1JTRVQoZHN0LGIxLGIyKSB7IFwKKyAgICAgICAgaW50IF9faV9fOyBcCisgICAgICAgIGZvciAoX19pX18gPSAwOyBfX2lfXyA8IGhvd21hbnkoRkRfU0VUU0laRSwgTkZEQklUUyk7IF9faV9fKyspIFwKKwkJX19YRkRTX0JJVFMoKGRzdCksIF9faV9fKSA9ICgoX19YRkRTX0JJVFMoKGIxKSwgX19pX18pKSB8IChfX1hGRFNfQklUUygoYjIpLCBfX2lfXykpKTsgXAorICAgICAgICB9ICAgICAgICAKKyNkZWZpbmUgWEZEX1VOU0VUKGRzdCxiMSkgeyBcCisgICAgICAgIGludCBfX2lfXzsgXAorICAgICAgICBmb3IgKF9faV9fID0gMDsgX19pX18gPCBob3dtYW55KEZEX1NFVFNJWkUsIE5GREJJVFMpOyBfX2lfXysrKSBcCisgICAgCQlfX1hGRFNfQklUUygoZHN0KSwgX19pX18pICY9IH4oX19YRkRTX0JJVFMoKGIxKSwgX19pX18pKTsgXAorICAgICAgICB9CisKKyNlbHNlIC8qIFVTRV9QT0xMICovCisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNlbmRpZiAvKiBVU0VfUE9MTCAqLworCisjZWxzZSAvKiBXSU4zMiAqLworCisjZGVmaW5lIFhGRF9TRVRTSVpFCTI1NgorI2lmbmRlZiBGRF9TRVRTSVpFCisjZGVmaW5lIEZEX1NFVFNJWkUJWEZEX1NFVFNJWkUKKyNlbmRpZgorI2luY2x1ZGUgPFgxMS9Yd2luc29jay5oPgorCisjZGVmaW5lIFNlbGVjdChuLHIsdyxlLHQpIHNlbGVjdCgwLChmZF9zZXQqKXIsKGZkX3NldCopdywoZmRfc2V0KillLChzdHJ1Y3QgdGltZXZhbCopdCkKKworI2RlZmluZSBYRkRfU0VUQ09VTlQocCkJKCgoZmRfc2V0IEZBUiAqKShwKSktPmZkX2NvdW50KQorI2RlZmluZSBYRkRfRkQocCxpKSAoKChmZF9zZXQgRkFSICopKHApKS0+ZmRfYXJyYXlbaV0pCisjZGVmaW5lIFhGRF9BTllTRVQocCkJWEZEX1NFVENPVU5UKHApCisKKyNkZWZpbmUgWEZEX0NPUFlTRVQoc3JjLGRzdCkgeyBcCisgICAgdV9pbnQgX19pOyBcCisgICAgRkRfWkVSTyhkc3QpOyBcCisgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBYRkRfU0VUQ09VTlQoc3JjKSA7IF9faSsrKSB7IFwKKyAgICAgICAgWEZEX0ZEKGRzdCxfX2kpID0gWEZEX0ZEKHNyYyxfX2kpOyBcCisgICAgfSBcCisgICAgWEZEX1NFVENPVU5UKGRzdCkgPSBYRkRfU0VUQ09VTlQoc3JjKTsgXAorfQorCisjZGVmaW5lIFhGRF9BTkRTRVQoZHN0LGIxLGIyKSB7IFwKKyAgICB1X2ludCBfX2k7IFwKKyAgICBGRF9aRVJPKGRzdCk7IFwKKyAgICBmb3IgKF9faSA9IDA7IF9faSA8IFhGRF9TRVRDT1VOVChiMSkgOyBfX2krKykgeyBcCisgICAgICAgIGlmIChGRF9JU1NFVChYRkRfRkQoYjEsX19pKSwgYjIpKSBcCisJICAgRkRfU0VUKFhGRF9GRChiMSxfX2kpLCBkc3QpOyBcCisgICAgfSBcCit9CisKKyNkZWZpbmUgWEZEX09SU0VUKGRzdCxiMSxiMikgeyBcCisgICAgdV9pbnQgX19pOyBcCisgICAgaWYgKGRzdCAhPSBiMSkgWEZEX0NPUFlTRVQoYjEsZHN0KTsgXAorICAgIGZvciAoX19pID0gMDsgX19pIDwgWEZEX1NFVENPVU5UKGIyKSA7IF9faSsrKSB7IFwKKyAgICAgICAgaWYgKCFGRF9JU1NFVChYRkRfRkQoYjIsX19pKSwgZHN0KSkgXAorCSAgIEZEX1NFVChYRkRfRkQoYjIsX19pKSwgZHN0KTsgXAorICAgIH0gXAorfQorCisvKiB0aGlzIG9uZSBpcyByZWFsbHkgc3ViLW9wdGltYWwgKi8KKyNkZWZpbmUgWEZEX1VOU0VUKGRzdCxiMSkgeyBcCisgICAgdV9pbnQgX19pOyBcCisgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBYRkRfU0VUQ09VTlQoYjEpIDsgX19pKyspIHsgXAorCUZEX0NMUihYRkRfRkQoYjEsX19pKSwgZHN0KTsgXAorICAgIH0gXAorfQorCisvKiB3ZSBoYXZlIHRvIHBheSB0aGUgcHJpY2Ugb2YgaGF2aW5nIGFuIGFycmF5IGhlcmUsIHVubGlrZSB3aXRoIGJpdG1hc2tzCisgICBjYWxsaW5nIHR3aWNlIEZEX1NFVCB3aXRoIHRoZSBzYW1lIGZkIGlzIG5vdCB0cmFuc3BhcmVudCwgc28gYmUgY2FyZWZ1bCAqLworI3VuZGVmIEZEX1NFVAorI2RlZmluZSBGRF9TRVQoZmQsc2V0KSBkbyB7IFwKKyAgICBpZiAoWEZEX1NFVENPVU5UKHNldCkgPCBGRF9TRVRTSVpFICYmICFGRF9JU1NFVChmZCxzZXQpKSBcCisgICAgICAgIFhGRF9GRChzZXQsWEZEX1NFVENPVU5UKHNldCkrKyk9KGZkKTsgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIGdldGR0YWJsZXNpemUoKSBGRF9TRVRTSVpFIAorCisjZW5kaWYgLyogV0lOMzIgKi8KKworI2VuZGlmIC8qIF9YUE9MTF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHByb3RvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTVkNDQxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHByb3RvLmgKQEAgLTAsMCArMSwyMTU3IEBACisvKiBEZWZpbml0aW9ucyBmb3IgdGhlIFggd2luZG93IHN5c3RlbSB1c2VkIGJ5IHNlcnZlciBhbmQgYyBiaW5kaW5ncyAqLworCisvKgorICogVGhpcyBwYWNrZXQtY29uc3RydWN0aW9uIHNjaGVtZSBtYWtlcyB0aGUgZm9sbG93aW5nIGFzc3VtcHRpb25zOgorICoKKyAqIDEuIFRoZSBjb21waWxlciBpcyBhYmxlCisgKiB0byBnZW5lcmF0ZSBjb2RlIHdoaWNoIGFkZHJlc3NlcyBvbmUtIGFuZCB0d28tYnl0ZSBxdWFudGl0aWVzLgorICogSW4gdGhlIHdvcnN0IGNhc2UsIHRoaXMgd291bGQgYmUgZG9uZSB3aXRoIGJpdC1maWVsZHMuICBJZiBiaXQtZmllbGRzCisgKiBhcmUgdXNlZCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHJlb3JkZXIgdGhlIHJlcXVlc3QgZmllbGRzIGluIHRoaXMgZmlsZSwKKyAqIGRlcGVuZGluZyBvbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIG1hY2hpbmUgYXNzaWducyBiaXQgZmllbGRzIHRvCisgKiBtYWNoaW5lIHdvcmRzLiAgVGhlcmUgbWF5IGFsc28gYmUgYSBwcm9ibGVtIHdpdGggc2lnbiBleHRlbnNpb24sCisgKiBhcyBLK1Igc3BlY2lmeSB0aGF0IGJpdGZpZWxkcyBhcmUgYWx3YXlzIHVuc2lnbmVkLgorICoKKyAqIDIuIDItIGFuZCA0LWJ5dGUgZmllbGRzIGluIHBhY2tldCBzdHJ1Y3R1cmVzIG11c3QgYmUgb3JkZXJlZCBieSBoYW5kCisgKiBzdWNoIHRoYXQgdGhleSBhcmUgbmF0dXJhbGx5LWFsaWduZWQsIHNvIHRoYXQgbm8gY29tcGlsZXIgd2lsbCBldmVyCisgKiBpbnNlcnQgcGFkZGluZyBieXRlcy4KKyAqCisgKiAzLiBBbGwgcGFja2V0cyBhcmUgaGFuZC1wYWRkZWQgdG8gYSBtdWx0aXBsZSBvZiA0IGJ5dGVzLCBmb3IKKyAqIHRoZSBzYW1lIHJlYXNvbi4KKyAqLworCisjaWZuZGVmIFhQUk9UT19ICisjZGVmaW5lIFhQUk9UT19ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4NywgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworCitDb3B5cmlnaHQgMTk4NyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cy4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBEaWdpdGFsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICAKKworRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8WDExL1htZC5oPgorI2luY2x1ZGUgPFgxMS9YcHJvdG9zdHIuaD4KKworLyoKKyAqIERlZmluZSBjb25zdGFudHMgZm9yIHRoZSBzaXplcyBvZiB0aGUgbmV0d29yayBwYWNrZXRzLiAgVGhlIHN6XyBwcmVmaXggaXMKKyAqIHVzZWQgaW5zdGVhZCBvZiBzb21ldGhpbmcgbW9yZSBkZXNjcmlwdGl2ZSBzbyB0aGF0IHRoZSBzeW1ib2xzIGFyZSBubyBtb3JlCisgKiB0aGFuIDMyIGNoYXJhY3RlcnMgaW4gbGVuZ3RoICh3aGljaCBjYXVzZXMgcHJvYmxlbXMgZm9yIHNvbWUgY29tcGlsZXJzKS4KKyAqLworI2RlZmluZSBzel94U2VnbWVudCA4CisjZGVmaW5lIHN6X3hQb2ludCA0CisjZGVmaW5lIHN6X3hSZWN0YW5nbGUgOAorI2RlZmluZSBzel94QXJjIDEyCisjZGVmaW5lIHN6X3hDb25uQ2xpZW50UHJlZml4IDEyCisjZGVmaW5lIHN6X3hDb25uU2V0dXBQcmVmaXggOAorI2RlZmluZSBzel94Q29ublNldHVwIDMyCisjZGVmaW5lIHN6X3hQaXhtYXBGb3JtYXQgOAorI2RlZmluZSBzel94RGVwdGggOAorI2RlZmluZSBzel94VmlzdWFsVHlwZSAyNAorI2RlZmluZSBzel94V2luZG93Um9vdCA0MAorI2RlZmluZSBzel94VGltZWNvb3JkIDgKKyNkZWZpbmUgc3pfeEhvc3RFbnRyeSA0CisjZGVmaW5lIHN6X3hDaGFySW5mbyAxMgorI2RlZmluZSBzel94Rm9udFByb3AgOAorI2RlZmluZSBzel94VGV4dEVsdCAyCisjZGVmaW5lIHN6X3hDb2xvckl0ZW0gMTIKKyNkZWZpbmUgc3pfeHJnYiA4CisjZGVmaW5lIHN6X3hHZW5lcmljUmVwbHkgMzIKKyNkZWZpbmUgc3pfeEdldFdpbmRvd0F0dHJpYnV0ZXNSZXBseSA0NAorI2RlZmluZSBzel94R2V0R2VvbWV0cnlSZXBseSAzMgorI2RlZmluZSBzel94UXVlcnlUcmVlUmVwbHkgMzIKKyNkZWZpbmUgc3pfeEludGVybkF0b21SZXBseSAzMgorI2RlZmluZSBzel94R2V0QXRvbU5hbWVSZXBseSAzMgorI2RlZmluZSBzel94R2V0UHJvcGVydHlSZXBseSAzMgorI2RlZmluZSBzel94TGlzdFByb3BlcnRpZXNSZXBseSAzMgorI2RlZmluZSBzel94R2V0U2VsZWN0aW9uT3duZXJSZXBseSAzMgorI2RlZmluZSBzel94R3JhYlBvaW50ZXJSZXBseSAzMgorI2RlZmluZSBzel94UXVlcnlQb2ludGVyUmVwbHkgMzIKKyNkZWZpbmUgc3pfeEdldE1vdGlvbkV2ZW50c1JlcGx5IDMyCisjZGVmaW5lIHN6X3hUcmFuc2xhdGVDb29yZHNSZXBseSAzMgorI2RlZmluZSBzel94R2V0SW5wdXRGb2N1c1JlcGx5IDMyCisjZGVmaW5lIHN6X3hRdWVyeUtleW1hcFJlcGx5IDQwCisjZGVmaW5lIHN6X3hRdWVyeUZvbnRSZXBseSA2MAorI2RlZmluZSBzel94UXVlcnlUZXh0RXh0ZW50c1JlcGx5IDMyCisjZGVmaW5lIHN6X3hMaXN0Rm9udHNSZXBseSAzMgorI2RlZmluZSBzel94R2V0Rm9udFBhdGhSZXBseSAzMgorI2RlZmluZSBzel94R2V0SW1hZ2VSZXBseSAzMgorI2RlZmluZSBzel94TGlzdEluc3RhbGxlZENvbG9ybWFwc1JlcGx5IDMyCisjZGVmaW5lIHN6X3hBbGxvY0NvbG9yUmVwbHkgMzIKKyNkZWZpbmUgc3pfeEFsbG9jTmFtZWRDb2xvclJlcGx5IDMyCisjZGVmaW5lIHN6X3hBbGxvY0NvbG9yQ2VsbHNSZXBseSAzMgorI2RlZmluZSBzel94QWxsb2NDb2xvclBsYW5lc1JlcGx5IDMyCisjZGVmaW5lIHN6X3hRdWVyeUNvbG9yc1JlcGx5IDMyCisjZGVmaW5lIHN6X3hMb29rdXBDb2xvclJlcGx5IDMyCisjZGVmaW5lIHN6X3hRdWVyeUJlc3RTaXplUmVwbHkgMzIKKyNkZWZpbmUgc3pfeFF1ZXJ5RXh0ZW5zaW9uUmVwbHkgMzIKKyNkZWZpbmUgc3pfeExpc3RFeHRlbnNpb25zUmVwbHkgMzIKKyNkZWZpbmUgc3pfeFNldE1hcHBpbmdSZXBseSAzMgorI2RlZmluZSBzel94R2V0S2V5Ym9hcmRDb250cm9sUmVwbHkgNTIKKyNkZWZpbmUgc3pfeEdldFBvaW50ZXJDb250cm9sUmVwbHkgMzIKKyNkZWZpbmUgc3pfeEdldFNjcmVlblNhdmVyUmVwbHkgMzIKKyNkZWZpbmUgc3pfeExpc3RIb3N0c1JlcGx5IDMyCisjZGVmaW5lIHN6X3hTZXRNb2RpZmllck1hcHBpbmdSZXBseSAzMgorI2RlZmluZSBzel94RXJyb3IgMzIKKyNkZWZpbmUgc3pfeEV2ZW50IDMyCisjZGVmaW5lIHN6X3hLZXltYXBFdmVudCAzMgorI2RlZmluZSBzel94UmVxIDQKKyNkZWZpbmUgc3pfeFJlc291cmNlUmVxIDgKKyNkZWZpbmUgc3pfeENyZWF0ZVdpbmRvd1JlcSAzMgorI2RlZmluZSBzel94Q2hhbmdlV2luZG93QXR0cmlidXRlc1JlcSAxMgorI2RlZmluZSBzel94Q2hhbmdlU2F2ZVNldFJlcSA4CisjZGVmaW5lIHN6X3hSZXBhcmVudFdpbmRvd1JlcSAxNgorI2RlZmluZSBzel94Q29uZmlndXJlV2luZG93UmVxIDEyCisjZGVmaW5lIHN6X3hDaXJjdWxhdGVXaW5kb3dSZXEgOAorI2RlZmluZSBzel94SW50ZXJuQXRvbVJlcSA4CisjZGVmaW5lIHN6X3hDaGFuZ2VQcm9wZXJ0eVJlcSAyNAorI2RlZmluZSBzel94RGVsZXRlUHJvcGVydHlSZXEgMTIKKyNkZWZpbmUgc3pfeEdldFByb3BlcnR5UmVxIDI0CisjZGVmaW5lIHN6X3hTZXRTZWxlY3Rpb25Pd25lclJlcSAxNgorI2RlZmluZSBzel94Q29udmVydFNlbGVjdGlvblJlcSAyNAorI2RlZmluZSBzel94U2VuZEV2ZW50UmVxIDQ0CisjZGVmaW5lIHN6X3hHcmFiUG9pbnRlclJlcSAyNAorI2RlZmluZSBzel94R3JhYkJ1dHRvblJlcSAyNAorI2RlZmluZSBzel94VW5ncmFiQnV0dG9uUmVxIDEyCisjZGVmaW5lIHN6X3hDaGFuZ2VBY3RpdmVQb2ludGVyR3JhYlJlcSAxNgorI2RlZmluZSBzel94R3JhYktleWJvYXJkUmVxIDE2CisjZGVmaW5lIHN6X3hHcmFiS2V5UmVxIDE2CisjZGVmaW5lIHN6X3hVbmdyYWJLZXlSZXEgMTIKKyNkZWZpbmUgc3pfeEFsbG93RXZlbnRzUmVxIDgKKyNkZWZpbmUgc3pfeEdldE1vdGlvbkV2ZW50c1JlcSAxNgorI2RlZmluZSBzel94VHJhbnNsYXRlQ29vcmRzUmVxIDE2CisjZGVmaW5lIHN6X3hXYXJwUG9pbnRlclJlcSAyNAorI2RlZmluZSBzel94U2V0SW5wdXRGb2N1c1JlcSAxMgorI2RlZmluZSBzel94T3BlbkZvbnRSZXEgMTIKKyNkZWZpbmUgc3pfeFF1ZXJ5VGV4dEV4dGVudHNSZXEgOAorI2RlZmluZSBzel94TGlzdEZvbnRzUmVxIDgKKyNkZWZpbmUgc3pfeFNldEZvbnRQYXRoUmVxIDgKKyNkZWZpbmUgc3pfeENyZWF0ZVBpeG1hcFJlcSAxNgorI2RlZmluZSBzel94Q3JlYXRlR0NSZXEgMTYKKyNkZWZpbmUgc3pfeENoYW5nZUdDUmVxIDEyCisjZGVmaW5lIHN6X3hDb3B5R0NSZXEgMTYKKyNkZWZpbmUgc3pfeFNldERhc2hlc1JlcSAxMgorI2RlZmluZSBzel94U2V0Q2xpcFJlY3RhbmdsZXNSZXEgMTIKKyNkZWZpbmUgc3pfeENvcHlBcmVhUmVxIDI4CisjZGVmaW5lIHN6X3hDb3B5UGxhbmVSZXEgMzIKKyNkZWZpbmUgc3pfeFBvbHlQb2ludFJlcSAxMgorI2RlZmluZSBzel94UG9seVNlZ21lbnRSZXEgMTIKKyNkZWZpbmUgc3pfeEZpbGxQb2x5UmVxIDE2CisjZGVmaW5lIHN6X3hQdXRJbWFnZVJlcSAyNAorI2RlZmluZSBzel94R2V0SW1hZ2VSZXEgMjAKKyNkZWZpbmUgc3pfeFBvbHlUZXh0UmVxIDE2CisjZGVmaW5lIHN6X3hJbWFnZVRleHRSZXEgMTYKKyNkZWZpbmUgc3pfeENyZWF0ZUNvbG9ybWFwUmVxIDE2CisjZGVmaW5lIHN6X3hDb3B5Q29sb3JtYXBBbmRGcmVlUmVxIDEyCisjZGVmaW5lIHN6X3hBbGxvY0NvbG9yUmVxIDE2CisjZGVmaW5lIHN6X3hBbGxvY05hbWVkQ29sb3JSZXEgMTIKKyNkZWZpbmUgc3pfeEFsbG9jQ29sb3JDZWxsc1JlcSAxMgorI2RlZmluZSBzel94QWxsb2NDb2xvclBsYW5lc1JlcSAxNgorI2RlZmluZSBzel94RnJlZUNvbG9yc1JlcSAxMgorI2RlZmluZSBzel94U3RvcmVDb2xvcnNSZXEgOAorI2RlZmluZSBzel94U3RvcmVOYW1lZENvbG9yUmVxIDE2CisjZGVmaW5lIHN6X3hRdWVyeUNvbG9yc1JlcSA4CisjZGVmaW5lIHN6X3hMb29rdXBDb2xvclJlcSAxMgorI2RlZmluZSBzel94Q3JlYXRlQ3Vyc29yUmVxIDMyCisjZGVmaW5lIHN6X3hDcmVhdGVHbHlwaEN1cnNvclJlcSAzMgorI2RlZmluZSBzel94UmVjb2xvckN1cnNvclJlcSAyMAorI2RlZmluZSBzel94UXVlcnlCZXN0U2l6ZVJlcSAxMgorI2RlZmluZSBzel94UXVlcnlFeHRlbnNpb25SZXEgOAorI2RlZmluZSBzel94Q2hhbmdlS2V5Ym9hcmRDb250cm9sUmVxIDgKKyNkZWZpbmUgc3pfeEJlbGxSZXEgNAorI2RlZmluZSBzel94Q2hhbmdlUG9pbnRlckNvbnRyb2xSZXEgMTIKKyNkZWZpbmUgc3pfeFNldFNjcmVlblNhdmVyUmVxIDEyCisjZGVmaW5lIHN6X3hDaGFuZ2VIb3N0c1JlcSA4CisjZGVmaW5lIHN6X3hMaXN0SG9zdHNSZXEgNAorI2RlZmluZSBzel94Q2hhbmdlTW9kZVJlcSA0CisjZGVmaW5lIHN6X3hSb3RhdGVQcm9wZXJ0aWVzUmVxIDEyCisjZGVmaW5lIHN6X3hSZXBseSAzMgorI2RlZmluZSBzel94R3JhYktleWJvYXJkUmVwbHkgMzIKKyNkZWZpbmUgc3pfeExpc3RGb250c1dpdGhJbmZvUmVwbHkgNjAKKyNkZWZpbmUgc3pfeFNldFBvaW50ZXJNYXBwaW5nUmVwbHkgMzIKKyNkZWZpbmUgc3pfeEdldEtleWJvYXJkTWFwcGluZ1JlcGx5IDMyCisjZGVmaW5lIHN6X3hHZXRQb2ludGVyTWFwcGluZ1JlcGx5IDMyCisjZGVmaW5lIHN6X3hHZXRNb2RpZmllck1hcHBpbmdSZXBseSAzMgorI2RlZmluZSBzel94TGlzdEZvbnRzV2l0aEluZm9SZXEgOAorI2RlZmluZSBzel94UG9seUxpbmVSZXEgMTIKKyNkZWZpbmUgc3pfeFBvbHlBcmNSZXEgMTIKKyNkZWZpbmUgc3pfeFBvbHlSZWN0YW5nbGVSZXEgMTIKKyNkZWZpbmUgc3pfeFBvbHlGaWxsUmVjdGFuZ2xlUmVxIDEyCisjZGVmaW5lIHN6X3hQb2x5RmlsbEFyY1JlcSAxMgorI2RlZmluZSBzel94UG9seVRleHQ4UmVxIDE2CisjZGVmaW5lIHN6X3hQb2x5VGV4dDE2UmVxIDE2CisjZGVmaW5lIHN6X3hJbWFnZVRleHQ4UmVxIDE2CisjZGVmaW5lIHN6X3hJbWFnZVRleHQxNlJlcSAxNgorI2RlZmluZSBzel94U2V0UG9pbnRlck1hcHBpbmdSZXEgNAorI2RlZmluZSBzel94Rm9yY2VTY3JlZW5TYXZlclJlcSA0CisjZGVmaW5lIHN6X3hTZXRDbG9zZURvd25Nb2RlUmVxIDQKKyNkZWZpbmUgc3pfeENsZWFyQXJlYVJlcSAxNgorI2RlZmluZSBzel94U2V0QWNjZXNzQ29udHJvbFJlcSA0CisjZGVmaW5lIHN6X3hHZXRLZXlib2FyZE1hcHBpbmdSZXEgOAorI2RlZmluZSBzel94U2V0TW9kaWZpZXJNYXBwaW5nUmVxIDQKKyNkZWZpbmUgc3pfeFByb3BJY29uU2l6ZSAyNAorI2RlZmluZSBzel94Q2hhbmdlS2V5Ym9hcmRNYXBwaW5nUmVxIDgKKworCisvKiBGb3IgdGhlIHB1cnBvc2Ugb2YgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBpbiB0aGlzIGZpbGUsCit3ZSBtdXN0IHJlZGVmaW5lIHRoZSBmb2xsb3dpbmcgdHlwZXMgaW4gdGVybXMgb2YgWG1kLmgncyB0eXBlcywgd2hpY2ggbWF5CitpbmNsdWRlIGJpdCBmaWVsZHMuICBBbGwgb2YgdGhlc2UgYXJlICN1bmRlZidkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLAorcmVzdG9yaW5nIHRoZSBkZWZpbml0aW9ucyBpbiBYLmguICAqLworCisjZGVmaW5lIFdpbmRvdyBDQVJEMzIKKyNkZWZpbmUgRHJhd2FibGUgQ0FSRDMyCisjZGVmaW5lIEZvbnQgQ0FSRDMyCisjZGVmaW5lIFBpeG1hcCBDQVJEMzIKKyNkZWZpbmUgQ3Vyc29yIENBUkQzMgorI2RlZmluZSBDb2xvcm1hcCBDQVJEMzIKKyNkZWZpbmUgR0NvbnRleHQgQ0FSRDMyCisjZGVmaW5lIEF0b20gQ0FSRDMyCisjZGVmaW5lIFZpc3VhbElEIENBUkQzMgorI2RlZmluZSBUaW1lIENBUkQzMgorI2RlZmluZSBLZXlDb2RlIENBUkQ4CisjZGVmaW5lIEtleVN5bSBDQVJEMzIKKworI2RlZmluZSBYX1RDUF9QT1JUIDYwMDAgICAgIC8qIGFkZCBkaXNwbGF5IG51bWJlciAqLworCisjZGVmaW5lIHhUcnVlICAgICAgICAxCisjZGVmaW5lIHhGYWxzZSAgICAgICAwCisKKwordHlwZWRlZiBDQVJEMTYgS2V5QnV0TWFzazsKKworLyoqKioqKioqKioqKioqKioqIAorICAgY29ubmVjdGlvbiBzZXR1cCBzdHJ1Y3R1cmUuICBUaGlzIGlzIGZvbGxvd2VkIGJ5CisgICBudW1Sb290cyB4V2luZG93Um9vdCBzdHJ1Y3RzLgorKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlieXRlT3JkZXI7CisgICAgQllURQlwYWQ7CisgICAgQ0FSRDE2CW1ham9yVmVyc2lvbiBCMTYsIG1pbm9yVmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2CW5ieXRlc0F1dGhQcm90byBCMTY7CS8qIEF1dGhvcml6YXRpb24gcHJvdG9jb2wgKi8KKyAgICBDQVJEMTYJbmJ5dGVzQXV0aFN0cmluZyBCMTY7CS8qIEF1dGhvcml6YXRpb24gc3RyaW5nICovCisgICAgQ0FSRDE2CXBhZDIgQjE2OworfSB4Q29ubkNsaWVudFByZWZpeDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgICAgICAgIHN1Y2Nlc3M7CisgICAgQllURSAgICAgICAgICAgbGVuZ3RoUmVhc29uOyAvKm51bSBieXRlcyBpbiBzdHJpbmcgZm9sbG93aW5nIGlmIGZhaWx1cmUgKi8KKyAgICBDQVJEMTYgICAgICAgICBtYWpvclZlcnNpb24gQjE2LCAKKyAgICAgICAgICAgICAgICAgICBtaW5vclZlcnNpb24gQjE2OworICAgIENBUkQxNiAgICAgICAgIGxlbmd0aCBCMTY7ICAvKiAxLzQgYWRkaXRpb25hbCBieXRlcyBpbiBzZXR1cCBpbmZvICovCit9IHhDb25uU2V0dXBQcmVmaXg7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQzMiAgICAgICAgIHJlbGVhc2UgQjMyOworICAgIENBUkQzMiAgICAgICAgIHJpZEJhc2UgQjMyLCAKKyAgICAgICAgICAgICAgICAgICByaWRNYXNrIEIzMjsKKyAgICBDQVJEMzIgICAgICAgICBtb3Rpb25CdWZmZXJTaXplIEIzMjsKKyAgICBDQVJEMTYgICAgICAgICBuYnl0ZXNWZW5kb3IgQjE2OyAgLyogbnVtYmVyIG9mIGJ5dGVzIGluIHZlbmRvciBzdHJpbmcgKi8KKyAgICBDQVJEMTYgICAgICAgICBtYXhSZXF1ZXN0U2l6ZSBCMTY7CisgICAgQ0FSRDggICAgICAgICAgbnVtUm9vdHM7ICAgICAgICAgIC8qIG51bWJlciBvZiByb290cyBzdHJ1Y3RzIHRvIGZvbGxvdyAqLworICAgIENBUkQ4ICAgICAgICAgIG51bUZvcm1hdHM7ICAgICAgICAvKiBudW1iZXIgb2YgcGl4bWFwIGZvcm1hdHMgKi8KKyAgICBDQVJEOCAgICAgICAgICBpbWFnZUJ5dGVPcmRlcjsgICAgICAgIC8qIExTQkZpcnN0LCBNU0JGaXJzdCAqLworICAgIENBUkQ4ICAgICAgICAgIGJpdG1hcEJpdE9yZGVyOyAgICAgICAgLyogTGVhc3RTaWduaWZpY2FudCwgTW9zdFNpZ24uLi4qLworICAgIENBUkQ4ICAgICAgICAgIGJpdG1hcFNjYW5saW5lVW5pdCwgICAgIC8qIDgsIDE2LCAzMiAqLworICAgICAgICAgICAgICAgICAgIGJpdG1hcFNjYW5saW5lUGFkOyAgICAgLyogOCwgMTYsIDMyICovCisgICAgS2V5Q29kZQkgICBtaW5LZXlDb2RlLCBtYXhLZXlDb2RlOworICAgIENBUkQzMgkgICBwYWQyIEIzMjsKK30geENvbm5TZXR1cDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgICAgICAgIGRlcHRoOworICAgIENBUkQ4ICAgICAgICAgIGJpdHNQZXJQaXhlbDsKKyAgICBDQVJEOCAgICAgICAgICBzY2FuTGluZVBhZDsKKyAgICBDQVJEOCAgICAgICAgICBwYWQxOworICAgIENBUkQzMgkgICBwYWQyIEIzMjsKK30geFBpeG1hcEZvcm1hdDsKKworLyogd2luZG93IHJvb3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IAlkZXB0aDsKKyAgICBDQVJEOCAJcGFkMTsKKyAgICBDQVJEMTYJblZpc3VhbHMgQjE2OyAgLyogbnVtYmVyIG9mIHhWaXN1YWxUeXBlIHN0cnVjdHVyZXMgZm9sbG93aW5nICovCisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIH0geERlcHRoOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVmlzdWFsSUQgdmlzdWFsSUQgQjMyOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOCBjX2NsYXNzOworI2Vsc2UKKyAgICBDQVJEOCBjbGFzczsKKyNlbmRpZgorICAgIENBUkQ4IGJpdHNQZXJSR0I7CisgICAgQ0FSRDE2IGNvbG9ybWFwRW50cmllcyBCMTY7CisgICAgQ0FSRDMyIHJlZE1hc2sgQjMyLCBncmVlbk1hc2sgQjMyLCBibHVlTWFzayBCMzI7CisgICAgQ0FSRDMyIHBhZCBCMzI7CisgICAgfSB4VmlzdWFsVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFdpbmRvdyAgICAgICAgIHdpbmRvd0lkIEIzMjsKKyAgICBDb2xvcm1hcCAgICAgICBkZWZhdWx0Q29sb3JtYXAgQjMyOworICAgIENBUkQzMiAgICAgICAgIHdoaXRlUGl4ZWwgQjMyLCBibGFja1BpeGVsIEIzMjsKKyAgICBDQVJEMzIgICAgICAgICBjdXJyZW50SW5wdXRNYXNrIEIzMjsgICAKKyAgICBDQVJEMTYgICAgICAgICBwaXhXaWR0aCBCMTYsIHBpeEhlaWdodCBCMTY7CisgICAgQ0FSRDE2ICAgICAgICAgbW1XaWR0aCBCMTYsIG1tSGVpZ2h0IEIxNjsKKyAgICBDQVJEMTYgICAgICAgICBtaW5JbnN0YWxsZWRNYXBzIEIxNiwgbWF4SW5zdGFsbGVkTWFwcyBCMTY7CisgICAgVmlzdWFsSUQgICAgICAgcm9vdFZpc3VhbElEIEIzMjsKKyAgICBDQVJEOCAgICAgICAgICBiYWNraW5nU3RvcmU7CisgICAgQk9PTCAgICAgICAgICAgc2F2ZVVuZGVyczsKKyAgICBDQVJEOCAgICAgICAgICByb290RGVwdGg7CisgICAgQ0FSRDggICAgICAgICAgbkRlcHRoczsgIC8qIG51bWJlciBvZiB4RGVwdGggc3RydWN0dXJlcyBmb2xsb3dpbmcgKi8KK30geFdpbmRvd1Jvb3Q7CisMCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3RydWN0dXJlIERlZm5zCisgKiAgIFN0cnVjdHVyZXMgbmVlZGVkIGZvciByZXBsaWVzIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBVc2VkIGluIEdldE1vdGlvbkV2ZW50cyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDMyIHRpbWUgQjMyOworICAgIElOVDE2IHggQjE2LCB5IEIxNjsKK30geFRpbWVjb29yZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IGZhbWlseTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKK30geEhvc3RFbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIElOVDE2IGxlZnRTaWRlQmVhcmluZyBCMTYsCisJICByaWdodFNpZGVCZWFyaW5nIEIxNiwKKwkgIGNoYXJhY3RlcldpZHRoIEIxNiwKKwkgIGFzY2VudCBCMTYsCisJICBkZXNjZW50IEIxNjsKKyAgICBDQVJEMTYgYXR0cmlidXRlcyBCMTY7Cit9IHhDaGFySW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEF0b20gbmFtZSBCMzI7CisgICAgQ0FSRDMyIHZhbHVlIEIzMjsKK30geEZvbnRQcm9wOworCisvKgorICogbm9uLWFsaWduZWQgYmlnLWVuZGlhbiBmb250IElEIGZvbGxvd3MgdGhpcyBzdHJ1Y3QKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgLyogZm9sbG93ZWQgYnkgc3RyaW5nICovCisgICAgQ0FSRDggbGVuOwkvKiBudW1iZXIgb2YgKmNoYXJhY3RlcnMqIGluIHN0cmluZywgb3IgRm9udENoYW5nZSAoMjU1KQorCQkgICBmb3IgZm9udCBjaGFuZ2UsIG9yIDAgaWYganVzdCBkZWx0YSBnaXZlbiAqLworICAgIElOVDggZGVsdGE7Cit9IHhUZXh0RWx0OworCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgIAorICAgIENBUkQzMiBwaXhlbCBCMzI7CisgICAgQ0FSRDE2IHJlZCBCMTYsIGdyZWVuIEIxNiwgYmx1ZSBCMTY7CisgICAgQ0FSRDggZmxhZ3M7ICAvKiBEb1JlZCwgRG9HcmVlbiwgRG9CbHVlIGJvb2xlYW5zICovCisgICAgQ0FSRDggcGFkOworfSB4Q29sb3JJdGVtOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEMTYgcmVkIEIxNiwgZ3JlZW4gQjE2LCBibHVlIEIxNiwgcGFkIEIxNjsKK30geHJnYjsKKwordHlwZWRlZiBDQVJEOCBLRVlDT0RFOworDAorCisvKioqKioqKioqKioqKioqKioKKyAqIFhSZXA6CisgKiAgICBtZWFudCB0byBiZSAzMiBieXRlIHF1YW50aXR5IAorICoqKioqKioqKioqKioqKioqLworCisvKiBHZW5lcmljUmVwbHkgaXMgdGhlIGNvbW1vbiBmb3JtYXQgb2YgYWxsIHJlcGxpZXMuICBUaGUgImRhdGEiIGl0ZW1zCisgICBhcmUgc3BlY2lmaWMgdG8gZWFjaCBpbmRpdmlkdWFsIHJlcGx5IHR5cGUuICovCisKK3R5cGVkZWYgc3RydWN0IHsJCisgICAgQllURSB0eXBlOyAgICAgICAgICAgICAgLyogWF9SZXBseSAqLworICAgIEJZVEUgZGF0YTE7ICAgICAgICAgICAgIC8qIGRlcGVuZHMgb24gcmVwbHkgdHlwZSAqLworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7ICAvKiBvZiBsYXN0IHJlcXVlc3QgcmVjZWl2ZWQgYnkgc2VydmVyICovCisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7ICAgICAgLyogNCBieXRlIHF1YW50aXRpZXMgYmV5b25kIHNpemUgb2YgR2VuZXJpY1JlcGx5ICovCisgICAgQ0FSRDMyIGRhdGEwMCBCMzI7CisgICAgQ0FSRDMyIGRhdGEwMSBCMzI7CisgICAgQ0FSRDMyIGRhdGEwMiBCMzI7CisgICAgQ0FSRDMyIGRhdGEwMyBCMzI7CisgICAgQ0FSRDMyIGRhdGEwNCBCMzI7CisgICAgQ0FSRDMyIGRhdGEwNSBCMzI7CisgICAgfSB4R2VuZXJpY1JlcGx5OworCisvKiBJbmRpdmlkdWFsIHJlcGx5IGZvcm1hdHMuICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQ0FSRDggYmFja2luZ1N0b3JlOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CS8qIE5PVCAwOyB0aGlzIGlzIGFuIGV4dHJhLWxhcmdlIHJlcGx5ICovCisgICAgVmlzdWFsSUQgdmlzdWFsSUQgQjMyOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEMTYgY19jbGFzcyBCMTY7CisjZWxzZQorICAgIENBUkQxNiBjbGFzcyBCMTY7CisjZW5kaWYKKyAgICBDQVJEOCBiaXRHcmF2aXR5OworICAgIENBUkQ4IHdpbkdyYXZpdHk7CisgICAgQ0FSRDMyIGJhY2tpbmdCaXRQbGFuZXMgQjMyOworICAgIENBUkQzMiBiYWNraW5nUGl4ZWwgQjMyOworICAgIEJPT0wgc2F2ZVVuZGVyOworICAgIEJPT0wgbWFwSW5zdGFsbGVkOworICAgIENBUkQ4IG1hcFN0YXRlOworICAgIEJPT0wgb3ZlcnJpZGU7CisgICAgQ29sb3JtYXAgY29sb3JtYXAgQjMyOworICAgIENBUkQzMiBhbGxFdmVudE1hc2tzIEIzMjsKKyAgICBDQVJEMzIgeW91ckV2ZW50TWFzayBCMzI7CisgICAgQ0FSRDE2IGRvTm90UHJvcGFnYXRlTWFzayBCMTY7CisgICAgQ0FSRDE2IHBhZCBCMTY7CisgICAgfSB4R2V0V2luZG93QXR0cmlidXRlc1JlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgIC8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOCBkZXB0aDsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOyAgLyogMCAqLworICAgIFdpbmRvdyByb290IEIzMjsKKyAgICBJTlQxNiB4IEIxNiwgeSBCMTY7CisgICAgQ0FSRDE2IHdpZHRoIEIxNiwgaGVpZ2h0IEIxNjsKKyAgICBDQVJEMTYgYm9yZGVyV2lkdGggQjE2OworICAgIENBUkQxNiBwYWQxIEIxNjsKKyAgICBDQVJEMzIgcGFkMiBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIH0geEdldEdlb21ldHJ5UmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CisgICAgV2luZG93IHJvb3QgQjMyLCBwYXJlbnQgQjMyOworICAgIENBUkQxNiBuQ2hpbGRyZW4gQjE2OworICAgIENBUkQxNiBwYWQyIEIxNjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICB9IHhRdWVyeVRyZWVSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgLyogMCAqLworICAgIEF0b20gYXRvbSBCMzI7CisgICAgQ0FSRDMyIHBhZDIgQjMyOworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIENBUkQzMiBwYWQ2IEIzMjsKKyAgICB9IHhJbnRlcm5BdG9tUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7ICAvKiBvZiBhZGRpdGlvbmFsIGJ5dGVzICovCisgICAgQ0FSRDE2IG5hbWVMZW5ndGggQjE2OyAgLyogIyBvZiBjaGFyYWN0ZXJzIGluIG5hbWUgKi8KKyAgICBDQVJEMTYgcGFkMiBCMTY7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIENBUkQzMiBwYWQ3IEIzMjsKKyAgICB9IHhHZXRBdG9tTmFtZVJlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIENBUkQ4IGZvcm1hdDsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOyAvKiBvZiBhZGRpdGlvbmFsIGJ5dGVzICovCisgICAgQXRvbSBwcm9wZXJ0eVR5cGUgQjMyOworICAgIENBUkQzMiBieXRlc0FmdGVyIEIzMjsKKyAgICBDQVJEMzIgbkl0ZW1zIEIzMjsgLyogIyBvZiA4LCAxNiwgb3IgMzItYml0IGVudGl0aWVzIGluIHJlcGx5ICovCisgICAgQ0FSRDMyIHBhZDEgQjMyOworICAgIENBUkQzMiBwYWQyIEIzMjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgfSB4R2V0UHJvcGVydHlSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYgblByb3BlcnRpZXMgQjE2OworICAgIENBUkQxNiBwYWQyIEIxNjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgQ0FSRDMyIHBhZDcgQjMyOworICAgIH0geExpc3RQcm9wZXJ0aWVzUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7ICAvKiAwICovCisgICAgV2luZG93IG93bmVyIEIzMjsKKyAgICBDQVJEMzIgcGFkMiBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIH0geEdldFNlbGVjdGlvbk93bmVyUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBzdGF0dXM7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIDAgKi8KKyAgICBDQVJEMzIgcGFkMSBCMzI7CisgICAgQ0FSRDMyIHBhZDIgQjMyOworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIENBUkQzMiBwYWQ2IEIzMjsKKyAgICB9IHhHcmFiUG9pbnRlclJlcGx5OworCit0eXBlZGVmIHhHcmFiUG9pbnRlclJlcGx5IHhHcmFiS2V5Ym9hcmRSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCT09MIHNhbWVTY3JlZW47CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIDAgKi8KKyAgICBXaW5kb3cgcm9vdCBCMzIsIGNoaWxkIEIzMjsKKyAgICBJTlQxNiByb290WCBCMTYsIHJvb3RZIEIxNiwgd2luWCBCMTYsIHdpblkgQjE2OworICAgIENBUkQxNiBtYXNrIEIxNjsKKyAgICBDQVJEMTYgcGFkMSBCMTY7CisgICAgQ0FSRDMyIHBhZCBCMzI7CisgICAgfSB4UXVlcnlQb2ludGVyUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CisgICAgQ0FSRDMyIG5FdmVudHMgQjMyOworICAgIENBUkQzMiBwYWQyIEIzMjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgfSB4R2V0TW90aW9uRXZlbnRzUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQk9PTCBzYW1lU2NyZWVuOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7IC8qIDAgKi8KKyAgICBXaW5kb3cgY2hpbGQgQjMyOworICAgIElOVDE2IGRzdFggQjE2LCBkc3RZIEIxNjsKKyAgICBDQVJEMzIgcGFkMiBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgfSB4VHJhbnNsYXRlQ29vcmRzUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQ0FSRDggcmV2ZXJ0VG87CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIDAgKi8KKyAgICBXaW5kb3cgZm9jdXMgQjMyOworICAgIENBUkQzMiBwYWQxIEIzMjsKKyAgICBDQVJEMzIgcGFkMiBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgfSB4R2V0SW5wdXRGb2N1c1JlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIEJZVEUgcGFkMTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOyAgLyogMiwgTk9UIDA7IHRoaXMgaXMgYW4gZXh0cmEtbGFyZ2UgcmVwbHkgKi8KKyAgICBCWVRFIG1hcFszMl07CisgICAgfSB4UXVlcnlLZXltYXBSZXBseTsKKworLyogV2FybmluZzogdGhpcyBNVVNUIG1hdGNoICh1cCB0byBjb21wb25lbnQgcmVuYW1pbmcpIHhMaXN0Rm9udHNXaXRoSW5mb1JlcGx5ICovCit0eXBlZGVmIHN0cnVjdCBfeFF1ZXJ5Rm9udFJlcGx5IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7ICAvKiBkZWZpbml0ZWx5ID4gMCwgZXZlbiBpZiAibkNoYXJJbmZvcyIgaXMgMCAqLworICAgIHhDaGFySW5mbyBtaW5Cb3VuZHM7IAorI2lmbmRlZiBXT1JENjQKKyAgICBDQVJEMzIgd2FsaWduMSBCMzI7CisjZW5kaWYKKyAgICB4Q2hhckluZm8gbWF4Qm91bmRzOyAKKyNpZm5kZWYgV09SRDY0CisgICAgQ0FSRDMyIHdhbGlnbjIgQjMyOworI2VuZGlmCisgICAgQ0FSRDE2IG1pbkNoYXJPckJ5dGUyIEIxNiwgbWF4Q2hhck9yQnl0ZTIgQjE2OworICAgIENBUkQxNiBkZWZhdWx0Q2hhciBCMTY7CisgICAgQ0FSRDE2IG5Gb250UHJvcHMgQjE2OyAgLyogZm9sbG93ZWQgYnkgdGhpcyBtYW55IHhGb250UHJvcCBzdHJ1Y3R1cmVzICovCisgICAgQ0FSRDggZHJhd0RpcmVjdGlvbjsKKyAgICBDQVJEOCBtaW5CeXRlMSwgbWF4Qnl0ZTE7CisgICAgQk9PTCBhbGxDaGFyc0V4aXN0OworICAgIElOVDE2IGZvbnRBc2NlbnQgQjE2LCBmb250RGVzY2VudCBCMTY7CisgICAgQ0FSRDMyIG5DaGFySW5mb3MgQjMyOyAvKiBmb2xsb3dlZCBieSB0aGlzIG1hbnkgeENoYXJJbmZvIHN0cnVjdHVyZXMgKi8KK30geFF1ZXJ5Rm9udFJlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIENBUkQ4IGRyYXdEaXJlY3Rpb247CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIDAgKi8KKyAgICBJTlQxNiBmb250QXNjZW50IEIxNiwgZm9udERlc2NlbnQgQjE2OworICAgIElOVDE2IG92ZXJhbGxBc2NlbnQgQjE2LCBvdmVyYWxsRGVzY2VudCBCMTY7CisgICAgSU5UMzIgb3ZlcmFsbFdpZHRoIEIzMiwgb3ZlcmFsbExlZnQgQjMyLCBvdmVyYWxsUmlnaHQgQjMyOworICAgIENBUkQzMiBwYWQgQjMyOworICAgIH0geFF1ZXJ5VGV4dEV4dGVudHNSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYgbkZvbnRzIEIxNjsKKyAgICBDQVJEMTYgcGFkMiBCMTY7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIENBUkQzMiBwYWQ3IEIzMjsKKyAgICB9IHhMaXN0Rm9udHNSZXBseTsKKworLyogV2FybmluZzogdGhpcyBNVVNUIG1hdGNoICh1cCB0byBjb21wb25lbnQgcmVuYW1pbmcpIHhRdWVyeUZvbnRSZXBseSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOCBuYW1lTGVuZ3RoOyAgLyogMCBpbmRpY2F0ZXMgZW5kLW9mLXJlcGx5LXNlcXVlbmNlICovCisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIGRlZmluaXRlbHkgPiAwLCBldmVuIGlmICJuYW1lTGVuZ3RoIiBpcyAwICovCisgICAgeENoYXJJbmZvIG1pbkJvdW5kczsgCisjaWZuZGVmIFdPUkQ2NAorICAgIENBUkQzMiB3YWxpZ24xIEIzMjsKKyNlbmRpZgorICAgIHhDaGFySW5mbyBtYXhCb3VuZHM7IAorI2lmbmRlZiBXT1JENjQKKyAgICBDQVJEMzIgd2FsaWduMiBCMzI7CisjZW5kaWYKKyAgICBDQVJEMTYgbWluQ2hhck9yQnl0ZTIgQjE2LCBtYXhDaGFyT3JCeXRlMiBCMTY7CisgICAgQ0FSRDE2IGRlZmF1bHRDaGFyIEIxNjsKKyAgICBDQVJEMTYgbkZvbnRQcm9wcyBCMTY7ICAvKiBmb2xsb3dlZCBieSB0aGlzIG1hbnkgeEZvbnRQcm9wIHN0cnVjdHVyZXMgKi8KKyAgICBDQVJEOCBkcmF3RGlyZWN0aW9uOworICAgIENBUkQ4IG1pbkJ5dGUxLCBtYXhCeXRlMTsKKyAgICBCT09MIGFsbENoYXJzRXhpc3Q7CisgICAgSU5UMTYgZm9udEFzY2VudCBCMTYsIGZvbnREZXNjZW50IEIxNjsKKyAgICBDQVJEMzIgblJlcGxpZXMgQjMyOyAgIC8qIGhpbnQgYXMgdG8gaG93IG1hbnkgbW9yZSByZXBsaWVzIG1pZ2h0IGJlIGNvbWluZyAqLworfSB4TGlzdEZvbnRzV2l0aEluZm9SZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYgblBhdGhzIEIxNjsKKyAgICBDQVJEMTYgcGFkMiBCMTY7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIENBUkQzMiBwYWQ3IEIzMjsKKyAgICB9IHhHZXRGb250UGF0aFJlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIENBUkQ4IGRlcHRoOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CisgICAgVmlzdWFsSUQgdmlzdWFsIEIzMjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgQ0FSRDMyIHBhZDcgQjMyOworICAgIH0geEdldEltYWdlUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CisgICAgQ0FSRDE2IG5Db2xvcm1hcHMgQjE2OworICAgIENBUkQxNiBwYWQyIEIxNjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgQ0FSRDMyIHBhZDcgQjMyOworICAgIH0geExpc3RJbnN0YWxsZWRDb2xvcm1hcHNSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgLyogWF9SZXBseSAqLworICAgIEJZVEUgcGFkMTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOyAgIC8qIDAgKi8KKyAgICBDQVJEMTYgcmVkIEIxNiwgZ3JlZW4gQjE2LCBibHVlIEIxNjsKKyAgICBDQVJEMTYgcGFkMiBCMTY7CisgICAgQ0FSRDMyIHBpeGVsIEIzMjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICB9IHhBbGxvY0NvbG9yUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7IC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIDAgKi8KKyAgICBDQVJEMzIgcGl4ZWwgQjMyOworICAgIENBUkQxNiBleGFjdFJlZCBCMTYsIGV4YWN0R3JlZW4gQjE2LCBleGFjdEJsdWUgQjE2OworICAgIENBUkQxNiBzY3JlZW5SZWQgQjE2LCBzY3JlZW5HcmVlbiBCMTYsIHNjcmVlbkJsdWUgQjE2OworICAgIENBUkQzMiBwYWQyIEIzMjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgfSB4QWxsb2NOYW1lZENvbG9yUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CisgICAgQ0FSRDE2IG5QaXhlbHMgQjE2LCBuTWFza3MgQjE2OworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIENBUkQzMiBwYWQ2IEIzMjsKKyAgICBDQVJEMzIgcGFkNyBCMzI7CisgICAgfSB4QWxsb2NDb2xvckNlbGxzUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7IC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYgblBpeGVscyBCMTY7CisgICAgQ0FSRDE2IHBhZDIgQjE2OworICAgIENBUkQzMiByZWRNYXNrIEIzMiwgZ3JlZW5NYXNrIEIzMiwgYmx1ZU1hc2sgQjMyOworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgfSB4QWxsb2NDb2xvclBsYW5lc1JlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CisgICAgQ0FSRDE2IG5Db2xvcnMgQjE2OworICAgIENBUkQxNiBwYWQyIEIxNjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgQ0FSRDMyIHBhZDcgQjMyOworICAgIH0geFF1ZXJ5Q29sb3JzUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7ICAvKiAwICovCisgICAgQ0FSRDE2IGV4YWN0UmVkIEIxNiwgZXhhY3RHcmVlbiBCMTYsIGV4YWN0Qmx1ZSBCMTY7CisgICAgQ0FSRDE2IHNjcmVlblJlZCBCMTYsIHNjcmVlbkdyZWVuIEIxNiwgc2NyZWVuQmx1ZSBCMTY7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgfSB4TG9va3VwQ29sb3JSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIDAgKi8KKyAgICBDQVJEMTYgd2lkdGggQjE2LCBoZWlnaHQgQjE2OworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIENBUkQzMiBwYWQ2IEIzMjsKKyAgICBDQVJEMzIgcGFkNyBCMzI7CisgICAgfSB4UXVlcnlCZXN0U2l6ZVJlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIEJZVEUgcGFkMTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOyAvKiAwICovCisgICAgQk9PTCAgcHJlc2VudDsKKyAgICBDQVJEOCBtYWpvcl9vcGNvZGU7CisgICAgQ0FSRDggZmlyc3RfZXZlbnQ7CisgICAgQ0FSRDggZmlyc3RfZXJyb3I7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIENBUkQzMiBwYWQ3IEIzMjsKKyAgICB9IHhRdWVyeUV4dGVuc2lvblJlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIENBUkQ4IG5FeHRlbnNpb25zOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CisgICAgQ0FSRDMyIHBhZDIgQjMyOworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIENBUkQzMiBwYWQ2IEIzMjsKKyAgICBDQVJEMzIgcGFkNyBCMzI7CisgICAgfSB4TGlzdEV4dGVuc2lvbnNSZXBseTsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSAgIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQ0FSRDggIHN1Y2Nlc3M7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIgcGFkMiBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIENBUkQzMiBwYWQ3IEIzMjsKKyAgICB9IHhTZXRNYXBwaW5nUmVwbHk7Cit0eXBlZGVmIHhTZXRNYXBwaW5nUmVwbHkgeFNldFBvaW50ZXJNYXBwaW5nUmVwbHk7Cit0eXBlZGVmIHhTZXRNYXBwaW5nUmVwbHkgeFNldE1vZGlmaWVyTWFwcGluZ1JlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIENBUkQ4IG5FbHRzOyAgLyogaG93IG1hbnkgZWxlbWVudHMgZG9lcyB0aGUgbWFwIGhhdmUgKi8KKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOworICAgIENBUkQzMiBwYWQyIEIzMjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgQ0FSRDMyIHBhZDcgQjMyOworICAgIH0geEdldFBvaW50ZXJNYXBwaW5nUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7CisgICAgQ0FSRDgga2V5U3ltc1BlcktleUNvZGU7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIgcGFkMiBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIENBUkQzMiBwYWQ3IEIzMjsKK30geEdldEtleWJvYXJkTWFwcGluZ1JlcGx5OyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsKKyAgICBDQVJEOCBudW1LZXlQZXJNb2RpZmllcjsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOworICAgIENBUkQzMiBwYWQxIEIzMjsKKyAgICBDQVJEMzIgcGFkMiBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworfSB4R2V0TW9kaWZpZXJNYXBwaW5nUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQk9PTCBnbG9iYWxBdXRvUmVwZWF0OworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7ICAvKiA1ICovCisgICAgQ0FSRDMyIGxlZE1hc2sgQjMyOworICAgIENBUkQ4IGtleUNsaWNrUGVyY2VudCwgYmVsbFBlcmNlbnQ7CisgICAgQ0FSRDE2IGJlbGxQaXRjaCBCMTYsIGJlbGxEdXJhdGlvbiBCMTY7CisgICAgQ0FSRDE2IHBhZCBCMTY7CisgICAgQllURSBtYXBbMzJdOyAgLyogYml0IG1hc2tzIHN0YXJ0IGhlcmUgKi8KKyAgICB9IHhHZXRLZXlib2FyZENvbnRyb2xSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIDAgKi8KKyAgICBDQVJEMTYgYWNjZWxOdW1lcmF0b3IgQjE2LCBhY2NlbERlbm9taW5hdG9yIEIxNjsKKyAgICBDQVJEMTYgdGhyZXNob2xkIEIxNjsKKyAgICBDQVJEMTYgcGFkMiBCMTY7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIH0geEdldFBvaW50ZXJDb250cm9sUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7ICAvKiAwICovCisgICAgQ0FSRDE2IHRpbWVvdXQgQjE2LCBpbnRlcnZhbCBCMTY7CisgICAgQk9PTCBwcmVmZXJCbGFua2luZzsKKyAgICBCT09MIGFsbG93RXhwb3N1cmVzOworICAgIENBUkQxNiBwYWQyIEIxNjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgfSB4R2V0U2NyZWVuU2F2ZXJSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCT09MIGVuYWJsZWQ7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYgbkhvc3RzIEIxNjsKKyAgICBDQVJEMTYgcGFkMSBCMTY7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIENBUkQzMiBwYWQ3IEIzMjsKKyAgICB9IHhMaXN0SG9zdHNSZXBseTsKKworDAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWGVycm9yCisgKiAgICBBbGwgZXJyb3JzICBhcmUgMzIgYnl0ZXMgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAgICAgICAgICAgICAgICAgLyogWF9FcnJvciAqLworICAgIEJZVEUgZXJyb3JDb2RlOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7ICAgICAgIC8qIHRoZSBudGggcmVxdWVzdCBmcm9tIHRoaXMgY2xpZW50ICovCisgICAgQ0FSRDMyIHJlc291cmNlSUQgQjMyOworICAgIENBUkQxNiBtaW5vckNvZGUgQjE2OworICAgIENBUkQ4IG1ham9yQ29kZTsKKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIENBUkQzMiBwYWQ3IEIzMjsKK30geEVycm9yOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHhFdmVudAorICogICAgQWxsIGV2ZW50cyBhcmUgMzIgYnl0ZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX3hFdmVudCB7CisgICAgdW5pb24geworCXN0cnVjdCB7CisJICAgIEJZVEUgdHlwZTsKKwkgICAgQllURSBkZXRhaWw7CisJICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisJICAgIH0gdTsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKwkgICAgVGltZSB0aW1lIEIzMjsKKwkgICAgV2luZG93IHJvb3QgQjMyLCBldmVudCBCMzIsIGNoaWxkIEIzMjsKKwkgICAgSU5UMTYgcm9vdFggQjE2LCByb290WSBCMTYsIGV2ZW50WCBCMTYsIGV2ZW50WSBCMTY7CisJICAgIEtleUJ1dE1hc2sgc3RhdGUgQjE2OworCSAgICBCT09MIHNhbWVTY3JlZW47CQkKKwkgICAgQllURSBwYWQxOworCX0ga2V5QnV0dG9uUG9pbnRlcjsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKyAgICAgICAgICAgIFRpbWUgdGltZSBCMzI7CisJICAgIFdpbmRvdyByb290IEIzMiwgZXZlbnQgQjMyLCBjaGlsZCBCMzI7CisJICAgIElOVDE2IHJvb3RYIEIxNiwgcm9vdFkgQjE2LCBldmVudFggQjE2LCBldmVudFkgQjE2OworCSAgICBLZXlCdXRNYXNrIHN0YXRlIEIxNjsKKwkgICAgQllURSBtb2RlOyAJCQkvKiByZWFsbHkgWE1vZGUgKi8KKwkgICAgQllURSBmbGFnczsJCS8qIHNhbWVTY3JlZW4gYW5kIGZvY3VzIGJvb2xlYW5zLCBwYWNrZWQgdG9nZXRoZXIgKi8KKyNkZWZpbmUgRUxGbGFnRm9jdXMgICAgICAgICgxPDwwKQorI2RlZmluZSBFTEZsYWdTYW1lU2NyZWVuICAgKDE8PDEpCisJfSBlbnRlckxlYXZlOworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworCSAgICBXaW5kb3cgd2luZG93IEIzMjsKKwkgICAgQllURSBtb2RlOyAJCQkvKiByZWFsbHkgWE1vZGUgKi8KKwkgICAgQllURSBwYWQxLCBwYWQyLCBwYWQzOworCX0gZm9jdXM7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIFdpbmRvdyB3aW5kb3cgQjMyOworCSAgICBDQVJEMTYgeCBCMTYsIHkgQjE2LCB3aWR0aCBCMTYsIGhlaWdodCBCMTY7CisJICAgIENBUkQxNiBjb3VudCBCMTY7CisJICAgIENBUkQxNiBwYWQyIEIxNjsKKwl9IGV4cG9zZTsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKwkgICAgRHJhd2FibGUgZHJhd2FibGUgQjMyOworCSAgICBDQVJEMTYgeCBCMTYsIHkgQjE2LCB3aWR0aCBCMTYsIGhlaWdodCBCMTY7CisJICAgIENBUkQxNiBtaW5vckV2ZW50IEIxNjsKKwkgICAgQ0FSRDE2IGNvdW50IEIxNjsKKwkgICAgQllURSBtYWpvckV2ZW50OworCSAgICBCWVRFIHBhZDEsIHBhZDIsIHBhZDM7CisJfSBncmFwaGljc0V4cG9zdXJlOworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworCSAgICBEcmF3YWJsZSBkcmF3YWJsZSBCMzI7CisJICAgIENBUkQxNiBtaW5vckV2ZW50IEIxNjsKKwkgICAgQllURSBtYWpvckV2ZW50OworCSAgICBCWVRFIGJwYWQ7CisJfSBub0V4cG9zdXJlOworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworCSAgICBXaW5kb3cgd2luZG93IEIzMjsKKwkgICAgQ0FSRDggc3RhdGU7CisJICAgIEJZVEUgcGFkMSwgcGFkMiwgcGFkMzsKKwl9IHZpc2liaWxpdHk7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIFdpbmRvdyBwYXJlbnQgQjMyLCB3aW5kb3cgQjMyOworCSAgICBJTlQxNiB4IEIxNiwgeSBCMTY7CisJICAgIENBUkQxNiB3aWR0aCBCMTYsIGhlaWdodCBCMTYsIGJvcmRlcldpZHRoIEIxNjsKKwkgICAgQk9PTCBvdmVycmlkZTsKKwkgICAgQllURSBicGFkOworICAgICAgICB9IGNyZWF0ZU5vdGlmeTsKKy8qCisgKiBUaGUgZXZlbnQgZmllbGRzIGluIHRoZSBzdHJ1Y3R1cmVzIGZvciBEZXN0cm95Tm90aWZ5LCBVbm1hcE5vdGlmeSwKKyAqIE1hcE5vdGlmeSwgUmVwYXJlbnROb3RpZnksIENvbmZpZ3VyZU5vdGlmeSwgQ2lyY3VsYXRlTm90aWZ5LCBHcmF2aXR5Tm90aWZ5LAorICogbXVzdCBiZSBhdCB0aGUgc2FtZSBvZmZzZXQgYmVjYXVzZSBzZXJ2ZXIgaW50ZXJuYWwgY29kZSBpcyBkZXBlbmRpbmcgdXBvbgorICogdGhpcyB0byBwYXRjaCB1cCB0aGUgZXZlbnRzIGJlZm9yZSB0aGV5IGFyZSBkZWxpdmVyZWQuCisgKiBBbHNvIG5vdGUgdGhhdCBNYXBSZXF1ZXN0LCBDb25maWd1cmVSZXF1ZXN0IGFuZCBDaXJjdWxhdGVSZXF1ZXN0IGhhdmUKKyAqIHRoZSBzYW1lIG9mZnNldCBmb3IgdGhlIGV2ZW50IHdpbmRvdy4KKyAqLworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworCSAgICBXaW5kb3cgZXZlbnQgQjMyLCB3aW5kb3cgQjMyOworCX0gZGVzdHJveU5vdGlmeTsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKwkgICAgV2luZG93IGV2ZW50IEIzMiwgd2luZG93IEIzMjsKKwkgICAgQk9PTCBmcm9tQ29uZmlndXJlOworCSAgICBCWVRFIHBhZDEsIHBhZDIsIHBhZDM7CisgICAgICAgIH0gdW5tYXBOb3RpZnk7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIFdpbmRvdyBldmVudCBCMzIsIHdpbmRvdyBCMzI7CisJICAgIEJPT0wgb3ZlcnJpZGU7CisJICAgIEJZVEUgcGFkMSwgcGFkMiwgcGFkMzsKKyAgICAgICAgfSBtYXBOb3RpZnk7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIFdpbmRvdyBwYXJlbnQgQjMyLCB3aW5kb3cgQjMyOworICAgICAgICB9IG1hcFJlcXVlc3Q7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIFdpbmRvdyBldmVudCBCMzIsIHdpbmRvdyBCMzIsIHBhcmVudCBCMzI7CisJICAgIElOVDE2IHggQjE2LCB5IEIxNjsKKwkgICAgQk9PTCBvdmVycmlkZTsKKwkgICAgQllURSBwYWQxLCBwYWQyLCBwYWQzOworCX0gcmVwYXJlbnQ7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIFdpbmRvdyBldmVudCBCMzIsIHdpbmRvdyBCMzIsIGFib3ZlU2libGluZyBCMzI7CisJICAgIElOVDE2IHggQjE2LCB5IEIxNjsKKwkgICAgQ0FSRDE2IHdpZHRoIEIxNiwgaGVpZ2h0IEIxNiwgYm9yZGVyV2lkdGggQjE2OworCSAgICBCT09MIG92ZXJyaWRlOwkJCisJICAgIEJZVEUgYnBhZDsKKwl9IGNvbmZpZ3VyZU5vdGlmeTsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKwkgICAgV2luZG93IHBhcmVudCBCMzIsIHdpbmRvdyBCMzIsIHNpYmxpbmcgQjMyOworCSAgICBJTlQxNiB4IEIxNiwgeSBCMTY7CisJICAgIENBUkQxNiB3aWR0aCBCMTYsIGhlaWdodCBCMTYsIGJvcmRlcldpZHRoIEIxNjsKKwkgICAgQ0FSRDE2IHZhbHVlTWFzayBCMTY7CisJICAgIENBUkQzMiBwYWQxIEIzMjsKKwl9IGNvbmZpZ3VyZVJlcXVlc3Q7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIFdpbmRvdyBldmVudCBCMzIsIHdpbmRvdyBCMzI7CisJICAgIElOVDE2IHggQjE2LCB5IEIxNjsKKwkgICAgQ0FSRDMyIHBhZDEgQjMyLCBwYWQyIEIzMiwgcGFkMyBCMzIsIHBhZDQgQjMyOworCX0gZ3Jhdml0eTsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKwkgICAgV2luZG93IHdpbmRvdyBCMzI7CisJICAgIENBUkQxNiB3aWR0aCBCMTYsIGhlaWdodCBCMTY7CisJfSByZXNpemVSZXF1ZXN0OworCXN0cnVjdCB7CisvKiBUaGUgZXZlbnQgZmllbGQgaW4gdGhlIGNpcmN1bGF0ZSByZWNvcmQgaXMgcmVhbGx5IHRoZSBwYXJlbnQgd2hlbiB0aGlzCisgICBpcyB1c2VkIGFzIGEgQ2lyY3VsYXRlUmVxdWVzdCBpbnN0ZWFkIG9mIGEgQ2lyY3VsYXRlTm90aWZ5ICovCisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworCSAgICBXaW5kb3cgZXZlbnQgQjMyLCB3aW5kb3cgQjMyLCBwYXJlbnQgQjMyOworCSAgICBCWVRFIHBsYWNlOwkJCS8qIFRvcCBvciBCb3R0b20gKi8KKwkgICAgQllURSBwYWQxLCBwYWQyLCBwYWQzOworCX0gY2lyY3VsYXRlOworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworCSAgICBXaW5kb3cgd2luZG93IEIzMjsKKwkgICAgQXRvbSBhdG9tIEIzMjsKKwkgICAgVGltZSB0aW1lIEIzMjsKKwkgICAgQllURSBzdGF0ZTsJCQkvKiBOZXdWYWx1ZSBvciBEZWxldGVkICovCisJICAgIEJZVEUgcGFkMTsKKwkgICAgQ0FSRDE2IHBhZDIgQjE2OworCX0gcHJvcGVydHk7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisgICAgICAgICAgICBUaW1lIHRpbWUgQjMyOyAgICAgCisJICAgIFdpbmRvdyB3aW5kb3cgQjMyOworCSAgICBBdG9tIGF0b20gQjMyOworCX0gc2VsZWN0aW9uQ2xlYXI7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisgICAgICAgICAgICBUaW1lIHRpbWUgQjMyOyAgICAKKwkgICAgV2luZG93IG93bmVyIEIzMiwgcmVxdWVzdG9yIEIzMjsKKwkgICAgQXRvbSBzZWxlY3Rpb24gQjMyLCB0YXJnZXQgQjMyLCBwcm9wZXJ0eSBCMzI7CisJfSBzZWxlY3Rpb25SZXF1ZXN0OworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworICAgICAgICAgICAgVGltZSB0aW1lIEIzMjsgICAKKwkgICAgV2luZG93IHJlcXVlc3RvciBCMzI7CisJICAgIEF0b20gc2VsZWN0aW9uIEIzMiwgdGFyZ2V0IEIzMiwgcHJvcGVydHkgQjMyOworCX0gc2VsZWN0aW9uTm90aWZ5OworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworCSAgICBXaW5kb3cgd2luZG93IEIzMjsKKwkgICAgQ29sb3JtYXAgY29sb3JtYXAgQjMyOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKwkgICAgQk9PTCBjX25ldzsKKyNlbHNlCisJICAgIEJPT0wgbmV3OworI2VuZGlmCisJICAgIEJZVEUgc3RhdGU7CQkJLyogSW5zdGFsbGVkIG9yIFVuSW5zdGFsbGVkICovCisJICAgIEJZVEUgcGFkMSwgcGFkMjsKKwl9IGNvbG9ybWFwOworCXN0cnVjdCB7CisJICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIENBUkQ4IHJlcXVlc3Q7CisJICAgIEtleUNvZGUgZmlyc3RLZXlDb2RlOworCSAgICBDQVJEOCBjb3VudDsKKwkgICAgQllURSBwYWQxOworCX0gbWFwcGluZ05vdGlmeTsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKwkgICAgV2luZG93IHdpbmRvdyBCMzI7CisJICAgIHVuaW9uIHsKKwkJc3RydWN0IHsKKwkJICAgIEF0b20gdHlwZSBCMzI7CisJCSAgICBJTlQzMiBsb25nczAgQjMyOworCQkgICAgSU5UMzIgbG9uZ3MxIEIzMjsKKwkJICAgIElOVDMyIGxvbmdzMiBCMzI7CisJCSAgICBJTlQzMiBsb25nczMgQjMyOworCQkgICAgSU5UMzIgbG9uZ3M0IEIzMjsKKwkJfSBsOworCQlzdHJ1Y3QgeworCQkgICAgQXRvbSB0eXBlIEIzMjsKKwkJICAgIElOVDE2IHNob3J0czAgQjE2OworCQkgICAgSU5UMTYgc2hvcnRzMSBCMTY7CisJCSAgICBJTlQxNiBzaG9ydHMyIEIxNjsKKwkJICAgIElOVDE2IHNob3J0czMgQjE2OworCQkgICAgSU5UMTYgc2hvcnRzNCBCMTY7CisJCSAgICBJTlQxNiBzaG9ydHM1IEIxNjsKKwkJICAgIElOVDE2IHNob3J0czYgQjE2OworCQkgICAgSU5UMTYgc2hvcnRzNyBCMTY7CisJCSAgICBJTlQxNiBzaG9ydHM4IEIxNjsKKwkJICAgIElOVDE2IHNob3J0czkgQjE2OworCQl9IHM7CisJCXN0cnVjdCB7CisJCSAgICBBdG9tIHR5cGUgQjMyOworCQkgICAgSU5UOCBieXRlc1syMF07CisJCX0gYjsKKwkgICAgfSB1OyAKKwl9IGNsaWVudE1lc3NhZ2U7CisgICAgfSB1OworfSB4RXZlbnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZW5lcmljIGV2ZW50CisgKiAKKyAqIFRob3NlIGV2ZW50cyBhcmUgbm90IHBhcnQgb2YgdGhlIGNvcmUgcHJvdG9jb2wgc3BlYyBhbmQgY2FuIGJlIHVzZWQgYnkKKyAqIHZhcmlvdXMgZXh0ZW5zaW9ucy4KKyAqIHR5cGUgaXMgYWx3YXlzIEdlbmVyaWNFdmVudAorICogZXh0ZW5zaW9uIGlzIHRoZSBtaW5vciBvcGNvZGUgb2YgdGhlIGV4dGVuc2lvbiB0aGUgZXZlbnQgYmVsb25ncyB0by4KKyAqIGV2dHlwZSBpcyB0aGUgYWN0dWFsIGV2ZW50IHR5cGUsIHVuaXF1ZSBfX3BlciBleHRlbnNpb25fXy4gCisgKgorICogR2VuZXJpY0V2ZW50cyBjYW4gYmUgbG9uZ2VyIHRoYW4gMzIgYnl0ZXMsIHdpdGggdGhlIGxlbmd0aCBmaWVsZAorICogc3BlY2lmeWluZyB0aGUgbnVtYmVyIG9mIDQgYnl0ZSBibG9ja3MgYWZ0ZXIgdGhlIGZpcnN0IDMyIGJ5dGVzLiAKKyAqCisgKgorICovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgICBCWVRFICAgIHR5cGU7CisgICAgQ0FSRDggICBleHRlbnNpb247CisgICAgQ0FSRDE2ICBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyICBsZW5ndGggQjMyOworICAgIENBUkQxNiAgZXZ0eXBlIEIxNjsKKyAgICBDQVJEMTYgIHBhZDIgQjE2OworICAgIENBUkQzMiAgcGFkMyBCMzI7CisgICAgQ0FSRDMyICBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgIHBhZDUgQjMyOworICAgIENBUkQzMiAgcGFkNiBCMzI7CisgICAgQ0FSRDMyICBwYWQ3IEIzMjsKK30geEdlbmVyaWNFdmVudDsKKworCisKKy8qIEtleW1hcE5vdGlmeSBldmVudHMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgYWJvdmUgdW5pb24gYmVjYXVzZSB0aGV5CisgICBhcmUgZGlmZmVyZW50IGZyb20gYWxsIG90aGVyIGV2ZW50czogdGhleSBkbyBub3QgaGF2ZSBhICJkZXRhaWwiCisgICBvciAic2VxdWVuY2VOdW1iZXIiLCBzbyB0aGVyZSBpcyByb29tIGZvciBhIDI0OC1iaXQga2V5IG1hc2suICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7CisgICAgQllURSBtYXBbMzFdOworICAgIH0geEtleW1hcEV2ZW50OworCisjZGVmaW5lIFhFdmVudFNpemUgKHNpemVvZih4RXZlbnQpKQorCisvKiBYUmVwbHkgaXMgdGhlIHVuaW9uIG9mIGFsbCB0aGUgcmVwbGllcyBhYm92ZSB3aG9zZSAiZml4ZWQgcGFydCIKK2ZpdHMgaW4gMzIgYnl0ZXMuICBJdCBkb2VzIE5PVCBpbmNsdWRlIEdldFdpbmRvd0F0dHJpYnV0ZXNSZXBseSwKK1F1ZXJ5Rm9udFJlcGx5LCBRdWVyeUtleW1hcFJlcGx5LCBvciBHZXRLZXlib2FyZENvbnRyb2xSZXBseSAKK0xpc3RGb250c1dpdGhJbmZvUmVwbHkgKi8KKwordHlwZWRlZiB1bmlvbiB7CisgICAgeEdlbmVyaWNSZXBseSBnZW5lcmljOworICAgIHhHZXRHZW9tZXRyeVJlcGx5IGdlb207CisgICAgeFF1ZXJ5VHJlZVJlcGx5IHRyZWU7CisgICAgeEludGVybkF0b21SZXBseSBhdG9tOworICAgIHhHZXRBdG9tTmFtZVJlcGx5IGF0b21OYW1lOworICAgIHhHZXRQcm9wZXJ0eVJlcGx5IHByb3BlcnR5OworICAgIHhMaXN0UHJvcGVydGllc1JlcGx5IGxpc3RQcm9wZXJ0aWVzOworICAgIHhHZXRTZWxlY3Rpb25Pd25lclJlcGx5IHNlbGVjdGlvbjsKKyAgICB4R3JhYlBvaW50ZXJSZXBseSBncmFiUG9pbnRlcjsKKyAgICB4R3JhYktleWJvYXJkUmVwbHkgZ3JhYktleWJvYXJkOworICAgIHhRdWVyeVBvaW50ZXJSZXBseSBwb2ludGVyOworICAgIHhHZXRNb3Rpb25FdmVudHNSZXBseSBtb3Rpb25FdmVudHM7CisgICAgeFRyYW5zbGF0ZUNvb3Jkc1JlcGx5IGNvb3JkczsKKyAgICB4R2V0SW5wdXRGb2N1c1JlcGx5IGlucHV0Rm9jdXM7CisgICAgeFF1ZXJ5VGV4dEV4dGVudHNSZXBseSB0ZXh0RXh0ZW50czsKKyAgICB4TGlzdEZvbnRzUmVwbHkgZm9udHM7CisgICAgeEdldEZvbnRQYXRoUmVwbHkgZm9udFBhdGg7CisgICAgeEdldEltYWdlUmVwbHkgaW1hZ2U7CisgICAgeExpc3RJbnN0YWxsZWRDb2xvcm1hcHNSZXBseSBjb2xvcm1hcHM7CisgICAgeEFsbG9jQ29sb3JSZXBseSBhbGxvY0NvbG9yOworICAgIHhBbGxvY05hbWVkQ29sb3JSZXBseSBhbGxvY05hbWVkQ29sb3I7CisgICAgeEFsbG9jQ29sb3JDZWxsc1JlcGx5IGNvbG9yQ2VsbHM7CisgICAgeEFsbG9jQ29sb3JQbGFuZXNSZXBseSBjb2xvclBsYW5lczsKKyAgICB4UXVlcnlDb2xvcnNSZXBseSBjb2xvcnM7CisgICAgeExvb2t1cENvbG9yUmVwbHkgbG9va3VwQ29sb3I7CisgICAgeFF1ZXJ5QmVzdFNpemVSZXBseSBiZXN0U2l6ZTsKKyAgICB4UXVlcnlFeHRlbnNpb25SZXBseSBleHRlbnNpb247CisgICAgeExpc3RFeHRlbnNpb25zUmVwbHkgZXh0ZW5zaW9uczsKKyAgICB4U2V0TW9kaWZpZXJNYXBwaW5nUmVwbHkgc2V0TW9kaWZpZXJNYXBwaW5nOworICAgIHhHZXRNb2RpZmllck1hcHBpbmdSZXBseSBnZXRNb2RpZmllck1hcHBpbmc7CisgICAgeFNldFBvaW50ZXJNYXBwaW5nUmVwbHkgc2V0UG9pbnRlck1hcHBpbmc7CisgICAgeEdldEtleWJvYXJkTWFwcGluZ1JlcGx5IGdldEtleWJvYXJkTWFwcGluZzsKKyAgICB4R2V0UG9pbnRlck1hcHBpbmdSZXBseSBnZXRQb2ludGVyTWFwcGluZzsKKyAgICB4R2V0UG9pbnRlckNvbnRyb2xSZXBseSBwb2ludGVyQ29udHJvbDsKKyAgICB4R2V0U2NyZWVuU2F2ZXJSZXBseSBzY3JlZW5TYXZlcjsKKyAgICB4TGlzdEhvc3RzUmVwbHkgaG9zdHM7CisgICAgeEVycm9yIGVycm9yOworICAgIHhFdmVudCBldmVudDsKK30geFJlcGx5OworCisMCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUkVRVUVTVFMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBSZXF1ZXN0IHN0cnVjdHVyZSAqLworCit0eXBlZGVmIHN0cnVjdCBfeFJlcSB7CisJQ0FSRDggcmVxVHlwZTsKKwlDQVJEOCBkYXRhOyAgICAgICAgICAgIC8qIG1lYW5pbmcgZGVwZW5kcyBvbiByZXF1ZXN0IHR5cGUgKi8KKwlDQVJEMTYgbGVuZ3RoIEIxNjsgICAgICAgICAvKiBsZW5ndGggaW4gNCBieXRlcyBxdWFudGl0aWVzIAorCQkJCSAgb2Ygd2hvbGUgcmVxdWVzdCwgaW5jbHVkaW5nIHRoaXMgaGVhZGVyICovCit9IHhSZXE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIHN0cnVjdHVyZXMgdGhhdCBmb2xsb3cgcmVxdWVzdC4gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFJlc291cmNlUmVxIGlzIHVzZWQgZm9yIGFueSByZXF1ZXN0IHdoaWNoIGhhcyBhIHJlc291cmNlIElEIAorICAgKG9yIEF0b20gb3IgVGltZSkgYXMgaXRzIG9uZSBhbmQgb25seSBhcmd1bWVudC4gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENBUkQzMiBpZCBCMzI7ICAvKiBhIFdpbmRvdywgRHJhd2FibGUsIEZvbnQsIEdDb250ZXh0LCBQaXhtYXAsIGV0Yy4gKi8KKyAgICB9IHhSZXNvdXJjZVJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQ0FSRDggZGVwdGg7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IHdpZCBCMzIsIHBhcmVudCBCMzI7CisgICAgSU5UMTYgeCBCMTYsIHkgQjE2OworICAgIENBUkQxNiB3aWR0aCBCMTYsIGhlaWdodCBCMTYsIGJvcmRlcldpZHRoIEIxNjsgIAorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEMTYgY19jbGFzcyBCMTY7CisjZWxzZQorICAgIENBUkQxNiBjbGFzcyBCMTY7CisjZW5kaWYKKyAgICBWaXN1YWxJRCB2aXN1YWwgQjMyOworICAgIENBUkQzMiBtYXNrIEIzMjsKK30geENyZWF0ZVdpbmRvd1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IHdpbmRvdyBCMzI7CisgICAgQ0FSRDMyIHZhbHVlTWFzayBCMzI7IAorfSB4Q2hhbmdlV2luZG93QXR0cmlidXRlc1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBtb2RlOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyB3aW5kb3cgQjMyOworfSB4Q2hhbmdlU2F2ZVNldFJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IHdpbmRvdyBCMzIsIHBhcmVudCBCMzI7CisgICAgSU5UMTYgeCBCMTYsIHkgQjE2OworfSB4UmVwYXJlbnRXaW5kb3dSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIENBUkQ4IHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgd2luZG93IEIzMjsKKyAgICBDQVJEMTYgbWFzayBCMTY7CisgICAgQ0FSRDE2IHBhZDIgQjE2OworfSB4Q29uZmlndXJlV2luZG93UmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBDQVJEOCBkaXJlY3Rpb247CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IHdpbmRvdyBCMzI7Cit9IHhDaXJjdWxhdGVXaW5kb3dSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsgICAgLyogZm9sbG93ZWQgYnkgcGFkZGVkIHN0cmluZyAqLworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQk9PTCBvbmx5SWZFeGlzdHM7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ0FSRDE2IG5ieXRlcyAgQjE2OyAgICAvKiBudW1iZXIgb2YgYnl0ZXMgaW4gc3RyaW5nICovCisgICAgQ0FSRDE2IHBhZCBCMTY7Cit9IHhJbnRlcm5BdG9tUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBDQVJEOCBtb2RlOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyB3aW5kb3cgQjMyOworICAgIEF0b20gcHJvcGVydHkgQjMyLCB0eXBlIEIzMjsKKyAgICBDQVJEOCBmb3JtYXQ7CisgICAgQllURSBwYWRbM107CisgICAgQ0FSRDMyIG5Vbml0cyBCMzI7ICAgICAvKiBsZW5ndGggb2Ygc3R1ZmYgZm9sbG93aW5nLCBkZXBlbmRzIG9uIGZvcm1hdCAqLworfSB4Q2hhbmdlUHJvcGVydHlSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyB3aW5kb3cgQjMyOworICAgIEF0b20gcHJvcGVydHkgQjMyOworfSB4RGVsZXRlUHJvcGVydHlSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBCT09MIGNfZGVsZXRlOworI2Vsc2UKKyAgICBCT09MIGRlbGV0ZTsKKyNlbmRpZgorICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyB3aW5kb3cgQjMyOworICAgIEF0b20gcHJvcGVydHkgQjMyLCB0eXBlIEIzMjsKKyAgICBDQVJEMzIgbG9uZ09mZnNldCBCMzI7CisgICAgQ0FSRDMyIGxvbmdMZW5ndGggQjMyOworfSB4R2V0UHJvcGVydHlSZXE7CisgCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgd2luZG93IEIzMjsKKyAgICBBdG9tIHNlbGVjdGlvbiBCMzI7CisgICAgVGltZSB0aW1lIEIzMjsKK30geFNldFNlbGVjdGlvbk93bmVyUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgcmVxdWVzdG9yIEIzMjsKKyAgICBBdG9tIHNlbGVjdGlvbiBCMzIsIHRhcmdldCBCMzIsIHByb3BlcnR5IEIzMjsKKyAgICBUaW1lIHRpbWUgQjMyOworICAgIH0geENvbnZlcnRTZWxlY3Rpb25SZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJPT0wgcHJvcGFnYXRlOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyBkZXN0aW5hdGlvbiBCMzI7CisgICAgQ0FSRDMyIGV2ZW50TWFzayBCMzI7CisjaWZkZWYgV09SRDY0CisgICAgLyogdGhlIHN0cnVjdHVyZSBzaG91bGQgaGF2ZSBiZWVuIHF1YWQtYWxpZ25lZCAqLworICAgIEJZVEUgZXZlbnRkYXRhW1NJWkVPRih4RXZlbnQpXTsKKyNlbHNlCisgICAgeEV2ZW50IGV2ZW50OworI2VuZGlmIC8qIFdPUkQ2NCAqLworfSB4U2VuZEV2ZW50UmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCT09MIG93bmVyRXZlbnRzOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyBncmFiV2luZG93IEIzMjsKKyAgICBDQVJEMTYgZXZlbnRNYXNrIEIxNjsKKyAgICBCWVRFIHBvaW50ZXJNb2RlLCBrZXlib2FyZE1vZGU7CisgICAgV2luZG93IGNvbmZpbmVUbyBCMzI7CisgICAgQ3Vyc29yIGN1cnNvciBCMzI7CisgICAgVGltZSB0aW1lIEIzMjsKK30geEdyYWJQb2ludGVyUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCT09MIG93bmVyRXZlbnRzOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyBncmFiV2luZG93IEIzMjsKKyAgICBDQVJEMTYgZXZlbnRNYXNrIEIxNjsKKyAgICBCWVRFIHBvaW50ZXJNb2RlLCBrZXlib2FyZE1vZGU7CisgICAgV2luZG93IGNvbmZpbmVUbyBCMzI7CisgICAgQ3Vyc29yIGN1cnNvciBCMzI7CisgICAgQ0FSRDggYnV0dG9uOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBtb2RpZmllcnMgQjE2OworfSB4R3JhYkJ1dHRvblJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQ0FSRDggYnV0dG9uOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyBncmFiV2luZG93IEIzMjsKKyAgICBDQVJEMTYgbW9kaWZpZXJzIEIxNjsKKyAgICBDQVJEMTYgcGFkIEIxNjsKK30geFVuZ3JhYkJ1dHRvblJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ3Vyc29yIGN1cnNvciBCMzI7CisgICAgVGltZSB0aW1lIEIzMjsKKyAgICBDQVJEMTYgZXZlbnRNYXNrIEIxNjsKKyAgICBDQVJEMTYgcGFkMiBCMTY7Cit9IHhDaGFuZ2VBY3RpdmVQb2ludGVyR3JhYlJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQk9PTCBvd25lckV2ZW50czsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgZ3JhYldpbmRvdyBCMzI7CisgICAgVGltZSB0aW1lIEIzMjsKKyAgICBCWVRFIHBvaW50ZXJNb2RlLCBrZXlib2FyZE1vZGU7ICAKKyAgICBDQVJEMTYgcGFkIEIxNjsKK30geEdyYWJLZXlib2FyZFJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQk9PTCBvd25lckV2ZW50czsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgZ3JhYldpbmRvdyBCMzI7CisgICAgQ0FSRDE2IG1vZGlmaWVycyBCMTY7CisgICAgQ0FSRDgga2V5OworICAgIEJZVEUgcG9pbnRlck1vZGUsIGtleWJvYXJkTW9kZTsgIAorICAgIEJZVEUgcGFkMSwgcGFkMiwgcGFkMzsKK30geEdyYWJLZXlSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIENBUkQ4IGtleTsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgZ3JhYldpbmRvdyBCMzI7CisgICAgQ0FSRDE2IG1vZGlmaWVycyBCMTY7CisgICAgQ0FSRDE2IHBhZCBCMTY7Cit9IHhVbmdyYWJLZXlSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIENBUkQ4IG1vZGU7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgVGltZSB0aW1lIEIzMjsKK30geEFsbG93RXZlbnRzUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgd2luZG93IEIzMjsKKyAgICBUaW1lIHN0YXJ0IEIzMiwgc3RvcCBCMzI7Cit9IHhHZXRNb3Rpb25FdmVudHNSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyBzcmNXaWQgQjMyLCBkc3RXaWQgQjMyOworICAgIElOVDE2IHNyY1ggQjE2LCBzcmNZIEIxNjsKK30geFRyYW5zbGF0ZUNvb3Jkc1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IHNyY1dpZCBCMzIsIGRzdFdpZCBCMzI7CisgICAgSU5UMTYgc3JjWCBCMTYsIHNyY1kgQjE2OworICAgIENBUkQxNiBzcmNXaWR0aCBCMTYsIHNyY0hlaWdodCBCMTY7CisgICAgSU5UMTYgZHN0WCBCMTYsIGRzdFkgQjE2OworfSB4V2FycFBvaW50ZXJSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIENBUkQ4IHJldmVydFRvOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyBmb2N1cyBCMzI7CisgICAgVGltZSB0aW1lIEIzMjsKK30geFNldElucHV0Rm9jdXNSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIEZvbnQgZmlkIEIzMjsKKyAgICBDQVJEMTYgbmJ5dGVzIEIxNjsKKyAgICBCWVRFIHBhZDEsIHBhZDI7CS8qIHN0cmluZyBmb2xsb3dzIG9uIHdvcmQgYm91bmRhcnkgKi8KK30geE9wZW5Gb250UmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCT09MIG9kZExlbmd0aDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBGb250IGZpZCBCMzI7CisgICAgfSB4UXVlcnlUZXh0RXh0ZW50c1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ0FSRDE2IG1heE5hbWVzIEIxNjsKKyAgICBDQVJEMTYgbmJ5dGVzIEIxNjsgIC8qIGZvbGxvd2VkIGltbWVkaWF0ZWx5IGJ5IHN0cmluZyBieXRlcyAqLworfSB4TGlzdEZvbnRzUmVxOworCit0eXBlZGVmIHhMaXN0Rm9udHNSZXEgeExpc3RGb250c1dpdGhJbmZvUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYgbkZvbnRzIEIxNjsKKyAgICBCWVRFIHBhZDEsIHBhZDI7CS8qIExJU1RvZlNUUklORzggZm9sbG93cyBvbiB3b3JkIGJvdW5kYXJ5ICovCit9IHhTZXRGb250UGF0aFJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQ0FSRDggZGVwdGg7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgUGl4bWFwIHBpZCBCMzI7CisgICAgRHJhd2FibGUgZHJhd2FibGUgQjMyOworICAgIENBUkQxNiB3aWR0aCBCMTYsIGhlaWdodCBCMTY7Cit9IHhDcmVhdGVQaXhtYXBSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIEdDb250ZXh0IGdjIEIzMjsKKyAgICBEcmF3YWJsZSBkcmF3YWJsZSBCMzI7CisgICAgQ0FSRDMyIG1hc2sgQjMyOworfSB4Q3JlYXRlR0NSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIEdDb250ZXh0IGdjIEIzMjsKKyAgICBDQVJEMzIgbWFzayBCMzI7Cit9IHhDaGFuZ2VHQ1JlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIEdDb250ZXh0IHNyY0dDIEIzMiwgZHN0R0MgQjMyOworICAgIENBUkQzMiBtYXNrIEIzMjsKK30geENvcHlHQ1JlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIEdDb250ZXh0IGdjIEIzMjsKKyAgICBDQVJEMTYgZGFzaE9mZnNldCBCMTY7CisgICAgQ0FSRDE2IG5EYXNoZXMgQjE2OyAgICAgICAgLyogbGVuZ3RoIExJU1RvZkNBUkQ4IG9mIHZhbHVlcyBmb2xsb3dpbmcgKi8KK30geFNldERhc2hlc1JlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgb3JkZXJpbmc7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgR0NvbnRleHQgZ2MgQjMyOworICAgIElOVDE2IHhPcmlnaW4gQjE2LCB5T3JpZ2luIEIxNjsKK30geFNldENsaXBSZWN0YW5nbGVzUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQk9PTCBleHBvc3VyZXM7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IHdpbmRvdyBCMzI7CisgICAgSU5UMTYgeCBCMTYsIHkgQjE2OworICAgIENBUkQxNiB3aWR0aCBCMTYsIGhlaWdodCBCMTY7Cit9IHhDbGVhckFyZWFSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIERyYXdhYmxlIHNyY0RyYXdhYmxlIEIzMiwgZHN0RHJhd2FibGUgQjMyOworICAgIEdDb250ZXh0IGdjIEIzMjsKKyAgICBJTlQxNiBzcmNYIEIxNiwgc3JjWSBCMTYsIGRzdFggQjE2LCBkc3RZIEIxNjsKKyAgICBDQVJEMTYgd2lkdGggQjE2LCBoZWlnaHQgQjE2OworfSB4Q29weUFyZWFSZXE7ICAgIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBEcmF3YWJsZSBzcmNEcmF3YWJsZSBCMzIsIGRzdERyYXdhYmxlIEIzMjsKKyAgICBHQ29udGV4dCBnYyBCMzI7CisgICAgSU5UMTYgc3JjWCBCMTYsIHNyY1kgQjE2LCBkc3RYIEIxNiwgZHN0WSBCMTY7CisgICAgQ0FSRDE2IHdpZHRoIEIxNiwgaGVpZ2h0IEIxNjsKKyAgICBDQVJEMzIgYml0UGxhbmUgQjMyOworfSB4Q29weVBsYW5lUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBjb29yZE1vZGU7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgRHJhd2FibGUgZHJhd2FibGUgQjMyOworICAgIEdDb250ZXh0IGdjIEIzMjsKK30geFBvbHlQb2ludFJlcTsgICAgCisKK3R5cGVkZWYgeFBvbHlQb2ludFJlcSB4UG9seUxpbmVSZXE7ICAvKiBzYW1lIHJlcXVlc3Qgc3RydWN0dXJlICovCisKKy8qIFRoZSBmb2xsb3dpbmcgdXNlZCBmb3IgUG9seVNlZ21lbnQsIFBvbHlSZWN0YW5nbGUsIFBvbHlBcmMsIFBvbHlGaWxsUmVjdGFuZ2xlLCBQb2x5RmlsbEFyYyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBEcmF3YWJsZSBkcmF3YWJsZSBCMzI7CisgICAgR0NvbnRleHQgZ2MgQjMyOworfSB4UG9seVNlZ21lbnRSZXE7ICAgIAorCit0eXBlZGVmIHhQb2x5U2VnbWVudFJlcSB4UG9seUFyY1JlcTsKK3R5cGVkZWYgeFBvbHlTZWdtZW50UmVxIHhQb2x5UmVjdGFuZ2xlUmVxOwordHlwZWRlZiB4UG9seVNlZ21lbnRSZXEgeFBvbHlGaWxsUmVjdGFuZ2xlUmVxOwordHlwZWRlZiB4UG9seVNlZ21lbnRSZXEgeFBvbHlGaWxsQXJjUmVxOworCit0eXBlZGVmIHN0cnVjdCBfRmlsbFBvbHlSZXEgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgRHJhd2FibGUgZHJhd2FibGUgQjMyOworICAgIEdDb250ZXh0IGdjIEIzMjsKKyAgICBCWVRFIHNoYXBlOworICAgIEJZVEUgY29vcmRNb2RlOworICAgIENBUkQxNiBwYWQxIEIxNjsKK30geEZpbGxQb2x5UmVxOyAgICAKKworCit0eXBlZGVmIHN0cnVjdCBfUHV0SW1hZ2VSZXEgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQ0FSRDggZm9ybWF0OworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIERyYXdhYmxlIGRyYXdhYmxlIEIzMjsKKyAgICBHQ29udGV4dCBnYyBCMzI7CisgICAgQ0FSRDE2IHdpZHRoIEIxNiwgaGVpZ2h0IEIxNjsKKyAgICBJTlQxNiBkc3RYIEIxNiwgZHN0WSBCMTY7CisgICAgQ0FSRDggbGVmdFBhZDsKKyAgICBDQVJEOCBkZXB0aDsKKyAgICBDQVJEMTYgcGFkIEIxNjsKK30geFB1dEltYWdlUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQ0FSRDggZm9ybWF0OworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIERyYXdhYmxlIGRyYXdhYmxlIEIzMjsKKyAgICBJTlQxNiB4IEIxNiwgeSBCMTY7CisgICAgQ0FSRDE2IHdpZHRoIEIxNiwgaGVpZ2h0IEIxNjsKKyAgICBDQVJEMzIgcGxhbmVNYXNrIEIzMjsKK30geEdldEltYWdlUmVxOyAgICAKKworLyogdGhlIGZvbGxvd2luZyB1c2VkIGJ5IFBvbHlUZXh0OCBhbmQgUG9seVRleHQxNiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBDQVJEOCBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgRHJhd2FibGUgZHJhd2FibGUgQjMyOworICAgIEdDb250ZXh0IGdjIEIzMjsKKyAgICBJTlQxNiB4IEIxNiwgeSBCMTY7CQkvKiBpdGVtcyAoeFRleHRFbHQpIHN0YXJ0IGFmdGVyIHN0cnVjdCAqLworfSB4UG9seVRleHRSZXE7ICAgIAorCit0eXBlZGVmIHhQb2x5VGV4dFJlcSB4UG9seVRleHQ4UmVxOwordHlwZWRlZiB4UG9seVRleHRSZXEgeFBvbHlUZXh0MTZSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgbkNoYXJzOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIERyYXdhYmxlIGRyYXdhYmxlIEIzMjsKKyAgICBHQ29udGV4dCBnYyBCMzI7CisgICAgSU5UMTYgeCBCMTYsIHkgQjE2OworfSB4SW1hZ2VUZXh0UmVxOyAgICAKKwordHlwZWRlZiB4SW1hZ2VUZXh0UmVxIHhJbWFnZVRleHQ4UmVxOwordHlwZWRlZiB4SW1hZ2VUZXh0UmVxIHhJbWFnZVRleHQxNlJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBhbGxvYzsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDb2xvcm1hcCBtaWQgQjMyOworICAgIFdpbmRvdyB3aW5kb3cgQjMyOworICAgIFZpc3VhbElEIHZpc3VhbCBCMzI7Cit9IHhDcmVhdGVDb2xvcm1hcFJlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENvbG9ybWFwIG1pZCBCMzI7CisgICAgQ29sb3JtYXAgc3JjQ21hcCBCMzI7Cit9IHhDb3B5Q29sb3JtYXBBbmRGcmVlUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ29sb3JtYXAgY21hcCBCMzI7CisgICAgQ0FSRDE2IHJlZCBCMTYsIGdyZWVuIEIxNiwgYmx1ZSBCMTY7CisgICAgQ0FSRDE2IHBhZDIgQjE2OworfSB4QWxsb2NDb2xvclJlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENvbG9ybWFwIGNtYXAgQjMyOworICAgIENBUkQxNiBuYnl0ZXMgQjE2OyAgLyogZm9sbG93ZWQgYnkgc3RydWN0dXJlICovCisgICAgQllURSBwYWQxLCBwYWQyOworfSB4QWxsb2NOYW1lZENvbG9yUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQk9PTCBjb250aWd1b3VzOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENvbG9ybWFwIGNtYXAgQjMyOworICAgIENBUkQxNiBjb2xvcnMgQjE2LCBwbGFuZXMgQjE2OworfSB4QWxsb2NDb2xvckNlbGxzUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQk9PTCBjb250aWd1b3VzOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENvbG9ybWFwIGNtYXAgQjMyOworICAgIENBUkQxNiBjb2xvcnMgQjE2LCByZWQgQjE2LCBncmVlbiBCMTYsIGJsdWUgQjE2OworfSB4QWxsb2NDb2xvclBsYW5lc1JlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENvbG9ybWFwIGNtYXAgQjMyOworICAgIENBUkQzMiBwbGFuZU1hc2sgQjMyOworfSB4RnJlZUNvbG9yc1JlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENvbG9ybWFwIGNtYXAgQjMyOworfSB4U3RvcmVDb2xvcnNSZXE7ICAgIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBDQVJEOCBmbGFnczsgICAvKiBEb1JlZCwgRG9HcmVlbiwgRG9CbHVlLCBhcyBpbiB4Q29sb3JJdGVtICovCisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ29sb3JtYXAgY21hcCBCMzI7CisgICAgQ0FSRDMyIHBpeGVsIEIzMjsKKyAgICBDQVJEMTYgbmJ5dGVzIEIxNjsgIC8qIG51bWJlciBvZiBuYW1lIHN0cmluZyBieXRlcyBmb2xsb3dpbmcgc3RydWN0dXJlICovCisgICAgQllURSBwYWQxLCBwYWQyOworICAgIH0geFN0b3JlTmFtZWRDb2xvclJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ29sb3JtYXAgY21hcCBCMzI7Cit9IHhRdWVyeUNvbG9yc1JlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsgICAgLyogZm9sbG93ZWQgIGJ5IHN0cmluZyBvZiBsZW5ndGggbGVuICovCisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDb2xvcm1hcCBjbWFwIEIzMjsKKyAgICBDQVJEMTYgbmJ5dGVzIEIxNjsgIC8qIG51bWJlciBvZiBzdHJpbmcgYnl0ZXMgZm9sbG93aW5nIHN0cnVjdHVyZSovCisgICAgQllURSBwYWQxLCBwYWQyOworfSB4TG9va3VwQ29sb3JSZXE7ICAgIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDdXJzb3IgY2lkIEIzMjsKKyAgICBQaXhtYXAgc291cmNlIEIzMiwgbWFzayBCMzI7CisgICAgQ0FSRDE2IGZvcmVSZWQgQjE2LCBmb3JlR3JlZW4gQjE2LCBmb3JlQmx1ZSBCMTY7CisgICAgQ0FSRDE2IGJhY2tSZWQgQjE2LCBiYWNrR3JlZW4gQjE2LCBiYWNrQmx1ZSBCMTY7CisgICAgQ0FSRDE2IHggQjE2LCB5IEIxNjsKK30geENyZWF0ZUN1cnNvclJlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIEN1cnNvciBjaWQgQjMyOworICAgIEZvbnQgc291cmNlIEIzMiwgbWFzayBCMzI7CisgICAgQ0FSRDE2IHNvdXJjZUNoYXIgQjE2LCBtYXNrQ2hhciBCMTY7CisgICAgQ0FSRDE2IGZvcmVSZWQgQjE2LCBmb3JlR3JlZW4gQjE2LCBmb3JlQmx1ZSBCMTY7CisgICAgQ0FSRDE2IGJhY2tSZWQgQjE2LCBiYWNrR3JlZW4gQjE2LCBiYWNrQmx1ZSBCMTY7Cit9IHhDcmVhdGVHbHlwaEN1cnNvclJlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIEN1cnNvciBjdXJzb3IgQjMyOworICAgIENBUkQxNiBmb3JlUmVkIEIxNiwgZm9yZUdyZWVuIEIxNiwgZm9yZUJsdWUgQjE2OworICAgIENBUkQxNiBiYWNrUmVkIEIxNiwgYmFja0dyZWVuIEIxNiwgYmFja0JsdWUgQjE2OworfSB4UmVjb2xvckN1cnNvclJlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOCBjX2NsYXNzOworI2Vsc2UKKyAgICBDQVJEOCBjbGFzczsKKyNlbmRpZgorICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIERyYXdhYmxlIGRyYXdhYmxlIEIzMjsKKyAgICBDQVJEMTYgd2lkdGggQjE2LCBoZWlnaHQgQjE2OworfSB4UXVlcnlCZXN0U2l6ZVJlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENBUkQxNiBuYnl0ZXMgQjE2OyAgLyogbnVtYmVyIG9mIHN0cmluZyBieXRlcyBmb2xsb3dpbmcgc3RydWN0dXJlICovCisgICAgQllURSBwYWQxLCBwYWQyOworfSB4UXVlcnlFeHRlbnNpb25SZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICBudW1LZXlQZXJNb2RpZmllcjsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7Cit9IHhTZXRNb2RpZmllck1hcHBpbmdSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIENBUkQ4IG5FbHRzOyAgLyogaG93IG1hbnkgZWxlbWVudHMgaW4gdGhlIG1hcCAqLworICAgIENBUkQxNiBsZW5ndGggQjE2OworfSB4U2V0UG9pbnRlck1hcHBpbmdSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIEtleUNvZGUgZmlyc3RLZXlDb2RlOworICAgIENBUkQ4IGNvdW50OworICAgIENBUkQxNiBwYWQxIEIxNjsKK30geEdldEtleWJvYXJkTWFwcGluZ1JlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIENBUkQ4IGtleUNvZGVzOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIEtleUNvZGUgZmlyc3RLZXlDb2RlOworICAgIENBUkQ4IGtleVN5bXNQZXJLZXlDb2RlOworICAgIENBUkQxNiBwYWQxIEIxNjsKK30geENoYW5nZUtleWJvYXJkTWFwcGluZ1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ0FSRDMyIG1hc2sgQjMyOworfSB4Q2hhbmdlS2V5Ym9hcmRDb250cm9sUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgSU5UOCBwZXJjZW50OyAgLyogLTEwMCB0byAxMDAgKi8KKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKK30geEJlbGxSZXE7ICAgIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBJTlQxNiBhY2NlbE51bSBCMTYsIGFjY2VsRGVudW0gQjE2OworICAgIElOVDE2IHRocmVzaG9sZCBCMTY7ICAgICAgICAgICAgIAorICAgIEJPT0wgZG9BY2NlbCwgZG9UaHJlc2g7Cit9IHhDaGFuZ2VQb2ludGVyQ29udHJvbFJlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIElOVDE2IHRpbWVvdXQgQjE2LCBpbnRlcnZhbCBCMTY7CisgICAgQllURSBwcmVmZXJCbGFuaywgYWxsb3dFeHBvc2U7ICAKKyAgICBDQVJEMTYgcGFkMiBCMTY7Cit9IHhTZXRTY3JlZW5TYXZlclJlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgbW9kZTsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDQVJEOCBob3N0RmFtaWx5OworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBob3N0TGVuZ3RoIEIxNjsKK30geENoYW5nZUhvc3RzUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgfSB4TGlzdEhvc3RzUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIG1vZGU7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgfSB4Q2hhbmdlTW9kZVJlcTsKKwordHlwZWRlZiB4Q2hhbmdlTW9kZVJlcSB4U2V0QWNjZXNzQ29udHJvbFJlcTsKK3R5cGVkZWYgeENoYW5nZU1vZGVSZXEgeFNldENsb3NlRG93bk1vZGVSZXE7Cit0eXBlZGVmIHhDaGFuZ2VNb2RlUmVxIHhGb3JjZVNjcmVlblNhdmVyUmVxOworCit0eXBlZGVmIHN0cnVjdCB7IC8qIGZvbGxvd2VkIGJ5IExJU1Qgb2YgQVRPTSAqLworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IHdpbmRvdyBCMzI7CisgICAgQ0FSRDE2IG5BdG9tcyBCMTY7CisgICAgSU5UMTYgblBvc2l0aW9ucyBCMTY7CisgICAgfSB4Um90YXRlUHJvcGVydGllc1JlcTsKKyAgICAKKwwKKworLyogUmVwbHkgY29kZXMgKi8KKworI2RlZmluZSBYX1JlcGx5CQkxCQkvKiBOb3JtYWwgcmVwbHkgKi8KKyNkZWZpbmUgWF9FcnJvcgkJMAkJLyogRXJyb3IgKi8KKworLyogUmVxdWVzdCBjb2RlcyAqLworCisjZGVmaW5lIFhfQ3JlYXRlV2luZG93ICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgCisjZGVmaW5lIFhfQ2hhbmdlV2luZG93QXR0cmlidXRlcyAgICAgICAgMiAgICAgICAgCisjZGVmaW5lIFhfR2V0V2luZG93QXR0cmlidXRlcyAgICAgICAgICAgMyAgICAgCisjZGVmaW5lIFhfRGVzdHJveVdpbmRvdyAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBYX0Rlc3Ryb3lTdWJ3aW5kb3dzICAgICAgICAgICAgIDUgICAKKyNkZWZpbmUgWF9DaGFuZ2VTYXZlU2V0ICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFhfUmVwYXJlbnRXaW5kb3cgICAgICAgICAgICAgICAgNworI2RlZmluZSBYX01hcFdpbmRvdyAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgWF9NYXBTdWJ3aW5kb3dzICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIFhfVW5tYXBXaW5kb3cgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBYX1VubWFwU3Vid2luZG93cyAgICAgICAgICAgICAgMTEgIAorI2RlZmluZSBYX0NvbmZpZ3VyZVdpbmRvdyAgICAgICAgICAgICAgMTIgIAorI2RlZmluZSBYX0NpcmN1bGF0ZVdpbmRvdyAgICAgICAgICAgICAgMTMgIAorI2RlZmluZSBYX0dldEdlb21ldHJ5ICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgWF9RdWVyeVRyZWUgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIFhfSW50ZXJuQXRvbSAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBYX0dldEF0b21OYW1lICAgICAgICAgICAgICAgICAgMTcKKyNkZWZpbmUgWF9DaGFuZ2VQcm9wZXJ0eSAgICAgICAgICAgICAgIDE4IAorI2RlZmluZSBYX0RlbGV0ZVByb3BlcnR5ICAgICAgICAgICAgICAgMTkgCisjZGVmaW5lIFhfR2V0UHJvcGVydHkgICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBYX0xpc3RQcm9wZXJ0aWVzICAgICAgICAgICAgICAgMjEgCisjZGVmaW5lIFhfU2V0U2VsZWN0aW9uT3duZXIgICAgICAgICAgICAyMiAgICAKKyNkZWZpbmUgWF9HZXRTZWxlY3Rpb25Pd25lciAgICAgICAgICAgIDIzICAgIAorI2RlZmluZSBYX0NvbnZlcnRTZWxlY3Rpb24gICAgICAgICAgICAgMjQgICAKKyNkZWZpbmUgWF9TZW5kRXZlbnQgICAgICAgICAgICAgICAgICAgIDI1CisjZGVmaW5lIFhfR3JhYlBvaW50ZXIgICAgICAgICAgICAgICAgICAyNgorI2RlZmluZSBYX1VuZ3JhYlBvaW50ZXIgICAgICAgICAgICAgICAgMjcKKyNkZWZpbmUgWF9HcmFiQnV0dG9uICAgICAgICAgICAgICAgICAgIDI4CisjZGVmaW5lIFhfVW5ncmFiQnV0dG9uICAgICAgICAgICAgICAgICAyOQorI2RlZmluZSBYX0NoYW5nZUFjdGl2ZVBvaW50ZXJHcmFiICAgICAgMzAgICAgICAgICAgCisjZGVmaW5lIFhfR3JhYktleWJvYXJkICAgICAgICAgICAgICAgICAzMQorI2RlZmluZSBYX1VuZ3JhYktleWJvYXJkICAgICAgICAgICAgICAgMzIgCisjZGVmaW5lIFhfR3JhYktleSAgICAgICAgICAgICAgICAgICAgICAzMworI2RlZmluZSBYX1VuZ3JhYktleSAgICAgICAgICAgICAgICAgICAgMzQKKyNkZWZpbmUgWF9BbGxvd0V2ZW50cyAgICAgICAgICAgICAgICAgIDM1ICAgICAgIAorI2RlZmluZSBYX0dyYWJTZXJ2ZXIgICAgICAgICAgICAgICAgICAgMzYgICAgICAKKyNkZWZpbmUgWF9VbmdyYWJTZXJ2ZXIgICAgICAgICAgICAgICAgIDM3ICAgICAgICAKKyNkZWZpbmUgWF9RdWVyeVBvaW50ZXIgICAgICAgICAgICAgICAgIDM4ICAgICAgICAKKyNkZWZpbmUgWF9HZXRNb3Rpb25FdmVudHMgICAgICAgICAgICAgIDM5ICAgICAgICAgICAKKyNkZWZpbmUgWF9UcmFuc2xhdGVDb29yZHMgICAgICAgICAgICAgIDQwICAgICAgICAgICAgICAgIAorI2RlZmluZSBYX1dhcnBQb2ludGVyICAgICAgICAgICAgICAgICAgNDEgICAgICAgCisjZGVmaW5lIFhfU2V0SW5wdXRGb2N1cyAgICAgICAgICAgICAgICA0MiAgICAgICAgIAorI2RlZmluZSBYX0dldElucHV0Rm9jdXMgICAgICAgICAgICAgICAgNDMgICAgICAgICAKKyNkZWZpbmUgWF9RdWVyeUtleW1hcCAgICAgICAgICAgICAgICAgIDQ0ICAgICAgIAorI2RlZmluZSBYX09wZW5Gb250ICAgICAgICAgICAgICAgICAgICAgNDUgICAgCisjZGVmaW5lIFhfQ2xvc2VGb250ICAgICAgICAgICAgICAgICAgICA0NiAgICAgCisjZGVmaW5lIFhfUXVlcnlGb250ICAgICAgICAgICAgICAgICAgICA0NworI2RlZmluZSBYX1F1ZXJ5VGV4dEV4dGVudHMgICAgICAgICAgICAgNDggICAgIAorI2RlZmluZSBYX0xpc3RGb250cyAgICAgICAgICAgICAgICAgICAgNDkgIAorI2RlZmluZSBYX0xpc3RGb250c1dpdGhJbmZvICAgIAkgICAgICAgNTAgCisjZGVmaW5lIFhfU2V0Rm9udFBhdGggICAgICAgICAgICAgICAgICA1MSAKKyNkZWZpbmUgWF9HZXRGb250UGF0aCAgICAgICAgICAgICAgICAgIDUyIAorI2RlZmluZSBYX0NyZWF0ZVBpeG1hcCAgICAgICAgICAgICAgICAgNTMgICAgICAgIAorI2RlZmluZSBYX0ZyZWVQaXhtYXAgICAgICAgICAgICAgICAgICAgNTQgICAgICAKKyNkZWZpbmUgWF9DcmVhdGVHQyAgICAgICAgICAgICAgICAgICAgIDU1ICAgIAorI2RlZmluZSBYX0NoYW5nZUdDICAgICAgICAgICAgICAgICAgICAgNTYgICAgCisjZGVmaW5lIFhfQ29weUdDICAgICAgICAgICAgICAgICAgICAgICA1NyAgCisjZGVmaW5lIFhfU2V0RGFzaGVzICAgICAgICAgICAgICAgICAgICA1OCAgICAgCisjZGVmaW5lIFhfU2V0Q2xpcFJlY3RhbmdsZXMgICAgICAgICAgICA1OSAgICAgICAgICAgICAKKyNkZWZpbmUgWF9GcmVlR0MgICAgICAgICAgICAgICAgICAgICAgIDYwICAKKyNkZWZpbmUgWF9DbGVhckFyZWEgICAgICAgICAgICAgICAgICAgIDYxICAgICAgICAgICAgIAorI2RlZmluZSBYX0NvcHlBcmVhICAgICAgICAgICAgICAgICAgICAgNjIgICAgCisjZGVmaW5lIFhfQ29weVBsYW5lICAgICAgICAgICAgICAgICAgICA2MyAgICAgCisjZGVmaW5lIFhfUG9seVBvaW50ICAgICAgICAgICAgICAgICAgICA2NCAgICAgCisjZGVmaW5lIFhfUG9seUxpbmUgICAgICAgICAgICAgICAgICAgICA2NSAgICAKKyNkZWZpbmUgWF9Qb2x5U2VnbWVudCAgICAgICAgICAgICAgICAgIDY2ICAgICAgIAorI2RlZmluZSBYX1BvbHlSZWN0YW5nbGUgICAgICAgICAgICAgICAgNjcgICAgICAgICAKKyNkZWZpbmUgWF9Qb2x5QXJjICAgICAgICAgICAgICAgICAgICAgIDY4ICAgCisjZGVmaW5lIFhfRmlsbFBvbHkgICAgICAgICAgICAgICAgICAgICA2OSAgICAKKyNkZWZpbmUgWF9Qb2x5RmlsbFJlY3RhbmdsZSAgICAgICAgICAgIDcwICAgICAgICAgICAgIAorI2RlZmluZSBYX1BvbHlGaWxsQXJjICAgICAgICAgICAgICAgICAgNzEgICAgICAgCisjZGVmaW5lIFhfUHV0SW1hZ2UgICAgICAgICAgICAgICAgICAgICA3MiAgICAKKyNkZWZpbmUgWF9HZXRJbWFnZSAgICAgICAgICAgICAgICAgICAgIDczIAorI2RlZmluZSBYX1BvbHlUZXh0OCAgICAgICAgICAgICAgICAgICAgNzQgICAgIAorI2RlZmluZSBYX1BvbHlUZXh0MTYgICAgICAgICAgICAgICAgICAgNzUgICAgICAKKyNkZWZpbmUgWF9JbWFnZVRleHQ4ICAgICAgICAgICAgICAgICAgIDc2ICAgICAgCisjZGVmaW5lIFhfSW1hZ2VUZXh0MTYgICAgICAgICAgICAgICAgICA3NyAgICAgICAKKyNkZWZpbmUgWF9DcmVhdGVDb2xvcm1hcCAgICAgICAgICAgICAgIDc4ICAgICAgICAgIAorI2RlZmluZSBYX0ZyZWVDb2xvcm1hcCAgICAgICAgICAgICAgICAgNzkgICAgICAgIAorI2RlZmluZSBYX0NvcHlDb2xvcm1hcEFuZEZyZWUgICAgICAgICAgODAgICAgICAgICAgICAgICAKKyNkZWZpbmUgWF9JbnN0YWxsQ29sb3JtYXAgICAgICAgICAgICAgIDgxICAgICAgICAgICAKKyNkZWZpbmUgWF9Vbmluc3RhbGxDb2xvcm1hcCAgICAgICAgICAgIDgyICAgICAgICAgICAgIAorI2RlZmluZSBYX0xpc3RJbnN0YWxsZWRDb2xvcm1hcHMgICAgICAgODMgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgWF9BbGxvY0NvbG9yICAgICAgICAgICAgICAgICAgIDg0ICAgICAgCisjZGVmaW5lIFhfQWxsb2NOYW1lZENvbG9yICAgICAgICAgICAgICA4NSAgICAgICAgICAgCisjZGVmaW5lIFhfQWxsb2NDb2xvckNlbGxzICAgICAgICAgICAgICA4NiAgICAgICAgICAgCisjZGVmaW5lIFhfQWxsb2NDb2xvclBsYW5lcyAgICAgICAgICAgICA4NyAgICAgICAgICAgIAorI2RlZmluZSBYX0ZyZWVDb2xvcnMgICAgICAgICAgICAgICAgICAgODggICAgICAKKyNkZWZpbmUgWF9TdG9yZUNvbG9ycyAgICAgICAgICAgICAgICAgIDg5ICAgICAgIAorI2RlZmluZSBYX1N0b3JlTmFtZWRDb2xvciAgICAgICAgICAgICAgOTAgICAgICAgICAgIAorI2RlZmluZSBYX1F1ZXJ5Q29sb3JzICAgICAgICAgICAgICAgICAgOTEgICAgICAgCisjZGVmaW5lIFhfTG9va3VwQ29sb3IgICAgICAgICAgICAgICAgICA5MiAgICAgICAKKyNkZWZpbmUgWF9DcmVhdGVDdXJzb3IgICAgICAgICAgICAgICAgIDkzICAgICAgICAKKyNkZWZpbmUgWF9DcmVhdGVHbHlwaEN1cnNvciAgICAgICAgICAgIDk0ICAgICAgICAgICAgIAorI2RlZmluZSBYX0ZyZWVDdXJzb3IgICAgICAgICAgICAgICAgICAgOTUgICAgICAKKyNkZWZpbmUgWF9SZWNvbG9yQ3Vyc29yICAgICAgICAgICAgICAgIDk2ICAgICAgICAgCisjZGVmaW5lIFhfUXVlcnlCZXN0U2l6ZSAgICAgICAgICAgICAgICA5NyAgICAgICAgIAorI2RlZmluZSBYX1F1ZXJ5RXh0ZW5zaW9uICAgICAgICAgICAgICAgOTggICAgICAgICAgCisjZGVmaW5lIFhfTGlzdEV4dGVuc2lvbnMgICAgICAgICAgICAgICA5OSAgICAgICAgICAKKyNkZWZpbmUgWF9DaGFuZ2VLZXlib2FyZE1hcHBpbmcgICAgICAgIDEwMAorI2RlZmluZSBYX0dldEtleWJvYXJkTWFwcGluZyAgICAgICAgICAgMTAxCisjZGVmaW5lIFhfQ2hhbmdlS2V5Ym9hcmRDb250cm9sICAgICAgICAxMDIgICAgICAgICAgICAgICAgCisjZGVmaW5lIFhfR2V0S2V5Ym9hcmRDb250cm9sICAgICAgICAgICAxMDMgICAgICAgICAgICAgCisjZGVmaW5lIFhfQmVsbCAgICAgICAgICAgICAgICAgICAgICAgICAxMDQKKyNkZWZpbmUgWF9DaGFuZ2VQb2ludGVyQ29udHJvbCAgICAgICAgIDEwNQorI2RlZmluZSBYX0dldFBvaW50ZXJDb250cm9sICAgICAgICAgICAgMTA2CisjZGVmaW5lIFhfU2V0U2NyZWVuU2F2ZXIgICAgICAgICAgICAgICAxMDcgICAgICAgICAgCisjZGVmaW5lIFhfR2V0U2NyZWVuU2F2ZXIgICAgICAgICAgICAgICAxMDggICAgICAgICAgCisjZGVmaW5lIFhfQ2hhbmdlSG9zdHMgICAgICAgICAgICAgICAgICAxMDkgICAgICAgCisjZGVmaW5lIFhfTGlzdEhvc3RzICAgICAgICAgICAgICAgICAgICAxMTAgICAgIAorI2RlZmluZSBYX1NldEFjY2Vzc0NvbnRyb2wgICAgICAgICAgICAgMTExICAgICAgICAgICAgICAgCisjZGVmaW5lIFhfU2V0Q2xvc2VEb3duTW9kZSAgICAgICAgICAgICAxMTIKKyNkZWZpbmUgWF9LaWxsQ2xpZW50ICAgICAgICAgICAgICAgICAgIDExMyAKKyNkZWZpbmUgWF9Sb3RhdGVQcm9wZXJ0aWVzCSAgICAgICAxMTQKKyNkZWZpbmUgWF9Gb3JjZVNjcmVlblNhdmVyCSAgICAgICAxMTUKKyNkZWZpbmUgWF9TZXRQb2ludGVyTWFwcGluZyAgICAgICAgICAgIDExNgorI2RlZmluZSBYX0dldFBvaW50ZXJNYXBwaW5nICAgICAgICAgICAgMTE3CisjZGVmaW5lIFhfU2V0TW9kaWZpZXJNYXBwaW5nCSAgICAgICAxMTgKKyNkZWZpbmUgWF9HZXRNb2RpZmllck1hcHBpbmcJICAgICAgIDExOQorI2RlZmluZSBYX05vT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgMTI3CisKKy8qIHJlc3RvcmUgdGhlc2UgZGVmaW5pdGlvbnMgYmFjayB0byB0aGUgdHlwZWRlZnMgaW4gWC5oICovCisjdW5kZWYgV2luZG93CisjdW5kZWYgRHJhd2FibGUKKyN1bmRlZiBGb250CisjdW5kZWYgUGl4bWFwCisjdW5kZWYgQ3Vyc29yCisjdW5kZWYgQ29sb3JtYXAKKyN1bmRlZiBHQ29udGV4dAorI3VuZGVmIEF0b20KKyN1bmRlZiBWaXN1YWxJRAorI3VuZGVmIFRpbWUKKyN1bmRlZiBLZXlDb2RlCisjdW5kZWYgS2V5U3ltCisKKyNlbmRpZiAvKiBYUFJPVE9fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHByb3Rvc3RyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YcHJvdG9zdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWU4NTRkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHByb3Rvc3RyLmgKQEAgLTAsMCArMSw3NyBAQAorI2lmbmRlZiBYUFJPVE9TVFJVQ1RTX0gKKyNkZWZpbmUgWFBST1RPU1RSVUNUU19ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4NywgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworCitDb3B5cmlnaHQgMTk4NyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cy4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBEaWdpdGFsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICAKKworRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPFgxMS9YbWQuaD4KKworLyogVXNlZCBieSBQb2x5U2VnbWVudCAqLworCit0eXBlZGVmIHN0cnVjdCBfeFNlZ21lbnQgeworICAgIElOVDE2IHgxIEIxNiwgeTEgQjE2LCB4MiBCMTYsIHkyIEIxNjsKK30geFNlZ21lbnQ7CisKKy8qIFBPSU5UICovCisKK3R5cGVkZWYgc3RydWN0IF94UG9pbnQgeworCUlOVDE2CQl4IEIxNiwgeSBCMTY7Cit9IHhQb2ludDsKKwordHlwZWRlZiBzdHJ1Y3QgX3hSZWN0YW5nbGUgeworICAgIElOVDE2IHggQjE2LCB5IEIxNjsKKyAgICBDQVJEMTYgIHdpZHRoIEIxNiwgaGVpZ2h0IEIxNjsKK30geFJlY3RhbmdsZTsKKworLyogIEFSQyAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX3hBcmMgeworICAgIElOVDE2IHggQjE2LCB5IEIxNjsKKyAgICBDQVJEMTYgICB3aWR0aCBCMTYsIGhlaWdodCBCMTY7CisgICAgSU5UMTYgICBhbmdsZTEgQjE2LCBhbmdsZTIgQjE2OworfSB4QXJjOworCisjZW5kaWYgLyogWFBST1RPU1RSVUNUU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YcmVnaW9uLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YcmVnaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI1ZDcwYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hyZWdpb24uaApAQCAtMCwwICsxLDE4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4NywgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworCitDb3B5cmlnaHQgMTk4NyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cy4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKK3Byb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKK2JvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBEaWdpdGFsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisKK0RJR0lUQUwgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORworQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCitESUdJVEFMIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgorQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLAorQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfWDExX1hSRUdJT05fSF8KKyNkZWZpbmUgX1gxMV9YUkVHSU9OX0hfCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzaG9ydCB4MSwgeDIsIHkxLCB5MjsKK30gQm94LCBCT1gsIEJveFJlYywgKkJveFB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHNob3J0IHgsIHksIHdpZHRoLCBoZWlnaHQ7Cit9UkVDVEFOR0xFLCBSZWN0YW5nbGVSZWMsICpSZWN0YW5nbGVQdHI7CisKKyNkZWZpbmUgVFJVRSAxCisjZGVmaW5lIEZBTFNFIDAKKyNkZWZpbmUgTUFYU0hPUlQgMzI3NjcKKyNkZWZpbmUgTUlOU0hPUlQgLU1BWFNIT1JUCisjaWZuZGVmIE1BWAorI2RlZmluZSBNQVgoYSxiKSAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCisjZW5kaWYKKyNpZm5kZWYgTUlOCisjZGVmaW5lIE1JTihhLGIpICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKyNlbmRpZgorCisKKy8qCisgKiAgIGNsaXAgcmVnaW9uCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1hSZWdpb24geworICAgIGxvbmcgc2l6ZTsKKyAgICBsb25nIG51bVJlY3RzOworICAgIEJPWCAqcmVjdHM7CisgICAgQk9YIGV4dGVudHM7Cit9IFJFR0lPTjsKKworLyogWHV0aWwuaCBjb250YWlucyB0aGUgZGVjbGFyYXRpb246CisgKiB0eXBlZGVmIHN0cnVjdCBfWFJlZ2lvbiAqUmVnaW9uOworICovCisKKy8qICAxIGlmIHR3byBCT1hzIG92ZXJsYXAuCisgKiAgMCBpZiB0d28gQk9YcyBkbyBub3Qgb3ZlcmxhcC4KKyAqICBSZW1lbWJlciwgeDIgYW5kIHkyIGFyZSBub3QgaW4gdGhlIHJlZ2lvbgorICovCisjZGVmaW5lIEVYVEVOVENIRUNLKHIxLCByMikgXAorCSgocjEpLT54MiA+IChyMiktPngxICYmIFwKKwkgKHIxKS0+eDEgPCAocjIpLT54MiAmJiBcCisJIChyMSktPnkyID4gKHIyKS0+eTEgJiYgXAorCSAocjEpLT55MSA8IChyMiktPnkyKQorCisvKgorICogIHVwZGF0ZSByZWdpb24gZXh0ZW50cworICovCisjZGVmaW5lIEVYVEVOVFMocixpZFJlY3Qpe1wKKyAgICAgICAgICAgIGlmKChyKS0+eDEgPCAoaWRSZWN0KS0+ZXh0ZW50cy54MSlcCisgICAgICAgICAgICAgIChpZFJlY3QpLT5leHRlbnRzLngxID0gKHIpLT54MTtcCisgICAgICAgICAgICBpZigociktPnkxIDwgKGlkUmVjdCktPmV4dGVudHMueTEpXAorICAgICAgICAgICAgICAoaWRSZWN0KS0+ZXh0ZW50cy55MSA9IChyKS0+eTE7XAorICAgICAgICAgICAgaWYoKHIpLT54MiA+IChpZFJlY3QpLT5leHRlbnRzLngyKVwKKyAgICAgICAgICAgICAgKGlkUmVjdCktPmV4dGVudHMueDIgPSAociktPngyO1wKKyAgICAgICAgICAgIGlmKChyKS0+eTIgPiAoaWRSZWN0KS0+ZXh0ZW50cy55MilcCisgICAgICAgICAgICAgIChpZFJlY3QpLT5leHRlbnRzLnkyID0gKHIpLT55MjtcCisgICAgICAgIH0KKworLyoKKyAqICAgQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGVub3VnaCBtZW1vcnkgaW4gdGhlIHByZXNlbnQgcmVnaW9uLgorICovCisjZGVmaW5lIE1FTUNIRUNLKHJlZywgcmVjdCwgZmlyc3RyZWN0KXtcCisgICAgICAgIGlmICgocmVnKS0+bnVtUmVjdHMgPj0gKChyZWcpLT5zaXplIC0gMSkpe1wKKyAgICAgICAgICAoZmlyc3RyZWN0KSA9IChCT1ggKikgWHJlYWxsb2MgXAorICAgICAgICAgICgoY2hhciAqKShmaXJzdHJlY3QpLCAodW5zaWduZWQpICgyICogKHNpemVvZihCT1gpKSAqICgocmVnKS0+c2l6ZSkpKTtcCisgICAgICAgICAgaWYgKChmaXJzdHJlY3QpID09IDApXAorICAgICAgICAgICAgcmV0dXJuKDApO1wKKyAgICAgICAgICAocmVnKS0+c2l6ZSAqPSAyO1wKKyAgICAgICAgICAocmVjdCkgPSAmKGZpcnN0cmVjdClbKHJlZyktPm51bVJlY3RzXTtcCisgICAgICAgICB9XAorICAgICAgIH0KKworLyogIHRoaXMgcm91dGluZSBjaGVja3MgdG8gc2VlIGlmIHRoZSBwcmV2aW91cyByZWN0YW5nbGUgaXMgdGhlIHNhbWUKKyAqICBvciBzdWJzdW1lcyB0aGUgbmV3IHJlY3RhbmdsZSB0byBhZGQuCisgKi8KKworI2RlZmluZSBDSEVDS19QUkVWSU9VUyhSZWcsIFIsIFJ4MSwgUnkxLCBSeDIsIFJ5MilcCisgICAgICAgICAgICAgICAoISgoKFJlZyktPm51bVJlY3RzID4gMCkmJlwKKyAgICAgICAgICAgICAgICAgICgoUi0xKS0+eTEgPT0gKFJ5MSkpICYmXAorICAgICAgICAgICAgICAgICAgKChSLTEpLT55MiA9PSAoUnkyKSkgJiZcCisgICAgICAgICAgICAgICAgICAoKFItMSktPngxIDw9IChSeDEpKSAmJlwKKyAgICAgICAgICAgICAgICAgICgoUi0xKS0+eDIgPj0gKFJ4MikpKSkKKworLyogIGFkZCBhIHJlY3RhbmdsZSB0byB0aGUgZ2l2ZW4gUmVnaW9uICovCisjZGVmaW5lIEFERFJFQ1QocmVnLCByLCByeDEsIHJ5MSwgcngyLCByeTIpe1wKKyAgICBpZiAoKChyeDEpIDwgKHJ4MikpICYmICgocnkxKSA8IChyeTIpKSAmJlwKKyAgICAgICAgQ0hFQ0tfUFJFVklPVVMoKHJlZyksIChyKSwgKHJ4MSksIChyeTEpLCAocngyKSwgKHJ5MikpKXtcCisgICAgICAgICAgICAgIChyKS0+eDEgPSAocngxKTtcCisgICAgICAgICAgICAgIChyKS0+eTEgPSAocnkxKTtcCisgICAgICAgICAgICAgIChyKS0+eDIgPSAocngyKTtcCisgICAgICAgICAgICAgIChyKS0+eTIgPSAocnkyKTtcCisgICAgICAgICAgICAgIEVYVEVOVFMoKHIpLCAocmVnKSk7XAorICAgICAgICAgICAgICAocmVnKS0+bnVtUmVjdHMrKztcCisgICAgICAgICAgICAgIChyKSsrO1wKKyAgICAgICAgICAgIH1cCisgICAgICAgIH0KKworCisKKy8qICBhZGQgYSByZWN0YW5nbGUgdG8gdGhlIGdpdmVuIFJlZ2lvbiAqLworI2RlZmluZSBBRERSRUNUTk9YKHJlZywgciwgcngxLCByeTEsIHJ4MiwgcnkyKXtcCisgICAgICAgICAgICBpZiAoKHJ4MSA8IHJ4MikgJiYgKHJ5MSA8IHJ5MikgJiZcCisgICAgICAgICAgICAgICAgQ0hFQ0tfUFJFVklPVVMoKHJlZyksIChyKSwgKHJ4MSksIChyeTEpLCAocngyKSwgKHJ5MikpKXtcCisgICAgICAgICAgICAgIChyKS0+eDEgPSAocngxKTtcCisgICAgICAgICAgICAgIChyKS0+eTEgPSAocnkxKTtcCisgICAgICAgICAgICAgIChyKS0+eDIgPSAocngyKTtcCisgICAgICAgICAgICAgIChyKS0+eTIgPSAocnkyKTtcCisgICAgICAgICAgICAgIChyZWcpLT5udW1SZWN0cysrO1wKKyAgICAgICAgICAgICAgKHIpKys7XAorICAgICAgICAgICAgfVwKKyAgICAgICAgfQorCisjZGVmaW5lIEVNUFRZX1JFR0lPTihwUmVnKSBwUmVnLT5udW1SZWN0cyA9IDAKKworI2RlZmluZSBSRUdJT05fTk9UX0VNUFRZKHBSZWcpIHBSZWctPm51bVJlY3RzCisKKyNkZWZpbmUgSU5CT1gociwgeCwgeSkgXAorICAgICAgKCAoICgocikueDIgPiAgeCkpICYmIFwKKyAgICAgICAgKCAoKHIpLngxIDw9IHgpKSAmJiBcCisgICAgICAgICggKChyKS55MiA+ICB5KSkgJiYgXAorICAgICAgICAoICgocikueTEgPD0geSkpICkKKworLyoKKyAqIG51bWJlciBvZiBwb2ludHMgdG8gYnVmZmVyIGJlZm9yZSBzZW5kaW5nIHRoZW0gb2ZmCisgKiB0byBzY2FubGluZXMoKSA6ICBNdXN0IGJlIGFuIGV2ZW4gbnVtYmVyCisgKi8KKyNkZWZpbmUgTlVNUFRTVE9CVUZGRVIgMjAwCisKKy8qCisgKiB1c2VkIHRvIGFsbG9jYXRlIGJ1ZmZlcnMgZm9yIHBvaW50cyBhbmQgbGluaworICogdGhlIGJ1ZmZlcnMgdG9nZXRoZXIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX1BPSU5UQkxPQ0sgeworICAgIFhQb2ludCBwdHNbTlVNUFRTVE9CVUZGRVJdOworICAgIHN0cnVjdCBfUE9JTlRCTE9DSyAqbmV4dDsKK30gUE9JTlRCTE9DSzsKKworI2VuZGlmIC8qIF9YMTFfWFJFR0lPTl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHJlc291cmNlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YcmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGJiM2NlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHJlc291cmNlLmgKQEAgLTAsMCArMSwzNTggQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg3LCAxOTg4LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisKK0NvcHlyaWdodCAxOTg3LCAxOTg4IGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLgorCisgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIERpZ2l0YWwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK3NvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKworRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9YMTFfWFJFU09VUkNFX0hfCisjZGVmaW5lIF9YMTFfWFJFU09VUkNFX0hfCisKKyNpZm5kZWYgX1hQX1BSSU5UX1NFUlZFUl8KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioKKyAqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqCisgKioqICAgICAgICAgIFggUmVzb3VyY2UgTWFuYWdlciBJbnRyaW5zaWNzICAgICAgICAgICAgICAgICAgICoqKgorICoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioKKyAqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK19YRlVOQ1BST1RPQkVHSU4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNZW1vcnkgTWFuYWdlbWVudAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitleHRlcm4gY2hhciAqWHBlcm1hbGxvYygKKyAgICB1bnNpZ25lZCBpbnQJLyogc2l6ZSAqLworKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBRdWFyayBNYW5hZ2VtZW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgaW50ICAgICAgIFhybVF1YXJrLCAqWHJtUXVhcmtMaXN0OworI2RlZmluZSBOVUxMUVVBUksgKChYcm1RdWFyaykgMCkKKwordHlwZWRlZiBjaGFyICpYcm1TdHJpbmc7CisjZGVmaW5lIE5VTExTVFJJTkcgKChYcm1TdHJpbmcpIDApCisKKy8qIGZpbmQgcXVhcmsgZm9yIHN0cmluZywgY3JlYXRlIG5ldyBxdWFyayBpZiBub25lIGFscmVhZHkgZXhpc3RzICovCitleHRlcm4gWHJtUXVhcmsgWHJtU3RyaW5nVG9RdWFyaygKKyAgICBfWGNvbnN0IGNoYXIqIAkvKiBzdHJpbmcgKi8KKyk7CisKK2V4dGVybiBYcm1RdWFyayBYcm1QZXJtU3RyaW5nVG9RdWFyaygKKyAgICBfWGNvbnN0IGNoYXIqIAkvKiBzdHJpbmcgKi8KKyk7CisKKy8qIGZpbmQgc3RyaW5nIGZvciBxdWFyayAqLworZXh0ZXJuIFhybVN0cmluZyBYcm1RdWFya1RvU3RyaW5nKAorICAgIFhybVF1YXJrIAkJLyogcXVhcmsgKi8KKyk7CisKK2V4dGVybiBYcm1RdWFyayBYcm1VbmlxdWVRdWFyaygKKyAgICB2b2lkCispOworCisjZGVmaW5lIFhybVN0cmluZ3NFcXVhbChhMSwgYTIpIChzdHJjbXAoYTEsIGEyKSA9PSAwKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29udmVyc2lvbiBvZiBTdHJpbmdzIHRvIExpc3RzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgZW51bSB7WHJtQmluZFRpZ2h0bHksIFhybUJpbmRMb29zZWx5fSBYcm1CaW5kaW5nLCAqWHJtQmluZGluZ0xpc3Q7CisKK2V4dGVybiB2b2lkIFhybVN0cmluZ1RvUXVhcmtMaXN0KAorICAgIF9YY29uc3QgY2hhcioJLyogc3RyaW5nICovLAorICAgIFhybVF1YXJrTGlzdAkvKiBxdWFya3NfcmV0dXJuICovCispOworCitleHRlcm4gdm9pZCBYcm1TdHJpbmdUb0JpbmRpbmdRdWFya0xpc3QoCisgICAgX1hjb25zdCBjaGFyKgkvKiBzdHJpbmcgKi8sCisgICAgWHJtQmluZGluZ0xpc3QJLyogYmluZGluZ3NfcmV0dXJuICovLAorICAgIFhybVF1YXJrTGlzdAkvKiBxdWFya3NfcmV0dXJuICovCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWUgYW5kIENsYXNzIGxpc3RzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIFhybVF1YXJrICAgICBYcm1OYW1lOwordHlwZWRlZiBYcm1RdWFya0xpc3QgWHJtTmFtZUxpc3Q7CisjZGVmaW5lIFhybU5hbWVUb1N0cmluZyhuYW1lKQkJWHJtUXVhcmtUb1N0cmluZyhuYW1lKQorI2RlZmluZSBYcm1TdHJpbmdUb05hbWUoc3RyaW5nKQkJWHJtU3RyaW5nVG9RdWFyayhzdHJpbmcpCisjZGVmaW5lIFhybVN0cmluZ1RvTmFtZUxpc3Qoc3RyLCBuYW1lKQlYcm1TdHJpbmdUb1F1YXJrTGlzdChzdHIsIG5hbWUpCisKK3R5cGVkZWYgWHJtUXVhcmsgICAgIFhybUNsYXNzOwordHlwZWRlZiBYcm1RdWFya0xpc3QgWHJtQ2xhc3NMaXN0OworI2RlZmluZSBYcm1DbGFzc1RvU3RyaW5nKGNfY2xhc3MpCVhybVF1YXJrVG9TdHJpbmcoY19jbGFzcykKKyNkZWZpbmUgWHJtU3RyaW5nVG9DbGFzcyhjX2NsYXNzKQlYcm1TdHJpbmdUb1F1YXJrKGNfY2xhc3MpCisjZGVmaW5lIFhybVN0cmluZ1RvQ2xhc3NMaXN0KHN0cixjX2NsYXNzKSBYcm1TdHJpbmdUb1F1YXJrTGlzdChzdHIsIGNfY2xhc3MpCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJlc291cmNlIFJlcHJlc2VudGF0aW9uIFR5cGVzIGFuZCBWYWx1ZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBYcm1RdWFyayAgICAgWHJtUmVwcmVzZW50YXRpb247CisjZGVmaW5lIFhybVN0cmluZ1RvUmVwcmVzZW50YXRpb24oc3RyaW5nKSAgIFhybVN0cmluZ1RvUXVhcmsoc3RyaW5nKQorI2RlZmluZQlYcm1SZXByZXNlbnRhdGlvblRvU3RyaW5nKHR5cGUpICAgWHJtUXVhcmtUb1N0cmluZyh0eXBlKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgaW50ICAgIHNpemU7CisgICAgWFBvaW50ZXIJICAgIGFkZHI7Cit9IFhybVZhbHVlLCAqWHJtVmFsdWVQdHI7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSZXNvdXJjZSBNYW5hZ2VyIEZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfWHJtSGFzaEJ1Y2tldFJlYyAqWHJtSGFzaEJ1Y2tldDsKK3R5cGVkZWYgWHJtSGFzaEJ1Y2tldCAqWHJtSGFzaFRhYmxlOwordHlwZWRlZiBYcm1IYXNoVGFibGUgWHJtU2VhcmNoTGlzdFtdOwordHlwZWRlZiBzdHJ1Y3QgX1hybUhhc2hCdWNrZXRSZWMgKlhybURhdGFiYXNlOworCisKK2V4dGVybiB2b2lkIFhybURlc3Ryb3lEYXRhYmFzZSgKKyAgICBYcm1EYXRhYmFzZQkJLyogZGF0YWJhc2UgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhybVFQdXRSZXNvdXJjZSgKKyAgICBYcm1EYXRhYmFzZSoJLyogZGF0YWJhc2UgKi8sCisgICAgWHJtQmluZGluZ0xpc3QJLyogYmluZGluZ3MgKi8sCisgICAgWHJtUXVhcmtMaXN0CS8qIHF1YXJrcyAqLywKKyAgICBYcm1SZXByZXNlbnRhdGlvbgkvKiB0eXBlICovLAorICAgIFhybVZhbHVlKgkJLyogdmFsdWUgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhybVB1dFJlc291cmNlKAorICAgIFhybURhdGFiYXNlKgkvKiBkYXRhYmFzZSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHNwZWNpZmllciAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHR5cGUgKi8sCisgICAgWHJtVmFsdWUqCQkvKiB2YWx1ZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWHJtUVB1dFN0cmluZ1Jlc291cmNlKAorICAgIFhybURhdGFiYXNlKgkvKiBkYXRhYmFzZSAqLywKKyAgICBYcm1CaW5kaW5nTGlzdCAgICAgIC8qIGJpbmRpbmdzICovLAorICAgIFhybVF1YXJrTGlzdAkvKiBxdWFya3MgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB2YWx1ZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWHJtUHV0U3RyaW5nUmVzb3VyY2UoCisgICAgWHJtRGF0YWJhc2UqCS8qIGRhdGFiYXNlICovLAorICAgIF9YY29uc3QgY2hhcioJLyogc3BlY2lmaWVyICovLAorICAgIF9YY29uc3QgY2hhcioJLyogdmFsdWUgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhybVB1dExpbmVSZXNvdXJjZSgKKyAgICBYcm1EYXRhYmFzZSoJLyogZGF0YWJhc2UgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBsaW5lICovCispOworCitleHRlcm4gQm9vbCBYcm1RR2V0UmVzb3VyY2UoCisgICAgWHJtRGF0YWJhc2UJCS8qIGRhdGFiYXNlICovLAorICAgIFhybU5hbWVMaXN0CQkvKiBxdWFya19uYW1lICovLAorICAgIFhybUNsYXNzTGlzdAkvKiBxdWFya19jbGFzcyAqLywKKyAgICBYcm1SZXByZXNlbnRhdGlvbioJLyogcXVhcmtfdHlwZV9yZXR1cm4gKi8sCisgICAgWHJtVmFsdWUqCQkvKiB2YWx1ZV9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBCb29sIFhybUdldFJlc291cmNlKAorICAgIFhybURhdGFiYXNlCQkvKiBkYXRhYmFzZSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHN0cl9uYW1lICovLAorICAgIF9YY29uc3QgY2hhcioJLyogc3RyX2NsYXNzICovLAorICAgIGNoYXIqKgkJLyogc3RyX3R5cGVfcmV0dXJuICovLAorICAgIFhybVZhbHVlKgkJLyogdmFsdWVfcmV0dXJuICovCispOworCitleHRlcm4gQm9vbCBYcm1RR2V0U2VhcmNoTGlzdCgKKyAgICBYcm1EYXRhYmFzZQkJLyogZGF0YWJhc2UgKi8sCisgICAgWHJtTmFtZUxpc3QJCS8qIG5hbWVzICovLAorICAgIFhybUNsYXNzTGlzdAkvKiBjbGFzc2VzICovLAorICAgIFhybVNlYXJjaExpc3QJLyogbGlzdF9yZXR1cm4gKi8sCisgICAgaW50CQkJLyogbGlzdF9sZW5ndGggKi8KKyk7CisKK2V4dGVybiBCb29sIFhybVFHZXRTZWFyY2hSZXNvdXJjZSgKKyAgICBYcm1TZWFyY2hMaXN0CS8qIGxpc3QgKi8sCisgICAgWHJtTmFtZQkJLyogbmFtZSAqLywKKyAgICBYcm1DbGFzcwkJLyogY2xhc3MgKi8sCisgICAgWHJtUmVwcmVzZW50YXRpb24qCS8qIHR5cGVfcmV0dXJuICovLAorICAgIFhybVZhbHVlKgkJLyogdmFsdWVfcmV0dXJuICovCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJlc291cmNlIERhdGFiYXNlIE1hbmFnZW1lbnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfWFBfUFJJTlRfU0VSVkVSXworCitleHRlcm4gdm9pZCBYcm1TZXREYXRhYmFzZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYcm1EYXRhYmFzZQkJLyogZGF0YWJhc2UgKi8KKyk7CisKK2V4dGVybiBYcm1EYXRhYmFzZSBYcm1HZXREYXRhYmFzZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworI2VuZGlmIC8qICFfWFBfUFJJTlRfU0VSVkVSXyAqLworCitleHRlcm4gWHJtRGF0YWJhc2UgWHJtR2V0RmlsZURhdGFiYXNlKAorICAgIF9YY29uc3QgY2hhcioJLyogZmlsZW5hbWUgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWHJtQ29tYmluZUZpbGVEYXRhYmFzZSgKKyAgICBfWGNvbnN0IGNoYXIqIAkvKiBmaWxlbmFtZSAqLywKKyAgICBYcm1EYXRhYmFzZSoJLyogdGFyZ2V0ICovLAorICAgIEJvb2wJCS8qIG92ZXJyaWRlICovCispOworCitleHRlcm4gWHJtRGF0YWJhc2UgWHJtR2V0U3RyaW5nRGF0YWJhc2UoCisgICAgX1hjb25zdCBjaGFyKgkvKiBkYXRhICovICAvKiAgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyAqLworKTsKKworZXh0ZXJuIHZvaWQgWHJtUHV0RmlsZURhdGFiYXNlKAorICAgIFhybURhdGFiYXNlCQkvKiBkYXRhYmFzZSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGZpbGVuYW1lICovCispOworCitleHRlcm4gdm9pZCBYcm1NZXJnZURhdGFiYXNlcygKKyAgICBYcm1EYXRhYmFzZQkJLyogc291cmNlX2RiICovLAorICAgIFhybURhdGFiYXNlKgkvKiB0YXJnZXRfZGIgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhybUNvbWJpbmVEYXRhYmFzZSgKKyAgICBYcm1EYXRhYmFzZQkJLyogc291cmNlX2RiICovLAorICAgIFhybURhdGFiYXNlKgkvKiB0YXJnZXRfZGIgKi8sCisgICAgQm9vbAkJLyogb3ZlcnJpZGUgKi8KKyk7CisKKyNkZWZpbmUgWHJtRW51bUFsbExldmVscyAwCisjZGVmaW5lIFhybUVudW1PbmVMZXZlbCAgMQorCitleHRlcm4gQm9vbCBYcm1FbnVtZXJhdGVEYXRhYmFzZSgKKyAgICBYcm1EYXRhYmFzZQkJLyogZGIgKi8sCisgICAgWHJtTmFtZUxpc3QJCS8qIG5hbWVfcHJlZml4ICovLAorICAgIFhybUNsYXNzTGlzdAkvKiBjbGFzc19wcmVmaXggKi8sCisgICAgaW50CQkJLyogbW9kZSAqLywKKyAgICBCb29sICgqKSgKKwkgICAgIFhybURhdGFiYXNlKgkvKiBkYiAqLywKKwkgICAgIFhybUJpbmRpbmdMaXN0CS8qIGJpbmRpbmdzICovLAorCSAgICAgWHJtUXVhcmtMaXN0CS8qIHF1YXJrcyAqLywKKwkgICAgIFhybVJlcHJlc2VudGF0aW9uKgkvKiB0eXBlICovLAorCSAgICAgWHJtVmFsdWUqCQkvKiB2YWx1ZSAqLywKKwkgICAgIFhQb2ludGVyCQkvKiBjbG9zdXJlICovCisJICAgICApCQkvKiBwcm9jICovLAorICAgIFhQb2ludGVyCQkvKiBjbG9zdXJlICovCispOworCitleHRlcm4gY29uc3QgY2hhciAqWHJtTG9jYWxlT2ZEYXRhYmFzZSgKKyAgICBYcm1EYXRhYmFzZSAJLyogZGF0YWJhc2UgKi8KKyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb21tYW5kIGxpbmUgb3B0aW9uIG1hcHBpbmcgdG8gcmVzb3VyY2UgZW50cmllcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIGVudW0geworICAgIFhybW9wdGlvbk5vQXJnLAkvKiBWYWx1ZSBpcyBzcGVjaWZpZWQgaW4gT3B0aW9uRGVzY1JlYy52YWx1ZQkgICAgKi8KKyAgICBYcm1vcHRpb25Jc0FyZywgICAgIC8qIFZhbHVlIGlzIHRoZSBvcHRpb24gc3RyaW5nIGl0c2VsZgkJICAgICovCisgICAgWHJtb3B0aW9uU3RpY2t5QXJnLCAvKiBWYWx1ZSBpcyBjaGFyYWN0ZXJzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBvcHRpb24gKi8KKyAgICBYcm1vcHRpb25TZXBBcmcsICAgIC8qIFZhbHVlIGlzIG5leHQgYXJndW1lbnQgaW4gYXJndgkJICAgICovCisgICAgWHJtb3B0aW9uUmVzQXJnLAkvKiBSZXNvdXJjZSBhbmQgdmFsdWUgaW4gbmV4dCBhcmd1bWVudCBpbiBhcmd2ICAgICAgKi8KKyAgICBYcm1vcHRpb25Ta2lwQXJnLCAgIC8qIElnbm9yZSB0aGlzIG9wdGlvbiBhbmQgdGhlIG5leHQgYXJndW1lbnQgaW4gYXJndiAqLworICAgIFhybW9wdGlvblNraXBMaW5lLCAgLyogSWdub3JlIHRoaXMgb3B0aW9uIGFuZCB0aGUgcmVzdCBvZiBhcmd2CSAgICAqLworICAgIFhybW9wdGlvblNraXBOQXJncwkvKiBJZ25vcmUgdGhpcyBvcHRpb24gYW5kIHRoZSBuZXh0CisJCQkgICBPcHRpb25EZXNjUmVzLnZhbHVlIGFyZ3VtZW50cyBpbiBhcmd2ICovCit9IFhybU9wdGlvbktpbmQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyCSAgICAqb3B0aW9uOwkgICAgLyogT3B0aW9uIGFiYnJldmlhdGlvbiBpbiBhcmd2CSAgICAqLworICAgIGNoYXIJICAgICpzcGVjaWZpZXI7ICAgICAvKiBSZXNvdXJjZSBzcGVjaWZpZXIJCSAgICAqLworICAgIFhybU9wdGlvbktpbmQgICBhcmdLaW5kOwkgICAgLyogV2hpY2ggc3R5bGUgb2Ygb3B0aW9uIGl0IGlzCSAgICAqLworICAgIFhQb2ludGVyCSAgICB2YWx1ZTsJICAgIC8qIFZhbHVlIHRvIHByb3ZpZGUgaWYgWHJtb3B0aW9uTm9BcmcgICAqLworfSBYcm1PcHRpb25EZXNjUmVjLCAqWHJtT3B0aW9uRGVzY0xpc3Q7CisKKworZXh0ZXJuIHZvaWQgWHJtUGFyc2VDb21tYW5kKAorICAgIFhybURhdGFiYXNlKgkvKiBkYXRhYmFzZSAqLywKKyAgICBYcm1PcHRpb25EZXNjTGlzdAkvKiB0YWJsZSAqLywKKyAgICBpbnQJCQkvKiB0YWJsZV9jb3VudCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIG5hbWUgKi8sCisgICAgaW50KgkJLyogYXJnY19pbl9vdXQgKi8sCisgICAgY2hhcioqCQkvKiBhcmd2X2luX291dCAqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9YMTFfWFJFU09VUkNFX0hfICovCisvKiBET04nVCBBREQgU1RVRkYgQUZURVIgVEhJUyAjZW5kaWYgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1h0aHJlYWRzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YdGhyZWFkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNDQyMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YdGhyZWFkcy5oCkBAIC0wLDAgKzEsMzEzIEBACisvKgorICoKK0NvcHlyaWdodCAxOTkzLCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorICogKgorICovCisKKyNpZm5kZWYgX1hUSFJFQURTX0hfCisjIGRlZmluZSBfWFRIUkVBRFNfSF8KKworLyogUmVkZWZpbmUgdGhlc2UgdG8gWHRNYWxsb2MvWHRGcmVlIG9yIHdoYXRldmVyIHlvdSB3YW50IGJlZm9yZSBpbmNsdWRpbmcKKyAqIHRoaXMgaGVhZGVyIGZpbGUuCisgKi8KKyMgaWZuZGVmIHhtYWxsb2MKKyMgIGRlZmluZSB4bWFsbG9jIG1hbGxvYworIyBlbmRpZgorIyBpZm5kZWYgeGZyZWUKKyMgIGRlZmluZSB4ZnJlZSBmcmVlCisjIGVuZGlmCisKKyMgaWZkZWYgQ1RIUkVBRFMKKyMgIGluY2x1ZGUgPGN0aHJlYWRzLmg+Cit0eXBlZGVmIGN0aHJlYWRfdCB4dGhyZWFkX3Q7Cit0eXBlZGVmIHN0cnVjdCBjb25kaXRpb24geGNvbmRpdGlvbl9yZWM7Cit0eXBlZGVmIHN0cnVjdCBtdXRleCB4bXV0ZXhfcmVjOworIyAgZGVmaW5lIHh0aHJlYWRfaW5pdCgpIGN0aHJlYWRfaW5pdCgpCisjICBkZWZpbmUgeHRocmVhZF9zZWxmIGN0aHJlYWRfc2VsZgorIyAgZGVmaW5lIHh0aHJlYWRfZm9yayhmdW5jLGNsb3N1cmUpIGN0aHJlYWRfZm9yayhmdW5jLGNsb3N1cmUpCisjICBkZWZpbmUgeHRocmVhZF95aWVsZCgpIGN0aHJlYWRfeWllbGQoKQorIyAgZGVmaW5lIHh0aHJlYWRfZXhpdCh2KSBjdGhyZWFkX2V4aXQodikKKyMgIGRlZmluZSB4dGhyZWFkX3NldF9uYW1lKHQsc3RyKSBjdGhyZWFkX3NldF9uYW1lKHQsc3RyKQorIyAgZGVmaW5lIHhtdXRleF9pbml0KG0pIG11dGV4X2luaXQobSkKKyMgIGRlZmluZSB4bXV0ZXhfY2xlYXIobSkgbXV0ZXhfY2xlYXIobSkKKyMgIGRlZmluZSB4bXV0ZXhfbG9jayhtKSBtdXRleF9sb2NrKG0pCisjICBkZWZpbmUgeG11dGV4X3VubG9jayhtKSBtdXRleF91bmxvY2sobSkKKyMgIGRlZmluZSB4bXV0ZXhfc2V0X25hbWUobSxzdHIpIG11dGV4X3NldF9uYW1lKG0sc3RyKQorIyAgZGVmaW5lIHhjb25kaXRpb25faW5pdChjdikgY29uZGl0aW9uX2luaXQoY3YpCisjICBkZWZpbmUgeGNvbmRpdGlvbl9jbGVhcihjdikgY29uZGl0aW9uX2NsZWFyKGN2KQorIyAgZGVmaW5lIHhjb25kaXRpb25fd2FpdChjdixtKSBjb25kaXRpb25fd2FpdChjdixtKQorIyAgZGVmaW5lIHhjb25kaXRpb25fc2lnbmFsKGN2KSBjb25kaXRpb25fc2lnbmFsKGN2KQorIyAgZGVmaW5lIHhjb25kaXRpb25fYnJvYWRjYXN0KGN2KSBjb25kaXRpb25fYnJvYWRjYXN0KGN2KQorIyAgZGVmaW5lIHhjb25kaXRpb25fc2V0X25hbWUoY3Ysc3RyKSBjb25kaXRpb25fc2V0X25hbWUoY3Ysc3RyKQorIyBlbHNlIC8qICFDVEhSRUFEUyAqLworIyAgaWYgZGVmaW5lZChTVlI0KQorIyAgIGluY2x1ZGUgPHRocmVhZC5oPgorIyAgIGluY2x1ZGUgPHN5bmNoLmg+Cit0eXBlZGVmIHRocmVhZF90IHh0aHJlYWRfdDsKK3R5cGVkZWYgdGhyZWFkX2tleV90IHh0aHJlYWRfa2V5X3Q7Cit0eXBlZGVmIGNvbmRfdCB4Y29uZGl0aW9uX3JlYzsKK3R5cGVkZWYgbXV0ZXhfdCB4bXV0ZXhfcmVjOworIyAgIGlmIGRlZmluZWQoX19VTklYV0FSRV9fKQorZXh0ZXJuIHh0aHJlYWRfdCAoKl94MTFfdGhyX3NlbGYpKCk7CisjICAgIGRlZmluZSB4dGhyZWFkX3NlbGYgIChfeDExX3Rocl9zZWxmKQorIyAgIGVsc2UKKyMgICAgZGVmaW5lIHh0aHJlYWRfc2VsZiB0aHJfc2VsZgorIyAgIGVuZGlmCisjICAgZGVmaW5lIHh0aHJlYWRfZm9yayhmdW5jLGNsb3N1cmUpIHRocl9jcmVhdGUoTlVMTCwwLGZ1bmMsY2xvc3VyZSxUSFJfTkVXX0xXUHxUSFJfREVUQUNIRUQsTlVMTCkKKyMgICBkZWZpbmUgeHRocmVhZF95aWVsZCgpIHRocl95aWVsZCgpCisjICAgZGVmaW5lIHh0aHJlYWRfZXhpdCh2KSB0aHJfZXhpdCh2KQorIyAgIGRlZmluZSB4dGhyZWFkX2tleV9jcmVhdGUoa3AsZCkgdGhyX2tleWNyZWF0ZShrcCxkKQorIyAgIGlmZGVmIF9fc3VuCisjICAgIGRlZmluZSB4dGhyZWFkX2tleV9kZWxldGUoaykgMAorIyAgIGVsc2UKKyMgICAgZGVmaW5lIHh0aHJlYWRfa2V5X2RlbGV0ZShrKSB0aHJfa2V5ZGVsZXRlKGspCisjICAgZW5kaWYKKyMgICBkZWZpbmUgeHRocmVhZF9zZXRfc3BlY2lmaWMoayx2KSB0aHJfc2V0c3BlY2lmaWMoayx2KQorIyAgIGRlZmluZSB4dGhyZWFkX2dldF9zcGVjaWZpYyhrLHZwKSB0aHJfZ2V0c3BlY2lmaWMoayx2cCkKKyMgICBkZWZpbmUgeG11dGV4X2luaXQobSkgbXV0ZXhfaW5pdChtLFVTWU5DX1RIUkVBRCwwKQorIyAgIGRlZmluZSB4bXV0ZXhfY2xlYXIobSkgbXV0ZXhfZGVzdHJveShtKQorIyAgIGRlZmluZSB4bXV0ZXhfbG9jayhtKSBtdXRleF9sb2NrKG0pCisjICAgZGVmaW5lIHhtdXRleF91bmxvY2sobSkgbXV0ZXhfdW5sb2NrKG0pCisjICAgZGVmaW5lIHhjb25kaXRpb25faW5pdChjdikgY29uZF9pbml0KGN2LFVTWU5DX1RIUkVBRCwwKQorIyAgIGRlZmluZSB4Y29uZGl0aW9uX2NsZWFyKGN2KSBjb25kX2Rlc3Ryb3koY3YpCisjICAgZGVmaW5lIHhjb25kaXRpb25fd2FpdChjdixtKSBjb25kX3dhaXQoY3YsbSkKKyMgICBkZWZpbmUgeGNvbmRpdGlvbl9zaWduYWwoY3YpIGNvbmRfc2lnbmFsKGN2KQorIyAgIGRlZmluZSB4Y29uZGl0aW9uX2Jyb2FkY2FzdChjdikgY29uZF9icm9hZGNhc3QoY3YpCisjICBlbHNlIC8qICFTVlI0ICovCisjICAgaWZkZWYgV0lOMzIKKyMgICAgaW5jbHVkZSA8WDExL1h3aW5kb3dzLmg+Cit0eXBlZGVmIERXT1JEIHh0aHJlYWRfdDsKK3R5cGVkZWYgRFdPUkQgeHRocmVhZF9rZXlfdDsKK3N0cnVjdCBfeHRocmVhZF93YWl0ZXIgeworICAgIEhBTkRMRSBzZW07CisgICAgc3RydWN0IF94dGhyZWFkX3dhaXRlciAqbmV4dDsKK307Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ1JJVElDQUxfU0VDVElPTiBjczsKKyAgICBzdHJ1Y3QgX3h0aHJlYWRfd2FpdGVyICp3YWl0ZXJzOworfSB4Y29uZGl0aW9uX3JlYzsKK3R5cGVkZWYgQ1JJVElDQUxfU0VDVElPTiB4bXV0ZXhfcmVjOworIyAgICBkZWZpbmUgeHRocmVhZF9pbml0KCkgX1h0aHJlYWRfaW5pdCgpCisjICAgIGRlZmluZSB4dGhyZWFkX3NlbGYgR2V0Q3VycmVudFRocmVhZElkCisjICAgIGRlZmluZSB4dGhyZWFkX2ZvcmsoZnVuYyxjbG9zdXJlKSB7IFwKKyAgICBEV09SRCBfdG1wdGlkOyBcCisgICAgQ3JlYXRlVGhyZWFkKE5VTEwsIDAsIChMUFRIUkVBRF9TVEFSVF9ST1VUSU5FKWZ1bmMsIChMUFZPSUQpY2xvc3VyZSwgMCwgXAorCQkgJl90bXB0aWQpOyBcCit9CisjICAgIGRlZmluZSB4dGhyZWFkX3lpZWxkKCkgU2xlZXAoMCkKKyMgICAgZGVmaW5lIHh0aHJlYWRfZXhpdCh2KSBFeGl0VGhyZWFkKChEV09SRCkodikpCisjICAgIGRlZmluZSB4dGhyZWFkX2tleV9jcmVhdGUoa3AsZCkgKihrcCkgPSBUbHNBbGxvYygpCisjICAgIGRlZmluZSB4dGhyZWFkX2tleV9kZWxldGUoaykgVGxzRnJlZShrKQorIyAgICBkZWZpbmUgeHRocmVhZF9zZXRfc3BlY2lmaWMoayx2KSBUbHNTZXRWYWx1ZShrLHYpCisjICAgIGRlZmluZSB4dGhyZWFkX2dldF9zcGVjaWZpYyhrLHZwKSBUbHNHZXRWYWx1ZShrKQorIyAgICBkZWZpbmUgeG11dGV4X2luaXQobSkgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihtKQorIyAgICBkZWZpbmUgeG11dGV4X2NsZWFyKG0pIERlbGV0ZUNyaXRpY2FsU2VjdGlvbihtKQorIyAgICBkZWZpbmUgX1hNVVRFWF9ORVNUUworIyAgICBkZWZpbmUgeG11dGV4X2xvY2sobSkgRW50ZXJDcml0aWNhbFNlY3Rpb24obSkKKyMgICAgZGVmaW5lIHhtdXRleF91bmxvY2sobSkgTGVhdmVDcml0aWNhbFNlY3Rpb24obSkKKyMgICAgZGVmaW5lIHhjb25kaXRpb25faW5pdChjdikgeyBcCisgICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmKGN2KS0+Y3MpOyBcCisgICAgKGN2KS0+d2FpdGVycyA9IE5VTEw7IFwKK30KKyMgICAgZGVmaW5lIHhjb25kaXRpb25fY2xlYXIoY3YpIERlbGV0ZUNyaXRpY2FsU2VjdGlvbigmKGN2KS0+Y3MpCitleHRlcm4gc3RydWN0IF94dGhyZWFkX3dhaXRlciAqX1h0aHJlYWRfd2FpdGVyKCk7CisjICAgIGRlZmluZSB4Y29uZGl0aW9uX3dhaXQoY3YsbSkgeyBcCisgICAgc3RydWN0IF94dGhyZWFkX3dhaXRlciAqX3RtcHRociA9IF9YdGhyZWFkX3dhaXRlcigpOyBcCisgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJihjdiktPmNzKTsgXAorICAgIF90bXB0aHItPm5leHQgPSAoY3YpLT53YWl0ZXJzOyBcCisgICAgKGN2KS0+d2FpdGVycyA9IF90bXB0aHI7IFwKKyAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmKGN2KS0+Y3MpOyBcCisgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24obSk7IFwKKyAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KF90bXB0aHItPnNlbSwgSU5GSU5JVEUpOyBcCisgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24obSk7IFwKK30KKyMgICAgZGVmaW5lIHhjb25kaXRpb25fc2lnbmFsKGN2KSB7IFwKKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmKGN2KS0+Y3MpOyBcCisgICAgaWYgKChjdiktPndhaXRlcnMpIHsgXAorICAgICAgICBSZWxlYXNlU2VtYXBob3JlKChjdiktPndhaXRlcnMtPnNlbSwgMSwgTlVMTCk7IFwKKwkoY3YpLT53YWl0ZXJzID0gKGN2KS0+d2FpdGVycy0+bmV4dDsgXAorICAgIH0gXAorICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCYoY3YpLT5jcyk7IFwKK30KKyMgICAgZGVmaW5lIHhjb25kaXRpb25fYnJvYWRjYXN0KGN2KSB7IFwKKyAgICBzdHJ1Y3QgX3h0aHJlYWRfd2FpdGVyICpfdG1wdGhyOyBcCisgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJihjdiktPmNzKTsgXAorICAgIGZvciAoX3RtcHRociA9IChjdiktPndhaXRlcnM7IF90bXB0aHI7IF90bXB0aHIgPSBfdG1wdGhyLT5uZXh0KSBcCisJUmVsZWFzZVNlbWFwaG9yZShfdG1wdGhyLT5zZW0sIDEsIE5VTEwpOyBcCisgICAgKGN2KS0+d2FpdGVycyA9IE5VTEw7IFwKKyAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmKGN2KS0+Y3MpOyBcCit9CisjICAgZWxzZSAvKiAhV0lOMzIgKi8KKyMgICAgaWZkZWYgVVNFX1RJU19TVVBQT1JUCisvKgorICogVElTIHN1cHBvcnQgaXMgaW50ZW5kZWQgZm9yIHRocmVhZCBzYWZlIGxpYnJhcmllcy4KKyAqIFRoaXMgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBnZW5lcmFsIGNsaWVudCBwcm9ncmFtbWluZy4KKyAqLworIyAgICAgaW5jbHVkZSA8dGlzLmg+Cit0eXBlZGVmIHB0aHJlYWRfdCB4dGhyZWFkX3Q7Cit0eXBlZGVmIHB0aHJlYWRfa2V5X3QgeHRocmVhZF9rZXlfdDsKK3R5cGVkZWYgcHRocmVhZF9jb25kX3QgeGNvbmRpdGlvbl9yZWM7Cit0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCB4bXV0ZXhfcmVjOworIyAgICAgZGVmaW5lIHh0aHJlYWRfc2VsZiB0aXNfc2VsZgorIyAgICAgZGVmaW5lIHh0aHJlYWRfZm9yayhmdW5jLGNsb3N1cmUpIHsgcHRocmVhZF90IF90bXB4dGhyOyBcCisgICAgICAgIHB0aHJlYWRfY3JlYXRlKCZfdG1weHRocixOVUxMLGZ1bmMsY2xvc3VyZSk7IH0KKyMgICAgIGRlZmluZSB4dGhyZWFkX3lpZWxkKCkgcHRocmVhZF95aWVsZF9ucCgpCisjICAgICBkZWZpbmUgeHRocmVhZF9leGl0KHYpIHB0aHJlYWRfZXhpdCh2KQorIyAgICAgZGVmaW5lIHh0aHJlYWRfa2V5X2NyZWF0ZShrcCxkKSB0aXNfa2V5X2NyZWF0ZShrcCxkKQorIyAgICAgZGVmaW5lIHh0aHJlYWRfa2V5X2RlbGV0ZShrKSB0aXNfa2V5X2RlbGV0ZShrKQorIyAgICAgZGVmaW5lIHh0aHJlYWRfc2V0X3NwZWNpZmljKGssdikgdGlzX3NldHNwZWNpZmljKGssdikKKyMgICAgIGRlZmluZSB4dGhyZWFkX2dldF9zcGVjaWZpYyhrLHZwKSAqKHZwKSA9IHRpc19nZXRzcGVjaWZpYyhrKQorIyAgICAgZGVmaW5lIFhNVVRFWF9JTklUSUFMSVpFUiBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSCisjICAgICBkZWZpbmUgeG11dGV4X2luaXQobSkgdGlzX211dGV4X2luaXQobSkKKyMgICAgIGRlZmluZSB4bXV0ZXhfY2xlYXIobSkgdGlzX211dGV4X2Rlc3Ryb3kobSkKKyMgICAgIGRlZmluZSB4bXV0ZXhfbG9jayhtKSB0aXNfbXV0ZXhfbG9jayhtKQorIyAgICAgZGVmaW5lIHhtdXRleF91bmxvY2sobSkgdGlzX211dGV4X3VubG9jayhtKQorIyAgICAgZGVmaW5lIHhjb25kaXRpb25faW5pdChjKSB0aXNfY29uZF9pbml0KGMpCisjICAgICBkZWZpbmUgeGNvbmRpdGlvbl9jbGVhcihjKSB0aXNfY29uZF9kZXN0cm95KGMpCisjICAgICBkZWZpbmUgeGNvbmRpdGlvbl93YWl0KGMsbSkgdGlzX2NvbmRfd2FpdChjLG0pCisjICAgICBkZWZpbmUgeGNvbmRpdGlvbl9zaWduYWwoYykgdGlzX2NvbmRfc2lnbmFsKGMpCisjICAgICBkZWZpbmUgeGNvbmRpdGlvbl9icm9hZGNhc3QoYykgdGlzX2NvbmRfYnJvYWRjYXN0KGMpCisjICAgIGVsc2UKKyMgICAgIGlmZGVmIFVTRV9OQlNEX1RIUkVBRExJQgorLyoKKyAqIE5ldEJTRCB0aHJlYWRsaWIgc3VwcG9ydCBpcyBpbnRlbmRlZCBmb3IgdGhyZWFkIHNhZmUgbGlicmFyaWVzLgorICogVGhpcyBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGdlbmVyYWwgY2xpZW50IHByb2dyYW1taW5nLgorICovCisjICAgICAgaW5jbHVkZSA8dGhyZWFkbGliLmg+Cit0eXBlZGVmIHRocl90IHh0aHJlYWRfdDsKK3R5cGVkZWYgdGhyZWFkX2tleV90IHh0aHJlYWRfa2V5X3Q7Cit0eXBlZGVmIGNvbmRfdCB4Y29uZGl0aW9uX3JlYzsKK3R5cGVkZWYgbXV0ZXhfdCB4bXV0ZXhfcmVjOworIyAgICAgIGRlZmluZSB4dGhyZWFkX3NlbGYgdGhyX3NlbGYKKyMgICAgICBkZWZpbmUgeHRocmVhZF9mb3JrKGZ1bmMsY2xvc3VyZSkgeyB0aHJfdCBfdG1weHRocjsgXAorCS8qIFhYWCBDcmVhdGUgaXQgZGV0YWNoZWQ/ICAtLXRob3JwZWogKi8gXAorCXRocl9jcmVhdGUoJl90bXB4dGhyLE5VTEwsZnVuYyxjbG9zdXJlKTsgfQorIyAgICAgIGRlZmluZSB4dGhyZWFkX3lpZWxkKCkgdGhyX3lpZWxkKCkKKyMgICAgICBkZWZpbmUgeHRocmVhZF9leGl0KHYpIHRocl9leGl0KHYpCisjICAgICAgZGVmaW5lIHh0aHJlYWRfa2V5X2NyZWF0ZShrcCxkKSB0aHJfa2V5Y3JlYXRlKGtwLGQpCisjICAgICAgZGVmaW5lIHh0aHJlYWRfa2V5X2RlbGV0ZShrKSB0aHJfa2V5ZGVsZXRlKGspCisjICAgICAgZGVmaW5lIHh0aHJlYWRfc2V0X3NwZWNpZmljKGssdikgdGhyX3NldHNwZWNpZmljKGssdikKKyMgICAgICBkZWZpbmUgeHRocmVhZF9nZXRfc3BlY2lmaWMoayx2cCkgKih2cCkgPSB0aHJfZ2V0c3BlY2lmaWMoaykKKyMgICAgICBkZWZpbmUgWE1VVEVYX0lOSVRJQUxJWkVSIE1VVEVYX0lOSVRJQUxJWkVSCisjICAgICAgZGVmaW5lIHhtdXRleF9pbml0KG0pIG11dGV4X2luaXQobSwgMCkKKyMgICAgICBkZWZpbmUgeG11dGV4X2NsZWFyKG0pIG11dGV4X2Rlc3Ryb3kobSkKKyMgICAgICBkZWZpbmUgeG11dGV4X2xvY2sobSkgbXV0ZXhfbG9jayhtKQorIyAgICAgIGRlZmluZSB4bXV0ZXhfdW5sb2NrKG0pIG11dGV4X3VubG9jayhtKQorIyAgICAgIGRlZmluZSB4Y29uZGl0aW9uX2luaXQoYykgY29uZF9pbml0KGMsIDAsIDApCisjICAgICAgZGVmaW5lIHhjb25kaXRpb25fY2xlYXIoYykgY29uZF9kZXN0cm95KGMpCisjICAgICAgZGVmaW5lIHhjb25kaXRpb25fd2FpdChjLG0pIGNvbmRfd2FpdChjLG0pCisjICAgICAgZGVmaW5lIHhjb25kaXRpb25fc2lnbmFsKGMpIGNvbmRfc2lnbmFsKGMpCisjICAgICAgZGVmaW5lIHhjb25kaXRpb25fYnJvYWRjYXN0KGMpIGNvbmRfYnJvYWRjYXN0KGMpCisjICAgICBlbHNlCisjICAgICAgaW5jbHVkZSA8cHRocmVhZC5oPgordHlwZWRlZiBwdGhyZWFkX3QgeHRocmVhZF90OwordHlwZWRlZiBwdGhyZWFkX2tleV90IHh0aHJlYWRfa2V5X3Q7Cit0eXBlZGVmIHB0aHJlYWRfY29uZF90IHhjb25kaXRpb25fcmVjOwordHlwZWRlZiBwdGhyZWFkX211dGV4X3QgeG11dGV4X3JlYzsKKyMgICAgICBkZWZpbmUgeHRocmVhZF9zZWxmIHB0aHJlYWRfc2VsZgorIyAgICAgIGRlZmluZSB4dGhyZWFkX3lpZWxkKCkgcHRocmVhZF95aWVsZCgpCisjICAgICAgZGVmaW5lIHh0aHJlYWRfZXhpdCh2KSBwdGhyZWFkX2V4aXQodikKKyMgICAgICBkZWZpbmUgeHRocmVhZF9zZXRfc3BlY2lmaWMoayx2KSBwdGhyZWFkX3NldHNwZWNpZmljKGssdikKKyMgICAgICBkZWZpbmUgeG11dGV4X2NsZWFyKG0pIHB0aHJlYWRfbXV0ZXhfZGVzdHJveShtKQorIyAgICAgIGRlZmluZSB4bXV0ZXhfbG9jayhtKSBwdGhyZWFkX211dGV4X2xvY2sobSkKKyMgICAgICBkZWZpbmUgeG11dGV4X3VubG9jayhtKSBwdGhyZWFkX211dGV4X3VubG9jayhtKQorIyAgICAgIGlmbmRlZiBYUFJFX1NUQU5EQVJEX0FQSQorIyAgICAgICBkZWZpbmUgeHRocmVhZF9rZXlfY3JlYXRlKGtwLGQpIHB0aHJlYWRfa2V5X2NyZWF0ZShrcCxkKQorIyAgICAgICBkZWZpbmUgeHRocmVhZF9rZXlfZGVsZXRlKGspIHB0aHJlYWRfa2V5X2RlbGV0ZShrKQorIyAgICAgICBkZWZpbmUgeHRocmVhZF9nZXRfc3BlY2lmaWMoayx2cCkgKih2cCkgPSBwdGhyZWFkX2dldHNwZWNpZmljKGspCisjICAgICAgIGRlZmluZSB4dGhyZWFkX2ZvcmsoZnVuYyxjbG9zdXJlKSB7IHB0aHJlYWRfdCBfdG1weHRocjsgXAorCXB0aHJlYWRfY3JlYXRlKCZfdG1weHRocixOVUxMLGZ1bmMsY2xvc3VyZSk7IH0KKyMgICAgICAgZGVmaW5lIFhNVVRFWF9JTklUSUFMSVpFUiBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSCisjICAgICAgIGRlZmluZSB4bXV0ZXhfaW5pdChtKSBwdGhyZWFkX211dGV4X2luaXQobSwgTlVMTCkKKyMgICAgICAgZGVmaW5lIHhjb25kaXRpb25faW5pdChjKSBwdGhyZWFkX2NvbmRfaW5pdChjLCBOVUxMKQorIyAgICAgIGVsc2UgLyogWFBSRV9TVEFOREFSRF9BUEkgKi8KKyMgICAgICAgZGVmaW5lIHh0aHJlYWRfa2V5X2NyZWF0ZShrcCxkKSBwdGhyZWFkX2tleWNyZWF0ZShrcCxkKQorIyAgICAgICBkZWZpbmUgeHRocmVhZF9rZXlfZGVsZXRlKGspIDAKKyMgICAgICAgZGVmaW5lIHh0aHJlYWRfZ2V0X3NwZWNpZmljKGssdnApIHB0aHJlYWRfZ2V0c3BlY2lmaWMoayx2cCkKKyMgICAgICAgZGVmaW5lIHh0aHJlYWRfZm9yayhmdW5jLGNsb3N1cmUpIHsgcHRocmVhZF90IF90bXB4dGhyOyBcCisJcHRocmVhZF9jcmVhdGUoJl90bXB4dGhyLHB0aHJlYWRfYXR0cl9kZWZhdWx0LGZ1bmMsY2xvc3VyZSk7IH0KKyMgICAgICAgZGVmaW5lIHhtdXRleF9pbml0KG0pIHB0aHJlYWRfbXV0ZXhfaW5pdChtLCBwdGhyZWFkX211dGV4YXR0cl9kZWZhdWx0KQorIyAgICAgICBkZWZpbmUgeGNvbmRpdGlvbl9pbml0KGMpIHB0aHJlYWRfY29uZF9pbml0KGMsIHB0aHJlYWRfY29uZGF0dHJfZGVmYXVsdCkKKyMgICAgICBlbmRpZiAvKiBYUFJFX1NUQU5EQVJEX0FQSSAqLworIyAgICAgIGRlZmluZSB4Y29uZGl0aW9uX2NsZWFyKGMpIHB0aHJlYWRfY29uZF9kZXN0cm95KGMpCisjICAgICAgZGVmaW5lIHhjb25kaXRpb25fd2FpdChjLG0pIHB0aHJlYWRfY29uZF93YWl0KGMsbSkKKyMgICAgICBkZWZpbmUgeGNvbmRpdGlvbl9zaWduYWwoYykgcHRocmVhZF9jb25kX3NpZ25hbChjKQorIyAgICAgIGRlZmluZSB4Y29uZGl0aW9uX2Jyb2FkY2FzdChjKSBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KGMpCisjICAgICAgaWYgZGVmaW5lZChfREVDVEhSRUFEU18pCitzdGF0aWMgeHRocmVhZF90IF9YX25vX3RocmVhZF9pZDsKKyMgICAgICAgZGVmaW5lIHh0aHJlYWRfaGF2ZV9pZChpZCkgIXB0aHJlYWRfZXF1YWwoaWQsIF9YX25vX3RocmVhZF9pZCkKKyMgICAgICAgZGVmaW5lIHh0aHJlYWRfY2xlYXJfaWQoaWQpIGlkID0gX1hfbm9fdGhyZWFkX2lkCisjICAgICAgIGRlZmluZSB4dGhyZWFkX2VxdWFsKGlkMSxpZDIpIHB0aHJlYWRfZXF1YWwoaWQxLCBpZDIpCisjICAgICAgZW5kaWYgLyogX0RFQ1RIUkVBRFNfICovCisjICAgICAgaWYgZGVmaW5lZChfX2xpbnV4X18pCisjICAgICAgIGRlZmluZSB4dGhyZWFkX2hhdmVfaWQoaWQpICFwdGhyZWFkX2VxdWFsKGlkLCAwKQorIyAgICAgICBkZWZpbmUgeHRocmVhZF9jbGVhcl9pZChpZCkgaWQgPSAwCisjICAgICAgIGRlZmluZSB4dGhyZWFkX2VxdWFsKGlkMSxpZDIpIHB0aHJlYWRfZXF1YWwoaWQxLCBpZDIpCisjICAgICAgZW5kaWYgLyogbGludXggKi8KKyMgICAgICBpZiBkZWZpbmVkKF9DTUFfVkVORE9SXykgJiYgZGVmaW5lZChfQ01BX19JQk0pICYmIChfQ01BX1ZFTkRPUl8gPT0gX0NNQV9fSUJNKQorIyAgICAgICBpZmRlZiBERUJVRwkJLyogdG9vIG11Y2ggb2YgYSBoYWNrIHRvIGVuYWJsZSBub3JtYWxseSAqLworLyogc2VlIGFsc28gY21hX19vYmpfc2V0X25hbWUoKSAqLworIyAgICAgICAgZGVmaW5lIHhtdXRleF9zZXRfbmFtZShtLHN0cikgKChjaGFyKiopKG0pLT5maWVsZDEpWzVdID0gKHN0cikKKyMgICAgICAgIGRlZmluZSB4Y29uZGl0aW9uX3NldF9uYW1lKGN2LHN0cikgKChjaGFyKiopKGN2KS0+ZmllbGQxKVs1XSA9IChzdHIpCisjICAgICAgIGVuZGlmIC8qIERFQlVHICovCisjICAgICAgZW5kaWYgLyogX0NNQV9WRU5ET1JfID09IF9DTUFfX0lCTSAqLworIyAgICAgZW5kaWYgLyogVVNFX05CU0RfVEhSRUFETElCICovCisjICAgIGVuZGlmIC8qIFVTRV9USVNfU1VQUE9SVCAqLworIyAgIGVuZGlmIC8qIFdJTjMyICovCisjICBlbmRpZiAvKiBTVlI0ICovCisjIGVuZGlmIC8qIENUSFJFQURTICovCit0eXBlZGVmIHhjb25kaXRpb25fcmVjICp4Y29uZGl0aW9uX3Q7Cit0eXBlZGVmIHhtdXRleF9yZWMgKnhtdXRleF90OworIyBpZm5kZWYgeGNvbmRpdGlvbl9tYWxsb2MKKyMgIGRlZmluZSB4Y29uZGl0aW9uX21hbGxvYygpICh4Y29uZGl0aW9uX3QpeG1hbGxvYyhzaXplb2YoeGNvbmRpdGlvbl9yZWMpKQorIyBlbmRpZgorIyBpZm5kZWYgeGNvbmRpdGlvbl9mcmVlCisjICBkZWZpbmUgeGNvbmRpdGlvbl9mcmVlKGMpIHhmcmVlKChjaGFyICopYykKKyMgZW5kaWYKKyMgaWZuZGVmIHhtdXRleF9tYWxsb2MKKyMgIGRlZmluZSB4bXV0ZXhfbWFsbG9jKCkgKHhtdXRleF90KXhtYWxsb2Moc2l6ZW9mKHhtdXRleF9yZWMpKQorIyBlbmRpZgorIyBpZm5kZWYgeG11dGV4X2ZyZWUKKyMgIGRlZmluZSB4bXV0ZXhfZnJlZShtKSB4ZnJlZSgoY2hhciAqKW0pCisjIGVuZGlmCisjIGlmbmRlZiB4dGhyZWFkX2hhdmVfaWQKKyMgIGRlZmluZSB4dGhyZWFkX2hhdmVfaWQoaWQpIGlkCisjIGVuZGlmCisjIGlmbmRlZiB4dGhyZWFkX2NsZWFyX2lkCisjICBkZWZpbmUgeHRocmVhZF9jbGVhcl9pZChpZCkgaWQgPSAwCisjIGVuZGlmCisjIGlmbmRlZiB4dGhyZWFkX2VxdWFsCisjICBkZWZpbmUgeHRocmVhZF9lcXVhbChpZDEsaWQyKSAoKGlkMSkgPT0gKGlkMikpCisjIGVuZGlmCisvKiBhaWRzIHVuZGVyc3Rvb2QgYnkgc29tZSBkZWJ1Z2dlcnMgKi8KKyMgaWZuZGVmIHh0aHJlYWRfc2V0X25hbWUKKyMgIGRlZmluZSB4dGhyZWFkX3NldF9uYW1lKHQsc3RyKQorIyBlbmRpZgorIyBpZm5kZWYgeG11dGV4X3NldF9uYW1lCisjICBkZWZpbmUgeG11dGV4X3NldF9uYW1lKG0sc3RyKQorIyBlbmRpZgorIyBpZm5kZWYgeGNvbmRpdGlvbl9zZXRfbmFtZQorIyAgZGVmaW5lIHhjb25kaXRpb25fc2V0X25hbWUoY3Ysc3RyKQorIyBlbmRpZgorCisjZW5kaWYgLyogX1hUSFJFQURTX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YdXRpbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2FiNTBlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHV0aWwuaApAQCAtMCwwICsxLDgyNiBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IDE5ODcsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKworQ29weXJpZ2h0IDE5ODcgYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCitwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Citib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KK3N1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgRGlnaXRhbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorCitESUdJVEFMIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKK0FMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTAorRElHSVRBTCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKK0FOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKK0FSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKK1NPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1gxMV9YVVRJTF9IXworI2RlZmluZSBfWDExX1hVVElMX0hfCisKKy8qIFlvdSBtdXN0IGluY2x1ZGUgPFgxMS9YbGliLmg+IGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlICovCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEva2V5c3ltLmg+CisKKy8qCisgKiBCaXRtYXNrIHJldHVybmVkIGJ5IFhQYXJzZUdlb21ldHJ5KCkuICBFYWNoIGJpdCB0ZWxscyBpZiB0aGUgY29ycmVzcG9uZGluZworICogdmFsdWUgKHgsIHksIHdpZHRoLCBoZWlnaHQpIHdhcyBmb3VuZCBpbiB0aGUgcGFyc2VkIHN0cmluZy4KKyAqLworI2RlZmluZSBOb1ZhbHVlCQkweDAwMDAKKyNkZWZpbmUgWFZhbHVlICAJMHgwMDAxCisjZGVmaW5lIFlWYWx1ZQkJMHgwMDAyCisjZGVmaW5lIFdpZHRoVmFsdWUgIAkweDAwMDQKKyNkZWZpbmUgSGVpZ2h0VmFsdWUgIAkweDAwMDgKKyNkZWZpbmUgQWxsVmFsdWVzIAkweDAwMEYKKyNkZWZpbmUgWE5lZ2F0aXZlIAkweDAwMTAKKyNkZWZpbmUgWU5lZ2F0aXZlIAkweDAwMjAKKworLyoKKyAqIG5ldyB2ZXJzaW9uIGNvbnRhaW5pbmcgYmFzZV93aWR0aCwgYmFzZV9oZWlnaHQsIGFuZCB3aW5fZ3Jhdml0eSBmaWVsZHM7CisgKiB1c2VkIHdpdGggV01fTk9STUFMX0hJTlRTLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgCWxvbmcgZmxhZ3M7CS8qIG1hcmtzIHdoaWNoIGZpZWxkcyBpbiB0aGlzIHN0cnVjdHVyZSBhcmUgZGVmaW5lZCAqLworCWludCB4LCB5OwkJLyogb2Jzb2xldGUgZm9yIG5ldyB3aW5kb3cgbWdycywgYnV0IGNsaWVudHMgKi8KKwlpbnQgd2lkdGgsIGhlaWdodDsJLyogc2hvdWxkIHNldCBzbyBvbGQgd20ncyBkb24ndCBtZXNzIHVwICovCisJaW50IG1pbl93aWR0aCwgbWluX2hlaWdodDsKKwlpbnQgbWF4X3dpZHRoLCBtYXhfaGVpZ2h0OworICAgIAlpbnQgd2lkdGhfaW5jLCBoZWlnaHRfaW5jOworCXN0cnVjdCB7CisJCWludCB4OwkvKiBudW1lcmF0b3IgKi8KKwkJaW50IHk7CS8qIGRlbm9taW5hdG9yICovCisJfSBtaW5fYXNwZWN0LCBtYXhfYXNwZWN0OworCWludCBiYXNlX3dpZHRoLCBiYXNlX2hlaWdodDsJCS8qIGFkZGVkIGJ5IElDQ0NNIHZlcnNpb24gMSAqLworCWludCB3aW5fZ3Jhdml0eTsJCQkvKiBhZGRlZCBieSBJQ0NDTSB2ZXJzaW9uIDEgKi8KK30gWFNpemVIaW50czsKKworLyoKKyAqIFRoZSBuZXh0IGJsb2NrIG9mIGRlZmluaXRpb25zIGFyZSBmb3Igd2luZG93IG1hbmFnZXIgcHJvcGVydGllcyB0aGF0CisgKiBjbGllbnRzIGFuZCBhcHBsaWNhdGlvbnMgdXNlIGZvciBjb21tdW5pY2F0aW9uLgorICovCisKKy8qIGZsYWdzIGFyZ3VtZW50IGluIHNpemUgaGludHMgKi8KKyNkZWZpbmUgVVNQb3NpdGlvbgkoMUwgPDwgMCkgLyogdXNlciBzcGVjaWZpZWQgeCwgeSAqLworI2RlZmluZSBVU1NpemUJCSgxTCA8PCAxKSAvKiB1c2VyIHNwZWNpZmllZCB3aWR0aCwgaGVpZ2h0ICovCisKKyNkZWZpbmUgUFBvc2l0aW9uCSgxTCA8PCAyKSAvKiBwcm9ncmFtIHNwZWNpZmllZCBwb3NpdGlvbiAqLworI2RlZmluZSBQU2l6ZQkJKDFMIDw8IDMpIC8qIHByb2dyYW0gc3BlY2lmaWVkIHNpemUgKi8KKyNkZWZpbmUgUE1pblNpemUJKDFMIDw8IDQpIC8qIHByb2dyYW0gc3BlY2lmaWVkIG1pbmltdW0gc2l6ZSAqLworI2RlZmluZSBQTWF4U2l6ZQkoMUwgPDwgNSkgLyogcHJvZ3JhbSBzcGVjaWZpZWQgbWF4aW11bSBzaXplICovCisjZGVmaW5lIFBSZXNpemVJbmMJKDFMIDw8IDYpIC8qIHByb2dyYW0gc3BlY2lmaWVkIHJlc2l6ZSBpbmNyZW1lbnRzICovCisjZGVmaW5lIFBBc3BlY3QJCSgxTCA8PCA3KSAvKiBwcm9ncmFtIHNwZWNpZmllZCBtaW4gYW5kIG1heCBhc3BlY3QgcmF0aW9zICovCisjZGVmaW5lIFBCYXNlU2l6ZQkoMUwgPDwgOCkgLyogcHJvZ3JhbSBzcGVjaWZpZWQgYmFzZSBmb3IgaW5jcmVtZW50aW5nICovCisjZGVmaW5lIFBXaW5HcmF2aXR5CSgxTCA8PCA5KSAvKiBwcm9ncmFtIHNwZWNpZmllZCB3aW5kb3cgZ3Jhdml0eSAqLworCisvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBQQWxsSGludHMgKFBQb3NpdGlvbnxQU2l6ZXxQTWluU2l6ZXxQTWF4U2l6ZXxQUmVzaXplSW5jfFBBc3BlY3QpCisKKworCit0eXBlZGVmIHN0cnVjdCB7CisJbG9uZyBmbGFnczsJLyogbWFya3Mgd2hpY2ggZmllbGRzIGluIHRoaXMgc3RydWN0dXJlIGFyZSBkZWZpbmVkICovCisJQm9vbCBpbnB1dDsJLyogZG9lcyB0aGlzIGFwcGxpY2F0aW9uIHJlbHkgb24gdGhlIHdpbmRvdyBtYW5hZ2VyIHRvCisJCQlnZXQga2V5Ym9hcmQgaW5wdXQ/ICovCisJaW50IGluaXRpYWxfc3RhdGU7CS8qIHNlZSBiZWxvdyAqLworCVBpeG1hcCBpY29uX3BpeG1hcDsJLyogcGl4bWFwIHRvIGJlIHVzZWQgYXMgaWNvbiAqLworCVdpbmRvdyBpY29uX3dpbmRvdzsgCS8qIHdpbmRvdyB0byBiZSB1c2VkIGFzIGljb24gKi8KKwlpbnQgaWNvbl94LCBpY29uX3k7IAkvKiBpbml0aWFsIHBvc2l0aW9uIG9mIGljb24gKi8KKwlQaXhtYXAgaWNvbl9tYXNrOwkvKiBpY29uIG1hc2sgYml0bWFwICovCisJWElEIHdpbmRvd19ncm91cDsJLyogaWQgb2YgcmVsYXRlZCB3aW5kb3cgZ3JvdXAgKi8KKwkvKiB0aGlzIHN0cnVjdHVyZSBtYXkgYmUgZXh0ZW5kZWQgaW4gdGhlIGZ1dHVyZSAqLworfSBYV01IaW50czsKKworLyogZGVmaW5pdGlvbiBmb3IgZmxhZ3Mgb2YgWFdNSGludHMgKi8KKworI2RlZmluZSBJbnB1dEhpbnQgCQkoMUwgPDwgMCkKKyNkZWZpbmUgU3RhdGVIaW50IAkJKDFMIDw8IDEpCisjZGVmaW5lIEljb25QaXhtYXBIaW50CQkoMUwgPDwgMikKKyNkZWZpbmUgSWNvbldpbmRvd0hpbnQJCSgxTCA8PCAzKQorI2RlZmluZSBJY29uUG9zaXRpb25IaW50IAkoMUwgPDwgNCkKKyNkZWZpbmUgSWNvbk1hc2tIaW50CQkoMUwgPDwgNSkKKyNkZWZpbmUgV2luZG93R3JvdXBIaW50CQkoMUwgPDwgNikKKyNkZWZpbmUgQWxsSGludHMgKElucHV0SGludHxTdGF0ZUhpbnR8SWNvblBpeG1hcEhpbnR8SWNvbldpbmRvd0hpbnR8IFwKK0ljb25Qb3NpdGlvbkhpbnR8SWNvbk1hc2tIaW50fFdpbmRvd0dyb3VwSGludCkKKyNkZWZpbmUgWFVyZ2VuY3lIaW50CQkoMUwgPDwgOCkKKworLyogZGVmaW5pdGlvbnMgZm9yIGluaXRpYWwgd2luZG93IHN0YXRlICovCisjZGVmaW5lIFdpdGhkcmF3blN0YXRlIDAJLyogZm9yIHdpbmRvd3MgdGhhdCBhcmUgbm90IG1hcHBlZCAqLworI2RlZmluZSBOb3JtYWxTdGF0ZSAxCS8qIG1vc3QgYXBwbGljYXRpb25zIHdhbnQgdG8gc3RhcnQgdGhpcyB3YXkgKi8KKyNkZWZpbmUgSWNvbmljU3RhdGUgMwkvKiBhcHBsaWNhdGlvbiB3YW50cyB0byBzdGFydCBhcyBhbiBpY29uICovCisKKy8qCisgKiBPYnNvbGV0ZSBzdGF0ZXMgbm8gbG9uZ2VyIGRlZmluZWQgYnkgSUNDQ00KKyAqLworI2RlZmluZSBEb250Q2FyZVN0YXRlIDAJLyogZG9uJ3Qga25vdyBvciBjYXJlICovCisjZGVmaW5lIFpvb21TdGF0ZSAyCS8qIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHN0YXJ0IHpvb21lZCAqLworI2RlZmluZSBJbmFjdGl2ZVN0YXRlIDQJLyogYXBwbGljYXRpb24gYmVsaWV2ZXMgaXQgaXMgc2VsZG9tIHVzZWQ7ICovCisJCQkvKiBzb21lIHdtJ3MgbWF5IHB1dCBpdCBvbiBpbmFjdGl2ZSBtZW51ICovCisKKworLyoKKyAqIG5ldyBzdHJ1Y3R1cmUgZm9yIG1hbmlwdWxhdGluZyBURVhUIHByb3BlcnRpZXM7IHVzZWQgd2l0aCBXTV9OQU1FLAorICogV01fSUNPTl9OQU1FLCBXTV9DTElFTlRfTUFDSElORSwgYW5kIFdNX0NPTU1BTkQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBjaGFyICp2YWx1ZTsJCS8qIHNhbWUgYXMgUHJvcGVydHkgcm91dGluZXMgKi8KKyAgICBBdG9tIGVuY29kaW5nOwkJCS8qIHByb3AgdHlwZSAqLworICAgIGludCBmb3JtYXQ7CQkJCS8qIHByb3AgZGF0YSBmb3JtYXQ6IDgsIDE2LCBvciAzMiAqLworICAgIHVuc2lnbmVkIGxvbmcgbml0ZW1zOwkJLyogbnVtYmVyIG9mIGRhdGEgaXRlbXMgaW4gdmFsdWUgKi8KK30gWFRleHRQcm9wZXJ0eTsKKworI2RlZmluZSBYTm9NZW1vcnkgLTEKKyNkZWZpbmUgWExvY2FsZU5vdFN1cHBvcnRlZCAtMgorI2RlZmluZSBYQ29udmVydGVyTm90Rm91bmQgLTMKKwordHlwZWRlZiBlbnVtIHsKKyAgICBYU3RyaW5nU3R5bGUsCQkvKiBTVFJJTkcgKi8KKyAgICBYQ29tcG91bmRUZXh0U3R5bGUsCQkvKiBDT01QT1VORF9URVhUICovCisgICAgWFRleHRTdHlsZSwJCQkvKiB0ZXh0IGluIG93bmVyJ3MgZW5jb2RpbmcgKGN1cnJlbnQgbG9jYWxlKSovCisgICAgWFN0ZElDQ1RleHRTdHlsZSwJCS8qIFNUUklORywgZWxzZSBDT01QT1VORF9URVhUICovCisgICAgLyogVGhlIGZvbGxvd2luZyBpcyBhbiBYRnJlZTg2IGV4dGVuc2lvbiwgaW50cm9kdWNlZCBpbiBOb3ZlbWJlciAyMDAwICovCisgICAgWFVURjhTdHJpbmdTdHlsZQkJLyogVVRGOF9TVFJJTkcgKi8KK30gWElDQ0VuY29kaW5nU3R5bGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgbWluX3dpZHRoLCBtaW5faGVpZ2h0OworCWludCBtYXhfd2lkdGgsIG1heF9oZWlnaHQ7CisJaW50IHdpZHRoX2luYywgaGVpZ2h0X2luYzsKK30gWEljb25TaXplOworCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhciAqcmVzX25hbWU7CisJY2hhciAqcmVzX2NsYXNzOworfSBYQ2xhc3NIaW50OworCisjaWZkZWYgWFVUSUxfREVGSU5FX0ZVTkNUSU9OUworZXh0ZXJuIGludCBYRGVzdHJveUltYWdlKAorICAgICAgICBYSW1hZ2UgKnhpbWFnZSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBYR2V0UGl4ZWwoCisgICAgICAgIFhJbWFnZSAqeGltYWdlLAorICAgICAgICBpbnQgeCwgaW50IHkpOworZXh0ZXJuIGludCBYUHV0UGl4ZWwoCisgICAgICAgIFhJbWFnZSAqeGltYWdlLAorICAgICAgICBpbnQgeCwgaW50IHksCisgICAgICAgIHVuc2lnbmVkIGxvbmcgcGl4ZWwpOworZXh0ZXJuIFhJbWFnZSAqWFN1YkltYWdlKAorICAgICAgICBYSW1hZ2UgKnhpbWFnZSwKKyAgICAgICAgaW50IHgsIGludCB5LAorICAgICAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQpOworZXh0ZXJuIGludCBYQWRkUGl4ZWwoCisgICAgICAgIFhJbWFnZSAqeGltYWdlLAorICAgICAgICBsb25nIHZhbHVlKTsKKyNlbHNlCisvKgorICogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIHRvIGdpdmUgc29tZSBzdWdhciB0byB0aGUgaW1hZ2Ugcm91dGluZXMgc28gdGhhdAorICogbmFpdmUgcGVvcGxlIGFyZSBtb3JlIGNvbWZvcnRhYmxlIHdpdGggdGhlbS4KKyAqLworI2RlZmluZSBYRGVzdHJveUltYWdlKHhpbWFnZSkgXAorCSgoKigoeGltYWdlKS0+Zi5kZXN0cm95X2ltYWdlKSkoKHhpbWFnZSkpKQorI2RlZmluZSBYR2V0UGl4ZWwoeGltYWdlLCB4LCB5KSBcCisJKCgqKCh4aW1hZ2UpLT5mLmdldF9waXhlbCkpKCh4aW1hZ2UpLCAoeCksICh5KSkpCisjZGVmaW5lIFhQdXRQaXhlbCh4aW1hZ2UsIHgsIHksIHBpeGVsKSBcCisJKCgqKCh4aW1hZ2UpLT5mLnB1dF9waXhlbCkpKCh4aW1hZ2UpLCAoeCksICh5KSwgKHBpeGVsKSkpCisjZGVmaW5lIFhTdWJJbWFnZSh4aW1hZ2UsIHgsIHksIHdpZHRoLCBoZWlnaHQpICBcCisJKCgqKCh4aW1hZ2UpLT5mLnN1Yl9pbWFnZSkpKCh4aW1hZ2UpLCAoeCksICh5KSwgKHdpZHRoKSwgKGhlaWdodCkpKQorI2RlZmluZSBYQWRkUGl4ZWwoeGltYWdlLCB2YWx1ZSkgXAorCSgoKigoeGltYWdlKS0+Zi5hZGRfcGl4ZWwpKSgoeGltYWdlKSwgKHZhbHVlKSkpCisjZW5kaWYKKworLyoKKyAqIENvbXBvc2Ugc2VxdWVuY2Ugc3RhdHVzIHN0cnVjdHVyZSwgdXNlZCBpbiBjYWxsaW5nIFhMb29rdXBTdHJpbmcuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9YQ29tcG9zZVN0YXR1cyB7CisgICAgWFBvaW50ZXIgY29tcG9zZV9wdHI7CS8qIHN0YXRlIHRhYmxlIHBvaW50ZXIgKi8KKyAgICBpbnQgY2hhcnNfbWF0Y2hlZDsJCS8qIG1hdGNoIHN0YXRlICovCit9IFhDb21wb3NlU3RhdHVzOworCisvKgorICogS2V5c3ltIG1hY3JvcywgdXNlZCBvbiBLZXlzeW1zIHRvIHRlc3QgZm9yIGNsYXNzZXMgb2Ygc3ltYm9scworICovCisjZGVmaW5lIElzS2V5cGFkS2V5KGtleXN5bSkgXAorICAoKChLZXlTeW0pKGtleXN5bSkgPj0gWEtfS1BfU3BhY2UpICYmICgoS2V5U3ltKShrZXlzeW0pIDw9IFhLX0tQX0VxdWFsKSkKKworI2RlZmluZSBJc1ByaXZhdGVLZXlwYWRLZXkoa2V5c3ltKSBcCisgICgoKEtleVN5bSkoa2V5c3ltKSA+PSAweDExMDAwMDAwKSAmJiAoKEtleVN5bSkoa2V5c3ltKSA8PSAweDExMDBGRkZGKSkKKworI2RlZmluZSBJc0N1cnNvcktleShrZXlzeW0pIFwKKyAgKCgoS2V5U3ltKShrZXlzeW0pID49IFhLX0hvbWUpICAgICAmJiAoKEtleVN5bSkoa2V5c3ltKSA8ICBYS19TZWxlY3QpKQorCisjZGVmaW5lIElzUEZLZXkoa2V5c3ltKSBcCisgICgoKEtleVN5bSkoa2V5c3ltKSA+PSBYS19LUF9GMSkgICAgICYmICgoS2V5U3ltKShrZXlzeW0pIDw9IFhLX0tQX0Y0KSkKKworI2RlZmluZSBJc0Z1bmN0aW9uS2V5KGtleXN5bSkgXAorICAoKChLZXlTeW0pKGtleXN5bSkgPj0gWEtfRjEpICAgICAgICYmICgoS2V5U3ltKShrZXlzeW0pIDw9IFhLX0YzNSkpCisKKyNkZWZpbmUgSXNNaXNjRnVuY3Rpb25LZXkoa2V5c3ltKSBcCisgICgoKEtleVN5bSkoa2V5c3ltKSA+PSBYS19TZWxlY3QpICAgJiYgKChLZXlTeW0pKGtleXN5bSkgPD0gWEtfQnJlYWspKQorCisjaWZkZWYgWEtfWEtCX0tFWVMKKyNkZWZpbmUgSXNNb2RpZmllcktleShrZXlzeW0pIFwKKyAgKCgoKEtleVN5bSkoa2V5c3ltKSA+PSBYS19TaGlmdF9MKSAmJiAoKEtleVN5bSkoa2V5c3ltKSA8PSBYS19IeXBlcl9SKSkgXAorICAgfHwgKCgoS2V5U3ltKShrZXlzeW0pID49IFhLX0lTT19Mb2NrKSAmJiBcCisgICAgICAgKChLZXlTeW0pKGtleXN5bSkgPD0gWEtfSVNPX0xldmVsNV9Mb2NrKSkgXAorICAgfHwgKChLZXlTeW0pKGtleXN5bSkgPT0gWEtfTW9kZV9zd2l0Y2gpIFwKKyAgIHx8ICgoS2V5U3ltKShrZXlzeW0pID09IFhLX051bV9Mb2NrKSkKKyNlbHNlCisjZGVmaW5lIElzTW9kaWZpZXJLZXkoa2V5c3ltKSBcCisgICgoKChLZXlTeW0pKGtleXN5bSkgPj0gWEtfU2hpZnRfTCkgJiYgKChLZXlTeW0pKGtleXN5bSkgPD0gWEtfSHlwZXJfUikpIFwKKyAgIHx8ICgoS2V5U3ltKShrZXlzeW0pID09IFhLX01vZGVfc3dpdGNoKSBcCisgICB8fCAoKEtleVN5bSkoa2V5c3ltKSA9PSBYS19OdW1fTG9jaykpCisjZW5kaWYKKy8qCisgKiBvcGFxdWUgcmVmZXJlbmNlIHRvIFJlZ2lvbiBkYXRhIHR5cGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX1hSZWdpb24gKlJlZ2lvbjsKKworLyogUmV0dXJuIHZhbHVlcyBmcm9tIFhSZWN0SW5SZWdpb24oKSAqLworCisjZGVmaW5lIFJlY3RhbmdsZU91dCAwCisjZGVmaW5lIFJlY3RhbmdsZUluICAxCisjZGVmaW5lIFJlY3RhbmdsZVBhcnQgMgorCisKKy8qCisgKiBJbmZvcm1hdGlvbiB1c2VkIGJ5IHRoZSB2aXN1YWwgdXRpbGl0eSByb3V0aW5lcyB0byBmaW5kIGRlc2lyZWQgdmlzdWFsCisgKiB0eXBlIGZyb20gdGhlIG1hbnkgdmlzdWFscyBhIGRpc3BsYXkgbWF5IHN1cHBvcnQuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBWaXN1YWwgKnZpc3VhbDsKKyAgVmlzdWFsSUQgdmlzdWFsaWQ7CisgIGludCBzY3JlZW47CisgIGludCBkZXB0aDsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgIGludCBjX2NsYXNzOwkJCQkJLyogQysrICovCisjZWxzZQorICBpbnQgY2xhc3M7CisjZW5kaWYKKyAgdW5zaWduZWQgbG9uZyByZWRfbWFzazsKKyAgdW5zaWduZWQgbG9uZyBncmVlbl9tYXNrOworICB1bnNpZ25lZCBsb25nIGJsdWVfbWFzazsKKyAgaW50IGNvbG9ybWFwX3NpemU7CisgIGludCBiaXRzX3Blcl9yZ2I7Cit9IFhWaXN1YWxJbmZvOworCisjZGVmaW5lIFZpc3VhbE5vTWFzawkJMHgwCisjZGVmaW5lIFZpc3VhbElETWFzayAJCTB4MQorI2RlZmluZSBWaXN1YWxTY3JlZW5NYXNrCTB4MgorI2RlZmluZSBWaXN1YWxEZXB0aE1hc2sJCTB4NAorI2RlZmluZSBWaXN1YWxDbGFzc01hc2sJCTB4OAorI2RlZmluZSBWaXN1YWxSZWRNYXNrTWFzawkweDEwCisjZGVmaW5lIFZpc3VhbEdyZWVuTWFza01hc2sJMHgyMAorI2RlZmluZSBWaXN1YWxCbHVlTWFza01hc2sJMHg0MAorI2RlZmluZSBWaXN1YWxDb2xvcm1hcFNpemVNYXNrCTB4ODAKKyNkZWZpbmUgVmlzdWFsQml0c1BlclJHQk1hc2sJMHgxMDAKKyNkZWZpbmUgVmlzdWFsQWxsTWFzawkJMHgxRkYKKworLyoKKyAqIFRoaXMgZGVmaW5lcyBhIHdpbmRvdyBtYW5hZ2VyIHByb3BlcnR5IHRoYXQgY2xpZW50cyBtYXkgdXNlIHRvCisgKiBzaGFyZSBzdGFuZGFyZCBjb2xvciBtYXBzIG9mIHR5cGUgUkdCX0NPTE9SX01BUDoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUNvbG9ybWFwIGNvbG9ybWFwOworCXVuc2lnbmVkIGxvbmcgcmVkX21heDsKKwl1bnNpZ25lZCBsb25nIHJlZF9tdWx0OworCXVuc2lnbmVkIGxvbmcgZ3JlZW5fbWF4OworCXVuc2lnbmVkIGxvbmcgZ3JlZW5fbXVsdDsKKwl1bnNpZ25lZCBsb25nIGJsdWVfbWF4OworCXVuc2lnbmVkIGxvbmcgYmx1ZV9tdWx0OworCXVuc2lnbmVkIGxvbmcgYmFzZV9waXhlbDsKKwlWaXN1YWxJRCB2aXN1YWxpZDsJCS8qIGFkZGVkIGJ5IElDQ0NNIHZlcnNpb24gMSAqLworCVhJRCBraWxsaWQ7CQkJLyogYWRkZWQgYnkgSUNDQ00gdmVyc2lvbiAxICovCit9IFhTdGFuZGFyZENvbG9ybWFwOworCisjZGVmaW5lIFJlbGVhc2VCeUZyZWVpbmdDb2xvcm1hcCAoKFhJRCkgMUwpICAvKiBmb3Iga2lsbGlkIGZpZWxkIGFib3ZlICovCisKKworLyoKKyAqIHJldHVybiBjb2RlcyBmb3IgWFJlYWRCaXRtYXBGaWxlIGFuZCBYV3JpdGVCaXRtYXBGaWxlCisgKi8KKyNkZWZpbmUgQml0bWFwU3VjY2VzcwkJMAorI2RlZmluZSBCaXRtYXBPcGVuRmFpbGVkIAkxCisjZGVmaW5lIEJpdG1hcEZpbGVJbnZhbGlkIAkyCisjZGVmaW5lIEJpdG1hcE5vTWVtb3J5CQkzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29udGV4dCBNYW5hZ2VtZW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogQXNzb2NpYXRpdmUgbG9va3VwIHRhYmxlIHJldHVybiBjb2RlcyAqLworCisjZGVmaW5lIFhDU1VDQ0VTUyAwCS8qIE5vIGVycm9yLiAqLworI2RlZmluZSBYQ05PTUVNICAgMSAgICAvKiBPdXQgb2YgbWVtb3J5ICovCisjZGVmaW5lIFhDTk9FTlQgICAyICAgIC8qIE5vIGVudHJ5IGluIHRhYmxlICovCisKK3R5cGVkZWYgaW50IFhDb250ZXh0OworCisjZGVmaW5lIFhVbmlxdWVDb250ZXh0KCkgICAgICAgKChYQ29udGV4dCkgWHJtVW5pcXVlUXVhcmsoKSkKKyNkZWZpbmUgWFN0cmluZ1RvQ29udGV4dChzdHJpbmcpICAgKChYQ29udGV4dCkgWHJtU3RyaW5nVG9RdWFyayhzdHJpbmcpKQorCitfWEZVTkNQUk9UT0JFR0lOCisKKy8qIFRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb25zIGFyZSBhbHBoYWJldGl6ZWQuICovCisKK2V4dGVybiBYQ2xhc3NIaW50ICpYQWxsb2NDbGFzc0hpbnQgKAorICAgIHZvaWQKKyk7CisKK2V4dGVybiBYSWNvblNpemUgKlhBbGxvY0ljb25TaXplICgKKyAgICB2b2lkCispOworCitleHRlcm4gWFNpemVIaW50cyAqWEFsbG9jU2l6ZUhpbnRzICgKKyAgICB2b2lkCispOworCitleHRlcm4gWFN0YW5kYXJkQ29sb3JtYXAgKlhBbGxvY1N0YW5kYXJkQ29sb3JtYXAgKAorICAgIHZvaWQKKyk7CisKK2V4dGVybiBYV01IaW50cyAqWEFsbG9jV01IaW50cyAoCisgICAgdm9pZAorKTsKKworZXh0ZXJuIGludCBYQ2xpcEJveCgKKyAgICBSZWdpb24JCS8qIHIgKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIHJlY3RfcmV0dXJuICovCispOworCitleHRlcm4gUmVnaW9uIFhDcmVhdGVSZWdpb24oCisgICAgdm9pZAorKTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKlhEZWZhdWx0U3RyaW5nICh2b2lkKTsKKworZXh0ZXJuIGludCBYRGVsZXRlQ29udGV4dCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYSUQJCQkvKiByaWQgKi8sCisgICAgWENvbnRleHQJCS8qIGNvbnRleHQgKi8KKyk7CisKK2V4dGVybiBpbnQgWERlc3Ryb3lSZWdpb24oCisgICAgUmVnaW9uCQkvKiByICovCispOworCitleHRlcm4gaW50IFhFbXB0eVJlZ2lvbigKKyAgICBSZWdpb24JCS8qIHIgKi8KKyk7CisKK2V4dGVybiBpbnQgWEVxdWFsUmVnaW9uKAorICAgIFJlZ2lvbgkJLyogcjEgKi8sCisgICAgUmVnaW9uCQkvKiByMiAqLworKTsKKworZXh0ZXJuIGludCBYRmluZENvbnRleHQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWElECQkJLyogcmlkICovLAorICAgIFhDb250ZXh0CQkvKiBjb250ZXh0ICovLAorICAgIFhQb2ludGVyKgkJLyogZGF0YV9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldENsYXNzSGludCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWENsYXNzSGludCoJCS8qIGNsYXNzX2hpbnRzX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYR2V0SWNvblNpemVzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYSWNvblNpemUqKgkJLyogc2l6ZV9saXN0X3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBjb3VudF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldE5vcm1hbEhpbnRzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYU2l6ZUhpbnRzKgkJLyogaGludHNfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhHZXRSR0JDb2xvcm1hcHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhTdGFuZGFyZENvbG9ybWFwKiogLyogc3RkY21hcF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogY291bnRfcmV0dXJuICovLAorICAgIEF0b20JCS8qIHByb3BlcnR5ICovCispOworCitleHRlcm4gU3RhdHVzIFhHZXRTaXplSGludHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhTaXplSGludHMqCQkvKiBoaW50c19yZXR1cm4gKi8sCisgICAgQXRvbQkJLyogcHJvcGVydHkgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldFN0YW5kYXJkQ29sb3JtYXAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhTdGFuZGFyZENvbG9ybWFwKgkvKiBjb2xvcm1hcF9yZXR1cm4gKi8sCisgICAgQXRvbQkJLyogcHJvcGVydHkgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldFRleHRQcm9wZXJ0eSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHdpbmRvdyAqLywKKyAgICBYVGV4dFByb3BlcnR5KgkvKiB0ZXh0X3Byb3BfcmV0dXJuICovLAorICAgIEF0b20JCS8qIHByb3BlcnR5ICovCispOworCitleHRlcm4gWFZpc3VhbEluZm8gKlhHZXRWaXN1YWxJbmZvKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGxvbmcJCS8qIHZpbmZvX21hc2sgKi8sCisgICAgWFZpc3VhbEluZm8qCS8qIHZpbmZvX3RlbXBsYXRlICovLAorICAgIGludCoJCS8qIG5pdGVtc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldFdNQ2xpZW50TWFjaGluZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFRleHRQcm9wZXJ0eSoJLyogdGV4dF9wcm9wX3JldHVybiAqLworKTsKKworZXh0ZXJuIFhXTUhpbnRzICpYR2V0V01IaW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldFdNSWNvbk5hbWUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhUZXh0UHJvcGVydHkqCS8qIHRleHRfcHJvcF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldFdNTmFtZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFRleHRQcm9wZXJ0eSoJLyogdGV4dF9wcm9wX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYR2V0V01Ob3JtYWxIaW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFNpemVIaW50cyoJCS8qIGhpbnRzX3JldHVybiAqLywKKyAgICBsb25nKgkJLyogc3VwcGxpZWRfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhHZXRXTVNpemVIaW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFNpemVIaW50cyoJCS8qIGhpbnRzX3JldHVybiAqLywKKyAgICBsb25nKgkJLyogc3VwcGxpZWRfcmV0dXJuICovLAorICAgIEF0b20JCS8qIHByb3BlcnR5ICovCispOworCitleHRlcm4gU3RhdHVzIFhHZXRab29tSGludHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhTaXplSGludHMqCQkvKiB6aGludHNfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhJbnRlcnNlY3RSZWdpb24oCisgICAgUmVnaW9uCQkvKiBzcmEgKi8sCisgICAgUmVnaW9uCQkvKiBzcmIgKi8sCisgICAgUmVnaW9uCQkvKiBkcl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiB2b2lkIFhDb252ZXJ0Q2FzZSgKKyAgICBLZXlTeW0JCS8qIHN5bSAqLywKKyAgICBLZXlTeW0qCQkvKiBsb3dlciAqLywKKyAgICBLZXlTeW0qCQkvKiB1cHBlciAqLworKTsKKworZXh0ZXJuIGludCBYTG9va3VwU3RyaW5nKAorICAgIFhLZXlFdmVudCoJCS8qIGV2ZW50X3N0cnVjdCAqLywKKyAgICBjaGFyKgkJLyogYnVmZmVyX3JldHVybiAqLywKKyAgICBpbnQJCQkvKiBieXRlc19idWZmZXIgKi8sCisgICAgS2V5U3ltKgkJLyoga2V5c3ltX3JldHVybiAqLywKKyAgICBYQ29tcG9zZVN0YXR1cyoJLyogc3RhdHVzX2luX291dCAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYTWF0Y2hWaXN1YWxJbmZvKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbiAqLywKKyAgICBpbnQJCQkvKiBkZXB0aCAqLywKKyAgICBpbnQJCQkvKiBjbGFzcyAqLywKKyAgICBYVmlzdWFsSW5mbyoJLyogdmluZm9fcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhPZmZzZXRSZWdpb24oCisgICAgUmVnaW9uCQkvKiByICovLAorICAgIGludAkJCS8qIGR4ICovLAorICAgIGludAkJCS8qIGR5ICovCispOworCitleHRlcm4gQm9vbCBYUG9pbnRJblJlZ2lvbigKKyAgICBSZWdpb24JCS8qIHIgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovCispOworCitleHRlcm4gUmVnaW9uIFhQb2x5Z29uUmVnaW9uKAorICAgIFhQb2ludCoJCS8qIHBvaW50cyAqLywKKyAgICBpbnQJCQkvKiBuICovLAorICAgIGludAkJCS8qIGZpbGxfcnVsZSAqLworKTsKKworZXh0ZXJuIGludCBYUmVjdEluUmVnaW9uKAorICAgIFJlZ2lvbgkJLyogciAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNhdmVDb250ZXh0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhJRAkJCS8qIHJpZCAqLywKKyAgICBYQ29udGV4dAkJLyogY29udGV4dCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGRhdGEgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldENsYXNzSGludCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWENsYXNzSGludCoJCS8qIGNsYXNzX2hpbnRzICovCispOworCitleHRlcm4gaW50IFhTZXRJY29uU2l6ZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhJY29uU2l6ZSoJCS8qIHNpemVfbGlzdCAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLworKTsKKworZXh0ZXJuIGludCBYU2V0Tm9ybWFsSGludHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhTaXplSGludHMqCQkvKiBoaW50cyAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNldFJHQkNvbG9ybWFwcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFN0YW5kYXJkQ29sb3JtYXAqCS8qIHN0ZGNtYXBzICovLAorICAgIGludAkJCS8qIGNvdW50ICovLAorICAgIEF0b20JCS8qIHByb3BlcnR5ICovCispOworCitleHRlcm4gaW50IFhTZXRTaXplSGludHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhTaXplSGludHMqCQkvKiBoaW50cyAqLywKKyAgICBBdG9tCQkvKiBwcm9wZXJ0eSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0U3RhbmRhcmRQcm9wZXJ0aWVzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHdpbmRvd19uYW1lICovLAorICAgIF9YY29uc3QgY2hhcioJLyogaWNvbl9uYW1lICovLAorICAgIFBpeG1hcAkJLyogaWNvbl9waXhtYXAgKi8sCisgICAgY2hhcioqCQkvKiBhcmd2ICovLAorICAgIGludAkJCS8qIGFyZ2MgKi8sCisgICAgWFNpemVIaW50cyoJCS8qIGhpbnRzICovCispOworCitleHRlcm4gdm9pZCBYU2V0VGV4dFByb3BlcnR5KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYVGV4dFByb3BlcnR5KgkvKiB0ZXh0X3Byb3AgKi8sCisgICAgQXRvbQkJLyogcHJvcGVydHkgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhTZXRXTUNsaWVudE1hY2hpbmUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhUZXh0UHJvcGVydHkqCS8qIHRleHRfcHJvcCAqLworKTsKKworZXh0ZXJuIGludCBYU2V0V01IaW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFdNSGludHMqCQkvKiB3bV9oaW50cyAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNldFdNSWNvbk5hbWUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhUZXh0UHJvcGVydHkqCS8qIHRleHRfcHJvcCAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNldFdNTmFtZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFRleHRQcm9wZXJ0eSoJLyogdGV4dF9wcm9wICovCispOworCitleHRlcm4gdm9pZCBYU2V0V01Ob3JtYWxIaW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFNpemVIaW50cyoJCS8qIGhpbnRzICovCispOworCitleHRlcm4gdm9pZCBYU2V0V01Qcm9wZXJ0aWVzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYVGV4dFByb3BlcnR5KgkvKiB3aW5kb3dfbmFtZSAqLywKKyAgICBYVGV4dFByb3BlcnR5KgkvKiBpY29uX25hbWUgKi8sCisgICAgY2hhcioqCQkvKiBhcmd2ICovLAorICAgIGludAkJCS8qIGFyZ2MgKi8sCisgICAgWFNpemVIaW50cyoJCS8qIG5vcm1hbF9oaW50cyAqLywKKyAgICBYV01IaW50cyoJCS8qIHdtX2hpbnRzICovLAorICAgIFhDbGFzc0hpbnQqCQkvKiBjbGFzc19oaW50cyAqLworKTsKKworZXh0ZXJuIHZvaWQgWG1iU2V0V01Qcm9wZXJ0aWVzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHdpbmRvd19uYW1lICovLAorICAgIF9YY29uc3QgY2hhcioJLyogaWNvbl9uYW1lICovLAorICAgIGNoYXIqKgkJLyogYXJndiAqLywKKyAgICBpbnQJCQkvKiBhcmdjICovLAorICAgIFhTaXplSGludHMqCQkvKiBub3JtYWxfaGludHMgKi8sCisgICAgWFdNSGludHMqCQkvKiB3bV9oaW50cyAqLywKKyAgICBYQ2xhc3NIaW50KgkJLyogY2xhc3NfaGludHMgKi8KKyk7CisKK2V4dGVybiB2b2lkIFh1dGY4U2V0V01Qcm9wZXJ0aWVzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHdpbmRvd19uYW1lICovLAorICAgIF9YY29uc3QgY2hhcioJLyogaWNvbl9uYW1lICovLAorICAgIGNoYXIqKgkJLyogYXJndiAqLywKKyAgICBpbnQJCQkvKiBhcmdjICovLAorICAgIFhTaXplSGludHMqCQkvKiBub3JtYWxfaGludHMgKi8sCisgICAgWFdNSGludHMqCQkvKiB3bV9oaW50cyAqLywKKyAgICBYQ2xhc3NIaW50KgkJLyogY2xhc3NfaGludHMgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhTZXRXTVNpemVIaW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFNpemVIaW50cyoJCS8qIGhpbnRzICovLAorICAgIEF0b20JCS8qIHByb3BlcnR5ICovCispOworCitleHRlcm4gaW50IFhTZXRSZWdpb24oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBSZWdpb24JCS8qIHIgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhTZXRTdGFuZGFyZENvbG9ybWFwKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYU3RhbmRhcmRDb2xvcm1hcCoJLyogY29sb3JtYXAgKi8sCisgICAgQXRvbQkJLyogcHJvcGVydHkgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldFpvb21IaW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFNpemVIaW50cyoJCS8qIHpoaW50cyAqLworKTsKKworZXh0ZXJuIGludCBYU2hyaW5rUmVnaW9uKAorICAgIFJlZ2lvbgkJLyogciAqLywKKyAgICBpbnQJCQkvKiBkeCAqLywKKyAgICBpbnQJCQkvKiBkeSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYU3RyaW5nTGlzdFRvVGV4dFByb3BlcnR5KAorICAgIGNoYXIqKgkJLyogbGlzdCAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBYVGV4dFByb3BlcnR5KgkvKiB0ZXh0X3Byb3BfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhTdWJ0cmFjdFJlZ2lvbigKKyAgICBSZWdpb24JCS8qIHNyYSAqLywKKyAgICBSZWdpb24JCS8qIHNyYiAqLywKKyAgICBSZWdpb24JCS8qIGRyX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYbWJUZXh0TGlzdFRvVGV4dFByb3BlcnR5KAorICAgIERpc3BsYXkqCQlkaXNwbGF5LAorICAgIGNoYXIqKgkJbGlzdCwKKyAgICBpbnQJCQljb3VudCwKKyAgICBYSUNDRW5jb2RpbmdTdHlsZQlzdHlsZSwKKyAgICBYVGV4dFByb3BlcnR5Kgl0ZXh0X3Byb3BfcmV0dXJuCispOworCitleHRlcm4gaW50IFh3Y1RleHRMaXN0VG9UZXh0UHJvcGVydHkoCisgICAgRGlzcGxheSoJCWRpc3BsYXksCisgICAgd2NoYXJfdCoqCQlsaXN0LAorICAgIGludAkJCWNvdW50LAorICAgIFhJQ0NFbmNvZGluZ1N0eWxlCXN0eWxlLAorICAgIFhUZXh0UHJvcGVydHkqCXRleHRfcHJvcF9yZXR1cm4KKyk7CisKK2V4dGVybiBpbnQgWHV0ZjhUZXh0TGlzdFRvVGV4dFByb3BlcnR5KAorICAgIERpc3BsYXkqCQlkaXNwbGF5LAorICAgIGNoYXIqKgkJbGlzdCwKKyAgICBpbnQJCQljb3VudCwKKyAgICBYSUNDRW5jb2RpbmdTdHlsZQlzdHlsZSwKKyAgICBYVGV4dFByb3BlcnR5Kgl0ZXh0X3Byb3BfcmV0dXJuCispOworCitleHRlcm4gdm9pZCBYd2NGcmVlU3RyaW5nTGlzdCgKKyAgICB3Y2hhcl90KioJCWxpc3QKKyk7CisKK2V4dGVybiBTdGF0dXMgWFRleHRQcm9wZXJ0eVRvU3RyaW5nTGlzdCgKKyAgICBYVGV4dFByb3BlcnR5KgkvKiB0ZXh0X3Byb3AgKi8sCisgICAgY2hhcioqKgkJLyogbGlzdF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogY291bnRfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhtYlRleHRQcm9wZXJ0eVRvVGV4dExpc3QoCisgICAgRGlzcGxheSoJCWRpc3BsYXksCisgICAgY29uc3QgWFRleHRQcm9wZXJ0eSogdGV4dF9wcm9wLAorICAgIGNoYXIqKioJCWxpc3RfcmV0dXJuLAorICAgIGludCoJCWNvdW50X3JldHVybgorKTsKKworZXh0ZXJuIGludCBYd2NUZXh0UHJvcGVydHlUb1RleHRMaXN0KAorICAgIERpc3BsYXkqCQlkaXNwbGF5LAorICAgIGNvbnN0IFhUZXh0UHJvcGVydHkqIHRleHRfcHJvcCwKKyAgICB3Y2hhcl90KioqCQlsaXN0X3JldHVybiwKKyAgICBpbnQqCQljb3VudF9yZXR1cm4KKyk7CisKK2V4dGVybiBpbnQgWHV0ZjhUZXh0UHJvcGVydHlUb1RleHRMaXN0KAorICAgIERpc3BsYXkqCQlkaXNwbGF5LAorICAgIGNvbnN0IFhUZXh0UHJvcGVydHkqIHRleHRfcHJvcCwKKyAgICBjaGFyKioqCQlsaXN0X3JldHVybiwKKyAgICBpbnQqCQljb3VudF9yZXR1cm4KKyk7CisKK2V4dGVybiBpbnQgWFVuaW9uUmVjdFdpdGhSZWdpb24oCisgICAgWFJlY3RhbmdsZSoJCS8qIHJlY3RhbmdsZSAqLywKKyAgICBSZWdpb24JCS8qIHNyY19yZWdpb24gKi8sCisgICAgUmVnaW9uCQkvKiBkZXN0X3JlZ2lvbl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFVuaW9uUmVnaW9uKAorICAgIFJlZ2lvbgkJLyogc3JhICovLAorICAgIFJlZ2lvbgkJLyogc3JiICovLAorICAgIFJlZ2lvbgkJLyogZHJfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhXTUdlb21ldHJ5KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB1c2VyX2dlb21ldHJ5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogZGVmYXVsdF9nZW9tZXRyeSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogYm9yZGVyX3dpZHRoICovLAorICAgIFhTaXplSGludHMqCQkvKiBoaW50cyAqLywKKyAgICBpbnQqCQkvKiB4X3JldHVybiAqLywKKyAgICBpbnQqCQkvKiB5X3JldHVybiAqLywKKyAgICBpbnQqCQkvKiB3aWR0aF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogaGVpZ2h0X3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBncmF2aXR5X3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYWG9yUmVnaW9uKAorICAgIFJlZ2lvbgkJLyogc3JhICovLAorICAgIFJlZ2lvbgkJLyogc3JiICovLAorICAgIFJlZ2lvbgkJLyogZHJfcmV0dXJuICovCispOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYgLyogX1gxMV9YVVRJTF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHczMmRlZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1h3MzJkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlNGIzMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1h3MzJkZWZzLmgKQEAgLTAsMCArMSw3OSBAQAorI2lmbmRlZiBfWFczMkRFRlNfSAorIyBkZWZpbmUgIF9YVzMyREVGU19ICisKKyMgaWZkZWYgX19HTlVDX18gLyogbWluZ3cgaXMgbW9yZSBjbG9zZSB0byB1bml4IHRoYW4gbXN2YyAqLworIyAgaWYgIWRlZmluZWQoX19kYWRkcl90X2RlZmluZWQpIAordHlwZWRlZiBjaGFyICpjYWRkcl90OworIyAgZW5kaWYKKyMgIGRlZmluZSBsc3RhdCBzdGF0CisKKyMgZWxzZQordHlwZWRlZiBjaGFyICpjYWRkcl90OworCisjICBkZWZpbmUgYWNjZXNzCSAgIF9hY2Nlc3MKKyMgIGRlZmluZSBhbGxvY2EJICAgX2FsbG9jYQorIyAgZGVmaW5lIGNoZGlyCV9jaGRpcgorIyAgZGVmaW5lIGNobW9kCSAgIF9jaG1vZAorIyAgZGVmaW5lIGNsb3NlCSAgIF9jbG9zZQorIyAgZGVmaW5lIGNyZWF0CSAgIF9jcmVhdAorIyAgZGVmaW5lIGR1cAkgICBfZHVwCisjICBkZWZpbmUgZHVwMgkgICBfZHVwMgorIyAgZGVmaW5lIGVudmlyb24gICAgIF9lbnZpcm9uCisjICBkZWZpbmUgZXhlY2wJIF9leGVjbAorIyAgZGVmaW5lIGV4ZWNsZQkgX2V4ZWNsZQorIyAgZGVmaW5lIGV4ZWNscAkgX2V4ZWNscAorIyAgZGVmaW5lIGV4ZWNscGUgIF9leGVjbHBlCisjICBkZWZpbmUgZXhlY3YJIF9leGVjdgorIyAgZGVmaW5lIGV4ZWN2ZQkgX2V4ZWN2ZQorIyAgZGVmaW5lIGV4ZWN2cAkgX2V4ZWN2cAorIyAgZGVmaW5lIGV4ZWN2cGUgIF9leGVjdnBlCisjICBkZWZpbmUgZmRvcGVuCSAgX2Zkb3BlbgorIyAgZGVmaW5lIGZpbGVubwkgIF9maWxlbm8KKyMgIGRlZmluZSBmc3RhdAkgX2ZzdGF0CisjICBkZWZpbmUgZ2V0Y3dkCV9nZXRjd2QKKyMgIGRlZmluZSBnZXRwaWQJIF9nZXRwaWQKKyMgIGRlZmluZSBoeXBvdAkJX2h5cG90CisjICBkZWZpbmUgaXNhc2NpaSBfX2lzYXNjaWkKKyMgIGRlZmluZSBpc2F0dHkJICAgX2lzYXR0eQorIyAgZGVmaW5lIGxzZWVrCSAgIF9sc2VlaworIyAgZGVmaW5lIG1rZGlyCV9ta2RpcgorIyAgZGVmaW5lIG1rdGVtcAkgICBfbWt0ZW1wCisjICBkZWZpbmUgb3BlbgkgICBfb3BlbgorIyAgZGVmaW5lIHB1dGVudgkgICAgX3B1dGVudgorIyAgZGVmaW5lIHJlYWQJICAgX3JlYWQKKyMgIGRlZmluZSBybWRpcglfcm1kaXIKKyMgIGRlZmluZSBzbGVlcCh4KSBTbGVlcCgoeCkgKiAxMDAwKQorIyAgZGVmaW5lIHN0YXQJIF9zdGF0CisjICBkZWZpbmUgc3lzX2Vycmxpc3QgX3N5c19lcnJsaXN0CisjICBkZWZpbmUgc3lzX25lcnIgICAgX3N5c19uZXJyCisjICBkZWZpbmUgdW1hc2sJICAgX3VtYXNrCisjICBkZWZpbmUgdW5saW5rCSAgIF91bmxpbmsKKyMgIGRlZmluZSB3cml0ZQkgICBfd3JpdGUKKyMgIGRlZmluZSByYW5kb20gICByYW5kCisjICBkZWZpbmUgc3JhbmRvbSAgc3JhbmQKKworIyAgZGVmaW5lIE9fUkRPTkxZICAgIF9PX1JET05MWQorIyAgZGVmaW5lIE9fV1JPTkxZICAgIF9PX1dST05MWQorIyAgZGVmaW5lIE9fUkRXUgkgICAgX09fUkRXUgorIyAgZGVmaW5lIE9fQVBQRU5EICAgIF9PX0FQUEVORAorIyAgZGVmaW5lIE9fQ1JFQVQgICAgIF9PX0NSRUFUCisjICBkZWZpbmUgT19UUlVOQyAgICAgX09fVFJVTkMKKyMgIGRlZmluZSBPX0VYQ0wJICAgIF9PX0VYQ0wKKyMgIGRlZmluZSBPX1RFWFQJICAgIF9PX1RFWFQKKyMgIGRlZmluZSBPX0JJTkFSWSAgICBfT19CSU5BUlkKKyMgIGRlZmluZSBPX1JBVwkgICAgX09fQklOQVJZCisKKyMgIGRlZmluZSBTX0lGTVQJIF9TX0lGTVQKKyMgIGRlZmluZSBTX0lGRElSICBfU19JRkRJUgorIyAgZGVmaW5lIFNfSUZDSFIgIF9TX0lGQ0hSCisjICBkZWZpbmUgU19JRlJFRyAgX1NfSUZSRUcKKyMgIGRlZmluZSBTX0lSRUFEICBfU19JUkVBRAorIyAgZGVmaW5lIFNfSVdSSVRFIF9TX0lXUklURQorIyAgZGVmaW5lIFNfSUVYRUMgIF9TX0lFWEVDCisKKyMgIGRlZmluZQlGX09LCTAKKyMgIGRlZmluZQlYX09LCTEKKyMgIGRlZmluZQlXX09LCTIKKyMgIGRlZmluZQlSX09LCTQKKyMgZW5kaWYgLyogX19HTlVDX18gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHdpbmRvd3MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1h3aW5kb3dzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMxODE1NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1h3aW5kb3dzLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKworQ29weXJpZ2h0IDE5OTYsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKK2luIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUwtCitJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVAorU0hBTEwgVEhFIE9QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMLQorSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKK0lOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwKK25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3IKK290aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbQorVGhlIE9wZW4gR3JvdXAuCisKKyovCisKKy8qCisgKiBUaGlzIGhlYWRlciBmaWxlIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIGFsbG93aW5nIHRoZSBpbmNsdXNpb24gb2YKKyAqIHdpbmRvd3MuaCB3aXRob3V0IGdldHRpbmcgYW55IG5hbWUgY29uZmxpY3RzIHdpdGggWCBoZWFkZXJzIGNvZGUsIGJ5CisgKiByZW5hbWluZyB0aGUgY29uZmxpY3RpbmcgZGVmaW5pdGlvbnMgZnJvbSB3aW5kb3dzLmgKKyAqCisgKiBTb21lIChub24tTWljcm9zb2Z0KSB2ZXJzaW9ucyBvZiB0aGUgV2luZG93cyBBUEkgaGVhZGVycyBhY3R1YWxseSBhdm9pZAorICogbWFraW5nIHRoZSBjb25mbGljdGluZyBkZWZpbml0aW9ucyBpZiBYRnJlZTg2U2VydmVyIGlzIGRlZmluZWQsIHNvIHdlCisgKiBuZWVkIHRvIHJlbWVtYmVyIGlmIHRoYXQgd2FzIGRlZmluZWQgYW5kIHVuZGVmaW5lIGl0IGR1cmluZyBpbmNsdWRpbmcKKyAqIHdpbmRvd3MuaCAoc28gdGhlIGNvbmZsaWN0aW5nIGRlZmluaXRpb25zIGdldCB3cmFwcGVkIGNvcnJlY3RseSksIGFuZAorICogdGhlbiByZWRlZmluZSBpdCBhZnRlcndhcmRzLi4uCisgKgorICogVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgZ29vZCB3YXkgdG8gd3JhcCB0aGUgbWluL21heCBtYWNyb3MgZnJvbQorICogd2luZG93cy5oLCBzbyB3ZSBzaW1wbHkgYXZvaWQgZGVmaW5pbmcgdGhlbSBjb21wbGV0ZWx5LCBhbGxvd2luZyBhbnkKKyAqIHByZS1leGlzdGluZyBkZWZpbml0aW9uIHRvIHN0YW5kLgorICoKKyAqLworCisjdW5kZWYgX1hGcmVlODZTZXJ2ZXIKKyNpZmRlZiBYRnJlZTg2U2VydmVyCisjIGRlZmluZSBfWEZyZWU4NlNlcnZlcgorIyB1bmRlZiBYRnJlZTg2U2VydmVyCisjZW5kaWYKKworI2RlZmluZSBOT01JTk1BWAorI2RlZmluZSBCT09MIHdCT09MCisjZGVmaW5lIElOVDMyIHdJTlQzMgorI3VuZGVmIFN0YXR1cworI2RlZmluZSBTdGF0dXMgd1N0YXR1cworI2RlZmluZSBBVE9NIHdBVE9NCisjZGVmaW5lIEJZVEUgd0JZVEUKKyNkZWZpbmUgRnJlZVJlc291cmNlIHdGcmVlUmVzb3VyY2UKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjdW5kZWYgTk9NSU5NQVgKKyN1bmRlZiBTdGF0dXMKKyNkZWZpbmUgU3RhdHVzIGludAorI3VuZGVmIEJZVEUKKyN1bmRlZiBCT09MCisjdW5kZWYgSU5UMzIKKyN1bmRlZiBBVE9NCisjdW5kZWYgRnJlZVJlc291cmNlCisjdW5kZWYgQ3JlYXRlV2luZG93QQorCisjaWZkZWYgUkVTT1VSQ0VfSAorIyB1bmRlZiBSVF9GT05UCisjIHVuZGVmIFJUX0NVUlNPUgorIyBkZWZpbmUgUlRfRk9OVCAgICAgICAgICgoUkVTVFlQRSk0KQorIyBkZWZpbmUgUlRfQ1VSU09SICAgICAgICgoUkVTVFlQRSk1KQorI2VuZGlmCisKKyNpZm5kZWYgX19DWUdXSU5fXworI2RlZmluZSBzbGVlcCh4KSBTbGVlcCgoeCkgKiAxMDAwKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdJTjMyKSAmJiAoIWRlZmluZWQoUEFUSF9NQVgpIHx8IFBBVEhfTUFYIDwgMTAyNCkKKyMgdW5kZWYgUEFUSF9NQVgKKyMgZGVmaW5lIFBBVEhfTUFYIDEwMjQKKyNlbmRpZgorCisjaWZkZWYgX1hGcmVlODZTZXJ2ZXIKKyMgZGVmaW5lIFhGcmVlODZTZXJ2ZXIKKyMgdW5kZWYgX1hGcmVlODZTZXJ2ZXIKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9Yd2luc29jay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHdpbnNvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmNhN2I1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHdpbnNvY2suaApAQCAtMCwwICsxLDY1IEBACisvKgorCitDb3B5cmlnaHQgMTk5NiwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCitPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTC0KK0lUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UCitTSEFMTCBUSEUgT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUwtCitJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbAorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvcgorb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tCitUaGUgT3BlbiBHcm91cC4KKworKi8KKworLyoKKyAqIFRoaXMgaGVhZGVyIGZpbGUgaGFzIGZvciBzb2xlIHB1cnBvc2UgdG8gYWxsb3cgdG8gaW5jbHVkZSB3aW5zb2NrLmgKKyAqIHdpdGhvdXQgZ2V0dGluZyBhbnkgbmFtZSBjb25mbGljdHMgd2l0aCBvdXIgY29kZS4KKyAqIENvbmZsaWN0cyBjb21lIGZyb20gdGhlIGZhY3QgdGhhdCBpbmNsdWRpbmcgd2luc29jay5oIGFjdHVhbGx5IHB1bGxzCisgKiBpbiB0aGUgd2hvbGUgV2luZG93cyBBUEkuLi4KKyAqLworCisjdW5kZWYgX1hGcmVlODZTZXJ2ZXIKKyNpZmRlZiBYRnJlZTg2U2VydmVyIAorIyBkZWZpbmUgX1hGcmVlODZTZXJ2ZXIKKyMgdW5kZWYgWEZyZWU4NlNlcnZlcgorI2VuZGlmCisKKyNkZWZpbmUgQk9PTCB3Qk9PTAorI2RlZmluZSBJTlQzMiB3SU5UMzIKKyN1bmRlZiBTdGF0dXMKKyNkZWZpbmUgU3RhdHVzIHdTdGF0dXMKKyNkZWZpbmUgQVRPTSB3QVRPTQorI2RlZmluZSBCWVRFIHdCWVRFCisjZGVmaW5lIEZyZWVSZXNvdXJjZSB3RnJlZVJlc291cmNlCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyN1bmRlZiBTdGF0dXMKKyNkZWZpbmUgU3RhdHVzIGludAorI3VuZGVmIEJZVEUKKyN1bmRlZiBCT09MCisjdW5kZWYgSU5UMzIKKyN1bmRlZiBBVE9NCisjdW5kZWYgRnJlZVJlc291cmNlCisjdW5kZWYgQ3JlYXRlV2luZG93QQorI3VuZGVmIFJUX0ZPTlQKKyN1bmRlZiBSVF9DVVJTT1IKKworI2lmZGVmIF9YRnJlZTg2U2VydmVyCisjIGRlZmluZSBYRnJlZTg2U2VydmVyCisjIHVuZGVmIF9YRnJlZTg2U2VydmVyCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvYXBfa2V5c3ltLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9hcF9rZXlzeW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTExOTcxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvYXBfa2V5c3ltLmgKQEAgLTAsMCArMSw1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IDE5ODcgYnkgQXBvbGxvIENvbXB1dGVyIEluYy4sIENoZWxtc2ZvcmQsIE1hc3NhY2h1c2V0dHMuCitDb3B5cmlnaHQgMTk4OSBieSBIZXdsZXR0LVBhY2thcmQgQ29tcGFueS4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgZHVwbGljYXRlLCBjaGFuZ2UsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCitpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGdyYW50ZWQsIHByb3ZpZGVkCit0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBzdWNoIGNvcHkgYW5kIHRoYXQgdGhpcworY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlCituYW1lcyBvZiBBcG9sbG8gQ29tcHV0ZXIgSW5jLiwgdGhlIEhld2xldHQtUGFja2FyZCBDb21wYW55LCBvciB0aGUgWAorQ29uc29ydGl1bSBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0bworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKworSEVXTEVUVC1QQUNLQVJEIE1BS0VTIE5PIFdBUlJBTlRZIE9GIEFOWSBLSU5EIFdJVEggUkVHQVJECitUTyBUSElTIFNPRldBUkUsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgCitQVVJQT1NFLiAgSGV3bGV0dC1QYWNrYXJkIHNoYWxsIG5vdCBiZSBsaWFibGUgZm9yIGVycm9ycyAKK2NvbnRhaW5lZCBoZXJlaW4gb3IgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBvciAKK2NvbnNlcXVlbnRpYWwgZGFtYWdlcyBpbiBjb25uZWN0aW9uIHdpdGggdGhlIGZ1cm5pc2hpbmcsIAorcGVyZm9ybWFuY2UsIG9yIHVzZSBvZiB0aGlzIG1hdGVyaWFsLgorCitUaGlzIHNvZnR3YXJlIGlzIG5vdCBzdWJqZWN0IHRvIGFueSBsaWNlbnNlIG9mIHRoZSBBbWVyaWNhbgorVGVsZXBob25lIGFuZCBUZWxlZ3JhcGggQ29tcGFueSBvciBvZiB0aGUgUmVnZW50cyBvZiB0aGUKK1VuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBhcFhLX0xpbmVEZWwgICAgICAgICAgICAweDEwMDBGRjAwCisjZGVmaW5lIGFwWEtfQ2hhckRlbCAgICAgICAgICAgIDB4MTAwMEZGMDEKKyNkZWZpbmUgYXBYS19Db3B5ICAgICAgICAgICAgICAgMHgxMDAwRkYwMgorI2RlZmluZSBhcFhLX0N1dCAgICAgICAgICAgICAgICAweDEwMDBGRjAzCisjZGVmaW5lIGFwWEtfUGFzdGUgICAgICAgICAgICAgIDB4MTAwMEZGMDQKKyNkZWZpbmUgYXBYS19Nb3ZlICAgICAgICAgICAgICAgMHgxMDAwRkYwNQorI2RlZmluZSBhcFhLX0dyb3cgICAgICAgICAgICAgICAweDEwMDBGRjA2CisjZGVmaW5lIGFwWEtfQ21kICAgICAgICAgICAgICAgIDB4MTAwMEZGMDcKKyNkZWZpbmUgYXBYS19TaGVsbCAgICAgICAgICAgICAgMHgxMDAwRkYwOAorI2RlZmluZSBhcFhLX0xlZnRCYXIgICAgICAgICAgICAweDEwMDBGRjA5CisjZGVmaW5lIGFwWEtfUmlnaHRCYXIgICAgICAgICAgIDB4MTAwMEZGMEEKKyNkZWZpbmUgYXBYS19MZWZ0Qm94ICAgICAgICAgICAgMHgxMDAwRkYwQgorI2RlZmluZSBhcFhLX1JpZ2h0Qm94ICAgICAgICAgICAweDEwMDBGRjBDCisjZGVmaW5lIGFwWEtfVXBCb3ggICAgICAgICAgICAgIDB4MTAwMEZGMEQKKyNkZWZpbmUgYXBYS19Eb3duQm94ICAgICAgICAgICAgMHgxMDAwRkYwRQorI2RlZmluZSBhcFhLX1BvcCAgICAgICAgICAgICAgICAweDEwMDBGRjBGCisjZGVmaW5lIGFwWEtfUmVhZCAgICAgICAgICAgICAgIDB4MTAwMEZGMTAKKyNkZWZpbmUgYXBYS19FZGl0ICAgICAgICAgICAgICAgMHgxMDAwRkYxMQorI2RlZmluZSBhcFhLX1NhdmUgICAgICAgICAgICAgICAweDEwMDBGRjEyCisjZGVmaW5lIGFwWEtfRXhpdCAgICAgICAgICAgICAgIDB4MTAwMEZGMTMKKyNkZWZpbmUgYXBYS19SZXBlYXQgICAgICAgICAgICAgMHgxMDAwRkYxNAorCisjZGVmaW5lIGFwWEtfS1BfcGFyZW5sZWZ0ICAgICAgIDB4MTAwMEZGQTgKKyNkZWZpbmUgYXBYS19LUF9wYXJlbnJpZ2h0ICAgICAgMHgxMDAwRkZBOQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvY3Vyc29yZm9udC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvY3Vyc29yZm9udC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2OWQ1MDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9jdXJzb3Jmb250LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisKK0NvcHlyaWdodCAxOTg3LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCitpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKK09SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCitPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbAorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvcgorb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgorZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKi8KKworI2lmbmRlZiBfWDExX0NVUlNPUkZPTlRfSF8KKyNkZWZpbmUgX1gxMV9DVVJTT1JGT05UX0hfCisKKyNkZWZpbmUgWENfbnVtX2dseXBocyAxNTQKKyNkZWZpbmUgWENfWF9jdXJzb3IgMAorI2RlZmluZSBYQ19hcnJvdyAyCisjZGVmaW5lIFhDX2Jhc2VkX2Fycm93X2Rvd24gNAorI2RlZmluZSBYQ19iYXNlZF9hcnJvd191cCA2CisjZGVmaW5lIFhDX2JvYXQgOAorI2RlZmluZSBYQ19ib2dvc2l0eSAxMAorI2RlZmluZSBYQ19ib3R0b21fbGVmdF9jb3JuZXIgMTIKKyNkZWZpbmUgWENfYm90dG9tX3JpZ2h0X2Nvcm5lciAxNAorI2RlZmluZSBYQ19ib3R0b21fc2lkZSAxNgorI2RlZmluZSBYQ19ib3R0b21fdGVlIDE4CisjZGVmaW5lIFhDX2JveF9zcGlyYWwgMjAKKyNkZWZpbmUgWENfY2VudGVyX3B0ciAyMgorI2RlZmluZSBYQ19jaXJjbGUgMjQKKyNkZWZpbmUgWENfY2xvY2sgMjYKKyNkZWZpbmUgWENfY29mZmVlX211ZyAyOAorI2RlZmluZSBYQ19jcm9zcyAzMAorI2RlZmluZSBYQ19jcm9zc19yZXZlcnNlIDMyCisjZGVmaW5lIFhDX2Nyb3NzaGFpciAzNAorI2RlZmluZSBYQ19kaWFtb25kX2Nyb3NzIDM2CisjZGVmaW5lIFhDX2RvdCAzOAorI2RlZmluZSBYQ19kb3Rib3ggNDAKKyNkZWZpbmUgWENfZG91YmxlX2Fycm93IDQyCisjZGVmaW5lIFhDX2RyYWZ0X2xhcmdlIDQ0CisjZGVmaW5lIFhDX2RyYWZ0X3NtYWxsIDQ2CisjZGVmaW5lIFhDX2RyYXBlZF9ib3ggNDgKKyNkZWZpbmUgWENfZXhjaGFuZ2UgNTAKKyNkZWZpbmUgWENfZmxldXIgNTIKKyNkZWZpbmUgWENfZ29iYmxlciA1NAorI2RlZmluZSBYQ19ndW1ieSA1NgorI2RlZmluZSBYQ19oYW5kMSA1OAorI2RlZmluZSBYQ19oYW5kMiA2MAorI2RlZmluZSBYQ19oZWFydCA2MgorI2RlZmluZSBYQ19pY29uIDY0CisjZGVmaW5lIFhDX2lyb25fY3Jvc3MgNjYKKyNkZWZpbmUgWENfbGVmdF9wdHIgNjgKKyNkZWZpbmUgWENfbGVmdF9zaWRlIDcwCisjZGVmaW5lIFhDX2xlZnRfdGVlIDcyCisjZGVmaW5lIFhDX2xlZnRidXR0b24gNzQKKyNkZWZpbmUgWENfbGxfYW5nbGUgNzYKKyNkZWZpbmUgWENfbHJfYW5nbGUgNzgKKyNkZWZpbmUgWENfbWFuIDgwCisjZGVmaW5lIFhDX21pZGRsZWJ1dHRvbiA4MgorI2RlZmluZSBYQ19tb3VzZSA4NAorI2RlZmluZSBYQ19wZW5jaWwgODYKKyNkZWZpbmUgWENfcGlyYXRlIDg4CisjZGVmaW5lIFhDX3BsdXMgOTAKKyNkZWZpbmUgWENfcXVlc3Rpb25fYXJyb3cgOTIKKyNkZWZpbmUgWENfcmlnaHRfcHRyIDk0CisjZGVmaW5lIFhDX3JpZ2h0X3NpZGUgOTYKKyNkZWZpbmUgWENfcmlnaHRfdGVlIDk4CisjZGVmaW5lIFhDX3JpZ2h0YnV0dG9uIDEwMAorI2RlZmluZSBYQ19ydGxfbG9nbyAxMDIKKyNkZWZpbmUgWENfc2FpbGJvYXQgMTA0CisjZGVmaW5lIFhDX3NiX2Rvd25fYXJyb3cgMTA2CisjZGVmaW5lIFhDX3NiX2hfZG91YmxlX2Fycm93IDEwOAorI2RlZmluZSBYQ19zYl9sZWZ0X2Fycm93IDExMAorI2RlZmluZSBYQ19zYl9yaWdodF9hcnJvdyAxMTIKKyNkZWZpbmUgWENfc2JfdXBfYXJyb3cgMTE0CisjZGVmaW5lIFhDX3NiX3ZfZG91YmxlX2Fycm93IDExNgorI2RlZmluZSBYQ19zaHV0dGxlIDExOAorI2RlZmluZSBYQ19zaXppbmcgMTIwCisjZGVmaW5lIFhDX3NwaWRlciAxMjIKKyNkZWZpbmUgWENfc3ByYXljYW4gMTI0CisjZGVmaW5lIFhDX3N0YXIgMTI2CisjZGVmaW5lIFhDX3RhcmdldCAxMjgKKyNkZWZpbmUgWENfdGNyb3NzIDEzMAorI2RlZmluZSBYQ190b3BfbGVmdF9hcnJvdyAxMzIKKyNkZWZpbmUgWENfdG9wX2xlZnRfY29ybmVyIDEzNAorI2RlZmluZSBYQ190b3BfcmlnaHRfY29ybmVyIDEzNgorI2RlZmluZSBYQ190b3Bfc2lkZSAxMzgKKyNkZWZpbmUgWENfdG9wX3RlZSAxNDAKKyNkZWZpbmUgWENfdHJlayAxNDIKKyNkZWZpbmUgWENfdWxfYW5nbGUgMTQ0CisjZGVmaW5lIFhDX3VtYnJlbGxhIDE0NgorI2RlZmluZSBYQ191cl9hbmdsZSAxNDgKKyNkZWZpbmUgWENfd2F0Y2ggMTUwCisjZGVmaW5lIFhDX3h0ZXJtIDE1MgorCisjZW5kaWYgLyogX1gxMV9DVVJTT1JGT05UX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL0VWSS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9FVkkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjNmNzMzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9FVkkuaApAQCAtMCwwICsxLDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDE5OTcgYnkgU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCitzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0CitmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKK25vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgU2lsaWNvbiBHcmFwaGljcyBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uCitvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eQorb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKK3dpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KK1NJTElDT04gR1JBUEhJQ1MgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMKK1NPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKK0FORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gSU4gTk8gRVZFTlQgU0hBTEwgU0lMSUNPTgorR1JBUEhJQ1MgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTAorREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRQorT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OICBXSVRICitUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVZJX0hfCisjZGVmaW5lIF9FVklfSF8KKworI2RlZmluZSBYRVZJX1RSQU5TUEFSRU5DWV9OT05FCQkwCisjZGVmaW5lIFhFVklfVFJBTlNQQVJFTkNZX1BJWEVMCQkxCisjZGVmaW5lIFhFVklfVFJBTlNQQVJFTkNZX01BU0sJCTIKKworI2RlZmluZSBFVklOQU1FICJFeHRlbmRlZC1WaXN1YWwtSW5mb3JtYXRpb24iCisKKyNkZWZpbmUgWEVWSV9NQUpPUl9WRVJTSU9OCTEJLyogY3VycmVudCB2ZXJzaW9uIG51bWJlcnMgKi8KKyNkZWZpbmUgWEVWSV9NSU5PUl9WRVJTSU9OCTAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL0VWSXByb3RvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL0VWSXByb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhMjgyYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvRVZJcHJvdG8uaApAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDE5OTcgYnkgU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCitzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0CitmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKK25vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgU2lsaWNvbiBHcmFwaGljcyBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uCitvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eQorb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKK3dpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KK1NJTElDT04gR1JBUEhJQ1MgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMKK1NPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKK0FORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gSU4gTk8gRVZFTlQgU0hBTEwgU0lMSUNPTgorR1JBUEhJQ1MgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTAorREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRQorT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OICBXSVRICitUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVZJUFJPVE9fSF8KKyNkZWZpbmUgX0VWSVBST1RPX0hfCisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9FVkkuaD4KKworI2RlZmluZSBYX0VWSVF1ZXJ5VmVyc2lvbgkJMAorI2RlZmluZSBYX0VWSUdldFZpc3VhbEluZm8JCTEKKworI2RlZmluZSBWaXN1YWxJRCBDQVJEMzIKKwordHlwZWRlZiBDQVJEMzIgVmlzdWFsSUQzMjsKKyNkZWZpbmUgc3pfVmlzdWFsSUQzMiA0CisKK3R5cGVkZWYgc3RydWN0IF94RXh0ZW5kZWRWaXN1YWxJbmZvIHsKKyAgICBWaXN1YWxJRAljb3JlX3Zpc3VhbF9pZCBCMzI7CisgICAgSU5UOAlzY3JlZW47CisgICAgSU5UOAlsZXZlbDsKKyAgICBDQVJEOAl0cmFuc3BhcmVuY3lfdHlwZTsKKyAgICBDQVJEOAlwYWQwOworICAgIENBUkQzMgl0cmFuc3BhcmVuY3lfdmFsdWUgQjMyOworICAgIENBUkQ4CW1pbl9od19jb2xvcm1hcHM7CisgICAgQ0FSRDgJbWF4X2h3X2NvbG9ybWFwczsKKyAgICBDQVJEMTYJbnVtX2NvbG9ybWFwX2NvbmZsaWN0cyBCMTY7Cit9IHhFeHRlbmRlZFZpc3VhbEluZm87CisjZGVmaW5lIHN6X3hFeHRlbmRlZFZpc3VhbEluZm8gMTYKKwordHlwZWRlZiBzdHJ1Y3QgX1hFVklRdWVyeVZlcnNpb24geworICAgIENBUkQ4CXJlcVR5cGU7CQkvKiBhbHdheXMgWEVWSVJlcUNvZGUgKi8KKyAgICBDQVJEOAl4ZXZpUmVxVHlwZTsJCS8qIGFsd2F5cyBYX0VWSVF1ZXJ5VmVyc2lvbiAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworfSB4RVZJUXVlcnlWZXJzaW9uUmVxOworI2RlZmluZSBzel94RVZJUXVlcnlWZXJzaW9uUmVxCTQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDggCXVudXNlZDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNgltYWpvclZlcnNpb24gQjE2OwkvKiBtYWpvciB2ZXJzaW9uIG9mIEVWSSBwcm90b2NvbCAqLworICAgIENBUkQxNgltaW5vclZlcnNpb24gQjE2OwkvKiBtaW5vciB2ZXJzaW9uIG9mIEVWSSBwcm90b2NvbCAqLworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7Cit9IHhFVklRdWVyeVZlcnNpb25SZXBseTsKKyNkZWZpbmUgc3pfeEVWSVF1ZXJ5VmVyc2lvblJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF9YRVZJR2V0VmlzdWFsSW5mb1JlcSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFhFVklSZXFDb2RlICovCisgICAgQ0FSRDgJeGV2aVJlcVR5cGU7CS8qIGFsd2F5cyBYX0VWSUdldFZpc3VhbEluZm8gKi8KKyAgICBDQVJEMTYgICAgICBsZW5ndGggQjE2OworICAgIENBUkQzMiAJbl92aXN1YWwgQjMyOworfSB4RVZJR2V0VmlzdWFsSW5mb1JlcTsKKyNkZWZpbmUgc3pfeEVWSUdldFZpc3VhbEluZm9SZXEJOAorCit0eXBlZGVmIHN0cnVjdCBfWEVWSUdldFZpc3VhbEluZm9SZXBseSB7CisgICAgQllURQl0eXBlOyAgLyogWF9SZXBseSAqLworICAgIENBUkQ4CXVudXNlZDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMgluX2luZm8gQjMyOworICAgIENBUkQzMgluX2NvbmZsaWN0cyBCMzI7CisgICAgQ0FSRDMyCXBhZDAgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworfSB4RVZJR2V0VmlzdWFsSW5mb1JlcGx5OworI2RlZmluZSBzel94RVZJR2V0VmlzdWFsSW5mb1JlcGx5CTMyCisKKyN1bmRlZiBWaXN1YWxJRAorCisjZW5kaWYgLyogX0VWSVBST1RPX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL01JVE1pc2MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvTUlUTWlzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZmIzMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL01JVE1pc2MuaApAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUkFORE9NIENSVUZUISBUSElTIEhBUyBOTyBPRkZJQ0lBTCBYIENPTlNPUlRJVU0gT1IgWCBQUk9KRUNUIFRFQU0gQkxFU1NJTkcgKi8KKworI2lmbmRlZiBfWE1JVE1JU0NfSF8KKyNkZWZpbmUgX1hNSVRNSVNDX0hfCisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL21pdG1pc2Njb25zdC5oPgorCitfWEZVTkNQUk9UT0JFR0lOCisKK0Jvb2wgWE1JVE1pc2NRdWVyeUV4dGVuc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIGludCoJCS8qIGV2ZW50X2Jhc2VwICovLAorICAgIGludCoJCS8qIGVycm9yX2Jhc2VwICovCispOworCitTdGF0dXMgWE1JVE1pc2NTZXRCdWdNb2RlKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgQm9vbAkJLyogb25PZmYgKi8KKyk7CisKK0Jvb2wgWE1JVE1pc2NHZXRCdWdNb2RlKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YRVZJLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hFVkkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2E0NDEyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YRVZJLmgKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAxOTk3IGJ5IFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dAorZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKK25vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0Citub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIFNpbGljb24gR3JhcGhpY3Mgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbgorb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkKK29mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCit3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCitTSUxJQ09OIEdSQVBISUNTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTCitTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCitBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIElOIE5PIEVWRU5UIFNIQUxMIFNJTElDT04KK0dSQVBISUNTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwKK0RBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKK0RBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UKK09SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiAgV0lUSAorVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1hFVklfSF8KKyNkZWZpbmUgX1hFVklfSF8KKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL0VWSS5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVmlzdWFsSUQJCWNvcmVfdmlzdWFsX2lkOworICAgIGludAkJCXNjcmVlbjsKKyAgICBpbnQJCQlsZXZlbDsKKyAgICB1bnNpZ25lZCBpbnQJdHJhbnNwYXJlbmN5X3R5cGU7CisgICAgdW5zaWduZWQgaW50CXRyYW5zcGFyZW5jeV92YWx1ZTsKKyAgICB1bnNpZ25lZCBpbnQJbWluX2h3X2NvbG9ybWFwczsKKyAgICB1bnNpZ25lZCBpbnQJbWF4X2h3X2NvbG9ybWFwczsKKyAgICB1bnNpZ25lZCBpbnQJbnVtX2NvbG9ybWFwX2NvbmZsaWN0czsKKyAgICBWaXN1YWxJRCoJCWNvbG9ybWFwX2NvbmZsaWN0czsKK30gRXh0ZW5kZWRWaXN1YWxJbmZvOworCitfWEZVTkNQUk9UT0JFR0lOCisKK0Jvb2wgWGV2aVF1ZXJ5RXh0ZW5zaW9uKAorICAgIERpc3BsYXkqICAgICAgICAgICAgLyogZHB5ICovCispOworU3RhdHVzIFhldmlRdWVyeVZlcnNpb24oCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBpbnQqCQkvKiBtYWpvclZlcnNpb24gKi8sCisgICAgaW50KgkJLyogbWlub3JWZXJzaW9uICovCispOworU3RhdHVzIFhldmlHZXRWaXN1YWxJbmZvKAorICAgIERpc3BsYXkqCQkgCS8qIGRweSAqLywKKyAgICBWaXN1YWxJRCoJCQkvKiB2aXN1YWxfcXVlcnkgKi8sCisgICAgaW50CQkJCS8qIG5WaXN1YWxfcXVlcnkgKi8sCisgICAgRXh0ZW5kZWRWaXN1YWxJbmZvKioJLyogZXh0ZW5kZWRWaXN1YWxJbmZvX3JldHVybiAqLywKKyAgICBpbnQqCQkJLyogbkluZm9fcmV0dXJuICovCispOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjQ0Mzk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YSS5oCkBAIC0wLDAgKzEsMzA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCitDb3B5cmlnaHQgMTk4OSBieSBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhLgorCisJCQlBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEhld2xldHQtUGFja2FyZCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorCitIRVdMRVRULVBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORworQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCitIRVdMRVRULVBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERlZmluaXRpb25zIHVzZWQgYnkgdGhlIHNlcnZlciwgbGlicmFyeSBhbmQgY2xpZW50ICovCisKKyNpZm5kZWYgX1hJX0hfCisjZGVmaW5lIF9YSV9IXworCisjZGVmaW5lIHN6X3hHZXRFeHRlbnNpb25WZXJzaW9uUmVxICAgICAgICAgICAgIDgKKyNkZWZpbmUgc3pfeEdldEV4dGVuc2lvblZlcnNpb25SZXBseSAgICAgICAgICAgMzIKKyNkZWZpbmUgc3pfeExpc3RJbnB1dERldmljZXNSZXEJCQk0CisjZGVmaW5lIHN6X3hMaXN0SW5wdXREZXZpY2VzUmVwbHkJCTMyCisjZGVmaW5lIHN6X3hPcGVuRGV2aWNlUmVxCQkJOAorI2RlZmluZSBzel94T3BlbkRldmljZVJlcGx5CQkJMzIKKyNkZWZpbmUgc3pfeENsb3NlRGV2aWNlUmVxCQkJOAorI2RlZmluZSBzel94U2V0RGV2aWNlTW9kZVJlcQkJCTgKKyNkZWZpbmUgc3pfeFNldERldmljZU1vZGVSZXBseQkJCTMyCisjZGVmaW5lIHN6X3hTZWxlY3RFeHRlbnNpb25FdmVudFJlcQkJMTIKKyNkZWZpbmUgc3pfeEdldFNlbGVjdGVkRXh0ZW5zaW9uRXZlbnRzUmVxCTgKKyNkZWZpbmUgc3pfeEdldFNlbGVjdGVkRXh0ZW5zaW9uRXZlbnRzUmVwbHkJMzIKKyNkZWZpbmUgc3pfeENoYW5nZURldmljZURvbnRQcm9wYWdhdGVMaXN0UmVxCTEyCisjZGVmaW5lIHN6X3hHZXREZXZpY2VEb250UHJvcGFnYXRlTGlzdFJlcQk4CisjZGVmaW5lIHN6X3hHZXREZXZpY2VEb250UHJvcGFnYXRlTGlzdFJlcGx5CTMyCisjZGVmaW5lIHN6X3hHZXREZXZpY2VNb3Rpb25FdmVudHNSZXEJCTE2CisjZGVmaW5lIHN6X3hHZXREZXZpY2VNb3Rpb25FdmVudHNSZXBseQkJMzIKKyNkZWZpbmUgc3pfeENoYW5nZUtleWJvYXJkRGV2aWNlUmVxCQk4CisjZGVmaW5lIHN6X3hDaGFuZ2VLZXlib2FyZERldmljZVJlcGx5CQkzMgorI2RlZmluZSBzel94Q2hhbmdlUG9pbnRlckRldmljZVJlcQkJOAorI2RlZmluZSBzel94Q2hhbmdlUG9pbnRlckRldmljZVJlcGx5CQkzMgorI2RlZmluZSBzel94R3JhYkRldmljZVJlcQkJCTIwCisjZGVmaW5lIHN6X3hHcmFiRGV2aWNlUmVwbHkJCQkzMgorI2RlZmluZSBzel94VW5ncmFiRGV2aWNlUmVxCQkJMTIKKyNkZWZpbmUgc3pfeEdyYWJEZXZpY2VLZXlSZXEJCQkyMAorI2RlZmluZSBzel94R3JhYkRldmljZUtleVJlcGx5CQkJMzIKKyNkZWZpbmUgc3pfeFVuZ3JhYkRldmljZUtleVJlcQkJCTE2CisjZGVmaW5lIHN6X3hHcmFiRGV2aWNlQnV0dG9uUmVxCQkJMjAKKyNkZWZpbmUgc3pfeEdyYWJEZXZpY2VCdXR0b25SZXBseQkJMzIKKyNkZWZpbmUgc3pfeFVuZ3JhYkRldmljZUJ1dHRvblJlcQkJMTYKKyNkZWZpbmUgc3pfeEFsbG93RGV2aWNlRXZlbnRzUmVxCQkxMgorI2RlZmluZSBzel94R2V0RGV2aWNlRm9jdXNSZXEJCQk4CisjZGVmaW5lIHN6X3hHZXREZXZpY2VGb2N1c1JlcGx5CQkJMzIKKyNkZWZpbmUgc3pfeFNldERldmljZUZvY3VzUmVxCQkJMTYKKyNkZWZpbmUgc3pfeEdldEZlZWRiYWNrQ29udHJvbFJlcQkJOAorI2RlZmluZSBzel94R2V0RmVlZGJhY2tDb250cm9sUmVwbHkJCTMyCisjZGVmaW5lIHN6X3hDaGFuZ2VGZWVkYmFja0NvbnRyb2xSZXEJCTEyCisjZGVmaW5lIHN6X3hHZXREZXZpY2VLZXlNYXBwaW5nUmVxCQk4CisjZGVmaW5lIHN6X3hHZXREZXZpY2VLZXlNYXBwaW5nUmVwbHkJCTMyCisjZGVmaW5lIHN6X3hDaGFuZ2VEZXZpY2VLZXlNYXBwaW5nUmVxCQk4CisjZGVmaW5lIHN6X3hHZXREZXZpY2VNb2RpZmllck1hcHBpbmdSZXEJCTgKKyNkZWZpbmUgc3pfeFNldERldmljZU1vZGlmaWVyTWFwcGluZ1JlcQkJOAorI2RlZmluZSBzel94U2V0RGV2aWNlTW9kaWZpZXJNYXBwaW5nUmVwbHkJMzIKKyNkZWZpbmUgc3pfeEdldERldmljZUJ1dHRvbk1hcHBpbmdSZXEJCTgKKyNkZWZpbmUgc3pfeEdldERldmljZUJ1dHRvbk1hcHBpbmdSZXBseQkJMzIKKyNkZWZpbmUgc3pfeFNldERldmljZUJ1dHRvbk1hcHBpbmdSZXEJCTgKKyNkZWZpbmUgc3pfeFNldERldmljZUJ1dHRvbk1hcHBpbmdSZXBseQkJMzIKKyNkZWZpbmUgc3pfeFF1ZXJ5RGV2aWNlU3RhdGVSZXEJCQk4CisjZGVmaW5lIHN6X3hRdWVyeURldmljZVN0YXRlUmVwbHkJCTMyCisjZGVmaW5lIHN6X3hTZW5kRXh0ZW5zaW9uRXZlbnRSZXEJCTE2CisjZGVmaW5lIHN6X3hEZXZpY2VCZWxsUmVxCQkJOAorI2RlZmluZSBzel94U2V0RGV2aWNlVmFsdWF0b3JzUmVxCQk4CisjZGVmaW5lIHN6X3hTZXREZXZpY2VWYWx1YXRvcnNSZXBseQkJMzIKKyNkZWZpbmUgc3pfeEdldERldmljZUNvbnRyb2xSZXEJCQk4CisjZGVmaW5lIHN6X3hHZXREZXZpY2VDb250cm9sUmVwbHkJCTMyCisjZGVmaW5lIHN6X3hDaGFuZ2VEZXZpY2VDb250cm9sUmVxCQk4CisjZGVmaW5lIHN6X3hDaGFuZ2VEZXZpY2VDb250cm9sUmVwbHkJCTMyCisjZGVmaW5lIHN6X3hMaXN0RGV2aWNlUHJvcGVydGllc1JlcSAgICAgICAgICAgICA4CisjZGVmaW5lIHN6X3hMaXN0RGV2aWNlUHJvcGVydGllc1JlcGx5ICAgICAgICAgICAzMgorI2RlZmluZSBzel94Q2hhbmdlRGV2aWNlUHJvcGVydHlSZXEgICAgICAgICAgICAgMjAKKyNkZWZpbmUgc3pfeERlbGV0ZURldmljZVByb3BlcnR5UmVxICAgICAgICAgICAgIDEyCisjZGVmaW5lIHN6X3hHZXREZXZpY2VQcm9wZXJ0eVJlcSAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBzel94R2V0RGV2aWNlUHJvcGVydHlSZXBseSAgICAgICAgICAgICAgMzIKKworI2RlZmluZSBJTkFNRQkJIlhJbnB1dEV4dGVuc2lvbiIKKworI2RlZmluZSBYSV9LRVlCT0FSRAkiS0VZQk9BUkQiCisjZGVmaW5lIFhJX01PVVNFCSJNT1VTRSIKKyNkZWZpbmUgWElfVEFCTEVUCSJUQUJMRVQiCisjZGVmaW5lIFhJX1RPVUNIU0NSRUVOCSJUT1VDSFNDUkVFTiIKKyNkZWZpbmUgWElfVE9VQ0hQQUQJIlRPVUNIUEFEIgorI2RlZmluZSBYSV9CQVJDT0RFCSJCQVJDT0RFIgorI2RlZmluZSBYSV9CVVRUT05CT1gJIkJVVFRPTkJPWCIKKyNkZWZpbmUgWElfS05PQl9CT1gJIktOT0JfQk9YIgorI2RlZmluZSBYSV9PTkVfS05PQgkiT05FX0tOT0IiCisjZGVmaW5lIFhJX05JTkVfS05PQgkiTklORV9LTk9CIgorI2RlZmluZSBYSV9UUkFDS0JBTEwJIlRSQUNLQkFMTCIKKyNkZWZpbmUgWElfUVVBRFJBVFVSRQkiUVVBRFJBVFVSRSIKKyNkZWZpbmUgWElfSURfTU9EVUxFCSJJRF9NT0RVTEUiCisjZGVmaW5lIFhJX1NQQUNFQkFMTAkiU1BBQ0VCQUxMIgorI2RlZmluZSBYSV9EQVRBR0xPVkUJIkRBVEFHTE9WRSIKKyNkZWZpbmUgWElfRVlFVFJBQ0tFUgkiRVlFVFJBQ0tFUiIKKyNkZWZpbmUgWElfQ1VSU09SS0VZUwkiQ1VSU09SS0VZUyIKKyNkZWZpbmUgWElfRk9PVE1PVVNFCSJGT09UTU9VU0UiCisjZGVmaW5lIFhJX0pPWVNUSUNLCSJKT1lTVElDSyIKKworLyogSW5kaWNlcyBpbnRvIHRoZSB2ZXJzaW9uc1tdIGFycmF5IChYRXh0SW50LmMpLiBVc2VkIGFzIGEgaW5kZXggdG8KKyAqIHJldHJpZXZlIHRoZSBtaW5pbXVtIHZlcnNpb24gb2YgWEkgZnJvbSBfWGlDaGVja0V4dEluaXQgKi8KKyNkZWZpbmUgRG9udF9DaGVjawkJCTAKKyNkZWZpbmUgWElucHV0X0luaXRpYWxfUmVsZWFzZQkJMQorI2RlZmluZSBYSW5wdXRfQWRkX1hEZXZpY2VCZWxsCQkyCisjZGVmaW5lIFhJbnB1dF9BZGRfWFNldERldmljZVZhbHVhdG9ycwkzCisjZGVmaW5lIFhJbnB1dF9BZGRfWENoYW5nZURldmljZUNvbnRyb2wJNAorI2RlZmluZSBYSW5wdXRfQWRkX0RldmljZVByZXNlbmNlTm90aWZ5CTUKKyNkZWZpbmUgWElucHV0X0FkZF9EZXZpY2VQcm9wZXJ0aWVzCTYKKy8qIERPIE5PVCBBREQgVE8gSEVSRSAtPiBYSTIgKi8KKworI2RlZmluZSBYSV9BYnNlbnQJCTAKKyNkZWZpbmUgWElfUHJlc2VudAkJMQorCisjZGVmaW5lIFhJX0luaXRpYWxfUmVsZWFzZV9NYWpvcgkJMQorI2RlZmluZSBYSV9Jbml0aWFsX1JlbGVhc2VfTWlub3IJCTAKKworI2RlZmluZSBYSV9BZGRfWERldmljZUJlbGxfTWFqb3IJCTEKKyNkZWZpbmUgWElfQWRkX1hEZXZpY2VCZWxsX01pbm9yCQkxCisKKyNkZWZpbmUgWElfQWRkX1hTZXREZXZpY2VWYWx1YXRvcnNfTWFqb3IJMQorI2RlZmluZSBYSV9BZGRfWFNldERldmljZVZhbHVhdG9yc19NaW5vcgkyCisKKyNkZWZpbmUgWElfQWRkX1hDaGFuZ2VEZXZpY2VDb250cm9sX01ham9yCTEKKyNkZWZpbmUgWElfQWRkX1hDaGFuZ2VEZXZpY2VDb250cm9sX01pbm9yCTMKKworI2RlZmluZSBYSV9BZGRfRGV2aWNlUHJlc2VuY2VOb3RpZnlfTWFqb3IJMQorI2RlZmluZSBYSV9BZGRfRGV2aWNlUHJlc2VuY2VOb3RpZnlfTWlub3IJNAorCisjZGVmaW5lIFhJX0FkZF9EZXZpY2VQcm9wZXJ0aWVzX01ham9yCQkxCisjZGVmaW5lIFhJX0FkZF9EZXZpY2VQcm9wZXJ0aWVzX01pbm9yCQk1CisKKyNkZWZpbmUgREVWSUNFX1JFU09MVVRJT04JMQorI2RlZmluZSBERVZJQ0VfQUJTX0NBTElCICAgICAgICAyCisjZGVmaW5lIERFVklDRV9DT1JFICAgICAgICAgICAgIDMKKyNkZWZpbmUgREVWSUNFX0VOQUJMRSAgICAgICAgICAgNAorI2RlZmluZSBERVZJQ0VfQUJTX0FSRUEgICAgICAgICA1CisKKyNkZWZpbmUgTm9TdWNoRXh0ZW5zaW9uCQkxCisKKyNkZWZpbmUgQ09VTlQJCQkwCisjZGVmaW5lIENSRUFURQkJCTEKKworI2RlZmluZSBOZXdQb2ludGVyCQkwCisjZGVmaW5lIE5ld0tleWJvYXJkCQkxCisKKyNkZWZpbmUgWFBPSU5URVIJCTAKKyNkZWZpbmUgWEtFWUJPQVJECQkxCisKKyNkZWZpbmUgVXNlWEtleWJvYXJkCQkweEZGCisKKyNkZWZpbmUgSXNYUG9pbnRlcgkJMAorI2RlZmluZSBJc1hLZXlib2FyZAkJMQorI2RlZmluZSBJc1hFeHRlbnNpb25EZXZpY2UJMgorI2RlZmluZSBJc1hFeHRlbnNpb25LZXlib2FyZCAgICAzCisjZGVmaW5lIElzWEV4dGVuc2lvblBvaW50ZXIgICAgIDQKKworI2RlZmluZSBBc3luY1RoaXNEZXZpY2UJCTAKKyNkZWZpbmUgU3luY1RoaXNEZXZpY2UJCTEKKyNkZWZpbmUgUmVwbGF5VGhpc0RldmljZQkyCisjZGVmaW5lIEFzeW5jT3RoZXJEZXZpY2VzCTMKKyNkZWZpbmUgQXN5bmNBbGwJCTQKKyNkZWZpbmUgU3luY0FsbAkJCTUKKworI2RlZmluZSBGb2xsb3dLZXlib2FyZCAJCTMKKyNpZm5kZWYgUmV2ZXJ0VG9Gb2xsb3dLZXlib2FyZAorI2RlZmluZSBSZXZlcnRUb0ZvbGxvd0tleWJvYXJkIAkzCisjZW5kaWYKKworI2RlZmluZSBEdkFjY2VsTnVtICAgICAgICAgICAgICAoMUwgPDwgMCkKKyNkZWZpbmUgRHZBY2NlbERlbm9tICAgICAgICAgICAgKDFMIDw8IDEpCisjZGVmaW5lIER2VGhyZXNob2xkICAgICAgICAgICAgICgxTCA8PCAyKQorCisjZGVmaW5lIER2S2V5Q2xpY2tQZXJjZW50CSgxTDw8MCkKKyNkZWZpbmUgRHZQZXJjZW50CQkoMUw8PDEpCisjZGVmaW5lIER2UGl0Y2gJCQkoMUw8PDIpCisjZGVmaW5lIER2RHVyYXRpb24JCSgxTDw8MykKKyNkZWZpbmUgRHZMZWQJCQkoMUw8PDQpCisjZGVmaW5lIER2TGVkTW9kZQkJKDFMPDw1KQorI2RlZmluZSBEdktleQkJCSgxTDw8NikKKyNkZWZpbmUgRHZBdXRvUmVwZWF0TW9kZQkoMUw8PDcpCisKKyNkZWZpbmUgRHZTdHJpbmcgICAgICAgICAgICAgICAgKDFMIDw8IDApCisKKyNkZWZpbmUgRHZJbnRlZ2VyICAgICAgICAgICAgICAgKDFMIDw8IDApCisKKyNkZWZpbmUgRGV2aWNlTW9kZSAgICAgICAgICAgICAgKDFMIDw8IDApCisjZGVmaW5lIFJlbGF0aXZlICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQWJzb2x1dGUgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFByb3hpbWl0eVN0YXRlICAgICAgICAgICgxTCA8PCAxKQorI2RlZmluZSBJblByb3hpbWl0eSAgICAgICAgICAgICAoMEwgPDwgMSkKKyNkZWZpbmUgT3V0T2ZQcm94aW1pdHkgICAgICAgICAgKDFMIDw8IDEpCisKKyNkZWZpbmUgQWRkVG9MaXN0ICAgICAgICAgICAgICAgMAorI2RlZmluZSBEZWxldGVGcm9tTGlzdCAgICAgICAgICAxCisKKyNkZWZpbmUgS2V5Q2xhc3MgIAkJMAorI2RlZmluZSBCdXR0b25DbGFzcyAgCQkxCisjZGVmaW5lIFZhbHVhdG9yQ2xhc3MgIAkJMgorI2RlZmluZSBGZWVkYmFja0NsYXNzICAJCTMKKyNkZWZpbmUgUHJveGltaXR5Q2xhc3MgIAk0CisjZGVmaW5lIEZvY3VzQ2xhc3MgIAkJNQorI2RlZmluZSBPdGhlckNsYXNzICAJCTYKKyNkZWZpbmUgQXR0YWNoQ2xhc3MgICAgICAgICAgICAgNworCisjZGVmaW5lIEtiZEZlZWRiYWNrQ2xhc3MgIAkwCisjZGVmaW5lIFB0ckZlZWRiYWNrQ2xhc3MgIAkxCisjZGVmaW5lIFN0cmluZ0ZlZWRiYWNrQ2xhc3MgIAkyCisjZGVmaW5lIEludGVnZXJGZWVkYmFja0NsYXNzICAJMworI2RlZmluZSBMZWRGZWVkYmFja0NsYXNzICAJNAorI2RlZmluZSBCZWxsRmVlZGJhY2tDbGFzcyAgCTUKKworI2RlZmluZSBfZGV2aWNlUG9pbnRlck1vdGlvbkhpbnQgMAorI2RlZmluZSBfZGV2aWNlQnV0dG9uMU1vdGlvbgkgMQorI2RlZmluZSBfZGV2aWNlQnV0dG9uMk1vdGlvbgkgMgorI2RlZmluZSBfZGV2aWNlQnV0dG9uM01vdGlvbgkgMworI2RlZmluZSBfZGV2aWNlQnV0dG9uNE1vdGlvbgkgNAorI2RlZmluZSBfZGV2aWNlQnV0dG9uNU1vdGlvbgkgNQorI2RlZmluZSBfZGV2aWNlQnV0dG9uTW90aW9uCSA2CisjZGVmaW5lIF9kZXZpY2VCdXR0b25HcmFiCSA3CisjZGVmaW5lIF9kZXZpY2VPd25lckdyYWJCdXR0b24JIDgKKyNkZWZpbmUgX25vRXh0ZW5zaW9uRXZlbnQJIDkKKworI2RlZmluZSBfZGV2aWNlUHJlc2VuY2UJCSAwCisKKyNkZWZpbmUgX2RldmljZUVudGVyICAgICAgICAgICAgIDAKKyNkZWZpbmUgX2RldmljZUxlYXZlICAgICAgICAgICAgIDEKKworLyogRGV2aWNlIHByZXNlbmNlIG5vdGlmeSBzdGF0ZXMgKi8KKyNkZWZpbmUgRGV2aWNlQWRkZWQgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRGV2aWNlUmVtb3ZlZCAgICAgICAgICAgIDEKKyNkZWZpbmUgRGV2aWNlRW5hYmxlZCAgICAgICAgICAgIDIKKyNkZWZpbmUgRGV2aWNlRGlzYWJsZWQgICAgICAgICAgIDMKKyNkZWZpbmUgRGV2aWNlVW5yZWNvdmVyYWJsZSAgICAgIDQKKyNkZWZpbmUgRGV2aWNlQ29udHJvbENoYW5nZWQgICAgIDUKKworLyogWEkgRXJyb3JzICovCisjZGVmaW5lIFhJX0JhZERldmljZQkwCisjZGVmaW5lIFhJX0JhZEV2ZW50CTEKKyNkZWZpbmUgWElfQmFkTW9kZQkyCisjZGVmaW5lIFhJX0RldmljZUJ1c3kJMworI2RlZmluZSBYSV9CYWRDbGFzcwk0CisKKy8qCisgKiBNYWtlIFhFdmVudENsYXNzIGJlIGEgQ0FSRDMyIGZvciA2NCBiaXQgc2VydmVycy4gIERvbid0IGFmZmVjdCBjbGllbnQKKyAqIGRlZmluaXRpb24gb2YgWEV2ZW50Q2xhc3Mgc2luY2UgdGhhdCB3b3VsZCBiZSBhIGxpYnJhcnkgaW50ZXJmYWNlIGNoYW5nZS4KKyAqIFNlZSB0aGUgdG9wIG9mIFguaCBmb3IgbW9yZSBfWFNFUlZFUjY0IG1hZ2ljLgorICoKKyAqIEJ1dCwgZG9uJ3QgYWN0dWFsbHkgdXNlIHRoZSBDQVJEMzIgdHlwZS4gIFdlIGNhbid0IGdldCBpdCBkZWZpbmVkIGhlcmUKKyAqIHdpdGhvdXQgcG9sbHV0aW5nIHRoZSBuYW1lc3BhY2UuCisgKi8KKyNpZmRlZiBfWFNFUlZFUjY0Cit0eXBlZGVmCXVuc2lnbmVkIGludAlYRXZlbnRDbGFzczsKKyNlbHNlCit0eXBlZGVmCXVuc2lnbmVkIGxvbmcJWEV2ZW50Q2xhc3M7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBFeHRlbnNpb24gdmVyc2lvbiBzdHJ1Y3R1cmUuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgaW50ICAgCXByZXNlbnQ7CisgICAgICAgIHNob3J0CW1ham9yX3ZlcnNpb247CisgICAgICAgIHNob3J0CW1pbm9yX3ZlcnNpb247Cit9IFhFeHRlbnNpb25WZXJzaW9uOworCisjZW5kaWYgLyogX1hJX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hJMi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YSTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODY0YjA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YSTIuaApAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA5IFJlZCBIYXQsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX1hJMl9IXworI2RlZmluZSBfWEkyX0hfCisKKyNkZWZpbmUgWElucHV0XzJfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKKy8qIERPIE5PVCBBREQgVE8gVEhJUyBMSVNULiBUaGVzZSBhcmUgbGliWGktc3BlY2lmaWMgZGVmaW5lcy4KKyAgIFNlZSBjb21taXQgbGliWGktMS40LjItMjEtZ2U4NTMxZGQgKi8KKworI2RlZmluZSBYSV8yX01ham9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBYSV8yX01pbm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorCisvKiBQcm9wZXJ0eSBldmVudCBmbGFncyAqLworI2RlZmluZSBYSVByb3BlcnR5RGVsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBYSVByb3BlcnR5Q3JlYXRlZCAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBYSVByb3BlcnR5TW9kaWZpZWQgICAgICAgICAgICAgICAgICAgICAgMgorCisvKiBQcm9wZXJ0eSBtb2RlcyAqLworI2RlZmluZSBYSVByb3BNb2RlUmVwbGFjZSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBYSVByb3BNb2RlUHJlcGVuZCAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBYSVByb3BNb2RlQXBwZW5kICAgICAgICAgICAgICAgICAgICAgICAgMgorCisvKiBTcGVjaWFsIHByb3BlcnR5IHR5cGUgdXNlZCBmb3IgWElHZXRQcm9wZXJ0eSAqLworI2RlZmluZSBYSUFueVByb3BlcnR5VHlwZSAgICAgICAgICAgICAgICAgICAgICAgMEwKKworLyogRW50ZXIvTGVhdmUgYW5kIEZvY3VzIEluL091dCBtb2RlcyAqLworI2RlZmluZSBYSU5vdGlmeU5vcm1hbCAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBYSU5vdGlmeUdyYWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBYSU5vdGlmeVVuZ3JhYiAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBYSU5vdGlmeVdoaWxlR3JhYmJlZCAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBYSU5vdGlmeVBhc3NpdmVHcmFiICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBYSU5vdGlmeVBhc3NpdmVVbmdyYWIgICAgICAgICAgICAgICAgICAgNQorCisvKiBFbnRlci9MZWF2ZSBhbmQgZm9jdXMgSW4vb3V0IGRldGFpbCAqLworI2RlZmluZSBYSU5vdGlmeUFuY2VzdG9yICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBYSU5vdGlmeVZpcnR1YWwgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBYSU5vdGlmeUluZmVyaW9yICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBYSU5vdGlmeU5vbmxpbmVhciAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBYSU5vdGlmeU5vbmxpbmVhclZpcnR1YWwgICAgICAgICAgICAgICAgNAorI2RlZmluZSBYSU5vdGlmeVBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBYSU5vdGlmeVBvaW50ZXJSb290ICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBYSU5vdGlmeURldGFpbE5vbmUgICAgICAgICAgICAgICAgICAgICAgNworCisvKiBHcmFiIG1vZGVzICovCisjZGVmaW5lIFhJR3JhYk1vZGVTeW5jICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFhJR3JhYk1vZGVBc3luYyAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFhJR3JhYk1vZGVUb3VjaCAgICAgICAgICAgICAgICAgICAgICAgICAyCisKKy8qIEdyYWIgcmVwbHkgc3RhdHVzIGNvZGVzICovCisjZGVmaW5lIFhJR3JhYlN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFhJQWxyZWFkeUdyYWJiZWQgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFhJR3JhYkludmFsaWRUaW1lICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFhJR3JhYk5vdFZpZXdhYmxlICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFhJR3JhYkZyb3plbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisKKy8qIEdyYWIgb3duZXIgZXZlbnRzIHZhbHVlcyAqLworI2RlZmluZSBYSU93bmVyRXZlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZQorI2RlZmluZSBYSU5vT3duZXJFdmVudHMgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UKKworLyogUGFzc2l2ZSBncmFiIHR5cGVzICovCisjZGVmaW5lIFhJR3JhYnR5cGVCdXR0b24gICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFhJR3JhYnR5cGVLZXljb2RlICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFhJR3JhYnR5cGVFbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFhJR3JhYnR5cGVGb2N1c0luICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFhJR3JhYnR5cGVUb3VjaEJlZ2luICAgICAgICAgICAgICAgICAgICA0CisKKy8qIFBhc3NpdmUgZ3JhYiBtb2RpZmllciAqLworI2RlZmluZSBYSUFueU1vZGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFVIDw8IDMxKQorI2RlZmluZSBYSUFueUJ1dHRvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBYSUFueUtleWNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBYSUFsbG93RXZlbnRzIGV2ZW50LW1vZGVzICovCisjZGVmaW5lIFhJQXN5bmNEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFhJU3luY0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFhJUmVwbGF5RGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFhJQXN5bmNQYWlyZWREZXZpY2UgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFhJQXN5bmNQYWlyICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFhJU3luY1BhaXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFhJQWNjZXB0VG91Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFhJUmVqZWN0VG91Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICA3CisKKy8qIERldmljZUNoYW5nZWRFdmVudCBjaGFuZ2UgcmVhc29ucyAqLworI2RlZmluZSBYSVNsYXZlU3dpdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBYSURldmljZUNoYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgMgorCisvKiBIaWVyYXJjaHkgZmxhZ3MgKi8KKyNkZWZpbmUgWElNYXN0ZXJBZGRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIFhJTWFzdGVyUmVtb3ZlZCAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBYSVNsYXZlQWRkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgWElTbGF2ZVJlbW92ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIFhJU2xhdmVBdHRhY2hlZCAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA0KQorI2RlZmluZSBYSVNsYXZlRGV0YWNoZWQgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNSkKKyNkZWZpbmUgWElEZXZpY2VFbmFibGVkICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDYpCisjZGVmaW5lIFhJRGV2aWNlRGlzYWJsZWQgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA3KQorCisvKiBDaGFuZ2VIaWVyYXJjaHkgY29uc3RhbnRzICovCisjZGVmaW5lIFhJQWRkTWFzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFhJUmVtb3ZlTWFzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFhJQXR0YWNoU2xhdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFhJRGV0YWNoU2xhdmUgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisKKyNkZWZpbmUgWElBdHRhY2hUb01hc3RlciAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWElGbG9hdGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKworLyogVmFsdWF0b3IgbW9kZXMgKi8KKyNkZWZpbmUgWElNb2RlUmVsYXRpdmUgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWElNb2RlQWJzb2x1dGUgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworLyogRGV2aWNlIHR5cGVzICovCisjZGVmaW5lIFhJTWFzdGVyUG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFhJTWFzdGVyS2V5Ym9hcmQgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFhJU2xhdmVQb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFhJU2xhdmVLZXlib2FyZCAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFhJRmxvYXRpbmdTbGF2ZSAgICAgICAgICAgICAgICAgICAgICAgICA1CisKKy8qIERldmljZSBjbGFzc2VzOiBjbGFzc2VzIHRoYXQgYXJlIG5vdCBpZGVudGljYWwgdG8gWGkgMS54IGNsYXNzZXMgbXVzdCBiZQorICogbnVtYmVyZWQgc3RhcnRpbmcgZnJvbSA4LiAqLworI2RlZmluZSBYSUtleUNsYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBYSUJ1dHRvbkNsYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBYSVZhbHVhdG9yQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBYSVNjcm9sbENsYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBYSVRvdWNoQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgOAorCisvKiBTY3JvbGwgY2xhc3MgdHlwZXMgKi8KKyNkZWZpbmUgWElTY3JvbGxUeXBlVmVydGljYWwgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWElTY3JvbGxUeXBlSG9yaXpvbnRhbCAgICAgICAgICAgICAgICAgIDIKKworLyogU2Nyb2xsIGNsYXNzIGZsYWdzICovCisjZGVmaW5lIFhJU2Nyb2xsRmxhZ05vRW11bGF0aW9uICAgICAgICAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBYSVNjcm9sbEZsYWdQcmVmZXJyZWQgICAgICAgICAgICAgICAgICAgKDEgPDwgMSkKKworLyogRGV2aWNlIGV2ZW50IGZsYWdzIChjb21tb24pICovCisvKiBEZXZpY2UgZXZlbnQgZmxhZ3MgKGtleSBldmVudHMgb25seSkgKi8KKyNkZWZpbmUgWElLZXlSZXBlYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE2KQorLyogRGV2aWNlIGV2ZW50IGZsYWdzIChwb2ludGVyIGV2ZW50cyBvbmx5KSAqLworI2RlZmluZSBYSVBvaW50ZXJFbXVsYXRlZCAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTYpCisvKiBEZXZpY2UgZXZlbnQgZmxhZ3MgKHRvdWNoIGV2ZW50cyBvbmx5KSAqLworI2RlZmluZSBYSVRvdWNoUGVuZGluZ0VuZCAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTYpCisjZGVmaW5lIFhJVG91Y2hFbXVsYXRpbmdQb2ludGVyICAgICAgICAgICAgICAgICAoMSA8PCAxNykKKworLyogVG91Y2ggbW9kZXMgKi8KKyNkZWZpbmUgWElEaXJlY3RUb3VjaCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWElEZXBlbmRlbnRUb3VjaCAgICAgICAgICAgICAgICAgICAgICAgIDIKKworLyogWEkyIGV2ZW50IG1hc2sgbWFjcm9zICovCisjZGVmaW5lIFhJU2V0TWFzayhwdHIsIGV2ZW50KSAgICgoKHVuc2lnbmVkIGNoYXIqKShwdHIpKVsoZXZlbnQpPj4zXSB8PSAgKDEgPDwgKChldmVudCkgJiA3KSkpCisjZGVmaW5lIFhJQ2xlYXJNYXNrKHB0ciwgZXZlbnQpICgoKHVuc2lnbmVkIGNoYXIqKShwdHIpKVsoZXZlbnQpPj4zXSAmPSB+KDEgPDwgKChldmVudCkgJiA3KSkpCisjZGVmaW5lIFhJTWFza0lzU2V0KHB0ciwgZXZlbnQpICgoKHVuc2lnbmVkIGNoYXIqKShwdHIpKVsoZXZlbnQpPj4zXSAmICAgKDEgPDwgKChldmVudCkgJiA3KSkpCisjZGVmaW5lIFhJTWFza0xlbihldmVudCkgICAgICAgICgoKGV2ZW50KSA+PiAzKSArIDEpCisKKy8qIEZha2UgZGV2aWNlIElEJ3MgZm9yIGV2ZW50IHNlbGVjdGlvbiAqLworI2RlZmluZSBYSUFsbERldmljZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBYSUFsbE1hc3RlckRldmljZXMgICAgICAgICAgICAgICAgICAgICAgMQorCisvKiBFdmVudCB0eXBlcyAqLworI2RlZmluZSBYSV9EZXZpY2VDaGFuZ2VkICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFhJX0tleVByZXNzICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWElfS2V5UmVsZWFzZSAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBYSV9CdXR0b25QcmVzcyAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFhJX0J1dHRvblJlbGVhc2UgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgWElfTW90aW9uICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBYSV9FbnRlciAgICAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFhJX0xlYXZlICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgWElfRm9jdXNJbiAgICAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBYSV9Gb2N1c091dCAgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBYSV9IaWVyYXJjaHlDaGFuZ2VkICAgICAgICAgICAgICAxMQorI2RlZmluZSBYSV9Qcm9wZXJ0eUV2ZW50ICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBYSV9SYXdLZXlQcmVzcyAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBYSV9SYXdLZXlSZWxlYXNlICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBYSV9SYXdCdXR0b25QcmVzcyAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBYSV9SYXdCdXR0b25SZWxlYXNlICAgICAgICAgICAgICAxNgorI2RlZmluZSBYSV9SYXdNb3Rpb24gICAgICAgICAgICAgICAgICAgICAxNworI2RlZmluZSBYSV9Ub3VjaEJlZ2luICAgICAgICAgICAgICAgICAgICAxOCAvKiBYSSAyLjIgKi8KKyNkZWZpbmUgWElfVG91Y2hVcGRhdGUgICAgICAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgWElfVG91Y2hFbmQgICAgICAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgWElfVG91Y2hPd25lcnNoaXAgICAgICAgICAgICAgICAgMjEKKyNkZWZpbmUgWElfUmF3VG91Y2hCZWdpbiAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgWElfUmF3VG91Y2hVcGRhdGUgICAgICAgICAgICAgICAgMjMKKyNkZWZpbmUgWElfUmF3VG91Y2hFbmQgICAgICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgWElfTEFTVEVWRU5UICAgICAgICAgICAgICAgICAgICAgWElfUmF3VG91Y2hFbmQKKy8qIE5PVEU6IFhJMkxBU1RFVkVOVCBpbiB4c2VydmVyL2luY2x1ZGUvaW5wdXRzdHIuaCBtdXN0IGJlIHRoZSBzYW1lIHZhbHVlCisgKiBhcyBYSV9MQVNURVZFTlQgaWYgdGhlIHNlcnZlciBpcyBzdXBwb3NlZCB0byBoYW5kbGUgbWFza3MgZXRjLiBmb3IgdGhpcworICogdHlwZSBvZiBldmVudC4gKi8KKworLyogRXZlbnQgbWFza3MuCisgKiBOb3RlOiB0aGUgcHJvdG9jb2wgc3BlYyBkZWZpbmVzIGEgbWFzayB0byBiZSBvZiAoMSA8PCB0eXBlKS4gQ2xpZW50cyBhcmUKKyAqIGZyZWUgdG8gY3JlYXRlIG1hc2tzIGJ5IGJpdHNoaWZ0aW5nIGluc3RlYWQgb2YgdXNpbmcgdGhlc2UgZGVmaW5lcy4KKyAqLworI2RlZmluZSBYSV9EZXZpY2VDaGFuZ2VkTWFzayAgICAgICAgICAgICAoMSA8PCBYSV9EZXZpY2VDaGFuZ2VkKQorI2RlZmluZSBYSV9LZXlQcmVzc01hc2sgICAgICAgICAgICAgICAgICAoMSA8PCBYSV9LZXlQcmVzcykKKyNkZWZpbmUgWElfS2V5UmVsZWFzZU1hc2sgICAgICAgICAgICAgICAgKDEgPDwgWElfS2V5UmVsZWFzZSkKKyNkZWZpbmUgWElfQnV0dG9uUHJlc3NNYXNrICAgICAgICAgICAgICAgKDEgPDwgWElfQnV0dG9uUHJlc3MpCisjZGVmaW5lIFhJX0J1dHRvblJlbGVhc2VNYXNrICAgICAgICAgICAgICgxIDw8IFhJX0J1dHRvblJlbGVhc2UpCisjZGVmaW5lIFhJX01vdGlvbk1hc2sgICAgICAgICAgICAgICAgICAgICgxIDw8IFhJX01vdGlvbikKKyNkZWZpbmUgWElfRW50ZXJNYXNrICAgICAgICAgICAgICAgICAgICAgKDEgPDwgWElfRW50ZXIpCisjZGVmaW5lIFhJX0xlYXZlTWFzayAgICAgICAgICAgICAgICAgICAgICgxIDw8IFhJX0xlYXZlKQorI2RlZmluZSBYSV9Gb2N1c0luTWFzayAgICAgICAgICAgICAgICAgICAoMSA8PCBYSV9Gb2N1c0luKQorI2RlZmluZSBYSV9Gb2N1c091dE1hc2sgICAgICAgICAgICAgICAgICAoMSA8PCBYSV9Gb2N1c091dCkKKyNkZWZpbmUgWElfSGllcmFyY2h5Q2hhbmdlZE1hc2sgICAgICAgICAgKDEgPDwgWElfSGllcmFyY2h5Q2hhbmdlZCkKKyNkZWZpbmUgWElfUHJvcGVydHlFdmVudE1hc2sgICAgICAgICAgICAgKDEgPDwgWElfUHJvcGVydHlFdmVudCkKKyNkZWZpbmUgWElfUmF3S2V5UHJlc3NNYXNrICAgICAgICAgICAgICAgKDEgPDwgWElfUmF3S2V5UHJlc3MpCisjZGVmaW5lIFhJX1Jhd0tleVJlbGVhc2VNYXNrICAgICAgICAgICAgICgxIDw8IFhJX1Jhd0tleVJlbGVhc2UpCisjZGVmaW5lIFhJX1Jhd0J1dHRvblByZXNzTWFzayAgICAgICAgICAgICgxIDw8IFhJX1Jhd0J1dHRvblByZXNzKQorI2RlZmluZSBYSV9SYXdCdXR0b25SZWxlYXNlTWFzayAgICAgICAgICAoMSA8PCBYSV9SYXdCdXR0b25SZWxlYXNlKQorI2RlZmluZSBYSV9SYXdNb3Rpb25NYXNrICAgICAgICAgICAgICAgICAoMSA8PCBYSV9SYXdNb3Rpb24pCisjZGVmaW5lIFhJX1RvdWNoQmVnaW5NYXNrICAgICAgICAgICAgICAgICgxIDw8IFhJX1RvdWNoQmVnaW4pCisjZGVmaW5lIFhJX1RvdWNoRW5kTWFzayAgICAgICAgICAgICAgICAgICgxIDw8IFhJX1RvdWNoRW5kKQorI2RlZmluZSBYSV9Ub3VjaE93bmVyc2hpcENoYW5nZWRNYXNrICAgICAoMSA8PCBYSV9Ub3VjaE93bmVyc2hpcENoYW5nZWQpCisjZGVmaW5lIFhJX1RvdWNoVXBkYXRlTWFzayAgICAgICAgICAgICAgICgxIDw8IFhJX1RvdWNoVXBkYXRlKQorI2RlZmluZSBYSV9SYXdUb3VjaEJlZ2luTWFzayAgICAgICAgICAgICAoMSA8PCBYSV9SYXdUb3VjaEJlZ2luKQorI2RlZmluZSBYSV9SYXdUb3VjaEVuZE1hc2sgICAgICAgICAgICAgICAoMSA8PCBYSV9SYXdUb3VjaEVuZCkKKyNkZWZpbmUgWElfUmF3VG91Y2hVcGRhdGVNYXNrICAgICAgICAgICAgKDEgPDwgWElfUmF3VG91Y2hVcGRhdGUpCisKKyNlbmRpZiAvKiBfWEkyX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hJMnByb3RvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hJMnByb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzZjkyMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEkycHJvdG8uaApAQCAtMCwwICsxLDEwNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOSBSZWQgSGF0LCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisvKiBDb252ZW50aW9ucyBmb3IgdGhpcyBmaWxlOgorICogTmFtZXM6CisgKiBzdHJ1Y3RzOiBhbHdheXMgdHlwZWRlZidkLCBwcmVmaXhlZCB3aXRoIHhYSSwgQ2FtZWxDYXNlCisgKiBzdHJ1Y3QgbWVtYmVyczogbG93ZXJfY2FzZV93aXRoX3VuZGVyc2NvcmVzCisgKiAgICAgICAgRXhjZXB0aW9uczogcmVxVHlwZSwgUmVxVHlwZSwgcmVwVHlwZSwgUmVwVHlwZSwgc2VxdWVuY2VOdW1iZXIgYXJlCisgKiAgICAgICAgbmFtZWQgYXMgc3VjaCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLgorICogcmVxdWVzdCBvcGNvZGVzOiBYX1hJUmVxdWVzdE5hbWUgYXMgQ2FtZWxDYXNlCisgKiBkZWZpbmVzOiBkZWZpbmVzIHVzZWQgaW4gY2xpZW50IGFwcGxpY2F0aW9ucyBtdXN0IGdvIGluIFhJMi5oCisgKiAgICAgICAgICBkZWZpbmVzIHVzZWQgb25seSBpbiBwcm90b2NvbCBoYW5kbGluZzogWElTT01FTkFNRQorICoKKyAqIERhdGEgdHlwZXM6IHVubGVzcyB0aGVyZSBpcyBhIGhpc3RvcmljYWwgbmFtZSBmb3IgYSBkYXRhdHlwZSAoZS5nLgorICogV2luZG93KSwgdXNlIHN0ZGludCB0eXBlcyBzcGVjaWZ5aW5nIHRoZSBzaXplIG9mIHRoZSBkYXRhdHlwZS4KKyAqIGhpc3RvcmljYWwgZGF0YSB0eXBlIG5hbWVzIG11c3QgYmUgZGVmaW5lZCBhbmQgdW5kZWZpbmVkIGF0IHRoZSB0b3AgYW5kCisgKiBlbmQgb2YgdGhlIGZpbGUuCisgKgorICogR2VuZXJhbDoKKyAqIHNwYWNlcywgbm90IHRhYnMuCisgKiBzdHJ1Y3RzIHNwZWNpZmljIHRvIGEgcmVxdWVzdCBvciByZXBseSBhZGRlZCBiZWZvcmUgdGhlIHJlcXVlc3QKKyAqICAgICAgZGVmaW5pdGlvbi4gc3RydWN0cyB1c2VkIGluIG1vcmUgdGhhbiBvbmUgcmVxdWVzdCwgcmVwbHkgb3IgZXZlbnQKKyAqICAgICAgYXBwZW5kZWQgdG8gdGhlIGNvbW1vbiBzdHJ1Y3RzIHNlY3Rpb24gYmVmb3JlIHRoZSBkZWZpbml0aW9uIG9mIHRoZQorICogICAgICBmaXJzdCByZXF1ZXN0LgorICogbWVtYmVycyBvZiBzdHJ1Y3RzIHZlcnRpY2FsbHkgYWxpZ25lZCBvbiBjb2x1bW4gMTYgaWYgZGF0YXR5cGVzIHBlcm1pdC4KKyAqICAgICAgb3RoZXJ3aXNlIGFsaW5nbmVkIG9uIG5leHQgYXZhaWxhYmxlIDhuIGNvbHVtbi4KKyAqLworCisvKioKKyAqIFByb3RvY29sIGRlZmluaXRpb25zIGZvciB0aGUgWEkyIHByb3RvY29sLgorICogVGhpcyBmaWxlIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgYnkgY2xpZW50cyB0aGF0IG1lcmVseSB1c2UgWEkyLCBidXQgZG8gbm90CisgKiBuZWVkIHRoZSB3aXJlIHByb3RvY29sLiBTdWNoIGNsaWVudHMgc2hvdWxkIGluY2x1ZGUgWEkyLmgsIG9yIHRoZSBtYXRjaGluZworICogaGVhZGVyIGZyb20gdGhlIGxpYnJhcnkuCisgKgorICovCisjaWZuZGVmIF9YSTJQUk9UT19IXworI2RlZmluZSBfWEkyUFJPVE9fSF8KKworI2luY2x1ZGUgPFgxMS9YcHJvdG8uaD4KKyNpbmNsdWRlIDxYMTEvWC5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hJMi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBtYWtlIHN1cmUgdHlwZXMgaGF2ZSByaWdodCBzaXplcyBmb3IgcHJvdG9jb2wgc3RydWN0dXJlcy4gKi8KKyNkZWZpbmUgV2luZG93ICB1aW50MzJfdAorI2RlZmluZSBUaW1lICAgIHVpbnQzMl90CisjZGVmaW5lIEF0b20gICAgdWludDMyX3QKKyNkZWZpbmUgQ3Vyc29yICB1aW50MzJfdAorCisvKioKKyAqIFhJMiBSZXF1ZXN0IG9wY29kZXMKKyAqLworI2RlZmluZSBYX1hJUXVlcnlQb2ludGVyICAgICAgICAgICAgICAgIDQwCisjZGVmaW5lIFhfWElXYXJwUG9pbnRlciAgICAgICAgICAgICAgICAgNDEKKyNkZWZpbmUgWF9YSUNoYW5nZUN1cnNvciAgICAgICAgICAgICAgICA0MgorI2RlZmluZSBYX1hJQ2hhbmdlSGllcmFyY2h5ICAgICAgICAgICAgIDQzCisjZGVmaW5lIFhfWElTZXRDbGllbnRQb2ludGVyICAgICAgICAgICAgNDQKKyNkZWZpbmUgWF9YSUdldENsaWVudFBvaW50ZXIgICAgICAgICAgICA0NQorI2RlZmluZSBYX1hJU2VsZWN0RXZlbnRzICAgICAgICAgICAgICAgIDQ2CisjZGVmaW5lIFhfWElRdWVyeVZlcnNpb24gICAgICAgICAgICAgICAgNDcKKyNkZWZpbmUgWF9YSVF1ZXJ5RGV2aWNlICAgICAgICAgICAgICAgICA0OAorI2RlZmluZSBYX1hJU2V0Rm9jdXMgICAgICAgICAgICAgICAgICAgIDQ5CisjZGVmaW5lIFhfWElHZXRGb2N1cyAgICAgICAgICAgICAgICAgICAgNTAKKyNkZWZpbmUgWF9YSUdyYWJEZXZpY2UgICAgICAgICAgICAgICAgICA1MQorI2RlZmluZSBYX1hJVW5ncmFiRGV2aWNlICAgICAgICAgICAgICAgIDUyCisjZGVmaW5lIFhfWElBbGxvd0V2ZW50cyAgICAgICAgICAgICAgICAgNTMKKyNkZWZpbmUgWF9YSVBhc3NpdmVHcmFiRGV2aWNlICAgICAgICAgICA1NAorI2RlZmluZSBYX1hJUGFzc2l2ZVVuZ3JhYkRldmljZSAgICAgICAgIDU1CisjZGVmaW5lIFhfWElMaXN0UHJvcGVydGllcyAgICAgICAgICAgICAgNTYKKyNkZWZpbmUgWF9YSUNoYW5nZVByb3BlcnR5ICAgICAgICAgICAgICA1NworI2RlZmluZSBYX1hJRGVsZXRlUHJvcGVydHkgICAgICAgICAgICAgIDU4CisjZGVmaW5lIFhfWElHZXRQcm9wZXJ0eSAgICAgICAgICAgICAgICAgNTkKKyNkZWZpbmUgWF9YSUdldFNlbGVjdGVkRXZlbnRzICAgICAgICAgICA2MAorCisvKiogTnVtYmVyIG9mIFhJIHJlcXVlc3RzICovCisjZGVmaW5lIFhJMlJFUVVFU1RTIChYX1hJR2V0U2VsZWN0ZWRFdmVudHMgLSBYX1hJUXVlcnlQb2ludGVyICsgMSkKKy8qKiBOdW1iZXIgb2YgWEkyIGV2ZW50cyAqLworI2RlZmluZSBYSTJFVkVOVFMgICAoWElfTEFTVEVWRU5UICsgMSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NT04gU1RSVUNUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEZpeGVkIHBvaW50IDE2LjE2ICovCit0eXBlZGVmIGludDMyX3QgRlAxNjE2OworCisvKiogRml4ZWQgcG9pbnQgMzIuMzIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQzMl90ICAgICBpbnRlZ3JhbDsKKyAgICB1aW50MzJfdCAgICBmcmFjOworfSBGUDMyMzI7CisKKy8qKgorICogU3RydWN0IHRvIGRlc2NyaWJlIGEgZGV2aWNlLgorICoKKyAqIEZvciBhIE1hc3RlclBvaW50ZXIgb3IgYSBNYXN0ZXJLZXlib2FyZCwgJ2F0dGFjaG1lbnQnIHNwZWNpZmllcyB0aGUKKyAqIHBhaXJlZCBtYXN0ZXIgZGV2aWNlLgorICogRm9yIGEgU2xhdmVLZXlib2FyZCBvciBTbGF2ZVBvaW50ZXIsICdhdHRhY2htZW50JyBzcGVjaWZpZXMgdGhlIG1hc3RlcgorICogZGV2aWNlIHRoaXMgZGV2aWNlIGlzIGF0dGFjaGVkIHRvLgorICogRm9yIGEgRmxvYXRpbmdTbGF2ZSwgJ2F0dGFjaG1lbnQnIGlzIHVuZGVmaW5lZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOworICAgIHVpbnQxNl90ICAgIHVzZTsgICAgICAgICAgICAvKio8IDo6WElNYXN0ZXJQb2ludGVyLCA6OlhJTWFzdGVyS2V5Ym9hcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpYSVNsYXZlUG9pbnRlciwgOjpYSVNsYXZlS2V5Ym9hcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpYSUZsb2F0aW5nU2xhdmUgKi8KKyAgICB1aW50MTZfdCAgICBhdHRhY2htZW50OyAgICAgLyoqPCBDdXJyZW50IGF0dGFjaG1lbnQgb3IgcGFpcmluZy4qLworICAgIHVpbnQxNl90ICAgIG51bV9jbGFzc2VzOyAgICAvKio8IE51bWJlciBvZiBjbGFzc2VzIGZvbGxvd2luZyB0aGlzIHN0cnVjdC4gKi8KKyAgICB1aW50MTZfdCAgICBuYW1lX2xlbjsgICAgICAgLyoqPCBMZW5ndGggb2YgbmFtZSBpbiBieXRlcy4gKi8KKyAgICB1aW50OF90ICAgICBlbmFibGVkOyAgICAgICAgLyoqPCBUUlVFIGlmIGRldmljZSBpcyBlbmFibGVkLiAqLworICAgIHVpbnQ4X3QgICAgIHBhZDsKK30geFhJRGV2aWNlSW5mbzsKKworLyoqCisgKiBEZWZhdWx0IHRlbXBsYXRlIGZvciBhIGRldmljZSBjbGFzcy4KKyAqIEEgZGV2aWNlIGNsYXNzIGlzIGVxdWl2YWxlbnQgdG8gYSBkZXZpY2UncyBjYXBhYmlsaXRpZXMuIE11bHRpcGxlIGNsYXNzZXMKKyAqIGFyZSBzdXBwb3J0ZWQgcGVyIGRldmljZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90ICAgIHR5cGU7ICAgICAgICAgICAvKio8IE9uZSBvZiAqY2xhc3MgKi8KKyAgICB1aW50MTZfdCAgICBsZW5ndGg7ICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgdWludDE2X3QgICAgc291cmNlaWQ7ICAgICAgIC8qKjwgc291cmNlIGRldmljZSBmb3IgdGhpcyBjbGFzcyAqLworICAgIHVpbnQxNl90ICAgIHBhZDsKK30geFhJQW55SW5mbzsKKworLyoqCisgKiBEZW5vdGVzIGJ1dHRvbiBjYXBhYmlsaXR5IG9uIGEgZGV2aWNlLgorICogU3RydWN0IGlzIGZvbGxvd2VkIGJ5IG51bV9idXR0b25zICogQXRvbSB0aGF0IG5hbWVzIHRoZSBidXR0b25zIGluIHRoZQorICogZGV2aWNlLW5hdGl2ZSBzZXR1cCAoaS5lLiBpZ25vcmluZyBidXR0b24gbWFwcGluZ3MpLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDE2X3QgICAgdHlwZTsgICAgICAgICAgIC8qKjwgQWx3YXlzIEJ1dHRvbkNsYXNzICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworICAgIHVpbnQxNl90ICAgIHNvdXJjZWlkOyAgICAgICAvKio8IHNvdXJjZSBkZXZpY2UgZm9yIHRoaXMgY2xhc3MgKi8KKyAgICB1aW50MTZfdCAgICBudW1fYnV0dG9uczsgICAgLyoqPCBOdW1iZXIgb2YgYnV0dG9ucyBwcm92aWRlICovCit9IHhYSUJ1dHRvbkluZm87CisKKy8qKgorICogRGVub3RlcyBrZXkgY2FwYWJpbGl0eSBvbiBhIGRldmljZS4KKyAqIFN0cnVjdCBpcyBmb2xsb3dlZCBieSBudW1fa2V5cyAqIENBUkQzMiB0aGF0IGxpc3RzIHRoZSBrZXljb2RlcyBhdmFpbGFibGUKKyAqIG9uIHRoZSBkZXZpY2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MTZfdCAgICB0eXBlOyAgICAgICAgICAgLyoqPCBBbHdheXMgS2V5Q2xhc3MgKi8KKyAgICB1aW50MTZfdCAgICBsZW5ndGg7ICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgdWludDE2X3QgICAgc291cmNlaWQ7ICAgICAgIC8qKjwgc291cmNlIGRldmljZSBmb3IgdGhpcyBjbGFzcyAqLworICAgIHVpbnQxNl90ICAgIG51bV9rZXljb2RlczsgICAvKio8IE51bWJlciBvZiBrZXlzIHByb3ZpZGVkICovCit9IHhYSUtleUluZm87CisKKy8qKgorICogRGVub3RlcyBhbiB2YWx1YXRvciBjYXBhYmlsaXR5IG9uIGEgZGV2aWNlLgorICogT25lIFhJVmFsdWF0b3JJbmZvIGRlc2NyaWJlcyBleGFjdGx5IG9uZSB2YWx1YXRvciAoYXhpcykgb24gdGhlIGRldmljZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90ICAgIHR5cGU7ICAgICAgICAgICAvKio8IEFsd2F5cyBWYWx1YXRvckNsYXNzICAgICAgICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworICAgIHVpbnQxNl90ICAgIHNvdXJjZWlkOyAgICAgICAvKio8IHNvdXJjZSBkZXZpY2UgZm9yIHRoaXMgY2xhc3MgKi8KKyAgICB1aW50MTZfdCAgICBudW1iZXI7ICAgICAgICAgLyoqPCBWYWx1YXRvciBudW1iZXIgICAgICAgICAgICAqLworICAgIEF0b20gICAgICAgIGxhYmVsOyAgICAgICAgICAvKio8IEF4aXMgbGFiZWwgICAgICAgICAgICAgICAgICovCisgICAgRlAzMjMyICAgICAgbWluOyAgICAgICAgICAgIC8qKjwgTWluIHZhbHVlICAgICAgICAgICAgICAgICAgKi8KKyAgICBGUDMyMzIgICAgICBtYXg7ICAgICAgICAgICAgLyoqPCBNYXggdmFsdWUgICAgICAgICAgICAgICAgICAqLworICAgIEZQMzIzMiAgICAgIHZhbHVlOyAgICAgICAgICAvKio8IExhc3QgcHVibGlzaGVkIHZhbHVlICAgICAgICovCisgICAgdWludDMyX3QgICAgcmVzb2x1dGlvbjsgICAgIC8qKjwgUmVzb2x1dGlvbnMgaW4gdW5pdHMvbSAgICAgKi8KKyAgICB1aW50OF90ICAgICBtb2RlOyAgICAgICAgICAgLyoqPCBNb2RlUmVsYXRpdmUgb3IgTW9kZUFic29sdXRlICovCisgICAgdWludDhfdCAgICAgcGFkMTsKKyAgICB1aW50MTZfdCAgICBwYWQyOworfSB4WElWYWx1YXRvckluZm87CisKKy8qKioKKyAqIERlbm90ZXMgYSBzY3JvbGwgdmFsdWF0b3Igb24gYSBkZXZpY2UuCisgKiBPbmUgWElTY3JvbGxJbmZvIGRlc2NyaWJlcyBleGFjdGx5IG9uZSBzY3JvbGwgdmFsdWF0b3IgdGhhdCBtdXN0IGhhdmUgYQorICogWElWYWx1YXRvckluZm8gc3RydWN0LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDE2X3QgICAgdHlwZTsgICAgICAgICAgIC8qKjwgQWx3YXlzIFZhbHVhdG9yQ2xhc3MgICAgICAgICAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAvKio8IExlbmd0aCBpbiA0IGJ5dGUgdW5pdHMgICAgICAgKi8KKyAgICB1aW50MTZfdCAgICBzb3VyY2VpZDsgICAgICAgLyoqPCBzb3VyY2UgZGV2aWNlIGZvciB0aGlzIGNsYXNzICovCisgICAgdWludDE2X3QgICAgbnVtYmVyOyAgICAgICAgIC8qKjwgVmFsdWF0b3IgbnVtYmVyICAgICAgICAgICAgICAqLworICAgIHVpbnQxNl90ICAgIHNjcm9sbF90eXBlOyAgICAvKio8IDo6WElTY3JvbGxUeXBlVmVydGljYWwsIDo6WElTY3JvbGxUeXBlSG9yaXpvbnRhbCAqLworICAgIHVpbnQxNl90ICAgIHBhZDA7CisgICAgdWludDMyX3QgICAgZmxhZ3M7ICAgICAgICAgIC8qKjwgOjpYSVNjcm9sbEZsYWdFbXVsYXRlLCA6OlhJU2Nyb2xsRmxhZ1ByZWZlcnJlZCAgICovCisgICAgRlAzMjMyICAgICAgaW5jcmVtZW50OyAgICAgIC8qKjwgSW5jcmVtZW50IGZvciBvbmUgdW5pdCBvZiBzY3JvbGxpbmcgICAgICAgICAgICAgICovCit9IHhYSVNjcm9sbEluZm87CisKKy8qKgorICogRGVub3RlcyBtdWx0aXRvdWNoIGNhcGFiaWxpdHkgb24gYSBkZXZpY2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MTZfdCAgICB0eXBlOyAgICAgICAgICAgLyoqPCBBbHdheXMgVG91Y2hDbGFzcyAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAvKio8IExlbmd0aCBpbiA0IGJ5dGUgdW5pdHMgKi8KKyAgICB1aW50MTZfdCAgICBzb3VyY2VpZDsgICAgICAgLyoqPCBzb3VyY2UgZGV2aWNlIGZvciB0aGlzIGNsYXNzICovCisgICAgdWludDhfdCAgICAgbW9kZTsgICAgICAgICAgIC8qKjwgRGlyZWN0VG91Y2ggb3IgRGVwZW5kZW50VG91Y2ggKi8KKyAgICB1aW50OF90ICAgICBudW1fdG91Y2hlczsgICAgLyoqPCBNYXhpbXVtIG51bWJlciBvZiB0b3VjaGVzICgwPT11bmxpbWl0ZWQpICovCit9IHhYSVRvdWNoSW5mbzsKKworLyoqCisgKiBVc2VkIHRvIHNlbGVjdCBmb3IgZXZlbnRzIG9uIGEgZ2l2ZW4gd2luZG93LgorICogU3RydWN0IGlzIGZvbGxvd2VkIGJ5IChtYXNrX2xlbiAqIENBUkQ4KSwgd2l0aCBlYWNoIGJpdCBzZXQgcmVwcmVzZW50aW5nCisgKiB0aGUgZXZlbnQgbWFzayBmb3IgdGhlIGdpdmVuIHR5cGUuIEEgbWFzayBiaXQgcmVwcmVzZW50cyBhbiBldmVudCB0eXBlIGlmCisgKiAobWFzayA9PSAoMSA8PCB0eXBlKSkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MTZfdCAgICBkZXZpY2VpZDsgICAgICAgLyoqPCBEZXZpY2UgaWQgdG8gc2VsZWN0IGZvciAgICAgICAgKi8KKyAgICB1aW50MTZfdCAgICBtYXNrX2xlbjsgICAgICAgLyoqPCBMZW5ndGggb2YgbWFzayBpbiA0IGJ5dGUgdW5pdHMgKi8KK30geFhJRXZlbnRNYXNrOworCisvKioKKyAqIFhLQiBtb2RpZmllciBpbmZvcm1hdGlvbi4KKyAqIFRoZSBlZmZlY3RpdmUgbW9kaWZpZXIgaXMgYSBiaW5hcnkgbWFzayBvZiBiYXNlLCBsYXRjaGVkLCBhbmQgbG9ja2VkCisgKiBtb2RpZmllcnMuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgICAgYmFzZV9tb2RzOyAgICAgICAgICAgICAgLyoqPCBMb2dpY2FsbHkgcHJlc3NlZCBtb2RpZmllcnMgKi8KKyAgICB1aW50MzJfdCAgICBsYXRjaGVkX21vZHM7ICAgICAgICAgICAvKio8IExvZ2ljYWxseSBsYXRjaGVkIG1vZGlmaWVycyAqLworICAgIHVpbnQzMl90ICAgIGxvY2tlZF9tb2RzOyAgICAgICAgICAgIC8qKjwgTG9naWNhbGx5IGxvY2tlZCBtb2RpZmllcnMgKi8KKyAgICB1aW50MzJfdCAgICBlZmZlY3RpdmVfbW9kczsgICAgICAgICAvKio8IEVmZmVjdGl2ZSBtb2RpZmllcnMgKi8KK30geFhJTW9kaWZpZXJJbmZvOworCisvKioKKyAqIFhLQiBncm91cCBpbmZvcm1hdGlvbi4KKyAqIFRoZSBlZmZlY3RpdmUgZ3JvdXAgaXMgdGhlIG1hdGhlbWF0aWNhbCBzdW0gb2YgYmFzZSwgbGF0Y2hlZCwgYW5kIGxvY2tlZAorICogZ3JvdXAgYWZ0ZXIgZ3JvdXAgd3JhcHBpbmcgaXMgdGFrZW4gaW50byBhY2NvdW50LgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQ4X3QgICAgIGJhc2VfZ3JvdXA7ICAgICAgICAgICAgIC8qKjwgTG9naWNhbGx5ICJwcmVzc2VkIiBncm91cCAqLworICAgIHVpbnQ4X3QgICAgIGxhdGNoZWRfZ3JvdXA7ICAgICAgICAgIC8qKjwgTG9naWNhbGx5IGxhdGNoZWQgZ3JvdXAgKi8KKyAgICB1aW50OF90ICAgICBsb2NrZWRfZ3JvdXA7ICAgICAgICAgICAvKio8IExvZ2ljYWxseSBsb2NrZWQgZ3JvdXAgKi8KKyAgICB1aW50OF90ICAgICBlZmZlY3RpdmVfZ3JvdXA7ICAgICAgICAvKio8IEVmZmVjdGl2ZSBncm91cCAqLworfSB4WElHcm91cEluZm87CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVRVUVTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFF1ZXJ5IHRoZSBzZXJ2ZXIgZm9yIHRoZSBzdXBwb3J0ZWQgWCBJbnB1dCBleHRlbnNpb24gdmVyc2lvbi4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVxVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBJbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZSAqLworICAgIHVpbnQ4X3QgICAgIFJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WF9YSVF1ZXJ5VmVyc2lvbiAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworICAgIHVpbnQxNl90ICAgIG1ham9yX3ZlcnNpb247CisgICAgdWludDE2X3QgICAgbWlub3JfdmVyc2lvbjsKK30geFhJUXVlcnlWZXJzaW9uUmVxOworI2RlZmluZSBzel94WElRdWVyeVZlcnNpb25SZXEgICAgICAgICAgICAgICAgICAgICA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXBUeXBlOyAgICAgICAgICAgICAgICAvKio8IDo6WF9SZXBseSAqLworICAgIHVpbnQ4X3QgICAgIFJlcFR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WF9YSVF1ZXJ5VmVyc2lvbiAqLworICAgIHVpbnQxNl90ICAgIHNlcXVlbmNlTnVtYmVyOworICAgIHVpbnQzMl90ICAgIGxlbmd0aDsKKyAgICB1aW50MTZfdCAgICBtYWpvcl92ZXJzaW9uOworICAgIHVpbnQxNl90ICAgIG1pbm9yX3ZlcnNpb247CisgICAgdWludDMyX3QgICAgcGFkMTsKKyAgICB1aW50MzJfdCAgICBwYWQyOworICAgIHVpbnQzMl90ICAgIHBhZDM7CisgICAgdWludDMyX3QgICAgcGFkNDsKKyAgICB1aW50MzJfdCAgICBwYWQ1OworfSB4WElRdWVyeVZlcnNpb25SZXBseTsKKyNkZWZpbmUgc3pfeFhJUXVlcnlWZXJzaW9uUmVwbHkgICAgICAgICAgICAgMzIKKworLyoqCisgKiBRdWVyeSB0aGUgc2VydmVyIGZvciBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIGRldmljZSBvciBhbGwgaW5wdXQKKyAqIGRldmljZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IElucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlICovCisgICAgdWludDhfdCAgICAgUmVxVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYX1hJUXVlcnlEZXZpY2UgKi8KKyAgICB1aW50MTZfdCAgICBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBpbiA0IGJ5dGUgdW5pdHMgKi8KKyAgICB1aW50MTZfdCAgICBkZXZpY2VpZDsKKyAgICB1aW50MTZfdCAgICBwYWQ7Cit9IHhYSVF1ZXJ5RGV2aWNlUmVxOworI2RlZmluZSBzel94WElRdWVyeURldmljZVJlcSAgICAgICAgICAgICAgICAgICAgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVwVHlwZTsgICAgICAgICAgICAgICAgLyoqPCA6OlhfUmVwbHkgKi8KKyAgICB1aW50OF90ICAgICBSZXBUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhfWElRdWVyeURldmljZSAqLworICAgIHVpbnQxNl90ICAgIHNlcXVlbmNlTnVtYmVyOworICAgIHVpbnQzMl90ICAgIGxlbmd0aDsKKyAgICB1aW50MTZfdCAgICBudW1fZGV2aWNlczsKKyAgICB1aW50MTZfdCAgICBwYWQwOworICAgIHVpbnQzMl90ICAgIHBhZDE7CisgICAgdWludDMyX3QgICAgcGFkMjsKKyAgICB1aW50MzJfdCAgICBwYWQzOworICAgIHVpbnQzMl90ICAgIHBhZDQ7CisgICAgdWludDMyX3QgICAgcGFkNTsKK30geFhJUXVlcnlEZXZpY2VSZXBseTsKKyNkZWZpbmUgc3pfeFhJUXVlcnlEZXZpY2VSZXBseSAgICAgICAgICAgICAgICAgIDMyCisKKy8qKgorICogU2VsZWN0IGZvciBldmVudHMgb24gYSBnaXZlbiB3aW5kb3cuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IElucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlICovCisgICAgdWludDhfdCAgICAgUmVxVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYX1hJU2VsZWN0RXZlbnRzICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgV2luZG93ICAgICAgd2luOworICAgIHVpbnQxNl90ICAgIG51bV9tYXNrczsKKyAgICB1aW50MTZfdCAgICBwYWQ7Cit9IHhYSVNlbGVjdEV2ZW50c1JlcTsKKyNkZWZpbmUgc3pfeFhJU2VsZWN0RXZlbnRzUmVxICAgICAgICAgICAgICAgICAgMTIKKworLyoqCisgKiBRdWVyeSBmb3Igc2VsZWN0ZWQgZXZlbnRzIG9uIGEgZ2l2ZW4gd2luZG93LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVxVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBJbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZSAqLworICAgIHVpbnQ4X3QgICAgIFJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WF9YSUdldFNlbGVjdGVkRXZlbnRzICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgV2luZG93ICAgICAgd2luOworfSB4WElHZXRTZWxlY3RlZEV2ZW50c1JlcTsKKyNkZWZpbmUgc3pfeFhJR2V0U2VsZWN0ZWRFdmVudHNSZXEgICAgICAgICAgICAgIDgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICAgIHJlcFR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgSW5wdXQgZXh0ZW5zaW9uIG1ham9yIG9wY29kZSAqLworICAgIHVpbnQ4X3QgICAgIFJlcFR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WF9YSUdldFNlbGVjdGVkRXZlbnRzICovCisgICAgdWludDE2X3QgICAgc2VxdWVuY2VOdW1iZXI7CisgICAgdWludDMyX3QgICAgbGVuZ3RoOworICAgIHVpbnQxNl90ICAgIG51bV9tYXNrczsgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHhYSUV2ZW50TWFzayBzdHJ1Y3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZyB0aGUgcmVwbHkgKi8KKyAgICB1aW50MTZfdCAgICBwYWQwOworICAgIHVpbnQzMl90ICAgIHBhZDE7CisgICAgdWludDMyX3QgICAgcGFkMjsKKyAgICB1aW50MzJfdCAgICBwYWQzOworICAgIHVpbnQzMl90ICAgIHBhZDQ7CisgICAgdWludDMyX3QgICAgcGFkNTsKK30geFhJR2V0U2VsZWN0ZWRFdmVudHNSZXBseTsKKyNkZWZpbmUgc3pfeFhJR2V0U2VsZWN0ZWRFdmVudHNSZXBseSAgICAgICAgICAgIDMyCisKKy8qKgorICogUXVlcnkgdGhlIGdpdmVuIGRldmljZSdzIHNjcmVlbi93aW5kb3cgY29vcmRpbmF0ZXMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICAgIHJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgSW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUgKi8KKyAgICB1aW50OF90ICAgICBSZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhfWElRdWVyeVBvaW50ZXIgKi8KKyAgICB1aW50MTZfdCAgICBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBpbiA0IGJ5dGUgdW5pdHMgKi8KKyAgICBXaW5kb3cgICAgICB3aW47CisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgdWludDE2X3QgICAgcGFkMTsKK30geFhJUXVlcnlQb2ludGVyUmVxOworI2RlZmluZSBzel94WElRdWVyeVBvaW50ZXJSZXEgICAgICAgICAgICAgICAgICAgMTIKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVwVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBJbnB1dCBleHRlbnNpb24gbWFqb3Igb3Bjb2RlICovCisgICAgdWludDhfdCAgICAgUmVwVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYX1hJUXVlcnlQb2ludGVyICovCisgICAgdWludDE2X3QgICAgc2VxdWVuY2VOdW1iZXI7CisgICAgdWludDMyX3QgICAgbGVuZ3RoOworICAgIFdpbmRvdyAgICAgIHJvb3Q7CisgICAgV2luZG93ICAgICAgY2hpbGQ7CisgICAgRlAxNjE2ICAgICAgcm9vdF94OworICAgIEZQMTYxNiAgICAgIHJvb3RfeTsKKyAgICBGUDE2MTYgICAgICB3aW5feDsKKyAgICBGUDE2MTYgICAgICB3aW5feTsKKyAgICB1aW50OF90ICAgICBzYW1lX3NjcmVlbjsKKyAgICB1aW50OF90ICAgICBwYWQwOworICAgIHVpbnQxNl90ICAgIGJ1dHRvbnNfbGVuOworICAgIHhYSU1vZGlmaWVySW5mbyBtb2RzOworICAgIHhYSUdyb3VwSW5mbyBncm91cDsKK30geFhJUXVlcnlQb2ludGVyUmVwbHk7CisjZGVmaW5lIHN6X3hYSVF1ZXJ5UG9pbnRlclJlcGx5ICAgICAgICAgICAgICAgICA1NgorCisvKioKKyAqIFdhcnAgdGhlIGdpdmVuIGRldmljZSdzIHBvaW50ZXIgdG8gdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVxVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBJbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZSAqLworICAgIHVpbnQ4X3QgICAgIFJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WF9YSVdhcnBQb2ludGVyICAgKi8KKyAgICB1aW50MTZfdCAgICBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBpbiA0IGJ5dGUgdW5pdHMgKi8KKyAgICBXaW5kb3cgICAgICBzcmNfd2luOworICAgIFdpbmRvdyAgICAgIGRzdF93aW47CisgICAgRlAxNjE2ICAgICAgc3JjX3g7CisgICAgRlAxNjE2ICAgICAgc3JjX3k7CisgICAgdWludDE2X3QgICAgc3JjX3dpZHRoOworICAgIHVpbnQxNl90ICAgIHNyY19oZWlnaHQ7CisgICAgRlAxNjE2ICAgICAgZHN0X3g7CisgICAgRlAxNjE2ICAgICAgZHN0X3k7CisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgdWludDE2X3QgICAgcGFkMTsKK30geFhJV2FycFBvaW50ZXJSZXE7CisjZGVmaW5lIHN6X3hYSVdhcnBQb2ludGVyUmVxICAgICAgICAgICAgICAgICAgICAzNgorCisvKioKKyAqIENoYW5nZSB0aGUgZ2l2ZW4gZGV2aWNlJ3Mgc3ByaXRlIHRvIHRoZSBnaXZlbiBjdXJzb3IuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICAgIHJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgSW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUgKi8KKyAgICB1aW50OF90ICAgICBSZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhfWElDaGFuZ2VDdXJzb3IgICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgV2luZG93ICAgICAgd2luOworICAgIEN1cnNvciAgICAgIGN1cnNvcjsKKyAgICB1aW50MTZfdCAgICBkZXZpY2VpZDsKKyAgICB1aW50MTZfdCAgICBwYWQxOworfSB4WElDaGFuZ2VDdXJzb3JSZXE7CisjZGVmaW5lIHN6X3hYSUNoYW5nZUN1cnNvclJlcSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisKKy8qKgorICogTW9kaWZ5IHRoZSBkZXZpY2UgaGllcmFyY2h5LgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IElucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlICovCisgICAgdWludDhfdCAgICAgUmVxVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYX1hJQ2hhbmdlSGllcmFyY2h5ICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgdWludDhfdCAgICAgbnVtX2NoYW5nZXM7CisgICAgdWludDhfdCAgICAgcGFkMDsKKyAgICB1aW50MTZfdCAgICBwYWQxOworfSB4WElDaGFuZ2VIaWVyYXJjaHlSZXE7CisjZGVmaW5lIHN6X3hYSUNoYW5nZUhpZXJhcmNoeVJlcSAgICAgICAgICAgICAgICAgICAgICAgIDgKKworLyoqCisgKiBHZW5lcmljIGhlYWRlciBmb3IgYW55IGhpZXJhcmNoeSBjaGFuZ2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MTZfdCAgICB0eXBlOworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworfSB4WElBbnlIaWVyYXJjaHlDaGFuZ2VJbmZvOworCisvKioKKyAqIENyZWF0ZSBhIG5ldyBtYXN0ZXIgZGV2aWNlLgorICogTmFtZSBvZiBuZXcgbWFzdGVyIGZvbGxvd3Mgc3RydWN0ICg0LWJ5dGUgcGFkZGVkKQorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDE2X3QgICAgdHlwZTsgICAgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYSUFkZE1hc3RlciAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgMiArIChuYW1lbGVuICsgcGFkZGluZykvNCAqLworICAgIHVpbnQxNl90ICAgIG5hbWVfbGVuOworICAgIHVpbnQ4X3QgICAgIHNlbmRfY29yZTsKKyAgICB1aW50OF90ICAgICBlbmFibGU7Cit9IHhYSUFkZE1hc3RlckluZm87CisKKy8qKgorICogRGVsZXRlIGEgbWFzdGVyIGRldmljZS4gV2lsbCBhdXRvbWF0aWNhbGx5IGRlbGV0ZSB0aGUgbWFzdGVyIGRldmljZSBwYWlyZWQKKyAqIHdpdGggdGhlIGdpdmVuIG1hc3RlciBkZXZpY2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MTZfdCAgICB0eXBlOyAgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WElSZW1vdmVNYXN0ZXIgKi8KKyAgICB1aW50MTZfdCAgICBsZW5ndGg7ICAgICAgICAgIC8qKjwgMyAqLworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOworICAgIHVpbnQ4X3QgICAgIHJldHVybl9tb2RlOyAgICAgLyoqPCA6OlhJQXR0YWNoVG9NYXN0ZXIsIDo6WElGbG9hdGluZyAqLworICAgIHVpbnQ4X3QgICAgIHBhZDsKKyAgICB1aW50MTZfdCAgICByZXR1cm5fcG9pbnRlcjsgIC8qKjwgUG9pbnRlciB0byBhdHRhY2ggc2xhdmUgcHRyIGRldmljZXMgdG8gKi8KKyAgICB1aW50MTZfdCAgICByZXR1cm5fa2V5Ym9hcmQ7IC8qKjwga2V5Ym9hcmQgdG8gYXR0YWNoIHNsYXZlIGtleWJkIGRldmljZXMgdG8qLworfSB4WElSZW1vdmVNYXN0ZXJJbmZvOworCisvKioKKyAqIEF0dGFjaCBhbiBTRCB0byBhIG5ldyBkZXZpY2UuCisgKiBOZXdNYXN0ZXIgaGFzIHRvIGJlIG9mIHNhbWUgdHlwZSAocG9pbnRlci0+cG9pbnRlciwga2V5Ym9hcmQtPmtleWJvYXJkKTsKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90ICAgIHR5cGU7ICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhJQXR0YWNoU2xhdmUgKi8KKyAgICB1aW50MTZfdCAgICBsZW5ndGg7ICAgICAgICAgLyoqPCAyICovCisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgdWludDE2X3QgICAgbmV3X21hc3RlcjsgICAgIC8qKjwgaWQgb2YgbmV3IG1hc3RlciBkZXZpY2UgKi8KK30geFhJQXR0YWNoU2xhdmVJbmZvOworCisvKioKKyAqIERldGFjaCBhbiBTRCBmcm9tIGl0cyBjdXJyZW50IG1hc3RlciBkZXZpY2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MTZfdCAgICB0eXBlOyAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYSURldGFjaFNsYXZlICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgIC8qKjwgMiAqLworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOworICAgIHVpbnQxNl90ICAgIHBhZDsKK30geFhJRGV0YWNoU2xhdmVJbmZvOworCisKKy8qKgorICogU2V0IHRoZSB3aW5kb3cvY2xpZW50J3MgQ2xpZW50UG9pbnRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICAgIHJlcVR5cGU7CisgICAgdWludDhfdCAgICAgUmVxVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYX1hJU2V0Q2xpZW50UG9pbnRlciAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworICAgIFdpbmRvdyAgICAgIHdpbjsKKyAgICB1aW50MTZfdCAgICBkZXZpY2VpZDsKKyAgICB1aW50MTZfdCAgICBwYWQxOworfSB4WElTZXRDbGllbnRQb2ludGVyUmVxOworI2RlZmluZSBzel94WElTZXRDbGllbnRQb2ludGVyUmVxICAgICAgICAgICAgICAgICAxMgorCisvKioKKyAqIFF1ZXJ5IHRoZSBnaXZlbiB3aW5kb3cvY2xpZW50J3MgQ2xpZW50UG9pbnRlciBzZXR0aW5nLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVxVHlwZTsKKyAgICB1aW50OF90ICAgICBSZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhfR2V0Q2xpZW50UG9pbnRlciAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworICAgIFdpbmRvdyAgICAgIHdpbjsKK30geFhJR2V0Q2xpZW50UG9pbnRlclJlcTsKKyNkZWZpbmUgc3pfeFhJR2V0Q2xpZW50UG9pbnRlclJlcSAgICAgICAgICAgICAgICAgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVwVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBJbnB1dCBleHRlbnNpb24gbWFqb3Igb3Bjb2RlICovCisgICAgdWludDhfdCAgICAgUmVwVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYX0dldENsaWVudFBvaW50ZXIgKi8KKyAgICB1aW50MTZfdCAgICBzZXF1ZW5jZU51bWJlcjsKKyAgICB1aW50MzJfdCAgICBsZW5ndGg7CisgICAgQk9PTCAgICAgICAgc2V0OyAgICAgICAgICAgICAgICAgICAgLyoqPCBjbGllbnQgcG9pbnRlciBpcyBzZXQ/ICovCisgICAgdWludDhfdCAgICAgcGFkMDsKKyAgICB1aW50MTZfdCAgICBkZXZpY2VpZDsKKyAgICB1aW50MzJfdCAgICBwYWQxOworICAgIHVpbnQzMl90ICAgIHBhZDI7CisgICAgdWludDMyX3QgICAgcGFkMzsKKyAgICB1aW50MzJfdCAgICBwYWQ0OworICAgIHVpbnQzMl90ICAgIHBhZDU7Cit9IHhYSUdldENsaWVudFBvaW50ZXJSZXBseTsKKyNkZWZpbmUgc3pfeFhJR2V0Q2xpZW50UG9pbnRlclJlcGx5ICAgICAgICAgICAgICAgMzIKKworLyoqCisgKiBTZXQgdGhlIGlucHV0IGZvY3VzIHRvIHRoZSBzcGVjaWZpZWQgd2luZG93LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVxVHlwZTsKKyAgICB1aW50OF90ICAgICBSZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhfWElTZXRGb2N1cyAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworICAgIFdpbmRvdyAgICAgIGZvY3VzOworICAgIFRpbWUgICAgICAgIHRpbWU7CisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgdWludDE2X3QgICAgcGFkMDsKK30geFhJU2V0Rm9jdXNSZXE7CisjZGVmaW5lIHN6X3hYSVNldEZvY3VzUmVxICAgICAgICAgICAgICAgICAgICAgICAxNgorCisvKioKKyAqIFF1ZXJ5IHRoZSBjdXJyZW50IGlucHV0IGZvY3VzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVxVHlwZTsKKyAgICB1aW50OF90ICAgICBSZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhfWElHZXREZXZpY2VGb2N1cyAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOworICAgIHVpbnQxNl90ICAgIHBhZDA7Cit9IHhYSUdldEZvY3VzUmVxOworI2RlZmluZSBzel94WElHZXRGb2N1c1JlcSAgICAgICAgICAgICAgICAgICAgICAgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVwVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBJbnB1dCBleHRlbnNpb24gbWFqb3Igb3Bjb2RlICovCisgICAgdWludDhfdCAgICAgUmVwVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYX1hJR2V0Rm9jdXMgKi8KKyAgICB1aW50MTZfdCAgICBzZXF1ZW5jZU51bWJlcjsKKyAgICB1aW50MzJfdCAgICBsZW5ndGg7CisgICAgV2luZG93ICAgICAgZm9jdXM7CisgICAgdWludDMyX3QgICAgcGFkMTsKKyAgICB1aW50MzJfdCAgICBwYWQyOworICAgIHVpbnQzMl90ICAgIHBhZDM7CisgICAgdWludDMyX3QgICAgcGFkNDsKKyAgICB1aW50MzJfdCAgICBwYWQ1OworfSB4WElHZXRGb2N1c1JlcGx5OworI2RlZmluZSBzel94WElHZXRGb2N1c1JlcGx5ICAgICAgICAgICAgICAgICAgICAgMzIKKworCisvKioKKyAqIEdyYWIgdGhlIGdpdmVuIGRldmljZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICAgIHJlcVR5cGU7CisgICAgdWludDhfdCAgICAgUmVxVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYX1hJR3JhYkRldmljZSAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworICAgIFdpbmRvdyAgICAgIGdyYWJfd2luZG93OworICAgIFRpbWUgICAgICAgIHRpbWU7CisgICAgQ3Vyc29yICAgICAgY3Vyc29yOworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOworICAgIHVpbnQ4X3QgICAgIGdyYWJfbW9kZTsKKyAgICB1aW50OF90ICAgICBwYWlyZWRfZGV2aWNlX21vZGU7CisgICAgdWludDhfdCAgICAgb3duZXJfZXZlbnRzOworICAgIHVpbnQ4X3QgICAgIHBhZDsKKyAgICB1aW50MTZfdCAgICBtYXNrX2xlbjsKK30geFhJR3JhYkRldmljZVJlcTsKKyNkZWZpbmUgc3pfeFhJR3JhYkRldmljZVJlcSAgICAgICAgICAgICAgICAgICAgIDI0CisKKy8qKgorICogUmV0dXJuIGNvZGVzIGZyb20gYSBYSVBhc3NpdmVHcmFiRGV2aWNlIHJlcXVlc3QuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCAgICBtb2RpZmllcnM7ICAgICAgICAgICAgICAvKio8IE1vZGlmaWVyIHN0YXRlICovCisgICAgdWludDhfdCAgICAgc3RhdHVzOyAgICAgICAgICAgICAgICAgLyoqPCBHcmFiIHN0YXR1cyBjb2RlICovCisgICAgdWludDhfdCAgICAgcGFkMDsKKyAgICB1aW50MTZfdCAgICBwYWQxOworfSB4WElHcmFiTW9kaWZpZXJJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVwVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBJbnB1dCBleHRlbnNpb24gbWFqb3Igb3Bjb2RlICovCisgICAgdWludDhfdCAgICAgUmVwVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYX1hJR3JhYkRldmljZSAqLworICAgIHVpbnQxNl90ICAgIHNlcXVlbmNlTnVtYmVyOworICAgIHVpbnQzMl90ICAgIGxlbmd0aDsKKyAgICB1aW50OF90ICAgICBzdGF0dXM7CisgICAgdWludDhfdCAgICAgcGFkMDsKKyAgICB1aW50MTZfdCAgICBwYWQxOworICAgIHVpbnQzMl90ICAgIHBhZDI7CisgICAgdWludDMyX3QgICAgcGFkMzsKKyAgICB1aW50MzJfdCAgICBwYWQ0OworICAgIHVpbnQzMl90ICAgIHBhZDU7CisgICAgdWludDMyX3QgICAgcGFkNjsKK30geFhJR3JhYkRldmljZVJlcGx5OworI2RlZmluZSBzel94WElHcmFiRGV2aWNlUmVwbHkgICAgICAgICAgICAgICAgICAzMgorCisvKioKKyAqIFVuZ3JhYiB0aGUgc3BlY2lmaWVkIGRldmljZS4KKyAqCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXFUeXBlOworICAgIHVpbnQ4X3QgICAgIFJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WF9YSVVuZ3JhYkRldmljZSAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworICAgIFRpbWUgICAgICAgIHRpbWU7CisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgdWludDE2X3QgICAgcGFkOworfSB4WElVbmdyYWJEZXZpY2VSZXE7CisjZGVmaW5lIHN6X3hYSVVuZ3JhYkRldmljZVJlcSAgICAgICAgICAgICAgICAgICAxMgorCisKKy8qKgorICogQWxsb3cgb3IgcmVwbGF5IGV2ZW50cyBvbiB0aGUgc3BlY2lmaWVkIGdyYWJiZWQgZGV2aWNlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVxVHlwZTsKKyAgICB1aW50OF90ICAgICBSZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhfWElBbGxvd0V2ZW50cyAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworICAgIFRpbWUgICAgICAgIHRpbWU7CisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgdWludDhfdCAgICAgbW9kZTsKKyAgICB1aW50OF90ICAgICBwYWQ7Cit9IHhYSUFsbG93RXZlbnRzUmVxOworI2RlZmluZSBzel94WElBbGxvd0V2ZW50c1JlcSAgICAgICAgICAgICAgICAgICAxMgorCisvKioKKyAqIEFsbG93IG9yIHJlcGxheSBldmVudHMgb24gdGhlIHNwZWNpZmllZCBncmFiYmVkIGRldmljZS4KKyAqIFNpbmNlIFhJIDIuMgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVxVHlwZTsKKyAgICB1aW50OF90ICAgICBSZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhfWElBbGxvd0V2ZW50cyAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworICAgIFRpbWUgICAgICAgIHRpbWU7CisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgdWludDhfdCAgICAgbW9kZTsKKyAgICB1aW50OF90ICAgICBwYWQ7CisgICAgdWludDMyX3QgICAgdG91Y2hpZDsgICAgICAgICAgICAgICAgLyoqPCBTaW5jZSBYSSAyLjIgKi8KKyAgICBXaW5kb3cgICAgICBncmFiX3dpbmRvdzsgICAgICAgICAgICAvKio8IFNpbmNlIFhJIDIuMiAqLworfSB4WEkyXzJBbGxvd0V2ZW50c1JlcTsKKyNkZWZpbmUgc3pfeFhJMl8yQWxsb3dFdmVudHNSZXEgICAgICAgICAgICAgICAgMjAKKworCisvKioKKyAqIFBhc3NpdmVseSBncmFiIHRoZSBkZXZpY2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXFUeXBlOworICAgIHVpbnQ4X3QgICAgIFJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WF9YSVBhc3NpdmVHcmFiRGV2aWNlICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgVGltZSAgICAgICAgdGltZTsKKyAgICBXaW5kb3cgICAgICBncmFiX3dpbmRvdzsKKyAgICBDdXJzb3IgICAgICBjdXJzb3I7CisgICAgdWludDMyX3QgICAgZGV0YWlsOworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOworICAgIHVpbnQxNl90ICAgIG51bV9tb2RpZmllcnM7CisgICAgdWludDE2X3QgICAgbWFza19sZW47CisgICAgdWludDhfdCAgICAgZ3JhYl90eXBlOworICAgIHVpbnQ4X3QgICAgIGdyYWJfbW9kZTsKKyAgICB1aW50OF90ICAgICBwYWlyZWRfZGV2aWNlX21vZGU7CisgICAgdWludDhfdCAgICAgb3duZXJfZXZlbnRzOworICAgIHVpbnQxNl90ICAgIHBhZDE7Cit9IHhYSVBhc3NpdmVHcmFiRGV2aWNlUmVxOworI2RlZmluZSBzel94WElQYXNzaXZlR3JhYkRldmljZVJlcSAgICAgICAgICAgICAgMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICAgIHJlcFR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgSW5wdXQgZXh0ZW5zaW9uIG1ham9yIG9wY29kZSAqLworICAgIHVpbnQ4X3QgICAgIFJlcFR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WF9YSVBhc3NpdmVHcmFiRGV2aWNlICovCisgICAgdWludDE2X3QgICAgc2VxdWVuY2VOdW1iZXI7CisgICAgdWludDMyX3QgICAgbGVuZ3RoOworICAgIHVpbnQxNl90ICAgIG51bV9tb2RpZmllcnM7CisgICAgdWludDE2X3QgICAgcGFkMTsKKyAgICB1aW50MzJfdCAgICBwYWQyOworICAgIHVpbnQzMl90ICAgIHBhZDM7CisgICAgdWludDMyX3QgICAgcGFkNDsKKyAgICB1aW50MzJfdCAgICBwYWQ1OworICAgIHVpbnQzMl90ICAgIHBhZDY7Cit9IHhYSVBhc3NpdmVHcmFiRGV2aWNlUmVwbHk7CisjZGVmaW5lIHN6X3hYSVBhc3NpdmVHcmFiRGV2aWNlUmVwbHkgICAgICAgICAgICAzMgorCisvKioKKyAqIERlbGV0ZSBhIHBhc3NpdmUgZ3JhYiBmb3IgdGhlIGdpdmVuIGRldmljZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICAgIHJlcVR5cGU7CisgICAgdWludDhfdCAgICAgUmVxVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgOjpYX1hJUGFzc2l2ZVVuZ3JhYkRldmljZSAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworICAgIFdpbmRvdyAgICAgIGdyYWJfd2luZG93OworICAgIHVpbnQzMl90ICAgIGRldGFpbDsKKyAgICB1aW50MTZfdCAgICBkZXZpY2VpZDsKKyAgICB1aW50MTZfdCAgICBudW1fbW9kaWZpZXJzOworICAgIHVpbnQ4X3QgICAgIGdyYWJfdHlwZTsKKyAgICB1aW50OF90ICAgICBwYWQwOworICAgIHVpbnQxNl90ICAgIHBhZDE7Cit9IHhYSVBhc3NpdmVVbmdyYWJEZXZpY2VSZXE7CisjZGVmaW5lIHN6X3hYSVBhc3NpdmVVbmdyYWJEZXZpY2VSZXEgICAgICAgICAgICAyMAorCisvKioKKyAqIExpc3QgYWxsIGRldmljZSBwcm9wZXJ0aWVzIG9uIHRoZSBzcGVjaWZpZWQgZGV2aWNlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgICAgcmVxVHlwZTsKKyAgICB1aW50OF90ICAgICBSZXFUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhfWElMaXN0UHJvcGVydGllcyAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOworICAgIHVpbnQxNl90ICAgIHBhZDsKK30geFhJTGlzdFByb3BlcnRpZXNSZXE7CisjZGVmaW5lIHN6X3hYSUxpc3RQcm9wZXJ0aWVzUmVxICAgICAgICAgICAgICAgICA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXBUeXBlOyAgICAgICAgICAgICAgICAvKio8IElucHV0IGV4dGVuc2lvbiBtYWpvciBvcGNvZGUgKi8KKyAgICB1aW50OF90ICAgICBSZXBUeXBlOyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyA6OlhfWElMaXN0UHJvcGVydGllcyAqLworICAgIHVpbnQxNl90ICAgIHNlcXVlbmNlTnVtYmVyOworICAgIHVpbnQzMl90ICAgIGxlbmd0aDsKKyAgICB1aW50MTZfdCAgICBudW1fcHJvcGVydGllczsKKyAgICB1aW50MTZfdCAgICBwYWQwOworICAgIHVpbnQzMl90ICAgIHBhZDE7CisgICAgdWludDMyX3QgICAgcGFkMjsKKyAgICB1aW50MzJfdCAgICBwYWQzOworICAgIHVpbnQzMl90ICAgIHBhZDQ7CisgICAgdWludDMyX3QgICAgcGFkNTsKK30geFhJTGlzdFByb3BlcnRpZXNSZXBseTsKKyNkZWZpbmUgc3pfeFhJTGlzdFByb3BlcnRpZXNSZXBseSAgICAgICAgICAgICAgIDMyCisKKy8qKgorICogQ2hhbmdlIGEgcHJvcGVydHkgb24gdGhlIHNwZWNpZmllZCBkZXZpY2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXFUeXBlOworICAgIHVpbnQ4X3QgICAgIFJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIDo6WF9YSUNoYW5nZVByb3BlcnR5ICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgdWludDhfdCAgICAgbW9kZTsKKyAgICB1aW50OF90ICAgICBmb3JtYXQ7CisgICAgQXRvbSAgICAgICAgcHJvcGVydHk7CisgICAgQXRvbSAgICAgICAgdHlwZTsKKyAgICB1aW50MzJfdCAgICBudW1faXRlbXM7Cit9IHhYSUNoYW5nZVByb3BlcnR5UmVxOworI2RlZmluZSBzel94WElDaGFuZ2VQcm9wZXJ0eVJlcSAgICAgICAgICAgICAgICAgMjAKKworLyoqCisgKiBEZWxldGUgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICAgIHJlcVR5cGU7CisgICAgdWludDhfdCAgICAgUmVxVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgWF9YSURlbGV0ZVByb3BlcnR5ICovCisgICAgdWludDE2X3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgdWludDE2X3QgICAgcGFkMDsKKyAgICBBdG9tICAgICAgICBwcm9wZXJ0eTsKK30geFhJRGVsZXRlUHJvcGVydHlSZXE7CisjZGVmaW5lIHN6X3hYSURlbGV0ZVByb3BlcnR5UmVxICAgICAgICAgICAgICAgICAxMgorCisvKioKKyAqIFF1ZXJ5IHRoZSBzcGVjaWZpZWQgcHJvcGVydHkncyB2YWx1ZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICByZXFUeXBlOworICAgIHVpbnQ4X3QgICAgIFJlcVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIFhfWElHZXRQcm9wZXJ0eSAqLworICAgIHVpbnQxNl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICB1aW50OF90ICAgICBjX2RlbGV0ZTsKKyNlbHNlCisgICAgdWludDhfdCAgICAgZGVsZXRlOworI2VuZGlmCisgICAgdWludDhfdCAgICAgcGFkMDsKKyAgICBBdG9tICAgICAgICBwcm9wZXJ0eTsKKyAgICBBdG9tICAgICAgICB0eXBlOworICAgIHVpbnQzMl90ICAgIG9mZnNldDsKKyAgICB1aW50MzJfdCAgICBsZW47Cit9IHhYSUdldFByb3BlcnR5UmVxOworI2RlZmluZSBzel94WElHZXRQcm9wZXJ0eVJlcSAgICAgICAgICAgICAgICAgICAgMjQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICAgIHJlcFR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgSW5wdXQgZXh0ZW5zaW9uIG1ham9yIG9wY29kZSAqLworICAgIHVpbnQ4X3QgICAgIFJlcFR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIFhfWElHZXRQcm9wZXJ0eSAqLworICAgIHVpbnQxNl90ICAgIHNlcXVlbmNlTnVtYmVyOworICAgIHVpbnQzMl90ICAgIGxlbmd0aDsKKyAgICBBdG9tICAgICAgICB0eXBlOworICAgIHVpbnQzMl90ICAgIGJ5dGVzX2FmdGVyOworICAgIHVpbnQzMl90ICAgIG51bV9pdGVtczsKKyAgICB1aW50OF90ICAgICBmb3JtYXQ7CisgICAgdWludDhfdCAgICAgcGFkMDsKKyAgICB1aW50MTZfdCAgICBwYWQxOworICAgIHVpbnQzMl90ICAgIHBhZDI7CisgICAgdWludDMyX3QgICAgcGFkMzsKK30geFhJR2V0UHJvcGVydHlSZXBseTsKKyNkZWZpbmUgc3pfeFhJR2V0UHJvcGVydHlSZXBseSAgICAgICAgICAgICAgIDMyCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWRU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBHZW5lcmljIFhJMiBldmVudCBoZWFkZXIuIEFsbCBYSTIgZXZlbnRzIHVzZSB0aGUgc2FtZSBoZWFkZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCAgICAgdHlwZTsKKyAgICB1aW50OF90ICAgICBleHRlbnNpb247ICAgICAgICAgICAgICAvKio8IFhJIGV4dGVuc2lvbiBvZmZzZXQgKi8KKyAgICB1aW50MTZfdCAgICBzZXF1ZW5jZU51bWJlcjsKKyAgICB1aW50MzJfdCAgICBsZW5ndGg7CisgICAgdWludDE2X3QgICAgZXZ0eXBlOworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOworICAgIFRpbWUgICAgICAgIHRpbWU7Cit9IHhYSUdlbmVyaWNEZXZpY2VFdmVudDsKKworLyoqCisgKiBEZXZpY2UgaGllcmFyY2h5IGluZm9ybWF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOworICAgIHVpbnQxNl90ICAgIGF0dGFjaG1lbnQ7ICAgICAgICAgICAgIC8qKjwgSUQgb2YgbWFzdGVyIG9yIHBhaXJlZCBkZXZpY2UgKi8KKyAgICB1aW50OF90ICAgICB1c2U7ICAgICAgICAgICAgICAgICAgICAvKio8IDo6WElNYXN0ZXJLZXlib2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6WElNYXN0ZXJQb2ludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpYSVNsYXZlS2V5Ym9hcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OlhJU2xhdmVQb2ludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpYSUZsb2F0aW5nU2xhdmUgKi8KKyAgICBCT09MICAgICAgICBlbmFibGVkOyAgICAgICAgICAgICAgICAvKio8IFRSVUUgaWYgdGhlIGRldmljZSBpcyBlbmFibGVkICovCisgICAgdWludDE2X3QgICAgcGFkOworICAgIHVpbnQzMl90ICAgIGZsYWdzOyAgICAgICAgICAgICAgICAgIC8qKjwgOjpYSU1hc3RlckFkZGVkLCA6OlhJTWFzdGVyUmVtb3ZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6WElTbGF2ZUF0dGFjaGVkLCA6OlhJU2xhdmVEZXRhY2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6WElTbGF2ZUFkZGVkLCA6OlhJU2xhdmVSZW1vdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpYSURldmljZUVuYWJsZWQsIDo6WElEZXZpY2VEaXNhYmxlZCAqLworfSB4WElIaWVyYXJjaHlJbmZvOworCisvKioKKyAqIFRoZSBkZXZpY2UgaGllcmFyY2h5IGhhcyBiZWVuIG1vZGlmaWVkLiBUaGlzIGV2ZW50IGluY2x1ZGVzIHRoZSBkZXZpY2UKKyAqIGhpZXJhcmNoeSBhZnRlciB0aGUgbW9kaWZpY2F0aW9uIGhhcyBiZWVuIGFwcGxpZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCAgICAgdHlwZTsgICAgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgR2VuZXJpY0V2ZW50ICovCisgICAgdWludDhfdCAgICAgZXh0ZW5zaW9uOyAgICAgICAgICAgICAgLyoqPCBYSSBleHRlbnNpb24gb2Zmc2V0ICovCisgICAgdWludDE2X3QgICAgc2VxdWVuY2VOdW1iZXI7CisgICAgdWludDMyX3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVuaXRzICovCisgICAgdWludDE2X3QgICAgZXZ0eXBlOyAgICAgICAgICAgICAgICAgLyoqPCA6OlhJX0hpZXJhcmNoeSAqLworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOworICAgIFRpbWUgICAgICAgIHRpbWU7CisgICAgdWludDMyX3QgICAgZmxhZ3M7ICAgICAgICAgICAgICAgICAgLyoqPCA6OlhJTWFzdGVyQWRkZWQsIDo6WElNYXN0ZXJEZWxldGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpYSVNsYXZlQXR0YWNoZWQsIDo6WElTbGF2ZURldGFjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpYSVNsYXZlQWRkZWQsIDo6WElTbGF2ZVJlbW92ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OlhJRGV2aWNlRW5hYmxlZCwgOjpYSURldmljZURpc2FibGVkICovCisgICAgdWludDE2X3QgICAgbnVtX2luZm87CisgICAgdWludDE2X3QgICAgcGFkMDsKKyAgICB1aW50MzJfdCAgICBwYWQxOworICAgIHVpbnQzMl90ICAgIHBhZDI7Cit9IHhYSUhpZXJhcmNoeUV2ZW50OworCisvKioKKyAqIEEgZGV2aWNlIGhhcyBjaGFuZ2VkIGNhcGFiaWxpdGllcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90ICAgICB0eXBlOyAgICAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyBHZW5lcmljRXZlbnQgKi8KKyAgICB1aW50OF90ICAgICBleHRlbnNpb247ICAgICAgICAgICAgICAvKio8IFhJIGV4dGVuc2lvbiBvZmZzZXQgKi8KKyAgICB1aW50MTZfdCAgICBzZXF1ZW5jZU51bWJlcjsKKyAgICB1aW50MzJfdCAgICBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBpbiA0IGJ5dGUgdW5pdHMgKi8KKyAgICB1aW50MTZfdCAgICBldnR5cGU7ICAgICAgICAgICAgICAgICAvKio8IFhJX0RldmljZUNoYW5nZWQgKi8KKyAgICB1aW50MTZfdCAgICBkZXZpY2VpZDsgICAgICAgICAgICAgICAvKio8IERldmljZSB0aGF0IGhhcyBjaGFuZ2VkICovCisgICAgVGltZSAgICAgICAgdGltZTsKKyAgICB1aW50MTZfdCAgICBudW1fY2xhc3NlczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjbGFzc2VzIHRoYXQgaGF2ZSBjaGFuZ2VkICovCisgICAgdWludDE2X3QgICAgc291cmNlaWQ7ICAgICAgICAgICAgICAgLyoqPCBTb3VyY2Ugb2YgdGhlIG5ldyBjbGFzc2VzICovCisgICAgdWludDhfdCAgICAgcmVhc29uOyAgICAgICAgICAgICAgICAgLyoqPCA6OlhJU2xhdmVTd2l0Y2gsIDo6WElEZXZpY2VDaGFuZ2UgKi8KKyAgICB1aW50OF90ICAgICBwYWQwOworICAgIHVpbnQxNl90ICAgIHBhZDE7CisgICAgdWludDMyX3QgICAgcGFkMjsKKyAgICB1aW50MzJfdCAgICBwYWQzOworfSB4WElEZXZpY2VDaGFuZ2VkRXZlbnQ7CisKKy8qKgorICogVGhlIG93bmVyIG9mIGEgdG91Y2ggc3RyZWFtIGhhcyBwYXNzZWQgb24gb3duZXJzaGlwIHRvIGFub3RoZXIgY2xpZW50LgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQ4X3QgICAgIHR5cGU7ICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgR2VuZXJpY0V2ZW50ICovCisgICAgdWludDhfdCAgICAgZXh0ZW5zaW9uOyAgICAgICAgICAvKio8IFhJIGV4dGVuc2lvbiBvZmZzZXQgKi8KKyAgICB1aW50MTZfdCAgICBzZXF1ZW5jZU51bWJlcjsKKyAgICB1aW50MzJfdCAgICBsZW5ndGg7ICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1bml0cyAqLworICAgIHVpbnQxNl90ICAgIGV2dHlwZTsgICAgICAgICAgICAgLyoqPCBYSV9Ub3VjaE93bmVyc2hpcCAqLworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOyAgICAgICAgICAgLyoqPCBEZXZpY2UgdGhhdCBoYXMgY2hhbmdlZCAqLworICAgIFRpbWUgICAgICAgIHRpbWU7CisgICAgdWludDMyX3QgICAgdG91Y2hpZDsKKyAgICBXaW5kb3cgICAgICByb290OworICAgIFdpbmRvdyAgICAgIGV2ZW50OworICAgIFdpbmRvdyAgICAgIGNoaWxkOworLyog4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIDMyIGJ5dGUgYm91bmRhcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICovCisgICAgdWludDE2X3QgICAgc291cmNlaWQ7CisgICAgdWludDE2X3QgICAgcGFkMDsKKyAgICB1aW50MzJfdCAgICBmbGFnczsKKyAgICB1aW50MzJfdCAgICBwYWQxOworICAgIHVpbnQzMl90ICAgIHBhZDI7Cit9IHhYSVRvdWNoT3duZXJzaGlwRXZlbnQ7CisKKy8qKgorICogRGVmYXVsdCBpbnB1dCBldmVudCBmb3IgcG9pbnRlciwga2V5Ym9hcmQgb3IgdG91Y2ggaW5wdXQuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCAgICAgdHlwZTsgICAgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgR2VuZXJpY0V2ZW50ICovCisgICAgdWludDhfdCAgICAgZXh0ZW5zaW9uOyAgICAgICAgICAgICAgLyoqPCBYSSBleHRlbnNpb24gb2Zmc2V0ICovCisgICAgdWludDE2X3QgICAgc2VxdWVuY2VOdW1iZXI7CisgICAgdWludDMyX3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVpbnRzICovCisgICAgdWludDE2X3QgICAgZXZ0eXBlOworICAgIHVpbnQxNl90ICAgIGRldmljZWlkOworICAgIFRpbWUgICAgICAgIHRpbWU7CisgICAgdWludDMyX3QgICAgZGV0YWlsOyAgICAgICAgICAgICAgICAgLyoqPCBLZXljb2RlIG9yIGJ1dHRvbiAqLworICAgIFdpbmRvdyAgICAgIHJvb3Q7CisgICAgV2luZG93ICAgICAgZXZlbnQ7CisgICAgV2luZG93ICAgICAgY2hpbGQ7CisvKiDilJTilIDilIDilIDilIDilIDilIDilIDilIAgMzIgYnl0ZSBib3VuZGFyeSDilIDilIDilIDilIDilIDilIDilIDilIDilJggKi8KKyAgICBGUDE2MTYgICAgICByb290X3g7ICAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyBzY3JlZW4gY29vcmRzLCAxNi4xNiBmaXhlZCBwb2ludCAqLworICAgIEZQMTYxNiAgICAgIHJvb3RfeTsKKyAgICBGUDE2MTYgICAgICBldmVudF94OyAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyBzY3JlZW4gY29vcmRzLCAxNi4xNiBmaXhlZCBwb2ludCAqLworICAgIEZQMTYxNiAgICAgIGV2ZW50X3k7CisgICAgdWludDE2X3QgICAgYnV0dG9uc19sZW47ICAgICAgICAgICAgLyoqPCBMZW4gb2YgYnV0dG9uIGZsYWdzIGluIDQgYiB1bml0cyAqLworICAgIHVpbnQxNl90ICAgIHZhbHVhdG9yc19sZW47ICAgICAgICAgIC8qKjwgTGVuIG9mIHZhbC4gZmxhZ3MgaW4gNCBiIHVuaXRzICovCisgICAgdWludDE2X3QgICAgc291cmNlaWQ7ICAgICAgICAgICAgICAgLyoqPCBUaGUgc291cmNlIGRldmljZSAqLworICAgIHVpbnQxNl90ICAgIHBhZDA7CisgICAgdWludDMyX3QgICAgZmxhZ3M7ICAgICAgICAgICAgICAgICAgLyoqPCA6OlhJS2V5UmVwZWF0ICovCisgICAgeFhJTW9kaWZpZXJJbmZvICAgICBtb2RzOworICAgIHhYSUdyb3VwSW5mbyAgICAgICAgZ3JvdXA7Cit9IHhYSURldmljZUV2ZW50OworCisKKy8qKgorICogU2VudCB3aGVuIGFuIGlucHV0IGV2ZW50IGlzIGdlbmVyYXRlZC4gUmF3RXZlbnRzIGluY2x1ZGUgdmFsdWF0b3IKKyAqIGluZm9ybWF0aW9uIGluIGJvdGggZGV2aWNlLXNwZWNpZmljIGRhdGEgKGkuZS4gdW5hY2NlbGVyYXRlZCkgYW5kCisgKiBwcm9jZXNzZWQgZGF0YSAoaS5lLiBhY2NlbGVyYXRlZCwgaWYgYXBwbGljYWJsZSkuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCAgICAgdHlwZTsgICAgICAgICAgICAgICAgICAgLyoqPCBBbHdheXMgR2VuZXJpY0V2ZW50ICovCisgICAgdWludDhfdCAgICAgZXh0ZW5zaW9uOyAgICAgICAgICAgICAgLyoqPCBYSSBleHRlbnNpb24gb2Zmc2V0ICovCisgICAgdWludDE2X3QgICAgc2VxdWVuY2VOdW1iZXI7CisgICAgdWludDMyX3QgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggaW4gNCBieXRlIHVpbnRzICovCisgICAgdWludDE2X3QgICAgZXZ0eXBlOyAgICAgICAgICAgICAgICAgLyoqPCA6OlhJX1Jhd0V2ZW50ICovCisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgVGltZSAgICAgICAgdGltZTsKKyAgICB1aW50MzJfdCAgICBkZXRhaWw7CisgICAgdWludDE2X3QgICAgc291cmNlaWQ7ICAgICAgICAgICAgICAgLyoqPCBUaGUgc291cmNlIGRldmljZSAoWEkgMi4xKSAqLworICAgIHVpbnQxNl90ICAgIHZhbHVhdG9yc19sZW47ICAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIHRyYWlsaW5nIHZhbHVhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrIGluIDQgYnl0ZSB1bml0cyAqLworICAgIHVpbnQzMl90ICAgIGZsYWdzOyAgICAgICAgICAgICAgICAgIC8qKjwgOjpYSUtleVJlcGVhdCAqLworICAgIHVpbnQzMl90ICAgIHBhZDI7Cit9IHhYSVJhd0V2ZW50OworCisvKioKKyAqIE5vdGUgdGhhdCB0aGUgbGF5b3V0IG9mIHJvb3QsIGV2ZW50LCBjaGlsZCwgcm9vdF94LCByb290X3ksIGV2ZW50X3gsCisgKiBldmVudF95IG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoZSB4WElEZXZpY2VFdmVudC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90ICAgICB0eXBlOyAgICAgICAgICAgICAgICAgICAvKio8IEFsd2F5cyBHZW5lcmljRXZlbnQgKi8KKyAgICB1aW50OF90ICAgICBleHRlbnNpb247ICAgICAgICAgICAgICAvKio8IFhJIGV4dGVuc2lvbiBvZmZzZXQgKi8KKyAgICB1aW50MTZfdCAgICBzZXF1ZW5jZU51bWJlcjsKKyAgICB1aW50MzJfdCAgICBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBpbiA0IGJ5dGUgdWludHMgKi8KKyAgICB1aW50MTZfdCAgICBldnR5cGU7ICAgICAgICAgICAgICAgICAvKio8IDo6WElfRW50ZXIgKi8KKyAgICB1aW50MTZfdCAgICBkZXZpY2VpZDsKKyAgICBUaW1lICAgICAgICB0aW1lOworICAgIHVpbnQxNl90ICAgIHNvdXJjZWlkOworICAgIHVpbnQ4X3QgICAgIG1vZGU7CisgICAgdWludDhfdCAgICAgZGV0YWlsOworICAgIFdpbmRvdyAgICAgIHJvb3Q7CisgICAgV2luZG93ICAgICAgZXZlbnQ7CisgICAgV2luZG93ICAgICAgY2hpbGQ7CisvKiDilJTilIDilIDilIDilIDilIDilIDilIDilIAgMzIgYnl0ZSBib3VuZGFyeSDilIDilIDilIDilIDilIDilIDilIDilIDilJggKi8KKyAgICBGUDE2MTYgICAgICByb290X3g7CisgICAgRlAxNjE2ICAgICAgcm9vdF95OworICAgIEZQMTYxNiAgICAgIGV2ZW50X3g7CisgICAgRlAxNjE2ICAgICAgZXZlbnRfeTsKKyAgICBCT09MICAgICAgICBzYW1lX3NjcmVlbjsKKyAgICBCT09MICAgICAgICBmb2N1czsKKyAgICB1aW50MTZfdCAgICBidXR0b25zX2xlbjsgICAgICAgICAgICAvKio8IExlbmd0aCBvZiB0cmFpbGluZyBidXR0b24gbWFzaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gNCBieXRlIHVuaXRzICovCisgICAgeFhJTW9kaWZpZXJJbmZvICAgICBtb2RzOworICAgIHhYSUdyb3VwSW5mbyAgICAgICAgZ3JvdXA7Cit9IHhYSUVudGVyRXZlbnQ7CisKK3R5cGVkZWYgeFhJRW50ZXJFdmVudCB4WElMZWF2ZUV2ZW50OwordHlwZWRlZiB4WElFbnRlckV2ZW50IHhYSUZvY3VzSW5FdmVudDsKK3R5cGVkZWYgeFhJRW50ZXJFdmVudCB4WElGb2N1c091dEV2ZW50OworCisvKioKKyAqIFNlbnQgd2hlbiBhIGRldmljZSBwcm9wZXJ0eSBpcyBjcmVhdGVkLCBtb2RpZmllZCBvciBkZWxldGVkLiBEb2VzIG5vdAorICogaW5jbHVkZSBwcm9wZXJ0eSBkYXRhLCB0aGUgY2xpZW50IGlzIHJlcXVpcmVkIHRvIHF1ZXJ5IHRoZSBkYXRhLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQ4X3QgICAgIHR5cGU7ICAgICAgICAgICAgICAgICAgIC8qKjwgQWx3YXlzIEdlbmVyaWNFdmVudCAqLworICAgIHVpbnQ4X3QgICAgIGV4dGVuc2lvbjsgICAgICAgICAgICAgIC8qKjwgWEkgZXh0ZW5zaW9uIG9mZnNldCAqLworICAgIHVpbnQxNl90ICAgIHNlcXVlbmNlTnVtYmVyOworICAgIHVpbnQzMl90ICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIGluIDQgYnl0ZSB1aW50cyAqLworICAgIHVpbnQxNl90ICAgIGV2dHlwZTsgICAgICAgICAgICAgICAgIC8qKjwgOjpYSV9Qcm9wZXJ0eUV2ZW50ICovCisgICAgdWludDE2X3QgICAgZGV2aWNlaWQ7CisgICAgVGltZSAgICAgICAgdGltZTsKKyAgICBBdG9tICAgICAgICBwcm9wZXJ0eTsKKyAgICB1aW50OF90ICAgICB3aGF0OyAgICAgICAgICAgICAgICAgICAvKio8IDo6WElQcm9wZXJ0eURlbGV0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OlhJUHJvcGVydHlDcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpYSVByb3BlcnR5TW90aWZpZWQgKi8KKyAgICB1aW50OF90ICAgICBwYWQwOworICAgIHVpbnQxNl90ICAgIHBhZDE7CisgICAgdWludDMyX3QgICAgcGFkMjsKKyAgICB1aW50MzJfdCAgICBwYWQzOworfSB4WElQcm9wZXJ0eUV2ZW50OworCisKKyN1bmRlZiBXaW5kb3cKKyN1bmRlZiBUaW1lCisjdW5kZWYgQXRvbQorI3VuZGVmIEN1cnNvcgorCisjZW5kaWYgLyogX1hJMlBST1RPX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hJbnB1dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YSW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTdmMzg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YSW5wdXQuaApAQCAtMCwwICsxLDEyNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IDE5ODksIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKK0NvcHlyaWdodCAxOTg5IGJ5IEhld2xldHQtUGFja2FyZCBDb21wYW55LCBQYWxvIEFsdG8sIENhbGlmb3JuaWEuCisKKwkJCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCitwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Citib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KK3N1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgSGV3bGV0dC1QYWNrYXJkIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisKK0hFV0xFVFQtUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0hFV0xFVFQtUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKK0FOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKK0FSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKK1NPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGVmaW5pdGlvbnMgdXNlZCBieSB0aGUgbGlicmFyeSBhbmQgY2xpZW50ICovCisKKyNpZm5kZWYgX1hJTlBVVF9IXworI2RlZmluZSBfWElOUFVUX0hfCisKKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hJLmg+CisKKyNkZWZpbmUgX2RldmljZUtleVByZXNzCQkwCisjZGVmaW5lIF9kZXZpY2VLZXlSZWxlYXNlCTEKKworI2RlZmluZSBfZGV2aWNlQnV0dG9uUHJlc3MJMAorI2RlZmluZSBfZGV2aWNlQnV0dG9uUmVsZWFzZQkxCisKKyNkZWZpbmUgX2RldmljZU1vdGlvbk5vdGlmeQkwCisKKyNkZWZpbmUgX2RldmljZUZvY3VzSW4JCTAKKyNkZWZpbmUgX2RldmljZUZvY3VzT3V0CQkxCisKKyNkZWZpbmUgX3Byb3hpbWl0eUluCQkwCisjZGVmaW5lIF9wcm94aW1pdHlPdXQJCTEKKworI2RlZmluZSBfZGV2aWNlU3RhdGVOb3RpZnkJMAorI2RlZmluZSBfZGV2aWNlTWFwcGluZ05vdGlmeQkxCisjZGVmaW5lIF9jaGFuZ2VEZXZpY2VOb3RpZnkJMgorLyogU3BhY2Ugb2YgMyBiZXR3ZWVuIGlzIG5lY2Vzc2FyeSEgUmVzZXJ2ZWQgZm9yIERldmljZUtleVN0YXRlTm90aWZ5LAorICAgRGV2aWNlQnV0dG9uU3RhdGVOb3RpZnksIERldmljZVByZXNlbmNlTm90aWZ5IChlc3NlbnRpYWxseSB1bnVzZWQpLiBUaGlzCisgICBjb2RlIGhhcyB0byBiZSBpbiBzeW5jIHdpdGggRml4RXh0ZW5zaW9uRXZlbnRzKCkgaW4geHNlcnZlci9YaS9leHRpbml0LmMgKi8KKyNkZWZpbmUgX3Byb3BlcnR5Tm90aWZ5CQk2CisKKyNkZWZpbmUgRmluZFR5cGVBbmRDbGFzcyhkLHR5cGUsX2NsYXNzLGNsYXNzaWQsb2Zmc2V0KSBcCisgICAgeyBpbnQgX2k7IFhJbnB1dENsYXNzSW5mbyAqX2lwOyBcCisgICAgdHlwZSA9IDA7IF9jbGFzcyA9IDA7IFwKKyAgICBmb3IgKF9pPTAsIF9pcD0gKChYRGV2aWNlICopIGQpLT5jbGFzc2VzOyBcCisJIF9pPCAoKFhEZXZpY2UgKikgZCktPm51bV9jbGFzc2VzOyBcCisJIF9pKyssIF9pcCsrKSBcCisJaWYgKF9pcC0+aW5wdXRfY2xhc3MgPT0gY2xhc3NpZCkgXAorCSAgICB7dHlwZSA9ICBfaXAtPmV2ZW50X3R5cGVfYmFzZSArIG9mZnNldDsgXAorCSAgICAgX2NsYXNzID0gICgoWERldmljZSAqKSBkKS0+ZGV2aWNlX2lkIDw8IDggfCB0eXBlO319CisKKyNkZWZpbmUgRGV2aWNlS2V5UHJlc3MoZCx0eXBlLF9jbGFzcykgXAorICAgIEZpbmRUeXBlQW5kQ2xhc3MoZCwgdHlwZSwgX2NsYXNzLCBLZXlDbGFzcywgX2RldmljZUtleVByZXNzKQorCisjZGVmaW5lIERldmljZUtleVJlbGVhc2UoZCx0eXBlLF9jbGFzcykgXAorICAgIEZpbmRUeXBlQW5kQ2xhc3MoZCwgdHlwZSwgX2NsYXNzLCBLZXlDbGFzcywgX2RldmljZUtleVJlbGVhc2UpCisKKyNkZWZpbmUgRGV2aWNlQnV0dG9uUHJlc3MoZCx0eXBlLF9jbGFzcykgXAorICAgIEZpbmRUeXBlQW5kQ2xhc3MoZCwgdHlwZSwgX2NsYXNzLCBCdXR0b25DbGFzcywgX2RldmljZUJ1dHRvblByZXNzKQorCisjZGVmaW5lIERldmljZUJ1dHRvblJlbGVhc2UoZCx0eXBlLF9jbGFzcykgXAorICAgIEZpbmRUeXBlQW5kQ2xhc3MoZCwgdHlwZSwgX2NsYXNzLCBCdXR0b25DbGFzcywgX2RldmljZUJ1dHRvblJlbGVhc2UpCisKKyNkZWZpbmUgRGV2aWNlTW90aW9uTm90aWZ5KGQsdHlwZSxfY2xhc3MpIFwKKyAgICBGaW5kVHlwZUFuZENsYXNzKGQsIHR5cGUsIF9jbGFzcywgVmFsdWF0b3JDbGFzcywgX2RldmljZU1vdGlvbk5vdGlmeSkKKworI2RlZmluZSBEZXZpY2VGb2N1c0luKGQsdHlwZSxfY2xhc3MpIFwKKyAgICBGaW5kVHlwZUFuZENsYXNzKGQsIHR5cGUsIF9jbGFzcywgRm9jdXNDbGFzcywgX2RldmljZUZvY3VzSW4pCisKKyNkZWZpbmUgRGV2aWNlRm9jdXNPdXQoZCx0eXBlLF9jbGFzcykgXAorICAgIEZpbmRUeXBlQW5kQ2xhc3MoZCwgdHlwZSwgX2NsYXNzLCBGb2N1c0NsYXNzLCBfZGV2aWNlRm9jdXNPdXQpCisKKyNkZWZpbmUgUHJveGltaXR5SW4oZCx0eXBlLF9jbGFzcykgXAorICAgIEZpbmRUeXBlQW5kQ2xhc3MoZCwgdHlwZSwgX2NsYXNzLCBQcm94aW1pdHlDbGFzcywgX3Byb3hpbWl0eUluKQorCisjZGVmaW5lIFByb3hpbWl0eU91dChkLHR5cGUsX2NsYXNzKSBcCisgICAgRmluZFR5cGVBbmRDbGFzcyhkLCB0eXBlLCBfY2xhc3MsIFByb3hpbWl0eUNsYXNzLCBfcHJveGltaXR5T3V0KQorCisjZGVmaW5lIERldmljZVN0YXRlTm90aWZ5KGQsdHlwZSxfY2xhc3MpIFwKKyAgICBGaW5kVHlwZUFuZENsYXNzKGQsIHR5cGUsIF9jbGFzcywgT3RoZXJDbGFzcywgX2RldmljZVN0YXRlTm90aWZ5KQorCisjZGVmaW5lIERldmljZU1hcHBpbmdOb3RpZnkoZCx0eXBlLF9jbGFzcykgXAorICAgIEZpbmRUeXBlQW5kQ2xhc3MoZCwgdHlwZSwgX2NsYXNzLCBPdGhlckNsYXNzLCBfZGV2aWNlTWFwcGluZ05vdGlmeSkKKworI2RlZmluZSBDaGFuZ2VEZXZpY2VOb3RpZnkoZCx0eXBlLF9jbGFzcykgXAorICAgIEZpbmRUeXBlQW5kQ2xhc3MoZCwgdHlwZSwgX2NsYXNzLCBPdGhlckNsYXNzLCBfY2hhbmdlRGV2aWNlTm90aWZ5KQorCisjZGVmaW5lIERldmljZVByb3BlcnR5Tm90aWZ5KGQsIHR5cGUsIF9jbGFzcykgXAorICAgIEZpbmRUeXBlQW5kQ2xhc3MoZCwgdHlwZSwgX2NsYXNzLCBPdGhlckNsYXNzLCBfcHJvcGVydHlOb3RpZnkpCisKKyNkZWZpbmUgRGV2aWNlUG9pbnRlck1vdGlvbkhpbnQoZCx0eXBlLF9jbGFzcykgXAorICAgIHsgX2NsYXNzID0gICgoWERldmljZSAqKSBkKS0+ZGV2aWNlX2lkIDw8IDggfCBfZGV2aWNlUG9pbnRlck1vdGlvbkhpbnQ7fQorCisjZGVmaW5lIERldmljZUJ1dHRvbjFNb3Rpb24oZCx0eXBlLF9jbGFzcykgXAorICAgIHsgX2NsYXNzID0gICgoWERldmljZSAqKSBkKS0+ZGV2aWNlX2lkIDw8IDggfCBfZGV2aWNlQnV0dG9uMU1vdGlvbjt9CisKKyNkZWZpbmUgRGV2aWNlQnV0dG9uMk1vdGlvbihkLHR5cGUsX2NsYXNzKSBcCisgICAgeyBfY2xhc3MgPSAgKChYRGV2aWNlICopIGQpLT5kZXZpY2VfaWQgPDwgOCB8IF9kZXZpY2VCdXR0b24yTW90aW9uO30KKworI2RlZmluZSBEZXZpY2VCdXR0b24zTW90aW9uKGQsdHlwZSxfY2xhc3MpIFwKKyAgICB7IF9jbGFzcyA9ICAoKFhEZXZpY2UgKikgZCktPmRldmljZV9pZCA8PCA4IHwgX2RldmljZUJ1dHRvbjNNb3Rpb247fQorCisjZGVmaW5lIERldmljZUJ1dHRvbjRNb3Rpb24oZCx0eXBlLCBfY2xhc3MpIFwKKyAgICB7IF9jbGFzcyA9ICAoKFhEZXZpY2UgKikgZCktPmRldmljZV9pZCA8PCA4IHwgX2RldmljZUJ1dHRvbjRNb3Rpb247fQorCisjZGVmaW5lIERldmljZUJ1dHRvbjVNb3Rpb24oZCx0eXBlLF9jbGFzcykgXAorICAgIHsgX2NsYXNzID0gICgoWERldmljZSAqKSBkKS0+ZGV2aWNlX2lkIDw8IDggfCBfZGV2aWNlQnV0dG9uNU1vdGlvbjt9CisKKyNkZWZpbmUgRGV2aWNlQnV0dG9uTW90aW9uKGQsdHlwZSwgX2NsYXNzKSBcCisgICAgeyBfY2xhc3MgPSAgKChYRGV2aWNlICopIGQpLT5kZXZpY2VfaWQgPDwgOCB8IF9kZXZpY2VCdXR0b25Nb3Rpb247fQorCisjZGVmaW5lIERldmljZU93bmVyR3JhYkJ1dHRvbihkLHR5cGUsX2NsYXNzKSBcCisgICAgeyBfY2xhc3MgPSAgKChYRGV2aWNlICopIGQpLT5kZXZpY2VfaWQgPDwgOCB8IF9kZXZpY2VPd25lckdyYWJCdXR0b247fQorCisjZGVmaW5lIERldmljZUJ1dHRvblByZXNzR3JhYihkLHR5cGUsX2NsYXNzKSBcCisgICAgeyBfY2xhc3MgPSAgKChYRGV2aWNlICopIGQpLT5kZXZpY2VfaWQgPDwgOCB8IF9kZXZpY2VCdXR0b25HcmFiO30KKworI2RlZmluZSBOb0V4dGVuc2lvbkV2ZW50KGQsdHlwZSxfY2xhc3MpIFwKKyAgICB7IF9jbGFzcyA9ICAoKFhEZXZpY2UgKikgZCktPmRldmljZV9pZCA8PCA4IHwgX25vRXh0ZW5zaW9uRXZlbnQ7fQorCisKKy8qIFdlIG5lZWQgdGhlIGRlY2xhcmF0aW9uIGZvciBEZXZpY2VQcmVzZW5jZS4gKi8KKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorICAgIGV4dGVybiBpbnQgX1hpR2V0RGV2aWNlUHJlc2VuY2VOb3RpZnlFdmVudChEaXNwbGF5ICopOworICAgIGV4dGVybiB2b2lkIF94aWJhZGRldmljZSggRGlzcGxheSAqZHB5LCBpbnQgKmVycm9yKTsKKyAgICBleHRlcm4gdm9pZCBfeGliYWRjbGFzcyggRGlzcGxheSAqZHB5LCBpbnQgKmVycm9yKTsKKyAgICBleHRlcm4gdm9pZCBfeGliYWRldmVudCggRGlzcGxheSAqZHB5LCBpbnQgKmVycm9yKTsKKyAgICBleHRlcm4gdm9pZCBfeGliYWRtb2RlKCBEaXNwbGF5ICpkcHksIGludCAqZXJyb3IpOworICAgIGV4dGVybiB2b2lkIF94aWRldmljZWJ1c3koIERpc3BsYXkgKmRweSwgaW50ICplcnJvcik7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNkZWZpbmUgRGV2aWNlUHJlc2VuY2UoZHB5LCB0eXBlLCBfY2xhc3MpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0eXBlID0gX1hpR2V0RGV2aWNlUHJlc2VuY2VOb3RpZnlFdmVudChkcHkpOyAgICAgICAgICAgIFwKKyAgICAgICAgX2NsYXNzID0gICgweDEwMDAwIHwgX2RldmljZVByZXNlbmNlKTsgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvKiBFcnJvcnMgKi8KKyNkZWZpbmUgQmFkRGV2aWNlKGRweSxlcnJvcikgX3hpYmFkZGV2aWNlKGRweSwgJmVycm9yKQorCisjZGVmaW5lIEJhZENsYXNzKGRweSxlcnJvcikgX3hpYmFkY2xhc3MoZHB5LCAmZXJyb3IpCisKKyNkZWZpbmUgQmFkRXZlbnQoZHB5LGVycm9yKSBfeGliYWRldmVudChkcHksICZlcnJvcikKKworI2RlZmluZSBCYWRNb2RlKGRweSxlcnJvcikgX3hpYmFkbW9kZShkcHksICZlcnJvcikKKworI2RlZmluZSBEZXZpY2VCdXN5KGRweSxlcnJvcikgX3hpZGV2aWNlYnVzeShkcHksICZlcnJvcikKKwordHlwZWRlZiBzdHJ1Y3QgX1hBbnlDbGFzc2luZm8gKlhBbnlDbGFzc1B0cjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERldmljZUtleSBldmVudHMuICBUaGVzZSBldmVudHMgYXJlIHNlbnQgYnkgaW5wdXQgZGV2aWNlcyB0aGF0CisgKiBzdXBwb3J0IGlucHV0IGNsYXNzIEtleXMuCisgKiBUaGUgbG9jYXRpb24gb2YgdGhlIFggcG9pbnRlciBpcyByZXBvcnRlZCBpbiB0aGUgY29vcmRpbmF0ZQorICogZmllbGRzIG9mIHRoZSB4LHkgYW5kIHhfcm9vdCx5X3Jvb3QgZmllbGRzLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCAKKyAgICB7CisgICAgaW50ICAgICAgICAgICAgdHlwZTsgICAgICAgICAvKiBvZiBldmVudCAqLworICAgIHVuc2lnbmVkIGxvbmcgIHNlcmlhbDsgICAgICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkICovCisgICAgQm9vbCAgICAgICAgICAgc2VuZF9ldmVudDsgICAvKiB0cnVlIGlmIGZyb20gU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICAgICAgICAqZGlzcGxheTsgICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBXaW5kb3cgICAgICAgICB3aW5kb3c7ICAgICAgIC8qICJldmVudCIgd2luZG93IHJlcG9ydGVkIHJlbGF0aXZlIHRvICovCisgICAgWElEICAgICAgICAgICAgZGV2aWNlaWQ7CisgICAgV2luZG93ICAgICAgICAgcm9vdDsgICAgICAgICAvKiByb290IHdpbmRvdyBldmVudCBvY2N1cmVkIG9uICovCisgICAgV2luZG93ICAgICAgICAgc3Vid2luZG93OyAgICAvKiBjaGlsZCB3aW5kb3cgKi8KKyAgICBUaW1lICAgICAgICAgICB0aW1lOyAgICAgICAgIC8qIG1pbGxpc2Vjb25kcyAqLworICAgIGludCAgICAgICAgICAgIHgsIHk7ICAgICAgICAgLyogeCwgeSBjb29yZGluYXRlcyBpbiBldmVudCB3aW5kb3cgKi8KKyAgICBpbnQgICAgICAgICAgICB4X3Jvb3Q7ICAgICAgIC8qIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHJvb3QgKi8KKyAgICBpbnQgICAgICAgICAgICB5X3Jvb3Q7ICAgICAgIC8qIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHJvb3QgKi8KKyAgICB1bnNpZ25lZCBpbnQgICBzdGF0ZTsgICAgICAgIC8qIGtleSBvciBidXR0b24gbWFzayAqLworICAgIHVuc2lnbmVkIGludCAgIGtleWNvZGU7ICAgICAgLyogZGV0YWlsICovCisgICAgQm9vbCAgICAgICAgICAgc2FtZV9zY3JlZW47ICAvKiBzYW1lIHNjcmVlbiBmbGFnICovCisgICAgdW5zaWduZWQgaW50ICAgZGV2aWNlX3N0YXRlOyAvKiBkZXZpY2Uga2V5IG9yIGJ1dHRvbiBtYXNrICovCisgICAgdW5zaWduZWQgY2hhciAgYXhlc19jb3VudDsKKyAgICB1bnNpZ25lZCBjaGFyICBmaXJzdF9heGlzOworICAgIGludCAgICAgICAgICAgIGF4aXNfZGF0YVs2XTsKKyAgICB9IFhEZXZpY2VLZXlFdmVudDsKKwordHlwZWRlZiBYRGV2aWNlS2V5RXZlbnQgWERldmljZUtleVByZXNzZWRFdmVudDsKK3R5cGVkZWYgWERldmljZUtleUV2ZW50IFhEZXZpY2VLZXlSZWxlYXNlZEV2ZW50OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERldmljZUJ1dHRvbiBldmVudHMuICBUaGVzZSBldmVudHMgYXJlIHNlbnQgYnkgZXh0ZW5zaW9uIGRldmljZXMKKyAqIHRoYXQgc3VwcG9ydCBpbnB1dCBjbGFzcyBCdXR0b25zLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICB0eXBlOyAgICAgICAgIC8qIG9mIGV2ZW50ICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7ICAgICAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sICAgICAgICAgIHNlbmRfZXZlbnQ7ICAgLyogdHJ1ZSBpZiBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICAgICAgICpkaXNwbGF5OyAgICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIFdpbmRvdyAgICAgICAgd2luZG93OyAgICAgICAvKiAiZXZlbnQiIHdpbmRvdyByZXBvcnRlZCByZWxhdGl2ZSB0byAqLworICAgIFhJRCAgICAgICAgICAgZGV2aWNlaWQ7CisgICAgV2luZG93ICAgICAgICByb290OyAgICAgICAgIC8qIHJvb3Qgd2luZG93IHRoYXQgdGhlIGV2ZW50IG9jY3VyZWQgb24gKi8KKyAgICBXaW5kb3cgICAgICAgIHN1YndpbmRvdzsgICAgLyogY2hpbGQgd2luZG93ICovCisgICAgVGltZSAgICAgICAgICB0aW1lOyAgICAgICAgIC8qIG1pbGxpc2Vjb25kcyAqLworICAgIGludCAgICAgICAgICAgeCwgeTsgICAgICAgICAvKiB4LCB5IGNvb3JkaW5hdGVzIGluIGV2ZW50IHdpbmRvdyAqLworICAgIGludCAgICAgICAgICAgeF9yb290OyAgICAgICAvKiBjb29yZGluYXRlcyByZWxhdGl2ZSB0byByb290ICovCisgICAgaW50ICAgICAgICAgICB5X3Jvb3Q7ICAgICAgIC8qIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHJvb3QgKi8KKyAgICB1bnNpZ25lZCBpbnQgIHN0YXRlOyAgICAgICAgLyoga2V5IG9yIGJ1dHRvbiBtYXNrICovCisgICAgdW5zaWduZWQgaW50ICBidXR0b247ICAgICAgIC8qIGRldGFpbCAqLworICAgIEJvb2wgICAgICAgICAgc2FtZV9zY3JlZW47ICAvKiBzYW1lIHNjcmVlbiBmbGFnICovCisgICAgdW5zaWduZWQgaW50ICBkZXZpY2Vfc3RhdGU7IC8qIGRldmljZSBrZXkgb3IgYnV0dG9uIG1hc2sgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGF4ZXNfY291bnQ7CisgICAgdW5zaWduZWQgY2hhciBmaXJzdF9heGlzOworICAgIGludCAgICAgICAgICAgYXhpc19kYXRhWzZdOworICAgIH0gWERldmljZUJ1dHRvbkV2ZW50OworCit0eXBlZGVmIFhEZXZpY2VCdXR0b25FdmVudCBYRGV2aWNlQnV0dG9uUHJlc3NlZEV2ZW50OwordHlwZWRlZiBYRGV2aWNlQnV0dG9uRXZlbnQgWERldmljZUJ1dHRvblJlbGVhc2VkRXZlbnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGV2aWNlTW90aW9uTm90aWZ5IGV2ZW50LiAgVGhlc2UgZXZlbnRzIGFyZSBzZW50IGJ5IGV4dGVuc2lvbiBkZXZpY2VzCisgKiB0aGF0IHN1cHBvcnQgaW5wdXQgY2xhc3MgVmFsdWF0b3JzLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCAKKyAgICB7CisgICAgaW50ICAgICAgICAgICB0eXBlOyAgICAgICAgLyogb2YgZXZlbnQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCAgICAgICAgICBzZW5kX2V2ZW50OyAgLyogdHJ1ZSBpZiBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICAgICAgICpkaXNwbGF5OyAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgV2luZG93ICAgICAgICB3aW5kb3c7ICAgICAgLyogImV2ZW50IiB3aW5kb3cgcmVwb3J0ZWQgcmVsYXRpdmUgdG8gKi8KKyAgICBYSUQgICAgICAgICAgIGRldmljZWlkOworICAgIFdpbmRvdyAgICAgICAgcm9vdDsgICAgICAgIC8qIHJvb3Qgd2luZG93IHRoYXQgdGhlIGV2ZW50IG9jY3VyZWQgb24gKi8KKyAgICBXaW5kb3cgICAgICAgIHN1YndpbmRvdzsgICAvKiBjaGlsZCB3aW5kb3cgKi8KKyAgICBUaW1lICAgICAgICAgIHRpbWU7ICAgICAgICAvKiBtaWxsaXNlY29uZHMgKi8KKyAgICBpbnQgICAgICAgICAgIHgsIHk7ICAgICAgICAvKiB4LCB5IGNvb3JkaW5hdGVzIGluIGV2ZW50IHdpbmRvdyAqLworICAgIGludCAgICAgICAgICAgeF9yb290OyAgICAgIC8qIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHJvb3QgKi8KKyAgICBpbnQgICAgICAgICAgIHlfcm9vdDsgICAgICAvKiBjb29yZGluYXRlcyByZWxhdGl2ZSB0byByb290ICovCisgICAgdW5zaWduZWQgaW50ICBzdGF0ZTsgICAgICAgLyoga2V5IG9yIGJ1dHRvbiBtYXNrICovCisgICAgY2hhciAgICAgICAgICBpc19oaW50OyAgICAgLyogZGV0YWlsICovCisgICAgQm9vbCAgICAgICAgICBzYW1lX3NjcmVlbjsgLyogc2FtZSBzY3JlZW4gZmxhZyAqLworICAgIHVuc2lnbmVkIGludCAgZGV2aWNlX3N0YXRlOyAvKiBkZXZpY2Uga2V5IG9yIGJ1dHRvbiBtYXNrICovCisgICAgdW5zaWduZWQgY2hhciBheGVzX2NvdW50OworICAgIHVuc2lnbmVkIGNoYXIgZmlyc3RfYXhpczsKKyAgICBpbnQgICAgICAgICAgIGF4aXNfZGF0YVs2XTsKKyAgICB9IFhEZXZpY2VNb3Rpb25FdmVudDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXZpY2VGb2N1c0NoYW5nZSBldmVudHMuICBUaGVzZSBldmVudHMgYXJlIHNlbnQgd2hlbiB0aGUgZm9jdXMKKyAqIG9mIGFuIGV4dGVuc2lvbiBkZXZpY2UgdGhhdCBjYW4gYmUgZm9jdXNlZCBpcyBjaGFuZ2VkLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCAKKyAgICB7CisgICAgaW50ICAgICAgICAgICB0eXBlOyAgICAgICAvKiBvZiBldmVudCAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOyAgICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgICAgICAgICAgc2VuZF9ldmVudDsgLyogdHJ1ZSBpZiBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICAgICAgICpkaXNwbGF5OyAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBXaW5kb3cgICAgICAgIHdpbmRvdzsgICAgIC8qICJldmVudCIgd2luZG93IHJlcG9ydGVkIHJlbGF0aXZlIHRvICovCisgICAgWElEICAgICAgICAgICBkZXZpY2VpZDsKKyAgICBpbnQgICAgICAgICAgIG1vZGU7ICAgICAgIC8qIE5vdGlmeU5vcm1hbCwgTm90aWZ5R3JhYiwgTm90aWZ5VW5ncmFiICovCisgICAgaW50ICAgICAgICAgICBkZXRhaWw7CisJLyoKKwkgKiBOb3RpZnlBbmNlc3RvciwgTm90aWZ5VmlydHVhbCwgTm90aWZ5SW5mZXJpb3IsIAorCSAqIE5vdGlmeU5vbkxpbmVhcixOb3RpZnlOb25MaW5lYXJWaXJ0dWFsLCBOb3RpZnlQb2ludGVyLAorCSAqIE5vdGlmeVBvaW50ZXJSb290LCBOb3RpZnlEZXRhaWxOb25lIAorCSAqLworICAgIFRpbWUgICAgICAgICAgICAgICAgdGltZTsKKyAgICB9IFhEZXZpY2VGb2N1c0NoYW5nZUV2ZW50OworCit0eXBlZGVmIFhEZXZpY2VGb2N1c0NoYW5nZUV2ZW50IFhEZXZpY2VGb2N1c0luRXZlbnQ7Cit0eXBlZGVmIFhEZXZpY2VGb2N1c0NoYW5nZUV2ZW50IFhEZXZpY2VGb2N1c091dEV2ZW50OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFByb3hpbWl0eU5vdGlmeSBldmVudHMuICBUaGVzZSBldmVudHMgYXJlIHNlbnQgYnkgdGhvc2UgYWJzb2x1dGUKKyAqIHBvc2l0aW9uaW5nIGRldmljZXMgdGhhdCBhcmUgY2FwYWJsZSBvZiBnZW5lcmF0aW5nIHByb3hpbWl0eSBpbmZvcm1hdGlvbi4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgCisgICAgeworICAgIGludCAgICAgICAgICAgICB0eXBlOyAgICAgIC8qIFByb3hpbWl0eUluIG9yIFByb3hpbWl0eU91dCAqLyAgICAgICAgCisgICAgdW5zaWduZWQgbG9uZyAgIHNlcmlhbDsgICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgICAgICAgICAgICBzZW5kX2V2ZW50OyAvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICAgICAgICAgKmRpc3BsYXk7ICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgV2luZG93ICAgICAgICAgIHdpbmRvdzsgICAgICAKKyAgICBYSUQJICAgICAgICAgICAgZGV2aWNlaWQ7CisgICAgV2luZG93ICAgICAgICAgIHJvb3Q7ICAgICAgICAgICAgCisgICAgV2luZG93ICAgICAgICAgIHN1YndpbmRvdzsgICAgICAKKyAgICBUaW1lICAgICAgICAgICAgdGltZTsgICAgICAgICAgICAKKyAgICBpbnQgICAgICAgICAgICAgeCwgeTsgICAgICAgICAgICAKKyAgICBpbnQgICAgICAgICAgICAgeF9yb290LCB5X3Jvb3Q7ICAKKyAgICB1bnNpZ25lZCBpbnQgICAgc3RhdGU7ICAgICAgICAgICAKKyAgICBCb29sICAgICAgICAgICAgc2FtZV9zY3JlZW47ICAgICAKKyAgICB1bnNpZ25lZCBpbnQgICAgZGV2aWNlX3N0YXRlOyAvKiBkZXZpY2Uga2V5IG9yIGJ1dHRvbiBtYXNrICovCisgICAgdW5zaWduZWQgY2hhciAgIGF4ZXNfY291bnQ7CisgICAgdW5zaWduZWQgY2hhciAgIGZpcnN0X2F4aXM7CisgICAgaW50ICAgICAgICAgICAgIGF4aXNfZGF0YVs2XTsKKyAgICB9IFhQcm94aW1pdHlOb3RpZnlFdmVudDsKK3R5cGVkZWYgWFByb3hpbWl0eU5vdGlmeUV2ZW50IFhQcm94aW1pdHlJbkV2ZW50OwordHlwZWRlZiBYUHJveGltaXR5Tm90aWZ5RXZlbnQgWFByb3hpbWl0eU91dEV2ZW50OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERldmljZVN0YXRlTm90aWZ5IGV2ZW50cyBhcmUgZ2VuZXJhdGVkIG9uIEVudGVyV2luZG93IGFuZCBGb2N1c0luIAorICogZm9yIHRob3NlIGNsaWVudHMgd2hvIGhhdmUgc2VsZWN0ZWQgRGV2aWNlU3RhdGUuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICB1bnNpZ25lZCBjaGFyCWNfY2xhc3M7CisjZWxzZQorICAgIHVuc2lnbmVkIGNoYXIJY2xhc3M7CisjZW5kaWYKKyAgICB1bnNpZ25lZCBjaGFyCWxlbmd0aDsKKyAgICB9IFhJbnB1dENsYXNzOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICB0eXBlOworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOyAgICAgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCAgICAgICAgICBzZW5kX2V2ZW50OyAgIC8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgICAgICAgKmRpc3BsYXk7ICAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgV2luZG93ICAgICAgICB3aW5kb3c7CisgICAgWElEICAgICAgICAgICBkZXZpY2VpZDsKKyAgICBUaW1lICAgICAgICAgIHRpbWU7CisgICAgaW50ICAgICAgICAgICBudW1fY2xhc3NlczsKKyAgICBjaGFyCSAgZGF0YVs2NF07Cit9IFhEZXZpY2VTdGF0ZU5vdGlmeUV2ZW50OwkKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICB1bnNpZ25lZCBjaGFyCWNfY2xhc3M7CisjZWxzZQorICAgIHVuc2lnbmVkIGNoYXIJY2xhc3M7CisjZW5kaWYKKyAgICB1bnNpZ25lZCBjaGFyCWxlbmd0aDsKKyAgICB1bnNpZ25lZCBjaGFyCW51bV92YWx1YXRvcnM7CisgICAgdW5zaWduZWQgY2hhcgltb2RlOworICAgIGludCAgICAgICAgCQl2YWx1YXRvcnNbNl07Cit9IFhWYWx1YXRvclN0YXR1czsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICB1bnNpZ25lZCBjaGFyCWNfY2xhc3M7CisjZWxzZQorICAgIHVuc2lnbmVkIGNoYXIJY2xhc3M7CisjZW5kaWYKKyAgICB1bnNpZ25lZCBjaGFyCWxlbmd0aDsKKyAgICBzaG9ydAkJbnVtX2tleXM7CisgICAgY2hhciAgICAgICAgCWtleXNbMzJdOworfSBYS2V5U3RhdHVzOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIHVuc2lnbmVkIGNoYXIJY19jbGFzczsKKyNlbHNlCisgICAgdW5zaWduZWQgY2hhcgljbGFzczsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGNoYXIJbGVuZ3RoOworICAgIHNob3J0CQludW1fYnV0dG9uczsKKyAgICBjaGFyICAgICAgICAJYnV0dG9uc1szMl07Cit9IFhCdXR0b25TdGF0dXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGV2aWNlTWFwcGluZ05vdGlmeSBldmVudC4gIFRoaXMgZXZlbnQgaXMgc2VudCB3aGVuIHRoZSBrZXkgbWFwcGluZywKKyAqIG1vZGlmaWVyIG1hcHBpbmcsIG9yIGJ1dHRvbiBtYXBwaW5nIG9mIGFuIGV4dGVuc2lvbiBkZXZpY2UgaXMgY2hhbmdlZC4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgdHlwZTsKKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAgICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgICAgICAgICAgc2VuZF9ldmVudDsgICAvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICAgICAgICpkaXNwbGF5OyAgICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIFdpbmRvdyAgICAgICAgd2luZG93OyAgICAgICAvKiB1bnVzZWQgKi8KKyAgICBYSUQgICAgICAgICAgIGRldmljZWlkOworICAgIFRpbWUgICAgICAgICAgdGltZTsKKyAgICBpbnQgICAgICAgICAgIHJlcXVlc3Q7ICAgICAgLyogb25lIG9mIE1hcHBpbmdNb2RpZmllciwgTWFwcGluZ0tleWJvYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZ1BvaW50ZXIgKi8KKyAgICBpbnQgICAgICAgICAgIGZpcnN0X2tleWNvZGU7LyogZmlyc3Qga2V5Y29kZSAqLworICAgIGludCAgICAgICAgICAgY291bnQ7ICAgICAgICAvKiBkZWZpbmVzIHJhbmdlIG9mIGNoYW5nZSB3LiBmaXJzdF9rZXljb2RlKi8KK30gWERldmljZU1hcHBpbmdFdmVudDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDaGFuZ2VEZXZpY2VOb3RpZnkgZXZlbnQuICBUaGlzIGV2ZW50IGlzIHNlbnQgd2hlbiBhbiAKKyAqIFhDaGFuZ2VLZXlib2FyZCBvciBYQ2hhbmdlUG9pbnRlciByZXF1ZXN0IGlzIG1hZGUuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgIHR5cGU7CisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7ICAgICAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sICAgICAgICAgIHNlbmRfZXZlbnQ7ICAgLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAgICAgICAqZGlzcGxheTsgICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBXaW5kb3cgICAgICAgIHdpbmRvdzsgICAgICAgLyogdW51c2VkICovCisgICAgWElEICAgICAgICAgICBkZXZpY2VpZDsKKyAgICBUaW1lICAgICAgICAgIHRpbWU7CisgICAgaW50ICAgICAgICAgICByZXF1ZXN0OyAgICAgIC8qIE5ld1BvaW50ZXIgb3IgTmV3S2V5Ym9hcmQgKi8KK30gWENoYW5nZURldmljZU5vdGlmeUV2ZW50OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERldmljZVByZXNlbmNlTm90aWZ5IGV2ZW50LiAgVGhpcyBldmVudCBpcyBzZW50IHdoZW4gdGhlIGxpc3Qgb2YKKyAqIGlucHV0IGRldmljZXMgY2hhbmdlcywgaW4gd2hpY2ggY2FzZSBkZXZjaGFuZ2Ugd2lsbCBiZSBmYWxzZSwgYW5kCisgKiBubyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2hhbmdlIHdpbGwgYmUgY29udGFpbmVkIGluIHRoZSBldmVudDsKKyAqIHRoZSBjbGllbnQgc2hvdWxkIHVzZSBYTGlzdElucHV0RGV2aWNlcygpIHRvIGxlYXJuIHdoYXQgaGFzIGNoYW5nZWQuCisgKgorICogSWYgZGV2Y2hhbmdlIGlzIHRydWUsIGFuIGF0dHJpYnV0ZSB0aGF0IHRoZSBzZXJ2ZXIgYmVsaWV2ZXMgaXMKKyAqIGltcG9ydGFudCBoYXMgY2hhbmdlZCBvbiBhIGRldmljZSwgYW5kIHRoZSBjbGllbnQgc2hvdWxkIHVzZQorICogWEdldERldmljZUNvbnRyb2wgdG8gZXhhbWluZSB0aGUgZGV2aWNlLiAgSWYgY29udHJvbCBpcyBub24temVybywKKyAqIHRoZW4gdGhhdCBjb250cm9sIGhhcyBjaGFuZ2VkIG1lYW5pbmdmdWxseS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICB0eXBlOworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOyAgICAgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCAgICAgICAgICBzZW5kX2V2ZW50OyAgIC8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgICAgICAgKmRpc3BsYXk7ICAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgV2luZG93ICAgICAgICB3aW5kb3c7ICAgICAgIC8qIHVudXNlZCAqLworICAgIFRpbWUgICAgICAgICAgdGltZTsKKyAgICBCb29sICAgICAgICAgIGRldmNoYW5nZTsKKyAgICBYSUQgICAgICAgICAgIGRldmljZWlkOworICAgIFhJRCAgICAgICAgICAgY29udHJvbDsKK30gWERldmljZVByZXNlbmNlTm90aWZ5RXZlbnQ7CisKKy8qCisgKiBOb3RpZmllcyB0aGUgY2xpZW50IHRoYXQgYSBwcm9wZXJ0eSBvbiBhIGRldmljZSBoYXMgY2hhbmdlZCB2YWx1ZS4gVGhlCisgKiBjbGllbnQgaXMgZXhwZWN0ZWQgdG8gcXVlcnkgdGhlIHNlcnZlciBmb3IgdXBkYXRlZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgIHR5cGU7CisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7ICAgICAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sICAgICAgICAgIHNlbmRfZXZlbnQ7ICAgLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAgICAgICAqZGlzcGxheTsgICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBXaW5kb3cgICAgICAgIHdpbmRvdzsgICAgICAgLyogdW51c2VkICovCisgICAgVGltZSAgICAgICAgICB0aW1lOworICAgIFhJRCAgICAgICAgICAgZGV2aWNlaWQ7ICAgICAvKiBpZCBvZiB0aGUgZGV2aWNlIHRoYXQgY2hhbmdlZCAqLworICAgIEF0b20gICAgICAgICAgYXRvbTsgICAgICAgICAvKiB0aGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkICovCisgICAgaW50ICAgICAgICAgICBzdGF0ZTsgICAgICAgIC8qIFByb3BlcnR5TmV3VmFsdWUgb3IgUHJvcGVydHlEZWxldGVkICovCit9IFhEZXZpY2VQcm9wZXJ0eU5vdGlmeUV2ZW50OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29udHJvbCBzdHJ1Y3R1cmVzIGZvciBpbnB1dCBkZXZpY2VzIHRoYXQgc3VwcG9ydCBpbnB1dCBjbGFzcworICogRmVlZGJhY2suICBUaGVzZSBhcmUgdXNlZCBieSB0aGUgWEdldEZlZWRiYWNrQ29udHJvbCBhbmQgCisgKiBYQ2hhbmdlRmVlZGJhY2tDb250cm9sIGZ1bmN0aW9ucy4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICAgWElEICAgICAgICAgICAgY19jbGFzczsKKyNlbHNlCisgICAgIFhJRCAgICAgICAgICAgIGNsYXNzOworI2VuZGlmCisgICAgIGludCAgICAgICAgICAgIGxlbmd0aDsKKyAgICAgWElEICAgICAgICAgICAgaWQ7Cit9IFhGZWVkYmFja1N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIFhJRCAgICAgY19jbGFzczsKKyNlbHNlCisgICAgWElEICAgICBjbGFzczsKKyNlbmRpZgorICAgIGludCAgICAgbGVuZ3RoOworICAgIFhJRCAgICAgaWQ7CisgICAgaW50ICAgICBjbGljazsKKyAgICBpbnQgICAgIHBlcmNlbnQ7CisgICAgaW50ICAgICBwaXRjaDsKKyAgICBpbnQgICAgIGR1cmF0aW9uOworICAgIGludCAgICAgbGVkX21hc2s7CisgICAgaW50ICAgICBnbG9iYWxfYXV0b19yZXBlYXQ7CisgICAgY2hhciAgICBhdXRvX3JlcGVhdHNbMzJdOworfSBYS2JkRmVlZGJhY2tTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBYSUQgICAgIGNfY2xhc3M7CisjZWxzZQorICAgIFhJRCAgICAgY2xhc3M7CisjZW5kaWYKKyAgICBpbnQgICAgIGxlbmd0aDsKKyAgICBYSUQgICAgIGlkOworICAgIGludCAgICAgYWNjZWxOdW07CisgICAgaW50ICAgICBhY2NlbERlbm9tOworICAgIGludCAgICAgdGhyZXNob2xkOworfSBYUHRyRmVlZGJhY2tTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBYSUQgICAgIGNfY2xhc3M7CisjZWxzZQorICAgIFhJRCAgICAgY2xhc3M7CisjZW5kaWYKKyAgICBpbnQgICAgIGxlbmd0aDsKKyAgICBYSUQgICAgIGlkOworICAgIGludCAgICAgcmVzb2x1dGlvbjsKKyAgICBpbnQgICAgIG1pblZhbDsKKyAgICBpbnQgICAgIG1heFZhbDsKK30gWEludGVnZXJGZWVkYmFja1N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIFhJRCAgICAgY19jbGFzczsKKyNlbHNlCisgICAgWElEICAgICBjbGFzczsKKyNlbmRpZgorICAgIGludCAgICAgbGVuZ3RoOworICAgIFhJRCAgICAgaWQ7CisgICAgaW50ICAgICBtYXhfc3ltYm9sczsKKyAgICBpbnQgICAgIG51bV9zeW1zX3N1cHBvcnRlZDsKKyAgICBLZXlTeW0gICpzeW1zX3N1cHBvcnRlZDsKK30gWFN0cmluZ0ZlZWRiYWNrU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgWElEICAgICBjX2NsYXNzOworI2Vsc2UKKyAgICBYSUQgICAgIGNsYXNzOworI2VuZGlmCisgICAgaW50ICAgICBsZW5ndGg7CisgICAgWElEICAgICBpZDsKKyAgICBpbnQgICAgIHBlcmNlbnQ7CisgICAgaW50ICAgICBwaXRjaDsKKyAgICBpbnQgICAgIGR1cmF0aW9uOworfSBYQmVsbEZlZWRiYWNrU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgWElEICAgICBjX2NsYXNzOworI2Vsc2UKKyAgICBYSUQgICAgIGNsYXNzOworI2VuZGlmCisgICAgaW50ICAgICBsZW5ndGg7CisgICAgWElEICAgICBpZDsKKyAgICBpbnQgICAgIGxlZF92YWx1ZXM7CisgICAgaW50ICAgICBsZWRfbWFzazsKK30gWExlZEZlZWRiYWNrU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgIFhJRCAgICAgICAgICAgIGNfY2xhc3M7CisjZWxzZQorICAgICBYSUQgICAgICAgICAgICBjbGFzczsKKyNlbmRpZgorICAgICBpbnQgICAgICAgICAgICBsZW5ndGg7CisgICAgIFhJRAkgICAgaWQ7Cit9IFhGZWVkYmFja0NvbnRyb2w7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgWElEICAgICBjX2NsYXNzOworI2Vsc2UKKyAgICBYSUQgICAgIGNsYXNzOworI2VuZGlmCisgICAgaW50ICAgICBsZW5ndGg7CisgICAgWElEICAgICBpZDsKKyAgICBpbnQgICAgIGFjY2VsTnVtOworICAgIGludCAgICAgYWNjZWxEZW5vbTsKKyAgICBpbnQgICAgIHRocmVzaG9sZDsKK30gWFB0ckZlZWRiYWNrQ29udHJvbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBYSUQgICAgIGNfY2xhc3M7CisjZWxzZQorICAgIFhJRCAgICAgY2xhc3M7CisjZW5kaWYKKyAgICBpbnQgICAgIGxlbmd0aDsKKyAgICBYSUQgICAgIGlkOworICAgIGludCAgICAgY2xpY2s7CisgICAgaW50ICAgICBwZXJjZW50OworICAgIGludCAgICAgcGl0Y2g7CisgICAgaW50ICAgICBkdXJhdGlvbjsKKyAgICBpbnQgICAgIGxlZF9tYXNrOworICAgIGludCAgICAgbGVkX3ZhbHVlOworICAgIGludCAgICAga2V5OworICAgIGludCAgICAgYXV0b19yZXBlYXRfbW9kZTsKK30gWEtiZEZlZWRiYWNrQ29udHJvbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBYSUQgICAgIGNfY2xhc3M7CisjZWxzZQorICAgIFhJRCAgICAgY2xhc3M7CisjZW5kaWYKKyAgICBpbnQgICAgIGxlbmd0aDsKKyAgICBYSUQgICAgIGlkOworICAgIGludCAgICAgbnVtX2tleXN5bXM7CisgICAgS2V5U3ltICAqc3ltc190b19kaXNwbGF5OworfSBYU3RyaW5nRmVlZGJhY2tDb250cm9sOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIFhJRCAgICAgY19jbGFzczsKKyNlbHNlCisgICAgWElEICAgICBjbGFzczsKKyNlbmRpZgorICAgIGludCAgICAgbGVuZ3RoOworICAgIFhJRCAgICAgaWQ7CisgICAgaW50ICAgICBpbnRfdG9fZGlzcGxheTsKK30gWEludGVnZXJGZWVkYmFja0NvbnRyb2w7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgWElEICAgICBjX2NsYXNzOworI2Vsc2UKKyAgICBYSUQgICAgIGNsYXNzOworI2VuZGlmCisgICAgaW50ICAgICBsZW5ndGg7CisgICAgWElEICAgICBpZDsKKyAgICBpbnQgICAgIHBlcmNlbnQ7CisgICAgaW50ICAgICBwaXRjaDsKKyAgICBpbnQgICAgIGR1cmF0aW9uOworfSBYQmVsbEZlZWRiYWNrQ29udHJvbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBYSUQgICAgIGNfY2xhc3M7CisjZWxzZQorICAgIFhJRCAgICAgY2xhc3M7CisjZW5kaWYKKyAgICBpbnQgICAgIGxlbmd0aDsKKyAgICBYSUQgICAgIGlkOworICAgIGludCAgICAgbGVkX21hc2s7CisgICAgaW50ICAgICBsZWRfdmFsdWVzOworfSBYTGVkRmVlZGJhY2tDb250cm9sOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERldmljZSBjb250cm9sIHN0cnVjdHVyZXMuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgWElEICAgICAgICAgICAgY29udHJvbDsKKyAgICAgaW50ICAgICAgICAgICAgbGVuZ3RoOworfSBYRGV2aWNlQ29udHJvbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICBYSUQgICAgICAgICAgICBjb250cm9sOworICAgICBpbnQgICAgICAgICAgICBsZW5ndGg7CisgICAgIGludCAgICAgICAgICAgIGZpcnN0X3ZhbHVhdG9yOworICAgICBpbnQgICAgICAgICAgICBudW1fdmFsdWF0b3JzOworICAgICBpbnQgICAgICAgICAgICAqcmVzb2x1dGlvbnM7Cit9IFhEZXZpY2VSZXNvbHV0aW9uQ29udHJvbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICBYSUQgICAgICAgICAgICBjb250cm9sOworICAgICBpbnQgICAgICAgICAgICBsZW5ndGg7CisgICAgIGludCAgICAgICAgICAgIG51bV92YWx1YXRvcnM7CisgICAgIGludCAgICAgICAgICAgICpyZXNvbHV0aW9uczsKKyAgICAgaW50ICAgICAgICAgICAgKm1pbl9yZXNvbHV0aW9uczsKKyAgICAgaW50ICAgICAgICAgICAgKm1heF9yZXNvbHV0aW9uczsKK30gWERldmljZVJlc29sdXRpb25TdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhJRCAgICAgICAgICAgICBjb250cm9sOworICAgIGludCAgICAgICAgICAgICBsZW5ndGg7CisgICAgaW50ICAgICAgICAgICAgIG1pbl94OworICAgIGludCAgICAgICAgICAgICBtYXhfeDsKKyAgICBpbnQgICAgICAgICAgICAgbWluX3k7CisgICAgaW50ICAgICAgICAgICAgIG1heF95OworICAgIGludCAgICAgICAgICAgICBmbGlwX3g7CisgICAgaW50ICAgICAgICAgICAgIGZsaXBfeTsKKyAgICBpbnQgICAgICAgICAgICAgcm90YXRpb247CisgICAgaW50ICAgICAgICAgICAgIGJ1dHRvbl90aHJlc2hvbGQ7Cit9IFhEZXZpY2VBYnNDYWxpYkNvbnRyb2wsIFhEZXZpY2VBYnNDYWxpYlN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWElEICAgICAgICAgICAgIGNvbnRyb2w7CisgICAgaW50ICAgICAgICAgICAgIGxlbmd0aDsKKyAgICBpbnQgICAgICAgICAgICAgb2Zmc2V0X3g7CisgICAgaW50ICAgICAgICAgICAgIG9mZnNldF95OworICAgIGludCAgICAgICAgICAgICB3aWR0aDsKKyAgICBpbnQgICAgICAgICAgICAgaGVpZ2h0OworICAgIGludCAgICAgICAgICAgICBzY3JlZW47CisgICAgWElEICAgICAgICAgICAgIGZvbGxvd2luZzsKK30gWERldmljZUFic0FyZWFDb250cm9sLCBYRGV2aWNlQWJzQXJlYVN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWElEICAgICAgICAgICAgIGNvbnRyb2w7CisgICAgaW50ICAgICAgICAgICAgIGxlbmd0aDsKKyAgICBpbnQgICAgICAgICAgICAgc3RhdHVzOworfSBYRGV2aWNlQ29yZUNvbnRyb2w7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYSUQgICAgICAgICAgICAgY29udHJvbDsKKyAgICBpbnQgICAgICAgICAgICAgbGVuZ3RoOworICAgIGludCAgICAgICAgICAgICBzdGF0dXM7CisgICAgaW50ICAgICAgICAgICAgIGlzY29yZTsKK30gWERldmljZUNvcmVTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhJRCAgICAgICAgICAgICBjb250cm9sOworICAgIGludCAgICAgICAgICAgICBsZW5ndGg7CisgICAgaW50ICAgICAgICAgICAgIGVuYWJsZTsKK30gWERldmljZUVuYWJsZUNvbnRyb2wsIFhEZXZpY2VFbmFibGVTdGF0ZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBBbiBhcnJheSBvZiBYRGV2aWNlTGlzdCBzdHJ1Y3R1cmVzIGlzIHJldHVybmVkIGJ5IHRoZSAKKyAqIFhMaXN0SW5wdXREZXZpY2VzIGZ1bmN0aW9uLiAgRWFjaCBlbnRyeSBjb250YWlucyBpbmZvcm1hdGlvbgorICogYWJvdXQgb25lIGlucHV0IGRldmljZS4gIEFtb25nIHRoYXQgaW5mb3JtYXRpb24gaXMgYW4gYXJyYXkgb2YgCisgKiBwb2ludGVycyB0byBzdHJ1Y3R1cmVzIHRoYXQgZGVzY3JpYmUgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiAKKyAqIHRoZSBpbnB1dCBkZXZpY2UuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IF9YQW55Q2xhc3NpbmZvIHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgWElEIAljX2NsYXNzOworI2Vsc2UKKyAgICBYSUQgCWNsYXNzOworI2VuZGlmCisgICAgaW50IAlsZW5ndGg7CisgICAgfSBYQW55Q2xhc3NJbmZvOworCit0eXBlZGVmIHN0cnVjdCBfWERldmljZUluZm8gKlhEZXZpY2VJbmZvUHRyOworCit0eXBlZGVmIHN0cnVjdCBfWERldmljZUluZm8KKyAgICB7CisgICAgWElEICAgICAgICAgICAgICAgICBpZDsgICAgICAgIAorICAgIEF0b20gICAgICAgICAgICAgICAgdHlwZTsKKyAgICBjaGFyICAgICAgICAgICAgICAgICpuYW1lOworICAgIGludCAgICAgICAgICAgICAgICAgbnVtX2NsYXNzZXM7CisgICAgaW50ICAgICAgICAgICAgICAgICB1c2U7CisgICAgWEFueUNsYXNzUHRyIAlpbnB1dGNsYXNzaW5mbzsKKyAgICB9IFhEZXZpY2VJbmZvOworCit0eXBlZGVmIHN0cnVjdCBfWEtleUluZm8gKlhLZXlJbmZvUHRyOworCit0eXBlZGVmIHN0cnVjdCBfWEtleUluZm8KKyAgICB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIFhJRAkJCWNfY2xhc3M7CisjZWxzZQorICAgIFhJRAkJCWNsYXNzOworI2VuZGlmCisgICAgaW50CQkJbGVuZ3RoOworICAgIHVuc2lnbmVkIHNob3J0ICAgICAgbWluX2tleWNvZGU7CisgICAgdW5zaWduZWQgc2hvcnQgICAgICBtYXhfa2V5Y29kZTsKKyAgICB1bnNpZ25lZCBzaG9ydCAgICAgIG51bV9rZXlzOworICAgIH0gWEtleUluZm87CisKK3R5cGVkZWYgc3RydWN0IF9YQnV0dG9uSW5mbyAqWEJ1dHRvbkluZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0IF9YQnV0dG9uSW5mbyB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIFhJRAkJY19jbGFzczsKKyNlbHNlCisgICAgWElECQljbGFzczsKKyNlbmRpZgorICAgIGludAkJbGVuZ3RoOworICAgIHNob3J0IAludW1fYnV0dG9uczsKKyAgICB9IFhCdXR0b25JbmZvOworCit0eXBlZGVmIHN0cnVjdCBfWEF4aXNJbmZvICpYQXhpc0luZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0IF9YQXhpc0luZm8geworICAgIGludCAJcmVzb2x1dGlvbjsKKyAgICBpbnQgCW1pbl92YWx1ZTsKKyAgICBpbnQgCW1heF92YWx1ZTsKKyAgICB9IFhBeGlzSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgX1hWYWx1YXRvckluZm8gKlhWYWx1YXRvckluZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0CV9YVmFsdWF0b3JJbmZvCisgICAgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBYSUQJCQljX2NsYXNzOworI2Vsc2UKKyAgICBYSUQJCQljbGFzczsKKyNlbmRpZgorICAgIGludAkJCWxlbmd0aDsKKyAgICB1bnNpZ25lZCBjaGFyICAgICAgIG51bV9heGVzOworICAgIHVuc2lnbmVkIGNoYXIgICAgICAgbW9kZTsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgIG1vdGlvbl9idWZmZXI7CisgICAgWEF4aXNJbmZvUHRyICAgICAgICBheGVzOworICAgIH0gWFZhbHVhdG9ySW5mbzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBBbiBYRGV2aWNlIHN0cnVjdHVyZSBpcyByZXR1cm5lZCBieSB0aGUgWE9wZW5EZXZpY2UgZnVuY3Rpb24uICAKKyAqIEl0IGNvbnRhaW5zIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIFhJbnB1dENsYXNzSW5mbyBzdHJ1Y3R1cmVzLgorICogRWFjaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGNsYXNzIG9mIGlucHV0IHN1cHBvcnRlZCBieSB0aGUKKyAqIGRldmljZSwgaW5jbHVkaW5nIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBkYXRhIGZvciBlYWNoIHR5cGUgb2YgZXZlbnQKKyAqIHRoZSBkZXZpY2UgcmVwb3J0cy4KKyAqCisgKi8KKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgICBpbnB1dF9jbGFzczsKKyAgICAgICAgdW5zaWduZWQgY2hhciAgIGV2ZW50X3R5cGVfYmFzZTsKK30gWElucHV0Q2xhc3NJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIFhJRCAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2lkOworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIG51bV9jbGFzc2VzOworICAgICAgICBYSW5wdXRDbGFzc0luZm8gICAgICAgICpjbGFzc2VzOworfSBYRGV2aWNlOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZXR1cm4gaW5mb3JtYXRpb24gZm9yIHRoZSAKKyAqIFhHZXRTZWxlY3RlZEV4dGVuc2lvbkV2ZW50cyBmdW5jdGlvbi4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBYRXZlbnRDbGFzcyAgICAgZXZlbnRfdHlwZTsKKyAgICAgICAgWElEICAgICAgICAgICAgIGRldmljZTsKK30gWEV2ZW50TGlzdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJldHVybiBtb3Rpb24gaGlzdG9yeSBkYXRhIGZyb20gCisgKiBhbiBpbnB1dCBkZXZpY2UgdGhhdCBzdXBwb3J0cyB0aGUgaW5wdXQgY2xhc3MgVmFsdWF0b3JzLgorICogVGhpcyBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBieSB0aGUgWEdldERldmljZU1vdGlvbkV2ZW50cyBmdW5jdGlvbi4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBUaW1lICAgdGltZTsKKyAgICAgICAgaW50ICAgICpkYXRhOworfSBYRGV2aWNlVGltZUNvb3JkOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGV2aWNlIHN0YXRlIHN0cnVjdHVyZS4KKyAqIFRoaXMgaXMgcmV0dXJuZWQgYnkgdGhlIFhRdWVyeURldmljZVN0YXRlIHJlcXVlc3QuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgWElECQlkZXZpY2VfaWQ7CisgICAgICAgIGludAkJbnVtX2NsYXNzZXM7CisgICAgICAgIFhJbnB1dENsYXNzCSpkYXRhOworfSBYRGV2aWNlU3RhdGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTm90ZSB0aGF0IHRoZSBtb2RlIGZpZWxkIGlzIGEgYml0ZmllbGQgdGhhdCByZXBvcnRzIHRoZSBQcm94aW1pdHkKKyAqIHN0YXR1cyBvZiB0aGUgZGV2aWNlIGFzIHdlbGwgYXMgdGhlIG1vZGUuICBUaGUgbW9kZSBmaWVsZCBzaG91bGQKKyAqIGJlIE9SJ2Qgd2l0aCB0aGUgbWFzayBEZXZpY2VNb2RlIGFuZCBjb21wYXJlZCB3aXRoIHRoZSB2YWx1ZXMKKyAqIEFic29sdXRlIGFuZCBSZWxhdGl2ZSB0byBkZXRlcm1pbmUgdGhlIG1vZGUsIGFuZCBzaG91bGQgYmUgT1InZAorICogd2l0aCB0aGUgbWFzayBQcm94aW1pdHlTdGF0ZSBhbmQgY29tcGFyZWQgd2l0aCB0aGUgdmFsdWVzIEluUHJveGltaXR5CisgKiBhbmQgT3V0T2ZQcm94aW1pdHkgdG8gZGV0ZXJtaW5lIHRoZSBwcm94aW1pdHkgc3RhdGUuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgdW5zaWduZWQgY2hhcgljX2NsYXNzOworI2Vsc2UKKyAgICB1bnNpZ25lZCBjaGFyCWNsYXNzOworI2VuZGlmCisgICAgdW5zaWduZWQgY2hhcglsZW5ndGg7CisgICAgdW5zaWduZWQgY2hhcgludW1fdmFsdWF0b3JzOworICAgIHVuc2lnbmVkIGNoYXIJbW9kZTsKKyAgICBpbnQgICAgICAgIAkJKnZhbHVhdG9yczsKK30gWFZhbHVhdG9yU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgdW5zaWduZWQgY2hhcgljX2NsYXNzOworI2Vsc2UKKyAgICB1bnNpZ25lZCBjaGFyCWNsYXNzOworI2VuZGlmCisgICAgdW5zaWduZWQgY2hhcglsZW5ndGg7CisgICAgc2hvcnQJCW51bV9rZXlzOworICAgIGNoYXIgICAgICAgIAlrZXlzWzMyXTsKK30gWEtleVN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIHVuc2lnbmVkIGNoYXIJY19jbGFzczsKKyNlbHNlCisgICAgdW5zaWduZWQgY2hhcgljbGFzczsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGNoYXIJbGVuZ3RoOworICAgIHNob3J0CQludW1fYnV0dG9uczsKKyAgICBjaGFyICAgICAgICAJYnV0dG9uc1szMl07Cit9IFhCdXR0b25TdGF0ZTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRnVuY3Rpb24gZGVmaW5pdGlvbnMuCisgKgorICovCisKK19YRlVOQ1BST1RPQkVHSU4KKworZXh0ZXJuIGludAlYQ2hhbmdlS2V5Ym9hcmREZXZpY2UoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLworKTsKKworZXh0ZXJuIGludAlYQ2hhbmdlUG9pbnRlckRldmljZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorICAgIGludAkJCS8qIHhheGlzICovLAorICAgIGludAkJCS8qIHlheGlzICovCispOworCitleHRlcm4gaW50CVhHcmFiRGV2aWNlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgV2luZG93CQkvKiBncmFiX3dpbmRvdyAqLywKKyAgICBCb29sCQkvKiBvd25lckV2ZW50cyAqLywKKyAgICBpbnQJCQkvKiBldmVudCBjb3VudCAqLywKKyAgICBYRXZlbnRDbGFzcyoJLyogZXZlbnRfbGlzdCAqLywKKyAgICBpbnQJCQkvKiB0aGlzX2RldmljZV9tb2RlICovLAorICAgIGludAkJCS8qIG90aGVyX2RldmljZXNfbW9kZSAqLywKKyAgICBUaW1lCQkvKiB0aW1lICovCispOworCitleHRlcm4gaW50CVhVbmdyYWJEZXZpY2UoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLywKKyAgICBUaW1lIAkJLyogdGltZSAqLworKTsKKworZXh0ZXJuIGludAlYR3JhYkRldmljZUtleSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorICAgIHVuc2lnbmVkIGludAkvKiBrZXkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG1vZGlmaWVycyAqLywKKyAgICBYRGV2aWNlKgkJLyogbW9kaWZpZXJfZGV2aWNlICovLAorICAgIFdpbmRvdwkJLyogZ3JhYl93aW5kb3cgKi8sCisgICAgQm9vbAkJLyogb3duZXJfZXZlbnRzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBldmVudF9jb3VudCAqLywKKyAgICBYRXZlbnRDbGFzcyoJLyogZXZlbnRfbGlzdCAqLywKKyAgICBpbnQJCQkvKiB0aGlzX2RldmljZV9tb2RlICovLAorICAgIGludAkJCS8qIG90aGVyX2RldmljZXNfbW9kZSAqLworKTsKKworZXh0ZXJuIGludAlYVW5ncmFiRGV2aWNlS2V5KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGtleSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbW9kaWZpZXJzICovLAorICAgIFhEZXZpY2UqCQkvKiBtb2RpZmllcl9kZXYgKi8sCisgICAgV2luZG93CQkvKiBncmFiX3dpbmRvdyAqLworKTsKKworZXh0ZXJuIGludAlYR3JhYkRldmljZUJ1dHRvbigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorICAgIHVuc2lnbmVkIGludAkvKiBidXR0b24gKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG1vZGlmaWVycyAqLywKKyAgICBYRGV2aWNlKgkJLyogbW9kaWZpZXJfZGV2aWNlICovLAorICAgIFdpbmRvdwkJLyogZ3JhYl93aW5kb3cgKi8sCisgICAgQm9vbAkJLyogb3duZXJfZXZlbnRzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBldmVudF9jb3VudCAqLywKKyAgICBYRXZlbnRDbGFzcyoJLyogZXZlbnRfbGlzdCAqLywKKyAgICBpbnQJCQkvKiB0aGlzX2RldmljZV9tb2RlICovLAorICAgIGludAkJCS8qIG90aGVyX2RldmljZXNfbW9kZSAqLworKTsKKworZXh0ZXJuIGludAlYVW5ncmFiRGV2aWNlQnV0dG9uKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGJ1dHRvbiAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbW9kaWZpZXJzICovLAorICAgIFhEZXZpY2UqCQkvKiBtb2RpZmllcl9kZXYgKi8sCisgICAgV2luZG93CQkvKiBncmFiX3dpbmRvdyAqLworKTsKKworZXh0ZXJuIGludAlYQWxsb3dEZXZpY2VFdmVudHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLywKKyAgICBpbnQJCQkvKiBldmVudF9tb2RlICovLAorICAgIFRpbWUJCS8qIHRpbWUgKi8KKyk7CisKK2V4dGVybiBpbnQJWEdldERldmljZUZvY3VzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgV2luZG93KgkJLyogZm9jdXMgKi8sCisgICAgaW50KgkJLyogcmV2ZXJ0X3RvICovLAorICAgIFRpbWUqCQkvKiB0aW1lICovCispOworCitleHRlcm4gaW50CVhTZXREZXZpY2VGb2N1cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorICAgIFdpbmRvdwkJLyogZm9jdXMgKi8sCisgICAgaW50CQkJLyogcmV2ZXJ0X3RvICovLAorICAgIFRpbWUJCS8qIHRpbWUgKi8KKyk7CisKK2V4dGVybiBYRmVlZGJhY2tTdGF0ZQkqWEdldEZlZWRiYWNrQ29udHJvbCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorICAgIGludCoJCS8qIG51bV9mZWVkYmFja3MgKi8KKyk7CisKK2V4dGVybiB2b2lkCVhGcmVlRmVlZGJhY2tMaXN0KAorICAgIFhGZWVkYmFja1N0YXRlKgkvKiBsaXN0ICovCispOworCitleHRlcm4gaW50CVhDaGFuZ2VGZWVkYmFja0NvbnRyb2woCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIG1hc2sgKi8sCisgICAgWEZlZWRiYWNrQ29udHJvbCoJLyogZiAqLworKTsKKworZXh0ZXJuIGludAlYRGV2aWNlQmVsbCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorICAgIFhJRAkJCS8qIGZlZWRiYWNrY2xhc3MgKi8sCisgICAgWElECQkJLyogZmVlZGJhY2tpZCAqLywKKyAgICBpbnQJCQkvKiBwZXJjZW50ICovCispOworCitleHRlcm4gS2V5U3ltCSpYR2V0RGV2aWNlS2V5TWFwcGluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorI2lmIE5lZWRXaWRlUHJvdG90eXBlcworICAgIHVuc2lnbmVkIGludAkvKiBmaXJzdCAqLywKKyNlbHNlCisgICAgS2V5Q29kZQkJLyogZmlyc3QgKi8sCisjZW5kaWYKKyAgICBpbnQJCQkvKiBrZXljb3VudCAqLywKKyAgICBpbnQqCQkvKiBzeW1zX3Blcl9jb2RlICovCispOworCitleHRlcm4gaW50CVhDaGFuZ2VEZXZpY2VLZXlNYXBwaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgaW50CQkJLyogZmlyc3QgKi8sCisgICAgaW50CQkJLyogc3ltc19wZXJfY29kZSAqLywKKyAgICBLZXlTeW0qCQkvKiBrZXlzeW1zICovLAorICAgIGludAkJCS8qIGNvdW50ICovCispOworCitleHRlcm4gWE1vZGlmaWVyS2V5bWFwCSpYR2V0RGV2aWNlTW9kaWZpZXJNYXBwaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8KKyk7CisKK2V4dGVybiBpbnQJWFNldERldmljZU1vZGlmaWVyTWFwcGluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorICAgIFhNb2RpZmllcktleW1hcCoJLyogbW9kbWFwICovCispOworCitleHRlcm4gaW50CVhTZXREZXZpY2VCdXR0b25NYXBwaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgdW5zaWduZWQgY2hhcioJLyogbWFwW10gKi8sCisgICAgaW50CQkJLyogbm1hcCAqLworKTsKKworZXh0ZXJuIGludAlYR2V0RGV2aWNlQnV0dG9uTWFwcGluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorICAgIHVuc2lnbmVkIGNoYXIqCS8qIG1hcFtdICovLAorICAgIHVuc2lnbmVkIGludAkvKiBubWFwICovCispOworCitleHRlcm4gWERldmljZVN0YXRlCSpYUXVlcnlEZXZpY2VTdGF0ZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovCispOworCitleHRlcm4gdm9pZAlYRnJlZURldmljZVN0YXRlKAorICAgIFhEZXZpY2VTdGF0ZSoJLyogbGlzdCAqLworKTsKKworZXh0ZXJuIFhFeHRlbnNpb25WZXJzaW9uCSpYR2V0RXh0ZW5zaW9uVmVyc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIG5hbWUgKi8KKyk7CisKK2V4dGVybiBYRGV2aWNlSW5mbwkqWExpc3RJbnB1dERldmljZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50KgkJLyogbmRldmljZXMgKi8KKyk7CisKK2V4dGVybiB2b2lkCVhGcmVlRGV2aWNlTGlzdCgKKyAgICBYRGV2aWNlSW5mbyoJLyogbGlzdCAqLworKTsKKworZXh0ZXJuIFhEZXZpY2UJKlhPcGVuRGV2aWNlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhJRAkJCS8qIGlkICovCispOworCitleHRlcm4gaW50CVhDbG9zZURldmljZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovCispOworCitleHRlcm4gaW50CVhTZXREZXZpY2VNb2RlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgaW50CQkJLyogbW9kZSAqLworKTsKKworZXh0ZXJuIGludAlYU2V0RGV2aWNlVmFsdWF0b3JzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgaW50KgkJLyogdmFsdWF0b3JzICovLAorICAgIGludAkJCS8qIGZpcnN0X3ZhbHVhdG9yICovLAorICAgIGludAkJCS8qIG51bV92YWx1YXRvcnMgKi8KKyk7CisKK2V4dGVybiBYRGV2aWNlQ29udHJvbAkqWEdldERldmljZUNvbnRyb2woCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLywKKyAgICBpbnQJCQkvKiBjb250cm9sICovCispOworCitleHRlcm4gaW50CVhDaGFuZ2VEZXZpY2VDb250cm9sKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgaW50CQkJLyogY29udHJvbCAqLywKKyAgICBYRGV2aWNlQ29udHJvbCoJLyogZCAqLworKTsKKworZXh0ZXJuIGludAlYU2VsZWN0RXh0ZW5zaW9uRXZlbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhFdmVudENsYXNzKgkvKiBldmVudF9saXN0ICovLAorICAgIGludAkJCS8qIGNvdW50ICovCispOworCitleHRlcm4gaW50IFhHZXRTZWxlY3RlZEV4dGVuc2lvbkV2ZW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgaW50KgkJLyogdGhpc19jbGllbnRfY291bnQgKi8sCisgICAgWEV2ZW50Q2xhc3MqKgkvKiB0aGlzX2NsaWVudF9saXN0ICovLAorICAgIGludCoJCS8qIGFsbF9jbGllbnRzX2NvdW50ICovLAorICAgIFhFdmVudENsYXNzKioJLyogYWxsX2NsaWVudHNfbGlzdCAqLworKTsKKworZXh0ZXJuIGludAlYQ2hhbmdlRGV2aWNlRG9udFByb3BhZ2F0ZUxpc3QoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3aW5kb3cgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgWEV2ZW50Q2xhc3MqCS8qIGV2ZW50cyAqLywKKyAgICBpbnQJCQkvKiBtb2RlICovCispOworCitleHRlcm4gWEV2ZW50Q2xhc3MJKlhHZXREZXZpY2VEb250UHJvcGFnYXRlTGlzdCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHdpbmRvdyAqLywKKyAgICBpbnQqCQkvKiBjb3VudCAqLworKTsKKworZXh0ZXJuIFN0YXR1cwlYU2VuZEV4dGVuc2lvbkV2ZW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgV2luZG93CQkvKiBkZXN0ICovLAorICAgIEJvb2wJCS8qIHByb3AgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgWEV2ZW50Q2xhc3MqCS8qIGxpc3QgKi8sCisgICAgWEV2ZW50KgkJLyogZXZlbnQgKi8KKyk7CisKK2V4dGVybiBYRGV2aWNlVGltZUNvb3JkCSpYR2V0RGV2aWNlTW90aW9uRXZlbnRzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgVGltZQkJLyogc3RhcnQgKi8sCisgICAgVGltZQkJLyogc3RvcCAqLywKKyAgICBpbnQqCQkvKiBuRXZlbnRzICovLAorICAgIGludCoJCS8qIG1vZGUgKi8sCisgICAgaW50KgkJLyogYXhpc19jb3VudCAqLworKTsKKworZXh0ZXJuIHZvaWQJWEZyZWVEZXZpY2VNb3Rpb25FdmVudHMoCisgICAgWERldmljZVRpbWVDb29yZCoJLyogZXZlbnRzICovCispOworCitleHRlcm4gdm9pZAlYRnJlZURldmljZUNvbnRyb2woCisgICAgWERldmljZUNvbnRyb2wqCS8qIGNvbnRyb2wgKi8KKyk7CisKK2V4dGVybiBBdG9tKiAgIFhMaXN0RGV2aWNlUHJvcGVydGllcygKKyAgICBEaXNwbGF5KiAgICAgICAgICAgIC8qIGRweSAqLywKKyAgICBYRGV2aWNlKiAgICAgICAgICAgIC8qIGRldiAqLywKKyAgICBpbnQqICAgICAgICAgICAgICAgIC8qIG5wcm9wc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiB2b2lkIFhDaGFuZ2VEZXZpY2VQcm9wZXJ0eSgKKyAgICBEaXNwbGF5KiAgICAgICAgICAgIC8qIGRweSAqLywKKyAgICBYRGV2aWNlKiAgICAgICAgICAgIC8qIGRldiAqLywKKyAgICBBdG9tICAgICAgICAgICAgICAgIC8qIHByb3BlcnR5ICovLAorICAgIEF0b20gICAgICAgICAgICAgICAgLyogdHlwZSAqLywKKyAgICBpbnQgICAgICAgICAgICAgICAgIC8qIGZvcm1hdCAqLywKKyAgICBpbnQgICAgICAgICAgICAgICAgIC8qIG1vZGUgKi8sCisgICAgX1hjb25zdCB1bnNpZ25lZCBjaGFyICogLypkYXRhICovLAorICAgIGludCAgICAgICAgICAgICAgICAgLyogbmVsZW1lbnRzICovCispOworCitleHRlcm4gdm9pZAorWERlbGV0ZURldmljZVByb3BlcnR5KAorICAgIERpc3BsYXkqICAgICAgICAgICAgLyogZHB5ICovLAorICAgIFhEZXZpY2UqICAgICAgICAgICAgLyogZGV2ICovLAorICAgIEF0b20gICAgICAgICAgICAgICAgLyogcHJvcGVydHkgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMKK1hHZXREZXZpY2VQcm9wZXJ0eSgKKyAgICAgRGlzcGxheSogICAgICAgICAgIC8qIGRweSovLAorICAgICBYRGV2aWNlKiAgICAgICAgICAgLyogZGV2Ki8sCisgICAgIEF0b20gICAgICAgICAgICAgICAvKiBwcm9wZXJ0eSovLAorICAgICBsb25nICAgICAgICAgICAgICAgLyogb2Zmc2V0Ki8sCisgICAgIGxvbmcgICAgICAgICAgICAgICAvKiBsZW5ndGgqLywKKyAgICAgQm9vbCAgICAgICAgICAgICAgIC8qIGRlbGV0ZSovLAorICAgICBBdG9tICAgICAgICAgICAgICAgLyogcmVxX3R5cGUqLywKKyAgICAgQXRvbSogICAgICAgICAgICAgIC8qIGFjdHVhbF90eXBlKi8sCisgICAgIGludCogICAgICAgICAgICAgICAvKiBhY3R1YWxfZm9ybWF0Ki8sCisgICAgIHVuc2lnbmVkIGxvbmcqICAgICAvKiBuaXRlbXMqLywKKyAgICAgdW5zaWduZWQgbG9uZyogICAgIC8qIGJ5dGVzX2FmdGVyKi8sCisgICAgIHVuc2lnbmVkIGNoYXIqKiAgICAvKiBwcm9wKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZiAvKiBfWElOUFVUX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hJbnB1dDIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWElucHV0Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZGU2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hJbnB1dDIuaApAQCAtMCwwICsxLDYxMCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA5IFJlZCBIYXQsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKy8qIERlZmluaXRpb25zIHVzZWQgYnkgdGhlIGxpYnJhcnkgYW5kIGNsaWVudCAqLworCisjaWZuZGVmIF9YSU5QVVQyX0hfCisjZGVmaW5lIF9YSU5QVVQyX0hfCisKKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hJMi5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hnZS5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgICAgICAgdHlwZTsKKyAgICBjaGFyKiAgICAgICAgICAgICAgIG5hbWU7CisgICAgQm9vbCAgICAgICAgICAgICAgICBzZW5kX2NvcmU7CisgICAgQm9vbCAgICAgICAgICAgICAgICBlbmFibGU7Cit9IFhJQWRkTWFzdGVySW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgICAgICAgdHlwZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGRldmljZWlkOworICAgIGludCAgICAgICAgICAgICAgICAgcmV0dXJuX21vZGU7IC8qIEF0dGFjaFRvTWFzdGVyLCBGbG9hdGluZyAqLworICAgIGludCAgICAgICAgICAgICAgICAgcmV0dXJuX3BvaW50ZXI7CisgICAgaW50ICAgICAgICAgICAgICAgICByZXR1cm5fa2V5Ym9hcmQ7Cit9IFhJUmVtb3ZlTWFzdGVySW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgICAgICAgdHlwZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGRldmljZWlkOworICAgIGludCAgICAgICAgICAgICAgICAgbmV3X21hc3RlcjsKK30gWElBdHRhY2hTbGF2ZUluZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHR5cGU7CisgICAgaW50ICAgICAgICAgICAgICAgICBkZXZpY2VpZDsKK30gWElEZXRhY2hTbGF2ZUluZm87CisKK3R5cGVkZWYgdW5pb24geworICAgIGludCAgICAgICAgICAgICAgICAgICB0eXBlOyAvKiBtdXN0IGJlIGZpcnN0IGVsZW1lbnQgKi8KKyAgICBYSUFkZE1hc3RlckluZm8gICAgICAgYWRkOworICAgIFhJUmVtb3ZlTWFzdGVySW5mbyAgICByZW1vdmU7CisgICAgWElBdHRhY2hTbGF2ZUluZm8gICAgIGF0dGFjaDsKKyAgICBYSURldGFjaFNsYXZlSW5mbyAgICAgZGV0YWNoOworfSBYSUFueUhpZXJhcmNoeUNoYW5nZUluZm87CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50ICAgIGJhc2U7CisgICAgaW50ICAgIGxhdGNoZWQ7CisgICAgaW50ICAgIGxvY2tlZDsKKyAgICBpbnQgICAgZWZmZWN0aXZlOworfSBYSU1vZGlmaWVyU3RhdGU7CisKK3R5cGVkZWYgWElNb2RpZmllclN0YXRlIFhJR3JvdXBTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgbWFza19sZW47CisgICAgdW5zaWduZWQgY2hhciAqbWFzazsKK30gWElCdXR0b25TdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgbWFza19sZW47CisgICAgdW5zaWduZWQgY2hhciAqbWFzazsKKyAgICBkb3VibGUgICAgICAgICp2YWx1ZXM7Cit9IFhJVmFsdWF0b3JTdGF0ZTsKKworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCAgICAgICAgICAgICAgICAgZGV2aWNlaWQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBtYXNrX2xlbjsKKyAgICB1bnNpZ25lZCBjaGFyKiAgICAgIG1hc2s7Cit9IFhJRXZlbnRNYXNrOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCAgICAgICAgIHR5cGU7CisgICAgaW50ICAgICAgICAgc291cmNlaWQ7Cit9IFhJQW55Q2xhc3NJbmZvOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCAgICAgICAgIHR5cGU7CisgICAgaW50ICAgICAgICAgc291cmNlaWQ7CisgICAgaW50ICAgICAgICAgbnVtX2J1dHRvbnM7CisgICAgQXRvbSAgICAgICAgKmxhYmVsczsKKyAgICBYSUJ1dHRvblN0YXRlIHN0YXRlOworfSBYSUJ1dHRvbkNsYXNzSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgICAgICAgICB0eXBlOworICAgIGludCAgICAgICAgIHNvdXJjZWlkOworICAgIGludCAgICAgICAgIG51bV9rZXljb2RlczsKKyAgICBpbnQgICAgICAgICAqa2V5Y29kZXM7Cit9IFhJS2V5Q2xhc3NJbmZvOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCAgICAgICAgIHR5cGU7CisgICAgaW50ICAgICAgICAgc291cmNlaWQ7CisgICAgaW50ICAgICAgICAgbnVtYmVyOworICAgIEF0b20gICAgICAgIGxhYmVsOworICAgIGRvdWJsZSAgICAgIG1pbjsKKyAgICBkb3VibGUgICAgICBtYXg7CisgICAgZG91YmxlICAgICAgdmFsdWU7CisgICAgaW50ICAgICAgICAgcmVzb2x1dGlvbjsKKyAgICBpbnQgICAgICAgICBtb2RlOworfSBYSVZhbHVhdG9yQ2xhc3NJbmZvOworCisvKiBuZXcgaW4gWEkgMi4xICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCAgICAgICAgIHR5cGU7CisgICAgaW50ICAgICAgICAgc291cmNlaWQ7CisgICAgaW50ICAgICAgICAgbnVtYmVyOworICAgIGludCAgICAgICAgIHNjcm9sbF90eXBlOworICAgIGRvdWJsZSAgICAgIGluY3JlbWVudDsKKyAgICBpbnQgICAgICAgICBmbGFnczsKK30gWElTY3JvbGxDbGFzc0luZm87CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50ICAgICAgICAgdHlwZTsKKyAgICBpbnQgICAgICAgICBzb3VyY2VpZDsKKyAgICBpbnQgICAgICAgICBtb2RlOworICAgIGludCAgICAgICAgIG51bV90b3VjaGVzOworfSBYSVRvdWNoQ2xhc3NJbmZvOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCAgICAgICAgICAgICAgICAgZGV2aWNlaWQ7CisgICAgY2hhciAgICAgICAgICAgICAgICAqbmFtZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHVzZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQ7CisgICAgQm9vbCAgICAgICAgICAgICAgICBlbmFibGVkOworICAgIGludCAgICAgICAgICAgICAgICAgbnVtX2NsYXNzZXM7CisgICAgWElBbnlDbGFzc0luZm8gICAgICAqKmNsYXNzZXM7Cit9IFhJRGV2aWNlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1vZGlmaWVyczsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHN0YXR1czsKK30gWElHcmFiTW9kaWZpZXJzOworCisvKioKKyAqIEdlbmVyaWMgWEkyIGV2ZW50LiBBbGwgWEkyIGV2ZW50cyBoYXZlIHRoZSBzYW1lIGhlYWRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgdHlwZTsgICAgICAgICAvKiBHZW5lcmljRXZlbnQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAgICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgICAgICAgICAgc2VuZF9ldmVudDsgICAvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICAgICAgICpkaXNwbGF5OyAgICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIGludCAgICAgICAgICAgZXh0ZW5zaW9uOyAgICAvKiBYSSBleHRlbnNpb24gb2Zmc2V0ICovCisgICAgaW50ICAgICAgICAgICBldnR5cGU7CisgICAgVGltZSAgICAgICAgICB0aW1lOworfSBYSUV2ZW50OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgIGRldmljZWlkOworICAgIGludCAgICAgICAgICAgYXR0YWNobWVudDsKKyAgICBpbnQgICAgICAgICAgIHVzZTsKKyAgICBCb29sICAgICAgICAgIGVuYWJsZWQ7CisgICAgaW50ICAgICAgICAgICBmbGFnczsKK30gWElIaWVyYXJjaHlJbmZvOworCisvKgorICogTm90aWZpZXMgdGhlIGNsaWVudCB0aGF0IHRoZSBkZXZpY2UgaGllcmFyY2h5IGhhcyBiZWVuIGNoYW5nZWQuIFRoZSBjbGllbnQKKyAqIGlzIGV4cGVjdGVkIHRvIHJlLXF1ZXJ5IHRoZSBzZXJ2ZXIgZm9yIHRoZSBkZXZpY2UgaGllcmFyY2h5LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICB0eXBlOyAgICAgICAgIC8qIEdlbmVyaWNFdmVudCAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOyAgICAgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCAgICAgICAgICBzZW5kX2V2ZW50OyAgIC8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgICAgICAgKmRpc3BsYXk7ICAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgaW50ICAgICAgICAgICBleHRlbnNpb247ICAgIC8qIFhJIGV4dGVuc2lvbiBvZmZzZXQgKi8KKyAgICBpbnQgICAgICAgICAgIGV2dHlwZTsgICAgICAgLyogWElfSGllcmFyY2h5Q2hhbmdlZCAqLworICAgIFRpbWUgICAgICAgICAgdGltZTsKKyAgICBpbnQgICAgICAgICAgIGZsYWdzOworICAgIGludCAgICAgICAgICAgbnVtX2luZm87CisgICAgWElIaWVyYXJjaHlJbmZvICppbmZvOworfSBYSUhpZXJhcmNoeUV2ZW50OworCisvKgorICogTm90aWZpZXMgdGhlIGNsaWVudCB0aGF0IHRoZSBjbGFzc2VzIGhhdmUgYmVlbiBjaGFuZ2VkLiBUaGlzIGhhcHBlbnMgd2hlbgorICogdGhlIHNsYXZlIGRldmljZSB0aGF0IHNlbmRzIHRocm91Z2ggdGhlIG1hc3RlciBjaGFuZ2VzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICB0eXBlOyAgICAgICAgIC8qIEdlbmVyaWNFdmVudCAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOyAgICAgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCAgICAgICAgICBzZW5kX2V2ZW50OyAgIC8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgICAgICAgKmRpc3BsYXk7ICAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgaW50ICAgICAgICAgICBleHRlbnNpb247ICAgIC8qIFhJIGV4dGVuc2lvbiBvZmZzZXQgKi8KKyAgICBpbnQgICAgICAgICAgIGV2dHlwZTsgICAgICAgLyogWElfRGV2aWNlQ2hhbmdlZCAqLworICAgIFRpbWUgICAgICAgICAgdGltZTsKKyAgICBpbnQgICAgICAgICAgIGRldmljZWlkOyAgICAgLyogaWQgb2YgdGhlIGRldmljZSB0aGF0IGNoYW5nZWQgKi8KKyAgICBpbnQgICAgICAgICAgIHNvdXJjZWlkOyAgICAgLyogU291cmNlIGZvciB0aGUgbmV3IGNsYXNzZXMuICovCisgICAgaW50ICAgICAgICAgICByZWFzb247ICAgICAgIC8qIFJlYXNvbiBmb3IgdGhlIGNoYW5nZSAqLworICAgIGludCAgICAgICAgICAgbnVtX2NsYXNzZXM7CisgICAgWElBbnlDbGFzc0luZm8gKipjbGFzc2VzOyAvKiBzYW1lIGFzIGluIFhJRGV2aWNlSW5mbyAqLworfSBYSURldmljZUNoYW5nZWRFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgdHlwZTsgICAgICAgICAvKiBHZW5lcmljRXZlbnQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAgICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgICAgICAgICAgc2VuZF9ldmVudDsgICAvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICAgICAgICpkaXNwbGF5OyAgICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIGludCAgICAgICAgICAgZXh0ZW5zaW9uOyAgICAvKiBYSSBleHRlbnNpb24gb2Zmc2V0ICovCisgICAgaW50ICAgICAgICAgICBldnR5cGU7CisgICAgVGltZSAgICAgICAgICB0aW1lOworICAgIGludCAgICAgICAgICAgZGV2aWNlaWQ7CisgICAgaW50ICAgICAgICAgICBzb3VyY2VpZDsKKyAgICBpbnQgICAgICAgICAgIGRldGFpbDsKKyAgICBXaW5kb3cgICAgICAgIHJvb3Q7CisgICAgV2luZG93ICAgICAgICBldmVudDsKKyAgICBXaW5kb3cgICAgICAgIGNoaWxkOworICAgIGRvdWJsZSAgICAgICAgcm9vdF94OworICAgIGRvdWJsZSAgICAgICAgcm9vdF95OworICAgIGRvdWJsZSAgICAgICAgZXZlbnRfeDsKKyAgICBkb3VibGUgICAgICAgIGV2ZW50X3k7CisgICAgaW50ICAgICAgICAgICBmbGFnczsKKyAgICBYSUJ1dHRvblN0YXRlICAgICAgIGJ1dHRvbnM7CisgICAgWElWYWx1YXRvclN0YXRlICAgICB2YWx1YXRvcnM7CisgICAgWElNb2RpZmllclN0YXRlICAgICBtb2RzOworICAgIFhJR3JvdXBTdGF0ZSAgICAgICAgZ3JvdXA7Cit9IFhJRGV2aWNlRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgIHR5cGU7ICAgICAgICAgLyogR2VuZXJpY0V2ZW50ICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7ICAgICAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sICAgICAgICAgIHNlbmRfZXZlbnQ7ICAgLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAgICAgICAqZGlzcGxheTsgICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBpbnQgICAgICAgICAgIGV4dGVuc2lvbjsgICAgLyogWEkgZXh0ZW5zaW9uIG9mZnNldCAqLworICAgIGludCAgICAgICAgICAgZXZ0eXBlOyAgICAgICAvKiBYSV9SYXdLZXlQcmVzcywgWElfUmF3S2V5UmVsZWFzZSwgZXRjLiAqLworICAgIFRpbWUgICAgICAgICAgdGltZTsKKyAgICBpbnQgICAgICAgICAgIGRldmljZWlkOworICAgIGludCAgICAgICAgICAgc291cmNlaWQ7ICAgICAvKiBCdWc6IEFsd2F5cyAwLiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnLy9zaG93X2J1Zy5jZ2k/aWQ9MzQyNDAgKi8KKyAgICBpbnQgICAgICAgICAgIGRldGFpbDsKKyAgICBpbnQgICAgICAgICAgIGZsYWdzOworICAgIFhJVmFsdWF0b3JTdGF0ZSB2YWx1YXRvcnM7CisgICAgZG91YmxlICAgICAgICAqcmF3X3ZhbHVlczsKK30gWElSYXdFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgdHlwZTsgICAgICAgICAvKiBHZW5lcmljRXZlbnQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAgICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgICAgICAgICAgc2VuZF9ldmVudDsgICAvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICAgICAgICpkaXNwbGF5OyAgICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIGludCAgICAgICAgICAgZXh0ZW5zaW9uOyAgICAvKiBYSSBleHRlbnNpb24gb2Zmc2V0ICovCisgICAgaW50ICAgICAgICAgICBldnR5cGU7CisgICAgVGltZSAgICAgICAgICB0aW1lOworICAgIGludCAgICAgICAgICAgZGV2aWNlaWQ7CisgICAgaW50ICAgICAgICAgICBzb3VyY2VpZDsKKyAgICBpbnQgICAgICAgICAgIGRldGFpbDsKKyAgICBXaW5kb3cgICAgICAgIHJvb3Q7CisgICAgV2luZG93ICAgICAgICBldmVudDsKKyAgICBXaW5kb3cgICAgICAgIGNoaWxkOworICAgIGRvdWJsZSAgICAgICAgcm9vdF94OworICAgIGRvdWJsZSAgICAgICAgcm9vdF95OworICAgIGRvdWJsZSAgICAgICAgZXZlbnRfeDsKKyAgICBkb3VibGUgICAgICAgIGV2ZW50X3k7CisgICAgaW50ICAgICAgICAgICBtb2RlOworICAgIEJvb2wgICAgICAgICAgZm9jdXM7CisgICAgQm9vbCAgICAgICAgICBzYW1lX3NjcmVlbjsKKyAgICBYSUJ1dHRvblN0YXRlICAgICAgIGJ1dHRvbnM7CisgICAgWElNb2RpZmllclN0YXRlICAgICBtb2RzOworICAgIFhJR3JvdXBTdGF0ZSAgICAgICAgZ3JvdXA7Cit9IFhJRW50ZXJFdmVudDsKKwordHlwZWRlZiBYSUVudGVyRXZlbnQgWElMZWF2ZUV2ZW50OwordHlwZWRlZiBYSUVudGVyRXZlbnQgWElGb2N1c0luRXZlbnQ7Cit0eXBlZGVmIFhJRW50ZXJFdmVudCBYSUZvY3VzT3V0RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgIHR5cGU7ICAgICAgICAgLyogR2VuZXJpY0V2ZW50ICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7ICAgICAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sICAgICAgICAgIHNlbmRfZXZlbnQ7ICAgLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAgICAgICAqZGlzcGxheTsgICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBpbnQgICAgICAgICAgIGV4dGVuc2lvbjsgICAgLyogWEkgZXh0ZW5zaW9uIG9mZnNldCAqLworICAgIGludCAgICAgICAgICAgZXZ0eXBlOyAgICAgICAvKiBYSV9Qcm9wZXJ0eUV2ZW50ICovCisgICAgVGltZSAgICAgICAgICB0aW1lOworICAgIGludCAgICAgICAgICAgZGV2aWNlaWQ7ICAgICAvKiBpZCBvZiB0aGUgZGV2aWNlIHRoYXQgY2hhbmdlZCAqLworICAgIEF0b20gICAgICAgICAgcHJvcGVydHk7CisgICAgaW50ICAgICAgICAgICB3aGF0OworfSBYSVByb3BlcnR5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgIHR5cGU7ICAgICAgICAgLyogR2VuZXJpY0V2ZW50ICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7ICAgICAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sICAgICAgICAgIHNlbmRfZXZlbnQ7ICAgLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAgICAgICAqZGlzcGxheTsgICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBpbnQgICAgICAgICAgIGV4dGVuc2lvbjsgICAgLyogWEkgZXh0ZW5zaW9uIG9mZnNldCAqLworICAgIGludCAgICAgICAgICAgZXZ0eXBlOworICAgIFRpbWUgICAgICAgICAgdGltZTsKKyAgICBpbnQgICAgICAgICAgIGRldmljZWlkOworICAgIGludCAgICAgICAgICAgc291cmNlaWQ7CisgICAgdW5zaWduZWQgaW50ICB0b3VjaGlkOworICAgIFdpbmRvdyAgICAgICAgcm9vdDsKKyAgICBXaW5kb3cgICAgICAgIGV2ZW50OworICAgIFdpbmRvdyAgICAgICAgY2hpbGQ7CisgICAgaW50ICAgICAgICAgICBmbGFnczsKK30gWElUb3VjaE93bmVyc2hpcEV2ZW50OworCitfWEZVTkNQUk9UT0JFR0lOCisKK2V4dGVybiBCb29sICAgICBYSVF1ZXJ5UG9pbnRlcigKKyAgICBEaXNwbGF5KiAgICAgICAgICAgIGRpc3BsYXksCisgICAgaW50ICAgICAgICAgICAgICAgICBkZXZpY2VpZCwKKyAgICBXaW5kb3cgICAgICAgICAgICAgIHdpbiwKKyAgICBXaW5kb3cqICAgICAgICAgICAgIHJvb3QsCisgICAgV2luZG93KiAgICAgICAgICAgICBjaGlsZCwKKyAgICBkb3VibGUqICAgICAgICAgICAgIHJvb3RfeCwKKyAgICBkb3VibGUqICAgICAgICAgICAgIHJvb3RfeSwKKyAgICBkb3VibGUqICAgICAgICAgICAgIHdpbl94LAorICAgIGRvdWJsZSogICAgICAgICAgICAgd2luX3ksCisgICAgWElCdXR0b25TdGF0ZSAgICAgICAqYnV0dG9ucywKKyAgICBYSU1vZGlmaWVyU3RhdGUgICAgICptb2RzLAorICAgIFhJR3JvdXBTdGF0ZSAgICAgICAgKmdyb3VwCispOworCitleHRlcm4gQm9vbCAgICAgWElXYXJwUG9pbnRlcigKKyAgICBEaXNwbGF5KiAgICAgICAgICAgIGRpc3BsYXksCisgICAgaW50ICAgICAgICAgICAgICAgICBkZXZpY2VpZCwKKyAgICBXaW5kb3cgICAgICAgICAgICAgIHNyY193aW4sCisgICAgV2luZG93ICAgICAgICAgICAgICBkc3Rfd2luLAorICAgIGRvdWJsZSAgICAgICAgICAgICAgc3JjX3gsCisgICAgZG91YmxlICAgICAgICAgICAgICBzcmNfeSwKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgIHNyY193aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgIHNyY19oZWlnaHQsCisgICAgZG91YmxlICAgICAgICAgICAgICBkc3RfeCwKKyAgICBkb3VibGUgICAgICAgICAgICAgIGRzdF95CispOworCitleHRlcm4gU3RhdHVzICAgWElEZWZpbmVDdXJzb3IoCisgICAgRGlzcGxheSogICAgICAgICAgICBkaXNwbGF5LAorICAgIGludCAgICAgICAgICAgICAgICAgZGV2aWNlaWQsCisgICAgV2luZG93ICAgICAgICAgICAgICB3aW4sCisgICAgQ3Vyc29yICAgICAgICAgICAgICBjdXJzb3IKKyk7CisKK2V4dGVybiBTdGF0dXMgICBYSVVuZGVmaW5lQ3Vyc29yKAorICAgIERpc3BsYXkqICAgICAgICAgICAgZGlzcGxheSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIGRldmljZWlkLAorICAgIFdpbmRvdyAgICAgICAgICAgICAgd2luCispOworCitleHRlcm4gU3RhdHVzICAgWElDaGFuZ2VIaWVyYXJjaHkoCisgICAgRGlzcGxheSogICAgICAgICAgICBkaXNwbGF5LAorICAgIFhJQW55SGllcmFyY2h5Q2hhbmdlSW5mbyogIGNoYW5nZXMsCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1fY2hhbmdlcworKTsKKworZXh0ZXJuIFN0YXR1cyAgIFhJU2V0Q2xpZW50UG9pbnRlcigKKyAgICBEaXNwbGF5KiAgICAgICAgICAgIGRweSwKKyAgICBXaW5kb3cgICAgICAgICAgICAgIHdpbiwKKyAgICBpbnQgICAgICAgICAgICAgICAgIGRldmljZWlkCispOworCitleHRlcm4gQm9vbCAgICAgWElHZXRDbGllbnRQb2ludGVyKAorICAgIERpc3BsYXkqICAgICAgICAgICAgZHB5LAorICAgIFdpbmRvdyAgICAgICAgICAgICAgd2luLAorICAgIGludCogICAgICAgICAgICAgICAgZGV2aWNlaWQKKyk7CisKK2V4dGVybiBpbnQgICAgICBYSVNlbGVjdEV2ZW50cygKKyAgICAgRGlzcGxheSogICAgICAgICAgICBkcHksCisgICAgIFdpbmRvdyAgICAgICAgICAgICAgd2luLAorICAgICBYSUV2ZW50TWFzayAgICAgICAgICptYXNrcywKKyAgICAgaW50ICAgICAgICAgICAgICAgICBudW1fbWFza3MKKyk7CisKK2V4dGVybiBYSUV2ZW50TWFzayAqWElHZXRTZWxlY3RlZEV2ZW50cygKKyAgICAgRGlzcGxheSogICAgICAgICAgICBkcHksCisgICAgIFdpbmRvdyAgICAgICAgICAgICAgd2luLAorICAgICBpbnQgICAgICAgICAgICAgICAgICpudW1fbWFza3NfcmV0dXJuCispOworCitleHRlcm4gU3RhdHVzIFhJUXVlcnlWZXJzaW9uKAorICAgICBEaXNwbGF5KiAgICAgICAgICAgZHB5LAorICAgICBpbnQqICAgICAgICAgICAgICAgbWFqb3JfdmVyc2lvbl9pbm91dCwKKyAgICAgaW50KiAgICAgICAgICAgICAgIG1pbm9yX3ZlcnNpb25faW5vdXQKKyk7CisKK2V4dGVybiBYSURldmljZUluZm8qIFhJUXVlcnlEZXZpY2UoCisgICAgIERpc3BsYXkqICAgICAgICAgICBkcHksCisgICAgIGludCAgICAgICAgICAgICAgICBkZXZpY2VpZCwKKyAgICAgaW50KiAgICAgICAgICAgICAgIG5kZXZpY2VzX3JldHVybgorKTsKKworZXh0ZXJuIFN0YXR1cyBYSVNldEZvY3VzKAorICAgICBEaXNwbGF5KiAgICAgICAgICAgZHB5LAorICAgICBpbnQgICAgICAgICAgICAgICAgZGV2aWNlaWQsCisgICAgIFdpbmRvdyAgICAgICAgICAgICBmb2N1cywKKyAgICAgVGltZSAgICAgICAgICAgICAgIHRpbWUKKyk7CisKK2V4dGVybiBTdGF0dXMgWElHZXRGb2N1cygKKyAgICAgRGlzcGxheSogICAgICAgICAgIGRweSwKKyAgICAgaW50ICAgICAgICAgICAgICAgIGRldmljZWlkLAorICAgICBXaW5kb3cgICAgICAgICAgICAgKmZvY3VzX3JldHVybik7CisKK2V4dGVybiBTdGF0dXMgWElHcmFiRGV2aWNlKAorICAgICBEaXNwbGF5KiAgICAgICAgICAgZHB5LAorICAgICBpbnQgICAgICAgICAgICAgICAgZGV2aWNlaWQsCisgICAgIFdpbmRvdyAgICAgICAgICAgICBncmFiX3dpbmRvdywKKyAgICAgVGltZSAgICAgICAgICAgICAgIHRpbWUsCisgICAgIEN1cnNvciAgICAgICAgICAgICBjdXJzb3IsCisgICAgIGludCAgICAgICAgICAgICAgICBncmFiX21vZGUsCisgICAgIGludCAgICAgICAgICAgICAgICBwYWlyZWRfZGV2aWNlX21vZGUsCisgICAgIEJvb2wgICAgICAgICAgICAgICBvd25lcl9ldmVudHMsCisgICAgIFhJRXZlbnRNYXNrICAgICAgICAqbWFzaworKTsKKworZXh0ZXJuIFN0YXR1cyBYSVVuZ3JhYkRldmljZSgKKyAgICAgRGlzcGxheSogICAgICAgICAgIGRweSwKKyAgICAgaW50ICAgICAgICAgICAgICAgIGRldmljZWlkLAorICAgICBUaW1lICAgICAgICAgICAgICAgdGltZQorKTsKKworZXh0ZXJuIFN0YXR1cyBYSUFsbG93RXZlbnRzKAorICAgIERpc3BsYXkqICAgICAgICAgICAgZGlzcGxheSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIGRldmljZWlkLAorICAgIGludCAgICAgICAgICAgICAgICAgZXZlbnRfbW9kZSwKKyAgICBUaW1lICAgICAgICAgICAgICAgIHRpbWUKKyk7CisKK2V4dGVybiBTdGF0dXMgWElBbGxvd1RvdWNoRXZlbnRzKAorICAgIERpc3BsYXkqICAgICAgICAgICAgZGlzcGxheSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIGRldmljZWlkLAorICAgIHVuc2lnbmVkIGludCAgICAgICAgdG91Y2hpZCwKKyAgICBXaW5kb3cgICAgICAgICAgICAgIGdyYWJfd2luZG93LAorICAgIGludCAgICAgICAgICAgICAgICAgZXZlbnRfbW9kZQorKTsKKworZXh0ZXJuIGludCBYSUdyYWJCdXR0b24oCisgICAgRGlzcGxheSogICAgICAgICAgICBkaXNwbGF5LAorICAgIGludCAgICAgICAgICAgICAgICAgZGV2aWNlaWQsCisgICAgaW50ICAgICAgICAgICAgICAgICBidXR0b24sCisgICAgV2luZG93ICAgICAgICAgICAgICBncmFiX3dpbmRvdywKKyAgICBDdXJzb3IgICAgICAgICAgICAgIGN1cnNvciwKKyAgICBpbnQgICAgICAgICAgICAgICAgIGdyYWJfbW9kZSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIHBhaXJlZF9kZXZpY2VfbW9kZSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIG93bmVyX2V2ZW50cywKKyAgICBYSUV2ZW50TWFzayAgICAgICAgICptYXNrLAorICAgIGludCAgICAgICAgICAgICAgICAgbnVtX21vZGlmaWVycywKKyAgICBYSUdyYWJNb2RpZmllcnMgICAgICptb2RpZmllcnNfaW5vdXQKKyk7CisKK2V4dGVybiBpbnQgWElHcmFiS2V5Y29kZSgKKyAgICBEaXNwbGF5KiAgICAgICAgICAgIGRpc3BsYXksCisgICAgaW50ICAgICAgICAgICAgICAgICBkZXZpY2VpZCwKKyAgICBpbnQgICAgICAgICAgICAgICAgIGtleWNvZGUsCisgICAgV2luZG93ICAgICAgICAgICAgICBncmFiX3dpbmRvdywKKyAgICBpbnQgICAgICAgICAgICAgICAgIGdyYWJfbW9kZSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIHBhaXJlZF9kZXZpY2VfbW9kZSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIG93bmVyX2V2ZW50cywKKyAgICBYSUV2ZW50TWFzayAgICAgICAgICptYXNrLAorICAgIGludCAgICAgICAgICAgICAgICAgbnVtX21vZGlmaWVycywKKyAgICBYSUdyYWJNb2RpZmllcnMgICAgICptb2RpZmllcnNfaW5vdXQKKyk7CisKK2V4dGVybiBpbnQgWElHcmFiRW50ZXIoCisgICAgRGlzcGxheSogICAgICAgICAgICBkaXNwbGF5LAorICAgIGludCAgICAgICAgICAgICAgICAgZGV2aWNlaWQsCisgICAgV2luZG93ICAgICAgICAgICAgICBncmFiX3dpbmRvdywKKyAgICBDdXJzb3IgICAgICAgICAgICAgIGN1cnNvciwKKyAgICBpbnQgICAgICAgICAgICAgICAgIGdyYWJfbW9kZSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIHBhaXJlZF9kZXZpY2VfbW9kZSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIG93bmVyX2V2ZW50cywKKyAgICBYSUV2ZW50TWFzayAgICAgICAgICptYXNrLAorICAgIGludCAgICAgICAgICAgICAgICAgbnVtX21vZGlmaWVycywKKyAgICBYSUdyYWJNb2RpZmllcnMgICAgICptb2RpZmllcnNfaW5vdXQKKyk7CisKK2V4dGVybiBpbnQgWElHcmFiRm9jdXNJbigKKyAgICBEaXNwbGF5KiAgICAgICAgICAgIGRpc3BsYXksCisgICAgaW50ICAgICAgICAgICAgICAgICBkZXZpY2VpZCwKKyAgICBXaW5kb3cgICAgICAgICAgICAgIGdyYWJfd2luZG93LAorICAgIGludCAgICAgICAgICAgICAgICAgZ3JhYl9tb2RlLAorICAgIGludCAgICAgICAgICAgICAgICAgcGFpcmVkX2RldmljZV9tb2RlLAorICAgIGludCAgICAgICAgICAgICAgICAgb3duZXJfZXZlbnRzLAorICAgIFhJRXZlbnRNYXNrICAgICAgICAgKm1hc2ssCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1fbW9kaWZpZXJzLAorICAgIFhJR3JhYk1vZGlmaWVycyAgICAgKm1vZGlmaWVyc19pbm91dAorKTsKKworZXh0ZXJuIGludCBYSUdyYWJUb3VjaEJlZ2luKAorICAgIERpc3BsYXkqICAgICAgICAgICAgZGlzcGxheSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIGRldmljZWlkLAorICAgIFdpbmRvdyAgICAgICAgICAgICAgZ3JhYl93aW5kb3csCisgICAgaW50ICAgICAgICAgICAgICAgICBvd25lcl9ldmVudHMsCisgICAgWElFdmVudE1hc2sgICAgICAgICAqbWFzaywKKyAgICBpbnQgICAgICAgICAgICAgICAgIG51bV9tb2RpZmllcnMsCisgICAgWElHcmFiTW9kaWZpZXJzICAgICAqbW9kaWZpZXJzX2lub3V0CispOworCitleHRlcm4gU3RhdHVzIFhJVW5ncmFiQnV0dG9uKAorICAgIERpc3BsYXkqICAgICAgICAgICAgZGlzcGxheSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIGRldmljZWlkLAorICAgIGludCAgICAgICAgICAgICAgICAgYnV0dG9uLAorICAgIFdpbmRvdyAgICAgICAgICAgICAgZ3JhYl93aW5kb3csCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1fbW9kaWZpZXJzLAorICAgIFhJR3JhYk1vZGlmaWVycyAgICAgKm1vZGlmaWVycworKTsKKworZXh0ZXJuIFN0YXR1cyBYSVVuZ3JhYktleWNvZGUoCisgICAgRGlzcGxheSogICAgICAgICAgICBkaXNwbGF5LAorICAgIGludCAgICAgICAgICAgICAgICAgZGV2aWNlaWQsCisgICAgaW50ICAgICAgICAgICAgICAgICBrZXljb2RlLAorICAgIFdpbmRvdyAgICAgICAgICAgICAgZ3JhYl93aW5kb3csCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1fbW9kaWZpZXJzLAorICAgIFhJR3JhYk1vZGlmaWVycyAgICAgKm1vZGlmaWVycworKTsKKworZXh0ZXJuIFN0YXR1cyBYSVVuZ3JhYkVudGVyKAorICAgIERpc3BsYXkqICAgICAgICAgICAgZGlzcGxheSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIGRldmljZWlkLAorICAgIFdpbmRvdyAgICAgICAgICAgICAgZ3JhYl93aW5kb3csCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1fbW9kaWZpZXJzLAorICAgIFhJR3JhYk1vZGlmaWVycyAgICAgKm1vZGlmaWVycworKTsKKworZXh0ZXJuIFN0YXR1cyBYSVVuZ3JhYkZvY3VzSW4oCisgICAgRGlzcGxheSogICAgICAgICAgICBkaXNwbGF5LAorICAgIGludCAgICAgICAgICAgICAgICAgZGV2aWNlaWQsCisgICAgV2luZG93ICAgICAgICAgICAgICBncmFiX3dpbmRvdywKKyAgICBpbnQgICAgICAgICAgICAgICAgIG51bV9tb2RpZmllcnMsCisgICAgWElHcmFiTW9kaWZpZXJzICAgICAqbW9kaWZpZXJzCispOworCitleHRlcm4gU3RhdHVzIFhJVW5ncmFiVG91Y2hCZWdpbigKKyAgICBEaXNwbGF5KiAgICAgICAgICAgIGRpc3BsYXksCisgICAgaW50ICAgICAgICAgICAgICAgICBkZXZpY2VpZCwKKyAgICBXaW5kb3cgICAgICAgICAgICAgIGdyYWJfd2luZG93LAorICAgIGludCAgICAgICAgICAgICAgICAgbnVtX21vZGlmaWVycywKKyAgICBYSUdyYWJNb2RpZmllcnMgICAgICptb2RpZmllcnMKKyk7CisKK2V4dGVybiBBdG9tICpYSUxpc3RQcm9wZXJ0aWVzKAorICAgIERpc3BsYXkqICAgICAgICAgICAgZGlzcGxheSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIGRldmljZWlkLAorICAgIGludCAgICAgICAgICAgICAgICAgKm51bV9wcm9wc19yZXR1cm4KKyk7CisKK2V4dGVybiB2b2lkIFhJQ2hhbmdlUHJvcGVydHkoCisgICAgRGlzcGxheSogICAgICAgICAgICBkaXNwbGF5LAorICAgIGludCAgICAgICAgICAgICAgICAgZGV2aWNlaWQsCisgICAgQXRvbSAgICAgICAgICAgICAgICBwcm9wZXJ0eSwKKyAgICBBdG9tICAgICAgICAgICAgICAgIHR5cGUsCisgICAgaW50ICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgaW50ICAgICAgICAgICAgICAgICBtb2RlLAorICAgIHVuc2lnbmVkIGNoYXIgICAgICAgKmRhdGEsCisgICAgaW50ICAgICAgICAgICAgICAgICBudW1faXRlbXMKKyk7CisKK2V4dGVybiB2b2lkCitYSURlbGV0ZVByb3BlcnR5KAorICAgIERpc3BsYXkqICAgICAgICAgICAgZGlzcGxheSwKKyAgICBpbnQgICAgICAgICAgICAgICAgIGRldmljZWlkLAorICAgIEF0b20gICAgICAgICAgICAgICAgcHJvcGVydHkKKyk7CisKK2V4dGVybiBTdGF0dXMKK1hJR2V0UHJvcGVydHkoCisgICAgRGlzcGxheSogICAgICAgICAgICBkaXNwbGF5LAorICAgIGludCAgICAgICAgICAgICAgICAgZGV2aWNlaWQsCisgICAgQXRvbSAgICAgICAgICAgICAgICBwcm9wZXJ0eSwKKyAgICBsb25nICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICBsb25nICAgICAgICAgICAgICAgIGxlbmd0aCwKKyAgICBCb29sICAgICAgICAgICAgICAgIGRlbGV0ZV9wcm9wZXJ0eSwKKyAgICBBdG9tICAgICAgICAgICAgICAgIHR5cGUsCisgICAgQXRvbSAgICAgICAgICAgICAgICAqdHlwZV9yZXR1cm4sCisgICAgaW50ICAgICAgICAgICAgICAgICAqZm9ybWF0X3JldHVybiwKKyAgICB1bnNpZ25lZCBsb25nICAgICAgICpudW1faXRlbXNfcmV0dXJuLAorICAgIHVuc2lnbmVkIGxvbmcgICAgICAgKmJ5dGVzX2FmdGVyX3JldHVybiwKKyAgICB1bnNpZ25lZCBjaGFyICAgICAgICoqZGF0YQorKTsKKworZXh0ZXJuIHZvaWQgWElGcmVlRGV2aWNlSW5mbyhYSURldmljZUluZm8gICAgICAgKmluZm8pOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYgLyogWElOUFVUMl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hJcHJvdG8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWElwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMGFiNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hJcHJvdG8uaApAQCAtMCwwICsxLDE3NTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IDE5ODksIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKK0NvcHlyaWdodCAxOTg5IGJ5IEhld2xldHQtUGFja2FyZCBDb21wYW55LCBQYWxvIEFsdG8sIENhbGlmb3JuaWEuCisKKwkJCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCitwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Citib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KK3N1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgSGV3bGV0dC1QYWNrYXJkIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisKK0hFV0xFVFQtUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0hFV0xFVFQtUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKK0FOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKK0FSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKK1NPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfWElQUk9UT19ICisjZGVmaW5lIF9YSVBST1RPX0gKKworI2luY2x1ZGUgPFgxMS9YcHJvdG8uaD4KKyNpbmNsdWRlIDxYMTEvWC5oPgorCisvKiBtYWtlIHN1cmUgdHlwZXMgaGF2ZSByaWdodCBzaXplcyBmb3IgcHJvdG9jb2wgc3RydWN0dXJlcy4gKi8KKyNkZWZpbmUgV2luZG93IENBUkQzMgorI2RlZmluZSBUaW1lIENBUkQzMgorI2RlZmluZSBLZXlDb2RlIENBUkQ4CisjZGVmaW5lIE1hc2sgQ0FSRDMyCisjZGVmaW5lIEF0b20gQ0FSRDMyCisjZGVmaW5lIEN1cnNvciBDQVJEMzIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIG51bWJlciBvZiBldmVudHMsIGVycm9ycywgYW5kIGV4dGVuc2lvbiBuYW1lLgorICoKKyAqLworCisjZGVmaW5lIE1PUkVfRVZFTlRTCTB4ODAKKyNkZWZpbmUgREVWSUNFX0JJVFMJMHg3RgorCisjZGVmaW5lIElucHV0Q2xhc3NCaXRzCTB4M0YJLyogYml0cyBpbiBtb2RlIGZpZWxkIGZvciBpbnB1dCBjbGFzc2VzICovCisjZGVmaW5lIE1vZGVCaXRzU2hpZnQJNgkvKiBhbW91bnQgdG8gc2hpZnQgdGhlIHJlbWFpbmluZyBiaXRzICAgKi8KKworI2RlZmluZSBudW1JbnB1dENsYXNzZXMgNworCisjZGVmaW5lIElFVkVOVFMgICAgICAgICAxNyAgICAgICAvKiBkb2VzIE5PVCBpbmNsdWRlIGdlbmVyaWMgZXZlbnRzICovCisjZGVmaW5lIElFUlJPUlMgICAgICAgICA1CisjZGVmaW5lIElSRVFVRVNUUyAgICAgICAzOQorCisjZGVmaW5lIENMSUVOVF9SRVEgICAgICAxCisKK3R5cGVkZWYgc3RydWN0ICBfWEV4dEV2ZW50SW5mbworICAgIHsKKyAgICBNYXNrCW1hc2s7CisgICAgQllURQl0eXBlOworICAgIEJZVEUJd29yZDsKKyAgICB9IFhFeHRFdmVudEluZm87CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAqUG9pbnRlcjsKKworc3RydWN0IHRtYXNrCisgICAgeworICAgIE1hc2sJbWFzazsKKyAgICBQb2ludGVyICAgICBkZXY7CisgICAgfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEV2ZW50IGNvbnN0YW50cyB1c2VkIGJ5IGxpYnJhcnkuCisgKgorICovCisKKyNkZWZpbmUgWElfRGV2aWNlVmFsdWF0b3IJCTAKKyNkZWZpbmUgWElfRGV2aWNlS2V5UHJlc3MJCTEKKyNkZWZpbmUgWElfRGV2aWNlS2V5UmVsZWFzZQkJMgorI2RlZmluZSBYSV9EZXZpY2VCdXR0b25QcmVzcwkJMworI2RlZmluZSBYSV9EZXZpY2VCdXR0b25SZWxlYXNlCQk0CisjZGVmaW5lIFhJX0RldmljZU1vdGlvbk5vdGlmeQkJNQorI2RlZmluZSBYSV9EZXZpY2VGb2N1c0luCQk2CisjZGVmaW5lIFhJX0RldmljZUZvY3VzT3V0CQk3CisjZGVmaW5lIFhJX1Byb3hpbWl0eUluCQkJOAorI2RlZmluZSBYSV9Qcm94aW1pdHlPdXQJCQk5CisjZGVmaW5lIFhJX0RldmljZVN0YXRlTm90aWZ5CQkxMAorI2RlZmluZSBYSV9EZXZpY2VNYXBwaW5nTm90aWZ5CQkxMQorI2RlZmluZSBYSV9DaGFuZ2VEZXZpY2VOb3RpZnkJCTEyCisjZGVmaW5lIFhJX0RldmljZUtleXN0YXRlTm90aWZ5CQkxMworI2RlZmluZSBYSV9EZXZpY2VCdXR0b25zdGF0ZU5vdGlmeQkxNAorI2RlZmluZSBYSV9EZXZpY2VQcmVzZW5jZU5vdGlmeQkJMTUKKyNkZWZpbmUgWElfRGV2aWNlUHJvcGVydHlOb3RpZnkgICAgICAgICAxNgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUHJvdG9jb2wgcmVxdWVzdCBjb25zdGFudHMKKyAqCisgKi8KKworI2RlZmluZSBYX0dldEV4dGVuc2lvblZlcnNpb24JCTEKKyNkZWZpbmUgWF9MaXN0SW5wdXREZXZpY2VzCQkyCisjZGVmaW5lIFhfT3BlbkRldmljZQkJCTMKKyNkZWZpbmUgWF9DbG9zZURldmljZQkJCTQKKyNkZWZpbmUgWF9TZXREZXZpY2VNb2RlCQkJNQorI2RlZmluZSBYX1NlbGVjdEV4dGVuc2lvbkV2ZW50CQk2CisjZGVmaW5lIFhfR2V0U2VsZWN0ZWRFeHRlbnNpb25FdmVudHMJNworI2RlZmluZSBYX0NoYW5nZURldmljZURvbnRQcm9wYWdhdGVMaXN0IDgKKyNkZWZpbmUgWF9HZXREZXZpY2VEb250UHJvcGFnYXRlTGlzdAk5CisjZGVmaW5lIFhfR2V0RGV2aWNlTW90aW9uRXZlbnRzCQkxMAorI2RlZmluZSBYX0NoYW5nZUtleWJvYXJkRGV2aWNlCQkxMQorI2RlZmluZSBYX0NoYW5nZVBvaW50ZXJEZXZpY2UJCTEyCisjZGVmaW5lIFhfR3JhYkRldmljZQkJCTEzCisjZGVmaW5lIFhfVW5ncmFiRGV2aWNlCQkJMTQKKyNkZWZpbmUgWF9HcmFiRGV2aWNlS2V5CQkJMTUKKyNkZWZpbmUgWF9VbmdyYWJEZXZpY2VLZXkJCTE2CisjZGVmaW5lIFhfR3JhYkRldmljZUJ1dHRvbgkJMTcKKyNkZWZpbmUgWF9VbmdyYWJEZXZpY2VCdXR0b24JCTE4CisjZGVmaW5lIFhfQWxsb3dEZXZpY2VFdmVudHMJCTE5CisjZGVmaW5lIFhfR2V0RGV2aWNlRm9jdXMJCTIwCisjZGVmaW5lIFhfU2V0RGV2aWNlRm9jdXMJCTIxCisjZGVmaW5lIFhfR2V0RmVlZGJhY2tDb250cm9sCQkyMgorI2RlZmluZSBYX0NoYW5nZUZlZWRiYWNrQ29udHJvbAkJMjMKKyNkZWZpbmUgWF9HZXREZXZpY2VLZXlNYXBwaW5nCQkyNAorI2RlZmluZSBYX0NoYW5nZURldmljZUtleU1hcHBpbmcJMjUKKyNkZWZpbmUgWF9HZXREZXZpY2VNb2RpZmllck1hcHBpbmcJMjYKKyNkZWZpbmUgWF9TZXREZXZpY2VNb2RpZmllck1hcHBpbmcJMjcKKyNkZWZpbmUgWF9HZXREZXZpY2VCdXR0b25NYXBwaW5nCTI4CisjZGVmaW5lIFhfU2V0RGV2aWNlQnV0dG9uTWFwcGluZwkyOQorI2RlZmluZSBYX1F1ZXJ5RGV2aWNlU3RhdGUJCTMwCisjZGVmaW5lIFhfU2VuZEV4dGVuc2lvbkV2ZW50CQkzMQorI2RlZmluZSBYX0RldmljZUJlbGwJCQkzMgorI2RlZmluZSBYX1NldERldmljZVZhbHVhdG9ycwkJMzMKKyNkZWZpbmUgWF9HZXREZXZpY2VDb250cm9sCQkzNAorI2RlZmluZSBYX0NoYW5nZURldmljZUNvbnRyb2wJCTM1CisvKiBYSSAxLjUgKi8KKyNkZWZpbmUgWF9MaXN0RGV2aWNlUHJvcGVydGllcyAgICAgICAgICAzNgorI2RlZmluZSBYX0NoYW5nZURldmljZVByb3BlcnR5ICAgICAgICAgIDM3CisjZGVmaW5lIFhfRGVsZXRlRGV2aWNlUHJvcGVydHkgICAgICAgICAgMzgKKyNkZWZpbmUgWF9HZXREZXZpY2VQcm9wZXJ0eSAgICAgICAgICAgICAzOQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUHJvdG9jb2wgcmVxdWVzdCBhbmQgcmVwbHkgc3RydWN0dXJlcy4KKyAqCisgKiBHZXRFeHRlbnNpb25WZXJzaW9uLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsgICAgICAgLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUgICAqLworICAgIENBUkQ4CVJlcVR5cGU7ICAgICAgIC8qIGFsd2F5cyBYX0dldEV4dGVuc2lvblZlcnNpb24gKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJbmJ5dGVzIEIxNjsKKyAgICBDQVJEOAlwYWQxLCBwYWQyOworfSB4R2V0RXh0ZW5zaW9uVmVyc2lvblJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcFR5cGU7CS8qIFhfUmVwbHkJCQkqLworICAgIENBUkQ4CVJlcFR5cGU7CS8qIGFsd2F5cyBYX0dldEV4dGVuc2lvblZlcnNpb24gKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNgltYWpvcl92ZXJzaW9uIEIxNjsKKyAgICBDQVJEMTYJbWlub3JfdmVyc2lvbiBCMTY7CisgICAgQk9PTAlwcmVzZW50OworICAgIENBUkQ4CXBhZDEsIHBhZDIsIHBhZDM7CisgICAgQ0FSRDMyCXBhZDAxIEIzMjsKKyAgICBDQVJEMzIJcGFkMDIgQjMyOworICAgIENBUkQzMglwYWQwMyBCMzI7CisgICAgQ0FSRDMyCXBhZDA0IEIzMjsKK30geEdldEV4dGVuc2lvblZlcnNpb25SZXBseTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIExpc3RJbnB1dERldmljZXMuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4CVJlcVR5cGU7CS8qIGFsd2F5cyBYX0xpc3RJbnB1dERldmljZXMJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geExpc3RJbnB1dERldmljZXNSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXBUeXBlOwkvKiBYX1JlcGx5CQkJKi8KKyAgICBDQVJEOAlSZXBUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfTGlzdElucHV0RGV2aWNlcwkqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDgJbmRldmljZXM7CisgICAgQ0FSRDgJcGFkMSwgcGFkMiwgcGFkMzsKKyAgICBDQVJEMzIJcGFkMDEgQjMyOworICAgIENBUkQzMglwYWQwMiBCMzI7CisgICAgQ0FSRDMyCXBhZDAzIEIzMjsKKyAgICBDQVJEMzIJcGFkMDQgQjMyOworICAgIENBUkQzMglwYWQwNSBCMzI7Cit9IHhMaXN0SW5wdXREZXZpY2VzUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IF94RGV2aWNlSW5mbyAqeERldmljZUluZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0IF94QW55Q2xhc3NpbmZvICp4QW55Q2xhc3NQdHI7CisKK3R5cGVkZWYgc3RydWN0IF94QW55Q2xhc3NpbmZvIHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgQ0FSRDgJY19jbGFzczsKKyNlbHNlCisgICAgQ0FSRDgJY2xhc3M7CisjZW5kaWYKKyAgICBDQVJEOAlsZW5ndGg7CisgICAgfSB4QW55Q2xhc3NJbmZvOworCit0eXBlZGVmIHN0cnVjdCBfeERldmljZUluZm8geworICAgIENBUkQzMgl0eXBlIEIzMjsKKyAgICBDQVJEOAlpZDsKKyAgICBDQVJEOAludW1fY2xhc3NlczsKKyAgICBDQVJEOAl1c2U7ICAgICAgLyogSXNYUG9pbnRlciB8IElzWEtleWJvYXJkIHwgSXNYRXh0ZW5zaW9uLi4uICovCisgICAgQ0FSRDgJYXR0YWNoZWQ7IC8qIGlkIG9mIG1hc3RlciBkZXYgKGlmIElzWEV4dGVuc2lvbi4uKSAqLworICAgIH0geERldmljZUluZm87CisKK3R5cGVkZWYgc3RydWN0IF94S2V5SW5mbyAqeEtleUluZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0IF94S2V5SW5mbyB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4CWNfY2xhc3M7CisjZWxzZQorICAgIENBUkQ4CWNsYXNzOworI2VuZGlmCisgICAgQ0FSRDgJbGVuZ3RoOworICAgIEtleUNvZGUJbWluX2tleWNvZGU7CisgICAgS2V5Q29kZQltYXhfa2V5Y29kZTsKKyAgICBDQVJEMTYJbnVtX2tleXMgQjE2OworICAgIENBUkQ4CXBhZDEscGFkMjsKKyAgICB9IHhLZXlJbmZvOworCit0eXBlZGVmIHN0cnVjdCBfeEJ1dHRvbkluZm8gKnhCdXR0b25JbmZvUHRyOworCit0eXBlZGVmIHN0cnVjdCBfeEJ1dHRvbkluZm8geworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOAljX2NsYXNzOworI2Vsc2UKKyAgICBDQVJEOAljbGFzczsKKyNlbmRpZgorICAgIENBUkQ4CWxlbmd0aDsKKyAgICBDQVJEMTYJbnVtX2J1dHRvbnMgQjE2OworICAgIH0geEJ1dHRvbkluZm87CisKK3R5cGVkZWYgc3RydWN0IF94VmFsdWF0b3JJbmZvICp4VmFsdWF0b3JJbmZvUHRyOworCit0eXBlZGVmIHN0cnVjdCBfeFZhbHVhdG9ySW5mbyB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4CWNfY2xhc3M7CisjZWxzZQorICAgIENBUkQ4CWNsYXNzOworI2VuZGlmCisgICAgQ0FSRDgJbGVuZ3RoOworICAgIENBUkQ4CW51bV9heGVzOworICAgIENBUkQ4CW1vZGU7CisgICAgQ0FSRDMyCW1vdGlvbl9idWZmZXJfc2l6ZSBCMzI7CisgICAgfSB4VmFsdWF0b3JJbmZvOworCit0eXBlZGVmIHN0cnVjdCBfeEF4aXNJbmZvICp4QXhpc0luZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0IF94QXhpc0luZm8geworICAgIENBUkQzMglyZXNvbHV0aW9uIEIzMjsKKyAgICBDQVJEMzIJbWluX3ZhbHVlIEIzMjsKKyAgICBDQVJEMzIJbWF4X3ZhbHVlIEIzMjsKKyAgICB9IHhBeGlzSW5mbzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE9wZW5EZXZpY2UuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4CVJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9PcGVuRGV2aWNlCQkqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4ICAgICAgIGRldmljZWlkOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKK30geE9wZW5EZXZpY2VSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXBUeXBlOwkvKiBYX1JlcGx5CQkJKi8KKyAgICBDQVJEOAlSZXBUeXBlOwkvKiBhbHdheXMgWF9PcGVuRGV2aWNlCQkqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDgJbnVtX2NsYXNzZXM7CisgICAgQllURQlwYWQxLCBwYWQyLCBwYWQzOworICAgIENBUkQzMglwYWQwMCBCMzI7CisgICAgQ0FSRDMyCXBhZDAxIEIzMjsKKyAgICBDQVJEMzIJcGFkMDIgQjMyOworICAgIENBUkQzMglwYWQwMyBCMzI7CisgICAgQ0FSRDMyCXBhZDA0IEIzMjsKKyAgICB9IHhPcGVuRGV2aWNlUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgQ0FSRDgJY19jbGFzczsKKyNlbHNlCisgICAgQ0FSRDgJY2xhc3M7CisjZW5kaWYKKyAgICBDQVJEOAlldmVudF90eXBlX2Jhc2U7CisgICAgfSB4SW5wdXRDbGFzc0luZm87CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDbG9zZURldmljZS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0Nsb3NlRGV2aWNlCSovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDggICAgICAgZGV2aWNlaWQ7CisgICAgQllURQlwYWQxLCBwYWQyLCBwYWQzOworfSB4Q2xvc2VEZXZpY2VSZXE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTZXREZXZpY2VNb2RlLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOAlSZXFUeXBlOwkvKiBhbHdheXMgWF9TZXREZXZpY2VNb2RlCSovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDggICAgICAgZGV2aWNlaWQ7CisgICAgQ0FSRDggICAgICAgbW9kZTsKKyAgICBCWVRFCXBhZDEsIHBhZDI7Cit9IHhTZXREZXZpY2VNb2RlUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVwVHlwZTsJLyogWF9SZXBseQkJCSovCisgICAgQ0FSRDgJUmVwVHlwZTsJLyogYWx3YXlzIFhfU2V0RGV2aWNlTW9kZQkqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDgJc3RhdHVzOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKKyAgICBDQVJEMzIJcGFkMDEgQjMyOworICAgIENBUkQzMglwYWQwMiBCMzI7CisgICAgQ0FSRDMyCXBhZDAzIEIzMjsKKyAgICBDQVJEMzIJcGFkMDQgQjMyOworICAgIENBUkQzMglwYWQwNSBCMzI7Cit9IHhTZXREZXZpY2VNb2RlUmVwbHk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTZWxlY3RFeHRlbnNpb25FdmVudC4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX1NlbGVjdEV4dGVuc2lvbkV2ZW50ICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgV2luZG93CXdpbmRvdyBCMzI7CisgICAgQ0FSRDE2CWNvdW50IEIxNjsKKyAgICBDQVJEMTYJcGFkMDAgQjE2OworfSB4U2VsZWN0RXh0ZW5zaW9uRXZlbnRSZXE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZXRTZWxlY3RlZEV4dGVuc2lvbkV2ZW50LgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogWF9HZXRTZWxlY3RlZEV4dGVuc2lvbkV2ZW50cyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFdpbmRvdwl3aW5kb3cgQjMyOworfSB4R2V0U2VsZWN0ZWRFeHRlbnNpb25FdmVudHNSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXBUeXBlOwkvKiBYX1JlcGx5CQkJKi8KKyAgICBDQVJEOAlSZXBUeXBlOwkvKiBHZXRTZWxlY3RlZEV4dGVuc2lvbkV2ZW50cwkqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDE2CXRoaXNfY2xpZW50X2NvdW50IEIxNjsKKyAgICBDQVJEMTYJYWxsX2NsaWVudHNfY291bnQgQjE2OworICAgIENBUkQzMglwYWQwMSBCMzI7CisgICAgQ0FSRDMyCXBhZDAyIEIzMjsKKyAgICBDQVJEMzIJcGFkMDMgQjMyOworICAgIENBUkQzMglwYWQwNCBCMzI7CisgICAgQ0FSRDMyCXBhZDA1IEIzMjsKK30geEdldFNlbGVjdGVkRXh0ZW5zaW9uRXZlbnRzUmVwbHk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDaGFuZ2VEZXZpY2VEb250UHJvcGFnYXRlTGlzdC4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgIC8qIFhfQ2hhbmdlRGV2aWNlRG9udFByb3BhZ2F0ZUxpc3QgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cJd2luZG93IEIzMjsKKyAgICBDQVJEMTYJY291bnQgQjE2OworICAgIENBUkQ4CW1vZGU7CisgICAgQllURQlwYWQ7Cit9IHhDaGFuZ2VEZXZpY2VEb250UHJvcGFnYXRlTGlzdFJlcTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdldERldmljZURvbnRQcm9wYWdhdGVMaXN0LgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogWF9HZXREZXZpY2VEb250UHJvcGFnYXRlTGlzdCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFdpbmRvdwl3aW5kb3cgQjMyOworfSB4R2V0RGV2aWNlRG9udFByb3BhZ2F0ZUxpc3RSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXBUeXBlOwkvKiBYX1JlcGx5CQkJKi8KKyAgICBDQVJEOAlSZXBUeXBlOyAgICAgICAgLyogR2V0RGV2aWNlRG9udFByb3BhZ2F0ZUxpc3QgICAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDE2CWNvdW50IEIxNjsKKyAgICBDQVJEMTYJcGFkMDAgQjE2OworICAgIENBUkQzMglwYWQwMSBCMzI7CisgICAgQ0FSRDMyCXBhZDAyIEIzMjsKKyAgICBDQVJEMzIJcGFkMDMgQjMyOworICAgIENBUkQzMglwYWQwNCBCMzI7CisgICAgQ0FSRDMyCXBhZDA1IEIzMjsKKyAgICB9IHhHZXREZXZpY2VEb250UHJvcGFnYXRlTGlzdFJlcGx5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR2V0RGV2aWNlTW90aW9uRXZlbnRzLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfR2V0RGV2aWNlTW90aW9uRXZlbnRzKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBUaW1lCXN0YXJ0IEIzMjsKKyAgICBUaW1lCXN0b3AgQjMyOworICAgIENBUkQ4CWRldmljZWlkOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKK30geEdldERldmljZU1vdGlvbkV2ZW50c1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcFR5cGU7CS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlSZXBUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfR2V0RGV2aWNlTW90aW9uRXZlbnRzICAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDMyCW5FdmVudHMgQjMyOworICAgIENBUkQ4CWF4ZXM7CisgICAgQ0FSRDgJbW9kZTsKKyAgICBCWVRFCXBhZDEsIHBhZDI7CisgICAgQ0FSRDMyCXBhZDAxIEIzMjsKKyAgICBDQVJEMzIJcGFkMDIgQjMyOworICAgIENBUkQzMglwYWQwMyBCMzI7CisgICAgQ0FSRDMyCXBhZDA0IEIzMjsKK30geEdldERldmljZU1vdGlvbkV2ZW50c1JlcGx5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ2hhbmdlS2V5Ym9hcmREZXZpY2UuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4CVJlcVR5cGU7ICAgICAgICAvKiBYX0NoYW5nZUtleWJvYXJkRGV2aWNlCSovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDgJZGV2aWNlaWQ7CisgICAgQllURQlwYWQxLCBwYWQyLCBwYWQzOworfSB4Q2hhbmdlS2V5Ym9hcmREZXZpY2VSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXBUeXBlOwkvKiBYX1JlcGx5CQkJKi8KKyAgICBDQVJEOAlSZXBUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfQ2hhbmdlS2V5Ym9hcmREZXZpY2UqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7ICAvKiAwICovCisgICAgQ0FSRDgJc3RhdHVzOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKKyAgICBDQVJEMzIJcGFkMDEgQjMyOworICAgIENBUkQzMglwYWQwMiBCMzI7CisgICAgQ0FSRDMyCXBhZDAzIEIzMjsKKyAgICBDQVJEMzIJcGFkMDQgQjMyOworICAgIENBUkQzMglwYWQwNSBCMzI7CisgICAgfSB4Q2hhbmdlS2V5Ym9hcmREZXZpY2VSZXBseTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENoYW5nZVBvaW50ZXJEZXZpY2UuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4CVJlcVR5cGU7ICAgICAgICAvKiBYX0NoYW5nZVBvaW50ZXJEZXZpY2UJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOAl4YXhpczsKKyAgICBDQVJEOAl5YXhpczsKKyAgICBDQVJEOAlkZXZpY2VpZDsKKyAgICBCWVRFCXBhZDE7Cit9IHhDaGFuZ2VQb2ludGVyRGV2aWNlUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVwVHlwZTsJLyogWF9SZXBseQkJCSovCisgICAgQ0FSRDgJUmVwVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0NoYW5nZVBvaW50ZXJEZXZpY2UgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOyAgLyogMCAqLworICAgIENBUkQ4CXN0YXR1czsKKyAgICBCWVRFCXBhZDEsIHBhZDIsIHBhZDM7CisgICAgQ0FSRDMyCXBhZDAxIEIzMjsKKyAgICBDQVJEMzIJcGFkMDIgQjMyOworICAgIENBUkQzMglwYWQwMyBCMzI7CisgICAgQ0FSRDMyCXBhZDA0IEIzMjsKKyAgICBDQVJEMzIJcGFkMDUgQjMyOworICAgIH0geENoYW5nZVBvaW50ZXJEZXZpY2VSZXBseTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdyYWJEZXZpY2UuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4CVJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9HcmFiRGV2aWNlICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgV2luZG93CWdyYWJXaW5kb3cgQjMyOworICAgIFRpbWUJdGltZSBCMzI7CisgICAgQ0FSRDE2CWV2ZW50X2NvdW50IEIxNjsKKyAgICBDQVJEOAl0aGlzX2RldmljZV9tb2RlOworICAgIENBUkQ4CW90aGVyX2RldmljZXNfbW9kZTsKKyAgICBCT09MCW93bmVyRXZlbnRzOworICAgIENBUkQ4CWRldmljZWlkOworICAgIENBUkQxNglwYWQwMSBCMTY7Cit9IHhHcmFiRGV2aWNlUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVwVHlwZTsJLyogWF9SZXBseQkJCSovCisgICAgQ0FSRDgJUmVwVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0dyYWJEZXZpY2UJKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOyAgLyogMCAqLworICAgIENBUkQ4CXN0YXR1czsKKyAgICBCWVRFCXBhZDEsIHBhZDIsIHBhZDM7CisgICAgQ0FSRDMyCXBhZDAxIEIzMjsKKyAgICBDQVJEMzIJcGFkMDIgQjMyOworICAgIENBUkQzMglwYWQwMyBCMzI7CisgICAgQ0FSRDMyCXBhZDA0IEIzMjsKKyAgICBDQVJEMzIJcGFkMDUgQjMyOworICAgIH0geEdyYWJEZXZpY2VSZXBseTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFVuZ3JhYkRldmljZS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX1VuR3JhYkRldmljZQkqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFRpbWUJdGltZSBCMzI7CisgICAgQ0FSRDgJZGV2aWNlaWQ7CisgICAgQllURQlwYWQxLCBwYWQyLCBwYWQzOworfSB4VW5ncmFiRGV2aWNlUmVxOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR3JhYkRldmljZUtleS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0dyYWJEZXZpY2VLZXkJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cJZ3JhYldpbmRvdyBCMzI7CisgICAgQ0FSRDE2CWV2ZW50X2NvdW50IEIxNjsKKyAgICBDQVJEMTYJbW9kaWZpZXJzIEIxNjsKKyAgICBDQVJEOAltb2RpZmllcl9kZXZpY2U7CisgICAgQ0FSRDgJZ3JhYmJlZF9kZXZpY2U7CisgICAgQ0FSRDgJa2V5OworICAgIEJZVEUJdGhpc19kZXZpY2VfbW9kZTsKKyAgICBCWVRFCW90aGVyX2RldmljZXNfbW9kZTsKKyAgICBCT09MCW93bmVyRXZlbnRzOworICAgIEJZVEUJcGFkMSwgcGFkMjsKK30geEdyYWJEZXZpY2VLZXlSZXE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBVbmdyYWJEZXZpY2VLZXkuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4CVJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9VbmdyYWJEZXZpY2VLZXkJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cJZ3JhYldpbmRvdyBCMzI7CisgICAgQ0FSRDE2CW1vZGlmaWVycyBCMTY7CisgICAgQ0FSRDgJbW9kaWZpZXJfZGV2aWNlOworICAgIENBUkQ4CWtleTsKKyAgICBDQVJEOAlncmFiYmVkX2RldmljZTsKKyAgICBCWVRFCXBhZDEsIHBhZDIsIHBhZDM7Cit9IHhVbmdyYWJEZXZpY2VLZXlSZXE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHcmFiRGV2aWNlQnV0dG9uLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfR3JhYkRldmljZUJ1dHRvbgkqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFdpbmRvdwlncmFiV2luZG93IEIzMjsKKyAgICBDQVJEOAlncmFiYmVkX2RldmljZTsKKyAgICBDQVJEOAltb2RpZmllcl9kZXZpY2U7CisgICAgQ0FSRDE2CWV2ZW50X2NvdW50IEIxNjsKKyAgICBDQVJEMTYJbW9kaWZpZXJzIEIxNjsKKyAgICBCWVRFCXRoaXNfZGV2aWNlX21vZGU7CisgICAgQllURQlvdGhlcl9kZXZpY2VzX21vZGU7CisgICAgQ0FSRDgJYnV0dG9uOworICAgIEJPT0wJb3duZXJFdmVudHM7CisgICAgQllURQlwYWQxLCBwYWQyOworfSB4R3JhYkRldmljZUJ1dHRvblJlcTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFVuZ3JhYkRldmljZUJ1dHRvbi4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX1VuZ3JhYkRldmljZUJ1dHRvbgkqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFdpbmRvdwlncmFiV2luZG93IEIzMjsKKyAgICBDQVJEMTYJbW9kaWZpZXJzIEIxNjsKKyAgICBDQVJEOAltb2RpZmllcl9kZXZpY2U7CisgICAgQ0FSRDgJYnV0dG9uOworICAgIENBUkQ4CWdyYWJiZWRfZGV2aWNlOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKK30geFVuZ3JhYkRldmljZUJ1dHRvblJlcTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEFsbG93RGV2aWNlRXZlbnRzLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfQWxsb3dEZXZpY2VFdmVudHMJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIENBUkQ4CW1vZGU7CisgICAgQ0FSRDgJZGV2aWNlaWQ7CisgICAgQllURQlwYWQxLCBwYWQyOworfSB4QWxsb3dEZXZpY2VFdmVudHNSZXE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZXREZXZpY2VGb2N1cy4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7ICAgICAgICAvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZSAgICovCisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0dldERldmljZUZvY3VzCSovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDgJZGV2aWNlaWQ7CisgICAgQllURQlwYWQxLCBwYWQyLCBwYWQzOworfSB4R2V0RGV2aWNlRm9jdXNSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXBUeXBlOwkvKiBYX1JlcGx5CQkJKi8KKyAgICBDQVJEOAlSZXBUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfR2V0RGV2aWNlRm9jdXMJKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMglmb2N1cyBCMzI7CisgICAgVGltZQl0aW1lIEIzMjsKKyAgICBDQVJEOAlyZXZlcnRUbzsKKyAgICBCWVRFCXBhZDEsIHBhZDIsIHBhZDM7CisgICAgQ0FSRDMyCXBhZDAxIEIzMjsKKyAgICBDQVJEMzIJcGFkMDIgQjMyOworICAgIENBUkQzMglwYWQwMyBCMzI7CisgICAgfSB4R2V0RGV2aWNlRm9jdXNSZXBseTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNldERldmljZUZvY3VzLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsgICAgICAgIC8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlICAgKi8KKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfU2V0RGV2aWNlRm9jdXMJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cJZm9jdXMgQjMyOworICAgIFRpbWUJdGltZSBCMzI7CisgICAgQ0FSRDgJcmV2ZXJ0VG87CisgICAgQ0FSRDgJZGV2aWNlOworICAgIENBUkQxNglwYWQwMSBCMTY7Cit9IHhTZXREZXZpY2VGb2N1c1JlcTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdldEZlZWRiYWNrQ29udHJvbC4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgIC8qIFhfR2V0RmVlZGJhY2tDb250cm9sCSovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDgJZGV2aWNlaWQ7CisgICAgQllURQlwYWQxLCBwYWQyLCBwYWQzOworfSB4R2V0RmVlZGJhY2tDb250cm9sUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVwVHlwZTsJLyogWF9SZXBseQkJCSovCisgICAgQ0FSRDgJUmVwVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0dldEZlZWRiYWNrQ29udHJvbAkqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDE2CW51bV9mZWVkYmFja3MgQjE2OworICAgIENBUkQxNglwYWQwMSBCMTY7CisgICAgQ0FSRDMyCXBhZDAyIEIzMjsKKyAgICBDQVJEMzIJcGFkMDMgQjMyOworICAgIENBUkQzMglwYWQwNCBCMzI7CisgICAgQ0FSRDMyCXBhZDA1IEIzMjsKKyAgICBDQVJEMzIJcGFkMDYgQjMyOworfSB4R2V0RmVlZGJhY2tDb250cm9sUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgQ0FSRDgJY19jbGFzczsJLyogZmVlZGJhY2sgY2xhc3MJCSovCisjZWxzZQorICAgIENBUkQ4CWNsYXNzOwkJLyogZmVlZGJhY2sgY2xhc3MJCSovCisjZW5kaWYKKyAgICBDQVJEOAlpZDsJCS8qIGZlZWRiYWNrIGlkCQkqLworICAgIENBUkQxNglsZW5ndGggQjE2OwkvKiBmZWVkYmFjayBsZW5ndGgJCSovCit9IHhGZWVkYmFja1N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4ICAgY19jbGFzczsKKyNlbHNlCisgICAgQ0FSRDggICBjbGFzczsKKyNlbmRpZgorICAgIENBUkQ4ICAgaWQ7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIENBUkQxNiAgcGl0Y2ggQjE2OworICAgIENBUkQxNiAgZHVyYXRpb24gQjE2OworICAgIENBUkQzMiAgbGVkX21hc2sgQjMyOworICAgIENBUkQzMiAgbGVkX3ZhbHVlcyBCMzI7CisgICAgQk9PTCAgICBnbG9iYWxfYXV0b19yZXBlYXQ7CisgICAgQ0FSRDggICBjbGljazsKKyAgICBDQVJEOCAgIHBlcmNlbnQ7CisgICAgQllURSAgICBwYWQ7CisgICAgQllURSAgICBhdXRvX3JlcGVhdHNbMzJdOworfSB4S2JkRmVlZGJhY2tTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOCAgIGNfY2xhc3M7CisjZWxzZQorICAgIENBUkQ4ICAgY2xhc3M7CisjZW5kaWYKKyAgICBDQVJEOCAgIGlkOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBDQVJEOCAgIHBhZDEscGFkMjsKKyAgICBDQVJEMTYgIGFjY2VsTnVtIEIxNjsKKyAgICBDQVJEMTYgIGFjY2VsRGVub20gQjE2OworICAgIENBUkQxNiAgdGhyZXNob2xkIEIxNjsKK30geFB0ckZlZWRiYWNrU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgQ0FSRDgJY19jbGFzczsJLyogZmVlZGJhY2sgY2xhc3MgaWQJCSovCisjZWxzZQorICAgIENBUkQ4CWNsYXNzOwkJLyogZmVlZGJhY2sgY2xhc3MgaWQJCSovCisjZW5kaWYKKyAgICBDQVJEOAlpZDsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsJLyogZmVlZGJhY2sgbGVuZ3RoCQkqLworICAgIENBUkQzMglyZXNvbHV0aW9uIEIzMjsKKyAgICBJTlQzMgltaW5fdmFsdWUgQjMyOworICAgIElOVDMyCW1heF92YWx1ZSBCMzI7Cit9IHhJbnRlZ2VyRmVlZGJhY2tTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOAljX2NsYXNzOwkvKiBmZWVkYmFjayBjbGFzcyBpZAkJKi8KKyNlbHNlCisgICAgQ0FSRDgJY2xhc3M7CQkvKiBmZWVkYmFjayBjbGFzcyBpZAkJKi8KKyNlbmRpZgorICAgIENBUkQ4CWlkOworICAgIENBUkQxNglsZW5ndGggQjE2OwkvKiBmZWVkYmFjayBsZW5ndGgJCSovCisgICAgQ0FSRDE2CW1heF9zeW1ib2xzIEIxNjsKKyAgICBDQVJEMTYJbnVtX3N5bXNfc3VwcG9ydGVkIEIxNjsKK30geFN0cmluZ0ZlZWRiYWNrU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgQ0FSRDgJY19jbGFzczsJLyogZmVlZGJhY2sgY2xhc3MgaWQJCSovCisjZWxzZQorICAgIENBUkQ4CWNsYXNzOwkJLyogZmVlZGJhY2sgY2xhc3MgaWQJCSovCisjZW5kaWYKKyAgICBDQVJEOAlpZDsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsJLyogZmVlZGJhY2sgbGVuZ3RoCQkqLworICAgIENBUkQ4CXBlcmNlbnQ7CisgICAgQllURQlwYWQxLCBwYWQyLCBwYWQzOworICAgIENBUkQxNglwaXRjaCBCMTY7CisgICAgQ0FSRDE2CWR1cmF0aW9uIEIxNjsKK30geEJlbGxGZWVkYmFja1N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4CWNfY2xhc3M7CS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2Vsc2UKKyAgICBDQVJEOAljbGFzczsJCS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2VuZGlmCisgICAgQ0FSRDgJaWQ7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CS8qIGZlZWRiYWNrIGxlbmd0aAkJKi8KKyAgICBDQVJEMzIJbGVkX21hc2sgQjMyOworICAgIENBUkQzMglsZWRfdmFsdWVzIEIzMjsKK30geExlZEZlZWRiYWNrU3RhdGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDaGFuZ2VGZWVkYmFja0NvbnRyb2wuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4CVJlcVR5cGU7ICAgICAgICAvKiBYX0NoYW5nZUZlZWRiYWNrQ29udHJvbAkqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMgltYXNrIEIzMjsKKyAgICBDQVJEOAlkZXZpY2VpZDsKKyAgICBDQVJEOAlmZWVkYmFja2lkOworICAgIEJZVEUJcGFkMSwgcGFkMjsKK30geENoYW5nZUZlZWRiYWNrQ29udHJvbFJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOAljX2NsYXNzOwkvKiBmZWVkYmFjayBjbGFzcyBpZAkJKi8KKyNlbHNlCisgICAgQ0FSRDgJY2xhc3M7CQkvKiBmZWVkYmFjayBjbGFzcyBpZAkJKi8KKyNlbmRpZgorICAgIENBUkQ4CWlkOwkJLyogZmVlZGJhY2sgaWQJCSovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CS8qIGZlZWRiYWNrIGxlbmd0aAkJKi8KK30geEZlZWRiYWNrQ3RsOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4CWNfY2xhc3M7CS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2Vsc2UKKyAgICBDQVJEOAljbGFzczsJCS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2VuZGlmCisgICAgQ0FSRDgJaWQ7CQkvKiBmZWVkYmFjayBsZW5ndGgJCSovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CS8qIGZlZWRiYWNrIGxlbmd0aAkJKi8KKyAgICBLZXlDb2RlCWtleTsKKyAgICBDQVJEOAlhdXRvX3JlcGVhdF9tb2RlOworICAgIElOVDgJY2xpY2s7CisgICAgSU5UOAlwZXJjZW50OworICAgIElOVDE2CXBpdGNoIEIxNjsKKyAgICBJTlQxNglkdXJhdGlvbiBCMTY7CisgICAgQ0FSRDMyCWxlZF9tYXNrIEIzMjsKKyAgICBDQVJEMzIJbGVkX3ZhbHVlcyBCMzI7Cit9IHhLYmRGZWVkYmFja0N0bDsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOAljX2NsYXNzOwkvKiBmZWVkYmFjayBjbGFzcyBpZAkJKi8KKyNlbHNlCisgICAgQ0FSRDgJY2xhc3M7CQkvKiBmZWVkYmFjayBjbGFzcyBpZAkJKi8KKyNlbmRpZgorICAgIENBUkQ4CWlkOwkJLyogZmVlZGJhY2sgaWQJCSovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CS8qIGZlZWRiYWNrIGxlbmd0aAkJKi8KKyAgICBDQVJEOAlwYWQxLHBhZDI7CisgICAgSU5UMTYJbnVtIEIxNjsKKyAgICBJTlQxNglkZW5vbSBCMTY7CisgICAgSU5UMTYJdGhyZXNoIEIxNjsKK30geFB0ckZlZWRiYWNrQ3RsOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4CWNfY2xhc3M7CS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2Vsc2UKKyAgICBDQVJEOAljbGFzczsJCS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2VuZGlmCisgICAgQ0FSRDgJaWQ7CQkvKiBmZWVkYmFjayBpZAkJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsJLyogZmVlZGJhY2sgbGVuZ3RoCQkqLworICAgIElOVDMyCWludF90b19kaXNwbGF5IEIzMjsKK30geEludGVnZXJGZWVkYmFja0N0bDsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOAljX2NsYXNzOwkvKiBmZWVkYmFjayBjbGFzcyBpZAkJKi8KKyNlbHNlCisgICAgQ0FSRDgJY2xhc3M7CQkvKiBmZWVkYmFjayBjbGFzcyBpZAkJKi8KKyNlbmRpZgorICAgIENBUkQ4CWlkOwkJLyogZmVlZGJhY2sgaWQJCSovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CS8qIGZlZWRiYWNrIGxlbmd0aAkJKi8KKyAgICBDQVJEOAlwYWQxLHBhZDI7CisgICAgQ0FSRDE2CW51bV9rZXlzeW1zIEIxNjsKK30geFN0cmluZ0ZlZWRiYWNrQ3RsOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4CWNfY2xhc3M7CS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2Vsc2UKKyAgICBDQVJEOAljbGFzczsJCS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2VuZGlmCisgICAgQ0FSRDgJaWQ7CQkvKiBmZWVkYmFjayBpZAkJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsJLyogZmVlZGJhY2sgbGVuZ3RoCQkqLworICAgIElOVDgJcGVyY2VudDsKKyAgICBCWVRFCXBhZDEsIHBhZDIsIHBhZDM7CisgICAgSU5UMTYJcGl0Y2ggQjE2OworICAgIElOVDE2CWR1cmF0aW9uIEIxNjsKK30geEJlbGxGZWVkYmFja0N0bDsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOAljX2NsYXNzOwkvKiBmZWVkYmFjayBjbGFzcyBpZAkJKi8KKyNlbHNlCisgICAgQ0FSRDgJY2xhc3M7CQkvKiBmZWVkYmFjayBjbGFzcyBpZAkJKi8KKyNlbmRpZgorICAgIENBUkQ4CWlkOwkJLyogZmVlZGJhY2sgaWQJCSovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CS8qIGZlZWRiYWNrIGxlbmd0aAkJKi8KKyAgICBDQVJEMzIJbGVkX21hc2sgQjMyOworICAgIENBUkQzMglsZWRfdmFsdWVzIEIzMjsKK30geExlZEZlZWRiYWNrQ3RsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR2V0RGV2aWNlS2V5TWFwcGluZy4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7ICAgICAgICAvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZSAgICovCisgICAgQ0FSRDgJUmVxVHlwZTsJLyogYWx3YXlzIFhfR2V0RGV2aWNlS2V5TWFwcGluZyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4CWRldmljZWlkOworICAgIEtleUNvZGUJZmlyc3RLZXlDb2RlOworICAgIENBUkQ4CWNvdW50OworICAgIEJZVEUJcGFkMTsKK30geEdldERldmljZUtleU1hcHBpbmdSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXBUeXBlOwkvKiBYX1JlcGx5CQkJKi8KKyAgICBDQVJEOAlSZXBUeXBlOwkvKiBhbHdheXMgWF9HZXREZXZpY2VLZXlNYXBwaW5nICovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEOAlrZXlTeW1zUGVyS2V5Q29kZTsKKyAgICBDQVJEOAlwYWQwOworICAgIENBUkQxNglwYWQxIEIxNjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7CisgICAgQ0FSRDMyCXBhZDYgQjMyOworfSB4R2V0RGV2aWNlS2V5TWFwcGluZ1JlcGx5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ2hhbmdlRGV2aWNlS2V5TWFwcGluZy4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7ICAgICAgICAvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZSAgICovCisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0NoYW5nZURldmljZUtleU1hcHBpbmcgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOAlkZXZpY2VpZDsKKyAgICBLZXlDb2RlCWZpcnN0S2V5Q29kZTsKKyAgICBDQVJEOAlrZXlTeW1zUGVyS2V5Q29kZTsKKyAgICBDQVJEOAlrZXlDb2RlczsKK30geENoYW5nZURldmljZUtleU1hcHBpbmdSZXE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZXREZXZpY2VNb2RpZmllck1hcHBpbmcuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOyAgICAgICAgLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUgICAqLworICAgIENBUkQ4CVJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9HZXREZXZpY2VNb2RpZmllck1hcHBpbmcgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOAlkZXZpY2VpZDsKKyAgICBCWVRFCXBhZDEsIHBhZDIsIHBhZDM7Cit9IHhHZXREZXZpY2VNb2RpZmllck1hcHBpbmdSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXBUeXBlOwkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJUmVwVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0dldERldmljZU1vZGlmaWVyTWFwcGluZyAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDgJbnVtS2V5UGVyTW9kaWZpZXI7CisgICAgQ0FSRDgJcGFkMDsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKK30geEdldERldmljZU1vZGlmaWVyTWFwcGluZ1JlcGx5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2V0RGV2aWNlTW9kaWZpZXJNYXBwaW5nLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsgICAgICAgIC8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlICAgKi8KKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfU2V0RGV2aWNlTW9kaWZpZXJNYXBwaW5nICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDgJZGV2aWNlaWQ7CisgICAgQ0FSRDgJbnVtS2V5UGVyTW9kaWZpZXI7CisgICAgQ0FSRDE2CXBhZDEgQjE2OworfSB4U2V0RGV2aWNlTW9kaWZpZXJNYXBwaW5nUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVwVHlwZTsJLyogWF9SZXBseSAqLworICAgIENBUkQ4CVJlcFR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9TZXREZXZpY2VNb2RpZmllck1hcHBpbmcgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQ4CXN1Y2Nlc3M7CisgICAgQ0FSRDgJcGFkMDsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKK30geFNldERldmljZU1vZGlmaWVyTWFwcGluZ1JlcGx5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR2V0RGV2aWNlQnV0dG9uTWFwcGluZy4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgIC8qIFhfR2V0RGV2aWNlQnV0dG9uTWFwcGluZyAgICAgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOAlkZXZpY2VpZDsKKyAgICBCWVRFCXBhZDEsIHBhZDIsIHBhZDM7Cit9IHhHZXREZXZpY2VCdXR0b25NYXBwaW5nUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVwVHlwZTsJLyogWF9SZXBseSAqLworICAgIENBUkQ4CVJlcFR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9HZXREZXZpY2VCdXR0b25NYXBwaW5nICovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEOAluRWx0czsKKyAgICBCWVRFCXBhZDEsIHBhZDIsIHBhZDM7CisgICAgQ0FSRDMyCXBhZDAxIEIzMjsKKyAgICBDQVJEMzIJcGFkMDIgQjMyOworICAgIENBUkQzMglwYWQwMyBCMzI7CisgICAgQ0FSRDMyCXBhZDA0IEIzMjsKKyAgICBDQVJEMzIJcGFkMDUgQjMyOworfSB4R2V0RGV2aWNlQnV0dG9uTWFwcGluZ1JlcGx5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2V0RGV2aWNlQnV0dG9uTWFwcGluZy4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgIC8qIFhfU2V0RGV2aWNlQnV0dG9uTWFwcGluZyAgICAgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOAlkZXZpY2VpZDsKKyAgICBDQVJEOAltYXBfbGVuZ3RoOworICAgIEJZVEUJcGFkMSwgcGFkMjsKK30geFNldERldmljZUJ1dHRvbk1hcHBpbmdSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXBUeXBlOwkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CVJlcFR5cGU7CS8qIGFsd2F5cyBYX1NldERldmljZUJ1dHRvbk1hcHBpbmcgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQ4CXN0YXR1czsKKyAgICBCWVRFCXBhZDA7CisgICAgQ0FSRDE2CXBhZDEgQjE2OworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKKyAgICBDQVJEMzIJcGFkNiBCMzI7Cit9IHhTZXREZXZpY2VCdXR0b25NYXBwaW5nUmVwbHk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBRdWVyeURldmljZVN0YXRlLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfUXVlcnlEZXZpY2VTdGF0ZSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4CWRldmljZWlkOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKK30geFF1ZXJ5RGV2aWNlU3RhdGVSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXBUeXBlOwkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CVJlcFR5cGU7CS8qIGFsd2F5cyBYX1F1ZXJ5RGV2aWNlU3RhdGUJKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQ4CW51bV9jbGFzc2VzOworICAgIEJZVEUJcGFkMDsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKK30geFF1ZXJ5RGV2aWNlU3RhdGVSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOAljX2NsYXNzOworI2Vsc2UKKyAgICBDQVJEOAljbGFzczsKKyNlbmRpZgorICAgIENBUkQ4CWxlbmd0aDsKKyAgICBDQVJEOAludW1fa2V5czsKKyAgICBCWVRFCXBhZDE7CisgICAgQ0FSRDgJa2V5c1szMl07Cit9IHhLZXlTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOAljX2NsYXNzOworI2Vsc2UKKyAgICBDQVJEOAljbGFzczsKKyNlbmRpZgorICAgIENBUkQ4CWxlbmd0aDsKKyAgICBDQVJEOAludW1fYnV0dG9uczsKKyAgICBCWVRFCXBhZDE7CisgICAgQ0FSRDgJYnV0dG9uc1szMl07Cit9IHhCdXR0b25TdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOAljX2NsYXNzOworI2Vsc2UKKyAgICBDQVJEOAljbGFzczsKKyNlbmRpZgorICAgIENBUkQ4CWxlbmd0aDsKKyAgICBDQVJEOAludW1fdmFsdWF0b3JzOworICAgIENBUkQ4CW1vZGU7Cit9IHhWYWx1YXRvclN0YXRlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2VuZEV4dGVuc2lvbkV2ZW50LgorICogVEhJUyBSRVFVRVNUIE1VU1QgQkUgS0VQVCBBIE1VTFRJUExFIE9GIDggQllURVMgSU4gTEVOR1RIIQorICogTU9SRSBFVkVOVFMgTUFZIEZPTExPVyBBTkQgVEhFWSBNVVNUIEJFIFFVQUQtQUxJR05FRCEKKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX1NlbmRFeHRlbnNpb25FdmVudCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFdpbmRvdwlkZXN0aW5hdGlvbiBCMzI7CisgICAgQ0FSRDgJZGV2aWNlaWQ7CisgICAgQk9PTAlwcm9wYWdhdGU7CisgICAgQ0FSRDE2CWNvdW50IEIxNjsKKyAgICBDQVJEOAludW1fZXZlbnRzOworICAgIEJZVEUJcGFkMSxwYWQyLHBhZDM7Cit9IHhTZW5kRXh0ZW5zaW9uRXZlbnRSZXE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXZpY2VCZWxsLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfRGV2aWNlQmVsbCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4CWRldmljZWlkOworICAgIENBUkQ4CWZlZWRiYWNraWQ7CisgICAgQ0FSRDgJZmVlZGJhY2tjbGFzczsKKyAgICBJTlQ4CXBlcmNlbnQ7Cit9IHhEZXZpY2VCZWxsUmVxOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2V0RGV2aWNlVmFsdWF0b3JzLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOAlSZXFUeXBlOwkvKiBhbHdheXMgWF9TZXREZXZpY2VWYWx1YXRvcnMJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOCAgICAgICBkZXZpY2VpZDsKKyAgICBDQVJEOCAgICAgICBmaXJzdF92YWx1YXRvcjsKKyAgICBDQVJEOCAgICAgICBudW1fdmFsdWF0b3JzOworICAgIEJZVEUJcGFkMTsKK30geFNldERldmljZVZhbHVhdG9yc1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcFR5cGU7CS8qIFhfUmVwbHkJCQkqLworICAgIENBUkQ4CVJlcFR5cGU7CS8qIGFsd2F5cyBYX1NldERldmljZVZhbHVhdG9ycwkqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDgJc3RhdHVzOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKKyAgICBDQVJEMzIJcGFkMDEgQjMyOworICAgIENBUkQzMglwYWQwMiBCMzI7CisgICAgQ0FSRDMyCXBhZDAzIEIzMjsKKyAgICBDQVJEMzIJcGFkMDQgQjMyOworICAgIENBUkQzMglwYWQwNSBCMzI7Cit9IHhTZXREZXZpY2VWYWx1YXRvcnNSZXBseTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdldERldmljZUNvbnRyb2wuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4CVJlcVR5cGU7CS8qIGFsd2F5cyBYX0dldERldmljZUNvbnRyb2wJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYgICAgICBjb250cm9sIEIxNjsKKyAgICBDQVJEOCAgICAgICBkZXZpY2VpZDsKKyAgICBCWVRFCXBhZDI7Cit9IHhHZXREZXZpY2VDb250cm9sUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVwVHlwZTsJLyogWF9SZXBseQkJCSovCisgICAgQ0FSRDgJUmVwVHlwZTsJLyogYWx3YXlzIFhfR2V0RGV2aWNlQ29udHJvbAkqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDgJc3RhdHVzOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKKyAgICBDQVJEMzIJcGFkMDEgQjMyOworICAgIENBUkQzMglwYWQwMiBCMzI7CisgICAgQ0FSRDMyCXBhZDAzIEIzMjsKKyAgICBDQVJEMzIJcGFkMDQgQjMyOworICAgIENBUkQzMglwYWQwNSBCMzI7Cit9IHhHZXREZXZpY2VDb250cm9sUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEMTYJY29udHJvbCBCMTY7CS8qIGNvbnRyb2wgdHlwZQkJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsJLyogY29udHJvbCBsZW5ndGgJCSovCit9IHhEZXZpY2VTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQxNgljb250cm9sIEIxNjsJCS8qIGNvbnRyb2wgdHlwZQkJKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsJCS8qIGNvbnRyb2wgbGVuZ3RoCQkqLworICAgIENBUkQzMgludW1fdmFsdWF0b3JzIEIzMjsJLyogbnVtYmVyIG9mIHZhbHVhdG9ycwkJKi8KK30geERldmljZVJlc29sdXRpb25TdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICBDQVJEMTYgICAgICAgICBjb250cm9sIEIxNjsKKyAgICAgQ0FSRDE2ICAgICAgICAgbGVuZ3RoIEIxNjsKKyAgICAgSU5UMzIgICAgICAgICAgbWluX3ggQjMyOworICAgICBJTlQzMiAgICAgICAgICBtYXhfeCBCMzI7CisgICAgIElOVDMyICAgICAgICAgIG1pbl95IEIzMjsKKyAgICAgSU5UMzIgICAgICAgICAgbWF4X3kgQjMyOworICAgICBDQVJEMzIgICAgICAgICBmbGlwX3ggQjMyOworICAgICBDQVJEMzIgICAgICAgICBmbGlwX3kgQjMyOworICAgICBDQVJEMzIgICAgICAgICByb3RhdGlvbiBCMzI7CisgICAgIENBUkQzMiAgICAgICAgIGJ1dHRvbl90aHJlc2hvbGQgQjMyOworfSB4RGV2aWNlQWJzQ2FsaWJTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICBDQVJEMTYgICAgICAgICBjb250cm9sIEIxNjsKKyAgICAgQ0FSRDE2ICAgICAgICAgbGVuZ3RoIEIxNjsKKyAgICAgQ0FSRDMyICAgICAgICAgb2Zmc2V0X3ggQjMyOworICAgICBDQVJEMzIgICAgICAgICBvZmZzZXRfeSBCMzI7CisgICAgIENBUkQzMiAgICAgICAgIHdpZHRoIEIzMjsKKyAgICAgQ0FSRDMyICAgICAgICAgaGVpZ2h0IEIzMjsKKyAgICAgQ0FSRDMyICAgICAgICAgc2NyZWVuIEIzMjsKKyAgICAgQ0FSRDMyICAgICAgICAgZm9sbG93aW5nIEIzMjsKK30geERldmljZUFic0FyZWFTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQxNiAgICAgIGNvbnRyb2wgQjE2OyAgICAgICAgICAgIC8qIGNvbnRyb2wgdHlwZSAgICAgICAgICAgICAgICAgKi8KKyAgICBDQVJEMTYgICAgICBsZW5ndGggIEIxNjsgICAgICAgICAgICAvKiBjb250cm9sIGxlbmd0aCAgICAgICAgICAgICAgICovCisgICAgQ0FSRDggICAgICAgc3RhdHVzOworICAgIENBUkQ4ICAgICAgIGlzY29yZTsKKyAgICBDQVJEMTYgICAgICBwYWQxIEIxNjsKK30geERldmljZUNvcmVTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQxNiAgICAgIGNvbnRyb2wgQjE2OyAgICAgICAgICAgIC8qIGNvbnRyb2wgdHlwZSAgICAgICAgICAgICAgICAgKi8KKyAgICBDQVJEMTYgICAgICBsZW5ndGggIEIxNjsgICAgICAgICAgICAvKiBjb250cm9sIGxlbmd0aCAgICAgICAgICAgICAgICovCisgICAgQ0FSRDggICAgICAgZW5hYmxlOworICAgIENBUkQ4ICAgICAgIHBhZDA7CisgICAgQ0FSRDE2ICAgICAgcGFkMSBCMTY7Cit9IHhEZXZpY2VFbmFibGVTdGF0ZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENoYW5nZURldmljZUNvbnRyb2wuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4CVJlcVR5cGU7CS8qIGFsd2F5cyBYX0NoYW5nZURldmljZUNvbnRyb2wgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYgICAgICBjb250cm9sIEIxNjsKKyAgICBDQVJEOCAgICAgICBkZXZpY2VpZDsKKyAgICBCWVRFICAgICAgICBwYWQwOworfSB4Q2hhbmdlRGV2aWNlQ29udHJvbFJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcFR5cGU7CS8qIFhfUmVwbHkJCQkqLworICAgIENBUkQ4CVJlcFR5cGU7CS8qIGFsd2F5cyBYX0NoYW5nZURldmljZUNvbnRyb2wJKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQ4CXN0YXR1czsKKyAgICBCWVRFCXBhZDEsIHBhZDIsIHBhZDM7CisgICAgQ0FSRDMyCXBhZDAxIEIzMjsKKyAgICBDQVJEMzIJcGFkMDIgQjMyOworICAgIENBUkQzMglwYWQwMyBCMzI7CisgICAgQ0FSRDMyCXBhZDA0IEIzMjsKKyAgICBDQVJEMzIJcGFkMDUgQjMyOworfSB4Q2hhbmdlRGV2aWNlQ29udHJvbFJlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDE2CWNvbnRyb2wgQjE2OwkvKiBjb250cm9sIHR5cGUJCSovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CS8qIGNvbnRyb2wgbGVuZ3RoCQkqLworfSB4RGV2aWNlQ3RsOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDE2CWNvbnRyb2wgQjE2OwkJLyogY29udHJvbCB0eXBlCQkqLworICAgIENBUkQxNglsZW5ndGggQjE2OwkJLyogY29udHJvbCBsZW5ndGgJCSovCisgICAgQ0FSRDgJZmlyc3RfdmFsdWF0b3I7CQkvKiBmaXJzdCB2YWx1YXRvciB0byBjaGFuZ2UgICAgICovCisgICAgQ0FSRDgJbnVtX3ZhbHVhdG9yczsJCS8qIG51bWJlciBvZiB2YWx1YXRvcnMgdG8gY2hhbmdlKi8KKyAgICBDQVJEOAlwYWQxLHBhZDI7Cit9IHhEZXZpY2VSZXNvbHV0aW9uQ3RsOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgIENBUkQxNiAgICAgICAgIGNvbnRyb2wgQjE2OworICAgICBDQVJEMTYgICAgICAgICBsZW5ndGggQjE2OworICAgICBJTlQzMiAgICAgICAgICBtaW5feDsKKyAgICAgSU5UMzIgICAgICAgICAgbWF4X3g7CisgICAgIElOVDMyICAgICAgICAgIG1pbl95OworICAgICBJTlQzMiAgICAgICAgICBtYXhfeTsKKyAgICAgQ0FSRDMyICAgICAgICAgZmxpcF94OworICAgICBDQVJEMzIgICAgICAgICBmbGlwX3k7CisgICAgIENBUkQzMiAgICAgICAgIHJvdGF0aW9uOworICAgICBDQVJEMzIgICAgICAgICBidXR0b25fdGhyZXNob2xkOworfSB4RGV2aWNlQWJzQ2FsaWJDdGw7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgQ0FSRDE2ICAgICAgICAgY29udHJvbCBCMTY7CisgICAgIENBUkQxNiAgICAgICAgIGxlbmd0aCBCMTY7CisgICAgIENBUkQzMiAgICAgICAgIG9mZnNldF94OworICAgICBDQVJEMzIgICAgICAgICBvZmZzZXRfeTsKKyAgICAgSU5UMzIgICAgICAgICAgd2lkdGg7CisgICAgIElOVDMyICAgICAgICAgIGhlaWdodDsKKyAgICAgSU5UMzIgICAgICAgICAgc2NyZWVuOworICAgICBDQVJEMzIgICAgICAgICBmb2xsb3dpbmc7Cit9IHhEZXZpY2VBYnNBcmVhQ3RsOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDE2ICAgICAgICAgIGNvbnRyb2wgQjE2OworICAgIENBUkQxNiAgICAgICAgICBsZW5ndGggIEIxNjsKKyAgICBDQVJEOCAgICAgICAgICAgc3RhdHVzOworICAgIENBUkQ4ICAgICAgICAgICBwYWQwOworICAgIENBUkQxNiAgICAgICAgICBwYWQxIEIxNjsKK30geERldmljZUNvcmVDdGw7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEMTYgICAgICAgICAgY29udHJvbCBCMTY7CisgICAgQ0FSRDE2ICAgICAgICAgIGxlbmd0aCAgQjE2OworICAgIENBUkQ4ICAgICAgICAgICBlbmFibGU7CisgICAgQ0FSRDggICAgICAgICAgIHBhZDA7CisgICAgQ0FSRDE2ICAgICAgICAgIHBhZDEgQjE2OworfSB4RGV2aWNlRW5hYmxlQ3RsOworCisvKiBYSSAxLjUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIExpc3REZXZpY2VQcm9wZXJ0aWVzLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICAgICAgcmVxVHlwZTsgICAgICAgIC8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBvcGNvZGUgKi8KKyAgICBDQVJEOCAgICAgICBSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfTGlzdERldmljZVByb3BlcnRpZXMgKi8KKyAgICBDQVJEMTYgICAgICBsZW5ndGggQjE2OworICAgIENBUkQ4ICAgICAgIGRldmljZWlkOworICAgIENBUkQ4ICAgICAgIHBhZDA7CisgICAgQ0FSRDE2ICAgICAgcGFkMSBCMTY7Cit9IHhMaXN0RGV2aWNlUHJvcGVydGllc1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgICAgIHJlcFR5cGU7ICAgICAgICAvKiBYX1JlcGx5ICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIENBUkQ4ICAgICAgIFJlcFR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9MaXN0RGV2aWNlUHJvcGVydGllcyAqLworICAgIENBUkQxNiAgICAgIHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgICAgICBsZW5ndGggQjMyOworICAgIENBUkQxNiAgICAgIG5BdG9tcyBCMTY7CisgICAgQ0FSRDE2ICAgICAgcGFkMSBCMTY7CisgICAgQ0FSRDMyICAgICAgcGFkMiBCMzI7CisgICAgQ0FSRDMyICAgICAgcGFkMyBCMzI7CisgICAgQ0FSRDMyICAgICAgcGFkNCBCMzI7CisgICAgQ0FSRDMyICAgICAgcGFkNSBCMzI7CisgICAgQ0FSRDMyICAgICAgcGFkNiBCMzI7Cit9IHhMaXN0RGV2aWNlUHJvcGVydGllc1JlcGx5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ2hhbmdlRGV2aWNlUHJvcGVydHkuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgICAgICByZXFUeXBlOyAgICAgICAgLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIG9wY29kZSAqLworICAgIENBUkQ4ICAgICAgIFJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9DaGFuZ2VEZXZpY2VQcm9wZXJ0eSAqLworICAgIENBUkQxNiAgICAgIGxlbmd0aCBCMTY7CisgICAgQXRvbSAgICAgICAgcHJvcGVydHkgQjMyOworICAgIEF0b20gICAgICAgIHR5cGUgQjMyOworICAgIENBUkQ4ICAgICAgIGRldmljZWlkOworICAgIENBUkQ4ICAgICAgIGZvcm1hdDsKKyAgICBDQVJEOCAgICAgICBtb2RlOworICAgIENBUkQ4ICAgICAgIHBhZDsKKyAgICBDQVJEMzIgICAgICBuVW5pdHMgQjMyOworfSB4Q2hhbmdlRGV2aWNlUHJvcGVydHlSZXE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZWxldGVEZXZpY2VQcm9wZXJ0eS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgICAgIHJlcVR5cGU7ICAgICAgICAvKiBpbnB1dCBleHRlbnNpb24gbWFqb3Igb3Bjb2RlICovCisgICAgQ0FSRDggICAgICAgUmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0RlbGV0ZURldmljZVByb3BlcnR5ICovCisgICAgQ0FSRDE2ICAgICAgbGVuZ3RoIEIxNjsKKyAgICBBdG9tICAgICAgICBwcm9wZXJ0eSBCMzI7CisgICAgQ0FSRDggICAgICAgZGV2aWNlaWQ7CisgICAgQ0FSRDggICAgICAgcGFkMDsKKyAgICBDQVJEMTYgICAgICBwYWQxIEIxNjsKK30geERlbGV0ZURldmljZVByb3BlcnR5UmVxOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR2V0RGV2aWNlUHJvcGVydHkuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgICAgICByZXFUeXBlOyAgICAgICAgLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIG9wY29kZSAqLworICAgIENBUkQ4ICAgICAgIFJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9HZXREZXZpY2VQcm9wZXJ0eSAqLworICAgIENBUkQxNiAgICAgIGxlbmd0aCBCMTY7CisgICAgQXRvbSAgICAgICAgcHJvcGVydHkgQjMyOworICAgIEF0b20gICAgICAgIHR5cGUgQjMyOworICAgIENBUkQzMiAgICAgIGxvbmdPZmZzZXQgQjMyOworICAgIENBUkQzMiAgICAgIGxvbmdMZW5ndGggQjMyOworICAgIENBUkQ4ICAgICAgIGRldmljZWlkOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBCT09MICAgICAgICBjX2RlbGV0ZTsKKyNlbHNlCisgICAgQk9PTCAgICAgICAgZGVsZXRlOworI2VuZGlmCisgICAgQ0FSRDE2ICAgICAgcGFkOworfSB4R2V0RGV2aWNlUHJvcGVydHlSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgICAgICByZXBUeXBlOyAgICAgICAgLyogWF9SZXBseSAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ0FSRDggICAgICAgUmVwVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0dldERldmljZVByb3BlcnR5ICAgKi8KKyAgICBDQVJEMTYgICAgICBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyICAgICAgbGVuZ3RoIEIzMjsKKyAgICBBdG9tICAgICAgICBwcm9wZXJ0eVR5cGUgQjMyOworICAgIENBUkQzMiAgICAgIGJ5dGVzQWZ0ZXIgQjMyOworICAgIENBUkQzMiAgICAgIG5JdGVtcyBCMzI7CisgICAgQ0FSRDggICAgICAgZm9ybWF0OworICAgIENBUkQ4ICAgICAgIGRldmljZWlkOworICAgIENBUkQxNiAgICAgIHBhZDEgQjE2OworICAgIENBUkQzMiAgICAgIHBhZDIgQjMyOworICAgIENBUkQzMiAgICAgIHBhZDMgQjMyOworfSB4R2V0RGV2aWNlUHJvcGVydHlSZXBseTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIElucHV0IGV4dGVuc2lvbiBldmVudHMuCisgKgorICogRGV2aWNlVmFsdWF0b3IKKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgQllURQl0eXBlOworICAgIENBUkQ4ICAgICAgIGRldmljZWlkOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgS2V5QnV0TWFzayAgZGV2aWNlX3N0YXRlIEIxNjsKKyAgICBDQVJEOAludW1fdmFsdWF0b3JzOworICAgIENBUkQ4ICAgICAgIGZpcnN0X3ZhbHVhdG9yOworICAgIElOVDMyCXZhbHVhdG9yMCBCMzI7CisgICAgSU5UMzIJdmFsdWF0b3IxIEIzMjsKKyAgICBJTlQzMgl2YWx1YXRvcjIgQjMyOworICAgIElOVDMyCXZhbHVhdG9yMyBCMzI7CisgICAgSU5UMzIJdmFsdWF0b3I0IEIzMjsKKyAgICBJTlQzMgl2YWx1YXRvcjUgQjMyOworICAgIH0gIGRldmljZVZhbHVhdG9yOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERldmljZUtleUJ1dHRvblBvaW50ZXIuCisgKgorICogVXNlZCBmb3I6IERldmljZUtleVByZXNzLCBEZXZpY2VLZXlSZWxlYXNlLAorICoJICAgICBEZXZpY2VCdXR0b25QcmVzcywgRGV2aWNlQnV0dG9uUmVsZWFzZSwKKyAqCSAgICAgUHJveGltaXR5SW4sIFByb3hpbWl0eU91dAorICoJICAgICBEZXZpY2VNb3Rpb25Ob3RpZnksCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFICAgICAgICBkZXRhaWw7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lICAgICAgICB0aW1lIEIzMjsKKyAgICBXaW5kb3cgICAgICByb290IEIzMjsKKyAgICBXaW5kb3cgICAgICBldmVudCBCMzI7CisgICAgV2luZG93ICAgICAgY2hpbGQgQjMyOworICAgIElOVDE2ICAgICAgIHJvb3RfeCBCMTY7CisgICAgSU5UMTYgICAgICAgcm9vdF95IEIxNjsKKyAgICBJTlQxNiAgICAgICBldmVudF94IEIxNjsKKyAgICBJTlQxNiAgICAgICBldmVudF95IEIxNjsKKyAgICBLZXlCdXRNYXNrICBzdGF0ZSBCMTY7CisgICAgQk9PTCAgICAgICAgc2FtZV9zY3JlZW47CisgICAgQ0FSRDggICAgICAgZGV2aWNlaWQ7CisgICAgfSAgZGV2aWNlS2V5QnV0dG9uUG9pbnRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXZpY2VGb2N1cy4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgQllURQl0eXBlOworICAgIEJZVEUgICAgICAgIGRldGFpbDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIFRpbWUgICAgICAgIHRpbWUgQjMyOworICAgIFdpbmRvdyAgICAgIHdpbmRvdyBCMzI7CisgICAgQllURQltb2RlOworICAgIENBUkQ4ICAgICAgIGRldmljZWlkOworICAgIEJZVEUJcGFkMSwgcGFkMjsKKyAgICBDQVJEMzIJcGFkMDAgQjMyOworICAgIENBUkQzMglwYWQwMSBCMzI7CisgICAgQ0FSRDMyCXBhZDAyIEIzMjsKKyAgICBDQVJEMzIJcGFkMDMgQjMyOworICAgIH0gIGRldmljZUZvY3VzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERldmljZVN0YXRlTm90aWZ5LgorICoKKyAqIE5vdGUgdGhhdCB0aGUgdHdvIGhpZ2gtb3JkZXIgYml0cyBpbiB0aGUgY2xhc3Nlc19yZXBvcnRlZAorICogZmllbGQgYXJlIHRoZSBwcm94aW1pdHkgc3RhdGUgKEluUHJveGltaXR5IG9yIE91dE9mUHJveGltaXR5KSwKKyAqIGFuZCB0aGUgZGV2aWNlIG1vZGUgKEFic29sdXRlIG9yIFJlbGF0aXZlKSwgcmVzcGVjdGl2ZWx5LgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURSAgICAgICAgZGV2aWNlaWQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lICAgICAgICB0aW1lIEIzMjsKKyAgICBDQVJEOAludW1fa2V5czsKKyAgICBDQVJEOAludW1fYnV0dG9uczsKKyAgICBDQVJEOAludW1fdmFsdWF0b3JzOworICAgIENBUkQ4ICAgICAgIGNsYXNzZXNfcmVwb3J0ZWQ7CisgICAgQ0FSRDggICAgICAgYnV0dG9uc1s0XTsKKyAgICBDQVJEOCAgICAgICBrZXlzWzRdOworICAgIElOVDMyCXZhbHVhdG9yMCBCMzI7CisgICAgSU5UMzIJdmFsdWF0b3IxIEIzMjsKKyAgICBJTlQzMgl2YWx1YXRvcjIgQjMyOworICAgIH0gIGRldmljZVN0YXRlTm90aWZ5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERldmljZUtleVN0YXRlTm90aWZ5LgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURSAgICAgICAgZGV2aWNlaWQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEOCAgICAgICBrZXlzWzI4XTsKKyAgICB9ICBkZXZpY2VLZXlTdGF0ZU5vdGlmeTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXZpY2VCdXR0b25TdGF0ZU5vdGlmeS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgQllURQl0eXBlOworICAgIEJZVEUgICAgICAgIGRldmljZWlkOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDggICAgICAgYnV0dG9uc1syOF07CisgICAgfSAgZGV2aWNlQnV0dG9uU3RhdGVOb3RpZnk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGV2aWNlTWFwcGluZ05vdGlmeS4KKyAqIEZpZWxkcyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIGNvcmUgbWFwcGluZ25vdGlmeSBldmVudC4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgQllURQl0eXBlOworICAgIEJZVEUgICAgICAgIGRldmljZWlkOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDggICAgICAgcmVxdWVzdDsKKyAgICBLZXlDb2RlICAgICBmaXJzdEtleUNvZGU7CisgICAgQ0FSRDggICAgICAgY291bnQ7CisgICAgQllURSAgICAgICAgcGFkMTsKKyAgICBUaW1lICAgICAgICB0aW1lIEIzMjsKKyAgICBDQVJEMzIJcGFkMDAgQjMyOworICAgIENBUkQzMglwYWQwMSBCMzI7CisgICAgQ0FSRDMyCXBhZDAyIEIzMjsKKyAgICBDQVJEMzIJcGFkMDMgQjMyOworICAgIENBUkQzMglwYWQwNCBCMzI7CisgICAgfSAgZGV2aWNlTWFwcGluZ05vdGlmeTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDaGFuZ2VEZXZpY2VOb3RpZnkuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFICAgICAgICBkZXZpY2VpZDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIFRpbWUgICAgICAgIHRpbWUgQjMyOworICAgIENBUkQ4ICAgICAgIHJlcXVlc3Q7CisgICAgQllURSAgICAgICAgcGFkMSwgcGFkMiwgcGFkMzsKKyAgICBDQVJEMzIJcGFkMDAgQjMyOworICAgIENBUkQzMglwYWQwMSBCMzI7CisgICAgQ0FSRDMyCXBhZDAyIEIzMjsKKyAgICBDQVJEMzIJcGFkMDMgQjMyOworICAgIENBUkQzMglwYWQwNCBCMzI7CisgICAgfSAgY2hhbmdlRGV2aWNlTm90aWZ5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGRldmljZVByZXNlbmNlTm90aWZ5LgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURSAgICAgICAgcGFkMDA7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lICAgICAgICB0aW1lIEIzMjsKKyAgICBCWVRFICAgICAgICBkZXZjaGFuZ2U7IC8qIERldmljZXtBZGRlZHxSZW1vdmVkfEVuYWJsZWR8RGlzYWJsZWR8Q29udHJvbENoYW5nZWR9ICovCisgICAgQllURSAgICAgICAgZGV2aWNlaWQ7CisgICAgQ0FSRDE2ICAgICAgY29udHJvbCBCMTY7CisgICAgQ0FSRDMyCXBhZDAyIEIzMjsKKyAgICBDQVJEMzIJcGFkMDMgQjMyOworICAgIENBUkQzMglwYWQwNCBCMzI7CisgICAgQ0FSRDMyCXBhZDA1IEIzMjsKKyAgICBDQVJEMzIJcGFkMDYgQjMyOworICAgIH0gIGRldmljZVByZXNlbmNlTm90aWZ5OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERldmljZVByb3BlcnR5Tm90aWZ5RXZlbnQKKyAqCisgKiBTZW50IHdoZW5ldmVyIGEgZGV2aWNlJ3MgcHJvcGVydHkgY2hhbmdlcy4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgQllURSAgICAgICAgdHlwZTsKKyAgICBCWVRFICAgICAgICBzdGF0ZTsgICAgICAgICAgICAgICAvKiBOZXdWYWx1ZSBvciBEZWxldGVkICovCisgICAgQ0FSRDE2ICAgICAgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiAgICAgIHRpbWUgQjMyOworICAgIEF0b20gICAgICAgIGF0b20gQjMyOyAgICAgICAgICAgIC8qIGFmZmVjdGVkIHByb3BlcnR5ICovCisgICAgQ0FSRDMyICAgICAgcGFkMCBCMzI7CisgICAgQ0FSRDMyICAgICAgcGFkMSBCMzI7CisgICAgQ0FSRDMyICAgICAgcGFkMiBCMzI7CisgICAgQ0FSRDMyICAgICAgcGFkMyBCMzI7CisgICAgQ0FSRDE2ICAgICAgcGFkNSBCMTY7CisgICAgQ0FSRDggICAgICAgcGFkNDsKKyAgICBDQVJEOCAgICAgICBkZXZpY2VpZDsgICAgICAgICAgICAvKiBpZCBvZiBkZXZpY2UgKi8KKyAgICB9IGRldmljZVByb3BlcnR5Tm90aWZ5OworCisjdW5kZWYgV2luZG93CisjdW5kZWYgVGltZQorI3VuZGVmIEtleUNvZGUKKyN1bmRlZiBNYXNrCisjdW5kZWYgQXRvbQorI3VuZGVmIEN1cnNvcgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEtCLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hLQi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYjNiYzAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hLQi5oCkBAIC0wLDAgKzEsNzg4IEBACisvKiAkWG9yZzogWEtCLmgsdiAxLjMgMjAwMC8wOC8xOCAwNDowNTo0NSBjb3NrcmV5IEV4cCAkICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDE5OTMgYnkgU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKK3NvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQKK2ZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodAorbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBTaWxpY29uIEdyYXBoaWNzIG5vdCBiZSAKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIAorb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgCitvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIgord2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCitTSUxJQ09OIEdSQVBISUNTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIAorU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSAKK0FORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gSU4gTk8gRVZFTlQgU0hBTEwgU0lMSUNPTgorR1JBUEhJQ1MgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCAKK0RBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgCitEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIAorT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OICBXSVRICitUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogJFhGcmVlODY6IHhjL2luY2x1ZGUvZXh0ZW5zaW9ucy9YS0IuaCx2IDEuNXRzaSBFeHAgJCAqLworCisjaWZuZGVmIF9YS0JfSF8KKyNkZWZpbmUJX1hLQl9IXworCisgICAgLyoKKyAgICAgKiBYS0IgcmVxdWVzdCBjb2RlcywgdXNlZCBpbjoKKyAgICAgKiAgLSAgeGtiUmVxVHlwZSBmaWVsZCBvZiBhbGwgcmVxdWVzdHMKKyAgICAgKiAgLSAgcmVxdWVzdE1pbm9yIGZpZWxkIG9mIHNvbWUgZXZlbnRzCisgICAgICovCisjZGVmaW5lCVhfa2JVc2VFeHRlbnNpb24JCSAwCisjZGVmaW5lCVhfa2JTZWxlY3RFdmVudHMJIAkgMQorI2RlZmluZQlYX2tiQmVsbAkJCSAzCisjZGVmaW5lCVhfa2JHZXRTdGF0ZQkJCSA0CisjZGVmaW5lCVhfa2JMYXRjaExvY2tTdGF0ZQkJIDUKKyNkZWZpbmUJWF9rYkdldENvbnRyb2xzCQkJIDYKKyNkZWZpbmUJWF9rYlNldENvbnRyb2xzCQkJIDcKKyNkZWZpbmUJWF9rYkdldE1hcAkJCSA4CisjZGVmaW5lCVhfa2JTZXRNYXAJCQkgOQorI2RlZmluZQlYX2tiR2V0Q29tcGF0TWFwCQkxMAorI2RlZmluZQlYX2tiU2V0Q29tcGF0TWFwCQkxMQorI2RlZmluZQlYX2tiR2V0SW5kaWNhdG9yU3RhdGUJCTEyCisjZGVmaW5lCVhfa2JHZXRJbmRpY2F0b3JNYXAJCTEzCisjZGVmaW5lCVhfa2JTZXRJbmRpY2F0b3JNYXAJCTE0CisjZGVmaW5lCVhfa2JHZXROYW1lZEluZGljYXRvcgkJMTUKKyNkZWZpbmUJWF9rYlNldE5hbWVkSW5kaWNhdG9yCQkxNgorI2RlZmluZQlYX2tiR2V0TmFtZXMJCQkxNworI2RlZmluZQlYX2tiU2V0TmFtZXMJCQkxOAorI2RlZmluZQlYX2tiR2V0R2VvbWV0cnkJCQkxOQorI2RlZmluZQlYX2tiU2V0R2VvbWV0cnkJCQkyMAorI2RlZmluZQlYX2tiUGVyQ2xpZW50RmxhZ3MJCTIxCisjZGVmaW5lCVhfa2JMaXN0Q29tcG9uZW50cwkJMjIKKyNkZWZpbmUJWF9rYkdldEtiZEJ5TmFtZQkJMjMKKyNkZWZpbmUJWF9rYkdldERldmljZUluZm8JCTI0CisjZGVmaW5lCVhfa2JTZXREZXZpY2VJbmZvCQkyNQorI2RlZmluZQlYX2tiU2V0RGVidWdnaW5nRmxhZ3MJCTEwMQorCisgICAgLyoKKyAgICAgKiBJbiB0aGUgWCBzZW5zZSwgWEtCIHJlcG9ydHMgb25seSBvbmUgZXZlbnQuCisgICAgICogVGhlIHR5cGUgZmllbGQgb2YgYWxsIFhLQiBldmVudHMgaXMgWGtiRXZlbnRDb2RlCisgICAgICovCisjZGVmaW5lCVhrYkV2ZW50Q29kZQkJCTAKKyNkZWZpbmUJWGtiTnVtYmVyRXZlbnRzCQkJKFhrYkV2ZW50Q29kZSsxKQorCisgICAgLyoKKyAgICAgKiBYS0IgaGFzIGEgbWlub3IgZXZlbnQgY29kZSBzbyBpdCBjYW4gdXNlIG9uZSBYIGV2ZW50IGNvZGUgZm9yIAorICAgICAqIG11bHRpcGxlIHB1cnBvc2VzLiAgCisgICAgICogIC0gcmVwb3J0ZWQgaW4gdGhlIHhrYlR5cGUgZmllbGQgb2YgYWxsIFhLQiBldmVudHMuCisgICAgICogIC0gWGtiU2VsZWN0RXZlbnREZXRhaWxzOiBJbmRpY2F0ZXMgdGhlIGV2ZW50IGZvciB3aGljaCBldmVudCBkZXRhaWxzIAorICAgICAqICAgIGFyZSBiZWluZyBjaGFuZ2VkCisgICAgICovCisjZGVmaW5lCVhrYk5ld0tleWJvYXJkTm90aWZ5CQkwCisjZGVmaW5lIFhrYk1hcE5vdGlmeQkJCTEKKyNkZWZpbmUJWGtiU3RhdGVOb3RpZnkJCQkyCisjZGVmaW5lIFhrYkNvbnRyb2xzTm90aWZ5CQkzCisjZGVmaW5lCVhrYkluZGljYXRvclN0YXRlTm90aWZ5CQk0CisjZGVmaW5lCVhrYkluZGljYXRvck1hcE5vdGlmeQkJNQorI2RlZmluZQlYa2JOYW1lc05vdGlmeQkJCTYKKyNkZWZpbmUgWGtiQ29tcGF0TWFwTm90aWZ5CQk3CisjZGVmaW5lCVhrYkJlbGxOb3RpZnkJCQk4CisjZGVmaW5lCVhrYkFjdGlvbk1lc3NhZ2UJCTkKKyNkZWZpbmUJWGtiQWNjZXNzWE5vdGlmeQkJMTAKKyNkZWZpbmUJWGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5CTExCisKKyAgICAvKgorICAgICAqIEV2ZW50IE1hc2s6CisgICAgICogIC0gWGtiU2VsZWN0RXZlbnRzOiAgU3BlY2lmaWVzIGV2ZW50IGludGVyZXN0LgorICAgICAqLworI2RlZmluZQlYa2JOZXdLZXlib2FyZE5vdGlmeU1hc2sJKDFMIDw8IDApCisjZGVmaW5lIFhrYk1hcE5vdGlmeU1hc2sJCSgxTCA8PCAxKQorI2RlZmluZQlYa2JTdGF0ZU5vdGlmeU1hc2sJCSgxTCA8PCAyKQorI2RlZmluZSBYa2JDb250cm9sc05vdGlmeU1hc2sJCSgxTCA8PCAzKQorI2RlZmluZQlYa2JJbmRpY2F0b3JTdGF0ZU5vdGlmeU1hc2sJKDFMIDw8IDQpCisjZGVmaW5lCVhrYkluZGljYXRvck1hcE5vdGlmeU1hc2sJKDFMIDw8IDUpCisjZGVmaW5lCVhrYk5hbWVzTm90aWZ5TWFzawkJKDFMIDw8IDYpCisjZGVmaW5lIFhrYkNvbXBhdE1hcE5vdGlmeU1hc2sJCSgxTCA8PCA3KQorI2RlZmluZQlYa2JCZWxsTm90aWZ5TWFzawkJKDFMIDw8IDgpCisjZGVmaW5lCVhrYkFjdGlvbk1lc3NhZ2VNYXNrCQkoMUwgPDwgOSkKKyNkZWZpbmUJWGtiQWNjZXNzWE5vdGlmeU1hc2sJCSgxTCA8PCAxMCkKKyNkZWZpbmUJWGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5TWFzawkoMUwgPDwgMTEpCisjZGVmaW5lCVhrYkFsbEV2ZW50c01hc2sJCSgweEZGRikKKworICAgIC8qCisgICAgICogTmV3S2V5Ym9hcmROb3RpZnkgZXZlbnQgZGV0YWlsczoKKyAgICAgKi8KKyNkZWZpbmUJWGtiTktOX0tleWNvZGVzTWFzawkJKDFMIDw8IDApCisjZGVmaW5lCVhrYk5LTl9HZW9tZXRyeU1hc2sJCSgxTCA8PCAxKQorI2RlZmluZQlYa2JOS05fRGV2aWNlSURNYXNrCQkoMUwgPDwgMikKKyNkZWZpbmUJWGtiQWxsTmV3S2V5Ym9hcmRFdmVudHNNYXNrCSgweDcpCisKKyAgICAvKgorICAgICAqIEFjY2Vzc1hOb3RpZnkgZXZlbnQgdHlwZXM6CisgICAgICogIC0gVGhlICd3aGF0JyBmaWVsZCBvZiBBY2Nlc3NYTm90aWZ5IGV2ZW50cyByZXBvcnRzIHRoZQorICAgICAqICAgIHJlYXNvbiB0aGF0IHRoZSBldmVudCB3YXMgZ2VuZXJhdGVkLgorICAgICAqLworI2RlZmluZQlYa2JBWE5fU0tQcmVzcwkJCTAKKyNkZWZpbmUJWGtiQVhOX1NLQWNjZXB0CQkJMQorI2RlZmluZQlYa2JBWE5fU0tSZWplY3QJCQkyCisjZGVmaW5lCVhrYkFYTl9TS1JlbGVhc2UJCTMKKyNkZWZpbmUJWGtiQVhOX0JLQWNjZXB0CQkJNAorI2RlZmluZQlYa2JBWE5fQktSZWplY3QJCQk1CisjZGVmaW5lCVhrYkFYTl9BWEtXYXJuaW5nCQk2CisKKyAgICAvKgorICAgICAqIEFjY2Vzc1hOb3RpZnkgZGV0YWlsczoKKyAgICAgKiAtIFVzZWQgYXMgYW4gZXZlbnQgZGV0YWlsIG1hc2sgdG8gbGltaXQgdGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2gKKyAgICAgKiAgIEFjY2Vzc1hOb3RpZnkgZXZlbnRzIGFyZSByZXBvcnRlZAorICAgICAqLworI2RlZmluZQlYa2JBWE5fU0tQcmVzc01hc2sJCSgxTCA8PCAwKQorI2RlZmluZQlYa2JBWE5fU0tBY2NlcHRNYXNrCQkoMUwgPDwgMSkKKyNkZWZpbmUJWGtiQVhOX1NLUmVqZWN0TWFzawkJKDFMIDw8IDIpCisjZGVmaW5lCVhrYkFYTl9TS1JlbGVhc2VNYXNrCQkoMUwgPDwgMykKKyNkZWZpbmUJWGtiQVhOX0JLQWNjZXB0TWFzawkJKDFMIDw8IDQpCisjZGVmaW5lCVhrYkFYTl9CS1JlamVjdE1hc2sJCSgxTCA8PCA1KQorI2RlZmluZQlYa2JBWE5fQVhLV2FybmluZ01hc2sJCSgxTCA8PCA2KQorI2RlZmluZQlYa2JBbGxBY2Nlc3NYRXZlbnRzTWFzawkJKDB4N2YpCisKKyAgICAvKgorICAgICAqIE1pc2NlbGxhbmVvdXMgZXZlbnQgZGV0YWlsczoKKyAgICAgKiAtIGV2ZW50IGRldGFpbCBtYXNrcyBmb3IgYXNzb3J0ZWQgZXZlbnRzIHRoYXQgZG9uJ3QgcmVhbGwKKyAgICAgKiAgIGhhdmUgYW55IGRldGFpbHMuCisgICAgICovCisjZGVmaW5lCVhrYkFsbFN0YXRlRXZlbnRzTWFzawkJWGtiQWxsU3RhdGVDb21wb25lbnRzTWFzaworI2RlZmluZQlYa2JBbGxNYXBFdmVudHNNYXNrCQlYa2JBbGxNYXBDb21wb25lbnRzTWFzaworI2RlZmluZQlYa2JBbGxDb250cm9sRXZlbnRzTWFzawkJWGtiQWxsQ29udHJvbHNNYXNrCisjZGVmaW5lCVhrYkFsbEluZGljYXRvckV2ZW50c01hc2sJWGtiQWxsSW5kaWNhdG9yc01hc2sKKyNkZWZpbmUJWGtiQWxsTmFtZUV2ZW50c01hc2sJCVhrYkFsbE5hbWVzTWFzaworI2RlZmluZQlYa2JBbGxDb21wYXRNYXBFdmVudHNNYXNrCVhrYkFsbENvbXBhdE1hc2sKKyNkZWZpbmUJWGtiQWxsQmVsbEV2ZW50c01hc2sJCSgxTCA8PCAwKQorI2RlZmluZQlYa2JBbGxBY3Rpb25NZXNzYWdlc01hc2sJKDFMIDw8IDApCisKKyAgICAvKgorICAgICAqIFhLQiByZXBvcnRzIG9uZSBlcnJvcjogIEJhZEtleWJvYXJkCisgICAgICogQSBmdXJ0aGVyIHJlYXNvbiBmb3IgdGhlIGVycm9yIGlzIGVuY29kZWQgaW50byB0byBtb3N0IHNpZ25pZmljYW50CisgICAgICogYnl0ZSBvZiB0aGUgcmVzb3VyY2VJRCBmb3IgdGhlIGVycm9yOgorICAgICAqICAgIFhrYkVycl9CYWREZXZpY2UgLSB0aGUgZGV2aWNlIGluIHF1ZXN0aW9uIHdhcyBub3QgZm91bmQKKyAgICAgKiAgICBYa2JFcnJfQmFkQ2xhc3MgIC0gdGhlIGRldmljZSB3YXMgZm91bmQgYnV0IGl0IGRvZXNuJ3QgYmVsb25nIHRvIAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXBwcm9wcmlhdGUgY2xhc3MuCisgICAgICogICAgWGtiRXJyX0JhZElkICAgICAtIHRoZSBkZXZpY2Ugd2FzIGZvdW5kIGFuZCBiZWxvbmdzIHRvIHRoZSByaWdodAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBjbGFzcywgYnV0IG5vdCBmZWVkYmFjayB3aXRoIGEgbWF0Y2hpbmcgaWQgd2FzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIGZvdW5kLgorICAgICAqIFRoZSBsb3cgYnl0ZSBvZiB0aGUgcmVzb3VyY2VJRCBmb3IgdGhpcyBlcnJvciBjb250YWlucyB0aGUgZGV2aWNlCisgICAgICogaWQsIGNsYXNzIHNwZWNpZmllciBvciBmZWVkYmFjayBpZCB0aGF0IGZhaWxlZC4KKyAgICAgKi8KKyNkZWZpbmUJWGtiS2V5Ym9hcmQJCQkwCisjZGVmaW5lCVhrYk51bWJlckVycm9ycwkJCTEKKworI2RlZmluZQlYa2JFcnJfQmFkRGV2aWNlCTB4ZmYKKyNkZWZpbmUJWGtiRXJyX0JhZENsYXNzCQkweGZlCisjZGVmaW5lCVhrYkVycl9CYWRJZAkJMHhmZAorCisgICAgLyoKKyAgICAgKiBLZXlib2FyZCBDb21wb25lbnRzIE1hc2s6CisgICAgICogLSBTcGVjaWZpZXMgdGhlIGNvbXBvbmVudHMgdGhhdCBmb2xsb3cgYSBHZXRLZXlib2FyZEJ5TmFtZVJlcGx5CisgICAgICovCisjZGVmaW5lCVhrYkNsaWVudE1hcE1hc2sJCSgxTCA8PCAwKQorI2RlZmluZQlYa2JTZXJ2ZXJNYXBNYXNrCQkoMUwgPDwgMSkKKyNkZWZpbmUJWGtiQ29tcGF0TWFwTWFzawkJKDFMIDw8IDIpCisjZGVmaW5lCVhrYkluZGljYXRvck1hcE1hc2sJCSgxTCA8PCAzKQorI2RlZmluZQlYa2JOYW1lc01hc2sJCQkoMUwgPDwgNCkKKyNkZWZpbmUJWGtiR2VvbWV0cnlNYXNrCQkJKDFMIDw8IDUpCisjZGVmaW5lCVhrYkNvbnRyb2xzTWFzawkJCSgxTCA8PCA2KQorI2RlZmluZQlYa2JBbGxDb21wb25lbnRzTWFzawkJKDB4N2YpCisKKyAgICAvKgorICAgICAqIFN0YXRlIGRldGFpbCBtYXNrOgorICAgICAqICAtIFRoZSAnY2hhbmdlZCcgZmllbGQgb2YgU3RhdGVOb3RpZnkgZXZlbnRzIHJlcG9ydHMgd2hpY2ggb2YKKyAgICAgKiAgICB0aGUga2V5Ym9hcmQgc3RhdGUgY29tcG9uZW50cyBoYXZlIGNoYW5nZWQuCisgICAgICogIC0gVXNlZCBhcyBhbiBldmVudCBkZXRhaWwgbWFzayB0byBsaW1pdCB0aGUgY29uZGl0aW9ucyB1bmRlcgorICAgICAqICAgIHdoaWNoIFN0YXRlTm90aWZ5IGV2ZW50cyBhcmUgcmVwb3J0ZWQuCisgICAgICovCisjZGVmaW5lCVhrYk1vZGlmaWVyU3RhdGVNYXNrCQkoMUwgPDwgMCkKKyNkZWZpbmUJWGtiTW9kaWZpZXJCYXNlTWFzawkJKDFMIDw8IDEpCisjZGVmaW5lCVhrYk1vZGlmaWVyTGF0Y2hNYXNrCQkoMUwgPDwgMikKKyNkZWZpbmUJWGtiTW9kaWZpZXJMb2NrTWFzawkJKDFMIDw8IDMpCisjZGVmaW5lCVhrYkdyb3VwU3RhdGVNYXNrCQkoMUwgPDwgNCkKKyNkZWZpbmUJWGtiR3JvdXBCYXNlTWFzawkJKDFMIDw8IDUpCisjZGVmaW5lCVhrYkdyb3VwTGF0Y2hNYXNrCQkoMUwgPDwgNikKKyNkZWZpbmUgWGtiR3JvdXBMb2NrTWFzawkJKDFMIDw8IDcpCisjZGVmaW5lCVhrYkNvbXBhdFN0YXRlTWFzawkJKDFMIDw8IDgpCisjZGVmaW5lCVhrYkdyYWJNb2RzTWFzawkJCSgxTCA8PCA5KQorI2RlZmluZQlYa2JDb21wYXRHcmFiTW9kc01hc2sJCSgxTCA8PCAxMCkKKyNkZWZpbmUJWGtiTG9va3VwTW9kc01hc2sJCSgxTCA8PCAxMSkKKyNkZWZpbmUJWGtiQ29tcGF0TG9va3VwTW9kc01hc2sJCSgxTCA8PCAxMikKKyNkZWZpbmUJWGtiUG9pbnRlckJ1dHRvbk1hc2sJCSgxTCA8PCAxMykKKyNkZWZpbmUJWGtiQWxsU3RhdGVDb21wb25lbnRzTWFzawkoMHgzZmZmKQorCisgICAgLyoKKyAgICAgKiBDb250cm9scyBkZXRhaWwgbWFza3M6CisgICAgICogIFRoZSBjb250cm9scyBzcGVjaWZpZWQgaW4gWGtiQWxsQ29udHJvbHNNYXNrOgorICAgICAqICAtIFRoZSAnY2hhbmdlZCcgZmllbGQgb2YgQ29udHJvbHNOb3RpZnkgZXZlbnRzIHJlcG9ydHMgd2hpY2ggb2YgCisgICAgICogICAgdGhlIGtleWJvYXJkIGNvbnRyb2xzIGhhdmUgY2hhbmdlZC4KKyAgICAgKiAgLSBUaGUgJ2NoYW5nZUNvbnRyb2xzJyBmaWVsZCBvZiB0aGUgU2V0Q29udHJvbHMgcmVxdWVzdCBzcGVjaWZpZXMKKyAgICAgKiAgICB0aGUgY29udHJvbHMgZm9yIHdoaWNoIHZhbHVlcyBhcmUgdG8gYmUgY2hhbmdlZC4KKyAgICAgKiAgLSBVc2VkIGFzIGFuIGV2ZW50IGRldGFpbCBtYXNrIHRvIGxpbWl0IHRoZSBjb25kaXRpb25zIHVuZGVyIAorICAgICAqICAgIHdoaWNoIENvbnRyb2xzTm90aWZ5IGV2ZW50cyBhcmUgcmVwb3J0ZWQuCisgICAgICoKKyAgICAgKiAgVGhlIGNvbnRyb2xzIHNwZWNpZmllZCBpbiB0aGUgWGtiQWxsQm9vbGVhbkN0cmxzTWFzazoKKyAgICAgKiAgLSBUaGUgJ2VuYWJsZWRDb250cm9scycgZmllbGQgb2YgQ29udHJvbHNOb3RpZnkgZXZlbnRzIHJlcG9ydHMgdGhlCisgICAgICogICAgY3VycmVudCBzdGF0dXMgb2YgdGhlIGJvb2xlYW4gY29udHJvbHMuCisgICAgICogIC0gVGhlICdlbmFibGVkQ29udHJvbHNDaGFuZ2VzJyBmaWVsZCBvZiBDb250cm9sc05vdGlmeSBldmVudHMgcmVwb3J0cworICAgICAqICAgIGFueSBib29sZWFuIGNvbnRyb2xzIHRoYXQgaGF2ZSBiZWVuIHR1cm5lZCBvbiBvciBvZmYuCisgICAgICogIC0gVGhlICdhZmZlY3RFbmFibGVkQ29udHJvbHMnIGFuZCAnZW5hYmxlZENvbnRyb2xzJyBmaWVsZHMgb2YgdGhlCisgICAgICogICAga2JTZXRDb250cm9scyByZXF1ZXN0IGNoYW5nZSB0aGUgc2V0IG9mIGVuYWJsZWQgY29udHJvbHMuCisgICAgICogIC0gVGhlICdhY2Nlc3NYVGltZW91dE1hc2snIGFuZCAnYWNjZXNzWFRpbWVvdXRWYWx1ZXMnIGZpZWxkcyBvZgorICAgICAqICAgIGFuIFhrYkNvbnRyb2xzUmVjIHNwZWNpZnkgdGhlIGNvbnRyb2xzIHRvIGJlIGNoYW5nZWQgaWYgdGhlIGtleWJvYXJkCisgICAgICogICAgdGltZXMgb3V0IGFuZCB0aGUgdmFsdWVzIHRvIHdoaWNoIHRoZXkgc2hvdWxkIGJlIGNoYW5nZWQuCisgICAgICogIC0gVGhlICdhdXRvQ3RybHMnIGFuZCAnYXV0b0N0cmxzVmFsdWVzJyBmaWVsZHMgb2YgdGhlIFBlckNsaWVudEZsYWdzIAorICAgICAqICAgIHJlcXVlc3Qgc3BlY2lmaWVzIHRoZSBzcGVjaWZ5IHRoZSBjb250cm9scyB0byBiZSByZXNldCB3aGVuIHRoZQorICAgICAqICAgIGNsaWVudCBleGl0cyBhbmQgdGhlIHZhbHVlcyB0byB3aGljaCB0aGV5IHNob3VsZCBiZSByZXNldC4KKyAgICAgKiAgLSBUaGUgJ2N0cmxzJyBmaWVsZCBvZiBhbiBpbmRpY2F0b3IgbWFwIHNwZWNpZmllcyB0aGUgY29udHJvbHMKKyAgICAgKiAgICB0aGF0IGRyaXZlIHRoZSBpbmRpY2F0b3IuCisgICAgICogIC0gU3BlY2lmaWVzIHRoZSBib29sZWFuIGNvbnRyb2xzIGFmZmVjdGVkIGJ5IHRoZSBTZXRDb250cm9scyBhbmQKKyAgICAgKiAgICBMb2NrQ29udHJvbHMga2V5IGFjdGlvbnMuCisgICAgICovCisjZGVmaW5lCVhrYlJlcGVhdEtleXNNYXNrCSAoMUwgPDwgMCkKKyNkZWZpbmUJWGtiU2xvd0tleXNNYXNrCQkgKDFMIDw8IDEpCisjZGVmaW5lCVhrYkJvdW5jZUtleXNNYXNrCSAoMUwgPDwgMikKKyNkZWZpbmUJWGtiU3RpY2t5S2V5c01hc2sJICgxTCA8PCAzKQorI2RlZmluZQlYa2JNb3VzZUtleXNNYXNrCSAoMUwgPDwgNCkKKyNkZWZpbmUJWGtiTW91c2VLZXlzQWNjZWxNYXNrCSAoMUwgPDwgNSkKKyNkZWZpbmUJWGtiQWNjZXNzWEtleXNNYXNrCSAoMUwgPDwgNikKKyNkZWZpbmUJWGtiQWNjZXNzWFRpbWVvdXRNYXNrCSAoMUwgPDwgNykKKyNkZWZpbmUJWGtiQWNjZXNzWEZlZWRiYWNrTWFzawkgKDFMIDw8IDgpCisjZGVmaW5lCVhrYkF1ZGlibGVCZWxsTWFzawkgKDFMIDw8IDkpCisjZGVmaW5lCVhrYk92ZXJsYXkxTWFzawkJICgxTCA8PCAxMCkKKyNkZWZpbmUJWGtiT3ZlcmxheTJNYXNrCQkgKDFMIDw8IDExKQorI2RlZmluZQlYa2JJZ25vcmVHcm91cExvY2tNYXNrCSAoMUwgPDwgMTIpCisjZGVmaW5lCVhrYkdyb3Vwc1dyYXBNYXNrCSAoMUwgPDwgMjcpCisjZGVmaW5lCVhrYkludGVybmFsTW9kc01hc2sJICgxTCA8PCAyOCkKKyNkZWZpbmUJWGtiSWdub3JlTG9ja01vZHNNYXNrCSAoMUwgPDwgMjkpCisjZGVmaW5lCVhrYlBlcktleVJlcGVhdE1hc2sJICgxTCA8PCAzMCkKKyNkZWZpbmUJWGtiQ29udHJvbHNFbmFibGVkTWFzawkgKDFMIDw8IDMxKQorCisjZGVmaW5lCVhrYkFjY2Vzc1hPcHRpb25zTWFzayAgICAoWGtiU3RpY2t5S2V5c01hc2t8WGtiQWNjZXNzWEZlZWRiYWNrTWFzaykKKworI2RlZmluZQlYa2JBbGxCb29sZWFuQ3RybHNNYXNrCSAoMHgwMDAwMUZGRikKKyNkZWZpbmUJWGtiQWxsQ29udHJvbHNNYXNrCSAoMHhGODAwMUZGRikKKyNkZWZpbmUJWGtiQWxsQ29udHJvbEV2ZW50c01hc2sJIFhrYkFsbENvbnRyb2xzTWFzaworCisgICAgLyoKKyAgICAgKiBBY2Nlc3NYIE9wdGlvbnMgTWFzaworICAgICAqICAtIFRoZSAnYWNjZXNzWE9wdGlvbnMnIGZpZWxkIG9mIGFuIFhrYkNvbnRyb2xzUmVjIHNwZWNpZmllcyB0aGUKKyAgICAgKiAgICBBY2Nlc3NYIG9wdGlvbnMgdGhhdCBhcmUgY3VycmVudGx5IGluIGVmZmVjdC4KKyAgICAgKiAgLSBUaGUgJ2FjY2Vzc1hUaW1lb3V0T3B0aW9uc01hc2snIGFuZCAnYWNjZXNzWFRpbWVvdXRPcHRpb25zVmFsdWVzJworICAgICAqICAgIGZpZWxkcyBvZiBhbiBYa2JDb250cm9sc1JlYyBzcGVjaWZ5IHRoZSBBY2Nlc3MgWCBvcHRpb25zIHRvIGJlIAorICAgICAqICAgIGNoYW5nZWQgaWYgdGhlIGtleWJvYXJkIHRpbWVzIG91dCBhbmQgdGhlIHZhbHVlcyB0byB3aGljaCB0aGV5IAorICAgICAqICAgIHNob3VsZCBiZSBjaGFuZ2VkLgorICAgICAqLworI2RlZmluZQlYa2JBWF9TS1ByZXNzRkJNYXNrCSgxTCA8PCAwKQorI2RlZmluZQlYa2JBWF9TS0FjY2VwdEZCTWFzawkoMUwgPDwgMSkKKyNkZWZpbmUJWGtiQVhfRmVhdHVyZUZCTWFzawkoMUwgPDwgMikKKyNkZWZpbmUJWGtiQVhfU2xvd1dhcm5GQk1hc2sJKDFMIDw8IDMpCisjZGVmaW5lCVhrYkFYX0luZGljYXRvckZCTWFzawkoMUwgPDwgNCkKKyNkZWZpbmUJWGtiQVhfU3RpY2t5S2V5c0ZCTWFzawkoMUwgPDwgNSkKKyNkZWZpbmUJWGtiQVhfVHdvS2V5c01hc2sJKDFMIDw8IDYpCisjZGVmaW5lCVhrYkFYX0xhdGNoVG9Mb2NrTWFzawkoMUwgPDwgNykKKyNkZWZpbmUJWGtiQVhfU0tSZWxlYXNlRkJNYXNrCSgxTCA8PCA4KQorI2RlZmluZQlYa2JBWF9TS1JlamVjdEZCTWFzawkoMUwgPDwgOSkKKyNkZWZpbmUJWGtiQVhfQktSZWplY3RGQk1hc2sJKDFMIDw8IDEwKQorI2RlZmluZQlYa2JBWF9EdW1iQmVsbEZCTWFzawkoMUwgPDwgMTEpCisjZGVmaW5lCVhrYkFYX0ZCT3B0aW9uc01hc2sJKDB4RjNGKQorI2RlZmluZQlYa2JBWF9TS09wdGlvbnNNYXNrCSgweDBDMCkKKyNkZWZpbmUJWGtiQVhfQWxsT3B0aW9uc01hc2sJKDB4RkZGKQorCisgICAgLyoKKyAgICAgKiBYa2JVc2VDb3JlS2JkIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29yZSBrZXlib2FyZCB3aXRob3V0IGhhdmluZworICAgICAqIAkJCXRvIGxvb2sgdXAgaXRzIFggaW5wdXQgZXh0ZW5zaW9uIGlkZW50aWZpZXIuCisgICAgICogWGtiVXNlQ29yZVB0ciBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvcmUgcG9pbnRlciB3aXRob3V0IGhhdmluZworICAgICAqCQkJdG8gbG9vayB1cCBpdHMgWCBpbnB1dCBleHRlbnNpb24gaWRlbnRpZmllci4KKyAgICAgKiBYa2JEZmx0WElDbGFzcyBpcyB1c2VkIHRvIHNwZWNpZnkgImRvbid0IGNhcmUiIGFueSBwbGFjZSB0aGF0IHRoZQorICAgICAqCQkJWEtCIHByb3RvY29sIGlzIGxvb2tpbmcgZm9yIGFuIFggSW5wdXQgRXh0ZW5zaW9uIAorICAgICAqCQkJZGV2aWNlIGNsYXNzLgorICAgICAqIFhrYkRmbHRYSUlkIGlzIHVzZWQgdG8gc3BlY2lmeSAiZG9uJ3QgY2FyZSIgYW55IHBsYWNlIHRoYXQgdGhlCisgICAgICoJCQlYS0IgcHJvdG9jb2wgaXMgbG9va2luZyBmb3IgYW4gWCBJbnB1dCBFeHRlbnNpb24KKyAgICAgKgkJCWZlZWRiYWNrIGlkZW50aWZpZXIuCisgICAgICogWGtiQWxsWElDbGFzc2VzIGlzIHVzZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IGFsbCBkZXZpY2UgaW5kaWNhdG9ycywKKyAgICAgKgkJCXdoZXRoZXIgdGhleSdyZSBwYXJ0IG9mIHRoZSBpbmRpY2F0b3IgZmVlZGJhY2sgY2xhc3MKKyAgICAgKgkJCW9yIHRoZSBrZXlib2FyZCBmZWVkYmFjayBjbGFzcy4KKyAgICAgKiBYa2JBbGxYSUlkcyBpcyB1c2VkIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgZGV2aWNlIGluZGljYXRvcgorICAgICAqCQkJZmVlZGJhY2tzIHdpdGhvdXQgaGF2aW5nIHRvIGxpc3QgdGhlbS4KKyAgICAgKiBYa2JYSU5vbmUgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGNsYXNzIG9yIGlkIGhhcyBiZWVuIHNwZWNpZmllZC4KKyAgICAgKiBYa2JMZWdhbFhJTGVkQ2xhc3MoYykgIFRydWUgaWYgJ2MnIHNwZWNpZmllcyBhIGxlZ2FsIGNsYXNzIHdpdGggTEVEcworICAgICAqIFhrYkxlZ2FsWElCZWxsQ2xhc3MoYykgVHJ1ZSBpZiAnYycgc3BlY2lmaWVzIGEgbGVnYWwgY2xhc3Mgd2l0aCBiZWxscworICAgICAqIFhrYkV4cGxpY2l0WElEZXZpY2UoZCkgVHJ1ZSBpZiAnZCcgZXhwbGljaXRseSBzcGVjaWZpZXMgYSBkZXZpY2UKKyAgICAgKiBYa2JFeHBsaWNpdFhJQ2xhc3MoYykgIFRydWUgaWYgJ2MnIGV4cGxpY2l0bHkgc3BlY2lmaWVzIGEgZGV2aWNlIGNsYXNzCisgICAgICogWGtiRXhwbGljaXRYSUlkKGMpICAgICBUcnVlIGlmICdpJyBleHBsaWNpdGx5IHNwZWNpZmllcyBhIGRldmljZSBpZAorICAgICAqIFhrYlNpbmdsZVhJQ2xhc3MoYykgICAgVHJ1ZSBpZiAnYycgc3BlY2lmaWVzIGV4YWN0bHkgb25lIGRldmljZSBjbGFzcywgCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgdGhlIGRlZmF1bHQuCisgICAgICogWGtiU2luZ2xlWElJZChpKSAgICAgICBUcnVlIGlmICdpJyBzcGVjaWZpZXMgZXhhY3RseSBvbmUgZGV2aWNlIAorICAgICAqCSAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyLCBpbmNsdWRpbmcgdGhlIGRlZmF1bHQuCisgICAgICovCisjZGVmaW5lCVhrYlVzZUNvcmVLYmQJCTB4MDEwMAorI2RlZmluZQlYa2JVc2VDb3JlUHRyCQkweDAyMDAKKyNkZWZpbmUJWGtiRGZsdFhJQ2xhc3MJCTB4MDMwMAorI2RlZmluZQlYa2JEZmx0WElJZAkJMHgwNDAwCisjZGVmaW5lCVhrYkFsbFhJQ2xhc3NlcwkJMHgwNTAwCisjZGVmaW5lCVhrYkFsbFhJSWRzCQkweDA2MDAKKyNkZWZpbmUJWGtiWElOb25lCQkweGZmMDAKKworI2RlZmluZQlYa2JMZWdhbFhJTGVkQ2xhc3MoYykJKCgoYyk9PUtiZEZlZWRiYWNrQ2xhc3MpfHxcCisJCQkJCSgoYyk9PUxlZEZlZWRiYWNrQ2xhc3MpfHxcCisJCQkJCSgoYyk9PVhrYkRmbHRYSUNsYXNzKXx8XAorCQkJCQkoKGMpPT1Ya2JBbGxYSUNsYXNzZXMpKQorI2RlZmluZQlYa2JMZWdhbFhJQmVsbENsYXNzKGMpCSgoKGMpPT1LYmRGZWVkYmFja0NsYXNzKXx8XAorCQkJCQkoKGMpPT1CZWxsRmVlZGJhY2tDbGFzcyl8fFwKKwkJCQkJKChjKT09WGtiRGZsdFhJQ2xhc3MpfHxcCisJCQkJCSgoYyk9PVhrYkFsbFhJQ2xhc3NlcykpCisjZGVmaW5lCVhrYkV4cGxpY2l0WElEZXZpY2UoYykJKCgoYykmKH4weGZmKSk9PTApCisjZGVmaW5lCVhrYkV4cGxpY2l0WElDbGFzcyhjKQkoKChjKSYofjB4ZmYpKT09MCkKKyNkZWZpbmUJWGtiRXhwbGljaXRYSUlkKGMpCSgoKGMpJih+MHhmZikpPT0wKQorI2RlZmluZQlYa2JTaW5nbGVYSUNsYXNzKGMpCSgoKChjKSYofjB4ZmYpKT09MCl8fCgoYyk9PVhrYkRmbHRYSUNsYXNzKSkKKyNkZWZpbmUJWGtiU2luZ2xlWElJZChjKQkoKCgoYykmKH4weGZmKSk9PTApfHwoKGMpPT1Ya2JEZmx0WElJZCkpCisKKyNkZWZpbmUJWGtiTm9Nb2RpZmllcgkJMHhmZgorI2RlZmluZQlYa2JOb1NoaWZ0TGV2ZWwJCTB4ZmYKKyNkZWZpbmUJWGtiTm9TaGFwZQkJMHhmZgorI2RlZmluZQlYa2JOb0luZGljYXRvcgkJMHhmZgorCisjZGVmaW5lCVhrYk5vTW9kaWZpZXJNYXNrCTAKKyNkZWZpbmUJWGtiQWxsTW9kaWZpZXJzTWFzawkweGZmCisjZGVmaW5lCVhrYkFsbFZpcnR1YWxNb2RzTWFzawkweGZmZmYKKworI2RlZmluZQlYa2JOdW1LYmRHcm91cHMJCTQKKyNkZWZpbmUJWGtiTWF4S2JkR3JvdXAJCShYa2JOdW1LYmRHcm91cHMtMSkKKworI2RlZmluZQlYa2JNYXhNb3VzZUtleXNCdG4JNAorCisgICAgLyoKKyAgICAgKiBHcm91cCBJbmRleCBhbmQgTWFzazoKKyAgICAgKiAgLSBJbmRpY2VzIGludG8gdGhlIGt0X2luZGV4IGFycmF5IG9mIGEga2V5IHR5cGUuCisgICAgICogIC0gTWFzayBzcGVjaWZpZXMgdHlwZXMgdG8gYmUgY2hhbmdlZCBmb3IgWGtiQ2hhbmdlVHlwZXNPZktleQorICAgICAqLworI2RlZmluZQlYa2JHcm91cDFJbmRleAkJMAorI2RlZmluZQlYa2JHcm91cDJJbmRleAkJMQorI2RlZmluZQlYa2JHcm91cDNJbmRleAkJMgorI2RlZmluZQlYa2JHcm91cDRJbmRleAkJMworI2RlZmluZQlYa2JBbnlHcm91cAkJMjU0CisjZGVmaW5lCVhrYkFsbEdyb3VwcwkJMjU1CisKKyNkZWZpbmUJWGtiR3JvdXAxTWFzawkJKDE8PDApCisjZGVmaW5lCVhrYkdyb3VwMk1hc2sJCSgxPDwxKQorI2RlZmluZQlYa2JHcm91cDNNYXNrCQkoMTw8MikKKyNkZWZpbmUJWGtiR3JvdXA0TWFzawkJKDE8PDMpCisjZGVmaW5lCVhrYkFueUdyb3VwTWFzawkJKDE8PDcpCisjZGVmaW5lCVhrYkFsbEdyb3Vwc01hc2sJKDB4ZikKKworICAgIC8qCisgICAgICogQnVpbGRDb3JlU3RhdGU6IEdpdmVuIGEga2V5Ym9hcmQgZ3JvdXAgYW5kIGEgbW9kaWZpZXIgc3RhdGUsCisgICAgICogICAgICAgICAgICAgICAgIGNvbnN0cnVjdCB0aGUgdmFsdWUgdG8gYmUgcmVwb3J0ZWQgYW4gZXZlbnQuCisgICAgICogR3JvdXBGb3JDb3JlU3RhdGU6ICBHaXZlbiB0aGUgc3RhdGUgcmVwb3J0ZWQgaW4gYW4gZXZlbnQsCisgICAgICogICAgICAgICAgICAgICAgIGRldGVybWluZSB0aGUga2V5Ym9hcmQgZ3JvdXAuCisgICAgICogSXNMZWdhbEdyb3VwOiAgIFJldHVybnMgVFJVRSBpZiAnZycgaXMgYSB2YWxpZCBncm91cCBpbmRleC4KKyAgICAgKi8KKyNkZWZpbmUJWGtiQnVpbGRDb3JlU3RhdGUobSxnKQkoKCgoZykmMHgzKTw8MTMpfCgobSkmMHhmZikpCisjZGVmaW5lIFhrYkdyb3VwRm9yQ29yZVN0YXRlKHMpCSgoKHMpPj4xMykmMHgzKQorI2RlZmluZQlYa2JJc0xlZ2FsR3JvdXAoZykJKCgoZyk+PTApJiYoKGcpPFhrYk51bUtiZEdyb3VwcykpCisKKyAgICAvKgorICAgICAqIEdyb3Vwc1dyYXAgdmFsdWVzOgorICAgICAqICAtIFRoZSAnZ3JvdXBzV3JhcCcgZmllbGQgb2YgYW4gWGtiQ29udHJvbHNSZWMgc3BlY2lmaWVzIHRoZQorICAgICAqICAgIHRyZWF0bWVudCBvZiBvdXQgb2YgcmFuZ2UgZ3JvdXBzLgorICAgICAqICAtIEJpdHMgNiBhbmQgNyBvZiB0aGUgZ3JvdXAgaW5mbyBmaWVsZCBvZiBhIGtleSBzeW1ib2wgbWFwCisgICAgICogICAgc3BlY2lmeSB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygb3V0IG9mIHJhbmdlIGdyb3VwcyBmb3IgdGhlCisgICAgICogICAgY29ycmVzcG9uZGluZyBrZXkuCisgICAgICovCisjZGVmaW5lCVhrYldyYXBJbnRvUmFuZ2UJKDB4MDApCisjZGVmaW5lCVhrYkNsYW1wSW50b1JhbmdlCSgweDQwKQorI2RlZmluZQlYa2JSZWRpcmVjdEludG9SYW5nZQkoMHg4MCkKKworICAgIC8qCisgICAgICogQWN0aW9uIGZsYWdzOiAgUmVwb3J0ZWQgaW4gdGhlICdmbGFncycgZmllbGQgb2YgbW9zdCBrZXkgYWN0aW9ucy4KKyAgICAgKiBJbnRlcnByZXRhdGlvbiBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHRoZSBhY3Rpb247IG5vdCBhbGwgYWN0aW9ucworICAgICAqIGFjY2VwdCBhbGwgZmxhZ3MuCisgICAgICoKKyAgICAgKiBPcHRpb24JCQlVc2VkIGZvciBBY3Rpb25zCisgICAgICogLS0tLS0tCQkJLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIENsZWFyTG9ja3MJCVNldE1vZHMsIExhdGNoTW9kcywgU2V0R3JvdXAsIExhdGNoR3JvdXAKKyAgICAgKiBMYXRjaFRvTG9jawkJU2V0TW9kcywgTGF0Y2hNb2RzLCBTZXRHcm91cCwgTGF0Y2hHcm91cAorICAgICAqIExvY2tOb0xvY2sJCUxvY2tNb2RzLCBJU09Mb2NrLCBMb2NrUHRyQnRuLCBMb2NrRGV2aWNlQnRuCisgICAgICogTG9ja05vVW5sb2NrCQlMb2NrTW9kcywgSVNPTG9jaywgTG9ja1B0ckJ0biwgTG9ja0RldmljZUJ0bgorICAgICAqIFVzZU1vZE1hcE1vZHMJCVNldE1vZHMsIExhdGNoTW9kcywgTG9ja01vZHMsIElTT0xvY2sKKyAgICAgKiBHcm91cEFic29sdXRlCQlTZXRHcm91cCwgTGF0Y2hHcm91cCwgTG9ja0dyb3VwLCBJU09Mb2NrCisgICAgICogVXNlRGZsdEJ1dHRvbgkJUHRyQnRuLCBMb2NrUHRyQnRuCisgICAgICogTm9BY2NlbGVyYXRpb24JCU1vdmVQdHIKKyAgICAgKiBNb3ZlQWJzb2x1dGVYCQlNb3ZlUHRyCisgICAgICogTW92ZUFic29sdXRlWQkJTW92ZVB0cgorICAgICAqIElTT0RmbHRJc0dyb3VwCQlJU09Mb2NrCisgICAgICogSVNPTm9BZmZlY3RNb2RzCQlJU09Mb2NrCisgICAgICogSVNPTm9BZmZlY3RHcm91cAkJSVNPTG9jaworICAgICAqIElTT05vQWZmZWN0UHRyCQlJU09Mb2NrCisgICAgICogSVNPTm9BZmZlY3RDdHJscwkJSVNPTG9jaworICAgICAqIE1lc3NhZ2VPblByZXNzCQlBY3Rpb25NZXNzYWdlCisgICAgICogTWVzc2FnZU9uUmVsZWFzZQkJQWN0aW9uTWVzc2FnZQorICAgICAqIE1lc3NhZ2VHZW5LZXlFdmVudAlBY3Rpb25NZXNzYWdlCisgICAgICogQWZmZWN0RGZsdEJ0bgkJU2V0UHRyRGZsdAorICAgICAqIERmbHRCdG5BYnNvbHV0ZQkJU2V0UHRyRGZsdAorICAgICAqIFN3aXRjaEFwcGxpY2F0aW9uCVN3aXRjaFNjcmVlbgorICAgICAqIFN3aXRjaEFic29sdXRlCQlTd2l0Y2hTY3JlZW4KKyAgICAgKi8KKworI2RlZmluZQlYa2JTQV9DbGVhckxvY2tzCSgxTCA8PCAwKQorI2RlZmluZQlYa2JTQV9MYXRjaFRvTG9jawkoMUwgPDwgMSkKKworI2RlZmluZQlYa2JTQV9Mb2NrTm9Mb2NrCSgxTCA8PCAwKQorI2RlZmluZQlYa2JTQV9Mb2NrTm9VbmxvY2sJKDFMIDw8IDEpCisKKyNkZWZpbmUJWGtiU0FfVXNlTW9kTWFwTW9kcwkoMUwgPDwgMikKKworI2RlZmluZQlYa2JTQV9Hcm91cEFic29sdXRlCSgxTCA8PCAyKQorI2RlZmluZQlYa2JTQV9Vc2VEZmx0QnV0dG9uCTAKKworI2RlZmluZQlYa2JTQV9Ob0FjY2VsZXJhdGlvbgkoMUwgPDwgMCkKKyNkZWZpbmUJWGtiU0FfTW92ZUFic29sdXRlWAkoMUwgPDwgMSkKKyNkZWZpbmUJWGtiU0FfTW92ZUFic29sdXRlWQkoMUwgPDwgMikKKworI2RlZmluZQlYa2JTQV9JU09EZmx0SXNHcm91cCAJICgxTCA8PCA3KQorI2RlZmluZQlYa2JTQV9JU09Ob0FmZmVjdE1vZHMJICgxTCA8PCA2KQorI2RlZmluZQlYa2JTQV9JU09Ob0FmZmVjdEdyb3VwCSAoMUwgPDwgNSkKKyNkZWZpbmUJWGtiU0FfSVNPTm9BZmZlY3RQdHIJICgxTCA8PCA0KQorI2RlZmluZQlYa2JTQV9JU09Ob0FmZmVjdEN0cmxzCSAoMUwgPDwgMykKKyNkZWZpbmUJWGtiU0FfSVNPQWZmZWN0TWFzawkgKDB4NzgpCisKKyNkZWZpbmUJWGtiU0FfTWVzc2FnZU9uUHJlc3MJICgxTCA8PCAwKQorI2RlZmluZQlYa2JTQV9NZXNzYWdlT25SZWxlYXNlCSAoMUwgPDwgMSkKKyNkZWZpbmUJWGtiU0FfTWVzc2FnZUdlbktleUV2ZW50ICgxTCA8PCAyKQorCisjZGVmaW5lCVhrYlNBX0FmZmVjdERmbHRCdG4JMQorI2RlZmluZQlYa2JTQV9EZmx0QnRuQWJzb2x1dGUJKDFMIDw8IDIpCisKKyNkZWZpbmUJWGtiU0FfU3dpdGNoQXBwbGljYXRpb24JKDFMIDw8IDApCisjZGVmaW5lCVhrYlNBX1N3aXRjaEFic29sdXRlCSgxTCA8PCAyKQorCisgICAgLyoKKyAgICAgKiBUaGUgZm9sbG93aW5nIHZhbHVlcyBhcHBseSB0byB0aGUgU0FfRGV2aWNlVmFsdWF0b3IgCisgICAgICogYWN0aW9uIG9ubHkuICBWYWx1YXRvciBvcGVyYXRpb25zIHNwZWNpZnkgdGhlIGFjdGlvbiAKKyAgICAgKiB0byBiZSB0YWtlbi4gICBWYWx1ZXMgc3BlY2lmaWVkIGluIHRoZSBhY3Rpb24gYXJlIAorICAgICAqIG11bHRpcGxpZWQgYnkgMl5zY2FsZSBiZWZvcmUgdGhleSBhcmUgYXBwbGllZC4KKyAgICAgKi8KKyNkZWZpbmUJWGtiU0FfSWdub3JlVmFsCQkoMHgwMCkKKyNkZWZpbmUJWGtiU0FfU2V0VmFsTWluCQkoMHgxMCkKKyNkZWZpbmUJWGtiU0FfU2V0VmFsQ2VudGVyCSgweDIwKQorI2RlZmluZQlYa2JTQV9TZXRWYWxNYXgJCSgweDMwKQorI2RlZmluZQlYa2JTQV9TZXRWYWxSZWxhdGl2ZQkoMHg0MCkKKyNkZWZpbmUJWGtiU0FfU2V0VmFsQWJzb2x1dGUJKDB4NTApCisjZGVmaW5lCVhrYlNBX1ZhbE9wTWFzawkJKDB4NzApCisjZGVmaW5lCVhrYlNBX1ZhbFNjYWxlTWFzawkoMHgwNykKKyNkZWZpbmUJWGtiU0FfVmFsT3AoYSkJCSgoYSkmWGtiU0FfVmFsT3BNYXNrKQorI2RlZmluZQlYa2JTQV9WYWxTY2FsZShhKQkoKGEpJlhrYlNBX1ZhbFNjYWxlTWFzaykKKworICAgIC8qCisgICAgICogQWN0aW9uIHR5cGVzOiBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgYSBrZXkgYWN0aW9uLiAgUmVwb3J0ZWQgaW4gdGhlCisgICAgICogdHlwZSBmaWVsZCBvZiBhbGwga2V5IGFjdGlvbnMuCisgICAgICovCisjZGVmaW5lCVhrYlNBX05vQWN0aW9uCQkweDAwCisjZGVmaW5lCVhrYlNBX1NldE1vZHMJCTB4MDEKKyNkZWZpbmUJWGtiU0FfTGF0Y2hNb2RzCQkweDAyCisjZGVmaW5lCVhrYlNBX0xvY2tNb2RzCQkweDAzCisjZGVmaW5lCVhrYlNBX1NldEdyb3VwCQkweDA0CisjZGVmaW5lCVhrYlNBX0xhdGNoR3JvdXAJMHgwNQorI2RlZmluZQlYa2JTQV9Mb2NrR3JvdXAJCTB4MDYKKyNkZWZpbmUJWGtiU0FfTW92ZVB0cgkJMHgwNworI2RlZmluZQlYa2JTQV9QdHJCdG4JCTB4MDgKKyNkZWZpbmUJWGtiU0FfTG9ja1B0ckJ0bgkweDA5CisjZGVmaW5lCVhrYlNBX1NldFB0ckRmbHQJMHgwYQorI2RlZmluZQlYa2JTQV9JU09Mb2NrCQkweDBiCisjZGVmaW5lCVhrYlNBX1Rlcm1pbmF0ZQkJMHgwYworI2RlZmluZQlYa2JTQV9Td2l0Y2hTY3JlZW4JMHgwZAorI2RlZmluZQlYa2JTQV9TZXRDb250cm9scwkweDBlCisjZGVmaW5lCVhrYlNBX0xvY2tDb250cm9scwkweDBmCisjZGVmaW5lCVhrYlNBX0FjdGlvbk1lc3NhZ2UJMHgxMAorI2RlZmluZQlYa2JTQV9SZWRpcmVjdEtleQkweDExCisjZGVmaW5lCVhrYlNBX0RldmljZUJ0bgkJMHgxMgorI2RlZmluZQlYa2JTQV9Mb2NrRGV2aWNlQnRuCTB4MTMKKyNkZWZpbmUJWGtiU0FfRGV2aWNlVmFsdWF0b3IJMHgxNAorI2RlZmluZQlYa2JTQV9MYXN0QWN0aW9uCVhrYlNBX0RldmljZVZhbHVhdG9yCisjZGVmaW5lCVhrYlNBX051bUFjdGlvbnMJKFhrYlNBX0xhc3RBY3Rpb24rMSkKKworI2RlZmluZQlYa2JTQV9YRnJlZTg2UHJpdmF0ZQkweDg2CisKKyAgICAvKgorICAgICAqIFNwZWNpZmllcyB0aGUga2V5IGFjdGlvbnMgdGhhdCBjbGVhciBsYXRjaGVkIGdyb3VwcyBvciBtb2RpZmllcnMuCisgICAgICovCisjZGVmaW5lCVhrYlNBX0JyZWFrTGF0Y2ggXAorCSgoMTw8WGtiU0FfTm9BY3Rpb24pfCgxPDxYa2JTQV9QdHJCdG4pfCgxPDxYa2JTQV9Mb2NrUHRyQnRuKXxcCisJKDE8PFhrYlNBX1Rlcm1pbmF0ZSl8KDE8PFhrYlNBX1N3aXRjaFNjcmVlbil8KDE8PFhrYlNBX1NldENvbnRyb2xzKXxcCisJKDE8PFhrYlNBX0xvY2tDb250cm9scyl8KDE8PFhrYlNBX0FjdGlvbk1lc3NhZ2UpfFwKKwkoMTw8WGtiU0FfUmVkaXJlY3RLZXkpfCgxPDxYa2JTQV9EZXZpY2VCdG4pfCgxPDxYa2JTQV9Mb2NrRGV2aWNlQnRuKSkKKwkgCisgICAgLyoKKyAgICAgKiBNYWNyb3MgdG8gY2xhc3NpZnkga2V5IGFjdGlvbnMKKyAgICAgKi8KKyNkZWZpbmUJWGtiSXNNb2RBY3Rpb24oYSkJKCgoYSktPnR5cGU+PVhrYl9TQVNldE1vZHMpJiYoKGEpLT50eXBlPD1Ya2JTQV9Mb2NrTW9kcykpCisjZGVmaW5lCVhrYklzR3JvdXBBY3Rpb24oYSkJKCgoYSktPnR5cGU+PVhrYlNBX1NldEdyb3VwKSYmKChhKS0+dHlwZTw9WGtiU0FfTG9ja0dyb3VwKSkKKyNkZWZpbmUJWGtiSXNQdHJBY3Rpb24oYSkJKCgoYSktPnR5cGU+PVhrYlNBX01vdmVQdHIpJiYoKGEpLT50eXBlPD1Ya2JTQV9TZXRQdHJEZmx0KSkKKworCisgICAgLyoKKyAgICAgKiBLZXkgQmVoYXZpb3IgUXVhbGlmaWVyOgorICAgICAqICAgIEtCX1Blcm1hbmVudCBpbmRpY2F0ZXMgdGhhdCB0aGUgYmVoYXZpb3IgZGVzY3JpYmVzIGFuIHVuYWx0ZXJhYmxlCisgICAgICogICAgY2hhcmFjdGVyaXN0aWMgb2YgdGhlIGtleWJvYXJkLCBub3QgYW4gWEtCIHNvZnR3YXJlLXNpbXVsYXRpb24gb2YKKyAgICAgKiAgICB0aGUgbGlzdGVkIGJlaGF2aW9yLgorICAgICAqIEtleSBCZWhhdmlvciBUeXBlczogIAorICAgICAqICAgIFNwZWNpZmllcyB0aGUgYmVoYXZpb3Igb2YgdGhlIHVuZGVybHlpbmcga2V5LgorICAgICAqLworI2RlZmluZQlYa2JLQl9QZXJtYW5lbnQJCTB4ODAKKyNkZWZpbmUJWGtiS0JfT3BNYXNrCQkweDdmCisKKyNkZWZpbmUJWGtiS0JfRGVmYXVsdAkJMHgwMAorI2RlZmluZQlYa2JLQl9Mb2NrCQkweDAxCisjZGVmaW5lCVhrYktCX1JhZGlvR3JvdXAJMHgwMgorI2RlZmluZQlYa2JLQl9PdmVybGF5MQkJMHgwMworI2RlZmluZQlYa2JLQl9PdmVybGF5MgkJMHgwNAorCisjZGVmaW5lCVhrYktCX1JHQWxsb3dOb25lCTB4ODAKKworICAgIC8qCisgICAgICogVmFyaW91cyBtYWNyb3Mgd2hpY2ggZGVzY3JpYmUgdGhlIHJhbmdlIG9mIGxlZ2FsIGtleWNvZGVzLgorICAgICAqLworI2RlZmluZQlYa2JNaW5MZWdhbEtleUNvZGUJOAorI2RlZmluZQlYa2JNYXhMZWdhbEtleUNvZGUJMjU1CisjZGVmaW5lCVhrYk1heEtleUNvdW50CQkoWGtiTWF4TGVnYWxLZXlDb2RlLVhrYk1pbkxlZ2FsS2V5Q29kZSsxKQorI2RlZmluZQlYa2JQZXJLZXlCaXRBcnJheVNpemUJKChYa2JNYXhMZWdhbEtleUNvZGUrMSkvOCkKKy8qIFNlZW1zIGtpbmRhIHNpbGx5IHRvIGNoZWNrIHRoYXQgYW4gdW5zaWduZWQgY2hhciBpcyA8PSAyNTUuLi4gKi8KKyNkZWZpbmUJWGtiSXNMZWdhbEtleWNvZGUoaykJKChrKT49WGtiTWluTGVnYWxLZXlDb2RlKQorCisgICAgLyoKKyAgICAgKiBBc3NvcnRlZCBjb25zdGFudHMgYW5kIGxpbWl0cy4KKyAgICAgKi8KKyNkZWZpbmUJWGtiTnVtTW9kaWZpZXJzCQk4CisjZGVmaW5lCVhrYk51bVZpcnR1YWxNb2RzCTE2CisjZGVmaW5lCVhrYk51bUluZGljYXRvcnMJMzIKKyNkZWZpbmUJWGtiQWxsSW5kaWNhdG9yc01hc2sJKDB4ZmZmZmZmZmYpCisjZGVmaW5lCVhrYk1heFJhZGlvR3JvdXBzCTMyCisjZGVmaW5lCVhrYkFsbFJhZGlvR3JvdXBzTWFzawkoMHhmZmZmZmZmZikKKyNkZWZpbmUJWGtiTWF4U2hpZnRMZXZlbAk2MworI2RlZmluZQlYa2JNYXhTeW1zUGVyS2V5CShYa2JNYXhTaGlmdExldmVsKlhrYk51bUtiZEdyb3VwcykKKyNkZWZpbmUJWGtiUkdNYXhNZW1iZXJzCQkxMgorI2RlZmluZQlYa2JBY3Rpb25NZXNzYWdlTGVuZ3RoCTYKKyNkZWZpbmUJWGtiS2V5TmFtZUxlbmd0aAk0CisjZGVmaW5lCVhrYk1heFJlZGlyZWN0Q291bnQJOAorCisjZGVmaW5lCVhrYkdlb21QdHNQZXJNTQkJMTAKKyNkZWZpbmUJWGtiR2VvbU1heENvbG9ycwkzMgorI2RlZmluZQlYa2JHZW9tTWF4TGFiZWxDb2xvcnMJMworI2RlZmluZQlYa2JHZW9tTWF4UHJpb3JpdHkJMjU1CisKKyAgICAvKgorICAgICAqIEtleSBUeXBlIGluZGV4IGFuZCBtYXNrIGZvciB0aGUgZm91ciBzdGFuZGFyZCBrZXkgdHlwZXMuCisgICAgICovCisjZGVmaW5lCVhrYk9uZUxldmVsSW5kZXgJMAorI2RlZmluZQlYa2JUd29MZXZlbEluZGV4CTEKKyNkZWZpbmUJWGtiQWxwaGFiZXRpY0luZGV4CTIKKyNkZWZpbmUJWGtiS2V5cGFkSW5kZXgJCTMKKyNkZWZpbmUJWGtiTGFzdFJlcXVpcmVkVHlwZQlYa2JLZXlwYWRJbmRleAorI2RlZmluZQlYa2JOdW1SZXF1aXJlZFR5cGVzCShYa2JMYXN0UmVxdWlyZWRUeXBlKzEpCisjZGVmaW5lCVhrYk1heEtleVR5cGVzCQkyNTUKKworI2RlZmluZQlYa2JPbmVMZXZlbE1hc2sJCSgxPDwwKQorI2RlZmluZQlYa2JUd29MZXZlbE1hc2sJCSgxPDwxKQorI2RlZmluZQlYa2JBbHBoYWJldGljTWFzawkoMTw8MikKKyNkZWZpbmUJWGtiS2V5cGFkTWFzawkJKDE8PDMpCisjZGVmaW5lCVhrYkFsbFJlcXVpcmVkVHlwZXMJKDB4ZikKKworI2RlZmluZQlYa2JTaGlmdExldmVsKG4pCSgobiktMSkKKyNkZWZpbmUJWGtiU2hpZnRMZXZlbE1hc2sobikJKDE8PCgobiktMSkpCisKKyAgICAvKgorICAgICAqIEV4dGVuc2lvbiBuYW1lIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uCisgICAgICovCisjZGVmaW5lCVhrYk5hbWUgIlhLRVlCT0FSRCIKKyNkZWZpbmUJWGtiTWFqb3JWZXJzaW9uCTEKKyNkZWZpbmUJWGtiTWlub3JWZXJzaW9uCTAKKworICAgIC8qCisgICAgICogRXhwbGljaXQgbWFwIGNvbXBvbmVudHM6CisgICAgICogIC0gVXNlZCBpbiB0aGUgJ2V4cGxpY2l0JyBmaWVsZCBvZiBhbiBYa2JTZXJ2ZXJNYXAuICBTcGVjaWZpZXMKKyAgICAgKiAgICB0aGUga2V5Ym9hcmQgY29tcG9uZW50cyB0aGF0IHNob3VsZCBfbm90XyBiZSB1cGRhdGVkIGF1dG9tYXRpY2FsbHkKKyAgICAgKiAgICBpbiByZXNwb25zZSB0byBjb3JlIHByb3RvY29sIGtleWJvYXJkIG1hcHBpbmcgcmVxdWVzdHMuCisgICAgICovCisjZGVmaW5lCVhrYkV4cGxpY2l0S2V5VHlwZXNNYXNrCSAgKDB4MGYpCisjZGVmaW5lCVhrYkV4cGxpY2l0S2V5VHlwZTFNYXNrCSAgKDE8PDApCisjZGVmaW5lCVhrYkV4cGxpY2l0S2V5VHlwZTJNYXNrCSAgKDE8PDEpCisjZGVmaW5lCVhrYkV4cGxpY2l0S2V5VHlwZTNNYXNrCSAgKDE8PDIpCisjZGVmaW5lCVhrYkV4cGxpY2l0S2V5VHlwZTRNYXNrCSAgKDE8PDMpCisjZGVmaW5lCVhrYkV4cGxpY2l0SW50ZXJwcmV0TWFzayAgKDE8PDQpCisjZGVmaW5lCVhrYkV4cGxpY2l0QXV0b1JlcGVhdE1hc2sgKDE8PDUpCisjZGVmaW5lCVhrYkV4cGxpY2l0QmVoYXZpb3JNYXNrCSAgKDE8PDYpCisjZGVmaW5lCVhrYkV4cGxpY2l0Vk1vZE1hcE1hc2sJICAoMTw8NykKKyNkZWZpbmUJWGtiQWxsRXhwbGljaXRNYXNrCSAgKDB4ZmYpCisKKyAgICAvKgorICAgICAqIE1hcCBjb21wb25lbnRzIG1hc2tzOgorICAgICAqIFRob3NlIGluIEFsbE1hcENvbXBvbmVudHNNYXNrOgorICAgICAqICAtIFNwZWNpZmllcyB0aGUgaW5kaXZpZHVhbCBmaWVsZHMgdG8gYmUgbG9hZGVkIG9yIGNoYW5nZWQgZm9yIHRoZQorICAgICAqICAgIEdldE1hcCBhbmQgU2V0TWFwIHJlcXVlc3RzLgorICAgICAqIFRob3NlIGluIENsaWVudEluZm9NYXNrOgorICAgICAqICAtIFNwZWNpZmllcyB0aGUgY29tcG9uZW50cyB0byBiZSBhbGxvY2F0ZWQgYnkgWGtiQWxsb2NDbGllbnRNYXAuCisgICAgICogVGhvc2UgaW4gU2VydmVySW5mb01hc2s6CisgICAgICogIC0gU3BlY2lmaWVzIHRoZSBjb21wb25lbnRzIHRvIGJlIGFsbG9jYXRlZCBieSBYa2JBbGxvY1NlcnZlck1hcC4KKyAgICAgKi8KKyNkZWZpbmUJWGtiS2V5VHlwZXNNYXNrCQkoMTw8MCkKKyNkZWZpbmUJWGtiS2V5U3ltc01hc2sJCSgxPDwxKQorI2RlZmluZQlYa2JNb2RpZmllck1hcE1hc2sJKDE8PDIpCisjZGVmaW5lCVhrYkV4cGxpY2l0Q29tcG9uZW50c01hc2sgKDE8PDMpCisjZGVmaW5lIFhrYktleUFjdGlvbnNNYXNrCSgxPDw0KQorI2RlZmluZQlYa2JLZXlCZWhhdmlvcnNNYXNrCSgxPDw1KQorI2RlZmluZQlYa2JWaXJ0dWFsTW9kc01hc2sJKDE8PDYpCisjZGVmaW5lCVhrYlZpcnR1YWxNb2RNYXBNYXNrCSgxPDw3KQorCisjZGVmaW5lCVhrYkFsbENsaWVudEluZm9NYXNrCShYa2JLZXlUeXBlc01hc2t8WGtiS2V5U3ltc01hc2t8WGtiTW9kaWZpZXJNYXBNYXNrKQorI2RlZmluZQlYa2JBbGxTZXJ2ZXJJbmZvTWFzawkoWGtiRXhwbGljaXRDb21wb25lbnRzTWFza3xYa2JLZXlBY3Rpb25zTWFza3xYa2JLZXlCZWhhdmlvcnNNYXNrfFhrYlZpcnR1YWxNb2RzTWFza3xYa2JWaXJ0dWFsTW9kTWFwTWFzaykKKyNkZWZpbmUJWGtiQWxsTWFwQ29tcG9uZW50c01hc2sJKFhrYkFsbENsaWVudEluZm9NYXNrfFhrYkFsbFNlcnZlckluZm9NYXNrKQorCisgICAgLyoKKyAgICAgKiBTeW1ib2wgaW50ZXJwcmV0YXRpb25zIGZsYWdzOgorICAgICAqICAtIFVzZWQgaW4gdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3ltYm9sIGludGVycHJldGF0aW9uCisgICAgICovCisjZGVmaW5lCVhrYlNJX0F1dG9SZXBlYXQJKDE8PDApCisjZGVmaW5lCVhrYlNJX0xvY2tpbmdLZXkJKDE8PDEpCisKKyAgICAvKgorICAgICAqIFN5bWJvbCBpbnRlcnByZXRhdGlvbnMgbWF0Y2ggc3BlY2lmaWNhdGlvbjoKKyAgICAgKiAgLSBVc2VkIGluIHRoZSBtYXRjaCBmaWVsZCBvZiBhIHN5bWJvbCBpbnRlcnByZXRhdGlvbiB0byBzcGVjaWZ5IAorICAgICAqICAgIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIGFuIGludGVycHJldGF0aW9uIGlzIHVzZWQuCisgICAgICovCisjZGVmaW5lCVhrYlNJX0xldmVsT25lT25seQkoMHg4MCkKKyNkZWZpbmUJWGtiU0lfT3BNYXNrCQkoMHg3ZikKKyNkZWZpbmUJWGtiU0lfTm9uZU9mCQkoMCkKKyNkZWZpbmUJWGtiU0lfQW55T2ZPck5vbmUJKDEpCisjZGVmaW5lCVhrYlNJX0FueU9mCQkoMikKKyNkZWZpbmUJWGtiU0lfQWxsT2YJCSgzKQorI2RlZmluZQlYa2JTSV9FeGFjdGx5CQkoNCkKKworICAgIC8qCisgICAgICogSW5kaWNhdG9yIG1hcCBmbGFnczoKKyAgICAgKiAgLSBVc2VkIGluIHRoZSBmbGFncyBmaWVsZCBvZiBhbiBpbmRpY2F0b3IgbWFwIHRvIGluZGljYXRlIHRoZQorICAgICAqICAgIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggYW5kIGluZGljYXRvciBjYW4gYmUgY2hhbmdlZCBhbmQgdGhlCisgICAgICogICAgZWZmZWN0cyBvZiBjaGFuZ2luZyB0aGUgaW5kaWNhdG9yLgorICAgICAqLworI2RlZmluZQlYa2JJTV9Ob0V4cGxpY2l0CSgxTCA8PCA3KQorI2RlZmluZQlYa2JJTV9Ob0F1dG9tYXRpYwkoMUwgPDwgNikKKyNkZWZpbmUJWGtiSU1fTEVERHJpdmVzS0IJKDFMIDw8IDUpCisKKyAgICAvKgorICAgICAqIEluZGljYXRvciBtYXAgY29tcG9uZW50IHNwZWNpZmljYXRpb25zOgorICAgICAqICAtIFVzZWQgYnkgdGhlICd3aGljaF9ncm91cHMnIGFuZCAnd2hpY2hfbW9kcycgZmllbGRzIG9mIGFuIGluZGljYXRvcgorICAgICAqICAgIG1hcCB0byBzcGVjaWZ5IHdoaWNoIGtleWJvYXJkIGNvbXBvbmVudHMgc2hvdWxkIGJlIHVzZWQgdG8gZHJpdmUKKyAgICAgKiAgICB0aGUgaW5kaWNhdG9yLgorICAgICAqLworI2RlZmluZQlYa2JJTV9Vc2VCYXNlCQkoMUwgPDwgMCkKKyNkZWZpbmUJWGtiSU1fVXNlTGF0Y2hlZAkoMUwgPDwgMSkKKyNkZWZpbmUJWGtiSU1fVXNlTG9ja2VkCQkoMUwgPDwgMikKKyNkZWZpbmUJWGtiSU1fVXNlRWZmZWN0aXZlCSgxTCA8PCAzKQorI2RlZmluZQlYa2JJTV9Vc2VDb21wYXQJCSgxTCA8PCA0KQorCisjZGVmaW5lCVhrYklNX1VzZU5vbmUJICAwCisjZGVmaW5lCVhrYklNX1VzZUFueUdyb3VwIChYa2JJTV9Vc2VCYXNlfFhrYklNX1VzZUxhdGNoZWR8WGtiSU1fVXNlTG9ja2VkXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfFhrYklNX1VzZUVmZmVjdGl2ZSkKKyNkZWZpbmUJWGtiSU1fVXNlQW55TW9kcyAgKFhrYklNX1VzZUFueUdyb3VwfFhrYklNX1VzZUNvbXBhdCkKKworICAgIC8qCisgICAgICogQ29tcGF0aWJpbGl0eSBNYXAgQ29tcG9udGVudHM6CisgICAgICogIC0gU3BlY2lmaWVzIHRoZSBjb21wb25lbnRzIHRvIGJlIGFsbG9jYXRlZCBpbiBYa2JBbGxvY0NvbXBhdE1hcC4KKyAgICAgKi8KKyNkZWZpbmUJWGtiU3ltSW50ZXJwTWFzawkoMTw8MCkKKyNkZWZpbmUJWGtiR3JvdXBDb21wYXRNYXNrCSgxPDwxKQorI2RlZmluZQlYa2JBbGxDb21wYXRNYXNrCSgweDMpCisKKyAgICAvKgorICAgICAqIE5hbWVzIGNvbXBvbmVudCBtYXNrOgorICAgICAqICAtIFNwZWNpZmllcyB0aGUgbmFtZXMgdG8gYmUgbG9hZGVkIG9yIGNoYW5nZWQgZm9yIHRoZSBHZXROYW1lcyBhbmQKKyAgICAgKiAgICBTZXROYW1lcyByZXF1ZXN0cy4KKyAgICAgKiAgLSBTcGVjaWZpZXMgdGhlIG5hbWVzIHRoYXQgaGF2ZSBjaGFuZ2VkIGluIGEgTmFtZXNOb3RpZnkgZXZlbnQuCisgICAgICogIC0gU3BlY2lmaWVzIHRoZSBuYW1lcyBjb21wb25lbnRzIHRvIGJlIGFsbG9jYXRlZCBieSBYa2JBbGxvY05hbWVzLgorICAgICAqLworI2RlZmluZQlYa2JLZXljb2Rlc05hbWVNYXNrCSgxPDwwKQorI2RlZmluZQlYa2JHZW9tZXRyeU5hbWVNYXNrCSgxPDwxKQorI2RlZmluZQlYa2JTeW1ib2xzTmFtZU1hc2sJKDE8PDIpCisjZGVmaW5lCVhrYlBoeXNTeW1ib2xzTmFtZU1hc2sJKDE8PDMpCisjZGVmaW5lCVhrYlR5cGVzTmFtZU1hc2sJKDE8PDQpCisjZGVmaW5lCVhrYkNvbXBhdE5hbWVNYXNrIAkoMTw8NSkKKyNkZWZpbmUJWGtiS2V5VHlwZU5hbWVzTWFzawkoMTw8NikKKyNkZWZpbmUJWGtiS1RMZXZlbE5hbWVzTWFzawkoMTw8NykKKyNkZWZpbmUJWGtiSW5kaWNhdG9yTmFtZXNNYXNrCSgxPDw4KQorI2RlZmluZQlYa2JLZXlOYW1lc01hc2sJCSgxPDw5KQorI2RlZmluZQlYa2JLZXlBbGlhc2VzTWFzawkoMTw8MTApCisjZGVmaW5lCVhrYlZpcnR1YWxNb2ROYW1lc01hc2sJKDE8PDExKQorI2RlZmluZQlYa2JHcm91cE5hbWVzTWFzawkoMTw8MTIpCisjZGVmaW5lCVhrYlJHTmFtZXNNYXNrCQkoMTw8MTMpCisjZGVmaW5lCVhrYkNvbXBvbmVudE5hbWVzTWFzawkoMHgzZikKKyNkZWZpbmUJWGtiQWxsTmFtZXNNYXNrCQkoMHgzZmZmKQorCisgICAgLyoKKyAgICAgKiBHZXRCeU5hbWUgY29tcG9uZW50czoKKyAgICAgKiAgLSBTcGVjaWZpZXMgZGVzaXJlZCBvciBuZWNlc3NhcnkgY29tcG9uZW50cyB0byBHZXRLYmRCeU5hbWUgcmVxdWVzdC4KKyAgICAgKiAgLSBSZXBvcnRzIHRoZSBjb21wb25lbnRzIHRoYXQgd2VyZSBmb3VuZCBpbiBhIEdldEtiZEJ5TmFtZVJlcGx5CisgICAgICovCisjZGVmaW5lCVhrYkdCTl9UeXBlc01hc2sJCSgxTCA8PCAwKQorI2RlZmluZQlYa2JHQk5fQ29tcGF0TWFwTWFzawkJKDFMIDw8IDEpCisjZGVmaW5lCVhrYkdCTl9DbGllbnRTeW1ib2xzTWFzawkoMUwgPDwgMikKKyNkZWZpbmUJWGtiR0JOX1NlcnZlclN5bWJvbHNNYXNrCSgxTCA8PCAzKQorI2RlZmluZQlYa2JHQk5fU3ltYm9sc01hc2sgKFhrYkdCTl9DbGllbnRTeW1ib2xzTWFza3xYa2JHQk5fU2VydmVyU3ltYm9sc01hc2spCisjZGVmaW5lCVhrYkdCTl9JbmRpY2F0b3JNYXBNYXNrCQkoMUwgPDwgNCkKKyNkZWZpbmUJWGtiR0JOX0tleU5hbWVzTWFzawkJKDFMIDw8IDUpCisjZGVmaW5lCVhrYkdCTl9HZW9tZXRyeU1hc2sJCSgxTCA8PCA2KQorI2RlZmluZQlYa2JHQk5fT3RoZXJOYW1lc01hc2sJCSgxTCA8PCA3KQorI2RlZmluZQlYa2JHQk5fQWxsQ29tcG9uZW50c01hc2sJKDB4ZmYpCisKKyAgICAgLyoKKyAgICAgICogTGlzdENvbXBvbmVudHMgZmxhZ3MKKyAgICAgICovCisjZGVmaW5lCVhrYkxDX0hpZGRlbgkJCSgxTCA8PCAgMCkKKyNkZWZpbmUJWGtiTENfRGVmYXVsdAkJCSgxTCA8PCAgMSkKKyNkZWZpbmUJWGtiTENfUGFydGlhbAkJCSgxTCA8PCAgMikKKworI2RlZmluZQlYa2JMQ19BbHBoYW51bWVyaWNLZXlzCQkoMUwgPDwgIDgpCisjZGVmaW5lCVhrYkxDX01vZGlmaWVyS2V5cwkJKDFMIDw8ICA5KQorI2RlZmluZQlYa2JMQ19LZXlwYWRLZXlzCQkoMUwgPDwgMTApCisjZGVmaW5lCVhrYkxDX0Z1bmN0aW9uS2V5cwkJKDFMIDw8IDExKQorI2RlZmluZQlYa2JMQ19BbHRlcm5hdGVHcm91cAkJKDFMIDw8IDEyKQorCisgICAgLyoKKyAgICAgKiBYIElucHV0IEV4dGVuc2lvbiBJbnRlcmFjdGlvbnMKKyAgICAgKiAtIFNwZWNpZmllcyB0aGUgcG9zc2libGUgaW50ZXJhY3Rpb25zIGJldHdlZW4gWEtCIGFuZCB0aGUgWCBpbnB1dAorICAgICAqICAgZXh0ZW5zaW9uCisgICAgICogLSBVc2VkIHRvIHJlcXVlc3QgKFhrYkdldERldmljZUluZm8pIG9yIGNoYW5nZSAoWEtiU2V0RGV2aWNlSW5mbykKKyAgICAgKiAgIFhLQiBpbmZvcm1hdGlvbiBhYm91dCBhbiBleHRlbnNpb24gZGV2aWNlLgorICAgICAqIC0gUmVwb3J0cyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgaW4gdGhlIHJlcGx5IHRvCisgICAgICogICBYa2JHZXREZXZpY2VJbmZvIG9yIGluIGFuIFhrYkV4dGVuc2lvbkRldmljZU5vdGlmeSBldmVudC4KKyAgICAgKiBYa2JYSV9VbnN1cHBvcnRlZEZlYXR1cmUgaXMgcmVwb3J0ZWQgaW4gWGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5CisgICAgICogZXZlbnRzIHRvIGluZGljYXRlIGFuIGF0dGVtcHQgdG8gdXNlIGFuIHVuc3VwcG9ydGVkIGZlYXR1cmUuCisgICAgICovCisjZGVmaW5lCVhrYlhJX0tleWJvYXJkc01hc2sJCSgxTCA8PCAwKQorI2RlZmluZQlYa2JYSV9CdXR0b25BY3Rpb25zTWFzawkJKDFMIDw8IDEpCisjZGVmaW5lCVhrYlhJX0luZGljYXRvck5hbWVzTWFzawkoMUwgPDwgMikKKyNkZWZpbmUJWGtiWElfSW5kaWNhdG9yTWFwc01hc2sJCSgxTCA8PCAzKQorI2RlZmluZQlYa2JYSV9JbmRpY2F0b3JTdGF0ZU1hc2sJKDFMIDw8IDQpCisjZGVmaW5lCVhrYlhJX1Vuc3VwcG9ydGVkRmVhdHVyZU1hc2sJKDFMIDw8IDE1KQorI2RlZmluZQlYa2JYSV9BbGxGZWF0dXJlc01hc2sJCSgweDAwMWYpCisjZGVmaW5lCVhrYlhJX0FsbERldmljZUZlYXR1cmVzTWFzawkoMHgwMDFlKQorCisjZGVmaW5lCVhrYlhJX0luZGljYXRvcnNNYXNrCQkoMHgwMDFjKQorI2RlZmluZQlYa2JBbGxFeHRlbnNpb25EZXZpY2VFdmVudHNNYXNrICgweDgwMWYpCisKKyAgICAvKgorICAgICAqIFBlci1DbGllbnQgRmxhZ3M6CisgICAgICogIC0gU3BlY2lmaWVzIGZsYWdzIHRvIGJlIGNoYW5nZWQgYnkgdGhlIFBlckNsaWVudEZsYWdzIHJlcXVlc3QuCisgICAgICovCisjZGVmaW5lCVhrYlBDRl9EZXRlY3RhYmxlQXV0b1JlcGVhdE1hc2sJKDFMIDw8IDApCisjZGVmaW5lCVhrYlBDRl9HcmFic1VzZVhLQlN0YXRlTWFzawkoMUwgPDwgMSkKKyNkZWZpbmUJWGtiUENGX0F1dG9SZXNldENvbnRyb2xzTWFzawkoMUwgPDwgMikKKyNkZWZpbmUJWGtiUENGX0xvb2t1cFN0YXRlV2hlbkdyYWJiZWQJKDFMIDw8IDMpCisjZGVmaW5lCVhrYlBDRl9TZW5kRXZlbnRVc2VzWEtCU3RhdGUJKDFMIDw8IDQpCisjZGVmaW5lCVhrYlBDRl9BbGxGbGFnc01hc2sJCSgweDFGKQorCisgICAgLyoKKyAgICAgKiBEZWJ1Z2dpbmcgZmxhZ3MgYW5kIGNvbnRyb2xzCisgICAgICovCisjZGVmaW5lCVhrYkRGX0Rpc2FibGVMb2NrcwkoMTw8MCkKKworI2VuZGlmIC8qIF9YS0JfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEtCZ2VvbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YS0JnZW9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmOTAyZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEtCZ2VvbS5oCkBAIC0wLDAgKzEsNjU5IEBACisvKiAkWG9yZzogWEtCZ2VvbS5oLHYgMS4zIDIwMDAvMDgvMTggMDQ6MDU6NDUgY29za3JleSBFeHAgJCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAxOTkzIGJ5IFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCitzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0CitmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKK25vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgU2lsaWNvbiBHcmFwaGljcyBub3QgYmUgCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiAKK29mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1NpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IAorb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKK3dpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworU0lMSUNPTiBHUkFQSElDUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyAKK1NPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgCitBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIElOIE5PIEVWRU5UIFNIQUxMIFNJTElDT04KK0dSQVBISUNTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgCitEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIAorREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSAKK09SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiAgV0lUSAorVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL2V4dGVuc2lvbnMvWEtCZ2VvbS5oLHYgMy45IDIwMDIvMDkvMTggMTc6MTE6NDAgdHNpIEV4cCAkICovCisKKyNpZm5kZWYgX1hLQkdFT01fSF8KKyNkZWZpbmUJX1hLQkdFT01fSF8KKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hLQnN0ci5oPgorCisjaWZkZWYgWEtCX0lOX1NFUlZFUgorI2RlZmluZSBYa2JBZGRHZW9tS2V5QWxpYXMgCQlTcnZYa2JBZGRHZW9tS2V5QWxpYXMKKyNkZWZpbmUgWGtiQWRkR2VvbUNvbG9yIAkJU3J2WGtiQWRkR2VvbUNvbG9yCisjZGVmaW5lIFhrYkFkZEdlb21Eb29kYWQJCVNydlhrYkFkZEdlb21Eb29kYWQKKyNkZWZpbmUgWGtiQWRkR2VvbUtleQkJCVNydlhrYkFkZEdlb21LZXkKKyNkZWZpbmUgWGtiQWRkR2VvbU91dGxpbmUJCVNydlhrYkFkZEdlb21PdXRsaW5lCisjZGVmaW5lIFhrYkFkZEdlb21PdmVybGF5CQlTcnZYa2JBZGRHZW9tT3ZlcmxheQorI2RlZmluZSBYa2JBZGRHZW9tT3ZlcmxheVJvdwkJU3J2WGtiQWRkR2VvbU92ZXJsYXlSb3cKKyNkZWZpbmUJWGtiQWRkR2VvbU92ZXJsYXlLZXkJCVNydlhrYkFkZEdlb21PdmVybGF5S2V5CisjZGVmaW5lIFhrYkFkZEdlb21Qcm9wZXJ0eQkJU3J2WGtiQWRkR2VvbVByb3BlcnR5CisjZGVmaW5lIFhrYkFkZEdlb21Sb3cJCQlTcnZYa2JBZGRHZW9tUm93CisjZGVmaW5lIFhrYkFkZEdlb21TZWN0aW9uCQlTcnZYa2JBZGRHZW9tU2VjdGlvbgorI2RlZmluZSBYa2JBZGRHZW9tU2hhcGUJCQlTcnZYa2JBZGRHZW9tU2hhcGUKKyNkZWZpbmUgWGtiQWxsb2NHZW9tS2V5QWxpYXNlcwkJU3J2WGtiQWxsb2NHZW9tS2V5QWxpYXNlcworI2RlZmluZSBYa2JBbGxvY0dlb21Db2xvcnMJCVNydlhrYkFsbG9jR2VvbUNvbG9ycworI2RlZmluZSBYa2JBbGxvY0dlb21Eb29kYWRzCQlTcnZYa2JBbGxvY0dlb21Eb29kYWRzCisjZGVmaW5lIFhrYkFsbG9jR2VvbUtleXMJCVNydlhrYkFsbG9jR2VvbUtleXMKKyNkZWZpbmUgWGtiQWxsb2NHZW9tT3V0bGluZXMJCVNydlhrYkFsbG9jR2VvbU91dGxpbmVzCisjZGVmaW5lIFhrYkFsbG9jR2VvbVBvaW50cwkJU3J2WGtiQWxsb2NHZW9tUG9pbnRzCisjZGVmaW5lIFhrYkFsbG9jR2VvbVByb3BzCQlTcnZYa2JBbGxvY0dlb21Qcm9wcworI2RlZmluZSBYa2JBbGxvY0dlb21Sb3dzCQlTcnZYa2JBbGxvY0dlb21Sb3dzCisjZGVmaW5lIFhrYkFsbG9jR2VvbVNlY3Rpb25Eb29kYWRzCVNydlhrYkFsbG9jR2VvbVNlY3Rpb25Eb29kYWRzCisjZGVmaW5lIFhrYkFsbG9jR2VvbVNlY3Rpb25zCQlTcnZYa2JBbGxvY0dlb21TZWN0aW9ucworI2RlZmluZQlYa2JBbGxvY0dlb21PdmVybGF5cwkJU3J2WGtiQWxsb2NHZW9tT3ZlcmxheXMKKyNkZWZpbmUJWGtiQWxsb2NHZW9tT3ZlcmxheVJvd3MJCVNydlhrYkFsbG9jR2VvbU92ZXJsYXlSb3dzCisjZGVmaW5lCVhrYkFsbG9jR2VvbU92ZXJsYXlLZXlzCQlTcnZYa2JBbGxvY0dlb21PdmVybGF5S2V5cworI2RlZmluZSBYa2JBbGxvY0dlb21TaGFwZXMJCVNydlhrYkFsbG9jR2VvbVNoYXBlcworI2RlZmluZSBYa2JBbGxvY0dlb21ldHJ5CQlTcnZYa2JBbGxvY0dlb21ldHJ5CisjZGVmaW5lIFhrYkZyZWVHZW9tS2V5QWxpYXNlcwkJU3J2WGtiRnJlZUdlb21LZXlBbGlhc2VzCisjZGVmaW5lIFhrYkZyZWVHZW9tQ29sb3JzCQlTcnZYa2JGcmVlR2VvbUNvbG9ycworI2RlZmluZSBYa2JGcmVlR2VvbURvb2RhZHMJCVNydlhrYkZyZWVHZW9tRG9vZGFkcworI2RlZmluZSBYa2JGcmVlR2VvbVByb3BlcnRpZXMJCVNydlhrYkZyZWVHZW9tUHJvcGVydGllcworI2RlZmluZQlYa2JGcmVlR2VvbU92ZXJsYXlLZXlzCQlTcnZYa2JGcmVlR2VvbU92ZXJsYXlLZXlzCisjZGVmaW5lCVhrYkZyZWVHZW9tT3ZlcmxheVJvd3MJCVNydlhrYkZyZWVHZW9tT3ZlcmxheVJvd3MKKyNkZWZpbmUJWGtiRnJlZUdlb21PdmVybGF5cwkJU3J2WGtiRnJlZUdlb21PdmVybGF5cworI2RlZmluZQlYa2JGcmVlR2VvbUtleXMJCQlTcnZYa2JGcmVlR2VvbUtleXMKKyNkZWZpbmUJWGtiRnJlZUdlb21Sb3dzCQkJU3J2WGtiRnJlZUdlb21Sb3dzCisjZGVmaW5lIFhrYkZyZWVHZW9tU2VjdGlvbnMJCVNydlhrYkZyZWVHZW9tU2VjdGlvbnMKKyNkZWZpbmUJWGtiRnJlZUdlb21Qb2ludHMJCVNydlhrYkZyZWVHZW9tUG9pbnRzCisjZGVmaW5lCVhrYkZyZWVHZW9tT3V0bGluZXMJCVNydlhrYkZyZWVHZW9tT3V0bGluZXMKKyNkZWZpbmUgWGtiRnJlZUdlb21TaGFwZXMJCVNydlhrYkZyZWVHZW9tU2hhcGVzCisjZGVmaW5lIFhrYkZyZWVHZW9tZXRyeQkJCVNydlhrYkZyZWVHZW9tZXRyeQorI2VuZGlmCisKK3R5cGVkZWYJc3RydWN0IF9Ya2JQcm9wZXJ0eSB7CisJY2hhcgkqbmFtZTsKKwljaGFyCSp2YWx1ZTsKK30gWGtiUHJvcGVydHlSZWMsKlhrYlByb3BlcnR5UHRyOworCit0eXBlZGVmIHN0cnVjdCBfWGtiQ29sb3IgeworCXVuc2lnbmVkIGludCAJcGl4ZWw7CisJY2hhciAqCQlzcGVjOworfSBYa2JDb2xvclJlYywqWGtiQ29sb3JQdHI7CisKK3R5cGVkZWYJc3RydWN0IF9Ya2JQb2ludCB7CisJc2hvcnQJeDsKKwlzaG9ydAl5OworfSBYa2JQb2ludFJlYywgKlhrYlBvaW50UHRyOworCit0eXBlZGVmIHN0cnVjdAlfWGtiQm91bmRzIHsKKwlzaG9ydAl4MSx5MTsKKwlzaG9ydAl4Mix5MjsKK30gWGtiQm91bmRzUmVjLCAqWGtiQm91bmRzUHRyOworI2RlZmluZQlYa2JCb3VuZHNXaWR0aChiKQkoKChiKS0+eDIpLSgoYiktPngxKSkKKyNkZWZpbmUJWGtiQm91bmRzSGVpZ2h0KGIpCSgoKGIpLT55MiktKChiKS0+eTEpKQorCit0eXBlZGVmIHN0cnVjdCBfWGtiT3V0bGluZSB7CisJdW5zaWduZWQgc2hvcnQJbnVtX3BvaW50czsKKwl1bnNpZ25lZCBzaG9ydAlzel9wb2ludHM7CisJdW5zaWduZWQgc2hvcnQJY29ybmVyX3JhZGl1czsKKwlYa2JQb2ludFB0cglwb2ludHM7Cit9IFhrYk91dGxpbmVSZWMsICpYa2JPdXRsaW5lUHRyOworCit0eXBlZGVmIHN0cnVjdCBfWGtiU2hhcGUgeworCUF0b20JIAkgbmFtZTsKKwl1bnNpZ25lZCBzaG9ydAkgbnVtX291dGxpbmVzOworCXVuc2lnbmVkIHNob3J0CSBzel9vdXRsaW5lczsKKwlYa2JPdXRsaW5lUHRyCSBvdXRsaW5lczsKKwlYa2JPdXRsaW5lUHRyCSBhcHByb3g7CisJWGtiT3V0bGluZVB0cgkgcHJpbWFyeTsKKwlYa2JCb3VuZHNSZWMJIGJvdW5kczsKK30gWGtiU2hhcGVSZWMsICpYa2JTaGFwZVB0cjsKKyNkZWZpbmUJWGtiT3V0bGluZUluZGV4KHMsbykJKChpbnQpKChvKS0mKHMpLT5vdXRsaW5lc1swXSkpCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JTaGFwZURvb2RhZCB7CisJQXRvbQkJIG5hbWU7CisJdW5zaWduZWQgY2hhcgkgdHlwZTsKKwl1bnNpZ25lZCBjaGFyCSBwcmlvcml0eTsKKwlzaG9ydAkJIHRvcDsKKwlzaG9ydAkJIGxlZnQ7CisJc2hvcnQJIAkgYW5nbGU7CisJdW5zaWduZWQgc2hvcnQJIGNvbG9yX25keDsKKwl1bnNpZ25lZCBzaG9ydAkgc2hhcGVfbmR4OworfSBYa2JTaGFwZURvb2RhZFJlYywgKlhrYlNoYXBlRG9vZGFkUHRyOworI2RlZmluZQlYa2JTaGFwZURvb2RhZENvbG9yKGcsZCkJKCYoZyktPmNvbG9yc1soZCktPmNvbG9yX25keF0pCisjZGVmaW5lCVhrYlNoYXBlRG9vZGFkU2hhcGUoZyxkKQkoJihnKS0+c2hhcGVzWyhkKS0+c2hhcGVfbmR4XSkKKyNkZWZpbmUJWGtiU2V0U2hhcGVEb29kYWRDb2xvcihnLGQsYykJKChkKS0+Y29sb3JfbmR4PSAoYyktJihnKS0+Y29sb3JzWzBdKQorI2RlZmluZQlYa2JTZXRTaGFwZURvb2RhZFNoYXBlKGcsZCxzKQkoKGQpLT5zaGFwZV9uZHg9IChzKS0mKGcpLT5zaGFwZXNbMF0pCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JUZXh0RG9vZGFkIHsKKwlBdG9tCQkgbmFtZTsKKwl1bnNpZ25lZCBjaGFyCSB0eXBlOworCXVuc2lnbmVkIGNoYXIJIHByaW9yaXR5OworCXNob3J0CSAJIHRvcDsKKwlzaG9ydAkgCSBsZWZ0OworCXNob3J0CSAJIGFuZ2xlOworCXNob3J0CSAJIHdpZHRoOworCXNob3J0CQkgaGVpZ2h0OworCXVuc2lnbmVkIHNob3J0CSBjb2xvcl9uZHg7CisJY2hhciAqCQkgdGV4dDsKKwljaGFyICoJCSBmb250OworfSBYa2JUZXh0RG9vZGFkUmVjLCAqWGtiVGV4dERvb2RhZFB0cjsKKyNkZWZpbmUJWGtiVGV4dERvb2RhZENvbG9yKGcsZCkJKCYoZyktPmNvbG9yc1soZCktPmNvbG9yX25keF0pCisjZGVmaW5lCVhrYlNldFRleHREb29kYWRDb2xvcihnLGQsYykJKChkKS0+Y29sb3JfbmR4PSAoYyktJihnKS0+Y29sb3JzWzBdKQorCit0eXBlZGVmIHN0cnVjdCBfWGtiSW5kaWNhdG9yRG9vZGFkIHsKKwlBdG9tCQkgbmFtZTsKKwl1bnNpZ25lZCBjaGFyCSB0eXBlOworCXVuc2lnbmVkIGNoYXIJIHByaW9yaXR5OworCXNob3J0CSAJIHRvcDsKKwlzaG9ydAkgCSBsZWZ0OworCXNob3J0CQkgYW5nbGU7CisJdW5zaWduZWQgc2hvcnQJIHNoYXBlX25keDsKKwl1bnNpZ25lZCBzaG9ydAkgb25fY29sb3JfbmR4OworCXVuc2lnbmVkIHNob3J0CSBvZmZfY29sb3JfbmR4OworfSBYa2JJbmRpY2F0b3JEb29kYWRSZWMsICpYa2JJbmRpY2F0b3JEb29kYWRQdHI7CisjZGVmaW5lCVhrYkluZGljYXRvckRvb2RhZFNoYXBlKGcsZCkJKCYoZyktPnNoYXBlc1soZCktPnNoYXBlX25keF0pCisjZGVmaW5lCVhrYkluZGljYXRvckRvb2RhZE9uQ29sb3IoZyxkKQkoJihnKS0+Y29sb3JzWyhkKS0+b25fY29sb3JfbmR4XSkKKyNkZWZpbmUJWGtiSW5kaWNhdG9yRG9vZGFkT2ZmQ29sb3IoZyxkKQkoJihnKS0+Y29sb3JzWyhkKS0+b2ZmX2NvbG9yX25keF0pCisjZGVmaW5lCVhrYlNldEluZGljYXRvckRvb2RhZE9uQ29sb3IoZyxkLGMpIFwKKwkJCQkoKGQpLT5vbl9jb2xvcl9uZHg9IChjKS0mKGcpLT5jb2xvcnNbMF0pCisjZGVmaW5lCVhrYlNldEluZGljYXRvckRvb2RhZE9mZkNvbG9yKGcsZCxjKSBcCisJCQkJKChkKS0+b2ZmX2NvbG9yX25keD0gKGMpLSYoZyktPmNvbG9yc1swXSkKKyNkZWZpbmUJWGtiU2V0SW5kaWNhdG9yRG9vZGFkU2hhcGUoZyxkLHMpIFwKKwkJCQkoKGQpLT5zaGFwZV9uZHg9IChzKS0mKGcpLT5zaGFwZXNbMF0pCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JMb2dvRG9vZGFkIHsKKwlBdG9tCQkgbmFtZTsKKwl1bnNpZ25lZCBjaGFyCSB0eXBlOworCXVuc2lnbmVkIGNoYXIJIHByaW9yaXR5OworCXNob3J0CQkgdG9wOworCXNob3J0CQkgbGVmdDsKKwlzaG9ydAkgCSBhbmdsZTsKKwl1bnNpZ25lZCBzaG9ydAkgY29sb3JfbmR4OworCXVuc2lnbmVkIHNob3J0CSBzaGFwZV9uZHg7CisJY2hhciAqCQkgbG9nb19uYW1lOworfSBYa2JMb2dvRG9vZGFkUmVjLCAqWGtiTG9nb0Rvb2RhZFB0cjsKKyNkZWZpbmUJWGtiTG9nb0Rvb2RhZENvbG9yKGcsZCkJCSgmKGcpLT5jb2xvcnNbKGQpLT5jb2xvcl9uZHhdKQorI2RlZmluZQlYa2JMb2dvRG9vZGFkU2hhcGUoZyxkKQkJKCYoZyktPnNoYXBlc1soZCktPnNoYXBlX25keF0pCisjZGVmaW5lCVhrYlNldExvZ29Eb29kYWRDb2xvcihnLGQsYykJKChkKS0+Y29sb3JfbmR4PSAoYyktJihnKS0+Y29sb3JzWzBdKQorI2RlZmluZQlYa2JTZXRMb2dvRG9vZGFkU2hhcGUoZyxkLHMpCSgoZCktPnNoYXBlX25keD0gKHMpLSYoZyktPnNoYXBlc1swXSkKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkFueURvb2RhZCB7CisJQXRvbQkJIG5hbWU7CisJdW5zaWduZWQgY2hhcgkgdHlwZTsKKwl1bnNpZ25lZCBjaGFyCSBwcmlvcml0eTsKKwlzaG9ydAkgCSB0b3A7CisJc2hvcnQJIAkgbGVmdDsKKwlzaG9ydAkJIGFuZ2xlOworfSBYa2JBbnlEb29kYWRSZWMsICpYa2JBbnlEb29kYWRQdHI7CisKK3R5cGVkZWYgdW5pb24gX1hrYkRvb2RhZCB7CisJWGtiQW55RG9vZGFkUmVjCQlhbnk7CisJWGtiU2hhcGVEb29kYWRSZWMJc2hhcGU7CisJWGtiVGV4dERvb2RhZFJlYwl0ZXh0OworCVhrYkluZGljYXRvckRvb2RhZFJlYwlpbmRpY2F0b3I7CisJWGtiTG9nb0Rvb2RhZFJlYwlsb2dvOworfSBYa2JEb29kYWRSZWMsICpYa2JEb29kYWRQdHI7CisKKyNkZWZpbmUJWGtiVW5rbm93bkRvb2RhZAkwCisjZGVmaW5lCVhrYk91dGxpbmVEb29kYWQJMQorI2RlZmluZQlYa2JTb2xpZERvb2RhZAkJMgorI2RlZmluZQlYa2JUZXh0RG9vZGFkCQkzCisjZGVmaW5lCVhrYkluZGljYXRvckRvb2RhZAk0CisjZGVmaW5lCVhrYkxvZ29Eb29kYWQJCTUKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYktleSB7CisJWGtiS2V5TmFtZVJlYwkgbmFtZTsKKwlzaG9ydAkJIGdhcDsKKwl1bnNpZ25lZCBjaGFyCSBzaGFwZV9uZHg7CisJdW5zaWduZWQgY2hhcgkgY29sb3JfbmR4OworfSBYa2JLZXlSZWMsICpYa2JLZXlQdHI7CisjZGVmaW5lCVhrYktleVNoYXBlKGcsaykJKCYoZyktPnNoYXBlc1soayktPnNoYXBlX25keF0pCisjZGVmaW5lCVhrYktleUNvbG9yKGcsaykJKCYoZyktPmNvbG9yc1soayktPmNvbG9yX25keF0pCisjZGVmaW5lCVhrYlNldEtleVNoYXBlKGcsayxzKQkoKGspLT5zaGFwZV9uZHg9IChzKS0mKGcpLT5zaGFwZXNbMF0pCisjZGVmaW5lCVhrYlNldEtleUNvbG9yKGcsayxjKQkoKGspLT5jb2xvcl9uZHg9IChjKS0mKGcpLT5jb2xvcnNbMF0pCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JSb3cgeworCXNob3J0CSAJdG9wOworCXNob3J0CSAJbGVmdDsKKwl1bnNpZ25lZCBzaG9ydAludW1fa2V5czsKKwl1bnNpZ25lZCBzaG9ydAlzel9rZXlzOworCWludAkJdmVydGljYWw7CisJWGtiS2V5UHRyCWtleXM7CisJWGtiQm91bmRzUmVjCWJvdW5kczsKK30gWGtiUm93UmVjLCAqWGtiUm93UHRyOworCit0eXBlZGVmIHN0cnVjdCBfWGtiU2VjdGlvbiB7CisJQXRvbQkJIG5hbWU7CisJdW5zaWduZWQgY2hhcgkgcHJpb3JpdHk7CisJc2hvcnQJIAkgdG9wOworCXNob3J0CSAJIGxlZnQ7CisJdW5zaWduZWQgc2hvcnQJIHdpZHRoOworCXVuc2lnbmVkIHNob3J0CSBoZWlnaHQ7CisJc2hvcnQJIAkgYW5nbGU7CisJdW5zaWduZWQgc2hvcnQJIG51bV9yb3dzOworCXVuc2lnbmVkIHNob3J0CSBudW1fZG9vZGFkczsKKwl1bnNpZ25lZCBzaG9ydAkgbnVtX292ZXJsYXlzOworCXVuc2lnbmVkIHNob3J0CSBzel9yb3dzOworCXVuc2lnbmVkIHNob3J0CSBzel9kb29kYWRzOworCXVuc2lnbmVkIHNob3J0CSBzel9vdmVybGF5czsKKwlYa2JSb3dQdHIJIHJvd3M7CisJWGtiRG9vZGFkUHRyCSBkb29kYWRzOworCVhrYkJvdW5kc1JlYwkgYm91bmRzOworCXN0cnVjdCBfWGtiT3ZlcmxheSAqb3ZlcmxheXM7Cit9IFhrYlNlY3Rpb25SZWMsICpYa2JTZWN0aW9uUHRyOworCit0eXBlZGVmCXN0cnVjdCBfWGtiT3ZlcmxheUtleSB7CisJWGtiS2V5TmFtZVJlYwlvdmVyOworCVhrYktleU5hbWVSZWMJdW5kZXI7Cit9IFhrYk92ZXJsYXlLZXlSZWMsKlhrYk92ZXJsYXlLZXlQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JPdmVybGF5Um93IHsKKwl1bnNpZ25lZCBzaG9ydAkJcm93X3VuZGVyOworCXVuc2lnbmVkIHNob3J0CQludW1fa2V5czsKKwl1bnNpZ25lZCBzaG9ydAkJc3pfa2V5czsKKwlYa2JPdmVybGF5S2V5UHRyCWtleXM7Cit9IFhrYk92ZXJsYXlSb3dSZWMsKlhrYk92ZXJsYXlSb3dQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JPdmVybGF5IHsKKwlBdG9tCQkJbmFtZTsKKwlYa2JTZWN0aW9uUHRyCQlzZWN0aW9uX3VuZGVyOworCXVuc2lnbmVkIHNob3J0CQludW1fcm93czsKKwl1bnNpZ25lZCBzaG9ydAkJc3pfcm93czsKKwlYa2JPdmVybGF5Um93UHRyCXJvd3M7CisJWGtiQm91bmRzUHRyCQlib3VuZHM7Cit9IFhrYk92ZXJsYXlSZWMsKlhrYk92ZXJsYXlQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JHZW9tZXRyeSB7CisJQXRvbQkJIG5hbWU7CisJdW5zaWduZWQgc2hvcnQJIHdpZHRoX21tOworCXVuc2lnbmVkIHNob3J0CSBoZWlnaHRfbW07CisJY2hhciAqCQkgbGFiZWxfZm9udDsKKwlYa2JDb2xvclB0cgkgbGFiZWxfY29sb3I7CisJWGtiQ29sb3JQdHIJIGJhc2VfY29sb3I7CisJdW5zaWduZWQgc2hvcnQJIHN6X3Byb3BlcnRpZXM7CisJdW5zaWduZWQgc2hvcnQJIHN6X2NvbG9yczsKKwl1bnNpZ25lZCBzaG9ydAkgc3pfc2hhcGVzOworCXVuc2lnbmVkIHNob3J0ICAgc3pfc2VjdGlvbnM7CisJdW5zaWduZWQgc2hvcnQJIHN6X2Rvb2RhZHM7CisJdW5zaWduZWQgc2hvcnQJIHN6X2tleV9hbGlhc2VzOworCXVuc2lnbmVkIHNob3J0CSBudW1fcHJvcGVydGllczsKKwl1bnNpZ25lZCBzaG9ydAkgbnVtX2NvbG9yczsKKwl1bnNpZ25lZCBzaG9ydAkgbnVtX3NoYXBlczsKKwl1bnNpZ25lZCBzaG9ydAkgbnVtX3NlY3Rpb25zOworCXVuc2lnbmVkIHNob3J0CSBudW1fZG9vZGFkczsKKwl1bnNpZ25lZCBzaG9ydAkgbnVtX2tleV9hbGlhc2VzOworCVhrYlByb3BlcnR5UHRyCSBwcm9wZXJ0aWVzOworCVhrYkNvbG9yUHRyCSBjb2xvcnM7CisJWGtiU2hhcGVQdHIJIHNoYXBlczsKKwlYa2JTZWN0aW9uUHRyCSBzZWN0aW9uczsKKwlYa2JEb29kYWRQdHIJIGRvb2RhZHM7CisJWGtiS2V5QWxpYXNQdHIJIGtleV9hbGlhc2VzOworfSBYa2JHZW9tZXRyeVJlYzsKKyNkZWZpbmUJWGtiR2VvbUNvbG9ySW5kZXgoZyxjKQkoKGludCkoKGMpLSYoZyktPmNvbG9yc1swXSkpCisKKyNkZWZpbmUJWGtiR2VvbVByb3BlcnRpZXNNYXNrCSgxPDwwKQorI2RlZmluZQlYa2JHZW9tQ29sb3JzTWFzawkoMTw8MSkKKyNkZWZpbmUJWGtiR2VvbVNoYXBlc01hc2sJKDE8PDIpCisjZGVmaW5lCVhrYkdlb21TZWN0aW9uc01hc2sJKDE8PDMpCisjZGVmaW5lCVhrYkdlb21Eb29kYWRzTWFzawkoMTw8NCkKKyNkZWZpbmUJWGtiR2VvbUtleUFsaWFzZXNNYXNrCSgxPDw1KQorI2RlZmluZQlYa2JHZW9tQWxsTWFzawkJKDB4M2YpCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JHZW9tZXRyeVNpemVzIHsKKwl1bnNpZ25lZCBpbnQJd2hpY2g7CisJdW5zaWduZWQgc2hvcnQJbnVtX3Byb3BlcnRpZXM7CisJdW5zaWduZWQgc2hvcnQJbnVtX2NvbG9yczsKKwl1bnNpZ25lZCBzaG9ydAludW1fc2hhcGVzOworCXVuc2lnbmVkIHNob3J0CW51bV9zZWN0aW9uczsKKwl1bnNpZ25lZCBzaG9ydAludW1fZG9vZGFkczsKKwl1bnNpZ25lZCBzaG9ydAludW1fa2V5X2FsaWFzZXM7Cit9IFhrYkdlb21ldHJ5U2l6ZXNSZWMsKlhrYkdlb21ldHJ5U2l6ZXNQdHI7CisKK19YRlVOQ1BST1RPQkVHSU4KKworZXh0ZXJuCVhrYlByb3BlcnR5UHRyCitYa2JBZGRHZW9tUHJvcGVydHkoCisgICAgWGtiR2VvbWV0cnlQdHIJLyogZ2VvbSAqLywKKyAgICBjaGFyICoJCS8qIG5hbWUgKi8sCisgICAgY2hhciAqCQkvKiB2YWx1ZSAqLworKTsKKworZXh0ZXJuCVhrYktleUFsaWFzUHRyCitYa2JBZGRHZW9tS2V5QWxpYXMoCisgICAgWGtiR2VvbWV0cnlQdHIJLyogZ2VvbSAqLywKKyAgICBjaGFyICoJCS8qIGFsaWFzICovLAorICAgIGNoYXIgKgkJLyogcmVhbCAqLworKTsKKworZXh0ZXJuCVhrYkNvbG9yUHRyCitYa2JBZGRHZW9tQ29sb3IoCisgICAgWGtiR2VvbWV0cnlQdHIJLyogZ2VvbSAqLywKKyAgICBjaGFyICoJCS8qIHNwZWMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHBpeGVsICovCispOworCitleHRlcm4JWGtiT3V0bGluZVB0cgorWGtiQWRkR2VvbU91dGxpbmUoCisgICAgWGtiU2hhcGVQdHIJCS8qIHNoYXBlICovLAorICAgIGludAkJCS8qIHN6X3BvaW50cyAqLworKTsKKworZXh0ZXJuIFhrYlNoYXBlUHRyCitYa2JBZGRHZW9tU2hhcGUoCisgICAgWGtiR2VvbWV0cnlQdHIJLyogZ2VvbSAqLywKKyAgICBBdG9tCQkvKiBuYW1lICovLAorICAgIGludAkJCS8qIHN6X291dGxpbmVzICovCispOworCitleHRlcm4gWGtiS2V5UHRyCitYa2JBZGRHZW9tS2V5KAorICAgIFhrYlJvd1B0cgkJLyogcm93ICovCispOworCitleHRlcm4gWGtiUm93UHRyCitYa2JBZGRHZW9tUm93KAorICAgIFhrYlNlY3Rpb25QdHIJLyogc2VjdGlvbiAqLywKKyAgICBpbnQJCQkvKiBzel9rZXlzICovCispOworCitleHRlcm4gWGtiU2VjdGlvblB0cgorWGtiQWRkR2VvbVNlY3Rpb24oCisgICAgWGtiR2VvbWV0cnlQdHIJLyogZ2VvbSAqLywKKyAgICBBdG9tCQkvKiBuYW1lICovLAorICAgIGludAkJCS8qIHN6X3Jvd3MgKi8sCisgICAgaW50CQkJLyogc3pfZG9vZGFkcyAqLywKKyAgICBpbnQJCQkvKiBzel9vdmVybGF5cyAqLworKTsKKworZXh0ZXJuIFhrYk92ZXJsYXlQdHIKK1hrYkFkZEdlb21PdmVybGF5KAorICAgIFhrYlNlY3Rpb25QdHIJLyogc2VjdGlvbiAqLywKKyAgICBBdG9tCQkvKiBuYW1lICovLAorICAgIGludAkJCS8qIHN6X3Jvd3MgKi8KKyk7CisKK2V4dGVybiBYa2JPdmVybGF5Um93UHRyCitYa2JBZGRHZW9tT3ZlcmxheVJvdygKKyAgICBYa2JPdmVybGF5UHRyCS8qIG92ZXJsYXkgKi8sCisgICAgaW50CQkJLyogcm93X3VuZGVyICovLAorICAgIGludAkJCS8qIHN6X2tleXMgKi8KKyk7CisKK2V4dGVybiBYa2JPdmVybGF5S2V5UHRyCitYa2JBZGRHZW9tT3ZlcmxheUtleSgKKyAgICBYa2JPdmVybGF5UHRyCS8qIG92ZXJsYXkgKi8sCisgICAgWGtiT3ZlcmxheVJvd1B0cgkvKiByb3cgKi8sCisgICAgY2hhciAqCQkvKiBvdmVyICovLAorICAgIGNoYXIgKgkJLyogdW5kZXIgKi8KKyk7CisKK2V4dGVybiBYa2JEb29kYWRQdHIKK1hrYkFkZEdlb21Eb29kYWQoCisgICAgWGtiR2VvbWV0cnlQdHIJLyogZ2VvbSAqLywKKyAgICBYa2JTZWN0aW9uUHRyCS8qIHNlY3Rpb24gKi8sCisgICAgQXRvbQkJLyogbmFtZSAqLworKTsKKworCitleHRlcm4gdm9pZAorWGtiRnJlZUdlb21LZXlBbGlhc2VzKAorICAgIFhrYkdlb21ldHJ5UHRyCS8qIGdlb20gKi8sCisgICAgaW50CQkJLyogZmlyc3QgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgQm9vbAkJLyogZnJlZUFsbCAqLworKTsKKworZXh0ZXJuIHZvaWQKK1hrYkZyZWVHZW9tQ29sb3JzKAorICAgIFhrYkdlb21ldHJ5UHRyCS8qIGdlb20gKi8sCisgICAgaW50CQkJLyogZmlyc3QgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgQm9vbAkJLyogZnJlZUFsbCAqLworKTsKKworZXh0ZXJuIHZvaWQKK1hrYkZyZWVHZW9tRG9vZGFkcygKKyAgICBYa2JEb29kYWRQdHIJLyogZG9vZGFkcyAqLywKKyAgICBpbnQJCQkvKiBuRG9vZGFkcyAqLywKKyAgICBCb29sCQkvKiBmcmVlQWxsICovCispOworCisKK2V4dGVybiB2b2lkCitYa2JGcmVlR2VvbVByb3BlcnRpZXMoCisgICAgWGtiR2VvbWV0cnlQdHIJLyogZ2VvbSAqLywKKyAgICBpbnQJCQkvKiBmaXJzdCAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBCb29sCQkvKiBmcmVlQWxsICovCispOworCitleHRlcm4gdm9pZAorWGtiRnJlZUdlb21PdmVybGF5S2V5cygKKyAgICBYa2JPdmVybGF5Um93UHRyCS8qIHJvdyAqLywKKyAgICBpbnQJCQkvKiBmaXJzdCAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBCb29sCQkvKiBmcmVlQWxsICovCispOworCitleHRlcm4gdm9pZAorWGtiRnJlZUdlb21PdmVybGF5Um93cygKKyAgICBYa2JPdmVybGF5UHRyCS8qIG92ZXJsYXkgKi8sCisgICAgaW50CQkJLyogZmlyc3QgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgQm9vbAkJLyogZnJlZUFsbCAqLworKTsKKworZXh0ZXJuIHZvaWQKK1hrYkZyZWVHZW9tT3ZlcmxheXMoCisgICAgWGtiU2VjdGlvblB0cgkvKiBzZWN0aW9uICovLAorICAgIGludAkJCS8qIGZpcnN0ICovLAorICAgIGludAkJCS8qIGNvdW50ICovLAorICAgIEJvb2wJCS8qIGZyZWVBbGwgKi8KKyk7CisKK2V4dGVybiB2b2lkCitYa2JGcmVlR2VvbUtleXMoCisgICAgWGtiUm93UHRyCQkvKiByb3cgKi8sCisgICAgaW50CQkJLyogZmlyc3QgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgQm9vbAkJLyogZnJlZUFsbCAqLworKTsKKworZXh0ZXJuIHZvaWQKK1hrYkZyZWVHZW9tUm93cygKKyAgICBYa2JTZWN0aW9uUHRyCS8qIHNlY3Rpb24gKi8sCisgICAgaW50CQkJLyogZmlyc3QgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgQm9vbAkJLyogZnJlZUFsbCAqLworKTsKKworZXh0ZXJuIHZvaWQKK1hrYkZyZWVHZW9tU2VjdGlvbnMoCisgICAgWGtiR2VvbWV0cnlQdHIJLyogZ2VvbSAqLywKKyAgICBpbnQJCQkvKiBmaXJzdCAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBCb29sCQkvKiBmcmVlQWxsICovCispOworCisKK2V4dGVybiB2b2lkCitYa2JGcmVlR2VvbVBvaW50cygKKyAgICBYa2JPdXRsaW5lUHRyCS8qIG91dGxpbmUgKi8sCisgICAgaW50CQkJLyogZmlyc3QgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgQm9vbAkJLyogZnJlZUFsbCAqLworKTsKKworZXh0ZXJuIHZvaWQKK1hrYkZyZWVHZW9tT3V0bGluZXMoCisgICAgWGtiU2hhcGVQdHIJCS8qIHNoYXBlICovLAorICAgIGludAkJCS8qIGZpcnN0ICovLAorICAgIGludAkJCS8qIGNvdW50ICovLAorICAgIEJvb2wJCS8qIGZyZWVBbGwgKi8KKyk7CisKK2V4dGVybiB2b2lkCitYa2JGcmVlR2VvbVNoYXBlcygKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIGludAkJCS8qIGZpcnN0ICovLAorICAgIGludAkJCS8qIGNvdW50ICovLAorICAgIEJvb2wJCS8qIGZyZWVBbGwgKi8KKyk7CisKK2V4dGVybiB2b2lkCitYa2JGcmVlR2VvbWV0cnkoCisgICAgWGtiR2VvbWV0cnlQdHIJLyogZ2VvbSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2hpY2ggKi8sCisgICAgQm9vbAkJLyogZnJlZU1hcCAqLworKTsKKworZXh0ZXJuIFN0YXR1cworWGtiQWxsb2NHZW9tUHJvcHMoCisgICAgWGtiR2VvbWV0cnlQdHIJLyogZ2VvbSAqLywKKyAgICBpbnQJCQkvKiBuUHJvcHMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMKK1hrYkFsbG9jR2VvbUtleUFsaWFzZXMoCisgICAgWGtiR2VvbWV0cnlQdHIJLyogZ2VvbSAqLywKKyAgICBpbnQJCQkvKiBuQWxpYXNlcyAqLworKTsKKworZXh0ZXJuIFN0YXR1cworWGtiQWxsb2NHZW9tQ29sb3JzKAorICAgIFhrYkdlb21ldHJ5UHRyCS8qIGdlb20gKi8sCisgICAgaW50CQkJLyogbkNvbG9ycyAqLworKTsKKworZXh0ZXJuIFN0YXR1cworWGtiQWxsb2NHZW9tU2hhcGVzKAorICAgIFhrYkdlb21ldHJ5UHRyCS8qIGdlb20gKi8sCisgICAgaW50CQkJLyogblNoYXBlcyAqLworKTsKKworZXh0ZXJuIFN0YXR1cworWGtiQWxsb2NHZW9tU2VjdGlvbnMoCisgICAgWGtiR2VvbWV0cnlQdHIJLyogZ2VvbSAqLywKKyAgICBpbnQJCQkvKiBuU2VjdGlvbnMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMKK1hrYkFsbG9jR2VvbU92ZXJsYXlzKAorICAgIFhrYlNlY3Rpb25QdHIJLyogc2VjdGlvbiAqLywKKyAgICBpbnQJCQkvKiBudW1fbmVlZGVkICovCispOworCitleHRlcm4gU3RhdHVzCitYa2JBbGxvY0dlb21PdmVybGF5Um93cygKKyAgICBYa2JPdmVybGF5UHRyCS8qIG92ZXJsYXkgKi8sCisgICAgaW50CQkJLyogbnVtX25lZWRlZCAqLworKTsKKworZXh0ZXJuIFN0YXR1cworWGtiQWxsb2NHZW9tT3ZlcmxheUtleXMoCisgICAgWGtiT3ZlcmxheVJvd1B0cgkvKiByb3cgKi8sCisgICAgaW50CQkJLyogbnVtX25lZWRlZCAqLworKTsKKworZXh0ZXJuIFN0YXR1cworWGtiQWxsb2NHZW9tRG9vZGFkcygKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIGludAkJCS8qIG5Eb29kYWRzICovCispOworCitleHRlcm4gU3RhdHVzCitYa2JBbGxvY0dlb21TZWN0aW9uRG9vZGFkcygKKyAgICBYa2JTZWN0aW9uUHRyCS8qIHNlY3Rpb24gKi8sCisgICAgaW50CQkJLyogbkRvb2RhZHMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMKK1hrYkFsbG9jR2VvbU91dGxpbmVzKAorICAgIFhrYlNoYXBlUHRyCQkvKiBzaGFwZSAqLywKKyAgICBpbnQJCQkvKiBuT0wgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMKK1hrYkFsbG9jR2VvbVJvd3MoCisgICAgWGtiU2VjdGlvblB0cgkvKiBzZWN0aW9uICovLAorICAgIGludAkJCS8qIG5Sb3dzICovCispOworCitleHRlcm4gU3RhdHVzCitYa2JBbGxvY0dlb21Qb2ludHMoCisgICAgWGtiT3V0bGluZVB0cgkvKiBvbCAqLywKKyAgICBpbnQJCQkvKiBuUHRzICovCispOworCitleHRlcm4gU3RhdHVzCitYa2JBbGxvY0dlb21LZXlzKAorICAgIFhrYlJvd1B0cgkJLyogcm93ICovLAorICAgIGludAkJCS8qIG5LZXlzICovCispOworCitleHRlcm4JU3RhdHVzCitYa2JBbGxvY0dlb21ldHJ5KAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwlYa2JHZW9tZXRyeVNpemVzUHRyCS8qIHNpemVzICovCispOworCitleHRlcm4JU3RhdHVzCitYa2JTZXRHZW9tZXRyeSgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZAkJLyogZGV2aWNlU3BlYyAqLywKKwlYa2JHZW9tZXRyeVB0cgkJLyogZ2VvbSAqLworKTsKKworZXh0ZXJuCUJvb2wKK1hrYkNvbXB1dGVTaGFwZVRvcCgKKwlYa2JTaGFwZVB0cgkJLyogc2hhcGUgKi8sCisJWGtiQm91bmRzUHRyCQkvKiBib3VuZHMgKi8KKyk7CisKK2V4dGVybglCb29sCitYa2JDb21wdXRlU2hhcGVCb3VuZHMoCisJWGtiU2hhcGVQdHIJCS8qIHNoYXBlICovCispOworCitleHRlcm4JQm9vbAorWGtiQ29tcHV0ZVJvd0JvdW5kcygKKwlYa2JHZW9tZXRyeVB0cgkJLyogZ2VvbSAqLywKKwlYa2JTZWN0aW9uUHRyCQkvKiBzZWN0aW9uICovLAorCVhrYlJvd1B0cgkJLyogcm93ICovCispOworCitleHRlcm4JQm9vbAorWGtiQ29tcHV0ZVNlY3Rpb25Cb3VuZHMoCisJWGtiR2VvbWV0cnlQdHIJCS8qIGdlb20gKi8sCisJWGtiU2VjdGlvblB0cgkJLyogc2VjdGlvbiAqLworKTsKKworZXh0ZXJuCWNoYXIgKgorWGtiRmluZE92ZXJsYXlGb3JLZXkoCisJWGtiR2VvbWV0cnlQdHIJCS8qIGdlb20gKi8sCisJWGtiU2VjdGlvblB0cgkJLyogd2FudGVkICovLAorCWNoYXIgKgkJCS8qIHVuZGVyICovCispOworCitleHRlcm4JU3RhdHVzCitYa2JHZXRHZW9tZXRyeSgKKyAgICBEaXNwbGF5ICoJCQkvKiBkcHkgKi8sCisgICAgWGtiRGVzY1B0cgkJCS8qIHhrYiAqLworKTsKKworZXh0ZXJuCVN0YXR1cworWGtiR2V0TmFtZWRHZW9tZXRyeSgKKyAgICBEaXNwbGF5ICoJCQkvKiBkcHkgKi8sCisgICAgWGtiRGVzY1B0cgkJCS8qIHhrYiAqLywKKyAgICBBdG9tCQkJLyogbmFtZSAqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9YS0JTVFJfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEtCcHJvdG8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEtCcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2RkNGQyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YS0Jwcm90by5oCkBAIC0wLDAgKzEsMTI4MiBAQAorLyogJFhvcmc6IFhLQnByb3RvLmgsdiAxLjMgMjAwMC8wOC8xOCAwNDowNTo0NSBjb3NrcmV5IEV4cCAkICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDE5OTMgYnkgU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKK3NvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQKK2ZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodAorbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBTaWxpY29uIEdyYXBoaWNzIG5vdCBiZSAKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIAorb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgCitvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIgord2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCitTSUxJQ09OIEdSQVBISUNTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIAorU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSAKK0FORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gSU4gTk8gRVZFTlQgU0hBTEwgU0lMSUNPTgorR1JBUEhJQ1MgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCAKK0RBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgCitEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIAorT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OICBXSVRICitUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9YS0JQUk9UT19IXworI2RlZmluZQlfWEtCUFJPVE9fSF8KKworI2luY2x1ZGUgPFgxMS9YbWQuaD4KKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YS0IuaD4KKworI2RlZmluZSBXaW5kb3cgQ0FSRDMyCisjZGVmaW5lIEF0b20gQ0FSRDMyCisjZGVmaW5lIFRpbWUgQ0FSRDMyCisjZGVmaW5lIEtleUNvZGUgQ0FSRDgKKyNkZWZpbmUgS2V5U3ltIENBUkQzMgorCisjZGVmaW5lCVhrYlBhZGRlZFNpemUobikJKCgoKHVuc2lnbmVkIGludCkobikrMykgPj4gMikgPDwgMikKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlVzZUV4dGVuc2lvbiB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBhbHdheXMgWF9LQlVzZUV4dGVuc2lvbiAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNgl3YW50ZWRNYWpvciBCMTY7CisgICAgQ0FSRDE2CXdhbnRlZE1pbm9yIEIxNjsKK30geGtiVXNlRXh0ZW5zaW9uUmVxOworI2RlZmluZQlzel94a2JVc2VFeHRlbnNpb25SZXEJOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiVXNlRXh0ZW5zaW9uUmVwbHkgeworICAgIEJZVEUJdHlwZTsJCS8qIFhfUmVwbHkgKi8KKyAgICBCT09MCXN1cHBvcnRlZDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNglzZXJ2ZXJNYWpvciBCMTY7CisgICAgQ0FSRDE2CXNlcnZlck1pbm9yIEIxNjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworfSB4a2JVc2VFeHRlbnNpb25SZXBseTsKKyNkZWZpbmUJc3pfeGtiVXNlRXh0ZW5zaW9uUmVwbHkJMzIKKwordHlwZWRlZglzdHJ1Y3QgX3hrYlNlbGVjdEV2ZW50cyB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBYX0tCU2VsZWN0RXZlbnRzICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQxNglhZmZlY3RXaGljaCBCMTY7CisgICAgQ0FSRDE2CWNsZWFyIEIxNjsKKyAgICBDQVJEMTYJc2VsZWN0QWxsIEIxNjsKKyAgICBDQVJEMTYJYWZmZWN0TWFwIEIxNjsKKyAgICBDQVJEMTYJbWFwIEIxNjsKK30geGtiU2VsZWN0RXZlbnRzUmVxOworI2RlZmluZQlzel94a2JTZWxlY3RFdmVudHNSZXEJMTYKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkJlbGwgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJeGtiUmVxVHlwZTsJLyogWF9LQkJlbGwgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDE2CWJlbGxDbGFzcyBCMTY7CisgICAgQ0FSRDE2CWJlbGxJRCBCMTY7CisgICAgSU5UOAlwZXJjZW50OworICAgIEJPT0wJZm9yY2VTb3VuZDsKKyAgICBCT09MCWV2ZW50T25seTsKKyAgICBDQVJEOAlwYWQxOworICAgIElOVDE2CXBpdGNoIEIxNjsKKyAgICBJTlQxNglkdXJhdGlvbiBCMTY7CisgICAgQ0FSRDE2CXBhZDIgQjE2OworICAgIEF0b20JbmFtZSBCMzI7CisgICAgV2luZG93CXdpbmRvdyBCMzI7Cit9IHhrYkJlbGxSZXE7CisjZGVmaW5lCXN6X3hrYkJlbGxSZXEJCTI4CisKK3R5cGVkZWYgc3RydWN0IF94a2JHZXRTdGF0ZSB7CisJQ0FSRDgJCXJlcVR5cGU7CisJQ0FSRDgJCXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCR2V0U3RhdGUgKi8KKwlDQVJEMTYJCWxlbmd0aCBCMTY7CisJQ0FSRDE2CQlkZXZpY2VTcGVjIEIxNjsKKwlDQVJEMTYJCXBhZCBCMTY7Cit9IHhrYkdldFN0YXRlUmVxOworI2RlZmluZQlzel94a2JHZXRTdGF0ZVJlcQk4CisKK3R5cGVkZWYJc3RydWN0IF94a2JHZXRTdGF0ZVJlcGx5IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQlkZXZpY2VJRDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQ4CW1vZHM7CisgICAgQ0FSRDgJYmFzZU1vZHM7CisgICAgQ0FSRDgJbGF0Y2hlZE1vZHM7CisgICAgQ0FSRDgJbG9ja2VkTW9kczsKKyAgICBDQVJEOAlncm91cDsKKyAgICBDQVJEOAlsb2NrZWRHcm91cDsKKyAgICBJTlQxNgliYXNlR3JvdXAgQjE2OworICAgIElOVDE2CWxhdGNoZWRHcm91cCBCMTY7CisgICAgQ0FSRDgJY29tcGF0U3RhdGU7CisgICAgQ0FSRDgJZ3JhYk1vZHM7CisgICAgQ0FSRDgJY29tcGF0R3JhYk1vZHM7CisgICAgQ0FSRDgJbG9va3VwTW9kczsKKyAgICBDQVJEOAljb21wYXRMb29rdXBNb2RzOworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDE2CXB0ckJ0blN0YXRlIEIxNjsKKyAgICBDQVJEMTYJcGFkMiBCMTY7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworfSB4a2JHZXRTdGF0ZVJlcGx5OworI2RlZmluZQlzel94a2JHZXRTdGF0ZVJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF94a2JMYXRjaExvY2tTdGF0ZSB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBhbHdheXMgWF9LQkxhdGNoTG9ja1N0YXRlICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQ4CWFmZmVjdE1vZExvY2tzOworICAgIENBUkQ4CW1vZExvY2tzOworICAgIEJPT0wJbG9ja0dyb3VwOworICAgIENBUkQ4CWdyb3VwTG9jazsKKyAgICBDQVJEOAlhZmZlY3RNb2RMYXRjaGVzOworICAgIENBUkQ4CW1vZExhdGNoZXM7CisgICAgQ0FSRDgJcGFkOworICAgIEJPT0wJbGF0Y2hHcm91cDsKKyAgICBJTlQxNglncm91cExhdGNoIEIxNjsKK30geGtiTGF0Y2hMb2NrU3RhdGVSZXE7CisjZGVmaW5lCXN6X3hrYkxhdGNoTG9ja1N0YXRlUmVxCQkxNgorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0Q29udHJvbHMgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJeGtiUmVxVHlwZTsJLyogYWx3YXlzIFhfS0JHZXRDb250cm9scyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEMTYJcGFkIEIxNjsKK30geGtiR2V0Q29udHJvbHNSZXE7CisjZGVmaW5lCXN6X3hrYkdldENvbnRyb2xzUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkdldENvbnRyb2xzUmVwbHkgeworICAgIEJZVEUJdHlwZTsJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQ4CW1rRGZsdEJ0bjsKKyAgICBDQVJEOAludW1Hcm91cHM7CisgICAgQ0FSRDgJZ3JvdXBzV3JhcDsKKyAgICBDQVJEOAlpbnRlcm5hbE1vZHM7CisgICAgQ0FSRDgJaWdub3JlTG9ja01vZHM7CisgICAgQ0FSRDgJaW50ZXJuYWxSZWFsTW9kczsKKyAgICBDQVJEOAlpZ25vcmVMb2NrUmVhbE1vZHM7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBDQVJEMTYJaW50ZXJuYWxWTW9kcyBCMTY7CisgICAgQ0FSRDE2CWlnbm9yZUxvY2tWTW9kcyBCMTY7CisgICAgQ0FSRDE2CXJlcGVhdERlbGF5IEIxNjsKKyAgICBDQVJEMTYJcmVwZWF0SW50ZXJ2YWwgQjE2OworICAgIENBUkQxNglzbG93S2V5c0RlbGF5IEIxNjsKKyAgICBDQVJEMTYJZGVib3VuY2VEZWxheSBCMTY7CisgICAgQ0FSRDE2CW1rRGVsYXkgQjE2OworICAgIENBUkQxNglta0ludGVydmFsIEIxNjsKKyAgICBDQVJEMTYJbWtUaW1lVG9NYXggQjE2OworICAgIENBUkQxNglta01heFNwZWVkIEIxNjsKKyAgICBJTlQxNglta0N1cnZlIEIxNjsKKyAgICBDQVJEMTYJYXhPcHRpb25zIEIxNjsKKyAgICBDQVJEMTYJYXhUaW1lb3V0IEIxNjsKKyAgICBDQVJEMTYJYXh0T3B0c01hc2sgQjE2OworICAgIENBUkQxNglheHRPcHRzVmFsdWVzIEIxNjsKKyAgICBDQVJEMTYJcGFkMiBCMTY7CisgICAgQ0FSRDMyCWF4dEN0cmxzTWFzayBCMzI7CisgICAgQ0FSRDMyCWF4dEN0cmxzVmFsdWVzIEIzMjsKKyAgICBDQVJEMzIJZW5hYmxlZEN0cmxzIEIzMjsKKyAgICBCWVRFCXBlcktleVJlcGVhdFtYa2JQZXJLZXlCaXRBcnJheVNpemVdOworfSB4a2JHZXRDb250cm9sc1JlcGx5OworI2RlZmluZQlzel94a2JHZXRDb250cm9sc1JlcGx5CTkyCisKK3R5cGVkZWYgc3RydWN0IF94a2JTZXRDb250cm9scyB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBhbHdheXMgWF9LQlNldENvbnRyb2xzICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQ4CWFmZmVjdEludGVybmFsTW9kczsKKyAgICBDQVJEOAlpbnRlcm5hbE1vZHM7CisgICAgQ0FSRDgJYWZmZWN0SWdub3JlTG9ja01vZHM7CisgICAgQ0FSRDgJaWdub3JlTG9ja01vZHM7CisgICAgQ0FSRDE2CWFmZmVjdEludGVybmFsVk1vZHMgQjE2OworICAgIENBUkQxNglpbnRlcm5hbFZNb2RzIEIxNjsKKyAgICBDQVJEMTYJYWZmZWN0SWdub3JlTG9ja1ZNb2RzIEIxNjsKKyAgICBDQVJEMTYJaWdub3JlTG9ja1ZNb2RzIEIxNjsKKyAgICBDQVJEOAlta0RmbHRCdG47CisgICAgQ0FSRDgJZ3JvdXBzV3JhcDsKKyAgICBDQVJEMTYJYXhPcHRpb25zIEIxNjsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQ0FSRDMyCWFmZmVjdEVuYWJsZWRDdHJscyBCMzI7CisgICAgQ0FSRDMyCWVuYWJsZWRDdHJscyBCMzI7CisgICAgQ0FSRDMyCWNoYW5nZUN0cmxzIEIzMjsKKyAgICBDQVJEMTYJcmVwZWF0RGVsYXkgQjE2OworICAgIENBUkQxNglyZXBlYXRJbnRlcnZhbCBCMTY7CisgICAgQ0FSRDE2CXNsb3dLZXlzRGVsYXkgQjE2OworICAgIENBUkQxNglkZWJvdW5jZURlbGF5IEIxNjsKKyAgICBDQVJEMTYJbWtEZWxheSBCMTY7CisgICAgQ0FSRDE2CW1rSW50ZXJ2YWwgQjE2OworICAgIENBUkQxNglta1RpbWVUb01heCBCMTY7CisgICAgQ0FSRDE2CW1rTWF4U3BlZWQgQjE2OworICAgIElOVDE2CW1rQ3VydmUgQjE2OworICAgIENBUkQxNglheFRpbWVvdXQgQjE2OworICAgIENBUkQzMglheHRDdHJsc01hc2sgQjMyOworICAgIENBUkQzMglheHRDdHJsc1ZhbHVlcyBCMzI7CisgICAgQ0FSRDE2CWF4dE9wdHNNYXNrIEIxNjsKKyAgICBDQVJEMTYJYXh0T3B0c1ZhbHVlcyBCMTY7CisgICAgQllURQlwZXJLZXlSZXBlYXRbWGtiUGVyS2V5Qml0QXJyYXlTaXplXTsKK30geGtiU2V0Q29udHJvbHNSZXE7CisjZGVmaW5lCXN6X3hrYlNldENvbnRyb2xzUmVxCTEwMAorCit0eXBlZGVmCXN0cnVjdCBfeGtiS1RNYXBFbnRyeVdpcmVEZXNjIHsKKyAgICBCT09MCWFjdGl2ZTsKKyAgICBDQVJEOAltYXNrOworICAgIENBUkQ4CWxldmVsOworICAgIENBUkQ4CXJlYWxNb2RzOworICAgIENBUkQxNgl2aXJ0dWFsTW9kcyBCMTY7CisgICAgQ0FSRDE2CXBhZCBCMTY7Cit9IHhrYktUTWFwRW50cnlXaXJlRGVzYzsKKyNkZWZpbmUgc3pfeGtiS1RNYXBFbnRyeVdpcmVEZXNjCTgKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYktUU2V0TWFwRW50cnlXaXJlRGVzYyB7CisgICAgQ0FSRDgJbGV2ZWw7CisgICAgQ0FSRDgJcmVhbE1vZHM7CisgICAgQ0FSRDE2CXZpcnR1YWxNb2RzIEIxNjsKK30geGtiS1RTZXRNYXBFbnRyeVdpcmVEZXNjOworI2RlZmluZQlzel94a2JLVFNldE1hcEVudHJ5V2lyZURlc2MJNAorCit0eXBlZGVmIHN0cnVjdCBfeGtiTW9kc1dpcmVEZXNjIHsKKyAgICBDQVJEOAltYXNrOwkJLyogR2V0TWFwIG9ubHkgKi8KKyAgICBDQVJEOAlyZWFsTW9kczsKKyAgICBDQVJEMTYJdmlydHVhbE1vZHMgQjE2OworfSB4a2JNb2RzV2lyZURlc2M7CisjZGVmaW5lCXN6X3hrYk1vZHNXaXJlRGVzYwk0CisKK3R5cGVkZWYgc3RydWN0IF94a2JLZXlUeXBlV2lyZURlc2MgeworICAgIENBUkQ4CW1hc2s7CisgICAgQ0FSRDgJcmVhbE1vZHM7CisgICAgQ0FSRDE2CXZpcnR1YWxNb2RzIEIxNjsKKyAgICBDQVJEOAludW1MZXZlbHM7CisgICAgQ0FSRDgJbk1hcEVudHJpZXM7CisgICAgQk9PTAlwcmVzZXJ2ZTsKKyAgICBDQVJEOAlwYWQ7Cit9IHhrYktleVR5cGVXaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiS2V5VHlwZVdpcmVEZXNjCTgKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlN5bU1hcFdpcmVEZXNjIHsKKyAgICBDQVJEOAlrdEluZGV4W1hrYk51bUtiZEdyb3Vwc107CisgICAgQ0FSRDgJZ3JvdXBJbmZvOworICAgIENBUkQ4CXdpZHRoOworICAgIENBUkQxNgluU3ltcyBCMTY7Cit9IHhrYlN5bU1hcFdpcmVEZXNjOworI2RlZmluZQlzel94a2JTeW1NYXBXaXJlRGVzYwk4CisKK3R5cGVkZWYgc3RydWN0IF94a2JWTW9kTWFwV2lyZURlc2MgeworICAgIEtleUNvZGUJa2V5OworICAgIENBUkQ4CXBhZDsKKyAgICBDQVJEMTYJdm1vZHMgQjE2OworfSB4a2JWTW9kTWFwV2lyZURlc2M7CisjZGVmaW5lCXN6X3hrYlZNb2RNYXBXaXJlRGVzYwk0CisKK3R5cGVkZWYgc3RydWN0IF94a2JCZWhhdmlvcldpcmVEZXNjIHsKKwlDQVJEOAlrZXk7CisJQ0FSRDgJdHlwZTsKKwlDQVJEOAlkYXRhOworCUNBUkQ4CXBhZDsKK30geGtiQmVoYXZpb3JXaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiQmVoYXZpb3JXaXJlRGVzYwk0CisKK3R5cGVkZWYJc3RydWN0IF94a2JBY3Rpb25XaXJlRGVzYyB7CisgICAgQ0FSRDgJdHlwZTsKKyAgICBDQVJEOAlkYXRhWzddOworfSB4a2JBY3Rpb25XaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiQWN0aW9uV2lyZURlc2MJOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0TWFwIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCR2V0TWFwICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQxNglmdWxsIEIxNjsKKyAgICBDQVJEMTYJcGFydGlhbCBCMTY7CisgICAgQ0FSRDgJZmlyc3RUeXBlOworICAgIENBUkQ4CW5UeXBlczsKKyAgICBLZXlDb2RlCWZpcnN0S2V5U3ltOworICAgIENBUkQ4CW5LZXlTeW1zOworICAgIEtleUNvZGUJZmlyc3RLZXlBY3Q7CisgICAgQ0FSRDgJbktleUFjdHM7CisgICAgS2V5Q29kZQlmaXJzdEtleUJlaGF2aW9yOworICAgIENBUkQ4CW5LZXlCZWhhdmlvcnM7CisgICAgQ0FSRDE2CXZpcnR1YWxNb2RzIEIxNjsKKyAgICBLZXlDb2RlCWZpcnN0S2V5RXhwbGljaXQ7CisgICAgQ0FSRDgJbktleUV4cGxpY2l0OworICAgIEtleUNvZGUJZmlyc3RNb2RNYXBLZXk7CisgICAgQ0FSRDgJbk1vZE1hcEtleXM7CisgICAgS2V5Q29kZQlmaXJzdFZNb2RNYXBLZXk7CisgICAgQ0FSRDgJblZNb2RNYXBLZXlzOworICAgIENBUkQxNglwYWQxIEIxNjsKK30geGtiR2V0TWFwUmVxOworI2RlZmluZQlzel94a2JHZXRNYXBSZXEJMjgKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkdldE1hcFJlcGx5IHsKKyAgICBDQVJEOAl0eXBlOwkJLyogYWx3YXlzIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNglwYWQxIEIxNjsKKyAgICBLZXlDb2RlCW1pbktleUNvZGU7CisgICAgS2V5Q29kZQltYXhLZXlDb2RlOworICAgIENBUkQxNglwcmVzZW50IEIxNjsKKyAgICBDQVJEOAlmaXJzdFR5cGU7CisgICAgQ0FSRDgJblR5cGVzOworICAgIENBUkQ4CXRvdGFsVHlwZXM7CisgICAgS2V5Q29kZQlmaXJzdEtleVN5bTsKKyAgICBDQVJEMTYJdG90YWxTeW1zIEIxNjsKKyAgICBDQVJEOAluS2V5U3ltczsKKyAgICBLZXlDb2RlCWZpcnN0S2V5QWN0OworICAgIENBUkQxNgl0b3RhbEFjdHMgQjE2OworICAgIENBUkQ4CW5LZXlBY3RzOworICAgIEtleUNvZGUJZmlyc3RLZXlCZWhhdmlvcjsKKyAgICBDQVJEOAluS2V5QmVoYXZpb3JzOworICAgIENBUkQ4CXRvdGFsS2V5QmVoYXZpb3JzOworICAgIEtleUNvZGUJZmlyc3RLZXlFeHBsaWNpdDsKKyAgICBDQVJEOAluS2V5RXhwbGljaXQ7CisgICAgQ0FSRDgJdG90YWxLZXlFeHBsaWNpdDsKKyAgICBLZXlDb2RlCWZpcnN0TW9kTWFwS2V5OworICAgIENBUkQ4CW5Nb2RNYXBLZXlzOworICAgIENBUkQ4CXRvdGFsTW9kTWFwS2V5czsKKyAgICBLZXlDb2RlCWZpcnN0Vk1vZE1hcEtleTsKKyAgICBDQVJEOAluVk1vZE1hcEtleXM7CisgICAgQ0FSRDgJdG90YWxWTW9kTWFwS2V5czsKKyAgICBDQVJEOAlwYWQyOworICAgIENBUkQxNgl2aXJ0dWFsTW9kcyBCMTY7Cit9IHhrYkdldE1hcFJlcGx5OworI2RlZmluZQlzel94a2JHZXRNYXBSZXBseQkJNDAKKworI2RlZmluZQlYa2JTZXRNYXBSZXNpemVUeXBlcwkJKDFMPDwwKQorI2RlZmluZQlYa2JTZXRNYXBSZWNvbXB1dGVBY3Rpb25zCSgxTDw8MSkKKyNkZWZpbmUJWGtiU2V0TWFwQWxsRmxhZ3MJCSgweDMpCisKK3R5cGVkZWYgc3RydWN0IF94a2JTZXRNYXAgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJeGtiUmVxVHlwZTsJLyogYWx3YXlzIFhfS0JTZXRNYXAgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDE2CXByZXNlbnQgQjE2OworICAgIENBUkQxNglmbGFncyBCMTY7CisgICAgS2V5Q29kZQltaW5LZXlDb2RlOworICAgIEtleUNvZGUJbWF4S2V5Q29kZTsKKyAgICBDQVJEOAlmaXJzdFR5cGU7CisgICAgQ0FSRDgJblR5cGVzOworICAgIEtleUNvZGUJZmlyc3RLZXlTeW07CisgICAgQ0FSRDgJbktleVN5bXM7CisgICAgQ0FSRDE2CXRvdGFsU3ltcyBCMTY7CisgICAgS2V5Q29kZQlmaXJzdEtleUFjdDsKKyAgICBDQVJEOAluS2V5QWN0czsKKyAgICBDQVJEMTYJdG90YWxBY3RzIEIxNjsKKyAgICBLZXlDb2RlCWZpcnN0S2V5QmVoYXZpb3I7CisgICAgQ0FSRDgJbktleUJlaGF2aW9yczsKKyAgICBDQVJEOAl0b3RhbEtleUJlaGF2aW9yczsKKyAgICBLZXlDb2RlCWZpcnN0S2V5RXhwbGljaXQ7CisgICAgQ0FSRDgJbktleUV4cGxpY2l0OworICAgIENBUkQ4CXRvdGFsS2V5RXhwbGljaXQ7CisgICAgS2V5Q29kZQlmaXJzdE1vZE1hcEtleTsKKyAgICBDQVJEOAluTW9kTWFwS2V5czsKKyAgICBDQVJEOAl0b3RhbE1vZE1hcEtleXM7CisgICAgS2V5Q29kZQlmaXJzdFZNb2RNYXBLZXk7CisgICAgQ0FSRDgJblZNb2RNYXBLZXlzOworICAgIENBUkQ4CXRvdGFsVk1vZE1hcEtleXM7CisgICAgQ0FSRDE2CXZpcnR1YWxNb2RzIEIxNjsKK30geGtiU2V0TWFwUmVxOworI2RlZmluZQlzel94a2JTZXRNYXBSZXEJMzYKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlN5bUludGVycHJldFdpcmVEZXNjIHsKKyAgICBDQVJEMzIJCXN5bSBCMzI7CisgICAgQ0FSRDgJCW1vZHM7CisgICAgQ0FSRDgJCW1hdGNoOworICAgIENBUkQ4CQl2aXJ0dWFsTW9kOworICAgIENBUkQ4CQlmbGFnczsKKyAgICB4a2JBY3Rpb25XaXJlRGVzYwlhY3Q7Cit9IHhrYlN5bUludGVycHJldFdpcmVEZXNjOworI2RlZmluZQlzel94a2JTeW1JbnRlcnByZXRXaXJlRGVzYwkxNgorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0Q29tcGF0TWFwIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCR2V0Q29tcGF0TWFwICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQ4CWdyb3VwczsKKyAgICBCT09MCWdldEFsbFNJOworICAgIENBUkQxNglmaXJzdFNJIEIxNjsKKyAgICBDQVJEMTYJblNJIEIxNjsKK30geGtiR2V0Q29tcGF0TWFwUmVxOworI2RlZmluZQlzel94a2JHZXRDb21wYXRNYXBSZXEJMTIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkdldENvbXBhdE1hcFJlcGx5IHsKKyAgICBDQVJEOAl0eXBlOwkJLyogYWx3YXlzIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQ4CWdyb3VwczsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQxNglmaXJzdFNJIEIxNjsKKyAgICBDQVJEMTYJblNJIEIxNjsKKyAgICBDQVJEMTYJblRvdGFsU0kgQjE2OworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKK30geGtiR2V0Q29tcGF0TWFwUmVwbHk7CisjZGVmaW5lCXN6X3hrYkdldENvbXBhdE1hcFJlcGx5CQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiU2V0Q29tcGF0TWFwIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCU2V0Q29tcGF0TWFwICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQ4CXBhZDE7CisgICAgQk9PTAlyZWNvbXB1dGVBY3Rpb25zOworICAgIEJPT0wJdHJ1bmNhdGVTSTsKKyAgICBDQVJEOAlncm91cHM7CisgICAgQ0FSRDE2CWZpcnN0U0kgQjE2OworICAgIENBUkQxNgluU0kgQjE2OworICAgIENBUkQxNglwYWQyIEIxNjsKK30geGtiU2V0Q29tcGF0TWFwUmVxOworI2RlZmluZQlzel94a2JTZXRDb21wYXRNYXBSZXEJMTYKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkdldEluZGljYXRvclN0YXRlIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCR2V0SW5kaWNhdG9yU3RhdGUgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDE2CXBhZDEgQjE2OworfSB4a2JHZXRJbmRpY2F0b3JTdGF0ZVJlcTsKKyNkZWZpbmUJc3pfeGtiR2V0SW5kaWNhdG9yU3RhdGVSZXEJOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0SW5kaWNhdG9yU3RhdGVSZXBseSB7CisgICAgQ0FSRDgJdHlwZTsJCS8qIGFsd2F5cyBYX1JlcGx5ICovCisgICAgQ0FSRDgJZGV2aWNlSUQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIJc3RhdGUgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7Cit9IHhrYkdldEluZGljYXRvclN0YXRlUmVwbHk7CisjZGVmaW5lCXN6X3hrYkdldEluZGljYXRvclN0YXRlUmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkdldEluZGljYXRvck1hcCB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBhbHdheXMgWF9LQkdldEluZGljYXRvck1hcCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEMTYJcGFkIEIxNjsKKyAgICBDQVJEMzIJd2hpY2ggQjMyOworfSB4a2JHZXRJbmRpY2F0b3JNYXBSZXE7CisjZGVmaW5lCXN6X3hrYkdldEluZGljYXRvck1hcFJlcQkxMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0SW5kaWNhdG9yTWFwUmVwbHkgeworICAgIENBUkQ4CXR5cGU7CQkvKiBhbHdheXMgWF9SZXBseSAqLworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDMyCXdoaWNoIEIzMjsKKyAgICBDQVJEMzIJcmVhbEluZGljYXRvcnMgQjMyOworICAgIENBUkQ4CW5JbmRpY2F0b3JzOworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDE2CXBhZDIgQjE2OworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworfSB4a2JHZXRJbmRpY2F0b3JNYXBSZXBseTsKKyNkZWZpbmUJc3pfeGtiR2V0SW5kaWNhdG9yTWFwUmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkluZGljYXRvck1hcFdpcmVEZXNjIHsKKyAgICBDQVJEOAlmbGFnczsKKyAgICBDQVJEOAl3aGljaEdyb3VwczsKKyAgICBDQVJEOAlncm91cHM7CisgICAgQ0FSRDgJd2hpY2hNb2RzOworICAgIENBUkQ4CW1vZHM7CisgICAgQ0FSRDgJcmVhbE1vZHM7CisgICAgQ0FSRDE2CXZpcnR1YWxNb2RzIEIxNjsKKyAgICBDQVJEMzIJY3RybHMgQjMyOworfSB4a2JJbmRpY2F0b3JNYXBXaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiSW5kaWNhdG9yTWFwV2lyZURlc2MJMTIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlNldEluZGljYXRvck1hcCB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBhbHdheXMgWF9LQlNldEluZGljYXRvck1hcCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQ0FSRDMyCXdoaWNoIEIzMjsKK30geGtiU2V0SW5kaWNhdG9yTWFwUmVxOworI2RlZmluZQlzel94a2JTZXRJbmRpY2F0b3JNYXBSZXEJMTIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkdldE5hbWVkSW5kaWNhdG9yIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIFhfS0JHZXROYW1lZEluZGljYXRvciAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEMTYJbGVkQ2xhc3MgQjE2OworICAgIENBUkQxNglsZWRJRCBCMTY7CisgICAgQ0FSRDE2CXBhZDEgQjE2OworICAgIEF0b20JaW5kaWNhdG9yIEIzMjsKK30geGtiR2V0TmFtZWRJbmRpY2F0b3JSZXE7CisjZGVmaW5lCXN6X3hrYkdldE5hbWVkSW5kaWNhdG9yUmVxCQkxNgorCit0eXBlZGVmCXN0cnVjdCBfeGtiR2V0TmFtZWRJbmRpY2F0b3JSZXBseSB7CisgICAgQllURQl0eXBlOworICAgIEJZVEUJZGV2aWNlSUQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBBdG9tCWluZGljYXRvciBCMzI7CisgICAgQk9PTAlmb3VuZDsKKyAgICBCT09MCW9uOworICAgIEJPT0wJcmVhbEluZGljYXRvcjsKKyAgICBDQVJEOAluZHg7CisgICAgQ0FSRDgJZmxhZ3M7CisgICAgQ0FSRDgJd2hpY2hHcm91cHM7CisgICAgQ0FSRDgJZ3JvdXBzOworICAgIENBUkQ4CXdoaWNoTW9kczsKKyAgICBDQVJEOAltb2RzOworICAgIENBUkQ4CXJlYWxNb2RzOworICAgIENBUkQxNgl2aXJ0dWFsTW9kcyBCMTY7CisgICAgQ0FSRDMyCWN0cmxzIEIzMjsKKyAgICBCT09MCXN1cHBvcnRlZDsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQxNglwYWQyIEIxNjsKK30geGtiR2V0TmFtZWRJbmRpY2F0b3JSZXBseTsKKyNkZWZpbmUJc3pfeGtiR2V0TmFtZWRJbmRpY2F0b3JSZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiU2V0TmFtZWRJbmRpY2F0b3IgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJeGtiUmVxVHlwZTsJLyogWF9LQlNldE5hbWVkSW5kaWNhdG9yICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQxNglsZWRDbGFzcyBCMTY7CisgICAgQ0FSRDE2CWxlZElEIEIxNjsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQXRvbQlpbmRpY2F0b3IgQjMyOworICAgIEJPT0wJc2V0U3RhdGU7CisgICAgQk9PTAlvbjsKKyAgICBCT09MCXNldE1hcDsKKyAgICBCT09MCWNyZWF0ZU1hcDsKKyAgICBDQVJEOAlwYWQyOworICAgIENBUkQ4CWZsYWdzOworICAgIENBUkQ4CXdoaWNoR3JvdXBzOworICAgIENBUkQ4CWdyb3VwczsKKyAgICBDQVJEOAl3aGljaE1vZHM7CisgICAgQ0FSRDgJcmVhbE1vZHM7CisgICAgQ0FSRDE2CXZpcnR1YWxNb2RzIEIxNjsKKyAgICBDQVJEMzIJY3RybHMgQjMyOworfSB4a2JTZXROYW1lZEluZGljYXRvclJlcTsKKyNkZWZpbmUJc3pfeGtiU2V0TmFtZWRJbmRpY2F0b3JSZXEJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkdldE5hbWVzIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCR2V0TmFtZXMgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDE2CXBhZCBCMTY7CisgICAgQ0FSRDMyCXdoaWNoIEIzMjsKK30geGtiR2V0TmFtZXNSZXE7CisjZGVmaW5lCXN6X3hrYkdldE5hbWVzUmVxCQkxMgorCit0eXBlZGVmCXN0cnVjdCBfeGtiR2V0TmFtZXNSZXBseSB7CisgICAgQllURQl0eXBlOworICAgIEJZVEUJZGV2aWNlSUQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIJd2hpY2ggQjMyOworICAgIEtleUNvZGUJbWluS2V5Q29kZTsKKyAgICBLZXlDb2RlCW1heEtleUNvZGU7CisgICAgQ0FSRDgJblR5cGVzOworICAgIENBUkQ4CWdyb3VwTmFtZXM7CisgICAgQ0FSRDE2CXZpcnR1YWxNb2RzIEIxNjsKKyAgICBLZXlDb2RlCWZpcnN0S2V5OworICAgIENBUkQ4CW5LZXlzOworICAgIENBUkQzMglpbmRpY2F0b3JzIEIzMjsKKyAgICBDQVJEOAluUmFkaW9Hcm91cHM7CisgICAgQ0FSRDgJbktleUFsaWFzZXM7CisgICAgQ0FSRDE2CW5LVExldmVscyBCMTY7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworfSB4a2JHZXROYW1lc1JlcGx5OworI2RlZmluZQlzel94a2JHZXROYW1lc1JlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF94a2JTZXROYW1lcyB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBhbHdheXMgWF9LQlNldE5hbWVzICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQxNgl2aXJ0dWFsTW9kcyBCMTY7CisgICAgQ0FSRDMyCXdoaWNoIEIzMjsKKyAgICBDQVJEOAlmaXJzdFR5cGU7CisgICAgQ0FSRDgJblR5cGVzOworICAgIENBUkQ4CWZpcnN0S1RMZXZlbDsKKyAgICBDQVJEOAluS1RMZXZlbHM7CisgICAgQ0FSRDMyCWluZGljYXRvcnMgQjMyOworICAgIENBUkQ4CWdyb3VwTmFtZXM7CisgICAgQ0FSRDgJblJhZGlvR3JvdXBzOworICAgIEtleUNvZGUJZmlyc3RLZXk7CisgICAgQ0FSRDgJbktleXM7CisgICAgQ0FSRDgJbktleUFsaWFzZXM7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBDQVJEMTYJdG90YWxLVExldmVsTmFtZXMgQjE2OworfSB4a2JTZXROYW1lc1JlcTsKKyNkZWZpbmUJc3pfeGtiU2V0TmFtZXNSZXEJMjgKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlBvaW50V2lyZURlc2MgeworICAgIElOVDE2CXggQjE2OworICAgIElOVDE2CXkgQjE2OworfSB4a2JQb2ludFdpcmVEZXNjOworI2RlZmluZQlzel94a2JQb2ludFdpcmVEZXNjCTQKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYk91dGxpbmVXaXJlRGVzYyB7CisgICAgQ0FSRDgJblBvaW50czsKKyAgICBDQVJEOAljb3JuZXJSYWRpdXM7CisgICAgQ0FSRDE2CXBhZCBCMTY7Cit9IHhrYk91dGxpbmVXaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiT3V0bGluZVdpcmVEZXNjCTQKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlNoYXBlV2lyZURlc2MgeworICAgIEF0b20JbmFtZSBCMzI7CisgICAgQ0FSRDgJbk91dGxpbmVzOworICAgIENBUkQ4CXByaW1hcnlOZHg7CisgICAgQ0FSRDgJYXBwcm94TmR4OworICAgIENBUkQ4CXBhZDsKK30geGtiU2hhcGVXaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiU2hhcGVXaXJlRGVzYwk4CisKK3R5cGVkZWYgc3RydWN0IF94a2JTZWN0aW9uV2lyZURlc2MgeworICAgIEF0b20JbmFtZSBCMzI7CisgICAgSU5UMTYJdG9wIEIxNjsKKyAgICBJTlQxNglsZWZ0IEIxNjsKKyAgICBDQVJEMTYJd2lkdGggQjE2OworICAgIENBUkQxNgloZWlnaHQgQjE2OworICAgIElOVDE2CWFuZ2xlIEIxNjsKKyAgICBDQVJEOAlwcmlvcml0eTsKKyAgICBDQVJEOAluUm93czsKKyAgICBDQVJEOAluRG9vZGFkczsKKyAgICBDQVJEOAluT3ZlcmxheXM7CisgICAgQ0FSRDE2CXBhZCBCMTY7Cit9IHhrYlNlY3Rpb25XaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiU2VjdGlvbldpcmVEZXNjCTIwCisKK3R5cGVkZWYgc3RydWN0IF94a2JSb3dXaXJlRGVzYyB7CisgICAgSU5UMTYJdG9wIEIxNjsKKyAgICBJTlQxNglsZWZ0IEIxNjsKKyAgICBDQVJEOAluS2V5czsKKyAgICBCT09MCXZlcnRpY2FsOworICAgIENBUkQxNglwYWQgQjE2OworfSB4a2JSb3dXaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiUm93V2lyZURlc2MJOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiS2V5V2lyZURlc2MgeworICAgIENBUkQ4CW5hbWVbWGtiS2V5TmFtZUxlbmd0aF07CisgICAgSU5UMTYJZ2FwIEIxNjsKKyAgICBDQVJEOAlzaGFwZU5keDsKKyAgICBDQVJEOAljb2xvck5keDsKK30geGtiS2V5V2lyZURlc2M7CisjZGVmaW5lCXN6X3hrYktleVdpcmVEZXNjCTgKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYk92ZXJsYXlXaXJlRGVzYyB7CisgICAgQXRvbQluYW1lIEIzMjsKKyAgICBDQVJEOAluUm93czsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQxNglwYWQyIEIxNjsKK30geGtiT3ZlcmxheVdpcmVEZXNjOworI2RlZmluZQlzel94a2JPdmVybGF5V2lyZURlc2MJOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiT3ZlcmxheVJvd1dpcmVEZXNjIHsKKyAgIENBUkQ4CXJvd1VuZGVyOworICAgQ0FSRDgJbktleXM7CisgICBDQVJEMTYJcGFkMSBCMTY7Cit9IHhrYk92ZXJsYXlSb3dXaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiT3ZlcmxheVJvd1dpcmVEZXNjCTQKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYk92ZXJsYXlLZXlXaXJlRGVzYyB7CisgICBDQVJEOAlvdmVyW1hrYktleU5hbWVMZW5ndGhdOworICAgQ0FSRDgJdW5kZXJbWGtiS2V5TmFtZUxlbmd0aF07Cit9IHhrYk92ZXJsYXlLZXlXaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiT3ZlcmxheUtleVdpcmVEZXNjCTgKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlNoYXBlRG9vZGFkV2lyZURlc2MgeworICAgIEF0b20JbmFtZSBCMzI7CisgICAgQ0FSRDgJdHlwZTsKKyAgICBDQVJEOAlwcmlvcml0eTsKKyAgICBJTlQxNgl0b3AgQjE2OworICAgIElOVDE2CWxlZnQgQjE2OworICAgIElOVDE2CWFuZ2xlIEIxNjsKKyAgICBDQVJEOAljb2xvck5keDsKKyAgICBDQVJEOAlzaGFwZU5keDsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworfSB4a2JTaGFwZURvb2RhZFdpcmVEZXNjOworI2RlZmluZQlzel94a2JTaGFwZURvb2RhZFdpcmVEZXNjCTIwCisKK3R5cGVkZWYgc3RydWN0IF94a2JUZXh0RG9vZGFkV2lyZURlc2MgeworICAgIEF0b20JbmFtZSBCMzI7CisgICAgQ0FSRDgJdHlwZTsKKyAgICBDQVJEOAlwcmlvcml0eTsKKyAgICBJTlQxNgl0b3AgQjE2OworICAgIElOVDE2CWxlZnQgQjE2OworICAgIElOVDE2CWFuZ2xlIEIxNjsKKyAgICBDQVJEMTYJd2lkdGggQjE2OworICAgIENBUkQxNgloZWlnaHQgQjE2OworICAgIENBUkQ4CWNvbG9yTmR4OworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDE2CXBhZDIgQjE2OworfSB4a2JUZXh0RG9vZGFkV2lyZURlc2M7CisjZGVmaW5lCXN6X3hrYlRleHREb29kYWRXaXJlRGVzYwkyMAorCit0eXBlZGVmIHN0cnVjdCBfeGtiSW5kaWNhdG9yRG9vZGFkV2lyZURlc2MgeworICAgIEF0b20JbmFtZSBCMzI7CisgICAgQ0FSRDgJdHlwZTsKKyAgICBDQVJEOAlwcmlvcml0eTsKKyAgICBJTlQxNgl0b3AgQjE2OworICAgIElOVDE2CWxlZnQgQjE2OworICAgIElOVDE2CWFuZ2xlIEIxNjsKKyAgICBDQVJEOAlzaGFwZU5keDsKKyAgICBDQVJEOAlvbkNvbG9yTmR4OworICAgIENBUkQ4CW9mZkNvbG9yTmR4OworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworfSB4a2JJbmRpY2F0b3JEb29kYWRXaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiSW5kaWNhdG9yRG9vZGFkV2lyZURlc2MJMjAKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkxvZ29Eb29kYWRXaXJlRGVzYyB7CisgICAgQXRvbQluYW1lIEIzMjsKKyAgICBDQVJEOAl0eXBlOworICAgIENBUkQ4CXByaW9yaXR5OworICAgIElOVDE2CXRvcCBCMTY7CisgICAgSU5UMTYJbGVmdCBCMTY7CisgICAgSU5UMTYJYW5nbGUgQjE2OworICAgIENBUkQ4CWNvbG9yTmR4OworICAgIENBUkQ4CXNoYXBlTmR4OworICAgIENBUkQxNglwYWQxIEIxNjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7Cit9IHhrYkxvZ29Eb29kYWRXaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiTG9nb0Rvb2RhZFdpcmVEZXNjCTIwCisKK3R5cGVkZWYgc3RydWN0IF94a2JBbnlEb29kYWRXaXJlRGVzYyB7CisgICAgQXRvbQluYW1lIEIzMjsKKyAgICBDQVJEOAl0eXBlOworICAgIENBUkQ4CXByaW9yaXR5OworICAgIElOVDE2CXRvcCBCMTY7CisgICAgSU5UMTYJbGVmdCBCMTY7CisgICAgSU5UMTYJYW5nbGUgQjE2OworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7Cit9IHhrYkFueURvb2RhZFdpcmVEZXNjOworI2RlZmluZQlzel94a2JBbnlEb29kYWRXaXJlRGVzYwkyMAorCit0eXBlZGVmIHVuaW9uIF94a2JEb29kYWRXaXJlRGVzYyB7CisgICAgeGtiQW55RG9vZGFkV2lyZURlc2MJYW55OworICAgIHhrYlNoYXBlRG9vZGFkV2lyZURlc2MJc2hhcGU7CisgICAgeGtiVGV4dERvb2RhZFdpcmVEZXNjCXRleHQ7CisgICAgeGtiSW5kaWNhdG9yRG9vZGFkV2lyZURlc2MJaW5kaWNhdG9yOworICAgIHhrYkxvZ29Eb29kYWRXaXJlRGVzYwlsb2dvOworfSB4a2JEb29kYWRXaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiRG9vZGFkV2lyZURlc2MJMjAKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkdldEdlb21ldHJ5IHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCR2V0R2VvbWV0cnkgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDE2CXBhZCBCMTY7CisgICAgQXRvbQluYW1lIEIzMjsKK30geGtiR2V0R2VvbWV0cnlSZXE7CisjZGVmaW5lCXN6X3hrYkdldEdlb21ldHJ5UmVxCTEyCisKK3R5cGVkZWYgc3RydWN0IF94a2JHZXRHZW9tZXRyeVJlcGx5IHsKKyAgICBDQVJEOAl0eXBlOwkJLyogYWx3YXlzIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIEF0b20JbmFtZSBCMzI7CisgICAgQk9PTAlmb3VuZDsKKyAgICBDQVJEOAlwYWQ7CisgICAgQ0FSRDE2CXdpZHRoTU0gQjE2OworICAgIENBUkQxNgloZWlnaHRNTSBCMTY7CisgICAgQ0FSRDE2CW5Qcm9wZXJ0aWVzIEIxNjsKKyAgICBDQVJEMTYJbkNvbG9ycyBCMTY7CisgICAgQ0FSRDE2CW5TaGFwZXMgQjE2OworICAgIENBUkQxNgluU2VjdGlvbnMgQjE2OworICAgIENBUkQxNgluRG9vZGFkcyBCMTY7CisgICAgQ0FSRDE2CW5LZXlBbGlhc2VzIEIxNjsKKyAgICBDQVJEOAliYXNlQ29sb3JOZHg7CisgICAgQ0FSRDgJbGFiZWxDb2xvck5keDsKK30geGtiR2V0R2VvbWV0cnlSZXBseTsKKyNkZWZpbmUJc3pfeGtiR2V0R2VvbWV0cnlSZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiU2V0R2VvbWV0cnkgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJeGtiUmVxVHlwZTsJLyogYWx3YXlzIFhfS0JTZXRHZW9tZXRyeSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEOAluU2hhcGVzOworICAgIENBUkQ4CW5TZWN0aW9uczsKKyAgICBBdG9tCW5hbWUgQjMyOworICAgIENBUkQxNgl3aWR0aE1NIEIxNjsKKyAgICBDQVJEMTYJaGVpZ2h0TU0gQjE2OworICAgIENBUkQxNgluUHJvcGVydGllcyBCMTY7CisgICAgQ0FSRDE2CW5Db2xvcnMgQjE2OworICAgIENBUkQxNgluRG9vZGFkcyBCMTY7CisgICAgQ0FSRDE2CW5LZXlBbGlhc2VzIEIxNjsKKyAgICBDQVJEOAliYXNlQ29sb3JOZHg7CisgICAgQ0FSRDgJbGFiZWxDb2xvck5keDsKKyAgICBDQVJEMTYJcGFkIEIxNjsKK30geGtiU2V0R2VvbWV0cnlSZXE7CisjZGVmaW5lCXN6X3hrYlNldEdlb21ldHJ5UmVxCTI4CisKK3R5cGVkZWYgc3RydWN0IF94a2JQZXJDbGllbnRGbGFncyB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOy8qIGFsd2F5cyBYX0tCUGVyQ2xpZW50RmxhZ3MgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDE2CXBhZDEgQjE2OworICAgIENBUkQzMgljaGFuZ2UgQjMyOworICAgIENBUkQzMgl2YWx1ZSBCMzI7CisgICAgQ0FSRDMyCWN0cmxzVG9DaGFuZ2UgQjMyOworICAgIENBUkQzMglhdXRvQ3RybHMgQjMyOworICAgIENBUkQzMglhdXRvQ3RybFZhbHVlcyBCMzI7Cit9IHhrYlBlckNsaWVudEZsYWdzUmVxOworI2RlZmluZQlzel94a2JQZXJDbGllbnRGbGFnc1JlcQkyOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiUGVyQ2xpZW50RmxhZ3NSZXBseSB7CisgICAgQ0FSRDgJdHlwZTsJCS8qIGFsd2F5cyBYX1JlcGx5ICovCisgICAgQ0FSRDgJZGV2aWNlSUQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIJc3VwcG9ydGVkIEIzMjsKKyAgICBDQVJEMzIJdmFsdWUgQjMyOworICAgIENBUkQzMglhdXRvQ3RybHMgQjMyOworICAgIENBUkQzMglhdXRvQ3RybFZhbHVlcyBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKK30geGtiUGVyQ2xpZW50RmxhZ3NSZXBseTsKKyNkZWZpbmUJc3pfeGtiUGVyQ2xpZW50RmxhZ3NSZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiTGlzdENvbXBvbmVudHMgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJeGtiUmVxVHlwZTsJLyogYWx3YXlzIFhfS0JMaXN0Q29tcG9uZW50cyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEMTYJbWF4TmFtZXMgQjE2OworfSB4a2JMaXN0Q29tcG9uZW50c1JlcTsKKyNkZWZpbmUJc3pfeGtiTGlzdENvbXBvbmVudHNSZXEJOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiTGlzdENvbXBvbmVudHNSZXBseSB7CisgICAgQ0FSRDgJdHlwZTsJCS8qIGFsd2F5cyBYX1JlcGx5ICovCisgICAgQ0FSRDgJZGV2aWNlSUQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYJbktleW1hcHMgQjE2OworICAgIENBUkQxNgluS2V5Y29kZXMgQjE2OworICAgIENBUkQxNgluVHlwZXMgQjE2OworICAgIENBUkQxNgluQ29tcGF0TWFwcyBCMTY7CisgICAgQ0FSRDE2CW5TeW1ib2xzIEIxNjsKKyAgICBDQVJEMTYJbkdlb21ldHJpZXMgQjE2OworICAgIENBUkQxNglleHRyYSBCMTY7CisgICAgQ0FSRDE2CXBhZDEgQjE2OworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7Cit9IHhrYkxpc3RDb21wb25lbnRzUmVwbHk7CisjZGVmaW5lCXN6X3hrYkxpc3RDb21wb25lbnRzUmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkdldEtiZEJ5TmFtZSB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBhbHdheXMgWF9LQkdldEtiZEJ5TmFtZSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEMTYJbmVlZCBCMTY7CS8qIGNvbWJpbmF0aW9uIG9mIFhrYkdCTl8qICovCisgICAgQ0FSRDE2CXdhbnQgQjE2OwkvKiBjb21iaW5hdGlvbiBvZiBYa2JHQk5fKiAqLworICAgIEJPT0wJbG9hZDsKKyAgICBDQVJEOAlwYWQ7Cit9IHhrYkdldEtiZEJ5TmFtZVJlcTsKKyNkZWZpbmUJc3pfeGtiR2V0S2JkQnlOYW1lUmVxCTEyCisKK3R5cGVkZWYgc3RydWN0IF94a2JHZXRLYmRCeU5hbWVSZXBseSB7CisgICAgQ0FSRDgJdHlwZTsJCS8qIGFsd2F5cyBYX1JlcGx5ICovCisgICAgQ0FSRDgJZGV2aWNlSUQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBLZXlDb2RlCW1pbktleUNvZGU7CisgICAgS2V5Q29kZQltYXhLZXlDb2RlOworICAgIEJPT0wJbG9hZGVkOworICAgIEJPT0wJbmV3S2V5Ym9hcmQ7CisgICAgQ0FSRDE2CWZvdW5kIEIxNjsJLyogY29tYmluYXRpb24gb2YgWGtiR0JOXyogKi8KKyAgICBDQVJEMTYJcmVwb3J0ZWQgQjE2OwkvKiBjb21iaW5hdGlvbiBvZiBYa2JBbGxDb21wb25lbnRzICovCisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworfSB4a2JHZXRLYmRCeU5hbWVSZXBseTsKKyNkZWZpbmUJc3pfeGtiR2V0S2JkQnlOYW1lUmVwbHkJMzIKKwordHlwZWRlZglzdHJ1Y3QgX3hrYkRldmljZUxlZHNXaXJlRGVzYyB7CisgICAgQ0FSRDE2CWxlZENsYXNzIEIxNjsKKyAgICBDQVJEMTYJbGVkSUQgQjE2OworICAgIENBUkQzMgluYW1lc1ByZXNlbnQgQjMyOworICAgIENBUkQzMgltYXBzUHJlc2VudCBCMzI7CisgICAgQ0FSRDMyCXBoeXNJbmRpY2F0b3JzIEIzMjsKKyAgICBDQVJEMzIJc3RhdGUgQjMyOworfSB4a2JEZXZpY2VMZWRzV2lyZURlc2M7CisjZGVmaW5lIHN6X3hrYkRldmljZUxlZHNXaXJlRGVzYwkyMAorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0RGV2aWNlSW5mbyB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBhbHdheXMgWF9LQkdldERldmljZUluZm8gKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDE2CXdhbnRlZCBCMTY7CisgICAgQk9PTAlhbGxCdG5zOworICAgIENBUkQ4CWZpcnN0QnRuOworICAgIENBUkQ4CW5CdG5zOworICAgIENBUkQ4CXBhZDsKKyAgICBDQVJEMTYJbGVkQ2xhc3MgQjE2OworICAgIENBUkQxNglsZWRJRCBCMTY7Cit9IHhrYkdldERldmljZUluZm9SZXE7CisjZGVmaW5lCXN6X3hrYkdldERldmljZUluZm9SZXEJMTYKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkdldERldmljZUluZm9SZXBseSB7CisgICAgQ0FSRDgJdHlwZTsJCS8qIGFsd2F5cyBYX1JlcGx5ICovCisgICAgQ0FSRDgJZGV2aWNlSUQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYJcHJlc2VudCBCMTY7CisgICAgQ0FSRDE2CXN1cHBvcnRlZCBCMTY7CisgICAgQ0FSRDE2CXVuc3VwcG9ydGVkIEIxNjsKKyAgICBDQVJEMTYJbkRldmljZUxlZEZCcyBCMTY7CisgICAgQ0FSRDgJZmlyc3RCdG5XYW50ZWQ7CisgICAgQ0FSRDgJbkJ0bnNXYW50ZWQ7CisgICAgQ0FSRDgJZmlyc3RCdG5SdHJuOworICAgIENBUkQ4CW5CdG5zUnRybjsKKyAgICBDQVJEOAl0b3RhbEJ0bnM7CisgICAgQk9PTAloYXNPd25TdGF0ZTsKKyAgICBDQVJEMTYJZGZsdEtiZEZCIEIxNjsKKyAgICBDQVJEMTYJZGZsdExlZEZCIEIxNjsKKyAgICBDQVJEMTYJcGFkIEIxNjsKKyAgICBBdG9tCWRldlR5cGUgQjMyOworfSB4a2JHZXREZXZpY2VJbmZvUmVwbHk7CisjZGVmaW5lCXN6X3hrYkdldERldmljZUluZm9SZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiU2V0RGV2aWNlSW5mbyB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBhbHdheXMgWF9LQlNldERldmljZUluZm8gKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDgJZmlyc3RCdG47CisgICAgQ0FSRDgJbkJ0bnM7CisgICAgQ0FSRDE2CWNoYW5nZSBCMTY7CisgICAgQ0FSRDE2CW5EZXZpY2VMZWRGQnMgQjE2OworfSB4a2JTZXREZXZpY2VJbmZvUmVxOworI2RlZmluZQlzel94a2JTZXREZXZpY2VJbmZvUmVxCTEyCisKK3R5cGVkZWYgc3RydWN0IF94a2JTZXREZWJ1Z2dpbmdGbGFncyB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBhbHdheXMgWF9LQlNldERlYnVnZ2luZ0ZsYWdzICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CW1zZ0xlbmd0aCBCMTY7CisgICAgQ0FSRDE2CXBhZCBCMTY7CisgICAgQ0FSRDMyCWFmZmVjdEZsYWdzIEIzMjsKKyAgICBDQVJEMzIJZmxhZ3MgQjMyOworICAgIENBUkQzMglhZmZlY3RDdHJscyBCMzI7CisgICAgQ0FSRDMyCWN0cmxzIEIzMjsKK30geGtiU2V0RGVidWdnaW5nRmxhZ3NSZXE7CisjZGVmaW5lCXN6X3hrYlNldERlYnVnZ2luZ0ZsYWdzUmVxCTI0CisKK3R5cGVkZWYgc3RydWN0IF94a2JTZXREZWJ1Z2dpbmdGbGFnc1JlcGx5IHsKKyAgICBCWVRFCXR5cGU7CQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJcGFkMDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMgljdXJyZW50RmxhZ3MgQjMyOworICAgIENBUkQzMgljdXJyZW50Q3RybHMgQjMyOworICAgIENBUkQzMglzdXBwb3J0ZWRGbGFncyBCMzI7CisgICAgQ0FSRDMyCXN1cHBvcnRlZEN0cmxzIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworfSB4a2JTZXREZWJ1Z2dpbmdGbGFnc1JlcGx5OworI2RlZmluZQlzel94a2JTZXREZWJ1Z2dpbmdGbGFnc1JlcGx5CTMyCisKKwkvKgorCSAqIFggS0VZQk9BUkQgRVhURU5TSU9OIEVWRU5UIFNUUlVDVFVSRVMKKwkgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkFueUV2ZW50IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQl4a2JUeXBlOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgVGltZQl0aW1lIEIzMjsKKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQxNglwYWQyIEIxNjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKKyAgICBDQVJEMzIJcGFkNiBCMzI7CisgICAgQ0FSRDMyCXBhZDcgQjMyOworfSB4a2JBbnlFdmVudDsKKyNkZWZpbmUJc3pfeGtiQW55RXZlbnQgMzIKKwordHlwZWRlZglzdHJ1Y3QgX3hrYk5ld0tleWJvYXJkTm90aWZ5IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQl4a2JUeXBlOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgVGltZQl0aW1lIEIzMjsKKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEOAlvbGREZXZpY2VJRDsKKyAgICBLZXlDb2RlCW1pbktleUNvZGU7CisgICAgS2V5Q29kZQltYXhLZXlDb2RlOworICAgIEtleUNvZGUJb2xkTWluS2V5Q29kZTsKKyAgICBLZXlDb2RlCW9sZE1heEtleUNvZGU7CisgICAgQ0FSRDgJcmVxdWVzdE1ham9yOworICAgIENBUkQ4CXJlcXVlc3RNaW5vcjsKKyAgICBDQVJEMTYJY2hhbmdlZCBCMTY7CisgICAgQ0FSRDgJZGV0YWlsOworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7Cit9IHhrYk5ld0tleWJvYXJkTm90aWZ5OworI2RlZmluZQlzel94a2JOZXdLZXlib2FyZE5vdGlmeQkzMgorCit0eXBlZGVmCXN0cnVjdCBfeGtiTWFwTm90aWZ5IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQl4a2JUeXBlOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgVGltZQl0aW1lIEIzMjsKKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEOAlwdHJCdG5BY3Rpb25zOworICAgIENBUkQxNgljaGFuZ2VkIEIxNjsKKyAgICBLZXlDb2RlCW1pbktleUNvZGU7CisgICAgS2V5Q29kZQltYXhLZXlDb2RlOworICAgIENBUkQ4CWZpcnN0VHlwZTsKKyAgICBDQVJEOAluVHlwZXM7CisgICAgS2V5Q29kZQlmaXJzdEtleVN5bTsKKyAgICBDQVJEOAluS2V5U3ltczsKKyAgICBLZXlDb2RlCWZpcnN0S2V5QWN0OworICAgIENBUkQ4CW5LZXlBY3RzOworICAgIEtleUNvZGUJZmlyc3RLZXlCZWhhdmlvcjsKKyAgICBDQVJEOAluS2V5QmVoYXZpb3JzOworICAgIEtleUNvZGUJZmlyc3RLZXlFeHBsaWNpdDsKKyAgICBDQVJEOAluS2V5RXhwbGljaXQ7CisgICAgS2V5Q29kZQlmaXJzdE1vZE1hcEtleTsKKyAgICBDQVJEOAluTW9kTWFwS2V5czsKKyAgICBLZXlDb2RlCWZpcnN0Vk1vZE1hcEtleTsKKyAgICBDQVJEOAluVk1vZE1hcEtleXM7CisgICAgQ0FSRDE2CXZpcnR1YWxNb2RzIEIxNjsKKyAgICBDQVJEMTYJcGFkMSBCMTY7Cit9IHhrYk1hcE5vdGlmeTsKKyNkZWZpbmUJc3pfeGtiTWFwTm90aWZ5CTMyCisKK3R5cGVkZWYJc3RydWN0IF94a2JTdGF0ZU5vdGlmeSB7CisgICAgQllURQl0eXBlOworICAgIEJZVEUJeGtiVHlwZTsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIFRpbWUJdGltZSBCMzI7CisgICAgQ0FSRDgJZGV2aWNlSUQ7CisgICAgQ0FSRDgJbW9kczsKKyAgICBDQVJEOAliYXNlTW9kczsKKyAgICBDQVJEOAlsYXRjaGVkTW9kczsKKyAgICBDQVJEOAlsb2NrZWRNb2RzOworICAgIENBUkQ4CWdyb3VwOworICAgIElOVDE2CWJhc2VHcm91cCBCMTY7CisgICAgSU5UMTYJbGF0Y2hlZEdyb3VwIEIxNjsKKyAgICBDQVJEOAlsb2NrZWRHcm91cDsKKyAgICBDQVJEOAljb21wYXRTdGF0ZTsKKyAgICBDQVJEOAlncmFiTW9kczsKKyAgICBDQVJEOAljb21wYXRHcmFiTW9kczsKKyAgICBDQVJEOAlsb29rdXBNb2RzOworICAgIENBUkQ4CWNvbXBhdExvb2t1cE1vZHM7CisgICAgQ0FSRDE2CXB0ckJ0blN0YXRlIEIxNjsKKyAgICBDQVJEMTYJY2hhbmdlZCBCMTY7CisgICAgS2V5Q29kZQlrZXljb2RlOworICAgIENBUkQ4CWV2ZW50VHlwZTsKKyAgICBDQVJEOAlyZXF1ZXN0TWFqb3I7CisgICAgQ0FSRDgJcmVxdWVzdE1pbm9yOworfSB4a2JTdGF0ZU5vdGlmeTsKKyNkZWZpbmUJc3pfeGtiU3RhdGVOb3RpZnkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkNvbnRyb2xzTm90aWZ5IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQl4a2JUeXBlOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgVGltZQl0aW1lIEIzMjsKKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEOAludW1Hcm91cHM7CisgICAgQ0FSRDE2CXBhZDEgQjE2OworICAgIENBUkQzMgljaGFuZ2VkQ29udHJvbHMgQjMyOworICAgIENBUkQzMgllbmFibGVkQ29udHJvbHMgQjMyOworICAgIENBUkQzMgllbmFibGVkQ29udHJvbENoYW5nZXMgQjMyOworICAgIEtleUNvZGUJa2V5Y29kZTsKKyAgICBDQVJEOAlldmVudFR5cGU7CisgICAgQ0FSRDgJcmVxdWVzdE1ham9yOworICAgIENBUkQ4CXJlcXVlc3RNaW5vcjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7Cit9IHhrYkNvbnRyb2xzTm90aWZ5OworI2RlZmluZQlzel94a2JDb250cm9sc05vdGlmeQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiSW5kaWNhdG9yTm90aWZ5IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQl4a2JUeXBlOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgVGltZQl0aW1lIEIzMjsKKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQxNglwYWQyIEIxNjsKKyAgICBDQVJEMzIJc3RhdGUgQjMyOworICAgIENBUkQzMgljaGFuZ2VkIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKK30geGtiSW5kaWNhdG9yTm90aWZ5OworI2RlZmluZQlzel94a2JJbmRpY2F0b3JOb3RpZnkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYk5hbWVzTm90aWZ5IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQl4a2JUeXBlOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgVGltZQl0aW1lIEIzMjsKKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQxNgljaGFuZ2VkIEIxNjsKKyAgICBDQVJEOAlmaXJzdFR5cGU7CisgICAgQ0FSRDgJblR5cGVzOworICAgIENBUkQ4CWZpcnN0TGV2ZWxOYW1lOworICAgIENBUkQ4CW5MZXZlbE5hbWVzOworICAgIENBUkQ4CXBhZDI7CisgICAgQ0FSRDgJblJhZGlvR3JvdXBzOworICAgIENBUkQ4CW5BbGlhc2VzOworICAgIENBUkQ4CWNoYW5nZWRHcm91cE5hbWVzOworICAgIENBUkQxNgljaGFuZ2VkVmlydHVhbE1vZHMgQjE2OworICAgIENBUkQ4CWZpcnN0S2V5OworICAgIENBUkQ4CW5LZXlzOworICAgIENBUkQzMgljaGFuZ2VkSW5kaWNhdG9ycyBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworfSB4a2JOYW1lc05vdGlmeTsKKyNkZWZpbmUJc3pfeGtiTmFtZXNOb3RpZnkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkNvbXBhdE1hcE5vdGlmeSB7CisgICAgQllURQl0eXBlOworICAgIEJZVEUJeGtiVHlwZTsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIFRpbWUJdGltZSBCMzI7CisgICAgQ0FSRDgJZGV2aWNlSUQ7CisgICAgQ0FSRDgJY2hhbmdlZEdyb3VwczsKKyAgICBDQVJEMTYJZmlyc3RTSSBCMTY7CisgICAgQ0FSRDE2CW5TSSBCMTY7CisgICAgQ0FSRDE2CW5Ub3RhbFNJIEIxNjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7Cit9IHhrYkNvbXBhdE1hcE5vdGlmeTsKKyNkZWZpbmUgc3pfeGtiQ29tcGF0TWFwTm90aWZ5CTMyCisKK3R5cGVkZWYgc3RydWN0IF94a2JCZWxsTm90aWZ5IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQl4a2JUeXBlOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgVGltZQl0aW1lIEIzMjsKKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEOAliZWxsQ2xhc3M7CisgICAgQ0FSRDgJYmVsbElEOworICAgIENBUkQ4CXBlcmNlbnQ7CisgICAgQ0FSRDE2CXBpdGNoIEIxNjsKKyAgICBDQVJEMTYJZHVyYXRpb24gQjE2OworICAgIEF0b20JbmFtZSBCMzI7CisgICAgV2luZG93CXdpbmRvdyBCMzI7CisgICAgQk9PTAlldmVudE9ubHk7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBDQVJEMTYJcGFkMiBCMTY7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworfSB4a2JCZWxsTm90aWZ5OworI2RlZmluZQlzel94a2JCZWxsTm90aWZ5CTMyCisKK3R5cGVkZWYgc3RydWN0IF94a2JBY3Rpb25NZXNzYWdlIHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQl4a2JUeXBlOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgVGltZQl0aW1lIEIzMjsKKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBLZXlDb2RlCWtleWNvZGU7CisgICAgQk9PTAlwcmVzczsKKyAgICBCT09MCWtleUV2ZW50Rm9sbG93czsKKyAgICBDQVJEOAltb2RzOworICAgIENBUkQ4CWdyb3VwOworICAgIENBUkQ4CW1lc3NhZ2VbOF07CisgICAgQ0FSRDE2CXBhZDEgQjE2OworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7Cit9IHhrYkFjdGlvbk1lc3NhZ2U7CisjZGVmaW5lCXN6X3hrYkFjdGlvbk1lc3NhZ2UJCTMyCisKK3R5cGVkZWYgc3RydWN0IF94a2JBY2Nlc3NYTm90aWZ5IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQl4a2JUeXBlOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgVGltZQl0aW1lIEIzMjsKKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBLZXlDb2RlCWtleWNvZGU7CisgICAgQ0FSRDE2CWRldGFpbCBCMTY7CisgICAgQ0FSRDE2CXNsb3dLZXlzRGVsYXkgQjE2OworICAgIENBUkQxNglkZWJvdW5jZURlbGF5IEIxNjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7Cit9IHhrYkFjY2Vzc1hOb3RpZnk7CisjZGVmaW5lCXN6X3hrYkFjY2Vzc1hOb3RpZnkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkV4dGVuc2lvbkRldmljZU5vdGlmeSB7CisgICAgQllURQl0eXBlOworICAgIEJZVEUJeGtiVHlwZTsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIFRpbWUJdGltZSBCMzI7CisgICAgQ0FSRDgJZGV2aWNlSUQ7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBDQVJEMTYJcmVhc29uIEIxNjsKKyAgICBDQVJEMTYJbGVkQ2xhc3MgQjE2OworICAgIENBUkQxNglsZWRJRCBCMTY7CisgICAgQ0FSRDMyCWxlZHNEZWZpbmVkIEIzMjsKKyAgICBDQVJEMzIJbGVkU3RhdGUgQjMyOworICAgIENBUkQ4CWZpcnN0QnRuOworICAgIENBUkQ4CW5CdG5zOworICAgIENBUkQxNglzdXBwb3J0ZWQgQjE2OworICAgIENBUkQxNgl1bnN1cHBvcnRlZCBCMTY7CisgICAgQ0FSRDE2CXBhZDMgQjE2OworfSB4a2JFeHRlbnNpb25EZXZpY2VOb3RpZnk7CisjZGVmaW5lCXN6X3hrYkV4dGVuc2lvbkRldmljZU5vdGlmeQkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkV2ZW50IHsKKyAgICB1bmlvbiB7CisJeGtiQW55RXZlbnQJCWFueTsKKwl4a2JOZXdLZXlib2FyZE5vdGlmeQluZXdfa2JkOworCXhrYk1hcE5vdGlmeQkJbWFwOworCXhrYlN0YXRlTm90aWZ5CQlzdGF0ZTsKKwl4a2JDb250cm9sc05vdGlmeQljdHJsczsKKwl4a2JJbmRpY2F0b3JOb3RpZnkJaW5kaWNhdG9yczsKKwl4a2JOYW1lc05vdGlmeQkJbmFtZXM7CisJeGtiQ29tcGF0TWFwTm90aWZ5CWNvbXBhdDsKKwl4a2JCZWxsTm90aWZ5CQliZWxsOworCXhrYkFjdGlvbk1lc3NhZ2UJbWVzc2FnZTsKKwl4a2JBY2Nlc3NYTm90aWZ5CWFjY2Vzc3g7CisJeGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5IGRldmljZTsKKyAgICB9IHU7Cit9IHhrYkV2ZW50OworI2RlZmluZSBzel94a2JFdmVudAkzMgorCisjdW5kZWYgV2luZG93CisjdW5kZWYgQXRvbQorI3VuZGVmIFRpbWUKKyN1bmRlZiBLZXlDb2RlCisjdW5kZWYgS2V5U3ltCisKKyNlbmRpZiAvKiBfWEtCUFJPVE9fSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEtCc3J2LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hLQnNydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YTRlZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hLQnNydi5oCkBAIC0wLDAgKzEsMTE4NyBAQAorLyogJFhvcmc6IFhLQnNydi5oLHYgMS4zIDIwMDAvMDgvMTggMDQ6MDU6NDUgY29za3JleSBFeHAgJCAqLworLyogJFhkb3RPcmc6ICQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMTk5MyBieSBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dAorZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKK25vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0Citub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIFNpbGljb24gR3JhcGhpY3Mgbm90IGJlIAordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gCitvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSAKK29mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCit3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKK1NJTElDT04gR1JBUEhJQ1MgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgCitTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIAorQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBJTiBOTyBFVkVOVCBTSEFMTCBTSUxJQ09OCitHUkFQSElDUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIAorREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCAKK0RBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgCitPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gIFdJVEgKK1RIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAkWEZyZWU4NjogeGMvaW5jbHVkZS9leHRlbnNpb25zL1hLQnNydi5oLHYgMy4yMiAyMDAyLzExLzIwIDA0OjQ5OjAxIGRhd2VzIEV4cCAkICovCisKKyNpZm5kZWYgX1hLQlNSVl9IXworI2RlZmluZQlfWEtCU1JWX0hfCisKKyNpZmRlZiBYS0JfSU5fU0VSVkVSCisjZGVmaW5lIFhrYkFsbG9jQ2xpZW50TWFwCQlTcnZYa2JBbGxvY0NsaWVudE1hcAorI2RlZmluZSBYa2JBbGxvY1NlcnZlck1hcAkJU3J2WGtiQWxsb2NTZXJ2ZXJNYXAKKyNkZWZpbmUgWGtiQ2hhbmdlVHlwZXNPZktleQkJU3J2WGtiQ2hhbmdlVHlwZXNPZktleQorI2RlZmluZQlYa2JBZGRLZXlUeXBlCQkJU3J2WGtiQWRkS2V5VHlwZQorI2RlZmluZSBYa2JDb3B5S2V5VHlwZQkJCVNydlhrYkNvcHlLZXlUeXBlCisjZGVmaW5lIFhrYkNvcHlLZXlUeXBlcwkJCVNydlhrYkNvcHlLZXlUeXBlcworI2RlZmluZSBYa2JGcmVlQ2xpZW50TWFwCQlTcnZYa2JGcmVlQ2xpZW50TWFwCisjZGVmaW5lIFhrYkZyZWVTZXJ2ZXJNYXAJCVNydlhrYkZyZWVTZXJ2ZXJNYXAKKyNkZWZpbmUgWGtiSW5pdENhbm9uaWNhbEtleVR5cGVzCVNydlhrYkluaXRDYW5vbmljYWxLZXlUeXBlcworI2RlZmluZQlYa2JLZXlUeXBlc0ZvckNvcmVTeW1ib2xzCVNydlhrYktleVR5cGVzRm9yQ29yZVN5bWJvbHMKKyNkZWZpbmUJWGtiQXBwbHlDb21wYXRNYXBUb0tleQkJU3J2WGtiQXBwbHlDb21wYXRNYXBUb0tleQorI2RlZmluZQlYa2JVcGRhdGVNYXBGcm9tQ29yZQkJU3J2WGtiVXBkYXRlTWFwRnJvbUNvcmUKKyNkZWZpbmUgWGtiUmVzaXplS2V5QWN0aW9ucwkJU3J2WGtiUmVzaXplS2V5QWN0aW9ucworI2RlZmluZSBYa2JSZXNpemVLZXlTeW1zCQlTcnZYa2JSZXNpemVLZXlTeW1zCisjZGVmaW5lIFhrYlJlc2l6ZUtleVR5cGUJCVNydlhrYlJlc2l6ZUtleVR5cGUKKyNkZWZpbmUgWGtiQWxsb2NDb21wYXRNYXAJCVNydlhrYkFsbG9jQ29tcGF0TWFwCisjZGVmaW5lIFhrYkFsbG9jQ29udHJvbHMJCVNydlhrYkFsbG9jQ29udHJvbHMKKyNkZWZpbmUgWGtiQWxsb2NJbmRpY2F0b3JNYXBzCQlTcnZYa2JBbGxvY0luZGljYXRvck1hcHMKKyNkZWZpbmUgWGtiQWxsb2NLZXlib2FyZAkJU3J2WGtiQWxsb2NLZXlib2FyZAorI2RlZmluZSBYa2JBbGxvY05hbWVzCQkJU3J2WGtiQWxsb2NOYW1lcworI2RlZmluZSBYa2JGcmVlQ29tcGF0TWFwCQlTcnZYa2JGcmVlQ29tcGF0TWFwCisjZGVmaW5lIFhrYkZyZWVDb250cm9scwkJCVNydlhrYkZyZWVDb250cm9scworI2RlZmluZSBYa2JGcmVlSW5kaWNhdG9yTWFwcwkJU3J2WGtiRnJlZUluZGljYXRvck1hcHMKKyNkZWZpbmUgWGtiRnJlZUtleWJvYXJkCQkJU3J2WGtiRnJlZUtleWJvYXJkCisjZGVmaW5lIFhrYkZyZWVOYW1lcwkJCVNydlhrYkZyZWVOYW1lcworI2RlZmluZQlYa2JBZGREZXZpY2VMZWRJbmZvCQlTcnZYa2JBZGREZXZpY2VMZWRJbmZvCisjZGVmaW5lCVhrYkFsbG9jRGV2aWNlSW5mbwkJU3J2WGtiQWxsb2NEZXZpY2VJbmZvCisjZGVmaW5lCVhrYkZyZWVEZXZpY2VJbmZvCQlTcnZYa2JGcmVlRGV2aWNlSW5mbworI2RlZmluZQlYa2JSZXNpemVEZXZpY2VCdXR0b25BY3Rpb25zCVNydlhrYlJlc2l6ZURldmljZUJ1dHRvbkFjdGlvbnMKKyNkZWZpbmUgWGtiTGF0Y2hNb2RpZmllcnMJCVNydlhrYkxhdGNoTW9kaWZpZXJzCisjZGVmaW5lIFhrYkxhdGNoR3JvdXAJCQlTcnZYa2JMYXRjaEdyb3VwCisjZGVmaW5lIFhrYlZpcnR1YWxNb2RzVG9SZWFsCQlTcnZYa2JWaXJ0dWFsTW9kc1RvUmVhbAorI2RlZmluZQlYa2JDaGFuZ2VLZXljb2RlUmFuZ2UJCVNydlhrYkNoYW5nZUtleWNvZGVSYW5nZQorI2RlZmluZQlYa2JBcHBseVZpcnR1YWxNb2RDaGFuZ2VzCVNydlhrYkFwcGx5VmlydHVhbE1vZENoYW5nZXMKKyNkZWZpbmUJWGtiVXBkYXRlQWN0aW9uVmlydHVhbE1vZHMJU3J2WGtiVXBkYXRlQWN0aW9uVmlydHVhbE1vZHMKKyNkZWZpbmUgWGtiVXBkYXRlS2V5VHlwZVZpcnR1YWxNb2RzCVNydlhrYlVwZGF0ZUtleVR5cGVWaXJ0dWFsTW9kcworI2VuZGlmCisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YS0JzdHIuaD4KKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YS0Jwcm90by5oPgorI2luY2x1ZGUgImlucHV0c3RyLmgiCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JJbnRlcmVzdCB7CisJRGV2aWNlSW50UHRyCQlkZXY7CisJQ2xpZW50UHRyCQljbGllbnQ7CisJWElECQkJcmVzb3VyY2U7CisJc3RydWN0IF9Ya2JJbnRlcmVzdCAqCW5leHQ7CisJQ0FSRDE2CQkJZXh0RGV2Tm90aWZ5TWFzazsKKwlDQVJEMTYJCQlzdGF0ZU5vdGlmeU1hc2s7CisJQ0FSRDE2CQkJbmFtZXNOb3RpZnlNYXNrOworCUNBUkQzMiAJCQljdHJsc05vdGlmeU1hc2s7CisJQ0FSRDgJCQljb21wYXROb3RpZnlNYXNrOworCUJPT0wJCQliZWxsTm90aWZ5TWFzazsKKwlCT09MCQkJYWN0aW9uTWVzc2FnZU1hc2s7CisJQ0FSRDE2CQkJYWNjZXNzWE5vdGlmeU1hc2s7CisJQ0FSRDMyCQkJaVN0YXRlTm90aWZ5TWFzazsKKwlDQVJEMzIJCQlpTWFwTm90aWZ5TWFzazsKKwlDQVJEMTYJCQlhbHRTeW1zTm90aWZ5TWFzazsKKwlDQVJEMzIJCQlhdXRvQ3RybHM7CisJQ0FSRDMyCQkJYXV0b0N0cmxWYWx1ZXM7Cit9IFhrYkludGVyZXN0UmVjLCpYa2JJbnRlcmVzdFB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYlJhZGlvR3JvdXAgeworCUNBUkQ4CQlmbGFnczsKKwlDQVJEOAkJbk1lbWJlcnM7CisJQ0FSRDgJCWRmbHREb3duOworCUNBUkQ4CQljdXJyZW50RG93bjsKKwlDQVJEOAkJbWVtYmVyc1tYa2JSR01heE1lbWJlcnNdOworfSBYa2JSYWRpb0dyb3VwUmVjLCAqWGtiUmFkaW9Hcm91cFB0cjsKKwordHlwZWRlZiBzdHJ1Y3QJX1hrYkV2ZW50Q2F1c2UgeworCUNBUkQ4CQlrYzsKKwlDQVJEOAkJZXZlbnQ7CisJQ0FSRDgJCW1qcjsKKwlDQVJEOAkJbW5yOworCUNsaWVudFB0cgljbGllbnQ7Cit9IFhrYkV2ZW50Q2F1c2VSZWMsKlhrYkV2ZW50Q2F1c2VQdHI7CisjZGVmaW5lCVhrYlNldENhdXNlS2V5KGMsayxlKQl7IChjKS0+a2M9IChrKSwoYyktPmV2ZW50PSAoZSksXAorCQkJCSAgKGMpLT5tanI9IChjKS0+bW5yPSAwOyBcCisJCQkJICAoYyktPmNsaWVudD0gTlVMTDsgfQorI2RlZmluZQlYa2JTZXRDYXVzZVJlcShjLGosbixjbCkgeyAoYyktPmtjPSAoYyktPmV2ZW50PSAwLFwKKwkJCQkgIChjKS0+bWpyPSAoaiksKGMpLT5tbnI9IChuKTtcCisJCQkJICAoYyktPmNsaWVudD0gKGNsKTsgfQorI2RlZmluZQlYa2JTZXRDYXVzZUNvcmVSZXEoYyxlLGNsKSBYa2JTZXRDYXVzZVJlcShjLGUsMCxjbCkKKyNkZWZpbmUJWGtiU2V0Q2F1c2VYa2JSZXEoYyxlLGNsKSAgWGtiU2V0Q2F1c2VSZXEoYyxYa2JSZXFDb2RlLGUsY2wpCisjZGVmaW5lCVhrYlNldENhdXNlVW5rbm93bihjKQkgICBYa2JTZXRDYXVzZUtleShjLDAsMCkKKworI2RlZmluZQlfT0ZGX1RJTUVSCQkwCisjZGVmaW5lCV9LUkdfV0FSTl9USU1FUgkJMQorI2RlZmluZQlfS1JHX1RJTUVSCQkyCisjZGVmaW5lCV9TS19USU1FT1VUX1RJTUVSCTMKKyNkZWZpbmUJX0FMTF9USU1FT1VUX1RJTUVSCTQKKworI2RlZmluZQlfQkVFUF9OT05FCQkwCisjZGVmaW5lCV9CRUVQX0ZFQVRVUkVfT04JMQorI2RlZmluZQlfQkVFUF9GRUFUVVJFX09GRgkyCisjZGVmaW5lCV9CRUVQX0ZFQVRVUkVfQ0hBTkdFCTMKKyNkZWZpbmUJX0JFRVBfU0xPV19XQVJOCQk0CisjZGVmaW5lCV9CRUVQX1NMT1dfUFJFU1MJNQorI2RlZmluZQlfQkVFUF9TTE9XX0FDQ0VQVAk2CisjZGVmaW5lCV9CRUVQX1NMT1dfUkVKRUNUCTcKKyNkZWZpbmUJX0JFRVBfU0xPV19SRUxFQVNFCTgKKyNkZWZpbmUJX0JFRVBfU1RJQ0tZX0xBVENICTkKKyNkZWZpbmUJX0JFRVBfU1RJQ0tZX0xPQ0sJMTAKKyNkZWZpbmUJX0JFRVBfU1RJQ0tZX1VOTE9DSwkxMQorI2RlZmluZQlfQkVFUF9MRURfT04JCTEyCisjZGVmaW5lCV9CRUVQX0xFRF9PRkYJCTEzCisjZGVmaW5lCV9CRUVQX0xFRF9DSEFOR0UJMTQKKyNkZWZpbmUJX0JFRVBfQk9VTkNFX1JFSkVDVAkxNQorCit0eXBlZGVmIHN0cnVjdCBfWGtiU3J2SW5mbyB7CisJWGtiU3RhdGVSZWMJIHByZXZfc3RhdGU7CisJWGtiU3RhdGVSZWMJIHN0YXRlOworCVhrYkRlc2NQdHIJIGRlc2M7CisKKwlEZXZpY2VJbnRQdHIJIGRldmljZTsKKwlLYmRDdHJsUHJvY1B0cgkga2JkUHJvYzsKKworCVhrYlJhZGlvR3JvdXBQdHIgcmFkaW9Hcm91cHM7CisJQ0FSRDgJCSBuUmFkaW9Hcm91cHM7CisJQ0FSRDgJCSBjbGVhck1vZHM7CisJQ0FSRDgJCSBzZXRNb2RzOworCUlOVDE2CQkgZ3JvdXBDaGFuZ2U7CisKKwlDQVJEMTYJCSBkZmx0UHRyRGVsdGE7CisKKwlkb3VibGUJCSBtb3VzZUtleXNDdXJ2ZTsKKwlkb3VibGUJCSBtb3VzZUtleXNDdXJ2ZUZhY3RvcjsKKwlJTlQxNgkJIG1vdXNlS2V5c0RYOworCUlOVDE2CQkgbW91c2VLZXlzRFk7CisJQ0FSRDgJCSBtb3VzZUtleXNGbGFnczsKKwlCb29sCQkgbW91c2VLZXlzQWNjZWw7CisJQ0FSRDgJCSBtb3VzZUtleXNDb3VudGVyOworCisJQ0FSRDgJCSBsb2NrZWRQdHJCdXR0b25zOworCUNBUkQ4CQkgc2hpZnRLZXlDb3VudDsKKwlLZXlDb2RlCQkgbW91c2VLZXk7CisJS2V5Q29kZQkJIGluYWN0aXZlS2V5OworCUtleUNvZGUJCSBzbG93S2V5OworCUtleUNvZGUJCSByZXBlYXRLZXk7CisJQ0FSRDgJCSBrcmdUaW1lckFjdGl2ZTsKKwlDQVJEOAkJIGJlZXBUeXBlOworCUNBUkQ4CQkgYmVlcENvdW50OworCisJQ0FSRDMyCQkgZmxhZ3M7CisJQ0FSRDMyCQkgbGFzdFB0ckV2ZW50VGltZTsKKwlDQVJEMzIJCSBsYXN0U2hpZnRFdmVudFRpbWU7CisJT3NUaW1lclB0cgkgYmVlcFRpbWVyOworCU9zVGltZXJQdHIJIG1vdXNlS2V5VGltZXI7CisJT3NUaW1lclB0cgkgc2xvd0tleXNUaW1lcjsKKwlPc1RpbWVyUHRyCSBib3VuY2VLZXlzVGltZXI7CisJT3NUaW1lclB0cgkgcmVwZWF0S2V5VGltZXI7CisJT3NUaW1lclB0cgkga3JnVGltZXI7Cit9IFhrYlNydkluZm9SZWMsICpYa2JTcnZJbmZvUHRyOworCisjZGVmaW5lCVhrYlNMSV9Jc0RlZmF1bHQJKDFMPDwwKQorI2RlZmluZQlYa2JTTElfSGFzT3duU3RhdGUJKDFMPDwxKQorCit0eXBlZGVmIHN0cnVjdAlfWGtiU3J2TGVkSW5mbyB7CisJQ0FSRDE2CQkJZmxhZ3M7CisJQ0FSRDE2CQkJY2xhc3M7CisJQ0FSRDE2CQkJaWQ7CisJdW5pb24geworCSAgICBLYmRGZWVkYmFja1B0cglrZjsKKwkgICAgTGVkRmVlZGJhY2tQdHIJbGY7CisJfSAJCQlmYjsKKworCUNBUkQzMgkJCXBoeXNJbmRpY2F0b3JzOworCUNBUkQzMgkJCWF1dG9TdGF0ZTsKKwlDQVJEMzIJCQlleHBsaWNpdFN0YXRlOworCUNBUkQzMgkJCWVmZmVjdGl2ZVN0YXRlOworCisJQ0FSRDMyCQkJbWFwc1ByZXNlbnQ7CisJQ0FSRDMyCQkJbmFtZXNQcmVzZW50OworCVhrYkluZGljYXRvck1hcFB0cgltYXBzOworCUF0b20gKgkJCW5hbWVzOworCisJQ0FSRDMyCQkJdXNlc0Jhc2U7CisJQ0FSRDMyCQkJdXNlc0xhdGNoZWQ7CisJQ0FSRDMyCQkJdXNlc0xvY2tlZDsKKwlDQVJEMzIJCQl1c2VzRWZmZWN0aXZlOworCUNBUkQzMgkJCXVzZXNDb21wYXQ7CisJQ0FSRDMyCQkJdXNlc0NvbnRyb2xzOworCisJQ0FSRDMyCQkJdXNlZENvbXBvbmVudHM7Cit9IFhrYlNydkxlZEluZm9SZWMsICpYa2JTcnZMZWRJbmZvUHRyOworCisvKgorICogU2V0dGluZ3MgZm9yIHhrYkNsaWVudEZsYWdzIGZpZWxkICh1c2VkIGJ5IERJWCkKKyAqIFRoZXNlIGZsYWdzIF9tdXN0XyBub3Qgb3ZlcmxhcCB3aXRoIFhrYlBDRl8qCisgKi8KKyNkZWZpbmUJX1hrYkNsaWVudEluaXRpYWxpemVkCQkoMTw8MTUpCisKKyNkZWZpbmUJX1hrYldhbnRzRGV0ZWN0YWJsZUF1dG9SZXBlYXQoYylcCisJKChjKS0+eGtiQ2xpZW50RmxhZ3MmWGtiUENGX0RldGVjdGFibGVBdXRvUmVwZWF0TWFzaykKKworLyoKKyAqIFNldHRpbmdzIGZvciBmbGFncyBmaWVsZAorICovCisjZGVmaW5lCV9Ya2JTdGF0ZU5vdGlmeUluUHJvZ3Jlc3MJKDE8PDApCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHJvY2Vzc0lucHV0UHJvYyBwcm9jZXNzSW5wdXRQcm9jOworICAgIFByb2Nlc3NJbnB1dFByb2MgcmVhbElucHV0UHJvYzsKKyAgICBEZXZpY2VVbndyYXBQcm9jIHVud3JhcFByb2M7Cit9IHhrYkRldmljZUluZm9SZWMsICp4a2JEZXZpY2VJbmZvUHRyOworCisjZGVmaW5lIFdSQVBfUFJPQ0VTU19JTlBVVF9QUk9DKGRldmljZSwgb2xkcHJvY3MsIHByb2MsIHVud3JhcHByb2MpIFwKKwlkZXZpY2UtPnB1YmxpYy5wcm9jZXNzSW5wdXRQcm9jID0gcHJvYzsgXAorCW9sZHByb2NzLT5wcm9jZXNzSW5wdXRQcm9jID0gXAorCW9sZHByb2NzLT5yZWFsSW5wdXRQcm9jID0gZGV2aWNlLT5wdWJsaWMucmVhbElucHV0UHJvYzsgXAorCWRldmljZS0+cHVibGljLnJlYWxJbnB1dFByb2MgPSBwcm9jOyBcCisJb2xkcHJvY3MtPnVud3JhcFByb2MgPSBkZXZpY2UtPnVud3JhcFByb2M7IFwKKwlkZXZpY2UtPnVud3JhcFByb2MgPSB1bndyYXBwcm9jOworCisjZGVmaW5lIENPTkRfV1JBUF9QUk9DRVNTX0lOUFVUX1BST0MoZGV2aWNlLCBvbGRwcm9jcywgcHJvYywgdW53cmFwcHJvYykgXAorCWlmIChkZXZpY2UtPnB1YmxpYy5wcm9jZXNzSW5wdXRQcm9jID09IGRldmljZS0+cHVibGljLnJlYWxJbnB1dFByb2MpXAorCSAgICBkZXZpY2UtPnB1YmxpYy5wcm9jZXNzSW5wdXRQcm9jID0gcHJvYzsgXAorCW9sZHByb2NzLT5wcm9jZXNzSW5wdXRQcm9jID0gXAorCW9sZHByb2NzLT5yZWFsSW5wdXRQcm9jID0gZGV2aWNlLT5wdWJsaWMucmVhbElucHV0UHJvYzsgXAorCWRldmljZS0+cHVibGljLnJlYWxJbnB1dFByb2MgPSBwcm9jOyBcCisJb2xkcHJvY3MtPnVud3JhcFByb2MgPSBkZXZpY2UtPnVud3JhcFByb2M7IFwKKwlkZXZpY2UtPnVud3JhcFByb2MgPSB1bndyYXBwcm9jOworCisjZGVmaW5lIFVOV1JBUF9QUk9DRVNTX0lOUFVUX1BST0MoZGV2aWNlLCBvbGRwcm9jcykgXAorCWRldmljZS0+cHVibGljLnByb2Nlc3NJbnB1dFByb2MgPSBvbGRwcm9jcy0+cHJvY2Vzc0lucHV0UHJvYzsgXAorCWRldmljZS0+cHVibGljLnJlYWxJbnB1dFByb2MgPSBvbGRwcm9jcy0+cmVhbElucHV0UHJvYzsgXAorCWRldmljZS0+dW53cmFwUHJvYyA9IG9sZHByb2NzLT51bndyYXBQcm9jOworCisjZGVmaW5lIFhLQkRFVklDRUlORk8oZGV2KSAoKHhrYkRldmljZUluZm9QdHIpIChkZXYpLT5kZXZQcml2YXRlc1t4a2JEZXZpY2VQcml2YXRlSW5kZXhdLnB0cikKKworLyoqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KioqLworCisKKy8qKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSoqKi8KKworI2RlZmluZSBYa2JBWF9LUkdNYXNrCSAoWGtiU2xvd0tleXNNYXNrfFhrYkJvdW5jZUtleXNNYXNrKQorI2RlZmluZQlYa2JBbGxGaWx0ZXJlZEV2ZW50c01hc2sgXAorCShYa2JBY2Nlc3NYS2V5c01hc2t8WGtiUmVwZWF0S2V5c01hc2t8WGtiTW91c2VLZXlzQWNjZWxNYXNrfFhrYkFYX0tSR01hc2spCisKKy8qKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSoqKi8KKworZXh0ZXJuIGludAlYa2JSZXFDb2RlOworZXh0ZXJuIGludAlYa2JFdmVudEJhc2U7CitleHRlcm4gaW50CVhrYktleWJvYXJkRXJyb3JDb2RlOworZXh0ZXJuIGludAlYa2JEaXNhYmxlTG9ja0FjdGlvbnM7CitleHRlcm4gY2hhciAqCVhrYkJhc2VEaXJlY3Rvcnk7CitleHRlcm4gY2hhciAqCVhrYkJpbkRpcmVjdG9yeTsKK2V4dGVybiBjaGFyICoJWGtiSW5pdGlhbE1hcDsKK2V4dGVybiBpbnQJX1hrYkNsaWVudE1ham9yOworZXh0ZXJuIGludAlfWGtiQ2xpZW50TWlub3I7CitleHRlcm4gdW5zaWduZWQJaW50IFhrYlhJVW5zdXBwb3J0ZWQ7CisKK2V4dGVybiBjaGFyICoJWGtiTW9kZWxVc2VkLCpYa2JMYXlvdXRVc2VkLCpYa2JWYXJpYW50VXNlZCwqWGtiT3B0aW9uc1VzZWQ7CitleHRlcm4gQm9vbAlub1hrYkV4dGVuc2lvbjsKK2V4dGVybiBCb29sCVhrYldhbnRSdWxlc1Byb3A7CisKK2V4dGVybiBwb2ludGVyCVhrYkxhc3RSZXBlYXRFdmVudDsKKworZXh0ZXJuIENBUkQzMgl4a2JEZWJ1Z0ZsYWdzOworZXh0ZXJuIENBUkQzMgl4a2JEZWJ1Z0N0cmxzOworCisjZGVmaW5lCV9Ya2JBbGxvYyhzKQkJeGFsbG9jKChzKSkKKyNkZWZpbmUJX1hrYkNhbGxvYyhuLHMpCQlYY2FsbG9jKChuKSoocykpCisjZGVmaW5lCV9Ya2JSZWFsbG9jKG8scykJWHJlYWxsb2MoKG8pLChzKSkKKyNkZWZpbmUJX1hrYlR5cGVkQWxsb2ModCkJKCh0ICopeGFsbG9jKHNpemVvZih0KSkpCisjZGVmaW5lCV9Ya2JUeXBlZENhbGxvYyhuLHQpCSgodCAqKVhjYWxsb2MoKG4pKnNpemVvZih0KSkpCisjZGVmaW5lCV9Ya2JUeXBlZFJlYWxsb2MobyxuLHQpIFwKKwkoKG8pPyh0ICopWHJlYWxsb2MoKG8pLChuKSpzaXplb2YodCkpOl9Ya2JUeXBlZENhbGxvYyhuLHQpKQorI2RlZmluZQlfWGtiQ2xlYXJFbGVtcyhhLGYsbCx0KQliemVybygmKGEpW2ZdLCgobCktKGYpKzEpKnNpemVvZih0KSkKKyNkZWZpbmUJX1hrYkZyZWUocCkJCVhmcmVlKHApCisKKyNkZWZpbmUJX1hrYkxpYkVycm9yKGMsbCxkKSBcCisJeyBfWGtiRXJyQ29kZT0gKGMpOyBfWGtiRXJyTG9jYXRpb249IChsKTsgX1hrYkVyckRhdGE9IChkKTsgfQorI2RlZmluZQlfWGtiRXJyQ29kZTIoYSxiKSAoKFhJRCkoKCgodW5zaWduZWQgaW50KShhKSk8PDI0KXwoKGIpJjB4ZmZmZmZmKSkpCisjZGVmaW5lCV9Ya2JFcnJDb2RlMyhhLGIsYykJX1hrYkVyckNvZGUyKGEsKCgodW5zaWduZWQgaW50KShiKSk8PDE2KXwoYykpCisjZGVmaW5lCV9Ya2JFcnJDb2RlNChhLGIsYyxkKSBfWGtiRXJyQ29kZTMoYSxiLCgoKCh1bnNpZ25lZCBpbnQpKGMpKTw8OCl8KGQpKSkKKworZXh0ZXJuCWludAlEZXZpY2VLZXlQcmVzcyxEZXZpY2VLZXlSZWxlYXNlOworZXh0ZXJuCWludAlEZXZpY2VCdXR0b25QcmVzcyxEZXZpY2VCdXR0b25SZWxlYXNlOworCisjaWZkZWYgWElOUFVUCisjZGVmaW5lCV9Ya2JJc1ByZXNzRXZlbnQodCkJKCgodCk9PUtleVByZXNzKXx8KCh0KT09RGV2aWNlS2V5UHJlc3MpKQorI2RlZmluZQlfWGtiSXNSZWxlYXNlRXZlbnQodCkJKCgodCk9PUtleVJlbGVhc2UpfHwoKHQpPT1EZXZpY2VLZXlSZWxlYXNlKSkKKyNlbHNlCisjZGVmaW5lCV9Ya2JJc1ByZXNzRXZlbnQodCkJKCh0KT09S2V5UHJlc3MpCisjZGVmaW5lCV9Ya2JJc1JlbGVhc2VFdmVudCh0KQkoKHQpPT1LZXlSZWxlYXNlKQorI2VuZGlmCisKKyNkZWZpbmUJX1hrYkNvcmVLZXljb2RlSW5SYW5nZShjLGspCSgoKGspPj0oYyktPmN1cktleVN5bXMubWluS2V5Q29kZSkmJlwKKwkJCQkJICgoayk8PShjKS0+Y3VyS2V5U3ltcy5tYXhLZXlDb2RlKSkKKyNkZWZpbmUJX1hrYkNvcmVOdW1LZXlzKGMpCSgoYyktPmN1cktleVN5bXMubWF4S2V5Q29kZS1cCisJCQkJIChjKS0+Y3VyS2V5U3ltcy5taW5LZXlDb2RlKzEpCisKKyNkZWZpbmUJWENvbnZlcnRDYXNlKHMsbCx1KQlYa2JDb252ZXJ0Q2FzZShzLGwsdSkKKyN1bmRlZglJc0tleXBhZEtleQorI2RlZmluZQlJc0tleXBhZEtleShzKQkJWGtiS1NJc0tleXBhZChzKQorCit0eXBlZGVmIGludCBTdGF0dXM7Cit0eXBlZGVmIHBvaW50ZXIgWFBvaW50ZXI7Cit0eXBlZGVmIHN0cnVjdCBfWERpc3BsYXkgRGlzcGxheTsKKworI2lmbmRlZiBUcnVlCisjZGVmaW5lCVRydWUJMQorI2RlZmluZQlGYWxzZQkwCisjZW5kaWYKKworI2lmbmRlZiBQQVRIX01BWAorI2lmZGVmIE1BWFBBVEhMRU4KKyNkZWZpbmUJUEFUSF9NQVggTUFYUEFUSExFTgorI2Vsc2UKKyNkZWZpbmUJUEFUSF9NQVggMTAyNAorI2VuZGlmCisjZW5kaWYKKworX1hGVU5DUFJPVE9CRUdJTgorCitleHRlcm4gdm9pZCBYa2JVc2VNc2coCisgICAgdm9pZAorKTsKKworZXh0ZXJuIGludCBYa2JQcm9jZXNzQXJndW1lbnRzKAorICAgIGludAkJCQkvKiBhcmdjICovLAorICAgIGNoYXIgKioJCQkvKiBhcmd2ICovLAorICAgIGludAkJCQkvKiBpICovCispOworCitleHRlcm4Jdm9pZAlYa2JTZXRFeHRlbnNpb24oRGV2aWNlSW50UHRyIGRldmljZSwgUHJvY2Vzc0lucHV0UHJvYyBwcm9jKTsKKworZXh0ZXJuCXZvaWQJWGtiRnJlZUNvbXBhdE1hcCgKKyAgICBYa2JEZXNjUHRyCQkJLyogeGtiICovLAorICAgIHVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisgICAgQm9vbAkJCS8qIGZyZWVNYXAgKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYkZyZWVOYW1lcygKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKwlCb29sCQkJLyogZnJlZU1hcCAqLworKTsKKworZXh0ZXJuIERldmljZUludFB0ciBfWGtiTG9va3VwQW55RGV2aWNlKAorICAgIGludAkJCS8qIGlkICovLAorICAgIGludCAqCQkvKiB3aHlfcnRybiAqLworKTsKKworZXh0ZXJuIERldmljZUludFB0ciBfWGtiTG9va3VwS2V5Ym9hcmQoCisgICAgaW50CQkJLyogaWQgKi8sCisgICAgaW50ICoJCS8qIHdoeV9ydHJuICovCispOworCitleHRlcm4gRGV2aWNlSW50UHRyIF9Ya2JMb29rdXBCZWxsRGV2aWNlKAorICAgIGludAkJCS8qIGlkICovLAorICAgIGludCAqCQkvKiB3aHlfcnRybiAqLworKTsKKworZXh0ZXJuIERldmljZUludFB0ciBfWGtiTG9va3VwTGVkRGV2aWNlKAorICAgIGludAkJCS8qIGlkICovLAorICAgIGludCAqCQkvKiB3aHlfcnRybiAqLworKTsKKworZXh0ZXJuIERldmljZUludFB0ciBfWGtiTG9va3VwQnV0dG9uRGV2aWNlKAorICAgIGludAkJCS8qIGlkICovLAorICAgIGludCAqCQkvKiB3aHlfcnRybiAqLworKTsKKworZXh0ZXJuCVhrYkRlc2NQdHIgWGtiQWxsb2NLZXlib2FyZCgKKwl2b2lkCispOworCitleHRlcm4JU3RhdHVzIFhrYkFsbG9jQ2xpZW50TWFwKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorCXVuc2lnbmVkIGludAkJLyogblR5cGVzICovCispOworCitleHRlcm4JU3RhdHVzIFhrYkFsbG9jU2VydmVyTWFwKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorCXVuc2lnbmVkIGludAkJLyogbk5ld0FjdGlvbnMgKi8KKyk7CisKK2V4dGVybgl2b2lkCVhrYkZyZWVDbGllbnRNYXAoCisgICAgWGtiRGVzY1B0cgkJCS8qIHhrYiAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIHdoYXQgKi8sCisgICAgQm9vbAkJCS8qIGZyZWVNYXAgKi8KKyk7CisKK2V4dGVybgl2b2lkCVhrYkZyZWVTZXJ2ZXJNYXAoCisgICAgWGtiRGVzY1B0cgkJCS8qIHhrYiAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIHdoYXQgKi8sCisgICAgQm9vbAkJCS8qIGZyZWVNYXAgKi8KKyk7CisKK2V4dGVybglTdGF0dXMgWGtiQWxsb2NJbmRpY2F0b3JNYXBzKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JBbGxvY0NvbXBhdE1hcCgKKyAgICBYa2JEZXNjUHRyCQkJLyogeGtiICovLAorICAgIHVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBuSW50ZXJwcmV0ICovCispOworCitleHRlcm4JU3RhdHVzIFhrYkFsbG9jTmFtZXMoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisJaW50CQkJLyogblRvdGFsUkcgKi8sCisJaW50CQkJLyogblRvdGFsQWxpYXNlcyAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JBbGxvY0NvbnRyb2xzKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiQ29weUtleVR5cGUoCisgICAgWGtiS2V5VHlwZVB0cgkJLyogZnJvbSAqLywKKyAgICBYa2JLZXlUeXBlUHRyCQkvKiBpbnRvICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkNvcHlLZXlUeXBlcygKKyAgICBYa2JLZXlUeXBlUHRyCQkvKiBmcm9tICovLAorICAgIFhrYktleVR5cGVQdHIJCS8qIGludG8gKi8sCisgICAgaW50CQkJCS8qIG51bV90eXBlcyAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JSZXNpemVLZXlUeXBlKAorICAgIFhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKyAgICBpbnQJCQkvKiB0eXBlX25keCAqLywKKyAgICBpbnQJCQkvKiBtYXBfY291bnQgKi8sCisgICAgQm9vbAkJLyogd2FudF9wcmVzZXJ2ZSAqLywKKyAgICBpbnQJCQkvKiBuZXdfbnVtX2x2bHMgKi8KKyk7CisKK2V4dGVybgl2b2lkCVhrYkZyZWVLZXlib2FyZCgKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKwlCb29sCQkJLyogZnJlZURlc2MgKi8KKyk7CisKK2V4dGVybiAgdm9pZCBYa2JTZXRBY3Rpb25LZXlNb2RzKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwlYa2JBY3Rpb24gKgkJLyogYWN0ICovLAorCXVuc2lnbmVkIGludCAJCS8qIG1vZHMgKi8KKyk7CisKK2V4dGVybiBCb29sIFhrYkNoZWNrQWN0aW9uVk1vZHMoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCVhrYkFjdGlvbiAqCQkvKiBhY3QgKi8sCisJdW5zaWduZWQgaW50IAkJLyogY2hhbmdlZCAqLworKTsKKworZXh0ZXJuIEJvb2wgWGtiQXBwbHlWTW9kQ2hhbmdlcygKKyAgICBYa2JTcnZJbmZvUHRyCS8qIHhrYmkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGNoYW5nZWQgKi8sCisgICAgWGtiQ2hhbmdlc1B0cgkvKiBwQ2hhbmdlcyAqLywKKyAgICB1bnNpZ25lZCBpbnQgKgkvKiBuZWVkQ2hlY2tzUnRybiAqLywKKyAgICBYa2JFdmVudENhdXNlUHRyCS8qIGNhdXNlICovCispOworCitleHRlcm4gdm9pZCBYa2JBcHBseVZNb2RDaGFuZ2VzVG9BbGxEZXZpY2VzKAorICAgIERldmljZUludFB0cgkvKiBkZXYgKi8sCisgICAgWGtiRGVzY1B0ciAJCS8qIHhrYiAqLywKKyAgICB1bnNpZ25lZCBpbnQgCS8qIGNoYW5nZWQgKi8sCisgICAgWGtiRXZlbnRDYXVzZVB0cgkvKiBjYXVzZSAqLworKTsKKworZXh0ZXJuCXVuc2lnbmVkIGludCBYa2JNYXNrRm9yVk1hc2soCisgICAgWGtiRGVzY1B0cgkJLyogeGtiICovLAorICAgIHVuc2lnbmVkIGludAkvKiB2bWFzayAqLworKTsKKworZXh0ZXJuIEJvb2wgWGtiVmlydHVhbE1vZHNUb1JlYWwoCisJWGtiRGVzY1B0cgkvKiB4a2IgKi8sCisJdW5zaWduZWQgaW50CS8qIHZpcnR1YV9tYXNrICovLAorCXVuc2lnbmVkIGludCAqCS8qIG1hc2tfcnRybiAqLworKTsKKworZXh0ZXJuCXVuc2lnbmVkIGludAlYa2JBZGp1c3RHcm91cCgKKyAgICBpbnQJCQkvKiBncm91cCAqLywKKyAgICBYa2JDb250cm9sc1B0cgkvKiBjdHJscyAqLworKTsKKworZXh0ZXJuIEtleVN5bSAqWGtiUmVzaXplS2V5U3ltcygKKyAgICBYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisgICAgaW50IAkJLyoga2V5ICovLAorICAgIGludCAJCS8qIG5lZWRlZCAqLworKTsKKworZXh0ZXJuIFhrYkFjdGlvbiAqWGtiUmVzaXplS2V5QWN0aW9ucygKKyAgICBYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisgICAgaW50IAkJLyoga2V5ICovLAorICAgIGludCAJCS8qIG5lZWRlZCAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiVXBkYXRlS2V5VHlwZXNGcm9tQ29yZSgKKyAgICBEZXZpY2VJbnRQdHIJLyogcFhEZXYgKi8sCisgICAgS2V5Q29kZSAJCS8qIGZpcnN0ICovLAorICAgIENBUkQ4IAkJLyogbnVtICovLAorICAgIFhrYkNoYW5nZXNQdHIJLyogcENoYW5nZXMgKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYlVwZGF0ZURlc2NBY3Rpb25zKAkKKyAgICBYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisgICAgS2V5Q29kZQkJLyogZmlyc3QgKi8sCisgICAgQ0FSRDgJCS8qIG51bSAqLywKKyAgICBYa2JDaGFuZ2VzUHRyCS8qIGNoYW5nZXMgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYlVwZGF0ZUFjdGlvbnMoCisgICAgRGV2aWNlSW50UHRyCS8qIHBYRGV2ICovLAorICAgIEtleUNvZGUgCQkvKiBmaXJzdCAqLywKKyAgICBDQVJEOCAJCS8qIG51bSAqLywKKyAgICBYa2JDaGFuZ2VzUHRyICAJLyogcENoYW5nZXMgKi8sCisgICAgdW5zaWduZWQgaW50ICoJLyogbmVlZENoZWNrc1J0cm4gKi8sCisgICAgWGtiRXZlbnRDYXVzZVB0cgkvKiBjYXVzZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiVXBkYXRlQ29yZURlc2NyaXB0aW9uKAorICAgIERldmljZUludFB0cgkvKiBrZXliZCAqLywKKyAgICBCb29sCQkvKiByZXNpemUgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkFwcGx5TWFwcGluZ0NoYW5nZSgKKyAgICBEZXZpY2VJbnRQdHIJLyogcFhEZXYgKi8sCisgICAgQ0FSRDggCQkvKiByZXF1ZXN0ICovLAorICAgIEtleUNvZGUgCQkvKiBmaXJzdEtleSAqLywKKyAgICBDQVJEOCAJCS8qIG51bSAqLywKKyAgICBDbGllbnRQdHIJCS8qIGNsaWVudCAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiU2V0SW5kaWNhdG9ycygKKyAgICBEZXZpY2VJbnRQdHIJCS8qIHBYRGV2ICovLAorICAgIENBUkQzMgkJCS8qIGFmZmVjdCAqLywKKyAgICBDQVJEMzIJCQkvKiB2YWx1ZXMgKi8sCisgICAgWGtiRXZlbnRDYXVzZVB0cgkJLyogY2F1c2UgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYlVwZGF0ZUluZGljYXRvcnMoCisgICAgRGV2aWNlSW50UHRyCQkvKiBrZXliZCAqLywKKyAgICBDQVJEMzIJCSAJLyogY2hhbmdlZCAqLywKKyAgICBCb29sCQkJLyogY2hlY2tfZWRldnMgKi8sCisgICAgWGtiQ2hhbmdlc1B0cgkJLyogcENoYW5nZXMgKi8sCisgICAgWGtiRXZlbnRDYXVzZVB0cgkJLyogY2F1c2UgKi8KKyk7CisKK2V4dGVybiBYa2JTcnZMZWRJbmZvUHRyIFhrYkFsbG9jU3J2TGVkSW5mbygKKyAgICBEZXZpY2VJbnRQdHIJCS8qIGRldiAqLywKKyAgICBLYmRGZWVkYmFja1B0cgkJLyoga2YgKi8sCisgICAgTGVkRmVlZGJhY2tQdHIJCS8qIGxmICovLAorICAgIHVuc2lnbmVkIGludAkJLyogbmVlZGVkX3BhcnRzICovCispOworCitleHRlcm4gWGtiU3J2TGVkSW5mb1B0ciBYa2JGaW5kU3J2TGVkSW5mbygKKyAgICBEZXZpY2VJbnRQdHIJCS8qIGRldiAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIGNsYXNzICovLAorICAgIHVuc2lnbmVkIGludAkJLyogaWQgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBuZWVkZWRfcGFydHMgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkFwcGx5TGVkTmFtZUNoYW5nZXMoCisgICAgRGV2aWNlSW50UHRyCQkvKiBkZXYgKi8sCisgICAgWGtiU3J2TGVkSW5mb1B0cgkJLyogc2xpICovLAorICAgIHVuc2lnbmVkIGludAkJLyogY2hhbmdlZF9uYW1lcyAqLywKKyAgICB4a2JFeHRlbnNpb25EZXZpY2VOb3RpZnkgKgkvKiBlZCAqLywKKyAgICBYa2JDaGFuZ2VzUHRyCQkvKiBjaGFuZ2VzICovLAorICAgIFhrYkV2ZW50Q2F1c2VQdHIJCS8qIGNhdXNlICovCispOworCitleHRlcm4gdm9pZCBYa2JBcHBseUxlZE1hcENoYW5nZXMoCisgICAgRGV2aWNlSW50UHRyCQkvKiBkZXYgKi8sCisgICAgWGtiU3J2TGVkSW5mb1B0cgkJLyogc2xpICovLAorICAgIHVuc2lnbmVkIGludAkJLyogY2hhbmdlZF9tYXBzICovLAorICAgIHhrYkV4dGVuc2lvbkRldmljZU5vdGlmeSAqCS8qIGVkICovLAorICAgIFhrYkNoYW5nZXNQdHIJCS8qIGNoYW5nZXMgKi8sCisgICAgWGtiRXZlbnRDYXVzZVB0cgkJLyogY2F1c2UgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkFwcGx5TGVkU3RhdGVDaGFuZ2VzKAorICAgIERldmljZUludFB0cgkJLyogZGV2ICovLAorICAgIFhrYlNydkxlZEluZm9QdHIJCS8qIHNsaSAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIGNoYW5nZWRfbGVkcyAqLywKKyAgICB4a2JFeHRlbnNpb25EZXZpY2VOb3RpZnkgKgkvKiBlZCAqLywKKyAgICBYa2JDaGFuZ2VzUHRyCQkvKiBjaGFuZ2VzICovLAorICAgIFhrYkV2ZW50Q2F1c2VQdHIJCS8qIGNhdXNlICovCispOworCitleHRlcm4gdm9pZCBYa2JVcGRhdGVMZWRBdXRvU3RhdGUoCisgICAgRGV2aWNlSW50UHRyCQkvKiBkZXYgKi8sCisgICAgWGtiU3J2TGVkSW5mb1B0cgkJLyogc2xpICovLAorICAgIHVuc2lnbmVkIGludAkJLyogbWFwc190b19jaGVjayAqLywKKyAgICB4a2JFeHRlbnNpb25EZXZpY2VOb3RpZnkgKgkvKiBlZCAqLywKKyAgICBYa2JDaGFuZ2VzUHRyCQkvKiBjaGFuZ2VzICovLAorICAgIFhrYkV2ZW50Q2F1c2VQdHIJCS8qIGNhdXNlICovCispOworCitleHRlcm4gdm9pZCBYa2JGbHVzaExlZEV2ZW50cygJCisgICAgRGV2aWNlSW50UHRyCQkvKiBkZXYgKi8sCisgICAgRGV2aWNlSW50UHRyCQkvKiBrYmQgKi8sCisgICAgWGtiU3J2TGVkSW5mb1B0cgkJLyogc2xpICovLAorICAgIHhrYkV4dGVuc2lvbkRldmljZU5vdGlmeSAqCS8qIGVkICovLAorICAgIFhrYkNoYW5nZXNQdHIJCS8qIGNoYW5nZXMgKi8sCisgICAgWGtiRXZlbnRDYXVzZVB0cgkJLyogY2F1c2UgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYlVwZGF0ZUFsbERldmljZUluZGljYXRvcnMoCisgICAgWGtiQ2hhbmdlc1B0cgkJLyogY2hhbmdlcyAqLywKKyAgICBYa2JFdmVudENhdXNlUHRyCQkvKiBjYXVzZSAqLworKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBYa2JJbmRpY2F0b3JzVG9VcGRhdGUoCisgICAgRGV2aWNlSW50UHRyCQkvKiBkZXYgKi8sCisgICAgdW5zaWduZWQgbG9uZwkJLyogc3RhdGVfY2hhbmdlcyAqLywKKyAgICBCb29sCQkJLyogZW5hYmxlZF9jdHJsX2NoYW5nZXMgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkNvbXB1dGVEZXJpdmVkU3RhdGUoCisgICAgWGtiU3J2SW5mb1B0cgkJLyogeGtiaSAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiQ2hlY2tTZWNvbmRhcnlFZmZlY3RzKAorICAgIFhrYlNydkluZm9QdHIJCS8qIHhrYmkgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKyAgICBYa2JDaGFuZ2VzUHRyCQkvKiBjaGFuZ2VzICovLAorICAgIFhrYkV2ZW50Q2F1c2VQdHIJCS8qIGNhdXNlICovCispOworCitleHRlcm4gdm9pZCBYa2JDaGVja0luZGljYXRvck1hcHMoCisgICAgRGV2aWNlSW50UHRyCQkvKiBkZXYgKi8sCisgICAgWGtiU3J2TGVkSW5mb1B0cgkJLyogc2xpICovLAorICAgIHVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8KKyk7CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgWGtiU3RhdGVDaGFuZ2VkRmxhZ3MoCisgICAgWGtiU3RhdGVQdHIJCQkvKiBvbGQgKi8sCisgICAgWGtiU3RhdGVQdHIJCQkvKiBuZXcgKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYlNlbmRTdGF0ZU5vdGlmeSgKKyAgICAgICBEZXZpY2VJbnRQdHIJLyoga2JkICovLAorICAgICAgIHhrYlN0YXRlTm90aWZ5ICoJLyogcFNOICovCispOworCitleHRlcm4Jdm9pZCBYa2JTZW5kTWFwTm90aWZ5KAorICAgICAgIERldmljZUludFB0cgkvKiBrYmQgKi8sCisgICAgICAgeGtiTWFwTm90aWZ5ICoJLyogZXYgKi8KKyk7CisKK2V4dGVybglpbnQgIFhrYkNvbXB1dGVDb250cm9sc05vdGlmeSgKKwlEZXZpY2VJbnRQdHIJCS8qIGtiZCAqLywKKwlYa2JDb250cm9sc1B0cgkJLyogb2xkICovLAorCVhrYkNvbnRyb2xzUHRyCQkvKiBuZXcgKi8sCisJeGtiQ29udHJvbHNOb3RpZnkgKgkvKiBwQ04gKi8sCisJQm9vbAkJCS8qIGZvcmNlQ3RybFByb2MgKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYlNlbmRDb250cm9sc05vdGlmeSgKKyAgICAgICBEZXZpY2VJbnRQdHIJCS8qIGtiZCAqLywKKyAgICAgICB4a2JDb250cm9sc05vdGlmeSAqCS8qIGV2ICovCispOworCitleHRlcm4Jdm9pZCBYa2JTZW5kQ29tcGF0TWFwTm90aWZ5KAorCURldmljZUludFB0cgkJLyoga2JkICovLAorCXhrYkNvbXBhdE1hcE5vdGlmeSAqCS8qIGV2ICovCispOworCitleHRlcm4Jdm9pZCBYa2JTZW5kSW5kaWNhdG9yTm90aWZ5KAorICAgICAgIERldmljZUludFB0cgkJLyoga2JkICovLAorICAgICAgIGludAkJCS8qIHhrYlR5cGUgKi8sCisgICAgICAgeGtiSW5kaWNhdG9yTm90aWZ5ICoJLyogZXYgKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYkhhbmRsZUJlbGwoCisgICAgICAgQk9PTAkJLyogZm9yY2UgKi8sCisgICAgICAgQk9PTAkJLyogZXZlbnRPbmx5ICovLAorICAgICAgIERldmljZUludFB0cgkvKiBrYmQgKi8sCisgICAgICAgQ0FSRDgJCS8qIHBlcmNlbnQgKi8sCisgICAgICAgcG9pbnRlciAJCS8qIGN0cmwgKi8sCisgICAgICAgQ0FSRDgJCS8qIGNsYXNzICovLAorICAgICAgIEF0b20JCS8qIG5hbWUgKi8sCisgICAgICAgV2luZG93UHRyCS8qIHBXaW4gKi8sCisgICAgICAgQ2xpZW50UHRyCS8qIHBDbGllbnQgKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYlNlbmRBY2Nlc3NYTm90aWZ5KAorICAgICAgIERldmljZUludFB0cgkJLyoga2JkICovLAorICAgICAgIHhrYkFjY2Vzc1hOb3RpZnkgKgkvKiBwRXYgKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYlNlbmROYW1lc05vdGlmeSgKKyAgICAgICBEZXZpY2VJbnRQdHIJLyoga2JkICovLAorICAgICAgIHhrYk5hbWVzTm90aWZ5ICoJLyogZXYgKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYlNlbmRDb21wYXROb3RpZnkoCisgICAgICAgRGV2aWNlSW50UHRyCQkvKiBrYmQgKi8sCisgICAgICAgeGtiQ29tcGF0TWFwTm90aWZ5ICoJLyogZXYgKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYlNlbmRBY3Rpb25NZXNzYWdlKAorICAgICAgIERldmljZUludFB0cgkJLyoga2JkICovLAorICAgICAgIHhrYkFjdGlvbk1lc3NhZ2UgKgkvKiBldiAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiU2VuZEV4dGVuc2lvbkRldmljZU5vdGlmeSgKKyAgICAgICBEZXZpY2VJbnRQdHIJCQkvKiBrYmQgKi8sCisgICAgICAgQ2xpZW50UHRyCQkJLyogY2xpZW50ICovLAorICAgICAgIHhrYkV4dGVuc2lvbkRldmljZU5vdGlmeSAqCS8qIGV2ICovCispOworCitleHRlcm4gdm9pZCBYa2JTZW5kTm90aWZpY2F0aW9uKAorICAgIERldmljZUludFB0cgkJLyoga2JkICovLAorICAgIFhrYkNoYW5nZXNQdHIJCS8qIHBDaGFuZ2VzICovLAorICAgIFhrYkV2ZW50Q2F1c2VQdHIJCS8qIGNhdXNlICovCispOworCitleHRlcm4gdm9pZCBYa2JQcm9jZXNzS2V5Ym9hcmRFdmVudCgKKyAgICBzdHJ1Y3QgX3hFdmVudCAqIAkJLyogeEUgKi8sCisgICAgRGV2aWNlSW50UHRyCQkvKiBrZXliZCAqLywKKyAgICBpbnQgCQkJLyogY291bnQgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYlByb2Nlc3NPdGhlckV2ZW50KAorICAgIHN0cnVjdCBfeEV2ZW50ICogCQkvKiB4RSAqLywKKyAgICBEZXZpY2VJbnRQdHIJCS8qIGtleWJkICovLAorICAgIGludCAJCQkvKiBjb3VudCAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiSGFuZGxlQWN0aW9ucygKKyAgICBEZXZpY2VJbnRQdHIJCS8qIGRldiAqLywKKyAgICBEZXZpY2VJbnRQdHIJCS8qIGtiZCAqLywKKyAgICBzdHJ1Y3QgX3hFdmVudCAqIAkJLyogeEUgKi8sCisgICAgaW50IAkJCS8qIGNvdW50ICovCispOworCitleHRlcm4gQm9vbCBYa2JFbmFibGVEaXNhYmxlQ29udHJvbHMoCisgICAgWGtiU3J2SW5mb1B0cgkvKiB4a2JpICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogY2hhbmdlICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogbmV3VmFsdWVzICovLAorICAgIFhrYkNoYW5nZXNQdHIJLyogY2hhbmdlcyAqLywKKyAgICBYa2JFdmVudENhdXNlUHRyCS8qIGNhdXNlICovCispOworCitleHRlcm4gdm9pZCBBY2Nlc3NYSW5pdCgKKyAgICBEZXZpY2VJbnRQdHIgICAgICAgIC8qIGRldiAqLworKTsKKworZXh0ZXJuIEJvb2wgQWNjZXNzWEZpbHRlclByZXNzRXZlbnQoCisgICAgcmVnaXN0ZXIgc3RydWN0IF94RXZlbnQgKgkvKiB4RSAqLywKKyAgICByZWdpc3RlciBEZXZpY2VJbnRQdHIJLyoga2V5YmQgKi8sCisgICAgaW50CQkJCS8qIGNvdW50ICovCispOworCitleHRlcm4gQm9vbCBBY2Nlc3NYRmlsdGVyUmVsZWFzZUV2ZW50KAorICAgIHJlZ2lzdGVyIHN0cnVjdCBfeEV2ZW50ICoJLyogeEUgKi8sCisgICAgcmVnaXN0ZXIgRGV2aWNlSW50UHRyCS8qIGtleWJkICovLAorICAgIGludAkJCQkvKiBjb3VudCAqLworKTsKKworZXh0ZXJuIHZvaWQgQWNjZXNzWENhbmNlbFJlcGVhdEtleSgKKyAgICBYa2JTcnZJbmZvUHRyCS8qIHhrYmkgKi8sCisgICAgS2V5Q29kZQkJLyoga2V5ICovCispOworCitleHRlcm4gdm9pZCBBY2Nlc3NYQ29tcHV0ZUN1cnZlRmFjdG9yKAorICAgIFhrYlNydkluZm9QdHIJLyogeGtiaSAqLywKKyAgICBYa2JDb250cm9sc1B0cgkvKiBjdHJscyAqLworKTsKKworZXh0ZXJuCVhrYkRldmljZUxlZEluZm9QdHIJWGtiQWRkRGV2aWNlTGVkSW5mbygKKwlYa2JEZXZpY2VJbmZvUHRyCS8qIGRldmkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBsZWRDbGFzcyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGxlZElkICovCispOworCitleHRlcm4JWGtiRGV2aWNlSW5mb1B0cglYa2JBbGxvY0RldmljZUluZm8oCisJdW5zaWduZWQgaW50CQkvKiBkZXZpY2VTcGVjICovLAorCXVuc2lnbmVkIGludAkJLyogbkJ1dHRvbnMgKi8sCisJdW5zaWduZWQgaW50CQkvKiBzekxlZHMgKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYkZyZWVEZXZpY2VJbmZvKAorCVhrYkRldmljZUluZm9QdHIJLyogZGV2aSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorCUJvb2wJCQkvKiBmcmVlRGV2SSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYa2JSZXNpemVEZXZpY2VCdXR0b25BY3Rpb25zKAorCVhrYkRldmljZUluZm9QdHIgICAgICAgIC8qIGRldmkgKi8sCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgLyogbmV3VG90YWwgKi8KKyk7CisKK2V4dGVybglYa2JJbnRlcmVzdFB0ciBYa2JGaW5kQ2xpZW50UmVzb3VyY2UoCisgICAgICAgRGV2aWNlUHRyCS8qIGluRGV2ICovLAorICAgICAgIENsaWVudFB0cgkvKiBjbGllbnQgKi8KKyk7CisKK2V4dGVybglYa2JJbnRlcmVzdFB0ciBYa2JBZGRDbGllbnRSZXNvdXJjZSgKKyAgICAgICBEZXZpY2VQdHIJLyogaW5EZXYgKi8sCisgICAgICAgQ2xpZW50UHRyCS8qIGNsaWVudCAqLywKKyAgICAgICBYSUQJCS8qIGlkICovCispOworCitleHRlcm4JaW50IFhrYlJlbW92ZUNsaWVudCgKKyAgICAgICBEZXZpY2VQdHIJLyogaW5EZXYgKi8sCisgICAgICAgQ2xpZW50UHRyCS8qIGNsaWVudCAqLworKTsKKworZXh0ZXJuCWludCBYa2JSZW1vdmVSZXNvdXJjZUNsaWVudCgKKyAgICAgICBEZXZpY2VQdHIJLyogaW5EZXYgKi8sCisgICAgICAgWElECQkvKiBpZCAqLworKTsKKworZXh0ZXJuIGludCBYa2JERFhJbml0RGV2aWNlKAorICAgIERldmljZUludFB0ciAgICAgICAgLyogZGV2ICovCispOworCitleHRlcm4JaW50IFhrYkREWEFjY2Vzc1hCZWVwKAorICAgIERldmljZUludFB0ciAgICAgICAgLyogZGV2ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aGF0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aGljaCAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiRERYS2V5Q2xpY2soCisgICAgRGV2aWNlSW50UHRyCS8qIGRldiAqLywKKyAgICBpbnQJCQkvKiBrZXljb2RlICovLAorICAgIGludAkJCS8qIHN5bnRoZXRpYyAqLworKTsKKworZXh0ZXJuIAlpbnQgWGtiRERYVXNlc1NvZnRSZXBlYXQoCisgICAgRGV2aWNlSW50UHRyCS8qIGRldiAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiRERYS2V5YmRDdHJsUHJvYygKKwlEZXZpY2VJbnRQdHIJLyogZGV2ICovLAorCUtleWJkQ3RybCAqCS8qIGN0cmwgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkREWENoYW5nZUNvbnRyb2xzKAorCURldmljZUludFB0cgkvKiBkZXYgKi8sCisJWGtiQ29udHJvbHNQdHIgCS8qIG9sZCAqLywKKwlYa2JDb250cm9sc1B0ciAJLyogbmV3ICovCispOworCitleHRlcm4gdm9pZCBYa2JERFhVcGRhdGVJbmRpY2F0b3JzKAorCURldmljZUludFB0cgkvKiBrZXliZCAqLywKKwlDQVJEMzIJCS8qIG5ld1N0YXRlICovCispOworCitleHRlcm4gdm9pZCBYa2JERFhVcGRhdGVEZXZpY2VJbmRpY2F0b3JzKAorCURldmljZUludFB0cgkJLyogZGV2ICovLAorCVhrYlNydkxlZEluZm9QdHIJLyogc2xpICovLAorCUNBUkQzMgkJCS8qIG5ld1N0YXRlICovCispOworCitleHRlcm4gdm9pZCBYa2JERFhGYWtlUG9pbnRlckJ1dHRvbigKKwlpbnQgCQkvKiBldmVudCAqLywKKwlpbnQJCS8qIGJ1dHRvbiAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiRERYRmFrZVBvaW50ZXJNb3Rpb24oCisgCXVuc2lnbmVkIGludAkvKiBmbGFncyAqLywKKwlpbnQJCS8qIHggKi8sCisJaW50CQkvKiB5ICovCispOworCitleHRlcm4gdm9pZCBYa2JERFhGYWtlRGV2aWNlQnV0dG9uKAorCURldmljZUludFB0cgkvKiBkZXYgKi8sCisJQm9vbAkJLyogcHJlc3MgKi8sCisJaW50CQkvKiBidXR0b24gKi8KKyk7CisKK2V4dGVybiBpbnQgWGtiRERYVGVybWluYXRlU2VydmVyKAorCURldmljZUludFB0cgkvKiBkZXYgKi8sCisJS2V5Q29kZQkJLyoga2V5ICovLAorCVhrYkFjdGlvbiAqCS8qIGFjdCAqLworKTsKKworZXh0ZXJuIGludCBYa2JERFhTd2l0Y2hTY3JlZW4oCisJRGV2aWNlSW50UHRyCS8qIGRldiAqLywKKwlLZXlDb2RlCQkvKiBrZXkgKi8sCisJWGtiQWN0aW9uICoJLyogYWN0ICovCispOworCitleHRlcm4gaW50IFhrYkREWFByaXZhdGUoCisJRGV2aWNlSW50UHRyCS8qIGRldiAqLywKKwlLZXlDb2RlCQkvKiBrZXkgKi8sCisJWGtiQWN0aW9uICoJLyogYWN0ICovCispOworCitleHRlcm4gdm9pZCBYa2JEaXNhYmxlQ29tcHV0ZWRBdXRvUmVwZWF0cygKKwlEZXZpY2VJbnRQdHIgCS8qIHBYRGV2ICovLAorCXVuc2lnbmVkIGludAkvKiBrZXkgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYlNldFJlcGVhdEtleXMoCisJRGV2aWNlSW50UHRyIAkvKiBwWERldiAqLywKKwlpbnQJCS8qIGtleSAqLywKKwlpbnQJIAkvKiBvbm9mZiAqLworKTsKKworZXh0ZXJuCWludCBYa2JMYXRjaE1vZGlmaWVycygKKwlEZXZpY2VJbnRQdHIgCS8qIHBYRGV2ICovLAorCUNBUkQ4IAkJLyogbWFzayAqLywKKwlDQVJEOCAJCS8qIGxhdGNoZXMgKi8KKyk7CisKK2V4dGVybglpbnQgWGtiTGF0Y2hHcm91cCgKKwlEZXZpY2VJbnRQdHIgIAkvKiBwWERldiAqLywKKwlpbnQJICAJLyogZ3JvdXAgKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYkNsZWFyQWxsTGF0Y2hlc0FuZExvY2tzKAorCURldmljZUludFB0cgkJLyogZGV2ICovLAorCVhrYlNydkluZm9QdHIJCS8qIHhrYmkgKi8sCisJQm9vbAkJCS8qIGdlbkV2ICovLAorCVhrYkV2ZW50Q2F1c2VQdHIJLyogY2F1c2UgKi8KKyk7CisKK2V4dGVybgl2b2lkCVhrYlNldFJ1bGVzRGZsdHMoCisJY2hhciAqCQkJLyogcnVsZXNGaWxlICovLAorCWNoYXIgKgkJCS8qIG1vZGVsICovLAorCWNoYXIgKgkJCS8qIGxheW91dCAqLywKKwljaGFyICoJCQkvKiB2YXJpYW50ICovLAorCWNoYXIgKgkJCS8qIG9wdGlvbnMgKi8KKyk7CisKK2V4dGVybgl2b2lkCVhrYkluaXREZXZpY2UoCisJRGV2aWNlSW50UHRyIAkvKiBwWERldiAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiSW5pdEtleWJvYXJkRGV2aWNlU3RydWN0KAorCURldmljZUludFB0ciAJCS8qIHBYRGV2ICovLAorCVhrYkNvbXBvbmVudE5hbWVzUHRyCS8qIHBOYW1lcyAqLywKKwlLZXlTeW1zUHRyCQkvKiBwU3ltcyAqLywKKwlDQVJEOCAJCQkvKiBwTW9kcyAqL1tdLAorCUJlbGxQcm9jUHRyCQkvKiBiZWxsUHJvYyAqLywKKwlLYmRDdHJsUHJvY1B0cgkJLyogY3RybFByb2MgKi8KKyk7CisKK2V4dGVybglpbnQgU1Byb2NYa2JEaXNwYXRjaCgKKwlDbGllbnRQdHIJCS8qIGNsaWVudCAqLworKTsKKworZXh0ZXJuIFhrYkdlb21ldHJ5UHRyIFhrYkxvb2t1cE5hbWVkR2VvbWV0cnkoCisJRGV2aWNlSW50UHRyCQkvKiBkZXYgKi8sCisJQXRvbQkJCS8qIG5hbWUgKi8sCisJQm9vbCAqCQkJLyogc2hvdWxkRnJlZSAqLworKTsKKworZXh0ZXJuIGNoYXIgKglfWGtiRHVwU3RyaW5nKAorCWNoYXIgKgkJCS8qIHN0ciAqLworKTsKKworZXh0ZXJuIHZvaWQJWGtiQ29udmVydENhc2UoCisJS2V5U3ltIAkJCS8qIHN5bSAqLywKKwlLZXlTeW0gKgkJLyogbG93ZXIgKi8sCisJS2V5U3ltICoJCS8qIHVwcGVyICovCispOworCitleHRlcm4JU3RhdHVzCSBYa2JDaGFuZ2VLZXljb2RlUmFuZ2UoCQorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwlpbnQgCQkJLyogbWluS0MgKi8sCisJaW50IAkJCS8qIG1heEtDICovLAorCVhrYkNoYW5nZXNQdHIJCS8qIGNoYW5nZXMgKi8KKyk7CisKK2V4dGVybiBpbnQgWGtiRmluaXNoRGV2aWNlSW5pdCgKKwlEZXZpY2VJbnRQdHIJCS8qIHBYRGV2ICovCispOworCitleHRlcm4gdm9pZCBYa2JGcmVlU3J2TGVkSW5mbygKKwlYa2JTcnZMZWRJbmZvUHRyCS8qIHNsaSAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiRnJlZUluZm8oCisJWGtiU3J2SW5mb1B0cgkJLyogeGtiaSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYa2JDaGFuZ2VUeXBlc09mS2V5KAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwlpbnQJCQkvKiBrZXkgKi8sCisJaW50CQkJLyogbkdyb3VwcyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGdyb3VwcyAqLywKKwlpbnQgKgkJCS8qIG5ld1R5cGVzSW4gKi8sCisJWGtiTWFwQ2hhbmdlc1B0cgkvKiBjaGFuZ2VzICovCispOworCitleHRlcm4gWGtiS2V5VHlwZVB0ciBYa2JBZGRLZXlUeXBlKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwlBdG9tCQkJLyogbmFtZSAqLywKKwlpbnQJCQkvKiBtYXBfY291bnQgKi8sCisJQm9vbAkJCS8qIHdhbnRfcHJlc2VydmUgKi8sCisJaW50CQkJLyogbnVtX2x2bHMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGtiSW5pdENhbm9uaWNhbEtleVR5cGVzKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorCWludAkJCS8qIGtleXBhZFZNb2QgKi8KKyk7CisKK2V4dGVybiBpbnQgWGtiS2V5VHlwZXNGb3JDb3JlU3ltYm9scygKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJaW50CQkJLyogbWFwX3dpZHRoICovLAorCUtleVN5bSAqCQkvKiBjb3JlX3N5bXMgKi8sCisJdW5zaWduZWQgaW50CQkvKiBwcm90ZWN0ZWQgKi8sCisJaW50ICoJCQkvKiB0eXBlc19pbm91dCAqLywKKwlLZXlTeW0gKgkJLyogeGtiX3N5bXNfcnRybiAqLworKTsKKworZXh0ZXJuIEJvb2wgWGtiQXBwbHlDb21wYXRNYXBUb0tleSgKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJS2V5Q29kZQkJCS8qIGtleSAqLywKKwlYa2JDaGFuZ2VzUHRyCQkvKiBjaGFuZ2VzICovCispOworCitleHRlcm4gQm9vbCBYa2JVcGRhdGVNYXBGcm9tQ29yZSgKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJS2V5Q29kZQkJCS8qIGZpcnN0X2tleSAqLywKKwlpbnQJCQkvKiBudW1fa2V5cyAqLywKKwlpbnQJCQkvKiBtYXBfd2lkdGggKi8sCisJS2V5U3ltICoJCS8qIGNvcmVfa2V5c3ltcyAqLywKKwlYa2JDaGFuZ2VzUHRyCQkvKiBjaGFuZ2VzICovCispOworCitleHRlcm4gdm9pZCBYa2JGcmVlQ29udHJvbHMoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisJQm9vbAkJCS8qIGZyZWVNYXAgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkZyZWVJbmRpY2F0b3JNYXBzKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLworKTsKKworZXh0ZXJuIEJvb2wgWGtiQXBwbHlWaXJ0dWFsTW9kQ2hhbmdlcygKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJdW5zaWduZWQgaW50CQkvKiBjaGFuZ2VkICovLAorCVhrYkNoYW5nZXNQdHIJCS8qIGNoYW5nZXMgKi8KKyk7CisKK2V4dGVybiBCb29sIFhrYlVwZGF0ZUFjdGlvblZpcnR1YWxNb2RzKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwlYa2JBY3Rpb24gKgkJLyogYWN0ICovLAorCXVuc2lnbmVkIGludAkJLyogY2hhbmdlZCAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiVXBkYXRlS2V5VHlwZVZpcnR1YWxNb2RzKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwlYa2JLZXlUeXBlUHRyCQkvKiB0eXBlICovLAorCXVuc2lnbmVkIGludAkJLyogY2hhbmdlZCAqLywKKwlYa2JDaGFuZ2VzUHRyCQkvKiBjaGFuZ2VzICovCispOworCitleHRlcm4gdm9pZCBYa2JTZW5kTmV3S2V5Ym9hcmROb3RpZnkoCisJRGV2aWNlSW50UHRyCQkvKiBrYmQgKi8sCisJeGtiTmV3S2V5Ym9hcmROb3RpZnkgKgkvKiBwTktOICovCispOworCisjaWZkZWYgWEtCU1JWX05FRURfRklMRV9GVU5DUworCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWEtNZm9ybWF0Lmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWEtCZmlsZS5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hLQnJ1bGVzLmg+CisKKyNkZWZpbmUJX1hrYkxpc3RLZXltYXBzCQkwCisjZGVmaW5lCV9Ya2JMaXN0S2V5Y29kZXMJMQorI2RlZmluZQlfWGtiTGlzdFR5cGVzCQkyCisjZGVmaW5lCV9Ya2JMaXN0Q29tcGF0CQkzCisjZGVmaW5lCV9Ya2JMaXN0U3ltYm9scwkJNAorI2RlZmluZQlfWGtiTGlzdEdlb21ldHJ5CTUKKyNkZWZpbmUJX1hrYkxpc3ROdW1Db21wb25lbnRzCTYKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYlNydkxpc3RJbmZvIHsKKwlpbnQJCXN6UG9vbDsKKwlpbnQJCW5Qb29sOworCWNoYXIgKgkJcG9vbDsKKworCWludAkJbWF4UnRybjsKKwlpbnQJCW5Ub3RhbDsKKworCWNoYXIgKgkJcGF0dGVybltfWGtiTGlzdE51bUNvbXBvbmVudHNdOworCWludAkJbkZvdW5kW19Ya2JMaXN0TnVtQ29tcG9uZW50c107Cit9IFhrYlNydkxpc3RJbmZvUmVjLCpYa2JTcnZMaXN0SW5mb1B0cjsKKworY2hhciAqCitYa2JHZXRSdWxlc0RmbHRzKAorCVhrYlJGX1ZhckRlZnNQdHIJLyogZGVmcyAqLworKTsKKworZXh0ZXJuIHZvaWQJWGtiU2V0UnVsZXNVc2VkKAorCVhrYlJGX1ZhckRlZnNQdHIJLyogZGVmcyAqLworKTsKKworCitleHRlcm4JU3RhdHVzCVhrYkREWExpc3QoCisJRGV2aWNlSW50UHRyCQkvKiBkZXYgKi8sCisJWGtiU3J2TGlzdEluZm9QdHIJLyogbGlzdGluZyAqLywKKwlDbGllbnRQdHIJCS8qIGNsaWVudCAqLworKTsKKworZXh0ZXJuCXVuc2lnbmVkIGludCBYa2JERFhMb2FkS2V5bWFwQnlOYW1lcygKKwlEZXZpY2VJbnRQdHIJCS8qIGtleWJkICovLAorCVhrYkNvbXBvbmVudE5hbWVzUHRyCS8qIG5hbWVzICovLAorCXVuc2lnbmVkIGludAkJLyogd2FudCAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIG5lZWQgKi8sCisJWGtiRmlsZUluZm9QdHIJCS8qIGZpbmZvUnRybiAqLywKKwljaGFyICoJCQkvKiBrZXltYXBOYW1lUnRybiAqLywKKwlpbnQgCQkJLyoga2V5bWFwTmFtZVJ0cm5MZW4gKi8KKyk7CisKK2V4dGVybglCb29sIFhrYkREWE5hbWVzRnJvbVJ1bGVzKAorCURldmljZUludFB0cgkJLyoga2V5YmQgKi8sCisJY2hhciAqCQkJLyogcnVsZXMgKi8sCisJWGtiUkZfVmFyRGVmc1B0cgkvKiBkZWZzICovLAorCVhrYkNvbXBvbmVudE5hbWVzUHRyCS8qIG5hbWVzICovCispOworCitleHRlcm4JRklMRSAqWGtiRERYT3BlbkNvbmZpZ0ZpbGUoCisJY2hhciAqCS8qIG1hcE5hbWUgKi8sCisJY2hhciAqCS8qIGZpbGVOYW1lUnRybiAqLywKKwlpbnQJLyogZmlsZU5hbWVSdHJuTGVuICovCispOworCitleHRlcm4JQm9vbCBYa2JERFhBcHBseUNvbmZpZygKKwlYUG9pbnRlcgkvKiBjZmdfaW4gKi8sCisJWGtiU3J2SW5mb1B0cgkvKiB4a2JpICovCispOworCitleHRlcm4gWFBvaW50ZXIgWGtiRERYUHJlbG9hZENvbmZpZygKKwljaGFyICoqCQkJLyogcnVsZXNGaWxlUnRybiAqLywKKwlYa2JSRl9WYXJEZWZzUHRyCS8qIGRlZnMgKi8sCisJWGtiQ29tcG9uZW50TmFtZXNQdHIJLyogbmFtZXMgKi8sCisJRGV2aWNlSW50UHRyCQkvKiBkZXYgKi8KKyk7CisKK2V4dGVybglpbnQgX1hrYlN0ckNhc2VDbXAoCisJY2hhciAqCQkJLyogc3RyMSAqLywKKwljaGFyICoJCQkvKiBzdHIyICovCispOworCisjZW5kaWYgLyogWEtCU1JWX05FRURfRklMRV9GVU5DUyAqLworCisKK19YRlVOQ1BST1RPRU5ECisKKyNkZWZpbmUJWGtiQXRvbUdldFN0cmluZyhkLHMpCU5hbWVGb3JBdG9tKHMpCisKKyNlbmRpZiAvKiBfWEtCU1JWX0hfICovCisKKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YS0JzdHIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEtCc3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2M2Y0OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEtCc3RyLmgKQEAgLTAsMCArMSw2MTQgQEAKKy8qICRYb3JnOiBYS0JzdHIuaCx2IDEuMyAyMDAwLzA4LzE4IDA0OjA1OjQ1IGNvc2tyZXkgRXhwICQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMTk5MyBieSBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dAorZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKK25vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0Citub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIFNpbGljb24gR3JhcGhpY3Mgbm90IGJlIAordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gCitvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSAKK29mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCit3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKK1NJTElDT04gR1JBUEhJQ1MgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgCitTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIAorQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBJTiBOTyBFVkVOVCBTSEFMTCBTSUxJQ09OCitHUkFQSElDUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIAorREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCAKK0RBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgCitPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gIFdJVEgKK1RIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1hLQlNUUl9IXworI2RlZmluZQlfWEtCU1RSX0hfCisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YS0IuaD4KKworI2RlZmluZQlYa2JDaGFyVG9JbnQodikJCSgodikmMHg4MD8oaW50KSgodil8KH4weGZmKSk6KGludCkoKHYpJjB4N2YpKQorI2RlZmluZQlYa2JJbnRUbzJDaGFycyhpLGgsbCkJKCgoaCk9KChpPj44KSYweGZmKSksKChsKT0oKGkpJjB4ZmYpKSkKKworI2lmIGRlZmluZWQoV09SRDY0KSAmJiBkZWZpbmVkKFVOU0lHTkVEQklURklFTERTKQorI2RlZmluZQlYa2IyQ2hhcnNUb0ludChoLGwpCSgoaCkmMHg4MD8oaW50KSgoKGgpPDw4KXwobCl8KH4weGZmZmYpKTpcCisJCQkJCSAgKGludCkoKChoKTw8OCl8KGwpJjB4N2ZmZikpCisjZWxzZQorI2RlZmluZQlYa2IyQ2hhcnNUb0ludChoLGwpCSgoc2hvcnQpKCgoaCk8PDgpfChsKSkpCisjZW5kaWYKKworCS8qCisJICogQ29tbW9uIGRhdGEgc3RydWN0dXJlcyBhbmQgYWNjZXNzIG1hY3JvcworCSAqLworCit0eXBlZGVmIHN0cnVjdCBfWGtiU3RhdGVSZWMgeworCXVuc2lnbmVkIGNoYXIJZ3JvdXA7CisJdW5zaWduZWQgY2hhciAgIGxvY2tlZF9ncm91cDsKKwl1bnNpZ25lZCBzaG9ydAliYXNlX2dyb3VwOworCXVuc2lnbmVkIHNob3J0CWxhdGNoZWRfZ3JvdXA7CisJdW5zaWduZWQgY2hhcgltb2RzOworCXVuc2lnbmVkIGNoYXIJYmFzZV9tb2RzOworCXVuc2lnbmVkIGNoYXIJbGF0Y2hlZF9tb2RzOworCXVuc2lnbmVkIGNoYXIJbG9ja2VkX21vZHM7CisJdW5zaWduZWQgY2hhcgljb21wYXRfc3RhdGU7CisJdW5zaWduZWQgY2hhcglncmFiX21vZHM7CisJdW5zaWduZWQgY2hhcgljb21wYXRfZ3JhYl9tb2RzOworCXVuc2lnbmVkIGNoYXIJbG9va3VwX21vZHM7CisJdW5zaWduZWQgY2hhcgljb21wYXRfbG9va3VwX21vZHM7CisJdW5zaWduZWQgc2hvcnQJcHRyX2J1dHRvbnM7Cit9IFhrYlN0YXRlUmVjLCpYa2JTdGF0ZVB0cjsKKyNkZWZpbmUJWGtiTW9kTG9ja3MocykJICgocyktPmxvY2tlZF9tb2RzKQorI2RlZmluZQlYa2JTdGF0ZU1vZHMocykJICgocyktPmJhc2VfbW9kc3wocyktPmxhdGNoZWRfbW9kc3xYa2JNb2RMb2NrcyhzKSkKKyNkZWZpbmUJWGtiR3JvdXBMb2NrKHMpCSAoKHMpLT5sb2NrZWRfZ3JvdXApCisjZGVmaW5lCVhrYlN0YXRlR3JvdXAocykgKChzKS0+YmFzZV9ncm91cCsocyktPmxhdGNoZWRfZ3JvdXArWGtiR3JvdXBMb2NrKHMpKQorI2RlZmluZQlYa2JTdGF0ZUZpZWxkRnJvbVJlYyhzKQlYa2JCdWlsZENvcmVTdGF0ZSgocyktPmxvb2t1cF9tb2RzLChzKS0+Z3JvdXApCisjZGVmaW5lCVhrYkdyYWJTdGF0ZUZyb21SZWMocykJWGtiQnVpbGRDb3JlU3RhdGUoKHMpLT5ncmFiX21vZHMsKHMpLT5ncm91cCkKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYk1vZHMgeworCXVuc2lnbmVkIGNoYXIJbWFzazsJLyogZWZmZWN0aXZlIG1vZHMgKi8KKwl1bnNpZ25lZCBjaGFyCXJlYWxfbW9kczsKKwl1bnNpZ25lZCBzaG9ydAl2bW9kczsKK30gWGtiTW9kc1JlYywqWGtiTW9kc1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYktUTWFwRW50cnkgeworCUJvb2wJCWFjdGl2ZTsKKwl1bnNpZ25lZCBjaGFyCWxldmVsOworCVhrYk1vZHNSZWMJbW9kczsKK30gWGtiS1RNYXBFbnRyeVJlYywqWGtiS1RNYXBFbnRyeVB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYktleVR5cGUgeworCVhrYk1vZHNSZWMJCW1vZHM7CisJdW5zaWduZWQgY2hhcgkgIAludW1fbGV2ZWxzOworCXVuc2lnbmVkIGNoYXIJICAJbWFwX2NvdW50OworCVhrYktUTWFwRW50cnlQdHIgIAltYXA7CisJWGtiTW9kc1B0ciAgCQlwcmVzZXJ2ZTsKKwlBdG9tCQkgIAluYW1lOworCUF0b20gKgkJCWxldmVsX25hbWVzOworfSBYa2JLZXlUeXBlUmVjLCAqWGtiS2V5VHlwZVB0cjsKKworI2RlZmluZQlYa2JOdW1Hcm91cHMoZykJCQkoKGcpJjB4MGYpCisjZGVmaW5lCVhrYk91dE9mUmFuZ2VHcm91cEluZm8oZykJKChnKSYweGYwKQorI2RlZmluZQlYa2JPdXRPZlJhbmdlR3JvdXBBY3Rpb24oZykJKChnKSYweGMwKQorI2RlZmluZQlYa2JPdXRPZlJhbmdlR3JvdXBOdW1iZXIoZykJKCgoZykmMHgzMCk+PjQpCisjZGVmaW5lCVhrYlNldEdyb3VwSW5mbyhnLHcsbikJKCgodykmMHhjMCl8KCgobikmMyk8PDQpfCgoZykmMHgwZikpCisjZGVmaW5lCVhrYlNldE51bUdyb3VwcyhnLG4pCSgoKGcpJjB4ZjApfCgobikmMHgwZikpCisKKwkvKgorCSAqIFN0cnVjdHVyZXMgYW5kIGFjY2VzcyBtYWNyb3MgdXNlZCBwcmltYXJpbHkgYnkgdGhlIHNlcnZlcgorCSAqLworCit0eXBlZGVmIHN0cnVjdCBfWGtiQmVoYXZpb3IgeworCXVuc2lnbmVkIGNoYXIJdHlwZTsKKwl1bnNpZ25lZCBjaGFyCWRhdGE7Cit9IFhrYkJlaGF2aW9yOworCisjZGVmaW5lCVhrYkFueUFjdGlvbkRhdGFTaXplIDcKK3R5cGVkZWYJc3RydWN0IF9Ya2JBbnlBY3Rpb24geworCXVuc2lnbmVkIGNoYXIJdHlwZTsKKwl1bnNpZ25lZCBjaGFyCWRhdGFbWGtiQW55QWN0aW9uRGF0YVNpemVdOworfSBYa2JBbnlBY3Rpb247CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JNb2RBY3Rpb24geworCXVuc2lnbmVkIGNoYXIJdHlwZTsKKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworCXVuc2lnbmVkIGNoYXIJbWFzazsKKwl1bnNpZ25lZCBjaGFyCXJlYWxfbW9kczsKKwl1bnNpZ25lZCBjaGFyCXZtb2RzMTsKKwl1bnNpZ25lZCBjaGFyCXZtb2RzMjsKK30gWGtiTW9kQWN0aW9uOworI2RlZmluZQlYa2JNb2RBY3Rpb25WTW9kcyhhKSAgICAgIFwKKwkoKHNob3J0KSgoKGEpLT52bW9kczE8PDgpfCgoYSktPnZtb2RzMikpKQorI2RlZmluZQlYa2JTZXRNb2RBY3Rpb25WTW9kcyhhLHYpIFwKKwkoKChhKS0+dm1vZHMxPSgoKHYpPj44KSYweGZmKSksKGEpLT52bW9kczI9KCh2KSYweGZmKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkdyb3VwQWN0aW9uIHsKKwl1bnNpZ25lZCBjaGFyCXR5cGU7CisJdW5zaWduZWQgY2hhcglmbGFnczsKKwljaGFyCQlncm91cF9YWFg7Cit9IFhrYkdyb3VwQWN0aW9uOworI2RlZmluZQlYa2JTQUdyb3VwKGEpCQkoWGtiQ2hhclRvSW50KChhKS0+Z3JvdXBfWFhYKSkKKyNkZWZpbmUJWGtiU0FTZXRHcm91cChhLGcpCSgoYSktPmdyb3VwX1hYWD0oZykpCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JJU09BY3Rpb24geworCXVuc2lnbmVkIGNoYXIJdHlwZTsKKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworCXVuc2lnbmVkIGNoYXIJbWFzazsKKwl1bnNpZ25lZCBjaGFyCXJlYWxfbW9kczsKKwljaGFyCQlncm91cF9YWFg7CisJdW5zaWduZWQgY2hhcglhZmZlY3Q7CisJdW5zaWduZWQgY2hhcgl2bW9kczE7CisJdW5zaWduZWQgY2hhcgl2bW9kczI7Cit9IFhrYklTT0FjdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYlB0ckFjdGlvbiB7CisJdW5zaWduZWQgY2hhcgl0eXBlOworCXVuc2lnbmVkIGNoYXIJZmxhZ3M7CisJdW5zaWduZWQgY2hhcgloaWdoX1hYWDsKKwl1bnNpZ25lZCBjaGFyCWxvd19YWFg7CisJdW5zaWduZWQgY2hhcgloaWdoX1lZWTsKKwl1bnNpZ25lZCBjaGFyCWxvd19ZWVk7Cit9IFhrYlB0ckFjdGlvbjsKKyNkZWZpbmUJWGtiUHRyQWN0aW9uWChhKSAgICAgIChYa2IyQ2hhcnNUb0ludCgoYSktPmhpZ2hfWFhYLChhKS0+bG93X1hYWCkpCisjZGVmaW5lCVhrYlB0ckFjdGlvblkoYSkgICAgICAoWGtiMkNoYXJzVG9JbnQoKGEpLT5oaWdoX1lZWSwoYSktPmxvd19ZWVkpKQorI2RlZmluZQlYa2JTZXRQdHJBY3Rpb25YKGEseCkgKFhrYkludFRvMkNoYXJzKHgsKGEpLT5oaWdoX1hYWCwoYSktPmxvd19YWFgpKQorI2RlZmluZQlYa2JTZXRQdHJBY3Rpb25ZKGEseSkgKFhrYkludFRvMkNoYXJzKHksKGEpLT5oaWdoX1lZWSwoYSktPmxvd19ZWVkpKQorCit0eXBlZGVmIHN0cnVjdCBfWGtiUHRyQnRuQWN0aW9uIHsKKwl1bnNpZ25lZCBjaGFyCXR5cGU7CisJdW5zaWduZWQgY2hhcglmbGFnczsKKwl1bnNpZ25lZCBjaGFyCWNvdW50OworCXVuc2lnbmVkIGNoYXIJYnV0dG9uOworfSBYa2JQdHJCdG5BY3Rpb247CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JQdHJEZmx0QWN0aW9uIHsKKwl1bnNpZ25lZCBjaGFyCXR5cGU7CisJdW5zaWduZWQgY2hhcglmbGFnczsKKwl1bnNpZ25lZCBjaGFyCWFmZmVjdDsKKwljaGFyCQl2YWx1ZVhYWDsKK30gWGtiUHRyRGZsdEFjdGlvbjsKKyNkZWZpbmUJWGtiU0FQdHJEZmx0VmFsdWUoYSkJCShYa2JDaGFyVG9JbnQoKGEpLT52YWx1ZVhYWCkpCisjZGVmaW5lCVhrYlNBU2V0UHRyRGZsdFZhbHVlKGEsYykJKChhKS0+dmFsdWVYWFg9ICgoYykmMHhmZikpCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JTd2l0Y2hTY3JlZW5BY3Rpb24geworCXVuc2lnbmVkIGNoYXIJdHlwZTsKKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworCWNoYXIJCXNjcmVlblhYWDsKK30gWGtiU3dpdGNoU2NyZWVuQWN0aW9uOworI2RlZmluZQlYa2JTQVNjcmVlbihhKQkJCShYa2JDaGFyVG9JbnQoKGEpLT5zY3JlZW5YWFgpKQorI2RlZmluZQlYa2JTQVNldFNjcmVlbihhLHMpCQkoKGEpLT5zY3JlZW5YWFg9ICgocykmMHhmZikpCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JDdHJsc0FjdGlvbiB7CisJdW5zaWduZWQgY2hhcgl0eXBlOworCXVuc2lnbmVkIGNoYXIJZmxhZ3M7CisJdW5zaWduZWQgY2hhcgljdHJsczM7CisJdW5zaWduZWQgY2hhcgljdHJsczI7CisJdW5zaWduZWQgY2hhcgljdHJsczE7CisJdW5zaWduZWQgY2hhcgljdHJsczA7Cit9IFhrYkN0cmxzQWN0aW9uOworI2RlZmluZQlYa2JBY3Rpb25TZXRDdHJscyhhLGMpCSgoKGEpLT5jdHJsczM9KCgoYyk+PjI0KSYweGZmKSksXAorCQkJCQkoKGEpLT5jdHJsczI9KCgoYyk+PjE2KSYweGZmKSksXAorCQkJCQkoKGEpLT5jdHJsczE9KCgoYyk+PjgpJjB4ZmYpKSxcCisJCQkJCSgoYSktPmN0cmxzMD0oKGMpJjB4ZmYpKSkKKyNkZWZpbmUJWGtiQWN0aW9uQ3RybHMoYSkgKCgoKHVuc2lnbmVkIGludCkoYSktPmN0cmxzMyk8PDI0KXxcCisJCQkgICAoKCh1bnNpZ25lZCBpbnQpKGEpLT5jdHJsczIpPDwxNil8XAorCQkJICAgKCgodW5zaWduZWQgaW50KShhKS0+Y3RybHMxKTw8OCl8XAorCQkJICAgKCh1bnNpZ25lZCBpbnQpKChhKS0+Y3RybHMwKSkpCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JNZXNzYWdlQWN0aW9uIHsKKwl1bnNpZ25lZCBjaGFyCXR5cGU7CisJdW5zaWduZWQgY2hhcglmbGFnczsKKwl1bnNpZ25lZCBjaGFyCW1lc3NhZ2VbNl07Cit9IFhrYk1lc3NhZ2VBY3Rpb247CisKK3R5cGVkZWYgc3RydWN0CV9Ya2JSZWRpcmVjdEtleUFjdGlvbiB7CisJdW5zaWduZWQgY2hhcgl0eXBlOworCXVuc2lnbmVkIGNoYXIJbmV3X2tleTsKKwl1bnNpZ25lZCBjaGFyCW1vZHNfbWFzazsKKwl1bnNpZ25lZCBjaGFyCW1vZHM7CisJdW5zaWduZWQgY2hhcgl2bW9kc19tYXNrMDsKKwl1bnNpZ25lZCBjaGFyCXZtb2RzX21hc2sxOworCXVuc2lnbmVkIGNoYXIJdm1vZHMwOworCXVuc2lnbmVkIGNoYXIJdm1vZHMxOworfSBYa2JSZWRpcmVjdEtleUFjdGlvbjsKKworI2RlZmluZQlYa2JTQVJlZGlyZWN0Vk1vZHMoYSkJCSgoKCh1bnNpZ25lZCBpbnQpKGEpLT52bW9kczEpPDw4KXxcCisJCQkJCSgodW5zaWduZWQgaW50KShhKS0+dm1vZHMwKSkKKyNkZWZpbmUJWGtiU0FSZWRpcmVjdFNldFZNb2RzKGEsbSkJKCgoYSktPnZtb2RzX21hc2sxPSgoKG0pPj44KSYweGZmKSksXAorCQkJCQkgKChhKS0+dm1vZHNfbWFzazA9KChtKSYweGZmKSkpCisjZGVmaW5lCVhrYlNBUmVkaXJlY3RWTW9kc01hc2soYSkJKCgoKHVuc2lnbmVkIGludCkoYSktPnZtb2RzX21hc2sxKTw8OCl8XAorCQkJCQkoKHVuc2lnbmVkIGludCkoYSktPnZtb2RzX21hc2swKSkKKyNkZWZpbmUJWGtiU0FSZWRpcmVjdFNldFZNb2RzTWFzayhhLG0pCSgoKGEpLT52bW9kc19tYXNrMT0oKChtKT4+OCkmMHhmZikpLFwKKwkJCQkJICgoYSktPnZtb2RzX21hc2swPSgobSkmMHhmZikpKQorCit0eXBlZGVmIHN0cnVjdCBfWGtiRGV2aWNlQnRuQWN0aW9uIHsKKwl1bnNpZ25lZCBjaGFyCXR5cGU7CisJdW5zaWduZWQgY2hhcglmbGFnczsKKwl1bnNpZ25lZCBjaGFyCWNvdW50OworCXVuc2lnbmVkIGNoYXIJYnV0dG9uOworCXVuc2lnbmVkIGNoYXIJZGV2aWNlOworfSBYa2JEZXZpY2VCdG5BY3Rpb247CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JEZXZpY2VWYWx1YXRvckFjdGlvbiB7CisJdW5zaWduZWQgY2hhcgl0eXBlOworCXVuc2lnbmVkIGNoYXIJZGV2aWNlOworCXVuc2lnbmVkIGNoYXIJdjFfd2hhdDsKKwl1bnNpZ25lZCBjaGFyCXYxX25keDsKKwl1bnNpZ25lZCBjaGFyCXYxX3ZhbHVlOworCXVuc2lnbmVkIGNoYXIJdjJfd2hhdDsKKwl1bnNpZ25lZCBjaGFyCXYyX25keDsKKwl1bnNpZ25lZCBjaGFyCXYyX3ZhbHVlOworfSBYa2JEZXZpY2VWYWx1YXRvckFjdGlvbjsKKwordHlwZWRlZgl1bmlvbiBfWGtiQWN0aW9uIHsKKwlYa2JBbnlBY3Rpb24JCWFueTsKKwlYa2JNb2RBY3Rpb24JCW1vZHM7CisJWGtiR3JvdXBBY3Rpb24JCWdyb3VwOworCVhrYklTT0FjdGlvbgkJaXNvOworCVhrYlB0ckFjdGlvbgkJcHRyOworCVhrYlB0ckJ0bkFjdGlvbgkJYnRuOworCVhrYlB0ckRmbHRBY3Rpb24JZGZsdDsKKwlYa2JTd2l0Y2hTY3JlZW5BY3Rpb24Jc2NyZWVuOworCVhrYkN0cmxzQWN0aW9uCQljdHJsczsKKwlYa2JNZXNzYWdlQWN0aW9uCW1zZzsKKwlYa2JSZWRpcmVjdEtleUFjdGlvbglyZWRpcmVjdDsKKwlYa2JEZXZpY2VCdG5BY3Rpb24JZGV2YnRuOworCVhrYkRldmljZVZhbHVhdG9yQWN0aW9uCWRldnZhbDsKKwl1bnNpZ25lZCBjaGFyIAkJdHlwZTsKK30gWGtiQWN0aW9uOworCit0eXBlZGVmCXN0cnVjdCBfWGtiQ29udHJvbHMgeworCXVuc2lnbmVkIGNoYXIJbWtfZGZsdF9idG47CisJdW5zaWduZWQgY2hhcgludW1fZ3JvdXBzOworCXVuc2lnbmVkIGNoYXIJZ3JvdXBzX3dyYXA7CisJWGtiTW9kc1JlYwlpbnRlcm5hbDsKKwlYa2JNb2RzUmVjCWlnbm9yZV9sb2NrOworCXVuc2lnbmVkIGludAllbmFibGVkX2N0cmxzOworCXVuc2lnbmVkIHNob3J0CXJlcGVhdF9kZWxheTsKKwl1bnNpZ25lZCBzaG9ydAlyZXBlYXRfaW50ZXJ2YWw7CisJdW5zaWduZWQgc2hvcnQJc2xvd19rZXlzX2RlbGF5OworCXVuc2lnbmVkIHNob3J0CWRlYm91bmNlX2RlbGF5OworCXVuc2lnbmVkIHNob3J0CW1rX2RlbGF5OworCXVuc2lnbmVkIHNob3J0CW1rX2ludGVydmFsOworCXVuc2lnbmVkIHNob3J0CW1rX3RpbWVfdG9fbWF4OworCXVuc2lnbmVkIHNob3J0CW1rX21heF9zcGVlZDsKKwkJIHNob3J0CW1rX2N1cnZlOworCXVuc2lnbmVkIHNob3J0CWF4X29wdGlvbnM7CisJdW5zaWduZWQgc2hvcnQJYXhfdGltZW91dDsKKwl1bnNpZ25lZCBzaG9ydAlheHRfb3B0c19tYXNrOworCXVuc2lnbmVkIHNob3J0CWF4dF9vcHRzX3ZhbHVlczsKKwl1bnNpZ25lZCBpbnQJYXh0X2N0cmxzX21hc2s7CisJdW5zaWduZWQgaW50CWF4dF9jdHJsc192YWx1ZXM7CisJdW5zaWduZWQgY2hhcglwZXJfa2V5X3JlcGVhdFtYa2JQZXJLZXlCaXRBcnJheVNpemVdOworfSBYa2JDb250cm9sc1JlYywgKlhrYkNvbnRyb2xzUHRyOworCisjZGVmaW5lCVhrYkFYX0FueUZlZWRiYWNrKGMpCSgoYyktPmVuYWJsZWRfY3RybHMmWGtiQWNjZXNzWEZlZWRiYWNrTWFzaykKKyNkZWZpbmUJWGtiQVhfTmVlZE9wdGlvbihjLHcpCSgoYyktPmF4X29wdGlvbnMmKHcpKQorI2RlZmluZQlYa2JBWF9OZWVkRmVlZGJhY2soYyx3KQkoWGtiQVhfQW55RmVlZGJhY2soYykmJlhrYkFYX05lZWRPcHRpb24oYyx3KSkKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYlNlcnZlck1hcFJlYyB7CisJdW5zaWduZWQgc2hvcnQJCSBudW1fYWN0czsKKwl1bnNpZ25lZCBzaG9ydAkJIHNpemVfYWN0czsKKwlYa2JBY3Rpb24JCSphY3RzOworCisJWGtiQmVoYXZpb3IJCSpiZWhhdmlvcnM7CisJdW5zaWduZWQgc2hvcnQJCSprZXlfYWN0czsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisJLyogZXhwbGljaXQgaXMgYSBDKysgcmVzZXJ2ZWQgd29yZCAqLworCXVuc2lnbmVkIGNoYXIJCSpjX2V4cGxpY2l0OworI2Vsc2UKKwl1bnNpZ25lZCBjaGFyCQkqZXhwbGljaXQ7CisjZW5kaWYKKwl1bnNpZ25lZCBjaGFyCQkgdm1vZHNbWGtiTnVtVmlydHVhbE1vZHNdOworCXVuc2lnbmVkIHNob3J0CQkqdm1vZG1hcDsKK30gWGtiU2VydmVyTWFwUmVjLCAqWGtiU2VydmVyTWFwUHRyOworCisjZGVmaW5lCVhrYlNNS2V5QWN0aW9uc1B0cihtLGspICgmKG0pLT5hY3RzWyhtKS0+a2V5X2FjdHNba11dKQorCisJLyoKKwkgKiBTdHJ1Y3R1cmVzIGFuZCBhY2Nlc3MgbWFjcm9zIHVzZWQgcHJpbWFyaWx5IGJ5IGNsaWVudHMKKwkgKi8KKwordHlwZWRlZglzdHJ1Y3QgX1hrYlN5bU1hcFJlYyB7CisJdW5zaWduZWQgY2hhcgkga3RfaW5kZXhbWGtiTnVtS2JkR3JvdXBzXTsKKwl1bnNpZ25lZCBjaGFyCSBncm91cF9pbmZvOworCXVuc2lnbmVkIGNoYXIJIHdpZHRoOworCXVuc2lnbmVkIHNob3J0CSBvZmZzZXQ7Cit9IFhrYlN5bU1hcFJlYywgKlhrYlN5bU1hcFB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkNsaWVudE1hcFJlYyB7CisJdW5zaWduZWQgY2hhcgkJIHNpemVfdHlwZXM7CisJdW5zaWduZWQgY2hhcgkJIG51bV90eXBlczsKKwlYa2JLZXlUeXBlUHRyCQkgdHlwZXM7CisKKwl1bnNpZ25lZCBzaG9ydAkJIHNpemVfc3ltczsKKwl1bnNpZ25lZCBzaG9ydAkJIG51bV9zeW1zOworCUtleVN5bQkJCSpzeW1zOworCVhrYlN5bU1hcFB0cgkJIGtleV9zeW1fbWFwOworCisJdW5zaWduZWQgY2hhcgkJKm1vZG1hcDsKK30gWGtiQ2xpZW50TWFwUmVjLCAqWGtiQ2xpZW50TWFwUHRyOworCisjZGVmaW5lCVhrYkNNS2V5R3JvdXBJbmZvKG0saykgICgobSktPmtleV9zeW1fbWFwW2tdLmdyb3VwX2luZm8pCisjZGVmaW5lCVhrYkNNS2V5TnVtR3JvdXBzKG0saykJIChYa2JOdW1Hcm91cHMoKG0pLT5rZXlfc3ltX21hcFtrXS5ncm91cF9pbmZvKSkKKyNkZWZpbmUJWGtiQ01LZXlHcm91cFdpZHRoKG0sayxnKSAoWGtiQ01LZXlUeXBlKG0sayxnKS0+bnVtX2xldmVscykKKyNkZWZpbmUJWGtiQ01LZXlHcm91cHNXaWR0aChtLGspICgobSktPmtleV9zeW1fbWFwW2tdLndpZHRoKQorI2RlZmluZQlYa2JDTUtleVR5cGVJbmRleChtLGssZykgKChtKS0+a2V5X3N5bV9tYXBba10ua3RfaW5kZXhbZyYweDNdKQorI2RlZmluZQlYa2JDTUtleVR5cGUobSxrLGcpCSAoJihtKS0+dHlwZXNbWGtiQ01LZXlUeXBlSW5kZXgobSxrLGcpXSkKKyNkZWZpbmUJWGtiQ01LZXlOdW1TeW1zKG0saykgKFhrYkNNS2V5R3JvdXBzV2lkdGgobSxrKSpYa2JDTUtleU51bUdyb3VwcyhtLGspKQorI2RlZmluZQlYa2JDTUtleVN5bXNPZmZzZXQobSxrKQkoKG0pLT5rZXlfc3ltX21hcFtrXS5vZmZzZXQpCisjZGVmaW5lCVhrYkNNS2V5U3ltc1B0cihtLGspCSgmKG0pLT5zeW1zW1hrYkNNS2V5U3ltc09mZnNldChtLGspXSkKKworCS8qCisJICogQ29tcGF0aWJpbGl0eSBzdHJ1Y3R1cmVzIGFuZCBhY2Nlc3MgbWFjcm9zCisJICovCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JTeW1JbnRlcnByZXRSZWMgeworCUtleVN5bQkJc3ltOworCXVuc2lnbmVkIGNoYXIJZmxhZ3M7CisJdW5zaWduZWQgY2hhcgltYXRjaDsKKwl1bnNpZ25lZCBjaGFyCW1vZHM7CisJdW5zaWduZWQgY2hhcgl2aXJ0dWFsX21vZDsKKwlYa2JBbnlBY3Rpb24JYWN0OworfSBYa2JTeW1JbnRlcnByZXRSZWMsKlhrYlN5bUludGVycHJldFB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkNvbXBhdE1hcFJlYyB7CisJWGtiU3ltSW50ZXJwcmV0UHRyCSBzeW1faW50ZXJwcmV0OworCVhrYk1vZHNSZWMJCSBncm91cHNbWGtiTnVtS2JkR3JvdXBzXTsKKwl1bnNpZ25lZCBzaG9ydAkJIG51bV9zaTsKKwl1bnNpZ25lZCBzaG9ydAkJIHNpemVfc2k7Cit9IFhrYkNvbXBhdE1hcFJlYywgKlhrYkNvbXBhdE1hcFB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkluZGljYXRvck1hcFJlYyB7CisJdW5zaWduZWQgY2hhcglmbGFnczsKKwl1bnNpZ25lZCBjaGFyCXdoaWNoX2dyb3VwczsKKwl1bnNpZ25lZCBjaGFyCWdyb3VwczsKKwl1bnNpZ25lZCBjaGFyCXdoaWNoX21vZHM7CisJWGtiTW9kc1JlYwltb2RzOworCXVuc2lnbmVkIGludAljdHJsczsKK30gWGtiSW5kaWNhdG9yTWFwUmVjLCAqWGtiSW5kaWNhdG9yTWFwUHRyOworCisjZGVmaW5lCVhrYklNX0lzQXV0byhpKQkoKCgoaSktPmZsYWdzJlhrYklNX05vQXV0b21hdGljKT09MCkmJlwKKwkJCSAgICAoKChpKS0+d2hpY2hfZ3JvdXBzJiYoaSktPmdyb3Vwcyl8fFwKKwkJCSAgICAgKChpKS0+d2hpY2hfbW9kcyYmKGkpLT5tb2RzLm1hc2spfHxcCisJCQkgICAgICgoaSktPmN0cmxzKSkpCisjZGVmaW5lCVhrYklNX0luVXNlKGkpCSgoKGkpLT5mbGFncyl8fCgoaSktPndoaWNoX2dyb3Vwcyl8fFwKKwkJCQkJKChpKS0+d2hpY2hfbW9kcyl8fCgoaSktPmN0cmxzKSkKKwkKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkluZGljYXRvclJlYyB7CisJdW5zaWduZWQgbG9uZwkgIAlwaHlzX2luZGljYXRvcnM7CisJWGtiSW5kaWNhdG9yTWFwUmVjCW1hcHNbWGtiTnVtSW5kaWNhdG9yc107Cit9IFhrYkluZGljYXRvclJlYywqWGtiSW5kaWNhdG9yUHRyOworCit0eXBlZGVmCXN0cnVjdCBfWGtiS2V5TmFtZVJlYyB7CisJY2hhcgluYW1lW1hrYktleU5hbWVMZW5ndGhdOworfSBYa2JLZXlOYW1lUmVjLCpYa2JLZXlOYW1lUHRyOworCit0eXBlZGVmIHN0cnVjdCBfWGtiS2V5QWxpYXNSZWMgeworCWNoYXIJcmVhbFtYa2JLZXlOYW1lTGVuZ3RoXTsKKwljaGFyCWFsaWFzW1hrYktleU5hbWVMZW5ndGhdOworfSBYa2JLZXlBbGlhc1JlYywqWGtiS2V5QWxpYXNQdHI7CisKKwkvKgorCSAqIE5hbWVzIGZvciBldmVyeXRoaW5nIAorCSAqLwordHlwZWRlZiBzdHJ1Y3QgX1hrYk5hbWVzUmVjIHsKKwlBdG9tCQkgIGtleWNvZGVzOworCUF0b20JCSAgZ2VvbWV0cnk7CisJQXRvbQkJICBzeW1ib2xzOworCUF0b20gICAgICAgICAgICAgIHR5cGVzOworCUF0b20JCSAgY29tcGF0OworCUF0b20JCSAgdm1vZHNbWGtiTnVtVmlydHVhbE1vZHNdOworCUF0b20JCSAgaW5kaWNhdG9yc1tYa2JOdW1JbmRpY2F0b3JzXTsKKwlBdG9tCQkgIGdyb3Vwc1tYa2JOdW1LYmRHcm91cHNdOworCVhrYktleU5hbWVQdHIJICBrZXlzOworCVhrYktleUFsaWFzUHRyCSAga2V5X2FsaWFzZXM7CisJQXRvbQkJICpyYWRpb19ncm91cHM7CisJQXRvbQkJICBwaHlzX3N5bWJvbHM7CisKKwl1bnNpZ25lZCBjaGFyCSAgbnVtX2tleXM7CisJdW5zaWduZWQgY2hhcgkgIG51bV9rZXlfYWxpYXNlczsKKwl1bnNpZ25lZCBzaG9ydAkgIG51bV9yZzsKK30gWGtiTmFtZXNSZWMsKlhrYk5hbWVzUHRyOworCit0eXBlZGVmCXN0cnVjdCBfWGtiR2VvbWV0cnkJKlhrYkdlb21ldHJ5UHRyOworCS8qCisJICogVGllIGl0IGFsbCB0b2dldGhlciBpbnRvIG9uZSBiaWcga2V5Ym9hcmQgZGVzY3JpcHRpb24KKwkgKi8KK3R5cGVkZWYJc3RydWN0IF9Ya2JEZXNjIHsKKwlzdHJ1Y3QgX1hEaXNwbGF5ICoJZHB5OworCXVuc2lnbmVkIHNob3J0CSAJZmxhZ3M7CisJdW5zaWduZWQgc2hvcnQJCWRldmljZV9zcGVjOworCUtleUNvZGUJCQltaW5fa2V5X2NvZGU7CisJS2V5Q29kZQkJCW1heF9rZXlfY29kZTsKKworCVhrYkNvbnRyb2xzUHRyCQljdHJsczsKKwlYa2JTZXJ2ZXJNYXBQdHIJCXNlcnZlcjsKKwlYa2JDbGllbnRNYXBQdHIJCW1hcDsKKwlYa2JJbmRpY2F0b3JQdHIJCWluZGljYXRvcnM7CisJWGtiTmFtZXNQdHIJCW5hbWVzOworCVhrYkNvbXBhdE1hcFB0cgkJY29tcGF0OworCVhrYkdlb21ldHJ5UHRyCQlnZW9tOworfSBYa2JEZXNjUmVjLCAqWGtiRGVzY1B0cjsKKyNkZWZpbmUJWGtiS2V5S2V5VHlwZUluZGV4KGQsayxnKQkoWGtiQ01LZXlUeXBlSW5kZXgoKGQpLT5tYXAsayxnKSkKKyNkZWZpbmUJWGtiS2V5S2V5VHlwZShkLGssZykJCShYa2JDTUtleVR5cGUoKGQpLT5tYXAsayxnKSkKKyNkZWZpbmUJWGtiS2V5R3JvdXBXaWR0aChkLGssZykJCShYa2JDTUtleUdyb3VwV2lkdGgoKGQpLT5tYXAsayxnKSkKKyNkZWZpbmUJWGtiS2V5R3JvdXBzV2lkdGgoZCxrKQkJKFhrYkNNS2V5R3JvdXBzV2lkdGgoKGQpLT5tYXAsaykpCisjZGVmaW5lCVhrYktleUdyb3VwSW5mbyhkLGspCQkoWGtiQ01LZXlHcm91cEluZm8oKGQpLT5tYXAsKGspKSkKKyNkZWZpbmUJWGtiS2V5TnVtR3JvdXBzKGQsaykJCShYa2JDTUtleU51bUdyb3VwcygoZCktPm1hcCwoaykpKQorI2RlZmluZQlYa2JLZXlOdW1TeW1zKGQsaykJCShYa2JDTUtleU51bVN5bXMoKGQpLT5tYXAsKGspKSkKKyNkZWZpbmUJWGtiS2V5U3ltc1B0cihkLGspCQkoWGtiQ01LZXlTeW1zUHRyKChkKS0+bWFwLChrKSkpCisjZGVmaW5lCVhrYktleVN5bShkLGssbikJCShYa2JLZXlTeW1zUHRyKGQsaylbbl0pCisjZGVmaW5lCVhrYktleVN5bUVudHJ5KGQsayxzbCxnKSBcCisJKFhrYktleVN5bShkLGssKChYa2JLZXlHcm91cHNXaWR0aChkLGspKihnKSkrKHNsKSkpKQorI2RlZmluZQlYa2JLZXlBY3Rpb24oZCxrLG4pIFwKKwkoWGtiS2V5SGFzQWN0aW9ucyhkLGspPyZYa2JLZXlBY3Rpb25zUHRyKGQsaylbbl06TlVMTCkKKyNkZWZpbmUJWGtiS2V5QWN0aW9uRW50cnkoZCxrLHNsLGcpIFwKKwkoWGtiS2V5SGFzQWN0aW9ucyhkLGspP1wKKwkJWGtiS2V5QWN0aW9uKGQsaywoKFhrYktleUdyb3Vwc1dpZHRoKGQsaykqKGcpKSsoc2wpKSk6TlVMTCkKKworI2RlZmluZQlYa2JLZXlIYXNBY3Rpb25zKGQsaykJKChkKS0+c2VydmVyLT5rZXlfYWN0c1trXSE9MCkKKyNkZWZpbmUJWGtiS2V5TnVtQWN0aW9ucyhkLGspCShYa2JLZXlIYXNBY3Rpb25zKGQsayk/WGtiS2V5TnVtU3ltcyhkLGspOjEpCisjZGVmaW5lCVhrYktleUFjdGlvbnNQdHIoZCxrKQkoWGtiU01LZXlBY3Rpb25zUHRyKChkKS0+c2VydmVyLGspKQorI2RlZmluZQlYa2JLZXljb2RlSW5SYW5nZShkLGspCSgoKGspPj0oZCktPm1pbl9rZXlfY29kZSkmJlwKKwkJCQkgKChrKTw9KGQpLT5tYXhfa2V5X2NvZGUpKQorI2RlZmluZQlYa2JOdW1LZXlzKGQpCQkoKGQpLT5tYXhfa2V5X2NvZGUtKGQpLT5taW5fa2V5X2NvZGUrMSkKKworCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZXMgY2FuIGJlIHVzZWQgdG8gdHJhY2sgY2hhbmdlcworCSAqIHRvIGEga2V5Ym9hcmQgZGV2aWNlCisJICovCit0eXBlZGVmIHN0cnVjdCBfWGtiTWFwQ2hhbmdlcyB7CisJdW5zaWduZWQgc2hvcnQJCSBjaGFuZ2VkOworCUtleUNvZGUJCQkgbWluX2tleV9jb2RlOworCUtleUNvZGUJCQkgbWF4X2tleV9jb2RlOworCXVuc2lnbmVkIGNoYXIJCSBmaXJzdF90eXBlOworCXVuc2lnbmVkIGNoYXIJCSBudW1fdHlwZXM7CisJS2V5Q29kZQkJCSBmaXJzdF9rZXlfc3ltOworCXVuc2lnbmVkIGNoYXIJCSBudW1fa2V5X3N5bXM7CisJS2V5Q29kZQkJCSBmaXJzdF9rZXlfYWN0OworCXVuc2lnbmVkIGNoYXIJCSBudW1fa2V5X2FjdHM7CisJS2V5Q29kZQkJCSBmaXJzdF9rZXlfYmVoYXZpb3I7CisJdW5zaWduZWQgY2hhcgkJIG51bV9rZXlfYmVoYXZpb3JzOworCUtleUNvZGUgCQkgZmlyc3Rfa2V5X2V4cGxpY2l0OworCXVuc2lnbmVkIGNoYXIJCSBudW1fa2V5X2V4cGxpY2l0OworCUtleUNvZGUJCQkgZmlyc3RfbW9kbWFwX2tleTsKKwl1bnNpZ25lZCBjaGFyCQkgbnVtX21vZG1hcF9rZXlzOworCUtleUNvZGUJCQkgZmlyc3Rfdm1vZG1hcF9rZXk7CisJdW5zaWduZWQgY2hhcgkJIG51bV92bW9kbWFwX2tleXM7CisJdW5zaWduZWQgY2hhcgkJIHBhZDsKKwl1bnNpZ25lZCBzaG9ydAkJIHZtb2RzOworfSBYa2JNYXBDaGFuZ2VzUmVjLCpYa2JNYXBDaGFuZ2VzUHRyOworCit0eXBlZGVmIHN0cnVjdCBfWGtiQ29udHJvbHNDaGFuZ2VzIHsKKwl1bnNpZ25lZCBpbnQgCQkgY2hhbmdlZF9jdHJsczsKKwl1bnNpZ25lZCBpbnQJCSBlbmFibGVkX2N0cmxzX2NoYW5nZXM7CisJQm9vbAkJCSBudW1fZ3JvdXBzX2NoYW5nZWQ7Cit9IFhrYkNvbnRyb2xzQ2hhbmdlc1JlYywqWGtiQ29udHJvbHNDaGFuZ2VzUHRyOworCit0eXBlZGVmIHN0cnVjdCBfWGtiSW5kaWNhdG9yQ2hhbmdlcyB7CisJdW5zaWduZWQgaW50CQkgc3RhdGVfY2hhbmdlczsKKwl1bnNpZ25lZCBpbnQJCSBtYXBfY2hhbmdlczsKK30gWGtiSW5kaWNhdG9yQ2hhbmdlc1JlYywqWGtiSW5kaWNhdG9yQ2hhbmdlc1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYk5hbWVDaGFuZ2VzIHsKKwl1bnNpZ25lZCBpbnQgCQljaGFuZ2VkOworCXVuc2lnbmVkIGNoYXIJCWZpcnN0X3R5cGU7CisJdW5zaWduZWQgY2hhcgkJbnVtX3R5cGVzOworCXVuc2lnbmVkIGNoYXIJCWZpcnN0X2x2bDsKKwl1bnNpZ25lZCBjaGFyCQludW1fbHZsczsKKwl1bnNpZ25lZCBjaGFyCQludW1fYWxpYXNlczsKKwl1bnNpZ25lZCBjaGFyCQludW1fcmc7CisJdW5zaWduZWQgY2hhcgkJZmlyc3Rfa2V5OworCXVuc2lnbmVkIGNoYXIJCW51bV9rZXlzOworCXVuc2lnbmVkIHNob3J0CQljaGFuZ2VkX3Ztb2RzOworCXVuc2lnbmVkIGxvbmcJCWNoYW5nZWRfaW5kaWNhdG9yczsKKwl1bnNpZ25lZCBjaGFyCQljaGFuZ2VkX2dyb3VwczsKK30gWGtiTmFtZUNoYW5nZXNSZWMsKlhrYk5hbWVDaGFuZ2VzUHRyOworCit0eXBlZGVmIHN0cnVjdCBfWGtiQ29tcGF0Q2hhbmdlcyB7CisJdW5zaWduZWQgY2hhcgkJY2hhbmdlZF9ncm91cHM7CisJdW5zaWduZWQgc2hvcnQJCWZpcnN0X3NpOworCXVuc2lnbmVkIHNob3J0CQludW1fc2k7Cit9IFhrYkNvbXBhdENoYW5nZXNSZWMsKlhrYkNvbXBhdENoYW5nZXNQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JDaGFuZ2VzIHsKKwl1bnNpZ25lZCBzaG9ydAkJIGRldmljZV9zcGVjOworCXVuc2lnbmVkIHNob3J0CQkgc3RhdGVfY2hhbmdlczsKKwlYa2JNYXBDaGFuZ2VzUmVjCSBtYXA7CisJWGtiQ29udHJvbHNDaGFuZ2VzUmVjCSBjdHJsczsKKwlYa2JJbmRpY2F0b3JDaGFuZ2VzUmVjCSBpbmRpY2F0b3JzOworCVhrYk5hbWVDaGFuZ2VzUmVjCSBuYW1lczsKKwlYa2JDb21wYXRDaGFuZ2VzUmVjCSBjb21wYXQ7Cit9IFhrYkNoYW5nZXNSZWMsICpYa2JDaGFuZ2VzUHRyOworCisJLyoKKwkgKiBUaGVzZSBkYXRhIHN0cnVjdHVyZXMgYXJlIHVzZWQgdG8gY29uc3RydWN0IGEga2V5bWFwIGZyb20gCisJICogYSBzZXQgb2YgY29tcG9uZW50cyBvciB0byBsaXN0IGNvbXBvbmVudHMgaW4gdGhlIHNlcnZlcgorCSAqIGRhdGFiYXNlLgorCSAqLwordHlwZWRlZiBzdHJ1Y3QgX1hrYkNvbXBvbmVudE5hbWVzIHsKKwljaGFyICoJCQkga2V5bWFwOworCWNoYXIgKgkJCSBrZXljb2RlczsKKwljaGFyICoJCQkgdHlwZXM7CisJY2hhciAqCQkJIGNvbXBhdDsKKwljaGFyICoJCQkgc3ltYm9sczsKKwljaGFyICoJCQkgZ2VvbWV0cnk7Cit9IFhrYkNvbXBvbmVudE5hbWVzUmVjLCAqWGtiQ29tcG9uZW50TmFtZXNQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JDb21wb25lbnROYW1lIHsKKwl1bnNpZ25lZCBzaG9ydAkJZmxhZ3M7CisJY2hhciAqCQkJbmFtZTsKK30gWGtiQ29tcG9uZW50TmFtZVJlYywqWGtiQ29tcG9uZW50TmFtZVB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkNvbXBvbmVudExpc3QgeworCWludAkJCW51bV9rZXltYXBzOworCWludAkJCW51bV9rZXljb2RlczsKKwlpbnQJCQludW1fdHlwZXM7CisJaW50CQkJbnVtX2NvbXBhdDsKKwlpbnQJCQludW1fc3ltYm9sczsKKwlpbnQJCQludW1fZ2VvbWV0cnk7CisJWGtiQ29tcG9uZW50TmFtZVB0cglrZXltYXBzOworCVhrYkNvbXBvbmVudE5hbWVQdHIgCWtleWNvZGVzOworCVhrYkNvbXBvbmVudE5hbWVQdHIJdHlwZXM7CisJWGtiQ29tcG9uZW50TmFtZVB0cgljb21wYXQ7CisJWGtiQ29tcG9uZW50TmFtZVB0cglzeW1ib2xzOworCVhrYkNvbXBvbmVudE5hbWVQdHIJZ2VvbWV0cnk7Cit9IFhrYkNvbXBvbmVudExpc3RSZWMsICpYa2JDb21wb25lbnRMaXN0UHRyOworCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIGRhdGEgc3RydWN0dXJlcyBkZXNjcmliZSBhbmQgdHJhY2sgY2hhbmdlcyB0byBhIAorCSAqIG5vbi1rZXlib2FyZCBleHRlbnNpb24gZGV2aWNlIAorCSAqLwordHlwZWRlZiBzdHJ1Y3QgX1hrYkRldmljZUxlZEluZm8geworCXVuc2lnbmVkIHNob3J0CQkJbGVkX2NsYXNzOworCXVuc2lnbmVkIHNob3J0CQkJbGVkX2lkOworCXVuc2lnbmVkIGludAkJCXBoeXNfaW5kaWNhdG9yczsKKwl1bnNpZ25lZCBpbnQJCQltYXBzX3ByZXNlbnQ7CisJdW5zaWduZWQgaW50CQkJbmFtZXNfcHJlc2VudDsKKwl1bnNpZ25lZCBpbnQJCQlzdGF0ZTsKKwlBdG9tIAkJCQluYW1lc1tYa2JOdW1JbmRpY2F0b3JzXTsKKwlYa2JJbmRpY2F0b3JNYXBSZWMJCW1hcHNbWGtiTnVtSW5kaWNhdG9yc107Cit9IFhrYkRldmljZUxlZEluZm9SZWMsKlhrYkRldmljZUxlZEluZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JEZXZpY2VJbmZvIHsKKwljaGFyICoJCQluYW1lOworCUF0b20JCQl0eXBlOworCXVuc2lnbmVkIHNob3J0CQlkZXZpY2Vfc3BlYzsKKwlCb29sCQkJaGFzX293bl9zdGF0ZTsKKwl1bnNpZ25lZCBzaG9ydAkJc3VwcG9ydGVkOworCXVuc2lnbmVkIHNob3J0CQl1bnN1cHBvcnRlZDsKKworCXVuc2lnbmVkIHNob3J0CQludW1fYnRuczsKKwlYa2JBY3Rpb24gKgkJYnRuX2FjdHM7CisKKwl1bnNpZ25lZCBzaG9ydAkJc3pfbGVkczsKKwl1bnNpZ25lZCBzaG9ydAkJbnVtX2xlZHM7CisJdW5zaWduZWQgc2hvcnQJCWRmbHRfa2JkX2ZiOworCXVuc2lnbmVkIHNob3J0CQlkZmx0X2xlZF9mYjsKKwlYa2JEZXZpY2VMZWRJbmZvUHRyCWxlZHM7Cit9IFhrYkRldmljZUluZm9SZWMsKlhrYkRldmljZUluZm9QdHI7CisKKyNkZWZpbmUJWGtiWElfRGV2SGFzQnRuQWN0cyhkKQkoKChkKS0+bnVtX2J0bnM+MCkmJigoZCktPmJ0bl9hY3RzIT1OVUxMKSkKKyNkZWZpbmUJWGtiWElfTGVnYWxEZXZCdG4oZCxiKQkoWGtiWElfRGV2SGFzQnRuQWN0cyhkKSYmKChiKTwoZCktPm51bV9idG5zKSkKKyNkZWZpbmUJWGtiWElfRGV2SGFzTGVkcyhkKQkoKChkKS0+bnVtX2xlZHM+MCkmJigoZCktPmxlZHMhPU5VTEwpKQorCit0eXBlZGVmIHN0cnVjdCBfWGtiRGV2aWNlTGVkQ2hhbmdlcyB7CisJdW5zaWduZWQgc2hvcnQJCWxlZF9jbGFzczsKKwl1bnNpZ25lZCBzaG9ydAkJbGVkX2lkOworCXVuc2lnbmVkIGludAkJZGVmaW5lZDsgLyogbmFtZXMgb3IgbWFwcyBjaGFuZ2VkICovCisJc3RydWN0IF9Ya2JEZXZpY2VMZWRDaGFuZ2VzICpuZXh0OworfSBYa2JEZXZpY2VMZWRDaGFuZ2VzUmVjLCpYa2JEZXZpY2VMZWRDaGFuZ2VzUHRyOworCit0eXBlZGVmIHN0cnVjdCBfWGtiRGV2aWNlQ2hhbmdlcyB7CisJdW5zaWduZWQgaW50CQljaGFuZ2VkOworCXVuc2lnbmVkIHNob3J0CQlmaXJzdF9idG47CisJdW5zaWduZWQgc2hvcnQJCW51bV9idG5zOworCVhrYkRldmljZUxlZENoYW5nZXNSZWMgCWxlZHM7Cit9IFhrYkRldmljZUNoYW5nZXNSZWMsKlhrYkRldmljZUNoYW5nZXNQdHI7CisKKyNlbmRpZiAvKiBfWEtCU1RSX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hMYnguaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWExieC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOGM4MzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hMYnguaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTIgTmV0d29yayBDb21wdXRpbmcgRGV2aWNlcworICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgTkNELiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAorICogd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTkNELiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlCisgKiBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKKyAqIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIE5DRC4gRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIE5DRC4KKyAqIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiAKKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICovCisgCisjaWZuZGVmIF9YTEJYX0hfCisjZGVmaW5lIF9YTEJYX0hfCisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorI2luY2x1ZGUgPFgxMS9YZGVmcy5oPgorI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvbGJ4Lmg+CisKK19YRlVOQ1BST1RPQkVHSU4KKworQm9vbCBYTGJ4UXVlcnlFeHRlbnNpb24oCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBpbnQqCQkvKiByZXF1ZXN0cCAqLywKKyAgICBpbnQqCQkvKiBldmVudF9iYXNlcCAqLywKKyAgICBpbnQqCQkvKiBlcnJvcl9iYXNlcCAqLworKTsKKworQm9vbCBYTGJ4UXVlcnlWZXJzaW9uKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgaW50KgkJLyogbWFqb3JWZXJzaW9uICovLAorICAgIGludCoJCS8qIG1pbm9yVmVyc2lvbiAqLworKTsKKworaW50IFhMYnhHZXRFdmVudEJhc2UoRGlzcGxheSAqZHB5KTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hTaG0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWFNobS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZjA2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hTaG0uaApAQCAtMCwwICsxLDEzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4OSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRISVMgSVMgTk9UIEFOIFggQ09OU09SVElVTSBTVEFOREFSRCBPUiBBTiBYIFBST0pFQ1QgVEVBTSBTUEVDSUZJQ0FUSU9OICovCisKKyNpZm5kZWYgX1hTSE1fSF8KKyNkZWZpbmUgX1hTSE1fSF8KKworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvc2htLmg+CisKKyNpZm5kZWYgX1hTSE1fU0VSVkVSXwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFNobVNlZzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludAl0eXBlOwkJICAgIC8qIG9mIGV2ZW50ICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7ICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgc2VuZF9ldmVudDsJICAgIC8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb21lIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICpkaXNwbGF5OwkgICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIERyYXdhYmxlIGRyYXdhYmxlOwkgICAgLyogZHJhd2FibGUgb2YgcmVxdWVzdCAqLworICAgIGludCBtYWpvcl9jb2RlOwkgICAgLyogU2htUmVxQ29kZSAqLworICAgIGludCBtaW5vcl9jb2RlOwkgICAgLyogWF9TaG1QdXRJbWFnZSAqLworICAgIFNobVNlZyBzaG1zZWc7CSAgICAvKiB0aGUgU2htU2VnIHVzZWQgaW4gdGhlIHJlcXVlc3QgKi8KKyAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsgICAvKiB0aGUgb2Zmc2V0IGludG8gU2htU2VnIHVzZWQgaW4gdGhlIHJlcXVlc3QgKi8KK30gWFNobUNvbXBsZXRpb25FdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFNobVNlZyBzaG1zZWc7CS8qIHJlc291cmNlIGlkICovCisgICAgaW50IHNobWlkOwkJLyoga2VybmVsIGlkICovCisgICAgY2hhciAqc2htYWRkcjsJLyogYWRkcmVzcyBpbiBjbGllbnQgKi8KKyAgICBCb29sIHJlYWRPbmx5OwkvKiBob3cgdGhlIHNlcnZlciBzaG91bGQgYXR0YWNoIGl0ICovCit9IFhTaG1TZWdtZW50SW5mbzsKKworX1hGVU5DUFJPVE9CRUdJTgorCitCb29sIFhTaG1RdWVyeUV4dGVuc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovCispOworCitpbnQgWFNobUdldEV2ZW50QmFzZSgKKyAgICBEaXNwbGF5KiAJCS8qIGRweSAqLworKTsKKworQm9vbCBYU2htUXVlcnlWZXJzaW9uKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgaW50KgkJLyogbWFqb3JWZXJzaW9uICovLAorICAgIGludCoJCS8qIG1pbm9yVmVyc2lvbiAqLywKKyAgICBCb29sKgkJLyogc2hhcmVkUGl4bWFwcyAqLworKTsKKworaW50IFhTaG1QaXhtYXBGb3JtYXQoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLworKTsKKworQm9vbCBYU2htQXR0YWNoKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgWFNobVNlZ21lbnRJbmZvKgkvKiBzaG1pbmZvICovCispOworCitCb29sIFhTaG1EZXRhY2goCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBYU2htU2VnbWVudEluZm8qCS8qIHNobWluZm8gKi8KKyk7CisKK0Jvb2wgWFNobVB1dEltYWdlKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBYSW1hZ2UqCQkvKiBpbWFnZSAqLywKKyAgICBpbnQJCQkvKiBzcmNfeCAqLywKKyAgICBpbnQJCQkvKiBzcmNfeSAqLywKKyAgICBpbnQJCQkvKiBkc3RfeCAqLywKKyAgICBpbnQJCQkvKiBkc3RfeSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogc3JjX3dpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBzcmNfaGVpZ2h0ICovLAorICAgIEJvb2wJCS8qIHNlbmRfZXZlbnQgKi8KKyk7CisKK0Jvb2wgWFNobUdldEltYWdlKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgWEltYWdlKgkJLyogaW1hZ2UgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogcGxhbmVfbWFzayAqLworKTsKKworWEltYWdlICpYU2htQ3JlYXRlSW1hZ2UoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBWaXN1YWwqCQkvKiB2aXN1YWwgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGRlcHRoICovLAorICAgIGludAkJCS8qIGZvcm1hdCAqLywKKyAgICBjaGFyKgkJLyogZGF0YSAqLywKKyAgICBYU2htU2VnbWVudEluZm8qCS8qIHNobWluZm8gKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8KKyk7CisKK1BpeG1hcCBYU2htQ3JlYXRlUGl4bWFwKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgY2hhcioJCS8qIGRhdGEgKi8sCisgICAgWFNobVNlZ21lbnRJbmZvKgkvKiBzaG1pbmZvICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBkZXB0aCAqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKyNlbmRpZiAvKiBfWFNITV9TRVJWRVJfICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YYWcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGFnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2OWY3OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGFnLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKK0NvcHlyaWdodCAxOTk2LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCitpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKK09SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCitPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbAorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvcgorb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgorZnJvbSBUaGUgT3BlbiBHcm91cC4KKyovCisKKyNpZm5kZWYgX1hBR19IXworI2RlZmluZSBfWEFHX0hfCisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9hZy5oPgorI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworX1hGVU5DUFJPVE9CRUdJTgorCit0eXBlZGVmIFhJRCBYQXBwR3JvdXA7CisKK0Jvb2wgWGFnUXVlcnlWZXJzaW9uKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIGludCoJCQkvKiBtYWpvcl92ZXJzaW9uICovLAorICAgIGludCoJCQkvKiBtaW5vcl92ZXJzaW9uICovCispOworCitTdGF0dXMgWGFnQ3JlYXRlRW1iZWRkZWRBcHBsaWNhdGlvbkdyb3VwKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIFZpc3VhbElECQkJLyogcm9vdF92aXN1YWwgKi8sCisgICAgQ29sb3JtYXAJCQkvKiBkZWZhdWx0X2NvbG9ybWFwICovLAorICAgIHVuc2lnbmVkIGxvbmcJCS8qIGJsYWNrX3BpeGVsICovLAorICAgIHVuc2lnbmVkIGxvbmcJCS8qIHdoaXRlX3BpeGVsICovLAorICAgIFhBcHBHcm91cCoJCQkvKiBhcHBfZ3JvdXBfcmV0dXJuICovCispOworCitTdGF0dXMgWGFnQ3JlYXRlTm9uZW1iZWRkZWRBcHBsaWNhdGlvbkdyb3VwKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIFhBcHBHcm91cCoJCQkvKiBhcHBfZ3JvdXBfcmV0dXJuICovCispOworCitTdGF0dXMgWGFnRGVzdHJveUFwcGxpY2F0aW9uR3JvdXAoCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgWEFwcEdyb3VwCQkJLyogYXBwX2dyb3VwICovCispOworCitTdGF0dXMgWGFnR2V0QXBwbGljYXRpb25Hcm91cEF0dHJpYnV0ZXMoCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgWEFwcEdyb3VwCQkJLyogYXBwX2dyb3VwICovLAorICAgIC4uLgorKTsKKworU3RhdHVzIFhhZ1F1ZXJ5QXBwbGljYXRpb25Hcm91cCgKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBYSUQJCQkJLyogcmVzb3VyY2VfYmFzZSAqLywKKyAgICBYQXBwR3JvdXAqCQkJLyogYXBwX2dyb3VwX3JldCAqLworKTsKKworU3RhdHVzIFhhZ0NyZWF0ZUFzc29jaWF0aW9uKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIFdpbmRvdyoJCQkvKiB3aW5kb3dfcmV0ICovLAorICAgIHZvaWQqCQkJLyogc3lzdGVtX3dpbmRvdyAqLworKTsKKworU3RhdHVzIFhhZ0Rlc3Ryb3lBc3NvY2lhdGlvbigKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBXaW5kb3cJCQkvKiB3aW5kb3cgKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZiAvKiBfWEFHX0hfICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGN1cC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YY3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwNzRjZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGN1cC5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisKK0NvcHlyaWdodCAxOTg3LCAxOTg4LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqLworCisjaWZuZGVmIF9YQ1VQX0hfCisjZGVmaW5lIF9YQ1VQX0hfCisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL2N1cC5oPgorCitfWEZVTkNQUk9UT0JFR0lOCisKK0Jvb2wgWGN1cFF1ZXJ5VmVyc2lvbigKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBpbnQqCQkJLyogbWFqb3JfdmVyc2lvbiAqLywKKyAgICBpbnQqCQkJLyogbWlub3JfdmVyc2lvbiAqLworKTsKKworU3RhdHVzIFhjdXBHZXRSZXNlcnZlZENvbG9ybWFwRW50cmllcygKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBpbnQJCQkJLyogc2NyZWVuICovLAorICAgIFhDb2xvcioqCQkJLyogY29sb3JzX291dCAqLywKKyAgICBpbnQqCQkJLyogbmNvbG9ycyAqLworKTsKKworU3RhdHVzIFhjdXBTdG9yZUNvbG9ycygKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBDb2xvcm1hcAkJCS8qIGNvbG9ybWFwICovLAorICAgIFhDb2xvcioJCQkvKiBjb2xvcnMgKi8sCisgICAgaW50CQkJCS8qIG5jb2xvcnMgKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZiAvKiBfWENVUF9IXyAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hkYmUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGRiZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Y2U1M2QKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hkYmUuaApAQCAtMCwwICsxLDEzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTUgIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIEhFV0xFVFQtUEFDS0FSRCBDT01QQU5ZIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICogCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiB0aGUgSGV3bGV0dC1QYWNrYXJkCisgKiBDb21wYW55IHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZQorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiBhdXRob3JpemF0aW9uIGZyb20gdGhlIEhld2xldHQtUGFja2FyZCBDb21wYW55LgorICogCisgKiAgICAgSGVhZGVyIGZpbGUgZm9yIFhsaWItcmVsYXRlZCBEQkUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgWERCRV9ICisjZGVmaW5lIFhEQkVfSAorCisjaW5jbHVkZSA8WDExL1hmdW5jcHJvdG8uaD4KKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9kYmUuaD4KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBWaXN1YWxJRCAgICB2aXN1YWw7ICAgIC8qIG9uZSB2aXN1YWwgSUQgdGhhdCBzdXBwb3J0cyBkb3VibGUtYnVmZmVyaW5nICovCisgICAgaW50ICAgICAgICAgZGVwdGg7ICAgICAvKiBkZXB0aCBvZiB2aXN1YWwgaW4gYml0cyAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCAgICAgICAgIHBlcmZsZXZlbDsgLyogcGVyZm9ybWFuY2UgbGV2ZWwgb2YgdmlzdWFsICAgICAgICAgICAgICAgICAgKi8KK30KK1hkYmVWaXN1YWxJbmZvOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCAgICAgICAgICAgICAgICAgY291bnQ7ICAgICAgICAgIC8qIG51bWJlciBvZiBpdGVtcyBpbiB2aXN1YWxfZGVwdGggICAqLworICAgIFhkYmVWaXN1YWxJbmZvICAgICAgKnZpc2luZm87ICAgICAgIC8qIGxpc3Qgb2YgdmlzdWFscyAmIGRlcHRocyBmb3Igc2NybiAqLworfQorWGRiZVNjcmVlblZpc3VhbEluZm87CisKKwordHlwZWRlZiBEcmF3YWJsZSBYZGJlQmFja0J1ZmZlcjsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFhkYmVTd2FwQWN0aW9uOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFdpbmRvdwkJc3dhcF93aW5kb3c7ICAgIC8qIHdpbmRvdyBmb3Igd2hpY2ggdG8gc3dhcCBidWZmZXJzICAgKi8KKyAgICBYZGJlU3dhcEFjdGlvbglzd2FwX2FjdGlvbjsgICAgLyogc3dhcCBhY3Rpb24gdG8gdXNlIGZvciBzd2FwX3dpbmRvdyAqLworfQorWGRiZVN3YXBJbmZvOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFdpbmRvdwl3aW5kb3c7CQkJLyogd2luZG93IHRoYXQgYnVmZmVyIGJlbG9uZ3MgdG8gKi8KK30KK1hkYmVCYWNrQnVmZmVyQXR0cmlidXRlczsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQJCQl0eXBlOworICAgIERpc3BsYXkJCSpkaXNwbGF5OwkvKiBkaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgWGRiZUJhY2tCdWZmZXIJYnVmZmVyOwkJLyogcmVzb3VyY2UgaWQgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIGxvbmcJc2VyaWFsOwkJLyogc2VyaWFsIG51bWJlciBvZiBmYWlsZWQgcmVxdWVzdCAqLworICAgIHVuc2lnbmVkIGNoYXIJZXJyb3JfY29kZTsJLyogZXJyb3IgYmFzZSArIFhkYmVCYWRCdWZmZXIgICAgICAqLworICAgIHVuc2lnbmVkIGNoYXIJcmVxdWVzdF9jb2RlOwkvKiBtYWpvciBvcGNvZGUgb2YgZmFpbGVkIHJlcXVlc3QgICovCisgICAgdW5zaWduZWQgY2hhcgltaW5vcl9jb2RlOwkvKiBtaW5vciBvcGNvZGUgb2YgZmFpbGVkIHJlcXVlc3QgICovCit9CitYZGJlQnVmZmVyRXJyb3I7CisKKy8qIF9YRlVOQ1BST1RPQkVHSU4gYW5kIF9YRlVOQ1BST1RPRU5EIGFyZSBkZWZpbmVkIGFzIG5vb3BzCisgKiAoZm9yIG5vbi1DKysgYnVpbGRzKSBpbiBYMTEvWGZ1bmNwcm90by5oLgorICovCitfWEZVTkNQUk9UT0JFR0lOCisKK2V4dGVybiBTdGF0dXMgWGRiZVF1ZXJ5RXh0ZW5zaW9uKAorICAgIERpc3BsYXkqCQkvKiBkcHkgICAgICAgICAgICAgICAgICAqLywKKyAgICBpbnQqCQkvKiBtYWpvcl92ZXJzaW9uX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBtaW5vcl92ZXJzaW9uX3JldHVybiAqLworKTsKKworZXh0ZXJuIFhkYmVCYWNrQnVmZmVyIFhkYmVBbGxvY2F0ZUJhY2tCdWZmZXJOYW1lKAorICAgIERpc3BsYXkqCQkvKiBkcHkgICAgICAgICAqLywKKyAgICBXaW5kb3cJCS8qIHdpbmRvdyAgICAgICovLAorICAgIFhkYmVTd2FwQWN0aW9uCS8qIHN3YXBfYWN0aW9uICovCispOworCitleHRlcm4gU3RhdHVzIFhkYmVEZWFsbG9jYXRlQmFja0J1ZmZlck5hbWUoCisgICAgRGlzcGxheSoJCS8qIGRweSAgICAqLywKKyAgICBYZGJlQmFja0J1ZmZlcgkvKiBidWZmZXIgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGRiZVN3YXBCdWZmZXJzKAorICAgIERpc3BsYXkqCQkvKiBkcHkgICAgICAgICAqLywKKyAgICBYZGJlU3dhcEluZm8qCS8qIHN3YXBfaW5mbyAgICovLAorICAgIGludAkJCS8qIG51bV93aW5kb3dzICovCispOworCitleHRlcm4gU3RhdHVzIFhkYmVCZWdpbklkaW9tKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGRiZUVuZElkaW9tKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8KKyk7CisKK2V4dGVybiBYZGJlU2NyZWVuVmlzdWFsSW5mbyAqWGRiZUdldFZpc3VhbEluZm8oCisgICAgRGlzcGxheSoJCS8qIGRweSAgICAgICAgICAgICAgICovLAorICAgIERyYXdhYmxlKgkJLyogc2NyZWVuX3NwZWNpZmllcnMgKi8sCisgICAgaW50KgkJLyogbnVtX3NjcmVlbnMgICAgICAgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhkYmVGcmVlVmlzdWFsSW5mbygKKyAgICBYZGJlU2NyZWVuVmlzdWFsSW5mbyoJLyogdmlzdWFsX2luZm8gKi8KKyk7CisKK2V4dGVybiBYZGJlQmFja0J1ZmZlckF0dHJpYnV0ZXMgKlhkYmVHZXRCYWNrQnVmZmVyQXR0cmlidXRlcygKKyAgICBEaXNwbGF5KgkJLyogZHB5ICAgICovLAorICAgIFhkYmVCYWNrQnVmZmVyCS8qIGJ1ZmZlciAqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIFhEQkVfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hleHQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ODU5MmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hleHQuaApAQCAtMCwwICsxLDUzIEBACisvKgorICoKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorICovCisKKyNpZm5kZWYgX1hFWFRfSF8KKyNkZWZpbmUgX1hFWFRfSF8KKworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisKK19YRlVOQ1BST1RPQkVHSU4KKwordHlwZWRlZiBpbnQgKCpYZXh0RXJyb3JIYW5kbGVyKSAoCisgICAgRGlzcGxheSAqCQkvKiBkcHkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBleHRfbmFtZSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHJlYXNvbiAqLworKTsKKworZXh0ZXJuIFhleHRFcnJvckhhbmRsZXIgWFNldEV4dGVuc2lvbkVycm9ySGFuZGxlcigKKyAgICBYZXh0RXJyb3JIYW5kbGVyCS8qIGhhbmRsZXIgKi8KKyk7CisKK2V4dGVybiBpbnQgWE1pc3NpbmdFeHRlbnNpb24oCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGV4dF9uYW1lICovCispOworCitfWEZVTkNQUk9UT0VORAorCisjZGVmaW5lIFhfRVhURU5TSU9OX1VOS05PV04gInVua25vd24iCisjZGVmaW5lIFhfRVhURU5TSU9OX01JU1NJTkcgIm1pc3NpbmciCisKKyNlbmRpZiAvKiBfWEVYVF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YZml4ZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGZpeGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM2OWVjYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGZpeGVzLmgKQEAgLTAsMCArMSwzMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAxMSBSZWQgSGF0LCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisvKgorICogQ29weXJpZ2h0IMKpIDIwMDIgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KKyAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAorICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCisgKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX1hGSVhFU19IXworI2RlZmluZSBfWEZJWEVTX0hfCisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy94Zml4ZXN3aXJlLmg+CisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorI2luY2x1ZGUgPFgxMS9YbGliLmg+CisKKy8qCisgKiBUaGlzIHJldmlzaW9uIG51bWJlciBhbHNvIGFwcGVhcnMgaW4gY29uZmlndXJlLmFjLCB0aGV5IGhhdmUKKyAqIHRvIGJlIG1hbnVhbGx5IHN5bmNocm9uaXplZAorICovCisjZGVmaW5lIFhGSVhFU19SRVZJU0lPTgkxCisjZGVmaW5lIFhGSVhFU19WRVJTSU9OCSgoWEZJWEVTX01BSk9SICogMTAwMDApICsgKFhGSVhFU19NSU5PUiAqIDEwMCkgKyAoWEZJWEVTX1JFVklTSU9OKSkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB0eXBlOwkJCS8qIGV2ZW50IGJhc2UgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsKKyAgICBCb29sIHNlbmRfZXZlbnQ7CisgICAgRGlzcGxheSAqZGlzcGxheTsKKyAgICBXaW5kb3cgd2luZG93OworICAgIGludCBzdWJ0eXBlOworICAgIFdpbmRvdyBvd25lcjsKKyAgICBBdG9tIHNlbGVjdGlvbjsKKyAgICBUaW1lIHRpbWVzdGFtcDsKKyAgICBUaW1lIHNlbGVjdGlvbl90aW1lc3RhbXA7Cit9IFhGaXhlc1NlbGVjdGlvbk5vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHR5cGU7CQkJLyogZXZlbnQgYmFzZSAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOworICAgIEJvb2wgc2VuZF9ldmVudDsKKyAgICBEaXNwbGF5ICpkaXNwbGF5OworICAgIFdpbmRvdyB3aW5kb3c7CisgICAgaW50IHN1YnR5cGU7CisgICAgdW5zaWduZWQgbG9uZyBjdXJzb3Jfc2VyaWFsOworICAgIFRpbWUgdGltZXN0YW1wOworICAgIEF0b20gY3Vyc29yX25hbWU7Cit9IFhGaXhlc0N1cnNvck5vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc2hvcnQJICAgIHgsIHk7CisgICAgdW5zaWduZWQgc2hvcnQgIHdpZHRoLCBoZWlnaHQ7CisgICAgdW5zaWduZWQgc2hvcnQgIHhob3QsIHlob3Q7CisgICAgdW5zaWduZWQgbG9uZyAgIGN1cnNvcl9zZXJpYWw7CisgICAgdW5zaWduZWQgbG9uZyAgICpwaXhlbHM7CisjaWYgWEZJWEVTX01BSk9SID49IDIKKyAgICBBdG9tCSAgICBhdG9tOwkJICAgIC8qIFZlcnNpb24gPj0gMiBvbmx5ICovCisgICAgY29uc3QgY2hhcgkgICAgKm5hbWU7CQkgICAgLyogVmVyc2lvbiA+PSAyIG9ubHkgKi8KKyNlbmRpZgorfSBYRml4ZXNDdXJzb3JJbWFnZTsKKworI2lmIFhGSVhFU19NQUpPUiA+PSAyCisvKiBWZXJzaW9uIDIgdHlwZXMgKi8KKwordHlwZWRlZiBYSUQgWHNlcnZlclJlZ2lvbjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHNob3J0CSAgICB4LCB5OworICAgIHVuc2lnbmVkIHNob3J0ICB3aWR0aCwgaGVpZ2h0OworICAgIHVuc2lnbmVkIHNob3J0ICB4aG90LCB5aG90OworICAgIHVuc2lnbmVkIGxvbmcgICBjdXJzb3Jfc2VyaWFsOworICAgIHVuc2lnbmVkIGxvbmcgICAqcGl4ZWxzOworICAgIEF0b20JICAgIGF0b207CisgICAgY29uc3QgY2hhcgkgICAgKm5hbWU7Cit9IFhGaXhlc0N1cnNvckltYWdlQW5kTmFtZTsKKworI2VuZGlmCisKK19YRlVOQ1BST1RPQkVHSU4KKworQm9vbCBYRml4ZXNRdWVyeUV4dGVuc2lvbiAoRGlzcGxheSAqZHB5LAorCQkJICAgIGludCAqZXZlbnRfYmFzZV9yZXR1cm4sCisJCQkgICAgaW50ICplcnJvcl9iYXNlX3JldHVybik7CitTdGF0dXMgWEZpeGVzUXVlcnlWZXJzaW9uIChEaXNwbGF5ICpkcHksCisJCQkgICAgaW50ICAgICAqbWFqb3JfdmVyc2lvbl9yZXR1cm4sCisJCQkgICAgaW50ICAgICAqbWlub3JfdmVyc2lvbl9yZXR1cm4pOworCitpbnQgWEZpeGVzVmVyc2lvbiAodm9pZCk7CisKK3ZvaWQKK1hGaXhlc0NoYW5nZVNhdmVTZXQgKERpc3BsYXkJKmRweSwKKwkJICAgICBXaW5kb3cJd2luLAorCQkgICAgIGludAltb2RlLAorCQkgICAgIGludAl0YXJnZXQsCisJCSAgICAgaW50CW1hcCk7CisKK3ZvaWQKK1hGaXhlc1NlbGVjdFNlbGVjdGlvbklucHV0IChEaXNwbGF5CSAgICAqZHB5LAorCQkJICAgIFdpbmRvdwkgICAgd2luLAorCQkJICAgIEF0b20JICAgIHNlbGVjdGlvbiwgCisJCQkgICAgdW5zaWduZWQgbG9uZyAgIGV2ZW50TWFzayk7CisKK3ZvaWQKK1hGaXhlc1NlbGVjdEN1cnNvcklucHV0IChEaXNwbGF5CSpkcHksCisJCQkgV2luZG93CQl3aW4sCisJCQkgdW5zaWduZWQgbG9uZwlldmVudE1hc2spOworCitYRml4ZXNDdXJzb3JJbWFnZSAqCitYRml4ZXNHZXRDdXJzb3JJbWFnZSAoRGlzcGxheSAqZHB5KTsKKworI2lmIFhGSVhFU19NQUpPUiA+PSAyCisvKiBWZXJzaW9uIDIgZnVuY3Rpb25zICovCisKK1hzZXJ2ZXJSZWdpb24KK1hGaXhlc0NyZWF0ZVJlZ2lvbiAoRGlzcGxheSAqZHB5LCBYUmVjdGFuZ2xlICpyZWN0YW5nbGVzLCBpbnQgbnJlY3RhbmdsZXMpOworCitYc2VydmVyUmVnaW9uCitYRml4ZXNDcmVhdGVSZWdpb25Gcm9tQml0bWFwIChEaXNwbGF5ICpkcHksIFBpeG1hcCBiaXRtYXApOworCitYc2VydmVyUmVnaW9uCitYRml4ZXNDcmVhdGVSZWdpb25Gcm9tV2luZG93IChEaXNwbGF5ICpkcHksIFdpbmRvdyB3aW5kb3csIGludCBraW5kKTsKKworWHNlcnZlclJlZ2lvbgorWEZpeGVzQ3JlYXRlUmVnaW9uRnJvbUdDIChEaXNwbGF5ICpkcHksIEdDIGdjKTsKKworWHNlcnZlclJlZ2lvbgorWEZpeGVzQ3JlYXRlUmVnaW9uRnJvbVBpY3R1cmUgKERpc3BsYXkgKmRweSwgWElEIHBpY3R1cmUpOworCit2b2lkCitYRml4ZXNEZXN0cm95UmVnaW9uIChEaXNwbGF5ICpkcHksIFhzZXJ2ZXJSZWdpb24gcmVnaW9uKTsKKwordm9pZAorWEZpeGVzU2V0UmVnaW9uIChEaXNwbGF5ICpkcHksIFhzZXJ2ZXJSZWdpb24gcmVnaW9uLAorCQkgWFJlY3RhbmdsZSAqcmVjdGFuZ2xlcywgaW50IG5yZWN0YW5nbGVzKTsKKwordm9pZAorWEZpeGVzQ29weVJlZ2lvbiAoRGlzcGxheSAqZHB5LCBYc2VydmVyUmVnaW9uIGRzdCwgWHNlcnZlclJlZ2lvbiBzcmMpOworCit2b2lkCitYRml4ZXNVbmlvblJlZ2lvbiAoRGlzcGxheSAqZHB5LCBYc2VydmVyUmVnaW9uIGRzdCwKKwkJICAgWHNlcnZlclJlZ2lvbiBzcmMxLCBYc2VydmVyUmVnaW9uIHNyYzIpOworCit2b2lkCitYRml4ZXNJbnRlcnNlY3RSZWdpb24gKERpc3BsYXkgKmRweSwgWHNlcnZlclJlZ2lvbiBkc3QsCisJCSAgICAgICBYc2VydmVyUmVnaW9uIHNyYzEsIFhzZXJ2ZXJSZWdpb24gc3JjMik7CisKK3ZvaWQKK1hGaXhlc1N1YnRyYWN0UmVnaW9uIChEaXNwbGF5ICpkcHksIFhzZXJ2ZXJSZWdpb24gZHN0LAorCQkgICAgICBYc2VydmVyUmVnaW9uIHNyYzEsIFhzZXJ2ZXJSZWdpb24gc3JjMik7CisKK3ZvaWQKK1hGaXhlc0ludmVydFJlZ2lvbiAoRGlzcGxheSAqZHB5LCBYc2VydmVyUmVnaW9uIGRzdCwKKwkJICAgIFhSZWN0YW5nbGUgKnJlY3QsIFhzZXJ2ZXJSZWdpb24gc3JjKTsKKwordm9pZAorWEZpeGVzVHJhbnNsYXRlUmVnaW9uIChEaXNwbGF5ICpkcHksIFhzZXJ2ZXJSZWdpb24gcmVnaW9uLCBpbnQgZHgsIGludCBkeSk7CisKK3ZvaWQKK1hGaXhlc1JlZ2lvbkV4dGVudHMgKERpc3BsYXkgKmRweSwgWHNlcnZlclJlZ2lvbiBkc3QsIFhzZXJ2ZXJSZWdpb24gc3JjKTsKKworWFJlY3RhbmdsZSAqCitYRml4ZXNGZXRjaFJlZ2lvbiAoRGlzcGxheSAqZHB5LCBYc2VydmVyUmVnaW9uIHJlZ2lvbiwgaW50ICpucmVjdGFuZ2xlc1JldCk7CisKK1hSZWN0YW5nbGUgKgorWEZpeGVzRmV0Y2hSZWdpb25BbmRCb3VuZHMgKERpc3BsYXkgKmRweSwgWHNlcnZlclJlZ2lvbiByZWdpb24sIAorCQkJICAgIGludCAqbnJlY3RhbmdsZXNSZXQsCisJCQkgICAgWFJlY3RhbmdsZSAqYm91bmRzKTsKKwordm9pZAorWEZpeGVzU2V0R0NDbGlwUmVnaW9uIChEaXNwbGF5ICpkcHksIEdDIGdjLCAKKwkJICAgICAgIGludCBjbGlwX3hfb3JpZ2luLCBpbnQgY2xpcF95X29yaWdpbiwKKwkJICAgICAgIFhzZXJ2ZXJSZWdpb24gcmVnaW9uKTsKKwordm9pZAorWEZpeGVzU2V0V2luZG93U2hhcGVSZWdpb24gKERpc3BsYXkgKmRweSwgV2luZG93IHdpbiwgaW50IHNoYXBlX2tpbmQsCisJCQkgICAgaW50IHhfb2ZmLCBpbnQgeV9vZmYsIFhzZXJ2ZXJSZWdpb24gcmVnaW9uKTsKKwordm9pZAorWEZpeGVzU2V0UGljdHVyZUNsaXBSZWdpb24gKERpc3BsYXkgKmRweSwgWElEIHBpY3R1cmUsCisJCQkgICAgaW50IGNsaXBfeF9vcmlnaW4sIGludCBjbGlwX3lfb3JpZ2luLAorCQkJICAgIFhzZXJ2ZXJSZWdpb24gcmVnaW9uKTsKKwordm9pZAorWEZpeGVzU2V0Q3Vyc29yTmFtZSAoRGlzcGxheSAqZHB5LCBDdXJzb3IgY3Vyc29yLCBjb25zdCBjaGFyICpuYW1lKTsKKworY29uc3QgY2hhciAqCitYRml4ZXNHZXRDdXJzb3JOYW1lIChEaXNwbGF5ICpkcHksIEN1cnNvciBjdXJzb3IsIEF0b20gKmF0b20pOworCit2b2lkCitYRml4ZXNDaGFuZ2VDdXJzb3IgKERpc3BsYXkgKmRweSwgQ3Vyc29yIHNvdXJjZSwgQ3Vyc29yIGRlc3RpbmF0aW9uKTsKKwordm9pZAorWEZpeGVzQ2hhbmdlQ3Vyc29yQnlOYW1lIChEaXNwbGF5ICpkcHksIEN1cnNvciBzb3VyY2UsIGNvbnN0IGNoYXIgKm5hbWUpOworCisjZW5kaWYJLyogWEZJWEVTX01BSk9SID49IDIgKi8KKworI2lmIFhGSVhFU19NQUpPUiA+PSAzCisKK3ZvaWQKK1hGaXhlc0V4cGFuZFJlZ2lvbiAoRGlzcGxheSAqZHB5LCBYc2VydmVyUmVnaW9uIGRzdCwgWHNlcnZlclJlZ2lvbiBzcmMsCisJCSAgICB1bnNpZ25lZCBsZWZ0LCB1bnNpZ25lZCByaWdodCwKKwkJICAgIHVuc2lnbmVkIHRvcCwgdW5zaWduZWQgYm90dG9tKTsKKworI2VuZGlmCS8qIFhGSVhFU19NQUpPUiA+PSAzICovCisKKyNpZiBYRklYRVNfTUFKT1IgPj0gNAorLyogVmVyc2lvbiA0LjAgZXh0ZXJucyAqLworCit2b2lkCitYRml4ZXNIaWRlQ3Vyc29yIChEaXNwbGF5ICpkcHksIFdpbmRvdyB3aW4pOworCit2b2lkCitYRml4ZXNTaG93Q3Vyc29yIChEaXNwbGF5ICpkcHksIFdpbmRvdyB3aW4pOworCisjZW5kaWYgLyogWEZJWEVTX01BSk9SID49IDQgKi8KKworI2lmIFhGSVhFU19NQUpPUiA+PSA1CisKK3R5cGVkZWYgWElEIFBvaW50ZXJCYXJyaWVyOworCitQb2ludGVyQmFycmllcgorWEZpeGVzQ3JlYXRlUG9pbnRlckJhcnJpZXIoRGlzcGxheSAqZHB5LCBXaW5kb3cgdywgaW50IHgxLCBpbnQgeTEsCisJCQkgICBpbnQgeDIsIGludCB5MiwgaW50IGRpcmVjdGlvbnMsCisJCQkgICBpbnQgbnVtX2RldmljZXMsIGludCAqZGV2aWNlcyk7CisKK1BvaW50ZXJCYXJyaWVyCitYRml4ZXNDcmVhdGVQb2ludGVyQmFycmllclZlbG9jaXR5KERpc3BsYXkgKmRweSwgV2luZG93IHcsIGludCB4MSwgaW50IHkxLAorCQkJICAgaW50IHgyLCBpbnQgeTIsIGludCBkaXJlY3Rpb25zLCBpbnQgdmVsb2NpdHksCisJCQkgICBpbnQgbnVtX2RldmljZXMsIGludCAqZGV2aWNlcyk7CisKK3ZvaWQKK1hGaXhlc0Rlc3Ryb3lQb2ludGVyQmFycmllcihEaXNwbGF5ICpkcHksIFBvaW50ZXJCYXJyaWVyIGIpOworCisjZW5kaWYgLyogWEZJWEVTX01BSk9SID49IDUgKi8KKworI2lmIFhGSVhFU19NQUpPUiA+PSA2CisKK3R5cGVkZWYgaW50MzJfdCBCYXJyaWVyRXZlbnRJRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB0eXBlOwkJCS8qIGV2ZW50IGJhc2UgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsKKyAgICBCb29sIHNlbmRfZXZlbnQ7CisgICAgRGlzcGxheSAqZGlzcGxheTsKKyAgICBXaW5kb3cgd2luZG93OworICAgIGludCBzdWJ0eXBlOworICAgIEJhcnJpZXJFdmVudElEIGV2ZW50X2lkOworICAgIGludCBkaXJlY3Rpb25zOworICAgIFBvaW50ZXJCYXJyaWVyIGJhcnJpZXI7CisgICAgaW50IHg7CisgICAgaW50IHk7CisgICAgaW50IHZlbG9jaXR5OworICAgIFRpbWUgdGltZXN0YW1wOworfSBYRml4ZXNCYXJyaWVyTm90aWZ5RXZlbnQ7CisKK3ZvaWQKK1hGaXhlc1NlbGVjdEJhcnJpZXJJbnB1dCAoRGlzcGxheQkqZHB5LAorCQkJIFdpbmRvdwkJd2luLAorCQkJIHVuc2lnbmVkIGxvbmcJZXZlbnRNYXNrKTsKKwordm9pZAorWEZpeGVzQmFycmllclJlbGVhc2VQb2ludGVyKERpc3BsYXkgKmRweSwKKwkJCSAgICBQb2ludGVyQmFycmllciBiLAorCQkJICAgIEJhcnJpZXJFdmVudElEIGV2ZW50X2lkKTsKKworI2VuZGlmCisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZiAvKiBfWEZJWEVTX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hnZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTM4MmZmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YZ2UuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IKkgMjAwNy0yMDA4IFBldGVyIEh1dHRlcmVyCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IFBldGVyIEh1dHRlcmVyLCBVbml2ZXJzaXR5IG9mIFNvdXRoIEF1c3RyYWxpYSwgTklDVEEKKyAqCisgKi8KKworCisvKiBYR0UgQ2xpZW50IGludGVyZmFjZXMgKi8KKworI2lmbmRlZiBfWEdFX0hfCisjZGVmaW5lIF9YR0VfSF8KKworI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8WDExL1hmdW5jcHJvdG8uaD4KKworX1hGVU5DUFJPVE9CRUdJTgorCisvKioKKyAqIEdlbmVyaWMgRXZlbnQgbWFzay4gCisgKiBUbyBiZSB1c2VkIHdoZW5ldmVyIGEgbGlzdCBvZiBtYXNrcyBwZXIgZXh0ZW5zaW9uIGhhcyB0byBiZSBwcm92aWRlZC4KKyAqCisgKiBCdXQsIGRvbid0IGFjdHVhbGx5IHVzZSB0aGUgQ0FSRHs4LDE2LDMyfSB0eXBlcy4gIFdlIGNhbid0IGdldCB0aGVtIHRoZW0KKyAqIGRlZmluZWQgaGVyZSB3aXRob3V0IHBvbGx1dGluZyB0aGUgbmFtZXNwYWNlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciAgICAgICBleHRlbnNpb247CisgICAgdW5zaWduZWQgY2hhciAgICAgICBwYWQwOworICAgIHVuc2lnbmVkIHNob3J0ICAgICAgcGFkMTsKKyAgICB1bnNpZ25lZCBpbnQgICAgICBldm1hc2s7Cit9IFhHZW5lcmljRXZlbnRNYXNrOworCitCb29sIFhHRVF1ZXJ5RXh0ZW5zaW9uKERpc3BsYXkqIGRweSwgaW50ICpldmVudF9iYXNlcCwgaW50ICplcnJfYmFzZXApOworQm9vbCBYR0VRdWVyeVZlcnNpb24oRGlzcGxheSogZHB5LCBpbnQgKm1ham9yLCBpbnQqIG1pbm9yKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9YR0VfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvYWcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvYWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTU4ODNhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9hZy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCitDb3B5cmlnaHQgMTk5NiwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCitPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCitBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKK09USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwKK25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3IKK290aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KK2Zyb20gVGhlIE9wZW4gR3JvdXAuCisqLworCisjaWZuZGVmIF9BR19IXworI2RlZmluZSBfQUdfSF8KKworI2RlZmluZSBYQUdOQU1FICJYQy1BUFBHUk9VUCIKKworI2RlZmluZSBYQUdfTUFKT1JfVkVSU0lPTgkxCS8qIGN1cnJlbnQgdmVyc2lvbiBudW1iZXJzICovCisjZGVmaW5lIFhBR19NSU5PUl9WRVJTSU9OCTAKKworI2RlZmluZSBYYWdXaW5kb3dUeXBlWDExCTAKKyNkZWZpbmUgWGFnV2luZG93VHlwZU1hY2ludG9zaAkxCisjZGVmaW5lIFhhZ1dpbmRvd1R5cGVXaW4zMgkyCisjZGVmaW5lIFhhZ1dpbmRvd1R5cGVXaW4xNgkzCisKKyNkZWZpbmUgWGFnQmFkQXBwR3JvdXAJCQkwCisjZGVmaW5lIFhhZ051bWJlckVycm9ycwkJCShYYWdCYWRBcHBHcm91cCArIDEpCisKKyNkZWZpbmUgWGFnTnNpbmdsZVNjcmVlbgkJNworI2RlZmluZSBYYWdOZGVmYXVsdFJvb3QJCQkxCisjZGVmaW5lIFhhZ05yb290VmlzdWFsCQkJMgorI2RlZmluZSBYYWdOZGVmYXVsdENvbG9ybWFwCQkzCisjZGVmaW5lIFhhZ05ibGFja1BpeGVsCQkJNAorI2RlZmluZSBYYWdOd2hpdGVQaXhlbAkJCTUKKyNkZWZpbmUgWGFnTmFwcEdyb3VwTGVhZGVyCQk2CisKKyNlbmRpZiAvKiBfQUdfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9hZ3Byb3RvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2FncHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDg2NjYxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9hZ3Byb3RvLmgKQEAgLTAsMCArMSwxNzggQEAKKy8qCitDb3B5cmlnaHQgMTk5NiwgMTk5OCwgMjAwMSAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCitPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCitBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKK09USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwKK25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3IKK290aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KK2Zyb20gVGhlIE9wZW4gR3JvdXAuCisqLworCisjaWZuZGVmIF9BR1BST1RPX0hfIC8qIHsgKi8KKyNkZWZpbmUgX0FHUFJPVE9fSF8KKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL2FnLmg+CisKKyNkZWZpbmUgWF9YYWdRdWVyeVZlcnNpb24JCTAKKyNkZWZpbmUgWF9YYWdDcmVhdGUJCQkxCisjZGVmaW5lIFhfWGFnRGVzdHJveQkJCTIKKyNkZWZpbmUgWF9YYWdHZXRBdHRyCQkJMworI2RlZmluZSBYX1hhZ1F1ZXJ5CQkJNAorI2RlZmluZSBYX1hhZ0NyZWF0ZUFzc29jCQk1CisjZGVmaW5lIFhfWGFnRGVzdHJveUFzc29jCQk2CisKKyNkZWZpbmUgWEFwcEdyb3VwIENBUkQzMgorCisvKgorKiBSZWRlZmluZSBzb21lIGJhc2ljIHR5cGVzIHVzZWQgYnkgc3RydWN0dXJlcyBkZWZpbmVkIGhlcmVpbi4gIFRoaXMgYWxsb3dzCisqIGJvdGggdGhlIGxpYnJhcnkgYW5kIHNlcnZlciB0byB2aWV3IGNvbW11bmljYXRlZCBkYXRhIGFzIDMyLWJpdCBlbnRpdGllcywKKyogdGh1cyBwcmV2ZW50aW5nIHByb2JsZW1zIG9uIDY0LWJpdCBhcmNoaXRlY3R1cmVzIHdoZXJlIGxpYlhleHQgc2VlcyB0aGlzCisqIGRhdGEgYXMgNjQgYml0cyBhbmQgdGhlIHNlcnZlciBzZWVzIGl0IGFzIDMyIGJpdHMuCisqLworCisjZGVmaW5lIENvbG9ybWFwIENBUkQzMgorI2RlZmluZSBWaXN1YWxJRCBDQVJEMzIKKyNkZWZpbmUgV2luZG93IENBUkQzMgorCit0eXBlZGVmIHN0cnVjdCBfWGFnUXVlcnlWZXJzaW9uIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgWGFnUmVxQ29kZSAqLworICAgIENBUkQ4CXhhZ1JlcVR5cGU7CS8qIGFsd2F5cyBYX1hhZ1F1ZXJ5VmVyc2lvbiAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNgljbGllbnRfbWFqb3JfdmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2CWNsaWVudF9taW5vcl92ZXJzaW9uIEIxNjsKK30geFhhZ1F1ZXJ5VmVyc2lvblJlcTsKKyNkZWZpbmUgc3pfeFhhZ1F1ZXJ5VmVyc2lvblJlcQkJOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJLyogWF9SZXBseSAqLworICAgIEJPT0wJcGFkMTsKKyAgICBDQVJEMTYJc2VxdWVuY2VfbnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYJc2VydmVyX21ham9yX3ZlcnNpb24gQjE2OworICAgIENBUkQxNglzZXJ2ZXJfbWlub3JfdmVyc2lvbiBCMTY7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKK30geFhhZ1F1ZXJ5VmVyc2lvblJlcGx5OworI2RlZmluZSBzel94WGFnUXVlcnlWZXJzaW9uUmVwbHkJMzIKKworLyogU2V0IEFwcEdyb3VwIEF0dHJpYnV0ZXMgbWFza3MgKi8KKyNkZWZpbmUgWGFnU2luZ2xlU2NyZWVuTWFzawkJMSA8PCAwCisjZGVmaW5lIFhhZ0RlZmF1bHRSb290TWFzawkJMSA8PCBYYWdOZGVmYXVsdFJvb3QKKyNkZWZpbmUgWGFnUm9vdFZpc3VhbE1hc2sJCTEgPDwgWGFnTnJvb3RWaXN1YWwKKyNkZWZpbmUgWGFnRGVmYXVsdENvbG9ybWFwTWFzawkJMSA8PCBYYWdOZGVmYXVsdENvbG9ybWFwCisjZGVmaW5lIFhhZ0JsYWNrUGl4ZWxNYXNrCQkxIDw8IFhhZ05ibGFja1BpeGVsCisjZGVmaW5lIFhhZ1doaXRlUGl4ZWxNYXNrCQkxIDw8IFhhZ053aGl0ZVBpeGVsCisjZGVmaW5lIFhhZ0FwcEdyb3VwTGVhZGVyTWFzawkJMSA8PCBYYWdOYXBwR3JvdXBMZWFkZXIKKwordHlwZWRlZiBzdHJ1Y3QgX1hhZ0NyZWF0ZSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFhhZ1JlcUNvZGUgKi8KKyAgICBDQVJEOAl4YWdSZXFUeXBlOwkvKiBhbHdheXMgWF9YYWdDcmVhdGUgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBYQXBwR3JvdXAJYXBwX2dyb3VwIEIzMjsKKyAgICBDQVJEMzIJYXR0cmliX21hc2sgQjMyOyAvKiBMSVNUb2ZWQUxVRSBmb2xsb3dzICovCit9IHhYYWdDcmVhdGVSZXE7CisjZGVmaW5lIHN6X3hYYWdDcmVhdGVSZXEJCTEyCisKK3R5cGVkZWYgc3RydWN0IF9YYWdEZXN0cm95IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgWGFnUmVxQ29kZSAqLworICAgIENBUkQ4CXhhZ1JlcVR5cGU7CS8qIGFsd2F5cyBYX1hhZ0Rlc3Ryb3kgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBYQXBwR3JvdXAJYXBwX2dyb3VwICBCMzI7Cit9IHhYYWdEZXN0cm95UmVxOworI2RlZmluZSBzel94WGFnRGVzdHJveVJlcQkJOAorCit0eXBlZGVmIHN0cnVjdCBfWGFnR2V0QXR0ciB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFhhZ1JlcUNvZGUgKi8KKyAgICBDQVJEOAl4YWdSZXFUeXBlOwkvKiBhbHdheXMgWF9YYWdHZXRBdHRyICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgWEFwcEdyb3VwCWFwcF9ncm91cCBCMzI7Cit9IHhYYWdHZXRBdHRyUmVxOworI2RlZmluZSBzel94WGFnR2V0QXR0clJlcQkJOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJLyogWF9SZXBseSAqLworICAgIEJPT0wJcGFkMTsKKyAgICBDQVJEMTYJc2VxdWVuY2VfbnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBXaW5kb3cJZGVmYXVsdF9yb290IEIzMjsKKyAgICBWaXN1YWxJRAlyb290X3Zpc3VhbCBCMzI7CisgICAgQ29sb3JtYXAJZGVmYXVsdF9jb2xvcm1hcCBCMzI7CisgICAgQ0FSRDMyCWJsYWNrX3BpeGVsIEIzMjsKKyAgICBDQVJEMzIJd2hpdGVfcGl4ZWwgQjMyOworICAgIEJPT0wJc2luZ2xlX3NjcmVlbjsKKyAgICBCT09MCWFwcF9ncm91cF9sZWFkZXI7CisgICAgQ0FSRDE2CXBhZDIgQjE2OworfSB4WGFnR2V0QXR0clJlcGx5OworI2RlZmluZSBzel94WGFnR2V0QXR0clJlcGx5CQkzMgorCit0eXBlZGVmIHN0cnVjdCBfWGFnUXVlcnkgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBYYWdSZXFDb2RlICovCisgICAgQ0FSRDgJeGFnUmVxVHlwZTsJLyogYWx3YXlzIFhfWGFnUXVlcnkgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJcmVzb3VyY2UgQjMyOworfSB4WGFnUXVlcnlSZXE7CisjZGVmaW5lIHN6X3hYYWdRdWVyeVJlcQkJCTgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCS8qIFhfUmVwbHkgKi8KKyAgICBCT09MCXBhZDE7CisgICAgQ0FSRDE2CXNlcXVlbmNlX251bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgWEFwcEdyb3VwCWFwcF9ncm91cCBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKK30geFhhZ1F1ZXJ5UmVwbHk7CisjZGVmaW5lIHN6X3hYYWdRdWVyeVJlcGx5CQkzMgorCit0eXBlZGVmIHN0cnVjdCBfWGFnQ3JlYXRlQXNzb2MgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBYYWdSZXFDb2RlICovCisgICAgQ0FSRDgJeGFnUmVxVHlwZTsJLyogYWx3YXlzIFhfWGFnQ3JlYXRlQXNzb2MgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cJd2luZG93IEIzMjsKKyAgICBDQVJEMTYJd2luZG93X3R5cGUgQjE2OworICAgIENBUkQxNglzeXN0ZW1fd2luZG93X2xlbiBCMTY7IC8qIExJU1RvZkNBUkQ4IGZvbGxvd3MgKi8KK30geFhhZ0NyZWF0ZUFzc29jUmVxOworI2RlZmluZSBzel94WGFnQ3JlYXRlQXNzb2NSZXEJCTEyCisKK3R5cGVkZWYgc3RydWN0IF9YYWdEZXN0cm95QXNzb2MgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBYYWdSZXFDb2RlICovCisgICAgQ0FSRDgJeGFnUmVxVHlwZTsJLyogYWx3YXlzIFhfWGFnRGVzdHJveUFzc29jICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgV2luZG93CXdpbmRvdyBCMzI7Cit9IHhYYWdEZXN0cm95QXNzb2NSZXE7CisjZGVmaW5lIHN6X3hYYWdEZXN0cm95QXNzb2NSZXEJCTgKKworI3VuZGVmIFhBcHBHcm91cAorLyoKKyAqIENhbmNlbCB0aGUgcHJldmlvdXMgcmVkZWZpbml0aW9uIG9mIHRoZSBiYXNpYyB0eXBlcywgdGh1cyByZXN0b3JpbmcgdGhlaXIKKyAqIFguaCBkZWZpbml0aW9ucy4KKyAqLworCisjdW5kZWYgV2luZG93CisjdW5kZWYgQ29sb3JtYXAKKyN1bmRlZiBWaXN1YWxJRAorCisjZW5kaWYgLyogfSBfQUdQUk9UT19IXyAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2N1cC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9jdXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmJjMzRiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9jdXAuaApAQCAtMCwwICsxLDM4IEBACisvKgorCitDb3B5cmlnaHQgMTk4NywgMTk4OCwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKi8KKworI2lmbmRlZiBfQ1VQX0hfCisjZGVmaW5lIF9DVVBfSF8KKworI2RlZmluZSBYQ1VQTkFNRSAiVE9HLUNVUCIKKworI2RlZmluZSBYQ1VQX01BSk9SX1ZFUlNJT04JMQkvKiBjdXJyZW50IHZlcnNpb24gbnVtYmVycyAqLworI2RlZmluZSBYQ1VQX01JTk9SX1ZFUlNJT04JMAorCisjZGVmaW5lIFhjdXBOdW1iZXJFcnJvcnMJCQkwCisKKyNlbmRpZiAvKiBfQ1VQX0hfICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvY3VwcHJvdG8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvY3VwcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjFjOWYwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9jdXBwcm90by5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorCitDb3B5cmlnaHQgMTk4NywgMTk4OCwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKi8KKworI2lmbmRlZiBfWENVUFBST1RPX0hfIC8qIHsgKi8KKyNkZWZpbmUgX1hDVVBQUk9UT19IXworCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvY3VwLmg+CisKKyNkZWZpbmUgWF9YY3VwUXVlcnlWZXJzaW9uCQkJMAorI2RlZmluZSBYX1hjdXBHZXRSZXNlcnZlZENvbG9ybWFwRW50cmllcwkxCisjZGVmaW5lIFhfWGN1cFN0b3JlQ29sb3JzCQkJMgorCit0eXBlZGVmIHN0cnVjdCBfWGN1cFF1ZXJ5VmVyc2lvbiB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFhjdXBSZXFDb2RlICovCisgICAgQ0FSRDgJeGN1cFJlcVR5cGU7CS8qIGFsd2F5cyBYX1hjdXBRdWVyeVZlcnNpb24gKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJY2xpZW50X21ham9yX3ZlcnNpb24gQjE2OworICAgIENBUkQxNgljbGllbnRfbWlub3JfdmVyc2lvbiBCMTY7Cit9IHhYY3VwUXVlcnlWZXJzaW9uUmVxOworI2RlZmluZSBzel94WGN1cFF1ZXJ5VmVyc2lvblJlcQkJOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJLyogWF9SZXBseSAqLworICAgIEJPT0wJcGFkMTsKKyAgICBDQVJEMTYJc2VxdWVuY2VfbnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYJc2VydmVyX21ham9yX3ZlcnNpb24gQjE2OworICAgIENBUkQxNglzZXJ2ZXJfbWlub3JfdmVyc2lvbiBCMTY7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKK30geFhjdXBRdWVyeVZlcnNpb25SZXBseTsKKyNkZWZpbmUgc3pfeFhjdXBRdWVyeVZlcnNpb25SZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfWGN1cEdldFJlc2VydmVkQ29sb3JtYXBFbnRyaWVzIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgWGN1cFJlcUNvZGUgKi8KKyAgICBDQVJEOAl4Y3VwUmVxVHlwZTsJLyogYWx3YXlzIFhfWGN1cEdldFJlc2VydmVkQ29sb3JtYXBFbnRyaWVzICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDMyCXNjcmVlbiBCMzI7Cit9IHhYY3VwR2V0UmVzZXJ2ZWRDb2xvcm1hcEVudHJpZXNSZXE7CisjZGVmaW5lIHN6X3hYY3VwR2V0UmVzZXJ2ZWRDb2xvcm1hcEVudHJpZXNSZXEgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJLyogWF9SZXBseSAqLworICAgIEJPT0wJcGFkMTsKKyAgICBDQVJEMTYJc2VxdWVuY2VfbnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7CisgICAgQ0FSRDMyCXBhZDYgQjMyOworICAgIENBUkQzMglwYWQ3IEIzMjsKK30geFhjdXBHZXRSZXNlcnZlZENvbG9ybWFwRW50cmllc1JlcGx5OworI2RlZmluZSBzel94WGN1cEdldFJlc2VydmVkQ29sb3JtYXBFbnRyaWVzUmVwbHkJCTMyCisKK3R5cGVkZWYgc3RydWN0IF9YY3VwU3RvcmVDb2xvcnMgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBYY3VwUmVxQ29kZSAqLworICAgIENBUkQ4CXhjdXBSZXFUeXBlOwkvKiBhbHdheXMgWF9YY3VwU3RvcmVDb2xvcnMgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJY21hcCBCMzI7Cit9IHhYY3VwU3RvcmVDb2xvcnNSZXE7CisjZGVmaW5lIHN6X3hYY3VwU3RvcmVDb2xvcnNSZXEJCTgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCS8qIFhfUmVwbHkgKi8KKyAgICBCT09MCXBhZDE7CisgICAgQ0FSRDE2CXNlcXVlbmNlX251bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKKyAgICBDQVJEMzIJcGFkNyBCMzI7Cit9IHhYY3VwU3RvcmVDb2xvcnNSZXBseTsKKyNkZWZpbmUgc3pfeFhjdXBTdG9yZUNvbG9yc1JlcGx5CTMyCisKKyNlbmRpZiAvKiB9IF9YQ1VQUFJPVE9fSF8gKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9kYmUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZGJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2ODU1MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZGJlLmgKQEAgLTAsMCArMSw1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIEhFV0xFVFQtUEFDS0FSRCBDT01QQU5ZIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIHRoZSBIZXdsZXR0LVBhY2thcmQKKyAqIENvbXBhbnkgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqIGF1dGhvcml6YXRpb24gZnJvbSB0aGUgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkuCisgKgorICogICAgIEhlYWRlciBmaWxlIGZvciBYbGliLXJlbGF0ZWQgREJFCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIERCRV9ICisjZGVmaW5lIERCRV9ICisKKy8qIFZhbHVlcyBmb3Igc3dhcF9hY3Rpb24gZmllbGQgb2YgWGRiZVN3YXBJbmZvIHN0cnVjdHVyZSAqLworI2RlZmluZSBYZGJlVW5kZWZpbmVkICAgIDAKKyNkZWZpbmUgWGRiZUJhY2tncm91bmQgICAxCisjZGVmaW5lIFhkYmVVbnRvdWNoZWQgICAgMgorI2RlZmluZSBYZGJlQ29waWVkICAgICAgIDMKKworLyogRXJyb3JzICovCisjZGVmaW5lIFhkYmVCYWRCdWZmZXIgICAgMAorCisjZGVmaW5lIERCRV9QUk9UT0NPTF9OQU1FICJET1VCTEUtQlVGRkVSIgorCisvKiBDdXJyZW50IHZlcnNpb24gbnVtYmVycyAqLworI2RlZmluZSBEQkVfTUFKT1JfVkVSU0lPTiAgICAgICAxCisjZGVmaW5lIERCRV9NSU5PUl9WRVJTSU9OICAgICAgIDAKKworLyogVXNlZCB3aGVuIGFkZGluZyBleHRlbnNpb247IGFsc28gdXNlZCBpbiBYZGJlIG1hY3JvcyAqLworI2RlZmluZSBEYmVOdW1iZXJFdmVudHMJCQkwCisjZGVmaW5lIERiZUJhZEJ1ZmZlcgkJCTAKKyNkZWZpbmUgRGJlTnVtYmVyRXJyb3JzCQkJKERiZUJhZEJ1ZmZlciArIDEpCisKKyNlbmRpZiAvKiBEQkVfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2RiZXByb3RvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2RiZXByb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg0OTI2ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZGJlcHJvdG8uaApAQCAtMCwwICsxLDIyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIEhFV0xFVFQtUEFDS0FSRCBDT01QQU5ZIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIHRoZSBIZXdsZXR0LVBhY2thcmQKKyAqIENvbXBhbnkgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqIGF1dGhvcml6YXRpb24gZnJvbSB0aGUgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkuCisgKgorICogICAgIEhlYWRlciBmaWxlIGZvciBYbGliLXJlbGF0ZWQgREJFCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIERCRV9QUk9UT19ICisjZGVmaW5lIERCRV9QUk9UT19ICisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9kYmUuaD4KKworLyogUmVxdWVzdCB2YWx1ZXMgdXNlZCBpbiAoUylQcm9jRGJlRGlzcGF0Y2goKSAqLworI2RlZmluZSBYX0RiZUdldFZlcnNpb24gICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWF9EYmVBbGxvY2F0ZUJhY2tCdWZmZXJOYW1lICAgICAxCisjZGVmaW5lIFhfRGJlRGVhbGxvY2F0ZUJhY2tCdWZmZXJOYW1lICAgMgorI2RlZmluZSBYX0RiZVN3YXBCdWZmZXJzICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWF9EYmVCZWdpbklkaW9tICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFhfRGJlRW5kSWRpb20gICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBYX0RiZUdldFZpc3VhbEluZm8gICAgICAgICAgICAgIDYKKyNkZWZpbmUgWF9EYmVHZXRCYWNrQnVmZmVyQXR0cmlidXRlcyAgICA3CisKK3R5cGVkZWYgQ0FSRDggIHhEYmVTd2FwQWN0aW9uOwordHlwZWRlZiBDQVJEMzIgeERiZUJhY2tCdWZmZXI7CisKKy8qIFRZUEVERUZTICovCisKKy8qIFByb3RvY29sIGRhdGEgdHlwZXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDQVJEMzIJCXdpbmRvdyBCMzI7CS8qIHdpbmRvdyAgICAgICovCisgICAgeERiZVN3YXBBY3Rpb24Jc3dhcEFjdGlvbjsJLyogc3dhcCBhY3Rpb24gKi8KKyAgICBDQVJEOAkJcGFkMTsJCS8qIHVudXNlZCAgICAgICovCisgICAgQ0FSRDE2CQlwYWQyIEIxNjsKKworfSB4RGJlU3dhcEluZm87CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQ0FSRDMyCXZpc3VhbElEIEIzMjsJLyogYXNzb2NpYXRlZCB2aXN1YWwgICAgICAqLworICAgIENBUkQ4CWRlcHRoOwkJLyogZGVwdGggb2YgdmlzdWFsICAgICAgICAqLworICAgIENBUkQ4CXBlcmZMZXZlbDsJLyogcGVyZm9ybWFuY2UgbGV2ZWwgaGludCAqLworICAgIENBUkQxNglwYWQxIEIxNjsKKworfSB4RGJlVmlzSW5mbzsKKyNkZWZpbmUgc3pfeERiZVZpc0luZm8JOAorCit0eXBlZGVmIHN0cnVjdAoreworICAgIENBUkQzMgluIEIzMjsJLyogbnVtYmVyIG9mIHZpc3VhbCBpbmZvIGl0ZW1zIGluIGxpc3QgICovCisKK30geERiZVNjcmVlblZpc0luZm87CS8qIGZvbGxvd2VkIGJ5IG4geERiZVZpc0luZm8gaXRlbXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDQVJEMzIJd2luZG93IEIzMjsJLyogd2luZG93ICovCisKK30geERiZUJ1ZmZlckF0dHJpYnV0ZXM7CisKKworLyogUmVxdWVzdHMgYW5kIHJlcGxpZXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBtYWpvci1vcGNvZGU6IGFsd2F5cyBjb2Rlcy0+bWFqb3Jfb3Bjb2RlICovCisgICAgQ0FSRDgJZGJlUmVxVHlwZTsJLyogbWlub3Itb3Bjb2RlOiBhbHdheXMgWF9EYmVHZXRWZXJzaW9uICgwKSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OwkvKiByZXF1ZXN0IGxlbmd0aDogKDIpICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ0FSRDgJbWFqb3JWZXJzaW9uOwkvKiBjbGllbnQtbWFqb3ItdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ0FSRDgJbWlub3JWZXJzaW9uOwkvKiBjbGllbnQtbWlub3ItdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ0FSRDE2CXVudXNlZCBCMTY7CS8qIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworfSB4RGJlR2V0VmVyc2lvblJlcTsKKyNkZWZpbmUgc3pfeERiZUdldFZlcnNpb25SZXEJOAorCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJZVEUJdHlwZTsJCQkvKiBSZXBseTogWF9SZXBseSAoMSkgICAqLworICAgIENBUkQ4CXVudXNlZDsJCQkvKiB1bnVzZWQgICAgICAgICAgICAgICAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CS8qIHNlcXVlbmNlIG51bWJlciAgICAgICovCisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CQkvKiByZXBseSBsZW5ndGg6ICgwKSAgICAqLworICAgIENBUkQ4CW1ham9yVmVyc2lvbjsJCS8qIHNlcnZlci1tYWpvci12ZXJzaW9uICovCisgICAgQ0FSRDgJbWlub3JWZXJzaW9uOwkJLyogc2VydmVyLW1pbm9yLXZlcnNpb24gKi8KKyAgICBDQVJEMTYJcGFkMSBCMTY7CQkvKiB1bnVzZWQgICAgICAgICAgICAgICAqLworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKKyAgICBDQVJEMzIJcGFkNiBCMzI7CisKK30geERiZUdldFZlcnNpb25SZXBseTsKKyNkZWZpbmUgc3pfeERiZUdldFZlcnNpb25SZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIENBUkQ4CQlyZXFUeXBlOwkvKiBtYWpvci1vcGNvZGU6IGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOAkJZGJlUmVxVHlwZTsJLyogWF9EYmVBbGxvY2F0ZUJhY2tCdWZmZXJOYW1lICgxKSAgICovCisgICAgQ0FSRDE2CQlsZW5ndGggQjE2OwkvKiByZXF1ZXN0IGxlbmd0aDogKDQpICAgICAgICAgICAgICAgKi8KKyAgICBDQVJEMzIJCXdpbmRvdyBCMzI7CS8qIHdpbmRvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHhEYmVCYWNrQnVmZmVyCWJ1ZmZlciBCMzI7CS8qIGJhY2sgYnVmZmVyIG5hbWUgICAgICAgICAgICAgICAgICAqLworICAgIHhEYmVTd2FwQWN0aW9uCXN3YXBBY3Rpb247CS8qIHN3YXAgYWN0aW9uIGhpbnQgICAgICAgICAgICAgICAgICAqLworICAgIENBUkQ4CQlwYWQxOwkJLyogdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ0FSRDE2CQlwYWQyIEIxNjsKKworfSB4RGJlQWxsb2NhdGVCYWNrQnVmZmVyTmFtZVJlcTsKKyNkZWZpbmUgc3pfeERiZUFsbG9jYXRlQmFja0J1ZmZlck5hbWVSZXEJMTYKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDQVJEOAkJcmVxVHlwZTsJLyogbWFqb3Itb3Bjb2RlOiBjb2Rlcy0+bWFqb3Jfb3Bjb2RlICovCisgICAgQ0FSRDgJCWRiZVJlcVR5cGU7CS8qIFhfRGJlRGVhbGxvY2F0ZUJhY2tCdWZmZXJOYW1lICgyKSAqLworICAgIENBUkQxNgkJbGVuZ3RoIEIxNjsJLyogcmVxdWVzdCBsZW5ndGg6ICgyKSAgICAgICAgICAgICAgICovCisgICAgeERiZUJhY2tCdWZmZXIJYnVmZmVyIEIzMjsJLyogYmFjayBidWZmZXIgbmFtZSAgICAgICAgICAgICAgICAgICovCisKK30geERiZURlYWxsb2NhdGVCYWNrQnVmZmVyTmFtZVJlcTsKKyNkZWZpbmUgc3pfeERiZURlYWxsb2NhdGVCYWNrQnVmZmVyTmFtZVJlcQk4CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogbWFqb3Itb3Bjb2RlOiBhbHdheXMgY29kZXMtPm1ham9yX29wY29kZSAgKi8KKyAgICBDQVJEOAlkYmVSZXFUeXBlOwkvKiBtaW5vci1vcGNvZGU6IGFsd2F5cyBYX0RiZVN3YXBCdWZmZXJzICgzKSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OwkvKiByZXF1ZXN0IGxlbmd0aDogKDIrMm4pICAgICAgICAgICAgICAgICAgICAqLworICAgIENBUkQzMgluIEIzMjsJCS8qIG4sIG51bWJlciBvZiB3aW5kb3cvc3dhcCBhY3Rpb24gcGFpcnMgICAgICovCisKK30geERiZVN3YXBCdWZmZXJzUmVxOwkJLyogZm9sbG93ZWQgYnkgbiB3aW5kb3cvc3dhcCBhY3Rpb24gcGFpcnMgICAgKi8KKyNkZWZpbmUgc3pfeERiZVN3YXBCdWZmZXJzUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBtYWpvci1vcGNvZGU6IGFsd2F5cyBjb2Rlcy0+bWFqb3Jfb3Bjb2RlICovCisgICAgQ0FSRDgJZGJlUmVxVHlwZTsJLyogbWlub3Itb3Bjb2RlOiBhbHdheXMgWF9EYmVCZWdpbklkb20gKDQpICAqLworICAgIENBUkQxNglsZW5ndGggQjE2OwkvKiByZXF1ZXN0IGxlbmd0aDogKDEpICAgICAgICAgICAgICAgICAgICAgICovCisKK30geERiZUJlZ2luSWRpb21SZXE7CisjZGVmaW5lIHN6X3hEYmVCZWdpbklkaW9tUmVxCTQKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBtYWpvci1vcGNvZGU6IGFsd2F5cyBjb2Rlcy0+bWFqb3Jfb3Bjb2RlICovCisgICAgQ0FSRDgJZGJlUmVxVHlwZTsJLyogbWlub3Itb3Bjb2RlOiBhbHdheXMgWF9EYmVFbmRJZG9tICg1KSAgICAqLworICAgIENBUkQxNglsZW5ndGggQjE2OwkvKiByZXF1ZXN0IGxlbmd0aDogKDEpICAgICAgICAgICAgICAgICAgICAgICovCisKK30geERiZUVuZElkaW9tUmVxOworI2RlZmluZSBzel94RGJlRW5kSWRpb21SZXEJNAorCit0eXBlZGVmIHN0cnVjdAoreworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBjb2Rlcy0+bWFqb3Jfb3Bjb2RlICAgICAqLworICAgIENBUkQ4CWRiZVJlcVR5cGU7CS8qIGFsd2F5cyBYX0RiZUdldFZpc3VhbEluZm8gKDYpICAqLworICAgIENBUkQxNglsZW5ndGggQjE2OwkvKiByZXF1ZXN0IGxlbmd0aDogKDIrbikgICAgICAgICAgKi8KKyAgICBDQVJEMzIJbiBCMzI7CQkvKiBuLCBudW1iZXIgb2YgZHJhd2FibGVzIGluIGxpc3QgKi8KKworfSB4RGJlR2V0VmlzdWFsSW5mb1JlcTsJCS8qIGZvbGxvd2VkIGJ5IG4gZHJhd2FibGVzICAgICAgICAqLworI2RlZmluZSBzel94RGJlR2V0VmlzdWFsSW5mb1JlcQk4CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQllURQl0eXBlOwkJCS8qIFJlcGx5OiBYX1JlcGx5ICgxKSAgICAgICAgICAgICAgICAqLworICAgIENBUkQ4CXVudXNlZDsJCQkvKiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OwkvKiBzZXF1ZW5jZSBudW1iZXIgICAgICAgICAgICAgICAgICAgKi8KKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsJCS8qIHJlcGx5IGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAqLworICAgIENBUkQzMgltOwkJCS8qIG0sIG51bWJlciBvZiB2aXN1YWwgaW5mb3MgaW4gbGlzdCAqLworICAgIENBUkQzMglwYWQxIEIzMjsJCS8qIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKKworfSB4RGJlR2V0VmlzdWFsSW5mb1JlcGx5OwkJLyogZm9sbG93ZWQgYnkgbSB2aXN1YWwgaW5mb3MgICAgICAgICovCisjZGVmaW5lIHN6X3hEYmVHZXRWaXN1YWxJbmZvUmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDQVJEOAkJcmVxVHlwZTsJLyogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgICAgICAgKi8KKyAgICBDQVJEOAkJZGJlUmVxVHlwZTsJLyogWF9EYmVHZXRCYWNrQnVmZmVyQXR0cmlidXRlcyAoNykgKi8KKyAgICBDQVJEMTYJCWxlbmd0aCBCMTY7CS8qIHJlcXVlc3QgbGVuZ3RoOiAoMikgICAgICAgICAgICAgICovCisgICAgeERiZUJhY2tCdWZmZXIJYnVmZmVyIEIzMjsJLyogYmFjayBidWZmZXIgbmFtZSAgICAgICAgICAgICAgICAgKi8KKworfSB4RGJlR2V0QmFja0J1ZmZlckF0dHJpYnV0ZXNSZXE7CisjZGVmaW5lIHN6X3hEYmVHZXRCYWNrQnVmZmVyQXR0cmlidXRlc1JlcQk4CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQllURQl0eXBlOwkJCS8qIFJlcGx5OiBYX1JlcGx5ICgxKSAqLworICAgIENBUkQ4CXVudXNlZDsJCQkvKiB1bnVzZWQgICAgICAgICAgICAgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OwkvKiBzZXF1ZW5jZSBudW1iZXIgICAgKi8KKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsJCS8qIHJlcGx5IGxlbmd0aDogKDApICAqLworICAgIENBUkQzMglhdHRyaWJ1dGVzOwkJLyogYXR0cmlidXRlcyAgICAgICAgICovCisgICAgQ0FSRDMyCXBhZDEgQjMyOwkJLyogdW51c2VkICAgICAgICAgICAgICovCisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworCit9IHhEYmVHZXRCYWNrQnVmZmVyQXR0cmlidXRlc1JlcGx5OworI2RlZmluZSBzel94RGJlR2V0QmFja0J1ZmZlckF0dHJpYnV0ZXNSZXBseQkzMgorCisjZW5kaWYgLyogREJFX1BST1RPX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9kcG1zLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2RwbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2U5OGY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9kcG1zLmgKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgMTk5NiBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cy4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUuCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCitESUdJVEFMIEVRVUlQTUVOVCBDT1JQT1JBVElPTiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUywgSU5DTFVESU5HLCAKK0JVVCBOT1QgTElNSVRFRCBUTyBDT05TRVFVRU5USUFMIE9SIElOQ0lERU5UQUwgREFNQUdFUywgT1IgT1RIRVIgTElBQklMSVRZLCAKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgCitJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiAKK3NoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIKK2RlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBEaWdpdGFsIAorRXF1aXBtZW50IENvcnBvcmF0aW9uLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1gxMV9FWFRFTlNJT05TX0RQTVNfSAorI2RlZmluZSBfWDExX0VYVEVOU0lPTlNfRFBNU19IIDEKKworI2luY2x1ZGUgPFgxMS9YLmg+CisjaW5jbHVkZSA8WDExL1htZC5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL2RwbXNjb25zdC5oPgorCisjaWZuZGVmIERQTVNfU0VSVkVSCitfWEZVTkNQUk9UT0JFR0lOCisKK2V4dGVybiBCb29sIERQTVNRdWVyeUV4dGVuc2lvbihEaXNwbGF5ICosIGludCAqLCBpbnQgKik7CitleHRlcm4gU3RhdHVzIERQTVNHZXRWZXJzaW9uKERpc3BsYXkgKiwgaW50ICosIGludCAqKTsKK2V4dGVybiBCb29sIERQTVNDYXBhYmxlKERpc3BsYXkgKik7CitleHRlcm4gU3RhdHVzIERQTVNTZXRUaW1lb3V0cyhEaXNwbGF5ICosIENBUkQxNiwgQ0FSRDE2LCBDQVJEMTYpOworZXh0ZXJuIEJvb2wgRFBNU0dldFRpbWVvdXRzKERpc3BsYXkgKiwgQ0FSRDE2ICosIENBUkQxNiAqLCBDQVJEMTYgKik7CitleHRlcm4gU3RhdHVzIERQTVNFbmFibGUoRGlzcGxheSAqKTsKK2V4dGVybiBTdGF0dXMgRFBNU0Rpc2FibGUoRGlzcGxheSAqKTsKK2V4dGVybiBTdGF0dXMgRFBNU0ZvcmNlTGV2ZWwoRGlzcGxheSAqLCBDQVJEMTYpOworZXh0ZXJuIFN0YXR1cyBEUE1TSW5mbyhEaXNwbGF5ICosIENBUkQxNiAqLCBCT09MICopOworCitfWEZVTkNQUk9UT0VORAorI2VuZGlmCisKKyNlbmRpZiAvKiAhX1gxMV9FWFRFTlNJT05TX0RQTVNfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2RwbXNjb25zdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9kcG1zY29uc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWYwNTg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9kcG1zY29uc3QuaApAQCAtMCwwICsxLDQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSAxOTk2IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZS4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgRVFVSVBNRU5UIENPUlBPUkFUSU9OIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTLCBJTkNMVURJTkcsCitCVVQgTk9UIExJTUlURUQgVE8gQ09OU0VRVUVOVElBTCBPUiBJTkNJREVOVEFMIERBTUFHRVMsIE9SIE9USEVSIExJQUJJTElUWSwKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IKK0lOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uCitzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyCitkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gRGlnaXRhbAorRXF1aXBtZW50IENvcnBvcmF0aW9uLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0RQTVNDT05TVF9ICisjZGVmaW5lIF9EUE1TQ09OU1RfSCAxCisKKyNkZWZpbmUgRFBNU01ham9yVmVyc2lvbgkxCisjZGVmaW5lIERQTVNNaW5vclZlcnNpb24JMQorCisjZGVmaW5lIERQTVNFeHRlbnNpb25OYW1lCSJEUE1TIgorCisjZGVmaW5lIERQTVNNb2RlT24JMAorI2RlZmluZSBEUE1TTW9kZVN0YW5kYnkJMQorI2RlZmluZSBEUE1TTW9kZVN1c3BlbmQJMgorI2RlZmluZSBEUE1TTW9kZU9mZgkzCisKKyNlbmRpZiAvKiAhX0RQTVNDT05TVF9IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZHBtc3Byb3RvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2RwbXNwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZmQzZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2RwbXNwcm90by5oCkBAIC0wLDAgKzEsMTc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSAxOTk2IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZS4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgRVFVSVBNRU5UIENPUlBPUkFUSU9OIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTLCBJTkNMVURJTkcsCitCVVQgTk9UIExJTUlURUQgVE8gQ09OU0VRVUVOVElBTCBPUiBJTkNJREVOVEFMIERBTUFHRVMsIE9SIE9USEVSIExJQUJJTElUWSwKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IKK0lOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uCitzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyCitkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gRGlnaXRhbAorRXF1aXBtZW50IENvcnBvcmF0aW9uLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0RQTVNQUk9UT19IXworI2RlZmluZSBfRFBNU1BST1RPX0hfCisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9kcG1zY29uc3QuaD4KKworI2RlZmluZSBYX0RQTVNHZXRWZXJzaW9uCTAKKyNkZWZpbmUgWF9EUE1TQ2FwYWJsZQkJMQorI2RlZmluZSBYX0RQTVNHZXRUaW1lb3V0cwkyCisjZGVmaW5lIFhfRFBNU1NldFRpbWVvdXRzCTMKKyNkZWZpbmUgWF9EUE1TRW5hYmxlCQk0CisjZGVmaW5lIFhfRFBNU0Rpc2FibGUJCTUKKyNkZWZpbmUgWF9EUE1TRm9yY2VMZXZlbCAgICAgICAJNgorI2RlZmluZSBYX0RQTVNJbmZvICAgICAgIAk3CisKKyNkZWZpbmUgRFBNU051bWJlckV2ZW50cwkwCisKKyNkZWZpbmUgRFBNU051bWJlckVycm9ycwkwCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBEUE1TQ29kZSAqLworICAgIENBUkQ4CWRwbXNSZXFUeXBlOwkvKiBhbHdheXMgWF9EUE1TR2V0VmVyc2lvbiAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNgltYWpvclZlcnNpb24gQjE2OworICAgIENBUkQxNgltaW5vclZlcnNpb24gQjE2OworfSB4RFBNU0dldFZlcnNpb25SZXE7CisjZGVmaW5lIHN6X3hEUE1TR2V0VmVyc2lvblJlcSA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CXBhZDA7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYJbWFqb3JWZXJzaW9uIEIxNjsKKyAgICBDQVJEMTYJbWlub3JWZXJzaW9uIEIxNjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworfSB4RFBNU0dldFZlcnNpb25SZXBseTsKKyNkZWZpbmUgc3pfeERQTVNHZXRWZXJzaW9uUmVwbHkgMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBEUE1TQ29kZSAqLworICAgIENBUkQ4CWRwbXNSZXFUeXBlOwkvKiBhbHdheXMgWF9EUE1TQ2FwYWJsZSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworfSB4RFBNU0NhcGFibGVSZXE7CisjZGVmaW5lIHN6X3hEUE1TQ2FwYWJsZVJlcSA0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CXBhZDA7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBCT09MCWNhcGFibGU7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBDQVJEMTYJcGFkMiBCMTY7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7CisgICAgQ0FSRDMyCXBhZDYgQjMyOworICAgIENBUkQzMglwYWQ3IEIzMjsKK30geERQTVNDYXBhYmxlUmVwbHk7CisjZGVmaW5lIHN6X3hEUE1TQ2FwYWJsZVJlcGx5IDMyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgRFBNU0NvZGUgKi8KKyAgICBDQVJEOAlkcG1zUmVxVHlwZTsJLyogYWx3YXlzIFhfRFBNU0dldFRpbWVvdXRzICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7Cit9IHhEUE1TR2V0VGltZW91dHNSZXE7CisjZGVmaW5lIHN6X3hEUE1TR2V0VGltZW91dHNSZXEgNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlwYWQwOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDE2CXN0YW5kYnkgQjE2OworICAgIENBUkQxNglzdXNwZW5kIEIxNjsKKyAgICBDQVJEMTYJb2ZmIEIxNjsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworfSB4RFBNU0dldFRpbWVvdXRzUmVwbHk7CisjZGVmaW5lIHN6X3hEUE1TR2V0VGltZW91dHNSZXBseSAzMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIERQTVNDb2RlICovCisgICAgQ0FSRDgJZHBtc1JlcVR5cGU7CS8qIGFsd2F5cyBYX0RQTVNTZXRUaW1lb3V0cyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglzdGFuZGJ5IEIxNjsKKyAgICBDQVJEMTYJc3VzcGVuZCBCMTY7CisgICAgQ0FSRDE2CW9mZiBCMTY7CisgICAgQ0FSRDE2CXBhZDAgQjE2OworfSB4RFBNU1NldFRpbWVvdXRzUmVxOworI2RlZmluZSBzel94RFBNU1NldFRpbWVvdXRzUmVxIDEyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgRFBNU0NvZGUgKi8KKyAgICBDQVJEOAlkcG1zUmVxVHlwZTsJLyogYWx3YXlzIFhfRFBNU0VuYWJsZSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworfSB4RFBNU0VuYWJsZVJlcTsKKyNkZWZpbmUgc3pfeERQTVNFbmFibGVSZXEgNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIERQTVNDb2RlICovCisgICAgQ0FSRDgJZHBtc1JlcVR5cGU7CS8qIGFsd2F5cyBYX0RQTVNEaXNhYmxlICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7Cit9IHhEUE1TRGlzYWJsZVJlcTsKKyNkZWZpbmUgc3pfeERQTVNEaXNhYmxlUmVxIDQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBEUE1TQ29kZSAqLworICAgIENBUkQ4CWRwbXNSZXFUeXBlOwkvKiBhbHdheXMgWF9EUE1TRm9yY2VMZXZlbCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglsZXZlbCBCMTY7CS8qIHBvd2VyIGxldmVsIHJlcXVlc3RlZCAqLworICAgIENBUkQxNglwYWQwIEIxNjsKK30geERQTVNGb3JjZUxldmVsUmVxOworI2RlZmluZSBzel94RFBNU0ZvcmNlTGV2ZWxSZXEgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIERQTVNDb2RlICovCisgICAgQ0FSRDgJZHBtc1JlcVR5cGU7CS8qIGFsd2F5cyBYX0RQTVNJbmZvICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7Cit9IHhEUE1TSW5mb1JlcTsKKyNkZWZpbmUgc3pfeERQTVNJbmZvUmVxIDQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJcGFkMDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNglwb3dlcl9sZXZlbCBCMTY7CisgICAgQk9PTAlzdGF0ZTsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKKyAgICBDQVJEMzIJcGFkNiBCMzI7Cit9IHhEUE1TSW5mb1JlcGx5OworI2RlZmluZSBzel94RFBNU0luZm9SZXBseSAzMgorCisjZW5kaWYgLyogX0RQTVNQUk9UT19IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9leHR1dGlsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2V4dHV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzFjNTIwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9leHR1dGlsLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKgorQ29weXJpZ2h0IDE5ODksIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisgKgorICogQXV0aG9yOiAgSmltIEZ1bHRvbiwgTUlUIFRoZSBPcGVuIEdyb3VwCisgKiAKKyAqICAgICAgICAgICAgICAgICAgICAgWGxpYiBFeHRlbnNpb24tV3JpdGluZyBVdGlsaXRpZXMKKyAqCisgKiBUaGlzIHBhY2thZ2UgY29udGFpbnMgdXRpbGl0aWVzIGZvciB3cml0aW5nIHRoZSBjbGllbnQgQVBJIGZvciB2YXJpb3VzCisgKiBwcm90b2NvbCBleHRlbnNpb25zLiAgVEhFU0UgSU5URVJGQUNFUyBBUkUgTk9UIFBBUlQgT0YgVEhFIFggU1RBTkRBUkQgQU5ECisgKiBBUkUgU1VCSkVDVCBUTyBDSEFOR0UhCisgKi8KKworI2lmbmRlZiBfRVhUVVRJTF9IXworI2RlZmluZSBfRVhUVVRJTF9IXworCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWGV4dC5oPgorCisvKgorICogV2UgbmVlZCB0byBrZWVwIGEgbGlzdCBvZiBvcGVuIGRpc3BsYXlzIHNpbmNlIHRoZSBYbGliIGRpc3BsYXkgbGlzdCBpc24ndAorICogcHVibGljLiAgV2UgYWxzbyBoYXZlIHRvIHBlci1kaXNwbGF5IGluZm8gaW4gYSBzZXBhcmF0ZSBibG9jayBzaW5jZSBpdCBpc24ndAorICogc3RvcmVkIGRpcmVjdGx5IGluIHRoZSBEaXNwbGF5IHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX1hFeHREaXNwbGF5SW5mbyB7CisgICAgc3RydWN0IF9YRXh0RGlzcGxheUluZm8gKm5leHQ7CS8qIGtlZXAgYSBsaW5rZWQgbGlzdCAqLworICAgIERpc3BsYXkgKmRpc3BsYXk7CQkJLyogd2hpY2ggZGlzcGxheSB0aGlzIGlzICovCisgICAgWEV4dENvZGVzICpjb2RlczsJCQkvKiB0aGUgZXh0ZW5zaW9uIHByb3RvY29sIGNvZGVzICovCisgICAgWFBvaW50ZXIgZGF0YTsJCQkvKiBleHRyYSBkYXRhIGZvciBleHRlbnNpb24gdG8gdXNlICovCit9IFhFeHREaXNwbGF5SW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgX1hFeHRlbnNpb25JbmZvIHsKKyAgICBYRXh0RGlzcGxheUluZm8gKmhlYWQ7CQkvKiBzdGFydCBvZiBsaXN0ICovCisgICAgWEV4dERpc3BsYXlJbmZvICpjdXI7CQkvKiBtb3N0IHJlY2VudGx5IHVzZWQgKi8KKyAgICBpbnQgbmRpc3BsYXlzOwkJCS8qIG51bWJlciBvZiBkaXNwbGF5cyAqLworfSBYRXh0ZW5zaW9uSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgX1hFeHRlbnNpb25Ib29rcyB7CisgICAgaW50ICgqY3JlYXRlX2djKSgKKwkgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisJICAgICAgR0MJCQkvKiBnYyAqLywKKwkgICAgICBYRXh0Q29kZXMqCQkvKiBjb2RlcyAqLworKTsKKyAgICBpbnQgKCpjb3B5X2djKSgKKwkgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgIEdDCQkJLyogZ2MgKi8sCisgICAgICAgICAgICAgIFhFeHRDb2RlcyoJCS8qIGNvZGVzICovCispOworICAgIGludCAoKmZsdXNoX2djKSgKKwkgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgIEdDCQkJLyogZ2MgKi8sCisgICAgICAgICAgICAgIFhFeHRDb2RlcyoJCS8qIGNvZGVzICovCispOworICAgIGludCAoKmZyZWVfZ2MpKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgR0MJCQkvKiBnYyAqLywKKyAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8KKyk7CisgICAgaW50ICgqY3JlYXRlX2ZvbnQpKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgWEZvbnRTdHJ1Y3QqCQkvKiBmcyAqLywKKyAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8KKyk7CisgICAgaW50ICgqZnJlZV9mb250KSgKKwkgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgIFhGb250U3RydWN0KgkJLyogZnMgKi8sCisgICAgICAgICAgICAgIFhFeHRDb2RlcyoJCS8qIGNvZGVzICovCispOworICAgIGludCAoKmNsb3NlX2Rpc3BsYXkpKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8KKyk7CisgICAgQm9vbCAoKndpcmVfdG9fZXZlbnQpKAorCSAgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgICBYRXZlbnQqCQkJLyogcmUgKi8sCisgICAgICAgICAgICAgICB4RXZlbnQqCQkJLyogZXZlbnQgKi8KKyk7CisgICAgU3RhdHVzICgqZXZlbnRfdG9fd2lyZSkoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICBYRXZlbnQqCQkJLyogcmUgKi8sCisgICAgICAgICAgICAgIHhFdmVudCoJCQkvKiBldmVudCAqLworKTsKKyAgICBpbnQgKCplcnJvcikoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICB4RXJyb3IqCQkJLyogZXJyICovLAorICAgICAgICAgICAgICBYRXh0Q29kZXMqCQkvKiBjb2RlcyAqLywKKyAgICAgICAgICAgICAgaW50KgkJCS8qIHJldF9jb2RlICovCispOworICAgIGNoYXIgKigqZXJyb3Jfc3RyaW5nKSgKKwkgICAgICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICAgIGludAkJCS8qIGNvZGUgKi8sCisgICAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8sCisgICAgICAgICAgICAgICAgY2hhcioJCQkvKiBidWZmZXIgKi8sCisgICAgICAgICAgICAgICAgaW50CQkJLyogbmJ5dGVzICovCispOworfSBYRXh0ZW5zaW9uSG9va3M7CisKK2V4dGVybiBYRXh0ZW5zaW9uSW5mbyAqWGV4dENyZWF0ZUV4dGVuc2lvbigKKyAgICB2b2lkCispOworZXh0ZXJuIHZvaWQgWGV4dERlc3Ryb3lFeHRlbnNpb24oCisgICAgWEV4dGVuc2lvbkluZm8qCS8qIGluZm8gKi8KKyk7CitleHRlcm4gWEV4dERpc3BsYXlJbmZvICpYZXh0QWRkRGlzcGxheSgKKyAgICBYRXh0ZW5zaW9uSW5mbyoJLyogZXh0aW5mbyAqLywKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIGNoYXIqCQkvKiBleHRfbmFtZSAqLywKKyAgICBYRXh0ZW5zaW9uSG9va3MqCS8qIGhvb2tzICovLAorICAgIGludAkJCS8qIG5ldmVudHMgKi8sCisgICAgWFBvaW50ZXIJCS8qIGRhdGEgKi8KKyk7CitleHRlcm4gaW50IFhleHRSZW1vdmVEaXNwbGF5KAorICAgIFhFeHRlbnNpb25JbmZvKgkvKiBleHRpbmZvICovLAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8KKyk7CitleHRlcm4gWEV4dERpc3BsYXlJbmZvICpYZXh0RmluZERpc3BsYXkoCisgICAgWEV4dGVuc2lvbkluZm8qCS8qIGV4dGluZm8gKi8sCisgICAgRGlzcGxheSoJCS8qIGRweSAqLworKTsKKworI2RlZmluZSBYZXh0SGFzRXh0ZW5zaW9uKGkpICgoaSkgJiYgKChpKS0+Y29kZXMpKQorI2RlZmluZSBYZXh0Q2hlY2tFeHRlbnNpb24oZHB5LGksbmFtZSx2YWwpIFwKKyAgaWYgKCFYZXh0SGFzRXh0ZW5zaW9uKGkpKSB7IFhNaXNzaW5nRXh0ZW5zaW9uIChkcHksIG5hbWUpOyByZXR1cm4gdmFsOyB9CisjZGVmaW5lIFhleHRTaW1wbGVDaGVja0V4dGVuc2lvbihkcHksaSxuYW1lKSBcCisgIGlmICghWGV4dEhhc0V4dGVuc2lvbihpKSkgeyBYTWlzc2luZ0V4dGVuc2lvbiAoZHB5LCBuYW1lKTsgcmV0dXJuOyB9CisKKworLyoKKyAqIGhlbHBlciBtYWNyb3MgdG8gZ2VuZXJhdGUgY29kZSB0aGF0IGlzIGNvbW1vbiB0byBhbGwgZXh0ZW5zaW9uczsgY2FsbGVyCisgKiBzaG91bGQgcHJlZml4IGl0IHdpdGggc3RhdGljIGlmIGV4dGVuc2lvbiBzb3VyY2UgaXMgaW4gb25lIGZpbGU7IHRoaXMKKyAqIGNvdWxkIGJlIGEgdXRpbGl0eSBmdW5jdGlvbiwgYnV0IGhhdmUgdG8gc3RhY2sgNiB1bnVzZWQgYXJndW1lbnRzIGZvciAKKyAqIHNvbWV0aGluZyB0aGF0IGlzIGNhbGxlZCBtYW55LCBtYW55IHRpbWVzIHdvdWxkIGJlIGJhZC4KKyAqLworI2RlZmluZSBYRVhUX0dFTkVSQVRFX0ZJTkRfRElTUExBWShwcm9jLGV4dGluZm8sZXh0bmFtZSxob29rcyxuZXYsZGF0YSkgXAorWEV4dERpc3BsYXlJbmZvICpwcm9jIChEaXNwbGF5ICpkcHkpIFwKK3sgXAorICAgIFhFeHREaXNwbGF5SW5mbyAqZHB5aW5mbzsgXAorICAgIGlmICghZXh0aW5mbykgeyBpZiAoIShleHRpbmZvID0gWGV4dENyZWF0ZUV4dGVuc2lvbigpKSkgcmV0dXJuIE5VTEw7IH0gXAorICAgIGlmICghKGRweWluZm8gPSBYZXh0RmluZERpc3BsYXkgKGV4dGluZm8sIGRweSkpKSBcCisgICAgICBkcHlpbmZvID0gWGV4dEFkZERpc3BsYXkgKGV4dGluZm8sZHB5LGV4dG5hbWUsaG9va3MsbmV2LGRhdGEpOyBcCisgICAgcmV0dXJuIGRweWluZm87IFwKK30KKworI2RlZmluZSBYRVhUX0ZJTkRfRElTUExBWV9QUk9UTyhwcm9jKSBcCisJWEV4dERpc3BsYXlJbmZvICpwcm9jKERpc3BsYXkgKmRweSkKKworI2RlZmluZSBYRVhUX0dFTkVSQVRFX0NMT1NFX0RJU1BMQVkocHJvYyxleHRpbmZvKSBcCitpbnQgcHJvYyAoRGlzcGxheSAqZHB5LCBYRXh0Q29kZXMgKmNvZGVzKSBcCit7IFwKKyAgICByZXR1cm4gWGV4dFJlbW92ZURpc3BsYXkgKGV4dGluZm8sIGRweSk7IFwKK30KKworI2RlZmluZSBYRVhUX0NMT1NFX0RJU1BMQVlfUFJPVE8ocHJvYykgXAorCWludCBwcm9jKERpc3BsYXkgKmRweSwgWEV4dENvZGVzICpjb2RlcykKKworI2RlZmluZSBYRVhUX0dFTkVSQVRFX0VSUk9SX1NUUklORyhwcm9jLGV4dG5hbWUsbmVycixlcnJsKSBcCitjaGFyICpwcm9jIChEaXNwbGF5ICpkcHksIGludCBjb2RlLCBYRXh0Q29kZXMgKmNvZGVzLCBjaGFyICpidWYsIGludCBuKSBcCit7ICBcCisgICAgY29kZSAtPSBjb2Rlcy0+Zmlyc3RfZXJyb3I7ICBcCisgICAgaWYgKGNvZGUgPj0gMCAmJiBjb2RlIDwgbmVycikgeyBcCisJY2hhciB0bXBbMjU2XTsgXAorCXNwcmludGYgKHRtcCwgIiVzLiVkIiwgZXh0bmFtZSwgY29kZSk7IFwKKwlYR2V0RXJyb3JEYXRhYmFzZVRleHQgKGRweSwgIlhQcm90b0Vycm9yIiwgdG1wLCBlcnJsW2NvZGVdLCBidWYsIG4pOyBcCisJcmV0dXJuIGJ1ZjsgXAorICAgIH0gXAorICAgIHJldHVybiAoY2hhciAqKTA7IFwKK30KKworI2RlZmluZSBYRVhUX0VSUk9SX1NUUklOR19QUk9UTyhwcm9jKSBcCisJY2hhciAqcHJvYyhEaXNwbGF5ICpkcHksIGludCBjb2RlLCBYRXh0Q29kZXMgKmNvZGVzLCBjaGFyICpidWYsIGludCBuKQorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2dlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2dlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhMWQ4YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZ2UuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDctMjAwOCBQZXRlciBIdXR0ZXJlcgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBQZXRlciBIdXR0ZXJlciwgVW5pdmVyc2l0eSBvZiBTb3V0aCBBdXN0cmFsaWEsIE5JQ1RBCisgKgorICovCisKKyNpZm5kZWYgX0dFX0hfCisjZGVmaW5lIF9HRV9IXworCisjZGVmaW5lIEdFX05BTUUgICAgICAgICAiR2VuZXJpYyBFdmVudCBFeHRlbnNpb24iCisjZGVmaW5lIEdFX01BSk9SICAgICAgICAxCisjZGVmaW5lIEdFX01JTk9SICAgICAgICAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSZXF1ZXN0cworICoKKyAqLworCisjZGVmaW5lIFhfR0VRdWVyeVZlcnNpb24gICAgICAgIDAKKworI2RlZmluZSBHRU51bWJlclJlcXVlc3RzICAgICAgIChYX0dFUXVlcnlWZXJzaW9uICsgMSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEV2ZW50cworICoKKyAqLworCisjZGVmaW5lIEdFTnVtYmVyRXZlbnRzICAgICAgICAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBFcnJvcnMKKyAqCisgKi8KKworI2RlZmluZSBHRU51bWJlckVycm9ycyAgICAgICAgMAorCisjZW5kaWYgLyogX0dFX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2dlcHJvdG8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZ2Vwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ODYwZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2dlcHJvdG8uaApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDctMjAwOCBQZXRlciBIdXR0ZXJlcgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBQZXRlciBIdXR0ZXJlciwgVW5pdmVyc2l0eSBvZiBTb3V0aCBBdXN0cmFsaWEsIE5JQ1RBCisgKgorICovCisKKyNpZm5kZWYgX0dFUFJPVE9fSF8KKyNkZWZpbmUgX0dFUFJPVE9fSF8KKworI2luY2x1ZGU8WDExL1hwcm90by5oPgorI2luY2x1ZGU8WDExL1guaD4KKyNpbmNsdWRlPFgxMS9leHRlbnNpb25zL2dlLmg+CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFByb3RvY29sIHJlcXVlc3QgY29uc3RhbnRzCisgKgorICovCisKKyNkZWZpbmUgWF9HRUdldEV4dGVuc2lvblZlcnNpb24gMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogWEdFIHByb3RvY29sIHJlcXVlc3RzL3JlcGxpZXMKKyAqCisgKi8KKworLyogZ2VuZXJpYyByZXF1ZXN0ICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7Cit9IHhHRVJlcTsKKworCisvKiBRdWVyeVZlcnNpb24gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOyAgICAgICAvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZSAgICovCisgICAgQ0FSRDgJUmVxVHlwZTsgICAgICAgLyogYWx3YXlzIFhfR0VRdWVyeVZlcnNpb24gKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYgICAgICBtYWpvclZlcnNpb24gQjE2OworICAgIENBUkQxNiAgICAgIG1pbm9yVmVyc2lvbiBCMTY7Cit9IHhHRVF1ZXJ5VmVyc2lvblJlcTsKKworI2RlZmluZSBzel94R0VRdWVyeVZlcnNpb25SZXEgICAgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVwVHlwZTsJLyogWF9SZXBseQkJCSovCisgICAgQ0FSRDgJUmVwVHlwZTsJLyogYWx3YXlzIFhfR0VRdWVyeVZlcnNpb24gKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNgltYWpvclZlcnNpb24gQjE2OworICAgIENBUkQxNgltaW5vclZlcnNpb24gQjE2OworICAgIENBUkQzMglwYWQwMCBCMzI7CisgICAgQ0FSRDMyCXBhZDAxIEIzMjsKKyAgICBDQVJEMzIJcGFkMDIgQjMyOworICAgIENBUkQzMglwYWQwMyBCMzI7CisgICAgQ0FSRDMyCXBhZDA0IEIzMjsKK30geEdFUXVlcnlWZXJzaW9uUmVwbHk7CisKKyNkZWZpbmUgc3pfeEdFUXVlcnlWZXJzaW9uUmVwbHkgICAgMzIKKworI2VuZGlmIC8qIF9HRVBST1RPX0hfICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbGJ4LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2xieC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZDI0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2xieC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5MiBOZXR3b3JrIENvbXB1dGluZyBEZXZpY2VzCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBOQ0QuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBOQ0QuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUKKyAqIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIgorICogd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogTkNELiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTAorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgTkNELgorICogQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9MQlhfSF8KKyNkZWZpbmUgX0xCWF9IXworCisjZGVmaW5lIExCWE5BTUUgIkxCWCIKKworI2RlZmluZSBMQlhfTUFKT1JfVkVSU0lPTgkxCisjZGVmaW5lIExCWF9NSU5PUl9WRVJTSU9OCTAKKworI2RlZmluZSBMYnhOdW1iZXJSZXFzCQkJNDQKKyNkZWZpbmUgTGJ4RXZlbnQJCQkwCisjZGVmaW5lIExieFF1aWNrTW90aW9uRGVsdGFFdmVudAkxCisjZGVmaW5lIExieE51bWJlckV2ZW50cwkJCTIKKworLyogVGhpcyBpcyBhbHdheXMgdGhlIG1hc3RlciBjbGllbnQgKi8KKyNkZWZpbmUgTGJ4TWFzdGVyQ2xpZW50SW5kZXgJCTAKKworLyogTGJ4RXZlbnQgbGJ4VHlwZSBzdWItZmllbGRzICovCisjZGVmaW5lIExieFN3aXRjaEV2ZW50CQkJMAorI2RlZmluZSBMYnhDbG9zZUV2ZW50CQkJMQorI2RlZmluZSBMYnhEZWx0YUV2ZW50CQkJMgorI2RlZmluZSBMYnhJbnZhbGlkYXRlVGFnRXZlbnQJCTMKKyNkZWZpbmUgTGJ4U2VuZFRhZ0RhdGFFdmVudAkJNAorI2RlZmluZSBMYnhMaXN0ZW5Ub09uZQkJCTUKKyNkZWZpbmUgTGJ4TGlzdGVuVG9BbGwJCQk2CisjZGVmaW5lIExieE1vdGlvbkRlbHRhRXZlbnQJCTcKKyNkZWZpbmUgTGJ4UmVsZWFzZUNtYXBFdmVudAkJOAorI2RlZmluZSBMYnhGcmVlQ2VsbHNFdmVudAkJOQorCisvKgorICogTGJ4IGltYWdlIGNvbXByZXNzaW9uIG1ldGhvZHMKKyAqCisgKiBObyBjb21wcmVzc2lvbiBpcyBhbHdheXMgYXNzaWduZWQgdGhlIHZhbHVlIG9mIDAuCisgKgorICogVGhlIHJlc3Qgb2YgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCBvcGNvZGVzIGFyZSBhc3NpZ25lZCBkeW5hbWljYWxseQorICogYXQgb3B0aW9uIG5lZ290aWF0aW9uIHRpbWUuCisgKi8KKworI2RlZmluZSBMYnhJbWFnZUNvbXByZXNzTm9uZQkJMAorCisKKyNkZWZpbmUgQmFkTGJ4Q2xpZW50CQkJMAorI2RlZmluZSBMYnhOdW1iZXJFcnJvcnMJCQkoQmFkTGJ4Q2xpZW50ICsgMSkKKworLyogdGFnZ2VkIGRhdGEgdHlwZXMgKi8KKyNkZWZpbmUJTGJ4VGFnVHlwZU1vZG1hcAkJMQorI2RlZmluZQlMYnhUYWdUeXBlS2V5bWFwCQkyCisjZGVmaW5lCUxieFRhZ1R5cGVQcm9wZXJ0eQkJMworI2RlZmluZQlMYnhUYWdUeXBlRm9udAkJCTQKKyNkZWZpbmUJTGJ4VGFnVHlwZUNvbm5JbmZvCQk1CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9sYnhwcm90by5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9sYnhwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYWU2MmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2xieHByb3RvLmgKQEAgLTAsMCArMSw5NzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5MiBOZXR3b3JrIENvbXB1dGluZyBEZXZpY2VzCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBOQ0QuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBOQ0QuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUKKyAqIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIgorICogd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogTkNELiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTAorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgTkNELgorICogQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9MQlhQUk9UT19IXworI2RlZmluZSBfTEJYUFJPVE9fSF8KKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL2xieC5oPgorLyoKKyAqIE5PVEU6ICBhbnkgY2hhbmdlcyBvciBhZGRpdGlvbnMgdG8gdGhlIG9wY29kZXMgbmVlZHMgdG8gYmUgcmVmbGVjdGVkCisgKiBpbiB0aGUgbGJ4Q2FjaGVhYmxlIGFycmF5IGluIFhzZXJ2ZXIvbGJ4L2xieG1haW4uYworICovCisKKyNkZWZpbmUgWF9MYnhRdWVyeVZlcnNpb24JCTAKKyNkZWZpbmUgWF9MYnhTdGFydFByb3h5CQkJMQorI2RlZmluZSBYX0xieFN0b3BQcm94eQkJCTIKKyNkZWZpbmUgWF9MYnhTd2l0Y2gJCQkzCisjZGVmaW5lIFhfTGJ4TmV3Q2xpZW50CQkJNAorI2RlZmluZSBYX0xieENsb3NlQ2xpZW50CQk1CisjZGVmaW5lIFhfTGJ4TW9kaWZ5U2VxdWVuY2UJCTYKKyNkZWZpbmUgWF9MYnhBbGxvd01vdGlvbgkJNworI2RlZmluZSBYX0xieEluY3JlbWVudFBpeGVsCQk4CisjZGVmaW5lIFhfTGJ4RGVsdGEJCQk5CisjZGVmaW5lCVhfTGJ4R2V0TW9kaWZpZXJNYXBwaW5nCQkxMAorI2RlZmluZQlYX0xieEludmFsaWRhdGVUYWcJCTEyCisjZGVmaW5lIFhfTGJ4UG9seVBvaW50CQkJMTMKKyNkZWZpbmUgWF9MYnhQb2x5TGluZQkJCTE0CisjZGVmaW5lIFhfTGJ4UG9seVNlZ21lbnQJCTE1CisjZGVmaW5lIFhfTGJ4UG9seVJlY3RhbmdsZQkJMTYKKyNkZWZpbmUgWF9MYnhQb2x5QXJjCQkJMTcKKyNkZWZpbmUgWF9MYnhGaWxsUG9seQkJCTE4CisjZGVmaW5lIFhfTGJ4UG9seUZpbGxSZWN0YW5nbGUJCTE5CisjZGVmaW5lIFhfTGJ4UG9seUZpbGxBcmMJCTIwCisjZGVmaW5lCVhfTGJ4R2V0S2V5Ym9hcmRNYXBwaW5nCQkyMQorI2RlZmluZQlYX0xieFF1ZXJ5Rm9udAkJCTIyCisjZGVmaW5lCVhfTGJ4Q2hhbmdlUHJvcGVydHkJCTIzCisjZGVmaW5lCVhfTGJ4R2V0UHJvcGVydHkJCTI0CisjZGVmaW5lCVhfTGJ4VGFnRGF0YQkJCTI1CisKKyNkZWZpbmUgWF9MYnhDb3B5QXJlYQkJCTI2CisjZGVmaW5lIFhfTGJ4Q29weVBsYW5lCQkJMjcKKyNkZWZpbmUgWF9MYnhQb2x5VGV4dDgJCQkyOAorI2RlZmluZSBYX0xieFBvbHlUZXh0MTYJCQkyOQorI2RlZmluZSBYX0xieEltYWdlVGV4dDgJCQkzMAorI2RlZmluZSBYX0xieEltYWdlVGV4dDE2CQkzMQorCisjZGVmaW5lIFhfTGJ4UXVlcnlFeHRlbnNpb24JCTMyCisjZGVmaW5lIFhfTGJ4UHV0SW1hZ2UJCQkzMworI2RlZmluZSBYX0xieEdldEltYWdlCQkJMzQKKworI2RlZmluZSBYX0xieEJlZ2luTGFyZ2VSZXF1ZXN0CQkzNQorI2RlZmluZSBYX0xieExhcmdlUmVxdWVzdERhdGEJCTM2CisjZGVmaW5lIFhfTGJ4RW5kTGFyZ2VSZXF1ZXN0CQkzNworCisjZGVmaW5lIFhfTGJ4SW50ZXJuQXRvbXMJCTM4CisjZGVmaW5lIFhfTGJ4R2V0V2luQXR0ckFuZEdlb20JCTM5CisKKyNkZWZpbmUgWF9MYnhHcmFiQ21hcAkJCTQwCisjZGVmaW5lIFhfTGJ4UmVsZWFzZUNtYXAJCTQxCisjZGVmaW5lIFhfTGJ4QWxsb2NDb2xvcgkJCTQyCisKKyNkZWZpbmUgWF9MYnhTeW5jCQkJNDMKKworLyoKKyAqIFJlZGVmaW5lIHNvbWUgYmFzaWMgdHlwZXMgdXNlZCBieSBzdHJ1Y3R1cmVzIGRlZmluZWQgaGVyZWluLiAgVGhpcyByZW1vdmVzCisgKiBhbnkgcG9zc2liaWxpdHkgb24gNjQtYml0IGFyY2hpdGVjdHVyZXMgb2Ygb25lIGVudGl0eSB2aWV3aW5nIGNvbW11bmljYXRlZAorICogZGF0YSBhcyAzMi1iaXQgcXVhbnRpdGllcyBhbmQgYW5vdGhlciBlbnRpdHkgdmlld2luZyB0aGUgc2FtZSBkYXRhIGFzIDY0LWJpdAorICogcXVhbnRpdGllcy4KKyAqLworI2RlZmluZSBYSUQgQ0FSRDMyCisjZGVmaW5lIEF0b20gQ0FSRDMyCisjZGVmaW5lIENvbG9ybWFwIENBUkQzMgorI2RlZmluZSBEcmF3YWJsZSBDQVJEMzIKKyNkZWZpbmUgVmlzdWFsSUQgQ0FSRDMyCisjZGVmaW5lIFdpbmRvdyBDQVJEMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0wJc3VjY2VzczsJCS8qIFRSVUUgKi8KKyAgICBCT09MCWNoYW5nZVR5cGU7CisgICAgQ0FSRDE2CW1ham9yVmVyc2lvbiBCMTYsCisJCW1pbm9yVmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CQkvKiAxLzQgYWRkaXRpb25hbCBieXRlcyBpbiBzZXR1cCBpbmZvICovCisgICAgQ0FSRDMyCXRhZyBCMzI7Cit9IHhMYnhDb25uU2V0dXBQcmVmaXg7CisKK3R5cGVkZWYgc3RydWN0IF9MYnhRdWVyeVZlcnNpb24geworICAgIENBUkQ4CXJlcVR5cGU7CQkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CQkvKiBhbHdheXMgWF9MYnhRdWVyeVZlcnNpb24gKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geExieFF1ZXJ5VmVyc2lvblJlcTsKKyNkZWZpbmUgc3pfeExieFF1ZXJ5VmVyc2lvblJlcQk0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CXVudXNlZDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNgltYWpvclZlcnNpb24gQjE2OwkvKiBtYWpvciB2ZXJzaW9uIG9mIExCWCBwcm90b2NvbCAqLworICAgIENBUkQxNgltaW5vclZlcnNpb24gQjE2OwkvKiBtaW5vciB2ZXJzaW9uIG9mIExCWCBwcm90b2NvbCAqLworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7Cit9IHhMYnhRdWVyeVZlcnNpb25SZXBseTsKKyNkZWZpbmUgc3pfeExieFF1ZXJ5VmVyc2lvblJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF9MYnhTdGFydFByb3h5IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieFN0YXJ0UHJveHkgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geExieFN0YXJ0UHJveHlSZXE7CisjZGVmaW5lIHN6X3hMYnhTdGFydFByb3h5UmVxCSAgICA0CisKK3R5cGVkZWYgc3RydWN0IF9MYnhTdG9wUHJveHkgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4U3RvcFByb3h5ICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7Cit9IHhMYnhTdG9wUHJveHlSZXE7CisjZGVmaW5lIHN6X3hMYnhTdG9wUHJveHlSZXEJICAgIDQKKwordHlwZWRlZiBzdHJ1Y3QgX0xieFN3aXRjaCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhTd2l0Y2ggKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJY2xpZW50IEIzMjsJLyogbmV3IGNsaWVudCAqLworfSB4TGJ4U3dpdGNoUmVxOworI2RlZmluZSBzel94TGJ4U3dpdGNoUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgX0xieE5ld0NsaWVudCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhOZXdDbGllbnQgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJY2xpZW50IEIzMjsJLyogbmV3IGNsaWVudCAqLworfSB4TGJ4TmV3Q2xpZW50UmVxOworI2RlZmluZSBzel94TGJ4TmV3Q2xpZW50UmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgX0xieENsb3NlQ2xpZW50IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieENsb3NlQ2xpZW50ICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDMyCWNsaWVudCBCMzI7CS8qIG5ldyBjbGllbnQgKi8KK30geExieENsb3NlQ2xpZW50UmVxOworI2RlZmluZSBzel94TGJ4Q2xvc2VDbGllbnRSZXEJOAorCit0eXBlZGVmIHN0cnVjdCBfTGJ4TW9kaWZ5U2VxdWVuY2UgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4TW9kaWZ5U2VxdWVuY2UgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJYWRqdXN0IEIzMjsKK30geExieE1vZGlmeVNlcXVlbmNlUmVxOworI2RlZmluZSBzel94TGJ4TW9kaWZ5U2VxdWVuY2VSZXEgICAgOAorCit0eXBlZGVmIHN0cnVjdCBfTGJ4QWxsb3dNb3Rpb24geworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4QWxsb3dNb3Rpb24gKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJbnVtIEIzMjsKK30geExieEFsbG93TW90aW9uUmVxOworI2RlZmluZSBzel94TGJ4QWxsb3dNb3Rpb25SZXEgICAgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhHcmFiQ21hcCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENvbG9ybWFwCWNtYXAgQjMyOworfSB4TGJ4R3JhYkNtYXBSZXE7CisjZGVmaW5lIHN6X3hMYnhHcmFiQ21hcFJlcQk4CisKKyNkZWZpbmUgTEJYX1NNQVJUX0dSQUIJCTB4ODAKKyNkZWZpbmUgTEJYX0FVVE9fUkVMRUFTRQkweDQwCisjZGVmaW5lIExCWF8zQ0hBTk5FTFMJCTB4MjAKKyNkZWZpbmUgTEJYXzJCWVRFX1BJWEVMUwkweDEwCisjZGVmaW5lIExCWF9SR0JfQklUU19NQVNLCTB4MGYKKworI2RlZmluZSBMQlhfTElTVF9FTkQJCTAKKyNkZWZpbmUgTEJYX1BJWEVMX1BSSVZBVEUJMQorI2RlZmluZSBMQlhfUElYRUxfU0hBUkVECTIKKyNkZWZpbmUgTEJYX1BJWEVMX1JBTkdFX1BSSVZBVEUJMworI2RlZmluZSBMQlhfUElYRUxfUkFOR0VfU0hBUkVECTQKKyNkZWZpbmUgTEJYX05FWFRfQ0hBTk5FTAk1CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CWZsYWdzOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDMyCXBhZDAgQjE2OworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMTY7Cit9IHhMYnhHcmFiQ21hcFJlcGx5OworI2RlZmluZSBzel94TGJ4R3JhYkNtYXBSZXBseQkzMgorI2RlZmluZSBzel94TGJ4R3JhYkNtYXBSZXBseUhkcgk4CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4UmVsZWFzZUNtYXAgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDb2xvcm1hcAljbWFwIEIzMjsKK30geExieFJlbGVhc2VDbWFwUmVxOworI2RlZmluZSBzel94TGJ4UmVsZWFzZUNtYXBSZXEJOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhBbGxvY0NvbG9yICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ29sb3JtYXAJY21hcCBCMzI7CisgICAgQ0FSRDMyCXBpeGVsIEIzMjsKKyAgICBDQVJEMTYJcmVkIEIxNiwgZ3JlZW4gQjE2LCBibHVlIEIxNjsKKyAgICBDQVJEMTYJcGFkIEIxNjsKK30geExieEFsbG9jQ29sb3JSZXE7CisjZGVmaW5lIHN6X3hMYnhBbGxvY0NvbG9yUmVxCTIwCisKK3R5cGVkZWYgc3RydWN0IF9MYnhJbmNyZW1lbnRQaXhlbCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhJbmNyZW1lbnRQaXhlbCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMgljbWFwIEIzMjsKKyAgICBDQVJEMzIJcGl4ZWwgQjMyOworfSB4TGJ4SW5jcmVtZW50UGl4ZWxSZXE7CisjZGVmaW5lIHN6X3hMYnhJbmNyZW1lbnRQaXhlbFJlcSAgICAxMgorCit0eXBlZGVmIHN0cnVjdCBfTGJ4RGVsdGEgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4RGVsdGEgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOAlkaWZmczsJCS8qIG51bWJlciBvZiBkaWZmcyAqLworICAgIENBUkQ4CWNpbmRleDsJCS8qIGNhY2hlIGluZGV4ICovCisJCQkJLyogbGlzdCBvZiBkaWZmcyBmb2xsb3dzICovCit9IHhMYnhEZWx0YVJlcTsKKyNkZWZpbmUgc3pfeExieERlbHRhUmVxICAgIDYKKwordHlwZWRlZiBzdHJ1Y3QgX0xieEdldE1vZGlmaWVyTWFwcGluZyB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhHZXRNb2RpZmllck1hcHBpbmcgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geExieEdldE1vZGlmaWVyTWFwcGluZ1JlcTsKKyNkZWZpbmUJc3pfeExieEdldE1vZGlmaWVyTWFwcGluZ1JlcQk0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CWtleXNwZXJtb2Q7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIJdGFnIEIzMjsKKyAgICBDQVJEMzIJcGFkMCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworfSB4TGJ4R2V0TW9kaWZpZXJNYXBwaW5nUmVwbHk7CisjZGVmaW5lIHN6X3hMYnhHZXRNb2RpZmllck1hcHBpbmdSZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfTGJ4R2V0S2V5Ym9hcmRNYXBwaW5nIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieEdldEtleWJvYXJkTWFwcGluZyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIEtleUNvZGUJZmlyc3RLZXlDb2RlOworICAgIENBUkQ4CWNvdW50OworICAgIENBUkQxNglwYWQxIEIxNjsKK30geExieEdldEtleWJvYXJkTWFwcGluZ1JlcTsKKyNkZWZpbmUJc3pfeExieEdldEtleWJvYXJkTWFwcGluZ1JlcQk4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CWtleXNwZXJrZXljb2RlOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDMyCXRhZyBCMzI7CisgICAgQ0FSRDMyCXBhZDAgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKK30geExieEdldEtleWJvYXJkTWFwcGluZ1JlcGx5OworI2RlZmluZSBzel94TGJ4R2V0S2V5Ym9hcmRNYXBwaW5nUmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX0xieFF1ZXJ5Rm9udCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhRdWVyeUZvbnQgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJZmlkIEIzMjsKK30geExieFF1ZXJ5Rm9udFJlcTsKKyNkZWZpbmUJc3pfeExieFF1ZXJ5Rm9udFJlcQk4CisKK3R5cGVkZWYgc3RydWN0IF9MYnhJbnRlcm5BdG9tcyB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhJbnRlcm5BdG9tcyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNgludW0gQjE2OworfSB4TGJ4SW50ZXJuQXRvbXNSZXE7CisjZGVmaW5lIHN6X3hMYnhJbnRlcm5BdG9tc1JlcQk2CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJdW51c2VkOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDMyCWF0b21zU3RhcnQgQjMyOworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7Cit9IHhMYnhJbnRlcm5BdG9tc1JlcGx5OworI2RlZmluZSBzel94TGJ4SW50ZXJuQXRvbXNSZXBseQkJMzIKKyNkZWZpbmUgc3pfeExieEludGVybkF0b21zUmVwbHlIZHIJOAorCisKK3R5cGVkZWYgc3RydWN0IF9MYnhHZXRXaW5BdHRyQW5kR2VvbSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhHZXRXaW5BdHRyQW5kR2VvbSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMglpZCBCMzI7CQkvKiB3aW5kb3cgaWQgKi8KK30geExieEdldFdpbkF0dHJBbmRHZW9tUmVxOworI2RlZmluZSBzel94TGJ4R2V0V2luQXR0ckFuZEdlb21SZXEgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIENBUkQ4IGJhY2tpbmdTdG9yZTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOwkvKiBOT1QgMDsgdGhpcyBpcyBhbiBleHRyYS1sYXJnZSByZXBseSAqLworICAgIFZpc3VhbElEIHZpc3VhbElEIEIzMjsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgQ0FSRDE2IGNfY2xhc3MgQjE2OworI2Vsc2UKKyAgICBDQVJEMTYgY2xhc3MgQjE2OworI2VuZGlmCisgICAgQ0FSRDggYml0R3Jhdml0eTsKKyAgICBDQVJEOCB3aW5HcmF2aXR5OworICAgIENBUkQzMiBiYWNraW5nQml0UGxhbmVzIEIzMjsKKyAgICBDQVJEMzIgYmFja2luZ1BpeGVsIEIzMjsKKyAgICBCT09MIHNhdmVVbmRlcjsKKyAgICBCT09MIG1hcEluc3RhbGxlZDsKKyAgICBDQVJEOCBtYXBTdGF0ZTsKKyAgICBCT09MIG92ZXJyaWRlOworICAgIENvbG9ybWFwIGNvbG9ybWFwIEIzMjsKKyAgICBDQVJEMzIgYWxsRXZlbnRNYXNrcyBCMzI7CisgICAgQ0FSRDMyIHlvdXJFdmVudE1hc2sgQjMyOworICAgIENBUkQxNiBkb05vdFByb3BhZ2F0ZU1hc2sgQjE2OworICAgIENBUkQxNiBwYWQxIEIxNjsKKyAgICBXaW5kb3cgcm9vdCBCMzI7CisgICAgSU5UMTYgeCBCMTYsIHkgQjE2OworICAgIENBUkQxNiB3aWR0aCBCMTYsIGhlaWdodCBCMTY7CisgICAgQ0FSRDE2IGJvcmRlcldpZHRoIEIxNjsKKyAgICBDQVJEOCBkZXB0aDsKKyAgICBDQVJEOCBwYWQyOworfSB4TGJ4R2V0V2luQXR0ckFuZEdlb21SZXBseTsKKyNkZWZpbmUgc3pfeExieEdldFdpbkF0dHJBbmRHZW9tUmVwbHkgNjAKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhTeW5jICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7Cit9IHhMYnhTeW5jUmVxOworI2RlZmluZSBzel94TGJ4U3luY1JlcQk0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CXBhZDA7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKK30geExieFN5bmNSZXBseTsKKyNkZWZpbmUgc3pfeExieFN5bmNSZXBseSAzMgorCisKKy8qIGFuIExCWCBzcXVpc2hlZCBjaGFyaW5mbyBwYWNrcyB0aGUgZGF0YSBpbiBhIENBUkQzMiBhcyBmb2xsb3dzICovCisjZGVmaW5lCUxCWF9XSURUSF9TSElGVAkJMjYKKyNkZWZpbmUJTEJYX0xFRlRfU0hJRlQJCTIwCisjZGVmaW5lCUxCWF9SSUdIVF9TSElGVAkJMTMKKyNkZWZpbmUJTEJYX0FTQ0VOVF9TSElGVAk3CisjZGVmaW5lCUxCWF9ERVNDRU5UX1NISUZUCTAKKworI2RlZmluZQlMQlhfV0lEVEhfQklUUwkJNgorI2RlZmluZQlMQlhfTEVGVF9CSVRTCQk2CisjZGVmaW5lCUxCWF9SSUdIVF9CSVRTCQk3CisjZGVmaW5lCUxCWF9BU0NFTlRfQklUUwkJNgorI2RlZmluZQlMQlhfREVTQ0VOVF9CSVRTCTcKKworI2RlZmluZQlMQlhfV0lEVEhfTUFTSwkJMHhmYzAwMDAwMAorI2RlZmluZQlMQlhfTEVGVF9NQVNLCQkweDAzZjAwMDAwCisjZGVmaW5lCUxCWF9SSUdIVF9NQVNLCQkweDAwMGZlMDAwCisjZGVmaW5lCUxCWF9BU0NFTlRfTUFTSwkJMHgwMDAwMWY4MAorI2RlZmluZQlMQlhfREVTQ0VOVF9NQVNLCTB4MDAwMDAwN2YKKworI2RlZmluZQlMQlhfTUFTS19CSVRTKHZhbCwgbikJKCh1bnNpZ25lZCBpbnQpICgodmFsKSAmICgoMSA8PCAobikpIC0gMSkpKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDMyCW1ldHJpY3MgQjMyOworfSB4TGJ4Q2hhckluZm87CisKKy8qIG5vdGUgdGhhdCB0aGlzIGlzIGlkZW50aWNhbCB0byB4UXVlcnlGb250UmVwbHkgZXhjZXB0IGZvciBtaXNzaW5nCisgKiBmaXJzdCAyIHdvcmRzCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB4Q2hhckluZm8gbWluQm91bmRzOworLyogWFhYIGRvIHdlIG5lZWQgdG8gbGVhdmUgdGhpcyBndW5rPyAqLworI2lmbmRlZiBXT1JENjQKKyAgICBDQVJEMzIgd2FsaWduMSBCMzI7CisjZW5kaWYKKyAgICB4Q2hhckluZm8gbWF4Qm91bmRzOworI2lmbmRlZiBXT1JENjQKKyAgICBDQVJEMzIgd2FsaWduMiBCMzI7CisjZW5kaWYKKyAgICBDQVJEMTYgbWluQ2hhck9yQnl0ZTIgQjE2LCBtYXhDaGFyT3JCeXRlMiBCMTY7CisgICAgQ0FSRDE2IGRlZmF1bHRDaGFyIEIxNjsKKyAgICBDQVJEMTYgbkZvbnRQcm9wcyBCMTY7ICAvKiBmb2xsb3dlZCBieSB0aGlzIG1hbnkgeEZvbnRQcm9wIHN0cnVjdHVyZXMgKi8KKyAgICBDQVJEOCBkcmF3RGlyZWN0aW9uOworICAgIENBUkQ4IG1pbkJ5dGUxLCBtYXhCeXRlMTsKKyAgICBCT09MIGFsbENoYXJzRXhpc3Q7CisgICAgSU5UMTYgZm9udEFzY2VudCBCMTYsIGZvbnREZXNjZW50IEIxNjsKKyAgICBDQVJEMzIgbkNoYXJJbmZvcyBCMzI7IC8qIGZvbGxvd2VkIGJ5IHRoaXMgbWFueSB4TGJ4Q2hhckluZm8gc3RydWN0dXJlcyAqLworfSB4TGJ4Rm9udEluZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CWNvbXByZXNzaW9uOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDMyCXRhZyBCMzI7CisgICAgQ0FSRDMyCXBhZDAgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICAvKiBYX1F1ZXJ5Rm9udCBzdGlja3MgbXVjaCBvZiB0aGUgZGF0YSBpbiB0aGUgYmFzZSByZXBseSBwYWNrZXQsCisgICAgICogYnV0IHdlIGhvcGUgdGhhdCBpdCB3b24ndCBiZSBuZWVkZWQsIChhbmQgaXQgd29uJ3QgZml0IGluIDMyIGJ5dGVzCisgICAgICogd2l0aCB0aGUgdGFnIGFueXdheXMpCisgICAgICoKKyAgICAgKiBpZiBhbnkgYWRkaXRpb25hbCBkYXRhIGlzIG5lZWRlZCwgaXRzIHNlbnQgaW4gYSB4TGJ4Rm9udEluZm8KKyAgICAgKi8KK30geExieFF1ZXJ5Rm9udFJlcGx5OworI2RlZmluZSBzel94TGJ4UXVlcnlGb250UmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX0xieENoYW5nZVByb3BlcnR5IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieENoYW5nZVByb3BlcnR5ICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgV2luZG93CXdpbmRvdyBCMzI7CisgICAgQXRvbQlwcm9wZXJ0eSBCMzI7CisgICAgQXRvbQl0eXBlIEIzMjsKKyAgICBDQVJEOAlmb3JtYXQ7CisgICAgQ0FSRDgJbW9kZTsKKyAgICBCWVRFCXBhZFsyXTsKKyAgICBDQVJEMzIJblVuaXRzIEIzMjsKK30geExieENoYW5nZVByb3BlcnR5UmVxOworI2RlZmluZQlzel94TGJ4Q2hhbmdlUHJvcGVydHlSZXEJMjQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJcGFkOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDMyCXRhZyBCMzI7CisgICAgQ0FSRDMyCXBhZDAgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKK30geExieENoYW5nZVByb3BlcnR5UmVwbHk7CisjZGVmaW5lIHN6X3hMYnhDaGFuZ2VQcm9wZXJ0eVJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF9MYnhHZXRQcm9wZXJ0eSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhHZXRQcm9wZXJ0eSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFdpbmRvdwl3aW5kb3cgQjMyOworICAgIEF0b20JcHJvcGVydHkgQjMyOworICAgIEF0b20JdHlwZSBCMzI7CisgICAgQ0FSRDgJZGVsZXRlOworICAgIEJZVEUJcGFkWzNdOworICAgIENBUkQzMglsb25nT2Zmc2V0IEIzMjsKKyAgICBDQVJEMzIJbG9uZ0xlbmd0aCBCMzI7Cit9IHhMYnhHZXRQcm9wZXJ0eVJlcTsKKyNkZWZpbmUJc3pfeExieEdldFByb3BlcnR5UmVxCTI4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CWZvcm1hdDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIEF0b20JcHJvcGVydHlUeXBlIEIzMjsKKyAgICBDQVJEMzIJYnl0ZXNBZnRlciBCMzI7CisgICAgQ0FSRDMyCW5JdGVtcyBCMzI7CisgICAgQ0FSRDMyCXRhZyBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKK30geExieEdldFByb3BlcnR5UmVwbHk7CisjZGVmaW5lIHN6X3hMYnhHZXRQcm9wZXJ0eVJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF9MYnhUYWdEYXRhIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieFRhZ0RhdGEgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBYSUQJCXRhZyBCMzI7CisgICAgQ0FSRDMyCXJlYWxfbGVuZ3RoIEIzMjsKKyAgICAvKiBkYXRhICovCit9IHhMYnhUYWdEYXRhUmVxOworI2RlZmluZQlzel94TGJ4VGFnRGF0YVJlcQkxMgorCit0eXBlZGVmIHN0cnVjdCBfTGJ4SW52YWxpZGF0ZVRhZyB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhJbnZhbGlkYXRlVGFnICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDMyCXRhZyBCMzI7Cit9IHhMYnhJbnZhbGlkYXRlVGFnUmVxOworI2RlZmluZQlzel94TGJ4SW52YWxpZGF0ZVRhZ1JlcQk4CisKK3R5cGVkZWYgc3RydWN0IF9MYnhQdXRJbWFnZSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhQdXRJbWFnZSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4CWNvbXByZXNzaW9uTWV0aG9kOworICAgIENBUkQ4CWNhY2hlRW50czsKKyAgICBDQVJEOAliaXRQYWNrZWQ7CisgICAgLyogcmVzdCBpcyB2YXJpYWJsZSAqLworfSB4TGJ4UHV0SW1hZ2VSZXE7CisjZGVmaW5lIHN6X3hMYnhQdXRJbWFnZVJlcQk3CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieEdldEltYWdlICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgRHJhd2FibGUJZHJhd2FibGUgQjMyOworICAgIElOVDE2CXggQjE2LCB5IEIxNjsKKyAgICBDQVJEMTYJd2lkdGggQjE2LCBoZWlnaHQgQjE2OworICAgIENBUkQzMglwbGFuZU1hc2sgQjMyOworICAgIENBUkQ4CWZvcm1hdDsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQxNglwYWQyIEIxNjsKK30geExieEdldEltYWdlUmVxOworCisjZGVmaW5lIHN6X3hMYnhHZXRJbWFnZVJlcSAyNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOCBkZXB0aDsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsYnhMZW5ndGggQjMyOworICAgIENBUkQzMiB4TGVuZ3RoIEIzMjsKKyAgICBWaXN1YWxJRCB2aXN1YWwgQjMyOworICAgIENBUkQ4IGNvbXByZXNzaW9uTWV0aG9kOworICAgIENBUkQ4IHBhZDE7CisgICAgQ0FSRDE2IHBhZDIgQjE2OworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworfSB4TGJ4R2V0SW1hZ2VSZXBseTsKKworI2RlZmluZSBzel94TGJ4R2V0SW1hZ2VSZXBseSAzMgorCisvKiBGb2xsb3dpbmcgdXNlZCBmb3IgTGJ4UG9seVBvaW50LCBMYnhQb2x5TGluZSwgTGJ4UG9seVNlZ21lbnQsCisgICBMYnhQb2x5UmVjdGFuZ2xlLCBMYnhQb2x5QXJjLCBMYnhQb2x5RmlsbFJlY3RhbmdsZSBhbmQgTGJ4UG9seUZpbGxBcmMgKi8KKworI2RlZmluZSBHRlhfQ0FDSEVfU0laRSAgMTUKKworI2RlZmluZSBHRlhkQ2FjaGVFbnQoZSkJICAgICgoZSkgJiAweGYpCisjZGVmaW5lIEdGWGdDYWNoZUVudChlKQkgICAgKCgoZSkgPj4gNCkgJiAweGYpCisjZGVmaW5lIEdGWENhY2hlRW50cyhkLGcpICAgKCgoZCkgJiAweGYpIHwgKCgoZykgJiAweGYpIDw8IDQpKQorCisjZGVmaW5lIEdGWENhY2hlTm9uZSAgIDB4ZgorCit0eXBlZGVmIHN0cnVjdCBfTGJ4UG9seVBvaW50IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDgJY2FjaGVFbnRzOworICAgIENBUkQ4CXBhZEJ5dGVzOworfSB4TGJ4UG9seVBvaW50UmVxOworCisjZGVmaW5lIHN6X3hMYnhQb2x5UG9pbnRSZXEJNgorCit0eXBlZGVmIHhMYnhQb2x5UG9pbnRSZXEgeExieFBvbHlMaW5lUmVxOwordHlwZWRlZiB4TGJ4UG9seVBvaW50UmVxIHhMYnhQb2x5U2VnbWVudFJlcTsKK3R5cGVkZWYgeExieFBvbHlQb2ludFJlcSB4TGJ4UG9seVJlY3RhbmdsZVJlcTsKK3R5cGVkZWYgeExieFBvbHlQb2ludFJlcSB4TGJ4UG9seUFyY1JlcTsKK3R5cGVkZWYgeExieFBvbHlQb2ludFJlcSB4TGJ4UG9seUZpbGxSZWN0YW5nbGVSZXE7Cit0eXBlZGVmIHhMYnhQb2x5UG9pbnRSZXEgeExieFBvbHlGaWxsQXJjUmVxOworCisjZGVmaW5lIHN6X3hMYnhQb2x5TGluZVJlcQkJc3pfeExieFBvbHlQb2ludFJlcQorI2RlZmluZSBzel94TGJ4UG9seVNlZ21lbnRSZXEJCXN6X3hMYnhQb2x5UG9pbnRSZXEKKyNkZWZpbmUgc3pfeExieFBvbHlSZWN0YW5nbGVSZXEJCXN6X3hMYnhQb2x5UG9pbnRSZXEKKyNkZWZpbmUgc3pfeExieFBvbHlBcmNSZXEJCXN6X3hMYnhQb2x5UG9pbnRSZXEKKyNkZWZpbmUgc3pfeExieFBvbHlGaWxsUmVjdGFuZ2xlUmVxCXN6X3hMYnhQb2x5UG9pbnRSZXEKKyNkZWZpbmUgc3pfeExieFBvbHlGaWxsQXJjCQlzel94TGJ4UG9seVBvaW50UmVxCisKK3R5cGVkZWYgc3RydWN0IF9MYnhGaWxsUG9seSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4CWNhY2hlRW50czsKKyAgICBCWVRFCXNoYXBlOworICAgIENBUkQ4CXBhZEJ5dGVzOworfSB4TGJ4RmlsbFBvbHlSZXE7CisjZGVmaW5lIHN6X3hMYnhGaWxsUG9seVJlcQk3CisKK3R5cGVkZWYgc3RydWN0IF9MYnhDb3B5QXJlYSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4CXNyY0NhY2hlOwkvKiBzb3VyY2UgZHJhd2FibGUgKi8KKyAgICBDQVJEOAljYWNoZUVudHM7CS8qIGRlc3QgZHJhd2FibGUgYW5kIGdjICovCisgICAgLyogZm9sbG93ZWQgYnkgZW5jb2RlZCBzcmMgeCwgc3JjIHksIGRzdCB4LCBkc3QgeSwgd2lkdGgsIGhlaWdodCAqLworfSB4TGJ4Q29weUFyZWFSZXE7CisKKyNkZWZpbmUgc3pfeExieENvcHlBcmVhUmVxICA2CisKK3R5cGVkZWYgc3RydWN0IF9MYnhDb3B5UGxhbmUgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJYml0UGxhbmUgQjMyOworICAgIENBUkQ4CXNyY0NhY2hlOwkvKiBzb3VyY2UgZHJhd2FibGUgKi8KKyAgICBDQVJEOAljYWNoZUVudHM7CS8qIGRlc3QgZHJhd2FibGUgYW5kIGdjICovCisgICAgLyogZm9sbG93ZWQgYnkgZW5jb2RlZCBzcmMgeCwgc3JjIHksIGRzdCB4LCBkc3QgeSwgd2lkdGgsIGhlaWdodCAqLworfSB4TGJ4Q29weVBsYW5lUmVxOworCisjZGVmaW5lIHN6X3hMYnhDb3B5UGxhbmVSZXEgIDEwCisKK3R5cGVkZWYgc3RydWN0IF9MYnhQb2x5VGV4dCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4CWNhY2hlRW50czsKKyAgICAvKiBmb2xsb3dlZCBieSBlbmNvZGVkIHNyYyB4LCBzcmMgeSBjb29yZGluYXRlcyBhbmQgdGV4dCBlbHRzICovCit9IHhMYnhQb2x5VGV4dFJlcTsKKworI2RlZmluZSBzel94TGJ4UG9seVRleHRSZXEgIDUKKwordHlwZWRlZiB4TGJ4UG9seVRleHRSZXEgeExieFBvbHlUZXh0OFJlcTsKK3R5cGVkZWYgeExieFBvbHlUZXh0UmVxIHhMYnhQb2x5VGV4dDE2UmVxOworCisjZGVmaW5lIHN6X3hMYnhQb2x5VGV4dFJlcQk1CisjZGVmaW5lIHN6X3hMYnhQb2x5VGV4dDhSZXEJNQorI2RlZmluZSBzel94TGJ4UG9seVRleHQxNlJlcQk1CisKK3R5cGVkZWYgc3RydWN0IF9MYnhJbWFnZVRleHQgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOAljYWNoZUVudHM7CisgICAgQ0FSRDgJbkNoYXJzOworICAgIC8qIGZvbGxvd2VkIGJ5IGVuY29kZWQgc3JjIHgsIHNyYyB5IGNvb3JkaW5hdGVzIGFuZCBzdHJpbmcgKi8KK30geExieEltYWdlVGV4dFJlcTsKKwordHlwZWRlZiB4TGJ4SW1hZ2VUZXh0UmVxIHhMYnhJbWFnZVRleHQ4UmVxOwordHlwZWRlZiB4TGJ4SW1hZ2VUZXh0UmVxIHhMYnhJbWFnZVRleHQxNlJlcTsKKworI2RlZmluZSBzel94TGJ4SW1hZ2VUZXh0UmVxCTYKKyNkZWZpbmUgc3pfeExieEltYWdlVGV4dDhSZXEJNgorI2RlZmluZSBzel94TGJ4SW1hZ2VUZXh0MTZSZXEJNgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICAgICAgb2Zmc2V0OworICAgIENBUkQ4ICAgICAgIGRpZmY7Cit9IHhMYnhEaWZmSXRlbTsKKyNkZWZpbmUgc3pfeExieERpZmZJdGVtICAgIDIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAluT3B0czsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMglvcHREYXRhU3RhcnQgQjMyOworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7Cit9IHhMYnhTdGFydFJlcGx5OworI2RlZmluZSBzel94TGJ4U3RhcnRSZXBseQkzMgorI2RlZmluZSBzel94TGJ4U3RhcnRSZXBseUhkcgk4CisKK3R5cGVkZWYgc3RydWN0IF9MYnhRdWVyeUV4dGVuc2lvbiB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhRdWVyeUV4dGVuc2lvbiAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMgluYnl0ZXMgQjMyOworfSB4TGJ4UXVlcnlFeHRlbnNpb25SZXE7CisjZGVmaW5lCXN6X3hMYnhRdWVyeUV4dGVuc2lvblJlcQk4CisKK3R5cGVkZWYgc3RydWN0IF9MYnhRdWVyeUV4dGVuc2lvblJlcGx5IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CW51bVJlcXM7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBCT09MCXByZXNlbnQ7CisgICAgQ0FSRDgJbWFqb3Jfb3Bjb2RlOworICAgIENBUkQ4CWZpcnN0X2V2ZW50OworICAgIENBUkQ4CWZpcnN0X2Vycm9yOworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisKKyAgICAvKiByZXBseSAmIGV2ZW50IGdlbmVyYXRpbmcgcmVxdWVzdHMgKi8KK30geExieFF1ZXJ5RXh0ZW5zaW9uUmVwbHk7CisjZGVmaW5lIHN6X3hMYnhRdWVyeUV4dGVuc2lvblJlcGx5CTMyCisKKwordHlwZWRlZiBzdHJ1Y3QgX0xieEJlZ2luTGFyZ2VSZXF1ZXN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieEJlZ2luTGFyZ2VSZXF1ZXN0ICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDMyCWxhcmdlUmVxTGVuZ3RoIEIzMjsKK30geExieEJlZ2luTGFyZ2VSZXF1ZXN0UmVxOworI2RlZmluZQlzel9CZWdpbkxhcmdlUmVxdWVzdFJlcSA4CisKK3R5cGVkZWYgc3RydWN0IF9MYnhMYXJnZVJlcXVlc3REYXRhIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieExhcmdlUmVxdWVzdERhdGEgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICAvKiBmb2xsb3dlZCBieSBMSVNUb2ZDQVJEOCBkYXRhICovCit9IHhMYnhMYXJnZVJlcXVlc3REYXRhUmVxOworI2RlZmluZQlzel9MYXJnZVJlcXVlc3REYXRhUmVxIDQKKwordHlwZWRlZiBzdHJ1Y3QgX0xieEVuZExhcmdlUmVxdWVzdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhFbmRMYXJnZVJlcXVlc3QgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geExieEVuZExhcmdlUmVxdWVzdFJlcTsKKyNkZWZpbmUJc3pfRW5kTGFyZ2VSZXF1ZXN0UmVxIDQKKworCisKK3R5cGVkZWYgc3RydWN0IF9MYnhTd2l0Y2hFdmVudCB7CisgICAgQllURQl0eXBlOwkJLyogYWx3YXlzIGV2ZW50QmFzZSArIExieEV2ZW50ICovCisgICAgQllURQlsYnhUeXBlOwkvKiBMYnhTd2l0Y2hFdmVudCAqLworICAgIENBUkQxNglwYWQgQjE2OworICAgIENBUkQzMgljbGllbnQgQjMyOworfSB4TGJ4U3dpdGNoRXZlbnQ7CisjZGVmaW5lIHN6X3hMYnhTd2l0Y2hFdmVudAk4CisKK3R5cGVkZWYgc3RydWN0IF9MYnhDbG9zZUV2ZW50IHsKKyAgICBCWVRFCXR5cGU7CQkvKiBhbHdheXMgZXZlbnRCYXNlICsgTGJ4RXZlbnQgKi8KKyAgICBCWVRFCWxieFR5cGU7CS8qIExieENsb3NlRXZlbnQgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMgljbGllbnQgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7CisgICAgQ0FSRDMyCXBhZDYgQjMyOworfSB4TGJ4Q2xvc2VFdmVudDsKKyNkZWZpbmUgc3pfeExieENsb3NlRXZlbnQJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX0xieEludmFsaWRhdGVUYWdFdmVudCB7CisgICAgQllURQl0eXBlOwkJLyogYWx3YXlzIGV2ZW50QmFzZSArIExieEV2ZW50ICovCisgICAgQllURQlsYnhUeXBlOwkvKiBMYnhJbnZhbGlkYXRlVGFnRXZlbnQgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMgl0YWcgQjMyOworICAgIENBUkQzMgl0YWdUeXBlIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworfSB4TGJ4SW52YWxpZGF0ZVRhZ0V2ZW50OworI2RlZmluZSBzel94TGJ4SW52YWxpZGF0ZVRhZ0V2ZW50IDMyCisKK3R5cGVkZWYgc3RydWN0IF9MYnhTZW5kVGFnRGF0YUV2ZW50IHsKKyAgICBCWVRFCXR5cGU7CQkvKiBhbHdheXMgZXZlbnRCYXNlICsgTGJ4RXZlbnQgKi8KKyAgICBCWVRFCWxieFR5cGU7CS8qIExieFNlbmRUYWdEYXRhRXZlbnQgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMgl0YWcgQjMyOworICAgIENBUkQzMgl0YWdUeXBlIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworfSB4TGJ4U2VuZFRhZ0RhdGFFdmVudDsKKyNkZWZpbmUgc3pfeExieFNlbmRUYWdEYXRhRXZlbnQgMzIKKwordHlwZWRlZiBzdHJ1Y3QgX0xieExpc3RlblRvT25lRXZlbnQgeworICAgIEJZVEUJdHlwZTsJCS8qIGFsd2F5cyBldmVudEJhc2UgKyBMYnhFdmVudCAqLworICAgIEJZVEUJbGJ4VHlwZTsJLyogTGJ4TGlzdGVuVG9PbmVFdmVudCAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWNsaWVudCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKKyAgICBDQVJEMzIJcGFkNiBCMzI7Cit9IHhMYnhMaXN0ZW5Ub09uZUV2ZW50OworI2RlZmluZSBzel94TGJ4TGlzdGVuVG9PbmVFdmVudCAzMgorCit0eXBlZGVmIHN0cnVjdCBfTGJ4TGlzdGVuVG9BbGxFdmVudCB7CisgICAgQllURQl0eXBlOwkJLyogYWx3YXlzIGV2ZW50QmFzZSArIExieEV2ZW50ICovCisgICAgQllURQlsYnhUeXBlOwkvKiBMYnhMaXN0ZW5Ub0FsbEV2ZW50ICovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKKyAgICBDQVJEMzIJcGFkNyBCMzI7Cit9IHhMYnhMaXN0ZW5Ub0FsbEV2ZW50OworI2RlZmluZSBzel94TGJ4TGlzdGVuVG9PbmVFdmVudCAzMgorCit0eXBlZGVmIHN0cnVjdCBfTGJ4UmVsZWFzZUNtYXBFdmVudCB7CisgICAgQllURQl0eXBlOwkJLyogYWx3YXlzIGV2ZW50QmFzZSArIExieEV2ZW50ICovCisgICAgQllURQlsYnhUeXBlOwkvKiBMYnhSZWxlYXNlQ21hcEV2ZW50ICovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDb2xvcm1hcAljb2xvcm1hcCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKKyAgICBDQVJEMzIJcGFkNiBCMzI7Cit9IHhMYnhSZWxlYXNlQ21hcEV2ZW50OworI2RlZmluZSBzel94TGJ4UmVsZWFzZUNtYXBFdmVudAkzMgorCisKK3R5cGVkZWYgc3RydWN0IF9MYnhGcmVlQ2VsbHNFdmVudCB7CisgICAgQllURQl0eXBlOwkJLyogYWx3YXlzIGV2ZW50QmFzZSArIExieEV2ZW50ICovCisgICAgQllURQlsYnhUeXBlOwkvKiBMYnhGcmVlQ2VsbHNFdmVudCAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ29sb3JtYXAJY29sb3JtYXAgQjMyOworICAgIENBUkQzMglwaXhlbFN0YXJ0IEIzMjsKKyAgICBDQVJEMzIJcGl4ZWxFbmQgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKK30geExieEZyZWVDZWxsc0V2ZW50OworI2RlZmluZSBzel94TGJ4RnJlZUNlbGxzRXZlbnQJMzIKKworCisvKgorICogc3F1aXNoZWQgWCBldmVudCBzaXplcy4gIElmIHRoZXNlIGNoYW5nZSwgYmUgc3VyZSB0byB1cGRhdGUgbGJ4cXVpc2guYworICogYW5kIHVuc3F1aXNoLmMgYXBwcm9wcmlhdGVseQorICoKKyAqIGxieHN6XyogaXMgdGhlIHBhZGRlZCBzcXVpc2hlZCBsZW5ndGgKKyAqIGxieHVwc3pfKiBpcyB0aGUgdW5wYWRkZWQgc3F1aXNoZWQgbGVuZ3RoCisgKi8KKworI2RlZmluZQkgIGxieHN6X0tleUJ1dHRvbkV2ZW50CQkzMgorI2RlZmluZQlsYnh1cHN6X0tleUJ1dHRvbkV2ZW50CQkzMQorCisjZGVmaW5lCSAgbGJ4c3pfRW50ZXJMZWF2ZUV2ZW50CQkzMgorI2RlZmluZQlsYnh1cHN6X0VudGVyTGVhdmVFdmVudAkJMzIKKworI2RlZmluZQkgIGxieHN6X0ZvY3VzRXZlbnQJCTEyCisjZGVmaW5lCWxieHVwc3pfRm9jdXNFdmVudAkJOQorCisjZGVmaW5lCSAgbGJ4c3pfS2V5bWFwRXZlbnQJCTMyCisjZGVmaW5lCWxieHVwc3pfS2V5bWFwRXZlbnQJCTMyCisKKyNkZWZpbmUJICBsYnhzel9FeHBvc2VFdmVudAkJMjAKKyNkZWZpbmUJbGJ4dXBzel9FeHBvc2VFdmVudAkJMTgKKworI2RlZmluZQkgIGxieHN6X0dmeEV4cG9zZUV2ZW50CQkyNAorI2RlZmluZQlsYnh1cHN6X0dmeEV4cG9zZUV2ZW50CQkyMQorCisjZGVmaW5lCSAgbGJ4c3pfTm9FeHBvc2VFdmVudAkJMTIKKyNkZWZpbmUJbGJ4dXBzel9Ob0V4cG9zZUV2ZW50CQkxMQorCisjZGVmaW5lCSAgbGJ4c3pfVmlzaWJpbGl0eUV2ZW50CQkxMgorI2RlZmluZQlsYnh1cHN6X1Zpc2liaWxpdHlFdmVudAkJOQorCisjZGVmaW5lCSAgbGJ4c3pfQ3JlYXRlTm90aWZ5RXZlbnQJMjQKKyNkZWZpbmUJbGJ4dXBzel9DcmVhdGVOb3RpZnlFdmVudAkyMworCisjZGVmaW5lCSAgbGJ4c3pfRGVzdHJveU5vdGlmeUV2ZW50CTEyCisjZGVmaW5lCWxieHVwc3pfRGVzdHJveU5vdGlmeUV2ZW50CTEyCisKKyNkZWZpbmUJICBsYnhzel9Vbm1hcE5vdGlmeUV2ZW50CTE2CisjZGVmaW5lCWxieHVwc3pfVW5tYXBOb3RpZnlFdmVudAkxMworCisjZGVmaW5lCSAgbGJ4c3pfTWFwTm90aWZ5RXZlbnQJCTE2CisjZGVmaW5lCWxieHVwc3pfTWFwTm90aWZ5RXZlbnQJCTEzCisKKyNkZWZpbmUJICBsYnhzel9NYXBSZXF1ZXN0RXZlbnQJCTEyCisjZGVmaW5lCWxieHVwc3pfTWFwUmVxdWVzdEV2ZW50CQkxMgorCisjZGVmaW5lCSAgbGJ4c3pfUmVwYXJlbnRFdmVudAkJMjQKKyNkZWZpbmUJbGJ4dXBzel9SZXBhcmVudEV2ZW50CQkyMQorCisjZGVmaW5lCSAgbGJ4c3pfQ29uZmlndXJlTm90aWZ5RXZlbnQJMjgKKyNkZWZpbmUJbGJ4dXBzel9Db25maWd1cmVOb3RpZnlFdmVudAkyNworCisjZGVmaW5lCSAgbGJ4c3pfQ29uZmlndXJlUmVxdWVzdEV2ZW50CTI4CisjZGVmaW5lCWxieHVwc3pfQ29uZmlndXJlUmVxdWVzdEV2ZW50CTI4CisKKyNkZWZpbmUJICBsYnhzel9HcmF2aXR5RXZlbnQJCTE2CisjZGVmaW5lCWxieHVwc3pfR3Jhdml0eUV2ZW50CQkxNgorCisjZGVmaW5lCSAgbGJ4c3pfUmVzaXplUmVxdWVzdEV2ZW50CTEyCisjZGVmaW5lCWxieHVwc3pfUmVzaXplUmVxdWVzdEV2ZW50CTEyCisKKyNkZWZpbmUJICBsYnhzel9DaXJjdWxhdGVFdmVudAkJMjAKKyNkZWZpbmUJbGJ4dXBzel9DaXJjdWxhdGVFdmVudAkJMTcKKworI2RlZmluZQkgIGxieHN6X1Byb3BlcnR5RXZlbnQJCTIwCisjZGVmaW5lCWxieHVwc3pfUHJvcGVydHlFdmVudAkJMTcKKworI2RlZmluZQkgIGxieHN6X1NlbGVjdGlvbkNsZWFyRXZlbnQJMTYKKyNkZWZpbmUJbGJ4dXBzel9TZWxlY3Rpb25DbGVhckV2ZW50CTE2CisKKyNkZWZpbmUJICBsYnhzel9TZWxlY3Rpb25SZXF1ZXN0RXZlbnQJMjgKKyNkZWZpbmUJbGJ4dXBzel9TZWxlY3Rpb25SZXF1ZXN0RXZlbnQJMjgKKworI2RlZmluZQkgIGxieHN6X1NlbGVjdGlvbk5vdGlmeUV2ZW50CTI0CisjZGVmaW5lCWxieHVwc3pfU2VsZWN0aW9uTm90aWZ5RXZlbnQJMjQKKworI2RlZmluZQkgIGxieHN6X0NvbG9ybWFwRXZlbnQJCTE2CisjZGVmaW5lCWxieHVwc3pfQ29sb3JtYXBFdmVudAkJMTQKKworI2RlZmluZQkgIGxieHN6X01hcHBpbmdOb3RpZnlFdmVudAk4CisjZGVmaW5lCWxieHVwc3pfTWFwcGluZ05vdGlmeUV2ZW50CTcKKworI2RlZmluZQkgIGxieHN6X0NsaWVudE1lc3NhZ2VFdmVudAkzMgorI2RlZmluZQlsYnh1cHN6X0NsaWVudE1lc3NhZ2VFdmVudAkzMgorCisjZGVmaW5lCWxieHN6X1Vua25vd25FdmVudAkJMzIKKworI2lmZGVmIERFQlVHCisKKyNkZWZpbmUgREJHX1NXSVRDSAkweDAwMDAwMDAxCisjZGVmaW5lIERCR19DTE9TRQkweDAwMDAwMDAyCisjZGVmaW5lIERCR19JTwkJMHgwMDAwMDAwNAorI2RlZmluZSBEQkdfUkVBRF9SRVEJMHgwMDAwMDAwOAorI2RlZmluZSBEQkdfTEVOCQkweDAwMDAwMDEwCisjZGVmaW5lIERCR19CTE9DSwkweDAwMDAwMDIwCisjZGVmaW5lIERCR19DTElFTlQJMHgwMDAwMDA0MAorI2RlZmluZSBEQkdfREVMVEEJMHgwMDAwMDA4MAorI2VuZGlmCisvKgorICogQ2FuY2VsIHRoZSBwcmV2aW91cyByZWRlZmluaXRpb24gb2YgdGhlIGJhc2ljIHR5cGVzLCB0aHVzIHJlc3RvcmluZyB0aGVpcgorICogWC5oIGRlZmluaXRpb25zLgorICovCisKKyN1bmRlZiBYSUQKKyN1bmRlZiBBdG9tCisjdW5kZWYgQ29sb3JtYXAKKyN1bmRlZiBEcmF3YWJsZQorI3VuZGVmIFZpc3VhbElECisjdW5kZWYgV2luZG93CisKKyNlbmRpZgkvKiBfTEJYUFJPVE9fSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbWl0bWlzY2NvbnN0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL21pdG1pc2Njb25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYzVmOTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL21pdG1pc2Njb25zdC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IDE5ODksIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSQU5ET00gQ1JVRlQhIFRISVMgSEFTIE5PIE9GRklDSUFMIFggQ09OU09SVElVTSBPUiBYIFBST0pFQ1QgVEVBTSBCTEVTU0lORyAqLworCisKKyNpZm5kZWYgX01JVE1JU0NDT05TVF9IXworI2RlZmluZSBfTUlUTUlTQ0NPTlNUX0hfCisKKyNkZWZpbmUgTUlUTWlzY051bWJlckV2ZW50cwkJMAorI2RlZmluZSBNSVRNaXNjTnVtYmVyRXJyb3JzCQkwCisKKyNkZWZpbmUgTUlUTUlTQ05BTUUgIk1JVC1TVU5EUlktTk9OU1RBTkRBUkQiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9taXRtaXNjcHJvdG8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbWl0bWlzY3Byb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjMjAyYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbWl0bWlzY3Byb3RvLmgKQEAgLTAsMCArMSw2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4OSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFJBTkRPTSBDUlVGVCEgVEhJUyBIQVMgTk8gT0ZGSUNJQUwgWCBDT05TT1JUSVVNIE9SIFggUFJPSkVDVCBURUFNIEJMRVNTSU5HICovCisKKyNpZm5kZWYgX01JVE1JU0NQUk9UT19IXworI2RlZmluZSBfTUlUTUlTQ1BST1RPX0hfCisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9taXRtaXNjY29uc3QuaD4KKworI2RlZmluZSBYX01JVFNldEJ1Z01vZGUJCQkwCisjZGVmaW5lIFhfTUlUR2V0QnVnTW9kZQkJCTEKKwordHlwZWRlZiBzdHJ1Y3QgX1NldEJ1Z01vZGUgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBNSVRSZXFDb2RlICovCisgICAgQ0FSRDgJbWl0UmVxVHlwZTsJLyogYWx3YXlzIFhfTUlUU2V0QnVnTW9kZSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIEJPT0wJb25PZmY7CisgICAgQllURQlwYWQwOworICAgIENBUkQxNglwYWQxOworfSB4TUlUU2V0QnVnTW9kZVJlcTsKKyNkZWZpbmUgc3pfeE1JVFNldEJ1Z01vZGVSZXEJOAorCit0eXBlZGVmIHN0cnVjdCBfR2V0QnVnTW9kZSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIE1JVFJlcUNvZGUgKi8KKyAgICBDQVJEOAltaXRSZXFUeXBlOwkvKiBhbHdheXMgWF9NSVRHZXRCdWdNb2RlICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7Cit9IHhNSVRHZXRCdWdNb2RlUmVxOworI2RlZmluZSBzel94TUlUR2V0QnVnTW9kZVJlcQk0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIEJPT0wJb25PZmY7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIJcGFkMCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKK30geE1JVEdldEJ1Z01vZGVSZXBseTsKKyNkZWZpbmUgc3pfeE1JVEdldEJ1Z01vZGVSZXBseQkzMgorCisjZW5kaWYgLyogX01JVE1JU0NQUk9UT19IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9tdWx0aWJ1Zi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9tdWx0aWJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZmRhMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL211bHRpYnVmLmgKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKgorQ29weXJpZ2h0IDE5ODksIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisgKi8KKworI2lmbmRlZiBfTVVMVElCVUZfSF8KKyNkZWZpbmUgX01VTFRJQlVGX0hfCisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvbXVsdGlidWZjb25zdC5oPgorCisjaWYgIWRlZmluZWQoVU5JWENQUCkgfHwgZGVmaW5lZChBTlNJQ1BQKQorI2RlZmluZSBNYnVmR2V0UmVxKG5hbWUscmVxLGluZm8pIEdldFJlcSAobmFtZSwgcmVxKTsgXAorCXJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7IFwKKwlyZXEtPm1idWZSZXFUeXBlID0gWF8jI25hbWU7CisjZWxzZQorI2RlZmluZSBNYnVmR2V0UmVxKG5hbWUscmVxLGluZm8pIEdldFJlcSAobmFtZSwgcmVxKTsgXAorCXJlcS0+cmVxVHlwZSA9IGluZm8tPmNvZGVzLT5tYWpvcl9vcGNvZGU7IFwKKwlyZXEtPm1idWZSZXFUeXBlID0gWF8vKiovbmFtZTsKKyNlbmRpZgorCisvKgorICogRXh0cmEgZGVmaW5pdGlvbnMgdGhhdCB3aWxsIG9ubHkgYmUgbmVlZGVkIGluIHRoZSBjbGllbnQKKyAqLwordHlwZWRlZiBYSUQgTXVsdGlidWZmZXI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQJdHlwZTsJCSAgICAvKiBvZiBldmVudCAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOyAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBpbnQgc2VuZF9ldmVudDsJICAgIC8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb21lIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICpkaXNwbGF5OwkgICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIE11bHRpYnVmZmVyIGJ1ZmZlcjsJICAgIC8qIGJ1ZmZlciBvZiBldmVudCAqLworICAgIGludAlzdGF0ZTsJCSAgICAvKiBzZWUgQ2xvYmJlcmVkIGNvbnN0YW50cyBhYm92ZSAqLworfSBYbWJ1ZkNsb2JiZXJOb3RpZnlFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludAl0eXBlOwkJICAgIC8qIG9mIGV2ZW50ICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7ICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIGludCBzZW5kX2V2ZW50OwkgICAgLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbWUgYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgKmRpc3BsYXk7CSAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgTXVsdGlidWZmZXIgYnVmZmVyOwkgICAgLyogYnVmZmVyIG9mIGV2ZW50ICovCit9IFhtYnVmVXBkYXRlTm90aWZ5RXZlbnQ7CisKKworLyoKKyAqIHBlci13aW5kb3cgYXR0cmlidXRlcyB0aGF0IGNhbiBiZSBnb3QKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBkaXNwbGF5ZWRfaW5kZXg7CS8qIHdoaWNoIGJ1ZmZlciBpcyBiZWluZyBkaXNwbGF5ZWQgKi8KKyAgICBpbnQgdXBkYXRlX2FjdGlvbjsJCS8qIFVuZGVmaW5lZCwgQmFja2dyb3VuZCwgVW50b3VjaGVkLCBDb3BpZWQgKi8KKyAgICBpbnQgdXBkYXRlX2hpbnQ7CQkvKiBGcmVxdWVudCwgSW50ZXJtaXR0ZW50LCBTdGF0aWMgKi8KKyAgICBpbnQgd2luZG93X21vZGU7CQkvKiBNb25vLCBTdGVyZW8gKi8KKyAgICBpbnQgbmJ1ZmZlcnM7CQkvKiBOdW1iZXIgb2YgYnVmZmVycyAqLworICAgIE11bHRpYnVmZmVyICpidWZmZXJzOwkvKiBCdWZmZXJzICovCit9IFhtYnVmV2luZG93QXR0cmlidXRlczsKKworLyoKKyAqIHBlci13aW5kb3cgYXR0cmlidXRlcyB0aGF0IGNhbiBiZSBzZXQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB1cGRhdGVfaGludDsJCS8qIEZyZXF1ZW50LCBJbnRlcm1pdHRlbnQsIFN0YXRpYyAqLworfSBYbWJ1ZlNldFdpbmRvd0F0dHJpYnV0ZXM7CisKKworLyoKKyAqIHBlci1idWZmZXIgYXR0cmlidXRlcyB0aGF0IGNhbiBiZSBnb3QKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFdpbmRvdyB3aW5kb3c7CQkvKiB3aGljaCB3aW5kb3cgdGhpcyBiZWxvbmdzIHRvICovCisgICAgdW5zaWduZWQgbG9uZyBldmVudF9tYXNrOwkvKiBldmVudHMgdGhhdCBoYXZlIGJlZW4gc2VsZWN0ZWQgKi8KKyAgICBpbnQgYnVmZmVyX2luZGV4OwkJLyogd2hpY2ggYnVmZmVyIGlzIHRoaXMgKi8KKyAgICBpbnQgc2lkZTsJCQkvKiBNb25vLCBMZWZ0LCBSaWdodCAqLworfSBYbWJ1ZkJ1ZmZlckF0dHJpYnV0ZXM7CisKKy8qCisgKiBwZXItYnVmZmVyIGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgc2V0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBsb25nIGV2ZW50X21hc2s7CS8qIGV2ZW50cyB0aGF0IGhhdmUgYmVlbiBzZWxlY3RlZCAqLworfSBYbWJ1ZlNldEJ1ZmZlckF0dHJpYnV0ZXM7CisKKworLyoKKyAqIHBlci1zY3JlZW4gYnVmZmVyIGluZm8gKHRoZXJlIHdpbGwgYmUgbGlzdHMgb2YgdGhlbSkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFZpc3VhbElEIHZpc3VhbGlkOwkJLyogdmlzdWFsIHVzdWFibGUgYXQgdGhpcyBkZXB0aCAqLworICAgIGludCBtYXhfYnVmZmVyczsJCS8qIG1vc3QgYnVmZmVycyBmb3IgdGhpcyB2aXN1YWwgKi8KKyAgICBpbnQgZGVwdGg7CQkJLyogZGVwdGggb2YgYnVmZmVycyB0byBiZSBjcmVhdGVkICovCit9IFhtYnVmQnVmZmVySW5mbzsKKworX1hGVU5DUFJPVE9CRUdJTgorCitleHRlcm4gQm9vbCBYbWJ1ZlF1ZXJ5RXh0ZW5zaW9uKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgaW50KgkJLyogZXZlbnRfYmFzZV9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogZXJyb3JfYmFzZV9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWG1idWZHZXRWZXJzaW9uKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgaW50KgkJLyogbWFqb3JfdmVyc2lvbl9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogbWlub3JfdmVyc2lvbl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWG1idWZDcmVhdGVCdWZmZXJzKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIGludAkJCS8qIGNvdW50ICovLAorICAgIGludAkJCS8qIHVwZGF0ZV9hY3Rpb24gKi8sCisgICAgaW50CQkJLyogdXBkYXRlX2hpbnQgKi8sCisgICAgTXVsdGlidWZmZXIqCS8qIGJ1ZmZlcnMgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhtYnVmRGVzdHJveUJ1ZmZlcnMoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBXaW5kb3cJCS8qIHdpbmRvdyAqLworKTsKKworZXh0ZXJuIHZvaWQgWG1idWZEaXNwbGF5QnVmZmVycygKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIGludAkJCS8qIGNvdW50ICovLAorICAgIE11bHRpYnVmZmVyKgkvKiBidWZmZXJzICovLAorICAgIGludAkJCS8qIG1pbl9kZWxheSAqLywKKyAgICBpbnQJCQkvKiBtYXhfZGVsYXkgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWG1idWZHZXRXaW5kb3dBdHRyaWJ1dGVzKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIFdpbmRvdwkJCS8qIHcgKi8sCisgICAgWG1idWZXaW5kb3dBdHRyaWJ1dGVzKgkvKiBhdHRyICovCispOworCitleHRlcm4gdm9pZCBYbWJ1ZkNoYW5nZVdpbmRvd0F0dHJpYnV0ZXMoCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgV2luZG93CQkJLyogdyAqLywKKyAgICB1bnNpZ25lZCBsb25nCQkvKiB2YWx1ZW1hc2sgKi8sCisgICAgWG1idWZTZXRXaW5kb3dBdHRyaWJ1dGVzKgkvKiBhdHRyICovCispOworCitleHRlcm4gU3RhdHVzIFhtYnVmR2V0QnVmZmVyQXR0cmlidXRlcygKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBNdWx0aWJ1ZmZlcgkJCS8qIGIgKi8sCisgICAgWG1idWZCdWZmZXJBdHRyaWJ1dGVzKgkvKiBhdHRyICovCispOworCitleHRlcm4gdm9pZCBYbWJ1ZkNoYW5nZUJ1ZmZlckF0dHJpYnV0ZXMoCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgTXVsdGlidWZmZXIJCQkvKiBiICovLAorICAgIHVuc2lnbmVkIGxvbmcJCS8qIHZhbHVlbWFzayAqLywKKyAgICBYbWJ1ZlNldEJ1ZmZlckF0dHJpYnV0ZXMqCS8qIGF0dHIgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWG1idWZHZXRTY3JlZW5JbmZvKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIERyYXdhYmxlCQkJLyogZCAqLywKKyAgICBpbnQqCQkJLyogbm1vbm9fcmV0dXJuICovLAorICAgIFhtYnVmQnVmZmVySW5mbyoqCQkvKiBtb25vX2luZm9fcmV0dXJuICovLAorICAgIGludCoJCQkvKiBuc3RlcmVvX3JldHVybiAqLywKKyAgICBYbWJ1ZkJ1ZmZlckluZm8qKgkJLyogc3RlcmVvX2luZm9fcmV0dXJuICovCispOworCitleHRlcm4gV2luZG93IFhtYnVmQ3JlYXRlU3RlcmVvV2luZG93KAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIFdpbmRvdwkJCS8qIHBhcmVudCAqLywKKyAgICBpbnQJCQkJLyogeCAqLywKKyAgICBpbnQJCQkJLyogeSAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkJLyogaGVpZ2h0ICovLAorICAgIHVuc2lnbmVkIGludAkJLyogYm9yZGVyX3dpZHRoICovLAorICAgIGludAkJCQkvKiBkZXB0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIGNsYXNzICovLAorICAgIFZpc3VhbCoJCQkvKiB2aXN1YWwgKi8sCisgICAgdW5zaWduZWQgbG9uZwkJLyogdmFsdWVtYXNrICovLAorICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzKgkvKiBhdHRyICovLAorICAgIE11bHRpYnVmZmVyKgkJLyogbGVmdHAgKi8sCisgICAgTXVsdGlidWZmZXIqCQkvKiByaWdodHAgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhtYnVmQ2xlYXJCdWZmZXJBcmVhKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIE11bHRpYnVmZmVyCQkJLyogYnVmZmVyICovLAorICAgIGludAkJCQkvKiB4ICovLAorICAgIGludAkJCQkvKiB5ICovLAorICAgIHVuc2lnbmVkIGludAkJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBoZWlnaHQgKi8sCisgICAgQm9vbAkJCS8qIGV4cG9zdXJlcyAqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9NVUxUSUJVRl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9tdWx0aWJ1ZmNvbnN0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL211bHRpYnVmY29uc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDEyMzhjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9tdWx0aWJ1ZmNvbnN0LmgKQEAgLTAsMCArMSw4MyBAQAorLyoKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorICovCisKKyNpZm5kZWYgX01VTFRJQlVGQ09OU1RfSF8KKyNkZWZpbmUgX01VTFRJQlVGQ09OU1RfSF8KKworI2RlZmluZSBNVUxUSUJVRkZFUl9QUk9UT0NPTF9OQU1FICJNdWx0aS1CdWZmZXJpbmciCisKKyNkZWZpbmUgTVVMVElCVUZGRVJfTUFKT1JfVkVSU0lPTgkxCS8qIGN1cnJlbnQgdmVyc2lvbiBudW1iZXJzICovCisjZGVmaW5lIE1VTFRJQlVGRkVSX01JTk9SX1ZFUlNJT04JMQkvKiBoYXMgQ2xlYXJJbWFnZUJ1ZmZlckFyZWEgKi8KKworLyoKKyAqIHVwZGF0ZV9hY3Rpb24gZmllbGQKKyAqLworI2RlZmluZSBNdWx0aWJ1ZmZlclVwZGF0ZUFjdGlvblVuZGVmaW5lZAkwCisjZGVmaW5lIE11bHRpYnVmZmVyVXBkYXRlQWN0aW9uQmFja2dyb3VuZAkxCisjZGVmaW5lIE11bHRpYnVmZmVyVXBkYXRlQWN0aW9uVW50b3VjaGVkCTIKKyNkZWZpbmUgTXVsdGlidWZmZXJVcGRhdGVBY3Rpb25Db3BpZWQJCTMKKworLyoKKyAqIHVwZGF0ZV9oaW50IGZpZWxkCisgKi8KKyNkZWZpbmUgTXVsdGlidWZmZXJVcGRhdGVIaW50RnJlcXVlbnQJCTAKKyNkZWZpbmUgTXVsdGlidWZmZXJVcGRhdGVIaW50SW50ZXJtaXR0ZW50CTEKKyNkZWZpbmUgTXVsdGlidWZmZXJVcGRhdGVIaW50U3RhdGljCQkyCisKKy8qCisgKiB2YWx1ZW1hc2sgZmllbGRzCisgKi8KKyNkZWZpbmUgTXVsdGlidWZmZXJXaW5kb3dVcGRhdGVIaW50CSgxTCA8PCAwKQorI2RlZmluZSBNdWx0aWJ1ZmZlckJ1ZmZlckV2ZW50TWFzawkoMUwgPDwgMCkKKworLyoKKyAqIG1vbm8gdnMuIHN0ZXJlbyBhbmQgbGVmdCB2cy4gcmlnaHQKKyAqLworI2RlZmluZSBNdWx0aWJ1ZmZlck1vZGVNb25vCQkwCisjZGVmaW5lIE11bHRpYnVmZmVyTW9kZVN0ZXJlbwkJMQorI2RlZmluZSBNdWx0aWJ1ZmZlclNpZGVNb25vCQkwCisjZGVmaW5lIE11bHRpYnVmZmVyU2lkZUxlZnQJICAJMQorI2RlZmluZSBNdWx0aWJ1ZmZlclNpZGVSaWdodAkJMgorCisvKgorICogY2xvYmJlciBzdGF0ZQorICovCisjZGVmaW5lIE11bHRpYnVmZmVyVW5jbG9iYmVyZWQJCTAKKyNkZWZpbmUgTXVsdGlidWZmZXJQYXJ0aWFsbHlDbG9iYmVyZWQJMQorI2RlZmluZSBNdWx0aWJ1ZmZlckZ1bGx5Q2xvYmJlcmVkCTIKKworLyoKKyAqIGV2ZW50IHN0dWZmCisgKi8KKyNkZWZpbmUgTXVsdGlidWZmZXJDbG9iYmVyTm90aWZ5TWFzawkweDAyMDAwMDAwCisjZGVmaW5lIE11bHRpYnVmZmVyVXBkYXRlTm90aWZ5TWFzawkweDA0MDAwMDAwCisKKyNkZWZpbmUgTXVsdGlidWZmZXJDbG9iYmVyTm90aWZ5CTAKKyNkZWZpbmUgTXVsdGlidWZmZXJVcGRhdGVOb3RpZnkJCTEKKyNkZWZpbmUgTXVsdGlidWZmZXJOdW1iZXJFdmVudHMJCShNdWx0aWJ1ZmZlclVwZGF0ZU5vdGlmeSArIDEpCisKKyNkZWZpbmUgTXVsdGlidWZmZXJCYWRCdWZmZXIJCTAKKyNkZWZpbmUgTXVsdGlidWZmZXJOdW1iZXJFcnJvcnMJCShNdWx0aWJ1ZmZlckJhZEJ1ZmZlciArIDEpCisKKyNlbmRpZiAvKiBfTVVMVElCVUZDT05TVF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9tdWx0aWJ1ZnByb3RvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL211bHRpYnVmcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjE4NGQzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9tdWx0aWJ1ZnByb3RvLmgKQEAgLTAsMCArMSwyOTUgQEAKKy8qCitDb3B5cmlnaHQgMTk4OSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKyAqLworCisjaWZuZGVmIF9NVUxUSUJVRlBST1RPX0hfCisjZGVmaW5lIF9NVUxUSUJVRlBST1RPX0hfCisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9tdWx0aWJ1ZmNvbnN0Lmg+CisKKy8qCisgKiBQcm90b2NvbCByZXF1ZXN0cyBjb25zdGFudHMgYW5kIGFsaWdubWVudCB2YWx1ZXMKKyAqLworCisjZGVmaW5lIFdpbmRvdyBDQVJEMzIKKyNkZWZpbmUgRHJhd2FibGUgQ0FSRDMyCisjZGVmaW5lIFZpc3VhbElEIENBUkQzMgorI2RlZmluZSBNdWx0aWJ1ZmZlciBDQVJEMzIKKworI2RlZmluZSBYX01idWZHZXRCdWZmZXJWZXJzaW9uCQkwCisjZGVmaW5lIFhfTWJ1ZkNyZWF0ZUltYWdlQnVmZmVycwkxCisjZGVmaW5lIFhfTWJ1ZkRlc3Ryb3lJbWFnZUJ1ZmZlcnMJMgorI2RlZmluZSBYX01idWZEaXNwbGF5SW1hZ2VCdWZmZXJzCTMKKyNkZWZpbmUgWF9NYnVmU2V0TUJ1ZmZlckF0dHJpYnV0ZXMJNAorI2RlZmluZSBYX01idWZHZXRNQnVmZmVyQXR0cmlidXRlcwk1CisjZGVmaW5lIFhfTWJ1ZlNldEJ1ZmZlckF0dHJpYnV0ZXMJNgorI2RlZmluZSBYX01idWZHZXRCdWZmZXJBdHRyaWJ1dGVzCTcKKyNkZWZpbmUgWF9NYnVmR2V0QnVmZmVySW5mbwkJOAorI2RlZmluZSBYX01idWZDcmVhdGVTdGVyZW9XaW5kb3cJOQorI2RlZmluZSBYX01idWZDbGVhckltYWdlQnVmZmVyQXJlYQkxMAorCisKK3R5cGVkZWYgc3RydWN0IHhNYnVmQnVmZmVySW5mbyB7CisJQ0FSRDMyCXZpc3VhbElEIEIzMjsJCS8qIGFzc29jaWF0ZWQgdmlzdWFsICovCisJQ0FSRDE2CW1heEJ1ZmZlcnMgQjE2OwkJLyogbWF4aW11bSBzdXBwb3J0ZWQgYnVmZmVycyAqLworCUNBUkQ4CWRlcHRoOwkJCS8qIGRlcHRoIG9mIHZpc3VhbCAocmVkdW5kYW50KSAqLworCUNBUkQ4CXVudXNlZDsKK30geE1idWZCdWZmZXJJbmZvOworI2RlZmluZSBzel94TWJ1ZkJ1ZmZlckluZm8gOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSAgICB0eXBlOworICAgIEJZVEUgICAgdW51c2VkOworICAgIENBUkQxNiAgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiAgYnVmZmVyIEIzMjsJCQkvKiBhZmZlY3RlZCBidWZmZXIgKi8KKyAgICBCWVRFICAgIHN0YXRlOwkJCS8qIGN1cnJlbnQgc3RhdHVzICovCisgICAgQ0FSRDggICB1bnVzZWQxOworICAgIENBUkQxNiAgdW51c2VkMiBCMTY7CisgICAgQ0FSRDMyICB1bnVzZWQzIEIzMjsKKyAgICBDQVJEMzIgIHVudXNlZDQgQjMyOworICAgIENBUkQzMiAgdW51c2VkNSBCMzI7CisgICAgQ0FSRDMyICB1bnVzZWQ2IEIzMjsKKyAgICBDQVJEMzIgIHVudXNlZDcgQjMyOworfSB4TWJ1ZkNsb2JiZXJOb3RpZnlFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgICAgdHlwZTsKKyAgICBCWVRFICAgIHVudXNlZDsKKyAgICBDQVJEMTYgIHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgIGJ1ZmZlciBCMzI7CQkJLyogYWZmZWN0ZWQgYnVmZmVyICovCisgICAgQ0FSRDMyICB0aW1lU3RhbXAgQjMyOwkJLyogdXBkYXRlIHRpbWUgKi8KKyAgICBDQVJEMzIgIHVudXNlZDEgQjMyOworICAgIENBUkQzMiAgdW51c2VkMiBCMzI7CisgICAgQ0FSRDMyICB1bnVzZWQzIEIzMjsKKyAgICBDQVJEMzIgIHVudXNlZDQgQjMyOworICAgIENBUkQzMiAgdW51c2VkNSBCMzI7CisgICAgQ0FSRDMyICB1bnVzZWQ2IEIzMjsKK30geE1idWZVcGRhdGVOb3RpZnlFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CQkvKiBhbHdheXMgY29kZXMtPm1ham9yX29wY29kZSAqLworICAgIENBUkQ4CW1idWZSZXFUeXBlOwkJLyogYWx3YXlzIFhfTWJ1ZkdldEJ1ZmZlclZlcnNpb24gKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geE1idWZHZXRCdWZmZXJWZXJzaW9uUmVxOworI2RlZmluZSBzel94TWJ1ZkdldEJ1ZmZlclZlcnNpb25SZXEJNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAl1bnVzZWQ7CQkJLyogbm90IHVzZWQgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQ4CW1ham9yVmVyc2lvbjsJLyogbWFqb3IgdmVyc2lvbiBvZiBNdWx0aS1CdWZmZXJpbmcgcHJvdG9jb2wgKi8KKyAgICBDQVJEOAltaW5vclZlcnNpb247CS8qIG1pbm9yIHZlcnNpb24gb2YgTXVsdGktQnVmZmVyaW5nIHByb3RvY29sICovCisgICAgQ0FSRDE2CXBhZDEgQjE2OworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKKyAgICBDQVJEMzIJcGFkNiBCMzI7Cit9IHhNYnVmR2V0QnVmZmVyVmVyc2lvblJlcGx5OworI2RlZmluZSBzel94TWJ1ZkdldEJ1ZmZlclZlcnNpb25SZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOAltYnVmUmVxVHlwZTsJLyogYWx3YXlzIFhfTWJ1ZkNyZWF0ZUltYWdlQnVmZmVycyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMgl3aW5kb3cgQjMyOwkvKiBhc3NvY2lhdGVkIHdpbmRvdyAqLworICAgIENBUkQ4CXVwZGF0ZUFjdGlvbjsJLyogYWN0aW9uIGF0IHVwZGF0ZSAqLworICAgIENBUkQ4CXVwZGF0ZUhpbnQ7CS8qIGhpbnQgYXMgdG8gZnJlcXVlbmN5IG9mIHVwZGF0ZXMgKi8KKyAgICBDQVJEMTYJdW51c2VkOworfSB4TWJ1ZkNyZWF0ZUltYWdlQnVmZmVyc1JlcTsJLyogZm9sbG93ZWQgYnkgYnVmZmVyIGlkcyAqLworI2RlZmluZSBzel94TWJ1ZkNyZWF0ZUltYWdlQnVmZmVyc1JlcQkxMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAl1bnVzZWQ7CQkJLyogbm90IHVzZWQgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNgludW1iZXJCdWZmZXIgQjE2OwkvKiBudW1iZXIgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZCAqLworICAgIENBUkQxNgl1bnVzZWQxIEIxNjsKKyAgICBDQVJEMzIJdW51c2VkMiBCMzI7CisgICAgQ0FSRDMyCXVudXNlZDMgQjMyOworICAgIENBUkQzMgl1bnVzZWQ0IEIzMjsKKyAgICBDQVJEMzIJdW51c2VkNSBCMzI7CisgICAgQ0FSRDMyCXVudXNlZDYgQjMyOworfSB4TWJ1ZkNyZWF0ZUltYWdlQnVmZmVyc1JlcGx5OworI2RlZmluZSBzel94TWJ1ZkNyZWF0ZUltYWdlQnVmZmVyc1JlcGx5IDMyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgY29kZXMtPm1ham9yX29wY29kZSAqLworICAgIENBUkQ4CW1idWZSZXFUeXBlOwkvKiBhbHdheXMgWF9NYnVmRGVzdHJveUltYWdlQnVmZmVycyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMgl3aW5kb3cgQjMyOwkvKiBhc3NvY2lhdGVkIHdpbmRvdyAqLworfSB4TWJ1ZkRlc3Ryb3lJbWFnZUJ1ZmZlcnNSZXE7CisjZGVmaW5lIHN6X3hNYnVmRGVzdHJveUltYWdlQnVmZmVyc1JlcQk4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgY29kZXMtPm1ham9yX29wY29kZSAqLworICAgIENBUkQ4CW1idWZSZXFUeXBlOwkvKiBhbHdheXMgWF9NYnVmRGlzcGxheUltYWdlQnVmZmVycyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNgltaW5EZWxheSBCMTY7CS8qIG1pbmltdW0gdGltZSBiZXR3ZWVuIGxhc3QgdXBkYXRlIGFuZCBub3cgKi8KKyAgICBDQVJEMTYJbWF4RGVsYXkgQjE2OwkvKiBtYXhpbXVtIHRpbWUgYmV0d2VlbiBsYXN0IHVwZGF0ZSBhbmQgbm93ICovCit9IHhNYnVmRGlzcGxheUltYWdlQnVmZmVyc1JlcTsJLyogZm9sbG93ZWQgYnkgbGlzdCBvZiBidWZmZXJzICovCisjZGVmaW5lIHN6X3hNYnVmRGlzcGxheUltYWdlQnVmZmVyc1JlcQk4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgY29kZXMtPm1ham9yX29wY29kZSAqLworICAgIENBUkQ4CW1idWZSZXFUeXBlOwkvKiBhbHdheXMgWF9NYnVmU2V0TUJ1ZmZlckF0dHJpYnV0ZXMgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJd2luZG93IEIzMjsJLyogYXNzb2NpYXRlZCB3aW5kb3cgKi8KKyAgICBDQVJEMzIJdmFsdWVNYXNrIEIzMjsJLyogbW9kaWZpZWQgZW50cmllcyAqLworfSB4TWJ1ZlNldE1CdWZmZXJBdHRyaWJ1dGVzUmVxOwkvKiBmb2xsb3dlZCBieSB2YWx1ZXMgKi8KKyNkZWZpbmUgc3pfeE1idWZTZXRNQnVmZmVyQXR0cmlidXRlc1JlcSAxMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOAltYnVmUmVxVHlwZTsJLyogYWx3YXlzIFhfTWJ1ZkdldE1CdWZmZXJBdHRyaWJ1dGVzICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDMyCXdpbmRvdyBCMzI7CS8qIGFzc29jaWF0ZWQgd2luZG93ICovCit9IHhNYnVmR2V0TUJ1ZmZlckF0dHJpYnV0ZXNSZXE7CisjZGVmaW5lIHN6X3hNYnVmR2V0TUJ1ZmZlckF0dHJpYnV0ZXNSZXEgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAl1bnVzZWQ7CQkJLyogbm90IHVzZWQgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNglkaXNwbGF5ZWRCdWZmZXIgQjE2OwkvKiBjdXJyZW50bHkgdmlzaWJsZSBidWZmZXIgKi8KKyAgICBDQVJEOAl1cGRhdGVBY3Rpb247CisgICAgQ0FSRDgJdXBkYXRlSGludDsKKyAgICBDQVJEOAl3aW5kb3dNb2RlOworICAgIENBUkQ4CXVudXNlZDA7CisgICAgQ0FSRDE2CXVudXNlZDEgQjE2OworICAgIENBUkQzMgl1bnVzZWQyIEIzMjsKKyAgICBDQVJEMzIJdW51c2VkMyBCMzI7CisgICAgQ0FSRDMyCXVudXNlZDQgQjMyOworICAgIENBUkQzMgl1bnVzZWQ1IEIzMjsKK30geE1idWZHZXRNQnVmZmVyQXR0cmlidXRlc1JlcGx5OworI2RlZmluZSBzel94TWJ1ZkdldE1CdWZmZXJBdHRyaWJ1dGVzUmVwbHkgMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBjb2Rlcy0+bWFqb3Jfb3Bjb2RlICovCisgICAgQ0FSRDgJbWJ1ZlJlcVR5cGU7CS8qIGFsd2F5cyBYX01idWZTZXRCdWZmZXJBdHRyaWJ1dGVzICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDMyCWJ1ZmZlciBCMzI7CisgICAgQ0FSRDMyCXZhbHVlTWFzayBCMzI7Cit9IHhNYnVmU2V0QnVmZmVyQXR0cmlidXRlc1JlcTsJLyogZm9sbG93ZWQgYnkgdmFsdWVzICovCisjZGVmaW5lIHN6X3hNYnVmU2V0QnVmZmVyQXR0cmlidXRlc1JlcSAxMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOAltYnVmUmVxVHlwZTsJLyogYWx3YXlzIFhfTWJ1ZkdldEJ1ZmZlckF0dHJpYnV0ZXMgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJYnVmZmVyIEIzMjsKK30geE1idWZHZXRCdWZmZXJBdHRyaWJ1dGVzUmVxOworI2RlZmluZSBzel94TWJ1ZkdldEJ1ZmZlckF0dHJpYnV0ZXNSZXEgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAl1bnVzZWQ7CQkJLyogbm90IHVzZWQgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMgl3aW5kb3cgQjMyOworICAgIENBUkQzMglldmVudE1hc2sgQjMyOworICAgIENBUkQxNglidWZmZXJJbmRleCBCMTY7CisgICAgQ0FSRDgJc2lkZTsKKyAgICBDQVJEOAl1bnVzZWQwOworICAgIENBUkQzMgl1bnVzZWQxIEIzMjsKKyAgICBDQVJEMzIJdW51c2VkMiBCMzI7CisgICAgQ0FSRDMyCXVudXNlZDMgQjMyOworfSB4TWJ1ZkdldEJ1ZmZlckF0dHJpYnV0ZXNSZXBseTsKKyNkZWZpbmUgc3pfeE1idWZHZXRCdWZmZXJBdHRyaWJ1dGVzUmVwbHkgMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBjb2Rlcy0+bWFqb3Jfb3Bjb2RlICovCisgICAgQ0FSRDgJbWJ1ZlJlcVR5cGU7CS8qIGFsd2F5cyBYX01idWZHZXRCdWZmZXJJbmZvICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgRHJhd2FibGUJZHJhd2FibGUgQjMyOworfSB4TWJ1ZkdldEJ1ZmZlckluZm9SZXE7CisjZGVmaW5lIHN6X3hNYnVmR2V0QnVmZmVySW5mb1JlcSA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CXVudXNlZDsJCQkvKiBub3QgdXNlZCAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDE2CW5vcm1hbEluZm8gQjE2OworICAgIENBUkQxNglzdGVyZW9JbmZvIEIxNjsKKyAgICBDQVJEMzIJdW51c2VkMSBCMzI7CisgICAgQ0FSRDMyCXVudXNlZDIgQjMyOworICAgIENBUkQzMgl1bnVzZWQzIEIzMjsKKyAgICBDQVJEMzIJdW51c2VkNCBCMzI7CisgICAgQ0FSRDMyCXVudXNlZDUgQjMyOworfSB4TWJ1ZkdldEJ1ZmZlckluZm9SZXBseTsJCQkvKiBmb2xsb3dlZCBieSBidWZmZXIgaW5mb3MgKi8KKyNkZWZpbmUgc3pfeE1idWZHZXRCdWZmZXJJbmZvUmVwbHkgMzIKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOAltYnVmUmVxVHlwZTsJLyogYWx3YXlzIFhfTWJ1ZkNyZWF0ZVN0ZXJlb1dpbmRvdyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4CXVudXNlZDA7CisgICAgQ0FSRDgJdW51c2VkMTsKKyAgICBDQVJEOAl1bnVzZWQyOworICAgIENBUkQ4CWRlcHRoOworICAgIFdpbmRvdwl3aWQgQjMyOworICAgIFdpbmRvdwlwYXJlbnQgQjMyOworICAgIE11bHRpYnVmZmVyCWxlZnQgQjMyOwkvKiBhc3NvY2lhdGVkIGJ1ZmZlcnMgKi8KKyAgICBNdWx0aWJ1ZmZlcglyaWdodCBCMzI7CisgICAgSU5UMTYJeCBCMTY7CisgICAgSU5UMTYJeSBCMTY7CisgICAgQ0FSRDE2CXdpZHRoIEIxNjsKKyAgICBDQVJEMTYJaGVpZ2h0IEIxNjsKKyAgICBDQVJEMTYJYm9yZGVyV2lkdGggQjE2OworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEMTYJY19jbGFzcyBCMTY7CisjZWxzZQorICAgIENBUkQxNgljbGFzcyBCMTY7CisjZW5kaWYKKyAgICBWaXN1YWxJRAl2aXN1YWwgQjMyOworICAgIENBUkQzMgltYXNrIEIzMjsKK30geE1idWZDcmVhdGVTdGVyZW9XaW5kb3dSZXE7CQkvKiBmb2xsb3dlZCBieSB2YWx1ZSBsaXN0ICovCisjZGVmaW5lIHN6X3hNYnVmQ3JlYXRlU3RlcmVvV2luZG93UmVxIDQ0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgICAgcmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBjb2Rlcy0+bWFqb3Jfb3Bjb2RlICovCisgICAgQ0FSRDggICAgIG1idWZSZXFUeXBlOyAgICAvKiBhbHdheXMgWF9NYnVmQ2xlYXJJbWFnZUJ1ZmZlckFyZWEgKi8KKyAgICBDQVJEMTYgICAgbGVuZ3RoIEIxNjsKKyAgICBNdWx0aWJ1ZmZlciAgICAgICBidWZmZXIgQjMyOworICAgIElOVDE2ICAgICB4IEIxNjsKKyAgICBJTlQxNiAgICAgeSBCMTY7CisgICAgQ0FSRDE2ICAgIHdpZHRoIEIxNjsKKyAgICBDQVJEMTYgICAgaGVpZ2h0IEIxNjsKKyAgICBDQVJEOCAgICAgdW51c2VkMDsKKyAgICBDQVJEOCAgICAgdW51c2VkMTsKKyAgICBDQVJEOCAgICAgdW51c2VkMjsKKyAgICBCT09MICAgICAgZXhwb3N1cmVzOworfSB4TWJ1ZkNsZWFySW1hZ2VCdWZmZXJBcmVhUmVxOworI2RlZmluZSBzel94TWJ1ZkNsZWFySW1hZ2VCdWZmZXJBcmVhUmVxIDIwCisKKyN1bmRlZiBXaW5kb3cKKyN1bmRlZiBEcmF3YWJsZQorI3VuZGVmIFZpc3VhbElECisjdW5kZWYgTXVsdGlidWZmZXIKKworI2VuZGlmIC8qIF9NVUxUSUJVRlBST1RPX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NlY3VyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NlY3VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyN2IyOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2VjdXIuaApAQCAtMCwwICsxLDYxIEBACisvKgorQ29weXJpZ2h0IDE5OTYsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKK2luIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKK09USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCitPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsCitub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yCitvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uCitmcm9tIFRoZSBPcGVuIEdyb3VwLgorKi8KKworI2lmbmRlZiBfU0VDVVJfSAorI2RlZmluZSBfU0VDVVJfSAorCisjZGVmaW5lIFNFQ1VSSVRZX0VYVEVOU0lPTl9OQU1FCQkiU0VDVVJJVFkiCisjZGVmaW5lIFNFQ1VSSVRZX01BSk9SX1ZFUlNJT04JCTEKKyNkZWZpbmUgU0VDVVJJVFlfTUlOT1JfVkVSU0lPTgkJMAorCisjZGVmaW5lIFhTZWN1cml0eU51bWJlckV2ZW50cwkJMQorI2RlZmluZSBYU2VjdXJpdHlOdW1iZXJFcnJvcnMJCTIKKyNkZWZpbmUgWFNlY3VyaXR5QmFkQXV0aG9yaXphdGlvbgkwCisjZGVmaW5lIFhTZWN1cml0eUJhZEF1dGhvcml6YXRpb25Qcm90b2NvbCAxCisKKy8qIHRydXN0IGxldmVscyAqLworI2RlZmluZSBYU2VjdXJpdHlDbGllbnRUcnVzdGVkCQkwCisjZGVmaW5lIFhTZWN1cml0eUNsaWVudFVudHJ1c3RlZAkxCisKKy8qIGF1dGhvcml6YXRpb24gYXR0cmlidXRlIG1hc2tzICovCisjZGVmaW5lIFhTZWN1cml0eVRpbWVvdXQJCSgxPDwwKQorI2RlZmluZSBYU2VjdXJpdHlUcnVzdExldmVsCQkoMTw8MSkKKyNkZWZpbmUgWFNlY3VyaXR5R3JvdXAgIAkJKDE8PDIpCisjZGVmaW5lIFhTZWN1cml0eUV2ZW50TWFzawkJKDE8PDMpCisjZGVmaW5lIFhTZWN1cml0eUFsbEF1dGhvcml6YXRpb25BdHRyaWJ1dGVzIFwKKyAoWFNlY3VyaXR5VGltZW91dCB8IFhTZWN1cml0eVRydXN0TGV2ZWwgfCBYU2VjdXJpdHlHcm91cCB8IFhTZWN1cml0eUV2ZW50TWFzaykKKworLyogZXZlbnQgbWFza3MgKi8KKyNkZWZpbmUgWFNlY3VyaXR5QXV0aG9yaXphdGlvblJldm9rZWRNYXNrICgxPDwwKQorI2RlZmluZSBYU2VjdXJpdHlBbGxFdmVudE1hc2tzIFhTZWN1cml0eUF1dGhvcml6YXRpb25SZXZva2VkTWFzaworCisvKiBldmVudCBvZmZzZXRzICovCisjZGVmaW5lIFhTZWN1cml0eUF1dGhvcml6YXRpb25SZXZva2VkIDAKKworI2RlZmluZSBYU2VjdXJpdHlBdXRob3JpemF0aW9uTmFtZQkiWEMtUVVFUlktU0VDVVJJVFktMSIKKyNkZWZpbmUgWFNlY3VyaXR5QXV0aG9yaXphdGlvbk5hbWVMZW4JMTkKKworI2VuZGlmIC8qIF9TRUNVUl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NlY3VyaXR5LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NlY3VyaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1NDEzMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2VjdXJpdHkuaApAQCAtMCwwICsxLDc3IEBACisvKgorQ29weXJpZ2h0IDE5OTYsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKK2luIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKK09USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCitPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsCitub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yCitvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uCitmcm9tIFRoZSBPcGVuIEdyb3VwLgorKi8KKworI2lmbmRlZiBfU0VDVVJJVFlfSAorI2RlZmluZSBfU0VDVVJJVFlfSAorCisjZGVmaW5lIF9YQVVUSF9TVFJVQ1RfT05MWQorI2luY2x1ZGUgPFgxMS9YYXV0aC5oPgorCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvc2VjdXIuaD4KKworX1hGVU5DUFJPVE9CRUdJTgorCitTdGF0dXMgWFNlY3VyaXR5UXVlcnlFeHRlbnNpb24gKAorICAgIERpc3BsYXkgKmRweSwKKyAgICBpbnQgKm1ham9yX3ZlcnNpb25fcmV0dXJuLAorICAgIGludCAqbWlub3JfdmVyc2lvbl9yZXR1cm4pOworCitYYXV0aCAqWFNlY3VyaXR5QWxsb2NYYXV0aCh2b2lkKTsKKwordm9pZCBYU2VjdXJpdHlGcmVlWGF1dGgoWGF1dGggKmF1dGgpOworCisvKiB0eXBlIGZvciByZXR1cm5lZCBhdXRoIGlkcyAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFhTZWN1cml0eUF1dGhvcml6YXRpb247CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgdGltZW91dDsKKyAgICB1bnNpZ25lZCBpbnQgdHJ1c3RfbGV2ZWw7CisgICAgWElEICAgICAgICAgIGdyb3VwOworICAgIGxvbmcJIGV2ZW50X21hc2s7Cit9IFhTZWN1cml0eUF1dGhvcml6YXRpb25BdHRyaWJ1dGVzOworCitYYXV0aCAqWFNlY3VyaXR5R2VuZXJhdGVBdXRob3JpemF0aW9uKAorICAgIERpc3BsYXkgKmRweSwKKyAgICBYYXV0aCAqYXV0aF9pbiwKKyAgICB1bnNpZ25lZCBsb25nIHZhbHVlbWFzaywKKyAgICBYU2VjdXJpdHlBdXRob3JpemF0aW9uQXR0cmlidXRlcyAqYXR0cmlidXRlcywKKyAgICBYU2VjdXJpdHlBdXRob3JpemF0aW9uICphdXRoX2lkX3JldHVybik7CisKK1N0YXR1cyBYU2VjdXJpdHlSZXZva2VBdXRob3JpemF0aW9uKAorICAgIERpc3BsYXkgKmRweSwKKyAgICBYU2VjdXJpdHlBdXRob3JpemF0aW9uIGF1dGhfaWQpOworCitfWEZVTkNQUk9UT0VORAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHR5cGU7CQkgICAgICAvKiBldmVudCBiYXNlICsgWFNlY3VyaXR5QXV0aG9yaXphdGlvblJldm9rZWQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sIHNlbmRfZXZlbnQ7CSAgICAgIC8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgKmRpc3BsYXk7CSAgICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBYU2VjdXJpdHlBdXRob3JpemF0aW9uIGF1dGhfaWQ7IC8qIHJldm9rZWQgYXV0aG9yaXphdGlvbiBpZCAqLworfSBYU2VjdXJpdHlBdXRob3JpemF0aW9uUmV2b2tlZEV2ZW50OworCisjZW5kaWYgLyogX1NFQ1VSSVRZX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2VjdXJwcm90by5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zZWN1cnByb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5YTRjNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2VjdXJwcm90by5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorQ29weXJpZ2h0IDE5OTYsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKK2luIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKK09USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCitPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsCitub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yCitvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uCitmcm9tIFRoZSBPcGVuIEdyb3VwLgorKi8KKworI2lmbmRlZiBfU0VDVVJQUk9UT19ICisjZGVmaW5lIF9TRUNVUlBST1RPX0gKKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL3NlY3VyLmg+CisKKyNkZWZpbmUgWF9TZWN1cml0eVF1ZXJ5VmVyc2lvbgkJMAorI2RlZmluZSBYX1NlY3VyaXR5R2VuZXJhdGVBdXRob3JpemF0aW9uIDEKKyNkZWZpbmUgWF9TZWN1cml0eVJldm9rZUF1dGhvcml6YXRpb24gICAyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgICAgICByZXFUeXBlOworICAgIENBUkQ4ICAgICAgIHNlY3VyaXR5UmVxVHlwZTsKKyAgICBDQVJEMTYgICAgICBsZW5ndGggQjE2OworICAgIENBUkQxNiAgICAgIG1ham9yVmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2ICAgICAgbWlub3JWZXJzaW9uIEIxNjsKK30geFNlY3VyaXR5UXVlcnlWZXJzaW9uUmVxOworI2RlZmluZSBzel94U2VjdXJpdHlRdWVyeVZlcnNpb25SZXEgCTgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgdHlwZTsKKyAgICBDQVJEOCAgIHBhZDA7CisgICAgQ0FSRDE2ICBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyICBsZW5ndGgJIEIzMjsKKyAgICBDQVJEMTYgIG1ham9yVmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2ICBtaW5vclZlcnNpb24gQjE2OworICAgIENBUkQzMiAgcGFkMQkgQjMyOworICAgIENBUkQzMiAgcGFkMgkgQjMyOworICAgIENBUkQzMiAgcGFkMwkgQjMyOworICAgIENBUkQzMiAgcGFkNAkgQjMyOworICAgIENBUkQzMiAgcGFkNQkgQjMyOworIH0geFNlY3VyaXR5UXVlcnlWZXJzaW9uUmVwbHk7CisjZGVmaW5lIHN6X3hTZWN1cml0eVF1ZXJ5VmVyc2lvblJlcGx5ICAJMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgICAgIHJlcVR5cGU7CisgICAgQ0FSRDggICAgICAgc2VjdXJpdHlSZXFUeXBlOworICAgIENBUkQxNiAgICAgIGxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CW5ieXRlc0F1dGhQcm90byBCMTY7CisgICAgQ0FSRDE2CW5ieXRlc0F1dGhEYXRhIEIxNjsKKyAgICBDQVJEMzIJdmFsdWVNYXNrIEIzMjsKKyAgICAvKiBhdXRoIHByb3RvY29sIG5hbWUgcGFkZGVkIHRvIDQgYnl0ZXMgKi8KKyAgICAvKiBhdXRoIHByb3RvY29sIGRhdGEgcGFkZGVkIHRvIDQgYnl0ZXMgKi8KKyAgICAvKiBsaXN0IG9mIENBUkQzMiB2YWx1ZXMsIGlmIGFueSAqLworfSB4U2VjdXJpdHlHZW5lcmF0ZUF1dGhvcml6YXRpb25SZXE7CisjZGVmaW5lIHN6X3hTZWN1cml0eUdlbmVyYXRlQXV0aG9yaXphdGlvblJlcSAxMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICB0eXBlOworICAgIENBUkQ4ICAgcGFkMDsKKyAgICBDQVJEMTYgIHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgIGxlbmd0aAkgQjMyOworICAgIENBUkQzMiAgYXV0aElkCSBCMzI7CisgICAgQ0FSRDE2ICBkYXRhTGVuZ3RoICAgQjE2OworICAgIENBUkQxNiAgcGFkMQkgQjE2OworICAgIENBUkQzMiAgcGFkMgkgQjMyOworICAgIENBUkQzMiAgcGFkMwkgQjMyOworICAgIENBUkQzMiAgcGFkNAkgQjMyOworICAgIENBUkQzMiAgcGFkNQkgQjMyOworIH0geFNlY3VyaXR5R2VuZXJhdGVBdXRob3JpemF0aW9uUmVwbHk7CisjZGVmaW5lIHN6X3hTZWN1cml0eUdlbmVyYXRlQXV0aG9yaXphdGlvblJlcGx5ICAJMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgICAgIHJlcVR5cGU7CisgICAgQ0FSRDggICAgICAgc2VjdXJpdHlSZXFUeXBlOworICAgIENBUkQxNiAgICAgIGxlbmd0aCBCMTY7CisgICAgQ0FSRDMyCWF1dGhJZCBCMzI7Cit9IHhTZWN1cml0eVJldm9rZUF1dGhvcml6YXRpb25SZXE7CisjZGVmaW5lIHN6X3hTZWN1cml0eVJldm9rZUF1dGhvcml6YXRpb25SZXEgOAorCit0eXBlZGVmIHN0cnVjdCBfeFNlY3VyaXR5QXV0aG9yaXphdGlvblJldm9rZWRFdmVudCB7CisgICAgQllURQl0eXBlOworICAgIEJZVEUJZGV0YWlsOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWF1dGhJZCBCMzI7CisgICAgQ0FSRDMyCXBhZDAJIEIzMjsKKyAgICBDQVJEMzIJcGFkMQkgQjMyOworICAgIENBUkQzMglwYWQyCSBCMzI7CisgICAgQ0FSRDMyCXBhZDMJIEIzMjsKKyAgICBDQVJEMzIJcGFkNAkgQjMyOworICAgIENBUkQzMglwYWQ1CSBCMzI7Cit9IHhTZWN1cml0eUF1dGhvcml6YXRpb25SZXZva2VkRXZlbnQ7CisjZGVmaW5lIHN6X3hTZWN1cml0eUF1dGhvcml6YXRpb25SZXZva2VkRXZlbnQgMzIKKworI2VuZGlmIC8qIF9TRUNVUlBST1RPX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2hhcGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2hhcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmFmNWIxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zaGFwZS5oCkBAIC0wLDAgKzEsMTUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfU0hBUEVfSF8KKyNkZWZpbmUgX1NIQVBFX0hfCisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL3NoYXBlY29uc3QuaD4KKworI2lmbmRlZiBfU0hBUEVfU0VSVkVSXworI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50CXR5cGU7CQkgICAgLyogb2YgZXZlbnQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCBzZW5kX2V2ZW50OwkgICAgLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbWUgYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgKmRpc3BsYXk7CSAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgV2luZG93IHdpbmRvdzsJICAgIC8qIHdpbmRvdyBvZiBldmVudCAqLworICAgIGludCBraW5kOwkJICAgIC8qIFNoYXBlQm91bmRpbmcgb3IgU2hhcGVDbGlwICovCisgICAgaW50IHgsIHk7CQkgICAgLyogZXh0ZW50cyBvZiBuZXcgcmVnaW9uICovCisgICAgdW5zaWduZWQgd2lkdGgsIGhlaWdodDsKKyAgICBUaW1lIHRpbWU7CQkgICAgLyogc2VydmVyIHRpbWVzdGFtcCB3aGVuIHJlZ2lvbiBjaGFuZ2VkICovCisgICAgQm9vbCBzaGFwZWQ7CSAgICAvKiB0cnVlIGlmIHRoZSByZWdpb24gZXhpc3RzICovCit9IFhTaGFwZUV2ZW50OworCitfWEZVTkNQUk9UT0JFR0lOCisKK2V4dGVybiBCb29sIFhTaGFwZVF1ZXJ5RXh0ZW5zaW9uICgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIGludCoJLyogZXZlbnRfYmFzZSAqLywKKyAgICBpbnQqCS8qIGVycm9yX2Jhc2UgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFNoYXBlUXVlcnlWZXJzaW9uICgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIGludCoJLyogbWFqb3JfdmVyc2lvbiAqLywKKyAgICBpbnQqCS8qIG1pbm9yX3ZlcnNpb24gKi8KKyk7CisKK2V4dGVybiB2b2lkIFhTaGFwZUNvbWJpbmVSZWdpb24gKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CS8qIGRlc3QgKi8sCisgICAgaW50CQkvKiBkZXN0X2tpbmQgKi8sCisgICAgaW50CQkvKiB4X29mZiAqLywKKyAgICBpbnQJCS8qIHlfb2ZmICovLAorICAgIFJlZ2lvbgkvKiByZWdpb24gKi8sCisgICAgaW50CQkvKiBvcCAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNoYXBlQ29tYmluZVJlY3RhbmdsZXMgKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CS8qIGRlc3QgKi8sCisgICAgaW50CQkvKiBkZXN0X2tpbmQgKi8sCisgICAgaW50CQkvKiB4X29mZiAqLywKKyAgICBpbnQJCS8qIHlfb2ZmICovLAorICAgIFhSZWN0YW5nbGUqCS8qIHJlY3RhbmdsZXMgKi8sCisgICAgaW50CQkvKiBuX3JlY3RzICovLAorICAgIGludAkJLyogb3AgKi8sCisgICAgaW50CQkvKiBvcmRlcmluZyAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNoYXBlQ29tYmluZU1hc2sgKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CS8qIGRlc3QgKi8sCisgICAgaW50CQkvKiBkZXN0X2tpbmQgKi8sCisgICAgaW50CQkvKiB4X29mZiAqLywKKyAgICBpbnQJCS8qIHlfb2ZmICovLAorICAgIFBpeG1hcAkvKiBzcmMgKi8sCisgICAgaW50CQkvKiBvcCAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNoYXBlQ29tYmluZVNoYXBlICgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkvKiBkZXN0ICovLAorICAgIGludAkJLyogZGVzdF9raW5kICovLAorICAgIGludAkJLyogeF9vZmYgKi8sCisgICAgaW50CQkvKiB5X29mZiAqLywKKyAgICBXaW5kb3cJLyogc3JjICovLAorICAgIGludAkJLyogc3JjX2tpbmQgKi8sCisgICAgaW50CQkvKiBvcCAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNoYXBlT2Zmc2V0U2hhcGUgKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CS8qIGRlc3QgKi8sCisgICAgaW50CQkvKiBkZXN0X2tpbmQgKi8sCisgICAgaW50CQkvKiB4X29mZiAqLywKKyAgICBpbnQJCS8qIHlfb2ZmICovCispOworCitleHRlcm4gU3RhdHVzIFhTaGFwZVF1ZXJ5RXh0ZW50cyAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3aW5kb3cgKi8sCisgICAgQm9vbCoJCS8qIGJvdW5kaW5nX3NoYXBlZCAqLywKKyAgICBpbnQqCQkvKiB4X2JvdW5kaW5nICovLAorICAgIGludCoJCS8qIHlfYm91bmRpbmcgKi8sCisgICAgdW5zaWduZWQgaW50KgkvKiB3X2JvdW5kaW5nICovLAorICAgIHVuc2lnbmVkIGludCoJLyogaF9ib3VuZGluZyAqLywKKyAgICBCb29sKgkJLyogY2xpcF9zaGFwZWQgKi8sCisgICAgaW50KgkJLyogeF9jbGlwICovLAorICAgIGludCoJCS8qIHlfY2xpcCAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIHdfY2xpcCAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIGhfY2xpcCAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNoYXBlU2VsZWN0SW5wdXQgKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogd2luZG93ICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogbWFzayAqLworKTsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgWFNoYXBlSW5wdXRTZWxlY3RlZCAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJLyogd2luZG93ICovCispOworCitleHRlcm4gWFJlY3RhbmdsZSAqWFNoYXBlR2V0UmVjdGFuZ2xlcyAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJLyogd2luZG93ICovLAorICAgIGludAkJLyoga2luZCAqLywKKyAgICBpbnQqCS8qIGNvdW50ICovLAorICAgIGludCoJLyogb3JkZXJpbmcgKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZiAvKiAhX1NIQVBFX1NFUlZFUl8gKi8KKworI2VuZGlmIC8qIF9TSEFQRV9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zaGFwZWNvbnN0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NoYXBlY29uc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDg4OTU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zaGFwZWNvbnN0LmgKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4OSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1NIQVBFQ09OU1RfSF8KKyNkZWZpbmUgX1NIQVBFQ09OU1RfSF8KKworLyoKKyAqIFByb3RvY29sIHJlcXVlc3RzIGNvbnN0YW50cyBhbmQgYWxpZ25tZW50IHZhbHVlcworICogVGhlc2Ugd291bGQgcmVhbGx5IGJlIGluIFNIQVBFJ3MgWC5oIGFuZCBYcHJvdG8uaCBlcXVpdmFsZW50cworICovCisKKyNkZWZpbmUgU0hBUEVOQU1FICJTSEFQRSIKKworI2RlZmluZSBTSEFQRV9NQUpPUl9WRVJTSU9OCTEJLyogY3VycmVudCB2ZXJzaW9uIG51bWJlcnMgKi8KKyNkZWZpbmUgU0hBUEVfTUlOT1JfVkVSU0lPTgkxCisKKyNkZWZpbmUgU2hhcGVTZXQJCQkwCisjZGVmaW5lIFNoYXBlVW5pb24JCQkxCisjZGVmaW5lIFNoYXBlSW50ZXJzZWN0CQkJMgorI2RlZmluZSBTaGFwZVN1YnRyYWN0CQkJMworI2RlZmluZSBTaGFwZUludmVydAkJCTQKKworI2RlZmluZSBTaGFwZUJvdW5kaW5nCQkJMAorI2RlZmluZSBTaGFwZUNsaXAJCQkxCisjZGVmaW5lIFNoYXBlSW5wdXQJCQkyCisKKyNkZWZpbmUgU2hhcGVOb3RpZnlNYXNrCQkJKDFMIDw8IDApCisjZGVmaW5lIFNoYXBlTm90aWZ5CQkJMAorCisjZGVmaW5lIFNoYXBlTnVtYmVyRXZlbnRzCQkoU2hhcGVOb3RpZnkgKyAxKQorCisjZW5kaWYgLyogX1NIQVBFQ09OU1RfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2hhcGVwcm90by5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zaGFwZXByb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDliZDFhMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2hhcGVwcm90by5oCkBAIC0wLDAgKzEsMjM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfU0hBUEVQUk9UT19IXworI2RlZmluZSBfU0hBUEVQUk9UT19IXworCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvc2hhcGVjb25zdC5oPgorCisvKgorICogUHJvdG9jb2wgcmVxdWVzdHMgY29uc3RhbnRzIGFuZCBhbGlnbm1lbnQgdmFsdWVzCisgKiBUaGVzZSB3b3VsZCByZWFsbHkgYmUgaW4gU0hBUEUncyBYLmggYW5kIFhwcm90by5oIGVxdWl2YWxlbnRzCisgKi8KKworI2RlZmluZSBXaW5kb3cgQ0FSRDMyCisjZGVmaW5lIFRpbWUgQ0FSRDMyCisKKyNkZWZpbmUgWF9TaGFwZVF1ZXJ5VmVyc2lvbgkJMAorI2RlZmluZSBYX1NoYXBlUmVjdGFuZ2xlcwkJMQorI2RlZmluZSBYX1NoYXBlTWFzawkJCTIKKyNkZWZpbmUgWF9TaGFwZUNvbWJpbmUJCQkzCisjZGVmaW5lIFhfU2hhcGVPZmZzZXQJCQk0CisjZGVmaW5lIFhfU2hhcGVRdWVyeUV4dGVudHMJCTUKKyNkZWZpbmUgWF9TaGFwZVNlbGVjdElucHV0CQk2CisjZGVmaW5lIFhfU2hhcGVJbnB1dFNlbGVjdGVkCQk3CisjZGVmaW5lIFhfU2hhcGVHZXRSZWN0YW5nbGVzCQk4CisKK3R5cGVkZWYgc3RydWN0IF9TaGFwZVF1ZXJ5VmVyc2lvbiB7CisJQ0FSRDgJcmVxVHlwZTsJCS8qIGFsd2F5cyBTaGFwZVJlcUNvZGUgKi8KKwlDQVJEOAlzaGFwZVJlcVR5cGU7CQkvKiBhbHdheXMgWF9TaGFwZVF1ZXJ5VmVyc2lvbiAqLworCUNBUkQxNglsZW5ndGggQjE2OworfSB4U2hhcGVRdWVyeVZlcnNpb25SZXE7CisjZGVmaW5lIHN6X3hTaGFwZVF1ZXJ5VmVyc2lvblJlcQk0CisKK3R5cGVkZWYgc3RydWN0IHsKKwlCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworCUNBUkQ4CXVudXNlZDsJCQkvKiBub3QgdXNlZCAqLworCUNBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisJQ0FSRDMyCWxlbmd0aCBCMzI7CisJQ0FSRDE2CW1ham9yVmVyc2lvbiBCMTY7CS8qIG1ham9yIHZlcnNpb24gb2YgU0hBUEUgcHJvdG9jb2wgKi8KKwlDQVJEMTYJbWlub3JWZXJzaW9uIEIxNjsJLyogbWlub3IgdmVyc2lvbiBvZiBTSEFQRSBwcm90b2NvbCAqLworCUNBUkQzMglwYWQwIEIzMjsKKwlDQVJEMzIJcGFkMSBCMzI7CisJQ0FSRDMyCXBhZDIgQjMyOworCUNBUkQzMglwYWQzIEIzMjsKKwlDQVJEMzIJcGFkNCBCMzI7Cit9IHhTaGFwZVF1ZXJ5VmVyc2lvblJlcGx5OworI2RlZmluZSBzel94U2hhcGVRdWVyeVZlcnNpb25SZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfU2hhcGVSZWN0YW5nbGVzIHsKKwlDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgU2hhcGVSZXFDb2RlICovCisJQ0FSRDgJc2hhcGVSZXFUeXBlOwkvKiBhbHdheXMgWF9TaGFwZVJlY3RhbmdsZXMgKi8KKwlDQVJEMTYJbGVuZ3RoIEIxNjsKKwlDQVJEOAlvcDsJCS8qIFNldCwgLi4uICovCisJQ0FSRDgJZGVzdEtpbmQ7CS8qIFNoYXBlQm91bmRpbmcgb3IgU2hhcGVDbGlwICovCisJQ0FSRDgJb3JkZXJpbmc7CS8qIFVuU29ydGVkLCBZU29ydGVkLCBZWFNvcnRlZCwgWVhCYW5kZWQgKi8KKwlDQVJEOAlwYWQwOwkJLyogbm90IHVzZWQgKi8KKwlXaW5kb3cJZGVzdCBCMzI7CisJSU5UMTYJeE9mZiBCMTY7CisJSU5UMTYJeU9mZiBCMTY7Cit9IHhTaGFwZVJlY3RhbmdsZXNSZXE7CQkvKiBmb2xsb3dlZCBieSB4UmVjdHMgKi8KKyNkZWZpbmUgc3pfeFNoYXBlUmVjdGFuZ2xlc1JlcQkxNgorCit0eXBlZGVmIHN0cnVjdCBfU2hhcGVNYXNrIHsKKwlDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgU2hhcGVSZXFDb2RlICovCisJQ0FSRDgJc2hhcGVSZXFUeXBlOwkvKiBhbHdheXMgWF9TaGFwZU1hc2sgKi8KKwlDQVJEMTYJbGVuZ3RoIEIxNjsKKworCUNBUkQ4CW9wOwkJLyogU2V0LCAuLi4gKi8KKwlDQVJEOAlkZXN0S2luZDsJLyogU2hhcGVCb3VuZGluZyBvciBTaGFwZUNsaXAgKi8KKwlDQVJEMTYJanVuayBCMTY7CS8qIG5vdCB1c2VkICovCisKKwlXaW5kb3cJZGVzdCBCMzI7CisJSU5UMTYJeE9mZiBCMTY7CisJSU5UMTYJeU9mZiBCMTY7CisJQ0FSRDMyCXNyYyBCMzI7CS8qIDEgYml0IHBpeG1hcCAqLworfSB4U2hhcGVNYXNrUmVxOworI2RlZmluZSBzel94U2hhcGVNYXNrUmVxCTIwCisKK3R5cGVkZWYgc3RydWN0IF9TaGFwZUNvbWJpbmUgeworCUNBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBTaGFwZVJlcUNvZGUgKi8KKwlDQVJEOAlzaGFwZVJlcVR5cGU7CS8qIGFsd2F5cyBYX1NoYXBlQ29tYmluZSAqLworCUNBUkQxNglsZW5ndGggQjE2OworCUNBUkQ4CW9wOwkJLyogU2V0LCAuLi4gKi8KKwlDQVJEOAlkZXN0S2luZDsJLyogU2hhcGVCb3VuZGluZyBvciBTaGFwZUNsaXAgKi8KKwlDQVJEOAlzcmNLaW5kOwkvKiBTaGFwZUJvdW5kaW5nIG9yIFNoYXBlQ2xpcCAqLworCUNBUkQ4CWp1bms7CQkvKiBub3QgdXNlZCAqLworCVdpbmRvdwlkZXN0IEIzMjsKKwlJTlQxNgl4T2ZmIEIxNjsKKwlJTlQxNgl5T2ZmIEIxNjsKKwlXaW5kb3cJc3JjIEIzMjsKK30geFNoYXBlQ29tYmluZVJlcTsKKyNkZWZpbmUgc3pfeFNoYXBlQ29tYmluZVJlcQkyMAorCit0eXBlZGVmIHN0cnVjdCBfU2hhcGVPZmZzZXQgeworCUNBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBTaGFwZVJlcUNvZGUgKi8KKwlDQVJEOAlzaGFwZVJlcVR5cGU7CS8qIGFsd2F5cyBYX1NoYXBlT2Zmc2V0ICovCisJQ0FSRDE2CWxlbmd0aCBCMTY7CisJQ0FSRDgJZGVzdEtpbmQ7CS8qIFNoYXBlQm91bmRpbmcgb3IgU2hhcGVDbGlwICovCisJQ0FSRDgJanVuazE7CQkvKiBub3QgdXNlZCAqLworCUNBUkQxNglqdW5rMiBCMTY7CS8qIG5vdCB1c2VkICovCisJV2luZG93CWRlc3QgQjMyOworCUlOVDE2CXhPZmYgQjE2OworCUlOVDE2CXlPZmYgQjE2OworfSB4U2hhcGVPZmZzZXRSZXE7CisjZGVmaW5lIHN6X3hTaGFwZU9mZnNldFJlcQkxNgorCit0eXBlZGVmIHN0cnVjdCBfU2hhcGVRdWVyeUV4dGVudHMgeworCUNBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBTaGFwZVJlcUNvZGUgKi8KKwlDQVJEOAlzaGFwZVJlcVR5cGU7CS8qIGFsd2F5cyBYX1NoYXBlUXVlcnlFeHRlbnRzICovCisJQ0FSRDE2CWxlbmd0aCBCMTY7CisJV2luZG93CXdpbmRvdyBCMzI7Cit9IHhTaGFwZVF1ZXJ5RXh0ZW50c1JlcTsKKyNkZWZpbmUgc3pfeFNoYXBlUXVlcnlFeHRlbnRzUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgeworCUJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisJQ0FSRDgJdW51c2VkOwkJCS8qIG5vdCB1c2VkICovCisJQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKwlDQVJEMzIJbGVuZ3RoIEIzMjsJCS8qIDAgKi8KKwlDQVJEOAlib3VuZGluZ1NoYXBlZDsJCS8qIHdpbmRvdyBoYXMgYm91bmRpbmcgc2hhcGUgKi8KKwlDQVJEOAljbGlwU2hhcGVkOwkJLyogd2luZG93IGhhcyBjbGlwIHNoYXBlICovCisJQ0FSRDE2CXVudXNlZDEgQjE2OworCUlOVDE2CXhCb3VuZGluZ1NoYXBlIEIxNjsJLyogZXh0ZW50cyBvZiBib3VuZGluZyBzaGFwZSAqLworCUlOVDE2CXlCb3VuZGluZ1NoYXBlIEIxNjsKKwlDQVJEMTYJd2lkdGhCb3VuZGluZ1NoYXBlIEIxNjsKKwlDQVJEMTYJaGVpZ2h0Qm91bmRpbmdTaGFwZSBCMTY7CisJSU5UMTYJeENsaXBTaGFwZSBCMTY7CQkvKiBleHRlbnRzIG9mIGNsaXAgc2hhcGUgKi8KKwlJTlQxNgl5Q2xpcFNoYXBlIEIxNjsKKwlDQVJEMTYJd2lkdGhDbGlwU2hhcGUgQjE2OworCUNBUkQxNgloZWlnaHRDbGlwU2hhcGUgQjE2OworCUNBUkQzMglwYWQxIEIzMjsKK30geFNoYXBlUXVlcnlFeHRlbnRzUmVwbHk7CisjZGVmaW5lIHN6X3hTaGFwZVF1ZXJ5RXh0ZW50c1JlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF9TaGFwZVNlbGVjdElucHV0IHsKKwlDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgU2hhcGVSZXFDb2RlICovCisJQ0FSRDgJc2hhcGVSZXFUeXBlOwkvKiBhbHdheXMgWF9TaGFwZVNlbGVjdElucHV0ICovCisJQ0FSRDE2CWxlbmd0aCBCMTY7CisJV2luZG93CXdpbmRvdyBCMzI7CisJQllURQllbmFibGU7CQkvKiB4VHJ1ZSAtPiBzZW5kIGV2ZW50cyAqLworCUJZVEUJcGFkMTsKKwlDQVJEMTYJcGFkMiBCMTY7Cit9IHhTaGFwZVNlbGVjdElucHV0UmVxOworI2RlZmluZSBzel94U2hhcGVTZWxlY3RJbnB1dFJlcQkxMgorCit0eXBlZGVmIHN0cnVjdCBfU2hhcGVOb3RpZnkgeworCUJZVEUJdHlwZTsJCS8qIGFsd2F5cyBldmVudEJhc2UgKyBTaGFwZU5vdGlmeSAqLworCUJZVEUJa2luZDsJCS8qIGVpdGhlciBTaGFwZUJvdW5kaW5nIG9yIFNoYXBlQ2xpcCAqLworCUNBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisJV2luZG93CXdpbmRvdyBCMzI7CisJSU5UMTYJeCBCMTY7CisJSU5UMTYJeSBCMTY7CQkvKiBleHRlbnRzIG9mIG5ldyBzaGFwZSAqLworCUNBUkQxNgl3aWR0aCBCMTY7CisJQ0FSRDE2CWhlaWdodCBCMTY7CisJVGltZQl0aW1lIEIzMjsJLyogdGltZSBvZiBjaGFuZ2UgKi8KKwlCWVRFCXNoYXBlZDsJCS8qIHNldCB3aGVuIGEgc2hhcGUgYWN0dWFsIGV4aXN0cyAqLworCUJZVEUJcGFkMDsKKwlDQVJEMTYJcGFkMSBCMTY7CisJQ0FSRDMyCXBhZDIgQjMyOworCUNBUkQzMglwYWQzIEIzMjsKK30geFNoYXBlTm90aWZ5RXZlbnQ7CisjZGVmaW5lIHN6X3hTaGFwZU5vdGlmeUV2ZW50CTMyCisKK3R5cGVkZWYgc3RydWN0IF9TaGFwZUlucHV0U2VsZWN0ZWQgeworCUNBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBTaGFwZVJlcUNvZGUgKi8KKwlDQVJEOAlzaGFwZVJlcVR5cGU7CS8qIGFsd2F5cyBYX1NoYXBlSW5wdXRTZWxlY3RlZCAqLworCUNBUkQxNglsZW5ndGggQjE2OworCVdpbmRvdwl3aW5kb3cgQjMyOworfSB4U2hhcGVJbnB1dFNlbGVjdGVkUmVxOworI2RlZmluZSBzel94U2hhcGVJbnB1dFNlbGVjdGVkUmVxIDgKKwordHlwZWRlZiBzdHJ1Y3QgeworCUJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisJQ0FSRDgJZW5hYmxlZDsJCS8qIGN1cnJlbnQgc3RhdHVzICovCisJQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKwlDQVJEMzIJbGVuZ3RoIEIzMjsJCS8qIDAgKi8KKwlDQVJEMzIJcGFkMSBCMzI7CQkvKiB1bnVzZWQgKi8KKwlDQVJEMzIJcGFkMiBCMzI7CisJQ0FSRDMyCXBhZDMgQjMyOworCUNBUkQzMglwYWQ0IEIzMjsKKwlDQVJEMzIJcGFkNSBCMzI7CisJQ0FSRDMyCXBhZDYgQjMyOworfSB4U2hhcGVJbnB1dFNlbGVjdGVkUmVwbHk7CisjZGVmaW5lIHN6X3hTaGFwZUlucHV0U2VsZWN0ZWRSZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfU2hhcGVHZXRSZWN0YW5nbGVzIHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CQkvKiBhbHdheXMgU2hhcGVSZXFDb2RlICovCisgICAgQ0FSRDggICBzaGFwZVJlcVR5cGU7CS8qIGFsd2F5cyBYX1NoYXBlR2V0UmVjdGFuZ2xlcyAqLworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgIHdpbmRvdyBCMzI7CisgICAgQ0FSRDggICBraW5kOwkJLyogU2hhcGVCb3VuZGluZyBvciBTaGFwZUNsaXAgKi8KKyAgICBDQVJEOCAgIGp1bmsxOworICAgIENBUkQxNiAganVuazIgQjE2OworfSB4U2hhcGVHZXRSZWN0YW5nbGVzUmVxOworI2RlZmluZSBzel94U2hhcGVHZXRSZWN0YW5nbGVzUmVxCTEyCisKK3R5cGVkZWYgc3RydWN0IHsKKwlCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworCUNBUkQ4CW9yZGVyaW5nOwkvKiBVblNvcnRlZCwgWVNvcnRlZCwgWVhTb3J0ZWQsIFlYQmFuZGVkICovCisJQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKwlDQVJEMzIJbGVuZ3RoIEIzMjsJCS8qIG5vdCB6ZXJvICovCisJQ0FSRDMyCW5yZWN0cyBCMzI7CQkvKiBudW1iZXIgb2YgcmVjdGFuZ2xlcyAqLworCUNBUkQzMiBwYWQxIEIzMjsKKwlDQVJEMzIgcGFkMiBCMzI7CisJQ0FSRDMyIHBhZDMgQjMyOworCUNBUkQzMiBwYWQ0IEIzMjsKKwlDQVJEMzIgcGFkNSBCMzI7Cit9IHhTaGFwZUdldFJlY3RhbmdsZXNSZXBseTsJCS8qIGZvbGxvd2VkIGJ5IHhSZWN0YW5nbGVzICovCisjZGVmaW5lIHN6X3hTaGFwZUdldFJlY3RhbmdsZXNSZXBseSAzMgorCisjdW5kZWYgV2luZG93CisjdW5kZWYgVGltZQorCisjZW5kaWYgLyogX1NIQVBFUFJPVE9fSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2hhcGVzdHIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2hhcGVzdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGZkZTFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zaGFwZXN0ci5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfU0hBUEVTVFJfSF8KKyNkZWZpbmUgX1NIQVBFU1RSX0hfCisKKyN3YXJuaW5nICJzaGFwZXN0ci5oIGlzIG9ic29sZXRlIGFuZCBtYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiIKKyN3YXJuaW5nICJpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9zaGFwZXByb3RvLmg+IGZvciB0aGUgcHJvdG9jb2wgZGVmaW5lcy4iCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvc2hhcGVwcm90by5oPgorCisjZW5kaWYgLyogX1NIQVBFU1RSX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NobS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zaG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDc2NDAyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zaG0uaApAQCAtMCwwICsxLDQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVEhJUyBJUyBOT1QgQU4gWCBDT05TT1JUSVVNIFNUQU5EQVJEIE9SIEFOIFggUFJPSkVDVCBURUFNIFNQRUNJRklDQVRJT04gKi8KKworI2lmbmRlZiBfU0hNX0hfCisjZGVmaW5lIF9TSE1fSF8KKworI2RlZmluZSBTSE1OQU1FICJNSVQtU0hNIgorCisjZGVmaW5lIFNITV9NQUpPUl9WRVJTSU9OCTEJLyogY3VycmVudCB2ZXJzaW9uIG51bWJlcnMgKi8KKyNkZWZpbmUgU0hNX01JTk9SX1ZFUlNJT04JMQorCisjZGVmaW5lIFNobUNvbXBsZXRpb24JCQkwCisjZGVmaW5lIFNobU51bWJlckV2ZW50cwkJCShTaG1Db21wbGV0aW9uICsgMSkKKworI2RlZmluZSBCYWRTaG1TZWcJCQkwCisjZGVmaW5lIFNobU51bWJlckVycm9ycwkJCShCYWRTaG1TZWcgKyAxKQorCisKKyNlbmRpZiAvKiBfU0hNX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NobXByb3RvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NobXByb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVkZTM3NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2htcHJvdG8uaApAQCAtMCwwICsxLDE4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4OSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRISVMgSVMgTk9UIEFOIFggQ09OU09SVElVTSBTVEFOREFSRCBPUiBBTiBYIFBST0pFQ1QgVEVBTSBTUEVDSUZJQ0FUSU9OICovCisKKyNpZm5kZWYgX1NITVBST1RPX0hfCisjZGVmaW5lIF9TSE1QUk9UT19IXworCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvc2htLmg+CisKKyNkZWZpbmUgU2htU2VnIENBUkQzMgorI2RlZmluZSBEcmF3YWJsZSBDQVJEMzIKKyNkZWZpbmUgVmlzdWFsSUQgQ0FSRDMyCisjZGVmaW5lIEdDb250ZXh0IENBUkQzMgorI2RlZmluZSBQaXhtYXAgQ0FSRDMyCisKKyNkZWZpbmUgWF9TaG1RdWVyeVZlcnNpb24JCTAKKyNkZWZpbmUgWF9TaG1BdHRhY2gJCQkxCisjZGVmaW5lIFhfU2htRGV0YWNoCQkJMgorI2RlZmluZSBYX1NobVB1dEltYWdlCQkJMworI2RlZmluZSBYX1NobUdldEltYWdlCQkJNAorI2RlZmluZSBYX1NobUNyZWF0ZVBpeG1hcAkJNQorCit0eXBlZGVmIHN0cnVjdCBfU2htUXVlcnlWZXJzaW9uIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkJLyogYWx3YXlzIFNobVJlcUNvZGUgKi8KKyAgICBDQVJEOAlzaG1SZXFUeXBlOwkJLyogYWx3YXlzIFhfU2htUXVlcnlWZXJzaW9uICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7Cit9IHhTaG1RdWVyeVZlcnNpb25SZXE7CisjZGVmaW5lIHN6X3hTaG1RdWVyeVZlcnNpb25SZXEJNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKyAgICBCT09MCXNoYXJlZFBpeG1hcHM7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYJbWFqb3JWZXJzaW9uIEIxNjsJLyogbWFqb3IgdmVyc2lvbiBvZiBTSE0gcHJvdG9jb2wgKi8KKyAgICBDQVJEMTYJbWlub3JWZXJzaW9uIEIxNjsJLyogbWlub3IgdmVyc2lvbiBvZiBTSE0gcHJvdG9jb2wgKi8KKyAgICBDQVJEMTYJdWlkIEIxNjsKKyAgICBDQVJEMTYJZ2lkIEIxNjsKKyAgICBDQVJEOAlwaXhtYXBGb3JtYXQ7CisgICAgQ0FSRDgJcGFkMDsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7Cit9IHhTaG1RdWVyeVZlcnNpb25SZXBseTsKKyNkZWZpbmUgc3pfeFNobVF1ZXJ5VmVyc2lvblJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF9TaG1BdHRhY2ggeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBTaG1SZXFDb2RlICovCisgICAgQ0FSRDgJc2htUmVxVHlwZTsJLyogYWx3YXlzIFhfU2htQXR0YWNoICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgU2htU2VnCXNobXNlZyBCMzI7CisgICAgQ0FSRDMyCXNobWlkIEIzMjsKKyAgICBCT09MCXJlYWRPbmx5OworICAgIEJZVEUJcGFkMDsKKyAgICBDQVJEMTYJcGFkMSBCMTY7Cit9IHhTaG1BdHRhY2hSZXE7CisjZGVmaW5lIHN6X3hTaG1BdHRhY2hSZXEJMTYKKwordHlwZWRlZiBzdHJ1Y3QgX1NobURldGFjaCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFNobVJlcUNvZGUgKi8KKyAgICBDQVJEOAlzaG1SZXFUeXBlOwkvKiBhbHdheXMgWF9TaG1EZXRhY2ggKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBTaG1TZWcJc2htc2VnIEIzMjsKK30geFNobURldGFjaFJlcTsKKyNkZWZpbmUgc3pfeFNobURldGFjaFJlcQk4CisKK3R5cGVkZWYgc3RydWN0IF9TaG1QdXRJbWFnZSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFNobVJlcUNvZGUgKi8KKyAgICBDQVJEOAlzaG1SZXFUeXBlOwkvKiBhbHdheXMgWF9TaG1QdXRJbWFnZSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIERyYXdhYmxlCWRyYXdhYmxlIEIzMjsKKyAgICBHQ29udGV4dAlnYyBCMzI7CisgICAgQ0FSRDE2CXRvdGFsV2lkdGggQjE2OworICAgIENBUkQxNgl0b3RhbEhlaWdodCBCMTY7CisgICAgQ0FSRDE2CXNyY1ggQjE2OworICAgIENBUkQxNglzcmNZIEIxNjsKKyAgICBDQVJEMTYJc3JjV2lkdGggQjE2OworICAgIENBUkQxNglzcmNIZWlnaHQgQjE2OworICAgIElOVDE2CWRzdFggQjE2OworICAgIElOVDE2CWRzdFkgQjE2OworICAgIENBUkQ4CWRlcHRoOworICAgIENBUkQ4CWZvcm1hdDsKKyAgICBDQVJEOAlzZW5kRXZlbnQ7CisgICAgQ0FSRDgJYnBhZDsKKyAgICBTaG1TZWcJc2htc2VnIEIzMjsKKyAgICBDQVJEMzIJb2Zmc2V0IEIzMjsKK30geFNobVB1dEltYWdlUmVxOworI2RlZmluZSBzel94U2htUHV0SW1hZ2VSZXEJNDAKKwordHlwZWRlZiBzdHJ1Y3QgX1NobUdldEltYWdlIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgU2htUmVxQ29kZSAqLworICAgIENBUkQ4CXNobVJlcVR5cGU7CS8qIGFsd2F5cyBYX1NobUdldEltYWdlICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgRHJhd2FibGUJZHJhd2FibGUgQjMyOworICAgIElOVDE2CXggQjE2OworICAgIElOVDE2CXkgQjE2OworICAgIENBUkQxNgl3aWR0aCBCMTY7CisgICAgQ0FSRDE2CWhlaWdodCBCMTY7CisgICAgQ0FSRDMyCXBsYW5lTWFzayBCMzI7CisgICAgQ0FSRDgJZm9ybWF0OworICAgIENBUkQ4CXBhZDA7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBDQVJEOAlwYWQyOworICAgIFNobVNlZwlzaG1zZWcgQjMyOworICAgIENBUkQzMglvZmZzZXQgQjMyOworfSB4U2htR2V0SW1hZ2VSZXE7CisjZGVmaW5lIHN6X3hTaG1HZXRJbWFnZVJlcQkzMgorCit0eXBlZGVmIHN0cnVjdCBfU2htR2V0SW1hZ2VSZXBseSB7CisgICAgQllURQl0eXBlOyAgLyogWF9SZXBseSAqLworICAgIENBUkQ4CWRlcHRoOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgVmlzdWFsSUQJdmlzdWFsIEIzMjsKKyAgICBDQVJEMzIJc2l6ZSBCMzI7CisgICAgQ0FSRDMyCXBhZDAgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworfSB4U2htR2V0SW1hZ2VSZXBseTsKKyNkZWZpbmUgc3pfeFNobUdldEltYWdlUmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX1NobUNyZWF0ZVBpeG1hcCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFNobVJlcUNvZGUgKi8KKyAgICBDQVJEOAlzaG1SZXFUeXBlOwkvKiBhbHdheXMgWF9TaG1DcmVhdGVQaXhtYXAgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBQaXhtYXAJcGlkIEIzMjsKKyAgICBEcmF3YWJsZQlkcmF3YWJsZSBCMzI7CisgICAgQ0FSRDE2CXdpZHRoIEIxNjsKKyAgICBDQVJEMTYJaGVpZ2h0IEIxNjsKKyAgICBDQVJEOAlkZXB0aDsKKyAgICBDQVJEOAlwYWQwOworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDgJcGFkMjsKKyAgICBTaG1TZWcJc2htc2VnIEIzMjsKKyAgICBDQVJEMzIJb2Zmc2V0IEIzMjsKK30geFNobUNyZWF0ZVBpeG1hcFJlcTsKKyNkZWZpbmUgc3pfeFNobUNyZWF0ZVBpeG1hcFJlcSAyOAorCit0eXBlZGVmIHN0cnVjdCBfU2htQ29tcGxldGlvbiB7CisgICAgQllURQl0eXBlOwkJLyogYWx3YXlzIGV2ZW50QmFzZSArIFNobUNvbXBsZXRpb24gKi8KKyAgICBCWVRFCWJwYWQwOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgRHJhd2FibGUJZHJhd2FibGUgQjMyOworICAgIENBUkQxNgltaW5vckV2ZW50IEIxNjsKKyAgICBCWVRFCW1ham9yRXZlbnQ7CisgICAgQllURQlicGFkMTsKKyAgICBTaG1TZWcJc2htc2VnIEIzMjsKKyAgICBDQVJEMzIJb2Zmc2V0IEIzMjsKKyAgICBDQVJEMzIJcGFkMCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKK30geFNobUNvbXBsZXRpb25FdmVudDsKKyNkZWZpbmUgc3pfeFNobUNvbXBsZXRpb25FdmVudAkzMgorCisjdW5kZWYgU2htU2VnCisjdW5kZWYgRHJhd2FibGUKKyN1bmRlZiBWaXN1YWxJRAorI3VuZGVmIEdDb250ZXh0CisjdW5kZWYgUGl4bWFwCisKKyNlbmRpZiAvKiBfU0hNUFJPVE9fSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2htc3RyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NobXN0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZjM3NTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NobXN0ci5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IDE5ODksIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUSElTIElTIE5PVCBBTiBYIENPTlNPUlRJVU0gU1RBTkRBUkQgT1IgQU4gWCBQUk9KRUNUIFRFQU0gU1BFQ0lGSUNBVElPTiAqLworCisjaWZuZGVmIF9TSE1TVFJfSF8KKyNkZWZpbmUgX1NITVNUUl9IXworCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvc2htcHJvdG8uaD4KKworI2lmZGVmIF9YU0hNX1NFUlZFUl8KKyNkZWZpbmUgWFNITV9QVVRfSU1BR0VfQVJHUyBcCisgICAgRHJhd2FibGVQdHIJCS8qIGRzdCAqLywgXAorICAgIEdDUHRyCQkvKiBwR0MgKi8sIFwKKyAgICBpbnQJCQkvKiBkZXB0aCAqLywgXAorICAgIHVuc2lnbmVkIGludAkvKiBmb3JtYXQgKi8sIFwKKyAgICBpbnQJCQkvKiB3ICovLCBcCisgICAgaW50CQkJLyogaCAqLywgXAorICAgIGludAkJCS8qIHN4ICovLCBcCisgICAgaW50CQkJLyogc3kgKi8sIFwKKyAgICBpbnQJCQkvKiBzdyAqLywgXAorICAgIGludAkJCS8qIHNoICovLCBcCisgICAgaW50CQkJLyogZHggKi8sIFwKKyAgICBpbnQJCQkvKiBkeSAqLywgXAorICAgIGNoYXIgKgkJLyogZGF0YSAqLworCisjZGVmaW5lIFhTSE1fQ1JFQVRFX1BJWE1BUF9BUkdTIFwKKyAgICBTY3JlZW5QdHIJLyogcFNjcmVlbiAqLywgXAorICAgIGludAkJLyogd2lkdGggKi8sIFwKKyAgICBpbnQJCS8qIGhlaWdodCAqLywgXAorICAgIGludAkJLyogZGVwdGggKi8sIFwKKyAgICBjaGFyICoJLyogYWRkciAqLworCit0eXBlZGVmIHN0cnVjdCBfU2htRnVuY3MgeworICAgIFBpeG1hcFB0cgkoKiBDcmVhdGVQaXhtYXApKFhTSE1fQ1JFQVRFX1BJWE1BUF9BUkdTKTsKKyAgICB2b2lkCSgqIFB1dEltYWdlKShYU0hNX1BVVF9JTUFHRV9BUkdTKTsKK30gU2htRnVuY3MsICpTaG1GdW5jc1B0cjsKKyNlbmRpZgorCisjZW5kaWYgLyogX1NITVNUUl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zeW5jLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3N5bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDBkOWM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zeW5jLmgKQEAgLTAsMCArMSwzNzUgQEAKKy8qCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAxOTkxLDE5OTMgYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMsCithbmQgT2xpdmV0dGkgUmVzZWFyY2ggTGltaXRlZCwgQ2FtYnJpZGdlLCBFbmdsYW5kLgorCisgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyAKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCitwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Citib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lcyBvZiBEaWdpdGFsIG9yIE9saXZldHRpCitub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICAKKworRElHSVRBTCBBTkQgT0xJVkVUVEkgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUworU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKK0ZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRVkgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKK1VTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9TWU5DX0hfCisjZGVmaW5lIF9TWU5DX0hfCisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL3N5bmNjb25zdC5oPgorCisjaWZkZWYgX1NZTkNfU0VSVkVSCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvc3luY3Byb3RvLmg+CisjZWxzZQorCitfWEZVTkNQUk9UT0JFR0lOCisvKiBnZXQgcmlkIG9mIG1hY3JvcyBzbyB3ZSBjYW4gZGVmaW5lIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb25zICovCisjdW5kZWYgWFN5bmNJbnRUb1ZhbHVlCisjdW5kZWYgWFN5bmNJbnRzVG9WYWx1ZQorI3VuZGVmIFhTeW5jVmFsdWVHcmVhdGVyVGhhbgorI3VuZGVmIFhTeW5jVmFsdWVMZXNzVGhhbgorI3VuZGVmIFhTeW5jVmFsdWVHcmVhdGVyT3JFcXVhbAorI3VuZGVmIFhTeW5jVmFsdWVMZXNzT3JFcXVhbAorI3VuZGVmIFhTeW5jVmFsdWVFcXVhbAorI3VuZGVmIFhTeW5jVmFsdWVJc05lZ2F0aXZlCisjdW5kZWYgWFN5bmNWYWx1ZUlzWmVybworI3VuZGVmIFhTeW5jVmFsdWVJc1Bvc2l0aXZlCisjdW5kZWYgWFN5bmNWYWx1ZUxvdzMyCisjdW5kZWYgWFN5bmNWYWx1ZUhpZ2gzMgorI3VuZGVmIFhTeW5jVmFsdWVBZGQKKyN1bmRlZiBYU3luY1ZhbHVlU3VidHJhY3QKKyN1bmRlZiBYU3luY01heFZhbHVlCisjdW5kZWYgWFN5bmNNaW5WYWx1ZQorCitleHRlcm4gdm9pZCBYU3luY0ludFRvVmFsdWUoCisgICAgWFN5bmNWYWx1ZSogLypwdiovLAorICAgIGludCAvKmkqLworKTsKKworZXh0ZXJuIHZvaWQgWFN5bmNJbnRzVG9WYWx1ZSgKKyAgICBYU3luY1ZhbHVlKiAvKnB2Ki8sCisgICAgdW5zaWduZWQgaW50IC8qbCovLAorICAgIGludCAvKmgqLworKTsKKworZXh0ZXJuIEJvb2wgWFN5bmNWYWx1ZUdyZWF0ZXJUaGFuKAorICAgIFhTeW5jVmFsdWUgLyphKi8sCisgICAgWFN5bmNWYWx1ZSAvKmIqLworKTsKKworZXh0ZXJuIEJvb2wgWFN5bmNWYWx1ZUxlc3NUaGFuKAorICAgIFhTeW5jVmFsdWUgLyphKi8sCisgICAgWFN5bmNWYWx1ZSAvKmIqLworKTsKKworZXh0ZXJuIEJvb2wgWFN5bmNWYWx1ZUdyZWF0ZXJPckVxdWFsKAorICAgIFhTeW5jVmFsdWUgLyphKi8sCisgICAgWFN5bmNWYWx1ZSAvKmIqLworKTsKKworZXh0ZXJuIEJvb2wgWFN5bmNWYWx1ZUxlc3NPckVxdWFsKAorICAgIFhTeW5jVmFsdWUgLyphKi8sCisgICAgWFN5bmNWYWx1ZSAvKmIqLworKTsKKworZXh0ZXJuIEJvb2wgWFN5bmNWYWx1ZUVxdWFsKAorICAgIFhTeW5jVmFsdWUgLyphKi8sCisgICAgWFN5bmNWYWx1ZSAvKmIqLworKTsKKworZXh0ZXJuIEJvb2wgWFN5bmNWYWx1ZUlzTmVnYXRpdmUoCisgICAgWFN5bmNWYWx1ZSAvKnYqLworKTsKKworZXh0ZXJuIEJvb2wgWFN5bmNWYWx1ZUlzWmVybygKKyAgICBYU3luY1ZhbHVlIC8qYSovCispOworCitleHRlcm4gQm9vbCBYU3luY1ZhbHVlSXNQb3NpdGl2ZSgKKyAgICBYU3luY1ZhbHVlIC8qdiovCispOworCitleHRlcm4gdW5zaWduZWQgaW50IFhTeW5jVmFsdWVMb3czMigKKyAgICBYU3luY1ZhbHVlIC8qdiovCispOworCitleHRlcm4gaW50IFhTeW5jVmFsdWVIaWdoMzIoCisgICAgWFN5bmNWYWx1ZSAvKnYqLworKTsKKworZXh0ZXJuIHZvaWQgWFN5bmNWYWx1ZUFkZCgKKyAgICBYU3luY1ZhbHVlKiAvKnByZXN1bHQqLywKKyAgICBYU3luY1ZhbHVlIC8qYSovLAorICAgIFhTeW5jVmFsdWUgLypiKi8sCisgICAgaW50KiAvKnBvdmVyZmxvdyovCispOworCitleHRlcm4gdm9pZCBYU3luY1ZhbHVlU3VidHJhY3QoCisgICAgWFN5bmNWYWx1ZSogLypwcmVzdWx0Ki8sCisgICAgWFN5bmNWYWx1ZSAvKmEqLywKKyAgICBYU3luY1ZhbHVlIC8qYiovLAorICAgIGludCogLypwb3ZlcmZsb3cqLworKTsKKworZXh0ZXJuIHZvaWQgWFN5bmNNYXhWYWx1ZSgKKyAgICBYU3luY1ZhbHVlKiAvKnB2Ki8KKyk7CisKK2V4dGVybiB2b2lkIFhTeW5jTWluVmFsdWUoCisgICAgWFN5bmNWYWx1ZSogLypwdiovCispOworCitfWEZVTkNQUk9UT0VORAorCisKK3R5cGVkZWYgc3RydWN0IF9YU3luY1N5c3RlbUNvdW50ZXIgeworICAgIGNoYXIgKm5hbWU7CQkJLyogbnVsbC10ZXJtaW5hdGVkIG5hbWUgb2Ygc3lzdGVtIGNvdW50ZXIgKi8KKyAgICBYU3luY0NvdW50ZXIgY291bnRlcjsJLyogY291bnRlciBpZCBvZiB0aGlzIHN5c3RlbSBjb3VudGVyICovCisgICAgWFN5bmNWYWx1ZSByZXNvbHV0aW9uOwkvKiByZXNvbHV0aW9uIG9mIHRoaXMgc3lzdGVtIGNvdW50ZXIgKi8KK30gWFN5bmNTeXN0ZW1Db3VudGVyOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYU3luY0NvdW50ZXIgY291bnRlcjsJLyogY291bnRlciB0byB0cmlnZ2VyIG9uICovCisgICAgWFN5bmNWYWx1ZVR5cGUgdmFsdWVfdHlwZTsJLyogYWJzb2x1dGUvcmVsYXRpdmUgKi8KKyAgICBYU3luY1ZhbHVlIHdhaXRfdmFsdWU7CS8qIHZhbHVlIHRvIGNvbXBhcmUgY291bnRlciB0byAqLworICAgIFhTeW5jVGVzdFR5cGUgdGVzdF90eXBlOwkvKiBwb3MvbmVnIGNvbXBhcmlzb24vdHJhbnN0aW9uICovCit9IFhTeW5jVHJpZ2dlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhTeW5jVHJpZ2dlciB0cmlnZ2VyOwkvKiB0cmlnZ2VyIGZvciBhd2FpdCAqLworICAgIFhTeW5jVmFsdWUgZXZlbnRfdGhyZXNob2xkOyAvKiBzZW5kIGV2ZW50IGlmIHBhc3QgdGhyZXNob2xkICovCit9IFhTeW5jV2FpdENvbmRpdGlvbjsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWFN5bmNUcmlnZ2VyIHRyaWdnZXI7CisgICAgWFN5bmNWYWx1ZSAgZGVsdGE7CisgICAgQm9vbCBldmVudHM7CisgICAgWFN5bmNBbGFybVN0YXRlIHN0YXRlOworfSBYU3luY0FsYXJtQXR0cmlidXRlczsKKworLyoKKyAqICBFdmVudHMKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHR5cGU7CQkJLyogZXZlbnQgYmFzZSArIFhTeW5jQ291bnRlck5vdGlmeSAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCBzZW5kX2V2ZW50OwkJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAqZGlzcGxheTsJCS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBYU3luY0NvdW50ZXIgY291bnRlcjsJLyogY291bnRlciBpbnZvbHZlZCBpbiBhd2FpdCAqLworICAgIFhTeW5jVmFsdWUgd2FpdF92YWx1ZTsJLyogdmFsdWUgYmVpbmcgd2FpdGVkIGZvciAqLworICAgIFhTeW5jVmFsdWUgY291bnRlcl92YWx1ZTsJLyogY291bnRlciB2YWx1ZSB3aGVuIHRoaXMgZXZlbnQgd2FzIHNlbnQgKi8KKyAgICBUaW1lIHRpbWU7CQkJLyogbWlsbGlzZWNvbmRzICovCisgICAgaW50IGNvdW50OwkJCS8qIGhvdyBtYW55IG1vcmUgZXZlbnRzIHRvIGNvbWUgKi8KKyAgICBCb29sIGRlc3Ryb3llZDsJCS8qIFRydWUgaWYgY291bnRlciB3YXMgZGVzdHJveWVkICovCit9IFhTeW5jQ291bnRlck5vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHR5cGU7CQkJLyogZXZlbnQgYmFzZSArIFhTeW5jQ291bnRlck5vdGlmeSAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCBzZW5kX2V2ZW50OwkJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAqZGlzcGxheTsJCS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBYU3luY0FsYXJtIGFsYXJtOwkJLyogYWxhcm0gdGhhdCB0cmlnZ2VyZWQgKi8KKyAgICBYU3luY1ZhbHVlIGNvdW50ZXJfdmFsdWU7CS8qIHZhbHVlIHRoYXQgdHJpZ2dlcmVkIHRoZSBhbGFybSAqLworICAgIFhTeW5jVmFsdWUgYWxhcm1fdmFsdWU7CS8qIHRlc3QgIHZhbHVlIG9mIHRyaWdnZXIgaW4gYWxhcm0gKi8KKyAgICBUaW1lIHRpbWU7CQkJLyogbWlsbGlzZWNvbmRzICovCisgICAgWFN5bmNBbGFybVN0YXRlIHN0YXRlOwkvKiBuZXcgc3RhdGUgb2YgYWxhcm0gKi8KK30gWFN5bmNBbGFybU5vdGlmeUV2ZW50OworCisvKgorICogIEVycm9ycyAKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHR5cGU7CQkJCisgICAgRGlzcGxheSAqZGlzcGxheTsJCS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBYU3luY0FsYXJtIGFsYXJtOwkJLyogcmVzb3VyY2UgaWQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogc2VyaWFsIG51bWJlciBvZiBmYWlsZWQgcmVxdWVzdCAqLworICAgIHVuc2lnbmVkIGNoYXIgZXJyb3JfY29kZTsJLyogZXJyb3IgYmFzZSArIFhTeW5jQmFkQWxhcm0gKi8KKyAgICB1bnNpZ25lZCBjaGFyIHJlcXVlc3RfY29kZTsJLyogTWFqb3Igb3AtY29kZSBvZiBmYWlsZWQgcmVxdWVzdCAqLworICAgIHVuc2lnbmVkIGNoYXIgbWlub3JfY29kZTsJLyogTWlub3Igb3AtY29kZSBvZiBmYWlsZWQgcmVxdWVzdCAqLworfSBYU3luY0FsYXJtRXJyb3I7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgdHlwZTsJCQkKKyAgICBEaXNwbGF5ICpkaXNwbGF5OwkJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIFhTeW5jQ291bnRlciBjb3VudGVyOwkvKiByZXNvdXJjZSBpZCAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiBzZXJpYWwgbnVtYmVyIG9mIGZhaWxlZCByZXF1ZXN0ICovCisgICAgdW5zaWduZWQgY2hhciBlcnJvcl9jb2RlOwkvKiBlcnJvciBiYXNlICsgWFN5bmNCYWRDb3VudGVyICovCisgICAgdW5zaWduZWQgY2hhciByZXF1ZXN0X2NvZGU7CS8qIE1ham9yIG9wLWNvZGUgb2YgZmFpbGVkIHJlcXVlc3QgKi8KKyAgICB1bnNpZ25lZCBjaGFyIG1pbm9yX2NvZGU7CS8qIE1pbm9yIG9wLWNvZGUgb2YgZmFpbGVkIHJlcXVlc3QgKi8KK30gWFN5bmNDb3VudGVyRXJyb3I7CisKKy8qIAorICogIFByb3RvdHlwZXMKKyAqLworCitfWEZVTkNQUk9UT0JFR0lOCisKK2V4dGVybiBTdGF0dXMgWFN5bmNRdWVyeUV4dGVuc2lvbigKKyAgICBEaXNwbGF5KiAvKmRweSovLAorICAgIGludCogLypldmVudF9iYXNlX3JldHVybiovLAorICAgIGludCogLyplcnJvcl9iYXNlX3JldHVybiovCispOworCitleHRlcm4gU3RhdHVzIFhTeW5jSW5pdGlhbGl6ZSgKKyAgICBEaXNwbGF5KiAvKmRweSovLAorICAgIGludCogLyptYWpvcl92ZXJzaW9uX3JldHVybiovLAorICAgIGludCogLyptaW5vcl92ZXJzaW9uX3JldHVybiovCispOworCitleHRlcm4gWFN5bmNTeXN0ZW1Db3VudGVyICpYU3luY0xpc3RTeXN0ZW1Db3VudGVycygKKyAgICBEaXNwbGF5KiAvKmRweSovLAorICAgIGludCogLypuX2NvdW50ZXJzX3JldHVybiovCispOworCitleHRlcm4gdm9pZCBYU3luY0ZyZWVTeXN0ZW1Db3VudGVyTGlzdCgKKyAgICBYU3luY1N5c3RlbUNvdW50ZXIqIC8qbGlzdCovCispOworCitleHRlcm4gWFN5bmNDb3VudGVyIFhTeW5jQ3JlYXRlQ291bnRlcigKKyAgICBEaXNwbGF5KiAvKmRweSovLAorICAgIFhTeW5jVmFsdWUgLyppbml0aWFsX3ZhbHVlKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFN5bmNTZXRDb3VudGVyKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgWFN5bmNDb3VudGVyIC8qY291bnRlciovLAorICAgIFhTeW5jVmFsdWUgLyp2YWx1ZSovCispOworCitleHRlcm4gU3RhdHVzIFhTeW5jQ2hhbmdlQ291bnRlcigKKyAgICBEaXNwbGF5KiAvKmRweSovLAorICAgIFhTeW5jQ291bnRlciAvKmNvdW50ZXIqLywKKyAgICBYU3luY1ZhbHVlIC8qdmFsdWUqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYU3luY0Rlc3Ryb3lDb3VudGVyKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgWFN5bmNDb3VudGVyIC8qY291bnRlciovCispOworCitleHRlcm4gU3RhdHVzIFhTeW5jUXVlcnlDb3VudGVyKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgWFN5bmNDb3VudGVyIC8qY291bnRlciovLAorICAgIFhTeW5jVmFsdWUqIC8qdmFsdWVfcmV0dXJuKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFN5bmNBd2FpdCgKKyAgICBEaXNwbGF5KiAvKmRweSovLAorICAgIFhTeW5jV2FpdENvbmRpdGlvbiogLyp3YWl0X2xpc3QqLywKKyAgICBpbnQgLypuX2NvbmRpdGlvbnMqLworKTsKKworZXh0ZXJuIFhTeW5jQWxhcm0gWFN5bmNDcmVhdGVBbGFybSgKKyAgICBEaXNwbGF5KiAvKmRweSovLAorICAgIHVuc2lnbmVkIGxvbmcgLyp2YWx1ZXNfbWFzayovLAorICAgIFhTeW5jQWxhcm1BdHRyaWJ1dGVzKiAvKnZhbHVlcyovCispOworCitleHRlcm4gU3RhdHVzIFhTeW5jRGVzdHJveUFsYXJtKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgWFN5bmNBbGFybSAvKmFsYXJtKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFN5bmNRdWVyeUFsYXJtKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgWFN5bmNBbGFybSAvKmFsYXJtKi8sCisgICAgWFN5bmNBbGFybUF0dHJpYnV0ZXMqIC8qdmFsdWVzX3JldHVybiovCispOworCitleHRlcm4gU3RhdHVzIFhTeW5jQ2hhbmdlQWxhcm0oCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYU3luY0FsYXJtIC8qYWxhcm0qLywKKyAgICB1bnNpZ25lZCBsb25nIC8qdmFsdWVzX21hc2sqLywKKyAgICBYU3luY0FsYXJtQXR0cmlidXRlcyogLyp2YWx1ZXMqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYU3luY1NldFByaW9yaXR5KAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgWElEIC8qY2xpZW50X3Jlc291cmNlX2lkKi8sCisgICAgaW50IC8qcHJpb3JpdHkqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYU3luY0dldFByaW9yaXR5KAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgWElEIC8qY2xpZW50X3Jlc291cmNlX2lkKi8sCisgICAgaW50KiAvKnJldHVybl9wcmlvcml0eSovCispOworCitleHRlcm4gWFN5bmNGZW5jZSBYU3luY0NyZWF0ZUZlbmNlKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgRHJhd2FibGUgLypkKi8sCisgICAgQm9vbCAvKmluaXRpYWxseV90cmlnZ2VyZWQqLworKTsKKworZXh0ZXJuIEJvb2wgWFN5bmNUcmlnZ2VyRmVuY2UoCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYU3luY0ZlbmNlIC8qZmVuY2UqLworKTsKKworZXh0ZXJuIEJvb2wgWFN5bmNSZXNldEZlbmNlKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgWFN5bmNGZW5jZSAvKmZlbmNlKi8KKyk7CisKK2V4dGVybiBCb29sIFhTeW5jRGVzdHJveUZlbmNlKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgWFN5bmNGZW5jZSAvKmZlbmNlKi8KKyk7CisKK2V4dGVybiBCb29sIFhTeW5jUXVlcnlGZW5jZSgKKyAgICBEaXNwbGF5KiAvKmRweSovLAorICAgIFhTeW5jRmVuY2UgLypmZW5jZSovLAorICAgIEJvb2wqIC8qdHJpZ2dlcmVkKi8KKyk7CisKK2V4dGVybiBCb29sIFhTeW5jQXdhaXRGZW5jZSgKKyAgICBEaXNwbGF5KiAvKmRweSovLAorICAgIGNvbnN0IFhTeW5jRmVuY2UqIC8qZmVuY2VfbGlzdCovLAorICAgIGludCAvKm5fZmVuY2VzKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZiAvKiBfU1lOQ19TRVJWRVIgKi8KKworI2VuZGlmIC8qIF9TWU5DX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3N5bmNjb25zdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zeW5jY29uc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWNjMzg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zeW5jY29uc3QuaApAQCAtMCwwICsxLDE4MSBAQAorLyoKKworQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IDE5OTEsMTk5MyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cywKK2FuZCBPbGl2ZXR0aSBSZXNlYXJjaCBMaW1pdGVkLCBDYW1icmlkZ2UsIEVuZ2xhbmQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCitwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Citib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KK3N1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWVzIG9mIERpZ2l0YWwgb3IgT2xpdmV0dGkKK25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK3NvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKworRElHSVRBTCBBTkQgT0xJVkVUVEkgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUworU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKK0ZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRVkgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKK1VTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9TWU5DQ09OU1RfSF8KKyNkZWZpbmUgX1NZTkNDT05TVF9IXworCisjZGVmaW5lIFNZTkNfTkFNRSAiU1lOQyIKKworI2RlZmluZSBTWU5DX01BSk9SX1ZFUlNJT04JMworI2RlZmluZSBTWU5DX01JTk9SX1ZFUlNJT04JMQorCisKKyNkZWZpbmUgWFN5bmNDb3VudGVyTm90aWZ5ICAgICAgICAgICAgICAwCisjZGVmaW5lIFhTeW5jQWxhcm1Ob3RpZnkJCTEKKyNkZWZpbmUgWFN5bmNBbGFybU5vdGlmeU1hc2sgCQkoMUwgPDwgWFN5bmNBbGFybU5vdGlmeSkKKworI2RlZmluZSBYU3luY051bWJlckV2ZW50cwkJMkwKKworI2RlZmluZSBYU3luY0JhZENvdW50ZXIJCQkwTAorI2RlZmluZSBYU3luY0JhZEFsYXJtCQkJMUwKKyNkZWZpbmUgWFN5bmNCYWRGZW5jZSAgICAgICAgICAgMkwKKyNkZWZpbmUgWFN5bmNOdW1iZXJFcnJvcnMJCShYU3luY0JhZEZlbmNlICsgMSkKKworLyoKKyAqIEZsYWdzIGZvciBBbGFybSBBdHRyaWJ1dGVzCisgKi8KKyNkZWZpbmUgWFN5bmNDQUNvdW50ZXIJCQkoMUw8PDApCisjZGVmaW5lIFhTeW5jQ0FWYWx1ZVR5cGUJCSgxTDw8MSkKKyNkZWZpbmUgWFN5bmNDQVZhbHVlCQkJKDFMPDwyKQorI2RlZmluZSBYU3luY0NBVGVzdFR5cGUJCQkoMUw8PDMpCisjZGVmaW5lIFhTeW5jQ0FEZWx0YQkJCSgxTDw8NCkKKyNkZWZpbmUgWFN5bmNDQUV2ZW50cwkJCSgxTDw8NSkKKworLyogIFRoZSBfWFN5bmMgbWFjcm9zIGJlbG93IGFyZSBmb3IgbGlicmFyeSBpbnRlcm5hbCB1c2Ugb25seS4gIFRoZXkgZXhpc3QKKyAqICBzbyB0aGF0IGlmIHdlIGhhdmUgdG8gbWFrZSBhIGZpeCwgd2UgY2FuIGNoYW5nZSBpdCBpbiB0aGlzIG9uZSBwbGFjZQorICogIGFuZCBoYXZlIGJvdGggdGhlIG1hY3JvIGFuZCBmdW5jdGlvbiB2YXJpYW50cyBpbmhlcml0IHRoZSBmaXguCisgKi8KKworI2RlZmluZSBfWFN5bmNJbnRUb1ZhbHVlKHB2LCBpKSAgICAgKChwdiktPmhpPSgoaTwwKT9+MDowKSwocHYpLT5sbz0oaSkpCisjZGVmaW5lIF9YU3luY0ludHNUb1ZhbHVlKHB2LCBsLCBoKSAoKHB2KS0+bG8gPSAobCksIChwdiktPmhpID0gKGgpKQorI2RlZmluZSBfWFN5bmNWYWx1ZUdyZWF0ZXJUaGFuKGEsIGIpXAorICAgICgoYSkuaGk+KGIpLmhpIHx8ICgoYSkuaGk9PShiKS5oaSAmJiAoYSkubG8+KGIpLmxvKSkKKyNkZWZpbmUgX1hTeW5jVmFsdWVMZXNzVGhhbihhLCBiKVwKKyAgICAoKGEpLmhpPChiKS5oaSB8fCAoKGEpLmhpPT0oYikuaGkgJiYgKGEpLmxvPChiKS5sbykpCisjZGVmaW5lIF9YU3luY1ZhbHVlR3JlYXRlck9yRXF1YWwoYSwgYilcCisgICAgKChhKS5oaT4oYikuaGkgfHwgKChhKS5oaT09KGIpLmhpICYmIChhKS5sbz49KGIpLmxvKSkKKyNkZWZpbmUgX1hTeW5jVmFsdWVMZXNzT3JFcXVhbChhLCBiKVwKKyAgICAoKGEpLmhpPChiKS5oaSB8fCAoKGEpLmhpPT0oYikuaGkgJiYgKGEpLmxvPD0oYikubG8pKQorI2RlZmluZSBfWFN5bmNWYWx1ZUVxdWFsKGEsIGIpCSgoYSkubG89PShiKS5sbyAmJiAoYSkuaGk9PShiKS5oaSkKKyNkZWZpbmUgX1hTeW5jVmFsdWVJc05lZ2F0aXZlKHYpICgoKHYpLmhpICYgMHg4MDAwMDAwMCkgPyAxIDogMCkKKyNkZWZpbmUgX1hTeW5jVmFsdWVJc1plcm8oYSkJKChhKS5sbz09MCAmJiAoYSkuaGk9PTApCisjZGVmaW5lIF9YU3luY1ZhbHVlSXNQb3NpdGl2ZSh2KSAoKCh2KS5oaSAmIDB4ODAwMDAwMDApID8gMCA6IDEpCisjZGVmaW5lIF9YU3luY1ZhbHVlTG93MzIodikJKCh2KS5sbykKKyNkZWZpbmUgX1hTeW5jVmFsdWVIaWdoMzIodikJKCh2KS5oaSkKKyNkZWZpbmUgX1hTeW5jVmFsdWVBZGQocHJlc3VsdCxhLGIscG92ZXJmbG93KSB7XAorCWludCB0ID0gKGEpLmxvO1wKKwlCb29sIHNpZ25hID0gWFN5bmNWYWx1ZUlzTmVnYXRpdmUoYSk7XAorCUJvb2wgc2lnbmIgPSBYU3luY1ZhbHVlSXNOZWdhdGl2ZShiKTtcCisJKChwcmVzdWx0KS0+bG8gPSAoYSkubG8gKyAoYikubG8pO1wKKwkoKHByZXN1bHQpLT5oaSA9IChhKS5oaSArIChiKS5oaSk7XAorCWlmICh0PihwcmVzdWx0KS0+bG8pIChwcmVzdWx0KS0+aGkrKztcCisJKnBvdmVyZmxvdyA9ICgoc2lnbmEgPT0gc2lnbmIpICYmICEoc2lnbmEgPT0gWFN5bmNWYWx1ZUlzTmVnYXRpdmUoKnByZXN1bHQpKSk7XAorICAgICB9CisjZGVmaW5lIF9YU3luY1ZhbHVlU3VidHJhY3QocHJlc3VsdCxhLGIscG92ZXJmbG93KSB7XAorCWludCB0ID0gKGEpLmxvO1wKKwlCb29sIHNpZ25hID0gWFN5bmNWYWx1ZUlzTmVnYXRpdmUoYSk7XAorCUJvb2wgc2lnbmIgPSBYU3luY1ZhbHVlSXNOZWdhdGl2ZShiKTtcCisJKChwcmVzdWx0KS0+bG8gPSAoYSkubG8gLSAoYikubG8pO1wKKwkoKHByZXN1bHQpLT5oaSA9IChhKS5oaSAtIChiKS5oaSk7XAorCWlmICh0PChwcmVzdWx0KS0+bG8pIChwcmVzdWx0KS0+aGktLTtcCisJKnBvdmVyZmxvdyA9ICgoc2lnbmEgPT0gc2lnbmIpICYmICEoc2lnbmEgPT0gWFN5bmNWYWx1ZUlzTmVnYXRpdmUoKnByZXN1bHQpKSk7XAorICAgICB9CisjZGVmaW5lIF9YU3luY01heFZhbHVlKHB2KSAoKHB2KS0+aGkgPSAweDdmZmZmZmZmLCAocHYpLT5sbyA9IDB4ZmZmZmZmZmYpCisjZGVmaW5lIF9YU3luY01pblZhbHVlKHB2KSAoKHB2KS0+aGkgPSAweDgwMDAwMDAwLCAocHYpLT5sbyA9IDApCisKKy8qCisgKiAgVGhlc2UgYXJlIHRoZSBwdWJsaWNhbGx5IHVzYWJsZSBtYWNyb3MuICBJZiB5b3Ugd2FudCB0aGUgZnVuY3Rpb24gdmVyc2lvbgorICogIG9mIG9uZSBvZiB0aGVzZSwganVzdCAjdW5kZWYgdGhlIG1hY3JvIHRvIHVuY292ZXIgdGhlIGZ1bmN0aW9uLgorICogIChUaGlzIGlzIHRoZSBzYW1lIGNvbnZlbnRpb24gdGhhdCB0aGUgQU5TSSBDIGxpYnJhcnkgdXNlcy4pCisgKi8KKworI2RlZmluZSBYU3luY0ludFRvVmFsdWUocHYsIGkpIF9YU3luY0ludFRvVmFsdWUocHYsIGkpCisjZGVmaW5lIFhTeW5jSW50c1RvVmFsdWUocHYsIGwsIGgpIF9YU3luY0ludHNUb1ZhbHVlKHB2LCBsLCBoKQorI2RlZmluZSBYU3luY1ZhbHVlR3JlYXRlclRoYW4oYSwgYikgX1hTeW5jVmFsdWVHcmVhdGVyVGhhbihhLCBiKQorI2RlZmluZSBYU3luY1ZhbHVlTGVzc1RoYW4oYSwgYikgX1hTeW5jVmFsdWVMZXNzVGhhbihhLCBiKQorI2RlZmluZSBYU3luY1ZhbHVlR3JlYXRlck9yRXF1YWwoYSwgYikgX1hTeW5jVmFsdWVHcmVhdGVyT3JFcXVhbChhLCBiKQorI2RlZmluZSBYU3luY1ZhbHVlTGVzc09yRXF1YWwoYSwgYikgX1hTeW5jVmFsdWVMZXNzT3JFcXVhbChhLCBiKQorI2RlZmluZSBYU3luY1ZhbHVlRXF1YWwoYSwgYikgX1hTeW5jVmFsdWVFcXVhbChhLCBiKQorI2RlZmluZSBYU3luY1ZhbHVlSXNOZWdhdGl2ZSh2KSBfWFN5bmNWYWx1ZUlzTmVnYXRpdmUodikKKyNkZWZpbmUgWFN5bmNWYWx1ZUlzWmVybyhhKSBfWFN5bmNWYWx1ZUlzWmVybyhhKQorI2RlZmluZSBYU3luY1ZhbHVlSXNQb3NpdGl2ZSh2KSBfWFN5bmNWYWx1ZUlzUG9zaXRpdmUodikKKyNkZWZpbmUgWFN5bmNWYWx1ZUxvdzMyKHYpIF9YU3luY1ZhbHVlTG93MzIodikKKyNkZWZpbmUgWFN5bmNWYWx1ZUhpZ2gzMih2KSBfWFN5bmNWYWx1ZUhpZ2gzMih2KQorI2RlZmluZSBYU3luY1ZhbHVlQWRkKHByZXN1bHQsYSxiLHBvdmVyZmxvdykgX1hTeW5jVmFsdWVBZGQocHJlc3VsdCxhLGIscG92ZXJmbG93KQorI2RlZmluZSBYU3luY1ZhbHVlU3VidHJhY3QocHJlc3VsdCxhLGIscG92ZXJmbG93KSBfWFN5bmNWYWx1ZVN1YnRyYWN0KHByZXN1bHQsYSxiLHBvdmVyZmxvdykKKyNkZWZpbmUgWFN5bmNNYXhWYWx1ZShwdikgX1hTeW5jTWF4VmFsdWUocHYpCisjZGVmaW5lIFhTeW5jTWluVmFsdWUocHYpIF9YU3luY01pblZhbHVlKHB2KQorCisvKgorICogQ29uc3RhbnRzIGZvciB0aGUgdmFsdWVfdHlwZSBhcmd1bWVudCBvZiB2YXJpb3VzIHJlcXVlc3RzCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgWFN5bmNBYnNvbHV0ZSwKKyAgICBYU3luY1JlbGF0aXZlCit9IFhTeW5jVmFsdWVUeXBlOworCisvKgorICogQWxhcm0gVGVzdCB0eXBlcworICovCit0eXBlZGVmIGVudW0geworICAgIFhTeW5jUG9zaXRpdmVUcmFuc2l0aW9uLAorICAgIFhTeW5jTmVnYXRpdmVUcmFuc2l0aW9uLAorICAgIFhTeW5jUG9zaXRpdmVDb21wYXJpc29uLAorICAgIFhTeW5jTmVnYXRpdmVDb21wYXJpc29uCit9IFhTeW5jVGVzdFR5cGU7CisKKy8qCisgKiBBbGFybSBzdGF0ZSBjb25zdGFudHMKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBYU3luY0FsYXJtQWN0aXZlLAorICAgIFhTeW5jQWxhcm1JbmFjdGl2ZSwKKyAgICBYU3luY0FsYXJtRGVzdHJveWVkCit9IFhTeW5jQWxhcm1TdGF0ZTsKKworCit0eXBlZGVmIFhJRCBYU3luY0NvdW50ZXI7Cit0eXBlZGVmIFhJRCBYU3luY0FsYXJtOwordHlwZWRlZiBYSUQgWFN5bmNGZW5jZTsKK3R5cGVkZWYgc3RydWN0IF9YU3luY1ZhbHVlIHsKKyAgICBpbnQgaGk7CisgICAgdW5zaWduZWQgaW50IGxvOworfSBYU3luY1ZhbHVlOworI2VuZGlmIC8qIF9TWU5DQ09OU1RfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc3luY3Byb3RvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3N5bmNwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NTNlNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3N5bmNwcm90by5oCkBAIC0wLDAgKzEsNDc0IEBACisvKgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgMTk5MSwxOTkzIGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLAorYW5kIE9saXZldHRpIFJlc2VhcmNoIExpbWl0ZWQsIENhbWJyaWRnZSwgRW5nbGFuZC4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKK3Byb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKK2JvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZXMgb2YgRGlnaXRhbCBvciBPbGl2ZXR0aQorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorCitESUdJVEFMIEFORCBPTElWRVRUSSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTCitTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFWSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCitPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCitQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1NZTkNQUk9UT19IXworI2RlZmluZSBfU1lOQ1BST1RPX0hfCisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9zeW5jY29uc3QuaD4KKworI2RlZmluZSBYX1N5bmNJbml0aWFsaXplCQkwCisjZGVmaW5lIFhfU3luY0xpc3RTeXN0ZW1Db3VudGVycwkxCisjZGVmaW5lIFhfU3luY0NyZWF0ZUNvdW50ZXIJCTIKKyNkZWZpbmUgWF9TeW5jU2V0Q291bnRlcgkJMworI2RlZmluZSBYX1N5bmNDaGFuZ2VDb3VudGVyCQk0CisjZGVmaW5lIFhfU3luY1F1ZXJ5Q291bnRlciAgICAgICAgICAgICAgNQorI2RlZmluZSBYX1N5bmNEZXN0cm95Q291bnRlcgkJNgorI2RlZmluZSBYX1N5bmNBd2FpdAkJCTcKKyNkZWZpbmUgWF9TeW5jQ3JlYXRlQWxhcm0gICAgICAgICAgICAgICA4CisjZGVmaW5lIFhfU3luY0NoYW5nZUFsYXJtCSAgICAgICAgOQorI2RlZmluZSBYX1N5bmNRdWVyeUFsYXJtCSAgICAgICAxMAorI2RlZmluZSBYX1N5bmNEZXN0cm95QWxhcm0JICAgICAgIDExCisjZGVmaW5lIFhfU3luY1NldFByaW9yaXR5ICAgCSAgICAgICAxMgorI2RlZmluZSBYX1N5bmNHZXRQcmlvcml0eSAgIAkgICAgICAgMTMKKyNkZWZpbmUgWF9TeW5jQ3JlYXRlRmVuY2UJICAgICAgIDE0CisjZGVmaW5lIFhfU3luY1RyaWdnZXJGZW5jZQkgICAgICAgMTUKKyNkZWZpbmUgWF9TeW5jUmVzZXRGZW5jZQkgICAgICAgMTYKKyNkZWZpbmUgWF9TeW5jRGVzdHJveUZlbmNlCSAgICAgICAxNworI2RlZmluZSBYX1N5bmNRdWVyeUZlbmNlCSAgICAgICAxOAorI2RlZmluZSBYX1N5bmNBd2FpdEZlbmNlCSAgICAgICAxOQorCisvKiBjb3ZlciB1cCB0eXBlcyBmcm9tIHN5bmMuaCB0byBtYWtlIHN1cmUgdGhleSdyZSB0aGUgcmlnaHQgc2l6ZSBmb3IKKyAqIHByb3RvY29sIHBhY2thZ2luZy4gIFRoZXNlIHdpbGwgYmUgdW5kZWYnZWQgYWZ0ZXIgYWxsIHRoZSBwcm90b2NvbAorICogc3RydWN0dXJlcyBhcmUgZGVmaW5lZC4KKyAqLworI2RlZmluZSBYU3luY0NvdW50ZXIgQ0FSRDMyCisjZGVmaW5lIFhTeW5jQWxhcm0gICBDQVJEMzIKKyNkZWZpbmUgWFN5bmNGZW5jZSAgIENBUkQzMgorI2RlZmluZSBEcmF3YWJsZSAgICAgQ0FSRDMyCisKKy8qCisgKiBJbml0aWFsaXplCisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY0luaXRpYWxpemUgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJc3luY1JlcVR5cGU7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDgJbWFqb3JWZXJzaW9uOworICAgIENBUkQ4CW1pbm9yVmVyc2lvbjsKKyAgICBDQVJEMTYJcGFkIEIxNjsKK30geFN5bmNJbml0aWFsaXplUmVxOworI2RlZmluZSBzel94U3luY0luaXRpYWxpemVSZXEJCTgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsKKyAgICBDQVJEOAl1bnVzZWQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEOAltYWpvclZlcnNpb247CisgICAgQ0FSRDgJbWlub3JWZXJzaW9uOworICAgIENBUkQxNglwYWQgQjE2OworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7Cit9IHhTeW5jSW5pdGlhbGl6ZVJlcGx5OworI2RlZmluZSBzel94U3luY0luaXRpYWxpemVSZXBseQkzMgorCisvKgorICogTGlzdFN5c3RlbUNvdW50ZXJzCisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY0xpc3RTeXN0ZW1Db3VudGVycworeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJc3luY1JlcVR5cGU7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7Cit9IHhTeW5jTGlzdFN5c3RlbUNvdW50ZXJzUmVxOworI2RlZmluZSBzel94U3luY0xpc3RTeXN0ZW1Db3VudGVyc1JlcQk0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQ0FSRDgJdW51c2VkOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgSU5UMzIJbkNvdW50ZXJzIEIzMjsKKyAgICBDQVJEMzIJcGFkMCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworfSB4U3luY0xpc3RTeXN0ZW1Db3VudGVyc1JlcGx5OworI2RlZmluZSBzel94U3luY0xpc3RTeXN0ZW1Db3VudGVyc1JlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYU3luY0NvdW50ZXIgY291bnRlciBCMzI7CisgICAgSU5UMzIJcmVzb2x1dGlvbl9oaSBCMzI7CisgICAgQ0FSRDMyCXJlc29sdXRpb25fbG8gQjMyOworICAgIENBUkQxNgluYW1lX2xlbmd0aCBCMTY7Cit9IHhTeW5jU3lzdGVtQ291bnRlcjsKKyNkZWZpbmUgc3pfeFN5bmNTeXN0ZW1Db3VudGVyIDE0CisKKy8qCisgKiBDcmVhdGUgQ291bnRlcgorICovCit0eXBlZGVmIHN0cnVjdCBfeFN5bmNDcmVhdGVDb3VudGVyUmVxIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXN5bmNSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhTeW5jQ291bnRlciBjaWQgQjMyOworICAgIElOVDMyICAgICAgIGluaXRpYWxfdmFsdWVfaGkgQjMyOworICAgIENBUkQzMglpbml0aWFsX3ZhbHVlX2xvIEIzMjsKK30geFN5bmNDcmVhdGVDb3VudGVyUmVxOworI2RlZmluZSBzel94U3luY0NyZWF0ZUNvdW50ZXJSZXEJMTYKKworLyoKKyAqIENoYW5nZSBDb3VudGVyCisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY0NoYW5nZUNvdW50ZXJSZXEgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJc3luY1JlcVR5cGU7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgWFN5bmNDb3VudGVyIGNpZCBCMzI7CisgICAgSU5UMzIgICAgICAgdmFsdWVfaGkgQjMyOworICAgIENBUkQzMgl2YWx1ZV9sbyBCMzI7Cit9IHhTeW5jQ2hhbmdlQ291bnRlclJlcTsKKyNkZWZpbmUgc3pfeFN5bmNDaGFuZ2VDb3VudGVyUmVxCTE2CisKKy8qCisgKiBTZXQgQ291bnRlcgorICovCit0eXBlZGVmIHN0cnVjdCBfeFN5bmNTZXRDb3VudGVyUmVxIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXN5bmNSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhTeW5jQ291bnRlciBjaWQgQjMyOworICAgIElOVDMyICAgICAgIHZhbHVlX2hpIEIzMjsKKyAgICBDQVJEMzIJdmFsdWVfbG8gQjMyOworfSB4U3luY1NldENvdW50ZXJSZXE7CisjZGVmaW5lIHN6X3hTeW5jU2V0Q291bnRlclJlcQkxNgorCisvKgorICogRGVzdHJveSBDb3VudGVyCisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY0Rlc3Ryb3lDb3VudGVyUmVxIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXN5bmNSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhTeW5jQ291bnRlciBjb3VudGVyIEIzMjsKK30geFN5bmNEZXN0cm95Q291bnRlclJlcTsKKyNkZWZpbmUgc3pfeFN5bmNEZXN0cm95Q291bnRlclJlcQk4CisKKy8qCisgKiBRdWVyeSBDb3VudGVyCisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY1F1ZXJ5Q291bnRlclJlcSB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAlzeW5jUmVxVHlwZTsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBYU3luY0NvdW50ZXIgY291bnRlciBCMzI7Cit9IHhTeW5jUXVlcnlDb3VudGVyUmVxOworI2RlZmluZSBzel94U3luY1F1ZXJ5Q291bnRlclJlcQkJOAorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQ0FSRDgJdW51c2VkOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgSU5UMzIJdmFsdWVfaGkgQjMyOworICAgIENBUkQzMgl2YWx1ZV9sbyBCMzI7CisgICAgQ0FSRDMyCXBhZDAgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworfSB4U3luY1F1ZXJ5Q291bnRlclJlcGx5OworI2RlZmluZSBzel94U3luY1F1ZXJ5Q291bnRlclJlcGx5CTMyCisKKy8qCisgKiBBd2FpdAorICovCit0eXBlZGVmIHN0cnVjdCBfeFN5bmNBd2FpdFJlcSB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAlzeW5jUmVxVHlwZTsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geFN5bmNBd2FpdFJlcTsKKyNkZWZpbmUgc3pfeFN5bmNBd2FpdFJlcQkJNAorCit0eXBlZGVmIHN0cnVjdCBfeFN5bmNXYWl0Q29uZGl0aW9uIHsKKyAgICBYU3luY0NvdW50ZXIgY291bnRlciBCMzI7CisgICAgQ0FSRDMyCXZhbHVlX3R5cGUgQjMyOworICAgIElOVDMyICAgICAgIHdhaXRfdmFsdWVfaGkgQjMyOworICAgIENBUkQzMiAgICAgIHdhaXRfdmFsdWVfbG8gQjMyOworICAgIENBUkQzMgl0ZXN0X3R5cGUgQjMyOworICAgIElOVDMyCWV2ZW50X3RocmVzaG9sZF9oaSBCMzI7CisgICAgQ0FSRDMyCWV2ZW50X3RocmVzaG9sZF9sbyBCMzI7Cit9IHhTeW5jV2FpdENvbmRpdGlvbjsKKyNkZWZpbmUgc3pfeFN5bmNXYWl0Q29uZGl0aW9uCQkyOAorCisvKgorICogQ3JlYXRlIEFsYXJtCisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY0NyZWF0ZUFsYXJtUmVxIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXN5bmNSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhTeW5jQWxhcm0JaWQgQjMyOworICAgIENBUkQzMiAgICAgIHZhbHVlTWFzayBCMzI7Cit9IHhTeW5jQ3JlYXRlQWxhcm1SZXE7CisjZGVmaW5lIHN6X3hTeW5jQ3JlYXRlQWxhcm1SZXEJCTEyCisKKy8qCisgKiBEZXN0cm95IEFsYXJtCisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY0Rlc3Ryb3lBbGFybVJlcSB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAlzeW5jUmVxVHlwZTsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBYU3luY0FsYXJtCWFsYXJtIEIzMjsKK30geFN5bmNEZXN0cm95QWxhcm1SZXE7CisjZGVmaW5lIHN6X3hTeW5jRGVzdHJveUFsYXJtUmVxCQk4CisKKy8qCisgKiBRdWVyeSBBbGFybQorICovCit0eXBlZGVmIHN0cnVjdCBfeFN5bmNRdWVyeUFsYXJtUmVxIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXN5bmNSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhTeW5jQWxhcm0JYWxhcm0gQjMyOworfSB4U3luY1F1ZXJ5QWxhcm1SZXE7CisjZGVmaW5lIHN6X3hTeW5jUXVlcnlBbGFybVJlcQkJOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOworICAgIENBUkQ4CXVudXNlZDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIFhTeW5jQ291bnRlciBjb3VudGVyIEIzMjsKKyAgICBDQVJEMzIJdmFsdWVfdHlwZSBCMzI7CisgICAgSU5UMzIJd2FpdF92YWx1ZV9oaSBCMzI7CisgICAgQ0FSRDMyCXdhaXRfdmFsdWVfbG8gQjMyOworICAgIENBUkQzMgl0ZXN0X3R5cGUgICAgICBCMzI7CisgICAgSU5UMzIJZGVsdGFfaGkgQjMyOworICAgIENBUkQzMglkZWx0YV9sbyBCMzI7CisgICAgQk9PTCAgICAgICAgZXZlbnRzOworICAgIEJZVEUgICAgICAgIHN0YXRlOworICAgIEJZVEUJcGFkMDsKKyAgICBCWVRFCXBhZDE7Cit9IHhTeW5jUXVlcnlBbGFybVJlcGx5OworI2RlZmluZSBzel94U3luY1F1ZXJ5QWxhcm1SZXBseQkJNDAKKworLyoKKyAqIENoYW5nZSBBbGFybQorICovCit0eXBlZGVmIHN0cnVjdCBfeFN5bmNDaGFuZ2VBbGFybVJlcSB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAlzeW5jUmVxVHlwZTsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBYU3luY0FsYXJtCWFsYXJtIEIzMjsKKyAgICBDQVJEMzIJdmFsdWVNYXNrIEIzMjsKK30geFN5bmNDaGFuZ2VBbGFybVJlcTsKKyNkZWZpbmUgc3pfeFN5bmNDaGFuZ2VBbGFybVJlcQkJMTIKKworLyoKKyAqIFNldFByaW9yaXR5CisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY1NldFByaW9yaXR5eworICAgIENBUkQ4ICAgCXJlcVR5cGU7CisgICAgQ0FSRDggICAJc3luY1JlcVR5cGU7CisgICAgQ0FSRDE2ICAJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIgIAlpZCBCMzI7CisgICAgSU5UMzIgIAlwcmlvcml0eSBCMzI7Cit9IHhTeW5jU2V0UHJpb3JpdHlSZXE7CisjZGVmaW5lIHN6X3hTeW5jU2V0UHJpb3JpdHlSZXEJICAgIAkxMgorCisvKgorICogR2V0IFByaW9yaXR5CisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY0dldFByaW9yaXR5eworICAgIENBUkQ4ICAgCXJlcVR5cGU7CisgICAgQ0FSRDggICAJc3luY1JlcVR5cGU7CisgICAgQ0FSRDE2ICAJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIgIAlpZCBCMzI7IC8qWFhYIFhJRD8gKi8KK30geFN5bmNHZXRQcmlvcml0eVJlcTsKKyNkZWZpbmUgc3pfeFN5bmNHZXRQcmlvcml0eVJlcQkgICAgCSA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQ0FSRDgJdW51c2VkOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgSU5UMzIgIAlwcmlvcml0eSBCMzI7CisgICAgQ0FSRDMyICAJcGFkMCBCMzI7CisgICAgQ0FSRDMyICAJcGFkMSBCMzI7CisgICAgQ0FSRDMyICAJcGFkMiBCMzI7CisgICAgQ0FSRDMyICAJcGFkMyBCMzI7CisgICAgQ0FSRDMyICAJcGFkNCBCMzI7Cit9IHhTeW5jR2V0UHJpb3JpdHlSZXBseTsKKyNkZWZpbmUgc3pfeFN5bmNHZXRQcmlvcml0eVJlcGx5CTMyCisKKy8qCisgKiBDcmVhdGUgRmVuY2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3hTeW5jQ3JlYXRlRmVuY2VSZXEgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJc3luY1JlcVR5cGU7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgRHJhd2FibGUJZCBCMzI7CisgICAgWFN5bmNGZW5jZQlmaWQgQjMyOworICAgIEJPT0wJaW5pdGlhbGx5X3RyaWdnZXJlZDsKKyAgICBDQVJEOAlwYWQwOworICAgIENBUkQxNglwYWQxOworfSB4U3luY0NyZWF0ZUZlbmNlUmVxOworI2RlZmluZSBzel94U3luY0NyZWF0ZUZlbmNlUmVxCQkxNgorCisvKgorICogUHV0IGEgZmVuY2Ugb2JqZWN0IGluIHRoZSAidHJpZ2dlcmVkIiBzdGF0ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3hTeW5jVHJpZ2dlckZlbmNlUmVxIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXN5bmNSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhTeW5jRmVuY2UJZmlkIEIzMjsKK30geFN5bmNUcmlnZ2VyRmVuY2VSZXE7CisjZGVmaW5lIHN6X3hTeW5jVHJpZ2dlckZlbmNlUmVxCQk4CisKKy8qCisgKiBQdXQgYSBmZW5jZSBpbiB0aGUgInVudHJpZ2dlcmVkIiBzdGF0ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3hTeW5jUmVzZXRGZW5jZVJlcSB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAlzeW5jUmVxVHlwZTsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBYU3luY0ZlbmNlCWZpZCBCMzI7Cit9IHhTeW5jUmVzZXRGZW5jZVJlcTsKKyNkZWZpbmUgc3pfeFN5bmNSZXNldEZlbmNlUmVxCQk4CisKKy8qCisgKiBEZXN0cm95IGEgZmVuY2Ugb2JqZWN0CisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY0Rlc3Ryb3lGZW5jZVJlcSB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAlzeW5jUmVxVHlwZTsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBYU3luY0ZlbmNlCWZpZCBCMzI7Cit9IHhTeW5jRGVzdHJveUZlbmNlUmVxOworI2RlZmluZSBzel94U3luY0Rlc3Ryb3lGZW5jZVJlcQkJOAorCisvKgorICogUXVlcnkgYSBmZW5jZSBvYmplY3QKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3hTeW5jUXVlcnlGZW5jZVJlcSB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAlzeW5jUmVxVHlwZTsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBYU3luY0ZlbmNlCWZpZCBCMzI7Cit9IHhTeW5jUXVlcnlGZW5jZVJlcTsKKyNkZWZpbmUgc3pfeFN5bmNRdWVyeUZlbmNlUmVxCQk4CisKKy8qCisgKiBXYWl0IGZvciBhbnkgb2YgYSBsaXN0IG9mIGZlbmNlIHN5bmMgb2JqZWN0cworICogdG8gcmVhY2ggdGhlICJ0cmlnZ2VyZWQiIHN0YXRlLgorICovCit0eXBlZGVmIHN0cnVjdCBfeFN5bmNBd2FpdEZlbmNlUmVxIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXN5bmNSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworfSB4U3luY0F3YWl0RmVuY2VSZXE7CisjZGVmaW5lIHN6X3hTeW5jQXdhaXRGZW5jZVJlcQkJNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOworICAgIENBUkQ4CXVudXNlZDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIEJPT0wJdHJpZ2dlcmVkOworICAgIEJZVEUJcGFkMDsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKK30geFN5bmNRdWVyeUZlbmNlUmVwbHk7CisjZGVmaW5lIHN6X3hTeW5jUXVlcnlGZW5jZVJlcGx5CQkzMgorCisvKgorICogRXZlbnRzCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX3hTeW5jQ291bnRlck5vdGlmeUV2ZW50IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQlraW5kOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgWFN5bmNDb3VudGVyIGNvdW50ZXIgQjMyOworICAgIElOVDMyCXdhaXRfdmFsdWVfaGkgQjMyOworICAgIENBUkQzMgl3YWl0X3ZhbHVlX2xvIEIzMjsKKyAgICBJTlQzMgljb3VudGVyX3ZhbHVlX2hpIEIzMjsKKyAgICBDQVJEMzIJY291bnRlcl92YWx1ZV9sbyBCMzI7CisgICAgQ0FSRDMyCXRpbWUgQjMyOworICAgIENBUkQxNgljb3VudCBCMTY7CisgICAgQk9PTAlkZXN0cm95ZWQ7CisgICAgQllURSAgICAgICAgcGFkMDsKK30geFN5bmNDb3VudGVyTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IF94U3luY0FsYXJtTm90aWZ5RXZlbnQgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCWtpbmQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBYU3luY0FsYXJtCWFsYXJtIEIzMjsKKyAgICBJTlQzMgljb3VudGVyX3ZhbHVlX2hpIEIzMjsKKyAgICBDQVJEMzIJY291bnRlcl92YWx1ZV9sbyBCMzI7CisgICAgSU5UMzIJYWxhcm1fdmFsdWVfaGkgQjMyOworICAgIENBUkQzMglhbGFybV92YWx1ZV9sbyBCMzI7CisgICAgQ0FSRDMyCXRpbWUgQjMyOworICAgIENBUkQ4ICAgICAgIHN0YXRlOworICAgIEJZVEUgICAgICAgIHBhZDA7CisgICAgQllURSAgICAgICAgcGFkMTsKKyAgICBCWVRFICAgICAgICBwYWQyOworfSB4U3luY0FsYXJtTm90aWZ5RXZlbnQ7CisKKyN1bmRlZiBYU3luY0NvdW50ZXIKKyN1bmRlZiBYU3luY0FsYXJtCisjdW5kZWYgWFN5bmNGZW5jZQorI3VuZGVmIERyYXdhYmxlCisKKworI2VuZGlmIC8qIF9TWU5DUFJPVE9fSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc3luY3N0ci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zeW5jc3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhNDgyNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc3luY3N0ci5oCkBAIC0wLDAgKzEsMTgyIEBACisvKgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgMTk5MSwxOTkzIGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLAorYW5kIE9saXZldHRpIFJlc2VhcmNoIExpbWl0ZWQsIENhbWJyaWRnZSwgRW5nbGFuZC4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZXMgb2YgRGlnaXRhbCBvciBPbGl2ZXR0aQorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgCisKK0RJR0lUQUwgQU5EIE9MSVZFVFRJIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMKK1NPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECitGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEVZIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCitDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCitVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKK09USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKK1BFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfU1lOQ1NUUl9IXworI2RlZmluZSBfU1lOQ1NUUl9IXworCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvc3luY3Byb3RvLmg+CisKKyNpZmRlZiBfU1lOQ19TRVJWRVIKKworI2RlZmluZSBDQVJENjQgWFN5bmNWYWx1ZSAvKiBYWFggdGVtcG9yYXJ5ISBuZWVkIHJlYWwgNjQgYml0IHZhbHVlcyBmb3IgQWxwaGEgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1N5bmNDb3VudGVyIHsKKyAgICBDbGllbnRQdHIJCWNsaWVudDsJLyogT3duaW5nIGNsaWVudC4gMCBmb3Igc3lzdGVtIGNvdW50ZXJzICovCisgICAgWFN5bmNDb3VudGVyCWlkOwkJLyogcmVzb3VyY2UgSUQgKi8KKyAgICBDQVJENjQJCXZhbHVlOwkJLyogY291bnRlciB2YWx1ZSAqLworICAgIHN0cnVjdCBfU3luY1RyaWdnZXJMaXN0ICpwVHJpZ2xpc3Q7CS8qIGxpc3Qgb2YgdHJpZ2dlcnMgKi8KKyAgICBCb29sCQliZWluZ0Rlc3Ryb3llZDsgLyogaW4gcHJvY2VzcyBvZiBnb2luZyBhd2F5ICovCisgICAgc3RydWN0IF9TeXNDb3VudGVySW5mbyAqcFN5c0NvdW50ZXJJbmZvOyAvKiBOVUxMIGlmIG5vdCBhIHN5c3RlbSBjb3VudGVyICovCit9IFN5bmNDb3VudGVyOworCisvKgorICogVGhlIFN5c3RlbSBDb3VudGVyIGludGVyZmFjZQorICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgWFN5bmNDb3VudGVyTmV2ZXJDaGFuZ2VzLAorICAgIFhTeW5jQ291bnRlck5ldmVySW5jcmVhc2VzLAorICAgIFhTeW5jQ291bnRlck5ldmVyRGVjcmVhc2VzLAorICAgIFhTeW5jQ291bnRlclVucmVzdHJpY3RlZAorfSBTeW5jQ291bnRlclR5cGU7CisKK3R5cGVkZWYgc3RydWN0IF9TeXNDb3VudGVySW5mbyB7CisgICAgY2hhcgkqbmFtZTsKKyAgICBDQVJENjQJcmVzb2x1dGlvbjsKKyAgICBDQVJENjQJYnJhY2tldF9ncmVhdGVyOworICAgIENBUkQ2NAlicmFja2V0X2xlc3M7CisgICAgU3luY0NvdW50ZXJUeXBlIGNvdW50ZXJUeXBlOyAgLyogaG93IGNhbiB0aGlzIGNvdW50ZXIgY2hhbmdlICovCisgICAgdm9pZCAgICAgICAgKCpRdWVyeVZhbHVlKSgKKwkJCSAgICAgIHBvaW50ZXIgLypwQ291bnRlciovLAorCQkJICAgICAgQ0FSRDY0ICogLypmcmVzaHZhbHVlKi8KKyk7CisgICAgdm9pZAkoKkJyYWNrZXRWYWx1ZXMpKAorCQkJCSBwb2ludGVyIC8qcENvdW50ZXIqLywKKwkJCQkgQ0FSRDY0ICogLypsZXNzdGhhbiovLAorCQkJCSBDQVJENjQgKiAvKmdyZWF0ZXJ0aGFuKi8KKyk7Cit9IFN5c0NvdW50ZXJJbmZvOworCisKKwordHlwZWRlZiBzdHJ1Y3QgX1N5bmNUcmlnZ2VyIHsKKyAgICBTeW5jQ291bnRlciAqcENvdW50ZXI7CisgICAgQ0FSRDY0CXdhaXRfdmFsdWU7CS8qIHdhaXQgdmFsdWUgKi8KKyAgICB1bnNpZ25lZCBpbnQgdmFsdWVfdHlwZTsgICAgIC8qIEFic29sdXRlIG9yIFJlbGF0aXZlICovCisgICAgdW5zaWduZWQgaW50IHRlc3RfdHlwZTsJLyogdHJhbnNpdGlvbiBvciBDb21wYXJpc2lvbiB0eXBlICovCisgICAgQ0FSRDY0CXRlc3RfdmFsdWU7CS8qIHRyaWdnZXIgZXZlbnQgdGhyZXNob2xkIHZhbHVlICovCisgICAgQm9vbAkoKkNoZWNrVHJpZ2dlcikoCisJCQkJc3RydWN0IF9TeW5jVHJpZ2dlciAqIC8qcFRyaWdnZXIqLywKKwkJCQlDQVJENjQgLypuZXd2YWwqLworCQkJCSk7CisgICAgdm9pZAkoKlRyaWdnZXJGaXJlZCkoCisJCQkJc3RydWN0IF9TeW5jVHJpZ2dlciAqIC8qcFRyaWdnZXIqLworCQkJCSk7CisgICAgdm9pZAkoKkNvdW50ZXJEZXN0cm95ZWQpKAorCQkJCXN0cnVjdCBfU3luY1RyaWdnZXIgKiAvKnBUcmlnZ2VyKi8KKwkJCQkgICAgKTsKK30gU3luY1RyaWdnZXI7CisKK3R5cGVkZWYgc3RydWN0IF9TeW5jVHJpZ2dlckxpc3QgeworICAgIFN5bmNUcmlnZ2VyICpwVHJpZ2dlcjsKKyAgICBzdHJ1Y3QgX1N5bmNUcmlnZ2VyTGlzdCAqbmV4dDsKK30gU3luY1RyaWdnZXJMaXN0OworCit0eXBlZGVmIHN0cnVjdCBfU3luY0FsYXJtQ2xpZW50TGlzdCB7CisgICAgQ2xpZW50UHRyCWNsaWVudDsKKyAgICBYSUQJCWRlbGV0ZV9pZDsKKyAgICBzdHJ1Y3QgX1N5bmNBbGFybUNsaWVudExpc3QgKm5leHQ7Cit9IFN5bmNBbGFybUNsaWVudExpc3Q7CisKK3R5cGVkZWYgc3RydWN0IF9TeW5jQWxhcm0geworICAgIFN5bmNUcmlnZ2VyIHRyaWdnZXI7CisgICAgQ2xpZW50UHRyCWNsaWVudDsKKyAgICBYU3luY0FsYXJtIAlhbGFybV9pZDsKKyAgICBDQVJENjQJZGVsdGE7CisgICAgaW50CQlldmVudHM7CisgICAgaW50CQlzdGF0ZTsKKyAgICBTeW5jQWxhcm1DbGllbnRMaXN0ICpwRXZlbnRDbGllbnRzOworfSBTeW5jQWxhcm07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDbGllbnRQdHIJY2xpZW50OworICAgIENBUkQzMiAJZGVsZXRlX2lkOworICAgIGludAkJbnVtX3dhaXRjb25kaXRpb25zOworfSBTeW5jQXdhaXRIZWFkZXI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBTeW5jVHJpZ2dlciB0cmlnZ2VyOworICAgIENBUkQ2NAlldmVudF90aHJlc2hvbGQ7CisgICAgU3luY0F3YWl0SGVhZGVyICpwSGVhZGVyOworfSBTeW5jQXdhaXQ7CisKK3R5cGVkZWYgdW5pb24geworICAgIFN5bmNBd2FpdEhlYWRlciBoZWFkZXI7CisgICAgU3luY0F3YWl0CSAgICBhd2FpdDsKK30gU3luY0F3YWl0VW5pb247CisKKworZXh0ZXJuIHBvaW50ZXIgU3luY0NyZWF0ZVN5c3RlbUNvdW50ZXIoCisgICAgY2hhciAqCS8qIG5hbWUgKi8sCisgICAgQ0FSRDY0ICAJLyogaW5pdGFsX3ZhbHVlICovLAorICAgIENBUkQ2NCAgCS8qIHJlc29sdXRpb24gKi8sCisgICAgU3luY0NvdW50ZXJUeXBlIC8qIGNoYW5nZSBjaGFyYWN0ZXJpemF0aW9uICovLAorICAgIHZvaWQgICAgICAgICgqIC8qUXVlcnlWYWx1ZSovICkgKAorICAgICAgICBwb2ludGVyIC8qIHBDb3VudGVyICovLAorICAgICAgICBDQVJENjQgKiAvKiBwVmFsdWVfcmV0dXJuICovKSwgLyogWFhYIHByb3RvdHlwZSAqLworICAgIHZvaWQgICAgICAgICgqIC8qQnJhY2tldFZhbHVlcyovKSAoCisgICAgICAgIHBvaW50ZXIgLyogcENvdW50ZXIgKi8sIAorICAgICAgICBDQVJENjQgKiAvKiBwYnJhY2tldF9sZXNzICovLAorICAgICAgICBDQVJENjQgKiAvKiBwYnJhY2tldF9ncmVhdGVyICovKQorKTsKKworZXh0ZXJuIHZvaWQgU3luY0NoYW5nZUNvdW50ZXIoCisgICAgU3luY0NvdW50ZXIgKgkvKiBwQ291bnRlciovLAorICAgIENBUkQ2NCAgCQkvKiBuZXdfdmFsdWUgKi8KKyk7CisKK2V4dGVybiB2b2lkIFN5bmNEZXN0cm95U3lzdGVtQ291bnRlcigKKyAgICBwb2ludGVyIHBDb3VudGVyCispOworZXh0ZXJuIHZvaWQgSW5pdFNlcnZlcnRpbWUodm9pZCk7CisKKyNlbmRpZiAvKiBfU1lOQ19TRVJWRVIgKi8KKworI2VuZGlmIC8qIF9TWU5DU1RSX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3hmaXhlc3Byb3RvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3hmaXhlc3Byb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4OWMxOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMveGZpeGVzcHJvdG8uaApAQCAtMCwwICsxLDYwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDEwIFJlZCBIYXQsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwMiBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CisgKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfWEZJWEVTUFJPVE9fSF8KKyNkZWZpbmUgX1hGSVhFU1BST1RPX0hfCisKKyNpbmNsdWRlIDxYMTEvWG1kLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMveGZpeGVzd2lyZS5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL3NoYXBlY29uc3QuaD4KKworI2RlZmluZSBXaW5kb3cgQ0FSRDMyCisjZGVmaW5lIERyYXdhYmxlIENBUkQzMgorI2RlZmluZSBGb250IENBUkQzMgorI2RlZmluZSBQaXhtYXAgQ0FSRDMyCisjZGVmaW5lIEN1cnNvciBDQVJEMzIKKyNkZWZpbmUgQ29sb3JtYXAgQ0FSRDMyCisjZGVmaW5lIEdDb250ZXh0IENBUkQzMgorI2RlZmluZSBBdG9tIENBUkQzMgorI2RlZmluZSBWaXN1YWxJRCBDQVJEMzIKKyNkZWZpbmUgVGltZSBDQVJEMzIKKyNkZWZpbmUgS2V5Q29kZSBDQVJEOAorI2RlZmluZSBLZXlTeW0gQ0FSRDMyCisjZGVmaW5lIFBpY3R1cmUgQ0FSRDMyCisKKy8qKioqKioqKioqKioqKiogVmVyc2lvbiAxICoqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworfSB4WEZpeGVzUmVxOworCisvKiAKKyAqIHJlcXVlc3RzIGFuZCByZXBsaWVzCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIgIG1ham9yVmVyc2lvbiBCMzI7CisgICAgQ0FSRDMyICBtaW5vclZlcnNpb24gQjMyOworfSB4WEZpeGVzUXVlcnlWZXJzaW9uUmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNRdWVyeVZlcnNpb25SZXEgICAxMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSAgICB0eXBlOyAgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFICAgIHBhZDE7CisgICAgQ0FSRDE2ICBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyICBsZW5ndGggQjMyOworICAgIENBUkQzMiAgbWFqb3JWZXJzaW9uIEIzMjsKKyAgICBDQVJEMzIgIG1pbm9yVmVyc2lvbiBCMzI7CisgICAgQ0FSRDMyICBwYWQyIEIzMjsKKyAgICBDQVJEMzIgIHBhZDMgQjMyOworICAgIENBUkQzMiAgcGFkNCBCMzI7CisgICAgQ0FSRDMyICBwYWQ1IEIzMjsKK30geFhGaXhlc1F1ZXJ5VmVyc2lvblJlcGx5OworCisjZGVmaW5lIHN6X3hYRml4ZXNRdWVyeVZlcnNpb25SZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgQllURSAgICBtb2RlOwkgICAgLyogU2V0TW9kZUluc2VydC9TZXRNb2RlRGVsZXRlKi8KKyAgICBCWVRFICAgIHRhcmdldDsJICAgIC8qIFNhdmVTZXROZWFyZXN0L1NhdmVTZXRSb290Ki8KKyAgICBCWVRFICAgIG1hcDsJICAgIC8qIFNhdmVTZXRNYXAvU2F2ZVNldFVubWFwICovCisgICAgQllURSAgICBwYWQxOworICAgIFdpbmRvdyAgd2luZG93OworfSB4WEZpeGVzQ2hhbmdlU2F2ZVNldFJlcTsKKworI2RlZmluZSBzel94WEZpeGVzQ2hhbmdlU2F2ZVNldFJlcQkxMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgV2luZG93ICB3aW5kb3cgIEIzMjsKKyAgICBBdG9tICAgIHNlbGVjdGlvbiBCMzI7CisgICAgQ0FSRDMyICBldmVudE1hc2sgQjMyOworfSB4WEZpeGVzU2VsZWN0U2VsZWN0aW9uSW5wdXRSZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc1NlbGVjdFNlbGVjdGlvbklucHV0UmVxICAgMTYKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgdHlwZTsKKyAgICBDQVJEOCAgIHN1YnR5cGU7CisgICAgQ0FSRDE2ICBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgV2luZG93ICB3aW5kb3cgQjMyOworICAgIFdpbmRvdyAgb3duZXIgQjMyOworICAgIEF0b20gICAgc2VsZWN0aW9uIEIzMjsKKyAgICBUaW1lICAgIHRpbWVzdGFtcCBCMzI7CisgICAgVGltZSAgICBzZWxlY3Rpb25UaW1lc3RhbXAgQjMyOworICAgIENBUkQzMiAgcGFkMiBCMzI7CisgICAgQ0FSRDMyICBwYWQzIEIzMjsKK30geFhGaXhlc1NlbGVjdGlvbk5vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgV2luZG93ICB3aW5kb3cgQjMyOworICAgIENBUkQzMiAgZXZlbnRNYXNrIEIzMjsKK30geFhGaXhlc1NlbGVjdEN1cnNvcklucHV0UmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNTZWxlY3RDdXJzb3JJbnB1dFJlcQkxMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICB0eXBlOworICAgIENBUkQ4ICAgc3VidHlwZTsKKyAgICBDQVJEMTYgIHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBXaW5kb3cgIHdpbmRvdyBCMzI7CisgICAgQ0FSRDMyICBjdXJzb3JTZXJpYWwgQjMyOworICAgIFRpbWUgICAgdGltZXN0YW1wOworICAgIEF0b20gICAgbmFtZSBCMzI7CSAgICAvKiBWZXJzaW9uIDIgKi8KKyAgICBDQVJEMzIgIHBhZDEgQjMyOworICAgIENBUkQzMiAgcGFkMiBCMzI7CisgICAgQ0FSRDMyICBwYWQzIEIzMjsKK30geFhGaXhlc0N1cnNvck5vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7Cit9IHhYRml4ZXNHZXRDdXJzb3JJbWFnZVJlcTsKKworI2RlZmluZSBzel94WEZpeGVzR2V0Q3Vyc29ySW1hZ2VSZXEgNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSAgICB0eXBlOyAgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFICAgIHBhZDE7CisgICAgQ0FSRDE2ICBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyICBsZW5ndGggQjMyOworICAgIElOVDE2ICAgeCBCMTY7CisgICAgSU5UMTYgICB5IEIxNjsKKyAgICBDQVJEMTYgIHdpZHRoIEIxNjsKKyAgICBDQVJEMTYgIGhlaWdodCBCMTY7CisgICAgQ0FSRDE2ICB4aG90IEIxNjsKKyAgICBDQVJEMTYgIHlob3QgQjE2OworICAgIENBUkQzMiAgY3Vyc29yU2VyaWFsIEIzMjsKKyAgICBDQVJEMzIgIHBhZDIgQjMyOworICAgIENBUkQzMiAgcGFkMyBCMzI7Cit9IHhYRml4ZXNHZXRDdXJzb3JJbWFnZVJlcGx5OworCisjZGVmaW5lIHN6X3hYRml4ZXNHZXRDdXJzb3JJbWFnZVJlcGx5CTMyCisKKy8qKioqKioqKioqKioqKiogVmVyc2lvbiAyICoqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBSZWdpb24gQ0FSRDMyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBSZWdpb24gIHJlZ2lvbiBCMzI7CisgICAgLyogTElTVG9mUkVDVEFOR0xFICovCit9IHhYRml4ZXNDcmVhdGVSZWdpb25SZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc0NyZWF0ZVJlZ2lvblJlcQk4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBSZWdpb24gIHJlZ2lvbiBCMzI7CisgICAgUGl4bWFwICBiaXRtYXAgQjMyOworfSB4WEZpeGVzQ3JlYXRlUmVnaW9uRnJvbUJpdG1hcFJlcTsKKworI2RlZmluZSBzel94WEZpeGVzQ3JlYXRlUmVnaW9uRnJvbUJpdG1hcFJlcQkxMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgUmVnaW9uICByZWdpb24gQjMyOworICAgIFdpbmRvdyAgd2luZG93IEIzMjsKKyAgICBDQVJEOCAgIGtpbmQ7CisgICAgQ0FSRDggICBwYWQxOworICAgIENBUkQxNiAgcGFkMiBCMTY7Cit9IHhYRml4ZXNDcmVhdGVSZWdpb25Gcm9tV2luZG93UmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNDcmVhdGVSZWdpb25Gcm9tV2luZG93UmVxCTE2CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBSZWdpb24gIHJlZ2lvbiBCMzI7CisgICAgR0NvbnRleHQgZ2MgQjMyOworfSB4WEZpeGVzQ3JlYXRlUmVnaW9uRnJvbUdDUmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNDcmVhdGVSZWdpb25Gcm9tR0NSZXEJMTIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIFJlZ2lvbiAgcmVnaW9uIEIzMjsKKyAgICBQaWN0dXJlIHBpY3R1cmUgQjMyOworfSB4WEZpeGVzQ3JlYXRlUmVnaW9uRnJvbVBpY3R1cmVSZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc0NyZWF0ZVJlZ2lvbkZyb21QaWN0dXJlUmVxCTEyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBSZWdpb24gIHJlZ2lvbiBCMzI7Cit9IHhYRml4ZXNEZXN0cm95UmVnaW9uUmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNEZXN0cm95UmVnaW9uUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIFJlZ2lvbiAgcmVnaW9uIEIzMjsKKyAgICAvKiBMSVNUb2ZSRUNUQU5HTEUgKi8KK30geFhGaXhlc1NldFJlZ2lvblJlcTsKKworI2RlZmluZSBzel94WEZpeGVzU2V0UmVnaW9uUmVxCQk4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBSZWdpb24gIHNvdXJjZSBCMzI7CisgICAgUmVnaW9uICBkZXN0aW5hdGlvbiBCMzI7Cit9IHhYRml4ZXNDb3B5UmVnaW9uUmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNDb3B5UmVnaW9uUmVxCQkxMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgUmVnaW9uICBzb3VyY2UxIEIzMjsKKyAgICBSZWdpb24gIHNvdXJjZTIgQjMyOworICAgIFJlZ2lvbiAgZGVzdGluYXRpb24gQjMyOworfSB4WEZpeGVzQ29tYmluZVJlZ2lvblJlcSwKKyAgeFhGaXhlc1VuaW9uUmVnaW9uUmVxLAorICB4WEZpeGVzSW50ZXJzZWN0UmVnaW9uUmVxLAorICB4WEZpeGVzU3VidHJhY3RSZWdpb25SZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc0NvbWJpbmVSZWdpb25SZXEJMTYKKyNkZWZpbmUgc3pfeFhGaXhlc1VuaW9uUmVnaW9uUmVxCXN6X3hYRml4ZXNDb21iaW5lUmVnaW9uUmVxCisjZGVmaW5lIHN6X3hYRml4ZXNJbnRlcnNlY3RSZWdpb25SZXEJc3pfeFhGaXhlc0NvbWJpbmVSZWdpb25SZXEKKyNkZWZpbmUgc3pfeFhGaXhlc1N1YnRyYWN0UmVnaW9uUmVxCXN6X3hYRml4ZXNDb21iaW5lUmVnaW9uUmVxCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBSZWdpb24gIHNvdXJjZSBCMzI7CisgICAgSU5UMTYgICB4IEIxNiwgeSBCMTY7CisgICAgQ0FSRDE2ICB3aWR0aCBCMTYsIGhlaWdodCBCMTY7CisgICAgUmVnaW9uICBkZXN0aW5hdGlvbiBCMzI7Cit9IHhYRml4ZXNJbnZlcnRSZWdpb25SZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc0ludmVydFJlZ2lvblJlcQkyMAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgUmVnaW9uICByZWdpb24gQjMyOworICAgIElOVDE2ICAgZHggQjE2LCBkeSBCMTY7Cit9IHhYRml4ZXNUcmFuc2xhdGVSZWdpb25SZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc1RyYW5zbGF0ZVJlZ2lvblJlcQkxMgorICAgIAordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIFJlZ2lvbiAgc291cmNlIEIzMjsKKyAgICBSZWdpb24gIGRlc3RpbmF0aW9uIEIzMjsKK30geFhGaXhlc1JlZ2lvbkV4dGVudHNSZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc1JlZ2lvbkV4dGVudHNSZXEJMTIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIFJlZ2lvbiAgcmVnaW9uIEIzMjsKK30geFhGaXhlc0ZldGNoUmVnaW9uUmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNGZXRjaFJlZ2lvblJlcQk4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFICAgIHR5cGU7ICAgLyogWF9SZXBseSAqLworICAgIEJZVEUgICAgcGFkMTsKKyAgICBDQVJEMTYgIHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgIGxlbmd0aCBCMzI7CisgICAgSU5UMTYgICB4IEIxNiwgeSBCMTY7CisgICAgQ0FSRDE2ICB3aWR0aCBCMTYsIGhlaWdodCBCMTY7CisgICAgQ0FSRDMyICBwYWQyIEIzMjsKKyAgICBDQVJEMzIgIHBhZDMgQjMyOworICAgIENBUkQzMiAgcGFkNCBCMzI7CisgICAgQ0FSRDMyICBwYWQ1IEIzMjsKK30geFhGaXhlc0ZldGNoUmVnaW9uUmVwbHk7CisKKyNkZWZpbmUgc3pfeFhGaXhlc0ZldGNoUmVnaW9uUmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIEdDb250ZXh0CWdjIEIzMjsKKyAgICBSZWdpb24gIHJlZ2lvbiBCMzI7CisgICAgSU5UMTYgICB4T3JpZ2luIEIxNiwgeU9yaWdpbiBCMTY7Cit9IHhYRml4ZXNTZXRHQ0NsaXBSZWdpb25SZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc1NldEdDQ2xpcFJlZ2lvblJlcQkxNgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgV2luZG93ICBkZXN0OworICAgIEJZVEUgICAgZGVzdEtpbmQ7CisgICAgQ0FSRDggICBwYWQxOworICAgIENBUkQxNiAgcGFkMiBCMTY7CisgICAgSU5UMTYgICB4T2ZmIEIxNiwgeU9mZiBCMTY7CisgICAgUmVnaW9uICByZWdpb247Cit9IHhYRml4ZXNTZXRXaW5kb3dTaGFwZVJlZ2lvblJlcTsKKworI2RlZmluZSBzel94WEZpeGVzU2V0V2luZG93U2hhcGVSZWdpb25SZXEJMjAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIFBpY3R1cmUgcGljdHVyZSBCMzI7CisgICAgUmVnaW9uICByZWdpb24gQjMyOworICAgIElOVDE2ICAgeE9yaWdpbiBCMTYsIHlPcmlnaW4gQjE2OworfSB4WEZpeGVzU2V0UGljdHVyZUNsaXBSZWdpb25SZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc1NldFBpY3R1cmVDbGlwUmVnaW9uUmVxICAgMTYKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIEN1cnNvciAgY3Vyc29yIEIzMjsKKyAgICBDQVJEMTYgIG5ieXRlcyBCMTY7CisgICAgQ0FSRDE2ICBwYWQgQjE2OworfSB4WEZpeGVzU2V0Q3Vyc29yTmFtZVJlcTsKKworI2RlZmluZSBzel94WEZpeGVzU2V0Q3Vyc29yTmFtZVJlcQkgICAgMTIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIEN1cnNvciAgY3Vyc29yIEIzMjsKK30geFhGaXhlc0dldEN1cnNvck5hbWVSZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc0dldEN1cnNvck5hbWVSZXEJICAgIDgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgICAgdHlwZTsgICAvKiBYX1JlcGx5ICovCisgICAgQllURSAgICBwYWQxOworICAgIENBUkQxNiAgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiAgbGVuZ3RoIEIzMjsKKyAgICBBdG9tICAgIGF0b20gQjMyOworICAgIENBUkQxNiAgbmJ5dGVzIEIxNjsKKyAgICBDQVJEMTYgIHBhZDIgQjE2OworICAgIENBUkQzMiAgcGFkMyBCMzI7CisgICAgQ0FSRDMyICBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgIHBhZDUgQjMyOworICAgIENBUkQzMiAgcGFkNiBCMzI7Cit9IHhYRml4ZXNHZXRDdXJzb3JOYW1lUmVwbHk7CisKKyNkZWZpbmUgc3pfeFhGaXhlc0dldEN1cnNvck5hbWVSZXBseQkgICAgMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworfSB4WEZpeGVzR2V0Q3Vyc29ySW1hZ2VBbmROYW1lUmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNHZXRDdXJzb3JJbWFnZUFuZE5hbWVSZXEgIDQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgICAgdHlwZTsgICAvKiBYX1JlcGx5ICovCisgICAgQllURSAgICBwYWQxOworICAgIENBUkQxNiAgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiAgbGVuZ3RoIEIzMjsKKyAgICBJTlQxNiAgIHggQjE2OworICAgIElOVDE2ICAgeSBCMTY7CisgICAgQ0FSRDE2ICB3aWR0aCBCMTY7CisgICAgQ0FSRDE2ICBoZWlnaHQgQjE2OworICAgIENBUkQxNiAgeGhvdCBCMTY7CisgICAgQ0FSRDE2ICB5aG90IEIxNjsKKyAgICBDQVJEMzIgIGN1cnNvclNlcmlhbCBCMzI7CisgICAgQXRvbSAgICBjdXJzb3JOYW1lIEIzMjsKKyAgICBDQVJEMTYgIG5ieXRlcyBCMTY7CisgICAgQ0FSRDE2ICBwYWQgQjE2OworfSB4WEZpeGVzR2V0Q3Vyc29ySW1hZ2VBbmROYW1lUmVwbHk7CisKKyNkZWZpbmUgc3pfeFhGaXhlc0dldEN1cnNvckltYWdlQW5kTmFtZVJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBDdXJzb3IgIHNvdXJjZSBCMzI7CisgICAgQ3Vyc29yICBkZXN0aW5hdGlvbiBCMzI7Cit9IHhYRml4ZXNDaGFuZ2VDdXJzb3JSZXE7CisKKyNkZWZpbmUgc3pfeFhGaXhlc0NoYW5nZUN1cnNvclJlcQkxMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgQ3Vyc29yICBzb3VyY2UgQjMyOworICAgIENBUkQxNiAgbmJ5dGVzOworICAgIENBUkQxNiAgcGFkOworfSB4WEZpeGVzQ2hhbmdlQ3Vyc29yQnlOYW1lUmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNDaGFuZ2VDdXJzb3JCeU5hbWVSZXEJMTIKKworLyoqKioqKioqKioqKioqKiBWZXJzaW9uIDMgKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgUmVnaW9uICBzb3VyY2UgQjMyOworICAgIFJlZ2lvbiAgZGVzdGluYXRpb24gQjMyOworICAgIENBUkQxNiAgbGVmdCBCMTY7CisgICAgQ0FSRDE2ICByaWdodCBCMTY7CisgICAgQ0FSRDE2ICB0b3AgQjE2OworICAgIENBUkQxNiAgYm90dG9tIEIxNjsKK30geFhGaXhlc0V4cGFuZFJlZ2lvblJlcTsKKworI2RlZmluZSBzel94WEZpeGVzRXhwYW5kUmVnaW9uUmVxCTIwCisKKy8qKioqKioqKioqKioqKiogVmVyc2lvbiA0LjAgKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgV2luZG93ICB3aW5kb3cgQjMyOworfSB4WEZpeGVzSGlkZUN1cnNvclJlcTsKKworI2RlZmluZSBzel94WEZpeGVzSGlkZUN1cnNvclJlcQlzaXplb2YoeFhGaXhlc0hpZGVDdXJzb3JSZXEpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgIHdpbmRvdyBCMzI7Cit9IHhYRml4ZXNTaG93Q3Vyc29yUmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNTaG93Q3Vyc29yUmVxCXNpemVvZih4WEZpeGVzU2hvd0N1cnNvclJlcSkKKworLyoqKioqKioqKioqKioqKiBWZXJzaW9uIDUuMCAqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQmFycmllciBDQVJEMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIEJhcnJpZXIgYmFycmllciBCMzI7CisgICAgV2luZG93ICB3aW5kb3cgQjMyOworICAgIElOVDE2ICAgeDEgQjE2OworICAgIElOVDE2ICAgeTEgQjE2OworICAgIElOVDE2ICAgeDIgQjE2OworICAgIElOVDE2ICAgeTIgQjE2OworICAgIENBUkQzMiAgZGlyZWN0aW9uczsKKyAgICBDQVJEMTYgIHBhZCBCMTY7CisgICAgQ0FSRDE2ICBudW1fZGV2aWNlcyBCMTY7CisgICAgLyogYXJyYXkgb2YgQ0FSRDE2IGRldmljZXMgKi8KK30geFhGaXhlc0NyZWF0ZVBvaW50ZXJCYXJyaWVyUmVxOworCisjZGVmaW5lIHN6X3hYRml4ZXNDcmVhdGVQb2ludGVyQmFycmllclJlcSAyOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgQmFycmllciBiYXJyaWVyIEIzMjsKK30geFhGaXhlc0Rlc3Ryb3lQb2ludGVyQmFycmllclJlcTsKKworI2RlZmluZSBzel94WEZpeGVzRGVzdHJveVBvaW50ZXJCYXJyaWVyUmVxIDgKKworLyoqKioqKioqKioqKioqKiBWZXJzaW9uIDYuMCAqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQmFycmllckV2ZW50SUQgQ0FSRDMyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgQ0FSRDggICB0eXBlOworICBDQVJEOCAgIHN1YnR5cGU7CisgIENBUkQxNiAgc2VxdWVuY2VOdW1iZXIgQjE2OworICBXaW5kb3cgIHdpbmRvdzsgQjMyOworICBCYXJyaWVyRXZlbnRJRCBldmVudF9pZCBCMzI7CisgIEJhcnJpZXIgYmFycmllcjsKKyAgVGltZSAgICB0aW1lc3RhbXAgQjMyOworICBDQVJEMzIgIHZlbG9jaXR5IEIzMjsKKyAgSU5UMTYgICB4IEIxNjsKKyAgSU5UMTYgICB5IEIxNjsKK30geFhGaXhlc0JhcnJpZXJOb3RpZnlFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgcmVxVHlwZTsKKyAgICBDQVJEOCAgIHhmaXhlc1JlcVR5cGU7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIEJhcnJpZXIgYmFycmllciBCMzI7CisgICAgV2luZG93ICB3aW5kb3cgQjMyOworICAgIElOVDE2ICAgeDEgQjE2OworICAgIElOVDE2ICAgeTEgQjE2OworICAgIElOVDE2ICAgeDIgQjE2OworICAgIElOVDE2ICAgeTIgQjE2OworICAgIENBUkQzMiAgZGlyZWN0aW9uczsKKyAgICBDQVJEMzIgIHZlbG9jaXR5OworICAgIENBUkQxNiAgcGFkIEIxNjsKKyAgICBDQVJEMTYgIG51bV9kZXZpY2VzIEIxNjsKKyAgICAvKiBhcnJheSBvZiBDQVJEMTYgZGV2aWNlcyAqLworfSB4WEZpeGVzQ3JlYXRlUG9pbnRlckJhcnJpZXJWZWxvY2l0eVJlcTsKKworI2RlZmluZSBzel94WEZpeGVzQ3JlYXRlUG9pbnRlckJhcnJpZXJWZWxvY2l0eVJlcSAzMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICByZXFUeXBlOworICAgIENBUkQ4ICAgeGZpeGVzUmVxVHlwZTsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgV2luZG93ICB3aW5kb3cgQjMyOworICAgIENBUkQzMiAgZXZlbnRNYXNrIEIzMjsKK30geFhGaXhlc1NlbGVjdEJhcnJpZXJJbnB1dFJlcTsKKworI2RlZmluZSBzel94WEZpeGVzU2VsZWN0QmFycmllcklucHV0UmVxCTEyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICB4Zml4ZXNSZXFUeXBlOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBCYXJyaWVyIGJhcnJpZXIgQjMyOworICAgIEJhcnJpZXJFdmVudElEIGV2ZW50X2lkIEIzMjsKK30geFhGaXhlc0JhcnJpZXJSZWxlYXNlUG9pbnRlclJlcTsKKworI2RlZmluZSBzel94WEZpeGVzQmFycmllclJlbGVhc2VQb2ludGVyUmVxCTEyCisKKyN1bmRlZiBCYXJyaWVyRXZlbnRJRAorI3VuZGVmIEJhcnJpZXIKKyN1bmRlZiBSZWdpb24KKyN1bmRlZiBQaWN0dXJlCisjdW5kZWYgV2luZG93CisjdW5kZWYgRHJhd2FibGUKKyN1bmRlZiBGb250CisjdW5kZWYgUGl4bWFwCisjdW5kZWYgQ3Vyc29yCisjdW5kZWYgQ29sb3JtYXAKKyN1bmRlZiBHQ29udGV4dAorI3VuZGVmIEF0b20KKyN1bmRlZiBWaXN1YWxJRAorI3VuZGVmIFRpbWUKKyN1bmRlZiBLZXlDb2RlCisjdW5kZWYgS2V5U3ltCisKKyNlbmRpZiAvKiBfWEZJWEVTUFJPVE9fSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMveGZpeGVzd2lyZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy94Zml4ZXN3aXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIzMDU5NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMveGZpeGVzd2lyZS5oCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMTAgUmVkIEhhdCwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworLyoKKyAqIENvcHlyaWdodCDCqSAyMDAyIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKKyAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisKKyNpZm5kZWYgX1hGSVhFU1dJUkVfSF8KKyNkZWZpbmUgX1hGSVhFU1dJUkVfSF8KKworI2RlZmluZSBYRklYRVNfTkFNRQkiWEZJWEVTIgorI2RlZmluZSBYRklYRVNfTUFKT1IJNgorI2RlZmluZSBYRklYRVNfTUlOT1IJMAorCisvKioqKioqKioqKioqKioqIFZlcnNpb24gMSAqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFhfWEZpeGVzUXVlcnlWZXJzaW9uCQkgICAgMAorI2RlZmluZSBYX1hGaXhlc0NoYW5nZVNhdmVTZXQJCSAgICAxCisjZGVmaW5lIFhfWEZpeGVzU2VsZWN0U2VsZWN0aW9uSW5wdXQJICAgIDIKKyNkZWZpbmUgWF9YRml4ZXNTZWxlY3RDdXJzb3JJbnB1dAkgICAgMworI2RlZmluZSBYX1hGaXhlc0dldEN1cnNvckltYWdlCQkgICAgNAorLyoqKioqKioqKioqKioqKiBWZXJzaW9uIDIgKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBYX1hGaXhlc0NyZWF0ZVJlZ2lvbgkJICAgIDUKKyNkZWZpbmUgWF9YRml4ZXNDcmVhdGVSZWdpb25Gcm9tQml0bWFwCSAgICA2CisjZGVmaW5lIFhfWEZpeGVzQ3JlYXRlUmVnaW9uRnJvbVdpbmRvdwkgICAgNworI2RlZmluZSBYX1hGaXhlc0NyZWF0ZVJlZ2lvbkZyb21HQwkgICAgOAorI2RlZmluZSBYX1hGaXhlc0NyZWF0ZVJlZ2lvbkZyb21QaWN0dXJlCSAgICA5CisjZGVmaW5lIFhfWEZpeGVzRGVzdHJveVJlZ2lvbgkJICAgIDEwCisjZGVmaW5lIFhfWEZpeGVzU2V0UmVnaW9uCQkgICAgMTEKKyNkZWZpbmUgWF9YRml4ZXNDb3B5UmVnaW9uCQkgICAgMTIKKyNkZWZpbmUgWF9YRml4ZXNVbmlvblJlZ2lvbgkJICAgIDEzCisjZGVmaW5lIFhfWEZpeGVzSW50ZXJzZWN0UmVnaW9uCQkgICAgMTQKKyNkZWZpbmUgWF9YRml4ZXNTdWJ0cmFjdFJlZ2lvbgkJICAgIDE1CisjZGVmaW5lIFhfWEZpeGVzSW52ZXJ0UmVnaW9uCQkgICAgMTYKKyNkZWZpbmUgWF9YRml4ZXNUcmFuc2xhdGVSZWdpb24JCSAgICAxNworI2RlZmluZSBYX1hGaXhlc1JlZ2lvbkV4dGVudHMJCSAgICAxOAorI2RlZmluZSBYX1hGaXhlc0ZldGNoUmVnaW9uCQkgICAgMTkKKyNkZWZpbmUgWF9YRml4ZXNTZXRHQ0NsaXBSZWdpb24JCSAgICAyMAorI2RlZmluZSBYX1hGaXhlc1NldFdpbmRvd1NoYXBlUmVnaW9uCSAgICAyMQorI2RlZmluZSBYX1hGaXhlc1NldFBpY3R1cmVDbGlwUmVnaW9uCSAgICAyMgorI2RlZmluZSBYX1hGaXhlc1NldEN1cnNvck5hbWUJCSAgICAyMworI2RlZmluZSBYX1hGaXhlc0dldEN1cnNvck5hbWUJCSAgICAyNAorI2RlZmluZSBYX1hGaXhlc0dldEN1cnNvckltYWdlQW5kTmFtZQkgICAgMjUKKyNkZWZpbmUgWF9YRml4ZXNDaGFuZ2VDdXJzb3IJCSAgICAyNgorI2RlZmluZSBYX1hGaXhlc0NoYW5nZUN1cnNvckJ5TmFtZQkgICAgMjcKKy8qKioqKioqKioqKioqKiogVmVyc2lvbiAzICoqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgWF9YRml4ZXNFeHBhbmRSZWdpb24JCSAgICAyOAorLyoqKioqKioqKioqKioqKiBWZXJzaW9uIDQgKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBYX1hGaXhlc0hpZGVDdXJzb3IJCSAgICAyOQorI2RlZmluZSBYX1hGaXhlc1Nob3dDdXJzb3IJCSAgICAzMAorLyoqKioqKioqKioqKioqKiBWZXJzaW9uIDUgKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBYX1hGaXhlc0NyZWF0ZVBvaW50ZXJCYXJyaWVyCSAgICAzMQorI2RlZmluZSBYX1hGaXhlc0Rlc3Ryb3lQb2ludGVyQmFycmllcgkgICAgMzIKKy8qKioqKioqKioqKioqKiogVmVyc2lvbiA2ICoqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgWF9YRml4ZXNDcmVhdGVQb2ludGVyQmFycmllclZlbG9jaXR5IDMzCisjZGVmaW5lIFhfWEZpeGVzU2VsZWN0QmFycmllcklucHV0ICAgICAgICAgIDM0CisjZGVmaW5lIFhfWEZpeGVzQmFycmllclJlbGVhc2VQb2ludGVyICAgICAgIDM1CisKKyNkZWZpbmUgWEZpeGVzTnVtYmVyUmVxdWVzdHMJCSAgICAoWF9YRml4ZXNCYXJyaWVyUmVsZWFzZVBvaW50ZXIrMSkKKworLyogU2VsZWN0aW9uIGV2ZW50cyBzaGFyZSBvbmUgZXZlbnQgbnVtYmVyICovCisjZGVmaW5lIFhGaXhlc1NlbGVjdGlvbk5vdGlmeQkJICAgIDAKKworLyogV2l0aGluIHRoZSBzZWxlY3Rpb24sIHRoZSAnc3VidHlwZScgZmllbGQgZGlzdGluZ3Vpc2hlcyAqLworI2RlZmluZSBYRml4ZXNTZXRTZWxlY3Rpb25Pd25lck5vdGlmeQkgICAgMAorI2RlZmluZSBYRml4ZXNTZWxlY3Rpb25XaW5kb3dEZXN0cm95Tm90aWZ5ICAxCisjZGVmaW5lIFhGaXhlc1NlbGVjdGlvbkNsaWVudENsb3NlTm90aWZ5ICAgIDIKKworI2RlZmluZSBYRml4ZXNTZXRTZWxlY3Rpb25Pd25lck5vdGlmeU1hc2sJKDFMIDw8IDApCisjZGVmaW5lIFhGaXhlc1NlbGVjdGlvbldpbmRvd0Rlc3Ryb3lOb3RpZnlNYXNrCSgxTCA8PCAxKQorI2RlZmluZSBYRml4ZXNTZWxlY3Rpb25DbGllbnRDbG9zZU5vdGlmeU1hc2sJKDFMIDw8IDIpCisKKy8qIFRoZXJlJ3Mgb25seSBvbmUgY3Vyc29yIGV2ZW50IHNvIGZhciAqLworI2RlZmluZSBYRml4ZXNDdXJzb3JOb3RpZnkJCSAgICAxCisKKyNkZWZpbmUgWEZpeGVzRGlzcGxheUN1cnNvck5vdGlmeQkgICAgMAorCisjZGVmaW5lIFhGaXhlc0Rpc3BsYXlDdXJzb3JOb3RpZnlNYXNrCSAgICAoMUwgPDwgMCkKKworLyogZXJyb3JzICovCisjZGVmaW5lIEJhZFJlZ2lvbgkJCSAgICAwCisjZGVmaW5lIEJhZEJhcnJpZXIJCQkgICAgMQorI2RlZmluZSBYRml4ZXNOdW1iZXJFcnJvcnMJCSAgICAoQmFkQmFycmllcisxKQorCisjZGVmaW5lIFNhdmVTZXROZWFyZXN0CQkJICAgIDAKKyNkZWZpbmUgU2F2ZVNldFJvb3QJCQkgICAgMQorCisjZGVmaW5lIFNhdmVTZXRNYXAJCQkgICAgMAorI2RlZmluZSBTYXZlU2V0VW5tYXAJCQkgICAgMQorCisvKioqKioqKioqKioqKioqIFZlcnNpb24gMiAqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgV2luZG93UmVnaW9uQm91bmRpbmcJCSAgICAwCisjZGVmaW5lIFdpbmRvd1JlZ2lvbkNsaXAJCSAgICAxCisKKy8qKioqKioqKioqKioqKiogVmVyc2lvbiA1ICoqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBCYXJyaWVyUG9zaXRpdmVYCQkgICAgKDFMIDw8IDApCisjZGVmaW5lIEJhcnJpZXJQb3NpdGl2ZVkJCSAgICAoMUwgPDwgMSkKKyNkZWZpbmUgQmFycmllck5lZ2F0aXZlWAkJICAgICgxTCA8PCAyKQorI2RlZmluZSBCYXJyaWVyTmVnYXRpdmVZCQkgICAgKDFMIDw8IDMpCisKKy8qKioqKioqKioqKioqKiogVmVyc2lvbiA2ICoqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBYRml4ZXNCYXJyaWVyTm90aWZ5ICAgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgWEZpeGVzQmFycmllckhpdE5vdGlmeQkJCTAKKyNkZWZpbmUgWEZpeGVzQmFycmllclRocmVzaG9sZEV4Y2VlZGVkTm90aWZ5CTEKKworI2RlZmluZSBYRml4ZXNCYXJyaWVySGl0Tm90aWZ5TWFzawkJCSgxTCA8PCAwKQorI2RlZmluZSBYRml4ZXNCYXJyaWVyVGhyZXNob2xkRXhjZWVkZWROb3RpZnlNYXNrCSgxTCA8PCAxKQorCisjZGVmaW5lIFhGaXhlc051bWJlckV2ZW50cwkJICAgIChYRml4ZXNCYXJyaWVyTm90aWZ5KzEpCisKKworI2VuZGlmCS8qIF9YRklYRVNXSVJFX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3h0ZXN0Y29uc3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMveHRlc3Rjb25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NGI5MDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3h0ZXN0Y29uc3QuaApAQCAtMCwwICsxLDQxIEBACisvKgorCitDb3B5cmlnaHQgMTk5MiwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKi8KKworI2lmbmRlZiBfWFRFU1RfQ09OU1RfSF8KKyNkZWZpbmUgX1hURVNUX0NPTlNUX0hfCisKKyNkZWZpbmUgWFRlc3ROdW1iZXJFdmVudHMJMAorCisjZGVmaW5lIFhUZXN0TnVtYmVyRXJyb3JzCTAKKworI2RlZmluZSBYVGVzdEN1cnJlbnRDdXJzb3IgKChDdXJzb3IpMSkKKworI2RlZmluZSBYVGVzdE1ham9yVmVyc2lvbgkyCisjZGVmaW5lIFhUZXN0TWlub3JWZXJzaW9uCTIKKworI2RlZmluZSBYVGVzdEV4dGVuc2lvbk5hbWUJIlhURVNUIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMveHRlc3RleHQxLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3h0ZXN0ZXh0MS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Y2RkMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3h0ZXN0ZXh0MS5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiB4dGVzdGV4dDEuaAorICoKKyAqIFgxMSBJbnB1dCBTeW50aGVzaXMgRXh0ZW5zaW9uIGluY2x1ZGUgZmlsZQorICovCisKKy8qCisKKworQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODgsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKworQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODggYnkgSGV3bGV0dC1QYWNrYXJkIENvcnBvcmF0aW9uCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKK3NvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQKK2ZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodAorbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBIZXdsZXR0LVBhY2thcmQgbm90IGJlIHVzZWQgaW4KK2FkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK3NvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKworSGV3bGV0dC1QYWNrYXJkIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgCitzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkIAorImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworVGhpcyBzb2Z0d2FyZSBpcyBub3Qgc3ViamVjdCB0byBhbnkgbGljZW5zZSBvZiB0aGUgQW1lcmljYW4KK1RlbGVwaG9uZSBhbmQgVGVsZWdyYXBoIENvbXBhbnkgb3Igb2YgdGhlIFJlZ2VudHMgb2YgdGhlCitVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisKKyovCisKKyNpZm5kZWYgX1hURVNURVhUMV9ICisjZGVmaW5lIF9YVEVTVEVYVDFfSAorLyoKKyAqIHRoZSB0eXBlZGVmcyBmb3IgQ0FSRDgsIENBUkQxNiwgYW5kIENBUkQzMiBhcmUgZGVmaW5lZCBpbiBYbWQuaAorICovCisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy94dGVzdGV4dDFjb25zdC5oPgorLyoKKyAqIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gZm9yIHRoZSBpbnB1dCBhY3Rpb24gaG9zdCBmb3JtYXQgZXZlbnQgc3RydWN0dXJlLgorICogVGhpcyBpcyB0aGUgZm9ybSB0aGF0IGEgY2xpZW50IHVzaW5nIHRoaXMgZXh0ZW5zaW9uIHdpbGwgc2VlIHdoZW4KKyAqIGl0IHJlY2VpdmVzIGFuIGlucHV0IGFjdGlvbiBldmVudC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBpbnQgICAgIHR5cGU7ICAgICAgICAgICAvKiBhbHdheXMgWFRlc3RJbnB1dEFjdGlvblR5cGUgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OworCVdpbmRvdyAgd2luZG93OworICAgICAgICBDQVJEOCAgIGFjdGlvbnNbWFRlc3RBQ1RJT05TX1NJWkVdOworfSBYVGVzdElucHV0QWN0aW9uRXZlbnQ7CisKKy8qCisgKiBUaGlzIGlzIHRoZSBkZWZpbml0aW9uIGZvciB0aGUgeFRlc3RGYWtlQWNrIGhvc3QgZm9ybWF0IGV2ZW50IHN0cnVjdHVyZS4KKyAqIFRoaXMgaXMgdGhlIGZvcm0gdGhhdCBhIGNsaWVudCB1c2luZyB0aGlzIGV4dGVuc2lvbiB3aWxsIHNlZSB3aGVuCisgKiBpdCByZWNlaXZlcyBhbiBYVGVzdEZha2VBY2sgZXZlbnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgaW50ICAgICB0eXBlOyAgICAgICAgICAgLyogYWx3YXlzIFhUZXN0RmFrZUFja1R5cGUgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OworCVdpbmRvdyAgd2luZG93OworfSBYVGVzdEZha2VBY2tFdmVudDsKKworX1hGVU5DUFJPVE9CRUdJTgorCitpbnQgWFRlc3RGYWtlSW5wdXQocmVnaXN0ZXIgRGlzcGxheSAqZHB5LCBjaGFyICphY3Rpb25fbGlzdF9hZGRyLCBpbnQgYWN0aW9uX2xpc3Rfc2l6ZSwgaW50IGFja19mbGFnKTsKK2ludCBYVGVzdEdldElucHV0KHJlZ2lzdGVyIERpc3BsYXkgKmRweSwgaW50IGFjdGlvbl9oYW5kbGluZyk7CitpbnQgWFRlc3RRdWVyeUlucHV0U2l6ZShyZWdpc3RlciBEaXNwbGF5ICpkcHksIHVuc2lnbmVkIGxvbmcgKnNpemVfcmV0dXJuKTsKK2ludCBYVGVzdFByZXNzS2V5KERpc3BsYXkgKmRpc3BsYXksIGludCBkZXZpY2VfaWQsIHVuc2lnbmVkIGxvbmcgZGVsYXksIHVuc2lnbmVkIGludCBrZXljb2RlLCB1bnNpZ25lZCBpbnQga2V5X2FjdGlvbik7CitpbnQgWFRlc3RQcmVzc0J1dHRvbihEaXNwbGF5ICogZGlzcGxheSwgaW50IGRldmljZV9pZCwgdW5zaWduZWQgbG9uZyBkZWxheSwgdW5zaWduZWQgaW50IGJ1dHRvbl9udW1iZXIsIHVuc2lnbmVkIGludCBidXR0b25fYWN0aW9uKTsKK2ludCBYVGVzdE1vdmVQb2ludGVyKERpc3BsYXkgKmRpc3BsYXksIGludCBkZXZpY2VfaWQsIHVuc2lnbmVkIGxvbmcgZGVsYXlbXSwgaW50IHhbXSwgaW50IHlbXSwgdW5zaWduZWQgaW50IGNvdW50KTsKK2ludCBYVGVzdEZsdXNoKERpc3BsYXkgKmRpc3BsYXkpOworaW50IFhUZXN0U3RvcElucHV0KHJlZ2lzdGVyIERpc3BsYXkgKmRweSk7CitpbnQgWFRlc3RSZXNldChyZWdpc3RlciBEaXNwbGF5ICpkcHkpOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYgLyogX1hURVNURVhUMV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3h0ZXN0ZXh0MWNvbnN0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3h0ZXN0ZXh0MWNvbnN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU2ZWRjNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMveHRlc3RleHQxY29uc3QuaApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIHh0ZXN0ZXh0MS5oCisgKgorICogWDExIElucHV0IFN5bnRoZXNpcyBFeHRlbnNpb24gaW5jbHVkZSBmaWxlCisgKi8KKworLyoKKworCitDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OCwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworCitDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OCBieSBIZXdsZXR0LVBhY2thcmQgQ29ycG9yYXRpb24KKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dAorZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKK25vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0Citub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEhld2xldHQtUGFja2FyZCBub3QgYmUgdXNlZCBpbgorYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorCitIZXdsZXR0LVBhY2thcmQgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQorc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZAorImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworVGhpcyBzb2Z0d2FyZSBpcyBub3Qgc3ViamVjdCB0byBhbnkgbGljZW5zZSBvZiB0aGUgQW1lcmljYW4KK1RlbGVwaG9uZSBhbmQgVGVsZWdyYXBoIENvbXBhbnkgb3Igb2YgdGhlIFJlZ2VudHMgb2YgdGhlCitVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisKKyovCisKKyNpZm5kZWYgX1hURVNURVhUMUNPTlNUX0gKKyNkZWZpbmUgX1hURVNURVhUMUNPTlNUX0ggMQorCisjZGVmaW5lIFhUZXN0TUFYX0FDVElPTl9MSVNUX1NJWkUgICAgICAgNjQKKyNkZWZpbmUgWFRlc3RBQ1RJT05TX1NJWkUJMjgKKworCisvKgorICogdXNlZCBpbiB0aGUgWFRlc3RQcmVzc0J1dHRvbiBhbmQgWFRlc3RQcmVzc0tleSBmdW5jdGlvbnMKKyAqLworI2RlZmluZSBYVGVzdFBSRVNTICAgICAgICAgICAgICAgICAgICAgIDEgPDwgMAorI2RlZmluZSBYVGVzdFJFTEVBU0UgICAgICAgICAgICAgICAgICAgIDEgPDwgMQorI2RlZmluZSBYVGVzdFNUUk9LRSAgICAgICAgICAgICAgICAgICAgIDEgPDwgMgorCisvKgorICogV2hlbiBkb2luZyBhIGtleSBvciBidXR0b24gc3Ryb2tlLCB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcworICogdG8gZGVsYXkgYmV0d2VlbiB0aGUgcHJlc3MgYW5kIHRoZSByZWxlYXNlIG9mIGEga2V5IG9yIGJ1dHRvbgorICogaW4gdGhlIFhUZXN0UHJlc3NCdXR0b24gYW5kIFhUZXN0UHJlc3NLZXkgZnVuY3Rpb25zLgorICovCisKKyNkZWZpbmUgWFRlc3RTVFJPS0VfREVMQVlfVElNRQkJMTAKKworLyoKKyAqIHVzZWQgaW4gdGhlIFhUZXN0R2V0SW5wdXQgZnVuY3Rpb24KKyAqLworI2RlZmluZSBYVGVzdEVYQ0xVU0lWRSAgICAgICAgICAgICAgICAgIDEgPDwgMAorI2RlZmluZSBYVGVzdFBBQ0tFRF9BQ1RJT05TICAgICAgICAgICAgIDEgPDwgMQorI2RlZmluZSBYVGVzdFBBQ0tFRF9NT1RJT04gICAgICAgICAgICAgIDEgPDwgMgorCisvKgorICogdXNlZCBpbiB0aGUgWFRlc3RGYWtlSW5wdXQgZnVuY3Rpb24KKyAqLworI2RlZmluZSBYVGVzdEZBS0VfQUNLX05PVF9ORUVERUQgICAgICAgIDAKKyNkZWZpbmUgWFRlc3RGQUtFX0FDS19SRVFVRVNUICAgICAgICAgICAxCisKKy8qCisgKiB1c2VkIGluIHRoZSBYVGVzdCBleHRlbnNpb24gaW5pdGlhbGl6YXRpb24gcm91dGluZQorICovCisjZGVmaW5lIFhUZXN0RVhURU5TSU9OX05BTUUgICAgICAgICAgICAgIlhUZXN0RXh0ZW5zaW9uMSIKKyNkZWZpbmUgWFRlc3RFVkVOVF9DT1VOVCAgICAgICAgICAgICAgICAyCisKKy8qCisgKiBUaGlzIGlzIHRoZSBkZWZpbml0aW9uIGZvciB0aGUgZm9ybWF0IG9mIHRoZSBoZWFkZXIgYnl0ZQorICogaW4gdGhlIGlucHV0IGFjdGlvbiBzdHJ1Y3R1cmVzLgorICovCisjZGVmaW5lIFhUZXN0QUNUSU9OX1RZUEVfTUFTSyAgIDB4MDMgICAgLyogYml0cyAwIGFuZCAxICAgICAgICAgICovCisjZGVmaW5lIFhUZXN0S0VZX1NUQVRFX01BU0sgICAgIDB4MDQgICAgLyogYml0IDIgKGtleSBhY3Rpb24pICAgICovCisjZGVmaW5lIFhUZXN0WF9TSUdOX0JJVF9NQVNLICAgIDB4MDQgICAgLyogYml0IDIgKG1vdGlvbiBhY3Rpb24pICovCisjZGVmaW5lIFhUZXN0WV9TSUdOX0JJVF9NQVNLICAgIDB4MDggICAgLyogYml0IDMgKG1vdGlvbiBhY3Rpb24pICovCisjZGVmaW5lIFhUZXN0REVWSUNFX0lEX01BU0sgICAgIDB4ZjAgICAgLyogYml0cyA0IHRocm91Z2ggNyAgICAgICovCisKKyNkZWZpbmUgWFRlc3RNQVhfREVWSUNFX0lECTB4MGYKKyNkZWZpbmUgWFRlc3RQYWNrRGV2aWNlSUQoeCkJKCgoeCkgJiBYVGVzdE1BWF9ERVZJQ0VfSUQpIDw8IDQpCisjZGVmaW5lIFhUZXN0VW5wYWNrRGV2aWNlSUQoeCkJKCgoeCkgJiBYVGVzdERFVklDRV9JRF9NQVNLKSA+PiA0KQorCisvKgorICogVGhlc2UgYXJlIHRoZSBwb3NzaWJsZSBhY3Rpb24gdHlwZXMuCisgKi8KKyNkZWZpbmUgWFRlc3RERUxBWV9BQ1RJT04gICAgICAgMAorI2RlZmluZSBYVGVzdEtFWV9BQ1RJT04gICAgICAgICAxCisjZGVmaW5lIFhUZXN0TU9USU9OX0FDVElPTiAgICAgIDIKKyNkZWZpbmUgWFRlc3RKVU1QX0FDVElPTiAgICAgICAgMworCisvKgorICogVGhlc2UgYXJlIHRoZSBkZWZpbml0aW9ucyBmb3Iga2V5L2J1dHRvbiBtb3Rpb24gaW5wdXQgYWN0aW9ucy4KKyAqLworI2RlZmluZSBYVGVzdEtFWV9VUCAgICAgICAgICAgICAweDA0CisjZGVmaW5lIFhUZXN0S0VZX0RPV04gICAgICAgICAgIDB4MDAKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZGVmaW5pdGlvbnMgZm9yIHBvaW50ZXIgcmVsYXRpdmUgbW90aW9uIGlucHV0CisgKiBhY3Rpb25zLgorICoKKyAqIFRoZSBzaWduIGJpdHMgZm9yIHRoZSB4IGFuZCB5IHJlbGF0aXZlIG1vdGlvbnMgYXJlIGNvbnRhaW5lZAorICogaW4gdGhlIGhlYWRlciBieXRlLiAgVGhlIHggYW5kIHkgcmVsYXRpdmUgbW90aW9ucyBhcmUgcGFja2VkCisgKiBpbnRvIG9uZSBieXRlIHRvIG1ha2UgdGhpbmdzIGZpdCBpbiAzMiBiaXRzLiAgSWYgdGhlIHJlbGF0aXZlCisgKiBtb3Rpb24gcmFuZ2UgaXMgbGFyZ2VyIHRoYW4gKy8tMTUsIHVzZSB0aGUgcG9pbnRlciBqdW1wIGFjdGlvbi4KKyAqLworI2RlZmluZSBYVGVzdE1PVElPTl9NQVggICAgICAgICAgICAxNQorI2RlZmluZSBYVGVzdE1PVElPTl9NSU4gICAgICAgICAgICAtMTUKKworI2RlZmluZSBYVGVzdFhfTkVHQVRJVkUgICAgICAgICAgICAweDA0CisjZGVmaW5lIFhUZXN0WV9ORUdBVElWRSAgICAgICAgICAgIDB4MDgKKworI2RlZmluZSBYVGVzdFhfTU9USU9OX01BU0sgICAgICAgICAweDBmCisjZGVmaW5lIFhUZXN0WV9NT1RJT05fTUFTSyAgICAgICAgIDB4ZjAKKworI2RlZmluZSBYVGVzdFBhY2tYTW90aW9uVmFsdWUoeCkgICAoKHgpICYgWFRlc3RYX01PVElPTl9NQVNLKQorI2RlZmluZSBYVGVzdFBhY2tZTW90aW9uVmFsdWUoeCkgICAoKCh4KSA8PCA0KSAmIFhUZXN0WV9NT1RJT05fTUFTSykKKworI2RlZmluZSBYVGVzdFVucGFja1hNb3Rpb25WYWx1ZSh4KSAoKHgpICYgWFRlc3RYX01PVElPTl9NQVNLKQorI2RlZmluZSBYVGVzdFVucGFja1lNb3Rpb25WYWx1ZSh4KSAoKCh4KSAmIFhUZXN0WV9NT1RJT05fTUFTSykgPj4gNCkKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGRlZmluaXRpb25zIGZvciBhIGxvbmcgZGVsYXkgaW5wdXQgYWN0aW9uLiAgSXQgaXMKKyAqIHVzZWQgd2hlbiBtb3JlIHRoYW4gWFRlc3RTSE9SVF9ERUxBWV9USU1FIG1pbGxpc2Vjb25kcyBvZiBkZWxheQorICogKGFwcHJveGltYXRlbHkgb25lIG1pbnV0ZSkgaXMgbmVlZGVkLgorICoKKyAqIFRoZSBkZXZpY2UgSUQgZm9yIGEgZGVsYXkgaXMgYWx3YXlzIHNldCB0byBYVGVzdERFTEFZX0RFVklDRV9JRC4KKyAqIFRoaXMgZ3VhcmFudGVlcyB0aGF0IGEgaGVhZGVyIGJ5dGUgd2l0aCBhIHZhbHVlIG9mIDAgaXMgbm90CisgKiBhIHZhbGlkIGhlYWRlciwgc28gaXQgY2FuIGJlIHVzZWQgYXMgYSBmbGFnIHRvIGluZGljYXRlIHRoYXQKKyAqIHRoZXJlIGFyZSBubyBtb3JlIGlucHV0IGFjdGlvbnMgaW4gYW4gWFRlc3RJbnB1dEFjdGlvbiBldmVudC4KKyAqLworCisjZGVmaW5lIFhUZXN0U0hPUlRfREVMQVlfVElNRQkweGZmZmYKKyNkZWZpbmUgWFRlc3RERUxBWV9ERVZJQ0VfSUQgICAgMHgwZgorCisjZW5kaWYgLyogX1hURVNURVhUMUNPTlNUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMveHRlc3RleHQxcHJvdG8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMveHRlc3RleHQxcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWJkZWUwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy94dGVzdGV4dDFwcm90by5oCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogeHRlc3RleHQxLmgKKyAqCisgKiBYMTEgSW5wdXQgU3ludGhlc2lzIEV4dGVuc2lvbiBpbmNsdWRlIGZpbGUKKyAqLworCisvKgorQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODgsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKworQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODggYnkgSGV3bGV0dC1QYWNrYXJkIENvcnBvcmF0aW9uCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKK3NvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQKK2ZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodAorbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBIZXdsZXR0LVBhY2thcmQgbm90IGJlIHVzZWQgaW4KK2FkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK3NvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKworSGV3bGV0dC1QYWNrYXJkIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUKK3N1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQKKyJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKK1RoaXMgc29mdHdhcmUgaXMgbm90IHN1YmplY3QgdG8gYW55IGxpY2Vuc2Ugb2YgdGhlIEFtZXJpY2FuCitUZWxlcGhvbmUgYW5kIFRlbGVncmFwaCBDb21wYW55IG9yIG9mIHRoZSBSZWdlbnRzIG9mIHRoZQorVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorCisqLworCisjaWZuZGVmIF9YVEVTVEVYVDFQUk9UT19ICisjZGVmaW5lIF9YVEVTVEVYVDFQUk9UT19IIDEKKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL3h0ZXN0ZXh0MWNvbnN0Lmg+CisKKy8qCisgKiB0aGUgdHlwZWRlZnMgZm9yIENBUkQ4LCBDQVJEMTYsIGFuZCBDQVJEMzIgYXJlIGRlZmluZWQgaW4gWG1kLmgKKyAqLworCisvKgorICogWFRlc3QgcmVxdWVzdCB0eXBlIHZhbHVlcworICoKKyAqIHVzZWQgaW4gdGhlIFhUZXN0IGV4dGVuc2lvbiBwcm90b2NvbCByZXF1ZXN0cworICovCisjZGVmaW5lIFhfVGVzdEZha2VJbnB1dCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWF9UZXN0R2V0SW5wdXQgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBYX1Rlc3RTdG9wSW5wdXQgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFhfVGVzdFJlc2V0ICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWF9UZXN0UXVlcnlJbnB1dFNpemUgICAgICAgICAgICAgNQorCisvKgorICogVGhpcyBkZWZpbmVzIHRoZSBtYXhpbXVtIHNpemUgb2YgYSBsaXN0IG9mIGlucHV0IGFjdGlvbnMKKyAqIHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4gIEl0IHNob3VsZCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZgorICogNCBzbyB0aGF0IHRoZSBlbnRpcmUgeFRlc3RGYWtlSW5wdXRSZXEgc3RydWN0dXJlIHNpemUgaXMgYQorICogbXVsdGlwbGUgb2YgNC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIENBUkQ4ICAgcmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYVGVzdFJlcUNvZGUgICAgICAgICAgICAgKi8KKyAgICAgICAgQ0FSRDggICBYVGVzdFJlcVR5cGU7ICAgLyogYWx3YXlzIFhfVGVzdEZha2VJbnB1dCAgICAgICAgICAgKi8KKyAgICAgICAgQ0FSRDE2ICBsZW5ndGggQjE2OyAgICAgLyogMiArIFhUZXN0TUFYX0FDVElPTl9MSVNUX1NJWkUvNCAqLworICAgICAgICBDQVJEMzIgIGFjayBCMzI7CisgICAgICAgIENBUkQ4ICAgYWN0aW9uX2xpc3RbWFRlc3RNQVhfQUNUSU9OX0xJU1RfU0laRV07Cit9IHhUZXN0RmFrZUlucHV0UmVxOworI2RlZmluZSBzel94VGVzdEZha2VJbnB1dFJlcSAoWFRlc3RNQVhfQUNUSU9OX0xJU1RfU0laRSArIDgpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgQ0FSRDggICByZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhUZXN0UmVxQ29kZSAgKi8KKyAgICAgICAgQ0FSRDggICBYVGVzdFJlcVR5cGU7ICAgLyogYWx3YXlzIFhfVGVzdEdldElucHV0ICovCisgICAgICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsgICAgIC8qIDIgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIENBUkQzMiAgbW9kZSBCMzI7Cit9IHhUZXN0R2V0SW5wdXRSZXE7CisjZGVmaW5lIHN6X3hUZXN0R2V0SW5wdXRSZXEgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIENBUkQ4ICAgcmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYVGVzdFJlcUNvZGUgICAqLworICAgICAgICBDQVJEOCAgIFhUZXN0UmVxVHlwZTsgICAvKiBhbHdheXMgWF9UZXN0U3RvcElucHV0ICovCisgICAgICAgIENBUkQxNiAgbGVuZ3RoIEIzMjsgICAgIC8qIDEgICAgICAgICAgICAgICAgICAgICAqLworfSB4VGVzdFN0b3BJbnB1dFJlcTsKKyNkZWZpbmUgc3pfeFRlc3RTdG9wSW5wdXRSZXEgNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIENBUkQ4ICAgcmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYVGVzdFJlcUNvZGUgKi8KKyAgICAgICAgQ0FSRDggICBYVGVzdFJlcVR5cGU7ICAgLyogYWx3YXlzIFhfVGVzdFJlc2V0ICAgKi8KKyAgICAgICAgQ0FSRDE2ICBsZW5ndGggQjE2OyAgICAgLyogMSAgICAgICAgICAgICAgICAgICAqLworfSB4VGVzdFJlc2V0UmVxOworI2RlZmluZSBzel94VGVzdFJlc2V0UmVxIDQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBDQVJEOCAgIHJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWFRlc3RSZXFDb2RlICAgICAgICAqLworICAgICAgICBDQVJEOCAgIFhUZXN0UmVxVHlwZTsgICAvKiBhbHdheXMgWF9UZXN0UXVlcnlJbnB1dFNpemUgKi8KKyAgICAgICAgQ0FSRDE2ICBsZW5ndGggQjE2OyAgICAgLyogMSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30geFRlc3RRdWVyeUlucHV0U2l6ZVJlcTsKKyNkZWZpbmUgc3pfeFRlc3RRdWVyeUlucHV0U2l6ZVJlcSA0CisKKy8qCisgKiBUaGlzIGlzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSByZXBseSBmb3IgdGhlIHhUZXN0UXVlcnlJbnB1dFNpemUKKyAqIHJlcXVlc3QuICBJdCBzaG91bGQgcmVtYWluIHRoZSBzYW1lIG1pbmltdW0gc2l6ZSBhcyBvdGhlciByZXBsaWVzCisgKiAoMzIgYnl0ZXMpLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIENBUkQ4ICAgdHlwZTsgICAgICAgICAgIC8qIGFsd2F5cyBYX1JlcGx5ICAqLworICAgICAgICBDQVJEOCAgIHBhZDE7CisgICAgICAgIENBUkQxNiAgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgICAgICBDQVJEMzIgIGxlbmd0aCBCMzI7ICAgICAvKiBhbHdheXMgMCAqLworICAgICAgICBDQVJEMzIgIHNpemVfcmV0dXJuIEIzMjsKKyAgICAgICAgQ0FSRDMyICBwYWQyIEIzMjsKKyAgICAgICAgQ0FSRDMyICBwYWQzIEIzMjsKKyAgICAgICAgQ0FSRDMyICBwYWQ0IEIzMjsKKyAgICAgICAgQ0FSRDMyICBwYWQ1IEIzMjsKKyAgICAgICAgQ0FSRDMyICBwYWQ2IEIzMjsKK30geFRlc3RRdWVyeUlucHV0U2l6ZVJlcGx5OworCisvKgorICogVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiBmb3IgdGhlIGlucHV0IGFjdGlvbiB3aXJlIGV2ZW50IHN0cnVjdHVyZS4KKyAqIFRoaXMgZXZlbnQgaXMgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gdGhlIHNlcnZlciBoYXMgb25lIG9yCisgKiBtb3JlIHVzZXIgaW5wdXQgYWN0aW9ucyB0byByZXBvcnQgdG8gdGhlIGNsaWVudC4gIEl0IG11c3QKKyAqIHJlbWFpbiB0aGUgc2FtZSBzaXplIGFzIGFsbCBvdGhlciB3aXJlIGV2ZW50cyAoMzIgYnl0ZXMpLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIENBUkQ4ICAgdHlwZTsgICAgICAgICAgIC8qIGFsd2F5cyBYVGVzdElucHV0QWN0aW9uVHlwZSAqLworICAgICAgICBDQVJEOCAgIHBhZDAwOworICAgICAgICBDQVJEMTYgIHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICAgICAgQ0FSRDggICBhY3Rpb25zW1hUZXN0QUNUSU9OU19TSVpFXTsKK30geFRlc3RJbnB1dEFjdGlvbkV2ZW50OworCisvKgorICogVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiBmb3IgdGhlIHhUZXN0RmFrZUFjayB3aXJlIGV2ZW50IHN0cnVjdHVyZS4KKyAqIFRoaXMgZXZlbnQgaXMgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gdGhlIHNlcnZlciBoYXMgY29tcGxldGVseQorICogcHJvY2Vzc2VkIGl0cyBpbnB1dCBhY3Rpb24gYnVmZmVyLCBhbmQgaXMgcmVhZHkgZm9yIG1vcmUuCisgKiBJdCBtdXN0IHJlbWFpbiB0aGUgc2FtZSBzaXplIGFzIGFsbCBvdGhlciB3aXJlIGV2ZW50cyAoMzIgYnl0ZXMpLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIENBUkQ4ICAgdHlwZTsgICAgICAgICAgIC8qIGFsd2F5cyBYVGVzdEZha2VBY2tUeXBlICovCisgICAgICAgIENBUkQ4ICAgcGFkMDA7CisgICAgICAgIENBUkQxNiAgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgICAgICBDQVJEMzIgIHBhZDAyIEIzMjsKKyAgICAgICAgQ0FSRDMyICBwYWQwMyBCMzI7CisgICAgICAgIENBUkQzMiAgcGFkMDQgQjMyOworICAgICAgICBDQVJEMzIgIHBhZDA1IEIzMjsKKyAgICAgICAgQ0FSRDMyICBwYWQwNiBCMzI7CisgICAgICAgIENBUkQzMiAgcGFkMDcgQjMyOworICAgICAgICBDQVJEMzIgIHBhZDA4IEIzMjsKK30geFRlc3RGYWtlQWNrRXZlbnQ7CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGRlZmluaXRpb25zIGZvciBrZXkvYnV0dG9uIG1vdGlvbiBpbnB1dCBhY3Rpb25zLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIENBUkQ4ICAgaGVhZGVyOyAgICAgICAgIC8qIHdoaWNoIGRldmljZSwga2V5IHVwL2Rvd24gKi8KKyAgICAgICAgQ0FSRDggICBrZXljb2RlOyAgICAgICAgLyogd2hpY2gga2V5L2J1dHRvbiB0byBtb3ZlICAqLworICAgICAgICBDQVJEMTYgIGRlbGF5X3RpbWUgQjE2OyAvKiBob3cgbG9uZyB0byBkZWxheSAoaW4gbXMpICovCit9IFhUZXN0S2V5SW5mbzsKKworLyoKKyAqIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gZm9yIHBvaW50ZXIganVtcCBpbnB1dCBhY3Rpb25zLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIENBUkQ4ICAgaGVhZGVyOyAgICAgICAgIC8qIHdoaWNoIHBvaW50ZXIgICAgICAgICAgICAgKi8KKyAgICAgICAgQ0FSRDggICBwYWQxOyAgICAgICAgICAgLyogdW51c2VkIHBhZGRpbmcgYnl0ZSAgICAgICAqLworICAgICAgICBDQVJEMTYgIGp1bXB4IEIxNjsgICAgICAvKiB4IGNvb3JkIHRvIGp1bXAgdG8gICAgICAgICovCisgICAgICAgIENBUkQxNiAganVtcHkgQjE2OyAgICAgIC8qIHkgY29vcmQgdG8ganVtcCB0byAgICAgICAgKi8KKyAgICAgICAgQ0FSRDE2ICBkZWxheV90aW1lIEIxNjsgLyogaG93IGxvbmcgdG8gZGVsYXkgKGluIG1zKSAqLworfSBYVGVzdEp1bXBJbmZvOworCisvKgorICogVGhlc2UgYXJlIHRoZSBkZWZpbml0aW9ucyBmb3IgcG9pbnRlciByZWxhdGl2ZSBtb3Rpb24gaW5wdXQKKyAqIGFjdGlvbnMuCisgKgorICogVGhlIHNpZ24gYml0cyBmb3IgdGhlIHggYW5kIHkgcmVsYXRpdmUgbW90aW9ucyBhcmUgY29udGFpbmVkCisgKiBpbiB0aGUgaGVhZGVyIGJ5dGUuICBUaGUgeCBhbmQgeSByZWxhdGl2ZSBtb3Rpb25zIGFyZSBwYWNrZWQKKyAqIGludG8gb25lIGJ5dGUgdG8gbWFrZSB0aGluZ3MgZml0IGluIDMyIGJpdHMuICBJZiB0aGUgcmVsYXRpdmUKKyAqIG1vdGlvbiByYW5nZSBpcyBsYXJnZXIgdGhhbiArLy0xNSwgdXNlIHRoZSBwb2ludGVyIGp1bXAgYWN0aW9uLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgQ0FSRDggICBoZWFkZXI7ICAgICAgICAgLyogd2hpY2ggcG9pbnRlciAgICAgICAgICAgICAqLworICAgICAgICBDQVJEOCAgIG1vdGlvbl9kYXRhOyAgICAvKiB4LHkgcmVsYXRpdmUgbW90aW9uICAgICAgICovCisgICAgICAgIENBUkQxNiAgZGVsYXlfdGltZSBCMTY7IC8qIGhvdyBsb25nIHRvIGRlbGF5IChpbiBtcykgKi8KK30gWFRlc3RNb3Rpb25JbmZvOworCisvKgorICogVGhlc2UgYXJlIHRoZSBkZWZpbml0aW9ucyBmb3IgYSBsb25nIGRlbGF5IGlucHV0IGFjdGlvbi4gIEl0IGlzCisgKiB1c2VkIHdoZW4gbW9yZSB0aGFuIFhUZXN0U0hPUlRfREVMQVlfVElNRSBtaWxsaXNlY29uZHMgb2YgZGVsYXkKKyAqIChhcHByb3hpbWF0ZWx5IG9uZSBtaW51dGUpIGlzIG5lZWRlZC4KKyAqCisgKiBUaGUgZGV2aWNlIElEIGZvciBhIGRlbGF5IGlzIGFsd2F5cyBzZXQgdG8gWFRlc3RERUxBWV9ERVZJQ0VfSUQuCisgKiBUaGlzIGd1YXJhbnRlZXMgdGhhdCBhIGhlYWRlciBieXRlIHdpdGggYSB2YWx1ZSBvZiAwIGlzIG5vdAorICogYSB2YWxpZCBoZWFkZXIsIHNvIGl0IGNhbiBiZSB1c2VkIGFzIGEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0CisgKiB0aGVyZSBhcmUgbm8gbW9yZSBpbnB1dCBhY3Rpb25zIGluIGFuIFhUZXN0SW5wdXRBY3Rpb24gZXZlbnQuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBDQVJEOCAgIGhlYWRlcjsgICAgICAgICAvKiBhbHdheXMgWFRlc3RERUxBWV9ERVZJQ0VfSUQgKi8KKyAgICAgICAgQ0FSRDggICBwYWQxOyAgICAgICAgICAgLyogdW51c2VkIHBhZGRpbmcgYnl0ZSAgICAgICAgICovCisgICAgICAgIENBUkQxNiAgcGFkMiBCMTY7ICAgICAgIC8qIHVudXNlZCBwYWRkaW5nIHdvcmQgICAgICAgICAqLworICAgICAgICBDQVJEMzIgIGRlbGF5X3RpbWUgQjMyOyAvKiBob3cgbG9uZyB0byBkZWxheSAoaW4gbXMpICAgKi8KK30gWFRlc3REZWxheUluZm87CisKKyNlbmRpZiAvKiBfWFRFU1RFWFQxUFJPVE9fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy94dGVzdHByb3RvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3h0ZXN0cHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjhkYjI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy94dGVzdHByb3RvLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisKK0NvcHlyaWdodCAxOTkyLCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqLworCisjaWZuZGVmIF9YVEVTVFBST1RPX0hfCisjZGVmaW5lIF9YVEVTVFBST1RPX0hfCisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy94dGVzdGNvbnN0Lmg+CisKKyNkZWZpbmUgV2luZG93IENBUkQzMgorI2RlZmluZSBUaW1lIENBUkQzMgorI2RlZmluZSBDdXJzb3IgQ0FSRDMyCisKKyNkZWZpbmUgWF9YVGVzdEdldFZlcnNpb24JMAorI2RlZmluZSBYX1hUZXN0Q29tcGFyZUN1cnNvcgkxCisjZGVmaW5lIFhfWFRlc3RGYWtlSW5wdXQJMgorI2RlZmluZSBYX1hUZXN0R3JhYkNvbnRyb2wJMworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFhUZXN0UmVxQ29kZSAqLworICAgIENBUkQ4CXh0UmVxVHlwZTsJLyogYWx3YXlzIFhfWFRlc3RHZXRWZXJzaW9uICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDgJbWFqb3JWZXJzaW9uOworICAgIENBUkQ4CXBhZDsKKyAgICBDQVJEMTYJbWlub3JWZXJzaW9uIEIxNjsKK30geFhUZXN0R2V0VmVyc2lvblJlcTsKKyNkZWZpbmUgc3pfeFhUZXN0R2V0VmVyc2lvblJlcSA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CW1ham9yVmVyc2lvbjsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNgltaW5vclZlcnNpb24gQjE2OworICAgIENBUkQxNglwYWQwIEIxNjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworfSB4WFRlc3RHZXRWZXJzaW9uUmVwbHk7CisjZGVmaW5lIHN6X3hYVGVzdEdldFZlcnNpb25SZXBseSAzMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFhUZXN0UmVxQ29kZSAqLworICAgIENBUkQ4CXh0UmVxVHlwZTsJLyogYWx3YXlzIFhfWFRlc3RDb21wYXJlQ3Vyc29yICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgV2luZG93CXdpbmRvdyBCMzI7CisgICAgQ3Vyc29yCWN1cnNvciBCMzI7Cit9IHhYVGVzdENvbXBhcmVDdXJzb3JSZXE7CisjZGVmaW5lIHN6X3hYVGVzdENvbXBhcmVDdXJzb3JSZXEgMTIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQk9PTAlzYW1lOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDMyCXBhZDAgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7Cit9IHhYVGVzdENvbXBhcmVDdXJzb3JSZXBseTsKKyNkZWZpbmUgc3pfeFhUZXN0Q29tcGFyZUN1cnNvclJlcGx5IDMyCisKKy8qIHVzZWQgb25seSBvbiB0aGUgY2xpZW50IHNpZGUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgWFRlc3RSZXFDb2RlICovCisgICAgQ0FSRDgJeHRSZXFUeXBlOwkvKiBhbHdheXMgWF9YVGVzdEZha2VJbnB1dCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCWRldGFpbDsKKyAgICBDQVJEMTYJcGFkMCBCMTY7CisgICAgVGltZQl0aW1lIEIzMjsKKyAgICBXaW5kb3cJcm9vdCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBJTlQxNglyb290WCBCMTYsIHJvb3RZIEIxNjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDE2CXBhZDQgQjE2OworICAgIENBUkQ4CXBhZDU7CisgICAgQ0FSRDgJZGV2aWNlaWQ7Cit9IHhYVGVzdEZha2VJbnB1dFJlcTsKKyNkZWZpbmUgc3pfeFhUZXN0RmFrZUlucHV0UmVxIDM2CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgWFRlc3RSZXFDb2RlICovCisgICAgQ0FSRDgJeHRSZXFUeXBlOwkvKiBhbHdheXMgWF9YVGVzdEdyYWJDb250cm9sICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQk9PTAlpbXBlcnZpb3VzOworICAgIENBUkQ4CXBhZDA7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBDQVJEOAlwYWQyOworfSB4WFRlc3RHcmFiQ29udHJvbFJlcTsKKyNkZWZpbmUgc3pfeFhUZXN0R3JhYkNvbnRyb2xSZXEgOAorCisjdW5kZWYgV2luZG93CisjdW5kZWYgVGltZQorI3VuZGVmIEN1cnNvcgorCisjZW5kaWYgLyogX1hURVNUUFJPVE9fSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2tleXN5bS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEva2V5c3ltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY1ODQ4OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2tleXN5bS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4NywgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworCitDb3B5cmlnaHQgMTk4NyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cy4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBEaWdpdGFsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICAKKworRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkZWZhdWx0IGtleXN5bXMgKi8KKyNkZWZpbmUgWEtfTUlTQ0VMTEFOWQorI2RlZmluZSBYS19YS0JfS0VZUworI2RlZmluZSBYS19MQVRJTjEKKyNkZWZpbmUgWEtfTEFUSU4yCisjZGVmaW5lIFhLX0xBVElOMworI2RlZmluZSBYS19MQVRJTjQKKyNkZWZpbmUgWEtfTEFUSU44CisjZGVmaW5lIFhLX0xBVElOOQorI2RlZmluZSBYS19DQVVDQVNVUworI2RlZmluZSBYS19HUkVFSworI2RlZmluZSBYS19LQVRBS0FOQQorI2RlZmluZSBYS19BUkFCSUMKKyNkZWZpbmUgWEtfQ1lSSUxMSUMKKyNkZWZpbmUgWEtfSEVCUkVXCisjZGVmaW5lIFhLX1RIQUkKKyNkZWZpbmUgWEtfS09SRUFOCisjZGVmaW5lIFhLX0FSTUVOSUFOCisjZGVmaW5lIFhLX0dFT1JHSUFOCisjZGVmaW5lIFhLX1ZJRVROQU1FU0UKKyNkZWZpbmUgWEtfQ1VSUkVOQ1kKKyNkZWZpbmUgWEtfTUFUSEVNQVRJQ0FMCisjZGVmaW5lIFhLX0JSQUlMTEUKKyNkZWZpbmUgWEtfU0lOSEFMQQorCisjaW5jbHVkZSA8WDExL2tleXN5bWRlZi5oPgorCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9rZXlzeW1kZWYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2tleXN5bWRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYjU1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9rZXlzeW1kZWYuaApAQCAtMCwwICsxLDI0NzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IDE5ODcsIDE5OTQsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKK2luIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKK09USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCitPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsCitub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yCitvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uCitmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisKK0NvcHlyaWdodCAxOTg3IGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzCisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCitwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Citib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KK3N1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgRGlnaXRhbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorCitESUdJVEFMIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKK0FMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTAorRElHSVRBTCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKK0FOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKK0FSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKK1NPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGUgIlgxMSBXaW5kb3cgU3lzdGVtIFByb3RvY29sIiBzdGFuZGFyZCBkZWZpbmVzIGluIEFwcGVuZGl4IEEgdGhlCisgKiBrZXlzeW0gY29kZXMuIFRoZXNlIDI5LWJpdCBpbnRlZ2VyIHZhbHVlcyBpZGVudGlmeSBjaGFyYWN0ZXJzIG9yCisgKiBmdW5jdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGVhY2gga2V5IChlLmcuLCB2aWEgdGhlIHZpc2libGUKKyAqIGVuZ3JhdmluZykgb2YgYSBrZXlib2FyZCBsYXlvdXQuIFRoaXMgZmlsZSBhc3NpZ25zIG1uZW1vbmljIG1hY3JvCisgKiBuYW1lcyBmb3IgdGhlc2Uga2V5c3ltcy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgYWxzbyBjb21waWxlZCAoYnkgc3JjL3V0aWwvbWFrZWtleXMuYyBpbiBsaWJYMTEpIGludG8KKyAqIGhhc2ggdGFibGVzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIHdpdGggWDExIGxpYnJhcnkgZnVuY3Rpb25zIHN1Y2ggYXMKKyAqIFhTdHJpbmdUb0tleXN5bSgpIGFuZCBYS2V5c3ltVG9TdHJpbmcoKS4KKyAqCisgKiBXaGVyZSBhIGtleXN5bSBjb3JyZXNwb25kcyBvbmUtdG8tb25lIHRvIGFuIElTTyAxMDY0NiAvIFVuaWNvZGUKKyAqIGNoYXJhY3RlciwgdGhpcyBpcyBub3RlZCBpbiBhIGNvbW1lbnQgdGhhdCBwcm92aWRlcyBib3RoIHRoZSBVK3h4eHgKKyAqIFVuaWNvZGUgcG9zaXRpb24sIGFzIHdlbGwgYXMgdGhlIG9mZmljaWFsIFVuaWNvZGUgbmFtZSBvZiB0aGUKKyAqIGNoYXJhY3Rlci4KKyAqCisgKiBXaGVyZSB0aGUgY29ycmVzcG9uZGVuY2UgaXMgZWl0aGVyIG5vdCBvbmUtdG8tb25lIG9yIHNlbWFudGljYWxseQorICogdW5jbGVhciwgdGhlIFVuaWNvZGUgcG9zaXRpb24gYW5kIG5hbWUgYXJlIGVuY2xvc2VkIGluCisgKiBwYXJlbnRoZXNlcy4gU3VjaCBsZWdhY3kga2V5c3ltcyBzaG91bGQgYmUgY29uc2lkZXJlZCBkZXByZWNhdGVkCisgKiBhbmQgYXJlIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlIGluIGZ1dHVyZSBrZXlib2FyZCBtYXBwaW5ncy4KKyAqCisgKiBGb3IgYW55IGZ1dHVyZSBleHRlbnNpb24gb2YgdGhlIGtleXN5bXMgd2l0aCBjaGFyYWN0ZXJzIGFscmVhZHkKKyAqIGZvdW5kIGluIElTTyAxMDY0NiAvIFVuaWNvZGUsIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtIHNoYWxsIGJlCisgKiB1c2VkLiBUaGUgbmV3IGtleXN5bSBjb2RlIHBvc2l0aW9uIHdpbGwgc2ltcGx5IGJlIHRoZSBjaGFyYWN0ZXIncworICogVW5pY29kZSBudW1iZXIgcGx1cyAweDAxMDAwMDAwLiBUaGUga2V5c3ltIHZhbHVlcyBpbiB0aGUgcmFuZ2UKKyAqIDB4MDEwMDAxMDAgdG8gMHgwMTEwZmZmZiBhcmUgcmVzZXJ2ZWQgdG8gcmVwcmVzZW50IFVuaWNvZGUKKyAqIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFUrMDEwMCB0byBVKzEwRkZGRi4KKyAqIAorICogV2hpbGUgbW9zdCBuZXdlciBVbmljb2RlLWJhc2VkIFgxMSBjbGllbnRzIGRvIGFscmVhZHkgYWNjZXB0CisgKiBVbmljb2RlLW1hcHBlZCBrZXlzeW1zIGluIHRoZSByYW5nZSAweDAxMDAwMTAwIHRvIDB4MDExMGZmZmYsIGl0CisgKiB3aWxsIHJlbWFpbiBuZWNlc3NhcnkgZm9yIGNsaWVudHMgLS0gaW4gdGhlIGludGVyZXN0IG9mCisgKiBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3Rpbmcgc2VydmVycyAtLSB0byBhbHNvIHVuZGVyc3RhbmQgdGhlCisgKiBleGlzdGluZyBsZWdhY3kga2V5c3ltIHZhbHVlcyBpbiB0aGUgcmFuZ2UgMHgwMTAwIHRvIDB4MjBmZi4KKyAqCisgKiBXaGVyZSBzZXZlcmFsIG1uZW1vbmljIG5hbWVzIGFyZSBkZWZpbmVkIGZvciB0aGUgc2FtZSBrZXlzeW0gaW4gdGhpcworICogZmlsZSwgYWxsIGJ1dCB0aGUgZmlyc3Qgb25lIGxpc3RlZCBzaG91bGQgYmUgY29uc2lkZXJlZCBkZXByZWNhdGVkLgorICoKKyAqIE1uZW1vbmljIG5hbWVzIGZvciBrZXlzeW1zIGFyZSBkZWZpbmVkIGluIHRoaXMgZmlsZSB3aXRoIGxpbmVzCisgKiB0aGF0IG1hdGNoIG9uZSBvZiB0aGVzZSBQZXJsIHJlZ3VsYXIgZXhwcmVzc2lvbnM6CisgKgorICogICAgL15cI2RlZmluZSBYS18oW2EtekEtWl8wLTldKylccysweChbMC05YS1mXSspXHMqXC9cKiBVKyhbMC05QS1GXXs0LDZ9KSAoLiopIFwqXC9ccyokLworICogICAgL15cI2RlZmluZSBYS18oW2EtekEtWl8wLTldKylccysweChbMC05YS1mXSspXHMqXC9cKlwoVSsoWzAtOUEtRl17NCw2fSkgKC4qKVwpXCpcL1xzKiQvCisgKiAgICAvXlwjZGVmaW5lIFhLXyhbYS16QS1aXzAtOV0rKVxzKzB4KFswLTlhLWZdKylccyooXC9cKlxzKiguKilccypcKlwvKT9ccyokLworICoKKyAqIEJlZm9yZSBhZGRpbmcgbmV3IGtleXN5bXMsIHBsZWFzZSBkbyBjb25zaWRlciB0aGUgZm9sbG93aW5nOiBJbgorICogYWRkaXRpb24gdG8gdGhlIGtleXN5bSBuYW1lcyBkZWZpbmVkIGluIHRoaXMgZmlsZSwgdGhlCisgKiBYU3RyaW5nVG9LZXlzeW0oKSBhbmQgWEtleXN5bVRvU3RyaW5nKCkgZnVuY3Rpb25zIHdpbGwgYWxzbyBoYW5kbGUKKyAqIGFueSBrZXlzeW0gc3RyaW5nIG9mIHRoZSBmb3JtICJVMDAyMCIgdG8gIlUwMDdFIiBhbmQgIlUwMEEwIiB0bworICogIlUxMEZGRkYiIGZvciBhbGwgcG9zc2libGUgVW5pY29kZSBjaGFyYWN0ZXJzLiBJbiBvdGhlciB3b3JkcywKKyAqIGV2ZXJ5IHBvc3NpYmxlIFVuaWNvZGUgY2hhcmFjdGVyIGhhcyBhbHJlYWR5IGEga2V5c3ltIHN0cmluZworICogZGVmaW5lZCBhbGdvcml0aG1pY2FsbHksIGV2ZW4gaWYgaXQgaXMgbm90IGxpc3RlZCBoZXJlLiBUaGVyZWZvcmUsCisgKiBkZWZpbmluZyBhbiBhZGRpdGlvbmFsIGtleXN5bSBtYWNybyBpcyBvbmx5IG5lY2Vzc2FyeSB3aGVyZSBhCisgKiBub24taGV4YWRlY2ltYWwgbW5lbW9uaWMgbmFtZSBpcyBuZWVkZWQsIG9yIHdoZXJlIHRoZSBuZXcga2V5c3ltCisgKiBkb2VzIG5vdCByZXByZXNlbnQgYW55IGV4aXN0aW5nIFVuaWNvZGUgY2hhcmFjdGVyLgorICoKKyAqIFdoZW4gYWRkaW5nIG5ldyBrZXlzeW1zIHRvIHRoaXMgZmlsZSwgZG8gbm90IGZvcmdldCB0byBhbHNvIHVwZGF0ZSB0aGUKKyAqIGZvbGxvd2luZzoKKyAqCisgKiAgIC0gdGhlIG1hcHBpbmdzIGluIHNyYy9LZXlCaW5kLmMgaW4gdGhlIHJlcG8KKyAqICAgICBnaXQ6Ly9hbm9uZ2l0LmZyZWVkZXNrdG9wLm9yZy94b3JnL2xpYi9saWJYMTEKKyAqCisgKiAgIC0gdGhlIHByb3RvY29sIHNwZWNpZmljYXRpb24gaW4gc3BlY3MvWFByb3RvY29sL1gxMS5rZXlzeW1zCisgKiAgICAgaW4gdGhlIHJlcG8gZ2l0Oi8vYW5vbmdpdC5mcmVlZGVza3RvcC5vcmcveG9yZy9kb2MveG9yZy1kb2NzCisgKgorICovCisKKyNkZWZpbmUgWEtfVm9pZFN5bWJvbCAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmICAvKiBWb2lkIHN5bWJvbCAqLworCisjaWZkZWYgWEtfTUlTQ0VMTEFOWQorLyoKKyAqIFRUWSBmdW5jdGlvbiBrZXlzLCBjbGV2ZXJseSBjaG9zZW4gdG8gbWFwIHRvIEFTQ0lJLCBmb3IgY29udmVuaWVuY2Ugb2YKKyAqIHByb2dyYW1taW5nLCBidXQgY291bGQgaGF2ZSBiZWVuIGFyYml0cmFyeSAoYXQgdGhlIGNvc3Qgb2YgbG9va3VwCisgKiB0YWJsZXMgaW4gY2xpZW50IGNvZGUpLgorICovCisKKyNkZWZpbmUgWEtfQmFja1NwYWNlICAgICAgICAgICAgICAgICAgICAgMHhmZjA4ICAvKiBCYWNrIHNwYWNlLCBiYWNrIGNoYXIgKi8KKyNkZWZpbmUgWEtfVGFiICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjA5CisjZGVmaW5lIFhLX0xpbmVmZWVkICAgICAgICAgICAgICAgICAgICAgIDB4ZmYwYSAgLyogTGluZWZlZWQsIExGICovCisjZGVmaW5lIFhLX0NsZWFyICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYwYgorI2RlZmluZSBYS19SZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAweGZmMGQgIC8qIFJldHVybiwgZW50ZXIgKi8KKyNkZWZpbmUgWEtfUGF1c2UgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjEzICAvKiBQYXVzZSwgaG9sZCAqLworI2RlZmluZSBYS19TY3JvbGxfTG9jayAgICAgICAgICAgICAgICAgICAweGZmMTQKKyNkZWZpbmUgWEtfU3lzX1JlcSAgICAgICAgICAgICAgICAgICAgICAgMHhmZjE1CisjZGVmaW5lIFhLX0VzY2FwZSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYxYgorI2RlZmluZSBYS19EZWxldGUgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYgIC8qIERlbGV0ZSwgcnVib3V0ICovCisKKworCisvKiBJbnRlcm5hdGlvbmFsICYgbXVsdGkta2V5IGNoYXJhY3RlciBjb21wb3NpdGlvbiAqLworCisjZGVmaW5lIFhLX011bHRpX2tleSAgICAgICAgICAgICAgICAgICAgIDB4ZmYyMCAgLyogTXVsdGkta2V5IGNoYXJhY3RlciBjb21wb3NlICovCisjZGVmaW5lIFhLX0NvZGVpbnB1dCAgICAgICAgICAgICAgICAgICAgIDB4ZmYzNworI2RlZmluZSBYS19TaW5nbGVDYW5kaWRhdGUgICAgICAgICAgICAgICAweGZmM2MKKyNkZWZpbmUgWEtfTXVsdGlwbGVDYW5kaWRhdGUgICAgICAgICAgICAgMHhmZjNkCisjZGVmaW5lIFhLX1ByZXZpb3VzQ2FuZGlkYXRlICAgICAgICAgICAgIDB4ZmYzZQorCisvKiBKYXBhbmVzZSBrZXlib2FyZCBzdXBwb3J0ICovCisKKyNkZWZpbmUgWEtfS2FuamkgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjIxICAvKiBLYW5qaSwgS2FuamkgY29udmVydCAqLworI2RlZmluZSBYS19NdWhlbmthbiAgICAgICAgICAgICAgICAgICAgICAweGZmMjIgIC8qIENhbmNlbCBDb252ZXJzaW9uICovCisjZGVmaW5lIFhLX0hlbmthbl9Nb2RlICAgICAgICAgICAgICAgICAgIDB4ZmYyMyAgLyogU3RhcnQvU3RvcCBDb252ZXJzaW9uICovCisjZGVmaW5lIFhLX0hlbmthbiAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYyMyAgLyogQWxpYXMgZm9yIEhlbmthbl9Nb2RlICovCisjZGVmaW5lIFhLX1JvbWFqaSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYyNCAgLyogdG8gUm9tYWppICovCisjZGVmaW5lIFhLX0hpcmFnYW5hICAgICAgICAgICAgICAgICAgICAgIDB4ZmYyNSAgLyogdG8gSGlyYWdhbmEgKi8KKyNkZWZpbmUgWEtfS2F0YWthbmEgICAgICAgICAgICAgICAgICAgICAgMHhmZjI2ICAvKiB0byBLYXRha2FuYSAqLworI2RlZmluZSBYS19IaXJhZ2FuYV9LYXRha2FuYSAgICAgICAgICAgICAweGZmMjcgIC8qIEhpcmFnYW5hL0thdGFrYW5hIHRvZ2dsZSAqLworI2RlZmluZSBYS19aZW5rYWt1ICAgICAgICAgICAgICAgICAgICAgICAweGZmMjggIC8qIHRvIFplbmtha3UgKi8KKyNkZWZpbmUgWEtfSGFua2FrdSAgICAgICAgICAgICAgICAgICAgICAgMHhmZjI5ICAvKiB0byBIYW5rYWt1ICovCisjZGVmaW5lIFhLX1plbmtha3VfSGFua2FrdSAgICAgICAgICAgICAgIDB4ZmYyYSAgLyogWmVua2FrdS9IYW5rYWt1IHRvZ2dsZSAqLworI2RlZmluZSBYS19Ub3Vyb2t1ICAgICAgICAgICAgICAgICAgICAgICAweGZmMmIgIC8qIEFkZCB0byBEaWN0aW9uYXJ5ICovCisjZGVmaW5lIFhLX01hc3N5byAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYyYyAgLyogRGVsZXRlIGZyb20gRGljdGlvbmFyeSAqLworI2RlZmluZSBYS19LYW5hX0xvY2sgICAgICAgICAgICAgICAgICAgICAweGZmMmQgIC8qIEthbmEgTG9jayAqLworI2RlZmluZSBYS19LYW5hX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAweGZmMmUgIC8qIEthbmEgU2hpZnQgKi8KKyNkZWZpbmUgWEtfRWlzdV9TaGlmdCAgICAgICAgICAgICAgICAgICAgMHhmZjJmICAvKiBBbHBoYW51bWVyaWMgU2hpZnQgKi8KKyNkZWZpbmUgWEtfRWlzdV90b2dnbGUgICAgICAgICAgICAgICAgICAgMHhmZjMwICAvKiBBbHBoYW51bWVyaWMgdG9nZ2xlICovCisjZGVmaW5lIFhLX0thbmppX0JhbmdvdSAgICAgICAgICAgICAgICAgIDB4ZmYzNyAgLyogQ29kZWlucHV0ICovCisjZGVmaW5lIFhLX1plbl9Lb2hvICAgICAgICAgICAgICAgICAgICAgIDB4ZmYzZCAgLyogTXVsdGlwbGUvQWxsIENhbmRpZGF0ZShzKSAqLworI2RlZmluZSBYS19NYWVfS29obyAgICAgICAgICAgICAgICAgICAgICAweGZmM2UgIC8qIFByZXZpb3VzIENhbmRpZGF0ZSAqLworCisvKiAweGZmMzEgdGhydSAweGZmM2YgYXJlIHVuZGVyIFhLX0tPUkVBTiAqLworCisvKiBDdXJzb3IgY29udHJvbCAmIG1vdGlvbiAqLworCisjZGVmaW5lIFhLX0hvbWUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY1MAorI2RlZmluZSBYS19MZWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmNTEgIC8qIE1vdmUgbGVmdCwgbGVmdCBhcnJvdyAqLworI2RlZmluZSBYS19VcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmNTIgIC8qIE1vdmUgdXAsIHVwIGFycm93ICovCisjZGVmaW5lIFhLX1JpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY1MyAgLyogTW92ZSByaWdodCwgcmlnaHQgYXJyb3cgKi8KKyNkZWZpbmUgWEtfRG93biAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjU0ICAvKiBNb3ZlIGRvd24sIGRvd24gYXJyb3cgKi8KKyNkZWZpbmUgWEtfUHJpb3IgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjU1ICAvKiBQcmlvciwgcHJldmlvdXMgKi8KKyNkZWZpbmUgWEtfUGFnZV9VcCAgICAgICAgICAgICAgICAgICAgICAgMHhmZjU1CisjZGVmaW5lIFhLX05leHQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY1NiAgLyogTmV4dCAqLworI2RlZmluZSBYS19QYWdlX0Rvd24gICAgICAgICAgICAgICAgICAgICAweGZmNTYKKyNkZWZpbmUgWEtfRW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjU3ICAvKiBFT0wgKi8KKyNkZWZpbmUgWEtfQmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjU4ICAvKiBCT0wgKi8KKworCisvKiBNaXNjIGZ1bmN0aW9ucyAqLworCisjZGVmaW5lIFhLX1NlbGVjdCAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY2MCAgLyogU2VsZWN0LCBtYXJrICovCisjZGVmaW5lIFhLX1ByaW50ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY2MQorI2RlZmluZSBYS19FeGVjdXRlICAgICAgICAgICAgICAgICAgICAgICAweGZmNjIgIC8qIEV4ZWN1dGUsIHJ1biwgZG8gKi8KKyNkZWZpbmUgWEtfSW5zZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjYzICAvKiBJbnNlcnQsIGluc2VydCBoZXJlICovCisjZGVmaW5lIFhLX1VuZG8gICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY2NQorI2RlZmluZSBYS19SZWRvICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmNjYgIC8qIFJlZG8sIGFnYWluICovCisjZGVmaW5lIFhLX01lbnUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY2NworI2RlZmluZSBYS19GaW5kICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmNjggIC8qIEZpbmQsIHNlYXJjaCAqLworI2RlZmluZSBYS19DYW5jZWwgICAgICAgICAgICAgICAgICAgICAgICAweGZmNjkgIC8qIENhbmNlbCwgc3RvcCwgYWJvcnQsIGV4aXQgKi8KKyNkZWZpbmUgWEtfSGVscCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjZhICAvKiBIZWxwICovCisjZGVmaW5lIFhLX0JyZWFrICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY2YgorI2RlZmluZSBYS19Nb2RlX3N3aXRjaCAgICAgICAgICAgICAgICAgICAweGZmN2UgIC8qIENoYXJhY3RlciBzZXQgc3dpdGNoICovCisjZGVmaW5lIFhLX3NjcmlwdF9zd2l0Y2ggICAgICAgICAgICAgICAgIDB4ZmY3ZSAgLyogQWxpYXMgZm9yIG1vZGVfc3dpdGNoICovCisjZGVmaW5lIFhLX051bV9Mb2NrICAgICAgICAgICAgICAgICAgICAgIDB4ZmY3ZgorCisvKiBLZXlwYWQgZnVuY3Rpb25zLCBrZXlwYWQgbnVtYmVycyBjbGV2ZXJseSBjaG9zZW4gdG8gbWFwIHRvIEFTQ0lJICovCisKKyNkZWZpbmUgWEtfS1BfU3BhY2UgICAgICAgICAgICAgICAgICAgICAgMHhmZjgwICAvKiBTcGFjZSAqLworI2RlZmluZSBYS19LUF9UYWIgICAgICAgICAgICAgICAgICAgICAgICAweGZmODkKKyNkZWZpbmUgWEtfS1BfRW50ZXIgICAgICAgICAgICAgICAgICAgICAgMHhmZjhkICAvKiBFbnRlciAqLworI2RlZmluZSBYS19LUF9GMSAgICAgICAgICAgICAgICAgICAgICAgICAweGZmOTEgIC8qIFBGMSwgS1BfQSwgLi4uICovCisjZGVmaW5lIFhLX0tQX0YyICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY5MgorI2RlZmluZSBYS19LUF9GMyAgICAgICAgICAgICAgICAgICAgICAgICAweGZmOTMKKyNkZWZpbmUgWEtfS1BfRjQgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjk0CisjZGVmaW5lIFhLX0tQX0hvbWUgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY5NQorI2RlZmluZSBYS19LUF9MZWZ0ICAgICAgICAgICAgICAgICAgICAgICAweGZmOTYKKyNkZWZpbmUgWEtfS1BfVXAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjk3CisjZGVmaW5lIFhLX0tQX1JpZ2h0ICAgICAgICAgICAgICAgICAgICAgIDB4ZmY5OAorI2RlZmluZSBYS19LUF9Eb3duICAgICAgICAgICAgICAgICAgICAgICAweGZmOTkKKyNkZWZpbmUgWEtfS1BfUHJpb3IgICAgICAgICAgICAgICAgICAgICAgMHhmZjlhCisjZGVmaW5lIFhLX0tQX1BhZ2VfVXAgICAgICAgICAgICAgICAgICAgIDB4ZmY5YQorI2RlZmluZSBYS19LUF9OZXh0ICAgICAgICAgICAgICAgICAgICAgICAweGZmOWIKKyNkZWZpbmUgWEtfS1BfUGFnZV9Eb3duICAgICAgICAgICAgICAgICAgMHhmZjliCisjZGVmaW5lIFhLX0tQX0VuZCAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY5YworI2RlZmluZSBYS19LUF9CZWdpbiAgICAgICAgICAgICAgICAgICAgICAweGZmOWQKKyNkZWZpbmUgWEtfS1BfSW5zZXJ0ICAgICAgICAgICAgICAgICAgICAgMHhmZjllCisjZGVmaW5lIFhLX0tQX0RlbGV0ZSAgICAgICAgICAgICAgICAgICAgIDB4ZmY5ZgorI2RlZmluZSBYS19LUF9FcXVhbCAgICAgICAgICAgICAgICAgICAgICAweGZmYmQgIC8qIEVxdWFscyAqLworI2RlZmluZSBYS19LUF9NdWx0aXBseSAgICAgICAgICAgICAgICAgICAweGZmYWEKKyNkZWZpbmUgWEtfS1BfQWRkICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmFiCisjZGVmaW5lIFhLX0tQX1NlcGFyYXRvciAgICAgICAgICAgICAgICAgIDB4ZmZhYyAgLyogU2VwYXJhdG9yLCBvZnRlbiBjb21tYSAqLworI2RlZmluZSBYS19LUF9TdWJ0cmFjdCAgICAgICAgICAgICAgICAgICAweGZmYWQKKyNkZWZpbmUgWEtfS1BfRGVjaW1hbCAgICAgICAgICAgICAgICAgICAgMHhmZmFlCisjZGVmaW5lIFhLX0tQX0RpdmlkZSAgICAgICAgICAgICAgICAgICAgIDB4ZmZhZgorCisjZGVmaW5lIFhLX0tQXzAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiMAorI2RlZmluZSBYS19LUF8xICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYjEKKyNkZWZpbmUgWEtfS1BfMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmIyCisjZGVmaW5lIFhLX0tQXzMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiMworI2RlZmluZSBYS19LUF80ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYjQKKyNkZWZpbmUgWEtfS1BfNSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmI1CisjZGVmaW5lIFhLX0tQXzYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiNgorI2RlZmluZSBYS19LUF83ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYjcKKyNkZWZpbmUgWEtfS1BfOCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmI4CisjZGVmaW5lIFhLX0tQXzkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiOQorCisKKworLyoKKyAqIEF1eGlsaWFyeSBmdW5jdGlvbnM7IG5vdGUgdGhlIGR1cGxpY2F0ZSBkZWZpbml0aW9ucyBmb3IgbGVmdCBhbmQgcmlnaHQKKyAqIGZ1bmN0aW9uIGtleXM7ICBTdW4ga2V5Ym9hcmRzIGFuZCBhIGZldyBvdGhlciBtYW51ZmFjdHVyZXJzIGhhdmUgc3VjaAorICogZnVuY3Rpb24ga2V5IGdyb3VwcyBvbiB0aGUgbGVmdCBhbmQvb3IgcmlnaHQgc2lkZXMgb2YgdGhlIGtleWJvYXJkLgorICogV2UndmUgbm90IGZvdW5kIGEga2V5Ym9hcmQgd2l0aCBtb3JlIHRoYW4gMzUgZnVuY3Rpb24ga2V5cyB0b3RhbC4KKyAqLworCisjZGVmaW5lIFhLX0YxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiZQorI2RlZmluZSBYS19GMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYmYKKyNkZWZpbmUgWEtfRjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmMwCisjZGVmaW5lIFhLX0Y0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjMQorI2RlZmluZSBYS19GNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzIKKyNkZWZpbmUgWEtfRjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmMzCisjZGVmaW5lIFhLX0Y3ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjNAorI2RlZmluZSBYS19GOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzUKKyNkZWZpbmUgWEtfRjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmM2CisjZGVmaW5lIFhLX0YxMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjNworI2RlZmluZSBYS19GMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzgKKyNkZWZpbmUgWEtfTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmM4CisjZGVmaW5lIFhLX0YxMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjOQorI2RlZmluZSBYS19MMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzkKKyNkZWZpbmUgWEtfRjEzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmNhCisjZGVmaW5lIFhLX0wzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjYQorI2RlZmluZSBYS19GMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2IKKyNkZWZpbmUgWEtfTDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmNiCisjZGVmaW5lIFhLX0YxNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjYworI2RlZmluZSBYS19MNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2MKKyNkZWZpbmUgWEtfRjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmNkCisjZGVmaW5lIFhLX0w2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjZAorI2RlZmluZSBYS19GMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2UKKyNkZWZpbmUgWEtfTDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmNlCisjZGVmaW5lIFhLX0YxOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjZgorI2RlZmluZSBYS19MOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2YKKyNkZWZpbmUgWEtfRjE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmQwCisjZGVmaW5lIFhLX0w5ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkMAorI2RlZmluZSBYS19GMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDEKKyNkZWZpbmUgWEtfTDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmQxCisjZGVmaW5lIFhLX0YyMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkMgorI2RlZmluZSBYS19SMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDIKKyNkZWZpbmUgWEtfRjIyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmQzCisjZGVmaW5lIFhLX1IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkMworI2RlZmluZSBYS19GMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDQKKyNkZWZpbmUgWEtfUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmQ0CisjZGVmaW5lIFhLX0YyNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkNQorI2RlZmluZSBYS19SNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDUKKyNkZWZpbmUgWEtfRjI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmQ2CisjZGVmaW5lIFhLX1I1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkNgorI2RlZmluZSBYS19GMjYgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDcKKyNkZWZpbmUgWEtfUjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmQ3CisjZGVmaW5lIFhLX0YyNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkOAorI2RlZmluZSBYS19SNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDgKKyNkZWZpbmUgWEtfRjI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmQ5CisjZGVmaW5lIFhLX1I4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkOQorI2RlZmluZSBYS19GMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGEKKyNkZWZpbmUgWEtfUjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmRhCisjZGVmaW5lIFhLX0YzMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkYgorI2RlZmluZSBYS19SMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGIKKyNkZWZpbmUgWEtfRjMxICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmRjCisjZGVmaW5lIFhLX1IxMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkYworI2RlZmluZSBYS19GMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGQKKyNkZWZpbmUgWEtfUjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmRkCisjZGVmaW5lIFhLX0YzMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkZQorI2RlZmluZSBYS19SMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGUKKyNkZWZpbmUgWEtfRjM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmRmCisjZGVmaW5lIFhLX1IxNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkZgorI2RlZmluZSBYS19GMzUgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZTAKKyNkZWZpbmUgWEtfUjE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmUwCisKKy8qIE1vZGlmaWVycyAqLworCisjZGVmaW5lIFhLX1NoaWZ0X0wgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZlMSAgLyogTGVmdCBzaGlmdCAqLworI2RlZmluZSBYS19TaGlmdF9SICAgICAgICAgICAgICAgICAgICAgICAweGZmZTIgIC8qIFJpZ2h0IHNoaWZ0ICovCisjZGVmaW5lIFhLX0NvbnRyb2xfTCAgICAgICAgICAgICAgICAgICAgIDB4ZmZlMyAgLyogTGVmdCBjb250cm9sICovCisjZGVmaW5lIFhLX0NvbnRyb2xfUiAgICAgICAgICAgICAgICAgICAgIDB4ZmZlNCAgLyogUmlnaHQgY29udHJvbCAqLworI2RlZmluZSBYS19DYXBzX0xvY2sgICAgICAgICAgICAgICAgICAgICAweGZmZTUgIC8qIENhcHMgbG9jayAqLworI2RlZmluZSBYS19TaGlmdF9Mb2NrICAgICAgICAgICAgICAgICAgICAweGZmZTYgIC8qIFNoaWZ0IGxvY2sgKi8KKworI2RlZmluZSBYS19NZXRhX0wgICAgICAgICAgICAgICAgICAgICAgICAweGZmZTcgIC8qIExlZnQgbWV0YSAqLworI2RlZmluZSBYS19NZXRhX1IgICAgICAgICAgICAgICAgICAgICAgICAweGZmZTggIC8qIFJpZ2h0IG1ldGEgKi8KKyNkZWZpbmUgWEtfQWx0X0wgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmU5ICAvKiBMZWZ0IGFsdCAqLworI2RlZmluZSBYS19BbHRfUiAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZWEgIC8qIFJpZ2h0IGFsdCAqLworI2RlZmluZSBYS19TdXBlcl9MICAgICAgICAgICAgICAgICAgICAgICAweGZmZWIgIC8qIExlZnQgc3VwZXIgKi8KKyNkZWZpbmUgWEtfU3VwZXJfUiAgICAgICAgICAgICAgICAgICAgICAgMHhmZmVjICAvKiBSaWdodCBzdXBlciAqLworI2RlZmluZSBYS19IeXBlcl9MICAgICAgICAgICAgICAgICAgICAgICAweGZmZWQgIC8qIExlZnQgaHlwZXIgKi8KKyNkZWZpbmUgWEtfSHlwZXJfUiAgICAgICAgICAgICAgICAgICAgICAgMHhmZmVlICAvKiBSaWdodCBoeXBlciAqLworI2VuZGlmIC8qIFhLX01JU0NFTExBTlkgKi8KKworLyoKKyAqIEtleWJvYXJkIChYS0IpIEV4dGVuc2lvbiBmdW5jdGlvbiBhbmQgbW9kaWZpZXIga2V5cworICogKGZyb20gQXBwZW5kaXggQyBvZiAiVGhlIFggS2V5Ym9hcmQgRXh0ZW5zaW9uOiBQcm90b2NvbCBTcGVjaWZpY2F0aW9uIikKKyAqIEJ5dGUgMyA9IDB4ZmUKKyAqLworCisjaWZkZWYgWEtfWEtCX0tFWVMKKyNkZWZpbmUgWEtfSVNPX0xvY2sgICAgICAgICAgICAgICAgICAgICAgMHhmZTAxCisjZGVmaW5lIFhLX0lTT19MZXZlbDJfTGF0Y2ggICAgICAgICAgICAgIDB4ZmUwMgorI2RlZmluZSBYS19JU09fTGV2ZWwzX1NoaWZ0ICAgICAgICAgICAgICAweGZlMDMKKyNkZWZpbmUgWEtfSVNPX0xldmVsM19MYXRjaCAgICAgICAgICAgICAgMHhmZTA0CisjZGVmaW5lIFhLX0lTT19MZXZlbDNfTG9jayAgICAgICAgICAgICAgIDB4ZmUwNQorI2RlZmluZSBYS19JU09fTGV2ZWw1X1NoaWZ0ICAgICAgICAgICAgICAweGZlMTEKKyNkZWZpbmUgWEtfSVNPX0xldmVsNV9MYXRjaCAgICAgICAgICAgICAgMHhmZTEyCisjZGVmaW5lIFhLX0lTT19MZXZlbDVfTG9jayAgICAgICAgICAgICAgIDB4ZmUxMworI2RlZmluZSBYS19JU09fR3JvdXBfU2hpZnQgICAgICAgICAgICAgICAweGZmN2UgIC8qIEFsaWFzIGZvciBtb2RlX3N3aXRjaCAqLworI2RlZmluZSBYS19JU09fR3JvdXBfTGF0Y2ggICAgICAgICAgICAgICAweGZlMDYKKyNkZWZpbmUgWEtfSVNPX0dyb3VwX0xvY2sgICAgICAgICAgICAgICAgMHhmZTA3CisjZGVmaW5lIFhLX0lTT19OZXh0X0dyb3VwICAgICAgICAgICAgICAgIDB4ZmUwOAorI2RlZmluZSBYS19JU09fTmV4dF9Hcm91cF9Mb2NrICAgICAgICAgICAweGZlMDkKKyNkZWZpbmUgWEtfSVNPX1ByZXZfR3JvdXAgICAgICAgICAgICAgICAgMHhmZTBhCisjZGVmaW5lIFhLX0lTT19QcmV2X0dyb3VwX0xvY2sgICAgICAgICAgIDB4ZmUwYgorI2RlZmluZSBYS19JU09fRmlyc3RfR3JvdXAgICAgICAgICAgICAgICAweGZlMGMKKyNkZWZpbmUgWEtfSVNPX0ZpcnN0X0dyb3VwX0xvY2sgICAgICAgICAgMHhmZTBkCisjZGVmaW5lIFhLX0lTT19MYXN0X0dyb3VwICAgICAgICAgICAgICAgIDB4ZmUwZQorI2RlZmluZSBYS19JU09fTGFzdF9Hcm91cF9Mb2NrICAgICAgICAgICAweGZlMGYKKworI2RlZmluZSBYS19JU09fTGVmdF9UYWIgICAgICAgICAgICAgICAgICAweGZlMjAKKyNkZWZpbmUgWEtfSVNPX01vdmVfTGluZV9VcCAgICAgICAgICAgICAgMHhmZTIxCisjZGVmaW5lIFhLX0lTT19Nb3ZlX0xpbmVfRG93biAgICAgICAgICAgIDB4ZmUyMgorI2RlZmluZSBYS19JU09fUGFydGlhbF9MaW5lX1VwICAgICAgICAgICAweGZlMjMKKyNkZWZpbmUgWEtfSVNPX1BhcnRpYWxfTGluZV9Eb3duICAgICAgICAgMHhmZTI0CisjZGVmaW5lIFhLX0lTT19QYXJ0aWFsX1NwYWNlX0xlZnQgICAgICAgIDB4ZmUyNQorI2RlZmluZSBYS19JU09fUGFydGlhbF9TcGFjZV9SaWdodCAgICAgICAweGZlMjYKKyNkZWZpbmUgWEtfSVNPX1NldF9NYXJnaW5fTGVmdCAgICAgICAgICAgMHhmZTI3CisjZGVmaW5lIFhLX0lTT19TZXRfTWFyZ2luX1JpZ2h0ICAgICAgICAgIDB4ZmUyOAorI2RlZmluZSBYS19JU09fUmVsZWFzZV9NYXJnaW5fTGVmdCAgICAgICAweGZlMjkKKyNkZWZpbmUgWEtfSVNPX1JlbGVhc2VfTWFyZ2luX1JpZ2h0ICAgICAgMHhmZTJhCisjZGVmaW5lIFhLX0lTT19SZWxlYXNlX0JvdGhfTWFyZ2lucyAgICAgIDB4ZmUyYgorI2RlZmluZSBYS19JU09fRmFzdF9DdXJzb3JfTGVmdCAgICAgICAgICAweGZlMmMKKyNkZWZpbmUgWEtfSVNPX0Zhc3RfQ3Vyc29yX1JpZ2h0ICAgICAgICAgMHhmZTJkCisjZGVmaW5lIFhLX0lTT19GYXN0X0N1cnNvcl9VcCAgICAgICAgICAgIDB4ZmUyZQorI2RlZmluZSBYS19JU09fRmFzdF9DdXJzb3JfRG93biAgICAgICAgICAweGZlMmYKKyNkZWZpbmUgWEtfSVNPX0NvbnRpbnVvdXNfVW5kZXJsaW5lICAgICAgMHhmZTMwCisjZGVmaW5lIFhLX0lTT19EaXNjb250aW51b3VzX1VuZGVybGluZSAgIDB4ZmUzMQorI2RlZmluZSBYS19JU09fRW1waGFzaXplICAgICAgICAgICAgICAgICAweGZlMzIKKyNkZWZpbmUgWEtfSVNPX0NlbnRlcl9PYmplY3QgICAgICAgICAgICAgMHhmZTMzCisjZGVmaW5lIFhLX0lTT19FbnRlciAgICAgICAgICAgICAgICAgICAgIDB4ZmUzNAorCisjZGVmaW5lIFhLX2RlYWRfZ3JhdmUgICAgICAgICAgICAgICAgICAgIDB4ZmU1MAorI2RlZmluZSBYS19kZWFkX2FjdXRlICAgICAgICAgICAgICAgICAgICAweGZlNTEKKyNkZWZpbmUgWEtfZGVhZF9jaXJjdW1mbGV4ICAgICAgICAgICAgICAgMHhmZTUyCisjZGVmaW5lIFhLX2RlYWRfdGlsZGUgICAgICAgICAgICAgICAgICAgIDB4ZmU1MworI2RlZmluZSBYS19kZWFkX3BlcmlzcG9tZW5pICAgICAgICAgICAgICAweGZlNTMgIC8qIGFsaWFzIGZvciBkZWFkX3RpbGRlICovCisjZGVmaW5lIFhLX2RlYWRfbWFjcm9uICAgICAgICAgICAgICAgICAgIDB4ZmU1NAorI2RlZmluZSBYS19kZWFkX2JyZXZlICAgICAgICAgICAgICAgICAgICAweGZlNTUKKyNkZWZpbmUgWEtfZGVhZF9hYm92ZWRvdCAgICAgICAgICAgICAgICAgMHhmZTU2CisjZGVmaW5lIFhLX2RlYWRfZGlhZXJlc2lzICAgICAgICAgICAgICAgIDB4ZmU1NworI2RlZmluZSBYS19kZWFkX2Fib3ZlcmluZyAgICAgICAgICAgICAgICAweGZlNTgKKyNkZWZpbmUgWEtfZGVhZF9kb3VibGVhY3V0ZSAgICAgICAgICAgICAgMHhmZTU5CisjZGVmaW5lIFhLX2RlYWRfY2Fyb24gICAgICAgICAgICAgICAgICAgIDB4ZmU1YQorI2RlZmluZSBYS19kZWFkX2NlZGlsbGEgICAgICAgICAgICAgICAgICAweGZlNWIKKyNkZWZpbmUgWEtfZGVhZF9vZ29uZWsgICAgICAgICAgICAgICAgICAgMHhmZTVjCisjZGVmaW5lIFhLX2RlYWRfaW90YSAgICAgICAgICAgICAgICAgICAgIDB4ZmU1ZAorI2RlZmluZSBYS19kZWFkX3ZvaWNlZF9zb3VuZCAgICAgICAgICAgICAweGZlNWUKKyNkZWZpbmUgWEtfZGVhZF9zZW1pdm9pY2VkX3NvdW5kICAgICAgICAgMHhmZTVmCisjZGVmaW5lIFhLX2RlYWRfYmVsb3dkb3QgICAgICAgICAgICAgICAgIDB4ZmU2MAorI2RlZmluZSBYS19kZWFkX2hvb2sgICAgICAgICAgICAgICAgICAgICAweGZlNjEKKyNkZWZpbmUgWEtfZGVhZF9ob3JuICAgICAgICAgICAgICAgICAgICAgMHhmZTYyCisjZGVmaW5lIFhLX2RlYWRfc3Ryb2tlICAgICAgICAgICAgICAgICAgIDB4ZmU2MworI2RlZmluZSBYS19kZWFkX2Fib3ZlY29tbWEgICAgICAgICAgICAgICAweGZlNjQKKyNkZWZpbmUgWEtfZGVhZF9wc2lsaSAgICAgICAgICAgICAgICAgICAgMHhmZTY0ICAvKiBhbGlhcyBmb3IgZGVhZF9hYm92ZWNvbW1hICovCisjZGVmaW5lIFhLX2RlYWRfYWJvdmVyZXZlcnNlZGNvbW1hICAgICAgIDB4ZmU2NQorI2RlZmluZSBYS19kZWFkX2Rhc2lhICAgICAgICAgICAgICAgICAgICAweGZlNjUgIC8qIGFsaWFzIGZvciBkZWFkX2Fib3ZlcmV2ZXJzZWRjb21tYSAqLworI2RlZmluZSBYS19kZWFkX2RvdWJsZWdyYXZlICAgICAgICAgICAgICAweGZlNjYKKyNkZWZpbmUgWEtfZGVhZF9iZWxvd3JpbmcgICAgICAgICAgICAgICAgMHhmZTY3CisjZGVmaW5lIFhLX2RlYWRfYmVsb3dtYWNyb24gICAgICAgICAgICAgIDB4ZmU2OAorI2RlZmluZSBYS19kZWFkX2JlbG93Y2lyY3VtZmxleCAgICAgICAgICAweGZlNjkKKyNkZWZpbmUgWEtfZGVhZF9iZWxvd3RpbGRlICAgICAgICAgICAgICAgMHhmZTZhCisjZGVmaW5lIFhLX2RlYWRfYmVsb3dicmV2ZSAgICAgICAgICAgICAgIDB4ZmU2YgorI2RlZmluZSBYS19kZWFkX2JlbG93ZGlhZXJlc2lzICAgICAgICAgICAweGZlNmMKKyNkZWZpbmUgWEtfZGVhZF9pbnZlcnRlZGJyZXZlICAgICAgICAgICAgMHhmZTZkCisjZGVmaW5lIFhLX2RlYWRfYmVsb3djb21tYSAgICAgICAgICAgICAgIDB4ZmU2ZQorI2RlZmluZSBYS19kZWFkX2N1cnJlbmN5ICAgICAgICAgICAgICAgICAweGZlNmYKKworLyogZGVhZCB2b3dlbHMgZm9yIHVuaXZlcnNhbCBzeWxsYWJsZSBlbnRyeSAqLworI2RlZmluZSBYS19kZWFkX2EgICAgICAgICAgICAgICAgICAgICAgICAweGZlODAKKyNkZWZpbmUgWEtfZGVhZF9BICAgICAgICAgICAgICAgICAgICAgICAgMHhmZTgxCisjZGVmaW5lIFhLX2RlYWRfZSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmU4MgorI2RlZmluZSBYS19kZWFkX0UgICAgICAgICAgICAgICAgICAgICAgICAweGZlODMKKyNkZWZpbmUgWEtfZGVhZF9pICAgICAgICAgICAgICAgICAgICAgICAgMHhmZTg0CisjZGVmaW5lIFhLX2RlYWRfSSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmU4NQorI2RlZmluZSBYS19kZWFkX28gICAgICAgICAgICAgICAgICAgICAgICAweGZlODYKKyNkZWZpbmUgWEtfZGVhZF9PICAgICAgICAgICAgICAgICAgICAgICAgMHhmZTg3CisjZGVmaW5lIFhLX2RlYWRfdSAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmU4OAorI2RlZmluZSBYS19kZWFkX1UgICAgICAgICAgICAgICAgICAgICAgICAweGZlODkKKyNkZWZpbmUgWEtfZGVhZF9zbWFsbF9zY2h3YSAgICAgICAgICAgICAgMHhmZThhCisjZGVmaW5lIFhLX2RlYWRfY2FwaXRhbF9zY2h3YSAgICAgICAgICAgIDB4ZmU4YgorCisjZGVmaW5lIFhLX0ZpcnN0X1ZpcnR1YWxfU2NyZWVuICAgICAgICAgIDB4ZmVkMAorI2RlZmluZSBYS19QcmV2X1ZpcnR1YWxfU2NyZWVuICAgICAgICAgICAweGZlZDEKKyNkZWZpbmUgWEtfTmV4dF9WaXJ0dWFsX1NjcmVlbiAgICAgICAgICAgMHhmZWQyCisjZGVmaW5lIFhLX0xhc3RfVmlydHVhbF9TY3JlZW4gICAgICAgICAgIDB4ZmVkNAorI2RlZmluZSBYS19UZXJtaW5hdGVfU2VydmVyICAgICAgICAgICAgICAweGZlZDUKKworI2RlZmluZSBYS19BY2Nlc3NYX0VuYWJsZSAgICAgICAgICAgICAgICAweGZlNzAKKyNkZWZpbmUgWEtfQWNjZXNzWF9GZWVkYmFja19FbmFibGUgICAgICAgMHhmZTcxCisjZGVmaW5lIFhLX1JlcGVhdEtleXNfRW5hYmxlICAgICAgICAgICAgIDB4ZmU3MgorI2RlZmluZSBYS19TbG93S2V5c19FbmFibGUgICAgICAgICAgICAgICAweGZlNzMKKyNkZWZpbmUgWEtfQm91bmNlS2V5c19FbmFibGUgICAgICAgICAgICAgMHhmZTc0CisjZGVmaW5lIFhLX1N0aWNreUtleXNfRW5hYmxlICAgICAgICAgICAgIDB4ZmU3NQorI2RlZmluZSBYS19Nb3VzZUtleXNfRW5hYmxlICAgICAgICAgICAgICAweGZlNzYKKyNkZWZpbmUgWEtfTW91c2VLZXlzX0FjY2VsX0VuYWJsZSAgICAgICAgMHhmZTc3CisjZGVmaW5lIFhLX092ZXJsYXkxX0VuYWJsZSAgICAgICAgICAgICAgIDB4ZmU3OAorI2RlZmluZSBYS19PdmVybGF5Ml9FbmFibGUgICAgICAgICAgICAgICAweGZlNzkKKyNkZWZpbmUgWEtfQXVkaWJsZUJlbGxfRW5hYmxlICAgICAgICAgICAgMHhmZTdhCisKKyNkZWZpbmUgWEtfUG9pbnRlcl9MZWZ0ICAgICAgICAgICAgICAgICAgMHhmZWUwCisjZGVmaW5lIFhLX1BvaW50ZXJfUmlnaHQgICAgICAgICAgICAgICAgIDB4ZmVlMQorI2RlZmluZSBYS19Qb2ludGVyX1VwICAgICAgICAgICAgICAgICAgICAweGZlZTIKKyNkZWZpbmUgWEtfUG9pbnRlcl9Eb3duICAgICAgICAgICAgICAgICAgMHhmZWUzCisjZGVmaW5lIFhLX1BvaW50ZXJfVXBMZWZ0ICAgICAgICAgICAgICAgIDB4ZmVlNAorI2RlZmluZSBYS19Qb2ludGVyX1VwUmlnaHQgICAgICAgICAgICAgICAweGZlZTUKKyNkZWZpbmUgWEtfUG9pbnRlcl9Eb3duTGVmdCAgICAgICAgICAgICAgMHhmZWU2CisjZGVmaW5lIFhLX1BvaW50ZXJfRG93blJpZ2h0ICAgICAgICAgICAgIDB4ZmVlNworI2RlZmluZSBYS19Qb2ludGVyX0J1dHRvbl9EZmx0ICAgICAgICAgICAweGZlZTgKKyNkZWZpbmUgWEtfUG9pbnRlcl9CdXR0b24xICAgICAgICAgICAgICAgMHhmZWU5CisjZGVmaW5lIFhLX1BvaW50ZXJfQnV0dG9uMiAgICAgICAgICAgICAgIDB4ZmVlYQorI2RlZmluZSBYS19Qb2ludGVyX0J1dHRvbjMgICAgICAgICAgICAgICAweGZlZWIKKyNkZWZpbmUgWEtfUG9pbnRlcl9CdXR0b240ICAgICAgICAgICAgICAgMHhmZWVjCisjZGVmaW5lIFhLX1BvaW50ZXJfQnV0dG9uNSAgICAgICAgICAgICAgIDB4ZmVlZAorI2RlZmluZSBYS19Qb2ludGVyX0RibENsaWNrX0RmbHQgICAgICAgICAweGZlZWUKKyNkZWZpbmUgWEtfUG9pbnRlcl9EYmxDbGljazEgICAgICAgICAgICAgMHhmZWVmCisjZGVmaW5lIFhLX1BvaW50ZXJfRGJsQ2xpY2syICAgICAgICAgICAgIDB4ZmVmMAorI2RlZmluZSBYS19Qb2ludGVyX0RibENsaWNrMyAgICAgICAgICAgICAweGZlZjEKKyNkZWZpbmUgWEtfUG9pbnRlcl9EYmxDbGljazQgICAgICAgICAgICAgMHhmZWYyCisjZGVmaW5lIFhLX1BvaW50ZXJfRGJsQ2xpY2s1ICAgICAgICAgICAgIDB4ZmVmMworI2RlZmluZSBYS19Qb2ludGVyX0RyYWdfRGZsdCAgICAgICAgICAgICAweGZlZjQKKyNkZWZpbmUgWEtfUG9pbnRlcl9EcmFnMSAgICAgICAgICAgICAgICAgMHhmZWY1CisjZGVmaW5lIFhLX1BvaW50ZXJfRHJhZzIgICAgICAgICAgICAgICAgIDB4ZmVmNgorI2RlZmluZSBYS19Qb2ludGVyX0RyYWczICAgICAgICAgICAgICAgICAweGZlZjcKKyNkZWZpbmUgWEtfUG9pbnRlcl9EcmFnNCAgICAgICAgICAgICAgICAgMHhmZWY4CisjZGVmaW5lIFhLX1BvaW50ZXJfRHJhZzUgICAgICAgICAgICAgICAgIDB4ZmVmZAorCisjZGVmaW5lIFhLX1BvaW50ZXJfRW5hYmxlS2V5cyAgICAgICAgICAgIDB4ZmVmOQorI2RlZmluZSBYS19Qb2ludGVyX0FjY2VsZXJhdGUgICAgICAgICAgICAweGZlZmEKKyNkZWZpbmUgWEtfUG9pbnRlcl9EZmx0QnRuTmV4dCAgICAgICAgICAgMHhmZWZiCisjZGVmaW5lIFhLX1BvaW50ZXJfRGZsdEJ0blByZXYgICAgICAgICAgIDB4ZmVmYworCisjZW5kaWYgLyogWEtfWEtCX0tFWVMgKi8KKworLyoKKyAqIDMyNzAgVGVybWluYWwgS2V5cworICogQnl0ZSAzID0gMHhmZAorICovCisKKyNpZmRlZiBYS18zMjcwCisjZGVmaW5lIFhLXzMyNzBfRHVwbGljYXRlICAgICAgICAgICAgICAgIDB4ZmQwMQorI2RlZmluZSBYS18zMjcwX0ZpZWxkTWFyayAgICAgICAgICAgICAgICAweGZkMDIKKyNkZWZpbmUgWEtfMzI3MF9SaWdodDIgICAgICAgICAgICAgICAgICAgMHhmZDAzCisjZGVmaW5lIFhLXzMyNzBfTGVmdDIgICAgICAgICAgICAgICAgICAgIDB4ZmQwNAorI2RlZmluZSBYS18zMjcwX0JhY2tUYWIgICAgICAgICAgICAgICAgICAweGZkMDUKKyNkZWZpbmUgWEtfMzI3MF9FcmFzZUVPRiAgICAgICAgICAgICAgICAgMHhmZDA2CisjZGVmaW5lIFhLXzMyNzBfRXJhc2VJbnB1dCAgICAgICAgICAgICAgIDB4ZmQwNworI2RlZmluZSBYS18zMjcwX1Jlc2V0ICAgICAgICAgICAgICAgICAgICAweGZkMDgKKyNkZWZpbmUgWEtfMzI3MF9RdWl0ICAgICAgICAgICAgICAgICAgICAgMHhmZDA5CisjZGVmaW5lIFhLXzMyNzBfUEExICAgICAgICAgICAgICAgICAgICAgIDB4ZmQwYQorI2RlZmluZSBYS18zMjcwX1BBMiAgICAgICAgICAgICAgICAgICAgICAweGZkMGIKKyNkZWZpbmUgWEtfMzI3MF9QQTMgICAgICAgICAgICAgICAgICAgICAgMHhmZDBjCisjZGVmaW5lIFhLXzMyNzBfVGVzdCAgICAgICAgICAgICAgICAgICAgIDB4ZmQwZAorI2RlZmluZSBYS18zMjcwX0F0dG4gICAgICAgICAgICAgICAgICAgICAweGZkMGUKKyNkZWZpbmUgWEtfMzI3MF9DdXJzb3JCbGluayAgICAgICAgICAgICAgMHhmZDBmCisjZGVmaW5lIFhLXzMyNzBfQWx0Q3Vyc29yICAgICAgICAgICAgICAgIDB4ZmQxMAorI2RlZmluZSBYS18zMjcwX0tleUNsaWNrICAgICAgICAgICAgICAgICAweGZkMTEKKyNkZWZpbmUgWEtfMzI3MF9KdW1wICAgICAgICAgICAgICAgICAgICAgMHhmZDEyCisjZGVmaW5lIFhLXzMyNzBfSWRlbnQgICAgICAgICAgICAgICAgICAgIDB4ZmQxMworI2RlZmluZSBYS18zMjcwX1J1bGUgICAgICAgICAgICAgICAgICAgICAweGZkMTQKKyNkZWZpbmUgWEtfMzI3MF9Db3B5ICAgICAgICAgICAgICAgICAgICAgMHhmZDE1CisjZGVmaW5lIFhLXzMyNzBfUGxheSAgICAgICAgICAgICAgICAgICAgIDB4ZmQxNgorI2RlZmluZSBYS18zMjcwX1NldHVwICAgICAgICAgICAgICAgICAgICAweGZkMTcKKyNkZWZpbmUgWEtfMzI3MF9SZWNvcmQgICAgICAgICAgICAgICAgICAgMHhmZDE4CisjZGVmaW5lIFhLXzMyNzBfQ2hhbmdlU2NyZWVuICAgICAgICAgICAgIDB4ZmQxOQorI2RlZmluZSBYS18zMjcwX0RlbGV0ZVdvcmQgICAgICAgICAgICAgICAweGZkMWEKKyNkZWZpbmUgWEtfMzI3MF9FeFNlbGVjdCAgICAgICAgICAgICAgICAgMHhmZDFiCisjZGVmaW5lIFhLXzMyNzBfQ3Vyc29yU2VsZWN0ICAgICAgICAgICAgIDB4ZmQxYworI2RlZmluZSBYS18zMjcwX1ByaW50U2NyZWVuICAgICAgICAgICAgICAweGZkMWQKKyNkZWZpbmUgWEtfMzI3MF9FbnRlciAgICAgICAgICAgICAgICAgICAgMHhmZDFlCisjZW5kaWYgLyogWEtfMzI3MCAqLworCisvKgorICogTGF0aW4gMQorICogKElTTy9JRUMgODg1OS0xID0gVW5pY29kZSBVKzAwMjAuLlUrMDBGRikKKyAqIEJ5dGUgMyA9IDAKKyAqLworI2lmZGVmIFhLX0xBVElOMQorI2RlZmluZSBYS19zcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIFUrMDAyMCBTUEFDRSAqLworI2RlZmluZSBYS19leGNsYW0gICAgICAgICAgICAgICAgICAgICAgICAweDAwMjEgIC8qIFUrMDAyMSBFWENMQU1BVElPTiBNQVJLICovCisjZGVmaW5lIFhLX3F1b3RlZGJsICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMiAgLyogVSswMDIyIFFVT1RBVElPTiBNQVJLICovCisjZGVmaW5lIFhLX251bWJlcnNpZ24gICAgICAgICAgICAgICAgICAgIDB4MDAyMyAgLyogVSswMDIzIE5VTUJFUiBTSUdOICovCisjZGVmaW5lIFhLX2RvbGxhciAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyNCAgLyogVSswMDI0IERPTExBUiBTSUdOICovCisjZGVmaW5lIFhLX3BlcmNlbnQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyNSAgLyogVSswMDI1IFBFUkNFTlQgU0lHTiAqLworI2RlZmluZSBYS19hbXBlcnNhbmQgICAgICAgICAgICAgICAgICAgICAweDAwMjYgIC8qIFUrMDAyNiBBTVBFUlNBTkQgKi8KKyNkZWZpbmUgWEtfYXBvc3Ryb3BoZSAgICAgICAgICAgICAgICAgICAgMHgwMDI3ICAvKiBVKzAwMjcgQVBPU1RST1BIRSAqLworI2RlZmluZSBYS19xdW90ZXJpZ2h0ICAgICAgICAgICAgICAgICAgICAweDAwMjcgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfcGFyZW5sZWZ0ICAgICAgICAgICAgICAgICAgICAgMHgwMDI4ICAvKiBVKzAwMjggTEVGVCBQQVJFTlRIRVNJUyAqLworI2RlZmluZSBYS19wYXJlbnJpZ2h0ICAgICAgICAgICAgICAgICAgICAweDAwMjkgIC8qIFUrMDAyOSBSSUdIVCBQQVJFTlRIRVNJUyAqLworI2RlZmluZSBYS19hc3RlcmlzayAgICAgICAgICAgICAgICAgICAgICAweDAwMmEgIC8qIFUrMDAyQSBBU1RFUklTSyAqLworI2RlZmluZSBYS19wbHVzICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMmIgIC8qIFUrMDAyQiBQTFVTIFNJR04gKi8KKyNkZWZpbmUgWEtfY29tbWEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDJjICAvKiBVKzAwMkMgQ09NTUEgKi8KKyNkZWZpbmUgWEtfbWludXMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDJkICAvKiBVKzAwMkQgSFlQSEVOLU1JTlVTICovCisjZGVmaW5lIFhLX3BlcmlvZCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyZSAgLyogVSswMDJFIEZVTEwgU1RPUCAqLworI2RlZmluZSBYS19zbGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMmYgIC8qIFUrMDAyRiBTT0xJRFVTICovCisjZGVmaW5lIFhLXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzMCAgLyogVSswMDMwIERJR0lUIFpFUk8gKi8KKyNkZWZpbmUgWEtfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDMxICAvKiBVKzAwMzEgRElHSVQgT05FICovCisjZGVmaW5lIFhLXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzMiAgLyogVSswMDMyIERJR0lUIFRXTyAqLworI2RlZmluZSBYS18zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMzMgIC8qIFUrMDAzMyBESUdJVCBUSFJFRSAqLworI2RlZmluZSBYS180ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMzQgIC8qIFUrMDAzNCBESUdJVCBGT1VSICovCisjZGVmaW5lIFhLXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzNSAgLyogVSswMDM1IERJR0lUIEZJVkUgKi8KKyNkZWZpbmUgWEtfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDM2ICAvKiBVKzAwMzYgRElHSVQgU0lYICovCisjZGVmaW5lIFhLXzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzNyAgLyogVSswMDM3IERJR0lUIFNFVkVOICovCisjZGVmaW5lIFhLXzggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzOCAgLyogVSswMDM4IERJR0lUIEVJR0hUICovCisjZGVmaW5lIFhLXzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzOSAgLyogVSswMDM5IERJR0lUIE5JTkUgKi8KKyNkZWZpbmUgWEtfY29sb24gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDNhICAvKiBVKzAwM0EgQ09MT04gKi8KKyNkZWZpbmUgWEtfc2VtaWNvbG9uICAgICAgICAgICAgICAgICAgICAgMHgwMDNiICAvKiBVKzAwM0IgU0VNSUNPTE9OICovCisjZGVmaW5lIFhLX2xlc3MgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzYyAgLyogVSswMDNDIExFU1MtVEhBTiBTSUdOICovCisjZGVmaW5lIFhLX2VxdWFsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzZCAgLyogVSswMDNEIEVRVUFMUyBTSUdOICovCisjZGVmaW5lIFhLX2dyZWF0ZXIgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzZSAgLyogVSswMDNFIEdSRUFURVItVEhBTiBTSUdOICovCisjZGVmaW5lIFhLX3F1ZXN0aW9uICAgICAgICAgICAgICAgICAgICAgIDB4MDAzZiAgLyogVSswMDNGIFFVRVNUSU9OIE1BUksgKi8KKyNkZWZpbmUgWEtfYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBVKzAwNDAgQ09NTUVSQ0lBTCBBVCAqLworI2RlZmluZSBYS19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDEgIC8qIFUrMDA0MSBMQVRJTiBDQVBJVEFMIExFVFRFUiBBICovCisjZGVmaW5lIFhLX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MiAgLyogVSswMDQyIExBVElOIENBUElUQUwgTEVUVEVSIEIgKi8KKyNkZWZpbmUgWEtfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQzICAvKiBVKzAwNDMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyAqLworI2RlZmluZSBYS19EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDQgIC8qIFUrMDA0NCBMQVRJTiBDQVBJVEFMIExFVFRFUiBEICovCisjZGVmaW5lIFhLX0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0NSAgLyogVSswMDQ1IExBVElOIENBUElUQUwgTEVUVEVSIEUgKi8KKyNkZWZpbmUgWEtfRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQ2ICAvKiBVKzAwNDYgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRiAqLworI2RlZmluZSBYS19HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDcgIC8qIFUrMDA0NyBMQVRJTiBDQVBJVEFMIExFVFRFUiBHICovCisjZGVmaW5lIFhLX0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0OCAgLyogVSswMDQ4IExBVElOIENBUElUQUwgTEVUVEVSIEggKi8KKyNkZWZpbmUgWEtfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQ5ICAvKiBVKzAwNDkgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSAqLworI2RlZmluZSBYS19KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNGEgIC8qIFUrMDA0QSBMQVRJTiBDQVBJVEFMIExFVFRFUiBKICovCisjZGVmaW5lIFhLX0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0YiAgLyogVSswMDRCIExBVElOIENBUElUQUwgTEVUVEVSIEsgKi8KKyNkZWZpbmUgWEtfTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDRjICAvKiBVKzAwNEMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCAqLworI2RlZmluZSBYS19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNGQgIC8qIFUrMDA0RCBMQVRJTiBDQVBJVEFMIExFVFRFUiBNICovCisjZGVmaW5lIFhLX04gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0ZSAgLyogVSswMDRFIExBVElOIENBUElUQUwgTEVUVEVSIE4gKi8KKyNkZWZpbmUgWEtfTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDRmICAvKiBVKzAwNEYgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyAqLworI2RlZmluZSBYS19QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTAgIC8qIFUrMDA1MCBMQVRJTiBDQVBJVEFMIExFVFRFUiBQICovCisjZGVmaW5lIFhLX1EgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1MSAgLyogVSswMDUxIExBVElOIENBUElUQUwgTEVUVEVSIFEgKi8KKyNkZWZpbmUgWEtfUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDUyICAvKiBVKzAwNTIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiAqLworI2RlZmluZSBYS19TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTMgIC8qIFUrMDA1MyBMQVRJTiBDQVBJVEFMIExFVFRFUiBTICovCisjZGVmaW5lIFhLX1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1NCAgLyogVSswMDU0IExBVElOIENBUElUQUwgTEVUVEVSIFQgKi8KKyNkZWZpbmUgWEtfVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDU1ICAvKiBVKzAwNTUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSAqLworI2RlZmluZSBYS19WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTYgIC8qIFUrMDA1NiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWICovCisjZGVmaW5lIFhLX1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1NyAgLyogVSswMDU3IExBVElOIENBUElUQUwgTEVUVEVSIFcgKi8KKyNkZWZpbmUgWEtfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDU4ICAvKiBVKzAwNTggTEFUSU4gQ0FQSVRBTCBMRVRURVIgWCAqLworI2RlZmluZSBYS19ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTkgIC8qIFUrMDA1OSBMQVRJTiBDQVBJVEFMIExFVFRFUiBZICovCisjZGVmaW5lIFhLX1ogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1YSAgLyogVSswMDVBIExBVElOIENBUElUQUwgTEVUVEVSIFogKi8KKyNkZWZpbmUgWEtfYnJhY2tldGxlZnQgICAgICAgICAgICAgICAgICAgMHgwMDViICAvKiBVKzAwNUIgTEVGVCBTUVVBUkUgQlJBQ0tFVCAqLworI2RlZmluZSBYS19iYWNrc2xhc2ggICAgICAgICAgICAgICAgICAgICAweDAwNWMgIC8qIFUrMDA1QyBSRVZFUlNFIFNPTElEVVMgKi8KKyNkZWZpbmUgWEtfYnJhY2tldHJpZ2h0ICAgICAgICAgICAgICAgICAgMHgwMDVkICAvKiBVKzAwNUQgUklHSFQgU1FVQVJFIEJSQUNLRVQgKi8KKyNkZWZpbmUgWEtfYXNjaWljaXJjdW0gICAgICAgICAgICAgICAgICAgMHgwMDVlICAvKiBVKzAwNUUgQ0lSQ1VNRkxFWCBBQ0NFTlQgKi8KKyNkZWZpbmUgWEtfdW5kZXJzY29yZSAgICAgICAgICAgICAgICAgICAgMHgwMDVmICAvKiBVKzAwNUYgTE9XIExJTkUgKi8KKyNkZWZpbmUgWEtfZ3JhdmUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYwICAvKiBVKzAwNjAgR1JBVkUgQUNDRU5UICovCisjZGVmaW5lIFhLX3F1b3RlbGVmdCAgICAgICAgICAgICAgICAgICAgIDB4MDA2MCAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEgIC8qIFUrMDA2MSBMQVRJTiBTTUFMTCBMRVRURVIgQSAqLworI2RlZmluZSBYS19iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjIgIC8qIFUrMDA2MiBMQVRJTiBTTUFMTCBMRVRURVIgQiAqLworI2RlZmluZSBYS19jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjMgIC8qIFUrMDA2MyBMQVRJTiBTTUFMTCBMRVRURVIgQyAqLworI2RlZmluZSBYS19kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjQgIC8qIFUrMDA2NCBMQVRJTiBTTUFMTCBMRVRURVIgRCAqLworI2RlZmluZSBYS19lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjUgIC8qIFUrMDA2NSBMQVRJTiBTTUFMTCBMRVRURVIgRSAqLworI2RlZmluZSBYS19mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjYgIC8qIFUrMDA2NiBMQVRJTiBTTUFMTCBMRVRURVIgRiAqLworI2RlZmluZSBYS19nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjcgIC8qIFUrMDA2NyBMQVRJTiBTTUFMTCBMRVRURVIgRyAqLworI2RlZmluZSBYS19oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjggIC8qIFUrMDA2OCBMQVRJTiBTTUFMTCBMRVRURVIgSCAqLworI2RlZmluZSBYS19pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjkgIC8qIFUrMDA2OSBMQVRJTiBTTUFMTCBMRVRURVIgSSAqLworI2RlZmluZSBYS19qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNmEgIC8qIFUrMDA2QSBMQVRJTiBTTUFMTCBMRVRURVIgSiAqLworI2RlZmluZSBYS19rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNmIgIC8qIFUrMDA2QiBMQVRJTiBTTUFMTCBMRVRURVIgSyAqLworI2RlZmluZSBYS19sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNmMgIC8qIFUrMDA2QyBMQVRJTiBTTUFMTCBMRVRURVIgTCAqLworI2RlZmluZSBYS19tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNmQgIC8qIFUrMDA2RCBMQVRJTiBTTUFMTCBMRVRURVIgTSAqLworI2RlZmluZSBYS19uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNmUgIC8qIFUrMDA2RSBMQVRJTiBTTUFMTCBMRVRURVIgTiAqLworI2RlZmluZSBYS19vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNmYgIC8qIFUrMDA2RiBMQVRJTiBTTUFMTCBMRVRURVIgTyAqLworI2RlZmluZSBYS19wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzAgIC8qIFUrMDA3MCBMQVRJTiBTTUFMTCBMRVRURVIgUCAqLworI2RlZmluZSBYS19xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzEgIC8qIFUrMDA3MSBMQVRJTiBTTUFMTCBMRVRURVIgUSAqLworI2RlZmluZSBYS19yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzIgIC8qIFUrMDA3MiBMQVRJTiBTTUFMTCBMRVRURVIgUiAqLworI2RlZmluZSBYS19zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzMgIC8qIFUrMDA3MyBMQVRJTiBTTUFMTCBMRVRURVIgUyAqLworI2RlZmluZSBYS190ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzQgIC8qIFUrMDA3NCBMQVRJTiBTTUFMTCBMRVRURVIgVCAqLworI2RlZmluZSBYS191ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzUgIC8qIFUrMDA3NSBMQVRJTiBTTUFMTCBMRVRURVIgVSAqLworI2RlZmluZSBYS192ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzYgIC8qIFUrMDA3NiBMQVRJTiBTTUFMTCBMRVRURVIgViAqLworI2RlZmluZSBYS193ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzcgIC8qIFUrMDA3NyBMQVRJTiBTTUFMTCBMRVRURVIgVyAqLworI2RlZmluZSBYS194ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzggIC8qIFUrMDA3OCBMQVRJTiBTTUFMTCBMRVRURVIgWCAqLworI2RlZmluZSBYS195ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzkgIC8qIFUrMDA3OSBMQVRJTiBTTUFMTCBMRVRURVIgWSAqLworI2RlZmluZSBYS196ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwN2EgIC8qIFUrMDA3QSBMQVRJTiBTTUFMTCBMRVRURVIgWiAqLworI2RlZmluZSBYS19icmFjZWxlZnQgICAgICAgICAgICAgICAgICAgICAweDAwN2IgIC8qIFUrMDA3QiBMRUZUIENVUkxZIEJSQUNLRVQgKi8KKyNkZWZpbmUgWEtfYmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDdjICAvKiBVKzAwN0MgVkVSVElDQUwgTElORSAqLworI2RlZmluZSBYS19icmFjZXJpZ2h0ICAgICAgICAgICAgICAgICAgICAweDAwN2QgIC8qIFUrMDA3RCBSSUdIVCBDVVJMWSBCUkFDS0VUICovCisjZGVmaW5lIFhLX2FzY2lpdGlsZGUgICAgICAgICAgICAgICAgICAgIDB4MDA3ZSAgLyogVSswMDdFIFRJTERFICovCisKKyNkZWZpbmUgWEtfbm9icmVha3NwYWNlICAgICAgICAgICAgICAgICAgMHgwMGEwICAvKiBVKzAwQTAgTk8tQlJFQUsgU1BBQ0UgKi8KKyNkZWZpbmUgWEtfZXhjbGFtZG93biAgICAgICAgICAgICAgICAgICAgMHgwMGExICAvKiBVKzAwQTEgSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSyAqLworI2RlZmluZSBYS19jZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwYTIgIC8qIFUrMDBBMiBDRU5UIFNJR04gKi8KKyNkZWZpbmUgWEtfc3RlcmxpbmcgICAgICAgICAgICAgICAgICAgICAgMHgwMGEzICAvKiBVKzAwQTMgUE9VTkQgU0lHTiAqLworI2RlZmluZSBYS19jdXJyZW5jeSAgICAgICAgICAgICAgICAgICAgICAweDAwYTQgIC8qIFUrMDBBNCBDVVJSRU5DWSBTSUdOICovCisjZGVmaW5lIFhLX3llbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBhNSAgLyogVSswMEE1IFlFTiBTSUdOICovCisjZGVmaW5lIFhLX2Jyb2tlbmJhciAgICAgICAgICAgICAgICAgICAgIDB4MDBhNiAgLyogVSswMEE2IEJST0tFTiBCQVIgKi8KKyNkZWZpbmUgWEtfc2VjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgMHgwMGE3ICAvKiBVKzAwQTcgU0VDVElPTiBTSUdOICovCisjZGVmaW5lIFhLX2RpYWVyZXNpcyAgICAgICAgICAgICAgICAgICAgIDB4MDBhOCAgLyogVSswMEE4IERJQUVSRVNJUyAqLworI2RlZmluZSBYS19jb3B5cmlnaHQgICAgICAgICAgICAgICAgICAgICAweDAwYTkgIC8qIFUrMDBBOSBDT1BZUklHSFQgU0lHTiAqLworI2RlZmluZSBYS19vcmRmZW1pbmluZSAgICAgICAgICAgICAgICAgICAweDAwYWEgIC8qIFUrMDBBQSBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUiAqLworI2RlZmluZSBYS19ndWlsbGVtb3RsZWZ0ICAgICAgICAgICAgICAgICAweDAwYWIgIC8qIFUrMDBBQiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSyAqLworI2RlZmluZSBYS19ub3RzaWduICAgICAgICAgICAgICAgICAgICAgICAweDAwYWMgIC8qIFUrMDBBQyBOT1QgU0lHTiAqLworI2RlZmluZSBYS19oeXBoZW4gICAgICAgICAgICAgICAgICAgICAgICAweDAwYWQgIC8qIFUrMDBBRCBTT0ZUIEhZUEhFTiAqLworI2RlZmluZSBYS19yZWdpc3RlcmVkICAgICAgICAgICAgICAgICAgICAweDAwYWUgIC8qIFUrMDBBRSBSRUdJU1RFUkVEIFNJR04gKi8KKyNkZWZpbmUgWEtfbWFjcm9uICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGFmICAvKiBVKzAwQUYgTUFDUk9OICovCisjZGVmaW5lIFhLX2RlZ3JlZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBiMCAgLyogVSswMEIwIERFR1JFRSBTSUdOICovCisjZGVmaW5lIFhLX3BsdXNtaW51cyAgICAgICAgICAgICAgICAgICAgIDB4MDBiMSAgLyogVSswMEIxIFBMVVMtTUlOVVMgU0lHTiAqLworI2RlZmluZSBYS190d29zdXBlcmlvciAgICAgICAgICAgICAgICAgICAweDAwYjIgIC8qIFUrMDBCMiBTVVBFUlNDUklQVCBUV08gKi8KKyNkZWZpbmUgWEtfdGhyZWVzdXBlcmlvciAgICAgICAgICAgICAgICAgMHgwMGIzICAvKiBVKzAwQjMgU1VQRVJTQ1JJUFQgVEhSRUUgKi8KKyNkZWZpbmUgWEtfYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGI0ICAvKiBVKzAwQjQgQUNVVEUgQUNDRU5UICovCisjZGVmaW5lIFhLX211ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBiNSAgLyogVSswMEI1IE1JQ1JPIFNJR04gKi8KKyNkZWZpbmUgWEtfcGFyYWdyYXBoICAgICAgICAgICAgICAgICAgICAgMHgwMGI2ICAvKiBVKzAwQjYgUElMQ1JPVyBTSUdOICovCisjZGVmaW5lIFhLX3BlcmlvZGNlbnRlcmVkICAgICAgICAgICAgICAgIDB4MDBiNyAgLyogVSswMEI3IE1JRERMRSBET1QgKi8KKyNkZWZpbmUgWEtfY2VkaWxsYSAgICAgICAgICAgICAgICAgICAgICAgMHgwMGI4ICAvKiBVKzAwQjggQ0VESUxMQSAqLworI2RlZmluZSBYS19vbmVzdXBlcmlvciAgICAgICAgICAgICAgICAgICAweDAwYjkgIC8qIFUrMDBCOSBTVVBFUlNDUklQVCBPTkUgKi8KKyNkZWZpbmUgWEtfbWFzY3VsaW5lICAgICAgICAgICAgICAgICAgICAgMHgwMGJhICAvKiBVKzAwQkEgTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SICovCisjZGVmaW5lIFhLX2d1aWxsZW1vdHJpZ2h0ICAgICAgICAgICAgICAgIDB4MDBiYiAgLyogVSswMEJCIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSyAqLworI2RlZmluZSBYS19vbmVxdWFydGVyICAgICAgICAgICAgICAgICAgICAweDAwYmMgIC8qIFUrMDBCQyBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIgKi8KKyNkZWZpbmUgWEtfb25laGFsZiAgICAgICAgICAgICAgICAgICAgICAgMHgwMGJkICAvKiBVKzAwQkQgVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGICovCisjZGVmaW5lIFhLX3RocmVlcXVhcnRlcnMgICAgICAgICAgICAgICAgIDB4MDBiZSAgLyogVSswMEJFIFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUyAqLworI2RlZmluZSBYS19xdWVzdGlvbmRvd24gICAgICAgICAgICAgICAgICAweDAwYmYgIC8qIFUrMDBCRiBJTlZFUlRFRCBRVUVTVElPTiBNQVJLICovCisjZGVmaW5lIFhLX0FncmF2ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBjMCAgLyogVSswMEMwIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRSAqLworI2RlZmluZSBYS19BYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwYzEgIC8qIFUrMDBDMSBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfQWNpcmN1bWZsZXggICAgICAgICAgICAgICAgICAgMHgwMGMyICAvKiBVKzAwQzIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfQXRpbGRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGMzICAvKiBVKzAwQzMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFICovCisjZGVmaW5lIFhLX0FkaWFlcmVzaXMgICAgICAgICAgICAgICAgICAgIDB4MDBjNCAgLyogVSswMEM0IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMgKi8KKyNkZWZpbmUgWEtfQXJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGM1ICAvKiBVKzAwQzUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUgKi8KKyNkZWZpbmUgWEtfQUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGM2ICAvKiBVKzAwQzYgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUgKi8KKyNkZWZpbmUgWEtfQ2NlZGlsbGEgICAgICAgICAgICAgICAgICAgICAgMHgwMGM3ICAvKiBVKzAwQzcgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEgKi8KKyNkZWZpbmUgWEtfRWdyYXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGM4ICAvKiBVKzAwQzggTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFICovCisjZGVmaW5lIFhLX0VhY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBjOSAgLyogVSswMEM5IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19FY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAwY2EgIC8qIFUrMDBDQSBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS19FZGlhZXJlc2lzICAgICAgICAgICAgICAgICAgICAweDAwY2IgIC8qIFUrMDBDQiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTICovCisjZGVmaW5lIFhLX0lncmF2ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBjYyAgLyogVSswMENDIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRSAqLworI2RlZmluZSBYS19JYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwY2QgIC8qIFUrMDBDRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfSWNpcmN1bWZsZXggICAgICAgICAgICAgICAgICAgMHgwMGNlICAvKiBVKzAwQ0UgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfSWRpYWVyZXNpcyAgICAgICAgICAgICAgICAgICAgMHgwMGNmICAvKiBVKzAwQ0YgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUyAqLworI2RlZmluZSBYS19FVEggICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZDAgIC8qIFUrMDBEMCBMQVRJTiBDQVBJVEFMIExFVFRFUiBFVEggKi8KKyNkZWZpbmUgWEtfRXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGQwICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX050aWxkZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBkMSAgLyogVSswMEQxIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERSAqLworI2RlZmluZSBYS19PZ3JhdmUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZDIgIC8qIFUrMDBEMiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUgKi8KKyNkZWZpbmUgWEtfT2FjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGQzICAvKiBVKzAwRDMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX09jaXJjdW1mbGV4ICAgICAgICAgICAgICAgICAgIDB4MDBkNCAgLyogVSswMEQ0IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYICovCisjZGVmaW5lIFhLX090aWxkZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBkNSAgLyogVSswMEQ1IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERSAqLworI2RlZmluZSBYS19PZGlhZXJlc2lzICAgICAgICAgICAgICAgICAgICAweDAwZDYgIC8qIFUrMDBENiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTICovCisjZGVmaW5lIFhLX211bHRpcGx5ICAgICAgICAgICAgICAgICAgICAgIDB4MDBkNyAgLyogVSswMEQ3IE1VTFRJUExJQ0FUSU9OIFNJR04gKi8KKyNkZWZpbmUgWEtfT3NsYXNoICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGQ4ICAvKiBVKzAwRDggTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRSAqLworI2RlZmluZSBYS19Pb2JsaXF1ZSAgICAgICAgICAgICAgICAgICAgICAweDAwZDggIC8qIFUrMDBEOCBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX1VncmF2ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBkOSAgLyogVSswMEQ5IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRSAqLworI2RlZmluZSBYS19VYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZGEgIC8qIFUrMDBEQSBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfVWNpcmN1bWZsZXggICAgICAgICAgICAgICAgICAgMHgwMGRiICAvKiBVKzAwREIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfVWRpYWVyZXNpcyAgICAgICAgICAgICAgICAgICAgMHgwMGRjICAvKiBVKzAwREMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUyAqLworI2RlZmluZSBYS19ZYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZGQgIC8qIFUrMDBERCBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfVEhPUk4gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGRlICAvKiBVKzAwREUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVEhPUk4gKi8KKyNkZWZpbmUgWEtfVGhvcm4gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGRlICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX3NzaGFycCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBkZiAgLyogVSswMERGIExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTICovCisjZGVmaW5lIFhLX2FncmF2ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBlMCAgLyogVSswMEUwIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUgKi8KKyNkZWZpbmUgWEtfYWFjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGUxICAvKiBVKzAwRTEgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19hY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAwZTIgIC8qIFUrMDBFMiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfYXRpbGRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGUzICAvKiBVKzAwRTMgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERSAqLworI2RlZmluZSBYS19hZGlhZXJlc2lzICAgICAgICAgICAgICAgICAgICAweDAwZTQgIC8qIFUrMDBFNCBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUyAqLworI2RlZmluZSBYS19hcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZTUgIC8qIFUrMDBFNSBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUgKi8KKyNkZWZpbmUgWEtfYWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGU2ICAvKiBVKzAwRTYgTEFUSU4gU01BTEwgTEVUVEVSIEFFICovCisjZGVmaW5lIFhLX2NjZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDBlNyAgLyogVSswMEU3IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQSAqLworI2RlZmluZSBYS19lZ3JhdmUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZTggIC8qIFUrMDBFOCBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFICovCisjZGVmaW5lIFhLX2VhY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBlOSAgLyogVSswMEU5IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfZWNpcmN1bWZsZXggICAgICAgICAgICAgICAgICAgMHgwMGVhICAvKiBVKzAwRUEgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYICovCisjZGVmaW5lIFhLX2VkaWFlcmVzaXMgICAgICAgICAgICAgICAgICAgIDB4MDBlYiAgLyogVSswMEVCIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTICovCisjZGVmaW5lIFhLX2lncmF2ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBlYyAgLyogVSswMEVDIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUgKi8KKyNkZWZpbmUgWEtfaWFjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGVkICAvKiBVKzAwRUQgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19pY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAwZWUgIC8qIFUrMDBFRSBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfaWRpYWVyZXNpcyAgICAgICAgICAgICAgICAgICAgMHgwMGVmICAvKiBVKzAwRUYgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMgKi8KKyNkZWZpbmUgWEtfZXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGYwICAvKiBVKzAwRjAgTEFUSU4gU01BTEwgTEVUVEVSIEVUSCAqLworI2RlZmluZSBYS19udGlsZGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZjEgIC8qIFUrMDBGMSBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFICovCisjZGVmaW5lIFhLX29ncmF2ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBmMiAgLyogVSswMEYyIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUgKi8KKyNkZWZpbmUgWEtfb2FjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGYzICAvKiBVKzAwRjMgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19vY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAwZjQgIC8qIFUrMDBGNCBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfb3RpbGRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGY1ICAvKiBVKzAwRjUgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERSAqLworI2RlZmluZSBYS19vZGlhZXJlc2lzICAgICAgICAgICAgICAgICAgICAweDAwZjYgIC8qIFUrMDBGNiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUyAqLworI2RlZmluZSBYS19kaXZpc2lvbiAgICAgICAgICAgICAgICAgICAgICAweDAwZjcgIC8qIFUrMDBGNyBESVZJU0lPTiBTSUdOICovCisjZGVmaW5lIFhLX29zbGFzaCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBmOCAgLyogVSswMEY4IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX29vYmxpcXVlICAgICAgICAgICAgICAgICAgICAgIDB4MDBmOCAgLyogVSswMEY4IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX3VncmF2ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBmOSAgLyogVSswMEY5IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUgKi8KKyNkZWZpbmUgWEtfdWFjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGZhICAvKiBVKzAwRkEgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS191Y2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAwZmIgIC8qIFUrMDBGQiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfdWRpYWVyZXNpcyAgICAgICAgICAgICAgICAgICAgMHgwMGZjICAvKiBVKzAwRkMgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgKi8KKyNkZWZpbmUgWEtfeWFjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGZkICAvKiBVKzAwRkQgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS190aG9ybiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZmUgIC8qIFUrMDBGRSBMQVRJTiBTTUFMTCBMRVRURVIgVEhPUk4gKi8KKyNkZWZpbmUgWEtfeWRpYWVyZXNpcyAgICAgICAgICAgICAgICAgICAgMHgwMGZmICAvKiBVKzAwRkYgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMgKi8KKyNlbmRpZiAvKiBYS19MQVRJTjEgKi8KKworLyoKKyAqIExhdGluIDIKKyAqIEJ5dGUgMyA9IDEKKyAqLworCisjaWZkZWYgWEtfTEFUSU4yCisjZGVmaW5lIFhLX0FvZ29uZWsgICAgICAgICAgICAgICAgICAgICAgIDB4MDFhMSAgLyogVSswMTA0IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBPR09ORUsgKi8KKyNkZWZpbmUgWEtfYnJldmUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWEyICAvKiBVKzAyRDggQlJFVkUgKi8KKyNkZWZpbmUgWEtfTHN0cm9rZSAgICAgICAgICAgICAgICAgICAgICAgMHgwMWEzICAvKiBVKzAxNDEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNUUk9LRSAqLworI2RlZmluZSBYS19MY2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxYTUgIC8qIFUrMDEzRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0FST04gKi8KKyNkZWZpbmUgWEtfU2FjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWE2ICAvKiBVKzAxNUEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX1NjYXJvbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFhOSAgLyogVSswMTYwIExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTiAqLworI2RlZmluZSBYS19TY2VkaWxsYSAgICAgICAgICAgICAgICAgICAgICAweDAxYWEgIC8qIFUrMDE1RSBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0VESUxMQSAqLworI2RlZmluZSBYS19UY2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxYWIgIC8qIFUrMDE2NCBMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ0FST04gKi8KKyNkZWZpbmUgWEtfWmFjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWFjICAvKiBVKzAxNzkgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX1pjYXJvbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFhZSAgLyogVSswMTdEIExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTiAqLworI2RlZmluZSBYS19aYWJvdmVkb3QgICAgICAgICAgICAgICAgICAgICAweDAxYWYgIC8qIFUrMDE3QiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX2FvZ29uZWsgICAgICAgICAgICAgICAgICAgICAgIDB4MDFiMSAgLyogVSswMTA1IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggT0dPTkVLICovCisjZGVmaW5lIFhLX29nb25layAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFiMiAgLyogVSswMkRCIE9HT05FSyAqLworI2RlZmluZSBYS19sc3Ryb2tlICAgICAgICAgICAgICAgICAgICAgICAweDAxYjMgIC8qIFUrMDE0MiBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIFNUUk9LRSAqLworI2RlZmluZSBYS19sY2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxYjUgIC8qIFUrMDEzRSBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX3NhY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFiNiAgLyogVSswMTVCIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfY2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWI3ICAvKiBVKzAyQzcgQ0FST04gKi8KKyNkZWZpbmUgWEtfc2Nhcm9uICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWI5ICAvKiBVKzAxNjEgTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDQVJPTiAqLworI2RlZmluZSBYS19zY2VkaWxsYSAgICAgICAgICAgICAgICAgICAgICAweDAxYmEgIC8qIFUrMDE1RiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENFRElMTEEgKi8KKyNkZWZpbmUgWEtfdGNhcm9uICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWJiICAvKiBVKzAxNjUgTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBDQVJPTiAqLworI2RlZmluZSBYS196YWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAxYmMgIC8qIFUrMDE3QSBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX2RvdWJsZWFjdXRlICAgICAgICAgICAgICAgICAgIDB4MDFiZCAgLyogVSswMkREIERPVUJMRSBBQ1VURSBBQ0NFTlQgKi8KKyNkZWZpbmUgWEtfemNhcm9uICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWJlICAvKiBVKzAxN0UgTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTiAqLworI2RlZmluZSBYS196YWJvdmVkb3QgICAgICAgICAgICAgICAgICAgICAweDAxYmYgIC8qIFUrMDE3QyBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19SYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAxYzAgIC8qIFUrMDE1NCBMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfQWJyZXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWMzICAvKiBVKzAxMDIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFICovCisjZGVmaW5lIFhLX0xhY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFjNSAgLyogVSswMTM5IExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19DYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAxYzYgIC8qIFUrMDEwNiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfQ2Nhcm9uICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWM4ICAvKiBVKzAxMEMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX0VvZ29uZWsgICAgICAgICAgICAgICAgICAgICAgIDB4MDFjYSAgLyogVSswMTE4IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBPR09ORUsgKi8KKyNkZWZpbmUgWEtfRWNhcm9uICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWNjICAvKiBVKzAxMUEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX0RjYXJvbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFjZiAgLyogVSswMTBFIExBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBDQVJPTiAqLworI2RlZmluZSBYS19Ec3Ryb2tlICAgICAgICAgICAgICAgICAgICAgICAweDAxZDAgIC8qIFUrMDExMCBMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX05hY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFkMSAgLyogVSswMTQzIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19OY2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxZDIgIC8qIFUrMDE0NyBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0FST04gKi8KKyNkZWZpbmUgWEtfT2RvdWJsZWFjdXRlICAgICAgICAgICAgICAgICAgMHgwMWQ1ICAvKiBVKzAxNTAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERPVUJMRSBBQ1VURSAqLworI2RlZmluZSBYS19SY2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxZDggIC8qIFUrMDE1OCBMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQ0FST04gKi8KKyNkZWZpbmUgWEtfVXJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWQ5ICAvKiBVKzAxNkUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIFJJTkcgQUJPVkUgKi8KKyNkZWZpbmUgWEtfVWRvdWJsZWFjdXRlICAgICAgICAgICAgICAgICAgMHgwMWRiICAvKiBVKzAxNzAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERPVUJMRSBBQ1VURSAqLworI2RlZmluZSBYS19UY2VkaWxsYSAgICAgICAgICAgICAgICAgICAgICAweDAxZGUgIC8qIFUrMDE2MiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ0VESUxMQSAqLworI2RlZmluZSBYS19yYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAxZTAgIC8qIFUrMDE1NSBMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX2FicmV2ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFlMyAgLyogVSswMTAzIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQlJFVkUgKi8KKyNkZWZpbmUgWEtfbGFjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWU1ICAvKiBVKzAxM0EgTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19jYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAxZTYgIC8qIFUrMDEwNyBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX2NjYXJvbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFlOCAgLyogVSswMTBEIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0FST04gKi8KKyNkZWZpbmUgWEtfZW9nb25layAgICAgICAgICAgICAgICAgICAgICAgMHgwMWVhICAvKiBVKzAxMTkgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBPR09ORUsgKi8KKyNkZWZpbmUgWEtfZWNhcm9uICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWVjICAvKiBVKzAxMUIgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDQVJPTiAqLworI2RlZmluZSBYS19kY2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxZWYgIC8qIFUrMDEwRiBMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX2RzdHJva2UgICAgICAgICAgICAgICAgICAgICAgIDB4MDFmMCAgLyogVSswMTExIExBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX25hY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFmMSAgLyogVSswMTQ0IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfbmNhcm9uICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWYyICAvKiBVKzAxNDggTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBDQVJPTiAqLworI2RlZmluZSBYS19vZG91YmxlYWN1dGUgICAgICAgICAgICAgICAgICAweDAxZjUgIC8qIFUrMDE1MSBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERPVUJMRSBBQ1VURSAqLworI2RlZmluZSBYS19yY2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxZjggIC8qIFUrMDE1OSBMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX3VyaW5nICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFmOSAgLyogVSswMTZGIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggUklORyBBQk9WRSAqLworI2RlZmluZSBYS191ZG91YmxlYWN1dGUgICAgICAgICAgICAgICAgICAweDAxZmIgIC8qIFUrMDE3MSBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERPVUJMRSBBQ1VURSAqLworI2RlZmluZSBYS190Y2VkaWxsYSAgICAgICAgICAgICAgICAgICAgICAweDAxZmUgIC8qIFUrMDE2MyBMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENFRElMTEEgKi8KKyNkZWZpbmUgWEtfYWJvdmVkb3QgICAgICAgICAgICAgICAgICAgICAgMHgwMWZmICAvKiBVKzAyRDkgRE9UIEFCT1ZFICovCisjZW5kaWYgLyogWEtfTEFUSU4yICovCisKKy8qCisgKiBMYXRpbiAzCisgKiBCeXRlIDMgPSAyCisgKi8KKworI2lmZGVmIFhLX0xBVElOMworI2RlZmluZSBYS19Ic3Ryb2tlICAgICAgICAgICAgICAgICAgICAgICAweDAyYTEgIC8qIFUrMDEyNiBMQVRJTiBDQVBJVEFMIExFVFRFUiBIIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX0hjaXJjdW1mbGV4ICAgICAgICAgICAgICAgICAgIDB4MDJhNiAgLyogVSswMTI0IExBVElOIENBUElUQUwgTEVUVEVSIEggV0lUSCBDSVJDVU1GTEVYICovCisjZGVmaW5lIFhLX0lhYm92ZWRvdCAgICAgICAgICAgICAgICAgICAgIDB4MDJhOSAgLyogVSswMTMwIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfR2JyZXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMmFiICAvKiBVKzAxMUUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIEJSRVZFICovCisjZGVmaW5lIFhLX0pjaXJjdW1mbGV4ICAgICAgICAgICAgICAgICAgIDB4MDJhYyAgLyogVSswMTM0IExBVElOIENBUElUQUwgTEVUVEVSIEogV0lUSCBDSVJDVU1GTEVYICovCisjZGVmaW5lIFhLX2hzdHJva2UgICAgICAgICAgICAgICAgICAgICAgIDB4MDJiMSAgLyogVSswMTI3IExBVElOIFNNQUxMIExFVFRFUiBIIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX2hjaXJjdW1mbGV4ICAgICAgICAgICAgICAgICAgIDB4MDJiNiAgLyogVSswMTI1IExBVElOIFNNQUxMIExFVFRFUiBIIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS19pZG90bGVzcyAgICAgICAgICAgICAgICAgICAgICAweDAyYjkgIC8qIFUrMDEzMSBMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJICovCisjZGVmaW5lIFhLX2dicmV2ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDJiYiAgLyogVSswMTFGIExBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggQlJFVkUgKi8KKyNkZWZpbmUgWEtfamNpcmN1bWZsZXggICAgICAgICAgICAgICAgICAgMHgwMmJjICAvKiBVKzAxMzUgTEFUSU4gU01BTEwgTEVUVEVSIEogV0lUSCBDSVJDVU1GTEVYICovCisjZGVmaW5lIFhLX0NhYm92ZWRvdCAgICAgICAgICAgICAgICAgICAgIDB4MDJjNSAgLyogVSswMTBBIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfQ2NpcmN1bWZsZXggICAgICAgICAgICAgICAgICAgMHgwMmM2ICAvKiBVKzAxMDggTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfR2Fib3ZlZG90ICAgICAgICAgICAgICAgICAgICAgMHgwMmQ1ICAvKiBVKzAxMjAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19HY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAyZDggIC8qIFUrMDExQyBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS19VYnJldmUgICAgICAgICAgICAgICAgICAgICAgICAweDAyZGQgIC8qIFUrMDE2QyBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQlJFVkUgKi8KKyNkZWZpbmUgWEtfU2NpcmN1bWZsZXggICAgICAgICAgICAgICAgICAgMHgwMmRlICAvKiBVKzAxNUMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfY2Fib3ZlZG90ICAgICAgICAgICAgICAgICAgICAgMHgwMmU1ICAvKiBVKzAxMEIgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfY2NpcmN1bWZsZXggICAgICAgICAgICAgICAgICAgMHgwMmU2ICAvKiBVKzAxMDkgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDSVJDVU1GTEVYICovCisjZGVmaW5lIFhLX2dhYm92ZWRvdCAgICAgICAgICAgICAgICAgICAgIDB4MDJmNSAgLyogVSswMTIxIExBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX2djaXJjdW1mbGV4ICAgICAgICAgICAgICAgICAgIDB4MDJmOCAgLyogVSswMTFEIExBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS191YnJldmUgICAgICAgICAgICAgICAgICAgICAgICAweDAyZmQgIC8qIFUrMDE2RCBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEJSRVZFICovCisjZGVmaW5lIFhLX3NjaXJjdW1mbGV4ICAgICAgICAgICAgICAgICAgIDB4MDJmZSAgLyogVSswMTVEIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0lSQ1VNRkxFWCAqLworI2VuZGlmIC8qIFhLX0xBVElOMyAqLworCisKKy8qCisgKiBMYXRpbiA0CisgKiBCeXRlIDMgPSAzCisgKi8KKworI2lmZGVmIFhLX0xBVElONAorI2RlZmluZSBYS19rcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzYTIgIC8qIFUrMDEzOCBMQVRJTiBTTUFMTCBMRVRURVIgS1JBICovCisjZGVmaW5lIFhLX2thcHBhICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDNhMiAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19SY2VkaWxsYSAgICAgICAgICAgICAgICAgICAgICAweDAzYTMgIC8qIFUrMDE1NiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQ0VESUxMQSAqLworI2RlZmluZSBYS19JdGlsZGUgICAgICAgICAgICAgICAgICAgICAgICAweDAzYTUgIC8qIFUrMDEyOCBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggVElMREUgKi8KKyNkZWZpbmUgWEtfTGNlZGlsbGEgICAgICAgICAgICAgICAgICAgICAgMHgwM2E2ICAvKiBVKzAxM0IgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIENFRElMTEEgKi8KKyNkZWZpbmUgWEtfRW1hY3JvbiAgICAgICAgICAgICAgICAgICAgICAgMHgwM2FhICAvKiBVKzAxMTIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE1BQ1JPTiAqLworI2RlZmluZSBYS19HY2VkaWxsYSAgICAgICAgICAgICAgICAgICAgICAweDAzYWIgIC8qIFUrMDEyMiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQ0VESUxMQSAqLworI2RlZmluZSBYS19Uc2xhc2ggICAgICAgICAgICAgICAgICAgICAgICAweDAzYWMgIC8qIFUrMDE2NiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX3JjZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDNiMyAgLyogVSswMTU3IExBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQ0VESUxMQSAqLworI2RlZmluZSBYS19pdGlsZGUgICAgICAgICAgICAgICAgICAgICAgICAweDAzYjUgIC8qIFUrMDEyOSBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIFRJTERFICovCisjZGVmaW5lIFhLX2xjZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDNiNiAgLyogVSswMTNDIExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0VESUxMQSAqLworI2RlZmluZSBYS19lbWFjcm9uICAgICAgICAgICAgICAgICAgICAgICAweDAzYmEgIC8qIFUrMDExMyBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE1BQ1JPTiAqLworI2RlZmluZSBYS19nY2VkaWxsYSAgICAgICAgICAgICAgICAgICAgICAweDAzYmIgIC8qIFUrMDEyMyBMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIENFRElMTEEgKi8KKyNkZWZpbmUgWEtfdHNsYXNoICAgICAgICAgICAgICAgICAgICAgICAgMHgwM2JjICAvKiBVKzAxNjcgTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfRU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwM2JkICAvKiBVKzAxNEEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRU5HICovCisjZGVmaW5lIFhLX2VuZyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDNiZiAgLyogVSswMTRCIExBVElOIFNNQUxMIExFVFRFUiBFTkcgKi8KKyNkZWZpbmUgWEtfQW1hY3JvbiAgICAgICAgICAgICAgICAgICAgICAgMHgwM2MwICAvKiBVKzAxMDAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE1BQ1JPTiAqLworI2RlZmluZSBYS19Jb2dvbmVrICAgICAgICAgICAgICAgICAgICAgICAweDAzYzcgIC8qIFUrMDEyRSBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggT0dPTkVLICovCisjZGVmaW5lIFhLX0VhYm92ZWRvdCAgICAgICAgICAgICAgICAgICAgIDB4MDNjYyAgLyogVSswMTE2IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfSW1hY3JvbiAgICAgICAgICAgICAgICAgICAgICAgMHgwM2NmICAvKiBVKzAxMkEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE1BQ1JPTiAqLworI2RlZmluZSBYS19OY2VkaWxsYSAgICAgICAgICAgICAgICAgICAgICAweDAzZDEgIC8qIFUrMDE0NSBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0VESUxMQSAqLworI2RlZmluZSBYS19PbWFjcm9uICAgICAgICAgICAgICAgICAgICAgICAweDAzZDIgIC8qIFUrMDE0QyBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggTUFDUk9OICovCisjZGVmaW5lIFhLX0tjZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDNkMyAgLyogVSswMTM2IExBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBDRURJTExBICovCisjZGVmaW5lIFhLX1VvZ29uZWsgICAgICAgICAgICAgICAgICAgICAgIDB4MDNkOSAgLyogVSswMTcyIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBPR09ORUsgKi8KKyNkZWZpbmUgWEtfVXRpbGRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwM2RkICAvKiBVKzAxNjggTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIFRJTERFICovCisjZGVmaW5lIFhLX1VtYWNyb24gICAgICAgICAgICAgICAgICAgICAgIDB4MDNkZSAgLyogVSswMTZBIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBNQUNST04gKi8KKyNkZWZpbmUgWEtfYW1hY3JvbiAgICAgICAgICAgICAgICAgICAgICAgMHgwM2UwICAvKiBVKzAxMDEgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBNQUNST04gKi8KKyNkZWZpbmUgWEtfaW9nb25layAgICAgICAgICAgICAgICAgICAgICAgMHgwM2U3ICAvKiBVKzAxMkYgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBPR09ORUsgKi8KKyNkZWZpbmUgWEtfZWFib3ZlZG90ICAgICAgICAgICAgICAgICAgICAgMHgwM2VjICAvKiBVKzAxMTcgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfaW1hY3JvbiAgICAgICAgICAgICAgICAgICAgICAgMHgwM2VmICAvKiBVKzAxMkIgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBNQUNST04gKi8KKyNkZWZpbmUgWEtfbmNlZGlsbGEgICAgICAgICAgICAgICAgICAgICAgMHgwM2YxICAvKiBVKzAxNDYgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBDRURJTExBICovCisjZGVmaW5lIFhLX29tYWNyb24gICAgICAgICAgICAgICAgICAgICAgIDB4MDNmMiAgLyogVSswMTREIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggTUFDUk9OICovCisjZGVmaW5lIFhLX2tjZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDNmMyAgLyogVSswMTM3IExBVElOIFNNQUxMIExFVFRFUiBLIFdJVEggQ0VESUxMQSAqLworI2RlZmluZSBYS191b2dvbmVrICAgICAgICAgICAgICAgICAgICAgICAweDAzZjkgIC8qIFUrMDE3MyBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIE9HT05FSyAqLworI2RlZmluZSBYS191dGlsZGUgICAgICAgICAgICAgICAgICAgICAgICAweDAzZmQgIC8qIFUrMDE2OSBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIFRJTERFICovCisjZGVmaW5lIFhLX3VtYWNyb24gICAgICAgICAgICAgICAgICAgICAgIDB4MDNmZSAgLyogVSswMTZCIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggTUFDUk9OICovCisjZW5kaWYgLyogWEtfTEFUSU40ICovCisKKy8qCisgKiBMYXRpbiA4CisgKi8KKyNpZmRlZiBYS19MQVRJTjgKKyNkZWZpbmUgWEtfV2NpcmN1bWZsZXggICAgICAgICAgICAgICAgMHgxMDAwMTc0ICAvKiBVKzAxNzQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfd2NpcmN1bWZsZXggICAgICAgICAgICAgICAgMHgxMDAwMTc1ICAvKiBVKzAxNzUgTEFUSU4gU01BTEwgTEVUVEVSIFcgV0lUSCBDSVJDVU1GTEVYICovCisjZGVmaW5lIFhLX1ljaXJjdW1mbGV4ICAgICAgICAgICAgICAgIDB4MTAwMDE3NiAgLyogVSswMTc2IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBDSVJDVU1GTEVYICovCisjZGVmaW5lIFhLX3ljaXJjdW1mbGV4ICAgICAgICAgICAgICAgIDB4MTAwMDE3NyAgLyogVSswMTc3IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS19CYWJvdmVkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlMDIgIC8qIFUrMUUwMiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX2JhYm92ZWRvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWUwMyAgLyogVSsxRTAzIExBVElOIFNNQUxMIExFVFRFUiBCIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX0RhYm92ZWRvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWUwYSAgLyogVSsxRTBBIExBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfZGFib3ZlZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZTBiICAvKiBVKzFFMEIgTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfRmFib3ZlZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZTFlICAvKiBVKzFFMUUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRiBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19mYWJvdmVkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlMWYgIC8qIFUrMUUxRiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19NYWJvdmVkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlNDAgIC8qIFUrMUU0MCBMQVRJTiBDQVBJVEFMIExFVFRFUiBNIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX21hYm92ZWRvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWU0MSAgLyogVSsxRTQxIExBVElOIFNNQUxMIExFVFRFUiBNIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX1BhYm92ZWRvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWU1NiAgLyogVSsxRTU2IExBVElOIENBUElUQUwgTEVUVEVSIFAgV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfcGFib3ZlZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZTU3ICAvKiBVKzFFNTcgTEFUSU4gU01BTEwgTEVUVEVSIFAgV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfU2Fib3ZlZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZTYwICAvKiBVKzFFNjAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19zYWJvdmVkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlNjEgIC8qIFUrMUU2MSBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19UYWJvdmVkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlNmEgIC8qIFUrMUU2QSBMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX3RhYm92ZWRvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWU2YiAgLyogVSsxRTZCIExBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX1dncmF2ZSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMWU4MCAgLyogVSsxRTgwIExBVElOIENBUElUQUwgTEVUVEVSIFcgV0lUSCBHUkFWRSAqLworI2RlZmluZSBYS193Z3JhdmUgICAgICAgICAgICAgICAgICAgICAweDEwMDFlODEgIC8qIFUrMUU4MSBMQVRJTiBTTUFMTCBMRVRURVIgVyBXSVRIIEdSQVZFICovCisjZGVmaW5lIFhLX1dhY3V0ZSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMWU4MiAgLyogVSsxRTgyIExBVElOIENBUElUQUwgTEVUVEVSIFcgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS193YWN1dGUgICAgICAgICAgICAgICAgICAgICAweDEwMDFlODMgIC8qIFUrMUU4MyBMQVRJTiBTTUFMTCBMRVRURVIgVyBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX1dkaWFlcmVzaXMgICAgICAgICAgICAgICAgIDB4MTAwMWU4NCAgLyogVSsxRTg0IExBVElOIENBUElUQUwgTEVUVEVSIFcgV0lUSCBESUFFUkVTSVMgKi8KKyNkZWZpbmUgWEtfd2RpYWVyZXNpcyAgICAgICAgICAgICAgICAgMHgxMDAxZTg1ICAvKiBVKzFFODUgTEFUSU4gU01BTEwgTEVUVEVSIFcgV0lUSCBESUFFUkVTSVMgKi8KKyNkZWZpbmUgWEtfWWdyYXZlICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZWYyICAvKiBVKzFFRjIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEdSQVZFICovCisjZGVmaW5lIFhLX3lncmF2ZSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMWVmMyAgLyogVSsxRUYzIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggR1JBVkUgKi8KKyNlbmRpZiAvKiBYS19MQVRJTjggKi8KKworLyoKKyAqIExhdGluIDkKKyAqIEJ5dGUgMyA9IDB4MTMKKyAqLworCisjaWZkZWYgWEtfTEFUSU45CisjZGVmaW5lIFhLX09FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTNiYyAgLyogVSswMTUyIExBVElOIENBUElUQUwgTElHQVRVUkUgT0UgKi8KKyNkZWZpbmUgWEtfb2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxM2JkICAvKiBVKzAxNTMgTEFUSU4gU01BTEwgTElHQVRVUkUgT0UgKi8KKyNkZWZpbmUgWEtfWWRpYWVyZXNpcyAgICAgICAgICAgICAgICAgICAgMHgxM2JlICAvKiBVKzAxNzggTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUyAqLworI2VuZGlmIC8qIFhLX0xBVElOOSAqLworCisvKgorICogS2F0YWthbmEKKyAqIEJ5dGUgMyA9IDQKKyAqLworCisjaWZkZWYgWEtfS0FUQUtBTkEKKyNkZWZpbmUgWEtfb3ZlcmxpbmUgICAgICAgICAgICAgICAgICAgICAgMHgwNDdlICAvKiBVKzIwM0UgT1ZFUkxJTkUgKi8KKyNkZWZpbmUgWEtfa2FuYV9mdWxsc3RvcCAgICAgICAgICAgICAgICAgMHgwNGExICAvKiBVKzMwMDIgSURFT0dSQVBISUMgRlVMTCBTVE9QICovCisjZGVmaW5lIFhLX2thbmFfb3BlbmluZ2JyYWNrZXQgICAgICAgICAgIDB4MDRhMiAgLyogVSszMDBDIExFRlQgQ09STkVSIEJSQUNLRVQgKi8KKyNkZWZpbmUgWEtfa2FuYV9jbG9zaW5nYnJhY2tldCAgICAgICAgICAgMHgwNGEzICAvKiBVKzMwMEQgUklHSFQgQ09STkVSIEJSQUNLRVQgKi8KKyNkZWZpbmUgWEtfa2FuYV9jb21tYSAgICAgICAgICAgICAgICAgICAgMHgwNGE0ICAvKiBVKzMwMDEgSURFT0dSQVBISUMgQ09NTUEgKi8KKyNkZWZpbmUgWEtfa2FuYV9jb25qdW5jdGl2ZSAgICAgICAgICAgICAgMHgwNGE1ICAvKiBVKzMwRkIgS0FUQUtBTkEgTUlERExFIERPVCAqLworI2RlZmluZSBYS19rYW5hX21pZGRsZWRvdCAgICAgICAgICAgICAgICAweDA0YTUgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfa2FuYV9XTyAgICAgICAgICAgICAgICAgICAgICAgMHgwNGE2ICAvKiBVKzMwRjIgS0FUQUtBTkEgTEVUVEVSIFdPICovCisjZGVmaW5lIFhLX2thbmFfYSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDRhNyAgLyogVSszMEExIEtBVEFLQU5BIExFVFRFUiBTTUFMTCBBICovCisjZGVmaW5lIFhLX2thbmFfaSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDRhOCAgLyogVSszMEEzIEtBVEFLQU5BIExFVFRFUiBTTUFMTCBJICovCisjZGVmaW5lIFhLX2thbmFfdSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDRhOSAgLyogVSszMEE1IEtBVEFLQU5BIExFVFRFUiBTTUFMTCBVICovCisjZGVmaW5lIFhLX2thbmFfZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDRhYSAgLyogVSszMEE3IEtBVEFLQU5BIExFVFRFUiBTTUFMTCBFICovCisjZGVmaW5lIFhLX2thbmFfbyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDRhYiAgLyogVSszMEE5IEtBVEFLQU5BIExFVFRFUiBTTUFMTCBPICovCisjZGVmaW5lIFhLX2thbmFfeWEgICAgICAgICAgICAgICAgICAgICAgIDB4MDRhYyAgLyogVSszMEUzIEtBVEFLQU5BIExFVFRFUiBTTUFMTCBZQSAqLworI2RlZmluZSBYS19rYW5hX3l1ICAgICAgICAgICAgICAgICAgICAgICAweDA0YWQgIC8qIFUrMzBFNSBLQVRBS0FOQSBMRVRURVIgU01BTEwgWVUgKi8KKyNkZWZpbmUgWEtfa2FuYV95byAgICAgICAgICAgICAgICAgICAgICAgMHgwNGFlICAvKiBVKzMwRTcgS0FUQUtBTkEgTEVUVEVSIFNNQUxMIFlPICovCisjZGVmaW5lIFhLX2thbmFfdHN1ICAgICAgICAgICAgICAgICAgICAgIDB4MDRhZiAgLyogVSszMEMzIEtBVEFLQU5BIExFVFRFUiBTTUFMTCBUVSAqLworI2RlZmluZSBYS19rYW5hX3R1ICAgICAgICAgICAgICAgICAgICAgICAweDA0YWYgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfcHJvbG9uZ2Vkc291bmQgICAgICAgICAgICAgICAgMHgwNGIwICAvKiBVKzMwRkMgS0FUQUtBTkEtSElSQUdBTkEgUFJPTE9OR0VEIFNPVU5EIE1BUksgKi8KKyNkZWZpbmUgWEtfa2FuYV9BICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGIxICAvKiBVKzMwQTIgS0FUQUtBTkEgTEVUVEVSIEEgKi8KKyNkZWZpbmUgWEtfa2FuYV9JICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGIyICAvKiBVKzMwQTQgS0FUQUtBTkEgTEVUVEVSIEkgKi8KKyNkZWZpbmUgWEtfa2FuYV9VICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGIzICAvKiBVKzMwQTYgS0FUQUtBTkEgTEVUVEVSIFUgKi8KKyNkZWZpbmUgWEtfa2FuYV9FICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGI0ICAvKiBVKzMwQTggS0FUQUtBTkEgTEVUVEVSIEUgKi8KKyNkZWZpbmUgWEtfa2FuYV9PICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGI1ICAvKiBVKzMwQUEgS0FUQUtBTkEgTEVUVEVSIE8gKi8KKyNkZWZpbmUgWEtfa2FuYV9LQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGI2ICAvKiBVKzMwQUIgS0FUQUtBTkEgTEVUVEVSIEtBICovCisjZGVmaW5lIFhLX2thbmFfS0kgICAgICAgICAgICAgICAgICAgICAgIDB4MDRiNyAgLyogVSszMEFEIEtBVEFLQU5BIExFVFRFUiBLSSAqLworI2RlZmluZSBYS19rYW5hX0tVICAgICAgICAgICAgICAgICAgICAgICAweDA0YjggIC8qIFUrMzBBRiBLQVRBS0FOQSBMRVRURVIgS1UgKi8KKyNkZWZpbmUgWEtfa2FuYV9LRSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGI5ICAvKiBVKzMwQjEgS0FUQUtBTkEgTEVUVEVSIEtFICovCisjZGVmaW5lIFhLX2thbmFfS08gICAgICAgICAgICAgICAgICAgICAgIDB4MDRiYSAgLyogVSszMEIzIEtBVEFLQU5BIExFVFRFUiBLTyAqLworI2RlZmluZSBYS19rYW5hX1NBICAgICAgICAgICAgICAgICAgICAgICAweDA0YmIgIC8qIFUrMzBCNSBLQVRBS0FOQSBMRVRURVIgU0EgKi8KKyNkZWZpbmUgWEtfa2FuYV9TSEkgICAgICAgICAgICAgICAgICAgICAgMHgwNGJjICAvKiBVKzMwQjcgS0FUQUtBTkEgTEVUVEVSIFNJICovCisjZGVmaW5lIFhLX2thbmFfU1UgICAgICAgICAgICAgICAgICAgICAgIDB4MDRiZCAgLyogVSszMEI5IEtBVEFLQU5BIExFVFRFUiBTVSAqLworI2RlZmluZSBYS19rYW5hX1NFICAgICAgICAgICAgICAgICAgICAgICAweDA0YmUgIC8qIFUrMzBCQiBLQVRBS0FOQSBMRVRURVIgU0UgKi8KKyNkZWZpbmUgWEtfa2FuYV9TTyAgICAgICAgICAgICAgICAgICAgICAgMHgwNGJmICAvKiBVKzMwQkQgS0FUQUtBTkEgTEVUVEVSIFNPICovCisjZGVmaW5lIFhLX2thbmFfVEEgICAgICAgICAgICAgICAgICAgICAgIDB4MDRjMCAgLyogVSszMEJGIEtBVEFLQU5BIExFVFRFUiBUQSAqLworI2RlZmluZSBYS19rYW5hX0NISSAgICAgICAgICAgICAgICAgICAgICAweDA0YzEgIC8qIFUrMzBDMSBLQVRBS0FOQSBMRVRURVIgVEkgKi8KKyNkZWZpbmUgWEtfa2FuYV9USSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGMxICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2thbmFfVFNVICAgICAgICAgICAgICAgICAgICAgIDB4MDRjMiAgLyogVSszMEM0IEtBVEFLQU5BIExFVFRFUiBUVSAqLworI2RlZmluZSBYS19rYW5hX1RVICAgICAgICAgICAgICAgICAgICAgICAweDA0YzIgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfa2FuYV9URSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGMzICAvKiBVKzMwQzYgS0FUQUtBTkEgTEVUVEVSIFRFICovCisjZGVmaW5lIFhLX2thbmFfVE8gICAgICAgICAgICAgICAgICAgICAgIDB4MDRjNCAgLyogVSszMEM4IEtBVEFLQU5BIExFVFRFUiBUTyAqLworI2RlZmluZSBYS19rYW5hX05BICAgICAgICAgICAgICAgICAgICAgICAweDA0YzUgIC8qIFUrMzBDQSBLQVRBS0FOQSBMRVRURVIgTkEgKi8KKyNkZWZpbmUgWEtfa2FuYV9OSSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGM2ICAvKiBVKzMwQ0IgS0FUQUtBTkEgTEVUVEVSIE5JICovCisjZGVmaW5lIFhLX2thbmFfTlUgICAgICAgICAgICAgICAgICAgICAgIDB4MDRjNyAgLyogVSszMENDIEtBVEFLQU5BIExFVFRFUiBOVSAqLworI2RlZmluZSBYS19rYW5hX05FICAgICAgICAgICAgICAgICAgICAgICAweDA0YzggIC8qIFUrMzBDRCBLQVRBS0FOQSBMRVRURVIgTkUgKi8KKyNkZWZpbmUgWEtfa2FuYV9OTyAgICAgICAgICAgICAgICAgICAgICAgMHgwNGM5ICAvKiBVKzMwQ0UgS0FUQUtBTkEgTEVUVEVSIE5PICovCisjZGVmaW5lIFhLX2thbmFfSEEgICAgICAgICAgICAgICAgICAgICAgIDB4MDRjYSAgLyogVSszMENGIEtBVEFLQU5BIExFVFRFUiBIQSAqLworI2RlZmluZSBYS19rYW5hX0hJICAgICAgICAgICAgICAgICAgICAgICAweDA0Y2IgIC8qIFUrMzBEMiBLQVRBS0FOQSBMRVRURVIgSEkgKi8KKyNkZWZpbmUgWEtfa2FuYV9GVSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGNjICAvKiBVKzMwRDUgS0FUQUtBTkEgTEVUVEVSIEhVICovCisjZGVmaW5lIFhLX2thbmFfSFUgICAgICAgICAgICAgICAgICAgICAgIDB4MDRjYyAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19rYW5hX0hFICAgICAgICAgICAgICAgICAgICAgICAweDA0Y2QgIC8qIFUrMzBEOCBLQVRBS0FOQSBMRVRURVIgSEUgKi8KKyNkZWZpbmUgWEtfa2FuYV9ITyAgICAgICAgICAgICAgICAgICAgICAgMHgwNGNlICAvKiBVKzMwREIgS0FUQUtBTkEgTEVUVEVSIEhPICovCisjZGVmaW5lIFhLX2thbmFfTUEgICAgICAgICAgICAgICAgICAgICAgIDB4MDRjZiAgLyogVSszMERFIEtBVEFLQU5BIExFVFRFUiBNQSAqLworI2RlZmluZSBYS19rYW5hX01JICAgICAgICAgICAgICAgICAgICAgICAweDA0ZDAgIC8qIFUrMzBERiBLQVRBS0FOQSBMRVRURVIgTUkgKi8KKyNkZWZpbmUgWEtfa2FuYV9NVSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGQxICAvKiBVKzMwRTAgS0FUQUtBTkEgTEVUVEVSIE1VICovCisjZGVmaW5lIFhLX2thbmFfTUUgICAgICAgICAgICAgICAgICAgICAgIDB4MDRkMiAgLyogVSszMEUxIEtBVEFLQU5BIExFVFRFUiBNRSAqLworI2RlZmluZSBYS19rYW5hX01PICAgICAgICAgICAgICAgICAgICAgICAweDA0ZDMgIC8qIFUrMzBFMiBLQVRBS0FOQSBMRVRURVIgTU8gKi8KKyNkZWZpbmUgWEtfa2FuYV9ZQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGQ0ICAvKiBVKzMwRTQgS0FUQUtBTkEgTEVUVEVSIFlBICovCisjZGVmaW5lIFhLX2thbmFfWVUgICAgICAgICAgICAgICAgICAgICAgIDB4MDRkNSAgLyogVSszMEU2IEtBVEFLQU5BIExFVFRFUiBZVSAqLworI2RlZmluZSBYS19rYW5hX1lPICAgICAgICAgICAgICAgICAgICAgICAweDA0ZDYgIC8qIFUrMzBFOCBLQVRBS0FOQSBMRVRURVIgWU8gKi8KKyNkZWZpbmUgWEtfa2FuYV9SQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGQ3ICAvKiBVKzMwRTkgS0FUQUtBTkEgTEVUVEVSIFJBICovCisjZGVmaW5lIFhLX2thbmFfUkkgICAgICAgICAgICAgICAgICAgICAgIDB4MDRkOCAgLyogVSszMEVBIEtBVEFLQU5BIExFVFRFUiBSSSAqLworI2RlZmluZSBYS19rYW5hX1JVICAgICAgICAgICAgICAgICAgICAgICAweDA0ZDkgIC8qIFUrMzBFQiBLQVRBS0FOQSBMRVRURVIgUlUgKi8KKyNkZWZpbmUgWEtfa2FuYV9SRSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGRhICAvKiBVKzMwRUMgS0FUQUtBTkEgTEVUVEVSIFJFICovCisjZGVmaW5lIFhLX2thbmFfUk8gICAgICAgICAgICAgICAgICAgICAgIDB4MDRkYiAgLyogVSszMEVEIEtBVEFLQU5BIExFVFRFUiBSTyAqLworI2RlZmluZSBYS19rYW5hX1dBICAgICAgICAgICAgICAgICAgICAgICAweDA0ZGMgIC8qIFUrMzBFRiBLQVRBS0FOQSBMRVRURVIgV0EgKi8KKyNkZWZpbmUgWEtfa2FuYV9OICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGRkICAvKiBVKzMwRjMgS0FUQUtBTkEgTEVUVEVSIE4gKi8KKyNkZWZpbmUgWEtfdm9pY2Vkc291bmQgICAgICAgICAgICAgICAgICAgMHgwNGRlICAvKiBVKzMwOUIgS0FUQUtBTkEtSElSQUdBTkEgVk9JQ0VEIFNPVU5EIE1BUksgKi8KKyNkZWZpbmUgWEtfc2VtaXZvaWNlZHNvdW5kICAgICAgICAgICAgICAgMHgwNGRmICAvKiBVKzMwOUMgS0FUQUtBTkEtSElSQUdBTkEgU0VNSS1WT0lDRUQgU09VTkQgTUFSSyAqLworI2RlZmluZSBYS19rYW5hX3N3aXRjaCAgICAgICAgICAgICAgICAgICAweGZmN2UgIC8qIEFsaWFzIGZvciBtb2RlX3N3aXRjaCAqLworI2VuZGlmIC8qIFhLX0tBVEFLQU5BICovCisKKy8qCisgKiBBcmFiaWMKKyAqIEJ5dGUgMyA9IDUKKyAqLworCisjaWZkZWYgWEtfQVJBQklDCisjZGVmaW5lIFhLX0ZhcnNpXzAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDZmMCAgLyogVSswNkYwIEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBaRVJPICovCisjZGVmaW5lIFhLX0ZhcnNpXzEgICAgICAgICAgICAgICAgICAgIDB4MTAwMDZmMSAgLyogVSswNkYxIEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBPTkUgKi8KKyNkZWZpbmUgWEtfRmFyc2lfMiAgICAgICAgICAgICAgICAgICAgMHgxMDAwNmYyICAvKiBVKzA2RjIgRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIFRXTyAqLworI2RlZmluZSBYS19GYXJzaV8zICAgICAgICAgICAgICAgICAgICAweDEwMDA2ZjMgIC8qIFUrMDZGMyBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgVEhSRUUgKi8KKyNkZWZpbmUgWEtfRmFyc2lfNCAgICAgICAgICAgICAgICAgICAgMHgxMDAwNmY0ICAvKiBVKzA2RjQgRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIEZPVVIgKi8KKyNkZWZpbmUgWEtfRmFyc2lfNSAgICAgICAgICAgICAgICAgICAgMHgxMDAwNmY1ICAvKiBVKzA2RjUgRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIEZJVkUgKi8KKyNkZWZpbmUgWEtfRmFyc2lfNiAgICAgICAgICAgICAgICAgICAgMHgxMDAwNmY2ICAvKiBVKzA2RjYgRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIFNJWCAqLworI2RlZmluZSBYS19GYXJzaV83ICAgICAgICAgICAgICAgICAgICAweDEwMDA2ZjcgIC8qIFUrMDZGNyBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgU0VWRU4gKi8KKyNkZWZpbmUgWEtfRmFyc2lfOCAgICAgICAgICAgICAgICAgICAgMHgxMDAwNmY4ICAvKiBVKzA2RjggRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIEVJR0hUICovCisjZGVmaW5lIFhLX0ZhcnNpXzkgICAgICAgICAgICAgICAgICAgIDB4MTAwMDZmOSAgLyogVSswNkY5IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBOSU5FICovCisjZGVmaW5lIFhLX0FyYWJpY19wZXJjZW50ICAgICAgICAgICAgIDB4MTAwMDY2YSAgLyogVSswNjZBIEFSQUJJQyBQRVJDRU5UIFNJR04gKi8KKyNkZWZpbmUgWEtfQXJhYmljX3N1cGVyc2NyaXB0X2FsZWYgICAgMHgxMDAwNjcwICAvKiBVKzA2NzAgQVJBQklDIExFVFRFUiBTVVBFUlNDUklQVCBBTEVGICovCisjZGVmaW5lIFhLX0FyYWJpY190dGVoICAgICAgICAgICAgICAgIDB4MTAwMDY3OSAgLyogVSswNjc5IEFSQUJJQyBMRVRURVIgVFRFSCAqLworI2RlZmluZSBYS19BcmFiaWNfcGVoICAgICAgICAgICAgICAgICAweDEwMDA2N2UgIC8qIFUrMDY3RSBBUkFCSUMgTEVUVEVSIFBFSCAqLworI2RlZmluZSBYS19BcmFiaWNfdGNoZWggICAgICAgICAgICAgICAweDEwMDA2ODYgIC8qIFUrMDY4NiBBUkFCSUMgTEVUVEVSIFRDSEVIICovCisjZGVmaW5lIFhLX0FyYWJpY19kZGFsICAgICAgICAgICAgICAgIDB4MTAwMDY4OCAgLyogVSswNjg4IEFSQUJJQyBMRVRURVIgRERBTCAqLworI2RlZmluZSBYS19BcmFiaWNfcnJlaCAgICAgICAgICAgICAgICAweDEwMDA2OTEgIC8qIFUrMDY5MSBBUkFCSUMgTEVUVEVSIFJSRUggKi8KKyNkZWZpbmUgWEtfQXJhYmljX2NvbW1hICAgICAgICAgICAgICAgICAgMHgwNWFjICAvKiBVKzA2MEMgQVJBQklDIENPTU1BICovCisjZGVmaW5lIFhLX0FyYWJpY19mdWxsc3RvcCAgICAgICAgICAgIDB4MTAwMDZkNCAgLyogVSswNkQ0IEFSQUJJQyBGVUxMIFNUT1AgKi8KKyNkZWZpbmUgWEtfQXJhYmljXzAgICAgICAgICAgICAgICAgICAgMHgxMDAwNjYwICAvKiBVKzA2NjAgQVJBQklDLUlORElDIERJR0lUIFpFUk8gKi8KKyNkZWZpbmUgWEtfQXJhYmljXzEgICAgICAgICAgICAgICAgICAgMHgxMDAwNjYxICAvKiBVKzA2NjEgQVJBQklDLUlORElDIERJR0lUIE9ORSAqLworI2RlZmluZSBYS19BcmFiaWNfMiAgICAgICAgICAgICAgICAgICAweDEwMDA2NjIgIC8qIFUrMDY2MiBBUkFCSUMtSU5ESUMgRElHSVQgVFdPICovCisjZGVmaW5lIFhLX0FyYWJpY18zICAgICAgICAgICAgICAgICAgIDB4MTAwMDY2MyAgLyogVSswNjYzIEFSQUJJQy1JTkRJQyBESUdJVCBUSFJFRSAqLworI2RlZmluZSBYS19BcmFiaWNfNCAgICAgICAgICAgICAgICAgICAweDEwMDA2NjQgIC8qIFUrMDY2NCBBUkFCSUMtSU5ESUMgRElHSVQgRk9VUiAqLworI2RlZmluZSBYS19BcmFiaWNfNSAgICAgICAgICAgICAgICAgICAweDEwMDA2NjUgIC8qIFUrMDY2NSBBUkFCSUMtSU5ESUMgRElHSVQgRklWRSAqLworI2RlZmluZSBYS19BcmFiaWNfNiAgICAgICAgICAgICAgICAgICAweDEwMDA2NjYgIC8qIFUrMDY2NiBBUkFCSUMtSU5ESUMgRElHSVQgU0lYICovCisjZGVmaW5lIFhLX0FyYWJpY183ICAgICAgICAgICAgICAgICAgIDB4MTAwMDY2NyAgLyogVSswNjY3IEFSQUJJQy1JTkRJQyBESUdJVCBTRVZFTiAqLworI2RlZmluZSBYS19BcmFiaWNfOCAgICAgICAgICAgICAgICAgICAweDEwMDA2NjggIC8qIFUrMDY2OCBBUkFCSUMtSU5ESUMgRElHSVQgRUlHSFQgKi8KKyNkZWZpbmUgWEtfQXJhYmljXzkgICAgICAgICAgICAgICAgICAgMHgxMDAwNjY5ICAvKiBVKzA2NjkgQVJBQklDLUlORElDIERJR0lUIE5JTkUgKi8KKyNkZWZpbmUgWEtfQXJhYmljX3NlbWljb2xvbiAgICAgICAgICAgICAgMHgwNWJiICAvKiBVKzA2MUIgQVJBQklDIFNFTUlDT0xPTiAqLworI2RlZmluZSBYS19BcmFiaWNfcXVlc3Rpb25fbWFyayAgICAgICAgICAweDA1YmYgIC8qIFUrMDYxRiBBUkFCSUMgUVVFU1RJT04gTUFSSyAqLworI2RlZmluZSBYS19BcmFiaWNfaGFtemEgICAgICAgICAgICAgICAgICAweDA1YzEgIC8qIFUrMDYyMSBBUkFCSUMgTEVUVEVSIEhBTVpBICovCisjZGVmaW5lIFhLX0FyYWJpY19tYWRkYW9uYWxlZiAgICAgICAgICAgIDB4MDVjMiAgLyogVSswNjIyIEFSQUJJQyBMRVRURVIgQUxFRiBXSVRIIE1BRERBIEFCT1ZFICovCisjZGVmaW5lIFhLX0FyYWJpY19oYW16YW9uYWxlZiAgICAgICAgICAgIDB4MDVjMyAgLyogVSswNjIzIEFSQUJJQyBMRVRURVIgQUxFRiBXSVRIIEhBTVpBIEFCT1ZFICovCisjZGVmaW5lIFhLX0FyYWJpY19oYW16YW9ud2F3ICAgICAgICAgICAgIDB4MDVjNCAgLyogVSswNjI0IEFSQUJJQyBMRVRURVIgV0FXIFdJVEggSEFNWkEgQUJPVkUgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2hhbXphdW5kZXJhbGVmICAgICAgICAgMHgwNWM1ICAvKiBVKzA2MjUgQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQkVMT1cgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2hhbXphb255ZWggICAgICAgICAgICAgMHgwNWM2ICAvKiBVKzA2MjYgQVJBQklDIExFVFRFUiBZRUggV0lUSCBIQU1aQSBBQk9WRSAqLworI2RlZmluZSBYS19BcmFiaWNfYWxlZiAgICAgICAgICAgICAgICAgICAweDA1YzcgIC8qIFUrMDYyNyBBUkFCSUMgTEVUVEVSIEFMRUYgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2JlaCAgICAgICAgICAgICAgICAgICAgMHgwNWM4ICAvKiBVKzA2MjggQVJBQklDIExFVFRFUiBCRUggKi8KKyNkZWZpbmUgWEtfQXJhYmljX3RlaG1hcmJ1dGEgICAgICAgICAgICAgMHgwNWM5ICAvKiBVKzA2MjkgQVJBQklDIExFVFRFUiBURUggTUFSQlVUQSAqLworI2RlZmluZSBYS19BcmFiaWNfdGVoICAgICAgICAgICAgICAgICAgICAweDA1Y2EgIC8qIFUrMDYyQSBBUkFCSUMgTEVUVEVSIFRFSCAqLworI2RlZmluZSBYS19BcmFiaWNfdGhlaCAgICAgICAgICAgICAgICAgICAweDA1Y2IgIC8qIFUrMDYyQiBBUkFCSUMgTEVUVEVSIFRIRUggKi8KKyNkZWZpbmUgWEtfQXJhYmljX2plZW0gICAgICAgICAgICAgICAgICAgMHgwNWNjICAvKiBVKzA2MkMgQVJBQklDIExFVFRFUiBKRUVNICovCisjZGVmaW5lIFhLX0FyYWJpY19oYWggICAgICAgICAgICAgICAgICAgIDB4MDVjZCAgLyogVSswNjJEIEFSQUJJQyBMRVRURVIgSEFIICovCisjZGVmaW5lIFhLX0FyYWJpY19raGFoICAgICAgICAgICAgICAgICAgIDB4MDVjZSAgLyogVSswNjJFIEFSQUJJQyBMRVRURVIgS0hBSCAqLworI2RlZmluZSBYS19BcmFiaWNfZGFsICAgICAgICAgICAgICAgICAgICAweDA1Y2YgIC8qIFUrMDYyRiBBUkFCSUMgTEVUVEVSIERBTCAqLworI2RlZmluZSBYS19BcmFiaWNfdGhhbCAgICAgICAgICAgICAgICAgICAweDA1ZDAgIC8qIFUrMDYzMCBBUkFCSUMgTEVUVEVSIFRIQUwgKi8KKyNkZWZpbmUgWEtfQXJhYmljX3JhICAgICAgICAgICAgICAgICAgICAgMHgwNWQxICAvKiBVKzA2MzEgQVJBQklDIExFVFRFUiBSRUggKi8KKyNkZWZpbmUgWEtfQXJhYmljX3phaW4gICAgICAgICAgICAgICAgICAgMHgwNWQyICAvKiBVKzA2MzIgQVJBQklDIExFVFRFUiBaQUlOICovCisjZGVmaW5lIFhLX0FyYWJpY19zZWVuICAgICAgICAgICAgICAgICAgIDB4MDVkMyAgLyogVSswNjMzIEFSQUJJQyBMRVRURVIgU0VFTiAqLworI2RlZmluZSBYS19BcmFiaWNfc2hlZW4gICAgICAgICAgICAgICAgICAweDA1ZDQgIC8qIFUrMDYzNCBBUkFCSUMgTEVUVEVSIFNIRUVOICovCisjZGVmaW5lIFhLX0FyYWJpY19zYWQgICAgICAgICAgICAgICAgICAgIDB4MDVkNSAgLyogVSswNjM1IEFSQUJJQyBMRVRURVIgU0FEICovCisjZGVmaW5lIFhLX0FyYWJpY19kYWQgICAgICAgICAgICAgICAgICAgIDB4MDVkNiAgLyogVSswNjM2IEFSQUJJQyBMRVRURVIgREFEICovCisjZGVmaW5lIFhLX0FyYWJpY190YWggICAgICAgICAgICAgICAgICAgIDB4MDVkNyAgLyogVSswNjM3IEFSQUJJQyBMRVRURVIgVEFIICovCisjZGVmaW5lIFhLX0FyYWJpY196YWggICAgICAgICAgICAgICAgICAgIDB4MDVkOCAgLyogVSswNjM4IEFSQUJJQyBMRVRURVIgWkFIICovCisjZGVmaW5lIFhLX0FyYWJpY19haW4gICAgICAgICAgICAgICAgICAgIDB4MDVkOSAgLyogVSswNjM5IEFSQUJJQyBMRVRURVIgQUlOICovCisjZGVmaW5lIFhLX0FyYWJpY19naGFpbiAgICAgICAgICAgICAgICAgIDB4MDVkYSAgLyogVSswNjNBIEFSQUJJQyBMRVRURVIgR0hBSU4gKi8KKyNkZWZpbmUgWEtfQXJhYmljX3RhdHdlZWwgICAgICAgICAgICAgICAgMHgwNWUwICAvKiBVKzA2NDAgQVJBQklDIFRBVFdFRUwgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2ZlaCAgICAgICAgICAgICAgICAgICAgMHgwNWUxICAvKiBVKzA2NDEgQVJBQklDIExFVFRFUiBGRUggKi8KKyNkZWZpbmUgWEtfQXJhYmljX3FhZiAgICAgICAgICAgICAgICAgICAgMHgwNWUyICAvKiBVKzA2NDIgQVJBQklDIExFVFRFUiBRQUYgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2thZiAgICAgICAgICAgICAgICAgICAgMHgwNWUzICAvKiBVKzA2NDMgQVJBQklDIExFVFRFUiBLQUYgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2xhbSAgICAgICAgICAgICAgICAgICAgMHgwNWU0ICAvKiBVKzA2NDQgQVJBQklDIExFVFRFUiBMQU0gKi8KKyNkZWZpbmUgWEtfQXJhYmljX21lZW0gICAgICAgICAgICAgICAgICAgMHgwNWU1ICAvKiBVKzA2NDUgQVJBQklDIExFVFRFUiBNRUVNICovCisjZGVmaW5lIFhLX0FyYWJpY19ub29uICAgICAgICAgICAgICAgICAgIDB4MDVlNiAgLyogVSswNjQ2IEFSQUJJQyBMRVRURVIgTk9PTiAqLworI2RlZmluZSBYS19BcmFiaWNfaGEgICAgICAgICAgICAgICAgICAgICAweDA1ZTcgIC8qIFUrMDY0NyBBUkFCSUMgTEVUVEVSIEhFSCAqLworI2RlZmluZSBYS19BcmFiaWNfaGVoICAgICAgICAgICAgICAgICAgICAweDA1ZTcgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfQXJhYmljX3dhdyAgICAgICAgICAgICAgICAgICAgMHgwNWU4ICAvKiBVKzA2NDggQVJBQklDIExFVFRFUiBXQVcgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2FsZWZtYWtzdXJhICAgICAgICAgICAgMHgwNWU5ICAvKiBVKzA2NDkgQVJBQklDIExFVFRFUiBBTEVGIE1BS1NVUkEgKi8KKyNkZWZpbmUgWEtfQXJhYmljX3llaCAgICAgICAgICAgICAgICAgICAgMHgwNWVhICAvKiBVKzA2NEEgQVJBQklDIExFVFRFUiBZRUggKi8KKyNkZWZpbmUgWEtfQXJhYmljX2ZhdGhhdGFuICAgICAgICAgICAgICAgMHgwNWViICAvKiBVKzA2NEIgQVJBQklDIEZBVEhBVEFOICovCisjZGVmaW5lIFhLX0FyYWJpY19kYW1tYXRhbiAgICAgICAgICAgICAgIDB4MDVlYyAgLyogVSswNjRDIEFSQUJJQyBEQU1NQVRBTiAqLworI2RlZmluZSBYS19BcmFiaWNfa2FzcmF0YW4gICAgICAgICAgICAgICAweDA1ZWQgIC8qIFUrMDY0RCBBUkFCSUMgS0FTUkFUQU4gKi8KKyNkZWZpbmUgWEtfQXJhYmljX2ZhdGhhICAgICAgICAgICAgICAgICAgMHgwNWVlICAvKiBVKzA2NEUgQVJBQklDIEZBVEhBICovCisjZGVmaW5lIFhLX0FyYWJpY19kYW1tYSAgICAgICAgICAgICAgICAgIDB4MDVlZiAgLyogVSswNjRGIEFSQUJJQyBEQU1NQSAqLworI2RlZmluZSBYS19BcmFiaWNfa2FzcmEgICAgICAgICAgICAgICAgICAweDA1ZjAgIC8qIFUrMDY1MCBBUkFCSUMgS0FTUkEgKi8KKyNkZWZpbmUgWEtfQXJhYmljX3NoYWRkYSAgICAgICAgICAgICAgICAgMHgwNWYxICAvKiBVKzA2NTEgQVJBQklDIFNIQUREQSAqLworI2RlZmluZSBYS19BcmFiaWNfc3VrdW4gICAgICAgICAgICAgICAgICAweDA1ZjIgIC8qIFUrMDY1MiBBUkFCSUMgU1VLVU4gKi8KKyNkZWZpbmUgWEtfQXJhYmljX21hZGRhX2Fib3ZlICAgICAgICAgMHgxMDAwNjUzICAvKiBVKzA2NTMgQVJBQklDIE1BRERBSCBBQk9WRSAqLworI2RlZmluZSBYS19BcmFiaWNfaGFtemFfYWJvdmUgICAgICAgICAweDEwMDA2NTQgIC8qIFUrMDY1NCBBUkFCSUMgSEFNWkEgQUJPVkUgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2hhbXphX2JlbG93ICAgICAgICAgMHgxMDAwNjU1ICAvKiBVKzA2NTUgQVJBQklDIEhBTVpBIEJFTE9XICovCisjZGVmaW5lIFhLX0FyYWJpY19qZWggICAgICAgICAgICAgICAgIDB4MTAwMDY5OCAgLyogVSswNjk4IEFSQUJJQyBMRVRURVIgSkVIICovCisjZGVmaW5lIFhLX0FyYWJpY192ZWggICAgICAgICAgICAgICAgIDB4MTAwMDZhNCAgLyogVSswNkE0IEFSQUJJQyBMRVRURVIgVkVIICovCisjZGVmaW5lIFhLX0FyYWJpY19rZWhlaCAgICAgICAgICAgICAgIDB4MTAwMDZhOSAgLyogVSswNkE5IEFSQUJJQyBMRVRURVIgS0VIRUggKi8KKyNkZWZpbmUgWEtfQXJhYmljX2dhZiAgICAgICAgICAgICAgICAgMHgxMDAwNmFmICAvKiBVKzA2QUYgQVJBQklDIExFVFRFUiBHQUYgKi8KKyNkZWZpbmUgWEtfQXJhYmljX25vb25fZ2h1bm5hICAgICAgICAgMHgxMDAwNmJhICAvKiBVKzA2QkEgQVJBQklDIExFVFRFUiBOT09OIEdIVU5OQSAqLworI2RlZmluZSBYS19BcmFiaWNfaGVoX2RvYWNoYXNobWVlICAgICAweDEwMDA2YmUgIC8qIFUrMDZCRSBBUkFCSUMgTEVUVEVSIEhFSCBET0FDSEFTSE1FRSAqLworI2RlZmluZSBYS19GYXJzaV95ZWggICAgICAgICAgICAgICAgICAweDEwMDA2Y2MgIC8qIFUrMDZDQyBBUkFCSUMgTEVUVEVSIEZBUlNJIFlFSCAqLworI2RlZmluZSBYS19BcmFiaWNfZmFyc2lfeWVoICAgICAgICAgICAweDEwMDA2Y2MgIC8qIFUrMDZDQyBBUkFCSUMgTEVUVEVSIEZBUlNJIFlFSCAqLworI2RlZmluZSBYS19BcmFiaWNfeWVoX2JhcmVlICAgICAgICAgICAweDEwMDA2ZDIgIC8qIFUrMDZEMiBBUkFCSUMgTEVUVEVSIFlFSCBCQVJSRUUgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2hlaF9nb2FsICAgICAgICAgICAgMHgxMDAwNmMxICAvKiBVKzA2QzEgQVJBQklDIExFVFRFUiBIRUggR09BTCAqLworI2RlZmluZSBYS19BcmFiaWNfc3dpdGNoICAgICAgICAgICAgICAgICAweGZmN2UgIC8qIEFsaWFzIGZvciBtb2RlX3N3aXRjaCAqLworI2VuZGlmIC8qIFhLX0FSQUJJQyAqLworCisvKgorICogQ3lyaWxsaWMKKyAqIEJ5dGUgMyA9IDYKKyAqLworI2lmZGVmIFhLX0NZUklMTElDCisjZGVmaW5lIFhLX0N5cmlsbGljX0dIRV9iYXIgICAgICAgICAgIDB4MTAwMDQ5MiAgLyogVSswNDkyIENZUklMTElDIENBUElUQUwgTEVUVEVSIEdIRSBXSVRIIFNUUk9LRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19naGVfYmFyICAgICAgICAgICAweDEwMDA0OTMgIC8qIFUrMDQ5MyBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0hFIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1pIRV9kZXNjZW5kZXIgICAgIDB4MTAwMDQ5NiAgLyogVSswNDk2IENZUklMTElDIENBUElUQUwgTEVUVEVSIFpIRSBXSVRIIERFU0NFTkRFUiAqLworI2RlZmluZSBYS19DeXJpbGxpY196aGVfZGVzY2VuZGVyICAgICAweDEwMDA0OTcgIC8qIFUrMDQ5NyBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkhFIFdJVEggREVTQ0VOREVSICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0tBX2Rlc2NlbmRlciAgICAgIDB4MTAwMDQ5YSAgLyogVSswNDlBIENZUklMTElDIENBUElUQUwgTEVUVEVSIEtBIFdJVEggREVTQ0VOREVSICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2thX2Rlc2NlbmRlciAgICAgIDB4MTAwMDQ5YiAgLyogVSswNDlCIENZUklMTElDIFNNQUxMIExFVFRFUiBLQSBXSVRIIERFU0NFTkRFUiAqLworI2RlZmluZSBYS19DeXJpbGxpY19LQV92ZXJ0c3Ryb2tlICAgICAweDEwMDA0OWMgIC8qIFUrMDQ5QyBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBLQSBXSVRIIFZFUlRJQ0FMIFNUUk9LRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19rYV92ZXJ0c3Ryb2tlICAgICAweDEwMDA0OWQgIC8qIFUrMDQ5RCBDWVJJTExJQyBTTUFMTCBMRVRURVIgS0EgV0lUSCBWRVJUSUNBTCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfRU5fZGVzY2VuZGVyICAgICAgMHgxMDAwNGEyICAvKiBVKzA0QTIgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU4gV0lUSCBERVNDRU5ERVIgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfZW5fZGVzY2VuZGVyICAgICAgMHgxMDAwNGEzICAvKiBVKzA0QTMgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVOIFdJVEggREVTQ0VOREVSICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1Vfc3RyYWlnaHQgICAgICAgIDB4MTAwMDRhZSAgLyogVSswNEFFIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNUUkFJR0hUIFUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfdV9zdHJhaWdodCAgICAgICAgMHgxMDAwNGFmICAvKiBVKzA0QUYgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNUUkFJR0hUIFUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfVV9zdHJhaWdodF9iYXIgICAgMHgxMDAwNGIwICAvKiBVKzA0QjAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU1RSQUlHSFQgVSBXSVRIIFNUUk9LRSAqLworI2RlZmluZSBYS19DeXJpbGxpY191X3N0cmFpZ2h0X2JhciAgICAweDEwMDA0YjEgIC8qIFUrMDRCMSBDWVJJTExJQyBTTUFMTCBMRVRURVIgU1RSQUlHSFQgVSBXSVRIIFNUUk9LRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19IQV9kZXNjZW5kZXIgICAgICAweDEwMDA0YjIgIC8qIFUrMDRCMiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQSBXSVRIIERFU0NFTkRFUiAqLworI2RlZmluZSBYS19DeXJpbGxpY19oYV9kZXNjZW5kZXIgICAgICAweDEwMDA0YjMgIC8qIFUrMDRCMyBDWVJJTExJQyBTTUFMTCBMRVRURVIgSEEgV0lUSCBERVNDRU5ERVIgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfQ0hFX2Rlc2NlbmRlciAgICAgMHgxMDAwNGI2ICAvKiBVKzA0QjYgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQ0hFIFdJVEggREVTQ0VOREVSICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2NoZV9kZXNjZW5kZXIgICAgIDB4MTAwMDRiNyAgLyogVSswNEI3IENZUklMTElDIFNNQUxMIExFVFRFUiBDSEUgV0lUSCBERVNDRU5ERVIgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfQ0hFX3ZlcnRzdHJva2UgICAgMHgxMDAwNGI4ICAvKiBVKzA0QjggQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQ0hFIFdJVEggVkVSVElDQUwgU1RST0tFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2NoZV92ZXJ0c3Ryb2tlICAgIDB4MTAwMDRiOSAgLyogVSswNEI5IENZUklMTElDIFNNQUxMIExFVFRFUiBDSEUgV0lUSCBWRVJUSUNBTCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfU0hIQSAgICAgICAgICAgICAgMHgxMDAwNGJhICAvKiBVKzA0QkEgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hIQSAqLworI2RlZmluZSBYS19DeXJpbGxpY19zaGhhICAgICAgICAgICAgICAweDEwMDA0YmIgIC8qIFUrMDRCQiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hIQSAqLworCisjZGVmaW5lIFhLX0N5cmlsbGljX1NDSFdBICAgICAgICAgICAgIDB4MTAwMDRkOCAgLyogVSswNEQ4IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNDSFdBICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3NjaHdhICAgICAgICAgICAgIDB4MTAwMDRkOSAgLyogVSswNEQ5IENZUklMTElDIFNNQUxMIExFVFRFUiBTQ0hXQSAqLworI2RlZmluZSBYS19DeXJpbGxpY19JX21hY3JvbiAgICAgICAgICAweDEwMDA0ZTIgIC8qIFUrMDRFMiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJIFdJVEggTUFDUk9OICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2lfbWFjcm9uICAgICAgICAgIDB4MTAwMDRlMyAgLyogVSswNEUzIENZUklMTElDIFNNQUxMIExFVFRFUiBJIFdJVEggTUFDUk9OICovCisjZGVmaW5lIFhLX0N5cmlsbGljX09fYmFyICAgICAgICAgICAgIDB4MTAwMDRlOCAgLyogVSswNEU4IENZUklMTElDIENBUElUQUwgTEVUVEVSIEJBUlJFRCBPICovCisjZGVmaW5lIFhLX0N5cmlsbGljX29fYmFyICAgICAgICAgICAgIDB4MTAwMDRlOSAgLyogVSswNEU5IENZUklMTElDIFNNQUxMIExFVFRFUiBCQVJSRUQgTyAqLworI2RlZmluZSBYS19DeXJpbGxpY19VX21hY3JvbiAgICAgICAgICAweDEwMDA0ZWUgIC8qIFUrMDRFRSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVIFdJVEggTUFDUk9OICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3VfbWFjcm9uICAgICAgICAgIDB4MTAwMDRlZiAgLyogVSswNEVGIENZUklMTElDIFNNQUxMIExFVFRFUiBVIFdJVEggTUFDUk9OICovCisKKyNkZWZpbmUgWEtfU2VyYmlhbl9kamUgICAgICAgICAgICAgICAgICAgMHgwNmExICAvKiBVKzA0NTIgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERKRSAqLworI2RlZmluZSBYS19NYWNlZG9uaWFfZ2plICAgICAgICAgICAgICAgICAweDA2YTIgIC8qIFUrMDQ1MyBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0pFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2lvICAgICAgICAgICAgICAgICAgIDB4MDZhMyAgLyogVSswNDUxIENZUklMTElDIFNNQUxMIExFVFRFUiBJTyAqLworI2RlZmluZSBYS19Va3JhaW5pYW5faWUgICAgICAgICAgICAgICAgICAweDA2YTQgIC8qIFUrMDQ1NCBDWVJJTExJQyBTTUFMTCBMRVRURVIgVUtSQUlOSUFOIElFICovCisjZGVmaW5lIFhLX1VrcmFuaWFuX2plICAgICAgICAgICAgICAgICAgIDB4MDZhNCAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19NYWNlZG9uaWFfZHNlICAgICAgICAgICAgICAgICAweDA2YTUgIC8qIFUrMDQ1NSBDWVJJTExJQyBTTUFMTCBMRVRURVIgRFpFICovCisjZGVmaW5lIFhLX1VrcmFpbmlhbl9pICAgICAgICAgICAgICAgICAgIDB4MDZhNiAgLyogVSswNDU2IENZUklMTElDIFNNQUxMIExFVFRFUiBCWUVMT1JVU1NJQU4tVUtSQUlOSUFOIEkgKi8KKyNkZWZpbmUgWEtfVWtyYW5pYW5faSAgICAgICAgICAgICAgICAgICAgMHgwNmE2ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX1VrcmFpbmlhbl95aSAgICAgICAgICAgICAgICAgIDB4MDZhNyAgLyogVSswNDU3IENZUklMTElDIFNNQUxMIExFVFRFUiBZSSAqLworI2RlZmluZSBYS19Va3Jhbmlhbl95aSAgICAgICAgICAgICAgICAgICAweDA2YTcgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfamUgICAgICAgICAgICAgICAgICAgMHgwNmE4ICAvKiBVKzA0NTggQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEpFICovCisjZGVmaW5lIFhLX1NlcmJpYW5famUgICAgICAgICAgICAgICAgICAgIDB4MDZhOCAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19DeXJpbGxpY19samUgICAgICAgICAgICAgICAgICAweDA2YTkgIC8qIFUrMDQ1OSBDWVJJTExJQyBTTUFMTCBMRVRURVIgTEpFICovCisjZGVmaW5lIFhLX1NlcmJpYW5fbGplICAgICAgICAgICAgICAgICAgIDB4MDZhOSAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19DeXJpbGxpY19uamUgICAgICAgICAgICAgICAgICAweDA2YWEgIC8qIFUrMDQ1QSBDWVJJTExJQyBTTUFMTCBMRVRURVIgTkpFICovCisjZGVmaW5lIFhLX1NlcmJpYW5fbmplICAgICAgICAgICAgICAgICAgIDB4MDZhYSAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19TZXJiaWFuX3RzaGUgICAgICAgICAgICAgICAgICAweDA2YWIgIC8qIFUrMDQ1QiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVFNIRSAqLworI2RlZmluZSBYS19NYWNlZG9uaWFfa2plICAgICAgICAgICAgICAgICAweDA2YWMgIC8qIFUrMDQ1QyBDWVJJTExJQyBTTUFMTCBMRVRURVIgS0pFICovCisjZGVmaW5lIFhLX1VrcmFpbmlhbl9naGVfd2l0aF91cHR1cm4gICAgIDB4MDZhZCAgLyogVSswNDkxIENZUklMTElDIFNNQUxMIExFVFRFUiBHSEUgV0lUSCBVUFRVUk4gKi8KKyNkZWZpbmUgWEtfQnllbG9ydXNzaWFuX3Nob3J0dSAgICAgICAgICAgMHgwNmFlICAvKiBVKzA0NUUgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIFUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfZHpoZSAgICAgICAgICAgICAgICAgMHgwNmFmICAvKiBVKzA0NUYgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERaSEUgKi8KKyNkZWZpbmUgWEtfU2VyYmlhbl9kemUgICAgICAgICAgICAgICAgICAgMHgwNmFmICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX251bWVyb3NpZ24gICAgICAgICAgICAgICAgICAgIDB4MDZiMCAgLyogVSsyMTE2IE5VTUVSTyBTSUdOICovCisjZGVmaW5lIFhLX1NlcmJpYW5fREpFICAgICAgICAgICAgICAgICAgIDB4MDZiMSAgLyogVSswNDAyIENZUklMTElDIENBUElUQUwgTEVUVEVSIERKRSAqLworI2RlZmluZSBYS19NYWNlZG9uaWFfR0pFICAgICAgICAgICAgICAgICAweDA2YjIgIC8qIFUrMDQwMyBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBHSkUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfSU8gICAgICAgICAgICAgICAgICAgMHgwNmIzICAvKiBVKzA0MDEgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSU8gKi8KKyNkZWZpbmUgWEtfVWtyYWluaWFuX0lFICAgICAgICAgICAgICAgICAgMHgwNmI0ICAvKiBVKzA0MDQgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVUtSQUlOSUFOIElFICovCisjZGVmaW5lIFhLX1VrcmFuaWFuX0pFICAgICAgICAgICAgICAgICAgIDB4MDZiNCAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19NYWNlZG9uaWFfRFNFICAgICAgICAgICAgICAgICAweDA2YjUgIC8qIFUrMDQwNSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBEWkUgKi8KKyNkZWZpbmUgWEtfVWtyYWluaWFuX0kgICAgICAgICAgICAgICAgICAgMHgwNmI2ICAvKiBVKzA0MDYgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQllFTE9SVVNTSUFOLVVLUkFJTklBTiBJICovCisjZGVmaW5lIFhLX1VrcmFuaWFuX0kgICAgICAgICAgICAgICAgICAgIDB4MDZiNiAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19Va3JhaW5pYW5fWUkgICAgICAgICAgICAgICAgICAweDA2YjcgIC8qIFUrMDQwNyBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZSSAqLworI2RlZmluZSBYS19Va3Jhbmlhbl9ZSSAgICAgICAgICAgICAgICAgICAweDA2YjcgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfSkUgICAgICAgICAgICAgICAgICAgMHgwNmI4ICAvKiBVKzA0MDggQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSkUgKi8KKyNkZWZpbmUgWEtfU2VyYmlhbl9KRSAgICAgICAgICAgICAgICAgICAgMHgwNmI4ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0xKRSAgICAgICAgICAgICAgICAgIDB4MDZiOSAgLyogVSswNDA5IENZUklMTElDIENBUElUQUwgTEVUVEVSIExKRSAqLworI2RlZmluZSBYS19TZXJiaWFuX0xKRSAgICAgICAgICAgICAgICAgICAweDA2YjkgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfTkpFICAgICAgICAgICAgICAgICAgMHgwNmJhICAvKiBVKzA0MEEgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTkpFICovCisjZGVmaW5lIFhLX1NlcmJpYW5fTkpFICAgICAgICAgICAgICAgICAgIDB4MDZiYSAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19TZXJiaWFuX1RTSEUgICAgICAgICAgICAgICAgICAweDA2YmIgIC8qIFUrMDQwQiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBUU0hFICovCisjZGVmaW5lIFhLX01hY2Vkb25pYV9LSkUgICAgICAgICAgICAgICAgIDB4MDZiYyAgLyogVSswNDBDIENZUklMTElDIENBUElUQUwgTEVUVEVSIEtKRSAqLworI2RlZmluZSBYS19Va3JhaW5pYW5fR0hFX1dJVEhfVVBUVVJOICAgICAweDA2YmQgIC8qIFUrMDQ5MCBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBHSEUgV0lUSCBVUFRVUk4gKi8KKyNkZWZpbmUgWEtfQnllbG9ydXNzaWFuX1NIT1JUVSAgICAgICAgICAgMHgwNmJlICAvKiBVKzA0MEUgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgVSAqLworI2RlZmluZSBYS19DeXJpbGxpY19EWkhFICAgICAgICAgICAgICAgICAweDA2YmYgIC8qIFUrMDQwRiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBEWkhFICovCisjZGVmaW5lIFhLX1NlcmJpYW5fRFpFICAgICAgICAgICAgICAgICAgIDB4MDZiZiAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19DeXJpbGxpY195dSAgICAgICAgICAgICAgICAgICAweDA2YzAgIC8qIFUrMDQ0RSBDWVJJTExJQyBTTUFMTCBMRVRURVIgWVUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfYSAgICAgICAgICAgICAgICAgICAgMHgwNmMxICAvKiBVKzA0MzAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEEgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfYmUgICAgICAgICAgICAgICAgICAgMHgwNmMyICAvKiBVKzA0MzEgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3RzZSAgICAgICAgICAgICAgICAgIDB4MDZjMyAgLyogVSswNDQ2IENZUklMTElDIFNNQUxMIExFVFRFUiBUU0UgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfZGUgICAgICAgICAgICAgICAgICAgMHgwNmM0ICAvKiBVKzA0MzQgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2llICAgICAgICAgICAgICAgICAgIDB4MDZjNSAgLyogVSswNDM1IENZUklMTElDIFNNQUxMIExFVFRFUiBJRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19lZiAgICAgICAgICAgICAgICAgICAweDA2YzYgIC8qIFUrMDQ0NCBDWVJJTExJQyBTTUFMTCBMRVRURVIgRUYgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfZ2hlICAgICAgICAgICAgICAgICAgMHgwNmM3ICAvKiBVKzA0MzMgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEdIRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19oYSAgICAgICAgICAgICAgICAgICAweDA2YzggIC8qIFUrMDQ0NSBDWVJJTExJQyBTTUFMTCBMRVRURVIgSEEgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfaSAgICAgICAgICAgICAgICAgICAgMHgwNmM5ICAvKiBVKzA0MzggQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEkgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfc2hvcnRpICAgICAgICAgICAgICAgMHgwNmNhICAvKiBVKzA0MzkgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIEkgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfa2EgICAgICAgICAgICAgICAgICAgMHgwNmNiICAvKiBVKzA0M0EgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEtBICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2VsICAgICAgICAgICAgICAgICAgIDB4MDZjYyAgLyogVSswNDNCIENZUklMTElDIFNNQUxMIExFVFRFUiBFTCAqLworI2RlZmluZSBYS19DeXJpbGxpY19lbSAgICAgICAgICAgICAgICAgICAweDA2Y2QgIC8qIFUrMDQzQyBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU0gKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfZW4gICAgICAgICAgICAgICAgICAgMHgwNmNlICAvKiBVKzA0M0QgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVOICovCisjZGVmaW5lIFhLX0N5cmlsbGljX28gICAgICAgICAgICAgICAgICAgIDB4MDZjZiAgLyogVSswNDNFIENZUklMTElDIFNNQUxMIExFVFRFUiBPICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3BlICAgICAgICAgICAgICAgICAgIDB4MDZkMCAgLyogVSswNDNGIENZUklMTElDIFNNQUxMIExFVFRFUiBQRSAqLworI2RlZmluZSBYS19DeXJpbGxpY195YSAgICAgICAgICAgICAgICAgICAweDA2ZDEgIC8qIFUrMDQ0RiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUEgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfZXIgICAgICAgICAgICAgICAgICAgMHgwNmQyICAvKiBVKzA0NDAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVSICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2VzICAgICAgICAgICAgICAgICAgIDB4MDZkMyAgLyogVSswNDQxIENZUklMTElDIFNNQUxMIExFVFRFUiBFUyAqLworI2RlZmluZSBYS19DeXJpbGxpY190ZSAgICAgICAgICAgICAgICAgICAweDA2ZDQgIC8qIFUrMDQ0MiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVEUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfdSAgICAgICAgICAgICAgICAgICAgMHgwNmQ1ICAvKiBVKzA0NDMgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfemhlICAgICAgICAgICAgICAgICAgMHgwNmQ2ICAvKiBVKzA0MzYgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpIRSAqLworI2RlZmluZSBYS19DeXJpbGxpY192ZSAgICAgICAgICAgICAgICAgICAweDA2ZDcgIC8qIFUrMDQzMiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVkUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfc29mdHNpZ24gICAgICAgICAgICAgMHgwNmQ4ICAvKiBVKzA0NEMgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNPRlQgU0lHTiAqLworI2RlZmluZSBYS19DeXJpbGxpY195ZXJ1ICAgICAgICAgICAgICAgICAweDA2ZDkgIC8qIFUrMDQ0QiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUVSVSAqLworI2RlZmluZSBYS19DeXJpbGxpY196ZSAgICAgICAgICAgICAgICAgICAweDA2ZGEgIC8qIFUrMDQzNyBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfc2hhICAgICAgICAgICAgICAgICAgMHgwNmRiICAvKiBVKzA0NDggQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQSAqLworI2RlZmluZSBYS19DeXJpbGxpY19lICAgICAgICAgICAgICAgICAgICAweDA2ZGMgIC8qIFUrMDQ0RCBDWVJJTExJQyBTTUFMTCBMRVRURVIgRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19zaGNoYSAgICAgICAgICAgICAgICAweDA2ZGQgIC8qIFUrMDQ0OSBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hDSEEgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfY2hlICAgICAgICAgICAgICAgICAgMHgwNmRlICAvKiBVKzA0NDcgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIENIRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19oYXJkc2lnbiAgICAgICAgICAgICAweDA2ZGYgIC8qIFUrMDQ0QSBDWVJJTExJQyBTTUFMTCBMRVRURVIgSEFSRCBTSUdOICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1lVICAgICAgICAgICAgICAgICAgIDB4MDZlMCAgLyogVSswNDJFIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlVICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0EgICAgICAgICAgICAgICAgICAgIDB4MDZlMSAgLyogVSswNDEwIENZUklMTElDIENBUElUQUwgTEVUVEVSIEEgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfQkUgICAgICAgICAgICAgICAgICAgMHgwNmUyICAvKiBVKzA0MTEgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQkUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfVFNFICAgICAgICAgICAgICAgICAgMHgwNmUzICAvKiBVKzA0MjYgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVFNFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0RFICAgICAgICAgICAgICAgICAgIDB4MDZlNCAgLyogVSswNDE0IENZUklMTElDIENBUElUQUwgTEVUVEVSIERFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0lFICAgICAgICAgICAgICAgICAgIDB4MDZlNSAgLyogVSswNDE1IENZUklMTElDIENBUElUQUwgTEVUVEVSIElFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0VGICAgICAgICAgICAgICAgICAgIDB4MDZlNiAgLyogVSswNDI0IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVGICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0dIRSAgICAgICAgICAgICAgICAgIDB4MDZlNyAgLyogVSswNDEzIENZUklMTElDIENBUElUQUwgTEVUVEVSIEdIRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19IQSAgICAgICAgICAgICAgICAgICAweDA2ZTggIC8qIFUrMDQyNSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQSAqLworI2RlZmluZSBYS19DeXJpbGxpY19JICAgICAgICAgICAgICAgICAgICAweDA2ZTkgIC8qIFUrMDQxOCBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1NIT1JUSSAgICAgICAgICAgICAgIDB4MDZlYSAgLyogVSswNDE5IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIEkgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfS0EgICAgICAgICAgICAgICAgICAgMHgwNmViICAvKiBVKzA0MUEgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0EgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfRUwgICAgICAgICAgICAgICAgICAgMHgwNmVjICAvKiBVKzA0MUIgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUwgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfRU0gICAgICAgICAgICAgICAgICAgMHgwNmVkICAvKiBVKzA0MUMgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU0gKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfRU4gICAgICAgICAgICAgICAgICAgMHgwNmVlICAvKiBVKzA0MUQgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU4gKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfTyAgICAgICAgICAgICAgICAgICAgMHgwNmVmICAvKiBVKzA0MUUgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTyAqLworI2RlZmluZSBYS19DeXJpbGxpY19QRSAgICAgICAgICAgICAgICAgICAweDA2ZjAgIC8qIFUrMDQxRiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBQRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19ZQSAgICAgICAgICAgICAgICAgICAweDA2ZjEgIC8qIFUrMDQyRiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZQSAqLworI2RlZmluZSBYS19DeXJpbGxpY19FUiAgICAgICAgICAgICAgICAgICAweDA2ZjIgIC8qIFUrMDQyMCBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUiAqLworI2RlZmluZSBYS19DeXJpbGxpY19FUyAgICAgICAgICAgICAgICAgICAweDA2ZjMgIC8qIFUrMDQyMSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUyAqLworI2RlZmluZSBYS19DeXJpbGxpY19URSAgICAgICAgICAgICAgICAgICAweDA2ZjQgIC8qIFUrMDQyMiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBURSAqLworI2RlZmluZSBYS19DeXJpbGxpY19VICAgICAgICAgICAgICAgICAgICAweDA2ZjUgIC8qIFUrMDQyMyBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1pIRSAgICAgICAgICAgICAgICAgIDB4MDZmNiAgLyogVSswNDE2IENZUklMTElDIENBUElUQUwgTEVUVEVSIFpIRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19WRSAgICAgICAgICAgICAgICAgICAweDA2ZjcgIC8qIFUrMDQxMiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBWRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19TT0ZUU0lHTiAgICAgICAgICAgICAweDA2ZjggIC8qIFUrMDQyQyBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTT0ZUIFNJR04gKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfWUVSVSAgICAgICAgICAgICAgICAgMHgwNmY5ICAvKiBVKzA0MkIgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUVSVSAqLworI2RlZmluZSBYS19DeXJpbGxpY19aRSAgICAgICAgICAgICAgICAgICAweDA2ZmEgIC8qIFUrMDQxNyBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19TSEEgICAgICAgICAgICAgICAgICAweDA2ZmIgIC8qIFUrMDQyOCBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSEEgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfRSAgICAgICAgICAgICAgICAgICAgMHgwNmZjICAvKiBVKzA0MkQgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19TSENIQSAgICAgICAgICAgICAgICAweDA2ZmQgIC8qIFUrMDQyOSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSENIQSAqLworI2RlZmluZSBYS19DeXJpbGxpY19DSEUgICAgICAgICAgICAgICAgICAweDA2ZmUgIC8qIFUrMDQyNyBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBDSEUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfSEFSRFNJR04gICAgICAgICAgICAgMHgwNmZmICAvKiBVKzA0MkEgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEFSRCBTSUdOICovCisjZW5kaWYgLyogWEtfQ1lSSUxMSUMgKi8KKworLyoKKyAqIEdyZWVrCisgKiAoYmFzZWQgb24gYW4gZWFybHkgZHJhZnQgb2YsIGFuZCBub3QgcXVpdGUgaWRlbnRpY2FsIHRvLCBJU08vSUVDIDg4NTktNykKKyAqIEJ5dGUgMyA9IDcKKyAqLworCisjaWZkZWYgWEtfR1JFRUsKKyNkZWZpbmUgWEtfR3JlZWtfQUxQSEFhY2NlbnQgICAgICAgICAgICAgMHgwN2ExICAvKiBVKzAzODYgR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUyAqLworI2RlZmluZSBYS19HcmVla19FUFNJTE9OYWNjZW50ICAgICAgICAgICAweDA3YTIgIC8qIFUrMDM4OCBHUkVFSyBDQVBJVEFMIExFVFRFUiBFUFNJTE9OIFdJVEggVE9OT1MgKi8KKyNkZWZpbmUgWEtfR3JlZWtfRVRBYWNjZW50ICAgICAgICAgICAgICAgMHgwN2EzICAvKiBVKzAzODkgR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBIFdJVEggVE9OT1MgKi8KKyNkZWZpbmUgWEtfR3JlZWtfSU9UQWFjY2VudCAgICAgICAgICAgICAgMHgwN2E0ICAvKiBVKzAzOEEgR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TICovCisjZGVmaW5lIFhLX0dyZWVrX0lPVEFkaWVyZXNpcyAgICAgICAgICAgIDB4MDdhNSAgLyogVSswM0FBIEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EgKi8KKyNkZWZpbmUgWEtfR3JlZWtfSU9UQWRpYWVyZXNpcyAgICAgICAgICAgMHgwN2E1ICAvKiBvbGQgdHlwbyAqLworI2RlZmluZSBYS19HcmVla19PTUlDUk9OYWNjZW50ICAgICAgICAgICAweDA3YTcgIC8qIFUrMDM4QyBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OIFdJVEggVE9OT1MgKi8KKyNkZWZpbmUgWEtfR3JlZWtfVVBTSUxPTmFjY2VudCAgICAgICAgICAgMHgwN2E4ICAvKiBVKzAzOEUgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTiBXSVRIIFRPTk9TICovCisjZGVmaW5lIFhLX0dyZWVrX1VQU0lMT05kaWVyZXNpcyAgICAgICAgIDB4MDdhOSAgLyogVSswM0FCIEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EgKi8KKyNkZWZpbmUgWEtfR3JlZWtfT01FR0FhY2NlbnQgICAgICAgICAgICAgMHgwN2FiICAvKiBVKzAzOEYgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUyAqLworI2RlZmluZSBYS19HcmVla19hY2NlbnRkaWVyZXNpcyAgICAgICAgICAweDA3YWUgIC8qIFUrMDM4NSBHUkVFSyBESUFMWVRJS0EgVE9OT1MgKi8KKyNkZWZpbmUgWEtfR3JlZWtfaG9yaXpiYXIgICAgICAgICAgICAgICAgMHgwN2FmICAvKiBVKzIwMTUgSE9SSVpPTlRBTCBCQVIgKi8KKyNkZWZpbmUgWEtfR3JlZWtfYWxwaGFhY2NlbnQgICAgICAgICAgICAgMHgwN2IxICAvKiBVKzAzQUMgR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBIFdJVEggVE9OT1MgKi8KKyNkZWZpbmUgWEtfR3JlZWtfZXBzaWxvbmFjY2VudCAgICAgICAgICAgMHgwN2IyICAvKiBVKzAzQUQgR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04gV0lUSCBUT05PUyAqLworI2RlZmluZSBYS19HcmVla19ldGFhY2NlbnQgICAgICAgICAgICAgICAweDA3YjMgIC8qIFUrMDNBRSBHUkVFSyBTTUFMTCBMRVRURVIgRVRBIFdJVEggVE9OT1MgKi8KKyNkZWZpbmUgWEtfR3JlZWtfaW90YWFjY2VudCAgICAgICAgICAgICAgMHgwN2I0ICAvKiBVKzAzQUYgR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBUT05PUyAqLworI2RlZmluZSBYS19HcmVla19pb3RhZGllcmVzaXMgICAgICAgICAgICAweDA3YjUgIC8qIFUrMDNDQSBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQSAqLworI2RlZmluZSBYS19HcmVla19pb3RhYWNjZW50ZGllcmVzaXMgICAgICAweDA3YjYgIC8qIFUrMDM5MCBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQSBBTkQgVE9OT1MgKi8KKyNkZWZpbmUgWEtfR3JlZWtfb21pY3JvbmFjY2VudCAgICAgICAgICAgMHgwN2I3ICAvKiBVKzAzQ0MgR1JFRUsgU01BTEwgTEVUVEVSIE9NSUNST04gV0lUSCBUT05PUyAqLworI2RlZmluZSBYS19HcmVla191cHNpbG9uYWNjZW50ICAgICAgICAgICAweDA3YjggIC8qIFUrMDNDRCBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIFRPTk9TICovCisjZGVmaW5lIFhLX0dyZWVrX3Vwc2lsb25kaWVyZXNpcyAgICAgICAgIDB4MDdiOSAgLyogVSswM0NCIEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBICovCisjZGVmaW5lIFhLX0dyZWVrX3Vwc2lsb25hY2NlbnRkaWVyZXNpcyAgIDB4MDdiYSAgLyogVSswM0IwIEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBIEFORCBUT05PUyAqLworI2RlZmluZSBYS19HcmVla19vbWVnYWFjY2VudCAgICAgICAgICAgICAweDA3YmIgIC8qIFUrMDNDRSBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUyAqLworI2RlZmluZSBYS19HcmVla19BTFBIQSAgICAgICAgICAgICAgICAgICAweDA3YzEgIC8qIFUrMDM5MSBHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQSAqLworI2RlZmluZSBYS19HcmVla19CRVRBICAgICAgICAgICAgICAgICAgICAweDA3YzIgIC8qIFUrMDM5MiBHUkVFSyBDQVBJVEFMIExFVFRFUiBCRVRBICovCisjZGVmaW5lIFhLX0dyZWVrX0dBTU1BICAgICAgICAgICAgICAgICAgIDB4MDdjMyAgLyogVSswMzkzIEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BICovCisjZGVmaW5lIFhLX0dyZWVrX0RFTFRBICAgICAgICAgICAgICAgICAgIDB4MDdjNCAgLyogVSswMzk0IEdSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBICovCisjZGVmaW5lIFhLX0dyZWVrX0VQU0lMT04gICAgICAgICAgICAgICAgIDB4MDdjNSAgLyogVSswMzk1IEdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04gKi8KKyNkZWZpbmUgWEtfR3JlZWtfWkVUQSAgICAgICAgICAgICAgICAgICAgMHgwN2M2ICAvKiBVKzAzOTYgR1JFRUsgQ0FQSVRBTCBMRVRURVIgWkVUQSAqLworI2RlZmluZSBYS19HcmVla19FVEEgICAgICAgICAgICAgICAgICAgICAweDA3YzcgIC8qIFUrMDM5NyBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEgKi8KKyNkZWZpbmUgWEtfR3JlZWtfVEhFVEEgICAgICAgICAgICAgICAgICAgMHgwN2M4ICAvKiBVKzAzOTggR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEgKi8KKyNkZWZpbmUgWEtfR3JlZWtfSU9UQSAgICAgICAgICAgICAgICAgICAgMHgwN2M5ICAvKiBVKzAzOTkgR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSAqLworI2RlZmluZSBYS19HcmVla19LQVBQQSAgICAgICAgICAgICAgICAgICAweDA3Y2EgIC8qIFUrMDM5QSBHUkVFSyBDQVBJVEFMIExFVFRFUiBLQVBQQSAqLworI2RlZmluZSBYS19HcmVla19MQU1EQSAgICAgICAgICAgICAgICAgICAweDA3Y2IgIC8qIFUrMDM5QiBHUkVFSyBDQVBJVEFMIExFVFRFUiBMQU1EQSAqLworI2RlZmluZSBYS19HcmVla19MQU1CREEgICAgICAgICAgICAgICAgICAweDA3Y2IgIC8qIFUrMDM5QiBHUkVFSyBDQVBJVEFMIExFVFRFUiBMQU1EQSAqLworI2RlZmluZSBYS19HcmVla19NVSAgICAgICAgICAgICAgICAgICAgICAweDA3Y2MgIC8qIFUrMDM5QyBHUkVFSyBDQVBJVEFMIExFVFRFUiBNVSAqLworI2RlZmluZSBYS19HcmVla19OVSAgICAgICAgICAgICAgICAgICAgICAweDA3Y2QgIC8qIFUrMDM5RCBHUkVFSyBDQVBJVEFMIExFVFRFUiBOVSAqLworI2RlZmluZSBYS19HcmVla19YSSAgICAgICAgICAgICAgICAgICAgICAweDA3Y2UgIC8qIFUrMDM5RSBHUkVFSyBDQVBJVEFMIExFVFRFUiBYSSAqLworI2RlZmluZSBYS19HcmVla19PTUlDUk9OICAgICAgICAgICAgICAgICAweDA3Y2YgIC8qIFUrMDM5RiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OICovCisjZGVmaW5lIFhLX0dyZWVrX1BJICAgICAgICAgICAgICAgICAgICAgIDB4MDdkMCAgLyogVSswM0EwIEdSRUVLIENBUElUQUwgTEVUVEVSIFBJICovCisjZGVmaW5lIFhLX0dyZWVrX1JITyAgICAgICAgICAgICAgICAgICAgIDB4MDdkMSAgLyogVSswM0ExIEdSRUVLIENBUElUQUwgTEVUVEVSIFJITyAqLworI2RlZmluZSBYS19HcmVla19TSUdNQSAgICAgICAgICAgICAgICAgICAweDA3ZDIgIC8qIFUrMDNBMyBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQSAqLworI2RlZmluZSBYS19HcmVla19UQVUgICAgICAgICAgICAgICAgICAgICAweDA3ZDQgIC8qIFUrMDNBNCBHUkVFSyBDQVBJVEFMIExFVFRFUiBUQVUgKi8KKyNkZWZpbmUgWEtfR3JlZWtfVVBTSUxPTiAgICAgICAgICAgICAgICAgMHgwN2Q1ICAvKiBVKzAzQTUgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTiAqLworI2RlZmluZSBYS19HcmVla19QSEkgICAgICAgICAgICAgICAgICAgICAweDA3ZDYgIC8qIFUrMDNBNiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkgKi8KKyNkZWZpbmUgWEtfR3JlZWtfQ0hJICAgICAgICAgICAgICAgICAgICAgMHgwN2Q3ICAvKiBVKzAzQTcgR1JFRUsgQ0FQSVRBTCBMRVRURVIgQ0hJICovCisjZGVmaW5lIFhLX0dyZWVrX1BTSSAgICAgICAgICAgICAgICAgICAgIDB4MDdkOCAgLyogVSswM0E4IEdSRUVLIENBUElUQUwgTEVUVEVSIFBTSSAqLworI2RlZmluZSBYS19HcmVla19PTUVHQSAgICAgICAgICAgICAgICAgICAweDA3ZDkgIC8qIFUrMDNBOSBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQSAqLworI2RlZmluZSBYS19HcmVla19hbHBoYSAgICAgICAgICAgICAgICAgICAweDA3ZTEgIC8qIFUrMDNCMSBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEgKi8KKyNkZWZpbmUgWEtfR3JlZWtfYmV0YSAgICAgICAgICAgICAgICAgICAgMHgwN2UyICAvKiBVKzAzQjIgR1JFRUsgU01BTEwgTEVUVEVSIEJFVEEgKi8KKyNkZWZpbmUgWEtfR3JlZWtfZ2FtbWEgICAgICAgICAgICAgICAgICAgMHgwN2UzICAvKiBVKzAzQjMgR1JFRUsgU01BTEwgTEVUVEVSIEdBTU1BICovCisjZGVmaW5lIFhLX0dyZWVrX2RlbHRhICAgICAgICAgICAgICAgICAgIDB4MDdlNCAgLyogVSswM0I0IEdSRUVLIFNNQUxMIExFVFRFUiBERUxUQSAqLworI2RlZmluZSBYS19HcmVla19lcHNpbG9uICAgICAgICAgICAgICAgICAweDA3ZTUgIC8qIFUrMDNCNSBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTiAqLworI2RlZmluZSBYS19HcmVla196ZXRhICAgICAgICAgICAgICAgICAgICAweDA3ZTYgIC8qIFUrMDNCNiBHUkVFSyBTTUFMTCBMRVRURVIgWkVUQSAqLworI2RlZmluZSBYS19HcmVla19ldGEgICAgICAgICAgICAgICAgICAgICAweDA3ZTcgIC8qIFUrMDNCNyBHUkVFSyBTTUFMTCBMRVRURVIgRVRBICovCisjZGVmaW5lIFhLX0dyZWVrX3RoZXRhICAgICAgICAgICAgICAgICAgIDB4MDdlOCAgLyogVSswM0I4IEdSRUVLIFNNQUxMIExFVFRFUiBUSEVUQSAqLworI2RlZmluZSBYS19HcmVla19pb3RhICAgICAgICAgICAgICAgICAgICAweDA3ZTkgIC8qIFUrMDNCOSBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSAqLworI2RlZmluZSBYS19HcmVla19rYXBwYSAgICAgICAgICAgICAgICAgICAweDA3ZWEgIC8qIFUrMDNCQSBHUkVFSyBTTUFMTCBMRVRURVIgS0FQUEEgKi8KKyNkZWZpbmUgWEtfR3JlZWtfbGFtZGEgICAgICAgICAgICAgICAgICAgMHgwN2ViICAvKiBVKzAzQkIgR1JFRUsgU01BTEwgTEVUVEVSIExBTURBICovCisjZGVmaW5lIFhLX0dyZWVrX2xhbWJkYSAgICAgICAgICAgICAgICAgIDB4MDdlYiAgLyogVSswM0JCIEdSRUVLIFNNQUxMIExFVFRFUiBMQU1EQSAqLworI2RlZmluZSBYS19HcmVla19tdSAgICAgICAgICAgICAgICAgICAgICAweDA3ZWMgIC8qIFUrMDNCQyBHUkVFSyBTTUFMTCBMRVRURVIgTVUgKi8KKyNkZWZpbmUgWEtfR3JlZWtfbnUgICAgICAgICAgICAgICAgICAgICAgMHgwN2VkICAvKiBVKzAzQkQgR1JFRUsgU01BTEwgTEVUVEVSIE5VICovCisjZGVmaW5lIFhLX0dyZWVrX3hpICAgICAgICAgICAgICAgICAgICAgIDB4MDdlZSAgLyogVSswM0JFIEdSRUVLIFNNQUxMIExFVFRFUiBYSSAqLworI2RlZmluZSBYS19HcmVla19vbWljcm9uICAgICAgICAgICAgICAgICAweDA3ZWYgIC8qIFUrMDNCRiBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTiAqLworI2RlZmluZSBYS19HcmVla19waSAgICAgICAgICAgICAgICAgICAgICAweDA3ZjAgIC8qIFUrMDNDMCBHUkVFSyBTTUFMTCBMRVRURVIgUEkgKi8KKyNkZWZpbmUgWEtfR3JlZWtfcmhvICAgICAgICAgICAgICAgICAgICAgMHgwN2YxICAvKiBVKzAzQzEgR1JFRUsgU01BTEwgTEVUVEVSIFJITyAqLworI2RlZmluZSBYS19HcmVla19zaWdtYSAgICAgICAgICAgICAgICAgICAweDA3ZjIgIC8qIFUrMDNDMyBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEgKi8KKyNkZWZpbmUgWEtfR3JlZWtfZmluYWxzbWFsbHNpZ21hICAgICAgICAgMHgwN2YzICAvKiBVKzAzQzIgR1JFRUsgU01BTEwgTEVUVEVSIEZJTkFMIFNJR01BICovCisjZGVmaW5lIFhLX0dyZWVrX3RhdSAgICAgICAgICAgICAgICAgICAgIDB4MDdmNCAgLyogVSswM0M0IEdSRUVLIFNNQUxMIExFVFRFUiBUQVUgKi8KKyNkZWZpbmUgWEtfR3JlZWtfdXBzaWxvbiAgICAgICAgICAgICAgICAgMHgwN2Y1ICAvKiBVKzAzQzUgR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gKi8KKyNkZWZpbmUgWEtfR3JlZWtfcGhpICAgICAgICAgICAgICAgICAgICAgMHgwN2Y2ICAvKiBVKzAzQzYgR1JFRUsgU01BTEwgTEVUVEVSIFBISSAqLworI2RlZmluZSBYS19HcmVla19jaGkgICAgICAgICAgICAgICAgICAgICAweDA3ZjcgIC8qIFUrMDNDNyBHUkVFSyBTTUFMTCBMRVRURVIgQ0hJICovCisjZGVmaW5lIFhLX0dyZWVrX3BzaSAgICAgICAgICAgICAgICAgICAgIDB4MDdmOCAgLyogVSswM0M4IEdSRUVLIFNNQUxMIExFVFRFUiBQU0kgKi8KKyNkZWZpbmUgWEtfR3JlZWtfb21lZ2EgICAgICAgICAgICAgICAgICAgMHgwN2Y5ICAvKiBVKzAzQzkgR1JFRUsgU01BTEwgTEVUVEVSIE9NRUdBICovCisjZGVmaW5lIFhLX0dyZWVrX3N3aXRjaCAgICAgICAgICAgICAgICAgIDB4ZmY3ZSAgLyogQWxpYXMgZm9yIG1vZGVfc3dpdGNoICovCisjZW5kaWYgLyogWEtfR1JFRUsgKi8KKworLyoKKyAqIFRlY2huaWNhbAorICogKGZyb20gdGhlIERFQyBWVDMzMC9WVDQyMCBUZWNobmljYWwgQ2hhcmFjdGVyIFNldCwgaHR0cDovL3Z0MTAwLm5ldC9jaGFyc2V0cy90ZWNobmljYWwuaHRtbCkKKyAqIEJ5dGUgMyA9IDgKKyAqLworCisjaWZkZWYgWEtfVEVDSE5JQ0FMCisjZGVmaW5lIFhLX2xlZnRyYWRpY2FsICAgICAgICAgICAgICAgICAgIDB4MDhhMSAgLyogVSsyM0I3IFJBRElDQUwgU1lNQk9MIEJPVFRPTSAqLworI2RlZmluZSBYS190b3BsZWZ0cmFkaWNhbCAgICAgICAgICAgICAgICAweDA4YTIgIC8qKFUrMjUwQyBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQpKi8KKyNkZWZpbmUgWEtfaG9yaXpjb25uZWN0b3IgICAgICAgICAgICAgICAgMHgwOGEzICAvKihVKzI1MDAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwpKi8KKyNkZWZpbmUgWEtfdG9waW50ZWdyYWwgICAgICAgICAgICAgICAgICAgMHgwOGE0ICAvKiBVKzIzMjAgVE9QIEhBTEYgSU5URUdSQUwgKi8KKyNkZWZpbmUgWEtfYm90aW50ZWdyYWwgICAgICAgICAgICAgICAgICAgMHgwOGE1ICAvKiBVKzIzMjEgQk9UVE9NIEhBTEYgSU5URUdSQUwgKi8KKyNkZWZpbmUgWEtfdmVydGNvbm5lY3RvciAgICAgICAgICAgICAgICAgMHgwOGE2ICAvKihVKzI1MDIgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMKSovCisjZGVmaW5lIFhLX3RvcGxlZnRzcWJyYWNrZXQgICAgICAgICAgICAgIDB4MDhhNyAgLyogVSsyM0ExIExFRlQgU1FVQVJFIEJSQUNLRVQgVVBQRVIgQ09STkVSICovCisjZGVmaW5lIFhLX2JvdGxlZnRzcWJyYWNrZXQgICAgICAgICAgICAgIDB4MDhhOCAgLyogVSsyM0EzIExFRlQgU1FVQVJFIEJSQUNLRVQgTE9XRVIgQ09STkVSICovCisjZGVmaW5lIFhLX3RvcHJpZ2h0c3FicmFja2V0ICAgICAgICAgICAgIDB4MDhhOSAgLyogVSsyM0E0IFJJR0hUIFNRVUFSRSBCUkFDS0VUIFVQUEVSIENPUk5FUiAqLworI2RlZmluZSBYS19ib3RyaWdodHNxYnJhY2tldCAgICAgICAgICAgICAweDA4YWEgIC8qIFUrMjNBNiBSSUdIVCBTUVVBUkUgQlJBQ0tFVCBMT1dFUiBDT1JORVIgKi8KKyNkZWZpbmUgWEtfdG9wbGVmdHBhcmVucyAgICAgICAgICAgICAgICAgMHgwOGFiICAvKiBVKzIzOUIgTEVGVCBQQVJFTlRIRVNJUyBVUFBFUiBIT09LICovCisjZGVmaW5lIFhLX2JvdGxlZnRwYXJlbnMgICAgICAgICAgICAgICAgIDB4MDhhYyAgLyogVSsyMzlEIExFRlQgUEFSRU5USEVTSVMgTE9XRVIgSE9PSyAqLworI2RlZmluZSBYS190b3ByaWdodHBhcmVucyAgICAgICAgICAgICAgICAweDA4YWQgIC8qIFUrMjM5RSBSSUdIVCBQQVJFTlRIRVNJUyBVUFBFUiBIT09LICovCisjZGVmaW5lIFhLX2JvdHJpZ2h0cGFyZW5zICAgICAgICAgICAgICAgIDB4MDhhZSAgLyogVSsyM0EwIFJJR0hUIFBBUkVOVEhFU0lTIExPV0VSIEhPT0sgKi8KKyNkZWZpbmUgWEtfbGVmdG1pZGRsZWN1cmx5YnJhY2UgICAgICAgICAgMHgwOGFmICAvKiBVKzIzQTggTEVGVCBDVVJMWSBCUkFDS0VUIE1JRERMRSBQSUVDRSAqLworI2RlZmluZSBYS19yaWdodG1pZGRsZWN1cmx5YnJhY2UgICAgICAgICAweDA4YjAgIC8qIFUrMjNBQyBSSUdIVCBDVVJMWSBCUkFDS0VUIE1JRERMRSBQSUVDRSAqLworI2RlZmluZSBYS190b3BsZWZ0c3VtbWF0aW9uICAgICAgICAgICAgICAweDA4YjEKKyNkZWZpbmUgWEtfYm90bGVmdHN1bW1hdGlvbiAgICAgICAgICAgICAgMHgwOGIyCisjZGVmaW5lIFhLX3RvcHZlcnRzdW1tYXRpb25jb25uZWN0b3IgICAgIDB4MDhiMworI2RlZmluZSBYS19ib3R2ZXJ0c3VtbWF0aW9uY29ubmVjdG9yICAgICAweDA4YjQKKyNkZWZpbmUgWEtfdG9wcmlnaHRzdW1tYXRpb24gICAgICAgICAgICAgMHgwOGI1CisjZGVmaW5lIFhLX2JvdHJpZ2h0c3VtbWF0aW9uICAgICAgICAgICAgIDB4MDhiNgorI2RlZmluZSBYS19yaWdodG1pZGRsZXN1bW1hdGlvbiAgICAgICAgICAweDA4YjcKKyNkZWZpbmUgWEtfbGVzc3RoYW5lcXVhbCAgICAgICAgICAgICAgICAgMHgwOGJjICAvKiBVKzIyNjQgTEVTUy1USEFOIE9SIEVRVUFMIFRPICovCisjZGVmaW5lIFhLX25vdGVxdWFsICAgICAgICAgICAgICAgICAgICAgIDB4MDhiZCAgLyogVSsyMjYwIE5PVCBFUVVBTCBUTyAqLworI2RlZmluZSBYS19ncmVhdGVydGhhbmVxdWFsICAgICAgICAgICAgICAweDA4YmUgIC8qIFUrMjI2NSBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8gKi8KKyNkZWZpbmUgWEtfaW50ZWdyYWwgICAgICAgICAgICAgICAgICAgICAgMHgwOGJmICAvKiBVKzIyMkIgSU5URUdSQUwgKi8KKyNkZWZpbmUgWEtfdGhlcmVmb3JlICAgICAgICAgICAgICAgICAgICAgMHgwOGMwICAvKiBVKzIyMzQgVEhFUkVGT1JFICovCisjZGVmaW5lIFhLX3ZhcmlhdGlvbiAgICAgICAgICAgICAgICAgICAgIDB4MDhjMSAgLyogVSsyMjFEIFBST1BPUlRJT05BTCBUTyAqLworI2RlZmluZSBYS19pbmZpbml0eSAgICAgICAgICAgICAgICAgICAgICAweDA4YzIgIC8qIFUrMjIxRSBJTkZJTklUWSAqLworI2RlZmluZSBYS19uYWJsYSAgICAgICAgICAgICAgICAgICAgICAgICAweDA4YzUgIC8qIFUrMjIwNyBOQUJMQSAqLworI2RlZmluZSBYS19hcHByb3hpbWF0ZSAgICAgICAgICAgICAgICAgICAweDA4YzggIC8qIFUrMjIzQyBUSUxERSBPUEVSQVRPUiAqLworI2RlZmluZSBYS19zaW1pbGFyZXF1YWwgICAgICAgICAgICAgICAgICAweDA4YzkgIC8qIFUrMjI0MyBBU1lNUFRPVElDQUxMWSBFUVVBTCBUTyAqLworI2RlZmluZSBYS19pZm9ubHlpZiAgICAgICAgICAgICAgICAgICAgICAweDA4Y2QgIC8qIFUrMjFENCBMRUZUIFJJR0hUIERPVUJMRSBBUlJPVyAqLworI2RlZmluZSBYS19pbXBsaWVzICAgICAgICAgICAgICAgICAgICAgICAweDA4Y2UgIC8qIFUrMjFEMiBSSUdIVFdBUkRTIERPVUJMRSBBUlJPVyAqLworI2RlZmluZSBYS19pZGVudGljYWwgICAgICAgICAgICAgICAgICAgICAweDA4Y2YgIC8qIFUrMjI2MSBJREVOVElDQUwgVE8gKi8KKyNkZWZpbmUgWEtfcmFkaWNhbCAgICAgICAgICAgICAgICAgICAgICAgMHgwOGQ2ICAvKiBVKzIyMUEgU1FVQVJFIFJPT1QgKi8KKyNkZWZpbmUgWEtfaW5jbHVkZWRpbiAgICAgICAgICAgICAgICAgICAgMHgwOGRhICAvKiBVKzIyODIgU1VCU0VUIE9GICovCisjZGVmaW5lIFhLX2luY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgIDB4MDhkYiAgLyogVSsyMjgzIFNVUEVSU0VUIE9GICovCisjZGVmaW5lIFhLX2ludGVyc2VjdGlvbiAgICAgICAgICAgICAgICAgIDB4MDhkYyAgLyogVSsyMjI5IElOVEVSU0VDVElPTiAqLworI2RlZmluZSBYS191bmlvbiAgICAgICAgICAgICAgICAgICAgICAgICAweDA4ZGQgIC8qIFUrMjIyQSBVTklPTiAqLworI2RlZmluZSBYS19sb2dpY2FsYW5kICAgICAgICAgICAgICAgICAgICAweDA4ZGUgIC8qIFUrMjIyNyBMT0dJQ0FMIEFORCAqLworI2RlZmluZSBYS19sb2dpY2Fsb3IgICAgICAgICAgICAgICAgICAgICAweDA4ZGYgIC8qIFUrMjIyOCBMT0dJQ0FMIE9SICovCisjZGVmaW5lIFhLX3BhcnRpYWxkZXJpdmF0aXZlICAgICAgICAgICAgIDB4MDhlZiAgLyogVSsyMjAyIFBBUlRJQUwgRElGRkVSRU5USUFMICovCisjZGVmaW5lIFhLX2Z1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgIDB4MDhmNiAgLyogVSswMTkyIExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSyAqLworI2RlZmluZSBYS19sZWZ0YXJyb3cgICAgICAgICAgICAgICAgICAgICAweDA4ZmIgIC8qIFUrMjE5MCBMRUZUV0FSRFMgQVJST1cgKi8KKyNkZWZpbmUgWEtfdXBhcnJvdyAgICAgICAgICAgICAgICAgICAgICAgMHgwOGZjICAvKiBVKzIxOTEgVVBXQVJEUyBBUlJPVyAqLworI2RlZmluZSBYS19yaWdodGFycm93ICAgICAgICAgICAgICAgICAgICAweDA4ZmQgIC8qIFUrMjE5MiBSSUdIVFdBUkRTIEFSUk9XICovCisjZGVmaW5lIFhLX2Rvd25hcnJvdyAgICAgICAgICAgICAgICAgICAgIDB4MDhmZSAgLyogVSsyMTkzIERPV05XQVJEUyBBUlJPVyAqLworI2VuZGlmIC8qIFhLX1RFQ0hOSUNBTCAqLworCisvKgorICogU3BlY2lhbAorICogKGZyb20gdGhlIERFQyBWVDEwMCBTcGVjaWFsIEdyYXBoaWNzIENoYXJhY3RlciBTZXQpCisgKiBCeXRlIDMgPSA5CisgKi8KKworI2lmZGVmIFhLX1NQRUNJQUwKKyNkZWZpbmUgWEtfYmxhbmsgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOWRmCisjZGVmaW5lIFhLX3NvbGlkZGlhbW9uZCAgICAgICAgICAgICAgICAgIDB4MDllMCAgLyogVSsyNUM2IEJMQUNLIERJQU1PTkQgKi8KKyNkZWZpbmUgWEtfY2hlY2tlcmJvYXJkICAgICAgICAgICAgICAgICAgMHgwOWUxICAvKiBVKzI1OTIgTUVESVVNIFNIQURFICovCisjZGVmaW5lIFhLX2h0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDllMiAgLyogVSsyNDA5IFNZTUJPTCBGT1IgSE9SSVpPTlRBTCBUQUJVTEFUSU9OICovCisjZGVmaW5lIFhLX2ZmICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDllMyAgLyogVSsyNDBDIFNZTUJPTCBGT1IgRk9STSBGRUVEICovCisjZGVmaW5lIFhLX2NyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDllNCAgLyogVSsyNDBEIFNZTUJPTCBGT1IgQ0FSUklBR0UgUkVUVVJOICovCisjZGVmaW5lIFhLX2xmICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDllNSAgLyogVSsyNDBBIFNZTUJPTCBGT1IgTElORSBGRUVEICovCisjZGVmaW5lIFhLX25sICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDllOCAgLyogVSsyNDI0IFNZTUJPTCBGT1IgTkVXTElORSAqLworI2RlZmluZSBYS192dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5ZTkgIC8qIFUrMjQwQiBTWU1CT0wgRk9SIFZFUlRJQ0FMIFRBQlVMQVRJT04gKi8KKyNkZWZpbmUgWEtfbG93cmlnaHRjb3JuZXIgICAgICAgICAgICAgICAgMHgwOWVhICAvKiBVKzI1MTggQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUICovCisjZGVmaW5lIFhLX3VwcmlnaHRjb3JuZXIgICAgICAgICAgICAgICAgIDB4MDllYiAgLyogVSsyNTEwIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUICovCisjZGVmaW5lIFhLX3VwbGVmdGNvcm5lciAgICAgICAgICAgICAgICAgIDB4MDllYyAgLyogVSsyNTBDIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVCAqLworI2RlZmluZSBYS19sb3dsZWZ0Y29ybmVyICAgICAgICAgICAgICAgICAweDA5ZWQgIC8qIFUrMjUxNCBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUICovCisjZGVmaW5lIFhLX2Nyb3NzaW5nbGluZXMgICAgICAgICAgICAgICAgIDB4MDllZSAgLyogVSsyNTNDIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTCAqLworI2RlZmluZSBYS19ob3JpemxpbmVzY2FuMSAgICAgICAgICAgICAgICAweDA5ZWYgIC8qIFUrMjNCQSBIT1JJWk9OVEFMIFNDQU4gTElORS0xICovCisjZGVmaW5lIFhLX2hvcml6bGluZXNjYW4zICAgICAgICAgICAgICAgIDB4MDlmMCAgLyogVSsyM0JCIEhPUklaT05UQUwgU0NBTiBMSU5FLTMgKi8KKyNkZWZpbmUgWEtfaG9yaXpsaW5lc2NhbjUgICAgICAgICAgICAgICAgMHgwOWYxICAvKiBVKzI1MDAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwgKi8KKyNkZWZpbmUgWEtfaG9yaXpsaW5lc2NhbjcgICAgICAgICAgICAgICAgMHgwOWYyICAvKiBVKzIzQkMgSE9SSVpPTlRBTCBTQ0FOIExJTkUtNyAqLworI2RlZmluZSBYS19ob3JpemxpbmVzY2FuOSAgICAgICAgICAgICAgICAweDA5ZjMgIC8qIFUrMjNCRCBIT1JJWk9OVEFMIFNDQU4gTElORS05ICovCisjZGVmaW5lIFhLX2xlZnR0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDlmNCAgLyogVSsyNTFDIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQgKi8KKyNkZWZpbmUgWEtfcmlnaHR0ICAgICAgICAgICAgICAgICAgICAgICAgMHgwOWY1ICAvKiBVKzI1MjQgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUICovCisjZGVmaW5lIFhLX2JvdHQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDlmNiAgLyogVSsyNTM0IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTCAqLworI2RlZmluZSBYS190b3B0ICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5ZjcgIC8qIFUrMjUyQyBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTCAqLworI2RlZmluZSBYS192ZXJ0YmFyICAgICAgICAgICAgICAgICAgICAgICAweDA5ZjggIC8qIFUrMjUwMiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgKi8KKyNlbmRpZiAvKiBYS19TUEVDSUFMICovCisKKy8qCisgKiBQdWJsaXNoaW5nCisgKiAodGhlc2UgYXJlIHByb2JhYmx5IGZyb20gYSBsb25nIGZvcmdvdHRlbiBERUMgUHVibGlzaGluZworICogZm9udCB0aGF0IG9uY2Ugc2hpcHBlZCB3aXRoIERFQ3dyaXRlKQorICogQnl0ZSAzID0gMHgwYQorICovCisKKyNpZmRlZiBYS19QVUJMSVNISU5HCisjZGVmaW5lIFhLX2Vtc3BhY2UgICAgICAgICAgICAgICAgICAgICAgIDB4MGFhMSAgLyogVSsyMDAzIEVNIFNQQUNFICovCisjZGVmaW5lIFhLX2Vuc3BhY2UgICAgICAgICAgICAgICAgICAgICAgIDB4MGFhMiAgLyogVSsyMDAyIEVOIFNQQUNFICovCisjZGVmaW5lIFhLX2VtM3NwYWNlICAgICAgICAgICAgICAgICAgICAgIDB4MGFhMyAgLyogVSsyMDA0IFRIUkVFLVBFUi1FTSBTUEFDRSAqLworI2RlZmluZSBYS19lbTRzcGFjZSAgICAgICAgICAgICAgICAgICAgICAweDBhYTQgIC8qIFUrMjAwNSBGT1VSLVBFUi1FTSBTUEFDRSAqLworI2RlZmluZSBYS19kaWdpdHNwYWNlICAgICAgICAgICAgICAgICAgICAweDBhYTUgIC8qIFUrMjAwNyBGSUdVUkUgU1BBQ0UgKi8KKyNkZWZpbmUgWEtfcHVuY3RzcGFjZSAgICAgICAgICAgICAgICAgICAgMHgwYWE2ICAvKiBVKzIwMDggUFVOQ1RVQVRJT04gU1BBQ0UgKi8KKyNkZWZpbmUgWEtfdGhpbnNwYWNlICAgICAgICAgICAgICAgICAgICAgMHgwYWE3ICAvKiBVKzIwMDkgVEhJTiBTUEFDRSAqLworI2RlZmluZSBYS19oYWlyc3BhY2UgICAgICAgICAgICAgICAgICAgICAweDBhYTggIC8qIFUrMjAwQSBIQUlSIFNQQUNFICovCisjZGVmaW5lIFhLX2VtZGFzaCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGFhOSAgLyogVSsyMDE0IEVNIERBU0ggKi8KKyNkZWZpbmUgWEtfZW5kYXNoICAgICAgICAgICAgICAgICAgICAgICAgMHgwYWFhICAvKiBVKzIwMTMgRU4gREFTSCAqLworI2RlZmluZSBYS19zaWduaWZibGFuayAgICAgICAgICAgICAgICAgICAweDBhYWMgIC8qKFUrMjQyMyBPUEVOIEJPWCkqLworI2RlZmluZSBYS19lbGxpcHNpcyAgICAgICAgICAgICAgICAgICAgICAweDBhYWUgIC8qIFUrMjAyNiBIT1JJWk9OVEFMIEVMTElQU0lTICovCisjZGVmaW5lIFhLX2RvdWJiYXNlbGluZWRvdCAgICAgICAgICAgICAgIDB4MGFhZiAgLyogVSsyMDI1IFRXTyBET1QgTEVBREVSICovCisjZGVmaW5lIFhLX29uZXRoaXJkICAgICAgICAgICAgICAgICAgICAgIDB4MGFiMCAgLyogVSsyMTUzIFZVTEdBUiBGUkFDVElPTiBPTkUgVEhJUkQgKi8KKyNkZWZpbmUgWEtfdHdvdGhpcmRzICAgICAgICAgICAgICAgICAgICAgMHgwYWIxICAvKiBVKzIxNTQgVlVMR0FSIEZSQUNUSU9OIFRXTyBUSElSRFMgKi8KKyNkZWZpbmUgWEtfb25lZmlmdGggICAgICAgICAgICAgICAgICAgICAgMHgwYWIyICAvKiBVKzIxNTUgVlVMR0FSIEZSQUNUSU9OIE9ORSBGSUZUSCAqLworI2RlZmluZSBYS190d29maWZ0aHMgICAgICAgICAgICAgICAgICAgICAweDBhYjMgIC8qIFUrMjE1NiBWVUxHQVIgRlJBQ1RJT04gVFdPIEZJRlRIUyAqLworI2RlZmluZSBYS190aHJlZWZpZnRocyAgICAgICAgICAgICAgICAgICAweDBhYjQgIC8qIFUrMjE1NyBWVUxHQVIgRlJBQ1RJT04gVEhSRUUgRklGVEhTICovCisjZGVmaW5lIFhLX2ZvdXJmaWZ0aHMgICAgICAgICAgICAgICAgICAgIDB4MGFiNSAgLyogVSsyMTU4IFZVTEdBUiBGUkFDVElPTiBGT1VSIEZJRlRIUyAqLworI2RlZmluZSBYS19vbmVzaXh0aCAgICAgICAgICAgICAgICAgICAgICAweDBhYjYgIC8qIFUrMjE1OSBWVUxHQVIgRlJBQ1RJT04gT05FIFNJWFRIICovCisjZGVmaW5lIFhLX2ZpdmVzaXh0aHMgICAgICAgICAgICAgICAgICAgIDB4MGFiNyAgLyogVSsyMTVBIFZVTEdBUiBGUkFDVElPTiBGSVZFIFNJWFRIUyAqLworI2RlZmluZSBYS19jYXJlb2YgICAgICAgICAgICAgICAgICAgICAgICAweDBhYjggIC8qIFUrMjEwNSBDQVJFIE9GICovCisjZGVmaW5lIFhLX2ZpZ2Rhc2ggICAgICAgICAgICAgICAgICAgICAgIDB4MGFiYiAgLyogVSsyMDEyIEZJR1VSRSBEQVNIICovCisjZGVmaW5lIFhLX2xlZnRhbmdsZWJyYWNrZXQgICAgICAgICAgICAgIDB4MGFiYyAgLyooVSsyN0U4IE1BVEhFTUFUSUNBTCBMRUZUIEFOR0xFIEJSQUNLRVQpKi8KKyNkZWZpbmUgWEtfZGVjaW1hbHBvaW50ICAgICAgICAgICAgICAgICAgMHgwYWJkICAvKihVKzAwMkUgRlVMTCBTVE9QKSovCisjZGVmaW5lIFhLX3JpZ2h0YW5nbGVicmFja2V0ICAgICAgICAgICAgIDB4MGFiZSAgLyooVSsyN0U5IE1BVEhFTUFUSUNBTCBSSUdIVCBBTkdMRSBCUkFDS0VUKSovCisjZGVmaW5lIFhLX21hcmtlciAgICAgICAgICAgICAgICAgICAgICAgIDB4MGFiZgorI2RlZmluZSBYS19vbmVlaWdodGggICAgICAgICAgICAgICAgICAgICAweDBhYzMgIC8qIFUrMjE1QiBWVUxHQVIgRlJBQ1RJT04gT05FIEVJR0hUSCAqLworI2RlZmluZSBYS190aHJlZWVpZ2h0aHMgICAgICAgICAgICAgICAgICAweDBhYzQgIC8qIFUrMjE1QyBWVUxHQVIgRlJBQ1RJT04gVEhSRUUgRUlHSFRIUyAqLworI2RlZmluZSBYS19maXZlZWlnaHRocyAgICAgICAgICAgICAgICAgICAweDBhYzUgIC8qIFUrMjE1RCBWVUxHQVIgRlJBQ1RJT04gRklWRSBFSUdIVEhTICovCisjZGVmaW5lIFhLX3NldmVuZWlnaHRocyAgICAgICAgICAgICAgICAgIDB4MGFjNiAgLyogVSsyMTVFIFZVTEdBUiBGUkFDVElPTiBTRVZFTiBFSUdIVEhTICovCisjZGVmaW5lIFhLX3RyYWRlbWFyayAgICAgICAgICAgICAgICAgICAgIDB4MGFjOSAgLyogVSsyMTIyIFRSQURFIE1BUksgU0lHTiAqLworI2RlZmluZSBYS19zaWduYXR1cmVtYXJrICAgICAgICAgICAgICAgICAweDBhY2EgIC8qKFUrMjYxMyBTQUxUSVJFKSovCisjZGVmaW5lIFhLX3RyYWRlbWFya2luY2lyY2xlICAgICAgICAgICAgIDB4MGFjYgorI2RlZmluZSBYS19sZWZ0b3BlbnRyaWFuZ2xlICAgICAgICAgICAgICAweDBhY2MgIC8qKFUrMjVDMSBXSElURSBMRUZULVBPSU5USU5HIFRSSUFOR0xFKSovCisjZGVmaW5lIFhLX3JpZ2h0b3BlbnRyaWFuZ2xlICAgICAgICAgICAgIDB4MGFjZCAgLyooVSsyNUI3IFdISVRFIFJJR0hULVBPSU5USU5HIFRSSUFOR0xFKSovCisjZGVmaW5lIFhLX2Vtb3BlbmNpcmNsZSAgICAgICAgICAgICAgICAgIDB4MGFjZSAgLyooVSsyNUNCIFdISVRFIENJUkNMRSkqLworI2RlZmluZSBYS19lbW9wZW5yZWN0YW5nbGUgICAgICAgICAgICAgICAweDBhY2YgIC8qKFUrMjVBRiBXSElURSBWRVJUSUNBTCBSRUNUQU5HTEUpKi8KKyNkZWZpbmUgWEtfbGVmdHNpbmdsZXF1b3RlbWFyayAgICAgICAgICAgMHgwYWQwICAvKiBVKzIwMTggTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KKyNkZWZpbmUgWEtfcmlnaHRzaW5nbGVxdW90ZW1hcmsgICAgICAgICAgMHgwYWQxICAvKiBVKzIwMTkgUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLICovCisjZGVmaW5lIFhLX2xlZnRkb3VibGVxdW90ZW1hcmsgICAgICAgICAgIDB4MGFkMiAgLyogVSsyMDFDIExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLICovCisjZGVmaW5lIFhLX3JpZ2h0ZG91YmxlcXVvdGVtYXJrICAgICAgICAgIDB4MGFkMyAgLyogVSsyMDFEIFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSyAqLworI2RlZmluZSBYS19wcmVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAweDBhZDQgIC8qIFUrMjExRSBQUkVTQ1JJUFRJT04gVEFLRSAqLworI2RlZmluZSBYS19taW51dGVzICAgICAgICAgICAgICAgICAgICAgICAweDBhZDYgIC8qIFUrMjAzMiBQUklNRSAqLworI2RlZmluZSBYS19zZWNvbmRzICAgICAgICAgICAgICAgICAgICAgICAweDBhZDcgIC8qIFUrMjAzMyBET1VCTEUgUFJJTUUgKi8KKyNkZWZpbmUgWEtfbGF0aW5jcm9zcyAgICAgICAgICAgICAgICAgICAgMHgwYWQ5ICAvKiBVKzI3MUQgTEFUSU4gQ1JPU1MgKi8KKyNkZWZpbmUgWEtfaGV4YWdyYW0gICAgICAgICAgICAgICAgICAgICAgMHgwYWRhCisjZGVmaW5lIFhLX2ZpbGxlZHJlY3RidWxsZXQgICAgICAgICAgICAgIDB4MGFkYiAgLyooVSsyNUFDIEJMQUNLIFJFQ1RBTkdMRSkqLworI2RlZmluZSBYS19maWxsZWRsZWZ0dHJpYnVsbGV0ICAgICAgICAgICAweDBhZGMgIC8qKFUrMjVDMCBCTEFDSyBMRUZULVBPSU5USU5HIFRSSUFOR0xFKSovCisjZGVmaW5lIFhLX2ZpbGxlZHJpZ2h0dHJpYnVsbGV0ICAgICAgICAgIDB4MGFkZCAgLyooVSsyNUI2IEJMQUNLIFJJR0hULVBPSU5USU5HIFRSSUFOR0xFKSovCisjZGVmaW5lIFhLX2VtZmlsbGVkY2lyY2xlICAgICAgICAgICAgICAgIDB4MGFkZSAgLyooVSsyNUNGIEJMQUNLIENJUkNMRSkqLworI2RlZmluZSBYS19lbWZpbGxlZHJlY3QgICAgICAgICAgICAgICAgICAweDBhZGYgIC8qKFUrMjVBRSBCTEFDSyBWRVJUSUNBTCBSRUNUQU5HTEUpKi8KKyNkZWZpbmUgWEtfZW5vcGVuY2lyY2J1bGxldCAgICAgICAgICAgICAgMHgwYWUwICAvKihVKzI1RTYgV0hJVEUgQlVMTEVUKSovCisjZGVmaW5lIFhLX2Vub3BlbnNxdWFyZWJ1bGxldCAgICAgICAgICAgIDB4MGFlMSAgLyooVSsyNUFCIFdISVRFIFNNQUxMIFNRVUFSRSkqLworI2RlZmluZSBYS19vcGVucmVjdGJ1bGxldCAgICAgICAgICAgICAgICAweDBhZTIgIC8qKFUrMjVBRCBXSElURSBSRUNUQU5HTEUpKi8KKyNkZWZpbmUgWEtfb3BlbnRyaWJ1bGxldHVwICAgICAgICAgICAgICAgMHgwYWUzICAvKihVKzI1QjMgV0hJVEUgVVAtUE9JTlRJTkcgVFJJQU5HTEUpKi8KKyNkZWZpbmUgWEtfb3BlbnRyaWJ1bGxldGRvd24gICAgICAgICAgICAgMHgwYWU0ICAvKihVKzI1QkQgV0hJVEUgRE9XTi1QT0lOVElORyBUUklBTkdMRSkqLworI2RlZmluZSBYS19vcGVuc3RhciAgICAgICAgICAgICAgICAgICAgICAweDBhZTUgIC8qKFUrMjYwNiBXSElURSBTVEFSKSovCisjZGVmaW5lIFhLX2VuZmlsbGVkY2lyY2J1bGxldCAgICAgICAgICAgIDB4MGFlNiAgLyooVSsyMDIyIEJVTExFVCkqLworI2RlZmluZSBYS19lbmZpbGxlZHNxYnVsbGV0ICAgICAgICAgICAgICAweDBhZTcgIC8qKFUrMjVBQSBCTEFDSyBTTUFMTCBTUVVBUkUpKi8KKyNkZWZpbmUgWEtfZmlsbGVkdHJpYnVsbGV0dXAgICAgICAgICAgICAgMHgwYWU4ICAvKihVKzI1QjIgQkxBQ0sgVVAtUE9JTlRJTkcgVFJJQU5HTEUpKi8KKyNkZWZpbmUgWEtfZmlsbGVkdHJpYnVsbGV0ZG93biAgICAgICAgICAgMHgwYWU5ICAvKihVKzI1QkMgQkxBQ0sgRE9XTi1QT0lOVElORyBUUklBTkdMRSkqLworI2RlZmluZSBYS19sZWZ0cG9pbnRlciAgICAgICAgICAgICAgICAgICAweDBhZWEgIC8qKFUrMjYxQyBXSElURSBMRUZUIFBPSU5USU5HIElOREVYKSovCisjZGVmaW5lIFhLX3JpZ2h0cG9pbnRlciAgICAgICAgICAgICAgICAgIDB4MGFlYiAgLyooVSsyNjFFIFdISVRFIFJJR0hUIFBPSU5USU5HIElOREVYKSovCisjZGVmaW5lIFhLX2NsdWIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGFlYyAgLyogVSsyNjYzIEJMQUNLIENMVUIgU1VJVCAqLworI2RlZmluZSBYS19kaWFtb25kICAgICAgICAgICAgICAgICAgICAgICAweDBhZWQgIC8qIFUrMjY2NiBCTEFDSyBESUFNT05EIFNVSVQgKi8KKyNkZWZpbmUgWEtfaGVhcnQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYWVlICAvKiBVKzI2NjUgQkxBQ0sgSEVBUlQgU1VJVCAqLworI2RlZmluZSBYS19tYWx0ZXNlY3Jvc3MgICAgICAgICAgICAgICAgICAweDBhZjAgIC8qIFUrMjcyMCBNQUxURVNFIENST1NTICovCisjZGVmaW5lIFhLX2RhZ2dlciAgICAgICAgICAgICAgICAgICAgICAgIDB4MGFmMSAgLyogVSsyMDIwIERBR0dFUiAqLworI2RlZmluZSBYS19kb3VibGVkYWdnZXIgICAgICAgICAgICAgICAgICAweDBhZjIgIC8qIFUrMjAyMSBET1VCTEUgREFHR0VSICovCisjZGVmaW5lIFhLX2NoZWNrbWFyayAgICAgICAgICAgICAgICAgICAgIDB4MGFmMyAgLyogVSsyNzEzIENIRUNLIE1BUksgKi8KKyNkZWZpbmUgWEtfYmFsbG90Y3Jvc3MgICAgICAgICAgICAgICAgICAgMHgwYWY0ICAvKiBVKzI3MTcgQkFMTE9UIFggKi8KKyNkZWZpbmUgWEtfbXVzaWNhbHNoYXJwICAgICAgICAgICAgICAgICAgMHgwYWY1ICAvKiBVKzI2NkYgTVVTSUMgU0hBUlAgU0lHTiAqLworI2RlZmluZSBYS19tdXNpY2FsZmxhdCAgICAgICAgICAgICAgICAgICAweDBhZjYgIC8qIFUrMjY2RCBNVVNJQyBGTEFUIFNJR04gKi8KKyNkZWZpbmUgWEtfbWFsZXN5bWJvbCAgICAgICAgICAgICAgICAgICAgMHgwYWY3ICAvKiBVKzI2NDIgTUFMRSBTSUdOICovCisjZGVmaW5lIFhLX2ZlbWFsZXN5bWJvbCAgICAgICAgICAgICAgICAgIDB4MGFmOCAgLyogVSsyNjQwIEZFTUFMRSBTSUdOICovCisjZGVmaW5lIFhLX3RlbGVwaG9uZSAgICAgICAgICAgICAgICAgICAgIDB4MGFmOSAgLyogVSsyNjBFIEJMQUNLIFRFTEVQSE9ORSAqLworI2RlZmluZSBYS190ZWxlcGhvbmVyZWNvcmRlciAgICAgICAgICAgICAweDBhZmEgIC8qIFUrMjMxNSBURUxFUEhPTkUgUkVDT1JERVIgKi8KKyNkZWZpbmUgWEtfcGhvbm9ncmFwaGNvcHlyaWdodCAgICAgICAgICAgMHgwYWZiICAvKiBVKzIxMTcgU09VTkQgUkVDT1JESU5HIENPUFlSSUdIVCAqLworI2RlZmluZSBYS19jYXJldCAgICAgICAgICAgICAgICAgICAgICAgICAweDBhZmMgIC8qIFUrMjAzOCBDQVJFVCAqLworI2RlZmluZSBYS19zaW5nbGVsb3dxdW90ZW1hcmsgICAgICAgICAgICAweDBhZmQgIC8qIFUrMjAxQSBTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksgKi8KKyNkZWZpbmUgWEtfZG91YmxlbG93cXVvdGVtYXJrICAgICAgICAgICAgMHgwYWZlICAvKiBVKzIwMUUgRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLICovCisjZGVmaW5lIFhLX2N1cnNvciAgICAgICAgICAgICAgICAgICAgICAgIDB4MGFmZgorI2VuZGlmIC8qIFhLX1BVQkxJU0hJTkcgKi8KKworLyoKKyAqIEFQTAorICogQnl0ZSAzID0gMHgwYgorICovCisKKyNpZmRlZiBYS19BUEwKKyNkZWZpbmUgWEtfbGVmdGNhcmV0ICAgICAgICAgICAgICAgICAgICAgMHgwYmEzICAvKihVKzAwM0MgTEVTUy1USEFOIFNJR04pKi8KKyNkZWZpbmUgWEtfcmlnaHRjYXJldCAgICAgICAgICAgICAgICAgICAgMHgwYmE2ICAvKihVKzAwM0UgR1JFQVRFUi1USEFOIFNJR04pKi8KKyNkZWZpbmUgWEtfZG93bmNhcmV0ICAgICAgICAgICAgICAgICAgICAgMHgwYmE4ICAvKihVKzIyMjggTE9HSUNBTCBPUikqLworI2RlZmluZSBYS191cGNhcmV0ICAgICAgICAgICAgICAgICAgICAgICAweDBiYTkgIC8qKFUrMjIyNyBMT0dJQ0FMIEFORCkqLworI2RlZmluZSBYS19vdmVyYmFyICAgICAgICAgICAgICAgICAgICAgICAweDBiYzAgIC8qKFUrMDBBRiBNQUNST04pKi8KKyNkZWZpbmUgWEtfZG93bnRhY2sgICAgICAgICAgICAgICAgICAgICAgMHgwYmMyICAvKiBVKzIyQTQgRE9XTiBUQUNLICovCisjZGVmaW5lIFhLX3Vwc2hvZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGJjMyAgLyooVSsyMjI5IElOVEVSU0VDVElPTikqLworI2RlZmluZSBYS19kb3duc3RpbGUgICAgICAgICAgICAgICAgICAgICAweDBiYzQgIC8qIFUrMjMwQSBMRUZUIEZMT09SICovCisjZGVmaW5lIFhLX3VuZGVyYmFyICAgICAgICAgICAgICAgICAgICAgIDB4MGJjNiAgLyooVSswMDVGIExPVyBMSU5FKSovCisjZGVmaW5lIFhLX2pvdCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGJjYSAgLyogVSsyMjE4IFJJTkcgT1BFUkFUT1IgKi8KKyNkZWZpbmUgWEtfcXVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYmNjICAvKiBVKzIzOTUgQVBMIEZVTkNUSU9OQUwgU1lNQk9MIFFVQUQgKi8KKyNkZWZpbmUgWEtfdXB0YWNrICAgICAgICAgICAgICAgICAgICAgICAgMHgwYmNlICAvKiBVKzIyQTUgVVAgVEFDSyAqLworI2RlZmluZSBYS19jaXJjbGUgICAgICAgICAgICAgICAgICAgICAgICAweDBiY2YgIC8qIFUrMjVDQiBXSElURSBDSVJDTEUgKi8KKyNkZWZpbmUgWEtfdXBzdGlsZSAgICAgICAgICAgICAgICAgICAgICAgMHgwYmQzICAvKiBVKzIzMDggTEVGVCBDRUlMSU5HICovCisjZGVmaW5lIFhLX2Rvd25zaG9lICAgICAgICAgICAgICAgICAgICAgIDB4MGJkNiAgLyooVSsyMjJBIFVOSU9OKSovCisjZGVmaW5lIFhLX3JpZ2h0c2hvZSAgICAgICAgICAgICAgICAgICAgIDB4MGJkOCAgLyooVSsyMjgzIFNVUEVSU0VUIE9GKSovCisjZGVmaW5lIFhLX2xlZnRzaG9lICAgICAgICAgICAgICAgICAgICAgIDB4MGJkYSAgLyooVSsyMjgyIFNVQlNFVCBPRikqLworI2RlZmluZSBYS19sZWZ0dGFjayAgICAgICAgICAgICAgICAgICAgICAweDBiZGMgIC8qIFUrMjJBMyBMRUZUIFRBQ0sgKi8KKyNkZWZpbmUgWEtfcmlnaHR0YWNrICAgICAgICAgICAgICAgICAgICAgMHgwYmZjICAvKiBVKzIyQTIgUklHSFQgVEFDSyAqLworI2VuZGlmIC8qIFhLX0FQTCAqLworCisvKgorICogSGVicmV3CisgKiBCeXRlIDMgPSAweDBjCisgKi8KKworI2lmZGVmIFhLX0hFQlJFVworI2RlZmluZSBYS19oZWJyZXdfZG91YmxlbG93bGluZSAgICAgICAgICAweDBjZGYgIC8qIFUrMjAxNyBET1VCTEUgTE9XIExJTkUgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2FsZXBoICAgICAgICAgICAgICAgICAgMHgwY2UwICAvKiBVKzA1RDAgSEVCUkVXIExFVFRFUiBBTEVGICovCisjZGVmaW5lIFhLX2hlYnJld19iZXQgICAgICAgICAgICAgICAgICAgIDB4MGNlMSAgLyogVSswNUQxIEhFQlJFVyBMRVRURVIgQkVUICovCisjZGVmaW5lIFhLX2hlYnJld19iZXRoICAgICAgICAgICAgICAgICAgIDB4MGNlMSAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19oZWJyZXdfZ2ltZWwgICAgICAgICAgICAgICAgICAweDBjZTIgIC8qIFUrMDVEMiBIRUJSRVcgTEVUVEVSIEdJTUVMICovCisjZGVmaW5lIFhLX2hlYnJld19naW1tZWwgICAgICAgICAgICAgICAgIDB4MGNlMiAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19oZWJyZXdfZGFsZXQgICAgICAgICAgICAgICAgICAweDBjZTMgIC8qIFUrMDVEMyBIRUJSRVcgTEVUVEVSIERBTEVUICovCisjZGVmaW5lIFhLX2hlYnJld19kYWxldGggICAgICAgICAgICAgICAgIDB4MGNlMyAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19oZWJyZXdfaGUgICAgICAgICAgICAgICAgICAgICAweDBjZTQgIC8qIFUrMDVENCBIRUJSRVcgTEVUVEVSIEhFICovCisjZGVmaW5lIFhLX2hlYnJld193YXcgICAgICAgICAgICAgICAgICAgIDB4MGNlNSAgLyogVSswNUQ1IEhFQlJFVyBMRVRURVIgVkFWICovCisjZGVmaW5lIFhLX2hlYnJld196YWluICAgICAgICAgICAgICAgICAgIDB4MGNlNiAgLyogVSswNUQ2IEhFQlJFVyBMRVRURVIgWkFZSU4gKi8KKyNkZWZpbmUgWEtfaGVicmV3X3pheWluICAgICAgICAgICAgICAgICAgMHgwY2U2ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2hlYnJld19jaGV0ICAgICAgICAgICAgICAgICAgIDB4MGNlNyAgLyogVSswNUQ3IEhFQlJFVyBMRVRURVIgSEVUICovCisjZGVmaW5lIFhLX2hlYnJld19oZXQgICAgICAgICAgICAgICAgICAgIDB4MGNlNyAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19oZWJyZXdfdGV0ICAgICAgICAgICAgICAgICAgICAweDBjZTggIC8qIFUrMDVEOCBIRUJSRVcgTEVUVEVSIFRFVCAqLworI2RlZmluZSBYS19oZWJyZXdfdGV0aCAgICAgICAgICAgICAgICAgICAweDBjZTggIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfaGVicmV3X3lvZCAgICAgICAgICAgICAgICAgICAgMHgwY2U5ICAvKiBVKzA1RDkgSEVCUkVXIExFVFRFUiBZT0QgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2ZpbmFsa2FwaCAgICAgICAgICAgICAgMHgwY2VhICAvKiBVKzA1REEgSEVCUkVXIExFVFRFUiBGSU5BTCBLQUYgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2thcGggICAgICAgICAgICAgICAgICAgMHgwY2ViICAvKiBVKzA1REIgSEVCUkVXIExFVFRFUiBLQUYgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2xhbWVkICAgICAgICAgICAgICAgICAgMHgwY2VjICAvKiBVKzA1REMgSEVCUkVXIExFVFRFUiBMQU1FRCAqLworI2RlZmluZSBYS19oZWJyZXdfZmluYWxtZW0gICAgICAgICAgICAgICAweDBjZWQgIC8qIFUrMDVERCBIRUJSRVcgTEVUVEVSIEZJTkFMIE1FTSAqLworI2RlZmluZSBYS19oZWJyZXdfbWVtICAgICAgICAgICAgICAgICAgICAweDBjZWUgIC8qIFUrMDVERSBIRUJSRVcgTEVUVEVSIE1FTSAqLworI2RlZmluZSBYS19oZWJyZXdfZmluYWxudW4gICAgICAgICAgICAgICAweDBjZWYgIC8qIFUrMDVERiBIRUJSRVcgTEVUVEVSIEZJTkFMIE5VTiAqLworI2RlZmluZSBYS19oZWJyZXdfbnVuICAgICAgICAgICAgICAgICAgICAweDBjZjAgIC8qIFUrMDVFMCBIRUJSRVcgTEVUVEVSIE5VTiAqLworI2RlZmluZSBYS19oZWJyZXdfc2FtZWNoICAgICAgICAgICAgICAgICAweDBjZjEgIC8qIFUrMDVFMSBIRUJSRVcgTEVUVEVSIFNBTUVLSCAqLworI2RlZmluZSBYS19oZWJyZXdfc2FtZWtoICAgICAgICAgICAgICAgICAweDBjZjEgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2F5aW4gICAgICAgICAgICAgICAgICAgMHgwY2YyICAvKiBVKzA1RTIgSEVCUkVXIExFVFRFUiBBWUlOICovCisjZGVmaW5lIFhLX2hlYnJld19maW5hbHBlICAgICAgICAgICAgICAgIDB4MGNmMyAgLyogVSswNUUzIEhFQlJFVyBMRVRURVIgRklOQUwgUEUgKi8KKyNkZWZpbmUgWEtfaGVicmV3X3BlICAgICAgICAgICAgICAgICAgICAgMHgwY2Y0ICAvKiBVKzA1RTQgSEVCUkVXIExFVFRFUiBQRSAqLworI2RlZmluZSBYS19oZWJyZXdfZmluYWx6YWRlICAgICAgICAgICAgICAweDBjZjUgIC8qIFUrMDVFNSBIRUJSRVcgTEVUVEVSIEZJTkFMIFRTQURJICovCisjZGVmaW5lIFhLX2hlYnJld19maW5hbHphZGkgICAgICAgICAgICAgIDB4MGNmNSAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19oZWJyZXdfemFkZSAgICAgICAgICAgICAgICAgICAweDBjZjYgIC8qIFUrMDVFNiBIRUJSRVcgTEVUVEVSIFRTQURJICovCisjZGVmaW5lIFhLX2hlYnJld196YWRpICAgICAgICAgICAgICAgICAgIDB4MGNmNiAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19oZWJyZXdfcW9waCAgICAgICAgICAgICAgICAgICAweDBjZjcgIC8qIFUrMDVFNyBIRUJSRVcgTEVUVEVSIFFPRiAqLworI2RlZmluZSBYS19oZWJyZXdfa3VmICAgICAgICAgICAgICAgICAgICAweDBjZjcgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfaGVicmV3X3Jlc2ggICAgICAgICAgICAgICAgICAgMHgwY2Y4ICAvKiBVKzA1RTggSEVCUkVXIExFVFRFUiBSRVNIICovCisjZGVmaW5lIFhLX2hlYnJld19zaGluICAgICAgICAgICAgICAgICAgIDB4MGNmOSAgLyogVSswNUU5IEhFQlJFVyBMRVRURVIgU0hJTiAqLworI2RlZmluZSBYS19oZWJyZXdfdGF3ICAgICAgICAgICAgICAgICAgICAweDBjZmEgIC8qIFUrMDVFQSBIRUJSRVcgTEVUVEVSIFRBViAqLworI2RlZmluZSBYS19oZWJyZXdfdGFmICAgICAgICAgICAgICAgICAgICAweDBjZmEgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfSGVicmV3X3N3aXRjaCAgICAgICAgICAgICAgICAgMHhmZjdlICAvKiBBbGlhcyBmb3IgbW9kZV9zd2l0Y2ggKi8KKyNlbmRpZiAvKiBYS19IRUJSRVcgKi8KKworLyoKKyAqIFRoYWkKKyAqIEJ5dGUgMyA9IDB4MGQKKyAqLworCisjaWZkZWYgWEtfVEhBSQorI2RlZmluZSBYS19UaGFpX2tva2FpICAgICAgICAgICAgICAgICAgICAweDBkYTEgIC8qIFUrMEUwMSBUSEFJIENIQVJBQ1RFUiBLTyBLQUkgKi8KKyNkZWZpbmUgWEtfVGhhaV9raG9raGFpICAgICAgICAgICAgICAgICAgMHgwZGEyICAvKiBVKzBFMDIgVEhBSSBDSEFSQUNURVIgS0hPIEtIQUkgKi8KKyNkZWZpbmUgWEtfVGhhaV9raG9raHVhdCAgICAgICAgICAgICAgICAgMHgwZGEzICAvKiBVKzBFMDMgVEhBSSBDSEFSQUNURVIgS0hPIEtIVUFUICovCisjZGVmaW5lIFhLX1RoYWlfa2hva2h3YWkgICAgICAgICAgICAgICAgIDB4MGRhNCAgLyogVSswRTA0IFRIQUkgQ0hBUkFDVEVSIEtITyBLSFdBSSAqLworI2RlZmluZSBYS19UaGFpX2tob2tob24gICAgICAgICAgICAgICAgICAweDBkYTUgIC8qIFUrMEUwNSBUSEFJIENIQVJBQ1RFUiBLSE8gS0hPTiAqLworI2RlZmluZSBYS19UaGFpX2tob3Jha2hhbmcgICAgICAgICAgICAgICAweDBkYTYgIC8qIFUrMEUwNiBUSEFJIENIQVJBQ1RFUiBLSE8gUkFLSEFORyAqLworI2RlZmluZSBYS19UaGFpX25nb25ndSAgICAgICAgICAgICAgICAgICAweDBkYTcgIC8qIFUrMEUwNyBUSEFJIENIQVJBQ1RFUiBOR08gTkdVICovCisjZGVmaW5lIFhLX1RoYWlfY2hvY2hhbiAgICAgICAgICAgICAgICAgIDB4MGRhOCAgLyogVSswRTA4IFRIQUkgQ0hBUkFDVEVSIENITyBDSEFOICovCisjZGVmaW5lIFhLX1RoYWlfY2hvY2hpbmcgICAgICAgICAgICAgICAgIDB4MGRhOSAgLyogVSswRTA5IFRIQUkgQ0hBUkFDVEVSIENITyBDSElORyAqLworI2RlZmluZSBYS19UaGFpX2Nob2NoYW5nICAgICAgICAgICAgICAgICAweDBkYWEgIC8qIFUrMEUwQSBUSEFJIENIQVJBQ1RFUiBDSE8gQ0hBTkcgKi8KKyNkZWZpbmUgWEtfVGhhaV9zb3NvICAgICAgICAgICAgICAgICAgICAgMHgwZGFiICAvKiBVKzBFMEIgVEhBSSBDSEFSQUNURVIgU08gU08gKi8KKyNkZWZpbmUgWEtfVGhhaV9jaG9jaG9lICAgICAgICAgICAgICAgICAgMHgwZGFjICAvKiBVKzBFMEMgVEhBSSBDSEFSQUNURVIgQ0hPIENIT0UgKi8KKyNkZWZpbmUgWEtfVGhhaV95b3lpbmcgICAgICAgICAgICAgICAgICAgMHgwZGFkICAvKiBVKzBFMEQgVEhBSSBDSEFSQUNURVIgWU8gWUlORyAqLworI2RlZmluZSBYS19UaGFpX2RvY2hhZGEgICAgICAgICAgICAgICAgICAweDBkYWUgIC8qIFUrMEUwRSBUSEFJIENIQVJBQ1RFUiBETyBDSEFEQSAqLworI2RlZmluZSBYS19UaGFpX3RvcGF0YWsgICAgICAgICAgICAgICAgICAweDBkYWYgIC8qIFUrMEUwRiBUSEFJIENIQVJBQ1RFUiBUTyBQQVRBSyAqLworI2RlZmluZSBYS19UaGFpX3Rob3RoYW4gICAgICAgICAgICAgICAgICAweDBkYjAgIC8qIFUrMEUxMCBUSEFJIENIQVJBQ1RFUiBUSE8gVEhBTiAqLworI2RlZmluZSBYS19UaGFpX3Rob25hbmdtb250aG8gICAgICAgICAgICAweDBkYjEgIC8qIFUrMEUxMSBUSEFJIENIQVJBQ1RFUiBUSE8gTkFOR01PTlRITyAqLworI2RlZmluZSBYS19UaGFpX3Rob3BodXRoYW8gICAgICAgICAgICAgICAweDBkYjIgIC8qIFUrMEUxMiBUSEFJIENIQVJBQ1RFUiBUSE8gUEhVVEhBTyAqLworI2RlZmluZSBYS19UaGFpX25vbmVuICAgICAgICAgICAgICAgICAgICAweDBkYjMgIC8qIFUrMEUxMyBUSEFJIENIQVJBQ1RFUiBOTyBORU4gKi8KKyNkZWZpbmUgWEtfVGhhaV9kb2RlayAgICAgICAgICAgICAgICAgICAgMHgwZGI0ICAvKiBVKzBFMTQgVEhBSSBDSEFSQUNURVIgRE8gREVLICovCisjZGVmaW5lIFhLX1RoYWlfdG90YW8gICAgICAgICAgICAgICAgICAgIDB4MGRiNSAgLyogVSswRTE1IFRIQUkgQ0hBUkFDVEVSIFRPIFRBTyAqLworI2RlZmluZSBYS19UaGFpX3Rob3RodW5nICAgICAgICAgICAgICAgICAweDBkYjYgIC8qIFUrMEUxNiBUSEFJIENIQVJBQ1RFUiBUSE8gVEhVTkcgKi8KKyNkZWZpbmUgWEtfVGhhaV90aG90aGFoYW4gICAgICAgICAgICAgICAgMHgwZGI3ICAvKiBVKzBFMTcgVEhBSSBDSEFSQUNURVIgVEhPIFRIQUhBTiAqLworI2RlZmluZSBYS19UaGFpX3Rob3Rob25nICAgICAgICAgICAgICAgICAweDBkYjggIC8qIFUrMEUxOCBUSEFJIENIQVJBQ1RFUiBUSE8gVEhPTkcgKi8KKyNkZWZpbmUgWEtfVGhhaV9ub251ICAgICAgICAgICAgICAgICAgICAgMHgwZGI5ICAvKiBVKzBFMTkgVEhBSSBDSEFSQUNURVIgTk8gTlUgKi8KKyNkZWZpbmUgWEtfVGhhaV9ib2JhaW1haSAgICAgICAgICAgICAgICAgMHgwZGJhICAvKiBVKzBFMUEgVEhBSSBDSEFSQUNURVIgQk8gQkFJTUFJICovCisjZGVmaW5lIFhLX1RoYWlfcG9wbGEgICAgICAgICAgICAgICAgICAgIDB4MGRiYiAgLyogVSswRTFCIFRIQUkgQ0hBUkFDVEVSIFBPIFBMQSAqLworI2RlZmluZSBYS19UaGFpX3Bob3BodW5nICAgICAgICAgICAgICAgICAweDBkYmMgIC8qIFUrMEUxQyBUSEFJIENIQVJBQ1RFUiBQSE8gUEhVTkcgKi8KKyNkZWZpbmUgWEtfVGhhaV9mb2ZhICAgICAgICAgICAgICAgICAgICAgMHgwZGJkICAvKiBVKzBFMUQgVEhBSSBDSEFSQUNURVIgRk8gRkEgKi8KKyNkZWZpbmUgWEtfVGhhaV9waG9waGFuICAgICAgICAgICAgICAgICAgMHgwZGJlICAvKiBVKzBFMUUgVEhBSSBDSEFSQUNURVIgUEhPIFBIQU4gKi8KKyNkZWZpbmUgWEtfVGhhaV9mb2ZhbiAgICAgICAgICAgICAgICAgICAgMHgwZGJmICAvKiBVKzBFMUYgVEhBSSBDSEFSQUNURVIgRk8gRkFOICovCisjZGVmaW5lIFhLX1RoYWlfcGhvc2FtcGhhbyAgICAgICAgICAgICAgIDB4MGRjMCAgLyogVSswRTIwIFRIQUkgQ0hBUkFDVEVSIFBITyBTQU1QSEFPICovCisjZGVmaW5lIFhLX1RoYWlfbW9tYSAgICAgICAgICAgICAgICAgICAgIDB4MGRjMSAgLyogVSswRTIxIFRIQUkgQ0hBUkFDVEVSIE1PIE1BICovCisjZGVmaW5lIFhLX1RoYWlfeW95YWsgICAgICAgICAgICAgICAgICAgIDB4MGRjMiAgLyogVSswRTIyIFRIQUkgQ0hBUkFDVEVSIFlPIFlBSyAqLworI2RlZmluZSBYS19UaGFpX3JvcnVhICAgICAgICAgICAgICAgICAgICAweDBkYzMgIC8qIFUrMEUyMyBUSEFJIENIQVJBQ1RFUiBSTyBSVUEgKi8KKyNkZWZpbmUgWEtfVGhhaV9ydSAgICAgICAgICAgICAgICAgICAgICAgMHgwZGM0ICAvKiBVKzBFMjQgVEhBSSBDSEFSQUNURVIgUlUgKi8KKyNkZWZpbmUgWEtfVGhhaV9sb2xpbmcgICAgICAgICAgICAgICAgICAgMHgwZGM1ICAvKiBVKzBFMjUgVEhBSSBDSEFSQUNURVIgTE8gTElORyAqLworI2RlZmluZSBYS19UaGFpX2x1ICAgICAgICAgICAgICAgICAgICAgICAweDBkYzYgIC8qIFUrMEUyNiBUSEFJIENIQVJBQ1RFUiBMVSAqLworI2RlZmluZSBYS19UaGFpX3dvd2FlbiAgICAgICAgICAgICAgICAgICAweDBkYzcgIC8qIFUrMEUyNyBUSEFJIENIQVJBQ1RFUiBXTyBXQUVOICovCisjZGVmaW5lIFhLX1RoYWlfc29zYWxhICAgICAgICAgICAgICAgICAgIDB4MGRjOCAgLyogVSswRTI4IFRIQUkgQ0hBUkFDVEVSIFNPIFNBTEEgKi8KKyNkZWZpbmUgWEtfVGhhaV9zb3J1c2kgICAgICAgICAgICAgICAgICAgMHgwZGM5ICAvKiBVKzBFMjkgVEhBSSBDSEFSQUNURVIgU08gUlVTSSAqLworI2RlZmluZSBYS19UaGFpX3Nvc3VhICAgICAgICAgICAgICAgICAgICAweDBkY2EgIC8qIFUrMEUyQSBUSEFJIENIQVJBQ1RFUiBTTyBTVUEgKi8KKyNkZWZpbmUgWEtfVGhhaV9ob2hpcCAgICAgICAgICAgICAgICAgICAgMHgwZGNiICAvKiBVKzBFMkIgVEhBSSBDSEFSQUNURVIgSE8gSElQICovCisjZGVmaW5lIFhLX1RoYWlfbG9jaHVsYSAgICAgICAgICAgICAgICAgIDB4MGRjYyAgLyogVSswRTJDIFRIQUkgQ0hBUkFDVEVSIExPIENIVUxBICovCisjZGVmaW5lIFhLX1RoYWlfb2FuZyAgICAgICAgICAgICAgICAgICAgIDB4MGRjZCAgLyogVSswRTJEIFRIQUkgQ0hBUkFDVEVSIE8gQU5HICovCisjZGVmaW5lIFhLX1RoYWlfaG9ub2todWsgICAgICAgICAgICAgICAgIDB4MGRjZSAgLyogVSswRTJFIFRIQUkgQ0hBUkFDVEVSIEhPIE5PS0hVSyAqLworI2RlZmluZSBYS19UaGFpX3BhaXlhbm5vaSAgICAgICAgICAgICAgICAweDBkY2YgIC8qIFUrMEUyRiBUSEFJIENIQVJBQ1RFUiBQQUlZQU5OT0kgKi8KKyNkZWZpbmUgWEtfVGhhaV9zYXJhYSAgICAgICAgICAgICAgICAgICAgMHgwZGQwICAvKiBVKzBFMzAgVEhBSSBDSEFSQUNURVIgU0FSQSBBICovCisjZGVmaW5lIFhLX1RoYWlfbWFpaGFuYWthdCAgICAgICAgICAgICAgIDB4MGRkMSAgLyogVSswRTMxIFRIQUkgQ0hBUkFDVEVSIE1BSSBIQU4tQUtBVCAqLworI2RlZmluZSBYS19UaGFpX3NhcmFhYSAgICAgICAgICAgICAgICAgICAweDBkZDIgIC8qIFUrMEUzMiBUSEFJIENIQVJBQ1RFUiBTQVJBIEFBICovCisjZGVmaW5lIFhLX1RoYWlfc2FyYWFtICAgICAgICAgICAgICAgICAgIDB4MGRkMyAgLyogVSswRTMzIFRIQUkgQ0hBUkFDVEVSIFNBUkEgQU0gKi8KKyNkZWZpbmUgWEtfVGhhaV9zYXJhaSAgICAgICAgICAgICAgICAgICAgMHgwZGQ0ICAvKiBVKzBFMzQgVEhBSSBDSEFSQUNURVIgU0FSQSBJICovCisjZGVmaW5lIFhLX1RoYWlfc2FyYWlpICAgICAgICAgICAgICAgICAgIDB4MGRkNSAgLyogVSswRTM1IFRIQUkgQ0hBUkFDVEVSIFNBUkEgSUkgKi8KKyNkZWZpbmUgWEtfVGhhaV9zYXJhdWUgICAgICAgICAgICAgICAgICAgMHgwZGQ2ICAvKiBVKzBFMzYgVEhBSSBDSEFSQUNURVIgU0FSQSBVRSAqLworI2RlZmluZSBYS19UaGFpX3NhcmF1ZWUgICAgICAgICAgICAgICAgICAweDBkZDcgIC8qIFUrMEUzNyBUSEFJIENIQVJBQ1RFUiBTQVJBIFVFRSAqLworI2RlZmluZSBYS19UaGFpX3NhcmF1ICAgICAgICAgICAgICAgICAgICAweDBkZDggIC8qIFUrMEUzOCBUSEFJIENIQVJBQ1RFUiBTQVJBIFUgKi8KKyNkZWZpbmUgWEtfVGhhaV9zYXJhdXUgICAgICAgICAgICAgICAgICAgMHgwZGQ5ICAvKiBVKzBFMzkgVEhBSSBDSEFSQUNURVIgU0FSQSBVVSAqLworI2RlZmluZSBYS19UaGFpX3BoaW50aHUgICAgICAgICAgICAgICAgICAweDBkZGEgIC8qIFUrMEUzQSBUSEFJIENIQVJBQ1RFUiBQSElOVEhVICovCisjZGVmaW5lIFhLX1RoYWlfbWFpaGFuYWthdF9tYWl0aG8gICAgICAgIDB4MGRkZQorI2RlZmluZSBYS19UaGFpX2JhaHQgICAgICAgICAgICAgICAgICAgICAweDBkZGYgIC8qIFUrMEUzRiBUSEFJIENVUlJFTkNZIFNZTUJPTCBCQUhUICovCisjZGVmaW5lIFhLX1RoYWlfc2FyYWUgICAgICAgICAgICAgICAgICAgIDB4MGRlMCAgLyogVSswRTQwIFRIQUkgQ0hBUkFDVEVSIFNBUkEgRSAqLworI2RlZmluZSBYS19UaGFpX3NhcmFhZSAgICAgICAgICAgICAgICAgICAweDBkZTEgIC8qIFUrMEU0MSBUSEFJIENIQVJBQ1RFUiBTQVJBIEFFICovCisjZGVmaW5lIFhLX1RoYWlfc2FyYW8gICAgICAgICAgICAgICAgICAgIDB4MGRlMiAgLyogVSswRTQyIFRIQUkgQ0hBUkFDVEVSIFNBUkEgTyAqLworI2RlZmluZSBYS19UaGFpX3NhcmFhaW1haW11YW4gICAgICAgICAgICAweDBkZTMgIC8qIFUrMEU0MyBUSEFJIENIQVJBQ1RFUiBTQVJBIEFJIE1BSU1VQU4gKi8KKyNkZWZpbmUgWEtfVGhhaV9zYXJhYWltYWltYWxhaSAgICAgICAgICAgMHgwZGU0ICAvKiBVKzBFNDQgVEhBSSBDSEFSQUNURVIgU0FSQSBBSSBNQUlNQUxBSSAqLworI2RlZmluZSBYS19UaGFpX2xha2toYW5neWFvICAgICAgICAgICAgICAweDBkZTUgIC8qIFUrMEU0NSBUSEFJIENIQVJBQ1RFUiBMQUtLSEFOR1lBTyAqLworI2RlZmluZSBYS19UaGFpX21haXlhbW9rICAgICAgICAgICAgICAgICAweDBkZTYgIC8qIFUrMEU0NiBUSEFJIENIQVJBQ1RFUiBNQUlZQU1PSyAqLworI2RlZmluZSBYS19UaGFpX21haXRhaWtodSAgICAgICAgICAgICAgICAweDBkZTcgIC8qIFUrMEU0NyBUSEFJIENIQVJBQ1RFUiBNQUlUQUlLSFUgKi8KKyNkZWZpbmUgWEtfVGhhaV9tYWllayAgICAgICAgICAgICAgICAgICAgMHgwZGU4ICAvKiBVKzBFNDggVEhBSSBDSEFSQUNURVIgTUFJIEVLICovCisjZGVmaW5lIFhLX1RoYWlfbWFpdGhvICAgICAgICAgICAgICAgICAgIDB4MGRlOSAgLyogVSswRTQ5IFRIQUkgQ0hBUkFDVEVSIE1BSSBUSE8gKi8KKyNkZWZpbmUgWEtfVGhhaV9tYWl0cmkgICAgICAgICAgICAgICAgICAgMHgwZGVhICAvKiBVKzBFNEEgVEhBSSBDSEFSQUNURVIgTUFJIFRSSSAqLworI2RlZmluZSBYS19UaGFpX21haWNoYXR0YXdhICAgICAgICAgICAgICAweDBkZWIgIC8qIFUrMEU0QiBUSEFJIENIQVJBQ1RFUiBNQUkgQ0hBVFRBV0EgKi8KKyNkZWZpbmUgWEtfVGhhaV90aGFudGhha2hhdCAgICAgICAgICAgICAgMHgwZGVjICAvKiBVKzBFNEMgVEhBSSBDSEFSQUNURVIgVEhBTlRIQUtIQVQgKi8KKyNkZWZpbmUgWEtfVGhhaV9uaWtoYWhpdCAgICAgICAgICAgICAgICAgMHgwZGVkICAvKiBVKzBFNEQgVEhBSSBDSEFSQUNURVIgTklLSEFISVQgKi8KKyNkZWZpbmUgWEtfVGhhaV9sZWtzdW4gICAgICAgICAgICAgICAgICAgMHgwZGYwICAvKiBVKzBFNTAgVEhBSSBESUdJVCBaRVJPICovCisjZGVmaW5lIFhLX1RoYWlfbGVrbnVuZyAgICAgICAgICAgICAgICAgIDB4MGRmMSAgLyogVSswRTUxIFRIQUkgRElHSVQgT05FICovCisjZGVmaW5lIFhLX1RoYWlfbGVrc29uZyAgICAgICAgICAgICAgICAgIDB4MGRmMiAgLyogVSswRTUyIFRIQUkgRElHSVQgVFdPICovCisjZGVmaW5lIFhLX1RoYWlfbGVrc2FtICAgICAgICAgICAgICAgICAgIDB4MGRmMyAgLyogVSswRTUzIFRIQUkgRElHSVQgVEhSRUUgKi8KKyNkZWZpbmUgWEtfVGhhaV9sZWtzaSAgICAgICAgICAgICAgICAgICAgMHgwZGY0ICAvKiBVKzBFNTQgVEhBSSBESUdJVCBGT1VSICovCisjZGVmaW5lIFhLX1RoYWlfbGVraGEgICAgICAgICAgICAgICAgICAgIDB4MGRmNSAgLyogVSswRTU1IFRIQUkgRElHSVQgRklWRSAqLworI2RlZmluZSBYS19UaGFpX2xla2hvayAgICAgICAgICAgICAgICAgICAweDBkZjYgIC8qIFUrMEU1NiBUSEFJIERJR0lUIFNJWCAqLworI2RlZmluZSBYS19UaGFpX2xla2NoZXQgICAgICAgICAgICAgICAgICAweDBkZjcgIC8qIFUrMEU1NyBUSEFJIERJR0lUIFNFVkVOICovCisjZGVmaW5lIFhLX1RoYWlfbGVrcGFldCAgICAgICAgICAgICAgICAgIDB4MGRmOCAgLyogVSswRTU4IFRIQUkgRElHSVQgRUlHSFQgKi8KKyNkZWZpbmUgWEtfVGhhaV9sZWtrYW8gICAgICAgICAgICAgICAgICAgMHgwZGY5ICAvKiBVKzBFNTkgVEhBSSBESUdJVCBOSU5FICovCisjZW5kaWYgLyogWEtfVEhBSSAqLworCisvKgorICogS29yZWFuCisgKiBCeXRlIDMgPSAweDBlCisgKi8KKworI2lmZGVmIFhLX0tPUkVBTgorCisjZGVmaW5lIFhLX0hhbmd1bCAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYzMSAgLyogSGFuZ3VsIHN0YXJ0L3N0b3AodG9nZ2xlKSAqLworI2RlZmluZSBYS19IYW5ndWxfU3RhcnQgICAgICAgICAgICAgICAgICAweGZmMzIgIC8qIEhhbmd1bCBzdGFydCAqLworI2RlZmluZSBYS19IYW5ndWxfRW5kICAgICAgICAgICAgICAgICAgICAweGZmMzMgIC8qIEhhbmd1bCBlbmQsIEVuZ2xpc2ggc3RhcnQgKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX0hhbmphICAgICAgICAgICAgICAgICAgMHhmZjM0ICAvKiBTdGFydCBIYW5ndWwtPkhhbmphIENvbnZlcnNpb24gKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX0phbW8gICAgICAgICAgICAgICAgICAgMHhmZjM1ICAvKiBIYW5ndWwgSmFtbyBtb2RlICovCisjZGVmaW5lIFhLX0hhbmd1bF9Sb21hamEgICAgICAgICAgICAgICAgIDB4ZmYzNiAgLyogSGFuZ3VsIFJvbWFqYSBtb2RlICovCisjZGVmaW5lIFhLX0hhbmd1bF9Db2RlaW5wdXQgICAgICAgICAgICAgIDB4ZmYzNyAgLyogSGFuZ3VsIGNvZGUgaW5wdXQgbW9kZSAqLworI2RlZmluZSBYS19IYW5ndWxfSmVvbmphICAgICAgICAgICAgICAgICAweGZmMzggIC8qIEplb25qYSBtb2RlICovCisjZGVmaW5lIFhLX0hhbmd1bF9CYW5qYSAgICAgICAgICAgICAgICAgIDB4ZmYzOSAgLyogQmFuamEgbW9kZSAqLworI2RlZmluZSBYS19IYW5ndWxfUHJlSGFuamEgICAgICAgICAgICAgICAweGZmM2EgIC8qIFByZSBIYW5qYSBjb252ZXJzaW9uICovCisjZGVmaW5lIFhLX0hhbmd1bF9Qb3N0SGFuamEgICAgICAgICAgICAgIDB4ZmYzYiAgLyogUG9zdCBIYW5qYSBjb252ZXJzaW9uICovCisjZGVmaW5lIFhLX0hhbmd1bF9TaW5nbGVDYW5kaWRhdGUgICAgICAgIDB4ZmYzYyAgLyogU2luZ2xlIGNhbmRpZGF0ZSAqLworI2RlZmluZSBYS19IYW5ndWxfTXVsdGlwbGVDYW5kaWRhdGUgICAgICAweGZmM2QgIC8qIE11bHRpcGxlIGNhbmRpZGF0ZSAqLworI2RlZmluZSBYS19IYW5ndWxfUHJldmlvdXNDYW5kaWRhdGUgICAgICAweGZmM2UgIC8qIFByZXZpb3VzIGNhbmRpZGF0ZSAqLworI2RlZmluZSBYS19IYW5ndWxfU3BlY2lhbCAgICAgICAgICAgICAgICAweGZmM2YgIC8qIFNwZWNpYWwgc3ltYm9scyAqLworI2RlZmluZSBYS19IYW5ndWxfc3dpdGNoICAgICAgICAgICAgICAgICAweGZmN2UgIC8qIEFsaWFzIGZvciBtb2RlX3N3aXRjaCAqLworCisvKiBIYW5ndWwgQ29uc29uYW50IENoYXJhY3RlcnMgKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX0tpeWVvZyAgICAgICAgICAgICAgICAgMHgwZWExCisjZGVmaW5lIFhLX0hhbmd1bF9Tc2FuZ0tpeWVvZyAgICAgICAgICAgIDB4MGVhMgorI2RlZmluZSBYS19IYW5ndWxfS2l5ZW9nU2lvcyAgICAgICAgICAgICAweDBlYTMKKyNkZWZpbmUgWEtfSGFuZ3VsX05pZXVuICAgICAgICAgICAgICAgICAgMHgwZWE0CisjZGVmaW5lIFhLX0hhbmd1bF9OaWV1bkppZXVqICAgICAgICAgICAgIDB4MGVhNQorI2RlZmluZSBYS19IYW5ndWxfTmlldW5IaWV1aCAgICAgICAgICAgICAweDBlYTYKKyNkZWZpbmUgWEtfSGFuZ3VsX0Rpa2V1ZCAgICAgICAgICAgICAgICAgMHgwZWE3CisjZGVmaW5lIFhLX0hhbmd1bF9Tc2FuZ0Rpa2V1ZCAgICAgICAgICAgIDB4MGVhOAorI2RlZmluZSBYS19IYW5ndWxfUmlldWwgICAgICAgICAgICAgICAgICAweDBlYTkKKyNkZWZpbmUgWEtfSGFuZ3VsX1JpZXVsS2l5ZW9nICAgICAgICAgICAgMHgwZWFhCisjZGVmaW5lIFhLX0hhbmd1bF9SaWV1bE1pZXVtICAgICAgICAgICAgIDB4MGVhYgorI2RlZmluZSBYS19IYW5ndWxfUmlldWxQaWV1YiAgICAgICAgICAgICAweDBlYWMKKyNkZWZpbmUgWEtfSGFuZ3VsX1JpZXVsU2lvcyAgICAgICAgICAgICAgMHgwZWFkCisjZGVmaW5lIFhLX0hhbmd1bF9SaWV1bFRpZXV0ICAgICAgICAgICAgIDB4MGVhZQorI2RlZmluZSBYS19IYW5ndWxfUmlldWxQaGlldWYgICAgICAgICAgICAweDBlYWYKKyNkZWZpbmUgWEtfSGFuZ3VsX1JpZXVsSGlldWggICAgICAgICAgICAgMHgwZWIwCisjZGVmaW5lIFhLX0hhbmd1bF9NaWV1bSAgICAgICAgICAgICAgICAgIDB4MGViMQorI2RlZmluZSBYS19IYW5ndWxfUGlldWIgICAgICAgICAgICAgICAgICAweDBlYjIKKyNkZWZpbmUgWEtfSGFuZ3VsX1NzYW5nUGlldWIgICAgICAgICAgICAgMHgwZWIzCisjZGVmaW5lIFhLX0hhbmd1bF9QaWV1YlNpb3MgICAgICAgICAgICAgIDB4MGViNAorI2RlZmluZSBYS19IYW5ndWxfU2lvcyAgICAgICAgICAgICAgICAgICAweDBlYjUKKyNkZWZpbmUgWEtfSGFuZ3VsX1NzYW5nU2lvcyAgICAgICAgICAgICAgMHgwZWI2CisjZGVmaW5lIFhLX0hhbmd1bF9JZXVuZyAgICAgICAgICAgICAgICAgIDB4MGViNworI2RlZmluZSBYS19IYW5ndWxfSmlldWogICAgICAgICAgICAgICAgICAweDBlYjgKKyNkZWZpbmUgWEtfSGFuZ3VsX1NzYW5nSmlldWogICAgICAgICAgICAgMHgwZWI5CisjZGVmaW5lIFhLX0hhbmd1bF9DaWV1YyAgICAgICAgICAgICAgICAgIDB4MGViYQorI2RlZmluZSBYS19IYW5ndWxfS2hpZXVxICAgICAgICAgICAgICAgICAweDBlYmIKKyNkZWZpbmUgWEtfSGFuZ3VsX1RpZXV0ICAgICAgICAgICAgICAgICAgMHgwZWJjCisjZGVmaW5lIFhLX0hhbmd1bF9QaGlldWYgICAgICAgICAgICAgICAgIDB4MGViZAorI2RlZmluZSBYS19IYW5ndWxfSGlldWggICAgICAgICAgICAgICAgICAweDBlYmUKKworLyogSGFuZ3VsIFZvd2VsIENoYXJhY3RlcnMgKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX0EgICAgICAgICAgICAgICAgICAgICAgMHgwZWJmCisjZGVmaW5lIFhLX0hhbmd1bF9BRSAgICAgICAgICAgICAgICAgICAgIDB4MGVjMAorI2RlZmluZSBYS19IYW5ndWxfWUEgICAgICAgICAgICAgICAgICAgICAweDBlYzEKKyNkZWZpbmUgWEtfSGFuZ3VsX1lBRSAgICAgICAgICAgICAgICAgICAgMHgwZWMyCisjZGVmaW5lIFhLX0hhbmd1bF9FTyAgICAgICAgICAgICAgICAgICAgIDB4MGVjMworI2RlZmluZSBYS19IYW5ndWxfRSAgICAgICAgICAgICAgICAgICAgICAweDBlYzQKKyNkZWZpbmUgWEtfSGFuZ3VsX1lFTyAgICAgICAgICAgICAgICAgICAgMHgwZWM1CisjZGVmaW5lIFhLX0hhbmd1bF9ZRSAgICAgICAgICAgICAgICAgICAgIDB4MGVjNgorI2RlZmluZSBYS19IYW5ndWxfTyAgICAgICAgICAgICAgICAgICAgICAweDBlYzcKKyNkZWZpbmUgWEtfSGFuZ3VsX1dBICAgICAgICAgICAgICAgICAgICAgMHgwZWM4CisjZGVmaW5lIFhLX0hhbmd1bF9XQUUgICAgICAgICAgICAgICAgICAgIDB4MGVjOQorI2RlZmluZSBYS19IYW5ndWxfT0UgICAgICAgICAgICAgICAgICAgICAweDBlY2EKKyNkZWZpbmUgWEtfSGFuZ3VsX1lPICAgICAgICAgICAgICAgICAgICAgMHgwZWNiCisjZGVmaW5lIFhLX0hhbmd1bF9VICAgICAgICAgICAgICAgICAgICAgIDB4MGVjYworI2RlZmluZSBYS19IYW5ndWxfV0VPICAgICAgICAgICAgICAgICAgICAweDBlY2QKKyNkZWZpbmUgWEtfSGFuZ3VsX1dFICAgICAgICAgICAgICAgICAgICAgMHgwZWNlCisjZGVmaW5lIFhLX0hhbmd1bF9XSSAgICAgICAgICAgICAgICAgICAgIDB4MGVjZgorI2RlZmluZSBYS19IYW5ndWxfWVUgICAgICAgICAgICAgICAgICAgICAweDBlZDAKKyNkZWZpbmUgWEtfSGFuZ3VsX0VVICAgICAgICAgICAgICAgICAgICAgMHgwZWQxCisjZGVmaW5lIFhLX0hhbmd1bF9ZSSAgICAgICAgICAgICAgICAgICAgIDB4MGVkMgorI2RlZmluZSBYS19IYW5ndWxfSSAgICAgICAgICAgICAgICAgICAgICAweDBlZDMKKworLyogSGFuZ3VsIHN5bGxhYmxlLWZpbmFsIChKb25nU2VvbmcpIENoYXJhY3RlcnMgKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX0pfS2l5ZW9nICAgICAgICAgICAgICAgMHgwZWQ0CisjZGVmaW5lIFhLX0hhbmd1bF9KX1NzYW5nS2l5ZW9nICAgICAgICAgIDB4MGVkNQorI2RlZmluZSBYS19IYW5ndWxfSl9LaXllb2dTaW9zICAgICAgICAgICAweDBlZDYKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfTmlldW4gICAgICAgICAgICAgICAgMHgwZWQ3CisjZGVmaW5lIFhLX0hhbmd1bF9KX05pZXVuSmlldWogICAgICAgICAgIDB4MGVkOAorI2RlZmluZSBYS19IYW5ndWxfSl9OaWV1bkhpZXVoICAgICAgICAgICAweDBlZDkKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfRGlrZXVkICAgICAgICAgICAgICAgMHgwZWRhCisjZGVmaW5lIFhLX0hhbmd1bF9KX1JpZXVsICAgICAgICAgICAgICAgIDB4MGVkYgorI2RlZmluZSBYS19IYW5ndWxfSl9SaWV1bEtpeWVvZyAgICAgICAgICAweDBlZGMKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfUmlldWxNaWV1bSAgICAgICAgICAgMHgwZWRkCisjZGVmaW5lIFhLX0hhbmd1bF9KX1JpZXVsUGlldWIgICAgICAgICAgIDB4MGVkZQorI2RlZmluZSBYS19IYW5ndWxfSl9SaWV1bFNpb3MgICAgICAgICAgICAweDBlZGYKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfUmlldWxUaWV1dCAgICAgICAgICAgMHgwZWUwCisjZGVmaW5lIFhLX0hhbmd1bF9KX1JpZXVsUGhpZXVmICAgICAgICAgIDB4MGVlMQorI2RlZmluZSBYS19IYW5ndWxfSl9SaWV1bEhpZXVoICAgICAgICAgICAweDBlZTIKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfTWlldW0gICAgICAgICAgICAgICAgMHgwZWUzCisjZGVmaW5lIFhLX0hhbmd1bF9KX1BpZXViICAgICAgICAgICAgICAgIDB4MGVlNAorI2RlZmluZSBYS19IYW5ndWxfSl9QaWV1YlNpb3MgICAgICAgICAgICAweDBlZTUKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfU2lvcyAgICAgICAgICAgICAgICAgMHgwZWU2CisjZGVmaW5lIFhLX0hhbmd1bF9KX1NzYW5nU2lvcyAgICAgICAgICAgIDB4MGVlNworI2RlZmluZSBYS19IYW5ndWxfSl9JZXVuZyAgICAgICAgICAgICAgICAweDBlZTgKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfSmlldWogICAgICAgICAgICAgICAgMHgwZWU5CisjZGVmaW5lIFhLX0hhbmd1bF9KX0NpZXVjICAgICAgICAgICAgICAgIDB4MGVlYQorI2RlZmluZSBYS19IYW5ndWxfSl9LaGlldXEgICAgICAgICAgICAgICAweDBlZWIKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfVGlldXQgICAgICAgICAgICAgICAgMHgwZWVjCisjZGVmaW5lIFhLX0hhbmd1bF9KX1BoaWV1ZiAgICAgICAgICAgICAgIDB4MGVlZAorI2RlZmluZSBYS19IYW5ndWxfSl9IaWV1aCAgICAgICAgICAgICAgICAweDBlZWUKKworLyogQW5jaWVudCBIYW5ndWwgQ29uc29uYW50IENoYXJhY3RlcnMgKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX1JpZXVsWWVvcmluSGlldWggICAgICAgMHgwZWVmCisjZGVmaW5lIFhLX0hhbmd1bF9TdW5reWVvbmdldW1NaWV1bSAgICAgIDB4MGVmMAorI2RlZmluZSBYS19IYW5ndWxfU3Vua3llb25nZXVtUGlldWIgICAgICAweDBlZjEKKyNkZWZpbmUgWEtfSGFuZ3VsX1BhblNpb3MgICAgICAgICAgICAgICAgMHgwZWYyCisjZGVmaW5lIFhLX0hhbmd1bF9La29namlEYWxyaW5JZXVuZyAgICAgIDB4MGVmMworI2RlZmluZSBYS19IYW5ndWxfU3Vua3llb25nZXVtUGhpZXVmICAgICAweDBlZjQKKyNkZWZpbmUgWEtfSGFuZ3VsX1llb3JpbkhpZXVoICAgICAgICAgICAgMHgwZWY1CisKKy8qIEFuY2llbnQgSGFuZ3VsIFZvd2VsIENoYXJhY3RlcnMgKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX0FyYWVBICAgICAgICAgICAgICAgICAgMHgwZWY2CisjZGVmaW5lIFhLX0hhbmd1bF9BcmFlQUUgICAgICAgICAgICAgICAgIDB4MGVmNworCisvKiBBbmNpZW50IEhhbmd1bCBzeWxsYWJsZS1maW5hbCAoSm9uZ1Nlb25nKSBDaGFyYWN0ZXJzICovCisjZGVmaW5lIFhLX0hhbmd1bF9KX1BhblNpb3MgICAgICAgICAgICAgIDB4MGVmOAorI2RlZmluZSBYS19IYW5ndWxfSl9La29namlEYWxyaW5JZXVuZyAgICAweDBlZjkKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfWWVvcmluSGlldWggICAgICAgICAgMHgwZWZhCisKKy8qIEtvcmVhbiBjdXJyZW5jeSBzeW1ib2wgKi8KKyNkZWZpbmUgWEtfS29yZWFuX1dvbiAgICAgICAgICAgICAgICAgICAgMHgwZWZmICAvKihVKzIwQTkgV09OIFNJR04pKi8KKworI2VuZGlmIC8qIFhLX0tPUkVBTiAqLworCisvKgorICogQXJtZW5pYW4KKyAqLworCisjaWZkZWYgWEtfQVJNRU5JQU4KKyNkZWZpbmUgWEtfQXJtZW5pYW5fbGlnYXR1cmVfZXcgICAgICAgMHgxMDAwNTg3ICAvKiBVKzA1ODcgQVJNRU5JQU4gU01BTEwgTElHQVRVUkUgRUNIIFlJV04gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fZnVsbF9zdG9wICAgICAgICAgMHgxMDAwNTg5ICAvKiBVKzA1ODkgQVJNRU5JQU4gRlVMTCBTVE9QICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3Zlcmpha2V0ICAgICAgICAgIDB4MTAwMDU4OSAgLyogVSswNTg5IEFSTUVOSUFOIEZVTEwgU1RPUCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9zZXBhcmF0aW9uX21hcmsgICAweDEwMDA1NWQgIC8qIFUrMDU1RCBBUk1FTklBTiBDT01NQSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9idXQgICAgICAgICAgICAgICAweDEwMDA1NWQgIC8qIFUrMDU1RCBBUk1FTklBTiBDT01NQSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9oeXBoZW4gICAgICAgICAgICAweDEwMDA1OGEgIC8qIFUrMDU4QSBBUk1FTklBTiBIWVBIRU4gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5feWVudGFtbmEgICAgICAgICAgMHgxMDAwNThhICAvKiBVKzA1OEEgQVJNRU5JQU4gSFlQSEVOICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2V4Y2xhbSAgICAgICAgICAgIDB4MTAwMDU1YyAgLyogVSswNTVDIEFSTUVOSUFOIEVYQ0xBTUFUSU9OIE1BUksgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fYW1hbmFrICAgICAgICAgICAgMHgxMDAwNTVjICAvKiBVKzA1NUMgQVJNRU5JQU4gRVhDTEFNQVRJT04gTUFSSyAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9hY2NlbnQgICAgICAgICAgICAweDEwMDA1NWIgIC8qIFUrMDU1QiBBUk1FTklBTiBFTVBIQVNJUyBNQVJLICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3NoZXNodCAgICAgICAgICAgIDB4MTAwMDU1YiAgLyogVSswNTVCIEFSTUVOSUFOIEVNUEhBU0lTIE1BUksgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fcXVlc3Rpb24gICAgICAgICAgMHgxMDAwNTVlICAvKiBVKzA1NUUgQVJNRU5JQU4gUVVFU1RJT04gTUFSSyAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9wYXJ1eWsgICAgICAgICAgICAweDEwMDA1NWUgIC8qIFUrMDU1RSBBUk1FTklBTiBRVUVTVElPTiBNQVJLICovCisjZGVmaW5lIFhLX0FybWVuaWFuX0FZQiAgICAgICAgICAgICAgIDB4MTAwMDUzMSAgLyogVSswNTMxIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIEFZQiAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9heWIgICAgICAgICAgICAgICAweDEwMDA1NjEgIC8qIFUrMDU2MSBBUk1FTklBTiBTTUFMTCBMRVRURVIgQVlCICovCisjZGVmaW5lIFhLX0FybWVuaWFuX0JFTiAgICAgICAgICAgICAgIDB4MTAwMDUzMiAgLyogVSswNTMyIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIEJFTiAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9iZW4gICAgICAgICAgICAgICAweDEwMDA1NjIgIC8qIFUrMDU2MiBBUk1FTklBTiBTTUFMTCBMRVRURVIgQkVOICovCisjZGVmaW5lIFhLX0FybWVuaWFuX0dJTSAgICAgICAgICAgICAgIDB4MTAwMDUzMyAgLyogVSswNTMzIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIEdJTSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9naW0gICAgICAgICAgICAgICAweDEwMDA1NjMgIC8qIFUrMDU2MyBBUk1FTklBTiBTTUFMTCBMRVRURVIgR0lNICovCisjZGVmaW5lIFhLX0FybWVuaWFuX0RBICAgICAgICAgICAgICAgIDB4MTAwMDUzNCAgLyogVSswNTM0IEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIERBICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2RhICAgICAgICAgICAgICAgIDB4MTAwMDU2NCAgLyogVSswNTY0IEFSTUVOSUFOIFNNQUxMIExFVFRFUiBEQSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9ZRUNIICAgICAgICAgICAgICAweDEwMDA1MzUgIC8qIFUrMDUzNSBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBFQ0ggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5feWVjaCAgICAgICAgICAgICAgMHgxMDAwNTY1ICAvKiBVKzA1NjUgQVJNRU5JQU4gU01BTEwgTEVUVEVSIEVDSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9aQSAgICAgICAgICAgICAgICAweDEwMDA1MzYgIC8qIFUrMDUzNiBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBaQSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl96YSAgICAgICAgICAgICAgICAweDEwMDA1NjYgIC8qIFUrMDU2NiBBUk1FTklBTiBTTUFMTCBMRVRURVIgWkEgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fRSAgICAgICAgICAgICAgICAgMHgxMDAwNTM3ICAvKiBVKzA1MzcgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgRUggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fZSAgICAgICAgICAgICAgICAgMHgxMDAwNTY3ICAvKiBVKzA1NjcgQVJNRU5JQU4gU01BTEwgTEVUVEVSIEVIICovCisjZGVmaW5lIFhLX0FybWVuaWFuX0FUICAgICAgICAgICAgICAgIDB4MTAwMDUzOCAgLyogVSswNTM4IEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIEVUICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2F0ICAgICAgICAgICAgICAgIDB4MTAwMDU2OCAgLyogVSswNTY4IEFSTUVOSUFOIFNNQUxMIExFVFRFUiBFVCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9UTyAgICAgICAgICAgICAgICAweDEwMDA1MzkgIC8qIFUrMDUzOSBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBUTyAqLworI2RlZmluZSBYS19Bcm1lbmlhbl90byAgICAgICAgICAgICAgICAweDEwMDA1NjkgIC8qIFUrMDU2OSBBUk1FTklBTiBTTUFMTCBMRVRURVIgVE8gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fWkhFICAgICAgICAgICAgICAgMHgxMDAwNTNhICAvKiBVKzA1M0EgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgWkhFICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3poZSAgICAgICAgICAgICAgIDB4MTAwMDU2YSAgLyogVSswNTZBIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBaSEUgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fSU5JICAgICAgICAgICAgICAgMHgxMDAwNTNiICAvKiBVKzA1M0IgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgSU5JICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2luaSAgICAgICAgICAgICAgIDB4MTAwMDU2YiAgLyogVSswNTZCIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBJTkkgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fTFlVTiAgICAgICAgICAgICAgMHgxMDAwNTNjICAvKiBVKzA1M0MgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgTElXTiAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9seXVuICAgICAgICAgICAgICAweDEwMDA1NmMgIC8qIFUrMDU2QyBBUk1FTklBTiBTTUFMTCBMRVRURVIgTElXTiAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9LSEUgICAgICAgICAgICAgICAweDEwMDA1M2QgIC8qIFUrMDUzRCBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBYRUggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fa2hlICAgICAgICAgICAgICAgMHgxMDAwNTZkICAvKiBVKzA1NkQgQVJNRU5JQU4gU01BTEwgTEVUVEVSIFhFSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9UU0EgICAgICAgICAgICAgICAweDEwMDA1M2UgIC8qIFUrMDUzRSBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBDQSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl90c2EgICAgICAgICAgICAgICAweDEwMDA1NmUgIC8qIFUrMDU2RSBBUk1FTklBTiBTTUFMTCBMRVRURVIgQ0EgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fS0VOICAgICAgICAgICAgICAgMHgxMDAwNTNmICAvKiBVKzA1M0YgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgS0VOICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2tlbiAgICAgICAgICAgICAgIDB4MTAwMDU2ZiAgLyogVSswNTZGIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBLRU4gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fSE8gICAgICAgICAgICAgICAgMHgxMDAwNTQwICAvKiBVKzA1NDAgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgSE8gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5faG8gICAgICAgICAgICAgICAgMHgxMDAwNTcwICAvKiBVKzA1NzAgQVJNRU5JQU4gU01BTEwgTEVUVEVSIEhPICovCisjZGVmaW5lIFhLX0FybWVuaWFuX0RaQSAgICAgICAgICAgICAgIDB4MTAwMDU0MSAgLyogVSswNTQxIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIEpBICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2R6YSAgICAgICAgICAgICAgIDB4MTAwMDU3MSAgLyogVSswNTcxIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBKQSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9HSEFUICAgICAgICAgICAgICAweDEwMDA1NDIgIC8qIFUrMDU0MiBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBHSEFEICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2doYXQgICAgICAgICAgICAgIDB4MTAwMDU3MiAgLyogVSswNTcyIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBHSEFEICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1RDSEUgICAgICAgICAgICAgIDB4MTAwMDU0MyAgLyogVSswNTQzIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIENIRUggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fdGNoZSAgICAgICAgICAgICAgMHgxMDAwNTczICAvKiBVKzA1NzMgQVJNRU5JQU4gU01BTEwgTEVUVEVSIENIRUggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fTUVOICAgICAgICAgICAgICAgMHgxMDAwNTQ0ICAvKiBVKzA1NDQgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgTUVOICovCisjZGVmaW5lIFhLX0FybWVuaWFuX21lbiAgICAgICAgICAgICAgIDB4MTAwMDU3NCAgLyogVSswNTc0IEFSTUVOSUFOIFNNQUxMIExFVFRFUiBNRU4gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fSEkgICAgICAgICAgICAgICAgMHgxMDAwNTQ1ICAvKiBVKzA1NDUgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgWUkgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5faGkgICAgICAgICAgICAgICAgMHgxMDAwNTc1ICAvKiBVKzA1NzUgQVJNRU5JQU4gU01BTEwgTEVUVEVSIFlJICovCisjZGVmaW5lIFhLX0FybWVuaWFuX05VICAgICAgICAgICAgICAgIDB4MTAwMDU0NiAgLyogVSswNTQ2IEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIE5PVyAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9udSAgICAgICAgICAgICAgICAweDEwMDA1NzYgIC8qIFUrMDU3NiBBUk1FTklBTiBTTUFMTCBMRVRURVIgTk9XICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1NIQSAgICAgICAgICAgICAgIDB4MTAwMDU0NyAgLyogVSswNTQ3IEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFNIQSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9zaGEgICAgICAgICAgICAgICAweDEwMDA1NzcgIC8qIFUrMDU3NyBBUk1FTklBTiBTTUFMTCBMRVRURVIgU0hBICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1ZPICAgICAgICAgICAgICAgIDB4MTAwMDU0OCAgLyogVSswNTQ4IEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFZPICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3ZvICAgICAgICAgICAgICAgIDB4MTAwMDU3OCAgLyogVSswNTc4IEFSTUVOSUFOIFNNQUxMIExFVFRFUiBWTyAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9DSEEgICAgICAgICAgICAgICAweDEwMDA1NDkgIC8qIFUrMDU0OSBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBDSEEgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fY2hhICAgICAgICAgICAgICAgMHgxMDAwNTc5ICAvKiBVKzA1NzkgQVJNRU5JQU4gU01BTEwgTEVUVEVSIENIQSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9QRSAgICAgICAgICAgICAgICAweDEwMDA1NGEgIC8qIFUrMDU0QSBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBQRUggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fcGUgICAgICAgICAgICAgICAgMHgxMDAwNTdhICAvKiBVKzA1N0EgQVJNRU5JQU4gU01BTEwgTEVUVEVSIFBFSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9KRSAgICAgICAgICAgICAgICAweDEwMDA1NGIgIC8qIFUrMDU0QiBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBKSEVIICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2plICAgICAgICAgICAgICAgIDB4MTAwMDU3YiAgLyogVSswNTdCIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBKSEVIICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1JBICAgICAgICAgICAgICAgIDB4MTAwMDU0YyAgLyogVSswNTRDIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFJBICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3JhICAgICAgICAgICAgICAgIDB4MTAwMDU3YyAgLyogVSswNTdDIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBSQSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9TRSAgICAgICAgICAgICAgICAweDEwMDA1NGQgIC8qIFUrMDU0RCBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBTRUggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fc2UgICAgICAgICAgICAgICAgMHgxMDAwNTdkICAvKiBVKzA1N0QgQVJNRU5JQU4gU01BTEwgTEVUVEVSIFNFSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9WRVYgICAgICAgICAgICAgICAweDEwMDA1NGUgIC8qIFUrMDU0RSBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBWRVcgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fdmV2ICAgICAgICAgICAgICAgMHgxMDAwNTdlICAvKiBVKzA1N0UgQVJNRU5JQU4gU01BTEwgTEVUVEVSIFZFVyAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9UWVVOICAgICAgICAgICAgICAweDEwMDA1NGYgIC8qIFUrMDU0RiBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBUSVdOICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3R5dW4gICAgICAgICAgICAgIDB4MTAwMDU3ZiAgLyogVSswNTdGIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBUSVdOICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1JFICAgICAgICAgICAgICAgIDB4MTAwMDU1MCAgLyogVSswNTUwIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFJFSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9yZSAgICAgICAgICAgICAgICAweDEwMDA1ODAgIC8qIFUrMDU4MCBBUk1FTklBTiBTTUFMTCBMRVRURVIgUkVIICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1RTTyAgICAgICAgICAgICAgIDB4MTAwMDU1MSAgLyogVSswNTUxIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIENPICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3RzbyAgICAgICAgICAgICAgIDB4MTAwMDU4MSAgLyogVSswNTgxIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBDTyAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9WWVVOICAgICAgICAgICAgICAweDEwMDA1NTIgIC8qIFUrMDU1MiBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBZSVdOICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3Z5dW4gICAgICAgICAgICAgIDB4MTAwMDU4MiAgLyogVSswNTgyIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBZSVdOICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1BZVVIgICAgICAgICAgICAgIDB4MTAwMDU1MyAgLyogVSswNTUzIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFBJV1IgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fcHl1ciAgICAgICAgICAgICAgMHgxMDAwNTgzICAvKiBVKzA1ODMgQVJNRU5JQU4gU01BTEwgTEVUVEVSIFBJV1IgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fS0UgICAgICAgICAgICAgICAgMHgxMDAwNTU0ICAvKiBVKzA1NTQgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgS0VIICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2tlICAgICAgICAgICAgICAgIDB4MTAwMDU4NCAgLyogVSswNTg0IEFSTUVOSUFOIFNNQUxMIExFVFRFUiBLRUggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fTyAgICAgICAgICAgICAgICAgMHgxMDAwNTU1ICAvKiBVKzA1NTUgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgT0ggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fbyAgICAgICAgICAgICAgICAgMHgxMDAwNTg1ICAvKiBVKzA1ODUgQVJNRU5JQU4gU01BTEwgTEVUVEVSIE9IICovCisjZGVmaW5lIFhLX0FybWVuaWFuX0ZFICAgICAgICAgICAgICAgIDB4MTAwMDU1NiAgLyogVSswNTU2IEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIEZFSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9mZSAgICAgICAgICAgICAgICAweDEwMDA1ODYgIC8qIFUrMDU4NiBBUk1FTklBTiBTTUFMTCBMRVRURVIgRkVIICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2Fwb3N0cm9waGUgICAgICAgIDB4MTAwMDU1YSAgLyogVSswNTVBIEFSTUVOSUFOIEFQT1NUUk9QSEUgKi8KKyNlbmRpZiAvKiBYS19BUk1FTklBTiAqLworCisvKgorICogR2VvcmdpYW4KKyAqLworCisjaWZkZWYgWEtfR0VPUkdJQU4KKyNkZWZpbmUgWEtfR2VvcmdpYW5fYW4gICAgICAgICAgICAgICAgMHgxMDAxMGQwICAvKiBVKzEwRDAgR0VPUkdJQU4gTEVUVEVSIEFOICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2JhbiAgICAgICAgICAgICAgIDB4MTAwMTBkMSAgLyogVSsxMEQxIEdFT1JHSUFOIExFVFRFUiBCQU4gKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5fZ2FuICAgICAgICAgICAgICAgMHgxMDAxMGQyICAvKiBVKzEwRDIgR0VPUkdJQU4gTEVUVEVSIEdBTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9kb24gICAgICAgICAgICAgICAweDEwMDEwZDMgIC8qIFUrMTBEMyBHRU9SR0lBTiBMRVRURVIgRE9OICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2VuICAgICAgICAgICAgICAgIDB4MTAwMTBkNCAgLyogVSsxMEQ0IEdFT1JHSUFOIExFVFRFUiBFTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl92aW4gICAgICAgICAgICAgICAweDEwMDEwZDUgIC8qIFUrMTBENSBHRU9SR0lBTiBMRVRURVIgVklOICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX3plbiAgICAgICAgICAgICAgIDB4MTAwMTBkNiAgLyogVSsxMEQ2IEdFT1JHSUFOIExFVFRFUiBaRU4gKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5fdGFuICAgICAgICAgICAgICAgMHgxMDAxMGQ3ICAvKiBVKzEwRDcgR0VPUkdJQU4gTEVUVEVSIFRBTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9pbiAgICAgICAgICAgICAgICAweDEwMDEwZDggIC8qIFUrMTBEOCBHRU9SR0lBTiBMRVRURVIgSU4gKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5fa2FuICAgICAgICAgICAgICAgMHgxMDAxMGQ5ICAvKiBVKzEwRDkgR0VPUkdJQU4gTEVUVEVSIEtBTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9sYXMgICAgICAgICAgICAgICAweDEwMDEwZGEgIC8qIFUrMTBEQSBHRU9SR0lBTiBMRVRURVIgTEFTICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX21hbiAgICAgICAgICAgICAgIDB4MTAwMTBkYiAgLyogVSsxMERCIEdFT1JHSUFOIExFVFRFUiBNQU4gKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5fbmFyICAgICAgICAgICAgICAgMHgxMDAxMGRjICAvKiBVKzEwREMgR0VPUkdJQU4gTEVUVEVSIE5BUiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9vbiAgICAgICAgICAgICAgICAweDEwMDEwZGQgIC8qIFUrMTBERCBHRU9SR0lBTiBMRVRURVIgT04gKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5fcGFyICAgICAgICAgICAgICAgMHgxMDAxMGRlICAvKiBVKzEwREUgR0VPUkdJQU4gTEVUVEVSIFBBUiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl96aGFyICAgICAgICAgICAgICAweDEwMDEwZGYgIC8qIFUrMTBERiBHRU9SR0lBTiBMRVRURVIgWkhBUiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9yYWUgICAgICAgICAgICAgICAweDEwMDEwZTAgIC8qIFUrMTBFMCBHRU9SR0lBTiBMRVRURVIgUkFFICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX3NhbiAgICAgICAgICAgICAgIDB4MTAwMTBlMSAgLyogVSsxMEUxIEdFT1JHSUFOIExFVFRFUiBTQU4gKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5fdGFyICAgICAgICAgICAgICAgMHgxMDAxMGUyICAvKiBVKzEwRTIgR0VPUkdJQU4gTEVUVEVSIFRBUiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl91biAgICAgICAgICAgICAgICAweDEwMDEwZTMgIC8qIFUrMTBFMyBHRU9SR0lBTiBMRVRURVIgVU4gKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5fcGhhciAgICAgICAgICAgICAgMHgxMDAxMGU0ICAvKiBVKzEwRTQgR0VPUkdJQU4gTEVUVEVSIFBIQVIgKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5fa2hhciAgICAgICAgICAgICAgMHgxMDAxMGU1ICAvKiBVKzEwRTUgR0VPUkdJQU4gTEVUVEVSIEtIQVIgKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5fZ2hhbiAgICAgICAgICAgICAgMHgxMDAxMGU2ICAvKiBVKzEwRTYgR0VPUkdJQU4gTEVUVEVSIEdIQU4gKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5fcWFyICAgICAgICAgICAgICAgMHgxMDAxMGU3ICAvKiBVKzEwRTcgR0VPUkdJQU4gTEVUVEVSIFFBUiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9zaGluICAgICAgICAgICAgICAweDEwMDEwZTggIC8qIFUrMTBFOCBHRU9SR0lBTiBMRVRURVIgU0hJTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9jaGluICAgICAgICAgICAgICAweDEwMDEwZTkgIC8qIFUrMTBFOSBHRU9SR0lBTiBMRVRURVIgQ0hJTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9jYW4gICAgICAgICAgICAgICAweDEwMDEwZWEgIC8qIFUrMTBFQSBHRU9SR0lBTiBMRVRURVIgQ0FOICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2ppbCAgICAgICAgICAgICAgIDB4MTAwMTBlYiAgLyogVSsxMEVCIEdFT1JHSUFOIExFVFRFUiBKSUwgKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5fY2lsICAgICAgICAgICAgICAgMHgxMDAxMGVjICAvKiBVKzEwRUMgR0VPUkdJQU4gTEVUVEVSIENJTCAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9jaGFyICAgICAgICAgICAgICAweDEwMDEwZWQgIC8qIFUrMTBFRCBHRU9SR0lBTiBMRVRURVIgQ0hBUiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl94YW4gICAgICAgICAgICAgICAweDEwMDEwZWUgIC8qIFUrMTBFRSBHRU9SR0lBTiBMRVRURVIgWEFOICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2poYW4gICAgICAgICAgICAgIDB4MTAwMTBlZiAgLyogVSsxMEVGIEdFT1JHSUFOIExFVFRFUiBKSEFOICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2hhZSAgICAgICAgICAgICAgIDB4MTAwMTBmMCAgLyogVSsxMEYwIEdFT1JHSUFOIExFVFRFUiBIQUUgKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5faGUgICAgICAgICAgICAgICAgMHgxMDAxMGYxICAvKiBVKzEwRjEgR0VPUkdJQU4gTEVUVEVSIEhFICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2hpZSAgICAgICAgICAgICAgIDB4MTAwMTBmMiAgLyogVSsxMEYyIEdFT1JHSUFOIExFVFRFUiBISUUgKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5fd2UgICAgICAgICAgICAgICAgMHgxMDAxMGYzICAvKiBVKzEwRjMgR0VPUkdJQU4gTEVUVEVSIFdFICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2hhciAgICAgICAgICAgICAgIDB4MTAwMTBmNCAgLyogVSsxMEY0IEdFT1JHSUFOIExFVFRFUiBIQVIgKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5faG9lICAgICAgICAgICAgICAgMHgxMDAxMGY1ICAvKiBVKzEwRjUgR0VPUkdJQU4gTEVUVEVSIEhPRSAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9maSAgICAgICAgICAgICAgICAweDEwMDEwZjYgIC8qIFUrMTBGNiBHRU9SR0lBTiBMRVRURVIgRkkgKi8KKyNlbmRpZiAvKiBYS19HRU9SR0lBTiAqLworCisvKgorICogQXplcmkgKGFuZCBvdGhlciBUdXJraWMgb3IgQ2F1Y2FzaWFuIGxhbmd1YWdlcykKKyAqLworCisjaWZkZWYgWEtfQ0FVQ0FTVVMKKy8qIGxhdGluICovCisjZGVmaW5lIFhLX1hhYm92ZWRvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWU4YSAgLyogVSsxRThBIExBVElOIENBUElUQUwgTEVUVEVSIFggV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfSWJyZXZlICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMTJjICAvKiBVKzAxMkMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEJSRVZFICovCisjZGVmaW5lIFhLX1pzdHJva2UgICAgICAgICAgICAgICAgICAgIDB4MTAwMDFiNSAgLyogVSswMUI1IExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfR2Nhcm9uICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMWU2ICAvKiBVKzAxRTYgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX09jYXJvbiAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDFkMSAgLyogVSswMUQyIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDQVJPTiAqLworI2RlZmluZSBYS19PYmFycmVkICAgICAgICAgICAgICAgICAgICAweDEwMDAxOWYgIC8qIFUrMDE5RiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggTUlERExFIFRJTERFICovCisjZGVmaW5lIFhLX3hhYm92ZWRvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWU4YiAgLyogVSsxRThCIExBVElOIFNNQUxMIExFVFRFUiBYIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX2licmV2ZSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDEyZCAgLyogVSswMTJEIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQlJFVkUgKi8KKyNkZWZpbmUgWEtfenN0cm9rZSAgICAgICAgICAgICAgICAgICAgMHgxMDAwMWI2ICAvKiBVKzAxQjYgTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfZ2Nhcm9uICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMWU3ICAvKiBVKzAxRTcgTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBDQVJPTiAqLworI2RlZmluZSBYS19vY2Fyb24gICAgICAgICAgICAgICAgICAgICAweDEwMDAxZDIgIC8qIFUrMDFEMiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX29iYXJyZWQgICAgICAgICAgICAgICAgICAgIDB4MTAwMDI3NSAgLyogVSswMjc1IExBVElOIFNNQUxMIExFVFRFUiBCQVJSRUQgTyAqLworI2RlZmluZSBYS19TQ0hXQSAgICAgICAgICAgICAgICAgICAgICAweDEwMDAxOGYgIC8qIFUrMDE4RiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTQ0hXQSAqLworI2RlZmluZSBYS19zY2h3YSAgICAgICAgICAgICAgICAgICAgICAweDEwMDAyNTkgIC8qIFUrMDI1OSBMQVRJTiBTTUFMTCBMRVRURVIgU0NIV0EgKi8KKy8qIHRob3NlIGFyZSBub3QgcmVhbGx5IENhdWNhc3VzICovCisvKiBGb3IgSW51cGlhayAqLworI2RlZmluZSBYS19MYmVsb3dkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlMzYgIC8qIFUrMUUzNiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggRE9UIEJFTE9XICovCisjZGVmaW5lIFhLX2xiZWxvd2RvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWUzNyAgLyogVSsxRTM3IExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggRE9UIEJFTE9XICovCisjZW5kaWYgLyogWEtfQ0FVQ0FTVVMgKi8KKworLyoKKyAqIFZpZXRuYW1lc2UKKyAqLworIAorI2lmZGVmIFhLX1ZJRVROQU1FU0UKKyNkZWZpbmUgWEtfQWJlbG93ZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZWEwICAvKiBVKzFFQTAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERPVCBCRUxPVyAqLworI2RlZmluZSBYS19hYmVsb3dkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlYTEgIC8qIFUrMUVBMSBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERPVCBCRUxPVyAqLworI2RlZmluZSBYS19BaG9vayAgICAgICAgICAgICAgICAgICAgICAweDEwMDFlYTIgIC8qIFUrMUVBMiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggSE9PSyBBQk9WRSAqLworI2RlZmluZSBYS19haG9vayAgICAgICAgICAgICAgICAgICAgICAweDEwMDFlYTMgIC8qIFUrMUVBMyBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfQWNpcmN1bWZsZXhhY3V0ZSAgICAgICAgICAgMHgxMDAxZWE0ICAvKiBVKzFFQTQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggQU5EIEFDVVRFICovCisjZGVmaW5lIFhLX2FjaXJjdW1mbGV4YWN1dGUgICAgICAgICAgIDB4MTAwMWVhNSAgLyogVSsxRUE1IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgQUNVVEUgKi8KKyNkZWZpbmUgWEtfQWNpcmN1bWZsZXhncmF2ZSAgICAgICAgICAgMHgxMDAxZWE2ICAvKiBVKzFFQTYgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggQU5EIEdSQVZFICovCisjZGVmaW5lIFhLX2FjaXJjdW1mbGV4Z3JhdmUgICAgICAgICAgIDB4MTAwMWVhNyAgLyogVSsxRUE3IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgR1JBVkUgKi8KKyNkZWZpbmUgWEtfQWNpcmN1bWZsZXhob29rICAgICAgICAgICAgMHgxMDAxZWE4ICAvKiBVKzFFQTggTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggQU5EIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfYWNpcmN1bWZsZXhob29rICAgICAgICAgICAgMHgxMDAxZWE5ICAvKiBVKzFFQTkgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYIEFORCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX0FjaXJjdW1mbGV4dGlsZGUgICAgICAgICAgIDB4MTAwMWVhYSAgLyogVSsxRUFBIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYIEFORCBUSUxERSAqLworI2RlZmluZSBYS19hY2lyY3VtZmxleHRpbGRlICAgICAgICAgICAweDEwMDFlYWIgIC8qIFUrMUVBQiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggQU5EIFRJTERFICovCisjZGVmaW5lIFhLX0FjaXJjdW1mbGV4YmVsb3dkb3QgICAgICAgIDB4MTAwMWVhYyAgLyogVSsxRUFDIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfYWNpcmN1bWZsZXhiZWxvd2RvdCAgICAgICAgMHgxMDAxZWFkICAvKiBVKzFFQUQgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfQWJyZXZlYWN1dGUgICAgICAgICAgICAgICAgMHgxMDAxZWFlICAvKiBVKzFFQUUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBBQ1VURSAqLworI2RlZmluZSBYS19hYnJldmVhY3V0ZSAgICAgICAgICAgICAgICAweDEwMDFlYWYgIC8qIFUrMUVBRiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBBQ1VURSAqLworI2RlZmluZSBYS19BYnJldmVncmF2ZSAgICAgICAgICAgICAgICAweDEwMDFlYjAgIC8qIFUrMUVCMCBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQlJFVkUgQU5EIEdSQVZFICovCisjZGVmaW5lIFhLX2FicmV2ZWdyYXZlICAgICAgICAgICAgICAgIDB4MTAwMWViMSAgLyogVSsxRUIxIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQlJFVkUgQU5EIEdSQVZFICovCisjZGVmaW5lIFhLX0FicmV2ZWhvb2sgICAgICAgICAgICAgICAgIDB4MTAwMWViMiAgLyogVSsxRUIyIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBCUkVWRSBBTkQgSE9PSyBBQk9WRSAqLworI2RlZmluZSBYS19hYnJldmVob29rICAgICAgICAgICAgICAgICAweDEwMDFlYjMgIC8qIFUrMUVCMyBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX0FicmV2ZXRpbGRlICAgICAgICAgICAgICAgIDB4MTAwMWViNCAgLyogVSsxRUI0IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBCUkVWRSBBTkQgVElMREUgKi8KKyNkZWZpbmUgWEtfYWJyZXZldGlsZGUgICAgICAgICAgICAgICAgMHgxMDAxZWI1ICAvKiBVKzFFQjUgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBCUkVWRSBBTkQgVElMREUgKi8KKyNkZWZpbmUgWEtfQWJyZXZlYmVsb3dkb3QgICAgICAgICAgICAgMHgxMDAxZWI2ICAvKiBVKzFFQjYgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfYWJyZXZlYmVsb3dkb3QgICAgICAgICAgICAgMHgxMDAxZWI3ICAvKiBVKzFFQjcgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBCUkVWRSBBTkQgRE9UIEJFTE9XICovCisjZGVmaW5lIFhLX0ViZWxvd2RvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWViOCAgLyogVSsxRUI4IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfZWJlbG93ZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZWI5ICAvKiBVKzFFQjkgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfRWhvb2sgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZWJhICAvKiBVKzFFQkEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfZWhvb2sgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZWJiICAvKiBVKzFFQkIgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX0V0aWxkZSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMWViYyAgLyogVSsxRUJDIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBUSUxERSAqLworI2RlZmluZSBYS19ldGlsZGUgICAgICAgICAgICAgICAgICAgICAweDEwMDFlYmQgIC8qIFUrMUVCRCBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIFRJTERFICovCisjZGVmaW5lIFhLX0VjaXJjdW1mbGV4YWN1dGUgICAgICAgICAgIDB4MTAwMWViZSAgLyogVSsxRUJFIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBBQ1VURSAqLworI2RlZmluZSBYS19lY2lyY3VtZmxleGFjdXRlICAgICAgICAgICAweDEwMDFlYmYgIC8qIFUrMUVCRiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggQU5EIEFDVVRFICovCisjZGVmaW5lIFhLX0VjaXJjdW1mbGV4Z3JhdmUgICAgICAgICAgIDB4MTAwMWVjMCAgLyogVSsxRUMwIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBHUkFWRSAqLworI2RlZmluZSBYS19lY2lyY3VtZmxleGdyYXZlICAgICAgICAgICAweDEwMDFlYzEgIC8qIFUrMUVDMSBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggQU5EIEdSQVZFICovCisjZGVmaW5lIFhLX0VjaXJjdW1mbGV4aG9vayAgICAgICAgICAgIDB4MTAwMWVjMiAgLyogVSsxRUMyIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX2VjaXJjdW1mbGV4aG9vayAgICAgICAgICAgIDB4MTAwMWVjMyAgLyogVSsxRUMzIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBBTkQgSE9PSyBBQk9WRSAqLworI2RlZmluZSBYS19FY2lyY3VtZmxleHRpbGRlICAgICAgICAgICAweDEwMDFlYzQgIC8qIFUrMUVDNCBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBBTkQgVElMREUgKi8KKyNkZWZpbmUgWEtfZWNpcmN1bWZsZXh0aWxkZSAgICAgICAgICAgMHgxMDAxZWM1ICAvKiBVKzFFQzUgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBUSUxERSAqLworI2RlZmluZSBYS19FY2lyY3VtZmxleGJlbG93ZG90ICAgICAgICAweDEwMDFlYzYgIC8qIFUrMUVDNiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBBTkQgRE9UIEJFTE9XICovCisjZGVmaW5lIFhLX2VjaXJjdW1mbGV4YmVsb3dkb3QgICAgICAgIDB4MTAwMWVjNyAgLyogVSsxRUM3IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBBTkQgRE9UIEJFTE9XICovCisjZGVmaW5lIFhLX0lob29rICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMWVjOCAgLyogVSsxRUM4IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX2lob29rICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMWVjOSAgLyogVSsxRUM5IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggSE9PSyBBQk9WRSAqLworI2RlZmluZSBYS19JYmVsb3dkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlY2EgIC8qIFUrMUVDQSBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRE9UIEJFTE9XICovCisjZGVmaW5lIFhLX2liZWxvd2RvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWVjYiAgLyogVSsxRUNCIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRE9UIEJFTE9XICovCisjZGVmaW5lIFhLX09iZWxvd2RvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWVjYyAgLyogVSsxRUNDIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfb2JlbG93ZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZWNkICAvKiBVKzFFQ0QgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfT2hvb2sgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZWNlICAvKiBVKzFFQ0UgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfb2hvb2sgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZWNmICAvKiBVKzFFQ0YgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX09jaXJjdW1mbGV4YWN1dGUgICAgICAgICAgIDB4MTAwMWVkMCAgLyogVSsxRUQwIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYIEFORCBBQ1VURSAqLworI2RlZmluZSBYS19vY2lyY3VtZmxleGFjdXRlICAgICAgICAgICAweDEwMDFlZDEgIC8qIFUrMUVEMSBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIEFDVVRFICovCisjZGVmaW5lIFhLX09jaXJjdW1mbGV4Z3JhdmUgICAgICAgICAgIDB4MTAwMWVkMiAgLyogVSsxRUQyIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYIEFORCBHUkFWRSAqLworI2RlZmluZSBYS19vY2lyY3VtZmxleGdyYXZlICAgICAgICAgICAweDEwMDFlZDMgIC8qIFUrMUVEMyBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIEdSQVZFICovCisjZGVmaW5lIFhLX09jaXJjdW1mbGV4aG9vayAgICAgICAgICAgIDB4MTAwMWVkNCAgLyogVSsxRUQ0IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYIEFORCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX29jaXJjdW1mbGV4aG9vayAgICAgICAgICAgIDB4MTAwMWVkNSAgLyogVSsxRUQ1IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCBBTkQgSE9PSyBBQk9WRSAqLworI2RlZmluZSBYS19PY2lyY3VtZmxleHRpbGRlICAgICAgICAgICAweDEwMDFlZDYgIC8qIFUrMUVENiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCBBTkQgVElMREUgKi8KKyNkZWZpbmUgWEtfb2NpcmN1bWZsZXh0aWxkZSAgICAgICAgICAgMHgxMDAxZWQ3ICAvKiBVKzFFRDcgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYIEFORCBUSUxERSAqLworI2RlZmluZSBYS19PY2lyY3VtZmxleGJlbG93ZG90ICAgICAgICAweDEwMDFlZDggIC8qIFUrMUVEOCBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCBBTkQgRE9UIEJFTE9XICovCisjZGVmaW5lIFhLX29jaXJjdW1mbGV4YmVsb3dkb3QgICAgICAgIDB4MTAwMWVkOSAgLyogVSsxRUQ5IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCBBTkQgRE9UIEJFTE9XICovCisjZGVmaW5lIFhLX09ob3JuYWN1dGUgICAgICAgICAgICAgICAgIDB4MTAwMWVkYSAgLyogVSsxRURBIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBIT1JOIEFORCBBQ1VURSAqLworI2RlZmluZSBYS19vaG9ybmFjdXRlICAgICAgICAgICAgICAgICAweDEwMDFlZGIgIC8qIFUrMUVEQiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIEFDVVRFICovCisjZGVmaW5lIFhLX09ob3JuZ3JhdmUgICAgICAgICAgICAgICAgIDB4MTAwMWVkYyAgLyogVSsxRURDIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBIT1JOIEFORCBHUkFWRSAqLworI2RlZmluZSBYS19vaG9ybmdyYXZlICAgICAgICAgICAgICAgICAweDEwMDFlZGQgIC8qIFUrMUVERCBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIEdSQVZFICovCisjZGVmaW5lIFhLX09ob3JuaG9vayAgICAgICAgICAgICAgICAgIDB4MTAwMWVkZSAgLyogVSsxRURFIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBIT1JOIEFORCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX29ob3JuaG9vayAgICAgICAgICAgICAgICAgIDB4MTAwMWVkZiAgLyogVSsxRURGIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggSE9STiBBTkQgSE9PSyBBQk9WRSAqLworI2RlZmluZSBYS19PaG9ybnRpbGRlICAgICAgICAgICAgICAgICAweDEwMDFlZTAgIC8qIFUrMUVFMCBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggSE9STiBBTkQgVElMREUgKi8KKyNkZWZpbmUgWEtfb2hvcm50aWxkZSAgICAgICAgICAgICAgICAgMHgxMDAxZWUxICAvKiBVKzFFRTEgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBIT1JOIEFORCBUSUxERSAqLworI2RlZmluZSBYS19PaG9ybmJlbG93ZG90ICAgICAgICAgICAgICAweDEwMDFlZTIgIC8qIFUrMUVFMiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggSE9STiBBTkQgRE9UIEJFTE9XICovCisjZGVmaW5lIFhLX29ob3JuYmVsb3dkb3QgICAgICAgICAgICAgIDB4MTAwMWVlMyAgLyogVSsxRUUzIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggSE9STiBBTkQgRE9UIEJFTE9XICovCisjZGVmaW5lIFhLX1ViZWxvd2RvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWVlNCAgLyogVSsxRUU0IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfdWJlbG93ZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZWU1ICAvKiBVKzFFRTUgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfVWhvb2sgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZWU2ICAvKiBVKzFFRTYgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfdWhvb2sgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZWU3ICAvKiBVKzFFRTcgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX1Vob3JuYWN1dGUgICAgICAgICAgICAgICAgIDB4MTAwMWVlOCAgLyogVSsxRUU4IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBBQ1VURSAqLworI2RlZmluZSBYS191aG9ybmFjdXRlICAgICAgICAgICAgICAgICAweDEwMDFlZTkgIC8qIFUrMUVFOSBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPUk4gQU5EIEFDVVRFICovCisjZGVmaW5lIFhLX1Vob3JuZ3JhdmUgICAgICAgICAgICAgICAgIDB4MTAwMWVlYSAgLyogVSsxRUVBIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBHUkFWRSAqLworI2RlZmluZSBYS191aG9ybmdyYXZlICAgICAgICAgICAgICAgICAweDEwMDFlZWIgIC8qIFUrMUVFQiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPUk4gQU5EIEdSQVZFICovCisjZGVmaW5lIFhLX1Vob3JuaG9vayAgICAgICAgICAgICAgICAgIDB4MTAwMWVlYyAgLyogVSsxRUVDIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX3Vob3JuaG9vayAgICAgICAgICAgICAgICAgIDB4MTAwMWVlZCAgLyogVSsxRUVEIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgSE9PSyBBQk9WRSAqLworI2RlZmluZSBYS19VaG9ybnRpbGRlICAgICAgICAgICAgICAgICAweDEwMDFlZWUgIC8qIFUrMUVFRSBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgVElMREUgKi8KKyNkZWZpbmUgWEtfdWhvcm50aWxkZSAgICAgICAgICAgICAgICAgMHgxMDAxZWVmICAvKiBVKzFFRUYgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBUSUxERSAqLworI2RlZmluZSBYS19VaG9ybmJlbG93ZG90ICAgICAgICAgICAgICAweDEwMDFlZjAgIC8qIFUrMUVGMCBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgRE9UIEJFTE9XICovCisjZGVmaW5lIFhLX3Vob3JuYmVsb3dkb3QgICAgICAgICAgICAgIDB4MTAwMWVmMSAgLyogVSsxRUYxIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgRE9UIEJFTE9XICovCisjZGVmaW5lIFhLX1liZWxvd2RvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWVmNCAgLyogVSsxRUY0IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfeWJlbG93ZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZWY1ICAvKiBVKzFFRjUgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfWWhvb2sgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZWY2ICAvKiBVKzFFRjYgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfeWhvb2sgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZWY3ICAvKiBVKzFFRjcgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX1l0aWxkZSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMWVmOCAgLyogVSsxRUY4IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBUSUxERSAqLworI2RlZmluZSBYS195dGlsZGUgICAgICAgICAgICAgICAgICAgICAweDEwMDFlZjkgIC8qIFUrMUVGOSBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIFRJTERFICovCisjZGVmaW5lIFhLX09ob3JuICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDFhMCAgLyogVSswMUEwIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBIT1JOICovCisjZGVmaW5lIFhLX29ob3JuICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDFhMSAgLyogVSswMUExIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggSE9STiAqLworI2RlZmluZSBYS19VaG9ybiAgICAgICAgICAgICAgICAgICAgICAweDEwMDAxYWYgIC8qIFUrMDFBRiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggSE9STiAqLworI2RlZmluZSBYS191aG9ybiAgICAgICAgICAgICAgICAgICAgICAweDEwMDAxYjAgIC8qIFUrMDFCMCBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPUk4gKi8KKworI2VuZGlmIC8qIFhLX1ZJRVROQU1FU0UgKi8KKworI2lmZGVmIFhLX0NVUlJFTkNZCisjZGVmaW5lIFhLX0VjdVNpZ24gICAgICAgICAgICAgICAgICAgIDB4MTAwMjBhMCAgLyogVSsyMEEwIEVVUk8tQ1VSUkVOQ1kgU0lHTiAqLworI2RlZmluZSBYS19Db2xvblNpZ24gICAgICAgICAgICAgICAgICAweDEwMDIwYTEgIC8qIFUrMjBBMSBDT0xPTiBTSUdOICovCisjZGVmaW5lIFhLX0NydXplaXJvU2lnbiAgICAgICAgICAgICAgIDB4MTAwMjBhMiAgLyogVSsyMEEyIENSVVpFSVJPIFNJR04gKi8KKyNkZWZpbmUgWEtfRkZyYW5jU2lnbiAgICAgICAgICAgICAgICAgMHgxMDAyMGEzICAvKiBVKzIwQTMgRlJFTkNIIEZSQU5DIFNJR04gKi8KKyNkZWZpbmUgWEtfTGlyYVNpZ24gICAgICAgICAgICAgICAgICAgMHgxMDAyMGE0ICAvKiBVKzIwQTQgTElSQSBTSUdOICovCisjZGVmaW5lIFhLX01pbGxTaWduICAgICAgICAgICAgICAgICAgIDB4MTAwMjBhNSAgLyogVSsyMEE1IE1JTEwgU0lHTiAqLworI2RlZmluZSBYS19OYWlyYVNpZ24gICAgICAgICAgICAgICAgICAweDEwMDIwYTYgIC8qIFUrMjBBNiBOQUlSQSBTSUdOICovCisjZGVmaW5lIFhLX1Blc2V0YVNpZ24gICAgICAgICAgICAgICAgIDB4MTAwMjBhNyAgLyogVSsyMEE3IFBFU0VUQSBTSUdOICovCisjZGVmaW5lIFhLX1J1cGVlU2lnbiAgICAgICAgICAgICAgICAgIDB4MTAwMjBhOCAgLyogVSsyMEE4IFJVUEVFIFNJR04gKi8KKyNkZWZpbmUgWEtfV29uU2lnbiAgICAgICAgICAgICAgICAgICAgMHgxMDAyMGE5ICAvKiBVKzIwQTkgV09OIFNJR04gKi8KKyNkZWZpbmUgWEtfTmV3U2hlcWVsU2lnbiAgICAgICAgICAgICAgMHgxMDAyMGFhICAvKiBVKzIwQUEgTkVXIFNIRVFFTCBTSUdOICovCisjZGVmaW5lIFhLX0RvbmdTaWduICAgICAgICAgICAgICAgICAgIDB4MTAwMjBhYiAgLyogVSsyMEFCIERPTkcgU0lHTiAqLworI2RlZmluZSBYS19FdXJvU2lnbiAgICAgICAgICAgICAgICAgICAgICAweDIwYWMgIC8qIFUrMjBBQyBFVVJPIFNJR04gKi8KKyNlbmRpZiAvKiBYS19DVVJSRU5DWSAqLworCisjaWZkZWYgWEtfTUFUSEVNQVRJQ0FMCisvKiBvbmUsIHR3byBhbmQgdGhyZWUgYXJlIGRlZmluZWQgYWJvdmUuICovCisjZGVmaW5lIFhLX3plcm9zdXBlcmlvciAgICAgICAgICAgICAgIDB4MTAwMjA3MCAgLyogVSsyMDcwIFNVUEVSU0NSSVBUIFpFUk8gKi8KKyNkZWZpbmUgWEtfZm91cnN1cGVyaW9yICAgICAgICAgICAgICAgMHgxMDAyMDc0ICAvKiBVKzIwNzQgU1VQRVJTQ1JJUFQgRk9VUiAqLworI2RlZmluZSBYS19maXZlc3VwZXJpb3IgICAgICAgICAgICAgICAweDEwMDIwNzUgIC8qIFUrMjA3NSBTVVBFUlNDUklQVCBGSVZFICovCisjZGVmaW5lIFhLX3NpeHN1cGVyaW9yICAgICAgICAgICAgICAgIDB4MTAwMjA3NiAgLyogVSsyMDc2IFNVUEVSU0NSSVBUIFNJWCAqLworI2RlZmluZSBYS19zZXZlbnN1cGVyaW9yICAgICAgICAgICAgICAweDEwMDIwNzcgIC8qIFUrMjA3NyBTVVBFUlNDUklQVCBTRVZFTiAqLworI2RlZmluZSBYS19laWdodHN1cGVyaW9yICAgICAgICAgICAgICAweDEwMDIwNzggIC8qIFUrMjA3OCBTVVBFUlNDUklQVCBFSUdIVCAqLworI2RlZmluZSBYS19uaW5lc3VwZXJpb3IgICAgICAgICAgICAgICAweDEwMDIwNzkgIC8qIFUrMjA3OSBTVVBFUlNDUklQVCBOSU5FICovCisjZGVmaW5lIFhLX3plcm9zdWJzY3JpcHQgICAgICAgICAgICAgIDB4MTAwMjA4MCAgLyogVSsyMDgwIFNVQlNDUklQVCBaRVJPICovCisjZGVmaW5lIFhLX29uZXN1YnNjcmlwdCAgICAgICAgICAgICAgIDB4MTAwMjA4MSAgLyogVSsyMDgxIFNVQlNDUklQVCBPTkUgKi8KKyNkZWZpbmUgWEtfdHdvc3Vic2NyaXB0ICAgICAgICAgICAgICAgMHgxMDAyMDgyICAvKiBVKzIwODIgU1VCU0NSSVBUIFRXTyAqLworI2RlZmluZSBYS190aHJlZXN1YnNjcmlwdCAgICAgICAgICAgICAweDEwMDIwODMgIC8qIFUrMjA4MyBTVUJTQ1JJUFQgVEhSRUUgKi8KKyNkZWZpbmUgWEtfZm91cnN1YnNjcmlwdCAgICAgICAgICAgICAgMHgxMDAyMDg0ICAvKiBVKzIwODQgU1VCU0NSSVBUIEZPVVIgKi8KKyNkZWZpbmUgWEtfZml2ZXN1YnNjcmlwdCAgICAgICAgICAgICAgMHgxMDAyMDg1ICAvKiBVKzIwODUgU1VCU0NSSVBUIEZJVkUgKi8KKyNkZWZpbmUgWEtfc2l4c3Vic2NyaXB0ICAgICAgICAgICAgICAgMHgxMDAyMDg2ICAvKiBVKzIwODYgU1VCU0NSSVBUIFNJWCAqLworI2RlZmluZSBYS19zZXZlbnN1YnNjcmlwdCAgICAgICAgICAgICAweDEwMDIwODcgIC8qIFUrMjA4NyBTVUJTQ1JJUFQgU0VWRU4gKi8KKyNkZWZpbmUgWEtfZWlnaHRzdWJzY3JpcHQgICAgICAgICAgICAgMHgxMDAyMDg4ICAvKiBVKzIwODggU1VCU0NSSVBUIEVJR0hUICovCisjZGVmaW5lIFhLX25pbmVzdWJzY3JpcHQgICAgICAgICAgICAgIDB4MTAwMjA4OSAgLyogVSsyMDg5IFNVQlNDUklQVCBOSU5FICovCisjZGVmaW5lIFhLX3BhcnRkaWZmZXJlbnRpYWwgICAgICAgICAgIDB4MTAwMjIwMiAgLyogVSsyMjAyIFBBUlRJQUwgRElGRkVSRU5USUFMICovCisjZGVmaW5lIFhLX2VtcHR5c2V0ICAgICAgICAgICAgICAgICAgIDB4MTAwMjIwNSAgLyogVSsyMjA1IE5VTEwgU0VUICovCisjZGVmaW5lIFhLX2VsZW1lbnRvZiAgICAgICAgICAgICAgICAgIDB4MTAwMjIwOCAgLyogVSsyMjA4IEVMRU1FTlQgT0YgKi8KKyNkZWZpbmUgWEtfbm90ZWxlbWVudG9mICAgICAgICAgICAgICAgMHgxMDAyMjA5ICAvKiBVKzIyMDkgTk9UIEFOIEVMRU1FTlQgT0YgKi8KKyNkZWZpbmUgWEtfY29udGFpbnNhcyAgICAgICAgICAgICAgICAgMHgxMDAyMjBCICAvKiBVKzIyMEIgQ09OVEFJTlMgQVMgTUVNQkVSICovCisjZGVmaW5lIFhLX3NxdWFyZXJvb3QgICAgICAgICAgICAgICAgIDB4MTAwMjIxQSAgLyogVSsyMjFBIFNRVUFSRSBST09UICovCisjZGVmaW5lIFhLX2N1YmVyb290ICAgICAgICAgICAgICAgICAgIDB4MTAwMjIxQiAgLyogVSsyMjFCIENVQkUgUk9PVCAqLworI2RlZmluZSBYS19mb3VydGhyb290ICAgICAgICAgICAgICAgICAweDEwMDIyMUMgIC8qIFUrMjIxQyBGT1VSVEggUk9PVCAqLworI2RlZmluZSBYS19kaW50ZWdyYWwgICAgICAgICAgICAgICAgICAweDEwMDIyMkMgIC8qIFUrMjIyQyBET1VCTEUgSU5URUdSQUwgKi8KKyNkZWZpbmUgWEtfdGludGVncmFsICAgICAgICAgICAgICAgICAgMHgxMDAyMjJEICAvKiBVKzIyMkQgVFJJUExFIElOVEVHUkFMICovCisjZGVmaW5lIFhLX2JlY2F1c2UgICAgICAgICAgICAgICAgICAgIDB4MTAwMjIzNSAgLyogVSsyMjM1IEJFQ0FVU0UgKi8KKyNkZWZpbmUgWEtfYXBwcm94ZXEgICAgICAgICAgICAgICAgICAgMHgxMDAyMjQ4ICAvKiBVKzIyNDUgQUxNT1NUIEVRVUFMIFRPICovCisjZGVmaW5lIFhLX25vdGFwcHJveGVxICAgICAgICAgICAgICAgIDB4MTAwMjI0NyAgLyogVSsyMjQ3IE5PVCBBTE1PU1QgRVFVQUwgVE8gKi8KKyNkZWZpbmUgWEtfbm90aWRlbnRpY2FsICAgICAgICAgICAgICAgMHgxMDAyMjYyICAvKiBVKzIyNjIgTk9UIElERU5USUNBTCBUTyAqLworI2RlZmluZSBYS19zdHJpY3RlcSAgICAgICAgICAgICAgICAgICAweDEwMDIyNjMgIC8qIFUrMjI2MyBTVFJJQ1RMWSBFUVVJVkFMRU5UIFRPICovICAgICAgICAgIAorI2VuZGlmIC8qIFhLX01BVEhFTUFUSUNBTCAqLworCisjaWZkZWYgWEtfQlJBSUxMRQorI2RlZmluZSBYS19icmFpbGxlX2RvdF8xICAgICAgICAgICAgICAgICAweGZmZjEKKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RfMiAgICAgICAgICAgICAgICAgMHhmZmYyCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90XzMgICAgICAgICAgICAgICAgIDB4ZmZmMworI2RlZmluZSBYS19icmFpbGxlX2RvdF80ICAgICAgICAgICAgICAgICAweGZmZjQKKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RfNSAgICAgICAgICAgICAgICAgMHhmZmY1CisjZGVmaW5lIFhLX2JyYWlsbGVfZG90XzYgICAgICAgICAgICAgICAgIDB4ZmZmNgorI2RlZmluZSBYS19icmFpbGxlX2RvdF83ICAgICAgICAgICAgICAgICAweGZmZjcKKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RfOCAgICAgICAgICAgICAgICAgMHhmZmY4CisjZGVmaW5lIFhLX2JyYWlsbGVfZG90XzkgICAgICAgICAgICAgICAgIDB4ZmZmOQorI2RlZmluZSBYS19icmFpbGxlX2RvdF8xMCAgICAgICAgICAgICAgICAweGZmZmEKKyNkZWZpbmUgWEtfYnJhaWxsZV9ibGFuayAgICAgICAgICAgICAgMHgxMDAyODAwICAvKiBVKzI4MDAgQlJBSUxMRSBQQVRURVJOIEJMQU5LICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xICAgICAgICAgICAgIDB4MTAwMjgwMSAgLyogVSsyODAxIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIgICAgICAgICAgICAgMHgxMDAyODAyICAvKiBVKzI4MDIgQlJBSUxMRSBQQVRURVJOIERPVFMtMiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIgICAgICAgICAgICAweDEwMDI4MDMgIC8qIFUrMjgwMyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMyAgICAgICAgICAgICAweDEwMDI4MDQgIC8qIFUrMjgwNCBCUkFJTExFIFBBVFRFUk4gRE9UUy0zICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMyAgICAgICAgICAgIDB4MTAwMjgwNSAgLyogVSsyODA1IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMyAgICAgICAgICAgIDB4MTAwMjgwNiAgLyogVSsyODA2IEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjMgICAgICAgICAgIDB4MTAwMjgwNyAgLyogVSsyODA3IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNCAgICAgICAgICAgICAweDEwMDI4MDggIC8qIFUrMjgwOCBCUkFJTExFIFBBVFRFUk4gRE9UUy00ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNCAgICAgICAgICAgIDB4MTAwMjgwOSAgLyogVSsyODA5IEJSQUlMTEUgUEFUVEVSTiBET1RTLTE0ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNCAgICAgICAgICAgIDB4MTAwMjgwYSAgLyogVSsyODBhIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI0ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjQgICAgICAgICAgIDB4MTAwMjgwYiAgLyogVSsyODBiIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzQgICAgICAgICAgICAweDEwMDI4MGMgIC8qIFUrMjgwYyBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM0ICAgICAgICAgICAweDEwMDI4MGQgIC8qIFUrMjgwZCBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzQgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNCAgICAgICAgICAgMHgxMDAyODBlICAvKiBVKzI4MGUgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM0ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM0ICAgICAgICAgIDB4MTAwMjgwZiAgLyogVSsyODBmIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzQgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzUgICAgICAgICAgICAgMHgxMDAyODEwICAvKiBVKzI4MTAgQlJBSUxMRSBQQVRURVJOIERPVFMtNSAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTUgICAgICAgICAgICAweDEwMDI4MTEgIC8qIFUrMjgxMSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNSAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjUgICAgICAgICAgICAweDEwMDI4MTIgIC8qIFUrMjgxMiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNSAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI1ICAgICAgICAgICAweDEwMDI4MTMgIC8qIFUrMjgxMyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjUgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM1ICAgICAgICAgICAgMHgxMDAyODE0ICAvKiBVKzI4MTQgQlJBSUxMRSBQQVRURVJOIERPVFMtMzUgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNSAgICAgICAgICAgMHgxMDAyODE1ICAvKiBVKzI4MTUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM1ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzUgICAgICAgICAgIDB4MTAwMjgxNiAgLyogVSsyODE2IEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNSAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNSAgICAgICAgICAweDEwMDI4MTcgIC8qIFUrMjgxNyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM1ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180NSAgICAgICAgICAgIDB4MTAwMjgxOCAgLyogVSsyODE4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQ1ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNDUgICAgICAgICAgIDB4MTAwMjgxOSAgLyogVSsyODE5IEJSQUlMTEUgUEFUVEVSTiBET1RTLTE0NSAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjQ1ICAgICAgICAgICAweDEwMDI4MWEgIC8qIFUrMjgxYSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNDUgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNDUgICAgICAgICAgMHgxMDAyODFiICAvKiBVKzI4MWIgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0NSAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzQ1ICAgICAgICAgICAweDEwMDI4MWMgIC8qIFUrMjgxYyBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNDUgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNDUgICAgICAgICAgMHgxMDAyODFkICAvKiBVKzI4MWQgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM0NSAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0NSAgICAgICAgICAweDEwMDI4MWUgIC8qIFUrMjgxZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQ1ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM0NSAgICAgICAgIDB4MTAwMjgxZiAgLyogVSsyODFmIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzQ1ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c182ICAgICAgICAgICAgIDB4MTAwMjgyMCAgLyogVSsyODIwIEJSQUlMTEUgUEFUVEVSTiBET1RTLTYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE2ICAgICAgICAgICAgMHgxMDAyODIxICAvKiBVKzI4MjEgQlJBSUxMRSBQQVRURVJOIERPVFMtMTYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI2ICAgICAgICAgICAgMHgxMDAyODIyICAvKiBVKzI4MjIgQlJBSUxMRSBQQVRURVJOIERPVFMtMjYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNiAgICAgICAgICAgMHgxMDAyODIzICAvKiBVKzI4MjMgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNiAgICAgICAgICAgIDB4MTAwMjgyNCAgLyogVSsyODI0IEJSQUlMTEUgUEFUVEVSTiBET1RTLTM2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzYgICAgICAgICAgIDB4MTAwMjgyNSAgLyogVSsyODI1IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM2ICAgICAgICAgICAweDEwMDI4MjYgIC8qIFUrMjgyNiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzYgICAgICAgICAgMHgxMDAyODI3ICAvKiBVKzI4MjcgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNDYgICAgICAgICAgICAweDEwMDI4MjggIC8qIFUrMjgyOCBCUkFJTExFIFBBVFRFUk4gRE9UUy00NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTQ2ICAgICAgICAgICAweDEwMDI4MjkgIC8qIFUrMjgyOSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNDYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI0NiAgICAgICAgICAgMHgxMDAyODJhICAvKiBVKzI4MmEgQlJBSUxMRSBQQVRURVJOIERPVFMtMjQ2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjQ2ICAgICAgICAgIDB4MTAwMjgyYiAgLyogVSsyODJiIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNDYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM0NiAgICAgICAgICAgMHgxMDAyODJjICAvKiBVKzI4MmMgQlJBSUxMRSBQQVRURVJOIERPVFMtMzQ2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzQ2ICAgICAgICAgIDB4MTAwMjgyZCAgLyogVSsyODJkIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNDYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNDYgICAgICAgICAgMHgxMDAyODJlICAvKiBVKzI4MmUgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM0NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNDYgICAgICAgICAweDEwMDI4MmYgIC8qIFUrMjgyZiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM0NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNTYgICAgICAgICAgICAweDEwMDI4MzAgIC8qIFUrMjgzMCBCUkFJTExFIFBBVFRFUk4gRE9UUy01NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTU2ICAgICAgICAgICAweDEwMDI4MzEgIC8qIFUrMjgzMSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNTYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI1NiAgICAgICAgICAgMHgxMDAyODMyICAvKiBVKzI4MzIgQlJBSUxMRSBQQVRURVJOIERPVFMtMjU2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjU2ICAgICAgICAgIDB4MTAwMjgzMyAgLyogVSsyODMzIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNTYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM1NiAgICAgICAgICAgMHgxMDAyODM0ICAvKiBVKzI4MzQgQlJBSUxMRSBQQVRURVJOIERPVFMtMzU2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzU2ICAgICAgICAgIDB4MTAwMjgzNSAgLyogVSsyODM1IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNTYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNTYgICAgICAgICAgMHgxMDAyODM2ICAvKiBVKzI4MzYgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM1NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNTYgICAgICAgICAweDEwMDI4MzcgIC8qIFUrMjgzNyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM1NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNDU2ICAgICAgICAgICAweDEwMDI4MzggIC8qIFUrMjgzOCBCUkFJTExFIFBBVFRFUk4gRE9UUy00NTYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE0NTYgICAgICAgICAgMHgxMDAyODM5ICAvKiBVKzI4MzkgQlJBSUxMRSBQQVRURVJOIERPVFMtMTQ1NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjQ1NiAgICAgICAgICAweDEwMDI4M2EgIC8qIFUrMjgzYSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNDU2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjQ1NiAgICAgICAgIDB4MTAwMjgzYiAgLyogVSsyODNiIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNDU2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNDU2ICAgICAgICAgIDB4MTAwMjgzYyAgLyogVSsyODNjIEJSQUlMTEUgUEFUVEVSTiBET1RTLTM0NTYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNDU2ICAgICAgICAgMHgxMDAyODNkICAvKiBVKzI4M2QgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM0NTYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNDU2ICAgICAgICAgMHgxMDAyODNlICAvKiBVKzI4M2UgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM0NTYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzQ1NiAgICAgICAgMHgxMDAyODNmICAvKiBVKzI4M2YgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNDU2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c183ICAgICAgICAgICAgIDB4MTAwMjg0MCAgLyogVSsyODQwIEJSQUlMTEUgUEFUVEVSTiBET1RTLTcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE3ICAgICAgICAgICAgMHgxMDAyODQxICAvKiBVKzI4NDEgQlJBSUxMRSBQQVRURVJOIERPVFMtMTcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI3ICAgICAgICAgICAgMHgxMDAyODQyICAvKiBVKzI4NDIgQlJBSUxMRSBQQVRURVJOIERPVFMtMjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNyAgICAgICAgICAgMHgxMDAyODQzICAvKiBVKzI4NDMgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNyAgICAgICAgICAgIDB4MTAwMjg0NCAgLyogVSsyODQ0IEJSQUlMTEUgUEFUVEVSTiBET1RTLTM3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzcgICAgICAgICAgIDB4MTAwMjg0NSAgLyogVSsyODQ1IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM3ICAgICAgICAgICAweDEwMDI4NDYgIC8qIFUrMjg0NiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzcgICAgICAgICAgMHgxMDAyODQ3ICAvKiBVKzI4NDcgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNDcgICAgICAgICAgICAweDEwMDI4NDggIC8qIFUrMjg0OCBCUkFJTExFIFBBVFRFUk4gRE9UUy00NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTQ3ICAgICAgICAgICAweDEwMDI4NDkgIC8qIFUrMjg0OSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNDcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI0NyAgICAgICAgICAgMHgxMDAyODRhICAvKiBVKzI4NGEgQlJBSUxMRSBQQVRURVJOIERPVFMtMjQ3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjQ3ICAgICAgICAgIDB4MTAwMjg0YiAgLyogVSsyODRiIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNDcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM0NyAgICAgICAgICAgMHgxMDAyODRjICAvKiBVKzI4NGMgQlJBSUxMRSBQQVRURVJOIERPVFMtMzQ3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzQ3ICAgICAgICAgIDB4MTAwMjg0ZCAgLyogVSsyODRkIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNDcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNDcgICAgICAgICAgMHgxMDAyODRlICAvKiBVKzI4NGUgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM0NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNDcgICAgICAgICAweDEwMDI4NGYgIC8qIFUrMjg0ZiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM0NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNTcgICAgICAgICAgICAweDEwMDI4NTAgIC8qIFUrMjg1MCBCUkFJTExFIFBBVFRFUk4gRE9UUy01NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTU3ICAgICAgICAgICAweDEwMDI4NTEgIC8qIFUrMjg1MSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNTcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI1NyAgICAgICAgICAgMHgxMDAyODUyICAvKiBVKzI4NTIgQlJBSUxMRSBQQVRURVJOIERPVFMtMjU3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjU3ICAgICAgICAgIDB4MTAwMjg1MyAgLyogVSsyODUzIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNTcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM1NyAgICAgICAgICAgMHgxMDAyODU0ICAvKiBVKzI4NTQgQlJBSUxMRSBQQVRURVJOIERPVFMtMzU3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzU3ICAgICAgICAgIDB4MTAwMjg1NSAgLyogVSsyODU1IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNTcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNTcgICAgICAgICAgMHgxMDAyODU2ICAvKiBVKzI4NTYgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM1NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNTcgICAgICAgICAweDEwMDI4NTcgIC8qIFUrMjg1NyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM1NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNDU3ICAgICAgICAgICAweDEwMDI4NTggIC8qIFUrMjg1OCBCUkFJTExFIFBBVFRFUk4gRE9UUy00NTcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE0NTcgICAgICAgICAgMHgxMDAyODU5ICAvKiBVKzI4NTkgQlJBSUxMRSBQQVRURVJOIERPVFMtMTQ1NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjQ1NyAgICAgICAgICAweDEwMDI4NWEgIC8qIFUrMjg1YSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNDU3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjQ1NyAgICAgICAgIDB4MTAwMjg1YiAgLyogVSsyODViIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNDU3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNDU3ICAgICAgICAgIDB4MTAwMjg1YyAgLyogVSsyODVjIEJSQUlMTEUgUEFUVEVSTiBET1RTLTM0NTcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNDU3ICAgICAgICAgMHgxMDAyODVkICAvKiBVKzI4NWQgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM0NTcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNDU3ICAgICAgICAgMHgxMDAyODVlICAvKiBVKzI4NWUgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM0NTcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzQ1NyAgICAgICAgMHgxMDAyODVmICAvKiBVKzI4NWYgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNDU3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c182NyAgICAgICAgICAgIDB4MTAwMjg2MCAgLyogVSsyODYwIEJSQUlMTEUgUEFUVEVSTiBET1RTLTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNjcgICAgICAgICAgIDB4MTAwMjg2MSAgLyogVSsyODYxIEJSQUlMTEUgUEFUVEVSTiBET1RTLTE2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjY3ICAgICAgICAgICAweDEwMDI4NjIgIC8qIFUrMjg2MiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNjcgICAgICAgICAgMHgxMDAyODYzICAvKiBVKzI4NjMgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzY3ICAgICAgICAgICAweDEwMDI4NjQgIC8qIFUrMjg2NCBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNjcgICAgICAgICAgMHgxMDAyODY1ICAvKiBVKzI4NjUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM2NyAgICAgICAgICAweDEwMDI4NjYgIC8qIFUrMjg2NiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM2NyAgICAgICAgIDB4MTAwMjg2NyAgLyogVSsyODY3IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180NjcgICAgICAgICAgIDB4MTAwMjg2OCAgLyogVSsyODY4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQ2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTQ2NyAgICAgICAgICAweDEwMDI4NjkgIC8qIFUrMjg2OSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNDY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNDY3ICAgICAgICAgIDB4MTAwMjg2YSAgLyogVSsyODZhIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI0NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNDY3ICAgICAgICAgMHgxMDAyODZiICAvKiBVKzI4NmIgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM0NjcgICAgICAgICAgMHgxMDAyODZjICAvKiBVKzI4NmMgQlJBSUxMRSBQQVRURVJOIERPVFMtMzQ2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM0NjcgICAgICAgICAweDEwMDI4NmQgIC8qIFUrMjg2ZCBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzQ2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0NjcgICAgICAgICAweDEwMDI4NmUgIC8qIFUrMjg2ZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQ2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNDY3ICAgICAgICAweDEwMDI4NmYgIC8qIFUrMjg2ZiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM0NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzU2NyAgICAgICAgICAgMHgxMDAyODcwICAvKiBVKzI4NzAgQlJBSUxMRSBQQVRURVJOIERPVFMtNTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNTY3ICAgICAgICAgIDB4MTAwMjg3MSAgLyogVSsyODcxIEJSQUlMTEUgUEFUVEVSTiBET1RTLTE1NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI1NjcgICAgICAgICAgMHgxMDAyODcyICAvKiBVKzI4NzIgQlJBSUxMRSBQQVRURVJOIERPVFMtMjU2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI1NjcgICAgICAgICAweDEwMDI4NzMgIC8qIFUrMjg3MyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjU2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzU2NyAgICAgICAgICAweDEwMDI4NzQgIC8qIFUrMjg3NCBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzU2NyAgICAgICAgIDB4MTAwMjg3NSAgLyogVSsyODc1IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzU2NyAgICAgICAgIDB4MTAwMjg3NiAgLyogVSsyODc2IEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM1NjcgICAgICAgIDB4MTAwMjg3NyAgLyogVSsyODc3IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzU2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNDU2NyAgICAgICAgICAweDEwMDI4NzggIC8qIFUrMjg3OCBCUkFJTExFIFBBVFRFUk4gRE9UUy00NTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNDU2NyAgICAgICAgIDB4MTAwMjg3OSAgLyogVSsyODc5IEJSQUlMTEUgUEFUVEVSTiBET1RTLTE0NTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNDU2NyAgICAgICAgIDB4MTAwMjg3YSAgLyogVSsyODdhIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI0NTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjQ1NjcgICAgICAgIDB4MTAwMjg3YiAgLyogVSsyODdiIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNDU2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzQ1NjcgICAgICAgICAweDEwMDI4N2MgIC8qIFUrMjg3YyBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNDU2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM0NTY3ICAgICAgICAweDEwMDI4N2QgIC8qIFUrMjg3ZCBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzQ1NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNDU2NyAgICAgICAgMHgxMDAyODdlICAvKiBVKzI4N2UgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM0NTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM0NTY3ICAgICAgIDB4MTAwMjg3ZiAgLyogVSsyODdmIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzQ1NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzggICAgICAgICAgICAgMHgxMDAyODgwICAvKiBVKzI4ODAgQlJBSUxMRSBQQVRURVJOIERPVFMtOCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTggICAgICAgICAgICAweDEwMDI4ODEgIC8qIFUrMjg4MSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xOCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjggICAgICAgICAgICAweDEwMDI4ODIgIC8qIFUrMjg4MiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yOCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI4ICAgICAgICAgICAweDEwMDI4ODMgIC8qIFUrMjg4MyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM4ICAgICAgICAgICAgMHgxMDAyODg0ICAvKiBVKzI4ODQgQlJBSUxMRSBQQVRURVJOIERPVFMtMzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzOCAgICAgICAgICAgMHgxMDAyODg1ICAvKiBVKzI4ODUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzggICAgICAgICAgIDB4MTAwMjg4NiAgLyogVSsyODg2IEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzOCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzOCAgICAgICAgICAweDEwMDI4ODcgIC8qIFUrMjg4NyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180OCAgICAgICAgICAgIDB4MTAwMjg4OCAgLyogVSsyODg4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQ4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNDggICAgICAgICAgIDB4MTAwMjg4OSAgLyogVSsyODg5IEJSQUlMTEUgUEFUVEVSTiBET1RTLTE0OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjQ4ICAgICAgICAgICAweDEwMDI4OGEgIC8qIFUrMjg4YSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNDggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNDggICAgICAgICAgMHgxMDAyODhiICAvKiBVKzI4OGIgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzQ4ICAgICAgICAgICAweDEwMDI4OGMgIC8qIFUrMjg4YyBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNDggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNDggICAgICAgICAgMHgxMDAyODhkICAvKiBVKzI4OGQgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM0OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0OCAgICAgICAgICAweDEwMDI4OGUgIC8qIFUrMjg4ZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQ4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM0OCAgICAgICAgIDB4MTAwMjg4ZiAgLyogVSsyODhmIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzQ4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c181OCAgICAgICAgICAgIDB4MTAwMjg5MCAgLyogVSsyODkwIEJSQUlMTEUgUEFUVEVSTiBET1RTLTU4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNTggICAgICAgICAgIDB4MTAwMjg5MSAgLyogVSsyODkxIEJSQUlMTEUgUEFUVEVSTiBET1RTLTE1OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjU4ICAgICAgICAgICAweDEwMDI4OTIgIC8qIFUrMjg5MiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNTggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNTggICAgICAgICAgMHgxMDAyODkzICAvKiBVKzI4OTMgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI1OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzU4ICAgICAgICAgICAweDEwMDI4OTQgIC8qIFUrMjg5NCBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNTggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNTggICAgICAgICAgMHgxMDAyODk1ICAvKiBVKzI4OTUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM1OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM1OCAgICAgICAgICAweDEwMDI4OTYgIC8qIFUrMjg5NiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzU4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM1OCAgICAgICAgIDB4MTAwMjg5NyAgLyogVSsyODk3IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzU4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180NTggICAgICAgICAgIDB4MTAwMjg5OCAgLyogVSsyODk4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQ1OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTQ1OCAgICAgICAgICAweDEwMDI4OTkgIC8qIFUrMjg5OSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNDU4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNDU4ICAgICAgICAgIDB4MTAwMjg5YSAgLyogVSsyODlhIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI0NTggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNDU4ICAgICAgICAgMHgxMDAyODliICAvKiBVKzI4OWIgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0NTggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM0NTggICAgICAgICAgMHgxMDAyODljICAvKiBVKzI4OWMgQlJBSUxMRSBQQVRURVJOIERPVFMtMzQ1OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM0NTggICAgICAgICAweDEwMDI4OWQgIC8qIFUrMjg5ZCBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzQ1OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0NTggICAgICAgICAweDEwMDI4OWUgIC8qIFUrMjg5ZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQ1OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNDU4ICAgICAgICAweDEwMDI4OWYgIC8qIFUrMjg5ZiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM0NTggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzY4ICAgICAgICAgICAgMHgxMDAyOGEwICAvKiBVKzI4YTAgQlJBSUxMRSBQQVRURVJOIERPVFMtNjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE2OCAgICAgICAgICAgMHgxMDAyOGExICAvKiBVKzI4YTEgQlJBSUxMRSBQQVRURVJOIERPVFMtMTY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNjggICAgICAgICAgIDB4MTAwMjhhMiAgLyogVSsyOGEyIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI2OCAgICAgICAgICAweDEwMDI4YTMgIC8qIFUrMjhhMyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNjggICAgICAgICAgIDB4MTAwMjhhNCAgLyogVSsyOGE0IEJSQUlMTEUgUEFUVEVSTiBET1RTLTM2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM2OCAgICAgICAgICAweDEwMDI4YTUgIC8qIFUrMjhhNSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzY4ICAgICAgICAgIDB4MTAwMjhhNiAgLyogVSsyOGE2IEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzY4ICAgICAgICAgMHgxMDAyOGE3ICAvKiBVKzI4YTcgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzQ2OCAgICAgICAgICAgMHgxMDAyOGE4ICAvKiBVKzI4YTggQlJBSUxMRSBQQVRURVJOIERPVFMtNDY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNDY4ICAgICAgICAgIDB4MTAwMjhhOSAgLyogVSsyOGE5IEJSQUlMTEUgUEFUVEVSTiBET1RTLTE0NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI0NjggICAgICAgICAgMHgxMDAyOGFhICAvKiBVKzI4YWEgQlJBSUxMRSBQQVRURVJOIERPVFMtMjQ2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI0NjggICAgICAgICAweDEwMDI4YWIgIC8qIFUrMjhhYiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjQ2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzQ2OCAgICAgICAgICAweDEwMDI4YWMgIC8qIFUrMjhhYyBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNDY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzQ2OCAgICAgICAgIDB4MTAwMjhhZCAgLyogVSsyOGFkIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNDY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzQ2OCAgICAgICAgIDB4MTAwMjhhZSAgLyogVSsyOGFlIEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNDY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM0NjggICAgICAgIDB4MTAwMjhhZiAgLyogVSsyOGFmIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzQ2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNTY4ICAgICAgICAgICAweDEwMDI4YjAgIC8qIFUrMjhiMCBCUkFJTExFIFBBVFRFUk4gRE9UUy01NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE1NjggICAgICAgICAgMHgxMDAyOGIxICAvKiBVKzI4YjEgQlJBSUxMRSBQQVRURVJOIERPVFMtMTU2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjU2OCAgICAgICAgICAweDEwMDI4YjIgIC8qIFUrMjhiMiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNTY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjU2OCAgICAgICAgIDB4MTAwMjhiMyAgLyogVSsyOGIzIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNTY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNTY4ICAgICAgICAgIDB4MTAwMjhiNCAgLyogVSsyOGI0IEJSQUlMTEUgUEFUVEVSTiBET1RTLTM1NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNTY4ICAgICAgICAgMHgxMDAyOGI1ICAvKiBVKzI4YjUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM1NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNTY4ICAgICAgICAgMHgxMDAyOGI2ICAvKiBVKzI4YjYgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM1NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzU2OCAgICAgICAgMHgxMDAyOGI3ICAvKiBVKzI4YjcgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNTY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180NTY4ICAgICAgICAgIDB4MTAwMjhiOCAgLyogVSsyOGI4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQ1NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE0NTY4ICAgICAgICAgMHgxMDAyOGI5ICAvKiBVKzI4YjkgQlJBSUxMRSBQQVRURVJOIERPVFMtMTQ1NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI0NTY4ICAgICAgICAgMHgxMDAyOGJhICAvKiBVKzI4YmEgQlJBSUxMRSBQQVRURVJOIERPVFMtMjQ1NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNDU2OCAgICAgICAgMHgxMDAyOGJiICAvKiBVKzI4YmIgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0NTY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNDU2OCAgICAgICAgIDB4MTAwMjhiYyAgLyogVSsyOGJjIEJSQUlMTEUgUEFUVEVSTiBET1RTLTM0NTY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzQ1NjggICAgICAgIDB4MTAwMjhiZCAgLyogVSsyOGJkIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNDU2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0NTY4ICAgICAgICAweDEwMDI4YmUgIC8qIFUrMjhiZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQ1NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzQ1NjggICAgICAgMHgxMDAyOGJmICAvKiBVKzI4YmYgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNDU2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNzggICAgICAgICAgICAweDEwMDI4YzAgIC8qIFUrMjhjMCBCUkFJTExFIFBBVFRFUk4gRE9UUy03OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTc4ICAgICAgICAgICAweDEwMDI4YzEgIC8qIFUrMjhjMSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI3OCAgICAgICAgICAgMHgxMDAyOGMyICAvKiBVKzI4YzIgQlJBSUxMRSBQQVRURVJOIERPVFMtMjc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjc4ICAgICAgICAgIDB4MTAwMjhjMyAgLyogVSsyOGMzIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM3OCAgICAgICAgICAgMHgxMDAyOGM0ICAvKiBVKzI4YzQgQlJBSUxMRSBQQVRURVJOIERPVFMtMzc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzc4ICAgICAgICAgIDB4MTAwMjhjNSAgLyogVSsyOGM1IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNzggICAgICAgICAgMHgxMDAyOGM2ICAvKiBVKzI4YzYgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNzggICAgICAgICAweDEwMDI4YzcgIC8qIFUrMjhjNyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNDc4ICAgICAgICAgICAweDEwMDI4YzggIC8qIFUrMjhjOCBCUkFJTExFIFBBVFRFUk4gRE9UUy00NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE0NzggICAgICAgICAgMHgxMDAyOGM5ICAvKiBVKzI4YzkgQlJBSUxMRSBQQVRURVJOIERPVFMtMTQ3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjQ3OCAgICAgICAgICAweDEwMDI4Y2EgIC8qIFUrMjhjYSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNDc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjQ3OCAgICAgICAgIDB4MTAwMjhjYiAgLyogVSsyOGNiIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNDc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNDc4ICAgICAgICAgIDB4MTAwMjhjYyAgLyogVSsyOGNjIEJSQUlMTEUgUEFUVEVSTiBET1RTLTM0NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNDc4ICAgICAgICAgMHgxMDAyOGNkICAvKiBVKzI4Y2QgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM0NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNDc4ICAgICAgICAgMHgxMDAyOGNlICAvKiBVKzI4Y2UgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM0NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzQ3OCAgICAgICAgMHgxMDAyOGNmICAvKiBVKzI4Y2YgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNDc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c181NzggICAgICAgICAgIDB4MTAwMjhkMCAgLyogVSsyOGQwIEJSQUlMTEUgUEFUVEVSTiBET1RTLTU3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTU3OCAgICAgICAgICAweDEwMDI4ZDEgIC8qIFUrMjhkMSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNTc4ICAgICAgICAgIDB4MTAwMjhkMiAgLyogVSsyOGQyIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI1NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNTc4ICAgICAgICAgMHgxMDAyOGQzICAvKiBVKzI4ZDMgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI1NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM1NzggICAgICAgICAgMHgxMDAyOGQ0ICAvKiBVKzI4ZDQgQlJBSUxMRSBQQVRURVJOIERPVFMtMzU3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM1NzggICAgICAgICAweDEwMDI4ZDUgIC8qIFUrMjhkNSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzU3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM1NzggICAgICAgICAweDEwMDI4ZDYgIC8qIFUrMjhkNiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzU3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNTc4ICAgICAgICAweDEwMDI4ZDcgIC8qIFUrMjhkNyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM1NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzQ1NzggICAgICAgICAgMHgxMDAyOGQ4ICAvKiBVKzI4ZDggQlJBSUxMRSBQQVRURVJOIERPVFMtNDU3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTQ1NzggICAgICAgICAweDEwMDI4ZDkgIC8qIFUrMjhkOSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNDU3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjQ1NzggICAgICAgICAweDEwMDI4ZGEgIC8qIFUrMjhkYSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNDU3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI0NTc4ICAgICAgICAweDEwMDI4ZGIgIC8qIFUrMjhkYiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjQ1NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM0NTc4ICAgICAgICAgMHgxMDAyOGRjICAvKiBVKzI4ZGMgQlJBSUxMRSBQQVRURVJOIERPVFMtMzQ1NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNDU3OCAgICAgICAgMHgxMDAyOGRkICAvKiBVKzI4ZGQgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM0NTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzQ1NzggICAgICAgIDB4MTAwMjhkZSAgLyogVSsyOGRlIEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNDU3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNDU3OCAgICAgICAweDEwMDI4ZGYgIC8qIFUrMjhkZiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM0NTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c182NzggICAgICAgICAgIDB4MTAwMjhlMCAgLyogVSsyOGUwIEJSQUlMTEUgUEFUVEVSTiBET1RTLTY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTY3OCAgICAgICAgICAweDEwMDI4ZTEgIC8qIFUrMjhlMSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNjc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNjc4ICAgICAgICAgIDB4MTAwMjhlMiAgLyogVSsyOGUyIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNjc4ICAgICAgICAgMHgxMDAyOGUzICAvKiBVKzI4ZTMgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM2NzggICAgICAgICAgMHgxMDAyOGU0ICAvKiBVKzI4ZTQgQlJBSUxMRSBQQVRURVJOIERPVFMtMzY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM2NzggICAgICAgICAweDEwMDI4ZTUgIC8qIFUrMjhlNSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM2NzggICAgICAgICAweDEwMDI4ZTYgIC8qIFUrMjhlNiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNjc4ICAgICAgICAweDEwMDI4ZTcgIC8qIFUrMjhlNyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzQ2NzggICAgICAgICAgMHgxMDAyOGU4ICAvKiBVKzI4ZTggQlJBSUxMRSBQQVRURVJOIERPVFMtNDY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTQ2NzggICAgICAgICAweDEwMDI4ZTkgIC8qIFUrMjhlOSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNDY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjQ2NzggICAgICAgICAweDEwMDI4ZWEgIC8qIFUrMjhlYSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNDY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI0Njc4ICAgICAgICAweDEwMDI4ZWIgIC8qIFUrMjhlYiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjQ2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM0Njc4ICAgICAgICAgMHgxMDAyOGVjICAvKiBVKzI4ZWMgQlJBSUxMRSBQQVRURVJOIERPVFMtMzQ2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNDY3OCAgICAgICAgMHgxMDAyOGVkICAvKiBVKzI4ZWQgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM0Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzQ2NzggICAgICAgIDB4MTAwMjhlZSAgLyogVSsyOGVlIEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNDY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNDY3OCAgICAgICAweDEwMDI4ZWYgIC8qIFUrMjhlZiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM0Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c181Njc4ICAgICAgICAgIDB4MTAwMjhmMCAgLyogVSsyOGYwIEJSQUlMTEUgUEFUVEVSTiBET1RTLTU2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE1Njc4ICAgICAgICAgMHgxMDAyOGYxICAvKiBVKzI4ZjEgQlJBSUxMRSBQQVRURVJOIERPVFMtMTU2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI1Njc4ICAgICAgICAgMHgxMDAyOGYyICAvKiBVKzI4ZjIgQlJBSUxMRSBQQVRURVJOIERPVFMtMjU2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNTY3OCAgICAgICAgMHgxMDAyOGYzICAvKiBVKzI4ZjMgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI1Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNTY3OCAgICAgICAgIDB4MTAwMjhmNCAgLyogVSsyOGY0IEJSQUlMTEUgUEFUVEVSTiBET1RTLTM1Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzU2NzggICAgICAgIDB4MTAwMjhmNSAgLyogVSsyOGY1IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNTY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM1Njc4ICAgICAgICAweDEwMDI4ZjYgIC8qIFUrMjhmNiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzU2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzU2NzggICAgICAgMHgxMDAyOGY3ICAvKiBVKzI4ZjcgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNTY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNDU2NzggICAgICAgICAweDEwMDI4ZjggIC8qIFUrMjhmOCBCUkFJTExFIFBBVFRFUk4gRE9UUy00NTY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTQ1Njc4ICAgICAgICAweDEwMDI4ZjkgIC8qIFUrMjhmOSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNDU2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI0NTY3OCAgICAgICAgMHgxMDAyOGZhICAvKiBVKzI4ZmEgQlJBSUxMRSBQQVRURVJOIERPVFMtMjQ1Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjQ1Njc4ICAgICAgIDB4MTAwMjhmYiAgLyogVSsyOGZiIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNDU2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM0NTY3OCAgICAgICAgMHgxMDAyOGZjICAvKiBVKzI4ZmMgQlJBSUxMRSBQQVRURVJOIERPVFMtMzQ1Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzQ1Njc4ICAgICAgIDB4MTAwMjhmZCAgLyogVSsyOGZkIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNDU2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNDU2NzggICAgICAgMHgxMDAyOGZlICAvKiBVKzI4ZmUgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM0NTY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNDU2NzggICAgICAweDEwMDI4ZmYgIC8qIFUrMjhmZiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM0NTY3OCAqLworI2VuZGlmIC8qIFhLX0JSQUlMTEUgKi8KKworLyoKKyAqIFNpbmhhbGEgKGh0dHA6Ly91bmljb2RlLm9yZy9jaGFydHMvUERGL1UwRDgwLnBkZikKKyAqIGh0dHA6Ly93d3cubm9uZ251Lm9yZy9zaW5oYWxhL2RvYy90cmFuc2xpdGVyYXRpb24vc2luaGFsYS10cmFuc2xpdGVyYXRpb25fNi5odG1sCisgKi8KKworI2lmZGVmIFhLX1NJTkhBTEEKKyNkZWZpbmUgWEtfU2luaF9uZyAgICAgICAgICAgIDB4MTAwMGQ4MiAgLyogVSswRDgyIFNJTkhBTEEgQU5VU1ZBUkFZQSAqLworI2RlZmluZSBYS19TaW5oX2gyICAgICAgICAgICAgMHgxMDAwZDgzICAvKiBVKzBEODMgU0lOSEFMQSBWSVNBUkdBWUEgKi8KKyNkZWZpbmUgWEtfU2luaF9hICAgICAgICAgICAgIDB4MTAwMGQ4NSAgLyogVSswRDg1IFNJTkhBTEEgQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfYWEgICAgICAgICAgICAweDEwMDBkODYgIC8qIFUrMEQ4NiBTSU5IQUxBIEFBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9hZSAgICAgICAgICAgIDB4MTAwMGQ4NyAgLyogVSswRDg3IFNJTkhBTEEgQUVZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2FlZSAgICAgICAgICAgMHgxMDAwZDg4ICAvKiBVKzBEODggU0lOSEFMQSBBRUVZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2kgICAgICAgICAgICAgMHgxMDAwZDg5ICAvKiBVKzBEODkgU0lOSEFMQSBJWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9paSAgICAgICAgICAgIDB4MTAwMGQ4YSAgLyogVSswRDhBIFNJTkhBTEEgSUlZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX3UgICAgICAgICAgICAgMHgxMDAwZDhiICAvKiBVKzBEOEIgU0lOSEFMQSBVWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF91dSAgICAgICAgICAgIDB4MTAwMGQ4YyAgLyogVSswRDhDIFNJTkhBTEEgVVVZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX3JpICAgICAgICAgICAgMHgxMDAwZDhkICAvKiBVKzBEOEQgU0lOSEFMQSBJUlVZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX3JpaSAgICAgICAgICAgMHgxMDAwZDhlICAvKiBVKzBEOEUgU0lOSEFMQSBJUlVVWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9sdSAgICAgICAgICAgIDB4MTAwMGQ4ZiAgLyogVSswRDhGIFNJTkhBTEEgSUxVWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9sdXUgICAgICAgICAgIDB4MTAwMGQ5MCAgLyogVSswRDkwIFNJTkhBTEEgSUxVVVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfZSAgICAgICAgICAgICAweDEwMDBkOTEgIC8qIFUrMEQ5MSBTSU5IQUxBIEVZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2VlICAgICAgICAgICAgMHgxMDAwZDkyICAvKiBVKzBEOTIgU0lOSEFMQSBFRVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfYWkgICAgICAgICAgICAweDEwMDBkOTMgIC8qIFUrMEQ5MyBTSU5IQUxBIEFJWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9vICAgICAgICAgICAgIDB4MTAwMGQ5NCAgLyogVSswRDk0IFNJTkhBTEEgT1lBTk5BICovCisjZGVmaW5lIFhLX1Npbmhfb28gICAgICAgICAgICAweDEwMDBkOTUgIC8qIFUrMEQ5NSBTSU5IQUxBIE9PWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9hdSAgICAgICAgICAgIDB4MTAwMGQ5NiAgLyogVSswRDk2IFNJTkhBTEEgQVVZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2thICAgICAgICAgICAgMHgxMDAwZDlhICAvKiBVKzBEOUEgU0lOSEFMQSBLQVlBTk5BICovCisjZGVmaW5lIFhLX1Npbmhfa2hhICAgICAgICAgICAweDEwMDBkOWIgIC8qIFUrMEQ5QiBTSU5IQUxBIE1BSEEuIEtBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9nYSAgICAgICAgICAgIDB4MTAwMGQ5YyAgLyogVSswRDlDIFNJTkhBTEEgR0FZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2doYSAgICAgICAgICAgMHgxMDAwZDlkICAvKiBVKzBEOUQgU0lOSEFMQSBNQUhBLiBHQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfbmcyICAgICAgICAgICAweDEwMDBkOWUgIC8qIFUrMEQ5RSBTSU5IQUxBIEtBTlRBSkEgTkFBU0lLWUFZQSAqLworI2RlZmluZSBYS19TaW5oX25nYSAgICAgICAgICAgMHgxMDAwZDlmICAvKiBVKzBEOUYgU0lOSEFMQSBTQU5ZQUtBIEdBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9jYSAgICAgICAgICAgIDB4MTAwMGRhMCAgLyogVSswREEwIFNJTkhBTEEgQ0FZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2NoYSAgICAgICAgICAgMHgxMDAwZGExICAvKiBVKzBEQTEgU0lOSEFMQSBNQUhBLiBDQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfamEgICAgICAgICAgICAweDEwMDBkYTIgIC8qIFUrMERBMiBTSU5IQUxBIEpBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9qaGEgICAgICAgICAgIDB4MTAwMGRhMyAgLyogVSswREEzIFNJTkhBTEEgTUFIQS4gSkFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX255YSAgICAgICAgICAgMHgxMDAwZGE0ICAvKiBVKzBEQTQgU0lOSEFMQSBUQUFMVUpBIE5BQVNJS1lBWUEgKi8KKyNkZWZpbmUgWEtfU2luaF9qbnlhICAgICAgICAgIDB4MTAwMGRhNSAgLyogVSswREE1IFNJTkhBTEEgVEFBTFVKQSBTQU5ZT09HQSBOQUFTSUtZQVlBICovCisjZGVmaW5lIFhLX1NpbmhfbmphICAgICAgICAgICAweDEwMDBkYTYgIC8qIFUrMERBNiBTSU5IQUxBIFNBTllBS0EgSkFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX3R0YSAgICAgICAgICAgMHgxMDAwZGE3ICAvKiBVKzBEQTcgU0lOSEFMQSBUVEFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX3R0aGEgICAgICAgICAgMHgxMDAwZGE4ICAvKiBVKzBEQTggU0lOSEFMQSBNQUhBLiBUVEFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2RkYSAgICAgICAgICAgMHgxMDAwZGE5ICAvKiBVKzBEQTkgU0lOSEFMQSBEREFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2RkaGEgICAgICAgICAgMHgxMDAwZGFhICAvKiBVKzBEQUEgU0lOSEFMQSBNQUhBLiBEREFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX25uYSAgICAgICAgICAgMHgxMDAwZGFiICAvKiBVKzBEQUIgU0lOSEFMQSBNVVVSREhBSkEgTkFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX25kZGEgICAgICAgICAgMHgxMDAwZGFjICAvKiBVKzBEQUMgU0lOSEFMQSBTQU5ZQUtBIEREQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfdGhhICAgICAgICAgICAweDEwMDBkYWQgIC8qIFUrMERBRCBTSU5IQUxBIFRBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF90aGhhICAgICAgICAgIDB4MTAwMGRhZSAgLyogVSswREFFIFNJTkhBTEEgTUFIQS4gVEFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2RoYSAgICAgICAgICAgMHgxMDAwZGFmICAvKiBVKzBEQUYgU0lOSEFMQSBEQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfZGhoYSAgICAgICAgICAweDEwMDBkYjAgIC8qIFUrMERCMCBTSU5IQUxBIE1BSEEuIERBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9uYSAgICAgICAgICAgIDB4MTAwMGRiMSAgLyogVSswREIxIFNJTkhBTEEgREFOVEFKQSBOQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfbmRoYSAgICAgICAgICAweDEwMDBkYjMgIC8qIFUrMERCMyBTSU5IQUxBIFNBTllBS0EgREFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX3BhICAgICAgICAgICAgMHgxMDAwZGI0ICAvKiBVKzBEQjQgU0lOSEFMQSBQQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfcGhhICAgICAgICAgICAweDEwMDBkYjUgIC8qIFUrMERCNSBTSU5IQUxBIE1BSEEuIFBBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9iYSAgICAgICAgICAgIDB4MTAwMGRiNiAgLyogVSswREI2IFNJTkhBTEEgQkFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2JoYSAgICAgICAgICAgMHgxMDAwZGI3ICAvKiBVKzBEQjcgU0lOSEFMQSBNQUhBLiBCQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfbWEgICAgICAgICAgICAweDEwMDBkYjggIC8qIFUrMERCOCBTSU5IQUxBIE1BWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9tYmEgICAgICAgICAgIDB4MTAwMGRiOSAgLyogVSswREI5IFNJTkhBTEEgQU1CQSBCQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfeWEgICAgICAgICAgICAweDEwMDBkYmEgIC8qIFUrMERCQSBTSU5IQUxBIFlBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9yYSAgICAgICAgICAgIDB4MTAwMGRiYiAgLyogVSswREJCIFNJTkhBTEEgUkFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2xhICAgICAgICAgICAgMHgxMDAwZGJkICAvKiBVKzBEQkQgU0lOSEFMQSBEQU5UQUpBIExBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF92YSAgICAgICAgICAgIDB4MTAwMGRjMCAgLyogVSswREMwIFNJTkhBTEEgVkFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX3NoYSAgICAgICAgICAgMHgxMDAwZGMxICAvKiBVKzBEQzEgU0lOSEFMQSBUQUFMVUpBIFNBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9zc2hhICAgICAgICAgIDB4MTAwMGRjMiAgLyogVSswREMyIFNJTkhBTEEgTVVVUkRIQUpBIFNBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9zYSAgICAgICAgICAgIDB4MTAwMGRjMyAgLyogVSswREMzIFNJTkhBTEEgREFOVEFKQSBTQVlBTk5BICovCisjZGVmaW5lIFhLX1NpbmhfaGEgICAgICAgICAgICAweDEwMDBkYzQgIC8qIFUrMERDNCBTSU5IQUxBIEhBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9sbGEgICAgICAgICAgIDB4MTAwMGRjNSAgLyogVSswREM1IFNJTkhBTEEgTVVVUkRIQUpBIExBWUFOTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9mYSAgICAgICAgICAgIDB4MTAwMGRjNiAgLyogVSswREM2IFNJTkhBTEEgRkFZQU5OQSAqLworI2RlZmluZSBYS19TaW5oX2FsICAgICAgICAgICAgMHgxMDAwZGNhICAvKiBVKzBEQ0EgU0lOSEFMQSBBTC1MQUtVTkEgKi8KKyNkZWZpbmUgWEtfU2luaF9hYTIgICAgICAgICAgIDB4MTAwMGRjZiAgLyogVSswRENGIFNJTkhBTEEgQUVMQS1QSUxMQSAqLworI2RlZmluZSBYS19TaW5oX2FlMiAgICAgICAgICAgMHgxMDAwZGQwICAvKiBVKzBERDAgU0lOSEFMQSBBRURBLVBJTExBICovCisjZGVmaW5lIFhLX1NpbmhfYWVlMiAgICAgICAgICAweDEwMDBkZDEgIC8qIFUrMEREMSBTSU5IQUxBIERJR0EgQUVEQS1QSUxMQSAqLworI2RlZmluZSBYS19TaW5oX2kyICAgICAgICAgICAgMHgxMDAwZGQyICAvKiBVKzBERDIgU0lOSEFMQSBJUy1QSUxMQSAqLworI2RlZmluZSBYS19TaW5oX2lpMiAgICAgICAgICAgMHgxMDAwZGQzICAvKiBVKzBERDMgU0lOSEFMQSBESUdBIElTLVBJTExBICovCisjZGVmaW5lIFhLX1NpbmhfdTIgICAgICAgICAgICAweDEwMDBkZDQgIC8qIFUrMERENCBTSU5IQUxBIFBBQS1QSUxMQSAqLworI2RlZmluZSBYS19TaW5oX3V1MiAgICAgICAgICAgMHgxMDAwZGQ2ICAvKiBVKzBERDYgU0lOSEFMQSBESUdBIFBBQS1QSUxMQSAqLworI2RlZmluZSBYS19TaW5oX3J1MiAgICAgICAgICAgMHgxMDAwZGQ4ICAvKiBVKzBERDggU0lOSEFMQSBHQUVUVEEtUElMTEEgKi8KKyNkZWZpbmUgWEtfU2luaF9lMiAgICAgICAgICAgIDB4MTAwMGRkOSAgLyogVSswREQ5IFNJTkhBTEEgS09NQlVWQSAqLworI2RlZmluZSBYS19TaW5oX2VlMiAgICAgICAgICAgMHgxMDAwZGRhICAvKiBVKzBEREEgU0lOSEFMQSBESUdBIEtPTUJVVkEgKi8KKyNkZWZpbmUgWEtfU2luaF9haTIgICAgICAgICAgIDB4MTAwMGRkYiAgLyogVSswRERCIFNJTkhBTEEgS09NQlUgREVLQSAqLworI2RlZmluZSBYS19TaW5oX28yICAgICAgICAgICAgMHgxMDAwZGRjICAvKiBVKzBEREMgU0lOSEFMQSBLT01CVVZBIEhBQSBBRUxBLVBJTExBKi8KKyNkZWZpbmUgWEtfU2luaF9vbzIgICAgICAgICAgIDB4MTAwMGRkZCAgLyogVSswREREIFNJTkhBTEEgS09NQlVWQSBIQUEgRElHQSBBRUxBLVBJTExBKi8KKyNkZWZpbmUgWEtfU2luaF9hdTIgICAgICAgICAgIDB4MTAwMGRkZSAgLyogVSswRERFIFNJTkhBTEEgS09NQlVWQSBIQUEgR0FZQU5VS0lUVEEgKi8KKyNkZWZpbmUgWEtfU2luaF9sdTIgICAgICAgICAgIDB4MTAwMGRkZiAgLyogVSswRERGIFNJTkhBTEEgR0FZQU5VS0lUVEEgKi8KKyNkZWZpbmUgWEtfU2luaF9ydXUyICAgICAgICAgIDB4MTAwMGRmMiAgLyogVSswREYyIFNJTkhBTEEgRElHQSBHQUVUVEEtUElMTEEgKi8KKyNkZWZpbmUgWEtfU2luaF9sdXUyICAgICAgICAgIDB4MTAwMGRmMyAgLyogVSswREYzIFNJTkhBTEEgRElHQSBHQVlBTlVLSVRUQSAqLworI2RlZmluZSBYS19TaW5oX2t1bmRkYWxpeWEgICAgMHgxMDAwZGY0ICAvKiBVKzBERjQgU0lOSEFMQSBLVU5EREFMSVlBICovCisjZW5kaWYgLyogWEtfU0lOSEFMQSAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9fR19jb25maWcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvX0dfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExZDAyMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvX0dfY29uZmlnLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qIFRoaXMgZmlsZSBpcyBuZWVkZWQgYnkgbGliaW8gdG8gZGVmaW5lIHZhcmlvdXMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorICAgVGhlc2UgYXJlIGFsd2F5cyB0aGUgc2FtZSBpbiB0aGUgR05VIEMgbGlicmFyeS4gICovCisKKyNpZm5kZWYgX0dfY29uZmlnX2gKKyNkZWZpbmUgX0dfY29uZmlnX2ggMQorCisvKiBEZWZpbmUgdHlwZXMgZm9yIGxpYmlvIGluIHRlcm1zIG9mIHRoZSBzdGFuZGFyZCBpbnRlcm5hbCB0eXBlIG5hbWVzLiAgKi8KKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBfR0xJQkNQUF9VU0VfV0NIQVJfVAorIyBkZWZpbmUgX19uZWVkX3djaGFyX3QKKyNlbmRpZgorI2RlZmluZSBfX25lZWRfTlVMTAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2RlZmluZSBfX25lZWRfbWJzdGF0ZV90CisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIF9HTElCQ1BQX1VTRV9XQ0hBUl9UCisjIGRlZmluZSBfX25lZWRfd2ludF90CisjZW5kaWYKKyNpbmNsdWRlIDx3Y2hhci5oPgorI2RlZmluZSBfR19zaXplX3QJc2l6ZV90Cit0eXBlZGVmIHN0cnVjdAoreworICBfX29mZl90IF9fcG9zOworICBfX21ic3RhdGVfdCBfX3N0YXRlOworfSBfR19mcG9zX3Q7Cit0eXBlZGVmIHN0cnVjdAoreworICBfX29mZjY0X3QgX19wb3M7CisgIF9fbWJzdGF0ZV90IF9fc3RhdGU7Cit9IF9HX2Zwb3M2NF90OworI2RlZmluZSBfR19zc2l6ZV90CV9fc3NpemVfdAorI2RlZmluZSBfR19vZmZfdAlfX29mZl90CisjZGVmaW5lIF9HX29mZjY0X3QJX19vZmY2NF90CisjZGVmaW5lCV9HX3BpZF90CV9fcGlkX3QKKyNkZWZpbmUJX0dfdWlkX3QJX191aWRfdAorI2RlZmluZSBfR193Y2hhcl90CXdjaGFyX3QKKyNkZWZpbmUgX0dfd2ludF90CXdpbnRfdAorI2RlZmluZSBfR19zdGF0NjQJc3RhdDY0CisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIF9HTElCQ1BQX1VTRV9XQ0hBUl9UCisjIGluY2x1ZGUgPGdjb252Lmg+Cit0eXBlZGVmIHVuaW9uCit7CisgIHN0cnVjdCBfX2djb252X2luZm8gX19jZDsKKyAgc3RydWN0CisgIHsKKyAgICBzdHJ1Y3QgX19nY29udl9pbmZvIF9fY2Q7CisgICAgc3RydWN0IF9fZ2NvbnZfc3RlcF9kYXRhIF9fZGF0YTsKKyAgfSBfX2NvbWJpbmVkOworfSBfR19pY29udl90OworI2VuZGlmCisKK3R5cGVkZWYgaW50IF9HX2ludDE2X3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX0hJX18pKSk7Cit0eXBlZGVmIGludCBfR19pbnQzMl90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoX19TSV9fKSkpOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgX0dfdWludDE2X3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX0hJX18pKSk7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBfR191aW50MzJfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fU0lfXykpKTsKKworI2RlZmluZSBfR19IQVZFX0JPT0wgMQorCisKKy8qIFRoZXNlIGxpYnJhcnkgZmVhdHVyZXMgYXJlIGFsd2F5cyBhdmFpbGFibGUgaW4gdGhlIEdOVSBDIGxpYnJhcnkuICAqLworI2RlZmluZSBfR19IQVZFX0FURVhJVCAxCisjZGVmaW5lIF9HX0hBVkVfU1lTX0NERUZTIDEKKyNkZWZpbmUgX0dfSEFWRV9TWVNfV0FJVCAxCisjZGVmaW5lIF9HX05FRURfU1REQVJHX0ggMQorI2RlZmluZSBfR192YV9saXN0IF9fZ251Y192YV9saXN0CisKKyNkZWZpbmUgX0dfSEFWRV9QUklOVEZfRlAgMQorI2RlZmluZSBfR19IQVZFX01NQVAgMQorI2RlZmluZSBfR19IQVZFX01SRU1BUCAxCisjZGVmaW5lIF9HX0hBVkVfTE9OR19ET1VCTEVfSU8gMQorI2RlZmluZSBfR19IQVZFX0lPX0ZJTEVfT1BFTiAxCisjZGVmaW5lIF9HX0hBVkVfSU9fR0VUTElORV9JTkZPIDEKKworI2RlZmluZSBfR19JT19JT19GSUxFX1ZFUlNJT04gMHgyMDAwMQorCisjZGVmaW5lIF9HX09QRU42NAlfX29wZW42NAorI2RlZmluZSBfR19MU0VFSzY0CV9fbHNlZWs2NAorI2RlZmluZSBfR19NTUFQNjQJX19tbWFwNjQKKyNkZWZpbmUgX0dfRlNUQVQ2NChmZCxidWYpIF9fZnhzdGF0NjQgKF9TVEFUX1ZFUiwgZmQsIGJ1ZikKKworLyogVGhpcyBpcyBkZWZpbmVkIGJ5IDxiaXRzL3N0YXQuaD4gaWYgYHN0X2Jsa3NpemUnIGV4aXN0cy4gICovCisjZGVmaW5lIF9HX0hBVkVfU1RfQkxLU0laRSBkZWZpbmVkIChfU1RBVEJVRl9TVF9CTEtTSVpFKQorCisjZGVmaW5lIF9HX0JVRlNJWiA4MTkyCisKKy8qIFRoZXNlIGFyZSB0aGUgdnRibCBkZXRhaWxzIGZvciBFTEYuICAqLworI2RlZmluZSBfR19OQU1FU19IQVZFX1VOREVSU0NPUkUgMAorI2RlZmluZSBfR19WVEFCTEVfTEFCRUxfSEFTX0xFTkdUSCAxCisjZGVmaW5lIF9HX1VTSU5HX1RIVU5LUwkxCisjZGVmaW5lIF9HX1ZUQUJMRV9MQUJFTF9QUkVGSVggIl9fdnRfIgorI2RlZmluZSBfR19WVEFCTEVfTEFCRUxfUFJFRklYX0lEIF9fdnRfCisKKworI2lmIGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfX1NURENfXworIyBkZWZpbmUgX0dfQVJHUyhBUkdMSVNUKSBBUkdMSVNUCisjZWxzZQorIyBkZWZpbmUgX0dfQVJHUyhBUkdMSVNUKSAoKQorI2VuZGlmCisKKyNlbmRpZgkvKiBfR19jb25maWcuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hLm91dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hLm91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNTE0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Eub3V0LmgKQEAgLTAsMCArMSwxMzggQEAKKyNpZm5kZWYgX19BX09VVF9HTlVfSF9fCisjZGVmaW5lIF9fQV9PVVRfR05VX0hfXworCisjaW5jbHVkZSA8Yml0cy9hLm91dC5oPgorCisjZGVmaW5lIF9fR05VX0VYRUNfTUFDUk9TX18KKworc3RydWN0IGV4ZWMKK3sKKyAgdW5zaWduZWQgbG9uZyBhX2luZm87CS8qIFVzZSBtYWNyb3MgTl9NQUdJQywgZXRjIGZvciBhY2Nlc3MuICAqLworICB1bnNpZ25lZCBpbnQgYV90ZXh0OwkvKiBMZW5ndGggb2YgdGV4dCwgaW4gYnl0ZXMuICAqLworICB1bnNpZ25lZCBpbnQgYV9kYXRhOwkvKiBMZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMuICAqLworICB1bnNpZ25lZCBpbnQgYV9ic3M7CS8qIExlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBmb3IgZmlsZSwgaW4gYnl0ZXMuICAqLworICB1bnNpZ25lZCBpbnQgYV9zeW1zOwkvKiBMZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGRhdGEgaW4gZmlsZSwgaW4gYnl0ZXMuICAqLworICB1bnNpZ25lZCBpbnQgYV9lbnRyeTsJLyogU3RhcnQgYWRkcmVzcy4gICovCisgIHVuc2lnbmVkIGludCBhX3Ryc2l6ZTsvKiBMZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciB0ZXh0LCBpbiBieXRlcy4gICovCisgIHVuc2lnbmVkIGludCBhX2Ryc2l6ZTsvKiBMZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciBkYXRhLCBpbiBieXRlcy4gICovCit9OworCitlbnVtIG1hY2hpbmVfdHlwZQoreworICBNX09MRFNVTjIgPSAwLAorICBNXzY4MDEwID0gMSwKKyAgTV82ODAyMCA9IDIsCisgIE1fU1BBUkMgPSAzLAorICBNXzM4NiA9IDEwMCwKKyAgTV9NSVBTMSA9IDE1MSwKKyAgTV9NSVBTMiA9IDE1MgorfTsKKworI2RlZmluZSBOX01BR0lDKGV4ZWMpCSgoZXhlYykuYV9pbmZvICYgMHhmZmZmKQorI2RlZmluZSBOX01BQ0hUWVBFKGV4ZWMpICgoZW51bSBtYWNoaW5lX3R5cGUpKCgoZXhlYykuYV9pbmZvID4+IDE2KSAmIDB4ZmYpKQorI2RlZmluZSBOX0ZMQUdTKGV4ZWMpCSgoKGV4ZWMpLmFfaW5mbyA+PiAyNCkgJiAweGZmKQorI2RlZmluZSBOX1NFVF9JTkZPKGV4ZWMsIG1hZ2ljLCB0eXBlLCBmbGFncykgXAorICAoKGV4ZWMpLmFfaW5mbyA9ICgobWFnaWMpICYgMHhmZmZmKQkJCQkJXAorICAgfCAoKChpbnQpKHR5cGUpICYgMHhmZikgPDwgMTYpCQkJCQlcCisgICB8ICgoKGZsYWdzKSAmIDB4ZmYpIDw8IDI0KSkKKyNkZWZpbmUgTl9TRVRfTUFHSUMoZXhlYywgbWFnaWMpIFwKKyAgKChleGVjKS5hX2luZm8gPSAoKGV4ZWMpLmFfaW5mbyAmIDB4ZmZmZjAwMDApIHwgKChtYWdpYykgJiAweGZmZmYpKQorI2RlZmluZSBOX1NFVF9NQUNIVFlQRShleGVjLCBtYWNodHlwZSkgXAorICAoKGV4ZWMpLmFfaW5mbyA9CQkJCQkJCVwKKyAgICgoZXhlYykuYV9pbmZvJjB4ZmYwMGZmZmYpIHwgKCgoKGludCkobWFjaHR5cGUpKSYweGZmKSA8PCAxNikpCisjZGVmaW5lIE5fU0VUX0ZMQUdTKGV4ZWMsIGZsYWdzKSBcCisgICgoZXhlYykuYV9pbmZvID0JCQkJCQkJXAorICAgKChleGVjKS5hX2luZm8mMHgwMGZmZmZmZikgfCAoKChmbGFncykgJiAweGZmKSA8PCAyNCkpCisKKy8qIENvZGUgaW5kaWNhdGluZyBvYmplY3QgZmlsZSBvciBpbXB1cmUgZXhlY3V0YWJsZS4gICovCisjZGVmaW5lIE9NQUdJQyAwNDA3CisvKiBDb2RlIGluZGljYXRpbmcgcHVyZSBleGVjdXRhYmxlLiAgKi8KKyNkZWZpbmUgTk1BR0lDIDA0MTAKKy8qIENvZGUgaW5kaWNhdGluZyBkZW1hbmQtcGFnZWQgZXhlY3V0YWJsZS4gICovCisjZGVmaW5lIFpNQUdJQyAwNDEzCisvKiBUaGlzIGluZGljYXRlcyBhIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlIHdpdGggdGhlIGhlYWRlciBpbiB0aGUgdGV4dC4gCisgICBUaGUgZmlyc3QgcGFnZSBpcyB1bm1hcHBlZCB0byBoZWxwIHRyYXAgTlVMTCBwb2ludGVyIHJlZmVyZW5jZXMuICAqLworI2RlZmluZSBRTUFHSUMgMDMxNAorLyogQ29kZSBpbmRpY2F0aW5nIGNvcmUgZmlsZS4gICovCisjZGVmaW5lIENNQUdJQyAwNDIxCisKKyNkZWZpbmUgTl9UUlNJWkUoYSkJKChhKS5hX3Ryc2l6ZSkKKyNkZWZpbmUgTl9EUlNJWkUoYSkJKChhKS5hX2Ryc2l6ZSkKKyNkZWZpbmUgTl9TWU1TSVpFKGEpCSgoYSkuYV9zeW1zKQorI2RlZmluZSBOX0JBRE1BRyh4KSBcCisgIChOX01BR0lDKHgpICE9IE9NQUdJQwkmJiBOX01BR0lDKHgpICE9IE5NQUdJQwkJCQlcCisgICAmJiBOX01BR0lDKHgpICE9IFpNQUdJQyAmJiBOX01BR0lDKHgpICE9IFFNQUdJQykKKyNkZWZpbmUgX05fSERST0ZGKHgpCSgxMDI0IC0gc2l6ZW9mIChzdHJ1Y3QgZXhlYykpCisjZGVmaW5lIE5fVFhUT0ZGKHgpIFwKKyAgKE5fTUFHSUMoeCkgPT0gWk1BR0lDID8gX05fSERST0ZGKCh4KSkgKyBzaXplb2YgKHN0cnVjdCBleGVjKSA6CVwKKyAgIChOX01BR0lDKHgpID09IFFNQUdJQyA/IDAgOiBzaXplb2YgKHN0cnVjdCBleGVjKSkpCisjZGVmaW5lIE5fREFUT0ZGKHgpCShOX1RYVE9GRih4KSArICh4KS5hX3RleHQpCisjZGVmaW5lIE5fVFJFTE9GRih4KQkoTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhKQorI2RlZmluZSBOX0RSRUxPRkYoeCkJKE5fVFJFTE9GRih4KSArIE5fVFJTSVpFKHgpKQorI2RlZmluZSBOX1NZTU9GRih4KQkoTl9EUkVMT0ZGKHgpICsgTl9EUlNJWkUoeCkpCisjZGVmaW5lIE5fU1RST0ZGKHgpCShOX1NZTU9GRih4KSArIE5fU1lNU0laRSh4KSkKKworLyogQWRkcmVzcyBvZiB0ZXh0IHNlZ21lbnQgaW4gbWVtb3J5IGFmdGVyIGl0IGlzIGxvYWRlZC4gICovCisjZGVmaW5lIE5fVFhUQUREUih4KQkoTl9NQUdJQyh4KSA9PSBRTUFHSUMgPyA0MDk2IDogMCkKKworLyogQWRkcmVzcyBvZiBkYXRhIHNlZ21lbnQgaW4gbWVtb3J5IGFmdGVyIGl0IGlzIGxvYWRlZC4gICovCisjZGVmaW5lIFNFR01FTlRfU0laRQkxMDI0CisKKyNkZWZpbmUgX05fU0VHTUVOVF9ST1VORCh4KSAoKCh4KSArIFNFR01FTlRfU0laRSAtIDEpICYgfihTRUdNRU5UX1NJWkUgLSAxKSkKKyNkZWZpbmUgX05fVFhURU5EQUREUih4KSAoTl9UWFRBRERSKHgpKyh4KS5hX3RleHQpCisKKyNkZWZpbmUgTl9EQVRBRERSKHgpIFwKKyAgKE5fTUFHSUMoeCk9PU9NQUdJQz8gKF9OX1RYVEVOREFERFIoeCkpCQkJCVwKKyAgIDogKF9OX1NFR01FTlRfUk9VTkQgKF9OX1RYVEVOREFERFIoeCkpKSkKKyNkZWZpbmUgTl9CU1NBRERSKHgpIChOX0RBVEFERFIoeCkgKyAoeCkuYV9kYXRhKQorCisjaWYgIWRlZmluZWQgKE5fTkxJU1RfREVDTEFSRUQpCitzdHJ1Y3Qgbmxpc3QKK3sKKyAgdW5pb24KKyAgICB7CisgICAgICBjaGFyICpuX25hbWU7CisgICAgICBzdHJ1Y3Qgbmxpc3QgKm5fbmV4dDsKKyAgICAgIGxvbmcgbl9zdHJ4OworICAgIH0gbl91bjsKKyAgdW5zaWduZWQgY2hhciBuX3R5cGU7CisgIGNoYXIgbl9vdGhlcjsKKyAgc2hvcnQgbl9kZXNjOworICB1bnNpZ25lZCBsb25nIG5fdmFsdWU7Cit9OworI2VuZGlmIC8qIG5vIE5fTkxJU1RfREVDTEFSRUQuICAqLworCisjZGVmaW5lIE5fVU5ERgkwCisjZGVmaW5lIE5fQUJTCTIKKyNkZWZpbmUgTl9URVhUCTQKKyNkZWZpbmUgTl9EQVRBCTYKKyNkZWZpbmUgTl9CU1MJOAorI2RlZmluZSBOX0ZOCTE1CisjZGVmaW5lIE5fRVhUCTEKKyNkZWZpbmUgTl9UWVBFCTAzNgorI2RlZmluZSBOX1NUQUIJMDM0MAorI2RlZmluZSBOX0lORFIJMHhhCisjZGVmaW5lCU5fU0VUQQkweDE0CS8qIEFic29sdXRlIHNldCBlbGVtZW50IHN5bWJvbC4gICovCisjZGVmaW5lCU5fU0VUVAkweDE2CS8qIFRleHQgc2V0IGVsZW1lbnQgc3ltYm9sLiAgKi8KKyNkZWZpbmUJTl9TRVRECTB4MTgJLyogRGF0YSBzZXQgZWxlbWVudCBzeW1ib2wuICAqLworI2RlZmluZQlOX1NFVEIJMHgxQQkvKiBCc3Mgc2V0IGVsZW1lbnQgc3ltYm9sLiAgKi8KKyNkZWZpbmUgTl9TRVRWCTB4MUMJLyogUG9pbnRlciB0byBzZXQgdmVjdG9yIGluIGRhdGEgYXJlYS4gICovCisKKyNpZiAhZGVmaW5lZCAoTl9SRUxPQ0FUSU9OX0lORk9fREVDTEFSRUQpCisvKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBzaW5nbGUgcmVsb2NhdGlvbiB0byBiZSBwZXJmb3JtZWQuCisgICBUaGUgdGV4dC1yZWxvY2F0aW9uIHNlY3Rpb24gb2YgdGhlIGZpbGUgaXMgYSB2ZWN0b3Igb2YgdGhlc2Ugc3RydWN0dXJlcywKKyAgIGFsbCBvZiB3aGljaCBhcHBseSB0byB0aGUgdGV4dCBzZWN0aW9uLgorICAgTGlrZXdpc2UsIHRoZSBkYXRhLXJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIHRoZSBkYXRhIHNlY3Rpb24uICAqLworCitzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvCit7CisgIGludCByX2FkZHJlc3M7CisgIHVuc2lnbmVkIGludCByX3N5bWJvbG51bToyNDsKKyAgdW5zaWduZWQgaW50IHJfcGNyZWw6MTsKKyAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOjI7CisgIHVuc2lnbmVkIGludCByX2V4dGVybjoxOworICB1bnNpZ25lZCBpbnQgcl9wYWQ6NDsKK307CisjZW5kaWYgLyogbm8gTl9SRUxPQ0FUSU9OX0lORk9fREVDTEFSRUQuICAqLworCisjZW5kaWYgLyogX19BX09VVF9HTlVfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FjbC9saWJhY2wuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWNsL2xpYmFjbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YTY2NTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FjbC9saWJhY2wuaApAQCAtMCwwICsxLDgwIEBACisvKgorICBGaWxlOiBsaWJhY2wuaAorCisgIChDKSAxOTk5LCAyMDAwIEFuZHJlYXMgR3J1ZW5iYWNoZXIsIDxhLmdydWVuYmFjaGVyQGNvbXB1dGVyLm9yZz4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisqLworCisjaWZuZGVmIF9fQUNMX0xJQkFDTF9ICisjZGVmaW5lIF9fQUNMX0xJQkFDTF9ICisKKyNpbmNsdWRlIDxzeXMvYWNsLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogRmxhZ3MgZm9yIGFjbF90b19hbnlfdGV4dCgpICovCisKKy8qIFByaW50IE5PLCBTT01FIG9yIEFMTCBlZmZlY3RpdmUgcGVybWlzc2lvbnMgY29tbWVudHMuIFNPTUUgcHJpbnRzCisgICBlZmZlY3RpdmUgcmlnaHRzIGNvbW1lbnRzIGZvciBlbnRyaWVzIHdoaWNoIGhhdmUgZGlmZmVyZW50IHBlcm1pc3Npb25zCisgICB0aGFuIGVmZmVjdGl2ZSBwZXJtaXNzaW9ucy4gICovCisjZGVmaW5lIFRFWFRfU09NRV9FRkZFQ1RJVkUJCTB4MDEKKyNkZWZpbmUgVEVYVF9BTExfRUZGRUNUSVZFCQkweDAyCisKKy8qIEFsaWduIGVmZmVjdGl2ZSBwZXJtaXNzaW9uIGNvbW1lbnRzIHRvIGNvbHVtbiAzMiB1c2luZyB0YWJzIG9yCisgICB1c2UgYSBzaW5nbGUgdGFiLiAqLworI2RlZmluZSBURVhUX1NNQVJUX0lOREVOVAkJMHgwNAorCisvKiBVc2VyIGFuZCBncm91cCBJRHMgaW5zdGVhZCBvZiBuYW1lcy4gKi8KKyNkZWZpbmUgVEVYVF9OVU1FUklDX0lEUwkJMHgwOAorCisvKiBPbmx5IG91dHB1dCB0aGUgZmlyc3QgbGV0dGVyIG9mIGVudHJ5IHR5cGVzCisgICAoInU6OnJ3eCIgaW5zdGVhZCBvZiAidXNlcjo6cnd4IikuICovCisjZGVmaW5lIFRFWFRfQUJCUkVWSUFURQkJCTB4MTAKKworLyogYWNsX2NoZWNrIGVycm9yIGNvZGVzICovCisKKyNkZWZpbmUgQUNMX01VTFRJX0VSUk9SCQkoMHgxMDAwKSAgICAgLyogbXVsdGlwbGUgdW5pcXVlIG9iamVjdHMgKi8KKyNkZWZpbmUgQUNMX0RVUExJQ0FURV9FUlJPUgkoMHgyMDAwKSAgICAgLyogZHVwbGljYXRlIElkJ3MgaW4gZW50cmllcyAqLworI2RlZmluZSBBQ0xfTUlTU19FUlJPUgkJKDB4MzAwMCkgICAgIC8qIG1pc3NpbmcgcmVxdWlyZWQgZW50cnkgKi8KKyNkZWZpbmUgQUNMX0VOVFJZX0VSUk9SCQkoMHg0MDAwKSAgICAgLyogd3JvbmcgZW50cnkgdHlwZSAqLworCitleHRlcm4gY2hhciAqYWNsX3RvX2FueV90ZXh0KGFjbF90IGFjbCwgY29uc3QgY2hhciAqcHJlZml4LAorCQkJICAgICBjaGFyIHNlcGFyYXRvciwgaW50IG9wdGlvbnMpOworZXh0ZXJuIGludCBhY2xfY21wKGFjbF90IGFjbDEsIGFjbF90IGFjbDIpOworZXh0ZXJuIGludCBhY2xfY2hlY2soYWNsX3QgYWNsLCBpbnQgKmxhc3QpOworZXh0ZXJuIGFjbF90IGFjbF9mcm9tX21vZGUobW9kZV90IG1vZGUpOworZXh0ZXJuIGludCBhY2xfZXF1aXZfbW9kZShhY2xfdCBhY2wsIG1vZGVfdCAqbW9kZV9wKTsKK2ludCBhY2xfZXh0ZW5kZWRfZmlsZShjb25zdCBjaGFyICpwYXRoX3ApOworaW50IGFjbF9leHRlbmRlZF9maWxlX25vZm9sbG93KGNvbnN0IGNoYXIgKnBhdGhfcCk7CitpbnQgYWNsX2V4dGVuZGVkX2ZkKGludCBmZCk7CitleHRlcm4gaW50IGFjbF9lbnRyaWVzKGFjbF90IGFjbCk7CitleHRlcm4gY29uc3QgY2hhciAqYWNsX2Vycm9yKGludCBjb2RlKTsKK2V4dGVybiBpbnQgYWNsX2dldF9wZXJtKGFjbF9wZXJtc2V0X3QgcGVybXNldF9kLCBhY2xfcGVybV90IHBlcm0pOworCisvKiBDb3B5aW5nIHBlcm1pc3Npb25zIGJldHdlZW4gZmlsZXMgKi8KK3N0cnVjdCBlcnJvcl9jb250ZXh0OworZXh0ZXJuIGludCBwZXJtX2NvcHlfZmlsZSAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCisJCQkgICAgc3RydWN0IGVycm9yX2NvbnRleHQgKik7CitleHRlcm4gaW50IHBlcm1fY29weV9mZCAoY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50LAorCQkJICBzdHJ1Y3QgZXJyb3JfY29udGV4dCAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmICAvKiBfX0FDTF9MSUJBQ0xfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FmX3Zmcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hZl92ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGQyODdjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hZl92ZnMuaApAQCAtMCwwICsxLDU2IEBACisvKgorCUF1ZGlvIEZpbGUgTGlicmFyeQorCUNvcHlyaWdodCAoQykgMTk5OSwgRWxsaW90IExlZSA8c29wd2l0aEByZWRoYXQuY29tPgorCisJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisJdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKwlNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorCUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKwlMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorCUJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQS4KKyovCisKKy8qCisJYWZfdmZzLmgKKworCVZpcnR1YWwgZmlsZSBvcGVyYXRpb25zIGZvciB0aGUgQXVkaW8gRmlsZSBMaWJyYXJ5LgorKi8KKworI2lmbmRlZiBBVURJT0ZJTEVfVkZTX0gKKyNkZWZpbmUgQVVESU9GSUxFX1ZGU19IIDEKKworI2luY2x1ZGUgPGF1ZGlvZmlsZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBfQUZ2aXJ0dWFsZmlsZQoreworCXNzaXplX3QgKCpyZWFkKSAoQUZ2aXJ0dWFsZmlsZSAqdmZpbGUsIHZvaWQgKmRhdGEsIHNpemVfdCBuYnl0ZXMpOworCUFGZmlsZW9mZnNldCAoKmxlbmd0aCkgKEFGdmlydHVhbGZpbGUgKnZmaWxlKTsKKwlzc2l6ZV90ICgqd3JpdGUpIChBRnZpcnR1YWxmaWxlICp2ZmlsZSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IG5ieXRlcyk7CisJdm9pZCAoKmRlc3Ryb3kpIChBRnZpcnR1YWxmaWxlICp2ZmlsZSk7CisJQUZmaWxlb2Zmc2V0ICgqc2VlaykgKEFGdmlydHVhbGZpbGUgKnZmaWxlLCBBRmZpbGVvZmZzZXQgb2Zmc2V0LCBpbnQgaXNfcmVsYXRpdmUpOworCUFGZmlsZW9mZnNldCAoKnRlbGwpIChBRnZpcnR1YWxmaWxlICp2ZmlsZSk7CisKKwl2b2lkICpjbG9zdXJlOworfTsKKworQUZ2aXJ0dWFsZmlsZSAqYWZfdmlydHVhbF9maWxlX25ldyAodm9pZCk7Cit2b2lkIGFmX3ZpcnR1YWxfZmlsZV9kZXN0cm95IChBRnZpcnR1YWxmaWxlICp2ZmlsZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9haW8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NmZDBjMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWlvLmgKQEAgLTAsMCArMSwyNDYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5Ni0yMDAwLDIwMDMsMjAwNCwyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICogSVNPL0lFQyA5OTQ1LTE6MTk5NiA2Ljc6IEFzeW5jaHJvbm91cyBJbnB1dCBhbmQgT3V0cHV0CisgKi8KKworI2lmbmRlZiBfQUlPX0gKKyNkZWZpbmUgX0FJT19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogQXN5bmNocm9ub3VzIEkvTyBjb250cm9sIGJsb2NrLiAgKi8KK3N0cnVjdCBhaW9jYgoreworICBpbnQgYWlvX2ZpbGRlczsJCS8qIEZpbGUgZGVzcmlwdG9yLiAgKi8KKyAgaW50IGFpb19saW9fb3Bjb2RlOwkJLyogT3BlcmF0aW9uIHRvIGJlIHBlcmZvcm1lZC4gICovCisgIGludCBhaW9fcmVxcHJpbzsJCS8qIFJlcXVlc3QgcHJpb3JpdHkgb2Zmc2V0LiAgKi8KKyAgdm9sYXRpbGUgdm9pZCAqYWlvX2J1ZjsJLyogTG9jYXRpb24gb2YgYnVmZmVyLiAgKi8KKyAgc2l6ZV90IGFpb19uYnl0ZXM7CQkvKiBMZW5ndGggb2YgdHJhbnNmZXIuICAqLworICBzdHJ1Y3Qgc2lnZXZlbnQgYWlvX3NpZ2V2ZW50OwkvKiBTaWduYWwgbnVtYmVyIGFuZCB2YWx1ZS4gICovCisKKyAgLyogSW50ZXJuYWwgbWVtYmVycy4gICovCisgIHN0cnVjdCBhaW9jYiAqX19uZXh0X3ByaW87CisgIGludCBfX2Fic19wcmlvOworICBpbnQgX19wb2xpY3k7CisgIGludCBfX2Vycm9yX2NvZGU7CisgIF9fc3NpemVfdCBfX3JldHVybl92YWx1ZTsKKworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisgIF9fb2ZmX3QgYWlvX29mZnNldDsJCS8qIEZpbGUgb2Zmc2V0LiAgKi8KKyAgY2hhciBfX3BhZFtzaXplb2YgKF9fb2ZmNjRfdCkgLSBzaXplb2YgKF9fb2ZmX3QpXTsKKyNlbHNlCisgIF9fb2ZmNjRfdCBhaW9fb2Zmc2V0OwkJLyogRmlsZSBvZmZzZXQuICAqLworI2VuZGlmCisgIGNoYXIgX191bnVzZWRbMzJdOworfTsKKworLyogVGhlIHNhbWUgZm9yIHRoZSA2NGJpdCBvZmZzZXRzLiAgUGxlYXNlIG5vdGUgdGhhdCB0aGUgbWVtYmVycyBhaW9fZmlsZGVzCisgICB0byBfX3JldHVybl92YWx1ZSBoYXZlIHRvIGJlIHRoZSBzYW1lIGluIGFpb2NiIGFuZCBhaW9jYjY0LiAgKi8KKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorc3RydWN0IGFpb2NiNjQKK3sKKyAgaW50IGFpb19maWxkZXM7CQkvKiBGaWxlIGRlc3JpcHRvci4gICovCisgIGludCBhaW9fbGlvX29wY29kZTsJCS8qIE9wZXJhdGlvbiB0byBiZSBwZXJmb3JtZWQuICAqLworICBpbnQgYWlvX3JlcXByaW87CQkvKiBSZXF1ZXN0IHByaW9yaXR5IG9mZnNldC4gICovCisgIHZvbGF0aWxlIHZvaWQgKmFpb19idWY7CS8qIExvY2F0aW9uIG9mIGJ1ZmZlci4gICovCisgIHNpemVfdCBhaW9fbmJ5dGVzOwkJLyogTGVuZ3RoIG9mIHRyYW5zZmVyLiAgKi8KKyAgc3RydWN0IHNpZ2V2ZW50IGFpb19zaWdldmVudDsJLyogU2lnbmFsIG51bWJlciBhbmQgdmFsdWUuICAqLworCisgIC8qIEludGVybmFsIG1lbWJlcnMuICAqLworICBzdHJ1Y3QgYWlvY2IgKl9fbmV4dF9wcmlvOworICBpbnQgX19hYnNfcHJpbzsKKyAgaW50IF9fcG9saWN5OworICBpbnQgX19lcnJvcl9jb2RlOworICBfX3NzaXplX3QgX19yZXR1cm5fdmFsdWU7CisKKyAgX19vZmY2NF90IGFpb19vZmZzZXQ7CQkvKiBGaWxlIG9mZnNldC4gICovCisgIGNoYXIgX191bnVzZWRbMzJdOworfTsKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRvIGN1c3RvbWl6ZSB0aGUgaW1wbGVtZW50YXRpb24gb25lIGNhbiB1c2UgdGhlIGZvbGxvd2luZyBzdHJ1Y3QuCisgICBUaGlzIGltcGxlbWVudGF0aW9uIGZvbGxvd3MgdGhlIG9uZSBpbiBJcml4LiAgKi8KK3N0cnVjdCBhaW9pbml0CisgIHsKKyAgICBpbnQgYWlvX3RocmVhZHM7CQkvKiBNYXhpbWFsIG51bWJlciBvZiB0aHJlYWRzLiAgKi8KKyAgICBpbnQgYWlvX251bTsJCS8qIE51bWJlciBvZiBleHBlY3RlZCBzaW11bHRhbmlvdXMgcmVxdWVzdHMuICovCisgICAgaW50IGFpb19sb2NrczsJCS8qIE5vdCB1c2VkLiAgKi8KKyAgICBpbnQgYWlvX3VzZWRiYTsJCS8qIE5vdCB1c2VkLiAgKi8KKyAgICBpbnQgYWlvX2RlYnVnOwkJLyogTm90IHVzZWQuICAqLworICAgIGludCBhaW9fbnVtdXNlcnM7CQkvKiBOb3QgdXNlZC4gICovCisgICAgaW50IGFpb19pZGxlX3RpbWU7CQkvKiBOdW1iZXIgb2Ygc2Vjb25kcyBiZWZvcmUgaWRsZSB0aHJlYWQKKwkJCQkgICB0ZXJtaW5hdGVzLiAgKi8KKyAgICBpbnQgYWlvX3Jlc2VydmVkOworICB9OworI2VuZGlmCisKKworLyogUmV0dXJuIHZhbHVlcyBvZiBjYW5jZWxhdGlvbiBmdW5jdGlvbi4gICovCitlbnVtCit7CisgIEFJT19DQU5DRUxFRCwKKyNkZWZpbmUgQUlPX0NBTkNFTEVEIEFJT19DQU5DRUxFRAorICBBSU9fTk9UQ0FOQ0VMRUQsCisjZGVmaW5lIEFJT19OT1RDQU5DRUxFRCBBSU9fTk9UQ0FOQ0VMRUQKKyAgQUlPX0FMTERPTkUKKyNkZWZpbmUgQUlPX0FMTERPTkUgQUlPX0FMTERPTkUKK307CisKKworLyogT3BlcmF0aW9uIGNvZGVzIGZvciBgYWlvX2xpb19vcGNvZGUnLiAgKi8KK2VudW0KK3sKKyAgTElPX1JFQUQsCisjZGVmaW5lIExJT19SRUFEIExJT19SRUFECisgIExJT19XUklURSwKKyNkZWZpbmUgTElPX1dSSVRFIExJT19XUklURQorICBMSU9fTk9QCisjZGVmaW5lIExJT19OT1AgTElPX05PUAorfTsKKworCisvKiBTeW5jaHJvbml6YXRpb24gb3B0aW9ucyBmb3IgYGxpb19saXN0aW8nIGZ1bmN0aW9uLiAgKi8KK2VudW0KK3sKKyAgTElPX1dBSVQsCisjZGVmaW5lIExJT19XQUlUIExJT19XQUlUCisgIExJT19OT1dBSVQKKyNkZWZpbmUgTElPX05PV0FJVCBMSU9fTk9XQUlUCit9OworCisKKy8qIEFsbG93IHVzZXIgdG8gc3BlY2lmeSBvcHRpbWl6YXRpb24uICAqLworI2lmZGVmIF9fVVNFX0dOVQorZXh0ZXJuIHZvaWQgYWlvX2luaXQgKF9fY29uc3Qgc3RydWN0IGFpb2luaXQgKl9faW5pdCkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKy8qIEVucXVldWUgcmVhZCByZXF1ZXN0IGZvciBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgYW5kIHRoZSBnaXZlbiBwcmlvcml0eS4gICovCitleHRlcm4gaW50IGFpb19yZWFkIChzdHJ1Y3QgYWlvY2IgKl9fYWlvY2JwKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKy8qIEVucXVldWUgd3JpdGUgcmVxdWVzdCBmb3IgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGFuZCB0aGUgZ2l2ZW4gcHJpb3JpdHkuICAqLworZXh0ZXJuIGludCBhaW9fd3JpdGUgKHN0cnVjdCBhaW9jYiAqX19haW9jYnApIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBJbml0aWF0ZSBsaXN0IG9mIEkvTyByZXF1ZXN0cy4gICovCitleHRlcm4gaW50IGxpb19saXN0aW8gKGludCBfX21vZGUsCisJCSAgICAgICBzdHJ1Y3QgYWlvY2IgKl9fY29uc3QgX19saXN0W19fcmVzdHJpY3RfYXJyXSwKKwkJICAgICAgIGludCBfX25lbnQsIHN0cnVjdCBzaWdldmVudCAqX19yZXN0cmljdCBfX3NpZykKKyAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisKKy8qIFJldHJpZXZlIGVycm9yIHN0YXR1cyBhc3NvY2lhdGVkIHdpdGggQUlPQ0JQLiAgKi8KK2V4dGVybiBpbnQgYWlvX2Vycm9yIChfX2NvbnN0IHN0cnVjdCBhaW9jYiAqX19haW9jYnApIF9fVEhST1cgX19ub25udWxsICgoMSkpOworLyogUmV0dXJuIHN0YXR1cyBhc3NvY2lhdGVkIHdpdGggQUlPQ0JQLiAgKi8KK2V4dGVybiBfX3NzaXplX3QgYWlvX3JldHVybiAoc3RydWN0IGFpb2NiICpfX2Fpb2NicCkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFRyeSB0byBjYW5jZWwgYXN5bmNocm9ub3VzIEkvTyByZXF1ZXN0cyBvdXRzdGFuZGluZyBhZ2FpbnN0IGZpbGUKKyAgIGRlc2NyaXB0b3IgRklMREVTLiAgKi8KK2V4dGVybiBpbnQgYWlvX2NhbmNlbCAoaW50IF9fZmlsZGVzLCBzdHJ1Y3QgYWlvY2IgKl9fYWlvY2JwKSBfX1RIUk9XOworCisvKiBTdXNwZW5kIGNhbGxpbmcgdGhyZWFkIHVudGlsIGF0IGxlYXN0IG9uZSBvZiB0aGUgYXN5bmNocm9ub3VzIEkvTworICAgb3BlcmF0aW9ucyByZWZlcmVuY2VkIGJ5IExJU1QgaGFzIGNvbXBsZXRlZC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IGFpb19zdXNwZW5kIChfX2NvbnN0IHN0cnVjdCBhaW9jYiAqX19jb25zdCBfX2xpc3RbXSwgaW50IF9fbmVudCwKKwkJCV9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3Jlc3RyaWN0IF9fdGltZW91dCkKKyAgX19ub25udWxsICgoMSkpOworCisvKiBGb3JjZSBhbGwgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggZmlsZSBkZXNyaXB0b3IgZGVzY3JpYmVkIGJ5CisgICBgYWlvX2ZpbGRlcycgbWVtYmVyIG9mIEFJT0NCUC4gICovCitleHRlcm4gaW50IGFpb19mc3luYyAoaW50IF9fb3BlcmF0aW9uLCBzdHJ1Y3QgYWlvY2IgKl9fYWlvY2JwKQorICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChhaW9fcmVhZCwgKHN0cnVjdCBhaW9jYiAqX19haW9jYnApLCBhaW9fcmVhZDY0KQorICBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChhaW9fd3JpdGUsIChzdHJ1Y3QgYWlvY2IgKl9fYWlvY2JwKSwgYWlvX3dyaXRlNjQpCisgIF9fbm9ubnVsbCAoKDEpKTsKKworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAobGlvX2xpc3RpbywKKwkJCSAgIChpbnQgX19tb2RlLAorCQkJICAgIHN0cnVjdCBhaW9jYiAqX19jb25zdCBfX2xpc3RbX19yZXN0cmljdF9hcnJdLAorCQkJICAgIGludCBfX25lbnQsIHN0cnVjdCBzaWdldmVudCAqX19yZXN0cmljdCBfX3NpZyksCisJCQkgICBsaW9fbGlzdGlvNjQpIF9fbm9ubnVsbCAoKDIpKTsKKworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoYWlvX2Vycm9yLCAoX19jb25zdCBzdHJ1Y3QgYWlvY2IgKl9fYWlvY2JwKSwKKwkJCSAgIGFpb19lcnJvcjY0KSBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gX19zc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChhaW9fcmV0dXJuLCAoc3RydWN0IGFpb2NiICpfX2Fpb2NicCksCisJCQkJIGFpb19yZXR1cm42NCkgX19ub25udWxsICgoMSkpOworCitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChhaW9fY2FuY2VsLAorCQkJICAgKGludCBfX2ZpbGRlcywgc3RydWN0IGFpb2NiICpfX2Fpb2NicCksCisJCQkgICBhaW9fY2FuY2VsNjQpOworCitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChhaW9fc3VzcGVuZCwKKwkJCSAgIChfX2NvbnN0IHN0cnVjdCBhaW9jYiAqX19jb25zdCBfX2xpc3RbXSwgaW50IF9fbmVudCwKKwkJCSAgICBfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX19yZXN0cmljdCBfX3RpbWVvdXQpLAorCQkJICAgYWlvX3N1c3BlbmQ2NCkgX19ub25udWxsICgoMSkpOworCitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChhaW9fZnN5bmMsCisJCQkgICAoaW50IF9fb3BlcmF0aW9uLCBzdHJ1Y3QgYWlvY2IgKl9fYWlvY2JwKSwKKwkJCSAgIGFpb19mc3luYzY0KSBfX25vbm51bGwgKCgyKSk7CisKKyMgZWxzZQorIyAgZGVmaW5lIGFpb19yZWFkIGFpb19yZWFkNjQKKyMgIGRlZmluZSBhaW9fd3JpdGUgYWlvX3dyaXRlNjQKKyMgIGRlZmluZSBsaW9fbGlzdGlvIGxpb19saXN0aW82NAorIyAgZGVmaW5lIGFpb19lcnJvciBhaW9fZXJyb3I2NAorIyAgZGVmaW5lIGFpb19yZXR1cm4gYWlvX3JldHVybjY0CisjICBkZWZpbmUgYWlvX2NhbmNlbCBhaW9fY2FuY2VsNjQKKyMgIGRlZmluZSBhaW9fc3VzcGVuZCBhaW9fc3VzcGVuZDY0CisjICBkZWZpbmUgYWlvX2ZzeW5jIGFpb19mc3luYzY0CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IGFpb19yZWFkNjQgKHN0cnVjdCBhaW9jYjY0ICpfX2Fpb2NicCkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gaW50IGFpb193cml0ZTY0IChzdHJ1Y3QgYWlvY2I2NCAqX19haW9jYnApIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCitleHRlcm4gaW50IGxpb19saXN0aW82NCAoaW50IF9fbW9kZSwKKwkJCSBzdHJ1Y3QgYWlvY2I2NCAqX19jb25zdCBfX2xpc3RbX19yZXN0cmljdF9hcnJdLAorCQkJIGludCBfX25lbnQsIHN0cnVjdCBzaWdldmVudCAqX19yZXN0cmljdCBfX3NpZykKKyAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisKK2V4dGVybiBpbnQgYWlvX2Vycm9yNjQgKF9fY29uc3Qgc3RydWN0IGFpb2NiNjQgKl9fYWlvY2JwKQorICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBfX3NzaXplX3QgYWlvX3JldHVybjY0IChzdHJ1Y3QgYWlvY2I2NCAqX19haW9jYnApCisgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCitleHRlcm4gaW50IGFpb19jYW5jZWw2NCAoaW50IF9fZmlsZGVzLCBzdHJ1Y3QgYWlvY2I2NCAqX19haW9jYnApIF9fVEhST1c7CisKK2V4dGVybiBpbnQgYWlvX3N1c3BlbmQ2NCAoX19jb25zdCBzdHJ1Y3QgYWlvY2I2NCAqX19jb25zdCBfX2xpc3RbXSwgaW50IF9fbmVudCwKKwkJCSAgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVzdHJpY3QgX190aW1lb3V0KQorICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworZXh0ZXJuIGludCBhaW9fZnN5bmM2NCAoaW50IF9fb3BlcmF0aW9uLCBzdHJ1Y3QgYWlvY2I2NCAqX19haW9jYnApCisgIF9fVEhST1cgX19ub25udWxsICgoMikpOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBhaW8uaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbGlhc2VzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FsaWFzZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGRkOGYwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbGlhc2VzLmgKQEAgLTAsMCArMSw2NCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9BTElBU0VTX0gKKyNkZWZpbmUgX0FMSUFTRVNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKworX19CRUdJTl9ERUNMUworCisvKiBTdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IG9uZSBlbnRyeSBvZiB0aGUgYWxpYXMgZGF0YSBiYXNlLiAgKi8KK3N0cnVjdCBhbGlhc2VudAorICB7CisgICAgY2hhciAqYWxpYXNfbmFtZTsKKyAgICBzaXplX3QgYWxpYXNfbWVtYmVyc19sZW47CisgICAgY2hhciAqKmFsaWFzX21lbWJlcnM7CisgICAgaW50IGFsaWFzX2xvY2FsOworICB9OworCisKKy8qIE9wZW4gYWxpYXMgZGF0YSBiYXNlIGZpbGVzLiAgKi8KK2V4dGVybiB2b2lkIHNldGFsaWFzZW50ICh2b2lkKSBfX1RIUk9XOworCisvKiBDbG9zZSBhbGlhcyBkYXRhIGJhc2UgZmlsZXMuICAqLworZXh0ZXJuIHZvaWQgZW5kYWxpYXNlbnQgKHZvaWQpIF9fVEhST1c7CisKKy8qIEdldCB0aGUgbmV4dCBlbnRyeSBmcm9tIHRoZSBhbGlhcyBkYXRhIGJhc2UuICAqLworZXh0ZXJuIHN0cnVjdCBhbGlhc2VudCAqZ2V0YWxpYXNlbnQgKHZvaWQpIF9fVEhST1c7CisKKy8qIEdldCB0aGUgbmV4dCBlbnRyeSBmcm9tIHRoZSBhbGlhcyBkYXRhIGJhc2UgYW5kIHB1dCBpdCBpbiBSRVNVTFRfQlVGLiAgKi8KK2V4dGVybiBpbnQgZ2V0YWxpYXNlbnRfciAoc3RydWN0IGFsaWFzZW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0X2J1ZiwKKwkJCSAgY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkJICBzdHJ1Y3QgYWxpYXNlbnQgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KSBfX1RIUk9XOworCisvKiBHZXQgYWxpYXMgZW50cnkgY29ycmVzcG9uZGluZyB0byBOQU1FLiAgKi8KK2V4dGVybiBzdHJ1Y3QgYWxpYXNlbnQgKmdldGFsaWFzYnluYW1lIChfX2NvbnN0IGNoYXIgKl9fbmFtZSkgX19USFJPVzsKKworLyogR2V0IGFsaWFzIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gTkFNRSBhbmQgcHV0IGl0IGluIFJFU1VMVF9CVUYuICAqLworZXh0ZXJuIGludCBnZXRhbGlhc2J5bmFtZV9yIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLAorCQkJICAgICBzdHJ1Y3QgYWxpYXNlbnQgKl9fcmVzdHJpY3QgX19yZXN1bHRfYnVmLAorCQkJICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4sCisJCQkgICAgIHN0cnVjdCBhbGlhc2VudCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBhbGlhc2VzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxsb2NhLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FsbG9jYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZDI5MWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FsbG9jYS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfQUxMT0NBX0gKKyNkZWZpbmUJX0FMTE9DQV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNkZWZpbmUJX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJlbW92ZSBhbnkgcHJldmlvdXMgZGVmaW5pdGlvbnMuICAqLworI3VuZGVmCWFsbG9jYQorCisvKiBBbGxvY2F0ZSBhIGJsb2NrIHRoYXQgd2lsbCBiZSBmcmVlZCB3aGVuIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGV4aXRzLiAgKi8KK2V4dGVybiB2b2lkICphbGxvY2EgKHNpemVfdCBfX3NpemUpIF9fVEhST1c7CisKKyNpZmRlZglfX0dOVUNfXworIyBkZWZpbmUgYWxsb2NhKHNpemUpCV9fYnVpbHRpbl9hbGxvY2EgKHNpemUpCisjZW5kaWYgLyogR0NDLiAgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGFsbG9jYS5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvYWxpc3AuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9hbGlzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwN2VkNjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvYWxpc3AuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogIEFMU0EgbGlzcCBpbXBsZW1lbnRhdGlvbgorICogIENvcHlyaWdodCAoYykgMjAwMyBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICoKKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworc3RydWN0IGFsaXNwX2NmZyB7CisJaW50IHZlcmJvc2U6IDEsCisJICAgIHdhcm5pbmc6IDEsCisJICAgIGRlYnVnOiAxOworCXNuZF9pbnB1dF90ICppbjsJLyogcHJvZ3JhbSBjb2RlICovCisJc25kX291dHB1dF90ICpvdXQ7CS8qIHByb2dyYW0gb3V0cHV0ICovCisJc25kX291dHB1dF90ICplb3V0OwkvKiBlcnJvciBvdXRwdXQgKi8KKwlzbmRfb3V0cHV0X3QgKnZvdXQ7CS8qIHZlcmJvc2Ugb3V0cHV0ICovCisJc25kX291dHB1dF90ICp3b3V0OwkvKiB3YXJuaW5nIG91dHB1dCAqLworCXNuZF9vdXRwdXRfdCAqZG91dDsJLyogZGVidWcgb3V0cHV0ICovCit9OworCitzdHJ1Y3QgYWxpc3BfaW5zdGFuY2U7CitzdHJ1Y3QgYWxpc3Bfb2JqZWN0Oworc3RydWN0IGFsaXNwX3NlcV9pdGVyYXRvcjsKKworc3RydWN0IGFsaXNwX2NmZyAqYWxzYV9saXNwX2RlZmF1bHRfY2ZnKHNuZF9pbnB1dF90ICppbnB1dCk7Cit2b2lkIGFsc2FfbGlzcF9kZWZhdWx0X2NmZ19mcmVlKHN0cnVjdCBhbGlzcF9jZmcgKmNmZyk7CitpbnQgYWxzYV9saXNwKHN0cnVjdCBhbGlzcF9jZmcgKmNmZywgc3RydWN0IGFsaXNwX2luc3RhbmNlICoqaW5zdGFuY2UpOwordm9pZCBhbHNhX2xpc3BfZnJlZShzdHJ1Y3QgYWxpc3BfaW5zdGFuY2UgKmluc3RhbmNlKTsKK2ludCBhbHNhX2xpc3BfZnVuY3Rpb24oc3RydWN0IGFsaXNwX2luc3RhbmNlICppbnN0YW5jZSwgc3RydWN0IGFsaXNwX3NlcV9pdGVyYXRvciAqKnJlc3VsdCwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICphcmdzLCAuLi4pCisjaWZuZGVmIERPQ19ISURERU4KKwkJICAgICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgNCwgNSkpKQorI2VuZGlmCisJCSAgICAgICA7Cit2b2lkIGFsc2FfbGlzcF9yZXN1bHRfZnJlZShzdHJ1Y3QgYWxpc3BfaW5zdGFuY2UgKmluc3RhbmNlLAorCQkJICAgc3RydWN0IGFsaXNwX3NlcV9pdGVyYXRvciAqcmVzdWx0KTsKK2ludCBhbHNhX2xpc3Bfc2VxX2ZpcnN0KHN0cnVjdCBhbGlzcF9pbnN0YW5jZSAqaW5zdGFuY2UsIGNvbnN0IGNoYXIgKmlkLAorCQkJc3RydWN0IGFsaXNwX3NlcV9pdGVyYXRvciAqKnNlcSk7CitpbnQgYWxzYV9saXNwX3NlcV9uZXh0KHN0cnVjdCBhbGlzcF9zZXFfaXRlcmF0b3IgKipzZXEpOworaW50IGFsc2FfbGlzcF9zZXFfY291bnQoc3RydWN0IGFsaXNwX3NlcV9pdGVyYXRvciAqc2VxKTsKK2ludCBhbHNhX2xpc3Bfc2VxX2ludGVnZXIoc3RydWN0IGFsaXNwX3NlcV9pdGVyYXRvciAqc2VxLCBsb25nICp2YWwpOworaW50IGFsc2FfbGlzcF9zZXFfcG9pbnRlcihzdHJ1Y3QgYWxpc3Bfc2VxX2l0ZXJhdG9yICpzZXEsIGNvbnN0IGNoYXIgKnB0cl9pZCwgdm9pZCAqKnB0cik7CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvYXNvdW5kZWYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9hc291bmRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YzRlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvYXNvdW5kZWYuaApAQCAtMCwwICsxLDMxMCBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL2Fzb3VuZGVmLmgKKyAqIFxicmllZiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKiBcYXV0aG9yIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKiBcYXV0aG9yIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMTk5OC0yMDAxCisgKgorICogRGVmaW5pdGlvbnMgb2YgY29uc3RhbnRzIGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqLworLyoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQUxTQV9BU09VTkRFRl9ICisjZGVmaW5lIF9fQUxTQV9BU09VTkRFRl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBcZGVmZ3JvdXAgRGlnaXRhbF9BdWRpb19JbnRlcmZhY2UgQ29uc3RhbnRzIGZvciBEaWdpdGFsIEF1ZGlvIEludGVyZmFjZXMKKyAqIEFFUy9JRUM5NTggY2hhbm5lbCBzdGF0dXMgYml0cy4KKyAqIFx7CisgKi8KKworI2RlZmluZSBJRUM5NThfQUVTMF9QUk9GRVNTSU9OQUwJKDE8PDApCS8qKjwgMCA9IGNvbnN1bWVyLCAxID0gcHJvZmVzc2lvbmFsICovCisjZGVmaW5lIElFQzk1OF9BRVMwX05PTkFVRElPCQkoMTw8MSkJLyoqPCAwID0gYXVkaW8sIDEgPSBub24tYXVkaW8gKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzBfUFJPX0VNUEhBU0lTCSg3PDwyKQkvKio8IG1hc2sgLSBlbXBoYXNpcyAqLworI2RlZmluZSBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVNfTk9USUQJKDA8PDIpCS8qKjwgZW1waGFzaXMgbm90IGluZGljYXRlZCAqLworI2RlZmluZSBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVNfTk9ORQkoMTw8MikJLyoqPCBubyBlbXBoYXNpcyAqLworI2RlZmluZSBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVNfNTAxNQkoMzw8MikJLyoqPCA1MC8xNXVzIGVtcGhhc2lzICovCisjZGVmaW5lIElFQzk1OF9BRVMwX1BST19FTVBIQVNJU19DQ0lUVAkoNzw8MikJLyoqPCBDQ0lUVCBKLjE3IGVtcGhhc2lzICovCisjZGVmaW5lIElFQzk1OF9BRVMwX1BST19GUkVRX1VOTE9DS0VECSgxPDw1KQkvKio8IHNvdXJjZSBzYW1wbGUgZnJlcXVlbmN5OiAwID0gbG9ja2VkLCAxID0gdW5sb2NrZWQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzBfUFJPX0ZTCQkoMzw8NikJLyoqPCBtYXNrIC0gc2FtcGxlIGZyZXF1ZW5jeSAqLworI2RlZmluZSBJRUM5NThfQUVTMF9QUk9fRlNfTk9USUQJKDA8PDYpCS8qKjwgZnMgbm90IGluZGljYXRlZCAqLworI2RlZmluZSBJRUM5NThfQUVTMF9QUk9fRlNfNDQxMDAJKDE8PDYpCS8qKjwgNDQuMWtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTMF9QUk9fRlNfNDgwMDAJKDI8PDYpCS8qKjwgNDhrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzBfUFJPX0ZTXzMyMDAwCSgzPDw2KQkvKio8IDMya0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVMwX0NPTl9OT1RfQ09QWVJJR0hUCSgxPDwyKQkvKio8IDAgPSBjb3B5cmlnaHQsIDEgPSBub3QgY29weXJpZ2h0ICovCisjZGVmaW5lIElFQzk1OF9BRVMwX0NPTl9FTVBIQVNJUwkoNzw8MykJLyoqPCBtYXNrIC0gZW1waGFzaXMgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTX05PTkUJKDA8PDMpCS8qKjwgbm8gZW1waGFzaXMgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTXzUwMTUJKDE8PDMpCS8qKjwgNTAvMTV1cyBlbXBoYXNpcyAqLworI2RlZmluZSBJRUM5NThfQUVTMF9DT05fTU9ERQkJKDM8PDYpCS8qKjwgbWFzayAtIG1vZGUgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfUFJPX01PREUJCSgxNTw8MCkJLyoqPCBtYXNrIC0gY2hhbm5lbCBtb2RlICovCisjZGVmaW5lIElFQzk1OF9BRVMxX1BST19NT0RFX05PVElECSgwPDwwKQkvKio8IG1vZGUgbm90IGluZGljYXRlZCAqLworI2RlZmluZSBJRUM5NThfQUVTMV9QUk9fTU9ERV9TVEVSRU9QSE9OSUMgKDI8PDApIC8qKjwgc3RlcmVvcGhvbmljIC0gY2ggQSBpcyBsZWZ0ICovCisjZGVmaW5lIElFQzk1OF9BRVMxX1BST19NT0RFX1NJTkdMRQkoNDw8MCkJLyoqPCBzaW5nbGUgY2hhbm5lbCAqLworI2RlZmluZSBJRUM5NThfQUVTMV9QUk9fTU9ERV9UV08JKDg8PDApCS8qKjwgdHdvIGNoYW5uZWxzICovCisjZGVmaW5lIElFQzk1OF9BRVMxX1BST19NT0RFX1BSSU1BUlkJKDEyPDwwKQkvKio8IHByaW1hcnkvc2Vjb25kYXJ5ICovCisjZGVmaW5lIElFQzk1OF9BRVMxX1BST19NT0RFX0JZVEUzCSgxNTw8MCkJLyoqPCB2ZWN0b3IgdG8gYnl0ZSAzICovCisjZGVmaW5lIElFQzk1OF9BRVMxX1BST19VU0VSQklUUwkoMTU8PDQpCS8qKjwgbWFzayAtIHVzZXIgYml0cyAqLworI2RlZmluZSBJRUM5NThfQUVTMV9QUk9fVVNFUkJJVFNfTk9USUQJKDA8PDQpCS8qKjwgdXNlciBiaXRzIG5vdCBpbmRpY2F0ZWQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfUFJPX1VTRVJCSVRTXzE5MgkoODw8NCkJLyoqPCAxOTItYml0IHN0cnVjdHVyZSAqLworI2RlZmluZSBJRUM5NThfQUVTMV9QUk9fVVNFUkJJVFNfVURFRgkoMTI8PDQpCS8qKjwgdXNlciBkZWZpbmVkIGFwcGxpY2F0aW9uICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9DQVRFR09SWQkweDdmCS8qKjwgY29uc3VtZXIgY2F0ZWdvcnkgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0dFTkVSQUwJCTB4MDAJLyoqPCBnZW5lcmFsIGNhdGVnb3J5ICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9MQVNFUk9QVF9NQVNLCTB4MDcJLyoqPCBMYXNlci1vcHRpY2FsIG1hc2sgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0xBU0VST1BUX0lECTB4MDEJLyoqPCBMYXNlci1vcHRpY2FsIElEICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9JRUM5MDhfQ0QJKElFQzk1OF9BRVMxX0NPTl9MQVNFUk9QVF9JRHwweDAwKQkvKio8IElFQzk1OCBDRCBjb21wYXRpYmxlIGRldmljZSAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fTk9OX0lFQzkwOF9DRAkoSUVDOTU4X0FFUzFfQ09OX0xBU0VST1BUX0lEfDB4MDgpCS8qKjwgbm9uLUlFQzk1OCBDRCBjb21wYXRpYmxlIGRldmljZSAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fTUlOSV9ESVNDCShJRUM5NThfQUVTMV9DT05fTEFTRVJPUFRfSUR8MHg0OCkJLyoqPCBNaW5pLURpc2MgZGV2aWNlICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9EVkQJCShJRUM5NThfQUVTMV9DT05fTEFTRVJPUFRfSUR8MHgxOCkJLyoqPCBEVkQgZGV2aWNlICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9MQVNURVJPUFRfT1RIRVIJKElFQzk1OF9BRVMxX0NPTl9MQVNFUk9QVF9JRHwweDc4KQkvKio8IE90aGVyIGxhc2VyLW9wdGljYWwgcHJvZHVjdCAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fRElHRElHQ09OVl9NQVNLIDB4MDcJLyoqPCBkaWdpdGFsPC0+ZGlnaXRhbCBjb252ZXJ0ZXIgbWFzayAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fRElHRElHQ09OVl9JRAkweDAyCS8qKjwgZGlnaXRhbDwtPmRpZ2l0YWwgY29udmVydGVyIGlkICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9QQ01fQ09ERVIJKElFQzk1OF9BRVMxX0NPTl9ESUdESUdDT05WX0lEfDB4MDApCS8qKjwgUENNIGNvZGVyICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9NSVhFUgkJKElFQzk1OF9BRVMxX0NPTl9ESUdESUdDT05WX0lEfDB4MTApCS8qKjwgRGlnaXRhbCBzaWduYWwgbWl4ZXIgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX1JBVEVfQ09OVkVSVEVSCShJRUM5NThfQUVTMV9DT05fRElHRElHQ09OVl9JRHwweDE4KQkvKio8IFJhdGUgY29udmVydGVyICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9TQU1QTEVSCQkoSUVDOTU4X0FFUzFfQ09OX0RJR0RJR0NPTlZfSUR8MHgyMCkJLyoqPCBQQ00gc2FtcGxlciAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fRFNQCQkoSUVDOTU4X0FFUzFfQ09OX0RJR0RJR0NPTlZfSUR8MHgyOCkJLyoqPCBEaWdpdGFsIHNvdW5kIHByb2Nlc3NvciAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fRElHRElHQ09OVl9PVEhFUiAoSUVDOTU4X0FFUzFfQ09OX0RJR0RJR0NPTlZfSUR8MHg3OCkJLyoqPCBPdGhlciBkaWdpdGFsPC0+ZGlnaXRhbCBwcm9kdWN0ICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9NQUdORVRJQ19NQVNLCTB4MDcJLyoqPCBNYWduZXRpYyBkZXZpY2UgbWFzayAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fTUFHTkVUSUNfSUQJMHgwMwkvKio8IE1hZ25ldGljIGRldmljZSBJRCAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fREFUCQkoSUVDOTU4X0FFUzFfQ09OX01BR05FVElDX0lEfDB4MDApCS8qKjwgRGlnaXRhbCBBdWRpbyBUYXBlICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9WQ1IJCShJRUM5NThfQUVTMV9DT05fTUFHTkVUSUNfSUR8MHgwOCkJLyoqPCBWaWRlbyByZWNvcmRlciAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fRENDCQkoSUVDOTU4X0FFUzFfQ09OX01BR05FVElDX0lEfDB4NDApCS8qKjwgRGlnaXRhbCBjb21wYWN0IGNhc3NldHRlICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9NQUdORVRJQ19ESVNDCShJRUM5NThfQUVTMV9DT05fTUFHTkVUSUNfSUR8MHgxOCkJLyoqPCBNYWduZXRpYyBkaXNjIGRpZ2l0YWwgYXVkaW8gZGV2aWNlICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9NQUdORVRJQ19PVEhFUgkoSUVDOTU4X0FFUzFfQ09OX01BR05FVElDX0lEfDB4NzgpCS8qKjwgT3RoZXIgbWFnbmV0aWMgZGV2aWNlICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9CUk9BRENBU1QxX01BU0sgMHgwNwkvKio8IEJyb2FkY2FzdCBtYXNrICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9CUk9BRENBU1QxX0lECTB4MDQJLyoqPCBCcm9hZGNhc3QgSUQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0RBQl9KQVBBTgkoSUVDOTU4X0FFUzFfQ09OX0JST0FEQ0FTVDFfSUR8MHgwMCkJLyoqPCBEaWdpdGFsIGF1ZGlvIGJyb2FkY2FzdCAoSmFwYW4pICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9EQUJfRVVST1BFCShJRUM5NThfQUVTMV9DT05fQlJPQURDQVNUMV9JRHwweDA4KQkvKio8IERpZ2l0YWwgYXVkaW8gYnJvYWRjYXN0IChFdXJvcGUpICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9EQUJfVVNBCQkoSUVDOTU4X0FFUzFfQ09OX0JST0FEQ0FTVDFfSUR8MHg2MCkJLyoqPCBEaWdpdGFsIGF1ZGlvIGJyb2FkY2FzdCAoVVNBKSAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fU09GVFdBUkUJKElFQzk1OF9BRVMxX0NPTl9CUk9BRENBU1QxX0lEfDB4NDApCS8qKjwgRWxlY3Ryb25pYyBzb2Z0d2FyZSBkZWxpdmVyeSAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fSUVDNjIxMDUJKElFQzk1OF9BRVMxX0NPTl9CUk9BRENBU1QxX0lEfDB4MjApCS8qKjwgVXNlZCBieSBhbm90aGVyIHN0YW5kYXJkIChJRUMgNjIxMDUpICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9CUk9BRENBU1QxX09USEVSIChJRUM5NThfQUVTMV9DT05fQlJPQURDQVNUMV9JRHwweDc4KQkvKio8IE90aGVyIGJyb2FkY2FzdCBwcm9kdWN0ICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9CUk9BRENBU1QyX01BU0sgMHgwZgkvKio8IEJyb2FkY2FzdCBhbHRlcm5hdGl2ZSBtYXNrICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9CUk9BRENBU1QyX0lECTB4MGUJLyoqPCBCcm9hZGNhc3QgYWx0ZXJuYXRpdmUgSUQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX01VU0lDQUxfTUFTSwkweDA3CS8qKjwgTXVzaWNhbCBkZXZpY2UgbWFzayAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fTVVTSUNBTF9JRAkweDA1CS8qKjwgTXVzaWNhbCBkZXZpY2UgSUQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX1NZTlRIRVNJWkVSCShJRUM5NThfQUVTMV9DT05fTVVTSUNBTF9JRHwweDAwKQkvKio8IFN5bnRoZXNpemVyICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9NSUNST1BIT05FCShJRUM5NThfQUVTMV9DT05fTVVTSUNBTF9JRHwweDA4KQkvKio8IE1pY3JvcGhvbmUgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX01VU0lDQUxfT1RIRVIJKElFQzk1OF9BRVMxX0NPTl9NVVNJQ0FMX0lEfDB4NzgpCS8qKjwgT3RoZXIgbXVzaWNhbCBkZXZpY2UgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0FEQ19NQVNLCTB4MWYJLyoqPCBBREMgTWFzayAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fQURDX0lECQkweDA2CS8qKjwgQURDIElEICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9BREMJCShJRUM5NThfQUVTMV9DT05fQURDX0lEfDB4MDApCS8qKjwgQURDIHdpdGhvdXQgY29weXJpZ2h0IGluZm9ybWF0aW9uICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9BRENfT1RIRVIJKElFQzk1OF9BRVMxX0NPTl9BRENfSUR8MHg2MCkJLyoqPCBPdGhlciBBREMgcHJvZHVjdCAod2l0aCBubyBjb3B5cmlnaHQgaW5mb3JtYXRpb24pICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9BRENfQ09QWVJJR0hUX01BU0sgMHgxZgkvKio8IEFEQyBDb3B5cmlnaHQgbWFzayAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fQURDX0NPUFlSSUdIVF9JRCAweDE2CS8qKjwgQURDIENvcHlyaWdodCBJRCAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fQURDX0NPUFlSSUdIVAkoSUVDOTU4X0FFUzFfQ09OX0FEQ19DT1BZUklHSFRfSUR8MHgwMCkJLyoqPCBBREMgd2l0aCBjb3B5cmlnaHQgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0FEQ19DT1BZUklHSFRfT1RIRVIgKElFQzk1OF9BRVMxX0NPTl9BRENfQ09QWVJJR0hUX0lEfDB4NjApCS8qKjwgT3RoZXIgQURDIHdpdGggY29weXJpZ2h0IGluZm9ybWF0aW9uIHByb2R1Y3QgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX1NPTElETUVNX01BU0sJMHgwZgkvKio8IFNvbGlkIG1lbW9yeSBiYXNlZCBwcm9kdWN0cyBtYXNrICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9TT0xJRE1FTV9JRAkweDA4CS8qKjwgU29saWQgbWVtb3J5IGJhc2VkIHByb2R1Y3RzIElEICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9TT0xJRE1FTV9ESUdJVEFMX1JFQ09SREVSX1BMQVlFUiAoSUVDOTU4X0FFUzFfQ09OX1NPTElETUVNX0lEfDB4MDApCS8qKjwgRGlnaXRhbCBhdWRpbyByZWNvcmRlciBhbmQgcGxheWVyIHVzaW5nIHNvbGlkIHN0YXRlIG1lbW9yeSAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fU09MSURNRU1fT1RIRVIJKElFQzk1OF9BRVMxX0NPTl9TT0xJRE1FTV9JRHwweDcwKQkvKio8IE90aGVyIHNvbGlkIHN0YXRlIG1lbW9yeSBiYXNlZCBwcm9kdWN0ICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9FWFBFUklNRU5UQUwJMHg0MAkvKio8IGV4cGVyaW1lbnRhbCBjYXRlZ29yeSAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fT1JJR0lOQUwJKDE8PDcpCS8qKjwgdGhpcyBiaXRzIGRlcGVuZHMgb24gdGhlIGNhdGVnb3J5IGNvZGUgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzJfUFJPX1NCSVRTCQkoNzw8MCkJLyoqPCBtYXNrIC0gc2FtcGxlIGJpdHMgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzJfUFJPX1NCSVRTXzIwCSgyPDwwKQkvKio8IDIwLWJpdCAtIGNvb3JkaW5hdGlvbiAqLworI2RlZmluZSBJRUM5NThfQUVTMl9QUk9fU0JJVFNfMjQJKDQ8PDApCS8qKjwgMjQtYml0IC0gbWFpbiBhdWRpbyAqLworI2RlZmluZSBJRUM5NThfQUVTMl9QUk9fU0JJVFNfVURFRgkoNjw8MCkJLyoqPCB1c2VyIGRlZmluZWQgYXBwbGljYXRpb24gKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzJfUFJPX1dPUkRMRU4JCSg3PDwzKQkvKio8IG1hc2sgLSBzb3VyY2Ugd29yZCBsZW5ndGggKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzJfUFJPX1dPUkRMRU5fTk9USUQJKDA8PDMpCS8qKjwgc291cmNlIHdvcmQgbGVuZ3RoIG5vdCBpbmRpY2F0ZWQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzJfUFJPX1dPUkRMRU5fMjJfMTgJKDI8PDMpCS8qKjwgMjItYml0IG9yIDE4LWJpdCAqLworI2RlZmluZSBJRUM5NThfQUVTMl9QUk9fV09SRExFTl8yM18xOQkoNDw8MykJLyoqPCAyMy1iaXQgb3IgMTktYml0ICovCisjZGVmaW5lIElFQzk1OF9BRVMyX1BST19XT1JETEVOXzI0XzIwCSg1PDwzKQkvKio8IDI0LWJpdCBvciAyMC1iaXQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzJfUFJPX1dPUkRMRU5fMjBfMTYJKDY8PDMpCS8qKjwgMjAtYml0IG9yIDE2LWJpdCAqLworI2RlZmluZSBJRUM5NThfQUVTMl9DT05fU09VUkNFCQkoMTU8PDApCS8qKjwgbWFzayAtIHNvdXJjZSBudW1iZXIgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzJfQ09OX1NPVVJDRV9VTlNQRUMJKDA8PDApCS8qKjwgc291cmNlIG51bWJlciB1bnNwZWNpZmllZCAqLworI2RlZmluZSBJRUM5NThfQUVTMl9DT05fQ0hBTk5FTAkJKDE1PDw0KQkvKio8IG1hc2sgLSBjaGFubmVsIG51bWJlciAqLworI2RlZmluZSBJRUM5NThfQUVTMl9DT05fQ0hBTk5FTF9VTlNQRUMJKDA8PDQpCS8qKjwgY2hhbm5lbCBudW1iZXIgdW5zcGVjaWZpZWQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzNfQ09OX0ZTCQkoMTU8PDApCS8qKjwgbWFzayAtIHNhbXBsZSBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzNfQ09OX0ZTXzQ0MTAwCSgwPDwwKQkvKio8IDQ0LjFrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzNfQ09OX0ZTX05PVElECSgxPDwwKQkvKio8IHNhbXBsZSBmcmVxdWVuY3kgbm9uIGluZGljYXRlZCAqLworI2RlZmluZSBJRUM5NThfQUVTM19DT05fRlNfNDgwMDAJKDI8PDApCS8qKjwgNDhrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzNfQ09OX0ZTXzMyMDAwCSgzPDwwKQkvKio8IDMya0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVMzX0NPTl9GU18yMjA1MAkoNDw8MCkJLyoqPCAyMi4wNWtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTM19DT05fRlNfMjQwMDAJKDY8PDApCS8qKjwgMjRrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzNfQ09OX0ZTXzg4MjAwCSg4PDwwKQkvKio8IDg4LjJrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzNfQ09OX0ZTXzc2ODAwMAkoOTw8MCkJLyoqPCA3NjhrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzNfQ09OX0ZTXzk2MDAwCSgxMDw8MCkJLyoqPCA5NmtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTM19DT05fRlNfMTc2NDAwCSgxMjw8MCkJLyoqPCAxNzYuNGtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTM19DT05fRlNfMTkyMDAwCSgxNDw8MCkJLyoqPCAxOTJrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzNfQ09OX0NMT0NLCQkoMzw8NCkJLyoqPCBtYXNrIC0gY2xvY2sgYWNjdXJhY3kgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzNfQ09OX0NMT0NLXzEwMDBQUE0JKDA8PDQpCS8qKjwgMTAwMCBwcG0gKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzNfQ09OX0NMT0NLXzUwUFBNCSgxPDw0KQkvKio8IDUwIHBwbSAqLworI2RlZmluZSBJRUM5NThfQUVTM19DT05fQ0xPQ0tfVkFSSUFCTEUJKDI8PDQpCS8qKjwgdmFyaWFibGUgcGl0Y2ggKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX01BWF9XT1JETEVOXzI0CSgxPDwwKQkvKio8IDAgPSAyMC1iaXQsIDEgPSAyNC1iaXQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX1dPUkRMRU4JCSg3PDwxKQkvKio8IG1hc2sgLSBzYW1wbGUgd29yZCBsZW5ndGggKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX1dPUkRMRU5fTk9USUQJKDA8PDEpCS8qKjwgbm90IGluZGljYXRlZCAqLworI2RlZmluZSBJRUM5NThfQUVTNF9DT05fV09SRExFTl8yMF8xNgkoMTw8MSkJLyoqPCAyMC1iaXQgb3IgMTYtYml0ICovCisjZGVmaW5lIElFQzk1OF9BRVM0X0NPTl9XT1JETEVOXzIyXzE4CSgyPDwxKQkvKio8IDIyLWJpdCBvciAxOC1iaXQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX1dPUkRMRU5fMjNfMTkJKDQ8PDEpCS8qKjwgMjMtYml0IG9yIDE5LWJpdCAqLworI2RlZmluZSBJRUM5NThfQUVTNF9DT05fV09SRExFTl8yNF8yMAkoNTw8MSkJLyoqPCAyNC1iaXQgb3IgMjAtYml0ICovCisjZGVmaW5lIElFQzk1OF9BRVM0X0NPTl9XT1JETEVOXzIxXzE3CSg2PDwxKQkvKio8IDIxLWJpdCBvciAxNy1iaXQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX09SSUdGUwkJKDE1PDw0KQkvKio8IG1hc2sgLSBvcmlnaW5hbCBzYW1wbGUgZnJlcXVlbmN5ICovCisjZGVmaW5lIElFQzk1OF9BRVM0X0NPTl9PUklHRlNfTk9USUQJKDA8PDQpCS8qKjwgb3JpZ2luYWwgc2FtcGxlIGZyZXF1ZW5jeSBub3QgaW5kaWNhdGVkICovCisjZGVmaW5lIElFQzk1OF9BRVM0X0NPTl9PUklHRlNfMTkyMDAwCSgxPDw0KQkvKio8IDE5MmtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTNF9DT05fT1JJR0ZTXzEyMDAwCSgyPDw0KQkvKio8IDEya0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVM0X0NPTl9PUklHRlNfMTc2NDAwCSgzPDw0KQkvKio8IDE3Ni40a0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVM0X0NPTl9PUklHRlNfOTYwMDAJKDU8PDQpCS8qKjwgOTZrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX09SSUdGU184MDAwCSg2PDw0KQkvKio8IDhrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX09SSUdGU184ODIwMAkoNzw8NCkJLyoqPCA4OC4ya0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVM0X0NPTl9PUklHRlNfMTYwMDAJKDg8PDQpCS8qKjwgMTZrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX09SSUdGU18yNDAwMAkoOTw8NCkJLyoqPCAyNGtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTNF9DT05fT1JJR0ZTXzExMDI1CSgxMDw8NCkJLyoqPCAxMS4wMjVrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX09SSUdGU18yMjA1MAkoMTE8PDQpCS8qKjwgMjIuMDVrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX09SSUdGU18zMjAwMAkoMTI8PDQpCS8qKjwgMzJrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX09SSUdGU180ODAwMAkoMTM8PDQpCS8qKjwgNDhrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX09SSUdGU180NDEwMAkoMTU8PDQpCS8qKjwgNDQuMWtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTNV9DT05fQ0dNU0EJCSgzPDwwKQkvKio8IG1hc2sgLSBDR01TLUEgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzVfQ09OX0NHTVNBX0NPUFlGUkVFTFkgKDA8PDApCS8qKjwgY29weWluZyBpcyBwZXJtaXR0ZWQgd2l0aG91dCByZXN0cmljdGlvbiAqLworI2RlZmluZSBJRUM5NThfQUVTNV9DT05fQ0dNU0FfQ09QWU9OQ0UJKDE8PDApCS8qKjwgb25lIGdlbmVyYXRpb24gb2YgY29waWVzIG1heSBiZSBtYWRlICovCisjZGVmaW5lIElFQzk1OF9BRVM1X0NPTl9DR01TQV9DT1BZTk9NT1JFICgyPDwwKQkvKio8IGNvbmRpdGlvbiBub3QgYmUgdXNlZCAqLworI2RlZmluZSBJRUM5NThfQUVTNV9DT05fQ0dNU0FfQ09QWU5FVkVSCSgzPDwwKQkvKio8IG5vIGNvcHlpbmcgaXMgcGVybWl0dGVkICovCisKKy8qKiBcfSAqLworCisvKioKKyAqIFxkZWZncm91cCBNSURJX0ludGVyZmFjZSBDb25zdGFudHMgZm9yIE1JREkgdjEuMAorICogQ29uc3RhbnRzIGZvciBNSURJIHYxLjAuCisgKiBceworICovCisKKyNkZWZpbmUgTUlESV9DSEFOTkVMUwkJCTE2CS8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIHBlciBwb3J0L2NhYmxlLiAqLworI2RlZmluZSBNSURJX0dNX0RSVU1fQ0hBTk5FTAkJKDEwLTEpCS8qKjwgQ2hhbm5lbCBudW1iZXIgZm9yIEdNIGRydW1zLiAqLworCisvKioKKyAqIFxkZWZncm91cCBNSURJX0NvbW1hbmRzIE1JREkgQ29tbWFuZHMKKyAqIE1JREkgY29tbWFuZCBjb2Rlcy4KKyAqIFx7CisgKi8KKworI2RlZmluZSBNSURJX0NNRF9OT1RFX09GRgkJMHg4MAkvKio8IG5vdGUgb2ZmICovCisjZGVmaW5lIE1JRElfQ01EX05PVEVfT04JCTB4OTAJLyoqPCBub3RlIG9uICovCisjZGVmaW5lIE1JRElfQ01EX05PVEVfUFJFU1NVUkUJCTB4YTAJLyoqPCBrZXkgcHJlc3N1cmUgKi8KKyNkZWZpbmUgTUlESV9DTURfQ09OVFJPTAkJMHhiMAkvKio8IGNvbnRyb2wgY2hhbmdlICovCisjZGVmaW5lIE1JRElfQ01EX1BHTV9DSEFOR0UJCTB4YzAJLyoqPCBwcm9ncmFtIGNoYW5nZSAqLworI2RlZmluZSBNSURJX0NNRF9DSEFOTkVMX1BSRVNTVVJFCTB4ZDAJLyoqPCBjaGFubmVsIHByZXNzdXJlICovCisjZGVmaW5lIE1JRElfQ01EX0JFTkRFUgkJCTB4ZTAJLyoqPCBwaXRjaCBiZW5kZXIgKi8KKworI2RlZmluZSBNSURJX0NNRF9DT01NT05fU1lTRVgJCTB4ZjAJLyoqPCBzeXNleCAoc3lzdGVtIGV4Y2x1c2l2ZSkgYmVnaW4gKi8KKyNkZWZpbmUgTUlESV9DTURfQ09NTU9OX01UQ19RVUFSVEVSCTB4ZjEJLyoqPCBNVEMgcXVhcnRlciBmcmFtZSAqLworI2RlZmluZSBNSURJX0NNRF9DT01NT05fU09OR19QT1MJMHhmMgkvKio8IHNvbmcgcG9zaXRpb24gKi8KKyNkZWZpbmUgTUlESV9DTURfQ09NTU9OX1NPTkdfU0VMRUNUCTB4ZjMJLyoqPCBzb25nIHNlbGVjdCAqLworI2RlZmluZSBNSURJX0NNRF9DT01NT05fVFVORV9SRVFVRVNUCTB4ZjYJLyoqPCB0dW5lIHJlcXVlc3QgKi8KKyNkZWZpbmUgTUlESV9DTURfQ09NTU9OX1NZU0VYX0VORAkweGY3CS8qKjwgZW5kIG9mIHN5c2V4ICovCisjZGVmaW5lIE1JRElfQ01EX0NPTU1PTl9DTE9DSwkJMHhmOAkvKio8IGNsb2NrICovCisjZGVmaW5lIE1JRElfQ01EX0NPTU1PTl9TVEFSVAkJMHhmYQkvKio8IHN0YXJ0ICovCisjZGVmaW5lIE1JRElfQ01EX0NPTU1PTl9DT05USU5VRQkweGZiCS8qKjwgY29udGludWUgKi8KKyNkZWZpbmUgTUlESV9DTURfQ09NTU9OX1NUT1AJCTB4ZmMJLyoqPCBzdG9wICovCisjZGVmaW5lIE1JRElfQ01EX0NPTU1PTl9TRU5TSU5HCQkweGZlCS8qKjwgYWN0aXZlIHNlbnNpbmcgKi8KKyNkZWZpbmUgTUlESV9DTURfQ09NTU9OX1JFU0VUCQkweGZmCS8qKjwgcmVzZXQgKi8KKworLyoqIFx9ICovCisKKy8qKgorICogXGRlZmdyb3VwIE1JRElfQ29udHJvbGxlcnMgTUlESSBDb250cm9sbGVycworICogTUlESSBjb250cm9sbGVyIG51bWJlcnMuCisgKiBceworICovCisKKyNkZWZpbmUgTUlESV9DVExfTVNCX0JBTksJCTB4MDAJLyoqPCBCYW5rIHNlbGVjdGlvbiAqLworI2RlZmluZSBNSURJX0NUTF9NU0JfTU9EV0hFRUwgICAgICAgICAJMHgwMQkvKio8IE1vZHVsYXRpb24gKi8KKyNkZWZpbmUgTUlESV9DVExfTVNCX0JSRUFUSCAgICAgICAgICAgCTB4MDIJLyoqPCBCcmVhdGggKi8KKyNkZWZpbmUgTUlESV9DVExfTVNCX0ZPT1QgICAgICAgICAgICAgCTB4MDQJLyoqPCBGb290ICovCisjZGVmaW5lIE1JRElfQ1RMX01TQl9QT1JUQU1FTlRPX1RJTUUgCTB4MDUJLyoqPCBQb3J0YW1lbnRvIHRpbWUgKi8KKyNkZWZpbmUgTUlESV9DVExfTVNCX0RBVEFfRU5UUlkJCTB4MDYJLyoqPCBEYXRhIGVudHJ5ICovCisjZGVmaW5lIE1JRElfQ1RMX01TQl9NQUlOX1ZPTFVNRSAgICAgIAkweDA3CS8qKjwgTWFpbiB2b2x1bWUgKi8KKyNkZWZpbmUgTUlESV9DVExfTVNCX0JBTEFOQ0UgICAgICAgICAgCTB4MDgJLyoqPCBCYWxhbmNlICovCisjZGVmaW5lIE1JRElfQ1RMX01TQl9QQU4gICAgICAgICAgICAgIAkweDBhCS8qKjwgUGFucG90ICovCisjZGVmaW5lIE1JRElfQ1RMX01TQl9FWFBSRVNTSU9OICAgICAgIAkweDBiCS8qKjwgRXhwcmVzc2lvbiAqLworI2RlZmluZSBNSURJX0NUTF9NU0JfRUZGRUNUMQkJMHgwYwkvKio8IEVmZmVjdDEgKi8KKyNkZWZpbmUgTUlESV9DVExfTVNCX0VGRkVDVDIJCTB4MGQJLyoqPCBFZmZlY3QyICovCisjZGVmaW5lIE1JRElfQ1RMX01TQl9HRU5FUkFMX1BVUlBPU0UxIAkweDEwCS8qKjwgR2VuZXJhbCBwdXJwb3NlIDEgKi8KKyNkZWZpbmUgTUlESV9DVExfTVNCX0dFTkVSQUxfUFVSUE9TRTIgCTB4MTEJLyoqPCBHZW5lcmFsIHB1cnBvc2UgMiAqLworI2RlZmluZSBNSURJX0NUTF9NU0JfR0VORVJBTF9QVVJQT1NFMyAJMHgxMgkvKio8IEdlbmVyYWwgcHVycG9zZSAzICovCisjZGVmaW5lIE1JRElfQ1RMX01TQl9HRU5FUkFMX1BVUlBPU0U0IAkweDEzCS8qKjwgR2VuZXJhbCBwdXJwb3NlIDQgKi8KKyNkZWZpbmUgTUlESV9DVExfTFNCX0JBTksJCTB4MjAJLyoqPCBCYW5rIHNlbGVjdGlvbiAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfTU9EV0hFRUwgICAgICAgIAkweDIxCS8qKjwgTW9kdWxhdGlvbiAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfQlJFQVRIICAgICAgICAgICAJMHgyMgkvKio8IEJyZWF0aCAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfRk9PVCAgICAgICAgICAgICAJMHgyNAkvKio8IEZvb3QgKi8KKyNkZWZpbmUgTUlESV9DVExfTFNCX1BPUlRBTUVOVE9fVElNRSAJMHgyNQkvKio8IFBvcnRhbWVudG8gdGltZSAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfREFUQV9FTlRSWQkJMHgyNgkvKio8IERhdGEgZW50cnkgKi8KKyNkZWZpbmUgTUlESV9DVExfTFNCX01BSU5fVk9MVU1FICAgICAgCTB4MjcJLyoqPCBNYWluIHZvbHVtZSAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfQkFMQU5DRSAgICAgICAgICAJMHgyOAkvKio8IEJhbGFuY2UgKi8KKyNkZWZpbmUgTUlESV9DVExfTFNCX1BBTiAgICAgICAgICAgICAgCTB4MmEJLyoqPCBQYW5wb3QgKi8KKyNkZWZpbmUgTUlESV9DVExfTFNCX0VYUFJFU1NJT04gICAgICAgCTB4MmIJLyoqPCBFeHByZXNzaW9uICovCisjZGVmaW5lIE1JRElfQ1RMX0xTQl9FRkZFQ1QxCQkweDJjCS8qKjwgRWZmZWN0MSAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfRUZGRUNUMgkJMHgyZAkvKio8IEVmZmVjdDIgKi8KKyNkZWZpbmUgTUlESV9DVExfTFNCX0dFTkVSQUxfUFVSUE9TRTEgCTB4MzAJLyoqPCBHZW5lcmFsIHB1cnBvc2UgMSAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfR0VORVJBTF9QVVJQT1NFMiAJMHgzMQkvKio8IEdlbmVyYWwgcHVycG9zZSAyICovCisjZGVmaW5lIE1JRElfQ1RMX0xTQl9HRU5FUkFMX1BVUlBPU0UzIAkweDMyCS8qKjwgR2VuZXJhbCBwdXJwb3NlIDMgKi8KKyNkZWZpbmUgTUlESV9DVExfTFNCX0dFTkVSQUxfUFVSUE9TRTQgCTB4MzMJLyoqPCBHZW5lcmFsIHB1cnBvc2UgNCAqLworI2RlZmluZSBNSURJX0NUTF9TVVNUQUlOICAgICAgICAgICAgICAJMHg0MAkvKio8IFN1c3RhaW4gcGVkYWwgKi8KKyNkZWZpbmUgTUlESV9DVExfUE9SVEFNRU5UTyAgICAgICAgICAgCTB4NDEJLyoqPCBQb3J0YW1lbnRvICovCisjZGVmaW5lIE1JRElfQ1RMX1NPU1RFTlVUTyAgICAgICAgICAgIAkweDQyCS8qKjwgU29zdGVudXRvICovCisjZGVmaW5lIE1JRElfQ1RMX1NVU1RFTlVUTyAgICAgICAgICAgIAkweDQyCS8qKjwgU29zdGVudXRvIChhIHR5cG8gaW4gdGhlIG9sZGVyIHZlcnNpb24pICovCisjZGVmaW5lIE1JRElfQ1RMX1NPRlRfUEVEQUwgICAgICAgICAgIAkweDQzCS8qKjwgU29mdCBwZWRhbCAqLworI2RlZmluZSBNSURJX0NUTF9MRUdBVE9fRk9PVFNXSVRDSAkweDQ0CS8qKjwgTGVnYXRvIGZvb3Qgc3dpdGNoICovCisjZGVmaW5lIE1JRElfQ1RMX0hPTEQyICAgICAgICAgICAgICAgIAkweDQ1CS8qKjwgSG9sZDIgKi8KKyNkZWZpbmUgTUlESV9DVExfU0MxX1NPVU5EX1ZBUklBVElPTgkweDQ2CS8qKjwgU0MxIFNvdW5kIFZhcmlhdGlvbiAqLworI2RlZmluZSBNSURJX0NUTF9TQzJfVElNQlJFCQkweDQ3CS8qKjwgU0MyIFRpbWJyZSAqLworI2RlZmluZSBNSURJX0NUTF9TQzNfUkVMRUFTRV9USU1FCTB4NDgJLyoqPCBTQzMgUmVsZWFzZSBUaW1lICovCisjZGVmaW5lIE1JRElfQ1RMX1NDNF9BVFRBQ0tfVElNRQkweDQ5CS8qKjwgU0M0IEF0dGFjayBUaW1lICovCisjZGVmaW5lIE1JRElfQ1RMX1NDNV9CUklHSFRORVNTCQkweDRhCS8qKjwgU0M1IEJyaWdodG5lc3MgKi8KKyNkZWZpbmUgTUlESV9DVExfU0M2CQkJMHg0YgkvKio8IFNDNiAqLworI2RlZmluZSBNSURJX0NUTF9TQzcJCQkweDRjCS8qKjwgU0M3ICovCisjZGVmaW5lIE1JRElfQ1RMX1NDOAkJCTB4NGQJLyoqPCBTQzggKi8KKyNkZWZpbmUgTUlESV9DVExfU0M5CQkJMHg0ZQkvKio8IFNDOSAqLworI2RlZmluZSBNSURJX0NUTF9TQzEwCQkJMHg0ZgkvKio8IFNDMTAgKi8KKyNkZWZpbmUgTUlESV9DVExfR0VORVJBTF9QVVJQT1NFNSAgICAgCTB4NTAJLyoqPCBHZW5lcmFsIHB1cnBvc2UgNSAqLworI2RlZmluZSBNSURJX0NUTF9HRU5FUkFMX1BVUlBPU0U2ICAgICAJMHg1MQkvKio8IEdlbmVyYWwgcHVycG9zZSA2ICovCisjZGVmaW5lIE1JRElfQ1RMX0dFTkVSQUxfUFVSUE9TRTcgICAgIAkweDUyCS8qKjwgR2VuZXJhbCBwdXJwb3NlIDcgKi8KKyNkZWZpbmUgTUlESV9DVExfR0VORVJBTF9QVVJQT1NFOCAgICAgCTB4NTMJLyoqPCBHZW5lcmFsIHB1cnBvc2UgOCAqLworI2RlZmluZSBNSURJX0NUTF9QT1JUQU1FTlRPX0NPTlRST0wJMHg1NAkvKio8IFBvcnRhbWVudG8gY29udHJvbCAqLworI2RlZmluZSBNSURJX0NUTF9FMV9SRVZFUkJfREVQVEgJMHg1YgkvKio8IEUxIFJldmVyYiBEZXB0aCAqLworI2RlZmluZSBNSURJX0NUTF9FMl9UUkVNT0xPX0RFUFRICTB4NWMJLyoqPCBFMiBUcmVtb2xvIERlcHRoICovCisjZGVmaW5lIE1JRElfQ1RMX0UzX0NIT1JVU19ERVBUSAkweDVkCS8qKjwgRTMgQ2hvcnVzIERlcHRoICovCisjZGVmaW5lIE1JRElfQ1RMX0U0X0RFVFVORV9ERVBUSAkweDVlCS8qKjwgRTQgRGV0dW5lIERlcHRoICovCisjZGVmaW5lIE1JRElfQ1RMX0U1X1BIQVNFUl9ERVBUSAkweDVmCS8qKjwgRTUgUGhhc2VyIERlcHRoICovCisjZGVmaW5lIE1JRElfQ1RMX0RBVEFfSU5DUkVNRU5UICAgICAgIAkweDYwCS8qKjwgRGF0YSBJbmNyZW1lbnQgKi8KKyNkZWZpbmUgTUlESV9DVExfREFUQV9ERUNSRU1FTlQgICAgICAgCTB4NjEJLyoqPCBEYXRhIERlY3JlbWVudCAqLworI2RlZmluZSBNSURJX0NUTF9OT05SRUdfUEFSTV9OVU1fTFNCICAJMHg2MgkvKio8IE5vbi1yZWdpc3RlcmVkIHBhcmFtZXRlciBudW1iZXIgKi8KKyNkZWZpbmUgTUlESV9DVExfTk9OUkVHX1BBUk1fTlVNX01TQiAgCTB4NjMJLyoqPCBOb24tcmVnaXN0ZXJlZCBwYXJhbWV0ZXIgbnVtYmVyICovCisjZGVmaW5lIE1JRElfQ1RMX1JFR0lTVF9QQVJNX05VTV9MU0IgIAkweDY0CS8qKjwgUmVnaXN0ZXJlZCBwYXJhbWV0ZXIgbnVtYmVyICovCisjZGVmaW5lIE1JRElfQ1RMX1JFR0lTVF9QQVJNX05VTV9NU0IJMHg2NQkvKio8IFJlZ2lzdGVyZWQgcGFyYW1ldGVyIG51bWJlciAqLworI2RlZmluZSBNSURJX0NUTF9BTExfU09VTkRTX09GRgkJMHg3OAkvKio8IEFsbCBzb3VuZHMgb2ZmICovCisjZGVmaW5lIE1JRElfQ1RMX1JFU0VUX0NPTlRST0xMRVJTCTB4NzkJLyoqPCBSZXNldCBDb250cm9sbGVycyAqLworI2RlZmluZSBNSURJX0NUTF9MT0NBTF9DT05UUk9MX1NXSVRDSAkweDdhCS8qKjwgTG9jYWwgY29udHJvbCBzd2l0Y2ggKi8KKyNkZWZpbmUgTUlESV9DVExfQUxMX05PVEVTX09GRgkJMHg3YgkvKio8IEFsbCBub3RlcyBvZmYgKi8KKyNkZWZpbmUgTUlESV9DVExfT01OSV9PRkYJCTB4N2MJLyoqPCBPbW5pIG9mZiAqLworI2RlZmluZSBNSURJX0NUTF9PTU5JX09OCQkweDdkCS8qKjwgT21uaSBvbiAqLworI2RlZmluZSBNSURJX0NUTF9NT05PMQkJCTB4N2UJLyoqPCBNb25vMSAqLworI2RlZmluZSBNSURJX0NUTF9NT05PMgkJCTB4N2YJLyoqPCBNb25vMiAqLworCisvKiogXH0gKi8KKworLyoqIFx9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FMU0FfQVNPVU5ERUZfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2Fzb3VuZGxpYi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2Fzb3VuZGxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYzg2MGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvYXNvdW5kbGliLmgKQEAgLTAsMCArMSw2MCBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL2Fzb3VuZGxpYi5oCisgKiBcYnJpZWYgQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICogXGF1dGhvciBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogXGF1dGhvciBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKiBcYXV0aG9yIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqIFxkYXRlIDE5OTgtMjAwMQorICoKKyAqIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqLworLyoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQVNPVU5ETElCX0gKKyNkZWZpbmUgX19BU09VTkRMSUJfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgPGFsc2EvYXNvdW5kZWYuaD4KKyNpbmNsdWRlIDxhbHNhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxhbHNhL2dsb2JhbC5oPgorI2luY2x1ZGUgPGFsc2EvaW5wdXQuaD4KKyNpbmNsdWRlIDxhbHNhL291dHB1dC5oPgorI2luY2x1ZGUgPGFsc2EvZXJyb3IuaD4KKyNpbmNsdWRlIDxhbHNhL2NvbmYuaD4KKyNpbmNsdWRlIDxhbHNhL3BjbS5oPgorI2luY2x1ZGUgPGFsc2EvcmF3bWlkaS5oPgorI2luY2x1ZGUgPGFsc2EvdGltZXIuaD4KKyNpbmNsdWRlIDxhbHNhL2h3ZGVwLmg+CisjaW5jbHVkZSA8YWxzYS9jb250cm9sLmg+CisjaW5jbHVkZSA8YWxzYS9taXhlci5oPgorI2luY2x1ZGUgPGFsc2Evc2VxX2V2ZW50Lmg+CisjaW5jbHVkZSA8YWxzYS9zZXEuaD4KKyNpbmNsdWRlIDxhbHNhL3NlcW1pZC5oPgorI2luY2x1ZGUgPGFsc2Evc2VxX21pZGlfZXZlbnQuaD4KKworI2VuZGlmIC8qIF9fQVNPVU5ETElCX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9jb25mLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvY29uZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjcwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvY29uZi5oCkBAIC0wLDAgKzEsMjA3IEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvY29uZi5oCisgKiBcYnJpZWYgQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICogXGF1dGhvciBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogXGF1dGhvciBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKiBcYXV0aG9yIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqIFxkYXRlIDE5OTgtMjAwMQorICoKKyAqIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqLworLyoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQUxTQV9DT05GX0gKKyNkZWZpbmUgX19BTFNBX0NPTkZfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBDb25maWcgQ29uZmlndXJhdGlvbiBJbnRlcmZhY2UKKyAqICBUaGUgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgYW5kIHR5cGVzIGFsbG93IHlvdSB0byByZWFkLCBlbnVtZXJhdGUsCisgKiAgbW9kaWZ5IGFuZCB3cml0ZSB0aGUgY29udGVudHMgb2YgQUxTQSBjb25maWd1cmF0aW9uIGZpbGVzLgorICogIFx7CisgKi8KKworLyoqIFxicmllZiBcYyBkbHN5bSB2ZXJzaW9uIGZvciB0aGUgY29uZmlnIGV2YWx1YXRlIGNhbGxiYWNrLiAqLworI2RlZmluZSBTTkRfQ09ORklHX0RMU1lNX1ZFUlNJT05fRVZBTFVBVEUJX2Rsc3ltX2NvbmZpZ19ldmFsdWF0ZV8wMDEKKy8qKiBcYnJpZWYgXGMgZGxzeW0gdmVyc2lvbiBmb3IgdGhlIGNvbmZpZyBob29rIGNhbGxiYWNrLiAqLworI2RlZmluZSBTTkRfQ09ORklHX0RMU1lNX1ZFUlNJT05fSE9PSwkJX2Rsc3ltX2NvbmZpZ19ob29rXzAwMQorCisvKiogXGJyaWVmIENvbmZpZ3VyYXRpb24gbm9kZSB0eXBlLiAqLwordHlwZWRlZiBlbnVtIF9zbmRfY29uZmlnX3R5cGUgeworCS8qKiBJbnRlZ2VyIG51bWJlci4gKi8KKyAgICAgICAgU05EX0NPTkZJR19UWVBFX0lOVEVHRVIsCisJLyoqIDY0LWJpdCBpbnRlZ2VyIG51bWJlci4gKi8KKyAgICAgICAgU05EX0NPTkZJR19UWVBFX0lOVEVHRVI2NCwKKwkvKiogUmVhbCBudW1iZXIuICovCisgICAgICAgIFNORF9DT05GSUdfVFlQRV9SRUFMLAorCS8qKiBDaGFyYWN0ZXIgc3RyaW5nLiAqLworICAgICAgICBTTkRfQ09ORklHX1RZUEVfU1RSSU5HLAorICAgICAgICAvKiogUG9pbnRlciAocnVudGltZSBvbmx5LCBjYW5ub3QgYmUgc2F2ZWQpLiAqLworICAgICAgICBTTkRfQ09ORklHX1RZUEVfUE9JTlRFUiwKKwkvKiogQ29tcG91bmQgbm9kZS4gKi8KKwlTTkRfQ09ORklHX1RZUEVfQ09NUE9VTkQgPSAxMDI0Cit9IHNuZF9jb25maWdfdHlwZV90OworCisvKioKKyAqIFxicmllZiBJbnRlcm5hbCBzdHJ1Y3R1cmUgZm9yIGEgY29uZmlndXJhdGlvbiBub2RlIG9iamVjdC4KKyAqCisgKiBUaGUgQUxTQSBsaWJyYXJ5IHVzZXMgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlIGFzIGEgaGFuZGxlIHRvIGEKKyAqIGNvbmZpZ3VyYXRpb24gbm9kZS4gQXBwbGljYXRpb25zIGRvbid0IGFjY2VzcyBpdHMgY29udGVudHMgZGlyZWN0bHkuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfY29uZmlnIHNuZF9jb25maWdfdDsKKy8qKgorICogXGJyaWVmIFR5cGUgZm9yIGEgY29uZmlndXJhdGlvbiBjb21wb3VuZCBpdGVyYXRvci4KKyAqCisgKiBUaGUgQUxTQSBsaWJyYXJ5IHVzZXMgdGhpcyBwb2ludGVyIHR5cGUgYXMgYSBoYW5kbGUgdG8gYSBjb25maWd1cmF0aW9uCisgKiBjb21wb3VuZCBpdGVyYXRvci4gQXBwbGljYXRpb25zIGRvbid0IGRpcmVjdGx5IGFjY2VzcyB0aGUgY29udGVudHMgb2YKKyAqIHRoZSBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSB0aGlzIHR5cGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfY29uZmlnX2l0ZXJhdG9yICpzbmRfY29uZmlnX2l0ZXJhdG9yX3Q7CisvKioKKyAqIFxicmllZiBJbnRlcm5hbCBzdHJ1Y3R1cmUgZm9yIGEgY29uZmlndXJhdGlvbiBwcml2YXRlIHVwZGF0ZSBvYmplY3QuCisgKgorICogVGhlIEFMU0EgbGlicmFyeSB1c2VzIHRoaXMgc3RydWN0dXJlIHRvIHNhdmUgcHJpdmF0ZSB1cGRhdGUgaW5mb3JtYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfY29uZmlnX3VwZGF0ZSBzbmRfY29uZmlnX3VwZGF0ZV90OworCitleHRlcm4gc25kX2NvbmZpZ190ICpzbmRfY29uZmlnOworCitpbnQgc25kX2NvbmZpZ190b3Aoc25kX2NvbmZpZ190ICoqY29uZmlnKTsKKworaW50IHNuZF9jb25maWdfbG9hZChzbmRfY29uZmlnX3QgKmNvbmZpZywgc25kX2lucHV0X3QgKmluKTsKK2ludCBzbmRfY29uZmlnX2xvYWRfb3ZlcnJpZGUoc25kX2NvbmZpZ190ICpjb25maWcsIHNuZF9pbnB1dF90ICppbik7CitpbnQgc25kX2NvbmZpZ19zYXZlKHNuZF9jb25maWdfdCAqY29uZmlnLCBzbmRfb3V0cHV0X3QgKm91dCk7CitpbnQgc25kX2NvbmZpZ191cGRhdGUodm9pZCk7CitpbnQgc25kX2NvbmZpZ191cGRhdGVfcihzbmRfY29uZmlnX3QgKip0b3AsIHNuZF9jb25maWdfdXBkYXRlX3QgKip1cGRhdGUsIGNvbnN0IGNoYXIgKnBhdGgpOworaW50IHNuZF9jb25maWdfdXBkYXRlX2ZyZWUoc25kX2NvbmZpZ191cGRhdGVfdCAqdXBkYXRlKTsKK2ludCBzbmRfY29uZmlnX3VwZGF0ZV9mcmVlX2dsb2JhbCh2b2lkKTsKKworaW50IHNuZF9jb25maWdfc2VhcmNoKHNuZF9jb25maWdfdCAqY29uZmlnLCBjb25zdCBjaGFyICprZXksCisJCSAgICAgIHNuZF9jb25maWdfdCAqKnJlc3VsdCk7CitpbnQgc25kX2NvbmZpZ19zZWFyY2h2KHNuZF9jb25maWdfdCAqY29uZmlnLCAKKwkJICAgICAgIHNuZF9jb25maWdfdCAqKnJlc3VsdCwgLi4uKTsKK2ludCBzbmRfY29uZmlnX3NlYXJjaF9kZWZpbml0aW9uKHNuZF9jb25maWdfdCAqY29uZmlnLAorCQkJCSBjb25zdCBjaGFyICpiYXNlLCBjb25zdCBjaGFyICprZXksCisJCQkJIHNuZF9jb25maWdfdCAqKnJlc3VsdCk7CisKK2ludCBzbmRfY29uZmlnX2V4cGFuZChzbmRfY29uZmlnX3QgKmNvbmZpZywgc25kX2NvbmZpZ190ICpyb290LAorCQkgICAgICBjb25zdCBjaGFyICphcmdzLCBzbmRfY29uZmlnX3QgKnByaXZhdGVfZGF0YSwKKwkJICAgICAgc25kX2NvbmZpZ190ICoqcmVzdWx0KTsKK2ludCBzbmRfY29uZmlnX2V2YWx1YXRlKHNuZF9jb25maWdfdCAqY29uZmlnLCBzbmRfY29uZmlnX3QgKnJvb3QsCisJCQlzbmRfY29uZmlnX3QgKnByaXZhdGVfZGF0YSwgc25kX2NvbmZpZ190ICoqcmVzdWx0KTsKKworaW50IHNuZF9jb25maWdfYWRkKHNuZF9jb25maWdfdCAqY29uZmlnLCBzbmRfY29uZmlnX3QgKmxlYWYpOworaW50IHNuZF9jb25maWdfZGVsZXRlKHNuZF9jb25maWdfdCAqY29uZmlnKTsKK2ludCBzbmRfY29uZmlnX2RlbGV0ZV9jb21wb3VuZF9tZW1iZXJzKGNvbnN0IHNuZF9jb25maWdfdCAqY29uZmlnKTsKK2ludCBzbmRfY29uZmlnX2NvcHkoc25kX2NvbmZpZ190ICoqZHN0LCBzbmRfY29uZmlnX3QgKnNyYyk7CisKK2ludCBzbmRfY29uZmlnX21ha2Uoc25kX2NvbmZpZ190ICoqY29uZmlnLCBjb25zdCBjaGFyICprZXksCisJCSAgICBzbmRfY29uZmlnX3R5cGVfdCB0eXBlKTsKK2ludCBzbmRfY29uZmlnX21ha2VfaW50ZWdlcihzbmRfY29uZmlnX3QgKipjb25maWcsIGNvbnN0IGNoYXIgKmtleSk7CitpbnQgc25kX2NvbmZpZ19tYWtlX2ludGVnZXI2NChzbmRfY29uZmlnX3QgKipjb25maWcsIGNvbnN0IGNoYXIgKmtleSk7CitpbnQgc25kX2NvbmZpZ19tYWtlX3JlYWwoc25kX2NvbmZpZ190ICoqY29uZmlnLCBjb25zdCBjaGFyICprZXkpOworaW50IHNuZF9jb25maWdfbWFrZV9zdHJpbmcoc25kX2NvbmZpZ190ICoqY29uZmlnLCBjb25zdCBjaGFyICprZXkpOworaW50IHNuZF9jb25maWdfbWFrZV9wb2ludGVyKHNuZF9jb25maWdfdCAqKmNvbmZpZywgY29uc3QgY2hhciAqa2V5KTsKK2ludCBzbmRfY29uZmlnX21ha2VfY29tcG91bmQoc25kX2NvbmZpZ190ICoqY29uZmlnLCBjb25zdCBjaGFyICprZXksIGludCBqb2luKTsKKworaW50IHNuZF9jb25maWdfaW1ha2VfaW50ZWdlcihzbmRfY29uZmlnX3QgKipjb25maWcsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgbG9uZyB2YWx1ZSk7CitpbnQgc25kX2NvbmZpZ19pbWFrZV9pbnRlZ2VyNjQoc25kX2NvbmZpZ190ICoqY29uZmlnLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGxvbmcgbG9uZyB2YWx1ZSk7CitpbnQgc25kX2NvbmZpZ19pbWFrZV9yZWFsKHNuZF9jb25maWdfdCAqKmNvbmZpZywgY29uc3QgY2hhciAqa2V5LCBjb25zdCBkb3VibGUgdmFsdWUpOworaW50IHNuZF9jb25maWdfaW1ha2Vfc3RyaW5nKHNuZF9jb25maWdfdCAqKmNvbmZpZywgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICphc2NpaSk7CitpbnQgc25kX2NvbmZpZ19pbWFrZV9wb2ludGVyKHNuZF9jb25maWdfdCAqKmNvbmZpZywgY29uc3QgY2hhciAqa2V5LCBjb25zdCB2b2lkICpwdHIpOworCitzbmRfY29uZmlnX3R5cGVfdCBzbmRfY29uZmlnX2dldF90eXBlKGNvbnN0IHNuZF9jb25maWdfdCAqY29uZmlnKTsKKworaW50IHNuZF9jb25maWdfc2V0X2lkKHNuZF9jb25maWdfdCAqY29uZmlnLCBjb25zdCBjaGFyICppZCk7CitpbnQgc25kX2NvbmZpZ19zZXRfaW50ZWdlcihzbmRfY29uZmlnX3QgKmNvbmZpZywgbG9uZyB2YWx1ZSk7CitpbnQgc25kX2NvbmZpZ19zZXRfaW50ZWdlcjY0KHNuZF9jb25maWdfdCAqY29uZmlnLCBsb25nIGxvbmcgdmFsdWUpOworaW50IHNuZF9jb25maWdfc2V0X3JlYWwoc25kX2NvbmZpZ190ICpjb25maWcsIGRvdWJsZSB2YWx1ZSk7CitpbnQgc25kX2NvbmZpZ19zZXRfc3RyaW5nKHNuZF9jb25maWdfdCAqY29uZmlnLCBjb25zdCBjaGFyICp2YWx1ZSk7CitpbnQgc25kX2NvbmZpZ19zZXRfYXNjaWkoc25kX2NvbmZpZ190ICpjb25maWcsIGNvbnN0IGNoYXIgKmFzY2lpKTsKK2ludCBzbmRfY29uZmlnX3NldF9wb2ludGVyKHNuZF9jb25maWdfdCAqY29uZmlnLCBjb25zdCB2b2lkICpwdHIpOworaW50IHNuZF9jb25maWdfZ2V0X2lkKGNvbnN0IHNuZF9jb25maWdfdCAqY29uZmlnLCBjb25zdCBjaGFyICoqdmFsdWUpOworaW50IHNuZF9jb25maWdfZ2V0X2ludGVnZXIoY29uc3Qgc25kX2NvbmZpZ190ICpjb25maWcsIGxvbmcgKnZhbHVlKTsKK2ludCBzbmRfY29uZmlnX2dldF9pbnRlZ2VyNjQoY29uc3Qgc25kX2NvbmZpZ190ICpjb25maWcsIGxvbmcgbG9uZyAqdmFsdWUpOworaW50IHNuZF9jb25maWdfZ2V0X3JlYWwoY29uc3Qgc25kX2NvbmZpZ190ICpjb25maWcsIGRvdWJsZSAqdmFsdWUpOworaW50IHNuZF9jb25maWdfZ2V0X2lyZWFsKGNvbnN0IHNuZF9jb25maWdfdCAqY29uZmlnLCBkb3VibGUgKnZhbHVlKTsKK2ludCBzbmRfY29uZmlnX2dldF9zdHJpbmcoY29uc3Qgc25kX2NvbmZpZ190ICpjb25maWcsIGNvbnN0IGNoYXIgKip2YWx1ZSk7CitpbnQgc25kX2NvbmZpZ19nZXRfYXNjaWkoY29uc3Qgc25kX2NvbmZpZ190ICpjb25maWcsIGNoYXIgKip2YWx1ZSk7CitpbnQgc25kX2NvbmZpZ19nZXRfcG9pbnRlcihjb25zdCBzbmRfY29uZmlnX3QgKmNvbmZpZywgY29uc3Qgdm9pZCAqKnZhbHVlKTsKK2ludCBzbmRfY29uZmlnX3Rlc3RfaWQoY29uc3Qgc25kX2NvbmZpZ190ICpjb25maWcsIGNvbnN0IGNoYXIgKmlkKTsKKworc25kX2NvbmZpZ19pdGVyYXRvcl90IHNuZF9jb25maWdfaXRlcmF0b3JfZmlyc3QoY29uc3Qgc25kX2NvbmZpZ190ICpub2RlKTsKK3NuZF9jb25maWdfaXRlcmF0b3JfdCBzbmRfY29uZmlnX2l0ZXJhdG9yX25leHQoY29uc3Qgc25kX2NvbmZpZ19pdGVyYXRvcl90IGl0ZXJhdG9yKTsKK3NuZF9jb25maWdfaXRlcmF0b3JfdCBzbmRfY29uZmlnX2l0ZXJhdG9yX2VuZChjb25zdCBzbmRfY29uZmlnX3QgKm5vZGUpOworc25kX2NvbmZpZ190ICpzbmRfY29uZmlnX2l0ZXJhdG9yX2VudHJ5KGNvbnN0IHNuZF9jb25maWdfaXRlcmF0b3JfdCBpdGVyYXRvcik7CisKKy8qKgorICogXGJyaWVmIEhlbHBlciBtYWNybyB0byBpdGVyYXRlIG92ZXIgdGhlIGNoaWxkcmVuIG9mIGEgY29tcG91bmQgbm9kZS4KKyAqIFxwYXJhbVtpbixvdXRdIHBvcyBJdGVyYXRvciB2YXJpYWJsZSBmb3IgdGhlIGN1cnJlbnQgbm9kZS4KKyAqIFxwYXJhbVtpbixvdXRdIG5leHQgVGVtcG9yYXJ5IGl0ZXJhdG9yIHZhcmlhYmxlIGZvciB0aGUgbmV4dCBub2RlLgorICogXHBhcmFtW2luXSBub2RlIEhhbmRsZSB0byB0aGUgY29tcG91bmQgY29uZmlndXJhdGlvbiBub2RlIHRvIGl0ZXJhdGUgb3Zlci4KKyAqCisgKiBVc2UgdGhpcyBtYWNybyBsaWtlIGEgXGMgZm9yIHN0YXRlbWVudCwgZS5nLjoKKyAqIFxjb2RlCisgKiBzbmRfY29uZmlnX2l0ZXJhdG9yX3QgcG9zLCBuZXh0OworICogc25kX2NvbmZpZ19mb3JfZWFjaChwb3MsIG5leHQsIG5vZGUpIHsKKyAqICAgICBzbmRfY29uZmlnX3QgKmVudHJ5ID0gc25kX2NvbmZpZ19pdGVyYXRvcl9lbnRyeShwb3MpOworICogICAgIC4uLgorICogfQorICogXGVuZGNvZGUKKyAqCisgKiBUaGlzIG1hY3JvIGFsbG93cyBkZWxldGluZyBvciByZW1vdmluZyB0aGUgY3VycmVudCBub2RlLgorICovCisjZGVmaW5lIHNuZF9jb25maWdfZm9yX2VhY2gocG9zLCBuZXh0LCBub2RlKSBcCisJZm9yIChwb3MgPSBzbmRfY29uZmlnX2l0ZXJhdG9yX2ZpcnN0KG5vZGUpLCBuZXh0ID0gc25kX2NvbmZpZ19pdGVyYXRvcl9uZXh0KHBvcyk7IHBvcyAhPSBzbmRfY29uZmlnX2l0ZXJhdG9yX2VuZChub2RlKTsgcG9zID0gbmV4dCwgbmV4dCA9IHNuZF9jb25maWdfaXRlcmF0b3JfbmV4dChwb3MpKQorCisvKiBNaXNjIGZ1bmN0aW9ucyAqLworCitpbnQgc25kX2NvbmZpZ19nZXRfYm9vbF9hc2NpaShjb25zdCBjaGFyICphc2NpaSk7CitpbnQgc25kX2NvbmZpZ19nZXRfYm9vbChjb25zdCBzbmRfY29uZmlnX3QgKmNvbmYpOworaW50IHNuZF9jb25maWdfZ2V0X2N0bF9pZmFjZV9hc2NpaShjb25zdCBjaGFyICphc2NpaSk7CitpbnQgc25kX2NvbmZpZ19nZXRfY3RsX2lmYWNlKGNvbnN0IHNuZF9jb25maWdfdCAqY29uZik7CisKKy8qIE5hbWVzIGZ1bmN0aW9ucyAqLworCisvKioKKyAqIERldmljZS1uYW1lIGxpc3QgZWxlbWVudAorICovCit0eXBlZGVmIHN0cnVjdCBzbmRfZGV2bmFtZSBzbmRfZGV2bmFtZV90OworCisvKioKKyAqIERldmljZS1uYW1lIGxpc3QgZWxlbWVudCAoZGVmaW5pdGlvbikKKyAqLworc3RydWN0IHNuZF9kZXZuYW1lIHsKKwljaGFyICpuYW1lOwkvKio8IERldmljZSBuYW1lIHN0cmluZyAqLworCWNoYXIgKmNvbW1lbnQ7CS8qKjwgQ29tbWVudHMgKi8KKwlzbmRfZGV2bmFtZV90ICpuZXh0OwkvKio8IE5leHQgcG9pbnRlciAqLworfTsKKworaW50IHNuZF9uYW1lc19saXN0KGNvbnN0IGNoYXIgKmlmYWNlLCBzbmRfZGV2bmFtZV90ICoqbGlzdCk7Cit2b2lkIHNuZF9uYW1lc19saXN0X2ZyZWUoc25kX2Rldm5hbWVfdCAqbGlzdCk7CisKKy8qKiBcfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19BTFNBX0NPTkZfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2NvbnRyb2wuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9jb250cm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg4NjI5ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9jb250cm9sLmgKQEAgLTAsMCArMSw1OTAgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9jb250cm9sLmgKKyAqIFxicmllZiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKiBcYXV0aG9yIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKiBcYXV0aG9yIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMTk5OC0yMDAxCisgKgorICogQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICovCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX0NPTlRST0xfSAorI2RlZmluZSBfX0FMU0FfQ09OVFJPTF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiAgXGRlZmdyb3VwIENvbnRyb2wgQ29udHJvbCBJbnRlcmZhY2UKKyAqICBUaGUgY29udHJvbCBpbnRlcmZhY2UuCisgKiAgU2VlIFxyZWYgY29udHJvbCBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiAgXHsKKyAqLworCisvKiogZGxzeW0gdmVyc2lvbiBmb3IgaW50ZXJmYWNlIGVudHJ5IGNhbGxiYWNrICovCisjZGVmaW5lIFNORF9DT05UUk9MX0RMU1lNX1ZFUlNJT04JX2Rsc3ltX2NvbnRyb2xfMDAxCisKKy8qKiBJRUM5NTggc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBzbmRfYWVzX2llYzk1OCB7CisJdW5zaWduZWQgY2hhciBzdGF0dXNbMjRdOwkvKio8IEFFUy9JRUM5NTggY2hhbm5lbCBzdGF0dXMgYml0cyAqLworCXVuc2lnbmVkIGNoYXIgc3ViY29kZVsxNDddOwkvKio8IEFFUy9JRUM5NTggc3ViY29kZSBiaXRzICovCisJdW5zaWduZWQgY2hhciBwYWQ7CQkvKio8IG5vdGhpbmcgKi8KKwl1bnNpZ25lZCBjaGFyIGRpZ19zdWJmcmFtZVs0XTsJLyoqPCBBRVMvSUVDOTU4IHN1YmZyYW1lIGJpdHMgKi8KK30gc25kX2Flc19pZWM5NThfdDsKKworLyoqIENUTCBjYXJkIGluZm8gY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX2N0bF9jYXJkX2luZm8gc25kX2N0bF9jYXJkX2luZm9fdDsKKworLyoqIENUTCBlbGVtZW50IGlkZW50aWZpZXIgY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX2N0bF9lbGVtX2lkIHNuZF9jdGxfZWxlbV9pZF90OworCisvKiogQ1RMIGVsZW1lbnQgaWRlbnRpZmllciBsaXN0IGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9jdGxfZWxlbV9saXN0IHNuZF9jdGxfZWxlbV9saXN0X3Q7CisKKy8qKiBDVEwgZWxlbWVudCBpbmZvIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9jdGxfZWxlbV9pbmZvIHNuZF9jdGxfZWxlbV9pbmZvX3Q7CisKKy8qKiBDVEwgZWxlbWVudCB2YWx1ZSBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfY3RsX2VsZW1fdmFsdWUgc25kX2N0bF9lbGVtX3ZhbHVlX3Q7CisKKy8qKiBDVEwgZXZlbnQgY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX2N0bF9ldmVudCBzbmRfY3RsX2V2ZW50X3Q7CisKKy8qKiBDVEwgZWxlbWVudCB0eXBlICovCit0eXBlZGVmIGVudW0gX3NuZF9jdGxfZWxlbV90eXBlIHsKKwkvKiogSW52YWxpZCB0eXBlICovCisJU05EX0NUTF9FTEVNX1RZUEVfTk9ORSA9IDAsCisJLyoqIEJvb2xlYW4gY29udGVudHMgKi8KKwlTTkRfQ1RMX0VMRU1fVFlQRV9CT09MRUFOLAorCS8qKiBJbnRlZ2VyIGNvbnRlbnRzICovCisJU05EX0NUTF9FTEVNX1RZUEVfSU5URUdFUiwKKwkvKiogRW51bWVyYXRlZCBjb250ZW50cyAqLworCVNORF9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQsCisJLyoqIEJ5dGVzIGNvbnRlbnRzICovCisJU05EX0NUTF9FTEVNX1RZUEVfQllURVMsCisJLyoqIElFQzk1OCAoUy9QRElGKSBzZXR0aW5nIGNvbnRlbnQgKi8KKwlTTkRfQ1RMX0VMRU1fVFlQRV9JRUM5NTgsCisJLyoqIDY0LWJpdCBpbnRlZ2VyIGNvbnRlbnRzICovCisJU05EX0NUTF9FTEVNX1RZUEVfSU5URUdFUjY0LAorCVNORF9DVExfRUxFTV9UWVBFX0xBU1QgPSBTTkRfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSNjQKK30gc25kX2N0bF9lbGVtX3R5cGVfdDsKKworLyoqIENUTCByZWxhdGVkIGludGVyZmFjZSAqLwordHlwZWRlZiBlbnVtIF9zbmRfY3RsX2VsZW1faWZhY2UgeworCS8qKiBDYXJkIGxldmVsICovCisJU05EX0NUTF9FTEVNX0lGQUNFX0NBUkQgPSAwLAorCS8qKiBIYXJkd2FyZSBkZXBlbmRlbnQgZGV2aWNlICovCisJU05EX0NUTF9FTEVNX0lGQUNFX0hXREVQLAorCS8qKiBNaXhlciAqLworCVNORF9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkvKiogUENNICovCisJU05EX0NUTF9FTEVNX0lGQUNFX1BDTSwKKwkvKiogUmF3TWlkaSAqLworCVNORF9DVExfRUxFTV9JRkFDRV9SQVdNSURJLAorCS8qKiBUaW1lciAqLworCVNORF9DVExfRUxFTV9JRkFDRV9USU1FUiwKKwkvKiogU2VxdWVuY2VyICovCisJU05EX0NUTF9FTEVNX0lGQUNFX1NFUVVFTkNFUiwKKwlTTkRfQ1RMX0VMRU1fSUZBQ0VfTEFTVCA9IFNORF9DVExfRUxFTV9JRkFDRV9TRVFVRU5DRVIKK30gc25kX2N0bF9lbGVtX2lmYWNlX3Q7CisKKy8qKiBFdmVudCBjbGFzcyAqLwordHlwZWRlZiBlbnVtIF9zbmRfY3RsX2V2ZW50X3R5cGUgeworCS8qKiBFbGVtZW50cyByZWxhdGVkIGV2ZW50ICovCisJU05EX0NUTF9FVkVOVF9FTEVNID0gMCwKKwlTTkRfQ1RMX0VWRU5UX0xBU1QgPSBTTkRfQ1RMX0VWRU5UX0VMRU0KK31zbmRfY3RsX2V2ZW50X3R5cGVfdDsKKworLyoqIEVsZW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCAoV2FybmluZzogdGVzdCB0aGlzIGZpcnN0IGFuZCBpZiBzZXQgZG9uJ3QKKyAgKiB0ZXN0IHRoZSBvdGhlciBtYXNrcykgXGhpZGVpbml0aWFsaXplciAqLworI2RlZmluZSBTTkRfQ1RMX0VWRU5UX01BU0tfUkVNT1ZFIAkofjBVKQorLyoqIEVsZW1lbnQgdmFsdWUgaGFzIGJlZW4gY2hhbmdlZCBcaGlkZWluaXRpYWxpemVyICovCisjZGVmaW5lIFNORF9DVExfRVZFTlRfTUFTS19WQUxVRQkoMTw8MCkKKy8qKiBFbGVtZW50IGluZm8gaGFzIGJlZW4gY2hhbmdlZCBcaGlkZWluaXRpYWxpemVyICovCisjZGVmaW5lIFNORF9DVExfRVZFTlRfTUFTS19JTkZPCQkoMTw8MSkKKy8qKiBFbGVtZW50IGhhcyBiZWVuIGFkZGVkIFxoaWRlaW5pdGlhbGl6ZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9FVkVOVF9NQVNLX0FERAkJKDE8PDIpCisvKiogRWxlbWVudCdzIFRMViB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkIFxoaWRlaW5pdGlhbGl6ZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9FVkVOVF9NQVNLX1RMVgkJKDE8PDMpCisKKy8qKiBDVEwgbmFtZSBoZWxwZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9OQU1FX05PTkUJCQkJIiIKKy8qKiBDVEwgbmFtZSBoZWxwZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9OQU1FX1BMQVlCQUNLCQkJCSJQbGF5YmFjayAiCisvKiogQ1RMIG5hbWUgaGVscGVyICovCisjZGVmaW5lIFNORF9DVExfTkFNRV9DQVBUVVJFCQkJCSJDYXB0dXJlICIKKworLyoqIENUTCBuYW1lIGhlbHBlciAqLworI2RlZmluZSBTTkRfQ1RMX05BTUVfSUVDOTU4X05PTkUJCQkiIgorLyoqIENUTCBuYW1lIGhlbHBlciAqLworI2RlZmluZSBTTkRfQ1RMX05BTUVfSUVDOTU4X1NXSVRDSAkJCSJTd2l0Y2giCisvKiogQ1RMIG5hbWUgaGVscGVyICovCisjZGVmaW5lIFNORF9DVExfTkFNRV9JRUM5NThfVk9MVU1FCQkJIlZvbHVtZSIKKy8qKiBDVEwgbmFtZSBoZWxwZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9OQU1FX0lFQzk1OF9ERUZBVUxUCQkJIkRlZmF1bHQiCisvKiogQ1RMIG5hbWUgaGVscGVyICovCisjZGVmaW5lIFNORF9DVExfTkFNRV9JRUM5NThfTUFTSwkJCSJNYXNrIgorLyoqIENUTCBuYW1lIGhlbHBlciAqLworI2RlZmluZSBTTkRfQ1RMX05BTUVfSUVDOTU4X0NPTl9NQVNLCQkJIkNvbiBNYXNrIgorLyoqIENUTCBuYW1lIGhlbHBlciAqLworI2RlZmluZSBTTkRfQ1RMX05BTUVfSUVDOTU4X1BST19NQVNLCQkJIlBybyBNYXNrIgorLyoqIENUTCBuYW1lIGhlbHBlciAqLworI2RlZmluZSBTTkRfQ1RMX05BTUVfSUVDOTU4X1BDTV9TVFJFQU0JCQkiUENNIFN0cmVhbSIKKy8qKiBFbGVtZW50IG5hbWUgZm9yIElFQzk1OCAoUy9QRElGKSAqLworI2RlZmluZSBTTkRfQ1RMX05BTUVfSUVDOTU4KGV4cGwsZGlyZWN0aW9uLHdoYXQpCSJJRUM5NTggIiBleHBsIFNORF9DVExfTkFNRV8jI2RpcmVjdGlvbiBTTkRfQ1RMX05BTUVfSUVDOTU4XyMjd2hhdAorCisvKiogTWFzayBmb3IgdGhlIG1ham9yIFBvd2VyIFN0YXRlIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9QT1dFUl9NQVNLCQkweGZmMDAKKy8qKiBBQ1BJL1BDSSBQb3dlciBTdGF0ZSBEMCAqLworI2RlZmluZSBTTkRfQ1RMX1BPV0VSX0QwICAgICAgICAgIAkweDAwMDAKKy8qKiBBQ1BJL1BDSSBQb3dlciBTdGF0ZSBEMSAqLworI2RlZmluZSBTTkRfQ1RMX1BPV0VSX0QxICAgICAJICAgICAJMHgwMTAwCisvKiogQUNQSS9QQ0kgUG93ZXIgU3RhdGUgRDIgKi8KKyNkZWZpbmUgU05EX0NUTF9QT1dFUl9EMiAJICAgICAgICAweDAyMDAKKy8qKiBBQ1BJL1BDSSBQb3dlciBTdGF0ZSBEMyAqLworI2RlZmluZSBTTkRfQ1RMX1BPV0VSX0QzICAgICAgICAgCTB4MDMwMAorLyoqIEFDUEkvUENJIFBvd2VyIFN0YXRlIEQzaG90ICovCisjZGVmaW5lIFNORF9DVExfUE9XRVJfRDNob3QJCShTTkRfQ1RMX1BPV0VSX0QzfDB4MDAwMCkKKy8qKiBBQ1BJL1BDSSBQb3dlciBTdGF0ZSBEM2NvbGQgKi8KKyNkZWZpbmUgU05EX0NUTF9QT1dFUl9EM2NvbGQJICAgICAgCShTTkRfQ1RMX1BPV0VSX0QzfDB4MDAwMSkKKworLyoqIFRMViB0eXBlIC0gQ29udGFpbmVyICovCisjZGVmaW5lIFNORF9DVExfVExWVF9DT05UQUlORVIJCTB4MDAwMAorLyoqIFRMViB0eXBlIC0gYmFzaWMgZEIgc2NhbGUgKi8KKyNkZWZpbmUgU05EX0NUTF9UTFZUX0RCX1NDQUxFCQkweDAwMDEKKy8qKiBUTFYgdHlwZSAtIGxpbmVhciB2b2x1bWUgKi8KKyNkZWZpbmUgU05EX0NUTF9UTFZUX0RCX0xJTkVBUgkJMHgwMDAyCisvKiogVExWIHR5cGUgLSBkQiByYW5nZSBjb250YWluZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9UTFZUX0RCX1JBTkdFCQkweDAwMDMKKy8qKiBUTFYgdHlwZSAtIGRCIHNjYWxlIHNwZWNpZmllZCBieSBtaW4vbWF4IHZhbHVlcyAqLworI2RlZmluZSBTTkRfQ1RMX1RMVlRfREJfTUlOTUFYCQkweDAwMDQKKy8qKiBUTFYgdHlwZSAtIGRCIHNjYWxlIHNwZWNpZmllZCBieSBtaW4vbWF4IHZhbHVlcyAod2l0aCBtdXRlKSAqLworI2RlZmluZSBTTkRfQ1RMX1RMVlRfREJfTUlOTUFYX01VVEUJMHgwMDA1CisKKy8qKiBNdXRlIHN0YXRlICovCisjZGVmaW5lIFNORF9DVExfVExWX0RCX0dBSU5fTVVURQktOTk5OTk5OQorCisvKiogQ1RMIHR5cGUgKi8KK3R5cGVkZWYgZW51bSBfc25kX2N0bF90eXBlIHsKKwkvKiogS2VybmVsIGxldmVsIENUTCAqLworCVNORF9DVExfVFlQRV9IVywKKwkvKiogU2hhcmVkIG1lbW9yeSBjbGllbnQgQ1RMICovCisJU05EX0NUTF9UWVBFX1NITSwKKwkvKiogSU5FVCBjbGllbnQgQ1RMIChub3QgeWV0IGltcGxlbWVudGVkKSAqLworCVNORF9DVExfVFlQRV9JTkVULAorCS8qKiBFeHRlcm5hbCBjb250cm9sIHBsdWdpbiAqLworCVNORF9DVExfVFlQRV9FWFQKK30gc25kX2N0bF90eXBlX3Q7CisKKy8qKiBOb24gYmxvY2tpbmcgbW9kZSAoZmxhZyBmb3Igb3BlbiBtb2RlKSBcaGlkZWluaXRpYWxpemVyICovCisjZGVmaW5lIFNORF9DVExfTk9OQkxPQ0sJCTB4MDAwMQorCisvKiogQXN5bmMgbm90aWZpY2F0aW9uIChmbGFnIGZvciBvcGVuIG1vZGUpIFxoaWRlaW5pdGlhbGl6ZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9BU1lOQwkJCTB4MDAwMgorCisvKiogUmVhZCBvbmx5IChmbGFnIGZvciBvcGVuIG1vZGUpIFxoaWRlaW5pdGlhbGl6ZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9SRUFET05MWQkJMHgwMDA0CisKKy8qKiBDVEwgaGFuZGxlICovCit0eXBlZGVmIHN0cnVjdCBfc25kX2N0bCBzbmRfY3RsX3Q7CisKKy8qKiBEb24ndCBkZXN0cm95IHRoZSBjdGwgaGFuZGxlIHdoZW4gY2xvc2UgKi8KKyNkZWZpbmUgU05EX1NDVExfTk9GUkVFCQkJMHgwMDAxCisKKy8qKiBTQ1RMIHR5cGUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfc2N0bCBzbmRfc2N0bF90OworCitpbnQgc25kX2NhcmRfbG9hZChpbnQgY2FyZCk7CitpbnQgc25kX2NhcmRfbmV4dChpbnQgKmNhcmQpOworaW50IHNuZF9jYXJkX2dldF9pbmRleChjb25zdCBjaGFyICpuYW1lKTsKK2ludCBzbmRfY2FyZF9nZXRfbmFtZShpbnQgY2FyZCwgY2hhciAqKm5hbWUpOworaW50IHNuZF9jYXJkX2dldF9sb25nbmFtZShpbnQgY2FyZCwgY2hhciAqKm5hbWUpOworCitpbnQgc25kX2RldmljZV9uYW1lX2hpbnQoaW50IGNhcmQsIGNvbnN0IGNoYXIgKmlmYWNlLCB2b2lkICoqKmhpbnRzKTsKK2ludCBzbmRfZGV2aWNlX25hbWVfZnJlZV9oaW50KHZvaWQgKipoaW50cyk7CitjaGFyICpzbmRfZGV2aWNlX25hbWVfZ2V0X2hpbnQoY29uc3Qgdm9pZCAqaGludCwgY29uc3QgY2hhciAqaWQpOworCitpbnQgc25kX2N0bF9vcGVuKHNuZF9jdGxfdCAqKmN0bCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG1vZGUpOworaW50IHNuZF9jdGxfb3Blbl9sY29uZihzbmRfY3RsX3QgKipjdGwsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2RlLCBzbmRfY29uZmlnX3QgKmxjb25mKTsKK2ludCBzbmRfY3RsX29wZW5fZmFsbGJhY2soc25kX2N0bF90ICoqY3RsLCBzbmRfY29uZmlnX3QgKnJvb3QsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKm9yaWdfbmFtZSwgaW50IG1vZGUpOworaW50IHNuZF9jdGxfY2xvc2Uoc25kX2N0bF90ICpjdGwpOworaW50IHNuZF9jdGxfbm9uYmxvY2soc25kX2N0bF90ICpjdGwsIGludCBub25ibG9jayk7CitpbnQgc25kX2FzeW5jX2FkZF9jdGxfaGFuZGxlcihzbmRfYXN5bmNfaGFuZGxlcl90ICoqaGFuZGxlciwgc25kX2N0bF90ICpjdGwsIAorCQkJICAgICAgc25kX2FzeW5jX2NhbGxiYWNrX3QgY2FsbGJhY2ssIHZvaWQgKnByaXZhdGVfZGF0YSk7CitzbmRfY3RsX3QgKnNuZF9hc3luY19oYW5kbGVyX2dldF9jdGwoc25kX2FzeW5jX2hhbmRsZXJfdCAqaGFuZGxlcik7CitpbnQgc25kX2N0bF9wb2xsX2Rlc2NyaXB0b3JzX2NvdW50KHNuZF9jdGxfdCAqY3RsKTsKK2ludCBzbmRfY3RsX3BvbGxfZGVzY3JpcHRvcnMoc25kX2N0bF90ICpjdGwsIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBzcGFjZSk7CitpbnQgc25kX2N0bF9wb2xsX2Rlc2NyaXB0b3JzX3JldmVudHMoc25kX2N0bF90ICpjdGwsIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBuZmRzLCB1bnNpZ25lZCBzaG9ydCAqcmV2ZW50cyk7CitpbnQgc25kX2N0bF9zdWJzY3JpYmVfZXZlbnRzKHNuZF9jdGxfdCAqY3RsLCBpbnQgc3Vic2NyaWJlKTsKK2ludCBzbmRfY3RsX2NhcmRfaW5mbyhzbmRfY3RsX3QgKmN0bCwgc25kX2N0bF9jYXJkX2luZm9fdCAqaW5mbyk7CitpbnQgc25kX2N0bF9lbGVtX2xpc3Qoc25kX2N0bF90ICpjdGwsIHNuZF9jdGxfZWxlbV9saXN0X3QgKmxpc3QpOworaW50IHNuZF9jdGxfZWxlbV9pbmZvKHNuZF9jdGxfdCAqY3RsLCBzbmRfY3RsX2VsZW1faW5mb190ICppbmZvKTsKK2ludCBzbmRfY3RsX2VsZW1fcmVhZChzbmRfY3RsX3QgKmN0bCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnZhbHVlKTsKK2ludCBzbmRfY3RsX2VsZW1fd3JpdGUoc25kX2N0bF90ICpjdGwsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp2YWx1ZSk7CitpbnQgc25kX2N0bF9lbGVtX2xvY2soc25kX2N0bF90ICpjdGwsIHNuZF9jdGxfZWxlbV9pZF90ICppZCk7CitpbnQgc25kX2N0bF9lbGVtX3VubG9jayhzbmRfY3RsX3QgKmN0bCwgc25kX2N0bF9lbGVtX2lkX3QgKmlkKTsKK2ludCBzbmRfY3RsX2VsZW1fdGx2X3JlYWQoc25kX2N0bF90ICpjdGwsIGNvbnN0IHNuZF9jdGxfZWxlbV9pZF90ICppZCwKKwkJCSAgdW5zaWduZWQgaW50ICp0bHYsIHVuc2lnbmVkIGludCB0bHZfc2l6ZSk7CitpbnQgc25kX2N0bF9lbGVtX3Rsdl93cml0ZShzbmRfY3RsX3QgKmN0bCwgY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKmlkLAorCQkJICAgY29uc3QgdW5zaWduZWQgaW50ICp0bHYpOworaW50IHNuZF9jdGxfZWxlbV90bHZfY29tbWFuZChzbmRfY3RsX3QgKmN0bCwgY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKmlkLAorCQkJICAgICBjb25zdCB1bnNpZ25lZCBpbnQgKnRsdik7CisjaWZkZWYgX19BTFNBX0hXREVQX0gKK2ludCBzbmRfY3RsX2h3ZGVwX25leHRfZGV2aWNlKHNuZF9jdGxfdCAqY3RsLCBpbnQgKiBkZXZpY2UpOworaW50IHNuZF9jdGxfaHdkZXBfaW5mbyhzbmRfY3RsX3QgKmN0bCwgc25kX2h3ZGVwX2luZm9fdCAqIGluZm8pOworI2VuZGlmCisjaWZkZWYgX19BTFNBX1BDTV9ICitpbnQgc25kX2N0bF9wY21fbmV4dF9kZXZpY2Uoc25kX2N0bF90ICpjdGwsIGludCAqZGV2aWNlKTsKK2ludCBzbmRfY3RsX3BjbV9pbmZvKHNuZF9jdGxfdCAqY3RsLCBzbmRfcGNtX2luZm9fdCAqIGluZm8pOworaW50IHNuZF9jdGxfcGNtX3ByZWZlcl9zdWJkZXZpY2Uoc25kX2N0bF90ICpjdGwsIGludCBzdWJkZXYpOworI2VuZGlmCisjaWZkZWYgX19BTFNBX1JBV01JRElfSAoraW50IHNuZF9jdGxfcmF3bWlkaV9uZXh0X2RldmljZShzbmRfY3RsX3QgKmN0bCwgaW50ICogZGV2aWNlKTsKK2ludCBzbmRfY3RsX3Jhd21pZGlfaW5mbyhzbmRfY3RsX3QgKmN0bCwgc25kX3Jhd21pZGlfaW5mb190ICogaW5mbyk7CitpbnQgc25kX2N0bF9yYXdtaWRpX3ByZWZlcl9zdWJkZXZpY2Uoc25kX2N0bF90ICpjdGwsIGludCBzdWJkZXYpOworI2VuZGlmCitpbnQgc25kX2N0bF9zZXRfcG93ZXJfc3RhdGUoc25kX2N0bF90ICpjdGwsIHVuc2lnbmVkIGludCBzdGF0ZSk7CitpbnQgc25kX2N0bF9nZXRfcG93ZXJfc3RhdGUoc25kX2N0bF90ICpjdGwsIHVuc2lnbmVkIGludCAqc3RhdGUpOworCitpbnQgc25kX2N0bF9yZWFkKHNuZF9jdGxfdCAqY3RsLCBzbmRfY3RsX2V2ZW50X3QgKmV2ZW50KTsKK2ludCBzbmRfY3RsX3dhaXQoc25kX2N0bF90ICpjdGwsIGludCB0aW1lb3V0KTsKK2NvbnN0IGNoYXIgKnNuZF9jdGxfbmFtZShzbmRfY3RsX3QgKmN0bCk7CitzbmRfY3RsX3R5cGVfdCBzbmRfY3RsX3R5cGUoc25kX2N0bF90ICpjdGwpOworCitjb25zdCBjaGFyICpzbmRfY3RsX2VsZW1fdHlwZV9uYW1lKHNuZF9jdGxfZWxlbV90eXBlX3QgdHlwZSk7Citjb25zdCBjaGFyICpzbmRfY3RsX2VsZW1faWZhY2VfbmFtZShzbmRfY3RsX2VsZW1faWZhY2VfdCBpZmFjZSk7Citjb25zdCBjaGFyICpzbmRfY3RsX2V2ZW50X3R5cGVfbmFtZShzbmRfY3RsX2V2ZW50X3R5cGVfdCB0eXBlKTsKKwordW5zaWduZWQgaW50IHNuZF9jdGxfZXZlbnRfZWxlbV9nZXRfbWFzayhjb25zdCBzbmRfY3RsX2V2ZW50X3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9ldmVudF9lbGVtX2dldF9udW1pZChjb25zdCBzbmRfY3RsX2V2ZW50X3QgKm9iaik7Cit2b2lkIHNuZF9jdGxfZXZlbnRfZWxlbV9nZXRfaWQoY29uc3Qgc25kX2N0bF9ldmVudF90ICpvYmosIHNuZF9jdGxfZWxlbV9pZF90ICpwdHIpOworc25kX2N0bF9lbGVtX2lmYWNlX3Qgc25kX2N0bF9ldmVudF9lbGVtX2dldF9pbnRlcmZhY2UoY29uc3Qgc25kX2N0bF9ldmVudF90ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9jdGxfZXZlbnRfZWxlbV9nZXRfZGV2aWNlKGNvbnN0IHNuZF9jdGxfZXZlbnRfdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2V2ZW50X2VsZW1fZ2V0X3N1YmRldmljZShjb25zdCBzbmRfY3RsX2V2ZW50X3QgKm9iaik7Citjb25zdCBjaGFyICpzbmRfY3RsX2V2ZW50X2VsZW1fZ2V0X25hbWUoY29uc3Qgc25kX2N0bF9ldmVudF90ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9jdGxfZXZlbnRfZWxlbV9nZXRfaW5kZXgoY29uc3Qgc25kX2N0bF9ldmVudF90ICpvYmopOworCitpbnQgc25kX2N0bF9lbGVtX2xpc3RfYWxsb2Nfc3BhY2Uoc25kX2N0bF9lbGVtX2xpc3RfdCAqb2JqLCB1bnNpZ25lZCBpbnQgZW50cmllcyk7Cit2b2lkIHNuZF9jdGxfZWxlbV9saXN0X2ZyZWVfc3BhY2Uoc25kX2N0bF9lbGVtX2xpc3RfdCAqb2JqKTsKKworY2hhciAqc25kX2N0bF9hc2NpaV9lbGVtX2lkX2dldChzbmRfY3RsX2VsZW1faWRfdCAqaWQpOworaW50IHNuZF9jdGxfYXNjaWlfZWxlbV9pZF9wYXJzZShzbmRfY3RsX2VsZW1faWRfdCAqZHN0LCBjb25zdCBjaGFyICpzdHIpOworaW50IHNuZF9jdGxfYXNjaWlfdmFsdWVfcGFyc2Uoc25kX2N0bF90ICpoYW5kbGUsCisJCQkgICAgICBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqZHN0LAorCQkJICAgICAgc25kX2N0bF9lbGVtX2luZm9fdCAqaW5mbywKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKTsKKworc2l6ZV90IHNuZF9jdGxfZWxlbV9pZF9zaXplb2Yodm9pZCk7CisvKiogXGhpZGVpbml0aWFsaXplcgorICogXGJyaWVmIGFsbG9jYXRlIGFuIGludmFsaWQgI3NuZF9jdGxfZWxlbV9pZF90IHVzaW5nIHN0YW5kYXJkIGFsbG9jYQorICogXHBhcmFtIHB0ciByZXR1cm5lZCBwb2ludGVyCisgKi8KKyNkZWZpbmUgc25kX2N0bF9lbGVtX2lkX2FsbG9jYShwdHIpIF9fc25kX2FsbG9jYShwdHIsIHNuZF9jdGxfZWxlbV9pZCkKK2ludCBzbmRfY3RsX2VsZW1faWRfbWFsbG9jKHNuZF9jdGxfZWxlbV9pZF90ICoqcHRyKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2lkX2ZyZWUoc25kX2N0bF9lbGVtX2lkX3QgKm9iaik7Cit2b2lkIHNuZF9jdGxfZWxlbV9pZF9jbGVhcihzbmRfY3RsX2VsZW1faWRfdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2lkX2NvcHkoc25kX2N0bF9lbGVtX2lkX3QgKmRzdCwgY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKnNyYyk7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX2lkX2dldF9udW1pZChjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqb2JqKTsKK3NuZF9jdGxfZWxlbV9pZmFjZV90IHNuZF9jdGxfZWxlbV9pZF9nZXRfaW50ZXJmYWNlKGNvbnN0IHNuZF9jdGxfZWxlbV9pZF90ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9jdGxfZWxlbV9pZF9nZXRfZGV2aWNlKGNvbnN0IHNuZF9jdGxfZWxlbV9pZF90ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9jdGxfZWxlbV9pZF9nZXRfc3ViZGV2aWNlKGNvbnN0IHNuZF9jdGxfZWxlbV9pZF90ICpvYmopOworY29uc3QgY2hhciAqc25kX2N0bF9lbGVtX2lkX2dldF9uYW1lKGNvbnN0IHNuZF9jdGxfZWxlbV9pZF90ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9jdGxfZWxlbV9pZF9nZXRfaW5kZXgoY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKm9iaik7Cit2b2lkIHNuZF9jdGxfZWxlbV9pZF9zZXRfbnVtaWQoc25kX2N0bF9lbGVtX2lkX3QgKm9iaiwgdW5zaWduZWQgaW50IHZhbCk7Cit2b2lkIHNuZF9jdGxfZWxlbV9pZF9zZXRfaW50ZXJmYWNlKHNuZF9jdGxfZWxlbV9pZF90ICpvYmosIHNuZF9jdGxfZWxlbV9pZmFjZV90IHZhbCk7Cit2b2lkIHNuZF9jdGxfZWxlbV9pZF9zZXRfZGV2aWNlKHNuZF9jdGxfZWxlbV9pZF90ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOwordm9pZCBzbmRfY3RsX2VsZW1faWRfc2V0X3N1YmRldmljZShzbmRfY3RsX2VsZW1faWRfdCAqb2JqLCB1bnNpZ25lZCBpbnQgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2lkX3NldF9uYW1lKHNuZF9jdGxfZWxlbV9pZF90ICpvYmosIGNvbnN0IGNoYXIgKnZhbCk7Cit2b2lkIHNuZF9jdGxfZWxlbV9pZF9zZXRfaW5kZXgoc25kX2N0bF9lbGVtX2lkX3QgKm9iaiwgdW5zaWduZWQgaW50IHZhbCk7CisKK3NpemVfdCBzbmRfY3RsX2NhcmRfaW5mb19zaXplb2Yodm9pZCk7CisvKiogXGhpZGVpbml0aWFsaXplcgorICogXGJyaWVmIGFsbG9jYXRlIGFuIGludmFsaWQgI3NuZF9jdGxfY2FyZF9pbmZvX3QgdXNpbmcgc3RhbmRhcmQgYWxsb2NhCisgKiBccGFyYW0gcHRyIHJldHVybmVkIHBvaW50ZXIKKyAqLworI2RlZmluZSBzbmRfY3RsX2NhcmRfaW5mb19hbGxvY2EocHRyKSBfX3NuZF9hbGxvY2EocHRyLCBzbmRfY3RsX2NhcmRfaW5mbykKK2ludCBzbmRfY3RsX2NhcmRfaW5mb19tYWxsb2Moc25kX2N0bF9jYXJkX2luZm9fdCAqKnB0cik7Cit2b2lkIHNuZF9jdGxfY2FyZF9pbmZvX2ZyZWUoc25kX2N0bF9jYXJkX2luZm9fdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9jYXJkX2luZm9fY2xlYXIoc25kX2N0bF9jYXJkX2luZm9fdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9jYXJkX2luZm9fY29weShzbmRfY3RsX2NhcmRfaW5mb190ICpkc3QsIGNvbnN0IHNuZF9jdGxfY2FyZF9pbmZvX3QgKnNyYyk7CitpbnQgc25kX2N0bF9jYXJkX2luZm9fZ2V0X2NhcmQoY29uc3Qgc25kX2N0bF9jYXJkX2luZm9fdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9jdGxfY2FyZF9pbmZvX2dldF9pZChjb25zdCBzbmRfY3RsX2NhcmRfaW5mb190ICpvYmopOworY29uc3QgY2hhciAqc25kX2N0bF9jYXJkX2luZm9fZ2V0X2RyaXZlcihjb25zdCBzbmRfY3RsX2NhcmRfaW5mb190ICpvYmopOworY29uc3QgY2hhciAqc25kX2N0bF9jYXJkX2luZm9fZ2V0X25hbWUoY29uc3Qgc25kX2N0bF9jYXJkX2luZm9fdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9jdGxfY2FyZF9pbmZvX2dldF9sb25nbmFtZShjb25zdCBzbmRfY3RsX2NhcmRfaW5mb190ICpvYmopOworY29uc3QgY2hhciAqc25kX2N0bF9jYXJkX2luZm9fZ2V0X21peGVybmFtZShjb25zdCBzbmRfY3RsX2NhcmRfaW5mb190ICpvYmopOworY29uc3QgY2hhciAqc25kX2N0bF9jYXJkX2luZm9fZ2V0X2NvbXBvbmVudHMoY29uc3Qgc25kX2N0bF9jYXJkX2luZm9fdCAqb2JqKTsKKworc2l6ZV90IHNuZF9jdGxfZXZlbnRfc2l6ZW9mKHZvaWQpOworLyoqIFxoaWRlaW5pdGlhbGl6ZXIKKyAqIFxicmllZiBhbGxvY2F0ZSBhbiBpbnZhbGlkICNzbmRfY3RsX2V2ZW50X3QgdXNpbmcgc3RhbmRhcmQgYWxsb2NhCisgKiBccGFyYW0gcHRyIHJldHVybmVkIHBvaW50ZXIKKyAqLworI2RlZmluZSBzbmRfY3RsX2V2ZW50X2FsbG9jYShwdHIpIF9fc25kX2FsbG9jYShwdHIsIHNuZF9jdGxfZXZlbnQpCitpbnQgc25kX2N0bF9ldmVudF9tYWxsb2Moc25kX2N0bF9ldmVudF90ICoqcHRyKTsKK3ZvaWQgc25kX2N0bF9ldmVudF9mcmVlKHNuZF9jdGxfZXZlbnRfdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9ldmVudF9jbGVhcihzbmRfY3RsX2V2ZW50X3QgKm9iaik7Cit2b2lkIHNuZF9jdGxfZXZlbnRfY29weShzbmRfY3RsX2V2ZW50X3QgKmRzdCwgY29uc3Qgc25kX2N0bF9ldmVudF90ICpzcmMpOworc25kX2N0bF9ldmVudF90eXBlX3Qgc25kX2N0bF9ldmVudF9nZXRfdHlwZShjb25zdCBzbmRfY3RsX2V2ZW50X3QgKm9iaik7CisKK3NpemVfdCBzbmRfY3RsX2VsZW1fbGlzdF9zaXplb2Yodm9pZCk7CisvKiogXGhpZGVpbml0aWFsaXplcgorICogXGJyaWVmIGFsbG9jYXRlIGFuIGludmFsaWQgI3NuZF9jdGxfZWxlbV9saXN0X3QgdXNpbmcgc3RhbmRhcmQgYWxsb2NhCisgKiBccGFyYW0gcHRyIHJldHVybmVkIHBvaW50ZXIKKyAqLworI2RlZmluZSBzbmRfY3RsX2VsZW1fbGlzdF9hbGxvY2EocHRyKSBfX3NuZF9hbGxvY2EocHRyLCBzbmRfY3RsX2VsZW1fbGlzdCkKK2ludCBzbmRfY3RsX2VsZW1fbGlzdF9tYWxsb2Moc25kX2N0bF9lbGVtX2xpc3RfdCAqKnB0cik7Cit2b2lkIHNuZF9jdGxfZWxlbV9saXN0X2ZyZWUoc25kX2N0bF9lbGVtX2xpc3RfdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2xpc3RfY2xlYXIoc25kX2N0bF9lbGVtX2xpc3RfdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2xpc3RfY29weShzbmRfY3RsX2VsZW1fbGlzdF90ICpkc3QsIGNvbnN0IHNuZF9jdGxfZWxlbV9saXN0X3QgKnNyYyk7Cit2b2lkIHNuZF9jdGxfZWxlbV9saXN0X3NldF9vZmZzZXQoc25kX2N0bF9lbGVtX2xpc3RfdCAqb2JqLCB1bnNpZ25lZCBpbnQgdmFsKTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1fbGlzdF9nZXRfdXNlZChjb25zdCBzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9jdGxfZWxlbV9saXN0X2dldF9jb3VudChjb25zdCBzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmopOwordm9pZCBzbmRfY3RsX2VsZW1fbGlzdF9nZXRfaWQoY29uc3Qgc25kX2N0bF9lbGVtX2xpc3RfdCAqb2JqLCB1bnNpZ25lZCBpbnQgaWR4LCBzbmRfY3RsX2VsZW1faWRfdCAqcHRyKTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1fbGlzdF9nZXRfbnVtaWQoY29uc3Qgc25kX2N0bF9lbGVtX2xpc3RfdCAqb2JqLCB1bnNpZ25lZCBpbnQgaWR4KTsKK3NuZF9jdGxfZWxlbV9pZmFjZV90IHNuZF9jdGxfZWxlbV9saXN0X2dldF9pbnRlcmZhY2UoY29uc3Qgc25kX2N0bF9lbGVtX2xpc3RfdCAqb2JqLCB1bnNpZ25lZCBpbnQgaWR4KTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1fbGlzdF9nZXRfZGV2aWNlKGNvbnN0IHNuZF9jdGxfZWxlbV9saXN0X3QgKm9iaiwgdW5zaWduZWQgaW50IGlkeCk7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX2xpc3RfZ2V0X3N1YmRldmljZShjb25zdCBzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmosIHVuc2lnbmVkIGludCBpZHgpOworY29uc3QgY2hhciAqc25kX2N0bF9lbGVtX2xpc3RfZ2V0X25hbWUoY29uc3Qgc25kX2N0bF9lbGVtX2xpc3RfdCAqb2JqLCB1bnNpZ25lZCBpbnQgaWR4KTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1fbGlzdF9nZXRfaW5kZXgoY29uc3Qgc25kX2N0bF9lbGVtX2xpc3RfdCAqb2JqLCB1bnNpZ25lZCBpbnQgaWR4KTsKKworc2l6ZV90IHNuZF9jdGxfZWxlbV9pbmZvX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gaW52YWxpZCAjc25kX2N0bF9lbGVtX2luZm9fdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9jdGxfZWxlbV9pbmZvX2FsbG9jYShwdHIpIF9fc25kX2FsbG9jYShwdHIsIHNuZF9jdGxfZWxlbV9pbmZvKQoraW50IHNuZF9jdGxfZWxlbV9pbmZvX21hbGxvYyhzbmRfY3RsX2VsZW1faW5mb190ICoqcHRyKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2luZm9fZnJlZShzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOwordm9pZCBzbmRfY3RsX2VsZW1faW5mb19jbGVhcihzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOwordm9pZCBzbmRfY3RsX2VsZW1faW5mb19jb3B5KHNuZF9jdGxfZWxlbV9pbmZvX3QgKmRzdCwgY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqc3JjKTsKK3NuZF9jdGxfZWxlbV90eXBlX3Qgc25kX2N0bF9lbGVtX2luZm9fZ2V0X3R5cGUoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK2ludCBzbmRfY3RsX2VsZW1faW5mb19pc19yZWFkYWJsZShjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworaW50IHNuZF9jdGxfZWxlbV9pbmZvX2lzX3dyaXRhYmxlKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7CitpbnQgc25kX2N0bF9lbGVtX2luZm9faXNfdm9sYXRpbGUoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK2ludCBzbmRfY3RsX2VsZW1faW5mb19pc19pbmFjdGl2ZShjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworaW50IHNuZF9jdGxfZWxlbV9pbmZvX2lzX2xvY2tlZChjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworaW50IHNuZF9jdGxfZWxlbV9pbmZvX2lzX3Rsdl9yZWFkYWJsZShjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworaW50IHNuZF9jdGxfZWxlbV9pbmZvX2lzX3Rsdl93cml0YWJsZShjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworaW50IHNuZF9jdGxfZWxlbV9pbmZvX2lzX3Rsdl9jb21tYW5kYWJsZShjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworaW50IHNuZF9jdGxfZWxlbV9pbmZvX2lzX293bmVyKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7CitpbnQgc25kX2N0bF9lbGVtX2luZm9faXNfdXNlcihjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworcGlkX3Qgc25kX2N0bF9lbGVtX2luZm9fZ2V0X293bmVyKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX2luZm9fZ2V0X2NvdW50KGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7Citsb25nIHNuZF9jdGxfZWxlbV9pbmZvX2dldF9taW4oY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK2xvbmcgc25kX2N0bF9lbGVtX2luZm9fZ2V0X21heChjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworbG9uZyBzbmRfY3RsX2VsZW1faW5mb19nZXRfc3RlcChjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworbG9uZyBsb25nIHNuZF9jdGxfZWxlbV9pbmZvX2dldF9taW42NChjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworbG9uZyBsb25nIHNuZF9jdGxfZWxlbV9pbmZvX2dldF9tYXg2NChjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworbG9uZyBsb25nIHNuZF9jdGxfZWxlbV9pbmZvX2dldF9zdGVwNjQoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1faW5mb19nZXRfaXRlbXMoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2luZm9fc2V0X2l0ZW0oc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqLCB1bnNpZ25lZCBpbnQgdmFsKTsKK2NvbnN0IGNoYXIgKnNuZF9jdGxfZWxlbV9pbmZvX2dldF9pdGVtX25hbWUoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK2ludCBzbmRfY3RsX2VsZW1faW5mb19nZXRfZGltZW5zaW9ucyhjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworaW50IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9kaW1lbnNpb24oY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqLCB1bnNpZ25lZCBpbnQgaWR4KTsKK3ZvaWQgc25kX2N0bF9lbGVtX2luZm9fZ2V0X2lkKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaiwgc25kX2N0bF9lbGVtX2lkX3QgKnB0cik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX2luZm9fZ2V0X251bWlkKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7CitzbmRfY3RsX2VsZW1faWZhY2VfdCBzbmRfY3RsX2VsZW1faW5mb19nZXRfaW50ZXJmYWNlKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX2luZm9fZ2V0X2RldmljZShjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9zdWJkZXZpY2UoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9jdGxfZWxlbV9pbmZvX2dldF9uYW1lKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX2luZm9fZ2V0X2luZGV4KGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7Cit2b2lkIHNuZF9jdGxfZWxlbV9pbmZvX3NldF9pZChzbmRfY3RsX2VsZW1faW5mb190ICpvYmosIGNvbnN0IHNuZF9jdGxfZWxlbV9pZF90ICpwdHIpOwordm9pZCBzbmRfY3RsX2VsZW1faW5mb19zZXRfbnVtaWQoc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqLCB1bnNpZ25lZCBpbnQgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2luZm9fc2V0X2ludGVyZmFjZShzbmRfY3RsX2VsZW1faW5mb190ICpvYmosIHNuZF9jdGxfZWxlbV9pZmFjZV90IHZhbCk7Cit2b2lkIHNuZF9jdGxfZWxlbV9pbmZvX3NldF9kZXZpY2Uoc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqLCB1bnNpZ25lZCBpbnQgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2luZm9fc2V0X3N1YmRldmljZShzbmRfY3RsX2VsZW1faW5mb190ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOwordm9pZCBzbmRfY3RsX2VsZW1faW5mb19zZXRfbmFtZShzbmRfY3RsX2VsZW1faW5mb190ICpvYmosIGNvbnN0IGNoYXIgKnZhbCk7Cit2b2lkIHNuZF9jdGxfZWxlbV9pbmZvX3NldF9pbmRleChzbmRfY3RsX2VsZW1faW5mb190ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOworCitpbnQgc25kX2N0bF9lbGVtX2FkZF9pbnRlZ2VyKHNuZF9jdGxfdCAqY3RsLCBjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqaWQsIHVuc2lnbmVkIGludCBjb3VudCwgbG9uZyBpbWluLCBsb25nIGltYXgsIGxvbmcgaXN0ZXApOworaW50IHNuZF9jdGxfZWxlbV9hZGRfaW50ZWdlcjY0KHNuZF9jdGxfdCAqY3RsLCBjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqaWQsIHVuc2lnbmVkIGludCBjb3VudCwgbG9uZyBsb25nIGltaW4sIGxvbmcgbG9uZyBpbWF4LCBsb25nIGxvbmcgaXN0ZXApOworaW50IHNuZF9jdGxfZWxlbV9hZGRfYm9vbGVhbihzbmRfY3RsX3QgKmN0bCwgY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKmlkLCB1bnNpZ25lZCBpbnQgY291bnQpOworaW50IHNuZF9jdGxfZWxlbV9hZGRfZW51bWVyYXRlZChzbmRfY3RsX3QgKmN0bCwgY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKmlkLCB1bnNpZ25lZCBpbnQgY291bnQsIHVuc2lnbmVkIGludCBpdGVtcywgY29uc3QgY2hhciAqY29uc3QgbmFtZXNbXSk7CitpbnQgc25kX2N0bF9lbGVtX2FkZF9pZWM5NTgoc25kX2N0bF90ICpjdGwsIGNvbnN0IHNuZF9jdGxfZWxlbV9pZF90ICppZCk7CitpbnQgc25kX2N0bF9lbGVtX3JlbW92ZShzbmRfY3RsX3QgKmN0bCwgc25kX2N0bF9lbGVtX2lkX3QgKmlkKTsKKworc2l6ZV90IHNuZF9jdGxfZWxlbV92YWx1ZV9zaXplb2Yodm9pZCk7CisvKiogXGhpZGVpbml0aWFsaXplcgorICogXGJyaWVmIGFsbG9jYXRlIGFuIGludmFsaWQgI3NuZF9jdGxfZWxlbV92YWx1ZV90IHVzaW5nIHN0YW5kYXJkIGFsbG9jYQorICogXHBhcmFtIHB0ciByZXR1cm5lZCBwb2ludGVyCisgKi8KKyNkZWZpbmUgc25kX2N0bF9lbGVtX3ZhbHVlX2FsbG9jYShwdHIpIF9fc25kX2FsbG9jYShwdHIsIHNuZF9jdGxfZWxlbV92YWx1ZSkKK2ludCBzbmRfY3RsX2VsZW1fdmFsdWVfbWFsbG9jKHNuZF9jdGxfZWxlbV92YWx1ZV90ICoqcHRyKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX2ZyZWUoc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaik7Cit2b2lkIHNuZF9jdGxfZWxlbV92YWx1ZV9jbGVhcihzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX2NvcHkoc25kX2N0bF9lbGVtX3ZhbHVlX3QgKmRzdCwgY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnNyYyk7CitpbnQgc25kX2N0bF9lbGVtX3ZhbHVlX2NvbXBhcmUoc25kX2N0bF9lbGVtX3ZhbHVlX3QgKmxlZnQsIGNvbnN0IHNuZF9jdGxfZWxlbV92YWx1ZV90ICpyaWdodCk7Cit2b2lkIHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfaWQoY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgc25kX2N0bF9lbGVtX2lkX3QgKnB0cik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9udW1pZChjb25zdCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqKTsKK3NuZF9jdGxfZWxlbV9pZmFjZV90IHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfaW50ZXJmYWNlKGNvbnN0IHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfZGV2aWNlKGNvbnN0IHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfc3ViZGV2aWNlKGNvbnN0IHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmopOworY29uc3QgY2hhciAqc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9uYW1lKGNvbnN0IHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfaW5kZXgoY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaik7Cit2b2lkIHNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfaWQoc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKnB0cik7Cit2b2lkIHNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfbnVtaWQoc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgdW5zaWduZWQgaW50IHZhbCk7Cit2b2lkIHNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfaW50ZXJmYWNlKHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmosIHNuZF9jdGxfZWxlbV9pZmFjZV90IHZhbCk7Cit2b2lkIHNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfZGV2aWNlKHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOwordm9pZCBzbmRfY3RsX2VsZW1fdmFsdWVfc2V0X3N1YmRldmljZShzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCB1bnNpZ25lZCBpbnQgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9uYW1lKHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmosIGNvbnN0IGNoYXIgKnZhbCk7Cit2b2lkIHNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfaW5kZXgoc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgdW5zaWduZWQgaW50IHZhbCk7CitpbnQgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9ib29sZWFuKGNvbnN0IHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmosIHVuc2lnbmVkIGludCBpZHgpOworbG9uZyBzbmRfY3RsX2VsZW1fdmFsdWVfZ2V0X2ludGVnZXIoY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgdW5zaWduZWQgaW50IGlkeCk7Citsb25nIGxvbmcgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9pbnRlZ2VyNjQoY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgdW5zaWduZWQgaW50IGlkeCk7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9lbnVtZXJhdGVkKGNvbnN0IHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmosIHVuc2lnbmVkIGludCBpZHgpOwordW5zaWduZWQgY2hhciBzbmRfY3RsX2VsZW1fdmFsdWVfZ2V0X2J5dGUoY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgdW5zaWduZWQgaW50IGlkeCk7Cit2b2lkIHNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfYm9vbGVhbihzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCB1bnNpZ25lZCBpbnQgaWR4LCBsb25nIHZhbCk7Cit2b2lkIHNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfaW50ZWdlcihzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCB1bnNpZ25lZCBpbnQgaWR4LCBsb25nIHZhbCk7Cit2b2lkIHNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfaW50ZWdlcjY0KHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmosIHVuc2lnbmVkIGludCBpZHgsIGxvbmcgbG9uZyB2YWwpOwordm9pZCBzbmRfY3RsX2VsZW1fdmFsdWVfc2V0X2VudW1lcmF0ZWQoc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgdW5zaWduZWQgaW50IGlkeCwgdW5zaWduZWQgaW50IHZhbCk7Cit2b2lkIHNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfYnl0ZShzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCB1bnNpZ25lZCBpbnQgaWR4LCB1bnNpZ25lZCBjaGFyIHZhbCk7Cit2b2lkIHNuZF9jdGxfZWxlbV9zZXRfYnl0ZXMoc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworY29uc3Qgdm9pZCAqIHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfYnl0ZXMoY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaik7Cit2b2lkIHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfaWVjOTU4KGNvbnN0IHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmosIHNuZF9hZXNfaWVjOTU4X3QgKnB0cik7Cit2b2lkIHNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfaWVjOTU4KHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmosIGNvbnN0IHNuZF9hZXNfaWVjOTU4X3QgKnB0cik7CisKK2ludCBzbmRfdGx2X3BhcnNlX2RCX2luZm8odW5zaWduZWQgaW50ICp0bHYsIHVuc2lnbmVkIGludCB0bHZfc2l6ZSwKKwkJCSAgdW5zaWduZWQgaW50ICoqZGJfdGx2cCk7CitpbnQgc25kX3Rsdl9nZXRfZEJfcmFuZ2UodW5zaWduZWQgaW50ICp0bHYsIGxvbmcgcmFuZ2VtaW4sIGxvbmcgcmFuZ2VtYXgsCisJCQkgbG9uZyAqbWluLCBsb25nICptYXgpOworaW50IHNuZF90bHZfY29udmVydF90b19kQih1bnNpZ25lZCBpbnQgKnRsdiwgbG9uZyByYW5nZW1pbiwgbG9uZyByYW5nZW1heCwKKwkJCSAgbG9uZyB2b2x1bWUsIGxvbmcgKmRiX2dhaW4pOworaW50IHNuZF90bHZfY29udmVydF9mcm9tX2RCKHVuc2lnbmVkIGludCAqdGx2LCBsb25nIHJhbmdlbWluLCBsb25nIHJhbmdlbWF4LAorCQkJICAgIGxvbmcgZGJfZ2FpbiwgbG9uZyAqdmFsdWUsIGludCB4ZGlyKTsKK2ludCBzbmRfY3RsX2dldF9kQl9yYW5nZShzbmRfY3RsX3QgKmN0bCwgY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKmlkLAorCQkJIGxvbmcgKm1pbiwgbG9uZyAqbWF4KTsKK2ludCBzbmRfY3RsX2NvbnZlcnRfdG9fZEIoc25kX2N0bF90ICpjdGwsIGNvbnN0IHNuZF9jdGxfZWxlbV9pZF90ICppZCwKKwkJCSAgbG9uZyB2b2x1bWUsIGxvbmcgKmRiX2dhaW4pOworaW50IHNuZF9jdGxfY29udmVydF9mcm9tX2RCKHNuZF9jdGxfdCAqY3RsLCBjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqaWQsCisJCQkgICAgbG9uZyBkYl9nYWluLCBsb25nICp2YWx1ZSwgaW50IHhkaXIpOworCisvKioKKyAqICBcZGVmZ3JvdXAgSENvbnRyb2wgSGlnaCBsZXZlbCBDb250cm9sIEludGVyZmFjZQorICogIFxpbmdyb3VwIENvbnRyb2wKKyAqICBUaGUgaGlnaCBsZXZlbCBjb250cm9sIGludGVyZmFjZS4KKyAqICBTZWUgXHJlZiBoY29udHJvbCBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiAgXHsKKyAqLworCisvKiogSENUTCBlbGVtZW50IGhhbmRsZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9oY3RsX2VsZW0gc25kX2hjdGxfZWxlbV90OworCisvKiogSENUTCBoYW5kbGUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfaGN0bCBzbmRfaGN0bF90OworCisvKioKKyAqIFxicmllZiBDb21wYXJlIGZ1bmN0aW9uIGZvciBzb3J0aW5nIEhDVEwgZWxlbWVudHMKKyAqIFxwYXJhbSBlMSBGaXJzdCBlbGVtZW50CisgKiBccGFyYW0gZTIgU2Vjb25kIGVsZW1lbnQKKyAqIFxyZXR1cm4gLTEgaWYgZTEgPCBlMiwgMCBpZiBlMSA9PSBlMiwgMSBpZiBlMSA+IGUyCisgKi8KK3R5cGVkZWYgaW50ICgqc25kX2hjdGxfY29tcGFyZV90KShjb25zdCBzbmRfaGN0bF9lbGVtX3QgKmUxLAorCQkJCSAgY29uc3Qgc25kX2hjdGxfZWxlbV90ICplMik7CitpbnQgc25kX2hjdGxfY29tcGFyZV9mYXN0KGNvbnN0IHNuZF9oY3RsX2VsZW1fdCAqYzEsCisJCQkgIGNvbnN0IHNuZF9oY3RsX2VsZW1fdCAqYzIpOworLyoqIAorICogXGJyaWVmIEhDVEwgY2FsbGJhY2sgZnVuY3Rpb24KKyAqIFxwYXJhbSBoY3RsIEhDVEwgaGFuZGxlCisgKiBccGFyYW0gbWFzayBldmVudCBtYXNrCisgKiBccGFyYW0gZWxlbSByZWxhdGVkIEhDVEwgZWxlbWVudCAoaWYgYW55KQorICogXHJldHVybiAwIG9uIHN1Y2Nlc3Mgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICovCit0eXBlZGVmIGludCAoKnNuZF9oY3RsX2NhbGxiYWNrX3QpKHNuZF9oY3RsX3QgKmhjdGwsCisJCQkJICAgdW5zaWduZWQgaW50IG1hc2ssCisJCQkJICAgc25kX2hjdGxfZWxlbV90ICplbGVtKTsKKy8qKiAKKyAqIFxicmllZiBIQ1RMIGVsZW1lbnQgY2FsbGJhY2sgZnVuY3Rpb24KKyAqIFxwYXJhbSBlbGVtIEhDVEwgZWxlbWVudAorICogXHBhcmFtIG1hc2sgZXZlbnQgbWFzaworICogXHJldHVybiAwIG9uIHN1Y2Nlc3Mgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICovCit0eXBlZGVmIGludCAoKnNuZF9oY3RsX2VsZW1fY2FsbGJhY2tfdCkoc25kX2hjdGxfZWxlbV90ICplbGVtLAorCQkJCQl1bnNpZ25lZCBpbnQgbWFzayk7CisKK2ludCBzbmRfaGN0bF9vcGVuKHNuZF9oY3RsX3QgKipoY3RsLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSk7CitpbnQgc25kX2hjdGxfb3Blbl9jdGwoc25kX2hjdGxfdCAqKmhjdGxwLCBzbmRfY3RsX3QgKmN0bCk7CitpbnQgc25kX2hjdGxfY2xvc2Uoc25kX2hjdGxfdCAqaGN0bCk7CitpbnQgc25kX2hjdGxfbm9uYmxvY2soc25kX2hjdGxfdCAqaGN0bCwgaW50IG5vbmJsb2NrKTsKK2ludCBzbmRfaGN0bF9wb2xsX2Rlc2NyaXB0b3JzX2NvdW50KHNuZF9oY3RsX3QgKmhjdGwpOworaW50IHNuZF9oY3RsX3BvbGxfZGVzY3JpcHRvcnMoc25kX2hjdGxfdCAqaGN0bCwgc3RydWN0IHBvbGxmZCAqcGZkcywgdW5zaWduZWQgaW50IHNwYWNlKTsKK2ludCBzbmRfaGN0bF9wb2xsX2Rlc2NyaXB0b3JzX3JldmVudHMoc25kX2hjdGxfdCAqY3RsLCBzdHJ1Y3QgcG9sbGZkICpwZmRzLCB1bnNpZ25lZCBpbnQgbmZkcywgdW5zaWduZWQgc2hvcnQgKnJldmVudHMpOwordW5zaWduZWQgaW50IHNuZF9oY3RsX2dldF9jb3VudChzbmRfaGN0bF90ICpoY3RsKTsKK2ludCBzbmRfaGN0bF9zZXRfY29tcGFyZShzbmRfaGN0bF90ICpoY3RsLCBzbmRfaGN0bF9jb21wYXJlX3QgaHNvcnQpOworc25kX2hjdGxfZWxlbV90ICpzbmRfaGN0bF9maXJzdF9lbGVtKHNuZF9oY3RsX3QgKmhjdGwpOworc25kX2hjdGxfZWxlbV90ICpzbmRfaGN0bF9sYXN0X2VsZW0oc25kX2hjdGxfdCAqaGN0bCk7CitzbmRfaGN0bF9lbGVtX3QgKnNuZF9oY3RsX2ZpbmRfZWxlbShzbmRfaGN0bF90ICpoY3RsLCBjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqaWQpOwordm9pZCBzbmRfaGN0bF9zZXRfY2FsbGJhY2soc25kX2hjdGxfdCAqaGN0bCwgc25kX2hjdGxfY2FsbGJhY2tfdCBjYWxsYmFjayk7Cit2b2lkIHNuZF9oY3RsX3NldF9jYWxsYmFja19wcml2YXRlKHNuZF9oY3RsX3QgKmhjdGwsIHZvaWQgKmRhdGEpOwordm9pZCAqc25kX2hjdGxfZ2V0X2NhbGxiYWNrX3ByaXZhdGUoc25kX2hjdGxfdCAqaGN0bCk7CitpbnQgc25kX2hjdGxfbG9hZChzbmRfaGN0bF90ICpoY3RsKTsKK2ludCBzbmRfaGN0bF9mcmVlKHNuZF9oY3RsX3QgKmhjdGwpOworaW50IHNuZF9oY3RsX2hhbmRsZV9ldmVudHMoc25kX2hjdGxfdCAqaGN0bCk7Citjb25zdCBjaGFyICpzbmRfaGN0bF9uYW1lKHNuZF9oY3RsX3QgKmhjdGwpOworaW50IHNuZF9oY3RsX3dhaXQoc25kX2hjdGxfdCAqaGN0bCwgaW50IHRpbWVvdXQpOworc25kX2N0bF90ICpzbmRfaGN0bF9jdGwoc25kX2hjdGxfdCAqaGN0bCk7CisKK3NuZF9oY3RsX2VsZW1fdCAqc25kX2hjdGxfZWxlbV9uZXh0KHNuZF9oY3RsX2VsZW1fdCAqZWxlbSk7CitzbmRfaGN0bF9lbGVtX3QgKnNuZF9oY3RsX2VsZW1fcHJldihzbmRfaGN0bF9lbGVtX3QgKmVsZW0pOworaW50IHNuZF9oY3RsX2VsZW1faW5mbyhzbmRfaGN0bF9lbGVtX3QgKmVsZW0sIHNuZF9jdGxfZWxlbV9pbmZvX3QgKiBpbmZvKTsKK2ludCBzbmRfaGN0bF9lbGVtX3JlYWQoc25kX2hjdGxfZWxlbV90ICplbGVtLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqIHZhbHVlKTsKK2ludCBzbmRfaGN0bF9lbGVtX3dyaXRlKHNuZF9oY3RsX2VsZW1fdCAqZWxlbSwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB2YWx1ZSk7CitpbnQgc25kX2hjdGxfZWxlbV90bHZfcmVhZChzbmRfaGN0bF9lbGVtX3QgKmVsZW0sIHVuc2lnbmVkIGludCAqdGx2LCB1bnNpZ25lZCBpbnQgdGx2X3NpemUpOworaW50IHNuZF9oY3RsX2VsZW1fdGx2X3dyaXRlKHNuZF9oY3RsX2VsZW1fdCAqZWxlbSwgY29uc3QgdW5zaWduZWQgaW50ICp0bHYpOworaW50IHNuZF9oY3RsX2VsZW1fdGx2X2NvbW1hbmQoc25kX2hjdGxfZWxlbV90ICplbGVtLCBjb25zdCB1bnNpZ25lZCBpbnQgKnRsdik7CisKK3NuZF9oY3RsX3QgKnNuZF9oY3RsX2VsZW1fZ2V0X2hjdGwoc25kX2hjdGxfZWxlbV90ICplbGVtKTsKKwordm9pZCBzbmRfaGN0bF9lbGVtX2dldF9pZChjb25zdCBzbmRfaGN0bF9lbGVtX3QgKm9iaiwgc25kX2N0bF9lbGVtX2lkX3QgKnB0cik7Cit1bnNpZ25lZCBpbnQgc25kX2hjdGxfZWxlbV9nZXRfbnVtaWQoY29uc3Qgc25kX2hjdGxfZWxlbV90ICpvYmopOworc25kX2N0bF9lbGVtX2lmYWNlX3Qgc25kX2hjdGxfZWxlbV9nZXRfaW50ZXJmYWNlKGNvbnN0IHNuZF9oY3RsX2VsZW1fdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfaGN0bF9lbGVtX2dldF9kZXZpY2UoY29uc3Qgc25kX2hjdGxfZWxlbV90ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9oY3RsX2VsZW1fZ2V0X3N1YmRldmljZShjb25zdCBzbmRfaGN0bF9lbGVtX3QgKm9iaik7Citjb25zdCBjaGFyICpzbmRfaGN0bF9lbGVtX2dldF9uYW1lKGNvbnN0IHNuZF9oY3RsX2VsZW1fdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfaGN0bF9lbGVtX2dldF9pbmRleChjb25zdCBzbmRfaGN0bF9lbGVtX3QgKm9iaik7Cit2b2lkIHNuZF9oY3RsX2VsZW1fc2V0X2NhbGxiYWNrKHNuZF9oY3RsX2VsZW1fdCAqb2JqLCBzbmRfaGN0bF9lbGVtX2NhbGxiYWNrX3QgdmFsKTsKK3ZvaWQgKiBzbmRfaGN0bF9lbGVtX2dldF9jYWxsYmFja19wcml2YXRlKGNvbnN0IHNuZF9oY3RsX2VsZW1fdCAqb2JqKTsKK3ZvaWQgc25kX2hjdGxfZWxlbV9zZXRfY2FsbGJhY2tfcHJpdmF0ZShzbmRfaGN0bF9lbGVtX3QgKm9iaiwgdm9pZCAqIHZhbCk7CisKKy8qKiBcfSAqLworCisvKiogXH0gKi8KKworLyoqCisgKiAgXGRlZmdyb3VwIFNDb250cm9sIFNldHVwIENvbnRyb2wgSW50ZXJmYWNlCisgKiAgXGluZ3JvdXAgQ29udHJvbAorICogIFRoZSBzZXR1cCBjb250cm9sIGludGVyZmFjZSAtIHNldCBvciBtb2RpZnkgY29udHJvbCBlbGVtZW50cyBmcm9tIGEgY29uZmlndXJhdGlvbiBmaWxlLgorICogIFx7CisgKi8KKworaW50IHNuZF9zY3RsX2J1aWxkKHNuZF9zY3RsX3QgKipjdGwsIHNuZF9jdGxfdCAqaGFuZGxlLCBzbmRfY29uZmlnX3QgKmNvbmZpZywKKwkJICAgc25kX2NvbmZpZ190ICpwcml2YXRlX2RhdGEsIGludCBtb2RlKTsKK2ludCBzbmRfc2N0bF9mcmVlKHNuZF9zY3RsX3QgKmhhbmRsZSk7CitpbnQgc25kX3NjdGxfaW5zdGFsbChzbmRfc2N0bF90ICpoYW5kbGUpOworaW50IHNuZF9zY3RsX3JlbW92ZShzbmRfc2N0bF90ICpoYW5kbGUpOworCisvKiogXH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQUxTQV9DT05UUk9MX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9jb250cm9sX2V4dGVybmFsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvY29udHJvbF9leHRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMDY2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvY29udHJvbF9leHRlcm5hbC5oCkBAIC0wLDAgKzEsMjY1IEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvY29udHJvbF9leHRlcm5hbC5oCisgKiBcYnJpZWYgRXh0ZXJuYWwgY29udHJvbCBwbHVnaW4gU0RLCisgKiBcYXV0aG9yIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqIFxkYXRlIDIwMDUKKyAqCisgKiBFeHRlcm5hbCBjb250cm9sIHBsdWdpbiBTREsuCisgKi8KKworLyoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworI2lmbmRlZiBfX0FMU0FfQ09OVFJPTF9FWFRFUk5BTF9ICisjZGVmaW5lIF9fQUxTQV9DT05UUk9MX0VYVEVSTkFMX0gKKworI2luY2x1ZGUgImNvbnRyb2wuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqICBcZGVmZ3JvdXAgQ3RsUGx1Z2luX1NESyBFeHRlcm5hbCBDb250cm9sIFBsdWdpbiBTREsKKyAqICBceworICovCisKKy8qKgorICogRGVmaW5lIHRoZSBvYmplY3QgZW50cnkgZm9yIGV4dGVybmFsIGNvbnRyb2wgcGx1Z2lucworICovCisjZGVmaW5lIFNORF9DVExfUExVR0lOX0VOVFJZKG5hbWUpIF9zbmRfY3RsXyMjbmFtZSMjX29wZW4KKworLyoqCisgKiBEZWZpbmUgdGhlIHN5bWJvbHMgb2YgdGhlIGdpdmVuIGNvbnRyb2wgcGx1Z2luIHdpdGggdmVyc2lvbnMKKyAqLworI2RlZmluZSBTTkRfQ1RMX1BMVUdJTl9TWU1CT0wobmFtZSkgU05EX0RMU1lNX0JVSUxEX1ZFUlNJT04oU05EX0NUTF9QTFVHSU5fRU5UUlkobmFtZSksIFNORF9DT05UUk9MX0RMU1lNX1ZFUlNJT04pOworCisvKioKKyAqIERlZmluZSB0aGUgY29udHJvbCBwbHVnaW4KKyAqLworI2RlZmluZSBTTkRfQ1RMX1BMVUdJTl9ERUZJTkVfRlVOQyhwbHVnaW4pIFwKK2ludCBTTkRfQ1RMX1BMVUdJTl9FTlRSWShwbHVnaW4pIChzbmRfY3RsX3QgKipoYW5kbGVwLCBjb25zdCBjaGFyICpuYW1lLFwKKwkJCQkgIHNuZF9jb25maWdfdCAqcm9vdCwgc25kX2NvbmZpZ190ICpjb25mLCBpbnQgbW9kZSkKKworLyoqIEV4dGVybmFsIGNvbnRyb2wgcGx1Z2luIGhhbmRsZSAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX2N0bF9leHQgc25kX2N0bF9leHRfdDsKKy8qKiBDYWxsYmFjayB0YWJsZSBvZiBjb250cm9sIGV4dCAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX2N0bF9leHRfY2FsbGJhY2sgc25kX2N0bF9leHRfY2FsbGJhY2tfdDsKKy8qKiBLZXkgdG8gYWNjZXNzIGEgY29udHJvbCBwb2ludGVyICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgc25kX2N0bF9leHRfa2V5X3Q7CisKKy8qCisgKiBQcm90b2NvbCB2ZXJzaW9uCisgKi8KKyNkZWZpbmUgU05EX0NUTF9FWFRfVkVSU0lPTl9NQUpPUgkxCS8qKjwgUHJvdG9jb2wgbWFqb3IgdmVyc2lvbiAqLworI2RlZmluZSBTTkRfQ1RMX0VYVF9WRVJTSU9OX01JTk9SCTAJLyoqPCBQcm90b2NvbCBtaW5vciB2ZXJzaW9uICovCisjZGVmaW5lIFNORF9DVExfRVhUX1ZFUlNJT05fVElOWQkwCS8qKjwgUHJvdG9jb2wgdGlueSB2ZXJzaW9uICovCisvKioKKyAqIGV4dGVybmFsIHBsdWdpbiBwcm90b2NvbCB2ZXJzaW9uCisgKi8KKyNkZWZpbmUgU05EX0NUTF9FWFRfVkVSU0lPTgkJKChTTkRfQ1RMX0VYVF9WRVJTSU9OX01BSk9SPDwxNikgfFwKKwkJCQkJIChTTkRfQ1RMX0VYVF9WRVJTSU9OX01JTk9SPDw4KSB8XAorCQkJCQkgKFNORF9DVExfRVhUX1ZFUlNJT05fVElOWSkpCisKKy8qKiBIYW5kbGUgb2YgY29udHJvbCBleHQgKi8KK3N0cnVjdCBzbmRfY3RsX2V4dCB7CisJLyoqCisJICogcHJvdG9jb2wgdmVyc2lvbjsgI1NORF9DVExfRVhUX1ZFUlNJT04gbXVzdCBiZSBmaWxsZWQgaGVyZQorCSAqIGJlZm9yZSBjYWxsaW5nICNzbmRfY3RsX2V4dF9jcmVhdGUoKQorCSAqLworCXVuc2lnbmVkIGludCB2ZXJzaW9uOworCS8qKgorCSAqIEluZGV4IG9mIHRoaXMgY2FyZDsgbXVzdCBiZSBmaWxsZWQgYmVmb3JlIGNhbGxpbmcgI3NuZF9jdGxfZXh0X2NyZWF0ZSgpCisJICovCisJaW50IGNhcmRfaWR4OworCS8qKgorCSAqIElEIHN0cmluZyBvZiB0aGlzIGNhcmQ7IG11c3QgYmUgZmlsbGVkIGJlZm9yZSBjYWxsaW5nICNzbmRfY3RsX2V4dF9jcmVhdGUoKQorCSAqLworCWNoYXIgaWRbMTZdOworCS8qKgorCSAqIERyaXZlciBuYW1lIG9mIHRoaXMgY2FyZDsgbXVzdCBiZSBmaWxsZWQgYmVmb3JlIGNhbGxpbmcgI3NuZF9jdGxfZXh0X2NyZWF0ZSgpCisJICovCisJY2hhciBkcml2ZXJbMTZdOworCS8qKgorCSAqIHNob3J0IG5hbWUgb2YgdGhpcyBjYXJkOyBtdXN0IGJlIGZpbGxlZCBiZWZvcmUgY2FsbGluZyAjc25kX2N0bF9leHRfY3JlYXRlKCkKKwkgKi8KKwljaGFyIG5hbWVbMzJdOworCS8qKgorCSAqIExvbmcgbmFtZSBvZiB0aGlzIGNhcmQ7IG11c3QgYmUgZmlsbGVkIGJlZm9yZSBjYWxsaW5nICNzbmRfY3RsX2V4dF9jcmVhdGUoKQorCSAqLworCWNoYXIgbG9uZ25hbWVbODBdOworCS8qKgorCSAqIE1peGVyIG5hbWUgb2YgdGhpcyBjYXJkOyBtdXN0IGJlIGZpbGxlZCBiZWZvcmUgY2FsbGluZyAjc25kX2N0bF9leHRfY3JlYXRlKCkKKwkgKi8KKwljaGFyIG1peGVybmFtZVs4MF07CisJLyoqCisJICogcG9sbCBkZXNjcmlwdG9yCisJICovCisJaW50IHBvbGxfZmQ7CisKKwkvKioKKwkgKiBjYWxsYmFja3Mgb2YgdGhpcyBwbHVnaW47IG11c3QgYmUgZmlsbGVkIGJlZm9yZSBjYWxsaW5nICNzbmRfcGNtX2lvcGx1Z19jcmVhdGUoKQorCSAqLworCWNvbnN0IHNuZF9jdGxfZXh0X2NhbGxiYWNrX3QgKmNhbGxiYWNrOworCS8qKgorCSAqIHByaXZhdGUgZGF0YSwgd2hpY2ggY2FuIGJlIHVzZWQgZnJlZWx5IGluIHRoZSBkcml2ZXIgY2FsbGJhY2tzCisJICovCisJdm9pZCAqcHJpdmF0ZV9kYXRhOworCS8qKgorCSAqIGNvbnRyb2wgaGFuZGxlIGZpbGxlZCBieSAjc25kX2N0bF9leHRfY3JlYXRlKCkKKwkgKi8KKwlzbmRfY3RsX3QgKmhhbmRsZTsKKworCWludCBub25ibG9jazsJCQkvKio8IG5vbi1ibG9jayBtb2RlOyByZWFkLW9ubHkgKi8KKwlpbnQgc3Vic2NyaWJlZDsJCQkvKio8IGV2ZW50cyBzdWJzY3JpYmVkOyByZWFkLW9ubHkgKi8KK307CisKKy8qKiBDYWxsYmFjayB0YWJsZSBvZiBleHQgKi8KK3N0cnVjdCBzbmRfY3RsX2V4dF9jYWxsYmFjayB7CisJLyoqCisJICogY2xvc2UgdGhlIGNvbnRyb2wgaGFuZGxlOyBvcHRpb25hbAorCSAqLworCXZvaWQgKCpjbG9zZSkoc25kX2N0bF9leHRfdCAqZXh0KTsKKwkvKioKKwkgKiByZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBlbGVtZW50czsgcmVxdWlyZWQKKwkgKi8KKwlpbnQgKCplbGVtX2NvdW50KShzbmRfY3RsX2V4dF90ICpleHQpOworCS8qKgorCSAqIHJldHVybiB0aGUgZWxlbWVudCBpZCBvZiB0aGUgZ2l2ZW4gb2Zmc2V0IChhcnJheSBpbmRleCk7IHJlcXVpcmVkCisJICovCisJaW50ICgqZWxlbV9saXN0KShzbmRfY3RsX2V4dF90ICpleHQsIHVuc2lnbmVkIGludCBvZmZzZXQsIHNuZF9jdGxfZWxlbV9pZF90ICppZCk7CisJLyoqCisJICogY29udmVydCB0aGUgZWxlbWVudCBpZCB0byBhIHNlYXJjaCBrZXk7IHJlcXVpcmVkCisJICovCisJc25kX2N0bF9leHRfa2V5X3QgKCpmaW5kX2VsZW0pKHNuZF9jdGxfZXh0X3QgKmV4dCwgY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKmlkKTsKKwkvKioKKwkgKiB0aGUgZGVzdHJ1Y3RvciBvZiB0aGUga2V5OyBvcHRpb25hbAorCSAqLworCXZvaWQgKCpmcmVlX2tleSkoc25kX2N0bF9leHRfdCAqZXh0LCBzbmRfY3RsX2V4dF9rZXlfdCBrZXkpOworCS8qKgorCSAqIGdldCB0aGUgYXR0cmlidXRlIG9mIHRoZSBlbGVtZW50OyByZXF1aXJlZAorCSAqLworCWludCAoKmdldF9hdHRyaWJ1dGUpKHNuZF9jdGxfZXh0X3QgKmV4dCwgc25kX2N0bF9leHRfa2V5X3Qga2V5LAorCQkJICAgICBpbnQgKnR5cGUsIHVuc2lnbmVkIGludCAqYWNjLCB1bnNpZ25lZCBpbnQgKmNvdW50KTsKKwkvKioKKwkgKiBnZXQgdGhlIGVsZW1lbnQgaW5mb3JtYXRpb24gb2YgaW50ZWdlciB0eXBlCisJICovCisJaW50ICgqZ2V0X2ludGVnZXJfaW5mbykoc25kX2N0bF9leHRfdCAqZXh0LCBzbmRfY3RsX2V4dF9rZXlfdCBrZXksCisJCQkJbG9uZyAqaW1pbiwgbG9uZyAqaW1heCwgbG9uZyAqaXN0ZXApOworCS8qKgorCSAqIGdldCB0aGUgZWxlbWVudCBpbmZvcm1hdGlvbiBvZiBpbnRlZ2VyNjQgdHlwZQorCSAqLworCWludCAoKmdldF9pbnRlZ2VyNjRfaW5mbykoc25kX2N0bF9leHRfdCAqZXh0LCBzbmRfY3RsX2V4dF9rZXlfdCBrZXksCisJCQkJICBpbnQ2NF90ICppbWluLCBpbnQ2NF90ICppbWF4LCBpbnQ2NF90ICppc3RlcCk7CisJLyoqCisJICogZ2V0IHRoZSBlbGVtZW50IGluZm9ybWF0aW9uIG9mIGVudW1lcmF0ZWQgdHlwZQorCSAqLworCWludCAoKmdldF9lbnVtZXJhdGVkX2luZm8pKHNuZF9jdGxfZXh0X3QgKmV4dCwgc25kX2N0bF9leHRfa2V5X3Qga2V5LCB1bnNpZ25lZCBpbnQgKml0ZW1zKTsKKwkvKioKKwkgKiBnZXQgdGhlIG5hbWUgb2YgdGhlIGVudW1lcmF0ZWQgaXRlbQorCSAqLworCWludCAoKmdldF9lbnVtZXJhdGVkX25hbWUpKHNuZF9jdGxfZXh0X3QgKmV4dCwgc25kX2N0bF9leHRfa2V5X3Qga2V5LCB1bnNpZ25lZCBpbnQgaXRlbSwKKwkJCQkgICBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9tYXhfbGVuKTsKKwkvKioKKwkgKiByZWFkIHRoZSBjdXJyZW50IHZhbHVlcyBvZiBpbnRlZ2VyIHR5cGUKKwkgKi8KKwlpbnQgKCpyZWFkX2ludGVnZXIpKHNuZF9jdGxfZXh0X3QgKmV4dCwgc25kX2N0bF9leHRfa2V5X3Qga2V5LCBsb25nICp2YWx1ZSk7CisJLyoqCisJICogcmVhZCB0aGUgY3VycmVudCB2YWx1ZXMgb2YgaW50ZWdlcjY0IHR5cGUKKwkgKi8KKwlpbnQgKCpyZWFkX2ludGVnZXI2NCkoc25kX2N0bF9leHRfdCAqZXh0LCBzbmRfY3RsX2V4dF9rZXlfdCBrZXksIGludDY0X3QgKnZhbHVlKTsKKwkvKioKKwkgKiByZWFkIHRoZSBjdXJyZW50IHZhbHVlcyBvZiBlbnVtZXJhdGVkIHR5cGUKKwkgKi8KKwlpbnQgKCpyZWFkX2VudW1lcmF0ZWQpKHNuZF9jdGxfZXh0X3QgKmV4dCwgc25kX2N0bF9leHRfa2V5X3Qga2V5LCB1bnNpZ25lZCBpbnQgKml0ZW1zKTsKKwkvKioKKwkgKiByZWFkIHRoZSBjdXJyZW50IHZhbHVlcyBvZiBieXRlcyB0eXBlCisJICovCisJaW50ICgqcmVhZF9ieXRlcykoc25kX2N0bF9leHRfdCAqZXh0LCBzbmRfY3RsX2V4dF9rZXlfdCBrZXksIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkgIHNpemVfdCBtYXhfYnl0ZXMpOworCS8qKgorCSAqIHJlYWQgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIGllYzk1OCB0eXBlCisJICovCisJaW50ICgqcmVhZF9pZWM5NTgpKHNuZF9jdGxfZXh0X3QgKmV4dCwgc25kX2N0bF9leHRfa2V5X3Qga2V5LCBzbmRfYWVzX2llYzk1OF90ICppZWM5NTgpOworCS8qKgorCSAqIHVwZGF0ZSB0aGUgY3VycmVudCB2YWx1ZXMgb2YgaW50ZWdlciB0eXBlIHdpdGggdGhlIGdpdmVuIHZhbHVlcworCSAqLworCWludCAoKndyaXRlX2ludGVnZXIpKHNuZF9jdGxfZXh0X3QgKmV4dCwgc25kX2N0bF9leHRfa2V5X3Qga2V5LCBsb25nICp2YWx1ZSk7CisJLyoqCisJICogdXBkYXRlIHRoZSBjdXJyZW50IHZhbHVlcyBvZiBpbnRlZ2VyNjQgdHlwZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZXMKKwkgKi8KKwlpbnQgKCp3cml0ZV9pbnRlZ2VyNjQpKHNuZF9jdGxfZXh0X3QgKmV4dCwgc25kX2N0bF9leHRfa2V5X3Qga2V5LCBpbnQ2NF90ICp2YWx1ZSk7CisJLyoqCisJICogdXBkYXRlIHRoZSBjdXJyZW50IHZhbHVlcyBvZiBlbnVtZXJhdGVkIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzCisJICovCisJaW50ICgqd3JpdGVfZW51bWVyYXRlZCkoc25kX2N0bF9leHRfdCAqZXh0LCBzbmRfY3RsX2V4dF9rZXlfdCBrZXksIHVuc2lnbmVkIGludCAqaXRlbXMpOworCS8qKgorCSAqIHVwZGF0ZSB0aGUgY3VycmVudCB2YWx1ZXMgb2YgYnl0ZXMgdHlwZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZXMKKwkgKi8KKwlpbnQgKCp3cml0ZV9ieXRlcykoc25kX2N0bF9leHRfdCAqZXh0LCBzbmRfY3RsX2V4dF9rZXlfdCBrZXksIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkgICBzaXplX3QgbWF4X2J5dGVzKTsKKwkvKioKKwkgKiB1cGRhdGUgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIGllYzk1OCB0eXBlIHdpdGggdGhlIGdpdmVuIHZhbHVlcworCSAqLworCWludCAoKndyaXRlX2llYzk1OCkoc25kX2N0bF9leHRfdCAqZXh0LCBzbmRfY3RsX2V4dF9rZXlfdCBrZXksIHNuZF9hZXNfaWVjOTU4X3QgKmllYzk1OCk7CisJLyoqCisJICogc3Vic2NyaWJlL3Vuc3Vic2NyaWJlIHRoZSBldmVudCBub3RpZmljYXRpb247IG9wdGlvbmFsCisJICovCisJdm9pZCAoKnN1YnNjcmliZV9ldmVudHMpKHNuZF9jdGxfZXh0X3QgKmV4dCwgaW50IHN1YnNjcmliZSk7CisJLyoqCisJICogcmVhZCBhIHBlbmRpbmcgbm90aWZpY2F0aW9uIGV2ZW50OyBvcHRpb25hbAorCSAqLworCWludCAoKnJlYWRfZXZlbnQpKHNuZF9jdGxfZXh0X3QgKmV4dCwgc25kX2N0bF9lbGVtX2lkX3QgKmlkLCB1bnNpZ25lZCBpbnQgKmV2ZW50X21hc2spOworCS8qKgorCSAqIHJldHVybiB0aGUgbnVtYmVyIG9mIHBvbGwgZGVzY3JpcHRvcnM7IG9wdGlvbmFsCisJICovCisJaW50ICgqcG9sbF9kZXNjcmlwdG9yc19jb3VudCkoc25kX2N0bF9leHRfdCAqZXh0KTsKKwkvKioKKwkgKiBmaWxsIHRoZSBwb2xsIGRlc2NyaXB0b3JzOyBvcHRpb25hbAorCSAqLworCWludCAoKnBvbGxfZGVzY3JpcHRvcnMpKHNuZF9jdGxfZXh0X3QgKmV4dCwgc3RydWN0IHBvbGxmZCAqcGZkcywgdW5zaWduZWQgaW50IHNwYWNlKTsKKwkvKioKKwkgKiBtYW5nbGUgdGhlIHJldmVudHMgb2YgcG9sbCBkZXNjcmlwdG9ycworCSAqLworCWludCAoKnBvbGxfcmV2ZW50cykoc25kX2N0bF9leHRfdCAqZXh0LCBzdHJ1Y3QgcG9sbGZkICpwZmRzLCB1bnNpZ25lZCBpbnQgbmZkcywgdW5zaWduZWQgc2hvcnQgKnJldmVudHMpOworfTsKKworLyoqCisgKiBUaGUgYWNjZXNzIHR5cGUgYml0cyBzdG9yZWQgaW4gZ2V0X2F0dHJpYnV0ZSBjYWxsYmFjaworICovCit0eXBlZGVmIGVudW0gc25kX2N0bF9leHRfYWNjZXNzIHsKKwlTTkRfQ1RMX0VYVF9BQ0NFU1NfUkVBRCA9ICgxPDwwKSwKKwlTTkRfQ1RMX0VYVF9BQ0NFU1NfV1JJVEUgPSAoMTw8MSksCisJU05EX0NUTF9FWFRfQUNDRVNTX1JFQURXUklURSA9ICgzPDwwKSwKKwlTTkRfQ1RMX0VYVF9BQ0NFU1NfVk9MQVRJTEUgPSAoMTw8MiksCisJU05EX0NUTF9FWFRfQUNDRVNTX0lOQUNUSVZFID0gKDE8PDgpLAorfSBzbmRfY3RsX2V4dF9hY2Nlc3NfdDsKKworLyoqCisgKiBmaW5kX2VsZW0gY2FsbGJhY2sgcmV0dXJucyB0aGlzIGlmIG5vIG1hdGNoaW5nIGNvbnRyb2wgZWxlbWVudCBpcyBmb3VuZAorICovCisjZGVmaW5lIFNORF9DVExfRVhUX0tFWV9OT1RfRk9VTkQJKHNuZF9jdGxfZXh0X2tleV90KSgtMSkKKworaW50IHNuZF9jdGxfZXh0X2NyZWF0ZShzbmRfY3RsX2V4dF90ICpleHQsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2RlKTsKK2ludCBzbmRfY3RsX2V4dF9kZWxldGUoc25kX2N0bF9leHRfdCAqZXh0KTsKKworLyoqIFx9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FMU0FfQ09OVFJPTF9FWFRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvZXJyb3IuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9lcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMjcwODMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvZXJyb3IuaApAQCAtMCwwICsxLDc4IEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvZXJyb3IuaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqCisgKiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKi8KKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfRVJST1JfSAorI2RlZmluZSBfX0FMU0FfRVJST1JfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBFcnJvciBFcnJvciBoYW5kbGluZworICogIEVycm9yIGhhbmRsaW5nIG1hY3JvcyBhbmQgZnVuY3Rpb25zLgorICogIFx7CisgKi8KKworI2RlZmluZSBTTkRfRVJST1JfQkVHSU4JCQkJNTAwMDAwCQkJLyoqPCBMb3dlciBib3VuZGFyeSBvZiBzb3VuZCBlcnJvciBjb2Rlcy4gKi8KKyNkZWZpbmUgU05EX0VSUk9SX0lOQ09NUEFUSUJMRV9WRVJTSU9OCQkoU05EX0VSUk9SX0JFR0lOKzApCS8qKjwgS2VybmVsL2xpYnJhcnkgcHJvdG9jb2xzIGFyZSBub3QgY29tcGF0aWJsZS4gKi8KKyNkZWZpbmUgU05EX0VSUk9SX0FMSVNQX05JTAkJCShTTkRfRVJST1JfQkVHSU4rMSkJLyoqPCBMaXNwIGVuY291bnRlcmVkIGFuIGVycm9yIGR1cmluZyBhY2FsbC4gKi8KKworY29uc3QgY2hhciAqc25kX3N0cmVycm9yKGludCBlcnJudW0pOworCisvKioKKyAqIFxicmllZiBFcnJvciBoYW5kbGVyIGNhbGxiYWNrLgorICogXHBhcmFtIGZpbGUgU291cmNlIGZpbGUgbmFtZS4KKyAqIFxwYXJhbSBsaW5lIExpbmUgbnVtYmVyLgorICogXHBhcmFtIGZ1bmN0aW9uIEZ1bmN0aW9uIG5hbWUuCisgKiBccGFyYW0gZXJyIFZhbHVlIG9mIFxjIGVycm5vLCBvciAwIGlmIG5vdCByZWxldmFudC4KKyAqIFxwYXJhbSBmbXQgXGMgcHJpbnRmKDMpIGZvcm1hdC4KKyAqIFxwYXJhbSAuLi4gXGMgcHJpbnRmKDMpIGFyZ3VtZW50cy4KKyAqCisgKiBBIGZ1bmN0aW9uIG9mIHRoaXMgdHlwZSBpcyBjYWxsZWQgYnkgdGhlIEFMU0EgbGlicmFyeSB3aGVuIGFuIGVycm9yIG9jY3Vycy4KKyAqIFRoaXMgZnVuY3Rpb24gdXN1YWxseSBzaG93cyB0aGUgbWVzc2FnZSBvbiB0aGUgc2NyZWVuLCBhbmQvb3IgbG9ncyBpdC4KKyAqLwordHlwZWRlZiB2b2lkICgqc25kX2xpYl9lcnJvcl9oYW5kbGVyX3QpKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jdGlvbiwgaW50IGVyciwgY29uc3QgY2hhciAqZm10LCAuLi4pIC8qIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgNSwgNikpKSAqLzsKK2V4dGVybiBzbmRfbGliX2Vycm9yX2hhbmRsZXJfdCBzbmRfbGliX2Vycm9yOworZXh0ZXJuIGludCBzbmRfbGliX2Vycm9yX3NldF9oYW5kbGVyKHNuZF9saWJfZXJyb3JfaGFuZGxlcl90IGhhbmRsZXIpOworCisjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID4gOTUpCisjZGVmaW5lIFNOREVSUiguLi4pIHNuZF9saWJfZXJyb3IoX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18sIDAsIF9fVkFfQVJHU19fKSAvKio8IFNob3dzIGEgc291bmQgZXJyb3IgbWVzc2FnZS4gKi8KKyNkZWZpbmUgU1lTRVJSKC4uLikgc25kX2xpYl9lcnJvcihfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXywgZXJybm8sIF9fVkFfQVJHU19fKSAvKio8IFNob3dzIGEgc3lzdGVtIGVycm9yIG1lc3NhZ2UgKHJlbGF0ZWQgdG8gXGMgZXJybm8pLiAqLworI2Vsc2UKKyNkZWZpbmUgU05ERVJSKGFyZ3MuLi4pIHNuZF9saWJfZXJyb3IoX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18sIDAsICMjYXJncykgLyoqPCBTaG93cyBhIHNvdW5kIGVycm9yIG1lc3NhZ2UuICovCisjZGVmaW5lIFNZU0VSUihhcmdzLi4uKSBzbmRfbGliX2Vycm9yKF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fLCBlcnJubywgIyNhcmdzKSAvKio8IFNob3dzIGEgc3lzdGVtIGVycm9yIG1lc3NhZ2UgKHJlbGF0ZWQgdG8gXGMgZXJybm8pLiAqLworI2VuZGlmCisKKy8qKiBcfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19BTFNBX0VSUk9SX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2dsb2JhbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2dsb2JhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMzY4MGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvZ2xvYmFsLmgKQEAgLTAsMCArMSwxNTkgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9nbG9iYWwuaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqCisgKiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKi8KKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfR0xPQkFMX0hfCisjZGVmaW5lIF9fQUxTQV9HTE9CQUxfSF8KKworLyogZm9yIHRpbWV2YWwgYW5kIHRpbWVzcGVjICovCisjaW5jbHVkZSA8dGltZS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBHbG9iYWwgR2xvYmFsIGRlZmluZXMgYW5kIGZ1bmN0aW9ucworICogIEdsb2JhbCBkZWZpbmVzIGFuZCBmdW5jdGlvbnMuCisgKiAgXHBhcgorICogIFRoZSBBTFNBIGxpYnJhcnkgaW1wbGVtZW50YXRpb24gdXNlcyB0aGVzZSBtYWNyb3MgYW5kIGZ1bmN0aW9ucy4KKyAqICBNb3N0IGFwcGxpY2F0aW9ucyBwcm9iYWJseSBkbyBub3QgbmVlZCB0aGVtLgorICogIFx7CisgKi8KKworY29uc3QgY2hhciAqc25kX2Fzb3VuZGxpYl92ZXJzaW9uKHZvaWQpOworCisjaWZuZGVmIEFUVFJJQlVURV9VTlVTRUQKKy8qKiBkbyBub3QgcHJpbnQgd2FybmluZyAoZ2NjKSB3aGVuIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyBub3QgdXNlZCAqLworI2RlZmluZSBBVFRSSUJVVEVfVU5VU0VEIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSkKKyNlbmRpZgorCisjaWZkZWYgUElDIC8qIGR5bmFtaWMgYnVpbGQgKi8KKworLyoqIFxoaWRlaW5pdGlhbGl6ZXIgXGJyaWVmIEhlbHBlciBtYWNybyBmb3IgI1NORF9ETFNZTV9CVUlMRF9WRVJTSU9OLiAqLworI2RlZmluZSBfX1NORF9ETFNZTV9WRVJTSU9OKG5hbWUsIHZlcnNpb24pIF8gIyMgbmFtZSAjIyB2ZXJzaW9uCisvKioKKyAqIFxoaWRlaW5pdGlhbGl6ZXIKKyAqIFxicmllZiBBcHBlbmRzIHRoZSBidWlsZCB2ZXJzaW9uIHRvIHRoZSBuYW1lIG9mIGEgdmVyc2lvbmVkIGR5bmFtaWMgc3ltYm9sLgorICovCisjZGVmaW5lIFNORF9ETFNZTV9CVUlMRF9WRVJTSU9OKG5hbWUsIHZlcnNpb24pIGNoYXIgX19TTkRfRExTWU1fVkVSU0lPTihuYW1lLCB2ZXJzaW9uKTsKKworI2Vsc2UgLyogc3RhdGljIGJ1aWxkICovCisKK3N0cnVjdCBzbmRfZGxzeW1fbGluayB7CisJc3RydWN0IHNuZF9kbHN5bV9saW5rICpuZXh0OworCWNvbnN0IGNoYXIgKmRsc3ltX25hbWU7CisJY29uc3Qgdm9pZCAqZGxzeW1fcHRyOworfTsKKworZXh0ZXJuIHN0cnVjdCBzbmRfZGxzeW1fbGluayAqc25kX2Rsc3ltX3N0YXJ0OworCisvKiogXGhpZGVpbml0aWFsaXplciBcYnJpZWYgSGVscGVyIG1hY3JvIGZvciAjU05EX0RMU1lNX0JVSUxEX1ZFUlNJT04uICovCisjZGVmaW5lIF9fU05EX0RMU1lNX1ZFUlNJT04ocHJlZml4LCBuYW1lLCB2ZXJzaW9uKSBfICMjIHByZWZpeCAjIyBuYW1lICMjIHZlcnNpb24KKy8qKgorICogXGhpZGVpbml0aWFsaXplcgorICogXGJyaWVmIEFwcGVuZHMgdGhlIGJ1aWxkIHZlcnNpb24gdG8gdGhlIG5hbWUgb2YgYSB2ZXJzaW9uZWQgZHluYW1pYyBzeW1ib2wuCisgKi8KKyNkZWZpbmUgU05EX0RMU1lNX0JVSUxEX1ZFUlNJT04obmFtZSwgdmVyc2lvbikgXAorICBzdGF0aWMgc3RydWN0IHNuZF9kbHN5bV9saW5rIF9fU05EX0RMU1lNX1ZFUlNJT04oc25kX2Rsc3ltXywgbmFtZSwgdmVyc2lvbik7IFwKKyAgdm9pZCBfX1NORF9ETFNZTV9WRVJTSU9OKHNuZF9kbHN5bV9jb25zdHJ1Y3Rvcl8sIG5hbWUsIHZlcnNpb24pICh2b2lkKSBfX2F0dHJpYnV0ZV9fICgoY29uc3RydWN0b3IpKTsgXAorICB2b2lkIF9fU05EX0RMU1lNX1ZFUlNJT04oc25kX2Rsc3ltX2NvbnN0cnVjdG9yXywgbmFtZSwgdmVyc2lvbikgKHZvaWQpIHsgXAorICAgIF9fU05EX0RMU1lNX1ZFUlNJT04oc25kX2Rsc3ltXywgbmFtZSwgdmVyc2lvbikubmV4dCA9IHNuZF9kbHN5bV9zdGFydDsgXAorICAgIF9fU05EX0RMU1lNX1ZFUlNJT04oc25kX2Rsc3ltXywgbmFtZSwgdmVyc2lvbikuZGxzeW1fbmFtZSA9ICMgbmFtZTsgXAorICAgIF9fU05EX0RMU1lNX1ZFUlNJT04oc25kX2Rsc3ltXywgbmFtZSwgdmVyc2lvbikuZGxzeW1fcHRyID0gKHZvaWQgKikmbmFtZTsgXAorICAgIHNuZF9kbHN5bV9zdGFydCA9ICZfX1NORF9ETFNZTV9WRVJTSU9OKHNuZF9kbHN5bV8sIG5hbWUsIHZlcnNpb24pOyBcCisgIH0KKworI2VuZGlmCisKKyNpZm5kZWYgX19TVFJJTkcKKy8qKiBcYnJpZWYgUmV0dXJuICd4JyBhcmd1bWVudCBhcyBzdHJpbmcgKi8KKyNkZWZpbmUgX19TVFJJTkcoeCkgICAgICN4CisjZW5kaWYKKworLyoqIFxicmllZiBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIGEgZHluYW1pYyBzeW1ib2wgYXMgYSBzdHJpbmcuICovCisjZGVmaW5lIFNORF9ETFNZTV9WRVJTSU9OKHZlcnNpb24pIF9fU1RSSU5HKHZlcnNpb24pCisKK3ZvaWQgKnNuZF9kbG9wZW4oY29uc3QgY2hhciAqZmlsZSwgaW50IG1vZGUpOwordm9pZCAqc25kX2Rsc3ltKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmVyc2lvbik7CitpbnQgc25kX2RsY2xvc2Uodm9pZCAqaGFuZGxlKTsKKworCisvKiogXGJyaWVmIGFsbG9jYSBoZWxwZXIgbWFjcm8uICovCisjZGVmaW5lIF9fc25kX2FsbG9jYShwdHIsdHlwZSkgZG8geyAqcHRyID0gKHR5cGUjI190ICopIGFsbG9jYSh0eXBlIyNfc2l6ZW9mKCkpOyBtZW1zZXQoKnB0ciwgMCwgdHlwZSMjX3NpemVvZigpKTsgfSB3aGlsZSAoMCkKKworLyoqCisgKiBcYnJpZWYgSW50ZXJuYWwgc3RydWN0dXJlIGZvciBhbiBhc3luYyBub3RpZmljYXRpb24gY2xpZW50IGhhbmRsZXIuCisgKgorICogVGhlIEFMU0EgbGlicmFyeSB1c2VzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSBhcyBhIGhhbmRsZSB0byBhbiBhc3luYworICogbm90aWZpY2F0aW9uIG9iamVjdC4gQXBwbGljYXRpb25zIGRvbid0IGFjY2VzcyBpdHMgY29udGVudHMgZGlyZWN0bHkuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfYXN5bmNfaGFuZGxlciBzbmRfYXN5bmNfaGFuZGxlcl90OworCisvKioKKyAqIFxicmllZiBBc3luYyBub3RpZmljYXRpb24gY2FsbGJhY2suCisgKgorICogU2VlIHRoZSAjc25kX2FzeW5jX2FkZF9oYW5kbGVyIGZ1bmN0aW9uIGZvciBkZXRhaWxzLgorICovCit0eXBlZGVmIHZvaWQgKCpzbmRfYXN5bmNfY2FsbGJhY2tfdCkoc25kX2FzeW5jX2hhbmRsZXJfdCAqaGFuZGxlcik7CisKK2ludCBzbmRfYXN5bmNfYWRkX2hhbmRsZXIoc25kX2FzeW5jX2hhbmRsZXJfdCAqKmhhbmRsZXIsIGludCBmZCwgCisJCQkgIHNuZF9hc3luY19jYWxsYmFja190IGNhbGxiYWNrLCB2b2lkICpwcml2YXRlX2RhdGEpOworaW50IHNuZF9hc3luY19kZWxfaGFuZGxlcihzbmRfYXN5bmNfaGFuZGxlcl90ICpoYW5kbGVyKTsKK2ludCBzbmRfYXN5bmNfaGFuZGxlcl9nZXRfZmQoc25kX2FzeW5jX2hhbmRsZXJfdCAqaGFuZGxlcik7CitpbnQgc25kX2FzeW5jX2hhbmRsZXJfZ2V0X3NpZ25vKHNuZF9hc3luY19oYW5kbGVyX3QgKmhhbmRsZXIpOwordm9pZCAqc25kX2FzeW5jX2hhbmRsZXJfZ2V0X2NhbGxiYWNrX3ByaXZhdGUoc25kX2FzeW5jX2hhbmRsZXJfdCAqaGFuZGxlcik7CisKK3N0cnVjdCBzbmRfc2htX2FyZWEgKnNuZF9zaG1fYXJlYV9jcmVhdGUoaW50IHNobWlkLCB2b2lkICpwdHIpOworc3RydWN0IHNuZF9zaG1fYXJlYSAqc25kX3NobV9hcmVhX3NoYXJlKHN0cnVjdCBzbmRfc2htX2FyZWEgKmFyZWEpOworaW50IHNuZF9zaG1fYXJlYV9kZXN0cm95KHN0cnVjdCBzbmRfc2htX2FyZWEgKmFyZWEpOworCitpbnQgc25kX3VzZXJfZmlsZShjb25zdCBjaGFyICpmaWxlLCBjaGFyICoqcmVzdWx0KTsKKworI2lmICFkZWZpbmVkKF9QT1NJWF9DX1NPVVJDRSkgJiYgIWRlZmluZWQoX1BPU0lYX1NPVVJDRSkKK3N0cnVjdCB0aW1ldmFsIHsKKwl0aW1lX3QJCXR2X3NlYzsJCS8qIHNlY29uZHMgKi8KKwlsb25nCQl0dl91c2VjOwkvKiBtaWNyb3NlY29uZHMgKi8KK307CisKK3N0cnVjdCB0aW1lc3BlYyB7CisJdGltZV90CQl0dl9zZWM7CQkvKiBzZWNvbmRzICovCisJbG9uZwkJdHZfbnNlYzsJLyogbmFub3NlY29uZHMgKi8KK307CisjZW5kaWYKKworLyoqIFRpbWVzdGFtcCAqLwordHlwZWRlZiBzdHJ1Y3QgdGltZXZhbCBzbmRfdGltZXN0YW1wX3Q7CisvKiogSGktcmVzIHRpbWVzdGFtcCAqLwordHlwZWRlZiBzdHJ1Y3QgdGltZXNwZWMgc25kX2h0aW1lc3RhbXBfdDsKKworLyoqIFx9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FMU0FfR0xPQkFMX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9od2RlcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2h3ZGVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIxMjgyMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9od2RlcC5oCkBAIC0wLDAgKzEsMTYwIEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvaHdkZXAuaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqCisgKiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKi8KKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfSFdERVBfSAorI2RlZmluZSBfX0FMU0FfSFdERVBfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBId0RlcCBIYXJkd2FyZSBEZXBlbmRhbnQgSW50ZXJmYWNlCisgKiAgVGhlIEhhcmR3YXJlIERlcGVuZGFudCBJbnRlcmZhY2UuCisgKiAgXHsKKyAqLworCisvKiogZGxzeW0gdmVyc2lvbiBmb3IgaW50ZXJmYWNlIGVudHJ5IGNhbGxiYWNrICovCisjZGVmaW5lIFNORF9IV0RFUF9ETFNZTV9WRVJTSU9OCQlfZGxzeW1faHdkZXBfMDAxCisKKy8qKiBId0RlcCBpbmZvcm1hdGlvbiBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfaHdkZXBfaW5mbyBzbmRfaHdkZXBfaW5mb190OworCisvKiogSHdEZXAgRFNQIHN0YXR1cyBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfaHdkZXBfZHNwX3N0YXR1cyBzbmRfaHdkZXBfZHNwX3N0YXR1c190OworCisvKiogSHdEZXAgRFNQIGltYWdlIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9od2RlcF9kc3BfaW1hZ2Ugc25kX2h3ZGVwX2RzcF9pbWFnZV90OworCisvKiogSHdEZXAgaW50ZXJmYWNlICovCit0eXBlZGVmIGVudW0gX3NuZF9od2RlcF9pZmFjZSB7CisJU05EX0hXREVQX0lGQUNFX09QTDIgPSAwLAkvKio8IE9QTDIgcmF3IGRyaXZlciAqLworCVNORF9IV0RFUF9JRkFDRV9PUEwzLAkJLyoqPCBPUEwzIHJhdyBkcml2ZXIgKi8KKwlTTkRfSFdERVBfSUZBQ0VfT1BMNCwJCS8qKjwgT1BMNCByYXcgZHJpdmVyICovCisJU05EX0hXREVQX0lGQUNFX1NCMTZDU1AsCS8qKjwgU0IxNkNTUCBkcml2ZXIgKi8KKwlTTkRfSFdERVBfSUZBQ0VfRU1VMTBLMSwJLyoqPCBFTVUxMEsxIGRyaXZlciAqLworCVNORF9IV0RFUF9JRkFDRV9ZU1MyMjUsCQkvKio8IFlTUzIyNSBkcml2ZXIgKi8KKwlTTkRfSFdERVBfSUZBQ0VfSUNTMjExNSwJLyoqPCBJQ1MyMTE1IGRyaXZlciAqLworCVNORF9IV0RFUF9JRkFDRV9TU0NBUEUsCQkvKio8IEVuc29uaXEgU291bmRTY2FwZSBJU0EgY2FyZCAoTUM2OEVDMDAwKSAqLworCVNORF9IV0RFUF9JRkFDRV9WWCwJCS8qKjwgRGlnaWdyYW0gVlggY2FyZHMgKi8KKwlTTkRfSFdERVBfSUZBQ0VfTUlYQVJULAkJLyoqPCBEaWdpZ3JhbSBtaVhhcnQgY2FyZHMgKi8KKwlTTkRfSFdERVBfSUZBQ0VfVVNYMlksCQkvKio8IFRhc2NhbSBVUzEyMiwgVVMyMjQgJiBVUzQyOCB1c2IgKi8KKwlTTkRfSFdERVBfSUZBQ0VfRU1VWF9XQVZFVEFCTEUsCS8qKjwgRW11WCB3YXZldGFibGUgKi8KKwlTTkRfSFdERVBfSUZBQ0VfQkxVRVRPT1RILAkvKio8IEJsdWV0b290aCBhdWRpbyAqLworCVNORF9IV0RFUF9JRkFDRV9VU1gyWV9QQ00sCS8qKjwgVGFzY2FtIFVTMTIyLCBVUzIyNCAmIFVTNDI4IHJhdyBVU0IgUENNICovCisJU05EX0hXREVQX0lGQUNFX1BDWEhSLAkJLyoqPCBEaWdpZ3JhbSBQQ1hIUiAqLworCVNORF9IV0RFUF9JRkFDRV9TQl9SQywJCS8qKjwgU0IgRXh0aWd5L0F1ZGlneTJOWCByZW1vdGUgY29udHJvbCAqLworICAgICAgICAgICAgICAgIAorCVNORF9IV0RFUF9JRkFDRV9MQVNUID0gU05EX0hXREVQX0lGQUNFX1NCX1JDICAvKio8IGxhc3Qga25vd24gaHdkZXAgaW50ZXJmYWNlICovCit9IHNuZF9od2RlcF9pZmFjZV90OworCisvKiogb3BlbiBmb3IgcmVhZGluZyAqLworI2RlZmluZSBTTkRfSFdERVBfT1BFTl9SRUFECQkoT19SRE9OTFkpCisvKiogb3BlbiBmb3Igd3JpdGluZyAqLworI2RlZmluZSBTTkRfSFdERVBfT1BFTl9XUklURQkJKE9fV1JPTkxZKQorLyoqIG9wZW4gZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgKi8KKyNkZWZpbmUgU05EX0hXREVQX09QRU5fRFVQTEVYCQkoT19SRFdSKQorLyoqIG9wZW4gbW9kZSBmbGFnOiBvcGVuIGluIG5vbmJsb2NrIG1vZGUgKi8KKyNkZWZpbmUgU05EX0hXREVQX09QRU5fTk9OQkxPQ0sJCShPX05PTkJMT0NLKQorCisvKiogSHdEZXAgaGFuZGxlIHR5cGUgKi8KK3R5cGVkZWYgZW51bSBfc25kX2h3ZGVwX3R5cGUgeworCS8qKiBLZXJuZWwgbGV2ZWwgSHdEZXAgKi8KKwlTTkRfSFdERVBfVFlQRV9IVywKKwkvKiogU2hhcmVkIG1lbW9yeSBjbGllbnQgSHdEZXAgKG5vdCB5ZXQgaW1wbGVtZW50ZWQpICovCisJU05EX0hXREVQX1RZUEVfU0hNLAorCS8qKiBJTkVUIGNsaWVudCBId0RlcCAobm90IHlldCBpbXBsZW1lbnRlZCkgKi8KKwlTTkRfSFdERVBfVFlQRV9JTkVUCit9IHNuZF9od2RlcF90eXBlX3Q7CisKKy8qKiBId0RlcCBoYW5kbGUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfaHdkZXAgc25kX2h3ZGVwX3Q7CisKK2ludCBzbmRfaHdkZXBfb3BlbihzbmRfaHdkZXBfdCAqKmh3ZGVwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSk7CitpbnQgc25kX2h3ZGVwX2Nsb3NlKHNuZF9od2RlcF90ICpod2RlcCk7CitpbnQgc25kX2h3ZGVwX3BvbGxfZGVzY3JpcHRvcnMoc25kX2h3ZGVwX3QgKmh3ZGVwLCBzdHJ1Y3QgcG9sbGZkICpwZmRzLCB1bnNpZ25lZCBpbnQgc3BhY2UpOworaW50IHNuZF9od2RlcF9wb2xsX2Rlc2NyaXB0b3JzX3JldmVudHMoc25kX2h3ZGVwX3QgKmh3ZGVwLCBzdHJ1Y3QgcG9sbGZkICpwZmRzLCB1bnNpZ25lZCBpbnQgbmZkcywgdW5zaWduZWQgc2hvcnQgKnJldmVudHMpOworaW50IHNuZF9od2RlcF9ub25ibG9jayhzbmRfaHdkZXBfdCAqaHdkZXAsIGludCBub25ibG9jayk7CitpbnQgc25kX2h3ZGVwX2luZm8oc25kX2h3ZGVwX3QgKmh3ZGVwLCBzbmRfaHdkZXBfaW5mb190ICogaW5mbyk7CitpbnQgc25kX2h3ZGVwX2RzcF9zdGF0dXMoc25kX2h3ZGVwX3QgKmh3ZGVwLCBzbmRfaHdkZXBfZHNwX3N0YXR1c190ICpzdGF0dXMpOworaW50IHNuZF9od2RlcF9kc3BfbG9hZChzbmRfaHdkZXBfdCAqaHdkZXAsIHNuZF9od2RlcF9kc3BfaW1hZ2VfdCAqYmxvY2spOworaW50IHNuZF9od2RlcF9pb2N0bChzbmRfaHdkZXBfdCAqaHdkZXAsIHVuc2lnbmVkIGludCByZXF1ZXN0LCB2b2lkICogYXJnKTsKK3NzaXplX3Qgc25kX2h3ZGVwX3dyaXRlKHNuZF9od2RlcF90ICpod2RlcCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Citzc2l6ZV90IHNuZF9od2RlcF9yZWFkKHNuZF9od2RlcF90ICpod2RlcCwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisKK3NpemVfdCBzbmRfaHdkZXBfaW5mb19zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgI3NuZF9od2RlcF9pbmZvX3QgY29udGFpbmVyIG9uIHN0YWNrICovCisjZGVmaW5lIHNuZF9od2RlcF9pbmZvX2FsbG9jYShwdHIpIF9fc25kX2FsbG9jYShwdHIsIHNuZF9od2RlcF9pbmZvKQoraW50IHNuZF9od2RlcF9pbmZvX21hbGxvYyhzbmRfaHdkZXBfaW5mb190ICoqcHRyKTsKK3ZvaWQgc25kX2h3ZGVwX2luZm9fZnJlZShzbmRfaHdkZXBfaW5mb190ICpvYmopOwordm9pZCBzbmRfaHdkZXBfaW5mb19jb3B5KHNuZF9od2RlcF9pbmZvX3QgKmRzdCwgY29uc3Qgc25kX2h3ZGVwX2luZm9fdCAqc3JjKTsKKwordW5zaWduZWQgaW50IHNuZF9od2RlcF9pbmZvX2dldF9kZXZpY2UoY29uc3Qgc25kX2h3ZGVwX2luZm9fdCAqb2JqKTsKK2ludCBzbmRfaHdkZXBfaW5mb19nZXRfY2FyZChjb25zdCBzbmRfaHdkZXBfaW5mb190ICpvYmopOworY29uc3QgY2hhciAqc25kX2h3ZGVwX2luZm9fZ2V0X2lkKGNvbnN0IHNuZF9od2RlcF9pbmZvX3QgKm9iaik7Citjb25zdCBjaGFyICpzbmRfaHdkZXBfaW5mb19nZXRfbmFtZShjb25zdCBzbmRfaHdkZXBfaW5mb190ICpvYmopOworc25kX2h3ZGVwX2lmYWNlX3Qgc25kX2h3ZGVwX2luZm9fZ2V0X2lmYWNlKGNvbnN0IHNuZF9od2RlcF9pbmZvX3QgKm9iaik7Cit2b2lkIHNuZF9od2RlcF9pbmZvX3NldF9kZXZpY2Uoc25kX2h3ZGVwX2luZm9fdCAqb2JqLCB1bnNpZ25lZCBpbnQgdmFsKTsKKworc2l6ZV90IHNuZF9od2RlcF9kc3Bfc3RhdHVzX3NpemVvZih2b2lkKTsKKy8qKiBhbGxvY2F0ZSAjc25kX2h3ZGVwX2RzcF9zdGF0dXNfdCBjb250YWluZXIgb24gc3RhY2sgKi8KKyNkZWZpbmUgc25kX2h3ZGVwX2RzcF9zdGF0dXNfYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX2h3ZGVwX2RzcF9zdGF0dXMpCitpbnQgc25kX2h3ZGVwX2RzcF9zdGF0dXNfbWFsbG9jKHNuZF9od2RlcF9kc3Bfc3RhdHVzX3QgKipwdHIpOwordm9pZCBzbmRfaHdkZXBfZHNwX3N0YXR1c19mcmVlKHNuZF9od2RlcF9kc3Bfc3RhdHVzX3QgKm9iaik7Cit2b2lkIHNuZF9od2RlcF9kc3Bfc3RhdHVzX2NvcHkoc25kX2h3ZGVwX2RzcF9zdGF0dXNfdCAqZHN0LCBjb25zdCBzbmRfaHdkZXBfZHNwX3N0YXR1c190ICpzcmMpOworCit1bnNpZ25lZCBpbnQgc25kX2h3ZGVwX2RzcF9zdGF0dXNfZ2V0X3ZlcnNpb24oY29uc3Qgc25kX2h3ZGVwX2RzcF9zdGF0dXNfdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9od2RlcF9kc3Bfc3RhdHVzX2dldF9pZChjb25zdCBzbmRfaHdkZXBfZHNwX3N0YXR1c190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9od2RlcF9kc3Bfc3RhdHVzX2dldF9udW1fZHNwcyhjb25zdCBzbmRfaHdkZXBfZHNwX3N0YXR1c190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9od2RlcF9kc3Bfc3RhdHVzX2dldF9kc3BfbG9hZGVkKGNvbnN0IHNuZF9od2RlcF9kc3Bfc3RhdHVzX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2h3ZGVwX2RzcF9zdGF0dXNfZ2V0X2NoaXBfcmVhZHkoY29uc3Qgc25kX2h3ZGVwX2RzcF9zdGF0dXNfdCAqb2JqKTsKKworc2l6ZV90IHNuZF9od2RlcF9kc3BfaW1hZ2Vfc2l6ZW9mKHZvaWQpOworLyoqIGFsbG9jYXRlICNzbmRfaHdkZXBfZHNwX2ltYWdlX3QgY29udGFpbmVyIG9uIHN0YWNrICovCisjZGVmaW5lIHNuZF9od2RlcF9kc3BfaW1hZ2VfYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX2h3ZGVwX2RzcF9pbWFnZSkKK2ludCBzbmRfaHdkZXBfZHNwX2ltYWdlX21hbGxvYyhzbmRfaHdkZXBfZHNwX2ltYWdlX3QgKipwdHIpOwordm9pZCBzbmRfaHdkZXBfZHNwX2ltYWdlX2ZyZWUoc25kX2h3ZGVwX2RzcF9pbWFnZV90ICpvYmopOwordm9pZCBzbmRfaHdkZXBfZHNwX2ltYWdlX2NvcHkoc25kX2h3ZGVwX2RzcF9pbWFnZV90ICpkc3QsIGNvbnN0IHNuZF9od2RlcF9kc3BfaW1hZ2VfdCAqc3JjKTsKKwordW5zaWduZWQgaW50IHNuZF9od2RlcF9kc3BfaW1hZ2VfZ2V0X2luZGV4KGNvbnN0IHNuZF9od2RlcF9kc3BfaW1hZ2VfdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9od2RlcF9kc3BfaW1hZ2VfZ2V0X25hbWUoY29uc3Qgc25kX2h3ZGVwX2RzcF9pbWFnZV90ICpvYmopOworY29uc3Qgdm9pZCAqc25kX2h3ZGVwX2RzcF9pbWFnZV9nZXRfaW1hZ2UoY29uc3Qgc25kX2h3ZGVwX2RzcF9pbWFnZV90ICpvYmopOworc2l6ZV90IHNuZF9od2RlcF9kc3BfaW1hZ2VfZ2V0X2xlbmd0aChjb25zdCBzbmRfaHdkZXBfZHNwX2ltYWdlX3QgKm9iaik7CisKK3ZvaWQgc25kX2h3ZGVwX2RzcF9pbWFnZV9zZXRfaW5kZXgoc25kX2h3ZGVwX2RzcF9pbWFnZV90ICpvYmosIHVuc2lnbmVkIGludCBfaW5kZXgpOwordm9pZCBzbmRfaHdkZXBfZHNwX2ltYWdlX3NldF9uYW1lKHNuZF9od2RlcF9kc3BfaW1hZ2VfdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgc25kX2h3ZGVwX2RzcF9pbWFnZV9zZXRfaW1hZ2Uoc25kX2h3ZGVwX2RzcF9pbWFnZV90ICpvYmosIHZvaWQgKmJ1ZmZlcik7Cit2b2lkIHNuZF9od2RlcF9kc3BfaW1hZ2Vfc2V0X2xlbmd0aChzbmRfaHdkZXBfZHNwX2ltYWdlX3QgKm9iaiwgc2l6ZV90IGxlbmd0aCk7CisKKy8qKiBcfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19BTFNBX0hXREVQX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2lhdG9taWMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9pYXRvbWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyZGJmZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9pYXRvbWljLmgKQEAgLTAsMCArMSwxMTk4IEBACisjaWZuZGVmIF9fQUxTQV9JQVRPTUlDX0gKKyNkZWZpbmUgX19BTFNBX0lBVE9NSUNfSAorCisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorCisvKgorICogQXRvbWljIG9wZXJhdGlvbnMgdGhhdCBDIGNhbid0IGd1YXJhbnRlZSB1cy4gIFVzZWZ1bCBmb3IKKyAqIHJlc291cmNlIGNvdW50aW5nIGV0Yy4uCisgKi8KKworI2RlZmluZSBBVE9NSUNfU01QX0xPQ0sgImxvY2sgOyAiCisKKy8qCisgKiBNYWtlIHN1cmUgZ2NjIGRvZXNuJ3QgdHJ5IHRvIGJlIGNsZXZlciBhbmQgbW92ZSB0aGluZ3MgYXJvdW5kCisgKiBvbiB1cy4gV2UgbmVlZCB0byB1c2UgX2V4YWN0bHlfIHRoZSBhZGRyZXNzIHRoZSB1c2VyIGdhdmUgdXMsCisgKiBub3Qgc29tZSBhbGlhcyB0aGF0IGNvbnRhaW5zIHRoZSBzYW1lIGluZm9ybWF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OworCisjZGVmaW5lIEFUT01JQ19JTklUKGkpCXsgKGkpIH0KKworLyoqCisgKiBhdG9taWNfcmVhZCAtIHJlYWQgYXRvbWljIHZhcmlhYmxlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiAKKyAqIEF0b21pY2FsbHkgcmVhZHMgdGhlIHZhbHVlIG9mIEB2LiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkCisgKiB1c2VmdWwgcmFuZ2Ugb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICovIAorI2RlZmluZSBhdG9taWNfcmVhZCh2KQkJKCh2KS0+Y291bnRlcikKKworLyoqCisgKiBhdG9taWNfc2V0IC0gc2V0IGF0b21pYyB2YXJpYWJsZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogQGk6IHJlcXVpcmVkIHZhbHVlCisgKiAKKyAqIEF0b21pY2FsbHkgc2V0cyB0aGUgdmFsdWUgb2YgQHYgdG8gQGkuICBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQKKyAqIHVzZWZ1bCByYW5nZSBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKi8gCisjZGVmaW5lIGF0b21pY19zZXQodixpKQkJKCgodiktPmNvdW50ZXIpID0gKGkpKQorCisvKioKKyAqIGF0b21pY19hZGQgLSBhZGQgaW50ZWdlciB0byBhdG9taWMgdmFyaWFibGUKKyAqIEBpOiBpbnRlZ2VyIHZhbHVlIHRvIGFkZAorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogCisgKiBBdG9taWNhbGx5IGFkZHMgQGkgdG8gQHYuICBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQgdXNlZnVsIHJhbmdlCisgKiBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX2FkZChpbnQgaSwgYXRvbWljX3QgKnYpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCUFUT01JQ19TTVBfTE9DSyAiYWRkbCAlMSwlMCIKKwkJOiI9bSIgKHYtPmNvdW50ZXIpCisJCToiaXIiIChpKSwgIm0iICh2LT5jb3VudGVyKSk7Cit9CisKKy8qKgorICogYXRvbWljX3N1YiAtIHN1YnRyYWN0IHRoZSBhdG9taWMgdmFyaWFibGUKKyAqIEBpOiBpbnRlZ2VyIHZhbHVlIHRvIHN1YnRyYWN0CisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiAKKyAqIEF0b21pY2FsbHkgc3VidHJhY3RzIEBpIGZyb20gQHYuICBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQKKyAqIHVzZWZ1bCByYW5nZSBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX3N1YihpbnQgaSwgYXRvbWljX3QgKnYpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCUFUT01JQ19TTVBfTE9DSyAic3VibCAlMSwlMCIKKwkJOiI9bSIgKHYtPmNvdW50ZXIpCisJCToiaXIiIChpKSwgIm0iICh2LT5jb3VudGVyKSk7Cit9CisKKy8qKgorICogYXRvbWljX3N1Yl9hbmRfdGVzdCAtIHN1YnRyYWN0IHZhbHVlIGZyb20gdmFyaWFibGUgYW5kIHRlc3QgcmVzdWx0CisgKiBAaTogaW50ZWdlciB2YWx1ZSB0byBzdWJ0cmFjdAorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogCisgKiBBdG9taWNhbGx5IHN1YnRyYWN0cyBAaSBmcm9tIEB2IGFuZCByZXR1cm5zCisgKiB0cnVlIGlmIHRoZSByZXN1bHQgaXMgemVybywgb3IgZmFsc2UgZm9yIGFsbAorICogb3RoZXIgY2FzZXMuICBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQKKyAqIHVzZWZ1bCByYW5nZSBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCBhdG9taWNfc3ViX2FuZF90ZXN0KGludCBpLCBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJQVRPTUlDX1NNUF9MT0NLICJzdWJsICUyLCUwOyBzZXRlICUxIgorCQk6Ij1tIiAodi0+Y291bnRlciksICI9cW0iIChjKQorCQk6ImlyIiAoaSksICJtIiAodi0+Y291bnRlcikgOiAibWVtb3J5Iik7CisJcmV0dXJuIGM7Cit9CisKKy8qKgorICogYXRvbWljX2luYyAtIGluY3JlbWVudCBhdG9taWMgdmFyaWFibGUKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqIAorICogQXRvbWljYWxseSBpbmNyZW1lbnRzIEB2IGJ5IDEuICBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQKKyAqIHVzZWZ1bCByYW5nZSBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKi8gCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGF0b21pY19pbmMoYXRvbWljX3QgKnYpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCUFUT01JQ19TTVBfTE9DSyAiaW5jbCAlMCIKKwkJOiI9bSIgKHYtPmNvdW50ZXIpCisJCToibSIgKHYtPmNvdW50ZXIpKTsKK30KKworLyoqCisgKiBhdG9taWNfZGVjIC0gZGVjcmVtZW50IGF0b21pYyB2YXJpYWJsZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogCisgKiBBdG9taWNhbGx5IGRlY3JlbWVudHMgQHYgYnkgMS4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZAorICogdXNlZnVsIHJhbmdlIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLyAKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX2RlYyhhdG9taWNfdCAqdikKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJQVRPTUlDX1NNUF9MT0NLICJkZWNsICUwIgorCQk6Ij1tIiAodi0+Y291bnRlcikKKwkJOiJtIiAodi0+Y291bnRlcikpOworfQorCisvKioKKyAqIGF0b21pY19kZWNfYW5kX3Rlc3QgLSBkZWNyZW1lbnQgYW5kIHRlc3QKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqIAorICogQXRvbWljYWxseSBkZWNyZW1lbnRzIEB2IGJ5IDEgYW5kCisgKiByZXR1cm5zIHRydWUgaWYgdGhlIHJlc3VsdCBpcyAwLCBvciBmYWxzZSBmb3IgYWxsIG90aGVyCisgKiBjYXNlcy4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZAorICogdXNlZnVsIHJhbmdlIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLyAKK3N0YXRpYyBfX2lubGluZV9fIGludCBhdG9taWNfZGVjX2FuZF90ZXN0KGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGNoYXIgYzsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQlBVE9NSUNfU01QX0xPQ0sgImRlY2wgJTA7IHNldGUgJTEiCisJCToiPW0iICh2LT5jb3VudGVyKSwgIj1xbSIgKGMpCisJCToibSIgKHYtPmNvdW50ZXIpIDogIm1lbW9yeSIpOworCXJldHVybiBjICE9IDA7Cit9CisKKy8qKgorICogYXRvbWljX2luY19hbmRfdGVzdCAtIGluY3JlbWVudCBhbmQgdGVzdCAKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqIAorICogQXRvbWljYWxseSBpbmNyZW1lbnRzIEB2IGJ5IDEKKyAqIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHJlc3VsdCBpcyB6ZXJvLCBvciBmYWxzZSBmb3IgYWxsCisgKiBvdGhlciBjYXNlcy4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZAorICogdXNlZnVsIHJhbmdlIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLyAKK3N0YXRpYyBfX2lubGluZV9fIGludCBhdG9taWNfaW5jX2FuZF90ZXN0KGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGNoYXIgYzsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQlBVE9NSUNfU01QX0xPQ0sgImluY2wgJTA7IHNldGUgJTEiCisJCToiPW0iICh2LT5jb3VudGVyKSwgIj1xbSIgKGMpCisJCToibSIgKHYtPmNvdW50ZXIpIDogIm1lbW9yeSIpOworCXJldHVybiBjICE9IDA7Cit9CisKKy8qKgorICogYXRvbWljX2FkZF9uZWdhdGl2ZSAtIGFkZCBhbmQgdGVzdCBpZiBuZWdhdGl2ZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogQGk6IGludGVnZXIgdmFsdWUgdG8gYWRkCisgKiAKKyAqIEF0b21pY2FsbHkgYWRkcyBAaSB0byBAdiBhbmQgcmV0dXJucyB0cnVlCisgKiBpZiB0aGUgcmVzdWx0IGlzIG5lZ2F0aXZlLCBvciBmYWxzZSB3aGVuCisgKiByZXN1bHQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm8uICBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQKKyAqIHVzZWZ1bCByYW5nZSBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKi8gCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgYXRvbWljX2FkZF9uZWdhdGl2ZShpbnQgaSwgYXRvbWljX3QgKnYpCit7CisJdW5zaWduZWQgY2hhciBjOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCUFUT01JQ19TTVBfTE9DSyAiYWRkbCAlMiwlMDsgc2V0cyAlMSIKKwkJOiI9bSIgKHYtPmNvdW50ZXIpLCAiPXFtIiAoYykKKwkJOiJpciIgKGkpLCAibSIgKHYtPmNvdW50ZXIpIDogIm1lbW9yeSIpOworCXJldHVybiBjOworfQorCisvKiBUaGVzZSBhcmUgeDg2LXNwZWNpZmljLCB1c2VkIGJ5IHNvbWUgaGVhZGVyIGZpbGVzICovCisjZGVmaW5lIGF0b21pY19jbGVhcl9tYXNrKG1hc2ssIGFkZHIpIFwKK19fYXNtX18gX192b2xhdGlsZV9fKEFUT01JQ19TTVBfTE9DSyAiYW5kbCAlMCwlMSIgXAorOiA6ICJyIiAofihtYXNrKSksIm0iICgqYWRkcikgOiAibWVtb3J5IikKKworI2RlZmluZSBhdG9taWNfc2V0X21hc2sobWFzaywgYWRkcikgXAorX19hc21fXyBfX3ZvbGF0aWxlX18oQVRPTUlDX1NNUF9MT0NLICJvcmwgJTAsJTEiIFwKKzogOiAiciIgKG1hc2spLCJtIiAoKmFkZHIpIDogIm1lbW9yeSIpCisKKy8qCisgKiBGb3JjZSBzdHJpY3QgQ1BVIG9yZGVyaW5nLgorICogQW5kIHllcywgdGhpcyBpcyByZXF1aXJlZCBvbiBVUCB0b28gd2hlbiB3ZSdyZSB0YWxraW5nCisgKiB0byBkZXZpY2VzLgorICoKKyAqIEZvciBub3csICJ3bWIoKSIgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZywgYXMgYWxsCisgKiBJbnRlbCBDUFUncyBmb2xsb3cgd2hhdCBJbnRlbCBjYWxscyBhICpQcm9jZXNzb3IgT3JkZXIqLAorICogaW4gd2hpY2ggYWxsIHdyaXRlcyBhcmUgc2VlbiBpbiB0aGUgcHJvZ3JhbSBvcmRlciBldmVuCisgKiBvdXRzaWRlIHRoZSBDUFUuCisgKgorICogSSBleHBlY3QgZnV0dXJlIEludGVsIENQVSdzIHRvIGhhdmUgYSB3ZWFrZXIgb3JkZXJpbmcsCisgKiBidXQgSSdkIGFsc28gZXhwZWN0IHRoZW0gdG8gZmluYWxseSBnZXQgdGhlaXIgYWN0IHRvZ2V0aGVyCisgKiBhbmQgYWRkIHNvbWUgcmVhbCBtZW1vcnkgYmFycmllcnMgaWYgc28uCisgKi8KKyAKKyNpZmRlZiBfX2kzODZfXworI2RlZmluZSBtYigpIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxvY2s7IGFkZGwgJDAsMCglJWVzcCkiOiA6IDoibWVtb3J5IikKKyNkZWZpbmUgcm1iKCkJbWIoKQorI2RlZmluZSB3bWIoKQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiI6IDogOiJtZW1vcnkiKQorI2Vsc2UKKyNkZWZpbmUgbWIoKSAJYXNtIHZvbGF0aWxlKCJtZmVuY2UiOjo6Im1lbW9yeSIpCisjZGVmaW5lIHJtYigpCWFzbSB2b2xhdGlsZSgibGZlbmNlIjo6OiJtZW1vcnkiKQorI2RlZmluZSB3bWIoKQlhc20gdm9sYXRpbGUoInNmZW5jZSI6OjoibWVtb3J5IikKKyNlbmRpZgorCisjdW5kZWYgQVRPTUlDX1NNUF9MT0NLCisKKyNkZWZpbmUgSUFUT01JQ19ERUZJTkVECQkxCisKKyNlbmRpZiAvKiBfX2kzODZfXyAqLworCisjaWZkZWYgX19pYTY0X18KKworLyoKKyAqIE9uIElBLTY0LCBjb3VudGVyIG11c3QgYWx3YXlzIGJlIHZvbGF0aWxlIHRvIGVuc3VyZSB0aGF0IHRoYXQgdGhlCisgKiBtZW1vcnkgYWNjZXNzZXMgYXJlIG9yZGVyZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7CisKKyNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJCSgoYXRvbWljX3QpIHsgKGkpIH0pCisKKyNkZWZpbmUgYXRvbWljX3JlYWQodikJCSgodiktPmNvdW50ZXIpCisjZGVmaW5lIGF0b21pY19zZXQodixpKQkJKCgodiktPmNvdW50ZXIpID0gKGkpKQorCisvKiBzdHJpcHBlZCB2ZXJzaW9uIC0gd2UgbmVlZCBvbmx5IDRieXRlIHZlcnNpb24gKi8KKyNkZWZpbmUgaWE2NF9jbXB4Y2hnKHNlbSxwdHIsb2xkLG5ldyxzaXplKSBcCisoeyBcCisJX190eXBlb2ZfXyhwdHIpIF9wXyA9IChwdHIpOyBcCisJX190eXBlb2ZfXyhuZXcpIF9uXyA9IChuZXcpOyBcCisJdW5zaWduZWQgbG9uZyBfb18sIF9yXzsgXAorCV9vXyA9ICh1bnNpZ25lZCBpbnQpIChsb25nKSAob2xkKTsgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92IGFyLmNjdj0lMDs7IiA6OiAick8iKF9vXykpOyBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbXB4Y2hnNC4ic2VtIiAlMD1bJTFdLCUyLGFyLmNjdiIgXAorCQkJICAgICAgOiAiPXIiKF9yXykgOiAiciIoX3BfKSwgInIiKF9uXykgOiAibWVtb3J5Iik7IFwKKwkoX190eXBlb2ZfXyhvbGQpKSBfcl87IFwKK30pCisKK3N0YXRpYyBfX2lubGluZV9fIGludAoraWE2NF9hdG9taWNfYWRkIChpbnQgaSwgYXRvbWljX3QgKnYpCit7CisJaW50IG9sZCwgbmV3OworCS8vIENNUFhDSEdfQlVHQ0hFQ0tfREVDTAorCisJZG8geworCQkvLyBDTVBYQ0hHX0JVR0NIRUNLKHYpOworCQlvbGQgPSBhdG9taWNfcmVhZCh2KTsKKwkJbmV3ID0gb2xkICsgaTsKKwl9IHdoaWxlIChpYTY0X2NtcHhjaGcoImFjcSIsIHYsIG9sZCwgb2xkICsgaSwgc2l6ZW9mKGF0b21pY190KSkgIT0gb2xkKTsKKwlyZXR1cm4gbmV3OworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQKK2lhNjRfYXRvbWljX3N1YiAoaW50IGksIGF0b21pY190ICp2KQoreworCWludCBvbGQsIG5ldzsKKwkvLyBDTVBYQ0hHX0JVR0NIRUNLX0RFQ0wKKworCWRvIHsKKwkJLy8gQ01QWENIR19CVUdDSEVDSyh2KTsKKwkJb2xkID0gYXRvbWljX3JlYWQodik7CisJCW5ldyA9IG9sZCAtIGk7CisJfSB3aGlsZSAoaWE2NF9jbXB4Y2hnKCJhY3EiLCB2LCBvbGQsIG5ldywgc2l6ZW9mKGF0b21pY190KSkgIT0gb2xkKTsKKwlyZXR1cm4gbmV3OworfQorCisjZGVmaW5lIElBNjRfRkVUQ0hBREQodG1wLHYsbixzeikJCQkJCQlcCisoewkJCQkJCQkJCQlcCisJc3dpdGNoIChzeikgewkJCQkJCQkJXAorCSAgICAgIGNhc2UgNDoJCQkJCQkJCVwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJmZXRjaGFkZDQucmVsICUwPVslMV0sJTIiCQlcCisJCQkJICAgICAgOiAiPXIiKHRtcCkgOiAiciIodiksICJpIihuKSA6ICJtZW1vcnkiKTsJXAorCQlicmVhazsJCQkJCQkJCVwKKwkJCQkJCQkJCQlcCisJICAgICAgY2FzZSA4OgkJCQkJCQkJXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImZldGNoYWRkOC5yZWwgJTA9WyUxXSwlMiIJCVwKKwkJCQkgICAgICA6ICI9ciIodG1wKSA6ICJyIih2KSwgImkiKG4pIDogIm1lbW9yeSIpOwlcCisJCWJyZWFrOwkJCQkJCQkJXAorCX0JCQkJCQkJCQlcCit9KQorCisjZGVmaW5lIGlhNjRfZmV0Y2hfYW5kX2FkZChpLHYpCQkJCQkJCVwKKyh7CQkJCQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIF90bXA7CQkJCQkJCQlcCisJdm9sYXRpbGUgX190eXBlb2ZfXygqKHYpKSAqX3YgPSAodik7CQkJCQlcCisJc3dpdGNoIChpKSB7CQkJCQkJCQlcCisJICAgICAgY2FzZSAtMTY6CUlBNjRfRkVUQ0hBREQoX3RtcCwgX3YsIC0xNiwgc2l6ZW9mKCoodikpKTsgYnJlYWs7CVwKKwkgICAgICBjYXNlICAtODoJSUE2NF9GRVRDSEFERChfdG1wLCBfdiwgIC04LCBzaXplb2YoKih2KSkpOyBicmVhazsJXAorCSAgICAgIGNhc2UgIC00OglJQTY0X0ZFVENIQUREKF90bXAsIF92LCAgLTQsIHNpemVvZigqKHYpKSk7IGJyZWFrOwlcCisJICAgICAgY2FzZSAgLTE6CUlBNjRfRkVUQ0hBREQoX3RtcCwgX3YsICAtMSwgc2l6ZW9mKCoodikpKTsgYnJlYWs7CVwKKwkgICAgICBjYXNlICAgMToJSUE2NF9GRVRDSEFERChfdG1wLCBfdiwgICAxLCBzaXplb2YoKih2KSkpOyBicmVhazsJXAorCSAgICAgIGNhc2UgICA0OglJQTY0X0ZFVENIQUREKF90bXAsIF92LCAgIDQsIHNpemVvZigqKHYpKSk7IGJyZWFrOwlcCisJICAgICAgY2FzZSAgIDg6CUlBNjRfRkVUQ0hBREQoX3RtcCwgX3YsICAgOCwgc2l6ZW9mKCoodikpKTsgYnJlYWs7CVwKKwkgICAgICBjYXNlICAxNjoJSUE2NF9GRVRDSEFERChfdG1wLCBfdiwgIDE2LCBzaXplb2YoKih2KSkpOyBicmVhazsJXAorCX0JCQkJCQkJCQlcCisJKF9fdHlwZW9mX18oKnYpKSAoX3RtcCArIChpKSk7CS8qIHJldHVybiBuZXcgdmFsdWUgKi8JCQlcCit9KQorCisvKgorICogQXRvbWljYWxseSBhZGQgSSB0byBWIGFuZCByZXR1cm4gVFJVRSBpZiB0aGUgcmVzdWx0aW5nIHZhbHVlIGlzCisgKiBuZWdhdGl2ZS4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50CithdG9taWNfYWRkX25lZ2F0aXZlIChpbnQgaSwgYXRvbWljX3QgKnYpCit7CisJcmV0dXJuIGlhNjRfYXRvbWljX2FkZChpLCB2KSA8IDA7Cit9CisKKyNkZWZpbmUgYXRvbWljX2FkZF9yZXR1cm4oaSx2KQkJCQkJCVwKKwkoKF9fYnVpbHRpbl9jb25zdGFudF9wKGkpICYmCQkJCQlcCisJICAoICAgKGkgPT0gIDEpIHx8IChpID09ICA0KSB8fCAoaSA9PSAgOCkgfHwgKGkgPT0gIDE2KQkJXAorCSAgIHx8IChpID09IC0xKSB8fCAoaSA9PSAtNCkgfHwgKGkgPT0gLTgpIHx8IChpID09IC0xNikpKQlcCisJID8gaWE2NF9mZXRjaF9hbmRfYWRkKGksICYodiktPmNvdW50ZXIpCQkJCVwKKwkgOiBpYTY0X2F0b21pY19hZGQoaSwgdikpCisKKyNkZWZpbmUgYXRvbWljX3N1Yl9yZXR1cm4oaSx2KQkJCQkJCVwKKwkoKF9fYnVpbHRpbl9jb25zdGFudF9wKGkpICYmCQkJCQlcCisJICAoICAgKGkgPT0gIDEpIHx8IChpID09ICA0KSB8fCAoaSA9PSAgOCkgfHwgKGkgPT0gIDE2KQkJXAorCSAgIHx8IChpID09IC0xKSB8fCAoaSA9PSAtNCkgfHwgKGkgPT0gLTgpIHx8IChpID09IC0xNikpKQlcCisJID8gaWE2NF9mZXRjaF9hbmRfYWRkKC0oaSksICYodiktPmNvdW50ZXIpCQkJXAorCSA6IGlhNjRfYXRvbWljX3N1YihpLCB2KSkKKworI2RlZmluZSBhdG9taWNfZGVjX3JldHVybih2KQkJYXRvbWljX3N1Yl9yZXR1cm4oMSwgKHYpKQorI2RlZmluZSBhdG9taWNfaW5jX3JldHVybih2KQkJYXRvbWljX2FkZF9yZXR1cm4oMSwgKHYpKQorCisjZGVmaW5lIGF0b21pY19zdWJfYW5kX3Rlc3QoaSx2KQkoYXRvbWljX3N1Yl9yZXR1cm4oKGkpLCAodikpID09IDApCisjZGVmaW5lIGF0b21pY19kZWNfYW5kX3Rlc3QodikJCShhdG9taWNfc3ViX3JldHVybigxLCAodikpID09IDApCisjZGVmaW5lIGF0b21pY19pbmNfYW5kX3Rlc3QodikJCShhdG9taWNfYWRkX3JldHVybigxLCAodikpICE9IDApCisKKyNkZWZpbmUgYXRvbWljX2FkZChpLHYpCQkJYXRvbWljX2FkZF9yZXR1cm4oKGkpLCAodikpCisjZGVmaW5lIGF0b21pY19zdWIoaSx2KQkJCWF0b21pY19zdWJfcmV0dXJuKChpKSwgKHYpKQorI2RlZmluZSBhdG9taWNfaW5jKHYpCQkJYXRvbWljX2FkZCgxLCAodikpCisjZGVmaW5lIGF0b21pY19kZWModikJCQlhdG9taWNfc3ViKDEsICh2KSkKKworLyoKKyAqIE1hY3JvcyB0byBmb3JjZSBtZW1vcnkgb3JkZXJpbmcuICBJbiB0aGVzZSBkZXNjcmlwdGlvbnMsICJwcmV2aW91cyIKKyAqIGFuZCAic3Vic2VxdWVudCIgcmVmZXIgdG8gcHJvZ3JhbSBvcmRlcjsgInZpc2libGUiIG1lYW5zIHRoYXQgYWxsCisgKiBhcmNoaXRlY3R1cmFsbHkgdmlzaWJsZSBlZmZlY3RzIG9mIGEgbWVtb3J5IGFjY2VzcyBoYXZlIG9jY3VycmVkCisgKiAoYXQgYSBtaW5pbXVtLCB0aGlzIG1lYW5zIHRoZSBtZW1vcnkgaGFzIGJlZW4gcmVhZCBvciB3cml0dGVuKS4KKyAqCisgKiAgIHdtYigpOglHdWFyYW50ZWVzIHRoYXQgYWxsIHByZWNlZGluZyBzdG9yZXMgdG8gbWVtb3J5LQorICoJCWxpa2UgcmVnaW9ucyBhcmUgdmlzaWJsZSBiZWZvcmUgYW55IHN1YnNlcXVlbnQKKyAqCQlzdG9yZXMgYW5kIHRoYXQgYWxsIGZvbGxvd2luZyBzdG9yZXMgd2lsbCBiZQorICoJCXZpc2libGUgb25seSBhZnRlciBhbGwgcHJldmlvdXMgc3RvcmVzLgorICogICBybWIoKToJTGlrZSB3bWIoKSwgYnV0IGZvciByZWFkcy4KKyAqICAgbWIoKToJd21iKCkvcm1iKCkgY29tYm8sIGkuZS4sIGFsbCBwcmV2aW91cyBtZW1vcnkKKyAqCQlhY2Nlc3NlcyBhcmUgdmlzaWJsZSBiZWZvcmUgYWxsIHN1YnNlcXVlbnQKKyAqCQlhY2Nlc3NlcyBhbmQgdmljZSB2ZXJzYS4gIFRoaXMgaXMgYWxzbyBrbm93biBhcworICoJCWEgImZlbmNlLiIKKyAqCisgKiBOb3RlOiAibWIoKSIgYW5kIGl0cyB2YXJpYW50cyBjYW5ub3QgYmUgdXNlZCBhcyBhIGZlbmNlIHRvIG9yZGVyCisgKiBhY2Nlc3NlcyB0byBtZW1vcnkgbWFwcGVkIEkvTyByZWdpc3RlcnMuICBGb3IgdGhhdCwgbWYuYSBuZWVkcyB0bworICogYmUgdXNlZC4gIEhvd2V2ZXIsIHdlIGRvbid0IHdhbnQgdG8gYWx3YXlzIHVzZSBtZi5hIGJlY2F1c2UgKGEpCisgKiBpdCdzIChwcmVzdW1hYmx5KSBtdWNoIHNsb3dlciB0aGFuIG1mIGFuZCAoYikgbWYuYSBpcyBzdXBwb3J0ZWQgZm9yCisgKiBzZXF1ZW50aWFsIG1lbW9yeSBwYWdlcyBvbmx5LgorICovCisjZGVmaW5lIG1iKCkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtZiIgOjo6ICJtZW1vcnkiKQorI2RlZmluZSBybWIoKQltYigpCisjZGVmaW5lIHdtYigpCW1iKCkKKworI2RlZmluZSBJQVRPTUlDX0RFRklORUQJCTEKKworI2VuZGlmIC8qIF9faWE2NF9fICovCisKKyNpZmRlZiBfX2FscGhhX18KKworLyoKKyAqIEF0b21pYyBvcGVyYXRpb25zIHRoYXQgQyBjYW4ndCBndWFyYW50ZWUgdXMuICBVc2VmdWwgZm9yCisgKiByZXNvdXJjZSBjb3VudGluZyBldGMuLi4KKyAqCisgKiBCdXQgdXNlIHRoZXNlIGFzIHNlbGRvbSBhcyBwb3NzaWJsZSBzaW5jZSB0aGV5IGFyZSBtdWNoIHNsb3dlcgorICogdGhhbiByZWd1bGFyIG9wZXJhdGlvbnMuCisgKi8KKworCisvKgorICogQ291bnRlciBpcyB2b2xhdGlsZSB0byBtYWtlIHN1cmUgZ2NjIGRvZXNuJ3QgdHJ5IHRvIGJlIGNsZXZlcgorICogYW5kIG1vdmUgdGhpbmdzIGFyb3VuZCBvbiB1cy4gV2UgbmVlZCB0byB1c2UgX2V4YWN0bHlfIHRoZSBhZGRyZXNzCisgKiB0aGUgdXNlciBnYXZlIHVzLCBub3Qgc29tZSBhbGlhcyB0aGF0IGNvbnRhaW5zIHRoZSBzYW1lIGluZm9ybWF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OworCisjZGVmaW5lIEFUT01JQ19JTklUKGkpCSggKGF0b21pY190KSB7IChpKSB9ICkKKworI2RlZmluZSBhdG9taWNfcmVhZCh2KQkJKCh2KS0+Y291bnRlcikKKyNkZWZpbmUgYXRvbWljX3NldCh2LGkpCQkoKHYpLT5jb3VudGVyID0gKGkpKQorCisvKgorICogVG8gZ2V0IHByb3BlciBicmFuY2ggcHJlZGljdGlvbiBmb3IgdGhlIG1haW4gbGluZSwgd2UgbXVzdCBicmFuY2gKKyAqIGZvcndhcmQgdG8gY29kZSBhdCB0aGUgZW5kIG9mIHRoaXMgb2JqZWN0J3MgLnRleHQgc2VjdGlvbiwgdGhlbgorICogYnJhbmNoIGJhY2sgdG8gcmVzdGFydCB0aGUgb3BlcmF0aW9uLgorICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX2FkZChpbnQgaSwgYXRvbWljX3QgKiB2KQoreworCXVuc2lnbmVkIGxvbmcgdGVtcDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkiMToJbGRsX2wgJTAsJTFcbiIKKwkiCWFkZGwgJTAsJTIsJTBcbiIKKwkiCXN0bF9jICUwLCUxXG4iCisJIgliZXEgJTAsMmZcbiIKKwkiLnN1YnNlY3Rpb24gMlxuIgorCSIyOgliciAxYlxuIgorCSIucHJldmlvdXMiCisJOiI9JnIiICh0ZW1wKSwgIj1tIiAodi0+Y291bnRlcikKKwk6IklyIiAoaSksICJtIiAodi0+Y291bnRlcikpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGF0b21pY19zdWIoaW50IGksIGF0b21pY190ICogdikKK3sKKwl1bnNpZ25lZCBsb25nIHRlbXA7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJIjE6CWxkbF9sICUwLCUxXG4iCisJIglzdWJsICUwLCUyLCUwXG4iCisJIglzdGxfYyAlMCwlMVxuIgorCSIJYmVxICUwLDJmXG4iCisJIi5zdWJzZWN0aW9uIDJcbiIKKwkiMjoJYnIgMWJcbiIKKwkiLnByZXZpb3VzIgorCToiPSZyIiAodGVtcCksICI9bSIgKHYtPmNvdW50ZXIpCisJOiJJciIgKGkpLCAibSIgKHYtPmNvdW50ZXIpKTsKK30KKworLyoKKyAqIFNhbWUgYXMgYWJvdmUsIGJ1dCByZXR1cm4gdGhlIHJlc3VsdCB2YWx1ZQorICovCitzdGF0aWMgX19pbmxpbmVfXyBsb25nIGF0b21pY19hZGRfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqIHYpCit7CisJbG9uZyB0ZW1wLCByZXN1bHQ7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJIjE6CWxkbF9sICUwLCUxXG4iCisJIglhZGRsICUwLCUzLCUyXG4iCisJIglhZGRsICUwLCUzLCUwXG4iCisJIglzdGxfYyAlMCwlMVxuIgorCSIJYmVxICUwLDJmXG4iCisJIgltYlxuIgorCSIuc3Vic2VjdGlvbiAyXG4iCisJIjI6CWJyIDFiXG4iCisJIi5wcmV2aW91cyIKKwk6Ij0mciIgKHRlbXApLCAiPW0iICh2LT5jb3VudGVyKSwgIj0mciIgKHJlc3VsdCkKKwk6IklyIiAoaSksICJtIiAodi0+Y291bnRlcikgOiAibWVtb3J5Iik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIF9faW5saW5lX18gbG9uZyBhdG9taWNfc3ViX3JldHVybihpbnQgaSwgYXRvbWljX3QgKiB2KQoreworCWxvbmcgdGVtcCwgcmVzdWx0OworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCSIxOglsZGxfbCAlMCwlMVxuIgorCSIJc3VibCAlMCwlMywlMlxuIgorCSIJc3VibCAlMCwlMywlMFxuIgorCSIJc3RsX2MgJTAsJTFcbiIKKwkiCWJlcSAlMCwyZlxuIgorCSIJbWJcbiIKKwkiLnN1YnNlY3Rpb24gMlxuIgorCSIyOgliciAxYlxuIgorCSIucHJldmlvdXMiCisJOiI9JnIiICh0ZW1wKSwgIj1tIiAodi0+Y291bnRlciksICI9JnIiIChyZXN1bHQpCisJOiJJciIgKGkpLCAibSIgKHYtPmNvdW50ZXIpIDogIm1lbW9yeSIpOworCXJldHVybiByZXN1bHQ7Cit9CisKKyNkZWZpbmUgYXRvbWljX2RlY19yZXR1cm4odikgYXRvbWljX3N1Yl9yZXR1cm4oMSwodikpCisjZGVmaW5lIGF0b21pY19pbmNfcmV0dXJuKHYpIGF0b21pY19hZGRfcmV0dXJuKDEsKHYpKQorCisjZGVmaW5lIGF0b21pY19zdWJfYW5kX3Rlc3QoaSx2KSAoYXRvbWljX3N1Yl9yZXR1cm4oKGkpLCAodikpID09IDApCisjZGVmaW5lIGF0b21pY19kZWNfYW5kX3Rlc3QodikgKGF0b21pY19zdWJfcmV0dXJuKDEsICh2KSkgPT0gMCkKKworI2RlZmluZSBhdG9taWNfaW5jKHYpIGF0b21pY19hZGQoMSwodikpCisjZGVmaW5lIGF0b21pY19kZWModikgYXRvbWljX3N1YigxLCh2KSkKKworI2RlZmluZSBtYigpIFwKK19fYXNtX18gX192b2xhdGlsZV9fKCJtYiI6IDogOiJtZW1vcnkiKQorCisjZGVmaW5lIHJtYigpIFwKK19fYXNtX18gX192b2xhdGlsZV9fKCJtYiI6IDogOiJtZW1vcnkiKQorCisjZGVmaW5lIHdtYigpIFwKK19fYXNtX18gX192b2xhdGlsZV9fKCJ3bWIiOiA6IDoibWVtb3J5IikKKworI2RlZmluZSBJQVRPTUlDX0RFRklORUQJCTEKKworI2VuZGlmIC8qIF9fYWxwaGFfXyAqLworCisjaWZkZWYgX19wb3dlcnBjX18KKwordHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKKworI2RlZmluZSBBVE9NSUNfSU5JVChpKQl7IChpKSB9CisKKyNkZWZpbmUgYXRvbWljX3JlYWQodikJCSgodiktPmNvdW50ZXIpCisjZGVmaW5lIGF0b21pY19zZXQodixpKQkJKCgodiktPmNvdW50ZXIpID0gKGkpKQorCitleHRlcm4gdm9pZCBhdG9taWNfY2xlYXJfbWFzayh1bnNpZ25lZCBsb25nIG1hc2ssIHVuc2lnbmVkIGxvbmcgKmFkZHIpOworZXh0ZXJuIHZvaWQgYXRvbWljX3NldF9tYXNrKHVuc2lnbmVkIGxvbmcgbWFzaywgdW5zaWduZWQgbG9uZyAqYWRkcik7CisKKyNkZWZpbmUgU01QX0lTWU5DCSJcblx0aXN5bmMiCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX2FkZChpbnQgYSwgYXRvbWljX3QgKnYpCit7CisJaW50IHQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKyIxOglsd2FyeAklMCwwLCUzCQkjIGF0b21pY19hZGRcblwKKwlhZGQJJTAsJTIsJTBcblwKKwlzdHdjeC4JJTAsMCwlM1xuXAorCWJuZS0JMWIiCisJOiAiPSZyIiAodCksICI9bSIgKHYtPmNvdW50ZXIpCisJOiAiciIgKGEpLCAiciIgKCZ2LT5jb3VudGVyKSwgIm0iICh2LT5jb3VudGVyKQorCTogImNjIik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBhdG9taWNfYWRkX3JldHVybihpbnQgYSwgYXRvbWljX3QgKnYpCit7CisJaW50IHQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKyIxOglsd2FyeAklMCwwLCUyCQkjIGF0b21pY19hZGRfcmV0dXJuXG5cCisJYWRkCSUwLCUxLCUwXG5cCisJc3R3Y3guCSUwLDAsJTJcblwKKwlibmUtCTFiIgorCVNNUF9JU1lOQworCTogIj0mciIgKHQpCisJOiAiciIgKGEpLCAiciIgKCZ2LT5jb3VudGVyKQorCTogImNjIiwgIm1lbW9yeSIpOworCisJcmV0dXJuIHQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX3N1YihpbnQgYSwgYXRvbWljX3QgKnYpCit7CisJaW50IHQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKyIxOglsd2FyeAklMCwwLCUzCQkjIGF0b21pY19zdWJcblwKKwlzdWJmCSUwLCUyLCUwXG5cCisJc3R3Y3guCSUwLDAsJTNcblwKKwlibmUtCTFiIgorCTogIj0mciIgKHQpLCAiPW0iICh2LT5jb3VudGVyKQorCTogInIiIChhKSwgInIiICgmdi0+Y291bnRlciksICJtIiAodi0+Y291bnRlcikKKwk6ICJjYyIpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgYXRvbWljX3N1Yl9yZXR1cm4oaW50IGEsIGF0b21pY190ICp2KQoreworCWludCB0OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisiMToJbHdhcngJJTAsMCwlMgkJIyBhdG9taWNfc3ViX3JldHVyblxuXAorCXN1YmYJJTAsJTEsJTBcblwKKwlzdHdjeC4JJTAsMCwlMlxuXAorCWJuZS0JMWIiCisJU01QX0lTWU5DCisJOiAiPSZyIiAodCkKKwk6ICJyIiAoYSksICJyIiAoJnYtPmNvdW50ZXIpCisJOiAiY2MiLCAibWVtb3J5Iik7CisKKwlyZXR1cm4gdDsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfaW5jKGF0b21pY190ICp2KQoreworCWludCB0OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisiMToJbHdhcngJJTAsMCwlMgkJIyBhdG9taWNfaW5jXG5cCisJYWRkaWMJJTAsJTAsMVxuXAorCXN0d2N4LgklMCwwLCUyXG5cCisJYm5lLQkxYiIKKwk6ICI9JnIiICh0KSwgIj1tIiAodi0+Y291bnRlcikKKwk6ICJyIiAoJnYtPmNvdW50ZXIpLCAibSIgKHYtPmNvdW50ZXIpCisJOiAiY2MiKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IGF0b21pY19pbmNfcmV0dXJuKGF0b21pY190ICp2KQoreworCWludCB0OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisiMToJbHdhcngJJTAsMCwlMQkJIyBhdG9taWNfaW5jX3JldHVyblxuXAorCWFkZGljCSUwLCUwLDFcblwKKwlzdHdjeC4JJTAsMCwlMVxuXAorCWJuZS0JMWIiCisJU01QX0lTWU5DCisJOiAiPSZyIiAodCkKKwk6ICJyIiAoJnYtPmNvdW50ZXIpCisJOiAiY2MiLCAibWVtb3J5Iik7CisKKwlyZXR1cm4gdDsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfZGVjKGF0b21pY190ICp2KQoreworCWludCB0OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisiMToJbHdhcngJJTAsMCwlMgkJIyBhdG9taWNfZGVjXG5cCisJYWRkaWMJJTAsJTAsLTFcblwKKwlzdHdjeC4JJTAsMCwlMlxuXAorCWJuZS0JMWIiCisJOiAiPSZyIiAodCksICI9bSIgKHYtPmNvdW50ZXIpCisJOiAiciIgKCZ2LT5jb3VudGVyKSwgIm0iICh2LT5jb3VudGVyKQorCTogImNjIik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBhdG9taWNfZGVjX3JldHVybihhdG9taWNfdCAqdikKK3sKKwlpbnQgdDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorIjE6CWx3YXJ4CSUwLDAsJTEJCSMgYXRvbWljX2RlY19yZXR1cm5cblwKKwlhZGRpYwklMCwlMCwtMVxuXAorCXN0d2N4LgklMCwwLCUxXG5cCisJYm5lLQkxYiIKKwlTTVBfSVNZTkMKKwk6ICI9JnIiICh0KQorCTogInIiICgmdi0+Y291bnRlcikKKwk6ICJjYyIsICJtZW1vcnkiKTsKKworCXJldHVybiB0OworfQorCisjZGVmaW5lIGF0b21pY19zdWJfYW5kX3Rlc3QoYSwgdikJKGF0b21pY19zdWJfcmV0dXJuKChhKSwgKHYpKSA9PSAwKQorI2RlZmluZSBhdG9taWNfZGVjX2FuZF90ZXN0KHYpCQkoYXRvbWljX2RlY19yZXR1cm4oKHYpKSA9PSAwKQorCisvKgorICogQXRvbWljYWxseSB0ZXN0ICp2IGFuZCBkZWNyZW1lbnQgaWYgaXQgaXMgZ3JlYXRlciB0aGFuIDAuCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgb2xkIHZhbHVlIG9mICp2IG1pbnVzIDEuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCBhdG9taWNfZGVjX2lmX3Bvc2l0aXZlKGF0b21pY190ICp2KQoreworCWludCB0OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisiMToJbHdhcngJJTAsMCwlMQkJIyBhdG9taWNfZGVjX2lmX3Bvc2l0aXZlXG5cCisJYWRkaWMuCSUwLCUwLC0xXG5cCisJYmx0LQkyZlxuXAorCXN0d2N4LgklMCwwLCUxXG5cCisJYm5lLQkxYiIKKwlTTVBfSVNZTkMKKwkiXG5cCisyOiIJOiAiPSZyIiAodCkKKwk6ICJyIiAoJnYtPmNvdW50ZXIpCisJOiAiY2MiLCAibWVtb3J5Iik7CisKKwlyZXR1cm4gdDsKK30KKworLyoKKyAqIE1lbW9yeSBiYXJyaWVyLgorICogVGhlIHN5bmMgaW5zdHJ1Y3Rpb24gZ3VhcmFudGVlcyB0aGF0IGFsbCBtZW1vcnkgYWNjZXNzZXMgaW5pdGlhdGVkCisgKiBieSB0aGlzIHByb2Nlc3NvciBoYXZlIGJlZW4gcGVyZm9ybWVkICh3aXRoIHJlc3BlY3QgdG8gYWxsIG90aGVyCisgKiBtZWNoYW5pc21zIHRoYXQgYWNjZXNzIG1lbW9yeSkuICBUaGUgZWllaW8gaW5zdHJ1Y3Rpb24gaXMgYSBiYXJyaWVyCisgKiBwcm92aWRpbmcgYW4gb3JkZXJpbmcgKHNlcGFyYXRlbHkpIGZvciAoYSkgY2FjaGVhYmxlIHN0b3JlcyBhbmQgKGIpCisgKiBsb2FkcyBhbmQgc3RvcmVzIHRvIG5vbi1jYWNoZWFibGUgbWVtb3J5IChlLmcuIEkvTyBkZXZpY2VzKS4KKyAqCisgKiBtYigpIHByZXZlbnRzIGxvYWRzIGFuZCBzdG9yZXMgYmVpbmcgcmVvcmRlcmVkIGFjcm9zcyB0aGlzIHBvaW50LgorICogcm1iKCkgcHJldmVudHMgbG9hZHMgYmVpbmcgcmVvcmRlcmVkIGFjcm9zcyB0aGlzIHBvaW50LgorICogd21iKCkgcHJldmVudHMgc3RvcmVzIGJlaW5nIHJlb3JkZXJlZCBhY3Jvc3MgdGhpcyBwb2ludC4KKyAqCisgKiBXZSBjYW4gdXNlIHRoZSBlaWVpbyBpbnN0cnVjdGlvbiBmb3Igd21iLCBidXQgc2luY2UgaXQgZG9lc24ndAorICogZ2l2ZSBhbnkgb3JkZXJpbmcgZ3VhcmFudGVlcyBhYm91dCBsb2Fkcywgd2UgaGF2ZSB0byB1c2UgdGhlCisgKiBzdHJvbmdlciBidXQgc2xvd2VyIHN5bmMgaW5zdHJ1Y3Rpb24gZm9yIG1iIGFuZCBybWIuCisgKi8KKyNkZWZpbmUgbWIoKSAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIiA6IDogOiAibWVtb3J5IikKKyNkZWZpbmUgcm1iKCkgIF9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIgOiA6IDogIm1lbW9yeSIpCisjZGVmaW5lIHdtYigpICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIiA6IDogOiAibWVtb3J5IikKKworI2RlZmluZSBJQVRPTUlDX0RFRklORUQJCTEKKworI2VuZGlmIC8qIF9fcG93ZXJwY19fICovCisKKyNpZmRlZiBfX21pcHNfXworCit0eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OworCisjZGVmaW5lIEFUT01JQ19JTklUKGkpICAgIHsgKGkpIH0KKworLyoKKyAqIGF0b21pY19yZWFkIC0gcmVhZCBhdG9taWMgdmFyaWFibGUKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqCisgKiBBdG9taWNhbGx5IHJlYWRzIHRoZSB2YWx1ZSBvZiBAdi4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZAorICogdXNlZnVsIHJhbmdlIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLworI2RlZmluZSBhdG9taWNfcmVhZCh2KQkoKHYpLT5jb3VudGVyKQorCisvKgorICogYXRvbWljX3NldCAtIHNldCBhdG9taWMgdmFyaWFibGUKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqIEBpOiByZXF1aXJlZCB2YWx1ZQorICoKKyAqIEF0b21pY2FsbHkgc2V0cyB0aGUgdmFsdWUgb2YgQHYgdG8gQGkuICBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQKKyAqIHVzZWZ1bCByYW5nZSBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKi8KKyNkZWZpbmUgYXRvbWljX3NldCh2LGkpCSgodiktPmNvdW50ZXIgPSAoaSkpCisKKy8qCisgKiBmb3IgTUlQUyBJSSBhbmQgYmV0dGVyIHdlIGNhbiB1c2UgbGwvc2MgaW5zdHJ1Y3Rpb24sIGFuZCBrZXJuZWwgMi40LjMrCisgKiB3aWxsIGVtdWxhdGUgaXQgb24gTUlQUyBJLgorICovCisKKy8qCisgKiBhdG9taWNfYWRkIC0gYWRkIGludGVnZXIgdG8gYXRvbWljIHZhcmlhYmxlCisgKiBAaTogaW50ZWdlciB2YWx1ZSB0byBhZGQKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqCisgKiBBdG9taWNhbGx5IGFkZHMgQGkgdG8gQHYuICBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQgdXNlZnVsIHJhbmdlCisgKiBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKi8KK2V4dGVybiBfX2lubGluZV9fIHZvaWQgYXRvbWljX2FkZChpbnQgaSwgYXRvbWljX3QgKiB2KQoreworCXVuc2lnbmVkIGxvbmcgdGVtcDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiLnNldCBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiLnNldCBtaXBzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiMTogICBsbCAgICAgICUwLCAlMSAgICAgICMgYXRvbWljX2FkZFxuIgorCQkiICAgICBhZGR1ICAgICUwLCAlMiAgICAgICAgICAgICAgICAgIFxuIgorCQkiICAgICBzYyAgICAgICUwLCAlMSAgICAgICAgICAgICAgICAgIFxuIgorCQkiICAgICBiZXF6ICAgICUwLCAxYiAgICAgICAgICAgICAgICAgIFxuIgorCQkiLnNldCBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQk6ICI9JnIiICh0ZW1wKSwgIj1tIiAodi0+Y291bnRlcikKKwkJOiAiSXIiIChpKSwgIm0iICh2LT5jb3VudGVyKSk7Cit9CisKKy8qCisgKiBhdG9taWNfc3ViIC0gc3VidHJhY3QgdGhlIGF0b21pYyB2YXJpYWJsZQorICogQGk6IGludGVnZXIgdmFsdWUgdG8gc3VidHJhY3QKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqCisgKiBBdG9taWNhbGx5IHN1YnRyYWN0cyBAaSBmcm9tIEB2LiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkCisgKiB1c2VmdWwgcmFuZ2Ugb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICovCitleHRlcm4gX19pbmxpbmVfXyB2b2lkIGF0b21pY19zdWIoaW50IGksIGF0b21pY190ICogdikKK3sKKwl1bnNpZ25lZCBsb25nIHRlbXA7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIi5zZXQgbWlwczIgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIjE6ICAgbGwgICAgICAlMCwgJTEgICAgICAjIGF0b21pY19zdWJcbiIKKwkJIiAgICAgc3VidSAgICAlMCwgJTIgICAgICAgICAgICAgICAgICBcbiIKKwkJIiAgICAgc2MgICAgICAlMCwgJTEgICAgICAgICAgICAgICAgICBcbiIKKwkJIiAgICAgYmVxeiAgICAlMCwgMWIgICAgICAgICAgICAgICAgICBcbiIKKwkJIi5zZXQgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJOiAiPSZyIiAodGVtcCksICI9bSIgKHYtPmNvdW50ZXIpCisJCTogIklyIiAoaSksICJtIiAodi0+Y291bnRlcikpOworfQorCisvKgorICogU2FtZSBhcyBhYm92ZSwgYnV0IHJldHVybiB0aGUgcmVzdWx0IHZhbHVlCisgKi8KK2V4dGVybiBfX2lubGluZV9fIGludCBhdG9taWNfYWRkX3JldHVybihpbnQgaSwgYXRvbWljX3QgKiB2KQoreworCXVuc2lnbmVkIGxvbmcgdGVtcCwgcmVzdWx0OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIuc2V0IHB1c2ggICAgICAgICAgICAgICAjIGF0b21pY19hZGRfcmV0dXJuXG4iCisJCSIuc2V0IG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIuc2V0IG1pcHMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIxOiAgIGxsICAgICAgJTEsICUyICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIgICAgIGFkZHUgICAgJTAsICUxLCAlMyAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIgICAgIHNjICAgICAgJTAsICUyICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIgICAgIGJlcXogICAgJTAsIDFiICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIgICAgIGFkZHUgICAgJTAsICUxLCAlMyAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCTogIj0mciIgKHJlc3VsdCksICI9JnIiICh0ZW1wKSwgIj1tIiAodi0+Y291bnRlcikKKwkJOiAiSXIiIChpKSwgIm0iICh2LT5jb3VudGVyKQorCQk6ICJtZW1vcnkiKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK2V4dGVybiBfX2lubGluZV9fIGludCBhdG9taWNfc3ViX3JldHVybihpbnQgaSwgYXRvbWljX3QgKiB2KQoreworCXVuc2lnbmVkIGxvbmcgdGVtcCwgcmVzdWx0OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIuc2V0IHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiLnNldCBtaXBzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIi5zZXQgbm9yZW9yZGVyICAgICAgICAgICAjIGF0b21pY19zdWJfcmV0dXJuXG4iCisJCSIxOiAgIGxsICAgICUxLCAlMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiICAgICBzdWJ1ICAlMCwgJTEsICUzICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIiAgICAgc2MgICAgJTAsICUyICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIgICAgIGJlcXogICUwLCAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiICAgICBzdWJ1ICAlMCwgJTEsICUzICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIi5zZXQgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCTogIj0mciIgKHJlc3VsdCksICI9JnIiICh0ZW1wKSwgIj1tIiAodi0+Y291bnRlcikKKwkJOiAiSXIiIChpKSwgIm0iICh2LT5jb3VudGVyKQorCQk6ICJtZW1vcnkiKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKyNkZWZpbmUgYXRvbWljX2RlY19yZXR1cm4odikgYXRvbWljX3N1Yl9yZXR1cm4oMSwodikpCisjZGVmaW5lIGF0b21pY19pbmNfcmV0dXJuKHYpIGF0b21pY19hZGRfcmV0dXJuKDEsKHYpKQorCisvKgorICogYXRvbWljX3N1Yl9hbmRfdGVzdCAtIHN1YnRyYWN0IHZhbHVlIGZyb20gdmFyaWFibGUgYW5kIHRlc3QgcmVzdWx0CisgKiBAaTogaW50ZWdlciB2YWx1ZSB0byBzdWJ0cmFjdAorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICoKKyAqIEF0b21pY2FsbHkgc3VidHJhY3RzIEBpIGZyb20gQHYgYW5kIHJldHVybnMKKyAqIHRydWUgaWYgdGhlIHJlc3VsdCBpcyB6ZXJvLCBvciBmYWxzZSBmb3IgYWxsCisgKiBvdGhlciBjYXNlcy4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZAorICogdXNlZnVsIHJhbmdlIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLworI2RlZmluZSBhdG9taWNfc3ViX2FuZF90ZXN0KGksdikgKGF0b21pY19zdWJfcmV0dXJuKChpKSwgKHYpKSA9PSAwKQorCisvKgorICogYXRvbWljX2luY19hbmRfdGVzdCAtIGluY3JlbWVudCBhbmQgdGVzdAorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICoKKyAqIEF0b21pY2FsbHkgaW5jcmVtZW50cyBAdiBieSAxCisgKiBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSByZXN1bHQgaXMgemVybywgb3IgZmFsc2UgZm9yIGFsbAorICogb3RoZXIgY2FzZXMuICBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQKKyAqIHVzZWZ1bCByYW5nZSBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKi8KKyNkZWZpbmUgYXRvbWljX2luY19hbmRfdGVzdCh2KSAoYXRvbWljX2luY19yZXR1cm4oMSwgKHYpKSA9PSAwKQorCisvKgorICogYXRvbWljX2RlY19hbmRfdGVzdCAtIGRlY3JlbWVudCBieSAxIGFuZCB0ZXN0CisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKgorICogQXRvbWljYWxseSBkZWNyZW1lbnRzIEB2IGJ5IDEgYW5kCisgKiByZXR1cm5zIHRydWUgaWYgdGhlIHJlc3VsdCBpcyAwLCBvciBmYWxzZSBmb3IgYWxsIG90aGVyCisgKiBjYXNlcy4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZAorICogdXNlZnVsIHJhbmdlIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLworI2RlZmluZSBhdG9taWNfZGVjX2FuZF90ZXN0KHYpIChhdG9taWNfc3ViX3JldHVybigxLCAodikpID09IDApCisKKy8qCisgKiBhdG9taWNfaW5jIC0gaW5jcmVtZW50IGF0b21pYyB2YXJpYWJsZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICoKKyAqIEF0b21pY2FsbHkgaW5jcmVtZW50cyBAdiBieSAxLiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkCisgKiB1c2VmdWwgcmFuZ2Ugb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICovCisjZGVmaW5lIGF0b21pY19pbmModikgYXRvbWljX2FkZCgxLCh2KSkKKworLyoKKyAqIGF0b21pY19kZWMgLSBkZWNyZW1lbnQgYW5kIHRlc3QKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqCisgKiBBdG9taWNhbGx5IGRlY3JlbWVudHMgQHYgYnkgMS4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZAorICogdXNlZnVsIHJhbmdlIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLworI2RlZmluZSBhdG9taWNfZGVjKHYpIGF0b21pY19zdWIoMSwodikpCisKKy8qCisgKiBhdG9taWNfYWRkX25lZ2F0aXZlIC0gYWRkIGFuZCB0ZXN0IGlmIG5lZ2F0aXZlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiBAaTogaW50ZWdlciB2YWx1ZSB0byBhZGQKKyAqCisgKiBBdG9taWNhbGx5IGFkZHMgQGkgdG8gQHYgYW5kIHJldHVybnMgdHJ1ZQorICogaWYgdGhlIHJlc3VsdCBpcyBuZWdhdGl2ZSwgb3IgZmFsc2Ugd2hlbgorICogcmVzdWx0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvLiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkCisgKiB1c2VmdWwgcmFuZ2Ugb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICoKKyAqIEN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQgZm9yIE1JUFMuCisgKi8KKworI2RlZmluZSBtYigpCQkJCQkJXAorX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCisJIiMgcHJldmVudCBpbnN0cnVjdGlvbnMgYmVpbmcgbW92ZWQgYXJvdW5kXG5cdCIJXAorCSIuc2V0XHRub3Jlb3JkZXJcblx0IgkJCQlcCisJIiMgOCBub3BzIHRvIGZvb2wgdGhlIFI0NDAwIHBpcGVsaW5lXG5cdCIJXAorCSJub3A7bm9wO25vcDtub3A7bm9wO25vcDtub3A7bm9wXG5cdCIJCVwKKwkiLnNldFx0cmVvcmRlciIJCQkJCVwKKwk6IC8qIG5vIG91dHB1dCAqLwkJCQlcCisJOiAvKiBubyBpbnB1dCAqLwkJCQlcCisJOiAibWVtb3J5IikKKyNkZWZpbmUgcm1iKCkgbWIoKQorI2RlZmluZSB3bWIoKSBtYigpCisKKyNkZWZpbmUgSUFUT01JQ19ERUZJTkVECQkxCisKKyNlbmRpZiAvKiBfX21pcHNfXyAqLworCisjaWZkZWYgX19hcm1fXworCisvKgorICogRklYTUU6IGJlbGxvdyBjb2RlIGlzIHZhbGlkIG9ubHkgZm9yIFNBMTF4eAorICovCisKKy8qCisgKiBTYXZlIHRoZSBjdXJyZW50IGludGVycnVwdCBlbmFibGUgc3RhdGUgJiBkaXNhYmxlIElSUXMKKyAqLworI2RlZmluZSBsb2NhbF9pcnFfc2F2ZSh4KQkJCQkJXAorCSh7CQkJCQkJCVwKKwkJdW5zaWduZWQgbG9uZyB0ZW1wOwkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCisJIm1ycwklMCwgY3BzcgkJQCBsb2NhbF9pcnFfc2F2ZVxuIglcCisiCW9ycgklMSwgJTAsICMxMjhcbiIJCQkJCVwKKyIJbXNyCWNwc3JfYywgJTEiCQkJCQlcCisJOiAiPXIiICh4KSwgIj1yIiAodGVtcCkJCQkJCVwKKwk6CQkJCQkJCVwKKwk6ICJtZW1vcnkiKTsJCQkJCQlcCisJfSkKKworLyoKKyAqIHJlc3RvcmUgc2F2ZWQgSVJRICYgRklRIHN0YXRlCisgKi8KKyNkZWZpbmUgbG9jYWxfaXJxX3Jlc3RvcmUoeCkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKKwkibXNyCWNwc3JfYywgJTAJCUAgbG9jYWxfaXJxX3Jlc3RvcmVcbiIJXAorCToJCQkJCQkJXAorCTogInIiICh4KQkJCQkJCVwKKwk6ICJtZW1vcnkiKQorCisjZGVmaW5lIF9fc2F2ZV9mbGFnc19jbGkoeCkgbG9jYWxfaXJxX3NhdmUoeCkKKyNkZWZpbmUgX19yZXN0b3JlX2ZsYWdzKHgpIGxvY2FsX2lycV9yZXN0b3JlKHgpCisKK3R5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7CisKKyNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQorCisjZGVmaW5lIGF0b21pY19yZWFkKHYpCSgodiktPmNvdW50ZXIpCisjZGVmaW5lIGF0b21pY19zZXQodixpKQkoKCh2KS0+Y291bnRlcikgPSAoaSkpCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX2FkZChpbnQgaSwgdm9sYXRpbGUgYXRvbWljX3QgKnYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCV9fc2F2ZV9mbGFnc19jbGkoZmxhZ3MpOworCXYtPmNvdW50ZXIgKz0gaTsKKwlfX3Jlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGF0b21pY19zdWIoaW50IGksIHZvbGF0aWxlIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlfX3NhdmVfZmxhZ3NfY2xpKGZsYWdzKTsKKwl2LT5jb3VudGVyIC09IGk7CisJX19yZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfaW5jKHZvbGF0aWxlIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlfX3NhdmVfZmxhZ3NfY2xpKGZsYWdzKTsKKwl2LT5jb3VudGVyICs9IDE7CisJX19yZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfZGVjKHZvbGF0aWxlIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlfX3NhdmVfZmxhZ3NfY2xpKGZsYWdzKTsKKwl2LT5jb3VudGVyIC09IDE7CisJX19yZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IGF0b21pY19kZWNfYW5kX3Rlc3Qodm9sYXRpbGUgYXRvbWljX3QgKnYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVzdWx0OworCisJX19zYXZlX2ZsYWdzX2NsaShmbGFncyk7CisJdi0+Y291bnRlciAtPSAxOworCXJlc3VsdCA9ICh2LT5jb3VudGVyID09IDApOworCV9fcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfYWRkX25lZ2F0aXZlKGludCBpLCB2b2xhdGlsZSBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXN1bHQ7CisKKwlfX3NhdmVfZmxhZ3NfY2xpKGZsYWdzKTsKKwl2LT5jb3VudGVyICs9IGk7CisJcmVzdWx0ID0gKHYtPmNvdW50ZXIgPCAwKTsKKwlfX3Jlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfY2xlYXJfbWFzayh1bnNpZ25lZCBsb25nIG1hc2ssIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCV9fc2F2ZV9mbGFnc19jbGkoZmxhZ3MpOworCSphZGRyICY9IH5tYXNrOworCV9fcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKKyNkZWZpbmUgbWIoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiIgOiA6IDogIm1lbW9yeSIpCisjZGVmaW5lIHJtYigpIG1iKCkKKyNkZWZpbmUgd21iKCkgbWIoKQorCisjZGVmaW5lIElBVE9NSUNfREVGSU5FRAkJMQorCisjZW5kaWYgLyogX19hcm1fXyAqLworCisjaWZkZWYgX19zaF9fCisKK3R5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7CisKKyNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQorCisjZGVmaW5lIGF0b21pY19yZWFkKHYpCQkJKCh2KS0+Y291bnRlcikKKyNkZWZpbmUgYXRvbWljX3NldCh2LGkpCQkJKCgodiktPmNvdW50ZXIpID0gKGkpKQorCisjZGVmaW5lIGF0b21pY19kZWNfcmV0dXJuKHYpCQlhdG9taWNfc3ViX3JldHVybigxLCh2KSkKKyNkZWZpbmUgYXRvbWljX2luY19yZXR1cm4odikJCWF0b21pY19hZGRfcmV0dXJuKDEsKHYpKQorCisjZGVmaW5lIGF0b21pY19zdWJfYW5kX3Rlc3QoaSx2KQkoYXRvbWljX3N1Yl9yZXR1cm4oKGkpLCAodikpID09IDApCisjZGVmaW5lIGF0b21pY19kZWNfYW5kX3Rlc3QodikJCShhdG9taWNfc3ViX3JldHVybigxLCAodikpID09IDApCisjZGVmaW5lIGF0b21pY19pbmNfYW5kX3Rlc3QodikJCShhdG9taWNfYWRkX3JldHVybigxLCAodikpICE9IDApCisKKyNkZWZpbmUgYXRvbWljX2FkZChpLHYpCQkJYXRvbWljX2FkZF9yZXR1cm4oKGkpLCh2KSkKKyNkZWZpbmUgYXRvbWljX3N1YihpLHYpCQkJYXRvbWljX3N1Yl9yZXR1cm4oKGkpLCh2KSkKKyNkZWZpbmUgYXRvbWljX2luYyh2KQkJCWF0b21pY19hZGQoMSwodikpCisjZGVmaW5lIGF0b21pY19kZWModikJCQlhdG9taWNfc3ViKDEsKHYpKQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgYXRvbWljX2FkZF9yZXR1cm4oaW50IGksIHZvbGF0aWxlIGF0b21pY190ICp2KQoreworCWludCByZXN1bHQ7CisKKwlhc20gdm9sYXRpbGUgKAorCSIJLmFsaWduCTJcbiIKKwkiCW1vdmEJOTlmLCByMFxuIgorCSIJbW92CXIxNSwgcjFcbiIKKwkiCW1vdgkjLTYsIHIxNVxuIgorCSIJbW92LmwJQCUyLCAlMFxuIgorCSIJYWRkCSUxLCAlMFxuIgorCSIJbW92LmwJJTAsIEAlMlxuIgorCSI5OToJbW92CXIxLCByMTUiCisJOiAiPSZyIihyZXN1bHQpCisJOiAiciIoaSksICJyIih2KQorCTogInIwIiwgInIxIik7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgYXRvbWljX3N1Yl9yZXR1cm4oaW50IGksIHZvbGF0aWxlIGF0b21pY190ICp2KQoreworCWludCByZXN1bHQ7CisKKwlhc20gdm9sYXRpbGUgKAorCSIJLmFsaWduCTJcbiIKKwkiCW1vdmEJOTlmLCByMFxuIgorCSIJbW92CXIxNSwgcjFcbiIKKwkiCW1vdgkjLTYsIHIxNVxuIgorCSIJbW92LmwJQCUyLCAlMFxuIgorCSIJc3ViCSUxLCAlMFxuIgorCSIJbW92LmwJJTAsIEAlMlxuIgorCSI5OToJbW92CXIxLCByMTUiCisJOiAiPSZyIihyZXN1bHQpCisJOiAiciIoaSksICJyIih2KQorCTogInIwIiwgInIxIik7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisjZGVmaW5lIG1iKCkgX19hc21fXyBfX3ZvbGF0aWxlX18gKCIiIDogOiA6ICJtZW1vcnkiKQorI2RlZmluZSBybWIoKSBtYigpCisjZGVmaW5lIHdtYigpIG1iKCkKKworI2RlZmluZSBJQVRPTUlDX0RFRklORUQJCTEKKworI2VuZGlmIC8qIF9fc2hfXyAqLworCisjaWZkZWYgX19iZmluX18KKworI2luY2x1ZGUgPGJmaW5fZml4ZWRfY29kZS5oPgorCit0eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OworCisjZGVmaW5lIEFUT01JQ19JTklUKGkpICAgeyAoaSkgfQorCisjZGVmaW5lIGF0b21pY19yZWFkKHYpICAgKCh2KS0+Y291bnRlcikKKyNkZWZpbmUgYXRvbWljX3NldCh2LGkpICAoKCh2KS0+Y291bnRlcikgPSAoaSkpCisjZGVmaW5lIGF0b21pY19hZGQoaSx2KSAgYmZpbl9hdG9taWNfYWRkMzIoJih2KS0+Y291bnRlciwgaSkKKyNkZWZpbmUgYXRvbWljX3N1YihpLHYpICBiZmluX2F0b21pY19zdWIzMigmKHYpLT5jb3VudGVyLCBpKQorI2RlZmluZSBhdG9taWNfaW5jKHYpICAgIGJmaW5fYXRvbWljX2luYzMyKCYodiktPmNvdW50ZXIpOworI2RlZmluZSBhdG9taWNfZGVjKHYpICAgIGJmaW5fYXRvbWljX2RlYzMyKCYodiktPmNvdW50ZXIpOworCisjZGVmaW5lIG1iKCkgX19hc21fXyBfX3ZvbGF0aWxlX18gKCIiIDogOiA6ICJtZW1vcnkiKQorI2RlZmluZSBybWIoKSBtYigpCisjZGVmaW5lIHdtYigpIG1iKCkKKworI2RlZmluZSBJQVRPTUlDX0RFRklORUQgMQorCisjZW5kaWYgLyogX19iZmluX18gKi8KKworI2lmbmRlZiBJQVRPTUlDX0RFRklORUQKKy8qCisgKiBub24gc3VwcG9ydGVkIGFyY2hpdGVjdHVyZS4KKyAqLworI3dhcm5pbmcgIkF0b21pYyBvcGVyYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgYXJjaGl0ZWN0dXJlLiIKKwordHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKKworI2RlZmluZSBBVE9NSUNfSU5JVChpKQl7IChpKSB9CisKKyNkZWZpbmUgYXRvbWljX3JlYWQodikJKCh2KS0+Y291bnRlcikKKyNkZWZpbmUgYXRvbWljX3NldCh2LGkpCSgoKHYpLT5jb3VudGVyKSA9IChpKSkKKyNkZWZpbmUgYXRvbWljX2FkZChpLHYpICgoKHYpLT5jb3VudGVyKSArPSAoaSkpCisjZGVmaW5lIGF0b21pY19zdWIoaSx2KSAoKCh2KS0+Y291bnRlcikgLT0gKGkpKQorI2RlZmluZSBhdG9taWNfaW5jKHYpICAgKCgodiktPmNvdW50ZXIpKyspCisjZGVmaW5lIGF0b21pY19kZWModikgICAoKCh2KS0+Y291bnRlciktLSkKKworI2RlZmluZSBtYigpCisjZGVmaW5lIHJtYigpCisjZGVmaW5lIHdtYigpCisKKyNkZWZpbmUgSUFUT01JQ19ERUZJTkVECQkxCisKKyNlbmRpZiAvKiBJQVRPTUlDX0RFRklORUQgKi8KKworLyoKKyAqICBBdG9taWMgcmVhZC93cml0ZQorICogIENvcHlyaWdodCAoYykgMjAwMSBieSBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKi8KKworLyogTWF4IG51bWJlciBvZiB0aW1lcyB3ZSBtdXN0IHNwaW4gb24gYSBzcGluLWxvY2sgY2FsbGluZyBzY2hlZF95aWVsZCgpLgorICAgQWZ0ZXIgTUFYX1NQSU5fQ09VTlQgaXRlcmF0aW9ucywgd2UgcHV0IHRoZSBjYWxsaW5nIHRocmVhZCB0byBzbGVlcC4gKi8KKworI2lmbmRlZiBNQVhfU1BJTl9DT1VOVAorI2RlZmluZSBNQVhfU1BJTl9DT1VOVCA1MAorI2VuZGlmCisKKy8qIER1cmF0aW9uIG9mIHNsZWVwIChpbiBuYW5vc2Vjb25kcykgd2hlbiB3ZSBjYW4ndCBhY3F1aXJlIGEgc3Bpbi1sb2NrCisgICBhZnRlciBNQVhfU1BJTl9DT1VOVCBpdGVyYXRpb25zIG9mIHNjaGVkX3lpZWxkKCkuCisgICBUaGlzIE1VU1QgQkUgPiAybXMuCisgICAoT3RoZXJ3aXNlIHRoZSBrZXJuZWwgZG9lcyBidXN5LXdhaXRpbmcgZm9yIHJlYWwtdGltZSB0aHJlYWRzLAorICAgIGdpdmluZyBvdGhlciB0aHJlYWRzIG5vIGNoYW5jZSB0byBydW4uKSAqLworCisjaWZuZGVmIFNQSU5fU0xFRVBfRFVSQVRJT04KKyNkZWZpbmUgU1BJTl9TTEVFUF9EVVJBVElPTiAyMDAwMDAxCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBiZWdpbiwgZW5kOworfSBzbmRfYXRvbWljX3dyaXRlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSBjb25zdCBzbmRfYXRvbWljX3dyaXRlX3QgKndyaXRlOworCXVuc2lnbmVkIGludCBlbmQ7Cit9IHNuZF9hdG9taWNfcmVhZF90OworCit2b2lkIHNuZF9hdG9taWNfcmVhZF93YWl0KHNuZF9hdG9taWNfcmVhZF90ICp0KTsKKworc3RhdGljIGlubGluZSB2b2lkIHNuZF9hdG9taWNfd3JpdGVfaW5pdChzbmRfYXRvbWljX3dyaXRlX3QgKncpCit7CisJdy0+YmVnaW4gPSAwOworCXctPmVuZCA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfYXRvbWljX3dyaXRlX2JlZ2luKHNuZF9hdG9taWNfd3JpdGVfdCAqdykKK3sKKwl3LT5iZWdpbisrOworCXdtYigpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2F0b21pY193cml0ZV9lbmQoc25kX2F0b21pY193cml0ZV90ICp3KQoreworCXdtYigpOworCXctPmVuZCsrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2F0b21pY19yZWFkX2luaXQoc25kX2F0b21pY19yZWFkX3QgKnIsIHNuZF9hdG9taWNfd3JpdGVfdCAqdykKK3sKKwlyLT53cml0ZSA9IHc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfYXRvbWljX3JlYWRfYmVnaW4oc25kX2F0b21pY19yZWFkX3QgKnIpCit7CisJci0+ZW5kID0gci0+d3JpdGUtPmVuZDsKKwlybWIoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc25kX2F0b21pY19yZWFkX29rKHNuZF9hdG9taWNfcmVhZF90ICpyKQoreworCXJtYigpOworCXJldHVybiByLT5lbmQgPT0gci0+d3JpdGUtPmJlZ2luOworfQorCisjZW5kaWYgLyogX19BTFNBX0lBVE9NSUNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2lucHV0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvaW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzVkMGU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2lucHV0LmgKQEAgLTAsMCArMSw4MyBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL2lucHV0LmgKKyAqIFxicmllZiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKiBcYXV0aG9yIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKiBcYXV0aG9yIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMTk5OC0yMDAxCisgKgorICogQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICovCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX0lOUFVUX0gKKyNkZWZpbmUgX19BTFNBX0lOUFVUX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqICBcZGVmZ3JvdXAgSW5wdXQgSW5wdXQgSW50ZXJmYWNlCisgKgorICogIFRoZSBpbnB1dCBmdW5jdGlvbnMgcHJlc2VudCBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGUgc3RkaW8gZnVuY3Rpb25zCisgKiAgb24gdG9wIG9mIGRpZmZlcmVudCB1bmRlcmx5aW5nIGlucHV0IHNvdXJjZXMuCisgKgorICogIFRoZSAjc25kX2NvbmZpZ19sb2FkIGZ1bmN0aW9uIHVzZXMgc3VjaCBhbiBpbnB1dCBoYW5kbGUgdG8gYmUgYWJsZSB0bworICogIGxvYWQgY29uZmlndXJhdGlvbnMgbm90IG9ubHkgZnJvbSBzdGFuZGFyZCBmaWxlcyBidXQgYWxzbyBmcm9tIG90aGVyCisgKiAgc291cmNlcywgZS5nLiBmcm9tIG1lbW9yeSBidWZmZXJzLgorICoKKyAqICBceworICovCisKKy8qKgorICogXGJyaWVmIEludGVybmFsIHN0cnVjdHVyZSBmb3IgYW4gaW5wdXQgb2JqZWN0LgorICoKKyAqIFRoZSBBTFNBIGxpYnJhcnkgdXNlcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUgYXMgYSBoYW5kbGUgdG8gYW4KKyAqIGlucHV0IG9iamVjdC4gQXBwbGljYXRpb25zIGRvbid0IGFjY2VzcyBpdHMgY29udGVudHMgZGlyZWN0bHkuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfaW5wdXQgc25kX2lucHV0X3Q7CisKKy8qKiBJbnB1dCB0eXBlLiAqLwordHlwZWRlZiBlbnVtIF9zbmRfaW5wdXRfdHlwZSB7CisJLyoqIElucHV0IGZyb20gYSBzdGRpbyBzdHJlYW0uICovCisJU05EX0lOUFVUX1NURElPLAorCS8qKiBJbnB1dCBmcm9tIGEgbWVtb3J5IGJ1ZmZlci4gKi8KKwlTTkRfSU5QVVRfQlVGRkVSCit9IHNuZF9pbnB1dF90eXBlX3Q7CisKK2ludCBzbmRfaW5wdXRfc3RkaW9fb3BlbihzbmRfaW5wdXRfdCAqKmlucHV0cCwgY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqbW9kZSk7CitpbnQgc25kX2lucHV0X3N0ZGlvX2F0dGFjaChzbmRfaW5wdXRfdCAqKmlucHV0cCwgRklMRSAqZnAsIGludCBfY2xvc2UpOworaW50IHNuZF9pbnB1dF9idWZmZXJfb3BlbihzbmRfaW5wdXRfdCAqKmlucHV0cCwgY29uc3QgY2hhciAqYnVmZmVyLCBzc2l6ZV90IHNpemUpOworaW50IHNuZF9pbnB1dF9jbG9zZShzbmRfaW5wdXRfdCAqaW5wdXQpOworaW50IHNuZF9pbnB1dF9zY2FuZihzbmRfaW5wdXRfdCAqaW5wdXQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorI2lmbmRlZiBET0NfSElEREVOCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAoc2NhbmYsIDIsIDMpKSkKKyNlbmRpZgorCTsKK2NoYXIgKnNuZF9pbnB1dF9nZXRzKHNuZF9pbnB1dF90ICppbnB1dCwgY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSk7CitpbnQgc25kX2lucHV0X2dldGMoc25kX2lucHV0X3QgKmlucHV0KTsKK2ludCBzbmRfaW5wdXRfdW5nZXRjKHNuZF9pbnB1dF90ICppbnB1dCwgaW50IGMpOworCisvKiogXH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQUxTQV9JTlBVVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvbWl4ZXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9taXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MjU2YTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvbWl4ZXIuaApAQCAtMCwwICsxLDMxNyBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL21peGVyLmgKKyAqIFxicmllZiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKiBcYXV0aG9yIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKiBcYXV0aG9yIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMTk5OC0yMDAxCisgKgorICogQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICovCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX01JWEVSX0gKKyNkZWZpbmUgX19BTFNBX01JWEVSX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqICBcZGVmZ3JvdXAgTWl4ZXIgTWl4ZXIgSW50ZXJmYWNlCisgKiAgVGhlIG1peGVyIGludGVyZmFjZS4KKyAqICBceworICovCisKKy8qKiBNaXhlciBoYW5kbGUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfbWl4ZXIgc25kX21peGVyX3Q7CisvKiogTWl4ZXIgZWxlbWVudHMgY2xhc3MgaGFuZGxlICovCit0eXBlZGVmIHN0cnVjdCBfc25kX21peGVyX2NsYXNzIHNuZF9taXhlcl9jbGFzc190OworLyoqIE1peGVyIGVsZW1lbnQgaGFuZGxlICovCit0eXBlZGVmIHN0cnVjdCBfc25kX21peGVyX2VsZW0gc25kX21peGVyX2VsZW1fdDsKKworLyoqIAorICogXGJyaWVmIE1peGVyIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBccGFyYW0gbWl4ZXIgTWl4ZXIgaGFuZGxlCisgKiBccGFyYW0gbWFzayBldmVudCBtYXNrCisgKiBccGFyYW0gZWxlbSByZWxhdGVkIG1peGVyIGVsZW1lbnQgKGlmIGFueSkKKyAqIFxyZXR1cm4gMCBvbiBzdWNjZXNzIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLwordHlwZWRlZiBpbnQgKCpzbmRfbWl4ZXJfY2FsbGJhY2tfdCkoc25kX21peGVyX3QgKmN0bCwKKwkJCQkgICAgdW5zaWduZWQgaW50IG1hc2ssCisJCQkJICAgIHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworCisvKiogCisgKiBcYnJpZWYgTWl4ZXIgZWxlbWVudCBjYWxsYmFjayBmdW5jdGlvbgorICogXHBhcmFtIGVsZW0gTWl4ZXIgZWxlbWVudAorICogXHBhcmFtIG1hc2sgZXZlbnQgbWFzaworICogXHJldHVybiAwIG9uIHN1Y2Nlc3Mgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICovCit0eXBlZGVmIGludCAoKnNuZF9taXhlcl9lbGVtX2NhbGxiYWNrX3QpKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sCisJCQkJCSB1bnNpZ25lZCBpbnQgbWFzayk7CisKKy8qKgorICogXGJyaWVmIENvbXBhcmUgZnVuY3Rpb24gZm9yIHNvcnRpbmcgbWl4ZXIgZWxlbWVudHMKKyAqIFxwYXJhbSBlMSBGaXJzdCBlbGVtZW50CisgKiBccGFyYW0gZTIgU2Vjb25kIGVsZW1lbnQKKyAqIFxyZXR1cm4gLTEgaWYgZTEgPCBlMiwgMCBpZiBlMSA9PSBlMiwgMSBpZiBlMSA+IGUyCisgKi8KK3R5cGVkZWYgaW50ICgqc25kX21peGVyX2NvbXBhcmVfdCkoY29uc3Qgc25kX21peGVyX2VsZW1fdCAqZTEsCisJCQkJICAgY29uc3Qgc25kX21peGVyX2VsZW1fdCAqZTIpOworCisvKioKKyAqIFxicmllZiBFdmVudCBjYWxsYmFjayBmb3IgdGhlIG1peGVyIGNsYXNzCisgKiBccGFyYW0gY2xhc3NfIE1peGVyIGNsYXNzCisgKiBccGFyYW0gbWFzayBFdmVudCBtYXNrIChTTkRfQ1RMX0VWRU5UXyopCisgKiBccGFyYW0gaGVsZW0gSENUTCBlbGVtZW50IHdoaWNoIGludm9rZWQgdGhlIGV2ZW50CisgKiBccGFyYW0gbWVsZW0gTWl4ZXIgZWxlbWVudCBhc3NvY2lhdGVkIHRvIEhDVEwgZWxlbWVudAorICogXHJldHVybiB6ZXJvIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIHZhbHVlCisgKi8KK3R5cGVkZWYgaW50ICgqc25kX21peGVyX2V2ZW50X3QpKHNuZF9taXhlcl9jbGFzc190ICpjbGFzc18sIHVuc2lnbmVkIGludCBtYXNrLAorCQkJCSBzbmRfaGN0bF9lbGVtX3QgKmhlbGVtLCBzbmRfbWl4ZXJfZWxlbV90ICptZWxlbSk7CisKKworLyoqIE1peGVyIGVsZW1lbnQgdHlwZSAqLwordHlwZWRlZiBlbnVtIF9zbmRfbWl4ZXJfZWxlbV90eXBlIHsKKwkvKiBTaW1wbGUgbWl4ZXIgZWxlbWVudHMgKi8KKwlTTkRfTUlYRVJfRUxFTV9TSU1QTEUsCisJU05EX01JWEVSX0VMRU1fTEFTVCA9IFNORF9NSVhFUl9FTEVNX1NJTVBMRQorfSBzbmRfbWl4ZXJfZWxlbV90eXBlX3Q7CisKK2ludCBzbmRfbWl4ZXJfb3BlbihzbmRfbWl4ZXJfdCAqKm1peGVyLCBpbnQgbW9kZSk7CitpbnQgc25kX21peGVyX2Nsb3NlKHNuZF9taXhlcl90ICptaXhlcik7CitzbmRfbWl4ZXJfZWxlbV90ICpzbmRfbWl4ZXJfZmlyc3RfZWxlbShzbmRfbWl4ZXJfdCAqbWl4ZXIpOworc25kX21peGVyX2VsZW1fdCAqc25kX21peGVyX2xhc3RfZWxlbShzbmRfbWl4ZXJfdCAqbWl4ZXIpOworaW50IHNuZF9taXhlcl9oYW5kbGVfZXZlbnRzKHNuZF9taXhlcl90ICptaXhlcik7CitpbnQgc25kX21peGVyX2F0dGFjaChzbmRfbWl4ZXJfdCAqbWl4ZXIsIGNvbnN0IGNoYXIgKm5hbWUpOworaW50IHNuZF9taXhlcl9hdHRhY2hfaGN0bChzbmRfbWl4ZXJfdCAqbWl4ZXIsIHNuZF9oY3RsX3QgKmhjdGwpOworaW50IHNuZF9taXhlcl9kZXRhY2goc25kX21peGVyX3QgKm1peGVyLCBjb25zdCBjaGFyICpuYW1lKTsKK2ludCBzbmRfbWl4ZXJfZGV0YWNoX2hjdGwoc25kX21peGVyX3QgKm1peGVyLCBzbmRfaGN0bF90ICpoY3RsKTsKK2ludCBzbmRfbWl4ZXJfZ2V0X2hjdGwoc25kX21peGVyX3QgKm1peGVyLCBjb25zdCBjaGFyICpuYW1lLCBzbmRfaGN0bF90ICoqaGN0bCk7CitpbnQgc25kX21peGVyX3BvbGxfZGVzY3JpcHRvcnNfY291bnQoc25kX21peGVyX3QgKm1peGVyKTsKK2ludCBzbmRfbWl4ZXJfcG9sbF9kZXNjcmlwdG9ycyhzbmRfbWl4ZXJfdCAqbWl4ZXIsIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBzcGFjZSk7CitpbnQgc25kX21peGVyX3BvbGxfZGVzY3JpcHRvcnNfcmV2ZW50cyhzbmRfbWl4ZXJfdCAqbWl4ZXIsIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBuZmRzLCB1bnNpZ25lZCBzaG9ydCAqcmV2ZW50cyk7CitpbnQgc25kX21peGVyX2xvYWQoc25kX21peGVyX3QgKm1peGVyKTsKK3ZvaWQgc25kX21peGVyX2ZyZWUoc25kX21peGVyX3QgKm1peGVyKTsKK2ludCBzbmRfbWl4ZXJfd2FpdChzbmRfbWl4ZXJfdCAqbWl4ZXIsIGludCB0aW1lb3V0KTsKK2ludCBzbmRfbWl4ZXJfc2V0X2NvbXBhcmUoc25kX21peGVyX3QgKm1peGVyLCBzbmRfbWl4ZXJfY29tcGFyZV90IG1zb3J0KTsKK3ZvaWQgc25kX21peGVyX3NldF9jYWxsYmFjayhzbmRfbWl4ZXJfdCAqb2JqLCBzbmRfbWl4ZXJfY2FsbGJhY2tfdCB2YWwpOwordm9pZCAqIHNuZF9taXhlcl9nZXRfY2FsbGJhY2tfcHJpdmF0ZShjb25zdCBzbmRfbWl4ZXJfdCAqb2JqKTsKK3ZvaWQgc25kX21peGVyX3NldF9jYWxsYmFja19wcml2YXRlKHNuZF9taXhlcl90ICpvYmosIHZvaWQgKiB2YWwpOwordW5zaWduZWQgaW50IHNuZF9taXhlcl9nZXRfY291bnQoY29uc3Qgc25kX21peGVyX3QgKm9iaik7CitpbnQgc25kX21peGVyX2NsYXNzX3VucmVnaXN0ZXIoc25kX21peGVyX2NsYXNzX3QgKmNsc3MpOworCitzbmRfbWl4ZXJfZWxlbV90ICpzbmRfbWl4ZXJfZWxlbV9uZXh0KHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworc25kX21peGVyX2VsZW1fdCAqc25kX21peGVyX2VsZW1fcHJldihzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK3ZvaWQgc25kX21peGVyX2VsZW1fc2V0X2NhbGxiYWNrKHNuZF9taXhlcl9lbGVtX3QgKm9iaiwgc25kX21peGVyX2VsZW1fY2FsbGJhY2tfdCB2YWwpOwordm9pZCAqIHNuZF9taXhlcl9lbGVtX2dldF9jYWxsYmFja19wcml2YXRlKGNvbnN0IHNuZF9taXhlcl9lbGVtX3QgKm9iaik7Cit2b2lkIHNuZF9taXhlcl9lbGVtX3NldF9jYWxsYmFja19wcml2YXRlKHNuZF9taXhlcl9lbGVtX3QgKm9iaiwgdm9pZCAqIHZhbCk7CitzbmRfbWl4ZXJfZWxlbV90eXBlX3Qgc25kX21peGVyX2VsZW1fZ2V0X3R5cGUoY29uc3Qgc25kX21peGVyX2VsZW1fdCAqb2JqKTsKKworaW50IHNuZF9taXhlcl9jbGFzc19yZWdpc3RlcihzbmRfbWl4ZXJfY2xhc3NfdCAqY2xhc3NfLCBzbmRfbWl4ZXJfdCAqbWl4ZXIpOworaW50IHNuZF9taXhlcl9lbGVtX25ldyhzbmRfbWl4ZXJfZWxlbV90ICoqZWxlbSwKKwkJICAgICAgIHNuZF9taXhlcl9lbGVtX3R5cGVfdCB0eXBlLAorCQkgICAgICAgaW50IGNvbXBhcmVfd2VpZ2h0LAorCQkgICAgICAgdm9pZCAqcHJpdmF0ZV9kYXRhLAorCQkgICAgICAgdm9pZCAoKnByaXZhdGVfZnJlZSkoc25kX21peGVyX2VsZW1fdCAqZWxlbSkpOworaW50IHNuZF9taXhlcl9lbGVtX2FkZChzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBzbmRfbWl4ZXJfY2xhc3NfdCAqY2xhc3NfKTsKK2ludCBzbmRfbWl4ZXJfZWxlbV9yZW1vdmUoc25kX21peGVyX2VsZW1fdCAqZWxlbSk7Cit2b2lkIHNuZF9taXhlcl9lbGVtX2ZyZWUoc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX2VsZW1faW5mbyhzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfZWxlbV92YWx1ZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfZWxlbV9hdHRhY2goc25kX21peGVyX2VsZW1fdCAqbWVsZW0sIHNuZF9oY3RsX2VsZW1fdCAqaGVsZW0pOworaW50IHNuZF9taXhlcl9lbGVtX2RldGFjaChzbmRfbWl4ZXJfZWxlbV90ICptZWxlbSwgc25kX2hjdGxfZWxlbV90ICpoZWxlbSk7CitpbnQgc25kX21peGVyX2VsZW1fZW1wdHkoc25kX21peGVyX2VsZW1fdCAqbWVsZW0pOwordm9pZCAqc25kX21peGVyX2VsZW1fZ2V0X3ByaXZhdGUoY29uc3Qgc25kX21peGVyX2VsZW1fdCAqbWVsZW0pOworCitzaXplX3Qgc25kX21peGVyX2NsYXNzX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gaW52YWxpZCAjc25kX21peGVyX2NsYXNzX3QgdXNpbmcgc3RhbmRhcmQgYWxsb2NhCisgKiBccGFyYW0gcHRyIHJldHVybmVkIHBvaW50ZXIKKyAqLworI2RlZmluZSBzbmRfbWl4ZXJfY2xhc3NfYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX21peGVyX2NsYXNzKQoraW50IHNuZF9taXhlcl9jbGFzc19tYWxsb2Moc25kX21peGVyX2NsYXNzX3QgKipwdHIpOwordm9pZCBzbmRfbWl4ZXJfY2xhc3NfZnJlZShzbmRfbWl4ZXJfY2xhc3NfdCAqb2JqKTsKK3ZvaWQgc25kX21peGVyX2NsYXNzX2NvcHkoc25kX21peGVyX2NsYXNzX3QgKmRzdCwgY29uc3Qgc25kX21peGVyX2NsYXNzX3QgKnNyYyk7CitzbmRfbWl4ZXJfdCAqc25kX21peGVyX2NsYXNzX2dldF9taXhlcihjb25zdCBzbmRfbWl4ZXJfY2xhc3NfdCAqY2xhc3NfKTsKK3NuZF9taXhlcl9ldmVudF90IHNuZF9taXhlcl9jbGFzc19nZXRfZXZlbnQoY29uc3Qgc25kX21peGVyX2NsYXNzX3QgKmNsYXNzXyk7Cit2b2lkICpzbmRfbWl4ZXJfY2xhc3NfZ2V0X3ByaXZhdGUoY29uc3Qgc25kX21peGVyX2NsYXNzX3QgKmNsYXNzXyk7CitzbmRfbWl4ZXJfY29tcGFyZV90IHNuZF9taXhlcl9jbGFzc19nZXRfY29tcGFyZShjb25zdCBzbmRfbWl4ZXJfY2xhc3NfdCAqY2xhc3NfKTsKK2ludCBzbmRfbWl4ZXJfY2xhc3Nfc2V0X2V2ZW50KHNuZF9taXhlcl9jbGFzc190ICpjbGFzc18sIHNuZF9taXhlcl9ldmVudF90IGV2ZW50KTsKK2ludCBzbmRfbWl4ZXJfY2xhc3Nfc2V0X3ByaXZhdGUoc25kX21peGVyX2NsYXNzX3QgKmNsYXNzXywgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKK2ludCBzbmRfbWl4ZXJfY2xhc3Nfc2V0X3ByaXZhdGVfZnJlZShzbmRfbWl4ZXJfY2xhc3NfdCAqY2xhc3NfLCB2b2lkICgqcHJpdmF0ZV9mcmVlKShzbmRfbWl4ZXJfY2xhc3NfdCAqY2xhc3NfKSk7CitpbnQgc25kX21peGVyX2NsYXNzX3NldF9jb21wYXJlKHNuZF9taXhlcl9jbGFzc190ICpjbGFzc18sIHNuZF9taXhlcl9jb21wYXJlX3QgY29tcGFyZSk7CisKKy8qKgorICogIFxkZWZncm91cCBTaW1wbGVNaXhlciBTaW1wbGUgTWl4ZXIgSW50ZXJmYWNlCisgKiAgXGluZ3JvdXAgTWl4ZXIKKyAqICBUaGUgc2ltcGxlIG1peGVyIGludGVyZmFjZS4KKyAqICBceworICovCisKKy8qIFNpbXBsZSBtaXhlciBlbGVtZW50cyBBUEkgKi8KKworLyoqIE1peGVyIHNpbXBsZSBlbGVtZW50IGNoYW5uZWwgaWRlbnRpZmllciAqLwordHlwZWRlZiBlbnVtIF9zbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZCB7CisJLyoqIFVua25vd24gKi8KKwlTTkRfTUlYRVJfU0NITl9VTktOT1dOID0gLTEsCisJLyoqIEZyb250IGxlZnQgKi8KKwlTTkRfTUlYRVJfU0NITl9GUk9OVF9MRUZUID0gMCwKKwkvKiogRnJvbnQgcmlnaHQgKi8KKwlTTkRfTUlYRVJfU0NITl9GUk9OVF9SSUdIVCwKKwkvKiogUmVhciBsZWZ0ICovCisJU05EX01JWEVSX1NDSE5fUkVBUl9MRUZULAorCS8qKiBSZWFyIHJpZ2h0ICovCisJU05EX01JWEVSX1NDSE5fUkVBUl9SSUdIVCwKKwkvKiogRnJvbnQgY2VudGVyICovCisJU05EX01JWEVSX1NDSE5fRlJPTlRfQ0VOVEVSLAorCS8qKiBXb29mZXIgKi8KKwlTTkRfTUlYRVJfU0NITl9XT09GRVIsCisJLyoqIFNpZGUgTGVmdCAqLworCVNORF9NSVhFUl9TQ0hOX1NJREVfTEVGVCwKKwkvKiogU2lkZSBSaWdodCAqLworCVNORF9NSVhFUl9TQ0hOX1NJREVfUklHSFQsCisJLyoqIFJlYXIgQ2VudGVyICovCisJU05EX01JWEVSX1NDSE5fUkVBUl9DRU5URVIsCisJU05EX01JWEVSX1NDSE5fTEFTVCA9IDMxLAorCS8qKiBNb25vIChGcm9udCBsZWZ0IGFsaWFzKSAqLworCVNORF9NSVhFUl9TQ0hOX01PTk8gPSBTTkRfTUlYRVJfU0NITl9GUk9OVF9MRUZUCit9IHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3Q7CisKKy8qKiBNaXhlciBzaW1wbGUgZWxlbWVudCAtIHJlZ2lzdGVyIG9wdGlvbnMgLSBhYnN0cmFjdGlvbiBsZXZlbCAqLworZW51bSBzbmRfbWl4ZXJfc2VsZW1fcmVnb3B0X2Fic3RyYWN0IHsKKwkvKiogbm8gYWJzdHJhY3Rpb24gLSB0cnkgdXNlIGFsbCB1bml2ZXJzYWwgY29udHJvbHMgZnJvbSBkcml2ZXIgKi8KKwlTTkRfTUlYRVJfU0FCU1RSQUNUX05PTkUgPSAwLAorCS8qKiBiYXNpYyBhYnN0cmFjdGlvbiAtIE1hc3RlcixQQ00sQ0QsQXV4LFJlY29yZC1HYWluIGV0Yy4gKi8KKwlTTkRfTUlYRVJfU0FCU1RSQUNUX0JBU0lDLAorfTsKKworLyoqIE1peGVyIHNpbXBsZSBlbGVtZW50IC0gcmVnaXN0ZXIgb3B0aW9ucyAqLworc3RydWN0IHNuZF9taXhlcl9zZWxlbV9yZWdvcHQgeworCS8qKiBzdHJ1Y3R1cmUgdmVyc2lvbiAqLworCWludCB2ZXI7CisJLyoqIHYxOiBhYnN0cmFjdCBsYXllciBzZWxlY3Rpb24gKi8KKwllbnVtIHNuZF9taXhlcl9zZWxlbV9yZWdvcHRfYWJzdHJhY3QgYWJzdHJhY3Q7CisJLyoqIHYxOiBkZXZpY2UgbmFtZSAobXVzdCBiZSBOVUxMIHdoZW4gcGxheWJhY2tfcGNtIG9yIGNhcHR1cmVfcGNtICE9IE5VTEwpICovCisJY29uc3QgY2hhciAqZGV2aWNlOworCS8qKiB2MTogcGxheWJhY2sgUENNIGNvbm5lY3RlZCB0byBtaXhlciBkZXZpY2UgKE5VTEwgPT0gbm9uZSkgKi8KKwlzbmRfcGNtX3QgKnBsYXliYWNrX3BjbTsKKwkvKiogdjE6IGNhcHR1cmUgUENNIGNvbm5lY3RlZCB0byBtaXhlciBkZXZpY2UgKE5VTEwgPT0gbm9uZSkgKi8KKwlzbmRfcGNtX3QgKmNhcHR1cmVfcGNtOworfTsKKworLyoqIE1peGVyIHNpbXBsZSBlbGVtZW50IGlkZW50aWZpZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfbWl4ZXJfc2VsZW1faWQgc25kX21peGVyX3NlbGVtX2lkX3Q7CisKK2NvbnN0IGNoYXIgKnNuZF9taXhlcl9zZWxlbV9jaGFubmVsX25hbWUoc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsKTsKKworaW50IHNuZF9taXhlcl9zZWxlbV9yZWdpc3RlcihzbmRfbWl4ZXJfdCAqbWl4ZXIsCisJCQkgICAgIHN0cnVjdCBzbmRfbWl4ZXJfc2VsZW1fcmVnb3B0ICpvcHRpb25zLAorCQkJICAgICBzbmRfbWl4ZXJfY2xhc3NfdCAqKmNsYXNzcCk7Cit2b2lkIHNuZF9taXhlcl9zZWxlbV9nZXRfaWQoc25kX21peGVyX2VsZW1fdCAqZWxlbWVudCwKKwkJCSAgICBzbmRfbWl4ZXJfc2VsZW1faWRfdCAqaWQpOworY29uc3QgY2hhciAqc25kX21peGVyX3NlbGVtX2dldF9uYW1lKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOwordW5zaWduZWQgaW50IHNuZF9taXhlcl9zZWxlbV9nZXRfaW5kZXgoc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitzbmRfbWl4ZXJfZWxlbV90ICpzbmRfbWl4ZXJfZmluZF9zZWxlbShzbmRfbWl4ZXJfdCAqbWl4ZXIsCisJCQkJICAgICAgIGNvbnN0IHNuZF9taXhlcl9zZWxlbV9pZF90ICppZCk7CisKK2ludCBzbmRfbWl4ZXJfc2VsZW1faXNfYWN0aXZlKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworaW50IHNuZF9taXhlcl9zZWxlbV9pc19wbGF5YmFja19tb25vKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworaW50IHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfY2hhbm5lbChzbmRfbWl4ZXJfZWxlbV90ICpvYmosIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCk7CitpbnQgc25kX21peGVyX3NlbGVtX2lzX2NhcHR1cmVfbW9ubyhzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfY2hhbm5lbChzbmRfbWl4ZXJfZWxlbV90ICpvYmosIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCk7CitpbnQgc25kX21peGVyX3NlbGVtX2dldF9jYXB0dXJlX2dyb3VwKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworaW50IHNuZF9taXhlcl9zZWxlbV9oYXNfY29tbW9uX3ZvbHVtZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX3ZvbHVtZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX3ZvbHVtZV9qb2luZWQoc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3ZvbHVtZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfdm9sdW1lX2pvaW5lZChzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1faGFzX2NvbW1vbl9zd2l0Y2goc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3NlbGVtX2hhc19wbGF5YmFja19zd2l0Y2goc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3NlbGVtX2hhc19wbGF5YmFja19zd2l0Y2hfam9pbmVkKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworaW50IHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV9zd2l0Y2goc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3N3aXRjaF9qb2luZWQoc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3N3aXRjaF9leGNsdXNpdmUoc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CisKK2ludCBzbmRfbWl4ZXJfc2VsZW1fYXNrX3BsYXliYWNrX3ZvbF9kQihzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBsb25nIHZhbHVlLCBsb25nICpkQnZhbHVlKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fYXNrX2NhcHR1cmVfdm9sX2RCKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGxvbmcgdmFsdWUsIGxvbmcgKmRCdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9hc2tfcGxheWJhY2tfZEJfdm9sKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGxvbmcgZEJ2YWx1ZSwgaW50IGRpciwgbG9uZyAqdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9hc2tfY2FwdHVyZV9kQl92b2woc25kX21peGVyX2VsZW1fdCAqZWxlbSwgbG9uZyBkQnZhbHVlLCBpbnQgZGlyLCBsb25nICp2YWx1ZSk7CitpbnQgc25kX21peGVyX3NlbGVtX2dldF9wbGF5YmFja192b2x1bWUoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCBsb25nICp2YWx1ZSk7CitpbnQgc25kX21peGVyX3NlbGVtX2dldF9jYXB0dXJlX3ZvbHVtZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIGxvbmcgKnZhbHVlKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX2RCKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgbG9uZyAqdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9nZXRfY2FwdHVyZV9kQihzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIGxvbmcgKnZhbHVlKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX3N3aXRjaChzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIGludCAqdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9nZXRfY2FwdHVyZV9zd2l0Y2goc25kX21peGVyX2VsZW1fdCAqZWxlbSwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCBpbnQgKnZhbHVlKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fc2V0X3BsYXliYWNrX3ZvbHVtZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIGxvbmcgdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9zZXRfY2FwdHVyZV92b2x1bWUoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCBsb25nIHZhbHVlKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fc2V0X3BsYXliYWNrX2RCKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgbG9uZyB2YWx1ZSwgaW50IGRpcik7CitpbnQgc25kX21peGVyX3NlbGVtX3NldF9jYXB0dXJlX2RCKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgbG9uZyB2YWx1ZSwgaW50IGRpcik7CitpbnQgc25kX21peGVyX3NlbGVtX3NldF9wbGF5YmFja192b2x1bWVfYWxsKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGxvbmcgdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9zZXRfY2FwdHVyZV92b2x1bWVfYWxsKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGxvbmcgdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9zZXRfcGxheWJhY2tfZEJfYWxsKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGxvbmcgdmFsdWUsIGludCBkaXIpOworaW50IHNuZF9taXhlcl9zZWxlbV9zZXRfY2FwdHVyZV9kQl9hbGwoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgbG9uZyB2YWx1ZSwgaW50IGRpcik7CitpbnQgc25kX21peGVyX3NlbGVtX3NldF9wbGF5YmFja19zd2l0Y2goc25kX21peGVyX2VsZW1fdCAqZWxlbSwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCBpbnQgdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9zZXRfY2FwdHVyZV9zd2l0Y2goc25kX21peGVyX2VsZW1fdCAqZWxlbSwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCBpbnQgdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9zZXRfcGxheWJhY2tfc3dpdGNoX2FsbChzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBpbnQgdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9zZXRfY2FwdHVyZV9zd2l0Y2hfYWxsKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGludCB2YWx1ZSk7CitpbnQgc25kX21peGVyX3NlbGVtX2dldF9wbGF5YmFja192b2x1bWVfcmFuZ2Uoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgCisJCQkJCSAgICAgIGxvbmcgKm1pbiwgbG9uZyAqbWF4KTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX2RCX3JhbmdlKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIAorCQkJCQkgIGxvbmcgKm1pbiwgbG9uZyAqbWF4KTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fc2V0X3BsYXliYWNrX3ZvbHVtZV9yYW5nZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCAKKwkJCQkJICAgICAgbG9uZyBtaW4sIGxvbmcgbWF4KTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fZ2V0X2NhcHR1cmVfdm9sdW1lX3JhbmdlKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIAorCQkJCQkgICAgIGxvbmcgKm1pbiwgbG9uZyAqbWF4KTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fZ2V0X2NhcHR1cmVfZEJfcmFuZ2Uoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgCisJCQkJCSBsb25nICptaW4sIGxvbmcgKm1heCk7CitpbnQgc25kX21peGVyX3NlbGVtX3NldF9jYXB0dXJlX3ZvbHVtZV9yYW5nZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCAKKwkJCQkJICAgICBsb25nIG1pbiwgbG9uZyBtYXgpOworCitpbnQgc25kX21peGVyX3NlbGVtX2lzX2VudW1lcmF0ZWQoc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3NlbGVtX2lzX2VudW1fcGxheWJhY2soc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3NlbGVtX2lzX2VudW1fY2FwdHVyZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fZ2V0X2VudW1faXRlbXMoc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3NlbGVtX2dldF9lbnVtX2l0ZW1fbmFtZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCB1bnNpZ25lZCBpbnQgaWR4LCBzaXplX3QgbWF4bGVuLCBjaGFyICpzdHIpOworaW50IHNuZF9taXhlcl9zZWxlbV9nZXRfZW51bV9pdGVtKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgdW5zaWduZWQgaW50ICppZHhwKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fc2V0X2VudW1faXRlbShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIHVuc2lnbmVkIGludCBpZHgpOworCitzaXplX3Qgc25kX21peGVyX3NlbGVtX2lkX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gaW52YWxpZCAjc25kX21peGVyX3NlbGVtX2lkX3QgdXNpbmcgc3RhbmRhcmQgYWxsb2NhCisgKiBccGFyYW0gcHRyIHJldHVybmVkIHBvaW50ZXIKKyAqLworI2RlZmluZSBzbmRfbWl4ZXJfc2VsZW1faWRfYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX21peGVyX3NlbGVtX2lkKQoraW50IHNuZF9taXhlcl9zZWxlbV9pZF9tYWxsb2Moc25kX21peGVyX3NlbGVtX2lkX3QgKipwdHIpOwordm9pZCBzbmRfbWl4ZXJfc2VsZW1faWRfZnJlZShzbmRfbWl4ZXJfc2VsZW1faWRfdCAqb2JqKTsKK3ZvaWQgc25kX21peGVyX3NlbGVtX2lkX2NvcHkoc25kX21peGVyX3NlbGVtX2lkX3QgKmRzdCwgY29uc3Qgc25kX21peGVyX3NlbGVtX2lkX3QgKnNyYyk7Citjb25zdCBjaGFyICpzbmRfbWl4ZXJfc2VsZW1faWRfZ2V0X25hbWUoY29uc3Qgc25kX21peGVyX3NlbGVtX2lkX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX21peGVyX3NlbGVtX2lkX2dldF9pbmRleChjb25zdCBzbmRfbWl4ZXJfc2VsZW1faWRfdCAqb2JqKTsKK3ZvaWQgc25kX21peGVyX3NlbGVtX2lkX3NldF9uYW1lKHNuZF9taXhlcl9zZWxlbV9pZF90ICpvYmosIGNvbnN0IGNoYXIgKnZhbCk7Cit2b2lkIHNuZF9taXhlcl9zZWxlbV9pZF9zZXRfaW5kZXgoc25kX21peGVyX3NlbGVtX2lkX3QgKm9iaiwgdW5zaWduZWQgaW50IHZhbCk7CisKKy8qKiBcfSAqLworCisvKiogXH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQUxTQV9NSVhFUl9IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9taXhlcl9hYnN0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvbWl4ZXJfYWJzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NDRiMTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvbWl4ZXJfYWJzdC5oCkBAIC0wLDAgKzEsMTEyIEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvbWl4ZXJfYWJzdC5oCisgKiBcYnJpZWYgTWl4ZXIgYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGxpYnJhcnkKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxkYXRlIDIwMDUKKyAqCisgKiBNaXhlciBhYnN0YWN0IGltcGxlbWVudGF0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBsaWJyYXJ5CisgKi8KKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfTUlYRVJfQUJTVF9ICisjZGVmaW5lIF9fQUxTQV9NSVhFUl9BQlNUX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqICBcZGVmZ3JvdXAgTWl4ZXJfQWJzdHJhY3QgTWl4ZXIgQWJzdGFjdCBNb2R1bGUgSW50ZXJmYWNlCisgKiAgVGhlIG1peGVyIGFic3RhY3QgbW9kdWxlIGludGVyZmFjZS4KKyAqICBceworICovCisKKyNkZWZpbmUJU01fUExBWQkJCTAKKyNkZWZpbmUgU01fQ0FQVAkJCTEKKworI2RlZmluZSBTTV9DQVBfR1ZPTFVNRQkJKDE8PDEpCisjZGVmaW5lIFNNX0NBUF9HU1dJVENICQkoMTw8MikKKyNkZWZpbmUgU01fQ0FQX1BWT0xVTUUJCSgxPDwzKQorI2RlZmluZSBTTV9DQVBfUFZPTFVNRV9KT0lOCSgxPDw0KQorI2RlZmluZSBTTV9DQVBfUFNXSVRDSAkJKDE8PDUpIAorI2RlZmluZSBTTV9DQVBfUFNXSVRDSF9KT0lOCSgxPDw2KSAKKyNkZWZpbmUgU01fQ0FQX0NWT0xVTUUJCSgxPDw3KSAKKyNkZWZpbmUgU01fQ0FQX0NWT0xVTUVfSk9JTgkoMTw8OCkgCisjZGVmaW5lIFNNX0NBUF9DU1dJVENICQkoMTw8OSkgCisjZGVmaW5lIFNNX0NBUF9DU1dJVENIX0pPSU4JKDE8PDEwKQorI2RlZmluZSBTTV9DQVBfQ1NXSVRDSF9FWENMCSgxPDwxMSkKKyNkZWZpbmUgU01fQ0FQX1BFTlVNCQkoMTw8MTIpCisjZGVmaW5lIFNNX0NBUF9DRU5VTQkJKDE8PDEzKQorLyogU01fQ0FQXyogMjQtMzEgPT4gcHJpdmF0ZSBmb3IgbW9kdWxlIHVzZSAqLworCisjZGVmaW5lIFNNX09QU19JU19BQ1RJVkUJMAorI2RlZmluZSBTTV9PUFNfSVNfTU9OTwkJMQorI2RlZmluZSBTTV9PUFNfSVNfQ0hBTk5FTAkyCisjZGVmaW5lIFNNX09QU19JU19FTlVNRVJBVEVECTMKKyNkZWZpbmUgU01fT1BTX0lTX0VOVU1DTlQJNAorCisjZGVmaW5lIHNtX3NlbGVtKHgpCQkoKHNtX3NlbGVtX3QgKikoKHgpLT5wcml2YXRlX2RhdGEpKQorI2RlZmluZSBzbV9zZWxlbV9vcHMoeCkJCSgoc21fc2VsZW1fdCAqKSgoeCktPnByaXZhdGVfZGF0YSkpLT5vcHMKKwordHlwZWRlZiBzdHJ1Y3QgX3NtX3NlbGVtIHsKKwlzbmRfbWl4ZXJfc2VsZW1faWRfdCAqaWQ7CisJc3RydWN0IHNtX2VsZW1fb3BzICpvcHM7CisJdW5zaWduZWQgaW50IGNhcHM7CisJdW5zaWduZWQgaW50IGNhcHR1cmVfZ3JvdXA7Cit9IHNtX3NlbGVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9zbV9jbGFzc19iYXNpYyB7CisJY2hhciAqZGV2aWNlOworCXNuZF9jdGxfdCAqY3RsOworCXNuZF9oY3RsX3QgKmhjdGw7CisJc25kX2N0bF9jYXJkX2luZm9fdCAqaW5mbzsKK30gc21fY2xhc3NfYmFzaWNfdDsKKworc3RydWN0IHNtX2VsZW1fb3BzIHsJCisJaW50ICgqaXMpKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGludCBkaXIsIGludCBjbWQsIGludCB2YWwpOworCWludCAoKmdldF9yYW5nZSkoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgaW50IGRpciwgbG9uZyAqbWluLCBsb25nICptYXgpOworCWludCAoKnNldF9yYW5nZSkoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgaW50IGRpciwgbG9uZyBtaW4sIGxvbmcgbWF4KTsKKwlpbnQgKCpnZXRfZEJfcmFuZ2UpKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGludCBkaXIsIGxvbmcgKm1pbiwgbG9uZyAqbWF4KTsKKwlpbnQgKCphc2tfdm9sX2RCKShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBpbnQgZGlyLCBsb25nIHZhbHVlLCBsb25nICpkYlZhbHVlKTsKKwlpbnQgKCphc2tfZEJfdm9sKShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBpbnQgZGlyLCBsb25nIGRiVmFsdWUsIGxvbmcgKnZhbHVlLCBpbnQgeGRpcik7CisJaW50ICgqZ2V0X3ZvbHVtZSkoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgaW50IGRpciwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCBsb25nICp2YWx1ZSk7CisJaW50ICgqZ2V0X2RCKShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBpbnQgZGlyLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIGxvbmcgKnZhbHVlKTsKKwlpbnQgKCpzZXRfdm9sdW1lKShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBpbnQgZGlyLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIGxvbmcgdmFsdWUpOworCWludCAoKnNldF9kQikoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgaW50IGRpciwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCBsb25nIHZhbHVlLCBpbnQgeGRpcik7CisJaW50ICgqZ2V0X3N3aXRjaCkoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgaW50IGRpciwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCBpbnQgKnZhbHVlKTsKKwlpbnQgKCpzZXRfc3dpdGNoKShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBpbnQgZGlyLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIGludCB2YWx1ZSk7CisJaW50ICgqZW51bV9pdGVtX25hbWUpKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHVuc2lnbmVkIGludCBpdGVtLCBzaXplX3QgbWF4bGVuLCBjaGFyICpidWYpOworCWludCAoKmdldF9lbnVtX2l0ZW0pKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgdW5zaWduZWQgaW50ICppdGVtcCk7CisJaW50ICgqc2V0X2VudW1faXRlbSkoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgaXRlbSk7Cit9OworCitpbnQgc25kX21peGVyX3NlbGVtX2NvbXBhcmUoY29uc3Qgc25kX21peGVyX2VsZW1fdCAqYzEsIGNvbnN0IHNuZF9taXhlcl9lbGVtX3QgKmMyKTsKKworaW50IHNuZF9taXhlcl9zYmFzaWNfaW5mbyhjb25zdCBzbmRfbWl4ZXJfY2xhc3NfdCAqY2xhc3MsIHNtX2NsYXNzX2Jhc2ljX3QgKmluZm8pOwordm9pZCAqc25kX21peGVyX3NiYXNpY19nZXRfcHJpdmF0ZShjb25zdCBzbmRfbWl4ZXJfY2xhc3NfdCAqY2xhc3MpOwordm9pZCBzbmRfbWl4ZXJfc2Jhc2ljX3NldF9wcml2YXRlKGNvbnN0IHNuZF9taXhlcl9jbGFzc190ICpjbGFzcywgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKK3ZvaWQgc25kX21peGVyX3NiYXNpY19zZXRfcHJpdmF0ZV9mcmVlKGNvbnN0IHNuZF9taXhlcl9jbGFzc190ICpjbGFzcywgdm9pZCAoKnByaXZhdGVfZnJlZSkoc25kX21peGVyX2NsYXNzX3QgKmNsYXNzKSk7CisKKy8qKiBcfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19BTFNBX01JWEVSX0FCU1RfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evb3V0cHV0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evb3V0cHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI3OWFhMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9vdXRwdXQuaApAQCAtMCwwICsxLDg2IEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvb3V0cHV0LmgKKyAqIFxicmllZiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKiBcYXV0aG9yIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKiBcYXV0aG9yIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMTk5OC0yMDAxCisgKgorICogQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICovCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX09VVFBVVF9ICisjZGVmaW5lIF9fQUxTQV9PVVRQVVRfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBPdXRwdXQgT3V0cHV0IEludGVyZmFjZQorICoKKyAqICBUaGUgb3V0cHV0IGZ1bmN0aW9ucyBwcmVzZW50IGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoZSBzdGRpbyBmdW5jdGlvbnMKKyAqICBvbiB0b3Agb2YgZGlmZmVyZW50IHVuZGVybHlpbmcgb3V0cHV0IGRlc3RpbmF0aW9ucy4KKyAqCisgKiAgTWFueSBQQ00gZGVidWdnaW5nIGZ1bmN0aW9ucyAoXGMgc25kX3BjbV94eHhfZHVtcF94eHgpIHVzZSBzdWNoIGFuIG91dHB1dAorICogIGhhbmRsZSB0byBiZSBhYmxlIHRvIHdyaXRlIG5vdCBvbmx5IHRvIHRoZSBzY3JlZW4gYnV0IGFsc28gdG8gb3RoZXIKKyAqICBkZXN0aW5hdGlvbnMsIGUuZy4gdG8gZmlsZXMgb3IgdG8gbWVtb3J5IGJ1ZmZlcnMuCisgKgorICogIFx7CisgKi8KKworLyoqCisgKiBcYnJpZWYgSW50ZXJuYWwgc3RydWN0dXJlIGZvciBhbiBvdXRwdXQgb2JqZWN0LgorICoKKyAqIFRoZSBBTFNBIGxpYnJhcnkgdXNlcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUgYXMgYSBoYW5kbGUgdG8gYW4KKyAqIG91dHB1dCBvYmplY3QuIEFwcGxpY2F0aW9ucyBkb24ndCBhY2Nlc3MgaXRzIGNvbnRlbnRzIGRpcmVjdGx5LgorICovCit0eXBlZGVmIHN0cnVjdCBfc25kX291dHB1dCBzbmRfb3V0cHV0X3Q7CisKKy8qKiBPdXRwdXQgdHlwZS4gKi8KK3R5cGVkZWYgZW51bSBfc25kX291dHB1dF90eXBlIHsKKwkvKiogT3V0cHV0IHRvIGEgc3RkaW8gc3RyZWFtLiAqLworCVNORF9PVVRQVVRfU1RESU8sCisJLyoqIE91dHB1dCB0byBhIG1lbW9yeSBidWZmZXIuICovCisJU05EX09VVFBVVF9CVUZGRVIKK30gc25kX291dHB1dF90eXBlX3Q7CisKK2ludCBzbmRfb3V0cHV0X3N0ZGlvX29wZW4oc25kX291dHB1dF90ICoqb3V0cHV0cCwgY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqbW9kZSk7CitpbnQgc25kX291dHB1dF9zdGRpb19hdHRhY2goc25kX291dHB1dF90ICoqb3V0cHV0cCwgRklMRSAqZnAsIGludCBfY2xvc2UpOworaW50IHNuZF9vdXRwdXRfYnVmZmVyX29wZW4oc25kX291dHB1dF90ICoqb3V0cHV0cCk7CitzaXplX3Qgc25kX291dHB1dF9idWZmZXJfc3RyaW5nKHNuZF9vdXRwdXRfdCAqb3V0cHV0LCBjaGFyICoqYnVmKTsKK2ludCBzbmRfb3V0cHV0X2Nsb3NlKHNuZF9vdXRwdXRfdCAqb3V0cHV0KTsKK2ludCBzbmRfb3V0cHV0X3ByaW50ZihzbmRfb3V0cHV0X3QgKm91dHB1dCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisjaWZuZGVmIERPQ19ISURERU4KKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSkKKyNlbmRpZgorCTsKK2ludCBzbmRfb3V0cHV0X3ZwcmludGYoc25kX291dHB1dF90ICpvdXRwdXQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKTsKK2ludCBzbmRfb3V0cHV0X3B1dHMoc25kX291dHB1dF90ICpvdXRwdXQsIGNvbnN0IGNoYXIgKnN0cik7CitpbnQgc25kX291dHB1dF9wdXRjKHNuZF9vdXRwdXRfdCAqb3V0cHV0LCBpbnQgYyk7CitpbnQgc25kX291dHB1dF9mbHVzaChzbmRfb3V0cHV0X3QgKm91dHB1dCk7CisKKy8qKiBcfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19BTFNBX09VVFBVVF9IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY20uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTk3NTU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbS5oCkBAIC0wLDAgKzEsMTE2MCBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL3BjbS5oCisgKiBcYnJpZWYgQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICogXGF1dGhvciBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogXGF1dGhvciBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKiBcYXV0aG9yIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqIFxkYXRlIDE5OTgtMjAwMQorICoKKyAqIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIuCisgKiBTZWUgdGhlIFxyZWYgcGNtIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworLyoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQUxTQV9QQ01fSAorI2RlZmluZSBfX0FMU0FfUENNX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqICBcZGVmZ3JvdXAgUENNIFBDTSBJbnRlcmZhY2UKKyAqICBTZWUgdGhlIFxyZWYgcGNtIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqICBceworICovCisKKy8qKiBkbHN5bSB2ZXJzaW9uIGZvciBpbnRlcmZhY2UgZW50cnkgY2FsbGJhY2sgKi8KKyNkZWZpbmUgU05EX1BDTV9ETFNZTV9WRVJTSU9OCQlfZGxzeW1fcGNtXzAwMQorCisvKiogUENNIGdlbmVyaWMgaW5mbyBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfcGNtX2luZm8gc25kX3BjbV9pbmZvX3Q7CisKKy8qKiBQQ00gaGFyZHdhcmUgY29uZmlndXJhdGlvbiBzcGFjZSBjb250YWluZXIKKyAqCisgKiAgc25kX3BjbV9od19wYXJhbXNfdCBpcyBhbiBvcGFxdWUgc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIGEgc2V0IG9mIHBvc3NpYmxlCisgKiAgUENNIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb25zLiBGb3IgZXhhbXBsZSwgYSBnaXZlbiBpbnN0YW5jZSBtaWdodCBpbmNsdWRlIGEKKyAqICByYW5nZSBvZiBidWZmZXIgc2l6ZXMsIGEgcmFuZ2Ugb2YgcGVyaW9kIHNpemVzLCBhbmQgYSBzZXQgb2Ygc2V2ZXJhbCBzYW1wbGUKKyAqICBmb3JtYXRzLiBTb21lIHN1YnNldCBvZiBhbGwgcG9zc2libGUgY29tYmluYXRpb25zIHRoZXNlIHNldHMgbWF5IGJlIHZhbGlkLAorICogIGJ1dCBub3QgbmVjZXNzYXJpbHkgYW55IGNvbWJpbmF0aW9uIHdpbGwgYmUgdmFsaWQuCisgKgorICogIFdoZW4gYSBwYXJhbWV0ZXIgaXMgc2V0IG9yIHJlc3RyaWN0ZWQgdXNpbmcgYSBzbmRfcGNtX2h3X3BhcmFtc19zZXQqCisgKiAgZnVuY3Rpb24sIGFsbCBvZiB0aGUgb3RoZXIgcmFuZ2VzIHdpbGwgYmUgdXBkYXRlZCB0byBleGNsdWRlIGFzIG1hbnkKKyAqICBpbXBvc3NpYmxlIGNvbmZpZ3VyYXRpb25zIGFzIHBvc3NpYmxlLiBBdHRlbXB0aW5nIHRvIHNldCBhIHBhcmFtZXRlcgorICogIG91dHNpZGUgb2YgaXRzIGFjY2VwdGFibGUgcmFuZ2Ugd2lsbCByZXN1bHQgaW4gdGhlIGZ1bmN0aW9uIGZhaWxpbmcKKyAqICBhbmQgYW4gZXJyb3IgY29kZSBiZWluZyByZXR1cm5lZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9wY21faHdfcGFyYW1zIHNuZF9wY21faHdfcGFyYW1zX3Q7CisKKy8qKiBQQ00gc29mdHdhcmUgY29uZmlndXJhdGlvbiBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfcGNtX3N3X3BhcmFtcyBzbmRfcGNtX3N3X3BhcmFtc190OworLyoqIFBDTSBzdGF0dXMgY29udGFpbmVyICovCisgdHlwZWRlZiBzdHJ1Y3QgX3NuZF9wY21fc3RhdHVzIHNuZF9wY21fc3RhdHVzX3Q7CisvKiogUENNIGFjY2VzcyB0eXBlcyBtYXNrICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3BjbV9hY2Nlc3NfbWFzayBzbmRfcGNtX2FjY2Vzc19tYXNrX3Q7CisvKiogUENNIGZvcm1hdHMgbWFzayAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9wY21fZm9ybWF0X21hc2sgc25kX3BjbV9mb3JtYXRfbWFza190OworLyoqIFBDTSBzdWJmb3JtYXRzIG1hc2sgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfcGNtX3N1YmZvcm1hdF9tYXNrIHNuZF9wY21fc3ViZm9ybWF0X21hc2tfdDsKKworLyoqIFBDTSBjbGFzcyAqLwordHlwZWRlZiBlbnVtIF9zbmRfcGNtX2NsYXNzIHsKKwkvKiogc3RhbmRhcmQgZGV2aWNlICovCisKKwlTTkRfUENNX0NMQVNTX0dFTkVSSUMgPSAwLAorCS8qKiBtdWx0aWNoYW5uZWwgZGV2aWNlICovCisJU05EX1BDTV9DTEFTU19NVUxUSSwKKwkvKiogc29mdHdhcmUgbW9kZW0gZGV2aWNlICovCisJU05EX1BDTV9DTEFTU19NT0RFTSwKKwkvKiogZGlnaXRpemVyIGRldmljZSAqLworCVNORF9QQ01fQ0xBU1NfRElHSVRJWkVSLAorCVNORF9QQ01fQ0xBU1NfTEFTVCA9IFNORF9QQ01fQ0xBU1NfRElHSVRJWkVSCit9IHNuZF9wY21fY2xhc3NfdDsKKworLyoqIFBDTSBzdWJjbGFzcyAqLwordHlwZWRlZiBlbnVtIF9zbmRfcGNtX3N1YmNsYXNzIHsKKwkvKiogc3ViZGV2aWNlcyBhcmUgbWl4ZWQgdG9nZXRoZXIgKi8KKwlTTkRfUENNX1NVQkNMQVNTX0dFTkVSSUNfTUlYID0gMCwKKwkvKiogbXVsdGljaGFubmVsIHN1YmRldmljZXMgYXJlIG1peGVkIHRvZ2V0aGVyICovCisJU05EX1BDTV9TVUJDTEFTU19NVUxUSV9NSVgsCisJU05EX1BDTV9TVUJDTEFTU19MQVNUID0gU05EX1BDTV9TVUJDTEFTU19NVUxUSV9NSVgKK30gc25kX3BjbV9zdWJjbGFzc190OworCisvKiogUENNIHN0cmVhbSAoZGlyZWN0aW9uKSAqLwordHlwZWRlZiBlbnVtIF9zbmRfcGNtX3N0cmVhbSB7CisJLyoqIFBsYXliYWNrIHN0cmVhbSAqLworCVNORF9QQ01fU1RSRUFNX1BMQVlCQUNLID0gMCwKKwkvKiogQ2FwdHVyZSBzdHJlYW0gKi8KKwlTTkRfUENNX1NUUkVBTV9DQVBUVVJFLAorCVNORF9QQ01fU1RSRUFNX0xBU1QgPSBTTkRfUENNX1NUUkVBTV9DQVBUVVJFCit9IHNuZF9wY21fc3RyZWFtX3Q7CisKKy8qKiBQQ00gYWNjZXNzIHR5cGUgKi8KK3R5cGVkZWYgZW51bSBfc25kX3BjbV9hY2Nlc3MgeworCS8qKiBtbWFwIGFjY2VzcyB3aXRoIHNpbXBsZSBpbnRlcmxlYXZlZCBjaGFubmVscyAqLworCVNORF9QQ01fQUNDRVNTX01NQVBfSU5URVJMRUFWRUQgPSAwLAorCS8qKiBtbWFwIGFjY2VzcyB3aXRoIHNpbXBsZSBub24gaW50ZXJsZWF2ZWQgY2hhbm5lbHMgKi8KKwlTTkRfUENNX0FDQ0VTU19NTUFQX05PTklOVEVSTEVBVkVELAorCS8qKiBtbWFwIGFjY2VzcyB3aXRoIGNvbXBsZXggcGxhY2VtZW50ICovCisJU05EX1BDTV9BQ0NFU1NfTU1BUF9DT01QTEVYLAorCS8qKiBzbmRfcGNtX3JlYWRpL3NuZF9wY21fd3JpdGVpIGFjY2VzcyAqLworCVNORF9QQ01fQUNDRVNTX1JXX0lOVEVSTEVBVkVELAorCS8qKiBzbmRfcGNtX3JlYWRuL3NuZF9wY21fd3JpdGVuIGFjY2VzcyAqLworCVNORF9QQ01fQUNDRVNTX1JXX05PTklOVEVSTEVBVkVELAorCVNORF9QQ01fQUNDRVNTX0xBU1QgPSBTTkRfUENNX0FDQ0VTU19SV19OT05JTlRFUkxFQVZFRAorfSBzbmRfcGNtX2FjY2Vzc190OworCisvKiogUENNIHNhbXBsZSBmb3JtYXQgKi8KK3R5cGVkZWYgZW51bSBfc25kX3BjbV9mb3JtYXQgeworCS8qKiBVbmtub3duICovCisJU05EX1BDTV9GT1JNQVRfVU5LTk9XTiA9IC0xLAorCS8qKiBTaWduZWQgOCBiaXQgKi8KKwlTTkRfUENNX0ZPUk1BVF9TOCA9IDAsCisJLyoqIFVuc2lnbmVkIDggYml0ICovCisJU05EX1BDTV9GT1JNQVRfVTgsCisJLyoqIFNpZ25lZCAxNiBiaXQgTGl0dGxlIEVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX1MxNl9MRSwKKwkvKiogU2lnbmVkIDE2IGJpdCBCaWcgRW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfUzE2X0JFLAorCS8qKiBVbnNpZ25lZCAxNiBiaXQgTGl0dGxlIEVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX1UxNl9MRSwKKwkvKiogVW5zaWduZWQgMTYgYml0IEJpZyBFbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9VMTZfQkUsCisJLyoqIFNpZ25lZCAyNCBiaXQgTGl0dGxlIEVuZGlhbiB1c2luZyBsb3cgdGhyZWUgYnl0ZXMgaW4gMzItYml0IHdvcmQgKi8KKwlTTkRfUENNX0ZPUk1BVF9TMjRfTEUsCisJLyoqIFNpZ25lZCAyNCBiaXQgQmlnIEVuZGlhbiB1c2luZyBsb3cgdGhyZWUgYnl0ZXMgaW4gMzItYml0IHdvcmQgKi8KKwlTTkRfUENNX0ZPUk1BVF9TMjRfQkUsCisJLyoqIFVuc2lnbmVkIDI0IGJpdCBMaXR0bGUgRW5kaWFuIHVzaW5nIGxvdyB0aHJlZSBieXRlcyBpbiAzMi1iaXQgd29yZCAqLworCVNORF9QQ01fRk9STUFUX1UyNF9MRSwKKwkvKiogVW5zaWduZWQgMjQgYml0IEJpZyBFbmRpYW4gdXNpbmcgbG93IHRocmVlIGJ5dGVzIGluIDMyLWJpdCB3b3JkICovCisJU05EX1BDTV9GT1JNQVRfVTI0X0JFLAorCS8qKiBTaWduZWQgMzIgYml0IExpdHRsZSBFbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9TMzJfTEUsCisJLyoqIFNpZ25lZCAzMiBiaXQgQmlnIEVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX1MzMl9CRSwKKwkvKiogVW5zaWduZWQgMzIgYml0IExpdHRsZSBFbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9VMzJfTEUsCisJLyoqIFVuc2lnbmVkIDMyIGJpdCBCaWcgRW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfVTMyX0JFLAorCS8qKiBGbG9hdCAzMiBiaXQgTGl0dGxlIEVuZGlhbiwgUmFuZ2UgLTEuMCB0byAxLjAgKi8KKwlTTkRfUENNX0ZPUk1BVF9GTE9BVF9MRSwKKwkvKiogRmxvYXQgMzIgYml0IEJpZyBFbmRpYW4sIFJhbmdlIC0xLjAgdG8gMS4wICovCisJU05EX1BDTV9GT1JNQVRfRkxPQVRfQkUsCisJLyoqIEZsb2F0IDY0IGJpdCBMaXR0bGUgRW5kaWFuLCBSYW5nZSAtMS4wIHRvIDEuMCAqLworCVNORF9QQ01fRk9STUFUX0ZMT0FUNjRfTEUsCisJLyoqIEZsb2F0IDY0IGJpdCBCaWcgRW5kaWFuLCBSYW5nZSAtMS4wIHRvIDEuMCAqLworCVNORF9QQ01fRk9STUFUX0ZMT0FUNjRfQkUsCisJLyoqIElFQy05NTggTGl0dGxlIEVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX0lFQzk1OF9TVUJGUkFNRV9MRSwKKwkvKiogSUVDLTk1OCBCaWcgRW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfSUVDOTU4X1NVQkZSQU1FX0JFLAorCS8qKiBNdS1MYXcgKi8KKwlTTkRfUENNX0ZPUk1BVF9NVV9MQVcsCisJLyoqIEEtTGF3ICovCisJU05EX1BDTV9GT1JNQVRfQV9MQVcsCisJLyoqIEltYS1BRFBDTSAqLworCVNORF9QQ01fRk9STUFUX0lNQV9BRFBDTSwKKwkvKiogTVBFRyAqLworCVNORF9QQ01fRk9STUFUX01QRUcsCisJLyoqIEdTTSAqLworCVNORF9QQ01fRk9STUFUX0dTTSwKKwkvKiogU3BlY2lhbCAqLworCVNORF9QQ01fRk9STUFUX1NQRUNJQUwgPSAzMSwKKwkvKiogU2lnbmVkIDI0Yml0IExpdHRsZSBFbmRpYW4gaW4gM2J5dGVzIGZvcm1hdCAqLworCVNORF9QQ01fRk9STUFUX1MyNF8zTEUgPSAzMiwKKwkvKiogU2lnbmVkIDI0Yml0IEJpZyBFbmRpYW4gaW4gM2J5dGVzIGZvcm1hdCAqLworCVNORF9QQ01fRk9STUFUX1MyNF8zQkUsCisJLyoqIFVuc2lnbmVkIDI0Yml0IExpdHRsZSBFbmRpYW4gaW4gM2J5dGVzIGZvcm1hdCAqLworCVNORF9QQ01fRk9STUFUX1UyNF8zTEUsCisJLyoqIFVuc2lnbmVkIDI0Yml0IEJpZyBFbmRpYW4gaW4gM2J5dGVzIGZvcm1hdCAqLworCVNORF9QQ01fRk9STUFUX1UyNF8zQkUsCisJLyoqIFNpZ25lZCAyMGJpdCBMaXR0bGUgRW5kaWFuIGluIDNieXRlcyBmb3JtYXQgKi8KKwlTTkRfUENNX0ZPUk1BVF9TMjBfM0xFLAorCS8qKiBTaWduZWQgMjBiaXQgQmlnIEVuZGlhbiBpbiAzYnl0ZXMgZm9ybWF0ICovCisJU05EX1BDTV9GT1JNQVRfUzIwXzNCRSwKKwkvKiogVW5zaWduZWQgMjBiaXQgTGl0dGxlIEVuZGlhbiBpbiAzYnl0ZXMgZm9ybWF0ICovCisJU05EX1BDTV9GT1JNQVRfVTIwXzNMRSwKKwkvKiogVW5zaWduZWQgMjBiaXQgQmlnIEVuZGlhbiBpbiAzYnl0ZXMgZm9ybWF0ICovCisJU05EX1BDTV9GT1JNQVRfVTIwXzNCRSwKKwkvKiogU2lnbmVkIDE4Yml0IExpdHRsZSBFbmRpYW4gaW4gM2J5dGVzIGZvcm1hdCAqLworCVNORF9QQ01fRk9STUFUX1MxOF8zTEUsCisJLyoqIFNpZ25lZCAxOGJpdCBCaWcgRW5kaWFuIGluIDNieXRlcyBmb3JtYXQgKi8KKwlTTkRfUENNX0ZPUk1BVF9TMThfM0JFLAorCS8qKiBVbnNpZ25lZCAxOGJpdCBMaXR0bGUgRW5kaWFuIGluIDNieXRlcyBmb3JtYXQgKi8KKwlTTkRfUENNX0ZPUk1BVF9VMThfM0xFLAorCS8qKiBVbnNpZ25lZCAxOGJpdCBCaWcgRW5kaWFuIGluIDNieXRlcyBmb3JtYXQgKi8KKwlTTkRfUENNX0ZPUk1BVF9VMThfM0JFLAorCVNORF9QQ01fRk9STUFUX0xBU1QgPSBTTkRfUENNX0ZPUk1BVF9VMThfM0JFLAorCisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCS8qKiBTaWduZWQgMTYgYml0IENQVSBlbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9TMTYgPSBTTkRfUENNX0ZPUk1BVF9TMTZfTEUsCisJLyoqIFVuc2lnbmVkIDE2IGJpdCBDUFUgZW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfVTE2ID0gU05EX1BDTV9GT1JNQVRfVTE2X0xFLAorCS8qKiBTaWduZWQgMjQgYml0IENQVSBlbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9TMjQgPSBTTkRfUENNX0ZPUk1BVF9TMjRfTEUsCisJLyoqIFVuc2lnbmVkIDI0IGJpdCBDUFUgZW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfVTI0ID0gU05EX1BDTV9GT1JNQVRfVTI0X0xFLAorCS8qKiBTaWduZWQgMzIgYml0IENQVSBlbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9TMzIgPSBTTkRfUENNX0ZPUk1BVF9TMzJfTEUsCisJLyoqIFVuc2lnbmVkIDMyIGJpdCBDUFUgZW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfVTMyID0gU05EX1BDTV9GT1JNQVRfVTMyX0xFLAorCS8qKiBGbG9hdCAzMiBiaXQgQ1BVIGVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX0ZMT0FUID0gU05EX1BDTV9GT1JNQVRfRkxPQVRfTEUsCisJLyoqIEZsb2F0IDY0IGJpdCBDUFUgZW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfRkxPQVQ2NCA9IFNORF9QQ01fRk9STUFUX0ZMT0FUNjRfTEUsCisJLyoqIElFQy05NTggQ1BVIEVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX0lFQzk1OF9TVUJGUkFNRSA9IFNORF9QQ01fRk9STUFUX0lFQzk1OF9TVUJGUkFNRV9MRQorI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCS8qKiBTaWduZWQgMTYgYml0IENQVSBlbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9TMTYgPSBTTkRfUENNX0ZPUk1BVF9TMTZfQkUsCisJLyoqIFVuc2lnbmVkIDE2IGJpdCBDUFUgZW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfVTE2ID0gU05EX1BDTV9GT1JNQVRfVTE2X0JFLAorCS8qKiBTaWduZWQgMjQgYml0IENQVSBlbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9TMjQgPSBTTkRfUENNX0ZPUk1BVF9TMjRfQkUsCisJLyoqIFVuc2lnbmVkIDI0IGJpdCBDUFUgZW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfVTI0ID0gU05EX1BDTV9GT1JNQVRfVTI0X0JFLAorCS8qKiBTaWduZWQgMzIgYml0IENQVSBlbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9TMzIgPSBTTkRfUENNX0ZPUk1BVF9TMzJfQkUsCisJLyoqIFVuc2lnbmVkIDMyIGJpdCBDUFUgZW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfVTMyID0gU05EX1BDTV9GT1JNQVRfVTMyX0JFLAorCS8qKiBGbG9hdCAzMiBiaXQgQ1BVIGVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX0ZMT0FUID0gU05EX1BDTV9GT1JNQVRfRkxPQVRfQkUsCisJLyoqIEZsb2F0IDY0IGJpdCBDUFUgZW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfRkxPQVQ2NCA9IFNORF9QQ01fRk9STUFUX0ZMT0FUNjRfQkUsCisJLyoqIElFQy05NTggQ1BVIEVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX0lFQzk1OF9TVUJGUkFNRSA9IFNORF9QQ01fRk9STUFUX0lFQzk1OF9TVUJGUkFNRV9CRQorI2Vsc2UKKyNlcnJvciAiVW5rbm93biBlbmRpYW4iCisjZW5kaWYKK30gc25kX3BjbV9mb3JtYXRfdDsKKworLyoqIFBDTSBzYW1wbGUgc3ViZm9ybWF0ICovCit0eXBlZGVmIGVudW0gX3NuZF9wY21fc3ViZm9ybWF0IHsKKwkvKiogU3RhbmRhcmQgKi8KKwlTTkRfUENNX1NVQkZPUk1BVF9TVEQgPSAwLAorCVNORF9QQ01fU1VCRk9STUFUX0xBU1QgPSBTTkRfUENNX1NVQkZPUk1BVF9TVEQKK30gc25kX3BjbV9zdWJmb3JtYXRfdDsKKworLyoqIFBDTSBzdGF0ZSAqLwordHlwZWRlZiBlbnVtIF9zbmRfcGNtX3N0YXRlIHsKKwkvKiogT3BlbiAqLworCVNORF9QQ01fU1RBVEVfT1BFTiA9IDAsCisJLyoqIFNldHVwIGluc3RhbGxlZCAqLyAKKwlTTkRfUENNX1NUQVRFX1NFVFVQLAorCS8qKiBSZWFkeSB0byBzdGFydCAqLworCVNORF9QQ01fU1RBVEVfUFJFUEFSRUQsCisJLyoqIFJ1bm5pbmcgKi8KKwlTTkRfUENNX1NUQVRFX1JVTk5JTkcsCisJLyoqIFN0b3BwZWQ6IHVuZGVycnVuIChwbGF5YmFjaykgb3Igb3ZlcnJ1biAoY2FwdHVyZSkgZGV0ZWN0ZWQgKi8KKwlTTkRfUENNX1NUQVRFX1hSVU4sCisJLyoqIERyYWluaW5nOiBydW5uaW5nIChwbGF5YmFjaykgb3Igc3RvcHBlZCAoY2FwdHVyZSkgKi8KKwlTTkRfUENNX1NUQVRFX0RSQUlOSU5HLAorCS8qKiBQYXVzZWQgKi8KKwlTTkRfUENNX1NUQVRFX1BBVVNFRCwKKwkvKiogSGFyZHdhcmUgaXMgc3VzcGVuZGVkICovCisJU05EX1BDTV9TVEFURV9TVVNQRU5ERUQsCisJLyoqIEhhcmR3YXJlIGlzIGRpc2Nvbm5lY3RlZCAqLworCVNORF9QQ01fU1RBVEVfRElTQ09OTkVDVEVELAorCVNORF9QQ01fU1RBVEVfTEFTVCA9IFNORF9QQ01fU1RBVEVfRElTQ09OTkVDVEVECit9IHNuZF9wY21fc3RhdGVfdDsKKworLyoqIFBDTSBzdGFydCBtb2RlICovCit0eXBlZGVmIGVudW0gX3NuZF9wY21fc3RhcnQgeworCS8qKiBBdXRvbWF0aWMgc3RhcnQgb24gZGF0YSByZWFkL3dyaXRlICovCisJU05EX1BDTV9TVEFSVF9EQVRBID0gMCwKKwkvKiogRXhwbGljaXQgc3RhcnQgKi8KKwlTTkRfUENNX1NUQVJUX0VYUExJQ0lULAorCVNORF9QQ01fU1RBUlRfTEFTVCA9IFNORF9QQ01fU1RBUlRfRVhQTElDSVQKK30gc25kX3BjbV9zdGFydF90OworCisvKiogUENNIHhydW4gbW9kZSAqLwordHlwZWRlZiBlbnVtIF9zbmRfcGNtX3hydW4geworCS8qKiBYcnVuIGRldGVjdGlvbiBkaXNhYmxlZCAqLworCVNORF9QQ01fWFJVTl9OT05FID0gMCwKKwkvKiogU3RvcCBvbiB4cnVuIGRldGVjdGlvbiAqLworCVNORF9QQ01fWFJVTl9TVE9QLAorCVNORF9QQ01fWFJVTl9MQVNUID0gU05EX1BDTV9YUlVOX1NUT1AKK30gc25kX3BjbV94cnVuX3Q7CisKKy8qKiBQQ00gdGltZXN0YW1wIG1vZGUgKi8KK3R5cGVkZWYgZW51bSBfc25kX3BjbV90c3RhbXAgeworCS8qKiBObyB0aW1lc3RhbXAgKi8KKwlTTkRfUENNX1RTVEFNUF9OT05FID0gMCwKKwkvKiogVXBkYXRlIHRpbWVzdGFtcCBhdCBldmVyeSBoYXJkd2FyZSBwb3NpdGlvbiB1cGRhdGUgKi8KKwlTTkRfUENNX1RTVEFNUF9FTkFCTEUsCisJLyoqIEVxdWl2YWxlbnQgd2l0aCAjU05EX1BDTV9UU1RBTVBfRU5BQkxFLAorCSAqIGp1c3QgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucworCSAqLworCVNORF9QQ01fVFNUQU1QX01NQVAgPSBTTkRfUENNX1RTVEFNUF9FTkFCTEUsCisJU05EX1BDTV9UU1RBTVBfTEFTVCA9IFNORF9QQ01fVFNUQU1QX0VOQUJMRQorfSBzbmRfcGNtX3RzdGFtcF90OworCisvKiogVW5zaWduZWQgZnJhbWVzIHF1YW50aXR5ICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgc25kX3BjbV91ZnJhbWVzX3Q7CisvKiogU2lnbmVkIGZyYW1lcyBxdWFudGl0eSAqLwordHlwZWRlZiBsb25nIHNuZF9wY21fc2ZyYW1lc190OworCisvKiogTm9uIGJsb2NraW5nIG1vZGUgKGZsYWcgZm9yIG9wZW4gbW9kZSkgXGhpZGVpbml0aWFsaXplciAqLworI2RlZmluZSBTTkRfUENNX05PTkJMT0NLCQkweDAwMDAwMDAxCisvKiogQXN5bmMgbm90aWZpY2F0aW9uIChmbGFnIGZvciBvcGVuIG1vZGUpIFxoaWRlaW5pdGlhbGl6ZXIgKi8KKyNkZWZpbmUgU05EX1BDTV9BU1lOQwkJCTB4MDAwMDAwMDIKKy8qKiBEaXNhYmxlIGF1dG9tYXRpYyAoYnV0IG5vdCBmb3JjZWQhKSByYXRlIHJlc2FtcGxpbmlnICovCisjZGVmaW5lIFNORF9QQ01fTk9fQVVUT19SRVNBTVBMRQkweDAwMDEwMDAwCisvKiogRGlzYWJsZSBhdXRvbWF0aWMgKGJ1dCBub3QgZm9yY2VkISkgY2hhbm5lbCBjb252ZXJzaW9uICovCisjZGVmaW5lIFNORF9QQ01fTk9fQVVUT19DSEFOTkVMUwkweDAwMDIwMDAwCisvKiogRGlzYWJsZSBhdXRvbWF0aWMgKGJ1dCBub3QgZm9yY2VkISkgZm9ybWF0IGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgU05EX1BDTV9OT19BVVRPX0ZPUk1BVAkJMHgwMDA0MDAwMAorLyoqIERpc2FibGUgc29mdCB2b2x1bWUgY29udHJvbCAqLworI2RlZmluZSBTTkRfUENNX05PX1NPRlRWT0wJCTB4MDAwODAwMDAKKworLyoqIFBDTSBoYW5kbGUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfcGNtIHNuZF9wY21fdDsKKworLyoqIFBDTSB0eXBlICovCitlbnVtIF9zbmRfcGNtX3R5cGUgeworCS8qKiBLZXJuZWwgbGV2ZWwgUENNICovCisJU05EX1BDTV9UWVBFX0hXID0gMCwKKwkvKiogSG9va2VkIFBDTSAqLworCVNORF9QQ01fVFlQRV9IT09LUywKKwkvKiogT25lIG9yIG1vcmUgbGlua2VkIFBDTSB3aXRoIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gc2VsZWN0ZWQKKwkgICAgY2hhbm5lbHMgKi8KKwlTTkRfUENNX1RZUEVfTVVMVEksCisJLyoqIEZpbGUgd3JpdGluZyBwbHVnaW4gKi8KKwlTTkRfUENNX1RZUEVfRklMRSwKKwkvKiogTnVsbCBlbmRwb2ludCBQQ00gKi8KKwlTTkRfUENNX1RZUEVfTlVMTCwKKwkvKiogU2hhcmVkIG1lbW9yeSBjbGllbnQgUENNICovCisJU05EX1BDTV9UWVBFX1NITSwKKwkvKiogSU5FVCBjbGllbnQgUENNIChub3QgeWV0IGltcGxlbWVudGVkKSAqLworCVNORF9QQ01fVFlQRV9JTkVULAorCS8qKiBDb3B5aW5nIHBsdWdpbiAqLworCVNORF9QQ01fVFlQRV9DT1BZLAorCS8qKiBMaW5lYXIgZm9ybWF0IGNvbnZlcnNpb24gUENNICovCisJU05EX1BDTV9UWVBFX0xJTkVBUiwKKwkvKiogQS1MYXcgZm9ybWF0IGNvbnZlcnNpb24gUENNICovCisJU05EX1BDTV9UWVBFX0FMQVcsCisJLyoqIE11LUxhdyBmb3JtYXQgY29udmVyc2lvbiBQQ00gKi8KKwlTTkRfUENNX1RZUEVfTVVMQVcsCisJLyoqIElNQS1BRFBDTSBmb3JtYXQgY29udmVyc2lvbiBQQ00gKi8KKwlTTkRfUENNX1RZUEVfQURQQ00sCisJLyoqIFJhdGUgY29udmVyc2lvbiBQQ00gKi8KKwlTTkRfUENNX1RZUEVfUkFURSwKKwkvKiogQXR0ZW51YXRlZCBzdGF0aWMgcm91dGUgUENNICovCisJU05EX1BDTV9UWVBFX1JPVVRFLAorCS8qKiBGb3JtYXQgYWRqdXN0ZWQgUENNICovCisJU05EX1BDTV9UWVBFX1BMVUcsCisJLyoqIFNoYXJpbmcgUENNICovCisJU05EX1BDTV9UWVBFX1NIQVJFLAorCS8qKiBNZXRlciBwbHVnaW4gKi8KKwlTTkRfUENNX1RZUEVfTUVURVIsCisJLyoqIE1peGluZyBQQ00gKi8KKwlTTkRfUENNX1RZUEVfTUlYLAorCS8qKiBBdHRlbnVhdGVkIGR5bmFtaWMgcm91dGUgUENNIChub3QgeWV0IGltcGxlbWVudGVkKSAqLworCVNORF9QQ01fVFlQRV9EUk9VVEUsCisJLyoqIExvb3BiYWNrIHNlcnZlciBwbHVnaW4gKG5vdCB5ZXQgaW1wbGVtZW50ZWQpICovCisJU05EX1BDTV9UWVBFX0xCU0VSVkVSLAorCS8qKiBMaW5lYXIgSW50ZWdlciA8LT4gTGluZWFyIEZsb2F0IGZvcm1hdCBjb252ZXJzaW9uIFBDTSAqLworCVNORF9QQ01fVFlQRV9MSU5FQVJfRkxPQVQsCisJLyoqIExBRFNQQSBpbnRlZ3JhdGlvbiBwbHVnaW4gKi8KKwlTTkRfUENNX1RZUEVfTEFEU1BBLAorCS8qKiBEaXJlY3QgTWl4aW5nIHBsdWdpbiAqLworCVNORF9QQ01fVFlQRV9ETUlYLAorCS8qKiBKYWNrIEF1ZGlvIENvbm5lY3Rpb24gS2l0IHBsdWdpbiAqLworCVNORF9QQ01fVFlQRV9KQUNLLAorCS8qKiBEaXJlY3QgU25vb3BpbmcgcGx1Z2luICovCisJU05EX1BDTV9UWVBFX0RTTk9PUCwKKwkvKiogRGlyZWN0IFNoYXJpbmcgcGx1Z2luICovCisJU05EX1BDTV9UWVBFX0RTSEFSRSwKKwkvKiogSUVDOTU4IHN1YmZyYW1lIHBsdWdpbiAqLworCVNORF9QQ01fVFlQRV9JRUM5NTgsCisJLyoqIFNvZnQgdm9sdW1lIHBsdWdpbiAqLworCVNORF9QQ01fVFlQRV9TT0ZUVk9MLAorCS8qKiBFeHRlcm5hbCBJL08gcGx1Z2luICovCisJU05EX1BDTV9UWVBFX0lPUExVRywKKwkvKiogRXh0ZXJuYWwgZmlsdGVyIHBsdWdpbiAqLworCVNORF9QQ01fVFlQRV9FWFRQTFVHLAorCS8qKiBNbWFwLWVtdWxhdGlvbiBwbHVnaW4gKi8KKwlTTkRfUENNX1RZUEVfTU1BUF9FTVVMLAorCVNORF9QQ01fVFlQRV9MQVNUID0gU05EX1BDTV9UWVBFX01NQVBfRU1VTAorfTsKKworLyoqIFBDTSB0eXBlICovCit0eXBlZGVmIGVudW0gX3NuZF9wY21fdHlwZSBzbmRfcGNtX3R5cGVfdDsKKworLyoqIFBDTSBhcmVhIHNwZWNpZmljYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfcGNtX2NoYW5uZWxfYXJlYSB7CisJLyoqIGJhc2UgYWRkcmVzcyBvZiBjaGFubmVsIHNhbXBsZXMgKi8KKwl2b2lkICphZGRyOworCS8qKiBvZmZzZXQgdG8gZmlyc3Qgc2FtcGxlIGluIGJpdHMgKi8KKwl1bnNpZ25lZCBpbnQgZmlyc3Q7CisJLyoqIHNhbXBsZXMgZGlzdGFuY2UgaW4gYml0cyAqLworCXVuc2lnbmVkIGludCBzdGVwOworfSBzbmRfcGNtX2NoYW5uZWxfYXJlYV90OworCisvKiogUENNIHN5bmNocm9uaXphdGlvbiBJRCAqLwordHlwZWRlZiB1bmlvbiBfc25kX3BjbV9zeW5jX2lkIHsKKwkvKiogOC1iaXQgSUQgKi8KKwl1bnNpZ25lZCBjaGFyIGlkWzE2XTsKKwkvKiogMTYtYml0IElEICovCisJdW5zaWduZWQgc2hvcnQgaWQxNls4XTsKKwkvKiogMzItYml0IElEICovCisJdW5zaWduZWQgaW50IGlkMzJbNF07Cit9IHNuZF9wY21fc3luY19pZF90OworCisvKiogI1NORF9QQ01fVFlQRV9NRVRFUiBzY29wZSBoYW5kbGUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfcGNtX3Njb3BlIHNuZF9wY21fc2NvcGVfdDsKKworaW50IHNuZF9wY21fb3BlbihzbmRfcGNtX3QgKipwY20sIGNvbnN0IGNoYXIgKm5hbWUsIAorCQkgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKTsKK2ludCBzbmRfcGNtX29wZW5fbGNvbmYoc25kX3BjbV90ICoqcGNtLCBjb25zdCBjaGFyICpuYW1lLCAKKwkJICAgICAgIHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSwKKwkJICAgICAgIHNuZF9jb25maWdfdCAqbGNvbmYpOworaW50IHNuZF9wY21fb3Blbl9mYWxsYmFjayhzbmRfcGNtX3QgKipwY20sIHNuZF9jb25maWdfdCAqcm9vdCwKKwkJCSAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqb3JpZ19uYW1lLAorCQkJICBzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpOworCitpbnQgc25kX3BjbV9jbG9zZShzbmRfcGNtX3QgKnBjbSk7Citjb25zdCBjaGFyICpzbmRfcGNtX25hbWUoc25kX3BjbV90ICpwY20pOworc25kX3BjbV90eXBlX3Qgc25kX3BjbV90eXBlKHNuZF9wY21fdCAqcGNtKTsKK3NuZF9wY21fc3RyZWFtX3Qgc25kX3BjbV9zdHJlYW0oc25kX3BjbV90ICpwY20pOworaW50IHNuZF9wY21fcG9sbF9kZXNjcmlwdG9yc19jb3VudChzbmRfcGNtX3QgKnBjbSk7CitpbnQgc25kX3BjbV9wb2xsX2Rlc2NyaXB0b3JzKHNuZF9wY21fdCAqcGNtLCBzdHJ1Y3QgcG9sbGZkICpwZmRzLCB1bnNpZ25lZCBpbnQgc3BhY2UpOworaW50IHNuZF9wY21fcG9sbF9kZXNjcmlwdG9yc19yZXZlbnRzKHNuZF9wY21fdCAqcGNtLCBzdHJ1Y3QgcG9sbGZkICpwZmRzLCB1bnNpZ25lZCBpbnQgbmZkcywgdW5zaWduZWQgc2hvcnQgKnJldmVudHMpOworaW50IHNuZF9wY21fbm9uYmxvY2soc25kX3BjbV90ICpwY20sIGludCBub25ibG9jayk7CitpbnQgc25kX2FzeW5jX2FkZF9wY21faGFuZGxlcihzbmRfYXN5bmNfaGFuZGxlcl90ICoqaGFuZGxlciwgc25kX3BjbV90ICpwY20sIAorCQkJICAgICAgc25kX2FzeW5jX2NhbGxiYWNrX3QgY2FsbGJhY2ssIHZvaWQgKnByaXZhdGVfZGF0YSk7CitzbmRfcGNtX3QgKnNuZF9hc3luY19oYW5kbGVyX2dldF9wY20oc25kX2FzeW5jX2hhbmRsZXJfdCAqaGFuZGxlcik7CitpbnQgc25kX3BjbV9pbmZvKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfY3VycmVudChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtcyhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX2h3X2ZyZWUoc25kX3BjbV90ICpwY20pOworaW50IHNuZF9wY21fc3dfcGFyYW1zX2N1cnJlbnQoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9zd19wYXJhbXMoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9wcmVwYXJlKHNuZF9wY21fdCAqcGNtKTsKK2ludCBzbmRfcGNtX3Jlc2V0KHNuZF9wY21fdCAqcGNtKTsKK2ludCBzbmRfcGNtX3N0YXR1cyhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zdGF0dXNfdCAqc3RhdHVzKTsKK2ludCBzbmRfcGNtX3N0YXJ0KHNuZF9wY21fdCAqcGNtKTsKK2ludCBzbmRfcGNtX2Ryb3Aoc25kX3BjbV90ICpwY20pOworaW50IHNuZF9wY21fZHJhaW4oc25kX3BjbV90ICpwY20pOworaW50IHNuZF9wY21fcGF1c2Uoc25kX3BjbV90ICpwY20sIGludCBlbmFibGUpOworc25kX3BjbV9zdGF0ZV90IHNuZF9wY21fc3RhdGUoc25kX3BjbV90ICpwY20pOworaW50IHNuZF9wY21faHdzeW5jKHNuZF9wY21fdCAqcGNtKTsKK2ludCBzbmRfcGNtX2RlbGF5KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3NmcmFtZXNfdCAqZGVsYXlwKTsKK2ludCBzbmRfcGNtX3Jlc3VtZShzbmRfcGNtX3QgKnBjbSk7CitpbnQgc25kX3BjbV9odGltZXN0YW1wKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3VmcmFtZXNfdCAqYXZhaWwsIHNuZF9odGltZXN0YW1wX3QgKnRzdGFtcCk7CitzbmRfcGNtX3NmcmFtZXNfdCBzbmRfcGNtX2F2YWlsKHNuZF9wY21fdCAqcGNtKTsKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21fYXZhaWxfdXBkYXRlKHNuZF9wY21fdCAqcGNtKTsKK2ludCBzbmRfcGNtX2F2YWlsX2RlbGF5KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3NmcmFtZXNfdCAqYXZhaWxwLCBzbmRfcGNtX3NmcmFtZXNfdCAqZGVsYXlwKTsKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21fcmV3aW5kYWJsZShzbmRfcGNtX3QgKnBjbSk7CitzbmRfcGNtX3NmcmFtZXNfdCBzbmRfcGNtX3Jld2luZChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKTsKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21fZm9yd2FyZGFibGUoc25kX3BjbV90ICpwY20pOworc25kX3BjbV9zZnJhbWVzX3Qgc25kX3BjbV9mb3J3YXJkKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3VmcmFtZXNfdCBmcmFtZXMpOworc25kX3BjbV9zZnJhbWVzX3Qgc25kX3BjbV93cml0ZWkoc25kX3BjbV90ICpwY20sIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc25kX3BjbV91ZnJhbWVzX3Qgc2l6ZSk7CitzbmRfcGNtX3NmcmFtZXNfdCBzbmRfcGNtX3JlYWRpKHNuZF9wY21fdCAqcGNtLCB2b2lkICpidWZmZXIsIHNuZF9wY21fdWZyYW1lc190IHNpemUpOworc25kX3BjbV9zZnJhbWVzX3Qgc25kX3BjbV93cml0ZW4oc25kX3BjbV90ICpwY20sIHZvaWQgKipidWZzLCBzbmRfcGNtX3VmcmFtZXNfdCBzaXplKTsKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21fcmVhZG4oc25kX3BjbV90ICpwY20sIHZvaWQgKipidWZzLCBzbmRfcGNtX3VmcmFtZXNfdCBzaXplKTsKK2ludCBzbmRfcGNtX3dhaXQoc25kX3BjbV90ICpwY20sIGludCB0aW1lb3V0KTsKKworaW50IHNuZF9wY21fbGluayhzbmRfcGNtX3QgKnBjbTEsIHNuZF9wY21fdCAqcGNtMik7CitpbnQgc25kX3BjbV91bmxpbmsoc25kX3BjbV90ICpwY20pOworCisvL2ludCBzbmRfcGNtX21peGVyX2VsZW1lbnQoc25kX3BjbV90ICpwY20sIHNuZF9taXhlcl90ICptaXhlciwgc25kX21peGVyX2VsZW1fdCAqKmVsZW0pOworCisvKgorICogYXBwbGljYXRpb24gaGVscGVycyAtIHRoZXNlIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wCisgKiBvZiB0aGUgYmFzaWMgQVBJCisgKi8KKworaW50IHNuZF9wY21fcmVjb3ZlcihzbmRfcGNtX3QgKnBjbSwgaW50IGVyciwgaW50IHNpbGVudCk7CitpbnQgc25kX3BjbV9zZXRfcGFyYW1zKHNuZF9wY21fdCAqcGNtLAorICAgICAgICAgICAgICAgICAgICAgICBzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV9hY2Nlc3NfdCBhY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2Z0X3Jlc2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGF0ZW5jeSk7CitpbnQgc25kX3BjbV9nZXRfcGFyYW1zKHNuZF9wY21fdCAqcGNtLAorICAgICAgICAgICAgICAgICAgICAgICBzbmRfcGNtX3VmcmFtZXNfdCAqYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHNuZF9wY21fdWZyYW1lc190ICpwZXJpb2Rfc2l6ZSk7CisKKy8qKiBcfSAqLworCisvKioKKyAqIFxkZWZncm91cCBQQ01fSW5mbyBTdHJlYW0gSW5mb3JtYXRpb24KKyAqIFxpbmdyb3VwIFBDTQorICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKK3NpemVfdCBzbmRfcGNtX2luZm9fc2l6ZW9mKHZvaWQpOworLyoqIFxoaWRlaW5pdGlhbGl6ZXIKKyAqIFxicmllZiBhbGxvY2F0ZSBhbiBpbnZhbGlkICNzbmRfcGNtX2luZm9fdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9wY21faW5mb19hbGxvY2EocHRyKSBfX3NuZF9hbGxvY2EocHRyLCBzbmRfcGNtX2luZm8pCitpbnQgc25kX3BjbV9pbmZvX21hbGxvYyhzbmRfcGNtX2luZm9fdCAqKnB0cik7Cit2b2lkIHNuZF9wY21faW5mb19mcmVlKHNuZF9wY21faW5mb190ICpvYmopOwordm9pZCBzbmRfcGNtX2luZm9fY29weShzbmRfcGNtX2luZm9fdCAqZHN0LCBjb25zdCBzbmRfcGNtX2luZm9fdCAqc3JjKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2luZm9fZ2V0X2RldmljZShjb25zdCBzbmRfcGNtX2luZm9fdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2luZm9fZ2V0X3N1YmRldmljZShjb25zdCBzbmRfcGNtX2luZm9fdCAqb2JqKTsKK3NuZF9wY21fc3RyZWFtX3Qgc25kX3BjbV9pbmZvX2dldF9zdHJlYW0oY29uc3Qgc25kX3BjbV9pbmZvX3QgKm9iaik7CitpbnQgc25kX3BjbV9pbmZvX2dldF9jYXJkKGNvbnN0IHNuZF9wY21faW5mb190ICpvYmopOworY29uc3QgY2hhciAqc25kX3BjbV9pbmZvX2dldF9pZChjb25zdCBzbmRfcGNtX2luZm9fdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9wY21faW5mb19nZXRfbmFtZShjb25zdCBzbmRfcGNtX2luZm9fdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9wY21faW5mb19nZXRfc3ViZGV2aWNlX25hbWUoY29uc3Qgc25kX3BjbV9pbmZvX3QgKm9iaik7CitzbmRfcGNtX2NsYXNzX3Qgc25kX3BjbV9pbmZvX2dldF9jbGFzcyhjb25zdCBzbmRfcGNtX2luZm9fdCAqb2JqKTsKK3NuZF9wY21fc3ViY2xhc3NfdCBzbmRfcGNtX2luZm9fZ2V0X3N1YmNsYXNzKGNvbnN0IHNuZF9wY21faW5mb190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9wY21faW5mb19nZXRfc3ViZGV2aWNlc19jb3VudChjb25zdCBzbmRfcGNtX2luZm9fdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2luZm9fZ2V0X3N1YmRldmljZXNfYXZhaWwoY29uc3Qgc25kX3BjbV9pbmZvX3QgKm9iaik7CitzbmRfcGNtX3N5bmNfaWRfdCBzbmRfcGNtX2luZm9fZ2V0X3N5bmMoY29uc3Qgc25kX3BjbV9pbmZvX3QgKm9iaik7Cit2b2lkIHNuZF9wY21faW5mb19zZXRfZGV2aWNlKHNuZF9wY21faW5mb190ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOwordm9pZCBzbmRfcGNtX2luZm9fc2V0X3N1YmRldmljZShzbmRfcGNtX2luZm9fdCAqb2JqLCB1bnNpZ25lZCBpbnQgdmFsKTsKK3ZvaWQgc25kX3BjbV9pbmZvX3NldF9zdHJlYW0oc25kX3BjbV9pbmZvX3QgKm9iaiwgc25kX3BjbV9zdHJlYW1fdCB2YWwpOworCisvKiogXH0gKi8KKworLyoqCisgKiBcZGVmZ3JvdXAgUENNX0hXX1BhcmFtcyBIYXJkd2FyZSBQYXJhbWV0ZXJzCisgKiBcaW5ncm91cCBQQ00KKyAqIFNlZSB0aGUgXHJlZiBwY20gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogXHsKKyAqLworCitpbnQgc25kX3BjbV9od19wYXJhbXNfYW55KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfY2FuX21tYXBfc2FtcGxlX3Jlc29sdXRpb24oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19pc19kb3VibGUoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19pc19iYXRjaChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2lzX2Jsb2NrX3RyYW5zZmVyKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfaXNfbW9ub3RvbmljKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfY2FuX292ZXJyYW5nZShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2Nhbl9wYXVzZShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2Nhbl9yZXN1bWUoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19pc19oYWxmX2R1cGxleChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2lzX2pvaW50X2R1cGxleChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2Nhbl9zeW5jX3N0YXJ0KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfY2FuX2Rpc2FibGVfcGVyaW9kX3dha2V1cChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9yYXRlX251bWRlbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsCisJCQkJICAgICAgdW5zaWduZWQgaW50ICpyYXRlX251bSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgKnJhdGVfZGVuKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfc2JpdHMoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfZmlmb19zaXplKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CisKKyNpZiAwCit0eXBlZGVmIHN0cnVjdCBfc25kX3BjbV9od19zdHJhdGVneSBzbmRfcGNtX2h3X3N0cmF0ZWd5X3Q7CisKKy8qIGNob2ljZXMgbmVlZCB0byBiZSBzb3J0ZWQgb24gYXNjZW5kaW5nIGJhZG5lc3MgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfcGNtX2h3X3N0cmF0ZWd5X3NpbXBsZV9jaG9pY2VzX2xpc3QgeworCXVuc2lnbmVkIGludCB2YWx1ZTsKKwl1bnNpZ25lZCBpbnQgYmFkbmVzczsKK30gc25kX3BjbV9od19zdHJhdGVneV9zaW1wbGVfY2hvaWNlc19saXN0X3Q7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zdHJhdGVneShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLAorCQkJICAgICAgIGNvbnN0IHNuZF9wY21faHdfc3RyYXRlZ3lfdCAqc3RyYXRlZ3ksCisJCQkgICAgICAgdW5zaWduZWQgaW50IGJhZG5lc3NfbWluLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBiYWRuZXNzX21heCk7CisKK3ZvaWQgc25kX3BjbV9od19zdHJhdGVneV9mcmVlKHNuZF9wY21faHdfc3RyYXRlZ3lfdCAqc3RyYXRlZ3kpOworaW50IHNuZF9wY21faHdfc3RyYXRlZ3lfc2ltcGxlKHNuZF9wY21faHdfc3RyYXRlZ3lfdCAqKnN0cmF0ZWd5cCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgYmFkbmVzc19taW4sCisJCQkgICAgICAgdW5zaWduZWQgaW50IGJhZG5lc3NfbWF4KTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190cnlfZXhwbGFpbl9mYWlsdXJlKHNuZF9wY21fdCAqcGNtLAorCQkJCQkgIHNuZF9wY21faHdfcGFyYW1zX3QgKmZhaWwsCisJCQkJCSAgc25kX3BjbV9od19wYXJhbXNfdCAqc3VjY2VzcywKKwkJCQkJICB1bnNpZ25lZCBpbnQgZGVwdGgsCisJCQkJCSAgc25kX291dHB1dF90ICpvdXQpOworCisjZW5kaWYKKworc2l6ZV90IHNuZF9wY21faHdfcGFyYW1zX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gaW52YWxpZCAjc25kX3BjbV9od19wYXJhbXNfdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9wY21faHdfcGFyYW1zX2FsbG9jYShwdHIpIF9fc25kX2FsbG9jYShwdHIsIHNuZF9wY21faHdfcGFyYW1zKQoraW50IHNuZF9wY21faHdfcGFyYW1zX21hbGxvYyhzbmRfcGNtX2h3X3BhcmFtc190ICoqcHRyKTsKK3ZvaWQgc25kX3BjbV9od19wYXJhbXNfZnJlZShzbmRfcGNtX2h3X3BhcmFtc190ICpvYmopOwordm9pZCBzbmRfcGNtX2h3X3BhcmFtc19jb3B5KHNuZF9wY21faHdfcGFyYW1zX3QgKmRzdCwgY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqc3JjKTsKKworI2lmICFkZWZpbmVkKEFMU0FfTElCUkFSWV9CVUlMRCkgJiYgIWRlZmluZWQoQUxTQV9QQ01fT0xEX0hXX1BBUkFNU19BUEkpCisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYWNjZXNzKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9hY2Nlc3NfdCAqX2FjY2Vzcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfdGVzdF9hY2Nlc3Moc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9hY2Nlc3NfdCBfYWNjZXNzKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYWNjZXNzKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fYWNjZXNzX3QgX2FjY2Vzcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2FjY2Vzc19maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2FjY2Vzc190ICpfYWNjZXNzKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYWNjZXNzX2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9hY2Nlc3NfdCAqX2FjY2Vzcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2FjY2Vzc19tYXNrKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fYWNjZXNzX21hc2tfdCAqbWFzayk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2FjY2Vzc19tYXNrKHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9hY2Nlc3NfbWFza190ICptYXNrKTsKKworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9mb3JtYXQoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2Zvcm1hdF90ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfZm9ybWF0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fZm9ybWF0X3QgdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfZm9ybWF0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fZm9ybWF0X3QgdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfZm9ybWF0X2ZpcnN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fZm9ybWF0X3QgKmZvcm1hdCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdF9sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fZm9ybWF0X3QgKmZvcm1hdCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdF9tYXNrKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fZm9ybWF0X21hc2tfdCAqbWFzayk7Cit2b2lkIHNuZF9wY21faHdfcGFyYW1zX2dldF9mb3JtYXRfbWFzayhzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fZm9ybWF0X21hc2tfdCAqbWFzayk7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfc3ViZm9ybWF0KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9zdWJmb3JtYXRfdCAqc3ViZm9ybWF0KTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190ZXN0X3N1YmZvcm1hdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3N1YmZvcm1hdF90IHN1YmZvcm1hdCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3N1YmZvcm1hdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3N1YmZvcm1hdF90IHN1YmZvcm1hdCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3N1YmZvcm1hdF9maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3N1YmZvcm1hdF90ICpzdWJmb3JtYXQpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9zdWJmb3JtYXRfbGFzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3N1YmZvcm1hdF90ICpzdWJmb3JtYXQpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9zdWJmb3JtYXRfbWFzayhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3QgKm1hc2spOwordm9pZCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfc3ViZm9ybWF0X21hc2soc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3QgKm1hc2spOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2NoYW5uZWxzKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9jaGFubmVsc19taW4oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2NoYW5uZWxzX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190ZXN0X2NoYW5uZWxzKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVscyhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHNfbWluKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHNfbWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHNfbWlubWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqbWluLCB1bnNpZ25lZCBpbnQgKm1heCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwpOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3JhdGUoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9yYXRlX21pbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3JhdGVfbWF4KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190ZXN0X3JhdGUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfbWluKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfbWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfbWlubWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqbWluLCBpbnQgKm1pbmRpciwgdW5zaWduZWQgaW50ICptYXgsIGludCAqbWF4ZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9uZWFyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfcmVzYW1wbGUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3JhdGVfcmVzYW1wbGUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9leHBvcnRfYnVmZmVyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9leHBvcnRfYnVmZmVyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3dha2V1cChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3dha2V1cChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCk7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3RpbWUoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RfdGltZV9taW4oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RfdGltZV9tYXgoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfcGVyaW9kX3RpbWUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF90aW1lKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9taW4oc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfbWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF90aW1lX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKm1pbiwgaW50ICptaW5kaXIsIHVuc2lnbmVkIGludCAqbWF4LCBpbnQgKm1heGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF90aW1lX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfbGFzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF9zaXplKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKmZyYW1lcywgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2Rfc2l6ZV9taW4oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqZnJhbWVzLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF9zaXplX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICpmcmFtZXMsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190ZXN0X3BlcmlvZF9zaXplKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX21pbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX21heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqbWluLCBpbnQgKm1pbmRpciwgc25kX3BjbV91ZnJhbWVzX3QgKm1heCwgaW50ICptYXhkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9uZWFyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfaW50ZWdlcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKKworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RzKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kc19taW4oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RzX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfdGVzdF9wZXJpb2RzKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX21pbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX21heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKm1pbiwgaW50ICptaW5kaXIsIHVuc2lnbmVkIGludCAqbWF4LCBpbnQgKm1heGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHNfbmVhcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX2ZpcnN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHNfbGFzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX2ludGVnZXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3RpbWUoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfdGltZV9taW4oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfdGltZV9tYXgoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfYnVmZmVyX3RpbWUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9taW4oc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWVfbWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKm1pbiwgaW50ICptaW5kaXIsIHVuc2lnbmVkIGludCAqbWF4LCBpbnQgKm1heGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWVfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWVfbGFzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplX21pbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfc2l6ZV9tYXgoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190ZXN0X2J1ZmZlcl9zaXplKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX21pbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3NpemVfbWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9taW5tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKm1pbiwgc25kX3BjbV91ZnJhbWVzX3QgKm1heCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX2ZpcnN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworCisjZW5kaWYgLyogIUFMU0FfTElCUkFSWV9CVUlMRCAmJiAhQUxTQV9QQ01fT0xEX0hXX1BBUkFNU19BUEkgKi8KKworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9taW5fYWxpZ24oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsKTsKKworLyoqIFx9ICovCisKKy8qKgorICogXGRlZmdyb3VwIFBDTV9TV19QYXJhbXMgU29mdHdhcmUgUGFyYW1ldGVycworICogXGluZ3JvdXAgUENNCisgKiBTZWUgdGhlIFxyZWYgcGNtIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFx7CisgKi8KKworc2l6ZV90IHNuZF9wY21fc3dfcGFyYW1zX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gaW52YWxpZCAjc25kX3BjbV9zd19wYXJhbXNfdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9wY21fc3dfcGFyYW1zX2FsbG9jYShwdHIpIF9fc25kX2FsbG9jYShwdHIsIHNuZF9wY21fc3dfcGFyYW1zKQoraW50IHNuZF9wY21fc3dfcGFyYW1zX21hbGxvYyhzbmRfcGNtX3N3X3BhcmFtc190ICoqcHRyKTsKK3ZvaWQgc25kX3BjbV9zd19wYXJhbXNfZnJlZShzbmRfcGNtX3N3X3BhcmFtc190ICpvYmopOwordm9pZCBzbmRfcGNtX3N3X3BhcmFtc19jb3B5KHNuZF9wY21fc3dfcGFyYW1zX3QgKmRzdCwgY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqc3JjKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfYm91bmRhcnkoY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsKTsKKworI2lmICFkZWZpbmVkKEFMU0FfTElCUkFSWV9CVUlMRCkgJiYgIWRlZmluZWQoQUxTQV9QQ01fT0xEX1NXX1BBUkFNU19BUEkpCisKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfdHN0YW1wX21vZGUoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV90c3RhbXBfdCB2YWwpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX2dldF90c3RhbXBfbW9kZShjb25zdCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdHN0YW1wX3QgKnZhbCk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfc2V0X2F2YWlsX21pbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCB2YWwpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX2dldF9hdmFpbF9taW4oY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfcGVyaW9kX2V2ZW50KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIGludCB2YWwpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX2dldF9wZXJpb2RfZXZlbnQoY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKnZhbCk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfc2V0X3N0YXJ0X3RocmVzaG9sZChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCB2YWwpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX2dldF9zdGFydF90aHJlc2hvbGQoY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zbSwgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfc2V0X3N0b3BfdGhyZXNob2xkKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfZ2V0X3N0b3BfdGhyZXNob2xkKGNvbnN0IHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfc2V0X3NpbGVuY2VfdGhyZXNob2xkKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfZ2V0X3NpbGVuY2VfdGhyZXNob2xkKGNvbnN0IHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfc2V0X3NpbGVuY2Vfc2l6ZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCB2YWwpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX2dldF9zaWxlbmNlX3NpemUoY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsKTsKKworI2VuZGlmIC8qICFBTFNBX0xJQlJBUllfQlVJTEQgJiYgIUFMU0FfUENNX09MRF9TV19QQVJBTVNfQVBJICovCisKKy8qKiBcfSAqLworCisvKiBpbmNsdWRlIG9sZCBBUEkgKi8KKyNpZm5kZWYgQUxTQV9MSUJSQVJZX0JVSUxECisjaWYgZGVmaW5lZChBTFNBX1BDTV9PTERfSFdfUEFSQU1TX0FQSSkgfHwgZGVmaW5lZChBTFNBX1BDTV9PTERfU1dfUEFSQU1TX0FQSSkKKyNpbmNsdWRlICJwY21fb2xkLmgiCisjZW5kaWYKKyNlbmRpZgorCisvKioKKyAqIFxkZWZncm91cCBQQ01fQWNjZXNzIEFjY2VzcyBNYXNrIEZ1bmN0aW9ucworICogXGluZ3JvdXAgUENNCisgKiBTZWUgdGhlIFxyZWYgcGNtIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFx7CisgKi8KKworc2l6ZV90IHNuZF9wY21fYWNjZXNzX21hc2tfc2l6ZW9mKHZvaWQpOworLyoqIFxoaWRlaW5pdGlhbGl6ZXIKKyAqIFxicmllZiBhbGxvY2F0ZSBhbiBlbXB0eSAjc25kX3BjbV9hY2Nlc3NfbWFza190IHVzaW5nIHN0YW5kYXJkIGFsbG9jYQorICogXHBhcmFtIHB0ciByZXR1cm5lZCBwb2ludGVyCisgKi8KKyNkZWZpbmUgc25kX3BjbV9hY2Nlc3NfbWFza19hbGxvY2EocHRyKSBfX3NuZF9hbGxvY2EocHRyLCBzbmRfcGNtX2FjY2Vzc19tYXNrKQoraW50IHNuZF9wY21fYWNjZXNzX21hc2tfbWFsbG9jKHNuZF9wY21fYWNjZXNzX21hc2tfdCAqKnB0cik7Cit2b2lkIHNuZF9wY21fYWNjZXNzX21hc2tfZnJlZShzbmRfcGNtX2FjY2Vzc19tYXNrX3QgKm9iaik7Cit2b2lkIHNuZF9wY21fYWNjZXNzX21hc2tfY29weShzbmRfcGNtX2FjY2Vzc19tYXNrX3QgKmRzdCwgY29uc3Qgc25kX3BjbV9hY2Nlc3NfbWFza190ICpzcmMpOwordm9pZCBzbmRfcGNtX2FjY2Vzc19tYXNrX25vbmUoc25kX3BjbV9hY2Nlc3NfbWFza190ICptYXNrKTsKK3ZvaWQgc25kX3BjbV9hY2Nlc3NfbWFza19hbnkoc25kX3BjbV9hY2Nlc3NfbWFza190ICptYXNrKTsKK2ludCBzbmRfcGNtX2FjY2Vzc19tYXNrX3Rlc3QoY29uc3Qgc25kX3BjbV9hY2Nlc3NfbWFza190ICptYXNrLCBzbmRfcGNtX2FjY2Vzc190IHZhbCk7CitpbnQgc25kX3BjbV9hY2Nlc3NfbWFza19lbXB0eShjb25zdCBzbmRfcGNtX2FjY2Vzc19tYXNrX3QgKm1hc2spOwordm9pZCBzbmRfcGNtX2FjY2Vzc19tYXNrX3NldChzbmRfcGNtX2FjY2Vzc19tYXNrX3QgKm1hc2ssIHNuZF9wY21fYWNjZXNzX3QgdmFsKTsKK3ZvaWQgc25kX3BjbV9hY2Nlc3NfbWFza19yZXNldChzbmRfcGNtX2FjY2Vzc19tYXNrX3QgKm1hc2ssIHNuZF9wY21fYWNjZXNzX3QgdmFsKTsKKworLyoqIFx9ICovCisKKy8qKgorICogXGRlZmdyb3VwIFBDTV9Gb3JtYXQgRm9ybWF0IE1hc2sgRnVuY3Rpb25zCisgKiBcaW5ncm91cCBQQ00KKyAqIFNlZSB0aGUgXHJlZiBwY20gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogXHsKKyAqLworCitzaXplX3Qgc25kX3BjbV9mb3JtYXRfbWFza19zaXplb2Yodm9pZCk7CisvKiogXGhpZGVpbml0aWFsaXplcgorICogXGJyaWVmIGFsbG9jYXRlIGFuIGVtcHR5ICNzbmRfcGNtX2Zvcm1hdF9tYXNrX3QgdXNpbmcgc3RhbmRhcmQgYWxsb2NhCisgKiBccGFyYW0gcHRyIHJldHVybmVkIHBvaW50ZXIKKyAqLworI2RlZmluZSBzbmRfcGNtX2Zvcm1hdF9tYXNrX2FsbG9jYShwdHIpIF9fc25kX2FsbG9jYShwdHIsIHNuZF9wY21fZm9ybWF0X21hc2spCitpbnQgc25kX3BjbV9mb3JtYXRfbWFza19tYWxsb2Moc25kX3BjbV9mb3JtYXRfbWFza190ICoqcHRyKTsKK3ZvaWQgc25kX3BjbV9mb3JtYXRfbWFza19mcmVlKHNuZF9wY21fZm9ybWF0X21hc2tfdCAqb2JqKTsKK3ZvaWQgc25kX3BjbV9mb3JtYXRfbWFza19jb3B5KHNuZF9wY21fZm9ybWF0X21hc2tfdCAqZHN0LCBjb25zdCBzbmRfcGNtX2Zvcm1hdF9tYXNrX3QgKnNyYyk7Cit2b2lkIHNuZF9wY21fZm9ybWF0X21hc2tfbm9uZShzbmRfcGNtX2Zvcm1hdF9tYXNrX3QgKm1hc2spOwordm9pZCBzbmRfcGNtX2Zvcm1hdF9tYXNrX2FueShzbmRfcGNtX2Zvcm1hdF9tYXNrX3QgKm1hc2spOworaW50IHNuZF9wY21fZm9ybWF0X21hc2tfdGVzdChjb25zdCBzbmRfcGNtX2Zvcm1hdF9tYXNrX3QgKm1hc2ssIHNuZF9wY21fZm9ybWF0X3QgdmFsKTsKK2ludCBzbmRfcGNtX2Zvcm1hdF9tYXNrX2VtcHR5KGNvbnN0IHNuZF9wY21fZm9ybWF0X21hc2tfdCAqbWFzayk7Cit2b2lkIHNuZF9wY21fZm9ybWF0X21hc2tfc2V0KHNuZF9wY21fZm9ybWF0X21hc2tfdCAqbWFzaywgc25kX3BjbV9mb3JtYXRfdCB2YWwpOwordm9pZCBzbmRfcGNtX2Zvcm1hdF9tYXNrX3Jlc2V0KHNuZF9wY21fZm9ybWF0X21hc2tfdCAqbWFzaywgc25kX3BjbV9mb3JtYXRfdCB2YWwpOworCisvKiogXH0gKi8KKworLyoqCisgKiBcZGVmZ3JvdXAgUENNX1N1YkZvcm1hdCBTdWJmb3JtYXQgTWFzayBGdW5jdGlvbnMKKyAqIFxpbmdyb3VwIFBDTQorICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKK3NpemVfdCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gZW1wdHkgI3NuZF9wY21fc3ViZm9ybWF0X21hc2tfdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9wY21fc3ViZm9ybWF0X21hc2tfYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX3BjbV9zdWJmb3JtYXRfbWFzaykKK2ludCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX21hbGxvYyhzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3QgKipwdHIpOwordm9pZCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX2ZyZWUoc25kX3BjbV9zdWJmb3JtYXRfbWFza190ICpvYmopOwordm9pZCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX2NvcHkoc25kX3BjbV9zdWJmb3JtYXRfbWFza190ICpkc3QsIGNvbnN0IHNuZF9wY21fc3ViZm9ybWF0X21hc2tfdCAqc3JjKTsKK3ZvaWQgc25kX3BjbV9zdWJmb3JtYXRfbWFza19ub25lKHNuZF9wY21fc3ViZm9ybWF0X21hc2tfdCAqbWFzayk7Cit2b2lkIHNuZF9wY21fc3ViZm9ybWF0X21hc2tfYW55KHNuZF9wY21fc3ViZm9ybWF0X21hc2tfdCAqbWFzayk7CitpbnQgc25kX3BjbV9zdWJmb3JtYXRfbWFza190ZXN0KGNvbnN0IHNuZF9wY21fc3ViZm9ybWF0X21hc2tfdCAqbWFzaywgc25kX3BjbV9zdWJmb3JtYXRfdCB2YWwpOworaW50IHNuZF9wY21fc3ViZm9ybWF0X21hc2tfZW1wdHkoY29uc3Qgc25kX3BjbV9zdWJmb3JtYXRfbWFza190ICptYXNrKTsKK3ZvaWQgc25kX3BjbV9zdWJmb3JtYXRfbWFza19zZXQoc25kX3BjbV9zdWJmb3JtYXRfbWFza190ICptYXNrLCBzbmRfcGNtX3N1YmZvcm1hdF90IHZhbCk7Cit2b2lkIHNuZF9wY21fc3ViZm9ybWF0X21hc2tfcmVzZXQoc25kX3BjbV9zdWJmb3JtYXRfbWFza190ICptYXNrLCBzbmRfcGNtX3N1YmZvcm1hdF90IHZhbCk7CisKKy8qKiBcfSAqLworCisvKioKKyAqIFxkZWZncm91cCBQQ01fU3RhdHVzIFN0YXR1cyBGdW5jdGlvbnMKKyAqIFxpbmdyb3VwIFBDTQorICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKK3NpemVfdCBzbmRfcGNtX3N0YXR1c19zaXplb2Yodm9pZCk7CisvKiogXGhpZGVpbml0aWFsaXplcgorICogXGJyaWVmIGFsbG9jYXRlIGFuIGludmFsaWQgI3NuZF9wY21fc3RhdHVzX3QgdXNpbmcgc3RhbmRhcmQgYWxsb2NhCisgKiBccGFyYW0gcHRyIHJldHVybmVkIHBvaW50ZXIKKyAqLworI2RlZmluZSBzbmRfcGNtX3N0YXR1c19hbGxvY2EocHRyKSBfX3NuZF9hbGxvY2EocHRyLCBzbmRfcGNtX3N0YXR1cykKK2ludCBzbmRfcGNtX3N0YXR1c19tYWxsb2Moc25kX3BjbV9zdGF0dXNfdCAqKnB0cik7Cit2b2lkIHNuZF9wY21fc3RhdHVzX2ZyZWUoc25kX3BjbV9zdGF0dXNfdCAqb2JqKTsKK3ZvaWQgc25kX3BjbV9zdGF0dXNfY29weShzbmRfcGNtX3N0YXR1c190ICpkc3QsIGNvbnN0IHNuZF9wY21fc3RhdHVzX3QgKnNyYyk7CitzbmRfcGNtX3N0YXRlX3Qgc25kX3BjbV9zdGF0dXNfZ2V0X3N0YXRlKGNvbnN0IHNuZF9wY21fc3RhdHVzX3QgKm9iaik7Cit2b2lkIHNuZF9wY21fc3RhdHVzX2dldF90cmlnZ2VyX3RzdGFtcChjb25zdCBzbmRfcGNtX3N0YXR1c190ICpvYmosIHNuZF90aW1lc3RhbXBfdCAqcHRyKTsKK3ZvaWQgc25kX3BjbV9zdGF0dXNfZ2V0X3RyaWdnZXJfaHRzdGFtcChjb25zdCBzbmRfcGNtX3N0YXR1c190ICpvYmosIHNuZF9odGltZXN0YW1wX3QgKnB0cik7Cit2b2lkIHNuZF9wY21fc3RhdHVzX2dldF90c3RhbXAoY29uc3Qgc25kX3BjbV9zdGF0dXNfdCAqb2JqLCBzbmRfdGltZXN0YW1wX3QgKnB0cik7Cit2b2lkIHNuZF9wY21fc3RhdHVzX2dldF9odHN0YW1wKGNvbnN0IHNuZF9wY21fc3RhdHVzX3QgKm9iaiwgc25kX2h0aW1lc3RhbXBfdCAqcHRyKTsKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21fc3RhdHVzX2dldF9kZWxheShjb25zdCBzbmRfcGNtX3N0YXR1c190ICpvYmopOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9zdGF0dXNfZ2V0X2F2YWlsKGNvbnN0IHNuZF9wY21fc3RhdHVzX3QgKm9iaik7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX3N0YXR1c19nZXRfYXZhaWxfbWF4KGNvbnN0IHNuZF9wY21fc3RhdHVzX3QgKm9iaik7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX3N0YXR1c19nZXRfb3ZlcnJhbmdlKGNvbnN0IHNuZF9wY21fc3RhdHVzX3QgKm9iaik7CisKKy8qKiBcfSAqLworCisvKioKKyAqIFxkZWZncm91cCBQQ01fRGVzY3JpcHRpb24gRGVzY3JpcHRpb24gRnVuY3Rpb25zCisgKiBcaW5ncm91cCBQQ00KKyAqIFNlZSB0aGUgXHJlZiBwY20gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogXHsKKyAqLworCitjb25zdCBjaGFyICpzbmRfcGNtX3R5cGVfbmFtZShzbmRfcGNtX3R5cGVfdCB0eXBlKTsKK2NvbnN0IGNoYXIgKnNuZF9wY21fc3RyZWFtX25hbWUoY29uc3Qgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0pOworY29uc3QgY2hhciAqc25kX3BjbV9hY2Nlc3NfbmFtZShjb25zdCBzbmRfcGNtX2FjY2Vzc190IF9hY2Nlc3MpOworY29uc3QgY2hhciAqc25kX3BjbV9mb3JtYXRfbmFtZShjb25zdCBzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7Citjb25zdCBjaGFyICpzbmRfcGNtX2Zvcm1hdF9kZXNjcmlwdGlvbihjb25zdCBzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7Citjb25zdCBjaGFyICpzbmRfcGNtX3N1YmZvcm1hdF9uYW1lKGNvbnN0IHNuZF9wY21fc3ViZm9ybWF0X3Qgc3ViZm9ybWF0KTsKK2NvbnN0IGNoYXIgKnNuZF9wY21fc3ViZm9ybWF0X2Rlc2NyaXB0aW9uKGNvbnN0IHNuZF9wY21fc3ViZm9ybWF0X3Qgc3ViZm9ybWF0KTsKK3NuZF9wY21fZm9ybWF0X3Qgc25kX3BjbV9mb3JtYXRfdmFsdWUoY29uc3QgY2hhciogbmFtZSk7Citjb25zdCBjaGFyICpzbmRfcGNtX3RzdGFtcF9tb2RlX25hbWUoY29uc3Qgc25kX3BjbV90c3RhbXBfdCBtb2RlKTsKK2NvbnN0IGNoYXIgKnNuZF9wY21fc3RhdGVfbmFtZShjb25zdCBzbmRfcGNtX3N0YXRlX3Qgc3RhdGUpOworCisvKiogXH0gKi8KKworLyoqCisgKiBcZGVmZ3JvdXAgUENNX0R1bXAgRGVidWcgRnVuY3Rpb25zCisgKiBcaW5ncm91cCBQQ00KKyAqIFNlZSB0aGUgXHJlZiBwY20gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogXHsKKyAqLworCitpbnQgc25kX3BjbV9kdW1wKHNuZF9wY21fdCAqcGNtLCBzbmRfb3V0cHV0X3QgKm91dCk7CitpbnQgc25kX3BjbV9kdW1wX2h3X3NldHVwKHNuZF9wY21fdCAqcGNtLCBzbmRfb3V0cHV0X3QgKm91dCk7CitpbnQgc25kX3BjbV9kdW1wX3N3X3NldHVwKHNuZF9wY21fdCAqcGNtLCBzbmRfb3V0cHV0X3QgKm91dCk7CitpbnQgc25kX3BjbV9kdW1wX3NldHVwKHNuZF9wY21fdCAqcGNtLCBzbmRfb3V0cHV0X3QgKm91dCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZHVtcChzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9vdXRwdXRfdCAqb3V0KTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19kdW1wKHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX291dHB1dF90ICpvdXQpOworaW50IHNuZF9wY21fc3RhdHVzX2R1bXAoc25kX3BjbV9zdGF0dXNfdCAqc3RhdHVzLCBzbmRfb3V0cHV0X3QgKm91dCk7CisKKy8qKiBcfSAqLworCisvKioKKyAqIFxkZWZncm91cCBQQ01fRGlyZWN0IERpcmVjdCBBY2Nlc3MgKE1NQVApIEZ1bmN0aW9ucworICogXGluZ3JvdXAgUENNCisgKiBTZWUgdGhlIFxyZWYgcGNtIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFx7CisgKi8KKworaW50IHNuZF9wY21fbW1hcF9iZWdpbihzbmRfcGNtX3QgKnBjbSwKKwkJICAgICAgIGNvbnN0IHNuZF9wY21fY2hhbm5lbF9hcmVhX3QgKiphcmVhcywKKwkJICAgICAgIHNuZF9wY21fdWZyYW1lc190ICpvZmZzZXQsCisJCSAgICAgICBzbmRfcGNtX3VmcmFtZXNfdCAqZnJhbWVzKTsKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21fbW1hcF9jb21taXQoc25kX3BjbV90ICpwY20sCisJCQkJICAgICAgc25kX3BjbV91ZnJhbWVzX3Qgb2Zmc2V0LAorCQkJCSAgICAgIHNuZF9wY21fdWZyYW1lc190IGZyYW1lcyk7CitzbmRfcGNtX3NmcmFtZXNfdCBzbmRfcGNtX21tYXBfd3JpdGVpKHNuZF9wY21fdCAqcGNtLCBjb25zdCB2b2lkICpidWZmZXIsIHNuZF9wY21fdWZyYW1lc190IHNpemUpOworc25kX3BjbV9zZnJhbWVzX3Qgc25kX3BjbV9tbWFwX3JlYWRpKHNuZF9wY21fdCAqcGNtLCB2b2lkICpidWZmZXIsIHNuZF9wY21fdWZyYW1lc190IHNpemUpOworc25kX3BjbV9zZnJhbWVzX3Qgc25kX3BjbV9tbWFwX3dyaXRlbihzbmRfcGNtX3QgKnBjbSwgdm9pZCAqKmJ1ZnMsIHNuZF9wY21fdWZyYW1lc190IHNpemUpOworc25kX3BjbV9zZnJhbWVzX3Qgc25kX3BjbV9tbWFwX3JlYWRuKHNuZF9wY21fdCAqcGNtLCB2b2lkICoqYnVmcywgc25kX3BjbV91ZnJhbWVzX3Qgc2l6ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisvKiogXH0gKi8KKworLyoqCisgKiBcZGVmZ3JvdXAgUENNX0hlbHBlcnMgSGVscGVyIEZ1bmN0aW9ucworICogXGluZ3JvdXAgUENNCisgKiBTZWUgdGhlIFxyZWYgcGNtIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFx7CisgKi8KKworaW50IHNuZF9wY21fZm9ybWF0X3NpZ25lZChzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7CitpbnQgc25kX3BjbV9mb3JtYXRfdW5zaWduZWQoc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOworaW50IHNuZF9wY21fZm9ybWF0X2xpbmVhcihzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7CitpbnQgc25kX3BjbV9mb3JtYXRfZmxvYXQoc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOworaW50IHNuZF9wY21fZm9ybWF0X2xpdHRsZV9lbmRpYW4oc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOworaW50IHNuZF9wY21fZm9ybWF0X2JpZ19lbmRpYW4oc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOworaW50IHNuZF9wY21fZm9ybWF0X2NwdV9lbmRpYW4oc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOworaW50IHNuZF9wY21fZm9ybWF0X3dpZHRoKHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsJCQkvKiBpbiBiaXRzICovCitpbnQgc25kX3BjbV9mb3JtYXRfcGh5c2ljYWxfd2lkdGgoc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOwkJLyogaW4gYml0cyAqLworc25kX3BjbV9mb3JtYXRfdCBzbmRfcGNtX2J1aWxkX2xpbmVhcl9mb3JtYXQoaW50IHdpZHRoLCBpbnQgcHdpZHRoLCBpbnQgdW5zaWduZCwgaW50IGJpZ19lbmRpYW4pOworc3NpemVfdCBzbmRfcGNtX2Zvcm1hdF9zaXplKHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0LCBzaXplX3Qgc2FtcGxlcyk7Cit1X2ludDhfdCBzbmRfcGNtX2Zvcm1hdF9zaWxlbmNlKHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsKK3VfaW50MTZfdCBzbmRfcGNtX2Zvcm1hdF9zaWxlbmNlXzE2KHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsKK3VfaW50MzJfdCBzbmRfcGNtX2Zvcm1hdF9zaWxlbmNlXzMyKHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsKK3VfaW50NjRfdCBzbmRfcGNtX2Zvcm1hdF9zaWxlbmNlXzY0KHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsKK2ludCBzbmRfcGNtX2Zvcm1hdF9zZXRfc2lsZW5jZShzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCwgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgc2FtcGxlcyk7CisKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21fYnl0ZXNfdG9fZnJhbWVzKHNuZF9wY21fdCAqcGNtLCBzc2l6ZV90IGJ5dGVzKTsKK3NzaXplX3Qgc25kX3BjbV9mcmFtZXNfdG9fYnl0ZXMoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc2ZyYW1lc190IGZyYW1lcyk7Citsb25nIHNuZF9wY21fYnl0ZXNfdG9fc2FtcGxlcyhzbmRfcGNtX3QgKnBjbSwgc3NpemVfdCBieXRlcyk7Citzc2l6ZV90IHNuZF9wY21fc2FtcGxlc190b19ieXRlcyhzbmRfcGNtX3QgKnBjbSwgbG9uZyBzYW1wbGVzKTsKKworaW50IHNuZF9wY21fYXJlYV9zaWxlbmNlKGNvbnN0IHNuZF9wY21fY2hhbm5lbF9hcmVhX3QgKmRzdF9jaGFubmVsLCBzbmRfcGNtX3VmcmFtZXNfdCBkc3Rfb2Zmc2V0LAorCQkJIHVuc2lnbmVkIGludCBzYW1wbGVzLCBzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7CitpbnQgc25kX3BjbV9hcmVhc19zaWxlbmNlKGNvbnN0IHNuZF9wY21fY2hhbm5lbF9hcmVhX3QgKmRzdF9jaGFubmVscywgc25kX3BjbV91ZnJhbWVzX3QgZHN0X29mZnNldCwKKwkJCSAgdW5zaWduZWQgaW50IGNoYW5uZWxzLCBzbmRfcGNtX3VmcmFtZXNfdCBmcmFtZXMsIHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsKK2ludCBzbmRfcGNtX2FyZWFfY29weShjb25zdCBzbmRfcGNtX2NoYW5uZWxfYXJlYV90ICpkc3RfY2hhbm5lbCwgc25kX3BjbV91ZnJhbWVzX3QgZHN0X29mZnNldCwKKwkJICAgICAgY29uc3Qgc25kX3BjbV9jaGFubmVsX2FyZWFfdCAqc3JjX2NoYW5uZWwsIHNuZF9wY21fdWZyYW1lc190IHNyY19vZmZzZXQsCisJCSAgICAgIHVuc2lnbmVkIGludCBzYW1wbGVzLCBzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7CitpbnQgc25kX3BjbV9hcmVhc19jb3B5KGNvbnN0IHNuZF9wY21fY2hhbm5lbF9hcmVhX3QgKmRzdF9jaGFubmVscywgc25kX3BjbV91ZnJhbWVzX3QgZHN0X29mZnNldCwKKwkJICAgICAgIGNvbnN0IHNuZF9wY21fY2hhbm5lbF9hcmVhX3QgKnNyY19jaGFubmVscywgc25kX3BjbV91ZnJhbWVzX3Qgc3JjX29mZnNldCwKKwkJICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVscywgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzLCBzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7CisKKy8qKiBcfSAqLworCisvKioKKyAqIFxkZWZncm91cCBQQ01fSG9vayBIb29rIEV4dGVuc2lvbgorICogXGluZ3JvdXAgUENNCisgKiBTZWUgdGhlIFxyZWYgcGNtIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFx7CisgKi8KKworLyoqIHR5cGUgb2YgcGNtIGhvb2sgKi8KK3R5cGVkZWYgZW51bSBfc25kX3BjbV9ob29rX3R5cGUgeworCVNORF9QQ01fSE9PS19UWVBFX0hXX1BBUkFNUyA9IDAsCisJU05EX1BDTV9IT09LX1RZUEVfSFdfRlJFRSwKKwlTTkRfUENNX0hPT0tfVFlQRV9DTE9TRSwKKwlTTkRfUENNX0hPT0tfVFlQRV9MQVNUID0gU05EX1BDTV9IT09LX1RZUEVfQ0xPU0UKK30gc25kX3BjbV9ob29rX3R5cGVfdDsKKworLyoqIFBDTSBob29rIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9wY21faG9vayBzbmRfcGNtX2hvb2tfdDsKKy8qKiBQQ00gaG9vayBjYWxsYmFjayBmdW5jdGlvbiAqLwordHlwZWRlZiBpbnQgKCpzbmRfcGNtX2hvb2tfZnVuY190KShzbmRfcGNtX2hvb2tfdCAqaG9vayk7CitzbmRfcGNtX3QgKnNuZF9wY21faG9va19nZXRfcGNtKHNuZF9wY21faG9va190ICpob29rKTsKK3ZvaWQgKnNuZF9wY21faG9va19nZXRfcHJpdmF0ZShzbmRfcGNtX2hvb2tfdCAqaG9vayk7Cit2b2lkIHNuZF9wY21faG9va19zZXRfcHJpdmF0ZShzbmRfcGNtX2hvb2tfdCAqaG9vaywgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKK2ludCBzbmRfcGNtX2hvb2tfYWRkKHNuZF9wY21faG9va190ICoqaG9va3AsIHNuZF9wY21fdCAqcGNtLAorCQkgICAgIHNuZF9wY21faG9va190eXBlX3QgdHlwZSwKKwkJICAgICBzbmRfcGNtX2hvb2tfZnVuY190IGZ1bmMsIHZvaWQgKnByaXZhdGVfZGF0YSk7CitpbnQgc25kX3BjbV9ob29rX3JlbW92ZShzbmRfcGNtX2hvb2tfdCAqaG9vayk7CisKKy8qKiBcfSAqLworCisvKioKKyAqIFxkZWZncm91cCBQQ01fU2NvcGUgU2NvcGUgUGx1Z2luIEV4dGVuc2lvbgorICogXGluZ3JvdXAgUENNCisgKiBTZWUgdGhlIFxyZWYgcGNtIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFx7CisgKi8KKworLyoqICNTTkRfUENNX1RZUEVfTUVURVIgc2NvcGUgZnVuY3Rpb25zICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3BjbV9zY29wZV9vcHMgeworCS8qKiBcYnJpZWYgRW5hYmxlIGFuZCBwcmVwYXJlIGl0IHVzaW5nIGN1cnJlbnQgcGFyYW1zCisJICogXHBhcmFtIHNjb3BlIHNjb3BlIGhhbmRsZQorCSAqLworCWludCAoKmVuYWJsZSkoc25kX3BjbV9zY29wZV90ICpzY29wZSk7CisJLyoqIFxicmllZiBEaXNhYmxlCisJICogXHBhcmFtIHNjb3BlIHNjb3BlIGhhbmRsZQorCSAqLworCXZvaWQgKCpkaXNhYmxlKShzbmRfcGNtX3Njb3BlX3QgKnNjb3BlKTsKKwkvKiogXGJyaWVmIFBDTSBoYXMgYmVlbiBzdGFydGVkCisJICogXHBhcmFtIHNjb3BlIHNjb3BlIGhhbmRsZQorCSAqLworCXZvaWQgKCpzdGFydCkoc25kX3BjbV9zY29wZV90ICpzY29wZSk7CisJLyoqIFxicmllZiBQQ00gaGFzIGJlZW4gc3RvcHBlZAorCSAqIFxwYXJhbSBzY29wZSBzY29wZSBoYW5kbGUKKwkgKi8KKwl2b2lkICgqc3RvcCkoc25kX3BjbV9zY29wZV90ICpzY29wZSk7CisJLyoqIFxicmllZiBOZXcgZnJhbWVzIGFyZSBwcmVzZW50CisJICogXHBhcmFtIHNjb3BlIHNjb3BlIGhhbmRsZQorCSAqLworCXZvaWQgKCp1cGRhdGUpKHNuZF9wY21fc2NvcGVfdCAqc2NvcGUpOworCS8qKiBcYnJpZWYgUmVzZXQgc3RhdHVzCisJICogXHBhcmFtIHNjb3BlIHNjb3BlIGhhbmRsZQorCSAqLworCXZvaWQgKCpyZXNldCkoc25kX3BjbV9zY29wZV90ICpzY29wZSk7CisJLyoqIFxicmllZiBQQ00gaXMgY2xvc2luZworCSAqIFxwYXJhbSBzY29wZSBzY29wZSBoYW5kbGUKKwkgKi8KKwl2b2lkICgqY2xvc2UpKHNuZF9wY21fc2NvcGVfdCAqc2NvcGUpOworfSBzbmRfcGNtX3Njb3BlX29wc190OworCitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX21ldGVyX2dldF9idWZzaXplKHNuZF9wY21fdCAqcGNtKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX21ldGVyX2dldF9jaGFubmVscyhzbmRfcGNtX3QgKnBjbSk7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9tZXRlcl9nZXRfcmF0ZShzbmRfcGNtX3QgKnBjbSk7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX21ldGVyX2dldF9ub3coc25kX3BjbV90ICpwY20pOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9tZXRlcl9nZXRfYm91bmRhcnkoc25kX3BjbV90ICpwY20pOworaW50IHNuZF9wY21fbWV0ZXJfYWRkX3Njb3BlKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3Njb3BlX3QgKnNjb3BlKTsKK3NuZF9wY21fc2NvcGVfdCAqc25kX3BjbV9tZXRlcl9zZWFyY2hfc2NvcGUoc25kX3BjbV90ICpwY20sIGNvbnN0IGNoYXIgKm5hbWUpOworaW50IHNuZF9wY21fc2NvcGVfbWFsbG9jKHNuZF9wY21fc2NvcGVfdCAqKnB0cik7Cit2b2lkIHNuZF9wY21fc2NvcGVfc2V0X29wcyhzbmRfcGNtX3Njb3BlX3QgKnNjb3BlLAorCQkJICAgY29uc3Qgc25kX3BjbV9zY29wZV9vcHNfdCAqdmFsKTsKK3ZvaWQgc25kX3BjbV9zY29wZV9zZXRfbmFtZShzbmRfcGNtX3Njb3BlX3QgKnNjb3BlLCBjb25zdCBjaGFyICp2YWwpOworY29uc3QgY2hhciAqc25kX3BjbV9zY29wZV9nZXRfbmFtZShzbmRfcGNtX3Njb3BlX3QgKnNjb3BlKTsKK3ZvaWQgKnNuZF9wY21fc2NvcGVfZ2V0X2NhbGxiYWNrX3ByaXZhdGUoc25kX3BjbV9zY29wZV90ICpzY29wZSk7Cit2b2lkIHNuZF9wY21fc2NvcGVfc2V0X2NhbGxiYWNrX3ByaXZhdGUoc25kX3BjbV9zY29wZV90ICpzY29wZSwgdm9pZCAqdmFsKTsKK2ludCBzbmRfcGNtX3Njb3BlX3MxNl9vcGVuKHNuZF9wY21fdCAqcGNtLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgc25kX3BjbV9zY29wZV90ICoqc2NvcGVwKTsKK2ludDE2X3QgKnNuZF9wY21fc2NvcGVfczE2X2dldF9jaGFubmVsX2J1ZmZlcihzbmRfcGNtX3Njb3BlX3QgKnNjb3BlLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCk7CisKKy8qKiBcfSAqLworCisvKioKKyAqIFxkZWZncm91cCBQQ01fU2ltcGxlIFNpbXBsZSBzZXR1cCBmdW5jdGlvbnMKKyAqIFxpbmdyb3VwIFBDTQorICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKKy8qKiBTaW1wbGUgUENNIGxhdGVuY3kgdHlwZSAqLwordHlwZWRlZiBlbnVtIF9zbmRfc3BjbV9sYXRlbmN5IHsKKwkvKiogc3RhbmRhcmQgbGF0ZW5jeSAtIGZvciBzdGFuZGFyZCBwbGF5YmFjayBvciBjYXB0dXJlCisgICAgICAgICAgICAoZXN0aW1hdGVkIGxhdGVuY3kgaW4gb25lIGRpcmVjdGlvbiAzNTBtcykgKi8KKwlTTkRfU1BDTV9MQVRFTkNZX1NUQU5EQVJEID0gMCwKKwkvKiogbWVkaXVtIGxhdGVuY3kgLSBzb2Z0d2FyZSBwaG9uZXMgZXRjLgorCSAgICAoZXN0aW1hdGVkIGxhdGVuY3kgaW4gb25lIGRpcmVjdGlvbiBtYXhpbWFsbHkgMjVtcyAqLworCVNORF9TUENNX0xBVEVOQ1lfTUVESVVNLAorCS8qKiByZWFsdGltZSBsYXRlbmN5IC0gcmVhbHRpbWUgYXBwbGljYXRpb25zIChlZmZlY3QgcHJvY2Vzc29ycyBldGMuKQorCSAgICAoZXN0aW1hdGVkIGxhdGVuY3kgaW4gb25lIGRpcmVjdGlvbiA1bXMgYW5kIGJldHRlcikgKi8KKwlTTkRfU1BDTV9MQVRFTkNZX1JFQUxUSU1FCit9IHNuZF9zcGNtX2xhdGVuY3lfdDsKKworLyoqIFNpbXBsZSBQQ00geHJ1biB0eXBlICovCit0eXBlZGVmIGVudW0gX3NuZF9zcGNtX3hydW5fdHlwZSB7CisJLyoqIGRyaXZlciAvIGxpYnJhcnkgd2lsbCBpZ25vcmUgYWxsIHhydW5zLCB0aGUgc3RyZWFtIHJ1bnMgZm9yZXZlciAqLworCVNORF9TUENNX1hSVU5fSUdOT1JFID0gMCwKKwkvKiogZHJpdmVyIC8gbGlicmFyeSBzdG9wcyB0aGUgc3RyZWFtIHdoZW4gYW4geHJ1biBvY2N1cnMgKi8KKwlTTkRfU1BDTV9YUlVOX1NUT1AKK30gc25kX3NwY21feHJ1bl90eXBlX3Q7CisKKy8qKiBTaW1wbGUgUENNIGR1cGxleCB0eXBlICovCit0eXBlZGVmIGVudW0gX3NuZF9zcGNtX2R1cGxleF90eXBlIHsKKwkvKiogbGliZXJhbCBkdXBsZXggLSB0aGUgYnVmZmVyIGFuZCBwZXJpb2Qgc2l6ZXMgbWlnaHQgbm90IG1hdGNoICovCisJU05EX1NQQ01fRFVQTEVYX0xJQkVSQUwgPSAwLAorCS8qKiBwZWRhbnRpYyBkdXBsZXggLSB0aGUgYnVmZmVyIGFuZCBwZXJpb2Qgc2l6ZXMgTVVTVCBtYXRjaCAqLworCVNORF9TUENNX0RVUExFWF9QRURBTlRJQworfSBzbmRfc3BjbV9kdXBsZXhfdHlwZV90OworCitpbnQgc25kX3NwY21faW5pdChzbmRfcGNtX3QgKnBjbSwKKwkJICB1bnNpZ25lZCBpbnQgcmF0ZSwKKwkJICB1bnNpZ25lZCBpbnQgY2hhbm5lbHMsCisJCSAgc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQsCisJCSAgc25kX3BjbV9zdWJmb3JtYXRfdCBzdWJmb3JtYXQsCisJCSAgc25kX3NwY21fbGF0ZW5jeV90IGxhdGVuY3ksCisJCSAgc25kX3BjbV9hY2Nlc3NfdCBfYWNjZXNzLAorCQkgIHNuZF9zcGNtX3hydW5fdHlwZV90IHhydW5fdHlwZSk7CisKK2ludCBzbmRfc3BjbV9pbml0X2R1cGxleChzbmRfcGNtX3QgKnBsYXliYWNrX3BjbSwKKwkJCSBzbmRfcGNtX3QgKmNhcHR1cmVfcGNtLAorCQkJIHVuc2lnbmVkIGludCByYXRlLAorCQkJIHVuc2lnbmVkIGludCBjaGFubmVscywKKwkJCSBzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCwKKwkJCSBzbmRfcGNtX3N1YmZvcm1hdF90IHN1YmZvcm1hdCwKKwkJCSBzbmRfc3BjbV9sYXRlbmN5X3QgbGF0ZW5jeSwKKwkJCSBzbmRfcGNtX2FjY2Vzc190IF9hY2Nlc3MsCisJCQkgc25kX3NwY21feHJ1bl90eXBlX3QgeHJ1bl90eXBlLAorCQkJIHNuZF9zcGNtX2R1cGxleF90eXBlX3QgZHVwbGV4X3R5cGUpOworCitpbnQgc25kX3NwY21faW5pdF9nZXRfcGFyYW1zKHNuZF9wY21fdCAqcGNtLAorCQkJICAgICB1bnNpZ25lZCBpbnQgKnJhdGUsCisJCQkgICAgIHNuZF9wY21fdWZyYW1lc190ICpidWZmZXJfc2l6ZSwKKwkJCSAgICAgc25kX3BjbV91ZnJhbWVzX3QgKnBlcmlvZF9zaXplKTsKKworLyoqIFx9ICovCisKKy8qKgorICogXGRlZmdyb3VwIFBDTV9EZXByZWNhdGVkIERlcHJlY2F0ZWQgRnVuY3Rpb25zCisgKiBcaW5ncm91cCBQQ00KKyAqIFNlZSB0aGUgXHJlZiBwY20gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogXHsKKyAqLworCisvKiBEZXByZWNhdGVkIGZ1bmN0aW9ucywgZm9yIGNvbXBhdGliaWxpdHkgKi8KK2NvbnN0IGNoYXIgKnNuZF9wY21fc3RhcnRfbW9kZV9uYW1lKHNuZF9wY21fc3RhcnRfdCBtb2RlKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7Citjb25zdCBjaGFyICpzbmRfcGNtX3hydW5fbW9kZV9uYW1lKHNuZF9wY21feHJ1bl90IG1vZGUpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfc3RhcnRfbW9kZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3N0YXJ0X3QgdmFsKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7CitzbmRfcGNtX3N0YXJ0X3Qgc25kX3BjbV9zd19wYXJhbXNfZ2V0X3N0YXJ0X21vZGUoY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfc2V0X3hydW5fbW9kZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3hydW5fdCB2YWwpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKK3NuZF9wY21feHJ1bl90IHNuZF9wY21fc3dfcGFyYW1zX2dldF94cnVuX21vZGUoY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7CisjaWYgIWRlZmluZWQoQUxTQV9MSUJSQVJZX0JVSUxEKSAmJiAhZGVmaW5lZChBTFNBX1BDTV9PTERfU1dfUEFSQU1TX0FQSSkKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfeGZlcl9hbGlnbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCB2YWwpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfeGZlcl9hbGlnbihjb25zdCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfc2xlZXBfbWluKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfc2xlZXBfbWluKGNvbnN0IHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKKyNlbmRpZiAvKiAhQUxTQV9MSUJSQVJZX0JVSUxEICYmICFBTFNBX1BDTV9PTERfU1dfUEFSQU1TX0FQSSAqLworI2lmICFkZWZpbmVkKEFMU0FfTElCUkFSWV9CVUlMRCkgJiYgIWRlZmluZWQoQUxTQV9QQ01fT0xEX0hXX1BBUkFNU19BUEkpCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3RpY2tfdGltZShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcikgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF90aWNrX3RpbWVfbWluKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3RpY2tfdGltZV9tYXgoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190ZXN0X3RpY2tfdGltZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgZGlyKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3RpY2tfdGltZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgZGlyKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3RpY2tfdGltZV9taW4oc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3RpY2tfdGltZV9tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3RpY2tfdGltZV9taW5tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICptaW4sIGludCAqbWluZGlyLCB1bnNpZ25lZCBpbnQgKm1heCwgaW50ICptYXhkaXIpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3RpY2tfdGltZV9maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7CisjZW5kaWYgLyogIUFMU0FfTElCUkFSWV9CVUlMRCAmJiAhQUxTQV9QQ01fT0xEX0hXX1BBUkFNU19BUEkgKi8KKworLyoqIFx9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FMU0FfUENNX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY21fZXh0ZXJuYWwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY21fZXh0ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzUwNDE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9leHRlcm5hbC5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9wY21fZXh0ZXJuYWwuaAorICogXGJyaWVmIEV4dGVybmFsIFBDTSBwbHVnaW4gU0RLCisgKiBcYXV0aG9yIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqIFxkYXRlIDIwMDUKKyAqCisgKiBFeHRlcm4gUENNIHBsdWdpbiBTREsuCisgKi8KKworLyoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworI2lmbmRlZiBfX0FMU0FfUENNX0VYVEVSTkFMX0gKKyNkZWZpbmUgX19BTFNBX1BDTV9FWFRFUk5BTF9ICisKKyNpbmNsdWRlICJwY20uaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqICBcZGVmZ3JvdXAgUGx1Z2luX1NESyBFeHRlcm5hbCBQQ00gcGx1Z2luIFNESworICogIFx7CisgKi8KKworLyoqCisgKiBEZWZpbmUgdGhlIG9iamVjdCBlbnRyeSBmb3IgZXh0ZXJuYWwgUENNIHBsdWdpbnMKKyAqLworI2RlZmluZSBTTkRfUENNX1BMVUdJTl9FTlRSWShuYW1lKSBfc25kX3BjbV8jI25hbWUjI19vcGVuCisKKy8qKgorICogRGVmaW5lIHRoZSBzeW1ib2xzIG9mIHRoZSBnaXZlbiBwbHVnaW4gd2l0aCB2ZXJzaW9ucworICovCisjZGVmaW5lIFNORF9QQ01fUExVR0lOX1NZTUJPTChuYW1lKSBTTkRfRExTWU1fQlVJTERfVkVSU0lPTihTTkRfUENNX1BMVUdJTl9FTlRSWShuYW1lKSwgU05EX1BDTV9ETFNZTV9WRVJTSU9OKTsKKworLyoqCisgKiBEZWZpbmUgdGhlIHBsdWdpbgorICovCisjZGVmaW5lIFNORF9QQ01fUExVR0lOX0RFRklORV9GVU5DKHBsdWdpbikgXAoraW50IFNORF9QQ01fUExVR0lOX0VOVFJZKHBsdWdpbikgKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsXAorCQkJCSAgc25kX2NvbmZpZ190ICpyb290LCBzbmRfY29uZmlnX3QgKmNvbmYsIFwKKwkJCQkgIHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSkKKworI2luY2x1ZGUgInBjbV9pb3BsdWcuaCIKKyNpbmNsdWRlICJwY21fZXh0cGx1Zy5oIgorCitpbnQgc25kX3BjbV9wYXJzZV9jb250cm9sX2lkKHNuZF9jb25maWdfdCAqY29uZiwgc25kX2N0bF9lbGVtX2lkX3QgKmN0bF9pZCwgaW50ICpjYXJkcCwKKwkJCSAgICAgaW50ICpjY2hhbm5lbHNwLCBpbnQgKmh3Y3RscCk7CisKKy8qKiBcfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19BTFNBX1BDTV9FWFRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvcGNtX2V4dHBsdWcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY21fZXh0cGx1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNGM1YmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvcGNtX2V4dHBsdWcuaApAQCAtMCwwICsxLDE4OSBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL3BjbV9leHRwbHVnLmgKKyAqIFxicmllZiBFeHRlcm5hbCBGaWx0ZXItUGx1Z2luIFNESworICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAyMDA1CisgKgorICogRXh0ZXJuYWwgRmlsdGVyLVBsdWdpbiBTREsKKyAqLworCisvKgorICogQUxTQSBleHRlcm5hbCBQQ00gcGx1Z2luIFNESyAoZHJhZnQgdmVyc2lvbikKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQUxTQV9QQ01fRVhUUExVR19ICisjZGVmaW5lIF9fQUxTQV9QQ01fRVhUUExVR19ICisKKy8qKgorICogXGRlZmdyb3VwIFBDTV9FeHRQbHVnIEV4dGVybmFsIEZpbHRlciBwbHVnaW4gU0RLCisgKiBcaW5ncm91cCBQbHVnaW5fU0RLCisgKiBTZWUgdGhlIFxyZWYgcGNtIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFx7CisgKi8KKworLyoqIGh3IGNvbnN0cmFpbnRzIGZvciBleHRwbHVnICovCitlbnVtIHsKKwlTTkRfUENNX0VYVFBMVUdfSFdfRk9STUFULAkvKio8IGZvcm1hdCAqLworCVNORF9QQ01fRVhUUExVR19IV19DSEFOTkVMUywJLyoqPCBjaGFubmVscyAqLworCVNORF9QQ01fRVhUUExVR19IV19QQVJBTVMJLyoqPCBtYXggbnVtYmVyIG9mIGh3IGNvbnN0cmFpbnRzICovCit9OworCQorLyoqIEhhbmRsZSBvZiBleHRlcm5hbCBmaWx0ZXIgcGx1Z2luICovCit0eXBlZGVmIHN0cnVjdCBzbmRfcGNtX2V4dHBsdWcgc25kX3BjbV9leHRwbHVnX3Q7CisvKiogQ2FsbGJhY2sgdGFibGUgb2YgZXh0cGx1ZyAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9leHRwbHVnX2NhbGxiYWNrIHNuZF9wY21fZXh0cGx1Z19jYWxsYmFja190OworCisvKgorICogUHJvdG9jb2wgdmVyc2lvbgorICovCisjZGVmaW5lIFNORF9QQ01fRVhUUExVR19WRVJTSU9OX01BSk9SCTEJLyoqPCBQcm90b2NvbCBtYWpvciB2ZXJzaW9uICovCisjZGVmaW5lIFNORF9QQ01fRVhUUExVR19WRVJTSU9OX01JTk9SCTAJLyoqPCBQcm90b2NvbCBtaW5vciB2ZXJzaW9uICovCisjZGVmaW5lIFNORF9QQ01fRVhUUExVR19WRVJTSU9OX1RJTlkJMQkvKio8IFByb3RvY29sIHRpbnkgdmVyc2lvbiAqLworLyoqCisgKiBGaWx0ZXItcGx1Z2luIHByb3RvY29sIHZlcnNpb24KKyAqLworI2RlZmluZSBTTkRfUENNX0VYVFBMVUdfVkVSU0lPTgkJKChTTkRfUENNX0VYVFBMVUdfVkVSU0lPTl9NQUpPUjw8MTYpIHxcCisJCQkJCSAoU05EX1BDTV9FWFRQTFVHX1ZFUlNJT05fTUlOT1I8PDgpIHxcCisJCQkJCSAoU05EX1BDTV9FWFRQTFVHX1ZFUlNJT05fVElOWSkpCisKKy8qKiBIYW5kbGUgb2YgZXh0cGx1ZyAqLworc3RydWN0IHNuZF9wY21fZXh0cGx1ZyB7CisJLyoqCisJICogcHJvdG9jb2wgdmVyc2lvbjsgI1NORF9QQ01fRVhUUExVR19WRVJTSU9OIG11c3QgYmUgZmlsbGVkIGhlcmUKKwkgKiBiZWZvcmUgY2FsbGluZyAjc25kX3BjbV9leHRwbHVnX2NyZWF0ZSgpCisJICovCisJdW5zaWduZWQgaW50IHZlcnNpb247CisJLyoqCisJICogbmFtZSBvZiB0aGlzIHBsdWdpbjsgbXVzdCBiZSBmaWxsZWQgYmVmb3JlIGNhbGxpbmcgI3NuZF9wY21fZXh0cGx1Z19jcmVhdGUoKQorCSAqLworCWNvbnN0IGNoYXIgKm5hbWU7CisJLyoqCisJICogY2FsbGJhY2tzIG9mIHRoaXMgcGx1Z2luOyBtdXN0IGJlIGZpbGxlZCBiZWZvcmUgY2FsbGluZyAjc25kX3BjbV9leHRwbHVnX2NyZWF0ZSgpCisJICovCisJY29uc3Qgc25kX3BjbV9leHRwbHVnX2NhbGxiYWNrX3QgKmNhbGxiYWNrOworCS8qKgorCSAqIHByaXZhdGUgZGF0YSwgd2hpY2ggY2FuIGJlIHVzZWQgZnJlZWx5IGluIHRoZSBkcml2ZXIgY2FsbGJhY2tzCisJICovCisJdm9pZCAqcHJpdmF0ZV9kYXRhOworCS8qKgorCSAqIFBDTSBoYW5kbGUgZmlsbGVkIGJ5ICNzbmRfcGNtX2V4dHBsdWdfY3JlYXRlKCkKKwkgKi8KKwlzbmRfcGNtX3QgKnBjbTsKKwkvKioKKwkgKiBzdHJlYW0gZGlyZWN0aW9uOyByZWFkLW9ubHkgc3RhdHVzCisJICovCisJc25kX3BjbV9zdHJlYW1fdCBzdHJlYW07CisJLyoqCisJICogZm9ybWF0IGh3IHBhcmFtZXRlcjsgZmlsbGVkIGFmdGVyIGh3X3BhcmFtcyBpcyBjYWxlZAorCSAqLworCXNuZF9wY21fZm9ybWF0X3QgZm9ybWF0OworCS8qKgorCSAqIHN1YmZvcm1hdCBodyBwYXJhbWV0ZXI7IGZpbGxlZCBhZnRlciBod19wYXJhbXMgaXMgY2FsZWQKKwkgKi8KKwlzbmRfcGNtX3N1YmZvcm1hdF90IHN1YmZvcm1hdDsKKwkvKioKKwkgKiBjaGFubmVscyBodyBwYXJhbWV0ZXI7IGZpbGxlZCBhZnRlciBod19wYXJhbXMgaXMgY2FsZWQKKwkgKi8KKwl1bnNpZ25lZCBpbnQgY2hhbm5lbHM7CisJLyoqCisJICogcmF0ZSBodyBwYXJhbWV0ZXI7IGZpbGxlZCBhZnRlciBod19wYXJhbXMgaXMgY2FsZWQKKwkgKi8KKwl1bnNpZ25lZCBpbnQgcmF0ZTsKKwkvKioKKwkgKiBzbGF2ZV9mb3JtYXQgaHcgcGFyYW1ldGVyOyBmaWxsZWQgYWZ0ZXIgaHdfcGFyYW1zIGlzIGNhbGVkCisJICovCisJc25kX3BjbV9mb3JtYXRfdCBzbGF2ZV9mb3JtYXQ7CisJLyoqCisJICogc2xhdmVfc3ViZm9ybWF0IGh3IHBhcmFtZXRlcjsgZmlsbGVkIGFmdGVyIGh3X3BhcmFtcyBpcyBjYWxlZAorCSAqLworCXNuZF9wY21fc3ViZm9ybWF0X3Qgc2xhdmVfc3ViZm9ybWF0OworCS8qKgorCSAqIHNsYXZlX2NoYW5uZWxzIGh3IHBhcmFtZXRlcjsgZmlsbGVkIGFmdGVyIGh3X3BhcmFtcyBpcyBjYWxlZAorCSAqLworCXVuc2lnbmVkIGludCBzbGF2ZV9jaGFubmVsczsKK307CisKKy8qKiBDYWxsYmFjayB0YWJsZSBvZiBleHRwbHVnICovCitzdHJ1Y3Qgc25kX3BjbV9leHRwbHVnX2NhbGxiYWNrIHsKKwkvKioKKwkgKiB0cmFuc2ZlciBiZXR3ZWVuIHNvdXJjZSBhbmQgZGVzdGluYXRpb247IHRoaXMgaXMgYSByZXF1aXJlZCBjYWxsYmFjaworCSAqLworCXNuZF9wY21fc2ZyYW1lc190ICgqdHJhbnNmZXIpKHNuZF9wY21fZXh0cGx1Z190ICpleHQsCisJCQkJICAgICAgY29uc3Qgc25kX3BjbV9jaGFubmVsX2FyZWFfdCAqZHN0X2FyZWFzLAorCQkJCSAgICAgIHNuZF9wY21fdWZyYW1lc190IGRzdF9vZmZzZXQsCisJCQkJICAgICAgY29uc3Qgc25kX3BjbV9jaGFubmVsX2FyZWFfdCAqc3JjX2FyZWFzLAorCQkJCSAgICAgIHNuZF9wY21fdWZyYW1lc190IHNyY19vZmZzZXQsCisJCQkJICAgICAgc25kX3BjbV91ZnJhbWVzX3Qgc2l6ZSk7CisJLyoqCisJICogY2xvc2UgdGhlIFBDTTsgb3B0aW9uYWwKKwkgKi8KKwlpbnQgKCpjbG9zZSkoc25kX3BjbV9leHRwbHVnX3QgKmV4dCk7CisJLyoqCisJICogaHdfcGFyYW1zOyBvcHRpb25hbAorCSAqLworCWludCAoKmh3X3BhcmFtcykoc25kX3BjbV9leHRwbHVnX3QgKmV4dCwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKKwkvKioKKwkgKiBod19mcmVlOyBvcHRpb25hbAorCSAqLworCWludCAoKmh3X2ZyZWUpKHNuZF9wY21fZXh0cGx1Z190ICpleHQpOworCS8qKgorCSAqIGR1bXA7IG9wdGlvbmFsCisJICovCisJdm9pZCAoKmR1bXApKHNuZF9wY21fZXh0cGx1Z190ICpleHQsIHNuZF9vdXRwdXRfdCAqb3V0KTsKKwkvKioKKwkgKiBpbml0OyBvcHRpb25hbCBpbml0aWFsaXphdGlvbiBjYWxsZWQgYXQgcHJlcGFyZSBvciByZXNldAorCSAqLworCWludCAoKmluaXQpKHNuZF9wY21fZXh0cGx1Z190ICpleHQpOworfTsKKworCitpbnQgc25kX3BjbV9leHRwbHVnX2NyZWF0ZShzbmRfcGNtX2V4dHBsdWdfdCAqZXh0LCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgc25kX2NvbmZpZ190ICpyb290LCBzbmRfY29uZmlnX3QgKnNsYXZlX2NvbmYsCisJCQkgICBzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpOworaW50IHNuZF9wY21fZXh0cGx1Z19kZWxldGUoc25kX3BjbV9leHRwbHVnX3QgKmV4dCk7CisKKy8qIGNsZWFyIGh3X3BhcmFtZXRlciBzZXR0aW5nICovCit2b2lkIHNuZF9wY21fZXh0cGx1Z19wYXJhbXNfcmVzZXQoc25kX3BjbV9leHRwbHVnX3QgKmV4dCk7CisKKy8qIGh3X3BhcmFtZXRlciBzZXR0aW5nICovCitpbnQgc25kX3BjbV9leHRwbHVnX3NldF9wYXJhbV9saXN0KHNuZF9wY21fZXh0cGx1Z190ICpleHRwbHVnLCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IG51bV9saXN0LCBjb25zdCB1bnNpZ25lZCBpbnQgKmxpc3QpOworaW50IHNuZF9wY21fZXh0cGx1Z19zZXRfcGFyYW1fbWlubWF4KHNuZF9wY21fZXh0cGx1Z190ICpleHRwbHVnLCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IG1pbiwgdW5zaWduZWQgaW50IG1heCk7CitpbnQgc25kX3BjbV9leHRwbHVnX3NldF9zbGF2ZV9wYXJhbV9saXN0KHNuZF9wY21fZXh0cGx1Z190ICpleHRwbHVnLCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IG51bV9saXN0LCBjb25zdCB1bnNpZ25lZCBpbnQgKmxpc3QpOworaW50IHNuZF9wY21fZXh0cGx1Z19zZXRfc2xhdmVfcGFyYW1fbWlubWF4KHNuZF9wY21fZXh0cGx1Z190ICpleHRwbHVnLCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IG1pbiwgdW5zaWduZWQgaW50IG1heCk7CisKKy8qKgorICogc2V0IHRoZSBwYXJhbWV0ZXIgY29uc3RyYWludCB3aXRoIGEgc2luZ2xlIHZhbHVlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNuZF9wY21fZXh0cGx1Z19zZXRfcGFyYW0oc25kX3BjbV9leHRwbHVnX3QgKmV4dHBsdWcsIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCXJldHVybiBzbmRfcGNtX2V4dHBsdWdfc2V0X3BhcmFtX2xpc3QoZXh0cGx1ZywgdHlwZSwgMSwgJnZhbCk7Cit9CisKKy8qKgorICogc2V0IHRoZSBwYXJhbWV0ZXIgY29uc3RyYWludCBmb3Igc2xhdmUgUENNIHdpdGggYSBzaW5nbGUgdmFsdWUKKyAqLworc3RhdGljIGlubGluZSBpbnQgc25kX3BjbV9leHRwbHVnX3NldF9zbGF2ZV9wYXJhbShzbmRfcGNtX2V4dHBsdWdfdCAqZXh0cGx1ZywgaW50IHR5cGUsIHVuc2lnbmVkIGludCB2YWwpCit7CisJcmV0dXJuIHNuZF9wY21fZXh0cGx1Z19zZXRfc2xhdmVfcGFyYW1fbGlzdChleHRwbHVnLCB0eXBlLCAxLCAmdmFsKTsKK30KKworLyoqIFx9ICovCisKKyNlbmRpZiAvKiBfX0FMU0FfUENNX0VYVFBMVUdfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9pb3BsdWcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY21faW9wbHVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMzMWNmMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY21faW9wbHVnLmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9wY21faW9wbHVnLmgKKyAqIFxicmllZiBFeHRlcm5hbCBJL08tUGx1Z2luIFNESworICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAyMDA1CisgKgorICogRXh0ZXJuYWwgSS9PLVBsdWdpbiBTREsKKyAqLworCisvKgorICogQUxTQSBleHRlcm5hbCBQQ00gcGx1Z2luIFNESworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX1BDTV9JT1BMVUdfSAorI2RlZmluZSBfX0FMU0FfUENNX0lPUExVR19ICisKKy8qKgorICogXGRlZmdyb3VwIFBDTV9JT1BsdWcgRXh0ZXJuYWwgSS9PIHBsdWdpbiBTREsKKyAqIFxpbmdyb3VwIFBsdWdpbl9TREsKKyAqIFNlZSB0aGUgXHJlZiBwY20gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogXHsKKyAqLworCisvKiogaHcgY29uc3RyYWludHMgZm9yIGlvcGx1ZyAqLworZW51bSB7CisJU05EX1BDTV9JT1BMVUdfSFdfQUNDRVNTID0gMCwJLyoqPCBhY2Nlc3MgdHlwZSAqLworCVNORF9QQ01fSU9QTFVHX0hXX0ZPUk1BVCwJLyoqPCBmb3JtYXQgKi8KKwlTTkRfUENNX0lPUExVR19IV19DSEFOTkVMUywJLyoqPCBjaGFubmVscyAqLworCVNORF9QQ01fSU9QTFVHX0hXX1JBVEUsCQkvKio8IHJhdGUgKi8KKwlTTkRfUENNX0lPUExVR19IV19QRVJJT0RfQllURVMsCS8qKjwgcGVyaW9kIGJ5dGVzICovCisJU05EX1BDTV9JT1BMVUdfSFdfQlVGRkVSX0JZVEVTLAkvKio8IGJ1ZmZlciBieXRlcyAqLworCVNORF9QQ01fSU9QTFVHX0hXX1BFUklPRFMsCS8qKjwgbnVtYmVyIG9mIHBlcmlvZHMgKi8KKwlTTkRfUENNX0lPUExVR19IV19QQVJBTVMJLyoqPCBtYXggbnVtYmVyIG9mIGh3IGNvbnN0cmFpbnRzICovCit9OworCQorLyoqIEkvTyBwbHVnaW4gaGFuZGxlICovCit0eXBlZGVmIHN0cnVjdCBzbmRfcGNtX2lvcGx1ZyBzbmRfcGNtX2lvcGx1Z190OworLyoqIENhbGxiYWNrIHRhYmxlIG9mIGlvcGx1ZyAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9pb3BsdWdfY2FsbGJhY2sgc25kX3BjbV9pb3BsdWdfY2FsbGJhY2tfdDsKKworLyoKKyAqIGJpdCBmbGFncyBmb3IgYWRkaXRpb25hbCBjb25kaXRpb25zCisgKi8KKyNkZWZpbmUgU05EX1BDTV9JT1BMVUdfRkxBR19MSVNURUQJKDE8PDApCQkvKio8IGxpc3QgdXAgdGhpcyBQQ00gKi8KKyNkZWZpbmUgU05EX1BDTV9JT1BMVUdfRkxBR19NT05PVE9OSUMJKDE8PDEpCQkvKio8IG1vbm90b25pYyB0aW1lc3RhbXBzICovCisKKy8qCisgKiBQcm90b2NvbCB2ZXJzaW9uCisgKi8KKyNkZWZpbmUgU05EX1BDTV9JT1BMVUdfVkVSU0lPTl9NQUpPUgkxCS8qKjwgUHJvdG9jb2wgbWFqb3IgdmVyc2lvbiAqLworI2RlZmluZSBTTkRfUENNX0lPUExVR19WRVJTSU9OX01JTk9SCTAJLyoqPCBQcm90b2NvbCBtaW5vciB2ZXJzaW9uICovCisjZGVmaW5lIFNORF9QQ01fSU9QTFVHX1ZFUlNJT05fVElOWQkxCS8qKjwgUHJvdG9jb2wgdGlueSB2ZXJzaW9uICovCisvKioKKyAqIElPLXBsdWdpbiBwcm90b2NvbCB2ZXJzaW9uCisgKi8KKyNkZWZpbmUgU05EX1BDTV9JT1BMVUdfVkVSU0lPTgkJKChTTkRfUENNX0lPUExVR19WRVJTSU9OX01BSk9SPDwxNikgfFwKKwkJCQkJIChTTkRfUENNX0lPUExVR19WRVJTSU9OX01JTk9SPDw4KSB8XAorCQkJCQkgKFNORF9QQ01fSU9QTFVHX1ZFUlNJT05fVElOWSkpCisKKy8qKiBIYW5kbGUgb2YgaW9wbHVnICovCitzdHJ1Y3Qgc25kX3BjbV9pb3BsdWcgeworCS8qKgorCSAqIHByb3RvY29sIHZlcnNpb247ICNTTkRfUENNX0lPUExVR19WRVJTSU9OIG11c3QgYmUgZmlsbGVkIGhlcmUKKwkgKiBiZWZvcmUgY2FsbGluZyAjc25kX3BjbV9pb3BsdWdfY3JlYXRlKCkKKwkgKi8KKwl1bnNpZ25lZCBpbnQgdmVyc2lvbjsKKwkvKioKKwkgKiBuYW1lIG9mIHRoaXMgcGx1Z2luOyBtdXN0IGJlIGZpbGxlZCBiZWZvcmUgY2FsbGluZyAjc25kX3BjbV9pb3BsdWdfY3JlYXRlKCkKKwkgKi8KKwljb25zdCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBmbGFnczsJLyoqPCBTTkRfUENNX0lPUExVR19GTEFHX1hYWCAqLworCWludCBwb2xsX2ZkOwkJLyoqPCBwb2xsIGZpbGUgZGVzY3JpcHRvciAqLworCXVuc2lnbmVkIGludCBwb2xsX2V2ZW50czsJLyoqPCBwb2xsIGV2ZW50cyAqLworCXVuc2lnbmVkIGludCBtbWFwX3J3OwkJLyoqPCBwc2V1ZG8gbW1hcCBtb2RlICovCisJLyoqCisJICogY2FsbGJhY2tzIG9mIHRoaXMgcGx1Z2luOyBtdXN0IGJlIGZpbGxlZCBiZWZvcmUgY2FsbGluZyAjc25kX3BjbV9pb3BsdWdfY3JlYXRlKCkKKwkgKi8KKwljb25zdCBzbmRfcGNtX2lvcGx1Z19jYWxsYmFja190ICpjYWxsYmFjazsKKwkvKioKKwkgKiBwcml2YXRlIGRhdGEsIHdoaWNoIGNhbiBiZSB1c2VkIGZyZWVseSBpbiB0aGUgZHJpdmVyIGNhbGxiYWNrcworCSAqLworCXZvaWQgKnByaXZhdGVfZGF0YTsKKwkvKioKKwkgKiBQQ00gaGFuZGxlIGZpbGxlZCBieSAjc25kX3BjbV9leHRwbHVnX2NyZWF0ZSgpCisJICovCisJc25kX3BjbV90ICpwY207CisKKwlzbmRfcGNtX3N0cmVhbV90IHN0cmVhbTsJLyoqPCBzdHJlYW0gZGlyZWNpb247IHJlYWQtb25seSAqLwkKKwlzbmRfcGNtX3N0YXRlX3Qgc3RhdGU7CQkvKio8IGN1cnJlbnQgUENNIHN0YXRlOyByZWFkLW9ubHkgKi8KKwl2b2xhdGlsZSBzbmRfcGNtX3VmcmFtZXNfdCBhcHBsX3B0cjsJLyoqPCBhcHBsaWNhdGlvbiBwb2ludGVyOyByZWFkLW9ubHkgKi8KKwl2b2xhdGlsZSBzbmRfcGNtX3VmcmFtZXNfdCBod19wdHI7CS8qKjwgaHcgcG9pbnRlcjsgcmVhZC1vbmx5ICovCisJaW50IG5vbmJsb2NrOwkJCS8qKjwgbm9uLWJsb2NrIG1vZGU7IHJlYWQtb25seSAqLworCisJc25kX3BjbV9hY2Nlc3NfdCBhY2Nlc3M7CS8qKjwgYWNjZXNzIHR5cGU7IGZpbGxlZCBhZnRlciBod19wYXJhbXMgaXMgY2FsbGVkICovCisJc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQ7CS8qKjwgUENNIGZvcm1hdDsgZmlsbGVkIGFmdGVyIGh3X3BhcmFtcyBpcyBjYWxsZWQgKi8KKwl1bnNpZ25lZCBpbnQgY2hhbm5lbHM7CQkvKio8IG51bWJlciBvZiBjaGFubmVsczsgZmlsbGVkIGFmdGVyIGh3X3BhcmFtcyBpcyBjYWxsZWQgKi8KKwl1bnNpZ25lZCBpbnQgcmF0ZTsJCS8qKjwgcmF0ZTsgZmlsbGVkIGFmdGVyIGh3X3BhcmFtcyBpcyBjYWxsZWQgKi8KKwlzbmRfcGNtX3VmcmFtZXNfdCBwZXJpb2Rfc2l6ZTsJLyoqPCBwZXJpb2Qgc2l6ZTsgZmlsbGVkIGFmdGVyIGh3X3BhcmFtcyBpcyBjYWxsZWQgKi8KKwlzbmRfcGNtX3VmcmFtZXNfdCBidWZmZXJfc2l6ZTsJLyoqPCBidWZmZXIgc2l6ZTsgZmlsbGVkIGFmdGVyIGh3X3BhcmFtcyBpcyBjYWxsZWQgKi8KK307CisKKy8qKiBDYWxsYmFjayB0YWJsZSBvZiBpb3BsdWcgKi8KK3N0cnVjdCBzbmRfcGNtX2lvcGx1Z19jYWxsYmFjayB7CisJLyoqCisJICogc3RhcnQgdGhlIFBDTTsgcmVxdWlyZWQKKwkgKi8KKwlpbnQgKCpzdGFydCkoc25kX3BjbV9pb3BsdWdfdCAqaW8pOworCS8qKgorCSAqIHN0b3AgdGhlIFBDTTsgcmVxdWlyZWQKKwkgKi8KKwlpbnQgKCpzdG9wKShzbmRfcGNtX2lvcGx1Z190ICppbyk7CisJLyoqCisJICogZ2V0IHRoZSBjdXJyZW50IERNQSBwb3NpdGlvbjsgcmVxdWlyZWQKKwkgKi8KKwlzbmRfcGNtX3NmcmFtZXNfdCAoKnBvaW50ZXIpKHNuZF9wY21faW9wbHVnX3QgKmlvKTsKKwkvKioKKwkgKiB0cmFuc2ZlciB0aGUgZGF0YTsgb3B0aW9uYWwKKwkgKi8KKwlzbmRfcGNtX3NmcmFtZXNfdCAoKnRyYW5zZmVyKShzbmRfcGNtX2lvcGx1Z190ICppbywKKwkJCQkgICAgICBjb25zdCBzbmRfcGNtX2NoYW5uZWxfYXJlYV90ICphcmVhcywKKwkJCQkgICAgICBzbmRfcGNtX3VmcmFtZXNfdCBvZmZzZXQsCisJCQkJICAgICAgc25kX3BjbV91ZnJhbWVzX3Qgc2l6ZSk7CisJLyoqCisJICogY2xvc2UgdGhlIFBDTTsgb3B0aW9uYWwKKwkgKi8KKwlpbnQgKCpjbG9zZSkoc25kX3BjbV9pb3BsdWdfdCAqaW8pOworCS8qKgorCSAqIGh3X3BhcmFtczsgb3B0aW9uYWwKKwkgKi8KKwlpbnQgKCpod19wYXJhbXMpKHNuZF9wY21faW9wbHVnX3QgKmlvLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworCS8qKgorCSAqIGh3X2ZyZWU7IG9wdGlvbmFsCisJICovCisJaW50ICgqaHdfZnJlZSkoc25kX3BjbV9pb3BsdWdfdCAqaW8pOworCS8qKgorCSAqIHN3X3BhcmFtczsgb3B0aW9uYWwKKwkgKi8KKwlpbnQgKCpzd19wYXJhbXMpKHNuZF9wY21faW9wbHVnX3QgKmlvLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMpOworCS8qKgorCSAqIHByZXBhcmU7IG9wdGlvbmFsCisJICovCisJaW50ICgqcHJlcGFyZSkoc25kX3BjbV9pb3BsdWdfdCAqaW8pOworCS8qKgorCSAqIGRyYWluOyBvcHRpb25hbAorCSAqLworCWludCAoKmRyYWluKShzbmRfcGNtX2lvcGx1Z190ICppbyk7CisJLyoqCisJICogdG9nZ2xlIHBhdXNlOyBvcHRpb25hbAorCSAqLworCWludCAoKnBhdXNlKShzbmRfcGNtX2lvcGx1Z190ICppbywgaW50IGVuYWJsZSk7CisJLyoqCisJICogcmVzdW1lOyBvcHRpb25hbAorCSAqLworCWludCAoKnJlc3VtZSkoc25kX3BjbV9pb3BsdWdfdCAqaW8pOworCS8qKgorCSAqIHBvbGwgZGVzY3JpcHRvcnMgY291bnQ7IG9wdGlvbmFsCisJICovCisJaW50ICgqcG9sbF9kZXNjcmlwdG9yc19jb3VudCkoc25kX3BjbV9pb3BsdWdfdCAqaW8pOworCS8qKgorCSAqIHBvbGwgZGVzY3JpcHRvcnM7IG9wdGlvbmFsCisJICovCisJaW50ICgqcG9sbF9kZXNjcmlwdG9ycykoc25kX3BjbV9pb3BsdWdfdCAqaW8sIHN0cnVjdCBwb2xsZmQgKnBmZCwgdW5zaWduZWQgaW50IHNwYWNlKTsKKwkvKioKKwkgKiBtYW5nbGUgcG9sbCBldmVudHM7IG9wdGlvbmFsCisJICovCisJaW50ICgqcG9sbF9yZXZlbnRzKShzbmRfcGNtX2lvcGx1Z190ICppbywgc3RydWN0IHBvbGxmZCAqcGZkLCB1bnNpZ25lZCBpbnQgbmZkcywgdW5zaWduZWQgc2hvcnQgKnJldmVudHMpOworCS8qKgorCSAqIGR1bXA7IG9wdGlvbmFsCisJICovCisJdm9pZCAoKmR1bXApKHNuZF9wY21faW9wbHVnX3QgKmlvLCBzbmRfb3V0cHV0X3QgKm91dCk7CisJLyoqCisJICogZ2V0IHRoZSBkZWxheSBmb3IgdGhlIHJ1bm5pbmcgUENNOyBvcHRpb25hbAorCSAqLworCWludCAoKmRlbGF5KShzbmRfcGNtX2lvcGx1Z190ICppbywgc25kX3BjbV9zZnJhbWVzX3QgKmRlbGF5cCk7Cit9OworCisKK2ludCBzbmRfcGNtX2lvcGx1Z19jcmVhdGUoc25kX3BjbV9pb3BsdWdfdCAqaW8sIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgIHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSk7CitpbnQgc25kX3BjbV9pb3BsdWdfZGVsZXRlKHNuZF9wY21faW9wbHVnX3QgKmlvKTsKKworLyogdXBkYXRlIHBvbGxfZmQgYW5kIG1tYXBfcncgKi8KK2ludCBzbmRfcGNtX2lvcGx1Z19yZWluaXRfc3RhdHVzKHNuZF9wY21faW9wbHVnX3QgKmlvcGx1Zyk7CisKKy8qIGdldCBhIG1tYXAgYXJlYSAoZm9yIG1tYXBfcncgb25seSkgKi8KK2NvbnN0IHNuZF9wY21fY2hhbm5lbF9hcmVhX3QgKnNuZF9wY21faW9wbHVnX21tYXBfYXJlYXMoc25kX3BjbV9pb3BsdWdfdCAqaW9wbHVnKTsKKworLyogY2xlYXIgaHdfcGFyYW1ldGVyIHNldHRpbmcgKi8KK3ZvaWQgc25kX3BjbV9pb3BsdWdfcGFyYW1zX3Jlc2V0KHNuZF9wY21faW9wbHVnX3QgKmlvKTsKKworLyogaHdfcGFyYW1ldGVyIHNldHRpbmcgKi8KK2ludCBzbmRfcGNtX2lvcGx1Z19zZXRfcGFyYW1fbWlubWF4KHNuZF9wY21faW9wbHVnX3QgKmlvLCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IG1pbiwgdW5zaWduZWQgaW50IG1heCk7CitpbnQgc25kX3BjbV9pb3BsdWdfc2V0X3BhcmFtX2xpc3Qoc25kX3BjbV9pb3BsdWdfdCAqaW8sIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgbnVtX2xpc3QsIGNvbnN0IHVuc2lnbmVkIGludCAqbGlzdCk7CisKKy8qIGNoYW5nZSBQQ00gc3RhdHVzICovCitpbnQgc25kX3BjbV9pb3BsdWdfc2V0X3N0YXRlKHNuZF9wY21faW9wbHVnX3QgKmlvcGx1Zywgc25kX3BjbV9zdGF0ZV90IHN0YXRlKTsKKworLyoqIFx9ICovCisKKyNlbmRpZiAvKiBfX0FMU0FfUENNX0lPUExVR19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvcGNtX29sZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9vbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGRlNGMzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9vbGQuaApAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIE9sZCBBTFNBIDAuOS54IEFQSQorICovCisKKyNpZmRlZiBBTFNBX1BDTV9PTERfSFdfUEFSQU1TX0FQSQorCithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X2FjY2VzcyxzbmRfcGNtX2h3X3BhcmFtc19nZXRfYWNjZXNzQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X2FjY2Vzc19maXJzdCxzbmRfcGNtX2h3X3BhcmFtc19zZXRfYWNjZXNzX2ZpcnN0QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X2FjY2Vzc19sYXN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3NfbGFzdEBBTFNBXzAuOSIpOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2FjY2Vzcyhjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfYWNjZXNzKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fYWNjZXNzX3QgdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYWNjZXNzKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fYWNjZXNzX3QgdmFsKTsKK3NuZF9wY21fYWNjZXNzX3Qgc25kX3BjbV9od19wYXJhbXNfc2V0X2FjY2Vzc19maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK3NuZF9wY21fYWNjZXNzX3Qgc25kX3BjbV9od19wYXJhbXNfc2V0X2FjY2Vzc19sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3NfbWFzayhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2FjY2Vzc19tYXNrX3QgKm1hc2spOwordm9pZCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYWNjZXNzX21hc2soc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2FjY2Vzc19tYXNrX3QgKm1hc2spOworCithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X2Zvcm1hdCxzbmRfcGNtX2h3X3BhcmFtc19nZXRfZm9ybWF0QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdF9maXJzdCxzbmRfcGNtX2h3X3BhcmFtc19zZXRfZm9ybWF0X2ZpcnN0QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdF9sYXN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9mb3JtYXRfbGFzdEBBTFNBXzAuOSIpOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2Zvcm1hdChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfZm9ybWF0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fZm9ybWF0X3QgdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfZm9ybWF0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fZm9ybWF0X3QgdmFsKTsKK3NuZF9wY21fZm9ybWF0X3Qgc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdF9maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK3NuZF9wY21fZm9ybWF0X3Qgc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdF9sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9mb3JtYXRfbWFzayhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2Zvcm1hdF9tYXNrX3QgKm1hc2spOwordm9pZCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfZm9ybWF0X21hc2soc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2Zvcm1hdF9tYXNrX3QgKm1hc2spOworCithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X3N1YmZvcm1hdCxzbmRfcGNtX2h3X3BhcmFtc19nZXRfc3ViZm9ybWF0QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X3N1YmZvcm1hdF9maXJzdCxzbmRfcGNtX2h3X3BhcmFtc19zZXRfc3ViZm9ybWF0X2ZpcnN0QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X3N1YmZvcm1hdF9sYXN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9zdWJmb3JtYXRfbGFzdEBBTFNBXzAuOSIpOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfdGVzdF9zdWJmb3JtYXQoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9zdWJmb3JtYXRfdCB2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9zdWJmb3JtYXQoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfc3ViZm9ybWF0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fc3ViZm9ybWF0X3QgdmFsKTsKK3NuZF9wY21fc3ViZm9ybWF0X3Qgc25kX3BjbV9od19wYXJhbXNfc2V0X3N1YmZvcm1hdF9maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK3NuZF9wY21fc3ViZm9ybWF0X3Qgc25kX3BjbV9od19wYXJhbXNfc2V0X3N1YmZvcm1hdF9sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9zdWJmb3JtYXRfbWFzayhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3QgKm1hc2spOwordm9pZCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfc3ViZm9ybWF0X21hc2soc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3QgKm1hc2spOworCithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X2NoYW5uZWxzLHNuZF9wY21faHdfcGFyYW1zX2dldF9jaGFubmVsc0BBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9jaGFubmVsc19taW4sc25kX3BjbV9od19wYXJhbXNfZ2V0X2NoYW5uZWxzX21pbkBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9jaGFubmVsc19tYXgsc25kX3BjbV9od19wYXJhbXNfZ2V0X2NoYW5uZWxzX21heEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19uZWFyLHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19uZWFyQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX2ZpcnN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19maXJzdEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19sYXN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19sYXN0QEFMU0FfMC45Iik7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfY2hhbm5lbHMoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfY2hhbm5lbHNfbWluKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2NoYW5uZWxzX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfY2hhbm5lbHMoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19taW4oc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19taW5tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICptaW4sIHVuc2lnbmVkIGludCAqbWF4KTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHNfbmVhcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHNfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CisKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcmF0ZSxzbmRfcGNtX2h3X3BhcmFtc19nZXRfcmF0ZUBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9yYXRlX21pbixzbmRfcGNtX2h3X3BhcmFtc19nZXRfcmF0ZV9taW5AQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcmF0ZV9tYXgsc25kX3BjbV9od19wYXJhbXNfZ2V0X3JhdGVfbWF4QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfbmVhcixzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9uZWFyQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfZmlyc3Qsc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfZmlyc3RAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9sYXN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX2xhc3RAQUxTQV8wLjkiKTsKKworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9yYXRlKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9yYXRlX21pbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcmF0ZV9tYXgoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfdGVzdF9yYXRlKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX21pbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX21heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKm1pbiwgaW50ICptaW5kaXIsIHVuc2lnbmVkIGludCAqbWF4LCBpbnQgKm1heGRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfbmVhcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgKmRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX3Jlc2FtcGxlKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9yYXRlX3Jlc2FtcGxlKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsKTsKKworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RfdGltZSxzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3RpbWVAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3RpbWVfbWluLHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RfdGltZV9taW5AQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3RpbWVfbWF4LHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RfdGltZV9tYXhAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfbmVhcixzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfbmVhckBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9maXJzdCxzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfZmlyc3RAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfbGFzdCxzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfbGFzdEBBTFNBXzAuOSIpOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF90aW1lKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RfdGltZV9taW4oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF90aW1lX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190ZXN0X3BlcmlvZF90aW1lKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfbWluKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF90aW1lX21heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9taW5tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICptaW4sIGludCAqbWluZGlyLCB1bnNpZ25lZCBpbnQgKm1heCwgaW50ICptYXhkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9uZWFyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKKworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2Rfc2l6ZSxzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3NpemVAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3NpemVfbWluLHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2Rfc2l6ZV9taW5AQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3NpemVfbWF4LHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2Rfc2l6ZV9tYXhAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbmVhcixzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbmVhckBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9maXJzdCxzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfZmlyc3RAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbGFzdCxzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbGFzdEBBTFNBXzAuOSIpOworCitzbmRfcGNtX3NmcmFtZXNfdCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3NpemUoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3NpemVfbWluKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF9zaXplX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190ZXN0X3BlcmlvZF9zaXplKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX21pbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX21heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqbWluLCBpbnQgKm1pbmRpciwgc25kX3BjbV91ZnJhbWVzX3QgKm1heCwgaW50ICptYXhkaXIpOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsLCBpbnQgKmRpcik7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9pbnRlZ2VyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworCithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZHMsc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZHNAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kc19taW4sc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZHNfbWluQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZHNfbWF4LHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RzX21heEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX25lYXIsc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHNfbmVhckBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX2ZpcnN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX2ZpcnN0QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHNfbGFzdCxzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kc19sYXN0QEFMU0FfMC45Iik7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kcyhjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kc19taW4oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZHNfbWF4KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfcGVyaW9kcyhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kcyhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kc19taW4oc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kc19tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kc19taW5tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICptaW4sIGludCAqbWluZGlyLCB1bnNpZ25lZCBpbnQgKm1heCwgaW50ICptYXhkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX2ZpcnN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kc19sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kc19pbnRlZ2VyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworCithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl90aW1lLHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfdGltZUBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfdGltZV9taW4sc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl90aW1lX21pbkBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfdGltZV9tYXgsc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl90aW1lX21heEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9uZWFyLHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9uZWFyQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX2ZpcnN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9maXJzdEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9sYXN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9sYXN0QEFMU0FfMC45Iik7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3RpbWUoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl90aW1lX21pbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3RpbWVfbWF4KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfYnVmZmVyX3RpbWUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9taW4oc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWVfbWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKm1pbiwgaW50ICptaW5kaXIsIHVuc2lnbmVkIGludCAqbWF4LCBpbnQgKm1heGRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworCithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplLHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfc2l6ZUBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfc2l6ZV9taW4sc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplX21pbkBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfc2l6ZV9tYXgsc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplX21heEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9uZWFyLHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9uZWFyQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX2ZpcnN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9maXJzdEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9sYXN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9sYXN0QEFMU0FfMC45Iik7CisKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfc2l6ZShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplX21pbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfYnVmZmVyX3NpemUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3NpemUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3NpemVfbWluKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqbWluLCBzbmRfcGNtX3VmcmFtZXNfdCAqbWF4KTsKK3NuZF9wY21fdWZyYW1lc190IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9uZWFyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3NpemVfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3NpemVfbGFzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKKworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF90aWNrX3RpbWUsc25kX3BjbV9od19wYXJhbXNfZ2V0X3RpY2tfdGltZUBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF90aWNrX3RpbWVfbWluLHNuZF9wY21faHdfcGFyYW1zX2dldF90aWNrX3RpbWVfbWluQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X3RpY2tfdGltZV9tYXgsc25kX3BjbV9od19wYXJhbXNfZ2V0X3RpY2tfdGltZV9tYXhAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX25lYXIsc25kX3BjbV9od19wYXJhbXNfc2V0X3RpY2tfdGltZV9uZWFyQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X3RpY2tfdGltZV9maXJzdCxzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX2ZpcnN0QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X3RpY2tfdGltZV9sYXN0LHNuZF9wY21faHdfcGFyYW1zX3NldF90aWNrX3RpbWVfbGFzdEBBTFNBXzAuOSIpOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3RpY2tfdGltZShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfdGlja190aW1lX21pbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfdGlja190aW1lX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190ZXN0X3RpY2tfdGltZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF90aWNrX3RpbWVfbWluKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3RpY2tfdGltZV9tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKm1pbiwgaW50ICptaW5kaXIsIHVuc2lnbmVkIGludCAqbWF4LCBpbnQgKm1heGRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3RpY2tfdGltZV9uZWFyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX2ZpcnN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworCisjZW5kaWYgLyogQUxTQV9QQ01fT0xEX0hXX1BBUkFNU19BUEkgKi8KKworCisjaWZkZWYgQUxTQV9QQ01fT0xEX1NXX1BBUkFNU19BUEkKKworYXNtKCIuc3ltdmVyIHNuZF9wY21fc3dfcGFyYW1zX2dldF90c3RhbXBfbW9kZSxzbmRfcGNtX3N3X3BhcmFtc19nZXRfdHN0YW1wX21vZGVAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX3N3X3BhcmFtc19nZXRfc2xlZXBfbWluLHNuZF9wY21fc3dfcGFyYW1zX2dldF9zbGVlcF9taW5AQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX3N3X3BhcmFtc19nZXRfYXZhaWxfbWluLHNuZF9wY21fc3dfcGFyYW1zX2dldF9hdmFpbF9taW5AQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX3N3X3BhcmFtc19nZXRfeGZlcl9hbGlnbixzbmRfcGNtX3N3X3BhcmFtc19nZXRfeGZlcl9hbGlnbkBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21fc3dfcGFyYW1zX2dldF9zdGFydF90aHJlc2hvbGQsc25kX3BjbV9zd19wYXJhbXNfZ2V0X3N0YXJ0X3RocmVzaG9sZEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21fc3dfcGFyYW1zX2dldF9zdG9wX3RocmVzaG9sZCxzbmRfcGNtX3N3X3BhcmFtc19zZXRfc3RvcF90aHJlc2hvbGRAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX3N3X3BhcmFtc19nZXRfc2lsZW5jZV90aHJlc2hvbGQsc25kX3BjbV9zd19wYXJhbXNfZ2V0X3NpbGVuY2VfdGhyZXNob2xkQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9zd19wYXJhbXNfZ2V0X3NpbGVuY2Vfc2l6ZSxzbmRfcGNtX3N3X3BhcmFtc19nZXRfc2lsZW5jZV9zaXplQEFMU0FfMC45Iik7CisKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfdHN0YW1wX21vZGUoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV90c3RhbXBfdCB2YWwpOworc25kX3BjbV90c3RhbXBfdCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfdHN0YW1wX21vZGUoY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfc2xlZXBfbWluKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwpOwordW5zaWduZWQgaW50IHNuZF9wY21fc3dfcGFyYW1zX2dldF9zbGVlcF9taW4oY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfYXZhaWxfbWluKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfYXZhaWxfbWluKGNvbnN0IHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfc2V0X3hmZXJfYWxpZ24oc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKTsKK3NuZF9wY21fdWZyYW1lc190IHNuZF9wY21fc3dfcGFyYW1zX2dldF94ZmVyX2FsaWduKGNvbnN0IHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfc2V0X3N0YXJ0X3RocmVzaG9sZChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCB2YWwpOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9zd19wYXJhbXNfZ2V0X3N0YXJ0X3RocmVzaG9sZChjb25zdCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX3NldF9zdG9wX3RocmVzaG9sZChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCB2YWwpOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9zd19wYXJhbXNfZ2V0X3N0b3BfdGhyZXNob2xkKGNvbnN0IHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfc2V0X3NpbGVuY2VfdGhyZXNob2xkKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfc2lsZW5jZV90aHJlc2hvbGQoY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfc2lsZW5jZV9zaXplKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfc2lsZW5jZV9zaXplKGNvbnN0IHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcyk7CisKKyNlbmRpZiAvKiBBTFNBX1BDTV9PTERfU1dfUEFSQU1TX0FQSSAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9wbHVnaW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY21fcGx1Z2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhMWQ4MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY21fcGx1Z2luLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9wY21fcGx1Z2luLmgKKyAqIFxicmllZiBDb21tb24gUENNIHBsdWdpbiBjb2RlCisgKiBcYXV0aG9yIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxkYXRlIDIwMDAtMjAwMQorICoKKyAqIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIuCisgKiBTZWUgdGhlIFxyZWYgcGNtX3BsdWdpbnMgcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFx3YXJuaW5nIFVzaW5nIG9mIGNvbnRlbnRzIG9mIHRoaXMgaGVhZGVyIGZpbGUgbWlnaHQgYmUgZGFuZ2Vyb3VzCisgKgkgICAgaW4gdGhlIHNlbnNlIG9mIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gVGhlIGNvbnRlbnRzIG1pZ2h0IGJlCisgKgkgICAgZnJlZWx5IGNoYW5nZWQgaW4gZnV0dXJlLgorICovCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX1BDTV9QTFVHSU5fSAorCisvKioKKyAqIFxkZWZncm91cCBQQ01fUGx1Z2lucyBQQ00gUGx1Z2lucworICogXGluZ3JvdXAgUENNCisgKiBTZWUgdGhlIFxyZWYgcGNtX3BsdWdpbnMgcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogXHsKKyAqLworICAKKyNkZWZpbmUgU05EX1BDTV9QTFVHSU5fUkFURV9NSU4gNDAwMAkvKio8IG1pbmltYWwgcmF0ZSBmb3IgdGhlIHJhdGUgcGx1Z2luICovCisjZGVmaW5lIFNORF9QQ01fUExVR0lOX1JBVEVfTUFYIDE5MjAwMAkvKio8IG1heGltYWwgcmF0ZSBmb3IgdGhlIHJhdGUgcGx1Z2luICovCisKKy8qIFJPVVRFX0ZMT0FUIHNob3VsZCBiZSBzZXQgdG8gMCBmb3IgbWFjaGluZXMgd2l0aG91dCBGUCB1bml0IC0gbGlrZSBpUEFRICovCisjaWZkZWYgSEFWRV9TT0ZUX0ZMT0FUCisjZGVmaW5lIFNORF9QQ01fUExVR0lOX1JPVVRFX0ZMT0FUIDAJICAgLyoqPCB1c2UgaW50ZWdlcnMgZm9yIHJvdXRlIHBsdWdpbiAqLworI2Vsc2UKKyNkZWZpbmUgU05EX1BDTV9QTFVHSU5fUk9VVEVfRkxPQVQgMQkgICAvKio8IHVzZSBmbG9hdHMgZm9yIHJvdXRlIHBsdWdpbiAqLworI2VuZGlmCisKKyNkZWZpbmUgU05EX1BDTV9QTFVHSU5fUk9VVEVfUkVTT0xVVElPTiAxNiAvKio8IGludGVnZXIgcmVzb2x1dGlvbiBmb3Igcm91dGUgcGx1Z2luICovCisKKyNpZiBTTkRfUENNX1BMVUdJTl9ST1VURV9GTE9BVAorLyoqIHJvdXRlIHR0YWJsZSBlbnRyeSB0eXBlICovCit0eXBlZGVmIGZsb2F0IHNuZF9wY21fcm91dGVfdHRhYmxlX2VudHJ5X3Q7CisjZGVmaW5lIFNORF9QQ01fUExVR0lOX1JPVVRFX0hBTEYgMC41CS8qKjwgaGFsZiB2YWx1ZSAqLworI2RlZmluZSBTTkRfUENNX1BMVUdJTl9ST1VURV9GVUxMIDEuMAkvKio8IGZ1bGwgdmFsdWUgKi8KKyNlbHNlCisvKiogcm91dGUgdHRhYmxlIGVudHJ5IHR5cGUgKi8KK3R5cGVkZWYgaW50IHNuZF9wY21fcm91dGVfdHRhYmxlX2VudHJ5X3Q7CisjZGVmaW5lIFNORF9QQ01fUExVR0lOX1JPVVRFX0hBTEYgKFNORF9QQ01fUExVR0lOX1JPVVRFX1JFU09MVVRJT04gLyAyKQkvKio8IGhhbGYgdmFsdWUgKi8KKyNkZWZpbmUgU05EX1BDTV9QTFVHSU5fUk9VVEVfRlVMTCBTTkRfUENNX1BMVUdJTl9ST1VURV9SRVNPTFVUSU9OCS8qKjwgZnVsbCB2YWx1ZSAqLworI2VuZGlmCisKKy8qCisgKiAgSGFyZHdhcmUgcGx1Z2luCisgKi8KK2ludCBzbmRfcGNtX2h3X29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgIGludCBjYXJkLCBpbnQgZGV2aWNlLCBpbnQgc3ViZGV2aWNlLAorCQkgICAgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlLAorCQkgICAgaW50IG1tYXBfZW11bGF0aW9uLCBpbnQgc3luY19wdHJfaW9jdGwpOworaW50IF9zbmRfcGNtX2h3X29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICBzbmRfY29uZmlnX3QgKnJvb3QgQVRUUklCVVRFX1VOVVNFRCwgc25kX2NvbmZpZ190ICpjb25mLAorCQkgICAgIHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSk7CisKKy8qCisgKiAgQ29weSBwbHVnaW4KKyAqLworaW50IHNuZF9wY21fY29weV9vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgIHNuZF9wY21fdCAqc2xhdmUsIGludCBjbG9zZV9zbGF2ZSk7CitpbnQgX3NuZF9wY21fY29weV9vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICBzbmRfY29uZmlnX3QgKnJvb3QsIHNuZF9jb25maWdfdCAqY29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qCisgKiAgTGluZWFyIGNvbnZlcnNpb24gcGx1Z2luCisgKi8KK2ludCBzbmRfcGNtX2xpbmVhcl9vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQlzbmRfcGNtX2Zvcm1hdF90IHNmb3JtYXQsIHNuZF9wY21fdCAqc2xhdmUsCisJCQlpbnQgY2xvc2Vfc2xhdmUpOworaW50IF9zbmRfcGNtX2xpbmVhcl9vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgc25kX2NvbmZpZ190ICpyb290LCBzbmRfY29uZmlnX3QgKmNvbmYsCisJCQkgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKTsKKworLyoKKyAqICBMaW5lYXI8LT5GbG9hdCBjb252ZXJzaW9uIHBsdWdpbgorICovCitpbnQgc25kX3BjbV9sZmxvYXRfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkJc25kX3BjbV9mb3JtYXRfdCBzZm9ybWF0LCBzbmRfcGNtX3QgKnNsYXZlLAorCQkJaW50IGNsb3NlX3NsYXZlKTsKK2ludCBfc25kX3BjbV9sZmxvYXRfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkJIHNuZF9jb25maWdfdCAqcm9vdCwgc25kX2NvbmZpZ190ICpjb25mLAorCQkJIHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSk7CisKKy8qCisgKiAgTGluZWFyPC0+bXUtTGF3IGNvbnZlcnNpb24gcGx1Z2luCisgKi8KK2ludCBzbmRfcGNtX211bGF3X29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIHNuZF9wY21fZm9ybWF0X3Qgc2Zvcm1hdCwgc25kX3BjbV90ICpzbGF2ZSwKKwkJICAgICAgIGludCBjbG9zZV9zbGF2ZSk7CitpbnQgX3NuZF9wY21fbXVsYXdfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkJc25kX2NvbmZpZ190ICpyb290LCBzbmRfY29uZmlnX3QgKmNvbmYsCisgICAgICAgICAgICAgICAgICAgICAgICBzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpOworCisvKgorICogIExpbmVhcjwtPmEtTGF3IGNvbnZlcnNpb24gcGx1Z2luCisgKi8KK2ludCBzbmRfcGNtX2FsYXdfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICBzbmRfcGNtX2Zvcm1hdF90IHNmb3JtYXQsIHNuZF9wY21fdCAqc2xhdmUsCisJCSAgICAgIGludCBjbG9zZV9zbGF2ZSk7CitpbnQgX3NuZF9wY21fYWxhd19vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICBzbmRfY29uZmlnX3QgKnJvb3QsIHNuZF9jb25maWdfdCAqY29uZiwKKwkJICAgICAgIHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSk7CisKKy8qCisgKiAgTGluZWFyPC0+SW1hLUFEUENNIGNvbnZlcnNpb24gcGx1Z2luCisgKi8KK2ludCBzbmRfcGNtX2FkcGNtX29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIHNuZF9wY21fZm9ybWF0X3Qgc2Zvcm1hdCwgc25kX3BjbV90ICpzbGF2ZSwKKwkJICAgICAgIGludCBjbG9zZV9zbGF2ZSk7CitpbnQgX3NuZF9wY21fYWRwY21fb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkJc25kX2NvbmZpZ190ICpyb290LCBzbmRfY29uZmlnX3QgKmNvbmYsCisJCQlzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpOworCisvKgorICogIFJvdXRlIHBsdWdpbiBmb3IgbGluZWFyIGZvcm1hdHMKKyAqLworaW50IHNuZF9wY21fcm91dGVfbG9hZF90dGFibGUoc25kX2NvbmZpZ190ICp0dCwgc25kX3BjbV9yb3V0ZV90dGFibGVfZW50cnlfdCAqdHRhYmxlLAorCQkJICAgICAgdW5zaWduZWQgaW50IHR0X2NzaXplLCB1bnNpZ25lZCBpbnQgdHRfc3NpemUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKnR0X2N1c2VkLCB1bnNpZ25lZCBpbnQgKnR0X3N1c2VkLAorCQkJICAgICAgaW50IHNjaGFubmVscyk7CitpbnQgc25kX3BjbV9yb3V0ZV9kZXRlcm1pbmVfdHRhYmxlKHNuZF9jb25maWdfdCAqdHQsCisJCQkJICAgdW5zaWduZWQgaW50ICp0dF9jc2l6ZSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKnR0X3NzaXplKTsKK2ludCBzbmRfcGNtX3JvdXRlX29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIHNuZF9wY21fZm9ybWF0X3Qgc2Zvcm1hdCwgaW50IHNjaGFubmVscywKKwkJICAgICAgIHNuZF9wY21fcm91dGVfdHRhYmxlX2VudHJ5X3QgKnR0YWJsZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCB0dF9zc2l6ZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCB0dF9jdXNlZCwgdW5zaWduZWQgaW50IHR0X3N1c2VkLAorCQkgICAgICAgc25kX3BjbV90ICpzbGF2ZSwgaW50IGNsb3NlX3NsYXZlKTsKK2ludCBfc25kX3BjbV9yb3V0ZV9vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQlzbmRfY29uZmlnX3QgKnJvb3QsIHNuZF9jb25maWdfdCAqY29uZiwKKwkJCXNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSk7CisKKy8qCisgKiAgUmF0ZSBwbHVnaW4gZm9yIGxpbmVhciBmb3JtYXRzCisgKi8KK2ludCBzbmRfcGNtX3JhdGVfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICBzbmRfcGNtX2Zvcm1hdF90IHNmb3JtYXQsIHVuc2lnbmVkIGludCBzcmF0ZSwKKwkJICAgICAgY29uc3Qgc25kX2NvbmZpZ190ICpjb252ZXJ0ZXIsCisJCSAgICAgIHNuZF9wY21fdCAqc2xhdmUsIGludCBjbG9zZV9zbGF2ZSk7CitpbnQgX3NuZF9wY21fcmF0ZV9vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICBzbmRfY29uZmlnX3QgKnJvb3QsIHNuZF9jb25maWdfdCAqY29uZiwKKwkJICAgICAgIHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSk7CisKKy8qCisgKiAgSG9va3MgcGx1Z2luCisgKi8KK2ludCBzbmRfcGNtX2hvb2tzX29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIHNuZF9wY21fdCAqc2xhdmUsIGludCBjbG9zZV9zbGF2ZSk7CitpbnQgX3NuZF9wY21faG9va3Nfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkJc25kX2NvbmZpZ190ICpyb290LCBzbmRfY29uZmlnX3QgKmNvbmYsCisJCQlzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpOworCisvKgorICogIExBRFNQQSBwbHVnaW4KKyAqLworaW50IHNuZF9wY21fbGFkc3BhX29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCWNvbnN0IGNoYXIgKmxhZHNwYV9wYXRoLAorCQkJdW5zaWduZWQgaW50IGNoYW5uZWxzLAorCQkJc25kX2NvbmZpZ190ICpsYWRzcGFfcHBsdWdpbnMsCisJCQlzbmRfY29uZmlnX3QgKmxhZHNwYV9jcGx1Z2lucywKKwkJCXNuZF9wY21fdCAqc2xhdmUsIGludCBjbG9zZV9zbGF2ZSk7CitpbnQgX3NuZF9wY21fbGFkc3BhX29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSBzbmRfY29uZmlnX3QgKnJvb3QsIHNuZF9jb25maWdfdCAqY29uZiwKKwkJCSBzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpOworCisvKgorICogIEphY2sgcGx1Z2luCisgKi8KK2ludCBzbmRfcGNtX2phY2tfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCQlzbmRfY29uZmlnX3QgKnBsYXliYWNrX2NvbmYsCisJCQkJCXNuZF9jb25maWdfdCAqY2FwdHVyZV9jb25mLAorCQkgICAgICBzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpOworaW50IF9zbmRfcGNtX2phY2tfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBzbmRfY29uZmlnX3QgKnJvb3QsIHNuZF9jb25maWdfdCAqY29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKTsKKworCisvKiogXH0gKi8KKworI2VuZGlmIC8qIF9fQUxTQV9QQ01fUExVR0lOX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY21fcmF0ZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9yYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3MGRmMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY21fcmF0ZS5oCkBAIC0wLDAgKzEsMTUzIEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvcGNtX3JhdGUuaAorICogXGJyaWVmIEV4dGVybmFsIFJhdGUtQ29udmVydGVyLVBsdWdpbiBTREsKKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMjAwNgorICoKKyAqIEV4dGVybmFsIFJhdGUtQ29udmVydGVyLVBsdWdpbiBTREsKKyAqLworCisvKgorICogQUxTQSBleHRlcm5hbCBQQ00gcmF0ZS1jb252ZXJ0ZXIgcGx1Z2luIFNESyAoZHJhZnQgdmVyc2lvbikKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQUxTQV9QQ01fUkFURV9ICisjZGVmaW5lIF9fQUxTQV9QQ01fUkFURV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBQcm90b2NvbCB2ZXJzaW9uCisgKi8KKyNkZWZpbmUgU05EX1BDTV9SQVRFX1BMVUdJTl9WRVJTSU9OCTB4MDEwMDAyCisKKy8qKiBod19wYXJhbXMgaW5mb3JtYXRpb24gZm9yIGEgc2luZ2xlIHNpZGUgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9wY21fcmF0ZV9zaWRlX2luZm8geworCXNuZF9wY21fZm9ybWF0X3QgZm9ybWF0OworCXVuc2lnbmVkIGludCByYXRlOworCXNuZF9wY21fdWZyYW1lc190IGJ1ZmZlcl9zaXplOworCXNuZF9wY21fdWZyYW1lc190IHBlcmlvZF9zaXplOworfSBzbmRfcGNtX3JhdGVfc2lkZV9pbmZvX3Q7CisKKy8qKiBod19wYXJhbXMgaW5mb3JtYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9wY21fcmF0ZV9pbmZvIHsKKwlzdHJ1Y3Qgc25kX3BjbV9yYXRlX3NpZGVfaW5mbyBpbjsKKwlzdHJ1Y3Qgc25kX3BjbV9yYXRlX3NpZGVfaW5mbyBvdXQ7CisJdW5zaWduZWQgaW50IGNoYW5uZWxzOworfSBzbmRfcGNtX3JhdGVfaW5mb190OworCisvKiogQ2FsbGJhY2sgdGFibGUgb2YgcmF0ZS1jb252ZXJ0ZXIgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9wY21fcmF0ZV9vcHMgeworCS8qKgorCSAqIGNsb3NlIHRoZSBjb252ZXJ0ZXI7IG9wdGlvbmFsCisJICovCisJdm9pZCAoKmNsb3NlKSh2b2lkICpvYmopOworCS8qKgorCSAqIGluaXRpYWxpemUgdGhlIGNvbnZlcnRlciwgY2FsbGVkIGF0IGh3X3BhcmFtcworCSAqLworCWludCAoKmluaXQpKHZvaWQgKm9iaiwgc25kX3BjbV9yYXRlX2luZm9fdCAqaW5mbyk7CisJLyoqCisJICogZnJlZSB0aGUgY29udmVydGVyOyBvcHRpb25hbAorCSAqLworCXZvaWQgKCpmcmVlKSh2b2lkICpvYmopOworCS8qKgorCSAqIHJlc2V0IHRoZSBjb252ZXJ0ZXIsIGNhbGxlZCBhdCBwcmVwYXJlOyBvcHRpb25hbAorCSAqLworCXZvaWQgKCpyZXNldCkodm9pZCAqb2JqKTsKKwkvKioKKwkgKiBhZGp1c3QgdGhlIHBpdGNoLCBjYWxsZWQgYXQgc3dfcGFyYW1zOyBvcHRpb25hbAorCSAqLworCWludCAoKmFkanVzdF9waXRjaCkodm9pZCAqb2JqLCBzbmRfcGNtX3JhdGVfaW5mb190ICppbmZvKTsKKwkvKioKKwkgKiBjb252ZXJ0IHRoZSBkYXRhCisJICovCisJdm9pZCAoKmNvbnZlcnQpKHZvaWQgKm9iaiwKKwkJCWNvbnN0IHNuZF9wY21fY2hhbm5lbF9hcmVhX3QgKmRzdF9hcmVhcywKKwkJCXNuZF9wY21fdWZyYW1lc190IGRzdF9vZmZzZXQsIHVuc2lnbmVkIGludCBkc3RfZnJhbWVzLAorCQkJY29uc3Qgc25kX3BjbV9jaGFubmVsX2FyZWFfdCAqc3JjX2FyZWFzLAorCQkJc25kX3BjbV91ZnJhbWVzX3Qgc3JjX29mZnNldCwgdW5zaWduZWQgaW50IHNyY19mcmFtZXMpOworCS8qKgorCSAqIGNvbnZlcnQgYW4gczE2IGludGVybGVhdmVkLWRhdGEgYXJyYXk7IGV4Y2x1c2l2ZSB3aXRoIGNvbnZlcnQKKwkgKi8KKwl2b2lkICgqY29udmVydF9zMTYpKHZvaWQgKm9iaiwgaW50MTZfdCAqZHN0LCB1bnNpZ25lZCBpbnQgZHN0X2ZyYW1lcywKKwkJCSAgICBjb25zdCBpbnQxNl90ICpzcmMsIHVuc2lnbmVkIGludCBzcmNfZnJhbWVzKTsKKwkvKioKKwkgKiBjb21wdXRlIHRoZSBmcmFtZSBzaXplIGZvciBpbnB1dAorCSAqLworCXNuZF9wY21fdWZyYW1lc190ICgqaW5wdXRfZnJhbWVzKSh2b2lkICpvYmosIHNuZF9wY21fdWZyYW1lc190IGZyYW1lcyk7CisJLyoqCisJICogY29tcHV0ZSB0aGUgZnJhbWUgc2l6ZSBmb3Igb3V0cHV0CisJICovCisJc25kX3BjbV91ZnJhbWVzX3QgKCpvdXRwdXRfZnJhbWVzKSh2b2lkICpvYmosIHNuZF9wY21fdWZyYW1lc190IGZyYW1lcyk7CisJLyoqCisJICogdGhlIHByb3RvY29sIHZlcnNpb24gdGhlIHBsdWdpbiBzdXBwb3J0czsKKwkgKiBuZXcgZmllbGQgc2luY2UgdmVyc2lvbiAweDAxMDAwMgorCSAqLworCXVuc2lnbmVkIGludCB2ZXJzaW9uOworCS8qKgorCSAqIHJldHVybiB0aGUgc3VwcG9ydGVkIG1pbiAvIG1heCBzYW1wbGUgcmF0ZXM7CisJICogbmV3IG9wcyBzaW5jZSB2ZXJzaW9uIDB4MDEwMDAyCisJICovCisJaW50ICgqZ2V0X3N1cHBvcnRlZF9yYXRlcykodm9pZCAqb2JqLCB1bnNpZ25lZCBpbnQgKnJhdGVfbWluLAorCQkJCSAgIHVuc2lnbmVkIGludCAqcmF0ZV9tYXgpOworCS8qKgorCSAqIHNob3cgc29tZSBzdGF0dXMgbWVzc2FnZXMgZm9yIHZlcmJvc2UgbW9kZTsKKwkgKiBuZXcgb3BzIHNpbmNlIHZlcnNpb24gMHgwMTAwMDIKKwkgKi8KKwl2b2lkICgqZHVtcCkodm9pZCAqb2JqLCBzbmRfb3V0cHV0X3QgKm91dCk7Cit9IHNuZF9wY21fcmF0ZV9vcHNfdDsKKworLyoqIG9wZW4gZnVuY3Rpb24gdHlwZSAqLwordHlwZWRlZiBpbnQgKCpzbmRfcGNtX3JhdGVfb3Blbl9mdW5jX3QpKHVuc2lnbmVkIGludCB2ZXJzaW9uLCB2b2lkICoqb2JqcCwKKwkJCQkJc25kX3BjbV9yYXRlX29wc190ICpvcHNwKTsKKworLyoqCisgKiBEZWZpbmUgdGhlIG9iamVjdCBlbnRyeSBmb3IgZXh0ZXJuYWwgUENNIHJhdGUtY29udmVydGVyIHBsdWdpbnMKKyAqLworI2RlZmluZSBTTkRfUENNX1JBVEVfUExVR0lOX0VOVFJZKG5hbWUpIF9zbmRfcGNtX3JhdGVfIyNuYW1lIyNfb3BlbgorCisKKyNpZm5kZWYgRE9DX0hJRERFTgorLyogb2xkIHJhdGVfb3BzIGZvciBwcm90b2NvbCB2ZXJzaW9uIDB4MDEwMDAxICovCit0eXBlZGVmIHN0cnVjdCBzbmRfcGNtX3JhdGVfb2xkX29wcyB7CisJdm9pZCAoKmNsb3NlKSh2b2lkICpvYmopOworCWludCAoKmluaXQpKHZvaWQgKm9iaiwgc25kX3BjbV9yYXRlX2luZm9fdCAqaW5mbyk7CisJdm9pZCAoKmZyZWUpKHZvaWQgKm9iaik7CisJdm9pZCAoKnJlc2V0KSh2b2lkICpvYmopOworCWludCAoKmFkanVzdF9waXRjaCkodm9pZCAqb2JqLCBzbmRfcGNtX3JhdGVfaW5mb190ICppbmZvKTsKKwl2b2lkICgqY29udmVydCkodm9pZCAqb2JqLAorCQkJY29uc3Qgc25kX3BjbV9jaGFubmVsX2FyZWFfdCAqZHN0X2FyZWFzLAorCQkJc25kX3BjbV91ZnJhbWVzX3QgZHN0X29mZnNldCwgdW5zaWduZWQgaW50IGRzdF9mcmFtZXMsCisJCQljb25zdCBzbmRfcGNtX2NoYW5uZWxfYXJlYV90ICpzcmNfYXJlYXMsCisJCQlzbmRfcGNtX3VmcmFtZXNfdCBzcmNfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc3JjX2ZyYW1lcyk7CisJdm9pZCAoKmNvbnZlcnRfczE2KSh2b2lkICpvYmosIGludDE2X3QgKmRzdCwgdW5zaWduZWQgaW50IGRzdF9mcmFtZXMsCisJCQkgICAgY29uc3QgaW50MTZfdCAqc3JjLCB1bnNpZ25lZCBpbnQgc3JjX2ZyYW1lcyk7CisJc25kX3BjbV91ZnJhbWVzX3QgKCppbnB1dF9mcmFtZXMpKHZvaWQgKm9iaiwgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKTsKKwlzbmRfcGNtX3VmcmFtZXNfdCAoKm91dHB1dF9mcmFtZXMpKHZvaWQgKm9iaiwgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKTsKK30gc25kX3BjbV9yYXRlX29sZF9vcHNfdDsKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19BTFNBX1BDTV9SQVRFX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9yYXdtaWRpLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvcmF3bWlkaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOGZkNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvcmF3bWlkaS5oCkBAIC0wLDAgKzEsMTU5IEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvcmF3bWlkaS5oCisgKiBcYnJpZWYgQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICogXGF1dGhvciBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogXGF1dGhvciBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKiBcYXV0aG9yIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqIFxkYXRlIDE5OTgtMjAwMQorICoKKyAqIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqLworLyoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQUxTQV9SQVdNSURJX0gKKyNkZWZpbmUgX19BTFNBX1JBV01JRElfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBSYXdNaWRpIFJhd01pZGkgSW50ZXJmYWNlCisgKiAgVGhlIFJhd01pZGkgSW50ZXJmYWNlLiBTZWUgXHJlZiByYXdtaWRpIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqICBceworICovCisKKy8qKiBkbHN5bSB2ZXJzaW9uIGZvciBpbnRlcmZhY2UgZW50cnkgY2FsbGJhY2sgKi8KKyNkZWZpbmUgU05EX1JBV01JRElfRExTWU1fVkVSU0lPTglfZGxzeW1fcmF3bWlkaV8wMDEKKworLyoqIFJhd01pZGkgaW5mb3JtYXRpb24gY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3Jhd21pZGlfaW5mbyBzbmRfcmF3bWlkaV9pbmZvX3Q7CisvKiogUmF3TWlkaSBzZXR0aW5ncyBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfcmF3bWlkaV9wYXJhbXMgc25kX3Jhd21pZGlfcGFyYW1zX3Q7CisvKiogUmF3TWlkaSBzdGF0dXMgY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3Jhd21pZGlfc3RhdHVzIHNuZF9yYXdtaWRpX3N0YXR1c190OworCisvKiogUmF3TWlkaSBzdHJlYW0gKGRpcmVjdGlvbikgKi8KK3R5cGVkZWYgZW51bSBfc25kX3Jhd21pZGlfc3RyZWFtIHsKKwkvKiogT3V0cHV0IHN0cmVhbSAqLworCVNORF9SQVdNSURJX1NUUkVBTV9PVVRQVVQgPSAwLAorCS8qKiBJbnB1dCBzdHJlYW0gKi8KKwlTTkRfUkFXTUlESV9TVFJFQU1fSU5QVVQsCisJU05EX1JBV01JRElfU1RSRUFNX0xBU1QgPSBTTkRfUkFXTUlESV9TVFJFQU1fSU5QVVQKK30gc25kX3Jhd21pZGlfc3RyZWFtX3Q7CisKKy8qKiBBcHBlbmQgKGZsYWcgdG8gb3BlbiBtb2RlKSBcaGlkZWluaXRpYWxpemVyICovCisjZGVmaW5lIFNORF9SQVdNSURJX0FQUEVORAkweDAwMDEKKy8qKiBOb24gYmxvY2tpbmcgbW9kZSAoZmxhZyB0byBvcGVuIG1vZGUpIFxoaWRlaW5pdGlhbGl6ZXIgKi8KKyNkZWZpbmUgU05EX1JBV01JRElfTk9OQkxPQ0sJMHgwMDAyCisvKiogV3JpdGUgc3luYyBtb2RlIChGbGFnIHRvIG9wZW4gbW9kZSkgXGhpZGVpbml0aWFsaXplciAqLworI2RlZmluZSBTTkRfUkFXTUlESV9TWU5DCTB4MDAwNAorCisvKiogUmF3TWlkaSBoYW5kbGUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfcmF3bWlkaSBzbmRfcmF3bWlkaV90OworCisvKiogUmF3TWlkaSB0eXBlICovCit0eXBlZGVmIGVudW0gX3NuZF9yYXdtaWRpX3R5cGUgeworCS8qKiBLZXJuZWwgbGV2ZWwgUmF3TWlkaSAqLworCVNORF9SQVdNSURJX1RZUEVfSFcsCisJLyoqIFNoYXJlZCBtZW1vcnkgY2xpZW50IFJhd01pZGkgKG5vdCB5ZXQgaW1wbGVtZW50ZWQpICovCisJU05EX1JBV01JRElfVFlQRV9TSE0sCisJLyoqIElORVQgY2xpZW50IFJhd01pZGkgKG5vdCB5ZXQgaW1wbGVtZW50ZWQpICovCisJU05EX1JBV01JRElfVFlQRV9JTkVULAorCS8qKiBWaXJ0dWFsIChzZXF1ZW5jZXIpIFJhd01pZGkgKi8KKwlTTkRfUkFXTUlESV9UWVBFX1ZJUlRVQUwKK30gc25kX3Jhd21pZGlfdHlwZV90OworCitpbnQgc25kX3Jhd21pZGlfb3BlbihzbmRfcmF3bWlkaV90ICoqaW5fcm1pZGksIHNuZF9yYXdtaWRpX3QgKipvdXRfcm1pZGksCisJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG1vZGUpOworaW50IHNuZF9yYXdtaWRpX29wZW5fbGNvbmYoc25kX3Jhd21pZGlfdCAqKmluX3JtaWRpLCBzbmRfcmF3bWlkaV90ICoqb3V0X3JtaWRpLAorCQkJICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG1vZGUsIHNuZF9jb25maWdfdCAqbGNvbmYpOworaW50IHNuZF9yYXdtaWRpX2Nsb3NlKHNuZF9yYXdtaWRpX3QgKnJtaWRpKTsKK2ludCBzbmRfcmF3bWlkaV9wb2xsX2Rlc2NyaXB0b3JzX2NvdW50KHNuZF9yYXdtaWRpX3QgKnJtaWRpKTsKK2ludCBzbmRfcmF3bWlkaV9wb2xsX2Rlc2NyaXB0b3JzKHNuZF9yYXdtaWRpX3QgKnJtaWRpLCBzdHJ1Y3QgcG9sbGZkICpwZmRzLCB1bnNpZ25lZCBpbnQgc3BhY2UpOworaW50IHNuZF9yYXdtaWRpX3BvbGxfZGVzY3JpcHRvcnNfcmV2ZW50cyhzbmRfcmF3bWlkaV90ICpyYXdtaWRpLCBzdHJ1Y3QgcG9sbGZkICpwZmRzLCB1bnNpZ25lZCBpbnQgbmZkcywgdW5zaWduZWQgc2hvcnQgKnJldmVudCk7CitpbnQgc25kX3Jhd21pZGlfbm9uYmxvY2soc25kX3Jhd21pZGlfdCAqcm1pZGksIGludCBub25ibG9jayk7CitzaXplX3Qgc25kX3Jhd21pZGlfaW5mb19zaXplb2Yodm9pZCk7CisvKiogXGhpZGVpbml0aWFsaXplcgorICogXGJyaWVmIGFsbG9jYXRlIGFuIGludmFsaWQgI3NuZF9yYXdtaWRpX2luZm9fdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9yYXdtaWRpX2luZm9fYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX3Jhd21pZGlfaW5mbykKK2ludCBzbmRfcmF3bWlkaV9pbmZvX21hbGxvYyhzbmRfcmF3bWlkaV9pbmZvX3QgKipwdHIpOwordm9pZCBzbmRfcmF3bWlkaV9pbmZvX2ZyZWUoc25kX3Jhd21pZGlfaW5mb190ICpvYmopOwordm9pZCBzbmRfcmF3bWlkaV9pbmZvX2NvcHkoc25kX3Jhd21pZGlfaW5mb190ICpkc3QsIGNvbnN0IHNuZF9yYXdtaWRpX2luZm9fdCAqc3JjKTsKK3Vuc2lnbmVkIGludCBzbmRfcmF3bWlkaV9pbmZvX2dldF9kZXZpY2UoY29uc3Qgc25kX3Jhd21pZGlfaW5mb190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9yYXdtaWRpX2luZm9fZ2V0X3N1YmRldmljZShjb25zdCBzbmRfcmF3bWlkaV9pbmZvX3QgKm9iaik7CitzbmRfcmF3bWlkaV9zdHJlYW1fdCBzbmRfcmF3bWlkaV9pbmZvX2dldF9zdHJlYW0oY29uc3Qgc25kX3Jhd21pZGlfaW5mb190ICpvYmopOworaW50IHNuZF9yYXdtaWRpX2luZm9fZ2V0X2NhcmQoY29uc3Qgc25kX3Jhd21pZGlfaW5mb190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9yYXdtaWRpX2luZm9fZ2V0X2ZsYWdzKGNvbnN0IHNuZF9yYXdtaWRpX2luZm9fdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9yYXdtaWRpX2luZm9fZ2V0X2lkKGNvbnN0IHNuZF9yYXdtaWRpX2luZm9fdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9yYXdtaWRpX2luZm9fZ2V0X25hbWUoY29uc3Qgc25kX3Jhd21pZGlfaW5mb190ICpvYmopOworY29uc3QgY2hhciAqc25kX3Jhd21pZGlfaW5mb19nZXRfc3ViZGV2aWNlX25hbWUoY29uc3Qgc25kX3Jhd21pZGlfaW5mb190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9yYXdtaWRpX2luZm9fZ2V0X3N1YmRldmljZXNfY291bnQoY29uc3Qgc25kX3Jhd21pZGlfaW5mb190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9yYXdtaWRpX2luZm9fZ2V0X3N1YmRldmljZXNfYXZhaWwoY29uc3Qgc25kX3Jhd21pZGlfaW5mb190ICpvYmopOwordm9pZCBzbmRfcmF3bWlkaV9pbmZvX3NldF9kZXZpY2Uoc25kX3Jhd21pZGlfaW5mb190ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOwordm9pZCBzbmRfcmF3bWlkaV9pbmZvX3NldF9zdWJkZXZpY2Uoc25kX3Jhd21pZGlfaW5mb190ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOwordm9pZCBzbmRfcmF3bWlkaV9pbmZvX3NldF9zdHJlYW0oc25kX3Jhd21pZGlfaW5mb190ICpvYmosIHNuZF9yYXdtaWRpX3N0cmVhbV90IHZhbCk7CitpbnQgc25kX3Jhd21pZGlfaW5mbyhzbmRfcmF3bWlkaV90ICpybWlkaSwgc25kX3Jhd21pZGlfaW5mb190ICogaW5mbyk7CitzaXplX3Qgc25kX3Jhd21pZGlfcGFyYW1zX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gaW52YWxpZCAjc25kX3Jhd21pZGlfcGFyYW1zX3QgdXNpbmcgc3RhbmRhcmQgYWxsb2NhCisgKiBccGFyYW0gcHRyIHJldHVybmVkIHBvaW50ZXIKKyAqLworI2RlZmluZSBzbmRfcmF3bWlkaV9wYXJhbXNfYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX3Jhd21pZGlfcGFyYW1zKQoraW50IHNuZF9yYXdtaWRpX3BhcmFtc19tYWxsb2Moc25kX3Jhd21pZGlfcGFyYW1zX3QgKipwdHIpOwordm9pZCBzbmRfcmF3bWlkaV9wYXJhbXNfZnJlZShzbmRfcmF3bWlkaV9wYXJhbXNfdCAqb2JqKTsKK3ZvaWQgc25kX3Jhd21pZGlfcGFyYW1zX2NvcHkoc25kX3Jhd21pZGlfcGFyYW1zX3QgKmRzdCwgY29uc3Qgc25kX3Jhd21pZGlfcGFyYW1zX3QgKnNyYyk7CitpbnQgc25kX3Jhd21pZGlfcGFyYW1zX3NldF9idWZmZXJfc2l6ZShzbmRfcmF3bWlkaV90ICpybWlkaSwgc25kX3Jhd21pZGlfcGFyYW1zX3QgKnBhcmFtcywgc2l6ZV90IHZhbCk7CitzaXplX3Qgc25kX3Jhd21pZGlfcGFyYW1zX2dldF9idWZmZXJfc2l6ZShjb25zdCBzbmRfcmF3bWlkaV9wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcmF3bWlkaV9wYXJhbXNfc2V0X2F2YWlsX21pbihzbmRfcmF3bWlkaV90ICpybWlkaSwgc25kX3Jhd21pZGlfcGFyYW1zX3QgKnBhcmFtcywgc2l6ZV90IHZhbCk7CitzaXplX3Qgc25kX3Jhd21pZGlfcGFyYW1zX2dldF9hdmFpbF9taW4oY29uc3Qgc25kX3Jhd21pZGlfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3Jhd21pZGlfcGFyYW1zX3NldF9ub19hY3RpdmVfc2Vuc2luZyhzbmRfcmF3bWlkaV90ICpybWlkaSwgc25kX3Jhd21pZGlfcGFyYW1zX3QgKnBhcmFtcywgaW50IHZhbCk7CitpbnQgc25kX3Jhd21pZGlfcGFyYW1zX2dldF9ub19hY3RpdmVfc2Vuc2luZyhjb25zdCBzbmRfcmF3bWlkaV9wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcmF3bWlkaV9wYXJhbXMoc25kX3Jhd21pZGlfdCAqcm1pZGksIHNuZF9yYXdtaWRpX3BhcmFtc190ICogcGFyYW1zKTsKK2ludCBzbmRfcmF3bWlkaV9wYXJhbXNfY3VycmVudChzbmRfcmF3bWlkaV90ICpybWlkaSwgc25kX3Jhd21pZGlfcGFyYW1zX3QgKnBhcmFtcyk7CitzaXplX3Qgc25kX3Jhd21pZGlfc3RhdHVzX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gaW52YWxpZCAjc25kX3Jhd21pZGlfc3RhdHVzX3QgdXNpbmcgc3RhbmRhcmQgYWxsb2NhCisgKiBccGFyYW0gcHRyIHJldHVybmVkIHBvaW50ZXIKKyAqLworI2RlZmluZSBzbmRfcmF3bWlkaV9zdGF0dXNfYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX3Jhd21pZGlfc3RhdHVzKQoraW50IHNuZF9yYXdtaWRpX3N0YXR1c19tYWxsb2Moc25kX3Jhd21pZGlfc3RhdHVzX3QgKipwdHIpOwordm9pZCBzbmRfcmF3bWlkaV9zdGF0dXNfZnJlZShzbmRfcmF3bWlkaV9zdGF0dXNfdCAqb2JqKTsKK3ZvaWQgc25kX3Jhd21pZGlfc3RhdHVzX2NvcHkoc25kX3Jhd21pZGlfc3RhdHVzX3QgKmRzdCwgY29uc3Qgc25kX3Jhd21pZGlfc3RhdHVzX3QgKnNyYyk7Cit2b2lkIHNuZF9yYXdtaWRpX3N0YXR1c19nZXRfdHN0YW1wKGNvbnN0IHNuZF9yYXdtaWRpX3N0YXR1c190ICpvYmosIHNuZF9odGltZXN0YW1wX3QgKnB0cik7CitzaXplX3Qgc25kX3Jhd21pZGlfc3RhdHVzX2dldF9hdmFpbChjb25zdCBzbmRfcmF3bWlkaV9zdGF0dXNfdCAqb2JqKTsKK3NpemVfdCBzbmRfcmF3bWlkaV9zdGF0dXNfZ2V0X3hydW5zKGNvbnN0IHNuZF9yYXdtaWRpX3N0YXR1c190ICpvYmopOworaW50IHNuZF9yYXdtaWRpX3N0YXR1cyhzbmRfcmF3bWlkaV90ICpybWlkaSwgc25kX3Jhd21pZGlfc3RhdHVzX3QgKiBzdGF0dXMpOworaW50IHNuZF9yYXdtaWRpX2RyYWluKHNuZF9yYXdtaWRpX3QgKnJtaWRpKTsKK2ludCBzbmRfcmF3bWlkaV9kcm9wKHNuZF9yYXdtaWRpX3QgKnJtaWRpKTsKK3NzaXplX3Qgc25kX3Jhd21pZGlfd3JpdGUoc25kX3Jhd21pZGlfdCAqcm1pZGksIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworc3NpemVfdCBzbmRfcmF3bWlkaV9yZWFkKHNuZF9yYXdtaWRpX3QgKnJtaWRpLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKTsKK2NvbnN0IGNoYXIgKnNuZF9yYXdtaWRpX25hbWUoc25kX3Jhd21pZGlfdCAqcm1pZGkpOworc25kX3Jhd21pZGlfdHlwZV90IHNuZF9yYXdtaWRpX3R5cGUoc25kX3Jhd21pZGlfdCAqcm1pZGkpOworc25kX3Jhd21pZGlfc3RyZWFtX3Qgc25kX3Jhd21pZGlfc3RyZWFtKHNuZF9yYXdtaWRpX3QgKnJhd21pZGkpOworCisvKiogXH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fUkFXTUlESV9IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zZXEuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zZXEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTc2ODIyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NlcS5oCkBAIC0wLDAgKzEsNzM3IEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvc2VxLmgKKyAqIFxicmllZiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKiBcYXV0aG9yIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKiBcYXV0aG9yIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMTk5OC0yMDAxCisgKi8KKy8qCisgKiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQUxTQV9TRVFfSAorI2RlZmluZSBfX0FMU0FfU0VRX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqICBcZGVmZ3JvdXAgU2VxdWVuY2VyIE1JREkgU2VxdWVuY2VyCisgKiAgTUlESSBTZXF1ZW5jZXIgSW50ZXJmYWNlLgorICogIFNlZSBccmVmIHNlcSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiAgXHsKKyAqLworCisvKiogZGxzeW0gdmVyc2lvbiBmb3IgaW50ZXJmYWNlIGVudHJ5IGNhbGxiYWNrICovCisjZGVmaW5lIFNORF9TRVFfRExTWU1fVkVSU0lPTgkJX2Rsc3ltX3NlcV8wMDEKKworLyoqIFNlcXVlbmNlciBoYW5kbGUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfc2VxIHNuZF9zZXFfdDsKKworLyoqCisgKiBzZXF1ZW5jZXIgb3BlbmluZyBzdHJlYW0gdHlwZXMKKyAqLworI2RlZmluZSBTTkRfU0VRX09QRU5fT1VUUFVUCTEJLyoqPCBvcGVuIGZvciBvdXRwdXQgKHdyaXRlKSAqLworI2RlZmluZSBTTkRfU0VRX09QRU5fSU5QVVQJMgkvKio8IG9wZW4gZm9yIGlucHV0IChyZWFkKSAqLworI2RlZmluZSBTTkRfU0VRX09QRU5fRFVQTEVYCShTTkRfU0VRX09QRU5fT1VUUFVUfFNORF9TRVFfT1BFTl9JTlBVVCkJLyoqPCBvcGVuIGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgKHJlYWQvd3JpdGUpICovCisKKy8qKgorICogc2VxdWVuY2VyIG9wZW5pbmcgbW9kZQorICovCisjZGVmaW5lIFNORF9TRVFfTk9OQkxPQ0sJMHgwMDAxCS8qKjwgbm9uLWJsb2NraW5nIG1vZGUgKGZsYWcgdG8gb3BlbiBtb2RlKSAqLworCisvKiogc2VxdWVuY2VyIGhhbmRsZSB0eXBlICovCit0eXBlZGVmIGVudW0gX3NuZF9zZXFfdHlwZSB7CisJU05EX1NFUV9UWVBFX0hXLAkJLyoqPCBoYXJkd2FyZSAqLworCVNORF9TRVFfVFlQRV9TSE0sCQkvKio8IHNoYXJlZCBtZW1vcnkgKE5ZSSkgKi8KKwlTTkRfU0VRX1RZUEVfSU5FVAkJLyoqPCBuZXR3b3JrIChOWUkpICovCit9IHNuZF9zZXFfdHlwZV90OworCisvKiogc3BlY2lhbCBjbGllbnQgKHBvcnQpIGlkcyAqLworI2RlZmluZSBTTkRfU0VRX0FERFJFU1NfVU5LTk9XTgkJMjUzCS8qKjwgdW5rbm93biBzb3VyY2UgKi8KKyNkZWZpbmUgU05EX1NFUV9BRERSRVNTX1NVQlNDUklCRVJTCTI1NAkvKio8IHNlbmQgZXZlbnQgdG8gYWxsIHN1YnNjcmliZWQgcG9ydHMgKi8KKyNkZWZpbmUgU05EX1NFUV9BRERSRVNTX0JST0FEQ0FTVAkyNTUJLyoqPCBzZW5kIGV2ZW50IHRvIGFsbCBxdWV1ZXMvY2xpZW50cy9wb3J0cy9jaGFubmVscyAqLworCisvKioga25vd24gY2xpZW50IG51bWJlcnMgKi8KKyNkZWZpbmUgU05EX1NFUV9DTElFTlRfU1lTVEVNCQkwCS8qKjwgc3lzdGVtIGNsaWVudCAqLworCisvKgorICovCitpbnQgc25kX3NlcV9vcGVuKHNuZF9zZXFfdCAqKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IHN0cmVhbXMsIGludCBtb2RlKTsKK2ludCBzbmRfc2VxX29wZW5fbGNvbmYoc25kX3NlcV90ICoqaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgc3RyZWFtcywgaW50IG1vZGUsIHNuZF9jb25maWdfdCAqbGNvbmYpOworY29uc3QgY2hhciAqc25kX3NlcV9uYW1lKHNuZF9zZXFfdCAqc2VxKTsKK3NuZF9zZXFfdHlwZV90IHNuZF9zZXFfdHlwZShzbmRfc2VxX3QgKnNlcSk7CitpbnQgc25kX3NlcV9jbG9zZShzbmRfc2VxX3QgKmhhbmRsZSk7CitpbnQgc25kX3NlcV9wb2xsX2Rlc2NyaXB0b3JzX2NvdW50KHNuZF9zZXFfdCAqaGFuZGxlLCBzaG9ydCBldmVudHMpOworaW50IHNuZF9zZXFfcG9sbF9kZXNjcmlwdG9ycyhzbmRfc2VxX3QgKmhhbmRsZSwgc3RydWN0IHBvbGxmZCAqcGZkcywgdW5zaWduZWQgaW50IHNwYWNlLCBzaG9ydCBldmVudHMpOworaW50IHNuZF9zZXFfcG9sbF9kZXNjcmlwdG9yc19yZXZlbnRzKHNuZF9zZXFfdCAqc2VxLCBzdHJ1Y3QgcG9sbGZkICpwZmRzLCB1bnNpZ25lZCBpbnQgbmZkcywgdW5zaWduZWQgc2hvcnQgKnJldmVudHMpOworaW50IHNuZF9zZXFfbm9uYmxvY2soc25kX3NlcV90ICpoYW5kbGUsIGludCBub25ibG9jayk7CitpbnQgc25kX3NlcV9jbGllbnRfaWQoc25kX3NlcV90ICpoYW5kbGUpOworCitzaXplX3Qgc25kX3NlcV9nZXRfb3V0cHV0X2J1ZmZlcl9zaXplKHNuZF9zZXFfdCAqaGFuZGxlKTsKK3NpemVfdCBzbmRfc2VxX2dldF9pbnB1dF9idWZmZXJfc2l6ZShzbmRfc2VxX3QgKmhhbmRsZSk7CitpbnQgc25kX3NlcV9zZXRfb3V0cHV0X2J1ZmZlcl9zaXplKHNuZF9zZXFfdCAqaGFuZGxlLCBzaXplX3Qgc2l6ZSk7CitpbnQgc25kX3NlcV9zZXRfaW5wdXRfYnVmZmVyX3NpemUoc25kX3NlcV90ICpoYW5kbGUsIHNpemVfdCBzaXplKTsKKworLyoqIHN5c3RlbSBpbmZvcm1hdGlvbiBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfc2VxX3N5c3RlbV9pbmZvIHNuZF9zZXFfc3lzdGVtX2luZm9fdDsKKworc2l6ZV90IHNuZF9zZXFfc3lzdGVtX2luZm9fc2l6ZW9mKHZvaWQpOworLyoqIGFsbG9jYXRlIGEgI3NuZF9zZXFfc3lzdGVtX2luZm9fdCBjb250YWluZXIgb24gc3RhY2sgKi8KKyNkZWZpbmUgc25kX3NlcV9zeXN0ZW1faW5mb19hbGxvY2EocHRyKSBcCisJX19zbmRfYWxsb2NhKHB0ciwgc25kX3NlcV9zeXN0ZW1faW5mbykKK2ludCBzbmRfc2VxX3N5c3RlbV9pbmZvX21hbGxvYyhzbmRfc2VxX3N5c3RlbV9pbmZvX3QgKipwdHIpOwordm9pZCBzbmRfc2VxX3N5c3RlbV9pbmZvX2ZyZWUoc25kX3NlcV9zeXN0ZW1faW5mb190ICpwdHIpOwordm9pZCBzbmRfc2VxX3N5c3RlbV9pbmZvX2NvcHkoc25kX3NlcV9zeXN0ZW1faW5mb190ICpkc3QsIGNvbnN0IHNuZF9zZXFfc3lzdGVtX2luZm9fdCAqc3JjKTsKKworaW50IHNuZF9zZXFfc3lzdGVtX2luZm9fZ2V0X3F1ZXVlcyhjb25zdCBzbmRfc2VxX3N5c3RlbV9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfc3lzdGVtX2luZm9fZ2V0X2NsaWVudHMoY29uc3Qgc25kX3NlcV9zeXN0ZW1faW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3N5c3RlbV9pbmZvX2dldF9wb3J0cyhjb25zdCBzbmRfc2VxX3N5c3RlbV9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfc3lzdGVtX2luZm9fZ2V0X2NoYW5uZWxzKGNvbnN0IHNuZF9zZXFfc3lzdGVtX2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9zeXN0ZW1faW5mb19nZXRfY3VyX2NsaWVudHMoY29uc3Qgc25kX3NlcV9zeXN0ZW1faW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3N5c3RlbV9pbmZvX2dldF9jdXJfcXVldWVzKGNvbnN0IHNuZF9zZXFfc3lzdGVtX2luZm9fdCAqaW5mbyk7CisKK2ludCBzbmRfc2VxX3N5c3RlbV9pbmZvKHNuZF9zZXFfdCAqaGFuZGxlLCBzbmRfc2VxX3N5c3RlbV9pbmZvX3QgKmluZm8pOworCisvKiogXH0gKi8KKworCisvKioKKyAqICBcZGVmZ3JvdXAgU2VxQ2xpZW50IFNlcXVlbmNlciBDbGllbnQgSW50ZXJmYWNlCisgKiAgU2VxdWVuY2VyIENsaWVudCBJbnRlcmZhY2UKKyAqICBcaW5ncm91cCBTZXF1ZW5jZXIKKyAqICBceworICovCisKKy8qKiBjbGllbnQgaW5mb3JtYXRpb24gY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3NlcV9jbGllbnRfaW5mbyBzbmRfc2VxX2NsaWVudF9pbmZvX3Q7CisKKy8qKiBjbGllbnQgdHlwZXMgKi8KK3R5cGVkZWYgZW51bSBzbmRfc2VxX2NsaWVudF90eXBlIHsKKwlTTkRfU0VRX1VTRVJfQ0xJRU5UICAgICA9IDEsCS8qKjwgdXNlciBjbGllbnQgKi8KKwlTTkRfU0VRX0tFUk5FTF9DTElFTlQgICA9IDIJLyoqPCBrZXJuZWwgY2xpZW50ICovCit9IHNuZF9zZXFfY2xpZW50X3R5cGVfdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorc2l6ZV90IHNuZF9zZXFfY2xpZW50X2luZm9fc2l6ZW9mKHZvaWQpOworLyoqIGFsbG9jYXRlIGEgI3NuZF9zZXFfY2xpZW50X2luZm9fdCBjb250YWluZXIgb24gc3RhY2sgKi8KKyNkZWZpbmUgc25kX3NlcV9jbGllbnRfaW5mb19hbGxvY2EocHRyKSBcCisJX19zbmRfYWxsb2NhKHB0ciwgc25kX3NlcV9jbGllbnRfaW5mbykKK2ludCBzbmRfc2VxX2NsaWVudF9pbmZvX21hbGxvYyhzbmRfc2VxX2NsaWVudF9pbmZvX3QgKipwdHIpOwordm9pZCBzbmRfc2VxX2NsaWVudF9pbmZvX2ZyZWUoc25kX3NlcV9jbGllbnRfaW5mb190ICpwdHIpOwordm9pZCBzbmRfc2VxX2NsaWVudF9pbmZvX2NvcHkoc25kX3NlcV9jbGllbnRfaW5mb190ICpkc3QsIGNvbnN0IHNuZF9zZXFfY2xpZW50X2luZm9fdCAqc3JjKTsKKworaW50IHNuZF9zZXFfY2xpZW50X2luZm9fZ2V0X2NsaWVudChjb25zdCBzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8pOworc25kX3NlcV9jbGllbnRfdHlwZV90IHNuZF9zZXFfY2xpZW50X2luZm9fZ2V0X3R5cGUoY29uc3Qgc25kX3NlcV9jbGllbnRfaW5mb190ICppbmZvKTsKK2NvbnN0IGNoYXIgKnNuZF9zZXFfY2xpZW50X2luZm9fZ2V0X25hbWUoc25kX3NlcV9jbGllbnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX2NsaWVudF9pbmZvX2dldF9icm9hZGNhc3RfZmlsdGVyKGNvbnN0IHNuZF9zZXFfY2xpZW50X2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9jbGllbnRfaW5mb19nZXRfZXJyb3JfYm91bmNlKGNvbnN0IHNuZF9zZXFfY2xpZW50X2luZm9fdCAqaW5mbyk7Citjb25zdCB1bnNpZ25lZCBjaGFyICpzbmRfc2VxX2NsaWVudF9pbmZvX2dldF9ldmVudF9maWx0ZXIoY29uc3Qgc25kX3NlcV9jbGllbnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX2NsaWVudF9pbmZvX2dldF9udW1fcG9ydHMoY29uc3Qgc25kX3NlcV9jbGllbnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX2NsaWVudF9pbmZvX2dldF9ldmVudF9sb3N0KGNvbnN0IHNuZF9zZXFfY2xpZW50X2luZm9fdCAqaW5mbyk7CisKK3ZvaWQgc25kX3NlcV9jbGllbnRfaW5mb19zZXRfY2xpZW50KHNuZF9zZXFfY2xpZW50X2luZm9fdCAqaW5mbywgaW50IGNsaWVudCk7Cit2b2lkIHNuZF9zZXFfY2xpZW50X2luZm9fc2V0X25hbWUoc25kX3NlcV9jbGllbnRfaW5mb190ICppbmZvLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgc25kX3NlcV9jbGllbnRfaW5mb19zZXRfYnJvYWRjYXN0X2ZpbHRlcihzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8sIGludCB2YWwpOwordm9pZCBzbmRfc2VxX2NsaWVudF9pbmZvX3NldF9lcnJvcl9ib3VuY2Uoc25kX3NlcV9jbGllbnRfaW5mb190ICppbmZvLCBpbnQgdmFsKTsKK3ZvaWQgc25kX3NlcV9jbGllbnRfaW5mb19zZXRfZXZlbnRfZmlsdGVyKHNuZF9zZXFfY2xpZW50X2luZm9fdCAqaW5mbywgdW5zaWduZWQgY2hhciAqZmlsdGVyKTsKKwordm9pZCBzbmRfc2VxX2NsaWVudF9pbmZvX2V2ZW50X2ZpbHRlcl9jbGVhcihzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8pOwordm9pZCBzbmRfc2VxX2NsaWVudF9pbmZvX2V2ZW50X2ZpbHRlcl9hZGQoc25kX3NlcV9jbGllbnRfaW5mb190ICppbmZvLCBpbnQgZXZlbnRfdHlwZSk7Cit2b2lkIHNuZF9zZXFfY2xpZW50X2luZm9fZXZlbnRfZmlsdGVyX2RlbChzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8sIGludCBldmVudF90eXBlKTsKK2ludCBzbmRfc2VxX2NsaWVudF9pbmZvX2V2ZW50X2ZpbHRlcl9jaGVjayhzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8sIGludCBldmVudF90eXBlKTsKKworaW50IHNuZF9zZXFfZ2V0X2NsaWVudF9pbmZvKHNuZF9zZXFfdCAqaGFuZGxlLCBzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfZ2V0X2FueV9jbGllbnRfaW5mbyhzbmRfc2VxX3QgKmhhbmRsZSwgaW50IGNsaWVudCwgc25kX3NlcV9jbGllbnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3NldF9jbGllbnRfaW5mbyhzbmRfc2VxX3QgKmhhbmRsZSwgc25kX3NlcV9jbGllbnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3F1ZXJ5X25leHRfY2xpZW50KHNuZF9zZXFfdCAqaGFuZGxlLCBzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8pOworCisvKgorICovCisKKy8qKiBjbGllbnQgcG9vbCBpbmZvcm1hdGlvbiBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfc2VxX2NsaWVudF9wb29sIHNuZF9zZXFfY2xpZW50X3Bvb2xfdDsKKworc2l6ZV90IHNuZF9zZXFfY2xpZW50X3Bvb2xfc2l6ZW9mKHZvaWQpOworLyoqIGFsbG9jYXRlIGEgI3NuZF9zZXFfY2xpZW50X3Bvb2xfdCBjb250YWluZXIgb24gc3RhY2sgKi8KKyNkZWZpbmUgc25kX3NlcV9jbGllbnRfcG9vbF9hbGxvY2EocHRyKSBcCisJX19zbmRfYWxsb2NhKHB0ciwgc25kX3NlcV9jbGllbnRfcG9vbCkKK2ludCBzbmRfc2VxX2NsaWVudF9wb29sX21hbGxvYyhzbmRfc2VxX2NsaWVudF9wb29sX3QgKipwdHIpOwordm9pZCBzbmRfc2VxX2NsaWVudF9wb29sX2ZyZWUoc25kX3NlcV9jbGllbnRfcG9vbF90ICpwdHIpOwordm9pZCBzbmRfc2VxX2NsaWVudF9wb29sX2NvcHkoc25kX3NlcV9jbGllbnRfcG9vbF90ICpkc3QsIGNvbnN0IHNuZF9zZXFfY2xpZW50X3Bvb2xfdCAqc3JjKTsKKworaW50IHNuZF9zZXFfY2xpZW50X3Bvb2xfZ2V0X2NsaWVudChjb25zdCBzbmRfc2VxX2NsaWVudF9wb29sX3QgKmluZm8pOworc2l6ZV90IHNuZF9zZXFfY2xpZW50X3Bvb2xfZ2V0X291dHB1dF9wb29sKGNvbnN0IHNuZF9zZXFfY2xpZW50X3Bvb2xfdCAqaW5mbyk7CitzaXplX3Qgc25kX3NlcV9jbGllbnRfcG9vbF9nZXRfaW5wdXRfcG9vbChjb25zdCBzbmRfc2VxX2NsaWVudF9wb29sX3QgKmluZm8pOworc2l6ZV90IHNuZF9zZXFfY2xpZW50X3Bvb2xfZ2V0X291dHB1dF9yb29tKGNvbnN0IHNuZF9zZXFfY2xpZW50X3Bvb2xfdCAqaW5mbyk7CitzaXplX3Qgc25kX3NlcV9jbGllbnRfcG9vbF9nZXRfb3V0cHV0X2ZyZWUoY29uc3Qgc25kX3NlcV9jbGllbnRfcG9vbF90ICppbmZvKTsKK3NpemVfdCBzbmRfc2VxX2NsaWVudF9wb29sX2dldF9pbnB1dF9mcmVlKGNvbnN0IHNuZF9zZXFfY2xpZW50X3Bvb2xfdCAqaW5mbyk7Cit2b2lkIHNuZF9zZXFfY2xpZW50X3Bvb2xfc2V0X291dHB1dF9wb29sKHNuZF9zZXFfY2xpZW50X3Bvb2xfdCAqaW5mbywgc2l6ZV90IHNpemUpOwordm9pZCBzbmRfc2VxX2NsaWVudF9wb29sX3NldF9pbnB1dF9wb29sKHNuZF9zZXFfY2xpZW50X3Bvb2xfdCAqaW5mbywgc2l6ZV90IHNpemUpOwordm9pZCBzbmRfc2VxX2NsaWVudF9wb29sX3NldF9vdXRwdXRfcm9vbShzbmRfc2VxX2NsaWVudF9wb29sX3QgKmluZm8sIHNpemVfdCBzaXplKTsKKworaW50IHNuZF9zZXFfZ2V0X2NsaWVudF9wb29sKHNuZF9zZXFfdCAqaGFuZGxlLCBzbmRfc2VxX2NsaWVudF9wb29sX3QgKmluZm8pOworaW50IHNuZF9zZXFfc2V0X2NsaWVudF9wb29sKHNuZF9zZXFfdCAqaGFuZGxlLCBzbmRfc2VxX2NsaWVudF9wb29sX3QgKmluZm8pOworCisKKy8qKiBcfSAqLworCisKKy8qKgorICogIFxkZWZncm91cCBTZXFQb3J0IFNlcXVlbmNlciBQb3J0IEludGVyZmFjZQorICogIFNlcXVlbmNlciBQb3J0IEludGVyZmFjZQorICogIFxpbmdyb3VwIFNlcXVlbmNlcgorICogIFx7CisgKi8KKworLyoqIHBvcnQgaW5mb3JtYXRpb24gY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3NlcV9wb3J0X2luZm8gc25kX3NlcV9wb3J0X2luZm9fdDsKKworLyoqIGtub3duIHBvcnQgbnVtYmVycyAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfU1lTVEVNX1RJTUVSCTAJLyoqPCBzeXN0ZW0gdGltZXIgcG9ydCAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfU1lTVEVNX0FOTk9VTkNFCTEJLyoqPCBzeXN0ZW0gYW5ub3VuY2UgcG9ydCAqLworCisvKiogcG9ydCBjYXBhYmlsaXRpZXMgKDMyIGJpdHMpICovCisjZGVmaW5lIFNORF9TRVFfUE9SVF9DQVBfUkVBRAkJKDE8PDApCS8qKjwgcmVhZGFibGUgZnJvbSB0aGlzIHBvcnQgKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX0NBUF9XUklURQkJKDE8PDEpCS8qKjwgd3JpdGFibGUgdG8gdGhpcyBwb3J0ICovCisKKyNkZWZpbmUgU05EX1NFUV9QT1JUX0NBUF9TWU5DX1JFQUQJKDE8PDIpCS8qKjwgYWxsb3cgcmVhZCBzdWJzY3JpcHRpb25zICovCisjZGVmaW5lIFNORF9TRVFfUE9SVF9DQVBfU1lOQ19XUklURQkoMTw8MykJLyoqPCBhbGxvdyB3cml0ZSBzdWJzY3JpcHRpb25zICovCisKKyNkZWZpbmUgU05EX1NFUV9QT1JUX0NBUF9EVVBMRVgJCSgxPDw0KQkvKio8IGFsbG93IHJlYWQvd3JpdGUgZHVwbGV4ICovCisKKyNkZWZpbmUgU05EX1NFUV9QT1JUX0NBUF9TVUJTX1JFQUQJKDE8PDUpCS8qKjwgYWxsb3cgcmVhZCBzdWJzY3JpcHRpb24gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX0NBUF9TVUJTX1dSSVRFCSgxPDw2KQkvKio8IGFsbG93IHdyaXRlIHN1YnNjcmlwdGlvbiAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfQ0FQX05PX0VYUE9SVAkoMTw8NykJLyoqPCByb3V0aW5nIG5vdCBhbGxvd2VkICovCisKKy8qIHBvcnQgdHlwZSAqLworLyoqIE1lc3NhZ2VzIHNlbnQgZnJvbS90byB0aGlzIHBvcnQgaGF2ZSBkZXZpY2Utc3BlY2lmaWMgc2VtYW50aWNzLiAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfVFlQRV9TUEVDSUZJQwkoMTw8MCkKKy8qKiBUaGlzIHBvcnQgdW5kZXJzdGFuZHMgTUlESSBtZXNzYWdlcy4gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX1RZUEVfTUlESV9HRU5FUklDCSgxPDwxKQorLyoqIFRoaXMgcG9ydCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEdlbmVyYWwgTUlESSBzcGVjaWZpY2F0aW9uLiAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfVFlQRV9NSURJX0dNCSgxPDwyKQorLyoqIFRoaXMgcG9ydCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIFJvbGFuZCBHUyBzdGFuZGFyZC4gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX1RZUEVfTUlESV9HUwkoMTw8MykKKy8qKiBUaGlzIHBvcnQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBZYW1haGEgWEcgc3BlY2lmaWNhdGlvbi4gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX1RZUEVfTUlESV9YRwkoMTw8NCkKKy8qKiBUaGlzIHBvcnQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBSb2xhbmQgTVQtMzIuICovCisjZGVmaW5lIFNORF9TRVFfUE9SVF9UWVBFX01JRElfTVQzMgkoMTw8NSkKKy8qKiBUaGlzIHBvcnQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBHZW5lcmFsIE1JREkgMiBzcGVjaWZpY2F0aW9uLiAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfVFlQRV9NSURJX0dNMgkoMTw8NikKKy8qKiBUaGlzIHBvcnQgdW5kZXJzdGFuZHMgU05EX1NFUV9FVkVOVF9TQU1QTEVfeHh4IG1lc3NhZ2VzCisgICAgKHRoZXNlIGFyZSBub3QgTUlESSBtZXNzYWdlcykuICovCisjZGVmaW5lIFNORF9TRVFfUE9SVF9UWVBFX1NZTlRICQkoMTw8MTApCisvKiogSW5zdHJ1bWVudHMgY2FuIGJlIGRvd25sb2FkZWQgdG8gdGhpcyBwb3J0CisgICAgKHdpdGggU05EX1NFUV9FVkVOVF9JTlNUUl94eHggbWVzc2FnZXMgc2VudCBkaXJlY3RseSkuICovCisjZGVmaW5lIFNORF9TRVFfUE9SVF9UWVBFX0RJUkVDVF9TQU1QTEUgKDE8PDExKQorLyoqIEluc3RydW1lbnRzIGNhbiBiZSBkb3dubG9hZGVkIHRvIHRoaXMgcG9ydAorICAgICh3aXRoIFNORF9TRVFfRVZFTlRfSU5TVFJfeHh4IG1lc3NhZ2VzIHNlbnQgZGlyZWN0bHkgb3IgdGhyb3VnaCBhIHF1ZXVlKS4gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX1RZUEVfU0FNUExFCSgxPDwxMikKKy8qKiBUaGlzIHBvcnQgaXMgaW1wbGVtZW50ZWQgaW4gaGFyZHdhcmUuICovCisjZGVmaW5lIFNORF9TRVFfUE9SVF9UWVBFX0hBUkRXQVJFCSgxPDwxNikKKy8qKiBUaGlzIHBvcnQgaXMgaW1wbGVtZW50ZWQgaW4gc29mdHdhcmUuICovCisjZGVmaW5lIFNORF9TRVFfUE9SVF9UWVBFX1NPRlRXQVJFCSgxPDwxNykKKy8qKiBNZXNzYWdlcyBzZW50IHRvIHRoaXMgcG9ydCB3aWxsIGdlbmVyYXRlIHNvdW5kcy4gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX1RZUEVfU1lOVEhFU0laRVIJKDE8PDE4KQorLyoqIFRoaXMgcG9ydCBtYXkgY29ubmVjdCB0byBvdGhlciBkZXZpY2VzCisgICAgKHdob3NlIGNoYXJhY3RlcmlzdGljcyBhcmUgbm90IGtub3duKS4gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX1RZUEVfUE9SVAkJKDE8PDE5KQorLyoqIFRoaXMgcG9ydCBiZWxvbmdzIHRvIGFuIGFwcGxpY2F0aW9uLCBzdWNoIGFzIGEgc2VxdWVuY2VyIG9yIGVkaXRvci4gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX1RZUEVfQVBQTElDQVRJT04JKDE8PDIwKQorCisKK3NpemVfdCBzbmRfc2VxX3BvcnRfaW5mb19zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgYSAjc25kX3NlcV9wb3J0X2luZm9fdCBjb250YWluZXIgb24gc3RhY2sgKi8KKyNkZWZpbmUgc25kX3NlcV9wb3J0X2luZm9fYWxsb2NhKHB0cikgXAorCV9fc25kX2FsbG9jYShwdHIsIHNuZF9zZXFfcG9ydF9pbmZvKQoraW50IHNuZF9zZXFfcG9ydF9pbmZvX21hbGxvYyhzbmRfc2VxX3BvcnRfaW5mb190ICoqcHRyKTsKK3ZvaWQgc25kX3NlcV9wb3J0X2luZm9fZnJlZShzbmRfc2VxX3BvcnRfaW5mb190ICpwdHIpOwordm9pZCBzbmRfc2VxX3BvcnRfaW5mb19jb3B5KHNuZF9zZXFfcG9ydF9pbmZvX3QgKmRzdCwgY29uc3Qgc25kX3NlcV9wb3J0X2luZm9fdCAqc3JjKTsKKworaW50IHNuZF9zZXFfcG9ydF9pbmZvX2dldF9jbGllbnQoY29uc3Qgc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9wb3J0X2luZm9fZ2V0X3BvcnQoY29uc3Qgc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbyk7Citjb25zdCBzbmRfc2VxX2FkZHJfdCAqc25kX3NlcV9wb3J0X2luZm9fZ2V0X2FkZHIoY29uc3Qgc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbyk7Citjb25zdCBjaGFyICpzbmRfc2VxX3BvcnRfaW5mb19nZXRfbmFtZShjb25zdCBzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvKTsKK3Vuc2lnbmVkIGludCBzbmRfc2VxX3BvcnRfaW5mb19nZXRfY2FwYWJpbGl0eShjb25zdCBzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvKTsKK3Vuc2lnbmVkIGludCBzbmRfc2VxX3BvcnRfaW5mb19nZXRfdHlwZShjb25zdCBzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3BvcnRfaW5mb19nZXRfbWlkaV9jaGFubmVscyhjb25zdCBzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3BvcnRfaW5mb19nZXRfbWlkaV92b2ljZXMoY29uc3Qgc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9wb3J0X2luZm9fZ2V0X3N5bnRoX3ZvaWNlcyhjb25zdCBzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3BvcnRfaW5mb19nZXRfcmVhZF91c2UoY29uc3Qgc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9wb3J0X2luZm9fZ2V0X3dyaXRlX3VzZShjb25zdCBzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3BvcnRfaW5mb19nZXRfcG9ydF9zcGVjaWZpZWQoY29uc3Qgc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9wb3J0X2luZm9fZ2V0X3RpbWVzdGFtcGluZyhjb25zdCBzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3BvcnRfaW5mb19nZXRfdGltZXN0YW1wX3JlYWwoY29uc3Qgc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9wb3J0X2luZm9fZ2V0X3RpbWVzdGFtcF9xdWV1ZShjb25zdCBzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvKTsKKwordm9pZCBzbmRfc2VxX3BvcnRfaW5mb19zZXRfY2xpZW50KHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8sIGludCBjbGllbnQpOwordm9pZCBzbmRfc2VxX3BvcnRfaW5mb19zZXRfcG9ydChzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvLCBpbnQgcG9ydCk7Cit2b2lkIHNuZF9zZXFfcG9ydF9pbmZvX3NldF9hZGRyKHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8sIGNvbnN0IHNuZF9zZXFfYWRkcl90ICphZGRyKTsKK3ZvaWQgc25kX3NlcV9wb3J0X2luZm9fc2V0X25hbWUoc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbywgY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIHNuZF9zZXFfcG9ydF9pbmZvX3NldF9jYXBhYmlsaXR5KHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8sIHVuc2lnbmVkIGludCBjYXBhYmlsaXR5KTsKK3ZvaWQgc25kX3NlcV9wb3J0X2luZm9fc2V0X3R5cGUoc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbywgdW5zaWduZWQgaW50IHR5cGUpOwordm9pZCBzbmRfc2VxX3BvcnRfaW5mb19zZXRfbWlkaV9jaGFubmVscyhzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvLCBpbnQgY2hhbm5lbHMpOwordm9pZCBzbmRfc2VxX3BvcnRfaW5mb19zZXRfbWlkaV92b2ljZXMoc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbywgaW50IHZvaWNlcyk7Cit2b2lkIHNuZF9zZXFfcG9ydF9pbmZvX3NldF9zeW50aF92b2ljZXMoc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbywgaW50IHZvaWNlcyk7Cit2b2lkIHNuZF9zZXFfcG9ydF9pbmZvX3NldF9wb3J0X3NwZWNpZmllZChzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvLCBpbnQgdmFsKTsKK3ZvaWQgc25kX3NlcV9wb3J0X2luZm9fc2V0X3RpbWVzdGFtcGluZyhzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvLCBpbnQgZW5hYmxlKTsKK3ZvaWQgc25kX3NlcV9wb3J0X2luZm9fc2V0X3RpbWVzdGFtcF9yZWFsKHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8sIGludCByZWFsdGltZSk7Cit2b2lkIHNuZF9zZXFfcG9ydF9pbmZvX3NldF90aW1lc3RhbXBfcXVldWUoc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbywgaW50IHF1ZXVlKTsKKworaW50IHNuZF9zZXFfY3JlYXRlX3BvcnQoc25kX3NlcV90ICpoYW5kbGUsIHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfZGVsZXRlX3BvcnQoc25kX3NlcV90ICpoYW5kbGUsIGludCBwb3J0KTsKK2ludCBzbmRfc2VxX2dldF9wb3J0X2luZm8oc25kX3NlcV90ICpoYW5kbGUsIGludCBwb3J0LCBzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX2dldF9hbnlfcG9ydF9pbmZvKHNuZF9zZXFfdCAqaGFuZGxlLCBpbnQgY2xpZW50LCBpbnQgcG9ydCwgc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9zZXRfcG9ydF9pbmZvKHNuZF9zZXFfdCAqaGFuZGxlLCBpbnQgcG9ydCwgc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9xdWVyeV9uZXh0X3BvcnQoc25kX3NlcV90ICpoYW5kbGUsIHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8pOworCisvKiogXH0gKi8KKworCisvKioKKyAqICBcZGVmZ3JvdXAgU2VxU3Vic2NyaWJlIFNlcXVlbmNlciBQb3J0IFN1YnNjcmlwdGlvbgorICogIFNlcXVlbmNlciBQb3J0IFN1YnNjcmlwdGlvbgorICogIFxpbmdyb3VwIFNlcXVlbmNlcgorICogIFx7CisgKi8KKworLyoqIHBvcnQgc3Vic2NyaXB0aW9uIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9zZXFfcG9ydF9zdWJzY3JpYmUgc25kX3NlcV9wb3J0X3N1YnNjcmliZV90OworCitzaXplX3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZV9zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgYSAjc25kX3NlcV9wb3J0X3N1YnNjcmliZV90IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX2FsbG9jYShwdHIpIFwKKwlfX3NuZF9hbGxvY2EocHRyLCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlKQoraW50IHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfbWFsbG9jKHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfdCAqKnB0cik7Cit2b2lkIHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfZnJlZShzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKnB0cik7Cit2b2lkIHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfY29weShzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKmRzdCwgY29uc3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICpzcmMpOworCitjb25zdCBzbmRfc2VxX2FkZHJfdCAqc25kX3NlcV9wb3J0X3N1YnNjcmliZV9nZXRfc2VuZGVyKGNvbnN0IHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfdCAqaW5mbyk7Citjb25zdCBzbmRfc2VxX2FkZHJfdCAqc25kX3NlcV9wb3J0X3N1YnNjcmliZV9nZXRfZGVzdChjb25zdCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKmluZm8pOworaW50IHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfZ2V0X3F1ZXVlKGNvbnN0IHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfdCAqaW5mbyk7CitpbnQgc25kX3NlcV9wb3J0X3N1YnNjcmliZV9nZXRfZXhjbHVzaXZlKGNvbnN0IHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfdCAqaW5mbyk7CitpbnQgc25kX3NlcV9wb3J0X3N1YnNjcmliZV9nZXRfdGltZV91cGRhdGUoY29uc3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICppbmZvKTsKK2ludCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX2dldF90aW1lX3JlYWwoY29uc3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICppbmZvKTsKKwordm9pZCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3NldF9zZW5kZXIoc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICppbmZvLCBjb25zdCBzbmRfc2VxX2FkZHJfdCAqYWRkcik7Cit2b2lkIHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfc2V0X2Rlc3Qoc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICppbmZvLCBjb25zdCBzbmRfc2VxX2FkZHJfdCAqYWRkcik7Cit2b2lkIHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfc2V0X3F1ZXVlKHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfdCAqaW5mbywgaW50IHEpOwordm9pZCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3NldF9leGNsdXNpdmUoc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICppbmZvLCBpbnQgdmFsKTsKK3ZvaWQgc25kX3NlcV9wb3J0X3N1YnNjcmliZV9zZXRfdGltZV91cGRhdGUoc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICppbmZvLCBpbnQgdmFsKTsKK3ZvaWQgc25kX3NlcV9wb3J0X3N1YnNjcmliZV9zZXRfdGltZV9yZWFsKHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfdCAqaW5mbywgaW50IHZhbCk7CisKK2ludCBzbmRfc2VxX2dldF9wb3J0X3N1YnNjcmlwdGlvbihzbmRfc2VxX3QgKmhhbmRsZSwgc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICpzdWIpOworaW50IHNuZF9zZXFfc3Vic2NyaWJlX3BvcnQoc25kX3NlcV90ICpoYW5kbGUsIHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfdCAqc3ViKTsKK2ludCBzbmRfc2VxX3Vuc3Vic2NyaWJlX3BvcnQoc25kX3NlcV90ICpoYW5kbGUsIHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfdCAqc3ViKTsKKworLyoKKyAqLworCisvKiogc3Vic2NyaXB0aW9uIHF1ZXJ5IGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9zZXFfcXVlcnlfc3Vic2NyaWJlIHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3Q7CisKKy8qKiB0eXBlIG9mIHF1ZXJ5IHN1YnNjcmlwdGlvbiAqLwordHlwZWRlZiBlbnVtIHsKKwlTTkRfU0VRX1FVRVJZX1NVQlNfUkVBRCwJLyoqPCBxdWVyeSByZWFkIHN1YnNjcmlwdGlvbnMgKi8KKwlTTkRfU0VRX1FVRVJZX1NVQlNfV1JJVEUJLyoqPCBxdWVyeSB3cml0ZSBzdWJzY3JpcHRpb25zICovCit9IHNuZF9zZXFfcXVlcnlfc3Vic190eXBlX3Q7CisKK3NpemVfdCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgYSAjc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCBjb250YWluZXIgb24gc3RhY2sgKi8KKyNkZWZpbmUgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfYWxsb2NhKHB0cikgXAorCV9fc25kX2FsbG9jYShwdHIsIHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlKQoraW50IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX21hbGxvYyhzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICoqcHRyKTsKK3ZvaWQgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZnJlZShzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICpwdHIpOwordm9pZCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9jb3B5KHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3QgKmRzdCwgY29uc3Qgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqc3JjKTsKKworaW50IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX2dldF9jbGllbnQoY29uc3Qgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqaW5mbyk7CitpbnQgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X3BvcnQoY29uc3Qgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqaW5mbyk7Citjb25zdCBzbmRfc2VxX2FkZHJfdCAqc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X3Jvb3QoY29uc3Qgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqaW5mbyk7CitzbmRfc2VxX3F1ZXJ5X3N1YnNfdHlwZV90IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX2dldF90eXBlKGNvbnN0IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3QgKmluZm8pOworaW50IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX2dldF9pbmRleChjb25zdCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICppbmZvKTsKK2ludCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9nZXRfbnVtX3N1YnMoY29uc3Qgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqaW5mbyk7Citjb25zdCBzbmRfc2VxX2FkZHJfdCAqc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X2FkZHIoY29uc3Qgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqaW5mbyk7CitpbnQgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X3F1ZXVlKGNvbnN0IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3QgKmluZm8pOworaW50IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX2dldF9leGNsdXNpdmUoY29uc3Qgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqaW5mbyk7CitpbnQgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X3RpbWVfdXBkYXRlKGNvbnN0IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3QgKmluZm8pOworaW50IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX2dldF90aW1lX3JlYWwoY29uc3Qgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqaW5mbyk7CisKK3ZvaWQgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfc2V0X2NsaWVudChzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICppbmZvLCBpbnQgY2xpZW50KTsKK3ZvaWQgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfc2V0X3BvcnQoc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqaW5mbywgaW50IHBvcnQpOwordm9pZCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9zZXRfcm9vdChzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICppbmZvLCBjb25zdCBzbmRfc2VxX2FkZHJfdCAqYWRkcik7Cit2b2lkIHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3NldF90eXBlKHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3QgKmluZm8sIHNuZF9zZXFfcXVlcnlfc3Vic190eXBlX3QgdHlwZSk7Cit2b2lkIHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3NldF9pbmRleChzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICppbmZvLCBpbnQgX2luZGV4KTsKKworaW50IHNuZF9zZXFfcXVlcnlfcG9ydF9zdWJzY3JpYmVycyhzbmRfc2VxX3QgKnNlcSwgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqIHN1YnMpOworCisvKiogXH0gKi8KKworCisvKioKKyAqICBcZGVmZ3JvdXAgU2VxUXVldWUgU2VxdWVuY2VyIFF1ZXVlIEludGVyZmFjZQorICogIFNlcXVlbmNlciBRdWV1ZSBJbnRlcmZhY2UKKyAqICBcaW5ncm91cCBTZXF1ZW5jZXIKKyAqICBceworICovCisKKy8qKiBxdWV1ZSBpbmZvcm1hdGlvbiBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfc2VxX3F1ZXVlX2luZm8gc25kX3NlcV9xdWV1ZV9pbmZvX3Q7CisvKiogcXVldWUgc3RhdHVzIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9zZXFfcXVldWVfc3RhdHVzIHNuZF9zZXFfcXVldWVfc3RhdHVzX3Q7CisvKiogcXVldWUgdGVtcG8gY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3NlcV9xdWV1ZV90ZW1wbyBzbmRfc2VxX3F1ZXVlX3RlbXBvX3Q7CisvKiogcXVldWUgdGltZXIgaW5mb3JtYXRpb24gY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3NlcV9xdWV1ZV90aW1lciBzbmRfc2VxX3F1ZXVlX3RpbWVyX3Q7CisKKy8qKiBzcGVjaWFsIHF1ZXVlIGlkcyAqLworI2RlZmluZSBTTkRfU0VRX1FVRVVFX0RJUkVDVAkJMjUzCS8qKjwgZGlyZWN0IGRpc3BhdGNoICovCisKK3NpemVfdCBzbmRfc2VxX3F1ZXVlX2luZm9fc2l6ZW9mKHZvaWQpOworLyoqIGFsbG9jYXRlIGEgI3NuZF9zZXFfcXVldWVfaW5mb190IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfc2VxX3F1ZXVlX2luZm9fYWxsb2NhKHB0cikgXAorCV9fc25kX2FsbG9jYShwdHIsIHNuZF9zZXFfcXVldWVfaW5mbykKK2ludCBzbmRfc2VxX3F1ZXVlX2luZm9fbWFsbG9jKHNuZF9zZXFfcXVldWVfaW5mb190ICoqcHRyKTsKK3ZvaWQgc25kX3NlcV9xdWV1ZV9pbmZvX2ZyZWUoc25kX3NlcV9xdWV1ZV9pbmZvX3QgKnB0cik7Cit2b2lkIHNuZF9zZXFfcXVldWVfaW5mb19jb3B5KHNuZF9zZXFfcXVldWVfaW5mb190ICpkc3QsIGNvbnN0IHNuZF9zZXFfcXVldWVfaW5mb190ICpzcmMpOworCitpbnQgc25kX3NlcV9xdWV1ZV9pbmZvX2dldF9xdWV1ZShjb25zdCBzbmRfc2VxX3F1ZXVlX2luZm9fdCAqaW5mbyk7Citjb25zdCBjaGFyICpzbmRfc2VxX3F1ZXVlX2luZm9fZ2V0X25hbWUoY29uc3Qgc25kX3NlcV9xdWV1ZV9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfcXVldWVfaW5mb19nZXRfb3duZXIoY29uc3Qgc25kX3NlcV9xdWV1ZV9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfcXVldWVfaW5mb19nZXRfbG9ja2VkKGNvbnN0IHNuZF9zZXFfcXVldWVfaW5mb190ICppbmZvKTsKK3Vuc2lnbmVkIGludCBzbmRfc2VxX3F1ZXVlX2luZm9fZ2V0X2ZsYWdzKGNvbnN0IHNuZF9zZXFfcXVldWVfaW5mb190ICppbmZvKTsKKwordm9pZCBzbmRfc2VxX3F1ZXVlX2luZm9fc2V0X25hbWUoc25kX3NlcV9xdWV1ZV9pbmZvX3QgKmluZm8sIGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBzbmRfc2VxX3F1ZXVlX2luZm9fc2V0X293bmVyKHNuZF9zZXFfcXVldWVfaW5mb190ICppbmZvLCBpbnQgb3duZXIpOwordm9pZCBzbmRfc2VxX3F1ZXVlX2luZm9fc2V0X2xvY2tlZChzbmRfc2VxX3F1ZXVlX2luZm9fdCAqaW5mbywgaW50IGxvY2tlZCk7Cit2b2lkIHNuZF9zZXFfcXVldWVfaW5mb19zZXRfZmxhZ3Moc25kX3NlcV9xdWV1ZV9pbmZvX3QgKmluZm8sIHVuc2lnbmVkIGludCBmbGFncyk7CisKK2ludCBzbmRfc2VxX2NyZWF0ZV9xdWV1ZShzbmRfc2VxX3QgKnNlcSwgc25kX3NlcV9xdWV1ZV9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfYWxsb2NfbmFtZWRfcXVldWUoc25kX3NlcV90ICpzZXEsIGNvbnN0IGNoYXIgKm5hbWUpOworaW50IHNuZF9zZXFfYWxsb2NfcXVldWUoc25kX3NlcV90ICpoYW5kbGUpOworaW50IHNuZF9zZXFfZnJlZV9xdWV1ZShzbmRfc2VxX3QgKmhhbmRsZSwgaW50IHEpOworaW50IHNuZF9zZXFfZ2V0X3F1ZXVlX2luZm8oc25kX3NlcV90ICpzZXEsIGludCBxLCBzbmRfc2VxX3F1ZXVlX2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9zZXRfcXVldWVfaW5mbyhzbmRfc2VxX3QgKnNlcSwgaW50IHEsIHNuZF9zZXFfcXVldWVfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3F1ZXJ5X25hbWVkX3F1ZXVlKHNuZF9zZXFfdCAqc2VxLCBjb25zdCBjaGFyICpuYW1lKTsKKworaW50IHNuZF9zZXFfZ2V0X3F1ZXVlX3VzYWdlKHNuZF9zZXFfdCAqaGFuZGxlLCBpbnQgcSk7CitpbnQgc25kX3NlcV9zZXRfcXVldWVfdXNhZ2Uoc25kX3NlcV90ICpoYW5kbGUsIGludCBxLCBpbnQgdXNlZCk7CisKKy8qCisgKi8KK3NpemVfdCBzbmRfc2VxX3F1ZXVlX3N0YXR1c19zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgYSAjc25kX3NlcV9xdWV1ZV9zdGF0dXNfdCBjb250YWluZXIgb24gc3RhY2sgKi8KKyNkZWZpbmUgc25kX3NlcV9xdWV1ZV9zdGF0dXNfYWxsb2NhKHB0cikgXAorCV9fc25kX2FsbG9jYShwdHIsIHNuZF9zZXFfcXVldWVfc3RhdHVzKQoraW50IHNuZF9zZXFfcXVldWVfc3RhdHVzX21hbGxvYyhzbmRfc2VxX3F1ZXVlX3N0YXR1c190ICoqcHRyKTsKK3ZvaWQgc25kX3NlcV9xdWV1ZV9zdGF0dXNfZnJlZShzbmRfc2VxX3F1ZXVlX3N0YXR1c190ICpwdHIpOwordm9pZCBzbmRfc2VxX3F1ZXVlX3N0YXR1c19jb3B5KHNuZF9zZXFfcXVldWVfc3RhdHVzX3QgKmRzdCwgY29uc3Qgc25kX3NlcV9xdWV1ZV9zdGF0dXNfdCAqc3JjKTsKKworaW50IHNuZF9zZXFfcXVldWVfc3RhdHVzX2dldF9xdWV1ZShjb25zdCBzbmRfc2VxX3F1ZXVlX3N0YXR1c190ICppbmZvKTsKK2ludCBzbmRfc2VxX3F1ZXVlX3N0YXR1c19nZXRfZXZlbnRzKGNvbnN0IHNuZF9zZXFfcXVldWVfc3RhdHVzX3QgKmluZm8pOworc25kX3NlcV90aWNrX3RpbWVfdCBzbmRfc2VxX3F1ZXVlX3N0YXR1c19nZXRfdGlja190aW1lKGNvbnN0IHNuZF9zZXFfcXVldWVfc3RhdHVzX3QgKmluZm8pOworY29uc3Qgc25kX3NlcV9yZWFsX3RpbWVfdCAqc25kX3NlcV9xdWV1ZV9zdGF0dXNfZ2V0X3JlYWxfdGltZShjb25zdCBzbmRfc2VxX3F1ZXVlX3N0YXR1c190ICppbmZvKTsKK3Vuc2lnbmVkIGludCBzbmRfc2VxX3F1ZXVlX3N0YXR1c19nZXRfc3RhdHVzKGNvbnN0IHNuZF9zZXFfcXVldWVfc3RhdHVzX3QgKmluZm8pOworCitpbnQgc25kX3NlcV9nZXRfcXVldWVfc3RhdHVzKHNuZF9zZXFfdCAqaGFuZGxlLCBpbnQgcSwgc25kX3NlcV9xdWV1ZV9zdGF0dXNfdCAqc3RhdHVzKTsKKworLyoKKyAqLworc2l6ZV90IHNuZF9zZXFfcXVldWVfdGVtcG9fc2l6ZW9mKHZvaWQpOworLyoqIGFsbG9jYXRlIGEgI3NuZF9zZXFfcXVldWVfdGVtcG9fdCBjb250YWluZXIgb24gc3RhY2sgKi8KKyNkZWZpbmUgc25kX3NlcV9xdWV1ZV90ZW1wb19hbGxvY2EocHRyKSBcCisJX19zbmRfYWxsb2NhKHB0ciwgc25kX3NlcV9xdWV1ZV90ZW1wbykKK2ludCBzbmRfc2VxX3F1ZXVlX3RlbXBvX21hbGxvYyhzbmRfc2VxX3F1ZXVlX3RlbXBvX3QgKipwdHIpOwordm9pZCBzbmRfc2VxX3F1ZXVlX3RlbXBvX2ZyZWUoc25kX3NlcV9xdWV1ZV90ZW1wb190ICpwdHIpOwordm9pZCBzbmRfc2VxX3F1ZXVlX3RlbXBvX2NvcHkoc25kX3NlcV9xdWV1ZV90ZW1wb190ICpkc3QsIGNvbnN0IHNuZF9zZXFfcXVldWVfdGVtcG9fdCAqc3JjKTsKKworaW50IHNuZF9zZXFfcXVldWVfdGVtcG9fZ2V0X3F1ZXVlKGNvbnN0IHNuZF9zZXFfcXVldWVfdGVtcG9fdCAqaW5mbyk7Cit1bnNpZ25lZCBpbnQgc25kX3NlcV9xdWV1ZV90ZW1wb19nZXRfdGVtcG8oY29uc3Qgc25kX3NlcV9xdWV1ZV90ZW1wb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3F1ZXVlX3RlbXBvX2dldF9wcHEoY29uc3Qgc25kX3NlcV9xdWV1ZV90ZW1wb190ICppbmZvKTsKK3Vuc2lnbmVkIGludCBzbmRfc2VxX3F1ZXVlX3RlbXBvX2dldF9za2V3KGNvbnN0IHNuZF9zZXFfcXVldWVfdGVtcG9fdCAqaW5mbyk7Cit1bnNpZ25lZCBpbnQgc25kX3NlcV9xdWV1ZV90ZW1wb19nZXRfc2tld19iYXNlKGNvbnN0IHNuZF9zZXFfcXVldWVfdGVtcG9fdCAqaW5mbyk7Cit2b2lkIHNuZF9zZXFfcXVldWVfdGVtcG9fc2V0X3RlbXBvKHNuZF9zZXFfcXVldWVfdGVtcG9fdCAqaW5mbywgdW5zaWduZWQgaW50IHRlbXBvKTsKK3ZvaWQgc25kX3NlcV9xdWV1ZV90ZW1wb19zZXRfcHBxKHNuZF9zZXFfcXVldWVfdGVtcG9fdCAqaW5mbywgaW50IHBwcSk7Cit2b2lkIHNuZF9zZXFfcXVldWVfdGVtcG9fc2V0X3NrZXcoc25kX3NlcV9xdWV1ZV90ZW1wb190ICppbmZvLCB1bnNpZ25lZCBpbnQgc2tldyk7Cit2b2lkIHNuZF9zZXFfcXVldWVfdGVtcG9fc2V0X3NrZXdfYmFzZShzbmRfc2VxX3F1ZXVlX3RlbXBvX3QgKmluZm8sIHVuc2lnbmVkIGludCBiYXNlKTsKKworaW50IHNuZF9zZXFfZ2V0X3F1ZXVlX3RlbXBvKHNuZF9zZXFfdCAqaGFuZGxlLCBpbnQgcSwgc25kX3NlcV9xdWV1ZV90ZW1wb190ICp0ZW1wbyk7CitpbnQgc25kX3NlcV9zZXRfcXVldWVfdGVtcG8oc25kX3NlcV90ICpoYW5kbGUsIGludCBxLCBzbmRfc2VxX3F1ZXVlX3RlbXBvX3QgKnRlbXBvKTsKKworLyoKKyAqLworCisvKiogc2VxdWVuY2VyIHRpbWVyIHNvdXJjZXMgKi8KK3R5cGVkZWYgZW51bSB7CisJU05EX1NFUV9USU1FUl9BTFNBID0gMCwJCS8qIEFMU0EgdGltZXIgKi8KKwlTTkRfU0VRX1RJTUVSX01JRElfQ0xPQ0sgPSAxLAkvKiBNaWRpIENsb2NrIChDTE9DSyBldmVudCkgKi8KKwlTTkRfU0VRX1RJTUVSX01JRElfVElDSyA9IDIJLyogTWlkaSBUaW1lciBUaWNrIChUSUNLIGV2ZW50ICovCit9IHNuZF9zZXFfcXVldWVfdGltZXJfdHlwZV90OworCitzaXplX3Qgc25kX3NlcV9xdWV1ZV90aW1lcl9zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgYSAjc25kX3NlcV9xdWV1ZV90aW1lcl90IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfc2VxX3F1ZXVlX3RpbWVyX2FsbG9jYShwdHIpIFwKKwlfX3NuZF9hbGxvY2EocHRyLCBzbmRfc2VxX3F1ZXVlX3RpbWVyKQoraW50IHNuZF9zZXFfcXVldWVfdGltZXJfbWFsbG9jKHNuZF9zZXFfcXVldWVfdGltZXJfdCAqKnB0cik7Cit2b2lkIHNuZF9zZXFfcXVldWVfdGltZXJfZnJlZShzbmRfc2VxX3F1ZXVlX3RpbWVyX3QgKnB0cik7Cit2b2lkIHNuZF9zZXFfcXVldWVfdGltZXJfY29weShzbmRfc2VxX3F1ZXVlX3RpbWVyX3QgKmRzdCwgY29uc3Qgc25kX3NlcV9xdWV1ZV90aW1lcl90ICpzcmMpOworCitpbnQgc25kX3NlcV9xdWV1ZV90aW1lcl9nZXRfcXVldWUoY29uc3Qgc25kX3NlcV9xdWV1ZV90aW1lcl90ICppbmZvKTsKK3NuZF9zZXFfcXVldWVfdGltZXJfdHlwZV90IHNuZF9zZXFfcXVldWVfdGltZXJfZ2V0X3R5cGUoY29uc3Qgc25kX3NlcV9xdWV1ZV90aW1lcl90ICppbmZvKTsKK2NvbnN0IHNuZF90aW1lcl9pZF90ICpzbmRfc2VxX3F1ZXVlX3RpbWVyX2dldF9pZChjb25zdCBzbmRfc2VxX3F1ZXVlX3RpbWVyX3QgKmluZm8pOwordW5zaWduZWQgaW50IHNuZF9zZXFfcXVldWVfdGltZXJfZ2V0X3Jlc29sdXRpb24oY29uc3Qgc25kX3NlcV9xdWV1ZV90aW1lcl90ICppbmZvKTsKKwordm9pZCBzbmRfc2VxX3F1ZXVlX3RpbWVyX3NldF90eXBlKHNuZF9zZXFfcXVldWVfdGltZXJfdCAqaW5mbywgc25kX3NlcV9xdWV1ZV90aW1lcl90eXBlX3QgdHlwZSk7Cit2b2lkIHNuZF9zZXFfcXVldWVfdGltZXJfc2V0X2lkKHNuZF9zZXFfcXVldWVfdGltZXJfdCAqaW5mbywgY29uc3Qgc25kX3RpbWVyX2lkX3QgKmlkKTsKK3ZvaWQgc25kX3NlcV9xdWV1ZV90aW1lcl9zZXRfcmVzb2x1dGlvbihzbmRfc2VxX3F1ZXVlX3RpbWVyX3QgKmluZm8sIHVuc2lnbmVkIGludCByZXNvbHV0aW9uKTsKKworaW50IHNuZF9zZXFfZ2V0X3F1ZXVlX3RpbWVyKHNuZF9zZXFfdCAqaGFuZGxlLCBpbnQgcSwgc25kX3NlcV9xdWV1ZV90aW1lcl90ICp0aW1lcik7CitpbnQgc25kX3NlcV9zZXRfcXVldWVfdGltZXIoc25kX3NlcV90ICpoYW5kbGUsIGludCBxLCBzbmRfc2VxX3F1ZXVlX3RpbWVyX3QgKnRpbWVyKTsKKworLyoqIFx9ICovCisKKy8qKgorICogIFxkZWZncm91cCBTZXFFdmVudCBTZXF1ZW5jZXIgRXZlbnQgQVBJCisgKiAgU2VxdWVuY2VyIEV2ZW50IEFQSQorICogIFxpbmdyb3VwIFNlcXVlbmNlcgorICogIFx7CisgKi8KKworaW50IHNuZF9zZXFfZnJlZV9ldmVudChzbmRfc2VxX2V2ZW50X3QgKmV2KTsKK3NzaXplX3Qgc25kX3NlcV9ldmVudF9sZW5ndGgoc25kX3NlcV9ldmVudF90ICpldik7CitpbnQgc25kX3NlcV9ldmVudF9vdXRwdXQoc25kX3NlcV90ICpoYW5kbGUsIHNuZF9zZXFfZXZlbnRfdCAqZXYpOworaW50IHNuZF9zZXFfZXZlbnRfb3V0cHV0X2J1ZmZlcihzbmRfc2VxX3QgKmhhbmRsZSwgc25kX3NlcV9ldmVudF90ICpldik7CitpbnQgc25kX3NlcV9ldmVudF9vdXRwdXRfZGlyZWN0KHNuZF9zZXFfdCAqaGFuZGxlLCBzbmRfc2VxX2V2ZW50X3QgKmV2KTsKK2ludCBzbmRfc2VxX2V2ZW50X2lucHV0KHNuZF9zZXFfdCAqaGFuZGxlLCBzbmRfc2VxX2V2ZW50X3QgKipldik7CitpbnQgc25kX3NlcV9ldmVudF9pbnB1dF9wZW5kaW5nKHNuZF9zZXFfdCAqc2VxLCBpbnQgZmV0Y2hfc2VxdWVuY2VyKTsKK2ludCBzbmRfc2VxX2RyYWluX291dHB1dChzbmRfc2VxX3QgKmhhbmRsZSk7CitpbnQgc25kX3NlcV9ldmVudF9vdXRwdXRfcGVuZGluZyhzbmRfc2VxX3QgKnNlcSk7CitpbnQgc25kX3NlcV9leHRyYWN0X291dHB1dChzbmRfc2VxX3QgKmhhbmRsZSwgc25kX3NlcV9ldmVudF90ICoqZXYpOworaW50IHNuZF9zZXFfZHJvcF9vdXRwdXQoc25kX3NlcV90ICpoYW5kbGUpOworaW50IHNuZF9zZXFfZHJvcF9vdXRwdXRfYnVmZmVyKHNuZF9zZXFfdCAqaGFuZGxlKTsKK2ludCBzbmRfc2VxX2Ryb3BfaW5wdXQoc25kX3NlcV90ICpoYW5kbGUpOworaW50IHNuZF9zZXFfZHJvcF9pbnB1dF9idWZmZXIoc25kX3NlcV90ICpoYW5kbGUpOworCisvKiogZXZlbnQgcmVtb3ZhbCBjb25kaXRpb25hbHMgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfc2VxX3JlbW92ZV9ldmVudHMgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3Q7CisKKy8qKiBSZW1vdmUgY29uZGl0aW9uYWwgZmxhZ3MgKi8KKyNkZWZpbmUgU05EX1NFUV9SRU1PVkVfSU5QVVQJCSgxPDwwKQkvKio8IEZsdXNoIGlucHV0IHF1ZXVlcyAqLworI2RlZmluZSBTTkRfU0VRX1JFTU9WRV9PVVRQVVQJCSgxPDwxKQkvKio8IEZsdXNoIG91dHB1dCBxdWV1ZXMgKi8KKyNkZWZpbmUgU05EX1NFUV9SRU1PVkVfREVTVAkJKDE8PDIpCS8qKjwgUmVzdHJpY3QgYnkgZGVzdGluYXRpb24gcTpjbGllbnQ6cG9ydCAqLworI2RlZmluZSBTTkRfU0VRX1JFTU9WRV9ERVNUX0NIQU5ORUwJKDE8PDMpCS8qKjwgUmVzdHJpY3QgYnkgY2hhbm5lbCAqLworI2RlZmluZSBTTkRfU0VRX1JFTU9WRV9USU1FX0JFRk9SRQkoMTw8NCkJLyoqPCBSZXN0cmljdCB0byBiZWZvcmUgdGltZSAqLworI2RlZmluZSBTTkRfU0VRX1JFTU9WRV9USU1FX0FGVEVSCSgxPDw1KQkvKio8IFJlc3RyaWN0IHRvIHRpbWUgb3IgYWZ0ZXIgKi8KKyNkZWZpbmUgU05EX1NFUV9SRU1PVkVfVElNRV9USUNLCSgxPDw2KQkvKio8IFRpbWUgaXMgaW4gdGlja3MgKi8KKyNkZWZpbmUgU05EX1NFUV9SRU1PVkVfRVZFTlRfVFlQRQkoMTw8NykJLyoqPCBSZXN0cmljdCB0byBldmVudCB0eXBlICovCisjZGVmaW5lIFNORF9TRVFfUkVNT1ZFX0lHTk9SRV9PRkYgCSgxPDw4KQkvKio8IERvIG5vdCBmbHVzaCBvZmYgZXZlbnRzICovCisjZGVmaW5lIFNORF9TRVFfUkVNT1ZFX1RBR19NQVRDSCAJKDE8PDkpCS8qKjwgUmVzdHJpY3QgdG8gZXZlbnRzIHdpdGggZ2l2ZW4gdGFnICovCisKK3NpemVfdCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfc2l6ZW9mKHZvaWQpOworLyoqIGFsbG9jYXRlIGEgI3NuZF9zZXFfcmVtb3ZlX2V2ZW50c190IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfc2VxX3JlbW92ZV9ldmVudHNfYWxsb2NhKHB0cikgXAorCV9fc25kX2FsbG9jYShwdHIsIHNuZF9zZXFfcmVtb3ZlX2V2ZW50cykKK2ludCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfbWFsbG9jKHNuZF9zZXFfcmVtb3ZlX2V2ZW50c190ICoqcHRyKTsKK3ZvaWQgc25kX3NlcV9yZW1vdmVfZXZlbnRzX2ZyZWUoc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKnB0cik7Cit2b2lkIHNuZF9zZXFfcmVtb3ZlX2V2ZW50c19jb3B5KHNuZF9zZXFfcmVtb3ZlX2V2ZW50c190ICpkc3QsIGNvbnN0IHNuZF9zZXFfcmVtb3ZlX2V2ZW50c190ICpzcmMpOworCit1bnNpZ25lZCBpbnQgc25kX3NlcV9yZW1vdmVfZXZlbnRzX2dldF9jb25kaXRpb24oY29uc3Qgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKmluZm8pOworaW50IHNuZF9zZXFfcmVtb3ZlX2V2ZW50c19nZXRfcXVldWUoY29uc3Qgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKmluZm8pOworY29uc3Qgc25kX3NlcV90aW1lc3RhbXBfdCAqc25kX3NlcV9yZW1vdmVfZXZlbnRzX2dldF90aW1lKGNvbnN0IHNuZF9zZXFfcmVtb3ZlX2V2ZW50c190ICppbmZvKTsKK2NvbnN0IHNuZF9zZXFfYWRkcl90ICpzbmRfc2VxX3JlbW92ZV9ldmVudHNfZ2V0X2Rlc3QoY29uc3Qgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKmluZm8pOworaW50IHNuZF9zZXFfcmVtb3ZlX2V2ZW50c19nZXRfY2hhbm5lbChjb25zdCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCAqaW5mbyk7CitpbnQgc25kX3NlcV9yZW1vdmVfZXZlbnRzX2dldF9ldmVudF90eXBlKGNvbnN0IHNuZF9zZXFfcmVtb3ZlX2V2ZW50c190ICppbmZvKTsKK2ludCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfZ2V0X3RhZyhjb25zdCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCAqaW5mbyk7CisKK3ZvaWQgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3NldF9jb25kaXRpb24oc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKmluZm8sIHVuc2lnbmVkIGludCBmbGFncyk7Cit2b2lkIHNuZF9zZXFfcmVtb3ZlX2V2ZW50c19zZXRfcXVldWUoc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKmluZm8sIGludCBxdWV1ZSk7Cit2b2lkIHNuZF9zZXFfcmVtb3ZlX2V2ZW50c19zZXRfdGltZShzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCAqaW5mbywgY29uc3Qgc25kX3NlcV90aW1lc3RhbXBfdCAqdGltZSk7Cit2b2lkIHNuZF9zZXFfcmVtb3ZlX2V2ZW50c19zZXRfZGVzdChzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCAqaW5mbywgY29uc3Qgc25kX3NlcV9hZGRyX3QgKmFkZHIpOwordm9pZCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfc2V0X2NoYW5uZWwoc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKmluZm8sIGludCBjaGFubmVsKTsKK3ZvaWQgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3NldF9ldmVudF90eXBlKHNuZF9zZXFfcmVtb3ZlX2V2ZW50c190ICppbmZvLCBpbnQgdHlwZSk7Cit2b2lkIHNuZF9zZXFfcmVtb3ZlX2V2ZW50c19zZXRfdGFnKHNuZF9zZXFfcmVtb3ZlX2V2ZW50c190ICppbmZvLCBpbnQgdGFnKTsKKworaW50IHNuZF9zZXFfcmVtb3ZlX2V2ZW50cyhzbmRfc2VxX3QgKmhhbmRsZSwgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKmluZm8pOworCisvKiogXH0gKi8KKworLyoqCisgKiAgXGRlZmdyb3VwIFNlcU1pc2MgU2VxdWVuY2VyIE1pc2NlbGxhbmVvdXMKKyAqICBTZXF1ZW5jZXIgTWlzY2VsbGFuZW91cworICogIFxpbmdyb3VwIFNlcXVlbmNlcgorICogIFx7CisgKi8KKwordm9pZCBzbmRfc2VxX3NldF9iaXQoaW50IG5yLCB2b2lkICphcnJheSk7Cit2b2lkIHNuZF9zZXFfdW5zZXRfYml0KGludCBuciwgdm9pZCAqYXJyYXkpOworaW50IHNuZF9zZXFfY2hhbmdlX2JpdChpbnQgbnIsIHZvaWQgKmFycmF5KTsKK2ludCBzbmRfc2VxX2dldF9iaXQoaW50IG5yLCB2b2lkICphcnJheSk7CisKKy8qKiBcfSAqLworCisKKy8qKgorICogIFxkZWZncm91cCBTZXFFdlR5cGUgU2VxdWVuY2VyIEV2ZW50IFR5cGUgQ2hlY2tzCisgKiAgU2VxdWVuY2VyIEV2ZW50IFR5cGUgQ2hlY2tzCisgKiAgXGluZ3JvdXAgU2VxdWVuY2VyCisgKiAgXHsKKyAqLworCisvKiBldmVudCB0eXBlIG1hY3JvcyAqLworZW51bSB7CisJU05EX1NFUV9FVkZMR19SRVNVTFQsCisJU05EX1NFUV9FVkZMR19OT1RFLAorCVNORF9TRVFfRVZGTEdfQ09OVFJPTCwKKwlTTkRfU0VRX0VWRkxHX1FVRVVFLAorCVNORF9TRVFfRVZGTEdfU1lTVEVNLAorCVNORF9TRVFfRVZGTEdfTUVTU0FHRSwKKwlTTkRfU0VRX0VWRkxHX0NPTk5FQ1RJT04sCisJU05EX1NFUV9FVkZMR19TQU1QTEUsCisJU05EX1NFUV9FVkZMR19VU0VSUywKKwlTTkRfU0VRX0VWRkxHX0lOU1RSLAorCVNORF9TRVFfRVZGTEdfUVVPVEUsCisJU05EX1NFUV9FVkZMR19OT05FLAorCVNORF9TRVFfRVZGTEdfUkFXLAorCVNORF9TRVFfRVZGTEdfRklYRUQsCisJU05EX1NFUV9FVkZMR19WQVJJQUJMRSwKKwlTTkRfU0VRX0VWRkxHX1ZBUlVTUgorfTsKKworZW51bSB7CisJU05EX1NFUV9FVkZMR19OT1RFX09ORUFSRywKKwlTTkRfU0VRX0VWRkxHX05PVEVfVFdPQVJHCit9OworCitlbnVtIHsKKwlTTkRfU0VRX0VWRkxHX1FVRVVFX05PQVJHLAorCVNORF9TRVFfRVZGTEdfUVVFVUVfVElDSywKKwlTTkRfU0VRX0VWRkxHX1FVRVVFX1RJTUUsCisJU05EX1NFUV9FVkZMR19RVUVVRV9WQUxVRQorfTsKKworLyoqCisgKiBFeHBvcnRlZCBldmVudCB0eXBlIHRhYmxlCisgKgorICogVGhpcyB0YWJsZSBpcyByZWZlcnJlZCBieSBzbmRfc2VxX2V2X2lzX3h4eC4KKyAqLworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBzbmRfc2VxX2V2ZW50X3R5cGVzW107CisKKyNkZWZpbmUgX1NORF9TRVFfVFlQRSh4KQkoMTw8KHgpKQkvKio8IG1hc3RlciB0eXBlIC0gMjRiaXQgKi8KKyNkZWZpbmUgX1NORF9TRVFfVFlQRV9PUFQoeCkJKCh4KTw8MjQpCS8qKjwgb3B0aW9uYWwgdHlwZSAtIDhiaXQgKi8KKworLyoqIGNoZWNrIHRoZSBldmVudCB0eXBlICovCisjZGVmaW5lIHNuZF9zZXFfdHlwZV9jaGVjayhldix4KSAoc25kX3NlcV9ldmVudF90eXBlc1soZXYpLT50eXBlXSAmIF9TTkRfU0VRX1RZUEUoeCkpCisKKy8qKiBldmVudCB0eXBlIGNoZWNrOiByZXN1bHQgZXZlbnRzICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfcmVzdWx0X3R5cGUoZXYpIFwKKwlzbmRfc2VxX3R5cGVfY2hlY2soZXYsIFNORF9TRVFfRVZGTEdfUkVTVUxUKQorLyoqIGV2ZW50IHR5cGUgY2hlY2s6IG5vdGUgZXZlbnRzICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfbm90ZV90eXBlKGV2KSBcCisJc25kX3NlcV90eXBlX2NoZWNrKGV2LCBTTkRfU0VRX0VWRkxHX05PVEUpCisvKiogZXZlbnQgdHlwZSBjaGVjazogY29udHJvbCBldmVudHMgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc19jb250cm9sX3R5cGUoZXYpIFwKKwlzbmRfc2VxX3R5cGVfY2hlY2soZXYsIFNORF9TRVFfRVZGTEdfQ09OVFJPTCkKKy8qKiBldmVudCB0eXBlIGNoZWNrOiBjaGFubmVsIHNwZWNpZmljIGV2ZW50cyAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX2NoYW5uZWxfdHlwZShldikgXAorCShzbmRfc2VxX2V2ZW50X3R5cGVzWyhldiktPnR5cGVdICYgKF9TTkRfU0VRX1RZUEUoU05EX1NFUV9FVkZMR19OT1RFKSB8IF9TTkRfU0VRX1RZUEUoU05EX1NFUV9FVkZMR19DT05UUk9MKSkpCisKKy8qKiBldmVudCB0eXBlIGNoZWNrOiBxdWV1ZSBjb250cm9sIGV2ZW50cyAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX3F1ZXVlX3R5cGUoZXYpIFwKKwlzbmRfc2VxX3R5cGVfY2hlY2soZXYsIFNORF9TRVFfRVZGTEdfUVVFVUUpCisvKiogZXZlbnQgdHlwZSBjaGVjazogc3lzdGVtIHN0YXR1cyBtZXNzYWdlcyAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX21lc3NhZ2VfdHlwZShldikgXAorCXNuZF9zZXFfdHlwZV9jaGVjayhldiwgU05EX1NFUV9FVkZMR19NRVNTQUdFKQorLyoqIGV2ZW50IHR5cGUgY2hlY2s6IHN5c3RlbSBzdGF0dXMgbWVzc2FnZXMgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc19zdWJzY3JpYmVfdHlwZShldikgXAorCXNuZF9zZXFfdHlwZV9jaGVjayhldiwgU05EX1NFUV9FVkZMR19DT05ORUNUSU9OKQorLyoqIGV2ZW50IHR5cGUgY2hlY2s6IHNhbXBsZSBtZXNzYWdlcyAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX3NhbXBsZV90eXBlKGV2KSBcCisJc25kX3NlcV90eXBlX2NoZWNrKGV2LCBTTkRfU0VRX0VWRkxHX1NBTVBMRSkKKy8qKiBldmVudCB0eXBlIGNoZWNrOiB1c2VyLWRlZmluZWQgbWVzc2FnZXMgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc191c2VyX3R5cGUoZXYpIFwKKwlzbmRfc2VxX3R5cGVfY2hlY2soZXYsIFNORF9TRVFfRVZGTEdfVVNFUlMpCisvKiogZXZlbnQgdHlwZSBjaGVjazogaW5zdHJ1bWVudCBsYXllciBldmVudHMgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc19pbnN0cl90eXBlKGV2KSBcCisJc25kX3NlcV90eXBlX2NoZWNrKGV2LCBTTkRfU0VRX0VWRkxHX0lOU1RSKQorLyoqIGV2ZW50IHR5cGUgY2hlY2s6IGZpeGVkIGxlbmd0aCBldmVudHMgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc19maXhlZF90eXBlKGV2KSBcCisJc25kX3NlcV90eXBlX2NoZWNrKGV2LCBTTkRfU0VRX0VWRkxHX0ZJWEVEKQorLyoqIGV2ZW50IHR5cGUgY2hlY2s6IHZhcmlhYmxlIGxlbmd0aCBldmVudHMgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc192YXJpYWJsZV90eXBlKGV2KQlcCisJc25kX3NlcV90eXBlX2NoZWNrKGV2LCBTTkRfU0VRX0VWRkxHX1ZBUklBQkxFKQorLyoqIGV2ZW50IHR5cGUgY2hlY2s6IHVzZXIgcG9pbnRlciBldmVudHMgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc192YXJ1c3JfdHlwZShldikgXAorCXNuZF9zZXFfdHlwZV9jaGVjayhldiwgU05EX1NFUV9FVkZMR19WQVJVU1IpCisvKiogZXZlbnQgdHlwZSBjaGVjazogcmVzZXJ2ZWQgZm9yIGtlcm5lbCAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX3Jlc2VydmVkKGV2KSBcCisJKCEgc25kX3NlcV9ldmVudF90eXBlc1soZXYpLT50eXBlXSkKKworLyoqCisgKiBtYWNyb3MgdG8gY2hlY2sgZXZlbnQgZmxhZ3MKKyAqLworLyoqIHByaW9yIGV2ZW50cyAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX3ByaW9yKGV2KQlcCisJKCgoZXYpLT5mbGFncyAmIFNORF9TRVFfUFJJT1JJVFlfTUFTSykgPT0gU05EX1NFUV9QUklPUklUWV9ISUdIKQorCisvKiogZ2V0IHRoZSBkYXRhIGxlbmd0aCB0eXBlICovCisjZGVmaW5lIHNuZF9zZXFfZXZfbGVuZ3RoX3R5cGUoZXYpIFwKKwkoKGV2KS0+ZmxhZ3MgJiBTTkRfU0VRX0VWRU5UX0xFTkdUSF9NQVNLKQorLyoqIGZpeGVkIGxlbmd0aCBldmVudHMgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc19maXhlZChldikJXAorCShzbmRfc2VxX2V2X2xlbmd0aF90eXBlKGV2KSA9PSBTTkRfU0VRX0VWRU5UX0xFTkdUSF9GSVhFRCkKKy8qKiB2YXJpYWJsZSBsZW5ndGggZXZlbnRzICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfdmFyaWFibGUoZXYpIFwKKwkoc25kX3NlcV9ldl9sZW5ndGhfdHlwZShldikgPT0gU05EX1NFUV9FVkVOVF9MRU5HVEhfVkFSSUFCTEUpCisvKiogdmFyaWFibGUgbGVuZ3RoIG9uIHVzZXItc3BhY2UgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc192YXJ1c3IoZXYpIFwKKwkoc25kX3NlcV9ldl9sZW5ndGhfdHlwZShldikgPT0gU05EX1NFUV9FVkVOVF9MRU5HVEhfVkFSVVNSKQorCisvKiogdGltZS1zdGFtcCB0eXBlICovCisjZGVmaW5lIHNuZF9zZXFfZXZfdGltZXN0YW1wX3R5cGUoZXYpIFwKKwkoKGV2KS0+ZmxhZ3MgJiBTTkRfU0VRX1RJTUVfU1RBTVBfTUFTSykKKy8qKiBldmVudCBpcyBpbiB0aWNrIHRpbWUgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc190aWNrKGV2KSBcCisJKHNuZF9zZXFfZXZfdGltZXN0YW1wX3R5cGUoZXYpID09IFNORF9TRVFfVElNRV9TVEFNUF9USUNLKQorLyoqIGV2ZW50IGlzIGluIHJlYWwtdGltZSAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX3JlYWwoZXYpIFwKKwkoc25kX3NlcV9ldl90aW1lc3RhbXBfdHlwZShldikgPT0gU05EX1NFUV9USU1FX1NUQU1QX1JFQUwpCisKKy8qKiB0aW1lLW1vZGUgdHlwZSAqLworI2RlZmluZSBzbmRfc2VxX2V2X3RpbWVtb2RlX3R5cGUoZXYpIFwKKwkoKGV2KS0+ZmxhZ3MgJiBTTkRfU0VRX1RJTUVfTU9ERV9NQVNLKQorLyoqIHNjaGVkdWxlZCBpbiBhYnNvbHV0ZSB0aW1lICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfYWJzdGltZShldikgXAorCShzbmRfc2VxX2V2X3RpbWVtb2RlX3R5cGUoZXYpID09IFNORF9TRVFfVElNRV9NT0RFX0FCUykKKy8qKiBzY2hlZHVsZWQgaW4gcmVsYXRpdmUgdGltZSAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX3JlbHRpbWUoZXYpIFwKKwkoc25kX3NlcV9ldl90aW1lbW9kZV90eXBlKGV2KSA9PSBTTkRfU0VRX1RJTUVfTU9ERV9SRUwpCisKKy8qKiBkaXJlY3QgZGlzcGF0Y2hlZCBldmVudHMgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc19kaXJlY3QoZXYpIFwKKwkoKGV2KS0+cXVldWUgPT0gU05EX1NFUV9RVUVVRV9ESVJFQ1QpCisKKy8qKiBcfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19BTFNBX1NFUV9IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zZXFfZXZlbnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zZXFfZXZlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODNmMWQwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NlcV9ldmVudC5oCkBAIC0wLDAgKzEsMzE5IEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvc2VxX2V2ZW50LmgKKyAqIFxicmllZiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKiBcYXV0aG9yIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKiBcYXV0aG9yIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMTk5OC0yMDAxCisgKgorICogQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICovCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX1NFUV9FVkVOVF9ICisjZGVmaW5lIF9fQUxTQV9TRVFfRVZFTlRfSAorCisvKioKKyAqICBcZGVmZ3JvdXAgU2VxRXZlbnRzIFNlcXVlbmNlciBFdmVudCBEZWZpbml0aW9ucworICogIFNlcXVlbmNlciBFdmVudCBEZWZpbml0aW9ucworICogIFxpbmdyb3VwIFNlcXVlbmNlcgorICogIFx7CisgKi8KKworLyoqCisgKiBTZXF1ZW5jZXIgZXZlbnQgZGF0YSB0eXBlCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBzbmRfc2VxX2V2ZW50X3R5cGVfdDsKKworLyoqIFNlcXVlbmNlciBldmVudCB0eXBlICovCitlbnVtIHNuZF9zZXFfZXZlbnRfdHlwZSB7CisJLyoqIHN5c3RlbSBzdGF0dXM7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX3Jlc3VsdF90ICovCisJU05EX1NFUV9FVkVOVF9TWVNURU0gPSAwLAorCS8qKiByZXR1cm5lZCByZXN1bHQgc3RhdHVzOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9yZXN1bHRfdCAqLworCVNORF9TRVFfRVZFTlRfUkVTVUxULAorCisJLyoqIG5vdGUgb24gYW5kIG9mZiB3aXRoIGR1cmF0aW9uOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9ub3RlX3QgKi8KKwlTTkRfU0VRX0VWRU5UX05PVEUgPSA1LAorCS8qKiBub3RlIG9uOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9ub3RlX3QgKi8KKwlTTkRfU0VRX0VWRU5UX05PVEVPTiwKKwkvKiogbm90ZSBvZmY7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X25vdGVfdCAqLworCVNORF9TRVFfRVZFTlRfTk9URU9GRiwKKwkvKioga2V5IHByZXNzdXJlIGNoYW5nZSAoYWZ0ZXJ0b3VjaCk7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X25vdGVfdCAqLworCVNORF9TRVFfRVZFTlRfS0VZUFJFU1MsCisJCisJLyoqIGNvbnRyb2xsZXI7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2N0cmxfdCAqLworCVNORF9TRVFfRVZFTlRfQ09OVFJPTExFUiA9IDEwLAorCS8qKiBwcm9ncmFtIGNoYW5nZTsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfY3RybF90ICovCisJU05EX1NFUV9FVkVOVF9QR01DSEFOR0UsCisJLyoqIGNoYW5uZWwgcHJlc3N1cmU7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2N0cmxfdCAqLworCVNORF9TRVFfRVZFTlRfQ0hBTlBSRVNTLAorCS8qKiBwaXRjaHdoZWVsOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9jdHJsX3Q7IGRhdGEgaXMgZnJvbSAtODE5MiB0byA4MTkxKSAqLworCVNORF9TRVFfRVZFTlRfUElUQ0hCRU5ELAorCS8qKiAxNCBiaXQgY29udHJvbGxlciB2YWx1ZTsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfY3RybF90ICovCisJU05EX1NFUV9FVkVOVF9DT05UUk9MMTQsCisJLyoqIDE0IGJpdCBOUlBOOyAgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfY3RybF90ICovCisJU05EX1NFUV9FVkVOVF9OT05SRUdQQVJBTSwKKwkvKiogMTQgYml0IFJQTjsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfY3RybF90ICovCisJU05EX1NFUV9FVkVOVF9SRUdQQVJBTSwKKworCS8qKiBTUFAgd2l0aCBMU0IgYW5kIE1TQiB2YWx1ZXM7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2N0cmxfdCAqLworCVNORF9TRVFfRVZFTlRfU09OR1BPUyA9IDIwLAorCS8qKiBTb25nIFNlbGVjdCB3aXRoIHNvbmcgSUQgbnVtYmVyOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9jdHJsX3QgKi8KKwlTTkRfU0VRX0VWRU5UX1NPTkdTRUwsCisJLyoqIG1pZGkgdGltZSBjb2RlIHF1YXJ0ZXIgZnJhbWU7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2N0cmxfdCAqLworCVNORF9TRVFfRVZFTlRfUUZSQU1FLAorCS8qKiBTTUYgVGltZSBTaWduYXR1cmUgZXZlbnQ7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2N0cmxfdCAqLworCVNORF9TRVFfRVZFTlRfVElNRVNJR04sCisJLyoqIFNNRiBLZXkgU2lnbmF0dXJlIGV2ZW50OyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9jdHJsX3QgKi8KKwlTTkRfU0VRX0VWRU5UX0tFWVNJR04sCisJICAgICAgICAKKwkvKiogTUlESSBSZWFsIFRpbWUgU3RhcnQgbWVzc2FnZTsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfcXVldWVfY29udHJvbF90ICovCisJU05EX1NFUV9FVkVOVF9TVEFSVCA9IDMwLAorCS8qKiBNSURJIFJlYWwgVGltZSBDb250aW51ZSBtZXNzYWdlOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9xdWV1ZV9jb250cm9sX3QgKi8KKwlTTkRfU0VRX0VWRU5UX0NPTlRJTlVFLAorCS8qKiBNSURJIFJlYWwgVGltZSBTdG9wIG1lc3NhZ2U7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X3F1ZXVlX2NvbnRyb2xfdCAqLworCVNORF9TRVFfRVZFTlRfU1RPUCwKKwkvKiogU2V0IHRpY2sgcXVldWUgcG9zaXRpb247IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X3F1ZXVlX2NvbnRyb2xfdCAqLworCVNORF9TRVFfRVZFTlRfU0VUUE9TX1RJQ0ssCisJLyoqIFNldCByZWFsLXRpbWUgcXVldWUgcG9zaXRpb247IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X3F1ZXVlX2NvbnRyb2xfdCAqLworCVNORF9TRVFfRVZFTlRfU0VUUE9TX1RJTUUsCisJLyoqIChTTUYpIFRlbXBvIGV2ZW50OyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9xdWV1ZV9jb250cm9sX3QgKi8KKwlTTkRfU0VRX0VWRU5UX1RFTVBPLAorCS8qKiBNSURJIFJlYWwgVGltZSBDbG9jayBtZXNzYWdlOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9xdWV1ZV9jb250cm9sX3QgKi8KKwlTTkRfU0VRX0VWRU5UX0NMT0NLLAorCS8qKiBNSURJIFJlYWwgVGltZSBUaWNrIG1lc3NhZ2U7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X3F1ZXVlX2NvbnRyb2xfdCAqLworCVNORF9TRVFfRVZFTlRfVElDSywKKwkvKiogUXVldWUgdGltZXIgc2tldzsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfcXVldWVfY29udHJvbF90ICovCisJU05EX1NFUV9FVkVOVF9RVUVVRV9TS0VXLAorCS8qKiBTeW5jIHBvc2l0aW9uIGNoYW5nZWQ7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X3F1ZXVlX2NvbnRyb2xfdCAqLworCVNORF9TRVFfRVZFTlRfU1lOQ19QT1MsCisKKwkvKiogVHVuZSByZXF1ZXN0OyBldmVudCBkYXRhIHR5cGUgPSBub25lICovCisJU05EX1NFUV9FVkVOVF9UVU5FX1JFUVVFU1QgPSA0MCwKKwkvKiogUmVzZXQgdG8gcG93ZXItb24gc3RhdGU7IGV2ZW50IGRhdGEgdHlwZSA9IG5vbmUgKi8KKwlTTkRfU0VRX0VWRU5UX1JFU0VULAorCS8qKiBBY3RpdmUgc2Vuc2luZyBldmVudDsgZXZlbnQgZGF0YSB0eXBlID0gbm9uZSAqLworCVNORF9TRVFfRVZFTlRfU0VOU0lORywKKworCS8qKiBFY2hvLWJhY2sgZXZlbnQ7IGV2ZW50IGRhdGEgdHlwZSA9IGFueSB0eXBlICovCisJU05EX1NFUV9FVkVOVF9FQ0hPID0gNTAsCisJLyoqIE9TUyBlbXVsYXRpb24gcmF3IGV2ZW50OyBldmVudCBkYXRhIHR5cGUgPSBhbnkgdHlwZSAqLworCVNORF9TRVFfRVZFTlRfT1NTLAorCisJLyoqIE5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZDsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfYWRkcl90ICovCisJU05EX1NFUV9FVkVOVF9DTElFTlRfU1RBUlQgPSA2MCwKKwkvKiogQ2xpZW50IGhhcyBsZWZ0IHRoZSBzeXN0ZW07IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2FkZHJfdCAqLworCVNORF9TRVFfRVZFTlRfQ0xJRU5UX0VYSVQsCisJLyoqIENsaWVudCBzdGF0dXMvaW5mbyBoYXMgY2hhbmdlZDsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfYWRkcl90ICovCisJU05EX1NFUV9FVkVOVF9DTElFTlRfQ0hBTkdFLAorCS8qKiBOZXcgcG9ydCB3YXMgY3JlYXRlZDsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfYWRkcl90ICovCisJU05EX1NFUV9FVkVOVF9QT1JUX1NUQVJULAorCS8qKiBQb3J0IHdhcyBkZWxldGVkIGZyb20gc3lzdGVtOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9hZGRyX3QgKi8KKwlTTkRfU0VRX0VWRU5UX1BPUlRfRVhJVCwKKwkvKiogUG9ydCBzdGF0dXMvaW5mbyBoYXMgY2hhbmdlZDsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfYWRkcl90ICovCisJU05EX1NFUV9FVkVOVF9QT1JUX0NIQU5HRSwKKworCS8qKiBQb3J0cyBjb25uZWN0ZWQ7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2Nvbm5lY3RfdCAqLworCVNORF9TRVFfRVZFTlRfUE9SVF9TVUJTQ1JJQkVELAorCS8qKiBQb3J0cyBkaXNjb25uZWN0ZWQ7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2Nvbm5lY3RfdCAqLworCVNORF9TRVFfRVZFTlRfUE9SVF9VTlNVQlNDUklCRUQsCisKKwkvKiogdXNlci1kZWZpbmVkIGV2ZW50OyBldmVudCBkYXRhIHR5cGUgPSBhbnkgKGZpeGVkIHNpemUpICovCisJU05EX1NFUV9FVkVOVF9VU1IwID0gOTAsCisJLyoqIHVzZXItZGVmaW5lZCBldmVudDsgZXZlbnQgZGF0YSB0eXBlID0gYW55IChmaXhlZCBzaXplKSAqLworCVNORF9TRVFfRVZFTlRfVVNSMSwKKwkvKiogdXNlci1kZWZpbmVkIGV2ZW50OyBldmVudCBkYXRhIHR5cGUgPSBhbnkgKGZpeGVkIHNpemUpICovCisJU05EX1NFUV9FVkVOVF9VU1IyLAorCS8qKiB1c2VyLWRlZmluZWQgZXZlbnQ7IGV2ZW50IGRhdGEgdHlwZSA9IGFueSAoZml4ZWQgc2l6ZSkgKi8KKwlTTkRfU0VRX0VWRU5UX1VTUjMsCisJLyoqIHVzZXItZGVmaW5lZCBldmVudDsgZXZlbnQgZGF0YSB0eXBlID0gYW55IChmaXhlZCBzaXplKSAqLworCVNORF9TRVFfRVZFTlRfVVNSNCwKKwkvKiogdXNlci1kZWZpbmVkIGV2ZW50OyBldmVudCBkYXRhIHR5cGUgPSBhbnkgKGZpeGVkIHNpemUpICovCisJU05EX1NFUV9FVkVOVF9VU1I1LAorCS8qKiB1c2VyLWRlZmluZWQgZXZlbnQ7IGV2ZW50IGRhdGEgdHlwZSA9IGFueSAoZml4ZWQgc2l6ZSkgKi8KKwlTTkRfU0VRX0VWRU5UX1VTUjYsCisJLyoqIHVzZXItZGVmaW5lZCBldmVudDsgZXZlbnQgZGF0YSB0eXBlID0gYW55IChmaXhlZCBzaXplKSAqLworCVNORF9TRVFfRVZFTlRfVVNSNywKKwkvKiogdXNlci1kZWZpbmVkIGV2ZW50OyBldmVudCBkYXRhIHR5cGUgPSBhbnkgKGZpeGVkIHNpemUpICovCisJU05EX1NFUV9FVkVOVF9VU1I4LAorCS8qKiB1c2VyLWRlZmluZWQgZXZlbnQ7IGV2ZW50IGRhdGEgdHlwZSA9IGFueSAoZml4ZWQgc2l6ZSkgKi8KKwlTTkRfU0VRX0VWRU5UX1VTUjksCisKKwkvKiogc3lzdGVtIGV4Y2x1c2l2ZSBkYXRhICh2YXJpYWJsZSBsZW5ndGgpOyAgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfZXh0X3QgKi8KKwlTTkRfU0VRX0VWRU5UX1NZU0VYID0gMTMwLAorCS8qKiBlcnJvciBldmVudDsgIGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2V4dF90ICovCisJU05EX1NFUV9FVkVOVF9CT1VOQ0UsCisJLyoqIHJlc2VydmVkIGZvciB1c2VyIGFwcHM7ICBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9leHRfdCAqLworCVNORF9TRVFfRVZFTlRfVVNSX1ZBUjAgPSAxMzUsCisJLyoqIHJlc2VydmVkIGZvciB1c2VyIGFwcHM7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2V4dF90ICovCisJU05EX1NFUV9FVkVOVF9VU1JfVkFSMSwKKwkvKiogcmVzZXJ2ZWQgZm9yIHVzZXIgYXBwczsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfZXh0X3QgKi8KKwlTTkRfU0VRX0VWRU5UX1VTUl9WQVIyLAorCS8qKiByZXNlcnZlZCBmb3IgdXNlciBhcHBzOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9leHRfdCAqLworCVNORF9TRVFfRVZFTlRfVVNSX1ZBUjMsCisJLyoqIHJlc2VydmVkIGZvciB1c2VyIGFwcHM7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2V4dF90ICovCisJU05EX1NFUV9FVkVOVF9VU1JfVkFSNCwKKworCS8qKiBOT1A7IGlnbm9yZWQgaW4gYW55IGNhc2UgKi8KKwlTTkRfU0VRX0VWRU5UX05PTkUgPSAyNTUKK307CisKKworLyoqIFNlcXVlbmNlciBldmVudCBhZGRyZXNzICovCit0eXBlZGVmIHN0cnVjdCBzbmRfc2VxX2FkZHIgeworCXVuc2lnbmVkIGNoYXIgY2xpZW50OwkvKio8IENsaWVudCBpZCAqLworCXVuc2lnbmVkIGNoYXIgcG9ydDsJLyoqPCBQb3J0IGlkICovCit9IHNuZF9zZXFfYWRkcl90OworCisvKiogQ29ubmVjdGlvbiAoc3Vic2NyaXB0aW9uKSBiZXR3ZWVuIHBvcnRzICovCit0eXBlZGVmIHN0cnVjdCBzbmRfc2VxX2Nvbm5lY3QgeworCXNuZF9zZXFfYWRkcl90IHNlbmRlcjsJLyoqPCBzZW5kZXIgYWRkcmVzcyAqLworCXNuZF9zZXFfYWRkcl90IGRlc3Q7CS8qKjwgZGVzdGluYXRpb24gYWRkcmVzcyAqLworfSBzbmRfc2VxX2Nvbm5lY3RfdDsKKworCisvKiogUmVhbC10aW1lIGRhdGEgcmVjb3JkICovCit0eXBlZGVmIHN0cnVjdCBzbmRfc2VxX3JlYWxfdGltZSB7CisJdW5zaWduZWQgaW50IHR2X3NlYzsJCS8qKjwgc2Vjb25kcyAqLworCXVuc2lnbmVkIGludCB0dl9uc2VjOwkJLyoqPCBuYW5vc2Vjb25kcyAqLworfSBzbmRfc2VxX3JlYWxfdGltZV90OworCisvKiogKE1JREkpIFRpY2stdGltZSBkYXRhIHJlY29yZCAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgc25kX3NlcV90aWNrX3RpbWVfdDsKKworLyoqIHVuaW9uZWQgdGltZSBzdGFtcCAqLwordHlwZWRlZiB1bmlvbiBzbmRfc2VxX3RpbWVzdGFtcCB7CisJc25kX3NlcV90aWNrX3RpbWVfdCB0aWNrOwkvKio8IHRpY2stdGltZSAqLworCXN0cnVjdCBzbmRfc2VxX3JlYWxfdGltZSB0aW1lOwkvKio8IHJlYWwtdGltZSAqLworfSBzbmRfc2VxX3RpbWVzdGFtcF90OworCisKKy8qKgorICogRXZlbnQgbW9kZSBmbGFncworICoKKyAqIE5PVEU6IG9ubHkgOCBiaXRzIGF2YWlsYWJsZSEKKyAqLworI2RlZmluZSBTTkRfU0VRX1RJTUVfU1RBTVBfVElDSwkJKDA8PDApCS8qKjwgdGltZXN0YW1wIGluIGNsb2NrIHRpY2tzICovCisjZGVmaW5lIFNORF9TRVFfVElNRV9TVEFNUF9SRUFMCQkoMTw8MCkJLyoqPCB0aW1lc3RhbXAgaW4gcmVhbCB0aW1lICovCisjZGVmaW5lIFNORF9TRVFfVElNRV9TVEFNUF9NQVNLCQkoMTw8MCkJLyoqPCBtYXNrIGZvciB0aW1lc3RhbXAgYml0cyAqLworCisjZGVmaW5lIFNORF9TRVFfVElNRV9NT0RFX0FCUwkJKDA8PDEpCS8qKjwgYWJzb2x1dGUgdGltZXN0YW1wICovCisjZGVmaW5lIFNORF9TRVFfVElNRV9NT0RFX1JFTAkJKDE8PDEpCS8qKjwgcmVsYXRpdmUgdG8gY3VycmVudCB0aW1lICovCisjZGVmaW5lIFNORF9TRVFfVElNRV9NT0RFX01BU0sJCSgxPDwxKQkvKio8IG1hc2sgZm9yIHRpbWUgbW9kZSBiaXRzICovCisKKyNkZWZpbmUgU05EX1NFUV9FVkVOVF9MRU5HVEhfRklYRUQJKDA8PDIpCS8qKjwgZml4ZWQgZXZlbnQgc2l6ZSAqLworI2RlZmluZSBTTkRfU0VRX0VWRU5UX0xFTkdUSF9WQVJJQUJMRQkoMTw8MikJLyoqPCB2YXJpYWJsZSBldmVudCBzaXplICovCisjZGVmaW5lIFNORF9TRVFfRVZFTlRfTEVOR1RIX1ZBUlVTUgkoMjw8MikJLyoqPCB2YXJpYWJsZSBldmVudCBzaXplIC0gdXNlciBtZW1vcnkgc3BhY2UgKi8KKyNkZWZpbmUgU05EX1NFUV9FVkVOVF9MRU5HVEhfTUFTSwkoMzw8MikJLyoqPCBtYXNrIGZvciBldmVudCBsZW5ndGggYml0cyAqLworCisjZGVmaW5lIFNORF9TRVFfUFJJT1JJVFlfTk9STUFMCQkoMDw8NCkJLyoqPCBub3JtYWwgcHJpb3JpdHkgKi8KKyNkZWZpbmUgU05EX1NFUV9QUklPUklUWV9ISUdICQkoMTw8NCkJLyoqPCBldmVudCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJlZm9yZSBvdGhlcnMgKi8KKyNkZWZpbmUgU05EX1NFUV9QUklPUklUWV9NQVNLCQkoMTw8NCkJLyoqPCBtYXNrIGZvciBwcmlvcml0eSBiaXRzICovCisKKworLyoqIE5vdGUgZXZlbnQgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9zZXFfZXZfbm90ZSB7CisJdW5zaWduZWQgY2hhciBjaGFubmVsOwkJLyoqPCBjaGFubmVsIG51bWJlciAqLworCXVuc2lnbmVkIGNoYXIgbm90ZTsJCS8qKjwgbm90ZSAqLworCXVuc2lnbmVkIGNoYXIgdmVsb2NpdHk7CQkvKio8IHZlbG9jaXR5ICovCisJdW5zaWduZWQgY2hhciBvZmZfdmVsb2NpdHk7CS8qKjwgbm90ZS1vZmYgdmVsb2NpdHk7IG9ubHkgZm9yICNTTkRfU0VRX0VWRU5UX05PVEUgKi8KKwl1bnNpZ25lZCBpbnQgZHVyYXRpb247CQkvKio8IGR1cmF0aW9uIHVudGlsIG5vdGUtb2ZmOyBvbmx5IGZvciAjU05EX1NFUV9FVkVOVF9OT1RFICovCit9IHNuZF9zZXFfZXZfbm90ZV90OworCisvKiogQ29udHJvbGxlciBldmVudCAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9ldl9jdHJsIHsKKwl1bnNpZ25lZCBjaGFyIGNoYW5uZWw7CQkvKio8IGNoYW5uZWwgbnVtYmVyICovCisJdW5zaWduZWQgY2hhciB1bnVzZWRbM107CS8qKjwgcmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBpbnQgcGFyYW07CQkvKio8IGNvbnRyb2wgcGFyYW1ldGVyICovCisJc2lnbmVkIGludCB2YWx1ZTsJCS8qKjwgY29udHJvbCB2YWx1ZSAqLworfSBzbmRfc2VxX2V2X2N0cmxfdDsKKworLyoqIGdlbmVyaWMgc2V0IG9mIGJ5dGVzICgxMng4IGJpdCkgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9zZXFfZXZfcmF3OCB7CisJdW5zaWduZWQgY2hhciBkWzEyXTsJCS8qKjwgOCBiaXQgdmFsdWUgKi8KK30gc25kX3NlcV9ldl9yYXc4X3Q7CisKKy8qKiBnZW5lcmljIHNldCBvZiBpbnRlZ2VycyAoM3gzMiBiaXQpICovCit0eXBlZGVmIHN0cnVjdCBzbmRfc2VxX2V2X3JhdzMyIHsKKwl1bnNpZ25lZCBpbnQgZFszXTsJCS8qKjwgMzIgYml0IHZhbHVlICovCit9IHNuZF9zZXFfZXZfcmF3MzJfdDsKKworLyoqIGV4dGVybmFsIHN0b3JlZCBkYXRhICovCit0eXBlZGVmIHN0cnVjdCBzbmRfc2VxX2V2X2V4dCB7CisJdW5zaWduZWQgaW50IGxlbjsJCS8qKjwgbGVuZ3RoIG9mIGRhdGEgKi8KKwl2b2lkICpwdHI7CQkJLyoqPCBwb2ludGVyIHRvIGRhdGEgKG5vdGU6IGNhbiBiZSA2NC1iaXQpICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNuZF9zZXFfZXZfZXh0X3Q7CisKKy8qKiBSZXN1bHQgZXZlbnRzICovCit0eXBlZGVmIHN0cnVjdCBzbmRfc2VxX3Jlc3VsdCB7CisJaW50IGV2ZW50OwkJLyoqPCBwcm9jZXNzZWQgZXZlbnQgdHlwZSAqLworCWludCByZXN1bHQ7CQkvKio8IHN0YXR1cyAqLworfSBzbmRfc2VxX3Jlc3VsdF90OworCisvKiogUXVldWUgc2tldyB2YWx1ZXMgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9zZXFfcXVldWVfc2tldyB7CisJdW5zaWduZWQgaW50IHZhbHVlOwkvKio8IHNrZXcgdmFsdWUgKi8KKwl1bnNpZ25lZCBpbnQgYmFzZTsJLyoqPCBza2V3IGJhc2UgKi8KK30gc25kX3NlcV9xdWV1ZV9za2V3X3Q7CisKKy8qKiBxdWV1ZSB0aW1lciBjb250cm9sICovCit0eXBlZGVmIHN0cnVjdCBzbmRfc2VxX2V2X3F1ZXVlX2NvbnRyb2wgeworCXVuc2lnbmVkIGNoYXIgcXVldWU7CQkJLyoqPCBhZmZlY3RlZCBxdWV1ZSAqLworCXVuc2lnbmVkIGNoYXIgdW51c2VkWzNdOwkJLyoqPCByZXNlcnZlZCAqLworCXVuaW9uIHsKKwkJc2lnbmVkIGludCB2YWx1ZTsJCS8qKjwgYWZmZWN0ZWQgdmFsdWUgKGUuZy4gdGVtcG8pICovCisJCXNuZF9zZXFfdGltZXN0YW1wX3QgdGltZTsJLyoqPCB0aW1lICovCisJCXVuc2lnbmVkIGludCBwb3NpdGlvbjsJCS8qKjwgc3luYyBwb3NpdGlvbiAqLworCQlzbmRfc2VxX3F1ZXVlX3NrZXdfdCBza2V3OwkvKio8IHF1ZXVlIHNrZXcgKi8KKwkJdW5zaWduZWQgaW50IGQzMlsyXTsJCS8qKjwgYW55IGRhdGEgKi8KKwkJdW5zaWduZWQgY2hhciBkOFs4XTsJCS8qKjwgYW55IGRhdGEgKi8KKwl9IHBhcmFtOwkJCQkvKio8IGRhdGEgdmFsdWUgdW5pb24gKi8KK30gc25kX3NlcV9ldl9xdWV1ZV9jb250cm9sX3Q7CisKKworLyoqIFNlcXVlbmNlciBldmVudCAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9ldmVudCB7CisJc25kX3NlcV9ldmVudF90eXBlX3QgdHlwZTsJLyoqPCBldmVudCB0eXBlICovCisJdW5zaWduZWQgY2hhciBmbGFnczsJCS8qKjwgZXZlbnQgZmxhZ3MgKi8KKwl1bnNpZ25lZCBjaGFyIHRhZzsJCS8qKjwgdGFnICovCisJCisJdW5zaWduZWQgY2hhciBxdWV1ZTsJCS8qKjwgc2NoZWR1bGUgcXVldWUgKi8KKwlzbmRfc2VxX3RpbWVzdGFtcF90IHRpbWU7CS8qKjwgc2NoZWR1bGUgdGltZSAqLworCisJc25kX3NlcV9hZGRyX3Qgc291cmNlOwkJLyoqPCBzb3VyY2UgYWRkcmVzcyAqLworCXNuZF9zZXFfYWRkcl90IGRlc3Q7CQkvKio8IGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKworCXVuaW9uIHsKKwkJc25kX3NlcV9ldl9ub3RlX3Qgbm90ZTsJCS8qKjwgbm90ZSBpbmZvcm1hdGlvbiAqLworCQlzbmRfc2VxX2V2X2N0cmxfdCBjb250cm9sOwkvKio8IE1JREkgY29udHJvbCBpbmZvcm1hdGlvbiAqLworCQlzbmRfc2VxX2V2X3JhdzhfdCByYXc4OwkJLyoqPCByYXc4IGRhdGEgKi8KKwkJc25kX3NlcV9ldl9yYXczMl90IHJhdzMyOwkvKio8IHJhdzMyIGRhdGEgKi8KKwkJc25kX3NlcV9ldl9leHRfdCBleHQ7CQkvKio8IGV4dGVybmFsIGRhdGEgKi8KKwkJc25kX3NlcV9ldl9xdWV1ZV9jb250cm9sX3QgcXVldWU7IC8qKjwgcXVldWUgY29udHJvbCAqLworCQlzbmRfc2VxX3RpbWVzdGFtcF90IHRpbWU7CS8qKjwgdGltZXN0YW1wICovCisJCXNuZF9zZXFfYWRkcl90IGFkZHI7CQkvKio8IGFkZHJlc3MgKi8KKwkJc25kX3NlcV9jb25uZWN0X3QgY29ubmVjdDsJLyoqPCBjb25uZWN0IGluZm9ybWF0aW9uICovCisJCXNuZF9zZXFfcmVzdWx0X3QgcmVzdWx0OwkvKio8IG9wZXJhdGlvbiByZXN1bHQgY29kZSAqLworCX0gZGF0YTsJCQkJLyoqPCBldmVudCBkYXRhLi4uICovCit9IHNuZF9zZXFfZXZlbnRfdDsKKworCisvKiogXH0gKi8KKworI2VuZGlmIC8qIF9fQUxTQV9TRVFfRVZFTlRfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc2VxX21pZGlfZXZlbnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zZXFfbWlkaV9ldmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOGVlNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc2VxX21pZGlfZXZlbnQuaApAQCAtMCwwICsxLDY1IEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvc2VxX21pZGlfZXZlbnQuaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqCisgKiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKi8KKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfU0VRX01JRElfRVZFTlRfSAorI2RlZmluZSBfX0FMU0FfU0VRX01JRElfRVZFTlRfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBNSURJX0V2ZW50IFNlcXVlbmNlciBldmVudCA8LT4gTUlESSBieXRlIHN0cmVhbSBjb2RlcgorICogIFxpbmdyb3VwIFNlcXVlbmNlcgorICogIFNlcXVlbmNlciBldmVudCA8LT4gTUlESSBieXRlIHN0cmVhbSBjb2RlcgorICogIFx7CisgKi8KKworLyoqIGNvbnRhaW5lciBmb3Igc2VxdWVuY2VyIG1pZGkgZXZlbnQgcGFyc2VycyAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX21pZGlfZXZlbnQgc25kX21pZGlfZXZlbnRfdDsKKworaW50IHNuZF9taWRpX2V2ZW50X25ldyhzaXplX3QgYnVmc2l6ZSwgc25kX21pZGlfZXZlbnRfdCAqKnJkZXYpOworaW50IHNuZF9taWRpX2V2ZW50X3Jlc2l6ZV9idWZmZXIoc25kX21pZGlfZXZlbnRfdCAqZGV2LCBzaXplX3QgYnVmc2l6ZSk7Cit2b2lkIHNuZF9taWRpX2V2ZW50X2ZyZWUoc25kX21pZGlfZXZlbnRfdCAqZGV2KTsKK3ZvaWQgc25kX21pZGlfZXZlbnRfaW5pdChzbmRfbWlkaV9ldmVudF90ICpkZXYpOwordm9pZCBzbmRfbWlkaV9ldmVudF9yZXNldF9lbmNvZGUoc25kX21pZGlfZXZlbnRfdCAqZGV2KTsKK3ZvaWQgc25kX21pZGlfZXZlbnRfcmVzZXRfZGVjb2RlKHNuZF9taWRpX2V2ZW50X3QgKmRldik7Cit2b2lkIHNuZF9taWRpX2V2ZW50X25vX3N0YXR1cyhzbmRfbWlkaV9ldmVudF90ICpkZXYsIGludCBvbik7CisvKiBlbmNvZGUgZnJvbSBieXRlIHN0cmVhbSAtIHJldHVybiBudW1iZXIgb2Ygd3JpdHRlbiBieXRlcyBpZiBzdWNjZXNzICovCitsb25nIHNuZF9taWRpX2V2ZW50X2VuY29kZShzbmRfbWlkaV9ldmVudF90ICpkZXYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgbG9uZyBjb3VudCwgc25kX3NlcV9ldmVudF90ICpldik7CitpbnQgc25kX21pZGlfZXZlbnRfZW5jb2RlX2J5dGUoc25kX21pZGlfZXZlbnRfdCAqZGV2LCBpbnQgYywgc25kX3NlcV9ldmVudF90ICpldik7CisvKiBkZWNvZGUgZnJvbSBldmVudCB0byBieXRlcyAtIHJldHVybiBudW1iZXIgb2Ygd3JpdHRlbiBieXRlcyBpZiBzdWNjZXNzICovCitsb25nIHNuZF9taWRpX2V2ZW50X2RlY29kZShzbmRfbWlkaV9ldmVudF90ICpkZXYsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgbG9uZyBjb3VudCwgY29uc3Qgc25kX3NlcV9ldmVudF90ICpldik7CisKKy8qKiBcfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19BTFNBX1NFUV9NSURJX0VWRU5UX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NlcW1pZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NlcW1pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MDY5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc2VxbWlkLmgKQEAgLTAsMCArMSw0OTAgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9zZXFtaWQuaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqCisgKiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKi8KKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfU0VRTUlEX0gKKyNkZWZpbmUgX19BTFNBX1NFUU1JRF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiAgXGRlZmdyb3VwIFNlcU1pZGRsZSBTZXF1ZW5jZXIgTWlkZGxlIExldmVsIEludGVyZmFjZQorICogIFNlcXVlbmNlciBNaWRkbGUgTGV2ZWwgSW50ZXJmYWNlCisgKiAgXGluZ3JvdXAgU2VxdWVuY2VyCisgKiAgXHsKKyAqLworCisvKioKKyAqIFxicmllZiBpbml0aWFsaXplIGV2ZW50IHJlY29yZAorICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZCBwb2ludGVyCisgKiAKKyAqIFRoaXMgbWFjcm8gY2xlYXJzIHRoZSBnaXZlbiBldmVudCByZWNvcmQgcG9pbnRlciB0byB0aGUgZGVmYXVsdCBzdGF0dXMuCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9jbGVhcihldikgXAorCW1lbXNldChldiwgMCwgc2l6ZW9mKHNuZF9zZXFfZXZlbnRfdCkpCisKKy8qKgorICogXGJyaWVmIHNldCB0aGUgdGFnIGZvciBnaXZlbiBldmVudAorICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICogXHBhcmFtIHQgZXZlbnQgdGFnCisgKgorICogVGhpcyBtYWNybyBzZXRzIHRoZSB0YWcgdG8gdGhlIGdpdmVuIGV2ZW50IHJlY29yZC4KKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF90YWcoZXYsdCkgXAorCSgoZXYpLT50YWcgPSAodCkpCisKKy8qKgorICogXGJyaWVmIHNldCB0aGUgZXhwbGljaXQgZGVzdGluYXRpb24KKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBjIGRlc3RpbmF0aW9uIGNsaWVudCBpZAorICogXHBhcmFtIHAgZGVzdGluYXRpb24gcG9ydCBpZAorICoKKyAqIFRoaXMgbWFjcm8gc2V0cyB0aGUgY2xpZW50IGFuZCBwb3J0IGlkIG51bWJlcnMgdG8gdGhlIGdpdmVuIGV2ZW50IHJlY29yZC4KKyAqCisgKiBcc2Egc25kX3NlcV9ldl9zZXRfc3VicygpCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfZGVzdChldixjLHApIFwKKwkoKGV2KS0+ZGVzdC5jbGllbnQgPSAoYyksIChldiktPmRlc3QucG9ydCA9IChwKSkKKworLyoqCisgKiBcYnJpZWYgc2V0IGJyb2FkY2FzdGluZyB0byBzdWJzY3JpYmVycworICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICoKKyAqIFRoaXMgbWFjcm8gc2V0cyB0aGUgZGVzdGluYXRpb24gYXMgdGhlIHN1YnNjcmliZXJzLgorICoKKyAqIFxzYSBzbmRfc2VxX2V2X3NldF9kZXN0KCkKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF9zdWJzKGV2KSBcCisJKChldiktPmRlc3QuY2xpZW50ID0gU05EX1NFUV9BRERSRVNTX1NVQlNDUklCRVJTLFwKKwkgKGV2KS0+ZGVzdC5wb3J0ID0gU05EX1NFUV9BRERSRVNTX1VOS05PV04pCisKKy8qKgorICogXGJyaWVmIHNldCBicm9hZGNhc3RpbmcgdG8gYWxsIGNsaWVudHMvcG9ydHMKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqCisgKiBUaGlzIG1hY3JvIHNldHMgdGhlIGRlc3RpbmF0aW9uIGFzIHRoZSBicm9hZGNhc3RpbmcuCisgKgorICogXHNhIHNuZF9zZXFfZXZfc2V0X2Rlc3QoKQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X2Jyb2FkY2FzdChldikgXAorCSgoZXYpLT5kZXN0LmNsaWVudCA9IFNORF9TRVFfQUREUkVTU19CUk9BRENBU1QsXAorCSAoZXYpLT5kZXN0LnBvcnQgPSBTTkRfU0VRX0FERFJFU1NfQlJPQURDQVNUKQorCisvKioKKyAqIFxicmllZiBzZXQgdGhlIHNvdXJjZSBwb3J0CisgKiBccGFyYW0gZXYgZXZlbnQgcmVjb3JkCisgKiBccGFyYW0gcCBzb3VyY2UgcG9ydCBpZAorICoKKyAqIFRoaXMgbWFjcm8gc2V0cyB0aGUgc291cmNlIHBvcnQgaWQgbnVtYmVyLgorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X3NvdXJjZShldixwKSBcCisJKChldiktPnNvdXJjZS5wb3J0ID0gKHApKQorCisvKioKKyAqIFxicmllZiBzZXQgZGlyZWN0IHBhc3NpbmcgbW9kZSAod2l0aG91dCBxdWV1ZWQpCisgKiBccGFyYW0gZXYgZXZlbnQgaW5zdGFuY2UKKyAqCisgKiBUaGlzIG1hY3JvIHNldHMgdGhlIGV2ZW50IHRvIHRoZSBkaXJlY3QgcGFzc2luZyBtb2RlCisgKiB0byBiZSBkZWxpdmVyZWQgaW1tZWRpYXRlbHkgd2l0aG91dCBxdWV1ZWluZy4KKyAqIAorICogXHNhIHNuZF9zZXFfZXZfc2NoZWR1bGVfdGljaygpLCBzbmRfc2VxX2V2X3NjaGVkdWxlX3JlYWwoKQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X2RpcmVjdChldikgXAorCSgoZXYpLT5xdWV1ZSA9IFNORF9TRVFfUVVFVUVfRElSRUNUKQorCisvKioKKyAqIFxicmllZiBzZXQgdGljay1zY2hlZHVsaW5nIG1vZGUgb24gcXVldWUKKyAqIFxwYXJhbSBldiBldmVudCBpbnN0YW5jZQorICogXHBhcmFtIHEgcXVldWUgaWQgdG8gc2NoZWR1bGUKKyAqIFxwYXJhbSByZWxhdGl2ZSByZWxhdGl2ZSB0aW1lLXN0YW1wIGlmIG5vbi16ZXJvCisgKiBccGFyYW0gdHRpY2sgdGljayB0aW1lLXN0YW1wIHRvIGJlIGRlbGl2ZXJlZAorICoKKyAqIFRoaXMgbWFjcm8gc2V0cyB0aGUgc2NoZWR1bGluZyBvZiB0aGUgZXZlbnQgaW4gdGhlCisgKiBNSURJIHRpY2sgbW9kZS4KKyAqCisgKiBcc2Egc25kX3NlcV9ldl9zY2hlZHVsZV9yZWFsKCksIHNuZF9zZXFfZXZfc2V0X2RpcmVjdCgpCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zY2hlZHVsZV90aWNrKGV2LCBxLCByZWxhdGl2ZSwgdHRpY2spIFwKKwkoKGV2KS0+ZmxhZ3MgJj0gfihTTkRfU0VRX1RJTUVfU1RBTVBfTUFTSyB8IFNORF9TRVFfVElNRV9NT0RFX01BU0spLFwKKwkgKGV2KS0+ZmxhZ3MgfD0gU05EX1NFUV9USU1FX1NUQU1QX1RJQ0ssXAorCSAoZXYpLT5mbGFncyB8PSAocmVsYXRpdmUpID8gU05EX1NFUV9USU1FX01PREVfUkVMIDogU05EX1NFUV9USU1FX01PREVfQUJTLFwKKwkgKGV2KS0+dGltZS50aWNrID0gKHR0aWNrKSxcCisJIChldiktPnF1ZXVlID0gKHEpKQorCisvKioKKyAqIFxicmllZiBzZXQgcmVhbC10aW1lLXNjaGVkdWxpbmcgbW9kZSBvbiBxdWV1ZQorICogXHBhcmFtIGV2IGV2ZW50IGluc3RhbmNlCisgKiBccGFyYW0gcSBxdWV1ZSBpZCB0byBzY2hlZHVsZQorICogXHBhcmFtIHJlbGF0aXZlIHJlbGF0aXZlIHRpbWUtc3RhbXAgaWYgbm9uLXplcm8KKyAqIFxwYXJhbSBydGltZSB0aW1lLXN0YW1wIHRvIGJlIGRlbGl2ZXJlZAorICoKKyAqIFRoaXMgbWFjcm8gc2V0cyB0aGUgc2NoZWR1bGluZyBvZiB0aGUgZXZlbnQgaW4gdGhlCisgKiByZWFsdGltZSBtb2RlLgorICoKKyAqIFxzYSBzbmRfc2VxX2V2X3NjaGVkdWxlX3RpY2soKSwgc25kX3NlcV9ldl9zZXRfZGlyZWN0KCkKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NjaGVkdWxlX3JlYWwoZXYsIHEsIHJlbGF0aXZlLCBydGltZSkgXAorCSgoZXYpLT5mbGFncyAmPSB+KFNORF9TRVFfVElNRV9TVEFNUF9NQVNLIHwgU05EX1NFUV9USU1FX01PREVfTUFTSyksXAorCSAoZXYpLT5mbGFncyB8PSBTTkRfU0VRX1RJTUVfU1RBTVBfUkVBTCxcCisJIChldiktPmZsYWdzIHw9IChyZWxhdGl2ZSkgPyBTTkRfU0VRX1RJTUVfTU9ERV9SRUwgOiBTTkRfU0VRX1RJTUVfTU9ERV9BQlMsXAorCSAoZXYpLT50aW1lLnRpbWUgPSAqKHJ0aW1lKSxcCisJIChldiktPnF1ZXVlID0gKHEpKQorCisvKioKKyAqIFxicmllZiBzZXQgZXZlbnQgcHJpb3JpdHkKKyAqIFxwYXJhbSBldiBldmVudCBpbnN0YW5jZQorICogXHBhcmFtIGhpZ2hfcHJpb3IgMSBmb3IgaGlnaCBwcmlvcml0eSBtb2RlCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfcHJpb3JpdHkoZXYsIGhpZ2hfcHJpb3IpIFwKKwkoKGV2KS0+ZmxhZ3MgJj0gflNORF9TRVFfUFJJT1JJVFlfTUFTSyxcCisJIChldiktPmZsYWdzIHw9IChoaWdoX3ByaW9yKSA/IFNORF9TRVFfUFJJT1JJVFlfSElHSCA6IFNORF9TRVFfUFJJT1JJVFlfTk9STUFMKQorCisvKioKKyAqIFxicmllZiBzZXQgZml4ZWQgZGF0YQorICogXHBhcmFtIGV2IGV2ZW50IGluc3RhbmNlCisgKgorICogU2V0cyB0aGUgZXZlbnQgbGVuZ3RoIG1vZGUgYXMgZml4ZWQgc2l6ZS4KKyAqCisgKiBcc2Egc25kX3NlcV9ldl9zZXRfdmFyaWFibGUoKSwgc25kX3NlcV9ldl9zZXRfdmFydXNyKCkKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF9maXhlZChldikgXAorCSgoZXYpLT5mbGFncyAmPSB+U05EX1NFUV9FVkVOVF9MRU5HVEhfTUFTSyxcCisJIChldiktPmZsYWdzIHw9IFNORF9TRVFfRVZFTlRfTEVOR1RIX0ZJWEVEKQorCisvKioKKyAqIFxicmllZiBzZXQgdmFyaWFibGUgZGF0YQorICogXHBhcmFtIGV2IGV2ZW50IGluc3RhbmNlCisgKiBccGFyYW0gZGF0YWxlbiBsZW5ndGggb2YgdGhlIGV4dGVybmFsIGRhdGEKKyAqIFxwYXJhbSBkYXRhcHRyIHBvaW50ZXIgb2YgdGhlIGV4dGVybmFsIGRhdGEKKyAqCisgKiBTZXRzIHRoZSBldmVudCBsZW5ndGggbW9kZSBhcyB2YXJpYWJsZSBsZW5ndGggYW5kIHN0b3JlcyB0aGUgZGF0YS4KKyAqCisgKiBcc2Egc25kX3NlcV9ldl9zZXRfZml4ZWQoKSwgc25kX3NlcV9ldl9zZXRfdmFydXNyKCkKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF92YXJpYWJsZShldiwgZGF0YWxlbiwgZGF0YXB0cikgXAorCSgoZXYpLT5mbGFncyAmPSB+U05EX1NFUV9FVkVOVF9MRU5HVEhfTUFTSyxcCisJIChldiktPmZsYWdzIHw9IFNORF9TRVFfRVZFTlRfTEVOR1RIX1ZBUklBQkxFLFwKKwkgKGV2KS0+ZGF0YS5leHQubGVuID0gKGRhdGFsZW4pLFwKKwkgKGV2KS0+ZGF0YS5leHQucHRyID0gKGRhdGFwdHIpKQorCisvKioKKyAqIFxicmllZiBzZXQgdmFydXNyIGRhdGEKKyAqIFxwYXJhbSBldiBldmVudCBpbnN0YW5jZQorICogXHBhcmFtIGRhdGFsZW4gbGVuZ3RoIG9mIHRoZSBleHRlcm5hbCBkYXRhCisgKiBccGFyYW0gZGF0YXB0ciBwb2ludGVyIG9mIHRoZSBleHRlcm5hbCBkYXRhCisgKgorICogU2V0cyB0aGUgZXZlbnQgbGVuZ3RoIG1vZGUgYXMgdmFyaWFibGUgdXNlci1zcGFjZSBkYXRhIGFuZCBzdG9yZXMgdGhlIGRhdGEuCisgKgorICogXHNhIHNuZF9zZXFfZXZfc2V0X2ZpeGVkKCksIHNuZF9zZXFfZXZfc2V0X3ZhcmlhYmxlKCkKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF92YXJ1c3IoZXYsIGRhdGFsZW4sIGRhdGFwdHIpIFwKKwkoKGV2KS0+ZmxhZ3MgJj0gflNORF9TRVFfRVZFTlRfTEVOR1RIX01BU0ssXAorCSAoZXYpLT5mbGFncyB8PSBTTkRfU0VRX0VWRU5UX0xFTkdUSF9WQVJVU1IsXAorCSAoZXYpLT5kYXRhLmV4dC5sZW4gPSAoZGF0YWxlbiksXAorCSAoZXYpLT5kYXRhLmV4dC5wdHIgPSAoZGF0YXB0cikpCisKKy8qKgorICogXGJyaWVmIHNldCBxdWV1ZSBjb250cm9scworICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICogXHBhcmFtIHR5cCBldmVudCB0eXBlCisgKiBccGFyYW0gcSBxdWV1ZSBpZAorICogXHBhcmFtIHZhbCBjb250cm9sIHZhbHVlCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfcXVldWVfY29udHJvbChldiwgdHlwLCBxLCB2YWwpIFwKKwkoKGV2KS0+dHlwZSA9ICh0eXApLFwKKwkgc25kX3NlcV9ldl9zZXRfZGVzdChldiwgU05EX1NFUV9DTElFTlRfU1lTVEVNLCBTTkRfU0VRX1BPUlRfU1lTVEVNX1RJTUVSKSxcCisJIChldiktPmRhdGEucXVldWUucXVldWUgPSAocSksXAorCSAoZXYpLT5kYXRhLnF1ZXVlLnBhcmFtLnZhbHVlID0gKHZhbCkpCisKKy8qKgorICogXGJyaWVmIHNldCB0aGUgc3RhcnQgcXVldWUgZXZlbnQKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBxIHF1ZXVlIGlkIHRvIHN0YXJ0CisgKgorICogXHNhIHNuZF9zZXFfZXZfc2V0X3F1ZXVlX3N0b3AoKSwgc25kX3NlcV9ldl9zZXRfcXVldWVfY29udGludWUoKQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X3F1ZXVlX3N0YXJ0KGV2LCBxKSBcCisJc25kX3NlcV9ldl9zZXRfcXVldWVfY29udHJvbChldiwgU05EX1NFUV9FVkVOVF9TVEFSVCwgcSwgMCkKKworLyoqCisgKiBcYnJpZWYgc2V0IHRoZSBzdG9wIHF1ZXVlIGV2ZW50CisgKiBccGFyYW0gZXYgZXZlbnQgcmVjb3JkCisgKiBccGFyYW0gcSBxdWV1ZSBpZCB0byBzdG9wCisgKgorICogXHNhIHNuZF9zZXFfZXZfc2V0X3F1ZXVlX3N0YXJ0KCksIHNuZF9zZXFfZXZfc2V0X3F1ZXVlX2NvbnRpbnVlKCkKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF9xdWV1ZV9zdG9wKGV2LCBxKSBcCisJc25kX3NlcV9ldl9zZXRfcXVldWVfY29udHJvbChldiwgU05EX1NFUV9FVkVOVF9TVE9QLCBxLCAwKQorCisvKioKKyAqIFxicmllZiBzZXQgdGhlIHN0b3AgcXVldWUgZXZlbnQKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBxIHF1ZXVlIGlkIHRvIGNvbnRpbnVlCisgKgorICogXHNhIHNuZF9zZXFfZXZfc2V0X3F1ZXVlX3N0YXJ0KCksIHNuZF9zZXFfZXZfc2V0X3F1ZXVlX3N0b3AoKQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X3F1ZXVlX2NvbnRpbnVlKGV2LCBxKSBcCisJc25kX3NlcV9ldl9zZXRfcXVldWVfY29udHJvbChldiwgU05EX1NFUV9FVkVOVF9DT05USU5VRSwgcSwgMCkKKworLyoqCisgKiBcYnJpZWYgc2V0IHRoZSBzdG9wIHF1ZXVlIGV2ZW50CisgKiBccGFyYW0gZXYgZXZlbnQgcmVjb3JkCisgKiBccGFyYW0gcSBxdWV1ZSBpZCB0byBjaGFuZ2UgdGVtcG8KKyAqIFxwYXJhbSB2YWwgdGhlIG5ldyB0ZW1wbyB2YWx1ZQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X3F1ZXVlX3RlbXBvKGV2LCBxLCB2YWwpIFwKKwlzbmRfc2VxX2V2X3NldF9xdWV1ZV9jb250cm9sKGV2LCBTTkRfU0VRX0VWRU5UX1RFTVBPLCBxLCB2YWwpCisKKy8qKgorICogXGJyaWVmIHNldCB0aGUgcmVhbC10aW1lIHBvc2l0aW9uIG9mIGEgcXVldWUKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBxIHF1ZXVlIGlkIHRvIGNoYW5nZSB0ZW1wbworICogXHBhcmFtIHJ0aW1lIHRoZSBuZXcgcmVhbC10aW1lIHBvaW50ZXIKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF9xdWV1ZV9wb3NfcmVhbChldiwgcSwgcnRpbWUpIFwKKwkoKGV2KS0+dHlwZSA9IFNORF9TRVFfRVZFTlRfU0VUUE9TX1RJTUUsXAorCSBzbmRfc2VxX2V2X3NldF9kZXN0KGV2LCBTTkRfU0VRX0NMSUVOVF9TWVNURU0sIFNORF9TRVFfUE9SVF9TWVNURU1fVElNRVIpLFwKKwkgKGV2KS0+ZGF0YS5xdWV1ZS5xdWV1ZSA9IChxKSxcCisJIChldiktPmRhdGEucXVldWUucGFyYW0udGltZS50aW1lID0gKihydGltZSkpCisKKy8qKgorICogXGJyaWVmIHNldCB0aGUgdGljay10aW1lIHBvc2l0aW9uIG9mIGEgcXVldWUKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBxIHF1ZXVlIGlkIHRvIGNoYW5nZSB0ZW1wbworICogXHBhcmFtIHR0aW1lIHRoZSBuZXcgdGljay10aW1lCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfcXVldWVfcG9zX3RpY2soZXYsIHEsIHR0aW1lKSBcCisJKChldiktPnR5cGUgPSBTTkRfU0VRX0VWRU5UX1NFVFBPU19USUNLLFwKKwkgc25kX3NlcV9ldl9zZXRfZGVzdChldiwgU05EX1NFUV9DTElFTlRfU1lTVEVNLCBTTkRfU0VRX1BPUlRfU1lTVEVNX1RJTUVSKSxcCisJIChldiktPmRhdGEucXVldWUucXVldWUgPSAocSksXAorCSAoZXYpLT5kYXRhLnF1ZXVlLnBhcmFtLnRpbWUudGljayA9ICh0dGltZSkpCisKKy8qIHNldCBhbmQgc2VuZCBhIHF1ZXVlIGNvbnRyb2wgZXZlbnQgKi8KK2ludCBzbmRfc2VxX2NvbnRyb2xfcXVldWUoc25kX3NlcV90ICpzZXEsIGludCBxLCBpbnQgdHlwZSwgaW50IHZhbHVlLCBzbmRfc2VxX2V2ZW50X3QgKmV2KTsKKworLyoqCisgKiBcYnJpZWYgc3RhcnQgdGhlIHNwZWNpZmllZCBxdWV1ZQorICogXHBhcmFtIHNlcSBzZXF1ZW5jZXIgaGFuZGxlCisgKiBccGFyYW0gcSBxdWV1ZSBpZCB0byBzdGFydAorICogXHBhcmFtIGV2IG9wdGlvbmFsIGV2ZW50IHJlY29yZCAoc2VlICNzbmRfc2VxX2NvbnRyb2xfcXVldWUpCisgKi8KKyNkZWZpbmUgc25kX3NlcV9zdGFydF9xdWV1ZShzZXEsIHEsIGV2KSBcCisJc25kX3NlcV9jb250cm9sX3F1ZXVlKHNlcSwgcSwgU05EX1NFUV9FVkVOVF9TVEFSVCwgMCwgZXYpCisKKy8qKgorICogXGJyaWVmIHN0b3AgdGhlIHNwZWNpZmllZCBxdWV1ZQorICogXHBhcmFtIHNlcSBzZXF1ZW5jZXIgaGFuZGxlCisgKiBccGFyYW0gcSBxdWV1ZSBpZCB0byBzdG9wCisgKiBccGFyYW0gZXYgb3B0aW9uYWwgZXZlbnQgcmVjb3JkIChzZWUgI3NuZF9zZXFfY29udHJvbF9xdWV1ZSkKKyAqLworI2RlZmluZSBzbmRfc2VxX3N0b3BfcXVldWUoc2VxLCBxLCBldikgXAorCXNuZF9zZXFfY29udHJvbF9xdWV1ZShzZXEsIHEsIFNORF9TRVFfRVZFTlRfU1RPUCwgMCwgZXYpCisKKy8qKgorICogXGJyaWVmIGNvbnRpbnVlIHRoZSBzcGVjaWZpZWQgcXVldWUKKyAqIFxwYXJhbSBzZXEgc2VxdWVuY2VyIGhhbmRsZQorICogXHBhcmFtIHEgcXVldWUgaWQgdG8gY29udGludWUKKyAqIFxwYXJhbSBldiBvcHRpb25hbCBldmVudCByZWNvcmQgKHNlZSAjc25kX3NlcV9jb250cm9sX3F1ZXVlKQorICovCisjZGVmaW5lIHNuZF9zZXFfY29udGludWVfcXVldWUoc2VxLCBxLCBldikgXAorCXNuZF9zZXFfY29udHJvbF9xdWV1ZShzZXEsIHEsIFNORF9TRVFfRVZFTlRfQ09OVElOVUUsIDAsIGV2KQorCisvKioKKyAqIFxicmllZiBjaGFuZ2UgdGhlIHRlbXBvIG9mIHRoZSBzcGVjaWZpZWQgcXVldWUKKyAqIFxwYXJhbSBzZXEgc2VxdWVuY2VyIGhhbmRsZQorICogXHBhcmFtIHEgcXVldWUgaWQKKyAqIFxwYXJhbSB0ZW1wbyB0aGUgbmV3IHRlbXBvIHZhbHVlCisgKiBccGFyYW0gZXYgb3B0aW9uYWwgZXZlbnQgcmVjb3JkIChzZWUgI3NuZF9zZXFfY29udHJvbF9xdWV1ZSkKKyAqLworI2RlZmluZSBzbmRfc2VxX2NoYW5nZV9xdWV1ZV90ZW1wbyhzZXEsIHEsIHRlbXBvLCBldikgXAorCXNuZF9zZXFfY29udHJvbF9xdWV1ZShzZXEsIHEsIFNORF9TRVFfRVZFTlRfVEVNUE8sIHRlbXBvLCBldikKKworLyogY3JlYXRlIGEgcG9ydCAtIHNpbXBsZSB2ZXJzaW9uIC0gcmV0dXJuIHRoZSBwb3J0IG51bWJlciAqLworaW50IHNuZF9zZXFfY3JlYXRlX3NpbXBsZV9wb3J0KHNuZF9zZXFfdCAqc2VxLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBjYXBzLCB1bnNpZ25lZCBpbnQgdHlwZSk7CisvKiBkZWxldGUgdGhlIHBvcnQgKi8KK2ludCBzbmRfc2VxX2RlbGV0ZV9zaW1wbGVfcG9ydChzbmRfc2VxX3QgKnNlcSwgaW50IHBvcnQpOworCisvKiBzaW1wbGUgc3Vic2NyaXB0aW9uIGJldHdlZW4gdGhpcyBwb3J0IGFuZCBhbm90aGVyIHBvcnQKKyAgICh3L28gZXhjbHVzaXZlICYgdGltZSBjb252ZXJzaW9uKQorICAgKi8KK2ludCBzbmRfc2VxX2Nvbm5lY3RfZnJvbShzbmRfc2VxX3QgKnNlcSwgaW50IG15X3BvcnQsIGludCBzcmNfY2xpZW50LCBpbnQgc3JjX3BvcnQpOworaW50IHNuZF9zZXFfY29ubmVjdF90byhzbmRfc2VxX3QgKnNlcSwgaW50IG15X3BvcnQsIGludCBkZXN0X2NsaWVudCwgaW50IGRlc3RfcG9ydCk7CitpbnQgc25kX3NlcV9kaXNjb25uZWN0X2Zyb20oc25kX3NlcV90ICpzZXEsIGludCBteV9wb3J0LCBpbnQgc3JjX2NsaWVudCwgaW50IHNyY19wb3J0KTsKK2ludCBzbmRfc2VxX2Rpc2Nvbm5lY3RfdG8oc25kX3NlcV90ICpzZXEsIGludCBteV9wb3J0LCBpbnQgZGVzdF9jbGllbnQsIGludCBkZXN0X3BvcnQpOworCisvKgorICogc2V0IGNsaWVudCBpbmZvcm1hdGlvbgorICovCitpbnQgc25kX3NlcV9zZXRfY2xpZW50X25hbWUoc25kX3NlcV90ICpzZXEsIGNvbnN0IGNoYXIgKm5hbWUpOworaW50IHNuZF9zZXFfc2V0X2NsaWVudF9ldmVudF9maWx0ZXIoc25kX3NlcV90ICpzZXEsIGludCBldmVudF90eXBlKTsKK2ludCBzbmRfc2VxX3NldF9jbGllbnRfcG9vbF9vdXRwdXQoc25kX3NlcV90ICpzZXEsIHNpemVfdCBzaXplKTsKK2ludCBzbmRfc2VxX3NldF9jbGllbnRfcG9vbF9vdXRwdXRfcm9vbShzbmRfc2VxX3QgKnNlcSwgc2l6ZV90IHNpemUpOworaW50IHNuZF9zZXFfc2V0X2NsaWVudF9wb29sX2lucHV0KHNuZF9zZXFfdCAqc2VxLCBzaXplX3Qgc2l6ZSk7CisvKiBzeW5jIG91dHB1dCBxdWV1ZSAqLworaW50IHNuZF9zZXFfc3luY19vdXRwdXRfcXVldWUoc25kX3NlcV90ICpzZXEpOworCisvKgorICogcGFyc2UgdGhlIGdpdmVuIHN0cmluZyBhbmQgZ2V0IHRoZSBzZXF1ZW5jZXIgYWRkcmVzcworICovCitpbnQgc25kX3NlcV9wYXJzZV9hZGRyZXNzKHNuZF9zZXFfdCAqc2VxLCBzbmRfc2VxX2FkZHJfdCAqYWRkciwgY29uc3QgY2hhciAqc3RyKTsKKworLyoKKyAqIHJlc2V0IGNsaWVudCBpbnB1dC9vdXRwdXQgcG9vbAorICovCitpbnQgc25kX3NlcV9yZXNldF9wb29sX291dHB1dChzbmRfc2VxX3QgKnNlcSk7CitpbnQgc25kX3NlcV9yZXNldF9wb29sX2lucHV0KHNuZF9zZXFfdCAqc2VxKTsKKworLyoqCisgKiBcYnJpZWYgc2V0IG5vdGUgZXZlbnQKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBjaCBjaGFubmVsIG51bWJlcgorICogXHBhcmFtIGtleSBub3RlIGtleQorICogXHBhcmFtIHZlbCB2ZWxvY2l0eQorICogXHBhcmFtIGR1ciBkdXJhdGlvbiAoaW4gdGljayBvciBtc2VjKQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X25vdGUoZXYsIGNoLCBrZXksIHZlbCwgZHVyKSBcCisJKChldiktPnR5cGUgPSBTTkRfU0VRX0VWRU5UX05PVEUsXAorCSBzbmRfc2VxX2V2X3NldF9maXhlZChldiksXAorCSAoZXYpLT5kYXRhLm5vdGUuY2hhbm5lbCA9IChjaCksXAorCSAoZXYpLT5kYXRhLm5vdGUubm90ZSA9IChrZXkpLFwKKwkgKGV2KS0+ZGF0YS5ub3RlLnZlbG9jaXR5ID0gKHZlbCksXAorCSAoZXYpLT5kYXRhLm5vdGUuZHVyYXRpb24gPSAoZHVyKSkKKworLyoqCisgKiBcYnJpZWYgc2V0IG5vdGUtb24gZXZlbnQKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBjaCBjaGFubmVsIG51bWJlcgorICogXHBhcmFtIGtleSBub3RlIGtleQorICogXHBhcmFtIHZlbCB2ZWxvY2l0eQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X25vdGVvbihldiwgY2gsIGtleSwgdmVsKSBcCisJKChldiktPnR5cGUgPSBTTkRfU0VRX0VWRU5UX05PVEVPTixcCisJIHNuZF9zZXFfZXZfc2V0X2ZpeGVkKGV2KSxcCisJIChldiktPmRhdGEubm90ZS5jaGFubmVsID0gKGNoKSxcCisJIChldiktPmRhdGEubm90ZS5ub3RlID0gKGtleSksXAorCSAoZXYpLT5kYXRhLm5vdGUudmVsb2NpdHkgPSAodmVsKSkKKworLyoqCisgKiBcYnJpZWYgc2V0IG5vdGUtb2ZmIGV2ZW50CisgKiBccGFyYW0gZXYgZXZlbnQgcmVjb3JkCisgKiBccGFyYW0gY2ggY2hhbm5lbCBudW1iZXIKKyAqIFxwYXJhbSBrZXkgbm90ZSBrZXkKKyAqIFxwYXJhbSB2ZWwgdmVsb2NpdHkKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF9ub3Rlb2ZmKGV2LCBjaCwga2V5LCB2ZWwpIFwKKwkoKGV2KS0+dHlwZSA9IFNORF9TRVFfRVZFTlRfTk9URU9GRixcCisJIHNuZF9zZXFfZXZfc2V0X2ZpeGVkKGV2KSxcCisJIChldiktPmRhdGEubm90ZS5jaGFubmVsID0gKGNoKSxcCisJIChldiktPmRhdGEubm90ZS5ub3RlID0gKGtleSksXAorCSAoZXYpLT5kYXRhLm5vdGUudmVsb2NpdHkgPSAodmVsKSkKKworLyoqCisgKiBcYnJpZWYgc2V0IGtleS1wcmVzc3VyZSBldmVudAorICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICogXHBhcmFtIGNoIGNoYW5uZWwgbnVtYmVyCisgKiBccGFyYW0ga2V5IG5vdGUga2V5CisgKiBccGFyYW0gdmVsIHZlbG9jaXR5CisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfa2V5cHJlc3MoZXYsY2gsa2V5LHZlbCkgXAorCSgoZXYpLT50eXBlID0gU05EX1NFUV9FVkVOVF9LRVlQUkVTUyxcCisJIHNuZF9zZXFfZXZfc2V0X2ZpeGVkKGV2KSxcCisJIChldiktPmRhdGEubm90ZS5jaGFubmVsID0gKGNoKSxcCisJIChldiktPmRhdGEubm90ZS5ub3RlID0gKGtleSksXAorCSAoZXYpLT5kYXRhLm5vdGUudmVsb2NpdHkgPSAodmVsKSkKKworLyoqCisgKiBcYnJpZWYgc2V0IE1JREkgY29udHJvbGxlciBldmVudAorICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICogXHBhcmFtIGNoIGNoYW5uZWwgbnVtYmVyCisgKiBccGFyYW0gY2MgY29udHJvbGxlciBudW1iZXIKKyAqIFxwYXJhbSB2YWwgY29udHJvbCB2YWx1ZQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X2NvbnRyb2xsZXIoZXYsY2gsY2MsdmFsKSBcCisJKChldiktPnR5cGUgPSBTTkRfU0VRX0VWRU5UX0NPTlRST0xMRVIsXAorCSBzbmRfc2VxX2V2X3NldF9maXhlZChldiksXAorCSAoZXYpLT5kYXRhLmNvbnRyb2wuY2hhbm5lbCA9IChjaCksXAorCSAoZXYpLT5kYXRhLmNvbnRyb2wucGFyYW0gPSAoY2MpLFwKKwkgKGV2KS0+ZGF0YS5jb250cm9sLnZhbHVlID0gKHZhbCkpCisKKy8qKgorICogXGJyaWVmIHNldCBwcm9ncmFtIGNoYW5nZSBldmVudAorICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICogXHBhcmFtIGNoIGNoYW5uZWwgbnVtYmVyCisgKiBccGFyYW0gdmFsIHByb2dyYW0gbnVtYmVyCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfcGdtY2hhbmdlKGV2LGNoLHZhbCkgXAorCSgoZXYpLT50eXBlID0gU05EX1NFUV9FVkVOVF9QR01DSEFOR0UsXAorCSBzbmRfc2VxX2V2X3NldF9maXhlZChldiksXAorCSAoZXYpLT5kYXRhLmNvbnRyb2wuY2hhbm5lbCA9IChjaCksXAorCSAoZXYpLT5kYXRhLmNvbnRyb2wudmFsdWUgPSAodmFsKSkKKworLyoqCisgKiBcYnJpZWYgc2V0IHBpdGNoLWJlbmQgZXZlbnQKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBjaCBjaGFubmVsIG51bWJlcgorICogXHBhcmFtIHZhbCBwaXRjaCBiZW5kOyB6ZXJvIGNlbnRlcmVkIGZyb20gLTgxOTIgdG8gODE5MQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X3BpdGNoYmVuZChldixjaCx2YWwpIFwKKwkoKGV2KS0+dHlwZSA9IFNORF9TRVFfRVZFTlRfUElUQ0hCRU5ELFwKKwkgc25kX3NlcV9ldl9zZXRfZml4ZWQoZXYpLFwKKwkgKGV2KS0+ZGF0YS5jb250cm9sLmNoYW5uZWwgPSAoY2gpLFwKKwkgKGV2KS0+ZGF0YS5jb250cm9sLnZhbHVlID0gKHZhbCkpCisKKy8qKgorICogXGJyaWVmIHNldCBjaGFubmVsIHByZXNzdXJlIGV2ZW50CisgKiBccGFyYW0gZXYgZXZlbnQgcmVjb3JkCisgKiBccGFyYW0gY2ggY2hhbm5lbCBudW1iZXIKKyAqIFxwYXJhbSB2YWwgY2hhbm5lbCBwcmVzc3VyZSB2YWx1ZQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X2NoYW5wcmVzcyhldixjaCx2YWwpIFwKKwkoKGV2KS0+dHlwZSA9IFNORF9TRVFfRVZFTlRfQ0hBTlBSRVNTLFwKKwkgc25kX3NlcV9ldl9zZXRfZml4ZWQoZXYpLFwKKwkgKGV2KS0+ZGF0YS5jb250cm9sLmNoYW5uZWwgPSAoY2gpLFwKKwkgKGV2KS0+ZGF0YS5jb250cm9sLnZhbHVlID0gKHZhbCkpCisKKy8qKgorICogXGJyaWVmIHNldCBzeXNleCBldmVudAorICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICogXHBhcmFtIGRhdGFsZW4gbGVuZ3RoIG9mIHN5c2V4IGRhdGEKKyAqIFxwYXJhbSBkYXRhcHRyIHN5c2V4IGRhdGEgcG9pbnRlcgorICoKKyAqIHRoZSBzeXNleCBkYXRhIG11c3QgY29udGFpbiB0aGUgc3RhcnQgYnl0ZSAweGYwIGFuZCB0aGUgZW5kIGJ5dGUgMHhmNy4KKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF9zeXNleChldixkYXRhbGVuLGRhdGFwdHIpIFwKKwkoKGV2KS0+dHlwZSA9IFNORF9TRVFfRVZFTlRfU1lTRVgsXAorCSBzbmRfc2VxX2V2X3NldF92YXJpYWJsZShldiwgZGF0YWxlbiwgZGF0YXB0cikpCisKKy8qKiBcfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19BTFNBX1NFUU1JRF9IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9hc291bmRfZm0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9hc291bmRfZm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmE0Yjk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL2Fzb3VuZF9mbS5oCkBAIC0wLDAgKzEsMTM0IEBACisjaWZuZGVmIF9fU09VTkRfQVNPVU5EX0ZNX0gKKyNkZWZpbmUgX19TT1VORF9BU09VTkRfRk1fSAorCisvKgorICogIEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZSAtIEFMU0EKKyAqCisgKiAgSW50ZXJmYWNlIGZpbGUgYmV0d2VlbiBBTFNBIGRyaXZlciAmIHVzZXIgc3BhY2UKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTQtOTggYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDRGcm9udCBUZWNobm9sb2dpZXMKKyAqCisgKiAgRGlyZWN0IEZNIGNvbnRyb2wKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNkZWZpbmUgU05EUlZfRE1fRk1fTU9ERV9PUEwyCTB4MDAKKyNkZWZpbmUgU05EUlZfRE1fRk1fTU9ERV9PUEwzCTB4MDEKKworc3RydWN0IHNuZF9kbV9mbV9pbmZvIHsKKwl1bnNpZ25lZCBjaGFyIGZtX21vZGU7CQkvKiBPUEwgbW9kZSwgc2VlIFNORFJWX0RNX0ZNX01PREVfWFhYICovCisJdW5zaWduZWQgY2hhciByaHl0aG07CQkvKiBwZXJjdXNzaW9uIG1vZGUgZmxhZyAqLworfTsKKworLyoKKyAqICBEYXRhIHN0cnVjdHVyZSBjb21wb3NpbmcgYW4gRk0gIm5vdGUiIG9yIHNvdW5kIGV2ZW50LgorICovCisKK3N0cnVjdCBzbmRfZG1fZm1fdm9pY2UgeworCXVuc2lnbmVkIGNoYXIgb3A7CQkvKiBvcGVyYXRvciBjZWxsICgwIG9yIDEpICovCisJdW5zaWduZWQgY2hhciB2b2ljZTsJCS8qIEZNIHZvaWNlICgwIHRvIDE3KSAqLworCisJdW5zaWduZWQgY2hhciBhbTsJCS8qIGFtcGxpdHVkZSBtb2R1bGF0aW9uICovCisJdW5zaWduZWQgY2hhciB2aWJyYXRvOwkJLyogdmlicmF0byBlZmZlY3QgKi8KKwl1bnNpZ25lZCBjaGFyIGRvX3N1c3RhaW47CS8qIHN1c3RhaW4gcGhhc2UgKi8KKwl1bnNpZ25lZCBjaGFyIGtiZF9zY2FsZTsJLyoga2V5Ym9hcmQgc2NhbGluZyAqLworCXVuc2lnbmVkIGNoYXIgaGFybW9uaWM7CQkvKiA0IGJpdHM6IGhhcm1vbmljIGFuZCBtdWx0aXBsaWVyICovCisJdW5zaWduZWQgY2hhciBzY2FsZV9sZXZlbDsJLyogMiBiaXRzOiBkZWNyZWFzZSBvdXRwdXQgZnJlcSByaXNlcyAqLworCXVuc2lnbmVkIGNoYXIgdm9sdW1lOwkJLyogNiBiaXRzOiB2b2x1bWUgKi8KKworCXVuc2lnbmVkIGNoYXIgYXR0YWNrOwkJLyogNCBiaXRzOiBhdHRhY2sgcmF0ZSAqLworCXVuc2lnbmVkIGNoYXIgZGVjYXk7CQkvKiA0IGJpdHM6IGRlY2F5IHJhdGUgKi8KKwl1bnNpZ25lZCBjaGFyIHN1c3RhaW47CQkvKiA0IGJpdHM6IHN1c3RhaW4gbGV2ZWwgKi8KKwl1bnNpZ25lZCBjaGFyIHJlbGVhc2U7CQkvKiA0IGJpdHM6IHJlbGVhc2UgcmF0ZSAqLworCisJdW5zaWduZWQgY2hhciBmZWVkYmFjazsJCS8qIDMgYml0czogZmVlZGJhY2sgZm9yIG9wMCAqLworCXVuc2lnbmVkIGNoYXIgY29ubmVjdGlvbjsJLyogMCBmb3Igc2VyaWFsLCAxIGZvciBwYXJhbGxlbCAqLworCXVuc2lnbmVkIGNoYXIgbGVmdDsJCS8qIHN0ZXJlbyBsZWZ0ICovCisJdW5zaWduZWQgY2hhciByaWdodDsJCS8qIHN0ZXJlbyByaWdodCAqLworCXVuc2lnbmVkIGNoYXIgd2F2ZWZvcm07CQkvKiAzIGJpdHM6IHdhdmVmb3JtIHNoYXBlICovCit9OworCisvKgorICogIFRoaXMgZGVzY3JpYmVzIGFuIEZNIG5vdGUgYnkgaXRzIHZvaWNlLCBvY3RhdmUsIGZyZXF1ZW5jeSBudW1iZXIgKDEwYml0KQorICogIGFuZCBrZXkgb24vb2ZmLgorICovCisKK3N0cnVjdCBzbmRfZG1fZm1fbm90ZSB7CisJdW5zaWduZWQgY2hhciB2b2ljZTsJLyogMC0xNyB2b2ljZSBjaGFubmVsICovCisJdW5zaWduZWQgY2hhciBvY3RhdmU7CS8qIDMgYml0czogd2hhdCBvY3RhdmUgdG8gcGxheSAqLworCXVuc2lnbmVkIGludCBmbnVtOwkvKiAxMCBiaXRzOiBmcmVxdWVuY3kgbnVtYmVyICovCisJdW5zaWduZWQgY2hhciBrZXlfb247CS8qIHNldCBmb3IgYWN0aXZlLCBjbGVhciBmb3Igc2lsZW50ICovCit9OworCisvKgorICogIEZNIHBhcmFtZXRlcnMgdGhhdCBhcHBseSBnbG9iYWxseSB0byBhbGwgdm9pY2VzLCBhbmQgdGh1cyBhcmUgbm90ICJub3RlcyIKKyAqLworCitzdHJ1Y3Qgc25kX2RtX2ZtX3BhcmFtcyB7CisJdW5zaWduZWQgY2hhciBhbV9kZXB0aDsJCS8qIGFtcGxpdHVkZSBtb2R1bGF0aW9uIGRlcHRoICgxPWhpKSAqLworCXVuc2lnbmVkIGNoYXIgdmliX2RlcHRoOwkvKiB2aWJyYXRvIGRlcHRoICgxPWhpKSAqLworCXVuc2lnbmVkIGNoYXIga2JkX3NwbGl0OwkvKiBrZXlib2FyZCBzcGxpdCAqLworCXVuc2lnbmVkIGNoYXIgcmh5dGhtOwkJLyogcGVyY3Vzc2lvbiBtb2RlIHNlbGVjdCAqLworCisJLyogVGhpcyBibG9jayBpcyB0aGUgcGVyY3Vzc2lvbiBpbnN0cnVtZW50IGRhdGEgKi8KKwl1bnNpZ25lZCBjaGFyIGJhc3M7CisJdW5zaWduZWQgY2hhciBzbmFyZTsKKwl1bnNpZ25lZCBjaGFyIHRvbXRvbTsKKwl1bnNpZ25lZCBjaGFyIGN5bWJhbDsKKwl1bnNpZ25lZCBjaGFyIGhpaGF0OworfTsKKworLyoKKyAqICBGTSBtb2RlIGlvY3RsIHNldHRpbmdzCisgKi8KKworI2RlZmluZSBTTkRSVl9ETV9GTV9JT0NUTF9JTkZPCQlfSU9SKCdIJywgMHgyMCwgc3RydWN0IHNuZF9kbV9mbV9pbmZvKQorI2RlZmluZSBTTkRSVl9ETV9GTV9JT0NUTF9SRVNFVAkJX0lPICgnSCcsIDB4MjEpCisjZGVmaW5lIFNORFJWX0RNX0ZNX0lPQ1RMX1BMQVlfTk9URQlfSU9XKCdIJywgMHgyMiwgc3RydWN0IHNuZF9kbV9mbV9ub3RlKQorI2RlZmluZSBTTkRSVl9ETV9GTV9JT0NUTF9TRVRfVk9JQ0UJX0lPVygnSCcsIDB4MjMsIHN0cnVjdCBzbmRfZG1fZm1fdm9pY2UpCisjZGVmaW5lIFNORFJWX0RNX0ZNX0lPQ1RMX1NFVF9QQVJBTVMJX0lPVygnSCcsIDB4MjQsIHN0cnVjdCBzbmRfZG1fZm1fcGFyYW1zKQorI2RlZmluZSBTTkRSVl9ETV9GTV9JT0NUTF9TRVRfTU9ERQlfSU9XKCdIJywgMHgyNSwgaW50KQorLyogZm9yIE9QTDMgb25seSAqLworI2RlZmluZSBTTkRSVl9ETV9GTV9JT0NUTF9TRVRfQ09OTkVDVElPTglfSU9XKCdIJywgMHgyNiwgaW50KQorLyogU0JJIHBhdGNoIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgU05EUlZfRE1fRk1fSU9DVExfQ0xFQVJfUEFUQ0hFUwlfSU8gKCdIJywgMHg0MCkKKworI2RlZmluZSBTTkRSVl9ETV9GTV9PU1NfSU9DVExfUkVTRVQJCTB4MjAKKyNkZWZpbmUgU05EUlZfRE1fRk1fT1NTX0lPQ1RMX1BMQVlfTk9URQkJMHgyMQorI2RlZmluZSBTTkRSVl9ETV9GTV9PU1NfSU9DVExfU0VUX1ZPSUNFCQkweDIyCisjZGVmaW5lIFNORFJWX0RNX0ZNX09TU19JT0NUTF9TRVRfUEFSQU1TCTB4MjMKKyNkZWZpbmUgU05EUlZfRE1fRk1fT1NTX0lPQ1RMX1NFVF9NT0RFCQkweDI0CisjZGVmaW5lIFNORFJWX0RNX0ZNX09TU19JT0NUTF9TRVRfT1BMCQkweDI1CisKKy8qCisgKiBQYXRjaCBSZWNvcmQgLSBmaXhlZCBzaXplIGZvciB3cml0ZQorICovCisKKyNkZWZpbmUgRk1fS0VZX1NCSQkiU0JJXDAzMiIKKyNkZWZpbmUgRk1fS0VZXzJPUAkiMk9QXDAzMiIKKyNkZWZpbmUgRk1fS0VZXzRPUAkiNE9QXDAzMiIKKworc3RydWN0IHNiaV9wYXRjaCB7CisJdW5zaWduZWQgY2hhciBwcm9nOworCXVuc2lnbmVkIGNoYXIgYmFuazsKKwljaGFyIGtleVs0XTsKKwljaGFyIG5hbWVbMjVdOworCWNoYXIgZXh0ZW5zaW9uWzddOworCXVuc2lnbmVkIGNoYXIgZGF0YVszMl07Cit9OworCisjZW5kaWYgLyogX19TT1VORF9BU09VTkRfRk1fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL2VtdTEwazEuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9lbXUxMGsxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQwMThiNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9lbXUxMGsxLmgKQEAgLTAsMCArMSwzNDkgQEAKKyNpZm5kZWYgX19TT1VORF9FTVUxMEsxX0gKKyNkZWZpbmUgX19TT1VORF9FTVUxMEsxX0gKKworLyoKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+LAorICoJCSAgICAgQ3JlYXRpdmUgTGFicywgSW5jLgorICogIERlZmluaXRpb25zIGZvciBFTVUxMEsxIChTQiBMaXZlISkgY2hpcHMKKyAqCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qCisgKiAtLS0tIEZYODAxMCAtLS0tCisgKi8KKworI2RlZmluZSBFTVUxMEsxX0NBUkRfQ1JFQVRJVkUJCQkweDAwMDAwMDAwCisjZGVmaW5lIEVNVTEwSzFfQ0FSRF9FTVVBUFMJCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgRU1VMTBLMV9GWDgwMTBfUENNX0NPVU5UCQk4CisKKy8qIGluc3RydWN0aW9uIHNldCAqLworI2RlZmluZSBpTUFDMAkgMHgwMAkvKiBSID0gQSArIChYICogWSA+PiAzMSkgICA7IHNhdHVyYXRpb24gKi8KKyNkZWZpbmUgaU1BQzEJIDB4MDEJLyogUiA9IEEgKyAoLVggKiBZID4+IDMxKSAgOyBzYXR1cmF0aW9uICovCisjZGVmaW5lIGlNQUMyCSAweDAyCS8qIFIgPSBBICsgKFggKiBZID4+IDMxKSAgIDsgd3JhcGFyb3VuZCAqLworI2RlZmluZSBpTUFDMwkgMHgwMwkvKiBSID0gQSArICgtWCAqIFkgPj4gMzEpICA7IHdyYXBhcm91bmQgKi8KKyNkZWZpbmUgaU1BQ0lOVDAgMHgwNAkvKiBSID0gQSArIFggKiBZCSAgIDsgc2F0dXJhdGlvbiAqLworI2RlZmluZSBpTUFDSU5UMSAweDA1CS8qIFIgPSBBICsgWCAqIFkJICAgOyB3cmFwYXJvdW5kICgzMS1iaXQpICovCisjZGVmaW5lIGlBQ0MzCSAweDA2CS8qIFIgPSBBICsgWCArIFkJICAgOyBzYXR1cmF0aW9uICovCisjZGVmaW5lIGlNQUNNViAgIDB4MDcJLyogUiA9IEEsIGFjYyArPSBYICogWSA+PiAzMSAqLworI2RlZmluZSBpQU5EWE9SICAweDA4CS8qIFIgPSAoQSAmIFgpIF4gWSAqLworI2RlZmluZSBpVFNUTkVHICAweDA5CS8qIFIgPSAoQSA+PSBZKSA/IFggOiB+WCAqLworI2RlZmluZSBpTElNSVRHRSAweDBhCS8qIFIgPSAoQSA+PSBZKSA/IFggOiBZICovCisjZGVmaW5lIGlMSU1JVExUIDB4MGIJLyogUiA9IChBIDwgWSkgPyBYIDogWSAqLworI2RlZmluZSBpTE9HCSAweDBjCS8qIFIgPSBsaW5lYXJfZGF0YSwgQSAobG9nX2RhdGEpLCBYIChtYXhfZXhwKSwgWSAoZm9ybWF0X3dvcmQpICovCisjZGVmaW5lIGlFWFAJIDB4MGQJLyogUiA9IGxvZ19kYXRhLCBBIChsaW5lYXJfZGF0YSksIFggKG1heF9leHApLCBZIChmb3JtYXRfd29yZCkgKi8KKyNkZWZpbmUgaUlOVEVSUCAgMHgwZQkvKiBSID0gQSArIChYICogKFkgLSBBKSA+PiAzMSkgIDsgc2F0dXJhdGlvbiAqLworI2RlZmluZSBpU0tJUCAgICAweDBmCS8qIFIgPSBBIChjY19yZWcpLCBYIChjb3VudCksIFkgKGNjX3Rlc3QpICovCisKKy8qIEdQUnMgKi8KKyNkZWZpbmUgRlhCVVMoeCkJKDB4MDAgKyAoeCkpCS8qIHggPSAweDAwIC0gMHgwZiAqLworI2RlZmluZSBFWFRJTih4KQkoMHgxMCArICh4KSkJLyogeCA9IDB4MDAgLSAweDBmICovCisjZGVmaW5lIEVYVE9VVCh4KQkoMHgyMCArICh4KSkJLyogeCA9IDB4MDAgLSAweDBmICovCisjZGVmaW5lIENfMDAwMDAwMDAJMHg0MAorI2RlZmluZSBDXzAwMDAwMDAxCTB4NDEKKyNkZWZpbmUgQ18wMDAwMDAwMgkweDQyCisjZGVmaW5lIENfMDAwMDAwMDMJMHg0MworI2RlZmluZSBDXzAwMDAwMDA0CTB4NDQKKyNkZWZpbmUgQ18wMDAwMDAwOAkweDQ1CisjZGVmaW5lIENfMDAwMDAwMTAJMHg0NgorI2RlZmluZSBDXzAwMDAwMDIwCTB4NDcKKyNkZWZpbmUgQ18wMDAwMDEwMAkweDQ4CisjZGVmaW5lIENfMDAwMTAwMDAJMHg0OQorI2RlZmluZSBDXzAwMDgwMDAwCTB4NGEKKyNkZWZpbmUgQ18xMDAwMDAwMAkweDRiCisjZGVmaW5lIENfMjAwMDAwMDAJMHg0YworI2RlZmluZSBDXzQwMDAwMDAwCTB4NGQKKyNkZWZpbmUgQ184MDAwMDAwMAkweDRlCisjZGVmaW5lIENfN2ZmZmZmZmYJMHg0ZgorI2RlZmluZSBDX2ZmZmZmZmZmCTB4NTAKKyNkZWZpbmUgQ19mZmZmZmZmZQkweDUxCisjZGVmaW5lIENfYzAwMDAwMDAJMHg1MgorI2RlZmluZSBDXzRmMWJiY2RjCTB4NTMKKyNkZWZpbmUgQ181YTdlZjlkYgkweDU0CisjZGVmaW5lIENfMDAxMDAwMDAJMHg1NQkJLyogPz8gKi8KKyNkZWZpbmUgR1BSX0FDQ1UJMHg1NgkJLyogQUNDVU0sIGFjY3VtdWxhdG9yICovCisjZGVmaW5lIEdQUl9DT05ECTB4NTcJCS8qIENDUiwgY29uZGl0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIEdQUl9OT0lTRTAJMHg1OAkJLyogbm9pc2Ugc291cmNlICovCisjZGVmaW5lIEdQUl9OT0lTRTEJMHg1OQkJLyogbm9pc2Ugc291cmNlICovCisjZGVmaW5lIEdQUl9JUlEJCTB4NWEJCS8qIElSUSByZWdpc3RlciAqLworI2RlZmluZSBHUFJfREJBQwkweDViCQkvKiBUUkFNIERlbGF5IEJhc2UgQWRkcmVzcyBDb3VudGVyICovCisjZGVmaW5lIEdQUih4KQkJKEZYR1BSRUdCQVNFICsgKHgpKSAvKiBmcmVlIEdQUnM6IHggPSAweDAwIC0gMHhmZiAqLworI2RlZmluZSBJVFJBTV9EQVRBKHgpCShUQU5LTUVNREFUQVJFR0JBU0UgKyAweDAwICsgKHgpKSAvKiB4ID0gMHgwMCAtIDB4N2YgKi8KKyNkZWZpbmUgRVRSQU1fREFUQSh4KQkoVEFOS01FTURBVEFSRUdCQVNFICsgMHg4MCArICh4KSkgLyogeCA9IDB4MDAgLSAweDFmICovCisjZGVmaW5lIElUUkFNX0FERFIoeCkJKFRBTktNRU1BRERSUkVHQkFTRSArIDB4MDAgKyAoeCkpIC8qIHggPSAweDAwIC0gMHg3ZiAqLworI2RlZmluZSBFVFJBTV9BRERSKHgpCShUQU5LTUVNQUREUlJFR0JBU0UgKyAweDgwICsgKHgpKSAvKiB4ID0gMHgwMCAtIDB4MWYgKi8KKworI2RlZmluZSBBX0ZYQlVTKHgpCSgweDAwICsgKHgpKQkvKiB4ID0gMHgwMCAtIDB4M2Y/ICovCisjZGVmaW5lIEFfRVhUSU4oeCkJKDB4NDAgKyAoeCkpCS8qIHggPSAweDAwIC0gMHgxZj8gKi8KKyNkZWZpbmUgQV9FWFRPVVQoeCkJKDB4NjAgKyAoeCkpCS8qIHggPSAweDAwIC0gMHgxZj8gKi8KKyNkZWZpbmUgQV9HUFIoeCkJKEFfRlhHUFJFR0JBU0UgKyAoeCkpCisKKy8qIGNjX3JlZyBjb25zdGFudHMgKi8KKyNkZWZpbmUgQ0NfUkVHX05PUk1BTElaRUQgQ18wMDAwMDAwMQorI2RlZmluZSBDQ19SRUdfQk9SUk9XCUNfMDAwMDAwMDIKKyNkZWZpbmUgQ0NfUkVHX01JTlVTCUNfMDAwMDAwMDQKKyNkZWZpbmUgQ0NfUkVHX1pFUk8JQ18wMDAwMDAwOAorI2RlZmluZSBDQ19SRUdfU0FUVVJBVEUJQ18wMDAwMDAxMAorI2RlZmluZSBDQ19SRUdfTk9OWkVSTwlDXzAwMDAwMTAwCisKKy8qIEZYIGJ1c2VzICovCisjZGVmaW5lIEZYQlVTX1BDTV9MRUZUCQkweDAwCisjZGVmaW5lIEZYQlVTX1BDTV9SSUdIVAkJMHgwMQorI2RlZmluZSBGWEJVU19QQ01fTEVGVF9SRUFSCTB4MDIKKyNkZWZpbmUgRlhCVVNfUENNX1JJR0hUX1JFQVIJMHgwMworI2RlZmluZSBGWEJVU19NSURJX0xFRlQJCTB4MDQKKyNkZWZpbmUgRlhCVVNfTUlESV9SSUdIVAkweDA1CisjZGVmaW5lIEZYQlVTX1BDTV9DRU5URVIJMHgwNgorI2RlZmluZSBGWEJVU19QQ01fTEZFCQkweDA3CisjZGVmaW5lIEZYQlVTX1BDTV9MRUZUX0ZST05UCTB4MDgKKyNkZWZpbmUgRlhCVVNfUENNX1JJR0hUX0ZST05UCTB4MDkKKyNkZWZpbmUgRlhCVVNfTUlESV9SRVZFUkIJMHgwYworI2RlZmluZSBGWEJVU19NSURJX0NIT1JVUwkweDBkCisjZGVmaW5lIEZYQlVTX1BDTV9MRUZUX1NJREUJMHgwZQorI2RlZmluZSBGWEJVU19QQ01fUklHSFRfU0lERQkweDBmCisjZGVmaW5lIEZYQlVTX1BUX0xFRlQJCTB4MTQKKyNkZWZpbmUgRlhCVVNfUFRfUklHSFQJCTB4MTUKKworLyogSW5wdXRzICovCisjZGVmaW5lIEVYVElOX0FDOTdfTAkgICAweDAwCS8qIEFDJzk3IGNhcHR1cmUgY2hhbm5lbCAtIGxlZnQgKi8KKyNkZWZpbmUgRVhUSU5fQUM5N19SCSAgIDB4MDEJLyogQUMnOTcgY2FwdHVyZSBjaGFubmVsIC0gcmlnaHQgKi8KKyNkZWZpbmUgRVhUSU5fU1BESUZfQ0RfTCAgIDB4MDIJLyogaW50ZXJuYWwgUy9QRElGIENEIC0gb25ib2FyZCAtIGxlZnQgKi8KKyNkZWZpbmUgRVhUSU5fU1BESUZfQ0RfUiAgIDB4MDMJLyogaW50ZXJuYWwgUy9QRElGIENEIC0gb25ib2FyZCAtIHJpZ2h0ICovCisjZGVmaW5lIEVYVElOX1pPT01fTAkgICAweDA0CS8qIFpvb20gVmlkZW8gSTJTIC0gbGVmdCAqLworI2RlZmluZSBFWFRJTl9aT09NX1IJICAgMHgwNQkvKiBab29tIFZpZGVvIEkyUyAtIHJpZ2h0ICovCisjZGVmaW5lIEVYVElOX1RPU0xJTktfTAkgICAweDA2CS8qIExpdmVEcml2ZSAtIFRPU0xpbmsgT3B0aWNhbCAtIGxlZnQgKi8KKyNkZWZpbmUgRVhUSU5fVE9TTElOS19SICAgIDB4MDcJLyogTGl2ZURyaXZlIC0gVE9TTGluayBPcHRpY2FsIC0gcmlnaHQgKi8KKyNkZWZpbmUgRVhUSU5fTElORTFfTAkgICAweDA4CS8qIExpdmVEcml2ZSAtIExpbmUvTWljIDEgLSBsZWZ0ICovCisjZGVmaW5lIEVYVElOX0xJTkUxX1IJICAgMHgwOQkvKiBMaXZlRHJpdmUgLSBMaW5lL01pYyAxIC0gcmlnaHQgKi8KKyNkZWZpbmUgRVhUSU5fQ09BWF9TUERJRl9MIDB4MGEJLyogTGl2ZURyaXZlIC0gQ29heGlhbCBTL1BESUYgLSBsZWZ0ICovCisjZGVmaW5lIEVYVElOX0NPQVhfU1BESUZfUiAweDBiIC8qIExpdmVEcml2ZSAtIENvYXhpYWwgUy9QRElGIC0gcmlnaHQgKi8KKyNkZWZpbmUgRVhUSU5fTElORTJfTAkgICAweDBjCS8qIExpdmVEcml2ZSAtIExpbmUvTWljIDIgLSBsZWZ0ICovCisjZGVmaW5lIEVYVElOX0xJTkUyX1IJICAgMHgwZAkvKiBMaXZlRHJpdmUgLSBMaW5lL01pYyAyIC0gcmlnaHQgKi8KKworLyogT3V0cHV0cyAqLworI2RlZmluZSBFWFRPVVRfQUM5N19MCSAgIDB4MDAJLyogQUMnOTcgcGxheWJhY2sgY2hhbm5lbCAtIGxlZnQgKi8KKyNkZWZpbmUgRVhUT1VUX0FDOTdfUgkgICAweDAxCS8qIEFDJzk3IHBsYXliYWNrIGNoYW5uZWwgLSByaWdodCAqLworI2RlZmluZSBFWFRPVVRfVE9TTElOS19MICAgMHgwMgkvKiBMaXZlRHJpdmUgLSBUT1NMaW5rIE9wdGljYWwgLSBsZWZ0ICovCisjZGVmaW5lIEVYVE9VVF9UT1NMSU5LX1IgICAweDAzCS8qIExpdmVEcml2ZSAtIFRPU0xpbmsgT3B0aWNhbCAtIHJpZ2h0ICovCisjZGVmaW5lIEVYVE9VVF9BQzk3X0NFTlRFUiAweDA0CS8qIFNCIExpdmUgNS4xIC0gY2VudGVyICovCisjZGVmaW5lIEVYVE9VVF9BQzk3X0xGRQkgICAweDA1IC8qIFNCIExpdmUgNS4xIC0gTEZFICovCisjZGVmaW5lIEVYVE9VVF9IRUFEUEhPTkVfTCAweDA2CS8qIExpdmVEcml2ZSAtIEhlYWRwaG9uZSAtIGxlZnQgKi8KKyNkZWZpbmUgRVhUT1VUX0hFQURQSE9ORV9SIDB4MDcJLyogTGl2ZURyaXZlIC0gSGVhZHBob25lIC0gcmlnaHQgKi8KKyNkZWZpbmUgRVhUT1VUX1JFQVJfTAkgICAweDA4CS8qIFJlYXIgY2hhbm5lbCAtIGxlZnQgKi8KKyNkZWZpbmUgRVhUT1VUX1JFQVJfUgkgICAweDA5CS8qIFJlYXIgY2hhbm5lbCAtIHJpZ2h0ICovCisjZGVmaW5lIEVYVE9VVF9BRENfQ0FQX0wgICAweDBhCS8qIEFEQyBDYXB0dXJlIGJ1ZmZlciAtIGxlZnQgKi8KKyNkZWZpbmUgRVhUT1VUX0FEQ19DQVBfUiAgIDB4MGIJLyogQURDIENhcHR1cmUgYnVmZmVyIC0gcmlnaHQgKi8KKyNkZWZpbmUgRVhUT1VUX01JQ19DQVAJICAgMHgwYwkvKiBNSUMgQ2FwdHVyZSBidWZmZXIgKi8KKyNkZWZpbmUgRVhUT1VUX0FDOTdfUkVBUl9MIDB4MGQJLyogU0IgTGl2ZSA1LjEgKGMpIDIwMDMgLSBSZWFyIExlZnQgKi8KKyNkZWZpbmUgRVhUT1VUX0FDOTdfUkVBUl9SIDB4MGUJLyogU0IgTGl2ZSA1LjEgKGMpIDIwMDMgLSBSZWFyIFJpZ2h0ICovCisjZGVmaW5lIEVYVE9VVF9BQ0VOVEVSCSAgIDB4MTEgLyogQW5hbG9nIENlbnRlciAqLworI2RlZmluZSBFWFRPVVRfQUxGRQkgICAweDEyIC8qIEFuYWxvZyBMRkUgKi8KKworLyogQXVkaWd5IElucHV0cyAqLworI2RlZmluZSBBX0VYVElOX0FDOTdfTAkJMHgwMAkvKiBBQyc5NyBjYXB0dXJlIGNoYW5uZWwgLSBsZWZ0ICovCisjZGVmaW5lIEFfRVhUSU5fQUM5N19SCQkweDAxCS8qIEFDJzk3IGNhcHR1cmUgY2hhbm5lbCAtIHJpZ2h0ICovCisjZGVmaW5lIEFfRVhUSU5fU1BESUZfQ0RfTAkweDAyCS8qIGRpZ2l0YWwgQ0QgbGVmdCAqLworI2RlZmluZSBBX0VYVElOX1NQRElGX0NEX1IJMHgwMwkvKiBkaWdpdGFsIENEIGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRJTl9PUFRfU1BESUZfTCAgICAgMHgwNCAgICAvKiBhdWRpZ3kgZHJpdmUgT3B0aWNhbCBTUERJRiAtIGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRJTl9PUFRfU1BESUZfUiAgICAgMHgwNSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ICovIAorI2RlZmluZSBBX0VYVElOX0xJTkUyX0wJCTB4MDgJLyogYXVkaWd5IGRyaXZlIGxpbmUyL21pYzIgLSBsZWZ0ICovCisjZGVmaW5lIEFfRVhUSU5fTElORTJfUgkJMHgwOQkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ICovCisjZGVmaW5lIEFfRVhUSU5fQURDX0wJCTB4MGEgICAgLyogUGhpbGlwcyBBREMgLSBsZWZ0ICovCisjZGVmaW5lIEFfRVhUSU5fQURDX1IJCTB4MGIgICAgLyogICAgICAgICAgICAgICByaWdodCAqLworI2RlZmluZSBBX0VYVElOX0FVWDJfTAkJMHgwYwkvKiBhdWRpZ3kgZHJpdmUgYXV4MiAtIGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRJTl9BVVgyX1IJCTB4MGQJLyogICAgICAgICAgICAgICAgICAgLSByaWdodCAqLworCisvKiBBdWRpZ2l5IE91dHB1dHMgKi8KKyNkZWZpbmUgQV9FWFRPVVRfRlJPTlRfTAkweDAwCS8qIGRpZ2l0YWwgZnJvbnQgbGVmdCAqLworI2RlZmluZSBBX0VYVE9VVF9GUk9OVF9SCTB4MDEJLyogICAgICAgICAgICAgICByaWdodCAqLworI2RlZmluZSBBX0VYVE9VVF9DRU5URVIJCTB4MDIJLyogZGlnaXRhbCBmcm9udCBjZW50ZXIgKi8KKyNkZWZpbmUgQV9FWFRPVVRfTEZFCQkweDAzCS8qIGRpZ2l0YWwgZnJvbnQgbGZlICovCisjZGVmaW5lIEFfRVhUT1VUX0hFQURQSE9ORV9MCTB4MDQJLyogaGVhZHBob25lIGF1ZGlneSBkcml2ZSBsZWZ0ICovCisjZGVmaW5lIEFfRVhUT1VUX0hFQURQSE9ORV9SCTB4MDUJLyogICAgICAgICAgICAgICAgICAgICAgICByaWdodCAqLworI2RlZmluZSBBX0VYVE9VVF9SRUFSX0wJCTB4MDYJLyogZGlnaXRhbCByZWFyIGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfUkVBUl9SCQkweDA3CS8qICAgICAgICAgICAgICByaWdodCAqLworI2RlZmluZSBBX0VYVE9VVF9BRlJPTlRfTAkweDA4CS8qIGFuYWxvZyBmcm9udCBsZWZ0ICovCisjZGVmaW5lIEFfRVhUT1VUX0FGUk9OVF9SCTB4MDkJLyogICAgICAgICAgICAgIHJpZ2h0ICovCisjZGVmaW5lIEFfRVhUT1VUX0FDRU5URVIJMHgwYQkvKiBhbmFsb2cgY2VudGVyICovCisjZGVmaW5lIEFfRVhUT1VUX0FMRkUJCTB4MGIJLyogYW5hbG9nIExGRSAqLworI2RlZmluZSBBX0VYVE9VVF9BU0lERV9MCTB4MGMJLyogYW5hbG9nIHNpZGUgbGVmdCAgLSBBdWRpZ3kgMiBaUyAqLworI2RlZmluZSBBX0VYVE9VVF9BU0lERV9SCTB4MGQJLyogICAgICAgICAgICAgcmlnaHQgLSBBdWRpZ3kgMiBaUyAqLworI2RlZmluZSBBX0VYVE9VVF9BUkVBUl9MCTB4MGUJLyogYW5hbG9nIHJlYXIgbGVmdCAqLworI2RlZmluZSBBX0VYVE9VVF9BUkVBUl9SCTB4MGYJLyogICAgICAgICAgICAgcmlnaHQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQUM5N19MCQkweDEwCS8qIEFDOTcgbGVmdCAoZnJvbnQpICovCisjZGVmaW5lIEFfRVhUT1VUX0FDOTdfUgkJMHgxMQkvKiAgICAgIHJpZ2h0ICovCisjZGVmaW5lIEFfRVhUT1VUX0FEQ19DQVBfTAkweDE2CS8qIEFEQyBjYXB0dXJlIGJ1ZmZlciBsZWZ0ICovCisjZGVmaW5lIEFfRVhUT1VUX0FEQ19DQVBfUgkweDE3CS8qICAgICAgICAgICAgICAgICAgICByaWdodCAqLworI2RlZmluZSBBX0VYVE9VVF9NSUNfQ0FQCTB4MTgJLyogTWljIGNhcHR1cmUgYnVmZmVyICovCisKKy8qIEF1ZGlneSBjb25zdGFudHMgKi8KKyNkZWZpbmUgQV9DXzAwMDAwMDAwCTB4YzAKKyNkZWZpbmUgQV9DXzAwMDAwMDAxCTB4YzEKKyNkZWZpbmUgQV9DXzAwMDAwMDAyCTB4YzIKKyNkZWZpbmUgQV9DXzAwMDAwMDAzCTB4YzMKKyNkZWZpbmUgQV9DXzAwMDAwMDA0CTB4YzQKKyNkZWZpbmUgQV9DXzAwMDAwMDA4CTB4YzUKKyNkZWZpbmUgQV9DXzAwMDAwMDEwCTB4YzYKKyNkZWZpbmUgQV9DXzAwMDAwMDIwCTB4YzcKKyNkZWZpbmUgQV9DXzAwMDAwMTAwCTB4YzgKKyNkZWZpbmUgQV9DXzAwMDEwMDAwCTB4YzkKKyNkZWZpbmUgQV9DXzAwMDAwODAwCTB4Y2EKKyNkZWZpbmUgQV9DXzEwMDAwMDAwCTB4Y2IKKyNkZWZpbmUgQV9DXzIwMDAwMDAwCTB4Y2MKKyNkZWZpbmUgQV9DXzQwMDAwMDAwCTB4Y2QKKyNkZWZpbmUgQV9DXzgwMDAwMDAwCTB4Y2UKKyNkZWZpbmUgQV9DXzdmZmZmZmZmCTB4Y2YKKyNkZWZpbmUgQV9DX2ZmZmZmZmZmCTB4ZDAKKyNkZWZpbmUgQV9DX2ZmZmZmZmZlCTB4ZDEKKyNkZWZpbmUgQV9DX2MwMDAwMDAwCTB4ZDIKKyNkZWZpbmUgQV9DXzRmMWJiY2RjCTB4ZDMKKyNkZWZpbmUgQV9DXzVhN2VmOWRiCTB4ZDQKKyNkZWZpbmUgQV9DXzAwMTAwMDAwCTB4ZDUKKyNkZWZpbmUgQV9HUFJfQUNDVQkweGQ2CQkvKiBBQ0NVTSwgYWNjdW11bGF0b3IgKi8KKyNkZWZpbmUgQV9HUFJfQ09ORAkweGQ3CQkvKiBDQ1IsIGNvbmRpdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBBX0dQUl9OT0lTRTAJMHhkOAkJLyogbm9pc2Ugc291cmNlICovCisjZGVmaW5lIEFfR1BSX05PSVNFMQkweGQ5CQkvKiBub2lzZSBzb3VyY2UgKi8KKyNkZWZpbmUgQV9HUFJfSVJRCTB4ZGEJCS8qIElSUSByZWdpc3RlciAqLworI2RlZmluZSBBX0dQUl9EQkFDCTB4ZGIJCS8qIFRSQU0gRGVsYXkgQmFzZSBBZGRyZXNzIENvdW50ZXIgLSBpbnRlcm5hbCAqLworI2RlZmluZSBBX0dQUl9EQkFDRQkweGRlCQkvKiBUUkFNIERlbGF5IEJhc2UgQWRkcmVzcyBDb3VudGVyIC0gZXh0ZXJuYWwgKi8KKworLyogZGVmaW5pdGlvbnMgZm9yIGRlYnVnIHJlZ2lzdGVyICovCisjZGVmaW5lIEVNVTEwSzFfREJHX1pDCQkJMHg4MDAwMDAwMAkvKiB6ZXJvIHRyYW0gY291bnRlciAqLworI2RlZmluZSBFTVUxMEsxX0RCR19TQVRVUkFUSU9OX09DQ1VSRUQJMHgwMjAwMDAwMAkvKiBzYXR1cmF0aW9uIGNvbnRyb2wgKi8KKyNkZWZpbmUgRU1VMTBLMV9EQkdfU0FUVVJBVElPTl9BRERSCTB4MDFmZjAwMDAJLyogc2F0dXJhdGlvbiBhZGRyZXNzICovCisjZGVmaW5lIEVNVTEwSzFfREJHX1NJTkdMRV9TVEVQCQkweDAwMDA4MDAwCS8qIHNpbmdsZSBzdGVwIG1vZGUgKi8KKyNkZWZpbmUgRU1VMTBLMV9EQkdfU1RFUAkJMHgwMDAwNDAwMAkvKiBzdGFydCBzaW5nbGUgc3RlcCAqLworI2RlZmluZSBFTVUxMEsxX0RCR19DT05ESVRJT05fQ09ERQkweDAwMDAzZTAwCS8qIGNvbmRpdGlvbiBjb2RlICovCisjZGVmaW5lIEVNVTEwSzFfREJHX1NJTkdMRV9TVEVQX0FERFIJMHgwMDAwMDFmZgkvKiBzaW5nbGUgc3RlcCBhZGRyZXNzICovCisKKy8qIHRhbmsgbWVtb3J5IGFkZHJlc3MgbGluZSAqLworI2lmbmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIFRBTktNRU1BRERSUkVHX0FERFJfTUFTSyAweDAwMGZmZmZmCS8qIDIwIGJpdCB0YW5rIGFkZHJlc3MgZmllbGQJCQkqLworI2RlZmluZSBUQU5LTUVNQUREUlJFR19DTEVBUgkgMHgwMDgwMDAwMAkvKiBDbGVhciB0YW5rIG1lbW9yeQkJCQkqLworI2RlZmluZSBUQU5LTUVNQUREUlJFR19BTElHTgkgMHgwMDQwMDAwMAkvKiBBbGlnbiByZWFkIG9yIHdyaXRlIHJlbGF0aXZlIHRvIHRhbmsgYWNjZXNzCSovCisjZGVmaW5lIFRBTktNRU1BRERSUkVHX1dSSVRFCSAweDAwMjAwMDAwCS8qIFdyaXRlIHRvIHRhbmsgbWVtb3J5CQkJCSovCisjZGVmaW5lIFRBTktNRU1BRERSUkVHX1JFQUQJIDB4MDAxMDAwMDAJLyogUmVhZCBmcm9tIHRhbmsgbWVtb3J5CQkJKi8KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGludGVybmFsX3RyYW1fc2l6ZTsJLyogaW4gc2FtcGxlcyAqLworCXVuc2lnbmVkIGludCBleHRlcm5hbF90cmFtX3NpemU7CS8qIGluIHNhbXBsZXMgKi8KKwljaGFyIGZ4YnVzX25hbWVzWzE2XVszMl07CQkvKiBuYW1lcyBvZiBGWEJVU2VzICovCisJY2hhciBleHRpbl9uYW1lc1sxNl1bMzJdOwkJLyogbmFtZXMgb2YgZXh0ZXJuYWwgaW5wdXRzICovCisJY2hhciBleHRvdXRfbmFtZXNbMzJdWzMyXTsJCS8qIG5hbWVzIG9mIGV4dGVybmFsIG91dHB1dHMgKi8KKwl1bnNpZ25lZCBpbnQgZ3ByX2NvbnRyb2xzOwkJLyogY291bnQgb2YgR1BSIGNvbnRyb2xzICovCit9IGVtdTEwazFfZng4MDEwX2luZm9fdDsKKworI2RlZmluZSBFTVUxMEsxX0dQUl9UUkFOU0xBVElPTl9OT05FCQkwCisjZGVmaW5lIEVNVTEwSzFfR1BSX1RSQU5TTEFUSU9OX1RBQkxFMTAwCTEKKyNkZWZpbmUgRU1VMTBLMV9HUFJfVFJBTlNMQVRJT05fQkFTUwkJMgorI2RlZmluZSBFTVUxMEsxX0dQUl9UUkFOU0xBVElPTl9UUkVCTEUJCTMKKyNkZWZpbmUgRU1VMTBLMV9HUFJfVFJBTlNMQVRJT05fT05PRkYJCTQKKworZW51bSBlbXUxMGsxX2N0bF9lbGVtX2lmYWNlIHsKKwlFTVUxMEsxX0NUTF9FTEVNX0lGQUNFX01JWEVSID0gMiwJLyogdmlydHVhbCBtaXhlciBkZXZpY2UgKi8KKwlFTVUxMEsxX0NUTF9FTEVNX0lGQUNFX1BDTSA9IDMsCQkvKiBQQ00gZGV2aWNlICovCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHBhZDsJCS8qIGRvbid0IHVzZSAqLworCWludCBpZmFjZTsJCQkvKiBpbnRlcmZhY2UgaWRlbnRpZmllciAqLworCXVuc2lnbmVkIGludCBkZXZpY2U7CQkvKiBkZXZpY2UvY2xpZW50IG51bWJlciAqLworCXVuc2lnbmVkIGludCBzdWJkZXZpY2U7CQkvKiBzdWJkZXZpY2UgKHN1YnN0cmVhbSkgbnVtYmVyICovCisJdW5zaWduZWQgY2hhciBuYW1lWzQ0XTsJCS8qIEFTQ0lJIG5hbWUgb2YgaXRlbSAqLyAKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CQkvKiBpbmRleCBvZiBpdGVtICovCit9IGVtdTEwazFfY3RsX2VsZW1faWRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWVtdTEwazFfY3RsX2VsZW1faWRfdCBpZDsJLyogZnVsbCBjb250cm9sIElEIGRlZmluaXRpb24gKi8KKwl1bnNpZ25lZCBpbnQgdmNvdW50OwkJLyogdmlzaWJsZSBjb3VudCAqLworCXVuc2lnbmVkIGludCBjb3VudDsJCS8qIGNvdW50IG9mIEdQUiAoMS4uMTYpICovCisJdW5zaWduZWQgc2hvcnQgZ3ByWzMyXTsJCS8qIEdQUiBudW1iZXIocykgKi8KKwl1bnNpZ25lZCBpbnQgdmFsdWVbMzJdOwkJLyogaW5pdGlhbCB2YWx1ZXMgKi8KKwl1bnNpZ25lZCBpbnQgbWluOwkJLyogbWluaW11bSByYW5nZSAqLworCXVuc2lnbmVkIGludCBtYXg7CQkvKiBtYXhpbXVtIHJhbmdlICovCisJdW5zaWduZWQgaW50IHRyYW5zbGF0aW9uOwkvKiB0cmFuc2xhdGlvbiB0eXBlIChFTVUxMEsxX0dQUl9UUkFOU0xBVElPTiopICovCisJdW5zaWduZWQgaW50ICp0bHY7Cit9IGVtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyIG5hbWVbMTI4XTsKKworCXVuc2lnbmVkIGxvbmcgZ3ByX3ZhbGlkWzB4MjAwLyhzaXplb2YodW5zaWduZWQgbG9uZykqOCldOyAvKiBiaXRtYXNrIG9mIHZhbGlkIGluaXRpYWxpemVycyAqLworCXVpbnQzMl90ICpncHJfbWFwOwkJICAvKiBpbml0aWFsaXplcnMgKi8KKworCXVuc2lnbmVkIGludCBncHJfYWRkX2NvbnRyb2xfY291bnQ7IC8qIGNvdW50IG9mIEdQUiBjb250cm9scyB0byBhZGQvcmVwbGFjZSAqLworCWVtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByX3QgKmdwcl9hZGRfY29udHJvbHM7IC8qIEdQUiBjb250cm9scyB0byBhZGQvcmVwbGFjZSAqLworCisJdW5zaWduZWQgaW50IGdwcl9kZWxfY29udHJvbF9jb3VudDsgLyogY291bnQgb2YgR1BSIGNvbnRyb2xzIHRvIHJlbW92ZSAqLworCWVtdTEwazFfY3RsX2VsZW1faWRfdCAqZ3ByX2RlbF9jb250cm9sczsgLyogSURzIG9mIEdQUiBjb250cm9scyB0byByZW1vdmUgKi8KKworCXVuc2lnbmVkIGludCBncHJfbGlzdF9jb250cm9sX2NvdW50OyAvKiBjb3VudCBvZiBHUFIgY29udHJvbHMgdG8gbGlzdCAqLworCXVuc2lnbmVkIGludCBncHJfbGlzdF9jb250cm9sX3RvdGFsOyAvKiB0b3RhbCBjb3VudCBvZiBHUFIgY29udHJvbHMgKi8KKwllbXUxMGsxX2Z4ODAxMF9jb250cm9sX2dwcl90ICpncHJfbGlzdF9jb250cm9sczsgLyogbGlzdGVkIEdQUiBjb250cm9scyAqLworCisJdW5zaWduZWQgbG9uZyB0cmFtX3ZhbGlkWzB4MTAwLyhzaXplb2YodW5zaWduZWQgbG9uZykqOCldOyAvKiBiaXRtYXNrIG9mIHZhbGlkIGluaXRpYWxpemVycyAqLworCXVpbnQzMl90ICp0cmFtX2RhdGFfbWFwOwkvKiBkYXRhIGluaXRpYWxpemVycyAqLworCXVpbnQzMl90ICp0cmFtX2FkZHJfbWFwOwkvKiBtYXAgaW5pdGlhbGl6ZXJzICovCisKKwl1bnNpZ25lZCBsb25nIGNvZGVfdmFsaWRbMTAyNC8oc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKjgpXTsgIC8qIGJpdG1hc2sgb2YgdmFsaWQgaW5zdHJ1Y3Rpb25zICovCisJdWludDMyX3QgKmNvZGU7CQkJLyogb25lIGluc3RydWN0aW9uIC0gNjQgYml0cyAqLworfSBlbXUxMGsxX2Z4ODAxMF9jb2RlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgYWRkcmVzczsJCS8qIDMxLmJpdCA9PSAxIC0+IGV4dGVybmFsIFRSQU0gKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsJCS8qIHNpemUgaW4gc2FtcGxlcyAoNCBieXRlcykgKi8KKwl1bnNpZ25lZCBpbnQgKnNhbXBsZXM7CQkvKiBwb2ludGVyIHRvIHNhbXBsZXMgKDIwLWJpdCkgKi8KKwkJCQkJLyogTlVMTC0+Y2xlYXIgbWVtb3J5ICovCit9IGVtdTEwazFfZng4MDEwX3RyYW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzdWJzdHJlYW07CQkvKiBzdWJzdHJlYW0gbnVtYmVyICovCisJdW5zaWduZWQgaW50IHJlczE7CQkvKiByZXNlcnZlZCAqLworCXVuc2lnbmVkIGludCBjaGFubmVsczsJCS8qIDE2LWJpdCBjaGFubmVscyBjb3VudCwgemVybyA9IHJlbW92ZSB0aGlzIHN1YnN0cmVhbSAqLworCXVuc2lnbmVkIGludCB0cmFtX3N0YXJ0OwkvKiByaW5nIGJ1ZmZlciBwb3NpdGlvbiBpbiBUUkFNIChpbiBzYW1wbGVzKSAqLworCXVuc2lnbmVkIGludCBidWZmZXJfc2l6ZTsJLyogY291bnQgb2YgYnVmZmVyZWQgc2FtcGxlcyAqLworCXVuc2lnbmVkIHNob3J0IGdwcl9zaXplOwkJLyogR1BSIGNvbnRhaW5pbmcgc2l6ZSBvZiByaW5nYnVmZmVyIGluIHNhbXBsZXMgKGhvc3QpICovCisJdW5zaWduZWQgc2hvcnQgZ3ByX3B0cjsJCS8qIEdQUiBjb250YWluaW5nIGN1cnJlbnQgcG9pbnRlciBpbiB0aGUgcmluZyBidWZmZXIgKGhvc3QgPSByZXNldCwgRlg4MDEwKSAqLworCXVuc2lnbmVkIHNob3J0IGdwcl9jb3VudDsJLyogR1BSIGNvbnRhaW5pbmcgY291bnQgb2Ygc2FtcGxlcyBiZXR3ZWVuIHR3byBpbnRlcnJ1cHRzIChob3N0KSAqLworCXVuc2lnbmVkIHNob3J0IGdwcl90bXBjb3VudDsJLyogR1BSIGNvbnRhaW5pbmcgY3VycmVudCBjb3VudCBvZiBzYW1wbGVzIHRvIGludGVycnVwdCAoaG9zdCA9IHNldCwgRlg4MDEwKSAqLworCXVuc2lnbmVkIHNob3J0IGdwcl90cmlnZ2VyOwkvKiBHUFIgY29udGFpbmluZyB0cmlnZ2VyIChhY3RpdmF0ZSkgaW5mb3JtYXRpb24gKGhvc3QpICovCisJdW5zaWduZWQgc2hvcnQgZ3ByX3J1bm5pbmc7CS8qIEdQUiBjb250YWluaW5nIGluZm8gaWYgUENNIGlzIHJ1bm5pbmcgKEZYODAxMCkgKi8KKwl1bnNpZ25lZCBjaGFyIHBhZDsJCS8qIHJlc2VydmVkICovCisJdW5zaWduZWQgY2hhciBldHJhbVszMl07CS8qIGV4dGVybmFsIFRSQU0gYWRkcmVzcyAmIGRhdGEgKG9uZSBwZXIgY2hhbm5lbCkgKi8KKwl1bnNpZ25lZCBpbnQgcmVzMjsJCS8qIHJlc2VydmVkICovCit9IGVtdTEwazFfZng4MDEwX3BjbV90OworCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfSU5GTwlfSU9SICgnSCcsIDB4MTAsIGVtdTEwazFfZng4MDEwX2luZm9fdCkKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9DT0RFX1BPS0UJX0lPVyAoJ0gnLCAweDExLCBlbXUxMGsxX2Z4ODAxMF9jb2RlX3QpCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfQ09ERV9QRUVLCV9JT1dSKCdIJywgMHgxMiwgZW11MTBrMV9meDgwMTBfY29kZV90KQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1RSQU1fU0VUVVAJX0lPVyAoJ0gnLCAweDIwLCBpbnQpCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfVFJBTV9QT0tFCV9JT1cgKCdIJywgMHgyMSwgZW11MTBrMV9meDgwMTBfdHJhbV90KQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1RSQU1fUEVFSwlfSU9XUignSCcsIDB4MjIsIGVtdTEwazFfZng4MDEwX3RyYW1fdCkKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9QQ01fUE9LRQlfSU9XICgnSCcsIDB4MzAsIGVtdTEwazFfZng4MDEwX3BjbV90KQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1BDTV9QRUVLCV9JT1dSKCdIJywgMHgzMSwgZW11MTBrMV9meDgwMTBfcGNtX3QpCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfUFZFUlNJT04JX0lPUiAoJ0gnLCAweDQwLCBpbnQpCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfU1RPUAlfSU8gICgnSCcsIDB4ODApCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfQ09OVElOVUUJX0lPICAoJ0gnLCAweDgxKQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1pFUk9fVFJBTV9DT1VOVEVSIF9JTyAoJ0gnLCAweDgyKQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1NJTkdMRV9TVEVQCV9JT1cgKCdIJywgMHg4MywgaW50KQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX0RCR19SRUFECV9JT1IgKCdIJywgMHg4NCwgaW50KQorCisjZW5kaWYJLyogX19TT1VORF9FTVUxMEsxX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9oZHNwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvaGRzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZGFmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvaGRzcC5oCkBAIC0wLDAgKzEsMTEzIEBACisjaWZuZGVmIF9fU09VTkRfSERTUF9ICisjZGVmaW5lIF9fU09VTkRfSERTUF9ICisKKy8qCisgKiAgIENvcHlyaWdodCAoQykgMjAwMyBUaG9tYXMgQ2hhcmJvbm5lbCAodGhvbWFzQHVuZGF0YS5vcmcpCisgKiAgICAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgSERTUF9NQVRSSVhfTUlYRVJfU0laRSAyMDQ4CisKK3R5cGVkZWYgZW51bSB7CisJRGlnaWZhY2UsCisJTXVsdGlmYWNlLAorCUg5NjUyLAorCUg5NjMyLAorCVJQTSwKKwlVbmRlZmluZWQsCit9IEhEU1BfSU9fVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9oZHNwX3BlYWtfcm1zIGhkc3BfcGVha19ybXNfdDsKKworc3RydWN0IF9zbmRfaGRzcF9wZWFrX3JtcyB7CisJdWludDMyX3QgaW5wdXRfcGVha3NbMjZdOworCXVpbnQzMl90IHBsYXliYWNrX3BlYWtzWzI2XTsKKwl1aW50MzJfdCBvdXRwdXRfcGVha3NbMjhdOworCXVpbnQ2NF90IGlucHV0X3Jtc1syNl07CisJdWludDY0X3QgcGxheWJhY2tfcm1zWzI2XTsKKwkvKiBUaGVzZSBhcmUgb25seSB1c2VkIGZvciBIOTZ4eCBjYXJkcyAqLworCXVpbnQ2NF90IG91dHB1dF9ybXNbMjZdOworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQX0lPQ1RMX0dFVF9QRUFLX1JNUyBfSU9SKCdIJywgMHg0MCwgaGRzcF9wZWFrX3Jtc190KQorCit0eXBlZGVmIHN0cnVjdCBfc25kX2hkc3BfY29uZmlnX2luZm8gaGRzcF9jb25maWdfaW5mb190OworCitzdHJ1Y3QgX3NuZF9oZHNwX2NvbmZpZ19pbmZvIHsKKwl1bnNpZ25lZCBjaGFyIHByZWZfc3luY19yZWY7CisJdW5zaWduZWQgY2hhciB3b3JkY2xvY2tfc3luY19jaGVjazsKKwl1bnNpZ25lZCBjaGFyIHNwZGlmX3N5bmNfY2hlY2s7CisJdW5zaWduZWQgY2hhciBhZGF0c3luY19zeW5jX2NoZWNrOworCXVuc2lnbmVkIGNoYXIgYWRhdF9zeW5jX2NoZWNrWzNdOworCXVuc2lnbmVkIGNoYXIgc3BkaWZfaW47CisJdW5zaWduZWQgY2hhciBzcGRpZl9vdXQ7CisJdW5zaWduZWQgY2hhciBzcGRpZl9wcm9mZXNzaW9uYWw7CisJdW5zaWduZWQgY2hhciBzcGRpZl9lbXBoYXNpczsKKwl1bnNpZ25lZCBjaGFyIHNwZGlmX25vbmF1ZGlvOworCXVuc2lnbmVkIGludCBzcGRpZl9zYW1wbGVfcmF0ZTsKKwl1bnNpZ25lZCBpbnQgc3lzdGVtX3NhbXBsZV9yYXRlOworCXVuc2lnbmVkIGludCBhdXRvc3luY19zYW1wbGVfcmF0ZTsKKwl1bnNpZ25lZCBjaGFyIHN5c3RlbV9jbG9ja19tb2RlOworCXVuc2lnbmVkIGNoYXIgY2xvY2tfc291cmNlOworCXVuc2lnbmVkIGNoYXIgYXV0b3N5bmNfcmVmOworCXVuc2lnbmVkIGNoYXIgbGluZV9vdXQ7CisJdW5zaWduZWQgY2hhciBwYXNzdGhydTsgCisJdW5zaWduZWQgY2hhciBkYV9nYWluOworCXVuc2lnbmVkIGNoYXIgYWRfZ2FpbjsKKwl1bnNpZ25lZCBjaGFyIHBob25lX2dhaW47CisJdW5zaWduZWQgY2hhciB4bHJfYnJlYWtvdXRfY2FibGU7CisJdW5zaWduZWQgY2hhciBhbmFsb2dfZXh0ZW5zaW9uX2JvYXJkOworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQX0lPQ1RMX0dFVF9DT05GSUdfSU5GTyBfSU9SKCdIJywgMHg0MSwgaGRzcF9jb25maWdfaW5mb190KQorCit0eXBlZGVmIHN0cnVjdCBfc25kX2hkc3BfZmlybXdhcmUgaGRzcF9maXJtd2FyZV90OworCitzdHJ1Y3QgX3NuZF9oZHNwX2Zpcm13YXJlIHsKKwl2b2lkICpmaXJtd2FyZV9kYXRhOwkvKiAyNDQxMyB4IDQgYnl0ZXMgKi8KK307CisKKyNkZWZpbmUgU05EUlZfSERTUF9JT0NUTF9VUExPQURfRklSTVdBUkUgX0lPVygnSCcsIDB4NDIsIGhkc3BfZmlybXdhcmVfdCkKKwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9oZHNwX3ZlcnNpb24gaGRzcF92ZXJzaW9uX3Q7CisKK3N0cnVjdCBfc25kX2hkc3BfdmVyc2lvbiB7CisJSERTUF9JT19UeXBlIGlvX3R5cGU7CisJdW5zaWduZWQgc2hvcnQgZmlybXdhcmVfcmV2OworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQX0lPQ1RMX0dFVF9WRVJTSU9OIF9JT1IoJ0gnLCAweDQzLCBoZHNwX3ZlcnNpb25fdCkKKwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9oZHNwX21peGVyIGhkc3BfbWl4ZXJfdDsKKworc3RydWN0IF9zbmRfaGRzcF9taXhlciB7CisJdW5zaWduZWQgc2hvcnQgbWF0cml4W0hEU1BfTUFUUklYX01JWEVSX1NJWkVdOworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQX0lPQ1RMX0dFVF9NSVhFUiBfSU9SKCdIJywgMHg0NCwgaGRzcF9taXhlcl90KQorCit0eXBlZGVmIHN0cnVjdCBfc25kX2hkc3BfOTYzMl9hZWIgaGRzcF85NjMyX2FlYl90OworCitzdHJ1Y3QgX3NuZF9oZHNwXzk2MzJfYWViIHsKKwlpbnQgYWViaTsKKwlpbnQgYWVibzsKK307CisKKyNkZWZpbmUgU05EUlZfSERTUF9JT0NUTF9HRVRfOTYzMl9BRUIgX0lPUignSCcsIDB4NDUsIGhkc3BfOTYzMl9hZWJfdCkKKworI2VuZGlmIC8qIF9fU09VTkRfSERTUF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvaGRzcG0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9oZHNwbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NzRmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvaGRzcG0uaApAQCAtMCwwICsxLDIyOSBAQAorI2lmbmRlZiBfX1NPVU5EX0hEU1BNX0gKKyNkZWZpbmUgX19TT1VORF9IRFNQTV9ICisvKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDMgV2luZnJpZWQgUml0c2NoIChJRU0pCisgKiAgIGJhc2VkIG9uIGhkc3AuaCBmcm9tIFRob21hcyBDaGFyYm9ubmVsICh0aG9tYXNAdW5kYXRhLm9yZykKKyAqCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qIE1heGltdW0gY2hhbm5lbHMgaXMgNjQgZXZlbiBvbiA1Nk1vZGUgeW91IGhhdmUgNjRwbGF5YmFja3MgdG8gbWF0cml4ICovCisjZGVmaW5lIEhEU1BNX01BWF9DSEFOTkVMUyAgICAgIDY0CisKK2VudW0gaGRzcG1faW9fdHlwZSB7CisJTUFESSwKKwlNQURJZmFjZSwKKwlBSU8sCisJQUVTMzIsCisJUmF5REFUCit9OworCitlbnVtIGhkc3BtX3NwZWVkIHsKKwlzcywKKwlkcywKKwlxcworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gSU9DVEwgUGVhay9STVMgTWV0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBoZHNwbV9wZWFrX3JtcyB7CisJdWludDMyX3QgaW5wdXRfcGVha3NbNjRdOworCXVpbnQzMl90IHBsYXliYWNrX3BlYWtzWzY0XTsKKwl1aW50MzJfdCBvdXRwdXRfcGVha3NbNjRdOworCisJdWludDY0X3QgaW5wdXRfcm1zWzY0XTsKKwl1aW50NjRfdCBwbGF5YmFja19ybXNbNjRdOworCXVpbnQ2NF90IG91dHB1dF9ybXNbNjRdOworCisJdWludDhfdCBzcGVlZDsgLyogZW51bSB7c3MsIGRzLCBxc30gKi8KKwlpbnQgc3RhdHVzMjsKK307CisKKyNkZWZpbmUgU05EUlZfSERTUE1fSU9DVExfR0VUX1BFQUtfUk1TIFwKKwlfSU9SKCdIJywgMHg0Miwgc3RydWN0IGhkc3BtX3BlYWtfcm1zKQorCisvKiAtLS0tLS0tLS0tLS0gQ09ORklHIGJsb2NrIElPQ1RMIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGhkc3BtX2NvbmZpZyB7CisJdW5zaWduZWQgY2hhciBwcmVmX3N5bmNfcmVmOworCXVuc2lnbmVkIGNoYXIgd29yZGNsb2NrX3N5bmNfY2hlY2s7CisJdW5zaWduZWQgY2hhciBtYWRpX3N5bmNfY2hlY2s7CisJdW5zaWduZWQgaW50IHN5c3RlbV9zYW1wbGVfcmF0ZTsKKwl1bnNpZ25lZCBpbnQgYXV0b3N5bmNfc2FtcGxlX3JhdGU7CisJdW5zaWduZWQgY2hhciBzeXN0ZW1fY2xvY2tfbW9kZTsKKwl1bnNpZ25lZCBjaGFyIGNsb2NrX3NvdXJjZTsKKwl1bnNpZ25lZCBjaGFyIGF1dG9zeW5jX3JlZjsKKwl1bnNpZ25lZCBjaGFyIGxpbmVfb3V0OworCXVuc2lnbmVkIGludCBwYXNzdGhydTsKKwl1bnNpZ25lZCBpbnQgYW5hbG9nX291dDsKK307CisKKyNkZWZpbmUgU05EUlZfSERTUE1fSU9DVExfR0VUX0NPTkZJRyBcCisJX0lPUignSCcsIDB4NDEsIHN0cnVjdCBoZHNwbV9jb25maWcpCisKKy8qKgorICogSWYgdGhlcmUncyBhIFRDTyAoVGltZUNvZGUgT3B0aW9uKSBib2FyZCBpbnN0YWxsZWQsCisgKiB0aGVyZSBhcmUgZnVydGhlciBvcHRpb25zIGFuZCBzdGF0dXMgZGF0YSBhdmFpbGFibGUuCisgKiBUaGUgaGRzcG1fbHRjIHN0cnVjdHVyZSBjb250YWlucyB0aGUgY3VycmVudCBTTVBURQorICogdGltZWNvZGUgYW5kIHNvbWUgc3RhdHVzIGluZm9ybWF0aW9uIGFuZCBjYW4gYmUKKyAqIG9idGFpbmVkIHZpYSBTTkRSVl9IRFNQTV9JT0NUTF9HRVRfTFRDIG9yIGluIHRoZQorICogaGRzcG1fc3RhdHVzIHN0cnVjdC4KKyAqKi8KKworZW51bSBoZHNwbV9sdGNfZm9ybWF0IHsKKwlmb3JtYXRfaW52YWxpZCwKKwlmcHNfMjQsCisJZnBzXzI1LAorCWZwc18yOTk3LAorCWZwc18zMAorfTsKKworZW51bSBoZHNwbV9sdGNfZnJhbWUgeworCWZyYW1lX2ludmFsaWQsCisJZHJvcF9mcmFtZSwKKwlmdWxsX2ZyYW1lCit9OworCitlbnVtIGhkc3BtX2x0Y19pbnB1dF9mb3JtYXQgeworCW50c2MsCisJcGFsLAorCW5vX3ZpZGVvCit9OworCitzdHJ1Y3QgaGRzcG1fbHRjIHsKKwl1bnNpZ25lZCBpbnQgbHRjOworCisJZW51bSBoZHNwbV9sdGNfZm9ybWF0IGZvcm1hdDsKKwllbnVtIGhkc3BtX2x0Y19mcmFtZSBmcmFtZTsKKwllbnVtIGhkc3BtX2x0Y19pbnB1dF9mb3JtYXQgaW5wdXRfZm9ybWF0OworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQTV9JT0NUTF9HRVRfTFRDIF9JT1IoJ0gnLCAweDQ2LCBzdHJ1Y3QgaGRzcG1fbWl4ZXJfaW9jdGwpCisKKy8qKgorICogVGhlIHN0YXR1cyBkYXRhIHJlZmxlY3RzIHRoZSBkZXZpY2UncyBjdXJyZW50IHN0YXRlCisgKiBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBjYXJkJ3MgY29uZmlndXJhdGlvbiBhbmQKKyAqIGNvbm5lY3Rpb24gc3RhdHVzLgorICoqLworCitlbnVtIGhkc3BtX3N5bmMgeworCWhkc3BtX3N5bmNfbm9fbG9jayA9IDAsCisJaGRzcG1fc3luY19sb2NrID0gMSwKKwloZHNwbV9zeW5jX3N5bmMgPSAyCit9OworCitlbnVtIGhkc3BtX21hZGlfaW5wdXQgeworCWhkc3BtX2lucHV0X29wdGljYWwgPSAwLAorCWhkc3BtX2lucHV0X2NvYXggPSAxCit9OworCitlbnVtIGhkc3BtX21hZGlfY2hhbm5lbF9mb3JtYXQgeworCWhkc3BtX2Zvcm1hdF9jaF82NCA9IDAsCisJaGRzcG1fZm9ybWF0X2NoXzU2ID0gMQorfTsKKworZW51bSBoZHNwbV9tYWRpX2ZyYW1lX2Zvcm1hdCB7CisJaGRzcG1fZnJhbWVfNDggPSAwLAorCWhkc3BtX2ZyYW1lXzk2ID0gMQorfTsKKworZW51bSBoZHNwbV9zeW5jc291cmNlIHsKKwlzeW5jc291cmNlX3djID0gMCwKKwlzeW5jc291cmNlX21hZGkgPSAxLAorCXN5bmNzb3VyY2VfdGNvID0gMiwKKwlzeW5jc291cmNlX3N5bmMgPSAzLAorCXN5bmNzb3VyY2Vfbm9uZSA9IDQKK307CisKK3N0cnVjdCBoZHNwbV9zdGF0dXMgeworCXVpbnQ4X3QgY2FyZF90eXBlOyAvKiBlbnVtIGhkc3BtX2lvX3R5cGUgKi8KKwllbnVtIGhkc3BtX3N5bmNzb3VyY2UgYXV0b3N5bmNfc291cmNlOworCisJdWludDY0X3QgY2FyZF9jbG9jazsKKwl1aW50MzJfdCBtYXN0ZXJfcGVyaW9kOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdWludDhfdCBzeW5jX3djOyAvKiBlbnVtIGhkc3BtX3N5bmMgKi8KKwkJCXVpbnQ4X3Qgc3luY19tYWRpOyAvKiBlbnVtIGhkc3BtX3N5bmMgKi8KKwkJCXVpbnQ4X3Qgc3luY190Y287IC8qIGVudW0gaGRzcG1fc3luYyAqLworCQkJdWludDhfdCBzeW5jX2luOyAvKiBlbnVtIGhkc3BtX3N5bmMgKi8KKwkJCXVpbnQ4X3QgbWFkaV9pbnB1dDsgLyogZW51bSBoZHNwbV9tYWRpX2lucHV0ICovCisJCQl1aW50OF90IGNoYW5uZWxfZm9ybWF0OyAvKiBlbnVtIGhkc3BtX21hZGlfY2hhbm5lbF9mb3JtYXQgKi8KKwkJCXVpbnQ4X3QgZnJhbWVfZm9ybWF0OyAvKiBlbnVtIGhkc3BtX21hZGlfZnJhbWVfZm9ybWF0ICovCisJCX0gbWFkaTsKKwl9IGNhcmRfc3BlY2lmaWM7Cit9OworCisjZGVmaW5lIFNORFJWX0hEU1BNX0lPQ1RMX0dFVF9TVEFUVVMgXAorCV9JT1IoJ0gnLCAweDQ3LCBzdHJ1Y3QgaGRzcG1fc3RhdHVzKQorCisvKioKKyAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2FyZCBhbmQgaXRzIGFkZC1vbnMuCisgKiovCisKKyNkZWZpbmUgSERTUE1fQURET05fVENPIDEKKworc3RydWN0IGhkc3BtX3ZlcnNpb24geworCXVpbnQ4X3QgY2FyZF90eXBlOyAvKiBlbnVtIGhkc3BtX2lvX3R5cGUgKi8KKwljaGFyIGNhcmRuYW1lWzIwXTsKKwl1bnNpZ25lZCBpbnQgc2VyaWFsOworCXVuc2lnbmVkIHNob3J0IGZpcm13YXJlX3JldjsKKwlpbnQgYWRkb25zOworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQTV9JT0NUTF9HRVRfVkVSU0lPTiBfSU9SKCdIJywgMHg0OCwgc3RydWN0IGhkc3BtX3ZlcnNpb24pCisKKy8qIC0tLS0tLS0tLS0tLS0gZ2V0IE1hdHJpeCBNaXhlciBJT0NUTCAtLS0tLS0tLS0tLS0tLS0gKi8KKworLyogTUFESSBtaXhlcjogNjRpbnB1dHMrNjRwbGF5YmFjayBpbiA2NG91dHB1dHMgPSA4MTkyID0+ICo0Qnl0ZSA9CisgKiAzMjc2OCBCeXRlcworICovCisKKy8qIG9yZ2FuaXNhdGlvbiBpcyA2NCBjaGFubmVsZmFkZXIgaW4gYSBjb250aW5vdXMgbWVtb3J5IGJsb2NrICovCisvKiBlcXVpdmFsZW50IHRvIGhhcmR3YXJlIGRlZmluaXRpb24sIG1heWJlIGZvciBmdXR1cmUgZmVhdHVyZSBvZiBtbWFwIG9mCisgKiB0aGVtCisgKi8KKy8qIGVhY2ggb2YgNjQgb3V0cHV0cyBoYXMgNjQgaW5mYWRlciBhbmQgNjQgb3V0ZmFkZXI6CisgICBJbnMgdG8gT3V0cyBtaXhlcltvdXRdLmluW2luXSwgT3V0c3RyZWFtcyB0byBPdXRzIG1peGVyW291dF0ucGJbcGJdICovCisKKyNkZWZpbmUgSERTUE1fTUlYRVJfQ0hBTk5FTFMgSERTUE1fTUFYX0NIQU5ORUxTCisKK3N0cnVjdCBoZHNwbV9jaGFubmVsZmFkZXIgeworCXVuc2lnbmVkIGludCBpbltIRFNQTV9NSVhFUl9DSEFOTkVMU107CisJdW5zaWduZWQgaW50IHBiW0hEU1BNX01JWEVSX0NIQU5ORUxTXTsKK307CisKK3N0cnVjdCBoZHNwbV9taXhlciB7CisJc3RydWN0IGhkc3BtX2NoYW5uZWxmYWRlciBjaFtIRFNQTV9NSVhFUl9DSEFOTkVMU107Cit9OworCitzdHJ1Y3QgaGRzcG1fbWl4ZXJfaW9jdGwgeworCXN0cnVjdCBoZHNwbV9taXhlciAqbWl4ZXI7Cit9OworCisvKiB1c2UgaW5kaXJlY3QgYWNjZXNzIGR1ZSB0byB0aGUgbGltaXQgb2YgaW9jdGwgYml0IHNpemUgKi8KKyNkZWZpbmUgU05EUlZfSERTUE1fSU9DVExfR0VUX01JWEVSIF9JT1IoJ0gnLCAweDQ0LCBzdHJ1Y3QgaGRzcG1fbWl4ZXJfaW9jdGwpCisKKy8qIHR5cGVkZWZzIGZvciBjb21wYXRpYmlsaXR5IHRvIHVzZXItc3BhY2UgKi8KK3R5cGVkZWYgc3RydWN0IGhkc3BtX3BlYWtfcm1zIGhkc3BtX3BlYWtfcm1zX3Q7Cit0eXBlZGVmIHN0cnVjdCBoZHNwbV9jb25maWdfaW5mbyBoZHNwbV9jb25maWdfaW5mb190OwordHlwZWRlZiBzdHJ1Y3QgaGRzcG1fdmVyc2lvbiBoZHNwbV92ZXJzaW9uX3Q7Cit0eXBlZGVmIHN0cnVjdCBoZHNwbV9jaGFubmVsZmFkZXIgc25kX2hkc3BtX2NoYW5uZWxmYWRlcl90OwordHlwZWRlZiBzdHJ1Y3QgaGRzcG1fbWl4ZXIgaGRzcG1fbWl4ZXJfdDsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9zYjE2X2NzcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL3NiMTZfY3NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4MTdiNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9zYjE2X2NzcC5oCkBAIC0wLDAgKzEsMTE1IEBACisjaWZuZGVmIF9fU09VTkRfU0IxNl9DU1BfSAorI2RlZmluZSBfX1NPVU5EX1NCMTZfQ1NQX0gKKworLyoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTkgYnkgVXJvcyBCaXpqYWsgPHVyb3NAa3NzLWxva2Euc2k+CisgKiAgICAgICAgICAgICAgICAgICAgICAgIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqCisgKiAgU0IxNkFTUC9BV0UzMiBDU1AgY29udHJvbAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgCisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKy8qIENTUCBtb2RlcyAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfTU9ERV9OT05FCQkweDAwCisjZGVmaW5lIFNORFJWX1NCX0NTUF9NT0RFX0RTUF9SRUFECTB4MDEJLyogUmVjb3JkIGZyb20gRFNQICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9NT0RFX0RTUF9XUklURQkweDAyCS8qIFBsYXkgdG8gRFNQICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9NT0RFX1FTT1VORAkJMHgwNAkvKiBRU291bmQgKi8KKworLyogQ1NQIGxvYWQgZmxhZ3MgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX0xPQURfRlJPTVVTRVIJMHgwMQorI2RlZmluZSBTTkRSVl9TQl9DU1BfTE9BRF9JTklUQkxPQ0sJMHgwMgorCisvKiBDU1Agc2FtcGxlIHdpZHRoICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9TQU1QTEVfOEJJVAkJMHgwMQorI2RlZmluZSBTTkRSVl9TQl9DU1BfU0FNUExFXzE2QklUCQkweDAyCisKKy8qIENTUCBjaGFubmVscyAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfTU9OTwkJCTB4MDEKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1NURVJFTwkJMHgwMgorCisvKiBDU1AgcmF0ZXMgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1JBVEVfODAwMAkJMHgwMQorI2RlZmluZSBTTkRSVl9TQl9DU1BfUkFURV8xMTAyNQkJMHgwMgorI2RlZmluZSBTTkRSVl9TQl9DU1BfUkFURV8yMjA1MAkJMHgwNAorI2RlZmluZSBTTkRSVl9TQl9DU1BfUkFURV80NDEwMAkJMHgwOAorI2RlZmluZSBTTkRSVl9TQl9DU1BfUkFURV9BTEwJCTB4MGYKKworLyogQ1NQIHJ1bm5pbmcgc3RhdGUgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1NUX0lETEUJCTB4MDAKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1NUX0xPQURFRAkJMHgwMQorI2RlZmluZSBTTkRSVl9TQl9DU1BfU1RfUlVOTklORwkJMHgwMgorI2RlZmluZSBTTkRSVl9TQl9DU1BfU1RfUEFVU0VECQkweDA0CisjZGVmaW5lIFNORFJWX1NCX0NTUF9TVF9BVVRPCQkweDA4CisjZGVmaW5lIFNORFJWX1NCX0NTUF9TVF9RU09VTkQJCTB4MTAKKworLyogbWF4aW11bSBRU291bmQgdmFsdWUgKDE4MCBkZWdyZWVzIHJpZ2h0KSAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfUVNPVU5EX01BWF9SSUdIVAkweDIwCisKKy8qIG1heGltdW0gbWljcm9jb2RlIFJJRkYgZmlsZSBzaXplICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9NQVhfTUlDUk9DT0RFX0ZJTEVfU0laRQkweDMwMDAKKworLyogbWljcm9jb2RlIGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3NiX2NzcF9tY19oZWFkZXIgeworCWNoYXIgY29kZWNfbmFtZVsxNl07CQkvKiBpZCBuYW1lIG9mIGNvZGVjICovCisJdW5zaWduZWQgc2hvcnQgZnVuY19yZXE7CS8qIHJlcXVlc3RlZCBmdW5jdGlvbiAqLworfSBzbmRfc2JfY3NwX21jX2hlYWRlcl90OworCisvKiBtaWNyb2NvZGUgdG8gYmUgbG9hZGVkICovCit0eXBlZGVmIHN0cnVjdCBzbmRfc2JfY3NwX21pY3JvY29kZSB7CisJc25kX3NiX2NzcF9tY19oZWFkZXJfdCBpbmZvOworCXVuc2lnbmVkIGNoYXIgZGF0YVtTTkRSVl9TQl9DU1BfTUFYX01JQ1JPQ09ERV9GSUxFX1NJWkVdOworfSBzbmRfc2JfY3NwX21pY3JvY29kZV90OworCisvKiBzdGFydCBDU1Agd2l0aCBzYW1wbGVfd2lkdGggaW4gbW9uby9zdGVyZW8gKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9zYl9jc3Bfc3RhcnQgeworCWludCBzYW1wbGVfd2lkdGg7CS8qIHNhbXBsZSB3aWR0aCwgbG9vayBhYm92ZSAqLworCWludCBjaGFubmVsczsJCS8qIGNoYW5uZWxzLCBsb29rIGFib3ZlICovCit9IHNuZF9zYl9jc3Bfc3RhcnRfdDsKKworLyogQ1NQIGluZm9ybWF0aW9uICovCit0eXBlZGVmIHN0cnVjdCBzbmRfc2JfY3NwX2luZm8geworCWNoYXIgY29kZWNfbmFtZVsxNl07CQkvKiBpZCBuYW1lIG9mIGNvZGVjICovCisJdW5zaWduZWQgc2hvcnQgZnVuY19ucjsJCS8qIGZ1bmN0aW9uIG51bWJlciAqLworCXVuc2lnbmVkIGludCBhY2NfZm9ybWF0OwkvKiBhY2NlcHRlZCBQQ00gZm9ybWF0cyAqLworCXVuc2lnbmVkIHNob3J0IGFjY19jaGFubmVsczsJLyogYWNjZXB0ZWQgY2hhbm5lbHMgKi8KKwl1bnNpZ25lZCBzaG9ydCBhY2Nfd2lkdGg7CS8qIGFjY2VwdGVkIHNhbXBsZSB3aWR0aCAqLworCXVuc2lnbmVkIHNob3J0IGFjY19yYXRlczsJLyogYWNjZXB0ZWQgc2FtcGxlIHJhdGVzICovCisJdW5zaWduZWQgc2hvcnQgY3NwX21vZGU7CS8qIENTUCBtb2RlLCBzZWUgYWJvdmUgKi8KKwl1bnNpZ25lZCBzaG9ydCBydW5fY2hhbm5lbHM7CS8qIGN1cnJlbnQgY2hhbm5lbHMgICovCisJdW5zaWduZWQgc2hvcnQgcnVuX3dpZHRoOwkvKiBjdXJyZW50IHNhbXBsZSB3aWR0aCAqLworCXVuc2lnbmVkIHNob3J0IHZlcnNpb247CQkvKiB2ZXJzaW9uIGlkOiAweDEwIC0gMHgxZiAqLworCXVuc2lnbmVkIHNob3J0IHN0YXRlOwkJLyogc3RhdGUgYml0cyAqLworfSBzbmRfc2JfY3NwX2luZm9fdDsKKworLyogSFdERVAgY29udHJvbHMgKi8KKy8qIGdldCBDU1AgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX0lPQ1RMX0lORk8JCV9JT1IoJ0gnLCAweDEwLCBzbmRfc2JfY3NwX2luZm9fdCkKKy8qIGxvYWQgbWljcm9jb2RlIHRvIENTUCAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfSU9DVExfTE9BRF9DT0RFCV9JT1coJ0gnLCAweDExLCBzbmRfc2JfY3NwX21pY3JvY29kZV90KQorLyogdW5sb2FkIG1pY3JvY29kZSBmcm9tIENTUCAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfSU9DVExfVU5MT0FEX0NPREUJX0lPKCdIJywgMHgxMikKKy8qIHN0YXJ0IENTUCAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfSU9DVExfU1RBUlQJX0lPVygnSCcsIDB4MTMsIHNuZF9zYl9jc3Bfc3RhcnRfdCkKKy8qIHN0b3AgQ1NQICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9JT0NUTF9TVE9QCQlfSU8oJ0gnLCAweDE0KQorLyogcGF1c2UgQ1NQIGFuZCBETUEgdHJhbnNmZXIgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX0lPQ1RMX1BBVVNFCV9JTygnSCcsIDB4MTUpCisvKiByZXN0YXJ0IENTUCBhbmQgRE1BIHRyYW5zZmVyICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9JT0NUTF9SRVNUQVJUCV9JTygnSCcsIDB4MTYpCisKKworI2VuZGlmIC8qIF9fU09VTkRfU0IxNl9DU1AgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9zc2NhcGVfaW9jdGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9zc2NhcGVfaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjY1M2ViCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL3NzY2FwZV9pb2N0bC5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgU1NDQVBFX0lPQ1RMX0gKKyNkZWZpbmUgU1NDQVBFX0lPQ1RMX0gKKworCitzdHJ1Y3Qgc3NjYXBlX2Jvb3RibG9jaworeworICB1bnNpZ25lZCBjaGFyIGNvZGVbMjU2XTsKKyAgdW5zaWduZWQgdmVyc2lvbjsKK307CisKKyNkZWZpbmUgU1NDQVBFX01JQ1JPQ09ERV9TSVpFICA2NTUzNgorCitzdHJ1Y3Qgc3NjYXBlX21pY3JvY29kZQoreworICB1bnNpZ25lZCBjaGFyICpjb2RlOworfTsKKworI2RlZmluZSBTTkRfU1NDQVBFX0xPQURfQk9PVEIgIF9JT1dSKCdQJywgMTAwLCBzdHJ1Y3Qgc3NjYXBlX2Jvb3RibG9jaykKKyNkZWZpbmUgU05EX1NTQ0FQRV9MT0FEX01DT0RFICBfSU9XICgnUCcsIDEwMSwgc3RydWN0IHNzY2FwZV9taWNyb2NvZGUpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL3R5cGVfY29tcGF0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvdHlwZV9jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWM4NmU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL3R5cGVfY29tcGF0LmgKQEAgLTAsMCArMSw0MCBAQAorI2lmbmRlZiBfX1RZUEVfQ09NUEFUX0gKKyNkZWZpbmUgX19UWVBFX0NPTVBBVF9ICisKKyNpZm5kZWYgRE9DX0hJRERFTgorI2luY2x1ZGUgPHN0ZGludC5oPgordHlwZWRlZiB1aW50OF90IF9fdTg7Cit0eXBlZGVmIHVpbnQxNl90IF9fdTE2OwordHlwZWRlZiB1aW50MzJfdCBfX3UzMjsKK3R5cGVkZWYgaW50OF90IF9fczg7Cit0eXBlZGVmIGludDE2X3QgX19zMTY7Cit0eXBlZGVmIGludDMyX3QgX19zMzI7CisKKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgX19jcHVfdG9fbGUzMih4KSAoeCkKKyNkZWZpbmUgX19jcHVfdG9fYmUzMih4KSBic3dhcF8zMih4KQorI2RlZmluZSBfX2NwdV90b19sZTE2KHgpICh4KQorI2RlZmluZSBfX2NwdV90b19iZTE2KHgpIGJzd2FwXzE2KHgpCisjZWxzZQorI2RlZmluZSBfX2NwdV90b19sZTMyKHgpIGJzd2FwXzMyKHgpCisjZGVmaW5lIF9fY3B1X3RvX2JlMzIoeCkgKHgpCisjZGVmaW5lIF9fY3B1X3RvX2xlMTYoeCkgYnN3YXBfMTYoeCkKKyNkZWZpbmUgX19jcHVfdG9fYmUxNih4KSAoeCkKKyNlbmRpZgorCisjZGVmaW5lIF9fbGUzMl90b19jcHUgX19jcHVfdG9fbGUzMgorI2RlZmluZSBfX2JlMzJfdG9fY3B1IF9fY3B1X3RvX2JlMzIKKyNkZWZpbmUgX19sZTE2X3RvX2NwdSBfX2NwdV90b19sZTE2CisjZGVmaW5lIF9fYmUxNl90b19jcHUgX19jcHVfdG9fYmUxNgorCisjZGVmaW5lIF9fbGU2NCBfX3U2NAorI2RlZmluZSBfX2xlMzIgX191MzIKKyNkZWZpbmUgX19sZTE2IF9fdTE2CisjZGVmaW5lIF9fYmU2NCBfX3U2NAorI2RlZmluZSBfX2JlMzIgX191MzIKKyNkZWZpbmUgX19iZTE2IF9fdTE2CisjZW5kaWYgLyogRE9DX0hJRERFTiAqLworCisjZW5kaWYgLyogX19UWVBFX0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvdGltZXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MDNmNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvdGltZXIuaApAQCAtMCwwICsxLDI1OSBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL3RpbWVyLmgKKyAqIFxicmllZiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKiBcYXV0aG9yIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKiBcYXV0aG9yIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMTk5OC0yMDAxCisgKgorICogQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICovCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX1RJTUVSX0gKKyNkZWZpbmUgX19BTFNBX1RJTUVSX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqICBcZGVmZ3JvdXAgVGltZXIgVGltZXIgSW50ZXJmYWNlCisgKiAgVGltZXIgSW50ZXJmYWNlLiBTZWUgXHJlZiB0aW1lciBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiAgXHsKKyAqLworCisvKiogZGxzeW0gdmVyc2lvbiBmb3IgaW50ZXJmYWNlIGVudHJ5IGNhbGxiYWNrICovCisjZGVmaW5lIFNORF9USU1FUl9ETFNZTV9WRVJTSU9OCQlfZGxzeW1fdGltZXJfMDAxCisvKiogZGxzeW0gdmVyc2lvbiBmb3IgaW50ZXJmYWNlIGVudHJ5IGNhbGxiYWNrICovCisjZGVmaW5lIFNORF9USU1FUl9RVUVSWV9ETFNZTV9WRVJTSU9OCV9kbHN5bV90aW1lcl9xdWVyeV8wMDEKKworLyoqIHRpbWVyIGlkZW50aWZpY2F0aW9uIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF90aW1lcl9pZCBzbmRfdGltZXJfaWRfdDsKKy8qKiB0aW1lciBnbG9iYWwgaW5mbyBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfdGltZXJfZ2luZm8gc25kX3RpbWVyX2dpbmZvX3Q7CisvKiogdGltZXIgZ2xvYmFsIHBhcmFtcyBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfdGltZXJfZ3BhcmFtcyBzbmRfdGltZXJfZ3BhcmFtc190OworLyoqIHRpbWVyIGdsb2JhbCBzdGF0dXMgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3RpbWVyX2dzdGF0dXMgc25kX3RpbWVyX2dzdGF0dXNfdDsKKy8qKiB0aW1lciBpbmZvIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF90aW1lcl9pbmZvIHNuZF90aW1lcl9pbmZvX3Q7CisvKiogdGltZXIgcGFyYW1zIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF90aW1lcl9wYXJhbXMgc25kX3RpbWVyX3BhcmFtc190OworLyoqIHRpbWVyIHN0YXR1cyBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfdGltZXJfc3RhdHVzIHNuZF90aW1lcl9zdGF0dXNfdDsKKy8qKiB0aW1lciBtYXN0ZXIgY2xhc3MgKi8KK3R5cGVkZWYgZW51bSBfc25kX3RpbWVyX2NsYXNzIHsKKwlTTkRfVElNRVJfQ0xBU1NfTk9ORSA9IC0xLAkvKio8IGludmFsaWQgKi8KKwlTTkRfVElNRVJfQ0xBU1NfU0xBVkUgPSAwLAkvKio8IHNsYXZlIHRpbWVyICovCisJU05EX1RJTUVSX0NMQVNTX0dMT0JBTCwJCS8qKjwgZ2xvYmFsIHRpbWVyICovCisJU05EX1RJTUVSX0NMQVNTX0NBUkQsCQkvKio8IGNhcmQgdGltZXIgKi8KKwlTTkRfVElNRVJfQ0xBU1NfUENNLAkJLyoqPCBQQ00gdGltZXIgKi8KKwlTTkRfVElNRVJfQ0xBU1NfTEFTVCA9IFNORF9USU1FUl9DTEFTU19QQ00JLyoqPCBsYXN0IHRpbWVyICovCit9IHNuZF90aW1lcl9jbGFzc190OworCisvKiogdGltZXIgc2xhdmUgY2xhc3MgKi8KK3R5cGVkZWYgZW51bSBfc25kX3RpbWVyX3NsYXZlX2NsYXNzIHsKKwlTTkRfVElNRVJfU0NMQVNTX05PTkUgPSAwLAkJLyoqPCBub25lICovCisJU05EX1RJTUVSX1NDTEFTU19BUFBMSUNBVElPTiwJCS8qKjwgZm9yIGludGVybmFsIHVzZSAqLworCVNORF9USU1FUl9TQ0xBU1NfU0VRVUVOQ0VSLAkJLyoqPCBzZXF1ZW5jZXIgdGltZXIgKi8KKwlTTkRfVElNRVJfU0NMQVNTX09TU19TRVFVRU5DRVIsCQkvKio8IE9TUyBzZXF1ZW5jZXIgdGltZXIgKi8KKwlTTkRfVElNRVJfU0NMQVNTX0xBU1QgPSBTTkRfVElNRVJfU0NMQVNTX09TU19TRVFVRU5DRVIJLyoqPCBsYXN0IHNsYXZlIHRpbWVyICovCit9IHNuZF90aW1lcl9zbGF2ZV9jbGFzc190OworCisvKiogdGltZXIgcmVhZCBldmVudCBpZGVudGlmaWNhdGlvbiAqLwordHlwZWRlZiBlbnVtIF9zbmRfdGltZXJfZXZlbnQgeworCVNORF9USU1FUl9FVkVOVF9SRVNPTFVUSU9OID0gMCwJLyogdmFsID0gcmVzb2x1dGlvbiBpbiBucyAqLworCVNORF9USU1FUl9FVkVOVF9USUNLLAkJLyogdmFsID0gdGlja3MgKi8KKwlTTkRfVElNRVJfRVZFTlRfU1RBUlQsCQkvKiB2YWwgPSByZXNvbHV0aW9uIGluIG5zICovCisJU05EX1RJTUVSX0VWRU5UX1NUT1AsCQkvKiB2YWwgPSAwICovCisJU05EX1RJTUVSX0VWRU5UX0NPTlRJTlVFLAkvKiB2YWwgPSByZXNvbHV0aW9uIGluIG5zICovCisJU05EX1RJTUVSX0VWRU5UX1BBVVNFLAkJLyogdmFsID0gMCAqLworCVNORF9USU1FUl9FVkVOVF9FQVJMWSwJCS8qIHZhbCA9IDAgKi8KKwlTTkRfVElNRVJfRVZFTlRfU1VTUEVORCwJLyogdmFsID0gMCAqLworCVNORF9USU1FUl9FVkVOVF9SRVNVTUUsCQkvKiB2YWwgPSByZXNvbHV0aW9uIGluIG5zICovCisJLyogbWFzdGVyIHRpbWVyIGV2ZW50cyBmb3Igc2xhdmUgdGltZXIgaW5zdGFuY2VzICovCisJU05EX1RJTUVSX0VWRU5UX01TVEFSVCA9IFNORF9USU1FUl9FVkVOVF9TVEFSVCArIDEwLAorCVNORF9USU1FUl9FVkVOVF9NU1RPUCA9IFNORF9USU1FUl9FVkVOVF9TVE9QICsgMTAsCisJU05EX1RJTUVSX0VWRU5UX01DT05USU5VRSA9IFNORF9USU1FUl9FVkVOVF9DT05USU5VRSArIDEwLAorCVNORF9USU1FUl9FVkVOVF9NUEFVU0UgPSBTTkRfVElNRVJfRVZFTlRfUEFVU0UgKyAxMCwKKwlTTkRfVElNRVJfRVZFTlRfTVNVU1BFTkQgPSBTTkRfVElNRVJfRVZFTlRfU1VTUEVORCArIDEwLAorCVNORF9USU1FUl9FVkVOVF9NUkVTVU1FID0gU05EX1RJTUVSX0VWRU5UX1JFU1VNRSArIDEwCQorfSBzbmRfdGltZXJfZXZlbnRfdDsKKworLyoqIHRpbWVyIHJlYWQgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3RpbWVyX3JlYWQgeworCXVuc2lnbmVkIGludCByZXNvbHV0aW9uOwkvKio8IHRpY2sgcmVzb2x1dGlvbiBpbiBuYW5vc2Vjb25kcyAqLworICAgICAgICB1bnNpZ25lZCBpbnQgdGlja3M7CQkvKio8IGNvdW50IG9mIGhhcHBlbmVkIHRpY2tzICovCit9IHNuZF90aW1lcl9yZWFkX3Q7CisKKy8qKiB0aW1lciB0c3RhbXAgKyBldmVudCByZWFkIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF90aW1lcl90cmVhZCB7CisJc25kX3RpbWVyX2V2ZW50X3QgZXZlbnQ7CS8qKjwgVGltZXIgZXZlbnQgKi8KKwlzbmRfaHRpbWVzdGFtcF90IHRzdGFtcDsJLyoqPCBUaW1lIHN0YW1wIG9mIGVhY2ggZXZlbnQgKi8KKwl1bnNpZ25lZCBpbnQgdmFsOwkJLyoqPCBFdmVudCB2YWx1ZSAqLworfSBzbmRfdGltZXJfdHJlYWRfdDsKKworLyoqIGdsb2JhbCB0aW1lciAtIHN5c3RlbSAqLworI2RlZmluZSBTTkRfVElNRVJfR0xPQkFMX1NZU1RFTSAwCisvKiogZ2xvYmFsIHRpbWVyIC0gUlRDICovCisjZGVmaW5lIFNORF9USU1FUl9HTE9CQUxfUlRDIAkxCisvKiogZ2xvYmFsIHRpbWVyIC0gSFBFVCAqLworI2RlZmluZSBTTkRfVElNRVJfR0xPQkFMX0hQRVQJMgorLyoqIGdsb2JhbCB0aW1lciAtIEhSVElNRVIgKi8KKyNkZWZpbmUgU05EX1RJTUVSX0dMT0JBTF9IUlRJTUVSIDMKKworLyoqIHRpbWVyIG9wZW4gbW9kZSBmbGFnIC0gbm9uLWJsb2NraW5nIGJlaGF2aW91ciAqLworI2RlZmluZSBTTkRfVElNRVJfT1BFTl9OT05CTE9DSwkJKDE8PDApCisvKiogdXNlIHRpbWVzdGFtcHMgYW5kIGV2ZW50IG5vdGlmaWNhdGlvbiAtIGVuaGFuY2VkIHJlYWQgKi8KKyNkZWZpbmUgU05EX1RJTUVSX09QRU5fVFJFQUQJCSgxPDwxKQorCisvKiogdGltZXIgaGFuZGxlIHR5cGUgKi8KK3R5cGVkZWYgZW51bSBfc25kX3RpbWVyX3R5cGUgeworCS8qKiBLZXJuZWwgbGV2ZWwgSHdEZXAgKi8KKwlTTkRfVElNRVJfVFlQRV9IVyA9IDAsCisJLyoqIFNoYXJlZCBtZW1vcnkgY2xpZW50IHRpbWVyIChub3QgeWV0IGltcGxlbWVudGVkKSAqLworCVNORF9USU1FUl9UWVBFX1NITSwKKwkvKiogSU5FVCBjbGllbnQgdGltZXIgKG5vdCB5ZXQgaW1wbGVtZW50ZWQpICovCisJU05EX1RJTUVSX1RZUEVfSU5FVAorfSBzbmRfdGltZXJfdHlwZV90OworCisvKiogdGltZXIgcXVlcnkgaGFuZGxlICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3RpbWVyX3F1ZXJ5IHNuZF90aW1lcl9xdWVyeV90OworLyoqIHRpbWVyIGhhbmRsZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF90aW1lciBzbmRfdGltZXJfdDsKKworCitpbnQgc25kX3RpbWVyX3F1ZXJ5X29wZW4oc25kX3RpbWVyX3F1ZXJ5X3QgKipoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2RlKTsKK2ludCBzbmRfdGltZXJfcXVlcnlfb3Blbl9sY29uZihzbmRfdGltZXJfcXVlcnlfdCAqKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG1vZGUsIHNuZF9jb25maWdfdCAqbGNvbmYpOworaW50IHNuZF90aW1lcl9xdWVyeV9jbG9zZShzbmRfdGltZXJfcXVlcnlfdCAqaGFuZGxlKTsKK2ludCBzbmRfdGltZXJfcXVlcnlfbmV4dF9kZXZpY2Uoc25kX3RpbWVyX3F1ZXJ5X3QgKmhhbmRsZSwgc25kX3RpbWVyX2lkX3QgKnRpZCk7CitpbnQgc25kX3RpbWVyX3F1ZXJ5X2luZm8oc25kX3RpbWVyX3F1ZXJ5X3QgKmhhbmRsZSwgc25kX3RpbWVyX2dpbmZvX3QgKmluZm8pOworaW50IHNuZF90aW1lcl9xdWVyeV9wYXJhbXMoc25kX3RpbWVyX3F1ZXJ5X3QgKmhhbmRsZSwgc25kX3RpbWVyX2dwYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfdGltZXJfcXVlcnlfc3RhdHVzKHNuZF90aW1lcl9xdWVyeV90ICpoYW5kbGUsIHNuZF90aW1lcl9nc3RhdHVzX3QgKnN0YXR1cyk7CisKK2ludCBzbmRfdGltZXJfb3BlbihzbmRfdGltZXJfdCAqKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG1vZGUpOworaW50IHNuZF90aW1lcl9vcGVuX2xjb25mKHNuZF90aW1lcl90ICoqaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSwgc25kX2NvbmZpZ190ICpsY29uZik7CitpbnQgc25kX3RpbWVyX2Nsb3NlKHNuZF90aW1lcl90ICpoYW5kbGUpOworaW50IHNuZF9hc3luY19hZGRfdGltZXJfaGFuZGxlcihzbmRfYXN5bmNfaGFuZGxlcl90ICoqaGFuZGxlciwgc25kX3RpbWVyX3QgKnRpbWVyLAorCQkJCXNuZF9hc3luY19jYWxsYmFja190IGNhbGxiYWNrLCB2b2lkICpwcml2YXRlX2RhdGEpOworc25kX3RpbWVyX3QgKnNuZF9hc3luY19oYW5kbGVyX2dldF90aW1lcihzbmRfYXN5bmNfaGFuZGxlcl90ICpoYW5kbGVyKTsKK2ludCBzbmRfdGltZXJfcG9sbF9kZXNjcmlwdG9yc19jb3VudChzbmRfdGltZXJfdCAqaGFuZGxlKTsKK2ludCBzbmRfdGltZXJfcG9sbF9kZXNjcmlwdG9ycyhzbmRfdGltZXJfdCAqaGFuZGxlLCBzdHJ1Y3QgcG9sbGZkICpwZmRzLCB1bnNpZ25lZCBpbnQgc3BhY2UpOworaW50IHNuZF90aW1lcl9wb2xsX2Rlc2NyaXB0b3JzX3JldmVudHMoc25kX3RpbWVyX3QgKnRpbWVyLCBzdHJ1Y3QgcG9sbGZkICpwZmRzLCB1bnNpZ25lZCBpbnQgbmZkcywgdW5zaWduZWQgc2hvcnQgKnJldmVudHMpOworaW50IHNuZF90aW1lcl9pbmZvKHNuZF90aW1lcl90ICpoYW5kbGUsIHNuZF90aW1lcl9pbmZvX3QgKnRpbWVyKTsKK2ludCBzbmRfdGltZXJfcGFyYW1zKHNuZF90aW1lcl90ICpoYW5kbGUsIHNuZF90aW1lcl9wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfdGltZXJfc3RhdHVzKHNuZF90aW1lcl90ICpoYW5kbGUsIHNuZF90aW1lcl9zdGF0dXNfdCAqc3RhdHVzKTsKK2ludCBzbmRfdGltZXJfc3RhcnQoc25kX3RpbWVyX3QgKmhhbmRsZSk7CitpbnQgc25kX3RpbWVyX3N0b3Aoc25kX3RpbWVyX3QgKmhhbmRsZSk7CitpbnQgc25kX3RpbWVyX2NvbnRpbnVlKHNuZF90aW1lcl90ICpoYW5kbGUpOworc3NpemVfdCBzbmRfdGltZXJfcmVhZChzbmRfdGltZXJfdCAqaGFuZGxlLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKTsKKworc2l6ZV90IHNuZF90aW1lcl9pZF9zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgI3NuZF90aW1lcl9pZF90IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfdGltZXJfaWRfYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX3RpbWVyX2lkKQoraW50IHNuZF90aW1lcl9pZF9tYWxsb2Moc25kX3RpbWVyX2lkX3QgKipwdHIpOwordm9pZCBzbmRfdGltZXJfaWRfZnJlZShzbmRfdGltZXJfaWRfdCAqb2JqKTsKK3ZvaWQgc25kX3RpbWVyX2lkX2NvcHkoc25kX3RpbWVyX2lkX3QgKmRzdCwgY29uc3Qgc25kX3RpbWVyX2lkX3QgKnNyYyk7CisKK3ZvaWQgc25kX3RpbWVyX2lkX3NldF9jbGFzcyhzbmRfdGltZXJfaWRfdCAqaWQsIGludCBkZXZfY2xhc3MpOworaW50IHNuZF90aW1lcl9pZF9nZXRfY2xhc3Moc25kX3RpbWVyX2lkX3QgKmlkKTsKK3ZvaWQgc25kX3RpbWVyX2lkX3NldF9zY2xhc3Moc25kX3RpbWVyX2lkX3QgKmlkLCBpbnQgZGV2X3NjbGFzcyk7CitpbnQgc25kX3RpbWVyX2lkX2dldF9zY2xhc3Moc25kX3RpbWVyX2lkX3QgKmlkKTsKK3ZvaWQgc25kX3RpbWVyX2lkX3NldF9jYXJkKHNuZF90aW1lcl9pZF90ICppZCwgaW50IGNhcmQpOworaW50IHNuZF90aW1lcl9pZF9nZXRfY2FyZChzbmRfdGltZXJfaWRfdCAqaWQpOwordm9pZCBzbmRfdGltZXJfaWRfc2V0X2RldmljZShzbmRfdGltZXJfaWRfdCAqaWQsIGludCBkZXZpY2UpOworaW50IHNuZF90aW1lcl9pZF9nZXRfZGV2aWNlKHNuZF90aW1lcl9pZF90ICppZCk7Cit2b2lkIHNuZF90aW1lcl9pZF9zZXRfc3ViZGV2aWNlKHNuZF90aW1lcl9pZF90ICppZCwgaW50IHN1YmRldmljZSk7CitpbnQgc25kX3RpbWVyX2lkX2dldF9zdWJkZXZpY2Uoc25kX3RpbWVyX2lkX3QgKmlkKTsKKworc2l6ZV90IHNuZF90aW1lcl9naW5mb19zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgI3NuZF90aW1lcl9naW5mb190IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfdGltZXJfZ2luZm9fYWxsb2NhKHB0cikgX19zbmRfYWxsb2NhKHB0ciwgc25kX3RpbWVyX2dpbmZvKQoraW50IHNuZF90aW1lcl9naW5mb19tYWxsb2Moc25kX3RpbWVyX2dpbmZvX3QgKipwdHIpOwordm9pZCBzbmRfdGltZXJfZ2luZm9fZnJlZShzbmRfdGltZXJfZ2luZm9fdCAqb2JqKTsKK3ZvaWQgc25kX3RpbWVyX2dpbmZvX2NvcHkoc25kX3RpbWVyX2dpbmZvX3QgKmRzdCwgY29uc3Qgc25kX3RpbWVyX2dpbmZvX3QgKnNyYyk7CisKK2ludCBzbmRfdGltZXJfZ2luZm9fc2V0X3RpZChzbmRfdGltZXJfZ2luZm9fdCAqb2JqLCBzbmRfdGltZXJfaWRfdCAqdGlkKTsKK3NuZF90aW1lcl9pZF90ICpzbmRfdGltZXJfZ2luZm9fZ2V0X3RpZChzbmRfdGltZXJfZ2luZm9fdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfdGltZXJfZ2luZm9fZ2V0X2ZsYWdzKHNuZF90aW1lcl9naW5mb190ICpvYmopOworaW50IHNuZF90aW1lcl9naW5mb19nZXRfY2FyZChzbmRfdGltZXJfZ2luZm9fdCAqb2JqKTsKK2NoYXIgKnNuZF90aW1lcl9naW5mb19nZXRfaWQoc25kX3RpbWVyX2dpbmZvX3QgKm9iaik7CitjaGFyICpzbmRfdGltZXJfZ2luZm9fZ2V0X25hbWUoc25kX3RpbWVyX2dpbmZvX3QgKm9iaik7Cit1bnNpZ25lZCBsb25nIHNuZF90aW1lcl9naW5mb19nZXRfcmVzb2x1dGlvbihzbmRfdGltZXJfZ2luZm9fdCAqb2JqKTsKK3Vuc2lnbmVkIGxvbmcgc25kX3RpbWVyX2dpbmZvX2dldF9yZXNvbHV0aW9uX21pbihzbmRfdGltZXJfZ2luZm9fdCAqb2JqKTsKK3Vuc2lnbmVkIGxvbmcgc25kX3RpbWVyX2dpbmZvX2dldF9yZXNvbHV0aW9uX21heChzbmRfdGltZXJfZ2luZm9fdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfdGltZXJfZ2luZm9fZ2V0X2NsaWVudHMoc25kX3RpbWVyX2dpbmZvX3QgKm9iaik7CisKK3NpemVfdCBzbmRfdGltZXJfaW5mb19zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgI3NuZF90aW1lcl9pbmZvX3QgY29udGFpbmVyIG9uIHN0YWNrICovCisjZGVmaW5lIHNuZF90aW1lcl9pbmZvX2FsbG9jYShwdHIpIF9fc25kX2FsbG9jYShwdHIsIHNuZF90aW1lcl9pbmZvKQoraW50IHNuZF90aW1lcl9pbmZvX21hbGxvYyhzbmRfdGltZXJfaW5mb190ICoqcHRyKTsKK3ZvaWQgc25kX3RpbWVyX2luZm9fZnJlZShzbmRfdGltZXJfaW5mb190ICpvYmopOwordm9pZCBzbmRfdGltZXJfaW5mb19jb3B5KHNuZF90aW1lcl9pbmZvX3QgKmRzdCwgY29uc3Qgc25kX3RpbWVyX2luZm9fdCAqc3JjKTsKKworaW50IHNuZF90aW1lcl9pbmZvX2lzX3NsYXZlKHNuZF90aW1lcl9pbmZvX3QgKiBpbmZvKTsKK2ludCBzbmRfdGltZXJfaW5mb19nZXRfY2FyZChzbmRfdGltZXJfaW5mb190ICogaW5mbyk7Citjb25zdCBjaGFyICpzbmRfdGltZXJfaW5mb19nZXRfaWQoc25kX3RpbWVyX2luZm9fdCAqIGluZm8pOworY29uc3QgY2hhciAqc25kX3RpbWVyX2luZm9fZ2V0X25hbWUoc25kX3RpbWVyX2luZm9fdCAqIGluZm8pOworbG9uZyBzbmRfdGltZXJfaW5mb19nZXRfcmVzb2x1dGlvbihzbmRfdGltZXJfaW5mb190ICogaW5mbyk7CisKK3NpemVfdCBzbmRfdGltZXJfcGFyYW1zX3NpemVvZih2b2lkKTsKKy8qKiBhbGxvY2F0ZSAjc25kX3RpbWVyX3BhcmFtc190IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfdGltZXJfcGFyYW1zX2FsbG9jYShwdHIpIF9fc25kX2FsbG9jYShwdHIsIHNuZF90aW1lcl9wYXJhbXMpCitpbnQgc25kX3RpbWVyX3BhcmFtc19tYWxsb2Moc25kX3RpbWVyX3BhcmFtc190ICoqcHRyKTsKK3ZvaWQgc25kX3RpbWVyX3BhcmFtc19mcmVlKHNuZF90aW1lcl9wYXJhbXNfdCAqb2JqKTsKK3ZvaWQgc25kX3RpbWVyX3BhcmFtc19jb3B5KHNuZF90aW1lcl9wYXJhbXNfdCAqZHN0LCBjb25zdCBzbmRfdGltZXJfcGFyYW1zX3QgKnNyYyk7CisKK2ludCBzbmRfdGltZXJfcGFyYW1zX3NldF9hdXRvX3N0YXJ0KHNuZF90aW1lcl9wYXJhbXNfdCAqIHBhcmFtcywgaW50IGF1dG9fc3RhcnQpOworaW50IHNuZF90aW1lcl9wYXJhbXNfZ2V0X2F1dG9fc3RhcnQoc25kX3RpbWVyX3BhcmFtc190ICogcGFyYW1zKTsKK2ludCBzbmRfdGltZXJfcGFyYW1zX3NldF9leGNsdXNpdmUoc25kX3RpbWVyX3BhcmFtc190ICogcGFyYW1zLCBpbnQgZXhjbHVzaXZlKTsKK2ludCBzbmRfdGltZXJfcGFyYW1zX2dldF9leGNsdXNpdmUoc25kX3RpbWVyX3BhcmFtc190ICogcGFyYW1zKTsKK2ludCBzbmRfdGltZXJfcGFyYW1zX3NldF9lYXJseV9ldmVudChzbmRfdGltZXJfcGFyYW1zX3QgKiBwYXJhbXMsIGludCBlYXJseV9ldmVudCk7CitpbnQgc25kX3RpbWVyX3BhcmFtc19nZXRfZWFybHlfZXZlbnQoc25kX3RpbWVyX3BhcmFtc190ICogcGFyYW1zKTsKK3ZvaWQgc25kX3RpbWVyX3BhcmFtc19zZXRfdGlja3Moc25kX3RpbWVyX3BhcmFtc190ICogcGFyYW1zLCBsb25nIHRpY2tzKTsKK2xvbmcgc25kX3RpbWVyX3BhcmFtc19nZXRfdGlja3Moc25kX3RpbWVyX3BhcmFtc190ICogcGFyYW1zKTsKK3ZvaWQgc25kX3RpbWVyX3BhcmFtc19zZXRfcXVldWVfc2l6ZShzbmRfdGltZXJfcGFyYW1zX3QgKiBwYXJhbXMsIGxvbmcgcXVldWVfc2l6ZSk7Citsb25nIHNuZF90aW1lcl9wYXJhbXNfZ2V0X3F1ZXVlX3NpemUoc25kX3RpbWVyX3BhcmFtc190ICogcGFyYW1zKTsKK3ZvaWQgc25kX3RpbWVyX3BhcmFtc19zZXRfZmlsdGVyKHNuZF90aW1lcl9wYXJhbXNfdCAqIHBhcmFtcywgdW5zaWduZWQgaW50IGZpbHRlcik7Cit1bnNpZ25lZCBpbnQgc25kX3RpbWVyX3BhcmFtc19nZXRfZmlsdGVyKHNuZF90aW1lcl9wYXJhbXNfdCAqIHBhcmFtcyk7CisKK3NpemVfdCBzbmRfdGltZXJfc3RhdHVzX3NpemVvZih2b2lkKTsKKy8qKiBhbGxvY2F0ZSAjc25kX3RpbWVyX3N0YXR1c190IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfdGltZXJfc3RhdHVzX2FsbG9jYShwdHIpIF9fc25kX2FsbG9jYShwdHIsIHNuZF90aW1lcl9zdGF0dXMpCitpbnQgc25kX3RpbWVyX3N0YXR1c19tYWxsb2Moc25kX3RpbWVyX3N0YXR1c190ICoqcHRyKTsKK3ZvaWQgc25kX3RpbWVyX3N0YXR1c19mcmVlKHNuZF90aW1lcl9zdGF0dXNfdCAqb2JqKTsKK3ZvaWQgc25kX3RpbWVyX3N0YXR1c19jb3B5KHNuZF90aW1lcl9zdGF0dXNfdCAqZHN0LCBjb25zdCBzbmRfdGltZXJfc3RhdHVzX3QgKnNyYyk7CisKK3NuZF9odGltZXN0YW1wX3Qgc25kX3RpbWVyX3N0YXR1c19nZXRfdGltZXN0YW1wKHNuZF90aW1lcl9zdGF0dXNfdCAqIHN0YXR1cyk7Citsb25nIHNuZF90aW1lcl9zdGF0dXNfZ2V0X3Jlc29sdXRpb24oc25kX3RpbWVyX3N0YXR1c190ICogc3RhdHVzKTsKK2xvbmcgc25kX3RpbWVyX3N0YXR1c19nZXRfbG9zdChzbmRfdGltZXJfc3RhdHVzX3QgKiBzdGF0dXMpOworbG9uZyBzbmRfdGltZXJfc3RhdHVzX2dldF9vdmVycnVuKHNuZF90aW1lcl9zdGF0dXNfdCAqIHN0YXR1cyk7Citsb25nIHNuZF90aW1lcl9zdGF0dXNfZ2V0X3F1ZXVlKHNuZF90aW1lcl9zdGF0dXNfdCAqIHN0YXR1cyk7CisKKy8qIGRlcHJlY2F0ZWQgZnVuY3Rpb25zLCBmb3IgY29tcGF0aWJpbGl0eSAqLworbG9uZyBzbmRfdGltZXJfaW5mb19nZXRfdGlja3Moc25kX3RpbWVyX2luZm9fdCAqIGluZm8pOworCisvKiogXH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qKiBfX0FMU0FfVElNRVJfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvdXNlLWNhc2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS91c2UtY2FzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzN2M4NDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvdXNlLWNhc2UuaApAQCAtMCwwICsxLDM4MSBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL3VzZS1jYXNlLmgKKyAqIFxicmllZiB1c2UgY2FzZSBpbnRlcmZhY2UgZm9yIHRoZSBBTFNBIGRyaXZlcgorICogXGF1dGhvciBMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgorICogXGF1dGhvciBTdGVmYW4gU2NobWlkdCA8c3RlZmFuQHNsaW1sb2dpYy5jby51az4KKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgSnVzdGluIFh1IDxqdXN0aW54QHNsaW1sb2dpYy5jby51az4KKyAqIFxkYXRlIDIwMDgtMjAxMAorICovCisvKgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgU2xpbUxvZ2ljIEx0ZAorICogIENvcHlyaWdodCAoQykgMjAxMCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIFRleGFzIEluc3RydW1lbnRzIEluYy4KKyAqCisgKiAgU3VwcG9ydCBmb3IgdGhlIHZlcmIvZGV2aWNlL21vZGlmaWVyIGNvcmUgbG9naWMgYW5kIEFQSSwKKyAqICBjb21tYW5kIGxpbmUgdG9vbCBhbmQgZmlsZSBwYXJzZXIgd2FzIGtpbmRseSBzcG9uc29yZWQgYnkKKyAqICBUZXhhcyBJbnN0cnVtZW50cyBJbmMuCisgKiAgU3VwcG9ydCBmb3IgbXVsdGlwbGUgYWN0aXZlIG1vZGlmaWVycyBhbmQgZGV2aWNlcywKKyAqICB0cmFuc2l0aW9uIHNlcXVlbmNlcywgbXVsdGlwbGUgY2xpZW50IGFjY2VzcyBhbmQgdXNlciBkZWZpbmVkIHVzZQorICogIGNhc2VzIHdhcyBraW5kbHkgc3BvbnNvcmVkIGJ5IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKi8KKworI2lmbmRlZiBfX0FMU0FfVVNFX0NBU0VfSAorI2RlZmluZSBfX0FMU0FfVVNFX0NBU0VfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBVc2UgQ2FzZSBJbnRlcmZhY2UKKyAqICBUaGUgQUxTQSBVc2UgQ2FzZSBtYW5hZ2VyIGludGVyZmFjZS4KKyAqICBTZWUgXHJlZiBVc2VjYXNlIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqICBceworICovCisKKy8qKgorICogQUxTQSBVc2UgQ2FzZSBJbnRlcmZhY2UKKyAqCisgKiBUaGUgdXNlIGNhc2UgbWFuYWdlciB3b3JrcyBieSBjb25maWd1cmluZyB0aGUgc291bmQgY2FyZCBBTFNBIGtjb250cm9scyB0bworICogY2hhbmdlIHRoZSBoYXJkd2FyZSBkaWdpdGFsIGFuZCBhbmFsb2cgYXVkaW8gcm91dGluZyB0byBtYXRjaCB0aGUgcmVxdWVzdGVkCisgKiBkZXZpY2UgdXNlIGNhc2UuIFRoZSB1c2UgY2FzZSBtYW5hZ2VyIGtjb250cm9sIGNvbmZpZ3VyYXRpb25zIGFyZSBzdG9yZWQgaW4KKyAqIGVhc3kgdG8gbW9kaWZ5IHRleHQgZmlsZXMuCisgKgorICogQW4gYXVkaW8gdXNlIGNhc2UgY2FuIGJlIGRlZmluZWQgYnkgYSB2ZXJiIGFuZCBkZXZpY2UgcGFyYW1ldGVyLiBUaGUgdmVyYgorICogZGVzY3JpYmVzIHRoZSB1c2UgY2FzZSBhY3Rpb24gaS5lLiBhIHBob25lIGNhbGwsIGxpc3RlbmluZyB0byBtdXNpYywgcmVjb3JkaW5nCisgKiBhIGNvbnZlcnNhdGlvbiBldGMuIFRoZSBkZXZpY2UgZGVzY3JpYmVzIHRoZSBwaHlzaWNhbCBhdWRpbyBjYXB0dXJlIGFuZCBwbGF5YmFjaworICogaGFyZHdhcmUgaS5lLiBoZWFkcGhvbmVzLCBwaG9uZSBoYW5kc2V0LCBibHVldG9vdGggaGVhZHNldCwgZXRjLgorICoKKyAqIEl0J3MgaW50ZW5kZWQgY2xpZW50cyB3aWxsIG1vc3RseSBvbmx5IG5lZWQgdG8gc2V0IHRoZSB1c2UgY2FzZSB2ZXJiIGFuZAorICogZGV2aWNlIGZvciBlYWNoIHN5c3RlbSB1c2UgY2FzZSBjaGFuZ2UgKGFzIHRoZSB2ZXJiIGFuZCBkZXZpY2UgcGFyYW1ldGVycworICogY292ZXIgbW9zdCBhdWRpbyB1c2UgY2FzZXMpLgorICoKKyAqIEhvd2V2ZXIgdGhlcmUgYXJlIHRpbWVzIHdoZW4gYSB1c2UgY2FzZSBoYXMgdG8gYmUgbW9kaWZpZWQgYXQgcnVudGltZS4gZS5nLgorICoKKyAqICBvIEluY29taW5nIHBob25lIGNhbGwgd2hlbiB0aGUgZGV2aWNlIGlzIHBsYXlpbmcgbXVzaWMKKyAqICBvIFJlY29yZGluZyBzZWN0aW9ucyBvZiBhIHBob25lIGNhbGwKKyAqICBvIFBsYXlpbmcgdG9uZXMgZHVyaW5nIGEgY2FsbC4KKyAqCisgKiBJbiBvcmRlciB0byBhbGxvdyBhc3luY2hyb25vdXMgcnVudGltZSB1c2UgY2FzZSBhZGFwdGF0aW9ucywgd2UgaGF2ZSBhIHRoaXJkCisgKiBvcHRpb25hbCBtb2RpZmllciBwYXJhbWV0ZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIGNvbmZpZ3VyZQorICogdGhlIHVzZSBjYXNlIGR1cmluZyBsaXZlIGF1ZGlvIHJ1bnRpbWUuCisgKgorICogVGhpcyBpbnRlcmZhY2UgYWxsb3dzIGNsaWVudHMgdG8gOi0KKyAqCisgKiAgbyBRdWVyeSB0aGUgc3VwcG9ydGVkIHVzZSBjYXNlIHZlcmJzLCBkZXZpY2VzIGFuZCBtb2RpZmllcnMgZm9yIHRoZSBtYWNoaW5lLgorICogIG8gU2V0IGFuZCBHZXQgdXNlIGNhc2UgdmVyYnMsIGRldmljZXMgYW5kIG1vZGlmaWVycyBmb3IgdGhlIG1hY2hpbmUuCisgKiAgbyBHZXQgdGhlIEFMU0EgUENNIHBsYXliYWNrIGFuZCBjYXB0dXJlIGRldmljZSBQQ01zIGZvciB1c2UgY2FzZSB2ZXJiLAorICogICAgIHVzZSBjYXNlIGRldmljZSBhbmQgbW9kaWZpZXIuCisgKiAgbyBHZXQgdGhlIFRRIHBhcmFtZXRlciBmb3IgZWFjaCB1c2UgY2FzZSB2ZXJiLCB1c2UgY2FzZSBkZXZpY2UgYW5kCisgKiAgICAgbW9kaWZpZXIuCisgKiAgbyBHZXQgdGhlIEFMU0EgbWFzdGVyIHBsYXliYWNrIGFuZCBjYXB0dXJlIHZvbHVtZS9zd2l0Y2gga2NvbnRyb2xzCisgKiAgICAgZm9yIGVhY2ggdXNlIGNhc2UuCisgKi8KKworCisvKgorICogVXNlIENhc2UgVmVyYi4KKyAqCisgKiBUaGUgdXNlIGNhc2UgdmVyYiBpcyB0aGUgbWFpbiBkZXZpY2UgYXVkaW8gYWN0aW9uLiBlLmcuIHRoZSAiSGlGaSIgdXNlCisgKiBjYXNlIHZlcmIgd2lsbCBjb25maWd1cmUgdGhlIGF1ZGlvIGhhcmR3YXJlIGZvciBIaUZpIE11c2ljIHBsYXliYWNrCisgKiBhbmQgY2FwdHVyZS4KKyAqLworI2RlZmluZSBTTkRfVVNFX0NBU0VfVkVSQl9JTkFDVElWRQkJIkluYWN0aXZlIgorI2RlZmluZSBTTkRfVVNFX0NBU0VfVkVSQl9ISUZJCQkJIkhpRmkiCisjZGVmaW5lIFNORF9VU0VfQ0FTRV9WRVJCX0hJRklfTE9XX1BPV0VSCSJIaUZpIExvdyBQb3dlciIKKyNkZWZpbmUgU05EX1VTRV9DQVNFX1ZFUkJfVk9JQ0UJCQkiVm9pY2UiCisjZGVmaW5lIFNORF9VU0VfQ0FTRV9WRVJCX1ZPSUNFX0xPV19QT1dFUgkiVm9pY2UgTG93IFBvd2VyIgorI2RlZmluZSBTTkRfVVNFX0NBU0VfVkVSQl9WT0lDRUNBTEwJCSJWb2ljZSBDYWxsIgorI2RlZmluZSBTTkRfVVNFX0NBU0VfVkVSQl9JUF9WT0lDRUNBTEwJCSJWb2ljZSBDYWxsIElQIgorI2RlZmluZSBTTkRfVVNFX0NBU0VfVkVSQl9BTkFMT0dfUkFESU8JCSJGTSBBbmFsb2cgUmFkaW8iCisjZGVmaW5lIFNORF9VU0VfQ0FTRV9WRVJCX0RJR0lUQUxfUkFESU8JCSJGTSBEaWdpdGFsIFJhZGlvIgorLyogYWRkIG5ldyB2ZXJicyB0byBlbmQgb2YgbGlzdCAqLworCisKKy8qCisgKiBVc2UgQ2FzZSBEZXZpY2UuCisgKgorICogUGh5c2ljYWwgc3lzdGVtIGRldmljZXMgdGhlIHJlbmRlciBhbmQgY2FwdHVyZSBhdWRpby4gRGV2aWNlcyBjYW4gYmUgT1InZWQKKyAqIHRvZ2V0aGVyIHRvIHN1cHBvcnQgYXVkaW8gb24gc2ltdWx0YW5lb3VzIGRldmljZXMuCisgKi8KKyNkZWZpbmUgU05EX1VTRV9DQVNFX0RFVl9OT05FCQkiTm9uZSIKKyNkZWZpbmUgU05EX1VTRV9DQVNFX0RFVl9TUEVBS0VSCSJTcGVha2VyIgorI2RlZmluZSBTTkRfVVNFX0NBU0VfREVWX0xJTkUJCSJMaW5lIgorI2RlZmluZSBTTkRfVVNFX0NBU0VfREVWX0hFQURQSE9ORVMJIkhlYWRwaG9uZXMiCisjZGVmaW5lIFNORF9VU0VfQ0FTRV9ERVZfSEVBRFNFVAkiSGVhZHNldCIKKyNkZWZpbmUgU05EX1VTRV9DQVNFX0RFVl9IQU5EU0VUCSJIYW5kc2V0IgorI2RlZmluZSBTTkRfVVNFX0NBU0VfREVWX0JMVUVUT09USAkiQmx1ZXRvb3RoIgorI2RlZmluZSBTTkRfVVNFX0NBU0VfREVWX0VBUlBJRUNFCSJFYXJwaWVjZSIKKyNkZWZpbmUgU05EX1VTRV9DQVNFX0RFVl9TUERJRgkJIlNQRElGIgorI2RlZmluZSBTTkRfVVNFX0NBU0VfREVWX0hETUkJCSJIRE1JIgorLyogYWRkIG5ldyBkZXZpY2VzIHRvIGVuZCBvZiBsaXN0ICovCisKKworLyoKKyAqIFVzZSBDYXNlIE1vZGlmaWVycy4KKyAqCisgKiBUaGUgdXNlIGNhc2UgbW9kaWZpZXIgYWxsb3dzIHJ1bnRpbWUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIHRvIGRlYWwgd2l0aAorICogYXN5bmNocm9ub3VzIGV2ZW50cy4KKyAqCisgKiBlLmcuIHRvIHJlY29yZCBhIHZvaWNlIGNhbGwgOi0KKyAqICAxLiBTZXQgdmVyYiB0byBTTkRfVVNFX0NBU0VfVkVSQl9WT0lDRUNBTEwgKGZvciB2b2ljZSBjYWxsKQorICogIDIuIFNldCBtb2RpZmllciBTTkRfVVNFX0NBU0VfTU9EX0NBUFRVUkVfVk9JQ0Ugd2hlbiBjYXB0dXJlIHJlcXVpcmVkLgorICogIDMuIENhbGwgc25kX3VzZV9jYXNlX2dldCgiQ2FwdHVyZVBDTSIpIHRvIGdldCBBTFNBIHNvdXJjZSBQQ00gbmFtZQorICogICAgIHdpdGggY2FwdHVyZWQgdm9pY2UgcGNtIGRhdGEuCisgKgorICogZS5nLiB0byBwbGF5IGEgcmluZyB0b25lIHdoZW4gbGlzdGVuaW4gdG8gTVAzIE11c2ljIDotCisgKiAgMS4gU2V0IHZlcmIgdG8gU05EX1VTRV9DQVNFX1ZFUkJfSElGSSAoZm9yIE1QMyBwbGF5YmFjaykKKyAqICAyLiBTZXQgbW9kaWZpZXIgdG8gU05EX1VTRV9DQVNFX01PRF9QTEFZX1RPTkUgd2hlbiBpbmNvbWluZyBjYWxsIGhhcHBlbnMuCisgKiAgMy4gQ2FsbCBzbmRfdXNlX2Nhc2VfZ2V0KCJQbGF5YmFja1BDTSIpIHRvIGdldCBBTFNBIFBDTSBzaW5rIG5hbWUgZm9yCisgKiAgICAgcmluZ3RvbmUgcGNtIGRhdGEuCisgKi8KKyNkZWZpbmUgU05EX1VTRV9DQVNFX01PRF9DQVBUVVJFX1ZPSUNFCQkiQ2FwdHVyZSBWb2ljZSIKKyNkZWZpbmUgU05EX1VTRV9DQVNFX01PRF9DQVBUVVJFX01VU0lDCQkiQ2FwdHVyZSBNdXNpYyIKKyNkZWZpbmUgU05EX1VTRV9DQVNFX01PRF9QTEFZX01VU0lDCQkiUGxheSBNdXNpYyIKKyNkZWZpbmUgU05EX1VTRV9DQVNFX01PRF9QTEFZX1ZPSUNFCQkiUGxheSBWb2ljZSIKKyNkZWZpbmUgU05EX1VTRV9DQVNFX01PRF9QTEFZX1RPTkUJCSJQbGF5IFRvbmUiCisjZGVmaW5lIFNORF9VU0VfQ0FTRV9NT0RfRUNIT19SRUYJCSJFY2hvIFJlZmVyZW5jZSIKKy8qIGFkZCBuZXcgbW9kaWZpZXJzIHRvIGVuZCBvZiBsaXN0ICovCisKKworLyoqCisgKiBUUSAtIFRvbmUgUXVhbGl0eQorICoKKyAqIFRoZSBpbnRlcmZhY2UgYWxsb3dzIGNsaWVudHMgdG8gZGV0ZXJtaW5lIHRoZSBhdWRpbyBUUSByZXF1aXJlZCBmb3IgZWFjaAorICogdXNlIGNhc2UgdmVyYiBhbmQgbW9kaWZpZXIuIEl0J3MgaW50ZW5kZWQgYXMgYW4gb3B0aW9uYWwgaGludCB0byB0aGUKKyAqIGF1ZGlvIGRyaXZlciBpbiBvcmRlciB0byBsb3dlciBwb3dlciBjb25zdW1wdGlvbi4KKyAqCisgKi8KKyNkZWZpbmUgU05EX1VTRV9DQVNFX1RRX01VU0lDCQkiTXVzaWMiCisjZGVmaW5lIFNORF9VU0VfQ0FTRV9UUV9WT0lDRQkJIlZvaWNlIgorI2RlZmluZSBTTkRfVVNFX0NBU0VfVFFfVE9ORVMJCSJUb25lcyIKKworLyoqIHVzZSBjYXNlIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3VzZV9jYXNlX21nciBzbmRfdXNlX2Nhc2VfbWdyX3Q7CisKKy8qKgorICogXGJyaWVmIENyZWF0ZSBhbiBpZGVudGlmaWVyCisgKiBccGFyYW0gZm10IEZvcm1hdCAoc3ByaW50ZiBsaWtlKQorICogXHBhcmFtIC4uLiBPcHRpb25hbCBhcmd1bWVudHMgZm9yIHNwcmludGYgbGlrZSBmb3JtYXQKKyAqIFxyZXR1cm4gQWxsb2NhdGVkIHN0cmluZyBpZGVudGlmaWVyIG9yIE5VTEwgb24gZXJyb3IKKyAqLworY2hhciAqc25kX3VzZV9jYXNlX2lkZW50aWZpZXIoY29uc3QgY2hhciAqZm10LCAuLi4pOworCisvKioKKyAqIFxicmllZiBGcmVlIGEgc3RyaW5nIGxpc3QKKyAqIFxwYXJhbSBsaXN0IFRoZSBzdHJpbmcgbGlzdCB0byBmcmVlCisgKiBccGFyYW0gaXRlbXMgQ291bnQgb2Ygc3RyaW5ncworICogXHJldHVybiBaZXJvIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworaW50IHNuZF91c2VfY2FzZV9mcmVlX2xpc3QoY29uc3QgY2hhciAqbGlzdFtdLCBpbnQgaXRlbXMpOworCisvKioKKyAqIFxicmllZiBPYnRhaW4gYSBsaXN0IG9mIGVudHJpZXMKKyAqIFxwYXJhbSB1Y19tZ3IgVXNlIGNhc2UgbWFuYWdlciAobWF5IGJlIE5VTEwgLSBjYXJkIGxpc3QpCisgKiBccGFyYW0gaWRlbnRpZmllciAobWF5IGJlIE5VTEwgLSBjYXJkIGxpc3QpCisgKiBccGFyYW0gbGlzdCBSZXR1cm5lZCBhbGxvY2F0ZWQgbGlzdAorICogXHJldHVybiBOdW1iZXIgb2YgbGlzdCBlbnRyaWVzIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqCisgKiBEZWZpbmVkIGlkZW50aWZpZXJzOgorICogICBOVUxMIAkJLSBnZXQgY2FyZCBsaXN0CisgKgkJCSAgKGluIHBhaXIgY2FyZG5hbWUrY29tbWVudCkKKyAqICAgX3ZlcmJzCQktIGdldCB2ZXJiIGxpc3QKKyAqCQkJICAoaW4gcGFpciB2ZXJiK2NvbW1lbnQpCisgKiAgIF9kZXZpY2VzWy88dmVyYj5dCS0gZ2V0IGxpc3Qgb2Ygc3VwcG9ydGVkIGRldmljZXMKKyAqCQkJICAoaW4gcGFpciBkZXZpY2UrY29tbWVudCkKKyAqICAgX21vZGlmaWVyc1svPHZlcmI+XS0gZ2V0IGxpc3Qgb2Ygc3VwcG9ydGVkIG1vZGlmaWVycworICoJCQkgIChpbiBwYWlyIG1vZGlmaWVyK2NvbW1lbnQpCisgKiAgIFRRWy88dmVyYj5dCS0gZ2V0IGxpc3Qgb2YgVFEgaWRlbnRpZmllcnMKKyAqICAgX2VuYWRldnMJCS0gZ2V0IGxpc3Qgb2YgZW5hYmxlZCBkZXZpY2VzCisgKiAgIF9lbmFtb2RzCQktIGdldCBsaXN0IG9mIGVuYWJsZWQgbW9kaWZpZXJzCisgKgorICogICBfc3VwcG9ydGVkZGV2cy88bW9kaWZpZXI+fDxkZXZpY2U+Wy88dmVyYj5dICAgLSBsaXN0IG9mIHN1cHBvcnRlZCBkZXZpY2VzCisgKiAgIF9jb25mbGljdGluZ2RldnMvPG1vZGlmaWVyPnw8ZGV2aWNlPlsvPHZlcmI+XSAtIGxpc3Qgb2YgY29uZmxpY3RpbmcgZGV2aWNlcworICogICBOb3RlIHRoYXQgYXQgbW9zdCBvbmUgb2YgdGhlIHN1cHBvcnRlZC9jb25mbGljdGluZyBkZXZzIGxpc3RzIGhhcworICogICBhbnkgZW50cmllcywgYW5kIHdoZW4gbmVpdGhlciBpcyBwcmVzZW50LCBhbGwgZGV2aWNlcyBhcmUgc3VwcG9ydGVkLgorICoKKyAqLworaW50IHNuZF91c2VfY2FzZV9nZXRfbGlzdChzbmRfdXNlX2Nhc2VfbWdyX3QgKnVjX21nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaWRlbnRpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmxpc3RbXSk7CisKKworLyoqCisgKiBcYnJpZWYgR2V0IGN1cnJlbnQgLSBzdHJpbmcKKyAqIFxwYXJhbSB1Y19tZ3IgVXNlIGNhc2UgbWFuYWdlcgorICogXHBhcmFtIGlkZW50aWZpZXIgCisgKiBccGFyYW0gdmFsdWUgVmFsdWUgcG9pbnRlcgorICogXHJldHVybiBaZXJvIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqCisgKiBOb3RlOiBTdHJpbmcgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLCB1c2UgZnJlZSgpIHRvCisgKiBkZWFsbG9jYXRlIHRoaXMgc3RyaW5nLgorICoKKyAqIEtub3duIGlkZW50aWZpZXJzOgorICogICBOVUxMIAkJLSByZXR1cm4gY3VycmVudCBjYXJkCisgKiAgIF92ZXJiCQktIHJldHVybiBjdXJyZW50IHZlcmIKKyAqCisgKiAgIFs9XTxOQU1FPlsvWzxtb2RpZmllcj58PC9kZXZpY2U+XVsvPHZlcmI+XV0KKyAqICAgICAgICAgICAgICAgICAgICAgIC0gdmFsdWUgaWRlbnRpZmllciA8TkFNRT4KKyAqICAgICAgICAgICAgICAgICAgICAgIC0gU2VhcmNoIHN0YXJ0cyBhdCBnaXZlbiBtb2RpZmllciBvciBkZXZpY2UgaWYgYW55LAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgYXQgYSB2ZXJiCisgKiAgICAgICAgICAgICAgICAgICAgICAtIFNlYXJjaCBzdGFydHMgYXQgZ2l2ZW4gdmVyYiBpZiBhbnksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBjdXJyZW50IHZlcmIKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gU2VhcmNoZXMgbW9kaWZpZXIvZGV2aWNlLCB0aGVuIHZlcmIsIHRoZW4gZGVmYXVsdHMKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gU3BlY2lmeSBhIGxlYWRpbmcgIj0iIHRvIHNlYXJjaCBvbmx5IHRoZSBleGFjdAorICogICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UvbW9kaWZpZXIvdmVyYiBzcGVjaWZpZWQsIGFuZCBub3Qgc2VhcmNoCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRocm91Z2ggZWFjaCBvYmplY3QgaW4gdHVybi4KKyAqICAgICAgICAgICAgICAgICAgICAgIC0gRXhhbXBsZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIlBsYXliYWNrUENNL1BsYXkgTXVzaWMiCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhcHR1cmVQQ00vU1BESUYiCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEZyb20gVmFsdWVEZWZhdWx0cyBvbmx5OgorICogICAgICAgICAgICAgICAgICAgICAgICAgICI9VmFyaWFibGUiCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEZyb20gY3VycmVudCBhY3RpdmUgdmVyYjoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAiPVZhcmlhYmxlLy8iCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEZyb20gdmVyYiAiVmVyYiI6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIj1WYXJpYWJsZS8vVmVyYiIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgRnJvbSAiTW9kaWZpZXIiIGluIGN1cnJlbnQgYWN0aXZlIHZlcmI6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIj1WYXJpYWJsZS9Nb2RpZmllci8iCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEZyb20gIk1vZGlmaWVyIiBpbiAiVmVyYiI6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIj1WYXJpYWJsZS9Nb2RpZmllci9WZXJiIgorICoKKyAqIFJlY29tbWVuZGVkIG5hbWVzIGZvciB2YWx1ZXM6CisgKiAgIFRRCQkJLSBUb25lIFF1YWxpdHkKKyAqICAgUGxheWJhY2tQQ00JLSBmdWxsIFBDTSBwbGF5YmFjayBkZXZpY2UgbmFtZQorICogICBDYXB0dXJlUENNCQktIGZ1bGwgUENNIGNhcHR1cmUgZGV2aWNlIG5hbWUKKyAqICAgUGxheWJhY2tDVEwJLSBwbGF5YmFjayBjb250cm9sIGRldmljZSBuYW1lCisgKiAgIFBsYXliYWNrVm9sdW1lCS0gcGxheWJhY2sgY29udHJvbCB2b2x1bWUgSUQgc3RyaW5nCisgKiAgIFBsYXliYWNrU3dpdGNoCS0gcGxheWJhY2sgY29udHJvbCBzd2l0Y2ggSUQgc3RyaW5nCisgKiAgIENhcHR1cmVDVEwJCS0gY2FwdHVyZSBjb250cm9sIGRldmljZSBuYW1lCisgKiAgIENhcHR1cmVWb2x1bWUJLSBjYXB0dXJlIGNvbnRyb2wgdm9sdW1lIElEIHN0cmluZworICogICBDYXB0dXJlU3dpdGNoCS0gY2FwdHVyZSBjb250cm9sIHN3aXRjaCBJRCBzdHJpbmcKKyAqICAgUGxheWJhY2tNaXhlcgktIG5hbWUgb2YgcGxheWJhY2sgbWl4ZXIKKyAqICAgUGxheWJhY2tNaXhlcklECS0gbWl4ZXIgcGxheWJhY2sgSUQKKyAqICAgQ2FwdHVyZU1peGVyCS0gbmFtZSBvZiBjYXB0dXJlIG1peGVyCisgKiAgIENhcHR1cmVNaXhlcklECS0gbWl4ZXIgY2FwdHVyZSBJRAorICovCitpbnQgc25kX3VzZV9jYXNlX2dldChzbmRfdXNlX2Nhc2VfbWdyX3QgKnVjX21nciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmlkZW50aWZpZXIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqdmFsdWUpOworCisvKioKKyAqIFxicmllZiBHZXQgY3VycmVudCAtIGludGVnZXIKKyAqIFxwYXJhbSB1Y19tZ3IgVXNlIGNhc2UgbWFuYWdlcgorICogXHBhcmFtIGlkZW50aWZpZXIgCisgKiBccGFyYW0gdmFsdWUgcmVzdWx0IAorICogXHJldHVybiBaZXJvIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqCisgKiBLbm93biBpZGVudGlmaWVyczoKKyAqICAgX2RldnN0YXR1cy88ZGV2aWNlPgktIHJldHVybiBzdGF0dXMgZm9yIGdpdmVuIGRldmljZQorICogICBfbW9kc3RhdHVzLzxtb2RpZmllcj4JLSByZXR1cm4gc3RhdHVzIGZvciBnaXZlbiBtb2RpZmllcgorICovCitpbnQgc25kX3VzZV9jYXNlX2dldGkoc25kX3VzZV9jYXNlX21ncl90ICp1Y19tZ3IsCisJCSAgICAgIGNvbnN0IGNoYXIgKmlkZW50aWZpZXIsCisJCSAgICAgIGxvbmcgKnZhbHVlKTsKKworLyoqCisgKiBcYnJpZWYgU2V0IG5ldworICogXHBhcmFtIHVjX21nciBVc2UgY2FzZSBtYW5hZ2VyCisgKiBccGFyYW0gaWRlbnRpZmllcgorICogXHBhcmFtIHZhbHVlIFZhbHVlCisgKiBccmV0dXJuIFplcm8gaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICoKKyAqIEtub3duIGlkZW50aWZpZXJzOgorICogICBfdmVyYiAJCS0gc2V0IGN1cnJlbnQgdmVyYiA9IHZhbHVlCisgKiAgIF9lbmFkZXYJCS0gZW5hYmxlIGdpdmVuIGRldmljZSA9IHZhbHVlCisgKiAgIF9kaXNkZXYJCS0gZGlzYWJsZSBnaXZlbiBkZXZpY2UgPSB2YWx1ZQorICogICBfc3dkZXYvPG9sZF9kZXZpY2U+IC0gbmV3X2RldmljZSA9IHZhbHVlCisgKgkJCS0gZGlzYWJsZSBvbGRfZGV2aWNlIGFuZCB0aGVuIGVuYWJsZSBuZXdfZGV2aWNlCisgKgkJCS0gaWYgb2xkX2RldmljZSBpcyBub3QgZW5hYmxlZCBqdXN0IHJldHVybgorICoJCQktIGNoZWNrIHRyYW5zbWl0IHNlcXVlbmNlIGZpcnN0bHkKKyAqICAgX2VuYW1vZAkJLSBlbmFibGUgZ2l2ZW4gbW9kaWZpZXIgPSB2YWx1ZQorICogICBfZGlzbW9kCQktIGRpc2FibGUgZ2l2ZW4gbW9kaWZpZXIgPSB2YWx1ZQorICogICBfc3dtb2QvPG9sZF9tb2RpZmllcj4gLSBuZXdfbW9kaWZpZXIgPSB2YWx1ZQorICoJCQktIGRpc2FibGUgb2xkX21vZGlmaWVyIGFuZCB0aGVuIGVuYWJsZSBuZXdfbW9kaWZpZXIKKyAqCQkJLSBpZiBvbGRfbW9kaWZpZXIgaXMgbm90IGVuYWJsZWQganVzdCByZXR1cm4KKyAqCQkJLSBjaGVjayB0cmFuc21pdCBzZXF1ZW5jZSBmaXJzdGx5CisgKi8KK2ludCBzbmRfdXNlX2Nhc2Vfc2V0KHNuZF91c2VfY2FzZV9tZ3JfdCAqdWNfbWdyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaWRlbnRpZmllciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKTsKKworLyoqCisgKiBcYnJpZWYgT3BlbiBhbmQgaW5pdGlhbGlzZSB1c2UgY2FzZSBjb3JlIGZvciBzb3VuZCBjYXJkCisgKiBccGFyYW0gdWNfbWdyIFJldHVybmVkIHVzZSBjYXNlIG1hbmFnZXIgcG9pbnRlcgorICogXHBhcmFtIGNhcmRfbmFtZSBTb3VuZCBjYXJkIG5hbWUuCisgKiBccmV0dXJuIHplcm8gaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICovCitpbnQgc25kX3VzZV9jYXNlX21ncl9vcGVuKHNuZF91c2VfY2FzZV9tZ3JfdCAqKnVjX21nciwgY29uc3QgY2hhciAqY2FyZF9uYW1lKTsKKworCisvKioKKyAqIFxicmllZiBSZWxvYWQgYW5kIHJlLXBhcnNlIHVzZSBjYXNlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIHNvdW5kIGNhcmQuCisgKiBccGFyYW0gdWNfbWdyIFVzZSBjYXNlIG1hbmFnZXIKKyAqIFxyZXR1cm4gemVybyBpZiBzdWNjZXNzLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKi8KK2ludCBzbmRfdXNlX2Nhc2VfbWdyX3JlbG9hZChzbmRfdXNlX2Nhc2VfbWdyX3QgKnVjX21ncik7CisKKy8qKgorICogXGJyaWVmIENsb3NlIHVzZSBjYXNlIG1hbmFnZXIKKyAqIFxwYXJhbSB1Y19tZ3IgVXNlIGNhc2UgbWFuYWdlcgorICogXHJldHVybiB6ZXJvIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworaW50IHNuZF91c2VfY2FzZV9tZ3JfY2xvc2Uoc25kX3VzZV9jYXNlX21ncl90ICp1Y19tZ3IpOworCisvKioKKyAqIFxicmllZiBSZXNldCB1c2UgY2FzZSBtYW5hZ2VyIHZlcmIsIGRldmljZSwgbW9kaWZpZXIgdG8gZGVhZnVsdCBzZXR0aW5ncy4KKyAqIFxwYXJhbSB1Y19tZ3IgVXNlIGNhc2UgbWFuYWdlcgorICogXHJldHVybiB6ZXJvIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworaW50IHNuZF91c2VfY2FzZV9tZ3JfcmVzZXQoc25kX3VzZV9jYXNlX21ncl90ICp1Y19tZ3IpOworCisvKgorICogaGVscGVyIGZ1bmN0aW9ucworICovCisKKy8qKgorICogXGJyaWVmIE9idGFpbiBhIGxpc3Qgb2YgY2FyZHMKKyAqIFxwYXJhbSBsaXN0IFJldHVybmVkIGFsbG9jYXRlZCBsaXN0CisgKiBccmV0dXJuIE51bWJlciBvZiBsaXN0IGVudHJpZXMgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW5saW5lIGludCBzbmRfdXNlX2Nhc2VfY2FyZF9saXN0KGNvbnN0IGNoYXIgKipsaXN0W10pCit7CisJcmV0dXJuIHNuZF91c2VfY2FzZV9nZXRfbGlzdChOVUxMLCBOVUxMLCBsaXN0KTsKK30KKworLyoqCisgKiBcYnJpZWYgT2J0YWluIGEgbGlzdCBvZiB2ZXJicworICogXHBhcmFtIHVjX21nciBVc2UgY2FzZSBtYW5hZ2VyCisgKiBccGFyYW0gbGlzdCBSZXR1cm5lZCBsaXN0IG9mIHZlcmJzCisgKiBccmV0dXJuIE51bWJlciBvZiBsaXN0IGVudHJpZXMgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW5saW5lIGludCBzbmRfdXNlX2Nhc2VfdmVyYl9saXN0KHNuZF91c2VfY2FzZV9tZ3JfdCAqdWNfbWdyLAorCQkJCQkgY29uc3QgY2hhciAqKmxpc3RbXSkKK3sKKwlyZXR1cm4gc25kX3VzZV9jYXNlX2dldF9saXN0KHVjX21nciwgIl92ZXJicyIsIGxpc3QpOworfQorCisvKioKKyAqICBcfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FMU0FfVVNFX0NBU0VfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3ZlcnNpb24uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0Y2U5ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS92ZXJzaW9uLmgKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqICB2ZXJzaW9uLmgKKyAqLworCisjZGVmaW5lIFNORF9MSUJfTUFKT1IJCTEgLyoqPCBtYWpvciBudW1iZXIgb2YgbGlicmFyeSB2ZXJzaW9uICovCisjZGVmaW5lIFNORF9MSUJfTUlOT1IJCTAgLyoqPCBtaW5vciBudW1iZXIgb2YgbGlicmFyeSB2ZXJzaW9uICovCisjZGVmaW5lIFNORF9MSUJfU1VCTUlOT1IJMjUgLyoqPCBzdWJtaW5vciBudW1iZXIgb2YgbGlicmFyeSB2ZXJzaW9uICovCisjZGVmaW5lIFNORF9MSUJfRVhUUkFWRVIJMTAwMDAwMCAvKio8IGV4dHJhIHZlcnNpb24gbnVtYmVyLCB1c2VkIG1haW5seSBmb3IgYmV0YXMgKi8KKy8qKiBsaWJyYXJ5IHZlcnNpb24gKi8KKyNkZWZpbmUgU05EX0xJQl9WRVJTSU9OCQkoKFNORF9MSUJfTUFKT1I8PDE2KXxcCisJCQkJIChTTkRfTElCX01JTk9SPDw4KXxcCisJCQkJICBTTkRfTElCX1NVQk1JTk9SKQorLyoqIGxpYnJhcnkgdmVyc2lvbiAoc3RyaW5nKSAqLworI2RlZmluZSBTTkRfTElCX1ZFUlNJT05fU1RSCSIxLjAuMjUiCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDE1N2VjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hci5oCkBAIC0wLDAgKzEsNDggQEAKKy8qIEhlYWRlciBkZXNjcmliaW5nIGBhcicgYXJjaGl2ZSBmaWxlIGZvcm1hdC4KKyAgIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfQVJfSAorI2RlZmluZSBfQVJfSCAxCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKworLyogQXJjaGl2ZSBmaWxlcyBzdGFydCB3aXRoIHRoZSBBUk1BRyBpZGVudGlmeWluZyBzdHJpbmcuICBUaGVuIGZvbGxvd3MgYQorICAgYHN0cnVjdCBhcl9oZHInLCBhbmQgYXMgbWFueSBieXRlcyBvZiBtZW1iZXIgZmlsZSBkYXRhIGFzIGl0cyBgYXJfc2l6ZScKKyAgIG1lbWJlciBpbmRpY2F0ZXMsIGZvciBlYWNoIG1lbWJlciBmaWxlLiAgKi8KKworI2RlZmluZSBBUk1BRwkiITxhcmNoPlxuIgkvKiBTdHJpbmcgdGhhdCBiZWdpbnMgYW4gYXJjaGl2ZSBmaWxlLiAgKi8KKyNkZWZpbmUgU0FSTUFHCTgJCS8qIFNpemUgb2YgdGhhdCBzdHJpbmcuICAqLworCisjZGVmaW5lIEFSRk1BRwkiYFxuIgkJLyogU3RyaW5nIGluIGFyX2ZtYWcgYXQgZW5kIG9mIGVhY2ggaGVhZGVyLiAgKi8KKworX19CRUdJTl9ERUNMUworCitzdHJ1Y3QgYXJfaGRyCisgIHsKKyAgICBjaGFyIGFyX25hbWVbMTZdOwkJLyogTWVtYmVyIGZpbGUgbmFtZSwgc29tZXRpbWVzIC8gdGVybWluYXRlZC4gKi8KKyAgICBjaGFyIGFyX2RhdGVbMTJdOwkJLyogRmlsZSBkYXRlLCBkZWNpbWFsIHNlY29uZHMgc2luY2UgRXBvY2guICAqLworICAgIGNoYXIgYXJfdWlkWzZdLCBhcl9naWRbNl07CS8qIFVzZXIgYW5kIGdyb3VwIElEcywgaW4gQVNDSUkgZGVjaW1hbC4gICovCisgICAgY2hhciBhcl9tb2RlWzhdOwkJLyogRmlsZSBtb2RlLCBpbiBBU0NJSSBvY3RhbC4gICovCisgICAgY2hhciBhcl9zaXplWzEwXTsJCS8qIEZpbGUgc2l6ZSwgaW4gQVNDSUkgZGVjaW1hbC4gICovCisgICAgY2hhciBhcl9mbWFnWzJdOwkJLyogQWx3YXlzIGNvbnRhaW5zIEFSRk1BRy4gICovCisgIH07CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBhci5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FyZ3AuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJncC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YTk1NGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FyZ3AuaApAQCAtMCwwICsxLDYwMSBAQAorLyogSGllcmFyY2hpYWwgYXJndW1lbnQgcGFyc2luZywgbGF5ZXJlZCBvdmVyIGdldG9wdC4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgV3JpdHRlbiBieSBNaWxlcyBCYWRlciA8bWlsZXNAZ251LmFpLm1pdC5lZHU+LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfQVJHUF9ICisjZGVmaW5lIF9BUkdQX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2RlZmluZSBfX25lZWRfZXJyb3JfdAorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpZm5kZWYgX19jb25zdAorIyBkZWZpbmUgX19jb25zdCBjb25zdAorI2VuZGlmCisKKyNpZm5kZWYgX19USFJPVworIyBkZWZpbmUgX19USFJPVworI2VuZGlmCisjaWZuZGVmIF9fTlRICisjIGRlZmluZSBfX05USChmY3QpIGZjdCBfX1RIUk9XCisjZW5kaWYKKworI2lmbmRlZiBfX2F0dHJpYnV0ZV9fCisvKiBUaGlzIGZlYXR1cmUgaXMgYXZhaWxhYmxlIGluIGdjYyB2ZXJzaW9ucyAyLjUgYW5kIGxhdGVyLiAgKi8KKyMgaWYgX19HTlVDX18gPCAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDwgNSkgfHwgX19TVFJJQ1RfQU5TSV9fCisjICBkZWZpbmUgX19hdHRyaWJ1dGVfXyhTcGVjKSAvKiBlbXB0eSAqLworIyBlbmRpZgorLyogVGhlIF9fLXByb3RlY3RlZCB2YXJpYW50cyBvZiBgZm9ybWF0JyBhbmQgYHByaW50ZicgYXR0cmlidXRlcworICAgYXJlIGFjY2VwdGVkIGJ5IGdjYyB2ZXJzaW9ucyAyLjYuNCAoZWZmZWN0aXZlbHkgMi43KSBhbmQgbGF0ZXIuICAqLworIyBpZiBfX0dOVUNfXyA8IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA3KSB8fCBfX1NUUklDVF9BTlNJX18KKyMgIGRlZmluZSBfX2Zvcm1hdF9fIGZvcm1hdAorIyAgZGVmaW5lIF9fcHJpbnRmX18gcHJpbnRmCisjIGVuZGlmCisjZW5kaWYKKworLyogR0NDIDIuOTUgYW5kIGxhdGVyIGhhdmUgIl9fcmVzdHJpY3QiOyBDOTkgY29tcGlsZXJzIGhhdmUKKyAgICJyZXN0cmljdCIsIGFuZCAiY29uZmlndXJlIiBtYXkgaGF2ZSBkZWZpbmVkICJyZXN0cmljdCIuICAqLworI2lmbmRlZiBfX3Jlc3RyaWN0CisjIGlmICEgKDIgPCBfX0dOVUNfXyB8fCAoMiA9PSBfX0dOVUNfXyAmJiA5NSA8PSBfX0dOVUNfTUlOT1JfXykpCisjICBpZiBkZWZpbmVkIHJlc3RyaWN0IHx8IDE5OTkwMUwgPD0gX19TVERDX1ZFUlNJT05fXworIyAgIGRlZmluZSBfX3Jlc3RyaWN0IHJlc3RyaWN0CisjICBlbHNlCisjICAgZGVmaW5lIF9fcmVzdHJpY3QKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfX2Vycm9yX3RfZGVmaW5lZAordHlwZWRlZiBpbnQgZXJyb3JfdDsKKyMgZGVmaW5lIF9fZXJyb3JfdF9kZWZpbmVkCisjZW5kaWYKKwwKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEEgZGVzY3JpcHRpb24gb2YgYSBwYXJ0aWN1bGFyIG9wdGlvbi4gIEEgcG9pbnRlciB0byBhbiBhcnJheSBvZgorICAgdGhlc2UgaXMgcGFzc2VkIGluIHRoZSBPUFRJT05TIGZpZWxkIG9mIGFuIGFyZ3Agc3RydWN0dXJlLiAgRWFjaCBvcHRpb24KKyAgIGVudHJ5IGNhbiBjb3JyZXNwb25kIHRvIG9uZSBsb25nIG9wdGlvbiBhbmQvb3Igb25lIHNob3J0IG9wdGlvbjsgbW9yZQorICAgbmFtZXMgZm9yIHRoZSBzYW1lIG9wdGlvbiBjYW4gYmUgYWRkZWQgYnkgZm9sbG93aW5nIGFuIGVudHJ5IGluIGFuIG9wdGlvbgorICAgYXJyYXkgd2l0aCBvcHRpb25zIGhhdmluZyB0aGUgT1BUSU9OX0FMSUFTIGZsYWcgc2V0LiAgKi8KK3N0cnVjdCBhcmdwX29wdGlvbgoreworICAvKiBUaGUgbG9uZyBvcHRpb24gbmFtZS4gIEZvciBtb3JlIHRoYW4gb25lIG5hbWUgZm9yIHRoZSBzYW1lIG9wdGlvbiwgeW91CisgICAgIGNhbiB1c2UgZm9sbG93aW5nIG9wdGlvbnMgd2l0aCB0aGUgT1BUSU9OX0FMSUFTIGZsYWcgc2V0LiAgKi8KKyAgX19jb25zdCBjaGFyICpuYW1lOworCisgIC8qIFdoYXQga2V5IGlzIHJldHVybmVkIGZvciB0aGlzIG9wdGlvbi4gIElmID4gMCBhbmQgcHJpbnRhYmxlLCB0aGVuIGl0J3MKKyAgICAgYWxzbyBhY2NlcHRlZCBhcyBhIHNob3J0IG9wdGlvbi4gICovCisgIGludCBrZXk7CisKKyAgLyogSWYgbm9uLU5VTEwsIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgIG9wdGlvbiwgd2hpY2ggaXMgcmVxdWlyZWQgdW5sZXNzIHRoZSBPUFRJT05fQVJHX09QVElPTkFMIGZsYWcgaXMgc2V0LiAqLworICBfX2NvbnN0IGNoYXIgKmFyZzsKKworICAvKiBPUFRJT05fIGZsYWdzLiAgKi8KKyAgaW50IGZsYWdzOworCisgIC8qIFRoZSBkb2Mgc3RyaW5nIGZvciB0aGlzIG9wdGlvbi4gIElmIGJvdGggTkFNRSBhbmQgS0VZIGFyZSAwLCBUaGlzIHN0cmluZworICAgICB3aWxsIGJlIHByaW50ZWQgb3V0ZGVudGVkIGZyb20gdGhlIG5vcm1hbCBvcHRpb24gY29sdW1uLCBtYWtpbmcgaXQKKyAgICAgdXNlZnVsIGFzIGEgZ3JvdXAgaGVhZGVyIChpdCB3aWxsIGJlIHRoZSBmaXJzdCB0aGluZyBwcmludGVkIGluIGl0cworICAgICBncm91cCk7IGluIHRoaXMgdXNhZ2UsIGl0J3MgY29udmVudGlvbmFsIHRvIGVuZCB0aGUgc3RyaW5nIHdpdGggYSBgOicuICAqLworICBfX2NvbnN0IGNoYXIgKmRvYzsKKworICAvKiBUaGUgZ3JvdXAgdGhpcyBvcHRpb24gaXMgaW4uICBJbiBhIGxvbmcgaGVscCBtZXNzYWdlLCBvcHRpb25zIGFyZSBzb3J0ZWQKKyAgICAgYWxwaGFiZXRpY2FsbHkgd2l0aGluIGVhY2ggZ3JvdXAsIGFuZCB0aGUgZ3JvdXBzIHByZXNlbnRlZCBpbiB0aGUgb3JkZXIKKyAgICAgMCwgMSwgMiwgLi4uLCBuLCAtbSwgLi4uLCAtMiwgLTEuICBFdmVyeSBlbnRyeSBpbiBhbiBvcHRpb25zIGFycmF5IHdpdGgKKyAgICAgaWYgdGhpcyBmaWVsZCAwIHdpbGwgaW5oZXJpdCB0aGUgZ3JvdXAgbnVtYmVyIG9mIHRoZSBwcmV2aW91cyBlbnRyeSwgb3IKKyAgICAgemVybyBpZiBpdCdzIHRoZSBmaXJzdCBvbmUsIHVubGVzcyBpdHMgYSBncm91cCBoZWFkZXIgKE5BTUUgYW5kIEtFWSBib3RoCisgICAgIDApLCBpbiB3aGljaCBjYXNlLCB0aGUgcHJldmlvdXMgZW50cnkgKyAxIGlzIHRoZSBkZWZhdWx0LiAgQXV0b21hZ2ljCisgICAgIG9wdGlvbnMgc3VjaCBhcyAtLWhlbHAgYXJlIHB1dCBpbnRvIGdyb3VwIC0xLiAgKi8KKyAgaW50IGdyb3VwOworfTsKKworLyogVGhlIGFyZ3VtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9wdGlvbiBpcyBvcHRpb25hbC4gICovCisjZGVmaW5lIE9QVElPTl9BUkdfT1BUSU9OQUwJMHgxCisKKy8qIFRoaXMgb3B0aW9uIGlzbid0IGRpc3BsYXllZCBpbiBhbnkgaGVscCBtZXNzYWdlcy4gICovCisjZGVmaW5lIE9QVElPTl9ISURERU4JICAgICAgIAkweDIKKworLyogVGhpcyBvcHRpb24gaXMgYW4gYWxpYXMgZm9yIHRoZSBjbG9zZXN0IHByZXZpb3VzIG5vbi1hbGlhcyBvcHRpb24uICBUaGlzCisgICBtZWFucyB0aGF0IGl0IHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBzYW1lIGhlbHAgZW50cnksIGFuZCB3aWxsIGluaGVyaXQKKyAgIGZpZWxkcyBvdGhlciB0aGFuIE5BTUUgYW5kIEtFWSBmcm9tIHRoZSBhbGlhc2VkIG9wdGlvbi4gICovCisjZGVmaW5lIE9QVElPTl9BTElBUwkJMHg0CisKKy8qIFRoaXMgb3B0aW9uIGlzbid0IGFjdHVhbGx5IGFuIG9wdGlvbiAoYW5kIHNvIHNob3VsZCBiZSBpZ25vcmVkIGJ5IHRoZQorICAgYWN0dWFsIG9wdGlvbiBwYXJzZXIpLCBidXQgcmF0aGVyIGFuIGFyYml0cmFyeSBwaWVjZSBvZiBkb2N1bWVudGF0aW9uIHRoYXQKKyAgIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gbXVjaCB0aGUgc2FtZSBtYW5uZXIgYXMgdGhlIG9wdGlvbnMuICBJZiB0aGlzIGZsYWcKKyAgIGlzIHNldCwgdGhlbiB0aGUgb3B0aW9uIE5BTUUgZmllbGQgaXMgZGlzcGxheWVkIHVubW9kaWZpZWQgKGUuZy4sIG5vIGAtLScKKyAgIHByZWZpeCBpcyBhZGRlZCkgYXQgdGhlIGxlZnQtbWFyZ2luICh3aGVyZSBhICpzaG9ydCogb3B0aW9uIHdvdWxkIG5vcm1hbGx5CisgICBiZSBkaXNwbGF5ZWQpLCBhbmQgdGhlIGRvY3VtZW50YXRpb24gc3RyaW5nIGluIHRoZSBub3JtYWwgcGxhY2UuICBGb3IKKyAgIHB1cnBvc2VzIG9mIHNvcnRpbmcsIGFueSBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIHB1bmN0dWF0aW9uIGlzIGlnbm9yZWQsCisgICBleGNlcHQgdGhhdCBpZiB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIG5vdCBgLScsIHRoaXMgZW50cnkKKyAgIGlzIGRpc3BsYXllZCBhZnRlciBhbGwgb3B0aW9ucyAoYW5kIE9QVElPTl9ET0MgZW50cmllcyB3aXRoIGEgbGVhZGluZyBgLScpCisgICBpbiB0aGUgc2FtZSBncm91cC4gICovCisjZGVmaW5lIE9QVElPTl9ET0MJCTB4OAorCisvKiBUaGlzIG9wdGlvbiBzaG91bGRuJ3QgYmUgaW5jbHVkZWQgaW4gYGxvbmcnIHVzYWdlIG1lc3NhZ2VzIChidXQgaXMgc3RpbGwKKyAgIGluY2x1ZGVkIGluIGhlbHAgbWVzc2FnZXMpLiAgVGhpcyBpcyBtYWlubHkgaW50ZW5kZWQgZm9yIG9wdGlvbnMgdGhhdCBhcmUKKyAgIGNvbXBsZXRlbHkgZG9jdW1lbnRlZCBpbiBhbiBhcmdwJ3MgQVJHU19ET0MgZmllbGQsIGluIHdoaWNoIGNhc2UgaW5jbHVkaW5nCisgICB0aGUgb3B0aW9uIGluIHRoZSBnZW5lcmljIHVzYWdlIGxpc3Qgd291bGQgYmUgcmVkdW5kYW50LiAgRm9yIGluc3RhbmNlLAorICAgaWYgQVJHU19ET0MgaXMgIkZPTyBCQVJcbi14IEJMQUgiLCBhbmQgdGhlIGAteCcgb3B0aW9uJ3MgcHVycG9zZSBpcyB0bworICAgZGlzdGluZ3Vpc2ggdGhlc2UgdHdvIGNhc2VzLCAteCBzaG91bGQgcHJvYmFibHkgYmUgbWFya2VkCisgICBPUFRJT05fTk9fVVNBR0UuICAqLworI2RlZmluZSBPUFRJT05fTk9fVVNBR0UJCTB4MTAKKwwKK3N0cnVjdCBhcmdwOwkJCS8qIGZ3ZCBkZWNsYXJlIHRoaXMgdHlwZSAqLworc3RydWN0IGFyZ3Bfc3RhdGU7CQkvKiAiICovCitzdHJ1Y3QgYXJncF9jaGlsZDsJCS8qICIgKi8KKworLyogVGhlIHR5cGUgb2YgYSBwb2ludGVyIHRvIGFuIGFyZ3AgcGFyc2luZyBmdW5jdGlvbi4gICovCit0eXBlZGVmIGVycm9yX3QgKCphcmdwX3BhcnNlcl90KSAoaW50IF9fa2V5LCBjaGFyICpfX2FyZywKKwkJCQkgIHN0cnVjdCBhcmdwX3N0YXRlICpfX3N0YXRlKTsKKworLyogV2hhdCB0byByZXR1cm4gZm9yIHVucmVjb2duaXplZCBrZXlzLiAgRm9yIHNwZWNpYWwgQVJHUF9LRVlfIGtleXMsIHN1Y2gKKyAgIHJldHVybnMgd2lsbCBzaW1wbHkgYmUgaWdub3JlZC4gIEZvciB1c2VyIGtleXMsIHRoaXMgZXJyb3Igd2lsbCBiZSB0dXJuZWQKKyAgIGludG8gRUlOVkFMIChpZiB0aGUgY2FsbCB0byBhcmdwX3BhcnNlIGlzIHN1Y2ggdGhhdCBlcnJvcnMgYXJlIHByb3BhZ2F0ZWQKKyAgIGJhY2sgdG8gdGhlIHVzZXIgaW5zdGVhZCBvZiBleGl0aW5nKTsgcmV0dXJuaW5nIEVJTlZBTCBpdHNlbGYgd291bGQgcmVzdWx0CisgICBpbiBhbiBpbW1lZGlhdGUgc3RvcCB0byBwYXJzaW5nIGluICphbGwqIGNhc2VzLiAgKi8KKyNkZWZpbmUgQVJHUF9FUlJfVU5LTk9XTglFMkJJRyAvKiBIdXJkIHNob3VsZCBuZXZlciBuZWVkIEUyQklHLiAgWFhYICovCisKKy8qIFNwZWNpYWwgdmFsdWVzIGZvciB0aGUgS0VZIGFyZ3VtZW50IHRvIGFuIGFyZ3VtZW50IHBhcnNpbmcgZnVuY3Rpb24uCisgICBBUkdQX0VSUl9VTktOT1dOIHNob3VsZCBiZSByZXR1cm5lZCBpZiB0aGV5IGFyZW4ndCB1bmRlcnN0b29kLgorCisgICBUaGUgc2VxdWVuY2Ugb2Yga2V5cyB0byBhIHBhcnNpbmcgZnVuY3Rpb24gaXMgZWl0aGVyICh3aGVyZSBlYWNoCisgICB1cHBlcmNhc2VkIHdvcmQgc2hvdWxkIGJlIHByZWZpeGVkIGJ5IGBBUkdQX0tFWV8nIGFuZCBvcHQgaXMgYSB1c2VyIGtleSk6CisKKyAgICAgICBJTklUIG9wdC4uLiBOT19BUkdTIEVORCBTVUNDRVNTICAtLSBObyBub24tb3B0aW9uIGFyZ3VtZW50cyBhdCBhbGwKKyAgIG9yICBJTklUIChvcHQgfCBBUkcpLi4uIEVORCBTVUNDRVNTICAtLSBBbGwgbm9uLW9wdGlvbiBhcmdzIHBhcnNlZAorICAgb3IgIElOSVQgKG9wdCB8IEFSRykuLi4gU1VDQ0VTUyAgICAgIC0tIFNvbWUgbm9uLW9wdGlvbiBhcmcgdW5yZWNvZ25pemVkCisKKyAgIFRoZSB0aGlyZCBjYXNlIGlzIHdoZXJlIGV2ZXJ5IHBhcnNlciByZXR1cm5lZCBBUkdQX0tFWV9VTktOT1dOIGZvciBhbgorICAgYXJndW1lbnQsIGluIHdoaWNoIGNhc2UgcGFyc2luZyBzdG9wcyBhdCB0aGF0IGFyZ3VtZW50IChyZXR1cm5pbmcgdGhlCisgICB1bnBhcnNlZCBhcmd1bWVudHMgdG8gdGhlIGNhbGxlciBvZiBhcmdwX3BhcnNlIGlmIHJlcXVlc3RlZCwgb3Igc3RvcHBpbmcKKyAgIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBub3QpLgorCisgICBJZiBhbiBlcnJvciBvY2N1cnMgKGVpdGhlciBkZXRlY3RlZCBieSBhcmdwLCBvciBiZWNhdXNlIHRoZSBwYXJzaW5nCisgICBmdW5jdGlvbiByZXR1cm5lZCBhbiBlcnJvciB2YWx1ZSksIHRoZW4gdGhlIHBhcnNlciBpcyBjYWxsZWQgd2l0aAorICAgQVJHUF9LRVlfRVJST1IsIGFuZCBubyBmdXJ0aGVyIGNhbGxzIGFyZSBtYWRlLiAgKi8KKworLyogVGhpcyBpcyBub3QgYW4gb3B0aW9uIGF0IGFsbCwgYnV0IHJhdGhlciBhIGNvbW1hbmQgbGluZSBhcmd1bWVudC4gIElmIGEKKyAgIHBhcnNlciByZWNlaXZpbmcgdGhpcyBrZXkgcmV0dXJucyBzdWNjZXNzLCB0aGUgZmFjdCBpcyByZWNvcmRlZCwgYW5kIHRoZQorICAgQVJHUF9LRVlfTk9fQVJHUyBjYXNlIHdvbid0IGJlIHVzZWQuICBIT1dFVkVSLCBpZiB3aGlsZSBwcm9jZXNzaW5nIHRoZQorICAgYXJndW1lbnQsIGEgcGFyc2VyIGZ1bmN0aW9uIGRlY3JlbWVudHMgdGhlIE5FWFQgZmllbGQgb2YgdGhlIHN0YXRlIGl0J3MKKyAgIHBhc3NlZCwgdGhlIG9wdGlvbiB3b24ndCBiZSBjb25zaWRlcmVkIHByb2Nlc3NlZDsgdGhpcyBpcyB0byBhbGxvdyB5b3UgdG8KKyAgIGFjdHVhbGx5IG1vZGlmeSB0aGUgYXJndW1lbnQgKHBlcmhhcHMgaW50byBhbiBvcHRpb24pLCBhbmQgaGF2ZSBpdAorICAgcHJvY2Vzc2VkIGFnYWluLiAgKi8KKyNkZWZpbmUgQVJHUF9LRVlfQVJHCQkwCisvKiBUaGVyZSBhcmUgcmVtYWluaW5nIGFyZ3VtZW50cyBub3QgcGFyc2VkIGJ5IGFueSBwYXJzZXIsIHdoaWNoIG1heSBiZSBmb3VuZAorICAgc3RhcnRpbmcgYXQgKFNUQVRFLT5hcmd2ICsgU1RBVEUtPm5leHQpLiAgSWYgc3VjY2VzcyBpcyByZXR1cm5lZCwgYnV0CisgICBTVEFURS0+bmV4dCBsZWZ0IHVudG91Y2hlZCwgaXQncyBhc3N1bWVkIHRoYXQgYWxsIGFyZ3VtZW50cyB3ZXJlIGNvbnN1bWUsCisgICBvdGhlcndpc2UsIHRoZSBwYXJzZXIgc2hvdWxkIGFkanVzdCBTVEFURS0+bmV4dCB0byByZWZsZWN0IGFueSBhcmd1bWVudHMKKyAgIGNvbnN1bWVkLiAgKi8KKyNkZWZpbmUgQVJHUF9LRVlfQVJHUwkJMHgxMDAwMDA2CisvKiBUaGVyZSBhcmUgbm8gbW9yZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGF0IGFsbC4gICovCisjZGVmaW5lIEFSR1BfS0VZX0VORAkJMHgxMDAwMDAxCisvKiBCZWNhdXNlIGl0J3MgY29tbW9uIHRvIHdhbnQgdG8gZG8gc29tZSBzcGVjaWFsIHByb2Nlc3NpbmcgaWYgdGhlcmUgYXJlbid0CisgICBhbnkgbm9uLW9wdGlvbiBhcmdzLCB1c2VyIHBhcnNlcnMgYXJlIGNhbGxlZCB3aXRoIHRoaXMga2V5IGlmIHRoZXkgZGlkbid0CisgICBzdWNjZXNzZnVsbHkgcHJvY2VzcyBhbnkgbm9uLW9wdGlvbiBhcmd1bWVudHMuICBDYWxsZWQganVzdCBiZWZvcmUKKyAgIEFSR1BfS0VZX0VORCAod2hlcmUgbW9yZSBnZW5lcmFsIHZhbGlkaXR5IGNoZWNrcyBvbiBwcmV2aW91c2x5IHBhcnNlZAorICAgYXJndW1lbnRzIGNhbiB0YWtlIHBsYWNlKS4gICovCisjZGVmaW5lIEFSR1BfS0VZX05PX0FSR1MJMHgxMDAwMDAyCisvKiBQYXNzZWQgaW4gYmVmb3JlIGFueSBwYXJzaW5nIGlzIGRvbmUuICBBZnRlcndhcmRzLCB0aGUgdmFsdWVzIG9mIGVhY2gKKyAgIGVsZW1lbnQgb2YgdGhlIENISUxEX0lOUFVUIGZpZWxkLCBpZiBhbnksIGluIHRoZSBzdGF0ZSBzdHJ1Y3R1cmUgaXMKKyAgIGNvcGllZCB0byBlYWNoIGNoaWxkJ3Mgc3RhdGUgdG8gYmUgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIElOUFVUIGZpZWxkLiAgKi8KKyNkZWZpbmUgQVJHUF9LRVlfSU5JVAkJMHgxMDAwMDAzCisvKiBVc2UgYWZ0ZXIgYWxsIG90aGVyIGtleXMsIGluY2x1ZGluZyBTVUNDRVNTICYgRU5ELiAgKi8KKyNkZWZpbmUgQVJHUF9LRVlfRklOSQkJMHgxMDAwMDA3CisvKiBQYXNzZWQgaW4gd2hlbiBwYXJzaW5nIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBjb21wbGV0ZWQgKGV2ZW4gaWYgdGhlcmUgYXJlCisgICBzdGlsbCBhcmd1bWVudHMgcmVtYWluaW5nKS4gICovCisjZGVmaW5lIEFSR1BfS0VZX1NVQ0NFU1MJMHgxMDAwMDA0CisvKiBQYXNzZWQgaW4gaWYgYW4gZXJyb3Igb2NjdXJzLiAgKi8KKyNkZWZpbmUgQVJHUF9LRVlfRVJST1IJCTB4MTAwMDAwNQorCisvKiBBbiBhcmdwIHN0cnVjdHVyZSBjb250YWlucyBhIHNldCBvZiBvcHRpb25zIGRlY2xhcmF0aW9ucywgYSBmdW5jdGlvbiB0bworICAgZGVhbCB3aXRoIHBhcnNpbmcgb25lLCBkb2N1bWVudGF0aW9uIHN0cmluZywgYSBwb3NzaWJsZSB2ZWN0b3Igb2YgY2hpbGQKKyAgIGFyZ3AncywgYW5kIHBlcmhhcHMgYSBmdW5jdGlvbiB0byBmaWx0ZXIgaGVscCBvdXRwdXQuICBXaGVuIGFjdHVhbGx5CisgICBwYXJzaW5nIG9wdGlvbnMsIGdldG9wdCBpcyBjYWxsZWQgd2l0aCB0aGUgdW5pb24gb2YgYWxsIHRoZSBhcmdwCisgICBzdHJ1Y3R1cmVzIGNoYWluZWQgdG9nZXRoZXIgdGhyb3VnaCB0aGVpciBDSElMRCBwb2ludGVycywgd2l0aCBjb25mbGljdHMKKyAgIGJlaW5nIHJlc29sdmVkIGluIGZhdm9yIG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIGluIHRoZSBjaGFpbi4gICovCitzdHJ1Y3QgYXJncAoreworICAvKiBBbiBhcnJheSBvZiBhcmdwX29wdGlvbiBzdHJ1Y3R1cmVzLCB0ZXJtaW5hdGVkIGJ5IGFuIGVudHJ5IHdpdGggYm90aAorICAgICBOQU1FIGFuZCBLRVkgaGF2aW5nIGEgdmFsdWUgb2YgMC4gICovCisgIF9fY29uc3Qgc3RydWN0IGFyZ3Bfb3B0aW9uICpvcHRpb25zOworCisgIC8qIFdoYXQgdG8gZG8gd2l0aCBhbiBvcHRpb24gZnJvbSB0aGlzIHN0cnVjdHVyZS4gIEtFWSBpcyB0aGUga2V5CisgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3B0aW9uLCBhbmQgQVJHIGlzIGFueSBhc3NvY2lhdGVkIGFyZ3VtZW50IChOVUxMIGlmCisgICAgIG5vbmUgd2FzIHN1cHBsaWVkKS4gIElmIEtFWSBpc24ndCB1bmRlcnN0b29kLCBBUkdQX0VSUl9VTktOT1dOIHNob3VsZCBiZQorICAgICByZXR1cm5lZC4gIElmIGEgbm9uLXplcm8sIG5vbi1BUkdQX0VSUl9VTktOT1dOIHZhbHVlIGlzIHJldHVybmVkLCB0aGVuCisgICAgIHBhcnNpbmcgaXMgc3RvcHBlZCBpbW1lZGlhdGVseSwgYW5kIHRoYXQgdmFsdWUgaXMgcmV0dXJuZWQgZnJvbQorICAgICBhcmdwX3BhcnNlKCkuICBGb3Igc3BlY2lhbCAobm9uLXVzZXItc3VwcGxpZWQpIHZhbHVlcyBvZiBLRVksIHNlZSB0aGUKKyAgICAgQVJHUF9LRVlfIGRlZmluaXRpb25zIGJlbG93LiAgKi8KKyAgYXJncF9wYXJzZXJfdCBwYXJzZXI7CisKKyAgLyogQSBzdHJpbmcgZGVzY3JpYmluZyB3aGF0IG90aGVyIGFyZ3VtZW50cyBhcmUgd2FudGVkIGJ5IHRoaXMgcHJvZ3JhbS4gIEl0CisgICAgIGlzIG9ubHkgdXNlZCBieSBhcmdwX3VzYWdlIHRvIHByaW50IHRoZSBgVXNhZ2U6JyBtZXNzYWdlLiAgSWYgaXQKKyAgICAgY29udGFpbnMgbmV3bGluZXMsIHRoZSBzdHJpbmdzIHNlcGFyYXRlZCBieSB0aGVtIGFyZSBjb25zaWRlcmVkCisgICAgIGFsdGVybmF0aXZlIHVzYWdlIHBhdHRlcm5zLCBhbmQgcHJpbnRlZCBvbiBzZXBhcmF0ZSBsaW5lcyAobGluZXMgYWZ0ZXIKKyAgICAgdGhlIGZpcnN0IGFyZSBwcmVmaXggYnkgYCAgb3I6ICcgaW5zdGVhZCBvZiBgVXNhZ2U6JykuICAqLworICBfX2NvbnN0IGNoYXIgKmFyZ3NfZG9jOworCisgIC8qIElmIG5vbi1OVUxMLCBhIHN0cmluZyBjb250YWluaW5nIGV4dHJhIHRleHQgdG8gYmUgcHJpbnRlZCBiZWZvcmUgYW5kCisgICAgIGFmdGVyIHRoZSBvcHRpb25zIGluIGEgbG9uZyBoZWxwIG1lc3NhZ2UgKHNlcGFyYXRlZCBieSBhIHZlcnRpY2FsIHRhYgorICAgICBgXHYnIGNoYXJhY3RlcikuICAqLworICBfX2NvbnN0IGNoYXIgKmRvYzsKKworICAvKiBBIHZlY3RvciBvZiBhcmdwX2NoaWxkcmVuIHN0cnVjdHVyZXMsIHRlcm1pbmF0ZWQgYnkgYSBtZW1iZXIgd2l0aCBhIDAKKyAgICAgYXJncCBmaWVsZCwgcG9pbnRpbmcgdG8gY2hpbGQgYXJncHMgc2hvdWxkIGJlIHBhcnNlZCB3aXRoIHRoaXMgb25lLiAgQW55CisgICAgIGNvbmZsaWN0cyBhcmUgcmVzb2x2ZWQgaW4gZmF2b3Igb2YgdGhpcyBhcmdwLCBvciBlYXJseSBhcmdwcyBpbiB0aGUKKyAgICAgQ0hJTERSRU4gbGlzdC4gIFRoaXMgZmllbGQgaXMgdXNlZnVsIGlmIHlvdSB1c2UgbGlicmFyaWVzIHRoYXQgc3VwcGx5CisgICAgIHRoZWlyIG93biBhcmdwIHN0cnVjdHVyZSwgd2hpY2ggeW91IHdhbnQgdG8gdXNlIGluIGNvbmp1bmN0aW9uIHdpdGggeW91cgorICAgICBvd24uICAqLworICBfX2NvbnN0IHN0cnVjdCBhcmdwX2NoaWxkICpjaGlsZHJlbjsKKworICAvKiBJZiBub24temVybywgdGhpcyBzaG91bGQgYmUgYSBmdW5jdGlvbiB0byBmaWx0ZXIgdGhlIG91dHB1dCBvZiBoZWxwCisgICAgIG1lc3NhZ2VzLiAgS0VZIGlzIGVpdGhlciBhIGtleSBmcm9tIGFuIG9wdGlvbiwgaW4gd2hpY2ggY2FzZSBURVhUIGlzCisgICAgIHRoYXQgb3B0aW9uJ3MgaGVscCB0ZXh0LCBvciBhIHNwZWNpYWwga2V5IGZyb20gdGhlIEFSR1BfS0VZX0hFTFBfCisgICAgIGRlZmluZXMsIGJlbG93LCBkZXNjcmliaW5nIHdoaWNoIG90aGVyIGhlbHAgdGV4dCBURVhUIGlzLiAgVGhlIGZ1bmN0aW9uCisgICAgIHNob3VsZCByZXR1cm4gZWl0aGVyIFRFWFQsIGlmIGl0IHNob3VsZCBiZSB1c2VkIGFzLWlzLCBhIHJlcGxhY2VtZW50CisgICAgIHN0cmluZywgd2hpY2ggc2hvdWxkIGJlIG1hbGxvY2VkLCBhbmQgd2lsbCBiZSBmcmVlZCBieSBhcmdwLCBvciBOVUxMLAorICAgICBtZWFuaW5nIGBwcmludCBub3RoaW5nJy4gIFRoZSB2YWx1ZSBmb3IgVEVYVCBpcyAqYWZ0ZXIqIGFueSB0cmFuc2xhdGlvbgorICAgICBoYXMgYmVlbiBkb25lLCBzbyBpZiBhbnkgb2YgdGhlIHJlcGxhY2VtZW50IHRleHQgYWxzbyBuZWVkcyB0cmFuc2xhdGlvbiwKKyAgICAgdGhhdCBzaG91bGQgYmUgZG9uZSBieSB0aGUgZmlsdGVyIGZ1bmN0aW9uLiAgSU5QVVQgaXMgZWl0aGVyIHRoZSBpbnB1dAorICAgICBzdXBwbGllZCB0byBhcmdwX3BhcnNlLCBvciBOVUxMLCBpZiBhcmdwX2hlbHAgd2FzIGNhbGxlZCBkaXJlY3RseS4gICovCisgIGNoYXIgKigqaGVscF9maWx0ZXIpIChpbnQgX19rZXksIF9fY29uc3QgY2hhciAqX190ZXh0LCB2b2lkICpfX2lucHV0KTsKKworICAvKiBJZiBub24temVybyB0aGUgc3RyaW5ncyB1c2VkIGluIHRoZSBhcmdwIGxpYnJhcnkgYXJlIHRyYW5zbGF0ZWQgdXNpbmcKKyAgICAgdGhlIGRvbWFpbiBkZXNjcmliZWQgYnkgdGhpcyBzdHJpbmcuICBPdGhlcndpc2UgdGhlIGN1cnJlbnRseSBpbnN0YWxsZWQKKyAgICAgZGVmYXVsdCBkb21haW4gaXMgdXNlZC4gICovCisgIGNvbnN0IGNoYXIgKmFyZ3BfZG9tYWluOworfTsKKworLyogUG9zc2libGUgS0VZIGFyZ3VtZW50cyB0byBhIGhlbHAgZmlsdGVyIGZ1bmN0aW9uLiAgKi8KKyNkZWZpbmUgQVJHUF9LRVlfSEVMUF9QUkVfRE9DCTB4MjAwMDAwMSAvKiBIZWxwIHRleHQgcHJlY2VlZGluZyBvcHRpb25zLiAqLworI2RlZmluZSBBUkdQX0tFWV9IRUxQX1BPU1RfRE9DCTB4MjAwMDAwMiAvKiBIZWxwIHRleHQgZm9sbG93aW5nIG9wdGlvbnMuICovCisjZGVmaW5lIEFSR1BfS0VZX0hFTFBfSEVBREVSCTB4MjAwMDAwMyAvKiBPcHRpb24gaGVhZGVyIHN0cmluZy4gKi8KKyNkZWZpbmUgQVJHUF9LRVlfSEVMUF9FWFRSQQkweDIwMDAwMDQgLyogQWZ0ZXIgYWxsIG90aGVyIGRvY3VtZW50YXRpb247CisJCQkJCSAgICAgVEVYVCBpcyBOVUxMIGZvciB0aGlzIGtleS4gICovCisvKiBFeHBsYW5hdG9yeSBub3RlIGVtaXR0ZWQgd2hlbiBkdXBsaWNhdGUgb3B0aW9uIGFyZ3VtZW50cyBoYXZlIGJlZW4KKyAgIHN1cHByZXNzZWQuICAqLworI2RlZmluZSBBUkdQX0tFWV9IRUxQX0RVUF9BUkdTX05PVEUgMHgyMDAwMDA1CisjZGVmaW5lIEFSR1BfS0VZX0hFTFBfQVJHU19ET0MJMHgyMDAwMDA2IC8qIEFyZ3VtZW50IGRvYyBzdHJpbmcuICAqLworDAorLyogV2hlbiBhbiBhcmdwIGhhcyBhIG5vbi16ZXJvIENISUxEUkVOIGZpZWxkLCBpdCBzaG91bGQgcG9pbnQgdG8gYSB2ZWN0b3Igb2YKKyAgIGFyZ3BfY2hpbGQgc3RydWN0dXJlcywgZWFjaCBvZiB3aGljaCBkZXNjcmliZXMgYSBzdWJzaWRpYXJ5IGFyZ3AuICAqLworc3RydWN0IGFyZ3BfY2hpbGQKK3sKKyAgLyogVGhlIGNoaWxkIHBhcnNlci4gICovCisgIF9fY29uc3Qgc3RydWN0IGFyZ3AgKmFyZ3A7CisKKyAgLyogRmxhZ3MgZm9yIHRoaXMgY2hpbGQuICAqLworICBpbnQgZmxhZ3M7CisKKyAgLyogSWYgbm9uLXplcm8sIGFuIG9wdGlvbmFsIGhlYWRlciB0byBiZSBwcmludGVkIGluIGhlbHAgb3V0cHV0IGJlZm9yZSB0aGUKKyAgICAgY2hpbGQgb3B0aW9ucy4gIEFzIGEgc2lkZS1lZmZlY3QsIGEgbm9uLXplcm8gdmFsdWUgZm9yY2VzIHRoZSBjaGlsZAorICAgICBvcHRpb25zIHRvIGJlIGdyb3VwZWQgdG9nZXRoZXI7IHRvIGFjaGlldmUgdGhpcyBlZmZlY3Qgd2l0aG91dCBhY3R1YWxseQorICAgICBwcmludGluZyBhIGhlYWRlciBzdHJpbmcsIHVzZSBhIHZhbHVlIG9mICIiLiAgKi8KKyAgX19jb25zdCBjaGFyICpoZWFkZXI7CisKKyAgLyogV2hlcmUgdG8gZ3JvdXAgdGhlIGNoaWxkIG9wdGlvbnMgcmVsYXRpdmUgdG8gdGhlIG90aGVyIChgY29uc29saWRhdGVkJykKKyAgICAgb3B0aW9ucyBpbiB0aGUgcGFyZW50IGFyZ3A7IHRoZSB2YWx1ZXMgYXJlIHRoZSBzYW1lIGFzIHRoZSBHUk9VUCBmaWVsZAorICAgICBpbiBhcmdwX29wdGlvbiBzdHJ1Y3RzLCBidXQgYWxsIGNoaWxkLWdyb3VwaW5ncyBmb2xsb3cgcGFyZW50IG9wdGlvbnMgYXQKKyAgICAgYSBwYXJ0aWN1bGFyIGdyb3VwIGxldmVsLiAgSWYgYm90aCB0aGlzIGZpZWxkIGFuZCBIRUFERVIgYXJlIHplcm8sIHRoZW4KKyAgICAgdGhleSBhcmVuJ3QgZ3JvdXBlZCBhdCBhbGwsIGJ1dCByYXRoZXIgbWVyZ2VkIHdpdGggdGhlIHBhcmVudCBvcHRpb25zCisgICAgIChtZXJnaW5nIHRoZSBjaGlsZCdzIGdyb3VwaW5nIGxldmVscyB3aXRoIHRoZSBwYXJlbnRzKS4gICovCisgIGludCBncm91cDsKK307CisMCisvKiBQYXJzaW5nIHN0YXRlLiAgVGhpcyBpcyBwcm92aWRlZCB0byBwYXJzaW5nIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYXJncCwKKyAgIHdoaWNoIG1heSBleGFtaW5lIGFuZCwgYXMgbm90ZWQsIG1vZGlmeSBmaWVsZHMuICAqLworc3RydWN0IGFyZ3Bfc3RhdGUKK3sKKyAgLyogVGhlIHRvcCBsZXZlbCBBUkdQIGJlaW5nIHBhcnNlZC4gICovCisgIF9fY29uc3Qgc3RydWN0IGFyZ3AgKnJvb3RfYXJncDsKKworICAvKiBUaGUgYXJndW1lbnQgdmVjdG9yIGJlaW5nIHBhcnNlZC4gIE1heSBiZSBtb2RpZmllZC4gICovCisgIGludCBhcmdjOworICBjaGFyICoqYXJndjsKKworICAvKiBUaGUgaW5kZXggaW4gQVJHViBvZiB0aGUgbmV4dCBhcmcgdGhhdCB0byBiZSBwYXJzZWQuICBNYXkgYmUgbW9kaWZpZWQuICovCisgIGludCBuZXh0OworCisgIC8qIFRoZSBmbGFncyBzdXBwbGllZCB0byBhcmdwX3BhcnNlLiAgTWF5IGJlIG1vZGlmaWVkLiAgKi8KKyAgdW5zaWduZWQgZmxhZ3M7CisKKyAgLyogV2hpbGUgY2FsbGluZyBhIHBhcnNpbmcgZnVuY3Rpb24gd2l0aCBhIGtleSBvZiBBUkdQX0tFWV9BUkcsIHRoaXMgaXMgdGhlCisgICAgIG51bWJlciBvZiB0aGUgY3VycmVudCBhcmcsIHN0YXJ0aW5nIGF0IHplcm8sIGFuZCBpbmNyZW1lbnRlZCBhZnRlciBlYWNoCisgICAgIHN1Y2ggY2FsbCByZXR1cm5zLiAgQXQgYWxsIG90aGVyIHRpbWVzLCB0aGlzIGlzIHRoZSBudW1iZXIgb2Ygc3VjaAorICAgICBhcmd1bWVudHMgdGhhdCBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgKi8KKyAgdW5zaWduZWQgYXJnX251bTsKKworICAvKiBJZiBub24temVybywgdGhlIGluZGV4IGluIEFSR1Ygb2YgdGhlIGZpcnN0IGFyZ3VtZW50IGZvbGxvd2luZyBhIHNwZWNpYWwKKyAgICAgYC0tJyBhcmd1bWVudCAod2hpY2ggcHJldmVudHMgYW55dGhpbmcgZm9sbG93aW5nIGJlaW5nIGludGVycHJldGVkIGFzIGFuCisgICAgIG9wdGlvbikuICBPbmx5IHNldCBvbmNlIGFyZ3VtZW50IHBhcnNpbmcgaGFzIHByb2NlZWRlZCBwYXN0IHRoaXMgcG9pbnQuICovCisgIGludCBxdW90ZWQ7CisKKyAgLyogQW4gYXJiaXRyYXJ5IHBvaW50ZXIgcGFzc2VkIGluIGZyb20gdGhlIHVzZXIuICAqLworICB2b2lkICppbnB1dDsKKyAgLyogVmFsdWVzIHRvIHBhc3MgdG8gY2hpbGQgcGFyc2Vycy4gIFRoaXMgdmVjdG9yIHdpbGwgYmUgdGhlIHNhbWUgbGVuZ3RoIGFzCisgICAgIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gZm9yIHRoZSBjdXJyZW50IHBhcnNlci4gICovCisgIHZvaWQgKipjaGlsZF9pbnB1dHM7CisKKyAgLyogRm9yIHRoZSBwYXJzZXIncyB1c2UuICBJbml0aWFsaXplZCB0byAwLiAgKi8KKyAgdm9pZCAqaG9vazsKKworICAvKiBUaGUgbmFtZSB1c2VkIHdoZW4gcHJpbnRpbmcgbWVzc2FnZXMuICBUaGlzIGlzIGluaXRpYWxpemVkIHRvIEFSR1ZbMF0sCisgICAgIG9yIFBST0dSQU1fSU5WT0NBVElPTl9OQU1FIGlmIHRoYXQgaXMgdW5hdmFpbGFibGUuICAqLworICBjaGFyICpuYW1lOworCisgIC8qIFN0cmVhbXMgdXNlZCB3aGVuIGFyZ3AgcHJpbnRzIHNvbWV0aGluZy4gICovCisgIEZJTEUgKmVycl9zdHJlYW07CQkvKiBGb3IgZXJyb3JzOyBpbml0aWFsaXplZCB0byBzdGRlcnIuICovCisgIEZJTEUgKm91dF9zdHJlYW07CQkvKiBGb3IgaW5mb3JtYXRpb247IGluaXRpYWxpemVkIHRvIHN0ZG91dC4gKi8KKworICB2b2lkICpwc3RhdGU7CQkJLyogUHJpdmF0ZSwgZm9yIHVzZSBieSBhcmdwLiAgKi8KK307CisMCisvKiBGbGFncyBmb3IgYXJncF9wYXJzZSAobm90ZSB0aGF0IHRoZSBkZWZhdWx0cyBhcmUgdGhvc2UgdGhhdCBhcmUKKyAgIGNvbnZlbmllbnQgZm9yIHByb2dyYW0gY29tbWFuZCBsaW5lIHBhcnNpbmcpOiAqLworCisvKiBEb24ndCBpZ25vcmUgdGhlIGZpcnN0IGVsZW1lbnQgb2YgQVJHVi4gIE5vcm1hbGx5IChhbmQgYWx3YXlzIHVubGVzcworICAgQVJHUF9OT19FUlJTIGlzIHNldCkgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGFyZ3VtZW50IHZlY3RvciBpcworICAgc2tpcHBlZCBmb3Igb3B0aW9uIHBhcnNpbmcgcHVycG9zZXMsIGFzIGl0IGNvcnJlc3BvbmRzIHRvIHRoZSBwcm9ncmFtIG5hbWUKKyAgIGluIGEgY29tbWFuZCBsaW5lLiAgKi8KKyNkZWZpbmUgQVJHUF9QQVJTRV9BUkdWMCAgMHgwMQorCisvKiBEb24ndCBwcmludCBlcnJvciBtZXNzYWdlcyBmb3IgdW5rbm93biBvcHRpb25zIHRvIHN0ZGVycjsgdW5sZXNzIHRoaXMgZmxhZworICAgaXMgc2V0LCBBUkdQX1BBUlNFX0FSR1YwIGlzIGlnbm9yZWQsIGFzIEFSR1ZbMF0gaXMgdXNlZCBhcyB0aGUgcHJvZ3JhbQorICAgbmFtZSBpbiB0aGUgZXJyb3IgbWVzc2FnZXMuICBUaGlzIGZsYWcgaW1wbGllcyBBUkdQX05PX0VYSVQgKG9uIHRoZQorICAgYXNzdW1wdGlvbiB0aGF0IHNpbGVudCBleGl0aW5nIHVwb24gZXJyb3JzIGlzIGJhZCBiZWhhdmlvdXIpLiAgKi8KKyNkZWZpbmUgQVJHUF9OT19FUlJTCTB4MDIKKworLyogRG9uJ3QgcGFyc2UgYW55IG5vbi1vcHRpb24gYXJncy4gIE5vcm1hbGx5IG5vbi1vcHRpb24gYXJncyBhcmUgcGFyc2VkIGJ5CisgICBjYWxsaW5nIHRoZSBwYXJzZSBmdW5jdGlvbnMgd2l0aCBhIGtleSBvZiBBUkdQX0tFWV9BUkcsIGFuZCB0aGUgYWN0dWFsIGFyZworICAgYXMgdGhlIHZhbHVlLiAgU2luY2UgaXQncyBpbXBvc3NpYmxlIHRvIGtub3cgd2hpY2ggcGFyc2UgZnVuY3Rpb24gd2FudHMgdG8KKyAgIGhhbmRsZSBpdCwgZWFjaCBvbmUgaXMgY2FsbGVkIGluIHR1cm4sIHVudGlsIG9uZSByZXR1cm5zIDAgb3IgYW4gZXJyb3IKKyAgIG90aGVyIHRoYW4gQVJHUF9FUlJfVU5LTk9XTjsgaWYgYW4gYXJndW1lbnQgaXMgaGFuZGxlZCBieSBubyBvbmUsIHRoZQorICAgYXJncF9wYXJzZSByZXR1cm5zIHByZW1hdHVyZWx5IChidXQgd2l0aCBhIHJldHVybiB2YWx1ZSBvZiAwKS4gIElmIGFsbAorICAgYXJncyBoYXZlIGJlZW4gcGFyc2VkIHdpdGhvdXQgZXJyb3IsIGFsbCBwYXJzaW5nIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIG9uZQorICAgbGFzdCB0aW1lIHdpdGggYSBrZXkgb2YgQVJHUF9LRVlfRU5ELiAgVGhpcyBmbGFnIG5lZWRuJ3Qgbm9ybWFsbHkgYmUgc2V0LAorICAgYXMgdGhlIG5vcm1hbCBiZWhhdmlvciBpcyB0byBzdG9wIHBhcnNpbmcgYXMgc29vbiBhcyBzb21lIGFyZ3VtZW50IGNhbid0CisgICBiZSBoYW5kbGVkLiAgKi8KKyNkZWZpbmUgQVJHUF9OT19BUkdTCTB4MDQKKworLyogUGFyc2Ugb3B0aW9ucyBhbmQgYXJndW1lbnRzIGluIHRoZSBzYW1lIG9yZGVyIHRoZXkgb2NjdXIgb24gdGhlIGNvbW1hbmQKKyAgIGxpbmUgLS0gbm9ybWFsbHkgdGhleSdyZSByZWFycmFuZ2VkIHNvIHRoYXQgYWxsIG9wdGlvbnMgY29tZSBmaXJzdC4gKi8KKyNkZWZpbmUgQVJHUF9JTl9PUkRFUgkweDA4CisKKy8qIERvbid0IHByb3ZpZGUgdGhlIHN0YW5kYXJkIGxvbmcgb3B0aW9uIC0taGVscCwgd2hpY2ggY2F1c2VzIHVzYWdlIGFuZAorICAgICAgb3B0aW9uIGhlbHAgaW5mb3JtYXRpb24gdG8gYmUgb3V0cHV0IHRvIHN0ZG91dCwgYW5kIGV4aXQgKDApIGNhbGxlZC4gKi8KKyNkZWZpbmUgQVJHUF9OT19IRUxQCTB4MTAKKworLyogRG9uJ3QgZXhpdCBvbiBlcnJvcnMgKHRoZXkgbWF5IHN0aWxsIHJlc3VsdCBpbiBlcnJvciBtZXNzYWdlcykuICAqLworI2RlZmluZSBBUkdQX05PX0VYSVQJMHgyMAorCisvKiBVc2UgdGhlIGdudSBnZXRvcHQgYGxvbmctb25seScgcnVsZXMgZm9yIHBhcnNpbmcgYXJndW1lbnRzLiAgKi8KKyNkZWZpbmUgQVJHUF9MT05HX09OTFkJMHg0MAorCisvKiBUdXJucyBvZmYgYW55IG1lc3NhZ2UtcHJpbnRpbmcvZXhpdGluZyBvcHRpb25zLiAgKi8KKyNkZWZpbmUgQVJHUF9TSUxFTlQgICAgKEFSR1BfTk9fRVhJVCB8IEFSR1BfTk9fRVJSUyB8IEFSR1BfTk9fSEVMUCkKKworLyogUGFyc2UgdGhlIG9wdGlvbnMgc3RyaW5ncyBpbiBBUkdDICYgQVJHViBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbnMgaW4gQVJHUC4KKyAgIEZMQUdTIGlzIG9uZSBvZiB0aGUgQVJHUF8gZmxhZ3MgYWJvdmUuICBJZiBBUkdfSU5ERVggaXMgbm9uLU5VTEwsIHRoZQorICAgaW5kZXggaW4gQVJHViBvZiB0aGUgZmlyc3QgdW5wYXJzZWQgb3B0aW9uIGlzIHJldHVybmVkIGluIGl0LiAgSWYgYW4KKyAgIHVua25vd24gb3B0aW9uIGlzIHByZXNlbnQsIEFSR1BfRVJSX1VOS05PV04gaXMgcmV0dXJuZWQ7IGlmIHNvbWUgcGFyc2VyCisgICByb3V0aW5lIHJldHVybmVkIGEgbm9uLXplcm8gdmFsdWUsIGl0IGlzIHJldHVybmVkOyBvdGhlcndpc2UgMCBpcworICAgcmV0dXJuZWQuICBUaGlzIGZ1bmN0aW9uIG1heSBhbHNvIGNhbGwgZXhpdCB1bmxlc3MgdGhlIEFSR1BfTk9fSEVMUCBmbGFnCisgICBpcyBzZXQuICBJTlBVVCBpcyBhIHBvaW50ZXIgdG8gYSB2YWx1ZSB0byBiZSBwYXNzZWQgaW4gdG8gdGhlIHBhcnNlci4gICovCitleHRlcm4gZXJyb3JfdCBhcmdwX3BhcnNlIChfX2NvbnN0IHN0cnVjdCBhcmdwICpfX3Jlc3RyaWN0IF9fYXJncCwKKwkJCSAgIGludCBfX2FyZ2MsIGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJndiwKKwkJCSAgIHVuc2lnbmVkIF9fZmxhZ3MsIGludCAqX19yZXN0cmljdCBfX2FyZ19pbmRleCwKKwkJCSAgIHZvaWQgKl9fcmVzdHJpY3QgX19pbnB1dCk7CitleHRlcm4gZXJyb3JfdCBfX2FyZ3BfcGFyc2UgKF9fY29uc3Qgc3RydWN0IGFyZ3AgKl9fcmVzdHJpY3QgX19hcmdwLAorCQkJICAgICBpbnQgX19hcmdjLCBjaGFyICoqX19yZXN0cmljdCBfX2FyZ3YsCisJCQkgICAgIHVuc2lnbmVkIF9fZmxhZ3MsIGludCAqX19yZXN0cmljdCBfX2FyZ19pbmRleCwKKwkJCSAgICAgdm9pZCAqX19yZXN0cmljdCBfX2lucHV0KTsKKwwKKy8qIEdsb2JhbCB2YXJpYWJsZXMuICAqLworCisvKiBJZiBkZWZpbmVkIG9yIHNldCBieSB0aGUgdXNlciBwcm9ncmFtIHRvIGEgbm9uLXplcm8gdmFsdWUsIHRoZW4gYSBkZWZhdWx0CisgICBvcHRpb24gLS12ZXJzaW9uIGlzIGFkZGVkICh1bmxlc3MgdGhlIEFSR1BfTk9fSEVMUCBmbGFnIGlzIHVzZWQpLCB3aGljaAorICAgd2lsbCBwcmludCB0aGlzIHN0cmluZyBmb2xsb3dlZCBieSBhIG5ld2xpbmUgYW5kIGV4aXQgKHVubGVzcyB0aGUKKyAgIEFSR1BfTk9fRVhJVCBmbGFnIGlzIHVzZWQpLiAgT3ZlcnJpZGRlbiBieSBBUkdQX1BST0dSQU1fVkVSU0lPTl9IT09LLiAgKi8KK2V4dGVybiBfX2NvbnN0IGNoYXIgKmFyZ3BfcHJvZ3JhbV92ZXJzaW9uOworCisvKiBJZiBkZWZpbmVkIG9yIHNldCBieSB0aGUgdXNlciBwcm9ncmFtIHRvIGEgbm9uLXplcm8gdmFsdWUsIHRoZW4gYSBkZWZhdWx0CisgICBvcHRpb24gLS12ZXJzaW9uIGlzIGFkZGVkICh1bmxlc3MgdGhlIEFSR1BfTk9fSEVMUCBmbGFnIGlzIHVzZWQpLCB3aGljaAorICAgY2FsbHMgdGhpcyBmdW5jdGlvbiB3aXRoIGEgc3RyZWFtIHRvIHByaW50IHRoZSB2ZXJzaW9uIHRvIGFuZCBhIHBvaW50ZXIgdG8KKyAgIHRoZSBjdXJyZW50IHBhcnNpbmcgc3RhdGUsIGFuZCB0aGVuIGV4aXRzICh1bmxlc3MgdGhlIEFSR1BfTk9fRVhJVCBmbGFnIGlzCisgICB1c2VkKS4gIFRoaXMgdmFyaWFibGUgdGFrZXMgcHJlY2VkZW50IG92ZXIgQVJHUF9QUk9HUkFNX1ZFUlNJT04uICAqLworZXh0ZXJuIHZvaWQgKCphcmdwX3Byb2dyYW1fdmVyc2lvbl9ob29rKSAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwKKwkJCQkJICBzdHJ1Y3QgYXJncF9zdGF0ZSAqX19yZXN0cmljdAorCQkJCQkgIF9fc3RhdGUpOworCisvKiBJZiBkZWZpbmVkIG9yIHNldCBieSB0aGUgdXNlciBwcm9ncmFtLCBpdCBzaG91bGQgcG9pbnQgdG8gc3RyaW5nIHRoYXQgaXMKKyAgIHRoZSBidWctcmVwb3J0aW5nIGFkZHJlc3MgZm9yIHRoZSBwcm9ncmFtLiAgSXQgd2lsbCBiZSBwcmludGVkIGJ5CisgICBhcmdwX2hlbHAgaWYgdGhlIEFSR1BfSEVMUF9CVUdfQUREUiBmbGFnIGlzIHNldCAoYXMgaXQgaXMgYnkgdmFyaW91cworICAgc3RhbmRhcmQgaGVscCBtZXNzYWdlcyksIGVtYmVkZGVkIGluIGEgc2VudGVuY2UgdGhhdCBzYXlzIHNvbWV0aGluZyBsaWtlCisgICBgUmVwb3J0IGJ1Z3MgdG8gQUREUi4nLiAgKi8KK2V4dGVybiBfX2NvbnN0IGNoYXIgKmFyZ3BfcHJvZ3JhbV9idWdfYWRkcmVzczsKKworLyogVGhlIGV4aXQgc3RhdHVzIHRoYXQgYXJncCB3aWxsIHVzZSB3aGVuIGV4aXRpbmcgZHVlIHRvIGEgcGFyc2luZyBlcnJvci4KKyAgIElmIG5vdCBkZWZpbmVkIG9yIHNldCBieSB0aGUgdXNlciBwcm9ncmFtLCB0aGlzIGRlZmF1bHRzIHRvIEVYX1VTQUdFIGZyb20KKyAgIDxzeXNleGl0cy5oPi4gICovCitleHRlcm4gZXJyb3JfdCBhcmdwX2Vycl9leGl0X3N0YXR1czsKKwwKKy8qIEZsYWdzIGZvciBhcmdwX2hlbHAuICAqLworI2RlZmluZSBBUkdQX0hFTFBfVVNBR0UJCTB4MDEgLyogYSBVc2FnZTogbWVzc2FnZS4gKi8KKyNkZWZpbmUgQVJHUF9IRUxQX1NIT1JUX1VTQUdFCTB4MDIgLyogICIgYnV0IGRvbid0IGFjdHVhbGx5IHByaW50IG9wdGlvbnMuICovCisjZGVmaW5lIEFSR1BfSEVMUF9TRUUJCTB4MDQgLyogYSBgVHJ5IC4uLiBmb3IgbW9yZSBoZWxwJyBtZXNzYWdlLiAqLworI2RlZmluZSBBUkdQX0hFTFBfTE9ORwkJMHgwOCAvKiBhIGxvbmcgaGVscCBtZXNzYWdlLiAqLworI2RlZmluZSBBUkdQX0hFTFBfUFJFX0RPQwkweDEwIC8qIGRvYyBzdHJpbmcgcHJlY2VkaW5nIGxvbmcgaGVscC4gICovCisjZGVmaW5lIEFSR1BfSEVMUF9QT1NUX0RPQwkweDIwIC8qIGRvYyBzdHJpbmcgZm9sbG93aW5nIGxvbmcgaGVscC4gICovCisjZGVmaW5lIEFSR1BfSEVMUF9ET0MJCShBUkdQX0hFTFBfUFJFX0RPQyB8IEFSR1BfSEVMUF9QT1NUX0RPQykKKyNkZWZpbmUgQVJHUF9IRUxQX0JVR19BRERSCTB4NDAgLyogYnVnIHJlcG9ydCBhZGRyZXNzICovCisjZGVmaW5lIEFSR1BfSEVMUF9MT05HX09OTFkJMHg4MCAvKiBtb2RpZnkgb3V0cHV0IGFwcHJvcHJpYXRlbHkgdG8KKwkJCQkJcmVmbGVjdCBBUkdQX0xPTkdfT05MWSBtb2RlLiAgKi8KKworLyogVGhlc2UgQVJHUF9IRUxQIGZsYWdzIGFyZSBvbmx5IHVuZGVyc3Rvb2QgYnkgYXJncF9zdGF0ZV9oZWxwLiAgKi8KKyNkZWZpbmUgQVJHUF9IRUxQX0VYSVRfRVJSCTB4MTAwIC8qIENhbGwgZXhpdCgxKSBpbnN0ZWFkIG9mIHJldHVybmluZy4gICovCisjZGVmaW5lIEFSR1BfSEVMUF9FWElUX09LCTB4MjAwIC8qIENhbGwgZXhpdCgwKSBpbnN0ZWFkIG9mIHJldHVybmluZy4gICovCisKKy8qIFRoZSBzdGFuZGFyZCB0aGluZyB0byBkbyBhZnRlciBhIHByb2dyYW0gY29tbWFuZCBsaW5lIHBhcnNpbmcgZXJyb3IsIGlmIGFuCisgICBlcnJvciBtZXNzYWdlIGhhcyBhbHJlYWR5IGJlZW4gcHJpbnRlZC4gICovCisjZGVmaW5lIEFSR1BfSEVMUF9TVERfRVJSIFwKKyAgKEFSR1BfSEVMUF9TRUUgfCBBUkdQX0hFTFBfRVhJVF9FUlIpCisvKiBUaGUgc3RhbmRhcmQgdGhpbmcgdG8gZG8gYWZ0ZXIgYSBwcm9ncmFtIGNvbW1hbmQgbGluZSBwYXJzaW5nIGVycm9yLCBpZiBubworICAgbW9yZSBzcGVjaWZpYyBlcnJvciBtZXNzYWdlIGhhcyBiZWVuIHByaW50ZWQuICAqLworI2RlZmluZSBBUkdQX0hFTFBfU1REX1VTQUdFIFwKKyAgKEFSR1BfSEVMUF9TSE9SVF9VU0FHRSB8IEFSR1BfSEVMUF9TRUUgfCBBUkdQX0hFTFBfRVhJVF9FUlIpCisvKiBUaGUgc3RhbmRhcmQgdGhpbmcgdG8gZG8gaW4gcmVzcG9uc2UgdG8gYSAtLWhlbHAgb3B0aW9uLiAgKi8KKyNkZWZpbmUgQVJHUF9IRUxQX1NURF9IRUxQIFwKKyAgKEFSR1BfSEVMUF9TSE9SVF9VU0FHRSB8IEFSR1BfSEVMUF9MT05HIHwgQVJHUF9IRUxQX0VYSVRfT0sgXAorICAgfCBBUkdQX0hFTFBfRE9DIHwgQVJHUF9IRUxQX0JVR19BRERSKQorCisvKiBPdXRwdXQgYSB1c2FnZSBtZXNzYWdlIGZvciBBUkdQIHRvIFNUUkVBTS4gIEZMQUdTIGFyZSBmcm9tIHRoZSBzZXQKKyAgIEFSR1BfSEVMUF8qLiAgKi8KK2V4dGVybiB2b2lkIGFyZ3BfaGVscCAoX19jb25zdCBzdHJ1Y3QgYXJncCAqX19yZXN0cmljdCBfX2FyZ3AsCisJCSAgICAgICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCQkgICAgICAgdW5zaWduZWQgX19mbGFncywgY2hhciAqX19yZXN0cmljdCBfX25hbWUpOworZXh0ZXJuIHZvaWQgX19hcmdwX2hlbHAgKF9fY29uc3Qgc3RydWN0IGFyZ3AgKl9fcmVzdHJpY3QgX19hcmdwLAorCQkJIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIHVuc2lnbmVkIF9fZmxhZ3MsCisJCQkgY2hhciAqX19uYW1lKTsKKwwKKy8qIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlIGludGVuZGVkIHRvIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhbiBhcmdwCisgICBwYXJzaW5nIHJvdXRpbmUgKHRodXMgdGFraW5nIGFuIGFyZ3Bfc3RhdGUgc3RydWN0dXJlIGFzIHRoZSBmaXJzdAorICAgYXJndW1lbnQpLiAgVGhleSBtYXkgb3IgbWF5IG5vdCBwcmludCBhbiBlcnJvciBtZXNzYWdlIGFuZCBleGl0LCBkZXBlbmRpbmcKKyAgIG9uIHRoZSBmbGFncyBpbiBTVEFURSAtLSBpbiBhbnkgY2FzZSwgdGhlIGNhbGxlciBzaG91bGQgYmUgcHJlcGFyZWQgZm9yCisgICB0aGVtICpub3QqIHRvIGV4aXQsIGFuZCBzaG91bGQgcmV0dXJuIGFuIGFwcHJvcGlhdGUgZXJyb3IgYWZ0ZXIgY2FsbGluZworICAgdGhlbS4gIFthcmdwX3VzYWdlICYgYXJncF9lcnJvciBzaG91bGQgcHJvYmFibHkgYmUgY2FsbGVkIGFyZ3Bfc3RhdGVfLi4uLAorICAgYnV0IHRoZXkncmUgdXNlZCBvZnRlbiBlbm91Z2ggdGhhdCB0aGV5IHNob3VsZCBiZSBzaG9ydF0gICovCisKKy8qIE91dHB1dCwgaWYgYXBwcm9wcmlhdGUsIGEgdXNhZ2UgbWVzc2FnZSBmb3IgU1RBVEUgdG8gU1RSRUFNLiAgRkxBR1MgYXJlCisgICBmcm9tIHRoZSBzZXQgQVJHUF9IRUxQXyouICAqLworZXh0ZXJuIHZvaWQgYXJncF9zdGF0ZV9oZWxwIChfX2NvbnN0IHN0cnVjdCBhcmdwX3N0YXRlICpfX3Jlc3RyaWN0IF9fc3RhdGUsCisJCQkgICAgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJCQkgICAgIHVuc2lnbmVkIGludCBfX2ZsYWdzKTsKK2V4dGVybiB2b2lkIF9fYXJncF9zdGF0ZV9oZWxwIChfX2NvbnN0IHN0cnVjdCBhcmdwX3N0YXRlICpfX3Jlc3RyaWN0IF9fc3RhdGUsCisJCQkgICAgICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgX19mbGFncyk7CisKKy8qIFBvc3NpYmx5IG91dHB1dCB0aGUgc3RhbmRhcmQgdXNhZ2UgbWVzc2FnZSBmb3IgQVJHUCB0byBzdGRlcnIgYW5kIGV4aXQuICAqLworZXh0ZXJuIHZvaWQgYXJncF91c2FnZSAoX19jb25zdCBzdHJ1Y3QgYXJncF9zdGF0ZSAqX19zdGF0ZSk7CitleHRlcm4gdm9pZCBfX2FyZ3BfdXNhZ2UgKF9fY29uc3Qgc3RydWN0IGFyZ3Bfc3RhdGUgKl9fc3RhdGUpOworCisvKiBJZiBhcHByb3ByaWF0ZSwgcHJpbnQgdGhlIHByaW50ZiBzdHJpbmcgRk1UIGFuZCBmb2xsb3dpbmcgYXJncywgcHJlY2VkZWQKKyAgIGJ5IHRoZSBwcm9ncmFtIG5hbWUgYW5kIGA6JywgdG8gc3RkZXJyLCBhbmQgZm9sbG93ZWQgYnkgYSBgVHJ5IC4uLiAtLWhlbHAnCisgICBtZXNzYWdlLCB0aGVuIGV4aXQgKDEpLiAgKi8KK2V4dGVybiB2b2lkIGFyZ3BfZXJyb3IgKF9fY29uc3Qgc3RydWN0IGFyZ3Bfc3RhdGUgKl9fcmVzdHJpY3QgX19zdGF0ZSwKKwkJCV9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMiwgMykpKTsKK2V4dGVybiB2b2lkIF9fYXJncF9lcnJvciAoX19jb25zdCBzdHJ1Y3QgYXJncF9zdGF0ZSAqX19yZXN0cmljdCBfX3N0YXRlLAorCQkJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDIsIDMpKSk7CisKKy8qIFNpbWlsYXIgdG8gdGhlIHN0YW5kYXJkIGdudSBlcnJvci1yZXBvcnRpbmcgZnVuY3Rpb24gZXJyb3IoKSwgYnV0IHdpbGwKKyAgIHJlc3BlY3QgdGhlIEFSR1BfTk9fRVhJVCBhbmQgQVJHUF9OT19FUlJTIGZsYWdzIGluIFNUQVRFLCBhbmQgd2lsbCBwcmludAorICAgdG8gU1RBVEUtPmVycl9zdHJlYW0uICBUaGlzIGlzIHVzZWZ1bCBmb3IgYXJndW1lbnQgcGFyc2luZyBjb2RlIHRoYXQgaXMKKyAgIHNoYXJlZCBiZXR3ZWVuIHByb2dyYW0gc3RhcnR1cCAod2hlbiBleGl0aW5nIGlzIGRlc2lyZWQpIGFuZCBydW50aW1lCisgICBvcHRpb24gcGFyc2luZyAod2hlbiB0eXBpY2FsbHkgYW4gZXJyb3IgY29kZSBpcyByZXR1cm5lZCBpbnN0ZWFkKS4gIFRoZQorICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgZnVuY3Rpb24gYW5kIGFyZ3BfZXJyb3IgaXMgdGhhdCB0aGUgbGF0dGVyIGlzIGZvcgorICAgKnBhcnNpbmcgZXJyb3JzKiwgYW5kIHRoZSBmb3JtZXIgaXMgZm9yIG90aGVyIHByb2JsZW1zIHRoYXQgb2NjdXIgZHVyaW5nCisgICBwYXJzaW5nIGJ1dCBkb24ndCByZWZsZWN0IGEgKHN5bnRhY3RpYykgcHJvYmxlbSB3aXRoIHRoZSBpbnB1dC4gICovCitleHRlcm4gdm9pZCBhcmdwX2ZhaWx1cmUgKF9fY29uc3Qgc3RydWN0IGFyZ3Bfc3RhdGUgKl9fcmVzdHJpY3QgX19zdGF0ZSwKKwkJCSAgaW50IF9fc3RhdHVzLCBpbnQgX19lcnJudW0sCisJCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgNCwgNSkpKTsKK2V4dGVybiB2b2lkIF9fYXJncF9mYWlsdXJlIChfX2NvbnN0IHN0cnVjdCBhcmdwX3N0YXRlICpfX3Jlc3RyaWN0IF9fc3RhdGUsCisJCQkgICAgaW50IF9fc3RhdHVzLCBpbnQgX19lcnJudW0sCisJCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCA0LCA1KSkpOworCisvKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9wdGlvbiBPUFQgaXMgYSB2YWxpZCBzaG9ydCBvcHRpb24uICAqLworZXh0ZXJuIGludCBfb3B0aW9uX2lzX3Nob3J0IChfX2NvbnN0IHN0cnVjdCBhcmdwX29wdGlvbiAqX19vcHQpIF9fVEhST1c7CitleHRlcm4gaW50IF9fb3B0aW9uX2lzX3Nob3J0IChfX2NvbnN0IHN0cnVjdCBhcmdwX29wdGlvbiAqX19vcHQpIF9fVEhST1c7CisKKy8qIFJldHVybnMgdHJ1ZSBpZiB0aGUgb3B0aW9uIE9QVCBpcyBpbiBmYWN0IHRoZSBsYXN0ICh1bnVzZWQpIGVudHJ5IGluIGFuCisgICBvcHRpb25zIGFycmF5LiAgKi8KK2V4dGVybiBpbnQgX29wdGlvbl9pc19lbmQgKF9fY29uc3Qgc3RydWN0IGFyZ3Bfb3B0aW9uICpfX29wdCkgX19USFJPVzsKK2V4dGVybiBpbnQgX19vcHRpb25faXNfZW5kIChfX2NvbnN0IHN0cnVjdCBhcmdwX29wdGlvbiAqX19vcHQpIF9fVEhST1c7CisKKy8qIFJldHVybiB0aGUgaW5wdXQgZmllbGQgZm9yIEFSR1AgaW4gdGhlIHBhcnNlciBjb3JyZXNwb25kaW5nIHRvIFNUQVRFOyB1c2VkCisgICBieSB0aGUgaGVscCByb3V0aW5lcy4gICovCitleHRlcm4gdm9pZCAqX2FyZ3BfaW5wdXQgKF9fY29uc3Qgc3RydWN0IGFyZ3AgKl9fcmVzdHJpY3QgX19hcmdwLAorCQkJICBfX2NvbnN0IHN0cnVjdCBhcmdwX3N0YXRlICpfX3Jlc3RyaWN0IF9fc3RhdGUpCisgICAgIF9fVEhST1c7CitleHRlcm4gdm9pZCAqX19hcmdwX2lucHV0IChfX2NvbnN0IHN0cnVjdCBhcmdwICpfX3Jlc3RyaWN0IF9fYXJncCwKKwkJCSAgIF9fY29uc3Qgc3RydWN0IGFyZ3Bfc3RhdGUgKl9fcmVzdHJpY3QgX19zdGF0ZSkKKyAgICAgX19USFJPVzsKKwwKKyNpZmRlZiBfX1VTRV9FWFRFUk5fSU5MSU5FUworCisjIGlmICFfTElCQworIyAgZGVmaW5lIF9fYXJncF91c2FnZSBhcmdwX3VzYWdlCisjICBkZWZpbmUgX19hcmdwX3N0YXRlX2hlbHAgYXJncF9zdGF0ZV9oZWxwCisjICBkZWZpbmUgX19vcHRpb25faXNfc2hvcnQgX29wdGlvbl9pc19zaG9ydAorIyAgZGVmaW5lIF9fb3B0aW9uX2lzX2VuZCBfb3B0aW9uX2lzX2VuZAorIyBlbmRpZgorCisjIGlmbmRlZiBBUkdQX0VJCisjICBkZWZpbmUgQVJHUF9FSSBfX2V4dGVybl9pbmxpbmUKKyMgZW5kaWYKKworQVJHUF9FSSB2b2lkCitfX2FyZ3BfdXNhZ2UgKF9fY29uc3Qgc3RydWN0IGFyZ3Bfc3RhdGUgKl9fc3RhdGUpCit7CisgIF9fYXJncF9zdGF0ZV9oZWxwIChfX3N0YXRlLCBzdGRlcnIsIEFSR1BfSEVMUF9TVERfVVNBR0UpOworfQorCitBUkdQX0VJIGludAorX19OVEggKF9fb3B0aW9uX2lzX3Nob3J0IChfX2NvbnN0IHN0cnVjdCBhcmdwX29wdGlvbiAqX19vcHQpKQoreworICBpZiAoX19vcHQtPmZsYWdzICYgT1BUSU9OX0RPQykKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBfX2tleSA9IF9fb3B0LT5rZXk7CisgICAgICByZXR1cm4gX19rZXkgPiAwICYmIF9fa2V5IDw9IFVDSEFSX01BWCAmJiBpc3ByaW50IChfX2tleSk7CisgICAgfQorfQorCitBUkdQX0VJIGludAorX19OVEggKF9fb3B0aW9uX2lzX2VuZCAoX19jb25zdCBzdHJ1Y3QgYXJncF9vcHRpb24gKl9fb3B0KSkKK3sKKyAgcmV0dXJuICFfX29wdC0+a2V5ICYmICFfX29wdC0+bmFtZSAmJiAhX19vcHQtPmRvYyAmJiAhX19vcHQtPmdyb3VwOworfQorCisjIGlmICFfTElCQworIyAgdW5kZWYgX19hcmdwX3VzYWdlCisjICB1bmRlZiBfX2FyZ3Bfc3RhdGVfaGVscAorIyAgdW5kZWYgX19vcHRpb25faXNfc2hvcnQKKyMgIHVuZGVmIF9fb3B0aW9uX2lzX2VuZAorIyBlbmRpZgorI2VuZGlmIC8qIFVzZSBleHRlcm4gaW5saW5lcy4gICovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogYXJncC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FyZ3ouaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJnei5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNDFkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FyZ3ouaApAQCAtMCwwICsxLDE4NyBAQAorLyogUm91dGluZXMgZm9yIGRlYWxpbmcgd2l0aCAnXDAnIHNlcGFyYXRlZCBhcmcgdmVjdG9ycy4KKyAgIENvcHlyaWdodCAoQykgMTk5NSw5Niw5Nyw5OCw5OSwyMDAwLDIwMDQsMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfQVJHWl9ICisjZGVmaW5lIF9BUkdaX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2RlZmluZSBfX25lZWRfZXJyb3JfdAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CQkvKiBOZWVkIHNpemVfdCwgYW5kIHN0cmNociBpcyBjYWxsZWQgYmVsb3cuICAqLworCisjaWZuZGVmIF9fY29uc3QKKyMgZGVmaW5lIF9fY29uc3QgY29uc3QKKyNlbmRpZgorCisjaWZuZGVmIF9fZXJyb3JfdF9kZWZpbmVkCit0eXBlZGVmIGludCBlcnJvcl90OworI2VuZGlmCisKKworX19CRUdJTl9ERUNMUworCisvKiBNYWtlIGEgJ1wwJyBzZXBhcmF0ZWQgYXJnIHZlY3RvciBmcm9tIGEgdW5peCBhcmd2IHZlY3RvciwgcmV0dXJuaW5nIGl0IGluCisgICBBUkdaLCBhbmQgdGhlIHRvdGFsIGxlbmd0aCBpbiBMRU4uICBJZiBhIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yIG9jY3VycywKKyAgIEVOT01FTSBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIDAuICBUaGUgcmVzdWx0IGNhbiBiZSBkZXN0cm95ZWQgdXNpbmcgZnJlZS4gKi8KK2V4dGVybiBlcnJvcl90IF9fYXJnel9jcmVhdGUgKGNoYXIgKl9fY29uc3QgX19hcmd2W10sIGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJneiwKKwkJCSAgICAgIHNpemVfdCAqX19yZXN0cmljdCBfX2xlbikgX19USFJPVzsKK2V4dGVybiBlcnJvcl90IGFyZ3pfY3JlYXRlIChjaGFyICpfX2NvbnN0IF9fYXJndltdLCBjaGFyICoqX19yZXN0cmljdCBfX2FyZ3osCisJCQkgICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fbGVuKSBfX1RIUk9XOworCisvKiBNYWtlIGEgJ1wwJyBzZXBhcmF0ZWQgYXJnIHZlY3RvciBmcm9tIGEgU0VQIHNlcGFyYXRlZCBsaXN0IGluCisgICBTVFJJTkcsIHJldHVybmluZyBpdCBpbiBBUkdaLCBhbmQgdGhlIHRvdGFsIGxlbmd0aCBpbiBMRU4uICBJZiBhCisgICBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciBvY2N1cnMsIEVOT01FTSBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIDAuCisgICBUaGUgcmVzdWx0IGNhbiBiZSBkZXN0cm95ZWQgdXNpbmcgZnJlZS4gICovCitleHRlcm4gZXJyb3JfdCBfX2FyZ3pfY3JlYXRlX3NlcCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3RyaW5nLAorCQkJCSAgaW50IF9fc2VwLCBjaGFyICoqX19yZXN0cmljdCBfX2FyZ3osCisJCQkJICBzaXplX3QgKl9fcmVzdHJpY3QgX19sZW4pIF9fVEhST1c7CitleHRlcm4gZXJyb3JfdCBhcmd6X2NyZWF0ZV9zZXAgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3N0cmluZywKKwkJCQlpbnQgX19zZXAsIGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJneiwKKwkJCQlzaXplX3QgKl9fcmVzdHJpY3QgX19sZW4pIF9fVEhST1c7CisKKy8qIFJldHVybnMgdGhlIG51bWJlciBvZiBzdHJpbmdzIGluIEFSR1ouICAqLworZXh0ZXJuIHNpemVfdCBfX2FyZ3pfY291bnQgKF9fY29uc3QgY2hhciAqX19hcmd6LCBzaXplX3QgX19sZW4pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworZXh0ZXJuIHNpemVfdCBhcmd6X2NvdW50IChfX2NvbnN0IGNoYXIgKl9fYXJneiwgc2l6ZV90IF9fbGVuKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXzsKKworLyogUHV0cyBwb2ludGVycyB0byBlYWNoIHN0cmluZyBpbiBBUkdaIGludG8gQVJHViwgd2hpY2ggbXVzdCBiZSBsYXJnZSBlbm91Z2gKKyAgIHRvIGhvbGQgdGhlbSBhbGwuICAqLworZXh0ZXJuIHZvaWQgX19hcmd6X2V4dHJhY3QgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2FyZ3osIHNpemVfdCBfX2xlbiwKKwkJCSAgICBjaGFyICoqX19yZXN0cmljdCBfX2FyZ3YpIF9fVEhST1c7CitleHRlcm4gdm9pZCBhcmd6X2V4dHJhY3QgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2FyZ3osIHNpemVfdCBfX2xlbiwKKwkJCSAgY2hhciAqKl9fcmVzdHJpY3QgX19hcmd2KSBfX1RIUk9XOworCisvKiBNYWtlICdcMCcgc2VwYXJhdGVkIGFyZyB2ZWN0b3IgQVJHWiBwcmludGFibGUgYnkgY29udmVydGluZyBhbGwgdGhlICdcMCdzCisgICBleGNlcHQgdGhlIGxhc3QgaW50byB0aGUgY2hhcmFjdGVyIFNFUC4gICovCitleHRlcm4gdm9pZCBfX2FyZ3pfc3RyaW5naWZ5IChjaGFyICpfX2FyZ3osIHNpemVfdCBfX2xlbiwgaW50IF9fc2VwKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgYXJnel9zdHJpbmdpZnkgKGNoYXIgKl9fYXJneiwgc2l6ZV90IF9fbGVuLCBpbnQgX19zZXApIF9fVEhST1c7CisKKy8qIEFwcGVuZCBCVUYsIG9mIGxlbmd0aCBCVUZfTEVOIHRvIHRoZSBhcmd6IHZlY3RvciBpbiBBUkdaICYgQVJHWl9MRU4uICAqLworZXh0ZXJuIGVycm9yX3QgX19hcmd6X2FwcGVuZCAoY2hhciAqKl9fcmVzdHJpY3QgX19hcmd6LAorCQkJICAgICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fYXJnel9sZW4sCisJCQkgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfYnVmX2xlbikKKyAgICAgX19USFJPVzsKK2V4dGVybiBlcnJvcl90IGFyZ3pfYXBwZW5kIChjaGFyICoqX19yZXN0cmljdCBfX2FyZ3osCisJCQkgICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fYXJnel9sZW4sCisJCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19idWZfbGVuKQorICAgICBfX1RIUk9XOworCisvKiBBcHBlbmQgU1RSIHRvIHRoZSBhcmd6IHZlY3RvciBpbiBBUkdaICYgQVJHWl9MRU4uICAqLworZXh0ZXJuIGVycm9yX3QgX19hcmd6X2FkZCAoY2hhciAqKl9fcmVzdHJpY3QgX19hcmd6LAorCQkJICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fYXJnel9sZW4sCisJCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zdHIpIF9fVEhST1c7CitleHRlcm4gZXJyb3JfdCBhcmd6X2FkZCAoY2hhciAqKl9fcmVzdHJpY3QgX19hcmd6LAorCQkJIHNpemVfdCAqX19yZXN0cmljdCBfX2FyZ3pfbGVuLAorCQkJIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3N0cikgX19USFJPVzsKKworLyogQXBwZW5kIFNFUCBzZXBhcmF0ZWQgbGlzdCBpbiBTVFJJTkcgdG8gdGhlIGFyZ3ogdmVjdG9yIGluIEFSR1ogJgorICAgQVJHWl9MRU4uICAqLworZXh0ZXJuIGVycm9yX3QgX19hcmd6X2FkZF9zZXAgKGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJneiwKKwkJCSAgICAgICBzaXplX3QgKl9fcmVzdHJpY3QgX19hcmd6X2xlbiwKKwkJCSAgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zdHJpbmcsIGludCBfX2RlbGltKQorICAgICBfX1RIUk9XOworZXh0ZXJuIGVycm9yX3QgYXJnel9hZGRfc2VwIChjaGFyICoqX19yZXN0cmljdCBfX2FyZ3osCisJCQkgICAgIHNpemVfdCAqX19yZXN0cmljdCBfX2FyZ3pfbGVuLAorCQkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zdHJpbmcsIGludCBfX2RlbGltKQorICAgICBfX1RIUk9XOworCisvKiBEZWxldGUgRU5UUlkgZnJvbSBBUkdaICYgQVJHWl9MRU4sIGlmIGl0IGFwcGVhcnMgdGhlcmUuICAqLworZXh0ZXJuIHZvaWQgX19hcmd6X2RlbGV0ZSAoY2hhciAqKl9fcmVzdHJpY3QgX19hcmd6LAorCQkJICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fYXJnel9sZW4sCisJCQkgICBjaGFyICpfX3Jlc3RyaWN0IF9fZW50cnkpIF9fVEhST1c7CitleHRlcm4gdm9pZCBhcmd6X2RlbGV0ZSAoY2hhciAqKl9fcmVzdHJpY3QgX19hcmd6LAorCQkJIHNpemVfdCAqX19yZXN0cmljdCBfX2FyZ3pfbGVuLAorCQkJIGNoYXIgKl9fcmVzdHJpY3QgX19lbnRyeSkgX19USFJPVzsKKworLyogSW5zZXJ0IEVOVFJZIGludG8gQVJHWiAmIEFSR1pfTEVOIGJlZm9yZSBCRUZPUkUsIHdoaWNoIHNob3VsZCBiZSBhbgorICAgZXhpc3RpbmcgZW50cnkgaW4gQVJHWjsgaWYgQkVGT1JFIGlzIE5VTEwsIEVOVFJZIGlzIGFwcGVuZGVkIHRvIHRoZSBlbmQuCisgICBTaW5jZSBBUkdaJ3MgZmlyc3QgZW50cnkgaXMgdGhlIHNhbWUgYXMgQVJHWiwgYXJnel9pbnNlcnQgKEFSR1osIEFSR1pfTEVOLAorICAgQVJHWiwgRU5UUlkpIHdpbGwgaW5zZXJ0IEVOVFJZIGF0IHRoZSBiZWdpbm5pbmcgb2YgQVJHWi4gIElmIEJFRk9SRSBpcyBub3QKKyAgIGluIEFSR1osIEVJTlZBTCBpcyByZXR1cm5lZCwgZWxzZSBpZiBtZW1vcnkgY2FuJ3QgYmUgYWxsb2NhdGVkIGZvciB0aGUgbmV3CisgICBBUkdaLCBFTk9NRU0gaXMgcmV0dXJuZWQsIGVsc2UgMC4gICovCitleHRlcm4gZXJyb3JfdCBfX2FyZ3pfaW5zZXJ0IChjaGFyICoqX19yZXN0cmljdCBfX2FyZ3osCisJCQkgICAgICBzaXplX3QgKl9fcmVzdHJpY3QgX19hcmd6X2xlbiwKKwkJCSAgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19iZWZvcmUsCisJCQkgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19lbnRyeSkgX19USFJPVzsKK2V4dGVybiBlcnJvcl90IGFyZ3pfaW5zZXJ0IChjaGFyICoqX19yZXN0cmljdCBfX2FyZ3osCisJCQkgICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fYXJnel9sZW4sCisJCQkgICAgY2hhciAqX19yZXN0cmljdCBfX2JlZm9yZSwKKwkJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19lbnRyeSkgX19USFJPVzsKKworLyogUmVwbGFjZSBhbnkgb2NjdXJyZW5jZXMgb2YgdGhlIHN0cmluZyBTVFIgaW4gQVJHWiB3aXRoIFdJVEgsIHJlYWxsb2NhdGluZworICAgQVJHWiBhcyBuZWNlc3NhcnkuICBJZiBSRVBMQUNFX0NPVU5UIGlzIG5vbi16ZXJvLCAqUkVQTEFDRV9DT1VOVCB3aWxsIGJlCisgICBpbmNyZW1lbnRlZCBieSBudW1iZXIgb2YgcmVwbGFjZW1lbnRzIHBlcmZvcm1lZC4gICovCitleHRlcm4gZXJyb3JfdCBfX2FyZ3pfcmVwbGFjZSAoY2hhciAqKl9fcmVzdHJpY3QgX19hcmd6LAorCQkJICAgICAgIHNpemVfdCAqX19yZXN0cmljdCBfX2FyZ3pfbGVuLAorCQkJICAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3N0ciwKKwkJCSAgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX193aXRoLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqX19yZXN0cmljdCBfX3JlcGxhY2VfY291bnQpOworZXh0ZXJuIGVycm9yX3QgYXJnel9yZXBsYWNlIChjaGFyICoqX19yZXN0cmljdCBfX2FyZ3osCisJCQkgICAgIHNpemVfdCAqX19yZXN0cmljdCBfX2FyZ3pfbGVuLAorCQkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zdHIsCisJCQkgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3dpdGgsCisJCQkgICAgIHVuc2lnbmVkIGludCAqX19yZXN0cmljdCBfX3JlcGxhY2VfY291bnQpOworDAorLyogUmV0dXJucyB0aGUgbmV4dCBlbnRyeSBpbiBBUkdaICYgQVJHWl9MRU4gYWZ0ZXIgRU5UUlksIG9yIE5VTEwgaWYgdGhlcmUKKyAgIGFyZSBubyBtb3JlLiAgSWYgZW50cnkgaXMgTlVMTCwgdGhlbiB0aGUgZmlyc3QgZW50cnkgaXMgcmV0dXJuZWQuICBUaGlzCisgICBiZWhhdmlvciBhbGxvd3MgdHdvIGNvbnZlbmllbnQgaXRlcmF0aW9uIHN0eWxlczoKKworICAgIGNoYXIgKmVudHJ5ID0gMDsKKyAgICB3aGlsZSAoKGVudHJ5ID0gYXJnel9uZXh0IChhcmd6LCBhcmd6X2xlbiwgZW50cnkpKSkKKyAgICAgIC4uLjsKKworICAgb3IKKworICAgIGNoYXIgKmVudHJ5OworICAgIGZvciAoZW50cnkgPSBhcmd6OyBlbnRyeTsgZW50cnkgPSBhcmd6X25leHQgKGFyZ3osIGFyZ3pfbGVuLCBlbnRyeSkpCisgICAgICAuLi47CisqLworZXh0ZXJuIGNoYXIgKl9fYXJnel9uZXh0IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19hcmd6LCBzaXplX3QgX19hcmd6X2xlbiwKKwkJCSAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZW50cnkpIF9fVEhST1c7CitleHRlcm4gY2hhciAqYXJnel9uZXh0IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19hcmd6LCBzaXplX3QgX19hcmd6X2xlbiwKKwkJCV9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2VudHJ5KSBfX1RIUk9XOworCisjaWZkZWYgX19VU0VfRVhURVJOX0lOTElORVMKK19fZXh0ZXJuX2lubGluZSBjaGFyICoKK19fTlRIIChfX2FyZ3pfbmV4dCAoX19jb25zdCBjaGFyICpfX2FyZ3osIHNpemVfdCBfX2FyZ3pfbGVuLAorCQkgICAgX19jb25zdCBjaGFyICpfX2VudHJ5KSkKK3sKKyAgaWYgKF9fZW50cnkpCisgICAgeworICAgICAgaWYgKF9fZW50cnkgPCBfX2FyZ3ogKyBfX2FyZ3pfbGVuKQorCV9fZW50cnkgPSBzdHJjaHIgKF9fZW50cnksICdcMCcpICsgMTsKKworICAgICAgcmV0dXJuIF9fZW50cnkgPj0gX19hcmd6ICsgX19hcmd6X2xlbiA/IChjaGFyICopIE5VTEwgOiAoY2hhciAqKSBfX2VudHJ5OworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBfX2FyZ3pfbGVuID4gMCA/IChjaGFyICopIF9fYXJneiA6IDA7Cit9CitfX2V4dGVybl9pbmxpbmUgY2hhciAqCitfX05USCAoYXJnel9uZXh0IChfX2NvbnN0IGNoYXIgKl9fYXJneiwgc2l6ZV90IF9fYXJnel9sZW4sCisJCSAgX19jb25zdCBjaGFyICpfX2VudHJ5KSkKK3sKKyAgcmV0dXJuIF9fYXJnel9uZXh0IChfX2FyZ3osIF9fYXJnel9sZW4sIF9fZW50cnkpOworfQorI2VuZGlmIC8qIFVzZSBleHRlcm4gaW5saW5lcy4gICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBhcmd6LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJwYS9mdHAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJwYS9mdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWIzNDBkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hcnBhL2Z0cC5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTg5LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWZ0cC5oCTguMSAoQmVya2VsZXkpIDYvMi85MworICovCisKKyNpZm5kZWYgX0FSUEFfRlRQX0gKKyNkZWZpbmUJX0FSUEFfRlRQX0ggMQorCisvKiBEZWZpbml0aW9ucyBmb3IgRlRQOyBzZWUgUkZDLTc2NS4gKi8KKworLyoKKyAqIFJlcGx5IGNvZGVzLgorICovCisjZGVmaW5lIFBSRUxJTQkJMQkvKiBwb3NpdGl2ZSBwcmVsaW1pbmFyeSAqLworI2RlZmluZSBDT01QTEVURQkyCS8qIHBvc2l0aXZlIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgQ09OVElOVUUJMwkvKiBwb3NpdGl2ZSBpbnRlcm1lZGlhdGUgKi8KKyNkZWZpbmUgVFJBTlNJRU5UCTQJLyogdHJhbnNpZW50IG5lZ2F0aXZlIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgRVJST1IJCTUJLyogcGVybWFuZW50IG5lZ2F0aXZlIGNvbXBsZXRpb24gKi8KKworLyoKKyAqIFR5cGUgY29kZXMKKyAqLworI2RlZmluZQlUWVBFX0EJCTEJLyogQVNDSUkgKi8KKyNkZWZpbmUJVFlQRV9FCQkyCS8qIEVCQ0RJQyAqLworI2RlZmluZQlUWVBFX0kJCTMJLyogaW1hZ2UgKi8KKyNkZWZpbmUJVFlQRV9MCQk0CS8qIGxvY2FsIGJ5dGUgc2l6ZSAqLworCisjaWZkZWYgRlRQX05BTUVTCitjaGFyICp0eXBlbmFtZXNbXSA9ICB7IjAiLCAiQVNDSUkiLCAiRUJDRElDIiwgIkltYWdlIiwgIkxvY2FsIiB9OworI2VuZGlmCisKKy8qCisgKiBGb3JtIGNvZGVzCisgKi8KKyNkZWZpbmUJRk9STV9OCQkxCS8qIG5vbi1wcmludCAqLworI2RlZmluZQlGT1JNX1QJCTIJLyogdGVsbmV0IGZvcm1hdCBlZmZlY3RvcnMgKi8KKyNkZWZpbmUJRk9STV9DCQkzCS8qIGNhcnJpYWdlIGNvbnRyb2wgKEFTQSkgKi8KKyNpZmRlZiBGVFBfTkFNRVMKK2NoYXIgKmZvcm1uYW1lc1tdID0gIHsiMCIsICJOb25wcmludCIsICJUZWxuZXQiLCAiQ2FycmlhZ2UtY29udHJvbCIgfTsKKyNlbmRpZgorCisvKgorICogU3RydWN0dXJlIGNvZGVzCisgKi8KKyNkZWZpbmUJU1RSVV9GCQkxCS8qIGZpbGUgKG5vIHJlY29yZCBzdHJ1Y3R1cmUpICovCisjZGVmaW5lCVNUUlVfUgkJMgkvKiByZWNvcmQgc3RydWN0dXJlICovCisjZGVmaW5lCVNUUlVfUAkJMwkvKiBwYWdlIHN0cnVjdHVyZSAqLworI2lmZGVmIEZUUF9OQU1FUworY2hhciAqc3RydW5hbWVzW10gPSAgeyIwIiwgIkZpbGUiLCAiUmVjb3JkIiwgIlBhZ2UiIH07CisjZW5kaWYKKworLyoKKyAqIE1vZGUgdHlwZXMKKyAqLworI2RlZmluZQlNT0RFX1MJCTEJLyogc3RyZWFtICovCisjZGVmaW5lCU1PREVfQgkJMgkvKiBibG9jayAqLworI2RlZmluZQlNT0RFX0MJCTMJLyogY29tcHJlc3NlZCAqLworI2lmZGVmIEZUUF9OQU1FUworY2hhciAqbW9kZW5hbWVzW10gPSAgeyIwIiwgIlN0cmVhbSIsICJCbG9jayIsICJDb21wcmVzc2VkIiB9OworI2VuZGlmCisKKy8qCisgKiBSZWNvcmQgVG9rZW5zCisgKi8KKyNkZWZpbmUJUkVDX0VTQwkJJ1wzNzcnCS8qIFJlY29yZC1tb2RlIEVzY2FwZSAqLworI2RlZmluZQlSRUNfRU9SCQknXDAwMScJLyogUmVjb3JkLW1vZGUgRW5kLW9mLVJlY29yZCAqLworI2RlZmluZSBSRUNfRU9GCQknXDAwMicJLyogUmVjb3JkLW1vZGUgRW5kLW9mLUZpbGUgKi8KKworLyoKKyAqIEJsb2NrIEhlYWRlcgorICovCisjZGVmaW5lCUJMS19FT1IJCTB4ODAJLyogQmxvY2sgaXMgRW5kLW9mLVJlY29yZCAqLworI2RlZmluZQlCTEtfRU9GCQkweDQwCS8qIEJsb2NrIGlzIEVuZC1vZi1GaWxlICovCisjZGVmaW5lIEJMS19FUlJPUlMJMHgyMAkvKiBCbG9jayBpcyBzdXNwZWN0ZWQgb2YgY29udGFpbmluZyBlcnJvcnMgKi8KKyNkZWZpbmUJQkxLX1JFU1RBUlQJMHgxMAkvKiBCbG9jayBpcyBSZXN0YXJ0IE1hcmtlciAqLworCisjZGVmaW5lCUJMS19CWVRFQ09VTlQJMgkvKiBCeXRlcyBpbiB0aGlzIGJsb2NrICovCisKKyNlbmRpZiAvKiBhcnBhL2Z0cC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FycGEvaW5ldC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hcnBhL2luZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjExNTRlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hcnBhL2luZXQuaApAQCAtMCwwICsxLDEwNiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9BUlBBX0lORVRfSAorI2RlZmluZQlfQVJQQV9JTkVUX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CQkvKiBUbyBkZWZpbmUgYHN0cnVjdCBpbl9hZGRyJy4gICovCisKKy8qIFR5cGUgZm9yIGxlbmd0aCBhcmd1bWVudHMgaW4gc29ja2V0IGNhbGxzLiAgKi8KKyNpZm5kZWYgX19zb2NrbGVuX3RfZGVmaW5lZAordHlwZWRlZiBfX3NvY2tsZW5fdCBzb2NrbGVuX3Q7CisjIGRlZmluZSBfX3NvY2tsZW5fdF9kZWZpbmVkCisjZW5kaWYKKworX19CRUdJTl9ERUNMUworCisvKiBDb252ZXJ0IEludGVybmV0IGhvc3QgYWRkcmVzcyBmcm9tIG51bWJlcnMtYW5kLWRvdHMgbm90YXRpb24gaW4gQ1AKKyAgIGludG8gYmluYXJ5IGRhdGEgaW4gbmV0d29yayBieXRlIG9yZGVyLiAgKi8KK2V4dGVybiBpbl9hZGRyX3QgaW5ldF9hZGRyIChfX2NvbnN0IGNoYXIgKl9fY3ApIF9fVEhST1c7CisKKy8qIFJldHVybiB0aGUgbG9jYWwgaG9zdCBhZGRyZXNzIHBhcnQgb2YgdGhlIEludGVybmV0IGFkZHJlc3MgaW4gSU4uICAqLworZXh0ZXJuIGluX2FkZHJfdCBpbmV0X2xuYW9mIChzdHJ1Y3QgaW5fYWRkciBfX2luKSBfX1RIUk9XOworCisvKiBNYWtlIEludGVybmV0IGhvc3QgYWRkcmVzcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgYnkgY29tYmluaW5nIHRoZQorICAgbmV0d29yayBudW1iZXIgTkVUIHdpdGggdGhlIGxvY2FsIGFkZHJlc3MgSE9TVC4gICovCitleHRlcm4gc3RydWN0IGluX2FkZHIgaW5ldF9tYWtlYWRkciAoaW5fYWRkcl90IF9fbmV0LCBpbl9hZGRyX3QgX19ob3N0KQorICAgICBfX1RIUk9XOworCisvKiBSZXR1cm4gbmV0d29yayBudW1iZXIgcGFydCBvZiB0aGUgSW50ZXJuZXQgYWRkcmVzcyBJTi4gICovCitleHRlcm4gaW5fYWRkcl90IGluZXRfbmV0b2YgKHN0cnVjdCBpbl9hZGRyIF9faW4pIF9fVEhST1c7CisKKy8qIEV4dHJhY3QgdGhlIG5ldHdvcmsgbnVtYmVyIGluIG5ldHdvcmsgYnl0ZSBvcmRlciBmcm9tIHRoZSBhZGRyZXNzCisgICBpbiBudW1iZXJzLWFuZC1kb3RzIG5hdGF0aW9uIHN0YXJ0aW5nIGF0IENQLiAgKi8KK2V4dGVybiBpbl9hZGRyX3QgaW5ldF9uZXR3b3JrIChfX2NvbnN0IGNoYXIgKl9fY3ApIF9fVEhST1c7CisKKy8qIENvbnZlcnQgSW50ZXJuZXQgbnVtYmVyIGluIElOIHRvIEFTQ0lJIHJlcHJlc2VudGF0aW9uLiAgVGhlIHJldHVybiB2YWx1ZQorICAgaXMgYSBwb2ludGVyIHRvIGFuIGludGVybmFsIGFycmF5IGNvbnRhaW5pbmcgdGhlIHN0cmluZy4gICovCitleHRlcm4gY2hhciAqaW5ldF9udG9hIChzdHJ1Y3QgaW5fYWRkciBfX2luKSBfX1RIUk9XOworCisvKiBDb252ZXJ0IGZyb20gcHJlc2VudGF0aW9uIGZvcm1hdCBvZiBhbiBJbnRlcm5ldCBudW1iZXIgaW4gYnVmZmVyCisgICBzdGFydGluZyBhdCBDUCB0byB0aGUgYmluYXJ5IG5ldHdvcmsgZm9ybWF0IGFuZCBzdG9yZSByZXN1bHQgZm9yCisgICBpbnRlcmZhY2UgdHlwZSBBRiBpbiBidWZmZXIgc3RhcnRpbmcgYXQgQlVGLiAgKi8KK2V4dGVybiBpbnQgaW5ldF9wdG9uIChpbnQgX19hZiwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fY3AsCisJCSAgICAgIHZvaWQgKl9fcmVzdHJpY3QgX19idWYpIF9fVEhST1c7CisKKy8qIENvbnZlcnQgYSBJbnRlcm5ldCBhZGRyZXNzIGluIGJpbmFyeSBuZXR3b3JrIGZvcm1hdCBmb3IgaW50ZXJmYWNlCisgICB0eXBlIEFGIGluIGJ1ZmZlciBzdGFydGluZyBhdCBDUCB0byBwcmVzZW50YXRpb24gZm9ybSBhbmQgcGxhY2UKKyAgIHJlc3VsdCBpbiBidWZmZXIgb2YgbGVuZ3RoIExFTiBhc3RhcnRpbmcgYXQgQlVGLiAgKi8KK2V4dGVybiBfX2NvbnN0IGNoYXIgKmluZXRfbnRvcCAoaW50IF9fYWYsIF9fY29uc3Qgdm9pZCAqX19yZXN0cmljdCBfX2NwLAorCQkJCWNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNvY2tsZW5fdCBfX2xlbikKKyAgICAgX19USFJPVzsKKworCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQgb2YgWE5TIDUuMi4gICovCisjaWZkZWYgX19VU0VfTUlTQworLyogQ29udmVydCBJbnRlcm5ldCBob3N0IGFkZHJlc3MgZnJvbSBudW1iZXJzLWFuZC1kb3RzIG5vdGF0aW9uIGluIENQCisgICBpbnRvIGJpbmFyeSBkYXRhIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIHRoZSBzdHJ1Y3R1cmUgSU5QLiAgKi8KK2V4dGVybiBpbnQgaW5ldF9hdG9uIChfX2NvbnN0IGNoYXIgKl9fY3AsIHN0cnVjdCBpbl9hZGRyICpfX2lucCkgX19USFJPVzsKKworLyogRm9ybWF0IGEgbmV0d29yayBudW1iZXIgTkVUIGludG8gcHJlc2VudGF0aW9uIGZvcm1hdCBhbmQgcGxhY2UgcmVzdWx0CisgICBpbiBidWZmZXIgc3RhcnRpbmcgYXQgQlVGIHdpdGggbGVuZ3RoIG9mIExFTiBieXRlcy4gICovCitleHRlcm4gY2hhciAqaW5ldF9uZXRhIChpbl9hZGRyX3QgX19uZXQsIGNoYXIgKl9fYnVmLCBzaXplX3QgX19sZW4pIF9fVEhST1c7CisKKy8qIENvbnZlcnQgbmV0d29yayBudW1iZXIgZm9yIGludGVyZmFjZSB0eXBlIEFGIGluIGJ1ZmZlciBzdGFydGluZyBhdAorICAgQ1AgdG8gcHJlc2VudGF0aW9uIGZvcm1hdC4gIFRoZSByZXN1bHQgd2lsbCBzcGVjaWZpeSBCSVRTIGJpdHMgb2YKKyAgIHRoZSBudW1iZXIuICAqLworZXh0ZXJuIGNoYXIgKmluZXRfbmV0X250b3AgKGludCBfX2FmLCBfX2NvbnN0IHZvaWQgKl9fY3AsIGludCBfX2JpdHMsCisJCQkgICAgY2hhciAqX19idWYsIHNpemVfdCBfX2xlbikgX19USFJPVzsKKworLyogQ29udmVydCBuZXR3b3JrIG51bWJlciBmb3IgaW50ZXJmYWNlIHR5cGUgQUYgZnJvbSBwcmVzZW50YXRpb24gaW4KKyAgIGJ1ZmZlciBzdGFydGluZyBhdCBDUCB0byBuZXR3b3JrIGZvcm1hdCBhbmQgc3RvcmUgcmVzdWx0IGludAorICAgYnVmZmVyIHN0YXJ0aW5nIGF0IEJVRiBvZiBzaXplIExFTi4gICovCitleHRlcm4gaW50IGluZXRfbmV0X3B0b24gKGludCBfX2FmLCBfX2NvbnN0IGNoYXIgKl9fY3AsCisJCQkgIHZvaWQgKl9fYnVmLCBzaXplX3QgX19sZW4pIF9fVEhST1c7CisKKy8qIENvbnZlcnQgQVNDSUkgcmVwcmVzZW50YXRpb24gaW4gaGV4YWRlY2ltYWwgZm9ybSBvZiB0aGUgSW50ZXJuZXQKKyAgIGFkZHJlc3MgdG8gYmluYXJ5IGZvcm0gYW5kIHBsYWNlIHJlc3VsdCBpbiBidWZmZXIgb2YgbGVuZ3RoIExFTgorICAgc3RhcnRpbmcgYXQgQlVGLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgaW5ldF9uc2FwX2FkZHIgKF9fY29uc3QgY2hhciAqX19jcCwKKwkJCQkgICAgdW5zaWduZWQgY2hhciAqX19idWYsIGludCBfX2xlbikgX19USFJPVzsKKworLyogQ29udmVydCBpbnRlcm5ldCBhZGRyZXNzIGluIGJpbmFyeSBmb3JtIGluIExFTiBieXRlcyBzdGFydGluZyBhdCBDUAorICAgYSBwcmVzZW50YXRpb24gZm9ybSBhbmQgcGxhY2UgcmVzdWx0IGluIEJVRi4gICovCitleHRlcm4gY2hhciAqaW5ldF9uc2FwX250b2EgKGludCBfX2xlbiwgX19jb25zdCB1bnNpZ25lZCBjaGFyICpfX2NwLAorCQkJICAgICBjaGFyICpfX2J1ZikgX19USFJPVzsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogYXJwYS9pbmV0LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJwYS9uYW1lc2VyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FycGEvbmFtZXNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMmM4MzcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FycGEvbmFtZXNlci5oCkBAIC0wLDAgKzEsNTM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTg5LCAxOTkzCisgKiAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBieSBJbnRlcm5ldCBTeXN0ZW1zIENvbnNvcnRpdW0sIEluYy4gKCJJU0MiKQorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bS4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIElOVEVSTkVUIFNPRlRXQVJFIENPTlNPUlRJVU0gRElTQ0xBSU1TCisgKiBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIElOVEVSTkVUIFNPRlRXQVJFCisgKiBDT05TT1JUSVVNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMKKyAqIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworICogU09GVFdBUkUuCisgKi8KKworLyoKKyAqCSRCSU5ESWQ6IG5hbWVzZXIuaCx2IDguMzcgMjAwMC8wMy8zMCAyMToxNjo0OSB2aXhpZSBFeHAgJAorICovCisKKyNpZm5kZWYgX0FSUEFfTkFNRVNFUl9IXworI2RlZmluZSBfQVJQQV9OQU1FU0VSX0hfCisKKy8qISBcZmlsZSAqLworCisjZGVmaW5lIEJJTkRfNF9DT01QQVQKKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2lmICghZGVmaW5lZChCU0QpKSB8fCAoQlNEIDwgMTk5MzA2KQorIyBpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKworLyolCisgKiBSZXZpc2lvbiBpbmZvcm1hdGlvbi4gIFRoaXMgaXMgdGhlIHJlbGVhc2UgZGF0ZSBpbiBZWVlZTU1ERCBmb3JtYXQuCisgKiBJdCBjYW4gY2hhbmdlIGV2ZXJ5IGRheSBzbyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gd2l0aCBpdCBpcyB1c2UgaXQKKyAqIGluIHByZXByb2Nlc3NvciBjb21tYW5kcyBzdWNoIGFzICIjaWYgKF9fTkFNRVNFUiA+IDE5OTMxMTA0KSIuICBEbyBub3QKKyAqIGNvbXBhcmUgZm9yIGVxdWFsaXR5OyByYXRoZXIsIHVzZSBpdCB0byBkZXRlcm1pbmUgd2hldGhlciB5b3VyIGxpYmJpbmQuYQorICogY29udGFpbnMgYSBuZXcgZW5vdWdoIGxpYi9uYW1lc2VyLyB0byBzdXBwb3J0IHRoZSBmZWF0dXJlIHlvdSBuZWVkLgorICovCisKKyNkZWZpbmUgX19OQU1FU0VSCTE5OTkxMDA2CS8qJTwgTmV3IGludGVyZmFjZSB2ZXJzaW9uIHN0YW1wLiAqLworLyoKKyAqIERlZmluZSBjb25zdGFudHMgYmFzZWQgb24gUkZDIDg4MywgUkZDIDEwMzQsIFJGQyAxMDM1CisgKi8KKyNkZWZpbmUgTlNfUEFDS0VUU1oJNTEyCS8qJTwgZGVmYXVsdCBVRFAgcGFja2V0IHNpemUgKi8KKyNkZWZpbmUgTlNfTUFYRE5BTUUJMTAyNQkvKiU8IG1heGltdW0gZG9tYWluIG5hbWUgKi8KKyNkZWZpbmUgTlNfTUFYTVNHCTY1NTM1CS8qJTwgbWF4aW11bSBtZXNzYWdlIHNpemUgKi8KKyNkZWZpbmUgTlNfTUFYQ0ROQU1FCTI1NQkvKiU8IG1heGltdW0gY29tcHJlc3NlZCBkb21haW4gbmFtZSAqLworI2RlZmluZSBOU19NQVhMQUJFTAk2MwkvKiU8IG1heGltdW0gbGVuZ3RoIG9mIGRvbWFpbiBsYWJlbCAqLworI2RlZmluZSBOU19IRklYRURTWgkxMgkvKiU8ICMvYnl0ZXMgb2YgZml4ZWQgZGF0YSBpbiBoZWFkZXIgKi8KKyNkZWZpbmUgTlNfUUZJWEVEU1oJNAkvKiU8ICMvYnl0ZXMgb2YgZml4ZWQgZGF0YSBpbiBxdWVyeSAqLworI2RlZmluZSBOU19SUkZJWEVEU1oJMTAJLyolPCAjL2J5dGVzIG9mIGZpeGVkIGRhdGEgaW4gciByZWNvcmQgKi8KKyNkZWZpbmUgTlNfSU5UMzJTWgk0CS8qJTwgIy9ieXRlcyBvZiBkYXRhIGluIGEgdV9pbnQzMl90ICovCisjZGVmaW5lIE5TX0lOVDE2U1oJMgkvKiU8ICMvYnl0ZXMgb2YgZGF0YSBpbiBhIHVfaW50MTZfdCAqLworI2RlZmluZSBOU19JTlQ4U1oJMQkvKiU8ICMvYnl0ZXMgb2YgZGF0YSBpbiBhIHVfaW50OF90ICovCisjZGVmaW5lIE5TX0lOQUREUlNaCTQJLyolPCBJUHY0IFRfQSAqLworI2RlZmluZSBOU19JTjZBRERSU1oJMTYJLyolPCBJUHY2IFRfQUFBQSAqLworI2RlZmluZSBOU19DTVBSU0ZMR1MJMHhjMAkvKiU8IEZsYWcgYml0cyBpbmRpY2F0aW5nIG5hbWUgY29tcHJlc3Npb24uICovCisjZGVmaW5lIE5TX0RFRkFVTFRQT1JUCTUzCS8qJTwgRm9yIGJvdGggVENQIGFuZCBVRFAuICovCisvKgorICogVGhlc2UgY2FuIGJlIGV4cGFuZGVkIHdpdGggc3lub255bXMsIGp1c3Qga2VlcCBuc19wYXJzZS5jOm5zX3BhcnNlcmVjb3JkKCkKKyAqIGluIHN5bmNoIHdpdGggaXQuCisgKi8KK3R5cGVkZWYgZW51bSBfX25zX3NlY3QgeworCW5zX3NfcWQgPSAwLAkJLyolPCBRdWVyeTogUXVlc3Rpb24uICovCisJbnNfc196biA9IDAsCQkvKiU8IFVwZGF0ZTogWm9uZS4gKi8KKwluc19zX2FuID0gMSwJCS8qJTwgUXVlcnk6IEFuc3dlci4gKi8KKwluc19zX3ByID0gMSwJCS8qJTwgVXBkYXRlOiBQcmVyZXF1aXNpdGVzLiAqLworCW5zX3NfbnMgPSAyLAkJLyolPCBRdWVyeTogTmFtZSBzZXJ2ZXJzLiAqLworCW5zX3NfdWQgPSAyLAkJLyolPCBVcGRhdGU6IFVwZGF0ZS4gKi8KKwluc19zX2FyID0gMywJCS8qJTwgUXVlcnl8VXBkYXRlOiBBZGRpdGlvbmFsIHJlY29yZHMuICovCisJbnNfc19tYXggPSA0Cit9IG5zX3NlY3Q7CisKKy8qJQorICogVGhpcyBpcyBhIG1lc3NhZ2UgaGFuZGxlLiAgSXQgaXMgY2FsbGVyIGFsbG9jYXRlZCBhbmQgaGFzIG5vIGR5bmFtaWMgZGF0YS4KKyAqIFRoaXMgc3RydWN0dXJlIGlzIGludGVuZGVkIHRvIGJlIG9wYXF1ZSB0byBhbGwgYnV0IG5zX3BhcnNlLmMsIHRodXMgdGhlCisgKiBsZWFkaW5nIF8ncyBvbiB0aGUgbWVtYmVyIG5hbWVzLiAgVXNlIHRoZSBhY2Nlc3NvciBmdW5jdGlvbnMsIG5vdCB0aGUgXydzLgorICovCit0eXBlZGVmIHN0cnVjdCBfX25zX21zZyB7CisJY29uc3QgdV9jaGFyCSpfbXNnLCAqX2VvbTsKKwl1X2ludDE2X3QJX2lkLCBfZmxhZ3MsIF9jb3VudHNbbnNfc19tYXhdOworCWNvbnN0IHVfY2hhcgkqX3NlY3Rpb25zW25zX3NfbWF4XTsKKwluc19zZWN0CQlfc2VjdDsKKwlpbnQJCV9ycm51bTsKKwljb25zdCB1X2NoYXIJKl9tc2dfcHRyOworfSBuc19tc2c7CisKKy8qIFByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgLSBkbyBub3QgdXNlIGZyb20gb3V0c2lkZSBsaWJyYXJ5LiAqLworc3RydWN0IF9uc19mbGFnZGF0YSB7ICBpbnQgbWFzaywgc2hpZnQ7ICB9OworZXh0ZXJuIGNvbnN0IHN0cnVjdCBfbnNfZmxhZ2RhdGEgX25zX2ZsYWdkYXRhW107CisKKy8qIEFjY2Vzc29yIG1hY3JvcyAtIHRoaXMgaXMgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS4gKi8KKworI2RlZmluZSBuc19tc2dfaWQoaGFuZGxlKSAoKGhhbmRsZSkuX2lkICsgMCkKKyNkZWZpbmUgbnNfbXNnX2Jhc2UoaGFuZGxlKSAoKGhhbmRsZSkuX21zZyArIDApCisjZGVmaW5lIG5zX21zZ19lbmQoaGFuZGxlKSAoKGhhbmRsZSkuX2VvbSArIDApCisjZGVmaW5lIG5zX21zZ19zaXplKGhhbmRsZSkgKChoYW5kbGUpLl9lb20gLSAoaGFuZGxlKS5fbXNnKQorI2RlZmluZSBuc19tc2dfY291bnQoaGFuZGxlLCBzZWN0aW9uKSAoKGhhbmRsZSkuX2NvdW50c1tzZWN0aW9uXSArIDApCisKKy8qJQorICogVGhpcyBpcyBhIHBhcnNlZCByZWNvcmQuICBJdCBpcyBjYWxsZXIgYWxsb2NhdGVkIGFuZCBoYXMgbm8gZHluYW1pYyBkYXRhLgorICovCit0eXBlZGVmCXN0cnVjdCBfX25zX3JyIHsKKwljaGFyCQluYW1lW05TX01BWEROQU1FXTsKKwl1X2ludDE2X3QJdHlwZTsKKwl1X2ludDE2X3QJcnJfY2xhc3M7CisJdV9pbnQzMl90CXR0bDsKKwl1X2ludDE2X3QJcmRsZW5ndGg7CisJY29uc3QgdV9jaGFyICoJcmRhdGE7Cit9IG5zX3JyOworCisvKiBBY2Nlc3NvciBtYWNyb3MgLSB0aGlzIGlzIHBhcnQgb2YgdGhlIHB1YmxpYyBpbnRlcmZhY2UuICovCisjZGVmaW5lIG5zX3JyX25hbWUocnIpCSgoKHJyKS5uYW1lWzBdICE9ICdcMCcpID8gKHJyKS5uYW1lIDogIi4iKQorI2RlZmluZSBuc19ycl90eXBlKHJyKQkoKG5zX3R5cGUpKChycikudHlwZSArIDApKQorI2RlZmluZSBuc19ycl9jbGFzcyhycikJKChuc19jbGFzcykoKHJyKS5ycl9jbGFzcyArIDApKQorI2RlZmluZSBuc19ycl90dGwocnIpCSgocnIpLnR0bCArIDApCisjZGVmaW5lIG5zX3JyX3JkbGVuKHJyKQkoKHJyKS5yZGxlbmd0aCArIDApCisjZGVmaW5lIG5zX3JyX3JkYXRhKHJyKQkoKHJyKS5yZGF0YSArIDApCisKKy8qJQorICogVGhlc2UgZG9uJ3QgaGF2ZSB0byBiZSBpbiB0aGUgc2FtZSBvcmRlciBhcyBpbiB0aGUgcGFja2V0IGZsYWdzIHdvcmQsCisgKiBhbmQgdGhleSBjYW4gZXZlbiBvdmVybGFwIGluIHNvbWUgY2FzZXMsIGJ1dCB0aGV5IHdpbGwgbmVlZCB0byBiZSBrZXB0CisgKiBpbiBzeW5jaCB3aXRoIG5zX3BhcnNlLmM6bnNfZmxhZ2RhdGFbXS4KKyAqLwordHlwZWRlZiBlbnVtIF9fbnNfZmxhZyB7CisJbnNfZl9xciwJCS8qJTwgUXVlc3Rpb24vUmVzcG9uc2UuICovCisJbnNfZl9vcGNvZGUsCQkvKiU8IE9wZXJhdGlvbiBjb2RlLiAqLworCW5zX2ZfYWEsCQkvKiU8IEF1dGhvcml0YXRpdmUgQW5zd2VyLiAqLworCW5zX2ZfdGMsCQkvKiU8IFRydW5jYXRpb24gb2NjdXJyZWQuICovCisJbnNfZl9yZCwJCS8qJTwgUmVjdXJzaW9uIERlc2lyZWQuICovCisJbnNfZl9yYSwJCS8qJTwgUmVjdXJzaW9uIEF2YWlsYWJsZS4gKi8KKwluc19mX3osCQkJLyolPCBNQlouICovCisJbnNfZl9hZCwJCS8qJTwgQXV0aGVudGljIERhdGEgKEROU1NFQykuICovCisJbnNfZl9jZCwJCS8qJTwgQ2hlY2tpbmcgRGlzYWJsZWQgKEROU1NFQykuICovCisJbnNfZl9yY29kZSwJCS8qJTwgUmVzcG9uc2UgY29kZS4gKi8KKwluc19mX21heAorfSBuc19mbGFnOworCisvKiUKKyAqIEN1cnJlbnRseSBkZWZpbmVkIG9wY29kZXMuCisgKi8KK3R5cGVkZWYgZW51bSBfX25zX29wY29kZSB7CisJbnNfb19xdWVyeSA9IDAsCQkvKiU8IFN0YW5kYXJkIHF1ZXJ5LiAqLworCW5zX29faXF1ZXJ5ID0gMSwJLyolPCBJbnZlcnNlIHF1ZXJ5IChkZXByZWNhdGVkL3Vuc3VwcG9ydGVkKS4gKi8KKwluc19vX3N0YXR1cyA9IDIsCS8qJTwgTmFtZSBzZXJ2ZXIgc3RhdHVzIHF1ZXJ5ICh1bnN1cHBvcnRlZCkuICovCisJCQkJLyogT3Bjb2RlIDMgaXMgdW5kZWZpbmVkL3Jlc2VydmVkLiAqLworCW5zX29fbm90aWZ5ID0gNCwJLyolPCBab25lIGNoYW5nZSBub3RpZmljYXRpb24uICovCisJbnNfb191cGRhdGUgPSA1LAkvKiU8IFpvbmUgdXBkYXRlIG1lc3NhZ2UuICovCisJbnNfb19tYXggPSA2Cit9IG5zX29wY29kZTsKKworLyolCisgKiBDdXJyZW50bHkgZGVmaW5lZCByZXNwb25zZSBjb2Rlcy4KKyAqLwordHlwZWRlZgllbnVtIF9fbnNfcmNvZGUgeworCW5zX3Jfbm9lcnJvciA9IDAsCS8qJTwgTm8gZXJyb3Igb2NjdXJyZWQuICovCisJbnNfcl9mb3JtZXJyID0gMSwJLyolPCBGb3JtYXQgZXJyb3IuICovCisJbnNfcl9zZXJ2ZmFpbCA9IDIsCS8qJTwgU2VydmVyIGZhaWx1cmUuICovCisJbnNfcl9ueGRvbWFpbiA9IDMsCS8qJTwgTmFtZSBlcnJvci4gKi8KKwluc19yX25vdGltcGwgPSA0LAkvKiU8IFVuaW1wbGVtZW50ZWQuICovCisJbnNfcl9yZWZ1c2VkID0gNSwJLyolPCBPcGVyYXRpb24gcmVmdXNlZC4gKi8KKwkvKiB0aGVzZSBhcmUgZm9yIEJJTkRfVVBEQVRFICovCisJbnNfcl95eGRvbWFpbiA9IDYsCS8qJTwgTmFtZSBleGlzdHMgKi8KKwluc19yX3l4cnJzZXQgPSA3LAkvKiU8IFJSc2V0IGV4aXN0cyAqLworCW5zX3JfbnhycnNldCA9IDgsCS8qJTwgUlJzZXQgZG9lcyBub3QgZXhpc3QgKi8KKwluc19yX25vdGF1dGggPSA5LAkvKiU8IE5vdCBhdXRob3JpdGF0aXZlIGZvciB6b25lICovCisJbnNfcl9ub3R6b25lID0gMTAsCS8qJTwgWm9uZSBvZiByZWNvcmQgZGlmZmVyZW50IGZyb20gem9uZSBzZWN0aW9uICovCisJbnNfcl9tYXggPSAxMSwKKwkvKiBUaGUgZm9sbG93aW5nIGFyZSBFRE5TIGV4dGVuZGVkIHJjb2RlcyAqLworCW5zX3JfYmFkdmVycyA9IDE2LAorCS8qIFRoZSBmb2xsb3dpbmcgYXJlIFRTSUcgZXJyb3JzICovCisJbnNfcl9iYWRzaWcgPSAxNiwKKwluc19yX2JhZGtleSA9IDE3LAorCW5zX3JfYmFkdGltZSA9IDE4Cit9IG5zX3Jjb2RlOworCisvKiBCSU5EX1VQREFURSAqLwordHlwZWRlZiBlbnVtIF9fbnNfdXBkYXRlX29wZXJhdGlvbiB7CisJbnNfdW9wX2RlbGV0ZSA9IDAsCisJbnNfdW9wX2FkZCA9IDEsCisJbnNfdW9wX21heCA9IDIKK30gbnNfdXBkYXRlX29wZXJhdGlvbjsKKworLyolCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBUU0lHIGF1dGhlbnRpY2F0ZWQgbWVzc2FnZXMKKyAqLworc3RydWN0IG5zX3RzaWdfa2V5IHsKKyAgICAgICAgY2hhciBuYW1lW05TX01BWEROQU1FXSwgYWxnW05TX01BWEROQU1FXTsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgICAgICAgaW50IGxlbjsKK307Cit0eXBlZGVmIHN0cnVjdCBuc190c2lnX2tleSBuc190c2lnX2tleTsKKworLyolCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBUU0lHIGF1dGhlbnRpY2F0ZWQgVENQIG1lc3NhZ2VzCisgKi8KK3N0cnVjdCBuc190Y3BfdHNpZ19zdGF0ZSB7CisJaW50IGNvdW50ZXI7CisJc3RydWN0IGRzdF9rZXkgKmtleTsKKwl2b2lkICpjdHg7CisJdW5zaWduZWQgY2hhciBzaWdbTlNfUEFDS0VUU1pdOworCWludCBzaWdsZW47Cit9OwordHlwZWRlZiBzdHJ1Y3QgbnNfdGNwX3RzaWdfc3RhdGUgbnNfdGNwX3RzaWdfc3RhdGU7CisKKyNkZWZpbmUgTlNfVFNJR19GVURHRSAzMDAKKyNkZWZpbmUgTlNfVFNJR19UQ1BfQ09VTlQgMTAwCisjZGVmaW5lIE5TX1RTSUdfQUxHX0hNQUNfTUQ1ICJITUFDLU1ENS5TSUctQUxHLlJFRy5JTlQiCisKKyNkZWZpbmUgTlNfVFNJR19FUlJPUl9OT19UU0lHIC0xMAorI2RlZmluZSBOU19UU0lHX0VSUk9SX05PX1NQQUNFIC0xMQorI2RlZmluZSBOU19UU0lHX0VSUk9SX0ZPUk1FUlIgLTEyCisKKy8qJQorICogQ3VycmVudGx5IGRlZmluZWQgdHlwZSB2YWx1ZXMgZm9yIHJlc291cmNlcyBhbmQgcXVlcmllcy4KKyAqLwordHlwZWRlZiBlbnVtIF9fbnNfdHlwZSB7CisJbnNfdF9pbnZhbGlkID0gMCwJLyolPCBDb29raWUuICovCisJbnNfdF9hID0gMSwJCS8qJTwgSG9zdCBhZGRyZXNzLiAqLworCW5zX3RfbnMgPSAyLAkJLyolPCBBdXRob3JpdGF0aXZlIHNlcnZlci4gKi8KKwluc190X21kID0gMywJCS8qJTwgTWFpbCBkZXN0aW5hdGlvbi4gKi8KKwluc190X21mID0gNCwJCS8qJTwgTWFpbCBmb3J3YXJkZXIuICovCisJbnNfdF9jbmFtZSA9IDUsCQkvKiU8IENhbm9uaWNhbCBuYW1lLiAqLworCW5zX3Rfc29hID0gNiwJCS8qJTwgU3RhcnQgb2YgYXV0aG9yaXR5IHpvbmUuICovCisJbnNfdF9tYiA9IDcsCQkvKiU8IE1haWxib3ggZG9tYWluIG5hbWUuICovCisJbnNfdF9tZyA9IDgsCQkvKiU8IE1haWwgZ3JvdXAgbWVtYmVyLiAqLworCW5zX3RfbXIgPSA5LAkJLyolPCBNYWlsIHJlbmFtZSBuYW1lLiAqLworCW5zX3RfbnVsbCA9IDEwLAkJLyolPCBOdWxsIHJlc291cmNlIHJlY29yZC4gKi8KKwluc190X3drcyA9IDExLAkJLyolPCBXZWxsIGtub3duIHNlcnZpY2UuICovCisJbnNfdF9wdHIgPSAxMiwJCS8qJTwgRG9tYWluIG5hbWUgcG9pbnRlci4gKi8KKwluc190X2hpbmZvID0gMTMsCS8qJTwgSG9zdCBpbmZvcm1hdGlvbi4gKi8KKwluc190X21pbmZvID0gMTQsCS8qJTwgTWFpbGJveCBpbmZvcm1hdGlvbi4gKi8KKwluc190X214ID0gMTUsCQkvKiU8IE1haWwgcm91dGluZyBpbmZvcm1hdGlvbi4gKi8KKwluc190X3R4dCA9IDE2LAkJLyolPCBUZXh0IHN0cmluZ3MuICovCisJbnNfdF9ycCA9IDE3LAkJLyolPCBSZXNwb25zaWJsZSBwZXJzb24uICovCisJbnNfdF9hZnNkYiA9IDE4LAkvKiU8IEFGUyBjZWxsIGRhdGFiYXNlLiAqLworCW5zX3RfeDI1ID0gMTksCQkvKiU8IFhfMjUgY2FsbGluZyBhZGRyZXNzLiAqLworCW5zX3RfaXNkbiA9IDIwLAkJLyolPCBJU0ROIGNhbGxpbmcgYWRkcmVzcy4gKi8KKwluc190X3J0ID0gMjEsCQkvKiU8IFJvdXRlci4gKi8KKwluc190X25zYXAgPSAyMiwJCS8qJTwgTlNBUCBhZGRyZXNzLiAqLworCW5zX3RfbnNhcF9wdHIgPSAyMywJLyolPCBSZXZlcnNlIE5TQVAgbG9va3VwIChkZXByZWNhdGVkKS4gKi8KKwluc190X3NpZyA9IDI0LAkJLyolPCBTZWN1cml0eSBzaWduYXR1cmUuICovCisJbnNfdF9rZXkgPSAyNSwJCS8qJTwgU2VjdXJpdHkga2V5LiAqLworCW5zX3RfcHggPSAyNiwJCS8qJTwgWC40MDAgbWFpbCBtYXBwaW5nLiAqLworCW5zX3RfZ3BvcyA9IDI3LAkJLyolPCBHZW9ncmFwaGljYWwgcG9zaXRpb24gKHdpdGhkcmF3bikuICovCisJbnNfdF9hYWFhID0gMjgsCQkvKiU8IElwNiBBZGRyZXNzLiAqLworCW5zX3RfbG9jID0gMjksCQkvKiU8IExvY2F0aW9uIEluZm9ybWF0aW9uLiAqLworCW5zX3Rfbnh0ID0gMzAsCQkvKiU8IE5leHQgZG9tYWluIChzZWN1cml0eSkuICovCisJbnNfdF9laWQgPSAzMSwJCS8qJTwgRW5kcG9pbnQgaWRlbnRpZmllci4gKi8KKwluc190X25pbWxvYyA9IDMyLAkvKiU8IE5pbXJvZCBMb2NhdG9yLiAqLworCW5zX3Rfc3J2ID0gMzMsCQkvKiU8IFNlcnZlciBTZWxlY3Rpb24uICovCisJbnNfdF9hdG1hID0gMzQsCQkvKiU8IEFUTSBBZGRyZXNzICovCisJbnNfdF9uYXB0ciA9IDM1LAkvKiU8IE5hbWluZyBBdXRob3JpdHkgUG9pblRlUiAqLworCW5zX3Rfa3ggPSAzNiwJCS8qJTwgS2V5IEV4Y2hhbmdlICovCisJbnNfdF9jZXJ0ID0gMzcsCQkvKiU8IENlcnRpZmljYXRpb24gcmVjb3JkICovCisJbnNfdF9hNiA9IDM4LAkJLyolPCBJUHY2IGFkZHJlc3MgKGRlcHJlY2F0ZWQsIHVzZSBuc190X2FhYWEpICovCisJbnNfdF9kbmFtZSA9IDM5LAkvKiU8IE5vbi10ZXJtaW5hbCBETkFNRSAoZm9yIElQdjYpICovCisJbnNfdF9zaW5rID0gNDAsCQkvKiU8IEtpdGNoZW4gc2luayAoZXhwZXJpbWVudGF0bCkgKi8KKwluc190X29wdCA9IDQxLAkJLyolPCBFRE5TMCBvcHRpb24gKG1ldGEtUlIpICovCisJbnNfdF9hcGwgPSA0MiwJCS8qJTwgQWRkcmVzcyBwcmVmaXggbGlzdCAoUkZDMzEyMykgKi8KKwluc190X3RrZXkgPSAyNDksCS8qJTwgVHJhbnNhY3Rpb24ga2V5ICovCisJbnNfdF90c2lnID0gMjUwLAkvKiU8IFRyYW5zYWN0aW9uIHNpZ25hdHVyZS4gKi8KKwluc190X2l4ZnIgPSAyNTEsCS8qJTwgSW5jcmVtZW50YWwgem9uZSB0cmFuc2Zlci4gKi8KKwluc190X2F4ZnIgPSAyNTIsCS8qJTwgVHJhbnNmZXIgem9uZSBvZiBhdXRob3JpdHkuICovCisJbnNfdF9tYWlsYiA9IDI1MywJLyolPCBUcmFuc2ZlciBtYWlsYm94IHJlY29yZHMuICovCisJbnNfdF9tYWlsYSA9IDI1NCwJLyolPCBUcmFuc2ZlciBtYWlsIGFnZW50IHJlY29yZHMuICovCisJbnNfdF9hbnkgPSAyNTUsCQkvKiU8IFdpbGRjYXJkIG1hdGNoLiAqLworCW5zX3RfenhmciA9IDI1NiwJLyolPCBCSU5ELXNwZWNpZmljLCBub25zdGFuZGFyZC4gKi8KKwluc190X21heCA9IDY1NTM2Cit9IG5zX3R5cGU7CisKKy8qIEV4Y2x1c2l2ZWx5IGEgUVRZUEU/IChub3QgYWxzbyBhbiBSVFlQRSkgKi8KKyNkZWZpbmUJbnNfdF9xdF9wKHQpIChuc190X3hmcl9wKHQpIHx8ICh0KSA9PSBuc190X2FueSB8fCBcCisJCSAgICAgICh0KSA9PSBuc190X21haWxiIHx8ICh0KSA9PSBuc190X21haWxhKQorLyogU29tZSBraW5kIG9mIG1ldGEtUlI/IChub3QgYSBRVFlQRSwgYnV0IGFsc28gbm90IGFuIFJUWVBFKSAqLworI2RlZmluZQluc190X21ycl9wKHQpICgodCkgPT0gbnNfdF90c2lnIHx8ICh0KSA9PSBuc190X29wdCkKKy8qIEV4Y2x1c2l2ZWx5IGFuIFJUWVBFPyAobm90IGFsc28gYSBRVFlQRSBvciBhIG1ldGEtUlIpICovCisjZGVmaW5lIG5zX3RfcnJfcCh0KSAoIW5zX3RfcXRfcCh0KSAmJiAhbnNfdF9tcnJfcCh0KSkKKyNkZWZpbmUgbnNfdF91ZHBfcCh0KSAoKHQpICE9IG5zX3RfYXhmciAmJiAodCkgIT0gbnNfdF96eGZyKQorI2RlZmluZSBuc190X3hmcl9wKHQpICgodCkgPT0gbnNfdF9heGZyIHx8ICh0KSA9PSBuc190X2l4ZnIgfHwgXAorCQkgICAgICAgKHQpID09IG5zX3RfenhmcikKKworLyolCisgKiBWYWx1ZXMgZm9yIGNsYXNzIGZpZWxkCisgKi8KK3R5cGVkZWYgZW51bSBfX25zX2NsYXNzIHsKKwluc19jX2ludmFsaWQgPSAwLAkvKiU8IENvb2tpZS4gKi8KKwluc19jX2luID0gMSwJCS8qJTwgSW50ZXJuZXQuICovCisJbnNfY18yID0gMiwJCS8qJTwgdW5hbGxvY2F0ZWQvdW5zdXBwb3J0ZWQuICovCisJbnNfY19jaGFvcyA9IDMsCQkvKiU8IE1JVCBDaGFvcy1uZXQuICovCisJbnNfY19ocyA9IDQsCQkvKiU8IE1JVCBIZXNpb2QuICovCisJLyogUXVlcnkgY2xhc3MgdmFsdWVzIHdoaWNoIGRvIG5vdCBhcHBlYXIgaW4gcmVzb3VyY2UgcmVjb3JkcyAqLworCW5zX2Nfbm9uZSA9IDI1NCwJLyolPCBmb3IgcHJlcmVxLiBzZWN0aW9ucyBpbiB1cGRhdGUgcmVxdWVzdHMgKi8KKwluc19jX2FueSA9IDI1NSwJCS8qJTwgV2lsZGNhcmQgbWF0Y2guICovCisJbnNfY19tYXggPSA2NTUzNgorfSBuc19jbGFzczsKKworLyogRE5TU0VDIGNvbnN0YW50cy4gKi8KKwordHlwZWRlZiBlbnVtIF9fbnNfa2V5X3R5cGVzIHsKKwluc19rdF9yc2EgPSAxLAkJLyolPCBrZXkgdHlwZSBSU0EvTUQ1ICovCisJbnNfa3RfZGggID0gMiwJCS8qJTwgRGlmZmllIEhlbGxtYW4gKi8KKwluc19rdF9kc2EgPSAzLAkJLyolPCBEaWdpdGFsIFNpZ25hdHVyZSBTdGFuZGFyZCAoTUFOREFUT1JZKSAqLworCW5zX2t0X3ByaXZhdGUgPSAyNTQJLyolPCBQcml2YXRlIGtleSB0eXBlIHN0YXJ0cyB3aXRoIE9JRCAqLworfSBuc19rZXlfdHlwZXM7CisKK3R5cGVkZWYgZW51bSBfX25zX2NlcnRfdHlwZXMgeworCWNlcnRfdF9wa2l4ID0gMSwJLyolPCBQS0lYIChYLjUwOXYzKSAqLworCWNlcnRfdF9zcGtpID0gMiwJLyolPCBTUEtJICovCisJY2VydF90X3BncCAgPSAzLAkvKiU8IFBHUCAqLworCWNlcnRfdF91cmwgID0gMjUzLAkvKiU8IFVSTCBwcml2YXRlIHR5cGUgKi8KKwljZXJ0X3Rfb2lkICA9IDI1NAkvKiU8IE9JRCBwcml2YXRlIHR5cGUgKi8KK30gbnNfY2VydF90eXBlczsKKworLyogRmxhZ3MgZmllbGQgb2YgdGhlIEtFWSBSUiByZGF0YS4gKi8KKyNkZWZpbmUJTlNfS0VZX1RZUEVNQVNLCQkweEMwMDAJLyolPCBNYXNrIGZvciAidHlwZSIgYml0cyAqLworI2RlZmluZQlOU19LRVlfVFlQRV9BVVRIX0NPTkYJMHgwMDAwCS8qJTwgS2V5IHVzYWJsZSBmb3IgYm90aCAqLworI2RlZmluZQlOU19LRVlfVFlQRV9DT05GX09OTFkJMHg4MDAwCS8qJTwgS2V5IHVzYWJsZSBmb3IgY29uZmlkZW50aWFsaXR5ICovCisjZGVmaW5lCU5TX0tFWV9UWVBFX0FVVEhfT05MWQkweDQwMDAJLyolPCBLZXkgdXNhYmxlIGZvciBhdXRoZW50aWNhdGlvbiAqLworI2RlZmluZQlOU19LRVlfVFlQRV9OT19LRVkJMHhDMDAwCS8qJTwgTm8ga2V5IHVzYWJsZSBmb3IgZWl0aGVyOyBubyBrZXkgKi8KKy8qIFRoZSB0eXBlIGJpdHMgY2FuIGFsc28gYmUgaW50ZXJwcmV0ZWQgaW5kZXBlbmRlbnRseSwgYXMgc2luZ2xlIGJpdHM6ICovCisjZGVmaW5lCU5TX0tFWV9OT19BVVRICQkweDgwMDAJLyolPCBLZXkgdW51c2FibGUgZm9yIGF1dGhlbnRpY2F0aW9uICovCisjZGVmaW5lCU5TX0tFWV9OT19DT05GCQkweDQwMDAJLyolPCBLZXkgdW51c2FibGUgZm9yIGNvbmZpZGVudGlhbGl0eSAqLworI2RlZmluZQlOU19LRVlfUkVTRVJWRUQyCTB4MjAwMAkvKiBTZWN1cml0eSBpcyAqbWFuZGF0b3J5KiBpZiBiaXQ9MCAqLworI2RlZmluZQlOU19LRVlfRVhURU5ERURfRkxBR1MJMHgxMDAwCS8qJTwgcmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KKyNkZWZpbmUJTlNfS0VZX1JFU0VSVkVENAkweDA4MDAgIC8qJTwgcmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KKyNkZWZpbmUJTlNfS0VZX1JFU0VSVkVENQkweDA0MDAgIC8qJTwgcmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KKyNkZWZpbmUJTlNfS0VZX05BTUVfVFlQRQkweDAzMDAJLyolPCB0aGVzZSBiaXRzIGRldGVybWluZSB0aGUgdHlwZSAqLworI2RlZmluZQlOU19LRVlfTkFNRV9VU0VSCTB4MDAwMAkvKiU8IGtleSBpcyBhc3NvYy4gd2l0aCB1c2VyICovCisjZGVmaW5lCU5TX0tFWV9OQU1FX0VOVElUWQkweDAyMDAJLyolPCBrZXkgaXMgYXNzb2MuIHdpdGggZW50aXR5IGVnIGhvc3QgKi8KKyNkZWZpbmUJTlNfS0VZX05BTUVfWk9ORQkweDAxMDAJLyolPCBrZXkgaXMgem9uZSBrZXkgKi8KKyNkZWZpbmUJTlNfS0VZX05BTUVfUkVTRVJWRUQJMHgwMzAwCS8qJTwgcmVzZXJ2ZWQgbWVhbmluZyAqLworI2RlZmluZQlOU19LRVlfUkVTRVJWRUQ4CTB4MDA4MCAgLyolPCByZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLworI2RlZmluZQlOU19LRVlfUkVTRVJWRUQ5CTB4MDA0MCAgLyolPCByZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLworI2RlZmluZQlOU19LRVlfUkVTRVJWRUQxMAkweDAwMjAgIC8qJTwgcmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KKyNkZWZpbmUJTlNfS0VZX1JFU0VSVkVEMTEJMHgwMDEwICAvKiU8IHJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCisjZGVmaW5lCU5TX0tFWV9TSUdOQVRPUllNQVNLCTB4MDAwRgkvKiU8IGtleSBjYW4gc2lnbiBSUidzIG9mIHNhbWUgbmFtZSAqLworI2RlZmluZQlOU19LRVlfUkVTRVJWRURfQklUTUFTSyAoIE5TX0tFWV9SRVNFUlZFRDIgfCBcCisJCQkJICBOU19LRVlfUkVTRVJWRUQ0IHwgXAorCQkJCSAgTlNfS0VZX1JFU0VSVkVENSB8IFwKKwkJCQkgIE5TX0tFWV9SRVNFUlZFRDggfCBcCisJCQkJICBOU19LRVlfUkVTRVJWRUQ5IHwgXAorCQkJCSAgTlNfS0VZX1JFU0VSVkVEMTAgfCBcCisJCQkJICBOU19LRVlfUkVTRVJWRUQxMSApCisjZGVmaW5lIE5TX0tFWV9SRVNFUlZFRF9CSVRNQVNLMiAweEZGRkYgLyolPCBubyBiaXRzIGRlZmluZWQgaGVyZSAqLworLyogVGhlIEFsZ29yaXRobSBmaWVsZCBvZiB0aGUgS0VZIGFuZCBTSUcgUlIncyBpcyBhbiBpbnRlZ2VyLCB7MS4uMjU0fSAqLworI2RlZmluZQlOU19BTEdfTUQ1UlNBCQkxCS8qJTwgTUQ1IHdpdGggUlNBICovCisjZGVmaW5lCU5TX0FMR19ESCAgICAgICAgICAgICAgIDIJLyolPCBEaWZmaWUgSGVsbG1hbiBLRVkgKi8KKyNkZWZpbmUJTlNfQUxHX0RTQSAgICAgICAgICAgICAgMwkvKiU8IERTQSBLRVkgKi8KKyNkZWZpbmUJTlNfQUxHX0RTUyAgICAgICAgICAgICAgTlNfQUxHX0RTQQorI2RlZmluZQlOU19BTEdfRVhQSVJFX09OTFkJMjUzCS8qJTwgTm8gYWxnLCBubyBzZWN1cml0eSAqLworI2RlZmluZQlOU19BTEdfUFJJVkFURV9PSUQJMjU0CS8qJTwgS2V5IGJlZ2lucyB3aXRoIE9JRCBnaXZpbmcgYWxnICovCisvKiBQcm90b2NvbCB2YWx1ZXMgICovCisvKiB2YWx1ZSAwIGlzIHJlc2VydmVkICovCisjZGVmaW5lIE5TX0tFWV9QUk9UX1RMUyAgICAgICAgIDEKKyNkZWZpbmUgTlNfS0VZX1BST1RfRU1BSUwgICAgICAgMgorI2RlZmluZSBOU19LRVlfUFJPVF9ETlNTRUMgICAgICAzCisjZGVmaW5lIE5TX0tFWV9QUk9UX0lQU0VDICAgICAgIDQKKyNkZWZpbmUgTlNfS0VZX1BST1RfQU5ZCQkyNTUKKworLyogU2lnbmF0dXJlcyAqLworI2RlZmluZQlOU19NRDVSU0FfTUlOX0JJVFMJIDUxMgkvKiU8IFNpemUgb2YgYSBtb2Qgb3IgZXhwIGluIGJpdHMgKi8KKyNkZWZpbmUJTlNfTUQ1UlNBX01BWF9CSVRTCTQwOTYKKwkvKiBUb3RhbCBvZiBiaW5hcnkgbW9kIGFuZCBleHAgKi8KKyNkZWZpbmUJTlNfTUQ1UlNBX01BWF9CWVRFUwkoKE5TX01ENVJTQV9NQVhfQklUUys3LzgpKjIrMykKKwkvKiBNYXggbGVuZ3RoIG9mIHRleHQgc2lnIGJsb2NrICovCisjZGVmaW5lCU5TX01ENVJTQV9NQVhfQkFTRTY0CSgoKE5TX01ENVJTQV9NQVhfQllURVMrMikvMykqNCkKKyNkZWZpbmUgTlNfTUQ1UlNBX01JTl9TSVpFCSgoTlNfTUQ1UlNBX01JTl9CSVRTKzcpLzgpCisjZGVmaW5lIE5TX01ENVJTQV9NQVhfU0laRQkoKE5TX01ENVJTQV9NQVhfQklUUys3KS84KQorCisjZGVmaW5lIE5TX0RTQV9TSUdfU0laRSAgICAgICAgIDQxCisjZGVmaW5lIE5TX0RTQV9NSU5fU0laRSAgICAgICAgIDIxMworI2RlZmluZSBOU19EU0FfTUFYX0JZVEVTICAgICAgICA0MDUKKworLyogT2Zmc2V0cyBpbnRvIFNJRyByZWNvcmQgcmRhdGEgdG8gZmluZCB2YXJpb3VzIHZhbHVlcyAqLworI2RlZmluZQlOU19TSUdfVFlQRQkwCS8qJTwgVHlwZSBmbGFncyAqLworI2RlZmluZQlOU19TSUdfQUxHCTIJLyolPCBBbGdvcml0aG0gKi8KKyNkZWZpbmUJTlNfU0lHX0xBQkVMUwkzCS8qJTwgSG93IG1hbnkgbGFiZWxzIGluIG5hbWUgKi8KKyNkZWZpbmUJTlNfU0lHX09UVEwJNAkvKiU8IE9yaWdpbmFsIFRUTCAqLworI2RlZmluZQlOU19TSUdfRVhQSVIJOAkvKiU8IEV4cGlyYXRpb24gdGltZSAqLworI2RlZmluZQlOU19TSUdfU0lHTkVECTEyCS8qJTwgU2lnbmF0dXJlIHRpbWUgKi8KKyNkZWZpbmUJTlNfU0lHX0ZPT1QJMTYJLyolPCBLZXkgZm9vdHByaW50ICovCisjZGVmaW5lCU5TX1NJR19TSUdORVIJMTgJLyolPCBEb21haW4gbmFtZSBvZiB3aG8gc2lnbmVkIGl0ICovCisvKiBIb3cgUlIgdHlwZXMgYXJlIHJlcHJlc2VudGVkIGFzIGJpdC1mbGFncyBpbiBOWFQgcmVjb3JkcyAqLworI2RlZmluZQlOU19OWFRfQklUUyA4CisjZGVmaW5lCU5TX05YVF9CSVRfU0VUKCAgbixwKSAocFsobikvTlNfTlhUX0JJVFNdIHw9ICAoMHg4MD4+KChuKSVOU19OWFRfQklUUykpKQorI2RlZmluZQlOU19OWFRfQklUX0NMRUFSKG4scCkgKHBbKG4pL05TX05YVF9CSVRTXSAmPSB+KDB4ODA+PigobiklTlNfTlhUX0JJVFMpKSkKKyNkZWZpbmUJTlNfTlhUX0JJVF9JU1NFVChuLHApIChwWyhuKS9OU19OWFRfQklUU10gJiAgICgweDgwPj4oKG4pJU5TX05YVF9CSVRTKSkpCisjZGVmaW5lIE5TX05YVF9NQVggMTI3CisKKy8qJQorICogRUROUzAgZXh0ZW5kZWQgZmxhZ3MgYW5kIG9wdGlvbiBjb2RlcywgaG9zdCBvcmRlci4KKyAqLworI2RlZmluZSBOU19PUFRfRE5TU0VDX09LICAgICAgICAweDgwMDBVCisjZGVmaW5lIE5TX09QVF9OU0lECQkzCisKKy8qJQorICogSW5saW5lIHZlcnNpb25zIG9mIGdldC9wdXQgc2hvcnQvbG9uZy4gIFBvaW50ZXIgaXMgYWR2YW5jZWQuCisgKi8KKyNkZWZpbmUgTlNfR0VUMTYocywgY3ApIGRvIHsgXAorCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqdF9jcCA9IChjb25zdCB1X2NoYXIgKikoY3ApOyBcCisJKHMpID0gKCh1X2ludDE2X3QpdF9jcFswXSA8PCA4KSBcCisJICAgIHwgKCh1X2ludDE2X3QpdF9jcFsxXSkgXAorCSAgICA7IFwKKwkoY3ApICs9IE5TX0lOVDE2U1o7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTlNfR0VUMzIobCwgY3ApIGRvIHsgXAorCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqdF9jcCA9IChjb25zdCB1X2NoYXIgKikoY3ApOyBcCisJKGwpID0gKCh1X2ludDMyX3QpdF9jcFswXSA8PCAyNCkgXAorCSAgICB8ICgodV9pbnQzMl90KXRfY3BbMV0gPDwgMTYpIFwKKwkgICAgfCAoKHVfaW50MzJfdCl0X2NwWzJdIDw8IDgpIFwKKwkgICAgfCAoKHVfaW50MzJfdCl0X2NwWzNdKSBcCisJICAgIDsgXAorCShjcCkgKz0gTlNfSU5UMzJTWjsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBOU19QVVQxNihzLCBjcCkgZG8geyBcCisJcmVnaXN0ZXIgdV9pbnQxNl90IHRfcyA9ICh1X2ludDE2X3QpKHMpOyBcCisJcmVnaXN0ZXIgdV9jaGFyICp0X2NwID0gKHVfY2hhciAqKShjcCk7IFwKKwkqdF9jcCsrID0gdF9zID4+IDg7IFwKKwkqdF9jcCAgID0gdF9zOyBcCisJKGNwKSArPSBOU19JTlQxNlNaOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE5TX1BVVDMyKGwsIGNwKSBkbyB7IFwKKwlyZWdpc3RlciB1X2ludDMyX3QgdF9sID0gKHVfaW50MzJfdCkobCk7IFwKKwlyZWdpc3RlciB1X2NoYXIgKnRfY3AgPSAodV9jaGFyICopKGNwKTsgXAorCSp0X2NwKysgPSB0X2wgPj4gMjQ7IFwKKwkqdF9jcCsrID0gdF9sID4+IDE2OyBcCisJKnRfY3ArKyA9IHRfbCA+PiA4OyBcCisJKnRfY3AgICA9IHRfbDsgXAorCShjcCkgKz0gTlNfSU5UMzJTWjsgXAorfSB3aGlsZSAoMCkKKworX19CRUdJTl9ERUNMUworaW50CQluc19tc2dfZ2V0ZmxhZyAobnNfbXNnLCBpbnQpIF9fVEhST1c7Cit1X2ludAkJbnNfZ2V0MTYgKGNvbnN0IHVfY2hhciAqKSBfX1RIUk9XOwordV9sb25nCQluc19nZXQzMiAoY29uc3QgdV9jaGFyICopIF9fVEhST1c7Cit2b2lkCQluc19wdXQxNiAodV9pbnQsIHVfY2hhciAqKSBfX1RIUk9XOwordm9pZAkJbnNfcHV0MzIgKHVfbG9uZywgdV9jaGFyICopIF9fVEhST1c7CitpbnQJCW5zX2luaXRwYXJzZSAoY29uc3QgdV9jaGFyICosIGludCwgbnNfbXNnICopIF9fVEhST1c7CitpbnQJCW5zX3NraXByciAoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqLCBuc19zZWN0LCBpbnQpCisgICAgIF9fVEhST1c7CitpbnQJCW5zX3BhcnNlcnIgKG5zX21zZyAqLCBuc19zZWN0LCBpbnQsIG5zX3JyICopIF9fVEhST1c7CitpbnQJCW5zX3NwcmludHJyIChjb25zdCBuc19tc2cgKiwgY29uc3QgbnNfcnIgKiwKKwkJCSAgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNoYXIgKiwgc2l6ZV90KQorICAgICBfX1RIUk9XOworaW50CQluc19zcHJpbnRycmYgKGNvbnN0IHVfY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwKKwkJCSAgICAgIG5zX2NsYXNzLCBuc190eXBlLCB1X2xvbmcsIGNvbnN0IHVfY2hhciAqLAorCQkJICAgICAgc2l6ZV90LCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKKwkJCSAgICAgIGNoYXIgKiwgc2l6ZV90KSBfX1RIUk9XOworaW50CQluc19mb3JtYXRfdHRsICh1X2xvbmcsIGNoYXIgKiwgc2l6ZV90KSBfX1RIUk9XOworaW50CQluc19wYXJzZV90dGwgKGNvbnN0IGNoYXIgKiwgdV9sb25nICopIF9fVEhST1c7Cit1X2ludDMyX3QJbnNfZGF0ZXRvc2VjcyAoY29uc3QgY2hhciAqLCBpbnQgKikgX19USFJPVzsKK2ludAkJbnNfbmFtZV9udG9sIChjb25zdCB1X2NoYXIgKiwgdV9jaGFyICosIHNpemVfdCkgX19USFJPVzsKK2ludAkJbnNfbmFtZV9udG9wIChjb25zdCB1X2NoYXIgKiwgY2hhciAqLCBzaXplX3QpIF9fVEhST1c7CitpbnQJCW5zX25hbWVfcHRvbiAoY29uc3QgY2hhciAqLCB1X2NoYXIgKiwgc2l6ZV90KSBfX1RIUk9XOworaW50CQluc19uYW1lX3VucGFjayAoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqLAorCQkJCWNvbnN0IHVfY2hhciAqLCB1X2NoYXIgKiwgc2l6ZV90KSBfX1RIUk9XOworaW50CQluc19uYW1lX3BhY2sgKGNvbnN0IHVfY2hhciAqLCB1X2NoYXIgKiwgaW50LAorCQkJICAgICAgY29uc3QgdV9jaGFyICoqLCBjb25zdCB1X2NoYXIgKiopIF9fVEhST1c7CitpbnQJCW5zX25hbWVfdW5jb21wcmVzcyAoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqLAorCQkJCSAgICBjb25zdCB1X2NoYXIgKiwgY2hhciAqLCBzaXplX3QpIF9fVEhST1c7CitpbnQJCW5zX25hbWVfY29tcHJlc3MgKGNvbnN0IGNoYXIgKiwgdV9jaGFyICosIHNpemVfdCwKKwkJCQkgIGNvbnN0IHVfY2hhciAqKiwgY29uc3QgdV9jaGFyICoqKSBfX1RIUk9XOworaW50CQluc19uYW1lX3NraXAgKGNvbnN0IHVfY2hhciAqKiwgY29uc3QgdV9jaGFyICopIF9fVEhST1c7Cit2b2lkCQluc19uYW1lX3JvbGxiYWNrIChjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICoqLAorCQkJCSAgY29uc3QgdV9jaGFyICoqKSBfX1RIUk9XOworaW50CQluc19zaWduICh1X2NoYXIgKiwgaW50ICosIGludCwgaW50LCB2b2lkICosCisJCQkgY29uc3QgdV9jaGFyICosIGludCwgdV9jaGFyICosIGludCAqLCB0aW1lX3QpIF9fVEhST1c7CitpbnQJCW5zX3NpZ24yICh1X2NoYXIgKiwgaW50ICosIGludCwgaW50LCB2b2lkICosCisJCQkgIGNvbnN0IHVfY2hhciAqLCBpbnQsIHVfY2hhciAqLCBpbnQgKiwgdGltZV90LAorCQkJICB1X2NoYXIgKiosIHVfY2hhciAqKikgX19USFJPVzsKK2ludAkJbnNfc2lnbl90Y3AgKHVfY2hhciAqLCBpbnQgKiwgaW50LCBpbnQsCisJCQkgICAgIG5zX3RjcF90c2lnX3N0YXRlICosIGludCkgX19USFJPVzsKK2ludAkJbnNfc2lnbl90Y3AyICh1X2NoYXIgKiwgaW50ICosIGludCwgaW50LAorCQkJICAgICAgbnNfdGNwX3RzaWdfc3RhdGUgKiwgaW50LAorCQkJICAgICAgdV9jaGFyICoqLCB1X2NoYXIgKiopIF9fVEhST1c7CitpbnQJCW5zX3NpZ25fdGNwX2luaXQgKHZvaWQgKiwgY29uc3QgdV9jaGFyICosIGludCwKKwkJCQkgIG5zX3RjcF90c2lnX3N0YXRlICopIF9fVEhST1c7Cit1X2NoYXIJCSpuc19maW5kX3RzaWcgKHVfY2hhciAqLCB1X2NoYXIgKikgX19USFJPVzsKK2ludAkJbnNfdmVyaWZ5ICh1X2NoYXIgKiwgaW50ICosIHZvaWQgKiwgY29uc3QgdV9jaGFyICosIGludCwKKwkJCSAgIHVfY2hhciAqLCBpbnQgKiwgdGltZV90ICosIGludCkgX19USFJPVzsKK2ludAkJbnNfdmVyaWZ5X3RjcCAodV9jaGFyICosIGludCAqLCBuc190Y3BfdHNpZ19zdGF0ZSAqLCBpbnQpCisgICAgIF9fVEhST1c7CitpbnQJCW5zX3ZlcmlmeV90Y3BfaW5pdCAodm9pZCAqLCBjb25zdCB1X2NoYXIgKiwgaW50LAorCQkJCSAgICBuc190Y3BfdHNpZ19zdGF0ZSAqKSBfX1RIUk9XOworaW50CQluc19zYW1lZG9tYWluIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikgX19USFJPVzsKK2ludAkJbnNfc3ViZG9tYWluIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikgX19USFJPVzsKK2ludAkJbnNfbWFrZWNhbm9uIChjb25zdCBjaGFyICosIGNoYXIgKiwgc2l6ZV90KSBfX1RIUk9XOworaW50CQluc19zYW1lbmFtZSAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopIF9fVEhST1c7CitfX0VORF9ERUNMUworCisjaWZkZWYgQklORF80X0NPTVBBVAorI2luY2x1ZGUgPGFycGEvbmFtZXNlcl9jb21wYXQuaD4KKyNlbmRpZgorCisjZW5kaWYgLyogIV9BUlBBX05BTUVTRVJfSF8gKi8KKy8qISBcZmlsZSAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hcnBhL25hbWVzZXJfY29tcGF0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FycGEvbmFtZXNlcl9jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTljOWU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hcnBhL25hbWVzZXJfY29tcGF0LmgKQEAgLTAsMCArMSwxODcgQEAKKy8qIENvcHlyaWdodCAoYykgMTk4MywgMTk4OQorICogICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qJQorICogICAgICBmcm9tIG5hbWVzZXIuaAk4LjEgKEJlcmtlbGV5KSA2LzIvOTMKKyAqCSRCSU5ESWQ6IG5hbWVzZXJfY29tcGF0LmgsdiA4LjExIDE5OTkvMDEvMDIgMDg6MDA6NTggdml4aWUgRXhwICQKKyAqLworCisjaWZuZGVmIF9BUlBBX05BTUVTRVJfQ09NUEFUXworI2RlZmluZQlfQVJQQV9OQU1FU0VSX0NPTVBBVF8KKworI2RlZmluZQlfX0JJTkQJCTE5OTUwNjIxCS8qJTwgKERFQUQpIGludGVyZmFjZSB2ZXJzaW9uIHN0YW1wLiAqLworCisjaW5jbHVkZSA8ZW5kaWFuLmg+CisKKy8qJQorICogU3RydWN0dXJlIGZvciBxdWVyeSBoZWFkZXIuICBUaGUgb3JkZXIgb2YgdGhlIGZpZWxkcyBpcyBtYWNoaW5lLSBhbmQKKyAqIGNvbXBpbGVyLWRlcGVuZGVudCwgZGVwZW5kaW5nIG9uIHRoZSBieXRlL2JpdCBvcmRlciBhbmQgdGhlIGxheW91dAorICogb2YgYml0IGZpZWxkcy4gIFdlIHVzZSBiaXQgZmllbGRzIG9ubHkgaW4gaW50IHZhcmlhYmxlcywgYXMgdGhpcworICogaXMgYWxsIEFOU0kgcmVxdWlyZXMuICBUaGlzIHJlcXVpcmVzIGEgc29tZXdoYXQgY29uZnVzaW5nIHJlYXJyYW5nZW1lbnQuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkCWlkIDoxNjsJCS8qJTwgcXVlcnkgaWRlbnRpZmljYXRpb24gbnVtYmVyICovCisjaWYgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCisJCQkvKiBmaWVsZHMgaW4gdGhpcmQgYnl0ZSAqLworCXVuc2lnbmVkCXFyOiAxOwkJLyolPCByZXNwb25zZSBmbGFnICovCisJdW5zaWduZWQJb3Bjb2RlOiA0OwkvKiU8IHB1cnBvc2Ugb2YgbWVzc2FnZSAqLworCXVuc2lnbmVkCWFhOiAxOwkJLyolPCBhdXRob3JpdGl2ZSBhbnN3ZXIgKi8KKwl1bnNpZ25lZAl0YzogMTsJCS8qJTwgdHJ1bmNhdGVkIG1lc3NhZ2UgKi8KKwl1bnNpZ25lZAlyZDogMTsJCS8qJTwgcmVjdXJzaW9uIGRlc2lyZWQgKi8KKwkJCS8qIGZpZWxkcyBpbiBmb3VydGggYnl0ZSAqLworCXVuc2lnbmVkCXJhOiAxOwkJLyolPCByZWN1cnNpb24gYXZhaWxhYmxlICovCisJdW5zaWduZWQJdW51c2VkIDoxOwkvKiU8IHVudXNlZCBiaXRzIChNQlogYXMgb2YgNC45LjNhMykgKi8KKwl1bnNpZ25lZAlhZDogMTsJCS8qJTwgYXV0aGVudGljIGRhdGEgZnJvbSBuYW1lZCAqLworCXVuc2lnbmVkCWNkOiAxOwkJLyolPCBjaGVja2luZyBkaXNhYmxlZCBieSByZXNvbHZlciAqLworCXVuc2lnbmVkCXJjb2RlIDo0OwkvKiU8IHJlc3BvbnNlIGNvZGUgKi8KKyNlbmRpZgorI2lmIEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTiB8fCBCWVRFX09SREVSID09IFBEUF9FTkRJQU4KKwkJCS8qIGZpZWxkcyBpbiB0aGlyZCBieXRlICovCisJdW5zaWduZWQJcmQgOjE7CQkvKiU8IHJlY3Vyc2lvbiBkZXNpcmVkICovCisJdW5zaWduZWQJdGMgOjE7CQkvKiU8IHRydW5jYXRlZCBtZXNzYWdlICovCisJdW5zaWduZWQJYWEgOjE7CQkvKiU8IGF1dGhvcml0aXZlIGFuc3dlciAqLworCXVuc2lnbmVkCW9wY29kZSA6NDsJLyolPCBwdXJwb3NlIG9mIG1lc3NhZ2UgKi8KKwl1bnNpZ25lZAlxciA6MTsJCS8qJTwgcmVzcG9uc2UgZmxhZyAqLworCQkJLyogZmllbGRzIGluIGZvdXJ0aCBieXRlICovCisJdW5zaWduZWQJcmNvZGUgOjQ7CS8qJTwgcmVzcG9uc2UgY29kZSAqLworCXVuc2lnbmVkCWNkOiAxOwkJLyolPCBjaGVja2luZyBkaXNhYmxlZCBieSByZXNvbHZlciAqLworCXVuc2lnbmVkCWFkOiAxOwkJLyolPCBhdXRoZW50aWMgZGF0YSBmcm9tIG5hbWVkICovCisJdW5zaWduZWQJdW51c2VkIDoxOwkvKiU8IHVudXNlZCBiaXRzIChNQlogYXMgb2YgNC45LjNhMykgKi8KKwl1bnNpZ25lZAlyYSA6MTsJCS8qJTwgcmVjdXJzaW9uIGF2YWlsYWJsZSAqLworI2VuZGlmCisJCQkvKiByZW1haW5pbmcgYnl0ZXMgKi8KKwl1bnNpZ25lZAlxZGNvdW50IDoxNjsJLyolPCBudW1iZXIgb2YgcXVlc3Rpb24gZW50cmllcyAqLworCXVuc2lnbmVkCWFuY291bnQgOjE2OwkvKiU8IG51bWJlciBvZiBhbnN3ZXIgZW50cmllcyAqLworCXVuc2lnbmVkCW5zY291bnQgOjE2OwkvKiU8IG51bWJlciBvZiBhdXRob3JpdHkgZW50cmllcyAqLworCXVuc2lnbmVkCWFyY291bnQgOjE2OwkvKiU8IG51bWJlciBvZiByZXNvdXJjZSBlbnRyaWVzICovCit9IEhFQURFUjsKKworI2RlZmluZSBQQUNLRVRTWglOU19QQUNLRVRTWgorI2RlZmluZSBNQVhETkFNRQlOU19NQVhETkFNRQorI2RlZmluZSBNQVhDRE5BTUUJTlNfTUFYQ0ROQU1FCisjZGVmaW5lIE1BWExBQkVMCU5TX01BWExBQkVMCisjZGVmaW5lCUhGSVhFRFNaCU5TX0hGSVhFRFNaCisjZGVmaW5lIFFGSVhFRFNaCU5TX1FGSVhFRFNaCisjZGVmaW5lIFJSRklYRURTWglOU19SUkZJWEVEU1oKKyNkZWZpbmUJSU5UMzJTWgkJTlNfSU5UMzJTWgorI2RlZmluZQlJTlQxNlNaCQlOU19JTlQxNlNaCisjZGVmaW5lIElOVDhTWgkJTlNfSU5UOFNaCisjZGVmaW5lCUlOQUREUlNaCU5TX0lOQUREUlNaCisjZGVmaW5lCUlONkFERFJTWglOU19JTjZBRERSU1oKKyNkZWZpbmUJSU5ESVJfTUFTSwlOU19DTVBSU0ZMR1MKKyNkZWZpbmUgTkFNRVNFUlZFUl9QT1JUCU5TX0RFRkFVTFRQT1JUCisKKyNkZWZpbmUgU19aT05FCQluc19zX3puCisjZGVmaW5lIFNfUFJFUkVRCW5zX3NfcHIKKyNkZWZpbmUgU19VUERBVEUJbnNfc191ZAorI2RlZmluZSBTX0FERFQJCW5zX3NfYXIKKworI2RlZmluZSBRVUVSWQkJbnNfb19xdWVyeQorI2RlZmluZSBJUVVFUlkJCW5zX29faXF1ZXJ5CisjZGVmaW5lIFNUQVRVUwkJbnNfb19zdGF0dXMKKyNkZWZpbmUJTlNfTk9USUZZX09QCW5zX29fbm90aWZ5CisjZGVmaW5lCU5TX1VQREFURV9PUAluc19vX3VwZGF0ZQorCisjZGVmaW5lIE5PRVJST1IJCW5zX3Jfbm9lcnJvcgorI2RlZmluZSBGT1JNRVJSCQluc19yX2Zvcm1lcnIKKyNkZWZpbmUgU0VSVkZBSUwJbnNfcl9zZXJ2ZmFpbAorI2RlZmluZSBOWERPTUFJTgluc19yX254ZG9tYWluCisjZGVmaW5lIE5PVElNUAkJbnNfcl9ub3RpbXBsCisjZGVmaW5lIFJFRlVTRUQJCW5zX3JfcmVmdXNlZAorI2RlZmluZSBZWERPTUFJTgluc19yX3l4ZG9tYWluCisjZGVmaW5lIFlYUlJTRVQJCW5zX3JfeXhycnNldAorI2RlZmluZSBOWFJSU0VUCQluc19yX254cnJzZXQKKyNkZWZpbmUgTk9UQVVUSAkJbnNfcl9ub3RhdXRoCisjZGVmaW5lIE5PVFpPTkUJCW5zX3Jfbm90em9uZQorLyojZGVmaW5lIEJBRFNJRwkJbnNfcl9iYWRzaWcqLworLyojZGVmaW5lIEJBREtFWQkJbnNfcl9iYWRrZXkqLworLyojZGVmaW5lIEJBRFRJTUUJCW5zX3JfYmFkdGltZSovCisKKworI2RlZmluZSBERUxFVEUJCW5zX3VvcF9kZWxldGUKKyNkZWZpbmUgQURECQluc191b3BfYWRkCisKKyNkZWZpbmUgVF9BCQluc190X2EKKyNkZWZpbmUgVF9OUwkJbnNfdF9ucworI2RlZmluZSBUX01ECQluc190X21kCisjZGVmaW5lIFRfTUYJCW5zX3RfbWYKKyNkZWZpbmUgVF9DTkFNRQkJbnNfdF9jbmFtZQorI2RlZmluZSBUX1NPQQkJbnNfdF9zb2EKKyNkZWZpbmUgVF9NQgkJbnNfdF9tYgorI2RlZmluZSBUX01HCQluc190X21nCisjZGVmaW5lIFRfTVIJCW5zX3RfbXIKKyNkZWZpbmUgVF9OVUxMCQluc190X251bGwKKyNkZWZpbmUgVF9XS1MJCW5zX3Rfd2tzCisjZGVmaW5lIFRfUFRSCQluc190X3B0cgorI2RlZmluZSBUX0hJTkZPCQluc190X2hpbmZvCisjZGVmaW5lIFRfTUlORk8JCW5zX3RfbWluZm8KKyNkZWZpbmUgVF9NWAkJbnNfdF9teAorI2RlZmluZSBUX1RYVAkJbnNfdF90eHQKKyNkZWZpbmUJVF9SUAkJbnNfdF9ycAorI2RlZmluZSBUX0FGU0RCCQluc190X2Fmc2RiCisjZGVmaW5lIFRfWDI1CQluc190X3gyNQorI2RlZmluZSBUX0lTRE4JCW5zX3RfaXNkbgorI2RlZmluZSBUX1JUCQluc190X3J0CisjZGVmaW5lIFRfTlNBUAkJbnNfdF9uc2FwCisjZGVmaW5lIFRfTlNBUF9QVFIJbnNfdF9uc2FwX3B0cgorI2RlZmluZQlUX1NJRwkJbnNfdF9zaWcKKyNkZWZpbmUJVF9LRVkJCW5zX3Rfa2V5CisjZGVmaW5lCVRfUFgJCW5zX3RfcHgKKyNkZWZpbmUJVF9HUE9TCQluc190X2dwb3MKKyNkZWZpbmUJVF9BQUFBCQluc190X2FhYWEKKyNkZWZpbmUJVF9MT0MJCW5zX3RfbG9jCisjZGVmaW5lCVRfTlhUCQluc190X254dAorI2RlZmluZQlUX0VJRAkJbnNfdF9laWQKKyNkZWZpbmUJVF9OSU1MT0MJbnNfdF9uaW1sb2MKKyNkZWZpbmUJVF9TUlYJCW5zX3Rfc3J2CisjZGVmaW5lIFRfQVRNQQkJbnNfdF9hdG1hCisjZGVmaW5lIFRfTkFQVFIJCW5zX3RfbmFwdHIKKyNkZWZpbmUgVF9BNgkJbnNfdF9hNgorI2RlZmluZSBUX0ROQU1FCQluc190X2RuYW1lCisjZGVmaW5lCVRfVFNJRwkJbnNfdF90c2lnCisjZGVmaW5lCVRfSVhGUgkJbnNfdF9peGZyCisjZGVmaW5lIFRfQVhGUgkJbnNfdF9heGZyCisjZGVmaW5lIFRfTUFJTEIJCW5zX3RfbWFpbGIKKyNkZWZpbmUgVF9NQUlMQQkJbnNfdF9tYWlsYQorI2RlZmluZSBUX0FOWQkJbnNfdF9hbnkKKworI2RlZmluZSBDX0lOCQluc19jX2luCisjZGVmaW5lIENfQ0hBT1MJCW5zX2NfY2hhb3MKKyNkZWZpbmUgQ19IUwkJbnNfY19ocworLyogQklORF9VUERBVEUgKi8KKyNkZWZpbmUgQ19OT05FCQluc19jX25vbmUKKyNkZWZpbmUgQ19BTlkJCW5zX2NfYW55CisKKyNkZWZpbmUJR0VUU0hPUlQJCU5TX0dFVDE2CisjZGVmaW5lCUdFVExPTkcJCQlOU19HRVQzMgorI2RlZmluZQlQVVRTSE9SVAkJTlNfUFVUMTYKKyNkZWZpbmUJUFVUTE9ORwkJCU5TX1BVVDMyCisKKyNlbmRpZiAvKiBfQVJQQV9OQU1FU0VSX0NPTVBBVF8gKi8KKy8qISBcZmlsZSAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hcnBhL3RlbG5ldC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hcnBhL3RlbG5ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NzRjODkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FycGEvdGVsbmV0LmgKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdGVsbmV0LmgJOC4yIChCZXJrZWxleSkgMTIvMTUvOTMKKyAqLworCisjaWZuZGVmIF9BUlBBX1RFTE5FVF9ICisjZGVmaW5lCV9BUlBBX1RFTE5FVF9IIDEKKworLyoKKyAqIERlZmluaXRpb25zIGZvciB0aGUgVEVMTkVUIHByb3RvY29sLgorICovCisjZGVmaW5lCUlBQwkyNTUJCS8qIGludGVycHJldCBhcyBjb21tYW5kOiAqLworI2RlZmluZQlET05UCTI1NAkJLyogeW91IGFyZSBub3QgdG8gdXNlIG9wdGlvbiAqLworI2RlZmluZQlETwkyNTMJCS8qIHBsZWFzZSwgeW91IHVzZSBvcHRpb24gKi8KKyNkZWZpbmUJV09OVAkyNTIJCS8qIEkgd29uJ3QgdXNlIG9wdGlvbiAqLworI2RlZmluZQlXSUxMCTI1MQkJLyogSSB3aWxsIHVzZSBvcHRpb24gKi8KKyNkZWZpbmUJU0IJMjUwCQkvKiBpbnRlcnByZXQgYXMgc3VibmVnb3RpYXRpb24gKi8KKyNkZWZpbmUJR0EJMjQ5CQkvKiB5b3UgbWF5IHJldmVyc2UgdGhlIGxpbmUgKi8KKyNkZWZpbmUJRUwJMjQ4CQkvKiBlcmFzZSB0aGUgY3VycmVudCBsaW5lICovCisjZGVmaW5lCUVDCTI0NwkJLyogZXJhc2UgdGhlIGN1cnJlbnQgY2hhcmFjdGVyICovCisjZGVmaW5lCUFZVAkyNDYJCS8qIGFyZSB5b3UgdGhlcmUgKi8KKyNkZWZpbmUJQU8JMjQ1CQkvKiBhYm9ydCBvdXRwdXQtLWJ1dCBsZXQgcHJvZyBmaW5pc2ggKi8KKyNkZWZpbmUJSVAJMjQ0CQkvKiBpbnRlcnJ1cHQgcHJvY2Vzcy0tcGVybWFuZW50bHkgKi8KKyNkZWZpbmUJQlJFQUsJMjQzCQkvKiBicmVhayAqLworI2RlZmluZQlETQkyNDIJCS8qIGRhdGEgbWFyay0tZm9yIGNvbm5lY3QuIGNsZWFuaW5nICovCisjZGVmaW5lCU5PUAkyNDEJCS8qIG5vcCAqLworI2RlZmluZQlTRQkyNDAJCS8qIGVuZCBzdWIgbmVnb3RpYXRpb24gKi8KKyNkZWZpbmUgRU9SICAgICAyMzkgICAgICAgICAgICAgLyogZW5kIG9mIHJlY29yZCAodHJhbnNwYXJlbnQgbW9kZSkgKi8KKyNkZWZpbmUJQUJPUlQJMjM4CQkvKiBBYm9ydCBwcm9jZXNzICovCisjZGVmaW5lCVNVU1AJMjM3CQkvKiBTdXNwZW5kIHByb2Nlc3MgKi8KKyNkZWZpbmUJeEVPRgkyMzYJCS8qIEVuZCBvZiBmaWxlOiBFT0YgaXMgYWxyZWFkeSB1c2VkLi4uICovCisKKyNkZWZpbmUgU1lOQ0gJMjQyCQkvKiBmb3IgdGVsZnVuYyBjYWxscyAqLworCisjaWZkZWYgVEVMQ01EUworY2hhciAqdGVsY21kc1tdID0geworCSJFT0YiLCAiU1VTUCIsICJBQk9SVCIsICJFT1IiLAorCSJTRSIsICJOT1AiLCAiRE1BUksiLCAiQlJLIiwgIklQIiwgIkFPIiwgIkFZVCIsICJFQyIsCisJIkVMIiwgIkdBIiwgIlNCIiwgIldJTEwiLCAiV09OVCIsICJETyIsICJET05UIiwgIklBQyIsIDAsCit9OworI2Vsc2UKK2V4dGVybiBjaGFyICp0ZWxjbWRzW107CisjZW5kaWYKKworI2RlZmluZQlURUxDTURfRklSU1QJeEVPRgorI2RlZmluZQlURUxDTURfTEFTVAlJQUMKKyNkZWZpbmUJVEVMQ01EX09LKHgpCSgodW5zaWduZWQgaW50KSh4KSA8PSBURUxDTURfTEFTVCAmJiBcCisJCQkgKHVuc2lnbmVkIGludCkoeCkgPj0gVEVMQ01EX0ZJUlNUKQorI2RlZmluZQlURUxDTUQoeCkJdGVsY21kc1soeCktVEVMQ01EX0ZJUlNUXQorCisvKiB0ZWxuZXQgb3B0aW9ucyAqLworI2RlZmluZSBURUxPUFRfQklOQVJZCTAJLyogOC1iaXQgZGF0YSBwYXRoICovCisjZGVmaW5lIFRFTE9QVF9FQ0hPCTEJLyogZWNobyAqLworI2RlZmluZQlURUxPUFRfUkNQCTIJLyogcHJlcGFyZSB0byByZWNvbm5lY3QgKi8KKyNkZWZpbmUJVEVMT1BUX1NHQQkzCS8qIHN1cHByZXNzIGdvIGFoZWFkICovCisjZGVmaW5lCVRFTE9QVF9OQU1TCTQJLyogYXBwcm94aW1hdGUgbWVzc2FnZSBzaXplICovCisjZGVmaW5lCVRFTE9QVF9TVEFUVVMJNQkvKiBnaXZlIHN0YXR1cyAqLworI2RlZmluZQlURUxPUFRfVE0JNgkvKiB0aW1pbmcgbWFyayAqLworI2RlZmluZQlURUxPUFRfUkNURQk3CS8qIHJlbW90ZSBjb250cm9sbGVkIHRyYW5zbWlzc2lvbiBhbmQgZWNobyAqLworI2RlZmluZSBURUxPUFRfTkFPTCAJOAkvKiBuZWdvdGlhdGUgYWJvdXQgb3V0cHV0IGxpbmUgd2lkdGggKi8KKyNkZWZpbmUgVEVMT1BUX05BT1AgCTkJLyogbmVnb3RpYXRlIGFib3V0IG91dHB1dCBwYWdlIHNpemUgKi8KKyNkZWZpbmUgVEVMT1BUX05BT0NSRAkxMAkvKiBuZWdvdGlhdGUgYWJvdXQgQ1IgZGlzcG9zaXRpb24gKi8KKyNkZWZpbmUgVEVMT1BUX05BT0hUUwkxMQkvKiBuZWdvdGlhdGUgYWJvdXQgaG9yaXpvbnRhbCB0YWJzdG9wcyAqLworI2RlZmluZSBURUxPUFRfTkFPSFRECTEyCS8qIG5lZ290aWF0ZSBhYm91dCBob3Jpem9udGFsIHRhYiBkaXNwb3NpdGlvbiAqLworI2RlZmluZSBURUxPUFRfTkFPRkZECTEzCS8qIG5lZ290aWF0ZSBhYm91dCBmb3JtZmVlZCBkaXNwb3NpdGlvbiAqLworI2RlZmluZSBURUxPUFRfTkFPVlRTCTE0CS8qIG5lZ290aWF0ZSBhYm91dCB2ZXJ0aWNhbCB0YWIgc3RvcHMgKi8KKyNkZWZpbmUgVEVMT1BUX05BT1ZURAkxNQkvKiBuZWdvdGlhdGUgYWJvdXQgdmVydGljYWwgdGFiIGRpc3Bvc2l0aW9uICovCisjZGVmaW5lIFRFTE9QVF9OQU9MRkQJMTYJLyogbmVnb3RpYXRlIGFib3V0IG91dHB1dCBMRiBkaXNwb3NpdGlvbiAqLworI2RlZmluZSBURUxPUFRfWEFTQ0lJCTE3CS8qIGV4dGVuZGVkIGFzY2lpIGNoYXJhY3RlciBzZXQgKi8KKyNkZWZpbmUJVEVMT1BUX0xPR09VVAkxOAkvKiBmb3JjZSBsb2dvdXQgKi8KKyNkZWZpbmUJVEVMT1BUX0JNCTE5CS8qIGJ5dGUgbWFjcm8gKi8KKyNkZWZpbmUJVEVMT1BUX0RFVAkyMAkvKiBkYXRhIGVudHJ5IHRlcm1pbmFsICovCisjZGVmaW5lCVRFTE9QVF9TVVBEVVAJMjEJLyogc3VwZHVwIHByb3RvY29sICovCisjZGVmaW5lCVRFTE9QVF9TVVBEVVBPVVRQVVQgMjIJLyogc3VwZHVwIG91dHB1dCAqLworI2RlZmluZQlURUxPUFRfU05ETE9DCTIzCS8qIHNlbmQgbG9jYXRpb24gKi8KKyNkZWZpbmUJVEVMT1BUX1RUWVBFCTI0CS8qIHRlcm1pbmFsIHR5cGUgKi8KKyNkZWZpbmUJVEVMT1BUX0VPUgkyNQkvKiBlbmQgb3IgcmVjb3JkICovCisjZGVmaW5lCVRFTE9QVF9UVUlECTI2CS8qIFRBQ0FDUyB1c2VyIGlkZW50aWZpY2F0aW9uICovCisjZGVmaW5lCVRFTE9QVF9PVVRNUksJMjcJLyogb3V0cHV0IG1hcmtpbmcgKi8KKyNkZWZpbmUJVEVMT1BUX1RUWUxPQwkyOAkvKiB0ZXJtaW5hbCBsb2NhdGlvbiBudW1iZXIgKi8KKyNkZWZpbmUJVEVMT1BUXzMyNzBSRUdJTUUgMjkJLyogMzI3MCByZWdpbWUgKi8KKyNkZWZpbmUJVEVMT1BUX1gzUEFECTMwCS8qIFguMyBQQUQgKi8KKyNkZWZpbmUJVEVMT1BUX05BV1MJMzEJLyogd2luZG93IHNpemUgKi8KKyNkZWZpbmUJVEVMT1BUX1RTUEVFRAkzMgkvKiB0ZXJtaW5hbCBzcGVlZCAqLworI2RlZmluZQlURUxPUFRfTEZMT1cJMzMJLyogcmVtb3RlIGZsb3cgY29udHJvbCAqLworI2RlZmluZSBURUxPUFRfTElORU1PREUJMzQJLyogTGluZW1vZGUgb3B0aW9uICovCisjZGVmaW5lIFRFTE9QVF9YRElTUExPQwkzNQkvKiBYIERpc3BsYXkgTG9jYXRpb24gKi8KKyNkZWZpbmUgVEVMT1BUX09MRF9FTlZJUk9OIDM2CS8qIE9sZCAtIEVudmlyb25tZW50IHZhcmlhYmxlcyAqLworI2RlZmluZQlURUxPUFRfQVVUSEVOVElDQVRJT04gMzcvKiBBdXRoZW50aWNhdGUgKi8KKyNkZWZpbmUJVEVMT1BUX0VOQ1JZUFQJMzgJLyogRW5jcnlwdGlvbiBvcHRpb24gKi8KKyNkZWZpbmUgVEVMT1BUX05FV19FTlZJUk9OIDM5CS8qIE5ldyAtIEVudmlyb25tZW50IHZhcmlhYmxlcyAqLworI2RlZmluZQlURUxPUFRfRVhPUEwJMjU1CS8qIGV4dGVuZGVkLW9wdGlvbnMtbGlzdCAqLworCisKKyNkZWZpbmUJTlRFTE9QVFMJKDErVEVMT1BUX05FV19FTlZJUk9OKQorI2lmZGVmIFRFTE9QVFMKK2NoYXIgKnRlbG9wdHNbTlRFTE9QVFMrMV0gPSB7CisJIkJJTkFSWSIsICJFQ0hPIiwgIlJDUCIsICJTVVBQUkVTUyBHTyBBSEVBRCIsICJOQU1FIiwKKwkiU1RBVFVTIiwgIlRJTUlORyBNQVJLIiwgIlJDVEUiLCAiTkFPTCIsICJOQU9QIiwKKwkiTkFPQ1JEIiwgIk5BT0hUUyIsICJOQU9IVEQiLCAiTkFPRkZEIiwgIk5BT1ZUUyIsCisJIk5BT1ZURCIsICJOQU9MRkQiLCAiRVhURU5EIEFTQ0lJIiwgIkxPR09VVCIsICJCWVRFIE1BQ1JPIiwKKwkiREFUQSBFTlRSWSBURVJNSU5BTCIsICJTVVBEVVAiLCAiU1VQRFVQIE9VVFBVVCIsCisJIlNFTkQgTE9DQVRJT04iLCAiVEVSTUlOQUwgVFlQRSIsICJFTkQgT0YgUkVDT1JEIiwKKwkiVEFDQUNTIFVJRCIsICJPVVRQVVQgTUFSS0lORyIsICJUVFlMT0MiLAorCSIzMjcwIFJFR0lNRSIsICJYLjMgUEFEIiwgIk5BV1MiLCAiVFNQRUVEIiwgIkxGTE9XIiwKKwkiTElORU1PREUiLCAiWERJU1BMT0MiLCAiT0xELUVOVklST04iLCAiQVVUSEVOVElDQVRJT04iLAorCSJFTkNSWVBUIiwgIk5FVy1FTlZJUk9OIiwKKwkwLAorfTsKKyNkZWZpbmUJVEVMT1BUX0ZJUlNUCVRFTE9QVF9CSU5BUlkKKyNkZWZpbmUJVEVMT1BUX0xBU1QJVEVMT1BUX05FV19FTlZJUk9OCisjZGVmaW5lCVRFTE9QVF9PSyh4KQkoKHVuc2lnbmVkIGludCkoeCkgPD0gVEVMT1BUX0xBU1QpCisjZGVmaW5lCVRFTE9QVCh4KQl0ZWxvcHRzWyh4KS1URUxPUFRfRklSU1RdCisjZW5kaWYKKworLyogc3ViLW9wdGlvbiBxdWFsaWZpZXJzICovCisjZGVmaW5lCVRFTFFVQUxfSVMJMAkvKiBvcHRpb24gaXMuLi4gKi8KKyNkZWZpbmUJVEVMUVVBTF9TRU5ECTEJLyogc2VuZCBvcHRpb24gKi8KKyNkZWZpbmUJVEVMUVVBTF9JTkZPCTIJLyogRU5WSVJPTjogaW5mb3JtYXRpb25hbCB2ZXJzaW9uIG9mIElTICovCisjZGVmaW5lCVRFTFFVQUxfUkVQTFkJMgkvKiBBVVRIRU5USUNBVElPTjogY2xpZW50IHZlcnNpb24gb2YgSVMgKi8KKyNkZWZpbmUJVEVMUVVBTF9OQU1FCTMJLyogQVVUSEVOVElDQVRJT046IGNsaWVudCB2ZXJzaW9uIG9mIElTICovCisKKyNkZWZpbmUJTEZMT1dfT0ZGCQkwCS8qIERpc2FibGUgcmVtb3RlIGZsb3cgY29udHJvbCAqLworI2RlZmluZQlMRkxPV19PTgkJMQkvKiBFbmFibGUgcmVtb3RlIGZsb3cgY29udHJvbCAqLworI2RlZmluZQlMRkxPV19SRVNUQVJUX0FOWQkyCS8qIFJlc3RhcnQgb3V0cHV0IG9uIGFueSBjaGFyICovCisjZGVmaW5lCUxGTE9XX1JFU1RBUlRfWE9OCTMJLyogUmVzdGFydCBvdXRwdXQgb25seSBvbiBYT04gKi8KKworLyoKKyAqIExJTkVNT0RFIHN1Ym9wdGlvbnMKKyAqLworCisjZGVmaW5lCUxNX01PREUJCTEKKyNkZWZpbmUJTE1fRk9SV0FSRE1BU0sJMgorI2RlZmluZQlMTV9TTEMJCTMKKworI2RlZmluZQlNT0RFX0VESVQJMHgwMQorI2RlZmluZQlNT0RFX1RSQVBTSUcJMHgwMgorI2RlZmluZQlNT0RFX0FDSwkweDA0CisjZGVmaW5lIE1PREVfU09GVF9UQUIJMHgwOAorI2RlZmluZSBNT0RFX0xJVF9FQ0hPCTB4MTAKKworI2RlZmluZQlNT0RFX01BU0sJMHgxZgorCisvKiBOb3QgcGFydCBvZiBwcm90b2NvbCwgYnV0IG5lZWRlZCB0byBzaW1wbGlmeSB0aGluZ3MuLi4gKi8KKyNkZWZpbmUgTU9ERV9GTE9XCQkweDAxMDAKKyNkZWZpbmUgTU9ERV9FQ0hPCQkweDAyMDAKKyNkZWZpbmUgTU9ERV9JTkJJTgkJMHgwNDAwCisjZGVmaW5lIE1PREVfT1VUQklOCQkweDA4MDAKKyNkZWZpbmUgTU9ERV9GT1JDRQkJMHgxMDAwCisKKyNkZWZpbmUJU0xDX1NZTkNICTEKKyNkZWZpbmUJU0xDX0JSSwkJMgorI2RlZmluZQlTTENfSVAJCTMKKyNkZWZpbmUJU0xDX0FPCQk0CisjZGVmaW5lCVNMQ19BWVQJCTUKKyNkZWZpbmUJU0xDX0VPUgkJNgorI2RlZmluZQlTTENfQUJPUlQJNworI2RlZmluZQlTTENfRU9GCQk4CisjZGVmaW5lCVNMQ19TVVNQCTkKKyNkZWZpbmUJU0xDX0VDCQkxMAorI2RlZmluZQlTTENfRUwJCTExCisjZGVmaW5lCVNMQ19FVwkJMTIKKyNkZWZpbmUJU0xDX1JQCQkxMworI2RlZmluZQlTTENfTE5FWFQJMTQKKyNkZWZpbmUJU0xDX1hPTgkJMTUKKyNkZWZpbmUJU0xDX1hPRkYJMTYKKyNkZWZpbmUJU0xDX0ZPUlcxCTE3CisjZGVmaW5lCVNMQ19GT1JXMgkxOAorCisjZGVmaW5lCU5TTEMJCTE4CisKKy8qCisgKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdlIGRlZmluZSBTTENfTkFNRVMgdG8gYmUgdGhlCisgKiBsaXN0IG9mIG5hbWVzIGlmIFNMQ19OQU1FUyBpcyBub3QgZGVmaW5lZC4KKyAqLworI2RlZmluZQlTTENfTkFNRUxJU1QJIjAiLCAiU1lOQ0giLCAiQlJLIiwgIklQIiwgIkFPIiwgIkFZVCIsICJFT1IiLCBcCisJCQkiQUJPUlQiLCAiRU9GIiwgIlNVU1AiLCAiRUMiLCAiRUwiLCAiRVciLCAiUlAiLCBcCisJCQkiTE5FWFQiLCAiWE9OIiwgIlhPRkYiLCAiRk9SVzEiLCAiRk9SVzIiLCAwLAorI2lmZGVmCVNMQ19OQU1FUworY2hhciAqc2xjX25hbWVzW10gPSB7CisJU0xDX05BTUVMSVNUCit9OworI2Vsc2UKK2V4dGVybiBjaGFyICpzbGNfbmFtZXNbXTsKKyNkZWZpbmUJU0xDX05BTUVTIFNMQ19OQU1FTElTVAorI2VuZGlmCisKKyNkZWZpbmUJU0xDX05BTUVfT0soeCkJKCh1bnNpZ25lZCBpbnQpKHgpIDw9IE5TTEMpCisjZGVmaW5lIFNMQ19OQU1FKHgpCXNsY19uYW1lc1t4XQorCisjZGVmaW5lCVNMQ19OT1NVUFBPUlQJMAorI2RlZmluZQlTTENfQ0FOVENIQU5HRQkxCisjZGVmaW5lCVNMQ19WQVJJQUJMRQkyCisjZGVmaW5lCVNMQ19ERUZBVUxUCTMKKyNkZWZpbmUJU0xDX0xFVkVMQklUUwkweDAzCisKKyNkZWZpbmUJU0xDX0ZVTkMJMAorI2RlZmluZQlTTENfRkxBR1MJMQorI2RlZmluZQlTTENfVkFMVUUJMgorCisjZGVmaW5lCVNMQ19BQ0sJCTB4ODAKKyNkZWZpbmUJU0xDX0ZMVVNISU4JMHg0MAorI2RlZmluZQlTTENfRkxVU0hPVVQJMHgyMAorCisjZGVmaW5lCU9MRF9FTlZfVkFSCTEKKyNkZWZpbmUJT0xEX0VOVl9WQUxVRQkwCisjZGVmaW5lCU5FV19FTlZfVkFSCTAKKyNkZWZpbmUJTkVXX0VOVl9WQUxVRQkxCisjZGVmaW5lCUVOVl9FU0MJCTIKKyNkZWZpbmUgRU5WX1VTRVJWQVIJMworCisvKgorICogQVVUSEVOVElDQVRJT04gc3Vib3B0aW9ucworICovCisKKy8qCisgKiBXaG8gaXMgYXV0aGVudGljYXRpbmcgd2hvIC4uLgorICovCisjZGVmaW5lCUFVVEhfV0hPX0NMSUVOVAkJMAkvKiBDbGllbnQgYXV0aGVudGljYXRpbmcgc2VydmVyICovCisjZGVmaW5lCUFVVEhfV0hPX1NFUlZFUgkJMQkvKiBTZXJ2ZXIgYXV0aGVudGljYXRpbmcgY2xpZW50ICovCisjZGVmaW5lCUFVVEhfV0hPX01BU0sJCTEKKworLyoKKyAqIGFtb3VudCBvZiBhdXRoZW50aWNhdGlvbiBkb25lCisgKi8KKyNkZWZpbmUJQVVUSF9IT1dfT05FX1dBWQkwCisjZGVmaW5lCUFVVEhfSE9XX01VVFVBTAkJMgorI2RlZmluZQlBVVRIX0hPV19NQVNLCQkyCisKKyNkZWZpbmUJQVVUSFRZUEVfTlVMTAkJMAorI2RlZmluZQlBVVRIVFlQRV9LRVJCRVJPU19WNAkxCisjZGVmaW5lCUFVVEhUWVBFX0tFUkJFUk9TX1Y1CTIKKyNkZWZpbmUJQVVUSFRZUEVfU1BYCQkzCisjZGVmaW5lCUFVVEhUWVBFX01JTksJCTQKKyNkZWZpbmUJQVVUSFRZUEVfQ05UCQk1CisKKyNkZWZpbmUJQVVUSFRZUEVfVEVTVAkJOTkKKworI2lmZGVmCUFVVEhfTkFNRVMKK2NoYXIgKmF1dGh0eXBlX25hbWVzW10gPSB7CisJIk5VTEwiLCAiS0VSQkVST1NfVjQiLCAiS0VSQkVST1NfVjUiLCAiU1BYIiwgIk1JTksiLCAwLAorfTsKKyNlbHNlCitleHRlcm4gY2hhciAqYXV0aHR5cGVfbmFtZXNbXTsKKyNlbmRpZgorCisjZGVmaW5lCUFVVEhUWVBFX05BTUVfT0soeCkJKCh1bnNpZ25lZCBpbnQpKHgpIDwgQVVUSFRZUEVfQ05UKQorI2RlZmluZQlBVVRIVFlQRV9OQU1FKHgpCWF1dGh0eXBlX25hbWVzW3hdCisKKy8qCisgKiBFTkNSWVBUaW9uIHN1Ym9wdGlvbnMKKyAqLworI2RlZmluZQlFTkNSWVBUX0lTCQkwCS8qIEkgcGljayBlbmNyeXB0aW9uIHR5cGUgLi4uICovCisjZGVmaW5lCUVOQ1JZUFRfU1VQUE9SVAkJMQkvKiBJIHN1cHBvcnQgZW5jcnlwdGlvbiB0eXBlcyAuLi4gKi8KKyNkZWZpbmUJRU5DUllQVF9SRVBMWQkJMgkvKiBJbml0aWFsIHNldHVwIHJlc3BvbnNlICovCisjZGVmaW5lCUVOQ1JZUFRfU1RBUlQJCTMJLyogQW0gc3RhcnRpbmcgdG8gc2VuZCBlbmNyeXB0ZWQgKi8KKyNkZWZpbmUJRU5DUllQVF9FTkQJCTQJLyogQW0gZW5kaW5nIGVuY3J5cHRlZCAqLworI2RlZmluZQlFTkNSWVBUX1JFUVNUQVJUCTUJLyogUmVxdWVzdCB5b3Ugc3RhcnQgZW5jcnlwdGluZyAqLworI2RlZmluZQlFTkNSWVBUX1JFUUVORAkJNgkvKiBSZXF1ZXN0IHlvdSBzZW5kIGVuY3J5cHRpbmcgKi8KKyNkZWZpbmUJRU5DUllQVF9FTkNfS0VZSUQJNworI2RlZmluZQlFTkNSWVBUX0RFQ19LRVlJRAk4CisjZGVmaW5lCUVOQ1JZUFRfQ05UCQk5CisKKyNkZWZpbmUJRU5DVFlQRV9BTlkJCTAKKyNkZWZpbmUJRU5DVFlQRV9ERVNfQ0ZCNjQJMQorI2RlZmluZQlFTkNUWVBFX0RFU19PRkI2NAkyCisjZGVmaW5lCUVOQ1RZUEVfQ05UCQkzCisKKyNpZmRlZglFTkNSWVBUX05BTUVTCitjaGFyICplbmNyeXB0X25hbWVzW10gPSB7CisJIklTIiwgIlNVUFBPUlQiLCAiUkVQTFkiLCAiU1RBUlQiLCAiRU5EIiwKKwkiUkVRVUVTVC1TVEFSVCIsICJSRVFVRVNULUVORCIsICJFTkMtS0VZSUQiLCAiREVDLUtFWUlEIiwKKwkwLAorfTsKK2NoYXIgKmVuY3R5cGVfbmFtZXNbXSA9IHsKKwkiQU5ZIiwgIkRFU19DRkI2NCIsICAiREVTX09GQjY0IiwgIDAsCit9OworI2Vsc2UKK2V4dGVybiBjaGFyICplbmNyeXB0X25hbWVzW107CitleHRlcm4gY2hhciAqZW5jdHlwZV9uYW1lc1tdOworI2VuZGlmCisKKworI2RlZmluZQlFTkNSWVBUX05BTUVfT0soeCkJKCh1bnNpZ25lZCBpbnQpKHgpIDwgRU5DUllQVF9DTlQpCisjZGVmaW5lCUVOQ1JZUFRfTkFNRSh4KQkJZW5jcnlwdF9uYW1lc1t4XQorCisjZGVmaW5lCUVOQ1RZUEVfTkFNRV9PSyh4KQkoKHVuc2lnbmVkIGludCkoeCkgPCBFTkNUWVBFX0NOVCkKKyNkZWZpbmUJRU5DVFlQRV9OQU1FKHgpCQllbmN0eXBlX25hbWVzW3hdCisKKyNlbmRpZiAvKiBhcnBhL3RlbG5ldC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FycGEvdGZ0cC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hcnBhL3RmdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWIwNTU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hcnBhL3RmdHAuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXRmdHAuaAk4LjEgKEJlcmtlbGV5KSA2LzIvOTMKKyAqLworCisjaWZuZGVmIF9BUlBBX1RGVFBfSAorI2RlZmluZQlfQVJQQV9URlRQX0ggMQorCisvKgorICogVHJpdmlhbCBGaWxlIFRyYW5zZmVyIFByb3RvY29sIChJRU4tMTMzKQorICovCisjZGVmaW5lCVNFR1NJWkUJCTUxMgkJLyogZGF0YSBzZWdtZW50IHNpemUgKi8KKworLyoKKyAqIFBhY2tldCB0eXBlcy4KKyAqLworI2RlZmluZQlSUlEJMDEJCQkJLyogcmVhZCByZXF1ZXN0ICovCisjZGVmaW5lCVdSUQkwMgkJCQkvKiB3cml0ZSByZXF1ZXN0ICovCisjZGVmaW5lCURBVEEJMDMJCQkJLyogZGF0YSBwYWNrZXQgKi8KKyNkZWZpbmUJQUNLCTA0CQkJCS8qIGFja25vd2xlZGdlbWVudCAqLworI2RlZmluZQlFUlJPUgkwNQkJCQkvKiBlcnJvciBjb2RlICovCisKK3N0cnVjdAl0ZnRwaGRyIHsKKwlzaG9ydAl0aF9vcGNvZGU7CQkJLyogcGFja2V0IHR5cGUgKi8KKwl1bmlvbiB7CisJCXVuc2lnbmVkIHNob3J0CXR1X2Jsb2NrOwkvKiBibG9jayAjICovCisJCXNob3J0CXR1X2NvZGU7CQkvKiBlcnJvciBjb2RlICovCisJCWNoYXIJdHVfc3R1ZmZbMV07CQkvKiByZXF1ZXN0IHBhY2tldCBzdHVmZiAqLworCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSB0aF91OworCWNoYXIJdGhfZGF0YVsxXTsJCQkvKiBkYXRhIG9yIGVycm9yIHN0cmluZyAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisjZGVmaW5lCXRoX2Jsb2NrCXRoX3UudHVfYmxvY2sKKyNkZWZpbmUJdGhfY29kZQkJdGhfdS50dV9jb2RlCisjZGVmaW5lCXRoX3N0dWZmCXRoX3UudHVfc3R1ZmYKKyNkZWZpbmUJdGhfbXNnCQl0aF9kYXRhCisKKy8qCisgKiBFcnJvciBjb2Rlcy4KKyAqLworI2RlZmluZQlFVU5ERUYJCTAJCS8qIG5vdCBkZWZpbmVkICovCisjZGVmaW5lCUVOT1RGT1VORAkxCQkvKiBmaWxlIG5vdCBmb3VuZCAqLworI2RlZmluZQlFQUNDRVNTCQkyCQkvKiBhY2Nlc3MgdmlvbGF0aW9uICovCisjZGVmaW5lCUVOT1NQQUNFCTMJCS8qIGRpc2sgZnVsbCBvciBhbGxvY2F0aW9uIGV4Y2VlZGVkICovCisjZGVmaW5lCUVCQURPUAkJNAkJLyogaWxsZWdhbCBURlRQIG9wZXJhdGlvbiAqLworI2RlZmluZQlFQkFESUQJCTUJCS8qIHVua25vd24gdHJhbnNmZXIgSUQgKi8KKyNkZWZpbmUJRUVYSVNUUwkJNgkJLyogZmlsZSBhbHJlYWR5IGV4aXN0cyAqLworI2RlZmluZQlFTk9VU0VSCQk3CQkvKiBubyBzdWNoIHVzZXIgKi8KKworI2VuZGlmIC8qIGFycGEvdGZ0cC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2F1eHZlYy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTk1NzNiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9hdXh2ZWMuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX19BU01fR0VORVJJQ19BVVhWRUNfSAorI2RlZmluZSBfX0FTTV9HRU5FUklDX0FVWFZFQ19ICisvKgorICogTm90IGFsbCBhcmNoaXRlY3R1cmVzIG5lZWQgdGhlaXIgb3duIGF1eHZlYy5oLCB0aGUgbW9zdAorICogY29tbW9uIGRlZmluaXRpb25zIGFyZSBhbHJlYWR5IGluIGxpbnV4L2F1eHZlYy5oLgorICovCisKKyNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX0FVWFZFQ19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2JpdHNwZXJsb25nLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2JpdHNwZXJsb25nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgzMmMzYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvYml0c3BlcmxvbmcuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfQklUU19QRVJfTE9ORworI2RlZmluZSBfX0FTTV9HRU5FUklDX0JJVFNfUEVSX0xPTkcKKworLyoKKyAqIFRoZXJlIHNlZW1zIHRvIGJlIG5vIHdheSBvZiBkZXRlY3RpbmcgdGhpcyBhdXRvbWF0aWNhbGx5IGZyb20gdXNlcgorICogc3BhY2UsIHNvIDY0IGJpdCBhcmNoaXRlY3R1cmVzIHNob3VsZCBvdmVycmlkZSB0aGlzIGluIHRoZWlyCisgKiBiaXRzcGVybG9uZy5oLiBJbiBwYXJ0aWN1bGFyLCBhbiBhcmNoaXRlY3R1cmUgdGhhdCBzdXBwb3J0cworICogYm90aCAzMiBhbmQgNjQgYml0IHVzZXIgc3BhY2UgbXVzdCBub3QgcmVseSBvbiBDT05GSUdfNjRCSVQKKyAqIHRvIGRlY2lkZSBpdCwgYnV0IHJhdGhlciBjaGVjayBhIGNvbXBpbGVyIHByb3ZpZGVkIG1hY3JvLgorICovCisjaWZuZGVmIF9fQklUU19QRVJfTE9ORworI2RlZmluZSBfX0JJVFNfUEVSX0xPTkcgMzIKKyNlbmRpZgorCisjZW5kaWYgLyogX19BU01fR0VORVJJQ19CSVRTX1BFUl9MT05HICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2Vycm5vLWJhc2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvZXJybm8tYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MTE1OTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2Vycm5vLWJhc2UuaApAQCAtMCwwICsxLDM5IEBACisjaWZuZGVmIF9BU01fR0VORVJJQ19FUlJOT19CQVNFX0gKKyNkZWZpbmUgX0FTTV9HRU5FUklDX0VSUk5PX0JBU0VfSAorCisjZGVmaW5lCUVQRVJNCQkgMQkvKiBPcGVyYXRpb24gbm90IHBlcm1pdHRlZCAqLworI2RlZmluZQlFTk9FTlQJCSAyCS8qIE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgKi8KKyNkZWZpbmUJRVNSQ0gJCSAzCS8qIE5vIHN1Y2ggcHJvY2VzcyAqLworI2RlZmluZQlFSU5UUgkJIDQJLyogSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwgKi8KKyNkZWZpbmUJRUlPCQkgNQkvKiBJL08gZXJyb3IgKi8KKyNkZWZpbmUJRU5YSU8JCSA2CS8qIE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MgKi8KKyNkZWZpbmUJRTJCSUcJCSA3CS8qIEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcgKi8KKyNkZWZpbmUJRU5PRVhFQwkJIDgJLyogRXhlYyBmb3JtYXQgZXJyb3IgKi8KKyNkZWZpbmUJRUJBREYJCSA5CS8qIEJhZCBmaWxlIG51bWJlciAqLworI2RlZmluZQlFQ0hJTEQJCTEwCS8qIE5vIGNoaWxkIHByb2Nlc3NlcyAqLworI2RlZmluZQlFQUdBSU4JCTExCS8qIFRyeSBhZ2FpbiAqLworI2RlZmluZQlFTk9NRU0JCTEyCS8qIE91dCBvZiBtZW1vcnkgKi8KKyNkZWZpbmUJRUFDQ0VTCQkxMwkvKiBQZXJtaXNzaW9uIGRlbmllZCAqLworI2RlZmluZQlFRkFVTFQJCTE0CS8qIEJhZCBhZGRyZXNzICovCisjZGVmaW5lCUVOT1RCTEsJCTE1CS8qIEJsb2NrIGRldmljZSByZXF1aXJlZCAqLworI2RlZmluZQlFQlVTWQkJMTYJLyogRGV2aWNlIG9yIHJlc291cmNlIGJ1c3kgKi8KKyNkZWZpbmUJRUVYSVNUCQkxNwkvKiBGaWxlIGV4aXN0cyAqLworI2RlZmluZQlFWERFVgkJMTgJLyogQ3Jvc3MtZGV2aWNlIGxpbmsgKi8KKyNkZWZpbmUJRU5PREVWCQkxOQkvKiBObyBzdWNoIGRldmljZSAqLworI2RlZmluZQlFTk9URElSCQkyMAkvKiBOb3QgYSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUJRUlTRElSCQkyMQkvKiBJcyBhIGRpcmVjdG9yeSAqLworI2RlZmluZQlFSU5WQUwJCTIyCS8qIEludmFsaWQgYXJndW1lbnQgKi8KKyNkZWZpbmUJRU5GSUxFCQkyMwkvKiBGaWxlIHRhYmxlIG92ZXJmbG93ICovCisjZGVmaW5lCUVNRklMRQkJMjQJLyogVG9vIG1hbnkgb3BlbiBmaWxlcyAqLworI2RlZmluZQlFTk9UVFkJCTI1CS8qIE5vdCBhIHR5cGV3cml0ZXIgKi8KKyNkZWZpbmUJRVRYVEJTWQkJMjYJLyogVGV4dCBmaWxlIGJ1c3kgKi8KKyNkZWZpbmUJRUZCSUcJCTI3CS8qIEZpbGUgdG9vIGxhcmdlICovCisjZGVmaW5lCUVOT1NQQwkJMjgJLyogTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UgKi8KKyNkZWZpbmUJRVNQSVBFCQkyOQkvKiBJbGxlZ2FsIHNlZWsgKi8KKyNkZWZpbmUJRVJPRlMJCTMwCS8qIFJlYWQtb25seSBmaWxlIHN5c3RlbSAqLworI2RlZmluZQlFTUxJTksJCTMxCS8qIFRvbyBtYW55IGxpbmtzICovCisjZGVmaW5lCUVQSVBFCQkzMgkvKiBCcm9rZW4gcGlwZSAqLworI2RlZmluZQlFRE9NCQkzMwkvKiBNYXRoIGFyZ3VtZW50IG91dCBvZiBkb21haW4gb2YgZnVuYyAqLworI2RlZmluZQlFUkFOR0UJCTM0CS8qIE1hdGggcmVzdWx0IG5vdCByZXByZXNlbnRhYmxlICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9lcnJuby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9lcnJuby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMzMxY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2Vycm5vLmgKQEAgLTAsMCArMSwxMTMgQEAKKyNpZm5kZWYgX0FTTV9HRU5FUklDX0VSUk5PX0gKKyNkZWZpbmUgX0FTTV9HRU5FUklDX0VSUk5PX0gKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2Vycm5vLWJhc2UuaD4KKworI2RlZmluZQlFREVBRExLCQkzNQkvKiBSZXNvdXJjZSBkZWFkbG9jayB3b3VsZCBvY2N1ciAqLworI2RlZmluZQlFTkFNRVRPT0xPTkcJMzYJLyogRmlsZSBuYW1lIHRvbyBsb25nICovCisjZGVmaW5lCUVOT0xDSwkJMzcJLyogTm8gcmVjb3JkIGxvY2tzIGF2YWlsYWJsZSAqLworI2RlZmluZQlFTk9TWVMJCTM4CS8qIEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZCAqLworI2RlZmluZQlFTk9URU1QVFkJMzkJLyogRGlyZWN0b3J5IG5vdCBlbXB0eSAqLworI2RlZmluZQlFTE9PUAkJNDAJLyogVG9vIG1hbnkgc3ltYm9saWMgbGlua3MgZW5jb3VudGVyZWQgKi8KKyNkZWZpbmUJRVdPVUxEQkxPQ0sJRUFHQUlOCS8qIE9wZXJhdGlvbiB3b3VsZCBibG9jayAqLworI2RlZmluZQlFTk9NU0cJCTQyCS8qIE5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlICovCisjZGVmaW5lCUVJRFJNCQk0MwkvKiBJZGVudGlmaWVyIHJlbW92ZWQgKi8KKyNkZWZpbmUJRUNIUk5HCQk0NAkvKiBDaGFubmVsIG51bWJlciBvdXQgb2YgcmFuZ2UgKi8KKyNkZWZpbmUJRUwyTlNZTkMJNDUJLyogTGV2ZWwgMiBub3Qgc3luY2hyb25pemVkICovCisjZGVmaW5lCUVMM0hMVAkJNDYJLyogTGV2ZWwgMyBoYWx0ZWQgKi8KKyNkZWZpbmUJRUwzUlNUCQk0NwkvKiBMZXZlbCAzIHJlc2V0ICovCisjZGVmaW5lCUVMTlJORwkJNDgJLyogTGluayBudW1iZXIgb3V0IG9mIHJhbmdlICovCisjZGVmaW5lCUVVTkFUQ0gJCTQ5CS8qIFByb3RvY29sIGRyaXZlciBub3QgYXR0YWNoZWQgKi8KKyNkZWZpbmUJRU5PQ1NJCQk1MAkvKiBObyBDU0kgc3RydWN0dXJlIGF2YWlsYWJsZSAqLworI2RlZmluZQlFTDJITFQJCTUxCS8qIExldmVsIDIgaGFsdGVkICovCisjZGVmaW5lCUVCQURFCQk1MgkvKiBJbnZhbGlkIGV4Y2hhbmdlICovCisjZGVmaW5lCUVCQURSCQk1MwkvKiBJbnZhbGlkIHJlcXVlc3QgZGVzY3JpcHRvciAqLworI2RlZmluZQlFWEZVTEwJCTU0CS8qIEV4Y2hhbmdlIGZ1bGwgKi8KKyNkZWZpbmUJRU5PQU5PCQk1NQkvKiBObyBhbm9kZSAqLworI2RlZmluZQlFQkFEUlFDCQk1NgkvKiBJbnZhbGlkIHJlcXVlc3QgY29kZSAqLworI2RlZmluZQlFQkFEU0xUCQk1NwkvKiBJbnZhbGlkIHNsb3QgKi8KKworI2RlZmluZQlFREVBRExPQ0sJRURFQURMSworCisjZGVmaW5lCUVCRk9OVAkJNTkJLyogQmFkIGZvbnQgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUJRU5PU1RSCQk2MAkvKiBEZXZpY2Ugbm90IGEgc3RyZWFtICovCisjZGVmaW5lCUVOT0RBVEEJCTYxCS8qIE5vIGRhdGEgYXZhaWxhYmxlICovCisjZGVmaW5lCUVUSU1FCQk2MgkvKiBUaW1lciBleHBpcmVkICovCisjZGVmaW5lCUVOT1NSCQk2MwkvKiBPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMgKi8KKyNkZWZpbmUJRU5PTkVUCQk2NAkvKiBNYWNoaW5lIGlzIG5vdCBvbiB0aGUgbmV0d29yayAqLworI2RlZmluZQlFTk9QS0cJCTY1CS8qIFBhY2thZ2Ugbm90IGluc3RhbGxlZCAqLworI2RlZmluZQlFUkVNT1RFCQk2NgkvKiBPYmplY3QgaXMgcmVtb3RlICovCisjZGVmaW5lCUVOT0xJTksJCTY3CS8qIExpbmsgaGFzIGJlZW4gc2V2ZXJlZCAqLworI2RlZmluZQlFQURWCQk2OAkvKiBBZHZlcnRpc2UgZXJyb3IgKi8KKyNkZWZpbmUJRVNSTU5UCQk2OQkvKiBTcm1vdW50IGVycm9yICovCisjZGVmaW5lCUVDT01NCQk3MAkvKiBDb21tdW5pY2F0aW9uIGVycm9yIG9uIHNlbmQgKi8KKyNkZWZpbmUJRVBST1RPCQk3MQkvKiBQcm90b2NvbCBlcnJvciAqLworI2RlZmluZQlFTVVMVElIT1AJNzIJLyogTXVsdGlob3AgYXR0ZW1wdGVkICovCisjZGVmaW5lCUVET1RET1QJCTczCS8qIFJGUyBzcGVjaWZpYyBlcnJvciAqLworI2RlZmluZQlFQkFETVNHCQk3NAkvKiBOb3QgYSBkYXRhIG1lc3NhZ2UgKi8KKyNkZWZpbmUJRU9WRVJGTE9XCTc1CS8qIFZhbHVlIHRvbyBsYXJnZSBmb3IgZGVmaW5lZCBkYXRhIHR5cGUgKi8KKyNkZWZpbmUJRU5PVFVOSVEJNzYJLyogTmFtZSBub3QgdW5pcXVlIG9uIG5ldHdvcmsgKi8KKyNkZWZpbmUJRUJBREZECQk3NwkvKiBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlICovCisjZGVmaW5lCUVSRU1DSEcJCTc4CS8qIFJlbW90ZSBhZGRyZXNzIGNoYW5nZWQgKi8KKyNkZWZpbmUJRUxJQkFDQwkJNzkJLyogQ2FuIG5vdCBhY2Nlc3MgYSBuZWVkZWQgc2hhcmVkIGxpYnJhcnkgKi8KKyNkZWZpbmUJRUxJQkJBRAkJODAJLyogQWNjZXNzaW5nIGEgY29ycnVwdGVkIHNoYXJlZCBsaWJyYXJ5ICovCisjZGVmaW5lCUVMSUJTQ04JCTgxCS8qIC5saWIgc2VjdGlvbiBpbiBhLm91dCBjb3JydXB0ZWQgKi8KKyNkZWZpbmUJRUxJQk1BWAkJODIJLyogQXR0ZW1wdGluZyB0byBsaW5rIGluIHRvbyBtYW55IHNoYXJlZCBsaWJyYXJpZXMgKi8KKyNkZWZpbmUJRUxJQkVYRUMJODMJLyogQ2Fubm90IGV4ZWMgYSBzaGFyZWQgbGlicmFyeSBkaXJlY3RseSAqLworI2RlZmluZQlFSUxTRVEJCTg0CS8qIElsbGVnYWwgYnl0ZSBzZXF1ZW5jZSAqLworI2RlZmluZQlFUkVTVEFSVAk4NQkvKiBJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCBzaG91bGQgYmUgcmVzdGFydGVkICovCisjZGVmaW5lCUVTVFJQSVBFCTg2CS8qIFN0cmVhbXMgcGlwZSBlcnJvciAqLworI2RlZmluZQlFVVNFUlMJCTg3CS8qIFRvbyBtYW55IHVzZXJzICovCisjZGVmaW5lCUVOT1RTT0NLCTg4CS8qIFNvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldCAqLworI2RlZmluZQlFREVTVEFERFJSRVEJODkJLyogRGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZCAqLworI2RlZmluZQlFTVNHU0laRQk5MAkvKiBNZXNzYWdlIHRvbyBsb25nICovCisjZGVmaW5lCUVQUk9UT1RZUEUJOTEJLyogUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0ICovCisjZGVmaW5lCUVOT1BST1RPT1BUCTkyCS8qIFByb3RvY29sIG5vdCBhdmFpbGFibGUgKi8KKyNkZWZpbmUJRVBST1RPTk9TVVBQT1JUCTkzCS8qIFByb3RvY29sIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUJRVNPQ0tUTk9TVVBQT1JUCTk0CS8qIFNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUJRU9QTk9UU1VQUAk5NQkvKiBPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBvbiB0cmFuc3BvcnQgZW5kcG9pbnQgKi8KKyNkZWZpbmUJRVBGTk9TVVBQT1JUCTk2CS8qIFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lCUVBRk5PU1VQUE9SVAk5NwkvKiBBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sICovCisjZGVmaW5lCUVBRERSSU5VU0UJOTgJLyogQWRkcmVzcyBhbHJlYWR5IGluIHVzZSAqLworI2RlZmluZQlFQUREUk5PVEFWQUlMCTk5CS8qIENhbm5vdCBhc3NpZ24gcmVxdWVzdGVkIGFkZHJlc3MgKi8KKyNkZWZpbmUJRU5FVERPV04JMTAwCS8qIE5ldHdvcmsgaXMgZG93biAqLworI2RlZmluZQlFTkVUVU5SRUFDSAkxMDEJLyogTmV0d29yayBpcyB1bnJlYWNoYWJsZSAqLworI2RlZmluZQlFTkVUUkVTRVQJMTAyCS8qIE5ldHdvcmsgZHJvcHBlZCBjb25uZWN0aW9uIGJlY2F1c2Ugb2YgcmVzZXQgKi8KKyNkZWZpbmUJRUNPTk5BQk9SVEVECTEwMwkvKiBTb2Z0d2FyZSBjYXVzZWQgY29ubmVjdGlvbiBhYm9ydCAqLworI2RlZmluZQlFQ09OTlJFU0VUCTEwNAkvKiBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIgKi8KKyNkZWZpbmUJRU5PQlVGUwkJMTA1CS8qIE5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUgKi8KKyNkZWZpbmUJRUlTQ09OTgkJMTA2CS8qIFRyYW5zcG9ydCBlbmRwb2ludCBpcyBhbHJlYWR5IGNvbm5lY3RlZCAqLworI2RlZmluZQlFTk9UQ09OTgkxMDcJLyogVHJhbnNwb3J0IGVuZHBvaW50IGlzIG5vdCBjb25uZWN0ZWQgKi8KKyNkZWZpbmUJRVNIVVRET1dOCTEwOAkvKiBDYW5ub3Qgc2VuZCBhZnRlciB0cmFuc3BvcnQgZW5kcG9pbnQgc2h1dGRvd24gKi8KKyNkZWZpbmUJRVRPT01BTllSRUZTCTEwOQkvKiBUb28gbWFueSByZWZlcmVuY2VzOiBjYW5ub3Qgc3BsaWNlICovCisjZGVmaW5lCUVUSU1FRE9VVAkxMTAJLyogQ29ubmVjdGlvbiB0aW1lZCBvdXQgKi8KKyNkZWZpbmUJRUNPTk5SRUZVU0VECTExMQkvKiBDb25uZWN0aW9uIHJlZnVzZWQgKi8KKyNkZWZpbmUJRUhPU1RET1dOCTExMgkvKiBIb3N0IGlzIGRvd24gKi8KKyNkZWZpbmUJRUhPU1RVTlJFQUNICTExMwkvKiBObyByb3V0ZSB0byBob3N0ICovCisjZGVmaW5lCUVBTFJFQURZCTExNAkvKiBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyAqLworI2RlZmluZQlFSU5QUk9HUkVTUwkxMTUJLyogT3BlcmF0aW9uIG5vdyBpbiBwcm9ncmVzcyAqLworI2RlZmluZQlFU1RBTEUJCTExNgkvKiBTdGFsZSBORlMgZmlsZSBoYW5kbGUgKi8KKyNkZWZpbmUJRVVDTEVBTgkJMTE3CS8qIFN0cnVjdHVyZSBuZWVkcyBjbGVhbmluZyAqLworI2RlZmluZQlFTk9UTkFNCQkxMTgJLyogTm90IGEgWEVOSVggbmFtZWQgdHlwZSBmaWxlICovCisjZGVmaW5lCUVOQVZBSUwJCTExOQkvKiBObyBYRU5JWCBzZW1hcGhvcmVzIGF2YWlsYWJsZSAqLworI2RlZmluZQlFSVNOQU0JCTEyMAkvKiBJcyBhIG5hbWVkIHR5cGUgZmlsZSAqLworI2RlZmluZQlFUkVNT1RFSU8JMTIxCS8qIFJlbW90ZSBJL08gZXJyb3IgKi8KKyNkZWZpbmUJRURRVU9UCQkxMjIJLyogUXVvdGEgZXhjZWVkZWQgKi8KKworI2RlZmluZQlFTk9NRURJVU0JMTIzCS8qIE5vIG1lZGl1bSBmb3VuZCAqLworI2RlZmluZQlFTUVESVVNVFlQRQkxMjQJLyogV3JvbmcgbWVkaXVtIHR5cGUgKi8KKyNkZWZpbmUJRUNBTkNFTEVECTEyNQkvKiBPcGVyYXRpb24gQ2FuY2VsZWQgKi8KKyNkZWZpbmUJRU5PS0VZCQkxMjYJLyogUmVxdWlyZWQga2V5IG5vdCBhdmFpbGFibGUgKi8KKyNkZWZpbmUJRUtFWUVYUElSRUQJMTI3CS8qIEtleSBoYXMgZXhwaXJlZCAqLworI2RlZmluZQlFS0VZUkVWT0tFRAkxMjgJLyogS2V5IGhhcyBiZWVuIHJldm9rZWQgKi8KKyNkZWZpbmUJRUtFWVJFSkVDVEVECTEyOQkvKiBLZXkgd2FzIHJlamVjdGVkIGJ5IHNlcnZpY2UgKi8KKworLyogZm9yIHJvYnVzdCBtdXRleGVzICovCisjZGVmaW5lCUVPV05FUkRFQUQJMTMwCS8qIE93bmVyIGRpZWQgKi8KKyNkZWZpbmUJRU5PVFJFQ09WRVJBQkxFCTEzMQkvKiBTdGF0ZSBub3QgcmVjb3ZlcmFibGUgKi8KKworI2RlZmluZSBFUkZLSUxMCQkxMzIJLyogT3BlcmF0aW9uIG5vdCBwb3NzaWJsZSBkdWUgdG8gUkYta2lsbCAqLworCisjZGVmaW5lIEVIV1BPSVNPTgkxMzMJLyogTWVtb3J5IHBhZ2UgaGFzIGhhcmR3YXJlIGVycm9yICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9mY250bC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9mY250bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNWIwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2ZjbnRsLmgKQEAgLTAsMCArMSwxOTUgQEAKKyNpZm5kZWYgX0FTTV9HRU5FUklDX0ZDTlRMX0gKKyNkZWZpbmUgX0FTTV9HRU5FUklDX0ZDTlRMX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBGTU9ERV9FWEVDIGlzIDB4MjAKKyAqIEZNT0RFX05PTk9USUZZIGlzIDB4MTAwMDAwMAorICogVGhlc2UgY2Fubm90IGJlIHVzZWQgYnkgdXNlcnNwYWNlIE9fKiB1bnRpbCBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgb3BlbgorICogZmxhZ3MgYXJlIHNwbGl0LgorICogLUVyaWMgUGFyaXMKKyAqLworCisvKgorICogV2hlbiBpbnRyb2R1Y2luZyBuZXcgT18qIGJpdHMsIHBsZWFzZSBjaGVjayBpdHMgdW5pcXVlbmVzcyBpbiBmY250bF9pbml0KCkuCisgKi8KKworI2RlZmluZSBPX0FDQ01PREUJMDAwMDAwMDMKKyNkZWZpbmUgT19SRE9OTFkJMDAwMDAwMDAKKyNkZWZpbmUgT19XUk9OTFkJMDAwMDAwMDEKKyNkZWZpbmUgT19SRFdSCQkwMDAwMDAwMgorI2lmbmRlZiBPX0NSRUFUCisjZGVmaW5lIE9fQ1JFQVQJCTAwMDAwMTAwCS8qIG5vdCBmY250bCAqLworI2VuZGlmCisjaWZuZGVmIE9fRVhDTAorI2RlZmluZSBPX0VYQ0wJCTAwMDAwMjAwCS8qIG5vdCBmY250bCAqLworI2VuZGlmCisjaWZuZGVmIE9fTk9DVFRZCisjZGVmaW5lIE9fTk9DVFRZCTAwMDAwNDAwCS8qIG5vdCBmY250bCAqLworI2VuZGlmCisjaWZuZGVmIE9fVFJVTkMKKyNkZWZpbmUgT19UUlVOQwkJMDAwMDEwMDAJLyogbm90IGZjbnRsICovCisjZW5kaWYKKyNpZm5kZWYgT19BUFBFTkQKKyNkZWZpbmUgT19BUFBFTkQJMDAwMDIwMDAKKyNlbmRpZgorI2lmbmRlZiBPX05PTkJMT0NLCisjZGVmaW5lIE9fTk9OQkxPQ0sJMDAwMDQwMDAKKyNlbmRpZgorI2lmbmRlZiBPX0RTWU5DCisjZGVmaW5lIE9fRFNZTkMJCTAwMDEwMDAwCS8qIHVzZWQgdG8gYmUgT19TWU5DLCBzZWUgYmVsb3cgKi8KKyNlbmRpZgorI2lmbmRlZiBGQVNZTkMKKyNkZWZpbmUgRkFTWU5DCQkwMDAyMDAwMAkvKiBmY250bCwgZm9yIEJTRCBjb21wYXRpYmlsaXR5ICovCisjZW5kaWYKKyNpZm5kZWYgT19ESVJFQ1QKKyNkZWZpbmUgT19ESVJFQ1QJMDAwNDAwMDAJLyogZGlyZWN0IGRpc2sgYWNjZXNzIGhpbnQgKi8KKyNlbmRpZgorI2lmbmRlZiBPX0xBUkdFRklMRQorI2RlZmluZSBPX0xBUkdFRklMRQkwMDEwMDAwMAorI2VuZGlmCisjaWZuZGVmIE9fRElSRUNUT1JZCisjZGVmaW5lIE9fRElSRUNUT1JZCTAwMjAwMDAwCS8qIG11c3QgYmUgYSBkaXJlY3RvcnkgKi8KKyNlbmRpZgorI2lmbmRlZiBPX05PRk9MTE9XCisjZGVmaW5lIE9fTk9GT0xMT1cJMDA0MDAwMDAJLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCisjZW5kaWYKKyNpZm5kZWYgT19OT0FUSU1FCisjZGVmaW5lIE9fTk9BVElNRQkwMTAwMDAwMAorI2VuZGlmCisjaWZuZGVmIE9fQ0xPRVhFQworI2RlZmluZSBPX0NMT0VYRUMJMDIwMDAwMDAJLyogc2V0IGNsb3NlX29uX2V4ZWMgKi8KKyNlbmRpZgorCisvKgorICogQmVmb3JlIExpbnV4IDIuNi4zMyBvbmx5IE9fRFNZTkMgc2VtYW50aWNzIHdlcmUgaW1wbGVtZW50ZWQsIGJ1dCB1c2luZworICogdGhlIE9fU1lOQyBmbGFnLiAgV2UgY29udGludWUgdG8gdXNlIHRoZSBleGlzdGluZyBudW1lcmljYWwgdmFsdWUKKyAqIGZvciBPX0RTWU5DIHNlbWFudGljcyBub3csIGJ1dCB1c2luZyB0aGUgY29ycmVjdCBzeW1ib2xpYyBuYW1lIGZvciBpdC4KKyAqIFRoaXMgbmV3IHZhbHVlIGlzIHVzZWQgdG8gcmVxdWVzdCB0cnVlIFBvc2l4IE9fU1lOQyBzZW1hbnRpY3MuICBJdCBpcworICogZGVmaW5lZCBpbiB0aGlzIHN0cmFuZ2Ugd2F5IHRvIG1ha2Ugc3VyZSBhcHBsaWNhdGlvbnMgY29tcGlsZWQgYWdhaW5zdAorICogbmV3IGhlYWRlcnMgZ2V0IGF0IGxlYXN0IE9fRFNZTkMgc2VtYW50aWNzIG9uIG9sZGVyIGtlcm5lbHMuCisgKgorICogVGhpcyBoYXMgdGhlIG5pY2Ugc2lkZS1lZmZlY3QgdGhhdCB3ZSBjYW4gc2ltcGx5IHRlc3QgZm9yIE9fRFNZTkMKKyAqIHdoZXJldmVyIHdlIGRvIG5vdCBjYXJlIGlmIE9fRFNZTkMgb3IgT19TWU5DIGlzIHVzZWQuCisgKgorICogTm90ZTogX19PX1NZTkMgbXVzdCBuZXZlciBiZSB1c2VkIGRpcmVjdGx5LgorICovCisjaWZuZGVmIE9fU1lOQworI2RlZmluZSBfX09fU1lOQwkwNDAwMDAwMAorI2RlZmluZSBPX1NZTkMJCShfX09fU1lOQ3xPX0RTWU5DKQorI2VuZGlmCisKKyNpZm5kZWYgT19QQVRICisjZGVmaW5lIE9fUEFUSAkJMDEwMDAwMDAwCisjZW5kaWYKKworI2lmbmRlZiBPX05ERUxBWQorI2RlZmluZSBPX05ERUxBWQlPX05PTkJMT0NLCisjZW5kaWYKKworI2RlZmluZSBGX0RVUEZECQkwCS8qIGR1cCAqLworI2RlZmluZSBGX0dFVEZECQkxCS8qIGdldCBjbG9zZV9vbl9leGVjICovCisjZGVmaW5lIEZfU0VURkQJCTIJLyogc2V0L2NsZWFyIGNsb3NlX29uX2V4ZWMgKi8KKyNkZWZpbmUgRl9HRVRGTAkJMwkvKiBnZXQgZmlsZS0+Zl9mbGFncyAqLworI2RlZmluZSBGX1NFVEZMCQk0CS8qIHNldCBmaWxlLT5mX2ZsYWdzICovCisjaWZuZGVmIEZfR0VUTEsKKyNkZWZpbmUgRl9HRVRMSwkJNQorI2RlZmluZSBGX1NFVExLCQk2CisjZGVmaW5lIEZfU0VUTEtXCTcKKyNlbmRpZgorI2lmbmRlZiBGX1NFVE9XTgorI2RlZmluZSBGX1NFVE9XTgk4CS8qIGZvciBzb2NrZXRzLiAqLworI2RlZmluZSBGX0dFVE9XTgk5CS8qIGZvciBzb2NrZXRzLiAqLworI2VuZGlmCisjaWZuZGVmIEZfU0VUU0lHCisjZGVmaW5lIEZfU0VUU0lHCTEwCS8qIGZvciBzb2NrZXRzLiAqLworI2RlZmluZSBGX0dFVFNJRwkxMQkvKiBmb3Igc29ja2V0cy4gKi8KKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR182NEJJVAorI2lmbmRlZiBGX0dFVExLNjQKKyNkZWZpbmUgRl9HRVRMSzY0CTEyCS8qICB1c2luZyAnc3RydWN0IGZsb2NrNjQnICovCisjZGVmaW5lIEZfU0VUTEs2NAkxMworI2RlZmluZSBGX1NFVExLVzY0CTE0CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEZfU0VUT1dOX0VYCisjZGVmaW5lIEZfU0VUT1dOX0VYCTE1CisjZGVmaW5lIEZfR0VUT1dOX0VYCTE2CisjZW5kaWYKKworI2RlZmluZSBGX09XTkVSX1RJRAkwCisjZGVmaW5lIEZfT1dORVJfUElECTEKKyNkZWZpbmUgRl9PV05FUl9QR1JQCTIKKworc3RydWN0IGZfb3duZXJfZXggeworCWludAl0eXBlOworCV9fa2VybmVsX3BpZF90CXBpZDsKK307CisKKy8qIGZvciBGX1tHRVR8U0VUXUZMICovCisjZGVmaW5lIEZEX0NMT0VYRUMJMQkvKiBhY3R1YWxseSBhbnl0aGluZyB3aXRoIGxvdyBiaXQgc2V0IGdvZXMgKi8KKworLyogZm9yIHBvc2l4IGZjbnRsKCkgYW5kIGxvY2tmKCkgKi8KKyNpZm5kZWYgRl9SRExDSworI2RlZmluZSBGX1JETENLCQkwCisjZGVmaW5lIEZfV1JMQ0sJCTEKKyNkZWZpbmUgRl9VTkxDSwkJMgorI2VuZGlmCisKKy8qIGZvciBvbGQgaW1wbGVtZW50YXRpb24gb2YgYnNkIGZsb2NrICgpICovCisjaWZuZGVmIEZfRVhMQ0sKKyNkZWZpbmUgRl9FWExDSwkJNAkvKiBvciAzICovCisjZGVmaW5lIEZfU0hMQ0sJCTgJLyogb3IgNCAqLworI2VuZGlmCisKKy8qIG9wZXJhdGlvbnMgZm9yIGJzZCBmbG9jaygpLCBhbHNvIHVzZWQgYnkgdGhlIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiAqLworI2RlZmluZSBMT0NLX1NICQkxCS8qIHNoYXJlZCBsb2NrICovCisjZGVmaW5lIExPQ0tfRVgJCTIJLyogZXhjbHVzaXZlIGxvY2sgKi8KKyNkZWZpbmUgTE9DS19OQgkJNAkvKiBvcidkIHdpdGggb25lIG9mIHRoZSBhYm92ZSB0byBwcmV2ZW50CisJCQkJICAgYmxvY2tpbmcgKi8KKyNkZWZpbmUgTE9DS19VTgkJOAkvKiByZW1vdmUgbG9jayAqLworCisjZGVmaW5lIExPQ0tfTUFORAkzMgkvKiBUaGlzIGlzIGEgbWFuZGF0b3J5IGZsb2NrIC4uLiAqLworI2RlZmluZSBMT0NLX1JFQUQJNjQJLyogd2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCBvcGVyYXRpb25zICovCisjZGVmaW5lIExPQ0tfV1JJVEUJMTI4CS8qIHdoaWNoIGFsbG93cyBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgTE9DS19SVwkJMTkyCS8qIHdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KKworI2RlZmluZSBGX0xJTlVYX1NQRUNJRklDX0JBU0UJMTAyNAorCisjaWZuZGVmIEhBVkVfQVJDSF9TVFJVQ1RfRkxPQ0sKKyNpZm5kZWYgX19BUkNIX0ZMT0NLX1BBRAorI2RlZmluZSBfX0FSQ0hfRkxPQ0tfUEFECisjZW5kaWYKKworc3RydWN0IGZsb2NrIHsKKwlzaG9ydAlsX3R5cGU7CisJc2hvcnQJbF93aGVuY2U7CisJX19rZXJuZWxfb2ZmX3QJbF9zdGFydDsKKwlfX2tlcm5lbF9vZmZfdAlsX2xlbjsKKwlfX2tlcm5lbF9waWRfdAlsX3BpZDsKKwlfX0FSQ0hfRkxPQ0tfUEFECit9OworI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHXzY0QklUCisKKyNpZm5kZWYgSEFWRV9BUkNIX1NUUlVDVF9GTE9DSzY0CisjaWZuZGVmIF9fQVJDSF9GTE9DSzY0X1BBRAorI2RlZmluZSBfX0FSQ0hfRkxPQ0s2NF9QQUQKKyNlbmRpZgorCitzdHJ1Y3QgZmxvY2s2NCB7CisJc2hvcnQgIGxfdHlwZTsKKwlzaG9ydCAgbF93aGVuY2U7CisJX19rZXJuZWxfbG9mZl90IGxfc3RhcnQ7CisJX19rZXJuZWxfbG9mZl90IGxfbGVuOworCV9fa2VybmVsX3BpZF90ICBsX3BpZDsKKwlfX0FSQ0hfRkxPQ0s2NF9QQUQKK307CisjZW5kaWYKKyNlbmRpZiAvKiAhQ09ORklHXzY0QklUICovCisKKyNlbmRpZiAvKiBfQVNNX0dFTkVSSUNfRkNOVExfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9pbnQtbDY0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2ludC1sNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjcxYWUyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9pbnQtbDY0LmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIGFzbS1nZW5lcmljL2ludC1sNjQuaAorICoKKyAqIEludGVnZXIgZGVjbGFyYXRpb25zIGZvciBhcmNoaXRlY3R1cmVzIHdoaWNoIHVzZSAibG9uZyIKKyAqIGZvciA2NC1iaXQgdHlwZXMuCisgKi8KKworI2lmbmRlZiBfQVNNX0dFTkVSSUNfSU5UX0w2NF9ICisjZGVmaW5lIF9BU01fR0VORVJJQ19JTlRfTDY0X0gKKworI2luY2x1ZGUgPGFzbS9iaXRzcGVybG9uZy5oPgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworLyoKKyAqIF9feHggaXMgb2s6IGl0IGRvZXNuJ3QgcG9sbHV0ZSB0aGUgUE9TSVggbmFtZXNwYWNlLiBVc2UgdGhlc2UgaW4gdGhlCisgKiBoZWFkZXIgZmlsZXMgZXhwb3J0ZWQgdG8gdXNlciBzcGFjZQorICovCisKK3R5cGVkZWYgX19zaWduZWRfXyBjaGFyIF9fczg7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX191ODsKKwordHlwZWRlZiBfX3NpZ25lZF9fIHNob3J0IF9fczE2OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBfX3UxNjsKKwordHlwZWRlZiBfX3NpZ25lZF9fIGludCBfX3MzMjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IF9fdTMyOworCit0eXBlZGVmIF9fc2lnbmVkX18gbG9uZyBfX3M2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBfX3U2NDsKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisKKyNlbmRpZiAvKiBfQVNNX0dFTkVSSUNfSU5UX0w2NF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2ludC1sbDY0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2ludC1sbDY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVkZTA0NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvaW50LWxsNjQuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogYXNtLWdlbmVyaWMvaW50LWxsNjQuaAorICoKKyAqIEludGVnZXIgZGVjbGFyYXRpb25zIGZvciBhcmNoaXRlY3R1cmVzIHdoaWNoIHVzZSAibG9uZyBsb25nIgorICogZm9yIDY0LWJpdCB0eXBlcy4KKyAqLworCisjaWZuZGVmIF9BU01fR0VORVJJQ19JTlRfTEw2NF9ICisjZGVmaW5lIF9BU01fR0VORVJJQ19JTlRfTEw2NF9ICisKKyNpbmNsdWRlIDxhc20vYml0c3BlcmxvbmcuaD4KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKy8qCisgKiBfX3h4IGlzIG9rOiBpdCBkb2Vzbid0IHBvbGx1dGUgdGhlIFBPU0lYIG5hbWVzcGFjZS4gVXNlIHRoZXNlIGluIHRoZQorICogaGVhZGVyIGZpbGVzIGV4cG9ydGVkIHRvIHVzZXIgc3BhY2UKKyAqLworCit0eXBlZGVmIF9fc2lnbmVkX18gY2hhciBfX3M4OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdTg7CisKK3R5cGVkZWYgX19zaWduZWRfXyBzaG9ydCBfX3MxNjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgX191MTY7CisKK3R5cGVkZWYgX19zaWduZWRfXyBpbnQgX19zMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBfX3UzMjsKKworI2lmZGVmIF9fR05VQ19fCitfX2V4dGVuc2lvbl9fIHR5cGVkZWYgX19zaWduZWRfXyBsb25nIGxvbmcgX19zNjQ7CitfX2V4dGVuc2lvbl9fIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIF9fdTY0OworI2Vsc2UKK3R5cGVkZWYgX19zaWduZWRfXyBsb25nIGxvbmcgX19zNjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBfX3U2NDsKKyNlbmRpZgorCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKworI2VuZGlmIC8qIF9BU01fR0VORVJJQ19JTlRfTEw2NF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2lvY3RsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRhMmM3ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvaW9jdGwuaApAQCAtMCwwICsxLDk2IEBACisjaWZuZGVmIF9BU01fR0VORVJJQ19JT0NUTF9ICisjZGVmaW5lIF9BU01fR0VORVJJQ19JT0NUTF9ICisKKy8qIGlvY3RsIGNvbW1hbmQgZW5jb2Rpbmc6IDMyIGJpdHMgdG90YWwsIGNvbW1hbmQgaW4gbG93ZXIgMTYgYml0cywKKyAqIHNpemUgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgaW4gdGhlIGxvd2VyIDE0IGJpdHMgb2YgdGhlCisgKiB1cHBlciAxNiBiaXRzLgorICogRW5jb2RpbmcgdGhlIHNpemUgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgaW4gdGhlIGlvY3RsIHJlcXVlc3QKKyAqIGlzIHVzZWZ1bCBmb3IgY2F0Y2hpbmcgcHJvZ3JhbXMgY29tcGlsZWQgd2l0aCBvbGQgdmVyc2lvbnMKKyAqIGFuZCB0byBhdm9pZCBvdmVyd3JpdGluZyB1c2VyIHNwYWNlIG91dHNpZGUgdGhlIHVzZXIgYnVmZmVyIGFyZWEuCisgKiBUaGUgaGlnaGVzdCAyIGJpdHMgYXJlIHJlc2VydmVkIGZvciBpbmRpY2F0aW5nIHRoZSBgYGFjY2VzcyBtb2RlJycuCisgKiBOT1RFOiBUaGlzIGxpbWl0cyB0aGUgbWF4IHBhcmFtZXRlciBzaXplIHRvIDE2a0IgLTEgIQorICovCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGlzIGZvciBjb21wYXRpYmlsaXR5IGFjcm9zcyB0aGUgdmFyaW91cyBMaW51eAorICogcGxhdGZvcm1zLiAgVGhlIGdlbmVyaWMgaW9jdGwgbnVtYmVyaW5nIHNjaGVtZSBkb2Vzbid0IHJlYWxseSBlbmZvcmNlCisgKiBhIHR5cGUgZmllbGQuICBEZSBmYWN0bywgaG93ZXZlciwgdGhlIHRvcCA4IGJpdHMgb2YgdGhlIGxvd2VyIDE2CisgKiBiaXRzIGFyZSBpbmRlZWQgdXNlZCBhcyBhIHR5cGUgZmllbGQsIHNvIHdlIG1pZ2h0IGp1c3QgYXMgd2VsbCBtYWtlCisgKiB0aGlzIGV4cGxpY2l0IGhlcmUuICBQbGVhc2UgYmUgc3VyZSB0byB1c2UgdGhlIGRlY29kaW5nIG1hY3JvcworICogYmVsb3cgZnJvbSBub3cgb24uCisgKi8KKyNkZWZpbmUgX0lPQ19OUkJJVFMJOAorI2RlZmluZSBfSU9DX1RZUEVCSVRTCTgKKworLyoKKyAqIExldCBhbnkgYXJjaGl0ZWN0dXJlIG92ZXJyaWRlIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIGJlZm9yZQorICogaW5jbHVkaW5nIHRoaXMgZmlsZS4KKyAqLworCisjaWZuZGVmIF9JT0NfU0laRUJJVFMKKyMgZGVmaW5lIF9JT0NfU0laRUJJVFMJMTQKKyNlbmRpZgorCisjaWZuZGVmIF9JT0NfRElSQklUUworIyBkZWZpbmUgX0lPQ19ESVJCSVRTCTIKKyNlbmRpZgorCisjZGVmaW5lIF9JT0NfTlJNQVNLCSgoMSA8PCBfSU9DX05SQklUUyktMSkKKyNkZWZpbmUgX0lPQ19UWVBFTUFTSwkoKDEgPDwgX0lPQ19UWVBFQklUUyktMSkKKyNkZWZpbmUgX0lPQ19TSVpFTUFTSwkoKDEgPDwgX0lPQ19TSVpFQklUUyktMSkKKyNkZWZpbmUgX0lPQ19ESVJNQVNLCSgoMSA8PCBfSU9DX0RJUkJJVFMpLTEpCisKKyNkZWZpbmUgX0lPQ19OUlNISUZUCTAKKyNkZWZpbmUgX0lPQ19UWVBFU0hJRlQJKF9JT0NfTlJTSElGVCtfSU9DX05SQklUUykKKyNkZWZpbmUgX0lPQ19TSVpFU0hJRlQJKF9JT0NfVFlQRVNISUZUK19JT0NfVFlQRUJJVFMpCisjZGVmaW5lIF9JT0NfRElSU0hJRlQJKF9JT0NfU0laRVNISUZUK19JT0NfU0laRUJJVFMpCisKKy8qCisgKiBEaXJlY3Rpb24gYml0cywgd2hpY2ggYW55IGFyY2hpdGVjdHVyZSBjYW4gY2hvb3NlIHRvIG92ZXJyaWRlCisgKiBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZS4KKyAqLworCisjaWZuZGVmIF9JT0NfTk9ORQorIyBkZWZpbmUgX0lPQ19OT05FCTBVCisjZW5kaWYKKworI2lmbmRlZiBfSU9DX1dSSVRFCisjIGRlZmluZSBfSU9DX1dSSVRFCTFVCisjZW5kaWYKKworI2lmbmRlZiBfSU9DX1JFQUQKKyMgZGVmaW5lIF9JT0NfUkVBRAkyVQorI2VuZGlmCisKKyNkZWZpbmUgX0lPQyhkaXIsdHlwZSxucixzaXplKSBcCisJKCgoZGlyKSAgPDwgX0lPQ19ESVJTSElGVCkgfCBcCisJICgodHlwZSkgPDwgX0lPQ19UWVBFU0hJRlQpIHwgXAorCSAoKG5yKSAgIDw8IF9JT0NfTlJTSElGVCkgfCBcCisJICgoc2l6ZSkgPDwgX0lPQ19TSVpFU0hJRlQpKQorCisjZGVmaW5lIF9JT0NfVFlQRUNIRUNLKHQpIChzaXplb2YodCkpCisKKy8qIHVzZWQgdG8gY3JlYXRlIG51bWJlcnMgKi8KKyNkZWZpbmUgX0lPKHR5cGUsbnIpCQlfSU9DKF9JT0NfTk9ORSwodHlwZSksKG5yKSwwKQorI2RlZmluZSBfSU9SKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1JFQUQsKHR5cGUpLChuciksKF9JT0NfVFlQRUNIRUNLKHNpemUpKSkKKyNkZWZpbmUgX0lPVyh0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19XUklURSwodHlwZSksKG5yKSwoX0lPQ19UWVBFQ0hFQ0soc2l6ZSkpKQorI2RlZmluZSBfSU9XUih0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19SRUFEfF9JT0NfV1JJVEUsKHR5cGUpLChuciksKF9JT0NfVFlQRUNIRUNLKHNpemUpKSkKKyNkZWZpbmUgX0lPUl9CQUQodHlwZSxucixzaXplKQlfSU9DKF9JT0NfUkVBRCwodHlwZSksKG5yKSxzaXplb2Yoc2l6ZSkpCisjZGVmaW5lIF9JT1dfQkFEKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKKyNkZWZpbmUgX0lPV1JfQkFEKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1JFQUR8X0lPQ19XUklURSwodHlwZSksKG5yKSxzaXplb2Yoc2l6ZSkpCisKKy8qIHVzZWQgdG8gZGVjb2RlIGlvY3RsIG51bWJlcnMuLiAqLworI2RlZmluZSBfSU9DX0RJUihucikJCSgoKG5yKSA+PiBfSU9DX0RJUlNISUZUKSAmIF9JT0NfRElSTUFTSykKKyNkZWZpbmUgX0lPQ19UWVBFKG5yKQkJKCgobnIpID4+IF9JT0NfVFlQRVNISUZUKSAmIF9JT0NfVFlQRU1BU0spCisjZGVmaW5lIF9JT0NfTlIobnIpCQkoKChucikgPj4gX0lPQ19OUlNISUZUKSAmIF9JT0NfTlJNQVNLKQorI2RlZmluZSBfSU9DX1NJWkUobnIpCQkoKChucikgPj4gX0lPQ19TSVpFU0hJRlQpICYgX0lPQ19TSVpFTUFTSykKKworLyogLi4uYW5kIGZvciB0aGUgZHJpdmVycy9zb3VuZCBmaWxlcy4uLiAqLworCisjZGVmaW5lIElPQ19JTgkJKF9JT0NfV1JJVEUgPDwgX0lPQ19ESVJTSElGVCkKKyNkZWZpbmUgSU9DX09VVAkJKF9JT0NfUkVBRCA8PCBfSU9DX0RJUlNISUZUKQorI2RlZmluZSBJT0NfSU5PVVQJKChfSU9DX1dSSVRFfF9JT0NfUkVBRCkgPDwgX0lPQ19ESVJTSElGVCkKKyNkZWZpbmUgSU9DU0laRV9NQVNLCShfSU9DX1NJWkVNQVNLIDw8IF9JT0NfU0laRVNISUZUKQorI2RlZmluZSBJT0NTSVpFX1NISUZUCShfSU9DX1NJWkVTSElGVCkKKworI2VuZGlmIC8qIF9BU01fR0VORVJJQ19JT0NUTF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2lvY3Rscy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9pb2N0bHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjQzOWNjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9pb2N0bHMuaApAQCAtMCwwICsxLDExNCBAQAorI2lmbmRlZiBfX0FTTV9HRU5FUklDX0lPQ1RMU19ICisjZGVmaW5lIF9fQVNNX0dFTkVSSUNfSU9DVExTX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIG1vc3QgY29tbW9uIGRlZmluaXRpb25zIGZvciB0dHkgaW9jdGwgbnVtYmVycy4KKyAqIE1vc3Qgb2YgdGhlbSBkbyBub3QgdXNlIHRoZSByZWNvbW1lbmRlZCBfSU9DKCksIGJ1dCB0aGVyZSBpcworICogcHJvYmFibHkgc29tZSBzb3VyY2UgY29kZSBvdXQgdGhlcmUgaGFyZGNvZGluZyB0aGUgbnVtYmVyLAorICogc28gd2UgbWlnaHQgYXMgd2VsbCB1c2UgdGhlbSBmb3IgYWxsIG5ldyBwbGF0Zm9ybXMuCisgKgorICogVGhlIGFyY2hpdGVjdHVyZXMgdGhhdCB1c2UgZGlmZmVyZW50IHZhbHVlcyBoZXJlIHR5cGljYWxseQorICogdHJ5IHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzb21lIFVuaXggdmFyaWFudHMgZm9yIHRoZSBzYW1lCisgKiBhcmNoaXRlY3R1cmUuCisgKi8KKworLyogMHg1NCBpcyBqdXN0IGEgbWFnaWMgbnVtYmVyIHRvIG1ha2UgdGhlc2UgcmVsYXRpdmVseSB1bmlxdWUgKCdUJykgKi8KKworI2RlZmluZSBUQ0dFVFMJCTB4NTQwMQorI2RlZmluZSBUQ1NFVFMJCTB4NTQwMgorI2RlZmluZSBUQ1NFVFNXCQkweDU0MDMKKyNkZWZpbmUgVENTRVRTRgkJMHg1NDA0CisjZGVmaW5lIFRDR0VUQQkJMHg1NDA1CisjZGVmaW5lIFRDU0VUQQkJMHg1NDA2CisjZGVmaW5lIFRDU0VUQVcJCTB4NTQwNworI2RlZmluZSBUQ1NFVEFGCQkweDU0MDgKKyNkZWZpbmUgVENTQlJLCQkweDU0MDkKKyNkZWZpbmUgVENYT05DCQkweDU0MEEKKyNkZWZpbmUgVENGTFNICQkweDU0MEIKKyNkZWZpbmUgVElPQ0VYQ0wJMHg1NDBDCisjZGVmaW5lIFRJT0NOWENMCTB4NTQwRAorI2RlZmluZSBUSU9DU0NUVFkJMHg1NDBFCisjZGVmaW5lIFRJT0NHUEdSUAkweDU0MEYKKyNkZWZpbmUgVElPQ1NQR1JQCTB4NTQxMAorI2RlZmluZSBUSU9DT1VUUQkweDU0MTEKKyNkZWZpbmUgVElPQ1NUSQkJMHg1NDEyCisjZGVmaW5lIFRJT0NHV0lOU1oJMHg1NDEzCisjZGVmaW5lIFRJT0NTV0lOU1oJMHg1NDE0CisjZGVmaW5lIFRJT0NNR0VUCTB4NTQxNQorI2RlZmluZSBUSU9DTUJJUwkweDU0MTYKKyNkZWZpbmUgVElPQ01CSUMJMHg1NDE3CisjZGVmaW5lIFRJT0NNU0VUCTB4NTQxOAorI2RlZmluZSBUSU9DR1NPRlRDQVIJMHg1NDE5CisjZGVmaW5lIFRJT0NTU09GVENBUgkweDU0MUEKKyNkZWZpbmUgRklPTlJFQUQJMHg1NDFCCisjZGVmaW5lIFRJT0NJTlEJCUZJT05SRUFECisjZGVmaW5lIFRJT0NMSU5VWAkweDU0MUMKKyNkZWZpbmUgVElPQ0NPTlMJMHg1NDFECisjZGVmaW5lIFRJT0NHU0VSSUFMCTB4NTQxRQorI2RlZmluZSBUSU9DU1NFUklBTAkweDU0MUYKKyNkZWZpbmUgVElPQ1BLVAkJMHg1NDIwCisjZGVmaW5lIEZJT05CSU8JCTB4NTQyMQorI2RlZmluZSBUSU9DTk9UVFkJMHg1NDIyCisjZGVmaW5lIFRJT0NTRVRECTB4NTQyMworI2RlZmluZSBUSU9DR0VURAkweDU0MjQKKyNkZWZpbmUgVENTQlJLUAkJMHg1NDI1CS8qIE5lZWRlZCBmb3IgUE9TSVggdGNzZW5kYnJlYWsoKSAqLworI2RlZmluZSBUSU9DU0JSSwkweDU0MjcgIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFRJT0NDQlJLCTB4NTQyOCAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgVElPQ0dTSUQJMHg1NDI5ICAvKiBSZXR1cm4gdGhlIHNlc3Npb24gSUQgb2YgRkQgKi8KKyNkZWZpbmUgVENHRVRTMgkJX0lPUignVCcsIDB4MkEsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTMgkJX0lPVygnVCcsIDB4MkIsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTVzIJX0lPVygnVCcsIDB4MkMsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTRjIJX0lPVygnVCcsIDB4MkQsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVElPQ0dSUzQ4NQkweDU0MkUKKyNpZm5kZWYgVElPQ1NSUzQ4NQorI2RlZmluZSBUSU9DU1JTNDg1CTB4NTQyRgorI2VuZGlmCisjZGVmaW5lIFRJT0NHUFROCV9JT1IoJ1QnLCAweDMwLCB1bnNpZ25lZCBpbnQpIC8qIEdldCBQdHkgTnVtYmVyIChvZiBwdHktbXV4IGRldmljZSkgKi8KKyNkZWZpbmUgVElPQ1NQVExDSwlfSU9XKCdUJywgMHgzMSwgaW50KSAgLyogTG9jay91bmxvY2sgUHR5ICovCisjZGVmaW5lIFRJT0NHREVWCV9JT1IoJ1QnLCAweDMyLCB1bnNpZ25lZCBpbnQpIC8qIEdldCBwcmltYXJ5IGRldmljZSBub2RlIG9mIC9kZXYvY29uc29sZSAqLworI2RlZmluZSBUQ0dFVFgJCTB4NTQzMiAvKiBTWVM1IFRDR0VUWCBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFRDU0VUWAkJMHg1NDMzCisjZGVmaW5lIFRDU0VUWEYJCTB4NTQzNAorI2RlZmluZSBUQ1NFVFhXCQkweDU0MzUKKyNkZWZpbmUgVElPQ1NJRwkJX0lPVygnVCcsIDB4MzYsIGludCkgIC8qIHB0eTogZ2VuZXJhdGUgc2lnbmFsICovCisjZGVmaW5lIFRJT0NWSEFOR1VQCTB4NTQzNworCisjZGVmaW5lIEZJT05DTEVYCTB4NTQ1MAorI2RlZmluZSBGSU9DTEVYCQkweDU0NTEKKyNkZWZpbmUgRklPQVNZTkMJMHg1NDUyCisjZGVmaW5lIFRJT0NTRVJDT05GSUcJMHg1NDUzCisjZGVmaW5lIFRJT0NTRVJHV0lMRAkweDU0NTQKKyNkZWZpbmUgVElPQ1NFUlNXSUxECTB4NTQ1NQorI2RlZmluZSBUSU9DR0xDS1RSTUlPUwkweDU0NTYKKyNkZWZpbmUgVElPQ1NMQ0tUUk1JT1MJMHg1NDU3CisjZGVmaW5lIFRJT0NTRVJHU1RSVUNUCTB4NTQ1OCAvKiBGb3IgZGVidWdnaW5nIG9ubHkgKi8KKyNkZWZpbmUgVElPQ1NFUkdFVExTUiAgIDB4NTQ1OSAvKiBHZXQgbGluZSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVElPQ1NFUkdFVE1VTFRJIDB4NTQ1QSAvKiBHZXQgbXVsdGlwb3J0IGNvbmZpZyAgKi8KKyNkZWZpbmUgVElPQ1NFUlNFVE1VTFRJIDB4NTQ1QiAvKiBTZXQgbXVsdGlwb3J0IGNvbmZpZyAqLworCisjZGVmaW5lIFRJT0NNSVdBSVQJMHg1NDVDCS8qIHdhaXQgZm9yIGEgY2hhbmdlIG9uIHNlcmlhbCBpbnB1dCBsaW5lKHMpICovCisjZGVmaW5lIFRJT0NHSUNPVU5UCTB4NTQ1RAkvKiByZWFkIHNlcmlhbCBwb3J0IF9faW5saW5lX18gaW50ZXJydXB0IGNvdW50cyAqLworCisvKgorICogU29tZSBhcmNoZXMgYWxyZWFkeSBkZWZpbmUgRklPUVNJWkUgZHVlIHRvIGEgaGlzdG9yaWNhbAorICogY29uZmxpY3Qgd2l0aCBhIEhheWVzIG1vZGVtLXNwZWNpZmljIGlvY3RsIHZhbHVlLgorICovCisjaWZuZGVmIEZJT1FTSVpFCisjIGRlZmluZSBGSU9RU0laRQkweDU0NjAKKyNlbmRpZgorCisvKiBVc2VkIGZvciBwYWNrZXQgbW9kZSAqLworI2RlZmluZSBUSU9DUEtUX0RBVEEJCSAwCisjZGVmaW5lIFRJT0NQS1RfRkxVU0hSRUFECSAxCisjZGVmaW5lIFRJT0NQS1RfRkxVU0hXUklURQkgMgorI2RlZmluZSBUSU9DUEtUX1NUT1AJCSA0CisjZGVmaW5lIFRJT0NQS1RfU1RBUlQJCSA4CisjZGVmaW5lIFRJT0NQS1RfTk9TVE9QCQkxNgorI2RlZmluZSBUSU9DUEtUX0RPU1RPUAkJMzIKKyNkZWZpbmUgVElPQ1BLVF9JT0NUTAkJNjQKKworI2RlZmluZSBUSU9DU0VSX1RFTVQJMHgwMQkvKiBUcmFuc21pdHRlciBwaHlzaWNhbGx5IGVtcHR5ICovCisKKyNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX0lPQ1RMU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2lwY2J1Zi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9pcGNidWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njk4MmIyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9pcGNidWYuaApAQCAtMCwwICsxLDM0IEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfSVBDQlVGX0gKKyNkZWZpbmUgX19BU01fR0VORVJJQ19JUENCVUZfSAorCisvKgorICogVGhlIGdlbmVyaWMgaXBjNjRfcGVybSBzdHJ1Y3R1cmU6CisgKiBOb3RlIGV4dHJhIHBhZGRpbmcgYmVjYXVzZSB0aGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgYmFjayBhbmQgZm9ydGgKKyAqIGJldHdlZW4ga2VybmVsIGFuZCB1c2VyIHNwYWNlLgorICoKKyAqIGlwYzY0X3Blcm0gd2FzIG9yaWdpbmFsbHkgbWVhbnQgdG8gYmUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljLCBidXQKKyAqIGV2ZXJ5b25lIGp1c3QgZW5kZWQgdXAgbWFraW5nIGlkZW50aWNhbCBjb3BpZXMgd2l0aG91dCBzcGVjaWZpYworICogb3B0aW1pemF0aW9ucywgc28gd2UgbWF5IGp1c3QgYXMgd2VsbCBhbGwgdXNlIHRoZSBzYW1lIG9uZS4KKyAqCisgKiBQYWQgc3BhY2UgaXMgbGVmdCBmb3I6CisgKiAtIDMyLWJpdCBtb2RlX3Qgb24gYXJjaGl0ZWN0dXJlcyB0aGF0IG9ubHkgaGFkIDE2IGJpdAorICogLSAzMi1iaXQgc2VxCisgKiAtIDIgbWlzY2VsbGFuZW91cyAzMi1iaXQgdmFsdWVzCisgKi8KKworc3RydWN0IGlwYzY0X3Blcm0geworCV9fa2VybmVsX2tleV90CQlrZXk7CisJX19rZXJuZWxfdWlkMzJfdAl1aWQ7CisJX19rZXJuZWxfZ2lkMzJfdAlnaWQ7CisJX19rZXJuZWxfdWlkMzJfdAljdWlkOworCV9fa2VybmVsX2dpZDMyX3QJY2dpZDsKKwlfX2tlcm5lbF9tb2RlX3QJCW1vZGU7CisJCQkJLyogcGFkIGlmIG1vZGVfdCBpcyB1MTY6ICovCisJdW5zaWduZWQgY2hhcgkJX19wYWQxWzQgLSBzaXplb2YoX19rZXJuZWxfbW9kZV90KV07CisJdW5zaWduZWQgc2hvcnQJCXNlcTsKKwl1bnNpZ25lZCBzaG9ydAkJX19wYWQyOworCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkMTsKKwl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDI7Cit9OworCisjZW5kaWYgLyogX19BU01fR0VORVJJQ19JUENCVUZfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9tbWFuLWNvbW1vbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9tbWFuLWNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4N2FiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL21tYW4tY29tbW9uLmgKQEAgLTAsMCArMSw1NCBAQAorI2lmbmRlZiBfX0FTTV9HRU5FUklDX01NQU5fQ09NTU9OX0gKKyNkZWZpbmUgX19BU01fR0VORVJJQ19NTUFOX0NPTU1PTl9ICisKKy8qCisgQXV0aG9yOiBNaWNoYWVsIFMuIFRzaXJraW4gPG1zdEBtZWxsYW5veC5jby5pbD4sIE1lbGxhbm94IFRlY2hub2xvZ2llcyBMdGQuCisgQmFzZWQgb246IGFzbS14eHgvbW1hbi5oCisqLworCisjZGVmaW5lIFBST1RfUkVBRAkweDEJCS8qIHBhZ2UgY2FuIGJlIHJlYWQgKi8KKyNkZWZpbmUgUFJPVF9XUklURQkweDIJCS8qIHBhZ2UgY2FuIGJlIHdyaXR0ZW4gKi8KKyNkZWZpbmUgUFJPVF9FWEVDCTB4NAkJLyogcGFnZSBjYW4gYmUgZXhlY3V0ZWQgKi8KKyNkZWZpbmUgUFJPVF9TRU0JMHg4CQkvKiBwYWdlIG1heSBiZSB1c2VkIGZvciBhdG9taWMgb3BzICovCisjZGVmaW5lIFBST1RfTk9ORQkweDAJCS8qIHBhZ2UgY2FuIG5vdCBiZSBhY2Nlc3NlZCAqLworI2RlZmluZSBQUk9UX0dST1dTRE9XTgkweDAxMDAwMDAwCS8qIG1wcm90ZWN0IGZsYWc6IGV4dGVuZCBjaGFuZ2UgdG8gc3RhcnQgb2YgZ3Jvd3Nkb3duIHZtYSAqLworI2RlZmluZSBQUk9UX0dST1dTVVAJMHgwMjAwMDAwMAkvKiBtcHJvdGVjdCBmbGFnOiBleHRlbmQgY2hhbmdlIHRvIGVuZCBvZiBncm93c3VwIHZtYSAqLworCisjZGVmaW5lIE1BUF9TSEFSRUQJMHgwMQkJLyogU2hhcmUgY2hhbmdlcyAqLworI2RlZmluZSBNQVBfUFJJVkFURQkweDAyCQkvKiBDaGFuZ2VzIGFyZSBwcml2YXRlICovCisjZGVmaW5lIE1BUF9UWVBFCTB4MGYJCS8qIE1hc2sgZm9yIHR5cGUgb2YgbWFwcGluZyAqLworI2RlZmluZSBNQVBfRklYRUQJMHgxMAkJLyogSW50ZXJwcmV0IGFkZHIgZXhhY3RseSAqLworI2RlZmluZSBNQVBfQU5PTllNT1VTCTB4MjAJCS8qIGRvbid0IHVzZSBhIGZpbGUgKi8KKyNpZmRlZiBDT05GSUdfTU1BUF9BTExPV19VTklOSVRJQUxJWkVECisjIGRlZmluZSBNQVBfVU5JTklUSUFMSVpFRCAweDQwMDAwMDAJLyogRm9yIGFub255bW91cyBtbWFwLCBtZW1vcnkgY291bGQgYmUgdW5pbml0aWFsaXplZCAqLworI2Vsc2UKKyMgZGVmaW5lIE1BUF9VTklOSVRJQUxJWkVEIDB4MAkJLyogRG9uJ3Qgc3VwcG9ydCB0aGlzIGZsYWcgKi8KKyNlbmRpZgorCisjZGVmaW5lIE1TX0FTWU5DCTEJCS8qIHN5bmMgbWVtb3J5IGFzeW5jaHJvbm91c2x5ICovCisjZGVmaW5lIE1TX0lOVkFMSURBVEUJMgkJLyogaW52YWxpZGF0ZSB0aGUgY2FjaGVzICovCisjZGVmaW5lIE1TX1NZTkMJCTQJCS8qIHN5bmNocm9ub3VzIG1lbW9yeSBzeW5jICovCisKKyNkZWZpbmUgTUFEVl9OT1JNQUwJMAkJLyogbm8gZnVydGhlciBzcGVjaWFsIHRyZWF0bWVudCAqLworI2RlZmluZSBNQURWX1JBTkRPTQkxCQkvKiBleHBlY3QgcmFuZG9tIHBhZ2UgcmVmZXJlbmNlcyAqLworI2RlZmluZSBNQURWX1NFUVVFTlRJQUwJMgkJLyogZXhwZWN0IHNlcXVlbnRpYWwgcGFnZSByZWZlcmVuY2VzICovCisjZGVmaW5lIE1BRFZfV0lMTE5FRUQJMwkJLyogd2lsbCBuZWVkIHRoZXNlIHBhZ2VzICovCisjZGVmaW5lIE1BRFZfRE9OVE5FRUQJNAkJLyogZG9uJ3QgbmVlZCB0aGVzZSBwYWdlcyAqLworCisvKiBjb21tb24gcGFyYW1ldGVyczogdHJ5IHRvIGtlZXAgdGhlc2UgY29uc2lzdGVudCBhY3Jvc3MgYXJjaGl0ZWN0dXJlcyAqLworI2RlZmluZSBNQURWX1JFTU9WRQk5CQkvKiByZW1vdmUgdGhlc2UgcGFnZXMgJiByZXNvdXJjZXMgKi8KKyNkZWZpbmUgTUFEVl9ET05URk9SSwkxMAkJLyogZG9uJ3QgaW5oZXJpdCBhY3Jvc3MgZm9yayAqLworI2RlZmluZSBNQURWX0RPRk9SSwkxMQkJLyogZG8gaW5oZXJpdCBhY3Jvc3MgZm9yayAqLworI2RlZmluZSBNQURWX0hXUE9JU09OCTEwMAkJLyogcG9pc29uIGEgcGFnZSBmb3IgdGVzdGluZyAqLworI2RlZmluZSBNQURWX1NPRlRfT0ZGTElORSAxMDEJCS8qIHNvZnQgb2ZmbGluZSBwYWdlIGZvciB0ZXN0aW5nICovCisKKyNkZWZpbmUgTUFEVl9NRVJHRUFCTEUgICAxMgkJLyogS1NNIG1heSBtZXJnZSBpZGVudGljYWwgcGFnZXMgKi8KKyNkZWZpbmUgTUFEVl9VTk1FUkdFQUJMRSAxMwkJLyogS1NNIG1heSBub3QgbWVyZ2UgaWRlbnRpY2FsIHBhZ2VzICovCisKKyNkZWZpbmUgTUFEVl9IVUdFUEFHRQkxNAkJLyogV29ydGggYmFja2luZyB3aXRoIGh1Z2VwYWdlcyAqLworI2RlZmluZSBNQURWX05PSFVHRVBBR0UJMTUJCS8qIE5vdCB3b3J0aCBiYWNraW5nIHdpdGggaHVnZXBhZ2VzICovCisKKy8qIGNvbXBhdGliaWxpdHkgZmxhZ3MgKi8KKyNkZWZpbmUgTUFQX0ZJTEUJMAorCisjZW5kaWYgLyogX19BU01fR0VORVJJQ19NTUFOX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL21tYW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYzhiZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL21tYW4uaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfTU1BTl9ICisjZGVmaW5lIF9fQVNNX0dFTkVSSUNfTU1BTl9ICisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tbWFuLWNvbW1vbi5oPgorCisjZGVmaW5lIE1BUF9HUk9XU0RPV04JMHgwMTAwCQkvKiBzdGFjay1saWtlIHNlZ21lbnQgKi8KKyNkZWZpbmUgTUFQX0RFTllXUklURQkweDA4MDAJCS8qIEVUWFRCU1kgKi8KKyNkZWZpbmUgTUFQX0VYRUNVVEFCTEUJMHgxMDAwCQkvKiBtYXJrIGl0IGFzIGFuIGV4ZWN1dGFibGUgKi8KKyNkZWZpbmUgTUFQX0xPQ0tFRAkweDIwMDAJCS8qIHBhZ2VzIGFyZSBsb2NrZWQgKi8KKyNkZWZpbmUgTUFQX05PUkVTRVJWRQkweDQwMDAJCS8qIGRvbid0IGNoZWNrIGZvciByZXNlcnZhdGlvbnMgKi8KKyNkZWZpbmUgTUFQX1BPUFVMQVRFCTB4ODAwMAkJLyogcG9wdWxhdGUgKHByZWZhdWx0KSBwYWdldGFibGVzICovCisjZGVmaW5lIE1BUF9OT05CTE9DSwkweDEwMDAwCQkvKiBkbyBub3QgYmxvY2sgb24gSU8gKi8KKyNkZWZpbmUgTUFQX1NUQUNLCTB4MjAwMDAJCS8qIGdpdmUgb3V0IGFuIGFkZHJlc3MgdGhhdCBpcyBiZXN0IHN1aXRlZCBmb3IgcHJvY2Vzcy90aHJlYWQgc3RhY2tzICovCisjZGVmaW5lIE1BUF9IVUdFVExCCTB4NDAwMDAJCS8qIGNyZWF0ZSBhIGh1Z2UgcGFnZSBtYXBwaW5nICovCisKKyNkZWZpbmUgTUNMX0NVUlJFTlQJMQkJLyogbG9jayBhbGwgY3VycmVudCBtYXBwaW5ncyAqLworI2RlZmluZSBNQ0xfRlVUVVJFCTIJCS8qIGxvY2sgYWxsIGZ1dHVyZSBtYXBwaW5ncyAqLworCisjZW5kaWYgLyogX19BU01fR0VORVJJQ19NTUFOX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvbXNnYnVmLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL21zZ2J1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYzg1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL21zZ2J1Zi5oCkBAIC0wLDAgKzEsNDcgQEAKKyNpZm5kZWYgX19BU01fR0VORVJJQ19NU0dCVUZfSAorI2RlZmluZSBfX0FTTV9HRU5FUklDX01TR0JVRl9ICisKKyNpbmNsdWRlIDxhc20vYml0c3BlcmxvbmcuaD4KKy8qCisgKiBnZW5lcmljIG1zcWlkNjRfZHMgc3RydWN0dXJlLgorICoKKyAqIE5vdGUgZXh0cmEgcGFkZGluZyBiZWNhdXNlIHRoaXMgc3RydWN0dXJlIGlzIHBhc3NlZCBiYWNrIGFuZCBmb3J0aAorICogYmV0d2VlbiBrZXJuZWwgYW5kIHVzZXIgc3BhY2UuCisgKgorICogbXNxaWQ2NF9kcyB3YXMgb3JpZ2luYWxseSBtZWFudCB0byBiZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMsIGJ1dAorICogZXZlcnlvbmUganVzdCBlbmRlZCB1cCBtYWtpbmcgaWRlbnRpY2FsIGNvcGllcyB3aXRob3V0IHNwZWNpZmljCisgKiBvcHRpbWl6YXRpb25zLCBzbyB3ZSBtYXkganVzdCBhcyB3ZWxsIGFsbCB1c2UgdGhlIHNhbWUgb25lLgorICoKKyAqIDY0IGJpdCBhcmNoaXRlY3R1cmVzIHR5cGljYWxseSBkZWZpbmUgYSA2NCBiaXQgX19rZXJuZWxfdGltZV90LAorICogc28gdGhleSBkbyBub3QgbmVlZCB0aGUgZmlyc3QgdGhyZWUgcGFkZGluZyB3b3Jkcy4KKyAqIE9uIGJpZy1lbmRpYW4gc3lzdGVtcywgdGhlIHBhZGRpbmcgaXMgaW4gdGhlIHdyb25nIHBsYWNlLgorICoKKyAqIFBhZCBzcGFjZSBpcyBsZWZ0IGZvcjoKKyAqIC0gNjQtYml0IHRpbWVfdCB0byBzb2x2ZSB5MjAzOCBwcm9ibGVtCisgKiAtIDIgbWlzY2VsbGFuZW91cyAzMi1iaXQgdmFsdWVzCisgKi8KKworc3RydWN0IG1zcWlkNjRfZHMgeworCXN0cnVjdCBpcGM2NF9wZXJtIG1zZ19wZXJtOworCV9fa2VybmVsX3RpbWVfdCBtc2dfc3RpbWU7CS8qIGxhc3QgbXNnc25kIHRpbWUgKi8KKyNpZiBfX0JJVFNfUEVSX0xPTkcgIT0gNjQKKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkMTsKKyNlbmRpZgorCV9fa2VybmVsX3RpbWVfdCBtc2dfcnRpbWU7CS8qIGxhc3QgbXNncmN2IHRpbWUgKi8KKyNpZiBfX0JJVFNfUEVSX0xPTkcgIT0gNjQKKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkMjsKKyNlbmRpZgorCV9fa2VybmVsX3RpbWVfdCBtc2dfY3RpbWU7CS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KKyNpZiBfX0JJVFNfUEVSX0xPTkcgIT0gNjQKKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkMzsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgIG1zZ19jYnl0ZXM7CS8qIGN1cnJlbnQgbnVtYmVyIG9mIGJ5dGVzIG9uIHF1ZXVlICovCisJdW5zaWduZWQgbG9uZyAgbXNnX3FudW07CS8qIG51bWJlciBvZiBtZXNzYWdlcyBpbiBxdWV1ZSAqLworCXVuc2lnbmVkIGxvbmcgIG1zZ19xYnl0ZXM7CS8qIG1heCBudW1iZXIgb2YgYnl0ZXMgb24gcXVldWUgKi8KKwlfX2tlcm5lbF9waWRfdCBtc2dfbHNwaWQ7CS8qIHBpZCBvZiBsYXN0IG1zZ3NuZCAqLworCV9fa2VybmVsX3BpZF90IG1zZ19scnBpZDsJLyogbGFzdCByZWNlaXZlIHBpZCAqLworCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkNDsKKwl1bnNpZ25lZCBsb25nICBfX3VudXNlZDU7Cit9OworCisjZW5kaWYgLyogX19BU01fR0VORVJJQ19NU0dCVUZfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9wYXJhbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9wYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NGVlY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3BhcmFtLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfX0FTTV9HRU5FUklDX1BBUkFNX0gKKyNkZWZpbmUgX19BU01fR0VORVJJQ19QQVJBTV9ICisKKworI2lmbmRlZiBIWgorI2RlZmluZSBIWiAxMDAKKyNlbmRpZgorCisjaWZuZGVmIEVYRUNfUEFHRVNJWkUKKyNkZWZpbmUgRVhFQ19QQUdFU0laRQk0MDk2CisjZW5kaWYKKworI2lmbmRlZiBOT0dST1VQCisjZGVmaW5lIE5PR1JPVVAJCSgtMSkKKyNlbmRpZgorCisjZGVmaW5lIE1BWEhPU1ROQU1FTEVOCTY0CS8qIG1heCBsZW5ndGggb2YgaG9zdG5hbWUgKi8KKworI2VuZGlmIC8qIF9fQVNNX0dFTkVSSUNfUEFSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9wb2xsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3BvbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2U3ZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9wb2xsLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBfX0FTTV9HRU5FUklDX1BPTExfSAorI2RlZmluZSBfX0FTTV9HRU5FUklDX1BPTExfSAorCisvKiBUaGVzZSBhcmUgc3BlY2lmaWVkIGJ5IGlCQ1MyICovCisjZGVmaW5lIFBPTExJTgkJMHgwMDAxCisjZGVmaW5lIFBPTExQUkkJCTB4MDAwMgorI2RlZmluZSBQT0xMT1VUCQkweDAwMDQKKyNkZWZpbmUgUE9MTEVSUgkJMHgwMDA4CisjZGVmaW5lIFBPTExIVVAJCTB4MDAxMAorI2RlZmluZSBQT0xMTlZBTAkweDAwMjAKKworLyogVGhlIHJlc3Qgc2VlbSB0byBiZSBtb3JlLW9yLWxlc3Mgbm9uc3RhbmRhcmQuIENoZWNrIHRoZW0hICovCisjZGVmaW5lIFBPTExSRE5PUk0JMHgwMDQwCisjZGVmaW5lIFBPTExSREJBTkQJMHgwMDgwCisjaWZuZGVmIFBPTExXUk5PUk0KKyNkZWZpbmUgUE9MTFdSTk9STQkweDAxMDAKKyNlbmRpZgorI2lmbmRlZiBQT0xMV1JCQU5ECisjZGVmaW5lIFBPTExXUkJBTkQJMHgwMjAwCisjZW5kaWYKKyNpZm5kZWYgUE9MTE1TRworI2RlZmluZSBQT0xMTVNHCQkweDA0MDAKKyNlbmRpZgorI2lmbmRlZiBQT0xMUkVNT1ZFCisjZGVmaW5lIFBPTExSRU1PVkUJMHgxMDAwCisjZW5kaWYKKyNpZm5kZWYgUE9MTFJESFVQCisjZGVmaW5lIFBPTExSREhVUCAgICAgICAweDIwMDAKKyNlbmRpZgorCisjZGVmaW5lIFBPTExGUkVFCTB4NDAwMAkvKiBjdXJyZW50bHkgb25seSBmb3IgZXBvbGwgKi8KKworc3RydWN0IHBvbGxmZCB7CisJaW50IGZkOworCXNob3J0IGV2ZW50czsKKwlzaG9ydCByZXZlbnRzOworfTsKKworI2VuZGlmCS8qIF9fQVNNX0dFTkVSSUNfUE9MTF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3Bvc2l4X3R5cGVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3Bvc2l4X3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNjODdkYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvcG9zaXhfdHlwZXMuaApAQCAtMCwwICsxLDk0IEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfUE9TSVhfVFlQRVNfSAorI2RlZmluZSBfX0FTTV9HRU5FUklDX1BPU0lYX1RZUEVTX0gKKworI2luY2x1ZGUgPGFzbS9iaXRzcGVybG9uZy5oPgorLyoKKyAqIFRoaXMgZmlsZSBpcyBnZW5lcmFsbHkgdXNlZCBieSB1c2VyLWxldmVsIHNvZnR3YXJlLCBzbyB5b3UgbmVlZCB0bworICogYmUgYSBsaXR0bGUgY2FyZWZ1bCBhYm91dCBuYW1lc3BhY2UgcG9sbHV0aW9uIGV0Yy4KKyAqCisgKiBGaXJzdCB0aGUgdHlwZXMgdGhhdCBhcmUgb2Z0ZW4gZGVmaW5lZCBpbiBkaWZmZXJlbnQgd2F5cyBhY3Jvc3MKKyAqIGFyY2hpdGVjdHVyZXMsIHNvIHRoYXQgeW91IGNhbiBvdmVycmlkZSB0aGVtLgorICovCisKKyNpZm5kZWYgX19rZXJuZWxfaW5vX3QKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlfX2tlcm5lbF9pbm9fdDsKKyNlbmRpZgorCisjaWZuZGVmIF9fa2VybmVsX21vZGVfdAordHlwZWRlZiB1bnNpZ25lZCBpbnQJX19rZXJuZWxfbW9kZV90OworI2VuZGlmCisKKyNpZm5kZWYgX19rZXJuZWxfbmxpbmtfdAordHlwZWRlZiB1bnNpZ25lZCBsb25nCV9fa2VybmVsX25saW5rX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfX2tlcm5lbF9waWRfdAordHlwZWRlZiBpbnQJCV9fa2VybmVsX3BpZF90OworI2VuZGlmCisKKyNpZm5kZWYgX19rZXJuZWxfaXBjX3BpZF90Cit0eXBlZGVmIGludAkJX19rZXJuZWxfaXBjX3BpZF90OworI2VuZGlmCisKKyNpZm5kZWYgX19rZXJuZWxfdWlkX3QKK3R5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX3VpZF90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJX19rZXJuZWxfZ2lkX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfX2tlcm5lbF9zdXNlY29uZHNfdAordHlwZWRlZiBsb25nCQlfX2tlcm5lbF9zdXNlY29uZHNfdDsKKyNlbmRpZgorCisjaWZuZGVmIF9fa2VybmVsX2RhZGRyX3QKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9kYWRkcl90OworI2VuZGlmCisKKyNpZm5kZWYgX19rZXJuZWxfdWlkMzJfdAordHlwZWRlZiBfX2tlcm5lbF91aWRfdAlfX2tlcm5lbF91aWQzMl90OwordHlwZWRlZiBfX2tlcm5lbF9naWRfdAlfX2tlcm5lbF9naWQzMl90OworI2VuZGlmCisKKyNpZm5kZWYgX19rZXJuZWxfb2xkX3VpZF90Cit0eXBlZGVmIF9fa2VybmVsX3VpZF90CV9fa2VybmVsX29sZF91aWRfdDsKK3R5cGVkZWYgX19rZXJuZWxfZ2lkX3QJX19rZXJuZWxfb2xkX2dpZF90OworI2VuZGlmCisKKyNpZm5kZWYgX19rZXJuZWxfb2xkX2Rldl90Cit0eXBlZGVmIHVuc2lnbmVkIGludAlfX2tlcm5lbF9vbGRfZGV2X3Q7CisjZW5kaWYKKworLyoKKyAqIE1vc3QgMzIgYml0IGFyY2hpdGVjdHVyZXMgdXNlICJ1bnNpZ25lZCBpbnQiIHNpemVfdCwKKyAqIGFuZCBhbGwgNjQgYml0IGFyY2hpdGVjdHVyZXMgdXNlICJ1bnNpZ25lZCBsb25nIiBzaXplX3QuCisgKi8KKyNpZm5kZWYgX19rZXJuZWxfc2l6ZV90CisjaWYgX19CSVRTX1BFUl9MT05HICE9IDY0Cit0eXBlZGVmIHVuc2lnbmVkIGludAlfX2tlcm5lbF9zaXplX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfc3NpemVfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9wdHJkaWZmX3Q7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nCV9fa2VybmVsX3NpemVfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfc3NpemVfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfcHRyZGlmZl90OworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIGFueXRoaW5nIGJlbG93IGhlcmUgc2hvdWxkIGJlIGNvbXBsZXRlbHkgZ2VuZXJpYworICovCit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX29mZl90OwordHlwZWRlZiBsb25nIGxvbmcJX19rZXJuZWxfbG9mZl90OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF90aW1lX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX2Nsb2NrX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfdGltZXJfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9jbG9ja2lkX3Q7Cit0eXBlZGVmIGNoYXIgKgkJX19rZXJuZWxfY2FkZHJfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfdWlkMTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfZ2lkMTZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludAl2YWxbMl07Cit9IF9fa2VybmVsX2ZzaWRfdDsKKworCisjZW5kaWYgLyogX19BU01fR0VORVJJQ19QT1NJWF9UWVBFU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3Jlc291cmNlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3Jlc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM2ZGE4NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvcmVzb3VyY2UuaApAQCAtMCwwICsxLDY4IEBACisjaWZuZGVmIF9BU01fR0VORVJJQ19SRVNPVVJDRV9ICisjZGVmaW5lIF9BU01fR0VORVJJQ19SRVNPVVJDRV9ICisKKy8qCisgKiBSZXNvdXJjZSBsaW1pdCBJRHMKKyAqCisgKiAoIENvbXBhdGliaWxpdHkgZGV0YWlsOiB0aGVyZSBhcmUgYXJjaGl0ZWN0dXJlcyB0aGF0IGhhdmUKKyAqICAgYSBkaWZmZXJlbnQgcmxpbWl0IElEIG9yZGVyIGluIHRoZSA1LTkgcmFuZ2UgYW5kIHdhbnQKKyAqICAgdG8ga2VlcCB0aGF0IG9yZGVyIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eS4gVGhlIHJlYXNvbnMKKyAqICAgYXJlIGhpc3RvcmljIGFuZCBhbGwgbmV3IHJsaW1pdHMgYXJlIGlkZW50aWNhbCBhY3Jvc3MgYWxsCisgKiAgIGFyY2hlcy4gSWYgYW4gYXJjaCBoYXMgc3VjaCBzcGVjaWFsIG9yZGVyIGZvciBzb21lIHJsaW1pdHMKKyAqICAgdGhlbiBpdCBkZWZpbmVzIHRoZW0gcHJpb3IgaW5jbHVkaW5nIGFzbS1nZW5lcmljL3Jlc291cmNlLmguICkKKyAqLworCisjZGVmaW5lIFJMSU1JVF9DUFUJCTAJLyogQ1BVIHRpbWUgaW4gc2VjICovCisjZGVmaW5lIFJMSU1JVF9GU0laRQkJMQkvKiBNYXhpbXVtIGZpbGVzaXplICovCisjZGVmaW5lIFJMSU1JVF9EQVRBCQkyCS8qIG1heCBkYXRhIHNpemUgKi8KKyNkZWZpbmUgUkxJTUlUX1NUQUNLCQkzCS8qIG1heCBzdGFjayBzaXplICovCisjZGVmaW5lIFJMSU1JVF9DT1JFCQk0CS8qIG1heCBjb3JlIGZpbGUgc2l6ZSAqLworCisjaWZuZGVmIFJMSU1JVF9SU1MKKyMgZGVmaW5lIFJMSU1JVF9SU1MJCTUJLyogbWF4IHJlc2lkZW50IHNldCBzaXplICovCisjZW5kaWYKKworI2lmbmRlZiBSTElNSVRfTlBST0MKKyMgZGVmaW5lIFJMSU1JVF9OUFJPQwkJNgkvKiBtYXggbnVtYmVyIG9mIHByb2Nlc3NlcyAqLworI2VuZGlmCisKKyNpZm5kZWYgUkxJTUlUX05PRklMRQorIyBkZWZpbmUgUkxJTUlUX05PRklMRQkJNwkvKiBtYXggbnVtYmVyIG9mIG9wZW4gZmlsZXMgKi8KKyNlbmRpZgorCisjaWZuZGVmIFJMSU1JVF9NRU1MT0NLCisjIGRlZmluZSBSTElNSVRfTUVNTE9DSwkJOAkvKiBtYXggbG9ja2VkLWluLW1lbW9yeSBhZGRyZXNzIHNwYWNlICovCisjZW5kaWYKKworI2lmbmRlZiBSTElNSVRfQVMKKyMgZGVmaW5lIFJMSU1JVF9BUwkJOQkvKiBhZGRyZXNzIHNwYWNlIGxpbWl0ICovCisjZW5kaWYKKworI2RlZmluZSBSTElNSVRfTE9DS1MJCTEwCS8qIG1heGltdW0gZmlsZSBsb2NrcyBoZWxkICovCisjZGVmaW5lIFJMSU1JVF9TSUdQRU5ESU5HCTExCS8qIG1heCBudW1iZXIgb2YgcGVuZGluZyBzaWduYWxzICovCisjZGVmaW5lIFJMSU1JVF9NU0dRVUVVRQkJMTIJLyogbWF4aW11bSBieXRlcyBpbiBQT1NJWCBtcXVldWVzICovCisjZGVmaW5lIFJMSU1JVF9OSUNFCQkxMwkvKiBtYXggbmljZSBwcmlvIGFsbG93ZWQgdG8gcmFpc2UgdG8KKwkJCQkJICAgMC0zOSBmb3IgbmljZSBsZXZlbCAxOSAuLiAtMjAgKi8KKyNkZWZpbmUgUkxJTUlUX1JUUFJJTwkJMTQJLyogbWF4aW11bSByZWFsdGltZSBwcmlvcml0eSAqLworI2RlZmluZSBSTElNSVRfUlRUSU1FCQkxNQkvKiB0aW1lb3V0IGZvciBSVCB0YXNrcyBpbiB1cyAqLworI2RlZmluZSBSTElNX05MSU1JVFMJCTE2CisKKy8qCisgKiBTdVMgc2F5cyBsaW1pdHMgaGF2ZSB0byBiZSB1bnNpZ25lZC4KKyAqIFdoaWNoIG1ha2VzIGEgdG9uIG1vcmUgc2Vuc2UgYW55d2F5LgorICoKKyAqIFNvbWUgYXJjaGl0ZWN0dXJlcyBvdmVycmlkZSB0aGlzIChmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zKToKKyAqLworI2lmbmRlZiBSTElNX0lORklOSVRZCisjIGRlZmluZSBSTElNX0lORklOSVRZCQkofjBVTCkKKyNlbmRpZgorCisvKgorICogUkxJTUlUX1NUQUNLIGRlZmF1bHQgbWF4aW11bSAtIHNvbWUgYXJjaGl0ZWN0dXJlcyBvdmVycmlkZSBpdDoKKyAqLworI2lmbmRlZiBfU1RLX0xJTV9NQVgKKyMgZGVmaW5lIF9TVEtfTElNX01BWAkJUkxJTV9JTkZJTklUWQorI2VuZGlmCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NlbWJ1Zi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zZW1idWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2IyYzEzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zZW1idWYuaApAQCAtMCwwICsxLDM4IEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfU0VNQlVGX0gKKyNkZWZpbmUgX19BU01fR0VORVJJQ19TRU1CVUZfSAorCisjaW5jbHVkZSA8YXNtL2JpdHNwZXJsb25nLmg+CisKKy8qCisgKiBUaGUgc2VtaWQ2NF9kcyBzdHJ1Y3R1cmUgZm9yIHg4NiBhcmNoaXRlY3R1cmUuCisgKiBOb3RlIGV4dHJhIHBhZGRpbmcgYmVjYXVzZSB0aGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgYmFjayBhbmQgZm9ydGgKKyAqIGJldHdlZW4ga2VybmVsIGFuZCB1c2VyIHNwYWNlLgorICoKKyAqIHNlbWlkNjRfZHMgd2FzIG9yaWdpbmFsbHkgbWVhbnQgdG8gYmUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljLCBidXQKKyAqIGV2ZXJ5b25lIGp1c3QgZW5kZWQgdXAgbWFraW5nIGlkZW50aWNhbCBjb3BpZXMgd2l0aG91dCBzcGVjaWZpYworICogb3B0aW1pemF0aW9ucywgc28gd2UgbWF5IGp1c3QgYXMgd2VsbCBhbGwgdXNlIHRoZSBzYW1lIG9uZS4KKyAqCisgKiA2NCBiaXQgYXJjaGl0ZWN0dXJlcyB0eXBpY2FsbHkgZGVmaW5lIGEgNjQgYml0IF9fa2VybmVsX3RpbWVfdCwKKyAqIHNvIHRoZXkgZG8gbm90IG5lZWQgdGhlIGZpcnN0IHR3byBwYWRkaW5nIHdvcmRzLgorICogT24gYmlnLWVuZGlhbiBzeXN0ZW1zLCB0aGUgcGFkZGluZyBpcyBpbiB0aGUgd3JvbmcgcGxhY2UuCisgKgorICogUGFkIHNwYWNlIGlzIGxlZnQgZm9yOgorICogLSA2NC1iaXQgdGltZV90IHRvIHNvbHZlIHkyMDM4IHByb2JsZW0KKyAqIC0gMiBtaXNjZWxsYW5lb3VzIDMyLWJpdCB2YWx1ZXMKKyAqLworc3RydWN0IHNlbWlkNjRfZHMgeworCXN0cnVjdCBpcGM2NF9wZXJtIHNlbV9wZXJtOwkvKiBwZXJtaXNzaW9ucyAuLiBzZWUgaXBjLmggKi8KKwlfX2tlcm5lbF90aW1lX3QJc2VtX290aW1lOwkvKiBsYXN0IHNlbW9wIHRpbWUgKi8KKyNpZiBfX0JJVFNfUEVSX0xPTkcgIT0gNjQKKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkMTsKKyNlbmRpZgorCV9fa2VybmVsX3RpbWVfdAlzZW1fY3RpbWU7CS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KKyNpZiBfX0JJVFNfUEVSX0xPTkcgIT0gNjQKKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkMjsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcJc2VtX25zZW1zOwkvKiBuby4gb2Ygc2VtYXBob3JlcyBpbiBhcnJheSAqLworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQzOworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQ0OworfTsKKworI2VuZGlmIC8qIF9fQVNNX0dFTkVSSUNfU0VNQlVGX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc2V0dXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc2V0dXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmMyNmE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zZXR1cC5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfX0FTTV9HRU5FUklDX1NFVFVQX0gKKyNkZWZpbmUgX19BU01fR0VORVJJQ19TRVRVUF9ICisKKyNkZWZpbmUgQ09NTUFORF9MSU5FX1NJWkUJNTEyCisKKyNlbmRpZgkvKiBfX0FTTV9HRU5FUklDX1NFVFVQX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc2htYnVmLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NobWJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NjhmYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NobWJ1Zi5oCkBAIC0wLDAgKzEsNTkgQEAKKyNpZm5kZWYgX19BU01fR0VORVJJQ19TSE1CVUZfSAorI2RlZmluZSBfX0FTTV9HRU5FUklDX1NITUJVRl9ICisKKyNpbmNsdWRlIDxhc20vYml0c3BlcmxvbmcuaD4KKworLyoKKyAqIFRoZSBzaG1pZDY0X2RzIHN0cnVjdHVyZSBmb3IgeDg2IGFyY2hpdGVjdHVyZS4KKyAqIE5vdGUgZXh0cmEgcGFkZGluZyBiZWNhdXNlIHRoaXMgc3RydWN0dXJlIGlzIHBhc3NlZCBiYWNrIGFuZCBmb3J0aAorICogYmV0d2VlbiBrZXJuZWwgYW5kIHVzZXIgc3BhY2UuCisgKgorICogc2htaWQ2NF9kcyB3YXMgb3JpZ2luYWxseSBtZWFudCB0byBiZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMsIGJ1dAorICogZXZlcnlvbmUganVzdCBlbmRlZCB1cCBtYWtpbmcgaWRlbnRpY2FsIGNvcGllcyB3aXRob3V0IHNwZWNpZmljCisgKiBvcHRpbWl6YXRpb25zLCBzbyB3ZSBtYXkganVzdCBhcyB3ZWxsIGFsbCB1c2UgdGhlIHNhbWUgb25lLgorICoKKyAqIDY0IGJpdCBhcmNoaXRlY3R1cmVzIHR5cGljYWxseSBkZWZpbmUgYSA2NCBiaXQgX19rZXJuZWxfdGltZV90LAorICogc28gdGhleSBkbyBub3QgbmVlZCB0aGUgZmlyc3QgdHdvIHBhZGRpbmcgd29yZHMuCisgKiBPbiBiaWctZW5kaWFuIHN5c3RlbXMsIHRoZSBwYWRkaW5nIGlzIGluIHRoZSB3cm9uZyBwbGFjZS4KKyAqCisgKgorICogUGFkIHNwYWNlIGlzIGxlZnQgZm9yOgorICogLSA2NC1iaXQgdGltZV90IHRvIHNvbHZlIHkyMDM4IHByb2JsZW0KKyAqIC0gMiBtaXNjZWxsYW5lb3VzIDMyLWJpdCB2YWx1ZXMKKyAqLworCitzdHJ1Y3Qgc2htaWQ2NF9kcyB7CisJc3RydWN0IGlwYzY0X3Blcm0Jc2htX3Blcm07CS8qIG9wZXJhdGlvbiBwZXJtcyAqLworCXNpemVfdAkJCXNobV9zZWdzejsJLyogc2l6ZSBvZiBzZWdtZW50IChieXRlcykgKi8KKwlfX2tlcm5lbF90aW1lX3QJCXNobV9hdGltZTsJLyogbGFzdCBhdHRhY2ggdGltZSAqLworI2lmIF9fQklUU19QRVJfTE9ORyAhPSA2NAorCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkMTsKKyNlbmRpZgorCV9fa2VybmVsX3RpbWVfdAkJc2htX2R0aW1lOwkvKiBsYXN0IGRldGFjaCB0aW1lICovCisjaWYgX19CSVRTX1BFUl9MT05HICE9IDY0CisJdW5zaWduZWQgbG9uZwkJX191bnVzZWQyOworI2VuZGlmCisJX19rZXJuZWxfdGltZV90CQlzaG1fY3RpbWU7CS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KKyNpZiBfX0JJVFNfUEVSX0xPTkcgIT0gNjQKKwl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDM7CisjZW5kaWYKKwlfX2tlcm5lbF9waWRfdAkJc2htX2NwaWQ7CS8qIHBpZCBvZiBjcmVhdG9yICovCisJX19rZXJuZWxfcGlkX3QJCXNobV9scGlkOwkvKiBwaWQgb2YgbGFzdCBvcGVyYXRvciAqLworCXVuc2lnbmVkIGxvbmcJCXNobV9uYXR0Y2g7CS8qIG5vLiBvZiBjdXJyZW50IGF0dGFjaGVzICovCisJdW5zaWduZWQgbG9uZwkJX191bnVzZWQ0OworCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkNTsKK307CisKK3N0cnVjdCBzaG1pbmZvNjQgeworCXVuc2lnbmVkIGxvbmcJc2htbWF4OworCXVuc2lnbmVkIGxvbmcJc2htbWluOworCXVuc2lnbmVkIGxvbmcJc2htbW5pOworCXVuc2lnbmVkIGxvbmcJc2htc2VnOworCXVuc2lnbmVkIGxvbmcJc2htYWxsOworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQxOworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQyOworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQzOworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQ0OworfTsKKworI2VuZGlmIC8qIF9fQVNNX0dFTkVSSUNfU0hNQlVGX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc2htcGFyYW0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc2htcGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWEzODUyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zaG1wYXJhbS5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfX0FTTV9HRU5FUklDX1NITVBBUkFNX0gKKyNkZWZpbmUgX19BU01fR0VORVJJQ19TSE1QQVJBTV9ICisKKyNkZWZpbmUgU0hNTEJBIFBBR0VfU0laRQkgLyogYXR0YWNoIGFkZHIgYSBtdWx0aXBsZSBvZiB0aGlzICovCisKKyNlbmRpZiAvKiBfQVNNX0dFTkVSSUNfU0hNUEFSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWdpbmZvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NpZ2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzdlNDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWdpbmZvLmgKQEAgLTAsMCArMSwyODggQEAKKyNpZm5kZWYgX0FTTV9HRU5FUklDX1NJR0lORk9fSAorI2RlZmluZSBfQVNNX0dFTkVSSUNfU0lHSU5GT19ICisKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3R5cGVkZWYgdW5pb24gc2lndmFsIHsKKwlpbnQgc2l2YWxfaW50OworCXZvaWQgKnNpdmFsX3B0cjsKK30gc2lndmFsX3Q7CisKKy8qCisgKiBUaGlzIGlzIHRoZSBzaXplIChpbmNsdWRpbmcgcGFkZGluZykgb2YgdGhlIHBhcnQgb2YgdGhlCisgKiBzdHJ1Y3Qgc2lnaW5mbyB0aGF0IGlzIGJlZm9yZSB0aGUgdW5pb24uCisgKi8KKyNpZm5kZWYgX19BUkNIX1NJX1BSRUFNQkxFX1NJWkUKKyNkZWZpbmUgX19BUkNIX1NJX1BSRUFNQkxFX1NJWkUJKDMgKiBzaXplb2YoaW50KSkKKyNlbmRpZgorCisjZGVmaW5lIFNJX01BWF9TSVpFCTEyOAorI2lmbmRlZiBTSV9QQURfU0laRQorI2RlZmluZSBTSV9QQURfU0laRQkoKFNJX01BWF9TSVpFIC0gX19BUkNIX1NJX1BSRUFNQkxFX1NJWkUpIC8gc2l6ZW9mKGludCkpCisjZW5kaWYKKworI2lmbmRlZiBfX0FSQ0hfU0lfVUlEX1QKKyNkZWZpbmUgX19BUkNIX1NJX1VJRF9UCV9fa2VybmVsX3VpZDMyX3QKKyNlbmRpZgorCisvKgorICogVGhlIGRlZmF1bHQgInNpX2JhbmQiIHR5cGUgaXMgImxvbmciLCBhcyBzcGVjaWZpZWQgYnkgUE9TSVguCisgKiBIb3dldmVyLCBzb21lIGFyY2hpdGVjdHVyZXMgd2FudCB0byBvdmVycmlkZSB0aGlzIHRvICJpbnQiCisgKiBmb3IgaGlzdG9yaWNhbCBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHNvIHdlIGFsbG93IHRoYXQuCisgKi8KKyNpZm5kZWYgX19BUkNIX1NJX0JBTkRfVAorI2RlZmluZSBfX0FSQ0hfU0lfQkFORF9UIGxvbmcKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfQVJDSF9TSUdJTkZPX1QKKwordHlwZWRlZiBzdHJ1Y3Qgc2lnaW5mbyB7CisJaW50IHNpX3NpZ25vOworCWludCBzaV9lcnJubzsKKwlpbnQgc2lfY29kZTsKKworCXVuaW9uIHsKKwkJaW50IF9wYWRbU0lfUEFEX1NJWkVdOworCisJCS8qIGtpbGwoKSAqLworCQlzdHJ1Y3QgeworCQkJX19rZXJuZWxfcGlkX3QgX3BpZDsJLyogc2VuZGVyJ3MgcGlkICovCisJCQlfX0FSQ0hfU0lfVUlEX1QgX3VpZDsJLyogc2VuZGVyJ3MgdWlkICovCisJCX0gX2tpbGw7CisKKwkJLyogUE9TSVguMWIgdGltZXJzICovCisJCXN0cnVjdCB7CisJCQlfX2tlcm5lbF90aW1lcl90IF90aWQ7CS8qIHRpbWVyIGlkICovCisJCQlpbnQgX292ZXJydW47CQkvKiBvdmVycnVuIGNvdW50ICovCisJCQljaGFyIF9wYWRbc2l6ZW9mKCBfX0FSQ0hfU0lfVUlEX1QpIC0gc2l6ZW9mKGludCldOworCQkJc2lndmFsX3QgX3NpZ3ZhbDsJLyogc2FtZSBhcyBiZWxvdyAqLworCQkJaW50IF9zeXNfcHJpdmF0ZTsgICAgICAgLyogbm90IHRvIGJlIHBhc3NlZCB0byB1c2VyICovCisJCX0gX3RpbWVyOworCisJCS8qIFBPU0lYLjFiIHNpZ25hbHMgKi8KKwkJc3RydWN0IHsKKwkJCV9fa2VybmVsX3BpZF90IF9waWQ7CS8qIHNlbmRlcidzIHBpZCAqLworCQkJX19BUkNIX1NJX1VJRF9UIF91aWQ7CS8qIHNlbmRlcidzIHVpZCAqLworCQkJc2lndmFsX3QgX3NpZ3ZhbDsKKwkJfSBfcnQ7CisKKwkJLyogU0lHQ0hMRCAqLworCQlzdHJ1Y3QgeworCQkJX19rZXJuZWxfcGlkX3QgX3BpZDsJLyogd2hpY2ggY2hpbGQgKi8KKwkJCV9fQVJDSF9TSV9VSURfVCBfdWlkOwkvKiBzZW5kZXIncyB1aWQgKi8KKwkJCWludCBfc3RhdHVzOwkJLyogZXhpdCBjb2RlICovCisJCQlfX2tlcm5lbF9jbG9ja190IF91dGltZTsKKwkJCV9fa2VybmVsX2Nsb2NrX3QgX3N0aW1lOworCQl9IF9zaWdjaGxkOworCisJCS8qIFNJR0lMTCwgU0lHRlBFLCBTSUdTRUdWLCBTSUdCVVMgKi8KKwkJc3RydWN0IHsKKwkJCXZvaWQgKl9hZGRyOyAvKiBmYXVsdGluZyBpbnNuL21lbW9yeSByZWYuICovCisjaWZkZWYgX19BUkNIX1NJX1RSQVBOTworCQkJaW50IF90cmFwbm87CS8qIFRSQVAgIyB3aGljaCBjYXVzZWQgdGhlIHNpZ25hbCAqLworI2VuZGlmCisJCQlzaG9ydCBfYWRkcl9sc2I7IC8qIExTQiBvZiB0aGUgcmVwb3J0ZWQgYWRkcmVzcyAqLworCQl9IF9zaWdmYXVsdDsKKworCQkvKiBTSUdQT0xMICovCisJCXN0cnVjdCB7CisJCQlfX0FSQ0hfU0lfQkFORF9UIF9iYW5kOwkvKiBQT0xMX0lOLCBQT0xMX09VVCwgUE9MTF9NU0cgKi8KKwkJCWludCBfZmQ7CisJCX0gX3NpZ3BvbGw7CisKKwkJLyogU0lHU1lTICovCisJCXN0cnVjdCB7CisJCQl2b2lkICpfY2FsbF9hZGRyOyAvKiBjYWxsaW5nIHVzZXIgaW5zbiAqLworCQkJaW50IF9zeXNjYWxsOwkvKiB0cmlnZ2VyaW5nIHN5c3RlbSBjYWxsIG51bWJlciAqLworCQkJdW5zaWduZWQgaW50IF9hcmNoOwkvKiBBVURJVF9BUkNIXyogb2Ygc3lzY2FsbCAqLworCQl9IF9zaWdzeXM7CisJfSBfc2lmaWVsZHM7Cit9IHNpZ2luZm9fdDsKKworLyogSWYgdGhlIGFyY2ggc2hhcmVzIHNpZ2luZm8sIHRoZW4gaXQgaGFzIFNJR1NZUy4gKi8KKyNkZWZpbmUgX19BUkNIX1NJR1NZUworI2VuZGlmCisKKy8qCisgKiBIb3cgdGhlc2UgZmllbGRzIGFyZSB0byBiZSBhY2Nlc3NlZC4KKyAqLworI2RlZmluZSBzaV9waWQJCV9zaWZpZWxkcy5fa2lsbC5fcGlkCisjZGVmaW5lIHNpX3VpZAkJX3NpZmllbGRzLl9raWxsLl91aWQKKyNkZWZpbmUgc2lfdGlkCQlfc2lmaWVsZHMuX3RpbWVyLl90aWQKKyNkZWZpbmUgc2lfb3ZlcnJ1bglfc2lmaWVsZHMuX3RpbWVyLl9vdmVycnVuCisjZGVmaW5lIHNpX3N5c19wcml2YXRlICBfc2lmaWVsZHMuX3RpbWVyLl9zeXNfcHJpdmF0ZQorI2RlZmluZSBzaV9zdGF0dXMJX3NpZmllbGRzLl9zaWdjaGxkLl9zdGF0dXMKKyNkZWZpbmUgc2lfdXRpbWUJX3NpZmllbGRzLl9zaWdjaGxkLl91dGltZQorI2RlZmluZSBzaV9zdGltZQlfc2lmaWVsZHMuX3NpZ2NobGQuX3N0aW1lCisjZGVmaW5lIHNpX3ZhbHVlCV9zaWZpZWxkcy5fcnQuX3NpZ3ZhbAorI2RlZmluZSBzaV9pbnQJCV9zaWZpZWxkcy5fcnQuX3NpZ3ZhbC5zaXZhbF9pbnQKKyNkZWZpbmUgc2lfcHRyCQlfc2lmaWVsZHMuX3J0Ll9zaWd2YWwuc2l2YWxfcHRyCisjZGVmaW5lIHNpX2FkZHIJCV9zaWZpZWxkcy5fc2lnZmF1bHQuX2FkZHIKKyNpZmRlZiBfX0FSQ0hfU0lfVFJBUE5PCisjZGVmaW5lIHNpX3RyYXBubwlfc2lmaWVsZHMuX3NpZ2ZhdWx0Ll90cmFwbm8KKyNlbmRpZgorI2RlZmluZSBzaV9hZGRyX2xzYglfc2lmaWVsZHMuX3NpZ2ZhdWx0Ll9hZGRyX2xzYgorI2RlZmluZSBzaV9iYW5kCQlfc2lmaWVsZHMuX3NpZ3BvbGwuX2JhbmQKKyNkZWZpbmUgc2lfZmQJCV9zaWZpZWxkcy5fc2lncG9sbC5fZmQKKyNpZmRlZiBfX0FSQ0hfU0lHU1lTCisjZGVmaW5lIHNpX2NhbGxfYWRkcglfc2lmaWVsZHMuX3NpZ3N5cy5fY2FsbF9hZGRyCisjZGVmaW5lIHNpX3N5c2NhbGwJX3NpZmllbGRzLl9zaWdzeXMuX3N5c2NhbGwKKyNkZWZpbmUgc2lfYXJjaAkJX3NpZmllbGRzLl9zaWdzeXMuX2FyY2gKKyNlbmRpZgorCisjZGVmaW5lIF9fU0lfS0lMTAkwCisjZGVmaW5lIF9fU0lfVElNRVIJMAorI2RlZmluZSBfX1NJX1BPTEwJMAorI2RlZmluZSBfX1NJX0ZBVUxUCTAKKyNkZWZpbmUgX19TSV9DSExECTAKKyNkZWZpbmUgX19TSV9SVAkJMAorI2RlZmluZSBfX1NJX01FU0dRCTAKKyNkZWZpbmUgX19TSV9TWVMJMAorI2RlZmluZSBfX1NJX0NPREUoVCxOKQkoTikKKworLyoKKyAqIHNpX2NvZGUgdmFsdWVzCisgKiBEaWdpdGFsIHJlc2VydmVzIHBvc2l0aXZlIHZhbHVlcyBmb3Iga2VybmVsLWdlbmVyYXRlZCBzaWduYWxzLgorICovCisjZGVmaW5lIFNJX1VTRVIJCTAJCS8qIHNlbnQgYnkga2lsbCwgc2lnc2VuZCwgcmFpc2UgKi8KKyNkZWZpbmUgU0lfS0VSTkVMCTB4ODAJCS8qIHNlbnQgYnkgdGhlIGtlcm5lbCBmcm9tIHNvbWV3aGVyZSAqLworI2RlZmluZSBTSV9RVUVVRQktMQkJLyogc2VudCBieSBzaWdxdWV1ZSAqLworI2RlZmluZSBTSV9USU1FUiBfX1NJX0NPREUoX19TSV9USU1FUiwtMikgLyogc2VudCBieSB0aW1lciBleHBpcmF0aW9uICovCisjZGVmaW5lIFNJX01FU0dRIF9fU0lfQ09ERShfX1NJX01FU0dRLC0zKSAvKiBzZW50IGJ5IHJlYWwgdGltZSBtZXNxIHN0YXRlIGNoYW5nZSAqLworI2RlZmluZSBTSV9BU1lOQ0lPCS00CQkvKiBzZW50IGJ5IEFJTyBjb21wbGV0aW9uICovCisjZGVmaW5lIFNJX1NJR0lPCS01CQkvKiBzZW50IGJ5IHF1ZXVlZCBTSUdJTyAqLworI2RlZmluZSBTSV9US0lMTAktNgkJLyogc2VudCBieSB0a2lsbCBzeXN0ZW0gY2FsbCAqLworI2RlZmluZSBTSV9ERVRIUkVBRAktNwkJLyogc2VudCBieSBleGVjdmUoKSBraWxsaW5nIHN1YnNpZGlhcnkgdGhyZWFkcyAqLworCisjZGVmaW5lIFNJX0ZST01VU0VSKHNpcHRyKQkoKHNpcHRyKS0+c2lfY29kZSA8PSAwKQorI2RlZmluZSBTSV9GUk9NS0VSTkVMKHNpcHRyKQkoKHNpcHRyKS0+c2lfY29kZSA+IDApCisKKy8qCisgKiBTSUdJTEwgc2lfY29kZXMKKyAqLworI2RlZmluZSBJTExfSUxMT1BDCShfX1NJX0ZBVUxUfDEpCS8qIGlsbGVnYWwgb3Bjb2RlICovCisjZGVmaW5lIElMTF9JTExPUE4JKF9fU0lfRkFVTFR8MikJLyogaWxsZWdhbCBvcGVyYW5kICovCisjZGVmaW5lIElMTF9JTExBRFIJKF9fU0lfRkFVTFR8MykJLyogaWxsZWdhbCBhZGRyZXNzaW5nIG1vZGUgKi8KKyNkZWZpbmUgSUxMX0lMTFRSUAkoX19TSV9GQVVMVHw0KQkvKiBpbGxlZ2FsIHRyYXAgKi8KKyNkZWZpbmUgSUxMX1BSVk9QQwkoX19TSV9GQVVMVHw1KQkvKiBwcml2aWxlZ2VkIG9wY29kZSAqLworI2RlZmluZSBJTExfUFJWUkVHCShfX1NJX0ZBVUxUfDYpCS8qIHByaXZpbGVnZWQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUxMX0NPUFJPQwkoX19TSV9GQVVMVHw3KQkvKiBjb3Byb2Nlc3NvciBlcnJvciAqLworI2RlZmluZSBJTExfQkFEU1RLCShfX1NJX0ZBVUxUfDgpCS8qIGludGVybmFsIHN0YWNrIGVycm9yICovCisjZGVmaW5lIE5TSUdJTEwJCTgKKworLyoKKyAqIFNJR0ZQRSBzaV9jb2RlcworICovCisjZGVmaW5lIEZQRV9JTlRESVYJKF9fU0lfRkFVTFR8MSkJLyogaW50ZWdlciBkaXZpZGUgYnkgemVybyAqLworI2RlZmluZSBGUEVfSU5UT1ZGCShfX1NJX0ZBVUxUfDIpCS8qIGludGVnZXIgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgRlBFX0ZMVERJVgkoX19TSV9GQVVMVHwzKQkvKiBmbG9hdGluZyBwb2ludCBkaXZpZGUgYnkgemVybyAqLworI2RlZmluZSBGUEVfRkxUT1ZGCShfX1NJX0ZBVUxUfDQpCS8qIGZsb2F0aW5nIHBvaW50IG92ZXJmbG93ICovCisjZGVmaW5lIEZQRV9GTFRVTkQJKF9fU0lfRkFVTFR8NSkJLyogZmxvYXRpbmcgcG9pbnQgdW5kZXJmbG93ICovCisjZGVmaW5lIEZQRV9GTFRSRVMJKF9fU0lfRkFVTFR8NikJLyogZmxvYXRpbmcgcG9pbnQgaW5leGFjdCByZXN1bHQgKi8KKyNkZWZpbmUgRlBFX0ZMVElOVgkoX19TSV9GQVVMVHw3KQkvKiBmbG9hdGluZyBwb2ludCBpbnZhbGlkIG9wZXJhdGlvbiAqLworI2RlZmluZSBGUEVfRkxUU1VCCShfX1NJX0ZBVUxUfDgpCS8qIHN1YnNjcmlwdCBvdXQgb2YgcmFuZ2UgKi8KKyNkZWZpbmUgTlNJR0ZQRQkJOAorCisvKgorICogU0lHU0VHViBzaV9jb2RlcworICovCisjZGVmaW5lIFNFR1ZfTUFQRVJSCShfX1NJX0ZBVUxUfDEpCS8qIGFkZHJlc3Mgbm90IG1hcHBlZCB0byBvYmplY3QgKi8KKyNkZWZpbmUgU0VHVl9BQ0NFUlIJKF9fU0lfRkFVTFR8MikJLyogaW52YWxpZCBwZXJtaXNzaW9ucyBmb3IgbWFwcGVkIG9iamVjdCAqLworI2RlZmluZSBOU0lHU0VHVgkyCisKKy8qCisgKiBTSUdCVVMgc2lfY29kZXMKKyAqLworI2RlZmluZSBCVVNfQURSQUxOCShfX1NJX0ZBVUxUfDEpCS8qIGludmFsaWQgYWRkcmVzcyBhbGlnbm1lbnQgKi8KKyNkZWZpbmUgQlVTX0FEUkVSUgkoX19TSV9GQVVMVHwyKQkvKiBub24tZXhpc3RlbnQgcGh5c2ljYWwgYWRkcmVzcyAqLworI2RlZmluZSBCVVNfT0JKRVJSCShfX1NJX0ZBVUxUfDMpCS8qIG9iamVjdCBzcGVjaWZpYyBoYXJkd2FyZSBlcnJvciAqLworLyogaGFyZHdhcmUgbWVtb3J5IGVycm9yIGNvbnN1bWVkIG9uIGEgbWFjaGluZSBjaGVjazogYWN0aW9uIHJlcXVpcmVkICovCisjZGVmaW5lIEJVU19NQ0VFUlJfQVIJKF9fU0lfRkFVTFR8NCkKKy8qIGhhcmR3YXJlIG1lbW9yeSBlcnJvciBkZXRlY3RlZCBpbiBwcm9jZXNzIGJ1dCBub3QgY29uc3VtZWQ6IGFjdGlvbiBvcHRpb25hbCovCisjZGVmaW5lIEJVU19NQ0VFUlJfQU8JKF9fU0lfRkFVTFR8NSkKKyNkZWZpbmUgTlNJR0JVUwkJNQorCisvKgorICogU0lHVFJBUCBzaV9jb2RlcworICovCisjZGVmaW5lIFRSQVBfQlJLUFQJKF9fU0lfRkFVTFR8MSkJLyogcHJvY2VzcyBicmVha3BvaW50ICovCisjZGVmaW5lIFRSQVBfVFJBQ0UJKF9fU0lfRkFVTFR8MikJLyogcHJvY2VzcyB0cmFjZSB0cmFwICovCisjZGVmaW5lIFRSQVBfQlJBTkNIICAgICAoX19TSV9GQVVMVHwzKSAgLyogcHJvY2VzcyB0YWtlbiBicmFuY2ggdHJhcCAqLworI2RlZmluZSBUUkFQX0hXQktQVCAgICAgKF9fU0lfRkFVTFR8NCkgIC8qIGhhcmR3YXJlIGJyZWFrcG9pbnQvd2F0Y2hwb2ludCAqLworI2RlZmluZSBOU0lHVFJBUAk0CisKKy8qCisgKiBTSUdDSExEIHNpX2NvZGVzCisgKi8KKyNkZWZpbmUgQ0xEX0VYSVRFRAkoX19TSV9DSExEfDEpCS8qIGNoaWxkIGhhcyBleGl0ZWQgKi8KKyNkZWZpbmUgQ0xEX0tJTExFRAkoX19TSV9DSExEfDIpCS8qIGNoaWxkIHdhcyBraWxsZWQgKi8KKyNkZWZpbmUgQ0xEX0RVTVBFRAkoX19TSV9DSExEfDMpCS8qIGNoaWxkIHRlcm1pbmF0ZWQgYWJub3JtYWxseSAqLworI2RlZmluZSBDTERfVFJBUFBFRAkoX19TSV9DSExEfDQpCS8qIHRyYWNlZCBjaGlsZCBoYXMgdHJhcHBlZCAqLworI2RlZmluZSBDTERfU1RPUFBFRAkoX19TSV9DSExEfDUpCS8qIGNoaWxkIGhhcyBzdG9wcGVkICovCisjZGVmaW5lIENMRF9DT05USU5VRUQJKF9fU0lfQ0hMRHw2KQkvKiBzdG9wcGVkIGNoaWxkIGhhcyBjb250aW51ZWQgKi8KKyNkZWZpbmUgTlNJR0NITEQJNgorCisvKgorICogU0lHUE9MTCBzaV9jb2RlcworICovCisjZGVmaW5lIFBPTExfSU4JCShfX1NJX1BPTEx8MSkJLyogZGF0YSBpbnB1dCBhdmFpbGFibGUgKi8KKyNkZWZpbmUgUE9MTF9PVVQJKF9fU0lfUE9MTHwyKQkvKiBvdXRwdXQgYnVmZmVycyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgUE9MTF9NU0cJKF9fU0lfUE9MTHwzKQkvKiBpbnB1dCBtZXNzYWdlIGF2YWlsYWJsZSAqLworI2RlZmluZSBQT0xMX0VSUgkoX19TSV9QT0xMfDQpCS8qIGkvbyBlcnJvciAqLworI2RlZmluZSBQT0xMX1BSSQkoX19TSV9QT0xMfDUpCS8qIGhpZ2ggcHJpb3JpdHkgaW5wdXQgYXZhaWxhYmxlICovCisjZGVmaW5lIFBPTExfSFVQCShfX1NJX1BPTEx8NikJLyogZGV2aWNlIGRpc2Nvbm5lY3RlZCAqLworI2RlZmluZSBOU0lHUE9MTAk2CisKKy8qCisgKiBTSUdTWVMgc2lfY29kZXMKKyAqLworI2RlZmluZSBTWVNfU0VDQ09NUAkJKF9fU0lfU1lTfDEpCS8qIHNlY2NvbXAgdHJpZ2dlcmVkICovCisjZGVmaW5lIE5TSUdTWVMJMQorCisvKgorICogc2lnZXZlbnQgZGVmaW5pdGlvbnMKKyAqIAorICogSXQgc2VlbXMgbGlrZWx5IHRoYXQgU0lHRVZfVEhSRUFEIHdpbGwgaGF2ZSB0byBiZSBoYW5kbGVkIGZyb20gCisgKiB1c2Vyc3BhY2UsIGxpYnB0aHJlYWQgdHJhbnNtdXRpbmcgaXQgdG8gU0lHRVZfU0lHTkFMLCB3aGljaCB0aGUKKyAqIHRocmVhZCBtYW5hZ2VyIHRoZW4gY2F0Y2hlcyBhbmQgZG9lcyB0aGUgYXBwcm9wcmlhdGUgbm9uc2Vuc2UuCisgKiBIb3dldmVyLCBldmVyeXRoaW5nIGlzIHdyaXR0ZW4gb3V0IGhlcmUgc28gYXMgdG8gbm90IGdldCBsb3N0LgorICovCisjZGVmaW5lIFNJR0VWX1NJR05BTAkwCS8qIG5vdGlmeSB2aWEgc2lnbmFsICovCisjZGVmaW5lIFNJR0VWX05PTkUJMQkvKiBvdGhlciBub3RpZmljYXRpb246IG1lYW5pbmdsZXNzICovCisjZGVmaW5lIFNJR0VWX1RIUkVBRAkyCS8qIGRlbGl2ZXIgdmlhIHRocmVhZCBjcmVhdGlvbiAqLworI2RlZmluZSBTSUdFVl9USFJFQURfSUQgNAkvKiBkZWxpdmVyIHRvIHRocmVhZCAqLworCisvKgorICogVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBhbGlnbm1lbnQgaXMgb2sgb24gYWxsIGN1cnJlbnQgYXJjaGl0ZWN0dXJlcworICogYnV0IHdlIGxlYXZlIG9wZW4gdGhpcyBiZWluZyBvdmVycmlkZGVuIGluIHRoZSBmdXR1cmUKKyAqLworI2lmbmRlZiBfX0FSQ0hfU0lHRVZfUFJFQU1CTEVfU0laRQorI2RlZmluZSBfX0FSQ0hfU0lHRVZfUFJFQU1CTEVfU0laRQkoc2l6ZW9mKGludCkgKiAyICsgc2l6ZW9mKHNpZ3ZhbF90KSkKKyNlbmRpZgorCisjZGVmaW5lIFNJR0VWX01BWF9TSVpFCTY0CisjZGVmaW5lIFNJR0VWX1BBRF9TSVpFCSgoU0lHRVZfTUFYX1NJWkUgLSBfX0FSQ0hfU0lHRVZfUFJFQU1CTEVfU0laRSkgXAorCQkvIHNpemVvZihpbnQpKQorCit0eXBlZGVmIHN0cnVjdCBzaWdldmVudCB7CisJc2lndmFsX3Qgc2lnZXZfdmFsdWU7CisJaW50IHNpZ2V2X3NpZ25vOworCWludCBzaWdldl9ub3RpZnk7CisJdW5pb24geworCQlpbnQgX3BhZFtTSUdFVl9QQURfU0laRV07CisJCSBpbnQgX3RpZDsKKworCQlzdHJ1Y3QgeworCQkJdm9pZCAoKl9mdW5jdGlvbikoc2lndmFsX3QpOworCQkJdm9pZCAqX2F0dHJpYnV0ZTsJLyogcmVhbGx5IHB0aHJlYWRfYXR0cl90ICovCisJCX0gX3NpZ2V2X3RocmVhZDsKKwl9IF9zaWdldl91bjsKK30gc2lnZXZlbnRfdDsKKworI2RlZmluZSBzaWdldl9ub3RpZnlfZnVuY3Rpb24JX3NpZ2V2X3VuLl9zaWdldl90aHJlYWQuX2Z1bmN0aW9uCisjZGVmaW5lIHNpZ2V2X25vdGlmeV9hdHRyaWJ1dGVzCV9zaWdldl91bi5fc2lnZXZfdGhyZWFkLl9hdHRyaWJ1dGUKKyNkZWZpbmUgc2lnZXZfbm90aWZ5X3RocmVhZF9pZAkgX3NpZ2V2X3VuLl90aWQKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc2lnbmFsLWRlZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc2lnbmFsLWRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGNmYjZkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWduYWwtZGVmcy5oCkBAIC0wLDAgKzEsMjggQEAKKyNpZm5kZWYgX19BU01fR0VORVJJQ19TSUdOQUxfREVGU19ICisjZGVmaW5lIF9fQVNNX0dFTkVSSUNfU0lHTkFMX0RFRlNfSAorCisKKworI2lmbmRlZiBTSUdfQkxPQ0sKKyNkZWZpbmUgU0lHX0JMT0NLICAgICAgICAgIDAJLyogZm9yIGJsb2NraW5nIHNpZ25hbHMgKi8KKyNlbmRpZgorI2lmbmRlZiBTSUdfVU5CTE9DSworI2RlZmluZSBTSUdfVU5CTE9DSyAgICAgICAgMQkvKiBmb3IgdW5ibG9ja2luZyBzaWduYWxzICovCisjZW5kaWYKKyNpZm5kZWYgU0lHX1NFVE1BU0sKKyNkZWZpbmUgU0lHX1NFVE1BU0sgICAgICAgIDIJLyogZm9yIHNldHRpbmcgdGhlIHNpZ25hbCBtYXNrICovCisjZW5kaWYKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KK3R5cGVkZWYgdm9pZCBfX3NpZ25hbGZuX3QoaW50KTsKK3R5cGVkZWYgX19zaWduYWxmbl90ICpfX3NpZ2hhbmRsZXJfdDsKKwordHlwZWRlZiB2b2lkIF9fcmVzdG9yZWZuX3Qodm9pZCk7Cit0eXBlZGVmIF9fcmVzdG9yZWZuX3QgKl9fc2lncmVzdG9yZV90OworCisjZGVmaW5lIFNJR19ERkwJKChfX3NpZ2hhbmRsZXJfdCkwKQkvKiBkZWZhdWx0IHNpZ25hbCBoYW5kbGluZyAqLworI2RlZmluZSBTSUdfSUdOCSgoX19zaWdoYW5kbGVyX3QpMSkJLyogaWdub3JlIHNpZ25hbCAqLworI2RlZmluZSBTSUdfRVJSCSgoX19zaWdoYW5kbGVyX3QpLTEpCS8qIGVycm9yIHJldHVybiBmcm9tIHNpZ25hbCAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX1NJR05BTF9ERUZTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc2lnbmFsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYjYxNjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NpZ25hbC5oCkBAIC0wLDAgKzEsMTIzIEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfU0lHTkFMX0gKKyNkZWZpbmUgX19BU01fR0VORVJJQ19TSUdOQUxfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBfTlNJRwkJNjQKKyNkZWZpbmUgX05TSUdfQlBXCV9fQklUU19QRVJfTE9ORworI2RlZmluZSBfTlNJR19XT1JEUwkoX05TSUcgLyBfTlNJR19CUFcpCisKKyNkZWZpbmUgU0lHSFVQCQkgMQorI2RlZmluZSBTSUdJTlQJCSAyCisjZGVmaW5lIFNJR1FVSVQJCSAzCisjZGVmaW5lIFNJR0lMTAkJIDQKKyNkZWZpbmUgU0lHVFJBUAkJIDUKKyNkZWZpbmUgU0lHQUJSVAkJIDYKKyNkZWZpbmUgU0lHSU9UCQkgNgorI2RlZmluZSBTSUdCVVMJCSA3CisjZGVmaW5lIFNJR0ZQRQkJIDgKKyNkZWZpbmUgU0lHS0lMTAkJIDkKKyNkZWZpbmUgU0lHVVNSMQkJMTAKKyNkZWZpbmUgU0lHU0VHVgkJMTEKKyNkZWZpbmUgU0lHVVNSMgkJMTIKKyNkZWZpbmUgU0lHUElQRQkJMTMKKyNkZWZpbmUgU0lHQUxSTQkJMTQKKyNkZWZpbmUgU0lHVEVSTQkJMTUKKyNkZWZpbmUgU0lHU1RLRkxUCTE2CisjZGVmaW5lIFNJR0NITEQJCTE3CisjZGVmaW5lIFNJR0NPTlQJCTE4CisjZGVmaW5lIFNJR1NUT1AJCTE5CisjZGVmaW5lIFNJR1RTVFAJCTIwCisjZGVmaW5lIFNJR1RUSU4JCTIxCisjZGVmaW5lIFNJR1RUT1UJCTIyCisjZGVmaW5lIFNJR1VSRwkJMjMKKyNkZWZpbmUgU0lHWENQVQkJMjQKKyNkZWZpbmUgU0lHWEZTWgkJMjUKKyNkZWZpbmUgU0lHVlRBTFJNCTI2CisjZGVmaW5lIFNJR1BST0YJCTI3CisjZGVmaW5lIFNJR1dJTkNICTI4CisjZGVmaW5lIFNJR0lPCQkyOQorI2RlZmluZSBTSUdQT0xMCQlTSUdJTworLyoKKyNkZWZpbmUgU0lHTE9TVAkJMjkKKyovCisjZGVmaW5lIFNJR1BXUgkJMzAKKyNkZWZpbmUgU0lHU1lTCQkzMQorI2RlZmluZQlTSUdVTlVTRUQJMzEKKworLyogVGhlc2Ugc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGNvbnN0YW50cyBmcm9tIHVzZXJsYW5kLiAgKi8KKyNkZWZpbmUgU0lHUlRNSU4JMzIKKyNpZm5kZWYgU0lHUlRNQVgKKyNkZWZpbmUgU0lHUlRNQVgJX05TSUcKKyNlbmRpZgorCisvKgorICogU0FfRkxBR1MgdmFsdWVzOgorICoKKyAqIFNBX09OU1RBQ0sgaW5kaWNhdGVzIHRoYXQgYSByZWdpc3RlcmVkIHN0YWNrX3Qgd2lsbCBiZSB1c2VkLgorICogU0FfUkVTVEFSVCBmbGFnIHRvIGdldCByZXN0YXJ0aW5nIHNpZ25hbHMgKHdoaWNoIHdlcmUgdGhlIGRlZmF1bHQgbG9uZyBhZ28pCisgKiBTQV9OT0NMRFNUT1AgZmxhZyB0byB0dXJuIG9mZiBTSUdDSExEIHdoZW4gY2hpbGRyZW4gc3RvcC4KKyAqIFNBX1JFU0VUSEFORCBjbGVhcnMgdGhlIGhhbmRsZXIgd2hlbiB0aGUgc2lnbmFsIGlzIGRlbGl2ZXJlZC4KKyAqIFNBX05PQ0xEV0FJVCBmbGFnIG9uIFNJR0NITEQgdG8gaW5oaWJpdCB6b21iaWVzLgorICogU0FfTk9ERUZFUiBwcmV2ZW50cyB0aGUgY3VycmVudCBzaWduYWwgZnJvbSBiZWluZyBtYXNrZWQgaW4gdGhlIGhhbmRsZXIuCisgKgorICogU0FfT05FU0hPVCBhbmQgU0FfTk9NQVNLIGFyZSB0aGUgaGlzdG9yaWNhbCBMaW51eCBuYW1lcyBmb3IgdGhlIFNpbmdsZQorICogVW5peCBuYW1lcyBSRVNFVEhBTkQgYW5kIE5PREVGRVIgcmVzcGVjdGl2ZWx5LgorICovCisjZGVmaW5lIFNBX05PQ0xEU1RPUAkweDAwMDAwMDAxCisjZGVmaW5lIFNBX05PQ0xEV0FJVAkweDAwMDAwMDAyCisjZGVmaW5lIFNBX1NJR0lORk8JMHgwMDAwMDAwNAorI2RlZmluZSBTQV9PTlNUQUNLCTB4MDgwMDAwMDAKKyNkZWZpbmUgU0FfUkVTVEFSVAkweDEwMDAwMDAwCisjZGVmaW5lIFNBX05PREVGRVIJMHg0MDAwMDAwMAorI2RlZmluZSBTQV9SRVNFVEhBTkQJMHg4MDAwMDAwMAorCisjZGVmaW5lIFNBX05PTUFTSwlTQV9OT0RFRkVSCisjZGVmaW5lIFNBX09ORVNIT1QJU0FfUkVTRVRIQU5ECisKKy8qCisgKiBOZXcgYXJjaGl0ZWN0dXJlcyBzaG91bGQgbm90IGRlZmluZSB0aGUgb2Jzb2xldGUKKyAqCVNBX1JFU1RPUkVSCTB4MDQwMDAwMDAKKyAqLworCisvKgorICogc2lnYWx0c3RhY2sgY29udHJvbHMKKyAqLworI2RlZmluZSBTU19PTlNUQUNLCTEKKyNkZWZpbmUgU1NfRElTQUJMRQkyCisKKyNkZWZpbmUgTUlOU0lHU1RLU1oJMjA0OAorI2RlZmluZSBTSUdTVEtTWgk4MTkyCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBzaWdbX05TSUdfV09SRFNdOworfSBzaWdzZXRfdDsKKworLyogbm90IGFjdHVhbGx5IHVzZWQsIGJ1dCByZXF1aXJlZCBmb3IgbGludXgvc3lzY2FsbHMuaCAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIG9sZF9zaWdzZXRfdDsKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NpZ25hbC1kZWZzLmg+CisKK3N0cnVjdCBzaWdhY3Rpb24geworCV9fc2lnaGFuZGxlcl90IHNhX2hhbmRsZXI7CisJdW5zaWduZWQgbG9uZyBzYV9mbGFnczsKKyNpZmRlZiBTQV9SRVNUT1JFUgorCV9fc2lncmVzdG9yZV90IHNhX3Jlc3RvcmVyOworI2VuZGlmCisJc2lnc2V0X3Qgc2FfbWFzazsJCS8qIG1hc2sgbGFzdCBmb3IgZXh0ZW5zaWJpbGl0eSAqLworfTsKKworc3RydWN0IGtfc2lnYWN0aW9uIHsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIHNhOworfTsKKwordHlwZWRlZiBzdHJ1Y3Qgc2lnYWx0c3RhY2sgeworCXZvaWQgKnNzX3NwOworCWludCBzc19mbGFnczsKKwlzaXplX3Qgc3Nfc2l6ZTsKK30gc3RhY2tfdDsKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYgLyogX0FTTV9HRU5FUklDX1NJR05BTF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NvY2tldC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTYxMTVlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zb2NrZXQuaApAQCAtMCwwICsxLDY3IEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfU09DS0VUX0gKKyNkZWZpbmUgX19BU01fR0VORVJJQ19TT0NLRVRfSAorCisjaW5jbHVkZSA8YXNtL3NvY2tpb3MuaD4KKworLyogRm9yIHNldHNvY2tvcHQoMikgKi8KKyNkZWZpbmUgU09MX1NPQ0tFVAkxCisKKyNkZWZpbmUgU09fREVCVUcJMQorI2RlZmluZSBTT19SRVVTRUFERFIJMgorI2RlZmluZSBTT19UWVBFCQkzCisjZGVmaW5lIFNPX0VSUk9SCTQKKyNkZWZpbmUgU09fRE9OVFJPVVRFCTUKKyNkZWZpbmUgU09fQlJPQURDQVNUCTYKKyNkZWZpbmUgU09fU05EQlVGCTcKKyNkZWZpbmUgU09fUkNWQlVGCTgKKyNkZWZpbmUgU09fU05EQlVGRk9SQ0UJMzIKKyNkZWZpbmUgU09fUkNWQlVGRk9SQ0UJMzMKKyNkZWZpbmUgU09fS0VFUEFMSVZFCTkKKyNkZWZpbmUgU09fT09CSU5MSU5FCTEwCisjZGVmaW5lIFNPX05PX0NIRUNLCTExCisjZGVmaW5lIFNPX1BSSU9SSVRZCTEyCisjZGVmaW5lIFNPX0xJTkdFUgkxMworI2RlZmluZSBTT19CU0RDT01QQVQJMTQKKy8qIFRvIGFkZCA6I2RlZmluZSBTT19SRVVTRVBPUlQgMTUgKi8KKworI2lmbmRlZiBTT19QQVNTQ1JFRCAvKiBwb3dlcnBjIG9ubHkgZGlmZmVycyBpbiB0aGVzZSAqLworI2RlZmluZSBTT19QQVNTQ1JFRAkxNgorI2RlZmluZSBTT19QRUVSQ1JFRAkxNworI2RlZmluZSBTT19SQ1ZMT1dBVAkxOAorI2RlZmluZSBTT19TTkRMT1dBVAkxOQorI2RlZmluZSBTT19SQ1ZUSU1FTwkyMAorI2RlZmluZSBTT19TTkRUSU1FTwkyMQorI2VuZGlmCisKKy8qIFNlY3VyaXR5IGxldmVscyAtIGFzIHBlciBOUkwgSVB2NiAtIGRvbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nICovCisjZGVmaW5lIFNPX1NFQ1VSSVRZX0FVVEhFTlRJQ0FUSU9OCQkyMgorI2RlZmluZSBTT19TRUNVUklUWV9FTkNSWVBUSU9OX1RSQU5TUE9SVAkyMworI2RlZmluZSBTT19TRUNVUklUWV9FTkNSWVBUSU9OX05FVFdPUksJCTI0CisKKyNkZWZpbmUgU09fQklORFRPREVWSUNFCTI1CisKKy8qIFNvY2tldCBmaWx0ZXJpbmcgKi8KKyNkZWZpbmUgU09fQVRUQUNIX0ZJTFRFUgkyNgorI2RlZmluZSBTT19ERVRBQ0hfRklMVEVSCTI3CisKKyNkZWZpbmUgU09fUEVFUk5BTUUJCTI4CisjZGVmaW5lIFNPX1RJTUVTVEFNUAkJMjkKKyNkZWZpbmUgU0NNX1RJTUVTVEFNUAkJU09fVElNRVNUQU1QCisKKyNkZWZpbmUgU09fQUNDRVBUQ09OTgkJMzAKKworI2RlZmluZSBTT19QRUVSU0VDCQkzMQorI2RlZmluZSBTT19QQVNTU0VDCQkzNAorI2RlZmluZSBTT19USU1FU1RBTVBOUwkJMzUKKyNkZWZpbmUgU0NNX1RJTUVTVEFNUE5TCQlTT19USU1FU1RBTVBOUworCisjZGVmaW5lIFNPX01BUksJCQkzNgorCisjZGVmaW5lIFNPX1RJTUVTVEFNUElORwkJMzcKKyNkZWZpbmUgU0NNX1RJTUVTVEFNUElORwlTT19USU1FU1RBTVBJTkcKKworI2RlZmluZSBTT19QUk9UT0NPTAkJMzgKKyNkZWZpbmUgU09fRE9NQUlOCQkzOQorCisjZGVmaW5lIFNPX1JYUV9PVkZMICAgICAgICAgICAgIDQwCisjZW5kaWYgLyogX19BU01fR0VORVJJQ19TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zb2NraW9zLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NvY2tpb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTYxYTM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zb2NraW9zLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfX0FTTV9HRU5FUklDX1NPQ0tJT1NfSAorI2RlZmluZSBfX0FTTV9HRU5FUklDX1NPQ0tJT1NfSAorCisvKiBTb2NrZXQtbGV2ZWwgSS9PIGNvbnRyb2wgY2FsbHMuICovCisjZGVmaW5lIEZJT1NFVE9XTgkweDg5MDEKKyNkZWZpbmUgU0lPQ1NQR1JQCTB4ODkwMgorI2RlZmluZSBGSU9HRVRPV04JMHg4OTAzCisjZGVmaW5lIFNJT0NHUEdSUAkweDg5MDQKKyNkZWZpbmUgU0lPQ0FUTUFSSwkweDg5MDUKKyNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAodGltZXZhbCkgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUE5TCTB4ODkwNwkJLyogR2V0IHN0YW1wICh0aW1lc3BlYykgKi8KKworI2VuZGlmIC8qIF9fQVNNX0dFTkVSSUNfU09DS0lPU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3N0YXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOGNhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3N0YXQuaApAQCAtMCwwICsxLDcyIEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfU1RBVF9ICisjZGVmaW5lIF9fQVNNX0dFTkVSSUNfU1RBVF9ICisKKy8qCisgKiBFdmVyeWJvZHkgZ2V0cyB0aGlzIHdyb25nIGFuZCBoYXMgdG8gc3RpY2sgd2l0aCBpdCBmb3IgYWxsCisgKiBldGVybml0eS4gSG9wZWZ1bGx5LCB0aGlzIHZlcnNpb24gZ2V0cyB1c2VkIGJ5IG5ldyBhcmNoaXRlY3R1cmVzCisgKiBzbyB0aGV5IGRvbid0IGZhbGwgaW50byB0aGUgc2FtZSB0cmFwcy4KKyAqCisgKiBzdGF0NjQgaXMgY29waWVkIGZyb20gcG93ZXJwYzY0LCB3aXRoIGV4cGxpY2l0IHBhZGRpbmcgYWRkZWQuCisgKiBzdGF0IGlzIHRoZSBzYW1lIHN0cnVjdHVyZSBsYXlvdXQgb24gNjQtYml0LCB3aXRob3V0IHRoZSAnbG9uZyBsb25nJworICogdHlwZXMuCisgKgorICogQnkgY29udmVudGlvbiwgNjQgYml0IGFyY2hpdGVjdHVyZXMgdXNlIHRoZSBzdGF0IGludGVyZmFjZSwgd2hpbGUKKyAqIDMyIGJpdCBhcmNoaXRlY3R1cmVzIHVzZSB0aGUgc3RhdDY0IGludGVyZmFjZS4gTm90ZSB0aGF0IHdlIGRvbid0CisgKiBwcm92aWRlIGFuIF9fb2xkX2tlcm5lbF9zdGF0IGhlcmUsIHdoaWNoIG5ldyBhcmNoaXRlY3R1cmUgc2hvdWxkCisgKiBub3QgaGF2ZSB0byBzdGFydCB3aXRoLgorICovCisKKyNpbmNsdWRlIDxhc20vYml0c3BlcmxvbmcuaD4KKworI2RlZmluZSBTVEFUX0hBVkVfTlNFQyAxCisKK3N0cnVjdCBzdGF0IHsKKwl1bnNpZ25lZCBsb25nCXN0X2RldjsJCS8qIERldmljZS4gICovCisJdW5zaWduZWQgbG9uZwlzdF9pbm87CQkvKiBGaWxlIHNlcmlhbCBudW1iZXIuICAqLworCXVuc2lnbmVkIGludAlzdF9tb2RlOwkvKiBGaWxlIG1vZGUuICAqLworCXVuc2lnbmVkIGludAlzdF9ubGluazsJLyogTGluayBjb3VudC4gICovCisJdW5zaWduZWQgaW50CXN0X3VpZDsJCS8qIFVzZXIgSUQgb2YgdGhlIGZpbGUncyBvd25lci4gICovCisJdW5zaWduZWQgaW50CXN0X2dpZDsJCS8qIEdyb3VwIElEIG9mIHRoZSBmaWxlJ3MgZ3JvdXAuICovCisJdW5zaWduZWQgbG9uZwlzdF9yZGV2OwkvKiBEZXZpY2UgbnVtYmVyLCBpZiBkZXZpY2UuICAqLworCXVuc2lnbmVkIGxvbmcJX19wYWQxOworCWxvbmcJCXN0X3NpemU7CS8qIFNpemUgb2YgZmlsZSwgaW4gYnl0ZXMuICAqLworCWludAkJc3RfYmxrc2l6ZTsJLyogT3B0aW1hbCBibG9jayBzaXplIGZvciBJL08uICAqLworCWludAkJX19wYWQyOworCWxvbmcJCXN0X2Jsb2NrczsJLyogTnVtYmVyIDUxMi1ieXRlIGJsb2NrcyBhbGxvY2F0ZWQuICovCisJbG9uZwkJc3RfYXRpbWU7CS8qIFRpbWUgb2YgbGFzdCBhY2Nlc3MuICAqLworCXVuc2lnbmVkIGxvbmcJc3RfYXRpbWVfbnNlYzsKKwlsb25nCQlzdF9tdGltZTsJLyogVGltZSBvZiBsYXN0IG1vZGlmaWNhdGlvbi4gICovCisJdW5zaWduZWQgbG9uZwlzdF9tdGltZV9uc2VjOworCWxvbmcJCXN0X2N0aW1lOwkvKiBUaW1lIG9mIGxhc3Qgc3RhdHVzIGNoYW5nZS4gICovCisJdW5zaWduZWQgbG9uZwlzdF9jdGltZV9uc2VjOworCXVuc2lnbmVkIGludAlfX3VudXNlZDQ7CisJdW5zaWduZWQgaW50CV9fdW51c2VkNTsKK307CisKKy8qIFRoaXMgbWF0Y2hlcyBzdHJ1Y3Qgc3RhdDY0IGluIGdsaWJjMi4xLiBPbmx5IHVzZWQgZm9yIDMyIGJpdC4gKi8KKyNpZiBfX0JJVFNfUEVSX0xPTkcgIT0gNjQgfHwgZGVmaW5lZChfX0FSQ0hfV0FOVF9TVEFUNjQpCitzdHJ1Y3Qgc3RhdDY0IHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RfZGV2OwkvKiBEZXZpY2UuICAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdF9pbm87CS8qIEZpbGUgc2VyaWFsIG51bWJlci4gICovCisJdW5zaWduZWQgaW50CXN0X21vZGU7CS8qIEZpbGUgbW9kZS4gICovCisJdW5zaWduZWQgaW50CXN0X25saW5rOwkvKiBMaW5rIGNvdW50LiAgKi8KKwl1bnNpZ25lZCBpbnQJc3RfdWlkOwkJLyogVXNlciBJRCBvZiB0aGUgZmlsZSdzIG93bmVyLiAgKi8KKwl1bnNpZ25lZCBpbnQJc3RfZ2lkOwkJLyogR3JvdXAgSUQgb2YgdGhlIGZpbGUncyBncm91cC4gKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RfcmRldjsJLyogRGV2aWNlIG51bWJlciwgaWYgZGV2aWNlLiAgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgX19wYWQxOworCWxvbmcgbG9uZwlzdF9zaXplOwkvKiBTaXplIG9mIGZpbGUsIGluIGJ5dGVzLiAgKi8KKwlpbnQJCXN0X2Jsa3NpemU7CS8qIE9wdGltYWwgYmxvY2sgc2l6ZSBmb3IgSS9PLiAgKi8KKwlpbnQJCV9fcGFkMjsKKwlsb25nIGxvbmcJc3RfYmxvY2tzOwkvKiBOdW1iZXIgNTEyLWJ5dGUgYmxvY2tzIGFsbG9jYXRlZC4gKi8KKwlpbnQJCXN0X2F0aW1lOwkvKiBUaW1lIG9mIGxhc3QgYWNjZXNzLiAgKi8KKwl1bnNpZ25lZCBpbnQJc3RfYXRpbWVfbnNlYzsKKwlpbnQJCXN0X210aW1lOwkvKiBUaW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uLiAgKi8KKwl1bnNpZ25lZCBpbnQJc3RfbXRpbWVfbnNlYzsKKwlpbnQJCXN0X2N0aW1lOwkvKiBUaW1lIG9mIGxhc3Qgc3RhdHVzIGNoYW5nZS4gICovCisJdW5zaWduZWQgaW50CXN0X2N0aW1lX25zZWM7CisJdW5zaWduZWQgaW50CV9fdW51c2VkNDsKKwl1bnNpZ25lZCBpbnQJX191bnVzZWQ1OworfTsKKyNlbmRpZgorCisjZW5kaWYgLyogX19BU01fR0VORVJJQ19TVEFUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc3RhdGZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3N0YXRmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZDU0NDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3N0YXRmcy5oCkBAIC0wLDAgKzEsODMgQEAKKyNpZm5kZWYgX0dFTkVSSUNfU1RBVEZTX0gKKyNkZWZpbmUgX0dFTkVSSUNfU1RBVEZTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKworLyoKKyAqIE1vc3QgNjQtYml0IHBsYXRmb3JtcyB1c2UgJ2xvbmcnLCB3aGlsZSBtb3N0IDMyLWJpdCBwbGF0Zm9ybXMgdXNlICdfX3UzMicuCisgKiBZZXMsIHRoZXkgZGlmZmVyIGluIHNpZ25lZG5lc3MgYXMgd2VsbCBhcyBzaXplLgorICogU3BlY2lhbCBjYXNlcyBjYW4gb3ZlcnJpZGUgaXQgZm9yIHRoZW1zZWx2ZXMgLS0gZXhjZXB0IGZvciBTMzkweCwgd2hpY2gKKyAqIGlzIGp1c3QgYSBsaXR0bGUgdG9vIHNwZWNpYWwgZm9yIHVzLiBBbmQgTUlQUywgd2hpY2ggSSdtIG5vdCB0b3VjaGluZworICogd2l0aCBhIDEwJyBwb2xlLgorICovCisjaWZuZGVmIF9fc3RhdGZzX3dvcmQKKyNpZiBCSVRTX1BFUl9MT05HID09IDY0CisjZGVmaW5lIF9fc3RhdGZzX3dvcmQgbG9uZworI2Vsc2UKKyNkZWZpbmUgX19zdGF0ZnNfd29yZCBfX3UzMgorI2VuZGlmCisjZW5kaWYKKworc3RydWN0IHN0YXRmcyB7CisJX19zdGF0ZnNfd29yZCBmX3R5cGU7CisJX19zdGF0ZnNfd29yZCBmX2JzaXplOworCV9fc3RhdGZzX3dvcmQgZl9ibG9ja3M7CisJX19zdGF0ZnNfd29yZCBmX2JmcmVlOworCV9fc3RhdGZzX3dvcmQgZl9iYXZhaWw7CisJX19zdGF0ZnNfd29yZCBmX2ZpbGVzOworCV9fc3RhdGZzX3dvcmQgZl9mZnJlZTsKKwlfX2tlcm5lbF9mc2lkX3QgZl9mc2lkOworCV9fc3RhdGZzX3dvcmQgZl9uYW1lbGVuOworCV9fc3RhdGZzX3dvcmQgZl9mcnNpemU7CisJX19zdGF0ZnNfd29yZCBmX2ZsYWdzOworCV9fc3RhdGZzX3dvcmQgZl9zcGFyZVs0XTsKK307CisKKy8qCisgKiBBUk0gbmVlZHMgdG8gYXZvaWQgdGhlIDMyLWJpdCBwYWRkaW5nIGF0IHRoZSBlbmQsIGZvciBjb25zaXN0ZW5jeQorICogYmV0d2VlbiBFQUJJIGFuZCBPQUJJIAorICovCisjaWZuZGVmIEFSQ0hfUEFDS19TVEFURlM2NAorI2RlZmluZSBBUkNIX1BBQ0tfU1RBVEZTNjQKKyNlbmRpZgorCitzdHJ1Y3Qgc3RhdGZzNjQgeworCV9fc3RhdGZzX3dvcmQgZl90eXBlOworCV9fc3RhdGZzX3dvcmQgZl9ic2l6ZTsKKwlfX3U2NCBmX2Jsb2NrczsKKwlfX3U2NCBmX2JmcmVlOworCV9fdTY0IGZfYmF2YWlsOworCV9fdTY0IGZfZmlsZXM7CisJX191NjQgZl9mZnJlZTsKKwlfX2tlcm5lbF9mc2lkX3QgZl9mc2lkOworCV9fc3RhdGZzX3dvcmQgZl9uYW1lbGVuOworCV9fc3RhdGZzX3dvcmQgZl9mcnNpemU7CisJX19zdGF0ZnNfd29yZCBmX2ZsYWdzOworCV9fc3RhdGZzX3dvcmQgZl9zcGFyZVs0XTsKK30gQVJDSF9QQUNLX1NUQVRGUzY0OworCisvKiAKKyAqIElBNjQgYW5kIHg4Nl82NCBuZWVkIHRvIGF2b2lkIHRoZSAzMi1iaXQgcGFkZGluZyBhdCB0aGUgZW5kLAorICogdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBpMzg2IEFCSQorICovCisjaWZuZGVmIEFSQ0hfUEFDS19DT01QQVRfU1RBVEZTNjQKKyNkZWZpbmUgQVJDSF9QQUNLX0NPTVBBVF9TVEFURlM2NAorI2VuZGlmCisKK3N0cnVjdCBjb21wYXRfc3RhdGZzNjQgeworCV9fdTMyIGZfdHlwZTsKKwlfX3UzMiBmX2JzaXplOworCV9fdTY0IGZfYmxvY2tzOworCV9fdTY0IGZfYmZyZWU7CisJX191NjQgZl9iYXZhaWw7CisJX191NjQgZl9maWxlczsKKwlfX3U2NCBmX2ZmcmVlOworCV9fa2VybmVsX2ZzaWRfdCBmX2ZzaWQ7CisJX191MzIgZl9uYW1lbGVuOworCV9fdTMyIGZfZnJzaXplOworCV9fdTMyIGZfZmxhZ3M7CisJX191MzIgZl9zcGFyZVs0XTsKK30gQVJDSF9QQUNLX0NPTVBBVF9TVEFURlM2NDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3N3YWIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZTkwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3N3YWIuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9BU01fR0VORVJJQ19TV0FCX0gKKyNkZWZpbmUgX0FTTV9HRU5FUklDX1NXQUJfSAorCisjaW5jbHVkZSA8YXNtL2JpdHNwZXJsb25nLmg+CisKKy8qCisgKiAzMiBiaXQgYXJjaGl0ZWN0dXJlcyB0eXBpY2FsbHkgKGJ1dCBub3QgYWx3YXlzKSB3YW50IHRvCisgKiBzZXQgX19TV0FCXzY0X1RIUlVfMzJfXy4gSW4gdXNlciBzcGFjZSwgdGhpcyBpcyBvbmx5CisgKiB2YWxpZCBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgNjQgYml0IGRhdGEgdHlwZXMuCisgKi8KKworI2lmIF9fQklUU19QRVJfTE9ORyA9PSAzMgorI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgZGVmaW5lZChfX0tFUk5FTF9fKQorI2RlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogX0FTTV9HRU5FUklDX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy90ZXJtYml0cy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy90ZXJtYml0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMmI0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3Rlcm1iaXRzLmgKQEAgLTAsMCArMSwxOTkgQEAKKyNpZm5kZWYgX19BU01fR0VORVJJQ19URVJNQklUU19ICisjZGVmaW5lIF9fQVNNX0dFTkVSSUNfVEVSTUJJVFNfSAorCisjaW5jbHVkZSA8bGludXgvcG9zaXhfdHlwZXMuaD4KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCWNjX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlzcGVlZF90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJdGNmbGFnX3Q7CisKKyNkZWZpbmUgTkNDUyAxOQorc3RydWN0IHRlcm1pb3MgeworCXRjZmxhZ190IGNfaWZsYWc7CQkvKiBpbnB1dCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19vZmxhZzsJCS8qIG91dHB1dCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19jZmxhZzsJCS8qIGNvbnRyb2wgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfbGZsYWc7CQkvKiBsb2NhbCBtb2RlIGZsYWdzICovCisJY2NfdCBjX2xpbmU7CQkJLyogbGluZSBkaXNjaXBsaW5lICovCisJY2NfdCBjX2NjW05DQ1NdOwkJLyogY29udHJvbCBjaGFyYWN0ZXJzICovCit9OworCitzdHJ1Y3QgdGVybWlvczIgeworCXRjZmxhZ190IGNfaWZsYWc7CQkvKiBpbnB1dCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19vZmxhZzsJCS8qIG91dHB1dCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19jZmxhZzsJCS8qIGNvbnRyb2wgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfbGZsYWc7CQkvKiBsb2NhbCBtb2RlIGZsYWdzICovCisJY2NfdCBjX2xpbmU7CQkJLyogbGluZSBkaXNjaXBsaW5lICovCisJY2NfdCBjX2NjW05DQ1NdOwkJLyogY29udHJvbCBjaGFyYWN0ZXJzICovCisJc3BlZWRfdCBjX2lzcGVlZDsJCS8qIGlucHV0IHNwZWVkICovCisJc3BlZWRfdCBjX29zcGVlZDsJCS8qIG91dHB1dCBzcGVlZCAqLworfTsKKworc3RydWN0IGt0ZXJtaW9zIHsKKwl0Y2ZsYWdfdCBjX2lmbGFnOwkJLyogaW5wdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2xmbGFnOwkJLyogbG9jYWwgbW9kZSBmbGFncyAqLworCWNjX3QgY19saW5lOwkJCS8qIGxpbmUgZGlzY2lwbGluZSAqLworCWNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLworCXNwZWVkX3QgY19pc3BlZWQ7CQkvKiBpbnB1dCBzcGVlZCAqLworCXNwZWVkX3QgY19vc3BlZWQ7CQkvKiBvdXRwdXQgc3BlZWQgKi8KK307CisKKy8qIGNfY2MgY2hhcmFjdGVycyAqLworI2RlZmluZSBWSU5UUiAwCisjZGVmaW5lIFZRVUlUIDEKKyNkZWZpbmUgVkVSQVNFIDIKKyNkZWZpbmUgVktJTEwgMworI2RlZmluZSBWRU9GIDQKKyNkZWZpbmUgVlRJTUUgNQorI2RlZmluZSBWTUlOIDYKKyNkZWZpbmUgVlNXVEMgNworI2RlZmluZSBWU1RBUlQgOAorI2RlZmluZSBWU1RPUCA5CisjZGVmaW5lIFZTVVNQIDEwCisjZGVmaW5lIFZFT0wgMTEKKyNkZWZpbmUgVlJFUFJJTlQgMTIKKyNkZWZpbmUgVkRJU0NBUkQgMTMKKyNkZWZpbmUgVldFUkFTRSAxNAorI2RlZmluZSBWTE5FWFQgMTUKKyNkZWZpbmUgVkVPTDIgMTYKKworLyogY19pZmxhZyBiaXRzICovCisjZGVmaW5lIElHTkJSSwkwMDAwMDAxCisjZGVmaW5lIEJSS0lOVAkwMDAwMDAyCisjZGVmaW5lIElHTlBBUgkwMDAwMDA0CisjZGVmaW5lIFBBUk1SSwkwMDAwMDEwCisjZGVmaW5lIElOUENLCTAwMDAwMjAKKyNkZWZpbmUgSVNUUklQCTAwMDAwNDAKKyNkZWZpbmUgSU5MQ1IJMDAwMDEwMAorI2RlZmluZSBJR05DUgkwMDAwMjAwCisjZGVmaW5lIElDUk5MCTAwMDA0MDAKKyNkZWZpbmUgSVVDTEMJMDAwMTAwMAorI2RlZmluZSBJWE9OCTAwMDIwMDAKKyNkZWZpbmUgSVhBTlkJMDAwNDAwMAorI2RlZmluZSBJWE9GRgkwMDEwMDAwCisjZGVmaW5lIElNQVhCRUwJMDAyMDAwMAorI2RlZmluZSBJVVRGOAkwMDQwMDAwCisKKy8qIGNfb2ZsYWcgYml0cyAqLworI2RlZmluZSBPUE9TVAkwMDAwMDAxCisjZGVmaW5lIE9MQ1VDCTAwMDAwMDIKKyNkZWZpbmUgT05MQ1IJMDAwMDAwNAorI2RlZmluZSBPQ1JOTAkwMDAwMDEwCisjZGVmaW5lIE9OT0NSCTAwMDAwMjAKKyNkZWZpbmUgT05MUkVUCTAwMDAwNDAKKyNkZWZpbmUgT0ZJTEwJMDAwMDEwMAorI2RlZmluZSBPRkRFTAkwMDAwMjAwCisjZGVmaW5lIE5MRExZCTAwMDA0MDAKKyNkZWZpbmUgICBOTDAJMDAwMDAwMAorI2RlZmluZSAgIE5MMQkwMDAwNDAwCisjZGVmaW5lIENSRExZCTAwMDMwMDAKKyNkZWZpbmUgICBDUjAJMDAwMDAwMAorI2RlZmluZSAgIENSMQkwMDAxMDAwCisjZGVmaW5lICAgQ1IyCTAwMDIwMDAKKyNkZWZpbmUgICBDUjMJMDAwMzAwMAorI2RlZmluZSBUQUJETFkJMDAxNDAwMAorI2RlZmluZSAgIFRBQjAJMDAwMDAwMAorI2RlZmluZSAgIFRBQjEJMDAwNDAwMAorI2RlZmluZSAgIFRBQjIJMDAxMDAwMAorI2RlZmluZSAgIFRBQjMJMDAxNDAwMAorI2RlZmluZSAgIFhUQUJTCTAwMTQwMDAKKyNkZWZpbmUgQlNETFkJMDAyMDAwMAorI2RlZmluZSAgIEJTMAkwMDAwMDAwCisjZGVmaW5lICAgQlMxCTAwMjAwMDAKKyNkZWZpbmUgVlRETFkJMDA0MDAwMAorI2RlZmluZSAgIFZUMAkwMDAwMDAwCisjZGVmaW5lICAgVlQxCTAwNDAwMDAKKyNkZWZpbmUgRkZETFkJMDEwMDAwMAorI2RlZmluZSAgIEZGMAkwMDAwMDAwCisjZGVmaW5lICAgRkYxCTAxMDAwMDAKKworLyogY19jZmxhZyBiaXQgbWVhbmluZyAqLworI2RlZmluZSBDQkFVRAkwMDEwMDE3CisjZGVmaW5lICBCMAkwMDAwMDAwCQkvKiBoYW5nIHVwICovCisjZGVmaW5lICBCNTAJMDAwMDAwMQorI2RlZmluZSAgQjc1CTAwMDAwMDIKKyNkZWZpbmUgIEIxMTAJMDAwMDAwMworI2RlZmluZSAgQjEzNAkwMDAwMDA0CisjZGVmaW5lICBCMTUwCTAwMDAwMDUKKyNkZWZpbmUgIEIyMDAJMDAwMDAwNgorI2RlZmluZSAgQjMwMAkwMDAwMDA3CisjZGVmaW5lICBCNjAwCTAwMDAwMTAKKyNkZWZpbmUgIEIxMjAwCTAwMDAwMTEKKyNkZWZpbmUgIEIxODAwCTAwMDAwMTIKKyNkZWZpbmUgIEIyNDAwCTAwMDAwMTMKKyNkZWZpbmUgIEI0ODAwCTAwMDAwMTQKKyNkZWZpbmUgIEI5NjAwCTAwMDAwMTUKKyNkZWZpbmUgIEIxOTIwMAkwMDAwMDE2CisjZGVmaW5lICBCMzg0MDAJMDAwMDAxNworI2RlZmluZSBFWFRBIEIxOTIwMAorI2RlZmluZSBFWFRCIEIzODQwMAorI2RlZmluZSBDU0laRQkwMDAwMDYwCisjZGVmaW5lICAgQ1M1CTAwMDAwMDAKKyNkZWZpbmUgICBDUzYJMDAwMDAyMAorI2RlZmluZSAgIENTNwkwMDAwMDQwCisjZGVmaW5lICAgQ1M4CTAwMDAwNjAKKyNkZWZpbmUgQ1NUT1BCCTAwMDAxMDAKKyNkZWZpbmUgQ1JFQUQJMDAwMDIwMAorI2RlZmluZSBQQVJFTkIJMDAwMDQwMAorI2RlZmluZSBQQVJPREQJMDAwMTAwMAorI2RlZmluZSBIVVBDTAkwMDAyMDAwCisjZGVmaW5lIENMT0NBTAkwMDA0MDAwCisjZGVmaW5lIENCQVVERVggMDAxMDAwMAorI2RlZmluZSAgICBCT1RIRVIgMDAxMDAwMAorI2RlZmluZSAgICBCNTc2MDAgMDAxMDAwMQorI2RlZmluZSAgIEIxMTUyMDAgMDAxMDAwMgorI2RlZmluZSAgIEIyMzA0MDAgMDAxMDAwMworI2RlZmluZSAgIEI0NjA4MDAgMDAxMDAwNAorI2RlZmluZSAgIEI1MDAwMDAgMDAxMDAwNQorI2RlZmluZSAgIEI1NzYwMDAgMDAxMDAwNgorI2RlZmluZSAgIEI5MjE2MDAgMDAxMDAwNworI2RlZmluZSAgQjEwMDAwMDAgMDAxMDAxMAorI2RlZmluZSAgQjExNTIwMDAgMDAxMDAxMQorI2RlZmluZSAgQjE1MDAwMDAgMDAxMDAxMgorI2RlZmluZSAgQjIwMDAwMDAgMDAxMDAxMworI2RlZmluZSAgQjI1MDAwMDAgMDAxMDAxNAorI2RlZmluZSAgQjMwMDAwMDAgMDAxMDAxNQorI2RlZmluZSAgQjM1MDAwMDAgMDAxMDAxNgorI2RlZmluZSAgQjQwMDAwMDAgMDAxMDAxNworI2RlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJLyogaW5wdXQgYmF1ZCByYXRlICovCisjZGVmaW5lIENNU1BBUgkgIDAxMDAwMDAwMDAwMAkvKiBtYXJrIG9yIHNwYWNlIChzdGljaykgcGFyaXR5ICovCisjZGVmaW5lIENSVFNDVFMJICAwMjAwMDAwMDAwMDAJLyogZmxvdyBjb250cm9sICovCisKKyNkZWZpbmUgSUJTSElGVAkgIDE2CQkvKiBTaGlmdCBmcm9tIENCQVVEIHRvIENJQkFVRCAqLworCisvKiBjX2xmbGFnIGJpdHMgKi8KKyNkZWZpbmUgSVNJRwkwMDAwMDAxCisjZGVmaW5lIElDQU5PTgkwMDAwMDAyCisjZGVmaW5lIFhDQVNFCTAwMDAwMDQKKyNkZWZpbmUgRUNITwkwMDAwMDEwCisjZGVmaW5lIEVDSE9FCTAwMDAwMjAKKyNkZWZpbmUgRUNIT0sJMDAwMDA0MAorI2RlZmluZSBFQ0hPTkwJMDAwMDEwMAorI2RlZmluZSBOT0ZMU0gJMDAwMDIwMAorI2RlZmluZSBUT1NUT1AJMDAwMDQwMAorI2RlZmluZSBFQ0hPQ1RMCTAwMDEwMDAKKyNkZWZpbmUgRUNIT1BSVAkwMDAyMDAwCisjZGVmaW5lIEVDSE9LRQkwMDA0MDAwCisjZGVmaW5lIEZMVVNITwkwMDEwMDAwCisjZGVmaW5lIFBFTkRJTgkwMDQwMDAwCisjZGVmaW5lIElFWFRFTgkwMTAwMDAwCisjZGVmaW5lIEVYVFBST0MJMDIwMDAwMAorCisvKiB0Y2Zsb3coKSBhbmQgVENYT05DIHVzZSB0aGVzZSAqLworI2RlZmluZQlUQ09PRkYJCTAKKyNkZWZpbmUJVENPT04JCTEKKyNkZWZpbmUJVENJT0ZGCQkyCisjZGVmaW5lCVRDSU9OCQkzCisKKy8qIHRjZmx1c2goKSBhbmQgVENGTFNIIHVzZSB0aGVzZSAqLworI2RlZmluZQlUQ0lGTFVTSAkwCisjZGVmaW5lCVRDT0ZMVVNICTEKKyNkZWZpbmUJVENJT0ZMVVNICTIKKworLyogdGNzZXRhdHRyIHVzZXMgdGhlc2UgKi8KKyNkZWZpbmUJVENTQU5PVwkJMAorI2RlZmluZQlUQ1NBRFJBSU4JMQorI2RlZmluZQlUQ1NBRkxVU0gJMgorCisjZW5kaWYgLyogX19BU01fR0VORVJJQ19URVJNQklUU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3Rlcm1pb3MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvdGVybWlvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMTE2NmEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3Rlcm1pb3MuaApAQCAtMCwwICsxLDUwIEBACisjaWZuZGVmIF9BU01fR0VORVJJQ19URVJNSU9TX0gKKyNkZWZpbmUgX0FTTV9HRU5FUklDX1RFUk1JT1NfSAorLyoKKyAqIE1vc3QgYXJjaGl0ZWN0dXJlcyBoYXZlIHN0cmFpZ2h0IGNvcGllcyBvZiB0aGUgeDg2IGNvZGUsIHdpdGgKKyAqIHZhcnlpbmcgbGV2ZWxzIG9mIGJ1ZyBmaXhlcyBvbiB0b3AuIFVzdWFsbHkgaXQncyBhIGdvb2QgaWRlYQorICogdG8gdXNlIHRoaXMgZ2VuZXJpYyB2ZXJzaW9uIGluc3RlYWQsIGJ1dCBiZSBjYXJlZnVsIHRvIGF2b2lkCisgKiBBQkkgY2hhbmdlcy4KKyAqIE5ldyBhcmNoaXRlY3R1cmVzIHNob3VsZCBub3QgcHJvdmlkZSB0aGVpciBvd24gdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8YXNtL3Rlcm1iaXRzLmg+CisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorCitzdHJ1Y3Qgd2luc2l6ZSB7CisJdW5zaWduZWQgc2hvcnQgd3Nfcm93OworCXVuc2lnbmVkIHNob3J0IHdzX2NvbDsKKwl1bnNpZ25lZCBzaG9ydCB3c194cGl4ZWw7CisJdW5zaWduZWQgc2hvcnQgd3NfeXBpeGVsOworfTsKKworI2RlZmluZSBOQ0MgOAorc3RydWN0IHRlcm1pbyB7CisJdW5zaWduZWQgc2hvcnQgY19pZmxhZzsJCS8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKwl1bnNpZ25lZCBzaG9ydCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKwl1bnNpZ25lZCBzaG9ydCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisJdW5zaWduZWQgc2hvcnQgY19sZmxhZzsJCS8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKwl1bnNpZ25lZCBjaGFyIGNfbGluZTsJCS8qIGxpbmUgZGlzY2lwbGluZSAqLworCXVuc2lnbmVkIGNoYXIgY19jY1tOQ0NdOwkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KK307CisKKy8qIG1vZGVtIGxpbmVzICovCisjZGVmaW5lIFRJT0NNX0xFCTB4MDAxCisjZGVmaW5lIFRJT0NNX0RUUgkweDAwMgorI2RlZmluZSBUSU9DTV9SVFMJMHgwMDQKKyNkZWZpbmUgVElPQ01fU1QJMHgwMDgKKyNkZWZpbmUgVElPQ01fU1IJMHgwMTAKKyNkZWZpbmUgVElPQ01fQ1RTCTB4MDIwCisjZGVmaW5lIFRJT0NNX0NBUgkweDA0MAorI2RlZmluZSBUSU9DTV9STkcJMHgwODAKKyNkZWZpbmUgVElPQ01fRFNSCTB4MTAwCisjZGVmaW5lIFRJT0NNX0NECVRJT0NNX0NBUgorI2RlZmluZSBUSU9DTV9SSQlUSU9DTV9STkcKKyNkZWZpbmUgVElPQ01fT1VUMQkweDIwMDAKKyNkZWZpbmUgVElPQ01fT1VUMgkweDQwMDAKKyNkZWZpbmUgVElPQ01fTE9PUAkweDgwMDAKKworLyogaW9jdGwgKGZkLCBUSU9DU0VSR0VUTFNSLCAmcmVzdWx0KSB3aGVyZSByZXN1bHQgbWF5IGJlIGFzIGJlbG93ICovCisKKworI2VuZGlmIC8qIF9BU01fR0VORVJJQ19URVJNSU9TX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvdHlwZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTBmNjllCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy90eXBlcy5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX0FTTV9HRU5FUklDX1RZUEVTX0gKKyNkZWZpbmUgX0FTTV9HRU5FUklDX1RZUEVTX0gKKy8qCisgKiBpbnQtbGw2NCBpcyB1c2VkIHByYWN0aWNhbGx5IGV2ZXJ5d2hlcmUgbm93LAorICogc28gdXNlIGl0IGFzIGEgcmVhc29uYWJsZSBkZWZhdWx0LgorICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW50LWxsNjQuaD4KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1bW9kZV90OworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfQVNNX0dFTkVSSUNfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy91Y29udGV4dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy91Y29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNzczNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3Vjb250ZXh0LmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfX0FTTV9HRU5FUklDX1VDT05URVhUX0gKKyNkZWZpbmUgX19BU01fR0VORVJJQ19VQ09OVEVYVF9ICisKK3N0cnVjdCB1Y29udGV4dCB7CisJdW5zaWduZWQgbG9uZwkgIHVjX2ZsYWdzOworCXN0cnVjdCB1Y29udGV4dCAgKnVjX2xpbms7CisJc3RhY2tfdAkJICB1Y19zdGFjazsKKwlzdHJ1Y3Qgc2lnY29udGV4dCB1Y19tY29udGV4dDsKKwlzaWdzZXRfdAkgIHVjX3NpZ21hc2s7CS8qIG1hc2sgbGFzdCBmb3IgZXh0ZW5zaWJpbGl0eSAqLworfTsKKworI2VuZGlmIC8qIF9fQVNNX0dFTkVSSUNfVUNPTlRFWFRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy91bmlzdGQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvdW5pc3RkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQyY2NkNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvdW5pc3RkLmgKQEAgLTAsMCArMSw5MDUgQEAKKyNpZiAhZGVmaW5lZChfQVNNX0dFTkVSSUNfVU5JU1REX0gpIHx8IGRlZmluZWQoX19TWVNDQUxMKQorI2RlZmluZSBfQVNNX0dFTkVSSUNfVU5JU1REX0gKKworI2luY2x1ZGUgPGFzbS9iaXRzcGVybG9uZy5oPgorCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzeXN0ZW0gY2FsbCBudW1iZXJzLCBiYXNlZCBvbiB0aGUKKyAqIGxheW91dCBvZiB0aGUgeDg2LTY0IGFyY2hpdGVjdHVyZSwgd2hpY2ggZW1iZWRzIHRoZQorICogcG9pbnRlciB0byB0aGUgc3lzY2FsbCBpbiB0aGUgdGFibGUuCisgKgorICogQXMgYSBiYXNpYyBwcmluY2lwbGUsIG5vIGR1cGxpY2F0aW9uIG9mIGZ1bmN0aW9uYWxpdHkKKyAqIHNob3VsZCBiZSBhZGRlZCwgZS5nLiB3ZSBkb24ndCB1c2UgbHNlZWsgd2hlbiBsbHNlZWsKKyAqIGlzIHByZXNlbnQuIE5ldyBhcmNoaXRlY3R1cmVzIHNob3VsZCB1c2UgdGhpcyBmaWxlCisgKiBhbmQgaW1wbGVtZW50IHRoZSBsZXNzIGZlYXR1cmUtZnVsbCBjYWxscyBpbiB1c2VyIHNwYWNlLgorICovCisKKyNpZm5kZWYgX19TWVNDQUxMCisjZGVmaW5lIF9fU1lTQ0FMTCh4LCB5KQorI2VuZGlmCisKKyNpZiBfX0JJVFNfUEVSX0xPTkcgPT0gMzIgfHwgZGVmaW5lZChfX1NZU0NBTExfQ09NUEFUKQorI2RlZmluZSBfX1NDXzMyNjQoX25yLCBfMzIsIF82NCkgX19TWVNDQUxMKF9uciwgXzMyKQorI2Vsc2UKKyNkZWZpbmUgX19TQ18zMjY0KF9uciwgXzMyLCBfNjQpIF9fU1lTQ0FMTChfbnIsIF82NCkKKyNlbmRpZgorCisjaWZkZWYgX19TWVNDQUxMX0NPTVBBVAorI2RlZmluZSBfX1NDX0NPTVAoX25yLCBfc3lzLCBfY29tcCkgX19TWVNDQUxMKF9uciwgX2NvbXApCisjZGVmaW5lIF9fU0NfQ09NUF8zMjY0KF9uciwgXzMyLCBfNjQsIF9jb21wKSBfX1NZU0NBTEwoX25yLCBfY29tcCkKKyNlbHNlCisjZGVmaW5lIF9fU0NfQ09NUChfbnIsIF9zeXMsIF9jb21wKSBfX1NZU0NBTEwoX25yLCBfc3lzKQorI2RlZmluZSBfX1NDX0NPTVBfMzI2NChfbnIsIF8zMiwgXzY0LCBfY29tcCkgX19TQ18zMjY0KF9uciwgXzMyLCBfNjQpCisjZW5kaWYKKworI2RlZmluZSBfX05SX2lvX3NldHVwIDAKK19fU0NfQ09NUChfX05SX2lvX3NldHVwLCBzeXNfaW9fc2V0dXAsIGNvbXBhdF9zeXNfaW9fc2V0dXApCisjZGVmaW5lIF9fTlJfaW9fZGVzdHJveSAxCitfX1NZU0NBTEwoX19OUl9pb19kZXN0cm95LCBzeXNfaW9fZGVzdHJveSkKKyNkZWZpbmUgX19OUl9pb19zdWJtaXQgMgorX19TQ19DT01QKF9fTlJfaW9fc3VibWl0LCBzeXNfaW9fc3VibWl0LCBjb21wYXRfc3lzX2lvX3N1Ym1pdCkKKyNkZWZpbmUgX19OUl9pb19jYW5jZWwgMworX19TWVNDQUxMKF9fTlJfaW9fY2FuY2VsLCBzeXNfaW9fY2FuY2VsKQorI2RlZmluZSBfX05SX2lvX2dldGV2ZW50cyA0CitfX1NDX0NPTVAoX19OUl9pb19nZXRldmVudHMsIHN5c19pb19nZXRldmVudHMsIGNvbXBhdF9zeXNfaW9fZ2V0ZXZlbnRzKQorCisvKiBmcy94YXR0ci5jICovCisjZGVmaW5lIF9fTlJfc2V0eGF0dHIgNQorX19TWVNDQUxMKF9fTlJfc2V0eGF0dHIsIHN5c19zZXR4YXR0cikKKyNkZWZpbmUgX19OUl9sc2V0eGF0dHIgNgorX19TWVNDQUxMKF9fTlJfbHNldHhhdHRyLCBzeXNfbHNldHhhdHRyKQorI2RlZmluZSBfX05SX2ZzZXR4YXR0ciA3CitfX1NZU0NBTEwoX19OUl9mc2V0eGF0dHIsIHN5c19mc2V0eGF0dHIpCisjZGVmaW5lIF9fTlJfZ2V0eGF0dHIgOAorX19TWVNDQUxMKF9fTlJfZ2V0eGF0dHIsIHN5c19nZXR4YXR0cikKKyNkZWZpbmUgX19OUl9sZ2V0eGF0dHIgOQorX19TWVNDQUxMKF9fTlJfbGdldHhhdHRyLCBzeXNfbGdldHhhdHRyKQorI2RlZmluZSBfX05SX2ZnZXR4YXR0ciAxMAorX19TWVNDQUxMKF9fTlJfZmdldHhhdHRyLCBzeXNfZmdldHhhdHRyKQorI2RlZmluZSBfX05SX2xpc3R4YXR0ciAxMQorX19TWVNDQUxMKF9fTlJfbGlzdHhhdHRyLCBzeXNfbGlzdHhhdHRyKQorI2RlZmluZSBfX05SX2xsaXN0eGF0dHIgMTIKK19fU1lTQ0FMTChfX05SX2xsaXN0eGF0dHIsIHN5c19sbGlzdHhhdHRyKQorI2RlZmluZSBfX05SX2ZsaXN0eGF0dHIgMTMKK19fU1lTQ0FMTChfX05SX2ZsaXN0eGF0dHIsIHN5c19mbGlzdHhhdHRyKQorI2RlZmluZSBfX05SX3JlbW92ZXhhdHRyIDE0CitfX1NZU0NBTEwoX19OUl9yZW1vdmV4YXR0ciwgc3lzX3JlbW92ZXhhdHRyKQorI2RlZmluZSBfX05SX2xyZW1vdmV4YXR0ciAxNQorX19TWVNDQUxMKF9fTlJfbHJlbW92ZXhhdHRyLCBzeXNfbHJlbW92ZXhhdHRyKQorI2RlZmluZSBfX05SX2ZyZW1vdmV4YXR0ciAxNgorX19TWVNDQUxMKF9fTlJfZnJlbW92ZXhhdHRyLCBzeXNfZnJlbW92ZXhhdHRyKQorCisvKiBmcy9kY2FjaGUuYyAqLworI2RlZmluZSBfX05SX2dldGN3ZCAxNworX19TWVNDQUxMKF9fTlJfZ2V0Y3dkLCBzeXNfZ2V0Y3dkKQorCisvKiBmcy9jb29raWVzLmMgKi8KKyNkZWZpbmUgX19OUl9sb29rdXBfZGNvb2tpZSAxOAorX19TQ19DT01QKF9fTlJfbG9va3VwX2Rjb29raWUsIHN5c19sb29rdXBfZGNvb2tpZSwgY29tcGF0X3N5c19sb29rdXBfZGNvb2tpZSkKKworLyogZnMvZXZlbnRmZC5jICovCisjZGVmaW5lIF9fTlJfZXZlbnRmZDIgMTkKK19fU1lTQ0FMTChfX05SX2V2ZW50ZmQyLCBzeXNfZXZlbnRmZDIpCisKKy8qIGZzL2V2ZW50cG9sbC5jICovCisjZGVmaW5lIF9fTlJfZXBvbGxfY3JlYXRlMSAyMAorX19TWVNDQUxMKF9fTlJfZXBvbGxfY3JlYXRlMSwgc3lzX2Vwb2xsX2NyZWF0ZTEpCisjZGVmaW5lIF9fTlJfZXBvbGxfY3RsIDIxCitfX1NZU0NBTEwoX19OUl9lcG9sbF9jdGwsIHN5c19lcG9sbF9jdGwpCisjZGVmaW5lIF9fTlJfZXBvbGxfcHdhaXQgMjIKK19fU0NfQ09NUChfX05SX2Vwb2xsX3B3YWl0LCBzeXNfZXBvbGxfcHdhaXQsIGNvbXBhdF9zeXNfZXBvbGxfcHdhaXQpCisKKy8qIGZzL2ZjbnRsLmMgKi8KKyNkZWZpbmUgX19OUl9kdXAgMjMKK19fU1lTQ0FMTChfX05SX2R1cCwgc3lzX2R1cCkKKyNkZWZpbmUgX19OUl9kdXAzIDI0CitfX1NZU0NBTEwoX19OUl9kdXAzLCBzeXNfZHVwMykKKyNkZWZpbmUgX19OUjMyNjRfZmNudGwgMjUKK19fU0NfQ09NUF8zMjY0KF9fTlIzMjY0X2ZjbnRsLCBzeXNfZmNudGw2NCwgc3lzX2ZjbnRsLCBjb21wYXRfc3lzX2ZjbnRsNjQpCisKKy8qIGZzL2lub3RpZnlfdXNlci5jICovCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9pbml0MSAyNgorX19TWVNDQUxMKF9fTlJfaW5vdGlmeV9pbml0MSwgc3lzX2lub3RpZnlfaW5pdDEpCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9hZGRfd2F0Y2ggMjcKK19fU1lTQ0FMTChfX05SX2lub3RpZnlfYWRkX3dhdGNoLCBzeXNfaW5vdGlmeV9hZGRfd2F0Y2gpCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9ybV93YXRjaCAyOAorX19TWVNDQUxMKF9fTlJfaW5vdGlmeV9ybV93YXRjaCwgc3lzX2lub3RpZnlfcm1fd2F0Y2gpCisKKy8qIGZzL2lvY3RsLmMgKi8KKyNkZWZpbmUgX19OUl9pb2N0bCAyOQorX19TQ19DT01QKF9fTlJfaW9jdGwsIHN5c19pb2N0bCwgY29tcGF0X3N5c19pb2N0bCkKKworLyogZnMvaW9wcmlvLmMgKi8KKyNkZWZpbmUgX19OUl9pb3ByaW9fc2V0IDMwCitfX1NZU0NBTEwoX19OUl9pb3ByaW9fc2V0LCBzeXNfaW9wcmlvX3NldCkKKyNkZWZpbmUgX19OUl9pb3ByaW9fZ2V0IDMxCitfX1NZU0NBTEwoX19OUl9pb3ByaW9fZ2V0LCBzeXNfaW9wcmlvX2dldCkKKworLyogZnMvbG9ja3MuYyAqLworI2RlZmluZSBfX05SX2Zsb2NrIDMyCitfX1NZU0NBTEwoX19OUl9mbG9jaywgc3lzX2Zsb2NrKQorCisvKiBmcy9uYW1laS5jICovCisjZGVmaW5lIF9fTlJfbWtub2RhdCAzMworX19TWVNDQUxMKF9fTlJfbWtub2RhdCwgc3lzX21rbm9kYXQpCisjZGVmaW5lIF9fTlJfbWtkaXJhdCAzNAorX19TWVNDQUxMKF9fTlJfbWtkaXJhdCwgc3lzX21rZGlyYXQpCisjZGVmaW5lIF9fTlJfdW5saW5rYXQgMzUKK19fU1lTQ0FMTChfX05SX3VubGlua2F0LCBzeXNfdW5saW5rYXQpCisjZGVmaW5lIF9fTlJfc3ltbGlua2F0IDM2CitfX1NZU0NBTEwoX19OUl9zeW1saW5rYXQsIHN5c19zeW1saW5rYXQpCisjZGVmaW5lIF9fTlJfbGlua2F0IDM3CitfX1NZU0NBTEwoX19OUl9saW5rYXQsIHN5c19saW5rYXQpCisjZGVmaW5lIF9fTlJfcmVuYW1lYXQgMzgKK19fU1lTQ0FMTChfX05SX3JlbmFtZWF0LCBzeXNfcmVuYW1lYXQpCisKKy8qIGZzL25hbWVzcGFjZS5jICovCisjZGVmaW5lIF9fTlJfdW1vdW50MiAzOQorX19TWVNDQUxMKF9fTlJfdW1vdW50Miwgc3lzX3Vtb3VudCkKKyNkZWZpbmUgX19OUl9tb3VudCA0MAorX19TQ19DT01QKF9fTlJfbW91bnQsIHN5c19tb3VudCwgY29tcGF0X3N5c19tb3VudCkKKyNkZWZpbmUgX19OUl9waXZvdF9yb290IDQxCitfX1NZU0NBTEwoX19OUl9waXZvdF9yb290LCBzeXNfcGl2b3Rfcm9vdCkKKworLyogZnMvbmZzY3RsLmMgKi8KKyNkZWZpbmUgX19OUl9uZnNzZXJ2Y3RsIDQyCitfX1NZU0NBTEwoX19OUl9uZnNzZXJ2Y3RsLCBzeXNfbmlfc3lzY2FsbCkKKworLyogZnMvb3Blbi5jICovCisjZGVmaW5lIF9fTlIzMjY0X3N0YXRmcyA0MworX19TQ19DT01QXzMyNjQoX19OUjMyNjRfc3RhdGZzLCBzeXNfc3RhdGZzNjQsIHN5c19zdGF0ZnMsIFwKKwkgICAgICAgY29tcGF0X3N5c19zdGF0ZnM2NCkKKyNkZWZpbmUgX19OUjMyNjRfZnN0YXRmcyA0NAorX19TQ19DT01QXzMyNjQoX19OUjMyNjRfZnN0YXRmcywgc3lzX2ZzdGF0ZnM2NCwgc3lzX2ZzdGF0ZnMsIFwKKwkgICAgICAgY29tcGF0X3N5c19mc3RhdGZzNjQpCisjZGVmaW5lIF9fTlIzMjY0X3RydW5jYXRlIDQ1CitfX1NDX0NPTVBfMzI2NChfX05SMzI2NF90cnVuY2F0ZSwgc3lzX3RydW5jYXRlNjQsIHN5c190cnVuY2F0ZSwgXAorCSAgICAgICBjb21wYXRfc3lzX3RydW5jYXRlNjQpCisjZGVmaW5lIF9fTlIzMjY0X2Z0cnVuY2F0ZSA0NgorX19TQ19DT01QXzMyNjQoX19OUjMyNjRfZnRydW5jYXRlLCBzeXNfZnRydW5jYXRlNjQsIHN5c19mdHJ1bmNhdGUsIFwKKwkgICAgICAgY29tcGF0X3N5c19mdHJ1bmNhdGU2NCkKKworI2RlZmluZSBfX05SX2ZhbGxvY2F0ZSA0NworX19TQ19DT01QKF9fTlJfZmFsbG9jYXRlLCBzeXNfZmFsbG9jYXRlLCBjb21wYXRfc3lzX2ZhbGxvY2F0ZSkKKyNkZWZpbmUgX19OUl9mYWNjZXNzYXQgNDgKK19fU1lTQ0FMTChfX05SX2ZhY2Nlc3NhdCwgc3lzX2ZhY2Nlc3NhdCkKKyNkZWZpbmUgX19OUl9jaGRpciA0OQorX19TWVNDQUxMKF9fTlJfY2hkaXIsIHN5c19jaGRpcikKKyNkZWZpbmUgX19OUl9mY2hkaXIgNTAKK19fU1lTQ0FMTChfX05SX2ZjaGRpciwgc3lzX2ZjaGRpcikKKyNkZWZpbmUgX19OUl9jaHJvb3QgNTEKK19fU1lTQ0FMTChfX05SX2Nocm9vdCwgc3lzX2Nocm9vdCkKKyNkZWZpbmUgX19OUl9mY2htb2QgNTIKK19fU1lTQ0FMTChfX05SX2ZjaG1vZCwgc3lzX2ZjaG1vZCkKKyNkZWZpbmUgX19OUl9mY2htb2RhdCA1MworX19TWVNDQUxMKF9fTlJfZmNobW9kYXQsIHN5c19mY2htb2RhdCkKKyNkZWZpbmUgX19OUl9mY2hvd25hdCA1NAorX19TWVNDQUxMKF9fTlJfZmNob3duYXQsIHN5c19mY2hvd25hdCkKKyNkZWZpbmUgX19OUl9mY2hvd24gNTUKK19fU1lTQ0FMTChfX05SX2ZjaG93biwgc3lzX2ZjaG93bikKKyNkZWZpbmUgX19OUl9vcGVuYXQgNTYKK19fU0NfQ09NUChfX05SX29wZW5hdCwgc3lzX29wZW5hdCwgY29tcGF0X3N5c19vcGVuYXQpCisjZGVmaW5lIF9fTlJfY2xvc2UgNTcKK19fU1lTQ0FMTChfX05SX2Nsb3NlLCBzeXNfY2xvc2UpCisjZGVmaW5lIF9fTlJfdmhhbmd1cCA1OAorX19TWVNDQUxMKF9fTlJfdmhhbmd1cCwgc3lzX3ZoYW5ndXApCisKKy8qIGZzL3BpcGUuYyAqLworI2RlZmluZSBfX05SX3BpcGUyIDU5CitfX1NZU0NBTEwoX19OUl9waXBlMiwgc3lzX3BpcGUyKQorCisvKiBmcy9xdW90YS5jICovCisjZGVmaW5lIF9fTlJfcXVvdGFjdGwgNjAKK19fU1lTQ0FMTChfX05SX3F1b3RhY3RsLCBzeXNfcXVvdGFjdGwpCisKKy8qIGZzL3JlYWRkaXIuYyAqLworI2RlZmluZSBfX05SX2dldGRlbnRzNjQgNjEKK19fU0NfQ09NUChfX05SX2dldGRlbnRzNjQsIHN5c19nZXRkZW50czY0LCBjb21wYXRfc3lzX2dldGRlbnRzNjQpCisKKy8qIGZzL3JlYWRfd3JpdGUuYyAqLworI2RlZmluZSBfX05SMzI2NF9sc2VlayA2MgorX19TQ18zMjY0KF9fTlIzMjY0X2xzZWVrLCBzeXNfbGxzZWVrLCBzeXNfbHNlZWspCisjZGVmaW5lIF9fTlJfcmVhZCA2MworX19TWVNDQUxMKF9fTlJfcmVhZCwgc3lzX3JlYWQpCisjZGVmaW5lIF9fTlJfd3JpdGUgNjQKK19fU1lTQ0FMTChfX05SX3dyaXRlLCBzeXNfd3JpdGUpCisjZGVmaW5lIF9fTlJfcmVhZHYgNjUKK19fU0NfQ09NUChfX05SX3JlYWR2LCBzeXNfcmVhZHYsIGNvbXBhdF9zeXNfcmVhZHYpCisjZGVmaW5lIF9fTlJfd3JpdGV2IDY2CitfX1NDX0NPTVAoX19OUl93cml0ZXYsIHN5c193cml0ZXYsIGNvbXBhdF9zeXNfd3JpdGV2KQorI2RlZmluZSBfX05SX3ByZWFkNjQgNjcKK19fU0NfQ09NUChfX05SX3ByZWFkNjQsIHN5c19wcmVhZDY0LCBjb21wYXRfc3lzX3ByZWFkNjQpCisjZGVmaW5lIF9fTlJfcHdyaXRlNjQgNjgKK19fU0NfQ09NUChfX05SX3B3cml0ZTY0LCBzeXNfcHdyaXRlNjQsIGNvbXBhdF9zeXNfcHdyaXRlNjQpCisjZGVmaW5lIF9fTlJfcHJlYWR2IDY5CitfX1NDX0NPTVAoX19OUl9wcmVhZHYsIHN5c19wcmVhZHYsIGNvbXBhdF9zeXNfcHJlYWR2KQorI2RlZmluZSBfX05SX3B3cml0ZXYgNzAKK19fU0NfQ09NUChfX05SX3B3cml0ZXYsIHN5c19wd3JpdGV2LCBjb21wYXRfc3lzX3B3cml0ZXYpCisKKy8qIGZzL3NlbmRmaWxlLmMgKi8KKyNkZWZpbmUgX19OUjMyNjRfc2VuZGZpbGUgNzEKK19fU1lTQ0FMTChfX05SMzI2NF9zZW5kZmlsZSwgc3lzX3NlbmRmaWxlNjQpCisKKy8qIGZzL3NlbGVjdC5jICovCisjZGVmaW5lIF9fTlJfcHNlbGVjdDYgNzIKK19fU0NfQ09NUChfX05SX3BzZWxlY3Q2LCBzeXNfcHNlbGVjdDYsIGNvbXBhdF9zeXNfcHNlbGVjdDYpCisjZGVmaW5lIF9fTlJfcHBvbGwgNzMKK19fU0NfQ09NUChfX05SX3Bwb2xsLCBzeXNfcHBvbGwsIGNvbXBhdF9zeXNfcHBvbGwpCisKKy8qIGZzL3NpZ25hbGZkLmMgKi8KKyNkZWZpbmUgX19OUl9zaWduYWxmZDQgNzQKK19fU0NfQ09NUChfX05SX3NpZ25hbGZkNCwgc3lzX3NpZ25hbGZkNCwgY29tcGF0X3N5c19zaWduYWxmZDQpCisKKy8qIGZzL3NwbGljZS5jICovCisjZGVmaW5lIF9fTlJfdm1zcGxpY2UgNzUKK19fU0NfQ09NUChfX05SX3Ztc3BsaWNlLCBzeXNfdm1zcGxpY2UsIGNvbXBhdF9zeXNfdm1zcGxpY2UpCisjZGVmaW5lIF9fTlJfc3BsaWNlIDc2CitfX1NZU0NBTEwoX19OUl9zcGxpY2UsIHN5c19zcGxpY2UpCisjZGVmaW5lIF9fTlJfdGVlIDc3CitfX1NZU0NBTEwoX19OUl90ZWUsIHN5c190ZWUpCisKKy8qIGZzL3N0YXQuYyAqLworI2RlZmluZSBfX05SX3JlYWRsaW5rYXQgNzgKK19fU1lTQ0FMTChfX05SX3JlYWRsaW5rYXQsIHN5c19yZWFkbGlua2F0KQorI2RlZmluZSBfX05SMzI2NF9mc3RhdGF0IDc5CitfX1NDXzMyNjQoX19OUjMyNjRfZnN0YXRhdCwgc3lzX2ZzdGF0YXQ2NCwgc3lzX25ld2ZzdGF0YXQpCisjZGVmaW5lIF9fTlIzMjY0X2ZzdGF0IDgwCitfX1NDXzMyNjQoX19OUjMyNjRfZnN0YXQsIHN5c19mc3RhdDY0LCBzeXNfbmV3ZnN0YXQpCisKKy8qIGZzL3N5bmMuYyAqLworI2RlZmluZSBfX05SX3N5bmMgODEKK19fU1lTQ0FMTChfX05SX3N5bmMsIHN5c19zeW5jKQorI2RlZmluZSBfX05SX2ZzeW5jIDgyCitfX1NZU0NBTEwoX19OUl9mc3luYywgc3lzX2ZzeW5jKQorI2RlZmluZSBfX05SX2ZkYXRhc3luYyA4MworX19TWVNDQUxMKF9fTlJfZmRhdGFzeW5jLCBzeXNfZmRhdGFzeW5jKQorI2lmZGVmIF9fQVJDSF9XQU5UX1NZTkNfRklMRV9SQU5HRTIKKyNkZWZpbmUgX19OUl9zeW5jX2ZpbGVfcmFuZ2UyIDg0CitfX1NDX0NPTVAoX19OUl9zeW5jX2ZpbGVfcmFuZ2UyLCBzeXNfc3luY19maWxlX3JhbmdlMiwgXAorCSAgY29tcGF0X3N5c19zeW5jX2ZpbGVfcmFuZ2UyKQorI2Vsc2UKKyNkZWZpbmUgX19OUl9zeW5jX2ZpbGVfcmFuZ2UgODQKK19fU0NfQ09NUChfX05SX3N5bmNfZmlsZV9yYW5nZSwgc3lzX3N5bmNfZmlsZV9yYW5nZSwgXAorCSAgY29tcGF0X3N5c19zeW5jX2ZpbGVfcmFuZ2UpCisjZW5kaWYKKworLyogZnMvdGltZXJmZC5jICovCisjZGVmaW5lIF9fTlJfdGltZXJmZF9jcmVhdGUgODUKK19fU1lTQ0FMTChfX05SX3RpbWVyZmRfY3JlYXRlLCBzeXNfdGltZXJmZF9jcmVhdGUpCisjZGVmaW5lIF9fTlJfdGltZXJmZF9zZXR0aW1lIDg2CitfX1NDX0NPTVAoX19OUl90aW1lcmZkX3NldHRpbWUsIHN5c190aW1lcmZkX3NldHRpbWUsIFwKKwkgIGNvbXBhdF9zeXNfdGltZXJmZF9zZXR0aW1lKQorI2RlZmluZSBfX05SX3RpbWVyZmRfZ2V0dGltZSA4NworX19TQ19DT01QKF9fTlJfdGltZXJmZF9nZXR0aW1lLCBzeXNfdGltZXJmZF9nZXR0aW1lLCBcCisJICBjb21wYXRfc3lzX3RpbWVyZmRfZ2V0dGltZSkKKworLyogZnMvdXRpbWVzLmMgKi8KKyNkZWZpbmUgX19OUl91dGltZW5zYXQgODgKK19fU0NfQ09NUChfX05SX3V0aW1lbnNhdCwgc3lzX3V0aW1lbnNhdCwgY29tcGF0X3N5c191dGltZW5zYXQpCisKKy8qIGtlcm5lbC9hY2N0LmMgKi8KKyNkZWZpbmUgX19OUl9hY2N0IDg5CitfX1NZU0NBTEwoX19OUl9hY2N0LCBzeXNfYWNjdCkKKworLyoga2VybmVsL2NhcGFiaWxpdHkuYyAqLworI2RlZmluZSBfX05SX2NhcGdldCA5MAorX19TWVNDQUxMKF9fTlJfY2FwZ2V0LCBzeXNfY2FwZ2V0KQorI2RlZmluZSBfX05SX2NhcHNldCA5MQorX19TWVNDQUxMKF9fTlJfY2Fwc2V0LCBzeXNfY2Fwc2V0KQorCisvKiBrZXJuZWwvZXhlY19kb21haW4uYyAqLworI2RlZmluZSBfX05SX3BlcnNvbmFsaXR5IDkyCitfX1NZU0NBTEwoX19OUl9wZXJzb25hbGl0eSwgc3lzX3BlcnNvbmFsaXR5KQorCisvKiBrZXJuZWwvZXhpdC5jICovCisjZGVmaW5lIF9fTlJfZXhpdCA5MworX19TWVNDQUxMKF9fTlJfZXhpdCwgc3lzX2V4aXQpCisjZGVmaW5lIF9fTlJfZXhpdF9ncm91cCA5NAorX19TWVNDQUxMKF9fTlJfZXhpdF9ncm91cCwgc3lzX2V4aXRfZ3JvdXApCisjZGVmaW5lIF9fTlJfd2FpdGlkIDk1CitfX1NDX0NPTVAoX19OUl93YWl0aWQsIHN5c193YWl0aWQsIGNvbXBhdF9zeXNfd2FpdGlkKQorCisvKiBrZXJuZWwvZm9yay5jICovCisjZGVmaW5lIF9fTlJfc2V0X3RpZF9hZGRyZXNzIDk2CitfX1NZU0NBTEwoX19OUl9zZXRfdGlkX2FkZHJlc3MsIHN5c19zZXRfdGlkX2FkZHJlc3MpCisjZGVmaW5lIF9fTlJfdW5zaGFyZSA5NworX19TWVNDQUxMKF9fTlJfdW5zaGFyZSwgc3lzX3Vuc2hhcmUpCisKKy8qIGtlcm5lbC9mdXRleC5jICovCisjZGVmaW5lIF9fTlJfZnV0ZXggOTgKK19fU0NfQ09NUChfX05SX2Z1dGV4LCBzeXNfZnV0ZXgsIGNvbXBhdF9zeXNfZnV0ZXgpCisjZGVmaW5lIF9fTlJfc2V0X3JvYnVzdF9saXN0IDk5CitfX1NDX0NPTVAoX19OUl9zZXRfcm9idXN0X2xpc3QsIHN5c19zZXRfcm9idXN0X2xpc3QsIFwKKwkgIGNvbXBhdF9zeXNfc2V0X3JvYnVzdF9saXN0KQorI2RlZmluZSBfX05SX2dldF9yb2J1c3RfbGlzdCAxMDAKK19fU0NfQ09NUChfX05SX2dldF9yb2J1c3RfbGlzdCwgc3lzX2dldF9yb2J1c3RfbGlzdCwgXAorCSAgY29tcGF0X3N5c19nZXRfcm9idXN0X2xpc3QpCisKKy8qIGtlcm5lbC9ocnRpbWVyLmMgKi8KKyNkZWZpbmUgX19OUl9uYW5vc2xlZXAgMTAxCitfX1NDX0NPTVAoX19OUl9uYW5vc2xlZXAsIHN5c19uYW5vc2xlZXAsIGNvbXBhdF9zeXNfbmFub3NsZWVwKQorCisvKiBrZXJuZWwvaXRpbWVyLmMgKi8KKyNkZWZpbmUgX19OUl9nZXRpdGltZXIgMTAyCitfX1NDX0NPTVAoX19OUl9nZXRpdGltZXIsIHN5c19nZXRpdGltZXIsIGNvbXBhdF9zeXNfZ2V0aXRpbWVyKQorI2RlZmluZSBfX05SX3NldGl0aW1lciAxMDMKK19fU0NfQ09NUChfX05SX3NldGl0aW1lciwgc3lzX3NldGl0aW1lciwgY29tcGF0X3N5c19zZXRpdGltZXIpCisKKy8qIGtlcm5lbC9rZXhlYy5jICovCisjZGVmaW5lIF9fTlJfa2V4ZWNfbG9hZCAxMDQKK19fU0NfQ09NUChfX05SX2tleGVjX2xvYWQsIHN5c19rZXhlY19sb2FkLCBjb21wYXRfc3lzX2tleGVjX2xvYWQpCisKKy8qIGtlcm5lbC9tb2R1bGUuYyAqLworI2RlZmluZSBfX05SX2luaXRfbW9kdWxlIDEwNQorX19TWVNDQUxMKF9fTlJfaW5pdF9tb2R1bGUsIHN5c19pbml0X21vZHVsZSkKKyNkZWZpbmUgX19OUl9kZWxldGVfbW9kdWxlIDEwNgorX19TWVNDQUxMKF9fTlJfZGVsZXRlX21vZHVsZSwgc3lzX2RlbGV0ZV9tb2R1bGUpCisKKy8qIGtlcm5lbC9wb3NpeC10aW1lcnMuYyAqLworI2RlZmluZSBfX05SX3RpbWVyX2NyZWF0ZSAxMDcKK19fU0NfQ09NUChfX05SX3RpbWVyX2NyZWF0ZSwgc3lzX3RpbWVyX2NyZWF0ZSwgY29tcGF0X3N5c190aW1lcl9jcmVhdGUpCisjZGVmaW5lIF9fTlJfdGltZXJfZ2V0dGltZSAxMDgKK19fU0NfQ09NUChfX05SX3RpbWVyX2dldHRpbWUsIHN5c190aW1lcl9nZXR0aW1lLCBjb21wYXRfc3lzX3RpbWVyX2dldHRpbWUpCisjZGVmaW5lIF9fTlJfdGltZXJfZ2V0b3ZlcnJ1biAxMDkKK19fU1lTQ0FMTChfX05SX3RpbWVyX2dldG92ZXJydW4sIHN5c190aW1lcl9nZXRvdmVycnVuKQorI2RlZmluZSBfX05SX3RpbWVyX3NldHRpbWUgMTEwCitfX1NDX0NPTVAoX19OUl90aW1lcl9zZXR0aW1lLCBzeXNfdGltZXJfc2V0dGltZSwgY29tcGF0X3N5c190aW1lcl9zZXR0aW1lKQorI2RlZmluZSBfX05SX3RpbWVyX2RlbGV0ZSAxMTEKK19fU1lTQ0FMTChfX05SX3RpbWVyX2RlbGV0ZSwgc3lzX3RpbWVyX2RlbGV0ZSkKKyNkZWZpbmUgX19OUl9jbG9ja19zZXR0aW1lIDExMgorX19TQ19DT01QKF9fTlJfY2xvY2tfc2V0dGltZSwgc3lzX2Nsb2NrX3NldHRpbWUsIGNvbXBhdF9zeXNfY2xvY2tfc2V0dGltZSkKKyNkZWZpbmUgX19OUl9jbG9ja19nZXR0aW1lIDExMworX19TQ19DT01QKF9fTlJfY2xvY2tfZ2V0dGltZSwgc3lzX2Nsb2NrX2dldHRpbWUsIGNvbXBhdF9zeXNfY2xvY2tfZ2V0dGltZSkKKyNkZWZpbmUgX19OUl9jbG9ja19nZXRyZXMgMTE0CitfX1NDX0NPTVAoX19OUl9jbG9ja19nZXRyZXMsIHN5c19jbG9ja19nZXRyZXMsIGNvbXBhdF9zeXNfY2xvY2tfZ2V0cmVzKQorI2RlZmluZSBfX05SX2Nsb2NrX25hbm9zbGVlcCAxMTUKK19fU0NfQ09NUChfX05SX2Nsb2NrX25hbm9zbGVlcCwgc3lzX2Nsb2NrX25hbm9zbGVlcCwgXAorCSAgY29tcGF0X3N5c19jbG9ja19uYW5vc2xlZXApCisKKy8qIGtlcm5lbC9wcmludGsuYyAqLworI2RlZmluZSBfX05SX3N5c2xvZyAxMTYKK19fU1lTQ0FMTChfX05SX3N5c2xvZywgc3lzX3N5c2xvZykKKworLyoga2VybmVsL3B0cmFjZS5jICovCisjZGVmaW5lIF9fTlJfcHRyYWNlIDExNworX19TWVNDQUxMKF9fTlJfcHRyYWNlLCBzeXNfcHRyYWNlKQorCisvKiBrZXJuZWwvc2NoZWQuYyAqLworI2RlZmluZSBfX05SX3NjaGVkX3NldHBhcmFtIDExOAorX19TWVNDQUxMKF9fTlJfc2NoZWRfc2V0cGFyYW0sIHN5c19zY2hlZF9zZXRwYXJhbSkKKyNkZWZpbmUgX19OUl9zY2hlZF9zZXRzY2hlZHVsZXIgMTE5CitfX1NZU0NBTEwoX19OUl9zY2hlZF9zZXRzY2hlZHVsZXIsIHN5c19zY2hlZF9zZXRzY2hlZHVsZXIpCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0c2NoZWR1bGVyIDEyMAorX19TWVNDQUxMKF9fTlJfc2NoZWRfZ2V0c2NoZWR1bGVyLCBzeXNfc2NoZWRfZ2V0c2NoZWR1bGVyKQorI2RlZmluZSBfX05SX3NjaGVkX2dldHBhcmFtIDEyMQorX19TWVNDQUxMKF9fTlJfc2NoZWRfZ2V0cGFyYW0sIHN5c19zY2hlZF9nZXRwYXJhbSkKKyNkZWZpbmUgX19OUl9zY2hlZF9zZXRhZmZpbml0eSAxMjIKK19fU0NfQ09NUChfX05SX3NjaGVkX3NldGFmZmluaXR5LCBzeXNfc2NoZWRfc2V0YWZmaW5pdHksIFwKKwkgIGNvbXBhdF9zeXNfc2NoZWRfc2V0YWZmaW5pdHkpCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgMTIzCitfX1NDX0NPTVAoX19OUl9zY2hlZF9nZXRhZmZpbml0eSwgc3lzX3NjaGVkX2dldGFmZmluaXR5LCBcCisJICBjb21wYXRfc3lzX3NjaGVkX2dldGFmZmluaXR5KQorI2RlZmluZSBfX05SX3NjaGVkX3lpZWxkIDEyNAorX19TWVNDQUxMKF9fTlJfc2NoZWRfeWllbGQsIHN5c19zY2hlZF95aWVsZCkKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRfcHJpb3JpdHlfbWF4IDEyNQorX19TWVNDQUxMKF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21heCwgc3lzX3NjaGVkX2dldF9wcmlvcml0eV9tYXgpCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiAxMjYKK19fU1lTQ0FMTChfX05SX3NjaGVkX2dldF9wcmlvcml0eV9taW4sIHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWluKQorI2RlZmluZSBfX05SX3NjaGVkX3JyX2dldF9pbnRlcnZhbCAxMjcKK19fU0NfQ09NUChfX05SX3NjaGVkX3JyX2dldF9pbnRlcnZhbCwgc3lzX3NjaGVkX3JyX2dldF9pbnRlcnZhbCwgXAorCSAgY29tcGF0X3N5c19zY2hlZF9ycl9nZXRfaW50ZXJ2YWwpCisKKy8qIGtlcm5lbC9zaWduYWwuYyAqLworI2RlZmluZSBfX05SX3Jlc3RhcnRfc3lzY2FsbCAxMjgKK19fU1lTQ0FMTChfX05SX3Jlc3RhcnRfc3lzY2FsbCwgc3lzX3Jlc3RhcnRfc3lzY2FsbCkKKyNkZWZpbmUgX19OUl9raWxsIDEyOQorX19TWVNDQUxMKF9fTlJfa2lsbCwgc3lzX2tpbGwpCisjZGVmaW5lIF9fTlJfdGtpbGwgMTMwCitfX1NZU0NBTEwoX19OUl90a2lsbCwgc3lzX3RraWxsKQorI2RlZmluZSBfX05SX3Rna2lsbCAxMzEKK19fU1lTQ0FMTChfX05SX3Rna2lsbCwgc3lzX3Rna2lsbCkKKyNkZWZpbmUgX19OUl9zaWdhbHRzdGFjayAxMzIKK19fU0NfQ09NUChfX05SX3NpZ2FsdHN0YWNrLCBzeXNfc2lnYWx0c3RhY2ssIGNvbXBhdF9zeXNfc2lnYWx0c3RhY2spCisjZGVmaW5lIF9fTlJfcnRfc2lnc3VzcGVuZCAxMzMKK19fU0NfQ09NUChfX05SX3J0X3NpZ3N1c3BlbmQsIHN5c19ydF9zaWdzdXNwZW5kLCBjb21wYXRfc3lzX3J0X3NpZ3N1c3BlbmQpCisjZGVmaW5lIF9fTlJfcnRfc2lnYWN0aW9uIDEzNAorX19TQ19DT01QKF9fTlJfcnRfc2lnYWN0aW9uLCBzeXNfcnRfc2lnYWN0aW9uLCBjb21wYXRfc3lzX3J0X3NpZ2FjdGlvbikKKyNkZWZpbmUgX19OUl9ydF9zaWdwcm9jbWFzayAxMzUKK19fU1lTQ0FMTChfX05SX3J0X3NpZ3Byb2NtYXNrLCBzeXNfcnRfc2lncHJvY21hc2spCisjZGVmaW5lIF9fTlJfcnRfc2lncGVuZGluZyAxMzYKK19fU1lTQ0FMTChfX05SX3J0X3NpZ3BlbmRpbmcsIHN5c19ydF9zaWdwZW5kaW5nKQorI2RlZmluZSBfX05SX3J0X3NpZ3RpbWVkd2FpdCAxMzcKK19fU0NfQ09NUChfX05SX3J0X3NpZ3RpbWVkd2FpdCwgc3lzX3J0X3NpZ3RpbWVkd2FpdCwgXAorCSAgY29tcGF0X3N5c19ydF9zaWd0aW1lZHdhaXQpCisjZGVmaW5lIF9fTlJfcnRfc2lncXVldWVpbmZvIDEzOAorX19TQ19DT01QKF9fTlJfcnRfc2lncXVldWVpbmZvLCBzeXNfcnRfc2lncXVldWVpbmZvLCBcCisJICBjb21wYXRfc3lzX3J0X3NpZ3F1ZXVlaW5mbykKKyNkZWZpbmUgX19OUl9ydF9zaWdyZXR1cm4gMTM5CitfX1NDX0NPTVAoX19OUl9ydF9zaWdyZXR1cm4sIHN5c19ydF9zaWdyZXR1cm4sIGNvbXBhdF9zeXNfcnRfc2lncmV0dXJuKQorCisvKiBrZXJuZWwvc3lzLmMgKi8KKyNkZWZpbmUgX19OUl9zZXRwcmlvcml0eSAxNDAKK19fU1lTQ0FMTChfX05SX3NldHByaW9yaXR5LCBzeXNfc2V0cHJpb3JpdHkpCisjZGVmaW5lIF9fTlJfZ2V0cHJpb3JpdHkgMTQxCitfX1NZU0NBTEwoX19OUl9nZXRwcmlvcml0eSwgc3lzX2dldHByaW9yaXR5KQorI2RlZmluZSBfX05SX3JlYm9vdCAxNDIKK19fU1lTQ0FMTChfX05SX3JlYm9vdCwgc3lzX3JlYm9vdCkKKyNkZWZpbmUgX19OUl9zZXRyZWdpZCAxNDMKK19fU1lTQ0FMTChfX05SX3NldHJlZ2lkLCBzeXNfc2V0cmVnaWQpCisjZGVmaW5lIF9fTlJfc2V0Z2lkIDE0NAorX19TWVNDQUxMKF9fTlJfc2V0Z2lkLCBzeXNfc2V0Z2lkKQorI2RlZmluZSBfX05SX3NldHJldWlkIDE0NQorX19TWVNDQUxMKF9fTlJfc2V0cmV1aWQsIHN5c19zZXRyZXVpZCkKKyNkZWZpbmUgX19OUl9zZXR1aWQgMTQ2CitfX1NZU0NBTEwoX19OUl9zZXR1aWQsIHN5c19zZXR1aWQpCisjZGVmaW5lIF9fTlJfc2V0cmVzdWlkIDE0NworX19TWVNDQUxMKF9fTlJfc2V0cmVzdWlkLCBzeXNfc2V0cmVzdWlkKQorI2RlZmluZSBfX05SX2dldHJlc3VpZCAxNDgKK19fU1lTQ0FMTChfX05SX2dldHJlc3VpZCwgc3lzX2dldHJlc3VpZCkKKyNkZWZpbmUgX19OUl9zZXRyZXNnaWQgMTQ5CitfX1NZU0NBTEwoX19OUl9zZXRyZXNnaWQsIHN5c19zZXRyZXNnaWQpCisjZGVmaW5lIF9fTlJfZ2V0cmVzZ2lkIDE1MAorX19TWVNDQUxMKF9fTlJfZ2V0cmVzZ2lkLCBzeXNfZ2V0cmVzZ2lkKQorI2RlZmluZSBfX05SX3NldGZzdWlkIDE1MQorX19TWVNDQUxMKF9fTlJfc2V0ZnN1aWQsIHN5c19zZXRmc3VpZCkKKyNkZWZpbmUgX19OUl9zZXRmc2dpZCAxNTIKK19fU1lTQ0FMTChfX05SX3NldGZzZ2lkLCBzeXNfc2V0ZnNnaWQpCisjZGVmaW5lIF9fTlJfdGltZXMgMTUzCitfX1NDX0NPTVAoX19OUl90aW1lcywgc3lzX3RpbWVzLCBjb21wYXRfc3lzX3RpbWVzKQorI2RlZmluZSBfX05SX3NldHBnaWQgMTU0CitfX1NZU0NBTEwoX19OUl9zZXRwZ2lkLCBzeXNfc2V0cGdpZCkKKyNkZWZpbmUgX19OUl9nZXRwZ2lkIDE1NQorX19TWVNDQUxMKF9fTlJfZ2V0cGdpZCwgc3lzX2dldHBnaWQpCisjZGVmaW5lIF9fTlJfZ2V0c2lkIDE1NgorX19TWVNDQUxMKF9fTlJfZ2V0c2lkLCBzeXNfZ2V0c2lkKQorI2RlZmluZSBfX05SX3NldHNpZCAxNTcKK19fU1lTQ0FMTChfX05SX3NldHNpZCwgc3lzX3NldHNpZCkKKyNkZWZpbmUgX19OUl9nZXRncm91cHMgMTU4CitfX1NZU0NBTEwoX19OUl9nZXRncm91cHMsIHN5c19nZXRncm91cHMpCisjZGVmaW5lIF9fTlJfc2V0Z3JvdXBzIDE1OQorX19TWVNDQUxMKF9fTlJfc2V0Z3JvdXBzLCBzeXNfc2V0Z3JvdXBzKQorI2RlZmluZSBfX05SX3VuYW1lIDE2MAorX19TWVNDQUxMKF9fTlJfdW5hbWUsIHN5c19uZXd1bmFtZSkKKyNkZWZpbmUgX19OUl9zZXRob3N0bmFtZSAxNjEKK19fU1lTQ0FMTChfX05SX3NldGhvc3RuYW1lLCBzeXNfc2V0aG9zdG5hbWUpCisjZGVmaW5lIF9fTlJfc2V0ZG9tYWlubmFtZSAxNjIKK19fU1lTQ0FMTChfX05SX3NldGRvbWFpbm5hbWUsIHN5c19zZXRkb21haW5uYW1lKQorI2RlZmluZSBfX05SX2dldHJsaW1pdCAxNjMKK19fU0NfQ09NUChfX05SX2dldHJsaW1pdCwgc3lzX2dldHJsaW1pdCwgY29tcGF0X3N5c19nZXRybGltaXQpCisjZGVmaW5lIF9fTlJfc2V0cmxpbWl0IDE2NAorX19TQ19DT01QKF9fTlJfc2V0cmxpbWl0LCBzeXNfc2V0cmxpbWl0LCBjb21wYXRfc3lzX3NldHJsaW1pdCkKKyNkZWZpbmUgX19OUl9nZXRydXNhZ2UgMTY1CitfX1NDX0NPTVAoX19OUl9nZXRydXNhZ2UsIHN5c19nZXRydXNhZ2UsIGNvbXBhdF9zeXNfZ2V0cnVzYWdlKQorI2RlZmluZSBfX05SX3VtYXNrIDE2NgorX19TWVNDQUxMKF9fTlJfdW1hc2ssIHN5c191bWFzaykKKyNkZWZpbmUgX19OUl9wcmN0bCAxNjcKK19fU1lTQ0FMTChfX05SX3ByY3RsLCBzeXNfcHJjdGwpCisjZGVmaW5lIF9fTlJfZ2V0Y3B1IDE2OAorX19TWVNDQUxMKF9fTlJfZ2V0Y3B1LCBzeXNfZ2V0Y3B1KQorCisvKiBrZXJuZWwvdGltZS5jICovCisjZGVmaW5lIF9fTlJfZ2V0dGltZW9mZGF5IDE2OQorX19TQ19DT01QKF9fTlJfZ2V0dGltZW9mZGF5LCBzeXNfZ2V0dGltZW9mZGF5LCBjb21wYXRfc3lzX2dldHRpbWVvZmRheSkKKyNkZWZpbmUgX19OUl9zZXR0aW1lb2ZkYXkgMTcwCitfX1NDX0NPTVAoX19OUl9zZXR0aW1lb2ZkYXksIHN5c19zZXR0aW1lb2ZkYXksIGNvbXBhdF9zeXNfc2V0dGltZW9mZGF5KQorI2RlZmluZSBfX05SX2FkanRpbWV4IDE3MQorX19TQ19DT01QKF9fTlJfYWRqdGltZXgsIHN5c19hZGp0aW1leCwgY29tcGF0X3N5c19hZGp0aW1leCkKKworLyoga2VybmVsL3RpbWVyLmMgKi8KKyNkZWZpbmUgX19OUl9nZXRwaWQgMTcyCitfX1NZU0NBTEwoX19OUl9nZXRwaWQsIHN5c19nZXRwaWQpCisjZGVmaW5lIF9fTlJfZ2V0cHBpZCAxNzMKK19fU1lTQ0FMTChfX05SX2dldHBwaWQsIHN5c19nZXRwcGlkKQorI2RlZmluZSBfX05SX2dldHVpZCAxNzQKK19fU1lTQ0FMTChfX05SX2dldHVpZCwgc3lzX2dldHVpZCkKKyNkZWZpbmUgX19OUl9nZXRldWlkIDE3NQorX19TWVNDQUxMKF9fTlJfZ2V0ZXVpZCwgc3lzX2dldGV1aWQpCisjZGVmaW5lIF9fTlJfZ2V0Z2lkIDE3NgorX19TWVNDQUxMKF9fTlJfZ2V0Z2lkLCBzeXNfZ2V0Z2lkKQorI2RlZmluZSBfX05SX2dldGVnaWQgMTc3CitfX1NZU0NBTEwoX19OUl9nZXRlZ2lkLCBzeXNfZ2V0ZWdpZCkKKyNkZWZpbmUgX19OUl9nZXR0aWQgMTc4CitfX1NZU0NBTEwoX19OUl9nZXR0aWQsIHN5c19nZXR0aWQpCisjZGVmaW5lIF9fTlJfc3lzaW5mbyAxNzkKK19fU0NfQ09NUChfX05SX3N5c2luZm8sIHN5c19zeXNpbmZvLCBjb21wYXRfc3lzX3N5c2luZm8pCisKKy8qIGlwYy9tcXVldWUuYyAqLworI2RlZmluZSBfX05SX21xX29wZW4gMTgwCitfX1NDX0NPTVAoX19OUl9tcV9vcGVuLCBzeXNfbXFfb3BlbiwgY29tcGF0X3N5c19tcV9vcGVuKQorI2RlZmluZSBfX05SX21xX3VubGluayAxODEKK19fU1lTQ0FMTChfX05SX21xX3VubGluaywgc3lzX21xX3VubGluaykKKyNkZWZpbmUgX19OUl9tcV90aW1lZHNlbmQgMTgyCitfX1NDX0NPTVAoX19OUl9tcV90aW1lZHNlbmQsIHN5c19tcV90aW1lZHNlbmQsIGNvbXBhdF9zeXNfbXFfdGltZWRzZW5kKQorI2RlZmluZSBfX05SX21xX3RpbWVkcmVjZWl2ZSAxODMKK19fU0NfQ09NUChfX05SX21xX3RpbWVkcmVjZWl2ZSwgc3lzX21xX3RpbWVkcmVjZWl2ZSwgXAorCSAgY29tcGF0X3N5c19tcV90aW1lZHJlY2VpdmUpCisjZGVmaW5lIF9fTlJfbXFfbm90aWZ5IDE4NAorX19TQ19DT01QKF9fTlJfbXFfbm90aWZ5LCBzeXNfbXFfbm90aWZ5LCBjb21wYXRfc3lzX21xX25vdGlmeSkKKyNkZWZpbmUgX19OUl9tcV9nZXRzZXRhdHRyIDE4NQorX19TQ19DT01QKF9fTlJfbXFfZ2V0c2V0YXR0ciwgc3lzX21xX2dldHNldGF0dHIsIGNvbXBhdF9zeXNfbXFfZ2V0c2V0YXR0cikKKworLyogaXBjL21zZy5jICovCisjZGVmaW5lIF9fTlJfbXNnZ2V0IDE4NgorX19TWVNDQUxMKF9fTlJfbXNnZ2V0LCBzeXNfbXNnZ2V0KQorI2RlZmluZSBfX05SX21zZ2N0bCAxODcKK19fU0NfQ09NUChfX05SX21zZ2N0bCwgc3lzX21zZ2N0bCwgY29tcGF0X3N5c19tc2djdGwpCisjZGVmaW5lIF9fTlJfbXNncmN2IDE4OAorX19TQ19DT01QKF9fTlJfbXNncmN2LCBzeXNfbXNncmN2LCBjb21wYXRfc3lzX21zZ3JjdikKKyNkZWZpbmUgX19OUl9tc2dzbmQgMTg5CitfX1NDX0NPTVAoX19OUl9tc2dzbmQsIHN5c19tc2dzbmQsIGNvbXBhdF9zeXNfbXNnc25kKQorCisvKiBpcGMvc2VtLmMgKi8KKyNkZWZpbmUgX19OUl9zZW1nZXQgMTkwCitfX1NZU0NBTEwoX19OUl9zZW1nZXQsIHN5c19zZW1nZXQpCisjZGVmaW5lIF9fTlJfc2VtY3RsIDE5MQorX19TQ19DT01QKF9fTlJfc2VtY3RsLCBzeXNfc2VtY3RsLCBjb21wYXRfc3lzX3NlbWN0bCkKKyNkZWZpbmUgX19OUl9zZW10aW1lZG9wIDE5MgorX19TQ19DT01QKF9fTlJfc2VtdGltZWRvcCwgc3lzX3NlbXRpbWVkb3AsIGNvbXBhdF9zeXNfc2VtdGltZWRvcCkKKyNkZWZpbmUgX19OUl9zZW1vcCAxOTMKK19fU1lTQ0FMTChfX05SX3NlbW9wLCBzeXNfc2Vtb3ApCisKKy8qIGlwYy9zaG0uYyAqLworI2RlZmluZSBfX05SX3NobWdldCAxOTQKK19fU1lTQ0FMTChfX05SX3NobWdldCwgc3lzX3NobWdldCkKKyNkZWZpbmUgX19OUl9zaG1jdGwgMTk1CitfX1NDX0NPTVAoX19OUl9zaG1jdGwsIHN5c19zaG1jdGwsIGNvbXBhdF9zeXNfc2htY3RsKQorI2RlZmluZSBfX05SX3NobWF0IDE5NgorX19TQ19DT01QKF9fTlJfc2htYXQsIHN5c19zaG1hdCwgY29tcGF0X3N5c19zaG1hdCkKKyNkZWZpbmUgX19OUl9zaG1kdCAxOTcKK19fU1lTQ0FMTChfX05SX3NobWR0LCBzeXNfc2htZHQpCisKKy8qIG5ldC9zb2NrZXQuYyAqLworI2RlZmluZSBfX05SX3NvY2tldCAxOTgKK19fU1lTQ0FMTChfX05SX3NvY2tldCwgc3lzX3NvY2tldCkKKyNkZWZpbmUgX19OUl9zb2NrZXRwYWlyIDE5OQorX19TWVNDQUxMKF9fTlJfc29ja2V0cGFpciwgc3lzX3NvY2tldHBhaXIpCisjZGVmaW5lIF9fTlJfYmluZCAyMDAKK19fU1lTQ0FMTChfX05SX2JpbmQsIHN5c19iaW5kKQorI2RlZmluZSBfX05SX2xpc3RlbiAyMDEKK19fU1lTQ0FMTChfX05SX2xpc3Rlbiwgc3lzX2xpc3RlbikKKyNkZWZpbmUgX19OUl9hY2NlcHQgMjAyCitfX1NZU0NBTEwoX19OUl9hY2NlcHQsIHN5c19hY2NlcHQpCisjZGVmaW5lIF9fTlJfY29ubmVjdCAyMDMKK19fU1lTQ0FMTChfX05SX2Nvbm5lY3QsIHN5c19jb25uZWN0KQorI2RlZmluZSBfX05SX2dldHNvY2tuYW1lIDIwNAorX19TWVNDQUxMKF9fTlJfZ2V0c29ja25hbWUsIHN5c19nZXRzb2NrbmFtZSkKKyNkZWZpbmUgX19OUl9nZXRwZWVybmFtZSAyMDUKK19fU1lTQ0FMTChfX05SX2dldHBlZXJuYW1lLCBzeXNfZ2V0cGVlcm5hbWUpCisjZGVmaW5lIF9fTlJfc2VuZHRvIDIwNgorX19TWVNDQUxMKF9fTlJfc2VuZHRvLCBzeXNfc2VuZHRvKQorI2RlZmluZSBfX05SX3JlY3Zmcm9tIDIwNworX19TQ19DT01QKF9fTlJfcmVjdmZyb20sIHN5c19yZWN2ZnJvbSwgY29tcGF0X3N5c19yZWN2ZnJvbSkKKyNkZWZpbmUgX19OUl9zZXRzb2Nrb3B0IDIwOAorX19TQ19DT01QKF9fTlJfc2V0c29ja29wdCwgc3lzX3NldHNvY2tvcHQsIGNvbXBhdF9zeXNfc2V0c29ja29wdCkKKyNkZWZpbmUgX19OUl9nZXRzb2Nrb3B0IDIwOQorX19TQ19DT01QKF9fTlJfZ2V0c29ja29wdCwgc3lzX2dldHNvY2tvcHQsIGNvbXBhdF9zeXNfZ2V0c29ja29wdCkKKyNkZWZpbmUgX19OUl9zaHV0ZG93biAyMTAKK19fU1lTQ0FMTChfX05SX3NodXRkb3duLCBzeXNfc2h1dGRvd24pCisjZGVmaW5lIF9fTlJfc2VuZG1zZyAyMTEKK19fU0NfQ09NUChfX05SX3NlbmRtc2csIHN5c19zZW5kbXNnLCBjb21wYXRfc3lzX3NlbmRtc2cpCisjZGVmaW5lIF9fTlJfcmVjdm1zZyAyMTIKK19fU0NfQ09NUChfX05SX3JlY3Ztc2csIHN5c19yZWN2bXNnLCBjb21wYXRfc3lzX3JlY3Ztc2cpCisKKy8qIG1tL2ZpbGVtYXAuYyAqLworI2RlZmluZSBfX05SX3JlYWRhaGVhZCAyMTMKK19fU0NfQ09NUChfX05SX3JlYWRhaGVhZCwgc3lzX3JlYWRhaGVhZCwgY29tcGF0X3N5c19yZWFkYWhlYWQpCisKKy8qIG1tL25vbW11LmMsIGFsc28gd2l0aCBNTVUgKi8KKyNkZWZpbmUgX19OUl9icmsgMjE0CitfX1NZU0NBTEwoX19OUl9icmssIHN5c19icmspCisjZGVmaW5lIF9fTlJfbXVubWFwIDIxNQorX19TWVNDQUxMKF9fTlJfbXVubWFwLCBzeXNfbXVubWFwKQorI2RlZmluZSBfX05SX21yZW1hcCAyMTYKK19fU1lTQ0FMTChfX05SX21yZW1hcCwgc3lzX21yZW1hcCkKKworLyogc2VjdXJpdHkva2V5cy9rZXljdGwuYyAqLworI2RlZmluZSBfX05SX2FkZF9rZXkgMjE3CitfX1NZU0NBTEwoX19OUl9hZGRfa2V5LCBzeXNfYWRkX2tleSkKKyNkZWZpbmUgX19OUl9yZXF1ZXN0X2tleSAyMTgKK19fU1lTQ0FMTChfX05SX3JlcXVlc3Rfa2V5LCBzeXNfcmVxdWVzdF9rZXkpCisjZGVmaW5lIF9fTlJfa2V5Y3RsIDIxOQorX19TQ19DT01QKF9fTlJfa2V5Y3RsLCBzeXNfa2V5Y3RsLCBjb21wYXRfc3lzX2tleWN0bCkKKworLyogYXJjaC9leGFtcGxlL2tlcm5lbC9zeXNfZXhhbXBsZS5jICovCisjZGVmaW5lIF9fTlJfY2xvbmUgMjIwCitfX1NZU0NBTEwoX19OUl9jbG9uZSwgc3lzX2Nsb25lKQorI2RlZmluZSBfX05SX2V4ZWN2ZSAyMjEKK19fU0NfQ09NUChfX05SX2V4ZWN2ZSwgc3lzX2V4ZWN2ZSwgY29tcGF0X3N5c19leGVjdmUpCisKKyNkZWZpbmUgX19OUjMyNjRfbW1hcCAyMjIKK19fU0NfMzI2NChfX05SMzI2NF9tbWFwLCBzeXNfbW1hcDIsIHN5c19tbWFwKQorLyogbW0vZmFkdmlzZS5jICovCisjZGVmaW5lIF9fTlIzMjY0X2ZhZHZpc2U2NCAyMjMKK19fU0NfQ09NUChfX05SMzI2NF9mYWR2aXNlNjQsIHN5c19mYWR2aXNlNjRfNjQsIGNvbXBhdF9zeXNfZmFkdmlzZTY0XzY0KQorCisvKiBtbS8sIENPTkZJR19NTVUgb25seSAqLworI2lmbmRlZiBfX0FSQ0hfTk9NTVUKKyNkZWZpbmUgX19OUl9zd2Fwb24gMjI0CitfX1NZU0NBTEwoX19OUl9zd2Fwb24sIHN5c19zd2Fwb24pCisjZGVmaW5lIF9fTlJfc3dhcG9mZiAyMjUKK19fU1lTQ0FMTChfX05SX3N3YXBvZmYsIHN5c19zd2Fwb2ZmKQorI2RlZmluZSBfX05SX21wcm90ZWN0IDIyNgorX19TWVNDQUxMKF9fTlJfbXByb3RlY3QsIHN5c19tcHJvdGVjdCkKKyNkZWZpbmUgX19OUl9tc3luYyAyMjcKK19fU1lTQ0FMTChfX05SX21zeW5jLCBzeXNfbXN5bmMpCisjZGVmaW5lIF9fTlJfbWxvY2sgMjI4CitfX1NZU0NBTEwoX19OUl9tbG9jaywgc3lzX21sb2NrKQorI2RlZmluZSBfX05SX211bmxvY2sgMjI5CitfX1NZU0NBTEwoX19OUl9tdW5sb2NrLCBzeXNfbXVubG9jaykKKyNkZWZpbmUgX19OUl9tbG9ja2FsbCAyMzAKK19fU1lTQ0FMTChfX05SX21sb2NrYWxsLCBzeXNfbWxvY2thbGwpCisjZGVmaW5lIF9fTlJfbXVubG9ja2FsbCAyMzEKK19fU1lTQ0FMTChfX05SX211bmxvY2thbGwsIHN5c19tdW5sb2NrYWxsKQorI2RlZmluZSBfX05SX21pbmNvcmUgMjMyCitfX1NZU0NBTEwoX19OUl9taW5jb3JlLCBzeXNfbWluY29yZSkKKyNkZWZpbmUgX19OUl9tYWR2aXNlIDIzMworX19TWVNDQUxMKF9fTlJfbWFkdmlzZSwgc3lzX21hZHZpc2UpCisjZGVmaW5lIF9fTlJfcmVtYXBfZmlsZV9wYWdlcyAyMzQKK19fU1lTQ0FMTChfX05SX3JlbWFwX2ZpbGVfcGFnZXMsIHN5c19yZW1hcF9maWxlX3BhZ2VzKQorI2RlZmluZSBfX05SX21iaW5kIDIzNQorX19TQ19DT01QKF9fTlJfbWJpbmQsIHN5c19tYmluZCwgY29tcGF0X3N5c19tYmluZCkKKyNkZWZpbmUgX19OUl9nZXRfbWVtcG9saWN5IDIzNgorX19TQ19DT01QKF9fTlJfZ2V0X21lbXBvbGljeSwgc3lzX2dldF9tZW1wb2xpY3ksIGNvbXBhdF9zeXNfZ2V0X21lbXBvbGljeSkKKyNkZWZpbmUgX19OUl9zZXRfbWVtcG9saWN5IDIzNworX19TQ19DT01QKF9fTlJfc2V0X21lbXBvbGljeSwgc3lzX3NldF9tZW1wb2xpY3ksIGNvbXBhdF9zeXNfc2V0X21lbXBvbGljeSkKKyNkZWZpbmUgX19OUl9taWdyYXRlX3BhZ2VzIDIzOAorX19TQ19DT01QKF9fTlJfbWlncmF0ZV9wYWdlcywgc3lzX21pZ3JhdGVfcGFnZXMsIGNvbXBhdF9zeXNfbWlncmF0ZV9wYWdlcykKKyNkZWZpbmUgX19OUl9tb3ZlX3BhZ2VzIDIzOQorX19TQ19DT01QKF9fTlJfbW92ZV9wYWdlcywgc3lzX21vdmVfcGFnZXMsIGNvbXBhdF9zeXNfbW92ZV9wYWdlcykKKyNlbmRpZgorCisjZGVmaW5lIF9fTlJfcnRfdGdzaWdxdWV1ZWluZm8gMjQwCitfX1NDX0NPTVAoX19OUl9ydF90Z3NpZ3F1ZXVlaW5mbywgc3lzX3J0X3Rnc2lncXVldWVpbmZvLCBcCisJICBjb21wYXRfc3lzX3J0X3Rnc2lncXVldWVpbmZvKQorI2RlZmluZSBfX05SX3BlcmZfZXZlbnRfb3BlbiAyNDEKK19fU1lTQ0FMTChfX05SX3BlcmZfZXZlbnRfb3Blbiwgc3lzX3BlcmZfZXZlbnRfb3BlbikKKyNkZWZpbmUgX19OUl9hY2NlcHQ0IDI0MgorX19TWVNDQUxMKF9fTlJfYWNjZXB0NCwgc3lzX2FjY2VwdDQpCisjZGVmaW5lIF9fTlJfcmVjdm1tc2cgMjQzCitfX1NDX0NPTVAoX19OUl9yZWN2bW1zZywgc3lzX3JlY3ZtbXNnLCBjb21wYXRfc3lzX3JlY3ZtbXNnKQorCisvKgorICogQXJjaGl0ZWN0dXJlcyBtYXkgcHJvdmlkZSB1cCB0byAxNiBzeXNjYWxscyBvZiB0aGVpciBvd24KKyAqIHN0YXJ0aW5nIHdpdGggdGhpcyB2YWx1ZS4KKyAqLworI2RlZmluZSBfX05SX2FyY2hfc3BlY2lmaWNfc3lzY2FsbCAyNDQKKworI2RlZmluZSBfX05SX3dhaXQ0IDI2MAorX19TQ19DT01QKF9fTlJfd2FpdDQsIHN5c193YWl0NCwgY29tcGF0X3N5c193YWl0NCkKKyNkZWZpbmUgX19OUl9wcmxpbWl0NjQgMjYxCitfX1NZU0NBTEwoX19OUl9wcmxpbWl0NjQsIHN5c19wcmxpbWl0NjQpCisjZGVmaW5lIF9fTlJfZmFub3RpZnlfaW5pdCAyNjIKK19fU1lTQ0FMTChfX05SX2Zhbm90aWZ5X2luaXQsIHN5c19mYW5vdGlmeV9pbml0KQorI2RlZmluZSBfX05SX2Zhbm90aWZ5X21hcmsgMjYzCitfX1NZU0NBTEwoX19OUl9mYW5vdGlmeV9tYXJrLCBzeXNfZmFub3RpZnlfbWFyaykKKyNkZWZpbmUgX19OUl9uYW1lX3RvX2hhbmRsZV9hdCAgICAgICAgIDI2NAorX19TWVNDQUxMKF9fTlJfbmFtZV90b19oYW5kbGVfYXQsIHN5c19uYW1lX3RvX2hhbmRsZV9hdCkKKyNkZWZpbmUgX19OUl9vcGVuX2J5X2hhbmRsZV9hdCAgICAgICAgIDI2NQorX19TQ19DT01QKF9fTlJfb3Blbl9ieV9oYW5kbGVfYXQsIHN5c19vcGVuX2J5X2hhbmRsZV9hdCwgXAorCSAgY29tcGF0X3N5c19vcGVuX2J5X2hhbmRsZV9hdCkKKyNkZWZpbmUgX19OUl9jbG9ja19hZGp0aW1lIDI2NgorX19TQ19DT01QKF9fTlJfY2xvY2tfYWRqdGltZSwgc3lzX2Nsb2NrX2FkanRpbWUsIGNvbXBhdF9zeXNfY2xvY2tfYWRqdGltZSkKKyNkZWZpbmUgX19OUl9zeW5jZnMgMjY3CitfX1NZU0NBTEwoX19OUl9zeW5jZnMsIHN5c19zeW5jZnMpCisjZGVmaW5lIF9fTlJfc2V0bnMgMjY4CitfX1NZU0NBTEwoX19OUl9zZXRucywgc3lzX3NldG5zKQorI2RlZmluZSBfX05SX3NlbmRtbXNnIDI2OQorX19TQ19DT01QKF9fTlJfc2VuZG1tc2csIHN5c19zZW5kbW1zZywgY29tcGF0X3N5c19zZW5kbW1zZykKKyNkZWZpbmUgX19OUl9wcm9jZXNzX3ZtX3JlYWR2IDI3MAorX19TQ19DT01QKF9fTlJfcHJvY2Vzc192bV9yZWFkdiwgc3lzX3Byb2Nlc3Nfdm1fcmVhZHYsIFwKKyAgICAgICAgICBjb21wYXRfc3lzX3Byb2Nlc3Nfdm1fcmVhZHYpCisjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV93cml0ZXYgMjcxCitfX1NDX0NPTVAoX19OUl9wcm9jZXNzX3ZtX3dyaXRldiwgc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2LCBcCisgICAgICAgICAgY29tcGF0X3N5c19wcm9jZXNzX3ZtX3dyaXRldikKKworI3VuZGVmIF9fTlJfc3lzY2FsbHMKKyNkZWZpbmUgX19OUl9zeXNjYWxscyAyNzIKKworLyoKKyAqIEFsbCBzeXNjYWxscyBiZWxvdyBoZXJlIHNob3VsZCBnbyBhd2F5IHJlYWxseSwKKyAqIHRoZXNlIGFyZSBwcm92aWRlZCBmb3IgYm90aCByZXZpZXcgYW5kIGFzIGEgcG9ydGluZworICogaGVscCBmb3IgdGhlIEMgbGlicmFyeSB2ZXJzaW9uLgorKgorICogTGFzdCBjaGFuY2U6IGFyZSBhbnkgb2YgdGhlc2UgaW1wb3J0YW50IGVub3VnaCB0bworICogZW5hYmxlIGJ5IGRlZmF1bHQ/CisgKi8KKyNpZmRlZiBfX0FSQ0hfV0FOVF9TWVNDQUxMX05PX0FUCisjZGVmaW5lIF9fTlJfb3BlbiAxMDI0CitfX1NZU0NBTEwoX19OUl9vcGVuLCBzeXNfb3BlbikKKyNkZWZpbmUgX19OUl9saW5rIDEwMjUKK19fU1lTQ0FMTChfX05SX2xpbmssIHN5c19saW5rKQorI2RlZmluZSBfX05SX3VubGluayAxMDI2CitfX1NZU0NBTEwoX19OUl91bmxpbmssIHN5c191bmxpbmspCisjZGVmaW5lIF9fTlJfbWtub2QgMTAyNworX19TWVNDQUxMKF9fTlJfbWtub2QsIHN5c19ta25vZCkKKyNkZWZpbmUgX19OUl9jaG1vZCAxMDI4CitfX1NZU0NBTEwoX19OUl9jaG1vZCwgc3lzX2NobW9kKQorI2RlZmluZSBfX05SX2Nob3duIDEwMjkKK19fU1lTQ0FMTChfX05SX2Nob3duLCBzeXNfY2hvd24pCisjZGVmaW5lIF9fTlJfbWtkaXIgMTAzMAorX19TWVNDQUxMKF9fTlJfbWtkaXIsIHN5c19ta2RpcikKKyNkZWZpbmUgX19OUl9ybWRpciAxMDMxCitfX1NZU0NBTEwoX19OUl9ybWRpciwgc3lzX3JtZGlyKQorI2RlZmluZSBfX05SX2xjaG93biAxMDMyCitfX1NZU0NBTEwoX19OUl9sY2hvd24sIHN5c19sY2hvd24pCisjZGVmaW5lIF9fTlJfYWNjZXNzIDEwMzMKK19fU1lTQ0FMTChfX05SX2FjY2Vzcywgc3lzX2FjY2VzcykKKyNkZWZpbmUgX19OUl9yZW5hbWUgMTAzNAorX19TWVNDQUxMKF9fTlJfcmVuYW1lLCBzeXNfcmVuYW1lKQorI2RlZmluZSBfX05SX3JlYWRsaW5rIDEwMzUKK19fU1lTQ0FMTChfX05SX3JlYWRsaW5rLCBzeXNfcmVhZGxpbmspCisjZGVmaW5lIF9fTlJfc3ltbGluayAxMDM2CitfX1NZU0NBTEwoX19OUl9zeW1saW5rLCBzeXNfc3ltbGluaykKKyNkZWZpbmUgX19OUl91dGltZXMgMTAzNworX19TWVNDQUxMKF9fTlJfdXRpbWVzLCBzeXNfdXRpbWVzKQorI2RlZmluZSBfX05SMzI2NF9zdGF0IDEwMzgKK19fU0NfMzI2NChfX05SMzI2NF9zdGF0LCBzeXNfc3RhdDY0LCBzeXNfbmV3c3RhdCkKKyNkZWZpbmUgX19OUjMyNjRfbHN0YXQgMTAzOQorX19TQ18zMjY0KF9fTlIzMjY0X2xzdGF0LCBzeXNfbHN0YXQ2NCwgc3lzX25ld2xzdGF0KQorCisjdW5kZWYgX19OUl9zeXNjYWxscworI2RlZmluZSBfX05SX3N5c2NhbGxzIChfX05SMzI2NF9sc3RhdCsxKQorI2VuZGlmIC8qIF9fQVJDSF9XQU5UX1NZU0NBTExfTk9fQVQgKi8KKworI2lmZGVmIF9fQVJDSF9XQU5UX1NZU0NBTExfTk9fRkxBR1MKKyNkZWZpbmUgX19OUl9waXBlIDEwNDAKK19fU1lTQ0FMTChfX05SX3BpcGUsIHN5c19waXBlKQorI2RlZmluZSBfX05SX2R1cDIgMTA0MQorX19TWVNDQUxMKF9fTlJfZHVwMiwgc3lzX2R1cDIpCisjZGVmaW5lIF9fTlJfZXBvbGxfY3JlYXRlIDEwNDIKK19fU1lTQ0FMTChfX05SX2Vwb2xsX2NyZWF0ZSwgc3lzX2Vwb2xsX2NyZWF0ZSkKKyNkZWZpbmUgX19OUl9pbm90aWZ5X2luaXQgMTA0MworX19TWVNDQUxMKF9fTlJfaW5vdGlmeV9pbml0LCBzeXNfaW5vdGlmeV9pbml0KQorI2RlZmluZSBfX05SX2V2ZW50ZmQgMTA0NAorX19TWVNDQUxMKF9fTlJfZXZlbnRmZCwgc3lzX2V2ZW50ZmQpCisjZGVmaW5lIF9fTlJfc2lnbmFsZmQgMTA0NQorX19TWVNDQUxMKF9fTlJfc2lnbmFsZmQsIHN5c19zaWduYWxmZCkKKworI3VuZGVmIF9fTlJfc3lzY2FsbHMKKyNkZWZpbmUgX19OUl9zeXNjYWxscyAoX19OUl9zaWduYWxmZCsxKQorI2VuZGlmIC8qIF9fQVJDSF9XQU5UX1NZU0NBTExfTk9fRkxBR1MgKi8KKworI2lmIChfX0JJVFNfUEVSX0xPTkcgPT0gMzIgfHwgZGVmaW5lZChfX1NZU0NBTExfQ09NUEFUKSkgJiYgXAorICAgICBkZWZpbmVkKF9fQVJDSF9XQU5UX1NZU0NBTExfT0ZGX1QpCisjZGVmaW5lIF9fTlJfc2VuZGZpbGUgMTA0NgorX19TWVNDQUxMKF9fTlJfc2VuZGZpbGUsIHN5c19zZW5kZmlsZSkKKyNkZWZpbmUgX19OUl9mdHJ1bmNhdGUgMTA0NworX19TWVNDQUxMKF9fTlJfZnRydW5jYXRlLCBzeXNfZnRydW5jYXRlKQorI2RlZmluZSBfX05SX3RydW5jYXRlIDEwNDgKK19fU1lTQ0FMTChfX05SX3RydW5jYXRlLCBzeXNfdHJ1bmNhdGUpCisjZGVmaW5lIF9fTlJfc3RhdCAxMDQ5CitfX1NZU0NBTEwoX19OUl9zdGF0LCBzeXNfbmV3c3RhdCkKKyNkZWZpbmUgX19OUl9sc3RhdCAxMDUwCitfX1NZU0NBTEwoX19OUl9sc3RhdCwgc3lzX25ld2xzdGF0KQorI2RlZmluZSBfX05SX2ZzdGF0IDEwNTEKK19fU1lTQ0FMTChfX05SX2ZzdGF0LCBzeXNfbmV3ZnN0YXQpCisjZGVmaW5lIF9fTlJfZmNudGwgMTA1MgorX19TWVNDQUxMKF9fTlJfZmNudGwsIHN5c19mY250bCkKKyNkZWZpbmUgX19OUl9mYWR2aXNlNjQgMTA1MworI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfRkFEVklTRTY0CitfX1NZU0NBTEwoX19OUl9mYWR2aXNlNjQsIHN5c19mYWR2aXNlNjQpCisjZGVmaW5lIF9fTlJfbmV3ZnN0YXRhdCAxMDU0CisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19ORVdGU1RBVEFUCitfX1NZU0NBTEwoX19OUl9uZXdmc3RhdGF0LCBzeXNfbmV3ZnN0YXRhdCkKKyNkZWZpbmUgX19OUl9mc3RhdGZzIDEwNTUKK19fU1lTQ0FMTChfX05SX2ZzdGF0ZnMsIHN5c19mc3RhdGZzKQorI2RlZmluZSBfX05SX3N0YXRmcyAxMDU2CitfX1NZU0NBTEwoX19OUl9zdGF0ZnMsIHN5c19zdGF0ZnMpCisjZGVmaW5lIF9fTlJfbHNlZWsgMTA1NworX19TWVNDQUxMKF9fTlJfbHNlZWssIHN5c19sc2VlaykKKyNkZWZpbmUgX19OUl9tbWFwIDEwNTgKK19fU1lTQ0FMTChfX05SX21tYXAsIHN5c19tbWFwKQorCisjdW5kZWYgX19OUl9zeXNjYWxscworI2RlZmluZSBfX05SX3N5c2NhbGxzIChfX05SX21tYXArMSkKKyNlbmRpZiAvKiAzMiBiaXQgb2ZmX3Qgc3lzY2FsbHMgKi8KKworI2lmZGVmIF9fQVJDSF9XQU5UX1NZU0NBTExfREVQUkVDQVRFRAorI2RlZmluZSBfX05SX2FsYXJtIDEwNTkKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX0FMQVJNCitfX1NZU0NBTEwoX19OUl9hbGFybSwgc3lzX2FsYXJtKQorI2RlZmluZSBfX05SX2dldHBncnAgMTA2MAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfR0VUUEdSUAorX19TWVNDQUxMKF9fTlJfZ2V0cGdycCwgc3lzX2dldHBncnApCisjZGVmaW5lIF9fTlJfcGF1c2UgMTA2MQorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfUEFVU0UKK19fU1lTQ0FMTChfX05SX3BhdXNlLCBzeXNfcGF1c2UpCisjZGVmaW5lIF9fTlJfdGltZSAxMDYyCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19USU1FCisjZGVmaW5lIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfVElNRQorX19TWVNDQUxMKF9fTlJfdGltZSwgc3lzX3RpbWUpCisjZGVmaW5lIF9fTlJfdXRpbWUgMTA2MworI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfVVRJTUUKK19fU1lTQ0FMTChfX05SX3V0aW1lLCBzeXNfdXRpbWUpCisKKyNkZWZpbmUgX19OUl9jcmVhdCAxMDY0CitfX1NZU0NBTEwoX19OUl9jcmVhdCwgc3lzX2NyZWF0KQorI2RlZmluZSBfX05SX2dldGRlbnRzIDEwNjUKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX0dFVERFTlRTCitfX1NZU0NBTEwoX19OUl9nZXRkZW50cywgc3lzX2dldGRlbnRzKQorI2RlZmluZSBfX05SX2Z1dGltZXNhdCAxMDY2CitfX1NZU0NBTEwoX19OUl9mdXRpbWVzYXQsIHN5c19mdXRpbWVzYXQpCisjZGVmaW5lIF9fTlJfc2VsZWN0IDEwNjcKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NFTEVDVAorX19TWVNDQUxMKF9fTlJfc2VsZWN0LCBzeXNfc2VsZWN0KQorI2RlZmluZSBfX05SX3BvbGwgMTA2OAorX19TWVNDQUxMKF9fTlJfcG9sbCwgc3lzX3BvbGwpCisjZGVmaW5lIF9fTlJfZXBvbGxfd2FpdCAxMDY5CitfX1NZU0NBTEwoX19OUl9lcG9sbF93YWl0LCBzeXNfZXBvbGxfd2FpdCkKKyNkZWZpbmUgX19OUl91c3RhdCAxMDcwCitfX1NZU0NBTEwoX19OUl91c3RhdCwgc3lzX3VzdGF0KQorI2RlZmluZSBfX05SX3Zmb3JrIDEwNzEKK19fU1lTQ0FMTChfX05SX3Zmb3JrLCBzeXNfdmZvcmspCisjZGVmaW5lIF9fTlJfb2xkd2FpdDQgMTA3MgorX19TWVNDQUxMKF9fTlJfb2xkd2FpdDQsIHN5c193YWl0NCkKKyNkZWZpbmUgX19OUl9yZWN2IDEwNzMKK19fU1lTQ0FMTChfX05SX3JlY3YsIHN5c19yZWN2KQorI2RlZmluZSBfX05SX3NlbmQgMTA3NAorX19TWVNDQUxMKF9fTlJfc2VuZCwgc3lzX3NlbmQpCisjZGVmaW5lIF9fTlJfYmRmbHVzaCAxMDc1CitfX1NZU0NBTEwoX19OUl9iZGZsdXNoLCBzeXNfYmRmbHVzaCkKKyNkZWZpbmUgX19OUl91bW91bnQgMTA3NgorX19TWVNDQUxMKF9fTlJfdW1vdW50LCBzeXNfb2xkdW1vdW50KQorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfT0xEVU1PVU5UCisjZGVmaW5lIF9fTlJfdXNlbGliIDEwNzcKK19fU1lTQ0FMTChfX05SX3VzZWxpYiwgc3lzX3VzZWxpYikKKyNkZWZpbmUgX19OUl9fc3lzY3RsIDEwNzgKK19fU1lTQ0FMTChfX05SX19zeXNjdGwsIHN5c19zeXNjdGwpCisKKyNkZWZpbmUgX19OUl9mb3JrIDEwNzkKKyNpZmRlZiBDT05GSUdfTU1VCitfX1NZU0NBTEwoX19OUl9mb3JrLCBzeXNfZm9yaykKKyNlbHNlCitfX1NZU0NBTEwoX19OUl9mb3JrLCBzeXNfbmlfc3lzY2FsbCkKKyNlbmRpZiAvKiBDT05GSUdfTU1VICovCisKKyN1bmRlZiBfX05SX3N5c2NhbGxzCisjZGVmaW5lIF9fTlJfc3lzY2FsbHMgKF9fTlJfZm9yaysxKQorCisjZW5kaWYgLyogX19BUkNIX1dBTlRfU1lTQ0FMTF9ERVBSRUNBVEVEICovCisKKy8qCisgKiAzMiBiaXQgc3lzdGVtcyB0cmFkaXRpb25hbGx5IHVzZWQgZGlmZmVyZW50CisgKiBzeXNjYWxscyBmb3Igb2ZmX3QgYW5kIGxvZmZfdCBhcmd1bWVudHMsIHdoaWxlCisgKiA2NCBiaXQgc3lzdGVtcyBvbmx5IG5lZWQgdGhlIG9mZl90IHZlcnNpb24uCisgKiBGb3IgbmV3IDMyIGJpdCBwbGF0Zm9ybXMsIHRoZXJlIGlzIG5vIG5lZWQgdG8KKyAqIGltcGxlbWVudCB0aGUgb2xkIDMyIGJpdCBvZmZfdCBzeXNjYWxscywgc28KKyAqIHRoZXkgdGFrZSBkaWZmZXJlbnQgbmFtZXMuCisgKiBIZXJlIHdlIG1hcCB0aGUgbnVtYmVycyBzbyB0aGF0IGJvdGggdmVyc2lvbnMKKyAqIHVzZSB0aGUgc2FtZSBzeXNjYWxsIHRhYmxlIGxheW91dC4KKyAqLworI2lmIF9fQklUU19QRVJfTE9ORyA9PSA2NCAmJiAhZGVmaW5lZChfX1NZU0NBTExfQ09NUEFUKQorI2RlZmluZSBfX05SX2ZjbnRsIF9fTlIzMjY0X2ZjbnRsCisjZGVmaW5lIF9fTlJfc3RhdGZzIF9fTlIzMjY0X3N0YXRmcworI2RlZmluZSBfX05SX2ZzdGF0ZnMgX19OUjMyNjRfZnN0YXRmcworI2RlZmluZSBfX05SX3RydW5jYXRlIF9fTlIzMjY0X3RydW5jYXRlCisjZGVmaW5lIF9fTlJfZnRydW5jYXRlIF9fTlIzMjY0X2Z0cnVuY2F0ZQorI2RlZmluZSBfX05SX2xzZWVrIF9fTlIzMjY0X2xzZWVrCisjZGVmaW5lIF9fTlJfc2VuZGZpbGUgX19OUjMyNjRfc2VuZGZpbGUKKyNkZWZpbmUgX19OUl9uZXdmc3RhdGF0IF9fTlIzMjY0X2ZzdGF0YXQKKyNkZWZpbmUgX19OUl9mc3RhdCBfX05SMzI2NF9mc3RhdAorI2RlZmluZSBfX05SX21tYXAgX19OUjMyNjRfbW1hcAorI2RlZmluZSBfX05SX2ZhZHZpc2U2NCBfX05SMzI2NF9mYWR2aXNlNjQKKyNpZmRlZiBfX05SMzI2NF9zdGF0CisjZGVmaW5lIF9fTlJfc3RhdCBfX05SMzI2NF9zdGF0CisjZGVmaW5lIF9fTlJfbHN0YXQgX19OUjMyNjRfbHN0YXQKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgX19OUl9mY250bDY0IF9fTlIzMjY0X2ZjbnRsCisjZGVmaW5lIF9fTlJfc3RhdGZzNjQgX19OUjMyNjRfc3RhdGZzCisjZGVmaW5lIF9fTlJfZnN0YXRmczY0IF9fTlIzMjY0X2ZzdGF0ZnMKKyNkZWZpbmUgX19OUl90cnVuY2F0ZTY0IF9fTlIzMjY0X3RydW5jYXRlCisjZGVmaW5lIF9fTlJfZnRydW5jYXRlNjQgX19OUjMyNjRfZnRydW5jYXRlCisjZGVmaW5lIF9fTlJfbGxzZWVrIF9fTlIzMjY0X2xzZWVrCisjZGVmaW5lIF9fTlJfc2VuZGZpbGU2NCBfX05SMzI2NF9zZW5kZmlsZQorI2RlZmluZSBfX05SX2ZzdGF0YXQ2NCBfX05SMzI2NF9mc3RhdGF0CisjZGVmaW5lIF9fTlJfZnN0YXQ2NCBfX05SMzI2NF9mc3RhdAorI2RlZmluZSBfX05SX21tYXAyIF9fTlIzMjY0X21tYXAKKyNkZWZpbmUgX19OUl9mYWR2aXNlNjRfNjQgX19OUjMyNjRfZmFkdmlzZTY0CisjaWZkZWYgX19OUjMyNjRfc3RhdAorI2RlZmluZSBfX05SX3N0YXQ2NCBfX05SMzI2NF9zdGF0CisjZGVmaW5lIF9fTlJfbHN0YXQ2NCBfX05SMzI2NF9sc3RhdAorI2VuZGlmCisjZW5kaWYKKworI2VuZGlmIC8qIF9BU01fR0VORVJJQ19VTklTVERfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc3NlcnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNzZXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk4OTcxMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNzZXJ0LmgKQEAgLTAsMCArMSwxMTggQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwxOTkyLDE5OTQtMjAwMSwyMDAzLDIwMDQsMjAwNworICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglJU08gQzk5IFN0YW5kYXJkOiA3LjIgRGlhZ25vc3RpY3MJPGFzc2VydC5oPgorICovCisKKyNpZmRlZglfQVNTRVJUX0gKKworIyB1bmRlZglfQVNTRVJUX0gKKyMgdW5kZWYJYXNzZXJ0CisjIHVuZGVmIF9fQVNTRVJUX1ZPSURfQ0FTVAorCisjIGlmZGVmCV9fVVNFX0dOVQorIyAgdW5kZWYgYXNzZXJ0X3BlcnJvcgorIyBlbmRpZgorCisjZW5kaWYgLyogYXNzZXJ0LmgJKi8KKworI2RlZmluZQlfQVNTRVJUX0gJMQorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpZiBkZWZpbmVkIF9fY3BsdXNwbHVzICYmIF9fR05VQ19QUkVSRVEgKDIsOTUpCisjIGRlZmluZSBfX0FTU0VSVF9WT0lEX0NBU1Qgc3RhdGljX2Nhc3Q8dm9pZD4KKyNlbHNlCisjIGRlZmluZSBfX0FTU0VSVF9WT0lEX0NBU1QgKHZvaWQpCisjZW5kaWYKKworLyogdm9pZCBhc3NlcnQgKGludCBleHByZXNzaW9uKTsKKworICAgSWYgTkRFQlVHIGlzIGRlZmluZWQsIGRvIG5vdGhpbmcuCisgICBJZiBub3QsIGFuZCBFWFBSRVNTSU9OIGlzIHplcm8sIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGFib3J0LiAgKi8KKworI2lmZGVmCU5ERUJVRworCisjIGRlZmluZSBhc3NlcnQoZXhwcikJCShfX0FTU0VSVF9WT0lEX0NBU1QgKDApKQorCisvKiB2b2lkIGFzc2VydF9wZXJyb3IgKGludCBlcnJudW0pOworCisgICBJZiBOREVCVUcgaXMgZGVmaW5lZCwgZG8gbm90aGluZy4gIElmIG5vdCwgYW5kIEVSUk5VTSBpcyBub3QgemVybywgcHJpbnQgYW4KKyAgIGVycm9yIG1lc3NhZ2Ugd2l0aCB0aGUgZXJyb3IgdGV4dCBmb3IgRVJSTlVNIGFuZCBhYm9ydC4KKyAgIChUaGlzIGlzIGEgR05VIGV4dGVuc2lvbi4pICovCisKKyMgaWZkZWYJX19VU0VfR05VCisjICBkZWZpbmUgYXNzZXJ0X3BlcnJvcihlcnJudW0pCShfX0FTU0VSVF9WT0lEX0NBU1QgKDApKQorIyBlbmRpZgorCisjZWxzZSAvKiBOb3QgTkRFQlVHLiAgKi8KKworI2lmbmRlZiBfQVNTRVJUX0hfREVDTFMKKyNkZWZpbmUgX0FTU0VSVF9IX0RFQ0xTCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoaXMgcHJpbnRzIGFuICJBc3NlcnRpb24gZmFpbGVkIiBtZXNzYWdlIGFuZCBhYm9ydHMuICAqLworZXh0ZXJuIHZvaWQgX19hc3NlcnRfZmFpbCAoX19jb25zdCBjaGFyICpfX2Fzc2VydGlvbiwgX19jb25zdCBjaGFyICpfX2ZpbGUsCisJCQkgICB1bnNpZ25lZCBpbnQgX19saW5lLCBfX2NvbnN0IGNoYXIgKl9fZnVuY3Rpb24pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworCisvKiBMaWtld2lzZSwgYnV0IHByaW50cyB0aGUgZXJyb3IgdGV4dCBmb3IgRVJSTlVNLiAgKi8KK2V4dGVybiB2b2lkIF9fYXNzZXJ0X3BlcnJvcl9mYWlsIChpbnQgX19lcnJudW0sIF9fY29uc3QgY2hhciAqX19maWxlLAorCQkJCSAgdW5zaWduZWQgaW50IF9fbGluZSwKKwkJCQkgIF9fY29uc3QgY2hhciAqX19mdW5jdGlvbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CisKKworLyogVGhlIGZvbGxvd2luZyBpcyBub3QgYXQgYWxsIHVzZWQgaGVyZSBidXQgbmVlZGVkIGZvciBzdGFuZGFyZAorICAgY29tcGxpYW5jZS4gICovCitleHRlcm4gdm9pZCBfX2Fzc2VydCAoY29uc3QgY2hhciAqX19hc3NlcnRpb24sIGNvbnN0IGNoYXIgKl9fZmlsZSwgaW50IF9fbGluZSkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CisKKworX19FTkRfREVDTFMKKyNlbmRpZiAvKiBOb3QgX0FTU0VSVF9IX0RFQ0xTICovCisKKyMgZGVmaW5lIGFzc2VydChleHByKQkJCQkJCQlcCisgICgoZXhwcikJCQkJCQkJCVwKKyAgID8gX19BU1NFUlRfVk9JRF9DQVNUICgwKQkJCQkJCVwKKyAgIDogX19hc3NlcnRfZmFpbCAoX19TVFJJTkcoZXhwciksIF9fRklMRV9fLCBfX0xJTkVfXywgX19BU1NFUlRfRlVOQ1RJT04pKQorCisjIGlmZGVmCV9fVVNFX0dOVQorIyAgZGVmaW5lIGFzc2VydF9wZXJyb3IoZXJybnVtKQkJCQkJCVwKKyAgKCEoZXJybnVtKQkJCQkJCQkJXAorICAgPyBfX0FTU0VSVF9WT0lEX0NBU1QgKDApCQkJCQkJXAorICAgOiBfX2Fzc2VydF9wZXJyb3JfZmFpbCAoKGVycm51bSksIF9fRklMRV9fLCBfX0xJTkVfXywgX19BU1NFUlRfRlVOQ1RJT04pKQorIyBlbmRpZgorCisvKiBWZXJzaW9uIDIuNCBhbmQgbGF0ZXIgb2YgR0NDIGRlZmluZSBhIG1hZ2ljYWwgdmFyaWFibGUgYF9fUFJFVFRZX0ZVTkNUSU9OX18nCisgICB3aGljaCBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gY3VycmVudGx5IGJlaW5nIGRlZmluZWQuCisgICBUaGlzIGlzIGJyb2tlbiBpbiBHKysgYmVmb3JlIHZlcnNpb24gMi42LgorICAgQzl4IGhhcyBhIHNpbWlsYXIgdmFyaWFibGUgY2FsbGVkIF9fZnVuY19fLCBidXQgcHJlZmVyIHRoZSBHQ0Mgb25lIHNpbmNlCisgICBpdCBkZW1hbmdsZXMgQysrIGZ1bmN0aW9uIG5hbWVzLiAgKi8KKyMgaWYgZGVmaW5lZCBfX2NwbHVzcGx1cyA/IF9fR05VQ19QUkVSRVEgKDIsIDYpIDogX19HTlVDX1BSRVJFUSAoMiwgNCkKKyMgICBkZWZpbmUgX19BU1NFUlRfRlVOQ1RJT04JX19QUkVUVFlfRlVOQ1RJT05fXworIyBlbHNlCisjICBpZiBkZWZpbmVkIF9fU1REQ19WRVJTSU9OX18gJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjICAgZGVmaW5lIF9fQVNTRVJUX0ZVTkNUSU9OCV9fZnVuY19fCisjICBlbHNlCisjICAgZGVmaW5lIF9fQVNTRVJUX0ZVTkNUSU9OCSgoX19jb25zdCBjaGFyICopIDApCisjICBlbmRpZgorIyBlbmRpZgorCisjZW5kaWYgLyogTkRFQlVHLiAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXR0ci9hdHRyaWJ1dGVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2F0dHIvYXR0cmlidXRlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMDIwMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2F0dHIvYXR0cmlidXRlcy5oCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworI2lmbmRlZiBfX0FUVFJJQlVURVNfSF9fCisjZGVmaW5lCV9fQVRUUklCVVRFU19IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorICoJQW4gYWxtb3N0LUlSSVgtY29tcGF0aWJsZSBleHRlbmRlZCBhdHRyaWJ1dGVzIEFQSQorICoJKHRoZSBJUklYIGF0dHJpYnV0ZSAibGlzdCIgb3BlcmF0aW9uIGlzIG1pc3NpbmcsIGFkZGVkIEFUVFJfU0VDVVJFKS4KKyAqLworCisvKgorICogVGhlIG1heGltdW0gc2l6ZSAoaW50byB0aGUga2VybmVsIG9yIHJldHVybmVkIGZyb20gdGhlIGtlcm5lbCkgb2YgYW4KKyAqIGF0dHJpYnV0ZSB2YWx1ZSBvciB0aGUgYnVmZmVyIHVzZWQgZm9yIGFuIGF0dHJfbGlzdCgpIGNhbGwuICBMYXJnZXIKKyAqIHNpemVzIHdpbGwgcmVzdWx0IGluIGFuIEUyQklHIHJldHVybiBjb2RlLgorICovCisjZGVmaW5lIEFUVFJfTUFYX1ZBTFVFTEVOCSg2NCoxMDI0KQkvKiBtYXggbGVuZ3RoIG9mIGEgdmFsdWUgKi8KKworCisvKgorICogRmxhZ3MgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGFueSBvZiB0aGUgc2ltcGxlIGF0dHJpYnV0ZSBjYWxscy4KKyAqIEFsbCBkZXNpcmVkIGZsYWdzIHNob3VsZCBiZSBiaXQtd2lzZSBPUidlZCB0b2dldGhlci4KKyAqLworI2RlZmluZSBBVFRSX0RPTlRGT0xMT1cJMHgwMDAxCS8qIGRvIG5vdCBmb2xsb3cgc3ltbGlua3MgZm9yIGEgcGF0aG5hbWUgKi8KKyNkZWZpbmUgQVRUUl9ST09UCTB4MDAwMgkvKiB1c2Ugcm9vdCBuYW1lc3BhY2UgYXR0cmlidXRlcyBpbiBvcCAqLworI2RlZmluZSBBVFRSX1RSVVNUCTB4MDAwNAkvKiB0ZWxsIHNlcnZlciB3ZSBjYW4gYmUgdHJ1c3RlZCB0byBwcm9wZXJseQorCQkJCSAgIGhhbmRsZSBleHRlbmRlZCBhdHRyaWJ1dGVzICovCisjZGVmaW5lIEFUVFJfU0VDVVJFCTB4MDAwOAkvKiB1c2Ugc2VjdXJpdHkgbmFtZXNwYWNlIGF0dHJpYnV0ZXMgaW4gb3AgKi8KKworLyoKKyAqIEFkZGl0aW9uYWwgZmxhZ3MgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHRoZSBzZXQoKSBhdHRyaWJ1dGUgY2FsbC4KKyAqIEFsbCBkZXNpcmVkIGZsYWdzIChmcm9tIGJvdGggbGlzdHMpIHNob3VsZCBiZSBiaXQtd2lzZSBPUidlZCB0b2dldGhlci4KKyAqLworI2RlZmluZSBBVFRSX0NSRUFURQkweDAwMTAJLyogcHVyZSBjcmVhdGU6IGZhaWwgaWYgYXR0ciBhbHJlYWR5IGV4aXN0cyAqLworI2RlZmluZSBBVFRSX1JFUExBQ0UJMHgwMDIwCS8qIHB1cmUgc2V0OiBmYWlsIGlmIGF0dHIgZG9lcyBub3QgZXhpc3QgKi8KKworLyoKKyAqIERlZmluZSBob3cgbGlzdHMgb2YgYXR0cmlidXRlIG5hbWVzIGFyZSByZXR1cm5lZCB0byB0aGUgdXNlciBmcm9tCisgKiB0aGUgYXR0cl9saXN0KCkgY2FsbC4gIEEgbGFyZ2UsIDMyYml0IGFsaWduZWQsIGJ1ZmZlciBpcyBwYXNzZWQgaW4KKyAqIGFsb25nIHdpdGggaXRzIHNpemUuICBXZSBwdXQgYW4gYXJyYXkgb2Ygb2Zmc2V0cyBhdCB0aGUgdG9wIHRoYXQgZWFjaAorICogcmVmZXJlbmNlIGFuIGF0dHJsaXN0X2VudF90IGFuZCBwYWNrIHRoZSBhdHRybGlzdF9lbnRfdCdzIGF0IHRoZSBib3R0b20uCisgKi8KK3R5cGVkZWYgc3RydWN0IGF0dHJsaXN0IHsKKwlpbnQzMl90CQlhbF9jb3VudDsJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gYXR0cmxpc3QgKi8KKwlpbnQzMl90CQlhbF9tb3JlOwkvKiBUL0Y6IG1vcmUgYXR0cnMgKGRvIGNhbGwgYWdhaW4pICovCisJaW50MzJfdAkJYWxfb2Zmc2V0WzFdOwkvKiBieXRlIG9mZnNldHMgb2YgYXR0cnMgW3Zhci1zaXplZF0gKi8KK30gYXR0cmxpc3RfdDsKKworLyoKKyAqIFNob3cgdGhlIGludGVyZXN0aW5nIGluZm8gYWJvdXQgb25lIGF0dHJpYnV0ZS4gIFRoaXMgaXMgd2hhdCB0aGUKKyAqIGFsX29mZnNldFtpXSBlbnRyeSBwb2ludHMgdG8uCisgKi8KK3R5cGVkZWYgc3RydWN0IGF0dHJsaXN0X2VudCB7CS8qIGRhdGEgZnJvbSBhdHRyX2xpc3QoKSAqLworCXVfaW50MzJfdAlhX3ZhbHVlbGVuOwkvKiBudW1iZXIgYnl0ZXMgaW4gdmFsdWUgb2YgYXR0ciAqLworCWNoYXIJCWFfbmFtZVsxXTsJLyogYXR0ciBuYW1lIChOVUxMIHRlcm1pbmF0ZWQpICovCit9IGF0dHJsaXN0X2VudF90OworCisvKgorICogR2l2ZW4gYSBwb2ludGVyIHRvIHRoZSAoY2hhciopIGJ1ZmZlciBjb250YWluaW5nIHRoZSBhdHRyX2xpc3QoKSByZXN1bHQsCisgKiBhbmQgYW4gaW5kZXgsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGluZGljYXRlZCBhdHRyaWJ1dGUgaW4gdGhlIGJ1ZmZlci4KKyAqLworI2RlZmluZQlBVFRSX0VOVFJZKGJ1ZmZlciwgaW5kZXgpCQlcCisJKChhdHRybGlzdF9lbnRfdCAqKQkJCVwKKwkgJigoY2hhciAqKWJ1ZmZlcilbICgoYXR0cmxpc3RfdCAqKShidWZmZXIpKS0+YWxfb2Zmc2V0W2luZGV4XSBdKQorCisvKgorICogSW1wbGVtZW50IGEgImN1cnNvciIgZm9yIHVzZSBpbiBzdWNjZXNzaXZlIGF0dHJfbGlzdCgpIGNhbGxzLgorICogSXQgcHJvdmlkZXMgYSB3YXkgdG8gZmluZCB0aGUgbGFzdCBhdHRyaWJ1dGUgdGhhdCB3YXMgcmV0dXJuZWQgaW4gdGhlCisgKiBsYXN0IGF0dHJfbGlzdCgpIGNhbGwgc28gdGhhdCB3ZSBjYW4gZ2V0IHRoZSBuZXh0IG9uZSB3aXRob3V0IG1pc3NpbmcKKyAqIGFueS4gIFRoaXMgc2hvdWxkIGJlIGJ6ZXJvKCllZCBiZWZvcmUgdXNlIGFuZCB3aGVuZXZlciBpdCBpcyBkZXNpcmVkIHRvCisgKiBzdGFydCBvdmVyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXR0cmlidXRlIGxpc3QuICBUaGUgb25seSB2YWxpZAorICogb3BlcmF0aW9uIG9uIGEgY3Vyc29yIGlzIHRvIGJ6ZXJvKCkgaXQuCisgKi8KK3R5cGVkZWYgc3RydWN0IGF0dHJsaXN0X2N1cnNvciB7CisJdV9pbnQzMl90CW9wYXF1ZVs0XTsJLyogYW4gb3BhcXVlIGNvb2tpZSAqLworfSBhdHRybGlzdF9jdXJzb3JfdDsKKworLyoKKyAqIE11bHRpLWF0dHJpYnV0ZSBvcGVyYXRpb24gdmVjdG9yLgorICovCit0eXBlZGVmIHN0cnVjdCBhdHRyX211bHRpb3AgeworCWludDMyX3QJYW1fb3Bjb2RlOwkvKiBvcGVyYXRpb24gdG8gcGVyZm9ybSAoQVRUUl9PUF9HRVQsIGV0Yy4pICovCisJaW50MzJfdAlhbV9lcnJvcjsJLyogW291dCBhcmddIHJlc3VsdCBvZiB0aGlzIHN1Yi1vcCAoYW4gZXJybm8pICovCisJY2hhcgkqYW1fYXR0cm5hbWU7CS8qIGF0dHJpYnV0ZSBuYW1lIHRvIHdvcmsgd2l0aCAqLworCWNoYXIJKmFtX2F0dHJ2YWx1ZTsJLyogW2luL291dCBhcmddIGF0dHJpYnV0ZSB2YWx1ZSAocmF3IGJ5dGVzKSAqLworCWludDMyX3QJYW1fbGVuZ3RoOwkvKiBbaW4vb3V0IGFyZ10gbGVuZ3RoIG9mIHZhbHVlICovCisJaW50MzJfdAlhbV9mbGFnczsJLyogZmxhZ3MgKGJpdC13aXNlIE9SIG9mICNkZWZpbmVzIGFib3ZlKSAqLworfSBhdHRyX211bHRpb3BfdDsKKyNkZWZpbmUJQVRUUl9NQVhfTVVMVElPUFMJMTI4CS8qIG1heCBudW1iZXIgb3BzIGluIGFuIG9wbGlzdCBhcnJheSAqLworCisvKgorICogVmFsaWQgdmFsdWVzIG9mIGFtX29wY29kZS4KKyAqLworI2RlZmluZSBBVFRSX09QX0dFVAkxCS8qIHJldHVybiB0aGUgaW5kaWNhdGVkIGF0dHIncyB2YWx1ZSAqLworI2RlZmluZSBBVFRSX09QX1NFVAkyCS8qIHNldC9jcmVhdGUgdGhlIGluZGljYXRlZCBhdHRyL3ZhbHVlIHBhaXIgKi8KKyNkZWZpbmUgQVRUUl9PUF9SRU1PVkUJMwkvKiByZW1vdmUgdGhlIGluZGljYXRlZCBhdHRyICovCisKKy8qCisgKiBHZXQgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZS4KKyAqIFZhbHVlbGVuZ3RoIG11c3QgYmUgc2V0IHRvIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHZhbHVlIGJ1ZmZlciwgaXQgd2lsbAorICogYmUgc2V0IHRvIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgaW4gdGhlIHZhbHVlIGJ1ZmZlciB1cG9uIHJldHVybi4KKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgLTEgb24gZXJyb3IgKHcvZXJybm8gc2V0IGFwcHJvcHJpYXRlbHkpLCAwIG9uIHN1Y2Nlc3MuCisgKi8KK2V4dGVybiBpbnQgYXR0cl9nZXQgKGNvbnN0IGNoYXIgKl9fcGF0aCwgY29uc3QgY2hhciAqX19hdHRybmFtZSwKKwkJCWNoYXIgKl9fYXR0cnZhbHVlLCBpbnQgKl9fdmFsdWVsZW5ndGgsIGludCBfX2ZsYWdzKTsKK2V4dGVybiBpbnQgYXR0cl9nZXRmIChpbnQgX19mZCwgY29uc3QgY2hhciAqX19hdHRybmFtZSwgY2hhciAqX19hdHRydmFsdWUsCisJCQlpbnQgKl9fdmFsdWVsZW5ndGgsIGludCBfX2ZsYWdzKTsKKworLyoKKyAqIFNldCB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlLCBjcmVhdGluZyB0aGUgYXR0cmlidXRlIGlmIG5lY2Vzc2FyeS4KKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgLTEgb24gZXJyb3IgKHcvZXJybm8gc2V0IGFwcHJvcHJpYXRlbHkpLCAwIG9uIHN1Y2Nlc3MuCisgKi8KK2V4dGVybiBpbnQgYXR0cl9zZXQgKGNvbnN0IGNoYXIgKl9fcGF0aCwgY29uc3QgY2hhciAqX19hdHRybmFtZSwKKwkJCWNvbnN0IGNoYXIgKl9fYXR0cnZhbHVlLCBjb25zdCBpbnQgX192YWx1ZWxlbmd0aCwKKwkJCWludCBfX2ZsYWdzKTsKK2V4dGVybiBpbnQgYXR0cl9zZXRmIChpbnQgX19mZCwgY29uc3QgY2hhciAqX19hdHRybmFtZSwKKwkJCWNvbnN0IGNoYXIgKl9fYXR0cnZhbHVlLCBjb25zdCBpbnQgX192YWx1ZWxlbmd0aCwKKwkJCWludCBfX2ZsYWdzKTsKKworLyoKKyAqIFJlbW92ZSBhbiBhdHRyaWJ1dGUuCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIC0xIG9uIGVycm9yICh3L2Vycm5vIHNldCBhcHByb3ByaWF0ZWx5KSwgMCBvbiBzdWNjZXNzLgorICovCitleHRlcm4gaW50IGF0dHJfcmVtb3ZlIChjb25zdCBjaGFyICpfX3BhdGgsIGNvbnN0IGNoYXIgKl9fYXR0cm5hbWUsCisJCQlpbnQgX19mbGFncyk7CitleHRlcm4gaW50IGF0dHJfcmVtb3ZlZiAoaW50IF9fZmQsIGNvbnN0IGNoYXIgKl9fYXR0cm5hbWUsIGludCBfX2ZsYWdzKTsKKworLyoKKyAqIExpc3QgdGhlIG5hbWVzIGFuZCBzaXplcyBvZiB0aGUgdmFsdWVzIG9mIGFsbCB0aGUgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QuCisgKiAiQ3Vyc29yIiBtdXN0IGJlIGFsbG9jYXRlZCBhbmQgemVyb2VkIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCwgaXQgaXMgdXNlZAorICogdG8gbWFpbnRhaW4gY29udGV4dCBiZXR3ZWVuIHN5c3RlbSBjYWxscyBpZiBhbGwgdGhlIGF0dHJpYnV0ZSBuYW1lcyB3b24ndAorICogZml0IGludG8gdGhlIGJ1ZmZlciBvbiB0aGUgZmlyc3Qgc3lzdGVtIGNhbGwuCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIC0xIG9uIGVycm9yICh3L2Vycm5vIHNldCBhcHByb3ByaWF0ZWx5KSwgMCBvbiBzdWNjZXNzLgorICovCitpbnQgYXR0cl9saXN0KGNvbnN0IGNoYXIgKl9fcGF0aCwgY2hhciAqX19idWZmZXIsIGNvbnN0IGludCBfX2J1ZmZlcnNpemUsCisJCWludCBfX2ZsYWdzLCBhdHRybGlzdF9jdXJzb3JfdCAqX19jdXJzb3IpOworaW50IGF0dHJfbGlzdGYoaW50IF9fZmQsIGNoYXIgKl9fYnVmZmVyLCBjb25zdCBpbnQgX19idWZmZXJzaXplLAorCQlpbnQgX19mbGFncywgYXR0cmxpc3RfY3Vyc29yX3QgKl9fY3Vyc29yKTsKKworLyoKKyAqIE9wZXJhdGUgb24gbXVsdGlwbGUgYXR0cmlidXRlcyBvZiB0aGUgc2FtZSBvYmplY3Qgc2ltdWx0YW5lb3VzbHkuCisgKgorICogVGhpcyBjYWxsIHdpbGwgc2F2ZSBvbiBzeXN0ZW0gY2FsbCBvdmVyaGVhZCB3aGVuIG1hbnkgYXR0cmlidXRlcyBhcmUKKyAqIGdvaW5nIHRvIGJlIG9wZXJhdGVkIG9uLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgLTEgb24gZXJyb3IgKHcvZXJybm8gc2V0IGFwcHJvcHJpYXRlbHkpLCAwIG9uIHN1Y2Nlc3MuCisgKiBOb3RlIHRoYXQgdGhpcyBjYWxsIHdpbGwgbm90IHJldHVybiAtMSBhcyBhIHJlc3VsdCBvZiBmYWlsdXJlIG9mIGFueQorICogb2YgdGhlIHN1Yi1vcGVyYXRpb25zLCB0aGVpciByZXR1cm4gdmFsdWUgaXMgc3RvcmVkIGluIGVhY2ggZWxlbWVudAorICogb2YgdGhlIG9wZXJhdGlvbiBhcnJheS4gIFRoaXMgY2FsbCB3aWxsIHJldHVybiAtMSBmb3IgYSBmYWlsdXJlIG9mIHRoZQorICogY2FsbCBhcyBhIHdob2xlLCBlZzogaWYgdGhlIHBhdGhuYW1lIGRvZXNuJ3QgZXhpc3QsIG9yIHRoZSBmZCBpcyBiYWQuCisgKgorICogVGhlIHNlbWFudGljcyBhbmQgYWxsb3dhYmxlIHZhbHVlcyBmb3IgdGhlIGZpZWxkcyBpbiBhIGF0dHJfbXVsdGlvcF90CisgKiBhcmUgdGhlIHNhbWUgYXMgdGhlIHNlbWFudGljcyBhbmQgYWxsb3dhYmxlIHZhbHVlcyBmb3IgdGhlIGFyZ3VtZW50cyB0bworICogdGhlIGNvcnJlc3BvbmRpbmcgInNpbXBsZSIgYXR0cmlidXRlIGludGVyZmFjZS4gIEZvciBleGFtcGxlOiB0aGUgYXJncworICogdG8gYSBBVFRSX09QX0dFVCBhcmUgdGhlIHNhbWUgYXMgdGhlIGFyZ3MgdG8gYW4gYXR0cl9nZXQoKSBjYWxsLgorICovCitleHRlcm4gaW50IGF0dHJfbXVsdGkgKGNvbnN0IGNoYXIgKl9fcGF0aCwgYXR0cl9tdWx0aW9wX3QgKl9fb3BsaXN0LAorCQkJaW50IF9fY291bnQsIGludCBfX2ZsYWdzKTsKK2V4dGVybiBpbnQgYXR0cl9tdWx0aWYgKGludCBfX2ZkLCBhdHRyX211bHRpb3BfdCAqX19vcGxpc3QsCisJCQlpbnQgX19jb3VudCwgaW50IF9fZmxhZ3MpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYJLyogX19BVFRSSUJVVEVTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hdHRyL2Vycm9yX2NvbnRleHQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXR0ci9lcnJvcl9jb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTExNzkwMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXR0ci9lcnJvcl9jb250ZXh0LmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAgQ29weXJpZ2h0IChDKSAyMDA5ICBBbmRyZWFzIEdydWVuYmFjaGVyIDxhZ3J1ZW5Ac3VzZS5kZT4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX0VSUk9SX0NPTlRFWFRfVAorI2RlZmluZSBfX0VSUk9SX0NPTlRFWFRfVAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBlcnJvcl9jb250ZXh0IHsKKwkvKiBQcm9jZXNzIGFuIGVycm9yIG1lc3NhZ2UgKi8KKwl2b2lkICgqZXJyb3IpIChzdHJ1Y3QgZXJyb3JfY29udGV4dCAqLCBjb25zdCBjaGFyICosIC4uLik7CisKKwkvKiBRdW90ZSBhIGZpbGUgbmFtZSBmb3IgaW5jbHVkaW5nIGluIGFuIGVycm9yIG1lc3NhZ2UgKi8KKwljb25zdCBjaGFyICooKnF1b3RlKSAoc3RydWN0IGVycm9yX2NvbnRleHQgKiwgY29uc3QgY2hhciAqKTsKKworCS8qIEZyZWUgYSBxdW90ZWQgbmFtZSAqLworCXZvaWQgKCpxdW90ZV9mcmVlKSAoc3RydWN0IGVycm9yX2NvbnRleHQgKiwgY29uc3QgY2hhciAqKTsKK307CisKKyNpZmRlZiBFUlJPUl9DT05URVhUX01BQ1JPUworIyBkZWZpbmUgZXJyb3IoY3R4LCBhcmdzLi4uKSBkbyB7IFwKKwlpZiAoKGN0eCkgJiYgKGN0eCktPmVycm9yKSBcCisJCShjdHgpLT5lcnJvcigoY3R4KSwgYXJncyk7IFwKKwl9IHdoaWxlKDApCisjIGRlZmluZSBxdW90ZShjdHgsIG5hbWUpIFwKKwkoICgoY3R4KSAmJiAoY3R4KS0+cXVvdGUpID8gKGN0eCktPnF1b3RlKChjdHgpLCAobmFtZSkpIDogKG5hbWUpICkKKyMgZGVmaW5lIHF1b3RlX2ZyZWUoY3R4LCBuYW1lKSBkbyB7IFwKKwlpZiAoKGN0eCkgJiYgKGN0eCktPnF1b3RlX2ZyZWUpIFwKKwkJKGN0eCktPnF1b3RlX2ZyZWUoKGN0eCksIChuYW1lKSk7IFwKKwl9IHdoaWxlKDApCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmICAvKiBfX0VSUk9SX0NPTlRFWFRfVCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hdHRyL2xpYmF0dHIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXR0ci9saWJhdHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU3YzQzMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXR0ci9saWJhdHRyLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAgQ29weXJpZ2h0IChDKSAyMDA5ICBBbmRyZWFzIEdydWVuYmFjaGVyIDxhZ3J1ZW5Ac3VzZS5kZT4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX0xJQkFUVFJfSAorI2RlZmluZSBfX0xJQkFUVFJfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBlcnJvcl9jb250ZXh0OworCitleHRlcm4gaW50IGF0dHJfY29weV9maWxlIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKKwkJCSAgIGludCAoKikgKGNvbnN0IGNoYXIgKiwgc3RydWN0IGVycm9yX2NvbnRleHQgKiksCisJCQkgICBzdHJ1Y3QgZXJyb3JfY29udGV4dCAqKTsKK2V4dGVybiBpbnQgYXR0cl9jb3B5X2ZkIChjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqLCBpbnQsCisJCQkgaW50ICgqKSAoY29uc3QgY2hhciAqLCBzdHJ1Y3QgZXJyb3JfY29udGV4dCAqKSwKKwkJCSBzdHJ1Y3QgZXJyb3JfY29udGV4dCAqKTsKKworLyogS2VlcCB0aGlzIGZ1bmN0aW9uIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gKi8KK2V4dGVybiBpbnQgYXR0cl9jb3B5X2NoZWNrX3Blcm1pc3Npb25zKGNvbnN0IGNoYXIgKiwgc3RydWN0IGVycm9yX2NvbnRleHQgKik7CisKKyNkZWZpbmUgQVRUUl9BQ1RJT05fU0tJUAkxCisjZGVmaW5lIEFUVFJfQUNUSU9OX1BFUk1JU1NJT05TCTIKKworZXh0ZXJuIGludCBhdHRyX2NvcHlfYWN0aW9uKGNvbnN0IGNoYXIgKiwgc3RydWN0IGVycm9yX2NvbnRleHQgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hdHRyL3hhdHRyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2F0dHIveGF0dHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGE4NGJlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hdHRyL3hhdHRyLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUKKyAqIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKi8KKyNpZm5kZWYgX19YQVRUUl9IX18KKyNkZWZpbmUgX19YQVRUUl9IX18KKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2lmbmRlZiBFTk9BVFRSCisjIGRlZmluZSBFTk9BVFRSIEVOT0RBVEEgICAgICAgIC8qIE5vIHN1Y2ggYXR0cmlidXRlICovCisjZW5kaWYKKworI2RlZmluZSBYQVRUUl9DUkVBVEUgIDB4MSAgICAgICAvKiBzZXQgdmFsdWUsIGZhaWwgaWYgYXR0ciBhbHJlYWR5IGV4aXN0cyAqLworI2RlZmluZSBYQVRUUl9SRVBMQUNFIDB4MiAgICAgICAvKiBzZXQgdmFsdWUsIGZhaWwgaWYgYXR0ciBkb2VzIG5vdCBleGlzdCAqLworCisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIGludCBzZXR4YXR0ciAoY29uc3QgY2hhciAqX19wYXRoLCBjb25zdCBjaGFyICpfX25hbWUsCisJCSAgICAgIGNvbnN0IHZvaWQgKl9fdmFsdWUsIHNpemVfdCBfX3NpemUsIGludCBfX2ZsYWdzKSBfX1RIUk9XOworZXh0ZXJuIGludCBsc2V0eGF0dHIgKGNvbnN0IGNoYXIgKl9fcGF0aCwgY29uc3QgY2hhciAqX19uYW1lLAorCQkgICAgICBjb25zdCB2b2lkICpfX3ZhbHVlLCBzaXplX3QgX19zaXplLCBpbnQgX19mbGFncykgX19USFJPVzsKK2V4dGVybiBpbnQgZnNldHhhdHRyIChpbnQgX19maWxlZGVzLCBjb25zdCBjaGFyICpfX25hbWUsCisJCSAgICAgIGNvbnN0IHZvaWQgKl9fdmFsdWUsIHNpemVfdCBfX3NpemUsIGludCBfX2ZsYWdzKSBfX1RIUk9XOworCitleHRlcm4gc3NpemVfdCBnZXR4YXR0ciAoY29uc3QgY2hhciAqX19wYXRoLCBjb25zdCBjaGFyICpfX25hbWUsCisJCQkJdm9pZCAqX192YWx1ZSwgc2l6ZV90IF9fc2l6ZSkgX19USFJPVzsKK2V4dGVybiBzc2l6ZV90IGxnZXR4YXR0ciAoY29uc3QgY2hhciAqX19wYXRoLCBjb25zdCBjaGFyICpfX25hbWUsCisJCQkJdm9pZCAqX192YWx1ZSwgc2l6ZV90IF9fc2l6ZSkgX19USFJPVzsKK2V4dGVybiBzc2l6ZV90IGZnZXR4YXR0ciAoaW50IF9fZmlsZWRlcywgY29uc3QgY2hhciAqX19uYW1lLAorCQkJCXZvaWQgKl9fdmFsdWUsIHNpemVfdCBfX3NpemUpIF9fVEhST1c7CisKK2V4dGVybiBzc2l6ZV90IGxpc3R4YXR0ciAoY29uc3QgY2hhciAqX19wYXRoLCBjaGFyICpfX2xpc3QsCisJCQkJc2l6ZV90IF9fc2l6ZSkgX19USFJPVzsKK2V4dGVybiBzc2l6ZV90IGxsaXN0eGF0dHIgKGNvbnN0IGNoYXIgKl9fcGF0aCwgY2hhciAqX19saXN0LAorCQkJCXNpemVfdCBfX3NpemUpIF9fVEhST1c7CitleHRlcm4gc3NpemVfdCBmbGlzdHhhdHRyIChpbnQgX19maWxlZGVzLCBjaGFyICpfX2xpc3QsCisJCQkJc2l6ZV90IF9fc2l6ZSkgX19USFJPVzsKKworZXh0ZXJuIGludCByZW1vdmV4YXR0ciAoY29uc3QgY2hhciAqX19wYXRoLCBjb25zdCBjaGFyICpfX25hbWUpIF9fVEhST1c7CitleHRlcm4gaW50IGxyZW1vdmV4YXR0ciAoY29uc3QgY2hhciAqX19wYXRoLCBjb25zdCBjaGFyICpfX25hbWUpIF9fVEhST1c7CitleHRlcm4gaW50IGZyZW1vdmV4YXR0ciAoaW50IF9fZmlsZWRlcywgICBjb25zdCBjaGFyICpfX25hbWUpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBfX1hBVFRSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hdWRpb2ZpbGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXVkaW9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFjNzBiMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXVkaW9maWxlLmgKQEAgLTAsMCArMSw2MDAgQEAKKy8qCisJQXVkaW8gRmlsZSBMaWJyYXJ5CisJQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAsIDIwMTAtMjAxMSwgTWljaGFlbCBQcnVldHQgPG1pY2hhZWxANjhrLm9yZz4KKworCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKwltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorCXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKwlMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKwlGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKwlCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EuCisqLworCisvKgorCWF1ZGlvZmlsZS5oCisKKwlUaGlzIGZpbGUgY29udGFpbnMgdGhlIHB1YmxpYyBpbnRlcmZhY2VzIHRvIHRoZSBBdWRpbyBGaWxlIExpYnJhcnkuCisqLworCisjaWZuZGVmIEFVRElPRklMRV9ICisjZGVmaW5lIEFVRElPRklMRV9ICisKKyNpbmNsdWRlIDxhdXB2bGlzdC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjZGVmaW5lIExJQkFVRElPRklMRV9NQUpPUl9WRVJTSU9OIDAKKyNkZWZpbmUgTElCQVVESU9GSUxFX01JTk9SX1ZFUlNJT04gMworI2RlZmluZSBMSUJBVURJT0ZJTEVfTUlDUk9fVkVSU0lPTiAzCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgX0FGdmlydHVhbGZpbGUgQUZ2aXJ0dWFsZmlsZTsKKwordHlwZWRlZiBzdHJ1Y3QgX0FGZmlsZXNldHVwICpBRmZpbGVzZXR1cDsKK3R5cGVkZWYgc3RydWN0IF9BRmZpbGVoYW5kbGUgKkFGZmlsZWhhbmRsZTsKK3R5cGVkZWYgdm9pZCAoKkFGZXJyZnVuYykobG9uZywgY29uc3QgY2hhciAqKTsKKworLy8gRGVmaW5lIEFGZnJhbWVjb3VudCBhbmQgQUZmaWxlb2Zmc2V0IGFzIDY0LWJpdCBzaWduZWQgaW50ZWdlcnMuCisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgXAorCWRlZmluZWQoX19EcmFnb25GbHlfXykgfHwgXAorCWRlZmluZWQoX19OZXRCU0RfXykgfHwgXAorCWRlZmluZWQoX19PcGVuQlNEX18pIHx8IFwKKwlkZWZpbmVkKF9fQVBQTEVfXykgfHwgXAorCWRlZmluZWQoX19zZ2kpIHx8IFwKKwkoZGVmaW5lZChfX2xpbnV4X18pICYmIGRlZmluZWQoX19MUDY0X18pKQorLy8gQlNEIGFuZCBJUklYIHN5c3RlbXMgZGVmaW5lIG9mZl90IGFzIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyLgorLy8gTGludXggZGVmaW5lcyBvZmZfdCBhcyBhIDY0LWJpdCBzaWduZWQgaW50ZWdlciBpbiBMUDY0IG1vZGUuCit0eXBlZGVmIG9mZl90IEFGZnJhbWVjb3VudDsKK3R5cGVkZWYgb2ZmX3QgQUZmaWxlb2Zmc2V0OworI2Vsc2UKKy8vIEZvciBhbGwgb3RoZXIgc3lzdGVtcywgdXNlIGludDY0X3QuCit0eXBlZGVmIGludDY0X3QgQUZmcmFtZWNvdW50OwordHlwZWRlZiBpbnQ2NF90IEFGZmlsZW9mZnNldDsKKyNlbmRpZgorCisjZGVmaW5lIEFGX05VTExfRklMRVNFVFVQCSgoc3RydWN0IF9BRmZpbGVzZXR1cCAqKSAwKQorI2RlZmluZSBBRl9OVUxMX0ZJTEVIQU5ETEUJKChzdHJ1Y3QgX0FGZmlsZWhhbmRsZSAqKSAwKQorCisjZGVmaW5lIEFGX0VSUl9CQVNFIDMwMDAKKworZW51bQoreworCUFGX0RFRkFVTFRfVFJBQ0sgPSAxMDAxCit9OworCitlbnVtCit7CisJQUZfREVGQVVMVF9JTlNUID0gMjAwMQorfTsKKworZW51bQoreworCUFGX05VTV9VTkxJTUlURUQgPSA5OTk5OQorfTsKKworZW51bQoreworCUFGX0JZVEVPUkRFUl9CSUdFTkRJQU4gPSA1MDEsCisJQUZfQllURU9SREVSX0xJVFRMRUVORElBTiA9IDUwMgorfTsKKworZW51bQoreworCUFGX0ZJTEVfVU5LTk9XTiA9IC0xLAorCUFGX0ZJTEVfUkFXREFUQSA9IDAsCisJQUZfRklMRV9BSUZGQyA9IDEsCisJQUZfRklMRV9BSUZGID0gMiwKKwlBRl9GSUxFX05FWFRTTkQgPSAzLAorCUFGX0ZJTEVfV0FWRSA9IDQsCisJQUZfRklMRV9CSUNTRiA9IDUsCisJQUZfRklMRV9JUkNBTSA9IEFGX0ZJTEVfQklDU0YsCisJQUZfRklMRV9NUEVHMUJJVFNUUkVBTSA9IDYsCS8qIG5vdCBpbXBsZW1lbnRlZCAqLworCUFGX0ZJTEVfU09VTkRERVNJR05FUjEgPSA3LAkvKiBub3QgaW1wbGVtZW50ZWQgKi8KKwlBRl9GSUxFX1NPVU5EREVTSUdORVIyID0gOCwJLyogbm90IGltcGxlbWVudGVkICovCisJQUZfRklMRV9BVlIgPSA5LAorCUFGX0ZJTEVfSUZGXzhTVlggPSAxMCwKKwlBRl9GSUxFX1NBTVBMRVZJU0lPTiA9IDExLAkvKiBub3QgaW1wbGVtZW50ZWQgKi8KKwlBRl9GSUxFX1ZPQyA9IDEyLAorCUFGX0ZJTEVfTklTVF9TUEhFUkUgPSAxMywKKwlBRl9GSUxFX1NPVU5ERk9OVDIgPSAxNCwJLyogbm90IGltcGxlbWVudGVkICovCisJQUZfRklMRV9DQUYgPSAxNQorfTsKKworZW51bQoreworCUFGX0xPT1BfTU9ERV9OT0xPT1AgPSAwLAorCUFGX0xPT1BfTU9ERV9GT1JXID0gMSwKKwlBRl9MT09QX01PREVfRk9SV0JBS1cgPSAyCit9OworCitlbnVtCit7CisJQUZfU0FNUEZNVF9UV09TQ09NUCA9IDQwMSwgLyogbGluZWFyIHR3bydzIGNvbXBsZW1lbnQgKi8KKwlBRl9TQU1QRk1UX1VOU0lHTkVEID0gNDAyLCAvKiB1bnNpZ25lZCBpbnRlZ2VyICovCisJQUZfU0FNUEZNVF9GTE9BVCA9IDQwMywgLyogMzItYml0IElFRUUgZmxvYXRpbmctcG9pbnQgKi8KKwlBRl9TQU1QRk1UX0RPVUJMRSA9IDQwNCAvKiA2NC1iaXQgSUVFRSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50ICovCit9OworCitlbnVtCit7CisJQUZfSU5TVF9MT09QX09GRiA9IDAsCQkJLyogbm8gbG9vcGluZyAqLworCUFGX0lOU1RfTE9PUF9DT05USU5VT1VTID0gMSwJLyogbG9vcCBjb250aW51b3VzbHkgdGhyb3VnaCBkZWNheSAqLworCUFGX0lOU1RfTE9PUF9TVVNUQUlOID0gMwkJLyogbG9vcCBkdXJpbmcgc3VzdGFpbiwgdGhlbiBjb250aW51ZSAqLworfTsKKworZW51bQoreworCUFGX0lOU1RfTUlESV9CQVNFTk9URSA9IDMwMSwKKwlBRl9JTlNUX05VTUNFTlRTX0RFVFVORSA9IDMwMiwKKwlBRl9JTlNUX01JRElfTE9OT1RFID0gMzAzLAorCUFGX0lOU1RfTUlESV9ISU5PVEUgPSAzMDQsCisJQUZfSU5TVF9NSURJX0xPVkVMT0NJVFkgPSAzMDUsCisJQUZfSU5TVF9NSURJX0hJVkVMT0NJVFkgPSAzMDYsCisJQUZfSU5TVF9OVU1EQlNfR0FJTiA9IDMwNywKKwlBRl9JTlNUX1NVU0xPT1BJRCA9IDMwOCwJCS8qIGxvb3AgaWQgZm9yIEFJRkYgc3VzdGFpbiBsb29wICovCisJQUZfSU5TVF9SRUxMT09QSUQgPSAzMDksCQkvKiBsb29wIGlkIGZvciBBSUZGIHJlbGVhc2UgbG9vcCAqLworCUFGX0lOU1RfU0FNUF9TVEFSVEZSQU1FID0gMzEwLAkvKiBzdGFydCBzYW1wbGUgZm9yIHRoaXMgaW5zdCAqLworCUFGX0lOU1RfU0FNUF9FTkRGUkFNRSA9IDMxMSwJLyogZW5kIHNhbXBsZSBmb3IgdGhpcyBpbnN0ICovCisJQUZfSU5TVF9TQU1QX01PREUgPSAzMTIsCQkvKiBsb29waW5nIG1vZGUgZm9yIHRoaXMgaW5zdCAqLworCUFGX0lOU1RfVFJBQ0tJRCA9IDMxMywKKwlBRl9JTlNUX05BTUUgPSAzMTQsCQkJCS8qIG5hbWUgb2YgdGhpcyBpbnN0ICovCisJQUZfSU5TVF9TQU1QX1JBVEUgPSAzMTUsCQkvKiBzYW1wbGUgcmF0ZSBvZiB0aGlzIGluc3QncyBzYW1wbGUgKi8KKwlBRl9JTlNUX1BSRVNFVElEID0gMzE2LAkJCS8qIElEIG9mIHByZXNldCBjb250YWluaW5nIHRoaXMgaW5zdCAqLworCUFGX0lOU1RfUFJFU0VUX05BTUUgPSAzMTcJCS8qIG5hbWUgb2YgcHJlc2V0IGNvbnRhaW5pbmcgdGhpcyBpbnN0ICovCit9OworCitlbnVtCit7CisJQUZfTUlTQ19VTlJFQ09HTklaRUQgPSAwLAkvKiB1bnJlY29nbml6ZWQgZGF0YSBjaHVuayAqLworCUFGX01JU0NfQ09QWSA9IDIwMSwJLyogY29weXJpZ2h0IHN0cmluZyAqLworCUFGX01JU0NfQVVUSCA9IDIwMiwJLyogYXV0aG9yIHN0cmluZyAqLworCUFGX01JU0NfTkFNRSA9IDIwMywJLyogbmFtZSBzdHJpbmcgKi8KKwlBRl9NSVNDX0FOTk8gPSAyMDQsCS8qIGFubm90YXRpb24gc3RyaW5nICovCisJQUZfTUlTQ19BUFBMID0gMjA1LAkvKiBhcHBsaWNhdGlvbi1zcGVjaWZpYyBkYXRhICovCisJQUZfTUlTQ19NSURJID0gMjA2LAkvKiBNSURJIGV4Y2x1c2l2ZSBkYXRhICovCisJQUZfTUlTQ19QQ01NQVAgPSAyMDcsCS8qIFBDTSBtYXBwaW5nIGluZm9ybWF0aW9uIChmdXR1cmUgdXNlKSAqLworCUFGX01JU0NfTmVYVCA9IDIwOCwJLyogbWlzYyBiaW5hcnkgZGF0YSBhcHBlbmRlZCB0byBOZVhUIGhlYWRlciAqLworCUFGX01JU0NfSVJDQU1fUEVBS0FNUCA9IDIwOSwJLyogcGVhayBhbXBsaXR1ZGUgaW5mb3JtYXRpb24gKi8KKwlBRl9NSVNDX0lSQ0FNX0NPTU1FTlQgPSAyMTAsCS8qIEJJQ1NGIHRleHQgY29tbWVudCAqLworCUFGX01JU0NfQ09NTUVOVCA9IDIxMCwJLyogZ2VuZXJhbCB0ZXh0IGNvbW1lbnQgKi8KKworCUFGX01JU0NfSUNNVCA9IEFGX01JU0NfQ09NTUVOVCwJLyogY29tbWVudHMgY2h1bmsgKFdBVkUgZm9ybWF0KSAqLworCUFGX01JU0NfSUNSRCA9IDIxMSwgIC8qIGNyZWF0aW9uIGRhdGUgKFdBVkUgZm9ybWF0KSAqLworCUFGX01JU0NfSVNGVCA9IDIxMiAgLyogc29mdHdhcmUgbmFtZSAoV0FWRSBmb3JtYXQpICovCit9OworCitlbnVtCit7CisJLyogc3VwcG9ydGVkIGNvbXByZXNzaW9uIHNjaGVtZXMgKi8KKwlBRl9DT01QUkVTU0lPTl9VTktOT1dOID0gLTEsCisJQUZfQ09NUFJFU1NJT05fTk9ORSA9IDAsCisJQUZfQ09NUFJFU1NJT05fRzcyMiA9IDUwMSwKKwlBRl9DT01QUkVTU0lPTl9HNzExX1VMQVcgPSA1MDIsCisJQUZfQ09NUFJFU1NJT05fRzcxMV9BTEFXID0gNTAzLAorCisJLyogQXBwbGUgcHJvcHJpZXRhcnkgQUlGRi1DIGNvbXByZXNzaW9uIHNjaGVtZXMgKG5vdCBzdXBwb3J0ZWQpICovCisJQUZfQ09NUFJFU1NJT05fQVBQTEVfQUNFMiA9IDUwNCwKKwlBRl9DT01QUkVTU0lPTl9BUFBMRV9BQ0U4ID0gNTA1LAorCUFGX0NPTVBSRVNTSU9OX0FQUExFX01BQzMgPSA1MDYsCisJQUZfQ09NUFJFU1NJT05fQVBQTEVfTUFDNiA9IDUwNywKKworCUFGX0NPTVBSRVNTSU9OX0c3MjYgPSA1MTcsCisJQUZfQ09NUFJFU1NJT05fRzcyOCA9IDUxOCwKKwlBRl9DT01QUkVTU0lPTl9EVklfQVVESU8gPSA1MTksCisJQUZfQ09NUFJFU1NJT05fSU1BID0gQUZfQ09NUFJFU1NJT05fRFZJX0FVRElPLAorCUFGX0NPTVBSRVNTSU9OX0dTTSA9IDUyMCwKKwlBRl9DT01QUkVTU0lPTl9GUzEwMTYgPSA1MjEsCisJQUZfQ09NUFJFU1NJT05fRFYgPSA1MjIsCisJQUZfQ09NUFJFU1NJT05fTVNfQURQQ00gPSA1MjMKK307CisKKy8qIHRva2VucyBmb3IgYWZRdWVyeSgpIC0tIHNlZSB0aGUgbWFuIHBhZ2UgZm9yIGluc3RydWN0aW9ucyAqLworLyogbGV2ZWwgMSBzZWxlY3RvcnMgKi8KK2VudW0KK3sKKwlBRl9RVUVSWVRZUEVfSU5TVFBBUkFNID0gNTAwLAorCUFGX1FVRVJZVFlQRV9GSUxFRk1UID0gNTAxLAorCUFGX1FVRVJZVFlQRV9DT01QUkVTU0lPTiA9IDUwMiwKKwlBRl9RVUVSWVRZUEVfQ09NUFJFU1NJT05QQVJBTSA9IDUwMywKKwlBRl9RVUVSWVRZUEVfTUlTQyA9IDUwNCwKKwlBRl9RVUVSWVRZUEVfSU5TVCA9IDUwNSwKKwlBRl9RVUVSWVRZUEVfTUFSSyA9IDUwNiwKKwlBRl9RVUVSWVRZUEVfTE9PUCA9IDUwNworfTsKKworLyogbGV2ZWwgMiBzZWxlY3RvcnMgKi8KK2VudW0KK3sKKwlBRl9RVUVSWV9OQU1FID0gNjAwLAkvKiBnZXQgbmFtZSAoMS0zIHdvcmRzKSAqLworCUFGX1FVRVJZX0RFU0MgPSA2MDEsCS8qIGdldCBkZXNjcmlwdGlvbiAqLworCUFGX1FVRVJZX0xBQkVMID0gNjAyLAkvKiBnZXQgNC0gb3IgNS1jaGFyIGxhYmVsICovCisJQUZfUVVFUllfVFlQRSA9IDYwMywJLyogZ2V0IHR5cGUgdG9rZW4gKi8KKwlBRl9RVUVSWV9ERUZBVUxUID0gNjA0LAkvKiBkZmx0LiB2YWx1ZSBmb3IgcGFyYW0gKi8KKwlBRl9RVUVSWV9JRF9DT1VOVCA9IDYwNSwJLyogZ2V0IG51bWJlciBvZiBpZHMgYXZhaWwuICovCisJQUZfUVVFUllfSURTID0gNjA2LAkvKiBnZXQgYXJyYXkgb2YgaWQgdG9rZW5zICovCisJQUZfUVVFUllfSU1QTEVNRU5URUQgPSA2MTMsCS8qIGJvb2xlYW4gKi8KKwlBRl9RVUVSWV9UWVBFX0NPVU5UID0gNjA3LAkvKiBnZXQgbnVtYmVyIG9mIHR5cGVzIGF2LiAqLworCUFGX1FVRVJZX1RZUEVTID0gNjA4LAkvKiBnZXQgYXJyYXkgb2YgdHlwZXMgKi8KKwlBRl9RVUVSWV9OQVRJVkVfU0FNUEZNVCA9IDYwOSwJLyogZm9yIGNvbXByZXNzaW9uICovCisJQUZfUVVFUllfTkFUSVZFX1NBTVBXSURUSCA9IDYxMCwKKwlBRl9RVUVSWV9TUVVJU0hGQUMgPSA2MTEsCS8qIDEuMCBtZWFucyB2YXJpYWJsZSAqLworCUFGX1FVRVJZX01BWF9OVU1CRVIgPSA2MTIsCS8qIG1heCBhbGxvd2VkIGluIGZpbGUgKi8KKwlBRl9RVUVSWV9TVVBQT1JURUQgPSA2MTMJLyogaW5zdHMsIGxvb3BzLCBldGMuLCBzdXBwb3J0ZWQ/ICovCit9OworCisvKiBsZXZlbCAyIHNlbGVjdG9ycyB3aGljaCBoYXZlIHN1Yi1zZWxlY3RvcnMgKi8KK2VudW0KK3sKKwlBRl9RVUVSWV9UUkFDS1MgPSA2MjAsCisJQUZfUVVFUllfQ0hBTk5FTFMgPSA2MjEsCisJQUZfUVVFUllfU0FNUExFX1NJWkVTID0gNjIyLAorCUFGX1FVRVJZX1NBTVBMRV9GT1JNQVRTID0gNjIzLAorCUFGX1FVRVJZX0NPTVBSRVNTSU9OX1RZUEVTID0gNjI0Cit9OworCisvKiBsZXZlbCAzIHN1Yi1zZWxlY3RvcnMgKi8KK2VudW0KK3sKKwlBRl9RVUVSWV9WQUxVRV9DT1VOVCA9IDY1MCwJLyogbnVtYmVyIG9mIHZhbHVlcyBvZiB0aGUgYWJvdmUgKi8KKwlBRl9RVUVSWV9WQUxVRVMgPSA2NTEJLyogYXJyYXkgb2YgdGhvc2UgdmFsdWVzICovCit9OworCisKKy8qCisJT2xkIEF1ZGlvIEZpbGUgTGlicmFyeSBlcnJvciBjb2Rlcy4gVGhlc2UgYXJlIHN0aWxsIHJldHVybmVkIGJ5IHRoZQorCUFGZXJyb3JoYW5kbGVyIGNhbGxzLCBidXQgYXJlIG5vdCB1c2VkIGJ5IHRoZSBuZXcgZGlnaXRhbCBtZWRpYSBsaWJyYXJ5CisJZXJyb3IgcmVwb3J0aW5nIHJvdXRpbmVzLiBTZWUgdGhlIGJvdHRvbSBvZiB0aGlzIGZpbGUgZm9yIHRoZSBuZXcgZXJyb3IKKwl0b2tlbnMuCisqLworCitlbnVtCit7CisJQUZfQkFEX05PVF9JTVBMRU1FTlRFRCA9IDAsCS8qIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKwlBRl9CQURfRklMRUhBTkRMRSA9IDEsCS8qIHRyaWVkIHRvIHVzZSBpbnZhbGlkIGZpbGVoYW5kbGUgKi8KKwlBRl9CQURfT1BFTiA9IDMsCS8qIHVuaXggb3BlbiBmYWlsZWQgKi8KKwlBRl9CQURfQ0xPU0UgPSA0LAkvKiB1bml4IGNsb3NlIGZhaWxlZCAqLworCUFGX0JBRF9SRUFEID0gNSwJLyogdW5peCByZWFkIGZhaWxlZCAqLworCUFGX0JBRF9XUklURSA9IDYsCS8qIHVuaXggd3JpdGUgZmFpbGVkICovCisJQUZfQkFEX0xTRUVLID0gNywJLyogdW5peCBsc2VlayBmYWlsZWQgKi8KKwlBRl9CQURfTk9fRklMRUhBTkRMRSA9IDgsCS8qIGZhaWxlZCB0byBhbGxvY2F0ZSBhIGZpbGVoYW5kbGUgc3RydWN0ICovCisJQUZfQkFEX0FDQ01PREUgPSAxMCwJLyogdW5yZWNvZ25pemVkIGF1ZGlvIGZpbGUgYWNjZXNzIG1vZGUgKi8KKwlBRl9CQURfTk9XUklURUFDQyA9IDExLAkvKiBmaWxlIG5vdCBvcGVuIGZvciB3cml0aW5nICovCisJQUZfQkFEX05PUkVBREFDQyA9IDEyLAkvKiBmaWxlIG5vdCBvcGVuIGZvciByZWFkaW5nICovCisJQUZfQkFEX0ZJTEVGTVQgPSAxMywJLyogdW5yZWNvZ25pemVkIGF1ZGlvIGZpbGUgZm9ybWF0ICovCisJQUZfQkFEX1JBVEUgPSAxNCwJLyogaW52YWxpZCBzYW1wbGUgcmF0ZSAqLworCUFGX0JBRF9DSEFOTkVMUyA9IDE1LAkvKiBpbnZhbGlkIG51bWJlciBvZiBjaGFubmVscyovCisJQUZfQkFEX1NBTVBDTlQgPSAxNiwJLyogaW52YWxpZCBzYW1wbGUgY291bnQgKi8KKwlBRl9CQURfV0lEVEggPSAxNywJLyogaW52YWxpZCBzYW1wbGUgd2lkdGggKi8KKwlBRl9CQURfU0VFS01PREUgPSAxOCwJLyogaW52YWxpZCBzZWVrIG1vZGUgKi8KKwlBRl9CQURfTk9fTE9PUERBVEEgPSAxOSwJLyogZmFpbGVkIHRvIGFsbG9jYXRlIGxvb3Agc3RydWN0ICovCisJQUZfQkFEX01BTExPQyA9IDIwLAkvKiBtYWxsb2MgZmFpbGVkIHNvbWV3aGVyZSAqLworCUFGX0JBRF9MT09QSUQgPSAyMSwKKwlBRl9CQURfU0FNUEZNVCA9IDIyLAkvKiBiYWQgc2FtcGxlIGZvcm1hdCAqLworCUFGX0JBRF9GSUxFU0VUVVAgPSAyMywJLyogYmFkIGZpbGUgc2V0dXAgc3RydWN0dXJlKi8KKwlBRl9CQURfVFJBQ0tJRCA9IDI0LAkvKiBubyB0cmFjayBjb3JyZXNwb25kaW5nIHRvIGlkICovCisJQUZfQkFEX05VTVRSQUNLUyA9IDI1LAkvKiB3cm9uZyBudW1iZXIgb2YgdHJhY2tzIGZvciBmaWxlIGZvcm1hdCAqLworCUFGX0JBRF9OT19GSUxFU0VUVVAgPSAyNiwJLyogZmFpbGVkIHRvIGFsbG9jYXRlIGEgZmlsZXNldHVwIHN0cnVjdCovCisJQUZfQkFEX0xPT1BNT0RFID0gMjcsCS8qIHVucmVjb2duaXplZCBsb29wIG1vZGUgdmFsdWUgKi8KKwlBRl9CQURfSU5TVElEID0gMjgsCS8qIGludmFsaWQgaW5zdHJ1bWVudCBpZCAqLworCUFGX0JBRF9OVU1MT09QUyA9IDI5LAkvKiBiYWQgbnVtYmVyIG9mIGxvb3BzICovCisJQUZfQkFEX05VTU1BUktTID0gMzAsCS8qIGJhZCBudW1iZXIgb2YgbWFya2VycyAqLworCUFGX0JBRF9NQVJLSUQgPSAzMSwJLyogYmFkIG1hcmtlciBpZCAqLworCUFGX0JBRF9NQVJLUE9TID0gMzIsCS8qIGludmFsaWQgbWFya2VyIHBvc2l0aW9uIHZhbHVlICovCisJQUZfQkFEX05VTUlOU1RTID0gMzMsCS8qIGludmFsaWQgbnVtYmVyIG9mIGluc3RydW1lbnRzICovCisJQUZfQkFEX05PQUVTREFUQSA9IDM0LAorCUFGX0JBRF9NSVNDSUQgPSAzNSwKKwlBRl9CQURfTlVNTUlTQyA9IDM2LAorCUFGX0JBRF9NSVNDU0laRSA9IDM3LAorCUFGX0JBRF9NSVNDVFlQRSA9IDM4LAorCUFGX0JBRF9NSVNDU0VFSyA9IDM5LAorCUFGX0JBRF9TVFJMRU4gPSA0MCwJLyogaW52YWxpZCBzdHJpbmcgbGVuZ3RoICovCisJQUZfQkFEX1JBVEVDT05WID0gNDUsCisJQUZfQkFEX1NZTkNGSUxFID0gNDYsCisJQUZfQkFEX0NPREVDX0NPTkZJRyA9IDQ3LAkvKiBpbXByb3Blcmx5IGNvbmZpZ3VyZWQgY29kZWMgKi8KKwlBRl9CQURfQ09ERUNfU1RBVEUgPSA0OCwJLyogaW52YWxpZCBjb2RlYyBzdGF0ZTogY2FuJ3QgcmVjb3ZlciAqLworCUFGX0JBRF9DT0RFQ19MSUNFTlNFID0gNDksCS8qIG5vIGxpY2Vuc2UgYXZhaWxhYmxlIGZvciBjb2RlYyAqLworCUFGX0JBRF9DT0RFQ19UWVBFID0gNTAsCS8qIHVuc3VwcG9ydGVkIGNvZGVjIHR5cGUgKi8KKwlBRl9CQURfQ09NUFJFU1NJT04gPSBBRl9CQURfQ09ERUNfQ09ORklHLAkvKiBmb3IgYmFjayBjb21wYXQgKi8KKwlBRl9CQURfQ09NUFRZUEUgPSBBRl9CQURfQ09ERUNfVFlQRSwJLyogZm9yIGJhY2sgY29tcGF0ICovCisKKwlBRl9CQURfSU5TVFBUWVBFID0gNTEsCS8qIGludmFsaWQgaW5zdHJ1bWVudCBwYXJhbWV0ZXIgdHlwZSAqLworCUFGX0JBRF9JTlNUUElEID0gNTIsCS8qIGludmFsaWQgaW5zdHJ1bWVudCBwYXJhbWV0ZXIgaWQgKi8KKwlBRl9CQURfQllURU9SREVSID0gNTMsCisJQUZfQkFEX0ZJTEVGTVRfUEFSQU0gPSA1NCwJLyogdW5yZWNvZ25pemVkIGZpbGUgZm9ybWF0IHBhcmFtZXRlciAqLworCUFGX0JBRF9DT01QX1BBUkFNID0gNTUsCS8qIHVucmVjb2duaXplZCBjb21wcmVzc2lvbiBwYXJhbWV0ZXIgKi8KKwlBRl9CQURfREFUQU9GRlNFVCA9IDU2LAkvKiBiYWQgZGF0YSBvZmZzZXQgKi8KKwlBRl9CQURfRlJBTUVDTlQgPSA1NywJLyogYmFkIGZyYW1lIGNvdW50ICovCisJQUZfQkFEX1FVRVJZVFlQRSA9IDU4LAkvKiBiYWQgcXVlcnkgdHlwZSAqLworCUFGX0JBRF9RVUVSWSA9IDU5LAkvKiBiYWQgYXJndW1lbnQgdG8gYWZRdWVyeSgpICovCisJQUZfV0FSTklOR19DT0RFQ19SQVRFID0gNjAsCS8qIHVzaW5nIDhrIGluc3RlYWQgb2YgY29kZWMgcmF0ZSA4MDEyICovCisJQUZfV0FSTklOR19SQVRFQ1ZUID0gNjEsCS8qIHdhcm5pbmcgYWJvdXQgcmF0ZSBjb252ZXJzaW9uIHVzZWQgKi8KKworCUFGX0JBRF9IRUFERVIgPSA2MiwJLyogZmFpbGVkIHRvIHBhcnNlIGhlYWRlciAqLworCUFGX0JBRF9GUkFNRSA9IDYzLAkvKiBiYWQgZnJhbWUgbnVtYmVyICovCisJQUZfQkFEX0xPT1BDT1VOVCA9IDY0LAkvKiBiYWQgbG9vcCBjb3VudCAqLworCUFGX0JBRF9ETUVESUFfQ0FMTCA9IDY1LAkvKiBlcnJvciBpbiBkbWVkaWEgc3Vic3lzdGVtIGNhbGwgKi8KKworCS8qIEFJRkYvQUlGRi1DIHNwZWNpZmljIGVycm9ycyB3aGVuIHBhcnNpbmcgZmlsZSBoZWFkZXIgKi8KKwlBRl9CQURfQUlGRl9IRUFERVIgPSAxMDgsCS8qIGZhaWxlZCB0byBwYXJzZSBjaHVuayBoZWFkZXIgKi8KKwlBRl9CQURfQUlGRl9GT1JNID0gMTA5LAkvKiBmYWlsZWQgdG8gcGFyc2UgRk9STSBjaHVuayAqLworCUFGX0JBRF9BSUZGX1NTTkQgPSAxMTAsCS8qIGZhaWxlZCB0byBwYXJzZSBTU05EIGNodW5rICovCisJQUZfQkFEX0FJRkZfQ0hVTktJRCA9IDExMSwJLyogdW5yZWNvZ25pemVkIEFJRkYvQUlGRi1DIGNodW5rIGlkICovCisJQUZfQkFEX0FJRkZfQ09NTSA9IDExMiwJLyogZmFpbGVkIHRvIHBhcnNlIENPTU0gY2h1bmsgKi8KKwlBRl9CQURfQUlGRl9JTlNUID0gMTEzLAkvKiBmYWlsZWQgdG8gcGFyc2UgSU5TVCBjaHVuayAqLworCUFGX0JBRF9BSUZGX01BUksgPSAxMTQsCS8qIGZhaWxlZCB0byBwYXJzZSBNQVJLIGNodW5rICovCisJQUZfQkFEX0FJRkZfU0tJUCA9IDExNSwJLyogZmFpbGVkIHRvIHNraXAgdW5zdXBwb3J0ZWQgY2h1bmsgKi8KKwlBRl9CQURfQUlGRl9MT09QTU9ERSA9IDExNgkvKiB1bnJlY29nbml6ZWQgbG9vcCBtb2RlIChmb3J3LCBldGMpKi8KK307CisKKy8qIG5ldyBlcnJvciBjb2RlcyB3aGljaCBtYXkgYmUgcmV0cmlldmVkIHZpYSBkbUdldEVycm9yKCkgKi8KKy8qIFRoZSBvbGQgZXJyb3IgdG9rZW5zIGNvbnRpbnVlIHRvIGJlIHJldHJpZXZhYmxlIHZpYSB0aGUgQUZlcnJvcmhhbmRsZXIgKi8KKy8qIEFGX0VSUl9CQVNFIGlzICNkZWZpbmVkIGluIGRtZWRpYS9kbWVkaWEuaCAqLworCitlbnVtCit7CisJQUZfRVJSX05PVF9JTVBMRU1FTlRFRCA9IDArQUZfRVJSX0JBU0UsCS8qIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKwlBRl9FUlJfQkFEX0ZJTEVIQU5ETEUgPSAxK0FGX0VSUl9CQVNFLAkvKiBpbnZhbGlkIGZpbGVoYW5kbGUgKi8KKwlBRl9FUlJfQkFEX1JFQUQgPSA1K0FGX0VSUl9CQVNFLAkvKiB1bml4IHJlYWQgZmFpbGVkICovCisJQUZfRVJSX0JBRF9XUklURSA9IDYrQUZfRVJSX0JBU0UsCS8qIHVuaXggd3JpdGUgZmFpbGVkICovCisJQUZfRVJSX0JBRF9MU0VFSyA9IDcrQUZfRVJSX0JBU0UsCS8qIHVuaXggbHNlZWsgZmFpbGVkICovCisJQUZfRVJSX0JBRF9BQ0NNT0RFID0gMTArQUZfRVJSX0JBU0UsCS8qIHVucmVjb2duaXplZCBhdWRpbyBmaWxlIGFjY2VzcyBtb2RlICovCisJQUZfRVJSX05PX1dSSVRFQUNDID0gMTErQUZfRVJSX0JBU0UsCS8qIGZpbGUgbm90IG9wZW4gZm9yIHdyaXRpbmcgKi8KKwlBRl9FUlJfTk9fUkVBREFDQyA9IDEyK0FGX0VSUl9CQVNFLAkvKiBmaWxlIG5vdCBvcGVuIGZvciByZWFkaW5nICovCisJQUZfRVJSX0JBRF9GSUxFRk1UID0gMTMrQUZfRVJSX0JBU0UsCS8qIHVucmVjb2duaXplZCBhdWRpbyBmaWxlIGZvcm1hdCAqLworCUFGX0VSUl9CQURfUkFURSA9IDE0K0FGX0VSUl9CQVNFLAkvKiBpbnZhbGlkIHNhbXBsZSByYXRlICovCisJQUZfRVJSX0JBRF9DSEFOTkVMUyA9IDE1K0FGX0VSUl9CQVNFLAkvKiBpbnZhbGlkICMgY2hhbm5lbHMqLworCUFGX0VSUl9CQURfU0FNUENOVCA9IDE2K0FGX0VSUl9CQVNFLAkvKiBpbnZhbGlkIHNhbXBsZSBjb3VudCAqLworCUFGX0VSUl9CQURfV0lEVEggPSAxNytBRl9FUlJfQkFTRSwJLyogaW52YWxpZCBzYW1wbGUgd2lkdGggKi8KKwlBRl9FUlJfQkFEX1NFRUtNT0RFID0gMTgrQUZfRVJSX0JBU0UsCS8qIGludmFsaWQgc2VlayBtb2RlICovCisJQUZfRVJSX0JBRF9MT09QSUQgPSAyMStBRl9FUlJfQkFTRSwJLyogaW52YWxpZCBsb29wIGlkICovCisJQUZfRVJSX0JBRF9TQU1QRk1UID0gMjIrQUZfRVJSX0JBU0UsCS8qIGJhZCBzYW1wbGUgZm9ybWF0ICovCisJQUZfRVJSX0JBRF9GSUxFU0VUVVAgPSAyMytBRl9FUlJfQkFTRSwJLyogYmFkIGZpbGUgc2V0dXAgc3RydWN0dXJlKi8KKwlBRl9FUlJfQkFEX1RSQUNLSUQgPSAyNCtBRl9FUlJfQkFTRSwJLyogbm8gdHJhY2sgY29ycmVzcG9uZGluZyB0byBpZCAqLworCUFGX0VSUl9CQURfTlVNVFJBQ0tTID0gMjUrQUZfRVJSX0JBU0UsCS8qIHdyb25nIG51bWJlciBvZiB0cmFja3MgZm9yIGZpbGUgZm9ybWF0ICovCisJQUZfRVJSX0JBRF9MT09QTU9ERSA9IDI3K0FGX0VSUl9CQVNFLAkvKiB1bnJlY29nbml6ZWQgbG9vcCBtb2RlIHN5bWJvbCAqLworCUFGX0VSUl9CQURfSU5TVElEID0gMjgrQUZfRVJSX0JBU0UsCS8qIGludmFsaWQgaW5zdHJ1bWVudCBpZCAqLworCUFGX0VSUl9CQURfTlVNTE9PUFMgPSAyOStBRl9FUlJfQkFTRSwJLyogYmFkIG51bWJlciBvZiBsb29wcyAqLworCUFGX0VSUl9CQURfTlVNTUFSS1MgPSAzMCtBRl9FUlJfQkFTRSwJLyogYmFkIG51bWJlciBvZiBtYXJrZXJzICovCisJQUZfRVJSX0JBRF9NQVJLSUQgPSAzMStBRl9FUlJfQkFTRSwJLyogYmFkIG1hcmtlciBpZCAqLworCUFGX0VSUl9CQURfTUFSS1BPUyA9IDMyK0FGX0VSUl9CQVNFLAkvKiBpbnZhbGlkIG1hcmtlciBwb3NpdGlvbiB2YWx1ZSAqLworCUFGX0VSUl9CQURfTlVNSU5TVFMgPSAzMytBRl9FUlJfQkFTRSwJLyogaW52YWxpZCBudW1iZXIgb2YgaW5zdHJ1bWVudHMgKi8KKwlBRl9FUlJfQkFEX05PQUVTREFUQSA9IDM0K0FGX0VSUl9CQVNFLAorCUFGX0VSUl9CQURfTUlTQ0lEID0gMzUrQUZfRVJSX0JBU0UsCisJQUZfRVJSX0JBRF9OVU1NSVNDID0gMzYrQUZfRVJSX0JBU0UsCisJQUZfRVJSX0JBRF9NSVNDU0laRSA9IDM3K0FGX0VSUl9CQVNFLAorCUFGX0VSUl9CQURfTUlTQ1RZUEUgPSAzOCtBRl9FUlJfQkFTRSwKKwlBRl9FUlJfQkFEX01JU0NTRUVLID0gMzkrQUZfRVJSX0JBU0UsCisJQUZfRVJSX0JBRF9TVFJMRU4gPSA0MCtBRl9FUlJfQkFTRSwJLyogaW52YWxpZCBzdHJpbmcgbGVuZ3RoICovCisJQUZfRVJSX0JBRF9SQVRFQ09OViA9IDQ1K0FGX0VSUl9CQVNFLAorCUFGX0VSUl9CQURfU1lOQ0ZJTEUgPSA0NitBRl9FUlJfQkFTRSwKKwlBRl9FUlJfQkFEX0NPREVDX0NPTkZJRyA9IDQ3K0FGX0VSUl9CQVNFLAkvKiBpbXByb3Blcmx5IGNvbmZpZ3VyZWQgY29kZWMgKi8KKwlBRl9FUlJfQkFEX0NPREVDX1RZUEUgPSA1MCtBRl9FUlJfQkFTRSwJLyogdW5zdXBwb3J0ZWQgY29kZWMgdHlwZSAqLworCUFGX0VSUl9CQURfSU5TVFBUWVBFID0gNTErQUZfRVJSX0JBU0UsCS8qIGludmFsaWQgaW5zdHJ1bWVudCBwYXJhbWV0ZXIgdHlwZSAqLworCUFGX0VSUl9CQURfSU5TVFBJRCA9IDUyK0FGX0VSUl9CQVNFLAkvKiBpbnZhbGlkIGluc3RydW1lbnQgcGFyYW1ldGVyIGlkICovCisKKwlBRl9FUlJfQkFEX0JZVEVPUkRFUiA9IDUzK0FGX0VSUl9CQVNFLAorCUFGX0VSUl9CQURfRklMRUZNVF9QQVJBTSA9IDU0K0FGX0VSUl9CQVNFLAkvKiB1bnJlY29nbml6ZWQgZmlsZSBmb3JtYXQgcGFyYW1ldGVyICovCisJQUZfRVJSX0JBRF9DT01QX1BBUkFNID0gNTUrQUZfRVJSX0JBU0UsCS8qIHVucmVjb2duaXplZCBjb21wcmVzc2lvbiBwYXJhbWV0ZXIgKi8KKwlBRl9FUlJfQkFEX0RBVEFPRkZTRVQgPSA1NitBRl9FUlJfQkFTRSwJLyogYmFkIGRhdGEgb2Zmc2V0ICovCisJQUZfRVJSX0JBRF9GUkFNRUNOVCA9IDU3K0FGX0VSUl9CQVNFLAkvKiBiYWQgZnJhbWUgY291bnQgKi8KKworCUFGX0VSUl9CQURfUVVFUllUWVBFID0gNTgrQUZfRVJSX0JBU0UsCS8qIGJhZCBxdWVyeSB0eXBlICovCisJQUZfRVJSX0JBRF9RVUVSWSA9IDU5K0FGX0VSUl9CQVNFLAkvKiBiYWQgYXJndW1lbnQgdG8gYWZRdWVyeSgpICovCisJQUZfRVJSX0JBRF9IRUFERVIgPSA2MitBRl9FUlJfQkFTRSwJLyogZmFpbGVkIHRvIHBhcnNlIGhlYWRlciAqLworCUFGX0VSUl9CQURfRlJBTUUgPSA2MytBRl9FUlJfQkFTRSwJLyogYmFkIGZyYW1lIG51bWJlciAqLworCUFGX0VSUl9CQURfTE9PUENPVU5UID0gNjQrQUZfRVJSX0JBU0UsCS8qIGJhZCBsb29wIGNvdW50ICovCisKKwkvKiBBSUZGL0FJRkYtQyBzcGVjaWZpYyBlcnJvcnMgd2hlbiBwYXJzaW5nIGZpbGUgaGVhZGVyICovCisKKwlBRl9FUlJfQkFEX0FJRkZfSEVBREVSID0gNjYrQUZfRVJSX0JBU0UsCS8qIGZhaWxlZCB0byBwYXJzZSBjaHVuayBoZWFkZXIgKi8KKwlBRl9FUlJfQkFEX0FJRkZfRk9STSA9IDY3K0FGX0VSUl9CQVNFLAkvKiBmYWlsZWQgdG8gcGFyc2UgRk9STSBjaHVuayAqLworCUFGX0VSUl9CQURfQUlGRl9TU05EID0gNjgrQUZfRVJSX0JBU0UsCS8qIGZhaWxlZCB0byBwYXJzZSBTU05EIGNodW5rICovCisJQUZfRVJSX0JBRF9BSUZGX0NIVU5LSUQgPSA2OStBRl9FUlJfQkFTRSwJLyogdW5yZWNvZ25pemVkIEFJRkYvQUlGRi1DIGNodW5rIGlkICovCisJQUZfRVJSX0JBRF9BSUZGX0NPTU0gPSA3MCtBRl9FUlJfQkFTRSwJLyogZmFpbGVkIHRvIHBhcnNlIENPTU0gY2h1bmsgKi8KKwlBRl9FUlJfQkFEX0FJRkZfSU5TVCA9IDcxK0FGX0VSUl9CQVNFLAkvKiBmYWlsZWQgdG8gcGFyc2UgSU5TVCBjaHVuayAqLworCUFGX0VSUl9CQURfQUlGRl9NQVJLID0gNzIrQUZfRVJSX0JBU0UsCS8qIGZhaWxlZCB0byBwYXJzZSBNQVJLIGNodW5rICovCisJQUZfRVJSX0JBRF9BSUZGX1NLSVAgPSA3MytBRl9FUlJfQkFTRSwJLyogZmFpbGVkIHRvIHNraXAgdW5zdXBwb3J0ZWQgY2h1bmsgKi8KKwlBRl9FUlJfQkFEX0FJRkZfTE9PUE1PREUgPSA3NCtBRl9FUlJfQkFTRQkvKiB1bnJlY29nbml6ZWQgbG9vcCBtb2RlIChmb3J3LCBldGMpICovCit9OworCisKKy8qIGdsb2JhbCByb3V0aW5lcyAqLworQUZlcnJmdW5jIGFmU2V0RXJyb3JIYW5kbGVyIChBRmVycmZ1bmMgZWZ1bmMpOworCisvKiBxdWVyeSByb3V0aW5lcyAqLworQVVwdmxpc3QgYWZRdWVyeSAoaW50IHF1ZXJ5dHlwZSwgaW50IGFyZzEsIGludCBhcmcyLCBpbnQgYXJnMywgaW50IGFyZzQpOworbG9uZyBhZlF1ZXJ5TG9uZyAoaW50IHF1ZXJ5dHlwZSwgaW50IGFyZzEsIGludCBhcmcyLCBpbnQgYXJnMywgaW50IGFyZzQpOworZG91YmxlIGFmUXVlcnlEb3VibGUgKGludCBxdWVyeXR5cGUsIGludCBhcmcxLCBpbnQgYXJnMiwgaW50IGFyZzMsIGludCBhcmc0KTsKK3ZvaWQgKmFmUXVlcnlQb2ludGVyIChpbnQgcXVlcnl0eXBlLCBpbnQgYXJnMSwgaW50IGFyZzIsIGludCBhcmczLCBpbnQgYXJnNCk7CisKKy8qIGJhc2ljIG9wZXJhdGlvbnMgb24gZmlsZSBoYW5kbGVzIGFuZCBmaWxlIHNldHVwcyAqLworQUZmaWxlc2V0dXAgYWZOZXdGaWxlU2V0dXAgKHZvaWQpOwordm9pZCBhZkZyZWVGaWxlU2V0dXAgKEFGZmlsZXNldHVwKTsKK2ludCBhZklkZW50aWZ5RkQgKGludCk7CitpbnQgYWZJZGVudGlmeU5hbWVkRkQgKGludCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCAqaW1wbGVtZW50ZWQpOworCitBRmZpbGVoYW5kbGUgYWZPcGVuRmlsZSAoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm1vZGUsCisJQUZmaWxlc2V0dXAgc2V0dXApOworQUZmaWxlaGFuZGxlIGFmT3BlblZpcnR1YWxGaWxlIChBRnZpcnR1YWxmaWxlICp2ZmlsZSwgY29uc3QgY2hhciAqbW9kZSwKKwlBRmZpbGVzZXR1cCBzZXR1cCk7CitBRmZpbGVoYW5kbGUgYWZPcGVuRkQgKGludCBmZCwgY29uc3QgY2hhciAqbW9kZSwgQUZmaWxlc2V0dXAgc2V0dXApOworQUZmaWxlaGFuZGxlIGFmT3Blbk5hbWVkRkQgKGludCBmZCwgY29uc3QgY2hhciAqbW9kZSwgQUZmaWxlc2V0dXAgc2V0dXAsCisJY29uc3QgY2hhciAqZmlsZW5hbWUpOworCit2b2lkIGFmU2F2ZUZpbGVQb3NpdGlvbiAoQUZmaWxlaGFuZGxlIGZpbGUpOwordm9pZCBhZlJlc3RvcmVGaWxlUG9zaXRpb24gKEFGZmlsZWhhbmRsZSBmaWxlKTsKK2ludCBhZlN5bmNGaWxlIChBRmZpbGVoYW5kbGUgZmlsZSk7CitpbnQgYWZDbG9zZUZpbGUgKEFGZmlsZWhhbmRsZSBmaWxlKTsKKwordm9pZCBhZkluaXRGaWxlRm9ybWF0IChBRmZpbGVzZXR1cCwgaW50IGZvcm1hdCk7CitpbnQgYWZHZXRGaWxlRm9ybWF0IChBRmZpbGVoYW5kbGUsIGludCAqdmVyc2lvbik7CisKKy8qIHRyYWNrICovCit2b2lkIGFmSW5pdFRyYWNrSURzIChBRmZpbGVzZXR1cCwgY29uc3QgaW50ICp0cmFja2lkcywgaW50IHRyYWNrQ291bnQpOworaW50IGFmR2V0VHJhY2tJRHMgKEFGZmlsZWhhbmRsZSwgaW50ICp0cmFja2lkcyk7CisKKy8qIHRyYWNrIGRhdGE6IHJlYWRpbmcsIHdyaXRuZywgc2Vla2luZywgc2l6aW5nIGZyYW1lcyAqLworaW50IGFmUmVhZEZyYW1lcyAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2ssIHZvaWQgKmJ1ZmZlciwgaW50IGZyYW1lQ291bnQpOworaW50IGFmV3JpdGVGcmFtZXMgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrLCBjb25zdCB2b2lkICpidWZmZXIsIGludCBmcmFtZUNvdW50KTsKK0FGZnJhbWVjb3VudCBhZlNlZWtGcmFtZSAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2ssIEFGZnJhbWVjb3VudCBmcmFtZW9mZnNldCk7CitBRmZyYW1lY291bnQgYWZUZWxsRnJhbWUgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrKTsKK0FGZmlsZW9mZnNldCBhZkdldFRyYWNrQnl0ZXMgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrKTsKK2Zsb2F0IGFmR2V0RnJhbWVTaXplIChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywgaW50IGV4cGFuZDN0bzQpOworZmxvYXQgYWZHZXRWaXJ0dWFsRnJhbWVTaXplIChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywgaW50IGV4cGFuZDN0bzQpOworCisvKiB0cmFjayBkYXRhOiBBRVMgZGF0YSAqLworLyogYWZJbml0QUVTQ2hhbm5lbERhdGEgaXMgb2Jzb2xldGUgLS0gdXNlIGFmSW5pdEFFU0NoYW5uZWxEYXRhVG8oKSAqLwordm9pZCBhZkluaXRBRVNDaGFubmVsRGF0YSAoQUZmaWxlc2V0dXAsIGludCB0cmFjayk7IC8qIG9ic29sZXRlICovCit2b2lkIGFmSW5pdEFFU0NoYW5uZWxEYXRhVG8gKEFGZmlsZXNldHVwLCBpbnQgdHJhY2ssIGludCB3aWxsQmVEYXRhKTsKK2ludCBhZkdldEFFU0NoYW5uZWxEYXRhIChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywgdW5zaWduZWQgY2hhciBidWZbMjRdKTsKK3ZvaWQgYWZTZXRBRVNDaGFubmVsRGF0YSAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2ssIHVuc2lnbmVkIGNoYXIgYnVmWzI0XSk7CisKKy8qIHRyYWNrIGRhdGE6IGJ5dGUgb3JkZXIgKi8KK3ZvaWQgYWZJbml0Qnl0ZU9yZGVyIChBRmZpbGVzZXR1cCwgaW50IHRyYWNrLCBpbnQgYnl0ZU9yZGVyKTsKK2ludCBhZkdldEJ5dGVPcmRlciAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2spOworaW50IGFmU2V0VmlydHVhbEJ5dGVPcmRlciAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2ssIGludCBieXRlT3JkZXIpOworaW50IGFmR2V0VmlydHVhbEJ5dGVPcmRlciAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2spOworCisvKiB0cmFjayBkYXRhOiBudW1iZXIgb2YgY2hhbm5lbHMgKi8KK3ZvaWQgYWZJbml0Q2hhbm5lbHMgKEFGZmlsZXNldHVwLCBpbnQgdHJhY2ssIGludCBuY2hhbm5lbHMpOworaW50IGFmR2V0Q2hhbm5lbHMgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrKTsKK2ludCBhZlNldFZpcnR1YWxDaGFubmVscyAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2ssIGludCBjaGFubmVsQ291bnQpOworaW50IGFmR2V0VmlydHVhbENoYW5uZWxzIChBRmZpbGVoYW5kbGUsIGludCB0cmFjayk7Cit2b2lkIGFmU2V0Q2hhbm5lbE1hdHJpeCAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2ssIGRvdWJsZSAqbWF0cml4KTsKKworLyogdHJhY2sgZGF0YTogc2FtcGxlIGZvcm1hdCBhbmQgc2FtcGxlIHdpZHRoICovCit2b2lkIGFmSW5pdFNhbXBsZUZvcm1hdCAoQUZmaWxlc2V0dXAsIGludCB0cmFjaywgaW50IHNhbXBsZUZvcm1hdCwKKwlpbnQgc2FtcGxlV2lkdGgpOwordm9pZCBhZkdldFNhbXBsZUZvcm1hdCAoQUZmaWxlaGFuZGxlIGZpbGUsIGludCB0cmFjaywgaW50ICpzYW1wbGVGb3JtYXQsCisJaW50ICpzYW1wbGVXaWR0aCk7CitpbnQgYWZTZXRWaXJ0dWFsU2FtcGxlRm9ybWF0IChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywKKwlpbnQgc2FtcGxlRm9ybWF0LCBpbnQgc2FtcGxlV2lkdGgpOwordm9pZCBhZkdldFZpcnR1YWxTYW1wbGVGb3JtYXQgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrLAorCWludCAqc2FtcGxlRm9ybWF0LCBpbnQgKnNhbXBsZVdpZHRoKTsKKworLyogdHJhY2sgZGF0YTogc2FtcGxpbmcgcmF0ZSAqLwordm9pZCBhZkluaXRSYXRlIChBRmZpbGVzZXR1cCwgaW50IHRyYWNrLCBkb3VibGUgcmF0ZSk7Citkb3VibGUgYWZHZXRSYXRlIChBRmZpbGVoYW5kbGUsIGludCB0cmFjayk7CisKKyNpZiAwCitpbnQgYWZTZXRWaXJ0dWFsUmF0ZSAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2ssIGRvdWJsZSByYXRlKTsKK2RvdWJsZSBhZkdldFZpcnR1YWxSYXRlIChBRmZpbGVoYW5kbGUsIGludCB0cmFjayk7CisjZW5kaWYKKworLyogdHJhY2sgZGF0YTogY29tcHJlc3Npb24gKi8KK3ZvaWQgYWZJbml0Q29tcHJlc3Npb24gKEFGZmlsZXNldHVwLCBpbnQgdHJhY2ssIGludCBjb21wcmVzc2lvbik7CisjaWYgMAordm9pZCBhZkluaXRDb21wcmVzc2lvblBhcmFtcyAoQUZmaWxlc2V0dXAsIGludCB0cmFjaywgaW50IGNvbXByZXNzaW9uCisJQVVwdmxpc3QgcGFyYW1zLCBpbnQgcGFyYW1ldGVyQ291bnQpOworI2VuZGlmCisKK2ludCBhZkdldENvbXByZXNzaW9uIChBRmZpbGVoYW5kbGUsIGludCB0cmFjayk7CisjaWYgMAordm9pZCBhZkdldENvbXByZXNzaW9uUGFyYW1zIChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywgaW50ICpjb21wcmVzc2lvbiwKKwlBVXB2bGlzdCBwYXJhbXMsIGludCBwYXJhbWV0ZXJDb3VudCk7CisKK2ludCBhZlNldFZpcnR1YWxDb21wcmVzc2lvbiAoQUZmaWxlc2V0dXAsIGludCB0cmFjaywgaW50IGNvbXByZXNzaW9uKTsKK3ZvaWQgYWZTZXRWaXJ0dWFsQ29tcHJlc3Npb25QYXJhbXMgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrLCBpbnQgY29tcHJlc3Npb24sCisJQVVwdmxpc3QgcGFyYW1zLCBpbnQgcGFyYW1ldGVyQ291bnQpOworCitpbnQgYWZHZXRWaXJ0dWFsQ29tcHJlc3Npb24gKEFGZmlsZXNldHVwLCBpbnQgdHJhY2ssIGludCBjb21wcmVzc2lvbik7Cit2b2lkIGFmR2V0VmlydHVhbENvbXByZXNzaW9uUGFyYW1zIChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywgaW50ICpjb21wcmVzc2lvbiwKKwlBVXB2bGlzdCBwYXJhbXMsIGludCBwYXJhbWV0ZXJDb3VudCk7CisjZW5kaWYKKworLyogdHJhY2sgZGF0YTogcGNtIG1hcHBpbmcgKi8KK3ZvaWQgYWZJbml0UENNTWFwcGluZyAoQUZmaWxlc2V0dXAgZmlsZXNldHVwLCBpbnQgdHJhY2ssCisJZG91YmxlIHNsb3BlLCBkb3VibGUgaW50ZXJjZXB0LCBkb3VibGUgbWluQ2xpcCwgZG91YmxlIG1heENsaXApOwordm9pZCBhZkdldFBDTU1hcHBpbmcgKEFGZmlsZWhhbmRsZSBmaWxlLCBpbnQgdHJhY2ssCisJZG91YmxlICpzbG9wZSwgZG91YmxlICppbnRlcmNlcHQsIGRvdWJsZSAqbWluQ2xpcCwgZG91YmxlICptYXhDbGlwKTsKKy8qIE5PVEU6IGFmU2V0VHJhY2tQQ01NYXBwaW5nKCkgaXMgc3BlY2lhbC0taXQgZG9lcyBub3Qgc2V0IHRoZSB2aXJ0dWFsICAqLworLyogZm9ybWF0OyBpdCBjaGFuZ2VzIHdoYXQgdGhlIEFGIHRoaW5rcyB0aGUgdHJhY2sgZm9ybWF0IGlzISBCZSBjYXJlZnVsLiAqLworaW50IGFmU2V0VHJhY2tQQ01NYXBwaW5nIChBRmZpbGVoYW5kbGUgZmlsZSwgaW50IHRyYWNrLAorCWRvdWJsZSBzbG9wZSwgZG91YmxlIGludGVyY2VwdCwgZG91YmxlIG1pbkNsaXAsIGRvdWJsZSBtYXhDbGlwKTsKKy8qIE5PVEU6IGFmU2V0VmlydHVhbFBDTU1hcHBpbmcoKSBpcyBkaWZmZXJlbnQgZnJvbSBhZlNldFRyYWNrUENNTWFwcGluZygpOiAqLworLyogc2VlIGNvbW1lbnQgZm9yIGFmU2V0VHJhY2tQQ01NYXBwaW5nKCkuICovCitpbnQgYWZTZXRWaXJ0dWFsUENNTWFwcGluZyAoQUZmaWxlaGFuZGxlIGZpbGUsIGludCB0cmFjaywKKwlkb3VibGUgc2xvcGUsIGRvdWJsZSBpbnRlcmNlcHQsIGRvdWJsZSBtaW5DbGlwLCBkb3VibGUgbWF4Q2xpcCk7Cit2b2lkIGFmR2V0VmlydHVhbFBDTU1hcHBpbmcgKEFGZmlsZWhhbmRsZSBmaWxlLCBpbnQgdHJhY2ssCisJZG91YmxlICpzbG9wZSwgZG91YmxlICppbnRlcmNlcHQsIGRvdWJsZSAqbWluQ2xpcCwgZG91YmxlICptYXhDbGlwKTsKKworLyogdHJhY2sgZGF0YTogZGF0YSBvZmZzZXQgd2l0aGluIHRoZSBmaWxlICovCisvKiBpbml0aWFsaXplIGZvciByYXcgcmVhZGluZyBvbmx5ICovCit2b2lkIGFmSW5pdERhdGFPZmZzZXQoQUZmaWxlc2V0dXAsIGludCB0cmFjaywgQUZmaWxlb2Zmc2V0IG9mZnNldCk7CitBRmZpbGVvZmZzZXQgYWZHZXREYXRhT2Zmc2V0IChBRmZpbGVoYW5kbGUsIGludCB0cmFjayk7CisKKy8qIHRyYWNrIGRhdGE6IGNvdW50IG9mIGZyYW1lcyBpbiBmaWxlICovCit2b2lkIGFmSW5pdEZyYW1lQ291bnQgKEFGZmlsZXNldHVwLCBpbnQgdHJhY2ssIEFGZnJhbWVjb3VudCBmcmFtZUNvdW50KTsKK0FGZnJhbWVjb3VudCBhZkdldEZyYW1lQ291bnQgKEFGZmlsZWhhbmRsZSBmaWxlLCBpbnQgdHJhY2spOworCisvKiBsb29wIG9wZXJhdGlvbnMgKi8KK3ZvaWQgYWZJbml0TG9vcElEcyAoQUZmaWxlc2V0dXAsIGludCBpbnN0aWQsIGNvbnN0IGludCAqaWRzLCBpbnQgbmlkcyk7CitpbnQgYWZHZXRMb29wSURzIChBRmZpbGVoYW5kbGUsIGludCBpbnN0aWQsIGludCBsb29waWRzW10pOwordm9pZCBhZlNldExvb3BNb2RlIChBRmZpbGVoYW5kbGUsIGludCBpbnN0aWQsIGludCBsb29wLCBpbnQgbW9kZSk7CitpbnQgYWZHZXRMb29wTW9kZSAoQUZmaWxlaGFuZGxlLCBpbnQgaW5zdGlkLCBpbnQgbG9vcGlkKTsKK2ludCBhZlNldExvb3BDb3VudCAoQUZmaWxlaGFuZGxlLCBpbnQgaW5zdGlkLCBpbnQgbG9vcCwgaW50IGNvdW50KTsKK2ludCBhZkdldExvb3BDb3VudCAoQUZmaWxlaGFuZGxlLCBpbnQgaW5zdGlkLCBpbnQgbG9vcGlkKTsKK3ZvaWQgYWZTZXRMb29wU3RhcnQgKEFGZmlsZWhhbmRsZSwgaW50IGluc3RpZCwgaW50IGxvb3BpZCwgaW50IG1hcmtlcmlkKTsKK2ludCBhZkdldExvb3BTdGFydCAoQUZmaWxlaGFuZGxlLCBpbnQgaW5zdGlkLCBpbnQgbG9vcGlkKTsKK3ZvaWQgYWZTZXRMb29wRW5kIChBRmZpbGVoYW5kbGUsIGludCBpbnN0aWQsIGludCBsb29waWQsIGludCBtYXJrZXJpZCk7CitpbnQgYWZHZXRMb29wRW5kIChBRmZpbGVoYW5kbGUsIGludCBpbnN0aWQsIGludCBsb29waWQpOworCitpbnQgYWZTZXRMb29wU3RhcnRGcmFtZSAoQUZmaWxlaGFuZGxlLCBpbnQgaW5zdGlkLCBpbnQgbG9vcCwKKwlBRmZyYW1lY291bnQgc3RhcnRGcmFtZSk7CitBRmZyYW1lY291bnQgYWZHZXRMb29wU3RhcnRGcmFtZSAoQUZmaWxlaGFuZGxlLCBpbnQgaW5zdGlkLCBpbnQgbG9vcCk7CitpbnQgYWZTZXRMb29wRW5kRnJhbWUgKEFGZmlsZWhhbmRsZSwgaW50IGluc3RpZCwgaW50IGxvb3AsCisJQUZmcmFtZWNvdW50IHN0YXJ0RnJhbWUpOworQUZmcmFtZWNvdW50IGFmR2V0TG9vcEVuZEZyYW1lIChBRmZpbGVoYW5kbGUsIGludCBpbnN0aWQsIGludCBsb29wKTsKKwordm9pZCBhZlNldExvb3BUcmFjayAoQUZmaWxlaGFuZGxlLCBpbnQgaW5zdGlkLCBpbnQgbG9vcGlkLCBpbnQgdHJhY2tpZCk7CitpbnQgYWZHZXRMb29wVHJhY2sgKEFGZmlsZWhhbmRsZSwgaW50IGluc3RpZCwgaW50IGxvb3BpZCk7CisKKy8qIG1hcmtlciBvcGVyYXRpb25zICovCit2b2lkIGFmSW5pdE1hcmtJRHMgKEFGZmlsZXNldHVwLCBpbnQgdHJhY2tpZCwgY29uc3QgaW50ICppZHMsIGludCBuaWRzKTsKK2ludCBhZkdldE1hcmtJRHMgKEFGZmlsZWhhbmRsZSBmaWxlLCBpbnQgdHJhY2tpZCwgaW50IG1hcmtpZHNbXSk7Cit2b2lkIGFmU2V0TWFya1Bvc2l0aW9uIChBRmZpbGVoYW5kbGUgZmlsZSwgaW50IHRyYWNraWQsIGludCBtYXJraWQsCisJQUZmcmFtZWNvdW50IG1hcmtwb3MpOworQUZmcmFtZWNvdW50IGFmR2V0TWFya1Bvc2l0aW9uIChBRmZpbGVoYW5kbGUgZmlsZSwgaW50IHRyYWNraWQsIGludCBtYXJraWQpOwordm9pZCBhZkluaXRNYXJrTmFtZSAoQUZmaWxlc2V0dXAsIGludCB0cmFja2lkLCBpbnQgbWFya2VyLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgYWZJbml0TWFya0NvbW1lbnQgKEFGZmlsZXNldHVwLCBpbnQgdHJhY2tpZCwgaW50IG1hcmtlciwKKwljb25zdCBjaGFyICpjb21tZW50KTsKK2NoYXIgKmFmR2V0TWFya05hbWUgKEFGZmlsZWhhbmRsZSBmaWxlLCBpbnQgdHJhY2tpZCwgaW50IG1hcmtpZCk7CitjaGFyICphZkdldE1hcmtDb21tZW50IChBRmZpbGVoYW5kbGUgZmlsZSwgaW50IHRyYWNraWQsIGludCBtYXJraWQpOworCisvKiBpbnN0cnVtZW50IG9wZXJhdGlvbnMgKi8KK3ZvaWQgYWZJbml0SW5zdElEcyAoQUZmaWxlc2V0dXAsIGNvbnN0IGludCAqaWRzLCBpbnQgbmlkcyk7CitpbnQgYWZHZXRJbnN0SURzIChBRmZpbGVoYW5kbGUgZmlsZSwgaW50ICppbnN0aWRzKTsKK3ZvaWQgYWZHZXRJbnN0UGFyYW1zIChBRmZpbGVoYW5kbGUgZmlsZSwgaW50IGluc3RpZCwgQVVwdmxpc3QgcHZsaXN0LAorCWludCBucGFyYW1zKTsKK3ZvaWQgYWZTZXRJbnN0UGFyYW1zIChBRmZpbGVoYW5kbGUgZmlsZSwgaW50IGluc3RpZCwgQVVwdmxpc3QgcHZsaXN0LAorCWludCBucGFyYW1zKTsKK2xvbmcgYWZHZXRJbnN0UGFyYW1Mb25nIChBRmZpbGVoYW5kbGUgZmlsZSwgaW50IGluc3RpZCwgaW50IHBhcmFtKTsKK3ZvaWQgYWZTZXRJbnN0UGFyYW1Mb25nIChBRmZpbGVoYW5kbGUgZmlsZSwgaW50IGluc3RpZCwgaW50IHBhcmFtLCBsb25nIHZhbHVlKTsKKworLyogbWlzY2VsbGFuZW91cyBkYXRhIG9wZXJhdGlvbnMgKi8KK3ZvaWQgYWZJbml0TWlzY0lEcyAoQUZmaWxlc2V0dXAsIGNvbnN0IGludCAqaWRzLCBpbnQgbmlkcyk7CitpbnQgYWZHZXRNaXNjSURzIChBRmZpbGVoYW5kbGUsIGludCAqaWRzKTsKK3ZvaWQgYWZJbml0TWlzY1R5cGUgKEFGZmlsZXNldHVwLCBpbnQgbWlzY2VsbGFuZW91c2lkLCBpbnQgdHlwZSk7CitpbnQgYWZHZXRNaXNjVHlwZSAoQUZmaWxlaGFuZGxlLCBpbnQgbWlzY2VsbGFuZW91c2lkKTsKK3ZvaWQgYWZJbml0TWlzY1NpemUgKEFGZmlsZXNldHVwLCBpbnQgbWlzY2VsbGFuZW91c2lkLCBpbnQgc2l6ZSk7CitpbnQgYWZHZXRNaXNjU2l6ZSAoQUZmaWxlaGFuZGxlLCBpbnQgbWlzY2VsbGFuZW91c2lkKTsKK2ludCBhZldyaXRlTWlzYyAoQUZmaWxlaGFuZGxlLCBpbnQgbWlzY2VsbGFuZW91c2lkLCBjb25zdCB2b2lkICpidWYsIGludCBieXRlcyk7CitpbnQgYWZSZWFkTWlzYyAoQUZmaWxlaGFuZGxlLCBpbnQgbWlzY2VsbGFuZW91c2lkLCB2b2lkICpidWYsIGludCBieXRlcyk7CitpbnQgYWZTZWVrTWlzYyAoQUZmaWxlaGFuZGxlLCBpbnQgbWlzY2VsbGFuZW91c2lkLCBpbnQgb2Zmc2V0KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEFVRElPRklMRV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2F1cHZsaXN0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2F1cHZsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4NmY0MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXVwdmxpc3QuaApAQCAtMCwwICsxLDYxIEBACisvKgorCUF1ZGlvIEZpbGUgTGlicmFyeQorCUNvcHlyaWdodCAoQykgMTk5OC0yMDAwLCBNaWNoYWVsIFBydWV0dCA8bWljaGFlbEA2OGsub3JnPgorCisJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisJdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKwlNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorCUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKwlMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorCUJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQS4KKyovCisKKy8qCisJYXVwdmxpc3QuaAorCisJVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbnRlcmZhY2UgdG8gdGhlIHBhcmFtZXRlciB2YWx1ZSBsaXN0IGRhdGEKKwlzdHJ1Y3R1cmVzIGFuZCByb3V0aW5lcy4KKyovCisKKyNpZm5kZWYgQVVQVkxJU1RfSAorI2RlZmluZSBBVVBWTElTVF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKK2VudW0KK3sKKwlBVV9QVlRZUEVfTE9ORyA9IDEsCisJQVVfUFZUWVBFX0RPVUJMRSA9IDIsCisJQVVfUFZUWVBFX1BUUiA9IDMKK307CisKK3R5cGVkZWYgc3RydWN0IF9BVXB2bGlzdCAqQVVwdmxpc3Q7CisKKyNkZWZpbmUgQVVfTlVMTF9QVkxJU1QgKChzdHJ1Y3QgX0FVcHZsaXN0ICopIDApCisKK0FVcHZsaXN0IEFVcHZuZXcgKGludCBtYXhJdGVtcyk7CitpbnQgQVVwdmdldG1heGl0ZW1zIChBVXB2bGlzdCk7CitpbnQgQVVwdmZyZWUgKEFVcHZsaXN0KTsKK2ludCBBVXB2c2V0cGFyYW0gKEFVcHZsaXN0LCBpbnQgaXRlbSwgaW50IHBhcmFtKTsKK2ludCBBVXB2c2V0dmFsdHlwZSAoQVVwdmxpc3QsIGludCBpdGVtLCBpbnQgdHlwZSk7CitpbnQgQVVwdnNldHZhbCAoQVVwdmxpc3QsIGludCBpdGVtLCB2b2lkICp2YWwpOworaW50IEFVcHZnZXRwYXJhbSAoQVVwdmxpc3QsIGludCBpdGVtLCBpbnQgKnBhcmFtKTsKK2ludCBBVXB2Z2V0dmFsdHlwZSAoQVVwdmxpc3QsIGludCBpdGVtLCBpbnQgKnR5cGUpOworaW50IEFVcHZnZXR2YWwgKEFVcHZsaXN0LCBpbnQgaXRlbSwgdm9pZCAqdmFsKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIEFVUFZMSVNUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYnl0ZXN3YXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYnl0ZXN3YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjFkNGRkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ieXRlc3dhcC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfQllURVNXQVBfSAorI2RlZmluZSBfQllURVNXQVBfSAkxCisKKy8qIEdldCB0aGUgbWFjaGluZSBzcGVjaWZpYywgb3B0aW1pemVkIGRlZmluaXRpb25zLiAgKi8KKyNpbmNsdWRlIDxiaXRzL2J5dGVzd2FwLmg+CisKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBtdXN0IGFsbCBiZSBtYWNyb3Mgc2luY2Ugb3RoZXJ3aXNlIHNvbWUKKyAgIG9mIHRoZSBwb3NzaWJsZSBvcHRpbWl6YXRpb25zIGFyZSBub3QgcG9zc2libGUuICAqLworCisvKiBSZXR1cm4gYSB2YWx1ZSB3aXRoIGFsbCBieXRlcyBpbiB0aGUgMTYgYml0IGFyZ3VtZW50IHN3YXBwZWQuICAqLworI2RlZmluZSBic3dhcF8xNih4KSBfX2Jzd2FwXzE2ICh4KQorCisvKiBSZXR1cm4gYSB2YWx1ZSB3aXRoIGFsbCBieXRlcyBpbiB0aGUgMzIgYml0IGFyZ3VtZW50IHN3YXBwZWQuICAqLworI2RlZmluZSBic3dhcF8zMih4KSBfX2Jzd2FwXzMyICh4KQorCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyCisvKiBSZXR1cm4gYSB2YWx1ZSB3aXRoIGFsbCBieXRlcyBpbiB0aGUgNjQgYml0IGFyZ3VtZW50IHN3YXBwZWQuICAqLworIyBkZWZpbmUgYnN3YXBfNjQoeCkgX19ic3dhcF82NCAoeCkKKyNlbmRpZgorCisjZW5kaWYgLyogYnl0ZXN3YXAuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9jb21wbGV4LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2NvbXBsZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmZlMGUxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9jb21wbGV4LmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwNiwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCUlTTyBDOTk6ICA3LjMgQ29tcGxleCBhcml0aG1ldGljCTxjb21wbGV4Lmg+CisgKi8KKworI2lmbmRlZiBfQ09NUExFWF9ICisjZGVmaW5lIF9DT01QTEVYX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogR2V0IGdlbmVyYWwgYW5kIElTTyBDOTkgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLworI2luY2x1ZGUgPGJpdHMvbWF0aGRlZi5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFdlIG1pZ2h0IG5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yIG1vcmUgY29tcGlsZXJzIGhlcmUuICBCdXQgc2luY2UgSVNPCisgICBDOTkgaXMgb3V0IGhvcGVmdWxseSBhbGwgbWFpbnRhaW5lZCBjb21waWxlcnMgd2lsbCBzb29uIHByb3ZpZGUgdGhlIGRhdGEKKyAgIHR5cGVzIGBmbG9hdCBjb21wbGV4JyBhbmQgYGRvdWJsZSBjb21wbGV4Jy4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMiwgNykgJiYgIV9fR05VQ19QUkVSRVEgKDIsIDk3KQorIyBkZWZpbmUgX0NvbXBsZXggX19jb21wbGV4X18KKyNlbmRpZgorCisjZGVmaW5lIGNvbXBsZXgJCV9Db21wbGV4CisKKy8qIE5hcnJvd2VzdCBpbWFnaW5hcnkgdW5pdC4gIFRoaXMgZGVwZW5kcyBvbiB0aGUgZmxvYXRpbmctcG9pbnQKKyAgIGV2YWx1YXRpb24gbWV0aG9kLgorICAgWFhYIFRoaXMgcHJvYmFibHkgaGFzIHRvIGdvIGludG8gYSBnY2MgcmVsYXRlZCBmaWxlLiAgKi8KKyNkZWZpbmUgX0NvbXBsZXhfSQkoX19leHRlbnNpb25fXyAxLjBpRikKKworLyogQW5vdGhlciBtb3JlIGRlc2NyaXB0aXZlIG5hbWUgaXMgYEknLgorICAgWFhYIE9uY2Ugd2UgaGF2ZSB0aGUgaW1hZ2luYXJ5IHN1cHBvcnQgc3dpdGNoIHRoaXMgdG8gX0ltYWdpbmFyeV9JLiAgKi8KKyN1bmRlZiBJCisjZGVmaW5lIEkgX0NvbXBsZXhfSQorCisvKiBUaGUgZmlsZSA8Yml0cy9jbWF0aGNhbGxzLmg+IGNvbnRhaW5zIHRoZSBwcm90b3R5cGVzIGZvciBhbGwgdGhlCisgICBhY3R1YWwgbWF0aCBmdW5jdGlvbnMuICBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgZm9yIHRob3NlIHByb3RvdHlwZXMsCisgICBzbyB3ZSBjYW4gZWFzaWx5IGRlY2xhcmUgZWFjaCBmdW5jdGlvbiBhcyBib3RoIGBuYW1lJyBhbmQgYF9fbmFtZScsCisgICBhbmQgY2FuIGRlY2xhcmUgdGhlIGZsb2F0IHZlcnNpb25zIGBuYW1lZicgYW5kIGBfX25hbWVmJy4gICovCisKKyNkZWZpbmUgX19NQVRIQ0FMTChmdW5jdGlvbiwgYXJncykJXAorICBfX01BVEhERUNMIChfTWRvdWJsZV9jb21wbGV4XyxmdW5jdGlvbiwgYXJncykKKyNkZWZpbmUgX19NQVRIREVDTCh0eXBlLCBmdW5jdGlvbiwgYXJncykgXAorICBfX01BVEhERUNMXzEodHlwZSwgZnVuY3Rpb24sIGFyZ3MpOyBcCisgIF9fTUFUSERFQ0xfMSh0eXBlLCBfX0NPTkNBVChfXyxmdW5jdGlvbiksIGFyZ3MpCisjZGVmaW5lIF9fTUFUSERFQ0xfMSh0eXBlLCBmdW5jdGlvbiwgYXJncykgXAorICBleHRlcm4gdHlwZSBfX01BVEhfUFJFQ05BTUUoZnVuY3Rpb24pIGFyZ3MgX19USFJPVworCisjZGVmaW5lIF9NZG91YmxlXyAJCWRvdWJsZQorI2RlZmluZSBfX01BVEhfUFJFQ05BTUUobmFtZSkJbmFtZQorI2luY2x1ZGUgPGJpdHMvY21hdGhjYWxscy5oPgorI3VuZGVmCV9NZG91YmxlXworI3VuZGVmCV9fTUFUSF9QUkVDTkFNRQorCisvKiBOb3cgdGhlIGZsb2F0IHZlcnNpb25zLiAgKi8KKyNpZm5kZWYgX01mbG9hdF8KKyMgZGVmaW5lIF9NZmxvYXRfCQlmbG9hdAorI2VuZGlmCisjZGVmaW5lIF9NZG91YmxlXyAJCV9NZmxvYXRfCisjaWZkZWYgX19TVERDX18KKyMgZGVmaW5lIF9fTUFUSF9QUkVDTkFNRShuYW1lKQluYW1lIyNmCisjZWxzZQorIyBkZWZpbmUgX19NQVRIX1BSRUNOQU1FKG5hbWUpCW5hbWUvKiovZgorI2VuZGlmCisjaW5jbHVkZSA8Yml0cy9jbWF0aGNhbGxzLmg+CisjdW5kZWYJX01kb3VibGVfCisjdW5kZWYJX19NQVRIX1BSRUNOQU1FCisKKy8qIEFuZCB0aGUgbG9uZyBkb3VibGUgdmVyc2lvbnMuICBJdCBpcyBub24tY3JpdGljYWwgdG8gZGVmaW5lIHRoZW0KKyAgIGhlcmUgdW5jb25kaXRpb25hbGx5IHNpbmNlIGBsb25nIGRvdWJsZScgaXMgcmVxdWlyZWQgaW4gSVNPIEM5OS4gICovCisjaWYgKF9fU1REQ19fIC0gMCB8fCBfX0dOVUNfXyAtIDApIFwKKyAgICAmJiAoIShkZWZpbmVkIF9fTk9fTE9OR19ET1VCTEVfTUFUSCAmJiBkZWZpbmVkIF9MSUJDKSBcCisJfHwgZGVmaW5lZCBfX0xEQkxfQ09NUEFUKQorIyBpZiBkZWZpbmVkIF9fTERCTF9DT01QQVQgfHwgZGVmaW5lZCBfX05PX0xPTkdfRE9VQkxFX01BVEgKKyMgIHVuZGVmIF9fTUFUSERFQ0xfMQorIyAgZGVmaW5lIF9fTUFUSERFQ0xfMSh0eXBlLCBmdW5jdGlvbiwgYXJncykgXAorICBleHRlcm4gdHlwZSBfX1JFRElSRUNUX05USChfX01BVEhfUFJFQ05BTUUoZnVuY3Rpb24pLCBhcmdzLCBmdW5jdGlvbikKKyMgZW5kaWYKKworIyBpZm5kZWYgX01sb25nX2RvdWJsZV8KKyMgIGRlZmluZSBfTWxvbmdfZG91YmxlXwlsb25nIGRvdWJsZQorIyBlbmRpZgorIyBkZWZpbmUgX01kb3VibGVfIAkJX01sb25nX2RvdWJsZV8KKyMgaWZkZWYgX19TVERDX18KKyMgIGRlZmluZSBfX01BVEhfUFJFQ05BTUUobmFtZSkJbmFtZSMjbAorIyBlbHNlCisjICBkZWZpbmUgX19NQVRIX1BSRUNOQU1FKG5hbWUpCW5hbWUvKiovbAorIyBlbmRpZgorIyBpbmNsdWRlIDxiaXRzL2NtYXRoY2FsbHMuaD4KKyNlbmRpZgorI3VuZGVmCV9NZG91YmxlXworI3VuZGVmCV9fTUFUSF9QUkVDTkFNRQorI3VuZGVmCV9fTUFUSERFQ0xfMQorI3VuZGVmCV9fTUFUSERFQ0wKKyN1bmRlZglfX01BVEhDQUxMCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBjb21wbGV4LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Bpby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9jcGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlMzI3NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Bpby5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qIEV4dGVuZGVkIGNwaW8gZm9ybWF0IGZyb20gUE9TSVguMS4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgTk9URTogVGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdGhpcyBmaWxlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgR05VIGNwaW8uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9DUElPX0gKKyNkZWZpbmUgX0NQSU9fSCAxCisKKy8qIEEgY3BpbyBhcmNoaXZlIGNvbnNpc3RzIG9mIGEgc2VxdWVuY2Ugb2YgZmlsZXMuCisgICBFYWNoIGZpbGUgaGFzIGEgNzYgYnl0ZSBoZWFkZXIsCisgICBhIHZhcmlhYmxlIGxlbmd0aCwgTlVMIHRlcm1pbmF0ZWQgZmlsZW5hbWUsCisgICBhbmQgdmFyaWFibGUgbGVuZ3RoIGZpbGUgZGF0YS4KKyAgIEEgaGVhZGVyIGZvciBhIGZpbGVuYW1lICJUUkFJTEVSISEhIiBpbmRpY2F0ZXMgdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZS4gICovCisKKy8qIEFsbCB0aGUgZmllbGRzIGluIHRoZSBoZWFkZXIgYXJlIElTTyA2NDYgKGFwcHJveGltYXRlbHkgQVNDSUkpIHN0cmluZ3MKKyAgIG9mIG9jdGFsIG51bWJlcnMsIGxlZnQgcGFkZGVkLCBub3QgTlVMIHRlcm1pbmF0ZWQuCisKKyAgIEZpZWxkIE5hbWUJTGVuZ3RoIGluIEJ5dGVzCU5vdGVzCisgICBjX21hZ2ljCTYJCW11c3QgYmUgIjA3MDcwNyIKKyAgIGNfZGV2CTYKKyAgIGNfaW5vCTYKKyAgIGNfbW9kZQk2CQlzZWUgYmVsb3cgZm9yIHZhbHVlCisgICBjX3VpZAk2CisgICBjX2dpZAk2CisgICBjX25saW5rCTYKKyAgIGNfcmRldgk2CQlvbmx5IHZhbGlkIGZvciBjaHIgYW5kIGJsayBzcGVjaWFsIGZpbGVzCisgICBjX210aW1lCTExCisgICBjX25hbWVzaXplCTYJCWNvdW50IGluY2x1ZGVzIHRlcm1pbmF0aW5nIE5VTCBpbiBwYXRobmFtZQorICAgY19maWxlc2l6ZQkxMQkJbXVzdCBiZSAwIGZvciBGSUZPcyBhbmQgZGlyZWN0b3JpZXMgICovCisKKy8qIFZhbHVlIGZvciB0aGUgZmllbGQgYGNfbWFnaWMnLiAgKi8KKyNkZWZpbmUgTUFHSUMJIjA3MDcwNyIKKworLyogVmFsdWVzIGZvciBjX21vZGUsIE9SJ2QgdG9nZXRoZXI6ICovCisKKyNkZWZpbmUgQ19JUlVTUgkJMDAwNDAwCisjZGVmaW5lIENfSVdVU1IJCTAwMDIwMAorI2RlZmluZSBDX0lYVVNSCQkwMDAxMDAKKyNkZWZpbmUgQ19JUkdSUAkJMDAwMDQwCisjZGVmaW5lIENfSVdHUlAJCTAwMDAyMAorI2RlZmluZSBDX0lYR1JQCQkwMDAwMTAKKyNkZWZpbmUgQ19JUk9USAkJMDAwMDA0CisjZGVmaW5lIENfSVdPVEgJCTAwMDAwMgorI2RlZmluZSBDX0lYT1RICQkwMDAwMDEKKworI2RlZmluZSBDX0lTVUlECQkwMDQwMDAKKyNkZWZpbmUgQ19JU0dJRAkJMDAyMDAwCisjZGVmaW5lIENfSVNWVFgJCTAwMTAwMAorCisjZGVmaW5lIENfSVNCTEsJCTA2MDAwMAorI2RlZmluZSBDX0lTQ0hSCQkwMjAwMDAKKyNkZWZpbmUgQ19JU0RJUgkJMDQwMDAwCisjZGVmaW5lIENfSVNGSUZPCTAxMDAwMAorI2RlZmluZSBDX0lTU09DSwkwMTQwMDAwCisjZGVmaW5lIENfSVNMTksJCTAxMjAwMDAKKyNkZWZpbmUgQ19JU0NURwkJMDExMDAwMAorI2RlZmluZSBDX0lTUkVHCQkwMTAwMDAwCisKKyNlbmRpZiAvKiBjcGlvLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3J5cHQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3J5cHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2MxYzM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9jcnlwdC5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBVRkMtY3J5cHQ6IHVsdHJhIGZhc3QgY3J5cHQoMykgaW1wbGVtZW50YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEsOTIsOTMsOTYsOTcsOTgsMjAwMCwyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAqIDAyMTExLTEzMDcgVVNBLgorICoKKyAqIEAoIyljcnlwdC5oCTEuNSAxMi8yMC85NgorICoKKyAqLworCisjaWZuZGVmIF9DUllQVF9ICisjZGVmaW5lIF9DUllQVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogRW5jcnlwdCBhdCBtb3N0IDggY2hhcmFjdGVycyBmcm9tIEtFWSB1c2luZyBzYWx0IHRvIHBlcnR1cmIgREVTLiAgKi8KK2V4dGVybiBjaGFyICpjcnlwdCAoX19jb25zdCBjaGFyICpfX2tleSwgX19jb25zdCBjaGFyICpfX3NhbHQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBTZXR1cCBERVMgdGFibGVzIGFjY29yZGluZyBLRVkuICAqLworZXh0ZXJuIHZvaWQgc2V0a2V5IChfX2NvbnN0IGNoYXIgKl9fa2V5KSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogRW5jcnlwdCBkYXRhIGluIEJMT0NLIGluIHBsYWNlIGlmIEVERkxBRyBpcyB6ZXJvOyBvdGhlcndpc2UgZGVjcnlwdAorICAgYmxvY2sgaW4gcGxhY2UuICAqLworZXh0ZXJuIHZvaWQgZW5jcnlwdCAoY2hhciAqX19saWJjX2Jsb2NrLCBpbnQgX19lZGZsYWcpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjaWZkZWYgX19VU0VfR05VCisvKiBSZWVudHJhbnQgdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZS4gIFRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50CisgICBwb2ludHMgdG8gYSBzdHJ1Y3R1cmUgd2hlcmUgdGhlIHJlc3VsdHMgYXJlIHBsYWNlZCBpbi4gICovCitzdHJ1Y3QgY3J5cHRfZGF0YQorICB7CisgICAgY2hhciBrZXlzY2hlZFsxNiAqIDhdOworICAgIGNoYXIgc2IwWzMyNzY4XTsKKyAgICBjaGFyIHNiMVszMjc2OF07CisgICAgY2hhciBzYjJbMzI3NjhdOworICAgIGNoYXIgc2IzWzMyNzY4XTsKKyAgICAvKiBlbmQtb2YtYWxpZ21lbnQtY3JpdGljYWwtZGF0YSAqLworICAgIGNoYXIgY3J5cHRfM19idWZbMTRdOworICAgIGNoYXIgY3VycmVudF9zYWx0WzJdOworICAgIGxvbmcgaW50IGN1cnJlbnRfc2FsdGJpdHM7CisgICAgaW50ICBkaXJlY3Rpb24sIGluaXRpYWxpemVkOworICB9OworCitleHRlcm4gY2hhciAqY3J5cHRfciAoX19jb25zdCBjaGFyICpfX2tleSwgX19jb25zdCBjaGFyICpfX3NhbHQsCisJCSAgICAgIHN0cnVjdCBjcnlwdF9kYXRhICogX19yZXN0cmljdCBfX2RhdGEpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMiwgMykpOworCitleHRlcm4gdm9pZCBzZXRrZXlfciAoX19jb25zdCBjaGFyICpfX2tleSwKKwkJICAgICAgc3RydWN0IGNyeXB0X2RhdGEgKiBfX3Jlc3RyaWN0IF9fZGF0YSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKK2V4dGVybiB2b2lkIGVuY3J5cHRfciAoY2hhciAqX19saWJjX2Jsb2NrLCBpbnQgX19lZGZsYWcsCisJCSAgICAgICBzdHJ1Y3QgY3J5cHRfZGF0YSAqIF9fcmVzdHJpY3QgX19kYXRhKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDMpKTsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogY3J5cHQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9jdHlwZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9jdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMzA1MmEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2N0eXBlLmgKQEAgLTAsMCArMSwzNTEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSw5Miw5Myw5NSw5Niw5Nyw5OCw5OSwyMDAxLDIwMDIsMjAwNCwyMDA3LDIwMDgsMjAwOSwyMDExCisJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglJU08gQzk5IFN0YW5kYXJkIDcuNDogQ2hhcmFjdGVyIGhhbmRsaW5nCTxjdHlwZS5oPgorICovCisKKyNpZm5kZWYJX0NUWVBFX0gKKyNkZWZpbmUJX0NUWVBFX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2lmbmRlZiBfSVNiaXQKKy8qIFRoZXNlIGFyZSBhbGwgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBjaGFyYWN0ZXJzLgorICAgSWYgdGhlcmUgZ2V0IHRvIGJlIG1vcmUgdGhhbiAxNiBkaXN0aW5jdCBjaGFyYWN0ZXJpc3RpY3MsCisgICBtYW55IHRoaW5ncyBtdXN0IGJlIGNoYW5nZWQgdGhhdCB1c2UgYHVuc2lnbmVkIHNob3J0IGludCdzLgorCisgICBUaGUgY2hhcmFjdGVyaXN0aWNzIGFyZSBzdG9yZWQgYWx3YXlzIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAoYmlnCisgICBlbmRpYW4pLiAgV2UgZGVmaW5lIHRoZSBiaXQgdmFsdWUgaW50ZXJwcmV0YXRpb25zIGhlcmUgZGVwZW5kZW50IG9uIHRoZQorICAgbWFjaGluZSdzIGJ5dGUgb3JkZXIuICAqLworCisjIGluY2x1ZGUgPGVuZGlhbi5oPgorIyBpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisjICBkZWZpbmUgX0lTYml0KGJpdCkJKDEgPDwgKGJpdCkpCisjIGVsc2UgLyogX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTiAqLworIyAgZGVmaW5lIF9JU2JpdChiaXQpCSgoYml0KSA8IDggPyAoKDEgPDwgKGJpdCkpIDw8IDgpIDogKCgxIDw8IChiaXQpKSA+PiA4KSkKKyMgZW5kaWYKKworZW51bQoreworICBfSVN1cHBlciA9IF9JU2JpdCAoMCksCS8qIFVQUEVSQ0FTRS4gICovCisgIF9JU2xvd2VyID0gX0lTYml0ICgxKSwJLyogbG93ZXJjYXNlLiAgKi8KKyAgX0lTYWxwaGEgPSBfSVNiaXQgKDIpLAkvKiBBbHBoYWJldGljLiAgKi8KKyAgX0lTZGlnaXQgPSBfSVNiaXQgKDMpLAkvKiBOdW1lcmljLiAgKi8KKyAgX0lTeGRpZ2l0ID0gX0lTYml0ICg0KSwJLyogSGV4YWRlY2ltYWwgbnVtZXJpYy4gICovCisgIF9JU3NwYWNlID0gX0lTYml0ICg1KSwJLyogV2hpdGVzcGFjZS4gICovCisgIF9JU3ByaW50ID0gX0lTYml0ICg2KSwJLyogUHJpbnRpbmcuICAqLworICBfSVNncmFwaCA9IF9JU2JpdCAoNyksCS8qIEdyYXBoaWNhbC4gICovCisgIF9JU2JsYW5rID0gX0lTYml0ICg4KSwJLyogQmxhbmsgKHVzdWFsbHkgU1BDIGFuZCBUQUIpLiAgKi8KKyAgX0lTY250cmwgPSBfSVNiaXQgKDkpLAkvKiBDb250cm9sIGNoYXJhY3Rlci4gICovCisgIF9JU3B1bmN0ID0gX0lTYml0ICgxMCksCS8qIFB1bmN0dWF0aW9uLiAgKi8KKyAgX0lTYWxudW0gPSBfSVNiaXQgKDExKQkvKiBBbHBoYW51bWVyaWMuICAqLworfTsKKyNlbmRpZiAvKiAhIF9JU2JpdCAgKi8KKworLyogVGhlc2UgYXJlIGRlZmluZWQgaW4gY3R5cGUtaW5mby5jLgorICAgVGhlIGRlY2xhcmF0aW9ucyBoZXJlIG11c3QgbWF0Y2ggdGhvc2UgaW4gbG9jYWxlaW5mby5oLgorCisgICBJbiB0aGUgdGhyZWFkLXNwZWNpZmljIGxvY2FsZSBtb2RlbCAoc2VlIGB1c2Vsb2NhbGUnIGluIDxsb2NhbGUuaD4pCisgICB3ZSBjYW5ub3QgdXNlIGdsb2JhbCB2YXJpYWJsZXMgZm9yIHRoZXNlIGFzIHdhcyBkb25lIGluIHRoZSBwYXN0LgorICAgSW5zdGVhZCwgdGhlIGZvbGxvd2luZyBhY2Nlc3NvciBmdW5jdGlvbnMgcmV0dXJuIHRoZSBhZGRyZXNzIG9mCisgICBlYWNoIHZhcmlhYmxlLCB3aGljaCBpcyBsb2NhbCB0byB0aGUgY3VycmVudCB0aHJlYWQgaWYgbXVsdGl0aHJlYWRlZC4KKworICAgVGhlc2UgcG9pbnQgaW50byBhcnJheXMgb2YgMzg0LCBzbyB0aGV5IGNhbiBiZSBpbmRleGVkIGJ5IGFueSBgdW5zaWduZWQKKyAgIGNoYXInIHZhbHVlIFswLDI1NV07IGJ5IEVPRiAoLTEpOyBvciBieSBhbnkgYHNpZ25lZCBjaGFyJyB2YWx1ZQorICAgWy0xMjgsLTEpLiAgSVNPIEMgcmVxdWlyZXMgdGhhdCB0aGUgY3R5cGUgZnVuY3Rpb25zIHdvcmsgZm9yIGB1bnNpZ25lZAorICAgY2hhcicgdmFsdWVzIGFuZCBmb3IgRU9GOyB3ZSBhbHNvIHN1cHBvcnQgbmVnYXRpdmUgYHNpZ25lZCBjaGFyJyB2YWx1ZXMKKyAgIGZvciBicm9rZW4gb2xkIHByb2dyYW1zLiAgVGhlIGNhc2UgY29udmVyc2lvbiBhcnJheXMgYXJlIG9mIGBpbnQncworICAgcmF0aGVyIHRoYW4gYHVuc2lnbmVkIGNoYXIncyBiZWNhdXNlIHRvbG93ZXIgKEVPRikgbXVzdCBiZSBFT0YsIHdoaWNoCisgICBkb2Vzbid0IGZpdCBpbnRvIGFuIGB1bnNpZ25lZCBjaGFyJy4gIEJ1dCB0b2RheSBtb3JlIGltcG9ydGFudCBpcyB0aGF0CisgICB0aGUgYXJyYXlzIGFyZSBhbHNvIHVzZWQgZm9yIG11bHRpLWJ5dGUgY2hhcmFjdGVyIHNldHMuICAqLworZXh0ZXJuIF9fY29uc3QgdW5zaWduZWQgc2hvcnQgaW50ICoqX19jdHlwZV9iX2xvYyAodm9pZCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdCkpOworZXh0ZXJuIF9fY29uc3QgX19pbnQzMl90ICoqX19jdHlwZV90b2xvd2VyX2xvYyAodm9pZCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdCkpOworZXh0ZXJuIF9fY29uc3QgX19pbnQzMl90ICoqX19jdHlwZV90b3VwcGVyX2xvYyAodm9pZCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdCkpOworCisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKyMgZGVmaW5lIF9faXNjdHlwZShjLCB0eXBlKSBcCisgICgoKl9fY3R5cGVfYl9sb2MgKCkpWyhpbnQpIChjKV0gJiAodW5zaWduZWQgc2hvcnQgaW50KSB0eXBlKQorI2VsaWYgZGVmaW5lZCBfX1VTRV9FWFRFUk5fSU5MSU5FUworIyBkZWZpbmUgX19pc2N0eXBlX2YodHlwZSkgXAorICBfX2V4dGVybl9pbmxpbmUgaW50CQkJCQkJCSAgICAgIFwKKyAgaXMjI3R5cGUgKGludCBfX2MpIF9fVEhST1cJCQkJCQkgICAgICBcCisgIHsJCQkJCQkJCQkgICAgICBcCisgICAgcmV0dXJuICgqX19jdHlwZV9iX2xvYyAoKSlbKGludCkgKF9fYyldICYgKHVuc2lnbmVkIHNob3J0IGludCkgX0lTIyN0eXBlOyBcCisgIH0KKyNlbmRpZgorCisjZGVmaW5lCV9faXNhc2NpaShjKQkoKChjKSAmIH4weDdmKSA9PSAwKQkvKiBJZiBDIGlzIGEgNyBiaXQgdmFsdWUuICAqLworI2RlZmluZQlfX3RvYXNjaWkoYykJKChjKSAmIDB4N2YpCQkvKiBNYXNrIG9mZiBoaWdoIGJpdHMuICAqLworCisjZGVmaW5lCV9fZXhjdHlwZShuYW1lKQlleHRlcm4gaW50IG5hbWUgKGludCkgX19USFJPVworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKworLyogVGhlIGZvbGxvd2luZyBuYW1lcyBhcmUgYWxsIGZ1bmN0aW9uczoKKyAgICAgaW50IGlzQ0hBUkFDVEVSSVNUSUMoaW50IGMpOworICAgd2hpY2ggcmV0dXJuIG5vbnplcm8gaWZmIEMgaGFzIENIQVJBQ1RFUklTVElDLgorICAgRm9yIHRoZSBtZWFuaW5nIG9mIHRoZSBjaGFyYWN0ZXJpc3RpYyBuYW1lcywgc2VlIHRoZSBgZW51bScgYWJvdmUuICAqLworX19leGN0eXBlIChpc2FsbnVtKTsKK19fZXhjdHlwZSAoaXNhbHBoYSk7CitfX2V4Y3R5cGUgKGlzY250cmwpOworX19leGN0eXBlIChpc2RpZ2l0KTsKK19fZXhjdHlwZSAoaXNsb3dlcik7CitfX2V4Y3R5cGUgKGlzZ3JhcGgpOworX19leGN0eXBlIChpc3ByaW50KTsKK19fZXhjdHlwZSAoaXNwdW5jdCk7CitfX2V4Y3R5cGUgKGlzc3BhY2UpOworX19leGN0eXBlIChpc3VwcGVyKTsKK19fZXhjdHlwZSAoaXN4ZGlnaXQpOworCisKKy8qIFJldHVybiB0aGUgbG93ZXJjYXNlIHZlcnNpb24gb2YgQy4gICovCitleHRlcm4gaW50IHRvbG93ZXIgKGludCBfX2MpIF9fVEhST1c7CisKKy8qIFJldHVybiB0aGUgdXBwZXJjYXNlIHZlcnNpb24gb2YgQy4gICovCitleHRlcm4gaW50IHRvdXBwZXIgKGludCBfX2MpIF9fVEhST1c7CisKK19fRU5EX05BTUVTUEFDRV9TVEQKKworCisvKiBJU08gQzk5IGludHJvZHVjZWQgb25lIG5ldyBmdW5jdGlvbi4gICovCisjaWZkZWYJX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKworX19leGN0eXBlIChpc2JsYW5rKTsKKworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRlc3QgQyBmb3IgYSBzZXQgb2YgY2hhcmFjdGVyIGNsYXNzZXMgYWNjb3JkaW5nIHRvIE1BU0suICAqLworZXh0ZXJuIGludCBpc2N0eXBlIChpbnQgX19jLCBpbnQgX19tYXNrKSBfX1RIUk9XOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKworLyogUmV0dXJuIG5vbnplcm8gaWZmIEMgaXMgaW4gdGhlIEFTQ0lJIHNldAorICAgKGkuZS4sIGlzIG5vIG1vcmUgdGhhbiA3IGJpdHMgd2lkZSkuICAqLworZXh0ZXJuIGludCBpc2FzY2lpIChpbnQgX19jKSBfX1RIUk9XOworCisvKiBSZXR1cm4gdGhlIHBhcnQgb2YgQyB0aGF0IGlzIGluIHRoZSBBU0NJSSBzZXQKKyAgIChpLmUuLCB0aGUgbG93LW9yZGVyIDcgYml0cyBvZiBDKS4gICovCitleHRlcm4gaW50IHRvYXNjaWkgKGludCBfX2MpIF9fVEhST1c7CisKKy8qIFRoZXNlIGFyZSB0aGUgc2FtZSBhcyBgdG91cHBlcicgYW5kIGB0b2xvd2VyJyBleGNlcHQgdGhhdCB0aGV5IGRvIG5vdAorICAgY2hlY2sgdGhlIGFyZ3VtZW50IGZvciBiZWluZyBpbiB0aGUgcmFuZ2Ugb2YgYSBgY2hhcicuICAqLworX19leGN0eXBlIChfdG91cHBlcik7CitfX2V4Y3R5cGUgKF90b2xvd2VyKTsKKyNlbmRpZiAvKiBVc2UgU1ZJRCBvciB1c2UgbWlzYy4gICovCisKKy8qIFRoaXMgY29kZSBpcyBuZWVkZWQgZm9yIHRoZSBvcHRpbWl6ZWQgbWFwcGluZyBmdW5jdGlvbnMuICAqLworI2RlZmluZSBfX3RvYm9keShjLCBmLCBhLCBhcmdzKSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7IGludCBfX3JlczsJCQkJCQkJICAgICAgXAorICAgICAgaWYgKHNpemVvZiAoYykgPiAxKQkJCQkJCSAgICAgIFwKKwl7CQkJCQkJCQkgICAgICBcCisJICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGMpKQkJCQkJICAgICAgXAorCSAgICB7CQkJCQkJCQkgICAgICBcCisJICAgICAgaW50IF9fYyA9IChjKTsJCQkJCQkgICAgICBcCisJICAgICAgX19yZXMgPSBfX2MgPCAtMTI4IHx8IF9fYyA+IDI1NSA/IF9fYyA6IChhKVtfX2NdOwkJICAgICAgXAorCSAgICB9CQkJCQkJCQkgICAgICBcCisJICBlbHNlCQkJCQkJCQkgICAgICBcCisJICAgIF9fcmVzID0gZiBhcmdzOwkJCQkJCSAgICAgIFwKKwl9CQkJCQkJCQkgICAgICBcCisgICAgICBlbHNlCQkJCQkJCQkgICAgICBcCisJX19yZXMgPSAoYSlbKGludCkgKGMpXTsJCQkJCQkgICAgICBcCisgICAgICBfX3JlczsgfSkpCisKKyNpZiAhZGVmaW5lZCBfX05PX0NUWVBFCisjIGlmZGVmIF9faXNjdHlwZV9mCitfX2lzY3R5cGVfZiAoYWxudW0pCitfX2lzY3R5cGVfZiAoYWxwaGEpCitfX2lzY3R5cGVfZiAoY250cmwpCitfX2lzY3R5cGVfZiAoZGlnaXQpCitfX2lzY3R5cGVfZiAobG93ZXIpCitfX2lzY3R5cGVfZiAoZ3JhcGgpCitfX2lzY3R5cGVfZiAocHJpbnQpCitfX2lzY3R5cGVfZiAocHVuY3QpCitfX2lzY3R5cGVfZiAoc3BhY2UpCitfX2lzY3R5cGVfZiAodXBwZXIpCitfX2lzY3R5cGVfZiAoeGRpZ2l0KQorIyAgaWZkZWYgX19VU0VfSVNPQzk5CitfX2lzY3R5cGVfZiAoYmxhbmspCisjICBlbmRpZgorIyBlbGlmIGRlZmluZWQgX19pc2N0eXBlCisjIGRlZmluZSBpc2FsbnVtKGMpCV9faXNjdHlwZSgoYyksIF9JU2FsbnVtKQorIyBkZWZpbmUgaXNhbHBoYShjKQlfX2lzY3R5cGUoKGMpLCBfSVNhbHBoYSkKKyMgZGVmaW5lIGlzY250cmwoYykJX19pc2N0eXBlKChjKSwgX0lTY250cmwpCisjIGRlZmluZSBpc2RpZ2l0KGMpCV9faXNjdHlwZSgoYyksIF9JU2RpZ2l0KQorIyBkZWZpbmUgaXNsb3dlcihjKQlfX2lzY3R5cGUoKGMpLCBfSVNsb3dlcikKKyMgZGVmaW5lIGlzZ3JhcGgoYykJX19pc2N0eXBlKChjKSwgX0lTZ3JhcGgpCisjIGRlZmluZSBpc3ByaW50KGMpCV9faXNjdHlwZSgoYyksIF9JU3ByaW50KQorIyBkZWZpbmUgaXNwdW5jdChjKQlfX2lzY3R5cGUoKGMpLCBfSVNwdW5jdCkKKyMgZGVmaW5lIGlzc3BhY2UoYykJX19pc2N0eXBlKChjKSwgX0lTc3BhY2UpCisjIGRlZmluZSBpc3VwcGVyKGMpCV9faXNjdHlwZSgoYyksIF9JU3VwcGVyKQorIyBkZWZpbmUgaXN4ZGlnaXQoYykJX19pc2N0eXBlKChjKSwgX0lTeGRpZ2l0KQorIyAgaWZkZWYgX19VU0VfSVNPQzk5CisjICAgZGVmaW5lIGlzYmxhbmsoYykJX19pc2N0eXBlKChjKSwgX0lTYmxhbmspCisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAodG9sb3dlciAoaW50IF9fYykpCit7CisgIHJldHVybiBfX2MgPj0gLTEyOCAmJiBfX2MgPCAyNTYgPyAoKl9fY3R5cGVfdG9sb3dlcl9sb2MgKCkpW19fY10gOiBfX2M7Cit9CisKK19fZXh0ZXJuX2lubGluZSBpbnQKK19fTlRIICh0b3VwcGVyIChpbnQgX19jKSkKK3sKKyAgcmV0dXJuIF9fYyA+PSAtMTI4ICYmIF9fYyA8IDI1NiA/ICgqX19jdHlwZV90b3VwcGVyX2xvYyAoKSlbX19jXSA6IF9fYzsKK30KKyMgZW5kaWYKKworIyBpZiBfX0dOVUNfXyA+PSAyICYmIGRlZmluZWQgX19PUFRJTUlaRV9fICYmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgdG9sb3dlcihjKQlfX3RvYm9keSAoYywgdG9sb3dlciwgKl9fY3R5cGVfdG9sb3dlcl9sb2MgKCksIChjKSkKKyMgIGRlZmluZSB0b3VwcGVyKGMpCV9fdG9ib2R5IChjLCB0b3VwcGVyLCAqX19jdHlwZV90b3VwcGVyX2xvYyAoKSwgKGMpKQorIyBlbmRpZiAvKiBPcHRpbWl6aW5nIGdjYyAqLworCisjIGlmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorIyAgZGVmaW5lIGlzYXNjaWkoYykJX19pc2FzY2lpIChjKQorIyAgZGVmaW5lIHRvYXNjaWkoYykJX190b2FzY2lpIChjKQorCisjICBkZWZpbmUgX3RvbG93ZXIoYykJKChpbnQpICgqX19jdHlwZV90b2xvd2VyX2xvYyAoKSlbKGludCkgKGMpXSkKKyMgIGRlZmluZSBfdG91cHBlcihjKQkoKGludCkgKCpfX2N0eXBlX3RvdXBwZXJfbG9jICgpKVsoaW50KSAoYyldKQorIyBlbmRpZgorCisjZW5kaWYgLyogTm90IF9fTk9fQ1RZUEUuICAqLworCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLOAorLyogVGhlIGNvbmNlcHQgb2Ygb25lIHN0YXRpYyBsb2NhbGUgcGVyIGNhdGVnb3J5IGlzIG5vdCB2ZXJ5IHdlbGwKKyAgIHRob3VnaHQgb3V0LiAgTWFueSBhcHBsaWNhdGlvbnMgd2lsbCBuZWVkIHRvIHByb2Nlc3MgaXRzIGRhdGEgdXNpbmcKKyAgIGluZm9ybWF0aW9uIGZyb20gc2V2ZXJhbCBkaWZmZXJlbnQgbG9jYWxlcy4gIEFub3RoZXIgYXBwbGljYXRpb24gaXMKKyAgIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYXRpb25hbGl6YXRpb24gaGFuZGxpbmcgaW4gdGhlCisgICB1cGNvbWluZyBJU08gQysrIHN0YW5kYXJkIGxpYnJhcnkuICBUbyBzdXBwb3J0IHRoaXMgYW5vdGhlciBzZXQgb2YKKyAgIHRoZSBmdW5jdGlvbnMgdXNpbmcgbG9jYWxlIGRhdGEgZXhpc3Qgd2hpY2ggaGF2ZSBhbiBhZGRpdGlvbmFsCisgICBhcmd1bWVudC4KKworICAgQXR0ZW50aW9uOiBhbGwgdGhlc2UgZnVuY3Rpb25zIGFyZSAqbm90KiBzdGFuZGFyZGl6ZWQgaW4gYW55IGZvcm0uCisgICBUaGlzIGlzIGEgcHJvb2Ytb2YtY29uY2VwdCBpbXBsZW1lbnRhdGlvbi4gICovCisKKy8qIFN0cnVjdHVyZSBmb3IgcmVlbnRyYW50IGxvY2FsZSB1c2luZyBmdW5jdGlvbnMuICBUaGlzIGlzIGFuCisgICAoYWxtb3N0KSBvcGFxdWUgdHlwZSBmb3IgdGhlIHVzZXIgbGV2ZWwgcHJvZ3JhbXMuICAqLworIyBpbmNsdWRlIDx4bG9jYWxlLmg+CisKKy8qIFRoZXNlIGRlZmluaXRpb25zIGFyZSBzaW1pbGFyIHRvIHRoZSBvbmVzIGFib3ZlIGJ1dCBhbGwgZnVuY3Rpb25zCisgICB0YWtlIGFzIGFuIGFyZ3VtZW50IGEgaGFuZGxlIGZvciB0aGUgbG9jYWxlIHdoaWNoIHNoYWxsIGJlIHVzZWQuICAqLworIyAgZGVmaW5lIF9faXNjdHlwZV9sKGMsIHR5cGUsIGxvY2FsZSkgXAorICAoKGxvY2FsZSktPl9fY3R5cGVfYlsoaW50KSAoYyldICYgKHVuc2lnbmVkIHNob3J0IGludCkgdHlwZSkKKworIyBkZWZpbmUgX19leGN0eXBlX2wobmFtZSkgCQkJCQkJICAgICAgXAorICBleHRlcm4gaW50IG5hbWUgKGludCwgX19sb2NhbGVfdCkgX19USFJPVworCisvKiBUaGUgZm9sbG93aW5nIG5hbWVzIGFyZSBhbGwgZnVuY3Rpb25zOgorICAgICBpbnQgaXNDSEFSQUNURVJJU1RJQyhpbnQgYywgbG9jYWxlX3QgKmxvY2FsZSk7CisgICB3aGljaCByZXR1cm4gbm9uemVybyBpZmYgQyBoYXMgQ0hBUkFDVEVSSVNUSUMuCisgICBGb3IgdGhlIG1lYW5pbmcgb2YgdGhlIGNoYXJhY3RlcmlzdGljIG5hbWVzLCBzZWUgdGhlIGBlbnVtJyBhYm92ZS4gICovCitfX2V4Y3R5cGVfbCAoaXNhbG51bV9sKTsKK19fZXhjdHlwZV9sIChpc2FscGhhX2wpOworX19leGN0eXBlX2wgKGlzY250cmxfbCk7CitfX2V4Y3R5cGVfbCAoaXNkaWdpdF9sKTsKK19fZXhjdHlwZV9sIChpc2xvd2VyX2wpOworX19leGN0eXBlX2wgKGlzZ3JhcGhfbCk7CitfX2V4Y3R5cGVfbCAoaXNwcmludF9sKTsKK19fZXhjdHlwZV9sIChpc3B1bmN0X2wpOworX19leGN0eXBlX2wgKGlzc3BhY2VfbCk7CitfX2V4Y3R5cGVfbCAoaXN1cHBlcl9sKTsKK19fZXhjdHlwZV9sIChpc3hkaWdpdF9sKTsKKworX19leGN0eXBlX2wgKGlzYmxhbmtfbCk7CisKKworLyogUmV0dXJuIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiBvZiBDIGluIGxvY2FsZSBMLiAgKi8KK2V4dGVybiBpbnQgX190b2xvd2VyX2wgKGludCBfX2MsIF9fbG9jYWxlX3QgX19sKSBfX1RIUk9XOworZXh0ZXJuIGludCB0b2xvd2VyX2wgKGludCBfX2MsIF9fbG9jYWxlX3QgX19sKSBfX1RIUk9XOworCisvKiBSZXR1cm4gdGhlIHVwcGVyY2FzZSB2ZXJzaW9uIG9mIEMuICAqLworZXh0ZXJuIGludCBfX3RvdXBwZXJfbCAoaW50IF9fYywgX19sb2NhbGVfdCBfX2wpIF9fVEhST1c7CitleHRlcm4gaW50IHRvdXBwZXJfbCAoaW50IF9fYywgX19sb2NhbGVfdCBfX2wpIF9fVEhST1c7CisKKyMgaWYgX19HTlVDX18gPj0gMiAmJiBkZWZpbmVkIF9fT1BUSU1JWkVfXyAmJiAhZGVmaW5lZCBfX2NwbHVzcGx1cworIyAgZGVmaW5lIF9fdG9sb3dlcl9sKGMsIGxvY2FsZSkgXAorICBfX3RvYm9keSAoYywgX190b2xvd2VyX2wsIChsb2NhbGUpLT5fX2N0eXBlX3RvbG93ZXIsIChjLCBsb2NhbGUpKQorIyAgZGVmaW5lIF9fdG91cHBlcl9sKGMsIGxvY2FsZSkgXAorICBfX3RvYm9keSAoYywgX190b3VwcGVyX2wsIChsb2NhbGUpLT5fX2N0eXBlX3RvdXBwZXIsIChjLCBsb2NhbGUpKQorIyAgZGVmaW5lIHRvbG93ZXJfbChjLCBsb2NhbGUpCV9fdG9sb3dlcl9sICgoYyksIChsb2NhbGUpKQorIyAgZGVmaW5lIHRvdXBwZXJfbChjLCBsb2NhbGUpCV9fdG91cHBlcl9sICgoYyksIChsb2NhbGUpKQorIyBlbmRpZgkvKiBPcHRpbWl6aW5nIGdjYyAqLworCisKKyMgaWZuZGVmIF9fTk9fQ1RZUEUKKyMgIGRlZmluZSBfX2lzYWxudW1fbChjLGwpCV9faXNjdHlwZV9sKChjKSwgX0lTYWxudW0sIChsKSkKKyMgIGRlZmluZSBfX2lzYWxwaGFfbChjLGwpCV9faXNjdHlwZV9sKChjKSwgX0lTYWxwaGEsIChsKSkKKyMgIGRlZmluZSBfX2lzY250cmxfbChjLGwpCV9faXNjdHlwZV9sKChjKSwgX0lTY250cmwsIChsKSkKKyMgIGRlZmluZSBfX2lzZGlnaXRfbChjLGwpCV9faXNjdHlwZV9sKChjKSwgX0lTZGlnaXQsIChsKSkKKyMgIGRlZmluZSBfX2lzbG93ZXJfbChjLGwpCV9faXNjdHlwZV9sKChjKSwgX0lTbG93ZXIsIChsKSkKKyMgIGRlZmluZSBfX2lzZ3JhcGhfbChjLGwpCV9faXNjdHlwZV9sKChjKSwgX0lTZ3JhcGgsIChsKSkKKyMgIGRlZmluZSBfX2lzcHJpbnRfbChjLGwpCV9faXNjdHlwZV9sKChjKSwgX0lTcHJpbnQsIChsKSkKKyMgIGRlZmluZSBfX2lzcHVuY3RfbChjLGwpCV9faXNjdHlwZV9sKChjKSwgX0lTcHVuY3QsIChsKSkKKyMgIGRlZmluZSBfX2lzc3BhY2VfbChjLGwpCV9faXNjdHlwZV9sKChjKSwgX0lTc3BhY2UsIChsKSkKKyMgIGRlZmluZSBfX2lzdXBwZXJfbChjLGwpCV9faXNjdHlwZV9sKChjKSwgX0lTdXBwZXIsIChsKSkKKyMgIGRlZmluZSBfX2lzeGRpZ2l0X2woYyxsKQlfX2lzY3R5cGVfbCgoYyksIF9JU3hkaWdpdCwgKGwpKQorCisjICBkZWZpbmUgX19pc2JsYW5rX2woYyxsKQlfX2lzY3R5cGVfbCgoYyksIF9JU2JsYW5rLCAobCkpCisKKyMgIGlmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKyMgICBkZWZpbmUgX19pc2FzY2lpX2woYyxsKQkoKGwpLCBfX2lzYXNjaWkgKGMpKQorIyAgIGRlZmluZSBfX3RvYXNjaWlfbChjLGwpCSgobCksIF9fdG9hc2NpaSAoYykpCisjICBlbmRpZgorCisjICBkZWZpbmUgaXNhbG51bV9sKGMsbCkJX19pc2FsbnVtX2wgKChjKSwgKGwpKQorIyAgZGVmaW5lIGlzYWxwaGFfbChjLGwpCV9faXNhbHBoYV9sICgoYyksIChsKSkKKyMgIGRlZmluZSBpc2NudHJsX2woYyxsKQlfX2lzY250cmxfbCAoKGMpLCAobCkpCisjICBkZWZpbmUgaXNkaWdpdF9sKGMsbCkJX19pc2RpZ2l0X2wgKChjKSwgKGwpKQorIyAgZGVmaW5lIGlzbG93ZXJfbChjLGwpCV9faXNsb3dlcl9sICgoYyksIChsKSkKKyMgIGRlZmluZSBpc2dyYXBoX2woYyxsKQlfX2lzZ3JhcGhfbCAoKGMpLCAobCkpCisjICBkZWZpbmUgaXNwcmludF9sKGMsbCkJX19pc3ByaW50X2wgKChjKSwgKGwpKQorIyAgZGVmaW5lIGlzcHVuY3RfbChjLGwpCV9faXNwdW5jdF9sICgoYyksIChsKSkKKyMgIGRlZmluZSBpc3NwYWNlX2woYyxsKQlfX2lzc3BhY2VfbCAoKGMpLCAobCkpCisjICBkZWZpbmUgaXN1cHBlcl9sKGMsbCkJX19pc3VwcGVyX2wgKChjKSwgKGwpKQorIyAgZGVmaW5lIGlzeGRpZ2l0X2woYyxsKQlfX2lzeGRpZ2l0X2wgKChjKSwgKGwpKQorCisjICBkZWZpbmUgaXNibGFua19sKGMsbCkJX19pc2JsYW5rX2wgKChjKSwgKGwpKQorCisjICBpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9NSVNDCisjICAgZGVmaW5lIGlzYXNjaWlfbChjLGwpCV9faXNhc2NpaV9sICgoYyksIChsKSkKKyMgICBkZWZpbmUgdG9hc2NpaV9sKGMsbCkJX190b2FzY2lpX2wgKChjKSwgKGwpKQorIyAgZW5kaWYKKworIyBlbmRpZiAvKiBOb3QgX19OT19DVFlQRS4gICovCisKKyNlbmRpZiAvKiBVc2UgUE9TSVggMjAwOC4gICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBjdHlwZS5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU2NDQ1MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2VzLmgKQEAgLTAsMCArMSwxNjc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTAsMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgKgorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgICoKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAqCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgKgorICogZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgICoKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAqCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAqCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAqCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAqCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgKgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgICoKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICoKKyAqIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAqCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgKgorICogYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEF1dGhvcjogWmV5ZCBNLiBCZW4tSGFsaW0gPHptYmVuaGFsQG5ldGNvbS5jb20+IDE5OTIsMTk5NSAgICAgICAgICAgICAgICoKKyAqICAgICBhbmQ6IEVyaWMgUy4gUmF5bW9uZCA8ZXNyQHNuYXJrLnRoeXJzdXMuY29tPiAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgYW5kOiBUaG9tYXMgRS4gRGlja2V5ICAgICAgICAgICAgICAgICAgICAgICAgMTk5Ni1vbiAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICRJZDogY3Vyc2VzLmguaW4sdiAxLjIyMCAyMDExLzAxLzIyIDE5OjQ3OjIwIHRvbSBFeHAgJCAqLworCisjaWZuZGVmIF9fTkNVUlNFU19ICisjZGVmaW5lIF9fTkNVUlNFU19ICisKKyNkZWZpbmUgQ1VSU0VTIDEKKyNkZWZpbmUgQ1VSU0VTX0ggMQorCisvKiBUaGVzZSBhcmUgZGVmaW5lZCBvbmx5IGluIGN1cnNlcy5oLCBhbmQgYXJlIHVzZWQgZm9yIGNvbmRpdGlvbmFsIGNvbXBpbGVzICovCisjZGVmaW5lIE5DVVJTRVNfVkVSU0lPTl9NQUpPUiA1CisjZGVmaW5lIE5DVVJTRVNfVkVSU0lPTl9NSU5PUiA5CisjZGVmaW5lIE5DVVJTRVNfVkVSU0lPTl9QQVRDSCAyMDExMDQwNAorCisvKiBUaGlzIGlzIGRlZmluZWQgaW4gbW9yZSB0aGFuIG9uZSBuY3Vyc2VzIGhlYWRlciwgZm9yIGlkZW50aWZpY2F0aW9uICovCisjdW5kZWYgIE5DVVJTRVNfVkVSU0lPTgorI2RlZmluZSBOQ1VSU0VTX1ZFUlNJT04gIjUuOSIKKworLyoKKyAqIElkZW50aWZ5IHRoZSBtb3VzZSBlbmNvZGluZyB2ZXJzaW9uLgorICovCisjZGVmaW5lIE5DVVJTRVNfTU9VU0VfVkVSU0lPTiAxCisKKy8qCisgKiBEZWZpbml0aW9ucyB0byBmYWNpbGl0YXRlIERMTCdzLgorICovCisjaW5jbHVkZSA8bmN1cnNlc19kbGwuaD4KKworLyoKKyAqIFVzZXItZGVmaW5hYmxlIHR3ZWFrIHRvIGRpc2FibGUgdGhlIGluY2x1ZGUgb2YgPHN0ZGJvb2wuaD4uCisgKi8KKyNpZm5kZWYgTkNVUlNFU19FTkFCTEVfU1REQk9PTF9ICisjZGVmaW5lIE5DVVJTRVNfRU5BQkxFX1NUREJPT0xfSCAxCisjZW5kaWYKKworLyoKKyAqIE5DVVJTRVNfQVRUUl9UIGlzIHVzZWQgdG8gcXVpZXQgY29tcGlsZXIgd2FybmluZ3Mgd2hlbiBidWlsZGluZyBuY3Vyc2VzCisgKiBjb25maWd1cmVkIHVzaW5nIC0tZGlzYWJsZS1tYWNyb3MuCisgKi8KKyNpZmRlZiBOQ1VSU0VTX05PTUFDUk9TCisjaWZuZGVmIE5DVVJTRVNfQVRUUl9UCisjZGVmaW5lIE5DVVJTRVNfQVRUUl9UIGF0dHJfdAorI2VuZGlmCisjZW5kaWYgLyogTkNVUlNFU19OT01BQ1JPUyAqLworCisjaWZuZGVmIE5DVVJTRVNfQVRUUl9UCisjZGVmaW5lIE5DVVJTRVNfQVRUUl9UIGludAorI2VuZGlmCisKKy8qCisgKiBFeHBhbmRzIHRvICdjb25zdCcgaWYgbmN1cnNlcyBpcyBjb25maWd1cmVkIHVzaW5nIC0tZW5hYmxlLWNvbnN0LiAgTm90ZSB0aGF0CisgKiBkb2luZyBzbyBtYWtlcyBpdCBpbmNvbXBhdGlibGUgd2l0aCBvdGhlciBpbXBsZW1lbnRhdGlvbnMgb2YgWC9PcGVuIEN1cnNlcy4KKyAqLworI3VuZGVmICBOQ1VSU0VTX0NPTlNUCisjZGVmaW5lIE5DVVJTRVNfQ09OU1QgY29uc3QKKworI3VuZGVmIE5DVVJTRVNfSU5MSU5FCisjZGVmaW5lIE5DVVJTRVNfSU5MSU5FIGlubGluZQorCisvKgorICogVGhlIGludGVybmFsIHR5cGUgdXNlZCBmb3IgY29sb3IgdmFsdWVzCisgKi8KKyN1bmRlZglOQ1VSU0VTX0NPTE9SX1QKKyNkZWZpbmUJTkNVUlNFU19DT0xPUl9UIHNob3J0CisKKy8qCisgKiBEZWZpbml0aW9uIHVzZWQgdG8gbWFrZSBXSU5ET1cgYW5kIHNpbWlsYXIgc3RydWN0cyBvcGFxdWUuCisgKi8KKyNpZm5kZWYgTkNVUlNFU19PUEFRVUUKKyNkZWZpbmUgTkNVUlNFU19PUEFRVUUgMAorI2VuZGlmCisKKy8qCisgKiBUaGUgcmVlbnRyYW50IGNvZGUgcmVsaWVzIG9uIHRoZSBvcGFxdWUgc2V0dGluZywgYnV0IGFkZHMgZmVhdHVyZXMuCisgKi8KKyNpZm5kZWYgTkNVUlNFU19SRUVOVFJBTlQKKyNkZWZpbmUgTkNVUlNFU19SRUVOVFJBTlQgMAorI2VuZGlmCisKKy8qCisgKiBDb250cm9sIHdoZXRoZXIgYmluZGluZ3MgZm9yIGludGVyb3Agc3VwcG9ydCBhcmUgYWRkZWQuCisgKi8KKyN1bmRlZglOQ1VSU0VTX0lOVEVST1BfRlVOQ1MKKyNkZWZpbmUJTkNVUlNFU19JTlRFUk9QX0ZVTkNTIDAKKworLyoKKyAqIFRoZSBpbnRlcm5hbCB0eXBlIHVzZWQgZm9yIHdpbmRvdyBkaW1lbnNpb25zLgorICovCisjdW5kZWYJTkNVUlNFU19TSVpFX1QKKyNkZWZpbmUJTkNVUlNFU19TSVpFX1Qgc2hvcnQKKworLyoKKyAqIENvbnRyb2wgd2hldGhlciB0cGFybSgpIHN1cHBvcnRzIHZhcmFyZ3Mgb3IgZml4ZWQtcGFyYW1ldGVyIGxpc3QuCisgKi8KKyN1bmRlZiBOQ1VSU0VTX1RQQVJNX1ZBUkFSR1MKKyNkZWZpbmUgTkNVUlNFU19UUEFSTV9WQVJBUkdTIDEKKworLyoKKyAqIE5DVVJTRVNfQ0hfVCBpcyB1c2VkIGluIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5LCBidXQgbm90IHVzZWQgb3RoZXJ3aXNlIGluCisgKiB0aGlzIGhlYWRlciBmaWxlLCBzaW5jZSB0aGF0IHdvdWxkIG1ha2UgdGhlIG5vcm1hbC93aWRlLWNoYXJhY3RlciB2ZXJzaW9ucworICogb2YgdGhlIGhlYWRlciBpbmNvbXBhdGlibGUuCisgKi8KKyN1bmRlZglOQ1VSU0VTX0NIX1QKKyNkZWZpbmUgTkNVUlNFU19DSF9UIGNodHlwZQorCisjaWYgMCAmJiBkZWZpbmVkKF9MUDY0KQordHlwZWRlZiB1bnNpZ25lZCBjaHR5cGU7Cit0eXBlZGVmIHVuc2lnbmVkIG1tYXNrX3Q7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGNodHlwZTsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBtbWFza190OworI2VuZGlmCisKKy8qCisgKiBXZSBuZWVkIEZJTEUsIGV0Yy4gIEluY2x1ZGUgdGhpcyBiZWZvcmUgY2hlY2tpbmcgYW55IGZlYXR1cmUgc3ltYm9scy4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qCisgKiBXaXRoIFhQRzQsIHlvdSBtdXN0IGRlZmluZSBfWE9QRU5fU09VUkNFX0VYVEVOREVELCBpdCBpcyByZWR1bmRhbnQgKG9yCisgKiBjb25mbGljdGluZykgd2hlbiBfWE9QRU5fU09VUkNFIGlzIDUwMCBvciBncmVhdGVyLgorICovCisjdW5kZWYgTkNVUlNFU19XSURFQ0hBUgorI2lmIGRlZmluZWQoX1hPUEVOX1NPVVJDRV9FWFRFTkRFRCkgfHwgZGVmaW5lZChfWFBHNSkKKyNkZWZpbmUgTkNVUlNFU19XSURFQ0hBUgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4JLyogd2UgbmVlZCB2YV9saXN0ICovCisjaWZkZWYgTkNVUlNFU19XSURFQ0hBUgorI2luY2x1ZGUgPHN0ZGRlZi5oPgkvKiB3ZSB3YW50IHdjaGFyX3QgKi8KKyNlbmRpZgorCisvKiBYL09wZW4gYW5kIFNWcjQgc3BlY2lmeSB0aGF0IGN1cnNlcyBpbXBsZW1lbnRzICdib29sJy4gIEhvd2V2ZXIsIEMrKyBtYXkgYWxzbworICogaW1wbGVtZW50IGl0LiAgSWYgc28sIHdlIG11c3QgdXNlIHRoZSBDKysgY29tcGlsZXIncyB0eXBlIHRvIGF2b2lkIGNvbmZsaWN0CisgKiB3aXRoIG90aGVyIGludGVyZmFjZXMuCisgKgorICogQSBmdXJ0aGVyIGNvbXBsaWNhdGlvbiBpcyB0aGF0IDxzdGRib29sLmg+IG1heSBkZWNsYXJlICdib29sJyB0byBiZSBhCisgKiBkaWZmZXJlbnQgdHlwZSwgc3VjaCBhcyBhbiBlbnVtIHdoaWNoIGlzIG5vdCBuZWNlc3NhcmlseSBjb21wYXRpYmxlIHdpdGgKKyAqIEMrKy4gIElmIHdlIGhhdmUgPHN0ZGJvb2wuaD4sIG1ha2UgJ2Jvb2wnIGEgbWFjcm8sIHNvIHVzZXJzIG1heSAjdW5kZWYgaXQuCisgKiBPdGhlcndpc2UsIGxldCBpdCByZW1haW4gYSB0eXBlZGVmIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyICNkZWZpbmUncy4KKyAqIEluIGVpdGhlciBjYXNlLCBtYWtlIGEgdHlwZWRlZiBmb3IgTkNVUlNFU19CT09MIHdoaWNoIGNhbiBiZSB1c2VkIGlmIG5lZWRlZAorICogZnJvbSBlaXRoZXIgQyBvciBDKysuCisgKi8KKworI3VuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAgICAxCisKKyN1bmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAgIDAKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIE5DVVJTRVNfQk9PTDsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCS8qIF9fY3BsdXNwbHVzLCBldGMuICovCisKKy8qIHVzZSB0aGUgQysrIGNvbXBpbGVyJ3MgYm9vbCB0eXBlICovCisjZGVmaW5lIE5DVVJTRVNfQk9PTCBib29sCisKKyNlbHNlCQkJLyogYzg5LCBjOTksIGV0Yy4gKi8KKworI2lmIE5DVVJTRVNfRU5BQkxFX1NUREJPT0xfSAorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKy8qIHVzZSB3aGF0ZXZlciB0aGUgQyBjb21waWxlciBkZWNpZGVzIGJvb2wgcmVhbGx5IGlzICovCisjZGVmaW5lIE5DVVJTRVNfQk9PTCBib29sCisjZWxzZQorLyogdGhlcmUgaXMgbm8gcHJlZGVmaW5lZCBib29sIC0gdXNlIG91ciBvd24gKi8KKyN1bmRlZiBib29sCisjZGVmaW5lIGJvb2wgTkNVUlNFU19CT09MCisjZW5kaWYKKworI2VuZGlmIC8qICFfX2NwbHVzcGx1cywgZXRjLiAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2RlZmluZSBOQ1VSU0VTX0NBU1QodHlwZSx2YWx1ZSkgc3RhdGljX2Nhc3Q8dHlwZT4odmFsdWUpCisjZWxzZQorI2RlZmluZSBOQ1VSU0VTX0NBU1QodHlwZSx2YWx1ZSkgKHR5cGUpKHZhbHVlKQorI2VuZGlmCisKKy8qCisgKiBYL09wZW4gYXR0cmlidXRlcy4gIEluIHRoZSBuY3Vyc2VzIGltcGxlbWVudGF0aW9uLCB0aGV5IGFyZSBpZGVudGljYWwgdG8gdGhlCisgKiBBXyBhdHRyaWJ1dGVzLgorICovCisjZGVmaW5lIFdBX0FUVFJJQlVURVMJQV9BVFRSSUJVVEVTCisjZGVmaW5lIFdBX05PUk1BTAlBX05PUk1BTAorI2RlZmluZSBXQV9TVEFORE9VVAlBX1NUQU5ET1VUCisjZGVmaW5lIFdBX1VOREVSTElORQlBX1VOREVSTElORQorI2RlZmluZSBXQV9SRVZFUlNFCUFfUkVWRVJTRQorI2RlZmluZSBXQV9CTElOSwlBX0JMSU5LCisjZGVmaW5lIFdBX0RJTQkJQV9ESU0KKyNkZWZpbmUgV0FfQk9MRAkJQV9CT0xECisjZGVmaW5lIFdBX0FMVENIQVJTRVQJQV9BTFRDSEFSU0VUCisjZGVmaW5lIFdBX0lOVklTCUFfSU5WSVMKKyNkZWZpbmUgV0FfUFJPVEVDVAlBX1BST1RFQ1QKKyNkZWZpbmUgV0FfSE9SSVpPTlRBTAlBX0hPUklaT05UQUwKKyNkZWZpbmUgV0FfTEVGVAkJQV9MRUZUCisjZGVmaW5lIFdBX0xPVwkJQV9MT1cKKyNkZWZpbmUgV0FfUklHSFQJQV9SSUdIVAorI2RlZmluZSBXQV9UT1AJCUFfVE9QCisjZGVmaW5lIFdBX1ZFUlRJQ0FMCUFfVkVSVElDQUwKKworLyogY29sb3JzICovCisjZGVmaW5lIENPTE9SX0JMQUNLCTAKKyNkZWZpbmUgQ09MT1JfUkVECTEKKyNkZWZpbmUgQ09MT1JfR1JFRU4JMgorI2RlZmluZSBDT0xPUl9ZRUxMT1cJMworI2RlZmluZSBDT0xPUl9CTFVFCTQKKyNkZWZpbmUgQ09MT1JfTUFHRU5UQQk1CisjZGVmaW5lIENPTE9SX0NZQU4JNgorI2RlZmluZSBDT0xPUl9XSElURQk3CisKKy8qIGxpbmUgZ3JhcGhpY3MgKi8KKworI2lmIDAgfHwgTkNVUlNFU19SRUVOVFJBTlQKK05DVVJTRVNfV1JBUFBFRF9WQVIoY2h0eXBlKiwgYWNzX21hcCk7CisjZGVmaW5lIGFjc19tYXAgTkNVUlNFU19QVUJMSUNfVkFSKGFjc19tYXAoKSkKKyNlbHNlCitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGNodHlwZSkgYWNzX21hcFtdOworI2VuZGlmCisKKyNkZWZpbmUgTkNVUlNFU19BQ1MoYykJKGFjc19tYXBbTkNVUlNFU19DQVNUKHVuc2lnbmVkIGNoYXIsYyldKQorCisvKiBWVDEwMCBzeW1ib2xzIGJlZ2luIGhlcmUgKi8KKyNkZWZpbmUgQUNTX1VMQ09STkVSCU5DVVJTRVNfQUNTKCdsJykgLyogdXBwZXIgbGVmdCBjb3JuZXIgKi8KKyNkZWZpbmUgQUNTX0xMQ09STkVSCU5DVVJTRVNfQUNTKCdtJykgLyogbG93ZXIgbGVmdCBjb3JuZXIgKi8KKyNkZWZpbmUgQUNTX1VSQ09STkVSCU5DVVJTRVNfQUNTKCdrJykgLyogdXBwZXIgcmlnaHQgY29ybmVyICovCisjZGVmaW5lIEFDU19MUkNPUk5FUglOQ1VSU0VTX0FDUygnaicpIC8qIGxvd2VyIHJpZ2h0IGNvcm5lciAqLworI2RlZmluZSBBQ1NfTFRFRQlOQ1VSU0VTX0FDUygndCcpIC8qIHRlZSBwb2ludGluZyByaWdodCAqLworI2RlZmluZSBBQ1NfUlRFRQlOQ1VSU0VTX0FDUygndScpIC8qIHRlZSBwb2ludGluZyBsZWZ0ICovCisjZGVmaW5lIEFDU19CVEVFCU5DVVJTRVNfQUNTKCd2JykgLyogdGVlIHBvaW50aW5nIHVwICovCisjZGVmaW5lIEFDU19UVEVFCU5DVVJTRVNfQUNTKCd3JykgLyogdGVlIHBvaW50aW5nIGRvd24gKi8KKyNkZWZpbmUgQUNTX0hMSU5FCU5DVVJTRVNfQUNTKCdxJykgLyogaG9yaXpvbnRhbCBsaW5lICovCisjZGVmaW5lIEFDU19WTElORQlOQ1VSU0VTX0FDUygneCcpIC8qIHZlcnRpY2FsIGxpbmUgKi8KKyNkZWZpbmUgQUNTX1BMVVMJTkNVUlNFU19BQ1MoJ24nKSAvKiBsYXJnZSBwbHVzIG9yIGNyb3Nzb3ZlciAqLworI2RlZmluZSBBQ1NfUzEJCU5DVVJTRVNfQUNTKCdvJykgLyogc2NhbiBsaW5lIDEgKi8KKyNkZWZpbmUgQUNTX1M5CQlOQ1VSU0VTX0FDUygncycpIC8qIHNjYW4gbGluZSA5ICovCisjZGVmaW5lIEFDU19ESUFNT05ECU5DVVJTRVNfQUNTKCdgJykgLyogZGlhbW9uZCAqLworI2RlZmluZSBBQ1NfQ0tCT0FSRAlOQ1VSU0VTX0FDUygnYScpIC8qIGNoZWNrZXIgYm9hcmQgKHN0aXBwbGUpICovCisjZGVmaW5lIEFDU19ERUdSRUUJTkNVUlNFU19BQ1MoJ2YnKSAvKiBkZWdyZWUgc3ltYm9sICovCisjZGVmaW5lIEFDU19QTE1JTlVTCU5DVVJTRVNfQUNTKCdnJykgLyogcGx1cy9taW51cyAqLworI2RlZmluZSBBQ1NfQlVMTEVUCU5DVVJTRVNfQUNTKCd+JykgLyogYnVsbGV0ICovCisvKiBUZWxldHlwZSA1NDEwdjEgc3ltYm9scyBiZWdpbiBoZXJlICovCisjZGVmaW5lIEFDU19MQVJST1cJTkNVUlNFU19BQ1MoJywnKSAvKiBhcnJvdyBwb2ludGluZyBsZWZ0ICovCisjZGVmaW5lIEFDU19SQVJST1cJTkNVUlNFU19BQ1MoJysnKSAvKiBhcnJvdyBwb2ludGluZyByaWdodCAqLworI2RlZmluZSBBQ1NfREFSUk9XCU5DVVJTRVNfQUNTKCcuJykgLyogYXJyb3cgcG9pbnRpbmcgZG93biAqLworI2RlZmluZSBBQ1NfVUFSUk9XCU5DVVJTRVNfQUNTKCctJykgLyogYXJyb3cgcG9pbnRpbmcgdXAgKi8KKyNkZWZpbmUgQUNTX0JPQVJECU5DVVJTRVNfQUNTKCdoJykgLyogYm9hcmQgb2Ygc3F1YXJlcyAqLworI2RlZmluZSBBQ1NfTEFOVEVSTglOQ1VSU0VTX0FDUygnaScpIC8qIGxhbnRlcm4gc3ltYm9sICovCisjZGVmaW5lIEFDU19CTE9DSwlOQ1VSU0VTX0FDUygnMCcpIC8qIHNvbGlkIHNxdWFyZSBibG9jayAqLworLyoKKyAqIFRoZXNlIGFyZW4ndCBkb2N1bWVudGVkLCBidXQgYSBsb3Qgb2YgU3lzdGVtIFZzIGhhdmUgdGhlbSBhbnl3YXkKKyAqICh5b3UgY2FuIHNwb3QgcHBycnl5enp7e3x8fX0gaW4gYSBsb3Qgb2YgQVQmVCB0ZXJtaW5mbyBzdHJpbmdzKS4KKyAqIFRoZSBBQ1NfbmFtZXMgbWF5IG5vdCBtYXRjaCBBVCZUJ3MsIG91ciBzb3VyY2UgZGlkbid0IGtub3cgdGhlbS4KKyAqLworI2RlZmluZSBBQ1NfUzMJCU5DVVJTRVNfQUNTKCdwJykgLyogc2NhbiBsaW5lIDMgKi8KKyNkZWZpbmUgQUNTX1M3CQlOQ1VSU0VTX0FDUygncicpIC8qIHNjYW4gbGluZSA3ICovCisjZGVmaW5lIEFDU19MRVFVQUwJTkNVUlNFU19BQ1MoJ3knKSAvKiBsZXNzL2VxdWFsICovCisjZGVmaW5lIEFDU19HRVFVQUwJTkNVUlNFU19BQ1MoJ3onKSAvKiBncmVhdGVyL2VxdWFsICovCisjZGVmaW5lIEFDU19QSQkJTkNVUlNFU19BQ1MoJ3snKSAvKiBQaSAqLworI2RlZmluZSBBQ1NfTkVRVUFMCU5DVVJTRVNfQUNTKCd8JykgLyogbm90IGVxdWFsICovCisjZGVmaW5lIEFDU19TVEVSTElORwlOQ1VSU0VTX0FDUygnfScpIC8qIFVLIHBvdW5kIHNpZ24gKi8KKworLyoKKyAqIExpbmUgZHJhd2luZyBBQ1MgbmFtZXMgYXJlIG9mIHRoZSBmb3JtIEFDU190cmJsLCB3aGVyZSB0IGlzIHRoZSB0b3AsIHIKKyAqIGlzIHRoZSByaWdodCwgYiBpcyB0aGUgYm90dG9tLCBhbmQgbCBpcyB0aGUgbGVmdC4gIHQsIHIsIGIsIGFuZCBsIG1pZ2h0CisgKiBiZSBCIChibGFuayksIFMgKHNpbmdsZSksIEQgKGRvdWJsZSksIG9yIFQgKHRoaWNrKS4gIFRoZSBzdWJzZXQgZGVmaW5lZAorICogaGVyZSBvbmx5IHVzZXMgQiBhbmQgUy4KKyAqLworI2RlZmluZSBBQ1NfQlNTQglBQ1NfVUxDT1JORVIKKyNkZWZpbmUgQUNTX1NTQkIJQUNTX0xMQ09STkVSCisjZGVmaW5lIEFDU19CQlNTCUFDU19VUkNPUk5FUgorI2RlZmluZSBBQ1NfU0JCUwlBQ1NfTFJDT1JORVIKKyNkZWZpbmUgQUNTX1NCU1MJQUNTX1JURUUKKyNkZWZpbmUgQUNTX1NTU0IJQUNTX0xURUUKKyNkZWZpbmUgQUNTX1NTQlMJQUNTX0JURUUKKyNkZWZpbmUgQUNTX0JTU1MJQUNTX1RURUUKKyNkZWZpbmUgQUNTX0JTQlMJQUNTX0hMSU5FCisjZGVmaW5lIEFDU19TQlNCCUFDU19WTElORQorI2RlZmluZSBBQ1NfU1NTUwlBQ1NfUExVUworCisjdW5kZWYJRVJSCisjZGVmaW5lIEVSUiAgICAgKC0xKQorCisjdW5kZWYJT0sKKyNkZWZpbmUgT0sgICAgICAoMCkKKworLyogdmFsdWVzIGZvciB0aGUgX2ZsYWdzIG1lbWJlciAqLworI2RlZmluZSBfU1VCV0lOICAgICAgICAgMHgwMQkvKiBpcyB0aGlzIGEgc3ViLXdpbmRvdz8gKi8KKyNkZWZpbmUgX0VORExJTkUgICAgICAgIDB4MDIJLyogaXMgdGhlIHdpbmRvdyBmbHVzaCByaWdodD8gKi8KKyNkZWZpbmUgX0ZVTExXSU4gICAgICAgIDB4MDQJLyogaXMgdGhlIHdpbmRvdyBmdWxsLXNjcmVlbj8gKi8KKyNkZWZpbmUgX1NDUk9MTFdJTiAgICAgIDB4MDgJLyogYm90dG9tIGVkZ2UgaXMgYXQgc2NyZWVuIGJvdHRvbT8gKi8KKyNkZWZpbmUgX0lTUEFECSAgICAgICAgMHgxMAkvKiBpcyB0aGlzIHdpbmRvdyBhIHBhZD8gKi8KKyNkZWZpbmUgX0hBU01PVkVEICAgICAgIDB4MjAJLyogaGFzIGN1cnNvciBtb3ZlZCBzaW5jZSBsYXN0IHJlZnJlc2g/ICovCisjZGVmaW5lIF9XUkFQUEVEICAgICAgICAweDQwCS8qIGN1cnNvciB3YXMganVzdCB3cmFwcHBlZCAqLworCisvKgorICogdGhpcyB2YWx1ZSBpcyB1c2VkIGluIHRoZSBmaXJzdGNoYXIgYW5kIGxhc3RjaGFyIGZpZWxkcyB0byBtYXJrCisgKiB1bmNoYW5nZWQgbGluZXMKKyAqLworI2RlZmluZSBfTk9DSEFOR0UgICAgICAgLTEKKworLyoKKyAqIHRoaXMgdmFsdWUgaXMgdXNlZCBpbiB0aGUgb2xkaW5kZXggZmllbGQgdG8gbWFyayBsaW5lcyBjcmVhdGVkIGJ5IGluc2VydGlvbnMKKyAqIGFuZCBzY3JvbGxzLgorICovCisjZGVmaW5lIF9ORVdJTkRFWAktMQorCit0eXBlZGVmIHN0cnVjdCBzY3JlZW4gIFNDUkVFTjsKK3R5cGVkZWYgc3RydWN0IF93aW5fc3QgV0lORE9XOworCit0eXBlZGVmCWNodHlwZQlhdHRyX3Q7CQkvKiAuLi5tdXN0IGJlIGF0IGxlYXN0IGFzIHdpZGUgYXMgY2h0eXBlICovCisKKyNpZmRlZiBOQ1VSU0VTX1dJREVDSEFSCisKKyNpZiAwCisjaWZkZWYgbWJsZW4JCQkvKiBsaWJ1dGY4LmggZGVmaW5lcyBpdCB3L28gdW5kZWZpbmluZyBmaXJzdCAqLworI3VuZGVmIG1ibGVuCisjZW5kaWYKKyNpbmNsdWRlIDxsaWJ1dGY4Lmg+CisjZW5kaWYKKworI2lmIDAKKyNpbmNsdWRlIDx3Y2hhci5oPgkJLyogLi4udG8gZ2V0IG1ic3RhdGVfdCwgZXRjLiAqLworI2VuZGlmCisKKyNpZiAwCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHdjaGFyX3Q7CisjZW5kaWYKKworI2lmIDAKK3R5cGVkZWYgdW5zaWduZWQgaW50IHdpbnRfdDsKKyNlbmRpZgorCisvKgorICogY2NoYXJfdCBzdG9yZXMgYW4gYXJyYXkgb2YgQ0NIQVJXX01BWCB3aWRlIGNoYXJhY3RlcnMuICBUaGUgZmlyc3QgaXMKKyAqIG5vcm1hbGx5IGEgc3BhY2luZyBjaGFyYWN0ZXIuICBUaGUgb3RoZXJzIGFyZSBub24tc3BhY2luZy4gIElmIHRob3NlCisgKiAoc3BhY2luZyBhbmQgbm9uc3BhY2luZykgZG8gbm90IGZpbGwgdGhlIGFycmF5LCBhIG51bGwgTCdcMCcgZm9sbG93cy4gCisgKiBPdGhlcndpc2UsIGEgbnVsbCBpcyBhc3N1bWVkIHRvIGZvbGxvdyB3aGVuIGV4dHJhY3RpbmcgdmlhIGdldGNjaGFyKCkuCisgKi8KKyNkZWZpbmUgQ0NIQVJXX01BWAk1Cit0eXBlZGVmIHN0cnVjdAoreworICAgIGF0dHJfdAlhdHRyOworICAgIHdjaGFyX3QJY2hhcnNbQ0NIQVJXX01BWF07CisjaWYgMAorI3VuZGVmIE5DVVJTRVNfRVhUX0NPTE9SUworI2RlZmluZSBOQ1VSU0VTX0VYVF9DT0xPUlMgMjAxMTA0MDQKKyAgICBpbnQJCWV4dF9jb2xvcjsJLyogY29sb3IgcGFpciwgbXVzdCBiZSBtb3JlIHRoYW4gMTYtYml0cyAqLworI2VuZGlmCit9CitjY2hhcl90OworCisjZW5kaWYgLyogTkNVUlNFU19XSURFQ0hBUiAqLworCisjaWYgIU5DVVJTRVNfT1BBUVVFCitzdHJ1Y3QgbGRhdDsKKworc3RydWN0IF93aW5fc3QKK3sKKwlOQ1VSU0VTX1NJWkVfVCBfY3VyeSwgX2N1cng7IC8qIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uICovCisKKwkvKiB3aW5kb3cgbG9jYXRpb24gYW5kIHNpemUgKi8KKwlOQ1VSU0VTX1NJWkVfVCBfbWF4eSwgX21heHg7IC8qIG1heGltdW1zIG9mIHggYW5kIHksIE5PVCB3aW5kb3cgc2l6ZSAqLworCU5DVVJTRVNfU0laRV9UIF9iZWd5LCBfYmVneDsgLyogc2NyZWVuIGNvb3JkcyBvZiB1cHBlci1sZWZ0LWhhbmQgY29ybmVyICovCisKKwlzaG9ydCAgIF9mbGFnczsJCS8qIHdpbmRvdyBzdGF0ZSBmbGFncyAqLworCisJLyogYXR0cmlidXRlIHRyYWNraW5nICovCisJYXR0cl90ICBfYXR0cnM7CQkvKiBjdXJyZW50IGF0dHJpYnV0ZSBmb3Igbm9uLXNwYWNlIGNoYXJhY3RlciAqLworCWNodHlwZSAgX2JrZ2Q7CQkvKiBjdXJyZW50IGJhY2tncm91bmQgY2hhci9hdHRyaWJ1dGUgcGFpciAqLworCisJLyogb3B0aW9uIHZhbHVlcyBzZXQgYnkgdXNlciAqLworCWJvb2wJX25vdGltZW91dDsJLyogbm8gdGltZSBvdXQgb24gZnVuY3Rpb24ta2V5IGVudHJ5PyAqLworCWJvb2wJX2NsZWFyOwkJLyogY29uc2lkZXIgYWxsIGRhdGEgaW4gdGhlIHdpbmRvdyBpbnZhbGlkPyAqLworCWJvb2wJX2xlYXZlb2s7CS8qIE9LIHRvIG5vdCByZXNldCBjdXJzb3Igb24gZXhpdD8gKi8KKwlib29sCV9zY3JvbGw7CS8qIE9LIHRvIHNjcm9sbCB0aGlzIHdpbmRvdz8gKi8KKwlib29sCV9pZGxvazsJCS8qIE9LIHRvIHVzZSBpbnNlcnQvZGVsZXRlIGxpbmU/ICovCisJYm9vbAlfaWRjb2s7CQkvKiBPSyB0byB1c2UgaW5zZXJ0L2RlbGV0ZSBjaGFyPyAqLworCWJvb2wJX2ltbWVkOwkJLyogd2luZG93IGluIGltbWVkIG1vZGU/IChub3QgeWV0IHVzZWQpICovCisJYm9vbAlfc3luYzsJCS8qIHdpbmRvdyBpbiBzeW5jIG1vZGU/ICovCisJYm9vbAlfdXNlX2tleXBhZDsJLyogcHJvY2VzcyBmdW5jdGlvbiBrZXlzIGludG8gS0VZXyBzeW1ib2xzPyAqLworCWludAlfZGVsYXk7CQkvKiAwID0gbm9kZWxheSwgPDAgPSBibG9ja2luZywgPjAgPSBkZWxheSAqLworCisJc3RydWN0IGxkYXQgKl9saW5lOwkvKiB0aGUgYWN0dWFsIGxpbmUgZGF0YSAqLworCisJLyogZ2xvYmFsIHNjcmVlbiBzdGF0ZSAqLworCU5DVVJTRVNfU0laRV9UIF9yZWd0b3A7CS8qIHRvcCBsaW5lIG9mIHNjcm9sbGluZyByZWdpb24gKi8KKwlOQ1VSU0VTX1NJWkVfVCBfcmVnYm90dG9tOyAvKiBib3R0b20gbGluZSBvZiBzY3JvbGxpbmcgcmVnaW9uICovCisKKwkvKiB0aGVzZSBhcmUgdXNlZCBvbmx5IGlmIHRoaXMgaXMgYSBzdWItd2luZG93ICovCisJaW50CV9wYXJ4OwkJLyogeCBjb29yZGluYXRlIG9mIHRoaXMgd2luZG93IGluIHBhcmVudCAqLworCWludAlfcGFyeTsJCS8qIHkgY29vcmRpbmF0ZSBvZiB0aGlzIHdpbmRvdyBpbiBwYXJlbnQgKi8KKwlXSU5ET1cJKl9wYXJlbnQ7CS8qIHBvaW50ZXIgdG8gcGFyZW50IGlmIGEgc3ViLXdpbmRvdyAqLworCisJLyogdGhlc2UgYXJlIHVzZWQgb25seSBpZiB0aGlzIGlzIGEgcGFkICovCisJc3RydWN0IHBkYXQKKwl7CisJICAgIE5DVVJTRVNfU0laRV9UIF9wYWRfeSwgICAgICBfcGFkX3g7CisJICAgIE5DVVJTRVNfU0laRV9UIF9wYWRfdG9wLCAgICBfcGFkX2xlZnQ7CisJICAgIE5DVVJTRVNfU0laRV9UIF9wYWRfYm90dG9tLCBfcGFkX3JpZ2h0OworCX0gX3BhZDsKKworCU5DVVJTRVNfU0laRV9UIF95b2Zmc2V0OyAvKiByZWFsIGJlZ3kgaXMgX2JlZ3kgKyBfeW9mZnNldCAqLworCisjaWZkZWYgTkNVUlNFU19XSURFQ0hBUgorCWNjaGFyX3QgIF9ia2dybmQ7CS8qIGN1cnJlbnQgYmFja2dyb3VuZCBjaGFyL2F0dHJpYnV0ZSBwYWlyICovCisjaWYgMAorCWludAlfY29sb3I7CQkvKiBjdXJyZW50IGNvbG9yLXBhaXIgZm9yIG5vbi1zcGFjZSBjaGFyYWN0ZXIgKi8KKyNlbmRpZgorI2VuZGlmCit9OworI2VuZGlmIC8qIE5DVVJTRVNfT1BBUVVFICovCisKKy8qCisgKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiB0byBzdXBwb3J0IGV2ZW50cy4uLgorICovCisjaWYgMQorI2lmZGVmIE5DVVJTRVNfV0dFVENIX0VWRU5UUworI2lmICFkZWZpbmVkKF9fQkVPU19fKSB8fCBkZWZpbmVkKF9fSEFJS1VfXykKKyAgIC8qIEZpeCBfbmNfdGltZWRfd2FpdCgpIG9uIEJFT1MuLi4gKi8KKyMgIGRlZmluZSBOQ1VSU0VTX0VWRU5UX1ZFUlNJT04JMQorI2VuZGlmCS8qICFkZWZpbmVkKF9fQkVPU19fKSAqLworCisvKgorICogQml0cyB0byBzZXQgaW4gX25jX2V2ZW50LmRhdGEuZmxhZ3MKKyAqLworIyAgZGVmaW5lIF9OQ19FVkVOVF9USU1FT1VUX01TRUMJMQorIyAgZGVmaW5lIF9OQ19FVkVOVF9GSUxFCQkyCisjICBkZWZpbmUgX05DX0VWRU5UX0ZJTEVfUkVBREFCTEUJMgorIyAgaWYgMAkJCQkJLyogTm90IHN1cHBvcnRlZCB5ZXQuLi4gKi8KKyMgICAgZGVmaW5lIF9OQ19FVkVOVF9GSUxFX1dSSVRBQkxFCTQKKyMgICAgZGVmaW5lIF9OQ19FVkVOVF9GSUxFX0VYQ0VQVElPTgk4CisjICBlbmRpZgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCB0eXBlOworICAgIHVuaW9uCisgICAgeworCWxvbmcgdGltZW91dF9tc2VjOwkvKiBfTkNfRVZFTlRfVElNRU9VVF9NU0VDICovCisJc3RydWN0CisJeworCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3M7CisJICAgIGludCBmZDsKKwkgICAgdW5zaWduZWQgaW50IHJlc3VsdDsKKwl9IGZldjsJCQkJLyogX05DX0VWRU5UX0ZJTEUgKi8KKyAgICB9IGRhdGE7Cit9IF9uY19ldmVudDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgY291bnQ7CisgICAgaW50IHJlc3VsdF9mbGFnczsJLyogX05DX0VWRU5UX1RJTUVPVVRfTVNFQyBvciBfTkNfRVZFTlRfRklMRV9SRUFEQUJMRSAqLworICAgIF9uY19ldmVudCAqZXZlbnRzWzFdOworfSBfbmNfZXZlbnRsaXN0OworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3Z2V0Y2hfZXZlbnRzIChXSU5ET1cgKiwgX25jX2V2ZW50bGlzdCAqKTsJLyogZXhwZXJpbWVudGFsICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3Z2V0bnN0cl9ldmVudHMgKFdJTkRPVyAqLGNoYXIgKixpbnQsX25jX2V2ZW50bGlzdCAqKTsvKiBleHBlcmltZW50YWwgKi8KKworI2VuZGlmIC8qIE5DVVJTRVNfV0dFVENIX0VWRU5UUyAqLworI2VuZGlmIC8qIE5DVVJTRVNfRVhUX0ZVTkNTICovCisKKy8qCisgKiBHQ0MgKGFuZCBzb21lIG90aGVyIGNvbXBpbGVycykgZGVmaW5lICdfX2F0dHJpYnV0ZV9fJzsgd2UncmUgdXNpbmcgdGhpcworICogbWFjcm8gdG8gYWxlcnQgdGhlIGNvbXBpbGVyIHRvIGZsYWcgaW5jb25zaXN0ZW5jaWVzIGluIHByaW50Zi9zY2FuZi1saWtlCisgKiBmdW5jdGlvbiBjYWxscy4gIEp1c3QgaW4gY2FzZSAnX19hdHRyaWJ1dGVfXycgaXNuJ3QgZGVmaW5lZCwgbWFrZSBhIGR1bW15LgorICogT2xkIHZlcnNpb25zIG9mIEcrKyBkbyBub3QgYWNjZXB0IGl0IGFueXdheSwgYXQgbGVhc3Qgbm90IGNvbnNpc3RlbnRseSB3aXRoCisgKiBHQ0MuCisgKi8KKyNpZiAhKGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19HTlVHX18pIHx8IGRlZmluZWQoX19hdHRyaWJ1dGVfXykpCisjZGVmaW5lIF9fYXR0cmlidXRlX18ocCkgLyogbm90aGluZyAqLworI2VuZGlmCisKKy8qCisgKiBXZSBjYW5ub3QgZGVmaW5lIHRoZXNlIGluIG5jdXJzZXNfY2ZnLmgsIHNpbmNlIHRoZXkgcmVxdWlyZSBwYXJhbWV0ZXJzIHRvIGJlCisgKiBwYXNzZWQgKHRoYXQgaXMgbm9uLXBvcnRhYmxlKS4gIElmIHlvdSBoYXBwZW4gdG8gYmUgdXNpbmcgZ2NjIHdpdGggd2FybmluZ3MKKyAqIGVuYWJsZWQsIGRlZmluZQorICoJR0NDX1BSSU5URgorICoJR0NDX1NDQU5GCisgKiB0byBpbXByb3ZlIGNoZWNraW5nIG9mIGNhbGxzIHRvIHByaW50dygpLCBldGMuCisgKi8KKyNpZm5kZWYgR0NDX1BSSU5URkxJS0UKKyNpZiBkZWZpbmVkKEdDQ19QUklOVEYpICYmICFkZWZpbmVkKHByaW50ZikKKyNkZWZpbmUgR0NDX1BSSU5URkxJS0UoZm10LHZhcikgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZixmbXQsdmFyKSkpCisjZWxzZQorI2RlZmluZSBHQ0NfUFJJTlRGTElLRShmbXQsdmFyKSAvKm5vdGhpbmcqLworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBHQ0NfU0NBTkZMSUtFCisjaWYgZGVmaW5lZChHQ0NfU0NBTkYpICYmICFkZWZpbmVkKHNjYW5mKQorI2RlZmluZSBHQ0NfU0NBTkZMSUtFKGZtdCx2YXIpICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQoc2NhbmYsZm10LHZhcikpKQorI2Vsc2UKKyNkZWZpbmUgR0NDX1NDQU5GTElLRShmbXQsdmFyKSAgLypub3RoaW5nKi8KKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYJR0NDX05PUkVUVVJOCisjZGVmaW5lCUdDQ19OT1JFVFVSTiAvKiBub3RoaW5nICovCisjZW5kaWYKKworI2lmbmRlZglHQ0NfVU5VU0VECisjZGVmaW5lCUdDQ19VTlVTRUQgLyogbm90aGluZyAqLworI2VuZGlmCisKKy8qCisgKiBDdXJzZXMgdXNlcyBhIGhlbHBlciBmdW5jdGlvbi4gIERlZmluZSBvdXIgdHlwZSBmb3IgdGhpcyB0byBzaW1wbGlmeQorICogZXh0ZW5kaW5nIGl0IGZvciB0aGUgc3AtZnVuY3MgZmVhdHVyZS4KKyAqLwordHlwZWRlZiBpbnQgKCpOQ1VSU0VTX09VVEMpKGludCk7CisKKy8qCisgKiBGdW5jdGlvbiBwcm90b3R5cGVzLiAgVGhpcyBpcyB0aGUgY29tcGxldGUgWC9PcGVuIEN1cnNlcyBsaXN0IG9mIHJlcXVpcmVkCisgKiBmdW5jdGlvbnMuICBUaG9zZSBtYXJrZWQgYGdlbmVyYXRlZCcgd2lsbCBoYXZlIHNvdXJjZXMgZ2VuZXJhdGVkIGZyb20gdGhlCisgKiBtYWNybyBkZWZpbml0aW9ucyBsYXRlciBpbiB0aGlzIGZpbGUsIGluIG9yZGVyIHRvIHNhdGlzZnkgWFBHNC4yCisgKiByZXF1aXJlbWVudHMuCisgKi8KKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgYWRkY2ggKGNvbnN0IGNodHlwZSk7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBhZGRjaG5zdHIgKGNvbnN0IGNodHlwZSAqLCBpbnQpOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBhZGRjaHN0ciAoY29uc3QgY2h0eXBlICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgYWRkbnN0ciAoY29uc3QgY2hhciAqLCBpbnQpOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgYWRkc3RyIChjb25zdCBjaGFyICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgYXR0cm9mZiAoTkNVUlNFU19BVFRSX1QpOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgYXR0cm9uIChOQ1VSU0VTX0FUVFJfVCk7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBhdHRyc2V0IChOQ1VSU0VTX0FUVFJfVCk7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBhdHRyX2dldCAoYXR0cl90ICosIHNob3J0ICosIHZvaWQgKik7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgYXR0cl9vZmYgKGF0dHJfdCwgdm9pZCAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGF0dHJfb24gKGF0dHJfdCwgdm9pZCAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGF0dHJfc2V0IChhdHRyX3QsIHNob3J0LCB2b2lkICopOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBiYXVkcmF0ZSAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBiZWVwICAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBia2dkIChjaHR5cGUpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBia2dkc2V0IChjaHR5cGUpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGJvcmRlciAoY2h0eXBlLGNodHlwZSxjaHR5cGUsY2h0eXBlLGNodHlwZSxjaHR5cGUsY2h0eXBlLGNodHlwZSk7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgYm94IChXSU5ET1cgKiwgY2h0eXBlLCBjaHR5cGUpOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgY2FuX2NoYW5nZV9jb2xvciAodm9pZCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGNicmVhayAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBjaGdhdCAoaW50LCBhdHRyX3QsIHNob3J0LCBjb25zdCB2b2lkICopOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGNsZWFyICh2b2lkKTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBjbGVhcm9rIChXSU5ET1cgKixib29sKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgY2xydG9ib3QgKHZvaWQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGNscnRvZW9sICh2b2lkKTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBjb2xvcl9jb250ZW50IChzaG9ydCxzaG9ydCosc2hvcnQqLHNob3J0Kik7CS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBjb2xvcl9zZXQgKHNob3J0LHZvaWQqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIENPTE9SX1BBSVIgKGludCk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgY29weXdpbiAoY29uc3QgV0lORE9XKixXSU5ET1cqLGludCxpbnQsaW50LGludCxpbnQsaW50LGludCk7CS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBjdXJzX3NldCAoaW50KTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGRlZl9wcm9nX21vZGUgKHZvaWQpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBkZWZfc2hlbGxfbW9kZSAodm9pZCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGRlbGF5X291dHB1dCAoaW50KTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGRlbGNoICh2b2lkKTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgZGVsc2NyZWVuIChTQ1JFRU4gKik7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGRlbHdpbiAoV0lORE9XICopOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZGVsZXRlbG4gKHZvaWQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChXSU5ET1cgKikgZGVyd2luIChXSU5ET1cgKixpbnQsaW50LGludCxpbnQpOwkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZG91cGRhdGUgKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyAqKSBkdXB3aW4gKFdJTkRPVyAqKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZWNobyAodm9pZCk7CQkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZWNob2NoYXIgKGNvbnN0IGNodHlwZSk7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBlcmFzZSAodm9pZCk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZW5kd2luICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyKSBlcmFzZWNoYXIgKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIGZpbHRlciAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBmbGFzaCAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBmbHVzaGlucCAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2h0eXBlKSBnZXRia2dkIChXSU5ET1cgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBnZXRjaCAodm9pZCk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZ2V0bnN0ciAoY2hhciAqLCBpbnQpOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZ2V0c3RyIChjaGFyICopOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChXSU5ET1cgKikgZ2V0d2luIChGSUxFICopOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBoYWxmZGVsYXkgKGludCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgaGFzX2NvbG9ycyAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgaGFzX2ljICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBoYXNfaWwgKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgaGxpbmUgKGNodHlwZSwgaW50KTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgaWRjb2sgKFdJTkRPVyAqLCBib29sKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgaWRsb2sgKFdJTkRPVyAqLCBib29sKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIGltbWVkb2sgKFdJTkRPVyAqLCBib29sKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNodHlwZSkgaW5jaCAodm9pZCk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgaW5jaG5zdHIgKGNodHlwZSAqLCBpbnQpOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgaW5jaHN0ciAoY2h0eXBlICopOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChXSU5ET1cgKikgaW5pdHNjciAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBpbml0X2NvbG9yIChzaG9ydCxzaG9ydCxzaG9ydCxzaG9ydCk7CS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBpbml0X3BhaXIgKHNob3J0LHNob3J0LHNob3J0KTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBpbm5zdHIgKGNoYXIgKiwgaW50KTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGluc2NoIChjaHR5cGUpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGluc2RlbGxuIChpbnQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGluc2VydGxuICh2b2lkKTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBpbnNuc3RyIChjb25zdCBjaGFyICosIGludCk7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBpbnNzdHIgKGNvbnN0IGNoYXIgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBpbnN0ciAoY2hhciAqKTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBpbnRyZmx1c2ggKFdJTkRPVyAqLGJvb2wpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgaXNlbmR3aW4gKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIGlzX2xpbmV0b3VjaGVkIChXSU5ET1cgKixpbnQpOwkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBpc193aW50b3VjaGVkIChXSU5ET1cgKik7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChOQ1VSU0VTX0NPTlNUIGNoYXIgKikga2V5bmFtZSAoaW50KTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBrZXlwYWQgKFdJTkRPVyAqLGJvb2wpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhcikga2lsbGNoYXIgKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbGVhdmVvayAoV0lORE9XICosYm9vbCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIGxvbmduYW1lICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG1ldGEgKFdJTkRPVyAqLGJvb2wpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtb3ZlIChpbnQsIGludCk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZhZGRjaCAoaW50LCBpbnQsIGNvbnN0IGNodHlwZSk7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12YWRkY2huc3RyIChpbnQsIGludCwgY29uc3QgY2h0eXBlICosIGludCk7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZhZGRjaHN0ciAoaW50LCBpbnQsIGNvbnN0IGNodHlwZSAqKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmFkZG5zdHIgKGludCwgaW50LCBjb25zdCBjaGFyICosIGludCk7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZhZGRzdHIgKGludCwgaW50LCBjb25zdCBjaGFyICopOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmNoZ2F0IChpbnQsIGludCwgaW50LCBhdHRyX3QsIHNob3J0LCBjb25zdCB2b2lkICopOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12Y3VyIChpbnQsaW50LGludCxpbnQpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmRlbGNoIChpbnQsIGludCk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZkZXJ3aW4gKFdJTkRPVyAqLCBpbnQsIGludCk7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZnZXRjaCAoaW50LCBpbnQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12Z2V0bnN0ciAoaW50LCBpbnQsIGNoYXIgKiwgaW50KTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZnZXRzdHIgKGludCwgaW50LCBjaGFyICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZobGluZSAoaW50LCBpbnQsIGNodHlwZSwgaW50KTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNodHlwZSkgbXZpbmNoIChpbnQsIGludCk7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmluY2huc3RyIChpbnQsIGludCwgY2h0eXBlICosIGludCk7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZpbmNoc3RyIChpbnQsIGludCwgY2h0eXBlICopOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmlubnN0ciAoaW50LCBpbnQsIGNoYXIgKiwgaW50KTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZpbnNjaCAoaW50LCBpbnQsIGNodHlwZSk7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmluc25zdHIgKGludCwgaW50LCBjb25zdCBjaGFyICosIGludCk7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZpbnNzdHIgKGludCwgaW50LCBjb25zdCBjaGFyICopOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmluc3RyIChpbnQsIGludCwgY2hhciAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12cHJpbnR3IChpbnQsaW50LCBjb25zdCBjaGFyICosLi4uKQkJLyogaW1wbGVtZW50ZWQgKi8KKwkJR0NDX1BSSU5URkxJS0UoMyw0KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12c2NhbncgKGludCxpbnQsIE5DVVJTRVNfQ09OU1QgY2hhciAqLC4uLikJLyogaW1wbGVtZW50ZWQgKi8KKwkJR0NDX1NDQU5GTElLRSgzLDQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ2bGluZSAoaW50LCBpbnQsIGNodHlwZSwgaW50KTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3YWRkY2ggKFdJTkRPVyAqLCBpbnQsIGludCwgY29uc3QgY2h0eXBlKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndhZGRjaG5zdHIgKFdJTkRPVyAqLCBpbnQsIGludCwgY29uc3QgY2h0eXBlICosIGludCk7LyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndhZGRjaHN0ciAoV0lORE9XICosIGludCwgaW50LCBjb25zdCBjaHR5cGUgKik7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3YWRkbnN0ciAoV0lORE9XICosIGludCwgaW50LCBjb25zdCBjaGFyICosIGludCk7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3YWRkc3RyIChXSU5ET1cgKiwgaW50LCBpbnQsIGNvbnN0IGNoYXIgKik7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3Y2hnYXQgKFdJTkRPVyAqLCBpbnQsIGludCwgaW50LCBhdHRyX3QsIHNob3J0LCBjb25zdCB2b2lkICopOy8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3ZGVsY2ggKFdJTkRPVyAqLCBpbnQsIGludCk7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12d2dldGNoIChXSU5ET1cgKiwgaW50LCBpbnQpOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndnZXRuc3RyIChXSU5ET1cgKiwgaW50LCBpbnQsIGNoYXIgKiwgaW50KTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndnZXRzdHIgKFdJTkRPVyAqLCBpbnQsIGludCwgY2hhciAqKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndobGluZSAoV0lORE9XICosIGludCwgaW50LCBjaHR5cGUsIGludCk7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3aW4gKFdJTkRPVyAqLGludCxpbnQpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2h0eXBlKSBtdndpbmNoIChXSU5ET1cgKiwgaW50LCBpbnQpOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3aW5jaG5zdHIgKFdJTkRPVyAqLCBpbnQsIGludCwgY2h0eXBlICosIGludCk7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3aW5jaHN0ciAoV0lORE9XICosIGludCwgaW50LCBjaHR5cGUgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12d2lubnN0ciAoV0lORE9XICosIGludCwgaW50LCBjaGFyICosIGludCk7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12d2luc2NoIChXSU5ET1cgKiwgaW50LCBpbnQsIGNodHlwZSk7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12d2luc25zdHIgKFdJTkRPVyAqLCBpbnQsIGludCwgY29uc3QgY2hhciAqLCBpbnQpOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12d2luc3N0ciAoV0lORE9XICosIGludCwgaW50LCBjb25zdCBjaGFyICopOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12d2luc3RyIChXSU5ET1cgKiwgaW50LCBpbnQsIGNoYXIgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12d3ByaW50dyAoV0lORE9XKixpbnQsaW50LCBjb25zdCBjaGFyICosLi4uKQkvKiBpbXBsZW1lbnRlZCAqLworCQlHQ0NfUFJJTlRGTElLRSg0LDUpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3c2NhbncgKFdJTkRPVyAqLGludCxpbnQsIE5DVVJTRVNfQ09OU1QgY2hhciAqLC4uLikJLyogaW1wbGVtZW50ZWQgKi8KKwkJR0NDX1NDQU5GTElLRSg0LDUpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3dmxpbmUgKFdJTkRPVyAqLGludCwgaW50LCBjaHR5cGUsIGludCk7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbmFwbXMgKGludCk7CQkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyAqKSBuZXdwYWQgKGludCxpbnQpOwkJICAgICAgIAkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFNDUkVFTiAqKSBuZXd0ZXJtIChOQ1VSU0VTX0NPTlNUIGNoYXIgKixGSUxFICosRklMRSAqKTsJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChXSU5ET1cgKikgbmV3d2luIChpbnQsaW50LGludCxpbnQpOwkgICAgICAgCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBubCAodm9pZCk7CQkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbm9jYnJlYWsgKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbm9kZWxheSAoV0lORE9XICosYm9vbCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG5vZWNobyAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBub25sICh2b2lkKTsJCQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgbm9xaWZsdXNoICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG5vcmF3ICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG5vdGltZW91dCAoV0lORE9XICosYm9vbCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG92ZXJsYXkgKGNvbnN0IFdJTkRPVyosV0lORE9XICopOwkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG92ZXJ3cml0ZSAoY29uc3QgV0lORE9XKixXSU5ET1cgKik7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgcGFpcl9jb250ZW50IChzaG9ydCxzaG9ydCosc2hvcnQqKTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBQQUlSX05VTUJFUiAoaW50KTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBwZWNob2NoYXIgKFdJTkRPVyAqLCBjb25zdCBjaHR5cGUpOwkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHBub3V0cmVmcmVzaCAoV0lORE9XKixpbnQsaW50LGludCxpbnQsaW50LGludCk7LyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHByZWZyZXNoIChXSU5ET1cgKixpbnQsaW50LGludCxpbnQsaW50LGludCk7CS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBwcmludHcgKGNvbnN0IGNoYXIgKiwuLi4pCQkJLyogaW1wbGVtZW50ZWQgKi8KKwkJR0NDX1BSSU5URkxJS0UoMSwyKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHB1dHdpbiAoV0lORE9XICosIEZJTEUgKik7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBxaWZsdXNoICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHJhdyAodm9pZCk7CQkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgcmVkcmF3d2luIChXSU5ET1cgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSByZWZyZXNoICh2b2lkKTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSByZXNldHR5ICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHJlc2V0X3Byb2dfbW9kZSAodm9pZCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHJlc2V0X3NoZWxsX21vZGUgKHZvaWQpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSByaXBvZmZsaW5lIChpbnQsIGludCAoKikoV0lORE9XICosIGludCkpOwkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc2F2ZXR0eSAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzY2FudyAoTkNVUlNFU19DT05TVCBjaGFyICosLi4uKQkJLyogaW1wbGVtZW50ZWQgKi8KKwkJR0NDX1NDQU5GTElLRSgxLDIpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc2NyX2R1bXAgKGNvbnN0IGNoYXIgKik7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNjcl9pbml0IChjb25zdCBjaGFyICopOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzY3JsIChpbnQpOwkJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzY3JvbGwgKFdJTkRPVyAqKTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzY3JvbGxvayAoV0lORE9XICosYm9vbCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNjcl9yZXN0b3JlIChjb25zdCBjaGFyICopOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzY3Jfc2V0IChjb25zdCBjaGFyICopOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzZXRzY3JyZWcgKGludCxpbnQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChTQ1JFRU4gKikgc2V0X3Rlcm0gKFNDUkVFTiAqKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc2xrX2F0dHJvZmYgKGNvbnN0IGNodHlwZSk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNsa19hdHRyX29mZiAoY29uc3QgYXR0cl90LCB2b2lkICopOwkJLyogZ2VuZXJhdGVkOldJREVDICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzbGtfYXR0cm9uIChjb25zdCBjaHR5cGUpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzbGtfYXR0cl9vbiAoYXR0cl90LHZvaWQqKTsJCQkvKiBnZW5lcmF0ZWQ6V0lERUMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNsa19hdHRyc2V0IChjb25zdCBjaHR5cGUpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYXR0cl90KSBzbGtfYXR0ciAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzbGtfYXR0cl9zZXQgKGNvbnN0IGF0dHJfdCxzaG9ydCx2b2lkKik7CS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzbGtfY2xlYXIgKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc2xrX2NvbG9yIChzaG9ydCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzbGtfaW5pdCAoaW50KTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIHNsa19sYWJlbCAoaW50KTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNsa19ub3V0cmVmcmVzaCAodm9pZCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNsa19yZWZyZXNoICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNsa19yZXN0b3JlICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNsa19zZXQgKGludCxjb25zdCBjaGFyICosaW50KTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzbGtfdG91Y2ggKHZvaWQpOwkgICAgICAJICAgICAgIAkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHN0YW5kb3V0ICh2b2lkKTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzdGFuZGVuZCAodm9pZCk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc3RhcnRfY29sb3IgKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyAqKSBzdWJwYWQgKFdJTkRPVyAqLCBpbnQsIGludCwgaW50LCBpbnQpOwkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyAqKSBzdWJ3aW4gKFdJTkRPVyAqLCBpbnQsIGludCwgaW50LCBpbnQpOwkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc3luY29rIChXSU5ET1cgKiwgYm9vbCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaHR5cGUpIHRlcm1hdHRycyAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSB0ZXJtbmFtZSAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgdGltZW91dCAoaW50KTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB0b3VjaGxpbmUgKFdJTkRPVyAqLCBpbnQsIGludCk7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHRvdWNod2luIChXSU5ET1cgKik7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdHlwZWFoZWFkIChpbnQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdW5nZXRjaCAoaW50KTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHVudG91Y2h3aW4gKFdJTkRPVyAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSB1c2VfZW52IChib29sKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHZpZGF0dHIgKGNodHlwZSk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB2aWRwdXRzIChjaHR5cGUsIE5DVVJTRVNfT1VUQyk7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdmxpbmUgKGNodHlwZSwgaW50KTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB2d3ByaW50dyAoV0lORE9XICosIGNvbnN0IGNoYXIgKix2YV9saXN0KTsJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHZ3X3ByaW50dyAoV0lORE9XICosIGNvbnN0IGNoYXIgKix2YV9saXN0KTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB2d3NjYW53IChXSU5ET1cgKiwgTkNVUlNFU19DT05TVCBjaGFyICosdmFfbGlzdCk7CS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB2d19zY2FudyAoV0lORE9XICosIE5DVVJTRVNfQ09OU1QgY2hhciAqLHZhX2xpc3QpOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdhZGRjaCAoV0lORE9XICosIGNvbnN0IGNodHlwZSk7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2FkZGNobnN0ciAoV0lORE9XICosY29uc3QgY2h0eXBlICosaW50KTsJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdhZGRjaHN0ciAoV0lORE9XICosY29uc3QgY2h0eXBlICopOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3YWRkbnN0ciAoV0lORE9XICosY29uc3QgY2hhciAqLGludCk7CS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3YWRkc3RyIChXSU5ET1cgKixjb25zdCBjaGFyICopOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3YXR0cm9uIChXSU5ET1cgKiwgaW50KTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdhdHRyb2ZmIChXSU5ET1cgKiwgaW50KTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdhdHRyc2V0IChXSU5ET1cgKiwgaW50KTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdhdHRyX2dldCAoV0lORE9XICosIGF0dHJfdCAqLCBzaG9ydCAqLCB2b2lkICopOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdhdHRyX29uIChXSU5ET1cgKiwgYXR0cl90LCB2b2lkICopOwkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdhdHRyX29mZiAoV0lORE9XICosIGF0dHJfdCwgdm9pZCAqKTsJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdhdHRyX3NldCAoV0lORE9XICosIGF0dHJfdCwgc2hvcnQsIHZvaWQgKik7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2JrZ2QgKFdJTkRPVyAqLCBjaHR5cGUpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgd2JrZ2RzZXQgKFdJTkRPVyAqLGNodHlwZSk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdib3JkZXIgKFdJTkRPVyAqLGNodHlwZSxjaHR5cGUsY2h0eXBlLGNodHlwZSxjaHR5cGUsY2h0eXBlLGNodHlwZSxjaHR5cGUpOwkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2NoZ2F0IChXSU5ET1cgKiwgaW50LCBhdHRyX3QsIHNob3J0LCBjb25zdCB2b2lkICopOy8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3Y2xlYXIgKFdJTkRPVyAqKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdjbHJ0b2JvdCAoV0lORE9XICopOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3Y2xydG9lb2wgKFdJTkRPVyAqKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2NvbG9yX3NldCAoV0lORE9XKixzaG9ydCx2b2lkKik7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIHdjdXJzeW5jdXAgKFdJTkRPVyAqKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2RlbGNoIChXSU5ET1cgKik7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3ZGVsZXRlbG4gKFdJTkRPVyAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdlY2hvY2hhciAoV0lORE9XICosIGNvbnN0IGNodHlwZSk7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2VyYXNlIChXSU5ET1cgKik7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3Z2V0Y2ggKFdJTkRPVyAqKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdnZXRuc3RyIChXSU5ET1cgKixjaGFyICosaW50KTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3Z2V0c3RyIChXSU5ET1cgKiwgY2hhciAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdobGluZSAoV0lORE9XICosIGNodHlwZSwgaW50KTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2h0eXBlKSB3aW5jaCAoV0lORE9XICopOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2luY2huc3RyIChXSU5ET1cgKiwgY2h0eXBlICosIGludCk7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2luY2hzdHIgKFdJTkRPVyAqLCBjaHR5cGUgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdpbm5zdHIgKFdJTkRPVyAqLCBjaGFyICosIGludCk7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2luc2NoIChXSU5ET1cgKiwgY2h0eXBlKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2luc2RlbGxuIChXSU5ET1cgKixpbnQpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3aW5zZXJ0bG4gKFdJTkRPVyAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdpbnNuc3RyIChXSU5ET1cgKiwgY29uc3QgY2hhciAqLGludCk7CS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3aW5zc3RyIChXSU5ET1cgKiwgY29uc3QgY2hhciAqKTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2luc3RyIChXSU5ET1cgKiwgY2hhciAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdtb3ZlIChXSU5ET1cgKixpbnQsaW50KTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd25vdXRyZWZyZXNoIChXSU5ET1cgKik7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdwcmludHcgKFdJTkRPVyAqLCBjb25zdCBjaGFyICosLi4uKQkJLyogaW1wbGVtZW50ZWQgKi8KKwkJR0NDX1BSSU5URkxJS0UoMiwzKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdyZWRyYXdsbiAoV0lORE9XICosaW50LGludCk7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd3JlZnJlc2ggKFdJTkRPVyAqKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdzY2FudyAoV0lORE9XICosIE5DVVJTRVNfQ09OU1QgY2hhciAqLC4uLikJLyogaW1wbGVtZW50ZWQgKi8KKwkJR0NDX1NDQU5GTElLRSgyLDMpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd3NjcmwgKFdJTkRPVyAqLGludCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdzZXRzY3JyZWcgKFdJTkRPVyAqLGludCxpbnQpOwkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdzdGFuZG91dCAoV0lORE9XICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd3N0YW5kZW5kIChXSU5ET1cgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgd3N5bmNkb3duIChXSU5ET1cgKik7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSB3c3luY3VwIChXSU5ET1cgKik7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgd3RpbWVvdXQgKFdJTkRPVyAqLGludCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHd0b3VjaGxuIChXSU5ET1cgKixpbnQsaW50LGludCk7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd3ZsaW5lIChXSU5ET1cgKixjaHR5cGUsaW50KTsJCS8qIGltcGxlbWVudGVkICovCisKKy8qCisgKiBUaGVzZSBhcmUgYWxzbyBkZWNsYXJlZCBpbiA8dGVybS5oPjoKKyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdGlnZXRmbGFnIChOQ1VSU0VTX0NPTlNUIGNoYXIgKik7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdGlnZXRudW0gKE5DVVJTRVNfQ09OU1QgY2hhciAqKTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSB0aWdldHN0ciAoTkNVUlNFU19DT05TVCBjaGFyICopOwkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHB1dHAgKGNvbnN0IGNoYXIgKik7CQkJCS8qIGltcGxlbWVudGVkICovCisKKyNpZiBOQ1VSU0VTX1RQQVJNX1ZBUkFSR1MKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIHRwYXJtIChOQ1VSU0VTX0NPTlNUIGNoYXIgKiwgLi4uKTsJLyogc3BlY2lhbCAqLworI2Vsc2UKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIHRwYXJtIChOQ1VSU0VTX0NPTlNUIGNoYXIgKiwgbG9uZyxsb25nLGxvbmcsbG9uZyxsb25nLGxvbmcsbG9uZyxsb25nLGxvbmcpOwkvKiBzcGVjaWFsICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSB0cGFybV92YXJhcmdzIChOQ1VSU0VTX0NPTlNUIGNoYXIgKiwgLi4uKTsJLyogc3BlY2lhbCAqLworI2VuZGlmCisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIHRpcGFybSAoY29uc3QgY2hhciAqLCAuLi4pOwkJLyogc3BlY2lhbCAqLworCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgaW4gWC9PcGVuLCBidXQgd2UgdXNlIHRoZW0gaW4gbWFjcm8gZGVmaW5pdGlvbnM6CisgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGdldGF0dHJzIChjb25zdCBXSU5ET1cgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBnZXRjdXJ4IChjb25zdCBXSU5ET1cgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBnZXRjdXJ5IChjb25zdCBXSU5ET1cgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBnZXRiZWd4IChjb25zdCBXSU5ET1cgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBnZXRiZWd5IChjb25zdCBXSU5ET1cgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBnZXRtYXh4IChjb25zdCBXSU5ET1cgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBnZXRtYXh5IChjb25zdCBXSU5ET1cgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBnZXRwYXJ4IChjb25zdCBXSU5ET1cgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBnZXRwYXJ5IChjb25zdCBXSU5ET1cgKik7CQkJLyogZ2VuZXJhdGVkICovCisKKy8qCisgKiB2aWRfYXR0cigpIHdhcyBpbXBsZW1lbnRlZCBvcmlnaW5hbGx5IGJhc2VkIG9uIGEgZHJhZnQgb2YgWC9PcGVuIGN1cnNlcy4KKyAqLworI2lmbmRlZiBOQ1VSU0VTX1dJREVDSEFSCisjZGVmaW5lIHZpZF9hdHRyKGEscGFpcixvcHRzKSB2aWRhdHRyKGEpCisjZW5kaWYKKworLyoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZXh0ZW5zaW9ucyAtIG5vdCBpbiBYL09wZW4gQ3Vyc2VzLgorICovCisjaWYgMQorI3VuZGVmICBOQ1VSU0VTX0VYVF9GVU5DUworI2RlZmluZSBOQ1VSU0VTX0VYVF9GVU5DUyAyMDExMDQwNAordHlwZWRlZiBpbnQgKCpOQ1VSU0VTX1dJTkRPV19DQikoV0lORE9XICosIHZvaWQgKik7Cit0eXBlZGVmIGludCAoKk5DVVJTRVNfU0NSRUVOX0NCKShTQ1JFRU4gKiwgdm9pZCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBpc190ZXJtX3Jlc2l6ZWQgKGludCwgaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIGtleWJvdW5kIChpbnQsIGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY29uc3QgY2hhciAqKSBjdXJzZXNfdmVyc2lvbiAodm9pZCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBhc3N1bWVfZGVmYXVsdF9jb2xvcnMgKGludCwgaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGRlZmluZV9rZXkgKGNvbnN0IGNoYXIgKiwgaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGdldF9lc2NkZWxheSAodm9pZCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBrZXlfZGVmaW5lZCAoY29uc3QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGtleW9rIChpbnQsIGJvb2wpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgcmVzaXplX3Rlcm0gKGludCwgaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHJlc2l6ZXRlcm0gKGludCwgaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNldF9lc2NkZWxheSAoaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNldF90YWJzaXplIChpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdXNlX2RlZmF1bHRfY29sb3JzICh2b2lkKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHVzZV9leHRlbmRlZF9uYW1lcyAoYm9vbCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB1c2VfbGVnYWN5X2NvZGluZyAoaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHVzZV9zY3JlZW4gKFNDUkVFTiAqLCBOQ1VSU0VTX1NDUkVFTl9DQiwgdm9pZCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHVzZV93aW5kb3cgKFdJTkRPVyAqLCBOQ1VSU0VTX1dJTkRPV19DQiwgdm9pZCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdyZXNpemUgKFdJTkRPVyAqLCBpbnQsIGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgbm9maWx0ZXIodm9pZCk7CisKKy8qCisgKiBUaGVzZSBleHRlbnNpb25zIHByb3ZpZGUgYWNjZXNzIHRvIGluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgV0lORE9XIGV2ZW4KKyAqIHdoZW4gTkNVUlNFU19PUEFRVUUgaXMgc2V0OgorICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoV0lORE9XICopIHdnZXRwYXJlbnQgKGNvbnN0IFdJTkRPVyAqKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgaXNfY2xlYXJlZCAoY29uc3QgV0lORE9XICopOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBpc19pZGNvayAoY29uc3QgV0lORE9XICopOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgaXNfaWRsb2sgKGNvbnN0IFdJTkRPVyAqKTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIGlzX2ltbWVkb2sgKGNvbnN0IFdJTkRPVyAqKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgaXNfa2V5cGFkIChjb25zdCBXSU5ET1cgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBpc19sZWF2ZW9rIChjb25zdCBXSU5ET1cgKik7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIGlzX25vZGVsYXkgKGNvbnN0IFdJTkRPVyAqKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgaXNfbm90aW1lb3V0IChjb25zdCBXSU5ET1cgKik7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIGlzX3BhZCAoY29uc3QgV0lORE9XICopOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgaXNfc2Nyb2xsb2sgKGNvbnN0IFdJTkRPVyAqKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgaXNfc3Vid2luIChjb25zdCBXSU5ET1cgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBpc19zeW5jb2sgKGNvbnN0IFdJTkRPVyAqKTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2dldHNjcnJlZyAoY29uc3QgV0lORE9XICosIGludCAqLCBpbnQgKik7IC8qIGdlbmVyYXRlZCAqLworCisjZWxzZQorI2RlZmluZSBjdXJzZXNfdmVyc2lvbigpIE5DVVJTRVNfVkVSU0lPTgorI2VuZGlmCisKKy8qCisgKiBFeHRyYSBleHRlbnNpb24tZnVuY3Rpb25zLCB3aGljaCBwYXNzIGEgU0NSRUVOIHBvaW50ZXIgcmF0aGVyIHRoYW4gdXNpbmcKKyAqIGEgZ2xvYmFsIHZhcmlhYmxlIFNQLgorICovCisjaWYgMAorI3VuZGVmICBOQ1VSU0VTX1NQX0ZVTkNTCisjZGVmaW5lIE5DVVJTRVNfU1BfRlVOQ1MgMjAxMTA0MDQKKyNkZWZpbmUgTkNVUlNFU19TUF9OQU1FKG5hbWUpIG5hbWUjI19zcAorCisvKiBEZWZpbmUgdGhlIHNwLWZ1bmNzIGhlbHBlciBmdW5jdGlvbiAqLworI2RlZmluZSBOQ1VSU0VTX1NQX09VVEMgTkNVUlNFU19TUF9OQU1FKE5DVVJTRVNfT1VUQykKK3R5cGVkZWYgaW50ICgqTkNVUlNFU19TUF9PVVRDKShTQ1JFRU4qLCBpbnQpOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoU0NSRUVOICopIG5ld19wcmVzY3IgKHZvaWQpOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShiYXVkcmF0ZSkgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoYmVlcCkgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgTkNVUlNFU19TUF9OQU1FKGNhbl9jaGFuZ2VfY29sb3IpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKGNicmVhaykgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoY3Vyc19zZXQpIChTQ1JFRU4qLCBpbnQpOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoY29sb3JfY29udGVudCkgKFNDUkVFTiosIHNob3J0LCBzaG9ydCosIHNob3J0Kiwgc2hvcnQqKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKGRlZl9wcm9nX21vZGUpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKGRlZl9zaGVsbF9tb2RlKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShkZWxheV9vdXRwdXQpIChTQ1JFRU4qLCBpbnQpOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoZG91cGRhdGUpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKGVjaG8pIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKGVuZHdpbikgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhcikgTkNVUlNFU19TUF9OQU1FKGVyYXNlY2hhcikgKFNDUkVFTiopOy8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBOQ1VSU0VTX1NQX05BTUUoZmlsdGVyKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShmbGFzaCkgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoZmx1c2hpbnApIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyAqKSBOQ1VSU0VTX1NQX05BTUUoZ2V0d2luKSAoU0NSRUVOKiwgRklMRSAqKTsJCQkvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoaGFsZmRlbGF5KSAoU0NSRUVOKiwgaW50KTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIE5DVVJTRVNfU1BfTkFNRShoYXNfY29sb3JzKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBOQ1VSU0VTX1NQX05BTUUoaGFzX2ljKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBOQ1VSU0VTX1NQX05BTUUoaGFzX2lsKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShpbml0X2NvbG9yKSAoU0NSRUVOKiwgc2hvcnQsIHNob3J0LCBzaG9ydCwgc2hvcnQpOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoaW5pdF9wYWlyKSAoU0NSRUVOKiwgc2hvcnQsIHNob3J0LCBzaG9ydCk7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShpbnRyZmx1c2gpIChTQ1JFRU4qLCBXSU5ET1cqLCBib29sKTsJLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIE5DVVJTRVNfU1BfTkFNRShpc2VuZHdpbikgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoTkNVUlNFU19DT05TVCBjaGFyICopIE5DVVJTRVNfU1BfTkFNRShrZXluYW1lKSAoU0NSRUVOKiwgaW50KTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIpIE5DVVJTRVNfU1BfTkFNRShraWxsY2hhcikgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBOQ1VSU0VTX1NQX05BTUUobG9uZ25hbWUpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKG12Y3VyKSAoU0NSRUVOKiwgaW50LCBpbnQsIGludCwgaW50KTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKG5hcG1zKSAoU0NSRUVOKiwgaW50KTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyAqKSBOQ1VSU0VTX1NQX05BTUUobmV3cGFkKSAoU0NSRUVOKiwgaW50LCBpbnQpOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoU0NSRUVOICopIE5DVVJTRVNfU1BfTkFNRShuZXd0ZXJtKSAoU0NSRUVOKiwgTkNVUlNFU19DT05TVCBjaGFyICosIEZJTEUgKiwgRklMRSAqKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyAqKSBOQ1VSU0VTX1NQX05BTUUobmV3d2luKSAoU0NSRUVOKiwgaW50LCBpbnQsIGludCwgaW50KTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKG5sKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShub2NicmVhaykgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUobm9lY2hvKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShub25sKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBOQ1VSU0VTX1NQX05BTUUobm9xaWZsdXNoKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShub3JhdykgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUocGFpcl9jb250ZW50KSAoU0NSRUVOKiwgc2hvcnQsIHNob3J0Kiwgc2hvcnQqKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIE5DVVJTRVNfU1BfTkFNRShxaWZsdXNoKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShyYXcpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHJlc2V0X3Byb2dfbW9kZSkgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUocmVzZXRfc2hlbGxfbW9kZSkgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUocmVzZXR0eSkgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUocmlwb2ZmbGluZSkgKFNDUkVFTiosIGludCwgaW50ICgqKShXSU5ET1cgKiwgaW50KSk7CS8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShzYXZldHR5KSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShzY3JfaW5pdCkgKFNDUkVFTiosIGNvbnN0IGNoYXIgKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShzY3JfcmVzdG9yZSkgKFNDUkVFTiosIGNvbnN0IGNoYXIgKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShzY3Jfc2V0KSAoU0NSRUVOKiwgY29uc3QgY2hhciAqKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHNsa19hdHRyb2ZmKSAoU0NSRUVOKiwgY29uc3QgY2h0eXBlKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHNsa19hdHRyb24pIChTQ1JFRU4qLCBjb25zdCBjaHR5cGUpOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoc2xrX2F0dHJzZXQpIChTQ1JFRU4qLCBjb25zdCBjaHR5cGUpOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYXR0cl90KSBOQ1VSU0VTX1NQX05BTUUoc2xrX2F0dHIpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHNsa19hdHRyX3NldCkgKFNDUkVFTiosIGNvbnN0IGF0dHJfdCwgc2hvcnQsIHZvaWQqKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHNsa19jbGVhcikgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoc2xrX2NvbG9yKSAoU0NSRUVOKiwgc2hvcnQpOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoc2xrX2luaXQpIChTQ1JFRU4qLCBpbnQpOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBOQ1VSU0VTX1NQX05BTUUoc2xrX2xhYmVsKSAoU0NSRUVOKiwgaW50KTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHNsa19ub3V0cmVmcmVzaCkgKFNDUkVFTiopOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoc2xrX3JlZnJlc2gpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHNsa19yZXN0b3JlKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShzbGtfc2V0KSAoU0NSRUVOKiwgaW50LCBjb25zdCBjaGFyICosIGludCk7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShzbGtfdG91Y2gpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHN0YXJ0X2NvbG9yKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaHR5cGUpIE5DVVJTRVNfU1BfTkFNRSh0ZXJtYXR0cnMpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQ6U1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgTkNVUlNFU19TUF9OQU1FKHRlcm1uYW1lKSAoU0NSRUVOKik7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRSh0eXBlYWhlYWQpIChTQ1JFRU4qLCBpbnQpOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUodW5nZXRjaCkgKFNDUkVFTiosIGludCk7IC8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBOQ1VSU0VTX1NQX05BTUUodXNlX2VudikgKFNDUkVFTiosIGJvb2wpOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUodmlkYXR0cikgKFNDUkVFTiosIGNodHlwZSk7CS8qIGltcGxlbWVudGVkOlNQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRSh2aWRwdXRzKSAoU0NSRUVOKiwgY2h0eXBlLCBOQ1VSU0VTX1NQX09VVEMpOyAvKiBpbXBsZW1lbnRlZDpTUF9GVU5DICovCisjaWYgMQorZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgTkNVUlNFU19TUF9OQU1FKGtleWJvdW5kKSAoU0NSRUVOKiwgaW50LCBpbnQpOwkvKiBpbXBsZW1lbnRlZDpFWFRfU1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKGFzc3VtZV9kZWZhdWx0X2NvbG9ycykgKFNDUkVFTiosIGludCwgaW50KTsJLyogaW1wbGVtZW50ZWQ6RVhUX1NQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShkZWZpbmVfa2V5KSAoU0NSRUVOKiwgY29uc3QgY2hhciAqLCBpbnQpOwkvKiBpbXBsZW1lbnRlZDpFWFRfU1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKGdldF9lc2NkZWxheSkgKFNDUkVFTiopOwkvKiBpbXBsZW1lbnRlZDpFWFRfU1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIE5DVVJTRVNfU1BfTkFNRShpc190ZXJtX3Jlc2l6ZWQpIChTQ1JFRU4qLCBpbnQsIGludCk7CS8qIGltcGxlbWVudGVkOkVYVF9TUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoa2V5X2RlZmluZWQpIChTQ1JFRU4qLCBjb25zdCBjaGFyICopOwkvKiBpbXBsZW1lbnRlZDpFWFRfU1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKGtleW9rKSAoU0NSRUVOKiwgaW50LCBib29sKTsJLyogaW1wbGVtZW50ZWQ6RVhUX1NQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBOQ1VSU0VTX1NQX05BTUUobm9maWx0ZXIpIChTQ1JFRU4qKTsgLyogaW1wbGVtZW50ZWQgKi8JLyogaW1wbGVtZW50ZWQ6RVhUX1NQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShyZXNpemVfdGVybSkgKFNDUkVFTiosIGludCwgaW50KTsJLyogaW1wbGVtZW50ZWQ6RVhUX1NQX0ZVTkMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIE5DVVJTRVNfU1BfTkFNRShyZXNpemV0ZXJtKSAoU0NSRUVOKiwgaW50LCBpbnQpOwkvKiBpbXBsZW1lbnRlZDpFWFRfU1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHNldF9lc2NkZWxheSkgKFNDUkVFTiosIGludCk7CS8qIGltcGxlbWVudGVkOkVYVF9TUF9GVU5DICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoc2V0X3RhYnNpemUpIChTQ1JFRU4qLCBpbnQpOwkvKiBpbXBsZW1lbnRlZDpFWFRfU1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHVzZV9kZWZhdWx0X2NvbG9ycykgKFNDUkVFTiopOwkvKiBpbXBsZW1lbnRlZDpFWFRfU1BfRlVOQyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKHVzZV9sZWdhY3lfY29kaW5nKSAoU0NSRUVOKiwgaW50KTsJLyogaW1wbGVtZW50ZWQ6RVhUX1NQX0ZVTkMgKi8KKyNlbmRpZgorI2Vsc2UKKyN1bmRlZiAgTkNVUlNFU19TUF9GVU5DUworI2RlZmluZSBOQ1VSU0VTX1NQX0ZVTkNTIDAKKyNkZWZpbmUgTkNVUlNFU19TUF9OQU1FKG5hbWUpIG5hbWUKKyNkZWZpbmUgTkNVUlNFU19TUF9PVVRDIE5DVVJTRVNfT1VUQworI2VuZGlmCisKKy8qIGF0dHJpYnV0ZXMgKi8KKworI2RlZmluZSBOQ1VSU0VTX0FUVFJfU0hJRlQgICAgICAgOAorI2RlZmluZSBOQ1VSU0VTX0JJVFMobWFzayxzaGlmdCkgKChtYXNrKSA8PCAoKHNoaWZ0KSArIE5DVVJTRVNfQVRUUl9TSElGVCkpCisKKyNkZWZpbmUgQV9OT1JNQUwJKDFVTCAtIDFVTCkKKyNkZWZpbmUgQV9BVFRSSUJVVEVTCU5DVVJTRVNfQklUUyh+KDFVTCAtIDFVTCksMCkKKyNkZWZpbmUgQV9DSEFSVEVYVAkoTkNVUlNFU19CSVRTKDFVTCwwKSAtIDFVTCkKKyNkZWZpbmUgQV9DT0xPUgkJTkNVUlNFU19CSVRTKCgoMVVMKSA8PCA4KSAtIDFVTCwwKQorI2RlZmluZSBBX1NUQU5ET1VUCU5DVVJTRVNfQklUUygxVUwsOCkKKyNkZWZpbmUgQV9VTkRFUkxJTkUJTkNVUlNFU19CSVRTKDFVTCw5KQorI2RlZmluZSBBX1JFVkVSU0UJTkNVUlNFU19CSVRTKDFVTCwxMCkKKyNkZWZpbmUgQV9CTElOSwkJTkNVUlNFU19CSVRTKDFVTCwxMSkKKyNkZWZpbmUgQV9ESU0JCU5DVVJTRVNfQklUUygxVUwsMTIpCisjZGVmaW5lIEFfQk9MRAkJTkNVUlNFU19CSVRTKDFVTCwxMykKKyNkZWZpbmUgQV9BTFRDSEFSU0VUCU5DVVJTRVNfQklUUygxVUwsMTQpCisjZGVmaW5lIEFfSU5WSVMJCU5DVVJTRVNfQklUUygxVUwsMTUpCisjZGVmaW5lIEFfUFJPVEVDVAlOQ1VSU0VTX0JJVFMoMVVMLDE2KQorI2RlZmluZSBBX0hPUklaT05UQUwJTkNVUlNFU19CSVRTKDFVTCwxNykKKyNkZWZpbmUgQV9MRUZUCQlOQ1VSU0VTX0JJVFMoMVVMLDE4KQorI2RlZmluZSBBX0xPVwkJTkNVUlNFU19CSVRTKDFVTCwxOSkKKyNkZWZpbmUgQV9SSUdIVAkJTkNVUlNFU19CSVRTKDFVTCwyMCkKKyNkZWZpbmUgQV9UT1AJCU5DVVJTRVNfQklUUygxVUwsMjEpCisjZGVmaW5lIEFfVkVSVElDQUwJTkNVUlNFU19CSVRTKDFVTCwyMikKKworLyoKKyAqIE1vc3Qgb2YgdGhlIHBzZXVkbyBmdW5jdGlvbnMgYXJlIG1hY3JvcyB0aGF0IGVpdGhlciBwcm92aWRlIGNvbXBhdGliaWxpdHkKKyAqIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgY3Vyc2VzLCBvciBwcm92aWRlIGlubGluZSBmdW5jdGlvbmFsaXR5IHRvIGltcHJvdmUKKyAqIHBlcmZvcm1hbmNlLgorICovCisKKy8qCisgKiBUaGVzZSBwc2V1ZG8gZnVuY3Rpb25zIGFyZSBhbHdheXMgaW1wbGVtZW50ZWQgYXMgbWFjcm9zOgorICovCisKKyNkZWZpbmUgZ2V0eXgod2luLHkseCkgICAJKHkgPSBnZXRjdXJ5KHdpbiksIHggPSBnZXRjdXJ4KHdpbikpCisjZGVmaW5lIGdldGJlZ3l4KHdpbix5LHgpCSh5ID0gZ2V0YmVneSh3aW4pLCB4ID0gZ2V0YmVneCh3aW4pKQorI2RlZmluZSBnZXRtYXh5eCh3aW4seSx4KQkoeSA9IGdldG1heHkod2luKSwgeCA9IGdldG1heHgod2luKSkKKyNkZWZpbmUgZ2V0cGFyeXgod2luLHkseCkJKHkgPSBnZXRwYXJ5KHdpbiksIHggPSBnZXRwYXJ4KHdpbikpCisKKyNkZWZpbmUgZ2V0c3l4KHkseCkgZG8geyBpZiAobmV3c2NyKSB7IFwKKwkJCSAgICAgaWYgKGlzX2xlYXZlb2sobmV3c2NyKSkgXAorCQkJCSh5KSA9ICh4KSA9IC0xOyBcCisJCQkgICAgIGVsc2UgXAorCQkJCSBnZXR5eChuZXdzY3IsKHkpLCAoeCkpOyBcCisJCQl9IFwKKwkJICAgIH0gd2hpbGUoMCkKKworI2RlZmluZSBzZXRzeXgoeSx4KSBkbyB7IGlmIChuZXdzY3IpIHsgXAorCQkJICAgIGlmICgoeSkgPT0gLTEgJiYgKHgpID09IC0xKSBcCisJCQkJbGVhdmVvayhuZXdzY3IsIFRSVUUpOyBcCisJCQkgICAgZWxzZSB7IFwKKwkJCQlsZWF2ZW9rKG5ld3NjciwgRkFMU0UpOyBcCisJCQkJd21vdmUobmV3c2NyLCAoeSksICh4KSk7IFwKKwkJCSAgICB9IFwKKwkJCX0gXAorCQkgICAgfSB3aGlsZSgwKQorCisjaWZuZGVmIE5DVVJTRVNfTk9NQUNST1MKKworLyoKKyAqIFRoZXNlIG1pc2NlbGxhbmVvdXMgcHNldWRvIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHk6CisgKi8KKworI2RlZmluZSB3Z2V0c3RyKHcsIHMpCQl3Z2V0bnN0cih3LCBzLCAtMSkKKyNkZWZpbmUgZ2V0bnN0cihzLCBuKQkJd2dldG5zdHIoc3Rkc2NyLCBzLCBuKQorCisjZGVmaW5lIHNldHRlcm0odGVybSkJCXNldHVwdGVybSh0ZXJtLCAxLCAoaW50ICopMCkKKworI2RlZmluZSBmaXh0ZXJtKCkJCXJlc2V0X3Byb2dfbW9kZSgpCisjZGVmaW5lIHJlc2V0dGVybSgpCQlyZXNldF9zaGVsbF9tb2RlKCkKKyNkZWZpbmUgc2F2ZXRlcm0oKQkJZGVmX3Byb2dfbW9kZSgpCisjZGVmaW5lIGNybW9kZSgpCQljYnJlYWsoKQorI2RlZmluZSBub2NybW9kZSgpCQlub2NicmVhaygpCisjZGVmaW5lIGdldHRtb2RlKCkKKworLyogSXQgc2VlbXMgb2xkZXIgU1lTViBjdXJzZXMgdmVyc2lvbnMgZGVmaW5lIHRoZXNlICovCisjaWYgIU5DVVJTRVNfT1BBUVVFCisjZGVmaW5lIGdldGF0dHJzKHdpbikJCU5DVVJTRVNfQ0FTVChpbnQsICh3aW4pID8gKHdpbiktPl9hdHRycyA6IEFfTk9STUFMKQorI2RlZmluZSBnZXRjdXJ4KHdpbikJCSgod2luKSA/ICh3aW4pLT5fY3VyeCA6IEVSUikKKyNkZWZpbmUgZ2V0Y3VyeSh3aW4pCQkoKHdpbikgPyAod2luKS0+X2N1cnkgOiBFUlIpCisjZGVmaW5lIGdldGJlZ3god2luKQkJKCh3aW4pID8gKHdpbiktPl9iZWd4IDogRVJSKQorI2RlZmluZSBnZXRiZWd5KHdpbikJCSgod2luKSA/ICh3aW4pLT5fYmVneSA6IEVSUikKKyNkZWZpbmUgZ2V0bWF4eCh3aW4pCQkoKHdpbikgPyAoKHdpbiktPl9tYXh4ICsgMSkgOiBFUlIpCisjZGVmaW5lIGdldG1heHkod2luKQkJKCh3aW4pID8gKCh3aW4pLT5fbWF4eSArIDEpIDogRVJSKQorI2RlZmluZSBnZXRwYXJ4KHdpbikJCSgod2luKSA/ICh3aW4pLT5fcGFyeCA6IEVSUikKKyNkZWZpbmUgZ2V0cGFyeSh3aW4pCQkoKHdpbikgPyAod2luKS0+X3BhcnkgOiBFUlIpCisjZW5kaWYgLyogTkNVUlNFU19PUEFRVUUgKi8KKworI2RlZmluZSB3c3RhbmRvdXQod2luKSAgICAgIAkod2F0dHJzZXQod2luLEFfU1RBTkRPVVQpKQorI2RlZmluZSB3c3RhbmRlbmQod2luKSAgICAgIAkod2F0dHJzZXQod2luLEFfTk9STUFMKSkKKworI2RlZmluZSB3YXR0cm9uKHdpbixhdCkJCXdhdHRyX29uKHdpbiwgTkNVUlNFU19DQVNUKGF0dHJfdCwgYXQpLCBOVUxMKQorI2RlZmluZSB3YXR0cm9mZih3aW4sYXQpCXdhdHRyX29mZih3aW4sIE5DVVJTRVNfQ0FTVChhdHRyX3QsIGF0KSwgTlVMTCkKKworI2lmICFOQ1VSU0VTX09QQVFVRQorI2lmIGRlZmluZWQoTkNVUlNFU19XSURFQ0hBUikgJiYgMAorI2RlZmluZSB3YXR0cnNldCh3aW4sYXQpCSgod2luKSBcCisJCQkJICA/ICgod2luKS0+X2NvbG9yID0gUEFJUl9OVU1CRVIoYXQpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdpbiktPl9hdHRycyA9IE5DVVJTRVNfQ0FTVChhdHRyX3QsIGF0KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9LKSBcCisJCQkJICA6IEVSUikKKyNlbHNlCisjZGVmaW5lIHdhdHRyc2V0KHdpbixhdCkgICAgICAgICgod2luKSBcCisJCQkJICA/ICgod2luKS0+X2F0dHJzID0gTkNVUlNFU19DQVNUKGF0dHJfdCwgYXQpLCBcCisJCQkJICAgICBPSykgXAorCQkJCSAgOiBFUlIpCisjZW5kaWYKKyNlbmRpZiAvKiBOQ1VSU0VTX09QQVFVRSAqLworCisjZGVmaW5lIHNjcm9sbCh3aW4pCQl3c2NybCh3aW4sMSkKKworI2RlZmluZSB0b3VjaHdpbih3aW4pCQl3dG91Y2hsbigod2luKSwgMCwgZ2V0bWF4eSh3aW4pLCAxKQorI2RlZmluZSB0b3VjaGxpbmUod2luLCBzLCBjKQl3dG91Y2hsbigod2luKSwgcywgYywgMSkKKyNkZWZpbmUgdW50b3VjaHdpbih3aW4pCQl3dG91Y2hsbigod2luKSwgMCwgZ2V0bWF4eSh3aW4pLCAwKQorCisjZGVmaW5lIGJveCh3aW4sIHYsIGgpCQl3Ym9yZGVyKHdpbiwgdiwgdiwgaCwgaCwgMCwgMCwgMCwgMCkKKyNkZWZpbmUgYm9yZGVyKGxzLCBycywgdHMsIGJzLCB0bCwgdHIsIGJsLCBicikJd2JvcmRlcihzdGRzY3IsIGxzLCBycywgdHMsIGJzLCB0bCwgdHIsIGJsLCBicikKKyNkZWZpbmUgaGxpbmUoY2gsIG4pCQl3aGxpbmUoc3Rkc2NyLCBjaCwgbikKKyNkZWZpbmUgdmxpbmUoY2gsIG4pCQl3dmxpbmUoc3Rkc2NyLCBjaCwgbikKKworI2RlZmluZSB3aW5zdHIodywgcykJCXdpbm5zdHIodywgcywgLTEpCisjZGVmaW5lIHdpbmNoc3RyKHcsIHMpCQl3aW5jaG5zdHIodywgcywgLTEpCisjZGVmaW5lIHdpbnNzdHIodywgcykJCXdpbnNuc3RyKHcsIHMsIC0xKQorCisjaWYgIU5DVVJTRVNfT1BBUVVFCisjZGVmaW5lIHJlZHJhd3dpbih3aW4pCQl3cmVkcmF3bG4od2luLCAwLCAod2luKS0+X21heHkrMSkKKyNlbmRpZiAvKiBOQ1VSU0VTX09QQVFVRSAqLworCisjZGVmaW5lIHdhZGRzdHIod2luLHN0cikJd2FkZG5zdHIod2luLHN0ciwtMSkKKyNkZWZpbmUgd2FkZGNoc3RyKHdpbixzdHIpCXdhZGRjaG5zdHIod2luLHN0ciwtMSkKKworLyoKKyAqIFRoZXNlIGFwcGx5IHRvIHRoZSBmaXJzdCAyNTYgY29sb3IgcGFpcnMuCisgKi8KKyNkZWZpbmUgQ09MT1JfUEFJUihuKQlOQ1VSU0VTX0JJVFMobiwgMCkKKyNkZWZpbmUgUEFJUl9OVU1CRVIoYSkJKE5DVVJTRVNfQ0FTVChpbnQsKChOQ1VSU0VTX0NBU1QodW5zaWduZWQgbG9uZyxhKSAmIEFfQ09MT1IpID4+IE5DVVJTRVNfQVRUUl9TSElGVCkpKQorCisvKgorICogcHNldWRvIGZ1bmN0aW9ucyBmb3Igc3RhbmRhcmQgc2NyZWVuCisgKi8KKworI2RlZmluZSBhZGRjaChjaCkJCXdhZGRjaChzdGRzY3IsY2gpCisjZGVmaW5lIGFkZGNobnN0cihzdHIsbikJd2FkZGNobnN0cihzdGRzY3Isc3RyLG4pCisjZGVmaW5lIGFkZGNoc3RyKHN0cikJCXdhZGRjaHN0cihzdGRzY3Isc3RyKQorI2RlZmluZSBhZGRuc3RyKHN0cixuKQkJd2FkZG5zdHIoc3Rkc2NyLHN0cixuKQorI2RlZmluZSBhZGRzdHIoc3RyKQkJd2FkZG5zdHIoc3Rkc2NyLHN0ciwtMSkKKyNkZWZpbmUgYXR0cm9mZihhdCkJCXdhdHRyb2ZmKHN0ZHNjcixhdCkKKyNkZWZpbmUgYXR0cm9uKGF0KQkJd2F0dHJvbihzdGRzY3IsYXQpCisjZGVmaW5lIGF0dHJzZXQoYXQpCQl3YXR0cnNldChzdGRzY3IsYXQpCisjZGVmaW5lIGF0dHJfZ2V0KGFwLGNwLG8pCXdhdHRyX2dldChzdGRzY3IsYXAsY3AsbykKKyNkZWZpbmUgYXR0cl9vZmYoYSxvKQkJd2F0dHJfb2ZmKHN0ZHNjcixhLG8pCisjZGVmaW5lIGF0dHJfb24oYSxvKQkJd2F0dHJfb24oc3Rkc2NyLGEsbykKKyNkZWZpbmUgYXR0cl9zZXQoYSxjLG8pCQl3YXR0cl9zZXQoc3Rkc2NyLGEsYyxvKQorI2RlZmluZSBia2dkKGNoKQkJd2JrZ2Qoc3Rkc2NyLGNoKQorI2RlZmluZSBia2dkc2V0KGNoKQkJd2JrZ2RzZXQoc3Rkc2NyLGNoKQorI2RlZmluZSBjaGdhdChuLGEsYyxvKQkJd2NoZ2F0KHN0ZHNjcixuLGEsYyxvKQorI2RlZmluZSBjbGVhcigpCQkJd2NsZWFyKHN0ZHNjcikKKyNkZWZpbmUgY2xydG9ib3QoKQkJd2NscnRvYm90KHN0ZHNjcikKKyNkZWZpbmUgY2xydG9lb2woKQkJd2NscnRvZW9sKHN0ZHNjcikKKyNkZWZpbmUgY29sb3Jfc2V0KGMsbykJCXdjb2xvcl9zZXQoc3Rkc2NyLGMsbykKKyNkZWZpbmUgZGVsY2goKQkJCXdkZWxjaChzdGRzY3IpCisjZGVmaW5lIGRlbGV0ZWxuKCkJCXdpbnNkZWxsbihzdGRzY3IsLTEpCisjZGVmaW5lIGVjaG9jaGFyKGMpCQl3ZWNob2NoYXIoc3Rkc2NyLGMpCisjZGVmaW5lIGVyYXNlKCkJCQl3ZXJhc2Uoc3Rkc2NyKQorI2RlZmluZSBnZXRjaCgpCQkJd2dldGNoKHN0ZHNjcikKKyNkZWZpbmUgZ2V0c3RyKHN0cikJCXdnZXRzdHIoc3Rkc2NyLHN0cikKKyNkZWZpbmUgaW5jaCgpCQkJd2luY2goc3Rkc2NyKQorI2RlZmluZSBpbmNobnN0cihzLG4pCQl3aW5jaG5zdHIoc3Rkc2NyLHMsbikKKyNkZWZpbmUgaW5jaHN0cihzKQkJd2luY2hzdHIoc3Rkc2NyLHMpCisjZGVmaW5lIGlubnN0cihzLG4pCQl3aW5uc3RyKHN0ZHNjcixzLG4pCisjZGVmaW5lIGluc2NoKGMpCQl3aW5zY2goc3Rkc2NyLGMpCisjZGVmaW5lIGluc2RlbGxuKG4pCQl3aW5zZGVsbG4oc3Rkc2NyLG4pCisjZGVmaW5lIGluc2VydGxuKCkJCXdpbnNkZWxsbihzdGRzY3IsMSkKKyNkZWZpbmUgaW5zbnN0cihzLG4pCQl3aW5zbnN0cihzdGRzY3IscyxuKQorI2RlZmluZSBpbnNzdHIocykJCXdpbnNzdHIoc3Rkc2NyLHMpCisjZGVmaW5lIGluc3RyKHMpCQl3aW5zdHIoc3Rkc2NyLHMpCisjZGVmaW5lIG1vdmUoeSx4KQkJd21vdmUoc3Rkc2NyLHkseCkKKyNkZWZpbmUgcmVmcmVzaCgpCQl3cmVmcmVzaChzdGRzY3IpCisjZGVmaW5lIHNjcmwobikJCQl3c2NybChzdGRzY3IsbikKKyNkZWZpbmUgc2V0c2NycmVnKHQsYikJCXdzZXRzY3JyZWcoc3Rkc2NyLHQsYikKKyNkZWZpbmUgc3RhbmRlbmQoKQkJd3N0YW5kZW5kKHN0ZHNjcikKKyNkZWZpbmUgc3RhbmRvdXQoKQkJd3N0YW5kb3V0KHN0ZHNjcikKKyNkZWZpbmUgdGltZW91dChkZWxheSkJCXd0aW1lb3V0KHN0ZHNjcixkZWxheSkKKyNkZWZpbmUgd2RlbGV0ZWxuKHdpbikJCXdpbnNkZWxsbih3aW4sLTEpCisjZGVmaW5lIHdpbnNlcnRsbih3aW4pCQl3aW5zZGVsbG4od2luLDEpCisKKy8qCisgKiBtdiBmdW5jdGlvbnMKKyAqLworCisjZGVmaW5lIG12d2FkZGNoKHdpbix5LHgsY2gpCQkod21vdmUod2luLHkseCkgPT0gRVJSID8gRVJSIDogd2FkZGNoKHdpbixjaCkpCisjZGVmaW5lIG12d2FkZGNobnN0cih3aW4seSx4LHN0cixuKQkod21vdmUod2luLHkseCkgPT0gRVJSID8gRVJSIDogd2FkZGNobnN0cih3aW4sc3RyLG4pKQorI2RlZmluZSBtdndhZGRjaHN0cih3aW4seSx4LHN0cikJKHdtb3ZlKHdpbix5LHgpID09IEVSUiA/IEVSUiA6IHdhZGRjaG5zdHIod2luLHN0ciwtMSkpCisjZGVmaW5lIG12d2FkZG5zdHIod2luLHkseCxzdHIsbikJKHdtb3ZlKHdpbix5LHgpID09IEVSUiA/IEVSUiA6IHdhZGRuc3RyKHdpbixzdHIsbikpCisjZGVmaW5lIG12d2FkZHN0cih3aW4seSx4LHN0cikJCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3YWRkbnN0cih3aW4sc3RyLC0xKSkKKyNkZWZpbmUgbXZ3ZGVsY2god2luLHkseCkJCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3ZGVsY2god2luKSkKKyNkZWZpbmUgbXZ3Y2hnYXQod2luLHkseCxuLGEsYyxvKQkod21vdmUod2luLHkseCkgPT0gRVJSID8gRVJSIDogd2NoZ2F0KHdpbixuLGEsYyxvKSkKKyNkZWZpbmUgbXZ3Z2V0Y2god2luLHkseCkJCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3Z2V0Y2god2luKSkKKyNkZWZpbmUgbXZ3Z2V0bnN0cih3aW4seSx4LHN0cixuKQkod21vdmUod2luLHkseCkgPT0gRVJSID8gRVJSIDogd2dldG5zdHIod2luLHN0cixuKSkKKyNkZWZpbmUgbXZ3Z2V0c3RyKHdpbix5LHgsc3RyKQkJKHdtb3ZlKHdpbix5LHgpID09IEVSUiA/IEVSUiA6IHdnZXRzdHIod2luLHN0cikpCisjZGVmaW5lIG12d2hsaW5lKHdpbix5LHgsYyxuKQkJKHdtb3ZlKHdpbix5LHgpID09IEVSUiA/IEVSUiA6IHdobGluZSh3aW4sYyxuKSkKKyNkZWZpbmUgbXZ3aW5jaCh3aW4seSx4KQkJKHdtb3ZlKHdpbix5LHgpID09IEVSUiA/IE5DVVJTRVNfQ0FTVChjaHR5cGUsIEVSUikgOiB3aW5jaCh3aW4pKQorI2RlZmluZSBtdndpbmNobnN0cih3aW4seSx4LHMsbikJKHdtb3ZlKHdpbix5LHgpID09IEVSUiA/IEVSUiA6IHdpbmNobnN0cih3aW4scyxuKSkKKyNkZWZpbmUgbXZ3aW5jaHN0cih3aW4seSx4LHMpCQkod21vdmUod2luLHkseCkgPT0gRVJSID8gRVJSIDogd2luY2hzdHIod2luLHMpKQorI2RlZmluZSBtdndpbm5zdHIod2luLHkseCxzLG4pCQkod21vdmUod2luLHkseCkgPT0gRVJSID8gRVJSIDogd2lubnN0cih3aW4scyxuKSkKKyNkZWZpbmUgbXZ3aW5zY2god2luLHkseCxjKQkJKHdtb3ZlKHdpbix5LHgpID09IEVSUiA/IEVSUiA6IHdpbnNjaCh3aW4sYykpCisjZGVmaW5lIG12d2luc25zdHIod2luLHkseCxzLG4pCQkod21vdmUod2luLHkseCkgPT0gRVJSID8gRVJSIDogd2luc25zdHIod2luLHMsbikpCisjZGVmaW5lIG12d2luc3N0cih3aW4seSx4LHMpCQkod21vdmUod2luLHkseCkgPT0gRVJSID8gRVJSIDogd2luc3N0cih3aW4scykpCisjZGVmaW5lIG12d2luc3RyKHdpbix5LHgscykJCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3aW5zdHIod2luLHMpKQorI2RlZmluZSBtdnd2bGluZSh3aW4seSx4LGMsbikJCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3dmxpbmUod2luLGMsbikpCisKKyNkZWZpbmUgbXZhZGRjaCh5LHgsY2gpCQkJbXZ3YWRkY2goc3Rkc2NyLHkseCxjaCkKKyNkZWZpbmUgbXZhZGRjaG5zdHIoeSx4LHN0cixuKQkJbXZ3YWRkY2huc3RyKHN0ZHNjcix5LHgsc3RyLG4pCisjZGVmaW5lIG12YWRkY2hzdHIoeSx4LHN0cikJCW12d2FkZGNoc3RyKHN0ZHNjcix5LHgsc3RyKQorI2RlZmluZSBtdmFkZG5zdHIoeSx4LHN0cixuKQkJbXZ3YWRkbnN0cihzdGRzY3IseSx4LHN0cixuKQorI2RlZmluZSBtdmFkZHN0cih5LHgsc3RyKQkJbXZ3YWRkc3RyKHN0ZHNjcix5LHgsc3RyKQorI2RlZmluZSBtdmNoZ2F0KHkseCxuLGEsYyxvKQkJbXZ3Y2hnYXQoc3Rkc2NyLHkseCxuLGEsYyxvKQorI2RlZmluZSBtdmRlbGNoKHkseCkJCQltdndkZWxjaChzdGRzY3IseSx4KQorI2RlZmluZSBtdmdldGNoKHkseCkJCQltdndnZXRjaChzdGRzY3IseSx4KQorI2RlZmluZSBtdmdldG5zdHIoeSx4LHN0cixuKQkJbXZ3Z2V0bnN0cihzdGRzY3IseSx4LHN0cixuKQorI2RlZmluZSBtdmdldHN0cih5LHgsc3RyKQkJbXZ3Z2V0c3RyKHN0ZHNjcix5LHgsc3RyKQorI2RlZmluZSBtdmhsaW5lKHkseCxjLG4pCQltdndobGluZShzdGRzY3IseSx4LGMsbikKKyNkZWZpbmUgbXZpbmNoKHkseCkJCQltdndpbmNoKHN0ZHNjcix5LHgpCisjZGVmaW5lIG12aW5jaG5zdHIoeSx4LHMsbikJCW12d2luY2huc3RyKHN0ZHNjcix5LHgscyxuKQorI2RlZmluZSBtdmluY2hzdHIoeSx4LHMpCQltdndpbmNoc3RyKHN0ZHNjcix5LHgscykKKyNkZWZpbmUgbXZpbm5zdHIoeSx4LHMsbikJCW12d2lubnN0cihzdGRzY3IseSx4LHMsbikKKyNkZWZpbmUgbXZpbnNjaCh5LHgsYykJCQltdndpbnNjaChzdGRzY3IseSx4LGMpCisjZGVmaW5lIG12aW5zbnN0cih5LHgscyxuKQkJbXZ3aW5zbnN0cihzdGRzY3IseSx4LHMsbikKKyNkZWZpbmUgbXZpbnNzdHIoeSx4LHMpCQkJbXZ3aW5zc3RyKHN0ZHNjcix5LHgscykKKyNkZWZpbmUgbXZpbnN0cih5LHgscykJCQltdndpbnN0cihzdGRzY3IseSx4LHMpCisjZGVmaW5lIG12dmxpbmUoeSx4LGMsbikJCW12d3ZsaW5lKHN0ZHNjcix5LHgsYyxuKQorCisvKgorICogU29tZSB3aWRlLWNoYXJhY3RlciBmdW5jdGlvbnMgY2FuIGJlIGltcGxlbWVudGVkIHdpdGhvdXQgdGhlIGV4dGVuc2lvbnMuCisgKi8KKyNpZiAhTkNVUlNFU19PUEFRVUUKKyNkZWZpbmUgZ2V0YmtnZCh3aW4pICAgICAgICAgICAgICAgICAgICAoKHdpbiktPl9ia2dkKQorI2VuZGlmIC8qIE5DVVJTRVNfT1BBUVVFICovCisKKyNkZWZpbmUgc2xrX2F0dHJfb2ZmKGEsdikJCSgodikgPyBFUlIgOiBzbGtfYXR0cm9mZihhKSkKKyNkZWZpbmUgc2xrX2F0dHJfb24oYSx2KQkJKCh2KSA/IEVSUiA6IHNsa19hdHRyb24oYSkpCisKKyNpZiAhTkNVUlNFU19PUEFRVUUKKyNpZiBkZWZpbmVkKE5DVVJTRVNfV0lERUNIQVIpICYmIDAKKyNkZWZpbmUgd2F0dHJfc2V0KHdpbixhLHAsb3B0cykJCSgod2luKS0+X2F0dHJzID0gKChhKSAmIH5BX0NPTE9SKSwgXAorCQkJCQkgKHdpbiktPl9jb2xvciA9IChwKSwgXAorCQkJCQkgT0spCisjZGVmaW5lIHdhdHRyX2dldCh3aW4sYSxwLG9wdHMpCQkoKHZvaWQpKChhKSAhPSAodm9pZCAqKTAgJiYgKCooYSkgPSAod2luKS0+X2F0dHJzKSksIFwKKwkJCQkJICh2b2lkKSgocCkgIT0gKHZvaWQgKikwICYmICgqKHApID0gKHNob3J0KSh3aW4pLT5fY29sb3IpKSwgXAorCQkJCQkgT0spCisjZWxzZQorI2RlZmluZSB3YXR0cl9zZXQod2luLGEscCxvcHRzKQkJKCh3aW4pLT5fYXR0cnMgPSAoKChhKSAmIH5BX0NPTE9SKSB8IChhdHRyX3QpQ09MT1JfUEFJUihwKSksIE9LKQorI2RlZmluZSB3YXR0cl9nZXQod2luLGEscCxvcHRzKQkJKCh2b2lkKSgoYSkgIT0gKHZvaWQgKikwICYmICgqKGEpID0gKHdpbiktPl9hdHRycykpLCBcCisJCQkJCSAodm9pZCkoKHApICE9ICh2b2lkICopMCAmJiAoKihwKSA9IChzaG9ydClQQUlSX05VTUJFUigod2luKS0+X2F0dHJzKSkpLCBcCisJCQkJCSBPSykKKyNlbmRpZgorI2VuZGlmIC8qIE5DVVJTRVNfT1BBUVVFICovCisKKy8qCisgKiBYL09wZW4gY3Vyc2VzIGRlcHJlY2F0ZXMgU1ZyNCB2d3ByaW50dy92d3NjYW53LCB3aGljaCBhcmUgc3VwcG9zZWQgdG8gdXNlCisgKiB2YXJhcmdzLmguICBJdCBhZGRzIG5ldyBjYWxscyB2d19wcmludHcvdndfc2NhbncsIHdoaWNoIGFyZSBzdXBwb3NlZCB0bworICogdXNlIFBPU0lYIHN0ZGFyZy5oLiAgVGhlIG5jdXJzZXMgdmVyc2lvbnMgb2YgdndwcmludHcvdndzY2FudyBhbHJlYWR5CisgKiB1c2Ugc3RkYXJnLmgsIHNvLi4uCisgKi8KKyNkZWZpbmUgdndfcHJpbnR3CQl2d3ByaW50dworI2RlZmluZSB2d19zY2FudwkJdndzY2FudworCisvKgorICogRXhwb3J0IGZhbGxiYWNrIGZ1bmN0aW9uIGZvciB1c2UgaW4gQysrIGJpbmRpbmcuCisgKi8KKyNpZiAhMQorI2RlZmluZSB2c3NjYW5mKGEsYixjKSBfbmNfdnNzY2FuZihhLGIsYykKK05DVVJTRVNfRVhQT1JUKGludCkgdnNzY2FuZihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisjZW5kaWYKKworLyoKKyAqIFRoZXNlIG1hY3JvcyBhcmUgZXh0ZW5zaW9ucyAtIG5vdCBpbiBYL09wZW4gQ3Vyc2VzLgorICovCisjaWYgMQorI2lmICFOQ1VSU0VTX09QQVFVRQorI2RlZmluZSBpc19jbGVhcmVkKHdpbikJCSgod2luKSA/ICh3aW4pLT5fY2xlYXIgOiBGQUxTRSkKKyNkZWZpbmUgaXNfaWRjb2sod2luKQkJKCh3aW4pID8gKHdpbiktPl9pZGNvayA6IEZBTFNFKQorI2RlZmluZSBpc19pZGxvayh3aW4pCQkoKHdpbikgPyAod2luKS0+X2lkbG9rIDogRkFMU0UpCisjZGVmaW5lIGlzX2ltbWVkb2sod2luKQkJKCh3aW4pID8gKHdpbiktPl9pbW1lZCA6IEZBTFNFKQorI2RlZmluZSBpc19rZXlwYWQod2luKQkJKCh3aW4pID8gKHdpbiktPl91c2Vfa2V5cGFkIDogRkFMU0UpCisjZGVmaW5lIGlzX2xlYXZlb2sod2luKQkJKCh3aW4pID8gKHdpbiktPl9sZWF2ZW9rIDogRkFMU0UpCisjZGVmaW5lIGlzX25vZGVsYXkod2luKQkJKCh3aW4pID8gKCh3aW4pLT5fZGVsYXkgPT0gMCkgOiBGQUxTRSkKKyNkZWZpbmUgaXNfbm90aW1lb3V0KHdpbikJKCh3aW4pID8gKHdpbiktPl9ub3RpbWVvdXQgOiBGQUxTRSkKKyNkZWZpbmUgaXNfcGFkKHdpbikJCSgod2luKSA/ICgod2luKS0+X2ZsYWdzICYgX0lTUEFEKSAhPSAwIDogRkFMU0UpCisjZGVmaW5lIGlzX3Njcm9sbG9rKHdpbikJKCh3aW4pID8gKHdpbiktPl9zY3JvbGwgOiBGQUxTRSkKKyNkZWZpbmUgaXNfc3Vid2luKHdpbikJCSgod2luKSA/ICgod2luKS0+X2ZsYWdzICYgX1NVQldJTikgIT0gMCA6IEZBTFNFKQorI2RlZmluZSBpc19zeW5jb2sod2luKQkJKCh3aW4pID8gKHdpbiktPl9zeW5jIDogRkFMU0UpCisjZGVmaW5lIHdnZXRwYXJlbnQod2luKQkJKCh3aW4pID8gKHdpbiktPl9wYXJlbnQgOiAwKQorI2RlZmluZSB3Z2V0c2NycmVnKHdpbix0LGIpCSgod2luKSA/ICgqKHQpID0gKHdpbiktPl9yZWd0b3AsICooYikgPSAod2luKS0+X3JlZ2JvdHRvbSwgT0spIDogRVJSKQorI2VuZGlmCisjZW5kaWYKKworI2VuZGlmIC8qIE5DVVJTRVNfTk9NQUNST1MgKi8KKworLyoKKyAqIFB1YmxpYyB2YXJpYWJsZXMuCisgKgorICogTm90ZXM6CisgKglhLiBFU0NERUxBWSB3YXMgYW4gdW5kb2N1bWVudGVkIGZlYXR1cmUgdW5kZXIgQUlYIGN1cnNlcy4KKyAqCSAgIEl0IGdpdmVzIHRoZSBFU0MgZXhwaXJlIHRpbWUgaW4gbWlsbGlzZWNvbmRzLgorICoJYi4gdHR5dHlwZSBpcyBuZWVkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAqLworI2lmIE5DVVJTRVNfUkVFTlRSQU5UCisKK05DVVJTRVNfV1JBUFBFRF9WQVIoV0lORE9XICosIGN1cnNjcik7CitOQ1VSU0VTX1dSQVBQRURfVkFSKFdJTkRPVyAqLCBuZXdzY3IpOworTkNVUlNFU19XUkFQUEVEX1ZBUihXSU5ET1cgKiwgc3Rkc2NyKTsKK05DVVJTRVNfV1JBUFBFRF9WQVIoY2hhciAqLCB0dHl0eXBlKTsKK05DVVJTRVNfV1JBUFBFRF9WQVIoaW50LCBDT0xPUlMpOworTkNVUlNFU19XUkFQUEVEX1ZBUihpbnQsIENPTE9SX1BBSVJTKTsKK05DVVJTRVNfV1JBUFBFRF9WQVIoaW50LCBDT0xTKTsKK05DVVJTRVNfV1JBUFBFRF9WQVIoaW50LCBFU0NERUxBWSk7CitOQ1VSU0VTX1dSQVBQRURfVkFSKGludCwgTElORVMpOworTkNVUlNFU19XUkFQUEVEX1ZBUihpbnQsIFRBQlNJWkUpOworCisjZGVmaW5lIGN1cnNjciAgICAgIE5DVVJTRVNfUFVCTElDX1ZBUihjdXJzY3IoKSkKKyNkZWZpbmUgbmV3c2NyICAgICAgTkNVUlNFU19QVUJMSUNfVkFSKG5ld3NjcigpKQorI2RlZmluZSBzdGRzY3IgICAgICBOQ1VSU0VTX1BVQkxJQ19WQVIoc3Rkc2NyKCkpCisjZGVmaW5lIHR0eXR5cGUgICAgIE5DVVJTRVNfUFVCTElDX1ZBUih0dHl0eXBlKCkpCisjZGVmaW5lIENPTE9SUyAgICAgIE5DVVJTRVNfUFVCTElDX1ZBUihDT0xPUlMoKSkKKyNkZWZpbmUgQ09MT1JfUEFJUlMgTkNVUlNFU19QVUJMSUNfVkFSKENPTE9SX1BBSVJTKCkpCisjZGVmaW5lIENPTFMgICAgICAgIE5DVVJTRVNfUFVCTElDX1ZBUihDT0xTKCkpCisjZGVmaW5lIEVTQ0RFTEFZICAgIE5DVVJTRVNfUFVCTElDX1ZBUihFU0NERUxBWSgpKQorI2RlZmluZSBMSU5FUyAgICAgICBOQ1VSU0VTX1BVQkxJQ19WQVIoTElORVMoKSkKKyNkZWZpbmUgVEFCU0laRSAgICAgTkNVUlNFU19QVUJMSUNfVkFSKFRBQlNJWkUoKSkKKworI2Vsc2UKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihXSU5ET1cgKikgY3Vyc2NyOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihXSU5ET1cgKikgbmV3c2NyOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihXSU5ET1cgKikgc3Rkc2NyOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihjaGFyKSB0dHl0eXBlW107CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGludCkgQ09MT1JTOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihpbnQpIENPTE9SX1BBSVJTOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihpbnQpIENPTFM7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGludCkgRVNDREVMQVk7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGludCkgTElORVM7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGludCkgVEFCU0laRTsKKworI2VuZGlmCisKKy8qCisgKiBQc2V1ZG8tY2hhcmFjdGVyIHRva2VucyBvdXRzaWRlIEFTQ0lJIHJhbmdlLiAgVGhlIGN1cnNlcyB3Z2V0Y2goKSBmdW5jdGlvbgorICogd2lsbCByZXR1cm4gYW55IGdpdmVuIG9uZSBvZiB0aGVzZSBvbmx5IGlmIHRoZSBjb3JyZXNwb25kaW5nIGstIGNhcGFiaWxpdHkKKyAqIGlzIGRlZmluZWQgaW4geW91ciB0ZXJtaW5hbCdzIHRlcm1pbmZvIGVudHJ5LgorICoKKyAqIFNvbWUga2V5cyAoS0VZX0ExLCBldGMpIGFyZSBhcnJhbmdlZCBsaWtlIHRoaXM6CisgKglhMSAgICAgdXAgICAgYTMKKyAqCWxlZnQgICBiMiAgICByaWdodAorICoJYzEgICAgIGRvd24gIGMzCisgKgorICogQSBmZXcga2V5IGNvZGVzIGRvIG5vdCBkZXBlbmQgdXBvbiB0aGUgdGVybWluZm8gZW50cnkuCisgKi8KKyNkZWZpbmUgS0VZX0NPREVfWUVTCTA0MDAJCS8qIEEgd2NoYXJfdCBjb250YWlucyBhIGtleSBjb2RlICovCisjZGVmaW5lIEtFWV9NSU4JCTA0MDEJCS8qIE1pbmltdW0gY3Vyc2VzIGtleSAqLworI2RlZmluZSBLRVlfQlJFQUsJMDQwMQkJLyogQnJlYWsga2V5ICh1bnJlbGlhYmxlKSAqLworI2RlZmluZSBLRVlfU1JFU0VUCTA1MzAJCS8qIFNvZnQgKHBhcnRpYWwpIHJlc2V0ICh1bnJlbGlhYmxlKSAqLworI2RlZmluZSBLRVlfUkVTRVQJMDUzMQkJLyogUmVzZXQgb3IgaGFyZCByZXNldCAodW5yZWxpYWJsZSkgKi8KKy8qCisgKiBUaGVzZSBkZWZpbml0aW9ucyB3ZXJlIGdlbmVyYXRlZCBieSAvYnVpbGQvYnVpbGRkL25jdXJzZXMtNS45L2luY2x1ZGUvTUtrZXlfZGVmcy5zaCAvYnVpbGQvYnVpbGRkL25jdXJzZXMtNS45L2luY2x1ZGUvQ2FwcworICovCisjZGVmaW5lIEtFWV9ET1dOCTA0MDIJCS8qIGRvd24tYXJyb3cga2V5ICovCisjZGVmaW5lIEtFWV9VUAkJMDQwMwkJLyogdXAtYXJyb3cga2V5ICovCisjZGVmaW5lIEtFWV9MRUZUCTA0MDQJCS8qIGxlZnQtYXJyb3cga2V5ICovCisjZGVmaW5lIEtFWV9SSUdIVAkwNDA1CQkvKiByaWdodC1hcnJvdyBrZXkgKi8KKyNkZWZpbmUgS0VZX0hPTUUJMDQwNgkJLyogaG9tZSBrZXkgKi8KKyNkZWZpbmUgS0VZX0JBQ0tTUEFDRQkwNDA3CQkvKiBiYWNrc3BhY2Uga2V5ICovCisjZGVmaW5lIEtFWV9GMAkJMDQxMAkJLyogRnVuY3Rpb24ga2V5cy4gIFNwYWNlIGZvciA2NCAqLworI2RlZmluZSBLRVlfRihuKQkoS0VZX0YwKyhuKSkJLyogVmFsdWUgb2YgZnVuY3Rpb24ga2V5IG4gKi8KKyNkZWZpbmUgS0VZX0RMCQkwNTEwCQkvKiBkZWxldGUtbGluZSBrZXkgKi8KKyNkZWZpbmUgS0VZX0lMCQkwNTExCQkvKiBpbnNlcnQtbGluZSBrZXkgKi8KKyNkZWZpbmUgS0VZX0RDCQkwNTEyCQkvKiBkZWxldGUtY2hhcmFjdGVyIGtleSAqLworI2RlZmluZSBLRVlfSUMJCTA1MTMJCS8qIGluc2VydC1jaGFyYWN0ZXIga2V5ICovCisjZGVmaW5lIEtFWV9FSUMJCTA1MTQJCS8qIHNlbnQgYnkgcm1pciBvciBzbWlyIGluIGluc2VydCBtb2RlICovCisjZGVmaW5lIEtFWV9DTEVBUgkwNTE1CQkvKiBjbGVhci1zY3JlZW4gb3IgZXJhc2Uga2V5ICovCisjZGVmaW5lIEtFWV9FT1MJCTA1MTYJCS8qIGNsZWFyLXRvLWVuZC1vZi1zY3JlZW4ga2V5ICovCisjZGVmaW5lIEtFWV9FT0wJCTA1MTcJCS8qIGNsZWFyLXRvLWVuZC1vZi1saW5lIGtleSAqLworI2RlZmluZSBLRVlfU0YJCTA1MjAJCS8qIHNjcm9sbC1mb3J3YXJkIGtleSAqLworI2RlZmluZSBLRVlfU1IJCTA1MjEJCS8qIHNjcm9sbC1iYWNrd2FyZCBrZXkgKi8KKyNkZWZpbmUgS0VZX05QQUdFCTA1MjIJCS8qIG5leHQtcGFnZSBrZXkgKi8KKyNkZWZpbmUgS0VZX1BQQUdFCTA1MjMJCS8qIHByZXZpb3VzLXBhZ2Uga2V5ICovCisjZGVmaW5lIEtFWV9TVEFCCTA1MjQJCS8qIHNldC10YWIga2V5ICovCisjZGVmaW5lIEtFWV9DVEFCCTA1MjUJCS8qIGNsZWFyLXRhYiBrZXkgKi8KKyNkZWZpbmUgS0VZX0NBVEFCCTA1MjYJCS8qIGNsZWFyLWFsbC10YWJzIGtleSAqLworI2RlZmluZSBLRVlfRU5URVIJMDUyNwkJLyogZW50ZXIvc2VuZCBrZXkgKi8KKyNkZWZpbmUgS0VZX1BSSU5UCTA1MzIJCS8qIHByaW50IGtleSAqLworI2RlZmluZSBLRVlfTEwJCTA1MzMJCS8qIGxvd2VyLWxlZnQga2V5IChob21lIGRvd24pICovCisjZGVmaW5lIEtFWV9BMQkJMDUzNAkJLyogdXBwZXIgbGVmdCBvZiBrZXlwYWQgKi8KKyNkZWZpbmUgS0VZX0EzCQkwNTM1CQkvKiB1cHBlciByaWdodCBvZiBrZXlwYWQgKi8KKyNkZWZpbmUgS0VZX0IyCQkwNTM2CQkvKiBjZW50ZXIgb2Yga2V5cGFkICovCisjZGVmaW5lIEtFWV9DMQkJMDUzNwkJLyogbG93ZXIgbGVmdCBvZiBrZXlwYWQgKi8KKyNkZWZpbmUgS0VZX0MzCQkwNTQwCQkvKiBsb3dlciByaWdodCBvZiBrZXlwYWQgKi8KKyNkZWZpbmUgS0VZX0JUQUIJMDU0MQkJLyogYmFjay10YWIga2V5ICovCisjZGVmaW5lIEtFWV9CRUcJCTA1NDIJCS8qIGJlZ2luIGtleSAqLworI2RlZmluZSBLRVlfQ0FOQ0VMCTA1NDMJCS8qIGNhbmNlbCBrZXkgKi8KKyNkZWZpbmUgS0VZX0NMT1NFCTA1NDQJCS8qIGNsb3NlIGtleSAqLworI2RlZmluZSBLRVlfQ09NTUFORAkwNTQ1CQkvKiBjb21tYW5kIGtleSAqLworI2RlZmluZSBLRVlfQ09QWQkwNTQ2CQkvKiBjb3B5IGtleSAqLworI2RlZmluZSBLRVlfQ1JFQVRFCTA1NDcJCS8qIGNyZWF0ZSBrZXkgKi8KKyNkZWZpbmUgS0VZX0VORAkJMDU1MAkJLyogZW5kIGtleSAqLworI2RlZmluZSBLRVlfRVhJVAkwNTUxCQkvKiBleGl0IGtleSAqLworI2RlZmluZSBLRVlfRklORAkwNTUyCQkvKiBmaW5kIGtleSAqLworI2RlZmluZSBLRVlfSEVMUAkwNTUzCQkvKiBoZWxwIGtleSAqLworI2RlZmluZSBLRVlfTUFSSwkwNTU0CQkvKiBtYXJrIGtleSAqLworI2RlZmluZSBLRVlfTUVTU0FHRQkwNTU1CQkvKiBtZXNzYWdlIGtleSAqLworI2RlZmluZSBLRVlfTU9WRQkwNTU2CQkvKiBtb3ZlIGtleSAqLworI2RlZmluZSBLRVlfTkVYVAkwNTU3CQkvKiBuZXh0IGtleSAqLworI2RlZmluZSBLRVlfT1BFTgkwNTYwCQkvKiBvcGVuIGtleSAqLworI2RlZmluZSBLRVlfT1BUSU9OUwkwNTYxCQkvKiBvcHRpb25zIGtleSAqLworI2RlZmluZSBLRVlfUFJFVklPVVMJMDU2MgkJLyogcHJldmlvdXMga2V5ICovCisjZGVmaW5lIEtFWV9SRURPCTA1NjMJCS8qIHJlZG8ga2V5ICovCisjZGVmaW5lIEtFWV9SRUZFUkVOQ0UJMDU2NAkJLyogcmVmZXJlbmNlIGtleSAqLworI2RlZmluZSBLRVlfUkVGUkVTSAkwNTY1CQkvKiByZWZyZXNoIGtleSAqLworI2RlZmluZSBLRVlfUkVQTEFDRQkwNTY2CQkvKiByZXBsYWNlIGtleSAqLworI2RlZmluZSBLRVlfUkVTVEFSVAkwNTY3CQkvKiByZXN0YXJ0IGtleSAqLworI2RlZmluZSBLRVlfUkVTVU1FCTA1NzAJCS8qIHJlc3VtZSBrZXkgKi8KKyNkZWZpbmUgS0VZX1NBVkUJMDU3MQkJLyogc2F2ZSBrZXkgKi8KKyNkZWZpbmUgS0VZX1NCRUcJMDU3MgkJLyogc2hpZnRlZCBiZWdpbiBrZXkgKi8KKyNkZWZpbmUgS0VZX1NDQU5DRUwJMDU3MwkJLyogc2hpZnRlZCBjYW5jZWwga2V5ICovCisjZGVmaW5lIEtFWV9TQ09NTUFORAkwNTc0CQkvKiBzaGlmdGVkIGNvbW1hbmQga2V5ICovCisjZGVmaW5lIEtFWV9TQ09QWQkwNTc1CQkvKiBzaGlmdGVkIGNvcHkga2V5ICovCisjZGVmaW5lIEtFWV9TQ1JFQVRFCTA1NzYJCS8qIHNoaWZ0ZWQgY3JlYXRlIGtleSAqLworI2RlZmluZSBLRVlfU0RDCQkwNTc3CQkvKiBzaGlmdGVkIGRlbGV0ZS1jaGFyYWN0ZXIga2V5ICovCisjZGVmaW5lIEtFWV9TREwJCTA2MDAJCS8qIHNoaWZ0ZWQgZGVsZXRlLWxpbmUga2V5ICovCisjZGVmaW5lIEtFWV9TRUxFQ1QJMDYwMQkJLyogc2VsZWN0IGtleSAqLworI2RlZmluZSBLRVlfU0VORAkwNjAyCQkvKiBzaGlmdGVkIGVuZCBrZXkgKi8KKyNkZWZpbmUgS0VZX1NFT0wJMDYwMwkJLyogc2hpZnRlZCBjbGVhci10by1lbmQtb2YtbGluZSBrZXkgKi8KKyNkZWZpbmUgS0VZX1NFWElUCTA2MDQJCS8qIHNoaWZ0ZWQgZXhpdCBrZXkgKi8KKyNkZWZpbmUgS0VZX1NGSU5ECTA2MDUJCS8qIHNoaWZ0ZWQgZmluZCBrZXkgKi8KKyNkZWZpbmUgS0VZX1NIRUxQCTA2MDYJCS8qIHNoaWZ0ZWQgaGVscCBrZXkgKi8KKyNkZWZpbmUgS0VZX1NIT01FCTA2MDcJCS8qIHNoaWZ0ZWQgaG9tZSBrZXkgKi8KKyNkZWZpbmUgS0VZX1NJQwkJMDYxMAkJLyogc2hpZnRlZCBpbnNlcnQtY2hhcmFjdGVyIGtleSAqLworI2RlZmluZSBLRVlfU0xFRlQJMDYxMQkJLyogc2hpZnRlZCBsZWZ0LWFycm93IGtleSAqLworI2RlZmluZSBLRVlfU01FU1NBR0UJMDYxMgkJLyogc2hpZnRlZCBtZXNzYWdlIGtleSAqLworI2RlZmluZSBLRVlfU01PVkUJMDYxMwkJLyogc2hpZnRlZCBtb3ZlIGtleSAqLworI2RlZmluZSBLRVlfU05FWFQJMDYxNAkJLyogc2hpZnRlZCBuZXh0IGtleSAqLworI2RlZmluZSBLRVlfU09QVElPTlMJMDYxNQkJLyogc2hpZnRlZCBvcHRpb25zIGtleSAqLworI2RlZmluZSBLRVlfU1BSRVZJT1VTCTA2MTYJCS8qIHNoaWZ0ZWQgcHJldmlvdXMga2V5ICovCisjZGVmaW5lIEtFWV9TUFJJTlQJMDYxNwkJLyogc2hpZnRlZCBwcmludCBrZXkgKi8KKyNkZWZpbmUgS0VZX1NSRURPCTA2MjAJCS8qIHNoaWZ0ZWQgcmVkbyBrZXkgKi8KKyNkZWZpbmUgS0VZX1NSRVBMQUNFCTA2MjEJCS8qIHNoaWZ0ZWQgcmVwbGFjZSBrZXkgKi8KKyNkZWZpbmUgS0VZX1NSSUdIVAkwNjIyCQkvKiBzaGlmdGVkIHJpZ2h0LWFycm93IGtleSAqLworI2RlZmluZSBLRVlfU1JTVU1FCTA2MjMJCS8qIHNoaWZ0ZWQgcmVzdW1lIGtleSAqLworI2RlZmluZSBLRVlfU1NBVkUJMDYyNAkJLyogc2hpZnRlZCBzYXZlIGtleSAqLworI2RlZmluZSBLRVlfU1NVU1BFTkQJMDYyNQkJLyogc2hpZnRlZCBzdXNwZW5kIGtleSAqLworI2RlZmluZSBLRVlfU1VORE8JMDYyNgkJLyogc2hpZnRlZCB1bmRvIGtleSAqLworI2RlZmluZSBLRVlfU1VTUEVORAkwNjI3CQkvKiBzdXNwZW5kIGtleSAqLworI2RlZmluZSBLRVlfVU5ETwkwNjMwCQkvKiB1bmRvIGtleSAqLworI2RlZmluZSBLRVlfTU9VU0UJMDYzMQkJLyogTW91c2UgZXZlbnQgaGFzIG9jY3VycmVkICovCisjZGVmaW5lIEtFWV9SRVNJWkUJMDYzMgkJLyogVGVybWluYWwgcmVzaXplIGV2ZW50ICovCisjZGVmaW5lIEtFWV9FVkVOVAkwNjMzCQkvKiBXZSB3ZXJlIGludGVycnVwdGVkIGJ5IGFuIGV2ZW50ICovCisKKyNkZWZpbmUgS0VZX01BWAkJMDc3NwkJLyogTWF4aW11bSBrZXkgdmFsdWUgaXMgMDYzMyAqLworLyogJElkOiBjdXJzZXMudGFpbCx2IDEuMjAgMjAxMC8wMy8yOCAxOToxMDo1NSB0b20gRXhwICQgKi8KKy8qCisgKiB2aWxlOmNtb2RlOgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgbmN1cnNlcywgZGVzaWduZWQgdG8gYmUgYXBwZW5kZWQgYWZ0ZXIgY3Vyc2VzLmguaW4KKyAqIChzZWUgdGhhdCBmaWxlIGZvciB0aGUgcmVsZXZhbnQgY29weXJpZ2h0KS4KKyAqLworCisvKiBtb3VzZSBpbnRlcmZhY2UgKi8KKworI2lmIE5DVVJTRVNfTU9VU0VfVkVSU0lPTiA+IDEKKyNkZWZpbmUgTkNVUlNFU19NT1VTRV9NQVNLKGIsbSkgKChtKSA8PCAoKChiKSAtIDEpICogNSkpCisjZWxzZQorI2RlZmluZSBOQ1VSU0VTX01PVVNFX01BU0soYixtKSAoKG0pIDw8ICgoKGIpIC0gMSkgKiA2KSkKKyNlbmRpZgorCisjZGVmaW5lCU5DVVJTRVNfQlVUVE9OX1JFTEVBU0VECTAwMUwKKyNkZWZpbmUJTkNVUlNFU19CVVRUT05fUFJFU1NFRAkwMDJMCisjZGVmaW5lCU5DVVJTRVNfQlVUVE9OX0NMSUNLRUQJMDA0TAorI2RlZmluZQlOQ1VSU0VTX0RPVUJMRV9DTElDS0VECTAxMEwKKyNkZWZpbmUJTkNVUlNFU19UUklQTEVfQ0xJQ0tFRAkwMjBMCisjZGVmaW5lCU5DVVJTRVNfUkVTRVJWRURfRVZFTlQJMDQwTAorCisvKiBldmVudCBtYXNrcyAqLworI2RlZmluZQlCVVRUT04xX1JFTEVBU0VECU5DVVJTRVNfTU9VU0VfTUFTSygxLCBOQ1VSU0VTX0JVVFRPTl9SRUxFQVNFRCkKKyNkZWZpbmUJQlVUVE9OMV9QUkVTU0VECQlOQ1VSU0VTX01PVVNFX01BU0soMSwgTkNVUlNFU19CVVRUT05fUFJFU1NFRCkKKyNkZWZpbmUJQlVUVE9OMV9DTElDS0VECQlOQ1VSU0VTX01PVVNFX01BU0soMSwgTkNVUlNFU19CVVRUT05fQ0xJQ0tFRCkKKyNkZWZpbmUJQlVUVE9OMV9ET1VCTEVfQ0xJQ0tFRAlOQ1VSU0VTX01PVVNFX01BU0soMSwgTkNVUlNFU19ET1VCTEVfQ0xJQ0tFRCkKKyNkZWZpbmUJQlVUVE9OMV9UUklQTEVfQ0xJQ0tFRAlOQ1VSU0VTX01PVVNFX01BU0soMSwgTkNVUlNFU19UUklQTEVfQ0xJQ0tFRCkKKworI2RlZmluZQlCVVRUT04yX1JFTEVBU0VECU5DVVJTRVNfTU9VU0VfTUFTSygyLCBOQ1VSU0VTX0JVVFRPTl9SRUxFQVNFRCkKKyNkZWZpbmUJQlVUVE9OMl9QUkVTU0VECQlOQ1VSU0VTX01PVVNFX01BU0soMiwgTkNVUlNFU19CVVRUT05fUFJFU1NFRCkKKyNkZWZpbmUJQlVUVE9OMl9DTElDS0VECQlOQ1VSU0VTX01PVVNFX01BU0soMiwgTkNVUlNFU19CVVRUT05fQ0xJQ0tFRCkKKyNkZWZpbmUJQlVUVE9OMl9ET1VCTEVfQ0xJQ0tFRAlOQ1VSU0VTX01PVVNFX01BU0soMiwgTkNVUlNFU19ET1VCTEVfQ0xJQ0tFRCkKKyNkZWZpbmUJQlVUVE9OMl9UUklQTEVfQ0xJQ0tFRAlOQ1VSU0VTX01PVVNFX01BU0soMiwgTkNVUlNFU19UUklQTEVfQ0xJQ0tFRCkKKworI2RlZmluZQlCVVRUT04zX1JFTEVBU0VECU5DVVJTRVNfTU9VU0VfTUFTSygzLCBOQ1VSU0VTX0JVVFRPTl9SRUxFQVNFRCkKKyNkZWZpbmUJQlVUVE9OM19QUkVTU0VECQlOQ1VSU0VTX01PVVNFX01BU0soMywgTkNVUlNFU19CVVRUT05fUFJFU1NFRCkKKyNkZWZpbmUJQlVUVE9OM19DTElDS0VECQlOQ1VSU0VTX01PVVNFX01BU0soMywgTkNVUlNFU19CVVRUT05fQ0xJQ0tFRCkKKyNkZWZpbmUJQlVUVE9OM19ET1VCTEVfQ0xJQ0tFRAlOQ1VSU0VTX01PVVNFX01BU0soMywgTkNVUlNFU19ET1VCTEVfQ0xJQ0tFRCkKKyNkZWZpbmUJQlVUVE9OM19UUklQTEVfQ0xJQ0tFRAlOQ1VSU0VTX01PVVNFX01BU0soMywgTkNVUlNFU19UUklQTEVfQ0xJQ0tFRCkKKworI2RlZmluZQlCVVRUT040X1JFTEVBU0VECU5DVVJTRVNfTU9VU0VfTUFTSyg0LCBOQ1VSU0VTX0JVVFRPTl9SRUxFQVNFRCkKKyNkZWZpbmUJQlVUVE9ONF9QUkVTU0VECQlOQ1VSU0VTX01PVVNFX01BU0soNCwgTkNVUlNFU19CVVRUT05fUFJFU1NFRCkKKyNkZWZpbmUJQlVUVE9ONF9DTElDS0VECQlOQ1VSU0VTX01PVVNFX01BU0soNCwgTkNVUlNFU19CVVRUT05fQ0xJQ0tFRCkKKyNkZWZpbmUJQlVUVE9ONF9ET1VCTEVfQ0xJQ0tFRAlOQ1VSU0VTX01PVVNFX01BU0soNCwgTkNVUlNFU19ET1VCTEVfQ0xJQ0tFRCkKKyNkZWZpbmUJQlVUVE9ONF9UUklQTEVfQ0xJQ0tFRAlOQ1VSU0VTX01PVVNFX01BU0soNCwgTkNVUlNFU19UUklQTEVfQ0xJQ0tFRCkKKworLyoKKyAqIEluIDMyIGJpdHMgdGhlIHZlcnNpb24tMSBzY2hlbWUgZG9lcyBub3QgcHJvdmlkZSBlbm91Z2ggc3BhY2UgZm9yIGEgNXRoCisgKiBidXR0b24sIHVubGVzcyB3ZSBjaG9vc2UgdG8gY2hhbmdlIHRoZSBBQkkgYnkgb21pdHRpbmcgdGhlIHJlc2VydmVkLWV2ZW50cy4KKyAqLworI2lmIE5DVVJTRVNfTU9VU0VfVkVSU0lPTiA+IDEKKworI2RlZmluZQlCVVRUT041X1JFTEVBU0VECU5DVVJTRVNfTU9VU0VfTUFTSyg1LCBOQ1VSU0VTX0JVVFRPTl9SRUxFQVNFRCkKKyNkZWZpbmUJQlVUVE9ONV9QUkVTU0VECQlOQ1VSU0VTX01PVVNFX01BU0soNSwgTkNVUlNFU19CVVRUT05fUFJFU1NFRCkKKyNkZWZpbmUJQlVUVE9ONV9DTElDS0VECQlOQ1VSU0VTX01PVVNFX01BU0soNSwgTkNVUlNFU19CVVRUT05fQ0xJQ0tFRCkKKyNkZWZpbmUJQlVUVE9ONV9ET1VCTEVfQ0xJQ0tFRAlOQ1VSU0VTX01PVVNFX01BU0soNSwgTkNVUlNFU19ET1VCTEVfQ0xJQ0tFRCkKKyNkZWZpbmUJQlVUVE9ONV9UUklQTEVfQ0xJQ0tFRAlOQ1VSU0VTX01PVVNFX01BU0soNSwgTkNVUlNFU19UUklQTEVfQ0xJQ0tFRCkKKworI2RlZmluZQlCVVRUT05fQ1RSTAkJTkNVUlNFU19NT1VTRV9NQVNLKDYsIDAwMDFMKQorI2RlZmluZQlCVVRUT05fU0hJRlQJCU5DVVJTRVNfTU9VU0VfTUFTSyg2LCAwMDAyTCkKKyNkZWZpbmUJQlVUVE9OX0FMVAkJTkNVUlNFU19NT1VTRV9NQVNLKDYsIDAwMDRMKQorI2RlZmluZQlSRVBPUlRfTU9VU0VfUE9TSVRJT04JTkNVUlNFU19NT1VTRV9NQVNLKDYsIDAwMTBMKQorCisjZWxzZQorCisjZGVmaW5lCUJVVFRPTjFfUkVTRVJWRURfRVZFTlQJTkNVUlNFU19NT1VTRV9NQVNLKDEsIE5DVVJTRVNfUkVTRVJWRURfRVZFTlQpCisjZGVmaW5lCUJVVFRPTjJfUkVTRVJWRURfRVZFTlQJTkNVUlNFU19NT1VTRV9NQVNLKDIsIE5DVVJTRVNfUkVTRVJWRURfRVZFTlQpCisjZGVmaW5lCUJVVFRPTjNfUkVTRVJWRURfRVZFTlQJTkNVUlNFU19NT1VTRV9NQVNLKDMsIE5DVVJTRVNfUkVTRVJWRURfRVZFTlQpCisjZGVmaW5lCUJVVFRPTjRfUkVTRVJWRURfRVZFTlQJTkNVUlNFU19NT1VTRV9NQVNLKDQsIE5DVVJTRVNfUkVTRVJWRURfRVZFTlQpCisKKyNkZWZpbmUJQlVUVE9OX0NUUkwJCU5DVVJTRVNfTU9VU0VfTUFTSyg1LCAwMDAxTCkKKyNkZWZpbmUJQlVUVE9OX1NISUZUCQlOQ1VSU0VTX01PVVNFX01BU0soNSwgMDAwMkwpCisjZGVmaW5lCUJVVFRPTl9BTFQJCU5DVVJTRVNfTU9VU0VfTUFTSyg1LCAwMDA0TCkKKyNkZWZpbmUJUkVQT1JUX01PVVNFX1BPU0lUSU9OCU5DVVJTRVNfTU9VU0VfTUFTSyg1LCAwMDEwTCkKKworI2VuZGlmCisKKyNkZWZpbmUJQUxMX01PVVNFX0VWRU5UUwkoUkVQT1JUX01PVVNFX1BPU0lUSU9OIC0gMSkKKworLyogbWFjcm9zIHRvIGV4dHJhY3Qgc2luZ2xlIGV2ZW50LWJpdHMgZnJvbSBtYXNrcyAqLworI2RlZmluZQlCVVRUT05fUkVMRUFTRShlLCB4KQkJKChlKSAmIE5DVVJTRVNfTU9VU0VfTUFTSyh4LCAwMDEpKQorI2RlZmluZQlCVVRUT05fUFJFU1MoZSwgeCkJCSgoZSkgJiBOQ1VSU0VTX01PVVNFX01BU0soeCwgMDAyKSkKKyNkZWZpbmUJQlVUVE9OX0NMSUNLKGUsIHgpCQkoKGUpICYgTkNVUlNFU19NT1VTRV9NQVNLKHgsIDAwNCkpCisjZGVmaW5lCUJVVFRPTl9ET1VCTEVfQ0xJQ0soZSwgeCkJKChlKSAmIE5DVVJTRVNfTU9VU0VfTUFTSyh4LCAwMTApKQorI2RlZmluZQlCVVRUT05fVFJJUExFX0NMSUNLKGUsIHgpCSgoZSkgJiBOQ1VSU0VTX01PVVNFX01BU0soeCwgMDIwKSkKKyNkZWZpbmUJQlVUVE9OX1JFU0VSVkVEX0VWRU5UKGUsIHgpCSgoZSkgJiBOQ1VSU0VTX01PVVNFX01BU0soeCwgMDQwKSkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBzaG9ydCBpZDsJCS8qIElEIHRvIGRpc3Rpbmd1aXNoIG11bHRpcGxlIGRldmljZXMgKi8KKyAgICBpbnQgeCwgeSwgejsJLyogZXZlbnQgY29vcmRpbmF0ZXMgKGNoYXJhY3Rlci1jZWxsKSAqLworICAgIG1tYXNrX3QgYnN0YXRlOwkvKiBidXR0b24gc3RhdGUgYml0cyAqLworfQorTUVWRU5UOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgICAgaGFzX21vdXNlKHZvaWQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgICAgIGdldG1vdXNlIChNRVZFTlQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgdW5nZXRtb3VzZSAoTUVWRU5UICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKG1tYXNrX3QpIG1vdXNlbWFzayAobW1hc2tfdCwgbW1hc2tfdCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSAgICB3ZW5jbG9zZSAoY29uc3QgV0lORE9XICosIGludCwgaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpICAgICBtb3VzZWludGVydmFsIChpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpICAgIHdtb3VzZV90cmFmbyAoY29uc3QgV0lORE9XKiwgaW50KiwgaW50KiwgYm9vbCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgICAgbW91c2VfdHJhZm8gKGludCosIGludCosIGJvb2wpOyAgICAgICAgICAgICAgLyogZ2VuZXJhdGVkICovCisKKyNpZiBOQ1VSU0VTX1NQX0ZVTkNTCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgICAgTkNVUlNFU19TUF9OQU1FKGhhc19tb3VzZSkgKFNDUkVFTiopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgICAgIE5DVVJTRVNfU1BfTkFNRShnZXRtb3VzZSkgKFNDUkVFTiosIE1FVkVOVCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpICAgICBOQ1VSU0VTX1NQX05BTUUodW5nZXRtb3VzZSkgKFNDUkVFTiosTUVWRU5UICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKG1tYXNrX3QpIE5DVVJTRVNfU1BfTkFNRShtb3VzZW1hc2spIChTQ1JFRU4qLCBtbWFza190LCBtbWFza190ICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgICAgIE5DVVJTRVNfU1BfTkFNRShtb3VzZWludGVydmFsKSAoU0NSRUVOKiwgaW50KTsKKyNlbmRpZgorCisjZGVmaW5lIG1vdXNlX3RyYWZvKHkseCx0b19zY3JlZW4pIHdtb3VzZV90cmFmbyhzdGRzY3IseSx4LHRvX3NjcmVlbikKKworLyogb3RoZXIgbm9uLVhTSSBmdW5jdGlvbnMgKi8KKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbWNwcmludCAoY2hhciAqLCBpbnQpOwkvKiBkaXJlY3QgZGF0YSB0byBwcmludGVyICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBoYXNfa2V5IChpbnQpOwkJLyogZG8gd2UgaGF2ZSBnaXZlbiBrZXk/ICovCisKKyNpZiBOQ1VSU0VTX1NQX0ZVTkNTCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBOQ1VSU0VTX1NQX05BTUUoaGFzX2tleSkgKFNDUkVFTiosIGludCk7ICAgIC8qIGRvIHdlIGhhdmUgZ2l2ZW4ga2V5PyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgTkNVUlNFU19TUF9OQU1FKG1jcHJpbnQpIChTQ1JFRU4qLCBjaGFyICosIGludCk7CS8qIGRpcmVjdCBkYXRhIHRvIHByaW50ZXIgKi8KKyNlbmRpZgorCisvKiBEZWJ1Z2dpbmcgOiB1c2Ugd2l0aCBsaWJuY3Vyc2VzX2cuYSAqLworCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX3RyYWNlZiAoY29uc3QgY2hhciAqLCAuLi4pIEdDQ19QUklOVEZMSUtFKDEsMik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX3RyYWNlZHVtcCAoY29uc3QgY2hhciAqLCBXSU5ET1cgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBfdHJhY2VhdHRyIChhdHRyX3QpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgX3RyYWNlYXR0cjIgKGludCwgY2h0eXBlKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIF9uY190cmFjZWJpdHMgKHZvaWQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgX3RyYWNlY2hhciAoaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIF90cmFjZWNodHlwZSAoY2h0eXBlKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIF90cmFjZWNodHlwZTIgKGludCwgY2h0eXBlKTsKKyNpZmRlZiBOQ1VSU0VTX1dJREVDSEFSCisjZGVmaW5lIF90cmFjZWNoX3QJCV90cmFjZWNjaGFyX3QKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIF90cmFjZWNjaGFyX3QgKGNvbnN0IGNjaGFyX3QgKik7CisjZGVmaW5lIF90cmFjZWNoX3QyCQlfdHJhY2VjY2hhcl90MgorZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgX3RyYWNlY2NoYXJfdDIgKGludCwgY29uc3QgY2NoYXJfdCAqKTsKKyNlbHNlCisjZGVmaW5lIF90cmFjZWNoX3QJCV90cmFjZWNodHlwZQorI2RlZmluZSBfdHJhY2VjaF90MgkJX3RyYWNlY2h0eXBlMgorI2VuZGlmCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBfdHJhY2Vtb3VzZSAoY29uc3QgTUVWRU5UICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIHRyYWNlIChjb25zdCB1bnNpZ25lZCBpbnQpOworCisvKiB0cmFjZSBtYXNrcyAqLworI2RlZmluZSBUUkFDRV9ESVNBQkxFCTB4MDAwMAkvKiB0dXJuIG9mZiB0cmFjaW5nICovCisjZGVmaW5lIFRSQUNFX1RJTUVTCTB4MDAwMQkvKiB0cmFjZSB1c2VyIGFuZCBzeXN0ZW0gdGltZXMgb2YgdXBkYXRlcyAqLworI2RlZmluZSBUUkFDRV9UUFVUUwkweDAwMDIJLyogdHJhY2UgdHB1dHMgY2FsbHMgKi8KKyNkZWZpbmUgVFJBQ0VfVVBEQVRFCTB4MDAwNAkvKiB0cmFjZSB1cGRhdGUgYWN0aW9ucywgb2xkICYgbmV3IHNjcmVlbnMgKi8KKyNkZWZpbmUgVFJBQ0VfTU9WRQkweDAwMDgJLyogdHJhY2UgY3Vyc29yIG1vdmVzIGFuZCBzY3JvbGxzICovCisjZGVmaW5lIFRSQUNFX0NIQVJQVVQJMHgwMDEwCS8qIHRyYWNlIGFsbCBjaGFyYWN0ZXIgb3V0cHV0cyAqLworI2RlZmluZSBUUkFDRV9PUkRJTkFSWQkweDAwMUYJLyogdHJhY2UgYWxsIHVwZGF0ZSBhY3Rpb25zICovCisjZGVmaW5lIFRSQUNFX0NBTExTCTB4MDAyMAkvKiB0cmFjZSBhbGwgY3Vyc2VzIGNhbGxzICovCisjZGVmaW5lIFRSQUNFX1ZJUlRQVVQJMHgwMDQwCS8qIHRyYWNlIHZpcnR1YWwgY2hhcmFjdGVyIHB1dHMgKi8KKyNkZWZpbmUgVFJBQ0VfSUVWRU5UCTB4MDA4MAkvKiB0cmFjZSBsb3ctbGV2ZWwgaW5wdXQgcHJvY2Vzc2luZyAqLworI2RlZmluZSBUUkFDRV9CSVRTCTB4MDEwMAkvKiB0cmFjZSBzdGF0ZSBvZiBUVFkgY29udHJvbCBiaXRzICovCisjZGVmaW5lIFRSQUNFX0lDQUxMUwkweDAyMDAJLyogdHJhY2UgaW50ZXJuYWwvbmVzdGVkIGNhbGxzICovCisjZGVmaW5lIFRSQUNFX0NDQUxMUwkweDA0MDAJLyogdHJhY2UgcGVyLWNoYXJhY3RlciBjYWxscyAqLworI2RlZmluZSBUUkFDRV9EQVRBQkFTRQkweDA4MDAJLyogdHJhY2UgcmVhZC93cml0ZSBvZiB0ZXJtaW5mby90ZXJtY2FwIGRhdGEgKi8KKyNkZWZpbmUgVFJBQ0VfQVRUUlMJMHgxMDAwCS8qIHRyYWNlIGF0dHJpYnV0ZSB1cGRhdGVzICovCisKKyNkZWZpbmUgVFJBQ0VfU0hJRlQJMTMJLyogbnVtYmVyIG9mIGJpdHMgaW4gdGhlIHRyYWNlIG1hc2tzICovCisjZGVmaW5lIFRSQUNFX01BWElNVU0JKCgxIDw8IFRSQUNFX1NISUZUKSAtIDEpIC8qIG1heGltdW0gdHJhY2UgbGV2ZWwgKi8KKworI2lmIGRlZmluZWQoVFJBQ0UpIHx8IGRlZmluZWQoTkNVUlNFU19URVNUKQorZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihpbnQpIF9uY19vcHRpbWl6ZV9lbmFibGU7CQkvKiBlbmFibGUgb3B0aW1pemF0aW9ucyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNvbnN0IGNoYXIgKikgX25jX3Zpc2J1ZiAoY29uc3QgY2hhciAqKTsKKyNkZWZpbmUgT1BUSU1JWkVfTVZDVVIJCTB4MDEJLyogY3Vyc29yIG1vdmVtZW50IG9wdGltaXphdGlvbiAqLworI2RlZmluZSBPUFRJTUlaRV9IQVNITUFQCTB4MDIJLyogZGlmZiBoYXNoaW5nIHRvIGRldGVjdCBzY3JvbGxzICovCisjZGVmaW5lIE9QVElNSVpFX1NDUk9MTAkJMHgwNAkvKiBzY3JvbGwgb3B0aW1pemF0aW9uICovCisjZGVmaW5lIE9QVElNSVpFX0FMTAkJMHhmZgkvKiBlbmFibGUgYWxsIG9wdGltaXphdGlvbnMgKGRmbHQpICovCisjZW5kaWYKKworI2luY2x1ZGUgPHVuY3RybC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKKworI2lmbmRlZiBOQ1VSU0VTX05PTUFDUk9TCisKKy8qIHRoZXNlIG5hbWVzIGNvbmZsaWN0IHdpdGggU1RMICovCisjdW5kZWYgYm94CisjdW5kZWYgY2xlYXIKKyN1bmRlZiBlcmFzZQorI3VuZGVmIG1vdmUKKyN1bmRlZiByZWZyZXNoCisKKyNlbmRpZiAvKiBOQ1VSU0VTX05PTUFDUk9TICovCisKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19OQ1VSU0VTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2VzYXBwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2N1cnNlc2FwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlOTk1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2N1cnNlc2FwcC5oCkBAIC0wLDAgKzEsMTc2IEBACisvLyAqIFRoaXMgbWFrZXMgZW1hY3MgaGFwcHkgLSotTW9kZTogQysrOy0qLQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzLDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgICoKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgICAgICAgICAgICAqCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nICAgICAgKgorICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAgICAgICoKKyAqIGRpc3RyaWJ1dGUsIGRpc3RyaWJ1dGUgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgICAgICAqCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgICAgKgorICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAgKgorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgKgorICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiAgICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgKgorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SICAgICoKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAqCisgKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAqCisgKiBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSAgICAgKgorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuICAgICAgICoKKyAqIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQXV0aG9yOiBKdWVyZ2VuIFBmZWlmZXIsIDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gJElkOiBjdXJzZXNhcHAuaCx2IDEuMTEgMjAwNS8wNS8yOCAyMTo1Nzo0NCB0b20gRXhwICQKKworI2lmbmRlZiBOQ1VSU0VTX0NVUlNFU0FQUF9IX2luY2wKKyNkZWZpbmUgTkNVUlNFU19DVVJTRVNBUFBfSF9pbmNsCisKKyNpbmNsdWRlIDxjdXJzc2xrLmg+CisKK2NsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNBcHBsaWNhdGlvbiB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RydWN0IF9zbGtfbGluayB7ICAgICAgICAgIC8vIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gbWFpbnRhaW4KKyAgICBzdHJ1Y3QgX3Nsa19saW5rKiBwcmV2OyAgICAgICAgICAgLy8gYSBzdGFjayBvZiBTTEtzCisgICAgU29mdF9MYWJlbF9LZXlfU2V0KiBTTEtzOworICB9IFNMS19MaW5rOworcHJpdmF0ZToKKyAgc3RhdGljIGludCByaW5pdChOQ3Vyc2VzV2luZG93JiB3KTsgLy8gSW50ZXJuYWwgSW5pdCBmdW5jdGlvbiBmb3IgdGl0bGUKKyAgc3RhdGljIE5DdXJzZXNBcHBsaWNhdGlvbiogdGhlQXBwOyAgLy8gR2xvYmFsIHJlZi4gdG8gdGhlIGFwcGxpY2F0aW9uCisKKyAgc3RhdGljIFNMS19MaW5rKiBzbGtfc3RhY2s7CisKK3Byb3RlY3RlZDoKKyAgc3RhdGljIE5DdXJzZXNXaW5kb3cqIHRpdGxlV2luZG93OyAgLy8gVGhlIFRpdGxlIFdpbmRvdyAoaWYgYW55KQorCisgIGJvb2wgYl9Db2xvcnM7ICAgICAgICAgICAgICAgICAgICAgIC8vIElzIHRoaXMgYSBjb2xvciBhcHBsaWNhdGlvbj8KKyAgTkN1cnNlc1dpbmRvdyogUm9vdF9XaW5kb3c7ICAgICAgICAgLy8gVGhpcyBpcyB0aGUgc3Rkc2NyIGVxdWl2LgorCisgIC8vIEluaXRpYWxpemF0aW9uIG9mIGF0dHJpYnV0ZXM7CisgIC8vIFJld3JpdGUgdGhpcyBpbiB5b3VyIGRlcml2ZWQgY2xhc3MgaWYgeW91IHByZWZlciBvdGhlciBzZXR0aW5ncworICB2aXJ0dWFsIHZvaWQgaW5pdChib29sIGJDb2xvcnMpOworCisgIC8vIFRoZSBudW1iZXIgb2YgbGluZXMgZm9yIHRoZSB0aXRsZSB3aW5kb3cuIERlZmF1bHQgaXMgbm8gdGl0bGUgd2luZG93CisgIC8vIFlvdSBtYXkgcmV3cml0ZSB0aGlzIGluIHlvdXIgZGVyaXZlZCBjbGFzcworICB2aXJ0dWFsIGludCB0aXRsZXNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gcHV0IHNvbWV0aGluZyBpbnRvIHRoZSB0aXRsZSB3aW5kb3cgaW5pdGlhbGx5CisgIC8vIFlvdSBtYXkgcmV3cml0ZSB0aGlzIGluIHlvdXIgZGVyaXZlZCBjbGFzcworICB2aXJ0dWFsIHZvaWQgdGl0bGUoKSB7CisgIH0KKworICAvLyBUaGUgbGF5b3V0IHVzZWQgZm9yIHRoZSBTb2Z0IExhYmVsIEtleXMuIERlZmF1bHQgaXMgdG8gaGF2ZSBubyBTTEtzLgorICAvLyBZb3UgbWF5IHJld3JpdGUgdGhpcyBpbiB5b3VyIGRlcml2ZWQgY2xhc3MKKyAgdmlydHVhbCBTb2Z0X0xhYmVsX0tleV9TZXQ6OkxhYmVsX0xheW91dCB1c2VTTEtzKCkgY29uc3QgeworICAgIHJldHVybiBTb2Z0X0xhYmVsX0tleV9TZXQ6Ok5vbmU7CisgIH0KKworICAvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgU0xLcy4gRGVmYXVsdCBpcyBub3RoaW5nLgorICAvLyBZb3UgbWF5IHJld3JpdGUgdGhpcyBpbiB5b3VyIGRlcml2ZWQgY2xhc3MKKyAgdmlydHVhbCB2b2lkIGluaXRfbGFiZWxzKFNvZnRfTGFiZWxfS2V5X1NldCYgUykgY29uc3QgeworICB9CisKKyAgLy8gWW91ciBkZXJpdmVkIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kLiBUaGUgcmV0dXJuIHZhbHVlIG11c3QKKyAgLy8gYmUgdGhlIGV4aXQgdmFsdWUgb2YgeW91ciBhcHBsaWNhdGlvbi4KKyAgdmlydHVhbCBpbnQgcnVuKCkgPSAwOworCisgIC8vIFRoZSBjb25zdHJ1Y3RvciBpcyBwcm90ZWN0ZWQsIHNvIHlvdSBtYXkgdXNlIGl0IGluIHlvdXIgZGVyaXZlZAorICAvLyBjbGFzcyBjb25zdHJ1Y3Rvci4gVGhlIGFyZ3VtZW50IHRlbGxzIHdoZXRoZXIgb3Igbm90IHlvdSB3YW50IGNvbG9ycy4KKyAgTkN1cnNlc0FwcGxpY2F0aW9uKGJvb2wgd2FudENvbG9ycyA9IEZBTFNFKTsKKworICBOQ3Vyc2VzQXBwbGljYXRpb24mIG9wZXJhdG9yPShjb25zdCBOQ3Vyc2VzQXBwbGljYXRpb24mIHJocykKKyAgeworICAgIGlmICh0aGlzICE9ICZyaHMpIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBOQ3Vyc2VzQXBwbGljYXRpb24oY29uc3QgTkN1cnNlc0FwcGxpY2F0aW9uJiByaHMpCisgICAgOiBiX0NvbG9ycyhyaHMuYl9Db2xvcnMpLAorICAgICAgUm9vdF9XaW5kb3cocmhzLlJvb3RfV2luZG93KQorICB7CisgIH0KKworcHVibGljOgorICB2aXJ0dWFsIH5OQ3Vyc2VzQXBwbGljYXRpb24oKTsKKworICAvLyBHZXQgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uIG9iamVjdAorICBzdGF0aWMgTkN1cnNlc0FwcGxpY2F0aW9uKiBnZXRBcHBsaWNhdGlvbigpIHsKKyAgICByZXR1cm4gdGhlQXBwOworICB9CisKKyAgLy8gVGhpcyBtZXRob2QgcnVucyB0aGUgYXBwbGljYXRpb24gYW5kIHJldHVybnMgaXRzIGV4aXQgdmFsdWUKKyAgaW50IG9wZXJhdG9yKCkodm9pZCk7CisKKyAgLy8gUHJvY2VzcyB0aGUgY29tbWFuZGxpbmUgYXJndW1lbnRzLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkKKyAgLy8gaWdub3JlcyB0aGVtLiBZb3VyIGRlcml2ZWQgY2xhc3MgbWF5IHJld3JpdGUgdGhpcy4KKyAgdmlydHVhbCB2b2lkIGhhbmRsZUFyZ3MoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICB9CisKKyAgLy8gRG9lcyB0aGlzIGFwcGxpY2F0aW9uIHVzZSBjb2xvcnM/CisgIGlubGluZSBib29sIHVzZUNvbG9ycygpIGNvbnN0IHsKKyAgICByZXR1cm4gYl9Db2xvcnM7CisgIH0KKworICAvLyBQdXNoIHRoZSBLZXkgU2V0IFMgb250byB0aGUgU0xLIFN0YWNrLiBTIHRoZW4gYmVjb21lcyB0aGUgY3VycmVudCBzZXQKKyAgLy8gb2YgU29mdCBMYWJlbGxlZCBLZXlzLgorICB2b2lkIHB1c2goU29mdF9MYWJlbF9LZXlfU2V0JiBTKTsKKworICAvLyBUaHJvdyBhd2F5IHRoZSBjdXJyZW50IHNldCBvZiBTTEtzIGFuZCBtYWtlIHRoZSBwcmV2aW91cyBvbmUgdGhlCisgIC8vIG5ldyBjdXJyZW50IHNldC4KKyAgYm9vbCBwb3AoKTsKKworICAvLyBSZXRyaWV2ZSB0aGUgY3VycmVudCBzZXQgb2YgU29mdCBMYWJlbGxlZCBLZXlzLgorICBTb2Z0X0xhYmVsX0tleV9TZXQqIHRvcCgpIGNvbnN0OworCisgIC8vIEF0dHJpYnV0ZXMgdG8gdXNlIGZvciBtZW51IGFuZCBmb3JtcyBmb3JlZ3JvdW5kcworICB2aXJ0dWFsIGNodHlwZSBmb3JlZ3JvdW5kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gYl9Db2xvcnMgPyBDT0xPUl9QQUlSKDEpIDogQV9CT0xEOworICB9CisKKyAgLy8gQXR0cmlidXRlcyB0byB1c2UgZm9yIG1lbnUgYW5kIGZvcm1zIGJhY2tncm91bmRzCisgIHZpcnR1YWwgY2h0eXBlIGJhY2tncm91bmRzKCkgY29uc3QgeworICAgIHJldHVybiBiX0NvbG9ycyA/IENPTE9SX1BBSVIoMikgOiBBX05PUk1BTDsKKyAgfQorCisgIC8vIEF0dHJpYnV0ZXMgdG8gdXNlIGZvciBpbmFjdGl2ZSAobWVudSkgZWxlbWVudHMKKyAgdmlydHVhbCBjaHR5cGUgaW5hY3RpdmVzKCkgY29uc3QgeworICAgIHJldHVybiBiX0NvbG9ycyA/IChDT0xPUl9QQUlSKDMpfEFfRElNKSA6IEFfRElNOworICB9CisKKyAgLy8gQXR0cmlidXRlcyB0byB1c2UgZm9yIChmb3JtKSBsYWJlbHMgYW5kIFNMS3MKKyAgdmlydHVhbCBjaHR5cGUgbGFiZWxzKCkgY29uc3QgeworICAgIHJldHVybiBiX0NvbG9ycyA/IENPTE9SX1BBSVIoNCkgOiBBX05PUk1BTDsKKyAgfQorCisgIC8vIEF0dHJpYnV0ZXMgdG8gdXNlIGZvciBmb3JtIGJhY2tncm91bmRzCisgIHZpcnR1YWwgY2h0eXBlIGRpYWxvZ19iYWNrZ3JvdW5kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gYl9Db2xvcnMgPyBDT0xPUl9QQUlSKDQpIDogQV9OT1JNQUw7CisgIH0KKworICAvLyBBdHRyaWJ1dGVzIHRvIHVzZSBhcyBkZWZhdWx0IGZvciAoZm9ybSkgd2luZG93IGJhY2tncm91bmRzCisgIHZpcnR1YWwgY2h0eXBlIHdpbmRvd19iYWNrZ3JvdW5kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gYl9Db2xvcnMgPyBDT0xPUl9QQUlSKDUpIDogQV9OT1JNQUw7CisgIH0KKworICAvLyBBdHRyaWJ1dGVzIHRvIHVzZSBmb3IgdGhlIHRpdGxlIHdpbmRvdworICB2aXJ0dWFsIGNodHlwZSBzY3JlZW5fdGl0bGVzKCkgY29uc3QgeworICAgIHJldHVybiBiX0NvbG9ycyA/IENPTE9SX1BBSVIoNikgOiBBX0JPTEQ7CisgIH0KKworfTsKKyAKKyNlbmRpZiAvKiBOQ1VSU0VTX0NVUlNFU0FQUF9IX2luY2wgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2VzZi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzZXNmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBhMzBjMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2VzZi5oCkBAIC0wLDAgKzEsOTY3IEBACisvLyAqIFRoaXMgbWFrZXMgZW1hY3MgaGFwcHkgLSotTW9kZTogQysrOy0qLQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA0LDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgICoKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgICAgICAgICAgICAqCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nICAgICAgKgorICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAgICAgICoKKyAqIGRpc3RyaWJ1dGUsIGRpc3RyaWJ1dGUgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgICAgICAqCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgICAgKgorICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAgKgorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgKgorICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiAgICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgKgorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SICAgICoKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAqCisgKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAqCisgKiBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSAgICAgKgorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuICAgICAgICoKKyAqIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQXV0aG9yOiBKdWVyZ2VuIFBmZWlmZXIsIDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gJElkOiBjdXJzZXNmLmgsdiAxLjI4IDIwMDUvMDgvMTMgMTg6MDg6MjQgdG9tIEV4cCAkCisKKyNpZm5kZWYgTkNVUlNFU19DVVJTRVNGX0hfaW5jbAorI2RlZmluZSBOQ1VSU0VTX0NVUlNFU0ZfSF9pbmNsIDEKKworI2luY2x1ZGUgPGN1cnNlc3AuaD4KKworI2lmbmRlZiBfX0VYVF9RTlgKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCitleHRlcm4gIkMiIHsKKyMgIGluY2x1ZGUgPGZvcm0uaD4KK30KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYnVpdGluIGFuZCB1c2VyIGRlZmluZWQgRmllbGR0eXBlcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzRm9ybUZpZWxkOyAvLyBmb3J3YXJkIGRlY2xhcmF0aW9uCisKKy8vIENsYXNzIHRvIHJlcHJlc2VudCBidWlsdGluIGZpZWxkIHR5cGVzIGFzIHdlbGwgYXMgQysrIHdyaXR0ZW4gbmV3CisvLyBmaWVsZHR5cGVzIChzZWUgY2xhc3NlcyBVc2VyRGVmaW5lRmllbGRUeXBlLi4uCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzRmllbGRUeXBlCit7CisgIGZyaWVuZCBjbGFzcyBOQ3Vyc2VzRm9ybUZpZWxkOworCitwcm90ZWN0ZWQ6CisgIEZJRUxEVFlQRSogZmllbGR0eXBlOworCisgIGlubGluZSB2b2lkIE9uRXJyb3IoaW50IGVycikgY29uc3QgVEhST1dTKE5DdXJzZXNGb3JtRXhjZXB0aW9uKSB7CisgICAgaWYgKGVyciE9RV9PSykKKyAgICAgIFRIUk9XKG5ldyBOQ3Vyc2VzRm9ybUV4Y2VwdGlvbiAoZXJyKSk7CisgIH0KKworICBOQ3Vyc2VzRmllbGRUeXBlKEZJRUxEVFlQRSAqZikgOiBmaWVsZHR5cGUoZikgeworICB9CisKKyAgdmlydHVhbCB+TkN1cnNlc0ZpZWxkVHlwZSgpIHt9CisKKyAgLy8gU2V0IHRoZSBmaWVsZHMgZiBmaWVsZHR5cGUgdG8gdGhpcyBvbmUuCisgIHZpcnR1YWwgdm9pZCBzZXQoTkN1cnNlc0Zvcm1GaWVsZCYgZikgPSAwOworCitwdWJsaWM6CisgIE5DdXJzZXNGaWVsZFR5cGUoKQorICAgIDogZmllbGR0eXBlKFNUQVRJQ19DQVNUKEZJRUxEVFlQRSopKDApKQorICB7CisgIH0KKworICBOQ3Vyc2VzRmllbGRUeXBlJiBvcGVyYXRvcj0oY29uc3QgTkN1cnNlc0ZpZWxkVHlwZSYgcmhzKQorICB7CisgICAgaWYgKHRoaXMgIT0gJnJocykgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE5DdXJzZXNGaWVsZFR5cGUoY29uc3QgTkN1cnNlc0ZpZWxkVHlwZSYgcmhzKQorICAgIDogZmllbGR0eXBlKHJocy5maWVsZHR5cGUpCisgIHsKKyAgfQorCit9OworCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhlIGNsYXNzIHJlcHJlc2VudGluZyBhIGZvcm1zIGZpZWxkLCB3cmFwcGluZyB0aGUgbG93bGV2ZWwgRklFTEQgc3RydWN0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworY2xhc3MgTkNVUlNFU19JTVBFWFAgTkN1cnNlc0Zvcm1GaWVsZAoreworICBmcmllbmQgY2xhc3MgTkN1cnNlc0Zvcm07CisKK3Byb3RlY3RlZDoKKyAgRklFTEQgKmZpZWxkOwkJICAgICAvLyBsb3dsZXZlbCBzdHJ1Y3R1cmUKKyAgTkN1cnNlc0ZpZWxkVHlwZSogZnR5cGU7ICAgLy8gQXNzb2NpYXRlZCBmaWVsZCB0eXBlCisKKyAgLy8gRXJyb3IgaGFuZGxlcgorICBpbmxpbmUgdm9pZCBPbkVycm9yIChpbnQgZXJyKSBjb25zdCBUSFJPV1MoTkN1cnNlc0Zvcm1FeGNlcHRpb24pIHsKKyAgICBpZiAoZXJyICE9IEVfT0spCisgICAgICBUSFJPVyhuZXcgTkN1cnNlc0Zvcm1FeGNlcHRpb24gKGVycikpOworICB9CisKK3B1YmxpYzoKKyAgLy8gQ3JlYXRlIGEgJ051bGwnIGZpZWxkLiBDYW4gYmUgdXNlZCB0byBkZWxpbWl0IGEgZmllbGQgbGlzdAorICBOQ3Vyc2VzRm9ybUZpZWxkKCkKKyAgICA6IGZpZWxkKFNUQVRJQ19DQVNUKEZJRUxEKikoMCkpLAorICAgICAgZnR5cGUoU1RBVElDX0NBU1QoTkN1cnNlc0ZpZWxkVHlwZSopKDApKQorICB7CisgIH0KKworICAvLyBDcmVhdGUgYSBuZXcgZmllbGQKKyAgTkN1cnNlc0Zvcm1GaWVsZCAoaW50IHJvd3MsCisJCSAgICBpbnQgbmNvbHMsCisJCSAgICBpbnQgZmlyc3Rfcm93ID0gMCwKKwkJICAgIGludCBmaXJzdF9jb2wgPSAwLAorCQkgICAgaW50IG9mZnNjcmVlbl9yb3dzID0gMCwKKwkJICAgIGludCBhZGRpdGlvbmFsX2J1ZmZlcnMgPSAwKQorICAgIDogZmllbGQoMCksCisgICAgICBmdHlwZShTVEFUSUNfQ0FTVChOQ3Vyc2VzRmllbGRUeXBlKikoMCkpCisgIHsKKyAgICAgIGZpZWxkID0gOjpuZXdfZmllbGQocm93cywgbmNvbHMsIGZpcnN0X3JvdywgZmlyc3RfY29sLAorCQkJICBvZmZzY3JlZW5fcm93cywgYWRkaXRpb25hbF9idWZmZXJzKTsKKyAgICAgIGlmICghZmllbGQpCisJT25FcnJvcihlcnJubyk7CisgIH0KKworICBOQ3Vyc2VzRm9ybUZpZWxkJiBvcGVyYXRvcj0oY29uc3QgTkN1cnNlc0Zvcm1GaWVsZCYgcmhzKQorICB7CisgICAgaWYgKHRoaXMgIT0gJnJocykgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE5DdXJzZXNGb3JtRmllbGQoY29uc3QgTkN1cnNlc0Zvcm1GaWVsZCYgcmhzKQorICAgIDogZmllbGQocmhzLmZpZWxkKSwgZnR5cGUocmhzLmZ0eXBlKQorICB7CisgIH0KKworICB2aXJ0dWFsIH5OQ3Vyc2VzRm9ybUZpZWxkICgpOworCisgIC8vIER1cGxpY2F0ZSB0aGUgZmllbGQgYXQgYSBuZXcgcG9zaXRpb24KKyAgaW5saW5lIE5DdXJzZXNGb3JtRmllbGQqIGR1cChpbnQgZmlyc3Rfcm93LCBpbnQgZmlyc3RfY29sKQorICB7CisgICAgTkN1cnNlc0Zvcm1GaWVsZCogZiA9IG5ldyBOQ3Vyc2VzRm9ybUZpZWxkKCk7CisgICAgaWYgKCFmKQorICAgICAgT25FcnJvcihFX1NZU1RFTV9FUlJPUik7CisgICAgZWxzZSB7CisgICAgICBmLT5mdHlwZSA9IGZ0eXBlOworICAgICAgZi0+ZmllbGQgPSA6OmR1cF9maWVsZChmaWVsZCxmaXJzdF9yb3csZmlyc3RfY29sKTsKKyAgICAgIGlmICghZi0+ZmllbGQpCisJT25FcnJvcihlcnJubyk7CisgICAgfQorICAgIHJldHVybiBmOworICB9CisKKyAgLy8gTGluayB0aGUgZmllbGQgdG8gYSBuZXcgbG9jYXRpb24KKyAgaW5saW5lIE5DdXJzZXNGb3JtRmllbGQqIGxpbmsoaW50IGZpcnN0X3JvdywgaW50IGZpcnN0X2NvbCkgeworICAgIE5DdXJzZXNGb3JtRmllbGQqIGYgPSBuZXcgTkN1cnNlc0Zvcm1GaWVsZCgpOworICAgIGlmICghZikKKyAgICAgIE9uRXJyb3IoRV9TWVNURU1fRVJST1IpOworICAgIGVsc2UgeworICAgICAgZi0+ZnR5cGUgPSBmdHlwZTsKKyAgICAgIGYtPmZpZWxkID0gOjpsaW5rX2ZpZWxkKGZpZWxkLGZpcnN0X3JvdyxmaXJzdF9jb2wpOworICAgICAgaWYgKCFmLT5maWVsZCkKKwlPbkVycm9yKGVycm5vKTsKKyAgICB9CisgICAgcmV0dXJuIGY7CisgIH0KKworICAvLyBHZXQgdGhlIGxvd2xldmVsIGZpZWxkIHJlcHJlc2VudGF0aW9uCisgIGlubGluZSBGSUVMRCogZ2V0X2ZpZWxkKCkgY29uc3QgeworICAgIHJldHVybiBmaWVsZDsKKyAgfQorCisgIC8vIFJldHJpZXZlIGluZm8gYWJvdXQgdGhlIGZpZWxkCisgIGlubGluZSB2b2lkIGluZm8oaW50JiByb3dzLCBpbnQmIG5jb2xzLAorCQkgICBpbnQmIGZpcnN0X3JvdywgaW50JiBmaXJzdF9jb2wsCisJCSAgIGludCYgb2Zmc2NyZWVuX3Jvd3MsIGludCYgYWRkaXRpb25hbF9idWZmZXJzKSBjb25zdCB7CisgICAgT25FcnJvcig6OmZpZWxkX2luZm8oZmllbGQsICZyb3dzLCAmbmNvbHMsCisJCQkgJmZpcnN0X3JvdywgJmZpcnN0X2NvbCwKKwkJCSAmb2Zmc2NyZWVuX3Jvd3MsICZhZGRpdGlvbmFsX2J1ZmZlcnMpKTsKKyAgfQorCisgIC8vIFJldHJpZXZlIGluZm8gYWJvdXQgdGhlIGZpZWxkcyBkeW5hbWljIHByb3BlcnRpZXMuCisgIGlubGluZSB2b2lkIGR5bmFtaWNfaW5mbyhpbnQmIGR5bmFtaWNfcm93cywgaW50JiBkeW5hbWljX2NvbHMsCisJCQkgICBpbnQmIG1heF9ncm93dGgpIGNvbnN0IHsKKyAgICBPbkVycm9yKDo6ZHluYW1pY19maWVsZF9pbmZvKGZpZWxkLCAmZHluYW1pY19yb3dzLCAmZHluYW1pY19jb2xzLAorCQkJCSAmbWF4X2dyb3d0aCkpOworICB9CisKKyAgLy8gRm9yIGEgZHluYW1pYyBmaWVsZCB5b3UgbWF5IHNldCB0aGUgbWF4aW11bSBncm93dGggbGltaXQuCisgIC8vIEEgemVybyBtZWFucyB1bmxpbWl0ZWQgZ3Jvd3RoLgorICBpbmxpbmUgdm9pZCBzZXRfbWF4aW11bV9ncm93dGgoaW50IGdyb3d0aCA9IDApIHsKKyAgICBPbkVycm9yKDo6c2V0X21heF9maWVsZChmaWVsZCxncm93dGgpKTsKKyAgfQorCisgIC8vIE1vdmUgdGhlIGZpZWxkIHRvIGEgbmV3IHBvc2l0aW9uCisgIGlubGluZSB2b2lkIG1vdmUoaW50IHJvdywgaW50IGNvbCkgeworICAgIE9uRXJyb3IoOjptb3ZlX2ZpZWxkKGZpZWxkLHJvdyxjb2wpKTsKKyAgfQorCisgIC8vIE1hcmsgdGhlIGZpZWxkIHRvIHN0YXJ0IGEgbmV3IHBhZ2UKKyAgaW5saW5lIHZvaWQgbmV3X3BhZ2UoYm9vbCBwYWdlRmxhZyA9IEZBTFNFKSB7CisgICAgT25FcnJvcig6OnNldF9uZXdfcGFnZShmaWVsZCxwYWdlRmxhZykpOworICB9CisKKyAgLy8gUmV0cmlldmUgd2hldGhlciBvciBub3QgdGhlIGZpZWxkIHN0YXJ0cyBhIG5ldyBwYWdlLgorICBpbmxpbmUgYm9vbCBpc19uZXdfcGFnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gOjpuZXdfcGFnZShmaWVsZCk7CisgIH0KKworICAvLyBTZXQgdGhlIGp1c3RpZmljYXRpb24gZm9yIHRoZSBmaWVsZAorICBpbmxpbmUgdm9pZCBzZXRfanVzdGlmaWNhdGlvbihpbnQganVzdCkgeworICAgIE9uRXJyb3IoOjpzZXRfZmllbGRfanVzdChmaWVsZCxqdXN0KSk7CisgIH0KKworICAvLyBSZXRyaWV2ZSB0aGUgZmllbGRzIGp1c3RpZmljYXRpb24KKyAgaW5saW5lIGludCBqdXN0aWZpY2F0aW9uKCkgY29uc3QgeworICAgIHJldHVybiA6OmZpZWxkX2p1c3QoZmllbGQpOworICB9CisgIC8vIFNldCB0aGUgZm9yZWdyb3VuZCBhdHRyaWJ1dGUgZm9yIHRoZSBmaWVsZAorICBpbmxpbmUgdm9pZCBzZXRfZm9yZWdyb3VuZChjaHR5cGUgZm9yZWdyb3VuZCkgeworICAgIE9uRXJyb3IoOjpzZXRfZmllbGRfZm9yZShmaWVsZCxmb3JlZ3JvdW5kKSk7CisgIH0KKworICAvLyBSZXRyaWV2ZSB0aGUgZmllbGRzIGZvcmVncm91bmQgYXR0cmlidXRlCisgIGlubGluZSBjaHR5cGUgZm9yZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gOjpmaWVsZF9mb3JlKGZpZWxkKTsKKyAgfQorCisgIC8vIFNldCB0aGUgYmFja2dyb3VuZCBhdHRyaWJ1dGUgZm9yIHRoZSBmaWVsZAorICBpbmxpbmUgdm9pZCBzZXRfYmFja2dyb3VuZChjaHR5cGUgYmFja2dyb3VuZCkgeworICAgIE9uRXJyb3IoOjpzZXRfZmllbGRfYmFjayhmaWVsZCxiYWNrZ3JvdW5kKSk7CisgIH0KKworICAvLyBSZXRyaWV2ZSB0aGUgZmllbGRzIGJhY2tncm91bmQgYXR0cmlidXRlCisgIGlubGluZSBjaHR5cGUgYmFjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gOjpmaWVsZF9iYWNrKGZpZWxkKTsKKyAgfQorCisgIC8vIFNldCB0aGUgcGFkZGluZyBjaGFyYWN0ZXIgZm9yIHRoZSBmaWVsZAorICBpbmxpbmUgdm9pZCBzZXRfcGFkX2NoYXJhY3RlcihpbnQgcGFkZGluZykgeworICAgIE9uRXJyb3IoOjpzZXRfZmllbGRfcGFkKGZpZWxkLCBwYWRkaW5nKSk7CisgIH0KKworICAvLyBSZXRyaWV2ZSB0aGUgZmllbGRzIHBhZGRpbmcgY2hhcmFjdGVyCisgIGlubGluZSBpbnQgcGFkKCkgY29uc3QgeworICAgIHJldHVybiA6OmZpZWxkX3BhZChmaWVsZCk7CisgIH0KKworICAvLyBTd2l0Y2ggb24gdGhlIGZpZWxkcyBvcHRpb25zCisgIGlubGluZSB2b2lkIG9wdGlvbnNfb24gKEZpZWxkX09wdGlvbnMgb3B0cykgeworICAgIE9uRXJyb3IgKDo6ZmllbGRfb3B0c19vbiAoZmllbGQsIG9wdHMpKTsKKyAgfQorCisgIC8vIFN3aXRjaCBvZmYgdGhlIGZpZWxkcyBvcHRpb25zCisgIGlubGluZSB2b2lkIG9wdGlvbnNfb2ZmIChGaWVsZF9PcHRpb25zIG9wdHMpIHsKKyAgICBPbkVycm9yICg6OmZpZWxkX29wdHNfb2ZmIChmaWVsZCwgb3B0cykpOworICB9CisKKyAgLy8gUmV0cmlldmUgdGhlIGZpZWxkcyBvcHRpb25zCisgIGlubGluZSBGaWVsZF9PcHRpb25zIG9wdGlvbnMgKCkgY29uc3QgeworICAgIHJldHVybiA6OmZpZWxkX29wdHMgKGZpZWxkKTsKKyAgfQorCisgIC8vIFNldCB0aGUgZmllbGRzIG9wdGlvbnMKKyAgaW5saW5lIHZvaWQgc2V0X29wdGlvbnMgKEZpZWxkX09wdGlvbnMgb3B0cykgeworICAgIE9uRXJyb3IgKDo6c2V0X2ZpZWxkX29wdHMgKGZpZWxkLCBvcHRzKSk7CisgIH0KKworICAvLyBNYXJrIHRoZSBmaWVsZCBhcyBjaGFuZ2VkCisgIGlubGluZSB2b2lkIHNldF9jaGFuZ2VkKGJvb2wgY2hhbmdlRmxhZyA9IFRSVUUpIHsKKyAgICBPbkVycm9yKDo6c2V0X2ZpZWxkX3N0YXR1cyhmaWVsZCxjaGFuZ2VGbGFnKSk7CisgIH0KKworICAvLyBUZXN0IHdoZXRoZXIgb3Igbm90IHRoZSBmaWVsZCBpcyBtYXJrZWQgYXMgY2hhbmdlZAorICBpbmxpbmUgYm9vbCBjaGFuZ2VkKCkgY29uc3QgeworICAgIHJldHVybiA6OmZpZWxkX3N0YXR1cyhmaWVsZCk7CisgIH0KKworICAvLyBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaWVsZCBpbiB0aGUgZmllbGQgYXJyYXkgb2YgYSBmb3JtCisgIC8vIG9yIC0xIGlmIHRoZSBmaWVsZCBpcyBub3QgYXNzb2NpYXRlZCB0byBhIGZvcm0KKyAgaW5saW5lIGludCAoaW5kZXgpKCkgY29uc3QgeworICAgIHJldHVybiA6OmZpZWxkX2luZGV4KGZpZWxkKTsKKyAgfQorCisgIC8vIFN0b3JlIGEgdmFsdWUgaW4gYSBmaWVsZHMgYnVmZmVyLiBUaGUgZGVmYXVsdCBidWZmZXIgaXMgbnIuIDAKKyAgaW5saW5lIHZvaWQgc2V0X3ZhbHVlKGNvbnN0IGNoYXIgKnZhbCwgaW50IGJ1ZmZlciA9IDApIHsKKyAgICBPbkVycm9yKDo6c2V0X2ZpZWxkX2J1ZmZlcihmaWVsZCxidWZmZXIsdmFsKSk7CisgIH0KKworICAvLyBSZXRyaWV2ZSB0aGUgdmFsdWUgb2YgYSBmaWVsZHMgYnVmZmVyLiBUaGUgZGVmYXVsdCBidWZmZXIgaXMgbnIuIDAKKyAgaW5saW5lIGNoYXIqIHZhbHVlKGludCBidWZmZXIgPSAwKSBjb25zdCB7CisgICAgcmV0dXJuIDo6ZmllbGRfYnVmZmVyKGZpZWxkLGJ1ZmZlcik7CisgIH0KKworICAvLyBTZXQgdGhlIHZhbGlkYXRpb24gdHlwZSBvZiB0aGUgZmllbGQuCisgIGlubGluZSB2b2lkIHNldF9maWVsZHR5cGUoTkN1cnNlc0ZpZWxkVHlwZSYgZikgeworICAgIGZ0eXBlID0gJmY7CisgICAgZi5zZXQoKnRoaXMpOyAvLyBBIGdvb2QgZnJpZW5kIG1heSBkbyB0aGF0Li4uCisgIH0KKworICAvLyBSZXRyaWV2ZSB0aGUgdmFsaWRhdGlvbiB0eXBlIG9mIHRoZSBmaWVsZC4KKyAgaW5saW5lIE5DdXJzZXNGaWVsZFR5cGUqIGZpZWxkdHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZnR5cGU7CisgIH0KKworfTsKKworICAvLyBUaGlzIGFyZSB0aGUgYnVpbHQtaW4gaG9vayBmdW5jdGlvbnMgaW4gdGhpcyBDKysgYmluZGluZy4gSW4gQysrIHdlIHVzZQorICAvLyB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbnMgKHNlZSBiZWxvdyBPbl8uLi5fSW5pdCBhbmQgT25fLi4uX1Rlcm1pbmF0aW9uKQorICAvLyB0byBwcm92aWRlIHRoaXMgZnVuY3Rpb25hbGl0eSBpbiBhbiBvYmplY3Qgb3JpZW50ZWQgbWFubmVyLgorZXh0ZXJuICJDIiB7CisgIHZvaWQgX25jX3h4X2ZybV9pbml0KEZPUk0gKik7CisgIHZvaWQgX25jX3h4X2ZybV90ZXJtKEZPUk0gKik7CisgIHZvaWQgX25jX3h4X2ZsZF9pbml0KEZPUk0gKik7CisgIHZvaWQgX25jX3h4X2ZsZF90ZXJtKEZPUk0gKik7Cit9CisKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgY2xhc3MgcmVwcmVzZW50aW5nIGEgZm9ybSwgd3JhcHBpbmcgdGhlIGxvd2xldmVsIEZPUk0gc3RydWN0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworY2xhc3MgTkNVUlNFU19JTVBFWFAgTkN1cnNlc0Zvcm0gOiBwdWJsaWMgTkN1cnNlc1BhbmVsCit7Citwcm90ZWN0ZWQ6CisgIEZPUk0qIGZvcm07ICAvLyB0aGUgbG93bGV2ZWwgc3RydWN0dXJlCisKK3ByaXZhdGU6CisgIE5DdXJzZXNXaW5kb3cqIHN1YjsgICAvLyB0aGUgc3Vid2luZG93IG9iamVjdAorICBib29sIGJfc3ViX293bmVyOyAgICAgLy8gaXMgdGhpcyBvdXIgb3duIHN1YndpbmRvdz8KKyAgYm9vbCBiX2ZyYW1lZDsJLy8gaGFzIHRoZSBmb3JtIGEgYm9yZGVyPworICBib29sIGJfYXV0b0RlbGV0ZTsgICAgLy8gRGVsZXRlIGZpZWxkcyB3aGVuIGRlbGV0aW5nIGZvcm0/CisKKyAgTkN1cnNlc0Zvcm1GaWVsZCoqIG15X2ZpZWxkczsgLy8gVGhlIGFycmF5IG9mIGZpZWxkcyBmb3IgdGhpcyBmb3JtCisKKyAgLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgdGhlIGZvcm0ncyB1c2VyIGRhdGEgZmllbGQgdG8gbGluayB0aGUKKyAgLy8gRk9STSogdG8gdGhlIEMrKyBvYmplY3QgYW5kIHRvIHByb3ZpZGUgZXh0cmEgc3BhY2UgZm9yIGEgdXNlciBwb2ludGVyLgorICB0eXBlZGVmIHN0cnVjdCB7CisgICAgdm9pZCoJICAgICAgIG1fdXNlcjsJICAgIC8vIHRoZSBwb2ludGVyIGZvciB0aGUgdXNlcidzIGRhdGEKKyAgICBjb25zdCBOQ3Vyc2VzRm9ybSogbV9iYWNrOyAgICAgIC8vIGJhY2t3YXJkIHBvaW50ZXIgdG8gQysrIG9iamVjdAorICAgIGNvbnN0IEZPUk0qCSAgICAgICBtX293bmVyOworICB9IFVzZXJIb29rOworCisgIC8vIEdldCB0aGUgYmFja3dhcmQgcG9pbnRlciB0byB0aGUgQysrIG9iamVjdCBmcm9tIGEgRk9STQorICBzdGF0aWMgaW5saW5lIE5DdXJzZXNGb3JtKiBnZXRIb29rKGNvbnN0IEZPUk0gKmYpIHsKKyAgICBVc2VySG9vayogaG9vayA9IHJlaW50ZXJwcmV0X2Nhc3Q8VXNlckhvb2sqPig6OmZvcm1fdXNlcnB0cihmKSk7CisgICAgYXNzZXJ0KGhvb2sgIT0gMCAmJiBob29rLT5tX293bmVyPT1mKTsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxOQ3Vyc2VzRm9ybSo+KGhvb2stPm1fYmFjayk7CisgIH0KKworICBmcmllbmQgdm9pZCBfbmNfeHhfZnJtX2luaXQoRk9STSAqKTsKKyAgZnJpZW5kIHZvaWQgX25jX3h4X2ZybV90ZXJtKEZPUk0gKik7CisgIGZyaWVuZCB2b2lkIF9uY194eF9mbGRfaW5pdChGT1JNICopOworICBmcmllbmQgdm9pZCBfbmNfeHhfZmxkX3Rlcm0oRk9STSAqKTsKKworICAvLyBDYWxjdWxhdGUgRklFTEQqIGFycmF5IGZvciB0aGUgbWVudQorICBGSUVMRCoqIG1hcEZpZWxkcyhOQ3Vyc2VzRm9ybUZpZWxkKiBuZmllbGRzW10pOworCitwcm90ZWN0ZWQ6CisgIC8vIGludGVybmFsIHJvdXRpbmVzCisgIGlubGluZSB2b2lkIHNldF91c2VyKHZvaWQgKnVzZXIpIHsKKyAgICBVc2VySG9vayogdXB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8VXNlckhvb2sqPig6OmZvcm1fdXNlcnB0ciAoZm9ybSkpOworICAgIGFzc2VydCAodXB0ciAhPSAwICYmIHVwdHItPm1fYmFjaz09dGhpcyAmJiB1cHRyLT5tX293bmVyPT1mb3JtKTsKKyAgICB1cHRyLT5tX3VzZXIgPSB1c2VyOworICB9CisKKyAgaW5saW5lIHZvaWQgKmdldF91c2VyKCkgeworICAgIFVzZXJIb29rKiB1cHRyID0gcmVpbnRlcnByZXRfY2FzdDxVc2VySG9vayo+KDo6Zm9ybV91c2VycHRyIChmb3JtKSk7CisgICAgYXNzZXJ0ICh1cHRyICE9IDAgJiYgdXB0ci0+bV9iYWNrPT10aGlzICYmIHVwdHItPm1fb3duZXI9PWZvcm0pOworICAgIHJldHVybiB1cHRyLT5tX3VzZXI7CisgIH0KKworICB2b2lkIEluaXRGb3JtIChOQ3Vyc2VzRm9ybUZpZWxkKiBGaWVsZHNbXSwKKwkJIGJvb2wgd2l0aF9mcmFtZSwKKwkJIGJvb2wgYXV0b0RlbGV0ZUZpZWxkcyk7CisKKyAgaW5saW5lIHZvaWQgT25FcnJvciAoaW50IGVycikgY29uc3QgVEhST1dTKE5DdXJzZXNGb3JtRXhjZXB0aW9uKSB7CisgICAgaWYgKGVyciAhPSBFX09LKQorICAgICAgVEhST1cobmV3IE5DdXJzZXNGb3JtRXhjZXB0aW9uIChlcnIpKTsKKyAgfQorCisgIC8vIHRoaXMgd3JhcHMgdGhlIGZvcm1fZHJpdmVyIGNhbGwuCisgIHZpcnR1YWwgaW50IGRyaXZlciAoaW50IGMpIDsKKworICAvLyAnSW50ZXJuYWwnIGNvbnN0cnVjdG9yLCBidWlsZHMgYW4gb2JqZWN0IHdpdGhvdXQgYXNzb2NpYXRpb24gdG8gYQorICAvLyBmaWVsZCBhcnJheS4KKyAgTkN1cnNlc0Zvcm0oIGludCAgbmxpbmVzLAorCSAgICAgICBpbnQgIG5jb2xzLAorCSAgICAgICBpbnQgIGJlZ2luX3kgPSAwLAorCSAgICAgICBpbnQgIGJlZ2luX3ggPSAwKQorICAgIDogTkN1cnNlc1BhbmVsKG5saW5lcywgbmNvbHMsIGJlZ2luX3ksIGJlZ2luX3gpLAorICAgICAgZm9ybSAoU1RBVElDX0NBU1QoRk9STSopKDApKSwKKyAgICAgIHN1YigwKSwKKyAgICAgIGJfc3ViX293bmVyKDApLAorICAgICAgYl9mcmFtZWQoMCksCisgICAgICBiX2F1dG9EZWxldGUoMCksCisgICAgICBteV9maWVsZHMoMCkKKyAgeworICB9CisKK3B1YmxpYzoKKyAgLy8gQ3JlYXRlIGZvcm0gZm9yIHRoZSBkZWZhdWx0IHBhbmVsLgorICBOQ3Vyc2VzRm9ybSAoTkN1cnNlc0Zvcm1GaWVsZCogRmllbGRzW10sCisJICAgICAgIGJvb2wgd2l0aF9mcmFtZT1GQUxTRSwJICAgICAgLy8gcmVzZXJ2ZSBzcGFjZSBmb3IgYSBmcmFtZT8KKwkgICAgICAgYm9vbCBhdXRvRGVsZXRlX0ZpZWxkcz1GQUxTRSkgIC8vIGRvIGF1dG9tYXRpYyBjbGVhbnVwPworICAgIDogTkN1cnNlc1BhbmVsKCksCisgICAgICBmb3JtKDApLAorICAgICAgc3ViKDApLAorICAgICAgYl9zdWJfb3duZXIoMCksCisgICAgICBiX2ZyYW1lZCgwKSwKKyAgICAgIGJfYXV0b0RlbGV0ZSgwKSwKKyAgICAgIG15X2ZpZWxkcygwKQorICB7CisgICAgSW5pdEZvcm0oRmllbGRzLCB3aXRoX2ZyYW1lLCBhdXRvRGVsZXRlX0ZpZWxkcyk7CisgIH0KKworICAvLyBDcmVhdGUgYSBmb3JtIGluIGEgcGFuZWwgd2l0aCB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHNpemUuCisgIE5DdXJzZXNGb3JtIChOQ3Vyc2VzRm9ybUZpZWxkKiBGaWVsZHNbXSwKKwkgICAgICAgaW50ICBubGluZXMsCisJICAgICAgIGludCAgbmNvbHMsCisJICAgICAgIGludCAgYmVnaW5feSwKKwkgICAgICAgaW50ICBiZWdpbl94LAorCSAgICAgICBib29sIHdpdGhfZnJhbWU9RkFMU0UsCSAgICAgLy8gcmVzZXJ2ZSBzcGFjZSBmb3IgYSBmcmFtZT8KKwkgICAgICAgYm9vbCBhdXRvRGVsZXRlX0ZpZWxkcz1GQUxTRSkgLy8gZG8gYXV0b21hdGljIGNsZWFudXA/CisgICAgOiBOQ3Vyc2VzUGFuZWwobmxpbmVzLCBuY29scywgYmVnaW5feSwgYmVnaW5feCksCisgICAgICBmb3JtKDApLAorICAgICAgc3ViKDApLAorICAgICAgYl9zdWJfb3duZXIoMCksCisgICAgICBiX2ZyYW1lZCgwKSwKKyAgICAgIGJfYXV0b0RlbGV0ZSgwKSwKKyAgICAgIG15X2ZpZWxkcygwKQorICB7CisgICAgICBJbml0Rm9ybShGaWVsZHMsIHdpdGhfZnJhbWUsIGF1dG9EZWxldGVfRmllbGRzKTsKKyAgfQorCisgIE5DdXJzZXNGb3JtJiBvcGVyYXRvcj0oY29uc3QgTkN1cnNlc0Zvcm0mIHJocykKKyAgeworICAgIGlmICh0aGlzICE9ICZyaHMpIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgICAgTkN1cnNlc1BhbmVsOjpvcGVyYXRvcj0ocmhzKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTkN1cnNlc0Zvcm0oY29uc3QgTkN1cnNlc0Zvcm0mIHJocykKKyAgICA6IE5DdXJzZXNQYW5lbChyaHMpLAorICAgICAgZm9ybShyaHMuZm9ybSksCisgICAgICBzdWIocmhzLnN1YiksCisgICAgICBiX3N1Yl9vd25lcihyaHMuYl9zdWJfb3duZXIpLAorICAgICAgYl9mcmFtZWQocmhzLmJfZnJhbWVkKSwKKyAgICAgIGJfYXV0b0RlbGV0ZShyaHMuYl9hdXRvRGVsZXRlKSwKKyAgICAgIG15X2ZpZWxkcyhyaHMubXlfZmllbGRzKQorICB7CisgIH0KKworICB2aXJ0dWFsIH5OQ3Vyc2VzRm9ybSgpOworCisgIC8vIFNldCB0aGUgZGVmYXVsdCBhdHRyaWJ1dGVzIGZvciB0aGUgZm9ybQorICB2aXJ0dWFsIHZvaWQgc2V0RGVmYXVsdEF0dHJpYnV0ZXMoKTsKKworICAvLyBSZXRyaWV2ZSBjdXJyZW50IGZpZWxkIG9mIHRoZSBmb3JtLgorICBpbmxpbmUgTkN1cnNlc0Zvcm1GaWVsZCogY3VycmVudF9maWVsZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbXlfZmllbGRzWzo6ZmllbGRfaW5kZXgoOjpjdXJyZW50X2ZpZWxkKGZvcm0pKV07CisgIH0KKworICAvLyBTZXQgdGhlIGZvcm1zIHN1YndpbmRvdworICB2b2lkIHNldFN1YldpbmRvdyhOQ3Vyc2VzV2luZG93JiBzdWIpOworCisgIC8vIFNldCB0aGVzZSBmaWVsZHMgZm9yIHRoZSBmb3JtCisgIGlubGluZSB2b2lkIHNldEZpZWxkcyhOQ3Vyc2VzRm9ybUZpZWxkKiBGaWVsZHNbXSkgeworICAgIE9uRXJyb3IoOjpzZXRfZm9ybV9maWVsZHMoZm9ybSxtYXBGaWVsZHMoRmllbGRzKSkpOworICB9CisKKyAgLy8gUmVtb3ZlIHRoZSBmb3JtIGZyb20gdGhlIHNjcmVlbgorICBpbmxpbmUgdm9pZCB1bnBvc3QgKHZvaWQpIHsKKyAgICBPbkVycm9yICg6OnVucG9zdF9mb3JtIChmb3JtKSk7CisgIH0KKworICAvLyBQb3N0IHRoZSBmb3JtIHRvIHRoZSBzY3JlZW4gaWYgZmxhZyBpcyB0cnVlLCB1bnBvc3QgaXQgb3RoZXJ3aXNlCisgIGlubGluZSB2b2lkIHBvc3QoYm9vbCBmbGFnID0gVFJVRSkgeworICAgIE9uRXJyb3IgKGZsYWcgPyA6OnBvc3RfZm9ybShmb3JtKSA6IDo6dW5wb3N0X2Zvcm0gKGZvcm0pKTsKKyAgfQorCisgIC8vIERlY29yYXRpb25zCisgIGlubGluZSB2b2lkIGZyYW1lKGNvbnN0IGNoYXIgKnRpdGxlPU5VTEwsIGNvbnN0IGNoYXIqIGJ0aXRsZT1OVUxMKSB7CisgICAgaWYgKGJfZnJhbWVkKQorICAgICAgTkN1cnNlc1BhbmVsOjpmcmFtZSh0aXRsZSxidGl0bGUpOworICAgIGVsc2UKKyAgICAgIE9uRXJyb3IoRV9TWVNURU1fRVJST1IpOworICB9CisKKyAgaW5saW5lIHZvaWQgYm9sZGZyYW1lKGNvbnN0IGNoYXIgKnRpdGxlPU5VTEwsIGNvbnN0IGNoYXIqIGJ0aXRsZT1OVUxMKSB7CisgICAgaWYgKGJfZnJhbWVkKQorICAgICAgTkN1cnNlc1BhbmVsOjpib2xkZnJhbWUodGl0bGUsYnRpdGxlKTsKKyAgICBlbHNlCisgICAgICBPbkVycm9yKEVfU1lTVEVNX0VSUk9SKTsKKyAgfQorCisgIGlubGluZSB2b2lkIGxhYmVsKGNvbnN0IGNoYXIgKnRvcExhYmVsLCBjb25zdCBjaGFyICpib3R0b21MYWJlbCkgeworICAgIGlmIChiX2ZyYW1lZCkKKyAgICAgIE5DdXJzZXNQYW5lbDo6bGFiZWwodG9wTGFiZWwsYm90dG9tTGFiZWwpOworICAgIGVsc2UKKyAgICAgIE9uRXJyb3IoRV9TWVNURU1fRVJST1IpOworICB9CisKKyAgLy8gLS0tLS0KKyAgLy8gSG9va3MKKyAgLy8gLS0tLS0KKworICAvLyBDYWxsZWQgYWZ0ZXIgdGhlIGZvcm0gZ2V0cyByZXBvc2l0aW9uZWQgaW4gaXRzIHdpbmRvdy4KKyAgLy8gVGhpcyBpcyBlc3BlY2lhbGx5IHRydWUgaWYgdGhlIGZvcm0gaXMgcG9zdGVkLgorICB2aXJ0dWFsIHZvaWQgT25fRm9ybV9Jbml0KCk7CisKKyAgLy8gQ2FsbGVkIGJlZm9yZSB0aGUgZm9ybSBnZXRzIHJlcG9zaXRpb25lZCBpbiBpdHMgd2luZG93LgorICAvLyBUaGlzIGlzIGVzcGVjaWFsbHkgdHJ1ZSBpZiB0aGUgZm9ybSBpcyB1bnBvc3RlZC4KKyAgdmlydHVhbCB2b2lkIE9uX0Zvcm1fVGVybWluYXRpb24oKTsKKworICAvLyBDYWxsZWQgYWZ0ZXIgdGhlIGZpZWxkIGJlY2FtZSB0aGUgY3VycmVudCBmaWVsZAorICB2aXJ0dWFsIHZvaWQgT25fRmllbGRfSW5pdChOQ3Vyc2VzRm9ybUZpZWxkJiBmaWVsZCk7CisKKyAgLy8gQ2FsbGVkIGJlZm9yZSB0aGlzIGZpZWxkIGlzIGxlZnQgYXMgY3VycmVudCBmaWVsZC4KKyAgdmlydHVhbCB2b2lkIE9uX0ZpZWxkX1Rlcm1pbmF0aW9uKE5DdXJzZXNGb3JtRmllbGQmIGZpZWxkKTsKKworICAvLyBDYWxjdWxhdGUgcmVxdWlyZWQgd2luZG93IHNpemUgZm9yIHRoZSBmb3JtLgorICB2b2lkIHNjYWxlKGludCYgcm93cywgaW50JiBuY29scykgY29uc3QgeworICAgIE9uRXJyb3IoOjpzY2FsZV9mb3JtKGZvcm0sJnJvd3MsJm5jb2xzKSk7CisgIH0KKworICAvLyBSZXRyaWV2ZSBudW1iZXIgb2YgZmllbGRzIGluIHRoZSBmb3JtLgorICBpbnQgY291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6ZmllbGRfY291bnQoZm9ybSk7CisgIH0KKworICAvLyBNYWtlIHRoZSBwYWdlIHRoZSBjdXJyZW50IHBhZ2Ugb2YgdGhlIGZvcm0uCisgIHZvaWQgc2V0X3BhZ2UoaW50IHBhZ2VOdW0pIHsKKyAgICBPbkVycm9yKDo6c2V0X2Zvcm1fcGFnZShmb3JtLCBwYWdlTnVtKSk7CisgIH0KKworICAvLyBSZXRyaWV2ZSBjdXJyZW50IHBhZ2UgbnVtYmVyCisgIGludCBwYWdlKCkgY29uc3QgeworICAgIHJldHVybiA6OmZvcm1fcGFnZShmb3JtKTsKKyAgfQorCisgIC8vIFN3aXRjaCBvbiB0aGUgZm9ybXMgb3B0aW9ucworICBpbmxpbmUgdm9pZCBvcHRpb25zX29uIChGb3JtX09wdGlvbnMgb3B0cykgeworICAgIE9uRXJyb3IgKDo6Zm9ybV9vcHRzX29uIChmb3JtLCBvcHRzKSk7CisgIH0KKworICAvLyBTd2l0Y2ggb2ZmIHRoZSBmb3JtcyBvcHRpb25zCisgIGlubGluZSB2b2lkIG9wdGlvbnNfb2ZmIChGb3JtX09wdGlvbnMgb3B0cykgeworICAgIE9uRXJyb3IgKDo6Zm9ybV9vcHRzX29mZiAoZm9ybSwgb3B0cykpOworICB9CisKKyAgLy8gUmV0cmlldmUgdGhlIGZvcm1zIG9wdGlvbnMKKyAgaW5saW5lIEZvcm1fT3B0aW9ucyBvcHRpb25zICgpIGNvbnN0IHsKKyAgICByZXR1cm4gOjpmb3JtX29wdHMgKGZvcm0pOworICB9CisKKyAgLy8gU2V0IHRoZSBmb3JtcyBvcHRpb25zCisgIGlubGluZSB2b2lkIHNldF9vcHRpb25zIChGb3JtX09wdGlvbnMgb3B0cykgeworICAgIE9uRXJyb3IgKDo6c2V0X2Zvcm1fb3B0cyAoZm9ybSwgb3B0cykpOworICB9CisKKyAgLy8gQXJlIHRoZXJlIG1vcmUgZGF0YSBpbiB0aGUgY3VycmVudCBmaWVsZCBhZnRlciB0aGUgZGF0YSBzaG93bgorICBpbmxpbmUgYm9vbCBkYXRhX2FoZWFkKCkgY29uc3QgeworICAgIHJldHVybiA6OmRhdGFfYWhlYWQoZm9ybSk7CisgIH0KKworICAvLyBBcmUgdGhlcmUgbW9yZSBkYXRhIGluIHRoZSBjdXJyZW50IGZpZWxkIGJlZm9yZSB0aGUgZGF0YSBzaG93bgorICBpbmxpbmUgYm9vbCBkYXRhX2JlaGluZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gOjpkYXRhX2JlaGluZChmb3JtKTsKKyAgfQorCisgIC8vIFBvc2l0aW9uIHRoZSBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgZmllbGQKKyAgaW5saW5lIHZvaWQgcG9zaXRpb25fY3Vyc29yICgpIHsKKyAgICBPbkVycm9yICg6OnBvc19mb3JtX2N1cnNvciAoZm9ybSkpOworICB9CisgIC8vIFNldCB0aGUgY3VycmVudCBmaWVsZAorICBpbmxpbmUgdm9pZCBzZXRfY3VycmVudChOQ3Vyc2VzRm9ybUZpZWxkJiBGKSB7CisgICAgT25FcnJvciAoOjpzZXRfY3VycmVudF9maWVsZChmb3JtLCBGLmZpZWxkKSk7CisgIH0KKworICAvLyBQcm92aWRlIGEgZGVmYXVsdCBrZXkgdmlydHVhbGl6YXRpb24uIFRyYW5zbGF0ZSB0aGUga2V5Ym9hcmQKKyAgLy8gY29kZSBjIGludG8gYSBmb3JtIHJlcXVlc3QgY29kZS4KKyAgLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgYSBob3BlZnVsbHkgc3RyYWlnaHRmb3J3YXJkCisgIC8vIG1hcHBpbmcgZm9yIHRoZSBtb3N0IGNvbW1vbiBrZXlzdHJva2VzIGFuZCBmb3JtIHJlcXVlc3RzLgorICB2aXJ0dWFsIGludCB2aXJ0dWFsaXplKGludCBjKTsKKworICAvLyBPcGVyYXRvcnMKKyAgaW5saW5lIE5DdXJzZXNGb3JtRmllbGQqIG9wZXJhdG9yW10oaW50IGkpIGNvbnN0IHsKKyAgICBpZiAoIChpIDwgMCkgfHwgKGkgPj0gOjpmaWVsZF9jb3VudCAoZm9ybSkpICkKKyAgICAgIE9uRXJyb3IgKEVfQkFEX0FSR1VNRU5UKTsKKyAgICByZXR1cm4gbXlfZmllbGRzW2ldOworICB9CisKKyAgLy8gUGVyZm9ybSB0aGUgbWVudSdzIG9wZXJhdGlvbgorICAvLyBSZXR1cm4gdGhlIGZpZWxkIHdoZXJlIHlvdSBsZWZ0IHRoZSBmb3JtLgorICB2aXJ0dWFsIE5DdXJzZXNGb3JtRmllbGQqIG9wZXJhdG9yKCkodm9pZCk7CisKKyAgLy8gRXhjZXB0aW9uIGhhbmRsZXJzLiBUaGUgZGVmYXVsdCBpcyBhIEJlZXAuCisgIHZpcnR1YWwgdm9pZCBPbl9SZXF1ZXN0X0RlbmllZChpbnQgYykgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBPbl9JbnZhbGlkX0ZpZWxkKGludCBjKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIE9uX1Vua25vd25fQ29tbWFuZChpbnQgYykgY29uc3Q7CisKK307CisKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGlzIGlzIHRoZSB0eXBpY2FsIEMrKyB0eXBlc2FmZSB3YXkgdG8gYWxsb3cgdG8gYXR0YWNoCisvLyB1c2VyIGRhdGEgdG8gYSBmaWVsZCBvZiBhIGZvcm0uIEl0cyBhc3N1bWVkIHRoYXQgdGhlIHVzZXIKKy8vIGRhdGEgYmVsb25ncyB0byBzb21lIGNsYXNzIFQuIFVzZSBUIGFzIHRlbXBsYXRlIGFyZ3VtZW50CisvLyB0byBjcmVhdGUgYSBVc2VyRmllbGQuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzVXNlckZpZWxkIDogcHVibGljIE5DdXJzZXNGb3JtRmllbGQKK3sKK3B1YmxpYzoKKyAgTkN1cnNlc1VzZXJGaWVsZCAoaW50IHJvd3MsCisJCSAgICBpbnQgbmNvbHMsCisJCSAgICBpbnQgZmlyc3Rfcm93ID0gMCwKKwkJICAgIGludCBmaXJzdF9jb2wgPSAwLAorCQkgICAgY29uc3QgVCogcF9Vc2VyRGF0YSA9IFNUQVRJQ19DQVNUKFQqKSgwKSwKKwkJICAgIGludCBvZmZzY3JlZW5fcm93cyA9IDAsCisJCSAgICBpbnQgYWRkaXRpb25hbF9idWZmZXJzID0gMCkKKyAgICA6IE5DdXJzZXNGb3JtRmllbGQgKHJvd3MsIG5jb2xzLAorCQkJZmlyc3Rfcm93LCBmaXJzdF9jb2wsCisJCQlvZmZzY3JlZW5fcm93cywgYWRkaXRpb25hbF9idWZmZXJzKSB7CisgICAgICBpZiAoZmllbGQpCisJT25FcnJvcig6OnNldF9maWVsZF91c2VycHRyKGZpZWxkLCBTVEFUSUNfQ0FTVCh2b2lkICopKHBfVXNlckRhdGEpKSk7CisgIH0KKworICB2aXJ0dWFsIH5OQ3Vyc2VzVXNlckZpZWxkKCkge307CisKKyAgaW5saW5lIGNvbnN0IFQqIFVzZXJEYXRhICh2b2lkKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KDo6ZmllbGRfdXNlcnB0ciAoZmllbGQpKTsKKyAgfQorCisgIGlubGluZSB2aXJ0dWFsIHZvaWQgc2V0VXNlckRhdGEoY29uc3QgVCogcF9Vc2VyRGF0YSkgeworICAgIGlmIChmaWVsZCkKKyAgICAgIE9uRXJyb3IgKDo6c2V0X2ZpZWxkX3VzZXJwdHIgKGZpZWxkLCBTVEFUSUNfQ0FTVCh2b2lkICopKHBfVXNlckRhdGEpKSk7CisgIH0KK307CisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhlIHNhbWUgbWVjaGFuaXNtIGlzIHVzZWQgdG8gYXR0YWNoIHVzZXIgZGF0YSB0byBhIGZvcm0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCit0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzVXNlckZvcm0gOiBwdWJsaWMgTkN1cnNlc0Zvcm0KK3sKK3Byb3RlY3RlZDoKKyAgLy8gJ0ludGVybmFsJyBjb25zdHJ1Y3RvciwgYnVpbGRzIGFuIG9iamVjdCB3aXRob3V0IGFzc29jaWF0aW9uIHRvIGEKKyAgLy8gZmllbGQgYXJyYXkuCisgIE5DdXJzZXNVc2VyRm9ybSggaW50ICBubGluZXMsCisJCSAgIGludCAgbmNvbHMsCisJCSAgIGludCAgYmVnaW5feSA9IDAsCisJCSAgIGludCAgYmVnaW5feCA9IDAsCisJCSAgIGNvbnN0IFQqIHBfVXNlckRhdGEgPSBTVEFUSUNfQ0FTVChUKikoMCkpCisgICAgOiBOQ3Vyc2VzRm9ybShubGluZXMsbmNvbHMsYmVnaW5feSxiZWdpbl94KSB7CisgICAgICBpZiAoZm9ybSkKKwlzZXRfdXNlciAoY29uc3RfY2FzdDx2b2lkICo+KHBfVXNlckRhdGEpKTsKKyAgfQorCitwdWJsaWM6CisgIE5DdXJzZXNVc2VyRm9ybSAoTkN1cnNlc0Zvcm1GaWVsZCBGaWVsZHNbXSwKKwkJICAgY29uc3QgVCogcF9Vc2VyRGF0YSA9IFNUQVRJQ19DQVNUKFQqKSgwKSwKKwkJICAgYm9vbCB3aXRoX2ZyYW1lPUZBTFNFLAorCQkgICBib29sIGF1dG9EZWxldGVfRmllbGRzPUZBTFNFKQorICAgIDogTkN1cnNlc0Zvcm0gKEZpZWxkcywgd2l0aF9mcmFtZSwgYXV0b0RlbGV0ZV9GaWVsZHMpIHsKKyAgICAgIGlmIChmb3JtKQorCXNldF91c2VyIChjb25zdF9jYXN0PHZvaWQgKj4ocF9Vc2VyRGF0YSkpOworICB9OworCisgIE5DdXJzZXNVc2VyRm9ybSAoTkN1cnNlc0Zvcm1GaWVsZCBGaWVsZHNbXSwKKwkJICAgaW50IG5saW5lcywKKwkJICAgaW50IG5jb2xzLAorCQkgICBpbnQgYmVnaW5feSA9IDAsCisJCSAgIGludCBiZWdpbl94ID0gMCwKKwkJICAgY29uc3QgVCogcF9Vc2VyRGF0YSA9IFNUQVRJQ19DQVNUKFQqKSgwKSwKKwkJICAgYm9vbCB3aXRoX2ZyYW1lPUZBTFNFLAorCQkgICBib29sIGF1dG9EZWxldGVfRmllbGRzPUZBTFNFKQorICAgIDogTkN1cnNlc0Zvcm0gKEZpZWxkcywgbmxpbmVzLCBuY29scywgYmVnaW5feSwgYmVnaW5feCwKKwkJICAgd2l0aF9mcmFtZSwgYXV0b0RlbGV0ZV9GaWVsZHMpIHsKKyAgICAgIGlmIChmb3JtKQorCXNldF91c2VyIChjb25zdF9jYXN0PHZvaWQgKj4ocF9Vc2VyRGF0YSkpOworICB9OworCisgIHZpcnR1YWwgfk5DdXJzZXNVc2VyRm9ybSgpIHsKKyAgfTsKKworICBpbmxpbmUgVCogVXNlckRhdGEgKHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUKj4oZ2V0X3VzZXIgKCkpOworICB9OworCisgIGlubGluZSB2aXJ0dWFsIHZvaWQgc2V0VXNlckRhdGEgKGNvbnN0IFQqIHBfVXNlckRhdGEpIHsKKyAgICBpZiAoZm9ybSkKKyAgICAgIHNldF91c2VyIChjb25zdF9jYXN0PHZvaWQgKj4ocF9Vc2VyRGF0YSkpOworICB9CisKK307CisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQnVpbHRpbiBGaWVsZHR5cGVzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworY2xhc3MgTkNVUlNFU19JTVBFWFAgQWxwaGFfRmllbGQgOiBwdWJsaWMgTkN1cnNlc0ZpZWxkVHlwZQoreworcHJpdmF0ZToKKyAgaW50IG1pbl9maWVsZF93aWR0aDsKKworICB2b2lkIHNldChOQ3Vyc2VzRm9ybUZpZWxkJiBmKSB7CisgICAgT25FcnJvcig6OnNldF9maWVsZF90eXBlKGYuZ2V0X2ZpZWxkKCksZmllbGR0eXBlLG1pbl9maWVsZF93aWR0aCkpOworICB9CisKK3B1YmxpYzoKKyAgQWxwaGFfRmllbGQoaW50IHdpZHRoKQorICAgIDogTkN1cnNlc0ZpZWxkVHlwZShUWVBFX0FMUEhBKSwKKyAgICAgIG1pbl9maWVsZF93aWR0aCh3aWR0aCkgeworICB9Cit9OworCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBBbHBoYW51bWVyaWNfRmllbGQgOiBwdWJsaWMgTkN1cnNlc0ZpZWxkVHlwZQoreworcHJpdmF0ZToKKyAgaW50IG1pbl9maWVsZF93aWR0aDsKKworICB2b2lkIHNldChOQ3Vyc2VzRm9ybUZpZWxkJiBmKSB7CisgICAgT25FcnJvcig6OnNldF9maWVsZF90eXBlKGYuZ2V0X2ZpZWxkKCksZmllbGR0eXBlLG1pbl9maWVsZF93aWR0aCkpOworICB9CisKK3B1YmxpYzoKKyAgQWxwaGFudW1lcmljX0ZpZWxkKGludCB3aWR0aCkKKyAgICA6IE5DdXJzZXNGaWVsZFR5cGUoVFlQRV9BTE5VTSksCisgICAgICBtaW5fZmllbGRfd2lkdGgod2lkdGgpIHsKKyAgfQorfTsKKworY2xhc3MgTkNVUlNFU19JTVBFWFAgSW50ZWdlcl9GaWVsZCA6IHB1YmxpYyBOQ3Vyc2VzRmllbGRUeXBlCit7Citwcml2YXRlOgorICBpbnQgcHJlY2lzaW9uOworICBsb25nIGxvd2VyX2xpbWl0LCB1cHBlcl9saW1pdDsKKworICB2b2lkIHNldChOQ3Vyc2VzRm9ybUZpZWxkJiBmKSB7CisgICAgT25FcnJvcig6OnNldF9maWVsZF90eXBlKGYuZ2V0X2ZpZWxkKCksZmllbGR0eXBlLAorCQkJICAgICBwcmVjaXNpb24sbG93ZXJfbGltaXQsdXBwZXJfbGltaXQpKTsKKyAgfQorCitwdWJsaWM6CisgIEludGVnZXJfRmllbGQoaW50IHByZWMsIGxvbmcgbG93PTBMLCBsb25nIGhpZ2g9MEwpCisgICAgOiBOQ3Vyc2VzRmllbGRUeXBlKFRZUEVfSU5URUdFUiksCisgICAgICBwcmVjaXNpb24ocHJlYyksIGxvd2VyX2xpbWl0KGxvdyksIHVwcGVyX2xpbWl0KGhpZ2gpIHsKKyAgfQorfTsKKworY2xhc3MgTkNVUlNFU19JTVBFWFAgTnVtZXJpY19GaWVsZCA6IHB1YmxpYyBOQ3Vyc2VzRmllbGRUeXBlCit7Citwcml2YXRlOgorICBpbnQgcHJlY2lzaW9uOworICBkb3VibGUgbG93ZXJfbGltaXQsIHVwcGVyX2xpbWl0OworCisgIHZvaWQgc2V0KE5DdXJzZXNGb3JtRmllbGQmIGYpIHsKKyAgICBPbkVycm9yKDo6c2V0X2ZpZWxkX3R5cGUoZi5nZXRfZmllbGQoKSxmaWVsZHR5cGUsCisJCQkgICAgIHByZWNpc2lvbixsb3dlcl9saW1pdCx1cHBlcl9saW1pdCkpOworICB9CisKK3B1YmxpYzoKKyAgTnVtZXJpY19GaWVsZChpbnQgcHJlYywgZG91YmxlIGxvdz0wLjAsIGRvdWJsZSBoaWdoPTAuMCkKKyAgICA6IE5DdXJzZXNGaWVsZFR5cGUoVFlQRV9OVU1FUklDKSwKKyAgICAgIHByZWNpc2lvbihwcmVjKSwgbG93ZXJfbGltaXQobG93KSwgdXBwZXJfbGltaXQoaGlnaCkgeworICB9Cit9OworCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBSZWd1bGFyX0V4cHJlc3Npb25fRmllbGQgOiBwdWJsaWMgTkN1cnNlc0ZpZWxkVHlwZQoreworcHJpdmF0ZToKKyAgY2hhciogcmVnZXg7CisKKyAgdm9pZCBzZXQoTkN1cnNlc0Zvcm1GaWVsZCYgZikgeworICAgIE9uRXJyb3IoOjpzZXRfZmllbGRfdHlwZShmLmdldF9maWVsZCgpLGZpZWxkdHlwZSxyZWdleCkpOworICB9CisKKyAgdm9pZCBjb3B5X3JlZ2V4KGNvbnN0IGNoYXIgKnNvdXJjZSkKKyAgeworICAgIHJlZ2V4ID0gbmV3IGNoYXJbMSArIDo6c3RybGVuKHNvdXJjZSldOworICAgICg6OnN0cmNweSkocmVnZXgsIHNvdXJjZSk7CisgIH0KKworcHVibGljOgorICBSZWd1bGFyX0V4cHJlc3Npb25fRmllbGQoY29uc3QgY2hhciAqZXhwcikKKyAgICA6IE5DdXJzZXNGaWVsZFR5cGUoVFlQRV9SRUdFWFApLAorICAgICAgcmVnZXgoTlVMTCkKKyAgeworICAgIGNvcHlfcmVnZXgoZXhwcik7CisgIH0KKworICBSZWd1bGFyX0V4cHJlc3Npb25fRmllbGQmIG9wZXJhdG9yPShjb25zdCBSZWd1bGFyX0V4cHJlc3Npb25fRmllbGQmIHJocykKKyAgeworICAgIGlmICh0aGlzICE9ICZyaHMpIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgICAgY29weV9yZWdleChyaHMucmVnZXgpOworICAgICAgTkN1cnNlc0ZpZWxkVHlwZTo6b3BlcmF0b3I9KHJocyk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFJlZ3VsYXJfRXhwcmVzc2lvbl9GaWVsZChjb25zdCBSZWd1bGFyX0V4cHJlc3Npb25fRmllbGQmIHJocykKKyAgICA6IE5DdXJzZXNGaWVsZFR5cGUocmhzKSwKKyAgICAgIHJlZ2V4KE5VTEwpCisgIHsKKyAgICBjb3B5X3JlZ2V4KHJocy5yZWdleCk7CisgIH0KKworICB+UmVndWxhcl9FeHByZXNzaW9uX0ZpZWxkKCkgeworICAgIGRlbGV0ZVtdIHJlZ2V4OworICB9Cit9OworCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBFbnVtZXJhdGlvbl9GaWVsZCA6IHB1YmxpYyBOQ3Vyc2VzRmllbGRUeXBlCit7Citwcml2YXRlOgorICBjb25zdCBjaGFyKiogbGlzdDsKKyAgaW50IGNhc2Vfc2Vuc2l0aXZlOworICBpbnQgbm9uX3VuaXF1ZV9tYXRjaGVzOworCisgIHZvaWQgc2V0KE5DdXJzZXNGb3JtRmllbGQmIGYpIHsKKyAgICBPbkVycm9yKDo6c2V0X2ZpZWxkX3R5cGUoZi5nZXRfZmllbGQoKSxmaWVsZHR5cGUsCisJCQkgICAgIGxpc3QsY2FzZV9zZW5zaXRpdmUsbm9uX3VuaXF1ZV9tYXRjaGVzKSk7CisgIH0KK3B1YmxpYzoKKyAgRW51bWVyYXRpb25fRmllbGQoY29uc3QgY2hhciogZW51bXNbXSwKKwkJICAgIGJvb2wgY2FzZV9zZW5zPUZBTFNFLAorCQkgICAgYm9vbCBub25fdW5pcXVlPUZBTFNFKQorICAgIDogTkN1cnNlc0ZpZWxkVHlwZShUWVBFX0VOVU0pLAorICAgICAgbGlzdChlbnVtcyksCisgICAgICBjYXNlX3NlbnNpdGl2ZShjYXNlX3NlbnMgPyAtMSA6IDApLAorICAgICAgbm9uX3VuaXF1ZV9tYXRjaGVzKG5vbl91bmlxdWUgPyAtMSA6IDApIHsKKyAgfQorCisgIEVudW1lcmF0aW9uX0ZpZWxkJiBvcGVyYXRvcj0oY29uc3QgRW51bWVyYXRpb25fRmllbGQmIHJocykKKyAgeworICAgIGlmICh0aGlzICE9ICZyaHMpIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgICAgTkN1cnNlc0ZpZWxkVHlwZTo6b3BlcmF0b3I9KHJocyk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEVudW1lcmF0aW9uX0ZpZWxkKGNvbnN0IEVudW1lcmF0aW9uX0ZpZWxkJiByaHMpCisgICAgOiBOQ3Vyc2VzRmllbGRUeXBlKHJocyksCisgICAgICBsaXN0KHJocy5saXN0KSwKKyAgICAgIGNhc2Vfc2Vuc2l0aXZlKHJocy5jYXNlX3NlbnNpdGl2ZSksCisgICAgICBub25fdW5pcXVlX21hdGNoZXMocmhzLm5vbl91bmlxdWVfbWF0Y2hlcykKKyAgeworICB9Cit9OworCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBJUFY0X0FkZHJlc3NfRmllbGQgOiBwdWJsaWMgTkN1cnNlc0ZpZWxkVHlwZQoreworcHJpdmF0ZToKKyAgdm9pZCBzZXQoTkN1cnNlc0Zvcm1GaWVsZCYgZikgeworICAgIE9uRXJyb3IoOjpzZXRfZmllbGRfdHlwZShmLmdldF9maWVsZCgpLGZpZWxkdHlwZSkpOworICB9CisKK3B1YmxpYzoKKyAgSVBWNF9BZGRyZXNzX0ZpZWxkKCkgOiBOQ3Vyc2VzRmllbGRUeXBlKFRZUEVfSVBWNCkgeworICB9Cit9OworCitleHRlcm4gIkMiIHsKKyAgYm9vbCBfbmNfeHhfZmxkX2ZjaGVjayhGSUVMRCAqLCBjb25zdCB2b2lkKik7CisgIGJvb2wgX25jX3h4X2ZsZF9jY2hlY2soaW50IGMsIGNvbnN0IHZvaWQgKik7CisgIHZvaWQqIF9uY194eF9mbGRfbWFrZWFyZyh2YV9saXN0Kik7Cit9CisKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBVc2VyLURlZmluZWQgRmllbGR0eXBlcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KK2NsYXNzIE5DVVJTRVNfSU1QRVhQIFVzZXJEZWZpbmVkRmllbGRUeXBlIDogcHVibGljIE5DdXJzZXNGaWVsZFR5cGUKK3sKKyAgZnJpZW5kIGNsYXNzIFVERl9Jbml0OyAvLyBJbnRlcm5hbCBoZWxwZXIgdG8gc2V0IHVwIHN0YXRpY3MKK3ByaXZhdGU6CisgIC8vIEZvciBhbGwgQysrIGRlZmluZWQgZmllbGR0eXBlcyB3ZSBuZWVkIG9ubHkgb25lIGdlbmVyaWMgbG93bGV2ZWwKKyAgLy8gRklFTERUWVBFKiBlbGVtZW50LgorICBzdGF0aWMgRklFTERUWVBFKiBnZW5lcmljX2ZpZWxkdHlwZTsKKworcHJvdGVjdGVkOgorICAvLyBUaGlzIGFyZSB0aGUgZnVuY3Rpb25zIHJlcXVpcmVkIGJ5IHRoZSBsb3cgbGV2ZWwgbGliZm9ybXMgZnVuY3Rpb25zCisgIC8vIHRvIGNvbnN0cnVjdCBhIGZpZWxkdHlwZS4KKyAgZnJpZW5kIGJvb2wgX25jX3h4X2ZsZF9mY2hlY2soRklFTEQgKiwgY29uc3Qgdm9pZCopOworICBmcmllbmQgYm9vbCBfbmNfeHhfZmxkX2NjaGVjayhpbnQgYywgY29uc3Qgdm9pZCAqKTsKKyAgZnJpZW5kIHZvaWQqIF9uY194eF9mbGRfbWFrZWFyZyh2YV9saXN0Kik7CisKKyAgdm9pZCBzZXQoTkN1cnNlc0Zvcm1GaWVsZCYgZikgeworICAgIE9uRXJyb3IoOjpzZXRfZmllbGRfdHlwZShmLmdldF9maWVsZCgpLGZpZWxkdHlwZSwmZikpOworICB9CisKK3Byb3RlY3RlZDoKKyAgLy8gUmVkZWZpbmUgdGhpcyBmdW5jdGlvbiB0byBkbyBhIGZpZWxkIHZhbGlkYXRpb24uIFRoZSBhcmd1bWVudAorICAvLyBpcyBhIHJlZmVyZW5jZSB0byB0aGUgZmllbGQgeW91IHNob3VsZCB2YWxpZGF0ZS4KKyAgdmlydHVhbCBib29sIGZpZWxkX2NoZWNrKE5DdXJzZXNGb3JtRmllbGQmIGYpID0gMDsKKworICAvLyBSZWRlZmluZSB0aGlzIGZ1bmN0aW9uIHRvIGRvIGEgY2hhcmFjdGVyIHZhbGlkYXRpb24uIFRoZSBhcmd1bWVudAorICAvLyBpcyB0aGUgY2hhcmFjdGVyIHRvIGJlIHZhbGlkYXRlZC4KKyAgdmlydHVhbCBib29sIGNoYXJfY2hlY2sgKGludCBjKSA9IDA7CisKK3B1YmxpYzoKKyAgVXNlckRlZmluZWRGaWVsZFR5cGUoKSA6IE5DdXJzZXNGaWVsZFR5cGUoZ2VuZXJpY19maWVsZHR5cGUpIHsKKyAgfQorfTsKKworZXh0ZXJuICJDIiB7CisgIGJvb2wgX25jX3h4X25leHRfY2hvaWNlKEZJRUxEKiwgY29uc3Qgdm9pZCAqKTsKKyAgYm9vbCBfbmNfeHhfcHJldl9jaG9pY2UoRklFTEQqLCBjb25zdCB2b2lkICopOworfQorCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgVXNlci1EZWZpbmVkIEZpZWxkdHlwZXMgd2l0aCBDaG9pY2UgZnVuY3Rpb25zCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworY2xhc3MgTkNVUlNFU19JTVBFWFAgVXNlckRlZmluZWRGaWVsZFR5cGVfV2l0aF9DaG9pY2UgOiBwdWJsaWMgVXNlckRlZmluZWRGaWVsZFR5cGUKK3sKKyAgZnJpZW5kIGNsYXNzIFVERl9Jbml0OyAvLyBJbnRlcm5hbCBoZWxwZXIgdG8gc2V0IHVwIHN0YXRpY3MKK3ByaXZhdGU6CisgIC8vIEZvciBhbGwgQysrIGRlZmluZWQgZmllbGR0eXBlcyB3aXRoIGNob2ljZSBmdW5jdGlvbnMgd2UgbmVlZCBvbmx5IG9uZQorICAvLyBnZW5lcmljIGxvd2xldmVsIEZJRUxEVFlQRSogZWxlbWVudC4KKyAgc3RhdGljIEZJRUxEVFlQRSogZ2VuZXJpY19maWVsZHR5cGVfd2l0aF9jaG9pY2U7CisKKyAgLy8gVGhpcyBhcmUgdGhlIGZ1bmN0aW9ucyByZXF1aXJlZCBieSB0aGUgbG93IGxldmVsIGxpYmZvcm1zIGZ1bmN0aW9ucworICAvLyB0byBjb25zdHJ1Y3QgYSBmaWVsZHR5cGUgd2l0aCBjaG9pY2UgZnVuY3Rpb25zLgorICBmcmllbmQgYm9vbCBfbmNfeHhfbmV4dF9jaG9pY2UoRklFTEQqLCBjb25zdCB2b2lkICopOworICBmcmllbmQgYm9vbCBfbmNfeHhfcHJldl9jaG9pY2UoRklFTEQqLCBjb25zdCB2b2lkICopOworCitwcm90ZWN0ZWQ6CisgIC8vIFJlZGVmaW5lIHRoaXMgZnVuY3Rpb24gdG8gZG8gdGhlIHJldHJpZXZhbCBvZiB0aGUgbmV4dCBjaG9pY2UgdmFsdWUuCisgIC8vIFRoZSBhcmd1bWVudCBpcyBhIHJlZmVyZW5jZSB0byB0aGUgZmllbGQgdG9iZSBleGFtaW5lZC4KKyAgdmlydHVhbCBib29sIG5leHQgICAgKE5DdXJzZXNGb3JtRmllbGQmIGYpID0gMDsKKworICAvLyBSZWRlZmluZSB0aGlzIGZ1bmN0aW9uIHRvIGRvIHRoZSByZXRyaWV2YWwgb2YgdGhlIHByZXZpb3VzIGNob2ljZSB2YWx1ZS4KKyAgLy8gVGhlIGFyZ3VtZW50IGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBmaWVsZCB0b2JlIGV4YW1pbmVkLgorICB2aXJ0dWFsIGJvb2wgcHJldmlvdXMoTkN1cnNlc0Zvcm1GaWVsZCYgZikgPSAwOworCitwdWJsaWM6CisgIFVzZXJEZWZpbmVkRmllbGRUeXBlX1dpdGhfQ2hvaWNlKCkgeworICAgIGZpZWxkdHlwZSA9IGdlbmVyaWNfZmllbGR0eXBlX3dpdGhfY2hvaWNlOworICB9Cit9OworCisjZW5kaWYgLyogTkNVUlNFU19DVVJTRVNGX0hfaW5jbCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzZXNtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2N1cnNlc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWMyMjczCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzZXNtLmgKQEAgLTAsMCArMSw2NzIgQEAKKy8vICogVGhpcyBtYWtlcyBlbWFjcyBoYXBweSAtKi1Nb2RlOiBDKys7LSotCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMsMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgKgorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgICoKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAqCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgKgorICogZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgICoKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAqCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAqCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAqCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAqCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgKgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgICoKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICoKKyAqIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAqCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgKgorICogYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBBdXRob3I6IEp1ZXJnZW4gUGZlaWZlciwgMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyAkSWQ6IGN1cnNlc20uaCx2IDEuMjUgMjAwNS8wOC8xMyAxODoxMDozNiB0b20gRXhwICQKKworI2lmbmRlZiBOQ1VSU0VTX0NVUlNFU01fSF9pbmNsCisjZGVmaW5lIE5DVVJTRVNfQ1VSU0VTTV9IX2luY2wgMQorCisjaW5jbHVkZSA8Y3Vyc2VzcC5oPgorCitleHRlcm4gIkMiIHsKKyMgIGluY2x1ZGUgPG1lbnUuaD4KK30KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGlzIHdyYXBzIHRoZSBJVEVNIHR5cGUgb2YgPG1lbnUuaD4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzTWVudUl0ZW0KK3sKKyAgZnJpZW5kIGNsYXNzIE5DdXJzZXNNZW51OworCitwcm90ZWN0ZWQ6CisgIElURU0gKml0ZW07CisKKyAgaW5saW5lIHZvaWQgT25FcnJvciAoaW50IGVycikgY29uc3QgVEhST1dTKE5DdXJzZXNNZW51RXhjZXB0aW9uKSB7CisgICAgaWYgKGVyciAhPSBFX09LKQorICAgICAgVEhST1cobmV3IE5DdXJzZXNNZW51RXhjZXB0aW9uIChlcnIpKTsKKyAgfQorCitwdWJsaWM6CisgIE5DdXJzZXNNZW51SXRlbSAoY29uc3QgY2hhciogcF9uYW1lICAgICA9IE5VTEwsCisJCSAgIGNvbnN0IGNoYXIqIHBfZGVzY3JpcHQgPSBOVUxMKQorICAgIDogaXRlbSgwKQorICB7CisgICAgaXRlbSA9IHBfbmFtZSA/IDo6bmV3X2l0ZW0gKHBfbmFtZSwgcF9kZXNjcmlwdCkgOiBTVEFUSUNfQ0FTVChJVEVNKikoMCk7CisgICAgaWYgKHBfbmFtZSAmJiAhaXRlbSkKKyAgICAgIE9uRXJyb3IgKEVfU1lTVEVNX0VSUk9SKTsKKyAgfQorICAvLyBDcmVhdGUgYW4gaXRlbS4gSWYgeW91IHBhc3MgYm90aCBwYXJhbWV0ZXJzIGFzIE5VTEwsIGEgZGVsaW1pdGluZworICAvLyBpdGVtIGlzIGNvbnN0cnVjdGVkIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHRlcm1pbmF0ZSBhIGxpc3Qgb2YKKyAgLy8gTkN1cnNlc01lbnUgb2JqZWN0cy4KKworICBOQ3Vyc2VzTWVudUl0ZW0mIG9wZXJhdG9yPShjb25zdCBOQ3Vyc2VzTWVudUl0ZW0mIHJocykKKyAgeworICAgIGlmICh0aGlzICE9ICZyaHMpIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBOQ3Vyc2VzTWVudUl0ZW0oY29uc3QgTkN1cnNlc01lbnVJdGVtJiByaHMpCisgICAgOiBpdGVtKDApCisgIHsKKyAgfQorCisgIHZpcnR1YWwgfk5DdXJzZXNNZW51SXRlbSAoKTsKKyAgLy8gUmVsZWFzZSB0aGUgaXRlbXMgbWVtb3J5CisKKyAgaW5saW5lIGNvbnN0IGNoYXIqIG5hbWUgKCkgY29uc3QgeworICAgIHJldHVybiA6Oml0ZW1fbmFtZSAoaXRlbSk7CisgIH0KKyAgLy8gTmFtZSBvZiB0aGUgaXRlbQorCisgIGlubGluZSBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbiAoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6aXRlbV9kZXNjcmlwdGlvbiAoaXRlbSk7CisgIH0KKyAgLy8gRGVzY3JpcHRpb24gb2YgdGhlIGl0ZW0KKworICBpbmxpbmUgaW50IChpbmRleCkgKHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gOjppdGVtX2luZGV4IChpdGVtKTsKKyAgfQorICAvLyBJbmRleCBvZiB0aGUgaXRlbSBpbiBhbiBpdGVtIGFycmF5IChvciAtMSkKKworICBpbmxpbmUgdm9pZCBvcHRpb25zX29uIChJdGVtX09wdGlvbnMgb3B0cykgeworICAgIE9uRXJyb3IgKDo6aXRlbV9vcHRzX29uIChpdGVtLCBvcHRzKSk7CisgIH0KKyAgLy8gU3dpdGNoIG9uIHRoZSBpdGVtcyBvcHRpb25zCisKKyAgaW5saW5lIHZvaWQgb3B0aW9uc19vZmYgKEl0ZW1fT3B0aW9ucyBvcHRzKSB7CisgICAgT25FcnJvciAoOjppdGVtX29wdHNfb2ZmIChpdGVtLCBvcHRzKSk7CisgIH0KKyAgLy8gU3dpdGNoIG9mZiB0aGUgaXRlbSdzIG9wdGlvbgorCisgIGlubGluZSBJdGVtX09wdGlvbnMgb3B0aW9ucyAoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6aXRlbV9vcHRzIChpdGVtKTsKKyAgfQorICAvLyBSZXRyaWV2ZSB0aGUgaXRlbXMgb3B0aW9ucworCisgIGlubGluZSB2b2lkIHNldF9vcHRpb25zIChJdGVtX09wdGlvbnMgb3B0cykgeworICAgIE9uRXJyb3IgKDo6c2V0X2l0ZW1fb3B0cyAoaXRlbSwgb3B0cykpOworICB9CisgIC8vIFNldCB0aGUgaXRlbXMgb3B0aW9ucworCisgIGlubGluZSB2b2lkIHNldF92YWx1ZSAoYm9vbCBmKSB7CisgICAgT25FcnJvciAoOjpzZXRfaXRlbV92YWx1ZSAoaXRlbSxmKSk7CisgIH0KKyAgLy8gU2V0L1Jlc2V0IHRoZSBpdGVtcyBzZWxlY3Rpb24gc3RhdGUKKworICBpbmxpbmUgYm9vbCB2YWx1ZSAoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6aXRlbV92YWx1ZSAoaXRlbSk7CisgIH0KKyAgLy8gUmV0cmlldmUgdGhlIGl0ZW1zIHNlbGVjdGlvbiBzdGF0ZQorCisgIGlubGluZSBib29sIHZpc2libGUgKCkgY29uc3QgeworICAgIHJldHVybiA6Oml0ZW1fdmlzaWJsZSAoaXRlbSk7CisgIH0KKyAgLy8gUmV0cmlldmUgdmlzaWJpbGl0eSBvZiB0aGUgaXRlbQorCisgIHZpcnR1YWwgYm9vbCBhY3Rpb24oKTsKKyAgLy8gUGVyZm9ybSBhbiBhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgaXRlbTsgeW91IG1heSB1c2UgdGhpcyBpbiBhbgorICAvLyB1c2VyIHN1cHBsaWVkIGRyaXZlciBmb3IgYSBtZW51OyB5b3UgbWF5IGRlcml2ZSBmcm9tIHRoaXMgY2xhc3MgYW5kCisgIC8vIG92ZXJsb2FkIGFjdGlvbigpIHRvIHN1cHBseSBpdGVtcyB3aXRoIGRpZmZlcmVudCBhY3Rpb25zLgorICAvLyBJZiBhbiBhY3Rpb24gcmV0dXJucyB0cnVlLCB0aGUgbWVudSB3aWxsIGJlIGV4aXRlZC4gVGhlIGRlZmF1bHQgYWN0aW9uCisgIC8vIGlzIHRvIGRvIG5vdGhpbmcuCit9OworCisvLyBQcm90b3R5cGUgZm9yIGFuIGl0ZW1zIGNhbGxiYWNrIGZ1bmN0aW9uLgordHlwZWRlZiBib29sIElURU1DQUxMQkFDSyhOQ3Vyc2VzTWVudUl0ZW0mKTsKKworLy8gSWYgeW91IGRvbid0IGxpa2UgdG8gY3JlYXRlIGEgY2hpbGQgY2xhc3MgZm9yIGluZGl2aWR1YWwgaXRlbXMgdG8KKy8vIG92ZXJsb2FkIGFjdGlvbigpLCB5b3UgbWF5IHVzZSB0aGlzIGNsYXNzIGFuZCBwcm92aWRlIGEgY2FsbGJhY2sKKy8vIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIGl0ZW1zLgorY2xhc3MgTkNVUlNFU19JTVBFWFAgTkN1cnNlc01lbnVDYWxsYmFja0l0ZW0gOiBwdWJsaWMgTkN1cnNlc01lbnVJdGVtCit7Citwcml2YXRlOgorICBJVEVNQ0FMTEJBQ0sqIHBfZmN0OworCitwdWJsaWM6CisgIE5DdXJzZXNNZW51Q2FsbGJhY2tJdGVtKElURU1DQUxMQkFDSyogZmN0ICAgICAgID0gTlVMTCwKKwkJCSAgY29uc3QgY2hhciogcF9uYW1lICAgICAgPSBOVUxMLAorCQkJICBjb25zdCBjaGFyKiBwX2Rlc2NyaXB0ICA9IE5VTEwgKQorICAgIDogTkN1cnNlc01lbnVJdGVtIChwX25hbWUsIHBfZGVzY3JpcHQpLAorICAgICAgcF9mY3QgKGZjdCkgeworICB9CisKKyAgTkN1cnNlc01lbnVDYWxsYmFja0l0ZW0mIG9wZXJhdG9yPShjb25zdCBOQ3Vyc2VzTWVudUNhbGxiYWNrSXRlbSYgcmhzKQorICB7CisgICAgaWYgKHRoaXMgIT0gJnJocykgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE5DdXJzZXNNZW51Q2FsbGJhY2tJdGVtKGNvbnN0IE5DdXJzZXNNZW51Q2FsbGJhY2tJdGVtJiByaHMpCisgICAgOiBOQ3Vyc2VzTWVudUl0ZW0ocmhzKSwKKyAgICAgIHBfZmN0KDApCisgIHsKKyAgfQorCisgIHZpcnR1YWwgfk5DdXJzZXNNZW51Q2FsbGJhY2tJdGVtKCk7CisKKyAgYm9vbCBhY3Rpb24oKTsKK307CisKKyAgLy8gVGhpcyBhcmUgdGhlIGJ1aWx0LWluIGhvb2sgZnVuY3Rpb25zIGluIHRoaXMgQysrIGJpbmRpbmcuIEluIEMrKyB3ZSB1c2UKKyAgLy8gdmlydHVhbCBtZW1iZXIgZnVuY3Rpb25zIChzZWUgYmVsb3cgT25fLi4uX0luaXQgYW5kIE9uXy4uLl9UZXJtaW5hdGlvbikKKyAgLy8gdG8gcHJvdmlkZSB0aGlzIGZ1bmN0aW9uYWxpdHkgaW4gYW4gb2JqZWN0IG9yaWVudGVkIG1hbm5lci4KK2V4dGVybiAiQyIgeworICB2b2lkIF9uY194eF9tbnVfaW5pdChNRU5VICopOworICB2b2lkIF9uY194eF9tbnVfdGVybShNRU5VICopOworICB2b2lkIF9uY194eF9pdG1faW5pdChNRU5VICopOworICB2b2lkIF9uY194eF9pdG1fdGVybShNRU5VICopOworfQorCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhpcyB3cmFwcyB0aGUgTUVOVSB0eXBlIG9mIDxtZW51Lmg+CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworY2xhc3MgTkNVUlNFU19JTVBFWFAgTkN1cnNlc01lbnUgOiBwdWJsaWMgTkN1cnNlc1BhbmVsCit7Citwcm90ZWN0ZWQ6CisgIE1FTlUgKm1lbnU7CisKK3ByaXZhdGU6CisgIE5DdXJzZXNXaW5kb3cqIHN1YjsgICAvLyB0aGUgc3Vid2luZG93IG9iamVjdAorICBib29sIGJfc3ViX293bmVyOyAgICAgLy8gaXMgdGhpcyBvdXIgb3duIHN1YndpbmRvdz8KKyAgYm9vbCBiX2ZyYW1lZDsgICAgICAgIC8vIGhhcyB0aGUgbWVudSBhIGJvcmRlcj8KKyAgYm9vbCBiX2F1dG9EZWxldGU7ICAgIC8vIERlbGV0ZSBpdGVtcyB3aGVuIGRlbGV0aW5nIG1lbnU/CisKKyAgTkN1cnNlc01lbnVJdGVtKiogbXlfaXRlbXM7IC8vIFRoZSBhcnJheSBvZiBpdGVtcyBmb3IgdGhpcyBtZW51CisKKyAgLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgdGhlIG1lbnUncyB1c2VyIGRhdGEgZmllbGQgdG8gbGluayB0aGUKKyAgLy8gTUVOVSogdG8gdGhlIEMrKyBvYmplY3QgYW5kIHRvIHByb3ZpZGUgZXh0cmEgc3BhY2UgZm9yIGEgdXNlciBwb2ludGVyLgorICB0eXBlZGVmIHN0cnVjdCB7CisgICAgdm9pZCogICAgICAgICAgICAgIG1fdXNlcjsgICAgICAvLyB0aGUgcG9pbnRlciBmb3IgdGhlIHVzZXIncyBkYXRhCisgICAgY29uc3QgTkN1cnNlc01lbnUqIG1fYmFjazsgICAgICAvLyBiYWNrd2FyZCBwb2ludGVyIHRvIEMrKyBvYmplY3QKKyAgICBjb25zdCBNRU5VKiAgICAgICAgbV9vd25lcjsKKyAgfSBVc2VySG9vazsKKworICAvLyBHZXQgdGhlIGJhY2t3YXJkIHBvaW50ZXIgdG8gdGhlIEMrKyBvYmplY3QgZnJvbSBhIE1FTlUKKyAgc3RhdGljIGlubGluZSBOQ3Vyc2VzTWVudSogZ2V0SG9vayhjb25zdCBNRU5VICptKSB7CisgICAgVXNlckhvb2sqIGhvb2sgPSBTVEFUSUNfQ0FTVChVc2VySG9vayopKDo6bWVudV91c2VycHRyKG0pKTsKKyAgICBhc3NlcnQoaG9vayAhPSAwICYmIGhvb2stPm1fb3duZXI9PW0pOworICAgIHJldHVybiBjb25zdF9jYXN0PE5DdXJzZXNNZW51Kj4oaG9vay0+bV9iYWNrKTsKKyAgfQorCisgIGZyaWVuZCB2b2lkIF9uY194eF9tbnVfaW5pdChNRU5VICopOworICBmcmllbmQgdm9pZCBfbmNfeHhfbW51X3Rlcm0oTUVOVSAqKTsKKyAgZnJpZW5kIHZvaWQgX25jX3h4X2l0bV9pbml0KE1FTlUgKik7CisgIGZyaWVuZCB2b2lkIF9uY194eF9pdG1fdGVybShNRU5VICopOworCisgIC8vIENhbGN1bGF0ZSBJVEVNKiBhcnJheSBmb3IgdGhlIG1lbnUKKyAgSVRFTSoqIG1hcEl0ZW1zKE5DdXJzZXNNZW51SXRlbSogbml0ZW1zW10pOworCitwcm90ZWN0ZWQ6CisgIC8vIGludGVybmFsIHJvdXRpbmVzCisgIGlubGluZSB2b2lkIHNldF91c2VyKHZvaWQgKnVzZXIpIHsKKyAgICBVc2VySG9vayogdXB0ciA9IFNUQVRJQ19DQVNUKFVzZXJIb29rKikoOjptZW51X3VzZXJwdHIgKG1lbnUpKTsKKyAgICBhc3NlcnQgKHVwdHIgIT0gMCAmJiB1cHRyLT5tX2JhY2s9PXRoaXMgJiYgdXB0ci0+bV9vd25lcj09bWVudSk7CisgICAgdXB0ci0+bV91c2VyID0gdXNlcjsKKyAgfQorCisgIGlubGluZSB2b2lkICpnZXRfdXNlcigpIHsKKyAgICBVc2VySG9vayogdXB0ciA9IFNUQVRJQ19DQVNUKFVzZXJIb29rKikoOjptZW51X3VzZXJwdHIgKG1lbnUpKTsKKyAgICBhc3NlcnQgKHVwdHIgIT0gMCAmJiB1cHRyLT5tX2JhY2s9PXRoaXMgJiYgdXB0ci0+bV9vd25lcj09bWVudSk7CisgICAgcmV0dXJuIHVwdHItPm1fdXNlcjsKKyAgfQorCisgIHZvaWQgSW5pdE1lbnUgKE5DdXJzZXNNZW51SXRlbSogbWVudVtdLAorCQkgYm9vbCB3aXRoX2ZyYW1lLAorCQkgYm9vbCBhdXRvRGVsZXRlSXRlbXMpOworCisgIGlubGluZSB2b2lkIE9uRXJyb3IgKGludCBlcnIpIGNvbnN0IFRIUk9XUyhOQ3Vyc2VzTWVudUV4Y2VwdGlvbikgeworICAgIGlmIChlcnIgIT0gRV9PSykKKyAgICAgIFRIUk9XKG5ldyBOQ3Vyc2VzTWVudUV4Y2VwdGlvbiAodGhpcywgZXJyKSk7CisgIH0KKworICAvLyB0aGlzIHdyYXBzIHRoZSBtZW51X2RyaXZlciBjYWxsLgorICB2aXJ0dWFsIGludCBkcml2ZXIgKGludCBjKSA7CisKKyAgLy8gJ0ludGVybmFsJyBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBtZW51IHdpdGhvdXQgYXNzb2NpYXRpb24gdG8KKyAgLy8gYW4gYXJyYXkgb2YgaXRlbXMuCisgIE5DdXJzZXNNZW51KCBpbnQgIG5saW5lcywKKwkgICAgICAgaW50ICBuY29scywKKwkgICAgICAgaW50ICBiZWdpbl95ID0gMCwKKwkgICAgICAgaW50ICBiZWdpbl94ID0gMCkKKyAgICA6IE5DdXJzZXNQYW5lbChubGluZXMsbmNvbHMsYmVnaW5feSxiZWdpbl94KSwKKyAgICAgIG1lbnUgKFNUQVRJQ19DQVNUKE1FTlUqKSgwKSksCisgICAgICBzdWIoMCksCisgICAgICBiX3N1Yl9vd25lcigwKSwKKyAgICAgIGJfZnJhbWVkKDApLAorICAgICAgYl9hdXRvRGVsZXRlKDApLAorICAgICAgbXlfaXRlbXMoMCkKKyAgeworICB9CisKK3B1YmxpYzoKKyAgLy8gTWFrZSBhIGZ1bGwgd2luZG93IHNpemUgbWVudQorICBOQ3Vyc2VzTWVudSAoTkN1cnNlc01lbnVJdGVtKiBJdGVtc1tdLAorCSAgICAgICBib29sIHdpdGhfZnJhbWU9RkFMU0UsICAgICAgICAvLyBSZXNlcnZlIHNwYWNlIGZvciBhIGZyYW1lPworCSAgICAgICBib29sIGF1dG9EZWxldGVfSXRlbXM9RkFMU0UpICAvLyBBdXRvY2xlYW51cCBvZiBJdGVtcz8KKyAgICA6IE5DdXJzZXNQYW5lbCgpLAorICAgICAgbWVudSgwKSwKKyAgICAgIHN1YigwKSwKKyAgICAgIGJfc3ViX293bmVyKDApLAorICAgICAgYl9mcmFtZWQoMCksCisgICAgICBiX2F1dG9EZWxldGUoMCksCisgICAgICBteV9pdGVtcygwKQorICB7CisgICAgICBJbml0TWVudShJdGVtcywgd2l0aF9mcmFtZSwgYXV0b0RlbGV0ZV9JdGVtcyk7CisgIH0KKworICAvLyBNYWtlIGEgbWVudSB3aXRoIGEgd2luZG93IG9mIHRoaXMgc2l6ZS4KKyAgTkN1cnNlc01lbnUgKE5DdXJzZXNNZW51SXRlbSogSXRlbXNbXSwKKwkgICAgICAgaW50ICBubGluZXMsCisJICAgICAgIGludCAgbmNvbHMsCisJICAgICAgIGludCAgYmVnaW5feSA9IDAsCisJICAgICAgIGludCAgYmVnaW5feCA9IDAsCisJICAgICAgIGJvb2wgd2l0aF9mcmFtZT1GQUxTRSwgICAgICAgIC8vIFJlc2VydmUgc3BhY2UgZm9yIGEgZnJhbWU/CisJICAgICAgIGJvb2wgYXV0b0RlbGV0ZV9JdGVtcz1GQUxTRSkgIC8vIEF1dG9jbGVhbnVwIG9mIEl0ZW1zPworICAgIDogTkN1cnNlc1BhbmVsKG5saW5lcywgbmNvbHMsIGJlZ2luX3ksIGJlZ2luX3gpLAorICAgICAgbWVudSgwKSwKKyAgICAgIHN1YigwKSwKKyAgICAgIGJfc3ViX293bmVyKDApLAorICAgICAgYl9mcmFtZWQoMCksCisgICAgICBiX2F1dG9EZWxldGUoMCksCisgICAgICBteV9pdGVtcygwKQorICB7CisgICAgICBJbml0TWVudShJdGVtcywgd2l0aF9mcmFtZSwgYXV0b0RlbGV0ZV9JdGVtcyk7CisgIH0KKworICBOQ3Vyc2VzTWVudSYgb3BlcmF0b3I9KGNvbnN0IE5DdXJzZXNNZW51JiByaHMpCisgIHsKKyAgICBpZiAodGhpcyAhPSAmcmhzKSB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICAgIE5DdXJzZXNQYW5lbDo6b3BlcmF0b3I9KHJocyk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE5DdXJzZXNNZW51KGNvbnN0IE5DdXJzZXNNZW51JiByaHMpCisgICAgOiBOQ3Vyc2VzUGFuZWwocmhzKSwKKyAgICAgIG1lbnUocmhzLm1lbnUpLAorICAgICAgc3ViKHJocy5zdWIpLAorICAgICAgYl9zdWJfb3duZXIocmhzLmJfc3ViX293bmVyKSwKKyAgICAgIGJfZnJhbWVkKHJocy5iX2ZyYW1lZCksCisgICAgICBiX2F1dG9EZWxldGUocmhzLmJfYXV0b0RlbGV0ZSksCisgICAgICBteV9pdGVtcyhyaHMubXlfaXRlbXMpCisgIHsKKyAgfQorCisgIHZpcnR1YWwgfk5DdXJzZXNNZW51ICgpOworCisgIC8vIFJldHJpZXZlIHRoZSBtZW51cyBzdWJ3aW5kb3cKKyAgaW5saW5lIE5DdXJzZXNXaW5kb3cmIHN1YldpbmRvdygpIGNvbnN0IHsKKyAgICBhc3NlcnQoc3ViIT1OVUxMKTsKKyAgICByZXR1cm4gKnN1YjsKKyAgfQorCisgIC8vIFNldCB0aGUgbWVudXMgc3Vid2luZG93CisgIHZvaWQgc2V0U3ViV2luZG93KE5DdXJzZXNXaW5kb3cmIHN1Yik7CisKKyAgLy8gU2V0IHRoZXNlIGl0ZW1zIGZvciB0aGUgbWVudQorICBpbmxpbmUgdm9pZCBzZXRJdGVtcyhOQ3Vyc2VzTWVudUl0ZW0qIEl0ZW1zW10pIHsKKyAgICBPbkVycm9yKDo6c2V0X21lbnVfaXRlbXMobWVudSxtYXBJdGVtcyhJdGVtcykpKTsKKyAgfQorCisgIC8vIFJlbW92ZSB0aGUgbWVudSBmcm9tIHRoZSBzY3JlZW4KKyAgaW5saW5lIHZvaWQgdW5wb3N0ICh2b2lkKSB7CisgICAgT25FcnJvciAoOjp1bnBvc3RfbWVudSAobWVudSkpOworICB9CisKKyAgLy8gUG9zdCB0aGUgbWVudSB0byB0aGUgc2NyZWVuIGlmIGZsYWcgaXMgdHJ1ZSwgdW5wb3N0IGl0IG90aGVyd2lzZQorICBpbmxpbmUgdm9pZCBwb3N0KGJvb2wgZmxhZyA9IFRSVUUpIHsKKyAgICBmbGFnID8gT25FcnJvciAoOjpwb3N0X21lbnUobWVudSkpIDogT25FcnJvciAoOjp1bnBvc3RfbWVudSAobWVudSkpOworICB9CisKKyAgLy8gR2V0IHRoZSBudW1lciBvZiByb3dzIGFuZCBjb2x1bW5zIGZvciB0aGlzIG1lbnUKKyAgaW5saW5lIHZvaWQgc2NhbGUgKGludCYgbXJvd3MsIGludCYgbWNvbHMpIGNvbnN0ICB7CisgICAgT25FcnJvciAoOjpzY2FsZV9tZW51IChtZW51LCAmbXJvd3MsICZtY29scykpOworICB9CisKKyAgLy8gU2V0IHRoZSBmb3JtYXQgb2YgdGhpcyBtZW51CisgIGlubGluZSB2b2lkIHNldF9mb3JtYXQoaW50IG1yb3dzLCBpbnQgbWNvbHMpIHsKKyAgICBPbkVycm9yICg6OnNldF9tZW51X2Zvcm1hdChtZW51LCBtcm93cywgbWNvbHMpKTsKKyAgfQorCisgIC8vIEdldCB0aGUgZm9ybWF0IG9mIHRoaXMgbWVudQorICBpbmxpbmUgdm9pZCBtZW51X2Zvcm1hdChpbnQmIHJvd3MsaW50JiBuY29scykgeworICAgIDo6bWVudV9mb3JtYXQobWVudSwmcm93cywmbmNvbHMpOworICB9CisKKyAgLy8gSXRlbXMgb2YgdGhlIG1lbnUKKyAgaW5saW5lIE5DdXJzZXNNZW51SXRlbSogaXRlbXMoKSBjb25zdCB7CisgICAgcmV0dXJuICpteV9pdGVtczsKKyAgfQorCisgIC8vIEdldCB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoaXMgbWVudQorICBpbmxpbmUgaW50IGNvdW50KCkgY29uc3QgeworICAgIHJldHVybiA6Oml0ZW1fY291bnQobWVudSk7CisgIH0KKworICAvLyBHZXQgdGhlIGN1cnJlbnQgaXRlbSAoaS5lLiB0aGUgb25lIHRoZSBjdXJzb3IgaXMgbG9jYXRlZCkKKyAgaW5saW5lIE5DdXJzZXNNZW51SXRlbSogY3VycmVudF9pdGVtKCkgY29uc3QgeworICAgIHJldHVybiBteV9pdGVtc1s6Oml0ZW1faW5kZXgoOjpjdXJyZW50X2l0ZW0obWVudSkpXTsKKyAgfQorCisgIC8vIEdldCB0aGUgbWFya2VyIHN0cmluZworICBpbmxpbmUgY29uc3QgY2hhciogbWFyaygpIGNvbnN0IHsKKyAgICByZXR1cm4gOjptZW51X21hcmsobWVudSk7CisgIH0KKworICAvLyBTZXQgdGhlIG1hcmtlciBzdHJpbmcKKyAgaW5saW5lIHZvaWQgc2V0X21hcmsoY29uc3QgY2hhciAqbWFya2VyKSB7CisgICAgT25FcnJvciAoOjpzZXRfbWVudV9tYXJrIChtZW51LCBtYXJrZXIpKTsKKyAgfQorCisgIC8vIEdldCB0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdCBjb2RlIGMKKyAgaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyKiByZXF1ZXN0X25hbWUoaW50IGMpIHsKKyAgICByZXR1cm4gOjptZW51X3JlcXVlc3RfbmFtZShjKTsKKyAgfQorCisgIC8vIEdldCB0aGUgY3VycmVudCBwYXR0ZXJuCisgIGlubGluZSBjaGFyKiBwYXR0ZXJuKCkgY29uc3QgeworICAgIHJldHVybiA6Om1lbnVfcGF0dGVybihtZW51KTsKKyAgfQorCisgIC8vIHRydWUgaWYgdGhlcmUgaXMgYSBwYXR0ZXJuIG1hdGNoLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgc2V0X3BhdHRlcm4gKGNvbnN0IGNoYXIgKnBhdCk7CisKKyAgLy8gc2V0IHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBtZW51CisgIC8vIGkuZS4gc2V0IGZvcmUsIGJhY2sgYW5kIGdyZXkgYXR0cmlidXRlCisgIHZpcnR1YWwgdm9pZCBzZXREZWZhdWx0QXR0cmlidXRlcygpOworCisgIC8vIEdldCB0aGUgbWVudXMgYmFja2dyb3VuZCBhdHRyaWJ1dGVzCisgIGlubGluZSBjaHR5cGUgYmFjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gOjptZW51X2JhY2sobWVudSk7CisgIH0KKworICAvLyBHZXQgdGhlIG1lbnVzIGZvcmVncm91bmQgYXR0cmlidXRlcworICBpbmxpbmUgY2h0eXBlIGZvcmUoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6bWVudV9mb3JlKG1lbnUpOworICB9CisKKyAgLy8gR2V0IHRoZSBtZW51cyBncmV5IGF0dHJpYnV0ZXMgKHVzZWQgZm9yIHVuc2VsZWN0YWJsZSBpdGVtcykKKyAgaW5saW5lIGNodHlwZSBncmV5KCkgY29uc3QgeworICAgIHJldHVybiA6Om1lbnVfZ3JleShtZW51KTsKKyAgfQorCisgIC8vIFNldCB0aGUgbWVudXMgYmFja2dyb3VuZCBhdHRyaWJ1dGVzCisgIGlubGluZSBjaHR5cGUgc2V0X2JhY2tncm91bmQoY2h0eXBlIGEpIHsKKyAgICByZXR1cm4gOjpzZXRfbWVudV9iYWNrKG1lbnUsYSk7CisgIH0KKworICAvLyBTZXQgdGhlIG1lbnVzIGZvcmVncm91bmQgYXR0cmlidXRlcworICBpbmxpbmUgY2h0eXBlIHNldF9mb3JlZ3JvdW5kKGNodHlwZSBhKSB7CisgICAgcmV0dXJuIDo6c2V0X21lbnVfZm9yZShtZW51LGEpOworICB9CisKKyAgLy8gU2V0IHRoZSBtZW51cyBncmV5IGF0dHJpYnV0ZXMgKHVzZWQgZm9yIHVuc2VsZWN0YWJsZSBpdGVtcykKKyAgaW5saW5lIGNodHlwZSBzZXRfZ3JleShjaHR5cGUgYSkgeworICAgIHJldHVybiA6OnNldF9tZW51X2dyZXkobWVudSxhKTsKKyAgfQorCisgIGlubGluZSB2b2lkIG9wdGlvbnNfb24gKE1lbnVfT3B0aW9ucyBvcHRzKSB7CisgICAgT25FcnJvciAoOjptZW51X29wdHNfb24gKG1lbnUsb3B0cykpOworICB9CisKKyAgaW5saW5lIHZvaWQgb3B0aW9uc19vZmYoTWVudV9PcHRpb25zIG9wdHMpIHsKKyAgICBPbkVycm9yICg6Om1lbnVfb3B0c19vZmYobWVudSxvcHRzKSk7CisgIH0KKworICBpbmxpbmUgTWVudV9PcHRpb25zIG9wdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6bWVudV9vcHRzKG1lbnUpOworICB9CisKKyAgaW5saW5lIHZvaWQgc2V0X29wdGlvbnMgKE1lbnVfT3B0aW9ucyBvcHRzKSB7CisgICAgT25FcnJvciAoOjpzZXRfbWVudV9vcHRzIChtZW51LG9wdHMpKTsKKyAgfQorCisgIGlubGluZSBpbnQgcGFkKCkgY29uc3QgeworICAgIHJldHVybiA6Om1lbnVfcGFkKG1lbnUpOworICB9CisKKyAgaW5saW5lIHZvaWQgc2V0X3BhZCAoaW50IHBhZGNoKSB7CisgICAgT25FcnJvciAoOjpzZXRfbWVudV9wYWQgKG1lbnUsIHBhZGNoKSk7CisgIH0KKworICAvLyBQb3NpdGlvbiB0aGUgY3Vyc29yIHRvIHRoZSBjdXJyZW50IGl0ZW0KKyAgaW5saW5lIHZvaWQgcG9zaXRpb25fY3Vyc29yICgpIGNvbnN0IHsKKyAgICBPbkVycm9yICg6OnBvc19tZW51X2N1cnNvciAobWVudSkpOworICB9CisKKyAgLy8gU2V0IHRoZSBjdXJyZW50IGl0ZW0KKyAgaW5saW5lIHZvaWQgc2V0X2N1cnJlbnQoTkN1cnNlc01lbnVJdGVtJiBJKSB7CisgICAgT25FcnJvciAoOjpzZXRfY3VycmVudF9pdGVtKG1lbnUsIEkuaXRlbSkpOworICB9CisKKyAgLy8gR2V0IHRoZSBjdXJyZW50IHRvcCByb3cgb2YgdGhlIG1lbnUKKyAgaW5saW5lIGludCB0b3Bfcm93ICh2b2lkKSBjb25zdCB7CisgICAgcmV0dXJuIDo6dG9wX3JvdyAobWVudSk7CisgIH0KKworICAvLyBTZXQgdGhlIGN1cnJlbnQgdG9wIHJvdyBvZiB0aGUgbWVudQorICBpbmxpbmUgdm9pZCBzZXRfdG9wX3JvdyAoaW50IHJvdykgeworICAgIE9uRXJyb3IgKDo6c2V0X3RvcF9yb3cgKG1lbnUsIHJvdykpOworICB9CisKKyAgLy8gc3BhY2luZyBjb250cm9sCisgIC8vIFNldCB0aGUgc3BhY2luZyBmb3IgdGhlIG1lbnUKKyAgaW5saW5lIHZvaWQgc2V0U3BhY2luZyhpbnQgc3BjX2Rlc2NyaXB0aW9uLAorCQkJIGludCBzcGNfcm93cywKKwkJCSBpbnQgc3BjX2NvbHVtbnMpIHsKKyAgICBPbkVycm9yKDo6c2V0X21lbnVfc3BhY2luZyhtZW51LAorCQkJICAgICAgIHNwY19kZXNjcmlwdGlvbiwKKwkJCSAgICAgICBzcGNfcm93cywKKwkJCSAgICAgICBzcGNfY29sdW1ucykpOworICB9CisKKyAgLy8gR2V0IHRoZSBzcGFjaW5nIGluZm8gZm9yIHRoZSBtZW51CisgIGlubGluZSB2b2lkIFNwYWNpbmcoaW50JiBzcGNfZGVzY3JpcHRpb24sCisJCSAgICAgIGludCYgc3BjX3Jvd3MsCisJCSAgICAgIGludCYgc3BjX2NvbHVtbnMpIGNvbnN0IHsKKyAgICBPbkVycm9yKDo6bWVudV9zcGFjaW5nKG1lbnUsCisJCQkgICAmc3BjX2Rlc2NyaXB0aW9uLAorCQkJICAgJnNwY19yb3dzLAorCQkJICAgJnNwY19jb2x1bW5zKSk7CisgIH0KKworICAvLyBEZWNvcmF0aW9ucworICBpbmxpbmUgdm9pZCBmcmFtZShjb25zdCBjaGFyICp0aXRsZT1OVUxMLCBjb25zdCBjaGFyKiBidGl0bGU9TlVMTCkgeworICAgIGlmIChiX2ZyYW1lZCkKKyAgICAgIE5DdXJzZXNQYW5lbDo6ZnJhbWUodGl0bGUsYnRpdGxlKTsKKyAgICBlbHNlCisgICAgICBPbkVycm9yKEVfU1lTVEVNX0VSUk9SKTsKKyAgfQorCisgIGlubGluZSB2b2lkIGJvbGRmcmFtZShjb25zdCBjaGFyICp0aXRsZT1OVUxMLCBjb25zdCBjaGFyKiBidGl0bGU9TlVMTCkgeworICAgIGlmIChiX2ZyYW1lZCkKKyAgICAgIE5DdXJzZXNQYW5lbDo6Ym9sZGZyYW1lKHRpdGxlLGJ0aXRsZSk7CisgICAgZWxzZQorICAgICAgT25FcnJvcihFX1NZU1RFTV9FUlJPUik7CisgIH0KKworICBpbmxpbmUgdm9pZCBsYWJlbChjb25zdCBjaGFyICp0b3BMYWJlbCwgY29uc3QgY2hhciAqYm90dG9tTGFiZWwpIHsKKyAgICBpZiAoYl9mcmFtZWQpCisgICAgICBOQ3Vyc2VzUGFuZWw6OmxhYmVsKHRvcExhYmVsLGJvdHRvbUxhYmVsKTsKKyAgICBlbHNlCisgICAgICBPbkVycm9yKEVfU1lTVEVNX0VSUk9SKTsKKyAgfQorCisgIC8vIC0tLS0tCisgIC8vIEhvb2tzCisgIC8vIC0tLS0tCisKKyAgLy8gQ2FsbGVkIGFmdGVyIHRoZSBtZW51IGdldHMgcmVwb3NpdGlvbmVkIGluIGl0cyB3aW5kb3cuCisgIC8vIFRoaXMgaXMgZXNwZWNpYWxseSB0cnVlIGlmIHRoZSBtZW51IGlzIHBvc3RlZC4KKyAgdmlydHVhbCB2b2lkIE9uX01lbnVfSW5pdCgpOworCisgIC8vIENhbGxlZCBiZWZvcmUgdGhlIG1lbnUgZ2V0cyByZXBvc2l0aW9uZWQgaW4gaXRzIHdpbmRvdy4KKyAgLy8gVGhpcyBpcyBlc3BlY2lhbGx5IHRydWUgaWYgdGhlIG1lbnUgaXMgdW5wb3N0ZWQuCisgIHZpcnR1YWwgdm9pZCBPbl9NZW51X1Rlcm1pbmF0aW9uKCk7CisKKyAgLy8gQ2FsbGVkIGFmdGVyIHRoZSBpdGVtIGJlY2FtZSB0aGUgY3VycmVudCBpdGVtCisgIHZpcnR1YWwgdm9pZCBPbl9JdGVtX0luaXQoTkN1cnNlc01lbnVJdGVtJiBpdGVtKTsKKworICAvLyBDYWxsZWQgYmVmb3JlIHRoaXMgaXRlbSBpcyBsZWZ0IGFzIGN1cnJlbnQgaXRlbS4KKyAgdmlydHVhbCB2b2lkIE9uX0l0ZW1fVGVybWluYXRpb24oTkN1cnNlc01lbnVJdGVtJiBpdGVtKTsKKworICAvLyBQcm92aWRlIGEgZGVmYXVsdCBrZXkgdmlydHVhbGl6YXRpb24uIFRyYW5zbGF0ZSB0aGUga2V5Ym9hcmQKKyAgLy8gY29kZSBjIGludG8gYSBtZW51IHJlcXVlc3QgY29kZS4KKyAgLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgYSBob3BlZnVsbHkgc3RyYWlnaHRmb3J3YXJkCisgIC8vIG1hcHBpbmcgZm9yIHRoZSBtb3N0IGNvbW1vbiBrZXlzdHJva2VzIGFuZCBtZW51IHJlcXVlc3RzLgorICB2aXJ0dWFsIGludCB2aXJ0dWFsaXplKGludCBjKTsKKworCisgIC8vIE9wZXJhdG9ycworICBpbmxpbmUgTkN1cnNlc01lbnVJdGVtKiBvcGVyYXRvcltdKGludCBpKSBjb25zdCB7CisgICAgaWYgKCAoaSA8IDApIHx8IChpID49IDo6aXRlbV9jb3VudCAobWVudSkpICkKKyAgICAgIE9uRXJyb3IgKEVfQkFEX0FSR1VNRU5UKTsKKyAgICByZXR1cm4gKG15X2l0ZW1zW2ldKTsKKyAgfQorCisgIC8vIFBlcmZvcm0gdGhlIG1lbnUncyBvcGVyYXRpb24KKyAgLy8gUmV0dXJuIHRoZSBpdGVtIHdoZXJlIHlvdSBsZWZ0IHRoZSBzZWxlY3Rpb24gbWFyayBmb3IgYSBzaW5nbGUKKyAgLy8gc2VsZWN0aW9uIG1lbnUsIG9yIE5VTEwgZm9yIGEgbXVsdGl2YWx1ZWQgbWVudS4KKyAgdmlydHVhbCBOQ3Vyc2VzTWVudUl0ZW0qIG9wZXJhdG9yKCkodm9pZCk7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gRXhjZXB0aW9uIGhhbmRsZXJzCisgIC8vIENhbGxlZCBieSBvcGVyYXRvcigpCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gQ2FsbGVkIGlmIHRoZSByZXF1ZXN0IGlzIGRlbmllZAorICB2aXJ0dWFsIHZvaWQgT25fUmVxdWVzdF9EZW5pZWQoaW50IGMpIGNvbnN0OworCisgIC8vIENhbGxlZCBpZiB0aGUgaXRlbSBpcyBub3Qgc2VsZWN0YWJsZQorICB2aXJ0dWFsIHZvaWQgT25fTm90X1NlbGVjdGFibGUoaW50IGMpIGNvbnN0OworCisgIC8vIENhbGxlZCBpZiBwYXR0ZXJuIGRvZXNuJ3QgbWF0Y2gKKyAgdmlydHVhbCB2b2lkIE9uX05vX01hdGNoKGludCBjKSBjb25zdDsKKworICAvLyBDYWxsZWQgaWYgdGhlIGNvbW1hbmQgaXMgdW5rbm93bgorICB2aXJ0dWFsIHZvaWQgT25fVW5rbm93bl9Db21tYW5kKGludCBjKSBjb25zdDsKKworfTsKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGlzIGlzIHRoZSB0eXBpY2FsIEMrKyB0eXBlc2FmZSB3YXkgdG8gYWxsb3cgdG8gYXR0YWNoCisvLyB1c2VyIGRhdGEgdG8gYW4gaXRlbSBvZiBhIG1lbnUuIEl0cyBhc3N1bWVkIHRoYXQgdGhlIHVzZXIKKy8vIGRhdGEgYmVsb25ncyB0byBzb21lIGNsYXNzIFQuIFVzZSBUIGFzIHRlbXBsYXRlIGFyZ3VtZW50CisvLyB0byBjcmVhdGUgYSBVc2VySXRlbS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCit0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzVXNlckl0ZW0gOiBwdWJsaWMgTkN1cnNlc01lbnVJdGVtCit7CitwdWJsaWM6CisgIE5DdXJzZXNVc2VySXRlbSAoY29uc3QgY2hhciogcF9uYW1lLAorCQkgICBjb25zdCBjaGFyKiBwX2Rlc2NyaXB0ID0gTlVMTCwKKwkJICAgY29uc3QgVCogcF9Vc2VyRGF0YSAgICA9IFNUQVRJQ19DQVNUKFQqKSgwKSkKKyAgICA6IE5DdXJzZXNNZW51SXRlbSAocF9uYW1lLCBwX2Rlc2NyaXB0KSB7CisgICAgICBpZiAoaXRlbSkKKwlPbkVycm9yICg6OnNldF9pdGVtX3VzZXJwdHIgKGl0ZW0sIGNvbnN0X2Nhc3Q8dm9pZCAqPihyZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihwX1VzZXJEYXRhKSkpKTsKKyAgfQorCisgIHZpcnR1YWwgfk5DdXJzZXNVc2VySXRlbSgpIHt9CisKKyAgaW5saW5lIGNvbnN0IFQqIFVzZXJEYXRhICh2b2lkKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KDo6aXRlbV91c2VycHRyIChpdGVtKSk7CisgIH07CisKKyAgaW5saW5lIHZpcnR1YWwgdm9pZCBzZXRVc2VyRGF0YShjb25zdCBUKiBwX1VzZXJEYXRhKSB7CisgICAgaWYgKGl0ZW0pCisgICAgICBPbkVycm9yICg6OnNldF9pdGVtX3VzZXJwdHIgKGl0ZW0sIGNvbnN0X2Nhc3Q8dm9pZCAqPihyZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQgKj4ocF9Vc2VyRGF0YSkpKSk7CisgIH0KK307CisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhlIHNhbWUgbWVjaGFuaXNtIGlzIHVzZWQgdG8gYXR0YWNoIHVzZXIgZGF0YSB0byBhIG1lbnUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCit0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzVXNlck1lbnUgOiBwdWJsaWMgTkN1cnNlc01lbnUKK3sKK3Byb3RlY3RlZDoKKyAgTkN1cnNlc1VzZXJNZW51KCBpbnQgIG5saW5lcywKKwkJICAgaW50ICBuY29scywKKwkJICAgaW50ICBiZWdpbl95ID0gMCwKKwkJICAgaW50ICBiZWdpbl94ID0gMCwKKwkJICAgY29uc3QgVCogcF9Vc2VyRGF0YSA9IFNUQVRJQ19DQVNUKFQqKSgwKSkKKyAgICA6IE5DdXJzZXNNZW51KG5saW5lcyxuY29scyxiZWdpbl95LGJlZ2luX3gpIHsKKyAgICAgIGlmIChtZW51KQorCXNldF91c2VyIChjb25zdF9jYXN0PHZvaWQgKj4ocF9Vc2VyRGF0YSkpOworICB9CisKK3B1YmxpYzoKKyAgTkN1cnNlc1VzZXJNZW51IChOQ3Vyc2VzTWVudUl0ZW0gSXRlbXNbXSwKKwkJICAgY29uc3QgVCogcF9Vc2VyRGF0YSA9IFNUQVRJQ19DQVNUKFQqKSgwKSwKKwkJICAgYm9vbCB3aXRoX2ZyYW1lPUZBTFNFLAorCQkgICBib29sIGF1dG9EZWxldGVfSXRlbXM9RkFMU0UpCisgICAgOiBOQ3Vyc2VzTWVudSAoSXRlbXMsIHdpdGhfZnJhbWUsIGF1dG9EZWxldGVfSXRlbXMpIHsKKyAgICAgIGlmIChtZW51KQorCXNldF91c2VyIChjb25zdF9jYXN0PHZvaWQgKj4ocF9Vc2VyRGF0YSkpOworICB9OworCisgIE5DdXJzZXNVc2VyTWVudSAoTkN1cnNlc01lbnVJdGVtIEl0ZW1zW10sCisJCSAgIGludCBubGluZXMsCisJCSAgIGludCBuY29scywKKwkJICAgaW50IGJlZ2luX3kgPSAwLAorCQkgICBpbnQgYmVnaW5feCA9IDAsCisJCSAgIGNvbnN0IFQqIHBfVXNlckRhdGEgPSBTVEFUSUNfQ0FTVChUKikoMCksCisJCSAgIGJvb2wgd2l0aF9mcmFtZT1GQUxTRSkKKyAgICA6IE5DdXJzZXNNZW51IChJdGVtcywgbmxpbmVzLCBuY29scywgYmVnaW5feSwgYmVnaW5feCwgd2l0aF9mcmFtZSkgeworICAgICAgaWYgKG1lbnUpCisJc2V0X3VzZXIgKGNvbnN0X2Nhc3Q8dm9pZCAqPihwX1VzZXJEYXRhKSk7CisgIH07CisKKyAgdmlydHVhbCB+TkN1cnNlc1VzZXJNZW51KCkgeworICB9OworCisgIGlubGluZSBUKiBVc2VyRGF0YSAodm9pZCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFQqPihnZXRfdXNlciAoKSk7CisgIH07CisKKyAgaW5saW5lIHZpcnR1YWwgdm9pZCBzZXRVc2VyRGF0YSAoY29uc3QgVCogcF9Vc2VyRGF0YSkgeworICAgIGlmIChtZW51KQorICAgICAgc2V0X3VzZXIgKGNvbnN0X2Nhc3Q8dm9pZCAqPihwX1VzZXJEYXRhKSk7CisgIH0KK307CisKKyNlbmRpZiAvKiBOQ1VSU0VTX0NVUlNFU01fSF9pbmNsICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2N1cnNlc3AuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2VzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNjNkNmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2N1cnNlc3AuaApAQCAtMCwwICsxLDI2OCBAQAorLy8gKiBUaGlzIG1ha2VzIGVtYWNzIGhhcHB5IC0qLU1vZGU6IEMrKzstKi0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNywyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIEF1dGhvcjogSnVlcmdlbiBQZmVpZmVyLCAxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTkNVUlNFU19DVVJTRVNQX0hfaW5jbAorI2RlZmluZSBOQ1VSU0VTX0NVUlNFU1BfSF9pbmNsIDEKKworLy8gJElkOiBjdXJzZXNwLmgsdiAxLjI5IDIwMDgvMDgvMTYgMTc6MjA6MjMgdG9tIEV4cCAkCisKKyNpbmNsdWRlIDxjdXJzZXN3Lmg+CisKK2V4dGVybiAiQyIgeworIyAgaW5jbHVkZSA8cGFuZWwuaD4KK30KKworY2xhc3MgTkNVUlNFU19JTVBFWFAgTkN1cnNlc1BhbmVsCisgIDogcHVibGljIE5DdXJzZXNXaW5kb3cKK3sKK3Byb3RlY3RlZDoKKyAgUEFORUwgKnA7CisgIHN0YXRpYyBOQ3Vyc2VzUGFuZWwgKmR1bW15OworCitwcml2YXRlOgorICAvLyBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciB0aGUgcGFuZWwncyB1c2VyIGRhdGEgZmllbGQgdG8gbGluayB0aGUKKyAgLy8gUEFORUwqIHRvIHRoZSBDKysgb2JqZWN0IGFuZCB0byBwcm92aWRlIGV4dHJhIHNwYWNlIGZvciBhIHVzZXIgcG9pbnRlci4KKyAgdHlwZWRlZiBzdHJ1Y3QgeworICAgIHZvaWQqICAgICAgICAgICAgICAgbV91c2VyOyAgICAgIC8vIHRoZSBwb2ludGVyIGZvciB0aGUgdXNlcidzIGRhdGEKKyAgICBjb25zdCBOQ3Vyc2VzUGFuZWwqIG1fYmFjazsgICAgICAvLyBiYWNrd2FyZCBwb2ludGVyIHRvIEMrKyBvYmplY3QKKyAgICBjb25zdCBQQU5FTCogICAgICAgIG1fb3duZXI7ICAgICAvLyB0aGUgcGFuZWwgaXRzZWxmCisgIH0gVXNlckhvb2s7CisKKyAgaW5saW5lIFVzZXJIb29rICpVc2VyUG9pbnRlcigpCisgIHsKKyAgICBVc2VySG9vayogdXB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8VXNlckhvb2sqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCAqPig6OnBhbmVsX3VzZXJwdHIgKHApKSk7CisgICAgcmV0dXJuIHVwdHI7CisgIH0KKworICB2b2lkIGluaXQoKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBhbmVsIG9iamVjdAorCitwcm90ZWN0ZWQ6CisgIHZvaWQgc2V0X3VzZXIodm9pZCAqdXNlcikKKyAgeworICAgIFVzZXJIb29rKiB1cHRyID0gVXNlclBvaW50ZXIoKTsKKyAgICBpZiAodXB0ciAhPSAwICYmIHVwdHItPm1fYmFjaz09dGhpcyAmJiB1cHRyLT5tX293bmVyPT1wKSB7CisgICAgICB1cHRyLT5tX3VzZXIgPSB1c2VyOworICAgIH0KKyAgfQorICAvLyBTZXQgdGhlIHVzZXIgcG9pbnRlciBvZiB0aGUgcGFuZWwuCisKKyAgdm9pZCAqZ2V0X3VzZXIoKQorICB7CisgICAgVXNlckhvb2sqIHVwdHIgPSBVc2VyUG9pbnRlcigpOworICAgIHZvaWQgKnJlc3VsdCA9IDA7CisgICAgaWYgKHVwdHIgIT0gMCAmJiB1cHRyLT5tX2JhY2s9PXRoaXMgJiYgdXB0ci0+bV9vd25lcj09cCkKKyAgICAgIHJlc3VsdCA9IHVwdHItPm1fdXNlcjsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgdm9pZCBPbkVycm9yIChpbnQgZXJyKSBjb25zdCBUSFJPV1MoTkN1cnNlc1BhbmVsRXhjZXB0aW9uKQorICB7CisgICAgaWYgKGVycj09RVJSKQorICAgICAgVEhST1cobmV3IE5DdXJzZXNQYW5lbEV4Y2VwdGlvbiAodGhpcywgZXJyKSk7CisgIH0KKyAgLy8gSWYgZXJyIGlzIGVxdWFsIHRvIHRoZSBjdXJzZXMgZXJyb3IgaW5kaWNhdG9yIEVSUiwgYW4gZXJyb3IgaGFuZGxlcgorICAvLyBpcyBjYWxsZWQuCisKKyAgLy8gR2V0IGEga2V5c3Ryb2tlLiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbGxzIGdldGNoKCkKKyAgdmlydHVhbCBpbnQgZ2V0S2V5KHZvaWQpOworCitwdWJsaWM6CisgIE5DdXJzZXNQYW5lbChpbnQgbmxpbmVzLAorCSAgICAgICBpbnQgbmNvbHMsCisJICAgICAgIGludCBiZWdpbl95ID0gMCwKKwkgICAgICAgaW50IGJlZ2luX3ggPSAwKQorICAgIDogTkN1cnNlc1dpbmRvdyhubGluZXMsbmNvbHMsYmVnaW5feSxiZWdpbl94KSwgcCgwKQorICB7CisgICAgaW5pdCgpOworICB9CisgIC8vIENyZWF0ZSBhIHBhbmVsIHdpdGggdGhpcyBzaXplIHN0YXJ0aW5nIGF0IHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24uCisKKyAgTkN1cnNlc1BhbmVsKCkKKyAgICA6IE5DdXJzZXNXaW5kb3coOjpzdGRzY3IpLCBwKDApCisgIHsKKyAgICBpbml0KCk7CisgIH0KKyAgLy8gVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIHRoZSBkZWZhdWx0IFBhbmVsIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgLy8gOjpzdGRzY3Igd2luZG93CisKKyAgTkN1cnNlc1BhbmVsJiBvcGVyYXRvcj0oY29uc3QgTkN1cnNlc1BhbmVsJiByaHMpCisgIHsKKyAgICBpZiAodGhpcyAhPSAmcmhzKSB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICAgIE5DdXJzZXNXaW5kb3c6Om9wZXJhdG9yPShyaHMpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBOQ3Vyc2VzUGFuZWwoY29uc3QgTkN1cnNlc1BhbmVsJiByaHMpCisgICAgOiBOQ3Vyc2VzV2luZG93KHJocyksCisgICAgICBwKHJocy5wKQorICB7CisgIH0KKworICB2aXJ0dWFsIH5OQ3Vyc2VzUGFuZWwoKTsKKworICAvLyBiYXNpYyBtYW5pcHVsYXRpb24KKyAgaW5saW5lIHZvaWQgaGlkZSgpCisgIHsKKyAgICBPbkVycm9yICg6OmhpZGVfcGFuZWwocCkpOworICB9CisgIC8vIEhpZGUgdGhlIHBhbmVsLiBJdCBzdGF5cyBpbiB0aGUgc3RhY2sgYnV0IGJlY29tZXMgaW52aXNpYmxlLgorCisgIGlubGluZSB2b2lkIHNob3coKQorICB7CisgICAgT25FcnJvciAoOjpzaG93X3BhbmVsKHApKTsKKyAgfQorICAvLyBTaG93IHRoZSBwYW5lbCwgaS5lLiBtYWtlIGl0IHZpc2libGUuCisKKyAgaW5saW5lIHZvaWQgdG9wKCkKKyAgeworICAgIE9uRXJyb3IgKDo6dG9wX3BhbmVsKHApKTsKKyAgfQorICAvLyBNYWtlIHRoaXMgcGFuZWwgdGhlIHRvcCBwYW5lbCBpbiB0aGUgc3RhY2suCisKKyAgaW5saW5lIHZvaWQgYm90dG9tKCkKKyAgeworICAgIE9uRXJyb3IgKDo6Ym90dG9tX3BhbmVsKHApKTsKKyAgfQorICAvLyBNYWtlIHRoaXMgcGFuZWwgdGhlIGJvdHRvbSBwYW5lbCBpbiB0aGUgc3RhY2suCisgIC8vIE4uQi46IFRoZSBwYW5lbCBhc3NvY2lhdGVkIHdpdGggOjpzdGRzY3IgaXMgYWx3YXlzIG9uIHRoZSBib3R0b20uIFNvCisgIC8vIGFjdHVhbGx5IGJvdHRvbSgpIG1ha2VzIHRoZSBwYW5lbCB0aGUgZmlyc3QgYWJvdmUgOjpzdGRzY3IuCisKKyAgdmlydHVhbCBpbnQgbXZ3aW4oaW50IHksIGludCB4KQorICB7CisgICAgT25FcnJvcig6Om1vdmVfcGFuZWwocCwgeSwgeCkpOworICAgIHJldHVybiBPSzsKKyAgfQorCisgIGlubGluZSBib29sIGhpZGRlbigpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gKDo6cGFuZWxfaGlkZGVuIChwKSA/IFRSVUUgOiBGQUxTRSk7CisgIH0KKyAgLy8gUmV0dXJuIFRSVUUgaWYgdGhlIHBhbmVsIGlzIGhpZGRlbiwgRkFMU0Ugb3RoZXJ3aXNlLgorCisvKiBUaGUgZnVuY3Rpb25zIHBhbmVsX2Fib3ZlKCkgYW5kIHBhbmVsX2JlbG93KCkgYXJlIG5vdCByZWZsZWN0ZWQgaW4KKyAgIHRoZSBOQ3Vyc2VzUGFuZWwgY2xhc3MuIFRoZSByZWFzb24gZm9yIHRoaXMgaXMsIHRoYXQgd2UgY2Fubm90CisgICBhc3N1bWUgdGhhdCBhIHBhbmVsIHJldHJpZXZlZCBieSB0aG9zZSBvcGVyYXRpb25zIGlzIG9uZSB3cmFwcGVkCisgICBieSBhIEMrKyBjbGFzcy4gQWx0aG91Z2ggdGhpcyBzaXR1YXRpb24gbWlnaHQgYmUgaGFuZGxlZCwgd2UgYWxzbworICAgbmVlZCBhIHJldmVyc2UgbWFwcGluZyBmcm9tIFBBTkVMIHRvIE5DdXJzZXNQYW5lbCB3aGljaCBuZWVkcyBzb21lCisgICByZWRlc2lnbiBvZiB0aGUgbG93IGxldmVsIHN0dWZmLiBBdCB0aGUgbW9tZW50LCB3ZSBkZWZpbmUgdGhlbSBpbiB0aGUKKyAgIGludGVyZmFjZSBidXQgdGhleSB3aWxsIGFsd2F5cyBwcm9kdWNlIGFuIGVycm9yLiAqLworICBpbmxpbmUgTkN1cnNlc1BhbmVsJiBhYm92ZSgpIGNvbnN0CisgIHsKKyAgICBPbkVycm9yKEVSUik7CisgICAgcmV0dXJuICpkdW1teTsKKyAgfQorCisgIGlubGluZSBOQ3Vyc2VzUGFuZWwmIGJlbG93KCkgY29uc3QKKyAgeworICAgIE9uRXJyb3IoRVJSKTsKKyAgICByZXR1cm4gKmR1bW15OworICB9CisKKyAgLy8gVGhvc2UgdHdvIGFyZSByZXdyaXRlcyBvZiB0aGUgY29ycmVzcG9uZGluZyB2aXJ0dWFsIG1lbWJlcnMgb2YKKyAgLy8gTkN1cnNlc1dpbmRvdworICB2aXJ0dWFsIGludCByZWZyZXNoKCk7CisgIC8vIFByb3BhZ2F0ZSBhbGwgcGFuZWwgY2hhbmdlcyB0byB0aGUgdmlydHVhbCBzY3JlZW4gYW5kIHVwZGF0ZSB0aGUKKyAgLy8gcGh5c2ljYWwgc2NyZWVuLgorCisgIHZpcnR1YWwgaW50IG5vdXRyZWZyZXNoKCk7CisgIC8vIFByb3BhZ2F0ZSBhbGwgcGFuZWwgY2hhbmdlcyB0byB0aGUgdmlydHVhbCBzY3JlZW4uCisKKyAgc3RhdGljIHZvaWQgcmVkcmF3KCk7CisgIC8vIFJlZHJhdyBhbGwgcGFuZWxzLgorCisgIC8vIGRlY29yYXRpb25zCisgIHZpcnR1YWwgdm9pZCBmcmFtZShjb25zdCBjaGFyKiB0aXRsZT1OVUxMLAorCQkgICAgIGNvbnN0IGNoYXIqIGJ0aXRsZT1OVUxMKTsKKyAgLy8gUHV0IGEgZnJhbWUgYXJvdW5kIHRoZSBwYW5lbCBhbmQgcHV0IHRoZSB0aXRsZSBjZW50ZXJlZCBpbiB0aGUgdG9wIGxpbmUKKyAgLy8gYW5kIGJ0aXRsZSBpbiB0aGUgYm90dG9tIGxpbmUuCisKKyAgdmlydHVhbCB2b2lkIGJvbGRmcmFtZShjb25zdCBjaGFyKiB0aXRsZT1OVUxMLAorCQkJIGNvbnN0IGNoYXIqIGJ0aXRsZT1OVUxMKTsKKyAgLy8gU2FtZSBhcyBmcmFtZSgpLCBidXQgdXNlIGhpZ2hsaWdodGVkIGF0dHJpYnV0ZXMuCisKKyAgdmlydHVhbCB2b2lkIGxhYmVsKGNvbnN0IGNoYXIqIHRvcExhYmVsLAorCQkgICAgIGNvbnN0IGNoYXIqIGJvdHRvbUxhYmVsKTsKKyAgLy8gUHV0IHRoZSB0aXRsZSBjZW50ZXJlZCBpbiB0aGUgdG9wIGxpbmUgYW5kIGJ0aXRsZSBpbiB0aGUgYm90dG9tIGxpbmUuCisKKyAgdmlydHVhbCB2b2lkIGNlbnRlcnRleHQoaW50IHJvdyxjb25zdCBjaGFyKiBsYWJlbCk7CisgIC8vIFB1dCB0aGUgbGFiZWwgdGV4dCBjZW50ZXJlZCBpbiB0aGUgc3BlY2lmaWVkIHJvdy4KK307CisKKy8qIFdlIHVzZSB0ZW1wbGF0ZXMgdG8gcHJvdmlkZSBhIHR5cGVzYWZlIG1lY2hhbmlzbSB0byBhc3NvY2lhdGUKKyAqIHVzZXIgZGF0YSB3aXRoIGEgcGFuZWwuIEEgTkN1cnNlc1VzZXJQYW5lbDxUPiBpcyBhIHBhbmVsCisgKiBhc3NvY2lhdGVkIHdpdGggc29tZSB1c2VyIGRhdGEgb2YgdHlwZSBULgorICovCit0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBOQ3Vyc2VzVXNlclBhbmVsIDogcHVibGljIE5DdXJzZXNQYW5lbAoreworcHVibGljOgorICBOQ3Vyc2VzVXNlclBhbmVsIChpbnQgbmxpbmVzLAorCQkgICAgaW50IG5jb2xzLAorCQkgICAgaW50IGJlZ2luX3kgPSAwLAorCQkgICAgaW50IGJlZ2luX3ggPSAwLAorCQkgICAgY29uc3QgVCogcF9Vc2VyRGF0YSA9IFNUQVRJQ19DQVNUKFQqKSgwKSkKKyAgICA6IE5DdXJzZXNQYW5lbCAobmxpbmVzLCBuY29scywgYmVnaW5feSwgYmVnaW5feCkKKyAgeworICAgICAgaWYgKHApCisJc2V0X3VzZXIgKGNvbnN0X2Nhc3Q8dm9pZCAqPihwX1VzZXJEYXRhKSk7CisgIH07CisgIC8vIFRoaXMgY3JlYXRlcyBhbiB1c2VyIHBhbmVsIG9mIHRoZSByZXF1ZXN0ZWQgc2l6ZSB3aXRoIGFzc29jaWF0ZWQKKyAgLy8gdXNlciBkYXRhIHBvaW50ZWQgdG8gYnkgcF9Vc2VyRGF0YS4KKworICBOQ3Vyc2VzVXNlclBhbmVsKGNvbnN0IFQqIHBfVXNlckRhdGEgPSBTVEFUSUNfQ0FTVChUKikoMCkpIDogTkN1cnNlc1BhbmVsKCkKKyAgeworICAgIGlmIChwKQorICAgICAgc2V0X3VzZXIoY29uc3RfY2FzdDx2b2lkICo+KHBfVXNlckRhdGEpKTsKKyAgfTsKKyAgLy8gVGhpcyBjcmVhdGVzIGFuIHVzZXIgcGFuZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSA6OnN0ZHNjciBhbmQgdXNlciBkYXRhCisgIC8vIHBvaW50ZWQgdG8gYnkgcF9Vc2VyRGF0YS4KKworICB2aXJ0dWFsIH5OQ3Vyc2VzVXNlclBhbmVsKCkge307CisKKyAgVCogVXNlckRhdGEgKHZvaWQpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUKj4oZ2V0X3VzZXIgKCkpOworICB9OworICAvLyBSZXRyaWV2ZSB0aGUgdXNlciBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFuZWwuCisKKyAgdmlydHVhbCB2b2lkIHNldFVzZXJEYXRhIChjb25zdCBUKiBwX1VzZXJEYXRhKQorICB7CisgICAgaWYgKHApCisgICAgICBzZXRfdXNlciAoY29uc3RfY2FzdDx2b2lkICo+KHBfVXNlckRhdGEpKTsKKyAgfQorICAvLyBBc3NvY2lhdGUgdGhlIHVzZXIgcGFuZWwgd2l0aCB0aGUgdXNlciBkYXRhIHBvaW50ZWQgdG8gYnkgcF9Vc2VyRGF0YS4KK307CisKKyNlbmRpZiAvKiBOQ1VSU0VTX0NVUlNFU1BfSF9pbmNsICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2N1cnNlc3cuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2Vzdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZTkyMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2N1cnNlc3cuaApAQCAtMCwwICsxLDE1NTYgQEAKKy8vICogVGhpcyBtYWtlcyBlbWFjcyBoYXBweSAtKi1Nb2RlOiBDKys7LSotCisvLyB2aWxlOmNwcG1vZGUKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNywyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTkNVUlNFU19DVVJTRVNXX0hfaW5jbAorI2RlZmluZSBOQ1VSU0VTX0NVUlNFU1dfSF9pbmNsIDEKKworLy8gJElkOiBjdXJzZXN3LmgsdiAxLjQ4IDIwMDgvMDEvMTkgMjE6MDk6MTAgdG9tIEV4cCAkCisKKyNpbmNsdWRlIDxldGlwLmg+CisKK2V4dGVybiAiQyIgeworIyAgaW5jbHVkZSAgIDxjdXJzZXMuaD4KK30KKworLyogU0NPIDMuMnY0IGN1cnNlcy5oIGluY2x1ZGVzIHRlcm0uaCwgd2hpY2ggZGVmaW5lcyBsaW5lcyBhcyBhIG1hY3JvLgorICAgVW5kZWZpbmUgaXQgaGVyZSwgYmVjYXVzZSBOQ3Vyc2VzV2luZG93IHVzZXMgbGluZXMgYXMgYSBtZXRob2QuICAqLworI3VuZGVmIGxpbmVzCisKKy8qICJDb252ZXJ0IiBtYWNyb3MgdG8gaW5saW5lcy4gV2UnbGwgZGVmaW5lIGl0IGFzIGFub3RoZXIgc3ltYm9sIHRvIGF2b2lkCisgKiBjb25mbGljdCB3aXRoIGxpYnJhcnkgc3ltYm9scy4KKyAqLworI3VuZGVmIFVOREVGCisjZGVmaW5lIFVOREVGKG5hbWUpIENVUl8gIyNuYW1lCisKKyNpZmRlZiBhZGRjaAoraW5saW5lIGludCBVTkRFRihhZGRjaCkoY2h0eXBlIGNoKSAgeyByZXR1cm4gYWRkY2goY2gpOyB9CisjdW5kZWYgYWRkY2gKKyNkZWZpbmUgYWRkY2ggVU5ERUYoYWRkY2gpCisjZW5kaWYKKworI2lmZGVmIGFkZGNoc3RyCitpbmxpbmUgaW50IFVOREVGKGFkZGNoc3RyKShjaHR5cGUgKmF0KSB7IHJldHVybiBhZGRjaHN0cihhdCk7IH0KKyN1bmRlZiBhZGRjaHN0cgorI2RlZmluZSBhZGRjaHN0ciBVTkRFRihhZGRjaHN0cikKKyNlbmRpZgorCisjaWZkZWYgYWRkbnN0cgoraW5saW5lIGludCBVTkRFRihhZGRuc3RyKShjb25zdCBjaGFyICpzdHIsIGludCBuKQoreyByZXR1cm4gYWRkbnN0cihzdHIsIG4pOyB9CisjdW5kZWYgYWRkbnN0cgorI2RlZmluZSBhZGRuc3RyIFVOREVGKGFkZG5zdHIpCisjZW5kaWYKKworI2lmZGVmIGFkZHN0cgoraW5saW5lIGludCBVTkRFRihhZGRzdHIpKGNvbnN0IGNoYXIgKiBzdHIpICB7IHJldHVybiBhZGRzdHIoc3RyKTsgfQorI3VuZGVmIGFkZHN0cgorI2RlZmluZSBhZGRzdHIgVU5ERUYoYWRkc3RyKQorI2VuZGlmCisKKyNpZmRlZiBhdHRyb2ZmCitpbmxpbmUgaW50IFVOREVGKGF0dHJvZmYpKGNodHlwZSBhdCkgeyByZXR1cm4gYXR0cm9mZihhdCk7IH0KKyN1bmRlZiBhdHRyb2ZmCisjZGVmaW5lIGF0dHJvZmYgVU5ERUYoYXR0cm9mZikKKyNlbmRpZgorCisjaWZkZWYgYXR0cm9uCitpbmxpbmUgaW50IFVOREVGKGF0dHJvbikoY2h0eXBlIGF0KSB7IHJldHVybiBhdHRyb24oYXQpOyB9CisjdW5kZWYgYXR0cm9uCisjZGVmaW5lIGF0dHJvbiBVTkRFRihhdHRyb24pCisjZW5kaWYKKworI2lmZGVmIGF0dHJzZXQKK2lubGluZSBjaHR5cGUgVU5ERUYoYXR0cnNldCkoY2h0eXBlIGF0KSB7IHJldHVybiBhdHRyc2V0KGF0KTsgfQorI3VuZGVmIGF0dHJzZXQKKyNkZWZpbmUgYXR0cnNldCBVTkRFRihhdHRyc2V0KQorI2VuZGlmCisKKyNpZmRlZiBia2dkCitpbmxpbmUgaW50IFVOREVGKGJrZ2QpKGNodHlwZSBjaCkgeyByZXR1cm4gYmtnZChjaCk7IH0KKyN1bmRlZiBia2dkCisjZGVmaW5lIGJrZ2QgVU5ERUYoYmtnZCkKKyNlbmRpZgorCisjaWZkZWYgYmtnZHNldAoraW5saW5lIHZvaWQgVU5ERUYoYmtnZHNldCkoY2h0eXBlIGNoKSB7IGJrZ2RzZXQoY2gpOyB9CisjdW5kZWYgYmtnZHNldAorI2RlZmluZSBia2dkc2V0IFVOREVGKGJrZ2RzZXQpCisjZW5kaWYKKworI2lmZGVmIGJvcmRlcgoraW5saW5lIGludCBVTkRFRihib3JkZXIpKGNodHlwZSBscywgY2h0eXBlIHJzLCBjaHR5cGUgdHMsIGNodHlwZSBicywgY2h0eXBlIHRsLCBjaHR5cGUgdHIsIGNodHlwZSBibCwgY2h0eXBlIGJyKQoreyByZXR1cm4gYm9yZGVyKGxzLCBycywgdHMsIGJzLCB0bCwgdHIsIGJsLCBicik7IH0KKyN1bmRlZiBib3JkZXIKKyNkZWZpbmUgYm9yZGVyIFVOREVGKGJvcmRlcikKKyNlbmRpZgorCisjaWZkZWYgYm94CitpbmxpbmUgaW50IFVOREVGKGJveCkoV0lORE9XICp3aW4sIGludCB2LCBpbnQgaCkgeyByZXR1cm4gYm94KHdpbiwgdiwgaCk7IH0KKyN1bmRlZiBib3gKKyNkZWZpbmUgYm94IFVOREVGKGJveCkKKyNlbmRpZgorCisjaWZkZWYgY2hnYXQKK2lubGluZSBpbnQgVU5ERUYoY2hnYXQpKGludCBuLCBhdHRyX3QgYXR0ciwgc2hvcnQgY29sb3IsIGNvbnN0IHZvaWQgKm9wdHMpIHsKKyAgcmV0dXJuIGNoZ2F0KG4sIGF0dHIsIGNvbG9yLCBvcHRzKTsgfQorI3VuZGVmIGNoZ2F0CisjZGVmaW5lIGNoZ2F0IFVOREVGKGNoZ2F0KQorI2VuZGlmCisKKyNpZmRlZiBjbGVhcgoraW5saW5lIGludCBVTkRFRihjbGVhcikoKSAgeyByZXR1cm4gY2xlYXIoKTsgfQorI3VuZGVmIGNsZWFyCisjZGVmaW5lIGNsZWFyIFVOREVGKGNsZWFyKQorI2VuZGlmCisKKyNpZmRlZiBjbGVhcm9rCitpbmxpbmUgaW50IFVOREVGKGNsZWFyb2spKFdJTkRPVyogd2luLCBib29sIGJmKSAgeyByZXR1cm4gY2xlYXJvayh3aW4sIGJmKTsgfQorI3VuZGVmIGNsZWFyb2sKKyNkZWZpbmUgY2xlYXJvayBVTkRFRihjbGVhcm9rKQorI2Vsc2UKK2V4dGVybiAiQyIgTkNVUlNFU19JTVBFWFAgaW50IE5DVVJTRVNfQVBJIGNsZWFyb2soV0lORE9XKiwgYm9vbCk7CisjZW5kaWYKKworI2lmZGVmIGNscnRvYm90CitpbmxpbmUgaW50IFVOREVGKGNscnRvYm90KSgpICB7IHJldHVybiBjbHJ0b2JvdCgpOyB9CisjdW5kZWYgY2xydG9ib3QKKyNkZWZpbmUgY2xydG9ib3QgVU5ERUYoY2xydG9ib3QpCisjZW5kaWYKKworI2lmZGVmIGNscnRvZW9sCitpbmxpbmUgaW50IFVOREVGKGNscnRvZW9sKSgpICB7IHJldHVybiBjbHJ0b2VvbCgpOyB9CisjdW5kZWYgY2xydG9lb2wKKyNkZWZpbmUgY2xydG9lb2wgVU5ERUYoY2xydG9lb2wpCisjZW5kaWYKKworI2lmZGVmIGNvbG9yX3NldAoraW5saW5lIGNodHlwZSBVTkRFRihjb2xvcl9zZXQpKHNob3J0IHAsIHZvaWQqIG9wdHMpIHsgcmV0dXJuIGNvbG9yX3NldChwLCBvcHRzKTsgfQorI3VuZGVmIGNvbG9yX3NldAorI2RlZmluZSBjb2xvcl9zZXQgVU5ERUYoY29sb3Jfc2V0KQorI2VuZGlmCisKKyNpZmRlZiBjcm1vZGUKK2lubGluZSBpbnQgVU5ERUYoY3Jtb2RlKSh2b2lkKSB7IHJldHVybiBjcm1vZGUoKTsgfQorI3VuZGVmIGNybW9kZQorI2RlZmluZSBjcm1vZGUgVU5ERUYoY3Jtb2RlKQorI2VuZGlmCisKKyNpZmRlZiBkZWxjaAoraW5saW5lIGludCBVTkRFRihkZWxjaCkoKSAgeyByZXR1cm4gZGVsY2goKTsgfQorI3VuZGVmIGRlbGNoCisjZGVmaW5lIGRlbGNoIFVOREVGKGRlbGNoKQorI2VuZGlmCisKKyNpZmRlZiBkZWxldGVsbgoraW5saW5lIGludCBVTkRFRihkZWxldGVsbikoKSAgeyByZXR1cm4gZGVsZXRlbG4oKTsgfQorI3VuZGVmIGRlbGV0ZWxuCisjZGVmaW5lIGRlbGV0ZWxuIFVOREVGKGRlbGV0ZWxuKQorI2VuZGlmCisKKyNpZmRlZiBlY2hvY2hhcgoraW5saW5lIGludCBVTkRFRihlY2hvY2hhcikoY2h0eXBlIGNoKSAgeyByZXR1cm4gZWNob2NoYXIoY2gpOyB9CisjdW5kZWYgZWNob2NoYXIKKyNkZWZpbmUgZWNob2NoYXIgVU5ERUYoZWNob2NoYXIpCisjZW5kaWYKKworI2lmZGVmIGVyYXNlCitpbmxpbmUgaW50IFVOREVGKGVyYXNlKSgpICB7IHJldHVybiBlcmFzZSgpOyB9CisjdW5kZWYgZXJhc2UKKyNkZWZpbmUgZXJhc2UgVU5ERUYoZXJhc2UpCisjZW5kaWYKKworI2lmZGVmIGZpeHRlcm0KK2lubGluZSBpbnQgVU5ERUYoZml4dGVybSkodm9pZCkgeyByZXR1cm4gZml4dGVybSgpOyB9CisjdW5kZWYgZml4dGVybQorI2RlZmluZSBmaXh0ZXJtIFVOREVGKGZpeHRlcm0pCisjZW5kaWYKKworI2lmZGVmIGZsdXNob2sKK2lubGluZSBpbnQgVU5ERUYoZmx1c2hvaykoV0lORE9XKiBfd2luLCBib29sIF9iZikgIHsKKyAgcmV0dXJuIGZsdXNob2soX3dpbiwgX2JmKTsgfQorI3VuZGVmIGZsdXNob2sKKyNkZWZpbmUgZmx1c2hvayBVTkRFRihmbHVzaG9rKQorI2Vsc2UKKyNkZWZpbmUgX25vX2ZsdXNob2sKKyNlbmRpZgorCisjaWZkZWYgZ2V0YXR0cnMKK2lubGluZSBpbnQgVU5ERUYoZ2V0YXR0cnMpKFdJTkRPVyAqd2luKSB7IHJldHVybiBnZXRhdHRycyh3aW4pOyB9CisjdW5kZWYgZ2V0YXR0cnMKKyNkZWZpbmUgZ2V0YXR0cnMgVU5ERUYoZ2V0YXR0cnMpCisjZW5kaWYKKworI2lmZGVmIGdldGJlZ3l4CitpbmxpbmUgdm9pZCBVTkRFRihnZXRiZWd5eCkoV0lORE9XKiB3aW4sIGludCYgeSwgaW50JiB4KSB7IGdldGJlZ3l4KHdpbiwgeSwgeCk7IH0KKyN1bmRlZiBnZXRiZWd5eAorI2RlZmluZSBnZXRiZWd5eCBVTkRFRihnZXRiZWd5eCkKKyNlbmRpZgorCisjaWZkZWYgZ2V0YmtnZAoraW5saW5lIGNodHlwZSBVTkRFRihnZXRia2dkKShjb25zdCBXSU5ET1cgKndpbikgeyByZXR1cm4gZ2V0YmtnZCh3aW4pOyB9CisjdW5kZWYgZ2V0YmtnZAorI2RlZmluZSBnZXRia2dkIFVOREVGKGdldGJrZ2QpCisjZW5kaWYKKworI2lmZGVmIGdldGNoCitpbmxpbmUgaW50IFVOREVGKGdldGNoKSgpICB7IHJldHVybiBnZXRjaCgpOyB9CisjdW5kZWYgZ2V0Y2gKKyNkZWZpbmUgZ2V0Y2ggVU5ERUYoZ2V0Y2gpCisjZW5kaWYKKworI2lmZGVmIGdldG1heHl4CitpbmxpbmUgdm9pZCBVTkRFRihnZXRtYXh5eCkoV0lORE9XKiB3aW4sIGludCYgeSwgaW50JiB4KSB7IGdldG1heHl4KHdpbiwgeSwgeCk7IH0KKyN1bmRlZiBnZXRtYXh5eAorI2RlZmluZSBnZXRtYXh5eCBVTkRFRihnZXRtYXh5eCkKKyNlbmRpZgorCisjaWZkZWYgZ2V0bnN0cgoraW5saW5lIGludCBVTkRFRihnZXRuc3RyKShjaGFyICpfc3RyLCBpbnQgbikgIHsgcmV0dXJuIGdldG5zdHIoX3N0ciwgbik7IH0KKyN1bmRlZiBnZXRuc3RyCisjZGVmaW5lIGdldG5zdHIgVU5ERUYoZ2V0bnN0cikKKyNlbmRpZgorCisjaWZkZWYgZ2V0cGFyeXgKK2lubGluZSB2b2lkIFVOREVGKGdldHBhcnl4KShXSU5ET1cqIHdpbiwgaW50JiB5LCBpbnQmIHgpIHsgZ2V0cGFyeXgod2luLCB5LCB4KTsgfQorI3VuZGVmIGdldHBhcnl4CisjZGVmaW5lIGdldHBhcnl4IFVOREVGKGdldHBhcnl4KQorI2VuZGlmCisKKyNpZmRlZiBnZXRzdHIKK2lubGluZSBpbnQgVU5ERUYoZ2V0c3RyKShjaGFyICpfc3RyKSAgeyByZXR1cm4gZ2V0c3RyKF9zdHIpOyB9CisjdW5kZWYgZ2V0c3RyCisjZGVmaW5lIGdldHN0ciBVTkRFRihnZXRzdHIpCisjZW5kaWYKKworI2lmZGVmIGdldHl4CitpbmxpbmUgdm9pZCBVTkRFRihnZXR5eCkoY29uc3QgV0lORE9XKiB3aW4sIGludCYgeSwgaW50JiB4KSB7CisgIGdldHl4KHdpbiwgeSwgeCk7IH0KKyN1bmRlZiBnZXR5eAorI2RlZmluZSBnZXR5eCBVTkRFRihnZXR5eCkKKyNlbmRpZgorCisjaWZkZWYgaGxpbmUKK2lubGluZSBpbnQgVU5ERUYoaGxpbmUpKGNodHlwZSBjaCwgaW50IG4pIHsgcmV0dXJuIGhsaW5lKGNoLCBuKTsgfQorI3VuZGVmIGhsaW5lCisjZGVmaW5lIGhsaW5lIFVOREVGKGhsaW5lKQorI2VuZGlmCisKKyNpZmRlZiBpbmNoCitpbmxpbmUgY2h0eXBlIFVOREVGKGluY2gpKCkgIHsgcmV0dXJuIGluY2goKTsgfQorI3VuZGVmIGluY2gKKyNkZWZpbmUgaW5jaCBVTkRFRihpbmNoKQorI2VuZGlmCisKKyNpZmRlZiBpbmNoc3RyCitpbmxpbmUgaW50IFVOREVGKGluY2hzdHIpKGNodHlwZSAqc3RyKSAgeyByZXR1cm4gaW5jaHN0cihzdHIpOyB9CisjdW5kZWYgaW5jaHN0cgorI2RlZmluZSBpbmNoc3RyIFVOREVGKGluY2hzdHIpCisjZW5kaWYKKworI2lmZGVmIGlubnN0cgoraW5saW5lIGludCBVTkRFRihpbm5zdHIpKGNoYXIgKl9zdHIsIGludCBuKSAgeyByZXR1cm4gaW5uc3RyKF9zdHIsIG4pOyB9CisjdW5kZWYgaW5uc3RyCisjZGVmaW5lIGlubnN0ciBVTkRFRihpbm5zdHIpCisjZW5kaWYKKworI2lmZGVmIGluc2NoCitpbmxpbmUgaW50IFVOREVGKGluc2NoKShjaHR5cGUgYykgIHsgcmV0dXJuIGluc2NoKGMpOyB9CisjdW5kZWYgaW5zY2gKKyNkZWZpbmUgaW5zY2ggVU5ERUYoaW5zY2gpCisjZW5kaWYKKworI2lmZGVmIGluc2RlbGxuCitpbmxpbmUgaW50IFVOREVGKGluc2RlbGxuKShpbnQgbikgIHsgcmV0dXJuIGluc2RlbGxuKG4pOyB9CisjdW5kZWYgaW5zZGVsbG4KKyNkZWZpbmUgaW5zZGVsbG4gVU5ERUYoaW5zZGVsbG4pCisjZW5kaWYKKworI2lmZGVmIGluc2VydGxuCitpbmxpbmUgaW50IFVOREVGKGluc2VydGxuKSgpICB7IHJldHVybiBpbnNlcnRsbigpOyB9CisjdW5kZWYgaW5zZXJ0bG4KKyNkZWZpbmUgaW5zZXJ0bG4gVU5ERUYoaW5zZXJ0bG4pCisjZW5kaWYKKworI2lmZGVmIGluc25zdHIKK2lubGluZSBpbnQgVU5ERUYoaW5zbnN0cikoY29uc3QgY2hhciAqX3N0ciwgaW50IG4pICB7CisgIHJldHVybiBpbnNuc3RyKF9zdHIsIG4pOyB9CisjdW5kZWYgaW5zbnN0cgorI2RlZmluZSBpbnNuc3RyIFVOREVGKGluc25zdHIpCisjZW5kaWYKKworI2lmZGVmIGluc3N0cgoraW5saW5lIGludCBVTkRFRihpbnNzdHIpKGNvbnN0IGNoYXIgKl9zdHIpICB7CisgIHJldHVybiBpbnNzdHIoX3N0cik7IH0KKyN1bmRlZiBpbnNzdHIKKyNkZWZpbmUgaW5zc3RyIFVOREVGKGluc3N0cikKKyNlbmRpZgorCisjaWZkZWYgaW5zdHIKK2lubGluZSBpbnQgVU5ERUYoaW5zdHIpKGNoYXIgKl9zdHIpICB7IHJldHVybiBpbnN0cihfc3RyKTsgfQorI3VuZGVmIGluc3RyCisjZGVmaW5lIGluc3RyIFVOREVGKGluc3RyKQorI2VuZGlmCisKKyNpZmRlZiBpbnRyZmx1c2gKK2lubGluZSB2b2lkIFVOREVGKGludHJmbHVzaCkoV0lORE9XICp3aW4sIGJvb2wgYmYpIHsgaW50cmZsdXNoKCk7IH0KKyN1bmRlZiBpbnRyZmx1c2gKKyNkZWZpbmUgaW50cmZsdXNoIFVOREVGKGludHJmbHVzaCkKKyNlbmRpZgorCisjaWZkZWYgbGVhdmVvaworaW5saW5lIGludCBVTkRFRihsZWF2ZW9rKShXSU5ET1cqIHdpbiwgYm9vbCBiZikgIHsgcmV0dXJuIGxlYXZlb2sod2luLCBiZik7IH0KKyN1bmRlZiBsZWF2ZW9rCisjZGVmaW5lIGxlYXZlb2sgVU5ERUYobGVhdmVvaykKKyNlbHNlCitleHRlcm4gIkMiIE5DVVJTRVNfSU1QRVhQIGludCBOQ1VSU0VTX0FQSSBsZWF2ZW9rKFdJTkRPVyogd2luLCBib29sIGJmKTsKKyNlbmRpZgorCisjaWZkZWYgbW92ZQoraW5saW5lIGludCBVTkRFRihtb3ZlKShpbnQgeCwgaW50IHkpICB7IHJldHVybiBtb3ZlKHgsIHkpOyB9CisjdW5kZWYgbW92ZQorI2RlZmluZSBtb3ZlIFVOREVGKG1vdmUpCisjZW5kaWYKKworI2lmZGVmIG12YWRkY2gKK2lubGluZSBpbnQgVU5ERUYobXZhZGRjaCkoaW50IHksIGludCB4LCBjaHR5cGUgY2gpCit7IHJldHVybiBtdmFkZGNoKHksIHgsIGNoKTsgfQorI3VuZGVmIG12YWRkY2gKKyNkZWZpbmUgbXZhZGRjaCBVTkRFRihtdmFkZGNoKQorI2VuZGlmCisKKyNpZmRlZiBtdmFkZG5zdHIKK2lubGluZSBpbnQgVU5ERUYobXZhZGRuc3RyKShpbnQgeSwgaW50IHgsIGNvbnN0IGNoYXIgKnN0ciwgaW50IG4pCit7IHJldHVybiBtdmFkZG5zdHIoeSwgeCwgc3RyLCBuKTsgfQorI3VuZGVmIG12YWRkbnN0cgorI2RlZmluZSBtdmFkZG5zdHIgVU5ERUYobXZhZGRuc3RyKQorI2VuZGlmCisKKyNpZmRlZiBtdmFkZHN0cgoraW5saW5lIGludCBVTkRFRihtdmFkZHN0cikoaW50IHksIGludCB4LCBjb25zdCBjaGFyICogc3RyKQoreyByZXR1cm4gbXZhZGRzdHIoeSwgeCwgc3RyKTsgfQorI3VuZGVmIG12YWRkc3RyCisjZGVmaW5lIG12YWRkc3RyIFVOREVGKG12YWRkc3RyKQorI2VuZGlmCisKKyNpZmRlZiBtdmNoZ2F0CitpbmxpbmUgaW50IFVOREVGKG12Y2hnYXQpKGludCB5LCBpbnQgeCwgaW50IG4sCisJCQkgIGF0dHJfdCBhdHRyLCBzaG9ydCBjb2xvciwgY29uc3Qgdm9pZCAqb3B0cykgeworICByZXR1cm4gbXZjaGdhdCh5LCB4LCBuLCBhdHRyLCBjb2xvciwgb3B0cyk7IH0KKyN1bmRlZiBtdmNoZ2F0CisjZGVmaW5lIG12Y2hnYXQgVU5ERUYobXZjaGdhdCkKKyNlbmRpZgorCisjaWZkZWYgbXZkZWxjaAoraW5saW5lIGludCBVTkRFRihtdmRlbGNoKShpbnQgeSwgaW50IHgpIHsgcmV0dXJuIG12ZGVsY2goeSwgeCk7fQorI3VuZGVmIG12ZGVsY2gKKyNkZWZpbmUgbXZkZWxjaCBVTkRFRihtdmRlbGNoKQorI2VuZGlmCisKKyNpZmRlZiBtdmdldGNoCitpbmxpbmUgaW50IFVOREVGKG12Z2V0Y2gpKGludCB5LCBpbnQgeCkgeyByZXR1cm4gbXZnZXRjaCh5LCB4KTt9CisjdW5kZWYgbXZnZXRjaAorI2RlZmluZSBtdmdldGNoIFVOREVGKG12Z2V0Y2gpCisjZW5kaWYKKworI2lmZGVmIG12Z2V0bnN0cgoraW5saW5lIGludCBVTkRFRihtdmdldG5zdHIpKGludCB5LCBpbnQgeCwgY2hhciAqc3RyLCBpbnQgbikgeworICByZXR1cm4gbXZnZXRuc3RyKHksIHgsIHN0ciwgbik7fQorI3VuZGVmIG12Z2V0bnN0cgorI2RlZmluZSBtdmdldG5zdHIgVU5ERUYobXZnZXRuc3RyKQorI2VuZGlmCisKKyNpZmRlZiBtdmdldHN0cgoraW5saW5lIGludCBVTkRFRihtdmdldHN0cikoaW50IHksIGludCB4LCBjaGFyICpzdHIpIHtyZXR1cm4gbXZnZXRzdHIoeSwgeCwgc3RyKTt9CisjdW5kZWYgbXZnZXRzdHIKKyNkZWZpbmUgbXZnZXRzdHIgVU5ERUYobXZnZXRzdHIpCisjZW5kaWYKKworI2lmZGVmIG12aW5jaAoraW5saW5lIGNodHlwZSBVTkRFRihtdmluY2gpKGludCB5LCBpbnQgeCkgeyByZXR1cm4gbXZpbmNoKHksIHgpO30KKyN1bmRlZiBtdmluY2gKKyNkZWZpbmUgbXZpbmNoIFVOREVGKG12aW5jaCkKKyNlbmRpZgorCisjaWZkZWYgbXZpbm5zdHIKK2lubGluZSBpbnQgVU5ERUYobXZpbm5zdHIpKGludCB5LCBpbnQgeCwgY2hhciAqX3N0ciwgaW50IG4pIHsKKyAgcmV0dXJuIG12aW5uc3RyKHksIHgsIF9zdHIsIG4pOyB9CisjdW5kZWYgbXZpbm5zdHIKKyNkZWZpbmUgbXZpbm5zdHIgVU5ERUYobXZpbm5zdHIpCisjZW5kaWYKKworI2lmZGVmIG12aW5zY2gKK2lubGluZSBpbnQgVU5ERUYobXZpbnNjaCkoaW50IHksIGludCB4LCBjaHR5cGUgYykKK3sgcmV0dXJuIG12aW5zY2goeSwgeCwgYyk7IH0KKyN1bmRlZiBtdmluc2NoCisjZGVmaW5lIG12aW5zY2ggVU5ERUYobXZpbnNjaCkKKyNlbmRpZgorCisjaWZkZWYgbXZpbnNuc3RyCitpbmxpbmUgaW50IFVOREVGKG12aW5zbnN0cikoaW50IHksIGludCB4LCBjb25zdCBjaGFyICpfc3RyLCBpbnQgbikgeworICByZXR1cm4gbXZpbnNuc3RyKHksIHgsIF9zdHIsIG4pOyB9CisjdW5kZWYgbXZpbnNuc3RyCisjZGVmaW5lIG12aW5zbnN0ciBVTkRFRihtdmluc25zdHIpCisjZW5kaWYKKworI2lmZGVmIG12aW5zc3RyCitpbmxpbmUgaW50IFVOREVGKG12aW5zc3RyKShpbnQgeSwgaW50IHgsIGNvbnN0IGNoYXIgKl9zdHIpICB7CisgIHJldHVybiBtdmluc3N0cih5LCB4LCBfc3RyKTsgfQorI3VuZGVmIG12aW5zc3RyCisjZGVmaW5lIG12aW5zc3RyIFVOREVGKG12aW5zc3RyKQorI2VuZGlmCisKKyNpZmRlZiBtdndhZGRjaAoraW5saW5lIGludCBVTkRFRihtdndhZGRjaCkoV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCwgY29uc3QgY2h0eXBlIGNoKQoreyByZXR1cm4gbXZ3YWRkY2god2luLCB5LCB4LCBjaCk7IH0KKyN1bmRlZiBtdndhZGRjaAorI2RlZmluZSBtdndhZGRjaCBVTkRFRihtdndhZGRjaCkKKyNlbmRpZgorCisjaWZkZWYgbXZ3YWRkY2huc3RyCitpbmxpbmUgaW50IFVOREVGKG12d2FkZGNobnN0cikoV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCwgY29uc3QgY2h0eXBlICpzdHIsIGludCBuKQoreyByZXR1cm4gbXZ3YWRkY2huc3RyKHdpbiwgeSwgeCwgc3RyLCBuKTsgfQorI3VuZGVmIG12d2FkZGNobnN0cgorI2RlZmluZSBtdndhZGRjaG5zdHIgVU5ERUYobXZ3YWRkY2huc3RyKQorI2VuZGlmCisKKyNpZmRlZiBtdndhZGRjaHN0cgoraW5saW5lIGludCBVTkRFRihtdndhZGRjaHN0cikoV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCwgY29uc3QgY2h0eXBlICpzdHIpCit7IHJldHVybiBtdndhZGRjaHN0cih3aW4sIHksIHgsIHN0cik7IH0KKyN1bmRlZiBtdndhZGRjaHN0cgorI2RlZmluZSBtdndhZGRjaHN0ciBVTkRFRihtdndhZGRjaHN0cikKKyNlbmRpZgorCisjaWZkZWYgbXZ3YWRkbnN0cgoraW5saW5lIGludCBVTkRFRihtdndhZGRuc3RyKShXSU5ET1cgKndpbiwgaW50IHksIGludCB4LCBjb25zdCBjaGFyICpzdHIsIGludCBuKQoreyByZXR1cm4gbXZ3YWRkbnN0cih3aW4sIHksIHgsIHN0ciwgbik7IH0KKyN1bmRlZiBtdndhZGRuc3RyCisjZGVmaW5lIG12d2FkZG5zdHIgVU5ERUYobXZ3YWRkbnN0cikKKyNlbmRpZgorCisjaWZkZWYgbXZ3YWRkc3RyCitpbmxpbmUgaW50IFVOREVGKG12d2FkZHN0cikoV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCwgY29uc3QgY2hhciAqIHN0cikKK3sgcmV0dXJuIG12d2FkZHN0cih3aW4sIHksIHgsIHN0cik7IH0KKyN1bmRlZiBtdndhZGRzdHIKKyNkZWZpbmUgbXZ3YWRkc3RyIFVOREVGKG12d2FkZHN0cikKKyNlbmRpZgorCisjaWZkZWYgbXZ3Y2hnYXQKK2lubGluZSBpbnQgVU5ERUYobXZ3Y2hnYXQpKFdJTkRPVyAqd2luLCBpbnQgeSwgaW50IHgsIGludCBuLAorCQkJICAgYXR0cl90IGF0dHIsIHNob3J0IGNvbG9yLCBjb25zdCB2b2lkICpvcHRzKSB7CisgIHJldHVybiBtdndjaGdhdCh3aW4sIHksIHgsIG4sIGF0dHIsIGNvbG9yLCBvcHRzKTsgfQorI3VuZGVmIG12d2NoZ2F0CisjZGVmaW5lIG12d2NoZ2F0IFVOREVGKG12d2NoZ2F0KQorI2VuZGlmCisKKyNpZmRlZiBtdndkZWxjaAoraW5saW5lIGludCBVTkRFRihtdndkZWxjaCkoV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCkKK3sgcmV0dXJuIG12d2RlbGNoKHdpbiwgeSwgeCk7IH0KKyN1bmRlZiBtdndkZWxjaAorI2RlZmluZSBtdndkZWxjaCBVTkRFRihtdndkZWxjaCkKKyNlbmRpZgorCisjaWZkZWYgbXZ3Z2V0Y2gKK2lubGluZSBpbnQgVU5ERUYobXZ3Z2V0Y2gpKFdJTkRPVyAqd2luLCBpbnQgeSwgaW50IHgpIHsgcmV0dXJuIG12d2dldGNoKHdpbiwgeSwgeCk7fQorI3VuZGVmIG12d2dldGNoCisjZGVmaW5lIG12d2dldGNoIFVOREVGKG12d2dldGNoKQorI2VuZGlmCisKKyNpZmRlZiBtdndnZXRuc3RyCitpbmxpbmUgaW50IFVOREVGKG12d2dldG5zdHIpKFdJTkRPVyAqd2luLCBpbnQgeSwgaW50IHgsIGNoYXIgKnN0ciwgaW50IG4pCit7cmV0dXJuIG12d2dldG5zdHIod2luLCB5LCB4LCBzdHIsIG4pO30KKyN1bmRlZiBtdndnZXRuc3RyCisjZGVmaW5lIG12d2dldG5zdHIgVU5ERUYobXZ3Z2V0bnN0cikKKyNlbmRpZgorCisjaWZkZWYgbXZ3Z2V0c3RyCitpbmxpbmUgaW50IFVOREVGKG12d2dldHN0cikoV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCwgY2hhciAqc3RyKQore3JldHVybiBtdndnZXRzdHIod2luLCB5LCB4LCBzdHIpO30KKyN1bmRlZiBtdndnZXRzdHIKKyNkZWZpbmUgbXZ3Z2V0c3RyIFVOREVGKG12d2dldHN0cikKKyNlbmRpZgorCisjaWZkZWYgbXZ3aGxpbmUKK2lubGluZSBpbnQgVU5ERUYobXZ3aGxpbmUpKFdJTkRPVyAqd2luLCBpbnQgeSwgaW50IHgsIGNodHlwZSBjLCBpbnQgbikgeworICByZXR1cm4gbXZ3aGxpbmUod2luLCB5LCB4LCBjLCBuKTsgfQorI3VuZGVmIG12d2hsaW5lCisjZGVmaW5lIG12d2hsaW5lIFVOREVGKG12d2hsaW5lKQorI2VuZGlmCisKKyNpZmRlZiBtdndpbmNoCitpbmxpbmUgY2h0eXBlIFVOREVGKG12d2luY2gpKFdJTkRPVyAqd2luLCBpbnQgeSwgaW50IHgpIHsKKyAgcmV0dXJuIG12d2luY2god2luLCB5LCB4KTt9CisjdW5kZWYgbXZ3aW5jaAorI2RlZmluZSBtdndpbmNoIFVOREVGKG12d2luY2gpCisjZW5kaWYKKworI2lmZGVmIG12d2luY2huc3RyCitpbmxpbmUgaW50IFVOREVGKG12d2luY2huc3RyKShXSU5ET1cgKndpbiwgaW50IHksIGludCB4LCBjaHR5cGUgKnN0ciwgaW50IG4pICB7IHJldHVybiBtdndpbmNobnN0cih3aW4sIHksIHgsIHN0ciwgbik7IH0KKyN1bmRlZiBtdndpbmNobnN0cgorI2RlZmluZSBtdndpbmNobnN0ciBVTkRFRihtdndpbmNobnN0cikKKyNlbmRpZgorCisjaWZkZWYgbXZ3aW5jaHN0cgoraW5saW5lIGludCBVTkRFRihtdndpbmNoc3RyKShXSU5ET1cgKndpbiwgaW50IHksIGludCB4LCBjaHR5cGUgKnN0cikgIHsgcmV0dXJuIG12d2luY2hzdHIod2luLCB5LCB4LCBzdHIpOyB9CisjdW5kZWYgbXZ3aW5jaHN0cgorI2RlZmluZSBtdndpbmNoc3RyIFVOREVGKG12d2luY2hzdHIpCisjZW5kaWYKKworI2lmZGVmIG12d2lubnN0cgoraW5saW5lIGludCBVTkRFRihtdndpbm5zdHIpKFdJTkRPVyAqd2luLCBpbnQgeSwgaW50IHgsIGNoYXIgKl9zdHIsIGludCBuKSB7CisgIHJldHVybiBtdndpbm5zdHIod2luLCB5LCB4LCBfc3RyLCBuKTsgfQorI3VuZGVmIG12d2lubnN0cgorI2RlZmluZSBtdndpbm5zdHIgVU5ERUYobXZ3aW5uc3RyKQorI2VuZGlmCisKKyNpZmRlZiBtdndpbnNjaAoraW5saW5lIGludCBVTkRFRihtdndpbnNjaCkoV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCwgY2h0eXBlIGMpCit7IHJldHVybiBtdndpbnNjaCh3aW4sIHksIHgsIGMpOyB9CisjdW5kZWYgbXZ3aW5zY2gKKyNkZWZpbmUgbXZ3aW5zY2ggVU5ERUYobXZ3aW5zY2gpCisjZW5kaWYKKworI2lmZGVmIG12d2luc25zdHIKK2lubGluZSBpbnQgVU5ERUYobXZ3aW5zbnN0cikoV0lORE9XICp3LCBpbnQgeSwgaW50IHgsIGNvbnN0IGNoYXIgKl9zdHIsIGludCBuKSB7CisgIHJldHVybiBtdndpbnNuc3RyKHcsIHksIHgsIF9zdHIsIG4pOyB9CisjdW5kZWYgbXZ3aW5zbnN0cgorI2RlZmluZSBtdndpbnNuc3RyIFVOREVGKG12d2luc25zdHIpCisjZW5kaWYKKworI2lmZGVmIG12d2luc3N0cgoraW5saW5lIGludCBVTkRFRihtdndpbnNzdHIpKFdJTkRPVyAqdywgaW50IHksIGludCB4LCAgY29uc3QgY2hhciAqX3N0cikgIHsKKyAgcmV0dXJuIG12d2luc3N0cih3LCB5LCB4LCBfc3RyKTsgfQorI3VuZGVmIG12d2luc3N0cgorI2RlZmluZSBtdndpbnNzdHIgVU5ERUYobXZ3aW5zc3RyKQorI2VuZGlmCisKKyNpZmRlZiBtdnd2bGluZQoraW5saW5lIGludCBVTkRFRihtdnd2bGluZSkoV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCwgY2h0eXBlIGMsIGludCBuKSB7CisgIHJldHVybiBtdnd2bGluZSh3aW4sIHksIHgsIGMsIG4pOyB9CisjdW5kZWYgbXZ3dmxpbmUKKyNkZWZpbmUgbXZ3dmxpbmUgVU5ERUYobXZ3dmxpbmUpCisjZW5kaWYKKworI2lmZGVmIG5hcG1zCitpbmxpbmUgdm9pZCBVTkRFRihuYXBtcykodW5zaWduZWQgbG9uZyB4KSB7IG5hcG1zKHgpOyB9CisjdW5kZWYgbmFwbXMKKyNkZWZpbmUgbmFwbXMgVU5ERUYobmFwbXMpCisjZW5kaWYKKworI2lmZGVmIG5vY3Jtb2RlCitpbmxpbmUgaW50IFVOREVGKG5vY3Jtb2RlKSh2b2lkKSB7IHJldHVybiBub2NybW9kZSgpOyB9CisjdW5kZWYgbm9jcm1vZGUKKyNkZWZpbmUgbm9jcm1vZGUgVU5ERUYobm9jcm1vZGUpCisjZW5kaWYKKworI2lmZGVmIG5vZGVsYXkKK2lubGluZSB2b2lkIFVOREVGKG5vZGVsYXkpKCkgeyBub2RlbGF5KCk7IH0KKyN1bmRlZiBub2RlbGF5CisjZGVmaW5lIG5vZGVsYXkgVU5ERUYobm9kZWxheSkKKyNlbmRpZgorCisjaWZkZWYgcmVkcmF3d2luCitpbmxpbmUgaW50IFVOREVGKHJlZHJhd3dpbikoV0lORE9XICp3aW4pICB7IHJldHVybiByZWRyYXd3aW4od2luKTsgfQorI3VuZGVmIHJlZHJhd3dpbgorI2RlZmluZSByZWRyYXd3aW4gVU5ERUYocmVkcmF3d2luKQorI2VuZGlmCisKKyNpZmRlZiByZWZyZXNoCitpbmxpbmUgaW50IFVOREVGKHJlZnJlc2gpKCkgIHsgcmV0dXJuIHJlZnJlc2goKTsgfQorI3VuZGVmIHJlZnJlc2gKKyNkZWZpbmUgcmVmcmVzaCBVTkRFRihyZWZyZXNoKQorI2VuZGlmCisKKyNpZmRlZiByZXNldHRlcm0KK2lubGluZSBpbnQgVU5ERUYocmVzZXR0ZXJtKSh2b2lkKSB7IHJldHVybiByZXNldHRlcm0oKTsgfQorI3VuZGVmIHJlc2V0dGVybQorI2RlZmluZSByZXNldHRlcm0gVU5ERUYocmVzZXR0ZXJtKQorI2VuZGlmCisKKyNpZmRlZiBzYXZldGVybQoraW5saW5lIGludCBVTkRFRihzYXZldGVybSkodm9pZCkgeyByZXR1cm4gc2F2ZXRlcm0oKTsgfQorI3VuZGVmIHNhdmV0ZXJtCisjZGVmaW5lIHNhdmV0ZXJtIFVOREVGKHNhdmV0ZXJtKQorI2VuZGlmCisKKyNpZmRlZiBzY3JsCitpbmxpbmUgaW50IFVOREVGKHNjcmwpKGludCBsKSB7IHJldHVybiBzY3JsKGwpOyB9CisjdW5kZWYgc2NybAorI2RlZmluZSBzY3JsIFVOREVGKHNjcmwpCisjZW5kaWYKKworI2lmZGVmIHNjcm9sbAoraW5saW5lIGludCBVTkRFRihzY3JvbGwpKFdJTkRPVyAqd2luKSB7IHJldHVybiBzY3JvbGwod2luKTsgfQorI3VuZGVmIHNjcm9sbAorI2RlZmluZSBzY3JvbGwgVU5ERUYoc2Nyb2xsKQorI2VuZGlmCisKKyNpZmRlZiBzY3JvbGxvaworaW5saW5lIGludCBVTkRFRihzY3JvbGxvaykoV0lORE9XKiB3aW4sIGJvb2wgYmYpICB7IHJldHVybiBzY3JvbGxvayh3aW4sIGJmKTsgfQorI3VuZGVmIHNjcm9sbG9rCisjZGVmaW5lIHNjcm9sbG9rIFVOREVGKHNjcm9sbG9rKQorI2Vsc2UKKyNpZglkZWZpbmVkKF9fTkNVUlNFU19IKQorZXh0ZXJuICJDIiBOQ1VSU0VTX0lNUEVYUCBpbnQgTkNVUlNFU19BUEkgc2Nyb2xsb2soV0lORE9XKiwgYm9vbCk7CisjZWxzZQorZXh0ZXJuICJDIiBOQ1VSU0VTX0lNUEVYUCBpbnQgTkNVUlNFU19BUEkgc2Nyb2xsb2soV0lORE9XKiwgY2hhcik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgc2V0c2NycmVnCitpbmxpbmUgaW50IFVOREVGKHNldHNjcnJlZykoaW50IHQsIGludCBiKSB7IHJldHVybiBzZXRzY3JyZWcodCwgYik7IH0KKyN1bmRlZiBzZXRzY3JyZWcKKyNkZWZpbmUgc2V0c2NycmVnIFVOREVGKHNldHNjcnJlZykKKyNlbmRpZgorCisjaWZkZWYgc3RhbmRlbmQKK2lubGluZSBpbnQgVU5ERUYoc3RhbmRlbmQpKCkgIHsgcmV0dXJuIHN0YW5kZW5kKCk7IH0KKyN1bmRlZiBzdGFuZGVuZAorI2RlZmluZSBzdGFuZGVuZCBVTkRFRihzdGFuZGVuZCkKKyNlbmRpZgorCisjaWZkZWYgc3RhbmRvdXQKK2lubGluZSBpbnQgVU5ERUYoc3RhbmRvdXQpKCkgIHsgcmV0dXJuIHN0YW5kb3V0KCk7IH0KKyN1bmRlZiBzdGFuZG91dAorI2RlZmluZSBzdGFuZG91dCBVTkRFRihzdGFuZG91dCkKKyNlbmRpZgorCisjaWZkZWYgc3VicGFkCitpbmxpbmUgV0lORE9XICpVTkRFRihzdWJwYWQpKFdJTkRPVyAqcCwgaW50IGwsIGludCBjLCBpbnQgeSwgaW50IHgpCit7IHJldHVybiBkZXJ3aW4ocCwgbCwgYywgeSwgeCk7IH0KKyN1bmRlZiBzdWJwYWQKKyNkZWZpbmUgc3VicGFkIFVOREVGKHN1YnBhZCkKKyNlbmRpZgorCisjaWZkZWYgdGltZW91dAoraW5saW5lIHZvaWQgVU5ERUYodGltZW91dCkoaW50IGRlbGF5KSB7IHRpbWVvdXQoZGVsYXkpOyB9CisjdW5kZWYgdGltZW91dAorI2RlZmluZSB0aW1lb3V0IFVOREVGKHRpbWVvdXQpCisjZW5kaWYKKworI2lmZGVmIHRvdWNobGluZQoraW5saW5lIGludCBVTkRFRih0b3VjaGxpbmUpKFdJTkRPVyAqd2luLCBpbnQgcywgaW50IGMpCit7IHJldHVybiB0b3VjaGxpbmUod2luLCBzLCBjKTsgfQorI3VuZGVmIHRvdWNobGluZQorI2RlZmluZSB0b3VjaGxpbmUgVU5ERUYodG91Y2hsaW5lKQorI2VuZGlmCisKKyNpZmRlZiB0b3VjaHdpbgoraW5saW5lIGludCBVTkRFRih0b3VjaHdpbikoV0lORE9XICp3aW4pIHsgcmV0dXJuIHRvdWNod2luKHdpbik7IH0KKyN1bmRlZiB0b3VjaHdpbgorI2RlZmluZSB0b3VjaHdpbiBVTkRFRih0b3VjaHdpbikKKyNlbmRpZgorCisjaWZkZWYgdW50b3VjaHdpbgoraW5saW5lIGludCBVTkRFRih1bnRvdWNod2luKShXSU5ET1cgKndpbikgeyByZXR1cm4gdW50b3VjaHdpbih3aW4pOyB9CisjdW5kZWYgdW50b3VjaHdpbgorI2RlZmluZSB1bnRvdWNod2luIFVOREVGKHVudG91Y2h3aW4pCisjZW5kaWYKKworI2lmZGVmIHZsaW5lCitpbmxpbmUgaW50IFVOREVGKHZsaW5lKShjaHR5cGUgY2gsIGludCBuKSB7IHJldHVybiB2bGluZShjaCwgbik7IH0KKyN1bmRlZiB2bGluZQorI2RlZmluZSB2bGluZSBVTkRFRih2bGluZSkKKyNlbmRpZgorCisjaWZkZWYgd2FkZGNoc3RyCitpbmxpbmUgaW50IFVOREVGKHdhZGRjaHN0cikoV0lORE9XICp3aW4sIGNodHlwZSAqYXQpIHsgcmV0dXJuIHdhZGRjaHN0cih3aW4sIGF0KTsgfQorI3VuZGVmIHdhZGRjaHN0cgorI2RlZmluZSB3YWRkY2hzdHIgVU5ERUYod2FkZGNoc3RyKQorI2VuZGlmCisKKyNpZmRlZiB3YWRkc3RyCitpbmxpbmUgaW50IFVOREVGKHdhZGRzdHIpKFdJTkRPVyAqd2luLCBjaGFyICpzdHIpIHsgcmV0dXJuIHdhZGRzdHIod2luLCBzdHIpOyB9CisjdW5kZWYgd2FkZHN0cgorI2RlZmluZSB3YWRkc3RyIFVOREVGKHdhZGRzdHIpCisjZW5kaWYKKworI2lmZGVmIHdhdHRyb2ZmCitpbmxpbmUgaW50IFVOREVGKHdhdHRyb2ZmKShXSU5ET1cgKndpbiwgaW50IGF0dCkgeyByZXR1cm4gd2F0dHJvZmYod2luLCBhdHQpOyB9CisjdW5kZWYgd2F0dHJvZmYKKyNkZWZpbmUgd2F0dHJvZmYgVU5ERUYod2F0dHJvZmYpCisjZW5kaWYKKworI2lmZGVmIHdhdHRyc2V0CitpbmxpbmUgaW50IFVOREVGKHdhdHRyc2V0KShXSU5ET1cgKndpbiwgaW50IGF0dCkgeyByZXR1cm4gd2F0dHJzZXQod2luLCBhdHQpOyB9CisjdW5kZWYgd2F0dHJzZXQKKyNkZWZpbmUgd2F0dHJzZXQgVU5ERUYod2F0dHJzZXQpCisjZW5kaWYKKworI2lmZGVmIHdpbmNoCitpbmxpbmUgY2h0eXBlIFVOREVGKHdpbmNoKShjb25zdCBXSU5ET1cqIHdpbikgeyByZXR1cm4gd2luY2god2luKTsgfQorI3VuZGVmIHdpbmNoCisjZGVmaW5lIHdpbmNoIFVOREVGKHdpbmNoKQorI2VuZGlmCisKKyNpZmRlZiB3aW5jaG5zdHIKK2lubGluZSBpbnQgVU5ERUYod2luY2huc3RyKShXSU5ET1cgKndpbiwgY2h0eXBlICpzdHIsIGludCBuKSAgeyByZXR1cm4gd2luY2huc3RyKHdpbiwgc3RyLCBuKTsgfQorI3VuZGVmIHdpbmNobnN0cgorI2RlZmluZSB3aW5jaG5zdHIgVU5ERUYod2luY2huc3RyKQorI2VuZGlmCisKKyNpZmRlZiB3aW5jaHN0cgoraW5saW5lIGludCBVTkRFRih3aW5jaHN0cikoV0lORE9XICp3aW4sIGNodHlwZSAqc3RyKSAgeyByZXR1cm4gd2luY2hzdHIod2luLCBzdHIpOyB9CisjdW5kZWYgd2luY2hzdHIKKyNkZWZpbmUgd2luY2hzdHIgVU5ERUYod2luY2hzdHIpCisjZW5kaWYKKworI2lmZGVmIHdpbnNzdHIKK2lubGluZSBpbnQgVU5ERUYod2luc3N0cikoV0lORE9XICp3LCBjb25zdCBjaGFyICpfc3RyKSAgeworICByZXR1cm4gd2luc3N0cih3LCBfc3RyKTsgfQorI3VuZGVmIHdpbnNzdHIKKyNkZWZpbmUgd2luc3N0ciBVTkRFRih3aW5zc3RyKQorI2VuZGlmCisKKyNpZmRlZiB3c3RhbmRlbmQKK2lubGluZSBpbnQgVU5ERUYod3N0YW5kZW5kKShXSU5ET1cgKndpbikgIHsgcmV0dXJuIHdzdGFuZGVuZCh3aW4pOyB9CisjdW5kZWYgd3N0YW5kZW5kCisjZGVmaW5lIHdzdGFuZGVuZCBVTkRFRih3c3RhbmRlbmQpCisjZW5kaWYKKworI2lmZGVmIHdzdGFuZG91dAoraW5saW5lIGludCBVTkRFRih3c3RhbmRvdXQpKFdJTkRPVyAqd2luKSAgeyByZXR1cm4gd3N0YW5kb3V0KHdpbik7IH0KKyN1bmRlZiB3c3RhbmRvdXQKKyNkZWZpbmUgd3N0YW5kb3V0IFVOREVGKHdzdGFuZG91dCkKKyNlbmRpZgorCisvKgorICoKKyAqIEMrKyBjbGFzcyBmb3Igd2luZG93cy4KKyAqCisgKi8KKworZXh0ZXJuICJDIiBpbnQgICAgIF9uY19yaXBvZmZsaW5lKGludCwgaW50ICgqaW5pdCkoV0lORE9XKiwgaW50KSk7CitleHRlcm4gIkMiIGludCAgICAgX25jX3h4X3JpcG9mZl9pbml0KFdJTkRPVyAqLCBpbnQpOworZXh0ZXJuICJDIiBpbnQgICAgIF9uY19oYXNfbW91c2Uodm9pZCk7CisKK2NsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNXaW5kb3cKK3sKKyAgZnJpZW5kIGNsYXNzIE5DdXJzZXNNZW51OworICBmcmllbmQgY2xhc3MgTkN1cnNlc0Zvcm07CisKK3ByaXZhdGU6CisgIHN0YXRpYyBib29sICAgIGJfaW5pdGlhbGl6ZWQ7CisgIHN0YXRpYyB2b2lkICAgIGluaXRpYWxpemUoKTsKKyAgdm9pZCAgICAgICAgICAgY29uc3RydWN0aW5nKCk7CisgIGZyaWVuZCBpbnQgICAgIF9uY194eF9yaXBvZmZfaW5pdChXSU5ET1cgKiwgaW50KTsKKworICB2b2lkICAgICAgICAgICBzZXRfa2V5Ym9hcmQoKTsKKworICBzaG9ydCAgICAgICAgICBnZXRjb2xvcihpbnQgZ2V0YmFjaykgY29uc3Q7CisgIHNob3J0ICAgICAgICAgIGdldFBhaXIoKSBjb25zdDsKKworICBzdGF0aWMgaW50ICAgICBzZXRwYWxldHRlKHNob3J0IGZvcmUsIHNob3J0IGJhY2ssIHNob3J0IHBhaXIpOworICBzdGF0aWMgaW50ICAgICBjb2xvckluaXRpYWxpemVkOworCisgIC8vIFRoaXMgcHJpdmF0ZSBjb25zdHJ1Y3RvciBpcyBvbmx5IHVzZWQgZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbgorICAvLyBvZiB3aW5kb3dzIGdlbmVyYXRlZCBieSByaXBvZmZsaW5lKCkgY2FsbHMuCisgIE5DdXJzZXNXaW5kb3coV0lORE9XKiB3aW4sIGludCBuY29scyk7CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkICAgZXJyX2hhbmRsZXIoY29uc3QgY2hhciAqKSBjb25zdCBUSFJPV1MoTkN1cnNlc0V4Y2VwdGlvbik7CisgIC8vIFNpZ25hbCBhbiBlcnJvciB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIHRleHQuCisKKyAgc3RhdGljIGxvbmcgY291bnQ7ICAgICAgICAvLyBjb3VudCBvZiBhbGwgYWN0aXZlIHdpbmRvd3M6CisgIC8vICAgV2UgcmVseSBvbiB0aGUgYysrIHByb21pc2UgdGhhdAorICAvLyAgIGFsbCBvdGhlcndpc2UgdW5pbml0aWFsaXplZAorICAvLyAgIHN0YXRpYyBjbGFzcyB2YXJzIGFyZSBzZXQgdG8gMAorCisgIFdJTkRPVyogICAgICAgIHc7ICAgICAgICAgICAgICAgIC8vIHRoZSBjdXJzZXMgV0lORE9XCisKKyAgYm9vbCAgICAgICAgICAgYWxsb2NlZDsgICAgICAgICAgLy8gVFJVRSBpZiB3ZSBvd24gdGhlIFdJTkRPVworCisgIE5DdXJzZXNXaW5kb3cqIHBhcjsgICAgICAgICAgICAgIC8vIHBhcmVudCwgaWYgc3Vid2luZG93CisgIE5DdXJzZXNXaW5kb3cqIHN1YndpbnM7ICAgICAgICAgIC8vIGhlYWQgb2Ygc3Vid2luZG93cyBsaXN0CisgIE5DdXJzZXNXaW5kb3cqIHNpYjsgICAgICAgICAgICAgIC8vIG5leHQgc3Vid2luZG93IG9mIHBhcmVudAorCisgIHZvaWQgICAgICAgICAgIGtpbGxfc3Vid2luZG93cygpOyAvLyBkaXNhYmxlIGFsbCBzdWJ3aW5kb3dzCisgIC8vIERlc3Ryb3kgYWxsIHN1YndpbmRvd3MuCisKKyAgLyogT25seSBmb3IgdXNlIGJ5IGRlcml2ZWQgY2xhc3Nlcy4gVGhleSBhcmUgdGhlbiBpbiBjaGFyZ2UgdG8KKyAgICAgZmlsbCB0aGUgbWVtYmVyIHZhcmlhYmxlcyBjb3JyZWN0bHkuICovCisgIE5DdXJzZXNXaW5kb3coKTsKKworcHVibGljOgorICBOQ3Vyc2VzV2luZG93KFdJTkRPVyogd2luZG93KTsgICAvLyB1c2VmdWwgb25seSBmb3Igc3Rkc2NyCisKKyAgTkN1cnNlc1dpbmRvdyhpbnQgbmxpbmVzLCAgICAgICAgLy8gbnVtYmVyIG9mIGxpbmVzCisJCWludCBuY29scywgICAgICAgICAvLyBudW1iZXIgb2YgY29sdW1ucworCQlpbnQgYmVnaW5feSwgICAgICAgLy8gbGluZSBvcmlnaW4KKwkJaW50IGJlZ2luX3gpOyAgICAgIC8vIGNvbCBvcmlnaW4KKworICBOQ3Vyc2VzV2luZG93KE5DdXJzZXNXaW5kb3cmIHBhciwvLyBwYXJlbnQgd2luZG93CisJCWludCBubGluZXMsICAgICAgICAvLyBudW1iZXIgb2YgbGluZXMKKwkJaW50IG5jb2xzLCAgICAgICAgIC8vIG51bWJlciBvZiBjb2x1bW5zCisJCWludCBiZWdpbl95LCAgICAgICAvLyBhYnNvbHV0ZSBvciByZWxhdGl2ZQorCQlpbnQgYmVnaW5feCwgICAgICAgLy8gICBvcmlnaW5zOgorCQljaGFyIGFic3JlbCA9ICdhJyk7Ly8gaWYgYGEnLCBiZWdpbl95ICYgYmVnaW5feCBhcmUKKyAgLy8gYWJzb2x1dGUgc2NyZWVuIHBvcywgZWxzZSBpZiBgcicsIHRoZXkgYXJlIHJlbGF0aXZlIHRvIHBhciBvcmlnaW4KKworICBOQ3Vyc2VzV2luZG93KE5DdXJzZXNXaW5kb3cmIHBhciwvLyBwYXJlbnQgd2luZG93CisJCWJvb2wgZG9fYm94ID0gVFJVRSk7CisgIC8vIHRoaXMgaXMgdGhlIHZlcnkgY29tbW9uIGNhc2UgdGhhdCB3ZSB3YW50IHRvIGNyZWF0ZSB0aGUgc3Vid2luZG93IHRoYXQKKyAgLy8gaXMgdHdvIGxpbmVzIGFuZCB0d28gY29sdW1ucyBzbWFsbGVyIGFuZCBiZWdpbnMgYXQgKDEsMSkuCisgIC8vIFdlIG1heSBhdXRvbWF0aWNhbGx5IHJlcXVlc3QgdGhlIGJveCBhcm91bmQgaXQuCisKKyAgTkN1cnNlc1dpbmRvdyYgb3BlcmF0b3I9KGNvbnN0IE5DdXJzZXNXaW5kb3cmIHJocykKKyAgeworICAgIGlmICh0aGlzICE9ICZyaHMpCisgICAgICAqdGhpcyA9IHJoczsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBOQ3Vyc2VzV2luZG93KGNvbnN0IE5DdXJzZXNXaW5kb3cmIHJocykKKyAgICA6IHcocmhzLncpLCBhbGxvY2VkKHJocy5hbGxvY2VkKSwgcGFyKHJocy5wYXIpLCBzdWJ3aW5zKHJocy5zdWJ3aW5zKSwgc2liKHJocy5zaWIpCisgIHsKKyAgfQorCisgIHZpcnR1YWwgfk5DdXJzZXNXaW5kb3coKTsKKworICBOQ3Vyc2VzV2luZG93IENsb25lKCk7CisgIC8vIE1ha2UgYW4gZXhhY3QgY29weSBvZiB0aGUgd2luZG93LgorCisgIC8vIEluaXRpYWxpemF0aW9uLgorICBzdGF0aWMgdm9pZCAgICB1c2VDb2xvcnModm9pZCk7CisgIC8vIENhbGwgdGhpcyByb3V0aW5lIHZlcnkgZWFybHkgaWYgeW91IHdhbnQgdG8gaGF2ZSBjb2xvcnMuCisKKyAgc3RhdGljIGludCByaXBvZmZsaW5lKGludCByaXBvZmZfbGluZXMsCisJCQlpbnQgKCppbml0KShOQ3Vyc2VzV2luZG93JiB3aW4pKTsKKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdlbmVyYXRlIGEgd2luZG93IG9mIHJpcHBlZC1vZiBsaW5lcy4KKyAgLy8gSWYgdGhlIGFyZ3VtZW50IGlzIHBvc2l0aXZlLCBsaW5lcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSB0b3AsIGlmIGl0CisgIC8vIGlzIG5lZ2F0aXZlIGxpbmVzIGFyZSByZW1vdmVkIGZyb20gdGhlIGJvdHRvbS4gVGhpcyBlbmhhbmNlcyB0aGUKKyAgLy8gbG93bGV2ZWwgcmlwb2ZmbGluZSgpIGZ1bmN0aW9uIGJlY2F1c2UgaXQgdXNlcyB0aGUgaW50ZXJuYWwKKyAgLy8gaW1wbGVtZW50YXRpb24gdGhhdCBhbGxvd3MgdG8gcmVtb3ZlIG1vcmUgdGhhbiBqdXN0IGEgc2luZ2xlIGxpbmUuCisgIC8vIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBuY3Vyc2VzIGZ1bmN0aW9uLiBUaGUKKyAgLy8gY3JlYXRpb24gb2YgdGhlIHdpbmRvdyBpcyBkZWZlcnJlZCB1bnRpbCBuY3Vyc2VzIGdldHMgaW5pdGlhbGl6ZWQuCisgIC8vIFRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBpcyB0aGVuIGNhbGxlZC4KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIHRlcm1pbmFsIHN0YXR1cworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCAgICAgICAgICAgIGxpbmVzKCkgY29uc3QgeyBpbml0aWFsaXplKCk7IHJldHVybiBMSU5FUzsgfQorICAvLyBOdW1iZXIgb2YgbGluZXMgb24gdGVybWluYWwsICpub3QqIHdpbmRvdworCisgIGludCAgICAgICAgICAgIGNvbHMoKSBjb25zdCB7IGluaXRpYWxpemUoKTsgcmV0dXJuIENPTFM7IH0KKyAgLy8gTnVtYmVyIG9mIGNvbHMgIG9uIHRlcm1pbmFsLCAqbm90KiB3aW5kb3cKKworICBpbnQgICAgICAgICAgICB0YWJzaXplKCkgY29uc3QgeyBpbml0aWFsaXplKCk7IHJldHVybiBUQUJTSVpFOyB9CisgIC8vIFNpemUgb2YgYSB0YWIgb24gdGVybWluYWwsICpub3QqIHdpbmRvdworCisgIHN0YXRpYyBpbnQgICAgIE51bWJlck9mQ29sb3JzKCk7CisgIC8vIE51bWJlciBvZiBhdmFpbGFibGUgY29sb3JzCisKKyAgaW50ICAgICAgICAgICAgY29sb3JzKCkgY29uc3QgeyByZXR1cm4gTnVtYmVyT2ZDb2xvcnMoKTsgfQorICAvLyBOdW1iZXIgb2YgYXZhaWxhYmxlIGNvbG9ycworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gd2luZG93IHN0YXR1cworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCAgICAgICAgICAgIGhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1heHkoKSArIDE7IH0KKyAgLy8gTnVtYmVyIG9mIGxpbmVzIGluIHRoaXMgd2luZG93CisKKyAgaW50ICAgICAgICAgICAgd2lkdGgoKSBjb25zdCB7IHJldHVybiBtYXh4KCkgKyAxOyB9CisgIC8vIE51bWJlciBvZiBjb2x1bW5zIGluIHRoaXMgd2luZG93CisKKyAgaW50ICAgICAgICAgICAgYmVneCgpIGNvbnN0IHsgcmV0dXJuIGdldGJlZ3godyk7IH0KKyAgLy8gQ29sdW1uIG9mIHRvcCBsZWZ0IGNvcm5lciByZWxhdGl2ZSB0byBzdGRzY3IKKworICBpbnQgICAgICAgICAgICBiZWd5KCkgY29uc3QgeyByZXR1cm4gZ2V0YmVneSh3KTsgfQorICAvLyBMaW5lIG9mIHRvcCBsZWZ0IGNvcm5lciByZWxhdGl2ZSB0byBzdGRzY3IKKworICBpbnQgICAgICAgICAgICBjdXJ4KCkgY29uc3QgeyByZXR1cm4gZ2V0Y3VyeCh3KTsgfQorICAvLyBDb2x1bW4gb2YgdG9wIGxlZnQgY29ybmVyIHJlbGF0aXZlIHRvIHN0ZHNjcgorCisgIGludCAgICAgICAgICAgIGN1cnkoKSBjb25zdCB7IHJldHVybiBnZXRjdXJ5KHcpOyB9CisgIC8vIExpbmUgb2YgdG9wIGxlZnQgY29ybmVyIHJlbGF0aXZlIHRvIHN0ZHNjcgorCisgIGludCAgICAgICAgICAgIG1heHgoKSBjb25zdCB7IHJldHVybiBnZXRtYXh4KHcpID09IEVSUiA/IEVSUiA6IGdldG1heHgodyktMTsgfQorICAvLyBMYXJnZXN0IHggY29vcmQgaW4gd2luZG93CisKKyAgaW50ICAgICAgICAgICAgbWF4eSgpIGNvbnN0IHsgcmV0dXJuIGdldG1heHkodykgPT0gRVJSID8gRVJSIDogZ2V0bWF4eSh3KS0xOyB9CisgIC8vIExhcmdlc3QgeSBjb29yZCBpbiB3aW5kb3cKKworICBzaG9ydCAgICAgICAgICBnZXRjb2xvcigpIGNvbnN0OworICAvLyBBY3R1YWwgY29sb3IgcGFpcgorCisgIHNob3J0ICAgICAgICAgIGZvcmVncm91bmQoKSBjb25zdCB7IHJldHVybiBnZXRjb2xvcigwKTsgfQorICAvLyBBY3R1YWwgZm9yZWdyb3VuZCBjb2xvcgorCisgIHNob3J0ICAgICAgICAgIGJhY2tncm91bmQoKSBjb25zdCB7IHJldHVybiBnZXRjb2xvcigxKTsgfQorICAvLyBBY3R1YWwgYmFja2dyb3VuZCBjb2xvcgorCisgIGludCAgICAgICAgICAgIHNldHBhbGV0dGUoc2hvcnQgZm9yZSwgc2hvcnQgYmFjayk7CisgIC8vIFNldCBjb2xvciBwYWxldHRlIGVudHJ5CisKKyAgaW50ICAgICAgICAgICAgc2V0Y29sb3Ioc2hvcnQgcGFpcik7CisgIC8vIFNldCBhY3R1YWxseSB1c2VkIHBhbGV0dGUgZW50cnkKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIHdpbmRvdyBwb3NpdGlvbmluZworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZpcnR1YWwgaW50ICAgIG12d2luKGludCBiZWdpbl95LCBpbnQgYmVnaW5feCkgeworICAgIHJldHVybiA6Om12d2luKHcsIGJlZ2luX3ksIGJlZ2luX3gpOyB9CisgIC8vIE1vdmUgd2luZG93IHRvIG5ldyBwb3NpdGlvbiB3aXRoIHRoZSBuZXcgcG9zaXRpb24gYXMgdG9wIGxlZnQgY29ybmVyLgorICAvLyBUaGlzIGlzIHZpcnR1YWwgYmVjYXVzZSBpdCBpcyByZWRlZmluZWQgaW4gTkN1cnNlc1BhbmVsLgorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gY29vcmRpbmF0ZSBwb3NpdGlvbmluZworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCAgICAgICAgICAgIG1vdmUoaW50IHksIGludCB4KSB7IHJldHVybiA6Ondtb3ZlKHcsIHksIHgpOyB9CisgIC8vIE1vdmUgY3Vyc29yIHRoZSB0aGlzIHBvc2l0aW9uCisKKyAgdm9pZCAgICAgICAgICAgZ2V0eXgoaW50JiB5LCBpbnQmIHgpIGNvbnN0IHsgOjpnZXR5eCh3LCB5LCB4KTsgfQorICAvLyBHZXQgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yCisKKyAgdm9pZCAgICAgICAgICAgZ2V0YmVneXgoaW50JiB5LCBpbnQmIHgpIGNvbnN0IHsgOjpnZXRiZWd5eCh3LCB5LCB4KTsgfQorICAvLyBHZXQgYmVnaW5uaW5nIG9mIHRoZSB3aW5kb3cKKworICB2b2lkICAgICAgICAgICBnZXRtYXh5eChpbnQmIHksIGludCYgeCkgY29uc3QgeyA6OmdldG1heHl4KHcsIHksIHgpOyB9CisgIC8vIEdldCBzaXplIG9mIHRoZSB3aW5kb3cKKworICB2b2lkICAgICAgICAgICBnZXRwYXJ5eChpbnQmIHksIGludCYgeCkgY29uc3QgeyA6OmdldHBhcnl4KHcsIHksIHgpOyB9CisgIC8vIEdldCBwYXJlbnQncyBiZWdpbm5pbmcgb2YgdGhlIHdpbmRvdworCisgIGludCAgICAgICAgICAgIG12Y3VyKGludCBvbGRyb3csIGludCBvbGRjb2wsIGludCBuZXdyb3csIGludCBuZXdjb2wpIGNvbnN0IHsKKyAgICByZXR1cm4gOjptdmN1cihvbGRyb3csIG9sZGNvbCwgbmV3cm93LCBuZXdjb2wpOyB9CisgIC8vIFBlcmZvcm0gbG93bGV2ZWwgY3Vyc29yIG1vdGlvbiB0aGF0IHRha2VzIGVmZmVjdCBpbW1lZGlhdGVseS4KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIGlucHV0CisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW50ICAgICAgICAgICAgZ2V0Y2goKSB7IHJldHVybiA6OndnZXRjaCh3KTsgfQorICAvLyBHZXQgYSBrZXlzdHJva2UgZnJvbSB0aGUgd2luZG93LgorCisgIGludCAgICAgICAgICAgIGdldGNoKGludCB5LCBpbnQgeCkgeyByZXR1cm4gOjptdndnZXRjaCh3LCB5LCB4KTsgfQorICAvLyBNb3ZlIGN1cnNvciB0byBwb3NpdGlvbiBhbmQgZ2V0IGEga2V5c3Ryb2tlIGZyb20gdGhlIHdpbmRvdworCisgIGludCAgICAgICAgICAgIGdldHN0cihjaGFyKiBzdHIsIGludCBuPS0xKSB7CisgICAgcmV0dXJuIDo6d2dldG5zdHIodywgc3RyLCBuKTsgfQorICAvLyBSZWFkIGEgc2VyaWVzIG9mIGNoYXJhY3RlcnMgaW50byBzdHIgdW50aWwgYSBuZXdsaW5lIG9yIGNhcnJpYWdlIHJldHVybgorICAvLyBpcyByZWNlaXZlZC4gUmVhZCBhdCBtb3N0IG4gY2hhcmFjdGVycy4gSWYgbiBpcyBuZWdhdGl2ZSwgdGhlIGxpbWl0IGlzCisgIC8vIGlnbm9yZWQuCisKKyAgaW50ICAgICAgICAgICAgZ2V0c3RyKGludCB5LCBpbnQgeCwgY2hhciogc3RyLCBpbnQgbj0tMSkgeworICAgIHJldHVybiA6Om12d2dldG5zdHIodywgeSwgeCwgc3RyLCBuKTsgfQorICAvLyBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHJlcXVlc3RlZCBwb3NpdGlvbiBhbmQgdGhlbiBwZXJmb3JtIHRoZSBnZXRzdHIoKQorICAvLyBhcyBkZXNjcmliZWQgYWJvdmUuCisKKyAgaW50ICAgICAgICAgICAgaW5zdHIoY2hhciAqcywgaW50IG49LTEpIHsgcmV0dXJuIDo6d2lubnN0cih3LCBzLCBuKTsgfQorICAvLyBHZXQgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSB3aW5kb3cgaW50byB0aGUgYnVmZmVyIHMuIFJldHJpZXZlCisgIC8vIGF0IG1vc3QgbiBjaGFyYWN0ZXJzLCBpZiBuIGlzIG5lZ2F0aXZlIHJldHJpZXZlIGFsbCBjaGFyYWN0ZXJzIHVwIHRvIHRoZQorICAvLyBlbmQgb2YgdGhlIGN1cnJlbnQgbGluZS4gQXR0cmlidXRlcyBhcmUgc3RyaXBwZWQgZnJvbSB0aGUgY2hhcmFjdGVycy4KKworICBpbnQgICAgICAgICAgICBpbnN0cihpbnQgeSwgaW50IHgsIGNoYXIgKnMsIGludCBuPS0xKSB7CisgICAgcmV0dXJuIDo6bXZ3aW5uc3RyKHcsIHksIHgsIHMsIG4pOyB9CisgIC8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uIGFuZCB0aGVuIHBlcmZvcm0gdGhlIGluc3RyKCkKKyAgLy8gYXMgZGVzY3JpYmVkIGFib3ZlLgorCisgIGludCAgICAgICAgICAgIHNjYW53KGNvbnN0IGNoYXIqIGZtdCwgLi4uKQorICAgIC8vIFBlcmZvcm0gYSBzY2FudyBmdW5jdGlvbiBmcm9tIHRoZSB3aW5kb3cuCisjaWYgX19HTlVHX18gPj0gMgorICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHNjYW5mLCAyLCAzKSkpOworI2Vsc2UKKyAgOworI2VuZGlmCisKKyAgaW50ICAgICAgICAgICAgc2NhbncoY29uc3QgY2hhciosIHZhX2xpc3QpOworICAgIC8vIFBlcmZvcm0gYSBzY2FudyBmdW5jdGlvbiBmcm9tIHRoZSB3aW5kb3cuCisKKyAgaW50ICAgICAgICAgICAgc2NhbncoaW50IHksIGludCB4LCBjb25zdCBjaGFyKiBmbXQsIC4uLikKKyAgICAvLyBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHJlcXVlc3RlZCBwb3NpdGlvbiBhbmQgdGhlbiBwZXJmb3JtIGEgc2NhbncKKyAgICAvLyBmcm9tIHRoZSB3aW5kb3cuCisjaWYgX19HTlVHX18gPj0gMgorICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHNjYW5mLCA0LCA1KSkpOworI2Vsc2UKKyAgOworI2VuZGlmCisKKyAgaW50ICAgICAgICAgICAgc2NhbncoaW50IHksIGludCB4LCBjb25zdCBjaGFyKiBmbXQsIHZhX2xpc3QpOworICAgIC8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uIGFuZCB0aGVuIHBlcmZvcm0gYSBzY2FudworICAgIC8vIGZyb20gdGhlIHdpbmRvdy4KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIG91dHB1dAorICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCAgICAgICAgICAgIGFkZGNoKGNvbnN0IGNodHlwZSBjaCkgeyByZXR1cm4gOjp3YWRkY2godywgY2gpOyB9CisgIC8vIFB1dCBhdHRyaWJ1dGVkIGNoYXJhY3RlciB0byB0aGUgd2luZG93LgorCisgIGludCAgICAgICAgICAgIGFkZGNoKGludCB5LCBpbnQgeCwgY29uc3QgY2h0eXBlIGNoKSB7CisgICAgcmV0dXJuIDo6bXZ3YWRkY2godywgeSwgeCwgY2gpOyB9CisgIC8vIE1vdmUgY3Vyc29yIHRvIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gYW5kIHRoZW4gcHV0IGF0dHJpYnV0ZWQgY2hhcmFjdGVyCisgIC8vIHRvIHRoZSB3aW5kb3cuCisKKyAgaW50ICAgICAgICAgICAgZWNob2NoYXIoY29uc3QgY2h0eXBlIGNoKSB7IHJldHVybiA6OndlY2hvY2hhcih3LCBjaCk7IH0KKyAgLy8gUHV0IGF0dHJpYnV0ZWQgY2hhcmFjdGVyIHRvIHRoZSB3aW5kb3cgYW5kIHJlZnJlc2ggaXQgaW1tZWRpYXRlbHkuCisKKyAgaW50ICAgICAgICAgICAgYWRkc3RyKGNvbnN0IGNoYXIqIHN0ciwgaW50IG49LTEpIHsKKyAgICByZXR1cm4gOjp3YWRkbnN0cih3LCBzdHIsIG4pOyB9CisgIC8vIFdyaXRlIHRoZSBzdHJpbmcgc3RyIHRvIHRoZSB3aW5kb3csIHN0b3Agd3JpdGluZyBpZiB0aGUgdGVybWluYXRpbmcKKyAgLy8gTlVMIG9yIHRoZSBsaW1pdCBuIGlzIHJlYWNoZWQuIElmIG4gaXMgbmVnYXRpdmUsIGl0IGlzIGlnbm9yZWQuCisKKyAgaW50ICAgICAgICAgICAgYWRkc3RyKGludCB5LCBpbnQgeCwgY29uc3QgY2hhciAqIHN0ciwgaW50IG49LTEpIHsKKyAgICByZXR1cm4gOjptdndhZGRuc3RyKHcsIHksIHgsIHN0ciwgbik7IH0KKyAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gYW5kIHRoZW4gcGVyZm9ybSB0aGUgYWRkY2hzdHIKKyAgLy8gYXMgZGVzY3JpYmVkIGFib3ZlLgorCisgIGludCAgICAgICAgICAgIGFkZGNoc3RyKGNvbnN0IGNodHlwZSogc3RyLCBpbnQgbj0tMSkgeworICAgIHJldHVybiA6OndhZGRjaG5zdHIodywgc3RyLCBuKTsgfQorICAvLyBXcml0ZSB0aGUgc3RyaW5nIHN0ciB0byB0aGUgd2luZG93LCBzdG9wIHdyaXRpbmcgaWYgdGhlIHRlcm1pbmF0aW5nCisgIC8vIE5VTCBvciB0aGUgbGltaXQgbiBpcyByZWFjaGVkLiBJZiBuIGlzIG5lZ2F0aXZlLCBpdCBpcyBpZ25vcmVkLgorCisgIGludCAgICAgICAgICAgIGFkZGNoc3RyKGludCB5LCBpbnQgeCwgY29uc3QgY2h0eXBlICogc3RyLCBpbnQgbj0tMSkgeworICAgIHJldHVybiA6Om12d2FkZGNobnN0cih3LCB5LCB4LCBzdHIsIG4pOyB9CisgIC8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uIGFuZCB0aGVuIHBlcmZvcm0gdGhlIGFkZGNoc3RyCisgIC8vIGFzIGRlc2NyaWJlZCBhYm92ZS4KKworICBpbnQgICAgICAgICAgICBwcmludHcoY29uc3QgY2hhciogZm10LCAuLi4pCisgICAgLy8gRG8gYSBmb3JtYXR0ZWQgcHJpbnQgdG8gdGhlIHdpbmRvdy4KKyNpZiAoX19HTlVHX18gPj0gMikgJiYgIWRlZmluZWQocHJpbnRmKQorICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKKyNlbHNlCisgIDsKKyNlbmRpZgorCisgIGludCAgICAgICAgICAgIHByaW50dyhpbnQgeSwgaW50IHgsIGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKKyAgICAvLyBNb3ZlIHRoZSBjdXJzb3IgYW5kIHRoZW4gZG8gYSBmb3JtYXR0ZWQgcHJpbnQgdG8gdGhlIHdpbmRvdy4KKyNpZiAoX19HTlVHX18gPj0gMikgJiYgIWRlZmluZWQocHJpbnRmKQorICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgNCwgNSkpKTsKKyNlbHNlCisgIDsKKyNlbmRpZgorCisgIGludCAgICAgICAgICAgIHByaW50dyhjb25zdCBjaGFyKiBmbXQsIHZhX2xpc3QgYXJncyk7CisgICAgLy8gRG8gYSBmb3JtYXR0ZWQgcHJpbnQgdG8gdGhlIHdpbmRvdy4KKworICBpbnQgICAgICAgICAgICBwcmludHcoaW50IHksIGludCB4LCBjb25zdCBjaGFyICogZm10LCB2YV9saXN0IGFyZ3MpOworICAgIC8vIE1vdmUgdGhlIGN1cnNvciBhbmQgdGhlbiBkbyBhIGZvcm1hdHRlZCBwcmludCB0byB0aGUgd2luZG93LgorCisgIGNodHlwZSAgICAgICAgIGluY2goKSBjb25zdCB7IHJldHVybiA6OndpbmNoKHcpOyB9CisgIC8vIFJldHJpZXZlIGF0dHJpYnV0ZWQgY2hhcmFjdGVyIHVuZGVyIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbi4KKworICBjaHR5cGUgICAgICAgICBpbmNoKGludCB5LCBpbnQgeCkgeyByZXR1cm4gOjptdndpbmNoKHcsIHksIHgpOyB9CisgIC8vIE1vdmUgY3Vyc29yIHRvIHJlcXVlc3RlZCBwb3NpdGlvbiBhbmQgdGhlbiByZXRyaWV2ZSBhdHRyaWJ1dGVkIGNoYXJhY3RlcgorICAvLyBhdCB0aGlzIHBvc2l0aW9uLgorCisgIGludCAgICAgICAgICAgIGluY2hzdHIoY2h0eXBlKiBzdHIsIGludCBuPS0xKSB7CisgICAgcmV0dXJuIDo6d2luY2huc3RyKHcsIHN0ciwgbik7IH0KKyAgLy8gUmVhZCB0aGUgc3RyaW5nIHN0ciBmcm9tIHRoZSB3aW5kb3csIHN0b3AgcmVhZGluZyBpZiB0aGUgdGVybWluYXRpbmcKKyAgLy8gTlVMIG9yIHRoZSBsaW1pdCBuIGlzIHJlYWNoZWQuIElmIG4gaXMgbmVnYXRpdmUsIGl0IGlzIGlnbm9yZWQuCisKKyAgaW50ICAgICAgICAgICAgaW5jaHN0cihpbnQgeSwgaW50IHgsIGNodHlwZSAqIHN0ciwgaW50IG49LTEpIHsKKyAgICByZXR1cm4gOjptdndpbmNobnN0cih3LCB5LCB4LCBzdHIsIG4pOyB9CisgIC8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uIGFuZCB0aGVuIHBlcmZvcm0gdGhlIGluY2hzdHIKKyAgLy8gYXMgZGVzY3JpYmVkIGFib3ZlLgorCisgIGludCAgICAgICAgICAgIGluc2NoKGNodHlwZSBjaCkgeyByZXR1cm4gOjp3aW5zY2godywgY2gpOyB9CisgIC8vIEluc2VydCBhdHRyaWJ1dGVkIGNoYXJhY3RlciBpbnRvIHRoZSB3aW5kb3cgYmVmb3JlIGN1cnJlbnQgY3Vyc29yCisgIC8vIHBvc2l0aW9uLgorCisgIGludCAgICAgICAgICAgIGluc2NoKGludCB5LCBpbnQgeCwgY2h0eXBlIGNoKSB7CisgICAgcmV0dXJuIDo6bXZ3aW5zY2godywgeSwgeCwgY2gpOyB9CisgIC8vIE1vdmUgY3Vyc29yIHRvIHJlcXVlc3RlZCBwb3NpdGlvbiBhbmQgdGhlbiBpbnNlcnQgdGhlIGF0dHJpYnV0ZWQKKyAgLy8gY2hhcmFjdGVyIGJlZm9yZSB0aGF0IHBvc2l0aW9uLgorCisgIGludCAgICAgICAgICAgIGluc2VydGxuKCkgeyByZXR1cm4gOjp3aW5zZGVsbG4odywgMSk7IH0KKyAgLy8gSW5zZXJ0IGFuIGVtcHR5IGxpbmUgYWJvdmUgdGhlIGN1cnJlbnQgbGluZS4KKworICBpbnQgICAgICAgICAgICBpbnNkZWxsbihpbnQgbj0xKSB7IHJldHVybiA6OndpbnNkZWxsbih3LCBuKTsgfQorICAvLyBJZiBuPjAgaW5zZXJ0IHRoYXQgbWFueSBsaW5lcyBhYm92ZSB0aGUgY3VycmVudCBsaW5lLiBJZiBuPDAgZGVsZXRlCisgIC8vIHRoYXQgbWFueSBsaW5lcyBiZWdpbm5pbmcgd2l0aCB0aGUgY3VycmVudCBsaW5lLgorCisgIGludCAgICAgICAgICAgIGluc3N0cihjb25zdCBjaGFyICpzLCBpbnQgbj0tMSkgeworICAgIHJldHVybiA6OndpbnNuc3RyKHcsIHMsIG4pOyB9CisgIC8vIEluc2VydCB0aGUgc3RyaW5nIGludG8gdGhlIHdpbmRvdyBiZWZvcmUgdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uLgorICAvLyBJbnNlcnQgc3RvcHMgYXQgZW5kIG9mIHN0cmluZyBvciB3aGVuIHRoZSBsaW1pdCBuIGlzIHJlYWNoZWQuIElmIG4gaXMKKyAgLy8gbmVnYXRpdmUsIGl0IGlzIGlnbm9yZWQuCisKKyAgaW50ICAgICAgICAgICAgaW5zc3RyKGludCB5LCBpbnQgeCwgY29uc3QgY2hhciAqcywgaW50IG49LTEpIHsKKyAgICByZXR1cm4gOjptdndpbnNuc3RyKHcsIHksIHgsIHMsIG4pOyB9CisgIC8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uIGFuZCB0aGVuIHBlcmZvcm0gdGhlIGluc3N0cigpCisgIC8vIGFzIGRlc2NyaWJlZCBhYm92ZS4KKworICBpbnQgICAgICAgICAgICBhdHRyb24gKGNodHlwZSBhdCkgeyByZXR1cm4gOjp3YXR0cm9uICh3LCBhdCk7IH0KKyAgLy8gU3dpdGNoIG9uIHRoZSB3aW5kb3cgYXR0cmlidXRlczsKKworICBpbnQgICAgICAgICAgICBhdHRyb2ZmKGNodHlwZSBhdCkgeyByZXR1cm4gOjp3YXR0cm9mZih3LCBzdGF0aWNfY2FzdDxpbnQ+KGF0KSk7IH0KKyAgLy8gU3dpdGNoIG9mZiB0aGUgd2luZG93IGF0dHJpYnV0ZXM7CisKKyAgaW50ICAgICAgICAgICAgYXR0cnNldChjaHR5cGUgYXQpIHsgcmV0dXJuIDo6d2F0dHJzZXQodywgc3RhdGljX2Nhc3Q8aW50PihhdCkpOyB9CisgIC8vIFNldCB0aGUgd2luZG93IGF0dHJpYnV0ZXM7CisKKyAgY2h0eXBlICAgICAgICAgYXR0cmdldCgpIHsgcmV0dXJuIDo6Z2V0YXR0cnModyk7IH0KKyAgLy8gR2V0IHRoZSB3aW5kb3cgYXR0cmlidXRlczsKKworICBpbnQgICAgICAgICAgICBjb2xvcl9zZXQoc2hvcnQgY29sb3JfcGFpcl9udW1iZXIsIHZvaWQqIG9wdHM9TlVMTCkgeworICAgIHJldHVybiA6Ondjb2xvcl9zZXQodywgY29sb3JfcGFpcl9udW1iZXIsIG9wdHMpOyB9CisgIC8vIFNldCB0aGUgd2luZG93IGNvbG9yIGF0dHJpYnV0ZTsKKworICBpbnQgICAgICAgICAgICBjaGdhdChpbnQgbiwgYXR0cl90IGF0dHIsIHNob3J0IGNvbG9yLCBjb25zdCB2b2lkICpvcHRzPU5VTEwpIHsKKyAgICByZXR1cm4gOjp3Y2hnYXQodywgbiwgYXR0ciwgY29sb3IsIG9wdHMpOyB9CisgIC8vIENoYW5nZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmV4dCBuIGNoYXJhY3RlcnMgaW4gdGhlIGN1cnJlbnQgbGluZS4gSWYKKyAgLy8gbiBpcyBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiByZW1haW5pbmcgY2hhcmFjdGVycyBpbiB0aGUKKyAgLy8gbGluZSwgdGhlIGF0dHJpYnV0ZXMgd2lsbCBiZSBjaGFuZ2VkIHVwIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuCisKKyAgaW50ICAgICAgICAgICAgY2hnYXQoaW50IHksIGludCB4LAorCQkgICAgICAgaW50IG4sIGF0dHJfdCBhdHRyLCBzaG9ydCBjb2xvciwgY29uc3Qgdm9pZCAqb3B0cz1OVUxMKSB7CisgICAgcmV0dXJuIDo6bXZ3Y2hnYXQodywgeSwgeCwgbiwgYXR0ciwgY29sb3IsIG9wdHMpOyB9CisgIC8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uIGFuZCB0aGVuIHBlcmZvcm0gY2hnYXQoKSBhcworICAvLyBkZXNjcmliZWQgYWJvdmUuCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBiYWNrZ3JvdW5kCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgY2h0eXBlICAgICAgICAgZ2V0YmtnZCgpIGNvbnN0IHsgcmV0dXJuIDo6Z2V0YmtnZCh3KTsgfQorICAvLyBHZXQgY3VycmVudCBiYWNrZ3JvdW5kIHNldHRpbmcuCisKKyAgaW50ICAgICAgICAgICAgYmtnZChjb25zdCBjaHR5cGUgY2gpIHsgcmV0dXJuIDo6d2JrZ2QodywgY2gpOyB9CisgIC8vIFNldCB0aGUgYmFja2dyb3VuZCBwcm9wZXJ0eSBhbmQgYXBwbHkgaXQgdG8gdGhlIHdpbmRvdy4KKworICB2b2lkICAgICAgICAgICBia2dkc2V0KGNodHlwZSBjaCkgeyA6Ondia2dkc2V0KHcsIGNoKTsgfQorICAvLyBTZXQgdGhlIGJhY2tncm91bmQgcHJvcGVydHkuCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBib3JkZXJzCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW50ICAgICAgICAgICAgYm94KGNodHlwZSB2ZXJ0PTAsIGNodHlwZSAgaG9yPTApIHsKKyAgICByZXR1cm4gOjp3Ym9yZGVyKHcsIHZlcnQsIHZlcnQsIGhvciwgaG9yLCAwLCAwLCAwLCAwKTsgfQorICAvLyBEcmF3IGEgYm94IGFyb3VuZCB0aGUgd2luZG93IHdpdGggdGhlIGdpdmVuIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsCisgIC8vIGRyYXdpbmcgY2hhcmFjdGVycy4gSWYgeW91IHNwZWNpZnkgYSB6ZXJvIGFzIGNoYXJhY3RlciwgY3Vyc2VzIHdpbGwgdHJ5CisgIC8vIHRvIGZpbmQgYSAibmljZSIgY2hhcmFjdGVyLgorCisgIGludCAgICAgICAgICAgIGJvcmRlcihjaHR5cGUgbGVmdD0wLCBjaHR5cGUgcmlnaHQ9MCwKKwkJCWNodHlwZSB0b3AgPTAsIGNodHlwZSBib3R0b209MCwKKwkJCWNodHlwZSB0b3BfbGVmdCA9MCwgY2h0eXBlIHRvcF9yaWdodD0wLAorCQkJY2h0eXBlIGJvdHRvbV9sZWZ0ID0wLCBjaHR5cGUgYm90dG9tX3JpZ2h0PTApIHsKKyAgICByZXR1cm4gOjp3Ym9yZGVyKHcsIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgdG9wX2xlZnQsIHRvcF9yaWdodCwKKwkJICAgICBib3R0b21fbGVmdCwgYm90dG9tX3JpZ2h0KTsgfQorICAvLyBEcmF3IGEgYm9yZGVyIGFyb3VuZCB0aGUgd2luZG93IHdpdGggdGhlIGdpdmVuIGNoYXJhY3RlcnMgZm9yIHRoZQorICAvLyB2YXJpb3VzIHBhcnRzIG9mIHRoZSBib3JkZXIuIElmIHlvdSBwYXNzIHplcm8gZm9yIGEgY2hhcmFjdGVyLCBjdXJzZXMKKyAgLy8gd2lsbCB0cnkgdG8gZmluZCAibmljZSIgY2hhcmFjdGVycy4KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIGxpbmVzIGFuZCBib3hlcworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCAgICAgICAgICAgIGhsaW5lKGludCBsZW4sIGNodHlwZSBjaD0wKSB7IHJldHVybiA6OndobGluZSh3LCBjaCwgbGVuKTsgfQorICAvLyBEcmF3IGEgaG9yaXpvbnRhbCBsaW5lIG9mIGxlbiBjaGFyYWN0ZXJzIHdpdGggdGhlIGdpdmVuIGNoYXJhY3Rlci4gSWYKKyAgLy8geW91IHBhc3MgemVybyBmb3IgdGhlIGNoYXJhY3RlciwgY3Vyc2VzIHdpbGwgdHJ5IHRvIGZpbmQgYSAibmljZSIgb25lLgorCisgIGludCAgICAgICAgICAgIGhsaW5lKGludCB5LCBpbnQgeCwgaW50IGxlbiwgY2h0eXBlIGNoPTApIHsKKyAgICByZXR1cm4gOjptdndobGluZSh3LCB5LCB4LCBjaCwgbGVuKTsgfQorICAvLyBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHJlcXVlc3RlZCBwb3NpdGlvbiBhbmQgdGhlbiBkcmF3IGEgaG9yaXpvbnRhbCBsaW5lLgorCisgIGludCAgICAgICAgICAgIHZsaW5lKGludCBsZW4sIGNodHlwZSBjaD0wKSB7IHJldHVybiA6Ond2bGluZSh3LCBjaCwgbGVuKTsgfQorICAvLyBEcmF3IGEgdmVydGljYWwgbGluZSBvZiBsZW4gY2hhcmFjdGVycyB3aXRoIHRoZSBnaXZlbiBjaGFyYWN0ZXIuIElmCisgIC8vIHlvdSBwYXNzIHplcm8gZm9yIHRoZSBjaGFyYWN0ZXIsIGN1cnNlcyB3aWxsIHRyeSB0byBmaW5kIGEgIm5pY2UiIG9uZS4KKworICBpbnQgICAgICAgICAgICB2bGluZShpbnQgeSwgaW50IHgsIGludCBsZW4sIGNodHlwZSBjaD0wKSB7CisgICAgcmV0dXJuIDo6bXZ3dmxpbmUodywgeSwgeCwgY2gsIGxlbik7IH0KKyAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gYW5kIHRoZW4gZHJhdyBhIHZlcnRpY2FsIGxpbmUuCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBlcmFzdXJlCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW50ICAgICAgICAgICAgZXJhc2UoKSB7IHJldHVybiA6OndlcmFzZSh3KTsgfQorICAvLyBFcmFzZSB0aGUgd2luZG93LgorCisgIGludCAgICAgICAgICAgIGNsZWFyKCkgeyByZXR1cm4gOjp3Y2xlYXIodyk7IH0KKyAgLy8gQ2xlYXIgdGhlIHdpbmRvdy4KKworICBpbnQgICAgICAgICAgICBjbGVhcm9rKGJvb2wgYmYpIHsgcmV0dXJuIDo6Y2xlYXJvayh3LCBiZik7IH0KKyAgLy8gU2V0L1Jlc2V0IHRoZSBjbGVhciBmbGFnLiBJZiBzZXQsIHRoZSBuZXh0IHJlZnJlc2goKSB3aWxsIGNsZWFyIHRoZQorICAvLyBzY3JlZW4uCisKKyAgaW50ICAgICAgICAgICAgY2xydG9ib3QoKSB7IHJldHVybiA6OndjbHJ0b2JvdCh3KTsgfQorICAvLyBDbGVhciB0byB0aGUgZW5kIG9mIHRoZSB3aW5kb3cuCisKKyAgaW50ICAgICAgICAgICAgY2xydG9lb2woKSB7IHJldHVybiA6OndjbHJ0b2VvbCh3KTsgfQorICAvLyBDbGVhciB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLgorCisgIGludCAgICAgICAgICAgIGRlbGNoKCkgeyByZXR1cm4gOjp3ZGVsY2godyk7IH0KKyAgLy8gRGVsZXRlIGNoYXJhY3RlciB1bmRlciB0aGUgY3Vyc29yLgorCisgIGludCAgICAgICAgICAgIGRlbGNoKGludCB5LCBpbnQgeCkgeyByZXR1cm4gOjptdndkZWxjaCh3LCB5LCB4KTsgfQorICAvLyBNb3ZlIGN1cnNvciB0byByZXF1ZXN0ZWQgcG9zaXRpb24gYW5kIGRlbGV0ZSB0aGUgY2hhcmFjdGVyIHVuZGVyIHRoZQorICAvLyBjdXJzb3IuCisKKyAgaW50ICAgICAgICAgICAgZGVsZXRlbG4oKSB7IHJldHVybiA6OndpbnNkZWxsbih3LCAtMSk7IH0KKyAgLy8gRGVsZXRlIHRoZSBjdXJyZW50IGxpbmUuCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBzY3JlZW4gY29udHJvbAorICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCAgICAgICAgICAgIHNjcm9sbChpbnQgYW1vdW50PTEpIHsgcmV0dXJuIDo6d3NjcmwodywgYW1vdW50KTsgfQorICAvLyBTY3JvbGwgYW1vdW50IGxpbmVzLiBJZiBhbW91bnQgaXMgcG9zaXRpdmUsIHNjcm9sbCB1cCwgb3RoZXJ3aXNlCisgIC8vIHNjcm9sbCBkb3duLgorCisgIGludCAgICAgICAgICAgIHNjcm9sbG9rKGJvb2wgYmYpIHsgcmV0dXJuIDo6c2Nyb2xsb2sodywgYmYpOyB9CisgIC8vIElmIGJmIGlzIFRSVUUsIHdpbmRvdyBzY3JvbGxzIGlmIGN1cnNvciBpcyBtb3ZlZCBvZmYgdGhlIGJvdHRvbQorICAvLyBlZGdlIG9mIHRoZSB3aW5kb3cgb3IgYSBzY3JvbGxpbmcgcmVnaW9uLCBvdGhlcndpc2UgdGhlIGN1cnNvciBpcyBsZWZ0CisgIC8vIGF0IHRoZSBib3R0b20gbGluZS4KKworICBpbnQgICAgICAgICAgICBzZXRzY3JyZWcoaW50IGZyb20sIGludCB0bykgeworICAgIHJldHVybiA6OndzZXRzY3JyZWcodywgZnJvbSwgdG8pOyB9CisgIC8vIERlZmluZSBhIHNvZnQgc2Nyb2xsaW5nIHJlZ2lvbi4KKworICBpbnQgICAgICAgICAgICBpZGxvayhib29sIGJmKSB7IHJldHVybiA6OmlkbG9rKHcsIGJmKTsgfQorICAvLyBJZiBiZiBpcyBUUlVFLCB1c2UgaW5zZXJ0L2RlbGV0ZSBsaW5lIGhhcmR3YXJlIHN1cHBvcnQgaWYgcG9zc2libGUuCisgIC8vIE90aGVyd2lzZSBkbyBpdCBpbiBzb2Z0d2FyZS4KKworICB2b2lkICAgICAgICAgICBpZGNvayhib29sIGJmKSB7IDo6aWRjb2sodywgYmYpOyB9CisgIC8vIElmIGJmIGlzIFRSVUUsIHVzZSBpbnNlcnQvZGVsZXRlIGNoYXJhY3RlciBoYXJkd2FyZSBzdXBwb3J0IGlmIHBvc3NpYmxlLgorICAvLyBPdGhlcndpc2UgZG8gaXQgaW4gc29mdHdhcmUuCisKKyAgaW50ICAgICAgICAgICAgdG91Y2hsaW5lKGludCBzLCBpbnQgYykgeyByZXR1cm4gOjp0b3VjaGxpbmUodywgcywgYyk7IH0KKyAgLy8gTWFyayB0aGUgZ2l2ZW4gbGluZXMgYXMgbW9kaWZpZWQuCisKKyAgaW50ICAgICAgICAgICAgdG91Y2h3aW4oKSAgIHsgcmV0dXJuIDo6d3RvdWNobG4odywgMCwgaGVpZ2h0KCksIDEpOyB9CisgIC8vIE1hcmsgdGhlIHdob2xlIHdpbmRvdyBhcyBtb2RpZmllZC4KKworICBpbnQgICAgICAgICAgICB1bnRvdWNod2luKCkgeyByZXR1cm4gOjp3dG91Y2hsbih3LCAwLCBoZWlnaHQoKSwgMCk7IH0KKyAgLy8gTWFyayB0aGUgd2hvbGUgd2luZG93IGFzIHVubW9kaWZpZWQuCisKKyAgaW50ICAgICAgICAgICAgdG91Y2hsbihpbnQgcywgaW50IGNudCwgYm9vbCBjaGFuZ2VkPVRSVUUpIHsKKyAgICByZXR1cm4gOjp3dG91Y2hsbih3LCBzLCBjbnQsIHN0YXRpY19jYXN0PGludD4oY2hhbmdlZCA/IDEgOiAwKSk7IH0KKyAgLy8gTWFyayBjbnQgbGluZXMgYmVnaW5uaW5nIGZyb20gbGluZSBzIGFzIGNoYW5nZWQgb3IgdW5jaGFuZ2VkLCBkZXBlbmRpbmcKKyAgLy8gb24gdGhlIHZhbHVlIG9mIHRoZSBjaGFuZ2VkIGZsYWcuCisKKyAgYm9vbCAgICAgICAgICAgaXNfbGluZXRvdWNoZWQoaW50IGxpbmUpIGNvbnN0IHsKKyAgICByZXR1cm4gKDo6aXNfbGluZXRvdWNoZWQodywgbGluZSkgPyBUUlVFOkZBTFNFKTsgfQorICAvLyBSZXR1cm4gVFJVRSBpZiBsaW5lIGlzIG1hcmtlZCBhcyBjaGFuZ2VkLCBGQUxTRSBvdGhlcndpc2UKKworICBib29sICAgICAgICAgICBpc193aW50b3VjaGVkKCkgY29uc3QgeworICAgIHJldHVybiAoOjppc193aW50b3VjaGVkKHcpID8gVFJVRTpGQUxTRSk7IH0KKyAgLy8gUmV0dXJuIFRSVUUgaWYgd2luZG93IGlzIG1hcmtlZCBhcyBjaGFuZ2VkLCBGQUxTRSBvdGhlcndpc2UKKworICBpbnQgICAgICAgICAgICBsZWF2ZW9rKGJvb2wgYmYpIHsgcmV0dXJuIDo6bGVhdmVvayh3LCBiZik7IH0KKyAgLy8gSWYgYmYgaXMgVFJVRSwgY3Vyc2VzIHdpbGwgbGVhdmUgdGhlIGN1cnNvciBhZnRlciBhbiB1cGRhdGUgd2hlcmVldmVyCisgIC8vIGl0IGlzIGFmdGVyIHRoZSB1cGRhdGUuCisKKyAgaW50ICAgICAgICAgICAgcmVkcmF3bG4oaW50IGZyb20sIGludCBuKSB7IHJldHVybiA6OndyZWRyYXdsbih3LCBmcm9tLCBuKTsgfQorICAvLyBSZWRyYXcgbiBsaW5lcyBzdGFydGluZyBmcm9tIHRoZSByZXF1ZXN0ZWQgbGluZQorCisgIGludCAgICAgICAgICAgIHJlZHJhd3dpbigpIHsgcmV0dXJuIDo6d3JlZHJhd2xuKHcsIDAsIGhlaWdodCgpKTsgfQorICAvLyBSZWRyYXcgdGhlIHdob2xlIHdpbmRvdworCisgIGludCAgICAgICAgICAgIGRvdXBkYXRlKCkgIHsgcmV0dXJuIDo6ZG91cGRhdGUoKTsgfQorICAvLyBEbyBhbGwgb3V0cHV0cyB0byBtYWtlIHRoZSBwaHlzaWNhbCBzY3JlZW4gbG9va2luZyBsaWtlIHRoZSB2aXJ0dWFsIG9uZQorCisgIHZvaWQgICAgICAgICAgIHN5bmNkb3duKCkgIHsgOjp3c3luY2Rvd24odyk7IH0KKyAgLy8gUHJvcGFnYXRlIHRoZSBjaGFuZ2VzIGRvd24gdG8gYWxsIGRlc2NlbmRhbnQgd2luZG93cworCisgIHZvaWQgICAgICAgICAgIHN5bmN1cCgpICAgIHsgOjp3c3luY3VwKHcpOyB9CisgIC8vIFByb3BhZ2F0ZSB0aGUgY2hhbmdlcyB1cCBpbiB0aGUgaGllcmFyY2h5CisKKyAgdm9pZCAgICAgICAgICAgY3Vyc3luY3VwKCkgeyA6OndjdXJzeW5jdXAodyk7IH0KKyAgLy8gUG9zaXRpb24gdGhlIGN1cnNvciBpbiBhbGwgYW5jZXN0b3Igd2luZG93cyBjb3JyZXNwb25kaW5nIHRvIG91ciBzZXR0aW5nCisKKyAgaW50ICAgICAgICAgICAgc3luY29rKGJvb2wgYmYpIHsgcmV0dXJuIDo6c3luY29rKHcsIGJmKTsgfQorICAvLyBJZiBjYWxsZWQgd2l0aCBiZj1UUlVFLCBzeW5jdXAoKSBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHdpbmRvdyBpcyBjaGFuZ2VkCisKKyNpZm5kZWYgX25vX2ZsdXNob2sKKyAgaW50ICAgICAgICAgICAgZmx1c2hvayhib29sIGJmKSB7IHJldHVybiA6OmZsdXNob2sodywgYmYpOyB9CisjZW5kaWYKKworICB2b2lkICAgICAgICAgICBpbW1lZG9rKGJvb2wgYmYpIHsgOjppbW1lZG9rKHcsIGJmKTsgfQorICAvLyBJZiBjYWxsZWQgd2l0aCBiZj1UUlVFLCBhbnkgY2hhbmdlIGluIHRoZSB3aW5kb3cgd2lsbCBjYXVzZSBhbgorICAvLyBhdXRvbWF0aWMgaW1tZWRpYXRlIHJlZnJlc2goKQorCisgIGludCAgICAgICAgICAgIGludHJmbHVzaChib29sIGJmKSB7IHJldHVybiA6OmludHJmbHVzaCh3LCBiZik7IH0KKworICBpbnQgICAgICAgICAgICBrZXlwYWQoYm9vbCBiZikgeyByZXR1cm4gOjprZXlwYWQodywgYmYpOyB9CisgIC8vIElmIGNhbGxlZCB3aXRoIGJmPVRSVUUsIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGludGVycHJldCBmdW5jdGlvbiBrZXlzLgorCisgIGludCAgICAgICAgICAgIG5vZGVsYXkoYm9vbCBiZikgeyByZXR1cm4gOjpub2RlbGF5KHcsIGJmKTsgfQorCisgIGludCAgICAgICAgICAgIG1ldGEoYm9vbCBiZikgeyByZXR1cm4gOjptZXRhKHcsIGJmKTsgfQorICAvLyBJZiBjYWxsZWQgd2l0aCBiZj1UUlVFLCBrZXlzIG1heSBnZW5lcmF0ZSA4LUJpdCBjaGFyYWN0ZXJzLiBPdGhlcndpc2UKKyAgLy8gNy1CaXQgY2hhcmFjdGVycyBhcmUgZ2VuZXJhdGVkLgorCisgIGludCAgICAgICAgICAgIHN0YW5kb3V0KCkgeyByZXR1cm4gOjp3c3RhbmRvdXQodyk7IH0KKyAgLy8gRW5hYmxlICJzdGFuZG91dCIgYXR0cmlidXRlcworCisgIGludCAgICAgICAgICAgIHN0YW5kZW5kKCkgeyByZXR1cm4gOjp3c3RhbmRlbmQodyk7IH0KKyAgLy8gRGlzYWJsZSAic3RhbmRvdXQiIGF0dHJpYnV0ZXMKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRoZSBuZXh0IHR3byBhcmUgdmlydHVhbCwgYmVjYXVzZSB3ZSByZWRlZmluZSB0aGVtIGluIHRoZQorICAvLyBOQ3Vyc2VzUGFuZWwgY2xhc3MuCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdmlydHVhbCBpbnQgICAgcmVmcmVzaCgpIHsgcmV0dXJuIDo6d3JlZnJlc2godyk7IH0KKyAgLy8gUHJvcGFnYXRlIHRoZSBjaGFuZ2VzIGluIHRoaXMgd2luZG93IHRvIHRoZSB2aXJ0dWFsIHNjcmVlbiBhbmQgY2FsbAorICAvLyBkb3VwZGF0ZSgpLiBUaGlzIGlzIHJlZGVmaW5lZCBpbiBOQ3Vyc2VzUGFuZWwuCisKKyAgdmlydHVhbCBpbnQgICAgbm91dHJlZnJlc2goKSB7IHJldHVybiA6Ondub3V0cmVmcmVzaCh3KTsgfQorICAvLyBQcm9wYWdhdGUgdGhlIGNoYW5nZXMgaW4gdGhpcyB3aW5kb3cgdG8gdGhlIHZpcnR1YWwgc2NyZWVuLiBUaGlzIGlzCisgIC8vIHJlZGVmaW5lZCBpbiBOQ3Vyc2VzUGFuZWwuCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBtdWx0aXBsZSB3aW5kb3cgY29udHJvbAorICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCAgICAgICAgICAgIG92ZXJsYXkoTkN1cnNlc1dpbmRvdyYgd2luKSB7CisgICAgcmV0dXJuIDo6b3ZlcmxheSh3LCB3aW4udyk7IH0KKyAgLy8gT3ZlcmxheSB0aGlzIHdpbmRvdyBvdmVyIHdpbi4KKworICBpbnQgICAgICAgICAgICBvdmVyd3JpdGUoTkN1cnNlc1dpbmRvdyYgd2luKSB7CisgICAgcmV0dXJuIDo6b3ZlcndyaXRlKHcsIHdpbi53KTsgfQorICAvLyBPdmVyd3JpdGUgd2luIHdpdGggdGhpcyB3aW5kb3cuCisKKyAgaW50ICAgICAgICAgICAgY29weXdpbihOQ3Vyc2VzV2luZG93JiB3aW4sCisJCQkgaW50IHNtaW5yb3csIGludCBzbWluY29sLAorCQkJIGludCBkbWlucm93LCBpbnQgZG1pbmNvbCwKKwkJCSBpbnQgZG1heHJvdywgaW50IGRtYXhjb2wsIGJvb2wgb3ZlcmxheXdpbj1UUlVFKSB7CisgICAgcmV0dXJuIDo6Y29weXdpbih3LCB3aW4udywgc21pbnJvdywgc21pbmNvbCwgZG1pbnJvdywgZG1pbmNvbCwKKwkJICAgICBkbWF4cm93LCBkbWF4Y29sLCBzdGF0aWNfY2FzdDxpbnQ+KG92ZXJsYXl3aW4gPyAxIDogMCkpOyB9CisgIC8vIE92ZXJsYXkgb3Igb3ZlcndyaXRlIHRoZSByZWN0YW5nbGUgaW4gd2luIGdpdmVuIGJ5IGRtaW5yb3csZG1pbmNvbCwKKyAgLy8gZG1heHJvdyxkbWF4Y29sIHdpdGggdGhlIHJlY3RhbmdsZSBpbiB0aGlzIHdpbmRvdyBiZWdpbm5pbmcgYXQKKyAgLy8gc21pbnJvdyxzbWluY29sLgorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gRXh0ZW5kZWQgZnVuY3Rpb25zCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiBkZWZpbmVkKE5DVVJTRVNfRVhUX0ZVTkNTKSAmJiAoTkNVUlNFU19FWFRfRlVOQ1MgIT0gMCkKKyAgaW50ICAgICAgICAgICAgd3Jlc2l6ZShpbnQgbmV3TGluZXMsIGludCBuZXdDb2x1bW5zKSB7CisgICAgcmV0dXJuIDo6d3Jlc2l6ZSh3LCBuZXdMaW5lcywgbmV3Q29sdW1ucyk7IH0KKyNlbmRpZgorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gTW91c2UgcmVsYXRlZAorICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgaGFzX21vdXNlKCkgY29uc3Q7CisgIC8vIFJldHVybiBUUlVFIGlmIHRlcm1pbmFsIHN1cHBvcnRzIGEgbW91c2UsIEZBTFNFIG90aGVyd2lzZQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gdHJhdmVyc2FsIHN1cHBvcnQKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBOQ3Vyc2VzV2luZG93KiAgY2hpbGQoKSB7IHJldHVybiBzdWJ3aW5zOyB9CisgIC8vIEdldCB0aGUgZmlyc3QgY2hpbGQgd2luZG93LgorCisgIE5DdXJzZXNXaW5kb3cqICBzaWJsaW5nKCkgeyByZXR1cm4gc2liOyB9CisgIC8vIEdldCB0aGUgbmV4dCBjaGlsZCBvZiBteSBwYXJlbnQuCisKKyAgTkN1cnNlc1dpbmRvdyogIHBhcmVudCgpIHsgcmV0dXJuIHBhcjsgfQorICAvLyBHZXQgbXkgcGFyZW50LgorCisgIGJvb2wgaXNEZXNjZW5kYW50KE5DdXJzZXNXaW5kb3cmIHdpbik7CisgIC8vIFJldHVybiBUUlVFIGlmIHdpbiBpcyBhIGRlc2NlbmRhbnQgb2YgdGhpcy4KK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdlIGxlYXZlIHRoaXMgaGVyZSBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2xhc3MgTkNVUlNFU19JTVBFWFAgTkN1cnNlc0NvbG9yV2luZG93IDogcHVibGljIE5DdXJzZXNXaW5kb3cKK3sKK3B1YmxpYzoKKyAgTkN1cnNlc0NvbG9yV2luZG93KFdJTkRPVyogJndpbmRvdykgICAvLyB1c2VmdWwgb25seSBmb3Igc3Rkc2NyCisgICAgOiBOQ3Vyc2VzV2luZG93KHdpbmRvdykgeworICAgICAgdXNlQ29sb3JzKCk7IH0KKworICBOQ3Vyc2VzQ29sb3JXaW5kb3coaW50IG5saW5lcywgICAgICAgIC8vIG51bWJlciBvZiBsaW5lcworCQkgICAgIGludCBuY29scywgICAgICAgICAvLyBudW1iZXIgb2YgY29sdW1ucworCQkgICAgIGludCBiZWdpbl95LCAgICAgICAvLyBsaW5lIG9yaWdpbgorCQkgICAgIGludCBiZWdpbl94KSAgICAgICAvLyBjb2wgb3JpZ2luCisgICAgOiBOQ3Vyc2VzV2luZG93KG5saW5lcywgbmNvbHMsIGJlZ2luX3ksIGJlZ2luX3gpIHsKKyAgICAgIHVzZUNvbG9ycygpOyB9CisKKyAgTkN1cnNlc0NvbG9yV2luZG93KE5DdXJzZXNXaW5kb3cmIHBhcmVudFdpbiwvLyBwYXJlbnQgd2luZG93CisJCSAgICAgaW50IG5saW5lcywgICAgICAgIC8vIG51bWJlciBvZiBsaW5lcworCQkgICAgIGludCBuY29scywgICAgICAgICAvLyBudW1iZXIgb2YgY29sdW1ucworCQkgICAgIGludCBiZWdpbl95LCAgICAgICAvLyBhYnNvbHV0ZSBvciByZWxhdGl2ZQorCQkgICAgIGludCBiZWdpbl94LCAgICAgICAvLyAgIG9yaWdpbnM6CisJCSAgICAgY2hhciBhYnNyZWwgPSAnYScpIC8vIGlmIGBhJywgYnkgJiBieCBhcmUKKyAgICA6IE5DdXJzZXNXaW5kb3cocGFyZW50V2luLAorCQkgICAgbmxpbmVzLCBuY29scywJLy8gYWJzb2x1dGUgc2NyZWVuIHBvcywKKwkJICAgIGJlZ2luX3ksIGJlZ2luX3gsICAgLy8gZWxzZSBpZiBgcicsIHRoZXkgYXJlCisJCSAgICBhYnNyZWwgKSB7ICAgICAgICAgIC8vIHJlbGF0aXZlIHRvIHBhciBvcmlnaW4KKyAgICAgIHVzZUNvbG9ycygpOyB9Cit9OworCisvLyBUaGVzZSBlbnVtIGRlZmluaXRpb25zIHJlYWxseSBiZWxvbmcgaW5zaWRlIHRoZSBOQ3Vyc2VzUGFkIGNsYXNzLCBidXQgb25seQorLy8gcmVjZW50IGNvbXBpbGVycyBzdXBwb3J0IHRoYXQgZmVhdHVyZS4KKworICB0eXBlZGVmIGVudW0geworICAgIFJFUV9QQURfUkVGUkVTSCA9IEtFWV9NQVggKyAxLAorICAgIFJFUV9QQURfVVAsCisgICAgUkVRX1BBRF9ET1dOLAorICAgIFJFUV9QQURfTEVGVCwKKyAgICBSRVFfUEFEX1JJR0hULAorICAgIFJFUV9QQURfRVhJVAorICB9IFBhZF9SZXF1ZXN0OworCisgIGNvbnN0IFBhZF9SZXF1ZXN0IFBBRF9MT1cgID0gUkVRX1BBRF9SRUZSRVNIOyAgIC8vIGxvd2VzdCAgb3AtY29kZQorICBjb25zdCBQYWRfUmVxdWVzdCBQQURfSElHSCA9IFJFUV9QQURfRVhJVDsgICAgICAvLyBoaWdoZXN0IG9wLWNvZGUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUGFkIFN1cHBvcnQuIFdlIGFsbG93IGFuIGFzc29jaWF0aW9uIG9mIGEgcGFkIHdpdGggYSAicmVhbCIgd2luZG93CisvLyB0aHJvdWdoIHdoaWNoIHRoZSBwYWQgbWF5IGJlIHZpZXdlZC4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNQYWQgOiBwdWJsaWMgTkN1cnNlc1dpbmRvdworeworcHJpdmF0ZToKKyAgTkN1cnNlc1dpbmRvdyogdmlld1dpbjsgICAgICAgLy8gdGhlICJ2aWV3cG9ydCIgd2luZG93CisgIE5DdXJzZXNXaW5kb3cqIHZpZXdTdWI7ICAgICAgIC8vIHRoZSAidmlld3BvcnQiIHN1YndpbmRvdworCisgIGludCBoX2dyaWRzaXplLCB2X2dyaWRzaXplOworCitwcm90ZWN0ZWQ6CisgIGludCBtaW5fcm93LCBtaW5fY29sOyAgICAgICAgIC8vIHRvcCBsZWZ0IHJvdy9jb2wgb2YgdGhlIHBhZHMgZGlzcGxheSBhcmVhCisKKyAgTkN1cnNlc1dpbmRvdyogV2luKHZvaWQpIGNvbnN0IHsKKyAgICAvLyBHZXQgdGhlIHdpbmRvdyBpbnRvIHdoaWNoIHRoZSBwYWQgc2hvdWxkIGJlIGNvcGllZCAoaWYgYW55KQorICAgIHJldHVybiAodmlld1N1Yj92aWV3U3ViOih2aWV3V2luP3ZpZXdXaW46MCkpOworICB9CisKKyAgTkN1cnNlc1dpbmRvdyogZ2V0V2luZG93KHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gdmlld1dpbjsKKyAgfQorCisgIE5DdXJzZXNXaW5kb3cqIGdldFN1YldpbmRvdyh2b2lkKSBjb25zdCB7CisgICAgcmV0dXJuIHZpZXdTdWI7CisgIH0KKworICB2aXJ0dWFsIGludCBkcml2ZXIgKGludCBrZXkpOyAgICAgIC8vIFZpcnR1YWxpemUga2V5c3Ryb2tlIGtleQorICAvLyBUaGUgZHJpdmVyIHRyYW5zbGF0ZXMgdGhlIGtleXN0cm9rZSBjIGludG8gYW4gUGFkX1JlcXVlc3QKKworICB2aXJ0dWFsIHZvaWQgT25Vbmtub3duT3BlcmF0aW9uKGludCBwYWRfcmVxKSB7CisgICAgOjpiZWVwKCk7CisgIH0KKyAgLy8gVGhpcyBpcyBjYWxsZWQgaWYgdGhlIGRyaXZlciByZXR1cm5zIGFuIHVua25vd24gb3AtY29kZQorCisgIHZpcnR1YWwgdm9pZCBPbk5hdmlnYXRpb25FcnJvcihpbnQgcGFkX3JlcSkgeworICAgIDo6YmVlcCgpOworICB9CisgIC8vIFRoaXMgaXMgY2FsbGVkIGlmIGEgbmF2aWdhdGlvbiByZXF1ZXN0IGNvdWxkbid0IGJlIHNhdGlzZmllZAorCisgIHZpcnR1YWwgdm9pZCBPbk9wZXJhdGlvbihpbnQgcGFkX3JlcSkgeworICB9OworICAvLyBPbk9wZXJhdGlvbiBpcyBjYWxsZWQgaWYgYSBQYWRfT3BlcmF0aW9uIHdhcyBleGVjdXRlZCBhbmQganVzdCBiZWZvcmUKKyAgLy8gdGhlIHJlZnJlc2goKSBvcGVyYXRpb24gaXMgZG9uZS4KKworcHVibGljOgorICBOQ3Vyc2VzUGFkKGludCBubGluZXMsIGludCBuY29scyk7CisgIC8vIGNyZWF0ZSBhIHBhZCB3aXRoIHRoZSBnaXZlbiBzaXplCisKKyAgTkN1cnNlc1BhZCYgb3BlcmF0b3I9KGNvbnN0IE5DdXJzZXNQYWQmIHJocykKKyAgeworICAgIGlmICh0aGlzICE9ICZyaHMpIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgICAgTkN1cnNlc1dpbmRvdzo6b3BlcmF0b3I9KHJocyk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE5DdXJzZXNQYWQoY29uc3QgTkN1cnNlc1BhZCYgcmhzKQorICAgIDogTkN1cnNlc1dpbmRvdyhyaHMpLAorICAgICAgdmlld1dpbihyaHMudmlld1dpbiksCisgICAgICB2aWV3U3ViKHJocy52aWV3U3ViKSwKKyAgICAgIGhfZ3JpZHNpemUocmhzLmhfZ3JpZHNpemUpLAorICAgICAgdl9ncmlkc2l6ZShyaHMudl9ncmlkc2l6ZSksCisgICAgICBtaW5fcm93KHJocy5taW5fcm93KSwKKyAgICAgIG1pbl9jb2wocmhzLm1pbl9jb2wpCisgIHsKKyAgfQorCisgIHZpcnR1YWwgfk5DdXJzZXNQYWQoKSB7fQorCisgIGludCBlY2hvY2hhcihjb25zdCBjaHR5cGUgY2gpIHsgcmV0dXJuIDo6cGVjaG9jaGFyKHcsIGNoKTsgfQorICAvLyBQdXQgdGhlIGF0dHJpYnV0ZWQgY2hhcmFjdGVyIG9udG8gdGhlIHBhZCBhbmQgaW1tZWRpYXRlbHkgZG8gYQorICAvLyBwcmVmcmVzaCgpLgorCisgIGludCByZWZyZXNoKCk7CisgIC8vIElmIGEgdmlld3BvcnQgaXMgZGVmaW5lZCB0aGUgcGFkIGlzIGRpc3BsYXllZCBpbiB0aGlzIHdpbmRvdywgb3RoZXJ3aXNlCisgIC8vIHRoaXMgaXMgYSBub29wLgorCisgIGludCByZWZyZXNoKGludCBwbWlucm93LCBpbnQgcG1pbmNvbCwKKwkgICAgICBpbnQgc21pbnJvdywgaW50IHNtaW5jb2wsCisJICAgICAgaW50IHNtYXhyb3csIGludCBzbWF4Y29sKSB7CisgICAgcmV0dXJuIDo6cHJlZnJlc2godywgcG1pbnJvdywgcG1pbmNvbCwKKwkJICAgICAgc21pbnJvdywgc21pbmNvbCwgc21heHJvdywgc21heGNvbCk7CisgIH0KKyAgLy8gVGhlIGNvb3JkaW5hdGVzIHNtaW5yb3csc21pbmNvbCxzbWF4cm93LHNtYXhjb2wgZGVzY3JpYmUgYSByZWN0YW5nbGUKKyAgLy8gb24gdGhlIHNjcmVlbi4gPGI+cmVmcmVzaDwvYj4gY29waWVzIGEgcmVjdGFuZ2xlIG9mIHRoaXMgc2l6ZSBiZWdpbm5pbmcKKyAgLy8gd2l0aCB0b3AgbGVmdCBjb3JuZXIgcG1pbnJvdyxwbWluY29sIG9udG8gdGhlIHNjcmVlbiBhbmQgY2FsbHMgZG91cGRhdGUoKS4KKworICBpbnQgbm91dHJlZnJlc2goKTsKKyAgLy8gSWYgYSB2aWV3cG9ydCBpcyBkZWZpbmVkIHRoZSBwYWQgaXMgZGlzcGxheWVkIGluIHRoaXMgd2luZG93LCBvdGhlcndpc2UKKyAgLy8gdGhpcyBpcyBhIG5vb3AuCisKKyAgaW50IG5vdXRyZWZyZXNoKGludCBwbWlucm93LCBpbnQgcG1pbmNvbCwKKwkJICBpbnQgc21pbnJvdywgaW50IHNtaW5jb2wsCisJCSAgaW50IHNtYXhyb3csIGludCBzbWF4Y29sKSB7CisgICAgcmV0dXJuIDo6cG5vdXRyZWZyZXNoKHcsIHBtaW5yb3csIHBtaW5jb2wsCisJCQkgIHNtaW5yb3csIHNtaW5jb2wsIHNtYXhyb3csIHNtYXhjb2wpOworICB9CisgIC8vIERvZXMgdGhlIHNhbWUgYXMgcmVmcmVzaCgpIGJ1dCB3aXRob3V0IGNhbGxpbmcgZG91cGRhdGUoKS4KKworICB2aXJ0dWFsIHZvaWQgc2V0V2luZG93KE5DdXJzZXNXaW5kb3cmIHZpZXcsIGludCB2X2dyaWQgPSAxLCBpbnQgaF9ncmlkID0gMSk7CisgIC8vIEFkZCB0aGUgd2luZG93ICJ2aWV3IiBhcyB2aWV3aW5nIHdpbmRvdyB0byB0aGUgcGFkLgorCisgIHZpcnR1YWwgdm9pZCBzZXRTdWJXaW5kb3coTkN1cnNlc1dpbmRvdyYgc3ViKTsKKyAgLy8gVXNlIHRoZSBzdWJ3aW5kb3cgInN1YiIgb2YgdGhlIHZpZXdwb3J0IHdpbmRvdyBmb3IgdGhlIGFjdHVhbCB2aWV3aW5nLgorICAvLyBUaGUgZnVsbCB2aWV3cG9ydCB3aW5kb3cgaXMgdXN1YWxseSB1c2VkIHRvIHByb3ZpZGUgc29tZSBkZWNvcmF0aW9ucworICAvLyBsaWtlIGZyYW1lcywgdGl0bGVzIGV0Yy4KKworICB2aXJ0dWFsIHZvaWQgb3BlcmF0b3IoKSAodm9pZCk7CisgIC8vIFBlcmZvcm0gUGFkJ3Mgb3BlcmF0aW9uCit9OworCisvLyBBIEZyYW1lZFBhZCBpcyBjb25zdHJ1Y3RlZCBhbHdheXMgd2l0aCBhIHZpZXdwb3J0IHdpbmRvdy4gVGhpcyB2aWV3cG9ydAorLy8gd2lsbCBiZSBmcmFtZWQgKGJ5IGEgYm94KCkgY29tbWFuZCkgYW5kIHRoZSBpbnRlcmlvciBvZiB0aGUgYm94IGlzIHRoZQorLy8gdmlld3BvcnQgc3Vid2luZG93LiBPbiB0aGUgZnJhbWUgd2UgZGlzcGxheSBzY3JvbGxiYXIgc2xpZGVycy4KK2NsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNGcmFtZWRQYWQgOiBwdWJsaWMgTkN1cnNlc1BhZAoreworcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgT25PcGVyYXRpb24oaW50IHBhZF9yZXEpOworCitwdWJsaWM6CisgIE5DdXJzZXNGcmFtZWRQYWQoTkN1cnNlc1dpbmRvdyYgd2luLCBpbnQgbmxpbmVzLCBpbnQgbmNvbHMsCisJCSAgIGludCB2X2dyaWQgPSAxLCBpbnQgaF9ncmlkID0gMSkKKyAgICA6IE5DdXJzZXNQYWQobmxpbmVzLCBuY29scykgeworICAgIE5DdXJzZXNQYWQ6OnNldFdpbmRvdyh3aW4sIHZfZ3JpZCwgaF9ncmlkKTsKKyAgICBOQ3Vyc2VzUGFkOjpzZXRTdWJXaW5kb3coKihuZXcgTkN1cnNlc1dpbmRvdyh3aW4pKSk7CisgIH0KKyAgLy8gQ29uc3RydWN0IHRoZSBGcmFtZWRQYWQgd2l0aCB0aGUgZ2l2ZW4gV2luZG93IHdpbiBhcyB2aWV3cG9ydC4KKworICB2aXJ0dWFsIH5OQ3Vyc2VzRnJhbWVkUGFkKCkgeworICAgIGRlbGV0ZSBnZXRTdWJXaW5kb3coKTsKKyAgfQorCisgIHZvaWQgc2V0V2luZG93KE5DdXJzZXNXaW5kb3cmIHZpZXcsIGludCB2X2dyaWQgPSAxLCBpbnQgaF9ncmlkID0gMSkgeworICAgIGVycl9oYW5kbGVyKCJPcGVyYXRpb24gbm90IGFsbG93ZWQiKTsKKyAgfQorICAvLyBEaXNhYmxlIHRoaXMgY2FsbDsgdGhlIHZpZXdwb3J0IGlzIGFscmVhZHkgZGVmaW5lZAorCisgIHZvaWQgc2V0U3ViV2luZG93KE5DdXJzZXNXaW5kb3cmIHN1YikgeworICAgIGVycl9oYW5kbGVyKCJPcGVyYXRpb24gbm90IGFsbG93ZWQiKTsKKyAgfQorICAvLyBEaXNhYmxlIHRoaXMgY2FsbDsgdGhlIHZpZXdwb3J0IHN1YndpbmRvdyBpcyBhbHJlYWR5IGRlZmluZWQKKworfTsKKworI2VuZGlmIC8qIE5DVVJTRVNfQ1VSU0VTV19IX2luY2wgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc3Nsay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzc2xrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkxNjk1ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc3Nsay5oCkBAIC0wLDAgKzEsMjM4IEBACisvLyAqIHRoaXMgaXMgZm9yIG1ha2luZyBlbWFjcyBoYXBweTogLSotTW9kZTogQysrOy0qLQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzLDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgICoKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgICAgICAgICAgICAqCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nICAgICAgKgorICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAgICAgICoKKyAqIGRpc3RyaWJ1dGUsIGRpc3RyaWJ1dGUgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgICAgICAqCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgICAgKgorICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAgKgorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgKgorICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiAgICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgKgorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SICAgICoKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAqCisgKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAqCisgKiBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSAgICAgKgorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuICAgICAgICoKKyAqIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQXV0aG9yOiBKdWVyZ2VuIFBmZWlmZXIsIDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gJElkOiBjdXJzc2xrLmgsdiAxLjEzIDIwMDUvMDUvMjggMjE6NTg6MTggdG9tIEV4cCAkCisKKyNpZm5kZWYgTkNVUlNFU19DVVJTU0xLX0hfaW5jbAorI2RlZmluZSBOQ1VSU0VTX0NVUlNTTEtfSF9pbmNsCisKKyNpbmNsdWRlIDxjdXJzZXN3Lmg+CisKK2NsYXNzIE5DVVJTRVNfSU1QRVhQIFNvZnRfTGFiZWxfS2V5X1NldCB7CitwdWJsaWM6CisgIC8vIFRoaXMgaW5uZXIgY2xhc3MgcmVwcmVzZW50cyB0aGUgYXR0cmlidXRlcyBvZiBhIFNvZnQgTGFiZWwgS2V5IChTTEspCisgIGNsYXNzIE5DVVJTRVNfSU1QRVhQIFNvZnRfTGFiZWxfS2V5IHsKKyAgICBmcmllbmQgY2xhc3MgU29mdF9MYWJlbF9LZXlfU2V0OworICBwdWJsaWM6CisgICAgdHlwZWRlZiBlbnVtIHsgTGVmdD0wLCBDZW50ZXI9MSwgUmlnaHQ9MiB9IEp1c3RpZmljYXRpb247CisKKyAgcHJpdmF0ZToKKyAgICBjaGFyICpsYWJlbDsgICAgICAgICAgIC8vIFRoZSBUZXh0IG9mIHRoZSBMYWJlbAorICAgIEp1c3RpZmljYXRpb24gZm9ybWF0OyAgLy8gVGhlIEp1c3RpZmljYXRpb24KKyAgICBpbnQgbnVtOyAgICAgICAgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgdGhlIExhYmVsCisKKyAgICBTb2Z0X0xhYmVsX0tleSgpIDogbGFiZWwoTlVMTCksIGZvcm1hdChMZWZ0KSwgbnVtKC0xKSB7CisgICAgfQorCisgICAgdmlydHVhbCB+U29mdF9MYWJlbF9LZXkoKSB7CisgICAgICBkZWxldGVbXSBsYWJlbDsKKyAgICB9OworCisgIHB1YmxpYzoKKyAgICAvLyBTZXQgdGhlIHRleHQgb2YgdGhlIExhYmVsCisgICAgU29mdF9MYWJlbF9LZXkmIG9wZXJhdG9yPShjaGFyICp0ZXh0KTsKKworICAgIC8vIFNldCB0aGUgSnVzdGlmaWNhdGlvbiBvZiB0aGUgTGFiZWwKKyAgICBTb2Z0X0xhYmVsX0tleSYgb3BlcmF0b3I9KEp1c3RpZmljYXRpb24ganVzdCkgeworICAgICAgZm9ybWF0ID0ganVzdDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLyBSZXRyaWV2ZSB0aGUgdGV4dCBvZiB0aGUgbGFiZWwKKyAgICBpbmxpbmUgY2hhciogb3BlcmF0b3IoKSh2b2lkKSBjb25zdCB7CisgICAgICByZXR1cm4gbGFiZWw7CisgICAgfQorCisgICAgU29mdF9MYWJlbF9LZXkmIG9wZXJhdG9yPShjb25zdCBTb2Z0X0xhYmVsX0tleSYgcmhzKQorICAgIHsKKyAgICAgIGlmICh0aGlzICE9ICZyaHMpIHsKKyAgICAgICAgKnRoaXMgPSByaHM7CisgICAgICB9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU29mdF9MYWJlbF9LZXkoY29uc3QgU29mdF9MYWJlbF9LZXkmIHJocykKKyAgICAgIDogbGFiZWwoTlVMTCksCisgICAgICAgIGZvcm1hdChyaHMuZm9ybWF0KSwKKyAgICAgICAgbnVtKHJocy5udW0pCisgICAgeworICAgICAgKnRoaXMgPSByaHMubGFiZWw7CisgICAgfQorICB9OworCitwdWJsaWM6CisgIHR5cGVkZWYgZW51bSB7CisgICAgTm9uZSAgICAgICAgICAgICAgICA9IC0xLAorICAgIFRocmVlX1R3b19UaHJlZSAgICAgPSAwLAorICAgIEZvdXJfRm91ciAgICAgICAgICAgPSAxLAorICAgIFBDX1N0eWxlICAgICAgICAgICAgPSAyLAorICAgIFBDX1N0eWxlX1dpdGhfSW5kZXggPSAzCisgIH0gTGFiZWxfTGF5b3V0OworCitwcml2YXRlOgorICBzdGF0aWMgbG9uZyBOQ1VSU0VTX0lNUEVYUCBjb3VudDsgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgS2V5IFNldHMKKyAgc3RhdGljIExhYmVsX0xheW91dCBOQ1VSU0VTX0lNUEVYUCAgZm9ybWF0OyAgICAgLy8gTGF5b3V0IG9mIHRoZSBLZXkgU2V0cworICBzdGF0aWMgaW50ICBOQ1VSU0VTX0lNUEVYUCBudW1fbGFiZWxzOyAgICAgICAgICAvLyBOdW1iZXIgT2YgTGFiZWxzIGluIEtleSBTZXRzCisgIGJvb2wgTkNVUlNFU19JTVBFWFAgYl9hdHRySW5pdDsgICAgICAgICAgICAgICAgIC8vIEFyZSBhdHRyaWJ1dGVzIGluaXRpYWxpemVkCisKKyAgU29mdF9MYWJlbF9LZXkgKnNsa19hcnJheTsgICAgICAgLy8gVGhlIGFycmF5IG9mIFNMSydzCisKKyAgLy8gSW5pdCB0aGUgS2V5IFNldAorICB2b2lkIGluaXQoKTsKKworICAvLyBBY3RpdmF0ZSBvciBEZWFjdGl2YXRlIExhYmVsIyBpLCBMYWJlbCBjb3VudGluZyBzdGFydHMgd2l0aCAxIQorICB2b2lkIGFjdGl2YXRlX2xhYmVsKGludCBpLCBib29sIGJmPVRSVUUpOworCisgIC8vIEFjdGl2YXRlIG9mIERlYWN0aXZhdGUgYWxsIExhYmVscworICB2b2lkIGFjdGl2YXRlX2xhYmVscyhib29sIGJmKTsKKworcHJvdGVjdGVkOgorICBpbmxpbmUgdm9pZCBFcnJvciAoY29uc3QgY2hhciogbXNnKSBjb25zdCBUSFJPV1MoTkN1cnNlc0V4Y2VwdGlvbikgeworICAgIFRIUk9XKG5ldyBOQ3Vyc2VzRXhjZXB0aW9uIChtc2cpKTsKKyAgfQorCisgIC8vIFJlbW92ZSBTTEsncyBmcm9tIHNjcmVlbgorICB2b2lkIGNsZWFyKCkgeworICAgIGlmIChFUlI9PTo6c2xrX2NsZWFyKCkpCisgICAgICBFcnJvcigic2xrX2NsZWFyIik7CisgIH0KKworICAvLyBSZXN0b3JlIHRoZW0KKyAgdm9pZCByZXN0b3JlKCkgeworICAgIGlmIChFUlI9PTo6c2xrX3Jlc3RvcmUoKSkKKyAgICAgIEVycm9yKCJzbGtfcmVzdG9yZSIpOworICB9CisKK3B1YmxpYzoKKworICAvLyBDb25zdHJ1Y3QgYSBLZXkgU2V0LCB1c2UgdGhlIG1vc3QgY29tZm9ydGFibGUgbGF5b3V0IGFzIGRlZmF1bHQuCisgIC8vIFlvdSBtdXN0IGNyZWF0ZSBhIFNvZnRfTGFiZWxfS2V5X1NldCBiZWZvcmUgeW91IGNyZWF0ZSBhbnkgb2JqZWN0IG9mCisgIC8vIHRoZSBOQ3Vyc2VzV2luZG93LCBOQ3Vyc2VzUGFuZWwgb3IgZGVyaXZlZCBjbGFzc2VzLiAoQWN0dWFsbHkgYmVmb3JlCisgIC8vIDo6aW5pdHNjcigpIGlzIGNhbGxlZCkuCisgIFNvZnRfTGFiZWxfS2V5X1NldChMYWJlbF9MYXlvdXQgZm10KTsKKworICAvLyBUaGlzIGNvbnN0cnVjdG9yIGFzc3VtZXMsIHRoYXQgeW91IGFscmVhZHkgY29uc3RydWN0ZWQgYSBLZXkgU2V0CisgIC8vIHdpdGggYSBsYXlvdXQgYnkgdGhlIGNvbnN0cnVjdG9yIGFib3ZlLiBUaGlzIGxheW91dCB3aWxsIGJlIHJldXNlZC4KKyAgTkNVUlNFU19JTVBFWFAgU29mdF9MYWJlbF9LZXlfU2V0KCk7CisKKyAgU29mdF9MYWJlbF9LZXlfU2V0JiBvcGVyYXRvcj0oY29uc3QgU29mdF9MYWJlbF9LZXlfU2V0JiByaHMpCisgIHsKKyAgICBpZiAodGhpcyAhPSAmcmhzKSB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICAgIGluaXQoKTsJCS8vIGFsbG9jYXRlIGEgbmV3IHNsa19hcnJheVtdCisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFNvZnRfTGFiZWxfS2V5X1NldChjb25zdCBTb2Z0X0xhYmVsX0tleV9TZXQmIHJocykKKyAgICA6IGJfYXR0ckluaXQocmhzLmJfYXR0ckluaXQpLAorICAgICAgc2xrX2FycmF5KE5VTEwpCisgIHsKKyAgICBpbml0KCk7CQkvLyBhbGxvY2F0ZSBhIG5ldyBzbGtfYXJyYXlbXQorICB9CisKKyAgdmlydHVhbCB+U29mdF9MYWJlbF9LZXlfU2V0KCk7CisKKyAgLy8gR2V0IExhYmVsIyBpLiBMYWJlbCBjb3VudGluZyBzdGFydHMgd2l0aCAxIQorICBOQ1VSU0VTX0lNUEVYUCBTb2Z0X0xhYmVsX0tleSYgb3BlcmF0b3JbXShpbnQgaSk7CisKKyAgLy8gUmV0cmlldmUgbnVtYmVyIG9mIExhYmVscworICBpbmxpbmUgaW50IGxhYmVscygpIGNvbnN0IHsgcmV0dXJuIG51bV9sYWJlbHM7IH0KKworICAvLyBSZWZyZXNoIHRoZSBTTEsgcG9ydGlvbiBvZiB0aGUgc2NyZWVuCisgIGlubGluZSB2b2lkIHJlZnJlc2goKSB7CisgICAgaWYgKEVSUj09OjpzbGtfcmVmcmVzaCgpKQorICAgICAgRXJyb3IoInNsa19yZWZyZXNoIik7CisgIH0KKworICAvLyBNYXJrIHRoZSBTTEsgcG9ydGlvbiBvZiB0aGUgc2NyZWVuIGZvciByZWZyZXNoLCBkZWZlciBhY3R1YWwgcmVmcmVzaAorICAvLyB1bnRpbCBuZXh0IHVwZGF0ZSBjYWxsLgorICBpbmxpbmUgdm9pZCBub3V0cmVmcmVzaCgpIHsKKyAgICBpZiAoRVJSPT06OnNsa19ub3V0cmVmcmVzaCgpKQorICAgICAgRXJyb3IoInNsa19ub3V0cmVmcmVzaCIpOworICB9CisKKyAgLy8gTWFyayB0aGUgd2hvbGUgU0xLIHBvcnRpb24gb2YgdGhlIHNjcmVlbiBhcyBtb2RpZmllZAorICBpbmxpbmUgdm9pZCB0b3VjaCgpIHsKKyAgICBpZiAoRVJSPT06OnNsa190b3VjaCgpKQorICAgICAgRXJyb3IoInNsa190b3VjaCIpOworICB9CisKKyAgLy8gQWN0aXZhdGUgTGFiZWwjIGkKKyAgaW5saW5lIHZvaWQgc2hvdyhpbnQgaSkgeworICAgIGFjdGl2YXRlX2xhYmVsKGksRkFMU0UpOworICAgIGFjdGl2YXRlX2xhYmVsKGksVFJVRSk7CisgIH0KKworICAvLyBIaWRlIExhYmVsIyBpCisgIGlubGluZSB2b2lkIGhpZGUoaW50IGkpIHsKKyAgICBhY3RpdmF0ZV9sYWJlbChpLEZBTFNFKTsKKyAgfQorCisgIC8vIFNob3cgYWxsIExhYmVscworICBpbmxpbmUgdm9pZCBzaG93KCkgeworICAgIGFjdGl2YXRlX2xhYmVscyhGQUxTRSk7CisgICAgYWN0aXZhdGVfbGFiZWxzKFRSVUUpOworICB9CisKKyAgLy8gSGlkZSBhbGwgTGFiZWxzCisgIGlubGluZSB2b2lkIGhpZGUoKSB7CisgICAgYWN0aXZhdGVfbGFiZWxzKEZBTFNFKTsKKyAgfQorCisgIGlubGluZSB2b2lkIGF0dHJvbihhdHRyX3QgYXR0cnMpIHsKKyAgICBpZiAoRVJSPT06OnNsa19hdHRyb24oYXR0cnMpKQorICAgICAgRXJyb3IoInNsa19hdHRyb24iKTsKKyAgfQorCisgIGlubGluZSB2b2lkIGF0dHJvZmYoYXR0cl90IGF0dHJzKSB7CisgICAgaWYgKEVSUj09OjpzbGtfYXR0cm9mZihhdHRycykpCisgICAgICBFcnJvcigic2xrX2F0dHJvZmYiKTsKKyAgfQorCisgIGlubGluZSB2b2lkIGF0dHJzZXQoYXR0cl90IGF0dHJzKSB7CisgICAgaWYgKEVSUj09OjpzbGtfYXR0cnNldChhdHRycykpCisgICAgICBFcnJvcigic2xrX2F0dHJzZXQiKTsKKyAgfQorCisgIGlubGluZSB2b2lkIGNvbG9yKHNob3J0IGNvbG9yX3BhaXJfbnVtYmVyKSB7CisgICAgaWYgKEVSUj09OjpzbGtfY29sb3IoY29sb3JfcGFpcl9udW1iZXIpKQorICAgICAgRXJyb3IoInNsa19jb2xvciIpOworICB9CisKKyAgaW5saW5lIGF0dHJfdCBhdHRyKCkgY29uc3QgeworICAgIHJldHVybiA6OnNsa19hdHRyKCk7CisgIH0KK307CisKKyNlbmRpZiAvKiBOQ1VSU0VTX0NVUlNTTEtfSF9pbmNsICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2RpcmVudC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9kaXJlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTVhMGVmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9kaXJlbnQuaApAQCAtMCwwICsxLDQwNSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTIwMDAsMjAwMy0yMDA1LDIwMDksMjAxMCwyMDExCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCVBPU0lYIFN0YW5kYXJkOiA1LjEuMiBEaXJlY3RvcnkgT3BlcmF0aW9ucwk8ZGlyZW50Lmg+CisgKi8KKworI2lmbmRlZglfRElSRU5UX0gKKyNkZWZpbmUJX0RJUkVOVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworI2lmZGVmIF9fVVNFX1hPUEVOCisjIGlmbmRlZiBfX2lub190X2RlZmluZWQKKyMgIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0Cit0eXBlZGVmIF9faW5vX3QgaW5vX3Q7CisjICBlbHNlCit0eXBlZGVmIF9faW5vNjRfdCBpbm9fdDsKKyMgIGVuZGlmCisjICBkZWZpbmUgX19pbm9fdF9kZWZpbmVkCisjIGVuZGlmCisjIGlmIGRlZmluZWQgX19VU0VfTEFSR0VGSUxFNjQgJiYgIWRlZmluZWQgX19pbm82NF90X2RlZmluZWQKK3R5cGVkZWYgX19pbm82NF90IGlubzY0X3Q7CisjICBkZWZpbmUgX19pbm82NF90X2RlZmluZWQKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBUaGlzIGZpbGUgZGVmaW5lcyBgc3RydWN0IGRpcmVudCcuCisKKyAgIEl0IGRlZmluZXMgdGhlIG1hY3JvIGBfRElSRU5UX0hBVkVfRF9OQU1MRU4nIGlmZiB0aGVyZSBpcyBhIGBkX25hbWxlbicKKyAgIG1lbWJlciB0aGF0IGdpdmVzIHRoZSBsZW5ndGggb2YgYGRfbmFtZScuCisKKyAgIEl0IGRlZmluZXMgdGhlIG1hY3JvIGBfRElSRU5UX0hBVkVfRF9SRUNMRU4nIGlmZiB0aGVyZSBpcyBhIGBkX3JlY2xlbicKKyAgIG1lbWJlciB0aGF0IGdpdmVzIHRoZSBzaXplIG9mIHRoZSBlbnRpcmUgZGlyZWN0b3J5IGVudHJ5LgorCisgICBJdCBkZWZpbmVzIHRoZSBtYWNybyBgX0RJUkVOVF9IQVZFX0RfT0ZGJyBpZmYgdGhlcmUgaXMgYSBgZF9vZmYnCisgICBtZW1iZXIgdGhhdCBnaXZlcyB0aGUgZmlsZSBvZmZzZXQgb2YgdGhlIG5leHQgZGlyZWN0b3J5IGVudHJ5LgorCisgICBJdCBkZWZpbmVzIHRoZSBtYWNybyBgX0RJUkVOVF9IQVZFX0RfVFlQRScgaWZmIHRoZXJlIGlzIGEgYGRfdHlwZScKKyAgIG1lbWJlciB0aGF0IGdpdmVzIHRoZSB0eXBlIG9mIHRoZSBmaWxlLgorICovCisKKyNpbmNsdWRlIDxiaXRzL2RpcmVudC5oPgorCisjaWYgKGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfTUlTQykgJiYgIWRlZmluZWQgZF9maWxlbm8KKyMgZGVmaW5lIGRfaW5vCWRfZmlsZW5vCQkgLyogQmFja3dhcmQgY29tcGF0aWJpbGl0eS4gICovCisjZW5kaWYKKworLyogVGhlc2UgbWFjcm9zIGV4dHJhY3Qgc2l6ZSBpbmZvcm1hdGlvbiBmcm9tIGEgYHN0cnVjdCBkaXJlbnQgKicuCisgICBUaGV5IG1heSBldmFsdWF0ZSB0aGVpciBhcmd1bWVudCBtdWx0aXBsZSB0aW1lcywgc28gaXQgbXVzdCBub3QKKyAgIGhhdmUgc2lkZSBlZmZlY3RzLiAgRWFjaCBvZiB0aGVzZSBtYXkgaW52b2x2ZSBhIHJlbGF0aXZlbHkgY29zdGx5CisgICBjYWxsIHRvIGBzdHJsZW4nIG9uIHNvbWUgc3lzdGVtcywgc28gdGhlc2UgdmFsdWVzIHNob3VsZCBiZSBjYWNoZWQuCisKKyAgIF9EX0VYQUNUX05BTUxFTiAoRFApCXJldHVybnMgdGhlIGxlbmd0aCBvZiBEUC0+ZF9uYW1lLCBub3QgaW5jbHVkaW5nCisgICBpdHMgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuCisKKyAgIF9EX0FMTE9DX05BTUxFTiAoRFApCXJldHVybnMgYSBzaXplIGF0IGxlYXN0IChfRF9FWEFDVF9OQU1MRU4gKERQKSArIDEpOworICAgdGhhdCBpcywgdGhlIGFsbG9jYXRpb24gc2l6ZSBuZWVkZWQgdG8gaG9sZCB0aGUgRFAtPmRfbmFtZSBzdHJpbmcuCisgICBVc2UgdGhpcyBtYWNybyB3aGVuIHlvdSBkb24ndCBuZWVkIHRoZSBleGFjdCBsZW5ndGgsIGp1c3QgYW4gdXBwZXIgYm91bmQuCisgICBUaGlzIG1hY3JvIGlzIGxlc3MgbGlrZWx5IHRvIHJlcXVpcmUgY2FsbGluZyBgc3RybGVuJyB0aGFuIF9EX0VYQUNUX05BTUxFTi4KKyAgICovCisKKyNpZmRlZiBfRElSRU5UX0hBVkVfRF9OQU1MRU4KKyMgZGVmaW5lIF9EX0VYQUNUX05BTUxFTihkKSAoKGQpLT5kX25hbWxlbikKKyMgZGVmaW5lIF9EX0FMTE9DX05BTUxFTihkKSAoX0RfRVhBQ1RfTkFNTEVOIChkKSArIDEpCisjZWxzZQorIyBkZWZpbmUgX0RfRVhBQ1RfTkFNTEVOKGQpIChzdHJsZW4gKChkKS0+ZF9uYW1lKSkKKyMgaWZkZWYgX0RJUkVOVF9IQVZFX0RfUkVDTEVOCisjICBkZWZpbmUgX0RfQUxMT0NfTkFNTEVOKGQpICgoKGNoYXIgKikgKGQpICsgKGQpLT5kX3JlY2xlbikgLSAmKGQpLT5kX25hbWVbMF0pCisjIGVsc2UKKyMgIGRlZmluZSBfRF9BTExPQ19OQU1MRU4oZCkgKHNpemVvZiAoZCktPmRfbmFtZSA+IDEgPyBzaXplb2YgKGQpLT5kX25hbWUgOiBcCisJCQkgICAgICBfRF9FWEFDVF9OQU1MRU4gKGQpICsgMSkKKyMgZW5kaWYKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIEZpbGUgdHlwZXMgZm9yIGBkX3R5cGUnLiAgKi8KK2VudW0KKyAgeworICAgIERUX1VOS05PV04gPSAwLAorIyBkZWZpbmUgRFRfVU5LTk9XTglEVF9VTktOT1dOCisgICAgRFRfRklGTyA9IDEsCisjIGRlZmluZSBEVF9GSUZPCURUX0ZJRk8KKyAgICBEVF9DSFIgPSAyLAorIyBkZWZpbmUgRFRfQ0hSCQlEVF9DSFIKKyAgICBEVF9ESVIgPSA0LAorIyBkZWZpbmUgRFRfRElSCQlEVF9ESVIKKyAgICBEVF9CTEsgPSA2LAorIyBkZWZpbmUgRFRfQkxLCQlEVF9CTEsKKyAgICBEVF9SRUcgPSA4LAorIyBkZWZpbmUgRFRfUkVHCQlEVF9SRUcKKyAgICBEVF9MTksgPSAxMCwKKyMgZGVmaW5lIERUX0xOSwkJRFRfTE5LCisgICAgRFRfU09DSyA9IDEyLAorIyBkZWZpbmUgRFRfU09DSwlEVF9TT0NLCisgICAgRFRfV0hUID0gMTQKKyMgZGVmaW5lIERUX1dIVAkJRFRfV0hUCisgIH07CisKKy8qIENvbnZlcnQgYmV0d2VlbiBzdGF0IHN0cnVjdHVyZSB0eXBlcyBhbmQgZGlyZWN0b3J5IHR5cGVzLiAgKi8KKyMgZGVmaW5lIElGVE9EVChtb2RlKQkoKChtb2RlKSAmIDAxNzAwMDApID4+IDEyKQorIyBkZWZpbmUgRFRUT0lGKGRpcnR5cGUpCSgoZGlydHlwZSkgPDwgMTIpCisjZW5kaWYKKworCisvKiBUaGlzIGlzIHRoZSBkYXRhIHR5cGUgb2YgZGlyZWN0b3J5IHN0cmVhbSBvYmplY3RzLgorICAgVGhlIGFjdHVhbCBzdHJ1Y3R1cmUgaXMgb3BhcXVlIHRvIHVzZXJzLiAgKi8KK3R5cGVkZWYgc3RydWN0IF9fZGlyc3RyZWFtIERJUjsKKworLyogT3BlbiBhIGRpcmVjdG9yeSBzdHJlYW0gb24gTkFNRS4KKyAgIFJldHVybiBhIERJUiBzdHJlYW0gb24gdGhlIGRpcmVjdG9yeSwgb3IgTlVMTCBpZiBpdCBjb3VsZCBub3QgYmUgb3BlbmVkLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBESVIgKm9wZW5kaXIgKF9fY29uc3QgY2hhciAqX19uYW1lKSBfX25vbm51bGwgKCgxKSk7CisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLOAorLyogU2FtZSBhcyBvcGVuZGlyLCBidXQgb3BlbiB0aGUgc3RyZWFtIG9uIHRoZSBmaWxlIGRlc2NyaXB0b3IgRkQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIERJUiAqZmRvcGVuZGlyIChpbnQgX19mZCk7CisjZW5kaWYKKworLyogQ2xvc2UgdGhlIGRpcmVjdG9yeSBzdHJlYW0gRElSUC4KKyAgIFJldHVybiAwIGlmIHN1Y2Nlc3NmdWwsIC0xIGlmIG5vdC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGNsb3NlZGlyIChESVIgKl9fZGlycCkgX19ub25udWxsICgoMSkpOworCisvKiBSZWFkIGEgZGlyZWN0b3J5IGVudHJ5IGZyb20gRElSUC4gIFJldHVybiBhIHBvaW50ZXIgdG8gYSBgc3RydWN0CisgICBkaXJlbnQnIGRlc2NyaWJpbmcgdGhlIGVudHJ5LCBvciBOVUxMIGZvciBFT0Ygb3IgZXJyb3IuICBUaGUKKyAgIHN0b3JhZ2UgcmV0dXJuZWQgbWF5IGJlIG92ZXJ3cml0dGVuIGJ5IGEgbGF0ZXIgcmVhZGRpciBjYWxsIG9uIHRoZQorICAgc2FtZSBESVIgc3RyZWFtLgorCisgICBJZiB0aGUgTGFyZ2UgRmlsZSBTdXBwb3J0IEFQSSBpcyBzZWxlY3RlZCB3ZSBoYXZlIHRvIHVzZSB0aGUKKyAgIGFwcHJvcHJpYXRlIGludGVyZmFjZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBzdHJ1Y3QgZGlyZW50ICpyZWFkZGlyIChESVIgKl9fZGlycCkgX19ub25udWxsICgoMSkpOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIHN0cnVjdCBkaXJlbnQgKl9fUkVESVJFQ1QgKHJlYWRkaXIsIChESVIgKl9fZGlycCksIHJlYWRkaXI2NCkKKyAgICAgX19ub25udWxsICgoMSkpOworIyBlbHNlCisjICBkZWZpbmUgcmVhZGRpciByZWFkZGlyNjQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBzdHJ1Y3QgZGlyZW50NjQgKnJlYWRkaXI2NCAoRElSICpfX2RpcnApIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9QT1NJWCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKy8qIFJlZW50cmFudCB2ZXJzaW9uIG9mIGByZWFkZGlyJy4gIFJldHVybiBpbiBSRVNVTFQgYSBwb2ludGVyIHRvIHRoZQorICAgbmV4dCBlbnRyeS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IHJlYWRkaXJfciAoRElSICpfX3Jlc3RyaWN0IF9fZGlycCwKKwkJICAgICAgc3RydWN0IGRpcmVudCAqX19yZXN0cmljdCBfX2VudHJ5LAorCQkgICAgICBzdHJ1Y3QgZGlyZW50ICoqX19yZXN0cmljdCBfX3Jlc3VsdCkKKyAgICAgX19ub25udWxsICgoMSwgMiwgMykpOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKHJlYWRkaXJfciwKKwkJICAgICAgIChESVIgKl9fcmVzdHJpY3QgX19kaXJwLAorCQkJc3RydWN0IGRpcmVudCAqX19yZXN0cmljdCBfX2VudHJ5LAorCQkJc3RydWN0IGRpcmVudCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpLAorCQkgICAgICAgcmVhZGRpcjY0X3IpIF9fbm9ubnVsbCAoKDEsIDIsIDMpKTsKKyMgIGVsc2UKKyMgICBkZWZpbmUgcmVhZGRpcl9yIHJlYWRkaXI2NF9yCisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IHJlYWRkaXI2NF9yIChESVIgKl9fcmVzdHJpY3QgX19kaXJwLAorCQkJc3RydWN0IGRpcmVudDY0ICpfX3Jlc3RyaWN0IF9fZW50cnksCisJCQlzdHJ1Y3QgZGlyZW50NjQgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KQorICAgICBfX25vbm51bGwgKCgxLCAyLCAzKSk7CisjIGVuZGlmCisjZW5kaWYJLyogUE9TSVggb3IgbWlzYyAqLworCisvKiBSZXdpbmQgRElSUCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkaXJlY3RvcnkuICAqLworZXh0ZXJuIHZvaWQgcmV3aW5kZGlyIChESVIgKl9fZGlycCkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorIyBpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKy8qIFNlZWsgdG8gcG9zaXRpb24gUE9TIG9uIERJUlAuICAqLworZXh0ZXJuIHZvaWQgc2Vla2RpciAoRElSICpfX2RpcnAsIGxvbmcgaW50IF9fcG9zKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogUmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIERJUlAuICAqLworZXh0ZXJuIGxvbmcgaW50IHRlbGxkaXIgKERJUiAqX19kaXJwKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKworLyogUmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3IgdXNlZCBieSBESVJQLiAgKi8KK2V4dGVybiBpbnQgZGlyZmQgKERJUiAqX19kaXJwKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworIyBpZiBkZWZpbmVkIF9fT1BUSU1JWkVfXyAmJiBkZWZpbmVkIF9ESVJfZGlyZmQKKyMgIGRlZmluZSBkaXJmZChkaXJwKQlfRElSX2RpcmZkIChkaXJwKQorIyBlbmRpZgorCisjIGlmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfTUlTQworIyAgaWZuZGVmIE1BWE5BTUxFTgorLyogR2V0IHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgUE9TSVguMSBsaW1pdHMuICAqLworIyAgaW5jbHVkZSA8Yml0cy9wb3NpeDFfbGltLmg+CisKKy8qIGBNQVhOQU1MRU4nIGlzIHRoZSBCU0QgbmFtZSBmb3Igd2hhdCBQT1NJWCBjYWxscyBgTkFNRV9NQVgnLiAgKi8KKyMgICBpZmRlZiBOQU1FX01BWAorIyAgICBkZWZpbmUgTUFYTkFNTEVOCU5BTUVfTUFYCisjICAgZWxzZQorIyAgICBkZWZpbmUgTUFYTkFNTEVOCTI1NQorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorCisjIGRlZmluZSBfX25lZWRfc2l6ZV90CisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBTY2FuIHRoZSBkaXJlY3RvcnkgRElSLCBjYWxsaW5nIFNFTEVDVE9SIG9uIGVhY2ggZGlyZWN0b3J5IGVudHJ5LgorICAgRW50cmllcyBmb3Igd2hpY2ggU0VMRUNUIHJldHVybnMgbm9uemVybyBhcmUgaW5kaXZpZHVhbGx5IG1hbGxvYydkLAorICAgc29ydGVkIHVzaW5nIHFzb3J0IHdpdGggQ01QLCBhbmQgY29sbGVjdGVkIGluIGEgbWFsbG9jJ2QgYXJyYXkgaW4KKyAgICpOQU1FTElTVC4gIFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIHNlbGVjdGVkLCBvciAtMSBvbiBlcnJvci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IHNjYW5kaXIgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RpciwKKwkJICAgIHN0cnVjdCBkaXJlbnQgKioqX19yZXN0cmljdCBfX25hbWVsaXN0LAorCQkgICAgaW50ICgqX19zZWxlY3RvcikgKF9fY29uc3Qgc3RydWN0IGRpcmVudCAqKSwKKwkJICAgIGludCAoKl9fY21wKSAoX19jb25zdCBzdHJ1Y3QgZGlyZW50ICoqLAorCQkJCSAgX19jb25zdCBzdHJ1Y3QgZGlyZW50ICoqKSkKKyAgICAgX19ub25udWxsICgoMSwgMikpOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKHNjYW5kaXIsCisJCSAgICAgICAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZGlyLAorCQkJc3RydWN0IGRpcmVudCAqKipfX3Jlc3RyaWN0IF9fbmFtZWxpc3QsCisJCQlpbnQgKCpfX3NlbGVjdG9yKSAoX19jb25zdCBzdHJ1Y3QgZGlyZW50ICopLAorCQkJaW50ICgqX19jbXApIChfX2NvbnN0IHN0cnVjdCBkaXJlbnQgKiosCisJCQkJICAgICAgX19jb25zdCBzdHJ1Y3QgZGlyZW50ICoqKSksCisJCSAgICAgICBzY2FuZGlyNjQpIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgIGVsc2UKKyMgICBkZWZpbmUgc2NhbmRpciBzY2FuZGlyNjQKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZCBfX1VTRV9HTlUgJiYgZGVmaW5lZCBfX1VTRV9MQVJHRUZJTEU2NAorLyogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBzY2FuZGlyJyBidXQgaXQgdXNlcyB0aGUgNjRiaXQgZGlyZW50IHN0cnVjdHVyZS4KKyAgIFBsZWFzZSBub3RlIHRoYXQgdGhlIENNUCBmdW5jdGlvbiBtdXN0IG5vdyB3b3JrIHdpdGggc3RydWN0IGRpcmVudDY0ICoqLiAgKi8KK2V4dGVybiBpbnQgc2NhbmRpcjY0IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19kaXIsCisJCSAgICAgIHN0cnVjdCBkaXJlbnQ2NCAqKipfX3Jlc3RyaWN0IF9fbmFtZWxpc3QsCisJCSAgICAgIGludCAoKl9fc2VsZWN0b3IpIChfX2NvbnN0IHN0cnVjdCBkaXJlbnQ2NCAqKSwKKwkJICAgICAgaW50ICgqX19jbXApIChfX2NvbnN0IHN0cnVjdCBkaXJlbnQ2NCAqKiwKKwkJCQkgICAgX19jb25zdCBzdHJ1Y3QgZGlyZW50NjQgKiopKQorICAgICBfX25vbm51bGwgKCgxLCAyKSk7CisjIGVuZGlmCisKKyMgaWZkZWYgX19VU0VfR05VCisvKiBTaW1pbGFyIHRvIGBzY2FuZGlyJyBidXQgYSByZWxhdGl2ZSBESVIgbmFtZSBpcyBpbnRlcnByZXRlZCByZWxhdGl2ZQorICAgdG8gdGhlIGRpcmVjdG9yeSBmb3Igd2hpY2ggREZEIGlzIGEgZGVzY3JpcHRvci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCisjICBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBzY2FuZGlyYXQgKGludCBfX2RmZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZGlyLAorCQkgICAgICBzdHJ1Y3QgZGlyZW50ICoqKl9fcmVzdHJpY3QgX19uYW1lbGlzdCwKKwkJICAgICAgaW50ICgqX19zZWxlY3RvcikgKF9fY29uc3Qgc3RydWN0IGRpcmVudCAqKSwKKwkJICAgICAgaW50ICgqX19jbXApIChfX2NvbnN0IHN0cnVjdCBkaXJlbnQgKiosCisJCQkJICAgIF9fY29uc3Qgc3RydWN0IGRpcmVudCAqKikpCisgICAgIF9fbm9ubnVsbCAoKDIsIDMpKTsKKyMgIGVsc2UKKyMgICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKHNjYW5kaXJhdCwKKwkJICAgICAgIChpbnQgX19kZmQsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RpciwKKwkJCXN0cnVjdCBkaXJlbnQgKioqX19yZXN0cmljdCBfX25hbWVsaXN0LAorCQkJaW50ICgqX19zZWxlY3RvcikgKF9fY29uc3Qgc3RydWN0IGRpcmVudCAqKSwKKwkJCWludCAoKl9fY21wKSAoX19jb25zdCBzdHJ1Y3QgZGlyZW50ICoqLAorCQkJCSAgICAgIF9fY29uc3Qgc3RydWN0IGRpcmVudCAqKikpLAorCQkgICAgICAgc2NhbmRpcmF0NjQpIF9fbm9ubnVsbCAoKDIsIDMpKTsKKyMgICBlbHNlCisjICAgIGRlZmluZSBzY2FuZGlyYXQgc2NhbmRpcmF0NjQKKyMgICBlbmRpZgorIyAgZW5kaWYKKworLyogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBzY2FuZGlyJyBidXQgaXQgdXNlcyB0aGUgNjRiaXQgZGlyZW50IHN0cnVjdHVyZS4KKyAgIFBsZWFzZSBub3RlIHRoYXQgdGhlIENNUCBmdW5jdGlvbiBtdXN0IG5vdyB3b3JrIHdpdGggc3RydWN0IGRpcmVudDY0ICoqLiAgKi8KK2V4dGVybiBpbnQgc2NhbmRpcmF0NjQgKGludCBfX2RmZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZGlyLAorCQkJc3RydWN0IGRpcmVudDY0ICoqKl9fcmVzdHJpY3QgX19uYW1lbGlzdCwKKwkJCWludCAoKl9fc2VsZWN0b3IpIChfX2NvbnN0IHN0cnVjdCBkaXJlbnQ2NCAqKSwKKwkJCWludCAoKl9fY21wKSAoX19jb25zdCBzdHJ1Y3QgZGlyZW50NjQgKiosCisJCQkJICAgICAgX19jb25zdCBzdHJ1Y3QgZGlyZW50NjQgKiopKQorICAgICBfX25vbm51bGwgKCgyLCAzKSk7CisjIGVuZGlmCisKKy8qIEZ1bmN0aW9uIHRvIGNvbXBhcmUgdHdvIGBzdHJ1Y3QgZGlyZW50J3MgYWxwaGFiZXRpY2FsbHkuICAqLworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBhbHBoYXNvcnQgKF9fY29uc3Qgc3RydWN0IGRpcmVudCAqKl9fZTEsCisJCSAgICAgIF9fY29uc3Qgc3RydWN0IGRpcmVudCAqKl9fZTIpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgZWxzZQorIyAgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoYWxwaGFzb3J0LAorCQkJICAgKF9fY29uc3Qgc3RydWN0IGRpcmVudCAqKl9fZTEsCisJCQkgICAgX19jb25zdCBzdHJ1Y3QgZGlyZW50ICoqX19lMiksCisJCQkgICBhbHBoYXNvcnQ2NCkgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgIGVsc2UKKyMgICBkZWZpbmUgYWxwaGFzb3J0IGFscGhhc29ydDY0CisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmIGRlZmluZWQgX19VU0VfR05VICYmIGRlZmluZWQgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgYWxwaGFzb3J0NjQgKF9fY29uc3Qgc3RydWN0IGRpcmVudDY0ICoqX19lMSwKKwkJCV9fY29uc3Qgc3RydWN0IGRpcmVudDY0ICoqX19lMikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworIyBlbmRpZgorI2VuZGlmIC8qIFVzZSBCU0Qgb3IgbWlzYyBvciBYUEc3LiAgKi8KKworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9NSVNDCisvKiBSZWFkIGRpcmVjdG9yeSBlbnRyaWVzIGZyb20gRkQgaW50byBCVUYsIHJlYWRpbmcgYXQgbW9zdCBOQllURVMuCisgICBSZWFkaW5nIHN0YXJ0cyBhdCBvZmZzZXQgKkJBU0VQLCBhbmQgKkJBU0VQIGlzIHVwZGF0ZWQgd2l0aCB0aGUgbmV3CisgICBwb3NpdGlvbiBhZnRlciByZWFkaW5nLiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQ7IHplcm8gd2hlbiBhdAorICAgZW5kIG9mIGRpcmVjdG9yeTsgb3IgLTEgZm9yIGVycm9ycy4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gX19zc2l6ZV90IGdldGRpcmVudHJpZXMgKGludCBfX2ZkLCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLAorCQkJCXNpemVfdCBfX25ieXRlcywKKwkJCQlfX29mZl90ICpfX3Jlc3RyaWN0IF9fYmFzZXApCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMiwgNCkpOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gX19zc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChnZXRkaXJlbnRyaWVzLAorCQkJCSAoaW50IF9fZmQsIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsCisJCQkJICBzaXplX3QgX19uYnl0ZXMsCisJCQkJICBfX29mZjY0X3QgKl9fcmVzdHJpY3QgX19iYXNlcCksCisJCQkJIGdldGRpcmVudHJpZXM2NCkgX19ub25udWxsICgoMiwgNCkpOworIyAgZWxzZQorIyAgIGRlZmluZSBnZXRkaXJlbnRyaWVzIGdldGRpcmVudHJpZXM2NAorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIF9fc3NpemVfdCBnZXRkaXJlbnRyaWVzNjQgKGludCBfX2ZkLCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLAorCQkJCSAgc2l6ZV90IF9fbmJ5dGVzLAorCQkJCSAgX19vZmY2NF90ICpfX3Jlc3RyaWN0IF9fYmFzZXApCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMiwgNCkpOworIyBlbmRpZgorI2VuZGlmIC8qIFVzZSBCU0Qgb3IgbWlzYy4gICovCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIEZ1bmN0aW9uIHRvIGNvbXBhcmUgdHdvIGBzdHJ1Y3QgZGlyZW50J3MgYnkgbmFtZSAmIHZlcnNpb24uICAqLworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCB2ZXJzaW9uc29ydCAoX19jb25zdCBzdHJ1Y3QgZGlyZW50ICoqX19lMSwKKwkJCV9fY29uc3Qgc3RydWN0IGRpcmVudCAqKl9fZTIpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgZWxzZQorIyAgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAodmVyc2lvbnNvcnQsCisJCQkgICAoX19jb25zdCBzdHJ1Y3QgZGlyZW50ICoqX19lMSwKKwkJCSAgICBfX2NvbnN0IHN0cnVjdCBkaXJlbnQgKipfX2UyKSwKKwkJCSAgIHZlcnNpb25zb3J0NjQpCisgICAgIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyKSk7CisjICBlbHNlCisjICAgZGVmaW5lIHZlcnNpb25zb3J0IHZlcnNpb25zb3J0NjQKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgdmVyc2lvbnNvcnQ2NCAoX19jb25zdCBzdHJ1Y3QgZGlyZW50NjQgKipfX2UxLAorCQkJICBfX2NvbnN0IHN0cnVjdCBkaXJlbnQ2NCAqKl9fZTIpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgZW5kaWYKKyNlbmRpZiAvKiBVc2UgR05VLiAgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGRpcmVudC5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9kbGZjbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9kbGZjbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNDYxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2RsZmNuLmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qIFVzZXIgZnVuY3Rpb25zIGZvciBydW4tdGltZSBkeW5hbWljIGxvYWRpbmcuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMSwyMDAzLDIwMDQsMjAwNiwyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9ETEZDTl9ICisjZGVmaW5lCV9ETEZDTl9IIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogQ29sbGVjdCB2YXJpb3VzIHN5c3RlbSBkZXBlbmRlbnQgZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucy4gICovCisjaW5jbHVkZSA8Yml0cy9kbGZjbi5oPgorCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIElmIHRoZSBmaXJzdCBhcmd1bWVudCBvZiBgZGxzeW0nIG9yIGBkbHZzeW0nIGlzIHNldCB0byBSVExEX05FWFQKKyAgIHRoZSBydW4tdGltZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgY2FsbGVkIE5BTUUgaW4gdGhlIG5leHQgc2hhcmVkCisgICBvYmplY3QgaXMgcmV0dXJuZWQuICBUaGUgIm5leHQiIHJlbGF0aW9uIGlzIGRlZmluZWQgYnkgdGhlIG9yZGVyCisgICB0aGUgc2hhcmVkIG9iamVjdHMgd2VyZSBsb2FkZWQuICAqLworIyBkZWZpbmUgUlRMRF9ORVhUCSgodm9pZCAqKSAtMWwpCisKKy8qIElmIHRoZSBmaXJzdCBhcmd1bWVudCB0byBgZGxzeW0nIG9yIGBkbHZzeW0nIGlzIHNldCB0byBSVExEX0RFRkFVTFQKKyAgIHRoZSBydW4tdGltZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgY2FsbGVkIE5BTUUgaW4gdGhlIGdsb2JhbCBzY29wZQorICAgaXMgcmV0dXJuZWQuICAqLworIyBkZWZpbmUgUlRMRF9ERUZBVUxUCSgodm9pZCAqKSAwKQorCisKKy8qIFR5cGUgZm9yIG5hbWVzcGFjZSBpbmRlY2VzLiAgKi8KK3R5cGVkZWYgbG9uZyBpbnQgTG1pZF90OworCisvKiBTcGVjaWFsIG5hbWVzcGFjZSBJRCB2YWx1ZXMuICAqLworIyBkZWZpbmUgTE1fSURfQkFTRQkwCS8qIEluaXRpYWwgbmFtZXNwYWNlLiAgKi8KKyMgZGVmaW5lIExNX0lEX05FV0xNCS0xCS8qIEZvciBkbG1vcGVuOiByZXF1ZXN0IG5ldyBuYW1lc3BhY2UuICAqLworI2VuZGlmCisKKworX19CRUdJTl9ERUNMUworCisvKiBPcGVuIHRoZSBzaGFyZWQgb2JqZWN0IEZJTEUgYW5kIG1hcCBpdCBpbjsgcmV0dXJuIGEgaGFuZGxlIHRoYXQgY2FuIGJlCisgICBwYXNzZWQgdG8gYGRsc3ltJyB0byBnZXQgc3ltYm9sIHZhbHVlcyBmcm9tIGl0LiAgKi8KK2V4dGVybiB2b2lkICpkbG9wZW4gKF9fY29uc3QgY2hhciAqX19maWxlLCBpbnQgX19tb2RlKSBfX1RIUk9XOworCisvKiBVbm1hcCBhbmQgY2xvc2UgYSBzaGFyZWQgb2JqZWN0IG9wZW5lZCBieSBgZGxvcGVuJy4KKyAgIFRoZSBoYW5kbGUgY2Fubm90IGJlIHVzZWQgYWdhaW4gYWZ0ZXIgY2FsbGluZyBgZGxjbG9zZScuICAqLworZXh0ZXJuIGludCBkbGNsb3NlICh2b2lkICpfX2hhbmRsZSkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIEZpbmQgdGhlIHJ1bi10aW1lIGFkZHJlc3MgaW4gdGhlIHNoYXJlZCBvYmplY3QgSEFORExFIHJlZmVycyB0bworICAgb2YgdGhlIHN5bWJvbCBjYWxsZWQgTkFNRS4gICovCitleHRlcm4gdm9pZCAqZGxzeW0gKHZvaWQgKl9fcmVzdHJpY3QgX19oYW5kbGUsCisJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogTGlrZSBgZGxvcGVuJywgYnV0IHJlcXVlc3Qgb2JqZWN0IHRvIGJlIGFsbG9jYXRlZCBpbiBhIG5ldyBuYW1lc3BhY2UuICAqLworZXh0ZXJuIHZvaWQgKmRsbW9wZW4gKExtaWRfdCBfX25zaWQsIF9fY29uc3QgY2hhciAqX19maWxlLCBpbnQgX19tb2RlKSBfX1RIUk9XOworCisvKiBGaW5kIHRoZSBydW4tdGltZSBhZGRyZXNzIGluIHRoZSBzaGFyZWQgb2JqZWN0IEhBTkRMRSByZWZlcnMgdG8KKyAgIG9mIHRoZSBzeW1ib2wgY2FsbGVkIE5BTUUgd2l0aCBWRVJTSU9OLiAgKi8KK2V4dGVybiB2b2lkICpkbHZzeW0gKHZvaWQgKl9fcmVzdHJpY3QgX19oYW5kbGUsCisJCSAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSwKKwkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX192ZXJzaW9uKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDMpKTsKKyNlbmRpZgorCisvKiBXaGVuIGFueSBvZiB0aGUgYWJvdmUgZnVuY3Rpb25zIGZhaWxzLCBjYWxsIHRoaXMgZnVuY3Rpb24KKyAgIHRvIHJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBlcnJvci4gIEVhY2ggY2FsbCByZXNldHMKKyAgIHRoZSBlcnJvciBzdHJpbmcgc28gdGhhdCBhIGZvbGxvd2luZyBjYWxsIHJldHVybnMgbnVsbC4gICovCitleHRlcm4gY2hhciAqZGxlcnJvciAodm9pZCkgX19USFJPVzsKKworCisjaWZkZWYgX19VU0VfR05VCisvKiBTdHJ1Y3R1cmUgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCBvYmplY3Qgc2VhcmNoZWQgdXNpbmcKKyAgIGBkbGFkZHInLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIF9fY29uc3QgY2hhciAqZGxpX2ZuYW1lOwkvKiBGaWxlIG5hbWUgb2YgZGVmaW5pbmcgb2JqZWN0LiAgKi8KKyAgdm9pZCAqZGxpX2ZiYXNlOwkJLyogTG9hZCBhZGRyZXNzIG9mIHRoYXQgb2JqZWN0LiAgKi8KKyAgX19jb25zdCBjaGFyICpkbGlfc25hbWU7CS8qIE5hbWUgb2YgbmVhcmVzdCBzeW1ib2wuICAqLworICB2b2lkICpkbGlfc2FkZHI7CQkvKiBFeGFjdCB2YWx1ZSBvZiBuZWFyZXN0IHN5bWJvbC4gICovCit9IERsX2luZm87CisKKy8qIEZpbGwgaW4gKklORk8gd2l0aCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGFib3V0IEFERFJFU1MuCisgICBSZXR1cm5zIDAgaWZmIG5vIHNoYXJlZCBvYmplY3QncyBzZWdtZW50cyBjb250YWluIHRoYXQgYWRkcmVzcy4gICovCitleHRlcm4gaW50IGRsYWRkciAoX19jb25zdCB2b2lkICpfX2FkZHJlc3MsIERsX2luZm8gKl9faW5mbykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisKKy8qIFNhbWUgYXMgYGRsYWRkcicsIGJ1dCBhZGRpdGlvbmFsbHkgc2V0cyAqRVhUUkFfSU5GTyBhY2NvcmRpbmcgdG8gRkxBR1MuICAqLworZXh0ZXJuIGludCBkbGFkZHIxIChfX2NvbnN0IHZvaWQgKl9fYWRkcmVzcywgRGxfaW5mbyAqX19pbmZvLAorCQkgICAgdm9pZCAqKl9fZXh0cmFfaW5mbywgaW50IF9fZmxhZ3MpIF9fVEhST1cgX19ub25udWxsICgoMikpOworCisvKiBUaGVzZSBhcmUgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIEZMQUdTIGFyZ3VtZW50IHRvIGBkbGFkZHIxJy4KKyAgIFRoaXMgaW5kaWNhdGVzIHdoYXQgZXh0cmEgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGF0ICpFWFRSQV9JTkZPLgorICAgSXQgbWF5IGFsc28gYmUgemVybywgaW4gd2hpY2ggY2FzZSB0aGUgRVhUUkFfSU5GTyBhcmd1bWVudCBpcyBub3QgdXNlZC4gICovCitlbnVtCisgIHsKKyAgICAvKiBNYXRjaGluZyBzeW1ib2wgdGFibGUgZW50cnkgKGNvbnN0IEVsZk5OX1N5bSAqKS4gICovCisgICAgUlRMRF9ETF9TWU1FTlQgPSAxLAorCisgICAgLyogVGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBhZGRyZXNzIChzdHJ1Y3QgbGlua19tYXAgKikuICAqLworICAgIFJUTERfRExfTElOS01BUCA9IDIKKyAgfTsKKworCisvKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNoYXJlZCBvYmplY3QgSEFORExFIHJlZmVycyB0by4KKyAgIFJFUVVFU1QgaXMgZnJvbSBhbW9uZyB0aGUgdmFsdWVzIGJlbG93LCBhbmQgZGV0ZXJtaW5lcyB0aGUgdXNlIG9mIEFSRy4KKworICAgT24gc3VjY2VzcywgcmV0dXJucyB6ZXJvLiAgT24gZmFpbHVyZSwgcmV0dXJucyAtMSBhbmQgcmVjb3JkcyBhbiBlcnJvcgorICAgbWVzc2FnZSB0byBiZSBmZXRjaGVkIHdpdGggYGRsZXJyb3InLiAgKi8KK2V4dGVybiBpbnQgZGxpbmZvICh2b2lkICpfX3Jlc3RyaWN0IF9faGFuZGxlLAorCQkgICBpbnQgX19yZXF1ZXN0LCB2b2lkICpfX3Jlc3RyaWN0IF9fYXJnKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDMpKTsKKworLyogVGhlc2UgYXJlIHRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBSRVFVRVNUIGFyZ3VtZW50IHRvIGBkbGluZm8nLiAgKi8KK2VudW0KKyAgeworICAgIC8qIFRyZWF0IEFSRyBhcyBgbG1pZF90IConOyBzdG9yZSBuYW1lc3BhY2UgSUQgZm9yIEhBTkRMRSB0aGVyZS4gICovCisgICAgUlRMRF9ESV9MTUlEID0gMSwKKworICAgIC8qIFRyZWF0IEFSRyBhcyBgc3RydWN0IGxpbmtfbWFwICoqJzsKKyAgICAgICBzdG9yZSB0aGUgYHN0cnVjdCBsaW5rX21hcCAqJyBmb3IgSEFORExFIHRoZXJlLiAgKi8KKyAgICBSVExEX0RJX0xJTktNQVAgPSAyLAorCisgICAgUlRMRF9ESV9DT05GSUdBRERSID0gMywJLyogVW5zdXBwb3J0ZWQsIGRlZmluZWQgYnkgU29sYXJpcy4gICovCisKKyAgICAvKiBUcmVhdCBBUkcgYXMgYERsX3NlcmluZm8gKicgKHNlZSBiZWxvdyksIGFuZCBmaWxsIGluIHRvIGRlc2NyaWJlIHRoZQorICAgICAgIGRpcmVjdG9yaWVzIHRoYXQgd2lsbCBiZSBzZWFyY2hlZCBmb3IgZGVwZW5kZW5jaWVzIG9mIHRoaXMgb2JqZWN0LgorICAgICAgIFJUTERfRElfU0VSSU5GT1NJWkUgZmlsbHMgaW4ganVzdCB0aGUgYGRsc19jbnQnIGFuZCBgZGxzX3NpemUnCisgICAgICAgZW50cmllcyB0byBpbmRpY2F0ZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHRoYXQgbXVzdCBiZSBwYXNzZWQgdG8KKyAgICAgICBSVExEX0RJX1NFUklORk8gdG8gZmlsbCBpbiB0aGUgZnVsbCBpbmZvcm1hdGlvbi4gICovCisgICAgUlRMRF9ESV9TRVJJTkZPID0gNCwKKyAgICBSVExEX0RJX1NFUklORk9TSVpFID0gNSwKKworICAgIC8qIFRyZWF0IEFSRyBhcyBgY2hhciAqJywgYW5kIHN0b3JlIHRoZXJlIHRoZSBkaXJlY3RvcnkgbmFtZSB1c2VkIHRvCisgICAgICAgZXhwYW5kICRPUklHSU4gaW4gdGhpcyBzaGFyZWQgb2JqZWN0J3MgZGVwZW5kZW5jeSBmaWxlIG5hbWVzLiAgKi8KKyAgICBSVExEX0RJX09SSUdJTiA9IDYsCisKKyAgICBSVExEX0RJX1BST0ZJTEVOQU1FID0gNywJLyogVW5zdXBwb3J0ZWQsIGRlZmluZWQgYnkgU29sYXJpcy4gICovCisgICAgUlRMRF9ESV9QUk9GSUxFT1VUID0gOCwJLyogVW5zdXBwb3J0ZWQsIGRlZmluZWQgYnkgU29sYXJpcy4gICovCisKKyAgICAvKiBUcmVhdCBBUkcgYXMgYHNpemVfdCAqJywgYW5kIHN0b3JlIHRoZXJlIHRoZSBUTFMgbW9kdWxlIElECisgICAgICAgb2YgdGhpcyBvYmplY3QncyBQVF9UTFMgc2VnbWVudCwgYXMgdXNlZCBpbiBUTFMgcmVsb2NhdGlvbnM7CisgICAgICAgc3RvcmUgemVybyBpZiB0aGlzIG9iamVjdCBkb2VzIG5vdCBkZWZpbmUgYSBQVF9UTFMgc2VnbWVudC4gICovCisgICAgUlRMRF9ESV9UTFNfTU9ESUQgPSA5LAorCisgICAgLyogVHJlYXQgQVJHIGFzIGB2b2lkICoqJywgYW5kIHN0b3JlIHRoZXJlIGEgcG9pbnRlciB0byB0aGUgY2FsbGluZworICAgICAgIHRocmVhZCdzIFRMUyBibG9jayBjb3JyZXNwb25kaW5nIHRvIHRoaXMgb2JqZWN0J3MgUFRfVExTIHNlZ21lbnQuCisgICAgICAgU3RvcmUgYSBudWxsIHBvaW50ZXIgaWYgdGhpcyBvYmplY3QgZG9lcyBub3QgZGVmaW5lIGEgUFRfVExTCisgICAgICAgc2VnbWVudCwgb3IgaWYgdGhlIGNhbGxpbmcgdGhyZWFkIGhhcyBub3QgYWxsb2NhdGVkIGEgYmxvY2sgZm9yIGl0LiAgKi8KKyAgICBSVExEX0RJX1RMU19EQVRBID0gMTAsCisKKyAgICBSVExEX0RJX01BWCA9IDEwCisgIH07CisKKworLyogVGhpcyBpcyB0aGUgdHlwZSBvZiBlbGVtZW50cyBpbiBgRGxfc2VyaW5mbycsIGJlbG93LgorICAgVGhlIGBkbHNfbmFtZScgbWVtYmVyIHBvaW50cyB0byBzcGFjZSBpbiB0aGUgYnVmZmVyIHBhc3NlZCB0byBgZGxpbmZvJy4gICovCit0eXBlZGVmIHN0cnVjdAoreworICBjaGFyICpkbHNfbmFtZTsJCS8qIE5hbWUgb2YgbGlicmFyeSBzZWFyY2ggcGF0aCBkaXJlY3RvcnkuICAqLworICB1bnNpZ25lZCBpbnQgZGxzX2ZsYWdzOwkvKiBJbmRpY2F0ZXMgd2hlcmUgdGhpcyBkaXJlY3RvcnkgY2FtZSBmcm9tLiAqLworfSBEbF9zZXJwYXRoOworCisvKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgdGhhdCBtdXN0IGJlIHBhc3NlZCAoYnkgcmVmZXJlbmNlKSB0byBgZGxpbmZvJyBmb3IKKyAgIHRoZSBSVExEX0RJX1NFUklORk8gYW5kIFJUTERfRElfU0VSSU5GT1NJWkUgcmVxdWVzdHMuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgc2l6ZV90IGRsc19zaXplOwkJLyogU2l6ZSBpbiBieXRlcyBvZiB0aGUgd2hvbGUgYnVmZmVyLiAgKi8KKyAgdW5zaWduZWQgaW50IGRsc19jbnQ7CQkvKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gYGRsc19zZXJwYXRoJy4gICovCisgIERsX3NlcnBhdGggZGxzX3NlcnBhdGhbMV07CS8qIEFjdHVhbGx5IGxvbmdlciwgZGxzX2NudCBlbGVtZW50cy4gICovCit9IERsX3NlcmluZm87CisjZW5kaWYgLyogX19VU0VfR05VICovCisKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIGRsZmNuLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL2RybS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y5OTdmZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL2RybS5oCkBAIC0wLDAgKzEsODA0IEBACisvKioKKyAqIFxmaWxlIGRybS5oCisgKiBIZWFkZXIgZm9yIHRoZSBEaXJlY3QgUmVuZGVyaW5nIE1hbmFnZXIKKyAqCisgKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgorICoKKyAqIFxwYXIgQWNrbm93bGVkZ21lbnRzOgorICogRGVjIDE5OTksIFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdHdpZGRsZS5uZXQ+LCBtb3ZlIHRvIGdlbmVyaWMgXGMgY21weGNoZy4KKyAqLworCisvKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9EUk1fSF8KKyNkZWZpbmUgX0RSTV9IXworCisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgordHlwZWRlZiB1bnNpZ25lZCBpbnQgZHJtX2hhbmRsZV90OworCisjZWxzZSAvKiBPbmUgb2YgdGhlIEJTRHMgKi8KKworI2luY2x1ZGUgPHN5cy9pb2Njb20uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KK3R5cGVkZWYgaW50OF90ICAgX19zODsKK3R5cGVkZWYgdWludDhfdCAgX191ODsKK3R5cGVkZWYgaW50MTZfdCAgX19zMTY7Cit0eXBlZGVmIHVpbnQxNl90IF9fdTE2OwordHlwZWRlZiBpbnQzMl90ICBfX3MzMjsKK3R5cGVkZWYgdWludDMyX3QgX191MzI7Cit0eXBlZGVmIGludDY0X3QgIF9fczY0OwordHlwZWRlZiB1aW50NjRfdCBfX3U2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBkcm1faGFuZGxlX3Q7CisKKyNlbmRpZgorCisjZGVmaW5lIERSTV9OQU1FCSJkcm0iCSAgLyoqPCBOYW1lIGluIGtlcm5lbCwgL2RldiwgYW5kIC9wcm9jICovCisjZGVmaW5lIERSTV9NSU5fT1JERVIJNQkgIC8qKjwgQXQgbGVhc3QgMl41IGJ5dGVzID0gMzIgYnl0ZXMgKi8KKyNkZWZpbmUgRFJNX01BWF9PUkRFUgkyMgkgIC8qKjwgVXAgdG8gMl4yMiBieXRlcyA9IDRNQiAqLworI2RlZmluZSBEUk1fUkFNX1BFUkNFTlQgMTAJICAvKio8IEhvdyBtdWNoIHN5c3RlbSByYW0gY2FuIHdlIGxvY2s/ICovCisKKyNkZWZpbmUgX0RSTV9MT0NLX0hFTEQJMHg4MDAwMDAwMFUgLyoqPCBIYXJkd2FyZSBsb2NrIGlzIGhlbGQgKi8KKyNkZWZpbmUgX0RSTV9MT0NLX0NPTlQJMHg0MDAwMDAwMFUgLyoqPCBIYXJkd2FyZSBsb2NrIGlzIGNvbnRlbmRlZCAqLworI2RlZmluZSBfRFJNX0xPQ0tfSVNfSEVMRChsb2NrKQkgICAoKGxvY2spICYgX0RSTV9MT0NLX0hFTEQpCisjZGVmaW5lIF9EUk1fTE9DS19JU19DT05UKGxvY2spCSAgICgobG9jaykgJiBfRFJNX0xPQ0tfQ09OVCkKKyNkZWZpbmUgX0RSTV9MT0NLSU5HX0NPTlRFWFQobG9jaykgKChsb2NrKSAmIH4oX0RSTV9MT0NLX0hFTER8X0RSTV9MT0NLX0NPTlQpKQorCit0eXBlZGVmIHVuc2lnbmVkIGludCBkcm1fY29udGV4dF90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgZHJtX2RyYXdhYmxlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBkcm1fbWFnaWNfdDsKKworLyoqCisgKiBDbGlwcmVjdC4KKyAqCisgKiBcd2FybmluZzogSWYgeW91IGNoYW5nZSB0aGlzIHN0cnVjdHVyZSwgbWFrZSBzdXJlIHlvdSBjaGFuZ2UKKyAqIFhGODZEUklDbGlwUmVjdFJlYyBpbiB0aGUgc2VydmVyIGFzIHdlbGwKKyAqCisgKiBcbm90ZSBLVzogQWN0dWFsbHkgaXQncyBpbGxlZ2FsIHRvIGNoYW5nZSBlaXRoZXIgZm9yCisgKiBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSByZWFzb25zLgorICovCitzdHJ1Y3QgZHJtX2NsaXBfcmVjdCB7CisJdW5zaWduZWQgc2hvcnQgeDE7CisJdW5zaWduZWQgc2hvcnQgeTE7CisJdW5zaWduZWQgc2hvcnQgeDI7CisJdW5zaWduZWQgc2hvcnQgeTI7Cit9OworCisvKioKKyAqIERyYXdhYmxlIGluZm9ybWF0aW9uLgorICovCitzdHJ1Y3QgZHJtX2RyYXdhYmxlX2luZm8geworCXVuc2lnbmVkIGludCBudW1fcmVjdHM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnJlY3RzOworfTsKKworLyoqCisgKiBUZXh0dXJlIHJlZ2lvbiwKKyAqLworc3RydWN0IGRybV90ZXhfcmVnaW9uIHsKKwl1bnNpZ25lZCBjaGFyIG5leHQ7CisJdW5zaWduZWQgY2hhciBwcmV2OworCXVuc2lnbmVkIGNoYXIgaW5fdXNlOworCXVuc2lnbmVkIGNoYXIgcGFkZGluZzsKKwl1bnNpZ25lZCBpbnQgYWdlOworfTsKKworLyoqCisgKiBIYXJkd2FyZSBsb2NrLgorICoKKyAqIFRoZSBsb2NrIHN0cnVjdHVyZSBpcyBhIHNpbXBsZSBjYWNoZS1saW5lIGFsaWduZWQgaW50ZWdlci4gIFRvIGF2b2lkCisgKiBwcm9jZXNzb3IgYnVzIGNvbnRlbnRpb24gb24gYSBtdWx0aXByb2Nlc3NvciBzeXN0ZW0sIHRoZXJlIHNob3VsZCBub3QgYmUgYW55CisgKiBvdGhlciBkYXRhIHN0b3JlZCBpbiB0aGUgc2FtZSBjYWNoZSBsaW5lLgorICovCitzdHJ1Y3QgZHJtX2h3X2xvY2sgeworCV9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgbG9jazsJCS8qKjwgbG9jayB2YXJpYWJsZSAqLworCWNoYXIgcGFkZGluZ1s2MF07CQkJLyoqPCBQYWQgdG8gY2FjaGUgbGluZSAqLworfTsKKworLyoqCisgKiBEUk1fSU9DVExfVkVSU0lPTiBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1HZXRWZXJzaW9uKCkuCisgKi8KK3N0cnVjdCBkcm1fdmVyc2lvbiB7CisJaW50IHZlcnNpb25fbWFqb3I7CSAgLyoqPCBNYWpvciB2ZXJzaW9uICovCisJaW50IHZlcnNpb25fbWlub3I7CSAgLyoqPCBNaW5vciB2ZXJzaW9uICovCisJaW50IHZlcnNpb25fcGF0Y2hsZXZlbDsJICAvKio8IFBhdGNoIGxldmVsICovCisJc2l6ZV90IG5hbWVfbGVuOwkgIC8qKjwgTGVuZ3RoIG9mIG5hbWUgYnVmZmVyICovCisJY2hhciAqbmFtZTsJICAvKio8IE5hbWUgb2YgZHJpdmVyICovCisJc2l6ZV90IGRhdGVfbGVuOwkgIC8qKjwgTGVuZ3RoIG9mIGRhdGUgYnVmZmVyICovCisJY2hhciAqZGF0ZTsJICAvKio8IFVzZXItc3BhY2UgYnVmZmVyIHRvIGhvbGQgZGF0ZSAqLworCXNpemVfdCBkZXNjX2xlbjsJICAvKio8IExlbmd0aCBvZiBkZXNjIGJ1ZmZlciAqLworCWNoYXIgKmRlc2M7CSAgLyoqPCBVc2VyLXNwYWNlIGJ1ZmZlciB0byBob2xkIGRlc2MgKi8KK307CisKKy8qKgorICogRFJNX0lPQ1RMX0dFVF9VTklRVUUgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtR2V0QnVzaWQoKSBhbmQgZHJtU2V0QnVzSWQoKS4KKyAqLworc3RydWN0IGRybV91bmlxdWUgeworCXNpemVfdCB1bmlxdWVfbGVuOwkgIC8qKjwgTGVuZ3RoIG9mIHVuaXF1ZSAqLworCWNoYXIgKnVuaXF1ZTsJICAvKio8IFVuaXF1ZSBuYW1lIGZvciBkcml2ZXIgaW5zdGFudGlhdGlvbiAqLworfTsKKworc3RydWN0IGRybV9saXN0IHsKKwlpbnQgY291bnQ7CQkgIC8qKjwgTGVuZ3RoIG9mIHVzZXItc3BhY2Ugc3RydWN0dXJlcyAqLworCXN0cnVjdCBkcm1fdmVyc2lvbiAqdmVyc2lvbjsKK307CisKK3N0cnVjdCBkcm1fYmxvY2sgeworCWludCB1bnVzZWQ7Cit9OworCisvKioKKyAqIERSTV9JT0NUTF9DT05UUk9MIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUN0bEluc3RIYW5kbGVyKCkgYW5kIGRybUN0bFVuaW5zdEhhbmRsZXIoKS4KKyAqLworc3RydWN0IGRybV9jb250cm9sIHsKKwllbnVtIHsKKwkJRFJNX0FERF9DT01NQU5ELAorCQlEUk1fUk1fQ09NTUFORCwKKwkJRFJNX0lOU1RfSEFORExFUiwKKwkJRFJNX1VOSU5TVF9IQU5ETEVSCisJfSBmdW5jOworCWludCBpcnE7Cit9OworCisvKioKKyAqIFR5cGUgb2YgbWVtb3J5IHRvIG1hcC4KKyAqLworZW51bSBkcm1fbWFwX3R5cGUgeworCV9EUk1fRlJBTUVfQlVGRkVSID0gMCwJICAvKio8IFdDIChubyBjYWNoaW5nKSwgbm8gY29yZSBkdW1wICovCisJX0RSTV9SRUdJU1RFUlMgPSAxLAkgIC8qKjwgbm8gY2FjaGluZywgbm8gY29yZSBkdW1wICovCisJX0RSTV9TSE0gPSAyLAkJICAvKio8IHNoYXJlZCwgY2FjaGVkICovCisJX0RSTV9BR1AgPSAzLAkJICAvKio8IEFHUC9HQVJUICovCisJX0RSTV9TQ0FUVEVSX0dBVEhFUiA9IDQsICAvKio8IFNjYXR0ZXIvZ2F0aGVyIG1lbW9yeSBmb3IgUENJIERNQSAqLworCV9EUk1fQ09OU0lTVEVOVCA9IDUsCSAgLyoqPCBDb25zaXN0ZW50IG1lbW9yeSBmb3IgUENJIERNQSAqLworCV9EUk1fR0VNID0gNiwJCSAgLyoqPCBHRU0gb2JqZWN0ICovCit9OworCisvKioKKyAqIE1lbW9yeSBtYXBwaW5nIGZsYWdzLgorICovCitlbnVtIGRybV9tYXBfZmxhZ3MgeworCV9EUk1fUkVTVFJJQ1RFRCA9IDB4MDEsCSAgICAgLyoqPCBDYW5ub3QgYmUgbWFwcGVkIHRvIHVzZXItdmlydHVhbCAqLworCV9EUk1fUkVBRF9PTkxZID0gMHgwMiwKKwlfRFJNX0xPQ0tFRCA9IDB4MDQsCSAgICAgLyoqPCBzaGFyZWQsIGNhY2hlZCwgbG9ja2VkICovCisJX0RSTV9LRVJORUwgPSAweDA4LAkgICAgIC8qKjwga2VybmVsIHJlcXVpcmVzIGFjY2VzcyAqLworCV9EUk1fV1JJVEVfQ09NQklOSU5HID0gMHgxMCwgLyoqPCB1c2Ugd3JpdGUtY29tYmluaW5nIGlmIGF2YWlsYWJsZSAqLworCV9EUk1fQ09OVEFJTlNfTE9DSyA9IDB4MjAsICAgLyoqPCBTSE0gcGFnZSB0aGF0IGNvbnRhaW5zIGxvY2sgKi8KKwlfRFJNX1JFTU9WQUJMRSA9IDB4NDAsCSAgICAgLyoqPCBSZW1vdmFibGUgbWFwcGluZyAqLworCV9EUk1fRFJJVkVSID0gMHg4MAkgICAgIC8qKjwgTWFuYWdlZCBieSBkcml2ZXIgKi8KK307CisKK3N0cnVjdCBkcm1fY3R4X3ByaXZfbWFwIHsKKwl1bnNpZ25lZCBpbnQgY3R4X2lkOwkgLyoqPCBDb250ZXh0IHJlcXVlc3RpbmcgcHJpdmF0ZSBtYXBwaW5nICovCisJdm9pZCAqaGFuZGxlOwkJIC8qKjwgSGFuZGxlIG9mIG1hcCAqLworfTsKKworLyoqCisgKiBEUk1fSU9DVExfR0VUX01BUCwgRFJNX0lPQ1RMX0FERF9NQVAgYW5kIERSTV9JT0NUTF9STV9NQVAgaW9jdGxzCisgKiBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1BZGRNYXAoKS4KKyAqLworc3RydWN0IGRybV9tYXAgeworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkgLyoqPCBSZXF1ZXN0ZWQgcGh5c2ljYWwgYWRkcmVzcyAoMCBmb3IgU0FSRUEpKi8KKwl1bnNpZ25lZCBsb25nIHNpemU7CSAvKio8IFJlcXVlc3RlZCBwaHlzaWNhbCBzaXplIChieXRlcykgKi8KKwllbnVtIGRybV9tYXBfdHlwZSB0eXBlOwkgLyoqPCBUeXBlIG9mIG1lbW9yeSB0byBtYXAgKi8KKwllbnVtIGRybV9tYXBfZmxhZ3MgZmxhZ3M7CSAvKio8IEZsYWdzICovCisJdm9pZCAqaGFuZGxlOwkJIC8qKjwgVXNlci1zcGFjZTogIkhhbmRsZSIgdG8gcGFzcyB0byBtbWFwKCkgKi8KKwkJCQkgLyoqPCBLZXJuZWwtc3BhY2U6IGtlcm5lbC12aXJ0dWFsIGFkZHJlc3MgKi8KKwlpbnQgbXRycjsJCSAvKio8IE1UUlIgc2xvdCB1c2VkICovCisJLyogICBQcml2YXRlIGRhdGEgKi8KK307CisKKy8qKgorICogRFJNX0lPQ1RMX0dFVF9DTElFTlQgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLworc3RydWN0IGRybV9jbGllbnQgeworCWludCBpZHg7CQkvKio8IFdoaWNoIGNsaWVudCBkZXNpcmVkPyAqLworCWludCBhdXRoOwkJLyoqPCBJcyBjbGllbnQgYXV0aGVudGljYXRlZD8gKi8KKwl1bnNpZ25lZCBsb25nIHBpZDsJLyoqPCBQcm9jZXNzIElEICovCisJdW5zaWduZWQgbG9uZyB1aWQ7CS8qKjwgVXNlciBJRCAqLworCXVuc2lnbmVkIGxvbmcgbWFnaWM7CS8qKjwgTWFnaWMgKi8KKwl1bnNpZ25lZCBsb25nIGlvY3M7CS8qKjwgSW9jdGwgY291bnQgKi8KK307CisKK2VudW0gZHJtX3N0YXRfdHlwZSB7CisJX0RSTV9TVEFUX0xPQ0ssCisJX0RSTV9TVEFUX09QRU5TLAorCV9EUk1fU1RBVF9DTE9TRVMsCisJX0RSTV9TVEFUX0lPQ1RMUywKKwlfRFJNX1NUQVRfTE9DS1MsCisJX0RSTV9TVEFUX1VOTE9DS1MsCisJX0RSTV9TVEFUX1ZBTFVFLAkvKio8IEdlbmVyaWMgdmFsdWUgKi8KKwlfRFJNX1NUQVRfQllURSwJCS8qKjwgR2VuZXJpYyBieXRlIGNvdW50ZXIgKDEwMjRieXRlcy9LKSAqLworCV9EUk1fU1RBVF9DT1VOVCwJLyoqPCBHZW5lcmljIG5vbi1ieXRlIGNvdW50ZXIgKDEwMDAvaykgKi8KKworCV9EUk1fU1RBVF9JUlEsCQkvKio8IElSUSAqLworCV9EUk1fU1RBVF9QUklNQVJZLAkvKio8IFByaW1hcnkgRE1BIGJ5dGVzICovCisJX0RSTV9TVEFUX1NFQ09OREFSWSwJLyoqPCBTZWNvbmRhcnkgRE1BIGJ5dGVzICovCisJX0RSTV9TVEFUX0RNQSwJCS8qKjwgRE1BICovCisJX0RSTV9TVEFUX1NQRUNJQUwsCS8qKjwgU3BlY2lhbCBETUEgKGUuZy4sIHByaW9yaXR5IG9yIHBvbGxlZCkgKi8KKwlfRFJNX1NUQVRfTUlTU0VECS8qKjwgTWlzc2VkIERNQSBvcHBvcnR1bml0eSAqLworCSAgICAvKiBBZGQgdG8gdGhlICpFTkQqIG9mIHRoZSBsaXN0ICovCit9OworCisvKioKKyAqIERSTV9JT0NUTF9HRVRfU1RBVFMgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLworc3RydWN0IGRybV9zdGF0cyB7CisJdW5zaWduZWQgbG9uZyBjb3VudDsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIHZhbHVlOworCQllbnVtIGRybV9zdGF0X3R5cGUgdHlwZTsKKwl9IGRhdGFbMTVdOworfTsKKworLyoqCisgKiBIYXJkd2FyZSBsb2NraW5nIGZsYWdzLgorICovCitlbnVtIGRybV9sb2NrX2ZsYWdzIHsKKwlfRFJNX0xPQ0tfUkVBRFkgPSAweDAxLAkgICAgIC8qKjwgV2FpdCB1bnRpbCBoYXJkd2FyZSBpcyByZWFkeSBmb3IgRE1BICovCisJX0RSTV9MT0NLX1FVSUVTQ0VOVCA9IDB4MDIsICAvKio8IFdhaXQgdW50aWwgaGFyZHdhcmUgcXVpZXNjZW50ICovCisJX0RSTV9MT0NLX0ZMVVNIID0gMHgwNCwJICAgICAvKio8IEZsdXNoIHRoaXMgY29udGV4dCdzIERNQSBxdWV1ZSBmaXJzdCAqLworCV9EUk1fTE9DS19GTFVTSF9BTEwgPSAweDA4LCAgLyoqPCBGbHVzaCBhbGwgRE1BIHF1ZXVlcyBmaXJzdCAqLworCS8qIFRoZXNlICpIQUxUKiBmbGFncyBhcmVuJ3Qgc3VwcG9ydGVkIHlldAorCSAgIC0tIHRoZXkgd2lsbCBiZSB1c2VkIHRvIHN1cHBvcnQgdGhlCisJICAgZnVsbC1zY3JlZW4gREdBLWxpa2UgbW9kZS4gKi8KKwlfRFJNX0hBTFRfQUxMX1FVRVVFUyA9IDB4MTAsIC8qKjwgSGFsdCBhbGwgY3VycmVudCBhbmQgZnV0dXJlIHF1ZXVlcyAqLworCV9EUk1fSEFMVF9DVVJfUVVFVUVTID0gMHgyMCAgLyoqPCBIYWx0IGFsbCBjdXJyZW50IHF1ZXVlcyAqLworfTsKKworLyoqCisgKiBEUk1fSU9DVExfTE9DSywgRFJNX0lPQ1RMX1VOTE9DSyBhbmQgRFJNX0lPQ1RMX0ZJTklTSCBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1HZXRMb2NrKCkgYW5kIGRybVVubG9jaygpLgorICovCitzdHJ1Y3QgZHJtX2xvY2sgeworCWludCBjb250ZXh0OworCWVudW0gZHJtX2xvY2tfZmxhZ3MgZmxhZ3M7Cit9OworCisvKioKKyAqIERNQSBmbGFncworICoKKyAqIFx3YXJuaW5nCisgKiBUaGVzZSB2YWx1ZXMgXGUgbXVzdCBtYXRjaCB4Zjg2ZHJtLmguCisgKgorICogXHNhIGRybV9kbWEuCisgKi8KK2VudW0gZHJtX2RtYV9mbGFncyB7CisJLyogRmxhZ3MgZm9yIERNQSBidWZmZXIgZGlzcGF0Y2ggKi8KKwlfRFJNX0RNQV9CTE9DSyA9IDB4MDEsCSAgICAgIC8qKjwKKwkJCQkgICAgICAgKiBCbG9jayB1bnRpbCBidWZmZXIgZGlzcGF0Y2hlZC4KKwkJCQkgICAgICAgKgorCQkJCSAgICAgICAqIFxub3RlIFRoZSBidWZmZXIgbWF5IG5vdCB5ZXQgaGF2ZQorCQkJCSAgICAgICAqIGJlZW4gcHJvY2Vzc2VkIGJ5IHRoZSBoYXJkd2FyZSAtLQorCQkJCSAgICAgICAqIGdldHRpbmcgYSBoYXJkd2FyZSBsb2NrIHdpdGggdGhlCisJCQkJICAgICAgICogaGFyZHdhcmUgcXVpZXNjZW50IHdpbGwgZW5zdXJlCisJCQkJICAgICAgICogdGhhdCB0aGUgYnVmZmVyIGhhcyBiZWVuCisJCQkJICAgICAgICogcHJvY2Vzc2VkLgorCQkJCSAgICAgICAqLworCV9EUk1fRE1BX1dISUxFX0xPQ0tFRCA9IDB4MDIsIC8qKjwgRGlzcGF0Y2ggd2hpbGUgbG9jayBoZWxkICovCisJX0RSTV9ETUFfUFJJT1JJVFkgPSAweDA0LCAgICAgLyoqPCBIaWdoIHByaW9yaXR5IGRpc3BhdGNoICovCisKKwkvKiBGbGFncyBmb3IgRE1BIGJ1ZmZlciByZXF1ZXN0ICovCisJX0RSTV9ETUFfV0FJVCA9IDB4MTAsCSAgICAgIC8qKjwgV2FpdCBmb3IgZnJlZSBidWZmZXJzICovCisJX0RSTV9ETUFfU01BTExFUl9PSyA9IDB4MjAsICAgLyoqPCBTbWFsbGVyLXRoYW4tcmVxdWVzdGVkIGJ1ZmZlcnMgT0sgKi8KKwlfRFJNX0RNQV9MQVJHRVJfT0sgPSAweDQwICAgICAvKio8IExhcmdlci10aGFuLXJlcXVlc3RlZCBidWZmZXJzIE9LICovCit9OworCisvKioKKyAqIERSTV9JT0NUTF9BRERfQlVGUyBhbmQgRFJNX0lPQ1RMX01BUktfQlVGUyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1BZGRCdWZzKCkuCisgKi8KK3N0cnVjdCBkcm1fYnVmX2Rlc2MgeworCWludCBjb3VudDsJCSAvKio8IE51bWJlciBvZiBidWZmZXJzIG9mIHRoaXMgc2l6ZSAqLworCWludCBzaXplOwkJIC8qKjwgU2l6ZSBpbiBieXRlcyAqLworCWludCBsb3dfbWFyazsJCSAvKio8IExvdyB3YXRlciBtYXJrICovCisJaW50IGhpZ2hfbWFyazsJCSAvKio8IEhpZ2ggd2F0ZXIgbWFyayAqLworCWVudW0geworCQlfRFJNX1BBR0VfQUxJR04gPSAweDAxLAkvKio8IEFsaWduIG9uIHBhZ2UgYm91bmRhcmllcyBmb3IgRE1BICovCisJCV9EUk1fQUdQX0JVRkZFUiA9IDB4MDIsCS8qKjwgQnVmZmVyIGlzIGluIEFHUCBzcGFjZSAqLworCQlfRFJNX1NHX0JVRkZFUiA9IDB4MDQsCS8qKjwgU2NhdHRlci9nYXRoZXIgbWVtb3J5IGJ1ZmZlciAqLworCQlfRFJNX0ZCX0JVRkZFUiA9IDB4MDgsCS8qKjwgQnVmZmVyIGlzIGluIGZyYW1lIGJ1ZmZlciAqLworCQlfRFJNX1BDSV9CVUZGRVJfUk8gPSAweDEwIC8qKjwgTWFwIFBDSSBETUEgYnVmZmVyIHJlYWQtb25seSAqLworCX0gZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBhZ3Bfc3RhcnQ7IC8qKjwKKwkJCQkgICogU3RhcnQgYWRkcmVzcyBvZiB3aGVyZSB0aGUgQUdQIGJ1ZmZlcnMgYXJlCisJCQkJICAqIGluIHRoZSBBR1AgYXBlcnR1cmUKKwkJCQkgICovCit9OworCisvKioKKyAqIERSTV9JT0NUTF9JTkZPX0JVRlMgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLworc3RydWN0IGRybV9idWZfaW5mbyB7CisJaW50IGNvdW50OwkJLyoqPCBFbnRyaWVzIGluIGxpc3QgKi8KKwlzdHJ1Y3QgZHJtX2J1Zl9kZXNjICpsaXN0OworfTsKKworLyoqCisgKiBEUk1fSU9DVExfRlJFRV9CVUZTIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3N0cnVjdCBkcm1fYnVmX2ZyZWUgeworCWludCBjb3VudDsKKwlpbnQgKmxpc3Q7Cit9OworCisvKioKKyAqIEJ1ZmZlciBpbmZvcm1hdGlvbgorICoKKyAqIFxzYSBkcm1fYnVmX21hcC4KKyAqLworc3RydWN0IGRybV9idWZfcHViIHsKKwlpbnQgaWR4OwkJICAgICAgIC8qKjwgSW5kZXggaW50byB0aGUgbWFzdGVyIGJ1ZmZlciBsaXN0ICovCisJaW50IHRvdGFsOwkJICAgICAgIC8qKjwgQnVmZmVyIHNpemUgKi8KKwlpbnQgdXNlZDsJCSAgICAgICAvKio8IEFtb3VudCBvZiBidWZmZXIgaW4gdXNlIChmb3IgRE1BKSAqLworCXZvaWQgKmFkZHJlc3M7CSAgICAgICAvKio8IEFkZHJlc3Mgb2YgYnVmZmVyICovCit9OworCisvKioKKyAqIERSTV9JT0NUTF9NQVBfQlVGUyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICovCitzdHJ1Y3QgZHJtX2J1Zl9tYXAgeworCWludCBjb3VudDsJCS8qKjwgTGVuZ3RoIG9mIHRoZSBidWZmZXIgbGlzdCAqLworCXZvaWQgKnZpcnR1YWw7CQkvKio8IE1tYXAnZCBhcmVhIGluIHVzZXItdmlydHVhbCAqLworCXN0cnVjdCBkcm1fYnVmX3B1YiAqbGlzdDsJLyoqPCBCdWZmZXIgaW5mb3JtYXRpb24gKi8KK307CisKKy8qKgorICogRFJNX0lPQ1RMX0RNQSBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIEluZGljZXMgaGVyZSByZWZlciB0byB0aGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlciBsaXN0IGluIGRybV9idWZfZ2V0LgorICoKKyAqIFxzYSBkcm1ETUEoKS4KKyAqLworc3RydWN0IGRybV9kbWEgeworCWludCBjb250ZXh0OwkJCSAgLyoqPCBDb250ZXh0IGhhbmRsZSAqLworCWludCBzZW5kX2NvdW50OwkJCSAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyB0byBzZW5kICovCisJaW50ICpzZW5kX2luZGljZXM7CSAgLyoqPCBMaXN0IG9mIGhhbmRsZXMgdG8gYnVmZmVycyAqLworCWludCAqc2VuZF9zaXplczsJCSAgLyoqPCBMZW5ndGhzIG9mIGRhdGEgdG8gc2VuZCAqLworCWVudW0gZHJtX2RtYV9mbGFncyBmbGFnczsJICAvKio8IEZsYWdzICovCisJaW50IHJlcXVlc3RfY291bnQ7CQkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWVzdGVkICovCisJaW50IHJlcXVlc3Rfc2l6ZTsJCSAgLyoqPCBEZXNpcmVkIHNpemUgZm9yIGJ1ZmZlcnMgKi8KKwlpbnQgKnJlcXVlc3RfaW5kaWNlczsJICAvKio8IEJ1ZmZlciBpbmZvcm1hdGlvbiAqLworCWludCAqcmVxdWVzdF9zaXplczsKKwlpbnQgZ3JhbnRlZF9jb3VudDsJCSAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyBncmFudGVkICovCit9OworCitlbnVtIGRybV9jdHhfZmxhZ3MgeworCV9EUk1fQ09OVEVYVF9QUkVTRVJWRUQgPSAweDAxLAorCV9EUk1fQ09OVEVYVF8yRE9OTFkgPSAweDAyCit9OworCisvKioKKyAqIERSTV9JT0NUTF9BRERfQ1RYIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUNyZWF0ZUNvbnRleHQoKSBhbmQgZHJtRGVzdHJveUNvbnRleHQoKS4KKyAqLworc3RydWN0IGRybV9jdHggeworCWRybV9jb250ZXh0X3QgaGFuZGxlOworCWVudW0gZHJtX2N0eF9mbGFncyBmbGFnczsKK307CisKKy8qKgorICogRFJNX0lPQ1RMX1JFU19DVFggaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLworc3RydWN0IGRybV9jdHhfcmVzIHsKKwlpbnQgY291bnQ7CisJc3RydWN0IGRybV9jdHggKmNvbnRleHRzOworfTsKKworLyoqCisgKiBEUk1fSU9DVExfQUREX0RSQVcgYW5kIERSTV9JT0NUTF9STV9EUkFXIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3N0cnVjdCBkcm1fZHJhdyB7CisJZHJtX2RyYXdhYmxlX3QgaGFuZGxlOworfTsKKworLyoqCisgKiBEUk1fSU9DVExfVVBEQVRFX0RSQVcgaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlEUk1fRFJBV0FCTEVfQ0xJUFJFQ1RTLAorfSBkcm1fZHJhd2FibGVfaW5mb190eXBlX3Q7CisKK3N0cnVjdCBkcm1fdXBkYXRlX2RyYXcgeworCWRybV9kcmF3YWJsZV90IGhhbmRsZTsKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKwl1bnNpZ25lZCBpbnQgbnVtOworCXVuc2lnbmVkIGxvbmcgbG9uZyBkYXRhOworfTsKKworLyoqCisgKiBEUk1fSU9DVExfR0VUX01BR0lDIGFuZCBEUk1fSU9DVExfQVVUSF9NQUdJQyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICovCitzdHJ1Y3QgZHJtX2F1dGggeworCWRybV9tYWdpY190IG1hZ2ljOworfTsKKworLyoqCisgKiBEUk1fSU9DVExfSVJRX0JVU0lEIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKgorICogXHNhIGRybUdldEludGVycnVwdEZyb21CdXNJRCgpLgorICovCitzdHJ1Y3QgZHJtX2lycV9idXNpZCB7CisJaW50IGlycTsJLyoqPCBJUlEgbnVtYmVyICovCisJaW50IGJ1c251bTsJLyoqPCBidXMgbnVtYmVyICovCisJaW50IGRldm51bTsJLyoqPCBkZXZpY2UgbnVtYmVyICovCisJaW50IGZ1bmNudW07CS8qKjwgZnVuY3Rpb24gbnVtYmVyICovCit9OworCitlbnVtIGRybV92Ymxhbmtfc2VxX3R5cGUgeworCV9EUk1fVkJMQU5LX0FCU09MVVRFID0gMHgwLAkvKio8IFdhaXQgZm9yIHNwZWNpZmljIHZibGFuayBzZXF1ZW5jZSBudW1iZXIgKi8KKwlfRFJNX1ZCTEFOS19SRUxBVElWRSA9IDB4MSwJLyoqPCBXYWl0IGZvciBnaXZlbiBudW1iZXIgb2YgdmJsYW5rcyAqLworCS8qIGJpdHMgMS02IGFyZSByZXNlcnZlZCBmb3IgaGlnaCBjcnRjcyAqLworCV9EUk1fVkJMQU5LX0hJR0hfQ1JUQ19NQVNLID0gMHgwMDAwMDAzZSwKKwlfRFJNX1ZCTEFOS19FVkVOVCA9IDB4NDAwMDAwMCwgICAvKio8IFNlbmQgZXZlbnQgaW5zdGVhZCBvZiBibG9ja2luZyAqLworCV9EUk1fVkJMQU5LX0ZMSVAgPSAweDgwMDAwMDAsICAgLyoqPCBTY2hlZHVsZWQgYnVmZmVyIHN3YXAgc2hvdWxkIGZsaXAgKi8KKwlfRFJNX1ZCTEFOS19ORVhUT05NSVNTID0gMHgxMDAwMDAwMCwJLyoqPCBJZiBtaXNzZWQsIHdhaXQgZm9yIG5leHQgdmJsYW5rICovCisJX0RSTV9WQkxBTktfU0VDT05EQVJZID0gMHgyMDAwMDAwMCwJLyoqPCBTZWNvbmRhcnkgZGlzcGxheSBjb250cm9sbGVyICovCisJX0RSTV9WQkxBTktfU0lHTkFMID0gMHg0MDAwMDAwMAkvKio8IFNlbmQgc2lnbmFsIGluc3RlYWQgb2YgYmxvY2tpbmcsIHVuc3VwcG9ydGVkICovCit9OworI2RlZmluZSBfRFJNX1ZCTEFOS19ISUdIX0NSVENfU0hJRlQgMQorCisjZGVmaW5lIF9EUk1fVkJMQU5LX1RZUEVTX01BU0sgKF9EUk1fVkJMQU5LX0FCU09MVVRFIHwgX0RSTV9WQkxBTktfUkVMQVRJVkUpCisjZGVmaW5lIF9EUk1fVkJMQU5LX0ZMQUdTX01BU0sgKF9EUk1fVkJMQU5LX0VWRU5UIHwgX0RSTV9WQkxBTktfU0lHTkFMIHwgXAorCQkJCV9EUk1fVkJMQU5LX1NFQ09OREFSWSB8IF9EUk1fVkJMQU5LX05FWFRPTk1JU1MpCisKK3N0cnVjdCBkcm1fd2FpdF92YmxhbmtfcmVxdWVzdCB7CisJZW51bSBkcm1fdmJsYW5rX3NlcV90eXBlIHR5cGU7CisJdW5zaWduZWQgaW50IHNlcXVlbmNlOworCXVuc2lnbmVkIGxvbmcgc2lnbmFsOworfTsKKworc3RydWN0IGRybV93YWl0X3ZibGFua19yZXBseSB7CisJZW51bSBkcm1fdmJsYW5rX3NlcV90eXBlIHR5cGU7CisJdW5zaWduZWQgaW50IHNlcXVlbmNlOworCWxvbmcgdHZhbF9zZWM7CisJbG9uZyB0dmFsX3VzZWM7Cit9OworCisvKioKKyAqIERSTV9JT0NUTF9XQUlUX1ZCTEFOSyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1XYWl0VkJsYW5rKCkuCisgKi8KK3VuaW9uIGRybV93YWl0X3ZibGFuayB7CisJc3RydWN0IGRybV93YWl0X3ZibGFua19yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IGRybV93YWl0X3ZibGFua19yZXBseSByZXBseTsKK307CisKKyNkZWZpbmUgX0RSTV9QUkVfTU9ERVNFVCAxCisjZGVmaW5lIF9EUk1fUE9TVF9NT0RFU0VUIDIKKworLyoqCisgKiBEUk1fSU9DVExfTU9ERVNFVF9DVEwgaW9jdGwgYXJndW1lbnQgdHlwZQorICoKKyAqIFxzYSBkcm1Nb2Rlc2V0Q3RsKCkuCisgKi8KK3N0cnVjdCBkcm1fbW9kZXNldF9jdGwgeworCV9fdTMyIGNydGM7CisJX191MzIgY21kOworfTsKKworLyoqCisgKiBEUk1fSU9DVExfQUdQX0VOQUJMRSBpb2N0bCBhcmd1bWVudCB0eXBlLgorICoKKyAqIFxzYSBkcm1BZ3BFbmFibGUoKS4KKyAqLworc3RydWN0IGRybV9hZ3BfbW9kZSB7CisJdW5zaWduZWQgbG9uZyBtb2RlOwkvKio8IEFHUCBtb2RlICovCit9OworCisvKioKKyAqIERSTV9JT0NUTF9BR1BfQUxMT0MgYW5kIERSTV9JT0NUTF9BR1BfRlJFRSBpb2N0bHMgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtQWdwQWxsb2MoKSBhbmQgZHJtQWdwRnJlZSgpLgorICovCitzdHJ1Y3QgZHJtX2FncF9idWZmZXIgeworCXVuc2lnbmVkIGxvbmcgc2l6ZTsJLyoqPCBJbiBieXRlcyAtLSB3aWxsIHJvdW5kIHRvIHBhZ2UgYm91bmRhcnkgKi8KKwl1bnNpZ25lZCBsb25nIGhhbmRsZTsJLyoqPCBVc2VkIGZvciBiaW5kaW5nIC8gdW5iaW5kaW5nICovCisJdW5zaWduZWQgbG9uZyB0eXBlOwkvKio8IFR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlICovCisJdW5zaWduZWQgbG9uZyBwaHlzaWNhbDsJLyoqPCBQaHlzaWNhbCB1c2VkIGJ5IGk4MTAgKi8KK307CisKKy8qKgorICogRFJNX0lPQ1RMX0FHUF9CSU5EIGFuZCBEUk1fSU9DVExfQUdQX1VOQklORCBpb2N0bHMgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtQWdwQmluZCgpIGFuZCBkcm1BZ3BVbmJpbmQoKS4KKyAqLworc3RydWN0IGRybV9hZ3BfYmluZGluZyB7CisJdW5zaWduZWQgbG9uZyBoYW5kbGU7CS8qKjwgRnJvbSBkcm1fYWdwX2J1ZmZlciAqLworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkvKio8IEluIGJ5dGVzIC0tIHdpbGwgcm91bmQgdG8gcGFnZSBib3VuZGFyeSAqLworfTsKKworLyoqCisgKiBEUk1fSU9DVExfQUdQX0lORk8gaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqCisgKiBcc2EgZHJtQWdwVmVyc2lvbk1ham9yKCksIGRybUFncFZlcnNpb25NaW5vcigpLCBkcm1BZ3BHZXRNb2RlKCksCisgKiBkcm1BZ3BCYXNlKCksIGRybUFncFNpemUoKSwgZHJtQWdwTWVtb3J5VXNlZCgpLCBkcm1BZ3BNZW1vcnlBdmFpbCgpLAorICogZHJtQWdwVmVuZG9ySWQoKSBhbmQgZHJtQWdwRGV2aWNlSWQoKS4KKyAqLworc3RydWN0IGRybV9hZ3BfaW5mbyB7CisJaW50IGFncF92ZXJzaW9uX21ham9yOworCWludCBhZ3BfdmVyc2lvbl9taW5vcjsKKwl1bnNpZ25lZCBsb25nIG1vZGU7CisJdW5zaWduZWQgbG9uZyBhcGVydHVyZV9iYXNlOwkvKiBwaHlzaWNhbCBhZGRyZXNzICovCisJdW5zaWduZWQgbG9uZyBhcGVydHVyZV9zaXplOwkvKiBieXRlcyAqLworCXVuc2lnbmVkIGxvbmcgbWVtb3J5X2FsbG93ZWQ7CS8qIGJ5dGVzICovCisJdW5zaWduZWQgbG9uZyBtZW1vcnlfdXNlZDsKKworCS8qIFBDSSBpbmZvcm1hdGlvbiAqLworCXVuc2lnbmVkIHNob3J0IGlkX3ZlbmRvcjsKKwl1bnNpZ25lZCBzaG9ydCBpZF9kZXZpY2U7Cit9OworCisvKioKKyAqIERSTV9JT0NUTF9TR19BTExPQyBpb2N0bCBhcmd1bWVudCB0eXBlLgorICovCitzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyIHsKKwl1bnNpZ25lZCBsb25nIHNpemU7CS8qKjwgSW4gYnl0ZXMgLS0gd2lsbCByb3VuZCB0byBwYWdlIGJvdW5kYXJ5ICovCisJdW5zaWduZWQgbG9uZyBoYW5kbGU7CS8qKjwgVXNlZCBmb3IgbWFwcGluZyAvIHVubWFwcGluZyAqLworfTsKKworLyoqCisgKiBEUk1fSU9DVExfU0VUX1ZFUlNJT04gaW9jdGwgYXJndW1lbnQgdHlwZS4KKyAqLworc3RydWN0IGRybV9zZXRfdmVyc2lvbiB7CisJaW50IGRybV9kaV9tYWpvcjsKKwlpbnQgZHJtX2RpX21pbm9yOworCWludCBkcm1fZGRfbWFqb3I7CisJaW50IGRybV9kZF9taW5vcjsKK307CisKKy8qKiBEUk1fSU9DVExfR0VNX0NMT1NFIGlvY3RsIGFyZ3VtZW50IHR5cGUgKi8KK3N0cnVjdCBkcm1fZ2VtX2Nsb3NlIHsKKwkvKiogSGFuZGxlIG9mIHRoZSBvYmplY3QgdG8gYmUgY2xvc2VkLiAqLworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBwYWQ7Cit9OworCisvKiogRFJNX0lPQ1RMX0dFTV9GTElOSyBpb2N0bCBhcmd1bWVudCB0eXBlICovCitzdHJ1Y3QgZHJtX2dlbV9mbGluayB7CisJLyoqIEhhbmRsZSBmb3IgdGhlIG9iamVjdCBiZWluZyBuYW1lZCAqLworCV9fdTMyIGhhbmRsZTsKKworCS8qKiBSZXR1cm5lZCBnbG9iYWwgbmFtZSAqLworCV9fdTMyIG5hbWU7Cit9OworCisvKiogRFJNX0lPQ1RMX0dFTV9PUEVOIGlvY3RsIGFyZ3VtZW50IHR5cGUgKi8KK3N0cnVjdCBkcm1fZ2VtX29wZW4geworCS8qKiBOYW1lIG9mIG9iamVjdCBiZWluZyBvcGVuZWQgKi8KKwlfX3UzMiBuYW1lOworCisJLyoqIFJldHVybmVkIGhhbmRsZSBmb3IgdGhlIG9iamVjdCAqLworCV9fdTMyIGhhbmRsZTsKKworCS8qKiBSZXR1cm5lZCBzaXplIG9mIHRoZSBvYmplY3QgKi8KKwlfX3U2NCBzaXplOworfTsKKworLyoqIERSTV9JT0NUTF9HRVRfQ0FQIGlvY3RsIGFyZ3VtZW50IHR5cGUgKi8KK3N0cnVjdCBkcm1fZ2V0X2NhcCB7CisJX191NjQgY2FwYWJpbGl0eTsKKwlfX3U2NCB2YWx1ZTsKK307CisKKyNpbmNsdWRlIDxkcm0vZHJtX21vZGUuaD4KKworI2RlZmluZSBEUk1fSU9DVExfQkFTRQkJCSdkJworI2RlZmluZSBEUk1fSU8obnIpCQkJX0lPKERSTV9JT0NUTF9CQVNFLG5yKQorI2RlZmluZSBEUk1fSU9SKG5yLHR5cGUpCQlfSU9SKERSTV9JT0NUTF9CQVNFLG5yLHR5cGUpCisjZGVmaW5lIERSTV9JT1cobnIsdHlwZSkJCV9JT1coRFJNX0lPQ1RMX0JBU0UsbnIsdHlwZSkKKyNkZWZpbmUgRFJNX0lPV1IobnIsdHlwZSkJCV9JT1dSKERSTV9JT0NUTF9CQVNFLG5yLHR5cGUpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZFUlNJT04JCURSTV9JT1dSKDB4MDAsIHN0cnVjdCBkcm1fdmVyc2lvbikKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9VTklRVUUJCURSTV9JT1dSKDB4MDEsIHN0cnVjdCBkcm1fdW5pcXVlKQorI2RlZmluZSBEUk1fSU9DVExfR0VUX01BR0lDCQlEUk1fSU9SKCAweDAyLCBzdHJ1Y3QgZHJtX2F1dGgpCisjZGVmaW5lIERSTV9JT0NUTF9JUlFfQlVTSUQJCURSTV9JT1dSKDB4MDMsIHN0cnVjdCBkcm1faXJxX2J1c2lkKQorI2RlZmluZSBEUk1fSU9DVExfR0VUX01BUCAgICAgICAgICAgICAgIERSTV9JT1dSKDB4MDQsIHN0cnVjdCBkcm1fbWFwKQorI2RlZmluZSBEUk1fSU9DVExfR0VUX0NMSUVOVCAgICAgICAgICAgIERSTV9JT1dSKDB4MDUsIHN0cnVjdCBkcm1fY2xpZW50KQorI2RlZmluZSBEUk1fSU9DVExfR0VUX1NUQVRTICAgICAgICAgICAgIERSTV9JT1IoIDB4MDYsIHN0cnVjdCBkcm1fc3RhdHMpCisjZGVmaW5lIERSTV9JT0NUTF9TRVRfVkVSU0lPTgkJRFJNX0lPV1IoMHgwNywgc3RydWN0IGRybV9zZXRfdmVyc2lvbikKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVTRVRfQ1RMICAgICAgICAgICBEUk1fSU9XKDB4MDgsIHN0cnVjdCBkcm1fbW9kZXNldF9jdGwpCisjZGVmaW5lIERSTV9JT0NUTF9HRU1fQ0xPU0UJCURSTV9JT1cgKDB4MDksIHN0cnVjdCBkcm1fZ2VtX2Nsb3NlKQorI2RlZmluZSBEUk1fSU9DVExfR0VNX0ZMSU5LCQlEUk1fSU9XUigweDBhLCBzdHJ1Y3QgZHJtX2dlbV9mbGluaykKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFTV9PUEVOCQlEUk1fSU9XUigweDBiLCBzdHJ1Y3QgZHJtX2dlbV9vcGVuKQorI2RlZmluZSBEUk1fSU9DVExfR0VUX0NBUAkJRFJNX0lPV1IoMHgwYywgc3RydWN0IGRybV9nZXRfY2FwKQorCisjZGVmaW5lIERSTV9JT0NUTF9TRVRfVU5JUVVFCQlEUk1fSU9XKCAweDEwLCBzdHJ1Y3QgZHJtX3VuaXF1ZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FVVEhfTUFHSUMJCURSTV9JT1coIDB4MTEsIHN0cnVjdCBkcm1fYXV0aCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0JMT0NLCQkJRFJNX0lPV1IoMHgxMiwgc3RydWN0IGRybV9ibG9jaykKKyNkZWZpbmUgRFJNX0lPQ1RMX1VOQkxPQ0sJCURSTV9JT1dSKDB4MTMsIHN0cnVjdCBkcm1fYmxvY2spCisjZGVmaW5lIERSTV9JT0NUTF9DT05UUk9MCQlEUk1fSU9XKCAweDE0LCBzdHJ1Y3QgZHJtX2NvbnRyb2wpCisjZGVmaW5lIERSTV9JT0NUTF9BRERfTUFQCQlEUk1fSU9XUigweDE1LCBzdHJ1Y3QgZHJtX21hcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FERF9CVUZTCQlEUk1fSU9XUigweDE2LCBzdHJ1Y3QgZHJtX2J1Zl9kZXNjKQorI2RlZmluZSBEUk1fSU9DVExfTUFSS19CVUZTCQlEUk1fSU9XKCAweDE3LCBzdHJ1Y3QgZHJtX2J1Zl9kZXNjKQorI2RlZmluZSBEUk1fSU9DVExfSU5GT19CVUZTCQlEUk1fSU9XUigweDE4LCBzdHJ1Y3QgZHJtX2J1Zl9pbmZvKQorI2RlZmluZSBEUk1fSU9DVExfTUFQX0JVRlMJCURSTV9JT1dSKDB4MTksIHN0cnVjdCBkcm1fYnVmX21hcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0ZSRUVfQlVGUwkJRFJNX0lPVyggMHgxYSwgc3RydWN0IGRybV9idWZfZnJlZSkKKworI2RlZmluZSBEUk1fSU9DVExfUk1fTUFQCQlEUk1fSU9XKCAweDFiLCBzdHJ1Y3QgZHJtX21hcCkKKworI2RlZmluZSBEUk1fSU9DVExfU0VUX1NBUkVBX0NUWAkJRFJNX0lPVyggMHgxYywgc3RydWN0IGRybV9jdHhfcHJpdl9tYXApCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfU0FSRUFfQ1RYIAlEUk1fSU9XUigweDFkLCBzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCkKKworI2RlZmluZSBEUk1fSU9DVExfU0VUX01BU1RFUiAgICAgICAgICAgIERSTV9JTygweDFlKQorI2RlZmluZSBEUk1fSU9DVExfRFJPUF9NQVNURVIgICAgICAgICAgIERSTV9JTygweDFmKQorCisjZGVmaW5lIERSTV9JT0NUTF9BRERfQ1RYCQlEUk1fSU9XUigweDIwLCBzdHJ1Y3QgZHJtX2N0eCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JNX0NUWAkJRFJNX0lPV1IoMHgyMSwgc3RydWN0IGRybV9jdHgpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RfQ1RYCQlEUk1fSU9XKCAweDIyLCBzdHJ1Y3QgZHJtX2N0eCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9DVFgJCURSTV9JT1dSKDB4MjMsIHN0cnVjdCBkcm1fY3R4KQorI2RlZmluZSBEUk1fSU9DVExfU1dJVENIX0NUWAkJRFJNX0lPVyggMHgyNCwgc3RydWN0IGRybV9jdHgpCisjZGVmaW5lIERSTV9JT0NUTF9ORVdfQ1RYCQlEUk1fSU9XKCAweDI1LCBzdHJ1Y3QgZHJtX2N0eCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JFU19DVFgJCURSTV9JT1dSKDB4MjYsIHN0cnVjdCBkcm1fY3R4X3JlcykKKyNkZWZpbmUgRFJNX0lPQ1RMX0FERF9EUkFXCQlEUk1fSU9XUigweDI3LCBzdHJ1Y3QgZHJtX2RyYXcpCisjZGVmaW5lIERSTV9JT0NUTF9STV9EUkFXCQlEUk1fSU9XUigweDI4LCBzdHJ1Y3QgZHJtX2RyYXcpCisjZGVmaW5lIERSTV9JT0NUTF9ETUEJCQlEUk1fSU9XUigweDI5LCBzdHJ1Y3QgZHJtX2RtYSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0xPQ0sJCQlEUk1fSU9XKCAweDJhLCBzdHJ1Y3QgZHJtX2xvY2spCisjZGVmaW5lIERSTV9JT0NUTF9VTkxPQ0sJCURSTV9JT1coIDB4MmIsIHN0cnVjdCBkcm1fbG9jaykKKyNkZWZpbmUgRFJNX0lPQ1RMX0ZJTklTSAkJRFJNX0lPVyggMHgyYywgc3RydWN0IGRybV9sb2NrKQorCisjZGVmaW5lIERSTV9JT0NUTF9HRU1fUFJJTUVfT1BFTiAgICAgICAgRFJNX0lPV1IoMHgyZSwgc3RydWN0IGRybV9nZW1fb3BlbikKKworI2RlZmluZSBEUk1fSU9DVExfQUdQX0FDUVVJUkUJCURSTV9JTyggIDB4MzApCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfUkVMRUFTRQkJRFJNX0lPKCAgMHgzMSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9FTkFCTEUJCURSTV9JT1coIDB4MzIsIHN0cnVjdCBkcm1fYWdwX21vZGUpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfSU5GTwkJRFJNX0lPUiggMHgzMywgc3RydWN0IGRybV9hZ3BfaW5mbykKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9BTExPQwkJRFJNX0lPV1IoMHgzNCwgc3RydWN0IGRybV9hZ3BfYnVmZmVyKQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0ZSRUUJCURSTV9JT1coIDB4MzUsIHN0cnVjdCBkcm1fYWdwX2J1ZmZlcikKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9CSU5ECQlEUk1fSU9XKCAweDM2LCBzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nKQorI2RlZmluZSBEUk1fSU9DVExfQUdQX1VOQklORAkJRFJNX0lPVyggMHgzNywgc3RydWN0IGRybV9hZ3BfYmluZGluZykKKworI2RlZmluZSBEUk1fSU9DVExfU0dfQUxMT0MJCURSTV9JT1dSKDB4MzgsIHN0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIpCisjZGVmaW5lIERSTV9JT0NUTF9TR19GUkVFCQlEUk1fSU9XKCAweDM5LCBzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyKQorCisjZGVmaW5lIERSTV9JT0NUTF9XQUlUX1ZCTEFOSwkJRFJNX0lPV1IoMHgzYSwgdW5pb24gZHJtX3dhaXRfdmJsYW5rKQorCisjZGVmaW5lIERSTV9JT0NUTF9VUERBVEVfRFJBVwkJRFJNX0lPVygweDNmLCBzdHJ1Y3QgZHJtX3VwZGF0ZV9kcmF3KQorCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0dFVFJFU09VUkNFUwlEUk1fSU9XUigweEEwLCBzdHJ1Y3QgZHJtX21vZGVfY2FyZF9yZXMpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0dFVENSVEMJCURSTV9JT1dSKDB4QTEsIHN0cnVjdCBkcm1fbW9kZV9jcnRjKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9TRVRDUlRDCQlEUk1fSU9XUigweEEyLCBzdHJ1Y3QgZHJtX21vZGVfY3J0YykKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfQ1VSU09SCQlEUk1fSU9XUigweEEzLCBzdHJ1Y3QgZHJtX21vZGVfY3Vyc29yKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9HRVRHQU1NQQkJRFJNX0lPV1IoMHhBNCwgc3RydWN0IGRybV9tb2RlX2NydGNfbHV0KQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9TRVRHQU1NQQkJRFJNX0lPV1IoMHhBNSwgc3RydWN0IGRybV9tb2RlX2NydGNfbHV0KQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9HRVRFTkNPREVSCURSTV9JT1dSKDB4QTYsIHN0cnVjdCBkcm1fbW9kZV9nZXRfZW5jb2RlcikKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfR0VUQ09OTkVDVE9SCURSTV9JT1dSKDB4QTcsIHN0cnVjdCBkcm1fbW9kZV9nZXRfY29ubmVjdG9yKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9BVFRBQ0hNT0RFCURSTV9JT1dSKDB4QTgsIHN0cnVjdCBkcm1fbW9kZV9tb2RlX2NtZCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfREVUQUNITU9ERQlEUk1fSU9XUigweEE5LCBzdHJ1Y3QgZHJtX21vZGVfbW9kZV9jbWQpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfR0VUUFJPUEVSVFkJRFJNX0lPV1IoMHhBQSwgc3RydWN0IGRybV9tb2RlX2dldF9wcm9wZXJ0eSkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfU0VUUFJPUEVSVFkJRFJNX0lPV1IoMHhBQiwgc3RydWN0IGRybV9tb2RlX2Nvbm5lY3Rvcl9zZXRfcHJvcGVydHkpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0dFVFBST1BCTE9CCURSTV9JT1dSKDB4QUMsIHN0cnVjdCBkcm1fbW9kZV9nZXRfYmxvYikKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfR0VURkIJCURSTV9JT1dSKDB4QUQsIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0FEREZCCQlEUk1fSU9XUigweEFFLCBzdHJ1Y3QgZHJtX21vZGVfZmJfY21kKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9STUZCCQlEUk1fSU9XUigweEFGLCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX1BBR0VfRkxJUAlEUk1fSU9XUigweEIwLCBzdHJ1Y3QgZHJtX21vZGVfY3J0Y19wYWdlX2ZsaXApCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0RJUlRZRkIJCURSTV9JT1dSKDB4QjEsIHN0cnVjdCBkcm1fbW9kZV9mYl9kaXJ0eV9jbWQpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfQ1JFQVRFX0RVTUIgRFJNX0lPV1IoMHhCMiwgc3RydWN0IGRybV9tb2RlX2NyZWF0ZV9kdW1iKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9NQVBfRFVNQiAgICBEUk1fSU9XUigweEIzLCBzdHJ1Y3QgZHJtX21vZGVfbWFwX2R1bWIpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0RFU1RST1lfRFVNQiAgICBEUk1fSU9XUigweEI0LCBzdHJ1Y3QgZHJtX21vZGVfZGVzdHJveV9kdW1iKQorCisvKioKKyAqIERldmljZSBzcGVjaWZpYyBpb2N0bHMgc2hvdWxkIG9ubHkgYmUgaW4gdGhlaXIgcmVzcGVjdGl2ZSBoZWFkZXJzCisgKiBUaGUgZGV2aWNlIHNwZWNpZmljIGlvY3RsIHJhbmdlIGlzIGZyb20gMHg0MCB0byAweDk5LgorICogR2VuZXJpYyBJT0NUTFMgcmVzdGFydCBhdCAweEEwLgorICoKKyAqIFxzYSBkcm1Db21tYW5kTm9uZSgpLCBkcm1Db21tYW5kUmVhZCgpLCBkcm1Db21tYW5kV3JpdGUoKSwgYW5kCisgKiBkcm1Db21tYW5kUmVhZFdyaXRlKCkuCisgKi8KKyNkZWZpbmUgRFJNX0NPTU1BTkRfQkFTRSAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIERSTV9DT01NQU5EX0VORAkJCTB4QTAKKworLyoqCisgKiBIZWFkZXIgZm9yIGV2ZW50cyB3cml0dGVuIGJhY2sgdG8gdXNlcnNwYWNlIG9uIHRoZSBkcm0gZmQuICBUaGUKKyAqIHR5cGUgZGVmaW5lcyB0aGUgdHlwZSBvZiBldmVudCwgdGhlIGxlbmd0aCBzcGVjaWZpZXMgdGhlIHRvdGFsCisgKiBsZW5ndGggb2YgdGhlIGV2ZW50IChpbmNsdWRpbmcgdGhlIGhlYWRlciksIGFuZCB1c2VyX2RhdGEgaXMKKyAqIHR5cGljYWxseSBhIDY0IGJpdCB2YWx1ZSBwYXNzZWQgd2l0aCB0aGUgaW9jdGwgdGhhdCB0cmlnZ2VyZWQgdGhlCisgKiBldmVudC4gIEEgcmVhZCBvbiB0aGUgZHJtIGZkIHdpbGwgYWx3YXlzIG9ubHkgcmV0dXJuIGNvbXBsZXRlCisgKiBldmVudHMsIHRoYXQgaXMsIGlmIGZvciBleGFtcGxlIHRoZSByZWFkIGJ1ZmZlciBpcyAxMDAgYnl0ZXMsIGFuZAorICogdGhlcmUgYXJlIHR3byA2NCBieXRlIGV2ZW50cyBwZW5kaW5nLCBvbmx5IG9uZSB3aWxsIGJlIHJldHVybmVkLgorICoKKyAqIEV2ZW50IHR5cGVzIDAgLSAweDdmZmZmZmZmIGFyZSBnZW5lcmljIGRybSBldmVudHMsIDB4ODAwMDAwMDAgYW5kCisgKiB1cCBhcmUgY2hpcHNldCBzcGVjaWZpYy4KKyAqLworc3RydWN0IGRybV9ldmVudCB7CisJX191MzIgdHlwZTsKKwlfX3UzMiBsZW5ndGg7Cit9OworCisjZGVmaW5lIERSTV9FVkVOVF9WQkxBTksgMHgwMQorI2RlZmluZSBEUk1fRVZFTlRfRkxJUF9DT01QTEVURSAweDAyCisKK3N0cnVjdCBkcm1fZXZlbnRfdmJsYW5rIHsKKwlzdHJ1Y3QgZHJtX2V2ZW50IGJhc2U7CisJX191NjQgdXNlcl9kYXRhOworCV9fdTMyIHR2X3NlYzsKKwlfX3UzMiB0dl91c2VjOworCV9fdTMyIHNlcXVlbmNlOworCV9fdTMyIHJlc2VydmVkOworfTsKKworI2RlZmluZSBEUk1fQ0FQX0RVTUJfQlVGRkVSIDB4MQorI2RlZmluZSBEUk1fQ0FQX1ZCTEFOS19ISUdIX0NSVEMgMHgyCisKKy8qIHR5cGVkZWYgYXJlYSAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBkcm1fY2xpcF9yZWN0X3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fZHJhd2FibGVfaW5mbyBkcm1fZHJhd2FibGVfaW5mb190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3RleF9yZWdpb24gZHJtX3RleF9yZWdpb25fdDsKK3R5cGVkZWYgc3RydWN0IGRybV9od19sb2NrIGRybV9od19sb2NrX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fdmVyc2lvbiBkcm1fdmVyc2lvbl90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3VuaXF1ZSBkcm1fdW5pcXVlX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fbGlzdCBkcm1fbGlzdF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2Jsb2NrIGRybV9ibG9ja190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2NvbnRyb2wgZHJtX2NvbnRyb2xfdDsKK3R5cGVkZWYgZW51bSBkcm1fbWFwX3R5cGUgZHJtX21hcF90eXBlX3Q7Cit0eXBlZGVmIGVudW0gZHJtX21hcF9mbGFncyBkcm1fbWFwX2ZsYWdzX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fY3R4X3ByaXZfbWFwIGRybV9jdHhfcHJpdl9tYXBfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9tYXAgZHJtX21hcF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2NsaWVudCBkcm1fY2xpZW50X3Q7Cit0eXBlZGVmIGVudW0gZHJtX3N0YXRfdHlwZSBkcm1fc3RhdF90eXBlX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fc3RhdHMgZHJtX3N0YXRzX3Q7Cit0eXBlZGVmIGVudW0gZHJtX2xvY2tfZmxhZ3MgZHJtX2xvY2tfZmxhZ3NfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9sb2NrIGRybV9sb2NrX3Q7Cit0eXBlZGVmIGVudW0gZHJtX2RtYV9mbGFncyBkcm1fZG1hX2ZsYWdzX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX2Rlc2MgZHJtX2J1Zl9kZXNjX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX2luZm8gZHJtX2J1Zl9pbmZvX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX2ZyZWUgZHJtX2J1Zl9mcmVlX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX3B1YiBkcm1fYnVmX3B1Yl90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9tYXAgZHJtX2J1Zl9tYXBfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9kbWEgZHJtX2RtYV90OwordHlwZWRlZiB1bmlvbiBkcm1fd2FpdF92YmxhbmsgZHJtX3dhaXRfdmJsYW5rX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX21vZGUgZHJtX2FncF9tb2RlX3Q7Cit0eXBlZGVmIGVudW0gZHJtX2N0eF9mbGFncyBkcm1fY3R4X2ZsYWdzX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fY3R4IGRybV9jdHhfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9jdHhfcmVzIGRybV9jdHhfcmVzX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fZHJhdyBkcm1fZHJhd190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3VwZGF0ZV9kcmF3IGRybV91cGRhdGVfZHJhd190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2F1dGggZHJtX2F1dGhfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9pcnFfYnVzaWQgZHJtX2lycV9idXNpZF90OwordHlwZWRlZiBlbnVtIGRybV92Ymxhbmtfc2VxX3R5cGUgZHJtX3ZibGFua19zZXFfdHlwZV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2J1ZmZlciBkcm1fYWdwX2J1ZmZlcl90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nIGRybV9hZ3BfYmluZGluZ190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9pbmZvIGRybV9hZ3BfaW5mb190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyIGRybV9zY2F0dGVyX2dhdGhlcl90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NldF92ZXJzaW9uIGRybV9zZXRfdmVyc2lvbl90OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL2RybV9tb2RlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2RybS9kcm1fbW9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZDQ2ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2RybS9kcm1fbW9kZS5oCkBAIC0wLDAgKzEsMzgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3IERhdmUgQWlybGllIDxhaXJsaWVkQGxpbnV4LmllPgorICogQ29weXJpZ2h0IChjKSAyMDA3IEpha29iIEJvcm5lY3JhbnR6IDx3YWxsYnJha2VyQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBSZWQgSGF0IEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUWC4sIFVTQQorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRFJNX01PREVfSAorI2RlZmluZSBfRFJNX01PREVfSAorCisjZGVmaW5lIERSTV9ESVNQTEFZX0lORk9fTEVOCTMyCisjZGVmaW5lIERSTV9DT05ORUNUT1JfTkFNRV9MRU4JMzIKKyNkZWZpbmUgRFJNX0RJU1BMQVlfTU9ERV9MRU4JMzIKKyNkZWZpbmUgRFJNX1BST1BfTkFNRV9MRU4JMzIKKworI2RlZmluZSBEUk1fTU9ERV9UWVBFX0JVSUxUSU4JKDE8PDApCisjZGVmaW5lIERSTV9NT0RFX1RZUEVfQ0xPQ0tfQwkoKDE8PDEpIHwgRFJNX01PREVfVFlQRV9CVUlMVElOKQorI2RlZmluZSBEUk1fTU9ERV9UWVBFX0NSVENfQwkoKDE8PDIpIHwgRFJNX01PREVfVFlQRV9CVUlMVElOKQorI2RlZmluZSBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRAkoMTw8MykKKyNkZWZpbmUgRFJNX01PREVfVFlQRV9ERUZBVUxUCSgxPDw0KQorI2RlZmluZSBEUk1fTU9ERV9UWVBFX1VTRVJERUYJKDE8PDUpCisjZGVmaW5lIERSTV9NT0RFX1RZUEVfRFJJVkVSCSgxPDw2KQorCisvKiBWaWRlbyBtb2RlIGZsYWdzICovCisvKiBiaXQgY29tcGF0aWJsZSB3aXRoIHRoZSB4b3JnIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBEUk1fTU9ERV9GTEFHX1BIU1lOQwkoMTw8MCkKKyNkZWZpbmUgRFJNX01PREVfRkxBR19OSFNZTkMJKDE8PDEpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfUFZTWU5DCSgxPDwyKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX05WU1lOQwkoMTw8MykKKyNkZWZpbmUgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UJKDE8PDQpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfREJMU0NBTgkoMTw8NSkKKyNkZWZpbmUgRFJNX01PREVfRkxBR19DU1lOQwkoMTw8NikKKyNkZWZpbmUgRFJNX01PREVfRkxBR19QQ1NZTkMJKDE8PDcpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfTkNTWU5DCSgxPDw4KQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX0hTS0VXCSgxPDw5KSAvKiBoc2tldyBwcm92aWRlZCAqLworI2RlZmluZSBEUk1fTU9ERV9GTEFHX0JDQVNUCSgxPDwxMCkKKyNkZWZpbmUgRFJNX01PREVfRkxBR19QSVhNVVgJKDE8PDExKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX0RCTENMSwkoMTw8MTIpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfQ0xLRElWMgkoMTw8MTMpCisKKy8qIERQTVMgZmxhZ3MgKi8KKy8qIGJpdCBjb21wYXRpYmxlIHdpdGggdGhlIHhvcmcgZGVmaW5pdGlvbnMuICovCisjZGVmaW5lIERSTV9NT0RFX0RQTVNfT04JMAorI2RlZmluZSBEUk1fTU9ERV9EUE1TX1NUQU5EQlkJMQorI2RlZmluZSBEUk1fTU9ERV9EUE1TX1NVU1BFTkQJMgorI2RlZmluZSBEUk1fTU9ERV9EUE1TX09GRgkzCisKKy8qIFNjYWxpbmcgbW9kZSBvcHRpb25zICovCisjZGVmaW5lIERSTV9NT0RFX1NDQUxFX05PTkUJCTAgLyogVW5tb2RpZmllZCB0aW1pbmcgKGRpc3BsYXkgb3IKKwkJCQkJICAgICBzb2Z0d2FyZSBjYW4gc3RpbGwgc2NhbGUpICovCisjZGVmaW5lIERSTV9NT0RFX1NDQUxFX0ZVTExTQ1JFRU4JMSAvKiBGdWxsIHNjcmVlbiwgaWdub3JlIGFzcGVjdCAqLworI2RlZmluZSBEUk1fTU9ERV9TQ0FMRV9DRU5URVIJCTIgLyogQ2VudGVyZWQsIG5vIHNjYWxpbmcgKi8KKyNkZWZpbmUgRFJNX01PREVfU0NBTEVfQVNQRUNUCQkzIC8qIEZ1bGwgc2NyZWVuLCBwcmVzZXJ2ZSBhc3BlY3QgKi8KKworLyogRGl0aGVyaW5nIG1vZGUgb3B0aW9ucyAqLworI2RlZmluZSBEUk1fTU9ERV9ESVRIRVJJTkdfT0ZGCTAKKyNkZWZpbmUgRFJNX01PREVfRElUSEVSSU5HX09OCTEKKyNkZWZpbmUgRFJNX01PREVfRElUSEVSSU5HX0FVVE8gMgorCisvKiBEaXJ0eSBpbmZvIG9wdGlvbnMgKi8KKyNkZWZpbmUgRFJNX01PREVfRElSVFlfT0ZGICAgICAgMAorI2RlZmluZSBEUk1fTU9ERV9ESVJUWV9PTiAgICAgICAxCisjZGVmaW5lIERSTV9NT0RFX0RJUlRZX0FOTk9UQVRFIDIKKworc3RydWN0IGRybV9tb2RlX21vZGVpbmZvIHsKKwlfX3UzMiBjbG9jazsKKwlfX3UxNiBoZGlzcGxheSwgaHN5bmNfc3RhcnQsIGhzeW5jX2VuZCwgaHRvdGFsLCBoc2tldzsKKwlfX3UxNiB2ZGlzcGxheSwgdnN5bmNfc3RhcnQsIHZzeW5jX2VuZCwgdnRvdGFsLCB2c2NhbjsKKworCV9fdTMyIHZyZWZyZXNoOworCisJX191MzIgZmxhZ3M7CisJX191MzIgdHlwZTsKKwljaGFyIG5hbWVbRFJNX0RJU1BMQVlfTU9ERV9MRU5dOworfTsKKworc3RydWN0IGRybV9tb2RlX2NhcmRfcmVzIHsKKwlfX3U2NCBmYl9pZF9wdHI7CisJX191NjQgY3J0Y19pZF9wdHI7CisJX191NjQgY29ubmVjdG9yX2lkX3B0cjsKKwlfX3U2NCBlbmNvZGVyX2lkX3B0cjsKKwlfX3UzMiBjb3VudF9mYnM7CisJX191MzIgY291bnRfY3J0Y3M7CisJX191MzIgY291bnRfY29ubmVjdG9yczsKKwlfX3UzMiBjb3VudF9lbmNvZGVyczsKKwlfX3UzMiBtaW5fd2lkdGgsIG1heF93aWR0aDsKKwlfX3UzMiBtaW5faGVpZ2h0LCBtYXhfaGVpZ2h0OworfTsKKworc3RydWN0IGRybV9tb2RlX2NydGMgeworCV9fdTY0IHNldF9jb25uZWN0b3JzX3B0cjsKKwlfX3UzMiBjb3VudF9jb25uZWN0b3JzOworCisJX191MzIgY3J0Y19pZDsgLyoqPCBJZCAqLworCV9fdTMyIGZiX2lkOyAvKio8IElkIG9mIGZyYW1lYnVmZmVyICovCisKKwlfX3UzMiB4LCB5OyAvKio8IFBvc2l0aW9uIG9uIHRoZSBmcmFtZXVmZmVyICovCisKKwlfX3UzMiBnYW1tYV9zaXplOworCV9fdTMyIG1vZGVfdmFsaWQ7CisJc3RydWN0IGRybV9tb2RlX21vZGVpbmZvIG1vZGU7Cit9OworCisjZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfTk9ORQkgMAorI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX0RBQwkgMQorI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX1RNRFMJIDIKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9MVkRTCSAzCisjZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfVFZEQUMJIDQKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9WSVJUVUFMIDUKKworc3RydWN0IGRybV9tb2RlX2dldF9lbmNvZGVyIHsKKwlfX3UzMiBlbmNvZGVyX2lkOworCV9fdTMyIGVuY29kZXJfdHlwZTsKKworCV9fdTMyIGNydGNfaWQ7IC8qKjwgSWQgb2YgY3J0YyAqLworCisJX191MzIgcG9zc2libGVfY3J0Y3M7CisJX191MzIgcG9zc2libGVfY2xvbmVzOworfTsKKworLyogVGhpcyBpcyBmb3IgY29ubmVjdG9ycyB3aXRoIG11bHRpcGxlIHNpZ25hbCB0eXBlcy4gKi8KKy8qIFRyeSB0byBtYXRjaCBEUk1fTU9ERV9DT05ORUNUT1JfWCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlLiAqLworI2RlZmluZSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfQXV0b21hdGljCTAKKyNkZWZpbmUgRFJNX01PREVfU1VCQ09OTkVDVE9SX1Vua25vd24JMAorI2RlZmluZSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfRFZJRAkzCisjZGVmaW5lIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9EVklBCTQKKyNkZWZpbmUgRFJNX01PREVfU1VCQ09OTkVDVE9SX0NvbXBvc2l0ZQk1CisjZGVmaW5lIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9TVklERU8JNgorI2RlZmluZSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfQ29tcG9uZW50CTgKKyNkZWZpbmUgRFJNX01PREVfU1VCQ09OTkVDVE9SX1NDQVJUCTkKKworI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfVW5rbm93bgkwCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9WR0EJCTEKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0RWSUkJCTIKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0RWSUQJCTMKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0RWSUEJCTQKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0NvbXBvc2l0ZQk1CisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9TVklERU8JNgorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUwkJNworI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfQ29tcG9uZW50CTgKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SXzlQaW5ESU4JOQorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfRGlzcGxheVBvcnQJMTAKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0hETUlBCTExCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQgkxMgorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfVFYJCTEzCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9lRFAJCTE0CisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9WSVJUVUFMICAgICAgMTUKKworc3RydWN0IGRybV9tb2RlX2dldF9jb25uZWN0b3IgeworCisJX191NjQgZW5jb2RlcnNfcHRyOworCV9fdTY0IG1vZGVzX3B0cjsKKwlfX3U2NCBwcm9wc19wdHI7CisJX191NjQgcHJvcF92YWx1ZXNfcHRyOworCisJX191MzIgY291bnRfbW9kZXM7CisJX191MzIgY291bnRfcHJvcHM7CisJX191MzIgY291bnRfZW5jb2RlcnM7CisKKwlfX3UzMiBlbmNvZGVyX2lkOyAvKio8IEN1cnJlbnQgRW5jb2RlciAqLworCV9fdTMyIGNvbm5lY3Rvcl9pZDsgLyoqPCBJZCAqLworCV9fdTMyIGNvbm5lY3Rvcl90eXBlOworCV9fdTMyIGNvbm5lY3Rvcl90eXBlX2lkOworCisJX191MzIgY29ubmVjdGlvbjsKKwlfX3UzMiBtbV93aWR0aCwgbW1faGVpZ2h0OyAvKio8IEh4VyBpbiBtaWxsaW1ldGVycyAqLworCV9fdTMyIHN1YnBpeGVsOworfTsKKworI2RlZmluZSBEUk1fTU9ERV9QUk9QX1BFTkRJTkcJKDE8PDApCisjZGVmaW5lIERSTV9NT0RFX1BST1BfUkFOR0UJKDE8PDEpCisjZGVmaW5lIERSTV9NT0RFX1BST1BfSU1NVVRBQkxFCSgxPDwyKQorI2RlZmluZSBEUk1fTU9ERV9QUk9QX0VOVU0JKDE8PDMpIC8qIGVudW1lcmF0ZWQgdHlwZSB3aXRoIHRleHQgc3RyaW5ncyAqLworI2RlZmluZSBEUk1fTU9ERV9QUk9QX0JMT0IJKDE8PDQpCisKK3N0cnVjdCBkcm1fbW9kZV9wcm9wZXJ0eV9lbnVtIHsKKwlfX3U2NCB2YWx1ZTsKKwljaGFyIG5hbWVbRFJNX1BST1BfTkFNRV9MRU5dOworfTsKKworc3RydWN0IGRybV9tb2RlX2dldF9wcm9wZXJ0eSB7CisJX191NjQgdmFsdWVzX3B0cjsgLyogdmFsdWVzIGFuZCBibG9iIGxlbmd0aHMgKi8KKwlfX3U2NCBlbnVtX2Jsb2JfcHRyOyAvKiBlbnVtIGFuZCBibG9iIGlkIHB0cnMgKi8KKworCV9fdTMyIHByb3BfaWQ7CisJX191MzIgZmxhZ3M7CisJY2hhciBuYW1lW0RSTV9QUk9QX05BTUVfTEVOXTsKKworCV9fdTMyIGNvdW50X3ZhbHVlczsKKwlfX3UzMiBjb3VudF9lbnVtX2Jsb2JzOworfTsKKworc3RydWN0IGRybV9tb2RlX2Nvbm5lY3Rvcl9zZXRfcHJvcGVydHkgeworCV9fdTY0IHZhbHVlOworCV9fdTMyIHByb3BfaWQ7CisJX191MzIgY29ubmVjdG9yX2lkOworfTsKKworc3RydWN0IGRybV9tb2RlX2dldF9ibG9iIHsKKwlfX3UzMiBibG9iX2lkOworCV9fdTMyIGxlbmd0aDsKKwlfX3U2NCBkYXRhOworfTsKKworc3RydWN0IGRybV9tb2RlX2ZiX2NtZCB7CisJX191MzIgZmJfaWQ7CisJX191MzIgd2lkdGgsIGhlaWdodDsKKwlfX3UzMiBwaXRjaDsKKwlfX3UzMiBicHA7CisJX191MzIgZGVwdGg7CisJLyogZHJpdmVyIHNwZWNpZmljIGhhbmRsZSAqLworCV9fdTMyIGhhbmRsZTsKK307CisKKyNkZWZpbmUgRFJNX01PREVfRkJfRElSVFlfQU5OT1RBVEVfQ09QWSAweDAxCisjZGVmaW5lIERSTV9NT0RFX0ZCX0RJUlRZX0FOTk9UQVRFX0ZJTEwgMHgwMgorI2RlZmluZSBEUk1fTU9ERV9GQl9ESVJUWV9GTEFHUyAgICAgICAgIDB4MDMKKworI2RlZmluZSBEUk1fTU9ERV9GQl9ESVJUWV9NQVhfQ0xJUFMgICAgIDI1NgorCisvKgorICogTWFyayBhIHJlZ2lvbiBvZiBhIGZyYW1lYnVmZmVyIGFzIGRpcnR5LgorICoKKyAqIFNvbWUgaGFyZHdhcmUgZG9lcyBub3QgYXV0b21hdGljYWxseSB1cGRhdGUgZGlzcGxheSBjb250ZW50cworICogYXMgYSBoYXJkd2FyZSBvciBzb2Z0d2FyZSBkcmF3IHRvIGEgZnJhbWVidWZmZXIuIFRoaXMgaW9jdGwKKyAqIGFsbG93cyB1c2Vyc3BhY2UgdG8gdGVsbCB0aGUga2VybmVsIGFuZCB0aGUgaGFyZHdhcmUgd2hhdAorICogcmVnaW9ucyBvZiB0aGUgZnJhbWVidWZmZXIgaGF2ZSBjaGFuZ2VkLgorICoKKyAqIFRoZSBrZXJuZWwgb3IgaGFyZHdhcmUgaXMgZnJlZSB0byB1cGRhdGUgbW9yZSB0aGVuIGp1c3QgdGhlCisgKiByZWdpb24gc3BlY2lmaWVkIGJ5IHRoZSBjbGlwIHJlY3RzLiBUaGUga2VybmVsIG9yIGhhcmR3YXJlCisgKiBtYXkgYWxzbyBkZWxheSBhbmQvb3IgY29hbGVzY2Ugc2V2ZXJhbCBjYWxscyB0byBkaXJ0eSBpbnRvIGEKKyAqIHNpbmdsZSB1cGRhdGUuCisgKgorICogVXNlcnNwYWNlIG1heSBhbm5vdGF0ZSB0aGUgdXBkYXRlcywgdGhlIGFubm90YXRlcyBhcmUgYQorICogcHJvbWlzZSBtYWRlIGJ5IHRoZSBjYWxsZXIgdGhhdCB0aGUgY2hhbmdlIGlzIGVpdGhlciBhIGNvcHkKKyAqIG9mIHBpeGVscyBvciBhIGZpbGwgb2YgYSBzaW5nbGUgY29sb3IgaW4gdGhlIHJlZ2lvbiBzcGVjaWZpZWQuCisgKgorICogSWYgdGhlIERSTV9NT0RFX0ZCX0RJUlRZX0FOTk9UQVRFX0NPUFkgZmxhZyBpcyBnaXZlbiB0aGVuCisgKiB0aGUgbnVtYmVyIG9mIHVwZGF0ZWQgcmVnaW9ucyBhcmUgaGFsZiBvZiBudW1fY2xpcHMgZ2l2ZW4sCisgKiB3aGVyZSB0aGUgY2xpcCByZWN0cyBhcmUgcGFpcmVkIGluIHNyYyBhbmQgZHN0LiBUaGUgd2lkdGggYW5kCisgKiBoZWlnaHQgb2YgZWFjaCBvbmUgb2YgdGhlIHBhaXJzIG11c3QgbWF0Y2guCisgKgorICogSWYgdGhlIERSTV9NT0RFX0ZCX0RJUlRZX0FOTk9UQVRFX0ZJTEwgZmxhZyBpcyBnaXZlbiB0aGUgY2FsbGVyCisgKiBwcm9taXNlcyB0aGF0IHRoZSByZWdpb24gc3BlY2lmaWVkIG9mIHRoZSBjbGlwIHJlY3RzIGlzIGZpbGxlZAorICogY29tcGxldGVseSB3aXRoIGEgc2luZ2xlIGNvbG9yIGFzIGdpdmVuIGluIHRoZSBjb2xvciBhcmd1bWVudC4KKyAqLworCitzdHJ1Y3QgZHJtX21vZGVfZmJfZGlydHlfY21kIHsKKwlfX3UzMiBmYl9pZDsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBjb2xvcjsKKwlfX3UzMiBudW1fY2xpcHM7CisJX191NjQgY2xpcHNfcHRyOworfTsKKworc3RydWN0IGRybV9tb2RlX21vZGVfY21kIHsKKwlfX3UzMiBjb25uZWN0b3JfaWQ7CisJc3RydWN0IGRybV9tb2RlX21vZGVpbmZvIG1vZGU7Cit9OworCisjZGVmaW5lIERSTV9NT0RFX0NVUlNPUl9CTwkoMTw8MCkKKyNkZWZpbmUgRFJNX01PREVfQ1VSU09SX01PVkUJKDE8PDEpCisKKy8qCisgKiBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIGluIGZsYWdzIGRpZmZlcmVudCBtZW1iZXJzIGFyZSB1c2VkLgorICoKKyAqIENVUlNPUl9CTyB1c2VzCisgKiAgICBjcnRjCisgKiAgICB3aWR0aAorICogICAgaGVpZ2h0CisgKiAgICBoYW5kbGUgLSBpZiAwIHR1cm5zIHRoZSBjdXJzb3Igb2YKKyAqCisgKiBDVVJTT1JfTU9WRSB1c2VzCisgKiAgICBjcnRjCisgKiAgICB4CisgKiAgICB5CisgKi8KK3N0cnVjdCBkcm1fbW9kZV9jdXJzb3IgeworCV9fdTMyIGZsYWdzOworCV9fdTMyIGNydGNfaWQ7CisJX19zMzIgeDsKKwlfX3MzMiB5OworCV9fdTMyIHdpZHRoOworCV9fdTMyIGhlaWdodDsKKwkvKiBkcml2ZXIgc3BlY2lmaWMgaGFuZGxlICovCisJX191MzIgaGFuZGxlOworfTsKKworc3RydWN0IGRybV9tb2RlX2NydGNfbHV0IHsKKwlfX3UzMiBjcnRjX2lkOworCV9fdTMyIGdhbW1hX3NpemU7CisKKwkvKiBwb2ludGVycyB0byBhcnJheXMgKi8KKwlfX3U2NCByZWQ7CisJX191NjQgZ3JlZW47CisJX191NjQgYmx1ZTsKK307CisKKyNkZWZpbmUgRFJNX01PREVfUEFHRV9GTElQX0VWRU5UIDB4MDEKKyNkZWZpbmUgRFJNX01PREVfUEFHRV9GTElQX0ZMQUdTIERSTV9NT0RFX1BBR0VfRkxJUF9FVkVOVAorCisvKgorICogUmVxdWVzdCBhIHBhZ2UgZmxpcCBvbiB0aGUgc3BlY2lmaWVkIGNydGMuCisgKgorICogVGhpcyBpb2N0bCB3aWxsIGFzayBLTVMgdG8gc2NoZWR1bGUgYSBwYWdlIGZsaXAgZm9yIHRoZSBzcGVjaWZpZWQKKyAqIGNydGMuICBPbmNlIGFueSBwZW5kaW5nIHJlbmRlcmluZyB0YXJnZXRpbmcgdGhlIHNwZWNpZmllZCBmYiAoYXMgb2YKKyAqIGlvY3RsIHRpbWUpIGhhcyBjb21wbGV0ZWQsIHRoZSBjcnRjIHdpbGwgYmUgcmVwcm9ncmFtbWVkIHRvIGRpc3BsYXkKKyAqIHRoYXQgZmIgYWZ0ZXIgdGhlIG5leHQgdmVydGljYWwgcmVmcmVzaC4gIFRoZSBpb2N0bCByZXR1cm5zCisgKiBpbW1lZGlhdGVseSwgYnV0IHN1YnNlcXVlbnQgcmVuZGVyaW5nIHRvIHRoZSBjdXJyZW50IGZiIHdpbGwgYmxvY2sKKyAqIGluIHRoZSBleGVjYnVmZmVyIGlvY3RsIHVudGlsIHRoZSBwYWdlIGZsaXAgaGFwcGVucy4gIElmIGEgcGFnZQorICogZmxpcCBpcyBhbHJlYWR5IHBlbmRpbmcgYXMgdGhlIGlvY3RsIGlzIGNhbGxlZCwgRUJVU1kgd2lsbCBiZQorICogcmV0dXJuZWQuCisgKgorICogVGhlIGlvY3RsIHN1cHBvcnRzIG9uZSBmbGFnLCBEUk1fTU9ERV9QQUdFX0ZMSVBfRVZFTlQsIHdoaWNoIHdpbGwKKyAqIHJlcXVlc3QgdGhhdCBkcm0gc2VuZHMgYmFjayBhIHZibGFuayBldmVudCAoc2VlIGRybS5oOiBzdHJ1Y3QKKyAqIGRybV9ldmVudF92YmxhbmspIHdoZW4gdGhlIHBhZ2UgZmxpcCBpcyBkb25lLiAgVGhlIHVzZXJfZGF0YSBmaWVsZAorICogcGFzc2VkIGluIHdpdGggdGhpcyBpb2N0bCB3aWxsIGJlIHJldHVybmVkIGFzIHRoZSB1c2VyX2RhdGEgZmllbGQKKyAqIGluIHRoZSB2YmxhbmsgZXZlbnQgc3RydWN0LgorICoKKyAqIFRoZSByZXNlcnZlZCBmaWVsZCBtdXN0IGJlIHplcm8gdW50aWwgd2UgZmlndXJlIG91dCBzb21ldGhpbmcKKyAqIGNsZXZlciB0byB1c2UgaXQgZm9yLgorICovCisKK3N0cnVjdCBkcm1fbW9kZV9jcnRjX3BhZ2VfZmxpcCB7CisJX191MzIgY3J0Y19pZDsKKwlfX3UzMiBmYl9pZDsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiByZXNlcnZlZDsKKwlfX3U2NCB1c2VyX2RhdGE7Cit9OworCisvKiBjcmVhdGUgYSBkdW1iIHNjYW5vdXQgYnVmZmVyICovCitzdHJ1Y3QgZHJtX21vZGVfY3JlYXRlX2R1bWIgeworCXVpbnQzMl90IGhlaWdodDsKKwl1aW50MzJfdCB3aWR0aDsKKwl1aW50MzJfdCBicHA7CisJdWludDMyX3QgZmxhZ3M7CisJLyogaGFuZGxlLCBwaXRjaCwgc2l6ZSB3aWxsIGJlIHJldHVybmVkICovCisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IHBpdGNoOworCXVpbnQ2NF90IHNpemU7Cit9OworCisvKiBzZXQgdXAgZm9yIG1tYXAgb2YgYSBkdW1iIHNjYW5vdXQgYnVmZmVyICovCitzdHJ1Y3QgZHJtX21vZGVfbWFwX2R1bWIgeworCS8qKiBIYW5kbGUgZm9yIHRoZSBvYmplY3QgYmVpbmcgbWFwcGVkLiAqLworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBwYWQ7CisJLyoqCisJICogRmFrZSBvZmZzZXQgdG8gdXNlIGZvciBzdWJzZXF1ZW50IG1tYXAgY2FsbAorCSAqCisJICogVGhpcyBpcyBhIGZpeGVkLXNpemUgdHlwZSBmb3IgMzIvNjQgY29tcGF0aWJpbGl0eS4KKwkgKi8KKwlfX3U2NCBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgZHJtX21vZGVfZGVzdHJveV9kdW1iIHsKKwl1aW50MzJfdCBoYW5kbGU7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL2RybV9zYXJlYS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vZHJtX3NhcmVhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1NjY4NgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL2RybV9zYXJlYS5oCkBAIC0wLDAgKzEsODIgQEAKKy8qKgorICogXGZpbGUgZHJtX3NhcmVhLmgKKyAqIFxicmllZiBTQVJFQSBkZWZpbml0aW9ucworICoKKyAqIFxhdXRob3IgTWljaGVsIETDpG56ZXIgPG1pY2hlbEBkYWVuemVyLm5ldD4KKyAqLworCisvKgorICogQ29weXJpZ2h0IDIwMDIgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRFJNX1NBUkVBX0hfCisjZGVmaW5lIF9EUk1fU0FSRUFfSF8KKworI2luY2x1ZGUgPGRybS9kcm0uaD4KKworLyogU0FSRUEgYXJlYSBuZWVkcyB0byBiZSBhdCBsZWFzdCBhIHBhZ2UgKi8KKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykKKyNkZWZpbmUgU0FSRUFfTUFYICAgICAgICAgICAgICAgICAgICAgICAweDIwMDBVCisjZWxpZiBkZWZpbmVkKF9faWE2NF9fKQorI2RlZmluZSBTQVJFQV9NQVggICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDBVCS8qIDY0a0IgKi8KKyNlbHNlCisvKiBJbnRlbCA4MzBNIGRyaXZlciBuZWVkcyBhdCBsZWFzdCA4ayBTQVJFQSAqLworI2RlZmluZSBTQVJFQV9NQVggICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMFUKKyNlbmRpZgorCisvKiogTWF4aW11bSBudW1iZXIgb2YgZHJhd2FibGVzIGluIHRoZSBTQVJFQSAqLworI2RlZmluZSBTQVJFQV9NQVhfRFJBV0FCTEVTCQkyNTYKKworI2RlZmluZSBTQVJFQV9EUkFXQUJMRV9DTEFJTUVEX0VOVFJZICAgIDB4ODAwMDAwMDAKKworLyoqIFNBUkVBIGRyYXdhYmxlICovCitzdHJ1Y3QgZHJtX3NhcmVhX2RyYXdhYmxlIHsKKwl1bnNpZ25lZCBpbnQgc3RhbXA7CisJdW5zaWduZWQgaW50IGZsYWdzOworfTsKKworLyoqIFNBUkVBIGZyYW1lICovCitzdHJ1Y3QgZHJtX3NhcmVhX2ZyYW1lIHsKKwl1bnNpZ25lZCBpbnQgeDsKKwl1bnNpZ25lZCBpbnQgeTsKKwl1bnNpZ25lZCBpbnQgd2lkdGg7CisJdW5zaWduZWQgaW50IGhlaWdodDsKKwl1bnNpZ25lZCBpbnQgZnVsbHNjcmVlbjsKK307CisKKy8qKiBTQVJFQSAqLworc3RydWN0IGRybV9zYXJlYSB7CisgICAgLyoqIGZpcnN0IHRoaW5nIGlzIGFsd2F5cyB0aGUgRFJNIGxvY2tpbmcgc3RydWN0dXJlICovCisJc3RydWN0IGRybV9od19sb2NrIGxvY2s7CisgICAgLyoqIFx0b2RvIFVzZSByZWFkZXJzL3dyaXRlciBsb2NrIGZvciBkcm1fc2FyZWE6OmRyYXdhYmxlX2xvY2sgKi8KKwlzdHJ1Y3QgZHJtX2h3X2xvY2sgZHJhd2FibGVfbG9jazsKKwlzdHJ1Y3QgZHJtX3NhcmVhX2RyYXdhYmxlIGRyYXdhYmxlVGFibGVbU0FSRUFfTUFYX0RSQVdBQkxFU107CS8qKjwgZHJhd2FibGVzICovCisJc3RydWN0IGRybV9zYXJlYV9mcmFtZSBmcmFtZTsJLyoqPCBmcmFtZSAqLworCWRybV9jb250ZXh0X3QgZHVtbXlfY29udGV4dDsKK307CisKK3R5cGVkZWYgc3RydWN0IGRybV9zYXJlYV9kcmF3YWJsZSBkcm1fc2FyZWFfZHJhd2FibGVfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9zYXJlYV9mcmFtZSBkcm1fc2FyZWFfZnJhbWVfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9zYXJlYSBkcm1fc2FyZWFfdDsKKworI2VuZGlmCQkJCS8qIF9EUk1fU0FSRUFfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL2k4MTBfZHJtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2RybS9pODEwX2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMTBiYjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2RybS9pODEwX2RybS5oCkBAIC0wLDAgKzEsMjgxIEBACisjaWZuZGVmIF9JODEwX0RSTV9IXworI2RlZmluZSBfSTgxMF9EUk1fSF8KKworLyogV0FSTklORzogVGhlc2UgZGVmaW5lcyBtdXN0IGJlIHRoZSBzYW1lIGFzIHdoYXQgdGhlIFhzZXJ2ZXIgdXNlcy4KKyAqIGlmIHlvdSBjaGFuZ2UgdGhlbSwgeW91IG11c3QgY2hhbmdlIHRoZSBkZWZpbmVzIGluIHRoZSBYc2VydmVyLgorICovCisKKyNpZm5kZWYgX0k4MTBfREVGSU5FU18KKyNkZWZpbmUgX0k4MTBfREVGSU5FU18KKworI2RlZmluZSBJODEwX0RNQV9CVUZfT1JERVIJCTEyCisjZGVmaW5lIEk4MTBfRE1BX0JVRl9TWiAJCSgxPDxJODEwX0RNQV9CVUZfT1JERVIpCisjZGVmaW5lIEk4MTBfRE1BX0JVRl9OUiAJCTI1NgorI2RlZmluZSBJODEwX05SX1NBUkVBX0NMSVBSRUNUUyAJOAorCisvKiBFYWNoIHJlZ2lvbiBpcyBhIG1pbmltdW0gb2YgNjRrLCBhbmQgdGhlcmUgYXJlIGF0IG1vc3QgNjQgb2YgdGhlbS4KKyAqLworI2RlZmluZSBJODEwX05SX1RFWF9SRUdJT05TIDY0CisjZGVmaW5lIEk4MTBfTE9HX01JTl9URVhfUkVHSU9OX1NJWkUgMTYKKyNlbmRpZgorCisjZGVmaW5lIEk4MTBfVVBMT0FEX1RFWDBJTUFHRSAgMHgxCS8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBJODEwX1VQTE9BRF9URVgxSU1BR0UgIDB4MgkvKiBoYW5kbGVkIGNsaWVudHNpZGUgKi8KKyNkZWZpbmUgSTgxMF9VUExPQURfQ1RYICAgICAgICAweDQKKyNkZWZpbmUgSTgxMF9VUExPQURfQlVGRkVSUyAgICAweDgKKyNkZWZpbmUgSTgxMF9VUExPQURfVEVYMCAgICAgICAweDEwCisjZGVmaW5lIEk4MTBfVVBMT0FEX1RFWDEgICAgICAgMHgyMAorI2RlZmluZSBJODEwX1VQTE9BRF9DTElQUkVDVFMgIDB4NDAKKworLyogSW5kaWNlcyBpbnRvIGJ1Zi5TZXR1cCB3aGVyZSB2YXJpb3VzIGJpdHMgb2Ygc3RhdGUgYXJlIG1pcnJvcmVkIHBlcgorICogY29udGV4dCBhbmQgcGVyIGJ1ZmZlci4gIFRoZXNlIGNhbiBiZSBmaXJlZCBhdCB0aGUgY2FyZCBhcyBhIHVuaXQsCisgKiBvciBpbiBhIHBpZWNld2lzZSBmYXNoaW9uIGFzIHJlcXVpcmVkLgorICovCisKKy8qIERlc3RidWZmZXIgc3RhdGUKKyAqICAgIC0gYmFja2J1ZmZlciBsaW5lYXIgb2Zmc2V0IGFuZCBwaXRjaCAtLSBpbnZhcmllbnQgaW4gdGhlIGN1cnJlbnQgZHJpCisgKiAgICAtIHpidWZmZXIgbGluZWFyIG9mZnNldCBhbmQgcGl0Y2ggLS0gYWxzbyBpbnZhcmllbnQKKyAqICAgIC0gZHJhd2luZyBvcmlnaW4gaW4gYmFjayBhbmQgZGVwdGggYnVmZmVycy4KKyAqCisgKiBLZWVwIHRoZSBkZXB0aC9iYWNrIGJ1ZmZlciBzdGF0ZSBoZXJlIHRvIGFjY29tbW9kYXRlIHByaXZhdGUgYnVmZmVycworICogaW4gdGhlIGZ1dHVyZS4KKyAqLworI2RlZmluZSBJODEwX0RFU1RSRUdfREkwICAwCS8qIENNRF9PUF9ERVNUQlVGRkVSX0lORk8gKDIgZHdvcmRzKSAqLworI2RlZmluZSBJODEwX0RFU1RSRUdfREkxICAxCisjZGVmaW5lIEk4MTBfREVTVFJFR19EVjAgIDIJLyogR0ZYX09QX0RFU1RCVUZGRVJfVkFSUyAoMiBkd29yZHMpICovCisjZGVmaW5lIEk4MTBfREVTVFJFR19EVjEgIDMKKyNkZWZpbmUgSTgxMF9ERVNUUkVHX0RSMCAgNAkvKiBHRlhfT1BfRFJBV1JFQ1RfSU5GTyAoNCBkd29yZHMpICovCisjZGVmaW5lIEk4MTBfREVTVFJFR19EUjEgIDUKKyNkZWZpbmUgSTgxMF9ERVNUUkVHX0RSMiAgNgorI2RlZmluZSBJODEwX0RFU1RSRUdfRFIzICA3CisjZGVmaW5lIEk4MTBfREVTVFJFR19EUjQgIDgKKyNkZWZpbmUgSTgxMF9ERVNUX1NFVFVQX1NJWkUgMTAKKworLyogQ29udGV4dCBzdGF0ZQorICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX0NGMCAgIDAJLyogR0ZYX09QX0NPTE9SX0ZBQ1RPUiAqLworI2RlZmluZSBJODEwX0NUWFJFR19DRjEgICAxCisjZGVmaW5lIEk4MTBfQ1RYUkVHX1NUMCAgIDIJLyogR0ZYX09QX1NUSVBQTEUgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfU1QxICAgMworI2RlZmluZSBJODEwX0NUWFJFR19WRiAgICA0CS8qIEdGWF9PUF9WRVJURVhfRk1UICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX01UICAgIDUJLyogR0ZYX09QX01BUF9URVhFTFMgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfTUMwICAgNgkvKiBHRlhfT1BfTUFQX0NPTE9SX1NUQUdFUyAtIHN0YWdlIDAgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfTUMxICAgNwkvKiBHRlhfT1BfTUFQX0NPTE9SX1NUQUdFUyAtIHN0YWdlIDEgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfTUMyICAgOAkvKiBHRlhfT1BfTUFQX0NPTE9SX1NUQUdFUyAtIHN0YWdlIDIgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfTUEwICAgOQkvKiBHRlhfT1BfTUFQX0FMUEhBX1NUQUdFUyAtIHN0YWdlIDAgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfTUExICAgMTAJLyogR0ZYX09QX01BUF9BTFBIQV9TVEFHRVMgLSBzdGFnZSAxICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX01BMiAgIDExCS8qIEdGWF9PUF9NQVBfQUxQSEFfU1RBR0VTIC0gc3RhZ2UgMiAqLworI2RlZmluZSBJODEwX0NUWFJFR19TRE0gICAxMgkvKiBHRlhfT1BfU1JDX0RFU1RfTU9OTyAqLworI2RlZmluZSBJODEwX0NUWFJFR19GT0cgICAxMwkvKiBHRlhfT1BfRk9HX0NPTE9SICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX0IxICAgIDE0CS8qIEdGWF9PUF9CT09MXzEgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfQjIgICAgMTUJLyogR0ZYX09QX0JPT0xfMiAqLworI2RlZmluZSBJODEwX0NUWFJFR19MQ1MgICAxNgkvKiBHRlhfT1BfTElORVdJRFRIX0NVTExfU0hBREVfTU9ERSAqLworI2RlZmluZSBJODEwX0NUWFJFR19QViAgICAxNwkvKiBHRlhfT1BfUFZfUlVMRSAtLSBJbnZhcmllbnQhICovCisjZGVmaW5lIEk4MTBfQ1RYUkVHX1pBICAgIDE4CS8qIEdGWF9PUF9aQklBU19BTFBIQUZVTkMgKi8KKyNkZWZpbmUgSTgxMF9DVFhSRUdfQUEgICAgMTkJLyogR0ZYX09QX0FOVElBTElBUyAqLworI2RlZmluZSBJODEwX0NUWF9TRVRVUF9TSVpFIDIwCisKKy8qIFRleHR1cmUgc3RhdGUgKHBlciB0ZXggdW5pdCkKKyAqLworI2RlZmluZSBJODEwX1RFWFJFR19NSTAgIDAJLyogR0ZYX09QX01BUF9JTkZPICg0IGR3b3JkcykgKi8KKyNkZWZpbmUgSTgxMF9URVhSRUdfTUkxICAxCisjZGVmaW5lIEk4MTBfVEVYUkVHX01JMiAgMgorI2RlZmluZSBJODEwX1RFWFJFR19NSTMgIDMKKyNkZWZpbmUgSTgxMF9URVhSRUdfTUYgICA0CS8qIEdGWF9PUF9NQVBfRklMVEVSICovCisjZGVmaW5lIEk4MTBfVEVYUkVHX01MQyAgNQkvKiBHRlhfT1BfTUFQX0xPRF9DVEwgKi8KKyNkZWZpbmUgSTgxMF9URVhSRUdfTUxMICA2CS8qIEdGWF9PUF9NQVBfTE9EX0xJTUlUUyAqLworI2RlZmluZSBJODEwX1RFWFJFR19NQ1MgIDcJLyogR0ZYX09QX01BUF9DT09SRF9TRVRTID8/PyAqLworI2RlZmluZSBJODEwX1RFWF9TRVRVUF9TSVpFIDgKKworLyogRmxhZ3MgZm9yIGNsZWFyIGlvY3RsCisgKi8KKyNkZWZpbmUgSTgxMF9GUk9OVCAgIDB4MQorI2RlZmluZSBJODEwX0JBQ0sgICAgMHgyCisjZGVmaW5lIEk4MTBfREVQVEggICAweDQKKwordHlwZWRlZiBlbnVtIF9kcm1faTgxMF9pbml0X2Z1bmMgeworCUk4MTBfSU5JVF9ETUEgPSAweDAxLAorCUk4MTBfQ0xFQU5VUF9ETUEgPSAweDAyLAorCUk4MTBfSU5JVF9ETUFfMV80ID0gMHgwMworfSBkcm1faTgxMF9pbml0X2Z1bmNfdDsKKworLyogVGhpcyBpcyB0aGUgaW5pdCBzdHJ1Y3R1cmUgYWZ0ZXIgdjEuMiAqLwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODEwX2luaXQgeworCWRybV9pODEwX2luaXRfZnVuY190IGZ1bmM7CisJdW5zaWduZWQgaW50IG1taW9fb2Zmc2V0OworCXVuc2lnbmVkIGludCBidWZmZXJzX29mZnNldDsKKwlpbnQgc2FyZWFfcHJpdl9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHJpbmdfc3RhcnQ7CisJdW5zaWduZWQgaW50IHJpbmdfZW5kOworCXVuc2lnbmVkIGludCByaW5nX3NpemU7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYmFja19vZmZzZXQ7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgb3ZlcmxheV9vZmZzZXQ7CisJdW5zaWduZWQgaW50IG92ZXJsYXlfcGh5c2ljYWw7CisJdW5zaWduZWQgaW50IHc7CisJdW5zaWduZWQgaW50IGg7CisJdW5zaWduZWQgaW50IHBpdGNoOworCXVuc2lnbmVkIGludCBwaXRjaF9iaXRzOworfSBkcm1faTgxMF9pbml0X3Q7CisKKy8qIFRoaXMgaXMgdGhlIGluaXQgc3RydWN0dXJlIHByaW9yIHRvIHYxLjIgKi8KK3R5cGVkZWYgc3RydWN0IF9kcm1faTgxMF9wcmUxMl9pbml0IHsKKwlkcm1faTgxMF9pbml0X2Z1bmNfdCBmdW5jOworCXVuc2lnbmVkIGludCBtbWlvX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYnVmZmVyc19vZmZzZXQ7CisJaW50IHNhcmVhX3ByaXZfb2Zmc2V0OworCXVuc2lnbmVkIGludCByaW5nX3N0YXJ0OworCXVuc2lnbmVkIGludCByaW5nX2VuZDsKKwl1bnNpZ25lZCBpbnQgcmluZ19zaXplOworCXVuc2lnbmVkIGludCBmcm9udF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGJhY2tfb2Zmc2V0OworCXVuc2lnbmVkIGludCBkZXB0aF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHc7CisJdW5zaWduZWQgaW50IGg7CisJdW5zaWduZWQgaW50IHBpdGNoOworCXVuc2lnbmVkIGludCBwaXRjaF9iaXRzOworfSBkcm1faTgxMF9wcmUxMl9pbml0X3Q7CisKKy8qIFdhcm5pbmc6IElmIHlvdSBjaGFuZ2UgdGhlIFNBUkVBIHN0cnVjdHVyZSB5b3UgbXVzdCBjaGFuZ2UgdGhlIFhzZXJ2ZXIKKyAqIHN0cnVjdHVyZSBhcyB3ZWxsICovCisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTgxMF90ZXhfcmVnaW9uIHsKKwl1bnNpZ25lZCBjaGFyIG5leHQsIHByZXY7CS8qIGluZGljZXMgdG8gZm9ybSBhIGNpcmN1bGFyIExSVSAgKi8KKwl1bnNpZ25lZCBjaGFyIGluX3VzZTsJLyogb3duZWQgYnkgYSBjbGllbnQsIG9yIGZyZWU/ICovCisJaW50IGFnZTsJCS8qIHRyYWNrZWQgYnkgY2xpZW50cyB0byB1cGRhdGUgbG9jYWwgTFJVJ3MgKi8KK30gZHJtX2k4MTBfdGV4X3JlZ2lvbl90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MTBfc2FyZWEgeworCXVuc2lnbmVkIGludCBDb250ZXh0U3RhdGVbSTgxMF9DVFhfU0VUVVBfU0laRV07CisJdW5zaWduZWQgaW50IEJ1ZmZlclN0YXRlW0k4MTBfREVTVF9TRVRVUF9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgVGV4U3RhdGVbMl1bSTgxMF9URVhfU0VUVVBfU0laRV07CisJdW5zaWduZWQgaW50IGRpcnR5OworCisJdW5zaWduZWQgaW50IG5ib3g7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgYm94ZXNbSTgxMF9OUl9TQVJFQV9DTElQUkVDVFNdOworCisJLyogTWFpbnRhaW4gYW4gTFJVIG9mIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiB0ZXh0dXJlIHNwYWNlLiAgSWYKKwkgKiB5b3UgdGhpbmsgeW91IG93biBhIHJlZ2lvbiBvZiB0ZXh0dXJlIG1lbW9yeSwgYW5kIGl0IGhhcyBhbgorCSAqIGFnZSBkaWZmZXJlbnQgdG8gdGhlIG9uZSB5b3Ugc2V0LCB0aGVuIHlvdSBhcmUgbWlzdGFrZW4gYW5kCisJICogaXQgaGFzIGJlZW4gc3RvbGVuIGJ5IGFub3RoZXIgY2xpZW50LiAgSWYgZ2xvYmFsIHRleEFnZQorCSAqIGhhc24ndCBjaGFuZ2VkLCB0aGVyZSBpcyBubyBuZWVkIHRvIHdhbGsgdGhlIGxpc3QuCisJICoKKwkgKiBUaGVzZSByZWdpb25zIGNhbiBiZSB1c2VkIGFzIGEgcHJveHkgZm9yIHRoZSBmaW5lLWdyYWluZWQKKwkgKiB0ZXh0dXJlIGluZm9ybWF0aW9uIG9mIG90aGVyIGNsaWVudHMgLSBieSBtYWludGFpbmluZyB0aGVtCisJICogaW4gdGhlIHNhbWUgbHJ1IHdoaWNoIGlzIHVzZWQgdG8gYWdlIHRoZWlyIG93biB0ZXh0dXJlcywKKwkgKiBjbGllbnRzIGhhdmUgYW4gYXBwcm94aW1hdGUgbHJ1IGZvciB0aGUgd2hvbGUgb2YgZ2xvYmFsCisJICogdGV4dHVyZSBzcGFjZSwgYW5kIGNhbiBtYWtlIGluZm9ybWVkIGRlY2lzaW9ucyBhcyB0byB3aGljaAorCSAqIGFyZWFzIHRvIGtpY2sgb3V0LiAgVGhlcmUgaXMgbm8gbmVlZCB0byBjaG9vc2Ugd2hldGhlciB0bworCSAqIGtpY2sgb3V0IHlvdXIgb3duIHRleHR1cmUgb3Igc29tZW9uZSBlbHNlJ3MgLSBzaW1wbHkgZWplY3QKKwkgKiB0aGVtIGFsbCBpbiBMUlUgb3JkZXIuCisJICovCisKKwlkcm1faTgxMF90ZXhfcmVnaW9uX3QgdGV4TGlzdFtJODEwX05SX1RFWF9SRUdJT05TICsgMV07CisJLyogTGFzdCBlbHQgaXMgc2VudGluYWwgKi8KKwlpbnQgdGV4QWdlOwkJLyogbGFzdCB0aW1lIHRleHR1cmUgd2FzIHVwbG9hZGVkICovCisJaW50IGxhc3RfZW5xdWV1ZTsJLyogbGFzdCB0aW1lIGEgYnVmZmVyIHdhcyBlbnF1ZXVlZCAqLworCWludCBsYXN0X2Rpc3BhdGNoOwkvKiBhZ2Ugb2YgdGhlIG1vc3QgcmVjZW50bHkgZGlzcGF0Y2hlZCBidWZmZXIgKi8KKwlpbnQgbGFzdF9xdWllc2NlbnQ7CS8qICAqLworCWludCBjdHhPd25lcjsJCS8qIGxhc3QgY29udGV4dCB0byB1cGxvYWQgc3RhdGUgKi8KKworCWludCB2ZXJ0ZXhfcHJpbTsKKworCWludCBwZl9lbmFibGVkOwkJLyogaXMgcGFnZWZsaXBwaW5nIGFsbG93ZWQ/ICovCisJaW50IHBmX2FjdGl2ZTsKKwlpbnQgcGZfY3VycmVudF9wYWdlOwkvKiB3aGljaCBidWZmZXIgaXMgYmVpbmcgZGlzcGxheWVkPyAqLworfSBkcm1faTgxMF9zYXJlYV90OworCisvKiBXQVJOSU5HOiBJZiB5b3UgY2hhbmdlIGFueSBvZiB0aGVzZSBkZWZpbmVzLCBtYWtlIHN1cmUgdG8gY2hhbmdlIHRoZQorICogZGVmaW5lcyBpbiB0aGUgWHNlcnZlciBmaWxlICh4Zjg2ZHJtTWdhLmgpCisgKi8KKworLyogaTgxMCBzcGVjaWZpYyBpb2N0bHMKKyAqIFRoZSBkZXZpY2Ugc3BlY2lmaWMgaW9jdGwgcmFuZ2UgaXMgMHg0MCB0byAweDc5LgorICovCisjZGVmaW5lIERSTV9JODEwX0lOSVQJCTB4MDAKKyNkZWZpbmUgRFJNX0k4MTBfVkVSVEVYCQkweDAxCisjZGVmaW5lIERSTV9JODEwX0NMRUFSCQkweDAyCisjZGVmaW5lIERSTV9JODEwX0ZMVVNICQkweDAzCisjZGVmaW5lIERSTV9JODEwX0dFVEFHRQkJMHgwNAorI2RlZmluZSBEUk1fSTgxMF9HRVRCVUYJCTB4MDUKKyNkZWZpbmUgRFJNX0k4MTBfU1dBUAkJMHgwNgorI2RlZmluZSBEUk1fSTgxMF9DT1BZCQkweDA3CisjZGVmaW5lIERSTV9JODEwX0RPQ09QWQkJMHgwOAorI2RlZmluZSBEUk1fSTgxMF9PVjBJTkZPCTB4MDkKKyNkZWZpbmUgRFJNX0k4MTBfRlNUQVRVUwkweDBhCisjZGVmaW5lIERSTV9JODEwX09WMEZMSVAJMHgwYgorI2RlZmluZSBEUk1fSTgxMF9NQwkJMHgwYworI2RlZmluZSBEUk1fSTgxMF9SU1RBVFVTCTB4MGQKKyNkZWZpbmUgRFJNX0k4MTBfRkxJUAkJMHgwZQorCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX0lOSVQJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTgxMF9JTklULCBkcm1faTgxMF9pbml0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX1ZFUlRFWAkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX1ZFUlRFWCwgZHJtX2k4MTBfdmVydGV4X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX0NMRUFSCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfQ0xFQVIsIGRybV9pODEwX2NsZWFyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX0ZMVVNICQlEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfRkxVU0gpCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX0dFVEFHRQkJRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX0dFVEFHRSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfR0VUQlVGCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfR0VUQlVGLCBkcm1faTgxMF9kbWFfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfU1dBUAkJRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX1NXQVApCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX0NPUFkJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTgxMF9DT1BZLCBkcm1faTgxMF9jb3B5X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX0RPQ09QWQkJRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX0RPQ09QWSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfT1YwSU5GTwkJRFJNX0lPUiggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX09WMElORk8sIGRybV9pODEwX292ZXJsYXlfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfRlNUQVRVUwkJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX0ZTVEFUVVMpCisjZGVmaW5lIERSTV9JT0NUTF9JODEwX09WMEZMSVAJCURSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTgxMF9PVjBGTElQKQorI2RlZmluZSBEUk1fSU9DVExfSTgxMF9NQwkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JODEwX01DLCBkcm1faTgxMF9tY190KQorI2RlZmluZSBEUk1fSU9DVExfSTgxMF9SU1RBVFVTCQlEUk1fSU8gKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfUlNUQVRVUykKKyNkZWZpbmUgRFJNX0lPQ1RMX0k4MTBfRkxJUCAgICAgICAgICAgICBEUk1fSU8gKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k4MTBfRkxJUCkKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pODEwX2NsZWFyIHsKKwlpbnQgY2xlYXJfY29sb3I7CisJaW50IGNsZWFyX2RlcHRoOworCWludCBmbGFnczsKK30gZHJtX2k4MTBfY2xlYXJfdDsKKworLyogVGhlc2UgbWF5IGJlIHBsYWNlaG9sZGVycyBpZiB3ZSBoYXZlIG1vcmUgY2xpcHJlY3RzIHRoYW4KKyAqIEk4MTBfTlJfU0FSRUFfQ0xJUFJFQ1RTLiAgSW4gdGhhdCBjYXNlLCB0aGUgY2xpZW50IHNldHMgZGlzY2FyZCB0bworICogZmFsc2UsIGluZGljYXRpbmcgdGhhdCB0aGUgYnVmZmVyIHdpbGwgYmUgZGlzcGF0Y2hlZCBhZ2FpbiB3aXRoIGEKKyAqIG5ldyBzZXQgb2YgY2xpcHJlY3RzLgorICovCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MTBfdmVydGV4IHsKKwlpbnQgaWR4OwkJLyogYnVmZmVyIGluZGV4ICovCisJaW50IHVzZWQ7CQkvKiBuciBieXRlcyBpbiB1c2UgKi8KKwlpbnQgZGlzY2FyZDsJCS8qIGNsaWVudCBpcyBmaW5pc2hlZCB3aXRoIHRoZSBidWZmZXI/ICovCit9IGRybV9pODEwX3ZlcnRleF90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MTBfY29weV90IHsKKwlpbnQgaWR4OwkJLyogYnVmZmVyIGluZGV4ICovCisJaW50IHVzZWQ7CQkvKiBuciBieXRlcyBpbiB1c2UgKi8KKwl2b2lkICphZGRyZXNzOwkJLyogQWRkcmVzcyB0byBjb3B5IGZyb20gKi8KK30gZHJtX2k4MTBfY29weV90OworCisjZGVmaW5lIFBSX1RSSUFOR0xFUyAgICAgICAgICgweDA8PDE4KQorI2RlZmluZSBQUl9UUklTVFJJUF8wICAgICAgICAoMHgxPDwxOCkKKyNkZWZpbmUgUFJfVFJJU1RSSVBfMSAgICAgICAgKDB4Mjw8MTgpCisjZGVmaW5lIFBSX1RSSUZBTiAgICAgICAgICAgICgweDM8PDE4KQorI2RlZmluZSBQUl9QT0xZR09OICAgICAgICAgICAoMHg0PDwxOCkKKyNkZWZpbmUgUFJfTElORVMgICAgICAgICAgICAgKDB4NTw8MTgpCisjZGVmaW5lIFBSX0xJTkVTVFJJUCAgICAgICAgICgweDY8PDE4KQorI2RlZmluZSBQUl9SRUNUUyAgICAgICAgICAgICAoMHg3PDwxOCkKKyNkZWZpbmUgUFJfTUFTSyAgICAgICAgICAgICAgKDB4Nzw8MTgpCisKK3R5cGVkZWYgc3RydWN0IGRybV9pODEwX2RtYSB7CisJdm9pZCAqdmlydHVhbDsKKwlpbnQgcmVxdWVzdF9pZHg7CisJaW50IHJlcXVlc3Rfc2l6ZTsKKwlpbnQgZ3JhbnRlZDsKK30gZHJtX2k4MTBfZG1hX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTgxMF9vdmVybGF5X3QgeworCXVuc2lnbmVkIGludCBvZmZzZXQ7CS8qIEFkZHJlc3Mgb2YgdGhlIE92ZXJsYXkgUmVncyAqLworCXVuc2lnbmVkIGludCBwaHlzaWNhbDsKK30gZHJtX2k4MTBfb3ZlcmxheV90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k4MTBfbWMgeworCWludCBpZHg7CQkvKiBidWZmZXIgaW5kZXggKi8KKwlpbnQgdXNlZDsJCS8qIG5yIGJ5dGVzIGluIHVzZSAqLworCWludCBudW1fYmxvY2tzOwkJLyogbnVtYmVyIG9mIEdGWEJsb2NrcyAqLworCWludCAqbGVuZ3RoOwkJLyogTGlzdCBvZiBsZW5ndGhzIGZvciBHRlhCbG9ja3MgKEZVVFVSRSkgKi8KKwl1bnNpZ25lZCBpbnQgbGFzdF9yZW5kZXI7CS8qIExhc3QgUmVuZGVyIFJlcXVlc3QgKi8KK30gZHJtX2k4MTBfbWNfdDsKKworI2VuZGlmCQkJCS8qIF9JODEwX0RSTV9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vaTkxNV9kcm0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL2k5MTVfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMxZTkyMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL2k5MTVfZHJtLmgKQEAgLTAsMCArMSw4MzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9JOTE1X0RSTV9IXworI2RlZmluZSBfSTkxNV9EUk1fSF8KKworI2luY2x1ZGUgPGRybS9kcm0uaD4KKworLyogUGxlYXNlIG5vdGUgdGhhdCBtb2RpZmljYXRpb25zIHRvIGFsbCBzdHJ1Y3RzIGRlZmluZWQgaGVyZSBhcmUKKyAqIHN1YmplY3QgdG8gYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgY29uc3RyYWludHMuCisgKi8KKworCisvKiBFYWNoIHJlZ2lvbiBpcyBhIG1pbmltdW0gb2YgMTZrLCBhbmQgdGhlcmUgYXJlIGF0IG1vc3QgMjU1IG9mIHRoZW0uCisgKi8KKyNkZWZpbmUgSTkxNV9OUl9URVhfUkVHSU9OUyAyNTUJLyogdGFibGUgc2l6ZSAyayAtIG1heGltdW0gZHVlIHRvIHVzZQorCQkJCSAqIG9mIGNoYXJzIGZvciBuZXh0L3ByZXYgaW5kaWNlcyAqLworI2RlZmluZSBJOTE1X0xPR19NSU5fVEVYX1JFR0lPTl9TSVpFIDE0CisKK3R5cGVkZWYgc3RydWN0IF9kcm1faTkxNV9pbml0IHsKKwllbnVtIHsKKwkJSTkxNV9JTklUX0RNQSA9IDB4MDEsCisJCUk5MTVfQ0xFQU5VUF9ETUEgPSAweDAyLAorCQlJOTE1X1JFU1VNRV9ETUEgPSAweDAzCisJfSBmdW5jOworCXVuc2lnbmVkIGludCBtbWlvX29mZnNldDsKKwlpbnQgc2FyZWFfcHJpdl9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHJpbmdfc3RhcnQ7CisJdW5zaWduZWQgaW50IHJpbmdfZW5kOworCXVuc2lnbmVkIGludCByaW5nX3NpemU7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYmFja19vZmZzZXQ7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgdzsKKwl1bnNpZ25lZCBpbnQgaDsKKwl1bnNpZ25lZCBpbnQgcGl0Y2g7CisJdW5zaWduZWQgaW50IHBpdGNoX2JpdHM7CisJdW5zaWduZWQgaW50IGJhY2tfcGl0Y2g7CisJdW5zaWduZWQgaW50IGRlcHRoX3BpdGNoOworCXVuc2lnbmVkIGludCBjcHA7CisJdW5zaWduZWQgaW50IGNoaXBzZXQ7Cit9IGRybV9pOTE1X2luaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pOTE1X3NhcmVhIHsKKwlzdHJ1Y3QgZHJtX3RleF9yZWdpb24gdGV4TGlzdFtJOTE1X05SX1RFWF9SRUdJT05TICsgMV07CisJaW50IGxhc3RfdXBsb2FkOwkvKiBsYXN0IHRpbWUgdGV4dHVyZSB3YXMgdXBsb2FkZWQgKi8KKwlpbnQgbGFzdF9lbnF1ZXVlOwkvKiBsYXN0IHRpbWUgYSBidWZmZXIgd2FzIGVucXVldWVkICovCisJaW50IGxhc3RfZGlzcGF0Y2g7CS8qIGFnZSBvZiB0aGUgbW9zdCByZWNlbnRseSBkaXNwYXRjaGVkIGJ1ZmZlciAqLworCWludCBjdHhPd25lcjsJCS8qIGxhc3QgY29udGV4dCB0byB1cGxvYWQgc3RhdGUgKi8KKwlpbnQgdGV4QWdlOworCWludCBwZl9lbmFibGVkOwkJLyogaXMgcGFnZWZsaXBwaW5nIGFsbG93ZWQ/ICovCisJaW50IHBmX2FjdGl2ZTsKKwlpbnQgcGZfY3VycmVudF9wYWdlOwkvKiB3aGljaCBidWZmZXIgaXMgYmVpbmcgZGlzcGxheWVkPyAqLworCWludCBwZXJmX2JveGVzOwkJLyogcGVyZm9ybWFuY2UgYm94ZXMgdG8gYmUgZGlzcGxheWVkICovCisJaW50IHdpZHRoLCBoZWlnaHQ7ICAgICAgLyogc2NyZWVuIHNpemUgaW4gcGl4ZWxzICovCisKKwlkcm1faGFuZGxlX3QgZnJvbnRfaGFuZGxlOworCWludCBmcm9udF9vZmZzZXQ7CisJaW50IGZyb250X3NpemU7CisKKwlkcm1faGFuZGxlX3QgYmFja19oYW5kbGU7CisJaW50IGJhY2tfb2Zmc2V0OworCWludCBiYWNrX3NpemU7CisKKwlkcm1faGFuZGxlX3QgZGVwdGhfaGFuZGxlOworCWludCBkZXB0aF9vZmZzZXQ7CisJaW50IGRlcHRoX3NpemU7CisKKwlkcm1faGFuZGxlX3QgdGV4X2hhbmRsZTsKKwlpbnQgdGV4X29mZnNldDsKKwlpbnQgdGV4X3NpemU7CisJaW50IGxvZ190ZXhfZ3JhbnVsYXJpdHk7CisJaW50IHBpdGNoOworCWludCByb3RhdGlvbjsgICAgICAgICAgIC8qIDAsIDkwLCAxODAgb3IgMjcwICovCisJaW50IHJvdGF0ZWRfb2Zmc2V0OworCWludCByb3RhdGVkX3NpemU7CisJaW50IHJvdGF0ZWRfcGl0Y2g7CisJaW50IHZpcnR1YWxYLCB2aXJ0dWFsWTsKKworCXVuc2lnbmVkIGludCBmcm9udF90aWxlZDsKKwl1bnNpZ25lZCBpbnQgYmFja190aWxlZDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfdGlsZWQ7CisJdW5zaWduZWQgaW50IHJvdGF0ZWRfdGlsZWQ7CisJdW5zaWduZWQgaW50IHJvdGF0ZWQyX3RpbGVkOworCisJaW50IHBpcGVBX3g7CisJaW50IHBpcGVBX3k7CisJaW50IHBpcGVBX3c7CisJaW50IHBpcGVBX2g7CisJaW50IHBpcGVCX3g7CisJaW50IHBpcGVCX3k7CisJaW50IHBpcGVCX3c7CisJaW50IHBpcGVCX2g7CisKKwkvKiBmaWxsIG91dCBzb21lIHNwYWNlIGZvciBvbGQgdXNlcnNwYWNlIHRyaXBsZSBidWZmZXIgKi8KKwlkcm1faGFuZGxlX3QgdW51c2VkX2hhbmRsZTsKKwlfX3UzMiB1bnVzZWQxLCB1bnVzZWQyLCB1bnVzZWQzOworCisJLyogYnVmZmVyIG9iamVjdCBoYW5kbGVzIGZvciBzdGF0aWMgYnVmZmVycy4gTWF5IGNoYW5nZQorCSAqIG92ZXIgdGhlIGxpZmV0aW1lIG9mIHRoZSBjbGllbnQuCisJICovCisJX191MzIgZnJvbnRfYm9faGFuZGxlOworCV9fdTMyIGJhY2tfYm9faGFuZGxlOworCV9fdTMyIHVudXNlZF9ib19oYW5kbGU7CisJX191MzIgZGVwdGhfYm9faGFuZGxlOworCit9IGRybV9pOTE1X3NhcmVhX3Q7CisKKy8qIGR1ZSB0byB1c2Vyc3BhY2UgYnVpbGRpbmcgYWdhaW5zdCB0aGVzZSBoZWFkZXJzIHdlIG5lZWQgc29tZSBjb21wYXQgaGVyZSAqLworI2RlZmluZSBwbGFuZUFfeCBwaXBlQV94CisjZGVmaW5lIHBsYW5lQV95IHBpcGVBX3kKKyNkZWZpbmUgcGxhbmVBX3cgcGlwZUFfdworI2RlZmluZSBwbGFuZUFfaCBwaXBlQV9oCisjZGVmaW5lIHBsYW5lQl94IHBpcGVCX3gKKyNkZWZpbmUgcGxhbmVCX3kgcGlwZUJfeQorI2RlZmluZSBwbGFuZUJfdyBwaXBlQl93CisjZGVmaW5lIHBsYW5lQl9oIHBpcGVCX2gKKworLyogRmxhZ3MgZm9yIHBlcmZfYm94ZXMKKyAqLworI2RlZmluZSBJOTE1X0JPWF9SSU5HX0VNUFRZICAgIDB4MQorI2RlZmluZSBJOTE1X0JPWF9GTElQICAgICAgICAgIDB4MgorI2RlZmluZSBJOTE1X0JPWF9XQUlUICAgICAgICAgIDB4NAorI2RlZmluZSBJOTE1X0JPWF9URVhUVVJFX0xPQUQgIDB4OAorI2RlZmluZSBJOTE1X0JPWF9MT1NUX0NPTlRFWFQgIDB4MTAKKworLyogSTkxNSBzcGVjaWZpYyBpb2N0bHMKKyAqIFRoZSBkZXZpY2Ugc3BlY2lmaWMgaW9jdGwgcmFuZ2UgaXMgMHg0MCB0byAweDc5LgorICovCisjZGVmaW5lIERSTV9JOTE1X0lOSVQJCTB4MDAKKyNkZWZpbmUgRFJNX0k5MTVfRkxVU0gJCTB4MDEKKyNkZWZpbmUgRFJNX0k5MTVfRkxJUAkJMHgwMgorI2RlZmluZSBEUk1fSTkxNV9CQVRDSEJVRkZFUgkweDAzCisjZGVmaW5lIERSTV9JOTE1X0lSUV9FTUlUCTB4MDQKKyNkZWZpbmUgRFJNX0k5MTVfSVJRX1dBSVQJMHgwNQorI2RlZmluZSBEUk1fSTkxNV9HRVRQQVJBTQkweDA2CisjZGVmaW5lIERSTV9JOTE1X1NFVFBBUkFNCTB4MDcKKyNkZWZpbmUgRFJNX0k5MTVfQUxMT0MJCTB4MDgKKyNkZWZpbmUgRFJNX0k5MTVfRlJFRQkJMHgwOQorI2RlZmluZSBEUk1fSTkxNV9JTklUX0hFQVAJMHgwYQorI2RlZmluZSBEUk1fSTkxNV9DTURCVUZGRVIJMHgwYgorI2RlZmluZSBEUk1fSTkxNV9ERVNUUk9ZX0hFQVAJMHgwYworI2RlZmluZSBEUk1fSTkxNV9TRVRfVkJMQU5LX1BJUEUJMHgwZAorI2RlZmluZSBEUk1fSTkxNV9HRVRfVkJMQU5LX1BJUEUJMHgwZQorI2RlZmluZSBEUk1fSTkxNV9WQkxBTktfU1dBUAkweDBmCisjZGVmaW5lIERSTV9JOTE1X0hXU19BRERSCTB4MTEKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX0lOSVQJMHgxMworI2RlZmluZSBEUk1fSTkxNV9HRU1fRVhFQ0JVRkZFUgkweDE0CisjZGVmaW5lIERSTV9JOTE1X0dFTV9QSU4JMHgxNQorI2RlZmluZSBEUk1fSTkxNV9HRU1fVU5QSU4JMHgxNgorI2RlZmluZSBEUk1fSTkxNV9HRU1fQlVTWQkweDE3CisjZGVmaW5lIERSTV9JOTE1X0dFTV9USFJPVFRMRQkweDE4CisjZGVmaW5lIERSTV9JOTE1X0dFTV9FTlRFUlZUCTB4MTkKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX0xFQVZFVlQJMHgxYQorI2RlZmluZSBEUk1fSTkxNV9HRU1fQ1JFQVRFCTB4MWIKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX1BSRUFECTB4MWMKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX1BXUklURQkweDFkCisjZGVmaW5lIERSTV9JOTE1X0dFTV9NTUFQCTB4MWUKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX1NFVF9ET01BSU4JMHgxZgorI2RlZmluZSBEUk1fSTkxNV9HRU1fU1dfRklOSVNICTB4MjAKKyNkZWZpbmUgRFJNX0k5MTVfR0VNX1NFVF9USUxJTkcJMHgyMQorI2RlZmluZSBEUk1fSTkxNV9HRU1fR0VUX1RJTElORwkweDIyCisjZGVmaW5lIERSTV9JOTE1X0dFTV9HRVRfQVBFUlRVUkUgMHgyMworI2RlZmluZSBEUk1fSTkxNV9HRU1fTU1BUF9HVFQJMHgyNAorI2RlZmluZSBEUk1fSTkxNV9HRVRfUElQRV9GUk9NX0NSVENfSUQJMHgyNQorI2RlZmluZSBEUk1fSTkxNV9HRU1fTUFEVklTRQkweDI2CisjZGVmaW5lIERSTV9JOTE1X09WRVJMQVlfUFVUX0lNQUdFCTB4MjcKKyNkZWZpbmUgRFJNX0k5MTVfT1ZFUkxBWV9BVFRSUwkweDI4CisjZGVmaW5lIERSTV9JOTE1X0dFTV9FWEVDQlVGRkVSMgkweDI5CisKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfSU5JVAkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0lOSVQsIGRybV9pOTE1X2luaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfRkxVU0gJCURSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9GTFVTSCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfRkxJUAkJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0ZMSVApCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0JBVENIQlVGRkVSCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9CQVRDSEJVRkZFUiwgZHJtX2k5MTVfYmF0Y2hidWZmZXJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfSVJRX0VNSVQgICAgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfSVJRX0VNSVQsIGRybV9pOTE1X2lycV9lbWl0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0lSUV9XQUlUICAgICAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0lSUV9XQUlULCBkcm1faTkxNV9pcnFfd2FpdF90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSAgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRVRQQVJBTSwgZHJtX2k5MTVfZ2V0cGFyYW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfU0VUUEFSQU0gICAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfU0VUUEFSQU0sIGRybV9pOTE1X3NldHBhcmFtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0FMTE9DICAgICAgICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0FMTE9DLCBkcm1faTkxNV9tZW1fYWxsb2NfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfRlJFRSAgICAgICAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfRlJFRSwgZHJtX2k5MTVfbWVtX2ZyZWVfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfSU5JVF9IRUFQICAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfSU5JVF9IRUFQLCBkcm1faTkxNV9tZW1faW5pdF9oZWFwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0NNREJVRkZFUglEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfQ01EQlVGRkVSLCBkcm1faTkxNV9jbWRidWZmZXJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfREVTVFJPWV9IRUFQCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9ERVNUUk9ZX0hFQVAsIGRybV9pOTE1X21lbV9kZXN0cm95X2hlYXBfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfU0VUX1ZCTEFOS19QSVBFCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9TRVRfVkJMQU5LX1BJUEUsIGRybV9pOTE1X3ZibGFua19waXBlX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFVF9WQkxBTktfUElQRQlEUk1fSU9SKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VUX1ZCTEFOS19QSVBFLCBkcm1faTkxNV92YmxhbmtfcGlwZV90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9WQkxBTktfU1dBUAlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfVkJMQU5LX1NXQVAsIGRybV9pOTE1X3ZibGFua19zd2FwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0hXU19BRERSCQlEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9IV1NfQUREUiwgc3RydWN0IGRybV9pOTE1X2dlbV9pbml0KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fSU5JVAkJRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX0lOSVQsIHN0cnVjdCBkcm1faTkxNV9nZW1faW5pdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX0VYRUNCVUZGRVIJRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX0VYRUNCVUZGRVIsIHN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcikKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX0VYRUNCVUZGRVIyCURSTV9JT1coRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9FWEVDQlVGRkVSMiwgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMikKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX1BJTgkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9QSU4sIHN0cnVjdCBkcm1faTkxNV9nZW1fcGluKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fVU5QSU4JRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX1VOUElOLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3VucGluKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fQlVTWQkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9CVVNZLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2J1c3kpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9USFJPVFRMRQlEUk1fSU8gKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX1RIUk9UVExFKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fRU5URVJWVAlEUk1fSU8oRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9FTlRFUlZUKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fTEVBVkVWVAlEUk1fSU8oRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9MRUFWRVZUKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fQ1JFQVRFCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fQ1JFQVRFLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NyZWF0ZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX1BSRUFECURSTV9JT1cgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fUFJFQUQsIHN0cnVjdCBkcm1faTkxNV9nZW1fcHJlYWQpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9QV1JJVEUJRFJNX0lPVyAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9QV1JJVEUsIHN0cnVjdCBkcm1faTkxNV9nZW1fcHdyaXRlKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fTU1BUAkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9NTUFQLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXApCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9NTUFQX0dUVAlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX01NQVBfR1RULCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXBfZ3R0KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fU0VUX0RPTUFJTglEUk1fSU9XIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX1NFVF9ET01BSU4sIHN0cnVjdCBkcm1faTkxNV9nZW1fc2V0X2RvbWFpbikKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX1NXX0ZJTklTSAlEUk1fSU9XIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX1NXX0ZJTklTSCwgc3RydWN0IGRybV9pOTE1X2dlbV9zd19maW5pc2gpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9TRVRfVElMSU5HCURSTV9JT1dSIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX1NFVF9USUxJTkcsIHN0cnVjdCBkcm1faTkxNV9nZW1fc2V0X3RpbGluZykKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX0dFVF9USUxJTkcJRFJNX0lPV1IgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fR0VUX1RJTElORywgc3RydWN0IGRybV9pOTE1X2dlbV9nZXRfdGlsaW5nKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fR0VUX0FQRVJUVVJFCURSTV9JT1IgIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX0dFVF9BUEVSVFVSRSwgc3RydWN0IGRybV9pOTE1X2dlbV9nZXRfYXBlcnR1cmUpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFVF9QSVBFX0ZST01fQ1JUQ19JRCBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VUX1BJUEVfRlJPTV9DUlRDX0lELCBzdHJ1Y3QgZHJtX2k5MTVfZ2V0X3BpcGVfZnJvbV9jcnRjX2lkKQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fTUFEVklTRQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX01BRFZJU0UsIHN0cnVjdCBkcm1faTkxNV9nZW1fbWFkdmlzZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfT1ZFUkxBWV9QVVRfSU1BR0UJRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfT1ZFUkxBWV9QVVRfSU1BR0UsIHN0cnVjdCBkcm1faW50ZWxfb3ZlcmxheV9wdXRfaW1hZ2UpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X09WRVJMQVlfQVRUUlMJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X09WRVJMQVlfQVRUUlMsIHN0cnVjdCBkcm1faW50ZWxfb3ZlcmxheV9hdHRycykKKworLyogQWxsb3cgZHJpdmVycyB0byBzdWJtaXQgYmF0Y2hidWZmZXJzIGRpcmVjdGx5IHRvIGhhcmR3YXJlLCByZWx5aW5nCisgKiBvbiB0aGUgc2VjdXJpdHkgbWVjaGFuaXNtcyBwcm92aWRlZCBieSBoYXJkd2FyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfYmF0Y2hidWZmZXIgeworCWludCBzdGFydDsJCS8qIGFncCBvZmZzZXQgKi8KKwlpbnQgdXNlZDsJCS8qIG5yIGJ5dGVzIGluIHVzZSAqLworCWludCBEUjE7CQkvKiBodyBmbGFncyBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KKwlpbnQgRFI0OwkJLyogd2luZG93IG9yaWdpbiBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KKwlpbnQgbnVtX2NsaXByZWN0czsJLyogbXVsaXRwYXNzIHdpdGggbXVsdGlwbGUgY2xpcHJlY3RzPyAqLworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcmVjdHM7CS8qIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGNsaXByZWN0cyAqLworfSBkcm1faTkxNV9iYXRjaGJ1ZmZlcl90OworCisvKiBBcyBhYm92ZSwgYnV0IHBhc3MgYSBwb2ludGVyIHRvIHVzZXJzcGFjZSBidWZmZXIgd2hpY2ggY2FuIGJlCisgKiB2YWxpZGF0ZWQgYnkgdGhlIGtlcm5lbCBwcmlvciB0byBzZW5kaW5nIHRvIGhhcmR3YXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k5MTVfY21kYnVmZmVyIHsKKwljaGFyICpidWY7CS8qIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGNvbW1hbmQgYnVmZmVyICovCisJaW50IHN6OwkJCS8qIG5yIGJ5dGVzIGluIGJ1ZiAqLworCWludCBEUjE7CQkvKiBodyBmbGFncyBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KKwlpbnQgRFI0OwkJLyogd2luZG93IG9yaWdpbiBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KKwlpbnQgbnVtX2NsaXByZWN0czsJLyogbXVsaXRwYXNzIHdpdGggbXVsdGlwbGUgY2xpcHJlY3RzPyAqLworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcmVjdHM7CS8qIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGNsaXByZWN0cyAqLworfSBkcm1faTkxNV9jbWRidWZmZXJfdDsKKworLyogVXNlcnNwYWNlIGNhbiByZXF1ZXN0ICYgd2FpdCBvbiBpcnEnczoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfaXJxX2VtaXQgeworCWludCAqaXJxX3NlcTsKK30gZHJtX2k5MTVfaXJxX2VtaXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfaXJxX3dhaXQgeworCWludCBpcnFfc2VxOworfSBkcm1faTkxNV9pcnFfd2FpdF90OworCisvKiBJb2N0bCB0byBxdWVyeSBrZXJuZWwgcGFyYW1zOgorICovCisjZGVmaW5lIEk5MTVfUEFSQU1fSVJRX0FDVElWRSAgICAgICAgICAgIDEKKyNkZWZpbmUgSTkxNV9QQVJBTV9BTExPV19CQVRDSEJVRkZFUiAgICAgMgorI2RlZmluZSBJOTE1X1BBUkFNX0xBU1RfRElTUEFUQ0ggICAgICAgICAzCisjZGVmaW5lIEk5MTVfUEFSQU1fQ0hJUFNFVF9JRCAgICAgICAgICAgIDQKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfR0VNICAgICAgICAgICAgICAgNQorI2RlZmluZSBJOTE1X1BBUkFNX05VTV9GRU5DRVNfQVZBSUwgICAgICA2CisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX09WRVJMQVkgICAgICAgICAgIDcKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfUEFHRUZMSVBQSU5HCSA4CisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX0VYRUNCVUYyICAgICAgICAgIDkKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfQlNECQkgMTAKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfQkxUCQkgMTEKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfUkVMQVhFRF9GRU5DSU5HCSAxMgorI2RlZmluZSBJOTE1X1BBUkFNX0hBU19DT0hFUkVOVF9SSU5HUwkgMTMKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfRVhFQ19DT05TVEFOVFMJIDE0CisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX1JFTEFYRURfREVMVEEJIDE1CisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X2dldHBhcmFtIHsKKwlpbnQgcGFyYW07CisJaW50ICp2YWx1ZTsKK30gZHJtX2k5MTVfZ2V0cGFyYW1fdDsKKworLyogSW9jdGwgdG8gc2V0IGtlcm5lbCBwYXJhbXM6CisgKi8KKyNkZWZpbmUgSTkxNV9TRVRQQVJBTV9VU0VfTUlfQkFUQ0hCVUZGRVJfU1RBUlQgICAgICAgICAgICAxCisjZGVmaW5lIEk5MTVfU0VUUEFSQU1fVEVYX0xSVV9MT0dfR1JBTlVMQVJJVFkgICAgICAgICAgICAgMgorI2RlZmluZSBJOTE1X1NFVFBBUkFNX0FMTE9XX0JBVENIQlVGRkVSICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgSTkxNV9TRVRQQVJBTV9OVU1fVVNFRF9GRU5DRVMgICAgICAgICAgICAgICAgICAgICA0CisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X3NldHBhcmFtIHsKKwlpbnQgcGFyYW07CisJaW50IHZhbHVlOworfSBkcm1faTkxNV9zZXRwYXJhbV90OworCisvKiBBIG1lbW9yeSBtYW5hZ2VyIGZvciByZWdpb25zIG9mIHNoYXJlZCBtZW1vcnk6CisgKi8KKyNkZWZpbmUgSTkxNV9NRU1fUkVHSU9OX0FHUCAxCisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X21lbV9hbGxvYyB7CisJaW50IHJlZ2lvbjsKKwlpbnQgYWxpZ25tZW50OworCWludCBzaXplOworCWludCAqcmVnaW9uX29mZnNldDsJLyogb2Zmc2V0IGZyb20gc3RhcnQgb2YgZmIgb3IgYWdwICovCit9IGRybV9pOTE1X21lbV9hbGxvY190OworCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9tZW1fZnJlZSB7CisJaW50IHJlZ2lvbjsKKwlpbnQgcmVnaW9uX29mZnNldDsKK30gZHJtX2k5MTVfbWVtX2ZyZWVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfbWVtX2luaXRfaGVhcCB7CisJaW50IHJlZ2lvbjsKKwlpbnQgc2l6ZTsKKwlpbnQgc3RhcnQ7Cit9IGRybV9pOTE1X21lbV9pbml0X2hlYXBfdDsKKworLyogQWxsb3cgbWVtb3J5IG1hbmFnZXIgdG8gYmUgdG9ybiBkb3duIGFuZCByZS1pbml0aWFsaXplZCAoZWcgb24KKyAqIHJvdGF0ZSk6CisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X21lbV9kZXN0cm95X2hlYXAgeworCWludCByZWdpb247Cit9IGRybV9pOTE1X21lbV9kZXN0cm95X2hlYXBfdDsKKworLyogQWxsb3cgWCBzZXJ2ZXIgdG8gY29uZmlndXJlIHdoaWNoIHBpcGVzIHRvIG1vbml0b3IgZm9yIHZibGFuayBzaWduYWxzCisgKi8KKyNkZWZpbmUJRFJNX0k5MTVfVkJMQU5LX1BJUEVfQQkxCisjZGVmaW5lCURSTV9JOTE1X1ZCTEFOS19QSVBFX0IJMgorCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV92YmxhbmtfcGlwZSB7CisJaW50IHBpcGU7Cit9IGRybV9pOTE1X3ZibGFua19waXBlX3Q7CisKKy8qIFNjaGVkdWxlIGJ1ZmZlciBzd2FwIGF0IGdpdmVuIHZlcnRpY2FsIGJsYW5rOgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV92Ymxhbmtfc3dhcCB7CisJZHJtX2RyYXdhYmxlX3QgZHJhd2FibGU7CisJZW51bSBkcm1fdmJsYW5rX3NlcV90eXBlIHNlcXR5cGU7CisJdW5zaWduZWQgaW50IHNlcXVlbmNlOworfSBkcm1faTkxNV92Ymxhbmtfc3dhcF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9od3NfYWRkciB7CisJX191NjQgYWRkcjsKK30gZHJtX2k5MTVfaHdzX2FkZHJfdDsKKworc3RydWN0IGRybV9pOTE1X2dlbV9pbml0IHsKKwkvKioKKwkgKiBCZWdpbm5pbmcgb2Zmc2V0IGluIHRoZSBHVFQgdG8gYmUgbWFuYWdlZCBieSB0aGUgRFJNIG1lbW9yeQorCSAqIG1hbmFnZXIuCisJICovCisJX191NjQgZ3R0X3N0YXJ0OworCS8qKgorCSAqIEVuZGluZyBvZmZzZXQgaW4gdGhlIEdUVCB0byBiZSBtYW5hZ2VkIGJ5IHRoZSBEUk0gbWVtb3J5CisJICogbWFuYWdlci4KKwkgKi8KKwlfX3U2NCBndHRfZW5kOworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9jcmVhdGUgeworCS8qKgorCSAqIFJlcXVlc3RlZCBzaXplIGZvciB0aGUgb2JqZWN0LgorCSAqCisJICogVGhlIChwYWdlLWFsaWduZWQpIGFsbG9jYXRlZCBzaXplIGZvciB0aGUgb2JqZWN0IHdpbGwgYmUgcmV0dXJuZWQuCisJICovCisJX191NjQgc2l6ZTsKKwkvKioKKwkgKiBSZXR1cm5lZCBoYW5kbGUgZm9yIHRoZSBvYmplY3QuCisJICoKKwkgKiBPYmplY3QgaGFuZGxlcyBhcmUgbm9uemVyby4KKwkgKi8KKwlfX3UzMiBoYW5kbGU7CisJX191MzIgcGFkOworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9wcmVhZCB7CisJLyoqIEhhbmRsZSBmb3IgdGhlIG9iamVjdCBiZWluZyByZWFkLiAqLworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBwYWQ7CisJLyoqIE9mZnNldCBpbnRvIHRoZSBvYmplY3QgdG8gcmVhZCBmcm9tICovCisJX191NjQgb2Zmc2V0OworCS8qKiBMZW5ndGggb2YgZGF0YSB0byByZWFkICovCisJX191NjQgc2l6ZTsKKwkvKioKKwkgKiBQb2ludGVyIHRvIHdyaXRlIHRoZSBkYXRhIGludG8uCisJICoKKwkgKiBUaGlzIGlzIGEgZml4ZWQtc2l6ZSB0eXBlIGZvciAzMi82NCBjb21wYXRpYmlsaXR5LgorCSAqLworCV9fdTY0IGRhdGFfcHRyOworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9wd3JpdGUgeworCS8qKiBIYW5kbGUgZm9yIHRoZSBvYmplY3QgYmVpbmcgd3JpdHRlbiB0by4gKi8KKwlfX3UzMiBoYW5kbGU7CisJX191MzIgcGFkOworCS8qKiBPZmZzZXQgaW50byB0aGUgb2JqZWN0IHRvIHdyaXRlIHRvICovCisJX191NjQgb2Zmc2V0OworCS8qKiBMZW5ndGggb2YgZGF0YSB0byB3cml0ZSAqLworCV9fdTY0IHNpemU7CisJLyoqCisJICogUG9pbnRlciB0byByZWFkIHRoZSBkYXRhIGZyb20uCisJICoKKwkgKiBUaGlzIGlzIGEgZml4ZWQtc2l6ZSB0eXBlIGZvciAzMi82NCBjb21wYXRpYmlsaXR5LgorCSAqLworCV9fdTY0IGRhdGFfcHRyOworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9tbWFwIHsKKwkvKiogSGFuZGxlIGZvciB0aGUgb2JqZWN0IGJlaW5nIG1hcHBlZC4gKi8KKwlfX3UzMiBoYW5kbGU7CisJX191MzIgcGFkOworCS8qKiBPZmZzZXQgaW4gdGhlIG9iamVjdCB0byBtYXAuICovCisJX191NjQgb2Zmc2V0OworCS8qKgorCSAqIExlbmd0aCBvZiBkYXRhIHRvIG1hcC4KKwkgKgorCSAqIFRoZSB2YWx1ZSB3aWxsIGJlIHBhZ2UtYWxpZ25lZC4KKwkgKi8KKwlfX3U2NCBzaXplOworCS8qKgorCSAqIFJldHVybmVkIHBvaW50ZXIgdGhlIGRhdGEgd2FzIG1hcHBlZCBhdC4KKwkgKgorCSAqIFRoaXMgaXMgYSBmaXhlZC1zaXplIHR5cGUgZm9yIDMyLzY0IGNvbXBhdGliaWxpdHkuCisJICovCisJX191NjQgYWRkcl9wdHI7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXBfZ3R0IHsKKwkvKiogSGFuZGxlIGZvciB0aGUgb2JqZWN0IGJlaW5nIG1hcHBlZC4gKi8KKwlfX3UzMiBoYW5kbGU7CisJX191MzIgcGFkOworCS8qKgorCSAqIEZha2Ugb2Zmc2V0IHRvIHVzZSBmb3Igc3Vic2VxdWVudCBtbWFwIGNhbGwKKwkgKgorCSAqIFRoaXMgaXMgYSBmaXhlZC1zaXplIHR5cGUgZm9yIDMyLzY0IGNvbXBhdGliaWxpdHkuCisJICovCisJX191NjQgb2Zmc2V0OworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9zZXRfZG9tYWluIHsKKwkvKiogSGFuZGxlIGZvciB0aGUgb2JqZWN0ICovCisJX191MzIgaGFuZGxlOworCisJLyoqIE5ldyByZWFkIGRvbWFpbnMgKi8KKwlfX3UzMiByZWFkX2RvbWFpbnM7CisKKwkvKiogTmV3IHdyaXRlIGRvbWFpbiAqLworCV9fdTMyIHdyaXRlX2RvbWFpbjsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fc3dfZmluaXNoIHsKKwkvKiogSGFuZGxlIGZvciB0aGUgb2JqZWN0ICovCisJX191MzIgaGFuZGxlOworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5IHsKKwkvKioKKwkgKiBIYW5kbGUgb2YgdGhlIGJ1ZmZlciBiZWluZyBwb2ludGVkIHRvIGJ5IHRoaXMgcmVsb2NhdGlvbiBlbnRyeS4KKwkgKgorCSAqIEl0J3MgYXBwZWFsaW5nIHRvIG1ha2UgdGhpcyBiZSBhbiBpbmRleCBpbnRvIHRoZSBtbV92YWxpZGF0ZV9lbnRyeQorCSAqIGxpc3QgdG8gcmVmZXIgdG8gdGhlIGJ1ZmZlciwgYnV0IHRoaXMgYWxsb3dzIHRoZSBkcml2ZXIgdG8gY3JlYXRlCisJICogYSByZWxvY2F0aW9uIGxpc3QgZm9yIHN0YXRlIGJ1ZmZlcnMgYW5kIG5vdCByZS13cml0ZSBpdCBwZXIKKwkgKiBleGVjIHVzaW5nIHRoZSBidWZmZXIuCisJICovCisJX191MzIgdGFyZ2V0X2hhbmRsZTsKKworCS8qKgorCSAqIFZhbHVlIHRvIGJlIGFkZGVkIHRvIHRoZSBvZmZzZXQgb2YgdGhlIHRhcmdldCBidWZmZXIgdG8gbWFrZSB1cAorCSAqIHRoZSByZWxvY2F0aW9uIGVudHJ5LgorCSAqLworCV9fdTMyIGRlbHRhOworCisJLyoqIE9mZnNldCBpbiB0aGUgYnVmZmVyIHRoZSByZWxvY2F0aW9uIGVudHJ5IHdpbGwgYmUgd3JpdHRlbiBpbnRvICovCisJX191NjQgb2Zmc2V0OworCisJLyoqCisJICogT2Zmc2V0IHZhbHVlIG9mIHRoZSB0YXJnZXQgYnVmZmVyIHRoYXQgdGhlIHJlbG9jYXRpb24gZW50cnkgd2FzIGxhc3QKKwkgKiB3cml0dGVuIGFzLgorCSAqCisJICogSWYgdGhlIGJ1ZmZlciBoYXMgdGhlIHNhbWUgb2Zmc2V0IGFzIGxhc3QgdGltZSwgd2UgY2FuIHNraXAgc3luY2luZworCSAqIGFuZCB3cml0aW5nIHRoZSByZWxvY2F0aW9uLiAgVGhpcyB2YWx1ZSBpcyB3cml0dGVuIGJhY2sgb3V0IGJ5CisJICogdGhlIGV4ZWNidWZmZXIgaW9jdGwgd2hlbiB0aGUgcmVsb2NhdGlvbiBpcyB3cml0dGVuLgorCSAqLworCV9fdTY0IHByZXN1bWVkX29mZnNldDsKKworCS8qKgorCSAqIFRhcmdldCBtZW1vcnkgZG9tYWlucyByZWFkIGJ5IHRoaXMgb3BlcmF0aW9uLgorCSAqLworCV9fdTMyIHJlYWRfZG9tYWluczsKKworCS8qKgorCSAqIFRhcmdldCBtZW1vcnkgZG9tYWlucyB3cml0dGVuIGJ5IHRoaXMgb3BlcmF0aW9uLgorCSAqCisJICogTm90ZSB0aGF0IG9ubHkgb25lIGRvbWFpbiBtYXkgYmUgd3JpdHRlbiBieSB0aGUgd2hvbGUKKwkgKiBleGVjYnVmZmVyIG9wZXJhdGlvbiwgc28gdGhhdCB3aGVyZSB0aGVyZSBhcmUgY29uZmxpY3RzLAorCSAqIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGdldCAtRUlOVkFMIGJhY2suCisJICovCisJX191MzIgd3JpdGVfZG9tYWluOworfTsKKworLyoqIEB7CisgKiBJbnRlbCBtZW1vcnkgZG9tYWlucworICoKKyAqIE1vc3Qgb2YgdGhlc2UganVzdCBhbGlnbiB3aXRoIHRoZSB2YXJpb3VzIGNhY2hlcyBpbgorICogdGhlIHN5c3RlbSBhbmQgYXJlIHVzZWQgdG8gZmx1c2ggYW5kIGludmFsaWRhdGUgYXMKKyAqIG9iamVjdHMgZW5kIHVwIGNhY2hlZCBpbiBkaWZmZXJlbnQgZG9tYWlucy4KKyAqLworLyoqIENQVSBjYWNoZSAqLworI2RlZmluZSBJOTE1X0dFTV9ET01BSU5fQ1BVCQkweDAwMDAwMDAxCisvKiogUmVuZGVyIGNhY2hlLCB1c2VkIGJ5IDJEIGFuZCAzRCBkcmF3aW5nICovCisjZGVmaW5lIEk5MTVfR0VNX0RPTUFJTl9SRU5ERVIJCTB4MDAwMDAwMDIKKy8qKiBTYW1wbGVyIGNhY2hlLCB1c2VkIGJ5IHRleHR1cmUgZW5naW5lICovCisjZGVmaW5lIEk5MTVfR0VNX0RPTUFJTl9TQU1QTEVSCQkweDAwMDAwMDA0CisvKiogQ29tbWFuZCBxdWV1ZSwgdXNlZCB0byBsb2FkIGJhdGNoIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgSTkxNV9HRU1fRE9NQUlOX0NPTU1BTkQJCTB4MDAwMDAwMDgKKy8qKiBJbnN0cnVjdGlvbiBjYWNoZSwgdXNlZCBieSBzaGFkZXIgcHJvZ3JhbXMgKi8KKyNkZWZpbmUgSTkxNV9HRU1fRE9NQUlOX0lOU1RSVUNUSU9OCTB4MDAwMDAwMTAKKy8qKiBWZXJ0ZXggYWRkcmVzcyBjYWNoZSAqLworI2RlZmluZSBJOTE1X0dFTV9ET01BSU5fVkVSVEVYCQkweDAwMDAwMDIwCisvKiogR1RUIGRvbWFpbiAtIGFwZXJ0dXJlIGFuZCBzY2Fub3V0ICovCisjZGVmaW5lIEk5MTVfR0VNX0RPTUFJTl9HVFQJCTB4MDAwMDAwNDAKKy8qKiBAfSAqLworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0IHsKKwkvKioKKwkgKiBVc2VyJ3MgaGFuZGxlIGZvciBhIGJ1ZmZlciB0byBiZSBib3VuZCBpbnRvIHRoZSBHVFQgZm9yIHRoaXMKKwkgKiBvcGVyYXRpb24uCisJICovCisJX191MzIgaGFuZGxlOworCisJLyoqIE51bWJlciBvZiByZWxvY2F0aW9ucyB0byBiZSBwZXJmb3JtZWQgb24gdGhpcyBidWZmZXIgKi8KKwlfX3UzMiByZWxvY2F0aW9uX2NvdW50OworCS8qKgorCSAqIFBvaW50ZXIgdG8gYXJyYXkgb2Ygc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5IGNvbnRhaW5pbmcKKwkgKiB0aGUgcmVsb2NhdGlvbnMgdG8gYmUgcGVyZm9ybWVkIGluIHRoaXMgYnVmZmVyLgorCSAqLworCV9fdTY0IHJlbG9jc19wdHI7CisKKwkvKiogUmVxdWlyZWQgYWxpZ25tZW50IGluIGdyYXBoaWNzIGFwZXJ0dXJlICovCisJX191NjQgYWxpZ25tZW50OworCisJLyoqCisJICogUmV0dXJuZWQgdmFsdWUgb2YgdGhlIHVwZGF0ZWQgb2Zmc2V0IG9mIHRoZSBvYmplY3QsIGZvciBmdXR1cmUKKwkgKiBwcmVzdW1lZF9vZmZzZXQgd3JpdGVzLgorCSAqLworCV9fdTY0IG9mZnNldDsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlciB7CisJLyoqCisJICogTGlzdCBvZiBidWZmZXJzIHRvIGJlIHZhbGlkYXRlZCB3aXRoIHRoZWlyIHJlbG9jYXRpb25zIHRvIGJlCisJICogcGVyZm9ybWVuZCBvbiB0aGVtLgorCSAqCisJICogVGhpcyBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygc3RydWN0IGRybV9pOTE1X2dlbV92YWxpZGF0ZV9lbnRyeS4KKwkgKgorCSAqIFRoZXNlIGJ1ZmZlcnMgbXVzdCBiZSBsaXN0ZWQgaW4gYW4gb3JkZXIgc3VjaCB0aGF0IGFsbCByZWxvY2F0aW9ucworCSAqIGEgYnVmZmVyIGlzIHBlcmZvcm1pbmcgcmVmZXIgdG8gYnVmZmVycyB0aGF0IGhhdmUgYWxyZWFkeSBhcHBlYXJlZAorCSAqIGluIHRoZSB2YWxpZGF0ZSBsaXN0LgorCSAqLworCV9fdTY0IGJ1ZmZlcnNfcHRyOworCV9fdTMyIGJ1ZmZlcl9jb3VudDsKKworCS8qKiBPZmZzZXQgaW4gdGhlIGJhdGNoYnVmZmVyIHRvIHN0YXJ0IGV4ZWN1dGlvbiBmcm9tLiAqLworCV9fdTMyIGJhdGNoX3N0YXJ0X29mZnNldDsKKwkvKiogQnl0ZXMgdXNlZCBpbiBiYXRjaGJ1ZmZlciBmcm9tIGJhdGNoX3N0YXJ0X29mZnNldCAqLworCV9fdTMyIGJhdGNoX2xlbjsKKwlfX3UzMiBEUjE7CisJX191MzIgRFI0OworCV9fdTMyIG51bV9jbGlwcmVjdHM7CisJLyoqIFRoaXMgaXMgYSBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqY2xpcHJlY3RzICovCisJX191NjQgY2xpcHJlY3RzX3B0cjsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyIHsKKwkvKioKKwkgKiBVc2VyJ3MgaGFuZGxlIGZvciBhIGJ1ZmZlciB0byBiZSBib3VuZCBpbnRvIHRoZSBHVFQgZm9yIHRoaXMKKwkgKiBvcGVyYXRpb24uCisJICovCisJX191MzIgaGFuZGxlOworCisJLyoqIE51bWJlciBvZiByZWxvY2F0aW9ucyB0byBiZSBwZXJmb3JtZWQgb24gdGhpcyBidWZmZXIgKi8KKwlfX3UzMiByZWxvY2F0aW9uX2NvdW50OworCS8qKgorCSAqIFBvaW50ZXIgdG8gYXJyYXkgb2Ygc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5IGNvbnRhaW5pbmcKKwkgKiB0aGUgcmVsb2NhdGlvbnMgdG8gYmUgcGVyZm9ybWVkIGluIHRoaXMgYnVmZmVyLgorCSAqLworCV9fdTY0IHJlbG9jc19wdHI7CisKKwkvKiogUmVxdWlyZWQgYWxpZ25tZW50IGluIGdyYXBoaWNzIGFwZXJ0dXJlICovCisJX191NjQgYWxpZ25tZW50OworCisJLyoqCisJICogUmV0dXJuZWQgdmFsdWUgb2YgdGhlIHVwZGF0ZWQgb2Zmc2V0IG9mIHRoZSBvYmplY3QsIGZvciBmdXR1cmUKKwkgKiBwcmVzdW1lZF9vZmZzZXQgd3JpdGVzLgorCSAqLworCV9fdTY0IG9mZnNldDsKKworI2RlZmluZSBFWEVDX09CSkVDVF9ORUVEU19GRU5DRSAoMTw8MCkKKwlfX3U2NCBmbGFnczsKKwlfX3U2NCByc3ZkMTsKKwlfX3U2NCByc3ZkMjsKK307CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcjIgeworCS8qKgorCSAqIExpc3Qgb2YgZ2VtX2V4ZWNfb2JqZWN0MiBzdHJ1Y3RzCisJICovCisJX191NjQgYnVmZmVyc19wdHI7CisJX191MzIgYnVmZmVyX2NvdW50OworCisJLyoqIE9mZnNldCBpbiB0aGUgYmF0Y2hidWZmZXIgdG8gc3RhcnQgZXhlY3V0aW9uIGZyb20uICovCisJX191MzIgYmF0Y2hfc3RhcnRfb2Zmc2V0OworCS8qKiBCeXRlcyB1c2VkIGluIGJhdGNoYnVmZmVyIGZyb20gYmF0Y2hfc3RhcnRfb2Zmc2V0ICovCisJX191MzIgYmF0Y2hfbGVuOworCV9fdTMyIERSMTsKKwlfX3UzMiBEUjQ7CisJX191MzIgbnVtX2NsaXByZWN0czsKKwkvKiogVGhpcyBpcyBhIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcmVjdHMgKi8KKwlfX3U2NCBjbGlwcmVjdHNfcHRyOworI2RlZmluZSBJOTE1X0VYRUNfUklOR19NQVNLICAgICAgICAgICAgICAoNzw8MCkKKyNkZWZpbmUgSTkxNV9FWEVDX0RFRkFVTFQgICAgICAgICAgICAgICAgKDA8PDApCisjZGVmaW5lIEk5MTVfRVhFQ19SRU5ERVIgICAgICAgICAgICAgICAgICgxPDwwKQorI2RlZmluZSBJOTE1X0VYRUNfQlNEICAgICAgICAgICAgICAgICAgICAoMjw8MCkKKyNkZWZpbmUgSTkxNV9FWEVDX0JMVCAgICAgICAgICAgICAgICAgICAgKDM8PDApCisKKy8qIFVzZWQgZm9yIHN3aXRjaGluZyB0aGUgY29uc3RhbnRzIGFkZHJlc3NpbmcgbW9kZSBvbiBnZW40KyBSRU5ERVIgcmluZy4KKyAqIEdlbjYrIG9ubHkgc3VwcG9ydHMgcmVsYXRpdmUgYWRkcmVzc2luZyB0byBkeW5hbWljIHN0YXRlIChkZWZhdWx0KSBhbmQKKyAqIGFic29sdXRlIGFkZHJlc3NpbmcuCisgKgorICogVGhlc2UgZmxhZ3MgYXJlIGlnbm9yZWQgZm9yIHRoZSBCU0QgYW5kIEJMVCByaW5ncy4KKyAqLworI2RlZmluZSBJOTE1X0VYRUNfQ09OU1RBTlRTX01BU0sgCSgzPDw2KQorI2RlZmluZSBJOTE1X0VYRUNfQ09OU1RBTlRTX1JFTF9HRU5FUkFMICgwPDw2KSAvKiBkZWZhdWx0ICovCisjZGVmaW5lIEk5MTVfRVhFQ19DT05TVEFOVFNfQUJTT0xVVEUgCSgxPDw2KQorI2RlZmluZSBJOTE1X0VYRUNfQ09OU1RBTlRTX1JFTF9TVVJGQUNFICgyPDw2KSAvKiBnZW40LzUgb25seSAqLworCV9fdTY0IGZsYWdzOworCV9fdTY0IHJzdmQxOworCV9fdTY0IHJzdmQyOworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9waW4geworCS8qKiBIYW5kbGUgb2YgdGhlIGJ1ZmZlciB0byBiZSBwaW5uZWQuICovCisJX191MzIgaGFuZGxlOworCV9fdTMyIHBhZDsKKworCS8qKiBhbGlnbm1lbnQgcmVxdWlyZWQgd2l0aGluIHRoZSBhcGVydHVyZSAqLworCV9fdTY0IGFsaWdubWVudDsKKworCS8qKiBSZXR1cm5lZCBHVFQgb2Zmc2V0IG9mIHRoZSBidWZmZXIuICovCisJX191NjQgb2Zmc2V0OworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV91bnBpbiB7CisJLyoqIEhhbmRsZSBvZiB0aGUgYnVmZmVyIHRvIGJlIHVucGlubmVkLiAqLworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBwYWQ7Cit9OworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2J1c3kgeworCS8qKiBIYW5kbGUgb2YgdGhlIGJ1ZmZlciB0byBjaGVjayBmb3IgYnVzeSAqLworCV9fdTMyIGhhbmRsZTsKKworCS8qKiBSZXR1cm4gYnVzeSBzdGF0dXMgKDEgaWYgYnVzeSwgMCBpZiBpZGxlKSAqLworCV9fdTMyIGJ1c3k7Cit9OworCisjZGVmaW5lIEk5MTVfVElMSU5HX05PTkUJMAorI2RlZmluZSBJOTE1X1RJTElOR19YCQkxCisjZGVmaW5lIEk5MTVfVElMSU5HX1kJCTIKKworI2RlZmluZSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORQkJMAorI2RlZmluZSBJOTE1X0JJVF82X1NXSVpaTEVfOQkJMQorI2RlZmluZSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMAkJMgorI2RlZmluZSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMQkJMworI2RlZmluZSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMF8xMQk0CisvKiBOb3Qgc2VlbiBieSB1c2VybGFuZCAqLworI2RlZmluZSBJOTE1X0JJVF82X1NXSVpaTEVfVU5LTk9XTgk1CisvKiBTZWVuIGJ5IHVzZXJsYW5kLiAqLworI2RlZmluZSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xNwkJNgorI2RlZmluZSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMF8xNwk3CisKK3N0cnVjdCBkcm1faTkxNV9nZW1fc2V0X3RpbGluZyB7CisJLyoqIEhhbmRsZSBvZiB0aGUgYnVmZmVyIHRvIGhhdmUgaXRzIHRpbGluZyBzdGF0ZSB1cGRhdGVkICovCisJX191MzIgaGFuZGxlOworCisJLyoqCisJICogVGlsaW5nIG1vZGUgZm9yIHRoZSBvYmplY3QgKEk5MTVfVElMSU5HX05PTkUsIEk5MTVfVElMSU5HX1gsCisJICogSTkxNV9USUxJTkdfWSkuCisJICoKKwkgKiBUaGlzIHZhbHVlIGlzIHRvIGJlIHNldCBvbiByZXF1ZXN0LCBhbmQgd2lsbCBiZSB1cGRhdGVkIGJ5IHRoZQorCSAqIGtlcm5lbCBvbiBzdWNjZXNzZnVsIHJldHVybiB3aXRoIHRoZSBhY3R1YWwgY2hvc2VuIHRpbGluZyBsYXlvdXQuCisJICoKKwkgKiBUaGUgdGlsaW5nIG1vZGUgbWF5IGJlIGRlbW90ZWQgdG8gSTkxNV9USUxJTkdfTk9ORSB3aGVuIHRoZSBzeXN0ZW0KKwkgKiBoYXMgYml0IDYgc3dpenpsaW5nIHRoYXQgY2FuJ3QgYmUgbWFuYWdlZCBjb3JyZWN0bHkgYnkgR0VNLgorCSAqCisJICogQnVmZmVyIGNvbnRlbnRzIGJlY29tZSB1bmRlZmluZWQgd2hlbiBjaGFuZ2luZyB0aWxpbmdfbW9kZS4KKwkgKi8KKwlfX3UzMiB0aWxpbmdfbW9kZTsKKworCS8qKgorCSAqIFN0cmlkZSBpbiBieXRlcyBmb3IgdGhlIG9iamVjdCB3aGVuIGluIEk5MTVfVElMSU5HX1ggb3IKKwkgKiBJOTE1X1RJTElOR19ZLgorCSAqLworCV9fdTMyIHN0cmlkZTsKKworCS8qKgorCSAqIFJldHVybmVkIGFkZHJlc3MgYml0IDYgc3dpenpsaW5nIHJlcXVpcmVkIGZvciBDUFUgYWNjZXNzIHRocm91Z2gKKwkgKiBtbWFwIG1hcHBpbmcuCisJICovCisJX191MzIgc3dpenpsZV9tb2RlOworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9nZXRfdGlsaW5nIHsKKwkvKiogSGFuZGxlIG9mIHRoZSBidWZmZXIgdG8gZ2V0IHRpbGluZyBzdGF0ZSBmb3IuICovCisJX191MzIgaGFuZGxlOworCisJLyoqCisJICogQ3VycmVudCB0aWxpbmcgbW9kZSBmb3IgdGhlIG9iamVjdCAoSTkxNV9USUxJTkdfTk9ORSwgSTkxNV9USUxJTkdfWCwKKwkgKiBJOTE1X1RJTElOR19ZKS4KKwkgKi8KKwlfX3UzMiB0aWxpbmdfbW9kZTsKKworCS8qKgorCSAqIFJldHVybmVkIGFkZHJlc3MgYml0IDYgc3dpenpsaW5nIHJlcXVpcmVkIGZvciBDUFUgYWNjZXNzIHRocm91Z2gKKwkgKiBtbWFwIG1hcHBpbmcuCisJICovCisJX191MzIgc3dpenpsZV9tb2RlOworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9nZXRfYXBlcnR1cmUgeworCS8qKiBUb3RhbCBzaXplIG9mIHRoZSBhcGVydHVyZSB1c2VkIGJ5IGk5MTVfZ2VtX2V4ZWNidWZmZXIsIGluIGJ5dGVzICovCisJX191NjQgYXBlcl9zaXplOworCisJLyoqCisJICogQXZhaWxhYmxlIHNwYWNlIGluIHRoZSBhcGVydHVyZSB1c2VkIGJ5IGk5MTVfZ2VtX2V4ZWNidWZmZXIsIGluCisJICogYnl0ZXMKKwkgKi8KKwlfX3U2NCBhcGVyX2F2YWlsYWJsZV9zaXplOworfTsKKworc3RydWN0IGRybV9pOTE1X2dldF9waXBlX2Zyb21fY3J0Y19pZCB7CisJLyoqIElEIG9mIENSVEMgYmVpbmcgcmVxdWVzdGVkICoqLworCV9fdTMyIGNydGNfaWQ7CisKKwkvKiogcGlwZSBvZiByZXF1ZXN0ZWQgQ1JUQyAqKi8KKwlfX3UzMiBwaXBlOworfTsKKworI2RlZmluZSBJOTE1X01BRFZfV0lMTE5FRUQgMAorI2RlZmluZSBJOTE1X01BRFZfRE9OVE5FRUQgMQorI2RlZmluZSBfX0k5MTVfTUFEVl9QVVJHRUQgMiAvKiBpbnRlcm5hbCBzdGF0ZSAqLworCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21hZHZpc2UgeworCS8qKiBIYW5kbGUgb2YgdGhlIGJ1ZmZlciB0byBjaGFuZ2UgdGhlIGJhY2tpbmcgc3RvcmUgYWR2aWNlICovCisJX191MzIgaGFuZGxlOworCisJLyogQWR2aWNlOiBlaXRoZXIgdGhlIGJ1ZmZlciB3aWxsIGJlIG5lZWRlZCBhZ2FpbiBpbiB0aGUgbmVhciBmdXR1cmUsCisJICogICAgICAgICBvciB3b250IGJlIGFuZCBjb3VsZCBiZSBkaXNjYXJkZWQgdW5kZXIgbWVtb3J5IHByZXNzdXJlLgorCSAqLworCV9fdTMyIG1hZHY7CisKKwkvKiogV2hldGhlciB0aGUgYmFja2luZyBzdG9yZSBzdGlsbCBleGlzdHMuICovCisJX191MzIgcmV0YWluZWQ7Cit9OworCisvKiBmbGFncyAqLworI2RlZmluZSBJOTE1X09WRVJMQVlfVFlQRV9NQVNLIAkJMHhmZgorI2RlZmluZSBJOTE1X09WRVJMQVlfWVVWX1BMQU5BUiAJMHgwMQorI2RlZmluZSBJOTE1X09WRVJMQVlfWVVWX1BBQ0tFRCAJMHgwMgorI2RlZmluZSBJOTE1X09WRVJMQVlfUkdCCQkweDAzCisKKyNkZWZpbmUgSTkxNV9PVkVSTEFZX0RFUFRIX01BU0sJCTB4ZmYwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfUkdCMjQJCTB4MTAwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfUkdCMTYJCTB4MjAwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfUkdCMTUJCTB4MzAwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfWVVWNDIyCQkweDAxMDAKKyNkZWZpbmUgSTkxNV9PVkVSTEFZX1lVVjQxMQkJMHgwMjAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9ZVVY0MjAJCTB4MDMwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfWVVWNDEwCQkweDA0MDAKKworI2RlZmluZSBJOTE1X09WRVJMQVlfU1dBUF9NQVNLCQkweGZmMDAwMAorI2RlZmluZSBJOTE1X09WRVJMQVlfTk9fU1dBUAkJMHgwMDAwMDAKKyNkZWZpbmUgSTkxNV9PVkVSTEFZX1VWX1NXQVAJCTB4MDEwMDAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9ZX1NXQVAJCTB4MDIwMDAwCisjZGVmaW5lIEk5MTVfT1ZFUkxBWV9ZX0FORF9VVl9TV0FQCTB4MDMwMDAwCisKKyNkZWZpbmUgSTkxNV9PVkVSTEFZX0ZMQUdTX01BU0sJCTB4ZmYwMDAwMDAKKyNkZWZpbmUgSTkxNV9PVkVSTEFZX0VOQUJMRQkJMHgwMTAwMDAwMAorCitzdHJ1Y3QgZHJtX2ludGVsX292ZXJsYXlfcHV0X2ltYWdlIHsKKwkvKiB2YXJpb3VzIGZsYWdzIGFuZCBzcmMgZm9ybWF0IGRlc2NyaXB0aW9uICovCisJX191MzIgZmxhZ3M7CisJLyogc291cmNlIHBpY3R1cmUgZGVzY3JpcHRpb24gKi8KKwlfX3UzMiBib19oYW5kbGU7CisJLyogc3RyaWRlIHZhbHVlcyBhbmQgb2Zmc2V0cyBhcmUgaW4gYnl0ZXMsIGJ1ZmZlciByZWxhdGl2ZSAqLworCV9fdTE2IHN0cmlkZV9ZOyAvKiBzdHJpZGUgZm9yIHBhY2tlZCBmb3JtYXRzICovCisJX191MTYgc3RyaWRlX1VWOworCV9fdTMyIG9mZnNldF9ZOyAvKiBvZmZzZXQgZm9yIHBhY2tldCBmb3JtYXRzICovCisJX191MzIgb2Zmc2V0X1U7CisJX191MzIgb2Zmc2V0X1Y7CisJLyogaW4gcGl4ZWxzICovCisJX191MTYgc3JjX3dpZHRoOworCV9fdTE2IHNyY19oZWlnaHQ7CisJLyogdG8gY29tcGVuc2F0ZSB0aGUgc2NhbGluZyBmYWN0b3JzIGZvciBwYXJ0aWFsbHkgY292ZXJlZCBzdXJmYWNlcyAqLworCV9fdTE2IHNyY19zY2FuX3dpZHRoOworCV9fdTE2IHNyY19zY2FuX2hlaWdodDsKKwkvKiBvdXRwdXQgY3J0YyBkZXNjcmlwdGlvbiAqLworCV9fdTMyIGNydGNfaWQ7CisJX191MTYgZHN0X3g7CisJX191MTYgZHN0X3k7CisJX191MTYgZHN0X3dpZHRoOworCV9fdTE2IGRzdF9oZWlnaHQ7Cit9OworCisvKiBmbGFncyAqLworI2RlZmluZSBJOTE1X09WRVJMQVlfVVBEQVRFX0FUVFJTCSgxPDwwKQorI2RlZmluZSBJOTE1X09WRVJMQVlfVVBEQVRFX0dBTU1BCSgxPDwxKQorc3RydWN0IGRybV9pbnRlbF9vdmVybGF5X2F0dHJzIHsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBjb2xvcl9rZXk7CisJX19zMzIgYnJpZ2h0bmVzczsKKwlfX3UzMiBjb250cmFzdDsKKwlfX3UzMiBzYXR1cmF0aW9uOworCV9fdTMyIGdhbW1hMDsKKwlfX3UzMiBnYW1tYTE7CisJX191MzIgZ2FtbWEyOworCV9fdTMyIGdhbW1hMzsKKwlfX3UzMiBnYW1tYTQ7CisJX191MzIgZ2FtbWE1OworfTsKKworI2VuZGlmCQkJCS8qIF9JOTE1X0RSTV9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vbWdhX2RybS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vbWdhX2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOTVjNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2RybS9tZ2FfZHJtLmgKQEAgLTAsMCArMSw0MTkgQEAKKy8qIG1nYV9kcm0uaCAtLSBQdWJsaWMgaGVhZGVyIGZvciB0aGUgTWF0cm94IGcyMDAvZzQwMCBkcml2ZXIgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBUdWUgSmFuIDI1IDAxOjUwOjAxIDE5OTkgYnkgamhhcnRtYW5uQHByZWNpc2lvbmluc2lnaHQuY29tCisgKgorICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgSmVmZiBIYXJ0bWFubiA8amhhcnRtYW5uQHZhbGludXguY29tPgorICogICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICoKKyAqIFJld3JpdHRlbiBieToKKyAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KKyAqLworCisjaWZuZGVmIF9fTUdBX0RSTV9IX18KKyNkZWZpbmUgX19NR0FfRFJNX0hfXworCisjaW5jbHVkZSA8ZHJtL2RybS5oPgorCisvKiBXQVJOSU5HOiBJZiB5b3UgY2hhbmdlIGFueSBvZiB0aGVzZSBkZWZpbmVzLCBtYWtlIHN1cmUgdG8gY2hhbmdlIHRoZQorICogZGVmaW5lcyBpbiB0aGUgWHNlcnZlciBmaWxlIChtZ2Ffc2FyZWEuaCkKKyAqLworCisjaWZuZGVmIF9fTUdBX1NBUkVBX0RFRklORVNfXworI2RlZmluZSBfX01HQV9TQVJFQV9ERUZJTkVTX18KKworLyogV0FSUCBwaXBlIGZsYWdzCisgKi8KKyNkZWZpbmUgTUdBX0YJCQkweDEJLyogZm9nICovCisjZGVmaW5lIE1HQV9BCQkJMHgyCS8qIGFscGhhICovCisjZGVmaW5lIE1HQV9TCQkJMHg0CS8qIHNwZWN1bGFyICovCisjZGVmaW5lIE1HQV9UMgkJCTB4OAkvKiBtdWx0aXRleHR1cmUgKi8KKworI2RlZmluZSBNR0FfV0FSUF9UR1oJCTAKKyNkZWZpbmUgTUdBX1dBUlBfVEdaRgkJKE1HQV9GKQorI2RlZmluZSBNR0FfV0FSUF9UR1pBCQkoTUdBX0EpCisjZGVmaW5lIE1HQV9XQVJQX1RHWkFGCQkoTUdBX0Z8TUdBX0EpCisjZGVmaW5lIE1HQV9XQVJQX1RHWlMJCShNR0FfUykKKyNkZWZpbmUgTUdBX1dBUlBfVEdaU0YJCShNR0FfU3xNR0FfRikKKyNkZWZpbmUgTUdBX1dBUlBfVEdaU0EJCShNR0FfU3xNR0FfQSkKKyNkZWZpbmUgTUdBX1dBUlBfVEdaU0FGCQkoTUdBX1N8TUdBX0Z8TUdBX0EpCisjZGVmaW5lIE1HQV9XQVJQX1QyR1oJCShNR0FfVDIpCisjZGVmaW5lIE1HQV9XQVJQX1QyR1pGCQkoTUdBX1QyfE1HQV9GKQorI2RlZmluZSBNR0FfV0FSUF9UMkdaQQkJKE1HQV9UMnxNR0FfQSkKKyNkZWZpbmUgTUdBX1dBUlBfVDJHWkFGCQkoTUdBX1QyfE1HQV9BfE1HQV9GKQorI2RlZmluZSBNR0FfV0FSUF9UMkdaUwkJKE1HQV9UMnxNR0FfUykKKyNkZWZpbmUgTUdBX1dBUlBfVDJHWlNGCQkoTUdBX1QyfE1HQV9TfE1HQV9GKQorI2RlZmluZSBNR0FfV0FSUF9UMkdaU0EJCShNR0FfVDJ8TUdBX1N8TUdBX0EpCisjZGVmaW5lIE1HQV9XQVJQX1QyR1pTQUYJKE1HQV9UMnxNR0FfU3xNR0FfRnxNR0FfQSkKKworI2RlZmluZSBNR0FfTUFYX0cyMDBfUElQRVMJOAkvKiBubyBtdWx0aXRleCAqLworI2RlZmluZSBNR0FfTUFYX0c0MDBfUElQRVMJMTYKKyNkZWZpbmUgTUdBX01BWF9XQVJQX1BJUEVTCU1HQV9NQVhfRzQwMF9QSVBFUworI2RlZmluZSBNR0FfV0FSUF9VQ09ERV9TSVpFCTMyNzY4CS8qIGluIGJ5dGVzICovCisKKyNkZWZpbmUgTUdBX0NBUkRfVFlQRV9HMjAwCTEKKyNkZWZpbmUgTUdBX0NBUkRfVFlQRV9HNDAwCTIKKyNkZWZpbmUgTUdBX0NBUkRfVFlQRV9HNDUwCTMJLyogbm90IGN1cnJlbnRseSB1c2VkICovCisjZGVmaW5lIE1HQV9DQVJEX1RZUEVfRzU1MAk0CisKKyNkZWZpbmUgTUdBX0ZST05UCQkweDEKKyNkZWZpbmUgTUdBX0JBQ0sJCTB4MgorI2RlZmluZSBNR0FfREVQVEgJCTB4NAorCisvKiBXaGF0IG5lZWRzIHRvIGJlIGNoYW5nZWQgZm9yIHRoZSBjdXJyZW50IHZlcnRleCBkbWEgYnVmZmVyPworICovCisjZGVmaW5lIE1HQV9VUExPQURfQ09OVEVYVAkweDEKKyNkZWZpbmUgTUdBX1VQTE9BRF9URVgwCQkweDIKKyNkZWZpbmUgTUdBX1VQTE9BRF9URVgxCQkweDQKKyNkZWZpbmUgTUdBX1VQTE9BRF9QSVBFCQkweDgKKyNkZWZpbmUgTUdBX1VQTE9BRF9URVgwSU1BR0UJMHgxMAkvKiBoYW5kbGVkIGNsaWVudC1zaWRlICovCisjZGVmaW5lIE1HQV9VUExPQURfVEVYMUlNQUdFCTB4MjAJLyogaGFuZGxlZCBjbGllbnQtc2lkZSAqLworI2RlZmluZSBNR0FfVVBMT0FEXzJECQkweDQwCisjZGVmaW5lIE1HQV9XQUlUX0FHRQkJMHg4MAkvKiBoYW5kbGVkIGNsaWVudC1zaWRlICovCisjZGVmaW5lIE1HQV9VUExPQURfQ0xJUFJFQ1RTCTB4MTAwCS8qIGhhbmRsZWQgY2xpZW50LXNpZGUgKi8KKyNpZiAwCisjZGVmaW5lIE1HQV9ETUFfRkxVU0gJCTB4MjAwCS8qIHNldCB3aGVuIHNvbWVvbmUgZ2V0cyB0aGUgbG9jaworCQkJCQkgICBxdWllc2NlbnQgKi8KKyNlbmRpZgorCisvKiAzMiBidWZmZXJzIG9mIDY0ayBlYWNoLCB0b3RhbCAyIG1lZy4KKyAqLworI2RlZmluZSBNR0FfQlVGRkVSX1NJWkUJCSgxIDw8IDE2KQorI2RlZmluZSBNR0FfTlVNX0JVRkZFUlMJCTEyOAorCisvKiBLZWVwIHRoZXNlIHNtYWxsIGZvciB0ZXN0aW5nLgorICovCisjZGVmaW5lIE1HQV9OUl9TQVJFQV9DTElQUkVDVFMJOAorCisvKiAyIGhlYXBzICgxIGZvciBjYXJkLCAxIGZvciBhZ3ApLCBlYWNoIGRpdmlkZWQgaW50byB1cCB0byAxMjgKKyAqIHJlZ2lvbnMsIHN1YmplY3QgdG8gYSBtaW5pbXVtIHJlZ2lvbiBzaXplIG9mICgxPDwxNikgPT0gNjRrLgorICoKKyAqIENsaWVudHMgbWF5IHN1YmRpdmlkZSByZWdpb25zIGludGVybmFsbHksIGJ1dCB3aGVuIHNoYXJpbmcgYmV0d2VlbgorICogY2xpZW50cywgdGhlIHJlZ2lvbiBzaXplIGlzIHRoZSBtaW5pbXVtIGdyYW51bGFyaXR5LgorICovCisKKyNkZWZpbmUgTUdBX0NBUkRfSEVBUAkJCTAKKyNkZWZpbmUgTUdBX0FHUF9IRUFQCQkJMQorI2RlZmluZSBNR0FfTlJfVEVYX0hFQVBTCQkyCisjZGVmaW5lIE1HQV9OUl9URVhfUkVHSU9OUwkJMTYKKyNkZWZpbmUgTUdBX0xPR19NSU5fVEVYX1JFR0lPTl9TSVpFCTE2CisKKyNkZWZpbmUgIERSTV9NR0FfSURMRV9SRVRSWSAgICAgICAgICAyMDQ4CisKKyNlbmRpZgkJCQkvKiBfX01HQV9TQVJFQV9ERUZJTkVTX18gKi8KKworLyogU2V0dXAgcmVnaXN0ZXJzIGZvciAzRCBjb250ZXh0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgZHN0b3JnOworCXVuc2lnbmVkIGludCBtYWNjZXNzOworCXVuc2lnbmVkIGludCBwbG53dDsKKwl1bnNpZ25lZCBpbnQgZHdnY3RsOworCXVuc2lnbmVkIGludCBhbHBoYWN0cmw7CisJdW5zaWduZWQgaW50IGZvZ2NvbG9yOworCXVuc2lnbmVkIGludCB3ZmxhZzsKKwl1bnNpZ25lZCBpbnQgdGR1YWxzdGFnZTA7CisJdW5zaWduZWQgaW50IHRkdWFsc3RhZ2UxOworCXVuc2lnbmVkIGludCBmY29sOworCXVuc2lnbmVkIGludCBzdGVuY2lsOworCXVuc2lnbmVkIGludCBzdGVuY2lsY3RsOworfSBkcm1fbWdhX2NvbnRleHRfcmVnc190OworCisvKiBTZXR1cCByZWdpc3RlcnMgZm9yIDJELCBYIHNlcnZlcgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHBpdGNoOworfSBkcm1fbWdhX3NlcnZlcl9yZWdzX3Q7CisKKy8qIFNldHVwIHJlZ2lzdGVycyBmb3IgZWFjaCB0ZXh0dXJlIHVuaXQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCB0ZXhjdGw7CisJdW5zaWduZWQgaW50IHRleGN0bDI7CisJdW5zaWduZWQgaW50IHRleGZpbHRlcjsKKwl1bnNpZ25lZCBpbnQgdGV4Ym9yZGVyY29sOworCXVuc2lnbmVkIGludCB0ZXhvcmc7CisJdW5zaWduZWQgaW50IHRleHdpZHRoOworCXVuc2lnbmVkIGludCB0ZXhoZWlnaHQ7CisJdW5zaWduZWQgaW50IHRleG9yZzE7CisJdW5zaWduZWQgaW50IHRleG9yZzI7CisJdW5zaWduZWQgaW50IHRleG9yZzM7CisJdW5zaWduZWQgaW50IHRleG9yZzQ7Cit9IGRybV9tZ2FfdGV4dHVyZV9yZWdzX3Q7CisKKy8qIEdlbmVyYWwgYWdpbmcgbWVjaGFuaXNtCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgaGVhZDsJLyogUG9zaXRpb24gb2YgaGVhZCBwb2ludGVyICAgICAgICAgICovCisJdW5zaWduZWQgaW50IHdyYXA7CS8qIFByaW1hcnkgRE1BIHdyYXAgY291bnQgICAgICAgICAgICAqLworfSBkcm1fbWdhX2FnZV90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX21nYV9zYXJlYSB7CisJLyogVGhlIGNoYW5uZWwgZm9yIGNvbW11bmljYXRpb24gb2Ygc3RhdGUgaW5mb3JtYXRpb24gdG8gdGhlIGtlcm5lbAorCSAqIG9uIGZpcmluZyBhIHZlcnRleCBkbWEgYnVmZmVyLgorCSAqLworCWRybV9tZ2FfY29udGV4dF9yZWdzX3QgY29udGV4dF9zdGF0ZTsKKwlkcm1fbWdhX3NlcnZlcl9yZWdzX3Qgc2VydmVyX3N0YXRlOworCWRybV9tZ2FfdGV4dHVyZV9yZWdzX3QgdGV4X3N0YXRlWzJdOworCXVuc2lnbmVkIGludCB3YXJwX3BpcGU7CisJdW5zaWduZWQgaW50IGRpcnR5OworCXVuc2lnbmVkIGludCB2ZXJ0c2l6ZTsKKworCS8qIFRoZSBjdXJyZW50IGNsaXByZWN0cywgb3IgYSBzdWJzZXQgdGhlcmVvZi4KKwkgKi8KKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBib3hlc1tNR0FfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKwl1bnNpZ25lZCBpbnQgbmJveDsKKworCS8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSBtb3N0IHJlY2VudGx5IHVzZWQgM2QgZHJhd2FibGUuICBUaGUKKwkgKiBjbGllbnQgZmlsbHMgaW4gdGhlIHJlcV8qIGZpZWxkcywgdGhlIHNlcnZlciBmaWxscyBpbiB0aGUKKwkgKiBleHBvcnRlZF8gZmllbGRzIGFuZCBwdXRzIHRoZSBjbGlwcmVjdHMgaW50byBib3hlcywgYWJvdmUuCisJICoKKwkgKiBUaGUgY2xpZW50IGNsZWFycyB0aGUgZXhwb3J0ZWRfZHJhd2FibGUgZmllbGQgYmVmb3JlCisJICogY2xvYmJlcmluZyB0aGUgYm94ZXMgZGF0YS4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgcmVxX2RyYXdhYmxlOwkvKiB0aGUgWCBkcmF3YWJsZSBpZCAqLworCXVuc2lnbmVkIGludCByZXFfZHJhd19idWZmZXI7CS8qIE1HQV9GUk9OVCBvciBNR0FfQkFDSyAqLworCisJdW5zaWduZWQgaW50IGV4cG9ydGVkX2RyYXdhYmxlOworCXVuc2lnbmVkIGludCBleHBvcnRlZF9pbmRleDsKKwl1bnNpZ25lZCBpbnQgZXhwb3J0ZWRfc3RhbXA7CisJdW5zaWduZWQgaW50IGV4cG9ydGVkX2J1ZmZlcnM7CisJdW5zaWduZWQgaW50IGV4cG9ydGVkX25mcm9udDsKKwl1bnNpZ25lZCBpbnQgZXhwb3J0ZWRfbmJhY2s7CisJaW50IGV4cG9ydGVkX2JhY2tfeCwgZXhwb3J0ZWRfZnJvbnRfeCwgZXhwb3J0ZWRfdzsKKwlpbnQgZXhwb3J0ZWRfYmFja195LCBleHBvcnRlZF9mcm9udF95LCBleHBvcnRlZF9oOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGV4cG9ydGVkX2JveGVzW01HQV9OUl9TQVJFQV9DTElQUkVDVFNdOworCisJLyogQ291bnRlcnMgZm9yIGFnaW5nIHRleHR1cmVzIGFuZCBmb3IgY2xpZW50LXNpZGUgdGhyb3R0bGluZy4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgc3RhdHVzWzRdOworCXVuc2lnbmVkIGludCBsYXN0X3dyYXA7CisKKwlkcm1fbWdhX2FnZV90IGxhc3RfZnJhbWU7CisJdW5zaWduZWQgaW50IGxhc3RfZW5xdWV1ZTsJLyogbGFzdCB0aW1lIGEgYnVmZmVyIHdhcyBlbnF1ZXVlZCAqLworCXVuc2lnbmVkIGludCBsYXN0X2Rpc3BhdGNoOwkvKiBhZ2Ugb2YgdGhlIG1vc3QgcmVjZW50bHkgZGlzcGF0Y2hlZCBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgbGFzdF9xdWllc2NlbnQ7CS8qICAqLworCisJLyogTFJVIGxpc3RzIGZvciB0ZXh0dXJlIG1lbW9yeSBpbiBhZ3Agc3BhY2UgYW5kIG9uIHRoZSBjYXJkLgorCSAqLworCXN0cnVjdCBkcm1fdGV4X3JlZ2lvbiB0ZXhMaXN0W01HQV9OUl9URVhfSEVBUFNdW01HQV9OUl9URVhfUkVHSU9OUyArIDFdOworCXVuc2lnbmVkIGludCB0ZXhBZ2VbTUdBX05SX1RFWF9IRUFQU107CisKKwkvKiBNZWNoYW5pc20gdG8gdmFsaWRhdGUgY2FyZCBzdGF0ZS4KKwkgKi8KKwlpbnQgY3R4T3duZXI7Cit9IGRybV9tZ2Ffc2FyZWFfdDsKKworLyogTUdBIHNwZWNpZmljIGlvY3RscworICogVGhlIGRldmljZSBzcGVjaWZpYyBpb2N0bCByYW5nZSBpcyAweDQwIHRvIDB4NzkuCisgKi8KKyNkZWZpbmUgRFJNX01HQV9JTklUICAgICAweDAwCisjZGVmaW5lIERSTV9NR0FfRkxVU0ggICAgMHgwMQorI2RlZmluZSBEUk1fTUdBX1JFU0VUICAgIDB4MDIKKyNkZWZpbmUgRFJNX01HQV9TV0FQICAgICAweDAzCisjZGVmaW5lIERSTV9NR0FfQ0xFQVIgICAgMHgwNAorI2RlZmluZSBEUk1fTUdBX1ZFUlRFWCAgIDB4MDUKKyNkZWZpbmUgRFJNX01HQV9JTkRJQ0VTICAweDA2CisjZGVmaW5lIERSTV9NR0FfSUxPQUQgICAgMHgwNworI2RlZmluZSBEUk1fTUdBX0JMSVQgICAgIDB4MDgKKyNkZWZpbmUgRFJNX01HQV9HRVRQQVJBTSAweDA5CisKKy8qIDMuMjoKKyAqIGlvY3RscyBmb3Igb3BlcmF0aW5nIG9uIGZlbmNlcy4KKyAqLworI2RlZmluZSBEUk1fTUdBX1NFVF9GRU5DRSAgICAgIDB4MGEKKyNkZWZpbmUgRFJNX01HQV9XQUlUX0ZFTkNFICAgICAweDBiCisjZGVmaW5lIERSTV9NR0FfRE1BX0JPT1RTVFJBUCAgMHgwYworCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfSU5JVCAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfSU5JVCwgZHJtX21nYV9pbml0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfRkxVU0ggICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfRkxVU0gsIHN0cnVjdCBkcm1fbG9jaykKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9SRVNFVCAgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9SRVNFVCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9TV0FQICAgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9TV0FQKQorI2RlZmluZSBEUk1fSU9DVExfTUdBX0NMRUFSICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX0NMRUFSLCBkcm1fbWdhX2NsZWFyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfVkVSVEVYICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfVkVSVEVYLCBkcm1fbWdhX3ZlcnRleF90KQorI2RlZmluZSBEUk1fSU9DVExfTUdBX0lORElDRVMgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX0lORElDRVMsIGRybV9tZ2FfaW5kaWNlc190KQorI2RlZmluZSBEUk1fSU9DVExfTUdBX0lMT0FEICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX0lMT0FELCBkcm1fbWdhX2lsb2FkX3QpCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfQkxJVCAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfQkxJVCwgZHJtX21nYV9ibGl0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfR0VUUEFSQU0gRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NR0FfR0VUUEFSQU0sIGRybV9tZ2FfZ2V0cGFyYW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9TRVRfRkVOQ0UgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX1NFVF9GRU5DRSwgX191MzIpCisjZGVmaW5lIERSTV9JT0NUTF9NR0FfV0FJVF9GRU5DRSAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX01HQV9XQUlUX0ZFTkNFLCBfX3UzMikKKyNkZWZpbmUgRFJNX0lPQ1RMX01HQV9ETUFfQk9PVFNUUkFQIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTUdBX0RNQV9CT09UU1RSQVAsIGRybV9tZ2FfZG1hX2Jvb3RzdHJhcF90KQorCit0eXBlZGVmIHN0cnVjdCBfZHJtX21nYV93YXJwX2luZGV4IHsKKwlpbnQgaW5zdGFsbGVkOworCXVuc2lnbmVkIGxvbmcgcGh5c19hZGRyOworCWludCBzaXplOworfSBkcm1fbWdhX3dhcnBfaW5kZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV9pbml0IHsKKwllbnVtIHsKKwkJTUdBX0lOSVRfRE1BID0gMHgwMSwKKwkJTUdBX0NMRUFOVVBfRE1BID0gMHgwMgorCX0gZnVuYzsKKworCXVuc2lnbmVkIGxvbmcgc2FyZWFfcHJpdl9vZmZzZXQ7CisKKwlpbnQgY2hpcHNldDsKKwlpbnQgc2dyYW07CisKKwl1bnNpZ25lZCBpbnQgbWFjY2VzczsKKworCXVuc2lnbmVkIGludCBmYl9jcHA7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldCwgZnJvbnRfcGl0Y2g7CisJdW5zaWduZWQgaW50IGJhY2tfb2Zmc2V0LCBiYWNrX3BpdGNoOworCisJdW5zaWduZWQgaW50IGRlcHRoX2NwcDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfb2Zmc2V0LCBkZXB0aF9waXRjaDsKKworCXVuc2lnbmVkIGludCB0ZXh0dXJlX29mZnNldFtNR0FfTlJfVEVYX0hFQVBTXTsKKwl1bnNpZ25lZCBpbnQgdGV4dHVyZV9zaXplW01HQV9OUl9URVhfSEVBUFNdOworCisJdW5zaWduZWQgbG9uZyBmYl9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBtbWlvX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHN0YXR1c19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyB3YXJwX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHByaW1hcnlfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgYnVmZmVyc19vZmZzZXQ7Cit9IGRybV9tZ2FfaW5pdF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX2RtYV9ib290c3RyYXAgeworCS8qKgorCSAqIFxuYW1lIEFHUCB0ZXh0dXJlIHJlZ2lvbgorCSAqCisJICogT24gcmV0dXJuIGZyb20gdGhlIERSTV9NR0FfRE1BX0JPT1RTVFJBUCBpb2N0bCwgdGhlc2UgZmllbGRzIHdpbGwKKwkgKiBiZSBmaWxsZWQgaW4gd2l0aCB0aGUgYWN0dWFsIEFHUCB0ZXh0dXJlIHNldHRpbmdzLgorCSAqCisJICogXHdhcm5pbmcKKwkgKiBJZiB0aGVzZSBmaWVsZHMgYXJlIG5vbi16ZXJvLCBidXQgZG1hX21nYV9kbWFfYm9vdHN0cmFwOjphZ3BfbW9kZQorCSAqIGlzIHplcm8sIGl0IG1lYW5zIHRoYXQgUENJIG1lbW9yeSAobW9zdCBsaWtlbHkgdGhyb3VnaCB0aGUgdXNlIG9mCisJICogYW4gSU9NTVUpIGlzIGJlaW5nIHVzZWQgZm9yICJBR1AiIHRleHR1cmVzLgorCSAqLworCS8qQHsgKi8KKwl1bnNpZ25lZCBsb25nIHRleHR1cmVfaGFuZGxlOyAvKio8IEhhbmRsZSB1c2VkIHRvIG1hcCBBR1AgdGV4dHVyZXMuICovCisJX191MzIgdGV4dHVyZV9zaXplOwkgICAgICAvKio8IFNpemUgb2YgdGhlIEFHUCB0ZXh0dXJlIHJlZ2lvbi4gKi8KKwkvKkB9ICovCisKKwkvKioKKwkgKiBSZXF1ZXN0ZWQgc2l6ZSBvZiB0aGUgcHJpbWFyeSBETUEgcmVnaW9uLgorCSAqCisJICogT24gcmV0dXJuIGZyb20gdGhlIERSTV9NR0FfRE1BX0JPT1RTVFJBUCBpb2N0bCwgdGhpcyBmaWVsZCB3aWxsIGJlCisJICogZmlsbGVkIGluIHdpdGggdGhlIGFjdHVhbCBBR1AgbW9kZS4gIElmIEFHUCB3YXMgbm90IGF2YWlsYWJsZQorCSAqLworCV9fdTMyIHByaW1hcnlfc2l6ZTsKKworCS8qKgorCSAqIFJlcXVlc3RlZCBudW1iZXIgb2Ygc2Vjb25kYXJ5IERNQSBidWZmZXJzLgorCSAqCisJICogT24gcmV0dXJuIGZyb20gdGhlIERSTV9NR0FfRE1BX0JPT1RTVFJBUCBpb2N0bCwgdGhpcyBmaWVsZCB3aWxsIGJlCisJICogZmlsbGVkIGluIHdpdGggdGhlIGFjdHVhbCBudW1iZXIgb2Ygc2Vjb25kYXJ5IERNQSBidWZmZXJzCisJICogYWxsb2NhdGVkLiAgUGFydGljdWxhcmx5IHdoZW4gUENJIERNQSBpcyB1c2VkLCB0aGlzIG1heSBiZQorCSAqIChzdWJ0YW50aWFsbHkpIGxlc3MgdGhhbiB0aGUgbnVtYmVyIHJlcXVlc3RlZC4KKwkgKi8KKwlfX3UzMiBzZWNvbmRhcnlfYmluX2NvdW50OworCisJLyoqCisJICogUmVxdWVzdGVkIHNpemUgb2YgZWFjaCBzZWNvbmRhcnkgRE1BIGJ1ZmZlci4KKwkgKgorCSAqIFdoaWxlIHRoZSBrZXJuZWwgXGIgaXMgZnJlZSB0byByZWR1Y2UKKwkgKiBkbWFfbWdhX2RtYV9ib290c3RyYXA6OnNlY29uZGFyeV9iaW5fY291bnQsIGl0IGlzIFxiIG5vdCBhbGxvd2VkCisJICogdG8gcmVkdWNlIGRtYV9tZ2FfZG1hX2Jvb3RzdHJhcDo6c2Vjb25kYXJ5X2Jpbl9zaXplLgorCSAqLworCV9fdTMyIHNlY29uZGFyeV9iaW5fc2l6ZTsKKworCS8qKgorCSAqIEJpdC13aXNlIG1hc2sgb2YgQUdQU1RBVDJfKiB2YWx1ZXMuICBDdXJyZW50bHkgb25seSBcYyBBR1BTVEFUMl8xWCwKKwkgKiBcYyBBR1BTVEFUMl8yWCwgYW5kIFxjIEFHUFNUQVQyXzRYIGFyZSBzdXBwb3J0ZWQuICBJZiB0aGlzIHZhbHVlIGlzCisJICogemVybywgaXQgbWVhbnMgdGhhdCBQQ0kgRE1BIHNob3VsZCBiZSB1c2VkLCBldmVuIGlmIEFHUCBpcworCSAqIHBvc3NpYmxlLgorCSAqCisJICogT24gcmV0dXJuIGZyb20gdGhlIERSTV9NR0FfRE1BX0JPT1RTVFJBUCBpb2N0bCwgdGhpcyBmaWVsZCB3aWxsIGJlCisJICogZmlsbGVkIGluIHdpdGggdGhlIGFjdHVhbCBBR1AgbW9kZS4gIElmIEFHUCB3YXMgbm90IGF2YWlsYWJsZQorCSAqIChpLmUuLCBQQ0kgRE1BIHdhcyB1c2VkKSwgdGhpcyB2YWx1ZSB3aWxsIGJlIHplcm8uCisJICovCisJX191MzIgYWdwX21vZGU7CisKKwkvKioKKwkgKiBEZXNpcmVkIEFHUCBHQVJUIHNpemUsIG1lYXN1cmVkIGluIG1lZ2FieXRlcy4KKwkgKi8KKwlfX3U4IGFncF9zaXplOworfSBkcm1fbWdhX2RtYV9ib290c3RyYXBfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV9jbGVhciB7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBjbGVhcl9jb2xvcjsKKwl1bnNpZ25lZCBpbnQgY2xlYXJfZGVwdGg7CisJdW5zaWduZWQgaW50IGNvbG9yX21hc2s7CisJdW5zaWduZWQgaW50IGRlcHRoX21hc2s7Cit9IGRybV9tZ2FfY2xlYXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV92ZXJ0ZXggeworCWludCBpZHg7CQkvKiBidWZmZXIgdG8gcXVldWUgKi8KKwlpbnQgdXNlZDsJCS8qIGJ5dGVzIGluIHVzZSAqLworCWludCBkaXNjYXJkOwkJLyogY2xpZW50IGZpbmlzaGVkIHdpdGggYnVmZmVyPyAgKi8KK30gZHJtX21nYV92ZXJ0ZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV9pbmRpY2VzIHsKKwlpbnQgaWR4OwkJLyogYnVmZmVyIHRvIHF1ZXVlICovCisJdW5zaWduZWQgaW50IHN0YXJ0OworCXVuc2lnbmVkIGludCBlbmQ7CisJaW50IGRpc2NhcmQ7CQkvKiBjbGllbnQgZmluaXNoZWQgd2l0aCBidWZmZXI/ICAqLworfSBkcm1fbWdhX2luZGljZXNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV9pbG9hZCB7CisJaW50IGlkeDsKKwl1bnNpZ25lZCBpbnQgZHN0b3JnOworCXVuc2lnbmVkIGludCBsZW5ndGg7Cit9IGRybV9tZ2FfaWxvYWRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9tZ2FfYmxpdCB7CisJdW5zaWduZWQgaW50IHBsYW5lbWFzazsKKwl1bnNpZ25lZCBpbnQgc3Jjb3JnOworCXVuc2lnbmVkIGludCBkc3Rvcmc7CisJaW50IHNyY19waXRjaCwgZHN0X3BpdGNoOworCWludCBkZWx0YV9zeCwgZGVsdGFfc3k7CisJaW50IGRlbHRhX2R4LCBkZWx0YV9keTsKKwlpbnQgaGVpZ2h0LCB5ZGlyOwkvKiBmbGlwIGltYWdlIHZlcnRpY2FsbHkgKi8KKwlpbnQgc291cmNlX3BpdGNoLCBkZXN0X3BpdGNoOworfSBkcm1fbWdhX2JsaXRfdDsKKworLyogMy4xOiBBbiBpb2N0bCB0byBnZXQgcGFyYW1ldGVycyB0aGF0IGFyZW4ndCBhdmFpbGFibGUgdG8gdGhlIDNkCisgKiBjbGllbnQgYW55IG90aGVyIHdheS4KKyAqLworI2RlZmluZSBNR0FfUEFSQU1fSVJRX05SICAgICAgICAgICAgMQorCisvKiAzLjI6IFF1ZXJ5IHRoZSBhY3R1YWwgY2FyZCB0eXBlLiAgVGhlIEREWCBvbmx5IGRpc3Rpbmd1aXNoZXMgYmV0d2VlbgorICogRzIwMCBjaGlwcyBhbmQgbm9uLUcyMDAgY2hpcHMsIHdoaWNoIGl0IGNhbGxzIEc0MDAuICBJdCB0dXJucyBvdXQgdGhhdAorICogdGhlcmUgYXJlIHNvbWUgdmVyeSBzdWJsdGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgRzR4MCBjaGlwcyBhbmQgdGhlIEc1NTAKKyAqIGNoaXBzLiAgVXNpbmcgdGhpcyBwYXJhbWV0ZXIgcXVlcnksIGEgY2xpZW50LXNpZGUgZHJpdmVyIGNhbiBkZXRlY3QgdGhlCisgKiBkaWZmZXJlbmNlIGJldHdlZW4gYSBHNHgwIGFuZCBhIEc1NTAuCisgKi8KKyNkZWZpbmUgTUdBX1BBUkFNX0NBUkRfVFlQRSAgICAgICAgIDIKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21nYV9nZXRwYXJhbSB7CisJaW50IHBhcmFtOworCXZvaWQgKnZhbHVlOworfSBkcm1fbWdhX2dldHBhcmFtX3Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vbm91dmVhdV9kcm0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL25vdXZlYXVfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVkZDNhNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL25vdXZlYXVfZHJtLmgKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNSBTdGVwaGFuZSBNYXJjaGVzaW4uCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19OT1VWRUFVX0RSTV9IX18KKyNkZWZpbmUgX19OT1VWRUFVX0RSTV9IX18KKworI2RlZmluZSBOT1VWRUFVX0RSTV9IRUFERVJfUEFUQ0hMRVZFTCAxNgorCitzdHJ1Y3QgZHJtX25vdXZlYXVfY2hhbm5lbF9hbGxvYyB7CisJdWludDMyX3QgICAgIGZiX2N0eGRtYV9oYW5kbGU7CisJdWludDMyX3QgICAgIHR0X2N0eGRtYV9oYW5kbGU7CisKKwlpbnQgICAgICAgICAgY2hhbm5lbDsKKwl1aW50MzJfdCAgICAgcHVzaGJ1Zl9kb21haW5zOworCisJLyogTm90aWZpZXIgbWVtb3J5ICovCisJdWludDMyX3QgICAgIG5vdGlmaWVyX2hhbmRsZTsKKworCS8qIERSTS1lbmZvcmNlZCBzdWJjaGFubmVsIGFzc2lnbm1lbnRzICovCisJc3RydWN0IHsKKwkJdWludDMyX3QgaGFuZGxlOworCQl1aW50MzJfdCBncmNsYXNzOworCX0gc3ViY2hhbls4XTsKKwl1aW50MzJfdCBucl9zdWJjaGFuOworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2NoYW5uZWxfZnJlZSB7CisJaW50IGNoYW5uZWw7Cit9OworCitzdHJ1Y3QgZHJtX25vdXZlYXVfZ3JvYmpfYWxsb2MgeworCWludCAgICAgIGNoYW5uZWw7CisJdWludDMyX3QgaGFuZGxlOworCWludCAgICAgIGNsYXNzOworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X25vdGlmaWVyb2JqX2FsbG9jIHsKKwl1aW50MzJfdCBjaGFubmVsOworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCBzaXplOworCXVpbnQzMl90IG9mZnNldDsKK307CisKK3N0cnVjdCBkcm1fbm91dmVhdV9ncHVvYmpfZnJlZSB7CisJaW50ICAgICAgY2hhbm5lbDsKKwl1aW50MzJfdCBoYW5kbGU7Cit9OworCisvKiBGSVhNRSA6IG1heWJlIHVuaWZ5IHtHRVQsU0VUfVBBUkFNcyAqLworI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX1BDSV9WRU5ET1IgICAgICAzCisjZGVmaW5lIE5PVVZFQVVfR0VUUEFSQU1fUENJX0RFVklDRSAgICAgIDQKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9CVVNfVFlQRSAgICAgICAgNQorI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX0ZCX1NJWkUgICAgICAgICA4CisjZGVmaW5lIE5PVVZFQVVfR0VUUEFSQU1fQUdQX1NJWkUgICAgICAgIDkKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9DSElQU0VUX0lEICAgICAgMTEKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9WTV9WUkFNX0JBU0UgICAgMTIKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9HUkFQSF9VTklUUyAgICAgMTMKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9QVElNRVJfVElNRSAgICAgMTQKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9IQVNfQk9fVVNBR0UgICAgMTUKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9IQVNfUEFHRUZMSVAgICAgMTYKK3N0cnVjdCBkcm1fbm91dmVhdV9nZXRwYXJhbSB7CisJdWludDY0X3QgcGFyYW07CisJdWludDY0X3QgdmFsdWU7Cit9OworCitzdHJ1Y3QgZHJtX25vdXZlYXVfc2V0cGFyYW0geworCXVpbnQ2NF90IHBhcmFtOworCXVpbnQ2NF90IHZhbHVlOworfTsKKworI2RlZmluZSBOT1VWRUFVX0dFTV9ET01BSU5fQ1BVICAgICAgICgxIDw8IDApCisjZGVmaW5lIE5PVVZFQVVfR0VNX0RPTUFJTl9WUkFNICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQgICAgICAoMSA8PCAyKQorI2RlZmluZSBOT1VWRUFVX0dFTV9ET01BSU5fTUFQUEFCTEUgICgxIDw8IDMpCisKKyNkZWZpbmUgTk9VVkVBVV9HRU1fVElMRV9DT01QICAgICAgICAweDAwMDMwMDAwIC8qIG52NTAtb25seSAqLworI2RlZmluZSBOT1VWRUFVX0dFTV9USUxFX0xBWU9VVF9NQVNLIDB4MDAwMGZmMDAKKyNkZWZpbmUgTk9VVkVBVV9HRU1fVElMRV8xNkJQUCAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIE5PVVZFQVVfR0VNX1RJTEVfMzJCUFAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBOT1VWRUFVX0dFTV9USUxFX1pFVEEgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgTk9VVkVBVV9HRU1fVElMRV9OT05DT05USUcgICAweDAwMDAwMDA4CisKK3N0cnVjdCBkcm1fbm91dmVhdV9nZW1faW5mbyB7CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IGRvbWFpbjsKKwl1aW50NjRfdCBzaXplOworCXVpbnQ2NF90IG9mZnNldDsKKwl1aW50NjRfdCBtYXBfaGFuZGxlOworCXVpbnQzMl90IHRpbGVfbW9kZTsKKwl1aW50MzJfdCB0aWxlX2ZsYWdzOworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9uZXcgeworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1faW5mbyBpbmZvOworCXVpbnQzMl90IGNoYW5uZWxfaGludDsKKwl1aW50MzJfdCBhbGlnbjsKK307CisKKyNkZWZpbmUgTk9VVkVBVV9HRU1fTUFYX0JVRkZFUlMgMTAyNAorc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvX3ByZXN1bWVkIHsKKwl1aW50MzJfdCB2YWxpZDsKKwl1aW50MzJfdCBkb21haW47CisJdWludDY0X3Qgb2Zmc2V0OworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvIHsKKwl1aW50NjRfdCB1c2VyX3ByaXY7CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IHJlYWRfZG9tYWluczsKKwl1aW50MzJfdCB3cml0ZV9kb21haW5zOworCXVpbnQzMl90IHZhbGlkX2RvbWFpbnM7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvX3ByZXN1bWVkIHByZXN1bWVkOworfTsKKworI2RlZmluZSBOT1VWRUFVX0dFTV9SRUxPQ19MT1cgICgxIDw8IDApCisjZGVmaW5lIE5PVVZFQVVfR0VNX1JFTE9DX0hJR0ggKDEgPDwgMSkKKyNkZWZpbmUgTk9VVkVBVV9HRU1fUkVMT0NfT1IgICAoMSA8PCAyKQorI2RlZmluZSBOT1VWRUFVX0dFTV9NQVhfUkVMT0NTIDEwMjQKK3N0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9yZWxvYyB7CisJdWludDMyX3QgcmVsb2NfYm9faW5kZXg7CisJdWludDMyX3QgcmVsb2NfYm9fb2Zmc2V0OworCXVpbnQzMl90IGJvX2luZGV4OworCXVpbnQzMl90IGZsYWdzOworCXVpbnQzMl90IGRhdGE7CisJdWludDMyX3Qgdm9yOworCXVpbnQzMl90IHRvcjsKK307CisKKyNkZWZpbmUgTk9VVkVBVV9HRU1fTUFYX1BVU0ggNTEyCitzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfcHVzaCB7CisJdWludDMyX3QgYm9faW5kZXg7CisJdWludDMyX3QgcGFkOworCXVpbnQ2NF90IG9mZnNldDsKKwl1aW50NjRfdCBsZW5ndGg7Cit9OworCitzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWYgeworCXVpbnQzMl90IGNoYW5uZWw7CisJdWludDMyX3QgbnJfYnVmZmVyczsKKwl1aW50NjRfdCBidWZmZXJzOworCXVpbnQzMl90IG5yX3JlbG9jczsKKwl1aW50MzJfdCBucl9wdXNoOworCXVpbnQ2NF90IHJlbG9jczsKKwl1aW50NjRfdCBwdXNoOworCXVpbnQzMl90IHN1ZmZpeDA7CisJdWludDMyX3Qgc3VmZml4MTsKKwl1aW50NjRfdCB2cmFtX2F2YWlsYWJsZTsKKwl1aW50NjRfdCBnYXJ0X2F2YWlsYWJsZTsKK307CisKKyNkZWZpbmUgTk9VVkVBVV9HRU1fQ1BVX1BSRVBfTk9XQUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTk9VVkVBVV9HRU1fQ1BVX1BSRVBfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKK3N0cnVjdCBkcm1fbm91dmVhdV9nZW1fY3B1X3ByZXAgeworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCBmbGFnczsKK307CisKK3N0cnVjdCBkcm1fbm91dmVhdV9nZW1fY3B1X2ZpbmkgeworCXVpbnQzMl90IGhhbmRsZTsKK307CisKK2VudW0gbm91dmVhdV9idXNfdHlwZSB7CisJTlZfQUdQICAgICA9IDAsCisJTlZfUENJICAgICA9IDEsCisJTlZfUENJRSAgICA9IDIsCit9OworCitzdHJ1Y3QgZHJtX25vdXZlYXVfc2FyZWEgeworfTsKKworI2RlZmluZSBEUk1fTk9VVkVBVV9HRVRQQVJBTSAgICAgICAgICAgMHgwMAorI2RlZmluZSBEUk1fTk9VVkVBVV9TRVRQQVJBTSAgICAgICAgICAgMHgwMQorI2RlZmluZSBEUk1fTk9VVkVBVV9DSEFOTkVMX0FMTE9DICAgICAgMHgwMgorI2RlZmluZSBEUk1fTk9VVkVBVV9DSEFOTkVMX0ZSRUUgICAgICAgMHgwMworI2RlZmluZSBEUk1fTk9VVkVBVV9HUk9CSl9BTExPQyAgICAgICAgMHgwNAorI2RlZmluZSBEUk1fTk9VVkVBVV9OT1RJRklFUk9CSl9BTExPQyAgMHgwNQorI2RlZmluZSBEUk1fTk9VVkVBVV9HUFVPQkpfRlJFRSAgICAgICAgMHgwNgorI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fTkVXICAgICAgICAgICAgMHg0MAorI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fUFVTSEJVRiAgICAgICAgMHg0MQorI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fQ1BVX1BSRVAgICAgICAgMHg0MgorI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fQ1BVX0ZJTkkgICAgICAgMHg0MworI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fSU5GTyAgICAgICAgICAgMHg0NAorCisjZGVmaW5lIERSTV9JT0NUTF9OT1VWRUFVX0dFVFBBUkFNICAgICAgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX05PVVZFQVVfR0VUUEFSQU0sIHN0cnVjdCBkcm1fbm91dmVhdV9nZXRwYXJhbSkKKyNkZWZpbmUgRFJNX0lPQ1RMX05PVVZFQVVfU0VUUEFSQU0gICAgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTk9VVkVBVV9TRVRQQVJBTSwgc3RydWN0IGRybV9ub3V2ZWF1X3NldHBhcmFtKQorI2RlZmluZSBEUk1fSU9DVExfTk9VVkVBVV9DSEFOTkVMX0FMTE9DICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9OT1VWRUFVX0NIQU5ORUxfQUxMT0MsIHN0cnVjdCBkcm1fbm91dmVhdV9jaGFubmVsX2FsbG9jKQorI2RlZmluZSBEUk1fSU9DVExfTk9VVkVBVV9DSEFOTkVMX0ZSRUUgICAgICAgRFJNX0lPVyAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9OT1VWRUFVX0NIQU5ORUxfRlJFRSwgc3RydWN0IGRybV9ub3V2ZWF1X2NoYW5uZWxfZnJlZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX05PVVZFQVVfR1JPQkpfQUxMT0MgICAgICAgIERSTV9JT1cgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTk9VVkVBVV9HUk9CSl9BTExPQywgc3RydWN0IGRybV9ub3V2ZWF1X2dyb2JqX2FsbG9jKQorI2RlZmluZSBEUk1fSU9DVExfTk9VVkVBVV9OT1RJRklFUk9CSl9BTExPQyAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9OT1VWRUFVX05PVElGSUVST0JKX0FMTE9DLCBzdHJ1Y3QgZHJtX25vdXZlYXVfbm90aWZpZXJvYmpfYWxsb2MpCisjZGVmaW5lIERSTV9JT0NUTF9OT1VWRUFVX0dQVU9CSl9GUkVFICAgICAgICBEUk1fSU9XIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX05PVVZFQVVfR1BVT0JKX0ZSRUUsIHN0cnVjdCBkcm1fbm91dmVhdV9ncHVvYmpfZnJlZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX05PVVZFQVVfR0VNX05FVyAgICAgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTk9VVkVBVV9HRU1fTkVXLCBzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX25ldykKKyNkZWZpbmUgRFJNX0lPQ1RMX05PVVZFQVVfR0VNX1BVU0hCVUYgICAgICAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTk9VVkVBVV9HRU1fUFVTSEJVRiwgc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmKQorI2RlZmluZSBEUk1fSU9DVExfTk9VVkVBVV9HRU1fQ1BVX1BSRVAgICAgICAgRFJNX0lPVyAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9OT1VWRUFVX0dFTV9DUFVfUFJFUCwgc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9jcHVfcHJlcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX05PVVZFQVVfR0VNX0NQVV9GSU5JICAgICAgIERSTV9JT1cgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fTk9VVkVBVV9HRU1fQ1BVX0ZJTkksIHN0cnVjdCBkcm1fbm91dmVhdV9nZW1fY3B1X2ZpbmkpCisjZGVmaW5lIERSTV9JT0NUTF9OT1VWRUFVX0dFTV9JTkZPICAgICAgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX05PVVZFQVVfR0VNX0lORk8sIHN0cnVjdCBkcm1fbm91dmVhdV9nZW1faW5mbykKKworI2VuZGlmIC8qIF9fTk9VVkVBVV9EUk1fSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2RybS9yMTI4X2RybS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vcjEyOF9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGU3OGZmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vcjEyOF9kcm0uaApAQCAtMCwwICsxLDMyNiBAQAorLyogcjEyOF9kcm0uaCAtLSBQdWJsaWMgaGVhZGVyIGZvciB0aGUgcjEyOCBkcml2ZXIgLSotIGxpbnV4LWMgLSotCisgKiBDcmVhdGVkOiBXZWQgQXByICA1IDE5OjI0OjE5IDIwMDAgYnkga2V2aW5AcHJlY2lzaW9uaW5zaWdodC5jb20KKyAqLworLyoKKyAqIENvcHlyaWdodCAyMDAwIFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CisgKiAgICBLZXZpbiBFLiBNYXJ0aW4gPG1hcnRpbkB2YWxpbnV4LmNvbT4KKyAqLworCisjaWZuZGVmIF9fUjEyOF9EUk1fSF9fCisjZGVmaW5lIF9fUjEyOF9EUk1fSF9fCisKKy8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlIGRlZmluZXMsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlCisgKiBkZWZpbmVzIGluIHRoZSBYIHNlcnZlciBmaWxlIChyMTI4X3NhcmVhLmgpCisgKi8KKyNpZm5kZWYgX19SMTI4X1NBUkVBX0RFRklORVNfXworI2RlZmluZSBfX1IxMjhfU0FSRUFfREVGSU5FU19fCisKKy8qIFdoYXQgbmVlZHMgdG8gYmUgY2hhbmdlZCBmb3IgdGhlIGN1cnJlbnQgdmVydGV4IGJ1ZmZlcj8KKyAqLworI2RlZmluZSBSMTI4X1VQTE9BRF9DT05URVhUCQkweDAwMQorI2RlZmluZSBSMTI4X1VQTE9BRF9TRVRVUAkJMHgwMDIKKyNkZWZpbmUgUjEyOF9VUExPQURfVEVYMAkJMHgwMDQKKyNkZWZpbmUgUjEyOF9VUExPQURfVEVYMQkJMHgwMDgKKyNkZWZpbmUgUjEyOF9VUExPQURfVEVYMElNQUdFUwkJMHgwMTAKKyNkZWZpbmUgUjEyOF9VUExPQURfVEVYMUlNQUdFUwkJMHgwMjAKKyNkZWZpbmUgUjEyOF9VUExPQURfQ09SRQkJMHgwNDAKKyNkZWZpbmUgUjEyOF9VUExPQURfTUFTS1MJCTB4MDgwCisjZGVmaW5lIFIxMjhfVVBMT0FEX1dJTkRPVwkJMHgxMDAKKyNkZWZpbmUgUjEyOF9VUExPQURfQ0xJUFJFQ1RTCQkweDIwMAkvKiBoYW5kbGVkIGNsaWVudC1zaWRlICovCisjZGVmaW5lIFIxMjhfUkVRVUlSRV9RVUlFU0NFTkNFCQkweDQwMAorI2RlZmluZSBSMTI4X1VQTE9BRF9BTEwJCQkweDdmZgorCisjZGVmaW5lIFIxMjhfRlJPTlQJCQkweDEKKyNkZWZpbmUgUjEyOF9CQUNLCQkJMHgyCisjZGVmaW5lIFIxMjhfREVQVEgJCQkweDQKKworLyogUHJpbWl0aXZlIHR5cGVzCisgKi8KKyNkZWZpbmUgUjEyOF9QT0lOVFMJCQkweDEKKyNkZWZpbmUgUjEyOF9MSU5FUwkJCTB4MgorI2RlZmluZSBSMTI4X0xJTkVfU1RSSVAJCQkweDMKKyNkZWZpbmUgUjEyOF9UUklBTkdMRVMJCQkweDQKKyNkZWZpbmUgUjEyOF9UUklBTkdMRV9GQU4JCTB4NQorI2RlZmluZSBSMTI4X1RSSUFOR0xFX1NUUklQCQkweDYKKworLyogVmVydGV4L2luZGlyZWN0IGJ1ZmZlciBzaXplCisgKi8KKyNkZWZpbmUgUjEyOF9CVUZGRVJfU0laRQkJMTYzODQKKworLyogQnl0ZSBvZmZzZXRzIGZvciBpbmRpcmVjdCBidWZmZXIgZGF0YQorICovCisjZGVmaW5lIFIxMjhfSU5ERVhfUFJJTV9PRkZTRVQJCTIwCisjZGVmaW5lIFIxMjhfSE9TVERBVEFfQkxJVF9PRkZTRVQJMzIKKworLyogS2VlcCB0aGVzZSBzbWFsbCBmb3IgdGVzdGluZy4KKyAqLworI2RlZmluZSBSMTI4X05SX1NBUkVBX0NMSVBSRUNUUwkJMTIKKworLyogVGhlcmUgYXJlIDIgaGVhcHMgKGxvY2FsL0FHUCkuICBFYWNoIHJlZ2lvbiB3aXRoaW4gYSBoZWFwIGlzIGEKKyAqICBtaW5pbXVtIG9mIDY0aywgYW5kIHRoZXJlIGFyZSBhdCBtb3N0IDY0IG9mIHRoZW0gcGVyIGhlYXAuCisgKi8KKyNkZWZpbmUgUjEyOF9MT0NBTF9URVhfSEVBUAkJMAorI2RlZmluZSBSMTI4X0FHUF9URVhfSEVBUAkJMQorI2RlZmluZSBSMTI4X05SX1RFWF9IRUFQUwkJMgorI2RlZmluZSBSMTI4X05SX1RFWF9SRUdJT05TCQk2NAorI2RlZmluZSBSMTI4X0xPR19URVhfR1JBTlVMQVJJVFkJMTYKKworI2RlZmluZSBSMTI4X05SX0NPTlRFWFRfUkVHUwkJMTIKKworI2RlZmluZSBSMTI4X01BWF9URVhUVVJFX0xFVkVMUwkJMTEKKyNkZWZpbmUgUjEyOF9NQVhfVEVYVFVSRV9VTklUUwkJMgorCisjZW5kaWYJCQkJLyogX19SMTI4X1NBUkVBX0RFRklORVNfXyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJLyogQ29udGV4dCBzdGF0ZSAtIGNhbiBiZSB3cml0dGVuIGluIG9uZSBsYXJnZSBjaHVuayAqLworCXVuc2lnbmVkIGludCBkc3RfcGl0Y2hfb2Zmc2V0X2M7CisJdW5zaWduZWQgaW50IGRwX2d1aV9tYXN0ZXJfY250bF9jOworCXVuc2lnbmVkIGludCBzY190b3BfbGVmdF9jOworCXVuc2lnbmVkIGludCBzY19ib3R0b21fcmlnaHRfYzsKKwl1bnNpZ25lZCBpbnQgel9vZmZzZXRfYzsKKwl1bnNpZ25lZCBpbnQgel9waXRjaF9jOworCXVuc2lnbmVkIGludCB6X3N0ZW5fY250bF9jOworCXVuc2lnbmVkIGludCB0ZXhfY250bF9jOworCXVuc2lnbmVkIGludCBtaXNjXzNkX3N0YXRlX2NudGxfcmVnOworCXVuc2lnbmVkIGludCB0ZXh0dXJlX2Nscl9jbXBfY2xyX2M7CisJdW5zaWduZWQgaW50IHRleHR1cmVfY2xyX2NtcF9tc2tfYzsKKwl1bnNpZ25lZCBpbnQgZm9nX2NvbG9yX2M7CisKKwkvKiBUZXh0dXJlIHN0YXRlICovCisJdW5zaWduZWQgaW50IHRleF9zaXplX3BpdGNoX2M7CisJdW5zaWduZWQgaW50IGNvbnN0YW50X2NvbG9yX2M7CisKKwkvKiBTZXR1cCBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBwbTRfdmNfZnB1X3NldHVwOworCXVuc2lnbmVkIGludCBzZXR1cF9jbnRsOworCisJLyogTWFzayBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBkcF93cml0ZV9tYXNrOworCXVuc2lnbmVkIGludCBzdGVuX3JlZl9tYXNrX2M7CisJdW5zaWduZWQgaW50IHBsYW5lXzNkX21hc2tfYzsKKworCS8qIFdpbmRvdyBzdGF0ZSAqLworCXVuc2lnbmVkIGludCB3aW5kb3dfeHlfb2Zmc2V0OworCisJLyogQ29yZSBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBzY2FsZV8zZF9jbnRsOworfSBkcm1fcjEyOF9jb250ZXh0X3JlZ3NfdDsKKworLyogU2V0dXAgcmVnaXN0ZXJzIGZvciBlYWNoIHRleHR1cmUgdW5pdAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHRleF9jbnRsOworCXVuc2lnbmVkIGludCB0ZXhfY29tYmluZV9jbnRsOworCXVuc2lnbmVkIGludCB0ZXhfc2l6ZV9waXRjaDsKKwl1bnNpZ25lZCBpbnQgdGV4X29mZnNldFtSMTI4X01BWF9URVhUVVJFX0xFVkVMU107CisJdW5zaWduZWQgaW50IHRleF9ib3JkZXJfY29sb3I7Cit9IGRybV9yMTI4X3RleHR1cmVfcmVnc190OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9zYXJlYSB7CisJLyogVGhlIGNoYW5uZWwgZm9yIGNvbW11bmljYXRpb24gb2Ygc3RhdGUgaW5mb3JtYXRpb24gdG8gdGhlIGtlcm5lbAorCSAqIG9uIGZpcmluZyBhIHZlcnRleCBidWZmZXIuCisJICovCisJZHJtX3IxMjhfY29udGV4dF9yZWdzX3QgY29udGV4dF9zdGF0ZTsKKwlkcm1fcjEyOF90ZXh0dXJlX3JlZ3NfdCB0ZXhfc3RhdGVbUjEyOF9NQVhfVEVYVFVSRV9VTklUU107CisJdW5zaWduZWQgaW50IGRpcnR5OworCXVuc2lnbmVkIGludCB2ZXJ0c2l6ZTsKKwl1bnNpZ25lZCBpbnQgdmNfZm9ybWF0OworCisJLyogVGhlIGN1cnJlbnQgY2xpcHJlY3RzLCBvciBhIHN1YnNldCB0aGVyZW9mLgorCSAqLworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGJveGVzW1IxMjhfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKwl1bnNpZ25lZCBpbnQgbmJveDsKKworCS8qIENvdW50ZXJzIGZvciBjbGllbnQtc2lkZSB0aHJvdHRsaW5nIG9mIHJlbmRlcmluZyBjbGllbnRzLgorCSAqLworCXVuc2lnbmVkIGludCBsYXN0X2ZyYW1lOworCXVuc2lnbmVkIGludCBsYXN0X2Rpc3BhdGNoOworCisJc3RydWN0IGRybV90ZXhfcmVnaW9uIHRleF9saXN0W1IxMjhfTlJfVEVYX0hFQVBTXVtSMTI4X05SX1RFWF9SRUdJT05TICsgMV07CisJdW5zaWduZWQgaW50IHRleF9hZ2VbUjEyOF9OUl9URVhfSEVBUFNdOworCWludCBjdHhfb3duZXI7CisJaW50IHBmQWxsb3dQYWdlRmxpcDsJLyogbnVtYmVyIG9mIDNkIHdpbmRvd3MgKDAsMSwyIG9yIG1vcmUpICovCisJaW50IHBmQ3VycmVudFBhZ2U7CS8qIHdoaWNoIGJ1ZmZlciBpcyBiZWluZyBkaXNwbGF5ZWQ/ICovCit9IGRybV9yMTI4X3NhcmVhX3Q7CisKKy8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlIGRlZmluZXMsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlCisgKiBkZWZpbmVzIGluIHRoZSBYc2VydmVyIGZpbGUgKHhmODZkcm1SMTI4LmgpCisgKi8KKworLyogUmFnZSAxMjggc3BlY2lmaWMgaW9jdGxzCisgKiBUaGUgZGV2aWNlIHNwZWNpZmljIGlvY3RsIHJhbmdlIGlzIDB4NDAgdG8gMHg3OS4KKyAqLworI2RlZmluZSBEUk1fUjEyOF9JTklUICAgICAgIDB4MDAKKyNkZWZpbmUgRFJNX1IxMjhfQ0NFX1NUQVJUICAweDAxCisjZGVmaW5lIERSTV9SMTI4X0NDRV9TVE9QICAgMHgwMgorI2RlZmluZSBEUk1fUjEyOF9DQ0VfUkVTRVQgIDB4MDMKKyNkZWZpbmUgRFJNX1IxMjhfQ0NFX0lETEUgICAweDA0CisvKiAweDA1IG5vdCB1c2VkICovCisjZGVmaW5lIERSTV9SMTI4X1JFU0VUICAgICAgMHgwNgorI2RlZmluZSBEUk1fUjEyOF9TV0FQICAgICAgIDB4MDcKKyNkZWZpbmUgRFJNX1IxMjhfQ0xFQVIgICAgICAweDA4CisjZGVmaW5lIERSTV9SMTI4X1ZFUlRFWCAgICAgMHgwOQorI2RlZmluZSBEUk1fUjEyOF9JTkRJQ0VTICAgIDB4MGEKKyNkZWZpbmUgRFJNX1IxMjhfQkxJVCAgICAgICAweDBiCisjZGVmaW5lIERSTV9SMTI4X0RFUFRIICAgICAgMHgwYworI2RlZmluZSBEUk1fUjEyOF9TVElQUExFICAgIDB4MGQKKy8qIDB4MGUgbm90IHVzZWQgKi8KKyNkZWZpbmUgRFJNX1IxMjhfSU5ESVJFQ1QgICAweDBmCisjZGVmaW5lIERSTV9SMTI4X0ZVTExTQ1JFRU4gMHgxMAorI2RlZmluZSBEUk1fUjEyOF9DTEVBUjIgICAgIDB4MTEKKyNkZWZpbmUgRFJNX1IxMjhfR0VUUEFSQU0gICAweDEyCisjZGVmaW5lIERSTV9SMTI4X0ZMSVAgICAgICAgMHgxMworCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0lOSVQgICAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0lOSVQsIGRybV9yMTI4X2luaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfQ0NFX1NUQVJUICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfQ0NFX1NUQVJUKQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9DQ0VfU1RPUCAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9DQ0VfU1RPUCwgZHJtX3IxMjhfY2NlX3N0b3BfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfQ0NFX1JFU0VUICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfQ0NFX1JFU0VUKQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9DQ0VfSURMRSAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9DQ0VfSURMRSkKKy8qIDB4MDUgbm90IHVzZWQgKi8KKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfUkVTRVQgICAgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfUkVTRVQpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X1NXQVAgICAgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X1NXQVApCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0NMRUFSICAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0NMRUFSLCBkcm1fcjEyOF9jbGVhcl90KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9WRVJURVggICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9WRVJURVgsIGRybV9yMTI4X3ZlcnRleF90KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9JTkRJQ0VTICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9JTkRJQ0VTLCBkcm1fcjEyOF9pbmRpY2VzX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0JMSVQgICAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0JMSVQsIGRybV9yMTI4X2JsaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfREVQVEggICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfREVQVEgsIGRybV9yMTI4X2RlcHRoX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X1NUSVBQTEUgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X1NUSVBQTEUsIGRybV9yMTI4X3N0aXBwbGVfdCkKKy8qIDB4MGUgbm90IHVzZWQgKi8KKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfSU5ESVJFQ1QgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfSU5ESVJFQ1QsIGRybV9yMTI4X2luZGlyZWN0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9SMTI4X0ZVTExTQ1JFRU4gRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0ZVTExTQ1JFRU4sIGRybV9yMTI4X2Z1bGxzY3JlZW5fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfQ0xFQVIyICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1IxMjhfQ0xFQVIyLCBkcm1fcjEyOF9jbGVhcjJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1IxMjhfR0VUUEFSQU0gICBEUk1fSU9XUiggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SMTI4X0dFVFBBUkFNLCBkcm1fcjEyOF9nZXRwYXJhbV90KQorI2RlZmluZSBEUk1fSU9DVExfUjEyOF9GTElQICAgICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUjEyOF9GTElQKQorCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9pbml0IHsKKwllbnVtIHsKKwkJUjEyOF9JTklUX0NDRSA9IDB4MDEsCisJCVIxMjhfQ0xFQU5VUF9DQ0UgPSAweDAyCisJfSBmdW5jOworCXVuc2lnbmVkIGxvbmcgc2FyZWFfcHJpdl9vZmZzZXQ7CisJaW50IGlzX3BjaTsKKwlpbnQgY2NlX21vZGU7CisJaW50IGNjZV9zZWN1cmU7CisJaW50IHJpbmdfc2l6ZTsKKwlpbnQgdXNlY190aW1lb3V0OworCisJdW5zaWduZWQgaW50IGZiX2JwcDsKKwl1bnNpZ25lZCBpbnQgZnJvbnRfb2Zmc2V0LCBmcm9udF9waXRjaDsKKwl1bnNpZ25lZCBpbnQgYmFja19vZmZzZXQsIGJhY2tfcGl0Y2g7CisJdW5zaWduZWQgaW50IGRlcHRoX2JwcDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfb2Zmc2V0LCBkZXB0aF9waXRjaDsKKwl1bnNpZ25lZCBpbnQgc3Bhbl9vZmZzZXQ7CisKKwl1bnNpZ25lZCBsb25nIGZiX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIG1taW9fb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgcmluZ19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyByaW5nX3JwdHJfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgYnVmZmVyc19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBhZ3BfdGV4dHVyZXNfb2Zmc2V0OworfSBkcm1fcjEyOF9pbml0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2NjZV9zdG9wIHsKKwlpbnQgZmx1c2g7CisJaW50IGlkbGU7Cit9IGRybV9yMTI4X2NjZV9zdG9wX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2NsZWFyIHsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IGNsZWFyX2NvbG9yOworCXVuc2lnbmVkIGludCBjbGVhcl9kZXB0aDsKKwl1bnNpZ25lZCBpbnQgY29sb3JfbWFzazsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfbWFzazsKK30gZHJtX3IxMjhfY2xlYXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfdmVydGV4IHsKKwlpbnQgcHJpbTsKKwlpbnQgaWR4OwkJLyogSW5kZXggb2YgdmVydGV4IGJ1ZmZlciAqLworCWludCBjb3VudDsJCS8qIE51bWJlciBvZiB2ZXJ0aWNlcyBpbiBidWZmZXIgKi8KKwlpbnQgZGlzY2FyZDsJCS8qIENsaWVudCBmaW5pc2hlZCB3aXRoIGJ1ZmZlcj8gKi8KK30gZHJtX3IxMjhfdmVydGV4X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2luZGljZXMgeworCWludCBwcmltOworCWludCBpZHg7CisJaW50IHN0YXJ0OworCWludCBlbmQ7CisJaW50IGRpc2NhcmQ7CQkvKiBDbGllbnQgZmluaXNoZWQgd2l0aCBidWZmZXI/ICovCit9IGRybV9yMTI4X2luZGljZXNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfYmxpdCB7CisJaW50IGlkeDsKKwlpbnQgcGl0Y2g7CisJaW50IG9mZnNldDsKKwlpbnQgZm9ybWF0OworCXVuc2lnbmVkIHNob3J0IHgsIHk7CisJdW5zaWduZWQgc2hvcnQgd2lkdGgsIGhlaWdodDsKK30gZHJtX3IxMjhfYmxpdF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9kZXB0aCB7CisJZW51bSB7CisJCVIxMjhfV1JJVEVfU1BBTiA9IDB4MDEsCisJCVIxMjhfV1JJVEVfUElYRUxTID0gMHgwMiwKKwkJUjEyOF9SRUFEX1NQQU4gPSAweDAzLAorCQlSMTI4X1JFQURfUElYRUxTID0gMHgwNAorCX0gZnVuYzsKKwlpbnQgbjsKKwlpbnQgKng7CisJaW50ICp5OworCXVuc2lnbmVkIGludCAqYnVmZmVyOworCXVuc2lnbmVkIGNoYXIgKm1hc2s7Cit9IGRybV9yMTI4X2RlcHRoX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X3N0aXBwbGUgeworCXVuc2lnbmVkIGludCAqbWFzazsKK30gZHJtX3IxMjhfc3RpcHBsZV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9pbmRpcmVjdCB7CisJaW50IGlkeDsKKwlpbnQgc3RhcnQ7CisJaW50IGVuZDsKKwlpbnQgZGlzY2FyZDsKK30gZHJtX3IxMjhfaW5kaXJlY3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfZnVsbHNjcmVlbiB7CisJZW51bSB7CisJCVIxMjhfSU5JVF9GVUxMU0NSRUVOID0gMHgwMSwKKwkJUjEyOF9DTEVBTlVQX0ZVTExTQ1JFRU4gPSAweDAyCisJfSBmdW5jOworfSBkcm1fcjEyOF9mdWxsc2NyZWVuX3Q7CisKKy8qIDIuMzogQW4gaW9jdGwgdG8gZ2V0IHBhcmFtZXRlcnMgdGhhdCBhcmVuJ3QgYXZhaWxhYmxlIHRvIHRoZSAzZAorICogY2xpZW50IGFueSBvdGhlciB3YXkuCisgKi8KKyNkZWZpbmUgUjEyOF9QQVJBTV9JUlFfTlIgICAgICAgICAgICAxCisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2dldHBhcmFtIHsKKwlpbnQgcGFyYW07CisJdm9pZCAqdmFsdWU7Cit9IGRybV9yMTI4X2dldHBhcmFtX3Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vcmFkZW9uX2RybS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vcmFkZW9uX2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMGFmMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2RybS9yYWRlb25fZHJtLmgKQEAgLTAsMCArMSw5MjYgQEAKKy8qIHJhZGVvbl9kcm0uaCAtLSBQdWJsaWMgaGVhZGVyIGZvciB0aGUgcmFkZW9uIGRyaXZlciAtKi0gbGludXgtYyAtKi0KKyAqCisgKiBDb3B5cmlnaHQgMjAwMCBQcmVjaXNpb24gSW5zaWdodCwgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBGcmVtb250LCBDYWxpZm9ybmlhLgorICogQ29weXJpZ2h0IDIwMDIgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogUFJFQ0lTSU9OIElOU0lHSFQgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEtldmluIEUuIE1hcnRpbiA8bWFydGluQHZhbGludXguY29tPgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICogICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICovCisKKyNpZm5kZWYgX19SQURFT05fRFJNX0hfXworI2RlZmluZSBfX1JBREVPTl9EUk1fSF9fCisKKyNpbmNsdWRlIDxkcm0vZHJtLmg+CisKKy8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlIGRlZmluZXMsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlCisgKiBkZWZpbmVzIGluIHRoZSBYIHNlcnZlciBmaWxlIChyYWRlb25fc2FyZWEuaCkKKyAqLworI2lmbmRlZiBfX1JBREVPTl9TQVJFQV9ERUZJTkVTX18KKyNkZWZpbmUgX19SQURFT05fU0FSRUFfREVGSU5FU19fCisKKy8qIE9sZCBzdHlsZSBzdGF0ZSBmbGFncywgcmVxdWlyZWQgZm9yIHNhcmVhIGludGVyZmFjZSAoMS4xIGFuZCAxLjIKKyAqIGNsZWFycykgYW5kIDEuMiBkcm1fdmVydGV4MiBpb2N0bC4KKyAqLworI2RlZmluZSBSQURFT05fVVBMT0FEX0NPTlRFWFQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9WRVJURk1UCQkweDAwMDAwMDAyCisjZGVmaW5lIFJBREVPTl9VUExPQURfTElORQkJMHgwMDAwMDAwNAorI2RlZmluZSBSQURFT05fVVBMT0FEX0JVTVBNQVAJCTB4MDAwMDAwMDgKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9NQVNLUwkJMHgwMDAwMDAxMAorI2RlZmluZSBSQURFT05fVVBMT0FEX1ZJRVdQT1JUCQkweDAwMDAwMDIwCisjZGVmaW5lIFJBREVPTl9VUExPQURfU0VUVVAJCTB4MDAwMDAwNDAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9UQ0wJCTB4MDAwMDAwODAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9NSVNDCQkweDAwMDAwMTAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfVEVYMAkJMHgwMDAwMDIwMAorI2RlZmluZSBSQURFT05fVVBMT0FEX1RFWDEJCTB4MDAwMDA0MDAKKyNkZWZpbmUgUkFERU9OX1VQTE9BRF9URVgyCQkweDAwMDAwODAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfVEVYMElNQUdFUwkweDAwMDAxMDAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfVEVYMUlNQUdFUwkweDAwMDAyMDAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfVEVYMklNQUdFUwkweDAwMDA0MDAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfQ0xJUFJFQ1RTCQkweDAwMDA4MDAwCS8qIGhhbmRsZWQgY2xpZW50LXNpZGUgKi8KKyNkZWZpbmUgUkFERU9OX1JFUVVJUkVfUVVJRVNDRU5DRQkweDAwMDEwMDAwCisjZGVmaW5lIFJBREVPTl9VUExPQURfWkJJQVMJCTB4MDAwMjAwMDAJLyogdmVyc2lvbiAxLjIgYW5kIG5ld2VyICovCisjZGVmaW5lIFJBREVPTl9VUExPQURfQUxMCQkweDAwM2VmZmZmCisjZGVmaW5lIFJBREVPTl9VUExPQURfQ09OVEVYVF9BTEwgICAgICAgMHgwMDNlMDFmZgorCisvKiBOZXcgc3R5bGUgcGVyLXBhY2tldCBpZGVudGlmaWVycyBmb3IgdXNlIGluIGNtZF9idWZmZXIgaW9jdGwgd2l0aAorICogdGhlIFJBREVPTl9FTUlUX1BBQ0tFVCBjb21tYW5kLiAgQ29tbWVudHMgcmVsYXRlIG5ldyBwYWNrZXRzIHRvIG9sZAorICogc3RhdGUgYml0cyBhbmQgdGhlIHBhY2tldCBzaXplOgorICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX01JU0MgICAgICAgICAgICAgICAgICAgICAgICAgMAkvKiBjb250ZXh0LzcgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIGNvbnRleHQvMyAqLworI2RlZmluZSBSQURFT05fRU1JVF9SQjNEX0NPTE9SUElUQ0ggICAgICAgICAgICAgICAgIDIJLyogY29udGV4dC8xICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1JFX0xJTkVfUEFUVEVSTiAgICAgICAgICAgICAgICAgMwkvKiBsaW5lLzIgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfU0VfTElORV9XSURUSCAgICAgICAgICAgICAgICAgICA0CS8qIGxpbmUvMSAqLworI2RlZmluZSBSQURFT05fRU1JVF9QUF9MVU1fTUFUUklYICAgICAgICAgICAgICAgICAgIDUJLyogYnVtcG1hcC8xICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX1JPVF9NQVRSSVhfMCAgICAgICAgICAgICAgICAgNgkvKiBidW1wbWFwLzIgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfUkIzRF9TVEVOQ0lMUkVGTUFTSyAgICAgICAgICAgICA3CS8qIG1hc2tzLzMgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfU0VfVlBPUlRfWFNDQUxFICAgICAgICAgICAgICAgICA4CS8qIHZpZXdwb3J0LzYgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfU0VfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgICA5CS8qIHNldHVwLzIgKi8KKyNkZWZpbmUgUkFERU9OX0VNSVRfU0VfQ05UTF9TVEFUVVMgICAgICAgICAgICAgICAgICAxMAkvKiBzZXR1cC8xICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1JFX01JU0MgICAgICAgICAgICAgICAgICAgICAgICAgMTEJLyogbWlzYy8xICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX1RYRklMVEVSXzAgICAgICAgICAgICAgICAgICAgMTIJLyogdGV4MC82ICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0JPUkRFUl9DT0xPUl8wICAgICAgICAgICAgICAgMTMJLyogdGV4MC8xICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX1RYRklMVEVSXzEgICAgICAgICAgICAgICAgICAgMTQJLyogdGV4MS82ICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0JPUkRFUl9DT0xPUl8xICAgICAgICAgICAgICAgMTUJLyogdGV4MS8xICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX1RYRklMVEVSXzIgICAgICAgICAgICAgICAgICAgMTYJLyogdGV4Mi82ICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0JPUkRFUl9DT0xPUl8yICAgICAgICAgICAgICAgMTcJLyogdGV4Mi8xICovCisjZGVmaW5lIFJBREVPTl9FTUlUX1NFX1pCSUFTX0ZBQ1RPUiAgICAgICAgICAgICAgICAgMTgJLyogemJpYXMvMiAqLworI2RlZmluZSBSQURFT05fRU1JVF9TRV9UQ0xfT1VUUFVUX1ZUWF9GTVQgICAgICAgICAgIDE5CS8qIHRjbC8xMSAqLworI2RlZmluZSBSQURFT05fRU1JVF9TRV9UQ0xfTUFURVJJQUxfRU1NSVNTSVZFX1JFRCAgIDIwCS8qIG1hdGVyaWFsLzE3ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENCTEVORF8wICAgICAgICAgICAgICAgICAgICAgMjEJLyogdGV4MC80ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENCTEVORF8xICAgICAgICAgICAgICAgICAgICAgMjIJLyogdGV4MS80ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENCTEVORF8yICAgICAgICAgICAgICAgICAgICAgMjMJLyogdGV4Mi80ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENCTEVORF8zICAgICAgICAgICAgICAgICAgICAgMjQJLyogdGV4My80ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENCTEVORF80ICAgICAgICAgICAgICAgICAgICAgMjUJLyogdGV4NC80ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENCTEVORF81ICAgICAgICAgICAgICAgICAgICAgMjYJLyogdGV4NS80ICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENCTEVORF82ICAgICAgICAgICAgICAgICAgICAgMjcJLyogLzQgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzcgICAgICAgICAgICAgICAgICAgICAyOAkvKiAvNCAqLworI2RlZmluZSBSMjAwX0VNSVRfVENMX0xJR0hUX01PREVMX0NUTF8wICAgICAgICAgICAgIDI5CS8qIHRjbC83ICovCisjZGVmaW5lIFIyMDBfRU1JVF9URkFDVE9SXzAgICAgICAgICAgICAgICAgICAgICAgICAgMzAJLyogdGYvNyAqLworI2RlZmluZSBSMjAwX0VNSVRfVlRYX0ZNVF8wICAgICAgICAgICAgICAgICAgICAgICAgIDMxCS8qIHZ0eC81ICovCisjZGVmaW5lIFIyMDBfRU1JVF9WQVBfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIJLyogdmFwLzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX01BVFJJWF9TRUxFQ1RfMCAgICAgICAgICAgICAgICAgICAzMwkvKiBtc2wvNSAqLworI2RlZmluZSBSMjAwX0VNSVRfVEVYX1BST0NfQ1RMXzIgICAgICAgICAgICAgICAgICAgIDM0CS8qIHRjZy81ICovCisjZGVmaW5lIFIyMDBfRU1JVF9UQ0xfVUNQX1ZFUlRfQkxFTkRfQ1RMICAgICAgICAgICAgMzUJLyogdGNsLzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzAgICAgICAgICAgICAgICAgICAgICAzNgkvKiB0ZXgwLzYgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzEgICAgICAgICAgICAgICAgICAgICAzNwkvKiB0ZXgxLzYgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzIgICAgICAgICAgICAgICAgICAgICAzOAkvKiB0ZXgyLzYgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzMgICAgICAgICAgICAgICAgICAgICAzOQkvKiB0ZXgzLzYgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzQgICAgICAgICAgICAgICAgICAgICA0MAkvKiB0ZXg0LzYgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzUgICAgICAgICAgICAgICAgICAgICA0MQkvKiB0ZXg1LzYgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzAgICAgICAgICAgICAgICAgICAgICA0MgkvKiB0ZXgwLzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzEgICAgICAgICAgICAgICAgICAgICA0MwkvKiB0ZXgxLzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzIgICAgICAgICAgICAgICAgICAgICA0NAkvKiB0ZXgyLzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzMgICAgICAgICAgICAgICAgICAgICA0NQkvKiB0ZXgzLzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzQgICAgICAgICAgICAgICAgICAgICA0NgkvKiB0ZXg0LzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzUgICAgICAgICAgICAgICAgICAgICA0NwkvKiB0ZXg1LzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1ZURV9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICA0OAkvKiB2dGUvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfT1VUUFVUX1ZUWF9DT01QX1NFTCAgICAgICAgICAgICAgIDQ5CS8qIHZ0eC8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UQU1fREVCVUczICAgICAgICAgICAgICAgICAgICAgNTAJLyogdGFtLzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NOVExfWCAgICAgICAgICAgICAgICAgICAgICAgICA1MQkvKiBjc3QvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfUkIzRF9ERVBUSFhZX09GRlNFVCAgICAgICAgICAgICAgIDUyCS8qIGNzdC8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9SRV9BVVhfU0NJU1NPUl9DTlRMICAgICAgICAgICAgICAgNTMJLyogY3N0LzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1JFX1NDSVNTT1JfVExfMCAgICAgICAgICAgICAgICAgICA1NAkvKiBjc3QvMiAqLworI2RlZmluZSBSMjAwX0VNSVRfUkVfU0NJU1NPUl9UTF8xICAgICAgICAgICAgICAgICAgIDU1CS8qIGNzdC8yICovCisjZGVmaW5lIFIyMDBfRU1JVF9SRV9TQ0lTU09SX1RMXzIgICAgICAgICAgICAgICAgICAgNTYJLyogY3N0LzIgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1NFX1ZBUF9DTlRMX1NUQVRVUyAgICAgICAgICAgICAgICA1NwkvKiBjc3QvMSAqLworI2RlZmluZSBSMjAwX0VNSVRfU0VfVlRYX1NUQVRFX0NOVEwgICAgICAgICAgICAgICAgIDU4CS8qIGNzdC8xICovCisjZGVmaW5lIFIyMDBfRU1JVF9SRV9QT0lOVFNJWkUgICAgICAgICAgICAgICAgICAgICAgNTkJLyogY3N0LzEgKi8KKyNkZWZpbmUgUjIwMF9FTUlUX1RDTF9JTlBVVF9WVFhfVkVDVE9SX0FERFJfMCAgICAgICA2MAkvKiBjc3QvNCAqLworI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMCAgICAgICAgICAgICAgICAgIDYxCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzAgICAgICAgICAgICAgICAgNjIKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzEgICAgICAgICAgICAgICAgICA2MworI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU18xICAgICAgICAgICAgICAgIDY0CisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU18yICAgICAgICAgICAgICAgICAgNjUKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfMiAgICAgICAgICAgICAgICA2NgorI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMyAgICAgICAgICAgICAgICAgIDY3CisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzMgICAgICAgICAgICAgICAgNjgKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzQgICAgICAgICAgICAgICAgICA2OQorI2RlZmluZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU180ICAgICAgICAgICAgICAgIDcwCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU181ICAgICAgICAgICAgICAgICAgNzEKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfNSAgICAgICAgICAgICAgICA3MgorI2RlZmluZSBSQURFT05fRU1JVF9QUF9URVhfU0laRV8wICAgICAgICAgICAgICAgICAgIDczCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX1RFWF9TSVpFXzEgICAgICAgICAgICAgICAgICAgNzQKKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfVEVYX1NJWkVfMiAgICAgICAgICAgICAgICAgICA3NQorI2RlZmluZSBSMjAwX0VNSVRfUkIzRF9CTEVORENPTE9SICAgICAgICAgICAgICAgICAgIDc2CisjZGVmaW5lIFIyMDBfRU1JVF9UQ0xfUE9JTlRfU1BSSVRFX0NOVEwgICAgICAgICAgICAgNzcKKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMCAgICAgICAgICAgICAgICA3OAorI2RlZmluZSBSQURFT05fRU1JVF9QUF9DVUJJQ19PRkZTRVRTX1QwICAgICAgICAgICAgIDc5CisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0NVQklDX0ZBQ0VTXzEgICAgICAgICAgICAgICAgODAKKyNkZWZpbmUgUkFERU9OX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU19UMSAgICAgICAgICAgICA4MQorI2RlZmluZSBSQURFT05fRU1JVF9QUF9DVUJJQ19GQUNFU18yICAgICAgICAgICAgICAgIDgyCisjZGVmaW5lIFJBREVPTl9FTUlUX1BQX0NVQklDX09GRlNFVFNfVDIgICAgICAgICAgICAgODMKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RSSV9QRVJGX0NOVEwgICAgICAgICAgICAgICAgICA4NAorI2RlZmluZSBSMjAwX0VNSVRfUFBfQUZTXzAgICAgICAgICAgICAgICAgICAgICAgICAgIDg1CisjZGVmaW5lIFIyMDBfRU1JVF9QUF9BRlNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgODYKKyNkZWZpbmUgUjIwMF9FTUlUX0FURl9URkFDVE9SICAgICAgICAgICAgICAgICAgICAgICA4NworI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhDVExBTExfMCAgICAgICAgICAgICAgICAgICAgIDg4CisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENUTEFMTF8xICAgICAgICAgICAgICAgICAgICAgODkKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ1RMQUxMXzIgICAgICAgICAgICAgICAgICAgICA5MAorI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhDVExBTExfMyAgICAgICAgICAgICAgICAgICAgIDkxCisjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENUTEFMTF80ICAgICAgICAgICAgICAgICAgICAgOTIKKyNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ1RMQUxMXzUgICAgICAgICAgICAgICAgICAgICA5MworI2RlZmluZSBSMjAwX0VNSVRfVkFQX1BWU19DTlRMICAgICAgICAgICAgICAgICAgICAgIDk0CisjZGVmaW5lIFJBREVPTl9NQVhfU1RBVEVfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgOTUKKworLyogQ29tbWFuZHMgdW5kZXJzdG9vZCBieSBjbWRfYnVmZmVyIGlvY3RsLiAgTW9yZSBjYW4gYmUgYWRkZWQgYnV0CisgKiBvYnZpb3VzbHkgdGhlc2UgY2FuJ3QgYmUgcmVtb3ZlZCBvciBjaGFuZ2VkOgorICovCisjZGVmaW5lIFJBREVPTl9DTURfUEFDS0VUICAgICAgMQkvKiBlbWl0IG9uZSBvZiB0aGUgcmVnaXN0ZXIgcGFja2V0cyBhYm92ZSAqLworI2RlZmluZSBSQURFT05fQ01EX1NDQUxBUlMgICAgIDIJLyogZW1pdCBzY2FsYXIgZGF0YSAqLworI2RlZmluZSBSQURFT05fQ01EX1ZFQ1RPUlMgICAgIDMJLyogZW1pdCB2ZWN0b3IgZGF0YSAqLworI2RlZmluZSBSQURFT05fQ01EX0RNQV9ESVNDQVJEIDQJLyogZGlzY2FyZCBjdXJyZW50IGRtYSBidWYgKi8KKyNkZWZpbmUgUkFERU9OX0NNRF9QQUNLRVQzICAgICA1CS8qIGVtaXQgaHcgcGFja2V0ICovCisjZGVmaW5lIFJBREVPTl9DTURfUEFDS0VUM19DTElQIDYJLyogZW1pdCBodyBwYWNrZXQgd3JhcHBlZCBpbiBjbGlwcmVjdHMgKi8KKyNkZWZpbmUgUkFERU9OX0NNRF9TQ0FMQVJTMiAgICAgNwkvKiByMjAwIHN0b3BnYXAgKi8KKyNkZWZpbmUgUkFERU9OX0NNRF9XQUlUICAgICAgICAgOAkvKiBlbWl0IGh3IHdhaXQgY29tbWFuZHMgLS0gbm90ZToKKwkJCQkJICogIGRvZXNuJ3QgbWFrZSB0aGUgY3B1IHdhaXQsIGp1c3QKKwkJCQkJICogIHRoZSBncmFwaGljcyBoYXJkd2FyZSAqLworI2RlZmluZSBSQURFT05fQ01EX1ZFQ0xJTkVBUgk5ICAgICAgIC8qIGFub3RoZXIgcjIwMCBzdG9wZ2FwICovCisKK3R5cGVkZWYgdW5pb24geworCWludCBpOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIHBhZDAsIHBhZDEsIHBhZDI7CisJfSBoZWFkZXI7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgcGFja2V0X2lkLCBwYWQwLCBwYWQxOworCX0gcGFja2V0OworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIG9mZnNldCwgc3RyaWRlLCBjb3VudDsKKwl9IHNjYWxhcnM7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgb2Zmc2V0LCBzdHJpZGUsIGNvdW50OworCX0gdmVjdG9yczsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZF90eXBlLCBhZGRyX2xvLCBhZGRyX2hpLCBjb3VudDsKKwl9IHZlY2xpbmVhcjsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZF90eXBlLCBidWZfaWR4LCBwYWQwLCBwYWQxOworCX0gZG1hOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIGZsYWdzLCBwYWQwLCBwYWQxOworCX0gd2FpdDsKK30gZHJtX3JhZGVvbl9jbWRfaGVhZGVyX3Q7CisKKyNkZWZpbmUgUkFERU9OX1dBSVRfMkQgIDB4MQorI2RlZmluZSBSQURFT05fV0FJVF8zRCAgMHgyCisKKy8qIEFsbG93ZWQgcGFyYW1ldGVycyBmb3IgUjMwMF9DTURfUEFDS0VUMworICovCisjZGVmaW5lIFIzMDBfQ01EX1BBQ0tFVDNfQ0xFQVIJCTAKKyNkZWZpbmUgUjMwMF9DTURfUEFDS0VUM19SQVcJCTEKKworLyogQ29tbWFuZHMgdW5kZXJzdG9vZCBieSBjbWRfYnVmZmVyIGlvY3RsIGZvciBSMzAwLgorICogVGhlIGludGVyZmFjZSBoYXMgbm90IGJlZW4gc3RhYmlsaXplZCwgc28gc29tZSBvZiB0aGVzZSBtYXkgYmUgcmVtb3ZlZAorICogYW5kIGV2ZW50dWFsbHkgcmVvcmRlcmVkIGJlZm9yZSBzdGFiaWxpemF0aW9uLgorICovCisjZGVmaW5lIFIzMDBfQ01EX1BBQ0tFVDAJCTEKKyNkZWZpbmUgUjMwMF9DTURfVlBVCQkJMgkvKiBlbWl0IHZlcnRleCBwcm9ncmFtIHVwbG9hZCAqLworI2RlZmluZSBSMzAwX0NNRF9QQUNLRVQzCQkzCS8qIGVtaXQgYSBwYWNrZXQzICovCisjZGVmaW5lIFIzMDBfQ01EX0VORDNECQkJNAkvKiBlbWl0IHNlcXVlbmNlIGVuZGluZyAzZCByZW5kZXJpbmcgKi8KKyNkZWZpbmUgUjMwMF9DTURfQ1BfREVMQVkJCTUKKyNkZWZpbmUgUjMwMF9DTURfRE1BX0RJU0NBUkQJCTYKKyNkZWZpbmUgUjMwMF9DTURfV0FJVAkJCTcKKyMJZGVmaW5lIFIzMDBfV0FJVF8yRAkJMHgxCisjCWRlZmluZSBSMzAwX1dBSVRfM0QJCTB4MgorLyogdGhlc2UgdHdvIGRlZmluZXMgYXJlIERPSU5HIElUIFdST05HIC0gaG93ZXZlcgorICogd2UgaGF2ZSB1c2Vyc3BhY2Ugd2hpY2ggcmVsaWVzIG9uIHVzaW5nIHRoZXNlLgorICogVGhlIHdhaXQgaW50ZXJmYWNlIGlzIGJhY2t3YXJkcyBjb21wYXQgbmV3IAorICogY29kZSBzaG91bGQgdXNlIHRoZSBORVdfV0FJVCBkZWZpbmVzIGJlbG93CisgKiBUSEVTRSBBUkUgTk9UIEJJVCBGSUVMRFMKKyAqLworIwlkZWZpbmUgUjMwMF9XQUlUXzJEX0NMRUFOCTB4MworIwlkZWZpbmUgUjMwMF9XQUlUXzNEX0NMRUFOCTB4NAorCisjCWRlZmluZSBSMzAwX05FV19XQUlUXzJEXzNECTB4MworIwlkZWZpbmUgUjMwMF9ORVdfV0FJVF8yRF8yRF9DTEVBTgkweDQKKyMJZGVmaW5lIFIzMDBfTkVXX1dBSVRfM0RfM0RfQ0xFQU4JMHg2CisjCWRlZmluZSBSMzAwX05FV19XQUlUXzJEXzJEX0NMRUFOXzNEXzNEX0NMRUFOCTB4OAorCisjZGVmaW5lIFIzMDBfQ01EX1NDUkFUQ0gJCTgKKyNkZWZpbmUgUjMwMF9DTURfUjUwMEZQICAgICAgICAgICAgICAgICA5CisKK3R5cGVkZWYgdW5pb24geworCXVuc2lnbmVkIGludCB1OworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIHBhZDAsIHBhZDEsIHBhZDI7CisJfSBoZWFkZXI7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgY291bnQsIHJlZ2xvLCByZWdoaTsKKwl9IHBhY2tldDA7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgY291bnQsIGFkcmxvLCBhZHJoaTsKKwl9IHZwdTsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZF90eXBlLCBwYWNrZXQsIHBhZDAsIHBhZDE7CisJfSBwYWNrZXQzOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIHBhY2tldDsKKwkJdW5zaWduZWQgc2hvcnQgY291bnQ7CS8qIGFtb3VudCBvZiBwYWNrZXQyIHRvIGVtaXQgKi8KKwl9IGRlbGF5OworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIGJ1Zl9pZHgsIHBhZDAsIHBhZDE7CisJfSBkbWE7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgZmxhZ3MsIHBhZDAsIHBhZDE7CisJfSB3YWl0OworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIHJlZywgbl9idWZzLCBmbGFnczsKKwl9IHNjcmF0Y2g7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgY291bnQsIGFkcmxvLCBhZHJoaV9mbGFnczsKKwl9IHI1MDBmcDsKK30gZHJtX3IzMDBfY21kX2hlYWRlcl90OworCisjZGVmaW5lIFJBREVPTl9GUk9OVAkJCTB4MQorI2RlZmluZSBSQURFT05fQkFDSwkJCTB4MgorI2RlZmluZSBSQURFT05fREVQVEgJCQkweDQKKyNkZWZpbmUgUkFERU9OX1NURU5DSUwJCQkweDgKKyNkZWZpbmUgUkFERU9OX0NMRUFSX0ZBU1RaCQkweDgwMDAwMDAwCisjZGVmaW5lIFJBREVPTl9VU0VfSElFUloJCTB4NDAwMDAwMDAKKyNkZWZpbmUgUkFERU9OX1VTRV9DT01QX1pCVUYJCTB4MjAwMDAwMDAKKworI2RlZmluZSBSNTAwRlBfQ09OU1RBTlRfVFlQRSAgKDEgPDwgMSkKKyNkZWZpbmUgUjUwMEZQX0NPTlNUQU5UX0NMQU1QICgxIDw8IDIpCisKKy8qIFByaW1pdGl2ZSB0eXBlcworICovCisjZGVmaW5lIFJBREVPTl9QT0lOVFMJCQkweDEKKyNkZWZpbmUgUkFERU9OX0xJTkVTCQkJMHgyCisjZGVmaW5lIFJBREVPTl9MSU5FX1NUUklQCQkweDMKKyNkZWZpbmUgUkFERU9OX1RSSUFOR0xFUwkJMHg0CisjZGVmaW5lIFJBREVPTl9UUklBTkdMRV9GQU4JCTB4NQorI2RlZmluZSBSQURFT05fVFJJQU5HTEVfU1RSSVAJCTB4NgorCisvKiBWZXJ0ZXgvaW5kaXJlY3QgYnVmZmVyIHNpemUKKyAqLworI2RlZmluZSBSQURFT05fQlVGRkVSX1NJWkUJCTY1NTM2CisKKy8qIEJ5dGUgb2Zmc2V0cyBmb3IgaW5kaXJlY3QgYnVmZmVyIGRhdGEKKyAqLworI2RlZmluZSBSQURFT05fSU5ERVhfUFJJTV9PRkZTRVQJMjAKKworI2RlZmluZSBSQURFT05fU0NSQVRDSF9SRUdfT0ZGU0VUCTMyCisKKyNkZWZpbmUgUjYwMF9TQ1JBVENIX1JFR19PRkZTRVQgICAgICAgICAyNTYKKworI2RlZmluZSBSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTCTEyCisKKy8qIFRoZXJlIGFyZSAyIGhlYXBzIChsb2NhbC9HQVJUKS4gIEVhY2ggcmVnaW9uIHdpdGhpbiBhIGhlYXAgaXMgYQorICogbWluaW11bSBvZiA2NGssIGFuZCB0aGVyZSBhcmUgYXQgbW9zdCA2NCBvZiB0aGVtIHBlciBoZWFwLgorICovCisjZGVmaW5lIFJBREVPTl9MT0NBTF9URVhfSEVBUAkJMAorI2RlZmluZSBSQURFT05fR0FSVF9URVhfSEVBUAkJMQorI2RlZmluZSBSQURFT05fTlJfVEVYX0hFQVBTCQkyCisjZGVmaW5lIFJBREVPTl9OUl9URVhfUkVHSU9OUwkJNjQKKyNkZWZpbmUgUkFERU9OX0xPR19URVhfR1JBTlVMQVJJVFkJMTYKKworI2RlZmluZSBSQURFT05fTUFYX1RFWFRVUkVfTEVWRUxTCTEyCisjZGVmaW5lIFJBREVPTl9NQVhfVEVYVFVSRV9VTklUUwkzCisKKyNkZWZpbmUgUkFERU9OX01BWF9TVVJGQUNFUwkJOAorCisvKiBCbGl0cyBoYXZlIHN0cmljdCBvZmZzZXQgcnVsZXMuICBBbGwgYmxpdCBvZmZzZXQgbXVzdCBiZSBhbGlnbmVkIG9uCisgKiBhIDFLLWJ5dGUgYm91bmRhcnkuCisgKi8KKyNkZWZpbmUgUkFERU9OX09GRlNFVF9TSElGVCAgICAgICAgICAgICAxMAorI2RlZmluZSBSQURFT05fT0ZGU0VUX0FMSUdOICAgICAgICAgICAgICgxIDw8IFJBREVPTl9PRkZTRVRfU0hJRlQpCisjZGVmaW5lIFJBREVPTl9PRkZTRVRfTUFTSyAgICAgICAgICAgICAgKFJBREVPTl9PRkZTRVRfQUxJR04gLSAxKQorCisjZW5kaWYJCQkJLyogX19SQURFT05fU0FSRUFfREVGSU5FU19fICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgcmVkOworCXVuc2lnbmVkIGludCBncmVlbjsKKwl1bnNpZ25lZCBpbnQgYmx1ZTsKKwl1bnNpZ25lZCBpbnQgYWxwaGE7Cit9IHJhZGVvbl9jb2xvcl9yZWdzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBDb250ZXh0IHN0YXRlICovCisJdW5zaWduZWQgaW50IHBwX21pc2M7CS8qIDB4MWMxNCAqLworCXVuc2lnbmVkIGludCBwcF9mb2dfY29sb3I7CisJdW5zaWduZWQgaW50IHJlX3NvbGlkX2NvbG9yOworCXVuc2lnbmVkIGludCByYjNkX2JsZW5kY250bDsKKwl1bnNpZ25lZCBpbnQgcmIzZF9kZXB0aG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgcmIzZF9kZXB0aHBpdGNoOworCXVuc2lnbmVkIGludCByYjNkX3pzdGVuY2lsY250bDsKKworCXVuc2lnbmVkIGludCBwcF9jbnRsOwkvKiAweDFjMzggKi8KKwl1bnNpZ25lZCBpbnQgcmIzZF9jbnRsOworCXVuc2lnbmVkIGludCByYjNkX2NvbG9yb2Zmc2V0OworCXVuc2lnbmVkIGludCByZV93aWR0aF9oZWlnaHQ7CisJdW5zaWduZWQgaW50IHJiM2RfY29sb3JwaXRjaDsKKwl1bnNpZ25lZCBpbnQgc2VfY250bDsKKworCS8qIFZlcnRleCBmb3JtYXQgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgc2VfY29vcmRfZm10OwkvKiAweDFjNTAgKi8KKworCS8qIExpbmUgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgcmVfbGluZV9wYXR0ZXJuOwkvKiAweDFjZDAgKi8KKwl1bnNpZ25lZCBpbnQgcmVfbGluZV9zdGF0ZTsKKworCXVuc2lnbmVkIGludCBzZV9saW5lX3dpZHRoOwkvKiAweDFkYjggKi8KKworCS8qIEJ1bXBtYXAgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgcHBfbHVtX21hdHJpeDsJLyogMHgxZDAwICovCisKKwl1bnNpZ25lZCBpbnQgcHBfcm90X21hdHJpeF8wOwkvKiAweDFkNTggKi8KKwl1bnNpZ25lZCBpbnQgcHBfcm90X21hdHJpeF8xOworCisJLyogTWFzayBzdGF0ZSAqLworCXVuc2lnbmVkIGludCByYjNkX3N0ZW5jaWxyZWZtYXNrOwkvKiAweDFkN2MgKi8KKwl1bnNpZ25lZCBpbnQgcmIzZF9yb3BjbnRsOworCXVuc2lnbmVkIGludCByYjNkX3BsYW5lbWFzazsKKworCS8qIFZpZXdwb3J0IHN0YXRlICovCisJdW5zaWduZWQgaW50IHNlX3Zwb3J0X3hzY2FsZTsJLyogMHgxZDk4ICovCisJdW5zaWduZWQgaW50IHNlX3Zwb3J0X3hvZmZzZXQ7CisJdW5zaWduZWQgaW50IHNlX3Zwb3J0X3lzY2FsZTsKKwl1bnNpZ25lZCBpbnQgc2VfdnBvcnRfeW9mZnNldDsKKwl1bnNpZ25lZCBpbnQgc2VfdnBvcnRfenNjYWxlOworCXVuc2lnbmVkIGludCBzZV92cG9ydF96b2Zmc2V0OworCisJLyogU2V0dXAgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgc2VfY250bF9zdGF0dXM7CS8qIDB4MjE0MCAqLworCisJLyogTWlzYyBzdGF0ZSAqLworCXVuc2lnbmVkIGludCByZV90b3BfbGVmdDsJLyogMHgyNmMwICovCisJdW5zaWduZWQgaW50IHJlX21pc2M7Cit9IGRybV9yYWRlb25fY29udGV4dF9yZWdzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBaYmlhcyBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBzZV96Ymlhc19mYWN0b3I7CS8qIDB4MWRhYyAqLworCXVuc2lnbmVkIGludCBzZV96Ymlhc19jb25zdGFudDsKK30gZHJtX3JhZGVvbl9jb250ZXh0Ml9yZWdzX3Q7CisKKy8qIFNldHVwIHJlZ2lzdGVycyBmb3IgZWFjaCB0ZXh0dXJlIHVuaXQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBwcF90eGZpbHRlcjsKKwl1bnNpZ25lZCBpbnQgcHBfdHhmb3JtYXQ7CisJdW5zaWduZWQgaW50IHBwX3R4b2Zmc2V0OworCXVuc2lnbmVkIGludCBwcF90eGNibGVuZDsKKwl1bnNpZ25lZCBpbnQgcHBfdHhhYmxlbmQ7CisJdW5zaWduZWQgaW50IHBwX3RmYWN0b3I7CisJdW5zaWduZWQgaW50IHBwX2JvcmRlcl9jb2xvcjsKK30gZHJtX3JhZGVvbl90ZXh0dXJlX3JlZ3NfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzdGFydDsKKwl1bnNpZ25lZCBpbnQgZmluaXNoOworCXVuc2lnbmVkIGludCBwcmltOjg7CisJdW5zaWduZWQgaW50IHN0YXRlaWR4Ojg7CisJdW5zaWduZWQgaW50IG51bXZlcnRzOjE2OwkvKiBvdmVybG9hZGVkIGFzIG9mZnNldC82NCBmb3IgZWx0IHByaW1zICovCisJdW5zaWduZWQgaW50IHZjX2Zvcm1hdDsJLyogdmVydGV4IGZvcm1hdCAqLworfSBkcm1fcmFkZW9uX3ByaW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWRybV9yYWRlb25fY29udGV4dF9yZWdzX3QgY29udGV4dDsKKwlkcm1fcmFkZW9uX3RleHR1cmVfcmVnc190IHRleFtSQURFT05fTUFYX1RFWFRVUkVfVU5JVFNdOworCWRybV9yYWRlb25fY29udGV4dDJfcmVnc190IGNvbnRleHQyOworCXVuc2lnbmVkIGludCBkaXJ0eTsKK30gZHJtX3JhZGVvbl9zdGF0ZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisJLyogVGhlIGNoYW5uZWwgZm9yIGNvbW11bmljYXRpb24gb2Ygc3RhdGUgaW5mb3JtYXRpb24gdG8gdGhlCisJICoga2VybmVsIG9uIGZpcmluZyBhIHZlcnRleCBidWZmZXIgd2l0aCBlaXRoZXIgb2YgdGhlCisJICogb2Jzb2xldGVkIHZlcnRleC9pbmRleCBpb2N0bHMuCisJICovCisJZHJtX3JhZGVvbl9jb250ZXh0X3JlZ3NfdCBjb250ZXh0X3N0YXRlOworCWRybV9yYWRlb25fdGV4dHVyZV9yZWdzX3QgdGV4X3N0YXRlW1JBREVPTl9NQVhfVEVYVFVSRV9VTklUU107CisJdW5zaWduZWQgaW50IGRpcnR5OworCXVuc2lnbmVkIGludCB2ZXJ0c2l6ZTsKKwl1bnNpZ25lZCBpbnQgdmNfZm9ybWF0OworCisJLyogVGhlIGN1cnJlbnQgY2xpcHJlY3RzLCBvciBhIHN1YnNldCB0aGVyZW9mLgorCSAqLworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGJveGVzW1JBREVPTl9OUl9TQVJFQV9DTElQUkVDVFNdOworCXVuc2lnbmVkIGludCBuYm94OworCisJLyogQ291bnRlcnMgZm9yIGNsaWVudC1zaWRlIHRocm90dGxpbmcgb2YgcmVuZGVyaW5nIGNsaWVudHMuCisJICovCisJdW5zaWduZWQgaW50IGxhc3RfZnJhbWU7CisJdW5zaWduZWQgaW50IGxhc3RfZGlzcGF0Y2g7CisJdW5zaWduZWQgaW50IGxhc3RfY2xlYXI7CisKKwlzdHJ1Y3QgZHJtX3RleF9yZWdpb24gdGV4X2xpc3RbUkFERU9OX05SX1RFWF9IRUFQU11bUkFERU9OX05SX1RFWF9SRUdJT05TICsKKwkJCQkJCSAgICAgICAxXTsKKwl1bnNpZ25lZCBpbnQgdGV4X2FnZVtSQURFT05fTlJfVEVYX0hFQVBTXTsKKwlpbnQgY3R4X293bmVyOworCWludCBwZlN0YXRlOwkJLyogbnVtYmVyIG9mIDNkIHdpbmRvd3MgKDAsMSwyb3Jtb3JlKSAqLworCWludCBwZkN1cnJlbnRQYWdlOwkvKiB3aGljaCBidWZmZXIgaXMgYmVpbmcgZGlzcGxheWVkPyAqLworCWludCBjcnRjMl9iYXNlOwkJLyogQ1JUQzIgZnJhbWUgb2Zmc2V0ICovCisJaW50IHRpbGluZ19lbmFibGVkOwkvKiBzZXQgYnkgZHJtLCByZWFkIGJ5IDJkICsgM2QgY2xpZW50cyAqLworfSBkcm1fcmFkZW9uX3NhcmVhX3Q7CisKKy8qIFdBUk5JTkc6IElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlIGRlZmluZXMsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlCisgKiBkZWZpbmVzIGluIHRoZSBYc2VydmVyIGZpbGUgKHhmODZkcm1SYWRlb24uaCkKKyAqCisgKiBLVzogYWN0dWFsbHkgaXQncyBpbGxlZ2FsIHRvIGNoYW5nZSBhbnkgb2YgdGhpcyAoYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpLgorICovCisKKy8qIFJhZGVvbiBzcGVjaWZpYyBpb2N0bHMKKyAqIFRoZSBkZXZpY2Ugc3BlY2lmaWMgaW9jdGwgcmFuZ2UgaXMgMHg0MCB0byAweDc5LgorICovCisjZGVmaW5lIERSTV9SQURFT05fQ1BfSU5JVCAgICAweDAwCisjZGVmaW5lIERSTV9SQURFT05fQ1BfU1RBUlQgICAweDAxCisjZGVmaW5lIERSTV9SQURFT05fQ1BfU1RPUCAgICAweDAyCisjZGVmaW5lIERSTV9SQURFT05fQ1BfUkVTRVQgICAweDAzCisjZGVmaW5lIERSTV9SQURFT05fQ1BfSURMRSAgICAweDA0CisjZGVmaW5lIERSTV9SQURFT05fUkVTRVQgICAgICAweDA1CisjZGVmaW5lIERSTV9SQURFT05fRlVMTFNDUkVFTiAweDA2CisjZGVmaW5lIERSTV9SQURFT05fU1dBUCAgICAgICAweDA3CisjZGVmaW5lIERSTV9SQURFT05fQ0xFQVIgICAgICAweDA4CisjZGVmaW5lIERSTV9SQURFT05fVkVSVEVYICAgICAweDA5CisjZGVmaW5lIERSTV9SQURFT05fSU5ESUNFUyAgICAweDBBCisjZGVmaW5lIERSTV9SQURFT05fTk9UX1VTRUQKKyNkZWZpbmUgRFJNX1JBREVPTl9TVElQUExFICAgIDB4MEMKKyNkZWZpbmUgRFJNX1JBREVPTl9JTkRJUkVDVCAgIDB4MEQKKyNkZWZpbmUgRFJNX1JBREVPTl9URVhUVVJFICAgIDB4MEUKKyNkZWZpbmUgRFJNX1JBREVPTl9WRVJURVgyICAgIDB4MEYKKyNkZWZpbmUgRFJNX1JBREVPTl9DTURCVUYgICAgIDB4MTAKKyNkZWZpbmUgRFJNX1JBREVPTl9HRVRQQVJBTSAgIDB4MTEKKyNkZWZpbmUgRFJNX1JBREVPTl9GTElQICAgICAgIDB4MTIKKyNkZWZpbmUgRFJNX1JBREVPTl9BTExPQyAgICAgIDB4MTMKKyNkZWZpbmUgRFJNX1JBREVPTl9GUkVFICAgICAgIDB4MTQKKyNkZWZpbmUgRFJNX1JBREVPTl9JTklUX0hFQVAgIDB4MTUKKyNkZWZpbmUgRFJNX1JBREVPTl9JUlFfRU1JVCAgIDB4MTYKKyNkZWZpbmUgRFJNX1JBREVPTl9JUlFfV0FJVCAgIDB4MTcKKyNkZWZpbmUgRFJNX1JBREVPTl9DUF9SRVNVTUUgIDB4MTgKKyNkZWZpbmUgRFJNX1JBREVPTl9TRVRQQVJBTSAgIDB4MTkKKyNkZWZpbmUgRFJNX1JBREVPTl9TVVJGX0FMTE9DIDB4MWEKKyNkZWZpbmUgRFJNX1JBREVPTl9TVVJGX0ZSRUUgIDB4MWIKKy8qIEtNUyBpb2N0bCAqLworI2RlZmluZSBEUk1fUkFERU9OX0dFTV9JTkZPCQkweDFjCisjZGVmaW5lIERSTV9SQURFT05fR0VNX0NSRUFURQkJMHgxZAorI2RlZmluZSBEUk1fUkFERU9OX0dFTV9NTUFQCQkweDFlCisjZGVmaW5lIERSTV9SQURFT05fR0VNX1BSRUFECQkweDIxCisjZGVmaW5lIERSTV9SQURFT05fR0VNX1BXUklURQkJMHgyMgorI2RlZmluZSBEUk1fUkFERU9OX0dFTV9TRVRfRE9NQUlOCTB4MjMKKyNkZWZpbmUgRFJNX1JBREVPTl9HRU1fV0FJVF9JRExFCTB4MjQKKyNkZWZpbmUgRFJNX1JBREVPTl9DUwkJCTB4MjYKKyNkZWZpbmUgRFJNX1JBREVPTl9JTkZPCQkJMHgyNworI2RlZmluZSBEUk1fUkFERU9OX0dFTV9TRVRfVElMSU5HCTB4MjgKKyNkZWZpbmUgRFJNX1JBREVPTl9HRU1fR0VUX1RJTElORwkweDI5CisjZGVmaW5lIERSTV9SQURFT05fR0VNX0JVU1kJCTB4MmEKKworI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0NQX0lOSVQgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fQ1BfSU5JVCwgZHJtX3JhZGVvbl9pbml0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fQ1BfU1RBUlQgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9DUF9TVEFSVCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9DUF9TVE9QICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0NQX1NUT1AsIGRybV9yYWRlb25fY3Bfc3RvcF90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0NQX1JFU0VUICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fQ1BfUkVTRVQpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fQ1BfSURMRSAgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9DUF9JRExFKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX1JFU0VUICAgICAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fUkVTRVQpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fRlVMTFNDUkVFTiBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9GVUxMU0NSRUVOLCBkcm1fcmFkZW9uX2Z1bGxzY3JlZW5fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9TV0FQICAgICAgIERSTV9JTyggIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX1NXQVApCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fQ0xFQVIgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9DTEVBUiwgZHJtX3JhZGVvbl9jbGVhcl90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX1ZFUlRFWCAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fVkVSVEVYLCBkcm1fcmFkZW9uX3ZlcnRleF90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0lORElDRVMgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fSU5ESUNFUywgZHJtX3JhZGVvbl9pbmRpY2VzX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fU1RJUFBMRSAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9TVElQUExFLCBkcm1fcmFkZW9uX3N0aXBwbGVfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9JTkRJUkVDVCAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0lORElSRUNULCBkcm1fcmFkZW9uX2luZGlyZWN0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fVEVYVFVSRSAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9URVhUVVJFLCBkcm1fcmFkZW9uX3RleHR1cmVfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9WRVJURVgyICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX1ZFUlRFWDIsIGRybV9yYWRlb25fdmVydGV4Ml90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0NNREJVRiAgICAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fQ01EQlVGLCBkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9HRVRQQVJBTSAgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0dFVFBBUkFNLCBkcm1fcmFkZW9uX2dldHBhcmFtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fRkxJUCAgICAgICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9GTElQKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0FMTE9DICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fQUxMT0MsIGRybV9yYWRlb25fbWVtX2FsbG9jX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fRlJFRSAgICAgICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9GUkVFLCBkcm1fcmFkZW9uX21lbV9mcmVlX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fSU5JVF9IRUFQICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9JTklUX0hFQVAsIGRybV9yYWRlb25fbWVtX2luaXRfaGVhcF90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0lSUV9FTUlUICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fSVJRX0VNSVQsIGRybV9yYWRlb25faXJxX2VtaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9JUlFfV0FJVCAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0lSUV9XQUlULCBkcm1fcmFkZW9uX2lycV93YWl0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fQ1BfUkVTVU1FICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9DUF9SRVNVTUUpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fU0VUUEFSQU0gICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9TRVRQQVJBTSwgZHJtX3JhZGVvbl9zZXRwYXJhbV90KQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX1NVUkZfQUxMT0MgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fU1VSRl9BTExPQywgZHJtX3JhZGVvbl9zdXJmYWNlX2FsbG9jX3QpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fU1VSRl9GUkVFICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9TVVJGX0ZSRUUsIGRybV9yYWRlb25fc3VyZmFjZV9mcmVlX3QpCisvKiBLTVMgKi8KKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9HRU1fSU5GTwlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9HRU1fSU5GTywgc3RydWN0IGRybV9yYWRlb25fZ2VtX2luZm8pCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fR0VNX0NSRUFURQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9HRU1fQ1JFQVRFLCBzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fY3JlYXRlKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0dFTV9NTUFQCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0dFTV9NTUFQLCBzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fbW1hcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9HRU1fUFJFQUQJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fR0VNX1BSRUFELCBzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fcHJlYWQpCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fR0VNX1BXUklURQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9HRU1fUFdSSVRFLCBzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fcHdyaXRlKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0dFTV9TRVRfRE9NQUlOCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0dFTV9TRVRfRE9NQUlOLCBzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fc2V0X2RvbWFpbikKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9HRU1fV0FJVF9JRExFCURSTV9JT1coRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fR0VNX1dBSVRfSURMRSwgc3RydWN0IGRybV9yYWRlb25fZ2VtX3dhaXRfaWRsZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9DUwkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fQ1MsIHN0cnVjdCBkcm1fcmFkZW9uX2NzKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0lORk8JCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0lORk8sIHN0cnVjdCBkcm1fcmFkZW9uX2luZm8pCisjZGVmaW5lIERSTV9JT0NUTF9SQURFT05fR0VNX1NFVF9USUxJTkcJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9SQURFT05fR0VNX1NFVF9USUxJTkcsIHN0cnVjdCBkcm1fcmFkZW9uX2dlbV9zZXRfdGlsaW5nKQorI2RlZmluZSBEUk1fSU9DVExfUkFERU9OX0dFTV9HRVRfVElMSU5HCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fUkFERU9OX0dFTV9HRVRfVElMSU5HLCBzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fZ2V0X3RpbGluZykKKyNkZWZpbmUgRFJNX0lPQ1RMX1JBREVPTl9HRU1fQlVTWQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1JBREVPTl9HRU1fQlVTWSwgc3RydWN0IGRybV9yYWRlb25fZ2VtX2J1c3kpCisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25faW5pdCB7CisJZW51bSB7CisJCVJBREVPTl9JTklUX0NQID0gMHgwMSwKKwkJUkFERU9OX0NMRUFOVVBfQ1AgPSAweDAyLAorCQlSQURFT05fSU5JVF9SMjAwX0NQID0gMHgwMywKKwkJUkFERU9OX0lOSVRfUjMwMF9DUCA9IDB4MDQsCisJCVJBREVPTl9JTklUX1I2MDBfQ1AgPSAweDA1CisJfSBmdW5jOworCXVuc2lnbmVkIGxvbmcgc2FyZWFfcHJpdl9vZmZzZXQ7CisJaW50IGlzX3BjaTsKKwlpbnQgY3BfbW9kZTsKKwlpbnQgZ2FydF9zaXplOworCWludCByaW5nX3NpemU7CisJaW50IHVzZWNfdGltZW91dDsKKworCXVuc2lnbmVkIGludCBmYl9icHA7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldCwgZnJvbnRfcGl0Y2g7CisJdW5zaWduZWQgaW50IGJhY2tfb2Zmc2V0LCBiYWNrX3BpdGNoOworCXVuc2lnbmVkIGludCBkZXB0aF9icHA7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldCwgZGVwdGhfcGl0Y2g7CisKKwl1bnNpZ25lZCBsb25nIGZiX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIG1taW9fb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgcmluZ19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyByaW5nX3JwdHJfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgYnVmZmVyc19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBnYXJ0X3RleHR1cmVzX29mZnNldDsKK30gZHJtX3JhZGVvbl9pbml0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fY3Bfc3RvcCB7CisJaW50IGZsdXNoOworCWludCBpZGxlOworfSBkcm1fcmFkZW9uX2NwX3N0b3BfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9mdWxsc2NyZWVuIHsKKwllbnVtIHsKKwkJUkFERU9OX0lOSVRfRlVMTFNDUkVFTiA9IDB4MDEsCisJCVJBREVPTl9DTEVBTlVQX0ZVTExTQ1JFRU4gPSAweDAyCisJfSBmdW5jOworfSBkcm1fcmFkZW9uX2Z1bGxzY3JlZW5fdDsKKworI2RlZmluZSBDTEVBUl9YMQkwCisjZGVmaW5lIENMRUFSX1kxCTEKKyNkZWZpbmUgQ0xFQVJfWDIJMgorI2RlZmluZSBDTEVBUl9ZMgkzCisjZGVmaW5lIENMRUFSX0RFUFRICTQKKwordHlwZWRlZiB1bmlvbiBkcm1fcmFkZW9uX2NsZWFyX3JlY3QgeworCWZsb2F0IGZbNV07CisJdW5zaWduZWQgaW50IHVpWzVdOworfSBkcm1fcmFkZW9uX2NsZWFyX3JlY3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9jbGVhciB7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBjbGVhcl9jb2xvcjsKKwl1bnNpZ25lZCBpbnQgY2xlYXJfZGVwdGg7CisJdW5zaWduZWQgaW50IGNvbG9yX21hc2s7CisJdW5zaWduZWQgaW50IGRlcHRoX21hc2s7CS8qIG1pc25hbWVkIGZpZWxkOiAgc2hvdWxkIGJlIHN0ZW5jaWwgKi8KKwlkcm1fcmFkZW9uX2NsZWFyX3JlY3RfdCAqZGVwdGhfYm94ZXM7Cit9IGRybV9yYWRlb25fY2xlYXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl92ZXJ0ZXggeworCWludCBwcmltOworCWludCBpZHg7CQkvKiBJbmRleCBvZiB2ZXJ0ZXggYnVmZmVyICovCisJaW50IGNvdW50OwkJLyogTnVtYmVyIG9mIHZlcnRpY2VzIGluIGJ1ZmZlciAqLworCWludCBkaXNjYXJkOwkJLyogQ2xpZW50IGZpbmlzaGVkIHdpdGggYnVmZmVyPyAqLworfSBkcm1fcmFkZW9uX3ZlcnRleF90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2luZGljZXMgeworCWludCBwcmltOworCWludCBpZHg7CisJaW50IHN0YXJ0OworCWludCBlbmQ7CisJaW50IGRpc2NhcmQ7CQkvKiBDbGllbnQgZmluaXNoZWQgd2l0aCBidWZmZXI/ICovCit9IGRybV9yYWRlb25faW5kaWNlc190OworCisvKiB2MS4yIC0gb2Jzb2xldGVzIGRybV9yYWRlb25fdmVydGV4IGFuZCBkcm1fcmFkZW9uX2luZGljZXMKKyAqICAgICAgLSBhbGxvd3MgbXVsdGlwbGUgcHJpbWl0aXZlcyBhbmQgc3RhdGUgY2hhbmdlcyBpbiBhIHNpbmdsZSBpb2N0bAorICogICAgICAtIHN1cHBvcnRzIGRyaXZlciBjaGFuZ2UgdG8gZW1pdCBuYXRpdmUgcHJpbWl0aXZlcworICovCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3ZlcnRleDIgeworCWludCBpZHg7CQkvKiBJbmRleCBvZiB2ZXJ0ZXggYnVmZmVyICovCisJaW50IGRpc2NhcmQ7CQkvKiBDbGllbnQgZmluaXNoZWQgd2l0aCBidWZmZXI/ICovCisJaW50IG5yX3N0YXRlczsKKwlkcm1fcmFkZW9uX3N0YXRlX3QgKnN0YXRlOworCWludCBucl9wcmltczsKKwlkcm1fcmFkZW9uX3ByaW1fdCAqcHJpbTsKK30gZHJtX3JhZGVvbl92ZXJ0ZXgyX3Q7CisKKy8qIHYxLjMgLSBvYnNvbGV0ZXMgZHJtX3JhZGVvbl92ZXJ0ZXgyCisgKiAgICAgIC0gYWxsb3dzIGFyYml0cmFyaWx5IGxhcmdlIGNsaXByZWN0IGxpc3QKKyAqICAgICAgLSBhbGxvd3MgdXBkYXRpbmcgb2YgdGNsIHBhY2tldCwgdmVjdG9yIGFuZCBzY2FsYXIgc3RhdGUKKyAqICAgICAgLSBhbGxvd3MgbWVtb3J5LWVmZmljaWVudCBkZXNjcmlwdGlvbiBvZiBzdGF0ZSB1cGRhdGVzCisgKiAgICAgIC0gYWxsb3dzIHN0YXRlIHRvIGJlIGVtaXR0ZWQgd2l0aG91dCBhIHByaW1pdGl2ZQorICogICAgICAgICAgIChmb3IgY2xlYXJzLCBjdHggc3dpdGNoZXMpCisgKiAgICAgIC0gYWxsb3dzIG1vcmUgdGhhbiBvbmUgZG1hIGJ1ZmZlciB0byBiZSByZWZlcmVuY2VkIHBlciBpb2N0bAorICogICAgICAtIHN1cHBvcnRzIHRjbCBkcml2ZXIKKyAqICAgICAgLSBtYXkgYmUgZXh0ZW5kZWQgaW4gZnV0dXJlIHZlcnNpb25zIHdpdGggbmV3IGNtZCB0eXBlcywgcGFja2V0cworICovCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2NtZF9idWZmZXIgeworCWludCBidWZzejsKKwljaGFyICpidWY7CisJaW50IG5ib3g7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKmJveGVzOworfSBkcm1fcmFkZW9uX2NtZF9idWZmZXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl90ZXhfaW1hZ2UgeworCXVuc2lnbmVkIGludCB4LCB5OwkvKiBCbGl0IGNvb3JkaW5hdGVzICovCisJdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQ7CisJY29uc3Qgdm9pZCAqZGF0YTsKK30gZHJtX3JhZGVvbl90ZXhfaW1hZ2VfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl90ZXh0dXJlIHsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCWludCBwaXRjaDsKKwlpbnQgZm9ybWF0OworCWludCB3aWR0aDsJCS8qIFRleHR1cmUgaW1hZ2UgY29vcmRpbmF0ZXMgKi8KKwlpbnQgaGVpZ2h0OworCWRybV9yYWRlb25fdGV4X2ltYWdlX3QgKmltYWdlOworfSBkcm1fcmFkZW9uX3RleHR1cmVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9zdGlwcGxlIHsKKwl1bnNpZ25lZCBpbnQgKm1hc2s7Cit9IGRybV9yYWRlb25fc3RpcHBsZV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2luZGlyZWN0IHsKKwlpbnQgaWR4OworCWludCBzdGFydDsKKwlpbnQgZW5kOworCWludCBkaXNjYXJkOworfSBkcm1fcmFkZW9uX2luZGlyZWN0X3Q7CisKKy8qIGVudW0gZm9yIGNhcmQgdHlwZSBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFJBREVPTl9DQVJEX1BDSSAwCisjZGVmaW5lIFJBREVPTl9DQVJEX0FHUCAxCisjZGVmaW5lIFJBREVPTl9DQVJEX1BDSUUgMgorCisvKiAxLjM6IEFuIGlvY3RsIHRvIGdldCBwYXJhbWV0ZXJzIHRoYXQgYXJlbid0IGF2YWlsYWJsZSB0byB0aGUgM2QKKyAqIGNsaWVudCBhbnkgb3RoZXIgd2F5LgorICovCisjZGVmaW5lIFJBREVPTl9QQVJBTV9HQVJUX0JVRkZFUl9PRkZTRVQgICAgMQkvKiBjYXJkIG9mZnNldCBvZiAxc3QgR0FSVCBidWZmZXIgKi8KKyNkZWZpbmUgUkFERU9OX1BBUkFNX0xBU1RfRlJBTUUgICAgICAgICAgICAyCisjZGVmaW5lIFJBREVPTl9QQVJBTV9MQVNUX0RJU1BBVENIICAgICAgICAgMworI2RlZmluZSBSQURFT05fUEFSQU1fTEFTVF9DTEVBUiAgICAgICAgICAgIDQKKy8qIEFkZGVkIHdpdGggRFJNIHZlcnNpb24gMS42LiAqLworI2RlZmluZSBSQURFT05fUEFSQU1fSVJRX05SICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgUkFERU9OX1BBUkFNX0dBUlRfQkFTRSAgICAgICAgICAgICA2CS8qIGNhcmQgb2Zmc2V0IG9mIEdBUlQgYmFzZSAqLworLyogQWRkZWQgd2l0aCBEUk0gdmVyc2lvbiAxLjguICovCisjZGVmaW5lIFJBREVPTl9QQVJBTV9SRUdJU1RFUl9IQU5ETEUgICAgICAgNwkvKiBmb3IgZHJtTWFwKCkgKi8KKyNkZWZpbmUgUkFERU9OX1BBUkFNX1NUQVRVU19IQU5ETEUgICAgICAgICA4CisjZGVmaW5lIFJBREVPTl9QQVJBTV9TQVJFQV9IQU5ETEUgICAgICAgICAgOQorI2RlZmluZSBSQURFT05fUEFSQU1fR0FSVF9URVhfSEFORExFICAgICAgIDEwCisjZGVmaW5lIFJBREVPTl9QQVJBTV9TQ1JBVENIX09GRlNFVCAgICAgICAgMTEKKyNkZWZpbmUgUkFERU9OX1BBUkFNX0NBUkRfVFlQRSAgICAgICAgICAgICAxMgorI2RlZmluZSBSQURFT05fUEFSQU1fVkJMQU5LX0NSVEMgICAgICAgICAgIDEzICAgLyogVkJMQU5LIENSVEMgKi8KKyNkZWZpbmUgUkFERU9OX1BBUkFNX0ZCX0xPQ0FUSU9OICAgICAgICAgICAxNCAgIC8qIEZCIGxvY2F0aW9uICovCisjZGVmaW5lIFJBREVPTl9QQVJBTV9OVU1fR0JfUElQRVMgICAgICAgICAgMTUgICAvKiBudW0gR0IgcGlwZXMgKi8KKyNkZWZpbmUgUkFERU9OX1BBUkFNX0RFVklDRV9JRCAgICAgICAgICAgICAxNgorI2RlZmluZSBSQURFT05fUEFSQU1fTlVNX1pfUElQRVMgICAgICAgICAgIDE3ICAgLyogbnVtIFogcGlwZXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9nZXRwYXJhbSB7CisJaW50IHBhcmFtOworCXZvaWQgKnZhbHVlOworfSBkcm1fcmFkZW9uX2dldHBhcmFtX3Q7CisKKy8qIDEuNjogU2V0IHVwIGEgbWVtb3J5IG1hbmFnZXIgZm9yIHJlZ2lvbnMgb2Ygc2hhcmVkIG1lbW9yeToKKyAqLworI2RlZmluZSBSQURFT05fTUVNX1JFR0lPTl9HQVJUIDEKKyNkZWZpbmUgUkFERU9OX01FTV9SRUdJT05fRkIgICAyCisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fbWVtX2FsbG9jIHsKKwlpbnQgcmVnaW9uOworCWludCBhbGlnbm1lbnQ7CisJaW50IHNpemU7CisJaW50ICpyZWdpb25fb2Zmc2V0OwkvKiBvZmZzZXQgZnJvbSBzdGFydCBvZiBmYiBvciBHQVJUICovCit9IGRybV9yYWRlb25fbWVtX2FsbG9jX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fbWVtX2ZyZWUgeworCWludCByZWdpb247CisJaW50IHJlZ2lvbl9vZmZzZXQ7Cit9IGRybV9yYWRlb25fbWVtX2ZyZWVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9tZW1faW5pdF9oZWFwIHsKKwlpbnQgcmVnaW9uOworCWludCBzaXplOworCWludCBzdGFydDsKK30gZHJtX3JhZGVvbl9tZW1faW5pdF9oZWFwX3Q7CisKKy8qIDEuNjogVXNlcnNwYWNlIGNhbiByZXF1ZXN0ICYgd2FpdCBvbiBpcnEnczoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9pcnFfZW1pdCB7CisJaW50ICppcnFfc2VxOworfSBkcm1fcmFkZW9uX2lycV9lbWl0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25faXJxX3dhaXQgeworCWludCBpcnFfc2VxOworfSBkcm1fcmFkZW9uX2lycV93YWl0X3Q7CisKKy8qIDEuMTA6IENsaWVudHMgdGVsbCB0aGUgRFJNIHdoZXJlIHRoZXkgdGhpbmsgdGhlIGZyYW1lYnVmZmVyIGlzIGxvY2F0ZWQgaW4KKyAqIHRoZSBjYXJkJ3MgYWRkcmVzcyBzcGFjZSwgdmlhIGEgbmV3IGdlbmVyaWMgaW9jdGwgdG8gc2V0IHBhcmFtZXRlcnMKKyAqLworCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3NldHBhcmFtIHsKKwl1bnNpZ25lZCBpbnQgcGFyYW07CisJX19zNjQgdmFsdWU7Cit9IGRybV9yYWRlb25fc2V0cGFyYW1fdDsKKworI2RlZmluZSBSQURFT05fU0VUUEFSQU1fRkJfTE9DQVRJT04gICAgMQkvKiBkZXRlcm1pbmVkIGZyYW1lYnVmZmVyIGxvY2F0aW9uICovCisjZGVmaW5lIFJBREVPTl9TRVRQQVJBTV9TV0lUQ0hfVElMSU5HICAyCS8qIGVuYWJsZS9kaXNhYmxlIGNvbG9yIHRpbGluZyAqLworI2RlZmluZSBSQURFT05fU0VUUEFSQU1fUENJR0FSVF9MT0NBVElPTiAzCS8qIFBDSSBHYXJ0IExvY2F0aW9uICovCisjZGVmaW5lIFJBREVPTl9TRVRQQVJBTV9ORVdfTUVNTUFQIDQJCS8qIFVzZSBuZXcgbWVtb3J5IG1hcCAqLworI2RlZmluZSBSQURFT05fU0VUUEFSQU1fUENJR0FSVF9UQUJMRV9TSVpFIDUgICAgLyogUENJIEdBUlQgVGFibGUgU2l6ZSAqLworI2RlZmluZSBSQURFT05fU0VUUEFSQU1fVkJMQU5LX0NSVEMgNiAgICAgICAgICAgLyogVkJMQU5LIENSVEMgKi8KKy8qIDEuMTQ6IENsaWVudHMgY2FuIGFsbG9jYXRlL2ZyZWUgYSBzdXJmYWNlCisgKi8KK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fc3VyZmFjZV9hbGxvYyB7CisJdW5zaWduZWQgaW50IGFkZHJlc3M7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgaW50IGZsYWdzOworfSBkcm1fcmFkZW9uX3N1cmZhY2VfYWxsb2NfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9zdXJmYWNlX2ZyZWUgeworCXVuc2lnbmVkIGludCBhZGRyZXNzOworfSBkcm1fcmFkZW9uX3N1cmZhY2VfZnJlZV90OworCisjZGVmaW5lCURSTV9SQURFT05fVkJMQU5LX0NSVEMxCQkxCisjZGVmaW5lCURSTV9SQURFT05fVkJMQU5LX0NSVEMyCQkyCisKKy8qCisgKiBLZXJuZWwgbW9kZXNldHRpbmcgd29ybGQgYmVsb3cuCisgKi8KKyNkZWZpbmUgUkFERU9OX0dFTV9ET01BSU5fQ1BVCQkweDEKKyNkZWZpbmUgUkFERU9OX0dFTV9ET01BSU5fR1RUCQkweDIKKyNkZWZpbmUgUkFERU9OX0dFTV9ET01BSU5fVlJBTQkJMHg0CisKK3N0cnVjdCBkcm1fcmFkZW9uX2dlbV9pbmZvIHsKKwl1aW50NjRfdAlnYXJ0X3NpemU7CisJdWludDY0X3QJdnJhbV9zaXplOworCXVpbnQ2NF90CXZyYW1fdmlzaWJsZTsKK307CisKKyNkZWZpbmUgUkFERU9OX0dFTV9OT19CQUNLSU5HX1NUT1JFIDEKKworc3RydWN0IGRybV9yYWRlb25fZ2VtX2NyZWF0ZSB7CisJdWludDY0X3QJc2l6ZTsKKwl1aW50NjRfdAlhbGlnbm1lbnQ7CisJdWludDMyX3QJaGFuZGxlOworCXVpbnQzMl90CWluaXRpYWxfZG9tYWluOworCXVpbnQzMl90CWZsYWdzOworfTsKKworI2RlZmluZSBSQURFT05fVElMSU5HX01BQ1JPICAgICAgIDB4MQorI2RlZmluZSBSQURFT05fVElMSU5HX01JQ1JPICAgICAgIDB4MgorI2RlZmluZSBSQURFT05fVElMSU5HX1NXQVBfMTZCSVQgIDB4NAorI2RlZmluZSBSQURFT05fVElMSU5HX1NXQVBfMzJCSVQgIDB4OAorI2RlZmluZSBSQURFT05fVElMSU5HX1NVUkZBQ0UgICAgIDB4MTAgLyogdGhpcyBvYmplY3QgcmVxdWlyZXMgYSBzdXJmYWNlCisJCQkJCSogd2hlbiBtYXBwZWQgLSBpLmUuIGZyb250IGJ1ZmZlciAqLworI2RlZmluZSBSQURFT05fVElMSU5HX01JQ1JPX1NRVUFSRSAweDIwCisKK3N0cnVjdCBkcm1fcmFkZW9uX2dlbV9zZXRfdGlsaW5nIHsKKwl1aW50MzJfdAloYW5kbGU7CisJdWludDMyX3QJdGlsaW5nX2ZsYWdzOworCXVpbnQzMl90CXBpdGNoOworfTsKKworc3RydWN0IGRybV9yYWRlb25fZ2VtX2dldF90aWxpbmcgeworCXVpbnQzMl90CWhhbmRsZTsKKwl1aW50MzJfdAl0aWxpbmdfZmxhZ3M7CisJdWludDMyX3QJcGl0Y2g7Cit9OworCitzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fbW1hcCB7CisJdWludDMyX3QJaGFuZGxlOworCXVpbnQzMl90CXBhZDsKKwl1aW50NjRfdAlvZmZzZXQ7CisJdWludDY0X3QJc2l6ZTsKKwl1aW50NjRfdAlhZGRyX3B0cjsKK307CisKK3N0cnVjdCBkcm1fcmFkZW9uX2dlbV9zZXRfZG9tYWluIHsKKwl1aW50MzJfdAloYW5kbGU7CisJdWludDMyX3QJcmVhZF9kb21haW5zOworCXVpbnQzMl90CXdyaXRlX2RvbWFpbjsKK307CisKK3N0cnVjdCBkcm1fcmFkZW9uX2dlbV93YWl0X2lkbGUgeworCXVpbnQzMl90CWhhbmRsZTsKKwl1aW50MzJfdAlwYWQ7Cit9OworCitzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fYnVzeSB7CisJdWludDMyX3QJaGFuZGxlOworCXVpbnQzMl90ICAgICAgICBkb21haW47Cit9OworCitzdHJ1Y3QgZHJtX3JhZGVvbl9nZW1fcHJlYWQgeworCS8qKiBIYW5kbGUgZm9yIHRoZSBvYmplY3QgYmVpbmcgcmVhZC4gKi8KKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3QgcGFkOworCS8qKiBPZmZzZXQgaW50byB0aGUgb2JqZWN0IHRvIHJlYWQgZnJvbSAqLworCXVpbnQ2NF90IG9mZnNldDsKKwkvKiogTGVuZ3RoIG9mIGRhdGEgdG8gcmVhZCAqLworCXVpbnQ2NF90IHNpemU7CisJLyoqIFBvaW50ZXIgdG8gd3JpdGUgdGhlIGRhdGEgaW50by4gKi8KKwkvKiB2b2lkICosIGJ1dCBwb2ludGVycyBhcmUgbm90IDMyLzY0IGNvbXBhdGlibGUgKi8KKwl1aW50NjRfdCBkYXRhX3B0cjsKK307CisKK3N0cnVjdCBkcm1fcmFkZW9uX2dlbV9wd3JpdGUgeworCS8qKiBIYW5kbGUgZm9yIHRoZSBvYmplY3QgYmVpbmcgd3JpdHRlbiB0by4gKi8KKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3QgcGFkOworCS8qKiBPZmZzZXQgaW50byB0aGUgb2JqZWN0IHRvIHdyaXRlIHRvICovCisJdWludDY0X3Qgb2Zmc2V0OworCS8qKiBMZW5ndGggb2YgZGF0YSB0byB3cml0ZSAqLworCXVpbnQ2NF90IHNpemU7CisJLyoqIFBvaW50ZXIgdG8gcmVhZCB0aGUgZGF0YSBmcm9tLiAqLworCS8qIHZvaWQgKiwgYnV0IHBvaW50ZXJzIGFyZSBub3QgMzIvNjQgY29tcGF0aWJsZSAqLworCXVpbnQ2NF90IGRhdGFfcHRyOworfTsKKworI2RlZmluZSBSQURFT05fQ0hVTktfSURfUkVMT0NTCTB4MDEKKyNkZWZpbmUgUkFERU9OX0NIVU5LX0lEX0lCCTB4MDIKKyNkZWZpbmUgUkFERU9OX0NIVU5LX0lEX0ZMQUdTCTB4MDMKKworLyogVGhlIGZpcnN0IGR3b3JkIG9mIFJBREVPTl9DSFVOS19JRF9GTEFHUyBpcyBhIHVpbnQzMiBvZiB0aGVzZSBmbGFnczogKi8KKyNkZWZpbmUgUkFERU9OX0NTX0tFRVBfVElMSU5HX0ZMQUdTIDB4MDEKKworc3RydWN0IGRybV9yYWRlb25fY3NfY2h1bmsgeworCXVpbnQzMl90CQljaHVua19pZDsKKwl1aW50MzJfdAkJbGVuZ3RoX2R3OworCXVpbnQ2NF90CQljaHVua19kYXRhOworfTsKKworc3RydWN0IGRybV9yYWRlb25fY3NfcmVsb2MgeworCXVpbnQzMl90CQloYW5kbGU7CisJdWludDMyX3QJCXJlYWRfZG9tYWluczsKKwl1aW50MzJfdAkJd3JpdGVfZG9tYWluOworCXVpbnQzMl90CQlmbGFnczsKK307CisKK3N0cnVjdCBkcm1fcmFkZW9uX2NzIHsKKwl1aW50MzJfdAkJbnVtX2NodW5rczsKKwl1aW50MzJfdAkJY3NfaWQ7CisJLyogdGhpcyBwb2ludHMgdG8gdWludDY0X3QgKiB3aGljaCBwb2ludCB0byBjcyBjaHVua3MgKi8KKwl1aW50NjRfdAkJY2h1bmtzOworCS8qIHVwZGF0ZXMgdG8gdGhlIGxpbWl0cyBhZnRlciB0aGlzIENTIGlvY3RsICovCisJdWludDY0X3QJCWdhcnRfbGltaXQ7CisJdWludDY0X3QJCXZyYW1fbGltaXQ7Cit9OworCisjZGVmaW5lIFJBREVPTl9JTkZPX0RFVklDRV9JRAkJMHgwMAorI2RlZmluZSBSQURFT05fSU5GT19OVU1fR0JfUElQRVMJMHgwMQorI2RlZmluZSBSQURFT05fSU5GT19OVU1fWl9QSVBFUyAJMHgwMgorI2RlZmluZSBSQURFT05fSU5GT19BQ0NFTF9XT1JLSU5HCTB4MDMKKyNkZWZpbmUgUkFERU9OX0lORk9fQ1JUQ19GUk9NX0lECTB4MDQKKyNkZWZpbmUgUkFERU9OX0lORk9fQUNDRUxfV09SS0lORzIJMHgwNQorI2RlZmluZSBSQURFT05fSU5GT19USUxJTkdfQ09ORklHCTB4MDYKKyNkZWZpbmUgUkFERU9OX0lORk9fV0FOVF9IWVBFUloJCTB4MDcKKyNkZWZpbmUgUkFERU9OX0lORk9fV0FOVF9DTUFTSwkJMHgwOCAvKiBnZXQgYWNjZXNzIHRvIENNQVNLIG9uIHIzMDAgKi8KKyNkZWZpbmUgUkFERU9OX0lORk9fQ0xPQ0tfQ1JZU1RBTF9GUkVRCTB4MDkgLyogY2xvY2sgY3J5c3RhbCBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgUkFERU9OX0lORk9fTlVNX0JBQ0tFTkRTCTB4MGEgLyogREIvYmFja2VuZHMgZm9yIHI2MDArIC0gbmVlZCBmb3IgT1EgKi8KKyNkZWZpbmUgUkFERU9OX0lORk9fTlVNX1RJTEVfUElQRVMJMHgwYiAvKiB0aWxlIHBpcGVzIGZvciByNjAwKyAqLworI2RlZmluZSBSQURFT05fSU5GT19GVVNJT05fR0FSVF9XT1JLSU5HCTB4MGMgLyogZnVzaW9uIHdyaXRlcyB0byBHVFQgd2VyZSBicm9rZW4gYmVmb3JlIHRoaXMgKi8KKyNkZWZpbmUgUkFERU9OX0lORk9fQkFDS0VORF9NQVAJCTB4MGQgLyogcGlwZSB0byBiYWNrZW5kIG1hcCwgbmVlZGVkIGJ5IG1lc2EgKi8KKworc3RydWN0IGRybV9yYWRlb25faW5mbyB7CisJdWludDMyX3QJCXJlcXVlc3Q7CisJdWludDMyX3QJCXBhZDsKKwl1aW50NjRfdAkJdmFsdWU7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL3NhdmFnZV9kcm0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL3NhdmFnZV9kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWRmOTM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vc2F2YWdlX2RybS5oCkBAIC0wLDAgKzEsMjEwIEBACisvKiBzYXZhZ2VfZHJtLmggLS0gUHVibGljIGhlYWRlciBmb3IgdGhlIHNhdmFnZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwNCAgRmVsaXggS3VlaGxpbmcKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBGRUxJWCBLVUVITElORyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRgorICogQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fU0FWQUdFX0RSTV9IX18KKyNkZWZpbmUgX19TQVZBR0VfRFJNX0hfXworCisjaWZuZGVmIF9fU0FWQUdFX1NBUkVBX0RFRklORVNfXworI2RlZmluZSBfX1NBVkFHRV9TQVJFQV9ERUZJTkVTX18KKworLyogMiBoZWFwcyAoMSBmb3IgY2FyZCwgMSBmb3IgYWdwKSwgZWFjaCBkaXZpZGVkIGludG8gdXAgdG8gMTI4CisgKiByZWdpb25zLCBzdWJqZWN0IHRvIGEgbWluaW11bSByZWdpb24gc2l6ZSBvZiAoMTw8MTYpID09IDY0ay4KKyAqCisgKiBDbGllbnRzIG1heSBzdWJkaXZpZGUgcmVnaW9ucyBpbnRlcm5hbGx5LCBidXQgd2hlbiBzaGFyaW5nIGJldHdlZW4KKyAqIGNsaWVudHMsIHRoZSByZWdpb24gc2l6ZSBpcyB0aGUgbWluaW11bSBncmFudWxhcml0eS4KKyAqLworCisjZGVmaW5lIFNBVkFHRV9DQVJEX0hFQVAJCTAKKyNkZWZpbmUgU0FWQUdFX0FHUF9IRUFQCQkJMQorI2RlZmluZSBTQVZBR0VfTlJfVEVYX0hFQVBTCQkyCisjZGVmaW5lIFNBVkFHRV9OUl9URVhfUkVHSU9OUwkJMTYKKyNkZWZpbmUgU0FWQUdFX0xPR19NSU5fVEVYX1JFR0lPTl9TSVpFCTE2CisKKyNlbmRpZgkJCQkvKiBfX1NBVkFHRV9TQVJFQV9ERUZJTkVTX18gKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9zYXZhZ2Vfc2FyZWEgeworCS8qIExSVSBsaXN0cyBmb3IgdGV4dHVyZSBtZW1vcnkgaW4gYWdwIHNwYWNlIGFuZCBvbiB0aGUgY2FyZC4KKwkgKi8KKwlzdHJ1Y3QgZHJtX3RleF9yZWdpb24gdGV4TGlzdFtTQVZBR0VfTlJfVEVYX0hFQVBTXVtTQVZBR0VfTlJfVEVYX1JFR0lPTlMgKworCQkJCQkJICAgICAgMV07CisJdW5zaWduZWQgaW50IHRleEFnZVtTQVZBR0VfTlJfVEVYX0hFQVBTXTsKKworCS8qIE1lY2hhbmlzbSB0byB2YWxpZGF0ZSBjYXJkIHN0YXRlLgorCSAqLworCWludCBjdHhPd25lcjsKK30gZHJtX3NhdmFnZV9zYXJlYV90LCAqZHJtX3NhdmFnZV9zYXJlYV9wdHI7CisKKy8qIFNhdmFnZS1zcGVjaWZpYyBpb2N0bHMKKyAqLworI2RlZmluZSBEUk1fU0FWQUdFX0JDSV9JTklUCQkweDAwCisjZGVmaW5lIERSTV9TQVZBR0VfQkNJX0NNREJVRiAgICAgICAgICAgMHgwMQorI2RlZmluZSBEUk1fU0FWQUdFX0JDSV9FVkVOVF9FTUlUCTB4MDIKKyNkZWZpbmUgRFJNX1NBVkFHRV9CQ0lfRVZFTlRfV0FJVAkweDAzCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1NBVkFHRV9CQ0lfSU5JVAkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TQVZBR0VfQkNJX0lOSVQsIGRybV9zYXZhZ2VfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfU0FWQUdFX0JDSV9DTURCVUYJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fU0FWQUdFX0JDSV9DTURCVUYsIGRybV9zYXZhZ2VfY21kYnVmX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TQVZBR0VfQkNJX0VWRU5UX0VNSVQJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TQVZBR0VfQkNJX0VWRU5UX0VNSVQsIGRybV9zYXZhZ2VfZXZlbnRfZW1pdF90KQorI2RlZmluZSBEUk1fSU9DVExfU0FWQUdFX0JDSV9FVkVOVF9XQUlUCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fU0FWQUdFX0JDSV9FVkVOVF9XQUlULCBkcm1fc2F2YWdlX2V2ZW50X3dhaXRfdCkKKworI2RlZmluZSBTQVZBR0VfRE1BX1BDSQkxCisjZGVmaW5lIFNBVkFHRV9ETUFfQUdQCTMKK3R5cGVkZWYgc3RydWN0IGRybV9zYXZhZ2VfaW5pdCB7CisJZW51bSB7CisJCVNBVkFHRV9JTklUX0JDSSA9IDEsCisJCVNBVkFHRV9DTEVBTlVQX0JDSSA9IDIKKwl9IGZ1bmM7CisJdW5zaWduZWQgaW50IHNhcmVhX3ByaXZfb2Zmc2V0OworCisJLyogc29tZSBwYXJhbWV0ZXJzICovCisJdW5zaWduZWQgaW50IGNvYl9zaXplOworCXVuc2lnbmVkIGludCBiY2lfdGhyZXNob2xkX2xvLCBiY2lfdGhyZXNob2xkX2hpOworCXVuc2lnbmVkIGludCBkbWFfdHlwZTsKKworCS8qIGZyYW1lIGJ1ZmZlciBsYXlvdXQgKi8KKwl1bnNpZ25lZCBpbnQgZmJfYnBwOworCXVuc2lnbmVkIGludCBmcm9udF9vZmZzZXQsIGZyb250X3BpdGNoOworCXVuc2lnbmVkIGludCBiYWNrX29mZnNldCwgYmFja19waXRjaDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfYnBwOworCXVuc2lnbmVkIGludCBkZXB0aF9vZmZzZXQsIGRlcHRoX3BpdGNoOworCisJLyogbG9jYWwgdGV4dHVyZXMgKi8KKwl1bnNpZ25lZCBpbnQgdGV4dHVyZV9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHRleHR1cmVfc2l6ZTsKKworCS8qIHBoeXNpY2FsIGxvY2F0aW9ucyBvZiBub24tcGVybWFuZW50IG1hcHMgKi8KKwl1bnNpZ25lZCBsb25nIHN0YXR1c19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBidWZmZXJzX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGFncF90ZXh0dXJlc19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBjbWRfZG1hX29mZnNldDsKK30gZHJtX3NhdmFnZV9pbml0X3Q7CisKK3R5cGVkZWYgdW5pb24gZHJtX3NhdmFnZV9jbWRfaGVhZGVyIGRybV9zYXZhZ2VfY21kX2hlYWRlcl90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NhdmFnZV9jbWRidWYgeworCS8qIGNvbW1hbmQgYnVmZmVyIGluIGNsaWVudCdzIGFkZHJlc3Mgc3BhY2UgKi8KKwlkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCAqY21kX2FkZHI7CisJdW5zaWduZWQgaW50IHNpemU7CS8qIHNpemUgb2YgdGhlIGNvbW1hbmQgYnVmZmVyIGluIDY0Yml0IHVuaXRzICovCisKKwl1bnNpZ25lZCBpbnQgZG1hX2lkeDsJLyogRE1BIGJ1ZmZlciBpbmRleCB0byB1c2UgKi8KKwlpbnQgZGlzY2FyZDsJCS8qIGRpc2NhcmQgRE1BIGJ1ZmZlciB3aGVuIGRvbmUgKi8KKwkvKiB2ZXJ0ZXggYnVmZmVyIGluIGNsaWVudCdzIGFkZHJlc3Mgc3BhY2UgKi8KKwl1bnNpZ25lZCBpbnQgKnZiX2FkZHI7CisJdW5zaWduZWQgaW50IHZiX3NpemU7CS8qIHNpemUgb2YgY2xpZW50IHZlcnRleCBidWZmZXIgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBpbnQgdmJfc3RyaWRlOwkvKiBzdHJpZGUgb2YgdmVydGljZXMgaW4gMzJiaXQgd29yZHMgKi8KKwkvKiBib3hlcyBpbiBjbGllbnQncyBhZGRyZXNzIHNwYWNlICovCisJc3RydWN0IGRybV9jbGlwX3JlY3QgKmJveF9hZGRyOworCXVuc2lnbmVkIGludCBuYm94OwkvKiBudW1iZXIgb2YgY2xpcHBpbmcgYm94ZXMgKi8KK30gZHJtX3NhdmFnZV9jbWRidWZfdDsKKworI2RlZmluZSBTQVZBR0VfV0FJVF8yRCAgMHgxCS8qIHdhaXQgZm9yIDJEIGlkbGUgYmVmb3JlIHVwZGF0aW5nIGV2ZW50IHRhZyAqLworI2RlZmluZSBTQVZBR0VfV0FJVF8zRCAgMHgyCS8qIHdhaXQgZm9yIDNEIGlkbGUgYmVmb3JlIHVwZGF0aW5nIGV2ZW50IHRhZyAqLworI2RlZmluZSBTQVZBR0VfV0FJVF9JUlEgMHg0CS8qIGVtaXQgb3Igd2FpdCBmb3IgSVJRLCBub3QgaW1wbGVtZW50ZWQgeWV0ICovCit0eXBlZGVmIHN0cnVjdCBkcm1fc2F2YWdlX2V2ZW50IHsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJdW5zaWduZWQgaW50IGZsYWdzOworfSBkcm1fc2F2YWdlX2V2ZW50X2VtaXRfdCwgZHJtX3NhdmFnZV9ldmVudF93YWl0X3Q7CisKKy8qIENvbW1hbmRzIGZvciB0aGUgY21kYnVmIGlvY3RsCisgKi8KKyNkZWZpbmUgU0FWQUdFX0NNRF9TVEFURQkwCS8qIGEgcmFuZ2Ugb2Ygc3RhdGUgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNBVkFHRV9DTURfRE1BX1BSSU0JMQkvKiB2ZXJ0aWNlcyBmcm9tIERNQSBidWZmZXIgKi8KKyNkZWZpbmUgU0FWQUdFX0NNRF9WQl9QUklNCTIJLyogdmVydGljZXMgZnJvbSBjbGllbnQgdmVydGV4IGJ1ZmZlciAqLworI2RlZmluZSBTQVZBR0VfQ01EX0RNQV9JRFgJMwkvKiBpbmRleGVkIHZlcnRpY2VzIGZyb20gRE1BIGJ1ZmZlciAqLworI2RlZmluZSBTQVZBR0VfQ01EX1ZCX0lEWAk0CS8qIGluZGV4ZWQgdmVydGljZXMgY2xpZW50IHZlcnRleCBidWZmZXIgKi8KKyNkZWZpbmUgU0FWQUdFX0NNRF9DTEVBUgk1CS8qIGNsZWFyIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgU0FWQUdFX0NNRF9TV0FQCQk2CS8qIHN3YXAgYnVmZmVycyAqLworCisvKiBQcmltaXRpdmUgdHlwZXMKKyovCisjZGVmaW5lIFNBVkFHRV9QUklNX1RSSUxJU1QJMAkvKiB0cmlhbmdsZSBsaXN0ICovCisjZGVmaW5lIFNBVkFHRV9QUklNX1RSSVNUUklQCTEJLyogdHJpYW5nbGUgc3RyaXAgKi8KKyNkZWZpbmUgU0FWQUdFX1BSSU1fVFJJRkFOCTIJLyogdHJpYW5nbGUgZmFuICovCisjZGVmaW5lIFNBVkFHRV9QUklNX1RSSUxJU1RfMjAxCTMJLyogcmVvcmRlciB2ZXJ0cyBmb3IgY29ycmVjdCBmbGF0CisJCQkJCSAqIHNoYWRpbmcgb24gczNkICovCisKKy8qIFNraXAgZmxhZ3MgKHZlcnRleCBmb3JtYXQpCisgKi8KKyNkZWZpbmUgU0FWQUdFX1NLSVBfWgkJMHgwMQorI2RlZmluZSBTQVZBR0VfU0tJUF9XCQkweDAyCisjZGVmaW5lIFNBVkFHRV9TS0lQX0MwCQkweDA0CisjZGVmaW5lIFNBVkFHRV9TS0lQX0MxCQkweDA4CisjZGVmaW5lIFNBVkFHRV9TS0lQX1MwCQkweDEwCisjZGVmaW5lIFNBVkFHRV9TS0lQX1QwCQkweDIwCisjZGVmaW5lIFNBVkFHRV9TS0lQX1NUMAkJMHgzMAorI2RlZmluZSBTQVZBR0VfU0tJUF9TMQkJMHg0MAorI2RlZmluZSBTQVZBR0VfU0tJUF9UMQkJMHg4MAorI2RlZmluZSBTQVZBR0VfU0tJUF9TVDEJCTB4YzAKKyNkZWZpbmUgU0FWQUdFX1NLSVBfQUxMX1MzRAkweDNmCisjZGVmaW5lIFNBVkFHRV9TS0lQX0FMTF9TNAkweGZmCisKKy8qIEJ1ZmZlciBuYW1lcyBmb3IgY2xlYXIgY29tbWFuZAorICovCisjZGVmaW5lIFNBVkFHRV9GUk9OVAkJMHgxCisjZGVmaW5lIFNBVkFHRV9CQUNLCQkweDIKKyNkZWZpbmUgU0FWQUdFX0RFUFRICQkweDQKKworLyogNjQtYml0IGNvbW1hbmQgaGVhZGVyCisgKi8KK3VuaW9uIGRybV9zYXZhZ2VfY21kX2hlYWRlciB7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWQ7CS8qIGNvbW1hbmQgKi8KKwkJdW5zaWduZWQgY2hhciBwYWQwOworCQl1bnNpZ25lZCBzaG9ydCBwYWQxOworCQl1bnNpZ25lZCBzaG9ydCBwYWQyOworCQl1bnNpZ25lZCBzaG9ydCBwYWQzOworCX0gY21kOwkJCS8qIGdlbmVyaWMgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZDsKKwkJdW5zaWduZWQgY2hhciBnbG9iYWw7CS8qIG5lZWQgaWRsZSBlbmdpbmU/ICovCisJCXVuc2lnbmVkIHNob3J0IGNvdW50OwkvKiBudW1iZXIgb2YgY29uc2VjdXRpdmUgcmVnaXN0ZXJzICovCisJCXVuc2lnbmVkIHNob3J0IHN0YXJ0OwkvKiBmaXJzdCByZWdpc3RlciAqLworCQl1bnNpZ25lZCBzaG9ydCBwYWQzOworCX0gc3RhdGU7CQkvKiBTQVZBR0VfQ01EX1NUQVRFICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWQ7CisJCXVuc2lnbmVkIGNoYXIgcHJpbTsJLyogcHJpbWl0aXZlIHR5cGUgKi8KKwkJdW5zaWduZWQgc2hvcnQgc2tpcDsJLyogdmVydGV4IGZvcm1hdCAoc2tpcCBmbGFncykgKi8KKwkJdW5zaWduZWQgc2hvcnQgY291bnQ7CS8qIG51bWJlciBvZiB2ZXJ0aWNlcyAqLworCQl1bnNpZ25lZCBzaG9ydCBzdGFydDsJLyogZmlyc3QgdmVydGV4IGluIERNQS92ZXJ0ZXggYnVmZmVyICovCisJfSBwcmltOwkJCS8qIFNBVkFHRV9DTURfRE1BX1BSSU0sIFNBVkFHRV9DTURfVkJfUFJJTSAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgY21kOworCQl1bnNpZ25lZCBjaGFyIHByaW07CisJCXVuc2lnbmVkIHNob3J0IHNraXA7CisJCXVuc2lnbmVkIHNob3J0IGNvdW50OwkvKiBudW1iZXIgb2YgaW5kaWNlcyB0aGF0IGZvbGxvdyAqLworCQl1bnNpZ25lZCBzaG9ydCBwYWQzOworCX0gaWR4OwkJCS8qIFNBVkFHRV9DTURfRE1BX0lEWCwgU0FWQUdFX0NNRF9WQl9JRFggKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZDsKKwkJdW5zaWduZWQgY2hhciBwYWQwOworCQl1bnNpZ25lZCBzaG9ydCBwYWQxOworCQl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJfSBjbGVhcjA7CQkvKiBTQVZBR0VfQ01EX0NMRUFSICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IG1hc2s7CisJCXVuc2lnbmVkIGludCB2YWx1ZTsKKwl9IGNsZWFyMTsJCS8qIFNBVkFHRV9DTURfQ0xFQVIgZGF0YSAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2RybS9zaXNfZHJtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2RybS9zaXNfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmN2IzOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL3Npc19kcm0uaApAQCAtMCwwICsxLDY3IEBACisvKiBzaXNfZHJ2LmggLS0gUHJpdmF0ZSBoZWFkZXIgZm9yIHNpcyBkcml2ZXIgLSotIGxpbnV4LWMgLSotICovCisvKgorICogQ29weXJpZ2h0IDIwMDUgRXJpYyBBbmhvbHQKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9fU0lTX0RSTV9IX18KKyNkZWZpbmUgX19TSVNfRFJNX0hfXworCisvKiBTaVMgc3BlY2lmaWMgaW9jdGxzICovCisjZGVmaW5lIE5PVF9VU0VEXzBfMworI2RlZmluZSBEUk1fU0lTX0ZCX0FMTE9DCTB4MDQKKyNkZWZpbmUgRFJNX1NJU19GQl9GUkVFCSAgICAgICAgMHgwNQorI2RlZmluZSBOT1RfVVNFRF82XzEyCisjZGVmaW5lIERSTV9TSVNfQUdQX0lOSVQJMHgxMworI2RlZmluZSBEUk1fU0lTX0FHUF9BTExPQwkweDE0CisjZGVmaW5lIERSTV9TSVNfQUdQX0ZSRUUJMHgxNQorI2RlZmluZSBEUk1fU0lTX0ZCX0lOSVQJICAgICAgICAweDE2CisKKyNkZWZpbmUgRFJNX0lPQ1RMX1NJU19GQl9BTExPQwkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TSVNfRkJfQUxMT0MsIGRybV9zaXNfbWVtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfRkJfRlJFRQkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TSVNfRkJfRlJFRSwgZHJtX3Npc19tZW1fdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NJU19BR1BfSU5JVAkJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9TSVNfQUdQX0lOSVQsIGRybV9zaXNfYWdwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfQUdQX0FMTE9DCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1NJU19BR1BfQUxMT0MsIGRybV9zaXNfbWVtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfQUdQX0ZSRUUJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fU0lTX0FHUF9GUkVFLCBkcm1fc2lzX21lbV90KQorI2RlZmluZSBEUk1fSU9DVExfU0lTX0ZCX0lOSVQJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fU0lTX0ZCX0lOSVQsIGRybV9zaXNfZmJfdCkKKy8qCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfRkxJUAkJRFJNX0lPVyggMHg0OCwgZHJtX3Npc19mbGlwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TSVNfRkxJUF9JTklUCQlEUk1fSU8oICAweDQ5KQorI2RlZmluZSBEUk1fSU9DVExfU0lTX0ZMSVBfRklOQUwJRFJNX0lPKCAgMHg1MCkKKyovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgY29udGV4dDsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGxvbmcgZnJlZTsKK30gZHJtX3Npc19tZW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBvZmZzZXQsIHNpemU7Cit9IGRybV9zaXNfYWdwX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBzaXplOworfSBkcm1fc2lzX2ZiX3Q7CisKKyNlbmRpZgkJCQkvKiBfX1NJU19EUk1fSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2RybS92aWFfZHJtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2RybS92aWFfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhNGFjMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZHJtL3ZpYV9kcm0uaApAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDMgVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwMyBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVklBLCBTMyBHUkFQSElDUywgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgX1ZJQV9EUk1fSF8KKyNkZWZpbmUgX1ZJQV9EUk1fSF8KKworI2luY2x1ZGUgPGRybS9kcm0uaD4KKworLyogV0FSTklORzogVGhlc2UgZGVmaW5lcyBtdXN0IGJlIHRoZSBzYW1lIGFzIHdoYXQgdGhlIFhzZXJ2ZXIgdXNlcy4KKyAqIGlmIHlvdSBjaGFuZ2UgdGhlbSwgeW91IG11c3QgY2hhbmdlIHRoZSBkZWZpbmVzIGluIHRoZSBYc2VydmVyLgorICovCisKKyNpZm5kZWYgX1ZJQV9ERUZJTkVTXworI2RlZmluZSBfVklBX0RFRklORVNfCisKKyNpbmNsdWRlIDxkcm0vdmlhX2RybWNsaWVudC5oPgorCisjZGVmaW5lIFZJQV9OUl9TQVJFQV9DTElQUkVDVFMJCTgKKyNkZWZpbmUgVklBX05SX1hWTUNfUE9SVFMgICAgICAgICAgICAgICAxMAorI2RlZmluZSBWSUFfTlJfWFZNQ19MT0NLUyAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgVklBX01BWF9DQUNIRUxJTkVfU0laRSAgICAgICAgICA2NAorI2RlZmluZSBYVk1DTE9DS1BUUihzYVByaXYsbG9ja05vKQkJCQkJXAorCSgoX192b2xhdGlsZV9fIHN0cnVjdCBkcm1faHdfbG9jayAqKSgoKCgodW5zaWduZWQgbG9uZykgKHNhUHJpdiktPlh2TUNMb2NrQXJlYSkgKyBcCisJCQkJICAgICAgKFZJQV9NQVhfQ0FDSEVMSU5FX1NJWkUgLSAxKSkgJglcCisJCQkJICAgICB+KFZJQV9NQVhfQ0FDSEVMSU5FX1NJWkUgLSAxKSkgKwlcCisJCQkJICAgIFZJQV9NQVhfQ0FDSEVMSU5FX1NJWkUqKGxvY2tObykpKQorCisvKiBFYWNoIHJlZ2lvbiBpcyBhIG1pbmltdW0gb2YgNjRrLCBhbmQgdGhlcmUgYXJlIGF0IG1vc3QgNjQgb2YgdGhlbS4KKyAqLworI2RlZmluZSBWSUFfTlJfVEVYX1JFR0lPTlMgNjQKKyNkZWZpbmUgVklBX0xPR19NSU5fVEVYX1JFR0lPTl9TSVpFIDE2CisjZW5kaWYKKworI2RlZmluZSBWSUFfVVBMT0FEX1RFWDBJTUFHRSAgMHgxCS8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBWSUFfVVBMT0FEX1RFWDFJTUFHRSAgMHgyCS8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBWSUFfVVBMT0FEX0NUWCAgICAgICAgMHg0CisjZGVmaW5lIFZJQV9VUExPQURfQlVGRkVSUyAgICAweDgKKyNkZWZpbmUgVklBX1VQTE9BRF9URVgwICAgICAgIDB4MTAKKyNkZWZpbmUgVklBX1VQTE9BRF9URVgxICAgICAgIDB4MjAKKyNkZWZpbmUgVklBX1VQTE9BRF9DTElQUkVDVFMgIDB4NDAKKyNkZWZpbmUgVklBX1VQTE9BRF9BTEwgICAgICAgIDB4ZmYKKworLyogVklBIHNwZWNpZmljIGlvY3RscyAqLworI2RlZmluZSBEUk1fVklBX0FMTE9DTUVNCTB4MDAKKyNkZWZpbmUgRFJNX1ZJQV9GUkVFTUVNCSAgICAgICAgMHgwMQorI2RlZmluZSBEUk1fVklBX0FHUF9JTklUCTB4MDIKKyNkZWZpbmUgRFJNX1ZJQV9GQl9JTklUCSAgICAgICAgMHgwMworI2RlZmluZSBEUk1fVklBX01BUF9JTklUCTB4MDQKKyNkZWZpbmUgRFJNX1ZJQV9ERUNfRlVURVggICAgICAgMHgwNQorI2RlZmluZSBOT1RfVVNFRAorI2RlZmluZSBEUk1fVklBX0RNQV9JTklUCTB4MDcKKyNkZWZpbmUgRFJNX1ZJQV9DTURCVUZGRVIJMHgwOAorI2RlZmluZSBEUk1fVklBX0ZMVVNICSAgICAgICAgMHgwOQorI2RlZmluZSBEUk1fVklBX1BDSUNNRAkgICAgICAgIDB4MGEKKyNkZWZpbmUgRFJNX1ZJQV9DTURCVUZfU0laRQkweDBiCisjZGVmaW5lIE5PVF9VU0VECisjZGVmaW5lIERSTV9WSUFfV0FJVF9JUlEgICAgICAgIDB4MGQKKyNkZWZpbmUgRFJNX1ZJQV9ETUFfQkxJVCAgICAgICAgMHgwZQorI2RlZmluZSBEUk1fVklBX0JMSVRfU1lOQyAgICAgICAweDBmCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9BTExPQ01FTQkgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0FMTE9DTUVNLCBkcm1fdmlhX21lbV90KQorI2RlZmluZSBEUk1fSU9DVExfVklBX0ZSRUVNRU0JICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9GUkVFTUVNLCBkcm1fdmlhX21lbV90KQorI2RlZmluZSBEUk1fSU9DVExfVklBX0FHUF9JTklUCSAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfQUdQX0lOSVQsIGRybV92aWFfYWdwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfRkJfSU5JVAkgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0ZCX0lOSVQsIGRybV92aWFfZmJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9NQVBfSU5JVAkgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX01BUF9JTklULCBkcm1fdmlhX2luaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9ERUNfRlVURVggICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9ERUNfRlVURVgsIGRybV92aWFfZnV0ZXhfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9ETUFfSU5JVAkgIERSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0RNQV9JTklULCBkcm1fdmlhX2RtYV9pbml0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfQ01EQlVGRkVSCSAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfQ01EQlVGRkVSLCBkcm1fdmlhX2NtZGJ1ZmZlcl90KQorI2RlZmluZSBEUk1fSU9DVExfVklBX0ZMVVNICSAgRFJNX0lPKCAgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfRkxVU0gpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfUENJQ01ECSAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfUENJQ01ELCBkcm1fdmlhX2NtZGJ1ZmZlcl90KQorI2RlZmluZSBEUk1fSU9DVExfVklBX0NNREJVRl9TSVpFIERSTV9JT1dSKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9DTURCVUZfU0laRSwgXAorCQkJCQkgICAgZHJtX3ZpYV9jbWRidWZfc2l6ZV90KQorI2RlZmluZSBEUk1fSU9DVExfVklBX1dBSVRfSVJRICAgIERSTV9JT1dSKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9XQUlUX0lSUSwgZHJtX3ZpYV9pcnF3YWl0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfRE1BX0JMSVQgICAgRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9ETUFfQkxJVCwgZHJtX3ZpYV9kbWFibGl0X3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfQkxJVF9TWU5DICAgRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9CTElUX1NZTkMsIGRybV92aWFfYmxpdHN5bmNfdCkKKworLyogSW5kaWNlcyBpbnRvIGJ1Zi5TZXR1cCB3aGVyZSB2YXJpb3VzIGJpdHMgb2Ygc3RhdGUgYXJlIG1pcnJvcmVkIHBlcgorICogY29udGV4dCBhbmQgcGVyIGJ1ZmZlci4gIFRoZXNlIGNhbiBiZSBmaXJlZCBhdCB0aGUgY2FyZCBhcyBhIHVuaXQsCisgKiBvciBpbiBhIHBpZWNld2lzZSBmYXNoaW9uIGFzIHJlcXVpcmVkLgorICovCisKKyNkZWZpbmUgVklBX1RFWF9TRVRVUF9TSVpFIDgKKworLyogRmxhZ3MgZm9yIGNsZWFyIGlvY3RsCisgKi8KKyNkZWZpbmUgVklBX0ZST05UICAgMHgxCisjZGVmaW5lIFZJQV9CQUNLICAgIDB4MgorI2RlZmluZSBWSUFfREVQVEggICAweDQKKyNkZWZpbmUgVklBX1NURU5DSUwgMHg4CisjZGVmaW5lIFZJQV9NRU1fVklERU8gICAwCS8qIG1hdGNoZXMgZHJtIGNvbnN0YW50ICovCisjZGVmaW5lIFZJQV9NRU1fQUdQICAgICAxCS8qIG1hdGNoZXMgZHJtIGNvbnN0YW50ICovCisjZGVmaW5lIFZJQV9NRU1fU1lTVEVNICAyCisjZGVmaW5lIFZJQV9NRU1fTUlYRUQgICAzCisjZGVmaW5lIFZJQV9NRU1fVU5LTk9XTiA0CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX3UzMiBvZmZzZXQ7CisJX191MzIgc2l6ZTsKK30gZHJtX3ZpYV9hZ3BfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fdTMyIG9mZnNldDsKKwlfX3UzMiBzaXplOworfSBkcm1fdmlhX2ZiX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX3UzMiBjb250ZXh0OworCV9fdTMyIHR5cGU7CisJX191MzIgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGluZGV4OworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworfSBkcm1fdmlhX21lbV90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX3ZpYV9pbml0IHsKKwllbnVtIHsKKwkJVklBX0lOSVRfTUFQID0gMHgwMSwKKwkJVklBX0NMRUFOVVBfTUFQID0gMHgwMgorCX0gZnVuYzsKKworCXVuc2lnbmVkIGxvbmcgc2FyZWFfcHJpdl9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBmYl9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBtbWlvX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGFncEFkZHI7Cit9IGRybV92aWFfaW5pdF90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX3ZpYV9mdXRleCB7CisJZW51bSB7CisJCVZJQV9GVVRFWF9XQUlUID0gMHgwMCwKKwkJVklBX0ZVVEVYX1dBS0UgPSAwWDAxCisJfSBmdW5jOworCV9fdTMyIG1zOworCV9fdTMyIGxvY2s7CisJX191MzIgdmFsOworfSBkcm1fdmlhX2Z1dGV4X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX2RtYV9pbml0IHsKKwllbnVtIHsKKwkJVklBX0lOSVRfRE1BID0gMHgwMSwKKwkJVklBX0NMRUFOVVBfRE1BID0gMHgwMiwKKwkJVklBX0RNQV9JTklUSUFMSVpFRCA9IDB4MDMKKwl9IGZ1bmM7CisKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgbG9uZyByZWdfcGF1c2VfYWRkcjsKK30gZHJtX3ZpYV9kbWFfaW5pdF90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX3ZpYV9jbWRidWZmZXIgeworCWNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIHNpemU7Cit9IGRybV92aWFfY21kYnVmZmVyX3Q7CisKKy8qIFdhcm5pbmc6IElmIHlvdSBjaGFuZ2UgdGhlIFNBUkVBIHN0cnVjdHVyZSB5b3UgbXVzdCBjaGFuZ2UgdGhlIFhzZXJ2ZXIKKyAqIHN0cnVjdHVyZSBhcyB3ZWxsICovCisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX3RleF9yZWdpb24geworCXVuc2lnbmVkIGNoYXIgbmV4dCwgcHJldjsJLyogaW5kaWNlcyB0byBmb3JtIGEgY2lyY3VsYXIgTFJVICAqLworCXVuc2lnbmVkIGNoYXIgaW5Vc2U7CS8qIG93bmVkIGJ5IGEgY2xpZW50LCBvciBmcmVlPyAqLworCWludCBhZ2U7CQkvKiB0cmFja2VkIGJ5IGNsaWVudHMgdG8gdXBkYXRlIGxvY2FsIExSVSdzICovCit9IGRybV92aWFfdGV4X3JlZ2lvbl90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX3ZpYV9zYXJlYSB7CisJdW5zaWduZWQgaW50IGRpcnR5OworCXVuc2lnbmVkIGludCBuYm94OworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGJveGVzW1ZJQV9OUl9TQVJFQV9DTElQUkVDVFNdOworCWRybV92aWFfdGV4X3JlZ2lvbl90IHRleExpc3RbVklBX05SX1RFWF9SRUdJT05TICsgMV07CisJaW50IHRleEFnZTsJCS8qIGxhc3QgdGltZSB0ZXh0dXJlIHdhcyB1cGxvYWRlZCAqLworCWludCBjdHhPd25lcjsJCS8qIGxhc3QgY29udGV4dCB0byB1cGxvYWQgc3RhdGUgKi8KKwlpbnQgdmVydGV4UHJpbTsKKworCS8qCisJICogQmVsb3cgaXMgZm9yIFh2TUMuCisJICogV2Ugd2FudCB0aGUgbG9jayBpbnRlZ2VycyBhbG9uZSBvbiwgYW5kIGFsaWduZWQgdG8sIGEgY2FjaGUgbGluZS4KKwkgKiBUaGVyZWZvcmUgdGhpcyBzb21ld2hhdCBzdHJhbmdlIGNvbnN0cnVjdC4KKwkgKi8KKworCWNoYXIgWHZNQ0xvY2tBcmVhW1ZJQV9NQVhfQ0FDSEVMSU5FX1NJWkUgKiAoVklBX05SX1hWTUNfTE9DS1MgKyAxKV07CisKKwl1bnNpZ25lZCBpbnQgWHZNQ0Rpc3BsYXlpbmdbVklBX05SX1hWTUNfUE9SVFNdOworCXVuc2lnbmVkIGludCBYdk1DU3ViUGljT25bVklBX05SX1hWTUNfUE9SVFNdOworCXVuc2lnbmVkIGludCBYdk1DQ3R4Tm9HcmFiYmVkOwkvKiBMYXN0IGNvbnRleHQgdG8gaG9sZCBkZWNvZGVyICovCisKKwkvKiBVc2VkIGJ5IHRoZSAzZCBkcml2ZXIgb25seSBhdCB0aGlzIHBvaW50LCBmb3IgcGFnZWZsaXBwaW5nOgorCSAqLworCXVuc2lnbmVkIGludCBwZkN1cnJlbnRPZmZzZXQ7Cit9IGRybV92aWFfc2FyZWFfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV92aWFfY21kYnVmX3NpemUgeworCWVudW0geworCQlWSUFfQ01EQlVGX1NQQUNFID0gMHgwMSwKKwkJVklBX0NNREJVRl9MQUcgPSAweDAyCisJfSBmdW5jOworCWludCB3YWl0OworCV9fdTMyIHNpemU7Cit9IGRybV92aWFfY21kYnVmX3NpemVfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlWSUFfSVJRX0FCU09MVVRFID0gMHgwLAorCVZJQV9JUlFfUkVMQVRJVkUgPSAweDEsCisJVklBX0lSUV9TSUdOQUwgPSAweDEwMDAwMDAwLAorCVZJQV9JUlFfRk9SQ0VfU0VRVUVOQ0UgPSAweDIwMDAwMDAwCit9IHZpYV9pcnFfc2VxX3R5cGVfdDsKKworI2RlZmluZSBWSUFfSVJRX0ZMQUdTX01BU0sgMHhGMDAwMDAwMAorCitlbnVtIGRybV92aWFfaXJxcyB7CisJZHJtX3ZpYV9pcnFfaHF2MCA9IDAsCisJZHJtX3ZpYV9pcnFfaHF2MSwKKwlkcm1fdmlhX2lycV9kbWEwX2RkLAorCWRybV92aWFfaXJxX2RtYTBfdGQsCisJZHJtX3ZpYV9pcnFfZG1hMV9kZCwKKwlkcm1fdmlhX2lycV9kbWExX3RkLAorCWRybV92aWFfaXJxX251bQorfTsKKworc3RydWN0IGRybV92aWFfd2FpdF9pcnFfcmVxdWVzdCB7CisJdW5zaWduZWQgaXJxOworCXZpYV9pcnFfc2VxX3R5cGVfdCB0eXBlOworCV9fdTMyIHNlcXVlbmNlOworCV9fdTMyIHNpZ25hbDsKK307CisKK3R5cGVkZWYgdW5pb24gZHJtX3ZpYV9pcnF3YWl0IHsKKwlzdHJ1Y3QgZHJtX3ZpYV93YWl0X2lycV9yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IGRybV93YWl0X3ZibGFua19yZXBseSByZXBseTsKK30gZHJtX3ZpYV9pcnF3YWl0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV92aWFfYmxpdHN5bmMgeworCV9fdTMyIHN5bmNfaGFuZGxlOworCXVuc2lnbmVkIGVuZ2luZTsKK30gZHJtX3ZpYV9ibGl0c3luY190OworCisvKiAtICogQmVsb3csImZsYWdzIiBpcyBjdXJyZW50bHkgdW51c2VkIGJ1dCB3aWxsIGJlIHVzZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZQorICogZXh0ZW5zaW9ucyBsaWtlIGtlcm5lbCBzcGFjZSBib3VuY2UgYnVmZmVycyBmb3IgYmFkIGFsaWdubWVudHMgYW5kCisgKiBibGl0IGVuZ2luZSBidXN5LXdhaXQgcG9sbGluZyBmb3IgYmV0dGVyIGxhdGVuY3kgaW4gdGhlIGFic2VuY2Ugb2YKKyAqIGludGVycnVwdHMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3ZpYV9kbWFibGl0IHsKKwlfX3UzMiBudW1fbGluZXM7CisJX191MzIgbGluZV9sZW5ndGg7CisKKwlfX3UzMiBmYl9hZGRyOworCV9fdTMyIGZiX3N0cmlkZTsKKworCXVuc2lnbmVkIGNoYXIgKm1lbV9hZGRyOworCV9fdTMyIG1lbV9zdHJpZGU7CisKKwlfX3UzMiBmbGFnczsKKwlpbnQgdG9fZmI7CisKKwlkcm1fdmlhX2JsaXRzeW5jX3Qgc3luYzsKK30gZHJtX3ZpYV9kbWFibGl0X3Q7CisKKyNlbmRpZgkJCQkvKiBfVklBX0RSTV9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vdm13Z2Z4X2RybS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9kcm0vdm13Z2Z4X2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYjA5MTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2RybS92bXdnZnhfZHJtLmgKQEAgLTAsMCArMSw3OTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCDCqSAyMDA5IFZNd2FyZSwgSW5jLiwgUGFsbyBBbHRvLCBDQS4sIFVTQQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fVk1XR0ZYX0RSTV9IX18KKyNkZWZpbmUgX19WTVdHRlhfRFJNX0hfXworCisjZGVmaW5lIERSTV9WTVdfTUFYX1NVUkZBQ0VfRkFDRVMgNgorI2RlZmluZSBEUk1fVk1XX01BWF9NSVBfTEVWRUxTIDI0CisKKworI2RlZmluZSBEUk1fVk1XX0dFVF9QQVJBTSAgICAgICAgICAgIDAKKyNkZWZpbmUgRFJNX1ZNV19BTExPQ19ETUFCVUYgICAgICAgICAxCisjZGVmaW5lIERSTV9WTVdfVU5SRUZfRE1BQlVGICAgICAgICAgMgorI2RlZmluZSBEUk1fVk1XX0NVUlNPUl9CWVBBU1MgICAgICAgIDMKKy8qIGd1YXJkZWQgYnkgRFJNX1ZNV19QQVJBTV9OVU1fU1RSRUFNUyAhPSAwKi8KKyNkZWZpbmUgRFJNX1ZNV19DT05UUk9MX1NUUkVBTSAgICAgICA0CisjZGVmaW5lIERSTV9WTVdfQ0xBSU1fU1RSRUFNICAgICAgICAgNQorI2RlZmluZSBEUk1fVk1XX1VOUkVGX1NUUkVBTSAgICAgICAgIDYKKy8qIGd1YXJkZWQgYnkgRFJNX1ZNV19QQVJBTV8zRCA9PSAxICovCisjZGVmaW5lIERSTV9WTVdfQ1JFQVRFX0NPTlRFWFQgICAgICAgNworI2RlZmluZSBEUk1fVk1XX1VOUkVGX0NPTlRFWFQgICAgICAgIDgKKyNkZWZpbmUgRFJNX1ZNV19DUkVBVEVfU1VSRkFDRSAgICAgICA5CisjZGVmaW5lIERSTV9WTVdfVU5SRUZfU1VSRkFDRSAgICAgICAgMTAKKyNkZWZpbmUgRFJNX1ZNV19SRUZfU1VSRkFDRSAgICAgICAgICAxMQorI2RlZmluZSBEUk1fVk1XX0VYRUNCVUYgICAgICAgICAgICAgIDEyCisjZGVmaW5lIERSTV9WTVdfR0VUXzNEX0NBUCAgICAgICAgICAgMTMKKyNkZWZpbmUgRFJNX1ZNV19GRU5DRV9XQUlUICAgICAgICAgICAxNAorI2RlZmluZSBEUk1fVk1XX0ZFTkNFX1NJR05BTEVEICAgICAgIDE1CisjZGVmaW5lIERSTV9WTVdfRkVOQ0VfVU5SRUYgICAgICAgICAgMTYKKyNkZWZpbmUgRFJNX1ZNV19GRU5DRV9FVkVOVCAgICAgICAgICAxNworI2RlZmluZSBEUk1fVk1XX1BSRVNFTlQgICAgICAgICAgICAgIDE4CisjZGVmaW5lIERSTV9WTVdfUFJFU0VOVF9SRUFEQkFDSyAgICAgMTkKKyNkZWZpbmUgRFJNX1ZNV19VUERBVEVfTEFZT1VUICAgICAgICAyMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19HRVRfUEFSQU0gLSBnZXQgZGV2aWNlIGluZm9ybWF0aW9uLgorICoKKyAqIERSTV9WTVdfUEFSQU1fRklGT19PRkZTRVQ6CisgKiBPZmZzZXQgdG8gdXNlIHRvIG1hcCB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgRklGTyByZWFkLW9ubHkuCisgKiBUaGUgZmlmbyBpcyBtYXBwZWQgdXNpbmcgdGhlIG1tYXAoKSBzeXN0ZW0gY2FsbCBvbiB0aGUgZHJtIGRldmljZS4KKyAqCisgKiBEUk1fVk1XX1BBUkFNX09WRVJMQVlfSU9DVEw6CisgKiBEb2VzIHRoZSBkcml2ZXIgc3VwcG9ydCB0aGUgb3ZlcmxheSBpb2N0bC4KKyAqLworCisjZGVmaW5lIERSTV9WTVdfUEFSQU1fTlVNX1NUUkVBTVMgICAgICAwCisjZGVmaW5lIERSTV9WTVdfUEFSQU1fTlVNX0ZSRUVfU1RSRUFNUyAxCisjZGVmaW5lIERSTV9WTVdfUEFSQU1fM0QgICAgICAgICAgICAgICAyCisjZGVmaW5lIERSTV9WTVdfUEFSQU1fSFdfQ0FQUyAgICAgICAgICAzCisjZGVmaW5lIERSTV9WTVdfUEFSQU1fRklGT19DQVBTICAgICAgICA0CisjZGVmaW5lIERSTV9WTVdfUEFSQU1fTUFYX0ZCX1NJWkUgICAgICA1CisjZGVmaW5lIERSTV9WTVdfUEFSQU1fRklGT19IV19WRVJTSU9OICA2CisKKy8qKgorICogc3RydWN0IGRybV92bXdfZ2V0cGFyYW1fYXJnCisgKgorICogQHZhbHVlOiBSZXR1cm5lZCB2YWx1ZS4gLy9PdXQKKyAqIEBwYXJhbTogUGFyYW1ldGVyIHRvIHF1ZXJ5LiAvL0luLgorICoKKyAqIEFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX0dFVF9QQVJBTSBJb2N0bC4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19nZXRwYXJhbV9hcmcgeworCXVpbnQ2NF90IHZhbHVlOworCXVpbnQzMl90IHBhcmFtOworCXVpbnQzMl90IHBhZDY0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfQ1JFQVRFX0NPTlRFWFQgLSBDcmVhdGUgYSBob3N0IGNvbnRleHQuCisgKgorICogQWxsb2NhdGVzIGEgZGV2aWNlIHVuaXF1ZSBjb250ZXh0IGlkLCBhbmQgcXVldWVzIGEgY3JlYXRlIGNvbnRleHQgY29tbWFuZAorICogZm9yIHRoZSBob3N0LiBEb2VzIG5vdCB3YWl0IGZvciBob3N0IGNvbXBsZXRpb24uCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19jb250ZXh0X2FyZworICoKKyAqIEBjaWQ6IERldmljZSB1bmlxdWUgY29udGV4dCBJRC4KKyAqCisgKiBPdXRwdXQgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfQ1JFQVRFX0NPTlRFWFQgSW9jdGwuCisgKiBJbnB1dCBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19VTlJFRl9DT05URVhUIElvY3RsLgorICovCisKK3N0cnVjdCBkcm1fdm13X2NvbnRleHRfYXJnIHsKKwlpbnQzMl90IGNpZDsKKwl1aW50MzJfdCBwYWQ2NDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX1VOUkVGX0NPTlRFWFQgLSBDcmVhdGUgYSBob3N0IGNvbnRleHQuCisgKgorICogRnJlZXMgYSBnbG9iYWwgY29udGV4dCBpZCwgYW5kIHF1ZXVlcyBhIGRlc3Ryb3kgaG9zdCBjb21tYW5kIGZvciB0aGUgaG9zdC4KKyAqIERvZXMgbm90IHdhaXQgZm9yIGhvc3QgY29tcGxldGlvbi4gVGhlIGNvbnRleHQgSUQgY2FuIGJlIHVzZWQgZGlyZWN0bHkKKyAqIGluIHRoZSBjb21tYW5kIHN0cmVhbSBhbmQgc2hvd3MgdXAgYXMgdGhlIHNhbWUgY29udGV4dCBJRCBvbiB0aGUgaG9zdC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19DUkVBVEVfU1VSRkFDRSAtIENyZWF0ZSBhIGhvc3Qgc3VmYWNlLgorICoKKyAqIEFsbG9jYXRlcyBhIGRldmljZSB1bmlxdWUgc3VyZmFjZSBpZCwgYW5kIHF1ZXVlcyBhIGNyZWF0ZSBzdXJmYWNlIGNvbW1hbmQKKyAqIGZvciB0aGUgaG9zdC4gRG9lcyBub3Qgd2FpdCBmb3IgaG9zdCBjb21wbGV0aW9uLiBUaGUgc3VyZmFjZSBJRCBjYW4gYmUKKyAqIHVzZWQgZGlyZWN0bHkgaW4gdGhlIGNvbW1hbmQgc3RyZWFtIGFuZCBzaG93cyB1cCBhcyB0aGUgc2FtZSBzdXJmYWNlCisgKiBJRCBvbiB0aGUgaG9zdC4KKyAqLworCisvKioKKyAqIHN0cnVjdCBkcm1fd212X3N1cmZhY2VfY3JlYXRlX3JlcQorICoKKyAqIEBmbGFnczogU3VyZmFjZSBmbGFncyBhcyB1bmRlcnN0b29kIGJ5IHRoZSBob3N0LgorICogQGZvcm1hdDogU3VyZmFjZSBmb3JtYXQgYXMgdW5kZXJzdG9vZCBieSB0aGUgaG9zdC4KKyAqIEBtaXBfbGV2ZWxzOiBOdW1iZXIgb2YgbWlwIGxldmVscyBmb3IgZWFjaCBmYWNlLgorICogQW4gdW51c2VkIGZhY2Ugc2hvdWxkIGhhdmUgMCBlbmNvZGVkLgorICogQHNpemVfYWRkcjogQWRkcmVzcyBvZiBhIHVzZXItc3BhY2UgYXJyYXkgb2Ygc3J1Y3QgZHJtX3Ztd19zaXplCisgKiBjYXN0IHRvIGFuIHVpbnQ2NF90IGZvciAzMi02NCBiaXQgY29tcGF0aWJpbGl0eS4KKyAqIFRoZSBzaXplIG9mIHRoZSBhcnJheSBzaG91bGQgZXF1YWwgdGhlIHRvdGFsIG51bWJlciBvZiBtaXBtYXAgbGV2ZWxzLgorICogQHNoYXJlYWJsZTogQm9vbGVhbiB3aGV0aGVyIG90aGVyIGNsaWVudHMgKGFzIGlkZW50aWZpZWQgYnkgZmlsZSBkZXNjcmlwdG9ycykKKyAqIG1heSByZWZlcmVuY2UgdGhpcyBzdXJmYWNlLgorICogQHNjYW5vdXQ6IEJvb2xlYW4gd2hldGhlciB0aGUgc3VyZmFjZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGEKKyAqIHNjYW5vdXQuCisgKgorICogSW5wdXQgZGF0YSB0byB0aGUgRFJNX1ZNV19DUkVBVEVfU1VSRkFDRSBJb2N0bC4KKyAqIE91dHB1dCBkYXRhIGZyb20gdGhlIERSTV9WTVdfUkVGX1NVUkZBQ0UgSW9jdGwuCisgKi8KKworc3RydWN0IGRybV92bXdfc3VyZmFjZV9jcmVhdGVfcmVxIHsKKwl1aW50MzJfdCBmbGFnczsKKwl1aW50MzJfdCBmb3JtYXQ7CisJdWludDMyX3QgbWlwX2xldmVsc1tEUk1fVk1XX01BWF9TVVJGQUNFX0ZBQ0VTXTsKKwl1aW50NjRfdCBzaXplX2FkZHI7CisJaW50MzJfdCBzaGFyZWFibGU7CisJaW50MzJfdCBzY2Fub3V0OworfTsKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3dtdl9zdXJmYWNlX2FyZworICoKKyAqIEBzaWQ6IFN1cmZhY2UgaWQgb2YgY3JlYXRlZCBzdXJmYWNlIG9yIHN1cmZhY2UgdG8gZGVzdHJveSBvciByZWZlcmVuY2UuCisgKgorICogT3V0cHV0IGRhdGEgZnJvbSB0aGUgRFJNX1ZNV19DUkVBVEVfU1VSRkFDRSBJb2N0bC4KKyAqIElucHV0IGFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX1VOUkVGX1NVUkZBQ0UgSW9jdGwuCisgKiBJbnB1dCBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19SRUZfU1VSRkFDRSBJb2N0bC4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19zdXJmYWNlX2FyZyB7CisJaW50MzJfdCBzaWQ7CisJdWludDMyX3QgcGFkNjQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X3NpemUgaW9jdGwuCisgKgorICogQHdpZHRoIC0gbWlwIGxldmVsIHdpZHRoCisgKiBAaGVpZ2h0IC0gbWlwIGxldmVsIGhlaWdodAorICogQGRlcHRoIC0gbWlwIGxldmVsIGRlcHRoCisgKgorICogRGVzY3JpcHRpb24gb2YgYSBtaXAgbGV2ZWwuCisgKiBJbnB1dCBkYXRhIHRvIHRoZSBEUk1fV01XX0NSRUFURV9TVVJGQUNFIElvY3RsLgorICovCisKK3N0cnVjdCBkcm1fdm13X3NpemUgeworCXVpbnQzMl90IHdpZHRoOworCXVpbnQzMl90IGhlaWdodDsKKwl1aW50MzJfdCBkZXB0aDsKKwl1aW50MzJfdCBwYWQ2NDsKK307CisKKy8qKgorICogdW5pb24gZHJtX3Ztd19zdXJmYWNlX2NyZWF0ZV9hcmcKKyAqCisgKiBAcmVwOiBPdXRwdXQgZGF0YSBhcyBkZXNjcmliZWQgYWJvdmUuCisgKiBAcmVxOiBJbnB1dCBkYXRhIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAqCisgKiBBcmd1bWVudCB0byB0aGUgRFJNX1ZNV19DUkVBVEVfU1VSRkFDRSBJb2N0bC4KKyAqLworCit1bmlvbiBkcm1fdm13X3N1cmZhY2VfY3JlYXRlX2FyZyB7CisJc3RydWN0IGRybV92bXdfc3VyZmFjZV9hcmcgcmVwOworCXN0cnVjdCBkcm1fdm13X3N1cmZhY2VfY3JlYXRlX3JlcSByZXE7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19SRUZfU1VSRkFDRSAtIFJlZmVyZW5jZSBhIGhvc3Qgc3VyZmFjZS4KKyAqCisgKiBQdXRzIGEgcmVmZXJlbmNlIG9uIGEgaG9zdCBzdXJmYWNlIHdpdGggYSBnaXZlIHNpZCwgYXMgcHJldmlvdXNseQorICogcmV0dXJuZWQgYnkgdGhlIERSTV9WTVdfQ1JFQVRFX1NVUkZBQ0UgaW9jdGwuCisgKiBBIHJlZmVyZW5jZSB3aWxsIG1ha2Ugc3VyZSB0aGUgc3VyZmFjZSBpc24ndCBkZXN0cm95ZWQgd2hpbGUgd2UgaG9sZAorICogaXQgYW5kIHdpbGwgYWxsb3cgdGhlIGNhbGxpbmcgY2xpZW50IHRvIHVzZSB0aGUgc3VyZmFjZSBJRCBpbiB0aGUgY29tbWFuZAorICogc3RyZWFtLgorICoKKyAqIE9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCB0aGUgSW9jdGwgcmV0dXJucyB0aGUgc3VyZmFjZSBpbmZvcm1hdGlvbiBnaXZlbgorICogaW4gdGhlIERSTV9WTVdfQ1JFQVRFX1NVUkZBQ0UgaW9jdGwuCisgKi8KKworLyoqCisgKiB1bmlvbiBkcm1fdm13X3N1cmZhY2VfcmVmZXJlbmNlX2FyZworICoKKyAqIEByZXA6IE91dHB1dCBkYXRhIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAqIEByZXE6IElucHV0IGRhdGEgYXMgZGVzY3JpYmVkIGFib3ZlLgorICoKKyAqIEFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX1JFRl9TVVJGQUNFIElvY3RsLgorICovCisKK3VuaW9uIGRybV92bXdfc3VyZmFjZV9yZWZlcmVuY2VfYXJnIHsKKwlzdHJ1Y3QgZHJtX3Ztd19zdXJmYWNlX2NyZWF0ZV9yZXEgcmVwOworCXN0cnVjdCBkcm1fdm13X3N1cmZhY2VfYXJnIHJlcTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX1VOUkVGX1NVUkZBQ0UgLSBVbnJlZmVyZW5jZSBhIGhvc3Qgc3VyZmFjZS4KKyAqCisgKiBDbGVhciBhIHJlZmVyZW5jZSBwcmV2aW91c2x5IHB1dCBvbiBhIGhvc3Qgc3VyZmFjZS4KKyAqIFdoZW4gYWxsIHJlZmVyZW5jZXMgYXJlIGdvbmUsIGluY2x1ZGluZyB0aGUgb25lIGltcGxpY2l0bHkgcGxhY2VkCisgKiBvbiBjcmVhdGlvbiwKKyAqIGEgZGVzdHJveSBzdXJmYWNlIGNvbW1hbmQgd2lsbCBiZSBxdWV1ZWQgZm9yIHRoZSBob3N0LgorICogRG9lcyBub3Qgd2FpdCBmb3IgY29tcGxldGlvbi4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19FWEVDQlVGCisgKgorICogU3VibWl0IGEgY29tbWFuZCBidWZmZXIgZm9yIGV4ZWN1dGlvbiBvbiB0aGUgaG9zdCwgYW5kIHJldHVybiBhCisgKiBmZW5jZSBzZXFubyB0aGF0IHdoZW4gc2lnbmFsZWQsIGluZGljYXRlcyB0aGF0IHRoZSBjb21tYW5kIGJ1ZmZlciBoYXMKKyAqIGV4ZWN1dGVkLgorICovCisKKy8qKgorICogc3RydWN0IGRybV92bXdfZXhlY2J1Zl9hcmcKKyAqCisgKiBAY29tbWFuZHM6IFVzZXItc3BhY2UgYWRkcmVzcyBvZiBhIGNvbW1hbmQgYnVmZmVyIGNhc3QgdG8gYW4gdWludDY0X3QuCisgKiBAY29tbWFuZC1zaXplOiBTaXplIGluIGJ5dGVzIG9mIHRoZSBjb21tYW5kIGJ1ZmZlci4KKyAqIEB0aHJvdHRsZS11czogU2xlZXAgdW50aWwgc29mdHdhcmUgaXMgbGVzcyB0aGFuIEB0aHJvdHRsZV91cworICogbWljcm9zZWNvbmRzIGFoZWFkIG9mIGhhcmR3YXJlLiBUaGUgZHJpdmVyIG1heSByb3VuZCB0aGlzIHZhbHVlCisgKiB0byB0aGUgbmVhcmVzdCBrZXJuZWwgdGljay4KKyAqIEBmZW5jZV9yZXA6IFVzZXItc3BhY2UgYWRkcmVzcyBvZiBhIHN0cnVjdCBkcm1fdm13X2ZlbmNlX3JlcCBjYXN0IHRvIGFuCisgKiB1aW50NjRfdC4KKyAqIEB2ZXJzaW9uOiBBbGxvd3MgZXhwYW5kaW5nIHRoZSBleGVjYnVmIGlvY3RsIHBhcmFtZXRlcnMgd2l0aG91dCBicmVha2luZworICogYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHNpbmNlIHVzZXItc3BhY2Ugd2lsbCBhbHdheXMgdGVsbCB0aGUga2VybmVsCisgKiB3aGljaCB2ZXJzaW9uIGl0IHVzZXMuCisgKiBAZmxhZ3M6IEV4ZWNidWYgZmxhZ3MuIE5vbmUgY3VycmVudGx5LgorICoKKyAqIEFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX0VYRUNCVUYgSW9jdGwuCisgKi8KKworI2RlZmluZSBEUk1fVk1XX0VYRUNCVUZfVkVSU0lPTiAxCisKK3N0cnVjdCBkcm1fdm13X2V4ZWNidWZfYXJnIHsKKwl1aW50NjRfdCBjb21tYW5kczsKKwl1aW50MzJfdCBjb21tYW5kX3NpemU7CisJdWludDMyX3QgdGhyb3R0bGVfdXM7CisJdWludDY0X3QgZmVuY2VfcmVwOworCXVpbnQzMl90IHZlcnNpb247CisJdWludDMyX3QgZmxhZ3M7Cit9OworCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X2ZlbmNlX3JlcAorICoKKyAqIEBoYW5kbGU6IEZlbmNlIG9iamVjdCBoYW5kbGUgZm9yIGZlbmNlIGFzc29jaWF0ZWQgd2l0aCBhIGNvbW1hbmQgc3VibWlzc2lvbi4KKyAqIEBtYXNrOiBGZW5jZSBmbGFncyByZWxldmFudCBmb3IgdGhpcyBmZW5jZSBvYmplY3QuCisgKiBAc2Vxbm86IEZlbmNlIHNlcXVlbmNlIG51bWJlciBpbiBmaWZvLiBBIGZlbmNlIG9iamVjdCB3aXRoIGEgbG93ZXIKKyAqIHNlcW5vIHdpbGwgc2lnbmFsIHRoZSBFWEVDIGZsYWcgYmVmb3JlIGEgZmVuY2Ugb2JqZWN0IHdpdGggYSBoaWdoZXIKKyAqIHNlcW5vLiBUaGlzIGNhbiBiZSB1c2VkIGJ5IHVzZXItc3BhY2UgdG8gYXZvaWQga2VybmVsIGNhbGxzIHRvIGRldGVybWluZQorICogd2hldGhlciBhIGZlbmNlIGhhcyBzaWduYWxlZCB0aGUgRVhFQyBmbGFnLiBOb3RlIHRoYXQgQHNlcW5vIHdpbGwKKyAqIHdyYXAgYXQgMzItYml0LgorICogQHBhc3NlZF9zZXFubzogVGhlIGhpZ2hlc3Qgc2Vxbm8gbnVtYmVyIHByb2Nlc3NlZCBieSB0aGUgaGFyZHdhcmUKKyAqIHNvIGZhci4gVGhpcyBjYW4gYmUgdXNlZCB0byBtYXJrIHVzZXItc3BhY2UgZmVuY2Ugb2JqZWN0cyBhcyBzaWduYWxlZCwgYW5kCisgKiB0byBkZXRlcm1pbmUgd2hldGhlciBhIGZlbmNlIHNlcW5vIG1pZ2h0IGJlIHN0YWxlLgorICogQGVycm9yOiBUaGlzIG1lbWJlciBzaG91bGQndmUgYmVlbiBzZXQgdG8gLUVGQVVMVCBvbiBzdWJtaXNzaW9uLgorICogVGhlIGZvbGxvd2luZyBhY3Rpb25zIHNob3VsZCBiZSB0YWtlIG9uIGNvbXBsZXRpb246CisgKiBlcnJvciA9PSAtRUZBVUxUOiBGZW5jZSBjb21tdW5pY2F0aW9uIGZhaWxlZC4gVGhlIGhvc3QgaXMgc3luY2hyb25pemVkLgorICogVXNlIHRoZSBsYXN0IGZlbmNlIGlkIHJlYWQgZnJvbSB0aGUgRklGTyBmZW5jZSByZWdpc3Rlci4KKyAqIGVycm9yICE9IDAgJiYgZXJyb3IgIT0gLUVGQVVMVDoKKyAqIEZlbmNlIHN1Ym1pc3Npb24gZmFpbGVkLiBUaGUgaG9zdCBpcyBzeW5jaHJvbml6ZWQuIFVzZSB0aGUgZmVuY2Vfc2VxIG1lbWJlci4KKyAqIGVycm9yID09IDA6IEFsbCBpcyBPSywgVGhlIGhvc3QgbWF5IG5vdCBiZSBzeW5jaHJvbml6ZWQuCisgKiBVc2UgdGhlIGZlbmNlX3NlcSBtZW1iZXIuCisgKgorICogSW5wdXQgLyBPdXRwdXQgZGF0YSB0byB0aGUgRFJNX1ZNV19FWEVDQlVGIElvY3RsLgorICovCisKK3N0cnVjdCBkcm1fdm13X2ZlbmNlX3JlcCB7CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IG1hc2s7CisJdWludDMyX3Qgc2Vxbm87CisJdWludDMyX3QgcGFzc2VkX3NlcW5vOworCXVpbnQzMl90IHBhZDY0OworCWludDMyX3QgZXJyb3I7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19BTExPQ19ETUFCVUYKKyAqCisgKiBBbGxvY2F0ZSBhIERNQSBidWZmZXIgdGhhdCBpcyB2aXNpYmxlIGFsc28gdG8gdGhlIGhvc3QuCisgKiBOT1RFOiBUaGUgYnVmZmVyIGlzCisgKiBpZGVudGlmaWVkIGJ5IGEgaGFuZGxlIGFuZCBhbiBvZmZzZXQsIHdoaWNoIGFyZSBwcml2YXRlIHRvIHRoZSBndWVzdCwgYnV0CisgKiB1c2VhYmxlIGluIHRoZSBjb21tYW5kIHN0cmVhbS4gVGhlIGd1ZXN0IGtlcm5lbCBtYXkgdHJhbnNsYXRlIHRoZXNlCisgKiBhbmQgcGF0Y2ggdXAgdGhlIGNvbW1hbmQgc3RyZWFtIGFjY29yZGluZ2x5LiBJbiB0aGUgZnV0dXJlLCB0aGUgb2Zmc2V0IG1heQorICogYmUgemVybyBhdCBhbGwgdGltZXMsIG9yIGl0IG1heSBkaXNhcHBlYXIgZnJvbSB0aGUgaW50ZXJmYWNlIGJlZm9yZSBpdCBpcworICogZml4ZWQuCisgKgorICogVGhlIERNQSBidWZmZXIgbWF5IHN0YXkgdXNlci1zcGFjZSBtYXBwZWQgaW4gdGhlIGd1ZXN0IGF0IGFsbCB0aW1lcywKKyAqIGFuZCBpcyB0aHVzIHN1aXRhYmxlIGZvciBzdWItYWxsb2NhdGlvbi4KKyAqCisgKiBETUEgYnVmZmVycyBhcmUgbWFwcGVkIHVzaW5nIHRoZSBtbWFwKCkgc3lzY2FsbCBvbiB0aGUgZHJtIGRldmljZS4KKyAqLworCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X2FsbG9jX2RtYWJ1Zl9yZXEKKyAqCisgKiBAc2l6ZTogUmVxdWlyZWQgbWluaW11bSBzaXplIG9mIHRoZSBidWZmZXIuCisgKgorICogSW5wdXQgZGF0YSB0byB0aGUgRFJNX1ZNV19BTExPQ19ETUFCVUYgSW9jdGwuCisgKi8KKworc3RydWN0IGRybV92bXdfYWxsb2NfZG1hYnVmX3JlcSB7CisJdWludDMyX3Qgc2l6ZTsKKwl1aW50MzJfdCBwYWQ2NDsKK307CisKKy8qKgorICogc3RydWN0IGRybV92bXdfZG1hYnVmX3JlcAorICoKKyAqIEBtYXBfaGFuZGxlOiBPZmZzZXQgdG8gdXNlIGluIHRoZSBtbWFwKCkgY2FsbCB1c2VkIHRvIG1hcCB0aGUgYnVmZmVyLgorICogQGhhbmRsZTogSGFuZGxlIHVuaXF1ZSB0byB0aGlzIGJ1ZmZlci4gVXNlZCBmb3IgdW5yZWZlcmVuY2luZy4KKyAqIEBjdXJfZ21yX2lkOiBHTVIgaWQgdG8gdXNlIGluIHRoZSBjb21tYW5kIHN0cmVhbSB3aGVuIHRoaXMgYnVmZmVyIGlzCisgKiByZWZlcmVuY2VkLiBTZWUgbm90IGFib3ZlLgorICogQGN1cl9nbXJfb2Zmc2V0OiBPZmZzZXQgdG8gdXNlIGluIHRoZSBjb21tYW5kIHN0cmVhbSB3aGVuIHRoaXMgYnVmZmVyIGlzCisgKiByZWZlcmVuY2VkLiBTZWUgbm90ZSBhYm92ZS4KKyAqCisgKiBPdXRwdXQgZGF0YSBmcm9tIHRoZSBEUk1fVk1XX0FMTE9DX0RNQUJVRiBJb2N0bC4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19kbWFidWZfcmVwIHsKKwl1aW50NjRfdCBtYXBfaGFuZGxlOworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCBjdXJfZ21yX2lkOworCXVpbnQzMl90IGN1cl9nbXJfb2Zmc2V0OworCXVpbnQzMl90IHBhZDY0OworfTsKKworLyoqCisgKiB1bmlvbiBkcm1fdm13X2RtYWJ1Zl9hcmcKKyAqCisgKiBAcmVxOiBJbnB1dCBkYXRhIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAqIEByZXA6IE91dHB1dCBkYXRhIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAqCisgKiBBcmd1bWVudCB0byB0aGUgRFJNX1ZNV19BTExPQ19ETUFCVUYgSW9jdGwuCisgKi8KKwordW5pb24gZHJtX3Ztd19hbGxvY19kbWFidWZfYXJnIHsKKwlzdHJ1Y3QgZHJtX3Ztd19hbGxvY19kbWFidWZfcmVxIHJlcTsKKwlzdHJ1Y3QgZHJtX3Ztd19kbWFidWZfcmVwIHJlcDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX1VOUkVGX0RNQUJVRiAtIEZyZWUgYSBETUEgYnVmZmVyLgorICoKKyAqLworCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X3VucmVmX2RtYWJ1Zl9hcmcKKyAqCisgKiBAaGFuZGxlOiBIYW5kbGUgaW5kaWNhdGluZyB3aGF0IGJ1ZmZlciB0byBmcmVlLiBPYnRhaW5lZCBmcm9tIHRoZQorICogRFJNX1ZNV19BTExPQ19ETUFCVUYgSW9jdGwuCisgKgorICogQXJndW1lbnQgdG8gdGhlIERSTV9WTVdfVU5SRUZfRE1BQlVGIElvY3RsLgorICovCisKK3N0cnVjdCBkcm1fdm13X3VucmVmX2RtYWJ1Zl9hcmcgeworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCBwYWQ2NDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX0NPTlRST0xfU1RSRUFNIC0gQ29udHJvbCBvdmVybGF5cywgYWthIHN0cmVhbXMuCisgKgorICogVGhpcyBJT0NUTCBjb250cm9scyB0aGUgb3ZlcmxheSB1bml0cyBvZiB0aGUgc3ZnYSBkZXZpY2UuCisgKiBUaGUgU1ZHQSBvdmVybGF5IHVuaXRzIGRvZXMgbm90IHdvcmsgbGlrZSByZWd1bGFyIGhhcmR3YXJlIHVuaXRzIGluCisgKiB0aGF0IHRoZXkgZG8gbm90IGF1dG9tYXRpY2FseSByZWFkIGJhY2sgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBkbWEKKyAqIGJ1ZmZlci4gQnV0IGluc3RlYWQgb25seSByZWFkIGJhY2sgZm9yIGVhY2ggY2FsbCB0byB0aGlzIGlvY3RsLCBhbmQKKyAqIGF0IGFueSBwb2ludCBiZXR3ZWVuIHRoaXMgY2FsbCBiZWluZyBtYWRlIGFuZCBhIGZvbGxvd2luZyBjYWxsIHRoYXQKKyAqIGVpdGhlciBjaGFuZ2VzIHRoZSBidWZmZXIgb3IgZGlzYWJsZXMgdGhlIHN0cmVhbS4KKyAqLworCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X3JlY3QKKyAqCisgKiBEZWZpbmVzIGEgcmVjdGFuZ2xlLiBVc2VkIGluIHRoZSBvdmVybGF5IGlvY3RsIHRvIGRlZmluZQorICogc291cmNlIGFuZCBkZXN0aW5hdGlvbiByZWN0YW5nbGUuCisgKi8KKworc3RydWN0IGRybV92bXdfcmVjdCB7CisJaW50MzJfdCB4OworCWludDMyX3QgeTsKKwl1aW50MzJfdCB3OworCXVpbnQzMl90IGg7Cit9OworCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X2NvbnRyb2xfc3RyZWFtX2FyZworICoKKyAqIEBzdHJlYW1faWQ6IFN0ZWFybSB0byBjb250cm9sCisgKiBAZW5hYmxlZDogSWYgZmFsc2UgYWxsIGZvbGxvd2luZyBhcmd1bWVudHMgYXJlIGlnbm9yZWQuCisgKiBAaGFuZGxlOiBIYW5kbGUgdG8gYnVmZmVyIGZvciBnZXR0aW5nIGRhdGEgZnJvbS4KKyAqIEBmb3JtYXQ6IEZvcm1hdCBvZiB0aGUgb3ZlcmxheSBhcyB1bmRlcnN0b29kIGJ5IHRoZSBob3N0LgorICogQHdpZHRoOiBXaWR0aCBvZiB0aGUgb3ZlcmxheS4KKyAqIEBoZWlnaHQ6IEhlaWdodCBvZiB0aGUgb3ZlcmxheS4KKyAqIEBzaXplOiBTaXplIG9mIHRoZSBvdmVybGF5IGluIGJ5dGVzLgorICogQHBpdGNoOiBBcnJheSBvZiBwaXRjaGVzLCB0aGUgdHdvIGxhc3QgYXJlIG9ubHkgdXNlZCBmb3IgWVVWMTIgZm9ybWF0cy4KKyAqIEBvZmZzZXQ6IE9mZnNldCBmcm9tIHN0YXJ0IG9mIGRtYSBidWZmZXIgdG8gb3ZlcmxheS4KKyAqIEBzcmM6IFNvdXJjZSByZWN0LCBtdXN0IGJlIHdpdGhpbiB0aGUgZGVmaW5lZCBhcmVhIGFib3ZlLgorICogQGRzdDogRGVzdGluYXRpb24gcmVjdCwgeCBhbmQgeSBtYXkgYmUgbmVnYXRpdmUuCisgKgorICogQXJndW1lbnQgdG8gdGhlIERSTV9WTVdfQ09OVFJPTF9TVFJFQU0gSW9jdGwuCisgKi8KKworc3RydWN0IGRybV92bXdfY29udHJvbF9zdHJlYW1fYXJnIHsKKwl1aW50MzJfdCBzdHJlYW1faWQ7CisJdWludDMyX3QgZW5hYmxlZDsKKworCXVpbnQzMl90IGZsYWdzOworCXVpbnQzMl90IGNvbG9yX2tleTsKKworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCBvZmZzZXQ7CisJaW50MzJfdCBmb3JtYXQ7CisJdWludDMyX3Qgc2l6ZTsKKwl1aW50MzJfdCB3aWR0aDsKKwl1aW50MzJfdCBoZWlnaHQ7CisJdWludDMyX3QgcGl0Y2hbM107CisKKwl1aW50MzJfdCBwYWQ2NDsKKwlzdHJ1Y3QgZHJtX3Ztd19yZWN0IHNyYzsKKwlzdHJ1Y3QgZHJtX3Ztd19yZWN0IGRzdDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX0NVUlNPUl9CWVBBU1MgLSBHaXZlIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IGN1cnNvciBieXBhc3MuCisgKgorICovCisKKyNkZWZpbmUgRFJNX1ZNV19DVVJTT1JfQllQQVNTX0FMTCAgICAoMSA8PCAwKQorI2RlZmluZSBEUk1fVk1XX0NVUlNPUl9CWVBBU1NfRkxBR1MgICAgICAgKDEpCisKKy8qKgorICogc3RydWN0IGRybV92bXdfY3Vyc29yX2J5cGFzc19hcmcKKyAqCisgKiBAZmxhZ3M6IEZsYWdzLgorICogQGNydGNfaWQ6IENydGMgaWQsIG9ubHkgdXNlZCBpZiBETVJfQ1VSU09SX0JZUEFTU19BTEwgaXNuJ3QgcGFzc2VkLgorICogQHhwb3M6IFggcG9zaXRpb24gb2YgY3Vyc29yLgorICogQHlwb3M6IFkgcG9zaXRpb24gb2YgY3Vyc29yLgorICogQHhob3Q6IFggaG90c3BvdC4KKyAqIEB5aG90OiBZIGhvdHNwb3QuCisgKgorICogQXJndW1lbnQgdG8gdGhlIERSTV9WTVdfQ1VSU09SX0JZUEFTUyBJb2N0bC4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19jdXJzb3JfYnlwYXNzX2FyZyB7CisJdWludDMyX3QgZmxhZ3M7CisJdWludDMyX3QgY3J0Y19pZDsKKwlpbnQzMl90IHhwb3M7CisJaW50MzJfdCB5cG9zOworCWludDMyX3QgeGhvdDsKKwlpbnQzMl90IHlob3Q7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19DTEFJTV9TVFJFQU0gLSBDbGFpbSBhIHNpbmdsZSBzdHJlYW0uCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19jb250ZXh0X2FyZworICoKKyAqIEBzdHJlYW1faWQ6IERldmljZSB1bmlxdWUgY29udGV4dCBJRC4KKyAqCisgKiBPdXRwdXQgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfQ1JFQVRFX0NPTlRFWFQgSW9jdGwuCisgKiBJbnB1dCBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19VTlJFRl9DT05URVhUIElvY3RsLgorICovCisKK3N0cnVjdCBkcm1fdm13X3N0cmVhbV9hcmcgeworCXVpbnQzMl90IHN0cmVhbV9pZDsKKwl1aW50MzJfdCBwYWQ2NDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX1VOUkVGX1NUUkVBTSAtIFVuY2xhaW0gYSBzdHJlYW0uCisgKgorICogUmV0dXJuIGEgc2luZ2xlIHN0cmVhbSB0aGF0IHdhcyBjbGFpbWVkIGJ5IHRoaXMgcHJvY2Vzcy4gQWxzbyBtYWtlcworICogc3VyZSB0aGF0IHRoZSBzdHJlYW0gaGFzIGJlZW4gc3RvcHBlZC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19HRVRfM0RfQ0FQCisgKgorICogUmVhZCAzRCBjYXBhYmlsaXRpZXMgZnJvbSB0aGUgRklGTworICoKKyAqLworCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X2dldF8zZF9jYXBfYXJnCisgKgorICogQGJ1ZmZlcjogUG9pbnRlciB0byBhIGJ1ZmZlciBmb3IgY2FwYWJpbGl0eSBkYXRhLCBjYXN0IHRvIGFuIHVpbnQ2NF90CisgKiBAc2l6ZTogTWF4IHNpemUgdG8gY29weQorICoKKyAqIElucHV0IGFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX0dFVF8zRF9DQVBfSU9DVEwKKyAqIGlvY3Rscy4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19nZXRfM2RfY2FwX2FyZyB7CisJdWludDY0X3QgYnVmZmVyOworCXVpbnQzMl90IG1heF9zaXplOworCXVpbnQzMl90IHBhZDY0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfRkVOQ0VfV0FJVAorICoKKyAqIFdhaXRzIGZvciBhIGZlbmNlIG9iamVjdCB0byBzaWduYWwuIFRoZSB3YWl0IGlzIGludGVycnVwdGlibGUsIHNvIHRoYXQKKyAqIHNpZ25hbHMgbWF5IGJlIGRlbGl2ZXJlZCBkdXJpbmcgdGhlIGludGVycnVwdC4gVGhlIHdhaXQgbWF5IHRpbWVvdXQsCisgKiBpbiB3aGljaCBjYXNlIHRoZSBjYWxscyByZXR1cm5zIC1FQlVTWS4gSWYgdGhlIHdhaXQgaXMgcmVzdGFydGVkLAorICogdGhhdCBpcyByZXN0YXJ0aW5nIHdpdGhvdXQgcmVzZXR0aW5nIEBjb29raWVfdmFsaWQgdG8gemVybywKKyAqIHRoZSB0aW1lb3V0IGlzIGNvbXB1dGVkIGZyb20gdGhlIGZpcnN0IGNhbGwuCisgKgorICogVGhlIGZsYWdzIGFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX0ZFTkNFX1dBSVQgaW9jdGwgaW5kaWNhdGVzIHdoYXQgdG8gd2FpdAorICogb246CisgKiBEUk1fVk1XX0ZFTkNFX0ZMQUdfRVhFQzogQWxsIGNvbW1hbmRzIGFoZWFkIG9mIHRoZSBmZW5jZSBpbiB0aGUgY29tbWFuZAorICogc3RyZWFtCisgKiBoYXZlIGV4ZWN1dGVkLgorICogRFJNX1ZNV19GRU5DRV9GTEFHX1FVRVJZOiBBbGwgcXVlcnkgcmVzdWx0cyByZXN1bHRpbmcgZnJvbSBxdWVyeSBmaW5pc2gKKyAqIGNvbW1hbmRzCisgKiBpbiB0aGUgYnVmZmVyIGdpdmVuIHRvIHRoZSBFWEVDQlVGIGlvY3RsIHJldHVybmluZyB0aGUgZmVuY2Ugb2JqZWN0IGhhbmRsZQorICogYXJlIGF2YWlsYWJsZSB0byB1c2VyLXNwYWNlLgorICoKKyAqIERSTV9WTVdfV0FJVF9PUFRJT05fVU5SRUY6IElmIHRoaXMgd2FpdCBvcHRpb24gaXMgZ2l2ZW4sIGFuZCB0aGUKKyAqIGZlbmMgd2FpdCBpb2N0bCByZXR1cm5zIDAsIHRoZSBmZW5jZSBvYmplY3QgaGFzIGJlZW4gdW5yZWZlcmVuY2VkIGFmdGVyCisgKiB0aGUgd2FpdC4KKyAqLworCisjZGVmaW5lIERSTV9WTVdfRkVOQ0VfRkxBR19FWEVDICAgKDEgPDwgMCkKKyNkZWZpbmUgRFJNX1ZNV19GRU5DRV9GTEFHX1FVRVJZICAoMSA8PCAxKQorCisjZGVmaW5lIERSTV9WTVdfV0FJVF9PUFRJT05fVU5SRUYgKDEgPDwgMCkKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19mZW5jZV93YWl0X2FyZworICoKKyAqIEBoYW5kbGU6IEZlbmNlIG9iamVjdCBoYW5kbGUgYXMgcmV0dXJuZWQgYnkgdGhlIERSTV9WTVdfRVhFQ0JVRiBpb2N0bC4KKyAqIEBjb29raWVfdmFsaWQ6IE11c3QgYmUgcmVzZXQgdG8gMCBvbiBmaXJzdCBjYWxsLiBMZWZ0IGFsb25lIG9uIHJlc3RhcnQuCisgKiBAa2VybmVsX2Nvb2tpZTogU2V0IHRvIDAgb24gZmlyc3QgY2FsbC4gTGVmdCBhbG9uZSBvbiByZXN0YXJ0LgorICogQHRpbWVvdXRfdXM6IFdhaXQgdGltZW91dCBpbiBtaWNyb3NlY29uZHMuIDAgZm9yIGluZGVmaW5pdGUgdGltZW91dC4KKyAqIEBsYXp5OiBTZXQgdG8gMSBpZiB0aW1pbmcgaXMgbm90IGNyaXRpY2FsLiBBbGxvdyBtb3JlIHRoYW4gYSBrZXJuZWwgdGljaworICogYmVmb3JlIHJldHVybmluZy4KKyAqIEBmbGFnczogRmVuY2UgZmxhZ3MgdG8gd2FpdCBvbi4KKyAqIEB3YWl0X29wdGlvbnM6IE9wdGlvbnMgdGhhdCBjb250cm9sIHRoZSBiZWhhdmlvdXIgb2YgdGhlIHdhaXQgaW9jdGwuCisgKgorICogSW5wdXQgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfRkVOQ0VfV0FJVCBpb2N0bC4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19mZW5jZV93YWl0X2FyZyB7CisJdWludDMyX3QgaGFuZGxlOworCWludDMyX3QgIGNvb2tpZV92YWxpZDsKKwl1aW50NjRfdCBrZXJuZWxfY29va2llOworCXVpbnQ2NF90IHRpbWVvdXRfdXM7CisJaW50MzJfdCBsYXp5OworCWludDMyX3QgZmxhZ3M7CisJaW50MzJfdCB3YWl0X29wdGlvbnM7CisJaW50MzJfdCBwYWQ2NDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX0ZFTkNFX1NJR05BTEVECisgKgorICogQ2hlY2tzIGlmIGEgZmVuY2Ugb2JqZWN0IGlzIHNpZ25hbGVkLi4KKyAqLworCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X2ZlbmNlX3NpZ25hbGVkX2FyZworICoKKyAqIEBoYW5kbGU6IEZlbmNlIG9iamVjdCBoYW5kbGUgYXMgcmV0dXJuZWQgYnkgdGhlIERSTV9WTVdfRVhFQ0JVRiBpb2N0bC4KKyAqIEBmbGFnczogRmVuY2Ugb2JqZWN0IGZsYWdzIGlucHV0IHRvIERSTV9WTVdfRkVOQ0VfU0lHTkFMRUQgaW9jdGwKKyAqIEBzaWduYWxlZDogT3V0OiBGbGFncyBzaWduYWxlZC4KKyAqIEBzZXF1ZW5jZTogT3V0OiBIaWdoZXN0IHNlcXVlbmNlIHBhc3NlZCBzbyBmYXIuIENhbiBiZSB1c2VkIHRvIHNpZ25hbCB0aGUKKyAqIEVYRUMgZmxhZyBvZiB1c2VyLXNwYWNlIGZlbmNlIG9iamVjdHMuCisgKgorICogSW5wdXQvT3V0cHV0IGFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX0ZFTkNFX1NJR05BTEVEIGFuZCBEUk1fVk1XX0ZFTkNFX1VOUkVGCisgKiBpb2N0bHMuCisgKi8KKworc3RydWN0IGRybV92bXdfZmVuY2Vfc2lnbmFsZWRfYXJnIHsKKwkgdWludDMyX3QgaGFuZGxlOworCSB1aW50MzJfdCBmbGFnczsKKwkgaW50MzJfdCBzaWduYWxlZDsKKwkgdWludDMyX3QgcGFzc2VkX3NlcW5vOworCSB1aW50MzJfdCBzaWduYWxlZF9mbGFnczsKKwkgdWludDMyX3QgcGFkNjQ7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19GRU5DRV9VTlJFRgorICoKKyAqIFVucmVmZXJlbmNlcyBhIGZlbmNlIG9iamVjdCwgYW5kIGNhdXNlcyBpdCB0byBiZSBkZXN0cm95ZWQgaWYgdGhlcmUgYXJlIG5vCisgKiBvdGhlciByZWZlcmVuY2VzIHRvIGl0LgorICoKKyAqLworCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X2ZlbmNlX2FyZworICoKKyAqIEBoYW5kbGU6IEZlbmNlIG9iamVjdCBoYW5kbGUgYXMgcmV0dXJuZWQgYnkgdGhlIERSTV9WTVdfRVhFQ0JVRiBpb2N0bC4KKyAqCisgKiBJbnB1dC9PdXRwdXQgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfRkVOQ0VfVU5SRUYgaW9jdGwuLgorICovCisKK3N0cnVjdCBkcm1fdm13X2ZlbmNlX2FyZyB7CisJIHVpbnQzMl90IGhhbmRsZTsKKwkgdWludDMyX3QgcGFkNjQ7Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX0ZFTkNFX0VWRU5UCisgKgorICogUXVldWVzIGFuIGV2ZW50IG9uIGEgZmVuY2UgdG8gYmUgZGVsaXZlcmVkIG9uIHRoZSBkcm0gY2hhcmFjdGVyIGRldmljZQorICogd2hlbiB0aGUgZmVuY2UgaGFzIHNpZ25hbGVkIHRoZSBEUk1fVk1XX0ZFTkNFX0ZMQUdfRVhFQyBmbGFnLgorICogT3B0aW9uYWxseSB0aGUgYXBwcm94aW1hdGUgdGltZSB3aGVuIHRoZSBmZW5jZSBzaWduYWxlZCBpcworICogZ2l2ZW4gYnkgdGhlIGV2ZW50LgorICovCisKKy8qCisgKiBUaGUgZXZlbnQgdHlwZQorICovCisjZGVmaW5lIERSTV9WTVdfRVZFTlRfRkVOQ0VfU0lHTkFMRUQgMHg4MDAwMDAwMAorCitzdHJ1Y3QgZHJtX3Ztd19ldmVudF9mZW5jZSB7CisJc3RydWN0IGRybV9ldmVudCBiYXNlOworCXVpbnQ2NF90IHVzZXJfZGF0YTsKKwl1aW50MzJfdCB0dl9zZWM7CisJdWludDMyX3QgdHZfdXNlYzsKK307CisKKy8qCisgKiBGbGFncyB0aGF0IG1heSBiZSBnaXZlbiB0byB0aGUgY29tbWFuZC4KKyAqLworLyogUmVxdWVzdCBmZW5jZSBzaWduYWxlZCB0aW1lIG9uIHRoZSBldmVudC4gKi8KKyNkZWZpbmUgRFJNX1ZNV19GRV9GTEFHX1JFUV9USU1FICgxIDw8IDApCisKKy8qKgorICogc3RydWN0IGRybV92bXdfZmVuY2VfZXZlbnRfYXJnCisgKgorICogQGZlbmNlX3JlcDogUG9pbnRlciB0byBmZW5jZV9yZXAgc3RydWN0dXJlIGNhc3QgdG8gdWludDY0X3Qgb3IgMCBpZgorICogdGhlIGZlbmNlIGlzIG5vdCBzdXBwb3NlZCB0byBiZSByZWZlcmVuY2VkIGJ5IHVzZXItc3BhY2UuCisgKiBAdXNlcl9pbmZvOiBJbmZvIHRvIGJlIGRlbGl2ZXJlZCB3aXRoIHRoZSBldmVudC4KKyAqIEBoYW5kbGU6IEF0dGFjaCB0aGUgZXZlbnQgdG8gdGhpcyBmZW5jZSBvbmx5LgorICogQGZsYWdzOiBBIHNldCBvZiBmbGFncyBhcyBkZWZpbmVkIGFib3ZlLgorICovCitzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9ldmVudF9hcmcgeworCXVpbnQ2NF90IGZlbmNlX3JlcDsKKwl1aW50NjRfdCB1c2VyX2RhdGE7CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IGZsYWdzOworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19QUkVTRU5UCisgKgorICogRXhlY3V0ZXMgYW4gU1ZHQSBwcmVzZW50IG9uIGEgZ2l2ZW4gZmIgZm9yIGEgZ2l2ZW4gc3VyZmFjZS4gVGhlIHN1cmZhY2UKKyAqIGlzIHBsYWNlZCBvbiB0aGUgZnJhbWVidWZmZXIuIENsaXByZWN0cyBhcmUgZ2l2ZW4gcmVsYXRpdmUgdG8gdGhlIGdpdmVuCisgKiBwb2ludCAodGhlIHBvaW50IGRpc2lnbmF0ZWQgYnkgZGVzdF97eHx5fSkuCisgKgorICovCisKKy8qKgorICogc3RydWN0IGRybV92bXdfcHJlc2VudF9hcmcKKyAqIEBmYl9pZDogZnJhbWVidWZmZXIgaWQgdG8gcHJlc2VudCAvIHJlYWQgYmFjayBmcm9tLgorICogQHNpZDogU3VyZmFjZSBpZCB0byBwcmVzZW50IGZyb20uCisgKiBAZGVzdF94OiBYIHBsYWNlbWVudCBjb29yZGluYXRlIGZvciBzdXJmYWNlLgorICogQGRlc3RfeTogWSBwbGFjZW1lbnQgY29vcmRpbmF0ZSBmb3Igc3VyZmFjZS4KKyAqIEBjbGlwc19wdHI6IFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY2xpcCByZWN0cyBjYXN0IHRvIGFuIHVpbnQ2NF90LgorICogQG51bV9jbGlwczogTnVtYmVyIG9mIGNsaXByZWN0cyBnaXZlbiByZWxhdGl2ZSB0byB0aGUgZnJhbWVidWZmZXIgb3JpZ2luLAorICogaW4gdGhlIHNhbWUgY29vcmRpbmF0ZSBzcGFjZSBhcyB0aGUgZnJhbWUgYnVmZmVyLgorICogQHBhZDY0OiBVbnVzZWQgNjQtYml0IHBhZGRpbmcuCisgKgorICogSW5wdXQgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfUFJFU0VOVCBpb2N0bC4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19wcmVzZW50X2FyZyB7CisJdWludDMyX3QgZmJfaWQ7CisJdWludDMyX3Qgc2lkOworCWludDMyX3QgZGVzdF94OworCWludDMyX3QgZGVzdF95OworCXVpbnQ2NF90IGNsaXBzX3B0cjsKKwl1aW50MzJfdCBudW1fY2xpcHM7CisJdWludDMyX3QgcGFkNjQ7Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX1BSRVNFTlRfUkVBREJBQ0sKKyAqCisgKiBFeGVjdXRlcyBhbiBTVkdBIHByZXNlbnQgcmVhZGJhY2sgZnJvbSBhIGdpdmVuIGZiIHRvIHRoZSBkbWEgYnVmZmVyCisgKiBjdXJyZW50bHkgYm91bmQgYXMgdGhlIGZiLiBJZiB0aGVyZSBpcyBubyBkbWEgYnVmZmVyIGJvdW5kIHRvIHRoZSBmYiwKKyAqIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgKgorICovCisKKy8qKgorICogc3RydWN0IGRybV92bXdfcHJlc2VudF9hcmcKKyAqIEBmYl9pZDogZmJfaWQgdG8gcHJlc2VudCAvIHJlYWQgYmFjayBmcm9tLgorICogQG51bV9jbGlwczogTnVtYmVyIG9mIGNsaXByZWN0cy4KKyAqIEBjbGlwc19wdHI6IFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY2xpcCByZWN0cyBjYXN0IHRvIGFuIHVpbnQ2NF90LgorICogQGZlbmNlX3JlcDogUG9pbnRlciB0byBhIHN0cnVjdCBkcm1fdm13X2ZlbmNlX3JlcCwgY2FzdCB0byBhbiB1aW50NjRfdC4KKyAqIElmIHRoaXMgbWVtYmVyIGlzIE5VTEwsIHRoZW4gdGhlIGlvY3RsIHNob3VsZCBub3QgcmV0dXJuIGEgZmVuY2UuCisgKi8KKworc3RydWN0IGRybV92bXdfcHJlc2VudF9yZWFkYmFja19hcmcgeworCSB1aW50MzJfdCBmYl9pZDsKKwkgdWludDMyX3QgbnVtX2NsaXBzOworCSB1aW50NjRfdCBjbGlwc19wdHI7CisJIHVpbnQ2NF90IGZlbmNlX3JlcDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX1VQREFURV9MQVlPVVQgLSBVcGRhdGUgbGF5b3V0CisgKgorICogVXBkYXRlcyB0aGUgcHJlZmVycmVkIG1vZGVzIGFuZCBjb25uZWN0aW9uIHN0YXR1cyBmb3IgY29ubmVjdG9ycy4gVGhlCisgKiBjb21tYW5kIGNvbnNpc3RzIG9mIG9uZSBkcm1fdm13X3VwZGF0ZV9sYXlvdXRfYXJnIHBvaW50aW5nIHRvIGFuIGFycmF5CisgKiBvZiBudW1fb3V0cHV0cyBkcm1fdm13X3JlY3Qncy4KKyAqLworCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X3VwZGF0ZV9sYXlvdXRfYXJnCisgKgorICogQG51bV9vdXRwdXRzOiBudW1iZXIgb2YgYWN0aXZlIGNvbm5lY3RvcnMKKyAqIEByZWN0czogcG9pbnRlciB0byBhcnJheSBvZiBkcm1fdm13X3JlY3QgY2FzdCB0byBhbiB1aW50NjRfdAorICoKKyAqIElucHV0IGFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX1VQREFURV9MQVlPVVQgSW9jdGwuCisgKi8KK3N0cnVjdCBkcm1fdm13X3VwZGF0ZV9sYXlvdXRfYXJnIHsKKwl1aW50MzJfdCBudW1fb3V0cHV0czsKKwl1aW50MzJfdCBwYWQ2NDsKKwl1aW50NjRfdCByZWN0czsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9lbGYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZWxmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M2NDEyMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZWxmLmgKQEAgLTAsMCArMSwyNzk2IEBACisvKiBUaGlzIGZpbGUgZGVmaW5lcyBzdGFuZGFyZCBFTEYgdHlwZXMsIHN0cnVjdHVyZXMsIGFuZCBtYWNyb3MuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMywyMDA0LDIwMDUsMjAwNiwyMDA3LDIwMDgsMjAwOSwyMDEwLDIwMTEKKwlGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfRUxGX0gKKyNkZWZpbmUJX0VMRl9IIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogU3RhbmRhcmQgRUxGIHR5cGVzLiAgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBUeXBlIGZvciBhIDE2LWJpdCBxdWFudGl0eS4gICovCit0eXBlZGVmIHVpbnQxNl90IEVsZjMyX0hhbGY7Cit0eXBlZGVmIHVpbnQxNl90IEVsZjY0X0hhbGY7CisKKy8qIFR5cGVzIGZvciBzaWduZWQgYW5kIHVuc2lnbmVkIDMyLWJpdCBxdWFudGl0aWVzLiAgKi8KK3R5cGVkZWYgdWludDMyX3QgRWxmMzJfV29yZDsKK3R5cGVkZWYJaW50MzJfdCAgRWxmMzJfU3dvcmQ7Cit0eXBlZGVmIHVpbnQzMl90IEVsZjY0X1dvcmQ7Cit0eXBlZGVmCWludDMyX3QgIEVsZjY0X1N3b3JkOworCisvKiBUeXBlcyBmb3Igc2lnbmVkIGFuZCB1bnNpZ25lZCA2NC1iaXQgcXVhbnRpdGllcy4gICovCit0eXBlZGVmIHVpbnQ2NF90IEVsZjMyX1h3b3JkOwordHlwZWRlZglpbnQ2NF90ICBFbGYzMl9TeHdvcmQ7Cit0eXBlZGVmIHVpbnQ2NF90IEVsZjY0X1h3b3JkOwordHlwZWRlZglpbnQ2NF90ICBFbGY2NF9TeHdvcmQ7CisKKy8qIFR5cGUgb2YgYWRkcmVzc2VzLiAgKi8KK3R5cGVkZWYgdWludDMyX3QgRWxmMzJfQWRkcjsKK3R5cGVkZWYgdWludDY0X3QgRWxmNjRfQWRkcjsKKworLyogVHlwZSBvZiBmaWxlIG9mZnNldHMuICAqLwordHlwZWRlZiB1aW50MzJfdCBFbGYzMl9PZmY7Cit0eXBlZGVmIHVpbnQ2NF90IEVsZjY0X09mZjsKKworLyogVHlwZSBmb3Igc2VjdGlvbiBpbmRpY2VzLCB3aGljaCBhcmUgMTYtYml0IHF1YW50aXRpZXMuICAqLwordHlwZWRlZiB1aW50MTZfdCBFbGYzMl9TZWN0aW9uOwordHlwZWRlZiB1aW50MTZfdCBFbGY2NF9TZWN0aW9uOworCisvKiBUeXBlIGZvciB2ZXJzaW9uIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCit0eXBlZGVmIEVsZjMyX0hhbGYgRWxmMzJfVmVyc3ltOwordHlwZWRlZiBFbGY2NF9IYWxmIEVsZjY0X1ZlcnN5bTsKKworCisvKiBUaGUgRUxGIGZpbGUgaGVhZGVyLiAgVGhpcyBhcHBlYXJzIGF0IHRoZSBzdGFydCBvZiBldmVyeSBFTEYgZmlsZS4gICovCisKKyNkZWZpbmUgRUlfTklERU5UICgxNikKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhcgllX2lkZW50W0VJX05JREVOVF07CS8qIE1hZ2ljIG51bWJlciBhbmQgb3RoZXIgaW5mbyAqLworICBFbGYzMl9IYWxmCWVfdHlwZTsJCQkvKiBPYmplY3QgZmlsZSB0eXBlICovCisgIEVsZjMyX0hhbGYJZV9tYWNoaW5lOwkJLyogQXJjaGl0ZWN0dXJlICovCisgIEVsZjMyX1dvcmQJZV92ZXJzaW9uOwkJLyogT2JqZWN0IGZpbGUgdmVyc2lvbiAqLworICBFbGYzMl9BZGRyCWVfZW50cnk7CQkvKiBFbnRyeSBwb2ludCB2aXJ0dWFsIGFkZHJlc3MgKi8KKyAgRWxmMzJfT2ZmCWVfcGhvZmY7CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLworICBFbGYzMl9PZmYJZV9zaG9mZjsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCisgIEVsZjMyX1dvcmQJZV9mbGFnczsJCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyBmbGFncyAqLworICBFbGYzMl9IYWxmCWVfZWhzaXplOwkJLyogRUxGIGhlYWRlciBzaXplIGluIGJ5dGVzICovCisgIEVsZjMyX0hhbGYJZV9waGVudHNpemU7CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCisgIEVsZjMyX0hhbGYJZV9waG51bTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCisgIEVsZjMyX0hhbGYJZV9zaGVudHNpemU7CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCisgIEVsZjMyX0hhbGYJZV9zaG51bTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCisgIEVsZjMyX0hhbGYJZV9zaHN0cm5keDsJCS8qIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCAqLworfSBFbGYzMl9FaGRyOworCit0eXBlZGVmIHN0cnVjdAoreworICB1bnNpZ25lZCBjaGFyCWVfaWRlbnRbRUlfTklERU5UXTsJLyogTWFnaWMgbnVtYmVyIGFuZCBvdGhlciBpbmZvICovCisgIEVsZjY0X0hhbGYJZV90eXBlOwkJCS8qIE9iamVjdCBmaWxlIHR5cGUgKi8KKyAgRWxmNjRfSGFsZgllX21hY2hpbmU7CQkvKiBBcmNoaXRlY3R1cmUgKi8KKyAgRWxmNjRfV29yZAllX3ZlcnNpb247CQkvKiBPYmplY3QgZmlsZSB2ZXJzaW9uICovCisgIEVsZjY0X0FkZHIJZV9lbnRyeTsJCS8qIEVudHJ5IHBvaW50IHZpcnR1YWwgYWRkcmVzcyAqLworICBFbGY2NF9PZmYJZV9waG9mZjsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCisgIEVsZjY0X09mZgllX3Nob2ZmOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KKyAgRWxmNjRfV29yZAllX2ZsYWdzOwkJLyogUHJvY2Vzc29yLXNwZWNpZmljIGZsYWdzICovCisgIEVsZjY0X0hhbGYJZV9laHNpemU7CQkvKiBFTEYgaGVhZGVyIHNpemUgaW4gYnl0ZXMgKi8KKyAgRWxmNjRfSGFsZgllX3BoZW50c2l6ZTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IHNpemUgKi8KKyAgRWxmNjRfSGFsZgllX3BobnVtOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KKyAgRWxmNjRfSGFsZgllX3NoZW50c2l6ZTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IHNpemUgKi8KKyAgRWxmNjRfSGFsZgllX3NobnVtOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KKyAgRWxmNjRfSGFsZgllX3Noc3RybmR4OwkJLyogU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4ICovCit9IEVsZjY0X0VoZHI7CisKKy8qIEZpZWxkcyBpbiB0aGUgZV9pZGVudCBhcnJheS4gIFRoZSBFSV8qIG1hY3JvcyBhcmUgaW5kaWNlcyBpbnRvIHRoZQorICAgYXJyYXkuICBUaGUgbWFjcm9zIHVuZGVyIGVhY2ggRUlfKiBtYWNybyBhcmUgdGhlIHZhbHVlcyB0aGUgYnl0ZQorICAgbWF5IGhhdmUuICAqLworCisjZGVmaW5lIEVJX01BRzAJCTAJCS8qIEZpbGUgaWRlbnRpZmljYXRpb24gYnl0ZSAwIGluZGV4ICovCisjZGVmaW5lIEVMRk1BRzAJCTB4N2YJCS8qIE1hZ2ljIG51bWJlciBieXRlIDAgKi8KKworI2RlZmluZSBFSV9NQUcxCQkxCQkvKiBGaWxlIGlkZW50aWZpY2F0aW9uIGJ5dGUgMSBpbmRleCAqLworI2RlZmluZSBFTEZNQUcxCQknRScJCS8qIE1hZ2ljIG51bWJlciBieXRlIDEgKi8KKworI2RlZmluZSBFSV9NQUcyCQkyCQkvKiBGaWxlIGlkZW50aWZpY2F0aW9uIGJ5dGUgMiBpbmRleCAqLworI2RlZmluZSBFTEZNQUcyCQknTCcJCS8qIE1hZ2ljIG51bWJlciBieXRlIDIgKi8KKworI2RlZmluZSBFSV9NQUczCQkzCQkvKiBGaWxlIGlkZW50aWZpY2F0aW9uIGJ5dGUgMyBpbmRleCAqLworI2RlZmluZSBFTEZNQUczCQknRicJCS8qIE1hZ2ljIG51bWJlciBieXRlIDMgKi8KKworLyogQ29uZ2xvbWVyYXRpb24gb2YgdGhlIGlkZW50aWZpY2F0aW9uIGJ5dGVzLCBmb3IgZWFzeSB0ZXN0aW5nIGFzIGEgd29yZC4gICovCisjZGVmaW5lCUVMRk1BRwkJIlwxNzdFTEYiCisjZGVmaW5lCVNFTEZNQUcJCTQKKworI2RlZmluZSBFSV9DTEFTUwk0CQkvKiBGaWxlIGNsYXNzIGJ5dGUgaW5kZXggKi8KKyNkZWZpbmUgRUxGQ0xBU1NOT05FCTAJCS8qIEludmFsaWQgY2xhc3MgKi8KKyNkZWZpbmUgRUxGQ0xBU1MzMgkxCQkvKiAzMi1iaXQgb2JqZWN0cyAqLworI2RlZmluZSBFTEZDTEFTUzY0CTIJCS8qIDY0LWJpdCBvYmplY3RzICovCisjZGVmaW5lIEVMRkNMQVNTTlVNCTMKKworI2RlZmluZSBFSV9EQVRBCQk1CQkvKiBEYXRhIGVuY29kaW5nIGJ5dGUgaW5kZXggKi8KKyNkZWZpbmUgRUxGREFUQU5PTkUJMAkJLyogSW52YWxpZCBkYXRhIGVuY29kaW5nICovCisjZGVmaW5lIEVMRkRBVEEyTFNCCTEJCS8qIDIncyBjb21wbGVtZW50LCBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIEVMRkRBVEEyTVNCCTIJCS8qIDIncyBjb21wbGVtZW50LCBiaWcgZW5kaWFuICovCisjZGVmaW5lIEVMRkRBVEFOVU0JMworCisjZGVmaW5lIEVJX1ZFUlNJT04JNgkJLyogRmlsZSB2ZXJzaW9uIGJ5dGUgaW5kZXggKi8KKwkJCQkJLyogVmFsdWUgbXVzdCBiZSBFVl9DVVJSRU5UICovCisKKyNkZWZpbmUgRUlfT1NBQkkJNwkJLyogT1MgQUJJIGlkZW50aWZpY2F0aW9uICovCisjZGVmaW5lIEVMRk9TQUJJX05PTkUJCTAJLyogVU5JWCBTeXN0ZW0gViBBQkkgKi8KKyNkZWZpbmUgRUxGT1NBQklfU1lTVgkJMAkvKiBBbGlhcy4gICovCisjZGVmaW5lIEVMRk9TQUJJX0hQVVgJCTEJLyogSFAtVVggKi8KKyNkZWZpbmUgRUxGT1NBQklfTkVUQlNECQkyCS8qIE5ldEJTRC4gICovCisjZGVmaW5lIEVMRk9TQUJJX0dOVQkJMwkvKiBPYmplY3QgdXNlcyBHTlUgRUxGIGV4dGVuc2lvbnMuICAqLworI2RlZmluZSBFTEZPU0FCSV9MSU5VWAkJRUxGT1NBQklfR05VIC8qIENvbXBhdGliaWxpdHkgYWxpYXMuICAqLworI2RlZmluZSBFTEZPU0FCSV9TT0xBUklTCTYJLyogU3VuIFNvbGFyaXMuICAqLworI2RlZmluZSBFTEZPU0FCSV9BSVgJCTcJLyogSUJNIEFJWC4gICovCisjZGVmaW5lIEVMRk9TQUJJX0lSSVgJCTgJLyogU0dJIElyaXguICAqLworI2RlZmluZSBFTEZPU0FCSV9GUkVFQlNECTkJLyogRnJlZUJTRC4gICovCisjZGVmaW5lIEVMRk9TQUJJX1RSVTY0CQkxMAkvKiBDb21wYXEgVFJVNjQgVU5JWC4gICovCisjZGVmaW5lIEVMRk9TQUJJX01PREVTVE8JMTEJLyogTm92ZWxsIE1vZGVzdG8uICAqLworI2RlZmluZSBFTEZPU0FCSV9PUEVOQlNECTEyCS8qIE9wZW5CU0QuICAqLworI2RlZmluZSBFTEZPU0FCSV9BUk1fQUVBQkkJNjQJLyogQVJNIEVBQkkgKi8KKyNkZWZpbmUgRUxGT1NBQklfQVJNCQk5NwkvKiBBUk0gKi8KKyNkZWZpbmUgRUxGT1NBQklfU1RBTkRBTE9ORQkyNTUJLyogU3RhbmRhbG9uZSAoZW1iZWRkZWQpIGFwcGxpY2F0aW9uICovCisKKyNkZWZpbmUgRUlfQUJJVkVSU0lPTgk4CQkvKiBBQkkgdmVyc2lvbiAqLworCisjZGVmaW5lIEVJX1BBRAkJOQkJLyogQnl0ZSBpbmRleCBvZiBwYWRkaW5nIGJ5dGVzICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgZV90eXBlIChvYmplY3QgZmlsZSB0eXBlKS4gICovCisKKyNkZWZpbmUgRVRfTk9ORQkJMAkJLyogTm8gZmlsZSB0eXBlICovCisjZGVmaW5lIEVUX1JFTAkJMQkJLyogUmVsb2NhdGFibGUgZmlsZSAqLworI2RlZmluZSBFVF9FWEVDCQkyCQkvKiBFeGVjdXRhYmxlIGZpbGUgKi8KKyNkZWZpbmUgRVRfRFlOCQkzCQkvKiBTaGFyZWQgb2JqZWN0IGZpbGUgKi8KKyNkZWZpbmUgRVRfQ09SRQkJNAkJLyogQ29yZSBmaWxlICovCisjZGVmaW5lCUVUX05VTQkJNQkJLyogTnVtYmVyIG9mIGRlZmluZWQgdHlwZXMgKi8KKyNkZWZpbmUgRVRfTE9PUwkJMHhmZTAwCQkvKiBPUy1zcGVjaWZpYyByYW5nZSBzdGFydCAqLworI2RlZmluZSBFVF9ISU9TCQkweGZlZmYJCS8qIE9TLXNwZWNpZmljIHJhbmdlIGVuZCAqLworI2RlZmluZSBFVF9MT1BST0MJMHhmZjAwCQkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgcmFuZ2Ugc3RhcnQgKi8KKyNkZWZpbmUgRVRfSElQUk9DCTB4ZmZmZgkJLyogUHJvY2Vzc29yLXNwZWNpZmljIHJhbmdlIGVuZCAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIGVfbWFjaGluZSAoYXJjaGl0ZWN0dXJlKS4gICovCisKKyNkZWZpbmUgRU1fTk9ORQkJIDAJCS8qIE5vIG1hY2hpbmUgKi8KKyNkZWZpbmUgRU1fTTMyCQkgMQkJLyogQVQmVCBXRSAzMjEwMCAqLworI2RlZmluZSBFTV9TUEFSQwkgMgkJLyogU1VOIFNQQVJDICovCisjZGVmaW5lIEVNXzM4NgkJIDMJCS8qIEludGVsIDgwMzg2ICovCisjZGVmaW5lIEVNXzY4SwkJIDQJCS8qIE1vdG9yb2xhIG02OGsgZmFtaWx5ICovCisjZGVmaW5lIEVNXzg4SwkJIDUJCS8qIE1vdG9yb2xhIG04OGsgZmFtaWx5ICovCisjZGVmaW5lIEVNXzg2MAkJIDcJCS8qIEludGVsIDgwODYwICovCisjZGVmaW5lIEVNX01JUFMJCSA4CQkvKiBNSVBTIFIzMDAwIGJpZy1lbmRpYW4gKi8KKyNkZWZpbmUgRU1fUzM3MAkJIDkJCS8qIElCTSBTeXN0ZW0vMzcwICovCisjZGVmaW5lIEVNX01JUFNfUlMzX0xFCTEwCQkvKiBNSVBTIFIzMDAwIGxpdHRsZS1lbmRpYW4gKi8KKworI2RlZmluZSBFTV9QQVJJU0MJMTUJCS8qIEhQUEEgKi8KKyNkZWZpbmUgRU1fVlBQNTAwCTE3CQkvKiBGdWppdHN1IFZQUDUwMCAqLworI2RlZmluZSBFTV9TUEFSQzMyUExVUwkxOAkJLyogU3VuJ3MgInY4cGx1cyIgKi8KKyNkZWZpbmUgRU1fOTYwCQkxOQkJLyogSW50ZWwgODA5NjAgKi8KKyNkZWZpbmUgRU1fUFBDCQkyMAkJLyogUG93ZXJQQyAqLworI2RlZmluZSBFTV9QUEM2NAkyMQkJLyogUG93ZXJQQyA2NC1iaXQgKi8KKyNkZWZpbmUgRU1fUzM5MAkJMjIJCS8qIElCTSBTMzkwICovCisKKyNkZWZpbmUgRU1fVjgwMAkJMzYJCS8qIE5FQyBWODAwIHNlcmllcyAqLworI2RlZmluZSBFTV9GUjIwCQkzNwkJLyogRnVqaXRzdSBGUjIwICovCisjZGVmaW5lIEVNX1JIMzIJCTM4CQkvKiBUUlcgUkgtMzIgKi8KKyNkZWZpbmUgRU1fUkNFCQkzOQkJLyogTW90b3JvbGEgUkNFICovCisjZGVmaW5lIEVNX0FSTQkJNDAJCS8qIEFSTSAqLworI2RlZmluZSBFTV9GQUtFX0FMUEhBCTQxCQkvKiBEaWdpdGFsIEFscGhhICovCisjZGVmaW5lIEVNX1NICQk0MgkJLyogSGl0YWNoaSBTSCAqLworI2RlZmluZSBFTV9TUEFSQ1Y5CTQzCQkvKiBTUEFSQyB2OSA2NC1iaXQgKi8KKyNkZWZpbmUgRU1fVFJJQ09SRQk0NAkJLyogU2llbWVucyBUcmljb3JlICovCisjZGVmaW5lIEVNX0FSQwkJNDUJCS8qIEFyZ29uYXV0IFJJU0MgQ29yZSAqLworI2RlZmluZSBFTV9IOF8zMDAJNDYJCS8qIEhpdGFjaGkgSDgvMzAwICovCisjZGVmaW5lIEVNX0g4XzMwMEgJNDcJCS8qIEhpdGFjaGkgSDgvMzAwSCAqLworI2RlZmluZSBFTV9IOFMJCTQ4CQkvKiBIaXRhY2hpIEg4UyAqLworI2RlZmluZSBFTV9IOF81MDAJNDkJCS8qIEhpdGFjaGkgSDgvNTAwICovCisjZGVmaW5lIEVNX0lBXzY0CTUwCQkvKiBJbnRlbCBNZXJjZWQgKi8KKyNkZWZpbmUgRU1fTUlQU19YCTUxCQkvKiBTdGFuZm9yZCBNSVBTLVggKi8KKyNkZWZpbmUgRU1fQ09MREZJUkUJNTIJCS8qIE1vdG9yb2xhIENvbGRmaXJlICovCisjZGVmaW5lIEVNXzY4SEMxMgk1MwkJLyogTW90b3JvbGEgTTY4SEMxMiAqLworI2RlZmluZSBFTV9NTUEJCTU0CQkvKiBGdWppdHN1IE1NQSBNdWx0aW1lZGlhIEFjY2VsZXJhdG9yKi8KKyNkZWZpbmUgRU1fUENQCQk1NQkJLyogU2llbWVucyBQQ1AgKi8KKyNkZWZpbmUgRU1fTkNQVQkJNTYJCS8qIFNvbnkgbkNQVSBlbWJlZWRlZCBSSVNDICovCisjZGVmaW5lIEVNX05EUjEJCTU3CQkvKiBEZW5zbyBORFIxIG1pY3JvcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX1NUQVJDT1JFCTU4CQkvKiBNb3Rvcm9sYSBTdGFydCpDb3JlIHByb2Nlc3NvciAqLworI2RlZmluZSBFTV9NRTE2CQk1OQkJLyogVG95b3RhIE1FMTYgcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX1NUMTAwCTYwCQkvKiBTVE1pY3JvZWxlY3Ryb25pYyBTVDEwMCBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fVElOWUoJNjEJCS8qIEFkdmFuY2VkIExvZ2ljIENvcnAuIFRpbnlqIGVtYi5mYW0qLworI2RlZmluZSBFTV9YODZfNjQJNjIJCS8qIEFNRCB4ODYtNjQgYXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIEVNX1BEU1AJCTYzCQkvKiBTb255IERTUCBQcm9jZXNzb3IgKi8KKworI2RlZmluZSBFTV9GWDY2CQk2NgkJLyogU2llbWVucyBGWDY2IG1pY3JvY29udHJvbGxlciAqLworI2RlZmluZSBFTV9TVDlQTFVTCTY3CQkvKiBTVE1pY3JvZWxlY3Ryb25pY3MgU1Q5KyA4LzE2IG1jICovCisjZGVmaW5lIEVNX1NUNwkJNjgJCS8qIFNUbWljcm9lbGVjdHJvbmljcyBTVDcgOCBiaXQgbWMgKi8KKyNkZWZpbmUgRU1fNjhIQzE2CTY5CQkvKiBNb3Rvcm9sYSBNQzY4SEMxNiBtaWNyb2NvbnRyb2xsZXIgKi8KKyNkZWZpbmUgRU1fNjhIQzExCTcwCQkvKiBNb3Rvcm9sYSBNQzY4SEMxMSBtaWNyb2NvbnRyb2xsZXIgKi8KKyNkZWZpbmUgRU1fNjhIQzA4CTcxCQkvKiBNb3Rvcm9sYSBNQzY4SEMwOCBtaWNyb2NvbnRyb2xsZXIgKi8KKyNkZWZpbmUgRU1fNjhIQzA1CTcyCQkvKiBNb3Rvcm9sYSBNQzY4SEMwNSBtaWNyb2NvbnRyb2xsZXIgKi8KKyNkZWZpbmUgRU1fU1ZYCQk3MwkJLyogU2lsaWNvbiBHcmFwaGljcyBTVnggKi8KKyNkZWZpbmUgRU1fU1QxOQkJNzQJCS8qIFNUTWljcm9lbGVjdHJvbmljcyBTVDE5IDggYml0IG1jICovCisjZGVmaW5lIEVNX1ZBWAkJNzUJCS8qIERpZ2l0YWwgVkFYICovCisjZGVmaW5lIEVNX0NSSVMJCTc2CQkvKiBBeGlzIENvbW11bmljYXRpb25zIDMyLWJpdCBlbWJlZGRlZCBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fSkFWRUxJTgk3NwkJLyogSW5maW5lb24gVGVjaG5vbG9naWVzIDMyLWJpdCBlbWJlZGRlZCBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fRklSRVBBVEgJNzgJCS8qIEVsZW1lbnQgMTQgNjQtYml0IERTUCBQcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fWlNQCQk3OQkJLyogTFNJIExvZ2ljIDE2LWJpdCBEU1AgUHJvY2Vzc29yICovCisjZGVmaW5lIEVNX01NSVgJCTgwCQkvKiBEb25hbGQgS251dGgncyBlZHVjYXRpb25hbCA2NC1iaXQgcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX0hVQU5ZCTgxCQkvKiBIYXJ2YXJkIFVuaXZlcnNpdHkgbWFjaGluZS1pbmRlcGVuZGVudCBvYmplY3QgZmlsZXMgKi8KKyNkZWZpbmUgRU1fUFJJU00JODIJCS8qIFNpVGVyYSBQcmlzbSAqLworI2RlZmluZSBFTV9BVlIJCTgzCQkvKiBBdG1lbCBBVlIgOC1iaXQgbWljcm9jb250cm9sbGVyICovCisjZGVmaW5lIEVNX0ZSMzAJCTg0CQkvKiBGdWppdHN1IEZSMzAgKi8KKyNkZWZpbmUgRU1fRDEwVgkJODUJCS8qIE1pdHN1YmlzaGkgRDEwViAqLworI2RlZmluZSBFTV9EMzBWCQk4NgkJLyogTWl0c3ViaXNoaSBEMzBWICovCisjZGVmaW5lIEVNX1Y4NTAJCTg3CQkvKiBORUMgdjg1MCAqLworI2RlZmluZSBFTV9NMzJSCQk4OAkJLyogTWl0c3ViaXNoaSBNMzJSICovCisjZGVmaW5lIEVNX01OMTAzMDAJODkJCS8qIE1hdHN1c2hpdGEgTU4xMDMwMCAqLworI2RlZmluZSBFTV9NTjEwMjAwCTkwCQkvKiBNYXRzdXNoaXRhIE1OMTAyMDAgKi8KKyNkZWZpbmUgRU1fUEoJCTkxCQkvKiBwaWNvSmF2YSAqLworI2RlZmluZSBFTV9PUEVOUklTQwk5MgkJLyogT3BlblJJU0MgMzItYml0IGVtYmVkZGVkIHByb2Nlc3NvciAqLworI2RlZmluZSBFTV9BUkNfQTUJOTMJCS8qIEFSQyBDb3JlcyBUYW5nZW50LUE1ICovCisjZGVmaW5lIEVNX1hURU5TQQk5NAkJLyogVGVuc2lsaWNhIFh0ZW5zYSBBcmNoaXRlY3R1cmUgKi8KKyNkZWZpbmUgRU1fTlVNCQk5NQorCisvKiBJZiBpdCBpcyBuZWNlc3NhcnkgdG8gYXNzaWduIG5ldyB1bm9mZmljaWFsIEVNXyogdmFsdWVzLCBwbGVhc2UKKyAgIHBpY2sgbGFyZ2UgcmFuZG9tIG51bWJlcnMgKDB4ODUyMywgMHhhN2YyLCBldGMuKSB0byBtaW5pbWl6ZSB0aGUKKyAgIGNoYW5jZXMgb2YgY29sbGlzaW9uIHdpdGggb2ZmaWNpYWwgb3Igbm9uLUdOVSB1bm9mZmljaWFsIHZhbHVlcy4gICovCisKKyNkZWZpbmUgRU1fQUxQSEEJMHg5MDI2CisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgZV92ZXJzaW9uICh2ZXJzaW9uKS4gICovCisKKyNkZWZpbmUgRVZfTk9ORQkJMAkJLyogSW52YWxpZCBFTEYgdmVyc2lvbiAqLworI2RlZmluZSBFVl9DVVJSRU5UCTEJCS8qIEN1cnJlbnQgdmVyc2lvbiAqLworI2RlZmluZSBFVl9OVU0JCTIKKworLyogU2VjdGlvbiBoZWFkZXIuICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9Xb3JkCXNoX25hbWU7CQkvKiBTZWN0aW9uIG5hbWUgKHN0cmluZyB0YmwgaW5kZXgpICovCisgIEVsZjMyX1dvcmQJc2hfdHlwZTsJCS8qIFNlY3Rpb24gdHlwZSAqLworICBFbGYzMl9Xb3JkCXNoX2ZsYWdzOwkJLyogU2VjdGlvbiBmbGFncyAqLworICBFbGYzMl9BZGRyCXNoX2FkZHI7CQkvKiBTZWN0aW9uIHZpcnR1YWwgYWRkciBhdCBleGVjdXRpb24gKi8KKyAgRWxmMzJfT2ZmCXNoX29mZnNldDsJCS8qIFNlY3Rpb24gZmlsZSBvZmZzZXQgKi8KKyAgRWxmMzJfV29yZAlzaF9zaXplOwkJLyogU2VjdGlvbiBzaXplIGluIGJ5dGVzICovCisgIEVsZjMyX1dvcmQJc2hfbGluazsJCS8qIExpbmsgdG8gYW5vdGhlciBzZWN0aW9uICovCisgIEVsZjMyX1dvcmQJc2hfaW5mbzsJCS8qIEFkZGl0aW9uYWwgc2VjdGlvbiBpbmZvcm1hdGlvbiAqLworICBFbGYzMl9Xb3JkCXNoX2FkZHJhbGlnbjsJCS8qIFNlY3Rpb24gYWxpZ25tZW50ICovCisgIEVsZjMyX1dvcmQJc2hfZW50c2l6ZTsJCS8qIEVudHJ5IHNpemUgaWYgc2VjdGlvbiBob2xkcyB0YWJsZSAqLworfSBFbGYzMl9TaGRyOworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGY2NF9Xb3JkCXNoX25hbWU7CQkvKiBTZWN0aW9uIG5hbWUgKHN0cmluZyB0YmwgaW5kZXgpICovCisgIEVsZjY0X1dvcmQJc2hfdHlwZTsJCS8qIFNlY3Rpb24gdHlwZSAqLworICBFbGY2NF9Yd29yZAlzaF9mbGFnczsJCS8qIFNlY3Rpb24gZmxhZ3MgKi8KKyAgRWxmNjRfQWRkcglzaF9hZGRyOwkJLyogU2VjdGlvbiB2aXJ0dWFsIGFkZHIgYXQgZXhlY3V0aW9uICovCisgIEVsZjY0X09mZglzaF9vZmZzZXQ7CQkvKiBTZWN0aW9uIGZpbGUgb2Zmc2V0ICovCisgIEVsZjY0X1h3b3JkCXNoX3NpemU7CQkvKiBTZWN0aW9uIHNpemUgaW4gYnl0ZXMgKi8KKyAgRWxmNjRfV29yZAlzaF9saW5rOwkJLyogTGluayB0byBhbm90aGVyIHNlY3Rpb24gKi8KKyAgRWxmNjRfV29yZAlzaF9pbmZvOwkJLyogQWRkaXRpb25hbCBzZWN0aW9uIGluZm9ybWF0aW9uICovCisgIEVsZjY0X1h3b3JkCXNoX2FkZHJhbGlnbjsJCS8qIFNlY3Rpb24gYWxpZ25tZW50ICovCisgIEVsZjY0X1h3b3JkCXNoX2VudHNpemU7CQkvKiBFbnRyeSBzaXplIGlmIHNlY3Rpb24gaG9sZHMgdGFibGUgKi8KK30gRWxmNjRfU2hkcjsKKworLyogU3BlY2lhbCBzZWN0aW9uIGluZGljZXMuICAqLworCisjZGVmaW5lIFNITl9VTkRFRgkwCQkvKiBVbmRlZmluZWQgc2VjdGlvbiAqLworI2RlZmluZSBTSE5fTE9SRVNFUlZFCTB4ZmYwMAkJLyogU3RhcnQgb2YgcmVzZXJ2ZWQgaW5kaWNlcyAqLworI2RlZmluZSBTSE5fTE9QUk9DCTB4ZmYwMAkJLyogU3RhcnQgb2YgcHJvY2Vzc29yLXNwZWNpZmljICovCisjZGVmaW5lIFNITl9CRUZPUkUJMHhmZjAwCQkvKiBPcmRlciBzZWN0aW9uIGJlZm9yZSBhbGwgb3RoZXJzCisJCQkJCSAgIChTb2xhcmlzKS4gICovCisjZGVmaW5lIFNITl9BRlRFUgkweGZmMDEJCS8qIE9yZGVyIHNlY3Rpb24gYWZ0ZXIgYWxsIG90aGVycworCQkJCQkgICAoU29sYXJpcykuICAqLworI2RlZmluZSBTSE5fSElQUk9DCTB4ZmYxZgkJLyogRW5kIG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLworI2RlZmluZSBTSE5fTE9PUwkweGZmMjAJCS8qIFN0YXJ0IG9mIE9TLXNwZWNpZmljICovCisjZGVmaW5lIFNITl9ISU9TCTB4ZmYzZgkJLyogRW5kIG9mIE9TLXNwZWNpZmljICovCisjZGVmaW5lIFNITl9BQlMJCTB4ZmZmMQkJLyogQXNzb2NpYXRlZCBzeW1ib2wgaXMgYWJzb2x1dGUgKi8KKyNkZWZpbmUgU0hOX0NPTU1PTgkweGZmZjIJCS8qIEFzc29jaWF0ZWQgc3ltYm9sIGlzIGNvbW1vbiAqLworI2RlZmluZSBTSE5fWElOREVYCTB4ZmZmZgkJLyogSW5kZXggaXMgaW4gZXh0cmEgdGFibGUuICAqLworI2RlZmluZSBTSE5fSElSRVNFUlZFCTB4ZmZmZgkJLyogRW5kIG9mIHJlc2VydmVkIGluZGljZXMgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBzaF90eXBlIChzZWN0aW9uIHR5cGUpLiAgKi8KKworI2RlZmluZSBTSFRfTlVMTAkgIDAJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IHVudXNlZCAqLworI2RlZmluZSBTSFRfUFJPR0JJVFMJICAxCQkvKiBQcm9ncmFtIGRhdGEgKi8KKyNkZWZpbmUgU0hUX1NZTVRBQgkgIDIJCS8qIFN5bWJvbCB0YWJsZSAqLworI2RlZmluZSBTSFRfU1RSVEFCCSAgMwkJLyogU3RyaW5nIHRhYmxlICovCisjZGVmaW5lIFNIVF9SRUxBCSAgNAkJLyogUmVsb2NhdGlvbiBlbnRyaWVzIHdpdGggYWRkZW5kcyAqLworI2RlZmluZSBTSFRfSEFTSAkgIDUJCS8qIFN5bWJvbCBoYXNoIHRhYmxlICovCisjZGVmaW5lIFNIVF9EWU5BTUlDCSAgNgkJLyogRHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uICovCisjZGVmaW5lIFNIVF9OT1RFCSAgNwkJLyogTm90ZXMgKi8KKyNkZWZpbmUgU0hUX05PQklUUwkgIDgJCS8qIFByb2dyYW0gc3BhY2Ugd2l0aCBubyBkYXRhIChic3MpICovCisjZGVmaW5lIFNIVF9SRUwJCSAgOQkJLyogUmVsb2NhdGlvbiBlbnRyaWVzLCBubyBhZGRlbmRzICovCisjZGVmaW5lIFNIVF9TSExJQgkgIDEwCQkvKiBSZXNlcnZlZCAqLworI2RlZmluZSBTSFRfRFlOU1lNCSAgMTEJCS8qIER5bmFtaWMgbGlua2VyIHN5bWJvbCB0YWJsZSAqLworI2RlZmluZSBTSFRfSU5JVF9BUlJBWQkgIDE0CQkvKiBBcnJheSBvZiBjb25zdHJ1Y3RvcnMgKi8KKyNkZWZpbmUgU0hUX0ZJTklfQVJSQVkJICAxNQkJLyogQXJyYXkgb2YgZGVzdHJ1Y3RvcnMgKi8KKyNkZWZpbmUgU0hUX1BSRUlOSVRfQVJSQVkgMTYJCS8qIEFycmF5IG9mIHByZS1jb25zdHJ1Y3RvcnMgKi8KKyNkZWZpbmUgU0hUX0dST1VQCSAgMTcJCS8qIFNlY3Rpb24gZ3JvdXAgKi8KKyNkZWZpbmUgU0hUX1NZTVRBQl9TSE5EWCAgMTgJCS8qIEV4dGVuZGVkIHNlY3Rpb24gaW5kZWNlcyAqLworI2RlZmluZQlTSFRfTlVNCQkgIDE5CQkvKiBOdW1iZXIgb2YgZGVmaW5lZCB0eXBlcy4gICovCisjZGVmaW5lIFNIVF9MT09TCSAgMHg2MDAwMDAwMAkvKiBTdGFydCBPUy1zcGVjaWZpYy4gICovCisjZGVmaW5lIFNIVF9HTlVfQVRUUklCVVRFUyAweDZmZmZmZmY1CS8qIE9iamVjdCBhdHRyaWJ1dGVzLiAgKi8KKyNkZWZpbmUgU0hUX0dOVV9IQVNICSAgMHg2ZmZmZmZmNgkvKiBHTlUtc3R5bGUgaGFzaCB0YWJsZS4gICovCisjZGVmaW5lIFNIVF9HTlVfTElCTElTVAkgIDB4NmZmZmZmZjcJLyogUHJlbGluayBsaWJyYXJ5IGxpc3QgKi8KKyNkZWZpbmUgU0hUX0NIRUNLU1VNCSAgMHg2ZmZmZmZmOAkvKiBDaGVja3N1bSBmb3IgRFNPIGNvbnRlbnQuICAqLworI2RlZmluZSBTSFRfTE9TVU5XCSAgMHg2ZmZmZmZmYQkvKiBTdW4tc3BlY2lmaWMgbG93IGJvdW5kLiAgKi8KKyNkZWZpbmUgU0hUX1NVTldfbW92ZQkgIDB4NmZmZmZmZmEKKyNkZWZpbmUgU0hUX1NVTldfQ09NREFUICAgMHg2ZmZmZmZmYgorI2RlZmluZSBTSFRfU1VOV19zeW1pbmZvICAweDZmZmZmZmZjCisjZGVmaW5lIFNIVF9HTlVfdmVyZGVmCSAgMHg2ZmZmZmZmZAkvKiBWZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbi4gICovCisjZGVmaW5lIFNIVF9HTlVfdmVybmVlZAkgIDB4NmZmZmZmZmUJLyogVmVyc2lvbiBuZWVkcyBzZWN0aW9uLiAgKi8KKyNkZWZpbmUgU0hUX0dOVV92ZXJzeW0JICAweDZmZmZmZmZmCS8qIFZlcnNpb24gc3ltYm9sIHRhYmxlLiAgKi8KKyNkZWZpbmUgU0hUX0hJU1VOVwkgIDB4NmZmZmZmZmYJLyogU3VuLXNwZWNpZmljIGhpZ2ggYm91bmQuICAqLworI2RlZmluZSBTSFRfSElPUwkgIDB4NmZmZmZmZmYJLyogRW5kIE9TLXNwZWNpZmljIHR5cGUgKi8KKyNkZWZpbmUgU0hUX0xPUFJPQwkgIDB4NzAwMDAwMDAJLyogU3RhcnQgb2YgcHJvY2Vzc29yLXNwZWNpZmljICovCisjZGVmaW5lIFNIVF9ISVBST0MJICAweDdmZmZmZmZmCS8qIEVuZCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKyNkZWZpbmUgU0hUX0xPVVNFUgkgIDB4ODAwMDAwMDAJLyogU3RhcnQgb2YgYXBwbGljYXRpb24tc3BlY2lmaWMgKi8KKyNkZWZpbmUgU0hUX0hJVVNFUgkgIDB4OGZmZmZmZmYJLyogRW5kIG9mIGFwcGxpY2F0aW9uLXNwZWNpZmljICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3Igc2hfZmxhZ3MgKHNlY3Rpb24gZmxhZ3MpLiAgKi8KKworI2RlZmluZSBTSEZfV1JJVEUJICAgICAoMSA8PCAwKQkvKiBXcml0YWJsZSAqLworI2RlZmluZSBTSEZfQUxMT0MJICAgICAoMSA8PCAxKQkvKiBPY2N1cGllcyBtZW1vcnkgZHVyaW5nIGV4ZWN1dGlvbiAqLworI2RlZmluZSBTSEZfRVhFQ0lOU1RSCSAgICAgKDEgPDwgMikJLyogRXhlY3V0YWJsZSAqLworI2RlZmluZSBTSEZfTUVSR0UJICAgICAoMSA8PCA0KQkvKiBNaWdodCBiZSBtZXJnZWQgKi8KKyNkZWZpbmUgU0hGX1NUUklOR1MJICAgICAoMSA8PCA1KQkvKiBDb250YWlucyBudWwtdGVybWluYXRlZCBzdHJpbmdzICovCisjZGVmaW5lIFNIRl9JTkZPX0xJTksJICAgICAoMSA8PCA2KQkvKiBgc2hfaW5mbycgY29udGFpbnMgU0hUIGluZGV4ICovCisjZGVmaW5lIFNIRl9MSU5LX09SREVSCSAgICAgKDEgPDwgNykJLyogUHJlc2VydmUgb3JkZXIgYWZ0ZXIgY29tYmluaW5nICovCisjZGVmaW5lIFNIRl9PU19OT05DT05GT1JNSU5HICgxIDw8IDgpCS8qIE5vbi1zdGFuZGFyZCBPUyBzcGVjaWZpYyBoYW5kbGluZworCQkJCQkgICByZXF1aXJlZCAqLworI2RlZmluZSBTSEZfR1JPVVAJICAgICAoMSA8PCA5KQkvKiBTZWN0aW9uIGlzIG1lbWJlciBvZiBhIGdyb3VwLiAgKi8KKyNkZWZpbmUgU0hGX1RMUwkJICAgICAoMSA8PCAxMCkJLyogU2VjdGlvbiBob2xkIHRocmVhZC1sb2NhbCBkYXRhLiAgKi8KKyNkZWZpbmUgU0hGX01BU0tPUwkgICAgIDB4MGZmMDAwMDAJLyogT1Mtc3BlY2lmaWMuICAqLworI2RlZmluZSBTSEZfTUFTS1BST0MJICAgICAweGYwMDAwMDAwCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyAqLworI2RlZmluZSBTSEZfT1JERVJFRAkgICAgICgxIDw8IDMwKQkvKiBTcGVjaWFsIG9yZGVyaW5nIHJlcXVpcmVtZW50CisJCQkJCSAgIChTb2xhcmlzKS4gICovCisjZGVmaW5lIFNIRl9FWENMVURFCSAgICAgKDEgPDwgMzEpCS8qIFNlY3Rpb24gaXMgZXhjbHVkZWQgdW5sZXNzCisJCQkJCSAgIHJlZmVyZW5jZWQgb3IgYWxsb2NhdGVkIChTb2xhcmlzKS4qLworCisvKiBTZWN0aW9uIGdyb3VwIGhhbmRsaW5nLiAgKi8KKyNkZWZpbmUgR1JQX0NPTURBVAkweDEJCS8qIE1hcmsgZ3JvdXAgYXMgQ09NREFULiAgKi8KKworLyogU3ltYm9sIHRhYmxlIGVudHJ5LiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmMzJfV29yZAlzdF9uYW1lOwkJLyogU3ltYm9sIG5hbWUgKHN0cmluZyB0YmwgaW5kZXgpICovCisgIEVsZjMyX0FkZHIJc3RfdmFsdWU7CQkvKiBTeW1ib2wgdmFsdWUgKi8KKyAgRWxmMzJfV29yZAlzdF9zaXplOwkJLyogU3ltYm9sIHNpemUgKi8KKyAgdW5zaWduZWQgY2hhcglzdF9pbmZvOwkJLyogU3ltYm9sIHR5cGUgYW5kIGJpbmRpbmcgKi8KKyAgdW5zaWduZWQgY2hhcglzdF9vdGhlcjsJCS8qIFN5bWJvbCB2aXNpYmlsaXR5ICovCisgIEVsZjMyX1NlY3Rpb24Jc3Rfc2huZHg7CQkvKiBTZWN0aW9uIGluZGV4ICovCit9IEVsZjMyX1N5bTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmNjRfV29yZAlzdF9uYW1lOwkJLyogU3ltYm9sIG5hbWUgKHN0cmluZyB0YmwgaW5kZXgpICovCisgIHVuc2lnbmVkIGNoYXIJc3RfaW5mbzsJCS8qIFN5bWJvbCB0eXBlIGFuZCBiaW5kaW5nICovCisgIHVuc2lnbmVkIGNoYXIgc3Rfb3RoZXI7CQkvKiBTeW1ib2wgdmlzaWJpbGl0eSAqLworICBFbGY2NF9TZWN0aW9uCXN0X3NobmR4OwkJLyogU2VjdGlvbiBpbmRleCAqLworICBFbGY2NF9BZGRyCXN0X3ZhbHVlOwkJLyogU3ltYm9sIHZhbHVlICovCisgIEVsZjY0X1h3b3JkCXN0X3NpemU7CQkvKiBTeW1ib2wgc2l6ZSAqLworfSBFbGY2NF9TeW07CisKKy8qIFRoZSBzeW1pbmZvIHNlY3Rpb24gaWYgYXZhaWxhYmxlIGNvbnRhaW5zIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQKKyAgIGV2ZXJ5IGR5bmFtaWMgc3ltYm9sLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmMzJfSGFsZiBzaV9ib3VuZHRvOwkJLyogRGlyZWN0IGJpbmRpbmdzLCBzeW1ib2wgYm91bmQgdG8gKi8KKyAgRWxmMzJfSGFsZiBzaV9mbGFnczsJCQkvKiBQZXIgc3ltYm9sIGZsYWdzICovCit9IEVsZjMyX1N5bWluZm87CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjY0X0hhbGYgc2lfYm91bmR0bzsJCS8qIERpcmVjdCBiaW5kaW5ncywgc3ltYm9sIGJvdW5kIHRvICovCisgIEVsZjY0X0hhbGYgc2lfZmxhZ3M7CQkJLyogUGVyIHN5bWJvbCBmbGFncyAqLworfSBFbGY2NF9TeW1pbmZvOworCisvKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIHNpX2JvdW5kdG8uICAqLworI2RlZmluZSBTWU1JTkZPX0JUX1NFTEYJCTB4ZmZmZgkvKiBTeW1ib2wgYm91bmQgdG8gc2VsZiAqLworI2RlZmluZSBTWU1JTkZPX0JUX1BBUkVOVAkweGZmZmUJLyogU3ltYm9sIGJvdW5kIHRvIHBhcmVudCAqLworI2RlZmluZSBTWU1JTkZPX0JUX0xPV1JFU0VSVkUJMHhmZjAwCS8qIEJlZ2lubmluZyBvZiByZXNlcnZlZCBlbnRyaWVzICovCisKKy8qIFBvc3NpYmxlIGJpdG1hc2tzIGZvciBzaV9mbGFncy4gICovCisjZGVmaW5lIFNZTUlORk9fRkxHX0RJUkVDVAkweDAwMDEJLyogRGlyZWN0IGJvdW5kIHN5bWJvbCAqLworI2RlZmluZSBTWU1JTkZPX0ZMR19QQVNTVEhSVQkweDAwMDIJLyogUGFzcy10aHJ1IHN5bWJvbCBmb3IgdHJhbnNsYXRvciAqLworI2RlZmluZSBTWU1JTkZPX0ZMR19DT1BZCTB4MDAwNAkvKiBTeW1ib2wgaXMgYSBjb3B5LXJlbG9jICovCisjZGVmaW5lIFNZTUlORk9fRkxHX0xBWllMT0FECTB4MDAwOAkvKiBTeW1ib2wgYm91bmQgdG8gb2JqZWN0IHRvIGJlIGxhenkKKwkJCQkJICAgbG9hZGVkICovCisvKiBTeW1pbmZvIHZlcnNpb24gdmFsdWVzLiAgKi8KKyNkZWZpbmUgU1lNSU5GT19OT05FCQkwCisjZGVmaW5lIFNZTUlORk9fQ1VSUkVOVAkJMQorI2RlZmluZSBTWU1JTkZPX05VTQkJMgorCisKKy8qIEhvdyB0byBleHRyYWN0IGFuZCBpbnNlcnQgaW5mb3JtYXRpb24gaGVsZCBpbiB0aGUgc3RfaW5mbyBmaWVsZC4gICovCisKKyNkZWZpbmUgRUxGMzJfU1RfQklORCh2YWwpCQkoKCh1bnNpZ25lZCBjaGFyKSAodmFsKSkgPj4gNCkKKyNkZWZpbmUgRUxGMzJfU1RfVFlQRSh2YWwpCQkoKHZhbCkgJiAweGYpCisjZGVmaW5lIEVMRjMyX1NUX0lORk8oYmluZCwgdHlwZSkJKCgoYmluZCkgPDwgNCkgKyAoKHR5cGUpICYgMHhmKSkKKworLyogQm90aCBFbGYzMl9TeW0gYW5kIEVsZjY0X1N5bSB1c2UgdGhlIHNhbWUgb25lLWJ5dGUgc3RfaW5mbyBmaWVsZC4gICovCisjZGVmaW5lIEVMRjY0X1NUX0JJTkQodmFsKQkJRUxGMzJfU1RfQklORCAodmFsKQorI2RlZmluZSBFTEY2NF9TVF9UWVBFKHZhbCkJCUVMRjMyX1NUX1RZUEUgKHZhbCkKKyNkZWZpbmUgRUxGNjRfU1RfSU5GTyhiaW5kLCB0eXBlKQlFTEYzMl9TVF9JTkZPICgoYmluZCksICh0eXBlKSkKKworLyogTGVnYWwgdmFsdWVzIGZvciBTVF9CSU5EIHN1YmZpZWxkIG9mIHN0X2luZm8gKHN5bWJvbCBiaW5kaW5nKS4gICovCisKKyNkZWZpbmUgU1RCX0xPQ0FMCTAJCS8qIExvY2FsIHN5bWJvbCAqLworI2RlZmluZSBTVEJfR0xPQkFMCTEJCS8qIEdsb2JhbCBzeW1ib2wgKi8KKyNkZWZpbmUgU1RCX1dFQUsJMgkJLyogV2VhayBzeW1ib2wgKi8KKyNkZWZpbmUJU1RCX05VTQkJMwkJLyogTnVtYmVyIG9mIGRlZmluZWQgdHlwZXMuICAqLworI2RlZmluZSBTVEJfTE9PUwkxMAkJLyogU3RhcnQgb2YgT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgU1RCX0dOVV9VTklRVUUJMTAJCS8qIFVuaXF1ZSBzeW1ib2wuICAqLworI2RlZmluZSBTVEJfSElPUwkxMgkJLyogRW5kIG9mIE9TLXNwZWNpZmljICovCisjZGVmaW5lIFNUQl9MT1BST0MJMTMJCS8qIFN0YXJ0IG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLworI2RlZmluZSBTVEJfSElQUk9DCTE1CQkvKiBFbmQgb2YgcHJvY2Vzc29yLXNwZWNpZmljICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgU1RfVFlQRSBzdWJmaWVsZCBvZiBzdF9pbmZvIChzeW1ib2wgdHlwZSkuICAqLworCisjZGVmaW5lIFNUVF9OT1RZUEUJMAkJLyogU3ltYm9sIHR5cGUgaXMgdW5zcGVjaWZpZWQgKi8KKyNkZWZpbmUgU1RUX09CSkVDVAkxCQkvKiBTeW1ib2wgaXMgYSBkYXRhIG9iamVjdCAqLworI2RlZmluZSBTVFRfRlVOQwkyCQkvKiBTeW1ib2wgaXMgYSBjb2RlIG9iamVjdCAqLworI2RlZmluZSBTVFRfU0VDVElPTgkzCQkvKiBTeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEgc2VjdGlvbiAqLworI2RlZmluZSBTVFRfRklMRQk0CQkvKiBTeW1ib2wncyBuYW1lIGlzIGZpbGUgbmFtZSAqLworI2RlZmluZSBTVFRfQ09NTU9OCTUJCS8qIFN5bWJvbCBpcyBhIGNvbW1vbiBkYXRhIG9iamVjdCAqLworI2RlZmluZSBTVFRfVExTCQk2CQkvKiBTeW1ib2wgaXMgdGhyZWFkLWxvY2FsIGRhdGEgb2JqZWN0Ki8KKyNkZWZpbmUJU1RUX05VTQkJNwkJLyogTnVtYmVyIG9mIGRlZmluZWQgdHlwZXMuICAqLworI2RlZmluZSBTVFRfTE9PUwkxMAkJLyogU3RhcnQgb2YgT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgU1RUX0dOVV9JRlVOQwkxMAkJLyogU3ltYm9sIGlzIGluZGlyZWN0IGNvZGUgb2JqZWN0ICovCisjZGVmaW5lIFNUVF9ISU9TCTEyCQkvKiBFbmQgb2YgT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgU1RUX0xPUFJPQwkxMwkJLyogU3RhcnQgb2YgcHJvY2Vzc29yLXNwZWNpZmljICovCisjZGVmaW5lIFNUVF9ISVBST0MJMTUJCS8qIEVuZCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKworCisvKiBTeW1ib2wgdGFibGUgaW5kaWNlcyBhcmUgZm91bmQgaW4gdGhlIGhhc2ggYnVja2V0cyBhbmQgY2hhaW4gdGFibGUKKyAgIG9mIGEgc3ltYm9sIGhhc2ggdGFibGUgc2VjdGlvbi4gIFRoaXMgc3BlY2lhbCBpbmRleCB2YWx1ZSBpbmRpY2F0ZXMKKyAgIHRoZSBlbmQgb2YgYSBjaGFpbiwgbWVhbmluZyBubyBmdXJ0aGVyIHN5bWJvbHMgYXJlIGZvdW5kIGluIHRoYXQgYnVja2V0LiAgKi8KKworI2RlZmluZSBTVE5fVU5ERUYJMAkJLyogRW5kIG9mIGEgY2hhaW4uICAqLworCisKKy8qIEhvdyB0byBleHRyYWN0IGFuZCBpbnNlcnQgaW5mb3JtYXRpb24gaGVsZCBpbiB0aGUgc3Rfb3RoZXIgZmllbGQuICAqLworCisjZGVmaW5lIEVMRjMyX1NUX1ZJU0lCSUxJVFkobykJKChvKSAmIDB4MDMpCisKKy8qIEZvciBFTEY2NCB0aGUgZGVmaW5pdGlvbnMgYXJlIHRoZSBzYW1lLiAgKi8KKyNkZWZpbmUgRUxGNjRfU1RfVklTSUJJTElUWShvKQlFTEYzMl9TVF9WSVNJQklMSVRZIChvKQorCisvKiBTeW1ib2wgdmlzaWJpbGl0eSBzcGVjaWZpY2F0aW9uIGVuY29kZWQgaW4gdGhlIHN0X290aGVyIGZpZWxkLiAgKi8KKyNkZWZpbmUgU1RWX0RFRkFVTFQJMAkJLyogRGVmYXVsdCBzeW1ib2wgdmlzaWJpbGl0eSBydWxlcyAqLworI2RlZmluZSBTVFZfSU5URVJOQUwJMQkJLyogUHJvY2Vzc29yIHNwZWNpZmljIGhpZGRlbiBjbGFzcyAqLworI2RlZmluZSBTVFZfSElEREVOCTIJCS8qIFN5bSB1bmF2YWlsYWJsZSBpbiBvdGhlciBtb2R1bGVzICovCisjZGVmaW5lIFNUVl9QUk9URUNURUQJMwkJLyogTm90IHByZWVtcHRpYmxlLCBub3QgZXhwb3J0ZWQgKi8KKworCisvKiBSZWxvY2F0aW9uIHRhYmxlIGVudHJ5IHdpdGhvdXQgYWRkZW5kIChpbiBzZWN0aW9uIG9mIHR5cGUgU0hUX1JFTCkuICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9BZGRyCXJfb2Zmc2V0OwkJLyogQWRkcmVzcyAqLworICBFbGYzMl9Xb3JkCXJfaW5mbzsJCQkvKiBSZWxvY2F0aW9uIHR5cGUgYW5kIHN5bWJvbCBpbmRleCAqLworfSBFbGYzMl9SZWw7CisKKy8qIEkgaGF2ZSBzZWVuIHR3byBkaWZmZXJlbnQgZGVmaW5pdGlvbnMgb2YgdGhlIEVsZjY0X1JlbCBhbmQKKyAgIEVsZjY0X1JlbGEgc3RydWN0dXJlcywgc28gd2UnbGwgbGVhdmUgdGhlbSBvdXQgdW50aWwgTm92ZWxsIChvcgorICAgd2hvZXZlcikgZ2V0cyB0aGVpciBhY3QgdG9nZXRoZXIuICAqLworLyogVGhlIGZvbGxvd2luZywgYXQgbGVhc3QsIGlzIHVzZWQgb24gU3BhcmMgdjksIE1JUFMsIGFuZCBBbHBoYS4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjY0X0FkZHIJcl9vZmZzZXQ7CQkvKiBBZGRyZXNzICovCisgIEVsZjY0X1h3b3JkCXJfaW5mbzsJCQkvKiBSZWxvY2F0aW9uIHR5cGUgYW5kIHN5bWJvbCBpbmRleCAqLworfSBFbGY2NF9SZWw7CisKKy8qIFJlbG9jYXRpb24gdGFibGUgZW50cnkgd2l0aCBhZGRlbmQgKGluIHNlY3Rpb24gb2YgdHlwZSBTSFRfUkVMQSkuICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9BZGRyCXJfb2Zmc2V0OwkJLyogQWRkcmVzcyAqLworICBFbGYzMl9Xb3JkCXJfaW5mbzsJCQkvKiBSZWxvY2F0aW9uIHR5cGUgYW5kIHN5bWJvbCBpbmRleCAqLworICBFbGYzMl9Td29yZAlyX2FkZGVuZDsJCS8qIEFkZGVuZCAqLworfSBFbGYzMl9SZWxhOworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGY2NF9BZGRyCXJfb2Zmc2V0OwkJLyogQWRkcmVzcyAqLworICBFbGY2NF9Yd29yZAlyX2luZm87CQkJLyogUmVsb2NhdGlvbiB0eXBlIGFuZCBzeW1ib2wgaW5kZXggKi8KKyAgRWxmNjRfU3h3b3JkCXJfYWRkZW5kOwkJLyogQWRkZW5kICovCit9IEVsZjY0X1JlbGE7CisKKy8qIEhvdyB0byBleHRyYWN0IGFuZCBpbnNlcnQgaW5mb3JtYXRpb24gaGVsZCBpbiB0aGUgcl9pbmZvIGZpZWxkLiAgKi8KKworI2RlZmluZSBFTEYzMl9SX1NZTSh2YWwpCQkoKHZhbCkgPj4gOCkKKyNkZWZpbmUgRUxGMzJfUl9UWVBFKHZhbCkJCSgodmFsKSAmIDB4ZmYpCisjZGVmaW5lIEVMRjMyX1JfSU5GTyhzeW0sIHR5cGUpCQkoKChzeW0pIDw8IDgpICsgKCh0eXBlKSAmIDB4ZmYpKQorCisjZGVmaW5lIEVMRjY0X1JfU1lNKGkpCQkJKChpKSA+PiAzMikKKyNkZWZpbmUgRUxGNjRfUl9UWVBFKGkpCQkJKChpKSAmIDB4ZmZmZmZmZmYpCisjZGVmaW5lIEVMRjY0X1JfSU5GTyhzeW0sdHlwZSkJCSgoKChFbGY2NF9Yd29yZCkgKHN5bSkpIDw8IDMyKSArICh0eXBlKSkKKworLyogUHJvZ3JhbSBzZWdtZW50IGhlYWRlci4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX1dvcmQJcF90eXBlOwkJCS8qIFNlZ21lbnQgdHlwZSAqLworICBFbGYzMl9PZmYJcF9vZmZzZXQ7CQkvKiBTZWdtZW50IGZpbGUgb2Zmc2V0ICovCisgIEVsZjMyX0FkZHIJcF92YWRkcjsJCS8qIFNlZ21lbnQgdmlydHVhbCBhZGRyZXNzICovCisgIEVsZjMyX0FkZHIJcF9wYWRkcjsJCS8qIFNlZ21lbnQgcGh5c2ljYWwgYWRkcmVzcyAqLworICBFbGYzMl9Xb3JkCXBfZmlsZXN6OwkJLyogU2VnbWVudCBzaXplIGluIGZpbGUgKi8KKyAgRWxmMzJfV29yZAlwX21lbXN6OwkJLyogU2VnbWVudCBzaXplIGluIG1lbW9yeSAqLworICBFbGYzMl9Xb3JkCXBfZmxhZ3M7CQkvKiBTZWdtZW50IGZsYWdzICovCisgIEVsZjMyX1dvcmQJcF9hbGlnbjsJCS8qIFNlZ21lbnQgYWxpZ25tZW50ICovCit9IEVsZjMyX1BoZHI7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjY0X1dvcmQJcF90eXBlOwkJCS8qIFNlZ21lbnQgdHlwZSAqLworICBFbGY2NF9Xb3JkCXBfZmxhZ3M7CQkvKiBTZWdtZW50IGZsYWdzICovCisgIEVsZjY0X09mZglwX29mZnNldDsJCS8qIFNlZ21lbnQgZmlsZSBvZmZzZXQgKi8KKyAgRWxmNjRfQWRkcglwX3ZhZGRyOwkJLyogU2VnbWVudCB2aXJ0dWFsIGFkZHJlc3MgKi8KKyAgRWxmNjRfQWRkcglwX3BhZGRyOwkJLyogU2VnbWVudCBwaHlzaWNhbCBhZGRyZXNzICovCisgIEVsZjY0X1h3b3JkCXBfZmlsZXN6OwkJLyogU2VnbWVudCBzaXplIGluIGZpbGUgKi8KKyAgRWxmNjRfWHdvcmQJcF9tZW1zejsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBtZW1vcnkgKi8KKyAgRWxmNjRfWHdvcmQJcF9hbGlnbjsJCS8qIFNlZ21lbnQgYWxpZ25tZW50ICovCit9IEVsZjY0X1BoZHI7CisKKy8qIFNwZWNpYWwgdmFsdWUgZm9yIGVfcGhudW0uICBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSByZWFsIG51bWJlciBvZgorICAgcHJvZ3JhbSBoZWFkZXJzIGlzIHRvbyBsYXJnZSB0byBmaXQgaW50byBlX3BobnVtLiAgSW5zdGVhZCB0aGUgcmVhbAorICAgdmFsdWUgaXMgaW4gdGhlIGZpZWxkIHNoX2luZm8gb2Ygc2VjdGlvbiAwLiAgKi8KKworI2RlZmluZSBQTl9YTlVNCQkweGZmZmYKKworLyogTGVnYWwgdmFsdWVzIGZvciBwX3R5cGUgKHNlZ21lbnQgdHlwZSkuICAqLworCisjZGVmaW5lCVBUX05VTEwJCTAJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IHVudXNlZCAqLworI2RlZmluZSBQVF9MT0FECQkxCQkvKiBMb2FkYWJsZSBwcm9ncmFtIHNlZ21lbnQgKi8KKyNkZWZpbmUgUFRfRFlOQU1JQwkyCQkvKiBEeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgUFRfSU5URVJQCTMJCS8qIFByb2dyYW0gaW50ZXJwcmV0ZXIgKi8KKyNkZWZpbmUgUFRfTk9URQkJNAkJLyogQXV4aWxpYXJ5IGluZm9ybWF0aW9uICovCisjZGVmaW5lIFBUX1NITElCCTUJCS8qIFJlc2VydmVkICovCisjZGVmaW5lIFBUX1BIRFIJCTYJCS8qIEVudHJ5IGZvciBoZWFkZXIgdGFibGUgaXRzZWxmICovCisjZGVmaW5lIFBUX1RMUwkJNwkJLyogVGhyZWFkLWxvY2FsIHN0b3JhZ2Ugc2VnbWVudCAqLworI2RlZmluZQlQVF9OVU0JCTgJCS8qIE51bWJlciBvZiBkZWZpbmVkIHR5cGVzICovCisjZGVmaW5lIFBUX0xPT1MJCTB4NjAwMDAwMDAJLyogU3RhcnQgb2YgT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgUFRfR05VX0VIX0ZSQU1FCTB4NjQ3NGU1NTAJLyogR0NDIC5laF9mcmFtZV9oZHIgc2VnbWVudCAqLworI2RlZmluZSBQVF9HTlVfU1RBQ0sJMHg2NDc0ZTU1MQkvKiBJbmRpY2F0ZXMgc3RhY2sgZXhlY3V0YWJpbGl0eSAqLworI2RlZmluZSBQVF9HTlVfUkVMUk8JMHg2NDc0ZTU1MgkvKiBSZWFkLW9ubHkgYWZ0ZXIgcmVsb2NhdGlvbiAqLworI2RlZmluZSBQVF9MT1NVTlcJMHg2ZmZmZmZmYQorI2RlZmluZSBQVF9TVU5XQlNTCTB4NmZmZmZmZmEJLyogU3VuIFNwZWNpZmljIHNlZ21lbnQgKi8KKyNkZWZpbmUgUFRfU1VOV1NUQUNLCTB4NmZmZmZmZmIJLyogU3RhY2sgc2VnbWVudCAqLworI2RlZmluZSBQVF9ISVNVTlcJMHg2ZmZmZmZmZgorI2RlZmluZSBQVF9ISU9TCQkweDZmZmZmZmZmCS8qIEVuZCBvZiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBQVF9MT1BST0MJMHg3MDAwMDAwMAkvKiBTdGFydCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKyNkZWZpbmUgUFRfSElQUk9DCTB4N2ZmZmZmZmYJLyogRW5kIG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHBfZmxhZ3MgKHNlZ21lbnQgZmxhZ3MpLiAgKi8KKworI2RlZmluZSBQRl9YCQkoMSA8PCAwKQkvKiBTZWdtZW50IGlzIGV4ZWN1dGFibGUgKi8KKyNkZWZpbmUgUEZfVwkJKDEgPDwgMSkJLyogU2VnbWVudCBpcyB3cml0YWJsZSAqLworI2RlZmluZSBQRl9SCQkoMSA8PCAyKQkvKiBTZWdtZW50IGlzIHJlYWRhYmxlICovCisjZGVmaW5lIFBGX01BU0tPUwkweDBmZjAwMDAwCS8qIE9TLXNwZWNpZmljICovCisjZGVmaW5lIFBGX01BU0tQUk9DCTB4ZjAwMDAwMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3Igbm90ZSBzZWdtZW50IGRlc2NyaXB0b3IgdHlwZXMgZm9yIGNvcmUgZmlsZXMuICovCisKKyNkZWZpbmUgTlRfUFJTVEFUVVMJMQkJLyogQ29udGFpbnMgY29weSBvZiBwcnN0YXR1cyBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfRlBSRUdTRVQJMgkJLyogQ29udGFpbnMgY29weSBvZiBmcHJlZ3NldCBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfUFJQU0lORk8JMwkJLyogQ29udGFpbnMgY29weSBvZiBwcnBzaW5mbyBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfUFJYUkVHCTQJCS8qIENvbnRhaW5zIGNvcHkgb2YgcHJ4cmVnc2V0IHN0cnVjdCAqLworI2RlZmluZSBOVF9UQVNLU1RSVUNUCTQJCS8qIENvbnRhaW5zIGNvcHkgb2YgdGFzayBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgTlRfUExBVEZPUk0JNQkJLyogU3RyaW5nIGZyb20gc3lzaW5mbyhTSV9QTEFURk9STSkgKi8KKyNkZWZpbmUgTlRfQVVYVgkJNgkJLyogQ29udGFpbnMgY29weSBvZiBhdXh2IGFycmF5ICovCisjZGVmaW5lIE5UX0dXSU5ET1dTCTcJCS8qIENvbnRhaW5zIGNvcHkgb2YgZ3dpbmRvd3Mgc3RydWN0ICovCisjZGVmaW5lIE5UX0FTUlMJCTgJCS8qIENvbnRhaW5zIGNvcHkgb2YgYXNyc2V0IHN0cnVjdCAqLworI2RlZmluZSBOVF9QU1RBVFVTCTEwCQkvKiBDb250YWlucyBjb3B5IG9mIHBzdGF0dXMgc3RydWN0ICovCisjZGVmaW5lIE5UX1BTSU5GTwkxMwkJLyogQ29udGFpbnMgY29weSBvZiBwc2luZm8gc3RydWN0ICovCisjZGVmaW5lIE5UX1BSQ1JFRAkxNAkJLyogQ29udGFpbnMgY29weSBvZiBwcmNyZWQgc3RydWN0ICovCisjZGVmaW5lIE5UX1VUU05BTUUJMTUJCS8qIENvbnRhaW5zIGNvcHkgb2YgdXRzbmFtZSBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfTFdQU1RBVFVTCTE2CQkvKiBDb250YWlucyBjb3B5IG9mIGx3cHN0YXR1cyBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfTFdQU0lORk8JMTcJCS8qIENvbnRhaW5zIGNvcHkgb2YgbHdwaW5mbyBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfUFJGUFhSRUcJMjAJCS8qIENvbnRhaW5zIGNvcHkgb2YgZnByeHJlZ3NldCBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfUFJYRlBSRUcJMHg0NmU2MmI3ZgkvKiBDb250YWlucyBjb3B5IG9mIHVzZXJfZnhzcl9zdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfUFBDX1ZNWAkweDEwMAkJLyogUG93ZXJQQyBBbHRpdmVjL1ZNWCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlRfUFBDX1NQRQkweDEwMQkJLyogUG93ZXJQQyBTUEUvRVZSIHJlZ2lzdGVycyAqLworI2RlZmluZSBOVF9QUENfVlNYCTB4MTAyCQkvKiBQb3dlclBDIFZTWCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlRfMzg2X1RMUwkweDIwMAkJLyogaTM4NiBUTFMgc2xvdHMgKHN0cnVjdCB1c2VyX2Rlc2MpICovCisjZGVmaW5lIE5UXzM4Nl9JT1BFUk0JMHgyMDEJCS8qIHg4NiBpbyBwZXJtaXNzaW9uIGJpdG1hcCAoMT1kZW55KSAqLworI2RlZmluZSBOVF9YODZfWFNUQVRFCTB4MjAyCQkvKiB4ODYgZXh0ZW5kZWQgc3RhdGUgdXNpbmcgeHNhdmUgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciB0aGUgbm90ZSBzZWdtZW50IGRlc2NyaXB0b3IgdHlwZXMgZm9yIG9iamVjdCBmaWxlcy4gICovCisKKyNkZWZpbmUgTlRfVkVSU0lPTgkxCQkvKiBDb250YWlucyBhIHZlcnNpb24gc3RyaW5nLiAgKi8KKworCisvKiBEeW5hbWljIHNlY3Rpb24gZW50cnkuICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9Td29yZAlkX3RhZzsJCQkvKiBEeW5hbWljIGVudHJ5IHR5cGUgKi8KKyAgdW5pb24KKyAgICB7CisgICAgICBFbGYzMl9Xb3JkIGRfdmFsOwkJCS8qIEludGVnZXIgdmFsdWUgKi8KKyAgICAgIEVsZjMyX0FkZHIgZF9wdHI7CQkJLyogQWRkcmVzcyB2YWx1ZSAqLworICAgIH0gZF91bjsKK30gRWxmMzJfRHluOworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGY2NF9TeHdvcmQJZF90YWc7CQkJLyogRHluYW1pYyBlbnRyeSB0eXBlICovCisgIHVuaW9uCisgICAgeworICAgICAgRWxmNjRfWHdvcmQgZF92YWw7CQkvKiBJbnRlZ2VyIHZhbHVlICovCisgICAgICBFbGY2NF9BZGRyIGRfcHRyOwkJCS8qIEFkZHJlc3MgdmFsdWUgKi8KKyAgICB9IGRfdW47Cit9IEVsZjY0X0R5bjsKKworLyogTGVnYWwgdmFsdWVzIGZvciBkX3RhZyAoZHluYW1pYyBlbnRyeSB0eXBlKS4gICovCisKKyNkZWZpbmUgRFRfTlVMTAkJMAkJLyogTWFya3MgZW5kIG9mIGR5bmFtaWMgc2VjdGlvbiAqLworI2RlZmluZSBEVF9ORUVERUQJMQkJLyogTmFtZSBvZiBuZWVkZWQgbGlicmFyeSAqLworI2RlZmluZSBEVF9QTFRSRUxTWgkyCQkvKiBTaXplIGluIGJ5dGVzIG9mIFBMVCByZWxvY3MgKi8KKyNkZWZpbmUgRFRfUExUR09UCTMJCS8qIFByb2Nlc3NvciBkZWZpbmVkIHZhbHVlICovCisjZGVmaW5lIERUX0hBU0gJCTQJCS8qIEFkZHJlc3Mgb2Ygc3ltYm9sIGhhc2ggdGFibGUgKi8KKyNkZWZpbmUgRFRfU1RSVEFCCTUJCS8qIEFkZHJlc3Mgb2Ygc3RyaW5nIHRhYmxlICovCisjZGVmaW5lIERUX1NZTVRBQgk2CQkvKiBBZGRyZXNzIG9mIHN5bWJvbCB0YWJsZSAqLworI2RlZmluZSBEVF9SRUxBCQk3CQkvKiBBZGRyZXNzIG9mIFJlbGEgcmVsb2NzICovCisjZGVmaW5lIERUX1JFTEFTWgk4CQkvKiBUb3RhbCBzaXplIG9mIFJlbGEgcmVsb2NzICovCisjZGVmaW5lIERUX1JFTEFFTlQJOQkJLyogU2l6ZSBvZiBvbmUgUmVsYSByZWxvYyAqLworI2RlZmluZSBEVF9TVFJTWgkxMAkJLyogU2l6ZSBvZiBzdHJpbmcgdGFibGUgKi8KKyNkZWZpbmUgRFRfU1lNRU5UCTExCQkvKiBTaXplIG9mIG9uZSBzeW1ib2wgdGFibGUgZW50cnkgKi8KKyNkZWZpbmUgRFRfSU5JVAkJMTIJCS8qIEFkZHJlc3Mgb2YgaW5pdCBmdW5jdGlvbiAqLworI2RlZmluZSBEVF9GSU5JCQkxMwkJLyogQWRkcmVzcyBvZiB0ZXJtaW5hdGlvbiBmdW5jdGlvbiAqLworI2RlZmluZSBEVF9TT05BTUUJMTQJCS8qIE5hbWUgb2Ygc2hhcmVkIG9iamVjdCAqLworI2RlZmluZSBEVF9SUEFUSAkxNQkJLyogTGlicmFyeSBzZWFyY2ggcGF0aCAoZGVwcmVjYXRlZCkgKi8KKyNkZWZpbmUgRFRfU1lNQk9MSUMJMTYJCS8qIFN0YXJ0IHN5bWJvbCBzZWFyY2ggaGVyZSAqLworI2RlZmluZSBEVF9SRUwJCTE3CQkvKiBBZGRyZXNzIG9mIFJlbCByZWxvY3MgKi8KKyNkZWZpbmUgRFRfUkVMU1oJMTgJCS8qIFRvdGFsIHNpemUgb2YgUmVsIHJlbG9jcyAqLworI2RlZmluZSBEVF9SRUxFTlQJMTkJCS8qIFNpemUgb2Ygb25lIFJlbCByZWxvYyAqLworI2RlZmluZSBEVF9QTFRSRUwJMjAJCS8qIFR5cGUgb2YgcmVsb2MgaW4gUExUICovCisjZGVmaW5lIERUX0RFQlVHCTIxCQkvKiBGb3IgZGVidWdnaW5nOyB1bnNwZWNpZmllZCAqLworI2RlZmluZSBEVF9URVhUUkVMCTIyCQkvKiBSZWxvYyBtaWdodCBtb2RpZnkgLnRleHQgKi8KKyNkZWZpbmUgRFRfSk1QUkVMCTIzCQkvKiBBZGRyZXNzIG9mIFBMVCByZWxvY3MgKi8KKyNkZWZpbmUJRFRfQklORF9OT1cJMjQJCS8qIFByb2Nlc3MgcmVsb2NhdGlvbnMgb2Ygb2JqZWN0ICovCisjZGVmaW5lCURUX0lOSVRfQVJSQVkJMjUJCS8qIEFycmF5IHdpdGggYWRkcmVzc2VzIG9mIGluaXQgZmN0ICovCisjZGVmaW5lCURUX0ZJTklfQVJSQVkJMjYJCS8qIEFycmF5IHdpdGggYWRkcmVzc2VzIG9mIGZpbmkgZmN0ICovCisjZGVmaW5lCURUX0lOSVRfQVJSQVlTWgkyNwkJLyogU2l6ZSBpbiBieXRlcyBvZiBEVF9JTklUX0FSUkFZICovCisjZGVmaW5lCURUX0ZJTklfQVJSQVlTWgkyOAkJLyogU2l6ZSBpbiBieXRlcyBvZiBEVF9GSU5JX0FSUkFZICovCisjZGVmaW5lIERUX1JVTlBBVEgJMjkJCS8qIExpYnJhcnkgc2VhcmNoIHBhdGggKi8KKyNkZWZpbmUgRFRfRkxBR1MJMzAJCS8qIEZsYWdzIGZvciB0aGUgb2JqZWN0IGJlaW5nIGxvYWRlZCAqLworI2RlZmluZSBEVF9FTkNPRElORwkzMgkJLyogU3RhcnQgb2YgZW5jb2RlZCByYW5nZSAqLworI2RlZmluZSBEVF9QUkVJTklUX0FSUkFZIDMyCQkvKiBBcnJheSB3aXRoIGFkZHJlc3NlcyBvZiBwcmVpbml0IGZjdCovCisjZGVmaW5lIERUX1BSRUlOSVRfQVJSQVlTWiAzMwkJLyogc2l6ZSBpbiBieXRlcyBvZiBEVF9QUkVJTklUX0FSUkFZICovCisjZGVmaW5lCURUX05VTQkJMzQJCS8qIE51bWJlciB1c2VkICovCisjZGVmaW5lIERUX0xPT1MJCTB4NjAwMDAwMGQJLyogU3RhcnQgb2YgT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgRFRfSElPUwkJMHg2ZmZmZjAwMAkvKiBFbmQgb2YgT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgRFRfTE9QUk9DCTB4NzAwMDAwMDAJLyogU3RhcnQgb2YgcHJvY2Vzc29yLXNwZWNpZmljICovCisjZGVmaW5lIERUX0hJUFJPQwkweDdmZmZmZmZmCS8qIEVuZCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKyNkZWZpbmUJRFRfUFJPQ05VTQlEVF9NSVBTX05VTQkvKiBNb3N0IHVzZWQgYnkgYW55IHByb2Nlc3NvciAqLworCisvKiBEVF8qIGVudHJpZXMgd2hpY2ggZmFsbCBiZXR3ZWVuIERUX1ZBTFJOR0hJICYgRFRfVkFMUk5HTE8gdXNlIHRoZQorICAgRHluLmRfdW4uZF92YWwgZmllbGQgb2YgdGhlIEVsZipfRHluIHN0cnVjdHVyZS4gIFRoaXMgZm9sbG93cyBTdW4ncworICAgYXBwcm9hY2guICAqLworI2RlZmluZSBEVF9WQUxSTkdMTwkweDZmZmZmZDAwCisjZGVmaW5lIERUX0dOVV9QUkVMSU5LRUQgMHg2ZmZmZmRmNQkvKiBQcmVsaW5raW5nIHRpbWVzdGFtcCAqLworI2RlZmluZSBEVF9HTlVfQ09ORkxJQ1RTWiAweDZmZmZmZGY2CS8qIFNpemUgb2YgY29uZmxpY3Qgc2VjdGlvbiAqLworI2RlZmluZSBEVF9HTlVfTElCTElTVFNaIDB4NmZmZmZkZjcJLyogU2l6ZSBvZiBsaWJyYXJ5IGxpc3QgKi8KKyNkZWZpbmUgRFRfQ0hFQ0tTVU0JMHg2ZmZmZmRmOAorI2RlZmluZSBEVF9QTFRQQURTWgkweDZmZmZmZGY5CisjZGVmaW5lIERUX01PVkVFTlQJMHg2ZmZmZmRmYQorI2RlZmluZSBEVF9NT1ZFU1oJMHg2ZmZmZmRmYgorI2RlZmluZSBEVF9GRUFUVVJFXzEJMHg2ZmZmZmRmYwkvKiBGZWF0dXJlIHNlbGVjdGlvbiAoRFRGXyopLiAgKi8KKyNkZWZpbmUgRFRfUE9TRkxBR18xCTB4NmZmZmZkZmQJLyogRmxhZ3MgZm9yIERUXyogZW50cmllcywgZWZmZWN0aW5nCisJCQkJCSAgIHRoZSBmb2xsb3dpbmcgRFRfKiBlbnRyeS4gICovCisjZGVmaW5lIERUX1NZTUlOU1oJMHg2ZmZmZmRmZQkvKiBTaXplIG9mIHN5bWluZm8gdGFibGUgKGluIGJ5dGVzKSAqLworI2RlZmluZSBEVF9TWU1JTkVOVAkweDZmZmZmZGZmCS8qIEVudHJ5IHNpemUgb2Ygc3ltaW5mbyAqLworI2RlZmluZSBEVF9WQUxSTkdISQkweDZmZmZmZGZmCisjZGVmaW5lIERUX1ZBTFRBR0lEWCh0YWcpCShEVF9WQUxSTkdISSAtICh0YWcpKQkvKiBSZXZlcnNlIG9yZGVyISAqLworI2RlZmluZSBEVF9WQUxOVU0gMTIKKworLyogRFRfKiBlbnRyaWVzIHdoaWNoIGZhbGwgYmV0d2VlbiBEVF9BRERSUk5HSEkgJiBEVF9BRERSUk5HTE8gdXNlIHRoZQorICAgRHluLmRfdW4uZF9wdHIgZmllbGQgb2YgdGhlIEVsZipfRHluIHN0cnVjdHVyZS4KKworICAgSWYgYW55IGFkanVzdG1lbnQgaXMgbWFkZSB0byB0aGUgRUxGIG9iamVjdCBhZnRlciBpdCBoYXMgYmVlbgorICAgYnVpbHQgdGhlc2UgZW50cmllcyB3aWxsIG5lZWQgdG8gYmUgYWRqdXN0ZWQuICAqLworI2RlZmluZSBEVF9BRERSUk5HTE8JMHg2ZmZmZmUwMAorI2RlZmluZSBEVF9HTlVfSEFTSAkweDZmZmZmZWY1CS8qIEdOVS1zdHlsZSBoYXNoIHRhYmxlLiAgKi8KKyNkZWZpbmUgRFRfVExTREVTQ19QTFQJMHg2ZmZmZmVmNgorI2RlZmluZSBEVF9UTFNERVNDX0dPVAkweDZmZmZmZWY3CisjZGVmaW5lIERUX0dOVV9DT05GTElDVAkweDZmZmZmZWY4CS8qIFN0YXJ0IG9mIGNvbmZsaWN0IHNlY3Rpb24gKi8KKyNkZWZpbmUgRFRfR05VX0xJQkxJU1QJMHg2ZmZmZmVmOQkvKiBMaWJyYXJ5IGxpc3QgKi8KKyNkZWZpbmUgRFRfQ09ORklHCTB4NmZmZmZlZmEJLyogQ29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gICovCisjZGVmaW5lIERUX0RFUEFVRElUCTB4NmZmZmZlZmIJLyogRGVwZW5kZW5jeSBhdWRpdGluZy4gICovCisjZGVmaW5lIERUX0FVRElUCTB4NmZmZmZlZmMJLyogT2JqZWN0IGF1ZGl0aW5nLiAgKi8KKyNkZWZpbmUJRFRfUExUUEFECTB4NmZmZmZlZmQJLyogUExUIHBhZGRpbmcuICAqLworI2RlZmluZQlEVF9NT1ZFVEFCCTB4NmZmZmZlZmUJLyogTW92ZSB0YWJsZS4gICovCisjZGVmaW5lIERUX1NZTUlORk8JMHg2ZmZmZmVmZgkvKiBTeW1pbmZvIHRhYmxlLiAgKi8KKyNkZWZpbmUgRFRfQUREUlJOR0hJCTB4NmZmZmZlZmYKKyNkZWZpbmUgRFRfQUREUlRBR0lEWCh0YWcpCShEVF9BRERSUk5HSEkgLSAodGFnKSkJLyogUmV2ZXJzZSBvcmRlciEgKi8KKyNkZWZpbmUgRFRfQUREUk5VTSAxMQorCisvKiBUaGUgdmVyc2lvbmluZyBlbnRyeSB0eXBlcy4gIFRoZSBuZXh0IGFyZSBkZWZpbmVkIGFzIHBhcnQgb2YgdGhlCisgICBHTlUgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgRFRfVkVSU1lNCTB4NmZmZmZmZjAKKworI2RlZmluZSBEVF9SRUxBQ09VTlQJMHg2ZmZmZmZmOQorI2RlZmluZSBEVF9SRUxDT1VOVAkweDZmZmZmZmZhCisKKy8qIFRoZXNlIHdlcmUgY2hvc2VuIGJ5IFN1bi4gICovCisjZGVmaW5lIERUX0ZMQUdTXzEJMHg2ZmZmZmZmYgkvKiBTdGF0ZSBmbGFncywgc2VlIERGXzFfKiBiZWxvdy4gICovCisjZGVmaW5lCURUX1ZFUkRFRgkweDZmZmZmZmZjCS8qIEFkZHJlc3Mgb2YgdmVyc2lvbiBkZWZpbml0aW9uCisJCQkJCSAgIHRhYmxlICovCisjZGVmaW5lCURUX1ZFUkRFRk5VTQkweDZmZmZmZmZkCS8qIE51bWJlciBvZiB2ZXJzaW9uIGRlZmluaXRpb25zICovCisjZGVmaW5lCURUX1ZFUk5FRUQJMHg2ZmZmZmZmZQkvKiBBZGRyZXNzIG9mIHRhYmxlIHdpdGggbmVlZGVkCisJCQkJCSAgIHZlcnNpb25zICovCisjZGVmaW5lCURUX1ZFUk5FRUROVU0JMHg2ZmZmZmZmZgkvKiBOdW1iZXIgb2YgbmVlZGVkIHZlcnNpb25zICovCisjZGVmaW5lIERUX1ZFUlNJT05UQUdJRFgodGFnKQkoRFRfVkVSTkVFRE5VTSAtICh0YWcpKQkvKiBSZXZlcnNlIG9yZGVyISAqLworI2RlZmluZSBEVF9WRVJTSU9OVEFHTlVNIDE2CisKKy8qIFN1biBhZGRlZCB0aGVzZSBtYWNoaW5lLWluZGVwZW5kZW50IGV4dGVuc2lvbnMgaW4gdGhlICJwcm9jZXNzb3Itc3BlY2lmaWMiCisgICByYW5nZS4gIEJlIGNvbXBhdGlibGUuICAqLworI2RlZmluZSBEVF9BVVhJTElBUlkgICAgMHg3ZmZmZmZmZCAgICAgIC8qIFNoYXJlZCBvYmplY3QgdG8gbG9hZCBiZWZvcmUgc2VsZiAqLworI2RlZmluZSBEVF9GSUxURVIgICAgICAgMHg3ZmZmZmZmZiAgICAgIC8qIFNoYXJlZCBvYmplY3QgdG8gZ2V0IHZhbHVlcyBmcm9tICovCisjZGVmaW5lIERUX0VYVFJBVEFHSURYKHRhZykJKChFbGYzMl9Xb3JkKS0oKEVsZjMyX1N3b3JkKSAodGFnKSA8PDE+PjEpLTEpCisjZGVmaW5lIERUX0VYVFJBTlVNCTMKKworLyogVmFsdWVzIG9mIGBkX3VuLmRfdmFsJyBpbiB0aGUgRFRfRkxBR1MgZW50cnkuICAqLworI2RlZmluZSBERl9PUklHSU4JMHgwMDAwMDAwMQkvKiBPYmplY3QgbWF5IHVzZSBERl9PUklHSU4gKi8KKyNkZWZpbmUgREZfU1lNQk9MSUMJMHgwMDAwMDAwMgkvKiBTeW1ib2wgcmVzb2x1dGlvbnMgc3RhcnRzIGhlcmUgKi8KKyNkZWZpbmUgREZfVEVYVFJFTAkweDAwMDAwMDA0CS8qIE9iamVjdCBjb250YWlucyB0ZXh0IHJlbG9jYXRpb25zICovCisjZGVmaW5lIERGX0JJTkRfTk9XCTB4MDAwMDAwMDgJLyogTm8gbGF6eSBiaW5kaW5nIGZvciB0aGlzIG9iamVjdCAqLworI2RlZmluZSBERl9TVEFUSUNfVExTCTB4MDAwMDAwMTAJLyogTW9kdWxlIHVzZXMgdGhlIHN0YXRpYyBUTFMgbW9kZWwgKi8KKworLyogU3RhdGUgZmxhZ3Mgc2VsZWN0YWJsZSBpbiB0aGUgYGRfdW4uZF92YWwnIGVsZW1lbnQgb2YgdGhlIERUX0ZMQUdTXzEKKyAgIGVudHJ5IGluIHRoZSBkeW5hbWljIHNlY3Rpb24uICAqLworI2RlZmluZSBERl8xX05PVwkweDAwMDAwMDAxCS8qIFNldCBSVExEX05PVyBmb3IgdGhpcyBvYmplY3QuICAqLworI2RlZmluZSBERl8xX0dMT0JBTAkweDAwMDAwMDAyCS8qIFNldCBSVExEX0dMT0JBTCBmb3IgdGhpcyBvYmplY3QuICAqLworI2RlZmluZSBERl8xX0dST1VQCTB4MDAwMDAwMDQJLyogU2V0IFJUTERfR1JPVVAgZm9yIHRoaXMgb2JqZWN0LiAgKi8KKyNkZWZpbmUgREZfMV9OT0RFTEVURQkweDAwMDAwMDA4CS8qIFNldCBSVExEX05PREVMRVRFIGZvciB0aGlzIG9iamVjdC4qLworI2RlZmluZSBERl8xX0xPQURGTFRSCTB4MDAwMDAwMTAJLyogVHJpZ2dlciBmaWx0ZWUgbG9hZGluZyBhdCBydW50aW1lLiovCisjZGVmaW5lIERGXzFfSU5JVEZJUlNUCTB4MDAwMDAwMjAJLyogU2V0IFJUTERfSU5JVEZJUlNUIGZvciB0aGlzIG9iamVjdCovCisjZGVmaW5lIERGXzFfTk9PUEVOCTB4MDAwMDAwNDAJLyogU2V0IFJUTERfTk9PUEVOIGZvciB0aGlzIG9iamVjdC4gICovCisjZGVmaW5lIERGXzFfT1JJR0lOCTB4MDAwMDAwODAJLyogJE9SSUdJTiBtdXN0IGJlIGhhbmRsZWQuICAqLworI2RlZmluZSBERl8xX0RJUkVDVAkweDAwMDAwMTAwCS8qIERpcmVjdCBiaW5kaW5nIGVuYWJsZWQuICAqLworI2RlZmluZSBERl8xX1RSQU5TCTB4MDAwMDAyMDAKKyNkZWZpbmUgREZfMV9JTlRFUlBPU0UJMHgwMDAwMDQwMAkvKiBPYmplY3QgaXMgdXNlZCB0byBpbnRlcnBvc2UuICAqLworI2RlZmluZSBERl8xX05PREVGTElCCTB4MDAwMDA4MDAJLyogSWdub3JlIGRlZmF1bHQgbGliIHNlYXJjaCBwYXRoLiAgKi8KKyNkZWZpbmUgREZfMV9OT0RVTVAJMHgwMDAwMTAwMAkvKiBPYmplY3QgY2FuJ3QgYmUgZGxkdW1wJ2VkLiAgKi8KKyNkZWZpbmUgREZfMV9DT05GQUxUCTB4MDAwMDIwMDAJLyogQ29uZmlndXJhdGlvbiBhbHRlcm5hdGl2ZSBjcmVhdGVkLiovCisjZGVmaW5lIERGXzFfRU5ERklMVEVFCTB4MDAwMDQwMDAJLyogRmlsdGVlIHRlcm1pbmF0ZXMgZmlsdGVycyBzZWFyY2guICovCisjZGVmaW5lCURGXzFfRElTUFJFTERORQkweDAwMDA4MDAwCS8qIERpc3AgcmVsb2MgYXBwbGllZCBhdCBidWlsZCB0aW1lLiAqLworI2RlZmluZQlERl8xX0RJU1BSRUxQTkQJMHgwMDAxMDAwMAkvKiBEaXNwIHJlbG9jIGFwcGxpZWQgYXQgcnVuLXRpbWUuICAqLworCisvKiBGbGFncyBmb3IgdGhlIGZlYXR1cmUgc2VsZWN0aW9uIGluIERUX0ZFQVRVUkVfMS4gICovCisjZGVmaW5lIERURl8xX1BBUklOSVQJMHgwMDAwMDAwMQorI2RlZmluZSBEVEZfMV9DT05GRVhQCTB4MDAwMDAwMDIKKworLyogRmxhZ3MgaW4gdGhlIERUX1BPU0ZMQUdfMSBlbnRyeSBlZmZlY3Rpbmcgb25seSB0aGUgbmV4dCBEVF8qIGVudHJ5LiAgKi8KKyNkZWZpbmUgREZfUDFfTEFaWUxPQUQJMHgwMDAwMDAwMQkvKiBMYXp5bG9hZCBmb2xsb3dpbmcgb2JqZWN0LiAgKi8KKyNkZWZpbmUgREZfUDFfR1JPVVBQRVJNCTB4MDAwMDAwMDIJLyogU3ltYm9scyBmcm9tIG5leHQgb2JqZWN0IGFyZSBub3QKKwkJCQkJICAgZ2VuZXJhbGx5IGF2YWlsYWJsZS4gICovCisKKy8qIFZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9ucy4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX0hhbGYJdmRfdmVyc2lvbjsJCS8qIFZlcnNpb24gcmV2aXNpb24gKi8KKyAgRWxmMzJfSGFsZgl2ZF9mbGFnczsJCS8qIFZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgRWxmMzJfSGFsZgl2ZF9uZHg7CQkJLyogVmVyc2lvbiBJbmRleCAqLworICBFbGYzMl9IYWxmCXZkX2NudDsJCQkvKiBOdW1iZXIgb2YgYXNzb2NpYXRlZCBhdXggZW50cmllcyAqLworICBFbGYzMl9Xb3JkCXZkX2hhc2g7CQkvKiBWZXJzaW9uIG5hbWUgaGFzaCB2YWx1ZSAqLworICBFbGYzMl9Xb3JkCXZkX2F1eDsJCQkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gdmVyZGF1eCBhcnJheSAqLworICBFbGYzMl9Xb3JkCXZkX25leHQ7CQkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gbmV4dCB2ZXJkZWYKKwkJCQkJICAgZW50cnkgKi8KK30gRWxmMzJfVmVyZGVmOworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGY2NF9IYWxmCXZkX3ZlcnNpb247CQkvKiBWZXJzaW9uIHJldmlzaW9uICovCisgIEVsZjY0X0hhbGYJdmRfZmxhZ3M7CQkvKiBWZXJzaW9uIGluZm9ybWF0aW9uICovCisgIEVsZjY0X0hhbGYJdmRfbmR4OwkJCS8qIFZlcnNpb24gSW5kZXggKi8KKyAgRWxmNjRfSGFsZgl2ZF9jbnQ7CQkJLyogTnVtYmVyIG9mIGFzc29jaWF0ZWQgYXV4IGVudHJpZXMgKi8KKyAgRWxmNjRfV29yZAl2ZF9oYXNoOwkJLyogVmVyc2lvbiBuYW1lIGhhc2ggdmFsdWUgKi8KKyAgRWxmNjRfV29yZAl2ZF9hdXg7CQkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIHZlcmRhdXggYXJyYXkgKi8KKyAgRWxmNjRfV29yZAl2ZF9uZXh0OwkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIG5leHQgdmVyZGVmCisJCQkJCSAgIGVudHJ5ICovCit9IEVsZjY0X1ZlcmRlZjsKKworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHZkX3ZlcnNpb24gKHZlcnNpb24gcmV2aXNpb24pLiAgKi8KKyNkZWZpbmUgVkVSX0RFRl9OT05FCTAJCS8qIE5vIHZlcnNpb24gKi8KKyNkZWZpbmUgVkVSX0RFRl9DVVJSRU5UCTEJCS8qIEN1cnJlbnQgdmVyc2lvbiAqLworI2RlZmluZSBWRVJfREVGX05VTQkyCQkvKiBHaXZlbiB2ZXJzaW9uIG51bWJlciAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHZkX2ZsYWdzICh2ZXJzaW9uIGluZm9ybWF0aW9uIGZsYWdzKS4gICovCisjZGVmaW5lIFZFUl9GTEdfQkFTRQkweDEJCS8qIFZlcnNpb24gZGVmaW5pdGlvbiBvZiBmaWxlIGl0c2VsZiAqLworI2RlZmluZSBWRVJfRkxHX1dFQUsJMHgyCQkvKiBXZWFrIHZlcnNpb24gaWRlbnRpZmllciAqLworCisvKiBWZXJzeW0gc3ltYm9sIGluZGV4IHZhbHVlcy4gICovCisjZGVmaW5lCVZFUl9ORFhfTE9DQUwJCTAJLyogU3ltYm9sIGlzIGxvY2FsLiAgKi8KKyNkZWZpbmUJVkVSX05EWF9HTE9CQUwJCTEJLyogU3ltYm9sIGlzIGdsb2JhbC4gICovCisjZGVmaW5lCVZFUl9ORFhfTE9SRVNFUlZFCTB4ZmYwMAkvKiBCZWdpbm5pbmcgb2YgcmVzZXJ2ZWQgZW50cmllcy4gICovCisjZGVmaW5lCVZFUl9ORFhfRUxJTUlOQVRFCTB4ZmYwMQkvKiBTeW1ib2wgaXMgdG8gYmUgZWxpbWluYXRlZC4gICovCisKKy8qIEF1eGlhbGlhcnkgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX1dvcmQJdmRhX25hbWU7CQkvKiBWZXJzaW9uIG9yIGRlcGVuZGVuY3kgbmFtZXMgKi8KKyAgRWxmMzJfV29yZAl2ZGFfbmV4dDsJCS8qIE9mZnNldCBpbiBieXRlcyB0byBuZXh0IHZlcmRhdXgKKwkJCQkJICAgZW50cnkgKi8KK30gRWxmMzJfVmVyZGF1eDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmNjRfV29yZAl2ZGFfbmFtZTsJCS8qIFZlcnNpb24gb3IgZGVwZW5kZW5jeSBuYW1lcyAqLworICBFbGY2NF9Xb3JkCXZkYV9uZXh0OwkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIG5leHQgdmVyZGF1eAorCQkJCQkgICBlbnRyeSAqLworfSBFbGY2NF9WZXJkYXV4OworCisKKy8qIFZlcnNpb24gZGVwZW5kZW5jeSBzZWN0aW9uLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmMzJfSGFsZgl2bl92ZXJzaW9uOwkJLyogVmVyc2lvbiBvZiBzdHJ1Y3R1cmUgKi8KKyAgRWxmMzJfSGFsZgl2bl9jbnQ7CQkJLyogTnVtYmVyIG9mIGFzc29jaWF0ZWQgYXV4IGVudHJpZXMgKi8KKyAgRWxmMzJfV29yZAl2bl9maWxlOwkJLyogT2Zmc2V0IG9mIGZpbGVuYW1lIGZvciB0aGlzCisJCQkJCSAgIGRlcGVuZGVuY3kgKi8KKyAgRWxmMzJfV29yZAl2bl9hdXg7CQkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIHZlcm5hdXggYXJyYXkgKi8KKyAgRWxmMzJfV29yZAl2bl9uZXh0OwkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIG5leHQgdmVybmVlZAorCQkJCQkgICBlbnRyeSAqLworfSBFbGYzMl9WZXJuZWVkOworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGY2NF9IYWxmCXZuX3ZlcnNpb247CQkvKiBWZXJzaW9uIG9mIHN0cnVjdHVyZSAqLworICBFbGY2NF9IYWxmCXZuX2NudDsJCQkvKiBOdW1iZXIgb2YgYXNzb2NpYXRlZCBhdXggZW50cmllcyAqLworICBFbGY2NF9Xb3JkCXZuX2ZpbGU7CQkvKiBPZmZzZXQgb2YgZmlsZW5hbWUgZm9yIHRoaXMKKwkJCQkJICAgZGVwZW5kZW5jeSAqLworICBFbGY2NF9Xb3JkCXZuX2F1eDsJCQkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gdmVybmF1eCBhcnJheSAqLworICBFbGY2NF9Xb3JkCXZuX25leHQ7CQkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gbmV4dCB2ZXJuZWVkCisJCQkJCSAgIGVudHJ5ICovCit9IEVsZjY0X1Zlcm5lZWQ7CisKKworLyogTGVnYWwgdmFsdWVzIGZvciB2bl92ZXJzaW9uICh2ZXJzaW9uIHJldmlzaW9uKS4gICovCisjZGVmaW5lIFZFUl9ORUVEX05PTkUJIDAJCS8qIE5vIHZlcnNpb24gKi8KKyNkZWZpbmUgVkVSX05FRURfQ1VSUkVOVCAxCQkvKiBDdXJyZW50IHZlcnNpb24gKi8KKyNkZWZpbmUgVkVSX05FRURfTlVNCSAyCQkvKiBHaXZlbiB2ZXJzaW9uIG51bWJlciAqLworCisvKiBBdXhpbGlhcnkgbmVlZGVkIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9Xb3JkCXZuYV9oYXNoOwkJLyogSGFzaCB2YWx1ZSBvZiBkZXBlbmRlbmN5IG5hbWUgKi8KKyAgRWxmMzJfSGFsZgl2bmFfZmxhZ3M7CQkvKiBEZXBlbmRlbmN5IHNwZWNpZmljIGluZm9ybWF0aW9uICovCisgIEVsZjMyX0hhbGYJdm5hX290aGVyOwkJLyogVW51c2VkICovCisgIEVsZjMyX1dvcmQJdm5hX25hbWU7CQkvKiBEZXBlbmRlbmN5IG5hbWUgc3RyaW5nIG9mZnNldCAqLworICBFbGYzMl9Xb3JkCXZuYV9uZXh0OwkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIG5leHQgdmVybmF1eAorCQkJCQkgICBlbnRyeSAqLworfSBFbGYzMl9WZXJuYXV4OworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGY2NF9Xb3JkCXZuYV9oYXNoOwkJLyogSGFzaCB2YWx1ZSBvZiBkZXBlbmRlbmN5IG5hbWUgKi8KKyAgRWxmNjRfSGFsZgl2bmFfZmxhZ3M7CQkvKiBEZXBlbmRlbmN5IHNwZWNpZmljIGluZm9ybWF0aW9uICovCisgIEVsZjY0X0hhbGYJdm5hX290aGVyOwkJLyogVW51c2VkICovCisgIEVsZjY0X1dvcmQJdm5hX25hbWU7CQkvKiBEZXBlbmRlbmN5IG5hbWUgc3RyaW5nIG9mZnNldCAqLworICBFbGY2NF9Xb3JkCXZuYV9uZXh0OwkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIG5leHQgdmVybmF1eAorCQkJCQkgICBlbnRyeSAqLworfSBFbGY2NF9WZXJuYXV4OworCisKKy8qIExlZ2FsIHZhbHVlcyBmb3Igdm5hX2ZsYWdzLiAgKi8KKyNkZWZpbmUgVkVSX0ZMR19XRUFLCTB4MgkJLyogV2VhayB2ZXJzaW9uIGlkZW50aWZpZXIgKi8KKworCisvKiBBdXhpbGlhcnkgdmVjdG9yLiAgKi8KKworLyogVGhpcyB2ZWN0b3IgaXMgbm9ybWFsbHkgb25seSB1c2VkIGJ5IHRoZSBwcm9ncmFtIGludGVycHJldGVyLiAgVGhlCisgICB1c3VhbCBkZWZpbml0aW9uIGluIGFuIEFCSSBzdXBwbGVtZW50IHVzZXMgdGhlIG5hbWUgYXV4dl90LiAgVGhlCisgICB2ZWN0b3IgaXMgbm90IHVzdWFsbHkgZGVmaW5lZCBpbiBhIHN0YW5kYXJkIDxlbGYuaD4gZmlsZSwgYnV0IGl0CisgICBjYW4ndCBodXJ0LiAgV2UgcmVuYW1lIGl0IHRvIGF2b2lkIGNvbmZsaWN0cy4gIFRoZSBzaXplcyBvZiB0aGVzZQorICAgdHlwZXMgYXJlIGFuIGFycmFuZ2VtZW50IGJldHdlZW4gdGhlIGV4ZWMgc2VydmVyIGFuZCB0aGUgcHJvZ3JhbQorICAgaW50ZXJwcmV0ZXIsIHNvIHdlIGRvbid0IGZ1bGx5IHNwZWNpZnkgdGhlbSBoZXJlLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgYV90eXBlOwkJLyogRW50cnkgdHlwZSAqLworICB1bmlvbgorICAgIHsKKyAgICAgIHVpbnQzMl90IGFfdmFsOwkJLyogSW50ZWdlciB2YWx1ZSAqLworICAgICAgLyogV2UgdXNlIHRvIGhhdmUgcG9pbnRlciBlbGVtZW50cyBhZGRlZCBoZXJlLiAgV2UgY2Fubm90IGRvIHRoYXQsCisJIHRob3VnaCwgc2luY2UgaXQgZG9lcyBub3Qgd29yayB3aGVuIHVzaW5nIDMyLWJpdCBkZWZpbml0aW9ucworCSBvbiA2NC1iaXQgcGxhdGZvcm1zIGFuZCB2aWNlIHZlcnNhLiAgKi8KKyAgICB9IGFfdW47Cit9IEVsZjMyX2F1eHZfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDY0X3QgYV90eXBlOwkJLyogRW50cnkgdHlwZSAqLworICB1bmlvbgorICAgIHsKKyAgICAgIHVpbnQ2NF90IGFfdmFsOwkJLyogSW50ZWdlciB2YWx1ZSAqLworICAgICAgLyogV2UgdXNlIHRvIGhhdmUgcG9pbnRlciBlbGVtZW50cyBhZGRlZCBoZXJlLiAgV2UgY2Fubm90IGRvIHRoYXQsCisJIHRob3VnaCwgc2luY2UgaXQgZG9lcyBub3Qgd29yayB3aGVuIHVzaW5nIDMyLWJpdCBkZWZpbml0aW9ucworCSBvbiA2NC1iaXQgcGxhdGZvcm1zIGFuZCB2aWNlIHZlcnNhLiAgKi8KKyAgICB9IGFfdW47Cit9IEVsZjY0X2F1eHZfdDsKKworLyogTGVnYWwgdmFsdWVzIGZvciBhX3R5cGUgKGVudHJ5IHR5cGUpLiAgKi8KKworI2RlZmluZSBBVF9OVUxMCQkwCQkvKiBFbmQgb2YgdmVjdG9yICovCisjZGVmaW5lIEFUX0lHTk9SRQkxCQkvKiBFbnRyeSBzaG91bGQgYmUgaWdub3JlZCAqLworI2RlZmluZSBBVF9FWEVDRkQJMgkJLyogRmlsZSBkZXNjcmlwdG9yIG9mIHByb2dyYW0gKi8KKyNkZWZpbmUgQVRfUEhEUgkJMwkJLyogUHJvZ3JhbSBoZWFkZXJzIGZvciBwcm9ncmFtICovCisjZGVmaW5lIEFUX1BIRU5UCTQJCS8qIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cnkgKi8KKyNkZWZpbmUgQVRfUEhOVU0JNQkJLyogTnVtYmVyIG9mIHByb2dyYW0gaGVhZGVycyAqLworI2RlZmluZSBBVF9QQUdFU1oJNgkJLyogU3lzdGVtIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSBBVF9CQVNFCQk3CQkvKiBCYXNlIGFkZHJlc3Mgb2YgaW50ZXJwcmV0ZXIgKi8KKyNkZWZpbmUgQVRfRkxBR1MJOAkJLyogRmxhZ3MgKi8KKyNkZWZpbmUgQVRfRU5UUlkJOQkJLyogRW50cnkgcG9pbnQgb2YgcHJvZ3JhbSAqLworI2RlZmluZSBBVF9OT1RFTEYJMTAJCS8qIFByb2dyYW0gaXMgbm90IEVMRiAqLworI2RlZmluZSBBVF9VSUQJCTExCQkvKiBSZWFsIHVpZCAqLworI2RlZmluZSBBVF9FVUlECQkxMgkJLyogRWZmZWN0aXZlIHVpZCAqLworI2RlZmluZSBBVF9HSUQJCTEzCQkvKiBSZWFsIGdpZCAqLworI2RlZmluZSBBVF9FR0lECQkxNAkJLyogRWZmZWN0aXZlIGdpZCAqLworI2RlZmluZSBBVF9DTEtUQ0sJMTcJCS8qIEZyZXF1ZW5jeSBvZiB0aW1lcygpICovCisKKy8qIFNvbWUgbW9yZSBzcGVjaWFsIGFfdHlwZSB2YWx1ZXMgZGVzY3JpYmluZyB0aGUgaGFyZHdhcmUuICAqLworI2RlZmluZSBBVF9QTEFURk9STQkxNQkJLyogU3RyaW5nIGlkZW50aWZ5aW5nIHBsYXRmb3JtLiAgKi8KKyNkZWZpbmUgQVRfSFdDQVAJMTYJCS8qIE1hY2hpbmUgZGVwZW5kZW50IGhpbnRzIGFib3V0CisJCQkJCSAgIHByb2Nlc3NvciBjYXBhYmlsaXRpZXMuICAqLworCisvKiBUaGlzIGVudHJ5IGdpdmVzIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEZQVSBpbml0aWFsaXphdGlvbgorICAgcGVyZm9ybWVkIGJ5IHRoZSBrZXJuZWwuICAqLworI2RlZmluZSBBVF9GUFVDVwkxOAkJLyogVXNlZCBGUFUgY29udHJvbCB3b3JkLiAgKi8KKworLyogQ2FjaGUgYmxvY2sgc2l6ZXMuICAqLworI2RlZmluZSBBVF9EQ0FDSEVCU0laRQkxOQkJLyogRGF0YSBjYWNoZSBibG9jayBzaXplLiAgKi8KKyNkZWZpbmUgQVRfSUNBQ0hFQlNJWkUJMjAJCS8qIEluc3RydWN0aW9uIGNhY2hlIGJsb2NrIHNpemUuICAqLworI2RlZmluZSBBVF9VQ0FDSEVCU0laRQkyMQkJLyogVW5pZmllZCBjYWNoZSBibG9jayBzaXplLiAgKi8KKworLyogQSBzcGVjaWFsIGlnbm9yZWQgdmFsdWUgZm9yIFBQQywgdXNlZCBieSB0aGUga2VybmVsIHRvIGNvbnRyb2wgdGhlCisgICBpbnRlcnByZXRhdGlvbiBvZiB0aGUgQVVYVi4gTXVzdCBiZSA+IDE2LiAgKi8KKyNkZWZpbmUgQVRfSUdOT1JFUFBDCTIyCQkvKiBFbnRyeSBzaG91bGQgYmUgaWdub3JlZC4gICovCisKKyNkZWZpbmUJQVRfU0VDVVJFCTIzCQkvKiBCb29sZWFuLCB3YXMgZXhlYyBzZXR1aWQtbGlrZT8gICovCisKKyNkZWZpbmUgQVRfQkFTRV9QTEFURk9STSAyNAkJLyogU3RyaW5nIGlkZW50aWZ5aW5nIHJlYWwgcGxhdGZvcm1zLiovCisKKyNkZWZpbmUgQVRfUkFORE9NCTI1CQkvKiBBZGRyZXNzIG9mIDE2IHJhbmRvbSBieXRlcy4gICovCisKKyNkZWZpbmUgQVRfRVhFQ0ZOCTMxCQkvKiBGaWxlbmFtZSBvZiBleGVjdXRhYmxlLiAgKi8KKworLyogUG9pbnRlciB0byB0aGUgZ2xvYmFsIHN5c3RlbSBwYWdlIHVzZWQgZm9yIHN5c3RlbSBjYWxscyBhbmQgb3RoZXIKKyAgIG5pY2UgdGhpbmdzLiAgKi8KKyNkZWZpbmUgQVRfU1lTSU5GTwkzMgorI2RlZmluZSBBVF9TWVNJTkZPX0VIRFIJMzMKKworLyogU2hhcGVzIG9mIHRoZSBjYWNoZXMuICBCaXRzIDAtMyBjb250YWlucyBhc3NvY2lhdGl2aXR5OyBiaXRzIDQtNyBjb250YWlucworICAgbG9nMiBvZiBsaW5lIHNpemU7IG1hc2sgdGhvc2UgdG8gZ2V0IGNhY2hlIHNpemUuICAqLworI2RlZmluZSBBVF9MMUlfQ0FDSEVTSEFQRQkzNAorI2RlZmluZSBBVF9MMURfQ0FDSEVTSEFQRQkzNQorI2RlZmluZSBBVF9MMl9DQUNIRVNIQVBFCTM2CisjZGVmaW5lIEFUX0wzX0NBQ0hFU0hBUEUJMzcKKworLyogTm90ZSBzZWN0aW9uIGNvbnRlbnRzLiAgRWFjaCBlbnRyeSBpbiB0aGUgbm90ZSBzZWN0aW9uIGJlZ2lucyB3aXRoCisgICBhIGhlYWRlciBvZiBhIGZpeGVkIGZvcm0uICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9Xb3JkIG5fbmFtZXN6OwkJCS8qIExlbmd0aCBvZiB0aGUgbm90ZSdzIG5hbWUuICAqLworICBFbGYzMl9Xb3JkIG5fZGVzY3N6OwkJCS8qIExlbmd0aCBvZiB0aGUgbm90ZSdzIGRlc2NyaXB0b3IuICAqLworICBFbGYzMl9Xb3JkIG5fdHlwZTsJCQkvKiBUeXBlIG9mIHRoZSBub3RlLiAgKi8KK30gRWxmMzJfTmhkcjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmNjRfV29yZCBuX25hbWVzejsJCQkvKiBMZW5ndGggb2YgdGhlIG5vdGUncyBuYW1lLiAgKi8KKyAgRWxmNjRfV29yZCBuX2Rlc2NzejsJCQkvKiBMZW5ndGggb2YgdGhlIG5vdGUncyBkZXNjcmlwdG9yLiAgKi8KKyAgRWxmNjRfV29yZCBuX3R5cGU7CQkJLyogVHlwZSBvZiB0aGUgbm90ZS4gICovCit9IEVsZjY0X05oZHI7CisKKy8qIEtub3duIG5hbWVzIG9mIG5vdGVzLiAgKi8KKworLyogU29sYXJpcyBlbnRyaWVzIGluIHRoZSBub3RlIHNlY3Rpb24gaGF2ZSB0aGlzIG5hbWUuICAqLworI2RlZmluZSBFTEZfTk9URV9TT0xBUklTCSJTVU5XIFNvbGFyaXMiCisKKy8qIE5vdGUgZW50cmllcyBmb3IgR05VIHN5c3RlbXMgaGF2ZSB0aGlzIG5hbWUuICAqLworI2RlZmluZSBFTEZfTk9URV9HTlUJCSJHTlUiCisKKworLyogRGVmaW5lZCB0eXBlcyBvZiBub3RlcyBmb3IgU29sYXJpcy4gICovCisKKy8qIFZhbHVlIG9mIGRlc2NyaXB0b3IgKG9uZSB3b3JkKSBpcyBkZXNpcmVkIHBhZ2VzaXplIGZvciB0aGUgYmluYXJ5LiAgKi8KKyNkZWZpbmUgRUxGX05PVEVfUEFHRVNJWkVfSElOVAkxCisKKworLyogRGVmaW5lZCBub3RlIHR5cGVzIGZvciBHTlUgc3lzdGVtcy4gICovCisKKy8qIEFCSSBpbmZvcm1hdGlvbi4gIFRoZSBkZXNjcmlwdG9yIGNvbnNpc3RzIG9mIHdvcmRzOgorICAgd29yZCAwOiBPUyBkZXNjcmlwdG9yCisgICB3b3JkIDE6IG1ham9yIHZlcnNpb24gb2YgdGhlIEFCSQorICAgd29yZCAyOiBtaW5vciB2ZXJzaW9uIG9mIHRoZSBBQkkKKyAgIHdvcmQgMzogc3VibWlub3IgdmVyc2lvbiBvZiB0aGUgQUJJCisqLworI2RlZmluZSBOVF9HTlVfQUJJX1RBRwkxCisjZGVmaW5lIEVMRl9OT1RFX0FCSQlOVF9HTlVfQUJJX1RBRyAvKiBPbGQgbmFtZS4gICovCisKKy8qIEtub3duIE9TZXMuICBUaGVzZSB2YWx1ZXMgY2FuIGFwcGVhciBpbiB3b3JkIDAgb2YgYW4KKyAgIE5UX0dOVV9BQklfVEFHIG5vdGUgc2VjdGlvbiBlbnRyeS4gICovCisjZGVmaW5lIEVMRl9OT1RFX09TX0xJTlVYCTAKKyNkZWZpbmUgRUxGX05PVEVfT1NfR05VCQkxCisjZGVmaW5lIEVMRl9OT1RFX09TX1NPTEFSSVMyCTIKKyNkZWZpbmUgRUxGX05PVEVfT1NfRlJFRUJTRAkzCisKKy8qIFN5bnRoZXRpYyBod2NhcCBpbmZvcm1hdGlvbi4gIFRoZSBkZXNjcmlwdG9yIGJlZ2lucyB3aXRoIHR3byB3b3JkczoKKyAgIHdvcmQgMDogbnVtYmVyIG9mIGVudHJpZXMKKyAgIHdvcmQgMTogYml0bWFzayBvZiBlbmFibGVkIGVudHJpZXMKKyAgIFRoZW4gZm9sbG93IHZhcmlhYmxlLWxlbmd0aCBlbnRyaWVzLCBvbmUgYnl0ZSBmb2xsb3dlZCBieSBhCisgICAnXDAnLXRlcm1pbmF0ZWQgaHdjYXAgbmFtZSBzdHJpbmcuICBUaGUgYnl0ZSBnaXZlcyB0aGUgYml0CisgICBudW1iZXIgdG8gdGVzdCBpZiBlbmFibGVkLCAoMVUgPDwgYml0KSAmIGJpdG1hc2suICAqLworI2RlZmluZSBOVF9HTlVfSFdDQVAJMgorCisvKiBCdWlsZCBJRCBiaXRzIGFzIGdlbmVyYXRlZCBieSBsZCAtLWJ1aWxkLWlkLgorICAgVGhlIGRlc2NyaXB0b3IgY29uc2lzdHMgb2YgYW55IG5vbnplcm8gbnVtYmVyIG9mIGJ5dGVzLiAgKi8KKyNkZWZpbmUgTlRfR05VX0JVSUxEX0lECTMKKworLyogVmVyc2lvbiBub3RlIGdlbmVyYXRlZCBieSBHTlUgZ29sZCBjb250YWluaW5nIGEgdmVyc2lvbiBzdHJpbmcuICAqLworI2RlZmluZSBOVF9HTlVfR09MRF9WRVJTSU9OCTQKKworCisvKiBNb3ZlIHJlY29yZHMuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmMzJfWHdvcmQgbV92YWx1ZTsJCS8qIFN5bWJvbCB2YWx1ZS4gICovCisgIEVsZjMyX1dvcmQgbV9pbmZvOwkJLyogU2l6ZSBhbmQgaW5kZXguICAqLworICBFbGYzMl9Xb3JkIG1fcG9mZnNldDsJCS8qIFN5bWJvbCBvZmZzZXQuICAqLworICBFbGYzMl9IYWxmIG1fcmVwZWF0OwkJLyogUmVwZWF0IGNvdW50LiAgKi8KKyAgRWxmMzJfSGFsZiBtX3N0cmlkZTsJCS8qIFN0cmlkZSBpbmZvLiAgKi8KK30gRWxmMzJfTW92ZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmNjRfWHdvcmQgbV92YWx1ZTsJCS8qIFN5bWJvbCB2YWx1ZS4gICovCisgIEVsZjY0X1h3b3JkIG1faW5mbzsJCS8qIFNpemUgYW5kIGluZGV4LiAgKi8KKyAgRWxmNjRfWHdvcmQgbV9wb2Zmc2V0OwkvKiBTeW1ib2wgb2Zmc2V0LiAgKi8KKyAgRWxmNjRfSGFsZiBtX3JlcGVhdDsJCS8qIFJlcGVhdCBjb3VudC4gICovCisgIEVsZjY0X0hhbGYgbV9zdHJpZGU7CQkvKiBTdHJpZGUgaW5mby4gICovCit9IEVsZjY0X01vdmU7CisKKy8qIE1hY3JvIHRvIGNvbnN0cnVjdCBtb3ZlIHJlY29yZHMuICAqLworI2RlZmluZSBFTEYzMl9NX1NZTShpbmZvKQkoKGluZm8pID4+IDgpCisjZGVmaW5lIEVMRjMyX01fU0laRShpbmZvKQkoKHVuc2lnbmVkIGNoYXIpIChpbmZvKSkKKyNkZWZpbmUgRUxGMzJfTV9JTkZPKHN5bSwgc2l6ZSkJKCgoc3ltKSA8PCA4KSArICh1bnNpZ25lZCBjaGFyKSAoc2l6ZSkpCisKKyNkZWZpbmUgRUxGNjRfTV9TWU0oaW5mbykJRUxGMzJfTV9TWU0gKGluZm8pCisjZGVmaW5lIEVMRjY0X01fU0laRShpbmZvKQlFTEYzMl9NX1NJWkUgKGluZm8pCisjZGVmaW5lIEVMRjY0X01fSU5GTyhzeW0sIHNpemUpCUVMRjMyX01fSU5GTyAoc3ltLCBzaXplKQorCisKKy8qIE1vdG9yb2xhIDY4ayBzcGVjaWZpYyBkZWZpbml0aW9ucy4gICovCisKKy8qIFZhbHVlcyBmb3IgRWxmMzJfRWhkci5lX2ZsYWdzLiAgKi8KKyNkZWZpbmUgRUZfQ1BVMzIJMHgwMDgxMDAwMAorCisvKiBtNjhrIHJlbG9jcy4gICovCisKKyNkZWZpbmUgUl82OEtfTk9ORQkwCQkvKiBObyByZWxvYyAqLworI2RlZmluZSBSXzY4S18zMgkxCQkvKiBEaXJlY3QgMzIgYml0ICAqLworI2RlZmluZSBSXzY4S18xNgkyCQkvKiBEaXJlY3QgMTYgYml0ICAqLworI2RlZmluZSBSXzY4S184CQkzCQkvKiBEaXJlY3QgOCBiaXQgICovCisjZGVmaW5lIFJfNjhLX1BDMzIJNAkJLyogUEMgcmVsYXRpdmUgMzIgYml0ICovCisjZGVmaW5lIFJfNjhLX1BDMTYJNQkJLyogUEMgcmVsYXRpdmUgMTYgYml0ICovCisjZGVmaW5lIFJfNjhLX1BDOAk2CQkvKiBQQyByZWxhdGl2ZSA4IGJpdCAqLworI2RlZmluZSBSXzY4S19HT1QzMgk3CQkvKiAzMiBiaXQgUEMgcmVsYXRpdmUgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfNjhLX0dPVDE2CTgJCS8qIDE2IGJpdCBQQyByZWxhdGl2ZSBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl82OEtfR09UOAk5CQkvKiA4IGJpdCBQQyByZWxhdGl2ZSBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl82OEtfR09UMzJPCTEwCQkvKiAzMiBiaXQgR09UIG9mZnNldCAqLworI2RlZmluZSBSXzY4S19HT1QxNk8JMTEJCS8qIDE2IGJpdCBHT1Qgb2Zmc2V0ICovCisjZGVmaW5lIFJfNjhLX0dPVDhPCTEyCQkvKiA4IGJpdCBHT1Qgb2Zmc2V0ICovCisjZGVmaW5lIFJfNjhLX1BMVDMyCTEzCQkvKiAzMiBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl82OEtfUExUMTYJMTQJCS8qIDE2IGJpdCBQQyByZWxhdGl2ZSBQTFQgYWRkcmVzcyAqLworI2RlZmluZSBSXzY4S19QTFQ4CTE1CQkvKiA4IGJpdCBQQyByZWxhdGl2ZSBQTFQgYWRkcmVzcyAqLworI2RlZmluZSBSXzY4S19QTFQzMk8JMTYJCS8qIDMyIGJpdCBQTFQgb2Zmc2V0ICovCisjZGVmaW5lIFJfNjhLX1BMVDE2TwkxNwkJLyogMTYgYml0IFBMVCBvZmZzZXQgKi8KKyNkZWZpbmUgUl82OEtfUExUOE8JMTgJCS8qIDggYml0IFBMVCBvZmZzZXQgKi8KKyNkZWZpbmUgUl82OEtfQ09QWQkxOQkJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLworI2RlZmluZSBSXzY4S19HTE9CX0RBVAkyMAkJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLworI2RlZmluZSBSXzY4S19KTVBfU0xPVAkyMQkJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLworI2RlZmluZSBSXzY4S19SRUxBVElWRQkyMgkJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLworI2RlZmluZSBSXzY4S19UTFNfR0QzMiAgICAgIDI1ICAgICAgICAgIC8qIDMyIGJpdCBHT1Qgb2Zmc2V0IGZvciBHRCAqLworI2RlZmluZSBSXzY4S19UTFNfR0QxNiAgICAgIDI2ICAgICAgICAgIC8qIDE2IGJpdCBHT1Qgb2Zmc2V0IGZvciBHRCAqLworI2RlZmluZSBSXzY4S19UTFNfR0Q4ICAgICAgIDI3ICAgICAgICAgIC8qIDggYml0IEdPVCBvZmZzZXQgZm9yIEdEICovCisjZGVmaW5lIFJfNjhLX1RMU19MRE0zMiAgICAgMjggICAgICAgICAgLyogMzIgYml0IEdPVCBvZmZzZXQgZm9yIExETSAqLworI2RlZmluZSBSXzY4S19UTFNfTERNMTYgICAgIDI5ICAgICAgICAgIC8qIDE2IGJpdCBHT1Qgb2Zmc2V0IGZvciBMRE0gKi8KKyNkZWZpbmUgUl82OEtfVExTX0xETTggICAgICAzMCAgICAgICAgICAvKiA4IGJpdCBHT1Qgb2Zmc2V0IGZvciBMRE0gKi8KKyNkZWZpbmUgUl82OEtfVExTX0xETzMyICAgICAzMSAgICAgICAgICAvKiAzMiBiaXQgbW9kdWxlLXJlbGF0aXZlIG9mZnNldCAqLworI2RlZmluZSBSXzY4S19UTFNfTERPMTYgICAgIDMyICAgICAgICAgIC8qIDE2IGJpdCBtb2R1bGUtcmVsYXRpdmUgb2Zmc2V0ICovCisjZGVmaW5lIFJfNjhLX1RMU19MRE84ICAgICAgMzMgICAgICAgICAgLyogOCBiaXQgbW9kdWxlLXJlbGF0aXZlIG9mZnNldCAqLworI2RlZmluZSBSXzY4S19UTFNfSUUzMiAgICAgIDM0ICAgICAgICAgIC8qIDMyIGJpdCBHT1Qgb2Zmc2V0IGZvciBJRSAqLworI2RlZmluZSBSXzY4S19UTFNfSUUxNiAgICAgIDM1ICAgICAgICAgIC8qIDE2IGJpdCBHT1Qgb2Zmc2V0IGZvciBJRSAqLworI2RlZmluZSBSXzY4S19UTFNfSUU4ICAgICAgIDM2ICAgICAgICAgIC8qIDggYml0IEdPVCBvZmZzZXQgZm9yIElFICovCisjZGVmaW5lIFJfNjhLX1RMU19MRTMyICAgICAgMzcgICAgICAgICAgLyogMzIgYml0IG9mZnNldCByZWxhdGl2ZSB0bworCQkJCQkgICBzdGF0aWMgVExTIGJsb2NrICovCisjZGVmaW5lIFJfNjhLX1RMU19MRTE2ICAgICAgMzggICAgICAgICAgLyogMTYgYml0IG9mZnNldCByZWxhdGl2ZSB0bworCQkJCQkgICBzdGF0aWMgVExTIGJsb2NrICovCisjZGVmaW5lIFJfNjhLX1RMU19MRTggICAgICAgMzkgICAgICAgICAgLyogOCBiaXQgb2Zmc2V0IHJlbGF0aXZlIHRvCisJCQkJCSAgIHN0YXRpYyBUTFMgYmxvY2sgKi8KKyNkZWZpbmUgUl82OEtfVExTX0RUUE1PRDMyICA0MCAgICAgICAgICAvKiAzMiBiaXQgbW9kdWxlIG51bWJlciAqLworI2RlZmluZSBSXzY4S19UTFNfRFRQUkVMMzIgIDQxICAgICAgICAgIC8qIDMyIGJpdCBtb2R1bGUtcmVsYXRpdmUgb2Zmc2V0ICovCisjZGVmaW5lIFJfNjhLX1RMU19UUFJFTDMyICAgNDIgICAgICAgICAgLyogMzIgYml0IFRQLXJlbGF0aXZlIG9mZnNldCAqLworLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAgKi8KKyNkZWZpbmUgUl82OEtfTlVNCTQzCisKKy8qIEludGVsIDgwMzg2IHNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KKworLyogaTM4NiByZWxvY3MuICAqLworCisjZGVmaW5lIFJfMzg2X05PTkUJICAgMAkJLyogTm8gcmVsb2MgKi8KKyNkZWZpbmUgUl8zODZfMzIJICAgMQkJLyogRGlyZWN0IDMyIGJpdCAgKi8KKyNkZWZpbmUgUl8zODZfUEMzMgkgICAyCQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KKyNkZWZpbmUgUl8zODZfR09UMzIJICAgMwkJLyogMzIgYml0IEdPVCBlbnRyeSAqLworI2RlZmluZSBSXzM4Nl9QTFQzMgkgICA0CQkvKiAzMiBiaXQgUExUIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl8zODZfQ09QWQkgICA1CQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCisjZGVmaW5lIFJfMzg2X0dMT0JfREFUCSAgIDYJCS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl8zODZfSk1QX1NMT1QJICAgNwkJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLworI2RlZmluZSBSXzM4Nl9SRUxBVElWRQkgICA4CQkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCisjZGVmaW5lIFJfMzg2X0dPVE9GRgkgICA5CQkvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVCAqLworI2RlZmluZSBSXzM4Nl9HT1RQQwkgICAxMAkJLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KKyNkZWZpbmUgUl8zODZfMzJQTFQJICAgMTEKKyNkZWZpbmUgUl8zODZfVExTX1RQT0ZGCSAgIDE0CQkvKiBPZmZzZXQgaW4gc3RhdGljIFRMUyBibG9jayAqLworI2RlZmluZSBSXzM4Nl9UTFNfSUUJICAgMTUJCS8qIEFkZHJlc3Mgb2YgR09UIGVudHJ5IGZvciBzdGF0aWMgVExTCisJCQkJCSAgIGJsb2NrIG9mZnNldCAqLworI2RlZmluZSBSXzM4Nl9UTFNfR09USUUJICAgMTYJCS8qIEdPVCBlbnRyeSBmb3Igc3RhdGljIFRMUyBibG9jaworCQkJCQkgICBvZmZzZXQgKi8KKyNkZWZpbmUgUl8zODZfVExTX0xFCSAgIDE3CQkvKiBPZmZzZXQgcmVsYXRpdmUgdG8gc3RhdGljIFRMUworCQkJCQkgICBibG9jayAqLworI2RlZmluZSBSXzM4Nl9UTFNfR0QJICAgMTgJCS8qIERpcmVjdCAzMiBiaXQgZm9yIEdOVSB2ZXJzaW9uIG9mCisJCQkJCSAgIGdlbmVyYWwgZHluYW1pYyB0aHJlYWQgbG9jYWwgZGF0YSAqLworI2RlZmluZSBSXzM4Nl9UTFNfTERNCSAgIDE5CQkvKiBEaXJlY3QgMzIgYml0IGZvciBHTlUgdmVyc2lvbiBvZgorCQkJCQkgICBsb2NhbCBkeW5hbWljIHRocmVhZCBsb2NhbCBkYXRhCisJCQkJCSAgIGluIExFIGNvZGUgKi8KKyNkZWZpbmUgUl8zODZfMTYJICAgMjAKKyNkZWZpbmUgUl8zODZfUEMxNgkgICAyMQorI2RlZmluZSBSXzM4Nl84CQkgICAyMgorI2RlZmluZSBSXzM4Nl9QQzgJICAgMjMKKyNkZWZpbmUgUl8zODZfVExTX0dEXzMyCSAgIDI0CQkvKiBEaXJlY3QgMzIgYml0IGZvciBnZW5lcmFsIGR5bmFtaWMKKwkJCQkJICAgdGhyZWFkIGxvY2FsIGRhdGEgKi8KKyNkZWZpbmUgUl8zODZfVExTX0dEX1BVU0ggIDI1CQkvKiBUYWcgZm9yIHB1c2hsIGluIEdEIFRMUyBjb2RlICovCisjZGVmaW5lIFJfMzg2X1RMU19HRF9DQUxMICAyNgkJLyogUmVsb2NhdGlvbiBmb3IgY2FsbCB0bworCQkJCQkgICBfX3Rsc19nZXRfYWRkcigpICovCisjZGVmaW5lIFJfMzg2X1RMU19HRF9QT1AgICAyNwkJLyogVGFnIGZvciBwb3BsIGluIEdEIFRMUyBjb2RlICovCisjZGVmaW5lIFJfMzg2X1RMU19MRE1fMzIgICAyOAkJLyogRGlyZWN0IDMyIGJpdCBmb3IgbG9jYWwgZHluYW1pYworCQkJCQkgICB0aHJlYWQgbG9jYWwgZGF0YSBpbiBMRSBjb2RlICovCisjZGVmaW5lIFJfMzg2X1RMU19MRE1fUFVTSCAyOQkJLyogVGFnIGZvciBwdXNobCBpbiBMRE0gVExTIGNvZGUgKi8KKyNkZWZpbmUgUl8zODZfVExTX0xETV9DQUxMIDMwCQkvKiBSZWxvY2F0aW9uIGZvciBjYWxsIHRvCisJCQkJCSAgIF9fdGxzX2dldF9hZGRyKCkgaW4gTERNIGNvZGUgKi8KKyNkZWZpbmUgUl8zODZfVExTX0xETV9QT1AgIDMxCQkvKiBUYWcgZm9yIHBvcGwgaW4gTERNIFRMUyBjb2RlICovCisjZGVmaW5lIFJfMzg2X1RMU19MRE9fMzIgICAzMgkJLyogT2Zmc2V0IHJlbGF0aXZlIHRvIFRMUyBibG9jayAqLworI2RlZmluZSBSXzM4Nl9UTFNfSUVfMzIJICAgMzMJCS8qIEdPVCBlbnRyeSBmb3IgbmVnYXRlZCBzdGF0aWMgVExTCisJCQkJCSAgIGJsb2NrIG9mZnNldCAqLworI2RlZmluZSBSXzM4Nl9UTFNfTEVfMzIJICAgMzQJCS8qIE5lZ2F0ZWQgb2Zmc2V0IHJlbGF0aXZlIHRvIHN0YXRpYworCQkJCQkgICBUTFMgYmxvY2sgKi8KKyNkZWZpbmUgUl8zODZfVExTX0RUUE1PRDMyIDM1CQkvKiBJRCBvZiBtb2R1bGUgY29udGFpbmluZyBzeW1ib2wgKi8KKyNkZWZpbmUgUl8zODZfVExTX0RUUE9GRjMyIDM2CQkvKiBPZmZzZXQgaW4gVExTIGJsb2NrICovCisjZGVmaW5lIFJfMzg2X1RMU19UUE9GRjMyICAzNwkJLyogTmVnYXRlZCBvZmZzZXQgaW4gc3RhdGljIFRMUyBibG9jayAqLworLyogMzg/ICovCisjZGVmaW5lIFJfMzg2X1RMU19HT1RERVNDICAzOQkJLyogR09UIG9mZnNldCBmb3IgVExTIGRlc2NyaXB0b3IuICAqLworI2RlZmluZSBSXzM4Nl9UTFNfREVTQ19DQUxMIDQwCQkvKiBNYXJrZXIgb2YgY2FsbCB0aHJvdWdoIFRMUworCQkJCQkgICBkZXNjcmlwdG9yIGZvcgorCQkJCQkgICByZWxheGF0aW9uLiAgKi8KKyNkZWZpbmUgUl8zODZfVExTX0RFU0MgICAgIDQxCQkvKiBUTFMgZGVzY3JpcHRvciBjb250YWluaW5nCisJCQkJCSAgIHBvaW50ZXIgdG8gY29kZSBhbmQgdG8KKwkJCQkJICAgYXJndW1lbnQsIHJldHVybmluZyB0aGUgVExTCisJCQkJCSAgIG9mZnNldCBmb3IgdGhlIHN5bWJvbC4gICovCisjZGVmaW5lIFJfMzg2X0lSRUxBVElWRQkgICA0MgkJLyogQWRqdXN0IGluZGlyZWN0bHkgYnkgcHJvZ3JhbSBiYXNlICovCisvKiBLZWVwIHRoaXMgdGhlIGxhc3QgZW50cnkuICAqLworI2RlZmluZSBSXzM4Nl9OVU0JICAgNDMKKworLyogU1VOIFNQQVJDIHNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBTVF9UWVBFIHN1YmZpZWxkIG9mIHN0X2luZm8gKHN5bWJvbCB0eXBlKS4gICovCisKKyNkZWZpbmUgU1RUX1NQQVJDX1JFR0lTVEVSCTEzCS8qIEdsb2JhbCByZWdpc3RlciByZXNlcnZlZCB0byBhcHAuICovCisKKy8qIFZhbHVlcyBmb3IgRWxmNjRfRWhkci5lX2ZsYWdzLiAgKi8KKworI2RlZmluZSBFRl9TUEFSQ1Y5X01NCQkzCisjZGVmaW5lIEVGX1NQQVJDVjlfVFNPCQkwCisjZGVmaW5lIEVGX1NQQVJDVjlfUFNPCQkxCisjZGVmaW5lIEVGX1NQQVJDVjlfUk1PCQkyCisjZGVmaW5lIEVGX1NQQVJDX0xFREFUQQkJMHg4MDAwMDAgLyogbGl0dGxlIGVuZGlhbiBkYXRhICovCisjZGVmaW5lIEVGX1NQQVJDX0VYVF9NQVNLCTB4RkZGRjAwCisjZGVmaW5lIEVGX1NQQVJDXzMyUExVUwkJMHgwMDAxMDAgLyogZ2VuZXJpYyBWOCsgZmVhdHVyZXMgKi8KKyNkZWZpbmUgRUZfU1BBUkNfU1VOX1VTMQkweDAwMDIwMCAvKiBTdW4gVWx0cmFTUEFSQzEgZXh0ZW5zaW9ucyAqLworI2RlZmluZSBFRl9TUEFSQ19IQUxfUjEJCTB4MDAwNDAwIC8qIEhBTCBSMSBleHRlbnNpb25zICovCisjZGVmaW5lIEVGX1NQQVJDX1NVTl9VUzMJMHgwMDA4MDAgLyogU3VuIFVsdHJhU1BBUkNJSUkgZXh0ZW5zaW9ucyAqLworCisvKiBTUEFSQyByZWxvY3MuICAqLworCisjZGVmaW5lIFJfU1BBUkNfTk9ORQkJMAkvKiBObyByZWxvYyAqLworI2RlZmluZSBSX1NQQVJDXzgJCTEJLyogRGlyZWN0IDggYml0ICovCisjZGVmaW5lIFJfU1BBUkNfMTYJCTIJLyogRGlyZWN0IDE2IGJpdCAqLworI2RlZmluZSBSX1NQQVJDXzMyCQkzCS8qIERpcmVjdCAzMiBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ19ESVNQOAkJNAkvKiBQQyByZWxhdGl2ZSA4IGJpdCAqLworI2RlZmluZSBSX1NQQVJDX0RJU1AxNgkJNQkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ19ESVNQMzIJCTYJLyogUEMgcmVsYXRpdmUgMzIgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfV0RJU1AzMAkJNwkvKiBQQyByZWxhdGl2ZSAzMCBiaXQgc2hpZnRlZCAqLworI2RlZmluZSBSX1NQQVJDX1dESVNQMjIJCTgJLyogUEMgcmVsYXRpdmUgMjIgYml0IHNoaWZ0ZWQgKi8KKyNkZWZpbmUgUl9TUEFSQ19ISTIyCQk5CS8qIEhpZ2ggMjIgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfMjIJCTEwCS8qIERpcmVjdCAyMiBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ18xMwkJMTEJLyogRGlyZWN0IDEzIGJpdCAqLworI2RlZmluZSBSX1NQQVJDX0xPMTAJCTEyCS8qIFRydW5jYXRlZCAxMCBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ19HT1QxMAkJMTMJLyogVHJ1bmNhdGVkIDEwIGJpdCBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9TUEFSQ19HT1QxMwkJMTQJLyogMTMgYml0IEdPVCBlbnRyeSAqLworI2RlZmluZSBSX1NQQVJDX0dPVDIyCQkxNQkvKiAyMiBiaXQgR09UIGVudHJ5IHNoaWZ0ZWQgKi8KKyNkZWZpbmUgUl9TUEFSQ19QQzEwCQkxNgkvKiBQQyByZWxhdGl2ZSAxMCBiaXQgdHJ1bmNhdGVkICovCisjZGVmaW5lIFJfU1BBUkNfUEMyMgkJMTcJLyogUEMgcmVsYXRpdmUgMjIgYml0IHNoaWZ0ZWQgKi8KKyNkZWZpbmUgUl9TUEFSQ19XUExUMzAJCTE4CS8qIDMwIGJpdCBQQyByZWxhdGl2ZSBQTFQgYWRkcmVzcyAqLworI2RlZmluZSBSX1NQQVJDX0NPUFkJCTE5CS8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUgKi8KKyNkZWZpbmUgUl9TUEFSQ19HTE9CX0RBVAkyMAkvKiBDcmVhdGUgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfU1BBUkNfSk1QX1NMT1QJMjEJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLworI2RlZmluZSBSX1NQQVJDX1JFTEFUSVZFCTIyCS8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UgKi8KKyNkZWZpbmUgUl9TUEFSQ19VQTMyCQkyMwkvKiBEaXJlY3QgMzIgYml0IHVuYWxpZ25lZCAqLworCisvKiBBZGRpdGlvbmFsIFNwYXJjNjQgcmVsb2NzLiAgKi8KKworI2RlZmluZSBSX1NQQVJDX1BMVDMyCQkyNAkvKiBEaXJlY3QgMzIgYml0IHJlZiB0byBQTFQgZW50cnkgKi8KKyNkZWZpbmUgUl9TUEFSQ19ISVBMVDIyCQkyNQkvKiBIaWdoIDIyIGJpdCBQTFQgZW50cnkgKi8KKyNkZWZpbmUgUl9TUEFSQ19MT1BMVDEwCQkyNgkvKiBUcnVuY2F0ZWQgMTAgYml0IFBMVCBlbnRyeSAqLworI2RlZmluZSBSX1NQQVJDX1BDUExUMzIJCTI3CS8qIFBDIHJlbCAzMiBiaXQgcmVmIHRvIFBMVCBlbnRyeSAqLworI2RlZmluZSBSX1NQQVJDX1BDUExUMjIJCTI4CS8qIFBDIHJlbCBoaWdoIDIyIGJpdCBQTFQgZW50cnkgKi8KKyNkZWZpbmUgUl9TUEFSQ19QQ1BMVDEwCQkyOQkvKiBQQyByZWwgdHJ1bmMgMTAgYml0IFBMVCBlbnRyeSAqLworI2RlZmluZSBSX1NQQVJDXzEwCQkzMAkvKiBEaXJlY3QgMTAgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfMTEJCTMxCS8qIERpcmVjdCAxMSBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ182NAkJMzIJLyogRGlyZWN0IDY0IGJpdCAqLworI2RlZmluZSBSX1NQQVJDX09MTzEwCQkzMwkvKiAxMGJpdCB3aXRoIHNlY29uZGFyeSAxM2JpdCBhZGRlbmQgKi8KKyNkZWZpbmUgUl9TUEFSQ19ISDIyCQkzNAkvKiBUb3AgMjIgYml0cyBvZiBkaXJlY3QgNjQgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfSE0xMAkJMzUJLyogSGlnaCBtaWRkbGUgMTAgYml0cyBvZiAuLi4gKi8KKyNkZWZpbmUgUl9TUEFSQ19MTTIyCQkzNgkvKiBMb3cgbWlkZGxlIDIyIGJpdHMgb2YgLi4uICovCisjZGVmaW5lIFJfU1BBUkNfUENfSEgyMgkJMzcJLyogVG9wIDIyIGJpdHMgb2YgcGMgcmVsIDY0IGJpdCAqLworI2RlZmluZSBSX1NQQVJDX1BDX0hNMTAJCTM4CS8qIEhpZ2ggbWlkZGxlIDEwIGJpdCBvZiAuLi4gKi8KKyNkZWZpbmUgUl9TUEFSQ19QQ19MTTIyCQkzOQkvKiBMb3cgbWlnZ2xlIDIyIGJpdHMgb2YgLi4uICovCisjZGVmaW5lIFJfU1BBUkNfV0RJU1AxNgkJNDAJLyogUEMgcmVsYXRpdmUgMTYgYml0IHNoaWZ0ZWQgKi8KKyNkZWZpbmUgUl9TUEFSQ19XRElTUDE5CQk0MQkvKiBQQyByZWxhdGl2ZSAxOSBiaXQgc2hpZnRlZCAqLworI2RlZmluZSBSX1NQQVJDX0dMT0JfSk1QCTQyCS8qIHdhcyBwYXJ0IG9mIHY5IEFCSSBidXQgd2FzIHJlbW92ZWQgKi8KKyNkZWZpbmUgUl9TUEFSQ183CQk0MwkvKiBEaXJlY3QgNyBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ181CQk0NAkvKiBEaXJlY3QgNSBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ182CQk0NQkvKiBEaXJlY3QgNiBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ19ESVNQNjQJCTQ2CS8qIFBDIHJlbGF0aXZlIDY0IGJpdCAqLworI2RlZmluZSBSX1NQQVJDX1BMVDY0CQk0NwkvKiBEaXJlY3QgNjQgYml0IHJlZiB0byBQTFQgZW50cnkgKi8KKyNkZWZpbmUgUl9TUEFSQ19ISVgyMgkJNDgJLyogSGlnaCAyMiBiaXQgY29tcGxlbWVudGVkICovCisjZGVmaW5lIFJfU1BBUkNfTE9YMTAJCTQ5CS8qIFRydW5jYXRlZCAxMSBiaXQgY29tcGxlbWVudGVkICovCisjZGVmaW5lIFJfU1BBUkNfSDQ0CQk1MAkvKiBEaXJlY3QgaGlnaCAxMiBvZiA0NCBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ19NNDQJCTUxCS8qIERpcmVjdCBtaWQgMjIgb2YgNDQgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfTDQ0CQk1MgkvKiBEaXJlY3QgbG93IDEwIG9mIDQ0IGJpdCAqLworI2RlZmluZSBSX1NQQVJDX1JFR0lTVEVSCTUzCS8qIEdsb2JhbCByZWdpc3RlciB1c2FnZSAqLworI2RlZmluZSBSX1NQQVJDX1VBNjQJCTU0CS8qIERpcmVjdCA2NCBiaXQgdW5hbGlnbmVkICovCisjZGVmaW5lIFJfU1BBUkNfVUExNgkJNTUJLyogRGlyZWN0IDE2IGJpdCB1bmFsaWduZWQgKi8KKyNkZWZpbmUgUl9TUEFSQ19UTFNfR0RfSEkyMgk1NgorI2RlZmluZSBSX1NQQVJDX1RMU19HRF9MTzEwCTU3CisjZGVmaW5lIFJfU1BBUkNfVExTX0dEX0FERAk1OAorI2RlZmluZSBSX1NQQVJDX1RMU19HRF9DQUxMCTU5CisjZGVmaW5lIFJfU1BBUkNfVExTX0xETV9ISTIyCTYwCisjZGVmaW5lIFJfU1BBUkNfVExTX0xETV9MTzEwCTYxCisjZGVmaW5lIFJfU1BBUkNfVExTX0xETV9BREQJNjIKKyNkZWZpbmUgUl9TUEFSQ19UTFNfTERNX0NBTEwJNjMKKyNkZWZpbmUgUl9TUEFSQ19UTFNfTERPX0hJWDIyCTY0CisjZGVmaW5lIFJfU1BBUkNfVExTX0xET19MT1gxMAk2NQorI2RlZmluZSBSX1NQQVJDX1RMU19MRE9fQURECTY2CisjZGVmaW5lIFJfU1BBUkNfVExTX0lFX0hJMjIJNjcKKyNkZWZpbmUgUl9TUEFSQ19UTFNfSUVfTE8xMAk2OAorI2RlZmluZSBSX1NQQVJDX1RMU19JRV9MRAk2OQorI2RlZmluZSBSX1NQQVJDX1RMU19JRV9MRFgJNzAKKyNkZWZpbmUgUl9TUEFSQ19UTFNfSUVfQURECTcxCisjZGVmaW5lIFJfU1BBUkNfVExTX0xFX0hJWDIyCTcyCisjZGVmaW5lIFJfU1BBUkNfVExTX0xFX0xPWDEwCTczCisjZGVmaW5lIFJfU1BBUkNfVExTX0RUUE1PRDMyCTc0CisjZGVmaW5lIFJfU1BBUkNfVExTX0RUUE1PRDY0CTc1CisjZGVmaW5lIFJfU1BBUkNfVExTX0RUUE9GRjMyCTc2CisjZGVmaW5lIFJfU1BBUkNfVExTX0RUUE9GRjY0CTc3CisjZGVmaW5lIFJfU1BBUkNfVExTX1RQT0ZGMzIJNzgKKyNkZWZpbmUgUl9TUEFSQ19UTFNfVFBPRkY2NAk3OQorI2RlZmluZSBSX1NQQVJDX0dPVERBVEFfSElYMjIJODAKKyNkZWZpbmUgUl9TUEFSQ19HT1REQVRBX0xPWDEwCTgxCisjZGVmaW5lIFJfU1BBUkNfR09UREFUQV9PUF9ISVgyMgk4MgorI2RlZmluZSBSX1NQQVJDX0dPVERBVEFfT1BfTE9YMTAJODMKKyNkZWZpbmUgUl9TUEFSQ19HT1REQVRBX09QCTg0CisjZGVmaW5lIFJfU1BBUkNfSDM0CQk4NQorI2RlZmluZSBSX1NQQVJDX1NJWkUzMgkJODYKKyNkZWZpbmUgUl9TUEFSQ19TSVpFNjQJCTg3CisjZGVmaW5lIFJfU1BBUkNfSk1QX0lSRUwJMjQ4CisjZGVmaW5lIFJfU1BBUkNfSVJFTEFUSVZFCTI0OQorI2RlZmluZSBSX1NQQVJDX0dOVV9WVElOSEVSSVQJMjUwCisjZGVmaW5lIFJfU1BBUkNfR05VX1ZURU5UUlkJMjUxCisjZGVmaW5lIFJfU1BBUkNfUkVWMzIJCTI1MgorLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAgKi8KKyNkZWZpbmUgUl9TUEFSQ19OVU0JCTI1MworCisvKiBGb3IgU3BhcmM2NCwgbGVnYWwgdmFsdWVzIGZvciBkX3RhZyBvZiBFbGY2NF9EeW4uICAqLworCisjZGVmaW5lIERUX1NQQVJDX1JFR0lTVEVSIDB4NzAwMDAwMDEKKyNkZWZpbmUgRFRfU1BBUkNfTlVNCTIKKworLyogTUlQUyBSMzAwMCBzcGVjaWZpYyBkZWZpbml0aW9ucy4gICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgZV9mbGFncyBmaWVsZCBvZiBFbGYzMl9FaGRyLiAgKi8KKworI2RlZmluZSBFRl9NSVBTX05PUkVPUkRFUiAgIDEJCS8qIEEgLm5vcmVvcmRlciBkaXJlY3RpdmUgd2FzIHVzZWQgKi8KKyNkZWZpbmUgRUZfTUlQU19QSUMJICAgIDIJCS8qIENvbnRhaW5zIFBJQyBjb2RlICovCisjZGVmaW5lIEVGX01JUFNfQ1BJQwkgICAgNAkJLyogVXNlcyBQSUMgY2FsbGluZyBzZXF1ZW5jZSAqLworI2RlZmluZSBFRl9NSVBTX1hHT1QJICAgIDgKKyNkZWZpbmUgRUZfTUlQU182NEJJVF9XSElSTCAxNgorI2RlZmluZSBFRl9NSVBTX0FCSTIJICAgIDMyCisjZGVmaW5lIEVGX01JUFNfQUJJX09OMzIgICAgNjQKKyNkZWZpbmUgRUZfTUlQU19BUkNICSAgICAweGYwMDAwMDAwCS8qIE1JUFMgYXJjaGl0ZWN0dXJlIGxldmVsICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgTUlQUyBhcmNoaXRlY3R1cmUgbGV2ZWwuICAqLworCisjZGVmaW5lIEVGX01JUFNfQVJDSF8xCSAgICAweDAwMDAwMDAwCS8qIC1taXBzMSBjb2RlLiAgKi8KKyNkZWZpbmUgRUZfTUlQU19BUkNIXzIJICAgIDB4MTAwMDAwMDAJLyogLW1pcHMyIGNvZGUuICAqLworI2RlZmluZSBFRl9NSVBTX0FSQ0hfMwkgICAgMHgyMDAwMDAwMAkvKiAtbWlwczMgY29kZS4gICovCisjZGVmaW5lIEVGX01JUFNfQVJDSF80CSAgICAweDMwMDAwMDAwCS8qIC1taXBzNCBjb2RlLiAgKi8KKyNkZWZpbmUgRUZfTUlQU19BUkNIXzUJICAgIDB4NDAwMDAwMDAJLyogLW1pcHM1IGNvZGUuICAqLworI2RlZmluZSBFRl9NSVBTX0FSQ0hfMzIJICAgIDB4NjAwMDAwMDAJLyogTUlQUzMyIGNvZGUuICAqLworI2RlZmluZSBFRl9NSVBTX0FSQ0hfNjQJICAgIDB4NzAwMDAwMDAJLyogTUlQUzY0IGNvZGUuICAqLworCisvKiBUaGUgZm9sbG93aW5nIGFyZSBub24tb2ZmaWNpYWwgbmFtZXMgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4gICovCisKKyNkZWZpbmUgRV9NSVBTX0FSQ0hfMQkgIDB4MDAwMDAwMDAJLyogLW1pcHMxIGNvZGUuICAqLworI2RlZmluZSBFX01JUFNfQVJDSF8yCSAgMHgxMDAwMDAwMAkvKiAtbWlwczIgY29kZS4gICovCisjZGVmaW5lIEVfTUlQU19BUkNIXzMJICAweDIwMDAwMDAwCS8qIC1taXBzMyBjb2RlLiAgKi8KKyNkZWZpbmUgRV9NSVBTX0FSQ0hfNAkgIDB4MzAwMDAwMDAJLyogLW1pcHM0IGNvZGUuICAqLworI2RlZmluZSBFX01JUFNfQVJDSF81CSAgMHg0MDAwMDAwMAkvKiAtbWlwczUgY29kZS4gICovCisjZGVmaW5lIEVfTUlQU19BUkNIXzMyCSAgMHg2MDAwMDAwMAkvKiBNSVBTMzIgY29kZS4gICovCisjZGVmaW5lIEVfTUlQU19BUkNIXzY0CSAgMHg3MDAwMDAwMAkvKiBNSVBTNjQgY29kZS4gICovCisKKy8qIFNwZWNpYWwgc2VjdGlvbiBpbmRpY2VzLiAgKi8KKworI2RlZmluZSBTSE5fTUlQU19BQ09NTU9OICAgIDB4ZmYwMAkvKiBBbGxvY2F0ZWQgY29tbW9uIHN5bWJvbHMgKi8KKyNkZWZpbmUgU0hOX01JUFNfVEVYVAkgICAgMHhmZjAxCS8qIEFsbG9jYXRlZCB0ZXN0IHN5bWJvbHMuICAqLworI2RlZmluZSBTSE5fTUlQU19EQVRBCSAgICAweGZmMDIJLyogQWxsb2NhdGVkIGRhdGEgc3ltYm9scy4gICovCisjZGVmaW5lIFNITl9NSVBTX1NDT01NT04gICAgMHhmZjAzCS8qIFNtYWxsIGNvbW1vbiBzeW1ib2xzICovCisjZGVmaW5lIFNITl9NSVBTX1NVTkRFRklORUQgMHhmZjA0CS8qIFNtYWxsIHVuZGVmaW5lZCBzeW1ib2xzICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3Igc2hfdHlwZSBmaWVsZCBvZiBFbGYzMl9TaGRyLiAgKi8KKworI2RlZmluZSBTSFRfTUlQU19MSUJMSVNUICAgICAgIDB4NzAwMDAwMDAgLyogU2hhcmVkIG9iamVjdHMgdXNlZCBpbiBsaW5rICovCisjZGVmaW5lIFNIVF9NSVBTX01TWU0JICAgICAgIDB4NzAwMDAwMDEKKyNkZWZpbmUgU0hUX01JUFNfQ09ORkxJQ1QgICAgICAweDcwMDAwMDAyIC8qIENvbmZsaWN0aW5nIHN5bWJvbHMgKi8KKyNkZWZpbmUgU0hUX01JUFNfR1BUQUIJICAgICAgIDB4NzAwMDAwMDMgLyogR2xvYmFsIGRhdGEgYXJlYSBzaXplcyAqLworI2RlZmluZSBTSFRfTUlQU19VQ09ERQkgICAgICAgMHg3MDAwMDAwNCAvKiBSZXNlcnZlZCBmb3IgU0dJL01JUFMgY29tcGlsZXJzICovCisjZGVmaW5lIFNIVF9NSVBTX0RFQlVHCSAgICAgICAweDcwMDAwMDA1IC8qIE1JUFMgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uKi8KKyNkZWZpbmUgU0hUX01JUFNfUkVHSU5GTyAgICAgICAweDcwMDAwMDA2IC8qIFJlZ2lzdGVyIHVzYWdlIGluZm9ybWF0aW9uICovCisjZGVmaW5lIFNIVF9NSVBTX1BBQ0tBR0UgICAgICAgMHg3MDAwMDAwNworI2RlZmluZSBTSFRfTUlQU19QQUNLU1lNICAgICAgIDB4NzAwMDAwMDgKKyNkZWZpbmUgU0hUX01JUFNfUkVMRAkgICAgICAgMHg3MDAwMDAwOQorI2RlZmluZSBTSFRfTUlQU19JRkFDRSAgICAgICAgIDB4NzAwMDAwMGIKKyNkZWZpbmUgU0hUX01JUFNfQ09OVEVOVCAgICAgICAweDcwMDAwMDBjCisjZGVmaW5lIFNIVF9NSVBTX09QVElPTlMgICAgICAgMHg3MDAwMDAwZCAvKiBNaXNjZWxsYW5lb3VzIG9wdGlvbnMuICAqLworI2RlZmluZSBTSFRfTUlQU19TSERSCSAgICAgICAweDcwMDAwMDEwCisjZGVmaW5lIFNIVF9NSVBTX0ZERVNDCSAgICAgICAweDcwMDAwMDExCisjZGVmaW5lIFNIVF9NSVBTX0VYVFNZTQkgICAgICAgMHg3MDAwMDAxMgorI2RlZmluZSBTSFRfTUlQU19ERU5TRQkgICAgICAgMHg3MDAwMDAxMworI2RlZmluZSBTSFRfTUlQU19QREVTQwkgICAgICAgMHg3MDAwMDAxNAorI2RlZmluZSBTSFRfTUlQU19MT0NTWU0JICAgICAgIDB4NzAwMDAwMTUKKyNkZWZpbmUgU0hUX01JUFNfQVVYU1lNCSAgICAgICAweDcwMDAwMDE2CisjZGVmaW5lIFNIVF9NSVBTX09QVFNZTQkgICAgICAgMHg3MDAwMDAxNworI2RlZmluZSBTSFRfTUlQU19MT0NTVFIJICAgICAgIDB4NzAwMDAwMTgKKyNkZWZpbmUgU0hUX01JUFNfTElORQkgICAgICAgMHg3MDAwMDAxOQorI2RlZmluZSBTSFRfTUlQU19SRkRFU0MJICAgICAgIDB4NzAwMDAwMWEKKyNkZWZpbmUgU0hUX01JUFNfREVMVEFTWU0gICAgICAweDcwMDAwMDFiCisjZGVmaW5lIFNIVF9NSVBTX0RFTFRBSU5TVCAgICAgMHg3MDAwMDAxYworI2RlZmluZSBTSFRfTUlQU19ERUxUQUNMQVNTICAgIDB4NzAwMDAwMWQKKyNkZWZpbmUgU0hUX01JUFNfRFdBUkYgICAgICAgICAweDcwMDAwMDFlIC8qIERXQVJGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCisjZGVmaW5lIFNIVF9NSVBTX0RFTFRBREVDTCAgICAgMHg3MDAwMDAxZgorI2RlZmluZSBTSFRfTUlQU19TWU1CT0xfTElCICAgIDB4NzAwMDAwMjAKKyNkZWZpbmUgU0hUX01JUFNfRVZFTlRTCSAgICAgICAweDcwMDAwMDIxIC8qIEV2ZW50IHNlY3Rpb24uICAqLworI2RlZmluZSBTSFRfTUlQU19UUkFOU0xBVEUgICAgIDB4NzAwMDAwMjIKKyNkZWZpbmUgU0hUX01JUFNfUElYSUUJICAgICAgIDB4NzAwMDAwMjMKKyNkZWZpbmUgU0hUX01JUFNfWExBVEUJICAgICAgIDB4NzAwMDAwMjQKKyNkZWZpbmUgU0hUX01JUFNfWExBVEVfREVCVUcgICAweDcwMDAwMDI1CisjZGVmaW5lIFNIVF9NSVBTX1dISVJMCSAgICAgICAweDcwMDAwMDI2CisjZGVmaW5lIFNIVF9NSVBTX0VIX1JFR0lPTiAgICAgMHg3MDAwMDAyNworI2RlZmluZSBTSFRfTUlQU19YTEFURV9PTEQgICAgIDB4NzAwMDAwMjgKKyNkZWZpbmUgU0hUX01JUFNfUERSX0VYQ0VQVElPTiAweDcwMDAwMDI5CisKKy8qIExlZ2FsIHZhbHVlcyBmb3Igc2hfZmxhZ3MgZmllbGQgb2YgRWxmMzJfU2hkci4gICovCisKKyNkZWZpbmUgU0hGX01JUFNfR1BSRUwJIDB4MTAwMDAwMDAJLyogTXVzdCBiZSBwYXJ0IG9mIGdsb2JhbCBkYXRhIGFyZWEgKi8KKyNkZWZpbmUgU0hGX01JUFNfTUVSR0UJIDB4MjAwMDAwMDAKKyNkZWZpbmUgU0hGX01JUFNfQUREUgkgMHg0MDAwMDAwMAorI2RlZmluZSBTSEZfTUlQU19TVFJJTkdTIDB4ODAwMDAwMDAKKyNkZWZpbmUgU0hGX01JUFNfTk9TVFJJUCAweDA4MDAwMDAwCisjZGVmaW5lIFNIRl9NSVBTX0xPQ0FMCSAweDA0MDAwMDAwCisjZGVmaW5lIFNIRl9NSVBTX05BTUVTCSAweDAyMDAwMDAwCisjZGVmaW5lIFNIRl9NSVBTX05PRFVQRQkgMHgwMTAwMDAwMAorCisKKy8qIFN5bWJvbCB0YWJsZXMuICAqLworCisvKiBNSVBTIHNwZWNpZmljIHZhbHVlcyBmb3IgYHN0X290aGVyJy4gICovCisjZGVmaW5lIFNUT19NSVBTX0RFRkFVTFQJCTB4MAorI2RlZmluZSBTVE9fTUlQU19JTlRFUk5BTAkJMHgxCisjZGVmaW5lIFNUT19NSVBTX0hJRERFTgkJCTB4MgorI2RlZmluZSBTVE9fTUlQU19QUk9URUNURUQJCTB4MworI2RlZmluZSBTVE9fTUlQU19QTFQJCQkweDgKKyNkZWZpbmUgU1RPX01JUFNfU0NfQUxJR05fVU5VU0VECTB4ZmYKKworLyogTUlQUyBzcGVjaWZpYyB2YWx1ZXMgZm9yIGBzdF9pbmZvJy4gICovCisjZGVmaW5lIFNUQl9NSVBTX1NQTElUX0NPTU1PTgkJMTMKKworLyogRW50cmllcyBmb3VuZCBpbiBzZWN0aW9ucyBvZiB0eXBlIFNIVF9NSVBTX0dQVEFCLiAgKi8KKwordHlwZWRlZiB1bmlvbgoreworICBzdHJ1Y3QKKyAgICB7CisgICAgICBFbGYzMl9Xb3JkIGd0X2N1cnJlbnRfZ192YWx1ZTsJLyogLUcgdmFsdWUgdXNlZCBmb3IgY29tcGlsYXRpb24gKi8KKyAgICAgIEVsZjMyX1dvcmQgZ3RfdW51c2VkOwkJLyogTm90IHVzZWQgKi8KKyAgICB9IGd0X2hlYWRlcjsJCQkvKiBGaXJzdCBlbnRyeSBpbiBzZWN0aW9uICovCisgIHN0cnVjdAorICAgIHsKKyAgICAgIEVsZjMyX1dvcmQgZ3RfZ192YWx1ZTsJCS8qIElmIHRoaXMgdmFsdWUgd2VyZSB1c2VkIGZvciAtRyAqLworICAgICAgRWxmMzJfV29yZCBndF9ieXRlczsJCS8qIFRoaXMgbWFueSBieXRlcyB3b3VsZCBiZSB1c2VkICovCisgICAgfSBndF9lbnRyeTsJCQkJLyogU3Vic2VxdWVudCBlbnRyaWVzIGluIHNlY3Rpb24gKi8KK30gRWxmMzJfZ3B0YWI7CisKKy8qIEVudHJ5IGZvdW5kIGluIHNlY3Rpb25zIG9mIHR5cGUgU0hUX01JUFNfUkVHSU5GTy4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX1dvcmQJcmlfZ3BybWFzazsJCS8qIEdlbmVyYWwgcmVnaXN0ZXJzIHVzZWQgKi8KKyAgRWxmMzJfV29yZAlyaV9jcHJtYXNrWzRdOwkJLyogQ29wcm9jZXNzb3IgcmVnaXN0ZXJzIHVzZWQgKi8KKyAgRWxmMzJfU3dvcmQJcmlfZ3BfdmFsdWU7CQkvKiAkZ3AgcmVnaXN0ZXIgdmFsdWUgKi8KK30gRWxmMzJfUmVnSW5mbzsKKworLyogRW50cmllcyBmb3VuZCBpbiBzZWN0aW9ucyBvZiB0eXBlIFNIVF9NSVBTX09QVElPTlMuICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICB1bnNpZ25lZCBjaGFyIGtpbmQ7CQkvKiBEZXRlcm1pbmVzIGludGVycHJldGF0aW9uIG9mIHRoZQorCQkJCSAgIHZhcmlhYmxlIHBhcnQgb2YgZGVzY3JpcHRvci4gICovCisgIHVuc2lnbmVkIGNoYXIgc2l6ZTsJCS8qIFNpemUgb2YgZGVzY3JpcHRvciwgaW5jbHVkaW5nIGhlYWRlci4gICovCisgIEVsZjMyX1NlY3Rpb24gc2VjdGlvbjsJLyogU2VjdGlvbiBoZWFkZXIgaW5kZXggb2Ygc2VjdGlvbiBhZmZlY3RlZCwKKwkJCQkgICAwIGZvciBnbG9iYWwgb3B0aW9ucy4gICovCisgIEVsZjMyX1dvcmQgaW5mbzsJCS8qIEtpbmQtc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLworfSBFbGZfT3B0aW9uczsKKworLyogVmFsdWVzIGZvciBga2luZCcgZmllbGQgaW4gRWxmX09wdGlvbnMuICAqLworCisjZGVmaW5lIE9ES19OVUxMCTAJLyogVW5kZWZpbmVkLiAgKi8KKyNkZWZpbmUgT0RLX1JFR0lORk8JMQkvKiBSZWdpc3RlciB1c2FnZSBpbmZvcm1hdGlvbi4gICovCisjZGVmaW5lIE9ES19FWENFUFRJT05TCTIJLyogRXhjZXB0aW9uIHByb2Nlc3Npbmcgb3B0aW9ucy4gICovCisjZGVmaW5lIE9ES19QQUQJCTMJLyogU2VjdGlvbiBwYWRkaW5nIG9wdGlvbnMuICAqLworI2RlZmluZSBPREtfSFdQQVRDSAk0CS8qIEhhcmR3YXJlIHdvcmthcm91bmRzIHBlcmZvcm1lZCAqLworI2RlZmluZSBPREtfRklMTAk1CS8qIHJlY29yZCB0aGUgZmlsbCB2YWx1ZSB1c2VkIGJ5IHRoZSBsaW5rZXIuICovCisjZGVmaW5lIE9ES19UQUdTCTYJLyogcmVzZXJ2ZSBzcGFjZSBmb3IgZGVza3RvcCB0b29scyB0byB3cml0ZS4gKi8KKyNkZWZpbmUgT0RLX0hXQU5ECTcJLyogSFcgd29ya2Fyb3VuZHMuICAnQU5EJyBiaXRzIHdoZW4gbWVyZ2luZy4gKi8KKyNkZWZpbmUgT0RLX0hXT1IJOAkvKiBIVyB3b3JrYXJvdW5kcy4gICdPUicgYml0cyB3aGVuIG1lcmdpbmcuICAqLworCisvKiBWYWx1ZXMgZm9yIGBpbmZvJyBpbiBFbGZfT3B0aW9ucyBmb3IgT0RLX0VYQ0VQVElPTlMgZW50cmllcy4gICovCisKKyNkZWZpbmUgT0VYX0ZQVV9NSU4JMHgxZgkvKiBGUEUncyB3aGljaCBNVVNUIGJlIGVuYWJsZWQuICAqLworI2RlZmluZSBPRVhfRlBVX01BWAkweDFmMDAJLyogRlBFJ3Mgd2hpY2ggTUFZIGJlIGVuYWJsZWQuICAqLworI2RlZmluZSBPRVhfUEFHRTAJMHgxMDAwMAkvKiBwYWdlIHplcm8gbXVzdCBiZSBtYXBwZWQuICAqLworI2RlZmluZSBPRVhfU01NCQkweDIwMDAwCS8qIEZvcmNlIHNlcXVlbnRpYWwgbWVtb3J5IG1vZGU/ICAqLworI2RlZmluZSBPRVhfRlBEQlVHCTB4NDAwMDAJLyogRm9yY2UgZmxvYXRpbmcgcG9pbnQgZGVidWcgbW9kZT8gICovCisjZGVmaW5lIE9FWF9QUkVDSVNFRlAJT0VYX0ZQREJVRworI2RlZmluZSBPRVhfRElTTUlTUwkweDgwMDAwCS8qIERpc21pc3MgaW52YWxpZCBhZGRyZXNzIGZhdWx0cz8gICovCisKKyNkZWZpbmUgT0VYX0ZQVV9JTlZBTAkweDEwCisjZGVmaW5lIE9FWF9GUFVfRElWMAkweDA4CisjZGVmaW5lIE9FWF9GUFVfT0ZMTwkweDA0CisjZGVmaW5lIE9FWF9GUFVfVUZMTwkweDAyCisjZGVmaW5lIE9FWF9GUFVfSU5FWAkweDAxCisKKy8qIE1hc2tzIGZvciBgaW5mbycgaW4gRWxmX09wdGlvbnMgZm9yIGFuIE9ES19IV1BBVENIIGVudHJ5LiAgKi8KKworI2RlZmluZSBPSFdfUjRLRU9QCTB4MQkvKiBSNDAwMCBlbmQtb2YtcGFnZSBwYXRjaC4gICovCisjZGVmaW5lIE9IV19SOEtQRkVUQ0gJMHgyCS8qIG1heSBuZWVkIFI4MDAwIHByZWZldGNoIHBhdGNoLiAgKi8KKyNkZWZpbmUgT0hXX1I1S0VPUAkweDQJLyogUjUwMDAgZW5kLW9mLXBhZ2UgcGF0Y2guICAqLworI2RlZmluZSBPSFdfUjVLQ1ZUTAkweDgJLyogUjUwMDAgY3Z0Lltkc10ubCBidWcuICBjbGVhbj0xLiAgKi8KKworI2RlZmluZSBPUEFEX1BSRUZJWAkweDEKKyNkZWZpbmUgT1BBRF9QT1NURklYCTB4MgorI2RlZmluZSBPUEFEX1NZTUJPTAkweDQKKworLyogRW50cnkgZm91bmQgaW4gYC5vcHRpb25zJyBzZWN0aW9uLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmMzJfV29yZCBod3BfZmxhZ3MxOwkvKiBFeHRyYSBmbGFncy4gICovCisgIEVsZjMyX1dvcmQgaHdwX2ZsYWdzMjsJLyogRXh0cmEgZmxhZ3MuICAqLworfSBFbGZfT3B0aW9uc19IdzsKKworLyogTWFza3MgZm9yIGBpbmZvJyBpbiBFbGZPcHRpb25zIGZvciBPREtfSFdBTkQgYW5kIE9ES19IV09SIGVudHJpZXMuICAqLworCisjZGVmaW5lIE9IV0EwX1I0S0VPUF9DSEVDS0VECTB4MDAwMDAwMDEKKyNkZWZpbmUgT0hXQTFfUjRLRU9QX0NMRUFOCTB4MDAwMDAwMDIKKworLyogTUlQUyByZWxvY3MuICAqLworCisjZGVmaW5lIFJfTUlQU19OT05FCQkwCS8qIE5vIHJlbG9jICovCisjZGVmaW5lIFJfTUlQU18xNgkJMQkvKiBEaXJlY3QgMTYgYml0ICovCisjZGVmaW5lIFJfTUlQU18zMgkJMgkvKiBEaXJlY3QgMzIgYml0ICovCisjZGVmaW5lIFJfTUlQU19SRUwzMgkJMwkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KKyNkZWZpbmUgUl9NSVBTXzI2CQk0CS8qIERpcmVjdCAyNiBiaXQgc2hpZnRlZCAqLworI2RlZmluZSBSX01JUFNfSEkxNgkJNQkvKiBIaWdoIDE2IGJpdCAqLworI2RlZmluZSBSX01JUFNfTE8xNgkJNgkvKiBMb3cgMTYgYml0ICovCisjZGVmaW5lIFJfTUlQU19HUFJFTDE2CQk3CS8qIEdQIHJlbGF0aXZlIDE2IGJpdCAqLworI2RlZmluZSBSX01JUFNfTElURVJBTAkJOAkvKiAxNiBiaXQgbGl0ZXJhbCBlbnRyeSAqLworI2RlZmluZSBSX01JUFNfR09UMTYJCTkJLyogMTYgYml0IEdPVCBlbnRyeSAqLworI2RlZmluZSBSX01JUFNfUEMxNgkJMTAJLyogUEMgcmVsYXRpdmUgMTYgYml0ICovCisjZGVmaW5lIFJfTUlQU19DQUxMMTYJCTExCS8qIDE2IGJpdCBHT1QgZW50cnkgZm9yIGZ1bmN0aW9uICovCisjZGVmaW5lIFJfTUlQU19HUFJFTDMyCQkxMgkvKiBHUCByZWxhdGl2ZSAzMiBiaXQgKi8KKworI2RlZmluZSBSX01JUFNfU0hJRlQ1CQkxNgorI2RlZmluZSBSX01JUFNfU0hJRlQ2CQkxNworI2RlZmluZSBSX01JUFNfNjQJCTE4CisjZGVmaW5lIFJfTUlQU19HT1RfRElTUAkJMTkKKyNkZWZpbmUgUl9NSVBTX0dPVF9QQUdFCQkyMAorI2RlZmluZSBSX01JUFNfR09UX09GU1QJCTIxCisjZGVmaW5lIFJfTUlQU19HT1RfSEkxNgkJMjIKKyNkZWZpbmUgUl9NSVBTX0dPVF9MTzE2CQkyMworI2RlZmluZSBSX01JUFNfU1VCCQkyNAorI2RlZmluZSBSX01JUFNfSU5TRVJUX0EJCTI1CisjZGVmaW5lIFJfTUlQU19JTlNFUlRfQgkJMjYKKyNkZWZpbmUgUl9NSVBTX0RFTEVURQkJMjcKKyNkZWZpbmUgUl9NSVBTX0hJR0hFUgkJMjgKKyNkZWZpbmUgUl9NSVBTX0hJR0hFU1QJCTI5CisjZGVmaW5lIFJfTUlQU19DQUxMX0hJMTYJMzAKKyNkZWZpbmUgUl9NSVBTX0NBTExfTE8xNgkzMQorI2RlZmluZSBSX01JUFNfU0NOX0RJU1AJCTMyCisjZGVmaW5lIFJfTUlQU19SRUwxNgkJMzMKKyNkZWZpbmUgUl9NSVBTX0FERF9JTU1FRElBVEUJMzQKKyNkZWZpbmUgUl9NSVBTX1BKVU1QCQkzNQorI2RlZmluZSBSX01JUFNfUkVMR09UCQkzNgorI2RlZmluZSBSX01JUFNfSkFMUgkJMzcKKyNkZWZpbmUgUl9NSVBTX1RMU19EVFBNT0QzMgkzOAkvKiBNb2R1bGUgbnVtYmVyIDMyIGJpdCAqLworI2RlZmluZSBSX01JUFNfVExTX0RUUFJFTDMyCTM5CS8qIE1vZHVsZS1yZWxhdGl2ZSBvZmZzZXQgMzIgYml0ICovCisjZGVmaW5lIFJfTUlQU19UTFNfRFRQTU9ENjQJNDAJLyogTW9kdWxlIG51bWJlciA2NCBiaXQgKi8KKyNkZWZpbmUgUl9NSVBTX1RMU19EVFBSRUw2NAk0MQkvKiBNb2R1bGUtcmVsYXRpdmUgb2Zmc2V0IDY0IGJpdCAqLworI2RlZmluZSBSX01JUFNfVExTX0dECQk0MgkvKiAxNiBiaXQgR09UIG9mZnNldCBmb3IgR0QgKi8KKyNkZWZpbmUgUl9NSVBTX1RMU19MRE0JCTQzCS8qIDE2IGJpdCBHT1Qgb2Zmc2V0IGZvciBMRE0gKi8KKyNkZWZpbmUgUl9NSVBTX1RMU19EVFBSRUxfSEkxNgk0NAkvKiBNb2R1bGUtcmVsYXRpdmUgb2Zmc2V0LCBoaWdoIDE2IGJpdHMgKi8KKyNkZWZpbmUgUl9NSVBTX1RMU19EVFBSRUxfTE8xNgk0NQkvKiBNb2R1bGUtcmVsYXRpdmUgb2Zmc2V0LCBsb3cgMTYgYml0cyAqLworI2RlZmluZSBSX01JUFNfVExTX0dPVFRQUkVMCTQ2CS8qIDE2IGJpdCBHT1Qgb2Zmc2V0IGZvciBJRSAqLworI2RlZmluZSBSX01JUFNfVExTX1RQUkVMMzIJNDcJLyogVFAtcmVsYXRpdmUgb2Zmc2V0LCAzMiBiaXQgKi8KKyNkZWZpbmUgUl9NSVBTX1RMU19UUFJFTDY0CTQ4CS8qIFRQLXJlbGF0aXZlIG9mZnNldCwgNjQgYml0ICovCisjZGVmaW5lIFJfTUlQU19UTFNfVFBSRUxfSEkxNgk0OQkvKiBUUC1yZWxhdGl2ZSBvZmZzZXQsIGhpZ2ggMTYgYml0cyAqLworI2RlZmluZSBSX01JUFNfVExTX1RQUkVMX0xPMTYJNTAJLyogVFAtcmVsYXRpdmUgb2Zmc2V0LCBsb3cgMTYgYml0cyAqLworI2RlZmluZSBSX01JUFNfR0xPQl9EQVQJCTUxCisjZGVmaW5lIFJfTUlQU19DT1BZCQkxMjYKKyNkZWZpbmUgUl9NSVBTX0pVTVBfU0xPVCAgICAgICAgMTI3CisvKiBLZWVwIHRoaXMgdGhlIGxhc3QgZW50cnkuICAqLworI2RlZmluZSBSX01JUFNfTlVNCQkxMjgKKworLyogTGVnYWwgdmFsdWVzIGZvciBwX3R5cGUgZmllbGQgb2YgRWxmMzJfUGhkci4gICovCisKKyNkZWZpbmUgUFRfTUlQU19SRUdJTkZPCTB4NzAwMDAwMDAJLyogUmVnaXN0ZXIgdXNhZ2UgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgUFRfTUlQU19SVFBST0MgIDB4NzAwMDAwMDEJLyogUnVudGltZSBwcm9jZWR1cmUgdGFibGUuICovCisjZGVmaW5lIFBUX01JUFNfT1BUSU9OUyAweDcwMDAwMDAyCisKKy8qIFNwZWNpYWwgcHJvZ3JhbSBoZWFkZXIgdHlwZXMuICAqLworCisjZGVmaW5lIFBGX01JUFNfTE9DQUwJMHgxMDAwMDAwMAorCisvKiBMZWdhbCB2YWx1ZXMgZm9yIGRfdGFnIGZpZWxkIG9mIEVsZjMyX0R5bi4gICovCisKKyNkZWZpbmUgRFRfTUlQU19STERfVkVSU0lPTiAgMHg3MDAwMDAwMQkvKiBSdW50aW1lIGxpbmtlciBpbnRlcmZhY2UgdmVyc2lvbiAqLworI2RlZmluZSBEVF9NSVBTX1RJTUVfU1RBTVAgICAweDcwMDAwMDAyCS8qIFRpbWVzdGFtcCAqLworI2RlZmluZSBEVF9NSVBTX0lDSEVDS1NVTSAgICAweDcwMDAwMDAzCS8qIENoZWNrc3VtICovCisjZGVmaW5lIERUX01JUFNfSVZFUlNJT04gICAgIDB4NzAwMDAwMDQJLyogVmVyc2lvbiBzdHJpbmcgKHN0cmluZyB0YmwgaW5kZXgpICovCisjZGVmaW5lIERUX01JUFNfRkxBR1MJICAgICAweDcwMDAwMDA1CS8qIEZsYWdzICovCisjZGVmaW5lIERUX01JUFNfQkFTRV9BRERSRVNTIDB4NzAwMDAwMDYJLyogQmFzZSBhZGRyZXNzICovCisjZGVmaW5lIERUX01JUFNfTVNZTQkgICAgIDB4NzAwMDAwMDcKKyNkZWZpbmUgRFRfTUlQU19DT05GTElDVCAgICAgMHg3MDAwMDAwOAkvKiBBZGRyZXNzIG9mIENPTkZMSUNUIHNlY3Rpb24gKi8KKyNkZWZpbmUgRFRfTUlQU19MSUJMSVNUCSAgICAgMHg3MDAwMDAwOQkvKiBBZGRyZXNzIG9mIExJQkxJU1Qgc2VjdGlvbiAqLworI2RlZmluZSBEVF9NSVBTX0xPQ0FMX0dPVE5PICAweDcwMDAwMDBhCS8qIE51bWJlciBvZiBsb2NhbCBHT1QgZW50cmllcyAqLworI2RlZmluZSBEVF9NSVBTX0NPTkZMSUNUTk8gICAweDcwMDAwMDBiCS8qIE51bWJlciBvZiBDT05GTElDVCBlbnRyaWVzICovCisjZGVmaW5lIERUX01JUFNfTElCTElTVE5PICAgIDB4NzAwMDAwMTAJLyogTnVtYmVyIG9mIExJQkxJU1QgZW50cmllcyAqLworI2RlZmluZSBEVF9NSVBTX1NZTVRBQk5PICAgICAweDcwMDAwMDExCS8qIE51bWJlciBvZiBEWU5TWU0gZW50cmllcyAqLworI2RlZmluZSBEVF9NSVBTX1VOUkVGRVhUTk8gICAweDcwMDAwMDEyCS8qIEZpcnN0IGV4dGVybmFsIERZTlNZTSAqLworI2RlZmluZSBEVF9NSVBTX0dPVFNZTQkgICAgIDB4NzAwMDAwMTMJLyogRmlyc3QgR09UIGVudHJ5IGluIERZTlNZTSAqLworI2RlZmluZSBEVF9NSVBTX0hJUEFHRU5PICAgICAweDcwMDAwMDE0CS8qIE51bWJlciBvZiBHT1QgcGFnZSB0YWJsZSBlbnRyaWVzICovCisjZGVmaW5lIERUX01JUFNfUkxEX01BUAkgICAgIDB4NzAwMDAwMTYJLyogQWRkcmVzcyBvZiBydW4gdGltZSBsb2FkZXIgbWFwLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19ERUxUQV9DTEFTUyAgMHg3MDAwMDAxNwkvKiBEZWx0YSBDKysgY2xhc3MgZGVmaW5pdGlvbi4gICovCisjZGVmaW5lIERUX01JUFNfREVMVEFfQ0xBU1NfTk8gICAgMHg3MDAwMDAxOCAvKiBOdW1iZXIgb2YgZW50cmllcyBpbgorCQkJCQkJRFRfTUlQU19ERUxUQV9DTEFTUy4gICovCisjZGVmaW5lIERUX01JUFNfREVMVEFfSU5TVEFOQ0UgICAgMHg3MDAwMDAxOSAvKiBEZWx0YSBDKysgY2xhc3MgaW5zdGFuY2VzLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19ERUxUQV9JTlNUQU5DRV9OTyAweDcwMDAwMDFhIC8qIE51bWJlciBvZiBlbnRyaWVzIGluCisJCQkJCQlEVF9NSVBTX0RFTFRBX0lOU1RBTkNFLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19ERUxUQV9SRUxPQyAgMHg3MDAwMDAxYiAvKiBEZWx0YSByZWxvY2F0aW9ucy4gICovCisjZGVmaW5lIERUX01JUFNfREVMVEFfUkVMT0NfTk8gMHg3MDAwMDAxYyAvKiBOdW1iZXIgb2YgZW50cmllcyBpbgorCQkJCQkgICAgIERUX01JUFNfREVMVEFfUkVMT0MuICAqLworI2RlZmluZSBEVF9NSVBTX0RFTFRBX1NZTSAgICAweDcwMDAwMDFkIC8qIERlbHRhIHN5bWJvbHMgdGhhdCBEZWx0YQorCQkJCQkgICByZWxvY2F0aW9ucyByZWZlciB0by4gICovCisjZGVmaW5lIERUX01JUFNfREVMVEFfU1lNX05PIDB4NzAwMDAwMWUgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4KKwkJCQkJICAgRFRfTUlQU19ERUxUQV9TWU0uICAqLworI2RlZmluZSBEVF9NSVBTX0RFTFRBX0NMQVNTU1lNIDB4NzAwMDAwMjAgLyogRGVsdGEgc3ltYm9scyB0aGF0IGhvbGQgdGhlCisJCQkJCSAgICAgY2xhc3MgZGVjbGFyYXRpb24uICAqLworI2RlZmluZSBEVF9NSVBTX0RFTFRBX0NMQVNTU1lNX05PIDB4NzAwMDAwMjEgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4KKwkJCQkJCURUX01JUFNfREVMVEFfQ0xBU1NTWU0uICAqLworI2RlZmluZSBEVF9NSVBTX0NYWF9GTEFHUyAgICAweDcwMDAwMDIyIC8qIEZsYWdzIGluZGljYXRpbmcgZm9yIEMrKyBmbGF2b3IuICAqLworI2RlZmluZSBEVF9NSVBTX1BJWElFX0lOSVQgICAweDcwMDAwMDIzCisjZGVmaW5lIERUX01JUFNfU1lNQk9MX0xJQiAgIDB4NzAwMDAwMjQKKyNkZWZpbmUgRFRfTUlQU19MT0NBTFBBR0VfR09USURYIDB4NzAwMDAwMjUKKyNkZWZpbmUgRFRfTUlQU19MT0NBTF9HT1RJRFggMHg3MDAwMDAyNgorI2RlZmluZSBEVF9NSVBTX0hJRERFTl9HT1RJRFggMHg3MDAwMDAyNworI2RlZmluZSBEVF9NSVBTX1BST1RFQ1RFRF9HT1RJRFggMHg3MDAwMDAyOAorI2RlZmluZSBEVF9NSVBTX09QVElPTlMJICAgICAweDcwMDAwMDI5IC8qIEFkZHJlc3Mgb2YgLm9wdGlvbnMuICAqLworI2RlZmluZSBEVF9NSVBTX0lOVEVSRkFDRSAgICAweDcwMDAwMDJhIC8qIEFkZHJlc3Mgb2YgLmludGVyZmFjZS4gICovCisjZGVmaW5lIERUX01JUFNfRFlOU1RSX0FMSUdOIDB4NzAwMDAwMmIKKyNkZWZpbmUgRFRfTUlQU19JTlRFUkZBQ0VfU0laRSAweDcwMDAwMDJjIC8qIFNpemUgb2YgdGhlIC5pbnRlcmZhY2Ugc2VjdGlvbi4gKi8KKyNkZWZpbmUgRFRfTUlQU19STERfVEVYVF9SRVNPTFZFX0FERFIgMHg3MDAwMDAyZCAvKiBBZGRyZXNzIG9mIHJsZF90ZXh0X3Jzb2x2ZQorCQkJCQkJICAgIGZ1bmN0aW9uIHN0b3JlZCBpbiBHT1QuICAqLworI2RlZmluZSBEVF9NSVBTX1BFUkZfU1VGRklYICAweDcwMDAwMDJlIC8qIERlZmF1bHQgc3VmZml4IG9mIGRzbyB0byBiZSBhZGRlZAorCQkJCQkgICBieSBybGQgb24gZGxvcGVuKCkgY2FsbHMuICAqLworI2RlZmluZSBEVF9NSVBTX0NPTVBBQ1RfU0laRSAweDcwMDAwMDJmIC8qIChPMzIpU2l6ZSBvZiBjb21wYWN0IHJlbCBzZWN0aW9uLiAqLworI2RlZmluZSBEVF9NSVBTX0dQX1ZBTFVFICAgICAweDcwMDAwMDMwIC8qIEdQIHZhbHVlIGZvciBhdXggR09Ucy4gICovCisjZGVmaW5lIERUX01JUFNfQVVYX0RZTkFNSUMgIDB4NzAwMDAwMzEgLyogQWRkcmVzcyBvZiBhdXggLmR5bmFtaWMuICAqLworLyogVGhlIGFkZHJlc3Mgb2YgLmdvdC5wbHQgaW4gYW4gZXhlY3V0YWJsZSB1c2luZyB0aGUgbmV3IG5vbi1QSUMgQUJJLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19QTFRHT1QJICAgICAweDcwMDAwMDMyCisvKiBUaGUgYmFzZSBvZiB0aGUgUExUIGluIGFuIGV4ZWN1dGFibGUgdXNpbmcgdGhlIG5ldyBub24tUElDIEFCSSBpZiB0aGF0CisgICBQTFQgaXMgd3JpdGFibGUuICBGb3IgYSBub24td3JpdGFibGUgUExULCB0aGlzIGlzIG9taXR0ZWQgb3IgaGFzIGEgemVybworICAgdmFsdWUuICAqLworI2RlZmluZSBEVF9NSVBTX1JXUExUICAgICAgICAweDcwMDAwMDM0CisjZGVmaW5lIERUX01JUFNfTlVNCSAgICAgMHgzNQorCisvKiBMZWdhbCB2YWx1ZXMgZm9yIERUX01JUFNfRkxBR1MgRWxmMzJfRHluIGVudHJ5LiAgKi8KKworI2RlZmluZSBSSEZfTk9ORQkJICAgMAkJLyogTm8gZmxhZ3MgKi8KKyNkZWZpbmUgUkhGX1FVSUNLU1RBUlQJCSAgICgxIDw8IDApCS8qIFVzZSBxdWlja3N0YXJ0ICovCisjZGVmaW5lIFJIRl9OT1RQT1QJCSAgICgxIDw8IDEpCS8qIEhhc2ggc2l6ZSBub3QgcG93ZXIgb2YgMiAqLworI2RlZmluZSBSSEZfTk9fTElCUkFSWV9SRVBMQUNFTUVOVCAoMSA8PCAyKQkvKiBJZ25vcmUgTERfTElCUkFSWV9QQVRIICovCisjZGVmaW5lIFJIRl9OT19NT1ZFCQkgICAoMSA8PCAzKQorI2RlZmluZSBSSEZfU0dJX09OTFkJCSAgICgxIDw8IDQpCisjZGVmaW5lIFJIRl9HVUFSQU5URUVfSU5JVAkgICAoMSA8PCA1KQorI2RlZmluZSBSSEZfREVMVEFfQ19QTFVTX1BMVVMJICAgKDEgPDwgNikKKyNkZWZpbmUgUkhGX0dVQVJBTlRFRV9TVEFSVF9JTklUICAgKDEgPDwgNykKKyNkZWZpbmUgUkhGX1BJWElFCQkgICAoMSA8PCA4KQorI2RlZmluZSBSSEZfREVGQVVMVF9ERUxBWV9MT0FECSAgICgxIDw8IDkpCisjZGVmaW5lIFJIRl9SRVFVSUNLU1RBUlQJICAgKDEgPDwgMTApCisjZGVmaW5lIFJIRl9SRVFVSUNLU1RBUlRFRAkgICAoMSA8PCAxMSkKKyNkZWZpbmUgUkhGX0NPUkQJCSAgICgxIDw8IDEyKQorI2RlZmluZSBSSEZfTk9fVU5SRVNfVU5ERUYJICAgKDEgPDwgMTMpCisjZGVmaW5lIFJIRl9STERfT1JERVJfU0FGRQkgICAoMSA8PCAxNCkKKworLyogRW50cmllcyBmb3VuZCBpbiBzZWN0aW9ucyBvZiB0eXBlIFNIVF9NSVBTX0xJQkxJU1QuICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9Xb3JkIGxfbmFtZTsJCS8qIE5hbWUgKHN0cmluZyB0YWJsZSBpbmRleCkgKi8KKyAgRWxmMzJfV29yZCBsX3RpbWVfc3RhbXA7CS8qIFRpbWVzdGFtcCAqLworICBFbGYzMl9Xb3JkIGxfY2hlY2tzdW07CS8qIENoZWNrc3VtICovCisgIEVsZjMyX1dvcmQgbF92ZXJzaW9uOwkJLyogSW50ZXJmYWNlIHZlcnNpb24gKi8KKyAgRWxmMzJfV29yZCBsX2ZsYWdzOwkJLyogRmxhZ3MgKi8KK30gRWxmMzJfTGliOworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGY2NF9Xb3JkIGxfbmFtZTsJCS8qIE5hbWUgKHN0cmluZyB0YWJsZSBpbmRleCkgKi8KKyAgRWxmNjRfV29yZCBsX3RpbWVfc3RhbXA7CS8qIFRpbWVzdGFtcCAqLworICBFbGY2NF9Xb3JkIGxfY2hlY2tzdW07CS8qIENoZWNrc3VtICovCisgIEVsZjY0X1dvcmQgbF92ZXJzaW9uOwkJLyogSW50ZXJmYWNlIHZlcnNpb24gKi8KKyAgRWxmNjRfV29yZCBsX2ZsYWdzOwkJLyogRmxhZ3MgKi8KK30gRWxmNjRfTGliOworCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgbF9mbGFncy4gICovCisKKyNkZWZpbmUgTExfTk9ORQkJICAwCisjZGVmaW5lIExMX0VYQUNUX01BVENICSAgKDEgPDwgMCkJLyogUmVxdWlyZSBleGFjdCBtYXRjaCAqLworI2RlZmluZSBMTF9JR05PUkVfSU5UX1ZFUiAoMSA8PCAxKQkvKiBJZ25vcmUgaW50ZXJmYWNlIHZlcnNpb24gKi8KKyNkZWZpbmUgTExfUkVRVUlSRV9NSU5PUiAgKDEgPDwgMikKKyNkZWZpbmUgTExfRVhQT1JUUwkgICgxIDw8IDMpCisjZGVmaW5lIExMX0RFTEFZX0xPQUQJICAoMSA8PCA0KQorI2RlZmluZSBMTF9ERUxUQQkgICgxIDw8IDUpCisKKy8qIEVudHJpZXMgZm91bmQgaW4gc2VjdGlvbnMgb2YgdHlwZSBTSFRfTUlQU19DT05GTElDVC4gICovCisKK3R5cGVkZWYgRWxmMzJfQWRkciBFbGYzMl9Db25mbGljdDsKKworCisvKiBIUFBBIHNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBlX2ZsYWdzIGZpZWxkIG9mIEVsZjMyX0VoZHIuICAqLworCisjZGVmaW5lIEVGX1BBUklTQ19UUkFQTklMCTB4MDAwMTAwMDAgLyogVHJhcCBuaWwgcG9pbnRlciBkZXJlZmVyZW5jZS4gICovCisjZGVmaW5lIEVGX1BBUklTQ19FWFQJCTB4MDAwMjAwMDAgLyogUHJvZ3JhbSB1c2VzIGFyY2guIGV4dGVuc2lvbnMuICovCisjZGVmaW5lIEVGX1BBUklTQ19MU0IJCTB4MDAwNDAwMDAgLyogUHJvZ3JhbSBleHBlY3RzIGxpdHRsZSBlbmRpYW4uICovCisjZGVmaW5lIEVGX1BBUklTQ19XSURFCQkweDAwMDgwMDAwIC8qIFByb2dyYW0gZXhwZWN0cyB3aWRlIG1vZGUuICAqLworI2RlZmluZSBFRl9QQVJJU0NfTk9fS0FCUAkweDAwMTAwMDAwIC8qIE5vIGtlcm5lbCBhc3Npc3RlZCBicmFuY2gKKwkJCQkJICAgICAgcHJlZGljdGlvbi4gICovCisjZGVmaW5lIEVGX1BBUklTQ19MQVpZU1dBUAkweDAwNDAwMDAwIC8qIEFsbG93IGxhenkgc3dhcHBpbmcuICAqLworI2RlZmluZSBFRl9QQVJJU0NfQVJDSAkJMHgwMDAwZmZmZiAvKiBBcmNoaXRlY3R1cmUgdmVyc2lvbi4gICovCisKKy8qIERlZmluZWQgdmFsdWVzIGZvciBgZV9mbGFncyAmIEVGX1BBUklTQ19BUkNIJyBhcmU6ICAqLworCisjZGVmaW5lIEVGQV9QQVJJU0NfMV8wCQkgICAgMHgwMjBiIC8qIFBBLVJJU0MgMS4wIGJpZy1lbmRpYW4uICAqLworI2RlZmluZSBFRkFfUEFSSVNDXzFfMQkJICAgIDB4MDIxMCAvKiBQQS1SSVNDIDEuMSBiaWctZW5kaWFuLiAgKi8KKyNkZWZpbmUgRUZBX1BBUklTQ18yXzAJCSAgICAweDAyMTQgLyogUEEtUklTQyAyLjAgYmlnLWVuZGlhbi4gICovCisKKy8qIEFkZGl0aW9uYWwgc2VjdGlvbiBpbmRlY2VzLiAgKi8KKworI2RlZmluZSBTSE5fUEFSSVNDX0FOU0lfQ09NTU9OCTB4ZmYwMAkgICAvKiBTZWN0aW9uIGZvciB0ZW5hdGl2ZWx5IGRlY2xhcmVkCisJCQkJCSAgICAgIHN5bWJvbHMgaW4gQU5TSSBDLiAgKi8KKyNkZWZpbmUgU0hOX1BBUklTQ19IVUdFX0NPTU1PTgkweGZmMDEJICAgLyogQ29tbW9uIGJsb2NrcyBpbiBodWdlIG1vZGVsLiAgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBzaF90eXBlIGZpZWxkIG9mIEVsZjMyX1NoZHIuICAqLworCisjZGVmaW5lIFNIVF9QQVJJU0NfRVhUCQkweDcwMDAwMDAwIC8qIENvbnRhaW5zIHByb2R1Y3Qgc3BlY2lmaWMgZXh0LiAqLworI2RlZmluZSBTSFRfUEFSSVNDX1VOV0lORAkweDcwMDAwMDAxIC8qIFVud2luZCBpbmZvcm1hdGlvbi4gICovCisjZGVmaW5lIFNIVF9QQVJJU0NfRE9DCQkweDcwMDAwMDAyIC8qIERlYnVnIGluZm8gZm9yIG9wdGltaXplZCBjb2RlLiAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHNoX2ZsYWdzIGZpZWxkIG9mIEVsZjMyX1NoZHIuICAqLworCisjZGVmaW5lIFNIRl9QQVJJU0NfU0hPUlQJMHgyMDAwMDAwMCAvKiBTZWN0aW9uIHdpdGggc2hvcnQgYWRkcmVzc2luZy4gKi8KKyNkZWZpbmUgU0hGX1BBUklTQ19IVUdFCQkweDQwMDAwMDAwIC8qIFNlY3Rpb24gZmFyIGZyb20gZ3AuICAqLworI2RlZmluZSBTSEZfUEFSSVNDX1NCUAkJMHg4MDAwMDAwMCAvKiBTdGF0aWMgYnJhbmNoIHByZWRpY3Rpb24gY29kZS4gKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBTVF9UWVBFIHN1YmZpZWxkIG9mIHN0X2luZm8gKHN5bWJvbCB0eXBlKS4gICovCisKKyNkZWZpbmUgU1RUX1BBUklTQ19NSUxMSUNPREUJMTMJLyogTWlsbGljb2RlIGZ1bmN0aW9uIGVudHJ5IHBvaW50LiAgKi8KKworI2RlZmluZSBTVFRfSFBfT1BBUVVFCQkoU1RUX0xPT1MgKyAweDEpCisjZGVmaW5lIFNUVF9IUF9TVFVCCQkoU1RUX0xPT1MgKyAweDIpCisKKy8qIEhQUEEgcmVsb2NzLiAgKi8KKworI2RlZmluZSBSX1BBUklTQ19OT05FCQkwCS8qIE5vIHJlbG9jLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSMzIJCTEJLyogRGlyZWN0IDMyLWJpdCByZWZlcmVuY2UuICAqLworI2RlZmluZSBSX1BBUklTQ19ESVIyMUwJCTIJLyogTGVmdCAyMSBiaXRzIG9mIGVmZi4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0RJUjE3UgkJMwkvKiBSaWdodCAxNyBiaXRzIG9mIGVmZi4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0RJUjE3RgkJNAkvKiAxNyBiaXRzIG9mIGVmZi4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0RJUjE0UgkJNgkvKiBSaWdodCAxNCBiaXRzIG9mIGVmZi4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BDUkVMMzIJOQkvKiAzMi1iaXQgcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUENSRUwyMUwJMTAJLyogTGVmdCAyMSBiaXRzIG9mIHJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BDUkVMMTdSCTExCS8qIFJpZ2h0IDE3IGJpdHMgb2YgcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUENSRUwxN0YJMTIJLyogMTcgYml0cyBvZiByZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDE0UgkxNAkvKiBSaWdodCAxNCBiaXRzIG9mIHJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0RQUkVMMjFMCTE4CS8qIExlZnQgMjEgYml0cyBvZiByZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19EUFJFTDE0UgkyMgkvKiBSaWdodCAxNCBiaXRzIG9mIHJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0dQUkVMMjFMCTI2CS8qIEdQLXJlbGF0aXZlLCBsZWZ0IDIxIGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19HUFJFTDE0UgkzMAkvKiBHUC1yZWxhdGl2ZSwgcmlnaHQgMTQgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGMjFMCTM0CS8qIExULXJlbGF0aXZlLCBsZWZ0IDIxIGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRjE0UgkzOAkvKiBMVC1yZWxhdGl2ZSwgcmlnaHQgMTQgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1NFQ1JFTDMyCTQxCS8qIDMyIGJpdHMgc2VjdGlvbiByZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19TRUdCQVNFCTQ4CS8qIE5vIHJlbG9jYXRpb24sIHNldCBzZWdtZW50IGJhc2UuICAqLworI2RlZmluZSBSX1BBUklTQ19TRUdSRUwzMgk0OQkvKiAzMiBiaXRzIHNlZ21lbnQgcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUExUT0ZGMjFMCTUwCS8qIFBMVCByZWwuIGFkZHJlc3MsIGxlZnQgMjEgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BMVE9GRjE0Ugk1NAkvKiBQTFQgcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfRlBUUjMyCTU3CS8qIDMyIGJpdHMgTFQtcmVsLiBmdW5jdGlvbiBwb2ludGVyLiAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9GUFRSMjFMCTU4CS8qIExULXJlbC4gZmN0IHB0ciwgbGVmdCAyMSBiaXRzLiAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9GUFRSMTRSCTYyCS8qIExULXJlbC4gZmN0IHB0ciwgcmlnaHQgMTQgYml0cy4gKi8KKyNkZWZpbmUgUl9QQVJJU0NfRlBUUjY0CQk2NAkvKiA2NCBiaXRzIGZ1bmN0aW9uIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QTEFCRUwzMgk2NQkvKiAzMiBiaXRzIGZ1bmN0aW9uIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QTEFCRUwyMUwJNjYJLyogTGVmdCAyMSBiaXRzIG9mIGZkZXNjIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QTEFCRUwxNFIJNzAJLyogUmlnaHQgMTQgYml0cyBvZiBmZGVzYyBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUENSRUw2NAk3MgkvKiA2NCBiaXRzIFBDLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BDUkVMMjJGCTc0CS8qIDIyIGJpdHMgUEMtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUENSRUwxNFdSCTc1CS8qIFBDLXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BDUkVMMTREUgk3NgkvKiBQQyByZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDE2Rgk3NwkvKiAxNiBiaXRzIFBDLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BDUkVMMTZXRgk3OAkvKiAxNiBiaXRzIFBDLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BDUkVMMTZERgk3OQkvKiAxNiBiaXRzIFBDLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0RJUjY0CQk4MAkvKiA2NCBiaXRzIG9mIGVmZi4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0RJUjE0V1IJODMJLyogMTQgYml0cyBvZiBlZmYuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19ESVIxNERSCTg0CS8qIDE0IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSMTZGCQk4NQkvKiAxNiBiaXRzIG9mIGVmZi4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0RJUjE2V0YJODYJLyogMTYgYml0cyBvZiBlZmYuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19ESVIxNkRGCTg3CS8qIDE2IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfR1BSRUw2NAk4OAkvKiA2NCBiaXRzIG9mIEdQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0dQUkVMMTRXUgk5MQkvKiBHUC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19HUFJFTDE0RFIJOTIJLyogR1AtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfR1BSRUwxNkYJOTMJLyogMTYgYml0cyBHUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19HUFJFTDE2V0YJOTQJLyogMTYgYml0cyBHUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19HUFJFTDE2REYJOTUJLyogMTYgYml0cyBHUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRjY0CTk2CS8qIDY0IGJpdHMgTFQtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkYxNFdSCTk5CS8qIExULXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGMTREUgkxMDAJLyogTFQtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkYxNkYJMTAxCS8qIDE2IGJpdHMgTFQtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkYxNldGCTEwMgkvKiAxNiBiaXRzIExULXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGMTZERgkxMDMJLyogMTYgYml0cyBMVC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19TRUNSRUw2NAkxMDQJLyogNjQgYml0cyBzZWN0aW9uIHJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1NFR1JFTDY0CTExMgkvKiA2NCBiaXRzIHNlZ21lbnQgcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUExUT0ZGMTRXUgkxMTUJLyogUExULXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BMVE9GRjE0RFIJMTE2CS8qIFBMVC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19QTFRPRkYxNkYJMTE3CS8qIDE2IGJpdHMgTFQtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUExUT0ZGMTZXRgkxMTgJLyogMTYgYml0cyBQTFQtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUExUT0ZGMTZERgkxMTkJLyogMTYgYml0cyBQTFQtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfRlBUUjY0CTEyMAkvKiA2NCBiaXRzIExULXJlbC4gZnVuY3Rpb24gcHRyLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfRlBUUjE0V1IJMTIzCS8qIExULXJlbC4gZmN0LiBwdHIuLCByaWdodCAxNCBiaXRzLiAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9GUFRSMTREUgkxMjQJLyogTFQtcmVsLiBmY3QuIHB0ci4sIHJpZ2h0IDE0IGJpdHMuICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNkYJMTI1CS8qIDE2IGJpdHMgTFQtcmVsLiBmdW5jdGlvbiBwdHIuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZXRgkxMjYJLyogMTYgYml0cyBMVC1yZWwuIGZ1bmN0aW9uIHB0ci4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNkRGCTEyNwkvKiAxNiBiaXRzIExULXJlbC4gZnVuY3Rpb24gcHRyLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTE9SRVNFUlZFCTEyOAorI2RlZmluZSBSX1BBUklTQ19DT1BZCQkxMjgJLyogQ29weSByZWxvY2F0aW9uLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfSVBMVAkJMTI5CS8qIER5bmFtaWMgcmVsb2MsIGltcG9ydGVkIFBMVCAqLworI2RlZmluZSBSX1BBUklTQ19FUExUCQkxMzAJLyogRHluYW1pYyByZWxvYywgZXhwb3J0ZWQgUExUICovCisjZGVmaW5lIFJfUEFSSVNDX1RQUkVMMzIJMTUzCS8qIDMyIGJpdHMgVFAtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVFBSRUwyMUwJMTU0CS8qIFRQLXJlbC4gYWRkcmVzcywgbGVmdCAyMSBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVFBSRUwxNFIJMTU4CS8qIFRQLXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMjFMCTE2MgkvKiBMVC1UUC1yZWwuIGFkZHJlc3MsIGxlZnQgMjEgYml0cy4gKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfVFAxNFIJMTY2CS8qIExULVRQLXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4qLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9UUDE0RgkxNjcJLyogMTQgYml0cyBMVC1UUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19UUFJFTDY0CTIxNgkvKiA2NCBiaXRzIFRQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RQUkVMMTRXUgkyMTkJLyogVFAtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVFBSRUwxNERSCTIyMAkvKiBUUC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19UUFJFTDE2RgkyMjEJLyogMTYgYml0cyBUUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19UUFJFTDE2V0YJMjIyCS8qIDE2IGJpdHMgVFAtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVFBSRUwxNkRGCTIyMwkvKiAxNiBiaXRzIFRQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQNjQJMjI0CS8qIDY0IGJpdHMgTFQtVFAtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfVFAxNFdSCTIyNwkvKiBMVC1UUC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfVFAxNERSCTIyOAkvKiBMVC1UUC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfVFAxNkYJMjI5CS8qIDE2IGJpdHMgTFQtVFAtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfVFAxNldGCTIzMAkvKiAxNiBiaXRzIExULVRQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTZERgkyMzEJLyogMTYgYml0cyBMVC1UUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19HTlVfVlRFTlRSWQkyMzIKKyNkZWZpbmUgUl9QQVJJU0NfR05VX1ZUSU5IRVJJVAkyMzMKKyNkZWZpbmUgUl9QQVJJU0NfVExTX0dEMjFMCTIzNAkvKiBHRCAyMS1iaXQgbGVmdC4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RMU19HRDE0UgkyMzUJLyogR0QgMTQtYml0IHJpZ2h0LiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVExTX0dEQ0FMTAkyMzYJLyogR0QgY2FsbCB0byBfX3RfZ19hLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVExTX0xETTIxTAkyMzcJLyogTEQgbW9kdWxlIDIxLWJpdCBsZWZ0LiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVExTX0xETTE0UgkyMzgJLyogTEQgbW9kdWxlIDE0LWJpdCByaWdodC4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RMU19MRE1DQUxMCTIzOQkvKiBMRCBtb2R1bGUgY2FsbCB0byBfX3RfZ19hLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVExTX0xETzIxTAkyNDAJLyogTEQgb2Zmc2V0IDIxLWJpdCBsZWZ0LiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVExTX0xETzE0UgkyNDEJLyogTEQgb2Zmc2V0IDE0LWJpdCByaWdodC4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RMU19EVFBNT0QzMgkyNDIJLyogRFRQIG1vZHVsZSAzMi1iaXQuICAqLworI2RlZmluZSBSX1BBUklTQ19UTFNfRFRQTU9ENjQJMjQzCS8qIERUUCBtb2R1bGUgNjQtYml0LiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVExTX0RUUE9GRjMyCTI0NAkvKiBEVFAgb2Zmc2V0IDMyLWJpdC4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RMU19EVFBPRkY2NAkyNDUJLyogRFRQIG9mZnNldCAzMi1iaXQuICAqLworI2RlZmluZSBSX1BBUklTQ19UTFNfTEUyMUwJUl9QQVJJU0NfVFBSRUwyMUwKKyNkZWZpbmUgUl9QQVJJU0NfVExTX0xFMTRSCVJfUEFSSVNDX1RQUkVMMTRSCisjZGVmaW5lIFJfUEFSSVNDX1RMU19JRTIxTAlSX1BBUklTQ19MVE9GRl9UUDIxTAorI2RlZmluZSBSX1BBUklTQ19UTFNfSUUxNFIJUl9QQVJJU0NfTFRPRkZfVFAxNFIKKyNkZWZpbmUgUl9QQVJJU0NfVExTX1RQUkVMMzIJUl9QQVJJU0NfVFBSRUwzMgorI2RlZmluZSBSX1BBUklTQ19UTFNfVFBSRUw2NAlSX1BBUklTQ19UUFJFTDY0CisjZGVmaW5lIFJfUEFSSVNDX0hJUkVTRVJWRQkyNTUKKworLyogTGVnYWwgdmFsdWVzIGZvciBwX3R5cGUgZmllbGQgb2YgRWxmMzJfUGhkci9FbGY2NF9QaGRyLiAgKi8KKworI2RlZmluZSBQVF9IUF9UTFMJCShQVF9MT09TICsgMHgwKQorI2RlZmluZSBQVF9IUF9DT1JFX05PTkUJCShQVF9MT09TICsgMHgxKQorI2RlZmluZSBQVF9IUF9DT1JFX1ZFUlNJT04JKFBUX0xPT1MgKyAweDIpCisjZGVmaW5lIFBUX0hQX0NPUkVfS0VSTkVMCShQVF9MT09TICsgMHgzKQorI2RlZmluZSBQVF9IUF9DT1JFX0NPTU0JCShQVF9MT09TICsgMHg0KQorI2RlZmluZSBQVF9IUF9DT1JFX1BST0MJCShQVF9MT09TICsgMHg1KQorI2RlZmluZSBQVF9IUF9DT1JFX0xPQURBQkxFCShQVF9MT09TICsgMHg2KQorI2RlZmluZSBQVF9IUF9DT1JFX1NUQUNLCShQVF9MT09TICsgMHg3KQorI2RlZmluZSBQVF9IUF9DT1JFX1NITQkJKFBUX0xPT1MgKyAweDgpCisjZGVmaW5lIFBUX0hQX0NPUkVfTU1GCQkoUFRfTE9PUyArIDB4OSkKKyNkZWZpbmUgUFRfSFBfUEFSQUxMRUwJCShQVF9MT09TICsgMHgxMCkKKyNkZWZpbmUgUFRfSFBfRkFTVEJJTkQJCShQVF9MT09TICsgMHgxMSkKKyNkZWZpbmUgUFRfSFBfT1BUX0FOTk9UCQkoUFRfTE9PUyArIDB4MTIpCisjZGVmaW5lIFBUX0hQX0hTTF9BTk5PVAkJKFBUX0xPT1MgKyAweDEzKQorI2RlZmluZSBQVF9IUF9TVEFDSwkJKFBUX0xPT1MgKyAweDE0KQorCisjZGVmaW5lIFBUX1BBUklTQ19BUkNIRVhUCTB4NzAwMDAwMDAKKyNkZWZpbmUgUFRfUEFSSVNDX1VOV0lORAkweDcwMDAwMDAxCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgcF9mbGFncyBmaWVsZCBvZiBFbGYzMl9QaGRyL0VsZjY0X1BoZHIuICAqLworCisjZGVmaW5lIFBGX1BBUklTQ19TQlAJCTB4MDgwMDAwMDAKKworI2RlZmluZSBQRl9IUF9QQUdFX1NJWkUJCTB4MDAxMDAwMDAKKyNkZWZpbmUgUEZfSFBfRkFSX1NIQVJFRAkweDAwMjAwMDAwCisjZGVmaW5lIFBGX0hQX05FQVJfU0hBUkVECTB4MDA0MDAwMDAKKyNkZWZpbmUgUEZfSFBfQ09ERQkJMHgwMTAwMDAwMAorI2RlZmluZSBQRl9IUF9NT0RJRlkJCTB4MDIwMDAwMDAKKyNkZWZpbmUgUEZfSFBfTEFaWVNXQVAJCTB4MDQwMDAwMDAKKyNkZWZpbmUgUEZfSFBfU0JQCQkweDA4MDAwMDAwCisKKworLyogQWxwaGEgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIGVfZmxhZ3MgZmllbGQgb2YgRWxmNjRfRWhkci4gICovCisKKyNkZWZpbmUgRUZfQUxQSEFfMzJCSVQJCTEJLyogQWxsIGFkZHJlc3NlcyBtdXN0IGJlIDwgMkdCLiAgKi8KKyNkZWZpbmUgRUZfQUxQSEFfQ0FOUkVMQVgJMgkvKiBSZWxvY2F0aW9ucyBmb3IgcmVsYXhpbmcgZXhpc3QuICAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHNoX3R5cGUgZmllbGQgb2YgRWxmNjRfU2hkci4gICovCisKKy8qIFRoZXNlIHR3byBhcmUgcHJpbWVyaWx5IGNvbmNlcm5lZCB3aXRoIEVDT0ZGIGRlYnVnZ2luZyBpbmZvLiAgKi8KKyNkZWZpbmUgU0hUX0FMUEhBX0RFQlVHCQkweDcwMDAwMDAxCisjZGVmaW5lIFNIVF9BTFBIQV9SRUdJTkZPCTB4NzAwMDAwMDIKKworLyogTGVnYWwgdmFsdWVzIGZvciBzaF9mbGFncyBmaWVsZCBvZiBFbGY2NF9TaGRyLiAgKi8KKworI2RlZmluZSBTSEZfQUxQSEFfR1BSRUwJCTB4MTAwMDAwMDAKKworLyogTGVnYWwgdmFsdWVzIGZvciBzdF9vdGhlciBmaWVsZCBvZiBFbGY2NF9TeW0uICAqLworI2RlZmluZSBTVE9fQUxQSEFfTk9QVgkJMHg4MAkvKiBObyBQViByZXF1aXJlZC4gICovCisjZGVmaW5lIFNUT19BTFBIQV9TVERfR1BMT0FECTB4ODgJLyogUFYgb25seSB1c2VkIGZvciBpbml0aWFsIGxkZ3AuICAqLworCisvKiBBbHBoYSByZWxvY3MuICAqLworCisjZGVmaW5lIFJfQUxQSEFfTk9ORQkJMAkvKiBObyByZWxvYyAqLworI2RlZmluZSBSX0FMUEhBX1JFRkxPTkcJCTEJLyogRGlyZWN0IDMyIGJpdCAqLworI2RlZmluZSBSX0FMUEhBX1JFRlFVQUQJCTIJLyogRGlyZWN0IDY0IGJpdCAqLworI2RlZmluZSBSX0FMUEhBX0dQUkVMMzIJCTMJLyogR1AgcmVsYXRpdmUgMzIgYml0ICovCisjZGVmaW5lIFJfQUxQSEFfTElURVJBTAkJNAkvKiBHUCByZWxhdGl2ZSAxNiBiaXQgdy9vcHRpbWl6YXRpb24gKi8KKyNkZWZpbmUgUl9BTFBIQV9MSVRVU0UJCTUJLyogT3B0aW1pemF0aW9uIGhpbnQgZm9yIExJVEVSQUwgKi8KKyNkZWZpbmUgUl9BTFBIQV9HUERJU1AJCTYJLyogQWRkIGRpc3BsYWNlbWVudCB0byBHUCAqLworI2RlZmluZSBSX0FMUEhBX0JSQUREUgkJNwkvKiBQQys0IHJlbGF0aXZlIDIzIGJpdCBzaGlmdGVkICovCisjZGVmaW5lIFJfQUxQSEFfSElOVAkJOAkvKiBQQys0IHJlbGF0aXZlIDE2IGJpdCBzaGlmdGVkICovCisjZGVmaW5lIFJfQUxQSEFfU1JFTDE2CQk5CS8qIFBDIHJlbGF0aXZlIDE2IGJpdCAqLworI2RlZmluZSBSX0FMUEhBX1NSRUwzMgkJMTAJLyogUEMgcmVsYXRpdmUgMzIgYml0ICovCisjZGVmaW5lIFJfQUxQSEFfU1JFTDY0CQkxMQkvKiBQQyByZWxhdGl2ZSA2NCBiaXQgKi8KKyNkZWZpbmUgUl9BTFBIQV9HUFJFTEhJR0gJMTcJLyogR1AgcmVsYXRpdmUgMzIgYml0LCBoaWdoIDE2IGJpdHMgKi8KKyNkZWZpbmUgUl9BTFBIQV9HUFJFTExPVwkxOAkvKiBHUCByZWxhdGl2ZSAzMiBiaXQsIGxvdyAxNiBiaXRzICovCisjZGVmaW5lIFJfQUxQSEFfR1BSRUwxNgkJMTkJLyogR1AgcmVsYXRpdmUgMTYgYml0ICovCisjZGVmaW5lIFJfQUxQSEFfQ09QWQkJMjQJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLworI2RlZmluZSBSX0FMUEhBX0dMT0JfREFUCTI1CS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9BTFBIQV9KTVBfU0xPVAkyNgkvKiBDcmVhdGUgUExUIGVudHJ5ICovCisjZGVmaW5lIFJfQUxQSEFfUkVMQVRJVkUJMjcJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLworI2RlZmluZSBSX0FMUEhBX1RMU19HRF9ISQkyOAorI2RlZmluZSBSX0FMUEhBX1RMU0dECQkyOQorI2RlZmluZSBSX0FMUEhBX1RMU19MRE0JCTMwCisjZGVmaW5lIFJfQUxQSEFfRFRQTU9ENjQJMzEKKyNkZWZpbmUgUl9BTFBIQV9HT1REVFBSRUwJMzIKKyNkZWZpbmUgUl9BTFBIQV9EVFBSRUw2NAkzMworI2RlZmluZSBSX0FMUEhBX0RUUFJFTEhJCTM0CisjZGVmaW5lIFJfQUxQSEFfRFRQUkVMTE8JMzUKKyNkZWZpbmUgUl9BTFBIQV9EVFBSRUwxNgkzNgorI2RlZmluZSBSX0FMUEhBX0dPVFRQUkVMCTM3CisjZGVmaW5lIFJfQUxQSEFfVFBSRUw2NAkJMzgKKyNkZWZpbmUgUl9BTFBIQV9UUFJFTEhJCQkzOQorI2RlZmluZSBSX0FMUEhBX1RQUkVMTE8JCTQwCisjZGVmaW5lIFJfQUxQSEFfVFBSRUwxNgkJNDEKKy8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCisjZGVmaW5lIFJfQUxQSEFfTlVNCQk0NgorCisvKiBNYWdpYyB2YWx1ZXMgb2YgdGhlIExJVFVTRSByZWxvY2F0aW9uIGFkZGVuZC4gICovCisjZGVmaW5lIExJVFVTRV9BTFBIQV9BRERSCTAKKyNkZWZpbmUgTElUVVNFX0FMUEhBX0JBU0UJMQorI2RlZmluZSBMSVRVU0VfQUxQSEFfQllUT0ZGCTIKKyNkZWZpbmUgTElUVVNFX0FMUEhBX0pTUgkzCisjZGVmaW5lIExJVFVTRV9BTFBIQV9UTFNfR0QJNAorI2RlZmluZSBMSVRVU0VfQUxQSEFfVExTX0xETQk1CisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgZF90YWcgb2YgRWxmNjRfRHluLiAgKi8KKyNkZWZpbmUgRFRfQUxQSEFfUExUUk8JCShEVF9MT1BST0MgKyAwKQorI2RlZmluZSBEVF9BTFBIQV9OVU0JCTEKKworLyogUG93ZXJQQyBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgKi8KKworLyogVmFsdWVzIGZvciBFbGYzMi82NF9FaGRyLmVfZmxhZ3MuICAqLworI2RlZmluZSBFRl9QUENfRU1CCQkweDgwMDAwMDAwCS8qIFBvd2VyUEMgZW1iZWRkZWQgZmxhZyAqLworCisvKiBDeWdudXMgbG9jYWwgYml0cyBiZWxvdyAqLworI2RlZmluZSBFRl9QUENfUkVMT0NBVEFCTEUJMHgwMDAxMDAwMAkvKiBQb3dlclBDIC1tcmVsb2NhdGFibGUgZmxhZyovCisjZGVmaW5lIEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIJMHgwMDAwODAwMAkvKiBQb3dlclBDIC1tcmVsb2NhdGFibGUtbGliCisJCQkJCQkgICBmbGFnICovCisKKy8qIFBvd2VyUEMgcmVsb2NhdGlvbnMgZGVmaW5lZCBieSB0aGUgQUJJcyAqLworI2RlZmluZSBSX1BQQ19OT05FCQkwCisjZGVmaW5lIFJfUFBDX0FERFIzMgkJMQkvKiAzMmJpdCBhYnNvbHV0ZSBhZGRyZXNzICovCisjZGVmaW5lIFJfUFBDX0FERFIyNAkJMgkvKiAyNmJpdCBhZGRyZXNzLCAyIGJpdHMgaWdub3JlZC4gICovCisjZGVmaW5lIFJfUFBDX0FERFIxNgkJMwkvKiAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzICovCisjZGVmaW5lIFJfUFBDX0FERFIxNl9MTwkJNAkvKiBsb3dlciAxNmJpdCBvZiBhYnNvbHV0ZSBhZGRyZXNzICovCisjZGVmaW5lIFJfUFBDX0FERFIxNl9ISQkJNQkvKiBoaWdoIDE2Yml0IG9mIGFic29sdXRlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl9QUENfQUREUjE2X0hBCQk2CS8qIGFkanVzdGVkIGhpZ2ggMTZiaXQgKi8KKyNkZWZpbmUgUl9QUENfQUREUjE0CQk3CS8qIDE2Yml0IGFkZHJlc3MsIDIgYml0cyBpZ25vcmVkICovCisjZGVmaW5lIFJfUFBDX0FERFIxNF9CUlRBS0VOCTgKKyNkZWZpbmUgUl9QUENfQUREUjE0X0JSTlRBS0VOCTkKKyNkZWZpbmUgUl9QUENfUkVMMjQJCTEwCS8qIFBDIHJlbGF0aXZlIDI2IGJpdCAqLworI2RlZmluZSBSX1BQQ19SRUwxNAkJMTEJLyogUEMgcmVsYXRpdmUgMTYgYml0ICovCisjZGVmaW5lIFJfUFBDX1JFTDE0X0JSVEFLRU4JMTIKKyNkZWZpbmUgUl9QUENfUkVMMTRfQlJOVEFLRU4JMTMKKyNkZWZpbmUgUl9QUENfR09UMTYJCTE0CisjZGVmaW5lIFJfUFBDX0dPVDE2X0xPCQkxNQorI2RlZmluZSBSX1BQQ19HT1QxNl9ISQkJMTYKKyNkZWZpbmUgUl9QUENfR09UMTZfSEEJCTE3CisjZGVmaW5lIFJfUFBDX1BMVFJFTDI0CQkxOAorI2RlZmluZSBSX1BQQ19DT1BZCQkxOQorI2RlZmluZSBSX1BQQ19HTE9CX0RBVAkJMjAKKyNkZWZpbmUgUl9QUENfSk1QX1NMT1QJCTIxCisjZGVmaW5lIFJfUFBDX1JFTEFUSVZFCQkyMgorI2RlZmluZSBSX1BQQ19MT0NBTDI0UEMJCTIzCisjZGVmaW5lIFJfUFBDX1VBRERSMzIJCTI0CisjZGVmaW5lIFJfUFBDX1VBRERSMTYJCTI1CisjZGVmaW5lIFJfUFBDX1JFTDMyCQkyNgorI2RlZmluZSBSX1BQQ19QTFQzMgkJMjcKKyNkZWZpbmUgUl9QUENfUExUUkVMMzIJCTI4CisjZGVmaW5lIFJfUFBDX1BMVDE2X0xPCQkyOQorI2RlZmluZSBSX1BQQ19QTFQxNl9ISQkJMzAKKyNkZWZpbmUgUl9QUENfUExUMTZfSEEJCTMxCisjZGVmaW5lIFJfUFBDX1NEQVJFTDE2CQkzMgorI2RlZmluZSBSX1BQQ19TRUNUT0ZGCQkzMworI2RlZmluZSBSX1BQQ19TRUNUT0ZGX0xPCTM0CisjZGVmaW5lIFJfUFBDX1NFQ1RPRkZfSEkJMzUKKyNkZWZpbmUgUl9QUENfU0VDVE9GRl9IQQkzNgorCisvKiBQb3dlclBDIHJlbG9jYXRpb25zIGRlZmluZWQgZm9yIHRoZSBUTFMgYWNjZXNzIEFCSS4gICovCisjZGVmaW5lIFJfUFBDX1RMUwkJNjcgLyogbm9uZQkoc3ltK2FkZClAdGxzICovCisjZGVmaW5lIFJfUFBDX0RUUE1PRDMyCQk2OCAvKiB3b3JkMzIJKHN5bSthZGQpQGR0cG1vZCAqLworI2RlZmluZSBSX1BQQ19UUFJFTDE2CQk2OSAvKiBoYWxmMTYqCShzeW0rYWRkKUB0cHJlbCAqLworI2RlZmluZSBSX1BQQ19UUFJFTDE2X0xPCTcwIC8qIGhhbGYxNgkoc3ltK2FkZClAdHByZWxAbCAqLworI2RlZmluZSBSX1BQQ19UUFJFTDE2X0hJCTcxIC8qIGhhbGYxNgkoc3ltK2FkZClAdHByZWxAaCAqLworI2RlZmluZSBSX1BQQ19UUFJFTDE2X0hBCTcyIC8qIGhhbGYxNgkoc3ltK2FkZClAdHByZWxAaGEgKi8KKyNkZWZpbmUgUl9QUENfVFBSRUwzMgkJNzMgLyogd29yZDMyCShzeW0rYWRkKUB0cHJlbCAqLworI2RlZmluZSBSX1BQQ19EVFBSRUwxNgkJNzQgLyogaGFsZjE2Kgkoc3ltK2FkZClAZHRwcmVsICovCisjZGVmaW5lIFJfUFBDX0RUUFJFTDE2X0xPCTc1IC8qIGhhbGYxNgkoc3ltK2FkZClAZHRwcmVsQGwgKi8KKyNkZWZpbmUgUl9QUENfRFRQUkVMMTZfSEkJNzYgLyogaGFsZjE2CShzeW0rYWRkKUBkdHByZWxAaCAqLworI2RlZmluZSBSX1BQQ19EVFBSRUwxNl9IQQk3NyAvKiBoYWxmMTYJKHN5bSthZGQpQGR0cHJlbEBoYSAqLworI2RlZmluZSBSX1BQQ19EVFBSRUwzMgkJNzggLyogd29yZDMyCShzeW0rYWRkKUBkdHByZWwgKi8KKyNkZWZpbmUgUl9QUENfR09UX1RMU0dEMTYJNzkgLyogaGFsZjE2Kgkoc3ltK2FkZClAZ290QHRsc2dkICovCisjZGVmaW5lIFJfUFBDX0dPVF9UTFNHRDE2X0xPCTgwIC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRsc2dkQGwgKi8KKyNkZWZpbmUgUl9QUENfR09UX1RMU0dEMTZfSEkJODEgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdGxzZ2RAaCAqLworI2RlZmluZSBSX1BQQ19HT1RfVExTR0QxNl9IQQk4MiAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0bHNnZEBoYSAqLworI2RlZmluZSBSX1BQQ19HT1RfVExTTEQxNgk4MyAvKiBoYWxmMTYqCShzeW0rYWRkKUBnb3RAdGxzbGQgKi8KKyNkZWZpbmUgUl9QUENfR09UX1RMU0xEMTZfTE8JODQgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdGxzbGRAbCAqLworI2RlZmluZSBSX1BQQ19HT1RfVExTTEQxNl9ISQk4NSAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0bHNsZEBoICovCisjZGVmaW5lIFJfUFBDX0dPVF9UTFNMRDE2X0hBCTg2IC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRsc2xkQGhhICovCisjZGVmaW5lIFJfUFBDX0dPVF9UUFJFTDE2CTg3IC8qIGhhbGYxNioJKHN5bSthZGQpQGdvdEB0cHJlbCAqLworI2RlZmluZSBSX1BQQ19HT1RfVFBSRUwxNl9MTwk4OCAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0cHJlbEBsICovCisjZGVmaW5lIFJfUFBDX0dPVF9UUFJFTDE2X0hJCTg5IC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRwcmVsQGggKi8KKyNkZWZpbmUgUl9QUENfR09UX1RQUkVMMTZfSEEJOTAgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdHByZWxAaGEgKi8KKyNkZWZpbmUgUl9QUENfR09UX0RUUFJFTDE2CTkxIC8qIGhhbGYxNioJKHN5bSthZGQpQGdvdEBkdHByZWwgKi8KKyNkZWZpbmUgUl9QUENfR09UX0RUUFJFTDE2X0xPCTkyIC8qIGhhbGYxNioJKHN5bSthZGQpQGdvdEBkdHByZWxAbCAqLworI2RlZmluZSBSX1BQQ19HT1RfRFRQUkVMMTZfSEkJOTMgLyogaGFsZjE2Kgkoc3ltK2FkZClAZ290QGR0cHJlbEBoICovCisjZGVmaW5lIFJfUFBDX0dPVF9EVFBSRUwxNl9IQQk5NCAvKiBoYWxmMTYqCShzeW0rYWRkKUBnb3RAZHRwcmVsQGhhICovCisKKy8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBmcm9tIHRoZSBFbWJlZGRlZCBFTEYgQUJJLCBhbmQgYXJlIG5vdAorICAgaW4gdGhlIFNWUjQgRUxGIEFCSS4gICovCisjZGVmaW5lIFJfUFBDX0VNQl9OQUREUjMyCTEwMQorI2RlZmluZSBSX1BQQ19FTUJfTkFERFIxNgkxMDIKKyNkZWZpbmUgUl9QUENfRU1CX05BRERSMTZfTE8JMTAzCisjZGVmaW5lIFJfUFBDX0VNQl9OQUREUjE2X0hJCTEwNAorI2RlZmluZSBSX1BQQ19FTUJfTkFERFIxNl9IQQkxMDUKKyNkZWZpbmUgUl9QUENfRU1CX1NEQUkxNgkxMDYKKyNkZWZpbmUgUl9QUENfRU1CX1NEQTJJMTYJMTA3CisjZGVmaW5lIFJfUFBDX0VNQl9TREEyUkVMCTEwOAorI2RlZmluZSBSX1BQQ19FTUJfU0RBMjEJCTEwOQkvKiAxNiBiaXQgb2Zmc2V0IGluIFNEQSAqLworI2RlZmluZSBSX1BQQ19FTUJfTVJLUkVGCTExMAorI2RlZmluZSBSX1BQQ19FTUJfUkVMU0VDMTYJMTExCisjZGVmaW5lIFJfUFBDX0VNQl9SRUxTVF9MTwkxMTIKKyNkZWZpbmUgUl9QUENfRU1CX1JFTFNUX0hJCTExMworI2RlZmluZSBSX1BQQ19FTUJfUkVMU1RfSEEJMTE0CisjZGVmaW5lIFJfUFBDX0VNQl9CSVRfRkxECTExNQorI2RlZmluZSBSX1BQQ19FTUJfUkVMU0RBCTExNgkvKiAxNiBiaXQgcmVsYXRpdmUgb2Zmc2V0IGluIFNEQSAqLworCisvKiBEaWFiIHRvb2wgcmVsb2NhdGlvbnMuICAqLworI2RlZmluZSBSX1BQQ19ESUFCX1NEQTIxX0xPCTE4MAkvKiBsaWtlIEVNQl9TREEyMSwgYnV0IGxvd2VyIDE2IGJpdCAqLworI2RlZmluZSBSX1BQQ19ESUFCX1NEQTIxX0hJCTE4MQkvKiBsaWtlIEVNQl9TREEyMSwgYnV0IGhpZ2ggMTYgYml0ICovCisjZGVmaW5lIFJfUFBDX0RJQUJfU0RBMjFfSEEJMTgyCS8qIGxpa2UgRU1CX1NEQTIxLCBhZGp1c3RlZCBoaWdoIDE2ICovCisjZGVmaW5lIFJfUFBDX0RJQUJfUkVMU0RBX0xPCTE4MwkvKiBsaWtlIEVNQl9SRUxTREEsIGJ1dCBsb3dlciAxNiBiaXQgKi8KKyNkZWZpbmUgUl9QUENfRElBQl9SRUxTREFfSEkJMTg0CS8qIGxpa2UgRU1CX1JFTFNEQSwgYnV0IGhpZ2ggMTYgYml0ICovCisjZGVmaW5lIFJfUFBDX0RJQUJfUkVMU0RBX0hBCTE4NQkvKiBsaWtlIEVNQl9SRUxTREEsIGFkanVzdGVkIGhpZ2ggMTYgKi8KKworLyogR05VIGV4dGVuc2lvbiB0byBzdXBwb3J0IGxvY2FsIGlmdW5jLiAgKi8KKyNkZWZpbmUgUl9QUENfSVJFTEFUSVZFCQkyNDgKKworLyogR05VIHJlbG9jcyB1c2VkIGluIFBJQyBjb2RlIHNlcXVlbmNlcy4gICovCisjZGVmaW5lIFJfUFBDX1JFTDE2CQkyNDkJLyogaGFsZjE2ICAgKHN5bSthZGQtLikgKi8KKyNkZWZpbmUgUl9QUENfUkVMMTZfTE8JCTI1MAkvKiBoYWxmMTYgICAoc3ltK2FkZC0uKUBsICovCisjZGVmaW5lIFJfUFBDX1JFTDE2X0hJCQkyNTEJLyogaGFsZjE2ICAgKHN5bSthZGQtLilAaCAqLworI2RlZmluZSBSX1BQQ19SRUwxNl9IQQkJMjUyCS8qIGhhbGYxNiAgIChzeW0rYWRkLS4pQGhhICovCisKKy8qIFRoaXMgaXMgYSBwaG9ueSByZWxvYyB0byBoYW5kbGUgYW55IG9sZCBmYXNoaW9uZWQgVE9DMTYgcmVmZXJlbmNlcworICAgdGhhdCBtYXkgc3RpbGwgYmUgaW4gb2JqZWN0IGZpbGVzLiAgKi8KKyNkZWZpbmUgUl9QUENfVE9DMTYJCTI1NQorCisvKiBQb3dlclBDIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlIER5biBkX3RhZyBmaWVsZC4gICovCisjZGVmaW5lIERUX1BQQ19HT1QJCShEVF9MT1BST0MgKyAwKQorI2RlZmluZSBEVF9QUENfTlVNCQkxCisKKy8qIFBvd2VyUEM2NCByZWxvY2F0aW9ucyBkZWZpbmVkIGJ5IHRoZSBBQklzICovCisjZGVmaW5lIFJfUFBDNjRfTk9ORQkJUl9QUENfTk9ORQorI2RlZmluZSBSX1BQQzY0X0FERFIzMgkJUl9QUENfQUREUjMyIC8qIDMyYml0IGFic29sdXRlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl9QUEM2NF9BRERSMjQJCVJfUFBDX0FERFIyNCAvKiAyNmJpdCBhZGRyZXNzLCB3b3JkIGFsaWduZWQgKi8KKyNkZWZpbmUgUl9QUEM2NF9BRERSMTYJCVJfUFBDX0FERFIxNiAvKiAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzICovCisjZGVmaW5lIFJfUFBDNjRfQUREUjE2X0xPCVJfUFBDX0FERFIxNl9MTwkvKiBsb3dlciAxNmJpdHMgb2YgYWRkcmVzcyAqLworI2RlZmluZSBSX1BQQzY0X0FERFIxNl9ISQlSX1BQQ19BRERSMTZfSEkJLyogaGlnaCAxNmJpdHMgb2YgYWRkcmVzcy4gKi8KKyNkZWZpbmUgUl9QUEM2NF9BRERSMTZfSEEJUl9QUENfQUREUjE2X0hBIC8qIGFkanVzdGVkIGhpZ2ggMTZiaXRzLiAgKi8KKyNkZWZpbmUgUl9QUEM2NF9BRERSMTQJCVJfUFBDX0FERFIxNCAvKiAxNmJpdCBhZGRyZXNzLCB3b3JkIGFsaWduZWQgKi8KKyNkZWZpbmUgUl9QUEM2NF9BRERSMTRfQlJUQUtFTglSX1BQQ19BRERSMTRfQlJUQUtFTgorI2RlZmluZSBSX1BQQzY0X0FERFIxNF9CUk5UQUtFTglSX1BQQ19BRERSMTRfQlJOVEFLRU4KKyNkZWZpbmUgUl9QUEM2NF9SRUwyNAkJUl9QUENfUkVMMjQgLyogUEMtcmVsLiAyNiBiaXQsIHdvcmQgYWxpZ25lZCAqLworI2RlZmluZSBSX1BQQzY0X1JFTDE0CQlSX1BQQ19SRUwxNCAvKiBQQyByZWxhdGl2ZSAxNiBiaXQgKi8KKyNkZWZpbmUgUl9QUEM2NF9SRUwxNF9CUlRBS0VOCVJfUFBDX1JFTDE0X0JSVEFLRU4KKyNkZWZpbmUgUl9QUEM2NF9SRUwxNF9CUk5UQUtFTglSX1BQQ19SRUwxNF9CUk5UQUtFTgorI2RlZmluZSBSX1BQQzY0X0dPVDE2CQlSX1BQQ19HT1QxNgorI2RlZmluZSBSX1BQQzY0X0dPVDE2X0xPCVJfUFBDX0dPVDE2X0xPCisjZGVmaW5lIFJfUFBDNjRfR09UMTZfSEkJUl9QUENfR09UMTZfSEkKKyNkZWZpbmUgUl9QUEM2NF9HT1QxNl9IQQlSX1BQQ19HT1QxNl9IQQorCisjZGVmaW5lIFJfUFBDNjRfQ09QWQkJUl9QUENfQ09QWQorI2RlZmluZSBSX1BQQzY0X0dMT0JfREFUCVJfUFBDX0dMT0JfREFUCisjZGVmaW5lIFJfUFBDNjRfSk1QX1NMT1QJUl9QUENfSk1QX1NMT1QKKyNkZWZpbmUgUl9QUEM2NF9SRUxBVElWRQlSX1BQQ19SRUxBVElWRQorCisjZGVmaW5lIFJfUFBDNjRfVUFERFIzMgkJUl9QUENfVUFERFIzMgorI2RlZmluZSBSX1BQQzY0X1VBRERSMTYJCVJfUFBDX1VBRERSMTYKKyNkZWZpbmUgUl9QUEM2NF9SRUwzMgkJUl9QUENfUkVMMzIKKyNkZWZpbmUgUl9QUEM2NF9QTFQzMgkJUl9QUENfUExUMzIKKyNkZWZpbmUgUl9QUEM2NF9QTFRSRUwzMglSX1BQQ19QTFRSRUwzMgorI2RlZmluZSBSX1BQQzY0X1BMVDE2X0xPCVJfUFBDX1BMVDE2X0xPCisjZGVmaW5lIFJfUFBDNjRfUExUMTZfSEkJUl9QUENfUExUMTZfSEkKKyNkZWZpbmUgUl9QUEM2NF9QTFQxNl9IQQlSX1BQQ19QTFQxNl9IQQorCisjZGVmaW5lIFJfUFBDNjRfU0VDVE9GRgkJUl9QUENfU0VDVE9GRgorI2RlZmluZSBSX1BQQzY0X1NFQ1RPRkZfTE8JUl9QUENfU0VDVE9GRl9MTworI2RlZmluZSBSX1BQQzY0X1NFQ1RPRkZfSEkJUl9QUENfU0VDVE9GRl9ISQorI2RlZmluZSBSX1BQQzY0X1NFQ1RPRkZfSEEJUl9QUENfU0VDVE9GRl9IQQorI2RlZmluZSBSX1BQQzY0X0FERFIzMAkJMzcgLyogd29yZDMwIChTICsgQSAtIFApID4+IDIgKi8KKyNkZWZpbmUgUl9QUEM2NF9BRERSNjQJCTM4IC8qIGRvdWJsZXdvcmQ2NCBTICsgQSAqLworI2RlZmluZSBSX1BQQzY0X0FERFIxNl9ISUdIRVIJMzkgLyogaGFsZjE2ICNoaWdoZXIoUyArIEEpICovCisjZGVmaW5lIFJfUFBDNjRfQUREUjE2X0hJR0hFUkEJNDAgLyogaGFsZjE2ICNoaWdoZXJhKFMgKyBBKSAqLworI2RlZmluZSBSX1BQQzY0X0FERFIxNl9ISUdIRVNUCTQxIC8qIGhhbGYxNiAjaGlnaGVzdChTICsgQSkgKi8KKyNkZWZpbmUgUl9QUEM2NF9BRERSMTZfSElHSEVTVEEJNDIgLyogaGFsZjE2ICNoaWdoZXN0YShTICsgQSkgKi8KKyNkZWZpbmUgUl9QUEM2NF9VQUREUjY0CQk0MyAvKiBkb3VibGV3b3JkNjQgUyArIEEgKi8KKyNkZWZpbmUgUl9QUEM2NF9SRUw2NAkJNDQgLyogZG91Ymxld29yZDY0IFMgKyBBIC0gUCAqLworI2RlZmluZSBSX1BQQzY0X1BMVDY0CQk0NSAvKiBkb3VibGV3b3JkNjQgTCArIEEgKi8KKyNkZWZpbmUgUl9QUEM2NF9QTFRSRUw2NAk0NiAvKiBkb3VibGV3b3JkNjQgTCArIEEgLSBQICovCisjZGVmaW5lIFJfUFBDNjRfVE9DMTYJCTQ3IC8qIGhhbGYxNiogUyArIEEgLSAuVE9DICovCisjZGVmaW5lIFJfUFBDNjRfVE9DMTZfTE8JNDggLyogaGFsZjE2ICNsbyhTICsgQSAtIC5UT0MuKSAqLworI2RlZmluZSBSX1BQQzY0X1RPQzE2X0hJCTQ5IC8qIGhhbGYxNiAjaGkoUyArIEEgLSAuVE9DLikgKi8KKyNkZWZpbmUgUl9QUEM2NF9UT0MxNl9IQQk1MCAvKiBoYWxmMTYgI2hhKFMgKyBBIC0gLlRPQy4pICovCisjZGVmaW5lIFJfUFBDNjRfVE9DCQk1MSAvKiBkb3VibGV3b3JkNjQgLlRPQyAqLworI2RlZmluZSBSX1BQQzY0X1BMVEdPVDE2CTUyIC8qIGhhbGYxNiogTSArIEEgKi8KKyNkZWZpbmUgUl9QUEM2NF9QTFRHT1QxNl9MTwk1MyAvKiBoYWxmMTYgI2xvKE0gKyBBKSAqLworI2RlZmluZSBSX1BQQzY0X1BMVEdPVDE2X0hJCTU0IC8qIGhhbGYxNiAjaGkoTSArIEEpICovCisjZGVmaW5lIFJfUFBDNjRfUExUR09UMTZfSEEJNTUgLyogaGFsZjE2ICNoYShNICsgQSkgKi8KKworI2RlZmluZSBSX1BQQzY0X0FERFIxNl9EUwk1NiAvKiBoYWxmMTZkcyogKFMgKyBBKSA+PiAyICovCisjZGVmaW5lIFJfUFBDNjRfQUREUjE2X0xPX0RTCTU3IC8qIGhhbGYxNmRzICAjbG8oUyArIEEpID4+IDIgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1QxNl9EUwk1OCAvKiBoYWxmMTZkcyogKEcgKyBBKSA+PiAyICovCisjZGVmaW5lIFJfUFBDNjRfR09UMTZfTE9fRFMJNTkgLyogaGFsZjE2ZHMgICNsbyhHICsgQSkgPj4gMiAqLworI2RlZmluZSBSX1BQQzY0X1BMVDE2X0xPX0RTCTYwIC8qIGhhbGYxNmRzICAjbG8oTCArIEEpID4+IDIgKi8KKyNkZWZpbmUgUl9QUEM2NF9TRUNUT0ZGX0RTCTYxIC8qIGhhbGYxNmRzKiAoUiArIEEpID4+IDIgKi8KKyNkZWZpbmUgUl9QUEM2NF9TRUNUT0ZGX0xPX0RTCTYyIC8qIGhhbGYxNmRzICAjbG8oUiArIEEpID4+IDIgKi8KKyNkZWZpbmUgUl9QUEM2NF9UT0MxNl9EUwk2MyAvKiBoYWxmMTZkcyogKFMgKyBBIC0gLlRPQy4pID4+IDIgKi8KKyNkZWZpbmUgUl9QUEM2NF9UT0MxNl9MT19EUwk2NCAvKiBoYWxmMTZkcyAgI2xvKFMgKyBBIC0gLlRPQy4pID4+IDIgKi8KKyNkZWZpbmUgUl9QUEM2NF9QTFRHT1QxNl9EUwk2NSAvKiBoYWxmMTZkcyogKE0gKyBBKSA+PiAyICovCisjZGVmaW5lIFJfUFBDNjRfUExUR09UMTZfTE9fRFMJNjYgLyogaGFsZjE2ZHMgICNsbyhNICsgQSkgPj4gMiAqLworCisvKiBQb3dlclBDNjQgcmVsb2NhdGlvbnMgZGVmaW5lZCBmb3IgdGhlIFRMUyBhY2Nlc3MgQUJJLiAgKi8KKyNkZWZpbmUgUl9QUEM2NF9UTFMJCTY3IC8qIG5vbmUJKHN5bSthZGQpQHRscyAqLworI2RlZmluZSBSX1BQQzY0X0RUUE1PRDY0CTY4IC8qIGRvdWJsZXdvcmQ2NCAoc3ltK2FkZClAZHRwbW9kICovCisjZGVmaW5lIFJfUFBDNjRfVFBSRUwxNgkJNjkgLyogaGFsZjE2Kgkoc3ltK2FkZClAdHByZWwgKi8KKyNkZWZpbmUgUl9QUEM2NF9UUFJFTDE2X0xPCTcwIC8qIGhhbGYxNgkoc3ltK2FkZClAdHByZWxAbCAqLworI2RlZmluZSBSX1BQQzY0X1RQUkVMMTZfSEkJNzEgLyogaGFsZjE2CShzeW0rYWRkKUB0cHJlbEBoICovCisjZGVmaW5lIFJfUFBDNjRfVFBSRUwxNl9IQQk3MiAvKiBoYWxmMTYJKHN5bSthZGQpQHRwcmVsQGhhICovCisjZGVmaW5lIFJfUFBDNjRfVFBSRUw2NAkJNzMgLyogZG91Ymxld29yZDY0IChzeW0rYWRkKUB0cHJlbCAqLworI2RlZmluZSBSX1BQQzY0X0RUUFJFTDE2CTc0IC8qIGhhbGYxNioJKHN5bSthZGQpQGR0cHJlbCAqLworI2RlZmluZSBSX1BQQzY0X0RUUFJFTDE2X0xPCTc1IC8qIGhhbGYxNgkoc3ltK2FkZClAZHRwcmVsQGwgKi8KKyNkZWZpbmUgUl9QUEM2NF9EVFBSRUwxNl9ISQk3NiAvKiBoYWxmMTYJKHN5bSthZGQpQGR0cHJlbEBoICovCisjZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTZfSEEJNzcgLyogaGFsZjE2CShzeW0rYWRkKUBkdHByZWxAaGEgKi8KKyNkZWZpbmUgUl9QUEM2NF9EVFBSRUw2NAk3OCAvKiBkb3VibGV3b3JkNjQgKHN5bSthZGQpQGR0cHJlbCAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9UTFNHRDE2CTc5IC8qIGhhbGYxNioJKHN5bSthZGQpQGdvdEB0bHNnZCAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9UTFNHRDE2X0xPCTgwIC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRsc2dkQGwgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfVExTR0QxNl9ISQk4MSAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0bHNnZEBoICovCisjZGVmaW5lIFJfUFBDNjRfR09UX1RMU0dEMTZfSEEJODIgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdGxzZ2RAaGEgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfVExTTEQxNgk4MyAvKiBoYWxmMTYqCShzeW0rYWRkKUBnb3RAdGxzbGQgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfVExTTEQxNl9MTwk4NCAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0bHNsZEBsICovCisjZGVmaW5lIFJfUFBDNjRfR09UX1RMU0xEMTZfSEkJODUgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdGxzbGRAaCAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9UTFNMRDE2X0hBCTg2IC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRsc2xkQGhhICovCisjZGVmaW5lIFJfUFBDNjRfR09UX1RQUkVMMTZfRFMJODcgLyogaGFsZjE2ZHMqCShzeW0rYWRkKUBnb3RAdHByZWwgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfVFBSRUwxNl9MT19EUyA4OCAvKiBoYWxmMTZkcyAoc3ltK2FkZClAZ290QHRwcmVsQGwgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfVFBSRUwxNl9ISQk4OSAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0cHJlbEBoICovCisjZGVmaW5lIFJfUFBDNjRfR09UX1RQUkVMMTZfSEEJOTAgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdHByZWxAaGEgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfRFRQUkVMMTZfRFMJOTEgLyogaGFsZjE2ZHMqCShzeW0rYWRkKUBnb3RAZHRwcmVsICovCisjZGVmaW5lIFJfUFBDNjRfR09UX0RUUFJFTDE2X0xPX0RTIDkyIC8qIGhhbGYxNmRzIChzeW0rYWRkKUBnb3RAZHRwcmVsQGwgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfRFRQUkVMMTZfSEkJOTMgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAZHRwcmVsQGggKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfRFRQUkVMMTZfSEEJOTQgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAZHRwcmVsQGhhICovCisjZGVmaW5lIFJfUFBDNjRfVFBSRUwxNl9EUwk5NSAvKiBoYWxmMTZkcyoJKHN5bSthZGQpQHRwcmVsICovCisjZGVmaW5lIFJfUFBDNjRfVFBSRUwxNl9MT19EUwk5NiAvKiBoYWxmMTZkcwkoc3ltK2FkZClAdHByZWxAbCAqLworI2RlZmluZSBSX1BQQzY0X1RQUkVMMTZfSElHSEVSCTk3IC8qIGhhbGYxNgkoc3ltK2FkZClAdHByZWxAaGlnaGVyICovCisjZGVmaW5lIFJfUFBDNjRfVFBSRUwxNl9ISUdIRVJBCTk4IC8qIGhhbGYxNgkoc3ltK2FkZClAdHByZWxAaGlnaGVyYSAqLworI2RlZmluZSBSX1BQQzY0X1RQUkVMMTZfSElHSEVTVAk5OSAvKiBoYWxmMTYJKHN5bSthZGQpQHRwcmVsQGhpZ2hlc3QgKi8KKyNkZWZpbmUgUl9QUEM2NF9UUFJFTDE2X0hJR0hFU1RBIDEwMCAvKiBoYWxmMTYJKHN5bSthZGQpQHRwcmVsQGhpZ2hlc3RhICovCisjZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTZfRFMJMTAxIC8qIGhhbGYxNmRzKiAoc3ltK2FkZClAZHRwcmVsICovCisjZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTZfTE9fRFMJMTAyIC8qIGhhbGYxNmRzCShzeW0rYWRkKUBkdHByZWxAbCAqLworI2RlZmluZSBSX1BQQzY0X0RUUFJFTDE2X0hJR0hFUgkxMDMgLyogaGFsZjE2CShzeW0rYWRkKUBkdHByZWxAaGlnaGVyICovCisjZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTZfSElHSEVSQSAxMDQgLyogaGFsZjE2CShzeW0rYWRkKUBkdHByZWxAaGlnaGVyYSAqLworI2RlZmluZSBSX1BQQzY0X0RUUFJFTDE2X0hJR0hFU1QgMTA1IC8qIGhhbGYxNgkoc3ltK2FkZClAZHRwcmVsQGhpZ2hlc3QgKi8KKyNkZWZpbmUgUl9QUEM2NF9EVFBSRUwxNl9ISUdIRVNUQSAxMDYgLyogaGFsZjE2CShzeW0rYWRkKUBkdHByZWxAaGlnaGVzdGEgKi8KKworLyogR05VIGV4dGVuc2lvbiB0byBzdXBwb3J0IGxvY2FsIGlmdW5jLiAgKi8KKyNkZWZpbmUgUl9QUEM2NF9KTVBfSVJFTAkyNDcKKyNkZWZpbmUgUl9QUEM2NF9JUkVMQVRJVkUJMjQ4CisjZGVmaW5lIFJfUFBDNjRfUkVMMTYJCTI0OQkvKiBoYWxmMTYgICAoc3ltK2FkZC0uKSAqLworI2RlZmluZSBSX1BQQzY0X1JFTDE2X0xPCTI1MAkvKiBoYWxmMTYgICAoc3ltK2FkZC0uKUBsICovCisjZGVmaW5lIFJfUFBDNjRfUkVMMTZfSEkJMjUxCS8qIGhhbGYxNiAgIChzeW0rYWRkLS4pQGggKi8KKyNkZWZpbmUgUl9QUEM2NF9SRUwxNl9IQQkyNTIJLyogaGFsZjE2ICAgKHN5bSthZGQtLilAaGEgKi8KKworLyogUG93ZXJQQzY0IHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlIER5biBkX3RhZyBmaWVsZC4gICovCisjZGVmaW5lIERUX1BQQzY0X0dMSU5LICAoRFRfTE9QUk9DICsgMCkKKyNkZWZpbmUgRFRfUFBDNjRfT1BECShEVF9MT1BST0MgKyAxKQorI2RlZmluZSBEVF9QUEM2NF9PUERTWgkoRFRfTE9QUk9DICsgMikKKyNkZWZpbmUgRFRfUFBDNjRfTlVNICAgIDMKKworCisvKiBBUk0gc3BlY2lmaWMgZGVjbGFyYXRpb25zICovCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCisjZGVmaW5lIEVGX0FSTV9SRUxFWEVDCQkweDAxCisjZGVmaW5lIEVGX0FSTV9IQVNFTlRSWQkJMHgwMgorI2RlZmluZSBFRl9BUk1fSU5URVJXT1JLCTB4MDQKKyNkZWZpbmUgRUZfQVJNX0FQQ1NfMjYJCTB4MDgKKyNkZWZpbmUgRUZfQVJNX0FQQ1NfRkxPQVQJMHgxMAorI2RlZmluZSBFRl9BUk1fUElDCQkweDIwCisjZGVmaW5lIEVGX0FSTV9BTElHTjgJCTB4NDAgLyogOC1iaXQgc3RydWN0dXJlIGFsaWdubWVudCBpcyBpbiB1c2UgKi8KKyNkZWZpbmUgRUZfQVJNX05FV19BQkkJCTB4ODAKKyNkZWZpbmUgRUZfQVJNX09MRF9BQkkJCTB4MTAwCisjZGVmaW5lIEVGX0FSTV9TT0ZUX0ZMT0FUCTB4MjAwCisjZGVmaW5lIEVGX0FSTV9WRlBfRkxPQVQJMHg0MDAKKyNkZWZpbmUgRUZfQVJNX01BVkVSSUNLX0ZMT0FUCTB4ODAwCisKKworLyogT3RoZXIgY29uc3RhbnRzIGRlZmluZWQgaW4gdGhlIEFSTSBFTEYgc3BlYy4gdmVyc2lvbiBCLTAxLiAgKi8KKy8qIE5CLiBUaGVzZSBjb25mbGljdCB3aXRoIHZhbHVlcyBkZWZpbmVkIGFib3ZlLiAgKi8KKyNkZWZpbmUgRUZfQVJNX1NZTVNBUkVTT1JURUQJMHgwNAorI2RlZmluZSBFRl9BUk1fRFlOU1lNU1VTRVNFR0lEWAkweDA4CisjZGVmaW5lIEVGX0FSTV9NQVBTWU1TRklSU1QJMHgxMAorI2RlZmluZSBFRl9BUk1fRUFCSU1BU0sJCTBYRkYwMDAwMDAKKworLyogQ29uc3RhbnRzIGRlZmluZWQgaW4gQUFFTEYuICAqLworI2RlZmluZSBFRl9BUk1fQkU4CSAgICAweDAwODAwMDAwCisjZGVmaW5lIEVGX0FSTV9MRTgJICAgIDB4MDA0MDAwMDAKKworI2RlZmluZSBFRl9BUk1fRUFCSV9WRVJTSU9OKGZsYWdzKQkoKGZsYWdzKSAmIEVGX0FSTV9FQUJJTUFTSykKKyNkZWZpbmUgRUZfQVJNX0VBQklfVU5LTk9XTgkweDAwMDAwMDAwCisjZGVmaW5lIEVGX0FSTV9FQUJJX1ZFUjEJMHgwMTAwMDAwMAorI2RlZmluZSBFRl9BUk1fRUFCSV9WRVIyCTB4MDIwMDAwMDAKKyNkZWZpbmUgRUZfQVJNX0VBQklfVkVSMwkweDAzMDAwMDAwCisjZGVmaW5lIEVGX0FSTV9FQUJJX1ZFUjQJMHgwNDAwMDAwMAorI2RlZmluZSBFRl9BUk1fRUFCSV9WRVI1CTB4MDUwMDAwMDAKKworLyogQWRkaXRpb25hbCBzeW1ib2wgdHlwZXMgZm9yIFRodW1iLiAgKi8KKyNkZWZpbmUgU1RUX0FSTV9URlVOQwkJU1RUX0xPUFJPQyAvKiBBIFRodW1iIGZ1bmN0aW9uLiAgKi8KKyNkZWZpbmUgU1RUX0FSTV8xNkJJVAkJU1RUX0hJUFJPQyAvKiBBIFRodW1iIGxhYmVsLiAgKi8KKworLyogQVJNLXNwZWNpZmljIHZhbHVlcyBmb3Igc2hfZmxhZ3MgKi8KKyNkZWZpbmUgU0hGX0FSTV9FTlRSWVNFQ1QJMHgxMDAwMDAwMCAvKiBTZWN0aW9uIGNvbnRhaW5zIGFuIGVudHJ5IHBvaW50ICovCisjZGVmaW5lIFNIRl9BUk1fQ09NREVGCQkweDgwMDAwMDAwIC8qIFNlY3Rpb24gbWF5IGJlIG11bHRpcGx5IGRlZmluZWQKKwkJCQkJICAgICAgaW4gdGhlIGlucHV0IHRvIGEgbGluayBzdGVwLiAgKi8KKworLyogQVJNLXNwZWNpZmljIHByb2dyYW0gaGVhZGVyIGZsYWdzICovCisjZGVmaW5lIFBGX0FSTV9TQgkJMHgxMDAwMDAwMCAvKiBTZWdtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbgorCQkJCQkgICAgICBhZGRyZXNzZWQgYnkgdGhlIHN0YXRpYyBiYXNlLiAqLworI2RlZmluZSBQRl9BUk1fUEkJCTB4MjAwMDAwMDAgLyogUG9zaXRpb24taW5kZXBlbmRlbnQgc2VnbWVudC4gICovCisjZGVmaW5lIFBGX0FSTV9BQlMJCTB4NDAwMDAwMDAgLyogQWJzb2x1dGUgc2VnbWVudC4gICovCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyB2YWx1ZXMgZm9yIHRoZSBQaGRyIHBfdHlwZSBmaWVsZC4gICovCisjZGVmaW5lIFBUX0FSTV9FWElEWAkJKFBUX0xPUFJPQyArIDEpCS8qIEFSTSB1bndpbmQgc2VnbWVudC4gICovCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyB2YWx1ZXMgZm9yIHRoZSBTaGRyIHNoX3R5cGUgZmllbGQuICAqLworI2RlZmluZSBTSFRfQVJNX0VYSURYCQkoU0hUX0xPUFJPQyArIDEpIC8qIEFSTSB1bndpbmQgc2VjdGlvbi4gICovCisjZGVmaW5lIFNIVF9BUk1fUFJFRU1QVE1BUAkoU0hUX0xPUFJPQyArIDIpIC8qIFByZWVtcHRpb24gZGV0YWlscy4gICovCisjZGVmaW5lIFNIVF9BUk1fQVRUUklCVVRFUwkoU0hUX0xPUFJPQyArIDMpIC8qIEFSTSBhdHRyaWJ1dGVzIHNlY3Rpb24uICAqLworCisKKy8qIEFSTSByZWxvY3MuICAqLworCisjZGVmaW5lIFJfQVJNX05PTkUJCTAJLyogTm8gcmVsb2MgKi8KKyNkZWZpbmUgUl9BUk1fUEMyNAkJMQkvKiBQQyByZWxhdGl2ZSAyNiBiaXQgYnJhbmNoICovCisjZGVmaW5lIFJfQVJNX0FCUzMyCQkyCS8qIERpcmVjdCAzMiBiaXQgICovCisjZGVmaW5lIFJfQVJNX1JFTDMyCQkzCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCAqLworI2RlZmluZSBSX0FSTV9QQzEzCQk0CisjZGVmaW5lIFJfQVJNX0FCUzE2CQk1CS8qIERpcmVjdCAxNiBiaXQgKi8KKyNkZWZpbmUgUl9BUk1fQUJTMTIJCTYJLyogRGlyZWN0IDEyIGJpdCAqLworI2RlZmluZSBSX0FSTV9USE1fQUJTNQkJNworI2RlZmluZSBSX0FSTV9BQlM4CQk4CS8qIERpcmVjdCA4IGJpdCAqLworI2RlZmluZSBSX0FSTV9TQlJFTDMyCQk5CisjZGVmaW5lIFJfQVJNX1RITV9QQzIyCQkxMAorI2RlZmluZSBSX0FSTV9USE1fUEM4CQkxMQorI2RlZmluZSBSX0FSTV9BTVBfVkNBTEw5CTEyCisjZGVmaW5lIFJfQVJNX1NXSTI0CQkxMwkvKiBPYnNvbGV0ZSBzdGF0aWMgcmVsb2NhdGlvbi4gICovCisjZGVmaW5lIFJfQVJNX1RMU19ERVNDCQkxMyAgICAgIC8qIER5bmFtaWMgcmVsb2NhdGlvbi4gICovCisjZGVmaW5lIFJfQVJNX1RITV9TV0k4CQkxNAorI2RlZmluZSBSX0FSTV9YUEMyNQkJMTUKKyNkZWZpbmUgUl9BUk1fVEhNX1hQQzIyCQkxNgorI2RlZmluZSBSX0FSTV9UTFNfRFRQTU9EMzIJMTcJLyogSUQgb2YgbW9kdWxlIGNvbnRhaW5pbmcgc3ltYm9sICovCisjZGVmaW5lIFJfQVJNX1RMU19EVFBPRkYzMgkxOAkvKiBPZmZzZXQgaW4gVExTIGJsb2NrICovCisjZGVmaW5lIFJfQVJNX1RMU19UUE9GRjMyCTE5CS8qIE9mZnNldCBpbiBzdGF0aWMgVExTIGJsb2NrICovCisjZGVmaW5lIFJfQVJNX0NPUFkJCTIwCS8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUgKi8KKyNkZWZpbmUgUl9BUk1fR0xPQl9EQVQJCTIxCS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9BUk1fSlVNUF9TTE9UCQkyMgkvKiBDcmVhdGUgUExUIGVudHJ5ICovCisjZGVmaW5lIFJfQVJNX1JFTEFUSVZFCQkyMwkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCisjZGVmaW5lIFJfQVJNX0dPVE9GRgkJMjQJLyogMzIgYml0IG9mZnNldCB0byBHT1QgKi8KKyNkZWZpbmUgUl9BUk1fR09UUEMJCTI1CS8qIDMyIGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQgdG8gR09UICovCisjZGVmaW5lIFJfQVJNX0dPVDMyCQkyNgkvKiAzMiBiaXQgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfQVJNX1BMVDMyCQkyNwkvKiAzMiBiaXQgUExUIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl9BUk1fQUxVX1BDUkVMXzdfMAkzMgorI2RlZmluZSBSX0FSTV9BTFVfUENSRUxfMTVfOAkzMworI2RlZmluZSBSX0FSTV9BTFVfUENSRUxfMjNfMTUJMzQKKyNkZWZpbmUgUl9BUk1fTERSX1NCUkVMXzExXzAJMzUKKyNkZWZpbmUgUl9BUk1fQUxVX1NCUkVMXzE5XzEyCTM2CisjZGVmaW5lIFJfQVJNX0FMVV9TQlJFTF8yN18yMAkzNworI2RlZmluZSBSX0FSTV9UTFNfR09UREVTQwk5MAorI2RlZmluZSBSX0FSTV9UTFNfQ0FMTAkJOTEKKyNkZWZpbmUgUl9BUk1fVExTX0RFU0NTRVEJOTIKKyNkZWZpbmUgUl9BUk1fVEhNX1RMU19DQUxMCTkzCisjZGVmaW5lIFJfQVJNX0dOVV9WVEVOVFJZCTEwMAorI2RlZmluZSBSX0FSTV9HTlVfVlRJTkhFUklUCTEwMQorI2RlZmluZSBSX0FSTV9USE1fUEMxMQkJMTAyCS8qIHRodW1iIHVuY29uZGl0aW9uYWwgYnJhbmNoICovCisjZGVmaW5lIFJfQVJNX1RITV9QQzkJCTEwMwkvKiB0aHVtYiBjb25kaXRpb25hbCBicmFuY2ggKi8KKyNkZWZpbmUgUl9BUk1fVExTX0dEMzIJCTEwNAkvKiBQQy1yZWwgMzIgYml0IGZvciBnbG9iYWwgZHluYW1pYworCQkJCQkgICB0aHJlYWQgbG9jYWwgZGF0YSAqLworI2RlZmluZSBSX0FSTV9UTFNfTERNMzIJCTEwNQkvKiBQQy1yZWwgMzIgYml0IGZvciBsb2NhbCBkeW5hbWljCisJCQkJCSAgIHRocmVhZCBsb2NhbCBkYXRhICovCisjZGVmaW5lIFJfQVJNX1RMU19MRE8zMgkJMTA2CS8qIDMyIGJpdCBvZmZzZXQgcmVsYXRpdmUgdG8gVExTCisJCQkJCSAgIGJsb2NrICovCisjZGVmaW5lIFJfQVJNX1RMU19JRTMyCQkxMDcJLyogUEMtcmVsIDMyIGJpdCBmb3IgR09UIGVudHJ5IG9mCisJCQkJCSAgIHN0YXRpYyBUTFMgYmxvY2sgb2Zmc2V0ICovCisjZGVmaW5lIFJfQVJNX1RMU19MRTMyCQkxMDgJLyogMzIgYml0IG9mZnNldCByZWxhdGl2ZSB0byBzdGF0aWMKKwkJCQkJICAgVExTIGJsb2NrICovCisjZGVmaW5lCVJfQVJNX1RITV9UTFNfREVTQ1NFUQkxMjkKKyNkZWZpbmUgUl9BUk1fSVJFTEFUSVZFCQkxNjAKKyNkZWZpbmUgUl9BUk1fUlhQQzI1CQkyNDkKKyNkZWZpbmUgUl9BUk1fUlNCUkVMMzIJCTI1MAorI2RlZmluZSBSX0FSTV9USE1fUlBDMjIJCTI1MQorI2RlZmluZSBSX0FSTV9SUkVMMzIJCTI1MgorI2RlZmluZSBSX0FSTV9SQUJTMjIJCTI1MworI2RlZmluZSBSX0FSTV9SUEMyNAkJMjU0CisjZGVmaW5lIFJfQVJNX1JCQVNFCQkyNTUKKy8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCisjZGVmaW5lIFJfQVJNX05VTQkJMjU2CisKKy8qIElBLTY0IHNwZWNpZmljIGRlY2xhcmF0aW9ucy4gICovCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVoZHIgZV9mbGFncyBmaWVsZC4gICovCisjZGVmaW5lIEVGX0lBXzY0X01BU0tPUwkJMHgwMDAwMDAwZgkvKiBvcy1zcGVjaWZpYyBmbGFncyAqLworI2RlZmluZSBFRl9JQV82NF9BQkk2NAkJMHgwMDAwMDAxMAkvKiA2NC1iaXQgQUJJICovCisjZGVmaW5lIEVGX0lBXzY0X0FSQ0gJCTB4ZmYwMDAwMDAJLyogYXJjaC4gdmVyc2lvbiBtYXNrICovCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyB2YWx1ZXMgZm9yIHRoZSBQaGRyIHBfdHlwZSBmaWVsZC4gICovCisjZGVmaW5lIFBUX0lBXzY0X0FSQ0hFWFQJKFBUX0xPUFJPQyArIDApCS8qIGFyY2ggZXh0ZW5zaW9uIGJpdHMgKi8KKyNkZWZpbmUgUFRfSUFfNjRfVU5XSU5ECQkoUFRfTE9QUk9DICsgMSkJLyogaWE2NCB1bndpbmQgYml0cyAqLworI2RlZmluZSBQVF9JQV82NF9IUF9PUFRfQU5PVAkoUFRfTE9PUyArIDB4MTIpCisjZGVmaW5lIFBUX0lBXzY0X0hQX0hTTF9BTk9UCShQVF9MT09TICsgMHgxMykKKyNkZWZpbmUgUFRfSUFfNjRfSFBfU1RBQ0sJKFBUX0xPT1MgKyAweDE0KQorCisvKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBQaGRyIHBfZmxhZ3MgZmllbGQuICAqLworI2RlZmluZSBQRl9JQV82NF9OT1JFQ09WCTB4ODAwMDAwMDAJLyogc3BlYyBpbnNucyB3L28gcmVjb3ZlcnkgKi8KKworLyogUHJvY2Vzc29yIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlIFNoZHIgc2hfdHlwZSBmaWVsZC4gICovCisjZGVmaW5lIFNIVF9JQV82NF9FWFQJCShTSFRfTE9QUk9DICsgMCkgLyogZXh0ZW5zaW9uIGJpdHMgKi8KKyNkZWZpbmUgU0hUX0lBXzY0X1VOV0lORAkoU0hUX0xPUFJPQyArIDEpIC8qIHVud2luZCBiaXRzICovCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIFNoZHIgc2hfZmxhZ3MgZmllbGQuICAqLworI2RlZmluZSBTSEZfSUFfNjRfU0hPUlQJCTB4MTAwMDAwMDAJLyogc2VjdGlvbiBuZWFyIGdwICovCisjZGVmaW5lIFNIRl9JQV82NF9OT1JFQ09WCTB4MjAwMDAwMDAJLyogc3BlYyBpbnNucyB3L28gcmVjb3ZlcnkgKi8KKworLyogUHJvY2Vzc29yIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlIER5biBkX3RhZyBmaWVsZC4gICovCisjZGVmaW5lIERUX0lBXzY0X1BMVF9SRVNFUlZFCShEVF9MT1BST0MgKyAwKQorI2RlZmluZSBEVF9JQV82NF9OVU0JCTEKKworLyogSUEtNjQgcmVsb2NhdGlvbnMuICAqLworI2RlZmluZSBSX0lBNjRfTk9ORQkJMHgwMAkvKiBub25lICovCisjZGVmaW5lIFJfSUE2NF9JTU0xNAkJMHgyMQkvKiBzeW1ib2wgKyBhZGRlbmQsIGFkZCBpbW0xNCAqLworI2RlZmluZSBSX0lBNjRfSU1NMjIJCTB4MjIJLyogc3ltYm9sICsgYWRkZW5kLCBhZGQgaW1tMjIgKi8KKyNkZWZpbmUgUl9JQTY0X0lNTTY0CQkweDIzCS8qIHN5bWJvbCArIGFkZGVuZCwgbW92IGltbTY0ICovCisjZGVmaW5lIFJfSUE2NF9ESVIzMk1TQgkJMHgyNAkvKiBzeW1ib2wgKyBhZGRlbmQsIGRhdGE0IE1TQiAqLworI2RlZmluZSBSX0lBNjRfRElSMzJMU0IJCTB4MjUJLyogc3ltYm9sICsgYWRkZW5kLCBkYXRhNCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0RJUjY0TVNCCQkweDI2CS8qIHN5bWJvbCArIGFkZGVuZCwgZGF0YTggTVNCICovCisjZGVmaW5lIFJfSUE2NF9ESVI2NExTQgkJMHgyNwkvKiBzeW1ib2wgKyBhZGRlbmQsIGRhdGE4IExTQiAqLworI2RlZmluZSBSX0lBNjRfR1BSRUwyMgkJMHgyYQkvKiBAZ3ByZWwoc3ltICsgYWRkKSwgYWRkIGltbTIyICovCisjZGVmaW5lIFJfSUE2NF9HUFJFTDY0SQkJMHgyYgkvKiBAZ3ByZWwoc3ltICsgYWRkKSwgbW92IGltbTY0ICovCisjZGVmaW5lIFJfSUE2NF9HUFJFTDMyTVNCCTB4MmMJLyogQGdwcmVsKHN5bSArIGFkZCksIGRhdGE0IE1TQiAqLworI2RlZmluZSBSX0lBNjRfR1BSRUwzMkxTQgkweDJkCS8qIEBncHJlbChzeW0gKyBhZGQpLCBkYXRhNCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0dQUkVMNjRNU0IJMHgyZQkvKiBAZ3ByZWwoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCisjZGVmaW5lIFJfSUE2NF9HUFJFTDY0TFNCCTB4MmYJLyogQGdwcmVsKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLworI2RlZmluZSBSX0lBNjRfTFRPRkYyMgkJMHgzMgkvKiBAbHRvZmYoc3ltICsgYWRkKSwgYWRkIGltbTIyICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRjY0SQkJMHgzMwkvKiBAbHRvZmYoc3ltICsgYWRkKSwgbW92IGltbTY0ICovCisjZGVmaW5lIFJfSUE2NF9QTFRPRkYyMgkJMHgzYQkvKiBAcGx0b2ZmKHN5bSArIGFkZCksIGFkZCBpbW0yMiAqLworI2RlZmluZSBSX0lBNjRfUExUT0ZGNjRJCTB4M2IJLyogQHBsdG9mZihzeW0gKyBhZGQpLCBtb3YgaW1tNjQgKi8KKyNkZWZpbmUgUl9JQTY0X1BMVE9GRjY0TVNCCTB4M2UJLyogQHBsdG9mZihzeW0gKyBhZGQpLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1BMVE9GRjY0TFNCCTB4M2YJLyogQHBsdG9mZihzeW0gKyBhZGQpLCBkYXRhOCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0ZQVFI2NEkJCTB4NDMJLyogQGZwdHIoc3ltICsgYWRkKSwgbW92IGltbTY0ICovCisjZGVmaW5lIFJfSUE2NF9GUFRSMzJNU0IJMHg0NAkvKiBAZnB0cihzeW0gKyBhZGQpLCBkYXRhNCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0ZQVFIzMkxTQgkweDQ1CS8qIEBmcHRyKHN5bSArIGFkZCksIGRhdGE0IExTQiAqLworI2RlZmluZSBSX0lBNjRfRlBUUjY0TVNCCTB4NDYJLyogQGZwdHIoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCisjZGVmaW5lIFJfSUE2NF9GUFRSNjRMU0IJMHg0NwkvKiBAZnB0cihzeW0gKyBhZGQpLCBkYXRhOCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1BDUkVMNjBCCQkweDQ4CS8qIEBwY3JlbChzeW0gKyBhZGQpLCBicmwgKi8KKyNkZWZpbmUgUl9JQTY0X1BDUkVMMjFCCQkweDQ5CS8qIEBwY3JlbChzeW0gKyBhZGQpLCBwdGIsIGNhbGwgKi8KKyNkZWZpbmUgUl9JQTY0X1BDUkVMMjFNCQkweDRhCS8qIEBwY3JlbChzeW0gKyBhZGQpLCBjaGsucyAqLworI2RlZmluZSBSX0lBNjRfUENSRUwyMUYJCTB4NGIJLyogQHBjcmVsKHN5bSArIGFkZCksIGZjaGtmICovCisjZGVmaW5lIFJfSUE2NF9QQ1JFTDMyTVNCCTB4NGMJLyogQHBjcmVsKHN5bSArIGFkZCksIGRhdGE0IE1TQiAqLworI2RlZmluZSBSX0lBNjRfUENSRUwzMkxTQgkweDRkCS8qIEBwY3JlbChzeW0gKyBhZGQpLCBkYXRhNCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1BDUkVMNjRNU0IJMHg0ZQkvKiBAcGNyZWwoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCisjZGVmaW5lIFJfSUE2NF9QQ1JFTDY0TFNCCTB4NGYJLyogQHBjcmVsKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLworI2RlZmluZSBSX0lBNjRfTFRPRkZfRlBUUjIyCTB4NTIJLyogQGx0b2ZmKEBmcHRyKHMrYSkpLCBpbW0yMiAqLworI2RlZmluZSBSX0lBNjRfTFRPRkZfRlBUUjY0SQkweDUzCS8qIEBsdG9mZihAZnB0cihzK2EpKSwgaW1tNjQgKi8KKyNkZWZpbmUgUl9JQTY0X0xUT0ZGX0ZQVFIzMk1TQgkweDU0CS8qIEBsdG9mZihAZnB0cihzK2EpKSwgZGF0YTQgTVNCICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRl9GUFRSMzJMU0IJMHg1NQkvKiBAbHRvZmYoQGZwdHIocythKSksIGRhdGE0IExTQiAqLworI2RlZmluZSBSX0lBNjRfTFRPRkZfRlBUUjY0TVNCCTB4NTYJLyogQGx0b2ZmKEBmcHRyKHMrYSkpLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0xUT0ZGX0ZQVFI2NExTQgkweDU3CS8qIEBsdG9mZihAZnB0cihzK2EpKSwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9TRUdSRUwzMk1TQgkweDVjCS8qIEBzZWdyZWwoc3ltICsgYWRkKSwgZGF0YTQgTVNCICovCisjZGVmaW5lIFJfSUE2NF9TRUdSRUwzMkxTQgkweDVkCS8qIEBzZWdyZWwoc3ltICsgYWRkKSwgZGF0YTQgTFNCICovCisjZGVmaW5lIFJfSUE2NF9TRUdSRUw2NE1TQgkweDVlCS8qIEBzZWdyZWwoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCisjZGVmaW5lIFJfSUE2NF9TRUdSRUw2NExTQgkweDVmCS8qIEBzZWdyZWwoc3ltICsgYWRkKSwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9TRUNSRUwzMk1TQgkweDY0CS8qIEBzZWNyZWwoc3ltICsgYWRkKSwgZGF0YTQgTVNCICovCisjZGVmaW5lIFJfSUE2NF9TRUNSRUwzMkxTQgkweDY1CS8qIEBzZWNyZWwoc3ltICsgYWRkKSwgZGF0YTQgTFNCICovCisjZGVmaW5lIFJfSUE2NF9TRUNSRUw2NE1TQgkweDY2CS8qIEBzZWNyZWwoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCisjZGVmaW5lIFJfSUE2NF9TRUNSRUw2NExTQgkweDY3CS8qIEBzZWNyZWwoc3ltICsgYWRkKSwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9SRUwzMk1TQgkJMHg2YwkvKiBkYXRhIDQgKyBSRUwgKi8KKyNkZWZpbmUgUl9JQTY0X1JFTDMyTFNCCQkweDZkCS8qIGRhdGEgNCArIFJFTCAqLworI2RlZmluZSBSX0lBNjRfUkVMNjRNU0IJCTB4NmUJLyogZGF0YSA4ICsgUkVMICovCisjZGVmaW5lIFJfSUE2NF9SRUw2NExTQgkJMHg2ZgkvKiBkYXRhIDggKyBSRUwgKi8KKyNkZWZpbmUgUl9JQTY0X0xUVjMyTVNCCQkweDc0CS8qIHN5bWJvbCArIGFkZGVuZCwgZGF0YTQgTVNCICovCisjZGVmaW5lIFJfSUE2NF9MVFYzMkxTQgkJMHg3NQkvKiBzeW1ib2wgKyBhZGRlbmQsIGRhdGE0IExTQiAqLworI2RlZmluZSBSX0lBNjRfTFRWNjRNU0IJCTB4NzYJLyogc3ltYm9sICsgYWRkZW5kLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0xUVjY0TFNCCQkweDc3CS8qIHN5bWJvbCArIGFkZGVuZCwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9QQ1JFTDIxQkkJMHg3OQkvKiBAcGNyZWwoc3ltICsgYWRkKSwgMjFiaXQgaW5zdCAqLworI2RlZmluZSBSX0lBNjRfUENSRUwyMgkJMHg3YQkvKiBAcGNyZWwoc3ltICsgYWRkKSwgMjJiaXQgaW5zdCAqLworI2RlZmluZSBSX0lBNjRfUENSRUw2NEkJCTB4N2IJLyogQHBjcmVsKHN5bSArIGFkZCksIDY0Yml0IGluc3QgKi8KKyNkZWZpbmUgUl9JQTY0X0lQTFRNU0IJCTB4ODAJLyogZHluYW1pYyByZWxvYywgaW1wb3J0ZWQgUExULCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0lQTFRMU0IJCTB4ODEJLyogZHluYW1pYyByZWxvYywgaW1wb3J0ZWQgUExULCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0NPUFkJCTB4ODQJLyogY29weSByZWxvY2F0aW9uICovCisjZGVmaW5lIFJfSUE2NF9TVUIJCTB4ODUJLyogQWRkZW5kIGFuZCBzeW1ib2wgZGlmZmVyZW5jZSAqLworI2RlZmluZSBSX0lBNjRfTFRPRkYyMlgJCTB4ODYJLyogTFRPRkYyMiwgcmVsYXhhYmxlLiAgKi8KKyNkZWZpbmUgUl9JQTY0X0xEWE1PVgkJMHg4NwkvKiBVc2Ugb2YgTFRPRkYyMlguICAqLworI2RlZmluZSBSX0lBNjRfVFBSRUwxNAkJMHg5MQkvKiBAdHByZWwoc3ltICsgYWRkKSwgaW1tMTQgKi8KKyNkZWZpbmUgUl9JQTY0X1RQUkVMMjIJCTB4OTIJLyogQHRwcmVsKHN5bSArIGFkZCksIGltbTIyICovCisjZGVmaW5lIFJfSUE2NF9UUFJFTDY0SQkJMHg5MwkvKiBAdHByZWwoc3ltICsgYWRkKSwgaW1tNjQgKi8KKyNkZWZpbmUgUl9JQTY0X1RQUkVMNjRNU0IJMHg5NgkvKiBAdHByZWwoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCisjZGVmaW5lIFJfSUE2NF9UUFJFTDY0TFNCCTB4OTcJLyogQHRwcmVsKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLworI2RlZmluZSBSX0lBNjRfTFRPRkZfVFBSRUwyMgkweDlhCS8qIEBsdG9mZihAdHByZWwocythKSksIGltbTIgKi8KKyNkZWZpbmUgUl9JQTY0X0RUUE1PRDY0TVNCCTB4YTYJLyogQGR0cG1vZChzeW0gKyBhZGQpLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0RUUE1PRDY0TFNCCTB4YTcJLyogQGR0cG1vZChzeW0gKyBhZGQpLCBkYXRhOCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0xUT0ZGX0RUUE1PRDIyCTB4YWEJLyogQGx0b2ZmKEBkdHBtb2Qoc3ltICsgYWRkKSksIGltbTIyICovCisjZGVmaW5lIFJfSUE2NF9EVFBSRUwxNAkJMHhiMQkvKiBAZHRwcmVsKHN5bSArIGFkZCksIGltbTE0ICovCisjZGVmaW5lIFJfSUE2NF9EVFBSRUwyMgkJMHhiMgkvKiBAZHRwcmVsKHN5bSArIGFkZCksIGltbTIyICovCisjZGVmaW5lIFJfSUE2NF9EVFBSRUw2NEkJMHhiMwkvKiBAZHRwcmVsKHN5bSArIGFkZCksIGltbTY0ICovCisjZGVmaW5lIFJfSUE2NF9EVFBSRUwzMk1TQgkweGI0CS8qIEBkdHByZWwoc3ltICsgYWRkKSwgZGF0YTQgTVNCICovCisjZGVmaW5lIFJfSUE2NF9EVFBSRUwzMkxTQgkweGI1CS8qIEBkdHByZWwoc3ltICsgYWRkKSwgZGF0YTQgTFNCICovCisjZGVmaW5lIFJfSUE2NF9EVFBSRUw2NE1TQgkweGI2CS8qIEBkdHByZWwoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCisjZGVmaW5lIFJfSUE2NF9EVFBSRUw2NExTQgkweGI3CS8qIEBkdHByZWwoc3ltICsgYWRkKSwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRl9EVFBSRUwyMgkweGJhCS8qIEBsdG9mZihAZHRwcmVsKHMrYSkpLCBpbW0yMiAqLworCisvKiBTSCBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgKi8KKworLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KKyNkZWZpbmUgRUZfU0hfTUFDSF9NQVNLCQkweDFmCisjZGVmaW5lIEVGX1NIX1VOS05PV04JCTB4MAorI2RlZmluZSBFRl9TSDEJCQkweDEKKyNkZWZpbmUgRUZfU0gyCQkJMHgyCisjZGVmaW5lIEVGX1NIMwkJCTB4MworI2RlZmluZSBFRl9TSF9EU1AJCTB4NAorI2RlZmluZSBFRl9TSDNfRFNQCQkweDUKKyNkZWZpbmUgRUZfU0g0QUxfRFNQCQkweDYKKyNkZWZpbmUgRUZfU0gzRQkJCTB4OAorI2RlZmluZSBFRl9TSDQJCQkweDkKKyNkZWZpbmUgRUZfU0gyRQkJCTB4YgorI2RlZmluZSBFRl9TSDRBCQkJMHhjCisjZGVmaW5lIEVGX1NIMkEJCQkweGQKKyNkZWZpbmUgRUZfU0g0X05PRlBVCQkweDEwCisjZGVmaW5lIEVGX1NINEFfTk9GUFUJCTB4MTEKKyNkZWZpbmUgRUZfU0g0X05PTU1VX05PRlBVCTB4MTIKKyNkZWZpbmUgRUZfU0gyQV9OT0ZQVQkJMHgxMworI2RlZmluZSBFRl9TSDNfTk9NTVUJCTB4MTQKKyNkZWZpbmUgRUZfU0gyQV9TSDRfTk9GUFUJMHgxNQorI2RlZmluZSBFRl9TSDJBX1NIM19OT0ZQVQkweDE2CisjZGVmaW5lIEVGX1NIMkFfU0g0CQkweDE3CisjZGVmaW5lIEVGX1NIMkFfU0gzRQkJMHgxOAorCisvKiBTSCByZWxvY3MuICAqLworI2RlZmluZQlSX1NIX05PTkUJCTAKKyNkZWZpbmUJUl9TSF9ESVIzMgkJMQorI2RlZmluZQlSX1NIX1JFTDMyCQkyCisjZGVmaW5lCVJfU0hfRElSOFdQTgkJMworI2RlZmluZQlSX1NIX0lORDEyVwkJNAorI2RlZmluZQlSX1NIX0RJUjhXUEwJCTUKKyNkZWZpbmUJUl9TSF9ESVI4V1BaCQk2CisjZGVmaW5lCVJfU0hfRElSOEJQCQk3CisjZGVmaW5lCVJfU0hfRElSOFcJCTgKKyNkZWZpbmUJUl9TSF9ESVI4TAkJOQorI2RlZmluZQlSX1NIX1NXSVRDSDE2CQkyNQorI2RlZmluZQlSX1NIX1NXSVRDSDMyCQkyNgorI2RlZmluZQlSX1NIX1VTRVMJCTI3CisjZGVmaW5lCVJfU0hfQ09VTlQJCTI4CisjZGVmaW5lCVJfU0hfQUxJR04JCTI5CisjZGVmaW5lCVJfU0hfQ09ERQkJMzAKKyNkZWZpbmUJUl9TSF9EQVRBCQkzMQorI2RlZmluZQlSX1NIX0xBQkVMCQkzMgorI2RlZmluZQlSX1NIX1NXSVRDSDgJCTMzCisjZGVmaW5lCVJfU0hfR05VX1ZUSU5IRVJJVAkzNAorI2RlZmluZQlSX1NIX0dOVV9WVEVOVFJZCTM1CisjZGVmaW5lCVJfU0hfVExTX0dEXzMyCQkxNDQKKyNkZWZpbmUJUl9TSF9UTFNfTERfMzIJCTE0NQorI2RlZmluZQlSX1NIX1RMU19MRE9fMzIJCTE0NgorI2RlZmluZQlSX1NIX1RMU19JRV8zMgkJMTQ3CisjZGVmaW5lCVJfU0hfVExTX0xFXzMyCQkxNDgKKyNkZWZpbmUJUl9TSF9UTFNfRFRQTU9EMzIJMTQ5CisjZGVmaW5lCVJfU0hfVExTX0RUUE9GRjMyCTE1MAorI2RlZmluZQlSX1NIX1RMU19UUE9GRjMyCTE1MQorI2RlZmluZQlSX1NIX0dPVDMyCQkxNjAKKyNkZWZpbmUJUl9TSF9QTFQzMgkJMTYxCisjZGVmaW5lCVJfU0hfQ09QWQkJMTYyCisjZGVmaW5lCVJfU0hfR0xPQl9EQVQJCTE2MworI2RlZmluZQlSX1NIX0pNUF9TTE9UCQkxNjQKKyNkZWZpbmUJUl9TSF9SRUxBVElWRQkJMTY1CisjZGVmaW5lCVJfU0hfR09UT0ZGCQkxNjYKKyNkZWZpbmUJUl9TSF9HT1RQQwkJMTY3CisvKiBLZWVwIHRoaXMgdGhlIGxhc3QgZW50cnkuICAqLworI2RlZmluZQlSX1NIX05VTQkJMjU2CisKKy8qIFMvMzkwIHNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KKworLyogVmFsaWQgdmFsdWVzIGZvciB0aGUgZV9mbGFncyBmaWVsZC4gICovCisKKyNkZWZpbmUgRUZfUzM5MF9ISUdIX0dQUlMgICAgMHgwMDAwMDAwMSAgLyogSGlnaCBHUFJzIGtlcm5lbCBmYWNpbGl0eSBuZWVkZWQuICAqLworCisvKiBBZGRpdGlvbmFsIHMzOTAgcmVsb2NzICovCisKKyNkZWZpbmUgUl8zOTBfTk9ORQkJMAkvKiBObyByZWxvYy4gICovCisjZGVmaW5lIFJfMzkwXzgJCQkxCS8qIERpcmVjdCA4IGJpdC4gICovCisjZGVmaW5lIFJfMzkwXzEyCQkyCS8qIERpcmVjdCAxMiBiaXQuICAqLworI2RlZmluZSBSXzM5MF8xNgkJMwkvKiBEaXJlY3QgMTYgYml0LiAgKi8KKyNkZWZpbmUgUl8zOTBfMzIJCTQJLyogRGlyZWN0IDMyIGJpdC4gICovCisjZGVmaW5lIFJfMzkwX1BDMzIJCTUJLyogUEMgcmVsYXRpdmUgMzIgYml0LgkqLworI2RlZmluZSBSXzM5MF9HT1QxMgkJNgkvKiAxMiBiaXQgR09UIG9mZnNldC4gICovCisjZGVmaW5lIFJfMzkwX0dPVDMyCQk3CS8qIDMyIGJpdCBHT1Qgb2Zmc2V0LiAgKi8KKyNkZWZpbmUgUl8zOTBfUExUMzIJCTgJLyogMzIgYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl8zOTBfQ09QWQkJOQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lLiAgKi8KKyNkZWZpbmUgUl8zOTBfR0xPQl9EQVQJCTEwCS8qIENyZWF0ZSBHT1QgZW50cnkuICAqLworI2RlZmluZSBSXzM5MF9KTVBfU0xPVAkJMTEJLyogQ3JlYXRlIFBMVCBlbnRyeS4gICovCisjZGVmaW5lIFJfMzkwX1JFTEFUSVZFCQkxMgkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlLiAgKi8KKyNkZWZpbmUgUl8zOTBfR09UT0ZGMzIJCTEzCS8qIDMyIGJpdCBvZmZzZXQgdG8gR09ULgkgKi8KKyNkZWZpbmUgUl8zOTBfR09UUEMJCTE0CS8qIDMyIGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQgdG8gR09ULiAgKi8KKyNkZWZpbmUgUl8zOTBfR09UMTYJCTE1CS8qIDE2IGJpdCBHT1Qgb2Zmc2V0LiAgKi8KKyNkZWZpbmUgUl8zOTBfUEMxNgkJMTYJLyogUEMgcmVsYXRpdmUgMTYgYml0LgkqLworI2RlZmluZSBSXzM5MF9QQzE2REJMCQkxNwkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgc2hpZnRlZCBieSAxLiAgKi8KKyNkZWZpbmUgUl8zOTBfUExUMTZEQkwJCTE4CS8qIDE2IGJpdCBQQyByZWwuIFBMVCBzaGlmdGVkIGJ5IDEuICAqLworI2RlZmluZSBSXzM5MF9QQzMyREJMCQkxOQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgc2hpZnRlZCBieSAxLiAgKi8KKyNkZWZpbmUgUl8zOTBfUExUMzJEQkwJCTIwCS8qIDMyIGJpdCBQQyByZWwuIFBMVCBzaGlmdGVkIGJ5IDEuICAqLworI2RlZmluZSBSXzM5MF9HT1RQQ0RCTAkJMjEJLyogMzIgYml0IFBDIHJlbC4gR09UIHNoaWZ0ZWQgYnkgMS4gICovCisjZGVmaW5lIFJfMzkwXzY0CQkyMgkvKiBEaXJlY3QgNjQgYml0LiAgKi8KKyNkZWZpbmUgUl8zOTBfUEM2NAkJMjMJLyogUEMgcmVsYXRpdmUgNjQgYml0LgkqLworI2RlZmluZSBSXzM5MF9HT1Q2NAkJMjQJLyogNjQgYml0IEdPVCBvZmZzZXQuICAqLworI2RlZmluZSBSXzM5MF9QTFQ2NAkJMjUJLyogNjQgYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl8zOTBfR09URU5UCQkyNgkvKiAzMiBiaXQgUEMgcmVsLiB0byBHT1QgZW50cnkgPj4gMS4gKi8KKyNkZWZpbmUgUl8zOTBfR09UT0ZGMTYJCTI3CS8qIDE2IGJpdCBvZmZzZXQgdG8gR09ULiAqLworI2RlZmluZSBSXzM5MF9HT1RPRkY2NAkJMjgJLyogNjQgYml0IG9mZnNldCB0byBHT1QuICovCisjZGVmaW5lIFJfMzkwX0dPVFBMVDEyCQkyOQkvKiAxMiBiaXQgb2Zmc2V0IHRvIGp1bXAgc2xvdC4JKi8KKyNkZWZpbmUgUl8zOTBfR09UUExUMTYJCTMwCS8qIDE2IGJpdCBvZmZzZXQgdG8ganVtcCBzbG90LgkqLworI2RlZmluZSBSXzM5MF9HT1RQTFQzMgkJMzEJLyogMzIgYml0IG9mZnNldCB0byBqdW1wIHNsb3QuCSovCisjZGVmaW5lIFJfMzkwX0dPVFBMVDY0CQkzMgkvKiA2NCBiaXQgb2Zmc2V0IHRvIGp1bXAgc2xvdC4JKi8KKyNkZWZpbmUgUl8zOTBfR09UUExURU5UCQkzMwkvKiAzMiBiaXQgcmVsLiBvZmZzZXQgdG8ganVtcCBzbG90LiAgKi8KKyNkZWZpbmUgUl8zOTBfUExUT0ZGMTYJCTM0CS8qIDE2IGJpdCBvZmZzZXQgZnJvbSBHT1QgdG8gUExULiAqLworI2RlZmluZSBSXzM5MF9QTFRPRkYzMgkJMzUJLyogMzIgYml0IG9mZnNldCBmcm9tIEdPVCB0byBQTFQuICovCisjZGVmaW5lIFJfMzkwX1BMVE9GRjY0CQkzNgkvKiAxNiBiaXQgb2Zmc2V0IGZyb20gR09UIHRvIFBMVC4gKi8KKyNkZWZpbmUgUl8zOTBfVExTX0xPQUQJCTM3CS8qIFRhZyBmb3IgbG9hZCBpbnNuIGluIFRMUyBjb2RlLiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0dEQ0FMTAkzOAkvKiBUYWcgZm9yIGZ1bmN0aW9uIGNhbGwgaW4gZ2VuZXJhbAorCQkJCQkgICBkeW5hbWljIFRMUyBjb2RlLiAqLworI2RlZmluZSBSXzM5MF9UTFNfTERDQUxMCTM5CS8qIFRhZyBmb3IgZnVuY3Rpb24gY2FsbCBpbiBsb2NhbAorCQkJCQkgICBkeW5hbWljIFRMUyBjb2RlLiAqLworI2RlZmluZSBSXzM5MF9UTFNfR0QzMgkJNDAJLyogRGlyZWN0IDMyIGJpdCBmb3IgZ2VuZXJhbCBkeW5hbWljCisJCQkJCSAgIHRocmVhZCBsb2NhbCBkYXRhLiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0dENjQJCTQxCS8qIERpcmVjdCA2NCBiaXQgZm9yIGdlbmVyYWwgZHluYW1pYworCQkJCQkgIHRocmVhZCBsb2NhbCBkYXRhLiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0dPVElFMTIJNDIJLyogMTIgYml0IEdPVCBvZmZzZXQgZm9yIHN0YXRpYyBUTFMKKwkJCQkJICAgYmxvY2sgb2Zmc2V0LiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0dPVElFMzIJNDMJLyogMzIgYml0IEdPVCBvZmZzZXQgZm9yIHN0YXRpYyBUTFMKKwkJCQkJICAgYmxvY2sgb2Zmc2V0LiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0dPVElFNjQJNDQJLyogNjQgYml0IEdPVCBvZmZzZXQgZm9yIHN0YXRpYyBUTFMKKwkJCQkJICAgYmxvY2sgb2Zmc2V0LiAqLworI2RlZmluZSBSXzM5MF9UTFNfTERNMzIJCTQ1CS8qIERpcmVjdCAzMiBiaXQgZm9yIGxvY2FsIGR5bmFtaWMKKwkJCQkJICAgdGhyZWFkIGxvY2FsIGRhdGEgaW4gTEUgY29kZS4gICovCisjZGVmaW5lIFJfMzkwX1RMU19MRE02NAkJNDYJLyogRGlyZWN0IDY0IGJpdCBmb3IgbG9jYWwgZHluYW1pYworCQkJCQkgICB0aHJlYWQgbG9jYWwgZGF0YSBpbiBMRSBjb2RlLiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0lFMzIJCTQ3CS8qIDMyIGJpdCBhZGRyZXNzIG9mIEdPVCBlbnRyeSBmb3IKKwkJCQkJICAgbmVnYXRlZCBzdGF0aWMgVExTIGJsb2NrIG9mZnNldC4gICovCisjZGVmaW5lIFJfMzkwX1RMU19JRTY0CQk0OAkvKiA2NCBiaXQgYWRkcmVzcyBvZiBHT1QgZW50cnkgZm9yCisJCQkJCSAgIG5lZ2F0ZWQgc3RhdGljIFRMUyBibG9jayBvZmZzZXQuICAqLworI2RlZmluZSBSXzM5MF9UTFNfSUVFTlQJCTQ5CS8qIDMyIGJpdCByZWwuIG9mZnNldCB0byBHT1QgZW50cnkgZm9yCisJCQkJCSAgIG5lZ2F0ZWQgc3RhdGljIFRMUyBibG9jayBvZmZzZXQuICAqLworI2RlZmluZSBSXzM5MF9UTFNfTEUzMgkJNTAJLyogMzIgYml0IG5lZ2F0ZWQgb2Zmc2V0IHJlbGF0aXZlIHRvCisJCQkJCSAgIHN0YXRpYyBUTFMgYmxvY2suICAqLworI2RlZmluZSBSXzM5MF9UTFNfTEU2NAkJNTEJLyogNjQgYml0IG5lZ2F0ZWQgb2Zmc2V0IHJlbGF0aXZlIHRvCisJCQkJCSAgIHN0YXRpYyBUTFMgYmxvY2suICAqLworI2RlZmluZSBSXzM5MF9UTFNfTERPMzIJCTUyCS8qIDMyIGJpdCBvZmZzZXQgcmVsYXRpdmUgdG8gVExTCisJCQkJCSAgIGJsb2NrLiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0xETzY0CQk1MwkvKiA2NCBiaXQgb2Zmc2V0IHJlbGF0aXZlIHRvIFRMUworCQkJCQkgICBibG9jay4gICovCisjZGVmaW5lIFJfMzkwX1RMU19EVFBNT0QJNTQJLyogSUQgb2YgbW9kdWxlIGNvbnRhaW5pbmcgc3ltYm9sLiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0RUUE9GRgk1NQkvKiBPZmZzZXQgaW4gVExTIGJsb2NrLgkgKi8KKyNkZWZpbmUgUl8zOTBfVExTX1RQT0ZGCQk1NgkvKiBOZWdhdGVkIG9mZnNldCBpbiBzdGF0aWMgVExTCisJCQkJCSAgIGJsb2NrLiAgKi8KKyNkZWZpbmUgUl8zOTBfMjAJCTU3CS8qIERpcmVjdCAyMCBiaXQuICAqLworI2RlZmluZSBSXzM5MF9HT1QyMAkJNTgJLyogMjAgYml0IEdPVCBvZmZzZXQuICAqLworI2RlZmluZSBSXzM5MF9HT1RQTFQyMAkJNTkJLyogMjAgYml0IG9mZnNldCB0byBqdW1wIHNsb3QuICAqLworI2RlZmluZSBSXzM5MF9UTFNfR09USUUyMAk2MAkvKiAyMCBiaXQgR09UIG9mZnNldCBmb3Igc3RhdGljIFRMUworCQkJCQkgICBibG9jayBvZmZzZXQuICAqLworLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAgKi8KKyNkZWZpbmUgUl8zOTBfTlVNCQk2MQorCisKKy8qIENSSVMgcmVsb2NhdGlvbnMuICAqLworI2RlZmluZSBSX0NSSVNfTk9ORQkJMAorI2RlZmluZSBSX0NSSVNfOAkJMQorI2RlZmluZSBSX0NSSVNfMTYJCTIKKyNkZWZpbmUgUl9DUklTXzMyCQkzCisjZGVmaW5lIFJfQ1JJU184X1BDUkVMCQk0CisjZGVmaW5lIFJfQ1JJU18xNl9QQ1JFTAkJNQorI2RlZmluZSBSX0NSSVNfMzJfUENSRUwJCTYKKyNkZWZpbmUgUl9DUklTX0dOVV9WVElOSEVSSVQJNworI2RlZmluZSBSX0NSSVNfR05VX1ZURU5UUlkJOAorI2RlZmluZSBSX0NSSVNfQ09QWQkJOQorI2RlZmluZSBSX0NSSVNfR0xPQl9EQVQJCTEwCisjZGVmaW5lIFJfQ1JJU19KVU1QX1NMT1QJMTEKKyNkZWZpbmUgUl9DUklTX1JFTEFUSVZFCQkxMgorI2RlZmluZSBSX0NSSVNfMTZfR09UCQkxMworI2RlZmluZSBSX0NSSVNfMzJfR09UCQkxNAorI2RlZmluZSBSX0NSSVNfMTZfR09UUExUCTE1CisjZGVmaW5lIFJfQ1JJU18zMl9HT1RQTFQJMTYKKyNkZWZpbmUgUl9DUklTXzMyX0dPVFJFTAkxNworI2RlZmluZSBSX0NSSVNfMzJfUExUX0dPVFJFTAkxOAorI2RlZmluZSBSX0NSSVNfMzJfUExUX1BDUkVMCTE5CisKKyNkZWZpbmUgUl9DUklTX05VTQkJMjAKKworCisvKiBBTUQgeDg2LTY0IHJlbG9jYXRpb25zLiAgKi8KKyNkZWZpbmUgUl9YODZfNjRfTk9ORQkJMAkvKiBObyByZWxvYyAqLworI2RlZmluZSBSX1g4Nl82NF82NAkJMQkvKiBEaXJlY3QgNjQgYml0ICAqLworI2RlZmluZSBSX1g4Nl82NF9QQzMyCQkyCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCBzaWduZWQgKi8KKyNkZWZpbmUgUl9YODZfNjRfR09UMzIJCTMJLyogMzIgYml0IEdPVCBlbnRyeSAqLworI2RlZmluZSBSX1g4Nl82NF9QTFQzMgkJNAkvKiAzMiBiaXQgUExUIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl9YODZfNjRfQ09QWQkJNQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCisjZGVmaW5lIFJfWDg2XzY0X0dMT0JfREFUCTYJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLworI2RlZmluZSBSX1g4Nl82NF9KVU1QX1NMT1QJNwkvKiBDcmVhdGUgUExUIGVudHJ5ICovCisjZGVmaW5lIFJfWDg2XzY0X1JFTEFUSVZFCTgJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLworI2RlZmluZSBSX1g4Nl82NF9HT1RQQ1JFTAk5CS8qIDMyIGJpdCBzaWduZWQgUEMgcmVsYXRpdmUKKwkJCQkJICAgb2Zmc2V0IHRvIEdPVCAqLworI2RlZmluZSBSX1g4Nl82NF8zMgkJMTAJLyogRGlyZWN0IDMyIGJpdCB6ZXJvIGV4dGVuZGVkICovCisjZGVmaW5lIFJfWDg2XzY0XzMyUwkJMTEJLyogRGlyZWN0IDMyIGJpdCBzaWduIGV4dGVuZGVkICovCisjZGVmaW5lIFJfWDg2XzY0XzE2CQkxMgkvKiBEaXJlY3QgMTYgYml0IHplcm8gZXh0ZW5kZWQgKi8KKyNkZWZpbmUgUl9YODZfNjRfUEMxNgkJMTMJLyogMTYgYml0IHNpZ24gZXh0ZW5kZWQgcGMgcmVsYXRpdmUgKi8KKyNkZWZpbmUgUl9YODZfNjRfOAkJMTQJLyogRGlyZWN0IDggYml0IHNpZ24gZXh0ZW5kZWQgICovCisjZGVmaW5lIFJfWDg2XzY0X1BDOAkJMTUJLyogOCBiaXQgc2lnbiBleHRlbmRlZCBwYyByZWxhdGl2ZSAqLworI2RlZmluZSBSX1g4Nl82NF9EVFBNT0Q2NAkxNgkvKiBJRCBvZiBtb2R1bGUgY29udGFpbmluZyBzeW1ib2wgKi8KKyNkZWZpbmUgUl9YODZfNjRfRFRQT0ZGNjQJMTcJLyogT2Zmc2V0IGluIG1vZHVsZSdzIFRMUyBibG9jayAqLworI2RlZmluZSBSX1g4Nl82NF9UUE9GRjY0CTE4CS8qIE9mZnNldCBpbiBpbml0aWFsIFRMUyBibG9jayAqLworI2RlZmluZSBSX1g4Nl82NF9UTFNHRAkJMTkJLyogMzIgYml0IHNpZ25lZCBQQyByZWxhdGl2ZSBvZmZzZXQKKwkJCQkJICAgdG8gdHdvIEdPVCBlbnRyaWVzIGZvciBHRCBzeW1ib2wgKi8KKyNkZWZpbmUgUl9YODZfNjRfVExTTEQJCTIwCS8qIDMyIGJpdCBzaWduZWQgUEMgcmVsYXRpdmUgb2Zmc2V0CisJCQkJCSAgIHRvIHR3byBHT1QgZW50cmllcyBmb3IgTEQgc3ltYm9sICovCisjZGVmaW5lIFJfWDg2XzY0X0RUUE9GRjMyCTIxCS8qIE9mZnNldCBpbiBUTFMgYmxvY2sgKi8KKyNkZWZpbmUgUl9YODZfNjRfR09UVFBPRkYJMjIJLyogMzIgYml0IHNpZ25lZCBQQyByZWxhdGl2ZSBvZmZzZXQKKwkJCQkJICAgdG8gR09UIGVudHJ5IGZvciBJRSBzeW1ib2wgKi8KKyNkZWZpbmUgUl9YODZfNjRfVFBPRkYzMgkyMwkvKiBPZmZzZXQgaW4gaW5pdGlhbCBUTFMgYmxvY2sgKi8KKyNkZWZpbmUgUl9YODZfNjRfUEM2NAkJMjQJLyogUEMgcmVsYXRpdmUgNjQgYml0ICovCisjZGVmaW5lIFJfWDg2XzY0X0dPVE9GRjY0CTI1CS8qIDY0IGJpdCBvZmZzZXQgdG8gR09UICovCisjZGVmaW5lIFJfWDg2XzY0X0dPVFBDMzIJMjYJLyogMzIgYml0IHNpZ25lZCBwYyByZWxhdGl2ZQorCQkJCQkgICBvZmZzZXQgdG8gR09UICovCisjZGVmaW5lIFJfWDg2XzY0X0dPVDY0CQkyNwkvKiA2NC1iaXQgR09UIGVudHJ5IG9mZnNldCAqLworI2RlZmluZSBSX1g4Nl82NF9HT1RQQ1JFTDY0CTI4CS8qIDY0LWJpdCBQQyByZWxhdGl2ZSBvZmZzZXQKKwkJCQkJICAgdG8gR09UIGVudHJ5ICovCisjZGVmaW5lIFJfWDg2XzY0X0dPVFBDNjQJMjkJLyogNjQtYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KKyNkZWZpbmUgUl9YODZfNjRfR09UUExUNjQJMzAgCS8qIGxpa2UgR09UNjQsIHNheXMgUExUIGVudHJ5IG5lZWRlZCAqLworI2RlZmluZSBSX1g4Nl82NF9QTFRPRkY2NAkzMQkvKiA2NC1iaXQgR09UIHJlbGF0aXZlIG9mZnNldAorCQkJCQkgICB0byBQTFQgZW50cnkgKi8KKyNkZWZpbmUgUl9YODZfNjRfU0laRTMyCQkzMgkvKiBTaXplIG9mIHN5bWJvbCBwbHVzIDMyLWJpdCBhZGRlbmQgKi8KKyNkZWZpbmUgUl9YODZfNjRfU0laRTY0CQkzMwkvKiBTaXplIG9mIHN5bWJvbCBwbHVzIDY0LWJpdCBhZGRlbmQgKi8KKyNkZWZpbmUgUl9YODZfNjRfR09UUEMzMl9UTFNERVNDIDM0CS8qIEdPVCBvZmZzZXQgZm9yIFRMUyBkZXNjcmlwdG9yLiAgKi8KKyNkZWZpbmUgUl9YODZfNjRfVExTREVTQ19DQUxMICAgMzUJLyogTWFya2VyIGZvciBjYWxsIHRocm91Z2ggVExTCisJCQkJCSAgIGRlc2NyaXB0b3IuICAqLworI2RlZmluZSBSX1g4Nl82NF9UTFNERVNDICAgICAgICAzNgkvKiBUTFMgZGVzY3JpcHRvci4gICovCisjZGVmaW5lIFJfWDg2XzY0X0lSRUxBVElWRQkzNwkvKiBBZGp1c3QgaW5kaXJlY3RseSBieSBwcm9ncmFtIGJhc2UgKi8KKworI2RlZmluZSBSX1g4Nl82NF9OVU0JCTM4CisKKworLyogQU0zMyByZWxvY2F0aW9ucy4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9OT05FCQkwCS8qIE5vIHJlbG9jLiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwXzMyCQkxCS8qIERpcmVjdCAzMiBiaXQuICAqLworI2RlZmluZSBSX01OMTAzMDBfMTYJCTIJLyogRGlyZWN0IDE2IGJpdC4gICovCisjZGVmaW5lIFJfTU4xMDMwMF84CQkzCS8qIERpcmVjdCA4IGJpdC4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9QQ1JFTDMyCTQJLyogUEMtcmVsYXRpdmUgMzItYml0LiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX1BDUkVMMTYJNQkvKiBQQy1yZWxhdGl2ZSAxNi1iaXQgc2lnbmVkLiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX1BDUkVMOAk2CS8qIFBDLXJlbGF0aXZlIDgtYml0IHNpZ25lZC4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUCTcJLyogQW5jaWVudCBDKysgdnRhYmxlIGdhcmJhZ2UuLi4gKi8KKyNkZWZpbmUgUl9NTjEwMzAwX0dOVV9WVEVOVFJZCTgJLyogLi4uIGNvbGxlY3Rpb24gYW5ub3RhdGlvbi4gICovCisjZGVmaW5lIFJfTU4xMDMwMF8yNAkJOQkvKiBEaXJlY3QgMjQgYml0LiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX0dPVFBDMzIJMTAJLyogMzItYml0IFBDcmVsIG9mZnNldCB0byBHT1QuICAqLworI2RlZmluZSBSX01OMTAzMDBfR09UUEMxNgkxMQkvKiAxNi1iaXQgUENyZWwgb2Zmc2V0IHRvIEdPVC4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9HT1RPRkYzMgkxMgkvKiAzMi1iaXQgb2Zmc2V0IGZyb20gR09ULiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX0dPVE9GRjI0CTEzCS8qIDI0LWJpdCBvZmZzZXQgZnJvbSBHT1QuICAqLworI2RlZmluZSBSX01OMTAzMDBfR09UT0ZGMTYJMTQJLyogMTYtYml0IG9mZnNldCBmcm9tIEdPVC4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9QTFQzMgkJMTUJLyogMzItYml0IFBDcmVsIHRvIFBMVCBlbnRyeS4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9QTFQxNgkJMTYJLyogMTYtYml0IFBDcmVsIHRvIFBMVCBlbnRyeS4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9HT1QzMgkJMTcJLyogMzItYml0IG9mZnNldCB0byBHT1QgZW50cnkuICAqLworI2RlZmluZSBSX01OMTAzMDBfR09UMjQJCTE4CS8qIDI0LWJpdCBvZmZzZXQgdG8gR09UIGVudHJ5LiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX0dPVDE2CQkxOQkvKiAxNi1iaXQgb2Zmc2V0IHRvIEdPVCBlbnRyeS4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9DT1BZCQkyMAkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lLiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX0dMT0JfREFUCTIxCS8qIENyZWF0ZSBHT1QgZW50cnkuICAqLworI2RlZmluZSBSX01OMTAzMDBfSk1QX1NMT1QJMjIJLyogQ3JlYXRlIFBMVCBlbnRyeS4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9SRUxBVElWRQkyMwkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlLiAgKi8KKworI2RlZmluZSBSX01OMTAzMDBfTlVNCQkyNAorCisKKy8qIE0zMlIgcmVsb2NzLiAgKi8KKyNkZWZpbmUgUl9NMzJSX05PTkUJCTAJLyogTm8gcmVsb2MuICovCisjZGVmaW5lIFJfTTMyUl8xNgkJMQkvKiBEaXJlY3QgMTYgYml0LiAqLworI2RlZmluZSBSX00zMlJfMzIJCTIJLyogRGlyZWN0IDMyIGJpdC4gKi8KKyNkZWZpbmUgUl9NMzJSXzI0CQkzCS8qIERpcmVjdCAyNCBiaXQuICovCisjZGVmaW5lIFJfTTMyUl8xMF9QQ1JFTAkJNAkvKiBQQyByZWxhdGl2ZSAxMCBiaXQgc2hpZnRlZC4gKi8KKyNkZWZpbmUgUl9NMzJSXzE4X1BDUkVMCQk1CS8qIFBDIHJlbGF0aXZlIDE4IGJpdCBzaGlmdGVkLiAqLworI2RlZmluZSBSX00zMlJfMjZfUENSRUwJCTYJLyogUEMgcmVsYXRpdmUgMjYgYml0IHNoaWZ0ZWQuICovCisjZGVmaW5lIFJfTTMyUl9ISTE2X1VMTwkJNwkvKiBIaWdoIDE2IGJpdCB3aXRoIHVuc2lnbmVkIGxvdy4gKi8KKyNkZWZpbmUgUl9NMzJSX0hJMTZfU0xPCQk4CS8qIEhpZ2ggMTYgYml0IHdpdGggc2lnbmVkIGxvdy4gKi8KKyNkZWZpbmUgUl9NMzJSX0xPMTYJCTkJLyogTG93IDE2IGJpdC4gKi8KKyNkZWZpbmUgUl9NMzJSX1NEQTE2CQkxMAkvKiAxNiBiaXQgb2Zmc2V0IGluIFNEQS4gKi8KKyNkZWZpbmUgUl9NMzJSX0dOVV9WVElOSEVSSVQJMTEKKyNkZWZpbmUgUl9NMzJSX0dOVV9WVEVOVFJZCTEyCisvKiBNMzJSIHJlbG9jcyB1c2UgU0hUX1JFTEEuICAqLworI2RlZmluZSBSX00zMlJfMTZfUkVMQQkJMzMJLyogRGlyZWN0IDE2IGJpdC4gKi8KKyNkZWZpbmUgUl9NMzJSXzMyX1JFTEEJCTM0CS8qIERpcmVjdCAzMiBiaXQuICovCisjZGVmaW5lIFJfTTMyUl8yNF9SRUxBCQkzNQkvKiBEaXJlY3QgMjQgYml0LiAqLworI2RlZmluZSBSX00zMlJfMTBfUENSRUxfUkVMQQkzNgkvKiBQQyByZWxhdGl2ZSAxMCBiaXQgc2hpZnRlZC4gKi8KKyNkZWZpbmUgUl9NMzJSXzE4X1BDUkVMX1JFTEEJMzcJLyogUEMgcmVsYXRpdmUgMTggYml0IHNoaWZ0ZWQuICovCisjZGVmaW5lIFJfTTMyUl8yNl9QQ1JFTF9SRUxBCTM4CS8qIFBDIHJlbGF0aXZlIDI2IGJpdCBzaGlmdGVkLiAqLworI2RlZmluZSBSX00zMlJfSEkxNl9VTE9fUkVMQQkzOQkvKiBIaWdoIDE2IGJpdCB3aXRoIHVuc2lnbmVkIGxvdyAqLworI2RlZmluZSBSX00zMlJfSEkxNl9TTE9fUkVMQQk0MAkvKiBIaWdoIDE2IGJpdCB3aXRoIHNpZ25lZCBsb3cgKi8KKyNkZWZpbmUgUl9NMzJSX0xPMTZfUkVMQQk0MQkvKiBMb3cgMTYgYml0ICovCisjZGVmaW5lIFJfTTMyUl9TREExNl9SRUxBCTQyCS8qIDE2IGJpdCBvZmZzZXQgaW4gU0RBICovCisjZGVmaW5lIFJfTTMyUl9SRUxBX0dOVV9WVElOSEVSSVQJNDMKKyNkZWZpbmUgUl9NMzJSX1JFTEFfR05VX1ZURU5UUlkJNDQKKyNkZWZpbmUgUl9NMzJSX1JFTDMyCQk0NQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQuICAqLworCisjZGVmaW5lIFJfTTMyUl9HT1QyNAkJNDgJLyogMjQgYml0IEdPVCBlbnRyeSAqLworI2RlZmluZSBSX00zMlJfMjZfUExUUkVMCTQ5CS8qIDI2IGJpdCBQQyByZWxhdGl2ZSB0byBQTFQgc2hpZnRlZCAqLworI2RlZmluZSBSX00zMlJfQ09QWQkJNTAJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLworI2RlZmluZSBSX00zMlJfR0xPQl9EQVQJCTUxCS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9NMzJSX0pNUF9TTE9UCQk1MgkvKiBDcmVhdGUgUExUIGVudHJ5ICovCisjZGVmaW5lIFJfTTMyUl9SRUxBVElWRQkJNTMJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLworI2RlZmluZSBSX00zMlJfR09UT0ZGCQk1NAkvKiAyNCBiaXQgb2Zmc2V0IHRvIEdPVCAqLworI2RlZmluZSBSX00zMlJfR09UUEMyNAkJNTUJLyogMjQgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KKyNkZWZpbmUgUl9NMzJSX0dPVDE2X0hJX1VMTwk1NgkvKiBIaWdoIDE2IGJpdCBHT1QgZW50cnkgd2l0aCB1bnNpZ25lZAorCQkJCQkgICBsb3cgKi8KKyNkZWZpbmUgUl9NMzJSX0dPVDE2X0hJX1NMTwk1NwkvKiBIaWdoIDE2IGJpdCBHT1QgZW50cnkgd2l0aCBzaWduZWQKKwkJCQkJICAgbG93ICovCisjZGVmaW5lIFJfTTMyUl9HT1QxNl9MTwkJNTgJLyogTG93IDE2IGJpdCBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9NMzJSX0dPVFBDX0hJX1VMTwk1OQkvKiBIaWdoIDE2IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQgdG8KKwkJCQkJICAgR09UIHdpdGggdW5zaWduZWQgbG93ICovCisjZGVmaW5lIFJfTTMyUl9HT1RQQ19ISV9TTE8JNjAJLyogSGlnaCAxNiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvCisJCQkJCSAgIEdPVCB3aXRoIHNpZ25lZCBsb3cgKi8KKyNkZWZpbmUgUl9NMzJSX0dPVFBDX0xPCQk2MQkvKiBMb3cgMTYgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0bworCQkJCQkgICBHT1QgKi8KKyNkZWZpbmUgUl9NMzJSX0dPVE9GRl9ISV9VTE8JNjIJLyogSGlnaCAxNiBiaXQgb2Zmc2V0IHRvIEdPVAorCQkJCQkgICB3aXRoIHVuc2lnbmVkIGxvdyAqLworI2RlZmluZSBSX00zMlJfR09UT0ZGX0hJX1NMTwk2MwkvKiBIaWdoIDE2IGJpdCBvZmZzZXQgdG8gR09UCisJCQkJCSAgIHdpdGggc2lnbmVkIGxvdyAqLworI2RlZmluZSBSX00zMlJfR09UT0ZGX0xPCTY0CS8qIExvdyAxNiBiaXQgb2Zmc2V0IHRvIEdPVCAqLworI2RlZmluZSBSX00zMlJfTlVNCQkyNTYJLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAqLworCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBlbGYuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9lbmRpYW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdkMDMwYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZW5kaWFuLmgKQEAgLTAsMCArMSw5NiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk2LCAxOTk3LCAyMDAwLCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9FTkRJQU5fSAorI2RlZmluZQlfRU5ESUFOX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogRGVmaW5pdGlvbnMgZm9yIGJ5dGUgb3JkZXIsIGFjY29yZGluZyB0byBzaWduaWZpY2FuY2Ugb2YgYnl0ZXMsCisgICBmcm9tIGxvdyBhZGRyZXNzZXMgdG8gaGlnaCBhZGRyZXNzZXMuICBUaGUgdmFsdWUgaXMgd2hhdCB5b3UgZ2V0IGJ5CisgICBwdXR0aW5nICc0JyBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlLCAnMycgaW4gdGhlIHNlY29uZCBtb3N0CisgICBzaWduaWZpY2FudCBieXRlLCAnMicgaW4gdGhlIHNlY29uZCBsZWFzdCBzaWduaWZpY2FudCBieXRlLCBhbmQgJzEnCisgICBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSwgYW5kIHRoZW4gd3JpdGluZyBkb3duIG9uZSBkaWdpdCBmb3IKKyAgIGVhY2ggYnl0ZSwgc3RhcnRpbmcgd2l0aCB0aGUgYnl0ZSBhdCB0aGUgbG93ZXN0IGFkZHJlc3MgYXQgdGhlIGxlZnQsCisgICBhbmQgcHJvY2VlZGluZyB0byB0aGUgYnl0ZSB3aXRoIHRoZSBoaWdoZXN0IGFkZHJlc3MgYXQgdGhlIHJpZ2h0LiAgKi8KKworI2RlZmluZQlfX0xJVFRMRV9FTkRJQU4JMTIzNAorI2RlZmluZQlfX0JJR19FTkRJQU4JNDMyMQorI2RlZmluZQlfX1BEUF9FTkRJQU4JMzQxMgorCisvKiBUaGlzIGZpbGUgZGVmaW5lcyBgX19CWVRFX09SREVSJyBmb3IgdGhlIHBhcnRpY3VsYXIgbWFjaGluZS4gICovCisjaW5jbHVkZSA8Yml0cy9lbmRpYW4uaD4KKworLyogU29tZSBtYWNoaW5lcyBtYXkgbmVlZCB0byB1c2UgYSBkaWZmZXJlbnQgZW5kaWFubmVzcyBmb3IgZmxvYXRpbmcgcG9pbnQKKyAgIHZhbHVlcy4gICovCisjaWZuZGVmIF9fRkxPQVRfV09SRF9PUkRFUgorIyBkZWZpbmUgX19GTE9BVF9XT1JEX09SREVSIF9fQllURV9PUkRFUgorI2VuZGlmCisKKyNpZmRlZglfX1VTRV9CU0QKKyMgZGVmaW5lIExJVFRMRV9FTkRJQU4JX19MSVRUTEVfRU5ESUFOCisjIGRlZmluZSBCSUdfRU5ESUFOCV9fQklHX0VORElBTgorIyBkZWZpbmUgUERQX0VORElBTglfX1BEUF9FTkRJQU4KKyMgZGVmaW5lIEJZVEVfT1JERVIJX19CWVRFX09SREVSCisjZW5kaWYKKworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgZGVmaW5lIF9fTE9OR19MT05HX1BBSVIoSEksIExPKSBMTywgSEkKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyMgZGVmaW5lIF9fTE9OR19MT05HX1BBSVIoSEksIExPKSBISSwgTE8KKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIENvbnZlcnNpb24gaW50ZXJmYWNlcy4gICovCisjIGluY2x1ZGUgPGJpdHMvYnl0ZXN3YXAuaD4KKworIyBpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjICBkZWZpbmUgaHRvYmUxNih4KSBfX2Jzd2FwXzE2ICh4KQorIyAgZGVmaW5lIGh0b2xlMTYoeCkgKHgpCisjICBkZWZpbmUgYmUxNnRvaCh4KSBfX2Jzd2FwXzE2ICh4KQorIyAgZGVmaW5lIGxlMTZ0b2goeCkgKHgpCisKKyMgIGRlZmluZSBodG9iZTMyKHgpIF9fYnN3YXBfMzIgKHgpCisjICBkZWZpbmUgaHRvbGUzMih4KSAoeCkKKyMgIGRlZmluZSBiZTMydG9oKHgpIF9fYnN3YXBfMzIgKHgpCisjICBkZWZpbmUgbGUzMnRvaCh4KSAoeCkKKworIyAgZGVmaW5lIGh0b2JlNjQoeCkgX19ic3dhcF82NCAoeCkKKyMgIGRlZmluZSBodG9sZTY0KHgpICh4KQorIyAgZGVmaW5lIGJlNjR0b2goeCkgX19ic3dhcF82NCAoeCkKKyMgIGRlZmluZSBsZTY0dG9oKHgpICh4KQorIyBlbHNlCisjICBkZWZpbmUgaHRvYmUxNih4KSAoeCkKKyMgIGRlZmluZSBodG9sZTE2KHgpIF9fYnN3YXBfMTYgKHgpCisjICBkZWZpbmUgYmUxNnRvaCh4KSAoeCkKKyMgIGRlZmluZSBsZTE2dG9oKHgpIF9fYnN3YXBfMTYgKHgpCisKKyMgIGRlZmluZSBodG9iZTMyKHgpICh4KQorIyAgZGVmaW5lIGh0b2xlMzIoeCkgX19ic3dhcF8zMiAoeCkKKyMgIGRlZmluZSBiZTMydG9oKHgpICh4KQorIyAgZGVmaW5lIGxlMzJ0b2goeCkgX19ic3dhcF8zMiAoeCkKKworIyAgZGVmaW5lIGh0b2JlNjQoeCkgKHgpCisjICBkZWZpbmUgaHRvbGU2NCh4KSBfX2Jzd2FwXzY0ICh4KQorIyAgZGVmaW5lIGJlNjR0b2goeCkgKHgpCisjICBkZWZpbmUgbGU2NHRvaCh4KSBfX2Jzd2FwXzY0ICh4KQorIyBlbmRpZgorI2VuZGlmCisKKyNlbmRpZgkvKiBlbmRpYW4uaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9lbnZ6LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2VudnouaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTQyZGVkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9lbnZ6LmgKQEAgLTAsMCArMSw3NCBAQAorLyogUm91dGluZXMgZm9yIGRlYWxpbmcgd2l0aCAnXDAnIHNlcGFyYXRlZCBlbnZpcm9ubWVudCB2ZWN0b3JzCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDk2LCA5OCwgOTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0VOVlpfSAorI2RlZmluZSBfRU5WWl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisvKiBFbnZ6J3MgYXJlIGFyZ3oncyB0b28sIGFuZCBzaG91bGQgYmUgY3JlYXRlZCBldGMuLCB1c2luZyB0aGUgc2FtZQorICAgcm91dGluZXMuICAqLworI2luY2x1ZGUgPGFyZ3ouaD4KKworX19CRUdJTl9ERUNMUworCisvKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZW50cnkgaW4gRU5WWiBmb3IgTkFNRSwgb3IgMCBpZiB0aGVyZSBpcyBub25lLiAgKi8KK2V4dGVybiBjaGFyICplbnZ6X2VudHJ5IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19lbnZ6LCBzaXplX3QgX19lbnZ6X2xlbiwKKwkJCSBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXzsKKworLyogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlIHBvcnRpb24gb2YgdGhlIGVudHJ5IGluIEVOVlogZm9yIE5BTUUsIG9yIDAKKyAgIGlmIHRoZXJlIGlzIG5vbmUuICAqLworZXh0ZXJuIGNoYXIgKmVudnpfZ2V0IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19lbnZ6LCBzaXplX3QgX19lbnZ6X2xlbiwKKwkJICAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworCisvKiBBZGRzIGFuIGVudHJ5IGZvciBOQU1FIHdpdGggdmFsdWUgVkFMVUUgdG8gRU5WWiAmIEVOVlpfTEVOLiAgSWYgYW4gZW50cnkKKyAgIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiBFTlZaLCBpdCBpcyByZW1vdmVkLiAgSWYgVkFMVUUgaXMKKyAgIE5VTEwsIHRoZW4gdGhlIG5ldyBlbnRyeSB3aWxsIGEgc3BlY2lhbCBudWxsIG9uZSwgZm9yIHdoaWNoIGVudnpfZ2V0IHdpbGwKKyAgIHJldHVybiBOVUxMLCBhbHRob3VnaCBlbnZ6X2VudHJ5IHdpbGwgc3RpbGwgcmV0dXJuIGFuIGVudHJ5OyB0aGlzIGlzIGhhbmR5CisgICBiZWNhdXNlIHdoZW4gbWVyZ2luZyB3aXRoIGFub3RoZXIgZW52eiwgdGhlIG51bGwgZW50cnkgY2FuIG92ZXJyaWRlIGFuCisgICBlbnRyeSBpbiB0aGUgb3RoZXIgb25lLiAgTnVsbCBlbnRyaWVzIGNhbiBiZSByZW1vdmVkIHdpdGggZW52el9zdHJpcCAoKS4gICovCitleHRlcm4gZXJyb3JfdCBlbnZ6X2FkZCAoY2hhciAqKl9fcmVzdHJpY3QgX19lbnZ6LAorCQkJIHNpemVfdCAqX19yZXN0cmljdCBfX2VudnpfbGVuLAorCQkJIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCQkgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fdmFsdWUpIF9fVEhST1c7CisKKy8qIEFkZHMgZWFjaCBlbnRyeSBpbiBFTlZaMiB0byBFTlZaICYgRU5WWl9MRU4sIGFzIGlmIHdpdGggZW52el9hZGQoKS4gIElmCisgICBPVkVSUklERSBpcyB0cnVlLCB0aGVuIHZhbHVlcyBpbiBFTlZaMiB3aWxsIHN1cGVyc2VkZSB0aG9zZSB3aXRoIHRoZSBzYW1lCisgICBuYW1lIGluIEVOViwgb3RoZXJ3aXNlIG5vdC4gICovCitleHRlcm4gZXJyb3JfdCBlbnZ6X21lcmdlIChjaGFyICoqX19yZXN0cmljdCBfX2VudnosCisJCQkgICBzaXplX3QgKl9fcmVzdHJpY3QgX19lbnZ6X2xlbiwKKwkJCSAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2VudnoyLAorCQkJICAgc2l6ZV90IF9fZW52ejJfbGVuLCBpbnQgX19vdmVycmlkZSkgX19USFJPVzsKKworLyogUmVtb3ZlIHRoZSBlbnRyeSBmb3IgTkFNRSBmcm9tIEVOVlogJiBFTlZaX0xFTiwgaWYgYW55LiAgKi8KK2V4dGVybiB2b2lkIGVudnpfcmVtb3ZlIChjaGFyICoqX19yZXN0cmljdCBfX2VudnosCisJCQkgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fZW52el9sZW4sCisJCQkgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSkgX19USFJPVzsKKworLyogUmVtb3ZlIG51bGwgZW50cmllcy4gICovCitleHRlcm4gdm9pZCBlbnZ6X3N0cmlwIChjaGFyICoqX19yZXN0cmljdCBfX2VudnosCisJCQlzaXplX3QgKl9fcmVzdHJpY3QgX19lbnZ6X2xlbikgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGVudnouaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9lcnIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZXJyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmMzU1MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZXJyLmgKQEAgLTAsMCArMSw1OCBAQAorLyogNC40QlNEIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBlcnJvciBtZXNzYWdlcy4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwxOTk2LDE5OTcsMTk5OCwxOTk5LDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX0VSUl9ICisjZGVmaW5lCV9FUlJfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZGVmaW5lCV9fbmVlZF9fX3ZhX2xpc3QKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpZm5kZWYJX19HTlVDX1ZBX0xJU1QKKyMgZGVmaW5lIF9fZ251Y192YV9saXN0CV9fcHRyX3QKKyNlbmRpZgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFByaW50ICJwcm9ncmFtOiAiLCBGT1JNQVQsICI6ICIsIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJpbmcgZm9yIGVycm5vLAorICAgYW5kIGEgbmV3bGluZSwgb24gc3RkZXJyLiAgKi8KK2V4dGVybiB2b2lkIHdhcm4gKF9fY29uc3QgY2hhciAqX19mb3JtYXQsIC4uLikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDEsIDIpKSk7CitleHRlcm4gdm9pZCB2d2FybiAoX19jb25zdCBjaGFyICpfX2Zvcm1hdCwgX19nbnVjX3ZhX2xpc3QpCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAxLCAwKSkpOworCisvKiBMaWtld2lzZSwgYnV0IHdpdGhvdXQgIjogIiBhbmQgdGhlIHN0YW5kYXJkIGVycm9yIHN0cmluZy4gICovCitleHRlcm4gdm9pZCB3YXJueCAoX19jb25zdCBjaGFyICpfX2Zvcm1hdCwgLi4uKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMSwgMikpKTsKK2V4dGVybiB2b2lkIHZ3YXJueCAoX19jb25zdCBjaGFyICpfX2Zvcm1hdCwgX19nbnVjX3ZhX2xpc3QpCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAxLCAwKSkpOworCisvKiBMaWtld2lzZSwgYW5kIHRoZW4gZXhpdCB3aXRoIFNUQVRVUy4gICovCitleHRlcm4gdm9pZCBlcnIgKGludCBfX3N0YXR1cywgX19jb25zdCBjaGFyICpfX2Zvcm1hdCwgLi4uKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fLCBfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAyLCAzKSkpOworZXh0ZXJuIHZvaWQgdmVyciAoaW50IF9fc3RhdHVzLCBfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCBfX2dudWNfdmFfbGlzdCkKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXywgX19mb3JtYXRfXyAoX19wcmludGZfXywgMiwgMCkpKTsKK2V4dGVybiB2b2lkIGVycnggKGludCBfX3N0YXR1cywgX19jb25zdCBjaGFyICpfX2Zvcm1hdCwgLi4uKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fLCBfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAyLCAzKSkpOworZXh0ZXJuIHZvaWQgdmVycnggKGludCBfX3N0YXR1cywgX19jb25zdCBjaGFyICosIF9fZ251Y192YV9saXN0KQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fLCBfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAyLCAwKSkpOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogZXJyLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZXJybm8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZXJybm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzNiMGM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9lcnJuby5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSw5Miw5Myw5NCw5NSw5Niw5NywyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJSVNPIEM5OSBTdGFuZGFyZDogNy41IEVycm9ycwk8ZXJybm8uaD4KKyAqLworCisjaWZuZGVmCV9FUlJOT19ICisKKy8qIFRoZSBpbmNsdWRlciBkZWZpbmVkIF9fbmVlZF9FbWF0aCBpZiBoZSB3YW50cyBvbmx5IHRoZSBkZWZpbml0aW9ucworICAgb2YgRURPTSBhbmQgRVJBTkdFLCBhbmQgbm90IGV2ZXJ5dGhpbmcgZWxzZS4gICovCisjaWZuZGVmCV9fbmVlZF9FbWF0aAorIyBkZWZpbmUgX0VSUk5PX0gJMQorIyBpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2VuZGlmCisKK19fQkVHSU5fREVDTFMKKworLyogR2V0IHRoZSBlcnJvciBudW1iZXIgY29uc3RhbnRzIGZyb20gdGhlIHN5c3RlbS1zcGVjaWZpYyBmaWxlLgorICAgVGhpcyBmaWxlIHdpbGwgdGVzdCBfX25lZWRfRW1hdGggYW5kIF9FUlJOT19ILiAgKi8KKyNpbmNsdWRlIDxiaXRzL2Vycm5vLmg+CisjdW5kZWYJX19uZWVkX0VtYXRoCisKKyNpZmRlZglfRVJSTk9fSAorCisvKiBEZWNsYXJlIHRoZSBgZXJybm8nIHZhcmlhYmxlLCB1bmxlc3MgaXQncyBkZWZpbmVkIGFzIGEgbWFjcm8gYnkKKyAgIGJpdHMvZXJybm8uaC4gIFRoaXMgaXMgdGhlIGNhc2UgaW4gR05VLCB3aGVyZSBpdCBpcyBhIHBlci10aHJlYWQKKyAgIHZhcmlhYmxlLiAgVGhpcyByZWRlY2xhcmF0aW9uIHVzaW5nIHRoZSBtYWNybyBzdGlsbCB3b3JrcywgYnV0IGl0CisgICB3aWxsIGJlIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gd2l0aG91dCBhIHByb3RvdHlwZSBhbmQgbWF5IHRyaWdnZXIKKyAgIGEgLVdzdHJpY3QtcHJvdG90eXBlcyB3YXJuaW5nLiAgKi8KKyNpZm5kZWYJZXJybm8KK2V4dGVybiBpbnQgZXJybm87CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorCisvKiBUaGUgZnVsbCBhbmQgc2ltcGxlIGZvcm1zIG9mIHRoZSBuYW1lIHdpdGggd2hpY2ggdGhlIHByb2dyYW0gd2FzCisgICBpbnZva2VkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzZXQgdXAgYXV0b21hdGljYWxseSBhdCBzdGFydHVwIGJhc2VkIG9uCisgICB0aGUgdmFsdWUgb2YgQVJHVlswXSAodGhpcyB3b3JrcyBvbmx5IGlmIHlvdSB1c2UgR05VIGxkKS4gICovCitleHRlcm4gY2hhciAqcHJvZ3JhbV9pbnZvY2F0aW9uX25hbWUsICpwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZTsKKyNlbmRpZiAvKiBfX1VTRV9HTlUgKi8KKyNlbmRpZiAvKiBfRVJSTk9fSCAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogX0VSUk5PX0ggKi8KKworLyogVGhlIEh1cmQgPGJpdHMvZXJybm8uaD4gZGVmaW5lcyBgZXJyb3JfdCcgYXMgYW4gZW51bWVyYXRlZCB0eXBlIHNvCisgICB0aGF0IHByaW50aW5nIGBlcnJvcl90JyB2YWx1ZXMgaW4gdGhlIGRlYnVnZ2VyIHNob3dzIHRoZSBuYW1lcy4gIFdlCisgICBtaWdodCBuZWVkIHRoaXMgZGVmaW5pdGlvbiBzb21ldGltZXMgZXZlbiBpZiB0aGlzIGZpbGUgd2FzIGluY2x1ZGVkCisgICBiZWZvcmUuICAqLworI2lmIGRlZmluZWQgX19VU0VfR05VIHx8IGRlZmluZWQgX19uZWVkX2Vycm9yX3QKKyMgaWZuZGVmIF9fZXJyb3JfdF9kZWZpbmVkCit0eXBlZGVmIGludCBlcnJvcl90OworIyAgZGVmaW5lIF9fZXJyb3JfdF9kZWZpbmVkCTEKKyMgZW5kaWYKKyMgdW5kZWYgX19uZWVkX2Vycm9yX3QKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9lcnJvci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9lcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMzIxZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Vycm9yLmgKQEAgLTAsMCArMSw1OCBAQAorLyogRGVjbGFyYXRpb24gZm9yIGVycm9yLXJlcG9ydGluZyBmdW5jdGlvbgorICAgQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NywyMDAzLDIwMDYsMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfRVJST1JfSAorI2RlZmluZSBfRVJST1JfSCAxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogUHJpbnQgYSBtZXNzYWdlIHdpdGggYGZwcmludGYgKHN0ZGVyciwgRk9STUFULCAuLi4pJzsKKyAgIGlmIEVSUk5VTSBpcyBub256ZXJvLCBmb2xsb3cgaXQgd2l0aCAiOiAiIGFuZCBzdHJlcnJvciAoRVJSTlVNKS4KKyAgIElmIFNUQVRVUyBpcyBub256ZXJvLCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0gd2l0aCBgZXhpdCAoU1RBVFVTKScuICAqLworCitleHRlcm4gdm9pZCBlcnJvciAoaW50IF9fc3RhdHVzLCBpbnQgX19lcnJudW0sIF9fY29uc3QgY2hhciAqX19mb3JtYXQsIC4uLikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDQpKSk7CisKK2V4dGVybiB2b2lkIGVycm9yX2F0X2xpbmUgKGludCBfX3N0YXR1cywgaW50IF9fZXJybnVtLCBfX2NvbnN0IGNoYXIgKl9fZm5hbWUsCisJCQkgICB1bnNpZ25lZCBpbnQgX19saW5lbm8sIF9fY29uc3QgY2hhciAqX19mb3JtYXQsIC4uLikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDUsIDYpKSk7CisKKy8qIElmIE5VTEwsIGVycm9yIHdpbGwgZmx1c2ggc3Rkb3V0LCB0aGVuIHByaW50IG9uIHN0ZGVyciB0aGUgcHJvZ3JhbQorICAgbmFtZSwgYSBjb2xvbiBhbmQgYSBzcGFjZS4gIE90aGVyd2lzZSwgZXJyb3Igd2lsbCBjYWxsIHRoaXMKKyAgIGZ1bmN0aW9uIHdpdGhvdXQgcGFyYW1ldGVycyBpbnN0ZWFkLiAgKi8KK2V4dGVybiB2b2lkICgqZXJyb3JfcHJpbnRfcHJvZ25hbWUpICh2b2lkKTsKKworLyogVGhpcyB2YXJpYWJsZSBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgYGVycm9yJyBpcyBjYWxsZWQuICAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBlcnJvcl9tZXNzYWdlX2NvdW50OworCisvKiBTb21ldGltZXMgd2Ugd2FudCB0byBoYXZlIGF0IG1vc3Qgb25lIGVycm9yIHBlciBsaW5lLiAgVGhpcworICAgdmFyaWFibGUgY29udHJvbHMgd2hldGhlciB0aGlzIG1vZGUgaXMgc2VsZWN0ZWQgb3Igbm90LiAgKi8KK2V4dGVybiBpbnQgZXJyb3Jfb25lX3Blcl9saW5lOworCisKKyNpZiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgJiYgZGVmaW5lZCBfX3ZhX2FyZ19wYWNrCisjIGluY2x1ZGUgPGJpdHMvZXJyb3IuaD4KKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogZXJyb3IuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9lc2QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZXNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFjNDBlOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZXNkLmgKQEAgLTAsMCArMSwzNDIgQEAKKyNpZm5kZWYgRVNEX0gKKyNkZWZpbmUgRVNEX0gKKyNpbmNsdWRlIDxhdWRpb2ZpbGUuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBwYXRoIGFuZCBuYW1lIG9mIHRoZSBkZWZhdWx0IEVzb3VuRCBkb21haW4gc29ja2V0ICovCisjZGVmaW5lIEVTRF9VTklYX1NPQ0tFVF9ESVIJZXNkX2dldF9zb2NrZXRfZGlybmFtZSgpCisjZGVmaW5lIEVTRF9VTklYX1NPQ0tFVF9OQU1FCWVzZF9nZXRfc29ja2V0X25hbWUoKQorCisvKiBzaXplIG9mIHRoZSBhdWRpbyBidWZmZXIgKi8KKyNkZWZpbmUgRVNEX0JVRl9TSVpFICg0ICogMTAyNCkKKy8qIG1heGltdW0gc2l6ZSB3ZSBjYW4gd3JpdGUoKS4gIE90aGVyd2lzZSB3ZSBtaWdodCBvdmVyZmxvdyAqLworI2RlZmluZSBFU0RfTUFYX1dSSVRFX1NJWkUgKDIxICogNDA5NikKKworLyogbGVuZ3RoIG9mIHRoZSBhdXRob3JpemF0aW9uIGtleSwgb2N0ZXRzICovCisjZGVmaW5lIEVTRF9LRVlfTEVOICgxNikKKworLyogZGVmYXVsdCBwb3J0IGZvciB0aGUgRXNvdW5EIHNlcnZlciAqLworI2RlZmluZSBFU0RfREVGQVVMVF9QT1JUICgxNjAwMSkKKworLyogZGVmYXVsdCBzYW1wbGUgcmF0ZSBmb3IgdGhlIEVzb3VuRCBzZXJ2ZXIgKi8KKyNkZWZpbmUgRVNEX0RFRkFVTFRfUkFURSAoNDQxMDApCisKKy8qIG1heGltdW0gbGVuZ3RoIG9mIGEgc3RyZWFtL3NhbXBsZSBuYW1lICovCisjZGVmaW5lIEVTRF9OQU1FX01BWCAoMTI4KQorCisvKiBhIG1hZ2ljIG51bWJlciB0byBpZGVudGlmeSB0aGUgcmVsYXRpdmUgZW5kaWFubmVzcyBvZiBhIGNsaWVudCAqLworI2RlZmluZSBFU0RfRU5ESUFOX0tFWSBcCisJKCAodW5zaWduZWQgaW50KSAoICgnRScgPDwgMjQpICsgKCdOJyA8PCAxNikgKyAoJ0QnIDw8IDgpICsgKCdOJykgKSApCisKKyNkZWZpbmUgRVNEX1ZPTFVNRV9CQVNFICgyNTYpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogd2hhdCBjYW4gd2UgZG8gdG8vd2l0aCB0aGUgRXNvdW5EICovCitlbnVtIGVzZF9wcm90byB7IAorICAgIEVTRF9QUk9UT19DT05ORUNULCAgICAgIC8qIGltcGxpZWQgb24gaW5pdGFsIGNsaWVudCBjb25uZWN0aW9uICovCisKKyAgICAvKiBwc2V1ZG8gInNlY3VyaXR5IiBmdW5jdGlvbmFsaXR5ICovCisgICAgRVNEX1BST1RPX0xPQ0ssCSAgICAvKiBkaXNhYmxlICJmb3JlaWduIiBjbGllbnQgY29ubmVjdGlvbnMgKi8KKyAgICBFU0RfUFJPVE9fVU5MT0NLLAkgICAgLyogZW5hYmxlICJmb3JlaWduIiBjbGllbnQgY29ubmVjdGlvbnMgKi8KKworICAgIC8qIHN0cmVhbSBmdW5jdGlvbmFsaXR5OiBwbGF5LCByZWNvcmQsIG1vbml0b3IgKi8KKyAgICBFU0RfUFJPVE9fU1RSRUFNX1BMQVksICAvKiBwbGF5IGFsbCBmb2xsb3dpbmcgZGF0YSBhcyBhIHN0cmVhbSAqLworICAgIEVTRF9QUk9UT19TVFJFQU1fUkVDLCAgIC8qIHJlY29yZCBkYXRhIGZyb20gY2FyZCBhcyBhIHN0cmVhbSAqLworICAgIEVTRF9QUk9UT19TVFJFQU1fTU9OLCAgIC8qIHNlbmQgbWl4ZWQgYnVmZmVyIG91dHB1dCBhcyBhIHN0cmVhbSAqLworCisgICAgLyogc2FtcGxlIGZ1bmN0aW9uYWxpdHk6IGNhY2hlLCBmcmVlLCBwbGF5LCBsb29wLCBFT0wsIGtpbGwgKi8KKyAgICBFU0RfUFJPVE9fU0FNUExFX0NBQ0hFLCAvKiBjYWNoZSBhIHNhbXBsZSBpbiB0aGUgc2VydmVyICovCisgICAgRVNEX1BST1RPX1NBTVBMRV9GUkVFLCAgLyogcmVsZWFzZSBhIHNhbXBsZSBpbiB0aGUgc2VydmVyICovCisgICAgRVNEX1BST1RPX1NBTVBMRV9QTEFZLCAgLyogcGxheSBhIGNhY2hlZCBzYW1wbGUgKi8KKyAgICBFU0RfUFJPVE9fU0FNUExFX0xPT1AsICAvKiBsb29wIGEgY2FjaGVkIHNhbXBsZSwgdGlsIGVvbG9vcCAqLworICAgIEVTRF9QUk9UT19TQU1QTEVfU1RPUCwgIC8qIHN0b3AgYSBsb29waW5nIHNhbXBsZSB3aGVuIGRvbmUgKi8KKyAgICBFU0RfUFJPVE9fU0FNUExFX0tJTEwsICAvKiBzdG9wIHRoZSBsb29waW5nIHNhbXBsZSBpbW1lZC4gKi8KKworICAgIC8qIGZyZWUgYW5kIHJlY2xhaW0gL2Rldi9kc3AgZnVuY3Rpb25hbGl0eSAqLworICAgIEVTRF9QUk9UT19TVEFOREJZLAkgICAgLyogcmVsZWFzZSAvZGV2L2RzcCBhbmQgaWdub3JlIGFsbCBkYXRhICovCisgICAgRVNEX1BST1RPX1JFU1VNRSwJICAgIC8qIHJlY2xhaW0gL2Rldi9kc3AgYW5kIHBsYXkgc291bmRzIGFnYWluICovCisKKyAgICAvKiBUT0RPOiBtb3ZlIHRoZXNlIHRvIGEgbW9yZSBsb2dpY2FsIHBsYWNlLiBOT1RFOiB3aWxsIGJyZWFrIHRoZSBwcm90b2NvbCAqLworICAgIEVTRF9QUk9UT19TQU1QTEVfR0VUSUQsIC8qIGdldCB0aGUgSUQgZm9yIGFuIGFscmVhZHktY2FjaGVkIHNhbXBsZSAqLworICAgIEVTRF9QUk9UT19TVFJFQU1fRklMVCwgIC8qIGZpbHRlciBtaXhlZCBidWZmZXIgb3V0cHV0IGFzIGEgc3RyZWFtICovCisKKyAgICAvKiBlc2QgcmVtb3RlIG1hbmFnZW1lbnQgKi8KKyAgICBFU0RfUFJPVE9fU0VSVkVSX0lORk8sICAvKiBnZXQgc2VydmVyIGluZm8gKHZlciwgc2FtcGxlIHJhdGUsIGZvcm1hdCkgKi8KKyAgICBFU0RfUFJPVE9fQUxMX0lORk8sICAgICAvKiBnZXQgYWxsIGluZm8gKHNlcnZlciBpbmZvLCBwbGF5ZXJzLCBzYW1wbGVzKSAqLworICAgIEVTRF9QUk9UT19TVUJTQ1JJQkUsICAgIC8qIHRyYWNrIG5ldyBhbmQgcmVtb3ZlZCBwbGF5ZXJzIGFuZCBzYW1wbGVzICovCisgICAgRVNEX1BST1RPX1VOU1VCU0NSSUJFLCAgLyogc3RvcCB0cmFja2luZyB1cGRhdGVzICovCisKKyAgICAvKiBlc2QgcmVtb3RlIGNvbnRyb2wgKi8KKyAgICBFU0RfUFJPVE9fU1RSRUFNX1BBTiwgICAvKiBzZXQgc3RyZWFtIHBhbm5pbmcgKi8KKyAgICBFU0RfUFJPVE9fU0FNUExFX1BBTiwgICAvKiBzZXQgZGVmYXVsdCBzYW1wbGUgcGFubmluZyAqLworCisgICAgLyogZXNkIHN0YXR1cyAqLworICAgIEVTRF9QUk9UT19TVEFOREJZX01PREUsIC8qIHNlZSBpZiBzZXJ2ZXIgaXMgaW4gc3RhbmRieSwgYXV0b3N0YW5kYnksIGV0YyAqLworCisgICAgLyogZXNkIGxhdGVuY3kgKi8KKyAgICBFU0RfUFJPVE9fTEFURU5DWSwgICAgICAvKiByZXRyaWV2ZSBsYXRlbmN5IGJldHdlZW4gd3JpdGUoKSdzIGFuZCBvdXRwdXQgKi8KKyAgCisgICAgRVNEX1BST1RPX01BWCAgICAgICAgICAgLyogZm9yIGJvdW5kcyBjaGVja2luZyAqLworfTsKKyAgICAKKworLyoqKioqKioqKioqKioqKioqKi8KKy8qIFRoZSBFc291bkQgYXBpICovCisKKy8qIHRoZSBwcm9wZXJ0aWVzIG9mIGEgc291bmQgYnVmZmVyIGFyZSBsb2dpY2FsbHkgb3InZCAqLworCisvKiBiaXRzIG9mIHN0cmVhbS9zYW1wbGUgZGF0YSAqLworI2RlZmluZSBFU0RfTUFTS19CSVRTCSggMHgwMDBGICkKKyNkZWZpbmUgRVNEX0JJVFM4IAkoIDB4MDAwMCApCisjZGVmaW5lIEVTRF9CSVRTMTYJKCAweDAwMDEgKQorCisvKiBob3cgbWFueSBpbnRlcmxlYXZlZCBjaGFubmVscyBvZiBkYXRhICovCisjZGVmaW5lIEVTRF9NQVNLX0NIQU4JKCAweDAwRjAgKQorI2RlZmluZSBFU0RfTU9OTwkoIDB4MDAxMCApCisjZGVmaW5lIEVTRF9TVEVSRU8JKCAweDAwMjAgKQorCisvKiB3aGV0aGVyIGl0J3MgYSBzdHJlYW0gb3IgYSBzYW1wbGUgKi8KKyNkZWZpbmUgRVNEX01BU0tfTU9ERQkoIDB4MEYwMCApCisjZGVmaW5lIEVTRF9TVFJFQU0JKCAweDAwMDAgKQorI2RlZmluZSBFU0RfU0FNUExFCSggMHgwMTAwICkKKyNkZWZpbmUgRVNEX0FEUENNCSggMHgwMjAwICkJLyogVE9ETzogYW55b25lIHVwIGZvciB0aGlzPyA9UCAqLworCisvKiB0aGUgZnVuY3Rpb24gb2YgdGhlIHN0cmVhbS9zYW1wbGUsIGFuZCBjb21tb24gZnVuY3Rpb25zICovCisjZGVmaW5lIEVTRF9NQVNLX0ZVTkMJKCAweEYwMDAgKQorI2RlZmluZSBFU0RfUExBWQkoIDB4MTAwMCApCisvKiBmdW5jdGlvbnMgZm9yIHN0cmVhbXMgb25seSAqLworI2RlZmluZSBFU0RfTU9OSVRPUgkoIDB4MDAwMCApCisjZGVmaW5lIEVTRF9SRUNPUkQJKCAweDIwMDAgKQorLyogZnVuY3Rpb25zIGZvciBzYW1wbGVzIG9ubHkgKi8KKyNkZWZpbmUgRVNEX1NUT1AJKCAweDAwMDAgKQorI2RlZmluZSBFU0RfTE9PUAkoIDB4MjAwMCApCisKK3R5cGVkZWYgaW50IGVzZF9mb3JtYXRfdDsKK3R5cGVkZWYgaW50IGVzZF9wcm90b190OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGNsaWVudCBzaWRlIEFQSSBmb3IgcGxheWluZyBzb3VuZHMgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIG9jdGV0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGVzZGxpYi5jIC0gYmFzaWMgZXNkIGNsaWVudCBpbnRlcmZhY2UgZnVuY3Rpb25zICovCisKKy8qIG9wZW5zIGNoYW5uZWwsIGF1dGhlbnRpY2F0ZXMgY29ubmVjdGlvbiwgYW5kIHByZWZhcmVzIGZvciBwcm90b3MgKi8KKy8qIHJldHVybnMgRXNvdW5EIHNvY2tldCBmb3IgY29tbXVuaWNhdGlvbiwgcmVzdWx0IDwgMCA9IGVycm9yICovCisvKiBzZXJ2ZXIgPSBsaXN0ZW4gc29ja2V0IChsb2NhbGhvc3Q6NTAwMSwgMTkyLjE2OC4xNjguMDo5OTk5ICovCisvKiByYXRlLCBmb3JtYXQgPSAoYml0cyB8IGNoYW5uZWxzIHwgc3RyZWFtIHwgZnVuYykgKi8KK2ludCBlc2Rfb3Blbl9zb3VuZCggY29uc3QgY2hhciAqaG9zdCApOworCisvKiBzZW5kIHRoZSBhdXRob3JpemF0aW9uIGNvb2tpZSwgY3JlYXRlIG9uZSBpZiBuZWVkZWQgKi8KK2ludCBlc2Rfc2VuZF9hdXRoKCBpbnQgc29jayApOworCisvKiBsb2NrL3VubG9jayB3aWxsIGRpc2FibGUvZW5hYmxlIGZvcmVpZ24gY2xpZW50cyBmcm9tIGNvbm5lY3RpbmcgKi8KK2ludCBlc2RfbG9jayggaW50IGVzZCApOworaW50IGVzZF91bmxvY2soIGludCBlc2QgKTsKKworLyogc3RhbmRieS9yZXN1bWUgd2lsbCBmcmVlL3JlY2xhaW0gYXVkaW8gZGV2aWNlIHNvIG90aGVycyBtYXkgdXNlIGl0ICovCitpbnQgZXNkX3N0YW5kYnkoIGludCBlc2QgKTsKK2ludCBlc2RfcmVzdW1lKCBpbnQgZXNkICk7CisKKy8qIG9wZW4gYSBzb2NrZXQgZm9yIHBsYXlpbmcsIG1vbml0b3JpbmcsIG9yIHJlY29yZGluZyBhcyBhIHN0cmVhbSAqLworLyogdGhlICpfZmFsbGJhY2sgZnVuY3Rpb25zIHRyeSB0byBvcGVuIC9kZXYvZHNwIGlmIHRoZXJlJ3Mgbm8gRXNvdW5EICovCitpbnQgZXNkX3BsYXlfc3RyZWFtKCBlc2RfZm9ybWF0X3QgZm9ybWF0LCBpbnQgcmF0ZSwgCisJCSAgICAgY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqbmFtZSApOworaW50IGVzZF9wbGF5X3N0cmVhbV9mYWxsYmFjayggZXNkX2Zvcm1hdF90IGZvcm1hdCwgaW50IHJhdGUsIAorCQkJICAgICAgY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqbmFtZSApOworaW50IGVzZF9tb25pdG9yX3N0cmVhbSggZXNkX2Zvcm1hdF90IGZvcm1hdCwgaW50IHJhdGUsIAorCQkJY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqbmFtZSApOworLyogaW50IGVzZF9tb25pdG9yX3N0cmVhbV9mYWxsYmFjayggZXNkX2Zvcm1hdF90IGZvcm1hdCwgaW50IHJhdGUgKTsgKi8KK2ludCBlc2RfcmVjb3JkX3N0cmVhbSggZXNkX2Zvcm1hdF90IGZvcm1hdCwgaW50IHJhdGUsIAorCQkgICAgICAgY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqbmFtZSApOworaW50IGVzZF9yZWNvcmRfc3RyZWFtX2ZhbGxiYWNrKCBlc2RfZm9ybWF0X3QgZm9ybWF0LCBpbnQgcmF0ZSwgCisJCQkJY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqbmFtZSApOworaW50IGVzZF9maWx0ZXJfc3RyZWFtKCBlc2RfZm9ybWF0X3QgZm9ybWF0LCBpbnQgcmF0ZSwgCisJCSAgICAgICBjb25zdCBjaGFyICpob3N0LCBjb25zdCBjaGFyICpuYW1lICk7CisKKy8qIGNhY2hlIGEgc2FtcGxlIGluIHRoZSBzZXJ2ZXIgcmV0dXJucyBzYW1wbGUgaWQsIDwgMCA9IGVycm9yICovCitpbnQgZXNkX3NhbXBsZV9jYWNoZSggaW50IGVzZCwgZXNkX2Zvcm1hdF90IGZvcm1hdCwgY29uc3QgaW50IHJhdGUsIAorCQkgICAgICBjb25zdCBpbnQgbGVuZ3RoLCBjb25zdCBjaGFyICpuYW1lICk7CitpbnQgZXNkX2NvbmZpcm1fc2FtcGxlX2NhY2hlKCBpbnQgZXNkICk7CisKKy8qIGdldCB0aGUgc2FtcGxlIGlkIGZvciBhbiBhbHJlYWR5LWNhY2hlZCBzYW1wbGUgKi8KK2ludCBlc2Rfc2FtcGxlX2dldGlkKCBpbnQgZXNkLCBjb25zdCBjaGFyICpuYW1lKTsKKworLyogdW5jYWNoZSBhIHNhbXBsZSBpbiB0aGUgc2VydmVyICovCitpbnQgZXNkX3NhbXBsZV9mcmVlKCBpbnQgZXNkLCBpbnQgc2FtcGxlICk7CisKKy8qIHBsYXkgYSBjYWNoZWQgc2FtcGxlIG9uY2UgKi8KK2ludCBlc2Rfc2FtcGxlX3BsYXkoIGludCBlc2QsIGludCBzYW1wbGUgKTsKKy8qIG1ha2UgYSBjYWNoZWQgc2FtcGxlIGxvb3AgKi8KK2ludCBlc2Rfc2FtcGxlX2xvb3AoIGludCBlc2QsIGludCBzYW1wbGUgKTsKKworLyogc3RvcCB0aGUgbG9vcGluZyBzYW1wbGUgYXQgZW5kICovCitpbnQgZXNkX3NhbXBsZV9zdG9wKCBpbnQgZXNkLCBpbnQgc2FtcGxlICk7CisvKiBzdG9wIGEgcGxheWluZyBzYW1wbGUgaW1tZWQuICovCitpbnQgZXNkX3NhbXBsZV9raWxsKCBpbnQgZXNkLCBpbnQgc2FtcGxlICk7CisKKy8qIGNsb3NlcyBmZCwgcHJldmlvdXNseSBvYnRhaW5lZCBieSBlc2Rfb3BlbiAqLworaW50IGVzZF9jbG9zZSggaW50IGVzZCApOworCisvKiBnZXQgdGhlIHN0cmVhbSBsYXRlbmN5IHRvIGVzb3VuZCAobGF0ZW5jeSBpcyBudW1iZXIgb2Ygc2FtcGxlcyAgKi8KKy8qIGF0IDQ0LjFraHogc3RlcmVvIDE2IGJpdCAtIHlvdSdsbCBoYXZlIHRvIGFkanVzdCBpZiBveXVyIGlucHV0ICAqLworLyogc2FtcGxpbmcgcmF0ZSBpcyBsZXNzIChpbiBieXRlcyBwZXIgc2Vjb25kKSAgICAgICAgICAgICAgICAgICAgICovCisvKiBzbyBpZiB5b3UncmUgYXQgNDQuMWtoeiBzdGVyZW8gMTZiaXQgaW4geW91ciBzdHJlYW0gLSB5b3VyIGxhZyAgKi8KKy8qIGluIGJ5dGVzIHdvdWRsIGJlIGxhZyAqIDIgKiAyIGJ5dGVzICgyIGZvciBzdGVyZW8sIDIgZm9yIDE2Yml0KSAqLworLyogaWYgeW91ciBzdHJlYW0gaXMgYXQgMjIuMDUgS2h6IGl0J2xsIGJlIGRvdWJsZSB0aGlzIC0gaW4gbW9ubyAgICovCisvKiBkb3VibGUgYWdhaW4gLi4uIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2ludCBlc2RfZ2V0X2xhdGVuY3koaW50IGVzZCk7CisgICAgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZXNkbWdyLmMgLSBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IGEgInNvdW5kIG1hbmFnZXIiIGZvciBlc2QgKi8KKworLyogc3RydWN0dXJlcyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBzdHJlYW1zL3NhbXBsZXMgZnJvbSB0aGUgc2VydmVyICovCit0eXBlZGVmIHN0cnVjdCBlc2Rfc2VydmVyX2luZm8geworCisgICAgaW50IHZlcnNpb247IAkJLyogc2VydmVyIHZlcnNpb24gZW5jb2RlZCBhcyBhbiBpbnQgKi8KKyAgICBlc2RfZm9ybWF0X3QgZm9ybWF0OwkvKiBtYWdpYyBpbnQgd2l0aCB0aGUgZm9ybWF0IGluZm8gKi8KKyAgICBpbnQgcmF0ZTsJCQkvKiBzYW1wbGUgcmF0ZSAqLworCit9IGVzZF9zZXJ2ZXJfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCBlc2RfcGxheWVyX2luZm8geworCisgICAgc3RydWN0IGVzZF9wbGF5ZXJfaW5mbyAqbmV4dDsgLyogcG9pbnQgdG8gbmV4dCBlbnRyeSBpbiBsaXN0ICovCisgICAgZXNkX3NlcnZlcl9pbmZvX3QgKnNlcnZlcjsJLyogdGhlIHNlcnZlciB0aGF0IGNvbnRhaW5zIHRoaXMgc3RyZWFtICovCisgICAgCisgICAgaW50IHNvdXJjZV9pZDsJCS8qIGVpdGhlciBhIHN0cmVhbSBmZCBvciBzYW1wbGUgaWQgKi8KKyAgICBjaGFyIG5hbWVbIEVTRF9OQU1FX01BWCBdOwkvKiBuYW1lIG9mIHN0cmVhbSBmb3IgcmVtb3RlIGNvbnRyb2wgKi8KKyAgICBpbnQgcmF0ZTsJCQkvKiBzYW1wbGUgcmF0ZSAqLworICAgIGludCBsZWZ0X3ZvbF9zY2FsZTsJCS8qIHZvbHVtZSBzY2FsaW5nICovCisgICAgaW50IHJpZ2h0X3ZvbF9zY2FsZTsKKworICAgIGVzZF9mb3JtYXRfdCBmb3JtYXQ7CS8qIG1hZ2ljIGludCB3aXRoIHRoZSBmb3JtYXQgaW5mbyAqLworCit9IGVzZF9wbGF5ZXJfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCBlc2Rfc2FtcGxlX2luZm8geworCisgICAgc3RydWN0IGVzZF9zYW1wbGVfaW5mbyAqbmV4dDsgLyogcG9pbnQgdG8gbmV4dCBlbnRyeSBpbiBsaXN0ICovCisgICAgZXNkX3NlcnZlcl9pbmZvX3QgKnNlcnZlcjsJLyogdGhlIHNlcnZlciB0aGF0IGNvbnRhaW5zIHRoaXMgc2FtcGxlICovCisgICAgCisgICAgaW50IHNhbXBsZV9pZDsJCS8qIGVpdGhlciBhIHN0cmVhbSBmZCBvciBzYW1wbGUgaWQgKi8KKyAgICBjaGFyIG5hbWVbIEVTRF9OQU1FX01BWCBdOwkvKiBuYW1lIG9mIHN0cmVhbSBmb3IgcmVtb3RlIGNvbnRyb2wgKi8KKyAgICBpbnQgcmF0ZTsJCQkvKiBzYW1wbGUgcmF0ZSAqLworICAgIGludCBsZWZ0X3ZvbF9zY2FsZTsJCS8qIHZvbHVtZSBzY2FsaW5nICovCisgICAgaW50IHJpZ2h0X3ZvbF9zY2FsZTsKKworICAgIGVzZF9mb3JtYXRfdCBmb3JtYXQ7CS8qIG1hZ2ljIGludCB3aXRoIHRoZSBmb3JtYXQgaW5mbyAqLworICAgIGludCBsZW5ndGg7CQkJLyogdG90YWwgYnVmZmVyIGxlbmd0aCAqLworCit9IGVzZF9zYW1wbGVfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCBlc2RfaW5mbyB7CisKKyAgICBlc2Rfc2VydmVyX2luZm9fdCAqc2VydmVyOworICAgIGVzZF9wbGF5ZXJfaW5mb190ICpwbGF5ZXJfbGlzdDsKKyAgICBlc2Rfc2FtcGxlX2luZm9fdCAqc2FtcGxlX2xpc3Q7CisKK30gZXNkX2luZm9fdDsKKworZW51bSBlc2Rfc3RhbmRieV9tb2RlIHsgCisgICAgRVNNX0VSUk9SLCBFU01fT05fU1RBTkRCWSwgRVNNX09OX0FVVE9TVEFOREJZLCBFU01fUlVOTklORworfTsKK3R5cGVkZWYgaW50IGVzZF9zdGFuZGJ5X21vZGVfdDsKKworLyogZGVmaW5lIGNhbGxiYWNrcyBmb3IgZXNkX3VwZGF0ZV9pbmZvKCkgKi8KKy8qIHdoYXQgdG8gZG8gd2hlbiBhIHN0cmVhbSBjb25uZWN0cywgb3Igc2FtcGxlIGlzIHBsYXllZCAqLwordHlwZWRlZiBpbnQgZXNkX25ld19wbGF5ZXJfY2FsbGJhY2tfdCggZXNkX3BsYXllcl9pbmZvX3QgKiApOworLyogd2hhdCB0byBkbyB3aGVuIGEgc3RyZWFtIGRpc2Nvbm5lY3RzLCBvciBzYW1wbGUgc3RvcHMgcGxheWluZyAqLwordHlwZWRlZiBpbnQgZXNkX29sZF9wbGF5ZXJfY2FsbGJhY2tfdCggZXNkX3BsYXllcl9pbmZvX3QgKiApOworLyogd2hhdCB0byBkbyB3aGVuIGEgc2FtcGxlIGlzIGNhY2hlZCAqLwordHlwZWRlZiBpbnQgZXNkX25ld19zYW1wbGVfY2FsbGJhY2tfdCggZXNkX3NhbXBsZV9pbmZvX3QgKiApOworLyogd2hhdCB0byBkbyB3aGVuIGEgc2FtcGxlIGlzIHVuY2FjaGVkICovCit0eXBlZGVmIGludCBlc2Rfb2xkX3NhbXBsZV9jYWxsYmFja190KCBlc2Rfc2FtcGxlX2luZm9fdCAqICk7CisKK3R5cGVkZWYgc3RydWN0IGVzZF91cGRhdGVfaW5mb19jYWxsYmFja3MgeworICAgIGVzZF9uZXdfcGxheWVyX2NhbGxiYWNrX3QgKmVzZF9uZXdfcGxheWVyX2NhbGxiYWNrOworICAgIGVzZF9vbGRfcGxheWVyX2NhbGxiYWNrX3QgKmVzZF9vbGRfcGxheWVyX2NhbGxiYWNrOworICAgIGVzZF9uZXdfc2FtcGxlX2NhbGxiYWNrX3QgKmVzZF9uZXdfc2FtcGxlX2NhbGxiYWNrOworICAgIGVzZF9vbGRfc2FtcGxlX2NhbGxiYWNrX3QgKmVzZF9vbGRfc2FtcGxlX2NhbGxiYWNrOworfSBlc2RfdXBkYXRlX2luZm9fY2FsbGJhY2tzX3Q7CisKKy8qIHByaW50IHNlcnZlciBpbnRvIHRvIHN0ZG91dCAqLwordm9pZCBlc2RfcHJpbnRfc2VydmVyX2luZm8oIGVzZF9zZXJ2ZXJfaW5mb190ICpzZXJ2ZXJfaW5mbyApOwordm9pZCBlc2RfcHJpbnRfcGxheWVyX2luZm8oIGVzZF9wbGF5ZXJfaW5mb190ICpwbGF5ZXJfaW5mbyApOwordm9pZCBlc2RfcHJpbnRfc2FtcGxlX2luZm8oIGVzZF9zYW1wbGVfaW5mb190ICpzYW1wbGVfaW5mbyApOworLyogcHJpbnQgYWxsIGluZm8gdG8gc3Rkb3V0ICovCit2b2lkIGVzZF9wcmludF9hbGxfaW5mbyggZXNkX2luZm9fdCAqYWxsX2luZm8gKTsKKworLyogcmV0cmlldmUgc2VydmVyIHByb3BlcnRpZXMgKHNhbXBsZSByYXRlLCBmb3JtYXQsIHZlcnNpb24gbnVtYmVyKSAqLworZXNkX3NlcnZlcl9pbmZvX3QgKmVzZF9nZXRfc2VydmVyX2luZm8oIGludCBlc2QgKTsKKy8qIHJlbGVhc2UgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBzZXJ2ZXIgcHJvcGVydGllcyBzdHJ1Y3R1cmUgKi8KK3ZvaWQgZXNkX2ZyZWVfc2VydmVyX2luZm8oIGVzZF9zZXJ2ZXJfaW5mb190ICpzZXJ2ZXJfaW5mbyApOworCisvKiByZXRyaWV2ZSBhbGwgaW5mb3JtYXRpb24gZnJvbSBzZXJ2ZXIgKi8KK2VzZF9pbmZvX3QgKmVzZF9nZXRfYWxsX2luZm8oIGludCBlc2QgKTsKKworLyogcmV0cmlldmUgYWxsIGluZm9ybWF0aW9uIGZyb20gc2VydmVyLCBhbmQgdXBkYXRlIHVudGlsIHVuc3Vic3JpYmVkIG9yIGNsb3NlZCAqLworZXNkX2luZm9fdCAqZXNkX3N1YnNjcmliZV9hbGxfaW5mbyggaW50IGVzZCApOworCisvKiBjYWxsIHRvIHVwZGF0ZSB0aGUgaW5mbyBzdHJ1Y3R1cmUgd2l0aCBuZXcgaW5mb3JtYXRpb24sIGFuZCBjYWxsIGNhbGxiYWNrcyAqLworZXNkX2luZm9fdCAqZXNkX3VwZGF0ZV9pbmZvKCBpbnQgZXNkLCBlc2RfaW5mb190ICppbmZvLCAKKwkJCSAgICAgZXNkX3VwZGF0ZV9pbmZvX2NhbGxiYWNrc190ICpjYWxsYmFja3MgKTsKK2VzZF9pbmZvX3QgKmVzZF91bnN1YnNjcmliZV9pbmZvKCBpbnQgZXNkICk7CisKKy8qIHJlbGVhc2UgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBlc2QgaW5mbyBzdHJ1Y3R1cmUgKi8KK3ZvaWQgZXNkX2ZyZWVfYWxsX2luZm8oIGVzZF9pbmZvX3QgKmluZm8gKTsKKworCisvKiByZXNldCB0aGUgdm9sdW1lIHBhbm5pbmcgZm9yIGEgc3RyZWFtICovCitpbnQgZXNkX3NldF9zdHJlYW1fcGFuKCBpbnQgZXNkLCBpbnQgc3RyZWFtX2lkLCAKKwkJCWludCBsZWZ0X3NjYWxlLCBpbnQgcmlnaHRfc2NhbGUgKTsKKworLyogcmVzZXQgdGhlIGRlZmF1bHQgdm9sdW1lIHBhbm5pbmcgZm9yIGEgc2FtcGxlICovCitpbnQgZXNkX3NldF9kZWZhdWx0X3NhbXBsZV9wYW4oIGludCBlc2QsIGludCBzYW1wbGVfaWQsIAorCQkJCWludCBsZWZ0X3NjYWxlLCBpbnQgcmlnaHRfc2NhbGUgKTsKKworLyogc2VlIGlmIHRoZSBzZXJ2ZXIgaXMgaW4gc3RuYWJ5LCBhdXRvc3RhbmRieSwgZXRjICovCitlc2Rfc3RhbmRieV9tb2RlX3QgZXNkX2dldF9zdGFuZGJ5X21vZGUoIGludCBlc2QgKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGVzZGZpbGUuYyAtIGF1ZGlvZmlsZSB3cmFwcGVycyBmb3Igc2FuZSBoYW5kbGluZyBvZiBmaWxlcyAqLworCitpbnQgZXNkX3NlbmRfZmlsZSggaW50IGVzZCwgQUZmaWxlaGFuZGxlIGF1X2ZpbGUsIGludCBmcmFtZV9sZW5ndGggKTsKK2ludCBlc2RfcGxheV9maWxlKCBjb25zdCBjaGFyICpuYW1lX3ByZWZpeCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmYWxsYmFjayApOworaW50IGVzZF9maWxlX2NhY2hlKCBpbnQgZXNkLCBjb25zdCBjaGFyICpuYW1lX3ByZWZpeCwgY29uc3QgY2hhciAqZmlsZW5hbWUgKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGF1ZGlvLmMgLSBhYnN0cmFjdCB0aGUgc291bmQgaGFyZHdhcmUgZm9yIGNyb3NzIHBsYXRmb3JtIHVzYWdlICovCitleHRlcm4gZXNkX2Zvcm1hdF90IGVzZF9hdWRpb19mb3JtYXQ7CitleHRlcm4gaW50IGVzZF9hdWRpb19yYXRlOworZXh0ZXJuIGNoYXIgKmVzZF9hdWRpb19kZXZpY2U7CisKK2NvbnN0IGNoYXIgKmVzZF9hdWRpb19kZXZpY2VzKCB2b2lkICk7CitpbnQgZXNkX2F1ZGlvX29wZW4oIHZvaWQgKTsKK3ZvaWQgZXNkX2F1ZGlvX2Nsb3NlKCB2b2lkICk7Cit2b2lkIGVzZF9hdWRpb19wYXVzZSggdm9pZCApOworaW50IGVzZF9hdWRpb193cml0ZSggdm9pZCAqYnVmZmVyLCBpbnQgYnVmX3NpemUgKTsKK2ludCBlc2RfYXVkaW9fcmVhZCggdm9pZCAqYnVmZmVyLCBpbnQgYnVmX3NpemUgKTsKK3ZvaWQgZXNkX2F1ZGlvX2ZsdXNoKCB2b2lkICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB1dGlsLmMgdXRpbGl0aWVzCQkJCQkJICAqLworCitjb25zdCBjaGFyICplc2RfZ2V0X3NvY2tldF9kaXJuYW1lKCB2b2lkICk7Citjb25zdCBjaGFyICplc2RfZ2V0X3NvY2tldF9uYW1lKCB2b2lkICk7CisKK2ludCBoYXZlX2lwdjYoIHZvaWQgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogI2lmbmRlZiBFU0RfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ldGkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZXRpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFhNjE5MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZXRpLmgKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyLDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgICoKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgICAgICAgICAgICAqCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nICAgICAgKgorICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAgICAgICoKKyAqIGRpc3RyaWJ1dGUsIGRpc3RyaWJ1dGUgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgICAgICAqCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgICAgKgorICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAgKgorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgKgorICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiAgICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgKgorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SICAgICoKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAqCisgKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAqCisgKiBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSAgICAgKgorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuICAgICAgICoKKyAqIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQXV0aG9yOiAgSnVlcmdlbiBQZmVpZmVyLCAxOTk1LDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogJElkOiBldGkuaCx2IDEuOCAyMDAzLzEwLzI1IDE1OjI0OjI5IHRvbSBFeHAgJCAqLworCisjaWZuZGVmIE5DVVJTRVNfRVRJX0hfaW5jbAorI2RlZmluZSBOQ1VSU0VTX0VUSV9IX2luY2wgMQorCisjZGVmaW5lCUVfT0sJCQkoMCkKKyNkZWZpbmUJRV9TWVNURU1fRVJST1IJIAkoLTEpCisjZGVmaW5lCUVfQkFEX0FSR1VNRU5UCSAJKC0yKQorI2RlZmluZQlFX1BPU1RFRAkgCSgtMykKKyNkZWZpbmUJRV9DT05ORUNURUQJIAkoLTQpCisjZGVmaW5lCUVfQkFEX1NUQVRFCSAJKC01KQorI2RlZmluZQlFX05PX1JPT00JIAkoLTYpCisjZGVmaW5lCUVfTk9UX1BPU1RFRAkJKC03KQorI2RlZmluZQlFX1VOS05PV05fQ09NTUFORAkoLTgpCisjZGVmaW5lCUVfTk9fTUFUQ0gJCSgtOSkKKyNkZWZpbmUJRV9OT1RfU0VMRUNUQUJMRQkoLTEwKQorI2RlZmluZQlFX05PVF9DT05ORUNURUQJICAgICAgICAoLTExKQorI2RlZmluZQlFX1JFUVVFU1RfREVOSUVECSgtMTIpCisjZGVmaW5lCUVfSU5WQUxJRF9GSUVMRAkgICAgICAgICgtMTMpCisjZGVmaW5lCUVfQ1VSUkVOVAkJKC0xNCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2V0aXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZXRpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMDk3YmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2V0aXAuaApAQCAtMCwwICsxLDM3OCBAQAorLy8gKiBUaGlzIG1ha2VzIGVtYWNzIGhhcHB5IC0qLU1vZGU6IEMrKzstKi0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNywyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIEF1dGhvcjogSnVlcmdlbiBQZmVpZmVyLCAxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vICRJZDogZXRpcC5oLmluLHYgMS4zNyAyMDA4LzA4LzMwIDE5OjI3OjMyIHRvbSBFeHAgJAorCisjaWZuZGVmIE5DVVJTRVNfRVRJUF9IX2luY2wKKyNkZWZpbmUgTkNVUlNFU19FVElQX0hfaW5jbCAxCisKKy8vIFRoZXNlIGFyZSBzdWJzdGl0dXRlZCBhdCBjb25maWd1cmUvYnVpbGQgdGltZQorI2lmbmRlZiBIQVZFX0JVSUxUSU5fSAorI2RlZmluZSBIQVZFX0JVSUxUSU5fSCAwCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0dYWF9CVUlMVElOX0gKKyNkZWZpbmUgSEFWRV9HWFhfQlVJTFRJTl9IIDAKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfR1BQX0JVSUxUSU5fSAorI2RlZmluZSBIQVZFX0dQUF9CVUlMVElOX0ggMAorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9JT1NUUkVBTQorI2RlZmluZSBIQVZFX0lPU1RSRUFNIDEKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfVFlQRUlORk8KKyNkZWZpbmUgSEFWRV9UWVBFSU5GTyAxCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1ZBTFVFU19ICisjZGVmaW5lIEhBVkVfVkFMVUVTX0ggMAorI2VuZGlmCisKKyNpZm5kZWYgRVRJUF9ORUVEU19NQVRIX0gKKyNkZWZpbmUgRVRJUF9ORUVEU19NQVRIX0ggMAorI2VuZGlmCisKKyNpZm5kZWYgRVRJUF9ORUVEU19NQVRIX0VYQ0VQVElPTgorI2RlZmluZSBFVElQX05FRURTX01BVEhfRVhDRVBUSU9OIDAKKyNlbmRpZgorCisjaWZuZGVmIENQUF9IQVNfUEFSQU1fSU5JVAorI2RlZmluZSBDUFBfSEFTX1BBUkFNX0lOSVQgMAorI2VuZGlmCisKKyNpZm5kZWYgQ1BQX0hBU19TVEFUSUNfQ0FTVAorI2RlZmluZSBDUFBfSEFTX1NUQVRJQ19DQVNUIDEKKyNlbmRpZgorCisjaWZuZGVmIElPU1RSRUFNX05BTUVTUEFDRQorI2RlZmluZSBJT1NUUkVBTV9OQU1FU1BBQ0UgMQorI2VuZGlmCisKKyNpZmRlZiBfX0dOVUdfXworIyAgaWYgKChfX0dOVUdfXyA8PSAyKSAmJiAoX19HTlVDX01JTk9SX18gPCA4KSkKKyMgICAgaWYgSEFWRV9UWVBFSU5GTworIyAgICAgIGluY2x1ZGUgPHR5cGVpbmZvPgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUdfXykKKyMgIGlmIEhBVkVfQlVJTFRJTl9IIHx8IEhBVkVfR1hYX0JVSUxUSU5fSCB8fCBIQVZFX0dQUF9CVUlMVElOX0gKKyMgICAgaWYgRVRJUF9ORUVEU19NQVRIX0gKKyMgICAgICBpZiBFVElQX05FRURTX01BVEhfRVhDRVBUSU9OCisjICAgICAgICB1bmRlZiBleGNlcHRpb24KKyMgICAgICAgIGRlZmluZSBleGNlcHRpb24gbWF0aF9leGNlcHRpb24KKyMgICAgICBlbmRpZgorIyAgICAgIGluY2x1ZGUgPG1hdGguaD4KKyMgICAgZW5kaWYKKyMgICAgdW5kZWYgZXhjZXB0aW9uCisjICAgIGRlZmluZSBleGNlcHRpb24gYnVpbHRpbl9leGNlcHRpb24KKyMgICAgaWYgSEFWRV9HUFBfQlVJTFRJTl9ICisjICAgICBpbmNsdWRlIDxncHAvYnVpbHRpbi5oPgorIyAgICBlbGlmIEhBVkVfR1hYX0JVSUxUSU5fSAorIyAgICAgaW5jbHVkZSA8ZysrL2J1aWx0aW4uaD4KKyMgICAgZWxzZQorIyAgICAgaW5jbHVkZSA8YnVpbHRpbi5oPgorIyAgICBlbmRpZgorIyAgICB1bmRlZiBleGNlcHRpb24KKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkIChfX1NVTlBST19DQykKKyMgIGluY2x1ZGUgPGdlbmVyaWMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bmN1cnNlc19kbGwuaD4KKworZXh0ZXJuICJDIiB7CisjaWYgSEFWRV9WQUxVRVNfSAorIyAgaW5jbHVkZSA8dmFsdWVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGV0aS5oPgorI2luY2x1ZGUgPGVycm5vLmg+Cit9CisKKy8vIExhbmd1YWdlIGZlYXR1cmVzCisjaWYgQ1BQX0hBU19QQVJBTV9JTklUCisjZGVmaW5lIE5DVVJTRVNfUEFSQU1fSU5JVCh2YWx1ZSkgPSB2YWx1ZQorI2Vsc2UKKyNkZWZpbmUgTkNVUlNFU19QQVJBTV9JTklUKHZhbHVlKSAvKm5vdGhpbmcqLworI2VuZGlmCisKKyNpZiBDUFBfSEFTX1NUQVRJQ19DQVNUCisjZGVmaW5lIFNUQVRJQ19DQVNUKHMpIHN0YXRpY19jYXN0PHM+CisjZWxzZQorI2RlZmluZSBTVEFUSUNfQ0FTVChzKSAocykKKyNlbmRpZgorCisvLyBGb3J3YXJkIERlY2xhcmF0aW9ucworY2xhc3MgTkNVUlNFU19JTVBFWFAgTkN1cnNlc1BhbmVsOworY2xhc3MgTkNVUlNFU19JTVBFWFAgTkN1cnNlc01lbnU7CitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzRm9ybTsKKworY2xhc3MgTkNVUlNFU19JTVBFWFAgTkN1cnNlc0V4Y2VwdGlvbgoreworcHVibGljOgorICBjb25zdCBjaGFyICptZXNzYWdlOworICBpbnQgZXJyb3JubzsKKworICBOQ3Vyc2VzRXhjZXB0aW9uIChjb25zdCBjaGFyKiBtc2csIGludCBlcnIpCisgICAgOiBtZXNzYWdlKG1zZyksIGVycm9ybm8gKGVycikKKyAgICB7fTsKKworICBOQ3Vyc2VzRXhjZXB0aW9uIChjb25zdCBjaGFyKiBtc2cpCisgICAgOiBtZXNzYWdlKG1zZyksIGVycm9ybm8gKEVfU1lTVEVNX0VSUk9SKQorICAgIHt9OworCisgIE5DdXJzZXNFeGNlcHRpb24mIG9wZXJhdG9yPShjb25zdCBOQ3Vyc2VzRXhjZXB0aW9uJiByaHMpCisgIHsKKyAgICBlcnJvcm5vID0gcmhzLmVycm9ybm87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTkN1cnNlc0V4Y2VwdGlvbihjb25zdCBOQ3Vyc2VzRXhjZXB0aW9uJiByaHMpCisgICAgOiBtZXNzYWdlKHJocy5tZXNzYWdlKSwgZXJyb3JubyhyaHMuZXJyb3JubykKKyAgeworICB9CisKKyAgdmlydHVhbCBjb25zdCBjaGFyICpjbGFzc25hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuICJOQ3Vyc2VzV2luZG93IjsKKyAgfQorCisgIHZpcnR1YWwgfk5DdXJzZXNFeGNlcHRpb24oKQorICB7CisgIH0KK307CisKK2NsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNQYW5lbEV4Y2VwdGlvbiA6IHB1YmxpYyBOQ3Vyc2VzRXhjZXB0aW9uCit7CitwdWJsaWM6CisgIGNvbnN0IE5DdXJzZXNQYW5lbCogcDsKKworICBOQ3Vyc2VzUGFuZWxFeGNlcHRpb24gKGNvbnN0IGNoYXIgKm1zZywgaW50IGVycikgOgorICAgIE5DdXJzZXNFeGNlcHRpb24gKG1zZywgZXJyKSwKKyAgICBwIChOVUxMKQorICAgIHt9OworCisgIE5DdXJzZXNQYW5lbEV4Y2VwdGlvbiAoY29uc3QgTkN1cnNlc1BhbmVsKiBwYW5lbCwKKwkJCSBjb25zdCBjaGFyICptc2csCisJCQkgaW50IGVycikgOgorICAgIE5DdXJzZXNFeGNlcHRpb24gKG1zZywgZXJyKSwKKyAgICBwIChwYW5lbCkKKyAgICB7fTsKKworICBOQ3Vyc2VzUGFuZWxFeGNlcHRpb24gKGludCBlcnIpIDoKKyAgICBOQ3Vyc2VzRXhjZXB0aW9uICgicGFuZWwgbGlicmFyeSBlcnJvciIsIGVyciksCisgICAgcCAoTlVMTCkKKyAgICB7fTsKKworICBOQ3Vyc2VzUGFuZWxFeGNlcHRpb24gKGNvbnN0IE5DdXJzZXNQYW5lbCogcGFuZWwsCisJCQkgaW50IGVycikgOgorICAgIE5DdXJzZXNFeGNlcHRpb24gKCJwYW5lbCBsaWJyYXJ5IGVycm9yIiwgZXJyKSwKKyAgICBwIChwYW5lbCkKKyAgICB7fTsKKworICBOQ3Vyc2VzUGFuZWxFeGNlcHRpb24mIG9wZXJhdG9yPShjb25zdCBOQ3Vyc2VzUGFuZWxFeGNlcHRpb24mIHJocykKKyAgeworICAgIGlmICh0aGlzICE9ICZyaHMpIHsKKyAgICAgIE5DdXJzZXNFeGNlcHRpb246Om9wZXJhdG9yPShyaHMpOworICAgICAgcCA9IHJocy5wOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBOQ3Vyc2VzUGFuZWxFeGNlcHRpb24oY29uc3QgTkN1cnNlc1BhbmVsRXhjZXB0aW9uJiByaHMpCisgICAgOiBOQ3Vyc2VzRXhjZXB0aW9uKHJocyksIHAocmhzLnApCisgIHsKKyAgfQorCisgIHZpcnR1YWwgY29uc3QgY2hhciAqY2xhc3NuYW1lKCkgY29uc3QgeworICAgIHJldHVybiAiTkN1cnNlc1BhbmVsIjsKKyAgfQorCisgIHZpcnR1YWwgfk5DdXJzZXNQYW5lbEV4Y2VwdGlvbigpCisgIHsKKyAgfQorfTsKKworY2xhc3MgTkNVUlNFU19JTVBFWFAgTkN1cnNlc01lbnVFeGNlcHRpb24gOiBwdWJsaWMgTkN1cnNlc0V4Y2VwdGlvbgoreworcHVibGljOgorICBjb25zdCBOQ3Vyc2VzTWVudSogbTsKKworICBOQ3Vyc2VzTWVudUV4Y2VwdGlvbiAoY29uc3QgY2hhciAqbXNnLCBpbnQgZXJyKSA6CisgICAgTkN1cnNlc0V4Y2VwdGlvbiAobXNnLCBlcnIpLAorICAgIG0gKE5VTEwpCisgICAge307CisKKyAgTkN1cnNlc01lbnVFeGNlcHRpb24gKGNvbnN0IE5DdXJzZXNNZW51KiBtZW51LAorCQkJY29uc3QgY2hhciAqbXNnLAorCQkJaW50IGVycikgOgorICAgIE5DdXJzZXNFeGNlcHRpb24gKG1zZywgZXJyKSwKKyAgICBtIChtZW51KQorICAgIHt9OworCisgIE5DdXJzZXNNZW51RXhjZXB0aW9uIChpbnQgZXJyKSA6CisgICAgTkN1cnNlc0V4Y2VwdGlvbiAoIm1lbnUgbGlicmFyeSBlcnJvciIsIGVyciksCisgICAgbSAoTlVMTCkKKyAgICB7fTsKKworICBOQ3Vyc2VzTWVudUV4Y2VwdGlvbiAoY29uc3QgTkN1cnNlc01lbnUqIG1lbnUsCisJCQlpbnQgZXJyKSA6CisgICAgTkN1cnNlc0V4Y2VwdGlvbiAoIm1lbnUgbGlicmFyeSBlcnJvciIsIGVyciksCisgICAgbSAobWVudSkKKyAgICB7fTsKKworICBOQ3Vyc2VzTWVudUV4Y2VwdGlvbiYgb3BlcmF0b3I9KGNvbnN0IE5DdXJzZXNNZW51RXhjZXB0aW9uJiByaHMpCisgIHsKKyAgICBpZiAodGhpcyAhPSAmcmhzKSB7CisgICAgICBOQ3Vyc2VzRXhjZXB0aW9uOjpvcGVyYXRvcj0ocmhzKTsKKyAgICAgIG0gPSByaHMubTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTkN1cnNlc01lbnVFeGNlcHRpb24oY29uc3QgTkN1cnNlc01lbnVFeGNlcHRpb24mIHJocykKKyAgICA6IE5DdXJzZXNFeGNlcHRpb24ocmhzKSwgbShyaHMubSkKKyAgeworICB9CisKKyAgdmlydHVhbCBjb25zdCBjaGFyICpjbGFzc25hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuICJOQ3Vyc2VzTWVudSI7CisgIH0KKworICB2aXJ0dWFsIH5OQ3Vyc2VzTWVudUV4Y2VwdGlvbigpCisgIHsKKyAgfQorfTsKKworY2xhc3MgTkNVUlNFU19JTVBFWFAgTkN1cnNlc0Zvcm1FeGNlcHRpb24gOiBwdWJsaWMgTkN1cnNlc0V4Y2VwdGlvbgoreworcHVibGljOgorICBjb25zdCBOQ3Vyc2VzRm9ybSogZjsKKworICBOQ3Vyc2VzRm9ybUV4Y2VwdGlvbiAoY29uc3QgY2hhciAqbXNnLCBpbnQgZXJyKSA6CisgICAgTkN1cnNlc0V4Y2VwdGlvbiAobXNnLCBlcnIpLAorICAgIGYgKE5VTEwpCisgICAge307CisKKyAgTkN1cnNlc0Zvcm1FeGNlcHRpb24gKGNvbnN0IE5DdXJzZXNGb3JtKiBmb3JtLAorCQkJY29uc3QgY2hhciAqbXNnLAorCQkJaW50IGVycikgOgorICAgIE5DdXJzZXNFeGNlcHRpb24gKG1zZywgZXJyKSwKKyAgICBmIChmb3JtKQorICAgIHt9OworCisgIE5DdXJzZXNGb3JtRXhjZXB0aW9uIChpbnQgZXJyKSA6CisgICAgTkN1cnNlc0V4Y2VwdGlvbiAoImZvcm0gbGlicmFyeSBlcnJvciIsIGVyciksCisgICAgZiAoTlVMTCkKKyAgICB7fTsKKworICBOQ3Vyc2VzRm9ybUV4Y2VwdGlvbiAoY29uc3QgTkN1cnNlc0Zvcm0qIGZvcm0sCisJCQlpbnQgZXJyKSA6CisgICAgTkN1cnNlc0V4Y2VwdGlvbiAoImZvcm0gbGlicmFyeSBlcnJvciIsIGVyciksCisgICAgZiAoZm9ybSkKKyAgICB7fTsKKworICBOQ3Vyc2VzRm9ybUV4Y2VwdGlvbiYgb3BlcmF0b3I9KGNvbnN0IE5DdXJzZXNGb3JtRXhjZXB0aW9uJiByaHMpCisgIHsKKyAgICBpZiAodGhpcyAhPSAmcmhzKSB7CisgICAgICBOQ3Vyc2VzRXhjZXB0aW9uOjpvcGVyYXRvcj0ocmhzKTsKKyAgICAgIGYgPSByaHMuZjsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTkN1cnNlc0Zvcm1FeGNlcHRpb24oY29uc3QgTkN1cnNlc0Zvcm1FeGNlcHRpb24mIHJocykKKyAgICA6IE5DdXJzZXNFeGNlcHRpb24ocmhzKSwgZihyaHMuZikKKyAgeworICB9CisKKyAgdmlydHVhbCBjb25zdCBjaGFyICpjbGFzc25hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuICJOQ3Vyc2VzRm9ybSI7CisgIH0KKworICB2aXJ0dWFsIH5OQ3Vyc2VzRm9ybUV4Y2VwdGlvbigpCisgIHsKKyAgfQorfTsKKworI2lmICEoKGRlZmluZWQoX19HTlVHX18pICYmIGRlZmluZWQoX19FWENFUFRJT05TKSkgfHwgZGVmaW5lZChfX1NVTlBST19DQykpCisjICBpZiBIQVZFX0lPU1RSRUFNCisjICAgICBpbmNsdWRlIDxpb3N0cmVhbT4KKyMgICAgIGlmIElPU1RSRUFNX05BTUVTUEFDRQordXNpbmcgc3RkOjpjZXJyOwordXNpbmcgc3RkOjplbmRsOworIyAgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgIGluY2x1ZGUgPGlvc3RyZWFtLmg+CisjICBlbmRpZgorICAgZXh0ZXJuICJDIiB2b2lkIGV4aXQoaW50KTsKKyNlbmRpZgorCitpbmxpbmUgdm9pZCBUSFJPVyhjb25zdCBOQ3Vyc2VzRXhjZXB0aW9uICplKSB7CisjaWYgZGVmaW5lZChfX0dOVUdfXykgJiYgZGVmaW5lZChfX0VYQ0VQVElPTlMpCisjICBpZiAoKF9fR05VR19fIDw9IDIpICYmIChfX0dOVUNfTUlOT1JfXyA8IDgpKQorICAgICAgKCpsaWJfZXJyb3JfaGFuZGxlcikoZSA/IGUtPmNsYXNzbmFtZSgpIDogIiIsIGUgPyBlLT5tZXNzYWdlIDogIiIpOworI2Vsc2UKKyNkZWZpbmUgQ1BQX0hBU19UUllfQ0FUQ0ggMQorI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9fU1VOUFJPX0NDKQorIyAgaWYgIWRlZmluZWQoX19TVU5QUk9fQ0NfQ09NUEFUKSB8fCAoX19TVU5QUk9fQ0NfQ09NUEFUIDwgNSkKKyAgZ2VuZXJpY2Vycm9yKDEsICgoZSAhPSAwKSA/IChjaGFyICopKGUtPm1lc3NhZ2UpIDogIiIpKTsKKyNlbHNlCisjZGVmaW5lIENQUF9IQVNfVFJZX0NBVENIIDEKKyNlbmRpZgorI2Vsc2UKKyAgaWYgKGUpCisgICAgY2VyciA8PCBlLT5tZXNzYWdlIDw8IGVuZGw7CisgIGV4aXQoMCk7CisjZW5kaWYKKworI2lmbmRlZiBDUFBfSEFTX1RSWV9DQVRDSAorI2RlZmluZSBDUFBfSEFTX1RSWV9DQVRDSCAwCisjZGVmaW5lIE5DVVJTRVNfQ1BQX1RSWQkJLyogbm90aGluZyAqLworI2RlZmluZSBOQ1VSU0VTX0NQUF9DQVRDSChlKQlpZiAoZmFsc2UpCisjZGVmaW5lIFRIUk9XUyhzKQkJLyogbm90aGluZyAqLworI2VsaWYgQ1BQX0hBU19UUllfQ0FUQ0gKKyAgdGhyb3cgKmU7CisjZGVmaW5lIE5DVVJTRVNfQ1BQX1RSWQkJdHJ5CisjZGVmaW5lIE5DVVJTRVNfQ1BQX0NBVENIKGUpCWNhdGNoKGUpCisjZGVmaW5lIFRIUk9XUyhzKQkJdGhyb3cocykKKyNlbmRpZgorfQorCisjZW5kaWYgLyogTkNVUlNFU19FVElQX0hfaW5jbCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9leGVjaW5mby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9leGVjaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNjE0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2V4ZWNpbmZvLmgKQEAgLTAsMCArMSw0NCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDA0LCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9FWEVDSU5GT19ICisjZGVmaW5lIF9FWEVDSU5GT19IIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogU3RvcmUgdXAgdG8gU0laRSByZXR1cm4gYWRkcmVzcyBvZiB0aGUgY3VycmVudCBwcm9ncmFtIHN0YXRlIGluCisgICBBUlJBWSBhbmQgcmV0dXJuIHRoZSBleGFjdCBudW1iZXIgb2YgdmFsdWVzIHN0b3JlZC4gICovCitleHRlcm4gaW50IGJhY2t0cmFjZSAodm9pZCAqKl9fYXJyYXksIGludCBfX3NpemUpIF9fbm9ubnVsbCAoKDEpKTsKKworCisvKiBSZXR1cm4gbmFtZXMgb2YgZnVuY3Rpb25zIGZyb20gdGhlIGJhY2t0cmFjZSBsaXN0IGluIEFSUkFZIGluIGEgbmV3bHkKKyAgIG1hbGxvYygpZWQgbWVtb3J5IGJsb2NrLiAgKi8KK2V4dGVybiBjaGFyICoqYmFja3RyYWNlX3N5bWJvbHMgKHZvaWQgKl9fY29uc3QgKl9fYXJyYXksIGludCBfX3NpemUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byBiYWNrdHJhY2Vfc3ltYm9scygpIGJ1dCBpdCB3cml0ZXMgdGhlIHJlc3VsdAorICAgaW1tZWRpYXRlbHkgdG8gYSBmaWxlLiAgKi8KK2V4dGVybiB2b2lkIGJhY2t0cmFjZV9zeW1ib2xzX2ZkICh2b2lkICpfX2NvbnN0ICpfX2FycmF5LCBpbnQgX19zaXplLCBpbnQgX19mZCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBleGVjaW5mby5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9mY250bC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9mY250bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MjE4MDAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2ZjbnRsLmgKQEAgLTAsMCArMSwyNTcgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwxOTkyLDE5OTQtMjAwMSwyMDAzLDIwMDQsMjAwNSwyMDA2LDIwMDcsMjAwOSwyMDEwLDIwMTEKKwlGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCVBPU0lYIFN0YW5kYXJkOiA2LjUgRmlsZSBDb250cm9sIE9wZXJhdGlvbnMJPGZjbnRsLmg+CisgKi8KKworI2lmbmRlZglfRkNOVExfSAorI2RlZmluZQlfRkNOVExfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBUaGlzIG11c3QgYmUgZWFybHkgc28gPGJpdHMvZmNudGwuaD4gY2FuIGRlZmluZSB0eXBlcyB3aW5uaW5nbHkuICAqLworX19CRUdJTl9ERUNMUworCisvKiBHZXQgdGhlIGRlZmluaXRpb25zIG9mIE9fKiwgRl8qLCBGRF8qOiBhbGwgdGhlCisgICBudW1iZXJzIGFuZCBmbGFnIGJpdHMgZm9yIGBvcGVuJywgYGZjbnRsJywgZXQgYWwuICAqLworI2luY2x1ZGUgPGJpdHMvZmNudGwuaD4KKworLyogRm9yIFhQRyBhbGwgc3ltYm9scyBmcm9tIDxzeXMvc3RhdC5oPiBzaG91bGQgYWxzbyBiZSBhdmFpbGFibGUuICAqLworI2lmIGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorIyBpbmNsdWRlIDxiaXRzL3R5cGVzLmg+ICAgICAgICAgLyogRm9yIF9fbW9kZV90IGFuZCBfX2Rldl90LiAgKi8KKyMgZGVmaW5lIF9fbmVlZF90aW1lc3BlYworIyBpbmNsdWRlIDx0aW1lLmg+CisjIGluY2x1ZGUgPGJpdHMvc3RhdC5oPgorCisjIGRlZmluZSBTX0lGTVQJCV9fU19JRk1UCisjIGRlZmluZSBTX0lGRElSCV9fU19JRkRJUgorIyBkZWZpbmUgU19JRkNIUglfX1NfSUZDSFIKKyMgZGVmaW5lIFNfSUZCTEsJX19TX0lGQkxLCisjIGRlZmluZSBTX0lGUkVHCV9fU19JRlJFRworIyBpZmRlZiBfX1NfSUZJRk8KKyMgIGRlZmluZSBTX0lGSUZPCV9fU19JRklGTworIyBlbmRpZgorIyBpZmRlZiBfX1NfSUZMTksKKyMgIGRlZmluZSBTX0lGTE5LCV9fU19JRkxOSworIyBlbmRpZgorIyBpZiAoZGVmaW5lZCBfX1VTRV9VTklYOTggfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOCkgJiYgZGVmaW5lZCBfX1NfSUZTT0NLCisjICBkZWZpbmUgU19JRlNPQ0sJX19TX0lGU09DSworIyBlbmRpZgorCisvKiBQcm90ZWN0aW9uIGJpdHMuICAqLworCisjIGRlZmluZSBTX0lTVUlECV9fU19JU1VJRCAgICAgICAvKiBTZXQgdXNlciBJRCBvbiBleGVjdXRpb24uICAqLworIyBkZWZpbmUgU19JU0dJRAlfX1NfSVNHSUQgICAgICAgLyogU2V0IGdyb3VwIElEIG9uIGV4ZWN1dGlvbi4gICovCisKKyMgaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKy8qIFNhdmUgc3dhcHBlZCB0ZXh0IGFmdGVyIHVzZSAoc3RpY2t5IGJpdCkuICBUaGlzIGlzIHByZXR0eSB3ZWxsIG9ic29sZXRlLiAgKi8KKyMgIGRlZmluZSBTX0lTVlRYCV9fU19JU1ZUWAorIyBlbmRpZgorCisjIGRlZmluZSBTX0lSVVNSCV9fU19JUkVBRCAgICAgICAvKiBSZWFkIGJ5IG93bmVyLiAgKi8KKyMgZGVmaW5lIFNfSVdVU1IJX19TX0lXUklURSAgICAgIC8qIFdyaXRlIGJ5IG93bmVyLiAgKi8KKyMgZGVmaW5lIFNfSVhVU1IJX19TX0lFWEVDICAgICAgIC8qIEV4ZWN1dGUgYnkgb3duZXIuICAqLworLyogUmVhZCwgd3JpdGUsIGFuZCBleGVjdXRlIGJ5IG93bmVyLiAgKi8KKyMgZGVmaW5lIFNfSVJXWFUJKF9fU19JUkVBRHxfX1NfSVdSSVRFfF9fU19JRVhFQykKKworIyBkZWZpbmUgU19JUkdSUAkoU19JUlVTUiA+PiAzKSAgLyogUmVhZCBieSBncm91cC4gICovCisjIGRlZmluZSBTX0lXR1JQCShTX0lXVVNSID4+IDMpICAvKiBXcml0ZSBieSBncm91cC4gICovCisjIGRlZmluZSBTX0lYR1JQCShTX0lYVVNSID4+IDMpICAvKiBFeGVjdXRlIGJ5IGdyb3VwLiAgKi8KKy8qIFJlYWQsIHdyaXRlLCBhbmQgZXhlY3V0ZSBieSBncm91cC4gICovCisjIGRlZmluZSBTX0lSV1hHCShTX0lSV1hVID4+IDMpCisKKyMgZGVmaW5lIFNfSVJPVEgJKFNfSVJHUlAgPj4gMykgIC8qIFJlYWQgYnkgb3RoZXJzLiAgKi8KKyMgZGVmaW5lIFNfSVdPVEgJKFNfSVdHUlAgPj4gMykgIC8qIFdyaXRlIGJ5IG90aGVycy4gICovCisjIGRlZmluZSBTX0lYT1RICShTX0lYR1JQID4+IDMpICAvKiBFeGVjdXRlIGJ5IG90aGVycy4gICovCisvKiBSZWFkLCB3cml0ZSwgYW5kIGV4ZWN1dGUgYnkgb3RoZXJzLiAgKi8KKyMgZGVmaW5lIFNfSVJXWE8JKFNfSVJXWEcgPj4gMykKKyNlbmRpZgorCisjaWZkZWYJX19VU0VfTUlTQworIyBpZm5kZWYgUl9PSwkJCS8qIFZlcmJhdGltIGZyb20gPHVuaXN0ZC5oPi4gIFVnaC4gICovCisvKiBWYWx1ZXMgZm9yIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYWNjZXNzLgorICAgVGhlc2UgbWF5IGJlIE9SJ2QgdG9nZXRoZXIuICAqLworIyAgZGVmaW5lIFJfT0sJNAkJLyogVGVzdCBmb3IgcmVhZCBwZXJtaXNzaW9uLiAgKi8KKyMgIGRlZmluZSBXX09LCTIJCS8qIFRlc3QgZm9yIHdyaXRlIHBlcm1pc3Npb24uICAqLworIyAgZGVmaW5lIFhfT0sJMQkJLyogVGVzdCBmb3IgZXhlY3V0ZSBwZXJtaXNzaW9uLiAgKi8KKyMgIGRlZmluZSBGX09LCTAJCS8qIFRlc3QgZm9yIGV4aXN0ZW5jZS4gICovCisjIGVuZGlmCisjZW5kaWYgLyogVXNlIG1pc2MuICAqLworCisvKiBYUEcgd2FudHMgdGhlIGZvbGxvd2luZyBzeW1ib2xzLiAgIDxzdGRpby5oPiBoYXMgdGhlIHNhbWUgZGVmaW5pdGlvbnMuICAqLworI2lmIGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorIyBkZWZpbmUgU0VFS19TRVQJMAkvKiBTZWVrIGZyb20gYmVnaW5uaW5nIG9mIGZpbGUuICAqLworIyBkZWZpbmUgU0VFS19DVVIJMQkvKiBTZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbi4gICovCisjIGRlZmluZSBTRUVLX0VORAkyCS8qIFNlZWsgZnJvbSBlbmQgb2YgZmlsZS4gICovCisjZW5kaWYJLyogWFBHICovCisKKy8qIERvIHRoZSBmaWxlIGNvbnRyb2wgb3BlcmF0aW9uIGRlc2NyaWJlZCBieSBDTUQgb24gRkQuCisgICBUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgaW50ZXJwcmV0ZWQgZGVwZW5kaW5nIG9uIENNRC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IGZjbnRsIChpbnQgX19mZCwgaW50IF9fY21kLCAuLi4pOworCisvKiBPcGVuIEZJTEUgYW5kIHJldHVybiBhIG5ldyBmaWxlIGRlc2NyaXB0b3IgZm9yIGl0LCBvciAtMSBvbiBlcnJvci4KKyAgIE9GTEFHIGRldGVybWluZXMgdGhlIHR5cGUgb2YgYWNjZXNzIHVzZWQuICBJZiBPX0NSRUFUIGlzIG9uIE9GTEFHLAorICAgdGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRha2VuIGFzIGEgYG1vZGVfdCcsIHRoZSBtb2RlIG9mIHRoZSBjcmVhdGVkIGZpbGUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IG9wZW4gKF9fY29uc3QgY2hhciAqX19maWxlLCBpbnQgX19vZmxhZywgLi4uKSBfX25vbm51bGwgKCgxKSk7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKG9wZW4sIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgaW50IF9fb2ZsYWcsIC4uLiksIG9wZW42NCkKKyAgICAgX19ub25udWxsICgoMSkpOworIyBlbHNlCisjICBkZWZpbmUgb3BlbiBvcGVuNjQKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IG9wZW42NCAoX19jb25zdCBjaGFyICpfX2ZpbGUsIGludCBfX29mbGFnLCAuLi4pIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfQVRGSUxFCisvKiBTaW1pbGFyIHRvIGBvcGVuJyBidXQgYSByZWxhdGl2ZSBwYXRoIG5hbWUgaXMgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8KKyAgIHRoZSBkaXJlY3RvcnkgZm9yIHdoaWNoIEZEIGlzIGEgZGVzY3JpcHRvci4KKworICAgTk9URTogc29tZSBvdGhlciBgb3BlbmF0JyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eQorICAgdGhyb3VnaCB0aGlzIGludGVyZmFjZSwgZXNwZWNpYWxseSB1c2luZyB0aGUgT19YQVRUUiBmbGFnLiAgVGhpcyBpcyBub3QKKyAgIHlldCBzdXBwb3J0ZWQgaGVyZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IG9wZW5hdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19maWxlLCBpbnQgX19vZmxhZywgLi4uKQorICAgICBfX25vbm51bGwgKCgyKSk7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBpbnQgX19SRURJUkVDVCAob3BlbmF0LCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19maWxlLCBpbnQgX19vZmxhZywKKwkJCQkuLi4pLCBvcGVuYXQ2NCkgX19ub25udWxsICgoMikpOworIyAgZWxzZQorIyAgIGRlZmluZSBvcGVuYXQgb3BlbmF0NjQKKyMgIGVuZGlmCisjIGVuZGlmCisjIGlmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IG9wZW5hdDY0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX2ZpbGUsIGludCBfX29mbGFnLCAuLi4pCisgICAgIF9fbm9ubnVsbCAoKDIpKTsKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBDcmVhdGUgYW5kIG9wZW4gRklMRSwgd2l0aCBtb2RlIE1PREUuICBUaGlzIHRha2VzIGFuIGBpbnQnIE1PREUKKyAgIGFyZ3VtZW50IGJlY2F1c2UgdGhhdCBpcyB3aGF0IGBtb2RlX3QnIHdpbGwgYmUgd2lkZW5lZCB0by4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgY3JlYXQgKF9fY29uc3QgY2hhciAqX19maWxlLCBfX21vZGVfdCBfX21vZGUpIF9fbm9ubnVsbCAoKDEpKTsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoY3JlYXQsIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX19tb2RlX3QgX19tb2RlKSwKKwkJICAgICAgIGNyZWF0NjQpIF9fbm9ubnVsbCAoKDEpKTsKKyMgZWxzZQorIyAgZGVmaW5lIGNyZWF0IGNyZWF0NjQKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IGNyZWF0NjQgKF9fY29uc3QgY2hhciAqX19maWxlLCBfX21vZGVfdCBfX21vZGUpIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgRl9MT0NLICYmIChkZWZpbmVkIF9fVVNFX01JU0MgfHwgKGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgXAorCQkJCQkgICAgICAgJiYgIWRlZmluZWQgX19VU0VfUE9TSVgpKQorLyogTk9URTogVGhlc2UgZGVjbGFyYXRpb25zIGFsc28gYXBwZWFyIGluIDx1bmlzdGQuaD47IGJlIHN1cmUgdG8ga2VlcCBib3RoCisgICBmaWxlcyBjb25zaXN0ZW50LiAgU29tZSBzeXN0ZW1zIGhhdmUgdGhlbSB0aGVyZSBhbmQgc29tZSBoZXJlLCBhbmQgc29tZQorICAgc29mdHdhcmUgZGVwZW5kcyBvbiB0aGUgbWFjcm9zIGJlaW5nIGRlZmluZWQgd2l0aG91dCBpbmNsdWRpbmcgYm90aC4gICovCisKKy8qIGBsb2NrZicgaXMgYSBzaW1wbGVyIGludGVyZmFjZSB0byB0aGUgbG9ja2luZyBmYWNpbGl0aWVzIG9mIGBmY250bCcuCisgICBMRU4gaXMgYWx3YXlzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24uCisgICBUaGUgQ01EIGFyZ3VtZW50IGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nLiAgKi8KKworIyBkZWZpbmUgRl9VTE9DSyAwCS8qIFVubG9jayBhIHByZXZpb3VzbHkgbG9ja2VkIHJlZ2lvbi4gICovCisjIGRlZmluZSBGX0xPQ0sgIDEJLyogTG9jayBhIHJlZ2lvbiBmb3IgZXhjbHVzaXZlIHVzZS4gICovCisjIGRlZmluZSBGX1RMT0NLIDIJLyogVGVzdCBhbmQgbG9jayBhIHJlZ2lvbiBmb3IgZXhjbHVzaXZlIHVzZS4gICovCisjIGRlZmluZSBGX1RFU1QgIDMJLyogVGVzdCBhIHJlZ2lvbiBmb3Igb3RoZXIgcHJvY2Vzc2VzIGxvY2tzLiAgKi8KKworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBsb2NrZiAoaW50IF9fZmQsIGludCBfX2NtZCwgX19vZmZfdCBfX2xlbik7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBpbnQgX19SRURJUkVDVCAobG9ja2YsIChpbnQgX19mZCwgaW50IF9fY21kLCBfX29mZjY0X3QgX19sZW4pLCBsb2NrZjY0KTsKKyMgIGVsc2UKKyMgICBkZWZpbmUgbG9ja2YgbG9ja2Y2NAorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgbG9ja2Y2NCAoaW50IF9fZmQsIGludCBfX2NtZCwgX19vZmY2NF90IF9fbGVuKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogQWR2aWNlIHRoZSBzeXN0ZW0gYWJvdXQgdGhlIGV4cGVjdGVkIGJlaGF2aW91ciBvZiB0aGUgYXBwbGljYXRpb24gd2l0aAorICAgcmVzcGVjdCB0byB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggRkQuICAqLworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBwb3NpeF9mYWR2aXNlIChpbnQgX19mZCwgX19vZmZfdCBfX29mZnNldCwgX19vZmZfdCBfX2xlbiwKKwkJCSAgaW50IF9fYWR2aXNlKSBfX1RIUk9XOworIyBlbHNlCisgIyBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAocG9zaXhfZmFkdmlzZSwgKGludCBfX2ZkLCBfX29mZjY0X3QgX19vZmZzZXQsCisJCQkJCSAgIF9fb2ZmNjRfdCBfX2xlbiwgaW50IF9fYWR2aXNlKSwKKwkJCSAgIHBvc2l4X2ZhZHZpc2U2NCk7CisjICBlbHNlCisjICAgZGVmaW5lIHBvc2l4X2ZhZHZpc2UgcG9zaXhfZmFkdmlzZTY0CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBwb3NpeF9mYWR2aXNlNjQgKGludCBfX2ZkLCBfX29mZjY0X3QgX19vZmZzZXQsIF9fb2ZmNjRfdCBfX2xlbiwKKwkJCSAgICBpbnQgX19hZHZpc2UpIF9fVEhST1c7CisjIGVuZGlmCisKKworLyogUmVzZXJ2ZSBzdG9yYWdlIGZvciB0aGUgZGF0YSBvZiB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggRkQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBwb3NpeF9mYWxsb2NhdGUgKGludCBfX2ZkLCBfX29mZl90IF9fb2Zmc2V0LCBfX29mZl90IF9fbGVuKTsKKyMgZWxzZQorICMgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIGludCBfX1JFRElSRUNUIChwb3NpeF9mYWxsb2NhdGUsIChpbnQgX19mZCwgX19vZmY2NF90IF9fb2Zmc2V0LAorCQkJCQkgX19vZmY2NF90IF9fbGVuKSwKKwkJICAgICAgIHBvc2l4X2ZhbGxvY2F0ZTY0KTsKKyMgIGVsc2UKKyMgICBkZWZpbmUgcG9zaXhfZmFsbG9jYXRlIHBvc2l4X2ZhbGxvY2F0ZTY0CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBwb3NpeF9mYWxsb2NhdGU2NCAoaW50IF9fZmQsIF9fb2ZmNjRfdCBfX29mZnNldCwgX19vZmY2NF90IF9fbGVuKTsKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIERlZmluZSBzb21lIGlubGluZXMgaGVscGluZyB0byBjYXRjaCBjb21tb24gcHJvYmxlbXMuICAqLworI2lmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAwICYmIGRlZmluZWQgX19leHRlcm5fYWx3YXlzX2lubGluZSBcCisgICAgJiYgZGVmaW5lZCBfX3ZhX2FyZ19wYWNrX2xlbgorIyBpbmNsdWRlIDxiaXRzL2ZjbnRsMi5oPgorI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBmY250bC5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9mZWF0dXJlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNGRjMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgKQEAgLTAsMCArMSwzOTIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0xOTkzLDE5OTUtMjAwNywyMDA5LDIwMTAsMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX0ZFQVRVUkVTX0gKKyNkZWZpbmUJX0ZFQVRVUkVTX0gJMQorCisvKiBUaGVzZSBhcmUgZGVmaW5lZCBieSB0aGUgdXNlciAob3IgdGhlIGNvbXBpbGVyKQorICAgdG8gc3BlY2lmeSB0aGUgZGVzaXJlZCBlbnZpcm9ubWVudDoKKworICAgX19TVFJJQ1RfQU5TSV9fCUlTTyBTdGFuZGFyZCBDLgorICAgX0lTT0M5OV9TT1VSQ0UJRXh0ZW5zaW9ucyB0byBJU08gQzg5IGZyb20gSVNPIEM5OS4KKyAgIF9QT1NJWF9TT1VSQ0UJSUVFRSBTdGQgMTAwMy4xLgorICAgX1BPU0lYX0NfU09VUkNFCUlmID09MSwgbGlrZSBfUE9TSVhfU09VUkNFOyBpZiA+PTIgYWRkIElFRUUgU3RkIDEwMDMuMjsKKwkJCWlmID49MTk5MzA5TCwgYWRkIElFRUUgU3RkIDEwMDMuMWItMTk5MzsKKwkJCWlmID49MTk5NTA2TCwgYWRkIElFRUUgU3RkIDEwMDMuMWMtMTk5NTsKKwkJCWlmID49MjAwMTEyTCwgYWxsIG9mIElFRUUgMTAwMy4xLTIwMDQKKwkJCWlmID49MjAwODA5TCwgYWxsIG9mIElFRUUgMTAwMy4xLTIwMDgKKyAgIF9YT1BFTl9TT1VSQ0UJSW5jbHVkZXMgUE9TSVggYW5kIFhQRyB0aGluZ3MuICBTZXQgdG8gNTAwIGlmCisJCQlTaW5nbGUgVW5peCBjb25mb3JtYW5jZSBpcyB3YW50ZWQsIHRvIDYwMCBmb3IgdGhlCisJCQlzaXh0aCByZXZpc2lvbiwgdG8gNzAwIGZvciB0aGUgc2V2ZW50aCByZXZpc2lvbi4KKyAgIF9YT1BFTl9TT1VSQ0VfRVhURU5ERUQgWFBHIHRoaW5ncyBhbmQgWC9PcGVuIFVuaXggZXh0ZW5zaW9ucy4KKyAgIF9MQVJHRUZJTEVfU09VUkNFCVNvbWUgbW9yZSBmdW5jdGlvbnMgZm9yIGNvcnJlY3Qgc3RhbmRhcmQgSS9PLgorICAgX0xBUkdFRklMRTY0X1NPVVJDRQlBZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgZnJvbSBMRlMgZm9yIGxhcmdlIGZpbGVzLgorICAgX0ZJTEVfT0ZGU0VUX0JJVFM9TglTZWxlY3QgZGVmYXVsdCBmaWxlc3lzdGVtIGludGVyZmFjZS4KKyAgIF9CU0RfU09VUkNFCQlJU08gQywgUE9TSVgsIGFuZCA0LjNCU0QgdGhpbmdzLgorICAgX1NWSURfU09VUkNFCQlJU08gQywgUE9TSVgsIGFuZCBTVklEIHRoaW5ncy4KKyAgIF9BVEZJTEVfU09VUkNFCUFkZGl0aW9uYWwgKmF0IGludGVyZmFjZXMuCisgICBfR05VX1NPVVJDRQkJQWxsIG9mIHRoZSBhYm92ZSwgcGx1cyBHTlUgZXh0ZW5zaW9ucy4KKyAgIF9SRUVOVFJBTlQJCVNlbGVjdCBhZGRpdGlvbmFsbHkgcmVlbnRyYW50IG9iamVjdC4KKyAgIF9USFJFQURfU0FGRQkJU2FtZSBhcyBfUkVFTlRSQU5ULCBvZnRlbiB1c2VkIGJ5IG90aGVyIHN5c3RlbXMuCisgICBfRk9SVElGWV9TT1VSQ0UJSWYgc2V0IHRvIG51bWVyaWMgdmFsdWUgPiAwIGFkZGl0aW9uYWwgc2VjdXJpdHkKKwkJCW1lYXN1cmVzIGFyZSBkZWZpbmVkLCBhY2NvcmRpbmcgdG8gbGV2ZWwuCisKKyAgIFRoZSBgLWFuc2knIHN3aXRjaCB0byB0aGUgR05VIEMgY29tcGlsZXIgZGVmaW5lcyBfX1NUUklDVF9BTlNJX18uCisgICBJZiBub25lIG9mIHRoZXNlIGFyZSBkZWZpbmVkLCB0aGUgZGVmYXVsdCBpcyB0byBoYXZlIF9TVklEX1NPVVJDRSwKKyAgIF9CU0RfU09VUkNFLCBhbmQgX1BPU0lYX1NPVVJDRSBzZXQgdG8gb25lIGFuZCBfUE9TSVhfQ19TT1VSQ0Ugc2V0IHRvCisgICAyMDAxMTJMLiAgSWYgbW9yZSB0aGFuIG9uZSBvZiB0aGVzZSBhcmUgZGVmaW5lZCwgdGhleSBhY2N1bXVsYXRlLgorICAgRm9yIGV4YW1wbGUgX19TVFJJQ1RfQU5TSV9fLCBfUE9TSVhfU09VUkNFIGFuZCBfUE9TSVhfQ19TT1VSQ0UKKyAgIHRvZ2V0aGVyIGdpdmUgeW91IElTTyBDLCAxMDAzLjEsIGFuZCAxMDAzLjIsIGJ1dCBub3RoaW5nIGVsc2UuCisKKyAgIFRoZXNlIGFyZSBkZWZpbmVkIGJ5IHRoaXMgZmlsZSBhbmQgYXJlIHVzZWQgYnkgdGhlCisgICBoZWFkZXIgZmlsZXMgdG8gZGVjaWRlIHdoYXQgdG8gZGVjbGFyZSBvciBkZWZpbmU6CisKKyAgIF9fVVNFX0lTT0M5OQkJRGVmaW5lIElTTyBDOTkgdGhpbmdzLgorICAgX19VU0VfSVNPQzk1CQlEZWZpbmUgSVNPIEM5MCBBTUQxIChDOTUpIHRoaW5ncy4KKyAgIF9fVVNFX1BPU0lYCQlEZWZpbmUgSUVFRSBTdGQgMTAwMy4xIHRoaW5ncy4KKyAgIF9fVVNFX1BPU0lYMgkJRGVmaW5lIElFRUUgU3RkIDEwMDMuMiB0aGluZ3MuCisgICBfX1VTRV9QT1NJWDE5OTMwOQlEZWZpbmUgSUVFRSBTdGQgMTAwMy4xLCBhbmQgLjFiIHRoaW5ncy4KKyAgIF9fVVNFX1BPU0lYMTk5NTA2CURlZmluZSBJRUVFIFN0ZCAxMDAzLjEsIC4xYiwgLjFjIGFuZCAuMWkgdGhpbmdzLgorICAgX19VU0VfWE9QRU4JCURlZmluZSBYUEcgdGhpbmdzLgorICAgX19VU0VfWE9QRU5fRVhURU5ERUQJRGVmaW5lIFgvT3BlbiBVbml4IHRoaW5ncy4KKyAgIF9fVVNFX1VOSVg5OAkJRGVmaW5lIFNpbmdsZSBVbml4IFYyIHRoaW5ncy4KKyAgIF9fVVNFX1hPUEVOMksgICAgICAgIERlZmluZSBYUEc2IHRoaW5ncy4KKyAgIF9fVVNFX1hPUEVOMktYU0kgICAgIERlZmluZSBYUEc2IFhTSSB0aGluZ3MuCisgICBfX1VTRV9YT1BFTjJLOCAgICAgICBEZWZpbmUgWFBHNyB0aGluZ3MuCisgICBfX1VTRV9YT1BFTjJLOFhTSSAgICBEZWZpbmUgWFBHNyBYU0kgdGhpbmdzLgorICAgX19VU0VfTEFSR0VGSUxFCURlZmluZSBjb3JyZWN0IHN0YW5kYXJkIEkvTyB0aGluZ3MuCisgICBfX1VTRV9MQVJHRUZJTEU2NAlEZWZpbmUgTEZTIHRoaW5ncyB3aXRoIHNlcGFyYXRlIG5hbWVzLgorICAgX19VU0VfRklMRV9PRkZTRVQ2NAlEZWZpbmUgNjRiaXQgaW50ZXJmYWNlIGFzIGRlZmF1bHQuCisgICBfX1VTRV9CU0QJCURlZmluZSA0LjNCU0QgdGhpbmdzLgorICAgX19VU0VfU1ZJRAkJRGVmaW5lIFNWSUQgdGhpbmdzLgorICAgX19VU0VfTUlTQwkJRGVmaW5lIHRoaW5ncyBjb21tb24gdG8gQlNEIGFuZCBTeXN0ZW0gViBVbml4LgorICAgX19VU0VfQVRGSUxFCQlEZWZpbmUgKmF0IGludGVyZmFjZXMgYW5kIEFUXyogY29uc3RhbnRzIGZvciB0aGVtLgorICAgX19VU0VfR05VCQlEZWZpbmUgR05VIGV4dGVuc2lvbnMuCisgICBfX1VTRV9SRUVOVFJBTlQJRGVmaW5lIHJlZW50cmFudC90aHJlYWQtc2FmZSAqX3IgZnVuY3Rpb25zLgorICAgX19VU0VfRk9SVElGWV9MRVZFTAlBZGRpdGlvbmFsIHNlY3VyaXR5IG1lYXN1cmVzIHVzZWQsIGFjY29yZGluZyB0byBsZXZlbC4KKyAgIF9fRkFWT1JfQlNECQlGYXZvciA0LjNCU0QgdGhpbmdzIGluIGNhc2VzIG9mIGNvbmZsaWN0LgorCisgICBUaGUgbWFjcm9zIGBfX0dOVV9MSUJSQVJZX18nLCBgX19HTElCQ19fJywgYW5kIGBfX0dMSUJDX01JTk9SX18nIGFyZQorICAgZGVmaW5lZCBieSB0aGlzIGZpbGUgdW5jb25kaXRpb25hbGx5LiAgYF9fR05VX0xJQlJBUllfXycgaXMgcHJvdmlkZWQKKyAgIG9ubHkgZm9yIGNvbXBhdGliaWxpdHkuICBBbGwgbmV3IGNvZGUgc2hvdWxkIHVzZSB0aGUgb3RoZXIgc3ltYm9scworICAgdG8gdGVzdCBmb3IgZmVhdHVyZXMuCisKKyAgIEFsbCBtYWNyb3MgbGlzdGVkIGFib3ZlIGFzIHBvc3NpYmx5IGJlaW5nIGRlZmluZWQgYnkgdGhpcyBmaWxlIGFyZQorICAgZXhwbGljaXRseSB1bmRlZmluZWQgaWYgdGhleSBhcmUgbm90IGV4cGxpY2l0bHkgZGVmaW5lZC4KKyAgIEZlYXR1cmUtdGVzdCBtYWNyb3MgdGhhdCBhcmUgbm90IGRlZmluZWQgYnkgdGhlIHVzZXIgb3IgY29tcGlsZXIKKyAgIGJ1dCBhcmUgaW1wbGllZCBieSB0aGUgb3RoZXIgZmVhdHVyZS10ZXN0IG1hY3JvcyBkZWZpbmVkIChvciBieSB0aGUKKyAgIGxhY2sgb2YgYW55IGRlZmluaXRpb25zKSBhcmUgZGVmaW5lZCBieSB0aGUgZmlsZS4gICovCisKKworLyogVW5kZWZpbmUgZXZlcnl0aGluZywgc28gd2UgZ2V0IGEgY2xlYW4gc2xhdGUuICAqLworI3VuZGVmCV9fVVNFX0lTT0M5OQorI3VuZGVmCV9fVVNFX0lTT0M5NQorI3VuZGVmCV9fVVNFX1BPU0lYCisjdW5kZWYJX19VU0VfUE9TSVgyCisjdW5kZWYJX19VU0VfUE9TSVgxOTkzMDkKKyN1bmRlZglfX1VTRV9QT1NJWDE5OTUwNgorI3VuZGVmCV9fVVNFX1hPUEVOCisjdW5kZWYJX19VU0VfWE9QRU5fRVhURU5ERUQKKyN1bmRlZglfX1VTRV9VTklYOTgKKyN1bmRlZglfX1VTRV9YT1BFTjJLCisjdW5kZWYJX19VU0VfWE9QRU4yS1hTSQorI3VuZGVmCV9fVVNFX1hPUEVOMks4CisjdW5kZWYJX19VU0VfWE9QRU4ySzhYU0kKKyN1bmRlZglfX1VTRV9MQVJHRUZJTEUKKyN1bmRlZglfX1VTRV9MQVJHRUZJTEU2NAorI3VuZGVmCV9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyN1bmRlZglfX1VTRV9CU0QKKyN1bmRlZglfX1VTRV9TVklECisjdW5kZWYJX19VU0VfTUlTQworI3VuZGVmCV9fVVNFX0FURklMRQorI3VuZGVmCV9fVVNFX0dOVQorI3VuZGVmCV9fVVNFX1JFRU5UUkFOVAorI3VuZGVmCV9fVVNFX0ZPUlRJRllfTEVWRUwKKyN1bmRlZglfX0ZBVk9SX0JTRAorI3VuZGVmCV9fS0VSTkVMX1NUUklDVF9OQU1FUworCisvKiBTdXBwcmVzcyBrZXJuZWwtbmFtZSBzcGFjZSBwb2xsdXRpb24gdW5sZXNzIHVzZXIgZXhwcmVzc2VkbHkgYXNrcworICAgZm9yIGl0LiAgKi8KKyNpZm5kZWYgX0xPT1NFX0tFUk5FTF9OQU1FUworIyBkZWZpbmUgX19LRVJORUxfU1RSSUNUX05BTUVTCisjZW5kaWYKKworLyogQWx3YXlzIHVzZSBJU08gQyB0aGluZ3MuICAqLworI2RlZmluZQlfX1VTRV9BTlNJCTEKKworLyogQ29udmVuaWVuY2UgbWFjcm9zIHRvIHRlc3QgdGhlIHZlcnNpb25zIG9mIGdsaWJjIGFuZCBnY2MuCisgICBVc2UgdGhlbSBsaWtlIHRoaXM6CisgICAjaWYgX19HTlVDX1BSRVJFUSAoMiw4KQorICAgLi4uIGNvZGUgcmVxdWlyaW5nIGdjYyAyLjggb3IgbGF0ZXIgLi4uCisgICAjZW5kaWYKKyAgIE5vdGUgLSB0aGV5IHdvbid0IHdvcmsgZm9yIGdjYzEgb3IgZ2xpYmMxLCBzaW5jZSB0aGUgX01JTk9SIG1hY3JvcworICAgd2VyZSBub3QgZGVmaW5lZCB0aGVuLiAgKi8KKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIGRlZmluZWQgX19HTlVDX01JTk9SX18KKyMgZGVmaW5lIF9fR05VQ19QUkVSRVEobWFqLCBtaW4pIFwKKwkoKF9fR05VQ19fIDw8IDE2KSArIF9fR05VQ19NSU5PUl9fID49ICgobWFqKSA8PCAxNikgKyAobWluKSkKKyNlbHNlCisjIGRlZmluZSBfX0dOVUNfUFJFUkVRKG1haiwgbWluKSAwCisjZW5kaWYKKworCisvKiBJZiBfQlNEX1NPVVJDRSB3YXMgZGVmaW5lZCBieSB0aGUgdXNlciwgZmF2b3IgQlNEIG92ZXIgUE9TSVguICAqLworI2lmIGRlZmluZWQgX0JTRF9TT1VSQ0UgJiYgXAorICAgICEoZGVmaW5lZCBfUE9TSVhfU09VUkNFIHx8IGRlZmluZWQgX1BPU0lYX0NfU09VUkNFIHx8IFwKKyAgICAgIGRlZmluZWQgX1hPUEVOX1NPVVJDRSB8fCBkZWZpbmVkIF9HTlVfU09VUkNFIHx8IGRlZmluZWQgX1NWSURfU09VUkNFKQorIyBkZWZpbmUgX19GQVZPUl9CU0QJMQorI2VuZGlmCisKKy8qIElmIF9HTlVfU09VUkNFIHdhcyBkZWZpbmVkIGJ5IHRoZSB1c2VyLCB0dXJuIG9uIGFsbCB0aGUgb3RoZXIgZmVhdHVyZXMuICAqLworI2lmZGVmIF9HTlVfU09VUkNFCisjIHVuZGVmICBfSVNPQzk1X1NPVVJDRQorIyBkZWZpbmUgX0lTT0M5NV9TT1VSQ0UJMQorIyB1bmRlZiAgX0lTT0M5OV9TT1VSQ0UKKyMgZGVmaW5lIF9JU09DOTlfU09VUkNFCTEKKyMgdW5kZWYgIF9QT1NJWF9TT1VSQ0UKKyMgZGVmaW5lIF9QT1NJWF9TT1VSQ0UJMQorIyB1bmRlZiAgX1BPU0lYX0NfU09VUkNFCisjIGRlZmluZSBfUE9TSVhfQ19TT1VSQ0UJMjAwODA5TAorIyB1bmRlZiAgX1hPUEVOX1NPVVJDRQorIyBkZWZpbmUgX1hPUEVOX1NPVVJDRQk3MDAKKyMgdW5kZWYgIF9YT1BFTl9TT1VSQ0VfRVhURU5ERUQKKyMgZGVmaW5lIF9YT1BFTl9TT1VSQ0VfRVhURU5ERUQJMQorIyB1bmRlZgkgX0xBUkdFRklMRTY0X1NPVVJDRQorIyBkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRQkxCisjIHVuZGVmICBfQlNEX1NPVVJDRQorIyBkZWZpbmUgX0JTRF9TT1VSQ0UJMQorIyB1bmRlZiAgX1NWSURfU09VUkNFCisjIGRlZmluZSBfU1ZJRF9TT1VSQ0UJMQorIyB1bmRlZiAgX0FURklMRV9TT1VSQ0UKKyMgZGVmaW5lIF9BVEZJTEVfU09VUkNFCTEKKyNlbmRpZgorCisvKiBJZiBub3RoaW5nIChvdGhlciB0aGFuIF9HTlVfU09VUkNFKSBpcyBkZWZpbmVkLAorICAgZGVmaW5lIF9CU0RfU09VUkNFIGFuZCBfU1ZJRF9TT1VSQ0UuICAqLworI2lmICghZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gJiYgIWRlZmluZWQgX0lTT0M5OV9TT1VSQ0UgJiYgXAorICAgICAhZGVmaW5lZCBfUE9TSVhfU09VUkNFICYmICFkZWZpbmVkIF9QT1NJWF9DX1NPVVJDRSAmJiBcCisgICAgICFkZWZpbmVkIF9YT1BFTl9TT1VSQ0UgJiYgIWRlZmluZWQgX0JTRF9TT1VSQ0UgJiYgIWRlZmluZWQgX1NWSURfU09VUkNFKQorIyBkZWZpbmUgX0JTRF9TT1VSQ0UJMQorIyBkZWZpbmUgX1NWSURfU09VUkNFCTEKKyNlbmRpZgorCisvKiBUaGlzIGlzIHRvIGVuYWJsZSB0aGUgSVNPIEM5OSBleHRlbnNpb24uICBBbHNvIHJlY29nbml6ZSB0aGUgb2xkIG1hY3JvCisgICB3aGljaCB3YXMgdXNlZCBwcmlvciB0byB0aGUgc3RhbmRhcmQgYWNjZXB0YW5jZS4gIFRoaXMgbWFjcm8gd2lsbAorICAgZXZlbnR1YWxseSBnbyBhd2F5IGFuZCB0aGUgZmVhdHVyZXMgZW5hYmxlZCBieSBkZWZhdWx0IG9uY2UgdGhlIElTTyBDOTkKKyAgIHN0YW5kYXJkIGlzIHdpZGVseSBhZG9wdGVkLiAgKi8KKyNpZiAoZGVmaW5lZCBfSVNPQzk5X1NPVVJDRSB8fCBkZWZpbmVkIF9JU09DOVhfU09VUkNFIFwKKyAgICAgfHwgKGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpKQorIyBkZWZpbmUgX19VU0VfSVNPQzk5CTEKKyNlbmRpZgorCisvKiBUaGlzIGlzIHRvIGVuYWJsZSB0aGUgSVNPIEM5MCBBbWVuZG1lbnQgMToxOTk1IGV4dGVuc2lvbi4gICovCisjaWYgKGRlZmluZWQgX0lTT0M5OV9TT1VSQ0UgfHwgZGVmaW5lZCBfSVNPQzlYX1NPVVJDRSBcCisgICAgIHx8IChkZWZpbmVkIF9fU1REQ19WRVJTSU9OX18gJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk0MDlMKSkKKyMgZGVmaW5lIF9fVVNFX0lTT0M5NQkxCisjZW5kaWYKKworLyogSWYgbm9uZSBvZiB0aGUgQU5TSS9QT1NJWCBtYWNyb3MgYXJlIGRlZmluZWQsIHVzZSBQT1NJWC4xIGFuZCBQT1NJWC4yCisgICAoYW5kIElFRUUgU3RkIDEwMDMuMWItMTk5MyB1bmxlc3MgX1hPUEVOX1NPVVJDRSBpcyBkZWZpbmVkKS4gICovCisjaWYgKCghZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gfHwgKF9YT1BFTl9TT1VSQ0UgLSAwKSA+PSA1MDApICYmIFwKKyAgICAgIWRlZmluZWQgX1BPU0lYX1NPVVJDRSAmJiAhZGVmaW5lZCBfUE9TSVhfQ19TT1VSQ0UpCisjIGRlZmluZSBfUE9TSVhfU09VUkNFCTEKKyMgaWYgZGVmaW5lZCBfWE9QRU5fU09VUkNFICYmIChfWE9QRU5fU09VUkNFIC0gMCkgPCA1MDAKKyMgIGRlZmluZSBfUE9TSVhfQ19TT1VSQ0UJMgorIyBlbGlmIGRlZmluZWQgX1hPUEVOX1NPVVJDRSAmJiAoX1hPUEVOX1NPVVJDRSAtIDApIDwgNjAwCisjICBkZWZpbmUgX1BPU0lYX0NfU09VUkNFCTE5OTUwNkwKKyMgZWxpZiBkZWZpbmVkIF9YT1BFTl9TT1VSQ0UgJiYgKF9YT1BFTl9TT1VSQ0UgLSAwKSA8IDcwMAorIyAgZGVmaW5lIF9QT1NJWF9DX1NPVVJDRQkyMDAxMTJMCisjIGVsc2UKKyMgIGRlZmluZSBfUE9TSVhfQ19TT1VSQ0UJMjAwODA5TAorIyBlbmRpZgorIyBkZWZpbmUgX19VU0VfUE9TSVhfSU1QTElDSVRMWQkxCisjZW5kaWYKKworI2lmIGRlZmluZWQgX1BPU0lYX1NPVVJDRSB8fCBfUE9TSVhfQ19TT1VSQ0UgPj0gMSB8fCBkZWZpbmVkIF9YT1BFTl9TT1VSQ0UKKyMgZGVmaW5lIF9fVVNFX1BPU0lYCTEKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfUE9TSVhfQ19TT1VSQ0UgJiYgX1BPU0lYX0NfU09VUkNFID49IDIgfHwgZGVmaW5lZCBfWE9QRU5fU09VUkNFCisjIGRlZmluZSBfX1VTRV9QT1NJWDIJMQorI2VuZGlmCisKKyNpZiAoX1BPU0lYX0NfU09VUkNFIC0gMCkgPj0gMTk5MzA5TAorIyBkZWZpbmUgX19VU0VfUE9TSVgxOTkzMDkJMQorI2VuZGlmCisKKyNpZiAoX1BPU0lYX0NfU09VUkNFIC0gMCkgPj0gMTk5NTA2TAorIyBkZWZpbmUgX19VU0VfUE9TSVgxOTk1MDYJMQorI2VuZGlmCisKKyNpZiAoX1BPU0lYX0NfU09VUkNFIC0gMCkgPj0gMjAwMTEyTAorIyBkZWZpbmUgX19VU0VfWE9QRU4ySwkJMQorIyB1bmRlZiBfX1VTRV9JU09DOTUKKyMgZGVmaW5lIF9fVVNFX0lTT0M5NQkJMQorIyB1bmRlZiBfX1VTRV9JU09DOTkKKyMgZGVmaW5lIF9fVVNFX0lTT0M5OQkJMQorI2VuZGlmCisKKyNpZiAoX1BPU0lYX0NfU09VUkNFIC0gMCkgPj0gMjAwODA5TAorIyBkZWZpbmUgX19VU0VfWE9QRU4ySzgJCTEKKyMgdW5kZWYgIF9BVEZJTEVfU09VUkNFCisjIGRlZmluZSBfQVRGSUxFX1NPVVJDRQkxCisjZW5kaWYKKworI2lmZGVmCV9YT1BFTl9TT1VSQ0UKKyMgZGVmaW5lIF9fVVNFX1hPUEVOCTEKKyMgaWYgKF9YT1BFTl9TT1VSQ0UgLSAwKSA+PSA1MDAKKyMgIGRlZmluZSBfX1VTRV9YT1BFTl9FWFRFTkRFRAkxCisjICBkZWZpbmUgX19VU0VfVU5JWDk4CTEKKyMgIHVuZGVmIF9MQVJHRUZJTEVfU09VUkNFCisjICBkZWZpbmUgX0xBUkdFRklMRV9TT1VSQ0UJMQorIyAgaWYgKF9YT1BFTl9TT1VSQ0UgLSAwKSA+PSA2MDAKKyMgICBpZiAoX1hPUEVOX1NPVVJDRSAtIDApID49IDcwMAorIyAgICBkZWZpbmUgX19VU0VfWE9QRU4ySzgJMQorIyAgICBkZWZpbmUgX19VU0VfWE9QRU4ySzhYU0kJMQorIyAgIGVuZGlmCisjICAgZGVmaW5lIF9fVVNFX1hPUEVOMksJMQorIyAgIGRlZmluZSBfX1VTRV9YT1BFTjJLWFNJCTEKKyMgICB1bmRlZiBfX1VTRV9JU09DOTUKKyMgICBkZWZpbmUgX19VU0VfSVNPQzk1CQkxCisjICAgdW5kZWYgX19VU0VfSVNPQzk5CisjICAgZGVmaW5lIF9fVVNFX0lTT0M5OQkJMQorIyAgZW5kaWYKKyMgZWxzZQorIyAgaWZkZWYgX1hPUEVOX1NPVVJDRV9FWFRFTkRFRAorIyAgIGRlZmluZSBfX1VTRV9YT1BFTl9FWFRFTkRFRAkxCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfTEFSR0VGSUxFX1NPVVJDRQorIyBkZWZpbmUgX19VU0VfTEFSR0VGSUxFCTEKKyNlbmRpZgorCisjaWZkZWYgX0xBUkdFRklMRTY0X1NPVVJDRQorIyBkZWZpbmUgX19VU0VfTEFSR0VGSUxFNjQJMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9GSUxFX09GRlNFVF9CSVRTICYmIF9GSUxFX09GRlNFVF9CSVRTID09IDY0CisjIGRlZmluZSBfX1VTRV9GSUxFX09GRlNFVDY0CTEKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfQlNEX1NPVVJDRSB8fCBkZWZpbmVkIF9TVklEX1NPVVJDRQorIyBkZWZpbmUgX19VU0VfTUlTQwkxCisjZW5kaWYKKworI2lmZGVmCV9CU0RfU09VUkNFCisjIGRlZmluZSBfX1VTRV9CU0QJMQorI2VuZGlmCisKKyNpZmRlZglfU1ZJRF9TT1VSQ0UKKyMgZGVmaW5lIF9fVVNFX1NWSUQJMQorI2VuZGlmCisKKyNpZmRlZglfQVRGSUxFX1NPVVJDRQorIyBkZWZpbmUgX19VU0VfQVRGSUxFCTEKKyNlbmRpZgorCisjaWZkZWYJX0dOVV9TT1VSQ0UKKyMgZGVmaW5lIF9fVVNFX0dOVQkxCisjZW5kaWYKKworI2lmIGRlZmluZWQgX1JFRU5UUkFOVCB8fCBkZWZpbmVkIF9USFJFQURfU0FGRQorIyBkZWZpbmUgX19VU0VfUkVFTlRSQU5UCTEKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfRk9SVElGWV9TT1VSQ0UgJiYgX0ZPUlRJRllfU09VUkNFID4gMCBcCisgICAgJiYgX19HTlVDX1BSRVJFUSAoNCwgMSkgJiYgZGVmaW5lZCBfX09QVElNSVpFX18gJiYgX19PUFRJTUlaRV9fID4gMAorIyBpZiBfRk9SVElGWV9TT1VSQ0UgPiAxCisjICBkZWZpbmUgX19VU0VfRk9SVElGWV9MRVZFTCAyCisjIGVsc2UKKyMgIGRlZmluZSBfX1VTRV9GT1JUSUZZX0xFVkVMIDEKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBfX1VTRV9GT1JUSUZZX0xFVkVMIDAKKyNlbmRpZgorCisvKiBEZWZpbmUgX19TVERDX0lFQ181NTlfXyBhbmQgb3RoZXIgc2ltaWxhciBtYWNyb3MuICAqLworI2luY2x1ZGUgPGJpdHMvcHJlZGVmcy5oPgorCisvKiB3Y2hhcl90IHVzZXMgSVNPIDEwNjQ2LTEgKDJuZCBlZC4sIHB1Ymxpc2hlZCAyMDAwLTA5LTE1KSAvIFVuaWNvZGUgMy4xLiAgKi8KKyNkZWZpbmUgX19TVERDX0lTT18xMDY0Nl9fCQkyMDAwMDlMCisKKy8qIFRoaXMgbWFjcm8gaW5kaWNhdGVzIHRoYXQgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGlzIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgRm9yIGhpc3RvcmljIHJlYXNvbnMgdGhlIHZhbHVlIG5vdyBpcyA2IGFuZCB0aGlzIHdpbGwgc3RheSBmcm9tIG5vdworICAgb24uICBUaGUgdXNlIG9mIHRoaXMgdmFyaWFibGUgaXMgZGVwcmVjYXRlZC4gIFVzZSBfX0dMSUJDX18gYW5kCisgICBfX0dMSUJDX01JTk9SX18gbm93IChzZWUgYmVsb3cpIHdoZW4geW91IHdhbnQgdG8gdGVzdCBmb3IgYSBzcGVjaWZpYworICAgR05VIEMgbGlicmFyeSB2ZXJzaW9uIGFuZCB1c2UgdGhlIHZhbHVlcyBpbiA8Z251L2xpYi1uYW1lcy5oPiB0byBnZXQKKyAgIHRoZSBzb25hbWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzLiAgKi8KKyN1bmRlZiAgX19HTlVfTElCUkFSWV9fCisjZGVmaW5lIF9fR05VX0xJQlJBUllfXyA2CisKKy8qIE1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgR05VIEMgbGlicmFyeSBwYWNrYWdlLiAgVXNlCisgICB0aGVzZSBtYWNyb3MgdG8gdGVzdCBmb3IgZmVhdHVyZXMgaW4gc3BlY2lmaWMgcmVsZWFzZXMuICAqLworI2RlZmluZQlfX0dMSUJDX18JMgorI2RlZmluZQlfX0dMSUJDX01JTk9SX18JMTUKKworI2RlZmluZSBfX0dMSUJDX1BSRVJFUShtYWosIG1pbikgXAorCSgoX19HTElCQ19fIDw8IDE2KSArIF9fR0xJQkNfTUlOT1JfXyA+PSAoKG1haikgPDwgMTYpICsgKG1pbikpCisKKy8qIERlY2lkZSB3aGV0aGVyIGEgY29tcGlsZXIgc3VwcG9ydHMgdGhlIGxvbmcgbG9uZyBkYXRhdHlwZXMuICAqLworI2lmIGRlZmluZWQgX19HTlVDX18gXAorICAgIHx8IChkZWZpbmVkIF9fUEdJICYmIGRlZmluZWQgX19pMzg2X18gKSBcCisgICAgfHwgKGRlZmluZWQgX19JTlRFTF9DT01QSUxFUiAmJiAoZGVmaW5lZCBfX2kzODZfXyB8fCBkZWZpbmVkIF9faWE2NF9fKSkgXAorICAgIHx8IChkZWZpbmVkIF9fU1REQ19WRVJTSU9OX18gJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMKQorIyBkZWZpbmUgX19HTElCQ19IQVZFX0xPTkdfTE9ORwkxCisjZW5kaWYKKworLyogVGhpcyBpcyBoZXJlIG9ubHkgYmVjYXVzZSBldmVyeSBoZWFkZXIgZmlsZSBhbHJlYWR5IGluY2x1ZGVzIHRoaXMgb25lLiAgKi8KKyNpZm5kZWYgX19BU1NFTUJMRVJfXworIyBpZm5kZWYgX1NZU19DREVGU19ICisjICBpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyMgZW5kaWYKKworLyogSWYgd2UgZG9uJ3QgaGF2ZSBfX1JFRElSRUNULCBwcm90b3R5cGVzIHdpbGwgYmUgbWlzc2luZyBpZgorICAgX19VU0VfRklMRV9PRkZTRVQ2NCBidXQgbm90IF9fVVNFX0xBUkdFRklMRVs2NF0uICovCisjIGlmIGRlZmluZWQgX19VU0VfRklMRV9PRkZTRVQ2NCAmJiAhZGVmaW5lZCBfX1JFRElSRUNUCisjICBkZWZpbmUgX19VU0VfTEFSR0VGSUxFCTEKKyMgIGRlZmluZSBfX1VTRV9MQVJHRUZJTEU2NAkxCisjIGVuZGlmCisKKyNlbmRpZgkvKiAhQVNTRU1CTEVSICovCisKKy8qIERlY2lkZSB3aGV0aGVyIHdlIGNhbiBkZWZpbmUgJ2V4dGVybiBpbmxpbmUnIGZ1bmN0aW9ucyBpbiBoZWFkZXJzLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICgyLCA3KSAmJiBkZWZpbmVkIF9fT1BUSU1JWkVfXyBcCisgICAgJiYgIWRlZmluZWQgX19PUFRJTUlaRV9TSVpFX18gJiYgIWRlZmluZWQgX19OT19JTkxJTkVfXyBcCisgICAgJiYgZGVmaW5lZCBfX2V4dGVybl9pbmxpbmUKKyMgZGVmaW5lIF9fVVNFX0VYVEVSTl9JTkxJTkVTCTEKKyNlbmRpZgorCisvKiBUaGVyZSBhcmUgc29tZSBmdW5jdGlvbnMgdGhhdCBtdXN0IGJlIGRlY2xhcmVkICdleHRlcm4gaW5saW5lJyBldmVuIHdpdGgKKyAgIC1PcyB3aGVuIGJ1aWxkaW5nIExJQkMsIG9yIHRoZXknbGwgZW5kIHVwIHVuZGVmaW5lZC4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMiwgNykgJiYgZGVmaW5lZCBfX09QVElNSVpFX18gXAorICAgICYmIChkZWZpbmVkIF9MSUJDIHx8ICFkZWZpbmVkIF9fT1BUSU1JWkVfU0laRV9fKSAmJiAhZGVmaW5lZCBfX05PX0lOTElORV9fIFwKKyAgICAmJiBkZWZpbmVkIF9fZXh0ZXJuX2lubGluZQorIyBkZWZpbmUgX19VU0VfRVhURVJOX0lOTElORVNfSU5fTElCQwkxCisjZW5kaWYKKworCisvKiBUaGlzIGlzIGhlcmUgb25seSBiZWNhdXNlIGV2ZXJ5IGhlYWRlciBmaWxlIGFscmVhZHkgaW5jbHVkZXMgdGhpcyBvbmUuCisgICBHZXQgdGhlIGRlZmluaXRpb25zIG9mIGFsbCB0aGUgYXBwcm9wcmlhdGUgYF9fc3R1Yl9GVU5DVElPTicgc3ltYm9scy4KKyAgIDxnbnUvc3R1YnMuaD4gY29udGFpbnMgYCNkZWZpbmUgX19zdHViX0ZVTkNUSU9OJyB3aGVuIEZVTkNUSU9OIGlzIGEgc3R1YgorICAgdGhhdCB3aWxsIGFsd2F5cyByZXR1cm4gZmFpbHVyZSAoYW5kIHNldCBlcnJubyB0byBFTk9TWVMpLiAgKi8KKyNpbmNsdWRlIDxnbnUvc3R1YnMuaD4KKworCisjZW5kaWYJLyogZmVhdHVyZXMuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZmVudi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9mZW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwNmYwMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZmVudi5oCkBAIC0wLDAgKzEsMTM2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKiBJU08gQzk5IDcuNjogRmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQJPGZlbnYuaD4KKyAqLworCisjaWZuZGVmIF9GRU5WX0gKKyNkZWZpbmUgX0ZFTlZfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgdGhlIGFyY2hpdGVjdHVyZSBkZXBlbmRlbmQgZGVmaW5pdGlvbnMuICBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zCisgICBhcmUgZXhwZWN0ZWQgdG8gYmUgZG9uZToKKworICAgZmVudl90CXR5cGUgZm9yIG9iamVjdCByZXByZXNlbnRpbmcgYW4gZW50aXJlIGZsb2F0aW5nLXBvaW50CisJCWVudmlyb25tZW50CisKKyAgIEZFX0RGTF9FTlYJbWFjcm8gb2YgdHlwZSBwb2ludGVyIHRvIGZlbnZfdCB0byBiZSB1c2VkIGFzIHRoZSBhcmd1bWVudAorCQl0byBmdW5jdGlvbnMgdGFraW5nIGFuIGFyZ3VtZW50IG9mIHR5cGUgZmVudl90OyBpbiB0aGlzCisJCWNhc2UgdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQgd2lsbCBiZSB1c2VkCisKKyAgIGZleGNlcHRfdAl0eXBlIGZvciBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBmbG9hdGluZy1wb2ludCBleGNlcHRpb24KKwkJZmxhZ3MgaW5jbHVkaW5nIHN0YXR1cyBhc3NvY2lhdGVkIHdpdGggdGhlIGZsYWdzCisKKyAgIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBkZWZpbmVkIGlmZiB0aGUgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgdGhpcworICAga2luZCBvZiBleGNlcHRpb24uCisgICBGRV9JTkVYQUNUCQlpbmV4YWN0IHJlc3VsdAorICAgRkVfRElWQllaRVJPCQlkaXZpc2lvbiBieSB6ZXJvCisgICBGRV9VTkRFUkZMT1cJCXJlc3VsdCBub3QgcmVwcmVzZW50YWJsZSBkdWUgdG8gdW5kZXJmbG93CisgICBGRV9PVkVSRkxPVwkJcmVzdWx0IG5vdCByZXByZXNlbnRhYmxlIGR1ZSB0byBvdmVyZmxvdworICAgRkVfSU5WQUxJRAkJaW52YWxpZCBvcGVyYXRpb24KKworICAgRkVfQUxMX0VYQ0VQVAliaXR3aXNlIE9SIG9mIGFsbCBzdXBwb3J0ZWQgZXhjZXB0aW9ucworCisgICBUaGUgbmV4dCBtYWNyb3MgYXJlIGRlZmluZWQgaWZmIHRoZSBhcHByb3ByaWF0ZSByb3VuZGluZyBtb2RlIGlzCisgICBzdXBwb3J0ZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uLgorICAgRkVfVE9ORUFSRVNUCQlyb3VuZCB0byBuZWFyZXN0CisgICBGRV9VUFdBUkQJCXJvdW5kIHRvd2FyZCArSW5mCisgICBGRV9ET1dOV0FSRAkJcm91bmQgdG93YXJkIC1JbmYKKyAgIEZFX1RPV0FSRFpFUk8Jcm91bmQgdG93YXJkIDAKKyovCisjaW5jbHVkZSA8Yml0cy9mZW52Lmg+CisKK19fQkVHSU5fREVDTFMKKworLyogRmxvYXRpbmctcG9pbnQgZXhjZXB0aW9uIGhhbmRsaW5nLiAgKi8KKworLyogQ2xlYXIgdGhlIHN1cHBvcnRlZCBleGNlcHRpb25zIHJlcHJlc2VudGVkIGJ5IEVYQ0VQVFMuICAqLworZXh0ZXJuIGludCBmZWNsZWFyZXhjZXB0IChpbnQgX19leGNlcHRzKSBfX1RIUk9XOworCisvKiBTdG9yZSBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBleGNlcHRpb24gZmxhZ3MKKyAgIGluZGljYXRlZCBieSBFWENFUFRTIGluIHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSBGTEFHUC4gICovCitleHRlcm4gaW50IGZlZ2V0ZXhjZXB0ZmxhZyAoZmV4Y2VwdF90ICpfX2ZsYWdwLCBpbnQgX19leGNlcHRzKSBfX1RIUk9XOworCisvKiBSYWlzZSB0aGUgc3VwcG9ydGVkIGV4Y2VwdGlvbnMgcmVwcmVzZW50ZWQgYnkgRVhDRVBUUy4gICovCitleHRlcm4gaW50IGZlcmFpc2VleGNlcHQgKGludCBfX2V4Y2VwdHMpIF9fVEhST1c7CisKKy8qIFNldCBjb21wbGV0ZSBzdGF0dXMgZm9yIGV4Y2VwdGlvbnMgaW5kaWNhdGVkIGJ5IEVYQ0VQVFMgYWNjb3JkaW5nIHRvCisgICB0aGUgcmVwcmVzZW50YXRpb24gaW4gdGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5IEZMQUdQLiAgKi8KK2V4dGVybiBpbnQgZmVzZXRleGNlcHRmbGFnIChfX2NvbnN0IGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykgX19USFJPVzsKKworLyogRGV0ZXJtaW5lIHdoaWNoIG9mIHN1YnNldCBvZiB0aGUgZXhjZXB0aW9ucyBzcGVjaWZpZWQgYnkgRVhDRVBUUyBhcmUKKyAgIGN1cnJlbnRseSBzZXQuICAqLworZXh0ZXJuIGludCBmZXRlc3RleGNlcHQgKGludCBfX2V4Y2VwdHMpIF9fVEhST1c7CisKKworLyogUm91bmRpbmcgY29udHJvbC4gICovCisKKy8qIEdldCBjdXJyZW50IHJvdW5kaW5nIGRpcmVjdGlvbi4gICovCitleHRlcm4gaW50IGZlZ2V0cm91bmQgKHZvaWQpIF9fVEhST1c7CisKKy8qIEVzdGFibGlzaCB0aGUgcm91bmRpbmcgZGlyZWN0aW9uIHJlcHJlc2VudGVkIGJ5IFJPVU5ELiAgKi8KK2V4dGVybiBpbnQgZmVzZXRyb3VuZCAoaW50IF9fcm91bmRpbmdfZGlyZWN0aW9uKSBfX1RIUk9XOworCisKKy8qIEZsb2F0aW5nLXBvaW50IGVudmlyb25tZW50LiAgKi8KKworLyogU3RvcmUgdGhlIGN1cnJlbnQgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQgaW4gdGhlIG9iamVjdCBwb2ludGVkCisgICB0byBieSBFTlZQLiAgKi8KK2V4dGVybiBpbnQgZmVnZXRlbnYgKGZlbnZfdCAqX19lbnZwKSBfX1RIUk9XOworCisvKiBTYXZlIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGluIHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSBFTlZQLCBjbGVhcgorICAgZXhjZXB0aW9uIGZsYWdzIGFuZCBpbnN0YWxsIGEgbm9uLXN0b3AgbW9kZSAoaWYgYXZhaWxhYmxlKSBmb3IgYWxsCisgICBleGNlcHRpb25zLiAgKi8KK2V4dGVybiBpbnQgZmVob2xkZXhjZXB0IChmZW52X3QgKl9fZW52cCkgX19USFJPVzsKKworLyogRXN0YWJsaXNoIHRoZSBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCByZXByZXNlbnRlZCBieSB0aGUgb2JqZWN0CisgICBwb2ludGVkIHRvIGJ5IEVOVlAuICAqLworZXh0ZXJuIGludCBmZXNldGVudiAoX19jb25zdCBmZW52X3QgKl9fZW52cCkgX19USFJPVzsKKworLyogU2F2ZSBjdXJyZW50IGV4Y2VwdGlvbnMgaW4gdGVtcG9yYXJ5IHN0b3JhZ2UsIGluc3RhbGwgZW52aXJvbm1lbnQKKyAgIHJlcHJlc2VudGVkIGJ5IG9iamVjdCBwb2ludGVkIHRvIGJ5IEVOVlAgYW5kIHJhaXNlIGV4Y2VwdGlvbnMKKyAgIGFjY29yZGluZyB0byBzYXZlZCBleGNlcHRpb25zLiAgKi8KK2V4dGVybiBpbnQgZmV1cGRhdGVlbnYgKF9fY29uc3QgZmVudl90ICpfX2VudnApIF9fVEhST1c7CisKKworLyogSW5jbHVkZSBvcHRpbWl6YXRpb24uICAqLworI2lmZGVmIF9fT1BUSU1JWkVfXworIyBpbmNsdWRlIDxiaXRzL2ZlbnZpbmxpbmUuaD4KKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisKKy8qIEVuYWJsZSBpbmRpdmlkdWFsIGV4Y2VwdGlvbnMuICBXaWxsIG5vdCBlbmFibGUgbW9yZSBleGNlcHRpb25zIHRoYW4KKyAgIEVYQ0VQVFMgc3BlY2lmaWVzLiAgUmV0dXJucyB0aGUgcHJldmlvdXMgZW5hYmxlZCBleGNlcHRpb25zIGlmIGFsbAorICAgZXhjZXB0aW9ucyBhcmUgc3VjY2Vzc2Z1bGx5IHNldCwgb3RoZXJ3aXNlIHJldHVybnMgLTEuICAqLworZXh0ZXJuIGludCBmZWVuYWJsZWV4Y2VwdCAoaW50IF9fZXhjZXB0cykgX19USFJPVzsKKworLyogRGlzYWJsZSBpbmRpdmlkdWFsIGV4Y2VwdGlvbnMuICBXaWxsIG5vdCBkaXNhYmxlIG1vcmUgZXhjZXB0aW9ucyB0aGFuCisgICBFWENFUFRTIHNwZWNpZmllcy4gIFJldHVybnMgdGhlIHByZXZpb3VzIGVuYWJsZWQgZXhjZXB0aW9ucyBpZiBhbGwKKyAgIGV4Y2VwdGlvbnMgYXJlIHN1Y2Nlc3NmdWxseSBkaXNhYmxlZCwgb3RoZXJ3aXNlIHJldHVybnMgLTEuICAqLworZXh0ZXJuIGludCBmZWRpc2FibGVleGNlcHQgKGludCBfX2V4Y2VwdHMpIF9fVEhST1c7CisKKy8qIFJldHVybiBlbmFibGVkIGV4Y2VwdGlvbnMuICAqLworZXh0ZXJuIGludCBmZWdldGV4Y2VwdCAodm9pZCkgX19USFJPVzsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogZmVudi5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2ZtdG1zZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9mbXRtc2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2UzZTUzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9mbXRtc2cuaApAQCAtMCwwICsxLDEwNiBAQAorLyogTWVzc2FnZSBkaXNwbGF5IGhhbmRsaW5nLgorICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk5LCAyMDAwLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9fRk1UTVNHX0gKKyNkZWZpbmUgX19GTVRNU0dfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogVmFsdWVzIHRvIGNvbnRyb2wgYGZtdG1zZycgZnVuY3Rpb24uICAqLworZW51bQoreworICBNTV9IQVJEID0gMHgwMDEsCS8qIFNvdXJjZSBvZiB0aGUgY29uZGl0aW9uIGlzIGhhcmR3YXJlLiAgKi8KKyNkZWZpbmUgTU1fSEFSRCBNTV9IQVJECisgIE1NX1NPRlQgPSAweDAwMiwJLyogU291cmNlIG9mIHRoZSBjb25kaXRpb24gaXMgc29mdHdhcmUuICAqLworI2RlZmluZSBNTV9TT0ZUIE1NX1NPRlQKKyAgTU1fRklSTSA9IDB4MDA0LAkvKiBTb3VyY2Ugb2YgdGhlIGNvbmRpdGlvbiBpcyBmaXJtd2FyZS4gICovCisjZGVmaW5lIE1NX0ZJUk0gTU1fRklSTQorICBNTV9BUFBMID0gMHgwMDgsCS8qIENvbmRpdGlvbiBkZXRlY3RlZCBieSBhcHBsaWNhdGlvbi4gICovCisjZGVmaW5lIE1NX0FQUEwgTU1fQVBQTAorICBNTV9VVElMID0gMHgwMTAsCS8qIENvbmRpdGlvbiBkZXRlY3RlZCBieSB1dGlsaXR5LiAgKi8KKyNkZWZpbmUgTU1fVVRJTCBNTV9VVElMCisgIE1NX09QU1lTID0gMHgwMjAsCS8qIENvbmRpdGlvbiBkZXRlY3RlZCBieSBvcGVyYXRpbmcgc3lzdGVtLiAgKi8KKyNkZWZpbmUgTU1fT1BTWVMgTU1fT1BTWVMKKyAgTU1fUkVDT1ZFUiA9IDB4MDQwLAkvKiBSZWNvdmVyYWJsZSBlcnJvci4gICovCisjZGVmaW5lIE1NX1JFQ09WRVIgTU1fUkVDT1ZFUgorICBNTV9OUkVDT1YgPSAweDA4MCwJLyogTm9uLXJlY292ZXJhYmxlIGVycm9yLiAgKi8KKyNkZWZpbmUgTU1fTlJFQ09WIE1NX05SRUNPVgorICBNTV9QUklOVCA9IDB4MTAwLAkvKiBEaXNwbGF5IG1lc3NhZ2UgaW4gc3RhbmRhcmQgZXJyb3IuICAqLworI2RlZmluZSBNTV9QUklOVCBNTV9QUklOVAorICBNTV9DT05TT0xFID0gMHgyMDAJLyogRGlzcGxheSBtZXNzYWdlIG9uIHN5c3RlbSBjb25zb2xlLiAgKi8KKyNkZWZpbmUgTU1fQ09OU09MRSBNTV9DT05TT0xFCit9OworCisvKiBWYWx1ZXMgdG8gYmUgZm9yIFNFVkVSSVRZIHBhcmFtZXRlciBvZiBgZm10bXNnJy4gICovCitlbnVtCit7CisgIE1NX05PU0VWID0gMCwJCS8qIE5vIHNldmVyaXR5IGxldmVsIHByb3ZpZGVkIGZvciB0aGUgbWVzc2FnZS4gICovCisjZGVmaW5lIE1NX05PU0VWIE1NX05PU0VWCisgIE1NX0hBTFQsCQkvKiBFcnJvciBjYXVzaW5nIGFwcGxpY2F0aW9uIHRvIGhhbHQuICAqLworI2RlZmluZSBNTV9IQUxUIE1NX0hBTFQKKyAgTU1fRVJST1IsCQkvKiBBcHBsaWNhdGlvbiBoYXMgZW5jb3VudGVyZWQgYSBub24tZmF0YWwgZmF1bHQuICAqLworI2RlZmluZSBNTV9FUlJPUiBNTV9FUlJPUgorICBNTV9XQVJOSU5HLAkJLyogQXBwbGljYXRpb24gaGFzIGRldGVjdGVkIHVudXN1YWwgbm9uLWVycm9yCisJCQkgICBjb25kaXRpb24uICAqLworI2RlZmluZSBNTV9XQVJOSU5HIE1NX1dBUk5JTkcKKyAgTU1fSU5GTwkJLyogSW5mb3JtYXRpdmUgbWVzc2FnZS4gICovCisjZGVmaW5lIE1NX0lORk8gTU1fSU5GTworfTsKKworCisvKiBNYWNyb3Mgd2hpY2ggY2FuIGJlIHVzZWQgYXMgbnVsbCB2YWx1ZXMgZm9yIHRoZSBhcmd1bWVudHMgb2YgYGZtdG1zZycuICAqLworI2RlZmluZSBNTV9OVUxMTEJMCSgoY2hhciAqKSAwKQorI2RlZmluZSBNTV9OVUxMU0VWCTAKKyNkZWZpbmUgTU1fTlVMTE1DCSgobG9uZyBpbnQpIDApCisjZGVmaW5lIE1NX05VTExUWFQJKChjaGFyICopIDApCisjZGVmaW5lIE1NX05VTExBQ1QJKChjaGFyICopIDApCisjZGVmaW5lIE1NX05VTExUQUcJKChjaGFyICopIDApCisKKworLyogUG9zc2libGUgcmV0dXJuIHZhbHVlcyBvZiBgZm10bXNnJy4gICovCitlbnVtCit7CisgIE1NX05PVE9LID0gLTEsCisjZGVmaW5lIE1NX05PVE9LIE1NX05PVE9LCisgIE1NX09LID0gMCwKKyNkZWZpbmUgTU1fT0sgTU1fT0sKKyAgTU1fTk9NU0cgPSAxLAorI2RlZmluZSBNTV9OT01TRyBNTV9OT01TRworICBNTV9OT0NPTiA9IDQKKyNkZWZpbmUgTU1fTk9DT04gTU1fTk9DT04KK307CisKKworLyogUHJpbnQgbWVzc2FnZSB3aXRoIGdpdmVuIENMQVNTSUZJQ0FUSU9OLCBMQUJFTCwgU0VWRVJJVFksIFRFWFQsIEFDVElPTgorICAgYW5kIFRBRyB0byBjb25zb2xlIG9yIHN0YW5kYXJkIGVycm9yLiAgKi8KK2V4dGVybiBpbnQgZm10bXNnIChsb25nIGludCBfX2NsYXNzaWZpY2F0aW9uLCBfX2NvbnN0IGNoYXIgKl9fbGFiZWwsCisJCSAgIGludCBfX3NldmVyaXR5LCBfX2NvbnN0IGNoYXIgKl9fdGV4dCwKKwkJICAgX19jb25zdCBjaGFyICpfX2FjdGlvbiwgX19jb25zdCBjaGFyICpfX3RhZyk7CisKKyNpZmRlZiBfX1VTRV9TVklECisvKiBBZGQgb3IgcmVtb3ZlIHNldmVyaXR5IGxldmVsLiAgKi8KK2V4dGVybiBpbnQgYWRkc2V2ZXJpdHkgKGludCBfX3NldmVyaXR5LCBfX2NvbnN0IGNoYXIgKl9fc3RyaW5nKSBfX1RIUk9XOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBmbXRtc2cuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9mbm1hdGNoLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2ZubWF0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWZiMDA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9mbm1hdGNoLmgKQEAgLTAsMCArMSw3MiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTkzLDk2LDk3LDk4LDk5LDIwMDEsMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfRk5NQVRDSF9ICisjZGVmaW5lCV9GTk1BVENIX0gJMQorCisjaWZkZWYJX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZm5kZWYgY29uc3QKKyMgaWYgKGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18pIHx8IGRlZmluZWQgX19jcGx1c3BsdXMKKyMgIGRlZmluZSBfX2NvbnN0CWNvbnN0CisjIGVsc2UKKyMgIGRlZmluZSBfX2NvbnN0CisjIGVuZGlmCisjZW5kaWYKKworLyogV2UgI3VuZGVmIHRoZXNlIGJlZm9yZSBkZWZpbmluZyB0aGVtIGJlY2F1c2Ugc29tZSBsb3Npbmcgc3lzdGVtcworICAgKEhQLVVYIEEuMDguMDcgZm9yIGV4YW1wbGUpIGRlZmluZSB0aGVzZSBpbiA8dW5pc3RkLmg+LiAgKi8KKyN1bmRlZglGTk1fUEFUSE5BTUUKKyN1bmRlZglGTk1fTk9FU0NBUEUKKyN1bmRlZglGTk1fUEVSSU9ECisKKy8qIEJpdHMgc2V0IGluIHRoZSBGTEFHUyBhcmd1bWVudCB0byBgZm5tYXRjaCcuICAqLworI2RlZmluZQlGTk1fUEFUSE5BTUUJKDEgPDwgMCkgLyogTm8gd2lsZGNhcmQgY2FuIGV2ZXIgbWF0Y2ggYC8nLiAgKi8KKyNkZWZpbmUJRk5NX05PRVNDQVBFCSgxIDw8IDEpIC8qIEJhY2tzbGFzaGVzIGRvbid0IHF1b3RlIHNwZWNpYWwgY2hhcnMuICAqLworI2RlZmluZQlGTk1fUEVSSU9ECSgxIDw8IDIpIC8qIExlYWRpbmcgYC4nIGlzIG1hdGNoZWQgb25seSBleHBsaWNpdGx5LiAgKi8KKworI2lmICFkZWZpbmVkIF9QT1NJWF9DX1NPVVJDRSB8fCBfUE9TSVhfQ19TT1VSQ0UgPCAyIHx8IGRlZmluZWQgX0dOVV9TT1VSQ0UKKyMgZGVmaW5lIEZOTV9GSUxFX05BTUUJIEZOTV9QQVRITkFNRQkvKiBQcmVmZXJyZWQgR05VIG5hbWUuICAqLworIyBkZWZpbmUgRk5NX0xFQURJTkdfRElSICgxIDw8IDMpCS8qIElnbm9yZSBgLy4uLicgYWZ0ZXIgYSBtYXRjaC4gICovCisjIGRlZmluZSBGTk1fQ0FTRUZPTEQJICgxIDw8IDQpCS8qIENvbXBhcmUgd2l0aG91dCByZWdhcmQgdG8gY2FzZS4gICovCisjIGRlZmluZSBGTk1fRVhUTUFUQ0gJICgxIDw8IDUpCS8qIFVzZSBrc2gtbGlrZSBleHRlbmRlZCBtYXRjaGluZy4gKi8KKyNlbmRpZgorCisvKiBWYWx1ZSByZXR1cm5lZCBieSBgZm5tYXRjaCcgaWYgU1RSSU5HIGRvZXMgbm90IG1hdGNoIFBBVFRFUk4uICAqLworI2RlZmluZQlGTk1fTk9NQVRDSAkxCisKKy8qIFRoaXMgdmFsdWUgaXMgcmV0dXJuZWQgaWYgdGhlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQKKyAgIGBmbm1hdGNoJy4gIFNpbmNlIHRoaXMgaXMgbm90IHRoZSBjYXNlIGhlcmUgaXQgd2lsbCBuZXZlciBiZQorICAgcmV0dXJuZWQgYnV0IHRoZSBjb25mb3JtYW5jZSB0ZXN0IHN1aXRlcyBzdGlsbCByZXF1aXJlIHRoZSBzeW1ib2wKKyAgIHRvIGJlIGRlZmluZWQuICAqLworI2lmZGVmIF9YT1BFTl9TT1VSQ0UKKyMgZGVmaW5lIEZOTV9OT1NZUwkoLTEpCisjZW5kaWYKKworLyogTWF0Y2ggTkFNRSBhZ2FpbnN0IHRoZSBmaWxlbmFtZSBwYXR0ZXJuIFBBVFRFUk4sCisgICByZXR1cm5pbmcgemVybyBpZiBpdCBtYXRjaGVzLCBGTk1fTk9NQVRDSCBpZiBub3QuICAqLworZXh0ZXJuIGludCBmbm1hdGNoIChfX2NvbnN0IGNoYXIgKl9fcGF0dGVybiwgX19jb25zdCBjaGFyICpfX25hbWUsCisJCSAgICBpbnQgX19mbGFncyk7CisKKyNpZmRlZglfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBmbm1hdGNoLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZm9ybS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9mb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUyODkzYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZm9ybS5oCkBAIC0wLDAgKzEsNDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDQsMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgKgorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgICoKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAqCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgKgorICogZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgICoKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAqCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAqCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAqCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAqCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgKgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgICoKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICoKKyAqIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAqCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgKgorICogYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBBdXRob3I6ICBKdWVyZ2VuIFBmZWlmZXIsIDE5OTUsMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAkSWQ6IGZvcm0uaCx2IDAuMjEgMjAwOS8xMS8wNyAxOTozMToxMSB0b20gRXhwICQgKi8KKworI2lmbmRlZiBGT1JNX0gKKyNkZWZpbmUgRk9STV9ICisKKyNpbmNsdWRlIDxjdXJzZXMuaD4KKyNpbmNsdWRlIDxldGkuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIGV4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZm5kZWYgRk9STV9QUklWX0gKK3R5cGVkZWYgdm9pZCAqRklFTERfQ0VMTDsKKyNlbmRpZgorCisjaWZuZGVmIE5DVVJTRVNfRklFTERfSU5URVJOQUxTCisjZGVmaW5lIE5DVVJTRVNfRklFTERfSU5URVJOQUxTIC8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCit0eXBlZGVmIGludCBGb3JtX09wdGlvbnM7Cit0eXBlZGVmIGludCBGaWVsZF9PcHRpb25zOworCisJLyoqKioqKioqKioKKwkqICBfUEFHRSAgKgorCSoqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc2hvcnQgcG1pbjsJCS8qIGluZGV4IG9mIGZpcnN0IGZpZWxkIG9uIHBhZ2UJCQkqLworICBzaG9ydCBwbWF4OwkJLyogaW5kZXggb2YgbGFzdCBmaWVsZCBvbiBwYWdlCQkJKi8KKyAgc2hvcnQgc21pbjsJCS8qIGluZGV4IG9mIHRvcCBsZWZ0bW9zdCBmaWVsZCBvbiBwYWdlCQkqLworICBzaG9ydCBzbWF4OwkJLyogaW5kZXggb2YgYm90dG9tIHJpZ2h0bW9zdCBmaWVsZCBvbiBwYWdlCSovCit9IF9QQUdFOworCisJLyoqKioqKioqKioKKwkqICBGSUVMRCAgKgorCSoqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IGZpZWxkbm9kZSB7CisgIHVuc2lnbmVkIHNob3J0CXN0YXR1czsJCS8qIGZsYWdzCQkJKi8KKyAgc2hvcnQJCQlyb3dzOwkJLyogc2l6ZSBpbiByb3dzCQkJKi8KKyAgc2hvcnQJCQljb2xzOwkJLyogc2l6ZSBpbiBjb2xzCQkJKi8KKyAgc2hvcnQJCQlmcm93OwkJLyogZmlyc3Qgcm93CQkJKi8KKyAgc2hvcnQJCQlmY29sOwkJLyogZmlyc3QgY29sCQkJKi8KKyAgaW50CQkJZHJvd3M7CQkvKiBkeW5hbWljIHJvd3MJCQkqLworICBpbnQJCQlkY29sczsJCS8qIGR5bmFtaWMgY29scwkJCSovCisgIGludAkJCW1heGdyb3c7CS8qIG1heGltdW0gZmllbGQgZ3Jvd3RoCQkqLworICBpbnQJCQlucm93OwkJLyogb2ZmLXNjcmVlbiByb3dzCQkqLworICBzaG9ydAkJCW5idWY7CQkvKiBhZGRpdGlvbmFsIGJ1ZmZlcnMJCSovCisgIHNob3J0CQkJanVzdDsJCS8qIGp1c3RpZmljYXRpb24JCSovCisgIHNob3J0CQkJcGFnZTsJCS8qIHBhZ2Ugb24gZm9ybQkJCSovCisgIHNob3J0CQkJaW5kZXg7CQkvKiBpbnRvIGZvcm0gLT4gZmllbGQJCSovCisgIGludAkJCXBhZDsJCS8qIHBhZCBjaGFyYWN0ZXIJCSovCisgIGNodHlwZQkJZm9yZTsJCS8qIGZvcmVncm91bmQgYXR0cmlidXRlCQkqLworICBjaHR5cGUJCWJhY2s7CQkvKiBiYWNrZ3JvdW5kIGF0dHJpYnV0ZQkJKi8KKyAgRmllbGRfT3B0aW9ucwkJb3B0czsJCS8qIG9wdGlvbnMJCQkqLworICBzdHJ1Y3QgZmllbGRub2RlICoJc25leHQ7CQkvKiBzb3J0ZWQgb3JkZXIgcG9pbnRlcgkJKi8KKyAgc3RydWN0IGZpZWxkbm9kZSAqCXNwcmV2OwkJLyogc29ydGVkIG9yZGVyIHBvaW50ZXIJCSovCisgIHN0cnVjdCBmaWVsZG5vZGUgKglsaW5rOwkJLyogbGlua2VkIGZpZWxkIGNoYWluCQkqLworICBzdHJ1Y3QgZm9ybW5vZGUgKglmb3JtOwkJLyogY29udGFpbmluZyBmb3JtCQkqLworICBzdHJ1Y3QgdHlwZW5vZGUgKgl0eXBlOwkJLyogZmllbGQgdHlwZQkJCSovCisgIHZvaWQgKgkJYXJnOwkJLyogYXJndW1lbnQgZm9yIHR5cGUJCSovCisgIEZJRUxEX0NFTEwgKgkJYnVmOwkJLyogZmllbGQgYnVmZmVycwkJKi8KKyAgdm9pZCAqCQl1c3JwdHI7CQkvKiB1c2VyIHBvaW50ZXIJCQkqLworICAvKgorICAgKiBUaGUgd2lkZS1jaGFyYWN0ZXIgY29uZmlndXJhdGlvbiByZXF1aXJlcyBleHRyYSBpbmZvcm1hdGlvbi4gIEJlY2F1c2UKKyAgICogdGhlcmUgYXJlIGV4aXN0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IG1hbmlwdWxhdGUgdGhlIG1lbWJlcnMgb2YgRklFTEQKKyAgICogZGlyZWN0bHksIHdlIGNhbm5vdCBtYWtlIHRoZSBzdHJ1Y3Qgb3BhcXVlLiAgT2Zmc2V0cyBvZiBtZW1iZXJzIHVwIHRvCisgICAqIHRoaXMgcG9pbnQgYXJlIHRoZSBzYW1lIGluIHRoZSBuYXJyb3ctIGFuZCB3aWRlLWNoYXJhY3RlciBjb25maWd1cmF0aW9uLgorICAgKiBCdXQgbm90ZSB0aGF0IHRoZSB0eXBlIG9mIGJ1ZiBkZXBlbmRzIG9uIHRoZSBjb25maWd1cmF0aW9uLCBhbmQgaXMgbWFkZQorICAgKiBvcGFxdWUgZm9yIHRoYXQgcmVhc29uLgorICAgKi8KKyAgTkNVUlNFU19GSUVMRF9JTlRFUk5BTFMKK30gRklFTEQ7CisKKworCS8qKioqKioqKioKKwkqICBGT1JNICAqCisJKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBmb3Jtbm9kZSB7CisgIHVuc2lnbmVkIHNob3J0CXN0YXR1czsJICAJLyogZmxhZ3MJCQkqLworICBzaG9ydAkJCXJvd3M7CQkvKiBzaXplIGluIHJvd3MJCQkqLworICBzaG9ydAkJCWNvbHM7CQkvKiBzaXplIGluIGNvbHMJCQkqLworICBpbnQJCQljdXJyb3c7CQkvKiBjdXJyZW50IHJvdyBpbiBmaWVsZCB3aW5kb3cJKi8KKyAgaW50CQkJY3VyY29sOwkJLyogY3VycmVudCBjb2wgaW4gZmllbGQgd2luZG93CSovCisgIGludAkJCXRvcHJvdzsJCS8qIGluIHNjcm9sbGFibGUgZmllbGQgd2luZG93CSovCisgIGludAkJCWJlZ2luY29sOwkvKiBpbiBob3Jpei4gc2Nyb2xsYWJsZSBmaWVsZAkqLworICBzaG9ydAkJCW1heGZpZWxkOwkvKiBudW1iZXIgb2YgZmllbGRzCQkqLworICBzaG9ydAkJCW1heHBhZ2U7CS8qIG51bWJlciBvZiBwYWdlcwkJKi8KKyAgc2hvcnQJCQljdXJwYWdlOwkvKiBpbmRleCBpbnRvIHBhZ2UJCSovCisgIEZvcm1fT3B0aW9ucwkJb3B0czsJCS8qIG9wdGlvbnMJCQkqLworICBXSU5ET1cgKgkJd2luOwkJLyogd2luZG93CQkJKi8KKyAgV0lORE9XICoJCXN1YjsJCS8qIHN1YndpbmRvdwkJCSovCisgIFdJTkRPVyAqCQl3OwkJLyogd2luZG93IGZvciBjdXJyZW50IGZpZWxkCSovCisgIEZJRUxEICoqCQlmaWVsZDsJCS8qIGZpZWxkIFttYXhmaWVsZF0JCSovCisgIEZJRUxEICoJCWN1cnJlbnQ7CS8qIGN1cnJlbnQgZmllbGQJCSovCisgIF9QQUdFICoJCXBhZ2U7CQkvKiBwYWdlIFttYXhwYWdlXQkJKi8KKyAgdm9pZCAqCQl1c3JwdHI7CQkvKiB1c2VyIHBvaW50ZXIJCQkqLworCisgIHZvaWQJCQkoKmZvcm1pbml0KShzdHJ1Y3QgZm9ybW5vZGUgKik7CisgIHZvaWQJCQkoKmZvcm10ZXJtKShzdHJ1Y3QgZm9ybW5vZGUgKik7CisgIHZvaWQJCQkoKmZpZWxkaW5pdCkoc3RydWN0IGZvcm1ub2RlICopOworICB2b2lkCQkJKCpmaWVsZHRlcm0pKHN0cnVjdCBmb3Jtbm9kZSAqKTsKKworfSBGT1JNOworCisKKwkvKioqKioqKioqKioqKioKKwkqICBGSUVMRFRZUEUgICoKKwkqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgdHlwZW5vZGUgeworICB1bnNpZ25lZCBzaG9ydAlzdGF0dXM7CQkJLyogZmxhZ3MJCSAgICAqLworICBsb25nCQkJcmVmOwkJCS8qIHJlZmVyZW5jZSBjb3VudAkgICAgKi8KKyAgc3RydWN0IHR5cGVub2RlICoJbGVmdDsJCQkvKiBwdHIgdG8gb3BlcmFuZCBmb3IgfCAgICAgKi8KKyAgc3RydWN0IHR5cGVub2RlICoJcmlnaHQ7CQkJLyogcHRyIHRvIG9wZXJhbmQgZm9yIHwgICAgICovCisKKyAgdm9pZCogKCptYWtlYXJnKSh2YV9saXN0ICopOwkJCS8qIG1ha2UgZmllbGR0eXBlIGFyZwkgICAgKi8KKyAgdm9pZCogKCpjb3B5YXJnKShjb25zdCB2b2lkICopOwkJLyogY29weSBmaWVsZHR5cGUgYXJnIAkgICAgKi8KKyAgdm9pZAkoKmZyZWVhcmcpKHZvaWQgKik7CQkJLyogZnJlZSBmaWVsZHR5cGUgYXJnCSAgICAqLworCisjaWYgTkNVUlNFU19JTlRFUk9QX0ZVTkNTCisgIHVuaW9uIHsKKyAgICBib29sICgqb2ZjaGVjaykoRklFTEQgKixjb25zdCB2b2lkICopOwkvKiBmaWVsZCB2YWxpZGF0aW9uCSAgICAqLworICAgIGJvb2wgKCpnZmNoZWNrKShGT1JNKixGSUVMRCAqLGNvbnN0IHZvaWQqKTsJLyogZ2VuZXJpYyBmaWVsZCB2YWxpZGF0aW9uICovCisgIH0gZmllbGRjaGVjazsKKyAgdW5pb24geworICAgIGJvb2wgKCpvY2NoZWNrKShpbnQsY29uc3Qgdm9pZCAqKTsJCS8qIGNoYXJhY3RlciB2YWxpZGF0aW9uICAgICAqLworICAgIGJvb2wgKCpnY2NoZWNrKShpbnQsRk9STSosCisJCSAgICBGSUVMRCosY29uc3Qgdm9pZCopOyAgICAgICAgLyogZ2VuZXJpYyBjaGFyIHZhbGlkYXRpb24gICovCisgIH0gY2hhcmNoZWNrOworICB1bmlvbiB7CisgICAgYm9vbCAoKm9uZXh0KShGSUVMRCAqLGNvbnN0IHZvaWQgKik7ICAgICAgICAvKiBlbnVtZXJhdGUgbmV4dCB2YWx1ZSAgICAgKi8KKyAgICBib29sICgqZ25leHQpKEZPUk0qLEZJRUxEKixjb25zdCB2b2lkKik7ICAgIC8qIGdlbmVyaWMgZW51bWVyYXRlIG5leHQgICAqLworICB9IGVudW1fbmV4dDsKKyAgdW5pb24geworICAgIGJvb2wgKCpvcHJldikoRklFTEQgKixjb25zdCB2b2lkICopOwkvKiBlbnVtZXJhdGUgcHJldiB2YWx1ZSAgICAgKi8KKyAgICBib29sICgqZ3ByZXYpKEZPUk0qLEZJRUxEKixjb25zdCB2b2lkKik7ICAgIC8qIGdlbmVyaWMgZW51bWVyYXRlIHByZXYgICAqLworICB9IGVudW1fcHJldjsKKyAgdm9pZCogKCpnZW5lcmljYXJnKSh2b2lkKik7ICAgICAgICAgICAgICAgICAgIC8qIEFsdGVybmF0ZSBBcmcgbWV0aG9kICAgICAqLworI2Vsc2UKKyAgYm9vbAkoKmZjaGVjaykoRklFTEQgKixjb25zdCB2b2lkICopOwkvKiBmaWVsZCB2YWxpZGF0aW9uCSovCisgIGJvb2wJKCpjY2hlY2spKGludCxjb25zdCB2b2lkICopOwkJLyogY2hhcmFjdGVyIHZhbGlkYXRpb24gKi8KKworICBib29sCSgqbmV4dCkoRklFTEQgKixjb25zdCB2b2lkICopOwkJLyogZW51bWVyYXRlIG5leHQgdmFsdWUgKi8KKyAgYm9vbAkoKnByZXYpKEZJRUxEICosY29uc3Qgdm9pZCAqKTsJCS8qIGVudW1lcmF0ZSBwcmV2IHZhbHVlICovCisjZW5kaWYKK30gRklFTERUWVBFOworCit0eXBlZGVmIHZvaWQgKCpGb3JtX0hvb2spKEZPUk0gKik7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKiAgbWlzY2VsbGFuZW91cyAjZGVmaW5lcyAgKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZmllbGQganVzdGlmaWNhdGlvbiAqLworI2RlZmluZSBOT19KVVNUSUZJQ0FUSU9OCSgwKQorI2RlZmluZSBKVVNUSUZZX0xFRlQJCSgxKQorI2RlZmluZSBKVVNUSUZZX0NFTlRFUgkJKDIpCisjZGVmaW5lIEpVU1RJRllfUklHSFQJCSgzKQorCisvKiBmaWVsZCBvcHRpb25zICovCisjZGVmaW5lIE9fVklTSUJMRQkJKDB4MDAwMVUpCisjZGVmaW5lIE9fQUNUSVZFCQkoMHgwMDAyVSkKKyNkZWZpbmUgT19QVUJMSUMJCSgweDAwMDRVKQorI2RlZmluZSBPX0VESVQJCQkoMHgwMDA4VSkKKyNkZWZpbmUgT19XUkFQCQkJKDB4MDAxMFUpCisjZGVmaW5lIE9fQkxBTksJCQkoMHgwMDIwVSkKKyNkZWZpbmUgT19BVVRPU0tJUAkJKDB4MDA0MFUpCisjZGVmaW5lIE9fTlVMTE9LCQkoMHgwMDgwVSkKKyNkZWZpbmUgT19QQVNTT0sJCSgweDAxMDBVKQorI2RlZmluZSBPX1NUQVRJQwkJKDB4MDIwMFUpCisKKy8qIGZvcm0gb3B0aW9ucyAqLworI2RlZmluZSBPX05MX09WRVJMT0FECQkoMHgwMDAxVSkKKyNkZWZpbmUgT19CU19PVkVSTE9BRAkJKDB4MDAwMlUpCisKKy8qIGZvcm0gZHJpdmVyIGNvbW1hbmRzICovCisjZGVmaW5lIFJFUV9ORVhUX1BBR0UJIChLRVlfTUFYICsgMSkJLyogbW92ZSB0byBuZXh0IHBhZ2UJCSovCisjZGVmaW5lIFJFUV9QUkVWX1BBR0UJIChLRVlfTUFYICsgMikJLyogbW92ZSB0byBwcmV2aW91cyBwYWdlCSovCisjZGVmaW5lIFJFUV9GSVJTVF9QQUdFCSAoS0VZX01BWCArIDMpCS8qIG1vdmUgdG8gZmlyc3QgcGFnZQkJKi8KKyNkZWZpbmUgUkVRX0xBU1RfUEFHRQkgKEtFWV9NQVggKyA0KQkvKiBtb3ZlIHRvIGxhc3QgcGFnZQkJKi8KKworI2RlZmluZSBSRVFfTkVYVF9GSUVMRAkgKEtFWV9NQVggKyA1KQkvKiBtb3ZlIHRvIG5leHQgZmllbGQJCSovCisjZGVmaW5lIFJFUV9QUkVWX0ZJRUxECSAoS0VZX01BWCArIDYpCS8qIG1vdmUgdG8gcHJldmlvdXMgZmllbGQJKi8KKyNkZWZpbmUgUkVRX0ZJUlNUX0ZJRUxECSAoS0VZX01BWCArIDcpCS8qIG1vdmUgdG8gZmlyc3QgZmllbGQJCSovCisjZGVmaW5lIFJFUV9MQVNUX0ZJRUxECSAoS0VZX01BWCArIDgpCS8qIG1vdmUgdG8gbGFzdCBmaWVsZAkJKi8KKyNkZWZpbmUgUkVRX1NORVhUX0ZJRUxECSAoS0VZX01BWCArIDkpCS8qIG1vdmUgdG8gc29ydGVkIG5leHQgZmllbGQJKi8KKyNkZWZpbmUgUkVRX1NQUkVWX0ZJRUxECSAoS0VZX01BWCArIDEwKQkvKiBtb3ZlIHRvIHNvcnRlZCBwcmV2IGZpZWxkCSovCisjZGVmaW5lIFJFUV9TRklSU1RfRklFTEQgKEtFWV9NQVggKyAxMSkJLyogbW92ZSB0byBzb3J0ZWQgZmlyc3QgZmllbGQJKi8KKyNkZWZpbmUgUkVRX1NMQVNUX0ZJRUxECSAoS0VZX01BWCArIDEyKQkvKiBtb3ZlIHRvIHNvcnRlZCBsYXN0IGZpZWxkCSovCisjZGVmaW5lIFJFUV9MRUZUX0ZJRUxECSAoS0VZX01BWCArIDEzKQkvKiBtb3ZlIHRvIGxlZnQgdG8gZmllbGQJKi8KKyNkZWZpbmUgUkVRX1JJR0hUX0ZJRUxECSAoS0VZX01BWCArIDE0KQkvKiBtb3ZlIHRvIHJpZ2h0IHRvIGZpZWxkCSovCisjZGVmaW5lIFJFUV9VUF9GSUVMRAkgKEtFWV9NQVggKyAxNSkJLyogbW92ZSB0byB1cCB0byBmaWVsZAkJKi8KKyNkZWZpbmUgUkVRX0RPV05fRklFTEQJIChLRVlfTUFYICsgMTYpCS8qIG1vdmUgdG8gZG93biB0byBmaWVsZAkqLworCisjZGVmaW5lIFJFUV9ORVhUX0NIQVIJIChLRVlfTUFYICsgMTcpCS8qIG1vdmUgdG8gbmV4dCBjaGFyIGluIGZpZWxkCSovCisjZGVmaW5lIFJFUV9QUkVWX0NIQVIJIChLRVlfTUFYICsgMTgpCS8qIG1vdmUgdG8gcHJldiBjaGFyIGluIGZpZWxkCSovCisjZGVmaW5lIFJFUV9ORVhUX0xJTkUJIChLRVlfTUFYICsgMTkpCS8qIG1vdmUgdG8gbmV4dCBsaW5lIGluIGZpZWxkCSovCisjZGVmaW5lIFJFUV9QUkVWX0xJTkUJIChLRVlfTUFYICsgMjApCS8qIG1vdmUgdG8gcHJldiBsaW5lIGluIGZpZWxkCSovCisjZGVmaW5lIFJFUV9ORVhUX1dPUkQJIChLRVlfTUFYICsgMjEpCS8qIG1vdmUgdG8gbmV4dCB3b3JkIGluIGZpZWxkCSovCisjZGVmaW5lIFJFUV9QUkVWX1dPUkQJIChLRVlfTUFYICsgMjIpCS8qIG1vdmUgdG8gcHJldiB3b3JkIGluIGZpZWxkCSovCisjZGVmaW5lIFJFUV9CRUdfRklFTEQJIChLRVlfTUFYICsgMjMpCS8qIG1vdmUgdG8gZmlyc3QgY2hhciBpbiBmaWVsZAkqLworI2RlZmluZSBSRVFfRU5EX0ZJRUxECSAoS0VZX01BWCArIDI0KQkvKiBtb3ZlIGFmdGVyIGxhc3QgY2hhciBpbiBmbGQJKi8KKyNkZWZpbmUgUkVRX0JFR19MSU5FCSAoS0VZX01BWCArIDI1KQkvKiBtb3ZlIHRvIGJlZ2lubmluZyBvZiBsaW5lCSovCisjZGVmaW5lIFJFUV9FTkRfTElORQkgKEtFWV9NQVggKyAyNikJLyogbW92ZSBhZnRlciBsYXN0IGNoYXIgaW4gbGluZQkqLworI2RlZmluZSBSRVFfTEVGVF9DSEFSCSAoS0VZX01BWCArIDI3KQkvKiBtb3ZlIGxlZnQgaW4gZmllbGQJCSovCisjZGVmaW5lIFJFUV9SSUdIVF9DSEFSCSAoS0VZX01BWCArIDI4KQkvKiBtb3ZlIHJpZ2h0IGluIGZpZWxkCQkqLworI2RlZmluZSBSRVFfVVBfQ0hBUgkgKEtFWV9NQVggKyAyOSkJLyogbW92ZSB1cCBpbiBmaWVsZAkJKi8KKyNkZWZpbmUgUkVRX0RPV05fQ0hBUgkgKEtFWV9NQVggKyAzMCkJLyogbW92ZSBkb3duIGluIGZpZWxkCQkqLworCisjZGVmaW5lIFJFUV9ORVdfTElORQkgKEtFWV9NQVggKyAzMSkJLyogaW5zZXJ0L292ZXJsYXkgbmV3IGxpbmUJKi8KKyNkZWZpbmUgUkVRX0lOU19DSEFSCSAoS0VZX01BWCArIDMyKQkvKiBpbnNlcnQgYmxhbmsgY2hhciBhdCBjdXJzb3IJKi8KKyNkZWZpbmUgUkVRX0lOU19MSU5FCSAoS0VZX01BWCArIDMzKQkvKiBpbnNlcnQgYmxhbmsgbGluZSBhdCBjdXJzb3IJKi8KKyNkZWZpbmUgUkVRX0RFTF9DSEFSCSAoS0VZX01BWCArIDM0KQkvKiBkZWxldGUgY2hhciBhdCBjdXJzb3IJKi8KKyNkZWZpbmUgUkVRX0RFTF9QUkVWCSAoS0VZX01BWCArIDM1KQkvKiBkZWxldGUgY2hhciBiZWZvcmUgY3Vyc29yCSovCisjZGVmaW5lIFJFUV9ERUxfTElORQkgKEtFWV9NQVggKyAzNikJLyogZGVsZXRlIGxpbmUgYXQgY3Vyc29yCSovCisjZGVmaW5lIFJFUV9ERUxfV09SRAkgKEtFWV9NQVggKyAzNykJLyogZGVsZXRlIHdvcmQgYXQgY3Vyc29yCSovCisjZGVmaW5lIFJFUV9DTFJfRU9MCSAoS0VZX01BWCArIDM4KQkvKiBjbGVhciB0byBlbmQgb2YgbGluZQkJKi8KKyNkZWZpbmUgUkVRX0NMUl9FT0YJIChLRVlfTUFYICsgMzkpCS8qIGNsZWFyIHRvIGVuZCBvZiBmaWVsZAkqLworI2RlZmluZSBSRVFfQ0xSX0ZJRUxECSAoS0VZX01BWCArIDQwKQkvKiBjbGVhciBlbnRpcmUgZmllbGQJCSovCisjZGVmaW5lIFJFUV9PVkxfTU9ERQkgKEtFWV9NQVggKyA0MSkJLyogYmVnaW4gb3ZlcmxheSBtb2RlCQkqLworI2RlZmluZSBSRVFfSU5TX01PREUJIChLRVlfTUFYICsgNDIpCS8qIGJlZ2luIGluc2VydCBtb2RlCQkqLworI2RlZmluZSBSRVFfU0NSX0ZMSU5FCSAoS0VZX01BWCArIDQzKQkvKiBzY3JvbGwgZmllbGQgZm9yd2FyZCBhIGxpbmUJKi8KKyNkZWZpbmUgUkVRX1NDUl9CTElORQkgKEtFWV9NQVggKyA0NCkJLyogc2Nyb2xsIGZpZWxkIGJhY2t3YXJkIGEgbGluZQkqLworI2RlZmluZSBSRVFfU0NSX0ZQQUdFCSAoS0VZX01BWCArIDQ1KQkvKiBzY3JvbGwgZmllbGQgZm9yd2FyZCBhIHBhZ2UJKi8KKyNkZWZpbmUgUkVRX1NDUl9CUEFHRQkgKEtFWV9NQVggKyA0NikJLyogc2Nyb2xsIGZpZWxkIGJhY2t3YXJkIGEgcGFnZQkqLworI2RlZmluZSBSRVFfU0NSX0ZIUEFHRQkgKEtFWV9NQVggKyA0NykgLyogc2Nyb2xsIGZpZWxkIGZvcndhcmQJIGhhbGYgcGFnZSAqLworI2RlZmluZSBSRVFfU0NSX0JIUEFHRQkgKEtFWV9NQVggKyA0OCkgLyogc2Nyb2xsIGZpZWxkIGJhY2t3YXJkIGhhbGYgcGFnZSAqLworI2RlZmluZSBSRVFfU0NSX0ZDSEFSCSAoS0VZX01BWCArIDQ5KSAvKiBob3Jpem9udGFsIHNjcm9sbCBjaGFyCSovCisjZGVmaW5lIFJFUV9TQ1JfQkNIQVIJIChLRVlfTUFYICsgNTApIC8qIGhvcml6b250YWwgc2Nyb2xsIGNoYXIJKi8KKyNkZWZpbmUgUkVRX1NDUl9IRkxJTkUJIChLRVlfTUFYICsgNTEpIC8qIGhvcml6b250YWwgc2Nyb2xsIGxpbmUJKi8KKyNkZWZpbmUgUkVRX1NDUl9IQkxJTkUJIChLRVlfTUFYICsgNTIpIC8qIGhvcml6b250YWwgc2Nyb2xsIGxpbmUJKi8KKyNkZWZpbmUgUkVRX1NDUl9IRkhBTEYJIChLRVlfTUFYICsgNTMpIC8qIGhvcml6b250YWwgc2Nyb2xsIGhhbGYgbGluZQkqLworI2RlZmluZSBSRVFfU0NSX0hCSEFMRgkgKEtFWV9NQVggKyA1NCkgLyogaG9yaXpvbnRhbCBzY3JvbGwgaGFsZiBsaW5lCSovCisKKyNkZWZpbmUgUkVRX1ZBTElEQVRJT04JIChLRVlfTUFYICsgNTUpCS8qIHZhbGlkYXRlIGZpZWxkCQkqLworI2RlZmluZSBSRVFfTkVYVF9DSE9JQ0UJIChLRVlfTUFYICsgNTYpCS8qIGRpc3BsYXkgbmV4dCBmaWVsZCBjaG9pY2UJKi8KKyNkZWZpbmUgUkVRX1BSRVZfQ0hPSUNFCSAoS0VZX01BWCArIDU3KQkvKiBkaXNwbGF5IHByZXYgZmllbGQgY2hvaWNlCSovCisKKyNkZWZpbmUgTUlOX0ZPUk1fQ09NTUFORCAoS0VZX01BWCArIDEpCS8qIHVzZWQgYnkgZm9ybV9kcml2ZXIJCSovCisjZGVmaW5lIE1BWF9GT1JNX0NPTU1BTkQgKEtFWV9NQVggKyA1NykJLyogdXNlZCBieSBmb3JtX2RyaXZlcgkJKi8KKworI2lmIGRlZmluZWQoTUFYX0NPTU1BTkQpCisjICBpZiAoTUFYX0ZPUk1fQ09NTUFORCA+IE1BWF9DT01NQU5EKQorIyAgICBlcnJvciBTb21ldGhpbmcgaXMgd3JvbmcgLS0gTUFYX0ZPUk1fQ09NTUFORCBpcyBncmVhdGVyIHRoYW4gTUFYX0NPTU1BTkQKKyMgIGVsaWYgKE1BWF9DT01NQU5EICE9IChLRVlfTUFYICsgMTI4KSkKKyMgICAgZXJyb3IgU29tZXRoaW5nIGlzIHdyb25nIC0tIE1BWF9DT01NQU5EIGlzIGFscmVhZHkgaW5jb25zaXN0ZW50bHkgZGVmaW5lZC4KKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIE1BWF9DT01NQU5EIChLRVlfTUFYICsgMTI4KQorI2VuZGlmCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKgorCSogIHN0YW5kYXJkIGZpZWxkIHR5cGVzICAqCisJKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoRklFTERUWVBFICopIFRZUEVfQUxQSEE7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKEZJRUxEVFlQRSAqKSBUWVBFX0FMTlVNOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihGSUVMRFRZUEUgKikgVFlQRV9FTlVNOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihGSUVMRFRZUEUgKikgVFlQRV9JTlRFR0VSOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihGSUVMRFRZUEUgKikgVFlQRV9OVU1FUklDOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihGSUVMRFRZUEUgKikgVFlQRV9SRUdFWFA7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKiAgYnVpbHQtaW4gYWRkaXRpb25hbCBmaWVsZCB0eXBlcyAgKgorCSogIFRoZXkgYXJlIG5vdCBkZWZpbmVkIGluIFNWcjQgICAgICoKKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKEZJRUxEVFlQRSAqKSBUWVBFX0lQVjQ7ICAgICAgLyogSW50ZXJuZXQgSVAgVmVyc2lvbiA0IGFkZHJlc3MgKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKgorCSogIEZJRUxEVFlQRSByb3V0aW5lcyAgKgorCSoqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKEZJRUxEVFlQRSAqKSBuZXdfZmllbGR0eXBlICgKKwkJICAgIGJvb2wgKCogY29uc3QgZmllbGRfY2hlY2spKEZJRUxEICosY29uc3Qgdm9pZCAqKSwKKwkJICAgIGJvb2wgKCogY29uc3QgY2hhcl9jaGVjaykoaW50LGNvbnN0IHZvaWQgKikpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKEZJRUxEVFlQRSAqKSBsaW5rX2ZpZWxkdHlwZSgKKwkJICAgIEZJRUxEVFlQRSAqLCBGSUVMRFRZUEUgKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCWZyZWVfZmllbGR0eXBlIChGSUVMRFRZUEUgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfZmllbGR0eXBlX2FyZyAoRklFTERUWVBFICosCisJCSAgICB2b2lkICogKCogY29uc3QgbWFrZV9hcmcpKHZhX2xpc3QgKiksCisJCSAgICB2b2lkICogKCogY29uc3QgY29weV9hcmcpKGNvbnN0IHZvaWQgKiksCisJCSAgICB2b2lkICgqIGNvbnN0IGZyZWVfYXJnKSh2b2lkICopKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCSBzZXRfZmllbGR0eXBlX2Nob2ljZSAoRklFTERUWVBFICosCisJCSAgICBib29sICgqIGNvbnN0IG5leHRfY2hvaWNlKShGSUVMRCAqLGNvbnN0IHZvaWQgKiksCisJICAgICAgCSAgICBib29sICgqIGNvbnN0IHByZXZfY2hvaWNlKShGSUVMRCAqLGNvbnN0IHZvaWQgKikpOworCisJLyoqKioqKioqKioqKioqKioqKioKKwkqICBGSUVMRCByb3V0aW5lcyAgKgorCSoqKioqKioqKioqKioqKioqKiovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoRklFTEQgKikJbmV3X2ZpZWxkIChpbnQsaW50LGludCxpbnQsaW50LGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoRklFTEQgKikJZHVwX2ZpZWxkIChGSUVMRCAqLGludCxpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKEZJRUxEICopCWxpbmtfZmllbGQgKEZJRUxEICosaW50LGludCk7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCWZyZWVfZmllbGQgKEZJRUxEICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJZmllbGRfaW5mbyAoY29uc3QgRklFTEQgKixpbnQgKixpbnQgKixpbnQgKixpbnQgKixpbnQgKixpbnQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlkeW5hbWljX2ZpZWxkX2luZm8gKGNvbnN0IEZJRUxEICosaW50ICosaW50ICosaW50ICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X21heF9maWVsZCAoIEZJRUxEICosaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCW1vdmVfZmllbGQgKEZJRUxEICosaW50LGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfZmllbGRfdHlwZSAoRklFTEQgKixGSUVMRFRZUEUgKiwuLi4pOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X25ld19wYWdlIChGSUVMRCAqLGJvb2wpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2ZpZWxkX2p1c3QgKEZJRUxEICosaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCWZpZWxkX2p1c3QgKGNvbnN0IEZJRUxEICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2ZpZWxkX2ZvcmUgKEZJRUxEICosY2h0eXBlKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9maWVsZF9iYWNrIChGSUVMRCAqLGNodHlwZSk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfZmllbGRfcGFkIChGSUVMRCAqLGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlmaWVsZF9wYWQgKGNvbnN0IEZJRUxEICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2ZpZWxkX2J1ZmZlciAoRklFTEQgKixpbnQsY29uc3QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9maWVsZF9zdGF0dXMgKEZJRUxEICosYm9vbCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfZmllbGRfdXNlcnB0ciAoRklFTEQgKiwgdm9pZCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9maWVsZF9vcHRzIChGSUVMRCAqLEZpZWxkX09wdGlvbnMpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJZmllbGRfb3B0c19vbiAoRklFTEQgKixGaWVsZF9PcHRpb25zKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCWZpZWxkX29wdHNfb2ZmIChGSUVMRCAqLEZpZWxkX09wdGlvbnMpOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2h0eXBlKQlmaWVsZF9mb3JlIChjb25zdCBGSUVMRCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaHR5cGUpCWZpZWxkX2JhY2sgKGNvbnN0IEZJRUxEICopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkJbmV3X3BhZ2UgKGNvbnN0IEZJRUxEICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpCWZpZWxkX3N0YXR1cyAoY29uc3QgRklFTEQgKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkICopCWZpZWxkX2FyZyAoY29uc3QgRklFTEQgKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkICopCWZpZWxkX3VzZXJwdHIgKGNvbnN0IEZJRUxEICopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoRklFTERUWVBFICopCWZpZWxkX3R5cGUgKGNvbnN0IEZJRUxEICopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKQlmaWVsZF9idWZmZXIgKGNvbnN0IEZJRUxEICosaW50KTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKEZpZWxkX09wdGlvbnMpCWZpZWxkX29wdHMgKGNvbnN0IEZJRUxEICopOworCisJLyoqKioqKioqKioqKioqKioqKgorCSogIEZPUk0gcm91dGluZXMgICoKKwkqKioqKioqKioqKioqKioqKiovCisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChGT1JNICopCW5ld19mb3JtIChGSUVMRCAqKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChGSUVMRCAqKikJZm9ybV9maWVsZHMgKGNvbnN0IEZPUk0gKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoRklFTEQgKikJY3VycmVudF9maWVsZCAoY29uc3QgRk9STSAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyAqKQlmb3JtX3dpbiAoY29uc3QgRk9STSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChXSU5ET1cgKikJZm9ybV9zdWIgKGNvbnN0IEZPUk0gKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChGb3JtX0hvb2spCWZvcm1faW5pdCAoY29uc3QgRk9STSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChGb3JtX0hvb2spCWZvcm1fdGVybSAoY29uc3QgRk9STSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChGb3JtX0hvb2spCWZpZWxkX2luaXQgKGNvbnN0IEZPUk0gKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoRm9ybV9Ib29rKQlmaWVsZF90ZXJtIChjb25zdCBGT1JNICopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlmcmVlX2Zvcm0gKEZPUk0gKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfZm9ybV9maWVsZHMgKEZPUk0gKixGSUVMRCAqKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlmaWVsZF9jb3VudCAoY29uc3QgRk9STSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9mb3JtX3dpbiAoRk9STSAqLFdJTkRPVyAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9mb3JtX3N1YiAoRk9STSAqLFdJTkRPVyAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9jdXJyZW50X2ZpZWxkIChGT1JNICosRklFTEQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlmaWVsZF9pbmRleCAoY29uc3QgRklFTEQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfZm9ybV9wYWdlIChGT1JNICosaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCWZvcm1fcGFnZSAoY29uc3QgRk9STSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNjYWxlX2Zvcm0gKGNvbnN0IEZPUk0gKixpbnQgKixpbnQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfZm9ybV9pbml0IChGT1JNICosRm9ybV9Ib29rKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9mb3JtX3Rlcm0gKEZPUk0gKixGb3JtX0hvb2spOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2ZpZWxkX2luaXQgKEZPUk0gKixGb3JtX0hvb2spOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2ZpZWxkX3Rlcm0gKEZPUk0gKixGb3JtX0hvb2spOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJcG9zdF9mb3JtIChGT1JNICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJdW5wb3N0X2Zvcm0gKEZPUk0gKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlwb3NfZm9ybV9jdXJzb3IgKEZPUk0gKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlmb3JtX2RyaXZlciAoRk9STSAqLGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfZm9ybV91c2VycHRyIChGT1JNICosdm9pZCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9mb3JtX29wdHMgKEZPUk0gKixGb3JtX09wdGlvbnMpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJZm9ybV9vcHRzX29uIChGT1JNICosRm9ybV9PcHRpb25zKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCWZvcm1fb3B0c19vZmYgKEZPUk0gKixGb3JtX09wdGlvbnMpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJZm9ybV9yZXF1ZXN0X2J5X25hbWUgKGNvbnN0IGNoYXIgKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjb25zdCBjaGFyICopCWZvcm1fcmVxdWVzdF9uYW1lIChpbnQpOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCAqKQlmb3JtX3VzZXJwdHIgKGNvbnN0IEZPUk0gKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChGb3JtX09wdGlvbnMpCWZvcm1fb3B0cyAoY29uc3QgRk9STSAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpCWRhdGFfYWhlYWQgKGNvbnN0IEZPUk0gKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkJZGF0YV9iZWhpbmQgKGNvbnN0IEZPUk0gKik7CisKKyNpZiBOQ1VSU0VTX1NQX0ZVTkNTCitleHRlcm4gTkNVUlNFU19FWFBPUlQoRk9STSAqKQlOQ1VSU0VTX1NQX05BTUUobmV3X2Zvcm0pIChTQ1JFRU4qLCBGSUVMRCAqKik7CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIH0KKyNlbmRpZgorCisjZW5kaWYJLyogRk9STV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2ZzdGFiLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2ZzdGFiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlY2FkNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZnN0YWIuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgwLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWZzdGFiLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKi8KKworI2lmbmRlZiBfRlNUQUJfSAorI2RlZmluZSBfRlNUQUJfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKgorICogRmlsZSBzeXN0ZW0gdGFibGUsIHNlZSBmc3RhYig1KS4KKyAqCisgKiBVc2VkIGJ5IGR1bXAsIG1vdW50LCB1bW91bnQsIHN3YXBvbiwgZnNjaywgZGYsIC4uLgorICoKKyAqIEZvciB1ZnMgZnNfc3BlYyBmaWVsZCBpcyB0aGUgYmxvY2sgc3BlY2lhbCBuYW1lLiAgUHJvZ3JhbXMgdGhhdCB3YW50IHRvCisgKiB1c2UgdGhlIGNoYXJhY3RlciBzcGVjaWFsIG5hbWUgbXVzdCBjcmVhdGUgdGhhdCBuYW1lIGJ5IHByZXBlbmRpbmcgYSAncicKKyAqIGFmdGVyIHRoZSByaWdodCBtb3N0IHNsYXNoLiAgUXVvdGEgZmlsZXMgYXJlIGFsd2F5cyBuYW1lZCAicXVvdGFzIiwgc28KKyAqIGlmIHR5cGUgaXMgInJxIiwgdGhlbiB1c2UgY29uY2F0ZW5hdGlvbiBvZiBmc19maWxlIGFuZCAicXVvdGFzIiB0byBsb2NhdGUKKyAqIHF1b3RhIGZpbGUuCisgKi8KKyNkZWZpbmUJX1BBVEhfRlNUQUIJIi9ldGMvZnN0YWIiCisjZGVmaW5lCUZTVEFCCQkiL2V0Yy9mc3RhYiIJLyogZGVwcmVjYXRlZCAqLworCisjZGVmaW5lCUZTVEFCX1JXCSJydyIJCS8qIHJlYWQvd3JpdGUgZGV2aWNlICovCisjZGVmaW5lCUZTVEFCX1JRCSJycSIJCS8qIHJlYWQvd3JpdGUgd2l0aCBxdW90YXMgKi8KKyNkZWZpbmUJRlNUQUJfUk8JInJvIgkJLyogcmVhZC1vbmx5IGRldmljZSAqLworI2RlZmluZQlGU1RBQl9TVwkic3ciCQkvKiBzd2FwIGRldmljZSAqLworI2RlZmluZQlGU1RBQl9YWAkieHgiCQkvKiBpZ25vcmUgdG90YWxseSAqLworCitzdHJ1Y3QgZnN0YWIKKyAgeworICAgIGNoYXIgKmZzX3NwZWM7CQkJLyogYmxvY2sgc3BlY2lhbCBkZXZpY2UgbmFtZSAqLworICAgIGNoYXIgKmZzX2ZpbGU7CQkJLyogZmlsZSBzeXN0ZW0gcGF0aCBwcmVmaXggKi8KKyAgICBjaGFyICpmc192ZnN0eXBlOwkJCS8qIEZpbGUgc3lzdGVtIHR5cGUsIHVmcywgbmZzICovCisgICAgY2hhciAqZnNfbW50b3BzOwkJCS8qIE1vdW50IG9wdGlvbnMgYWxhIC1vICovCisgICAgY29uc3QgY2hhciAqZnNfdHlwZTsJCS8qIEZTVEFCXyogZnJvbSBmc19tbnRvcHMgKi8KKyAgICBpbnQJZnNfZnJlcTsJCQkvKiBkdW1wIGZyZXF1ZW5jeSwgaW4gZGF5cyAqLworICAgIGludAlmc19wYXNzbm87CQkJLyogcGFzcyBudW1iZXIgb24gcGFyYWxsZWwgZHVtcCAqLworICB9OworCisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIHN0cnVjdCBmc3RhYiAqZ2V0ZnNlbnQgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gc3RydWN0IGZzdGFiICpnZXRmc3NwZWMgKF9fY29uc3QgY2hhciAqX19uYW1lKSBfX1RIUk9XOworZXh0ZXJuIHN0cnVjdCBmc3RhYiAqZ2V0ZnNmaWxlIChfX2NvbnN0IGNoYXIgKl9fbmFtZSkgX19USFJPVzsKK2V4dGVybiBpbnQgc2V0ZnNlbnQgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gdm9pZCBlbmRmc2VudCAodm9pZCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGZzdGFiLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZnRzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Z0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMDcwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Z0cy5oCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWZ0cy5oCTguMyAoQmVya2VsZXkpIDgvMTQvOTQKKyAqLworCisjaWZuZGVmCV9GVFNfSAorI2RlZmluZQlfRlRTX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogVGhlIGZ0cyBpbnRlcmZhY2UgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIExGUyBpbnRlcmZhY2Ugd2hpY2gKKyAgIHRyYW5zcGFyZW50bHkgdXNlcyB0aGUgNjQtYml0IGZpbGUgYWNjZXNzIGZ1bmN0aW9ucy4gICovCisjaWZkZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorIyBlcnJvciAiPGZ0cy5oPiBjYW5ub3QgYmUgdXNlZCB3aXRoIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9PTY0IgorI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCBfZnRzZW50ICpmdHNfY3VyOwkvKiBjdXJyZW50IG5vZGUgKi8KKwlzdHJ1Y3QgX2Z0c2VudCAqZnRzX2NoaWxkOwkvKiBsaW5rZWQgbGlzdCBvZiBjaGlsZHJlbiAqLworCXN0cnVjdCBfZnRzZW50ICoqZnRzX2FycmF5OwkvKiBzb3J0IGFycmF5ICovCisJZGV2X3QgZnRzX2RldjsJCQkvKiBzdGFydGluZyBkZXZpY2UgIyAqLworCWNoYXIgKmZ0c19wYXRoOwkJCS8qIHBhdGggZm9yIHRoaXMgZGVzY2VudCAqLworCWludCBmdHNfcmZkOwkJCS8qIGZkIGZvciByb290ICovCisJaW50IGZ0c19wYXRobGVuOwkJLyogc2l6ZW9mKHBhdGgpICovCisJaW50IGZ0c19uaXRlbXM7CQkJLyogZWxlbWVudHMgaW4gdGhlIHNvcnQgYXJyYXkgKi8KKwlpbnQgKCpmdHNfY29tcGFyKSAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopOyAvKiBjb21wYXJlIGZuICovCisKKyNkZWZpbmUJRlRTX0NPTUZPTExPVwkweDAwMDEJCS8qIGZvbGxvdyBjb21tYW5kIGxpbmUgc3ltbGlua3MgKi8KKyNkZWZpbmUJRlRTX0xPR0lDQUwJMHgwMDAyCQkvKiBsb2dpY2FsIHdhbGsgKi8KKyNkZWZpbmUJRlRTX05PQ0hESVIJMHgwMDA0CQkvKiBkb24ndCBjaGFuZ2UgZGlyZWN0b3JpZXMgKi8KKyNkZWZpbmUJRlRTX05PU1RBVAkweDAwMDgJCS8qIGRvbid0IGdldCBzdGF0IGluZm8gKi8KKyNkZWZpbmUJRlRTX1BIWVNJQ0FMCTB4MDAxMAkJLyogcGh5c2ljYWwgd2FsayAqLworI2RlZmluZQlGVFNfU0VFRE9UCTB4MDAyMAkJLyogcmV0dXJuIGRvdCBhbmQgZG90LWRvdCAqLworI2RlZmluZQlGVFNfWERFVgkweDAwNDAJCS8qIGRvbid0IGNyb3NzIGRldmljZXMgKi8KKyNkZWZpbmUgRlRTX1dISVRFT1VUCTB4MDA4MAkJLyogcmV0dXJuIHdoaXRlb3V0IGluZm9ybWF0aW9uICovCisjZGVmaW5lCUZUU19PUFRJT05NQVNLCTB4MDBmZgkJLyogdmFsaWQgdXNlciBvcHRpb24gbWFzayAqLworCisjZGVmaW5lCUZUU19OQU1FT05MWQkweDAxMDAJCS8qIChwcml2YXRlKSBjaGlsZCBuYW1lcyBvbmx5ICovCisjZGVmaW5lCUZUU19TVE9QCTB4MDIwMAkJLyogKHByaXZhdGUpIHVucmVjb3ZlcmFibGUgZXJyb3IgKi8KKwlpbnQgZnRzX29wdGlvbnM7CQkvKiBmdHNfb3BlbiBvcHRpb25zLCBnbG9iYWwgZmxhZ3MgKi8KK30gRlRTOworCit0eXBlZGVmIHN0cnVjdCBfZnRzZW50IHsKKwlzdHJ1Y3QgX2Z0c2VudCAqZnRzX2N5Y2xlOwkvKiBjeWNsZSBub2RlICovCisJc3RydWN0IF9mdHNlbnQgKmZ0c19wYXJlbnQ7CS8qIHBhcmVudCBkaXJlY3RvcnkgKi8KKwlzdHJ1Y3QgX2Z0c2VudCAqZnRzX2xpbms7CS8qIG5leHQgZmlsZSBpbiBkaXJlY3RvcnkgKi8KKwlsb25nIGZ0c19udW1iZXI7CSAgICAgICAgLyogbG9jYWwgbnVtZXJpYyB2YWx1ZSAqLworCXZvaWQgKmZ0c19wb2ludGVyOwkgICAgICAgIC8qIGxvY2FsIGFkZHJlc3MgdmFsdWUgKi8KKwljaGFyICpmdHNfYWNjcGF0aDsJCS8qIGFjY2VzcyBwYXRoICovCisJY2hhciAqZnRzX3BhdGg7CQkJLyogcm9vdCBwYXRoICovCisJaW50IGZ0c19lcnJubzsJCQkvKiBlcnJubyBmb3IgdGhpcyBub2RlICovCisJaW50IGZ0c19zeW1mZDsJCQkvKiBmZCBmb3Igc3ltbGluayAqLworCXVfc2hvcnQgZnRzX3BhdGhsZW47CQkvKiBzdHJsZW4oZnRzX3BhdGgpICovCisJdV9zaG9ydCBmdHNfbmFtZWxlbjsJCS8qIHN0cmxlbihmdHNfbmFtZSkgKi8KKworCWlub190IGZ0c19pbm87CQkJLyogaW5vZGUgKi8KKwlkZXZfdCBmdHNfZGV2OwkJCS8qIGRldmljZSAqLworCW5saW5rX3QgZnRzX25saW5rOwkJLyogbGluayBjb3VudCAqLworCisjZGVmaW5lCUZUU19ST09UUEFSRU5UTEVWRUwJLTEKKyNkZWZpbmUJRlRTX1JPT1RMRVZFTAkJIDAKKwlzaG9ydCBmdHNfbGV2ZWw7CQkvKiBkZXB0aCAoLTEgdG8gTikgKi8KKworI2RlZmluZQlGVFNfRAkJIDEJCS8qIHByZW9yZGVyIGRpcmVjdG9yeSAqLworI2RlZmluZQlGVFNfREMJCSAyCQkvKiBkaXJlY3RvcnkgdGhhdCBjYXVzZXMgY3ljbGVzICovCisjZGVmaW5lCUZUU19ERUZBVUxUCSAzCQkvKiBub25lIG9mIHRoZSBhYm92ZSAqLworI2RlZmluZQlGVFNfRE5SCQkgNAkJLyogdW5yZWFkYWJsZSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUJRlRTX0RPVAkJIDUJCS8qIGRvdCBvciBkb3QtZG90ICovCisjZGVmaW5lCUZUU19EUAkJIDYJCS8qIHBvc3RvcmRlciBkaXJlY3RvcnkgKi8KKyNkZWZpbmUJRlRTX0VSUgkJIDcJCS8qIGVycm9yOyBlcnJubyBpcyBzZXQgKi8KKyNkZWZpbmUJRlRTX0YJCSA4CQkvKiByZWd1bGFyIGZpbGUgKi8KKyNkZWZpbmUJRlRTX0lOSVQJIDkJCS8qIGluaXRpYWxpemVkIG9ubHkgKi8KKyNkZWZpbmUJRlRTX05TCQkxMAkJLyogc3RhdCgyKSBmYWlsZWQgKi8KKyNkZWZpbmUJRlRTX05TT0sJMTEJCS8qIG5vIHN0YXQoMikgcmVxdWVzdGVkICovCisjZGVmaW5lCUZUU19TTAkJMTIJCS8qIHN5bWJvbGljIGxpbmsgKi8KKyNkZWZpbmUJRlRTX1NMTk9ORQkxMwkJLyogc3ltYm9saWMgbGluayB3aXRob3V0IHRhcmdldCAqLworI2RlZmluZSBGVFNfVwkJMTQJCS8qIHdoaXRlb3V0IG9iamVjdCAqLworCXVfc2hvcnQgZnRzX2luZm87CQkvKiB1c2VyIGZsYWdzIGZvciBGVFNFTlQgc3RydWN0dXJlICovCisKKyNkZWZpbmUJRlRTX0RPTlRDSERJUgkgMHgwMQkJLyogZG9uJ3QgY2hkaXIgLi4gdG8gdGhlIHBhcmVudCAqLworI2RlZmluZQlGVFNfU1lNRk9MTE9XCSAweDAyCQkvKiBmb2xsb3dlZCBhIHN5bWxpbmsgdG8gZ2V0IGhlcmUgKi8KKwl1X3Nob3J0IGZ0c19mbGFnczsJCS8qIHByaXZhdGUgZmxhZ3MgZm9yIEZUU0VOVCBzdHJ1Y3R1cmUgKi8KKworI2RlZmluZQlGVFNfQUdBSU4JIDEJCS8qIHJlYWQgbm9kZSBhZ2FpbiAqLworI2RlZmluZQlGVFNfRk9MTE9XCSAyCQkvKiBmb2xsb3cgc3ltYm9saWMgbGluayAqLworI2RlZmluZQlGVFNfTk9JTlNUUgkgMwkJLyogbm8gaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lCUZUU19TS0lQCSA0CQkvKiBkaXNjYXJkIG5vZGUgKi8KKwl1X3Nob3J0IGZ0c19pbnN0cjsJCS8qIGZ0c19zZXQoKSBpbnN0cnVjdGlvbnMgKi8KKworCXN0cnVjdCBzdGF0ICpmdHNfc3RhdHA7CQkvKiBzdGF0KDIpIGluZm9ybWF0aW9uICovCisJY2hhciBmdHNfbmFtZVsxXTsJCS8qIGZpbGUgbmFtZSAqLworfSBGVFNFTlQ7CisKK19fQkVHSU5fREVDTFMKK0ZUU0VOVAkqZnRzX2NoaWxkcmVuIChGVFMgKiwgaW50KTsKK2ludAkgZnRzX2Nsb3NlIChGVFMgKik7CitGVFMJKmZ0c19vcGVuIChjaGFyICogY29uc3QgKiwgaW50LAorCQkgICBpbnQgKCopKGNvbnN0IEZUU0VOVCAqKiwgY29uc3QgRlRTRU5UICoqKSk7CitGVFNFTlQJKmZ0c19yZWFkIChGVFMgKik7CitpbnQJIGZ0c19zZXQgKEZUUyAqLCBGVFNFTlQgKiwgaW50KSBfX1RIUk9XOworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGZ0cy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Z0dy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9mdHcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmRmZjg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9mdHcuaApAQCAtMCwwICsxLDE3OCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkyLDE5OTYtMTk5OSwyMDAzLDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglYL09wZW4gUG9ydGFiaWxpdHkgR3VpZGUgNC4yOiBmdHcuaAorICovCisKKyNpZm5kZWYgX0ZUV19ICisjZGVmaW5lCV9GVFdfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFZhbHVlcyBmb3IgdGhlIEZMQUcgYXJndW1lbnQgdG8gdGhlIHVzZXIgZnVuY3Rpb24gcGFzc2VkIHRvIGBmdHcnCisgICBhbmQgJ25mdHcnLiAgKi8KK2VudW0KK3sKKyAgRlRXX0YsCQkvKiBSZWd1bGFyIGZpbGUuICAqLworI2RlZmluZSBGVFdfRgkgRlRXX0YKKyAgRlRXX0QsCQkvKiBEaXJlY3RvcnkuICAqLworI2RlZmluZSBGVFdfRAkgRlRXX0QKKyAgRlRXX0ROUiwJCS8qIFVucmVhZGFibGUgZGlyZWN0b3J5LiAgKi8KKyNkZWZpbmUgRlRXX0ROUgkgRlRXX0ROUgorICBGVFdfTlMsCQkvKiBVbnN0YXRhYmxlIGZpbGUuICAqLworI2RlZmluZSBGVFdfTlMJIEZUV19OUworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorCisgIEZUV19TTCwJCS8qIFN5bWJvbGljIGxpbmsuICAqLworIyBkZWZpbmUgRlRXX1NMCSBGVFdfU0wKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIFRoZXNlIGZsYWdzIGFyZSBvbmx5IHBhc3NlZCBmcm9tIHRoZSBgbmZ0dycgZnVuY3Rpb24uICAqLworICBGVFdfRFAsCQkvKiBEaXJlY3RvcnksIGFsbCBzdWJkaXJzIGhhdmUgYmVlbiB2aXNpdGVkLiAqLworIyBkZWZpbmUgRlRXX0RQCSBGVFdfRFAKKyAgRlRXX1NMTgkJLyogU3ltYm9saWMgbGluayBuYW1pbmcgbm9uLWV4aXN0aW5nIGZpbGUuICAqLworIyBkZWZpbmUgRlRXX1NMTiBGVFdfU0xOCisKKyNlbmRpZgkvKiBleHRlbmRlZCBYL09wZW4gKi8KK307CisKKworI2lmZGVmIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBGbGFncyBmb3IgZm91cnRoIGFyZ3VtZW50IG9mIGBuZnR3Jy4gICovCitlbnVtCit7CisgIEZUV19QSFlTID0gMSwJCS8qIFBlcmZvcm0gcGh5c2ljYWwgd2FsaywgaWdub3JlIHN5bWxpbmtzLiAgKi8KKyMgZGVmaW5lIEZUV19QSFlTCUZUV19QSFlTCisgIEZUV19NT1VOVCA9IDIsCS8qIFJlcG9ydCBvbmx5IGZpbGVzIG9uIHNhbWUgZmlsZSBzeXN0ZW0gYXMgdGhlCisJCQkgICBhcmd1bWVudC4gICovCisjIGRlZmluZSBGVFdfTU9VTlQJRlRXX01PVU5UCisgIEZUV19DSERJUiA9IDQsCS8qIENoYW5nZSB0byBjdXJyZW50IGRpcmVjdG9yeSB3aGlsZSBwcm9jZXNzaW5nIGl0LiAgKi8KKyMgZGVmaW5lIEZUV19DSERJUglGVFdfQ0hESVIKKyAgRlRXX0RFUFRIID0gOAkJLyogUmVwb3J0IGZpbGVzIGluIGRpcmVjdG9yeSBiZWZvcmUgZGlyZWN0b3J5IGl0c2VsZi4qLworIyBkZWZpbmUgRlRXX0RFUFRICUZUV19ERVBUSAorIyBpZmRlZiBfX1VTRV9HTlUKKyAgLAorICBGVFdfQUNUSU9OUkVUVkFMID0gMTYJLyogQXNzdW1lIGNhbGxiYWNrIHRvIHJldHVybiBGVFdfKiB2YWx1ZXMgaW5zdGVhZCBvZgorCQkJICAgemVybyB0byBjb250aW51ZSBhbmQgbm9uLXplcm8gdG8gdGVybWluYXRlLiAgKi8KKyMgIGRlZmluZSBGVFdfQUNUSU9OUkVUVkFMIEZUV19BQ1RJT05SRVRWQUwKKyMgZW5kaWYKK307CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFJldHVybiB2YWx1ZXMgZnJvbSBjYWxsYmFjayBmdW5jdGlvbnMuICAqLworZW51bQoreworICBGVFdfQ09OVElOVUUgPSAwLAkvKiBDb250aW51ZSB3aXRoIG5leHQgc2libGluZyBvciBmb3IgRlRXX0Qgd2l0aCB0aGUKKwkJCSAgIGZpcnN0IGNoaWxkLiAgKi8KKyMgZGVmaW5lIEZUV19DT05USU5VRQlGVFdfQ09OVElOVUUKKyAgRlRXX1NUT1AgPSAxLAkJLyogUmV0dXJuIGZyb20gYGZ0dycgb3IgYG5mdHcnIHdpdGggRlRXX1NUT1AgYXMgcmV0dXJuCisJCQkgICB2YWx1ZS4gICovCisjIGRlZmluZSBGVFdfU1RPUAlGVFdfU1RPUAorICBGVFdfU0tJUF9TVUJUUkVFID0gMiwJLyogT25seSBtZWFuaW5nZnVsIGZvciBGVFdfRDogRG9uJ3Qgd2FsayB0aHJvdWdoIHRoZQorCQkJICAgc3VidHJlZSwgaW5zdGVhZCBqdXN0IGNvbnRpbnVlIHdpdGggaXRzIG5leHQKKwkJCSAgIHNpYmxpbmcuICovCisjIGRlZmluZSBGVFdfU0tJUF9TVUJUUkVFIEZUV19TS0lQX1NVQlRSRUUKKyAgRlRXX1NLSVBfU0lCTElOR1MgPSAzLC8qIENvbnRpbnVlIHdpdGggRlRXX0RQIGNhbGxiYWNrIGZvciBjdXJyZW50IGRpcmVjdG9yeQorCQkJICAgIChpZiBGVFdfREVQVEgpIGFuZCB0aGVuIGl0cyBzaWJsaW5ncy4gICovCisjIGRlZmluZSBGVFdfU0tJUF9TSUJMSU5HUyBGVFdfU0tJUF9TSUJMSU5HUworfTsKKyNlbmRpZgorCisvKiBTdHJ1Y3R1cmUgdXNlZCBmb3IgZm91cnRoIGFyZ3VtZW50IHRvIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBgbmZ0dycuICAqLworc3RydWN0IEZUVworICB7CisgICAgaW50IGJhc2U7CisgICAgaW50IGxldmVsOworICB9OworI2VuZGlmCS8qIGV4dGVuZGVkIFgvT3BlbiAqLworCisKKy8qIENvbnZlbmllbnQgdHlwZXMgZm9yIGNhbGxiYWNrIGZ1bmN0aW9ucy4gICovCit0eXBlZGVmIGludCAoKl9fZnR3X2Z1bmNfdCkgKF9fY29uc3QgY2hhciAqX19maWxlbmFtZSwKKwkJCSAgICAgX19jb25zdCBzdHJ1Y3Qgc3RhdCAqX19zdGF0dXMsIGludCBfX2ZsYWcpOworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0Cit0eXBlZGVmIGludCAoKl9fZnR3NjRfZnVuY190KSAoX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkJICAgICAgIF9fY29uc3Qgc3RydWN0IHN0YXQ2NCAqX19zdGF0dXMsIGludCBfX2ZsYWcpOworI2VuZGlmCisjaWZkZWYgX19VU0VfWE9QRU5fRVhURU5ERUQKK3R5cGVkZWYgaW50ICgqX19uZnR3X2Z1bmNfdCkgKF9fY29uc3QgY2hhciAqX19maWxlbmFtZSwKKwkJCSAgICAgIF9fY29uc3Qgc3RydWN0IHN0YXQgKl9fc3RhdHVzLCBpbnQgX19mbGFnLAorCQkJICAgICAgc3RydWN0IEZUVyAqX19pbmZvKTsKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK3R5cGVkZWYgaW50ICgqX19uZnR3NjRfZnVuY190KSAoX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkJCV9fY29uc3Qgc3RydWN0IHN0YXQ2NCAqX19zdGF0dXMsCisJCQkJaW50IF9fZmxhZywgc3RydWN0IEZUVyAqX19pbmZvKTsKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBDYWxsIGEgZnVuY3Rpb24gb24gZXZlcnkgZWxlbWVudCBpbiBhIGRpcmVjdG9yeSB0cmVlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBmdHcgKF9fY29uc3QgY2hhciAqX19kaXIsIF9fZnR3X2Z1bmNfdCBfX2Z1bmMsIGludCBfX2Rlc2NyaXB0b3JzKQorICAgICBfX25vbm51bGwgKCgxLCAyKSk7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKGZ0dywgKF9fY29uc3QgY2hhciAqX19kaXIsIF9fZnR3X2Z1bmNfdCBfX2Z1bmMsCisJCQkgICAgIGludCBfX2Rlc2NyaXB0b3JzKSwgZnR3NjQpIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgZWxzZQorIyAgZGVmaW5lIGZ0dyBmdHc2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgZnR3NjQgKF9fY29uc3QgY2hhciAqX19kaXIsIF9fZnR3NjRfZnVuY190IF9fZnVuYywKKwkJICBpbnQgX19kZXNjcmlwdG9ycykgX19ub25udWxsICgoMSwgMikpOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogQ2FsbCBhIGZ1bmN0aW9uIG9uIGV2ZXJ5IGVsZW1lbnQgaW4gYSBkaXJlY3RvcnkgdHJlZS4gIEZMQUcgYWxsb3dzCisgICB0byBzcGVjaWZ5IHRoZSBiZWhhdmlvdXIgbW9yZSBkZXRhaWxlZC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IG5mdHcgKF9fY29uc3QgY2hhciAqX19kaXIsIF9fbmZ0d19mdW5jX3QgX19mdW5jLCBpbnQgX19kZXNjcmlwdG9ycywKKwkJIGludCBfX2ZsYWcpIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgZWxzZQorIyAgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIGludCBfX1JFRElSRUNUIChuZnR3LCAoX19jb25zdCBjaGFyICpfX2RpciwgX19uZnR3X2Z1bmNfdCBfX2Z1bmMsCisJCQkgICAgICBpbnQgX19kZXNjcmlwdG9ycywgaW50IF9fZmxhZyksIG5mdHc2NCkKKyAgICAgX19ub25udWxsICgoMSwgMikpOworIyAgZWxzZQorIyAgIGRlZmluZSBuZnR3IG5mdHc2NAorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgbmZ0dzY0IChfX2NvbnN0IGNoYXIgKl9fZGlyLCBfX25mdHc2NF9mdW5jX3QgX19mdW5jLAorCQkgICBpbnQgX19kZXNjcmlwdG9ycywgaW50IF9fZmxhZykgX19ub25udWxsICgoMSwgMikpOworIyBlbmRpZgorI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBmdHcuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9nY29udi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9nY29udi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNmQzODEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2djb252LmgKQEAgLTAsMCArMSwxODEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5Ny0xOTk5LCAyMDAwLTIwMDIsIDIwMDcsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIFRoaXMgaGVhZGVyIHByb3ZpZGVzIG5vIGludGVyZmFjZSBmb3IgYSB1c2VyIHRvIHRoZSBpbnRlcm5hbHMgb2YKKyAgIHRoZSBnY29udiBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgbGliYy4gIFRoZXJlZm9yZSB0aGVyZSBpcyBubyB1c2UKKyAgIGZvciB0aGVzZSBkZWZpbml0aW9ucyBiZXNpZGUgZm9yIHdyaXRpbmcgYWRkaXRpb25hbCBnY29udiBtb2R1bGVzLiAgKi8KKworI2lmbmRlZiBfR0NPTlZfSAorI2RlZmluZSBfR0NPTlZfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2RlZmluZSBfX25lZWRfbWJzdGF0ZV90CisjZGVmaW5lIF9fbmVlZF93aW50X3QKKyNpbmNsdWRlIDx3Y2hhci5oPgorI2RlZmluZSBfX25lZWRfc2l6ZV90CisjZGVmaW5lIF9fbmVlZF93Y2hhcl90CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIElTTyAxMDY0NiB2YWx1ZSB1c2VkIHRvIHNpZ25hbCBpbnZhbGlkIHZhbHVlLiAgKi8KKyNkZWZpbmUgX19VTktOT1dOXzEwNjQ2X0NIQVIJKCh3Y2hhcl90KSAweGZmZmQpCisKKy8qIEVycm9yIGNvZGVzIGZvciBnY29udiBmdW5jdGlvbnMuICAqLworZW51bQoreworICBfX0dDT05WX09LID0gMCwKKyAgX19HQ09OVl9OT0NPTlYsCisgIF9fR0NPTlZfTk9EQiwKKyAgX19HQ09OVl9OT01FTSwKKworICBfX0dDT05WX0VNUFRZX0lOUFVULAorICBfX0dDT05WX0ZVTExfT1VUUFVULAorICBfX0dDT05WX0lMTEVHQUxfSU5QVVQsCisgIF9fR0NPTlZfSU5DT01QTEVURV9JTlBVVCwKKworICBfX0dDT05WX0lMTEVHQUxfREVTQ1JJUFRPUiwKKyAgX19HQ09OVl9JTlRFUk5BTF9FUlJPUgorfTsKKworCisvKiBGbGFncyB0aGUgYF9fZ2NvbnZfb3BlbicgZnVuY3Rpb24gY2FuIHNldC4gICovCitlbnVtCit7CisgIF9fR0NPTlZfSVNfTEFTVCA9IDB4MDAwMSwKKyAgX19HQ09OVl9JR05PUkVfRVJST1JTID0gMHgwMDAyLAorICBfX0dDT05WX1NXQVAgPSAweDAwMDQKK307CisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMuICAqLworc3RydWN0IF9fZ2NvbnZfc3RlcDsKK3N0cnVjdCBfX2djb252X3N0ZXBfZGF0YTsKK3N0cnVjdCBfX2djb252X2xvYWRlZF9vYmplY3Q7CitzdHJ1Y3QgX19nY29udl90cmFuc19kYXRhOworCisKKy8qIFR5cGUgb2YgYSBjb252ZXJzaW9uIGZ1bmN0aW9uLiAgKi8KK3R5cGVkZWYgaW50ICgqX19nY29udl9mY3QpIChzdHJ1Y3QgX19nY29udl9zdGVwICosIHN0cnVjdCBfX2djb252X3N0ZXBfZGF0YSAqLAorCQkJICAgIF9fY29uc3QgdW5zaWduZWQgY2hhciAqKiwgX19jb25zdCB1bnNpZ25lZCBjaGFyICosCisJCQkgICAgdW5zaWduZWQgY2hhciAqKiwgc2l6ZV90ICosIGludCwgaW50KTsKKworLyogVHlwZSBvZiBhIHNwZWNpYWxpemVkIGNvbnZlcnNpb24gZnVuY3Rpb24gZm9yIGEgc2luZ2xlIGJ5dGUgdG8gSU5URVJOQUwuICAqLwordHlwZWRlZiB3aW50X3QgKCpfX2djb252X2J0b3djX2ZjdCkgKHN0cnVjdCBfX2djb252X3N0ZXAgKiwgdW5zaWduZWQgY2hhcik7CisKKy8qIENvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIGZvciBsb2NhbCBkYXRhIGZvciBjb252ZXJzaW9uIHN0ZXAuICAqLwordHlwZWRlZiBpbnQgKCpfX2djb252X2luaXRfZmN0KSAoc3RydWN0IF9fZ2NvbnZfc3RlcCAqKTsKK3R5cGVkZWYgdm9pZCAoKl9fZ2NvbnZfZW5kX2ZjdCkgKHN0cnVjdCBfX2djb252X3N0ZXAgKik7CisKKworLyogVHlwZSBvZiBhIHRyYW5zbGl0ZXJhdGlvbi90cmFuc3NjcmlwdGlvbiBmdW5jdGlvbi4gICovCit0eXBlZGVmIGludCAoKl9fZ2NvbnZfdHJhbnNfZmN0KSAoc3RydWN0IF9fZ2NvbnZfc3RlcCAqLAorCQkJCSAgc3RydWN0IF9fZ2NvbnZfc3RlcF9kYXRhICosIHZvaWQgKiwKKwkJCQkgIF9fY29uc3QgdW5zaWduZWQgY2hhciAqLAorCQkJCSAgX19jb25zdCB1bnNpZ25lZCBjaGFyICoqLAorCQkJCSAgX19jb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiosCisJCQkJICBzaXplX3QgKik7CisKKy8qIEZ1bmN0aW9uIHRvIGNhbGwgdG8gcHJvdmlkZSB0cmFuc2xpdGVyYXRpb24gbW9kdWxlIHdpdGggY29udGV4dC4gICovCit0eXBlZGVmIGludCAoKl9fZ2NvbnZfdHJhbnNfY29udGV4dF9mY3QpICh2b2lkICosIF9fY29uc3QgdW5zaWduZWQgY2hhciAqLAorCQkJCQkgIF9fY29uc3QgdW5zaWduZWQgY2hhciAqLAorCQkJCQkgIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqKTsKKworLyogRnVuY3Rpb24gdG8gcXVlcnkgbW9kdWxlIGFib3V0IHN1cHBvcnRlZCBlbmNvZGVkIGNoYXJhY3RlciBzZXRzLiAgKi8KK3R5cGVkZWYgaW50ICgqX19nY29udl90cmFuc19xdWVyeV9mY3QpIChfX2NvbnN0IGNoYXIgKiwgX19jb25zdCBjaGFyICoqKiwKKwkJCQkJc2l6ZV90ICopOworCisvKiBDb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBmb3IgbG9jYWwgZGF0YSBmb3IgdHJhbnNsaXRlcmF0aW9uLiAgKi8KK3R5cGVkZWYgaW50ICgqX19nY29udl90cmFuc19pbml0X2ZjdCkgKHZvaWQgKiosIGNvbnN0IGNoYXIgKik7Cit0eXBlZGVmIHZvaWQgKCpfX2djb252X3RyYW5zX2VuZF9mY3QpICh2b2lkICopOworCitzdHJ1Y3QgX19nY29udl90cmFuc19kYXRhCit7CisgIC8qIFRyYW5zbGl0ZXJhdGlvbi9UcmFuc3NjcmlwdGlvbiBmdW5jdGlvbi4gICovCisgIF9fZ2NvbnZfdHJhbnNfZmN0IF9fdHJhbnNfZmN0OworICBfX2djb252X3RyYW5zX2NvbnRleHRfZmN0IF9fdHJhbnNfY29udGV4dF9mY3Q7CisgIF9fZ2NvbnZfdHJhbnNfZW5kX2ZjdCBfX3RyYW5zX2VuZF9mY3Q7CisgIHZvaWQgKl9fZGF0YTsKKyAgc3RydWN0IF9fZ2NvbnZfdHJhbnNfZGF0YSAqX19uZXh0OworfTsKKworCisvKiBEZXNjcmlwdGlvbiBvZiBhIGNvbnZlcnNpb24gc3RlcC4gICovCitzdHJ1Y3QgX19nY29udl9zdGVwCit7CisgIHN0cnVjdCBfX2djb252X2xvYWRlZF9vYmplY3QgKl9fc2hsaWJfaGFuZGxlOworICBfX2NvbnN0IGNoYXIgKl9fbW9kbmFtZTsKKworICBpbnQgX19jb3VudGVyOworCisgIGNoYXIgKl9fZnJvbV9uYW1lOworICBjaGFyICpfX3RvX25hbWU7CisKKyAgX19nY29udl9mY3QgX19mY3Q7CisgIF9fZ2NvbnZfYnRvd2NfZmN0IF9fYnRvd2NfZmN0OworICBfX2djb252X2luaXRfZmN0IF9faW5pdF9mY3Q7CisgIF9fZ2NvbnZfZW5kX2ZjdCBfX2VuZF9mY3Q7CisKKyAgLyogSW5mb3JtYXRpb24gYWJvdXQgdGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgb3IgcHJvZHVjZWQgaW4gdGhpcworICAgICBzdGVwLiAgVGhpcyBoZWxwcyBvcHRpbWl6aW5nIHRoZSBidWZmZXIgc2l6ZXMuICAqLworICBpbnQgX19taW5fbmVlZGVkX2Zyb207CisgIGludCBfX21heF9uZWVkZWRfZnJvbTsKKyAgaW50IF9fbWluX25lZWRlZF90bzsKKyAgaW50IF9fbWF4X25lZWRlZF90bzsKKworICAvKiBGbGFnIHdoZXRoZXIgdGhpcyBpcyBhIHN0YXRlZnVsIGVuY29kaW5nIG9yIG5vdC4gICovCisgIGludCBfX3N0YXRlZnVsOworCisgIHZvaWQgKl9fZGF0YTsJCS8qIFBvaW50ZXIgdG8gc3RlcC1sb2NhbCBkYXRhLiAgKi8KK307CisKKy8qIEFkZGl0aW9uYWwgZGF0YSBmb3Igc3RlcHMgaW4gdXNlIG9mIGNvbnZlcnNpb24gZGVzY3JpcHRvci4gIFRoaXMgaXMKKyAgIGFsbG9jYXRlZCBieSB0aGUgYGluaXQnIGZ1bmN0aW9uLiAgKi8KK3N0cnVjdCBfX2djb252X3N0ZXBfZGF0YQoreworICB1bnNpZ25lZCBjaGFyICpfX291dGJ1ZjsgICAgLyogT3V0cHV0IGJ1ZmZlciBmb3IgdGhpcyBzdGVwLiAgKi8KKyAgdW5zaWduZWQgY2hhciAqX19vdXRidWZlbmQ7IC8qIEFkZHJlc3Mgb2YgZmlyc3QgYnl0ZSBhZnRlciB0aGUgb3V0cHV0CisJCQkJIGJ1ZmZlci4gICovCisKKyAgLyogSXMgdGhpcyB0aGUgbGFzdCBtb2R1bGUgaW4gdGhlIGNoYWluLiAgKi8KKyAgaW50IF9fZmxhZ3M7CisKKyAgLyogQ291bnRlciBmb3IgbnVtYmVyIG9mIGludm9jYXRpb25zIG9mIHRoZSBtb2R1bGUgZnVuY3Rpb24gZm9yIHRoaXMKKyAgICAgZGVzY3JpcHRvci4gICovCisgIGludCBfX2ludm9jYXRpb25fY291bnRlcjsKKworICAvKiBGbGFnIHdoZXRoZXIgdGhpcyBpcyBhbiBpbnRlcm5hbCB1c2Ugb2YgdGhlIG1vZHVsZSAoaW4gdGhlIG1iKnRvd2MqCisgICAgIGFuZCB3Yyp0b21iKiBmdW5jdGlvbnMpIG9yIHJlZ3VsYXIgd2l0aCBpY29udigzKS4gICovCisgIGludCBfX2ludGVybmFsX3VzZTsKKworICBfX21ic3RhdGVfdCAqX19zdGF0ZXA7CisgIF9fbWJzdGF0ZV90IF9fc3RhdGU7CS8qIFRoaXMgZWxlbWVudCBtdXN0IG5vdCBiZSB1c2VkIGRpcmVjdGx5IGJ5CisJCQkgICBhbnkgbW9kdWxlOyBhbHdheXMgdXNlIFNUQVRFUCEgICovCisKKyAgLyogVHJhbnNsaXRlcmF0aW9uIGluZm9ybWF0aW9uLiAgKi8KKyAgc3RydWN0IF9fZ2NvbnZfdHJhbnNfZGF0YSAqX190cmFuczsKK307CisKKworLyogQ29tYmluZSBjb252ZXJzaW9uIHN0ZXAgZGVzY3JpcHRpb24gd2l0aCBkYXRhLiAgKi8KK3R5cGVkZWYgc3RydWN0IF9fZ2NvbnZfaW5mbworeworICBzaXplX3QgX19uc3RlcHM7CisgIHN0cnVjdCBfX2djb252X3N0ZXAgKl9fc3RlcHM7CisgIF9fZXh0ZW5zaW9uX18gc3RydWN0IF9fZ2NvbnZfc3RlcF9kYXRhIF9fZGF0YSBfX2ZsZXhhcnI7Cit9ICpfX2djb252X3Q7CisKKyNlbmRpZiAvKiBnY29udi5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2dldG9wdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9nZXRvcHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTJmYTI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9nZXRvcHQuaApAQCAtMCwwICsxLDE5MyBAQAorLyogRGVjbGFyYXRpb25zIGZvciBnZXRvcHQuCisgICBDb3B5cmlnaHQgKEMpIDE5ODktMTk5NCwxOTk2LTE5OTksMjAwMSwyMDAzLDIwMDQsMjAwOSwyMDEwCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfR0VUT1BUX0gKKworI2lmbmRlZiBfX25lZWRfZ2V0b3B0CisjIGRlZmluZSBfR0VUT1BUX0ggMQorI2VuZGlmCisKKy8qIElmIF9fR05VX0xJQlJBUllfXyBpcyBub3QgYWxyZWFkeSBkZWZpbmVkLCBlaXRoZXIgd2UgYXJlIGJlaW5nIHVzZWQKKyAgIHN0YW5kYWxvbmUsIG9yIHRoaXMgaXMgdGhlIGZpcnN0IGhlYWRlciBpbmNsdWRlZCBpbiB0aGUgc291cmNlIGZpbGUuCisgICBJZiB3ZSBhcmUgYmVpbmcgdXNlZCB3aXRoIGdsaWJjLCB3ZSBuZWVkIHRvIGluY2x1ZGUgPGZlYXR1cmVzLmg+LCBidXQKKyAgIHRoYXQgZG9lcyBub3QgZXhpc3QgaWYgd2UgYXJlIHN0YW5kYWxvbmUuICBTbzogaWYgX19HTlVfTElCUkFSWV9fIGlzCisgICBub3QgZGVmaW5lZCwgaW5jbHVkZSA8Y3R5cGUuaD4sIHdoaWNoIHdpbGwgcHVsbCBpbiA8ZmVhdHVyZXMuaD4gZm9yIHVzCisgICBpZiBpdCdzIGZyb20gZ2xpYmMuICAoV2h5IGN0eXBlLmg/ICBJdCdzIGd1YXJhbnRlZWQgdG8gZXhpc3QgYW5kIGl0CisgICBkb2Vzbid0IGZsb29kIHRoZSBuYW1lc3BhY2Ugd2l0aCBzdHVmZiB0aGUgd2F5IHNvbWUgb3RoZXIgaGVhZGVycyBkby4pICAqLworI2lmICFkZWZpbmVkIF9fR05VX0xJQlJBUllfXworIyBpbmNsdWRlIDxjdHlwZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX19USFJPVworIyBpZm5kZWYgX19HTlVDX1BSRVJFUQorIyAgZGVmaW5lIF9fR05VQ19QUkVSRVEobWFqLCBtaW4pICgwKQorIyBlbmRpZgorIyBpZiBkZWZpbmVkIF9fY3BsdXNwbHVzICYmIF9fR05VQ19QUkVSRVEgKDIsOCkKKyMgIGRlZmluZSBfX1RIUk9XCXRocm93ICgpCisjIGVsc2UKKyMgIGRlZmluZSBfX1RIUk9XCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmCV9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBGb3IgY29tbXVuaWNhdGlvbiBmcm9tIGBnZXRvcHQnIHRvIHRoZSBjYWxsZXIuCisgICBXaGVuIGBnZXRvcHQnIGZpbmRzIGFuIG9wdGlvbiB0aGF0IHRha2VzIGFuIGFyZ3VtZW50LAorICAgdGhlIGFyZ3VtZW50IHZhbHVlIGlzIHJldHVybmVkIGhlcmUuCisgICBBbHNvLCB3aGVuIGBvcmRlcmluZycgaXMgUkVUVVJOX0lOX09SREVSLAorICAgZWFjaCBub24tb3B0aW9uIEFSR1YtZWxlbWVudCBpcyByZXR1cm5lZCBoZXJlLiAgKi8KKworZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKworLyogSW5kZXggaW4gQVJHViBvZiB0aGUgbmV4dCBlbGVtZW50IHRvIGJlIHNjYW5uZWQuCisgICBUaGlzIGlzIHVzZWQgZm9yIGNvbW11bmljYXRpb24gdG8gYW5kIGZyb20gdGhlIGNhbGxlcgorICAgYW5kIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gc3VjY2Vzc2l2ZSBjYWxscyB0byBgZ2V0b3B0Jy4KKworICAgT24gZW50cnkgdG8gYGdldG9wdCcsIHplcm8gbWVhbnMgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbDsgaW5pdGlhbGl6ZS4KKworICAgV2hlbiBgZ2V0b3B0JyByZXR1cm5zIC0xLCB0aGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2YgdGhlCisgICBub24tb3B0aW9uIGVsZW1lbnRzIHRoYXQgdGhlIGNhbGxlciBzaG91bGQgaXRzZWxmIHNjYW4uCisKKyAgIE90aGVyd2lzZSwgYG9wdGluZCcgY29tbXVuaWNhdGVzIGZyb20gb25lIGNhbGwgdG8gdGhlIG5leHQKKyAgIGhvdyBtdWNoIG9mIEFSR1YgaGFzIGJlZW4gc2Nhbm5lZCBzbyBmYXIuICAqLworCitleHRlcm4gaW50IG9wdGluZDsKKworLyogQ2FsbGVycyBzdG9yZSB6ZXJvIGhlcmUgdG8gaW5oaWJpdCB0aGUgZXJyb3IgbWVzc2FnZSBgZ2V0b3B0JyBwcmludHMKKyAgIGZvciB1bnJlY29nbml6ZWQgb3B0aW9ucy4gICovCisKK2V4dGVybiBpbnQgb3B0ZXJyOworCisvKiBTZXQgdG8gYW4gb3B0aW9uIGNoYXJhY3RlciB3aGljaCB3YXMgdW5yZWNvZ25pemVkLiAgKi8KKworZXh0ZXJuIGludCBvcHRvcHQ7CisKKyNpZm5kZWYgX19uZWVkX2dldG9wdAorLyogRGVzY3JpYmUgdGhlIGxvbmctbmFtZWQgb3B0aW9ucyByZXF1ZXN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgVGhlIExPTkdfT1BUSU9OUyBhcmd1bWVudCB0byBnZXRvcHRfbG9uZyBvciBnZXRvcHRfbG9uZ19vbmx5IGlzIGEgdmVjdG9yCisgICBvZiBgc3RydWN0IG9wdGlvbicgdGVybWluYXRlZCBieSBhbiBlbGVtZW50IGNvbnRhaW5pbmcgYSBuYW1lIHdoaWNoIGlzCisgICB6ZXJvLgorCisgICBUaGUgZmllbGQgYGhhc19hcmcnIGlzOgorICAgbm9fYXJndW1lbnQJCShvciAwKSBpZiB0aGUgb3B0aW9uIGRvZXMgbm90IHRha2UgYW4gYXJndW1lbnQsCisgICByZXF1aXJlZF9hcmd1bWVudAkob3IgMSkgaWYgdGhlIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCwKKyAgIG9wdGlvbmFsX2FyZ3VtZW50IAkob3IgMikgaWYgdGhlIG9wdGlvbiB0YWtlcyBhbiBvcHRpb25hbCBhcmd1bWVudC4KKworICAgSWYgdGhlIGZpZWxkIGBmbGFnJyBpcyBub3QgTlVMTCwgaXQgcG9pbnRzIHRvIGEgdmFyaWFibGUgdGhhdCBpcyBzZXQKKyAgIHRvIHRoZSB2YWx1ZSBnaXZlbiBpbiB0aGUgZmllbGQgYHZhbCcgd2hlbiB0aGUgb3B0aW9uIGlzIGZvdW5kLCBidXQKKyAgIGxlZnQgdW5jaGFuZ2VkIGlmIHRoZSBvcHRpb24gaXMgbm90IGZvdW5kLgorCisgICBUbyBoYXZlIGEgbG9uZy1uYW1lZCBvcHRpb24gZG8gc29tZXRoaW5nIG90aGVyIHRoYW4gc2V0IGFuIGBpbnQnIHRvCisgICBhIGNvbXBpbGVkLWluIGNvbnN0YW50LCBzdWNoIGFzIHNldCBhIHZhbHVlIGZyb20gYG9wdGFyZycsIHNldCB0aGUKKyAgIG9wdGlvbidzIGBmbGFnJyBmaWVsZCB0byB6ZXJvIGFuZCBpdHMgYHZhbCcgZmllbGQgdG8gYSBub256ZXJvCisgICB2YWx1ZSAodGhlIGVxdWl2YWxlbnQgc2luZ2xlLWxldHRlciBvcHRpb24gY2hhcmFjdGVyLCBpZiB0aGVyZSBpcworICAgb25lKS4gIEZvciBsb25nIG9wdGlvbnMgdGhhdCBoYXZlIGEgemVybyBgZmxhZycgZmllbGQsIGBnZXRvcHQnCisgICByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgYHZhbCcgZmllbGQuICAqLworCitzdHJ1Y3Qgb3B0aW9uCit7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIC8qIGhhc19hcmcgY2FuJ3QgYmUgYW4gZW51bSBiZWNhdXNlIHNvbWUgY29tcGlsZXJzIGNvbXBsYWluIGFib3V0CisgICAgIHR5cGUgbWlzbWF0Y2hlcyBpbiBhbGwgdGhlIGNvZGUgdGhhdCBhc3N1bWVzIGl0IGlzIGFuIGludC4gICovCisgIGludCBoYXNfYXJnOworICBpbnQgKmZsYWc7CisgIGludCB2YWw7Cit9OworCisvKiBOYW1lcyBmb3IgdGhlIHZhbHVlcyBvZiB0aGUgYGhhc19hcmcnIGZpZWxkIG9mIGBzdHJ1Y3Qgb3B0aW9uJy4gICovCisKKyMgZGVmaW5lIG5vX2FyZ3VtZW50CQkwCisjIGRlZmluZSByZXF1aXJlZF9hcmd1bWVudAkxCisjIGRlZmluZSBvcHRpb25hbF9hcmd1bWVudAkyCisjZW5kaWYJLyogbmVlZCBnZXRvcHQgKi8KKworCisvKiBHZXQgZGVmaW5pdGlvbnMgYW5kIHByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucyB0byBwcm9jZXNzIHRoZQorICAgYXJndW1lbnRzIGluIEFSR1YgKEFSR0Mgb2YgdGhlbSwgbWludXMgdGhlIHByb2dyYW0gbmFtZSkgZm9yCisgICBvcHRpb25zIGdpdmVuIGluIE9QVFMuCisKKyAgIFJldHVybiB0aGUgb3B0aW9uIGNoYXJhY3RlciBmcm9tIE9QVFMganVzdCByZWFkLiAgUmV0dXJuIC0xIHdoZW4KKyAgIHRoZXJlIGFyZSBubyBtb3JlIG9wdGlvbnMuICBGb3IgdW5yZWNvZ25pemVkIG9wdGlvbnMsIG9yIG9wdGlvbnMKKyAgIG1pc3NpbmcgYXJndW1lbnRzLCBgb3B0b3B0JyBpcyBzZXQgdG8gdGhlIG9wdGlvbiBsZXR0ZXIsIGFuZCAnPycgaXMKKyAgIHJldHVybmVkLgorCisgICBUaGUgT1BUUyBzdHJpbmcgaXMgYSBsaXN0IG9mIGNoYXJhY3RlcnMgd2hpY2ggYXJlIHJlY29nbml6ZWQgb3B0aW9uCisgICBsZXR0ZXJzLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGNvbG9ucywgc3BlY2lmeWluZyB0aGF0IHRoYXQgbGV0dGVyCisgICB0YWtlcyBhbiBhcmd1bWVudCwgdG8gYmUgcGxhY2VkIGluIGBvcHRhcmcnLgorCisgICBJZiBhIGxldHRlciBpbiBPUFRTIGlzIGZvbGxvd2VkIGJ5IHR3byBjb2xvbnMsIGl0cyBhcmd1bWVudCBpcworICAgb3B0aW9uYWwuICBUaGlzIGJlaGF2aW9yIGlzIHNwZWNpZmljIHRvIHRoZSBHTlUgYGdldG9wdCcuCisKKyAgIFRoZSBhcmd1bWVudCBgLS0nIGNhdXNlcyBwcmVtYXR1cmUgdGVybWluYXRpb24gb2YgYXJndW1lbnQKKyAgIHNjYW5uaW5nLCBleHBsaWNpdGx5IHRlbGxpbmcgYGdldG9wdCcgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZQorICAgb3B0aW9ucy4KKworICAgSWYgT1BUUyBiZWdpbnMgd2l0aCBgLS0nLCB0aGVuIG5vbi1vcHRpb24gYXJndW1lbnRzIGFyZSB0cmVhdGVkIGFzCisgICBhcmd1bWVudHMgdG8gdGhlIG9wdGlvbiAnXDAnLiAgVGhpcyBiZWhhdmlvciBpcyBzcGVjaWZpYyB0byB0aGUgR05VCisgICBgZ2V0b3B0Jy4gICovCisKKyNpZmRlZiBfX0dOVV9MSUJSQVJZX18KKy8qIE1hbnkgb3RoZXIgbGlicmFyaWVzIGhhdmUgY29uZmxpY3RpbmcgcHJvdG90eXBlcyBmb3IgZ2V0b3B0LCB3aXRoCisgICBkaWZmZXJlbmNlcyBpbiB0aGUgY29uc3RzLCBpbiBzdGRsaWIuaC4gIFRvIGF2b2lkIGNvbXBpbGF0aW9uCisgICBlcnJvcnMsIG9ubHkgcHJvdG90eXBlIGdldG9wdCBmb3IgdGhlIEdOVSBDIGxpYnJhcnkuICAqLworZXh0ZXJuIGludCBnZXRvcHQgKGludCBfX19hcmdjLCBjaGFyICpjb25zdCAqX19fYXJndiwgY29uc3QgY2hhciAqX19zaG9ydG9wdHMpCisgICAgICAgX19USFJPVzsKKworIyBpZiBkZWZpbmVkIF9fbmVlZF9nZXRvcHQgJiYgZGVmaW5lZCBfX1VTRV9QT1NJWDIgXAorICAmJiAhZGVmaW5lZCBfX1VTRV9QT1NJWF9JTVBMSUNJVExZICYmICFkZWZpbmVkIF9fVVNFX0dOVQorLyogVGhlIEdOVSBnZXRvcHQgaGFzIG1vcmUgZnVuY3Rpb25hbGl0eSB0aGFuIHRoZSBzdGFuZGFyZCB2ZXJzaW9uLiAgVGhlCisgICBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIGRpc2FibGUgYXQgcnVudGltZS4gIFRoaXMgcmVkaXJlY3Rpb24KKyAgIGhlbHBzIHRvIGFsc28gZG8gdGhpcyBhdCBydW50aW1lLiAgKi8KKyMgIGlmZGVmIF9fUkVESVJFQ1QKKyAgZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoZ2V0b3B0LCAoaW50IF9fX2FyZ2MsIGNoYXIgKmNvbnN0ICpfX19hcmd2LAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKl9fc2hvcnRvcHRzKSwKKwkJCSAgICAgX19wb3NpeF9nZXRvcHQpOworIyAgZWxzZQorZXh0ZXJuIGludCBfX3Bvc2l4X2dldG9wdCAoaW50IF9fX2FyZ2MsIGNoYXIgKmNvbnN0ICpfX19hcmd2LAorCQkJICAgY29uc3QgY2hhciAqX19zaG9ydG9wdHMpIF9fVEhST1c7CisjICAgZGVmaW5lIGdldG9wdCBfX3Bvc2l4X2dldG9wdAorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbHNlIC8qIG5vdCBfX0dOVV9MSUJSQVJZX18gKi8KK2V4dGVybiBpbnQgZ2V0b3B0ICgpOworI2VuZGlmIC8qIF9fR05VX0xJQlJBUllfXyAqLworCisjaWZuZGVmIF9fbmVlZF9nZXRvcHQKK2V4dGVybiBpbnQgZ2V0b3B0X2xvbmcgKGludCBfX19hcmdjLCBjaGFyICpjb25zdCAqX19fYXJndiwKKwkJCWNvbnN0IGNoYXIgKl9fc2hvcnRvcHRzLAorCQkgICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKl9fbG9uZ29wdHMsIGludCAqX19sb25naW5kKQorICAgICAgIF9fVEhST1c7CitleHRlcm4gaW50IGdldG9wdF9sb25nX29ubHkgKGludCBfX19hcmdjLCBjaGFyICpjb25zdCAqX19fYXJndiwKKwkJCSAgICAgY29uc3QgY2hhciAqX19zaG9ydG9wdHMsCisJCSAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpfX2xvbmdvcHRzLCBpbnQgKl9fbG9uZ2luZCkKKyAgICAgICBfX1RIUk9XOworCisjZW5kaWYKKworI2lmZGVmCV9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworLyogTWFrZSBzdXJlIHdlIGxhdGVyIGNhbiBnZXQgYWxsIHRoZSBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zLiAgKi8KKyN1bmRlZiBfX25lZWRfZ2V0b3B0CisKKyNlbmRpZiAvKiBnZXRvcHQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9nbG9iLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2dsb2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2YyYWM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9nbG9iLmgKQEAgLTAsMCArMSwxODMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwxOTkyLDE5OTUtMTk5OCwyMDAwLDIwMDEsMjAwNCwyMDEwLDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9HTE9CX0gKKyNkZWZpbmUJX0dMT0JfSAkxCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBXZSBuZWVkIGBzaXplX3QnIGZvciB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zLiAgKi8KKyNpZm5kZWYgX19zaXplX3QKK3R5cGVkZWYgX19TSVpFX1RZUEVfXyBfX3NpemVfdDsKKyMgaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBfX1VTRV9YT1BFTjJLOAordHlwZWRlZiBfX1NJWkVfVFlQRV9fIHNpemVfdDsKKyMgZW5kaWYKKyNlbHNlCisvKiBUaGUgR05VIENDIHN0ZGRlZi5oIHZlcnNpb24gZGVmaW5lcyBfX3NpemVfdCBhcyBlbXB0eS4gIFdlIG5lZWQgYSByZWFsCisgICBkZWZpbml0aW9uLiAgKi8KKyMgdW5kZWYgX19zaXplX3QKKyMgZGVmaW5lIF9fc2l6ZV90IHNpemVfdAorI2VuZGlmCisKKy8qIEJpdHMgc2V0IGluIHRoZSBGTEFHUyBhcmd1bWVudCB0byBgZ2xvYicuICAqLworI2RlZmluZQlHTE9CX0VSUgkoMSA8PCAwKS8qIFJldHVybiBvbiByZWFkIGVycm9ycy4gICovCisjZGVmaW5lCUdMT0JfTUFSSwkoMSA8PCAxKS8qIEFwcGVuZCBhIHNsYXNoIHRvIGVhY2ggbmFtZS4gICovCisjZGVmaW5lCUdMT0JfTk9TT1JUCSgxIDw8IDIpLyogRG9uJ3Qgc29ydCB0aGUgbmFtZXMuICAqLworI2RlZmluZQlHTE9CX0RPT0ZGUwkoMSA8PCAzKS8qIEluc2VydCBQR0xPQi0+Z2xfb2ZmcyBOVUxMcy4gICovCisjZGVmaW5lCUdMT0JfTk9DSEVDSwkoMSA8PCA0KS8qIElmIG5vdGhpbmcgbWF0Y2hlcywgcmV0dXJuIHRoZSBwYXR0ZXJuLiAgKi8KKyNkZWZpbmUJR0xPQl9BUFBFTkQJKDEgPDwgNSkvKiBBcHBlbmQgdG8gcmVzdWx0cyBvZiBhIHByZXZpb3VzIGNhbGwuICAqLworI2RlZmluZQlHTE9CX05PRVNDQVBFCSgxIDw8IDYpLyogQmFja3NsYXNoZXMgZG9uJ3QgcXVvdGUgbWV0YWNoYXJhY3RlcnMuICAqLworI2RlZmluZQlHTE9CX1BFUklPRAkoMSA8PCA3KS8qIExlYWRpbmcgYC4nIGNhbiBiZSBtYXRjaGVkIGJ5IG1ldGFjaGFycy4gICovCisKKyNpZiAhZGVmaW5lZCBfX1VTRV9QT1NJWDIgfHwgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9HTlUKKyMgZGVmaW5lIEdMT0JfTUFHQ0hBUgkgKDEgPDwgOCkvKiBTZXQgaW4gZ2xfZmxhZ3MgaWYgYW55IG1ldGFjaGFycyBzZWVuLiAgKi8KKyMgZGVmaW5lIEdMT0JfQUxURElSRlVOQyAoMSA8PCA5KS8qIFVzZSBnbF9vcGVuZGlyIGV0IGFsIGZ1bmN0aW9ucy4gICovCisjIGRlZmluZSBHTE9CX0JSQUNFCSAoMSA8PCAxMCkvKiBFeHBhbmQgInthLGJ9IiB0byAiYSIgImIiLiAgKi8KKyMgZGVmaW5lIEdMT0JfTk9NQUdJQwkgKDEgPDwgMTEpLyogSWYgbm8gbWFnaWMgY2hhcnMsIHJldHVybiB0aGUgcGF0dGVybi4gICovCisjIGRlZmluZSBHTE9CX1RJTERFCSAoMSA8PCAxMikvKiBFeHBhbmQgfnVzZXIgYW5kIH4gdG8gaG9tZSBkaXJlY3Rvcmllcy4gKi8KKyMgZGVmaW5lIEdMT0JfT05MWURJUgkgKDEgPDwgMTMpLyogTWF0Y2ggb25seSBkaXJlY3Rvcmllcy4gICovCisjIGRlZmluZSBHTE9CX1RJTERFX0NIRUNLICgxIDw8IDE0KS8qIExpa2UgR0xPQl9USUxERSBidXQgcmV0dXJuIGFuIGVycm9yCisJCQkJICAgICAgaWYgdGhlIHVzZXIgbmFtZSBpcyBub3QgYXZhaWxhYmxlLiAgKi8KKyMgZGVmaW5lIF9fR0xPQl9GTEFHUwkoR0xPQl9FUlJ8R0xPQl9NQVJLfEdMT0JfTk9TT1JUfEdMT0JfRE9PRkZTfCBcCisJCQkgR0xPQl9OT0VTQ0FQRXxHTE9CX05PQ0hFQ0t8R0xPQl9BUFBFTkR8ICAgICBcCisJCQkgR0xPQl9QRVJJT0R8R0xPQl9BTFRESVJGVU5DfEdMT0JfQlJBQ0V8ICAgICBcCisJCQkgR0xPQl9OT01BR0lDfEdMT0JfVElMREV8R0xPQl9PTkxZRElSfEdMT0JfVElMREVfQ0hFQ0spCisjZWxzZQorIyBkZWZpbmUgX19HTE9CX0ZMQUdTCShHTE9CX0VSUnxHTE9CX01BUkt8R0xPQl9OT1NPUlR8R0xPQl9ET09GRlN8IFwKKwkJCSBHTE9CX05PRVNDQVBFfEdMT0JfTk9DSEVDS3xHTE9CX0FQUEVORHwgICAgIFwKKwkJCSBHTE9CX1BFUklPRCkKKyNlbmRpZgorCisvKiBFcnJvciByZXR1cm5zIGZyb20gYGdsb2InLiAgKi8KKyNkZWZpbmUJR0xPQl9OT1NQQUNFCTEJLyogUmFuIG91dCBvZiBtZW1vcnkuICAqLworI2RlZmluZQlHTE9CX0FCT1JURUQJMgkvKiBSZWFkIGVycm9yLiAgKi8KKyNkZWZpbmUJR0xPQl9OT01BVENICTMJLyogTm8gbWF0Y2hlcyBmb3VuZC4gICovCisjZGVmaW5lIEdMT0JfTk9TWVMJNAkvKiBOb3QgaW1wbGVtZW50ZWQuICAqLworI2lmZGVmIF9fVVNFX0dOVQorLyogUHJldmlvdXMgdmVyc2lvbnMgb2YgdGhpcyBmaWxlIGRlZmluZWQgR0xPQl9BQkVORCBpbnN0ZWFkIG9mCisgICBHTE9CX0FCT1JURUQuICBQcm92aWRlIGEgY29tcGF0aWJpbGl0eSBkZWZpbml0aW9uIGhlcmUuICAqLworIyBkZWZpbmUgR0xPQl9BQkVORCBHTE9CX0FCT1JURUQKKyNlbmRpZgorCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIGdsb2JiaW5nIHJ1bi4gICovCisjaWZkZWYgX19VU0VfR05VCitzdHJ1Y3Qgc3RhdDsKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIF9fc2l6ZV90IGdsX3BhdGhjOwkJLyogQ291bnQgb2YgcGF0aHMgbWF0Y2hlZCBieSB0aGUgcGF0dGVybi4gICovCisgICAgY2hhciAqKmdsX3BhdGh2OwkJLyogTGlzdCBvZiBtYXRjaGVkIHBhdGhuYW1lcy4gICovCisgICAgX19zaXplX3QgZ2xfb2ZmczsJCS8qIFNsb3RzIHRvIHJlc2VydmUgaW4gYGdsX3BhdGh2Jy4gICovCisgICAgaW50IGdsX2ZsYWdzOwkJLyogU2V0IHRvIEZMQUdTLCBtYXliZSB8IEdMT0JfTUFHQ0hBUi4gICovCisKKyAgICAvKiBJZiB0aGUgR0xPQl9BTFRESVJGVU5DIGZsYWcgaXMgc2V0LCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucworICAgICAgIGFyZSB1c2VkIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBmaWxlIGFjY2VzcyBmdW5jdGlvbnMuICAqLworICAgIHZvaWQgKCpnbF9jbG9zZWRpcikgKHZvaWQgKik7CisjaWZkZWYgX19VU0VfR05VCisgICAgc3RydWN0IGRpcmVudCAqKCpnbF9yZWFkZGlyKSAodm9pZCAqKTsKKyNlbHNlCisgICAgdm9pZCAqKCpnbF9yZWFkZGlyKSAodm9pZCAqKTsKKyNlbmRpZgorICAgIHZvaWQgKigqZ2xfb3BlbmRpcikgKF9fY29uc3QgY2hhciAqKTsKKyNpZmRlZiBfX1VTRV9HTlUKKyAgICBpbnQgKCpnbF9sc3RhdCkgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCwgc3RydWN0IHN0YXQgKl9fcmVzdHJpY3QpOworICAgIGludCAoKmdsX3N0YXQpIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QsIHN0cnVjdCBzdGF0ICpfX3Jlc3RyaWN0KTsKKyNlbHNlCisgICAgaW50ICgqZ2xfbHN0YXQpIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QsIHZvaWQgKl9fcmVzdHJpY3QpOworICAgIGludCAoKmdsX3N0YXQpIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QsIHZvaWQgKl9fcmVzdHJpY3QpOworI2VuZGlmCisgIH0gZ2xvYl90OworCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKKyMgaWZkZWYgX19VU0VfR05VCitzdHJ1Y3Qgc3RhdDY0OworIyBlbmRpZgordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIF9fc2l6ZV90IGdsX3BhdGhjOworICAgIGNoYXIgKipnbF9wYXRodjsKKyAgICBfX3NpemVfdCBnbF9vZmZzOworICAgIGludCBnbF9mbGFnczsKKworICAgIC8qIElmIHRoZSBHTE9CX0FMVERJUkZVTkMgZmxhZyBpcyBzZXQsIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zCisgICAgICAgYXJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIGZpbGUgYWNjZXNzIGZ1bmN0aW9ucy4gICovCisgICAgdm9pZCAoKmdsX2Nsb3NlZGlyKSAodm9pZCAqKTsKKyMgaWZkZWYgX19VU0VfR05VCisgICAgc3RydWN0IGRpcmVudDY0ICooKmdsX3JlYWRkaXIpICh2b2lkICopOworIyBlbHNlCisgICAgdm9pZCAqKCpnbF9yZWFkZGlyKSAodm9pZCAqKTsKKyMgZW5kaWYKKyAgICB2b2lkICooKmdsX29wZW5kaXIpIChfX2NvbnN0IGNoYXIgKik7CisjIGlmZGVmIF9fVVNFX0dOVQorICAgIGludCAoKmdsX2xzdGF0KSAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0LCBzdHJ1Y3Qgc3RhdDY0ICpfX3Jlc3RyaWN0KTsKKyAgICBpbnQgKCpnbF9zdGF0KSAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0LCBzdHJ1Y3Qgc3RhdDY0ICpfX3Jlc3RyaWN0KTsKKyMgZWxzZQorICAgIGludCAoKmdsX2xzdGF0KSAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0LCB2b2lkICpfX3Jlc3RyaWN0KTsKKyAgICBpbnQgKCpnbF9zdGF0KSAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0LCB2b2lkICpfX3Jlc3RyaWN0KTsKKyMgZW5kaWYKKyAgfSBnbG9iNjRfdDsKKyNlbmRpZgorCisvKiBEbyBnbG9iIHNlYXJjaGluZyBmb3IgUEFUVEVSTiwgcGxhY2luZyByZXN1bHRzIGluIFBHTE9CLgorICAgVGhlIGJpdHMgZGVmaW5lZCBhYm92ZSBtYXkgYmUgc2V0IGluIEZMQUdTLgorICAgSWYgYSBkaXJlY3RvcnkgY2Fubm90IGJlIG9wZW5lZCBvciByZWFkIGFuZCBFUlJGVU5DIGlzIG5vdCBuaWwsCisgICBpdCBpcyBjYWxsZWQgd2l0aCB0aGUgcGF0aG5hbWUgdGhhdCBjYXVzZWQgdGhlIGVycm9yLCBhbmQgdGhlCisgICBgZXJybm8nIHZhbHVlIGZyb20gdGhlIGZhaWxpbmcgY2FsbDsgaWYgaXQgcmV0dXJucyBub24temVybworICAgYGdsb2InIHJldHVybnMgR0xPQl9BQkVORDsgaWYgaXQgcmV0dXJucyB6ZXJvLCB0aGUgZXJyb3IgaXMgaWdub3JlZC4KKyAgIElmIG1lbW9yeSBjYW5ub3QgYmUgYWxsb2NhdGVkIGZvciBQR0xPQiwgR0xPQl9OT1NQQUNFIGlzIHJldHVybmVkLgorICAgT3RoZXJ3aXNlLCBgZ2xvYicgcmV0dXJucyB6ZXJvLiAgKi8KKyNpZiAhZGVmaW5lZCBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IGdsb2IgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdHRlcm4sIGludCBfX2ZsYWdzLAorCQkgaW50ICgqX19lcnJmdW5jKSAoX19jb25zdCBjaGFyICosIGludCksCisJCSBnbG9iX3QgKl9fcmVzdHJpY3QgX19wZ2xvYikgX19USFJPVzsKKworLyogRnJlZSBzdG9yYWdlIGFsbG9jYXRlZCBpbiBQR0xPQiBieSBhIHByZXZpb3VzIGBnbG9iJyBjYWxsLiAgKi8KK2V4dGVybiB2b2lkIGdsb2JmcmVlIChnbG9iX3QgKl9fcGdsb2IpIF9fVEhST1c7CisjZWxzZQorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoZ2xvYiwgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdHRlcm4sCisJCQkJICBpbnQgX19mbGFncywKKwkJCQkgIGludCAoKl9fZXJyZnVuYykgKF9fY29uc3QgY2hhciAqLCBpbnQpLAorCQkJCSAgZ2xvYl90ICpfX3Jlc3RyaWN0IF9fcGdsb2IpLCBnbG9iNjQpOworCitleHRlcm4gdm9pZCBfX1JFRElSRUNUX05USCAoZ2xvYmZyZWUsIChnbG9iX3QgKl9fcGdsb2IpLCBnbG9iZnJlZTY0KTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgZ2xvYjY0IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wYXR0ZXJuLCBpbnQgX19mbGFncywKKwkJICAgaW50ICgqX19lcnJmdW5jKSAoX19jb25zdCBjaGFyICosIGludCksCisJCSAgIGdsb2I2NF90ICpfX3Jlc3RyaWN0IF9fcGdsb2IpIF9fVEhST1c7CisKK2V4dGVybiB2b2lkIGdsb2JmcmVlNjQgKGdsb2I2NF90ICpfX3BnbG9iKSBfX1RIUk9XOworI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0dOVQorLyogUmV0dXJuIG5vbnplcm8gaWYgUEFUVEVSTiBjb250YWlucyBhbnkgbWV0YWNoYXJhY3RlcnMuCisgICBNZXRhY2hhcmFjdGVycyBjYW4gYmUgcXVvdGVkIHdpdGggYmFja3NsYXNoZXMgaWYgUVVPVEUgaXMgbm9uemVyby4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiB0aGUgaW50ZXJmYWNlIHNwZWNpZmllZCBieSBQT1NJWC4yCisgICBidXQgc2V2ZXJhbCBwcm9ncmFtcyB3YW50IHRvIHVzZSBpdC4gICovCitleHRlcm4gaW50IGdsb2JfcGF0dGVybl9wIChfX2NvbnN0IGNoYXIgKl9fcGF0dGVybiwgaW50IF9fcXVvdGUpIF9fVEhST1c7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGdsb2IuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZ251LXZlcnNpb25zLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2dudS12ZXJzaW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTYxN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2dudS12ZXJzaW9ucy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIEhlYWRlciB3aXRoIGludGVyZmFjZSB2ZXJzaW9uIG1hY3JvcyBmb3IgbGlicmFyeSBwaWVjZXMgY29waWVkIGVsc2V3aGVyZS4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfR05VX1ZFUlNJT05TX0gKKyNkZWZpbmUJX0dOVV9WRVJTSU9OU19ICTEKKworLyogVGhpcyBmaWxlIGV4aXN0cyB0byBkZWZpbmUgdGhlc2UgZmV3IG1hY3Jvcy4gIEVhY2ggc3BlY2lmaWVzIGEgdmVyc2lvbgorICAgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGlicmFyeSBpbnRlcmZhY2Ugb2YgYSBwaWVjZSBvZiB0aGUgQyBsaWJyYXJ5CisgICB3aGljaCBpcyBhbHNvIGRpc3RyaWJ1dGVkIHdpdGggb3RoZXIgR05VIHBhY2thZ2VzLiAgVGhlc2UgcGllY2VzIGFyZQorICAgYm90aCBwYXJ0IG9mIHRoZSBHTlUgQyBsaWJyYXJ5IGFuZCBhbHNvIGRpc3RyaWJ1dGVkIHdpdGggb3RoZXIgR05VCisgICBwYWNrYWdlcyBzbyB0aG9zZSBwYWNrYWdlcyBtYXkgdXNlIHRoZWlyIGZhY2lsaXRpZXMgb24gc3lzdGVtcyBsYWNraW5nCisgICB0aGUgR05VIEMgbGlicmFyeS4gIFRoZSBzb3VyY2UgZmlsZXMgZm9yIGVhY2ggcGllY2Ugc3Vycm91bmQgYWxsIHRoZWlyCisgICBjb2RlIHdpdGggYCNpZm5kZWYgRUxJREVfQ09ERScgYWZ0ZXIgZGVmaW5pbmcgaXQgd2l0aCB0aGlzOgorCisgICAjZGVmaW5lIE9CU1RBQ0tfSU5URVJGQUNFX1ZFUlNJT04gMQorICAgI2lmICFkZWZpbmVkIChfTElCQykgJiYgZGVmaW5lZCAoX19HTlVfTElCUkFSWV9fKSAmJiBfX0dOVV9MSUJSQVJZX18gPiAxCisgICAjaW5jbHVkZSA8Z251LXZlcnNpb25zLmg+CisgICAjaWYgX0dOVV9PQlNUQUNLX0lOVEVSRkFDRV9WRVJTSU9OID09IE9CU1RBQ0tfSU5URVJGQUNFX1ZFUlNJT04KKyAgICNkZWZpbmUgRUxJREVfQ09ERQorICAgI2VuZGlmCisgICAjZW5kaWYKKworICAgVGhpcyBhbGxvd3MgdGhvc2Ugb25lIHRvIGF2b2lkIGNvbXBpbGluZyB0aG9zZSBmaWxlcyB3aGVuIHBhcnQgb2YgYSBHTlUKKyAgIHBhY2thZ2Ugbm90IGxpYmMsIG9uIGEgc3lzdGVtIHVzaW5nIGEgR05VIEMgbGlicmFyeSB0aGF0IHN1cHBvcnRzIHRoZQorICAgc2FtZSBpbnRlcmZhY2UuCisKKyAgIFBsZWFzZSBwcmVzZXJ2ZSB0aGUgZm9ybWF0IG9mIHRoZSBjb21tZW50cyBhZnRlciBlYWNoIG1hY3JvLiAgQW5kCisgICByZW1lbWJlciwgaWYgYW55IG9mIHRoZXNlIHZlcnNpb25zIGNoYW5nZSwgdGhlIGxpYmMuc28gbWFqb3IgdmVyc2lvbgorICAgbnVtYmVyIG11c3QgY2hhbmdlIHRvbyAoc28gYXZvaWQgaXQpISAgKi8KKworI2RlZmluZSBfR05VX09CU1RBQ0tfSU5URVJGQUNFX1ZFUlNJT04JMSAvKiB2cyBtYWxsb2Mvb2JzdGFjay5jICovCisjZGVmaW5lIF9HTlVfUkVHRVhfSU5URVJGQUNFX1ZFUlNJT04JMSAvKiB2cyBwb3NpeC9yZWdleC5jICovCisjZGVmaW5lIF9HTlVfR0xPQl9JTlRFUkZBQ0VfVkVSU0lPTgkxIC8qIHZzIHBvc2l4L2dsb2IuYyAqLworI2RlZmluZSBfR05VX0dFVE9QVF9JTlRFUkZBQ0VfVkVSU0lPTgkyIC8qIHZzIHBvc2l4L2dldG9wdC5jIGFuZAorCQkJCQkgICAgIHBvc2l4L2dldG9wdDEuYyAqLworCisjZW5kaWYJLyogZ251LXZlcnNpb25zLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZ3JwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2dycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNmVmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2dycC5oCkBAIC0wLDAgKzEsMjA5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsMTk5MiwxOTk1LTIwMDEsMjAwMywyMDA0LDIwMTAKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJUE9TSVggU3RhbmRhcmQ6IDkuMi4xIEdyb3VwIERhdGFiYXNlIEFjY2Vzcwk8Z3JwLmg+CisgKi8KKworI2lmbmRlZglfR1JQX0gKKyNkZWZpbmUJX0dSUF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworI2RlZmluZSBfX25lZWRfc2l6ZV90CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKworLyogRm9yIHRoZSBTaW5nbGUgVW5peCBzcGVjaWZpY2F0aW9uIHdlIG11c3QgZGVmaW5lIHRoaXMgdHlwZSBoZXJlLiAgKi8KKyNpZiAoZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMkspICYmICFkZWZpbmVkIF9fZ2lkX3RfZGVmaW5lZAordHlwZWRlZiBfX2dpZF90IGdpZF90OworIyBkZWZpbmUgX19naWRfdF9kZWZpbmVkCisjZW5kaWYKKworLyogVGhlIGdyb3VwIHN0cnVjdHVyZS4JICovCitzdHJ1Y3QgZ3JvdXAKKyAgeworICAgIGNoYXIgKmdyX25hbWU7CQkvKiBHcm91cCBuYW1lLgkqLworICAgIGNoYXIgKmdyX3Bhc3N3ZDsJCS8qIFBhc3N3b3JkLgkqLworICAgIF9fZ2lkX3QgZ3JfZ2lkOwkJLyogR3JvdXAgSUQuCSovCisgICAgY2hhciAqKmdyX21lbTsJCS8qIE1lbWJlciBsaXN0LgkqLworICB9OworCisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9HTlUKKyMgZGVmaW5lIF9fbmVlZF9GSUxFCisjIGluY2x1ZGUgPHN0ZGlvLmg+CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIFJld2luZCB0aGUgZ3JvdXAtZmlsZSBzdHJlYW0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgc2V0Z3JlbnQgKHZvaWQpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCBcCisgICAgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorLyogQ2xvc2UgdGhlIGdyb3VwLWZpbGUgc3RyZWFtLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIGVuZGdyZW50ICh2b2lkKTsKKworLyogUmVhZCBhbiBlbnRyeSBmcm9tIHRoZSBncm91cC1maWxlIHN0cmVhbSwgb3BlbmluZyBpdCBpZiBuZWNlc3NhcnkuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBncm91cCAqZ2V0Z3JlbnQgKHZvaWQpOworI2VuZGlmCisKKyNpZmRlZglfX1VTRV9TVklECisvKiBSZWFkIGEgZ3JvdXAgZW50cnkgZnJvbSBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgZ3JvdXAgKmZnZXRncmVudCAoRklMRSAqX19zdHJlYW0pOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFdyaXRlIHRoZSBnaXZlbiBlbnRyeSBvbnRvIHRoZSBnaXZlbiBzdHJlYW0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcHV0Z3JlbnQgKF9fY29uc3Qgc3RydWN0IGdyb3VwICpfX3Jlc3RyaWN0IF9fcCwKKwkJICAgICBGSUxFICpfX3Jlc3RyaWN0IF9fZik7CisjZW5kaWYKKworLyogU2VhcmNoIGZvciBhbiBlbnRyeSB3aXRoIGEgbWF0Y2hpbmcgZ3JvdXAgSUQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBncm91cCAqZ2V0Z3JnaWQgKF9fZ2lkX3QgX19naWQpOworCisvKiBTZWFyY2ggZm9yIGFuIGVudHJ5IHdpdGggYSBtYXRjaGluZyBncm91cCBuYW1lLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgZ3JvdXAgKmdldGdybmFtIChfX2NvbnN0IGNoYXIgKl9fbmFtZSk7CisKKyNpZiBkZWZpbmVkIF9fVVNFX1BPU0lYIHx8IGRlZmluZWQgX19VU0VfTUlTQworCisjIGlmZGVmIF9fVVNFX01JU0MKKy8qIFJlYXNvbmFibGUgdmFsdWUgZm9yIHRoZSBidWZmZXIgc2l6ZWQgdXNlZCBpbiB0aGUgcmVlbnRyYW50CisgICBmdW5jdGlvbnMgYmVsb3cuICBCdXQgYmV0dGVyIHVzZSBgc3lzY29uZicuICAqLworIyAgZGVmaW5lIE5TU19CVUZMRU5fR1JPVVAJMTAyNAorIyBlbmRpZgorCisvKiBSZWVudHJhbnQgdmVyc2lvbnMgb2Ygc29tZSBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlLgorCisgICBQTEVBU0UgTk9URTogdGhlIGBnZXRncmVudF9yJyBmdW5jdGlvbiBpcyBub3QgKHlldCkgc3RhbmRhcmRpemVkLgorICAgVGhlIGludGVyZmFjZSBtYXkgY2hhbmdlIGluIGxhdGVyIHZlcnNpb25zIG9mIHRoaXMgbGlicmFyeS4gIEJ1dAorICAgdGhlIGludGVyZmFjZSBpcyBkZXNpZ25lZCBmb2xsb3dpbmcgdGhlIHByaW5jaXBhbHMgdXNlZCBmb3IgdGhlCisgICBvdGhlciByZWVudHJhbnQgZnVuY3Rpb25zIHNvIHRoZSBjaGFuY2VzIGFyZSBnb29kIHRoaXMgaXMgd2hhdCB0aGUKKyAgIFBPU0lYIHBlb3BsZSB3b3VsZCBjaG9vc2UuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KKworIyBpZmRlZiBfX1VTRV9HTlUKK2V4dGVybiBpbnQgZ2V0Z3JlbnRfciAoc3RydWN0IGdyb3VwICpfX3Jlc3RyaWN0IF9fcmVzdWx0YnVmLAorCQkgICAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkgICAgICAgc3RydWN0IGdyb3VwICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisjIGVuZGlmCisKKy8qIFNlYXJjaCBmb3IgYW4gZW50cnkgd2l0aCBhIG1hdGNoaW5nIGdyb3VwIElELgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0Z3JnaWRfciAoX19naWRfdCBfX2dpZCwgc3RydWN0IGdyb3VwICpfX3Jlc3RyaWN0IF9fcmVzdWx0YnVmLAorCQkgICAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkgICAgICAgc3RydWN0IGdyb3VwICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisKKy8qIFNlYXJjaCBmb3IgYW4gZW50cnkgd2l0aCBhIG1hdGNoaW5nIGdyb3VwIG5hbWUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRncm5hbV9yIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLAorCQkgICAgICAgc3RydWN0IGdyb3VwICpfX3Jlc3RyaWN0IF9fcmVzdWx0YnVmLAorCQkgICAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkgICAgICAgc3RydWN0IGdyb3VwICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisKKyMgaWZkZWYJX19VU0VfU1ZJRAorLyogUmVhZCBhIGdyb3VwIGVudHJ5IGZyb20gU1RSRUFNLiAgVGhpcyBmdW5jdGlvbiBpcyBub3Qgc3RhbmRhcmRpemVkCisgICBhbiBwcm9iYWJseSBuZXZlciB3aWxsLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZnZXRncmVudF9yIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCQkJc3RydWN0IGdyb3VwICpfX3Jlc3RyaWN0IF9fcmVzdWx0YnVmLAorCQkJY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkJc3RydWN0IGdyb3VwICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisjIGVuZGlmCisKKyNlbmRpZgkvKiBQT1NJWCBvciByZWVudHJhbnQgKi8KKworCisjaWZkZWYJX19VU0VfQlNECisKKyMgZGVmaW5lIF9fbmVlZF9zaXplX3QKKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIFNldCB0aGUgZ3JvdXAgc2V0IGZvciB0aGUgY3VycmVudCB1c2VyIHRvIEdST1VQUyAoTiBvZiB0aGVtKS4gICovCitleHRlcm4gaW50IHNldGdyb3VwcyAoc2l6ZV90IF9fbiwgX19jb25zdCBfX2dpZF90ICpfX2dyb3VwcykgX19USFJPVzsKKworLyogU3RvcmUgYXQgbW9zdCAqTkdST1VQUyBtZW1iZXJzIG9mIHRoZSBncm91cCBzZXQgZm9yIFVTRVIgaW50bworICAgKkdST1VQUy4gIEFsc28gaW5jbHVkZSBHUk9VUC4gIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGdyb3VwcyBmb3VuZCBpcworICAgcmV0dXJuZWQgaW4gKk5HUk9VUFMuICBSZXR1cm4gLTEgaWYgdGhlIGlmICpOR1JPVVBTIGlzIHRvbyBzbWFsbC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRncm91cGxpc3QgKF9fY29uc3QgY2hhciAqX191c2VyLCBfX2dpZF90IF9fZ3JvdXAsCisJCQkgX19naWRfdCAqX19ncm91cHMsIGludCAqX19uZ3JvdXBzKTsKKworLyogSW5pdGlhbGl6ZSB0aGUgZ3JvdXAgc2V0IGZvciB0aGUgY3VycmVudCB1c2VyCisgICBieSByZWFkaW5nIHRoZSBncm91cCBkYXRhYmFzZSBhbmQgdXNpbmcgYWxsIGdyb3VwcworICAgb2Ygd2hpY2ggVVNFUiBpcyBhIG1lbWJlci4gIEFsc28gaW5jbHVkZSBHUk9VUC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBpbml0Z3JvdXBzIChfX2NvbnN0IGNoYXIgKl9fdXNlciwgX19naWRfdCBfX2dyb3VwKTsKKworI2VuZGlmIC8qIFVzZSBCU0QuICAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogZ3JwLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2dzaGFkb3cuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZ3NoYWRvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYjI4YWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2dzaGFkb3cuaApAQCAtMCwwICsxLDEzMSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBEZWNsYXJhdGlvbiBvZiB0eXBlcyBhbmQgZnVuY3Rpb25zIGZvciBzaGFkb3cgZ3JvdXAgc3VpdGUuICAqLworCisjaWZuZGVmIF9HU0hBRE9XX0gKKyNkZWZpbmUgX0dTSEFET1dfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8cGF0aHMuaD4KKworI2RlZmluZQlfX25lZWRfRklMRQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogUGF0aCB0byB0aGUgdXNlciBkYXRhYmFzZSBmaWxlcy4gICovCisjZGVmaW5lCUdTSEFET1cgX1BBVEhfR1NIQURPVworCisKK19fQkVHSU5fREVDTFMKKworLyogU3RydWN0dXJlIG9mIHRoZSBncm91cCBmaWxlLiAgKi8KK3N0cnVjdCBzZ3JwCisgIHsKKyAgICBjaGFyICpzZ19uYW1wOwkJLyogR3JvdXAgbmFtZS4gICovCisgICAgY2hhciAqc2dfcGFzc3dkOwkJLyogRW5jcnlwdGVkIHBhc3N3b3JkLiAgKi8KKyAgICBjaGFyICoqc2dfYWRtOwkJLyogR3JvdXAgYWRtaW5pc3RyYXRvciBsaXN0LiAgKi8KKyAgICBjaGFyICoqc2dfbWVtOwkJLyogR3JvdXAgbWVtYmVyIGxpc3QuICAqLworICB9OworCisKKy8qIE9wZW4gZGF0YWJhc2UgZm9yIHJlYWRpbmcuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIHNldHNnZW50ICh2b2lkKTsKKworLyogQ2xvc2UgZGF0YWJhc2UuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIGVuZHNnZW50ICh2b2lkKTsKKworLyogR2V0IG5leHQgZW50cnkgZnJvbSBkYXRhYmFzZSwgcGVyaGFwcyBhZnRlciBvcGVuaW5nIHRoZSBmaWxlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IHNncnAgKmdldHNnZW50ICh2b2lkKTsKKworLyogR2V0IHNoYWRvdyBlbnRyeSBtYXRjaGluZyBOQU1FLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IHNncnAgKmdldHNnbmFtIChfX2NvbnN0IGNoYXIgKl9fbmFtZSk7CisKKy8qIFJlYWQgc2hhZG93IGVudHJ5IGZyb20gU1RSSU5HLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IHNncnAgKnNnZXRzZ2VudCAoX19jb25zdCBjaGFyICpfX3N0cmluZyk7CisKKy8qIFJlYWQgbmV4dCBzaGFkb3cgZW50cnkgZnJvbSBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3Qgc2dycCAqZmdldHNnZW50IChGSUxFICpfX3N0cmVhbSk7CisKKy8qIFdyaXRlIGxpbmUgY29udGFpbmluZyBzaGFkb3cgcGFzc3dvcmQgZW50cnkgdG8gc3RyZWFtLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHB1dHNnZW50IChfX2NvbnN0IHN0cnVjdCBzZ3JwICpfX2csIEZJTEUgKl9fc3RyZWFtKTsKKworCisjaWZkZWYgX19VU0VfTUlTQworLyogUmVlbnRyYW50IHZlcnNpb25zIG9mIHNvbWUgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZS4KKworICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gdGhleSBhcmUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGdldHNnZW50X3IgKHN0cnVjdCBzZ3JwICpfX3Jlc3VsdF9idWYsIGNoYXIgKl9fYnVmZmVyLAorCQkgICAgICAgc2l6ZV90IF9fYnVmbGVuLCBzdHJ1Y3Qgc2dycCAqKl9fcmVzdWx0KTsKKworZXh0ZXJuIGludCBnZXRzZ25hbV9yIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgc3RydWN0IHNncnAgKl9fcmVzdWx0X2J1ZiwKKwkJICAgICAgIGNoYXIgKl9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4sCisJCSAgICAgICBzdHJ1Y3Qgc2dycCAqKl9fcmVzdWx0KTsKKworZXh0ZXJuIGludCBzZ2V0c2dlbnRfciAoX19jb25zdCBjaGFyICpfX3N0cmluZywgc3RydWN0IHNncnAgKl9fcmVzdWx0X2J1ZiwKKwkJCWNoYXIgKl9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4sCisJCQlzdHJ1Y3Qgc2dycCAqKl9fcmVzdWx0KTsKKworZXh0ZXJuIGludCBmZ2V0c2dlbnRfciAoRklMRSAqX19zdHJlYW0sIHN0cnVjdCBzZ3JwICpfX3Jlc3VsdF9idWYsCisJCQljaGFyICpfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkJc3RydWN0IHNncnAgKipfX3Jlc3VsdCk7CisjZW5kaWYJLyogbWlzYyAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogZ3NoYWRvdy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9hLm91dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vYS5vdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njg0Zjk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vYS5vdXQuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9BU01fWDg2X0FfT1VUX0gKKyNkZWZpbmUgX0FTTV9YODZfQV9PVVRfSAorCitzdHJ1Y3QgZXhlYworeworCXVuc2lnbmVkIGludCBhX2luZm87CS8qIFVzZSBtYWNyb3MgTl9NQUdJQywgZXRjIGZvciBhY2Nlc3MgKi8KKwl1bnNpZ25lZCBhX3RleHQ7CS8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAqLworCXVuc2lnbmVkIGFfZGF0YTsJLyogbGVuZ3RoIG9mIGRhdGEsIGluIGJ5dGVzICovCisJdW5zaWduZWQgYV9ic3M7CQkvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgZm9yIGZpbGUsIGluIGJ5dGVzICovCisJdW5zaWduZWQgYV9zeW1zOwkvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGRhdGEgaW4gZmlsZSwgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBhX2VudHJ5OwkvKiBzdGFydCBhZGRyZXNzICovCisJdW5zaWduZWQgYV90cnNpemU7CS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIHRleHQsIGluIGJ5dGVzICovCisJdW5zaWduZWQgYV9kcnNpemU7CS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIGRhdGEsIGluIGJ5dGVzICovCit9OworCisjZGVmaW5lIE5fVFJTSVpFKGEpCSgoYSkuYV90cnNpemUpCisjZGVmaW5lIE5fRFJTSVpFKGEpCSgoYSkuYV9kcnNpemUpCisjZGVmaW5lIE5fU1lNU0laRShhKQkoKGEpLmFfc3ltcykKKworI2VuZGlmIC8qIF9BU01fWDg2X0FfT1VUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2F1eHZlYy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vYXV4dmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMxNmI0YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2F1eHZlYy5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9YODZfQVVYVkVDX0gKKyNkZWZpbmUgX0FTTV9YODZfQVVYVkVDX0gKKy8qCisgKiBBcmNoaXRlY3R1cmUtbmV1dHJhbCBBVF8gdmFsdWVzIGluIDAtMTcsIGxlYXZlIHNvbWUgcm9vbQorICogZm9yIG1vcmUgb2YgdGhlbSwgc3RhcnQgdGhlIHg4Ni1zcGVjaWZpYyBvbmVzIGF0IDMyLgorICovCisjaWZkZWYgX19pMzg2X18KKyNkZWZpbmUgQVRfU1lTSU5GTwkJMzIKKyNlbmRpZgorI2RlZmluZSBBVF9TWVNJTkZPX0VIRFIJCTMzCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9BVVhWRUNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vYml0c3BlcmxvbmcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2JpdHNwZXJsb25nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBhZTFjNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2JpdHNwZXJsb25nLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfX0FTTV9YODZfQklUU1BFUkxPTkdfSAorI2RlZmluZSBfX0FTTV9YODZfQklUU1BFUkxPTkdfSAorCisjaWZkZWYgX194ODZfNjRfXworIyBkZWZpbmUgX19CSVRTX1BFUl9MT05HIDY0CisjZWxzZQorIyBkZWZpbmUgX19CSVRTX1BFUl9MT05HIDMyCisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdHNwZXJsb25nLmg+CisKKyNlbmRpZiAvKiBfX0FTTV9YODZfQklUU1BFUkxPTkdfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9ib290LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9ib290LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyMDBhYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2Jvb3QuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9BU01fWDg2X0JPT1RfSAorI2RlZmluZSBfQVNNX1g4Nl9CT09UX0gKKworLyogSW50ZXJuYWwgc3ZnYSBzdGFydHVwIGNvbnN0YW50cyAqLworI2RlZmluZSBOT1JNQUxfVkdBCTB4ZmZmZgkJLyogODB4MjUgbW9kZSAqLworI2RlZmluZSBFWFRFTkRFRF9WR0EJMHhmZmZlCQkvKiA4MHg1MCBtb2RlICovCisjZGVmaW5lIEFTS19WR0EJCTB4ZmZmZAkJLyogYXNrIGZvciBpdCBhdCBib290dXAgKi8KKworCisjZW5kaWYgLyogX0FTTV9YODZfQk9PVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9ib290cGFyYW0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2Jvb3RwYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMjBkODgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9ib290cGFyYW0uaApAQCAtMCwwICsxLDEzNCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9CT09UUEFSQU1fSAorI2RlZmluZSBfQVNNX1g4Nl9CT09UUEFSQU1fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY3JlZW5faW5mby5oPgorI2luY2x1ZGUgPGxpbnV4L2FwbV9iaW9zLmg+CisjaW5jbHVkZSA8bGludXgvZWRkLmg+CisjaW5jbHVkZSA8YXNtL2U4MjAuaD4KKyNpbmNsdWRlIDxhc20vaXN0Lmg+CisjaW5jbHVkZSA8dmlkZW8vZWRpZC5oPgorCisvKiBzZXR1cCBkYXRhIHR5cGVzICovCisjZGVmaW5lIFNFVFVQX05PTkUJCQkwCisjZGVmaW5lIFNFVFVQX0U4MjBfRVhUCQkJMQorI2RlZmluZSBTRVRVUF9EVEIJCQkyCisKKy8qIGV4dGVuc2libGUgc2V0dXAgZGF0YSBsaXN0IG5vZGUgKi8KK3N0cnVjdCBzZXR1cF9kYXRhIHsKKwlfX3U2NCBuZXh0OworCV9fdTMyIHR5cGU7CisJX191MzIgbGVuOworCV9fdTggZGF0YVswXTsKK307CisKK3N0cnVjdCBzZXR1cF9oZWFkZXIgeworCV9fdTgJc2V0dXBfc2VjdHM7CisJX191MTYJcm9vdF9mbGFnczsKKwlfX3UzMglzeXNzaXplOworCV9fdTE2CXJhbV9zaXplOworI2RlZmluZSBSQU1ESVNLX0lNQUdFX1NUQVJUX01BU0sJMHgwN0ZGCisjZGVmaW5lIFJBTURJU0tfUFJPTVBUX0ZMQUcJCTB4ODAwMAorI2RlZmluZSBSQU1ESVNLX0xPQURfRkxBRwkJMHg0MDAwCisJX191MTYJdmlkX21vZGU7CisJX191MTYJcm9vdF9kZXY7CisJX191MTYJYm9vdF9mbGFnOworCV9fdTE2CWp1bXA7CisJX191MzIJaGVhZGVyOworCV9fdTE2CXZlcnNpb247CisJX191MzIJcmVhbG1vZGVfc3d0Y2g7CisJX191MTYJc3RhcnRfc3lzOworCV9fdTE2CWtlcm5lbF92ZXJzaW9uOworCV9fdTgJdHlwZV9vZl9sb2FkZXI7CisJX191OAlsb2FkZmxhZ3M7CisjZGVmaW5lIExPQURFRF9ISUdICSgxPDwwKQorI2RlZmluZSBRVUlFVF9GTEFHCSgxPDw1KQorI2RlZmluZSBLRUVQX1NFR01FTlRTCSgxPDw2KQorI2RlZmluZSBDQU5fVVNFX0hFQVAJKDE8PDcpCisJX191MTYJc2V0dXBfbW92ZV9zaXplOworCV9fdTMyCWNvZGUzMl9zdGFydDsKKwlfX3UzMglyYW1kaXNrX2ltYWdlOworCV9fdTMyCXJhbWRpc2tfc2l6ZTsKKwlfX3UzMglib290c2VjdF9rbHVkZ2U7CisJX191MTYJaGVhcF9lbmRfcHRyOworCV9fdTgJZXh0X2xvYWRlcl92ZXI7CisJX191OAlleHRfbG9hZGVyX3R5cGU7CisJX191MzIJY21kX2xpbmVfcHRyOworCV9fdTMyCWluaXRyZF9hZGRyX21heDsKKwlfX3UzMglrZXJuZWxfYWxpZ25tZW50OworCV9fdTgJcmVsb2NhdGFibGVfa2VybmVsOworCV9fdTgJX3BhZDJbM107CisJX191MzIJY21kbGluZV9zaXplOworCV9fdTMyCWhhcmR3YXJlX3N1YmFyY2g7CisJX191NjQJaGFyZHdhcmVfc3ViYXJjaF9kYXRhOworCV9fdTMyCXBheWxvYWRfb2Zmc2V0OworCV9fdTMyCXBheWxvYWRfbGVuZ3RoOworCV9fdTY0CXNldHVwX2RhdGE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc3lzX2Rlc2NfdGFibGUgeworCV9fdTE2IGxlbmd0aDsKKwlfX3U4ICB0YWJsZVsxNF07Cit9OworCisvKiBHbGVhbmVkIGZyb20gT0ZXJ3Mgc2V0LXBhcmFtZXRlcnMgaW4gY3B1L3g4Ni9wYy9saW51eC5mdGggKi8KK3N0cnVjdCBvbHBjX29md19oZWFkZXIgeworCV9fdTMyIG9md19tYWdpYzsJLyogT0ZXIHNpZ25hdHVyZSAqLworCV9fdTMyIG9md192ZXJzaW9uOworCV9fdTMyIGNpZl9oYW5kbGVyOwkvKiBjYWxsYmFjayBpbnRvIE9GVyAqLworCV9fdTMyIGlycV9kZXNjX3RhYmxlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGVmaV9pbmZvIHsKKwlfX3UzMiBlZmlfbG9hZGVyX3NpZ25hdHVyZTsKKwlfX3UzMiBlZmlfc3lzdGFiOworCV9fdTMyIGVmaV9tZW1kZXNjX3NpemU7CisJX191MzIgZWZpX21lbWRlc2NfdmVyc2lvbjsKKwlfX3UzMiBlZmlfbWVtbWFwOworCV9fdTMyIGVmaV9tZW1tYXBfc2l6ZTsKKwlfX3UzMiBlZmlfc3lzdGFiX2hpOworCV9fdTMyIGVmaV9tZW1tYXBfaGk7Cit9OworCisvKiBUaGUgc28tY2FsbGVkICJ6ZXJvcGFnZSIgKi8KK3N0cnVjdCBib290X3BhcmFtcyB7CisJc3RydWN0IHNjcmVlbl9pbmZvIHNjcmVlbl9pbmZvOwkJCS8qIDB4MDAwICovCisJc3RydWN0IGFwbV9iaW9zX2luZm8gYXBtX2Jpb3NfaW5mbzsJCS8qIDB4MDQwICovCisJX191OCAgX3BhZDJbNF07CQkJCQkvKiAweDA1NCAqLworCV9fdTY0ICB0Ym9vdF9hZGRyOwkJCQkvKiAweDA1OCAqLworCXN0cnVjdCBpc3RfaW5mbyBpc3RfaW5mbzsJCQkvKiAweDA2MCAqLworCV9fdTggIF9wYWQzWzE2XTsJCQkJLyogMHgwNzAgKi8KKwlfX3U4ICBoZDBfaW5mb1sxNl07CS8qIG9ic29sZXRlISAqLwkJLyogMHgwODAgKi8KKwlfX3U4ICBoZDFfaW5mb1sxNl07CS8qIG9ic29sZXRlISAqLwkJLyogMHgwOTAgKi8KKwlzdHJ1Y3Qgc3lzX2Rlc2NfdGFibGUgc3lzX2Rlc2NfdGFibGU7CQkvKiAweDBhMCAqLworCXN0cnVjdCBvbHBjX29md19oZWFkZXIgb2xwY19vZndfaGVhZGVyOwkJLyogMHgwYjAgKi8KKwlfX3U4ICBfcGFkNFsxMjhdOwkJCQkvKiAweDBjMCAqLworCXN0cnVjdCBlZGlkX2luZm8gZWRpZF9pbmZvOwkJCS8qIDB4MTQwICovCisJc3RydWN0IGVmaV9pbmZvIGVmaV9pbmZvOwkJCS8qIDB4MWMwICovCisJX191MzIgYWx0X21lbV9rOwkJCQkvKiAweDFlMCAqLworCV9fdTMyIHNjcmF0Y2g7CQkvKiBTY3JhdGNoIGZpZWxkISAqLwkvKiAweDFlNCAqLworCV9fdTggIGU4MjBfZW50cmllczsJCQkJLyogMHgxZTggKi8KKwlfX3U4ICBlZGRidWZfZW50cmllczsJCQkJLyogMHgxZTkgKi8KKwlfX3U4ICBlZGRfbWJyX3NpZ19idWZfZW50cmllczsJCQkvKiAweDFlYSAqLworCV9fdTggIF9wYWQ2WzZdOwkJCQkJLyogMHgxZWIgKi8KKwlzdHJ1Y3Qgc2V0dXBfaGVhZGVyIGhkcjsgICAgLyogc2V0dXAgaGVhZGVyICovCS8qIDB4MWYxICovCisJX191OCAgX3BhZDdbMHgyOTAtMHgxZjEtc2l6ZW9mKHN0cnVjdCBzZXR1cF9oZWFkZXIpXTsKKwlfX3UzMiBlZGRfbWJyX3NpZ19idWZmZXJbRUREX01CUl9TSUdfTUFYXTsJLyogMHgyOTAgKi8KKwlzdHJ1Y3QgZTgyMGVudHJ5IGU4MjBfbWFwW0U4MjBNQVhdOwkJLyogMHgyZDAgKi8KKwlfX3U4ICBfcGFkOFs0OF07CQkJCS8qIDB4Y2QwICovCisJc3RydWN0IGVkZF9pbmZvIGVkZGJ1ZltFRERNQVhOUl07CQkvKiAweGQwMCAqLworCV9fdTggIF9wYWQ5WzI3Nl07CQkJCS8qIDB4ZWVjICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitlbnVtIHsKKwlYODZfU1VCQVJDSF9QQyA9IDAsCisJWDg2X1NVQkFSQ0hfTEdVRVNULAorCVg4Nl9TVUJBUkNIX1hFTiwKKwlYODZfU1VCQVJDSF9NUlNULAorCVg4Nl9TVUJBUkNIX0NFNDEwMCwKKwlYODZfTlJfU1VCQVJDSFMsCit9OworCisKKworI2VuZGlmIC8qIF9BU01fWDg2X0JPT1RQQVJBTV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9ieXRlb3JkZXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2J5dGVvcmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxM2E3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9ieXRlb3JkZXIuaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX0FTTV9YODZfQllURU9SREVSX0gKKyNkZWZpbmUgX0FTTV9YODZfQllURU9SREVSX0gKKworI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vZGVidWdyZWcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2RlYnVncmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNkOWJkMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2RlYnVncmVnLmgKQEAgLTAsMCArMSw4MCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9ERUJVR1JFR19ICisjZGVmaW5lIF9BU01fWDg2X0RFQlVHUkVHX0gKKworCisvKiBJbmRpY2F0ZSB0aGUgcmVnaXN0ZXIgbnVtYmVycyBmb3IgYSBudW1iZXIgb2YgdGhlIHNwZWNpZmljCisgICBkZWJ1ZyByZWdpc3RlcnMuICBSZWdpc3RlcnMgMC0zIGNvbnRhaW4gdGhlIGFkZHJlc3NlcyB3ZSB3aXNoIHRvIHRyYXAgb24gKi8KKyNkZWZpbmUgRFJfRklSU1RBRERSIDAgICAgICAgIC8qIHVfZGVidWdyZWdbRFJfRklSU1RBRERSXSAqLworI2RlZmluZSBEUl9MQVNUQUREUiAzICAgICAgICAgLyogdV9kZWJ1Z3JlZ1tEUl9MQVNUQUREUl0gICovCisKKyNkZWZpbmUgRFJfU1RBVFVTIDYgICAgICAgICAgIC8qIHVfZGVidWdyZWdbRFJfU1RBVFVTXSAgICAgKi8KKyNkZWZpbmUgRFJfQ09OVFJPTCA3ICAgICAgICAgIC8qIHVfZGVidWdyZWdbRFJfQ09OVFJPTF0gKi8KKworLyogRGVmaW5lIGEgZmV3IHRoaW5ncyBmb3IgdGhlIHN0YXR1cyByZWdpc3Rlci4gIFdlIGNhbiB1c2UgdGhpcyB0byBkZXRlcm1pbmUKKyAgIHdoaWNoIGRlYnVnZ2luZyByZWdpc3RlciB3YXMgcmVzcG9uc2libGUgZm9yIHRoZSB0cmFwLiAgVGhlIG90aGVyIGJpdHMKKyAgIGFyZSBlaXRoZXIgcmVzZXJ2ZWQgb3Igbm90IG9mIGludGVyZXN0IHRvIHVzLiAqLworCisvKiBEZWZpbmUgcmVzZXJ2ZWQgYml0cyBpbiBEUjYgd2hpY2ggYXJlIGFsd2F5cyBzZXQgdG8gMSAqLworI2RlZmluZSBEUjZfUkVTRVJWRUQJKDB4RkZGRjBGRjApCisKKyNkZWZpbmUgRFJfVFJBUDAJKDB4MSkJCS8qIGRiMCAqLworI2RlZmluZSBEUl9UUkFQMQkoMHgyKQkJLyogZGIxICovCisjZGVmaW5lIERSX1RSQVAyCSgweDQpCQkvKiBkYjIgKi8KKyNkZWZpbmUgRFJfVFJBUDMJKDB4OCkJCS8qIGRiMyAqLworI2RlZmluZSBEUl9UUkFQX0JJVFMJKERSX1RSQVAwfERSX1RSQVAxfERSX1RSQVAyfERSX1RSQVAzKQorCisjZGVmaW5lIERSX1NURVAJCSgweDQwMDApCS8qIHNpbmdsZS1zdGVwICovCisjZGVmaW5lIERSX1NXSVRDSAkoMHg4MDAwKQkvKiB0YXNrIHN3aXRjaCAqLworCisvKiBOb3cgZGVmaW5lIGEgYnVuY2ggb2YgdGhpbmdzIGZvciBtYW5pcHVsYXRpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIuCisgICBUaGUgdG9wIHR3byBieXRlcyBvZiB0aGUgY29udHJvbCByZWdpc3RlciBjb25zaXN0IG9mIDQgZmllbGRzIG9mIDQKKyAgIGJpdHMgLSBlYWNoIGZpZWxkIGNvcnJlc3BvbmRzIHRvIG9uZSBvZiB0aGUgZm91ciBkZWJ1ZyByZWdpc3RlcnMsCisgICBhbmQgaW5kaWNhdGVzIHdoYXQgdHlwZXMgb2YgYWNjZXNzIHdlIHRyYXAgb24sIGFuZCBob3cgbGFyZ2UgdGhlIGRhdGEKKyAgIGZpZWxkIGlzIHRoYXQgd2UgYXJlIGxvb2tpbmcgYXQgKi8KKworI2RlZmluZSBEUl9DT05UUk9MX1NISUZUIDE2IC8qIFNraXAgdGhpcyBtYW55IGJpdHMgaW4gY3RsIHJlZ2lzdGVyICovCisjZGVmaW5lIERSX0NPTlRST0xfU0laRSA0ICAgLyogNCBjb250cm9sIGJpdHMgcGVyIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgRFJfUldfRVhFQ1VURSAoMHgwKSAgIC8qIFNldHRpbmdzIGZvciB0aGUgYWNjZXNzIHR5cGVzIHRvIHRyYXAgb24gKi8KKyNkZWZpbmUgRFJfUldfV1JJVEUgKDB4MSkKKyNkZWZpbmUgRFJfUldfUkVBRCAoMHgzKQorCisjZGVmaW5lIERSX0xFTl8xICgweDApIC8qIFNldHRpbmdzIGZvciBkYXRhIGxlbmd0aCB0byB0cmFwIG9uICovCisjZGVmaW5lIERSX0xFTl8yICgweDQpCisjZGVmaW5lIERSX0xFTl80ICgweEMpCisjZGVmaW5lIERSX0xFTl84ICgweDgpCisKKy8qIFRoZSBsb3cgYnl0ZSB0byB0aGUgY29udHJvbCByZWdpc3RlciBkZXRlcm1pbmUgd2hpY2ggcmVnaXN0ZXJzIGFyZQorICAgZW5hYmxlZC4gIFRoZXJlIGFyZSA0IGZpZWxkcyBvZiB0d28gYml0cy4gIE9uZSBiaXQgaXMgImxvY2FsIiwgbWVhbmluZworICAgdGhhdCB0aGUgcHJvY2Vzc29yIHdpbGwgcmVzZXQgdGhlIGJpdCBhZnRlciBhIHRhc2sgc3dpdGNoIGFuZCB0aGUgb3RoZXIKKyAgIGlzIGdsb2JhbCBtZWFuaW5nIHRoYXQgd2UgaGF2ZSB0byBleHBsaWNpdGx5IHJlc2V0IHRoZSBiaXQuICBXaXRoIGxpbnV4LAorICAgeW91IGNhbiB1c2UgZWl0aGVyIG9uZSwgc2luY2Ugd2UgZXhwbGljaXRseSB6ZXJvIHRoZSByZWdpc3RlciB3aGVuIHdlIGVudGVyCisgICBrZXJuZWwgbW9kZS4gKi8KKworI2RlZmluZSBEUl9MT0NBTF9FTkFCTEVfU0hJRlQgMCAgICAvKiBFeHRyYSBzaGlmdCB0byB0aGUgbG9jYWwgZW5hYmxlIGJpdCAqLworI2RlZmluZSBEUl9HTE9CQUxfRU5BQkxFX1NISUZUIDEgICAvKiBFeHRyYSBzaGlmdCB0byB0aGUgZ2xvYmFsIGVuYWJsZSBiaXQgKi8KKyNkZWZpbmUgRFJfTE9DQUxfRU5BQkxFICgweDEpICAgICAgLyogTG9jYWwgZW5hYmxlIGZvciByZWcgMCAqLworI2RlZmluZSBEUl9HTE9CQUxfRU5BQkxFICgweDIpICAgICAvKiBHbG9iYWwgZW5hYmxlIGZvciByZWcgMCAqLworI2RlZmluZSBEUl9FTkFCTEVfU0laRSAyICAgICAgICAgICAvKiAyIGVuYWJsZSBiaXRzIHBlciByZWdpc3RlciAqLworCisjZGVmaW5lIERSX0xPQ0FMX0VOQUJMRV9NQVNLICgweDU1KSAgLyogU2V0ICBsb2NhbCBiaXRzIGZvciBhbGwgNCByZWdzICovCisjZGVmaW5lIERSX0dMT0JBTF9FTkFCTEVfTUFTSyAoMHhBQSkgLyogU2V0IGdsb2JhbCBiaXRzIGZvciBhbGwgNCByZWdzICovCisKKy8qIFRoZSBzZWNvbmQgYnl0ZSB0byB0aGUgY29udHJvbCByZWdpc3RlciBoYXMgYSBmZXcgc3BlY2lhbCB0aGluZ3MuCisgICBXZSBjYW4gc2xvdyB0aGUgaW5zdHJ1Y3Rpb24gcGlwZWxpbmUgZm9yIGluc3RydWN0aW9ucyBjb21pbmcgdmlhIHRoZQorICAgZ2R0IG9yIHRoZSBsZHQgaWYgd2Ugd2FudCB0by4gIEkgYW0gbm90IHN1cmUgd2h5IHRoaXMgaXMgYW4gYWR2YW50YWdlICovCisKKyNpZmRlZiBfX2kzODZfXworI2RlZmluZSBEUl9DT05UUk9MX1JFU0VSVkVEICgweEZDMDApIC8qIFJlc2VydmVkIGJ5IEludGVsICovCisjZWxzZQorI2RlZmluZSBEUl9DT05UUk9MX1JFU0VSVkVEICgweEZGRkZGRkZGMDAwMEZDMDBVTCkgLyogUmVzZXJ2ZWQgKi8KKyNlbmRpZgorCisjZGVmaW5lIERSX0xPQ0FMX1NMT1dET1dOICgweDEwMCkgICAvKiBMb2NhbCBzbG93IHRoZSBwaXBlbGluZSAqLworI2RlZmluZSBEUl9HTE9CQUxfU0xPV0RPV04gKDB4MjAwKSAgLyogR2xvYmFsIHNsb3cgdGhlIHBpcGVsaW5lICovCisKKy8qCisgKiBIVyBicmVha3BvaW50IGFkZGl0aW9ucworICovCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9ERUJVR1JFR19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9lODIwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9lODIwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJlZTU1OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2U4MjAuaApAQCAtMCwwICsxLDcyIEBACisjaWZuZGVmIF9BU01fWDg2X0U4MjBfSAorI2RlZmluZSBfQVNNX1g4Nl9FODIwX0gKKyNkZWZpbmUgRTgyME1BUAkweDJkMAkJLyogb3VyIG1hcCAqLworI2RlZmluZSBFODIwTUFYCTEyOAkJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gRTgyME1BUCAqLworCisvKgorICogTGVnYWN5IEU4MjAgQklPUyBsaW1pdHMgdXMgdG8gMTI4IChFODIwTUFYKSBub2RlcyBkdWUgdG8gdGhlCisgKiBjb25zdHJhaW5lZCBzcGFjZSBpbiB0aGUgemVyb3BhZ2UuICBJZiB3ZSBoYXZlIG1vcmUgbm9kZXMgdGhhbgorICogdGhhdCwgYW5kIGlmIHdlJ3ZlIGJvb3RlZCBvZmYgRUZJIGZpcm13YXJlLCB0aGVuIHRoZSBFRkkgdGFibGVzCisgKiBwYXNzZWQgdXMgZnJvbSB0aGUgRUZJIGZpcm13YXJlIGNhbiBsaXN0IG1vcmUgbm9kZXMuICBTaXplIG91cgorICogaW50ZXJuYWwgbWVtb3J5IG1hcCB0YWJsZXMgdG8gaGF2ZSByb29tIGZvciB0aGVzZSBhZGRpdGlvbmFsCisgKiBub2RlcywgYmFzZWQgb24gdXAgdG8gdGhyZWUgZW50cmllcyBwZXIgbm9kZSBmb3Igd2hpY2ggdGhlCisgKiBrZXJuZWwgd2FzIGJ1aWx0OiBNQVhfTlVNTk9ERVMgPT0gKDEgPDwgQ09ORklHX05PREVTX1NISUZUKSwKKyAqIHBsdXMgRTgyME1BWCwgYWxsb3dpbmcgc3BhY2UgZm9yIHRoZSBwb3NzaWJsZSBkdXBsaWNhdGUgRTgyMAorICogZW50cmllcyB0aGF0IG1pZ2h0IG5lZWQgcm9vbSBpbiB0aGUgc2FtZSBhcnJheXMsIHByaW9yIHRvIHRoZQorICogY2FsbCB0byBzYW5pdGl6ZV9lODIwX21hcCgpIHRvIHJlbW92ZSBkdXBsaWNhdGVzLiAgVGhlIGFsbG93YW5jZQorICogb2YgdGhyZWUgbWVtb3J5IG1hcCBlbnRyaWVzIHBlciBub2RlIGlzICJlbm91Z2giIGVudHJpZXMgZm9yCisgKiB0aGUgaW5pdGlhbCBoYXJkd2FyZSBwbGF0Zm9ybSBtb3RpdmF0aW5nIHRoaXMgbWVjaGFuaXNtIHRvIG1ha2UKKyAqIHVzZSBvZiBhZGRpdGlvbmFsIEVGSSBtYXAgZW50cmllcy4gIEZ1dHVyZSBwbGF0Zm9ybXMgbWF5IHdhbnQKKyAqIHRvIGFsbG93IG1vcmUgdGhhbiB0aHJlZSBlbnRyaWVzIHBlciBub2RlIG9yIG90aGVyd2lzZSByZWZpbmUKKyAqIHRoaXMgc2l6ZS4KKyAqLworCisvKgorICogT2RkOiAnbWFrZSBoZWFkZXJzX2NoZWNrJyBjb21wbGFpbnMgYWJvdXQgbnVtYS5oIGlmIEkgdHJ5CisgKiB0byBjb2xsYXBzZSB0aGUgbmV4dCB0d28gI2lmZGVmIGxpbmVzIHRvIGEgc2luZ2xlIGxpbmU6CisgKgkjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSAmJiBkZWZpbmVkKENPTkZJR19FRkkpCisgKi8KKyNkZWZpbmUgRTgyMF9YX01BWCBFODIwTUFYCisKKyNkZWZpbmUgRTgyME5SCTB4MWU4CQkvKiAjIGVudHJpZXMgaW4gRTgyME1BUCAqLworCisjZGVmaW5lIEU4MjBfUkFNCTEKKyNkZWZpbmUgRTgyMF9SRVNFUlZFRAkyCisjZGVmaW5lIEU4MjBfQUNQSQkzCisjZGVmaW5lIEU4MjBfTlZTCTQKKyNkZWZpbmUgRTgyMF9VTlVTQUJMRQk1CisKKy8qCisgKiByZXNlcnZlZCBSQU0gdXNlZCBieSBrZXJuZWwgaXRzZWxmCisgKiBpZiBDT05GSUdfSU5URUxfVFhUIGlzIGVuYWJsZWQsIG1lbW9yeSBvZiB0aGlzIHR5cGUgd2lsbCBiZQorICogaW5jbHVkZWQgaW4gdGhlIFMzIGludGVncml0eSBjYWxjdWxhdGlvbiBhbmQgc28gc2hvdWxkIG5vdCBpbmNsdWRlCisgKiBhbnkgbWVtb3J5IHRoYXQgQklPUyBtaWdodCBhbHRlciBvdmVyIHRoZSBTMyB0cmFuc2l0aW9uCisgKi8KKyNkZWZpbmUgRTgyMF9SRVNFUlZFRF9LRVJOICAgICAgICAxMjgKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorc3RydWN0IGU4MjBlbnRyeSB7CisJX191NjQgYWRkcjsJLyogc3RhcnQgb2YgbWVtb3J5IHNlZ21lbnQgKi8KKwlfX3U2NCBzaXplOwkvKiBzaXplIG9mIG1lbW9yeSBzZWdtZW50ICovCisJX191MzIgdHlwZTsJLyogdHlwZSBvZiBtZW1vcnkgc2VnbWVudCAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGU4MjBtYXAgeworCV9fdTMyIG5yX21hcDsKKwlzdHJ1Y3QgZTgyMGVudHJ5IG1hcFtFODIwX1hfTUFYXTsKK307CisKKyNkZWZpbmUgSVNBX1NUQVJUX0FERFJFU1MJMHhhMDAwMAorI2RlZmluZSBJU0FfRU5EX0FERFJFU1MJCTB4MTAwMDAwCisKKyNkZWZpbmUgQklPU19CRUdJTgkJMHgwMDBhMDAwMAorI2RlZmluZSBCSU9TX0VORAkJMHgwMDEwMDAwMAorCisjZGVmaW5lIEJJT1NfUk9NX0JBU0UJCTB4ZmZlMDAwMDAKKyNkZWZpbmUgQklPU19ST01fRU5ECQkweGZmZmZmZmZmCisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworCisjZW5kaWYgLyogX0FTTV9YODZfRTgyMF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9lcnJuby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vZXJybm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzgyYjUwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vZXJybm8uaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZXJybm8uaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2ZjbnRsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9mY250bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YWIxMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9mY250bC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mY250bC5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vaHdfYnJlYWtwb2ludC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vaHdfYnJlYWtwb2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNjRlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9od19icmVha3BvaW50LmgKQEAgLTAsMCArMSw1IEBACisjaWZuZGVmCV9JMzg2X0hXX0JSRUFLUE9JTlRfSAorI2RlZmluZQlfSTM4Nl9IV19CUkVBS1BPSU5UX0gKKworI2VuZGlmCS8qIF9JMzg2X0hXX0JSRUFLUE9JTlRfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9oeXBlcnYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2h5cGVydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MDQyMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9oeXBlcnYuaApAQCAtMCwwICsxLDE5NCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9IWVBFUlZfSAorI2RlZmluZSBfQVNNX1g4Nl9IWVBFUlZfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIFRoZSBiZWxvdyBDUFVJRCBsZWF2ZXMgYXJlIHByZXNlbnQgaWYgVmVyc2lvbkFuZEZlYXR1cmVzLkh5cGVydmlzb3JQcmVzZW50CisgKiBpcyBzZXQgYnkgQ1BVSUQoSHZDcHVJZEZ1bmN0aW9uVmVyc2lvbkFuZEZlYXR1cmVzKS4KKyAqLworI2RlZmluZSBIWVBFUlZfQ1BVSURfVkVORE9SX0FORF9NQVhfRlVOQ1RJT05TCTB4NDAwMDAwMDAKKyNkZWZpbmUgSFlQRVJWX0NQVUlEX0lOVEVSRkFDRQkJCTB4NDAwMDAwMDEKKyNkZWZpbmUgSFlQRVJWX0NQVUlEX1ZFUlNJT04JCQkweDQwMDAwMDAyCisjZGVmaW5lIEhZUEVSVl9DUFVJRF9GRUFUVVJFUwkJCTB4NDAwMDAwMDMKKyNkZWZpbmUgSFlQRVJWX0NQVUlEX0VOTElHSFRNRU5UX0lORk8JCTB4NDAwMDAwMDQKKyNkZWZpbmUgSFlQRVJWX0NQVUlEX0lNUExFTUVOVF9MSU1JVFMJCTB4NDAwMDAwMDUKKworI2RlZmluZSBIWVBFUlZfSFlQRVJWSVNPUl9QUkVTRU5UX0JJVAkJMHg4MDAwMDAwMAorI2RlZmluZSBIWVBFUlZfQ1BVSURfTUlOCQkJMHg0MDAwMDAwNQorI2RlZmluZSBIWVBFUlZfQ1BVSURfTUFYCQkJMHg0MDAwZmZmZgorCisvKgorICogRmVhdHVyZSBpZGVudGlmaWNhdGlvbi4gRUFYIGluZGljYXRlcyB3aGljaCBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlCisgKiB0byB0aGUgcGFydGl0aW9uIGJhc2VkIHVwb24gdGhlIGN1cnJlbnQgcGFydGl0aW9uIHByaXZpbGVnZXMuCisgKi8KKworLyogVlAgUnVudGltZSAoSFZfWDY0X01TUl9WUF9SVU5USU1FKSBhdmFpbGFibGUgKi8KKyNkZWZpbmUgSFZfWDY0X01TUl9WUF9SVU5USU1FX0FWQUlMQUJMRQkJKDEgPDwgMCkKKy8qIFBhcnRpdGlvbiBSZWZlcmVuY2UgQ291bnRlciAoSFZfWDY0X01TUl9USU1FX1JFRl9DT1VOVCkgYXZhaWxhYmxlKi8KKyNkZWZpbmUgSFZfWDY0X01TUl9USU1FX1JFRl9DT1VOVF9BVkFJTEFCTEUJKDEgPDwgMSkKKy8qCisgKiBCYXNpYyBTeW5JQyBNU1JzIChIVl9YNjRfTVNSX1NDT05UUk9MIHRocm91Z2ggSFZfWDY0X01TUl9FT00KKyAqIGFuZCBIVl9YNjRfTVNSX1NJTlQwIHRocm91Z2ggSFZfWDY0X01TUl9TSU5UMTUpIGF2YWlsYWJsZQorICovCisjZGVmaW5lIEhWX1g2NF9NU1JfU1lOSUNfQVZBSUxBQkxFCQkoMSA8PCAyKQorLyoKKyAqIFN5bnRoZXRpYyBUaW1lciBNU1JzIChIVl9YNjRfTVNSX1NUSU1FUjBfQ09ORklHIHRocm91Z2gKKyAqIEhWX1g2NF9NU1JfU1RJTUVSM19DT1VOVCkgYXZhaWxhYmxlCisgKi8KKyNkZWZpbmUgSFZfWDY0X01TUl9TWU5USU1FUl9BVkFJTEFCTEUJCSgxIDw8IDMpCisvKgorICogQVBJQyBhY2Nlc3MgTVNScyAoSFZfWDY0X01TUl9FT0ksIEhWX1g2NF9NU1JfSUNSIGFuZCBIVl9YNjRfTVNSX1RQUikKKyAqIGFyZSBhdmFpbGFibGUKKyAqLworI2RlZmluZSBIVl9YNjRfTVNSX0FQSUNfQUNDRVNTX0FWQUlMQUJMRQkoMSA8PCA0KQorLyogSHlwZXJjYWxsIE1TUnMgKEhWX1g2NF9NU1JfR1VFU1RfT1NfSUQgYW5kIEhWX1g2NF9NU1JfSFlQRVJDQUxMKSBhdmFpbGFibGUqLworI2RlZmluZSBIVl9YNjRfTVNSX0hZUEVSQ0FMTF9BVkFJTEFCTEUJCSgxIDw8IDUpCisvKiBBY2Nlc3MgdmlydHVhbCBwcm9jZXNzb3IgaW5kZXggTVNSIChIVl9YNjRfTVNSX1ZQX0lOREVYKSBhdmFpbGFibGUqLworI2RlZmluZSBIVl9YNjRfTVNSX1ZQX0lOREVYX0FWQUlMQUJMRQkJKDEgPDwgNikKKy8qIFZpcnR1YWwgc3lzdGVtIHJlc2V0IE1TUiAoSFZfWDY0X01TUl9SRVNFVCkgaXMgYXZhaWxhYmxlKi8KKyNkZWZpbmUgSFZfWDY0X01TUl9SRVNFVF9BVkFJTEFCTEUJCSgxIDw8IDcpCisgLyoKKyAgKiBBY2Nlc3Mgc3RhdGlzdGljcyBwYWdlcyBNU1JzIChIVl9YNjRfTVNSX1NUQVRTX1BBUlRJVElPTl9SRVRBSUxfUEFHRSwKKyAgKiBIVl9YNjRfTVNSX1NUQVRTX1BBUlRJVElPTl9JTlRFUk5BTF9QQUdFLCBIVl9YNjRfTVNSX1NUQVRTX1ZQX1JFVEFJTF9QQUdFLAorICAqIEhWX1g2NF9NU1JfU1RBVFNfVlBfSU5URVJOQUxfUEFHRSkgYXZhaWxhYmxlCisgICovCisjZGVmaW5lIEhWX1g2NF9NU1JfU1RBVF9QQUdFU19BVkFJTEFCTEUJCSgxIDw8IDgpCisKKy8qCisgKiBGZWF0dXJlIGlkZW50aWZpY2F0aW9uOiBFQlggaW5kaWNhdGVzIHdoaWNoIGZsYWdzIHdlcmUgc3BlY2lmaWVkIGF0CisgKiBwYXJ0aXRpb24gY3JlYXRpb24uIFRoZSBmb3JtYXQgaXMgdGhlIHNhbWUgYXMgdGhlIHBhcnRpdGlvbiBjcmVhdGlvbgorICogZmxhZyBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiBzZWN0aW9uIFBhcnRpdGlvbiBDcmVhdGlvbiBGbGFncy4KKyAqLworI2RlZmluZSBIVl9YNjRfQ1JFQVRFX1BBUlRJVElPTlMJCSgxIDw8IDApCisjZGVmaW5lIEhWX1g2NF9BQ0NFU1NfUEFSVElUSU9OX0lECQkoMSA8PCAxKQorI2RlZmluZSBIVl9YNjRfQUNDRVNTX01FTU9SWV9QT09MCQkoMSA8PCAyKQorI2RlZmluZSBIVl9YNjRfQURKVVNUX01FU1NBR0VfQlVGRkVSUwkJKDEgPDwgMykKKyNkZWZpbmUgSFZfWDY0X1BPU1RfTUVTU0FHRVMJCQkoMSA8PCA0KQorI2RlZmluZSBIVl9YNjRfU0lHTkFMX0VWRU5UUwkJCSgxIDw8IDUpCisjZGVmaW5lIEhWX1g2NF9DUkVBVEVfUE9SVAkJCSgxIDw8IDYpCisjZGVmaW5lIEhWX1g2NF9DT05ORUNUX1BPUlQJCQkoMSA8PCA3KQorI2RlZmluZSBIVl9YNjRfQUNDRVNTX1NUQVRTCQkJKDEgPDwgOCkKKyNkZWZpbmUgSFZfWDY0X0RFQlVHR0lORwkJCSgxIDw8IDExKQorI2RlZmluZSBIVl9YNjRfQ1BVX1BPV0VSX01BTkFHRU1FTlQJCSgxIDw8IDEyKQorI2RlZmluZSBIVl9YNjRfQ09ORklHVVJFX1BST0ZJTEVSCQkoMSA8PCAxMykKKworLyoKKyAqIEZlYXR1cmUgaWRlbnRpZmljYXRpb24uIEVEWCBpbmRpY2F0ZXMgd2hpY2ggbWlzY2VsbGFuZW91cyBmZWF0dXJlcworICogYXJlIGF2YWlsYWJsZSB0byB0aGUgcGFydGl0aW9uLgorICovCisvKiBUaGUgTVdBSVQgaW5zdHJ1Y3Rpb24gaXMgYXZhaWxhYmxlIChwZXIgc2VjdGlvbiBNT05JVE9SIC8gTVdBSVQpICovCisjZGVmaW5lIEhWX1g2NF9NV0FJVF9BVkFJTEFCTEUJCQkJKDEgPDwgMCkKKy8qIEd1ZXN0IGRlYnVnZ2luZyBzdXBwb3J0IGlzIGF2YWlsYWJsZSAqLworI2RlZmluZSBIVl9YNjRfR1VFU1RfREVCVUdHSU5HX0FWQUlMQUJMRQkJKDEgPDwgMSkKKy8qIFBlcmZvcm1hbmNlIE1vbml0b3Igc3VwcG9ydCBpcyBhdmFpbGFibGUqLworI2RlZmluZSBIVl9YNjRfUEVSRl9NT05JVE9SX0FWQUlMQUJMRQkJCSgxIDw8IDIpCisvKiBTdXBwb3J0IGZvciBwaHlzaWNhbCBDUFUgZHluYW1pYyBwYXJ0aXRpb25pbmcgZXZlbnRzIGlzIGF2YWlsYWJsZSovCisjZGVmaW5lIEhWX1g2NF9DUFVfRFlOQU1JQ19QQVJUSVRJT05JTkdfQVZBSUxBQkxFCSgxIDw8IDMpCisvKgorICogU3VwcG9ydCBmb3IgcGFzc2luZyBoeXBlcmNhbGwgaW5wdXQgcGFyYW1ldGVyIGJsb2NrIHZpYSBYTU0KKyAqIHJlZ2lzdGVycyBpcyBhdmFpbGFibGUKKyAqLworI2RlZmluZSBIVl9YNjRfSFlQRVJDQUxMX1BBUkFNU19YTU1fQVZBSUxBQkxFCQkoMSA8PCA0KQorLyogU3VwcG9ydCBmb3IgYSB2aXJ0dWFsIGd1ZXN0IGlkbGUgc3RhdGUgaXMgYXZhaWxhYmxlICovCisjZGVmaW5lIEhWX1g2NF9HVUVTVF9JRExFX1NUQVRFX0FWQUlMQUJMRQkJKDEgPDwgNSkKKworLyoKKyAqIEltcGxlbWVudGF0aW9uIHJlY29tbWVuZGF0aW9ucy4gSW5kaWNhdGVzIHdoaWNoIGJlaGF2aW9ycyB0aGUgaHlwZXJ2aXNvcgorICogcmVjb21tZW5kcyB0aGUgT1MgaW1wbGVtZW50IGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlLgorICovCisgLyoKKyAgKiBSZWNvbW1lbmQgdXNpbmcgaHlwZXJjYWxsIGZvciBhZGRyZXNzIHNwYWNlIHN3aXRjaGVzIHJhdGhlcgorICAqIHRoYW4gTU9WIHRvIENSMyBpbnN0cnVjdGlvbgorICAqLworI2RlZmluZSBIVl9YNjRfTVdBSVRfUkVDT01NRU5ERUQJCSgxIDw8IDApCisvKiBSZWNvbW1lbmQgdXNpbmcgaHlwZXJjYWxsIGZvciBsb2NhbCBUTEIgZmx1c2hlcyByYXRoZXIKKyAqIHRoYW4gSU5WTFBHIG9yIE1PViB0byBDUjMgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIEhWX1g2NF9MT0NBTF9UTEJfRkxVU0hfUkVDT01NRU5ERUQJKDEgPDwgMSkKKy8qCisgKiBSZWNvbW1lbmQgdXNpbmcgaHlwZXJjYWxsIGZvciByZW1vdGUgVExCIGZsdXNoZXMgcmF0aGVyCisgKiB0aGFuIGludGVyLXByb2Nlc3NvciBpbnRlcnJ1cHRzCisgKi8KKyNkZWZpbmUgSFZfWDY0X1JFTU9URV9UTEJfRkxVU0hfUkVDT01NRU5ERUQJKDEgPDwgMikKKy8qCisgKiBSZWNvbW1lbmQgdXNpbmcgTVNScyBmb3IgYWNjZXNzaW5nIEFQSUMgcmVnaXN0ZXJzCisgKiBFT0ksIElDUiBhbmQgVFBSIHJhdGhlciB0aGFuIHRoZWlyIG1lbW9yeS1tYXBwZWQgY291bnRlcnBhcnRzCisgKi8KKyNkZWZpbmUgSFZfWDY0X0FQSUNfQUNDRVNTX1JFQ09NTUVOREVECQkoMSA8PCAzKQorLyogUmVjb21tZW5kIHVzaW5nIHRoZSBoeXBlcnZpc29yLXByb3ZpZGVkIE1TUiB0byBpbml0aWF0ZSBhIHN5c3RlbSBSRVNFVCAqLworI2RlZmluZSBIVl9YNjRfU1lTVEVNX1JFU0VUX1JFQ09NTUVOREVECQkoMSA8PCA0KQorLyoKKyAqIFJlY29tbWVuZCB1c2luZyByZWxheGVkIHRpbWluZyBmb3IgdGhpcyBwYXJ0aXRpb24uIElmIHVzZWQsCisgKiB0aGUgVk0gc2hvdWxkIGRpc2FibGUgYW55IHdhdGNoZG9nIHRpbWVvdXRzIHRoYXQgcmVseSBvbiB0aGUKKyAqIHRpbWVseSBkZWxpdmVyeSBvZiBleHRlcm5hbCBpbnRlcnJ1cHRzCisgKi8KKyNkZWZpbmUgSFZfWDY0X1JFTEFYRURfVElNSU5HX1JFQ09NTUVOREVECSgxIDw8IDUpCisKKy8qIE1TUiB1c2VkIHRvIGlkZW50aWZ5IHRoZSBndWVzdCBPUy4gKi8KKyNkZWZpbmUgSFZfWDY0X01TUl9HVUVTVF9PU19JRAkJCTB4NDAwMDAwMDAKKworLyogTVNSIHVzZWQgdG8gc2V0dXAgcGFnZXMgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBoeXBlcnZpc29yLiAqLworI2RlZmluZSBIVl9YNjRfTVNSX0hZUEVSQ0FMTAkJCTB4NDAwMDAwMDEKKworLyogTVNSIHVzZWQgdG8gcHJvdmlkZSB2Y3B1IGluZGV4ICovCisjZGVmaW5lIEhWX1g2NF9NU1JfVlBfSU5ERVgJCQkweDQwMDAwMDAyCisKKy8qIE1TUiB1c2VkIHRvIHJlYWQgdGhlIHBlci1wYXJ0aXRpb24gdGltZSByZWZlcmVuY2UgY291bnRlciAqLworI2RlZmluZSBIVl9YNjRfTVNSX1RJTUVfUkVGX0NPVU5UCQkweDQwMDAwMDIwCisKKy8qIERlZmluZSB0aGUgdmlydHVhbCBBUElDIHJlZ2lzdGVycyAqLworI2RlZmluZSBIVl9YNjRfTVNSX0VPSQkJCQkweDQwMDAwMDcwCisjZGVmaW5lIEhWX1g2NF9NU1JfSUNSCQkJCTB4NDAwMDAwNzEKKyNkZWZpbmUgSFZfWDY0X01TUl9UUFIJCQkJMHg0MDAwMDA3MgorI2RlZmluZSBIVl9YNjRfTVNSX0FQSUNfQVNTSVNUX1BBR0UJCTB4NDAwMDAwNzMKKworLyogRGVmaW5lIHN5bnRoZXRpYyBpbnRlcnJ1cHQgY29udHJvbGxlciBtb2RlbCBzcGVjaWZpYyByZWdpc3RlcnMuICovCisjZGVmaW5lIEhWX1g2NF9NU1JfU0NPTlRST0wJCQkweDQwMDAwMDgwCisjZGVmaW5lIEhWX1g2NF9NU1JfU1ZFUlNJT04JCQkweDQwMDAwMDgxCisjZGVmaW5lIEhWX1g2NF9NU1JfU0lFRlAJCQkweDQwMDAwMDgyCisjZGVmaW5lIEhWX1g2NF9NU1JfU0lNUAkJCQkweDQwMDAwMDgzCisjZGVmaW5lIEhWX1g2NF9NU1JfRU9NCQkJCTB4NDAwMDAwODQKKyNkZWZpbmUgSFZfWDY0X01TUl9TSU5UMAkJCTB4NDAwMDAwOTAKKyNkZWZpbmUgSFZfWDY0X01TUl9TSU5UMQkJCTB4NDAwMDAwOTEKKyNkZWZpbmUgSFZfWDY0X01TUl9TSU5UMgkJCTB4NDAwMDAwOTIKKyNkZWZpbmUgSFZfWDY0X01TUl9TSU5UMwkJCTB4NDAwMDAwOTMKKyNkZWZpbmUgSFZfWDY0X01TUl9TSU5UNAkJCTB4NDAwMDAwOTQKKyNkZWZpbmUgSFZfWDY0X01TUl9TSU5UNQkJCTB4NDAwMDAwOTUKKyNkZWZpbmUgSFZfWDY0X01TUl9TSU5UNgkJCTB4NDAwMDAwOTYKKyNkZWZpbmUgSFZfWDY0X01TUl9TSU5UNwkJCTB4NDAwMDAwOTcKKyNkZWZpbmUgSFZfWDY0X01TUl9TSU5UOAkJCTB4NDAwMDAwOTgKKyNkZWZpbmUgSFZfWDY0X01TUl9TSU5UOQkJCTB4NDAwMDAwOTkKKyNkZWZpbmUgSFZfWDY0X01TUl9TSU5UMTAJCQkweDQwMDAwMDlBCisjZGVmaW5lIEhWX1g2NF9NU1JfU0lOVDExCQkJMHg0MDAwMDA5QgorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQxMgkJCTB4NDAwMDAwOUMKKyNkZWZpbmUgSFZfWDY0X01TUl9TSU5UMTMJCQkweDQwMDAwMDlECisjZGVmaW5lIEhWX1g2NF9NU1JfU0lOVDE0CQkJMHg0MDAwMDA5RQorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQxNQkJCTB4NDAwMDAwOUYKKworCisjZGVmaW5lIEhWX1g2NF9NU1JfSFlQRVJDQUxMX0VOQUJMRQkJMHgwMDAwMDAwMQorI2RlZmluZSBIVl9YNjRfTVNSX0hZUEVSQ0FMTF9QQUdFX0FERFJFU1NfU0hJRlQJMTIKKyNkZWZpbmUgSFZfWDY0X01TUl9IWVBFUkNBTExfUEFHRV9BRERSRVNTX01BU0sJXAorCQkofigoMXVsbCA8PCBIVl9YNjRfTVNSX0hZUEVSQ0FMTF9QQUdFX0FERFJFU1NfU0hJRlQpIC0gMSkpCisKKy8qIERlY2xhcmUgdGhlIHZhcmlvdXMgaHlwZXJjYWxsIG9wZXJhdGlvbnMuICovCisjZGVmaW5lIEhWX1g2NF9IVl9OT1RJRllfTE9OR19TUElOX1dBSVQJCTB4MDAwOAorCisjZGVmaW5lIEhWX1g2NF9NU1JfQVBJQ19BU1NJU1RfUEFHRV9FTkFCTEUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgSFZfWDY0X01TUl9BUElDX0FTU0lTVF9QQUdFX0FERFJFU1NfU0hJRlQJMTIKKyNkZWZpbmUgSFZfWDY0X01TUl9BUElDX0FTU0lTVF9QQUdFX0FERFJFU1NfTUFTSwlcCisJCSh+KCgxdWxsIDw8IEhWX1g2NF9NU1JfQVBJQ19BU1NJU1RfUEFHRV9BRERSRVNTX1NISUZUKSAtIDEpKQorCisjZGVmaW5lIEhWX1BST0NFU1NPUl9QT1dFUl9TVEFURV9DMAkJMAorI2RlZmluZSBIVl9QUk9DRVNTT1JfUE9XRVJfU1RBVEVfQzEJCTEKKyNkZWZpbmUgSFZfUFJPQ0VTU09SX1BPV0VSX1NUQVRFX0MyCQkyCisjZGVmaW5lIEhWX1BST0NFU1NPUl9QT1dFUl9TVEFURV9DMwkJMworCisvKiBoeXBlcmNhbGwgc3RhdHVzIGNvZGUgKi8KKyNkZWZpbmUgSFZfU1RBVFVTX1NVQ0NFU1MJCQkwCisjZGVmaW5lIEhWX1NUQVRVU19JTlZBTElEX0hZUEVSQ0FMTF9DT0RFCTIKKyNkZWZpbmUgSFZfU1RBVFVTX0lOVkFMSURfSFlQRVJDQUxMX0lOUFVUCTMKKyNkZWZpbmUgSFZfU1RBVFVTX0lOVkFMSURfQUxJR05NRU5UCQk0CisjZGVmaW5lIEhWX1NUQVRVU19JTlNVRkZJQ0lFTlRfQlVGRkVSUwkJMTkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9pb2N0bC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjc5ZmUwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vaW9jdGwuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW9jdGwuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2lvY3Rscy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vaW9jdGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMzNGM3NgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2lvY3Rscy5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pb2N0bHMuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2lwY2J1Zi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vaXBjYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjN2U1MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2lwY2J1Zi5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pcGNidWYuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2lzdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUxNTY0YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2lzdC5oCkBAIC0wLDAgKzEsMjkgQEAKKyNpZm5kZWYgX0FTTV9YODZfSVNUX0gKKyNkZWZpbmUgX0FTTV9YODZfSVNUX0gKKworLyoKKyAqIEluY2x1ZGUgZmlsZSBmb3IgdGhlIGludGVyZmFjZSB0byBJU1QgQklPUworICogQ29weXJpZ2h0IDIwMDIgQW5keSBHcm92ZXIgPGFuZHJldy5ncm92ZXJAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgaXN0X2luZm8geworCV9fdTMyIHNpZ25hdHVyZTsKKwlfX3UzMiBjb21tYW5kOworCV9fdTMyIGV2ZW50OworCV9fdTMyIHBlcmZfbGV2ZWw7Cit9OworCisjZW5kaWYgLyogX0FTTV9YODZfSVNUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2t2bS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20va3ZtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4ZGNiZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2t2bS5oCkBAIC0wLDAgKzEsMzI0IEBACisjaWZuZGVmIF9BU01fWDg2X0tWTV9ICisjZGVmaW5lIF9BU01fWDg2X0tWTV9ICisKKy8qCisgKiBLVk0geDg2IHNwZWNpZmljIHN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKy8qIFNlbGVjdCB4ODYgc3BlY2lmaWMgZmVhdHVyZXMgaW4gPGxpbnV4L2t2bS5oPiAqLworI2RlZmluZSBfX0tWTV9IQVZFX1BJVAorI2RlZmluZSBfX0tWTV9IQVZFX0lPQVBJQworI2RlZmluZSBfX0tWTV9IQVZFX0RFVklDRV9BU1NJR05NRU5UCisjZGVmaW5lIF9fS1ZNX0hBVkVfTVNJCisjZGVmaW5lIF9fS1ZNX0hBVkVfVVNFUl9OTUkKKyNkZWZpbmUgX19LVk1fSEFWRV9HVUVTVF9ERUJVRworI2RlZmluZSBfX0tWTV9IQVZFX01TSVgKKyNkZWZpbmUgX19LVk1fSEFWRV9NQ0UKKyNkZWZpbmUgX19LVk1fSEFWRV9QSVRfU1RBVEUyCisjZGVmaW5lIF9fS1ZNX0hBVkVfWEVOX0hWTQorI2RlZmluZSBfX0tWTV9IQVZFX1ZDUFVfRVZFTlRTCisjZGVmaW5lIF9fS1ZNX0hBVkVfREVCVUdSRUdTCisjZGVmaW5lIF9fS1ZNX0hBVkVfWFNBVkUKKyNkZWZpbmUgX19LVk1fSEFWRV9YQ1JTCisKKy8qIEFyY2hpdGVjdHVyYWwgaW50ZXJydXB0IGxpbmUgY291bnQuICovCisjZGVmaW5lIEtWTV9OUl9JTlRFUlJVUFRTIDI1NgorCitzdHJ1Y3Qga3ZtX21lbW9yeV9hbGlhcyB7CisJX191MzIgc2xvdDsgIC8qIHRoaXMgaGFzIGEgZGlmZmVyZW50IG5hbWVzcGFjZSB0aGFuIG1lbW9yeSBzbG90cyAqLworCV9fdTMyIGZsYWdzOworCV9fdTY0IGd1ZXN0X3BoeXNfYWRkcjsKKwlfX3U2NCBtZW1vcnlfc2l6ZTsKKwlfX3U2NCB0YXJnZXRfcGh5c19hZGRyOworfTsKKworLyogZm9yIEtWTV9HRVRfSVJRQ0hJUCBhbmQgS1ZNX1NFVF9JUlFDSElQICovCitzdHJ1Y3Qga3ZtX3BpY19zdGF0ZSB7CisJX191OCBsYXN0X2lycjsJLyogZWRnZSBkZXRlY3Rpb24gKi8KKwlfX3U4IGlycjsJCS8qIGludGVycnVwdCByZXF1ZXN0IHJlZ2lzdGVyICovCisJX191OCBpbXI7CQkvKiBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworCV9fdTggaXNyOwkJLyogaW50ZXJydXB0IHNlcnZpY2UgcmVnaXN0ZXIgKi8KKwlfX3U4IHByaW9yaXR5X2FkZDsJLyogaGlnaGVzdCBpcnEgcHJpb3JpdHkgKi8KKwlfX3U4IGlycV9iYXNlOworCV9fdTggcmVhZF9yZWdfc2VsZWN0OworCV9fdTggcG9sbDsKKwlfX3U4IHNwZWNpYWxfbWFzazsKKwlfX3U4IGluaXRfc3RhdGU7CisJX191OCBhdXRvX2VvaTsKKwlfX3U4IHJvdGF0ZV9vbl9hdXRvX2VvaTsKKwlfX3U4IHNwZWNpYWxfZnVsbHlfbmVzdGVkX21vZGU7CisJX191OCBpbml0NDsJCS8qIHRydWUgaWYgNCBieXRlIGluaXQgKi8KKwlfX3U4IGVsY3I7CQkvKiBQSUlYIGVkZ2UvdHJpZ2dlciBzZWxlY3Rpb24gKi8KKwlfX3U4IGVsY3JfbWFzazsKK307CisKKyNkZWZpbmUgS1ZNX0lPQVBJQ19OVU1fUElOUyAgMjQKK3N0cnVjdCBrdm1faW9hcGljX3N0YXRlIHsKKwlfX3U2NCBiYXNlX2FkZHJlc3M7CisJX191MzIgaW9yZWdzZWw7CisJX191MzIgaWQ7CisJX191MzIgaXJyOworCV9fdTMyIHBhZDsKKwl1bmlvbiB7CisJCV9fdTY0IGJpdHM7CisJCXN0cnVjdCB7CisJCQlfX3U4IHZlY3RvcjsKKwkJCV9fdTggZGVsaXZlcnlfbW9kZTozOworCQkJX191OCBkZXN0X21vZGU6MTsKKwkJCV9fdTggZGVsaXZlcnlfc3RhdHVzOjE7CisJCQlfX3U4IHBvbGFyaXR5OjE7CisJCQlfX3U4IHJlbW90ZV9pcnI6MTsKKwkJCV9fdTggdHJpZ19tb2RlOjE7CisJCQlfX3U4IG1hc2s6MTsKKwkJCV9fdTggcmVzZXJ2ZTo3OworCQkJX191OCByZXNlcnZlZFs0XTsKKwkJCV9fdTggZGVzdF9pZDsKKwkJfSBmaWVsZHM7CisJfSByZWRpcnRibFtLVk1fSU9BUElDX05VTV9QSU5TXTsKK307CisKKyNkZWZpbmUgS1ZNX0lSUUNISVBfUElDX01BU1RFUiAgIDAKKyNkZWZpbmUgS1ZNX0lSUUNISVBfUElDX1NMQVZFICAgIDEKKyNkZWZpbmUgS1ZNX0lSUUNISVBfSU9BUElDICAgICAgIDIKKyNkZWZpbmUgS1ZNX05SX0lSUUNISVBTICAgICAgICAgIDMKKworLyogZm9yIEtWTV9HRVRfUkVHUyBhbmQgS1ZNX1NFVF9SRUdTICovCitzdHJ1Y3Qga3ZtX3JlZ3MgeworCS8qIG91dCAoS1ZNX0dFVF9SRUdTKSAvIGluIChLVk1fU0VUX1JFR1MpICovCisJX191NjQgcmF4LCByYngsIHJjeCwgcmR4OworCV9fdTY0IHJzaSwgcmRpLCByc3AsIHJicDsKKwlfX3U2NCByOCwgIHI5LCAgcjEwLCByMTE7CisJX191NjQgcjEyLCByMTMsIHIxNCwgcjE1OworCV9fdTY0IHJpcCwgcmZsYWdzOworfTsKKworLyogZm9yIEtWTV9HRVRfTEFQSUMgYW5kIEtWTV9TRVRfTEFQSUMgKi8KKyNkZWZpbmUgS1ZNX0FQSUNfUkVHX1NJWkUgMHg0MDAKK3N0cnVjdCBrdm1fbGFwaWNfc3RhdGUgeworCWNoYXIgcmVnc1tLVk1fQVBJQ19SRUdfU0laRV07Cit9OworCitzdHJ1Y3Qga3ZtX3NlZ21lbnQgeworCV9fdTY0IGJhc2U7CisJX191MzIgbGltaXQ7CisJX191MTYgc2VsZWN0b3I7CisJX191OCAgdHlwZTsKKwlfX3U4ICBwcmVzZW50LCBkcGwsIGRiLCBzLCBsLCBnLCBhdmw7CisJX191OCAgdW51c2FibGU7CisJX191OCAgcGFkZGluZzsKK307CisKK3N0cnVjdCBrdm1fZHRhYmxlIHsKKwlfX3U2NCBiYXNlOworCV9fdTE2IGxpbWl0OworCV9fdTE2IHBhZGRpbmdbM107Cit9OworCisKKy8qIGZvciBLVk1fR0VUX1NSRUdTIGFuZCBLVk1fU0VUX1NSRUdTICovCitzdHJ1Y3Qga3ZtX3NyZWdzIHsKKwkvKiBvdXQgKEtWTV9HRVRfU1JFR1MpIC8gaW4gKEtWTV9TRVRfU1JFR1MpICovCisJc3RydWN0IGt2bV9zZWdtZW50IGNzLCBkcywgZXMsIGZzLCBncywgc3M7CisJc3RydWN0IGt2bV9zZWdtZW50IHRyLCBsZHQ7CisJc3RydWN0IGt2bV9kdGFibGUgZ2R0LCBpZHQ7CisJX191NjQgY3IwLCBjcjIsIGNyMywgY3I0LCBjcjg7CisJX191NjQgZWZlcjsKKwlfX3U2NCBhcGljX2Jhc2U7CisJX191NjQgaW50ZXJydXB0X2JpdG1hcFsoS1ZNX05SX0lOVEVSUlVQVFMgKyA2MykgLyA2NF07Cit9OworCisvKiBmb3IgS1ZNX0dFVF9GUFUgYW5kIEtWTV9TRVRfRlBVICovCitzdHJ1Y3Qga3ZtX2ZwdSB7CisJX191OCAgZnByWzhdWzE2XTsKKwlfX3UxNiBmY3c7CisJX191MTYgZnN3OworCV9fdTggIGZ0d3g7ICAvKiBpbiBmeHNhdmUgZm9ybWF0ICovCisJX191OCAgcGFkMTsKKwlfX3UxNiBsYXN0X29wY29kZTsKKwlfX3U2NCBsYXN0X2lwOworCV9fdTY0IGxhc3RfZHA7CisJX191OCAgeG1tWzE2XVsxNl07CisJX191MzIgbXhjc3I7CisJX191MzIgcGFkMjsKK307CisKK3N0cnVjdCBrdm1fbXNyX2VudHJ5IHsKKwlfX3UzMiBpbmRleDsKKwlfX3UzMiByZXNlcnZlZDsKKwlfX3U2NCBkYXRhOworfTsKKworLyogZm9yIEtWTV9HRVRfTVNSUyBhbmQgS1ZNX1NFVF9NU1JTICovCitzdHJ1Y3Qga3ZtX21zcnMgeworCV9fdTMyIG5tc3JzOyAvKiBudW1iZXIgb2YgbXNycyBpbiBlbnRyaWVzICovCisJX191MzIgcGFkOworCisJc3RydWN0IGt2bV9tc3JfZW50cnkgZW50cmllc1swXTsKK307CisKKy8qIGZvciBLVk1fR0VUX01TUl9JTkRFWF9MSVNUICovCitzdHJ1Y3Qga3ZtX21zcl9saXN0IHsKKwlfX3UzMiBubXNyczsgLyogbnVtYmVyIG9mIG1zcnMgaW4gZW50cmllcyAqLworCV9fdTMyIGluZGljZXNbMF07Cit9OworCisKK3N0cnVjdCBrdm1fY3B1aWRfZW50cnkgeworCV9fdTMyIGZ1bmN0aW9uOworCV9fdTMyIGVheDsKKwlfX3UzMiBlYng7CisJX191MzIgZWN4OworCV9fdTMyIGVkeDsKKwlfX3UzMiBwYWRkaW5nOworfTsKKworLyogZm9yIEtWTV9TRVRfQ1BVSUQgKi8KK3N0cnVjdCBrdm1fY3B1aWQgeworCV9fdTMyIG5lbnQ7CisJX191MzIgcGFkZGluZzsKKwlzdHJ1Y3Qga3ZtX2NwdWlkX2VudHJ5IGVudHJpZXNbMF07Cit9OworCitzdHJ1Y3Qga3ZtX2NwdWlkX2VudHJ5MiB7CisJX191MzIgZnVuY3Rpb247CisJX191MzIgaW5kZXg7CisJX191MzIgZmxhZ3M7CisJX191MzIgZWF4OworCV9fdTMyIGVieDsKKwlfX3UzMiBlY3g7CisJX191MzIgZWR4OworCV9fdTMyIHBhZGRpbmdbM107Cit9OworCisjZGVmaW5lIEtWTV9DUFVJRF9GTEFHX1NJR05JRkNBTlRfSU5ERVggMQorI2RlZmluZSBLVk1fQ1BVSURfRkxBR19TVEFURUZVTF9GVU5DICAgIDIKKyNkZWZpbmUgS1ZNX0NQVUlEX0ZMQUdfU1RBVEVfUkVBRF9ORVhUICA0CisKKy8qIGZvciBLVk1fU0VUX0NQVUlEMiAqLworc3RydWN0IGt2bV9jcHVpZDIgeworCV9fdTMyIG5lbnQ7CisJX191MzIgcGFkZGluZzsKKwlzdHJ1Y3Qga3ZtX2NwdWlkX2VudHJ5MiBlbnRyaWVzWzBdOworfTsKKworLyogZm9yIEtWTV9HRVRfUElUIGFuZCBLVk1fU0VUX1BJVCAqLworc3RydWN0IGt2bV9waXRfY2hhbm5lbF9zdGF0ZSB7CisJX191MzIgY291bnQ7IC8qIGNhbiBiZSA2NTUzNiAqLworCV9fdTE2IGxhdGNoZWRfY291bnQ7CisJX191OCBjb3VudF9sYXRjaGVkOworCV9fdTggc3RhdHVzX2xhdGNoZWQ7CisJX191OCBzdGF0dXM7CisJX191OCByZWFkX3N0YXRlOworCV9fdTggd3JpdGVfc3RhdGU7CisJX191OCB3cml0ZV9sYXRjaDsKKwlfX3U4IHJ3X21vZGU7CisJX191OCBtb2RlOworCV9fdTggYmNkOworCV9fdTggZ2F0ZTsKKwlfX3M2NCBjb3VudF9sb2FkX3RpbWU7Cit9OworCitzdHJ1Y3Qga3ZtX2RlYnVnX2V4aXRfYXJjaCB7CisJX191MzIgZXhjZXB0aW9uOworCV9fdTMyIHBhZDsKKwlfX3U2NCBwYzsKKwlfX3U2NCBkcjY7CisJX191NjQgZHI3OworfTsKKworI2RlZmluZSBLVk1fR1VFU1REQkdfVVNFX1NXX0JQCQkweDAwMDEwMDAwCisjZGVmaW5lIEtWTV9HVUVTVERCR19VU0VfSFdfQlAJCTB4MDAwMjAwMDAKKyNkZWZpbmUgS1ZNX0dVRVNUREJHX0lOSkVDVF9EQgkJMHgwMDA0MDAwMAorI2RlZmluZSBLVk1fR1VFU1REQkdfSU5KRUNUX0JQCQkweDAwMDgwMDAwCisKKy8qIGZvciBLVk1fU0VUX0dVRVNUX0RFQlVHICovCitzdHJ1Y3Qga3ZtX2d1ZXN0X2RlYnVnX2FyY2ggeworCV9fdTY0IGRlYnVncmVnWzhdOworfTsKKworc3RydWN0IGt2bV9waXRfc3RhdGUgeworCXN0cnVjdCBrdm1fcGl0X2NoYW5uZWxfc3RhdGUgY2hhbm5lbHNbM107Cit9OworCisjZGVmaW5lIEtWTV9QSVRfRkxBR1NfSFBFVF9MRUdBQ1kgIDB4MDAwMDAwMDEKKworc3RydWN0IGt2bV9waXRfc3RhdGUyIHsKKwlzdHJ1Y3Qga3ZtX3BpdF9jaGFubmVsX3N0YXRlIGNoYW5uZWxzWzNdOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHJlc2VydmVkWzldOworfTsKKworc3RydWN0IGt2bV9yZWluamVjdF9jb250cm9sIHsKKwlfX3U4IHBpdF9yZWluamVjdDsKKwlfX3U4IHJlc2VydmVkWzMxXTsKK307CisKKy8qIFdoZW4gc2V0IGluIGZsYWdzLCBpbmNsdWRlIGNvcnJlc3BvbmRpbmcgZmllbGRzIG9uIEtWTV9TRVRfVkNQVV9FVkVOVFMgKi8KKyNkZWZpbmUgS1ZNX1ZDUFVFVkVOVF9WQUxJRF9OTUlfUEVORElORwkweDAwMDAwMDAxCisjZGVmaW5lIEtWTV9WQ1BVRVZFTlRfVkFMSURfU0lQSV9WRUNUT1IJMHgwMDAwMDAwMgorI2RlZmluZSBLVk1fVkNQVUVWRU5UX1ZBTElEX1NIQURPVwkweDAwMDAwMDA0CisKKy8qIEludGVycnVwdCBzaGFkb3cgc3RhdGVzICovCisjZGVmaW5lIEtWTV9YODZfU0hBRE9XX0lOVF9NT1ZfU1MJMHgwMQorI2RlZmluZSBLVk1fWDg2X1NIQURPV19JTlRfU1RJCQkweDAyCisKKy8qIGZvciBLVk1fR0VUL1NFVF9WQ1BVX0VWRU5UUyAqLworc3RydWN0IGt2bV92Y3B1X2V2ZW50cyB7CisJc3RydWN0IHsKKwkJX191OCBpbmplY3RlZDsKKwkJX191OCBucjsKKwkJX191OCBoYXNfZXJyb3JfY29kZTsKKwkJX191OCBwYWQ7CisJCV9fdTMyIGVycm9yX2NvZGU7CisJfSBleGNlcHRpb247CisJc3RydWN0IHsKKwkJX191OCBpbmplY3RlZDsKKwkJX191OCBucjsKKwkJX191OCBzb2Z0OworCQlfX3U4IHNoYWRvdzsKKwl9IGludGVycnVwdDsKKwlzdHJ1Y3QgeworCQlfX3U4IGluamVjdGVkOworCQlfX3U4IHBlbmRpbmc7CisJCV9fdTggbWFza2VkOworCQlfX3U4IHBhZDsKKwl9IG5taTsKKwlfX3UzMiBzaXBpX3ZlY3RvcjsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiByZXNlcnZlZFsxMF07Cit9OworCisvKiBmb3IgS1ZNX0dFVC9TRVRfREVCVUdSRUdTICovCitzdHJ1Y3Qga3ZtX2RlYnVncmVncyB7CisJX191NjQgZGJbNF07CisJX191NjQgZHI2OworCV9fdTY0IGRyNzsKKwlfX3U2NCBmbGFnczsKKwlfX3U2NCByZXNlcnZlZFs5XTsKK307CisKKy8qIGZvciBLVk1fQ0FQX1hTQVZFICovCitzdHJ1Y3Qga3ZtX3hzYXZlIHsKKwlfX3UzMiByZWdpb25bMTAyNF07Cit9OworCisjZGVmaW5lIEtWTV9NQVhfWENSUwkxNgorCitzdHJ1Y3Qga3ZtX3hjciB7CisJX191MzIgeGNyOworCV9fdTMyIHJlc2VydmVkOworCV9fdTY0IHZhbHVlOworfTsKKworc3RydWN0IGt2bV94Y3JzIHsKKwlfX3UzMiBucl94Y3JzOworCV9fdTMyIGZsYWdzOworCXN0cnVjdCBrdm1feGNyIHhjcnNbS1ZNX01BWF9YQ1JTXTsKKwlfX3U2NCBwYWRkaW5nWzE2XTsKK307CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9LVk1fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20va3ZtX3BhcmEuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2t2bV9wYXJhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJhYzQ2YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2t2bV9wYXJhLmgKQEAgLTAsMCArMSw5MyBAQAorI2lmbmRlZiBfQVNNX1g4Nl9LVk1fUEFSQV9ICisjZGVmaW5lIF9BU01fWDg2X0tWTV9QQVJBX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2h5cGVydi5oPgorCisvKiBUaGlzIENQVUlEIHJldHVybnMgdGhlIHNpZ25hdHVyZSAnS1ZNS1ZNS1ZNJyBpbiBlYngsIGVjeCwgYW5kIGVkeC4gIEl0CisgKiBzaG91bGQgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhhdCBhIFZNIGlzIHJ1bm5pbmcgdW5kZXIgS1ZNLgorICovCisjZGVmaW5lIEtWTV9DUFVJRF9TSUdOQVRVUkUJMHg0MDAwMDAwMAorCisvKiBUaGlzIENQVUlEIHJldHVybnMgYSBmZWF0dXJlIGJpdG1hcCBpbiBlYXguICBCZWZvcmUgZW5hYmxpbmcgYSBwYXJ0aWN1bGFyCisgKiBwYXJhdmlydHVhbGl6YXRpb24sIHRoZSBhcHByb3ByaWF0ZSBmZWF0dXJlIGJpdCBzaG91bGQgYmUgY2hlY2tlZC4KKyAqLworI2RlZmluZSBLVk1fQ1BVSURfRkVBVFVSRVMJMHg0MDAwMDAwMQorI2RlZmluZSBLVk1fRkVBVFVSRV9DTE9DS1NPVVJDRQkJMAorI2RlZmluZSBLVk1fRkVBVFVSRV9OT1BfSU9fREVMQVkJMQorI2RlZmluZSBLVk1fRkVBVFVSRV9NTVVfT1AJCTIKKy8qIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIG5ldyBzZXQgb2Yga3ZtY2xvY2sgbXNycworICogYXJlIGF2YWlsYWJsZS4gVGhlIHVzZSBvZiAweDExIGFuZCAweDEyIGlzIGRlcHJlY2F0ZWQKKyAqLworI2RlZmluZSBLVk1fRkVBVFVSRV9DTE9DS1NPVVJDRTIgICAgICAgIDMKKyNkZWZpbmUgS1ZNX0ZFQVRVUkVfQVNZTkNfUEYJCTQKKyNkZWZpbmUgS1ZNX0ZFQVRVUkVfU1RFQUxfVElNRQkJNQorCisvKiBUaGUgbGFzdCA4IGJpdHMgYXJlIHVzZWQgdG8gaW5kaWNhdGUgaG93IHRvIGludGVycHJldCB0aGUgZmxhZ3MgZmllbGQKKyAqIGluIHB2Y2xvY2sgc3RydWN0dXJlLiBJZiBubyBiaXRzIGFyZSBzZXQsIGFsbCBmbGFncyBhcmUgaWdub3JlZC4KKyAqLworI2RlZmluZSBLVk1fRkVBVFVSRV9DTE9DS1NPVVJDRV9TVEFCTEVfQklUCTI0CisKKyNkZWZpbmUgTVNSX0tWTV9XQUxMX0NMT0NLICAweDExCisjZGVmaW5lIE1TUl9LVk1fU1lTVEVNX1RJTUUgMHgxMgorCisjZGVmaW5lIEtWTV9NU1JfRU5BQkxFRCAxCisvKiBDdXN0b20gTVNScyBmYWxscyBpbiB0aGUgcmFuZ2UgMHg0YjU2NGQwMC0weDRiNTY0ZGZmICovCisjZGVmaW5lIE1TUl9LVk1fV0FMTF9DTE9DS19ORVcgIDB4NGI1NjRkMDAKKyNkZWZpbmUgTVNSX0tWTV9TWVNURU1fVElNRV9ORVcgMHg0YjU2NGQwMQorI2RlZmluZSBNU1JfS1ZNX0FTWU5DX1BGX0VOIDB4NGI1NjRkMDIKKyNkZWZpbmUgTVNSX0tWTV9TVEVBTF9USU1FICAweDRiNTY0ZDAzCisKK3N0cnVjdCBrdm1fc3RlYWxfdGltZSB7CisJX191NjQgc3RlYWw7CisJX191MzIgdmVyc2lvbjsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBwYWRbMTJdOworfTsKKworI2RlZmluZSBLVk1fU1RFQUxfQUxJR05NRU5UX0JJVFMgNQorI2RlZmluZSBLVk1fU1RFQUxfVkFMSURfQklUUyAoKC0xVUxMIDw8IChLVk1fU1RFQUxfQUxJR05NRU5UX0JJVFMgKyAxKSkpCisjZGVmaW5lIEtWTV9TVEVBTF9SRVNFUlZFRF9NQVNLICgoKDEgPDwgS1ZNX1NURUFMX0FMSUdOTUVOVF9CSVRTKSAtIDEgKSA8PCAxKQorCisjZGVmaW5lIEtWTV9NQVhfTU1VX09QX0JBVENIICAgICAgICAgICAzMgorCisjZGVmaW5lIEtWTV9BU1lOQ19QRl9FTkFCTEVECQkJKDEgPDwgMCkKKyNkZWZpbmUgS1ZNX0FTWU5DX1BGX1NFTkRfQUxXQVlTCQkoMSA8PCAxKQorCisvKiBPcGVyYXRpb25zIGZvciBLVk1fSENfTU1VX09QICovCisjZGVmaW5lIEtWTV9NTVVfT1BfV1JJVEVfUFRFICAgICAgICAgICAgMQorI2RlZmluZSBLVk1fTU1VX09QX0ZMVVNIX1RMQgkgICAgICAgIDIKKyNkZWZpbmUgS1ZNX01NVV9PUF9SRUxFQVNFX1BUCSAgICAgICAgMworCisvKiBQYXlsb2FkIGZvciBLVk1fSENfTU1VX09QICovCitzdHJ1Y3Qga3ZtX21tdV9vcF9oZWFkZXIgeworCV9fdTMyIG9wOworCV9fdTMyIHBhZDsKK307CisKK3N0cnVjdCBrdm1fbW11X29wX3dyaXRlX3B0ZSB7CisJc3RydWN0IGt2bV9tbXVfb3BfaGVhZGVyIGhlYWRlcjsKKwlfX3U2NCBwdGVfcGh5czsKKwlfX3U2NCBwdGVfdmFsOworfTsKKworc3RydWN0IGt2bV9tbXVfb3BfZmx1c2hfdGxiIHsKKwlzdHJ1Y3Qga3ZtX21tdV9vcF9oZWFkZXIgaGVhZGVyOworfTsKKworc3RydWN0IGt2bV9tbXVfb3BfcmVsZWFzZV9wdCB7CisJc3RydWN0IGt2bV9tbXVfb3BfaGVhZGVyIGhlYWRlcjsKKwlfX3U2NCBwdF9waHlzOworfTsKKworI2RlZmluZSBLVk1fUFZfUkVBU09OX1BBR0VfTk9UX1BSRVNFTlQgMQorI2RlZmluZSBLVk1fUFZfUkVBU09OX1BBR0VfUkVBRFkgMgorCitzdHJ1Y3Qga3ZtX3ZjcHVfcHZfYXBmX2RhdGEgeworCV9fdTMyIHJlYXNvbjsKKwlfX3U4IHBhZFs2MF07CisJX191MzIgZW5hYmxlZDsKK307CisKKworI2VuZGlmIC8qIF9BU01fWDg2X0tWTV9QQVJBX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2xkdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vbGR0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3MjdlYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL2xkdC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBsZHQuaAorICoKKyAqIERlZmluaXRpb25zIG9mIHN0cnVjdHVyZXMgdXNlZCB3aXRoIHRoZSBtb2RpZnlfbGR0IHN5c3RlbSBjYWxsLgorICovCisjaWZuZGVmIF9BU01fWDg2X0xEVF9ICisjZGVmaW5lIF9BU01fWDg2X0xEVF9ICisKKy8qIE1heGltdW0gbnVtYmVyIG9mIExEVCBlbnRyaWVzIHN1cHBvcnRlZC4gKi8KKyNkZWZpbmUgTERUX0VOVFJJRVMJODE5MgorLyogVGhlIHNpemUgb2YgZWFjaCBMRFQgZW50cnkuICovCisjZGVmaW5lIExEVF9FTlRSWV9TSVpFCTgKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKy8qCisgKiBOb3RlIG9uIDY0Yml0IGJhc2UgYW5kIGxpbWl0IGlzIGlnbm9yZWQgYW5kIHlvdSBjYW5ub3Qgc2V0IERTL0VTL0NTCisgKiBub3QgdG8gdGhlIGRlZmF1bHQgdmFsdWVzIGlmIHlvdSBzdGlsbCB3YW50IHRvIGRvIHN5c2NhbGxzLiBUaGlzCisgKiBjYWxsIGlzIG1vcmUgZm9yIDMyYml0IG1vZGUgdGhlcmVmb3JlLgorICovCitzdHJ1Y3QgdXNlcl9kZXNjIHsKKwl1bnNpZ25lZCBpbnQgIGVudHJ5X251bWJlcjsKKwl1bnNpZ25lZCBpbnQgIGJhc2VfYWRkcjsKKwl1bnNpZ25lZCBpbnQgIGxpbWl0OworCXVuc2lnbmVkIGludCAgc2VnXzMyYml0OjE7CisJdW5zaWduZWQgaW50ICBjb250ZW50czoyOworCXVuc2lnbmVkIGludCAgcmVhZF9leGVjX29ubHk6MTsKKwl1bnNpZ25lZCBpbnQgIGxpbWl0X2luX3BhZ2VzOjE7CisJdW5zaWduZWQgaW50ICBzZWdfbm90X3ByZXNlbnQ6MTsKKwl1bnNpZ25lZCBpbnQgIHVzZWFibGU6MTsKKyNpZmRlZiBfX3g4Nl82NF9fCisJdW5zaWduZWQgaW50ICBsbToxOworI2VuZGlmCit9OworCisjZGVmaW5lIE1PRElGWV9MRFRfQ09OVEVOVFNfREFUQQkwCisjZGVmaW5lIE1PRElGWV9MRFRfQ09OVEVOVFNfU1RBQ0sJMQorI2RlZmluZSBNT0RJRllfTERUX0NPTlRFTlRTX0NPREUJMgorCisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworI2VuZGlmIC8qIF9BU01fWDg2X0xEVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9tY2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL21jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MGIyZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9tY2UuaApAQCAtMCwwICsxLDEyMyBAQAorI2lmbmRlZiBfQVNNX1g4Nl9NQ0VfSAorI2RlZmluZSBfQVNNX1g4Nl9NQ0VfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisKKy8qCisgKiBNYWNoaW5lIENoZWNrIHN1cHBvcnQgZm9yIHg4NgorICovCisKKy8qIE1DR19DQVAgcmVnaXN0ZXIgZGVmaW5lcyAqLworI2RlZmluZSBNQ0dfQkFOS0NOVF9NQVNLCTB4ZmYgICAgICAgICAvKiBOdW1iZXIgb2YgQmFua3MgKi8KKyNkZWZpbmUgTUNHX0NUTF9QCQkoMVVMTDw8OCkgICAgLyogTUNHX0NUTCByZWdpc3RlciBhdmFpbGFibGUgKi8KKyNkZWZpbmUgTUNHX0VYVF9QCQkoMVVMTDw8OSkgICAgLyogRXh0ZW5kZWQgcmVnaXN0ZXJzIGF2YWlsYWJsZSAqLworI2RlZmluZSBNQ0dfQ01DSV9QCQkoMVVMTDw8MTApICAgLyogQ01DSSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgTUNHX0VYVF9DTlRfTUFTSwkweGZmMDAwMCAgICAgLyogTnVtYmVyIG9mIEV4dGVuZGVkIHJlZ2lzdGVycyAqLworI2RlZmluZSBNQ0dfRVhUX0NOVF9TSElGVAkxNgorI2RlZmluZSBNQ0dfRVhUX0NOVChjKQkJKCgoYykgJiBNQ0dfRVhUX0NOVF9NQVNLKSA+PiBNQ0dfRVhUX0NOVF9TSElGVCkKKyNkZWZpbmUgTUNHX1NFUl9QCSAJKDFVTEw8PDI0KSAgIC8qIE1DQSByZWNvdmVyeS9uZXcgc3RhdHVzIGJpdHMgKi8KKworLyogTUNHX1NUQVRVUyByZWdpc3RlciBkZWZpbmVzICovCisjZGVmaW5lIE1DR19TVEFUVVNfUklQViAgKDFVTEw8PDApICAgLyogcmVzdGFydCBpcCB2YWxpZCAqLworI2RlZmluZSBNQ0dfU1RBVFVTX0VJUFYgICgxVUxMPDwxKSAgIC8qIGlwIHBvaW50cyB0byBjb3JyZWN0IGluc3RydWN0aW9uICovCisjZGVmaW5lIE1DR19TVEFUVVNfTUNJUCAgKDFVTEw8PDIpICAgLyogbWFjaGluZSBjaGVjayBpbiBwcm9ncmVzcyAqLworCisvKiBNQ2lfU1RBVFVTIHJlZ2lzdGVyIGRlZmluZXMgKi8KKyNkZWZpbmUgTUNJX1NUQVRVU19WQUwgICAoMVVMTDw8NjMpICAvKiB2YWxpZCBlcnJvciAqLworI2RlZmluZSBNQ0lfU1RBVFVTX09WRVIgICgxVUxMPDw2MikgIC8qIHByZXZpb3VzIGVycm9ycyBsb3N0ICovCisjZGVmaW5lIE1DSV9TVEFUVVNfVUMgICAgKDFVTEw8PDYxKSAgLyogdW5jb3JyZWN0ZWQgZXJyb3IgKi8KKyNkZWZpbmUgTUNJX1NUQVRVU19FTiAgICAoMVVMTDw8NjApICAvKiBlcnJvciBlbmFibGVkICovCisjZGVmaW5lIE1DSV9TVEFUVVNfTUlTQ1YgKDFVTEw8PDU5KSAgLyogbWlzYyBlcnJvciByZWcuIHZhbGlkICovCisjZGVmaW5lIE1DSV9TVEFUVVNfQUREUlYgKDFVTEw8PDU4KSAgLyogYWRkciByZWcuIHZhbGlkICovCisjZGVmaW5lIE1DSV9TVEFUVVNfUENDICAgKDFVTEw8PDU3KSAgLyogcHJvY2Vzc29yIGNvbnRleHQgY29ycnVwdCAqLworI2RlZmluZSBNQ0lfU1RBVFVTX1MJICgxVUxMPDw1NikgIC8qIFNpZ25hbGVkIG1hY2hpbmUgY2hlY2sgKi8KKyNkZWZpbmUgTUNJX1NUQVRVU19BUgkgKDFVTEw8PDU1KSAgLyogQWN0aW9uIHJlcXVpcmVkICovCisKKy8qIE1DaV9NSVNDIHJlZ2lzdGVyIGRlZmluZXMgKi8KKyNkZWZpbmUgTUNJX01JU0NfQUREUl9MU0IobSkJKChtKSAmIDB4M2YpCisjZGVmaW5lIE1DSV9NSVNDX0FERFJfTU9ERShtKQkoKChtKSA+PiA2KSAmIDcpCisjZGVmaW5lICBNQ0lfTUlTQ19BRERSX1NFR09GRgkwCS8qIHNlZ21lbnQgb2Zmc2V0ICovCisjZGVmaW5lICBNQ0lfTUlTQ19BRERSX0xJTkVBUgkxCS8qIGxpbmVhciBhZGRyZXNzICovCisjZGVmaW5lICBNQ0lfTUlTQ19BRERSX1BIWVMJMgkvKiBwaHlzaWNhbCBhZGRyZXNzICovCisjZGVmaW5lICBNQ0lfTUlTQ19BRERSX01FTQkzCS8qIG1lbW9yeSBhZGRyZXNzICovCisjZGVmaW5lICBNQ0lfTUlTQ19BRERSX0dFTkVSSUMJNwkvKiBnZW5lcmljICovCisKKy8qIENUTDIgcmVnaXN0ZXIgZGVmaW5lcyAqLworI2RlZmluZSBNQ0lfQ1RMMl9DTUNJX0VOCQkoMVVMTCA8PCAzMCkKKyNkZWZpbmUgTUNJX0NUTDJfQ01DSV9USFJFU0hPTERfTUFTSwkweDdmZmZVTEwKKworI2RlZmluZSBNQ0pfQ1RYX01BU0sJCTMKKyNkZWZpbmUgTUNKX0NUWChmbGFncykJCSgoZmxhZ3MpICYgTUNKX0NUWF9NQVNLKQorI2RlZmluZSBNQ0pfQ1RYX1JBTkRPTQkJMCAgICAvKiBpbmplY3QgY29udGV4dDogcmFuZG9tICovCisjZGVmaW5lIE1DSl9DVFhfUFJPQ0VTUwkJMSAgICAvKiBpbmplY3QgY29udGV4dDogcHJvY2VzcyAqLworI2RlZmluZSBNQ0pfQ1RYX0lSUQkJMiAgICAvKiBpbmplY3QgY29udGV4dDogSVJRICovCisjZGVmaW5lIE1DSl9OTUlfQlJPQURDQVNUCTQgICAgLyogZG8gTk1JIGJyb2FkY2FzdGluZyAqLworI2RlZmluZSBNQ0pfRVhDRVBUSU9OCQk4ICAgIC8qIHJhaXNlIGFzIGV4Y2VwdGlvbiAqLworCisvKiBGaWVsZHMgYXJlIHplcm8gd2hlbiBub3QgYXZhaWxhYmxlICovCitzdHJ1Y3QgbWNlIHsKKwlfX3U2NCBzdGF0dXM7CisJX191NjQgbWlzYzsKKwlfX3U2NCBhZGRyOworCV9fdTY0IG1jZ3N0YXR1czsKKwlfX3U2NCBpcDsKKwlfX3U2NCB0c2M7CS8qIGNwdSB0aW1lIHN0YW1wIGNvdW50ZXIgKi8KKwlfX3U2NCB0aW1lOwkvKiB3YWxsIHRpbWVfdCB3aGVuIGVycm9yIHdhcyBkZXRlY3RlZCAqLworCV9fdTggIGNwdXZlbmRvcjsJLyogY3B1IHZlbmRvciBhcyBlbmNvZGVkIGluIHN5c3RlbS5oICovCisJX191OCAgaW5qZWN0X2ZsYWdzOwkvKiBzb2Z0d2FyZSBpbmplY3QgZmxhZ3MgKi8KKwlfX3UxNiAgcGFkOworCV9fdTMyIGNwdWlkOwkvKiBDUFVJRCAxIEVBWCAqLworCV9fdTggIGNzOwkJLyogY29kZSBzZWdtZW50ICovCisJX191OCAgYmFuazsJLyogbWFjaGluZSBjaGVjayBiYW5rICovCisJX191OCAgY3B1OwkvKiBjcHUgbnVtYmVyOyBvYnNvbGV0ZTsgdXNlIGV4dGNwdSBub3cgKi8KKwlfX3U4ICBmaW5pc2hlZDsgICAvKiBlbnRyeSBpcyB2YWxpZCAqLworCV9fdTMyIGV4dGNwdTsJLyogbGludXggY3B1IG51bWJlciB0aGF0IGRldGVjdGVkIHRoZSBlcnJvciAqLworCV9fdTMyIHNvY2tldGlkOwkvKiBDUFUgc29ja2V0IElEICovCisJX191MzIgYXBpY2lkOwkvKiBDUFUgaW5pdGlhbCBhcGljIElEICovCisJX191NjQgbWNnY2FwOwkvKiBNQ0dDQVAgTVNSOiBtYWNoaW5lIGNoZWNrIGNhcGFiaWxpdGllcyBvZiBDUFUgKi8KKwlfX3U2NCBhdXgwOwkvKiBtb2RlbCBzcGVjaWZpYyAqLworCV9fdTY0IGF1eDE7CS8qIG1vZGVsIHNwZWNpZmljICovCit9OworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgYWxsIGRhdGEgcmVsYXRlZCB0byB0aGUgTUNFIGxvZy4gIEFsc28KKyAqIGNhcnJpZXMgYSBzaWduYXR1cmUgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZmluZCBmcm9tIGV4dGVybmFsCisgKiBkZWJ1Z2dpbmcgdG9vbHMuICBFYWNoIGVudHJ5IGlzIG9ubHkgdmFsaWQgd2hlbiBpdHMgZmluaXNoZWQgZmxhZworICogaXMgc2V0LgorICovCisKKyNkZWZpbmUgTUNFX0xPR19MRU4gMzIKKworc3RydWN0IG1jZV9sb2cgeworCWNoYXIgc2lnbmF0dXJlWzEyXTsgLyogIk1BQ0hJTkVDSEVDSyIgKi8KKwl1bnNpZ25lZCBsZW47CSAgICAvKiA9IE1DRV9MT0dfTEVOICovCisJdW5zaWduZWQgbmV4dDsKKwl1bnNpZ25lZCBmbGFnczsKKwl1bnNpZ25lZCByZWNvcmRsZW47CS8qIGxlbmd0aCBvZiBzdHJ1Y3QgbWNlICovCisJc3RydWN0IG1jZSBlbnRyeVtNQ0VfTE9HX0xFTl07Cit9OworCisjZGVmaW5lIE1DRV9PVkVSRkxPVyAwCQkvKiBiaXQgMCBpbiBmbGFncyBtZWFucyBvdmVyZmxvdyAqLworCisjZGVmaW5lIE1DRV9MT0dfU0lHTkFUVVJFCSJNQUNISU5FQ0hFQ0siCisKKyNkZWZpbmUgTUNFX0dFVF9SRUNPUkRfTEVOICAgX0lPUignTScsIDEsIGludCkKKyNkZWZpbmUgTUNFX0dFVF9MT0dfTEVOICAgICAgX0lPUignTScsIDIsIGludCkKKyNkZWZpbmUgTUNFX0dFVENMRUFSX0ZMQUdTICAgX0lPUignTScsIDMsIGludCkKKworLyogU29mdHdhcmUgZGVmaW5lZCBiYW5rcyAqLworI2RlZmluZSBNQ0VfRVhURU5ERURfQkFOSwkxMjgKKyNkZWZpbmUgTUNFX1RIRVJNQUxfQkFOSwlNQ0VfRVhURU5ERURfQkFOSyArIDAKKworI2RlZmluZSBLOF9NQ0VfVEhSRVNIT0xEX0JBU0UgICAgICAoTUNFX0VYVEVOREVEX0JBTksgKyAxKSAgICAgIC8qIE1DRV9BTUQgKi8KKyNkZWZpbmUgSzhfTUNFX1RIUkVTSE9MRF9CQU5LXzAgICAgKE1DRV9USFJFU0hPTERfQkFTRSArIDAgKiA5KQorI2RlZmluZSBLOF9NQ0VfVEhSRVNIT0xEX0JBTktfMSAgICAoTUNFX1RIUkVTSE9MRF9CQVNFICsgMSAqIDkpCisjZGVmaW5lIEs4X01DRV9USFJFU0hPTERfQkFOS18yICAgIChNQ0VfVEhSRVNIT0xEX0JBU0UgKyAyICogOSkKKyNkZWZpbmUgSzhfTUNFX1RIUkVTSE9MRF9CQU5LXzMgICAgKE1DRV9USFJFU0hPTERfQkFTRSArIDMgKiA5KQorI2RlZmluZSBLOF9NQ0VfVEhSRVNIT0xEX0JBTktfNCAgICAoTUNFX1RIUkVTSE9MRF9CQVNFICsgNCAqIDkpCisjZGVmaW5lIEs4X01DRV9USFJFU0hPTERfQkFOS181ICAgIChNQ0VfVEhSRVNIT0xEX0JBU0UgKyA1ICogOSkKKyNkZWZpbmUgSzhfTUNFX1RIUkVTSE9MRF9EUkFNX0VDQyAgKE1DRV9USFJFU0hPTERfQkFOS180ICsgMCkKKworCisjZW5kaWYgLyogX0FTTV9YODZfTUNFX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL21tYW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTNlNTFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9NTUFOX0gKKyNkZWZpbmUgX0FTTV9YODZfTU1BTl9ICisKKyNkZWZpbmUgTUFQXzMyQklUCTB4NDAJCS8qIG9ubHkgZ2l2ZSBvdXQgMzJiaXQgYWRkcmVzc2VzICovCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tbWFuLmg+CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9NTUFOX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL21zZ2J1Zi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vbXNnYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5MTM0YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL21zZ2J1Zi5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tc2didWYuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL21zci1pbmRleC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vbXNyLWluZGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY5NjJkOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL21zci1pbmRleC5oCkBAIC0wLDAgKzEsNDY1IEBACisjaWZuZGVmIF9BU01fWDg2X01TUl9JTkRFWF9ICisjZGVmaW5lIF9BU01fWDg2X01TUl9JTkRFWF9ICisKKy8qIENQVSBtb2RlbCBzcGVjaWZpYyByZWdpc3RlciAoTVNSKSBudW1iZXJzICovCisKKy8qIHg4Ni02NCBzcGVjaWZpYyBNU1JzICovCisjZGVmaW5lIE1TUl9FRkVSCQkweGMwMDAwMDgwIC8qIGV4dGVuZGVkIGZlYXR1cmUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTVNSX1NUQVIJCTB4YzAwMDAwODEgLyogbGVnYWN5IG1vZGUgU1lTQ0FMTCB0YXJnZXQgKi8KKyNkZWZpbmUgTVNSX0xTVEFSCQkweGMwMDAwMDgyIC8qIGxvbmcgbW9kZSBTWVNDQUxMIHRhcmdldCAqLworI2RlZmluZSBNU1JfQ1NUQVIJCTB4YzAwMDAwODMgLyogY29tcGF0IG1vZGUgU1lTQ0FMTCB0YXJnZXQgKi8KKyNkZWZpbmUgTVNSX1NZU0NBTExfTUFTSwkweGMwMDAwMDg0IC8qIEVGTEFHUyBtYXNrIGZvciBzeXNjYWxsICovCisjZGVmaW5lIE1TUl9GU19CQVNFCQkweGMwMDAwMTAwIC8qIDY0Yml0IEZTIGJhc2UgKi8KKyNkZWZpbmUgTVNSX0dTX0JBU0UJCTB4YzAwMDAxMDEgLyogNjRiaXQgR1MgYmFzZSAqLworI2RlZmluZSBNU1JfS0VSTkVMX0dTX0JBU0UJMHhjMDAwMDEwMiAvKiBTd2FwR1MgR1Mgc2hhZG93ICovCisjZGVmaW5lIE1TUl9UU0NfQVVYCQkweGMwMDAwMTAzIC8qIEF1eGlsaWFyeSBUU0MgKi8KKworLyogRUZFUiBiaXRzOiAqLworI2RlZmluZSBfRUZFUl9TQ0UJCTAgIC8qIFNZU0NBTEwvU1lTUkVUICovCisjZGVmaW5lIF9FRkVSX0xNRQkJOCAgLyogTG9uZyBtb2RlIGVuYWJsZSAqLworI2RlZmluZSBfRUZFUl9MTUEJCTEwIC8qIExvbmcgbW9kZSBhY3RpdmUgKHJlYWQtb25seSkgKi8KKyNkZWZpbmUgX0VGRVJfTlgJCTExIC8qIE5vIGV4ZWN1dGUgZW5hYmxlICovCisjZGVmaW5lIF9FRkVSX1NWTUUJCTEyIC8qIEVuYWJsZSB2aXJ0dWFsaXphdGlvbiAqLworI2RlZmluZSBfRUZFUl9MTVNMRQkJMTMgLyogTG9uZyBNb2RlIFNlZ21lbnQgTGltaXQgRW5hYmxlICovCisjZGVmaW5lIF9FRkVSX0ZGWFNSCQkxNCAvKiBFbmFibGUgRmFzdCBGWFNBVkUvRlhSU1RPUiAqLworCisjZGVmaW5lIEVGRVJfU0NFCQkoMTw8X0VGRVJfU0NFKQorI2RlZmluZSBFRkVSX0xNRQkJKDE8PF9FRkVSX0xNRSkKKyNkZWZpbmUgRUZFUl9MTUEJCSgxPDxfRUZFUl9MTUEpCisjZGVmaW5lIEVGRVJfTlgJCQkoMTw8X0VGRVJfTlgpCisjZGVmaW5lIEVGRVJfU1ZNRQkJKDE8PF9FRkVSX1NWTUUpCisjZGVmaW5lIEVGRVJfTE1TTEUJCSgxPDxfRUZFUl9MTVNMRSkKKyNkZWZpbmUgRUZFUl9GRlhTUgkJKDE8PF9FRkVSX0ZGWFNSKQorCisvKiBJbnRlbCBNU1JzLiBTb21lIGFsc28gYXZhaWxhYmxlIG9uIG90aGVyIENQVXMgKi8KKyNkZWZpbmUgTVNSX0lBMzJfUEVSRkNUUjAJCTB4MDAwMDAwYzEKKyNkZWZpbmUgTVNSX0lBMzJfUEVSRkNUUjEJCTB4MDAwMDAwYzIKKyNkZWZpbmUgTVNSX0ZTQl9GUkVRCQkJMHgwMDAwMDBjZAorCisjZGVmaW5lIE1TUl9OSE1fU05CX1BLR19DU1RfQ0ZHX0NUTAkweDAwMDAwMGUyCisjZGVmaW5lIE5ITV9DM19BVVRPX0RFTU9URQkJKDFVTCA8PCAyNSkKKyNkZWZpbmUgTkhNX0MxX0FVVE9fREVNT1RFCQkoMVVMIDw8IDI2KQorI2RlZmluZSBBVE1fTE5DX0M2X0FVVE9fREVNT1RFCQkoMVVMIDw8IDI1KQorCisjZGVmaW5lIE1TUl9NVFJSY2FwCQkJMHgwMDAwMDBmZQorI2RlZmluZSBNU1JfSUEzMl9CQkxfQ1JfQ1RMCQkweDAwMDAwMTE5CisjZGVmaW5lIE1TUl9JQTMyX0JCTF9DUl9DVEwzCQkweDAwMDAwMTFlCisKKyNkZWZpbmUgTVNSX0lBMzJfU1lTRU5URVJfQ1MJCTB4MDAwMDAxNzQKKyNkZWZpbmUgTVNSX0lBMzJfU1lTRU5URVJfRVNQCQkweDAwMDAwMTc1CisjZGVmaW5lIE1TUl9JQTMyX1NZU0VOVEVSX0VJUAkJMHgwMDAwMDE3NgorCisjZGVmaW5lIE1TUl9JQTMyX01DR19DQVAJCTB4MDAwMDAxNzkKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX1NUQVRVUwkJMHgwMDAwMDE3YQorI2RlZmluZSBNU1JfSUEzMl9NQ0dfQ1RMCQkweDAwMDAwMTdiCisKKyNkZWZpbmUgTVNSX09GRkNPUkVfUlNQXzAJCTB4MDAwMDAxYTYKKyNkZWZpbmUgTVNSX09GRkNPUkVfUlNQXzEJCTB4MDAwMDAxYTcKKworI2RlZmluZSBNU1JfSUEzMl9QRUJTX0VOQUJMRQkJMHgwMDAwMDNmMQorI2RlZmluZSBNU1JfSUEzMl9EU19BUkVBCQkweDAwMDAwNjAwCisjZGVmaW5lIE1TUl9JQTMyX1BFUkZfQ0FQQUJJTElUSUVTCTB4MDAwMDAzNDUKKworI2RlZmluZSBNU1JfTVRSUmZpeDY0S18wMDAwMAkJMHgwMDAwMDI1MAorI2RlZmluZSBNU1JfTVRSUmZpeDE2S184MDAwMAkJMHgwMDAwMDI1OAorI2RlZmluZSBNU1JfTVRSUmZpeDE2S19BMDAwMAkJMHgwMDAwMDI1OQorI2RlZmluZSBNU1JfTVRSUmZpeDRLX0MwMDAwCQkweDAwMDAwMjY4CisjZGVmaW5lIE1TUl9NVFJSZml4NEtfQzgwMDAJCTB4MDAwMDAyNjkKKyNkZWZpbmUgTVNSX01UUlJmaXg0S19EMDAwMAkJMHgwMDAwMDI2YQorI2RlZmluZSBNU1JfTVRSUmZpeDRLX0Q4MDAwCQkweDAwMDAwMjZiCisjZGVmaW5lIE1TUl9NVFJSZml4NEtfRTAwMDAJCTB4MDAwMDAyNmMKKyNkZWZpbmUgTVNSX01UUlJmaXg0S19FODAwMAkJMHgwMDAwMDI2ZAorI2RlZmluZSBNU1JfTVRSUmZpeDRLX0YwMDAwCQkweDAwMDAwMjZlCisjZGVmaW5lIE1TUl9NVFJSZml4NEtfRjgwMDAJCTB4MDAwMDAyNmYKKyNkZWZpbmUgTVNSX01UUlJkZWZUeXBlCQkJMHgwMDAwMDJmZgorCisjZGVmaW5lIE1TUl9JQTMyX0NSX1BBVAkJCTB4MDAwMDAyNzcKKworI2RlZmluZSBNU1JfSUEzMl9ERUJVR0NUTE1TUgkJMHgwMDAwMDFkOQorI2RlZmluZSBNU1JfSUEzMl9MQVNUQlJBTkNIRlJPTUlQCTB4MDAwMDAxZGIKKyNkZWZpbmUgTVNSX0lBMzJfTEFTVEJSQU5DSFRPSVAJCTB4MDAwMDAxZGMKKyNkZWZpbmUgTVNSX0lBMzJfTEFTVElOVEZST01JUAkJMHgwMDAwMDFkZAorI2RlZmluZSBNU1JfSUEzMl9MQVNUSU5UVE9JUAkJMHgwMDAwMDFkZQorCisvKiBERUJVR0NUTE1TUiBiaXRzIChvdGhlcnMgdmFyeSBieSBtb2RlbCk6ICovCisjZGVmaW5lIERFQlVHQ1RMTVNSX0xCUgkJCSgxVUwgPDwgIDApIC8qIGxhc3QgYnJhbmNoIHJlY29yZGluZyAqLworI2RlZmluZSBERUJVR0NUTE1TUl9CVEYJCQkoMVVMIDw8ICAxKSAvKiBzaW5nbGUtc3RlcCBvbiBicmFuY2hlcyAqLworI2RlZmluZSBERUJVR0NUTE1TUl9UUgkJCSgxVUwgPDwgIDYpCisjZGVmaW5lIERFQlVHQ1RMTVNSX0JUUwkJCSgxVUwgPDwgIDcpCisjZGVmaW5lIERFQlVHQ1RMTVNSX0JUSU5UCQkoMVVMIDw8ICA4KQorI2RlZmluZSBERUJVR0NUTE1TUl9CVFNfT0ZGX09TCQkoMVVMIDw8ICA5KQorI2RlZmluZSBERUJVR0NUTE1TUl9CVFNfT0ZGX1VTUgkJKDFVTCA8PCAxMCkKKyNkZWZpbmUgREVCVUdDVExNU1JfRlJFRVpFX0xCUlNfT05fUE1JCSgxVUwgPDwgMTEpCisKKyNkZWZpbmUgTVNSX0lBMzJfTUMwX0NUTAkJMHgwMDAwMDQwMAorI2RlZmluZSBNU1JfSUEzMl9NQzBfU1RBVFVTCQkweDAwMDAwNDAxCisjZGVmaW5lIE1TUl9JQTMyX01DMF9BRERSCQkweDAwMDAwNDAyCisjZGVmaW5lIE1TUl9JQTMyX01DMF9NSVNDCQkweDAwMDAwNDAzCisKKyNkZWZpbmUgTVNSX0FNRDY0X01DMF9NQVNLCQkweGMwMDEwMDQ0CisKKyNkZWZpbmUgTVNSX0lBMzJfTUN4X0NUTCh4KQkJKE1TUl9JQTMyX01DMF9DVEwgKyA0Kih4KSkKKyNkZWZpbmUgTVNSX0lBMzJfTUN4X1NUQVRVUyh4KQkJKE1TUl9JQTMyX01DMF9TVEFUVVMgKyA0Kih4KSkKKyNkZWZpbmUgTVNSX0lBMzJfTUN4X0FERFIoeCkJCShNU1JfSUEzMl9NQzBfQUREUiArIDQqKHgpKQorI2RlZmluZSBNU1JfSUEzMl9NQ3hfTUlTQyh4KQkJKE1TUl9JQTMyX01DMF9NSVNDICsgNCooeCkpCisKKyNkZWZpbmUgTVNSX0FNRDY0X01DeF9NQVNLKHgpCQkoTVNSX0FNRDY0X01DMF9NQVNLICsgKHgpKQorCisvKiBUaGVzZSBhcmUgY29uc2VjdXRpdmUgYW5kIG5vdCBpbiB0aGUgbm9ybWFsIDRlciBNQ0UgYmFuayBibG9jayAqLworI2RlZmluZSBNU1JfSUEzMl9NQzBfQ1RMMgkJMHgwMDAwMDI4MAorI2RlZmluZSBNU1JfSUEzMl9NQ3hfQ1RMMih4KQkJKE1TUl9JQTMyX01DMF9DVEwyICsgKHgpKQorCisjZGVmaW5lIE1TUl9QNl9QRVJGQ1RSMAkJCTB4MDAwMDAwYzEKKyNkZWZpbmUgTVNSX1A2X1BFUkZDVFIxCQkJMHgwMDAwMDBjMgorI2RlZmluZSBNU1JfUDZfRVZOVFNFTDAJCQkweDAwMDAwMTg2CisjZGVmaW5lIE1TUl9QNl9FVk5UU0VMMQkJCTB4MDAwMDAxODcKKworLyogQU1ENjQgTVNScy4gTm90IGNvbXBsZXRlLiBTZWUgdGhlIGFyY2hpdGVjdHVyZSBtYW51YWwgZm9yIGEgbW9yZQorICAgY29tcGxldGUgbGlzdC4gKi8KKworI2RlZmluZSBNU1JfQU1ENjRfUEFUQ0hfTEVWRUwJCTB4MDAwMDAwOGIKKyNkZWZpbmUgTVNSX0FNRDY0X1RTQ19SQVRJTwkJMHhjMDAwMDEwNAorI2RlZmluZSBNU1JfQU1ENjRfTkJfQ0ZHCQkweGMwMDEwMDFmCisjZGVmaW5lIE1TUl9BTUQ2NF9QQVRDSF9MT0FERVIJCTB4YzAwMTAwMjAKKyNkZWZpbmUgTVNSX0FNRDY0X09TVldfSURfTEVOR1RICTB4YzAwMTAxNDAKKyNkZWZpbmUgTVNSX0FNRDY0X09TVldfU1RBVFVTCQkweGMwMDEwMTQxCisjZGVmaW5lIE1TUl9BTUQ2NF9EQ19DRkcJCTB4YzAwMTEwMjIKKyNkZWZpbmUgTVNSX0FNRDY0X0lCU0ZFVENIQ1RMCQkweGMwMDExMDMwCisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNGRVRDSExJTkFECQkweGMwMDExMDMxCisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNGRVRDSFBIWVNBRAkweGMwMDExMDMyCisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNPUENUTAkJMHhjMDAxMTAzMworI2RlZmluZSBNU1JfQU1ENjRfSUJTT1BSSVAJCTB4YzAwMTEwMzQKKyNkZWZpbmUgTVNSX0FNRDY0X0lCU09QREFUQQkJMHhjMDAxMTAzNQorI2RlZmluZSBNU1JfQU1ENjRfSUJTT1BEQVRBMgkJMHhjMDAxMTAzNgorI2RlZmluZSBNU1JfQU1ENjRfSUJTT1BEQVRBMwkJMHhjMDAxMTAzNworI2RlZmluZSBNU1JfQU1ENjRfSUJTRENMSU5BRAkJMHhjMDAxMTAzOAorI2RlZmluZSBNU1JfQU1ENjRfSUJTRENQSFlTQUQJCTB4YzAwMTEwMzkKKyNkZWZpbmUgTVNSX0FNRDY0X0lCU0NUTAkJMHhjMDAxMTAzYQorI2RlZmluZSBNU1JfQU1ENjRfSUJTQlJUQVJHRVQJCTB4YzAwMTEwM2IKKworLyogRmFtIDE1aCBNU1JzICovCisjZGVmaW5lIE1TUl9GMTVIX1BFUkZfQ1RMCQkweGMwMDEwMjAwCisjZGVmaW5lIE1TUl9GMTVIX1BFUkZfQ1RSCQkweGMwMDEwMjAxCisKKy8qIEZhbSAxMGggTVNScyAqLworI2RlZmluZSBNU1JfRkFNMTBIX01NSU9fQ09ORl9CQVNFCTB4YzAwMTAwNTgKKyNkZWZpbmUgRkFNMTBIX01NSU9fQ09ORl9FTkFCTEUJCSgxPDwwKQorI2RlZmluZSBGQU0xMEhfTU1JT19DT05GX0JVU1JBTkdFX01BU0sJMHhmCisjZGVmaW5lIEZBTTEwSF9NTUlPX0NPTkZfQlVTUkFOR0VfU0hJRlQgMgorI2RlZmluZSBGQU0xMEhfTU1JT19DT05GX0JBU0VfTUFTSwkweGZmZmZmZmZVTEwKKyNkZWZpbmUgRkFNMTBIX01NSU9fQ09ORl9CQVNFX1NISUZUCTIwCisjZGVmaW5lIE1TUl9GQU0xMEhfTk9ERV9JRAkJMHhjMDAxMTAwYworCisvKiBLOCBNU1JzICovCisjZGVmaW5lIE1TUl9LOF9UT1BfTUVNMQkJCTB4YzAwMTAwMWEKKyNkZWZpbmUgTVNSX0s4X1RPUF9NRU0yCQkJMHhjMDAxMDAxZAorI2RlZmluZSBNU1JfSzhfU1lTQ0ZHCQkJMHhjMDAxMDAxMAorI2RlZmluZSBNU1JfSzhfSU5UX1BFTkRJTkdfTVNHCQkweGMwMDEwMDU1CisvKiBDMUUgYWN0aXZlIGJpdHMgaW4gaW50IHBlbmRpbmcgbWVzc2FnZSAqLworI2RlZmluZSBLOF9JTlRQX0MxRV9BQ1RJVkVfTUFTSwkJMHgxODAwMDAwMAorI2RlZmluZSBNU1JfSzhfVFNFR19BRERSCQkweGMwMDEwMTEyCisjZGVmaW5lIEs4X01UUlJGSVhSQU5HRV9EUkFNX0VOQUJMRQkweDAwMDQwMDAwIC8qIE10cnJGaXhEcmFtRW4gYml0ICAgICovCisjZGVmaW5lIEs4X01UUlJGSVhSQU5HRV9EUkFNX01PRElGWQkweDAwMDgwMDAwIC8qIE10cnJGaXhEcmFtTW9kRW4gYml0ICovCisjZGVmaW5lIEs4X01UUlJfUkRNRU1fV1JNRU1fTUFTSwkweDE4MTgxODE4IC8qIE1hc2s6IFJkTWVtfFdyTWVtICAgICovCisKKy8qIEs3IE1TUnMgKi8KKyNkZWZpbmUgTVNSX0s3X0VWTlRTRUwwCQkJMHhjMDAxMDAwMAorI2RlZmluZSBNU1JfSzdfUEVSRkNUUjAJCQkweGMwMDEwMDA0CisjZGVmaW5lIE1TUl9LN19FVk5UU0VMMQkJCTB4YzAwMTAwMDEKKyNkZWZpbmUgTVNSX0s3X1BFUkZDVFIxCQkJMHhjMDAxMDAwNQorI2RlZmluZSBNU1JfSzdfRVZOVFNFTDIJCQkweGMwMDEwMDAyCisjZGVmaW5lIE1TUl9LN19QRVJGQ1RSMgkJCTB4YzAwMTAwMDYKKyNkZWZpbmUgTVNSX0s3X0VWTlRTRUwzCQkJMHhjMDAxMDAwMworI2RlZmluZSBNU1JfSzdfUEVSRkNUUjMJCQkweGMwMDEwMDA3CisjZGVmaW5lIE1TUl9LN19DTEtfQ1RMCQkJMHhjMDAxMDAxYgorI2RlZmluZSBNU1JfSzdfSFdDUgkJCTB4YzAwMTAwMTUKKyNkZWZpbmUgTVNSX0s3X0ZJRF9WSURfQ1RMCQkweGMwMDEwMDQxCisjZGVmaW5lIE1TUl9LN19GSURfVklEX1NUQVRVUwkJMHhjMDAxMDA0MgorCisvKiBLNiBNU1JzICovCisjZGVmaW5lIE1TUl9LNl9XSENSCQkJMHhjMDAwMDA4MgorI2RlZmluZSBNU1JfSzZfVVdDQ1IJCQkweGMwMDAwMDg1CisjZGVmaW5lIE1TUl9LNl9FUE1SCQkJMHhjMDAwMDA4NgorI2RlZmluZSBNU1JfSzZfUFNPUgkJCTB4YzAwMDAwODcKKyNkZWZpbmUgTVNSX0s2X1BGSVIJCQkweGMwMDAwMDg4CisKKy8qIENlbnRhdXItSGF1bHMvSURUIGRlZmluZWQgTVNScy4gKi8KKyNkZWZpbmUgTVNSX0lEVF9GQ1IxCQkJMHgwMDAwMDEwNworI2RlZmluZSBNU1JfSURUX0ZDUjIJCQkweDAwMDAwMTA4CisjZGVmaW5lIE1TUl9JRFRfRkNSMwkJCTB4MDAwMDAxMDkKKyNkZWZpbmUgTVNSX0lEVF9GQ1I0CQkJMHgwMDAwMDEwYQorCisjZGVmaW5lIE1TUl9JRFRfTUNSMAkJCTB4MDAwMDAxMTAKKyNkZWZpbmUgTVNSX0lEVF9NQ1IxCQkJMHgwMDAwMDExMQorI2RlZmluZSBNU1JfSURUX01DUjIJCQkweDAwMDAwMTEyCisjZGVmaW5lIE1TUl9JRFRfTUNSMwkJCTB4MDAwMDAxMTMKKyNkZWZpbmUgTVNSX0lEVF9NQ1I0CQkJMHgwMDAwMDExNAorI2RlZmluZSBNU1JfSURUX01DUjUJCQkweDAwMDAwMTE1CisjZGVmaW5lIE1TUl9JRFRfTUNSNgkJCTB4MDAwMDAxMTYKKyNkZWZpbmUgTVNSX0lEVF9NQ1I3CQkJMHgwMDAwMDExNworI2RlZmluZSBNU1JfSURUX01DUl9DVFJMCQkweDAwMDAwMTIwCisKKy8qIFZJQSBDeXJpeCBkZWZpbmVkIE1TUnMqLworI2RlZmluZSBNU1JfVklBX0ZDUgkJCTB4MDAwMDExMDcKKyNkZWZpbmUgTVNSX1ZJQV9MT05HSEFVTAkJMHgwMDAwMTEwYQorI2RlZmluZSBNU1JfVklBX1JORwkJCTB4MDAwMDExMGIKKyNkZWZpbmUgTVNSX1ZJQV9CQ1IyCQkJMHgwMDAwMTE0NworCisvKiBUcmFuc21ldGEgZGVmaW5lZCBNU1JzICovCisjZGVmaW5lIE1TUl9UTVRBX0xPTkdSVU5fQ1RSTAkJMHg4MDg2ODAxMAorI2RlZmluZSBNU1JfVE1UQV9MT05HUlVOX0ZMQUdTCQkweDgwODY4MDExCisjZGVmaW5lIE1TUl9UTVRBX0xSVElfUkVBRE9VVAkJMHg4MDg2ODAxOAorI2RlZmluZSBNU1JfVE1UQV9MUlRJX1ZPTFRfTUhaCQkweDgwODY4MDFhCisKKy8qIEludGVsIGRlZmluZWQgTVNScy4gKi8KKyNkZWZpbmUgTVNSX0lBMzJfUDVfTUNfQUREUgkJMHgwMDAwMDAwMAorI2RlZmluZSBNU1JfSUEzMl9QNV9NQ19UWVBFCQkweDAwMDAwMDAxCisjZGVmaW5lIE1TUl9JQTMyX1RTQwkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTVNSX0lBMzJfUExBVEZPUk1fSUQJCTB4MDAwMDAwMTcKKyNkZWZpbmUgTVNSX0lBMzJfRUJMX0NSX1BPV0VST04JCTB4MDAwMDAwMmEKKyNkZWZpbmUgTVNSX0VCQ19GUkVRVUVOQ1lfSUQJCTB4MDAwMDAwMmMKKyNkZWZpbmUgTVNSX0lBMzJfRkVBVFVSRV9DT05UUk9MICAgICAgICAweDAwMDAwMDNhCisKKyNkZWZpbmUgRkVBVFVSRV9DT05UUk9MX0xPQ0tFRAkJCQkoMTw8MCkKKyNkZWZpbmUgRkVBVFVSRV9DT05UUk9MX1ZNWE9OX0VOQUJMRURfSU5TSURFX1NNWAkoMTw8MSkKKyNkZWZpbmUgRkVBVFVSRV9DT05UUk9MX1ZNWE9OX0VOQUJMRURfT1VUU0lERV9TTVgJKDE8PDIpCisKKyNkZWZpbmUgTVNSX0lBMzJfQVBJQ0JBU0UJCTB4MDAwMDAwMWIKKyNkZWZpbmUgTVNSX0lBMzJfQVBJQ0JBU0VfQlNQCQkoMTw8OCkKKyNkZWZpbmUgTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFCSgxPDwxMSkKKyNkZWZpbmUgTVNSX0lBMzJfQVBJQ0JBU0VfQkFTRQkJKDB4ZmZmZmY8PDEyKQorCisjZGVmaW5lIE1TUl9JQTMyX1RTQ0RFQURMSU5FCQkweDAwMDAwNmUwCisKKyNkZWZpbmUgTVNSX0lBMzJfVUNPREVfV1JJVEUJCTB4MDAwMDAwNzkKKyNkZWZpbmUgTVNSX0lBMzJfVUNPREVfUkVWCQkweDAwMDAwMDhiCisKKyNkZWZpbmUgTVNSX0lBMzJfUEVSRl9TVEFUVVMJCTB4MDAwMDAxOTgKKyNkZWZpbmUgTVNSX0lBMzJfUEVSRl9DVEwJCTB4MDAwMDAxOTkKKworI2RlZmluZSBNU1JfSUEzMl9NUEVSRgkJCTB4MDAwMDAwZTcKKyNkZWZpbmUgTVNSX0lBMzJfQVBFUkYJCQkweDAwMDAwMGU4CisKKyNkZWZpbmUgTVNSX0lBMzJfVEhFUk1fQ09OVFJPTAkJMHgwMDAwMDE5YQorI2RlZmluZSBNU1JfSUEzMl9USEVSTV9JTlRFUlJVUFQJMHgwMDAwMDE5YgorCisjZGVmaW5lIFRIRVJNX0lOVF9ISUdIX0VOQUJMRQkJKDEgPDwgMCkKKyNkZWZpbmUgVEhFUk1fSU5UX0xPV19FTkFCTEUJCSgxIDw8IDEpCisjZGVmaW5lIFRIRVJNX0lOVF9QTE5fRU5BQkxFCQkoMSA8PCAyNCkKKworI2RlZmluZSBNU1JfSUEzMl9USEVSTV9TVEFUVVMJCTB4MDAwMDAxOWMKKworI2RlZmluZSBUSEVSTV9TVEFUVVNfUFJPQ0hPVAkJKDEgPDwgMCkKKyNkZWZpbmUgVEhFUk1fU1RBVFVTX1BPV0VSX0xJTUlUCSgxIDw8IDEwKQorCisjZGVmaW5lIE1TUl9USEVSTTJfQ1RMCQkJMHgwMDAwMDE5ZAorCisjZGVmaW5lIE1TUl9USEVSTTJfQ1RMX1RNX1NFTEVDVAkoMVVMTCA8PCAxNikKKworI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRQkJMHgwMDAwMDFhMAorCisjZGVmaW5lIE1TUl9JQTMyX1RFTVBFUkFUVVJFX1RBUkdFVAkweDAwMDAwMWEyCisKKyNkZWZpbmUgTVNSX0lBMzJfRU5FUkdZX1BFUkZfQklBUwkweDAwMDAwMWIwCisjZGVmaW5lIEVORVJHWV9QRVJGX0JJQVNfUEVSRk9STUFOQ0UJMAorI2RlZmluZSBFTkVSR1lfUEVSRl9CSUFTX05PUk1BTAkJNgorI2RlZmluZSBFTkVSR1lfUEVSRl9CSUFTX1BPV0VSU0FWRQkxNQorCisjZGVmaW5lIE1TUl9JQTMyX1BBQ0tBR0VfVEhFUk1fU1RBVFVTCQkweDAwMDAwMWIxCisKKyNkZWZpbmUgUEFDS0FHRV9USEVSTV9TVEFUVVNfUFJPQ0hPVAkJKDEgPDwgMCkKKyNkZWZpbmUgUEFDS0FHRV9USEVSTV9TVEFUVVNfUE9XRVJfTElNSVQJKDEgPDwgMTApCisKKyNkZWZpbmUgTVNSX0lBMzJfUEFDS0FHRV9USEVSTV9JTlRFUlJVUFQJMHgwMDAwMDFiMgorCisjZGVmaW5lIFBBQ0tBR0VfVEhFUk1fSU5UX0hJR0hfRU5BQkxFCQkoMSA8PCAwKQorI2RlZmluZSBQQUNLQUdFX1RIRVJNX0lOVF9MT1dfRU5BQkxFCQkoMSA8PCAxKQorI2RlZmluZSBQQUNLQUdFX1RIRVJNX0lOVF9QTE5fRU5BQkxFCQkoMSA8PCAyNCkKKworLyogVGhlcm1hbCBUaHJlc2hvbGRzIFN1cHBvcnQgKi8KKyNkZWZpbmUgVEhFUk1fSU5UX1RIUkVTSE9MRDBfRU5BQkxFICAgICgxIDw8IDE1KQorI2RlZmluZSBUSEVSTV9TSElGVF9USFJFU0hPTEQwICAgICAgICA4CisjZGVmaW5lIFRIRVJNX01BU0tfVEhSRVNIT0xEMCAgICAgICAgICAoMHg3ZiA8PCBUSEVSTV9TSElGVF9USFJFU0hPTEQwKQorI2RlZmluZSBUSEVSTV9JTlRfVEhSRVNIT0xEMV9FTkFCTEUgICAgKDEgPDwgMjMpCisjZGVmaW5lIFRIRVJNX1NISUZUX1RIUkVTSE9MRDEgICAgICAgIDE2CisjZGVmaW5lIFRIRVJNX01BU0tfVEhSRVNIT0xEMSAgICAgICAgICAoMHg3ZiA8PCBUSEVSTV9TSElGVF9USFJFU0hPTEQxKQorI2RlZmluZSBUSEVSTV9TVEFUVVNfVEhSRVNIT0xEMCAgICAgICAgKDEgPDwgNikKKyNkZWZpbmUgVEhFUk1fTE9HX1RIUkVTSE9MRDAgICAgICAgICAgICgxIDw8IDcpCisjZGVmaW5lIFRIRVJNX1NUQVRVU19USFJFU0hPTEQxICAgICAgICAoMSA8PCA4KQorI2RlZmluZSBUSEVSTV9MT0dfVEhSRVNIT0xEMSAgICAgICAgICAgKDEgPDwgOSkKKworLyogTUlTQ19FTkFCTEUgYml0czogYXJjaGl0ZWN0dXJhbCAqLworI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9GQVNUX1NUUklORwkoMVVMTCA8PCAwKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9UQ0MJCSgxVUxMIDw8IDEpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0VNT04JCSgxVUxMIDw8IDcpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0JUU19VTkFWQUlMCSgxVUxMIDw8IDExKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9QRUJTX1VOQVZBSUwJKDFVTEwgPDwgMTIpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0VOSEFOQ0VEX1NQRUVEU1RFUAkoMVVMTCA8PCAxNikKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfTVdBSVQJCSgxVUxMIDw8IDE4KQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9MSU1JVF9DUFVJRAkoMVVMTCA8PCAyMikKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfWFRQUl9ESVNBQkxFCSgxVUxMIDw8IDIzKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9YRF9ESVNBQkxFCQkoMVVMTCA8PCAzNCkKKworLyogTUlTQ19FTkFCTEUgYml0czogbW9kZWwtc3BlY2lmaWMsIG1lYW5pbmcgbWF5IHZhcnkgZnJvbSBjb3JlIHRvIGNvcmUgKi8KKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfWDg3X0NPTVBBVAkJKDFVTEwgPDwgMikKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfVE0xCQkoMVVMTCA8PCAzKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9TUExJVF9MT0NLX0RJU0FCTEUJKDFVTEwgPDwgNCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfTDNDQUNIRV9ESVNBQkxFCSgxVUxMIDw8IDYpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1NVUFBSRVNTX0xPQ0sJKDFVTEwgPDwgOCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfUFJFRkVUQ0hfRElTQUJMRQkoMVVMTCA8PCA5KQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9GRVJSCQkoMVVMTCA8PCAxMCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRkVSUl9NVUxUSVBMRVgJKDFVTEwgPDwgMTApCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1RNMgkJKDFVTEwgPDwgMTMpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0FESl9QUkVGX0RJU0FCTEUJKDFVTEwgPDwgMTkpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1NQRUVEU1RFUF9MT0NLCSgxVUxMIDw8IDIwKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9MMURfQ09OVEVYVAkoMVVMTCA8PCAyNCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRENVX1BSRUZfRElTQUJMRQkoMVVMTCA8PCAzNykKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfVFVSQk9fRElTQUJMRQkoMVVMTCA8PCAzOCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfSVBfUFJFRl9ESVNBQkxFCSgxVUxMIDw8IDM5KQorCisvKiBQNC9YZW9uKyBzcGVjaWZpYyAqLworI2RlZmluZSBNU1JfSUEzMl9NQ0dfRUFYCQkweDAwMDAwMTgwCisjZGVmaW5lIE1TUl9JQTMyX01DR19FQlgJCTB4MDAwMDAxODEKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX0VDWAkJMHgwMDAwMDE4MgorI2RlZmluZSBNU1JfSUEzMl9NQ0dfRURYCQkweDAwMDAwMTgzCisjZGVmaW5lIE1TUl9JQTMyX01DR19FU0kJCTB4MDAwMDAxODQKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX0VESQkJMHgwMDAwMDE4NQorI2RlZmluZSBNU1JfSUEzMl9NQ0dfRUJQCQkweDAwMDAwMTg2CisjZGVmaW5lIE1TUl9JQTMyX01DR19FU1AJCTB4MDAwMDAxODcKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX0VGTEFHUwkJMHgwMDAwMDE4OAorI2RlZmluZSBNU1JfSUEzMl9NQ0dfRUlQCQkweDAwMDAwMTg5CisjZGVmaW5lIE1TUl9JQTMyX01DR19SRVNFUlZFRAkJMHgwMDAwMDE4YQorCisvKiBQZW50aXVtIElWIHBlcmZvcm1hbmNlIGNvdW50ZXIgTVNScyAqLworI2RlZmluZSBNU1JfUDRfQlBVX1BFUkZDVFIwCQkweDAwMDAwMzAwCisjZGVmaW5lIE1TUl9QNF9CUFVfUEVSRkNUUjEJCTB4MDAwMDAzMDEKKyNkZWZpbmUgTVNSX1A0X0JQVV9QRVJGQ1RSMgkJMHgwMDAwMDMwMgorI2RlZmluZSBNU1JfUDRfQlBVX1BFUkZDVFIzCQkweDAwMDAwMzAzCisjZGVmaW5lIE1TUl9QNF9NU19QRVJGQ1RSMAkJMHgwMDAwMDMwNAorI2RlZmluZSBNU1JfUDRfTVNfUEVSRkNUUjEJCTB4MDAwMDAzMDUKKyNkZWZpbmUgTVNSX1A0X01TX1BFUkZDVFIyCQkweDAwMDAwMzA2CisjZGVmaW5lIE1TUl9QNF9NU19QRVJGQ1RSMwkJMHgwMDAwMDMwNworI2RlZmluZSBNU1JfUDRfRkxBTUVfUEVSRkNUUjAJCTB4MDAwMDAzMDgKKyNkZWZpbmUgTVNSX1A0X0ZMQU1FX1BFUkZDVFIxCQkweDAwMDAwMzA5CisjZGVmaW5lIE1TUl9QNF9GTEFNRV9QRVJGQ1RSMgkJMHgwMDAwMDMwYQorI2RlZmluZSBNU1JfUDRfRkxBTUVfUEVSRkNUUjMJCTB4MDAwMDAzMGIKKyNkZWZpbmUgTVNSX1A0X0lRX1BFUkZDVFIwCQkweDAwMDAwMzBjCisjZGVmaW5lIE1TUl9QNF9JUV9QRVJGQ1RSMQkJMHgwMDAwMDMwZAorI2RlZmluZSBNU1JfUDRfSVFfUEVSRkNUUjIJCTB4MDAwMDAzMGUKKyNkZWZpbmUgTVNSX1A0X0lRX1BFUkZDVFIzCQkweDAwMDAwMzBmCisjZGVmaW5lIE1TUl9QNF9JUV9QRVJGQ1RSNAkJMHgwMDAwMDMxMAorI2RlZmluZSBNU1JfUDRfSVFfUEVSRkNUUjUJCTB4MDAwMDAzMTEKKyNkZWZpbmUgTVNSX1A0X0JQVV9DQ0NSMAkJMHgwMDAwMDM2MAorI2RlZmluZSBNU1JfUDRfQlBVX0NDQ1IxCQkweDAwMDAwMzYxCisjZGVmaW5lIE1TUl9QNF9CUFVfQ0NDUjIJCTB4MDAwMDAzNjIKKyNkZWZpbmUgTVNSX1A0X0JQVV9DQ0NSMwkJMHgwMDAwMDM2MworI2RlZmluZSBNU1JfUDRfTVNfQ0NDUjAJCQkweDAwMDAwMzY0CisjZGVmaW5lIE1TUl9QNF9NU19DQ0NSMQkJCTB4MDAwMDAzNjUKKyNkZWZpbmUgTVNSX1A0X01TX0NDQ1IyCQkJMHgwMDAwMDM2NgorI2RlZmluZSBNU1JfUDRfTVNfQ0NDUjMJCQkweDAwMDAwMzY3CisjZGVmaW5lIE1TUl9QNF9GTEFNRV9DQ0NSMAkJMHgwMDAwMDM2OAorI2RlZmluZSBNU1JfUDRfRkxBTUVfQ0NDUjEJCTB4MDAwMDAzNjkKKyNkZWZpbmUgTVNSX1A0X0ZMQU1FX0NDQ1IyCQkweDAwMDAwMzZhCisjZGVmaW5lIE1TUl9QNF9GTEFNRV9DQ0NSMwkJMHgwMDAwMDM2YgorI2RlZmluZSBNU1JfUDRfSVFfQ0NDUjAJCQkweDAwMDAwMzZjCisjZGVmaW5lIE1TUl9QNF9JUV9DQ0NSMQkJCTB4MDAwMDAzNmQKKyNkZWZpbmUgTVNSX1A0X0lRX0NDQ1IyCQkJMHgwMDAwMDM2ZQorI2RlZmluZSBNU1JfUDRfSVFfQ0NDUjMJCQkweDAwMDAwMzZmCisjZGVmaW5lIE1TUl9QNF9JUV9DQ0NSNAkJCTB4MDAwMDAzNzAKKyNkZWZpbmUgTVNSX1A0X0lRX0NDQ1I1CQkJMHgwMDAwMDM3MQorI2RlZmluZSBNU1JfUDRfQUxGX0VTQ1IwCQkweDAwMDAwM2NhCisjZGVmaW5lIE1TUl9QNF9BTEZfRVNDUjEJCTB4MDAwMDAzY2IKKyNkZWZpbmUgTVNSX1A0X0JQVV9FU0NSMAkJMHgwMDAwMDNiMgorI2RlZmluZSBNU1JfUDRfQlBVX0VTQ1IxCQkweDAwMDAwM2IzCisjZGVmaW5lIE1TUl9QNF9CU1VfRVNDUjAJCTB4MDAwMDAzYTAKKyNkZWZpbmUgTVNSX1A0X0JTVV9FU0NSMQkJMHgwMDAwMDNhMQorI2RlZmluZSBNU1JfUDRfQ1JVX0VTQ1IwCQkweDAwMDAwM2I4CisjZGVmaW5lIE1TUl9QNF9DUlVfRVNDUjEJCTB4MDAwMDAzYjkKKyNkZWZpbmUgTVNSX1A0X0NSVV9FU0NSMgkJMHgwMDAwMDNjYworI2RlZmluZSBNU1JfUDRfQ1JVX0VTQ1IzCQkweDAwMDAwM2NkCisjZGVmaW5lIE1TUl9QNF9DUlVfRVNDUjQJCTB4MDAwMDAzZTAKKyNkZWZpbmUgTVNSX1A0X0NSVV9FU0NSNQkJMHgwMDAwMDNlMQorI2RlZmluZSBNU1JfUDRfREFDX0VTQ1IwCQkweDAwMDAwM2E4CisjZGVmaW5lIE1TUl9QNF9EQUNfRVNDUjEJCTB4MDAwMDAzYTkKKyNkZWZpbmUgTVNSX1A0X0ZJUk1fRVNDUjAJCTB4MDAwMDAzYTQKKyNkZWZpbmUgTVNSX1A0X0ZJUk1fRVNDUjEJCTB4MDAwMDAzYTUKKyNkZWZpbmUgTVNSX1A0X0ZMQU1FX0VTQ1IwCQkweDAwMDAwM2E2CisjZGVmaW5lIE1TUl9QNF9GTEFNRV9FU0NSMQkJMHgwMDAwMDNhNworI2RlZmluZSBNU1JfUDRfRlNCX0VTQ1IwCQkweDAwMDAwM2EyCisjZGVmaW5lIE1TUl9QNF9GU0JfRVNDUjEJCTB4MDAwMDAzYTMKKyNkZWZpbmUgTVNSX1A0X0lRX0VTQ1IwCQkJMHgwMDAwMDNiYQorI2RlZmluZSBNU1JfUDRfSVFfRVNDUjEJCQkweDAwMDAwM2JiCisjZGVmaW5lIE1TUl9QNF9JU19FU0NSMAkJCTB4MDAwMDAzYjQKKyNkZWZpbmUgTVNSX1A0X0lTX0VTQ1IxCQkJMHgwMDAwMDNiNQorI2RlZmluZSBNU1JfUDRfSVRMQl9FU0NSMAkJMHgwMDAwMDNiNgorI2RlZmluZSBNU1JfUDRfSVRMQl9FU0NSMQkJMHgwMDAwMDNiNworI2RlZmluZSBNU1JfUDRfSVhfRVNDUjAJCQkweDAwMDAwM2M4CisjZGVmaW5lIE1TUl9QNF9JWF9FU0NSMQkJCTB4MDAwMDAzYzkKKyNkZWZpbmUgTVNSX1A0X01PQl9FU0NSMAkJMHgwMDAwMDNhYQorI2RlZmluZSBNU1JfUDRfTU9CX0VTQ1IxCQkweDAwMDAwM2FiCisjZGVmaW5lIE1TUl9QNF9NU19FU0NSMAkJCTB4MDAwMDAzYzAKKyNkZWZpbmUgTVNSX1A0X01TX0VTQ1IxCQkJMHgwMDAwMDNjMQorI2RlZmluZSBNU1JfUDRfUE1IX0VTQ1IwCQkweDAwMDAwM2FjCisjZGVmaW5lIE1TUl9QNF9QTUhfRVNDUjEJCTB4MDAwMDAzYWQKKyNkZWZpbmUgTVNSX1A0X1JBVF9FU0NSMAkJMHgwMDAwMDNiYworI2RlZmluZSBNU1JfUDRfUkFUX0VTQ1IxCQkweDAwMDAwM2JkCisjZGVmaW5lIE1TUl9QNF9TQUFUX0VTQ1IwCQkweDAwMDAwM2FlCisjZGVmaW5lIE1TUl9QNF9TQUFUX0VTQ1IxCQkweDAwMDAwM2FmCisjZGVmaW5lIE1TUl9QNF9TU1VfRVNDUjAJCTB4MDAwMDAzYmUKKyNkZWZpbmUgTVNSX1A0X1NTVV9FU0NSMQkJMHgwMDAwMDNiZiAvKiBndWVzczogbm90IGluIG1hbnVhbCAqLworCisjZGVmaW5lIE1TUl9QNF9UQlBVX0VTQ1IwCQkweDAwMDAwM2MyCisjZGVmaW5lIE1TUl9QNF9UQlBVX0VTQ1IxCQkweDAwMDAwM2MzCisjZGVmaW5lIE1TUl9QNF9UQ19FU0NSMAkJCTB4MDAwMDAzYzQKKyNkZWZpbmUgTVNSX1A0X1RDX0VTQ1IxCQkJMHgwMDAwMDNjNQorI2RlZmluZSBNU1JfUDRfVTJMX0VTQ1IwCQkweDAwMDAwM2IwCisjZGVmaW5lIE1TUl9QNF9VMkxfRVNDUjEJCTB4MDAwMDAzYjEKKworI2RlZmluZSBNU1JfUDRfUEVCU19NQVRSSVhfVkVSVAkJMHgwMDAwMDNmMgorCisvKiBJbnRlbCBDb3JlLWJhc2VkIENQVSBwZXJmb3JtYW5jZSBjb3VudGVycyAqLworI2RlZmluZSBNU1JfQ09SRV9QRVJGX0ZJWEVEX0NUUjAJMHgwMDAwMDMwOQorI2RlZmluZSBNU1JfQ09SRV9QRVJGX0ZJWEVEX0NUUjEJMHgwMDAwMDMwYQorI2RlZmluZSBNU1JfQ09SRV9QRVJGX0ZJWEVEX0NUUjIJMHgwMDAwMDMwYgorI2RlZmluZSBNU1JfQ09SRV9QRVJGX0ZJWEVEX0NUUl9DVFJMCTB4MDAwMDAzOGQKKyNkZWZpbmUgTVNSX0NPUkVfUEVSRl9HTE9CQUxfU1RBVFVTCTB4MDAwMDAzOGUKKyNkZWZpbmUgTVNSX0NPUkVfUEVSRl9HTE9CQUxfQ1RSTAkweDAwMDAwMzhmCisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfR0xPQkFMX09WRl9DVFJMCTB4MDAwMDAzOTAKKworLyogR2VvZGUgZGVmaW5lZCBNU1JzICovCisjZGVmaW5lIE1TUl9HRU9ERV9CVVNDT05UX0NPTkYwCQkweDAwMDAxOTAwCisKKy8qIEludGVsIFZUIE1TUnMgKi8KKyNkZWZpbmUgTVNSX0lBMzJfVk1YX0JBU0lDICAgICAgICAgICAgICAweDAwMDAwNDgwCisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9QSU5CQVNFRF9DVExTICAgICAgMHgwMDAwMDQ4MQorI2RlZmluZSBNU1JfSUEzMl9WTVhfUFJPQ0JBU0VEX0NUTFMgICAgIDB4MDAwMDA0ODIKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX0VYSVRfQ1RMUyAgICAgICAgICAweDAwMDAwNDgzCisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9FTlRSWV9DVExTICAgICAgICAgMHgwMDAwMDQ4NAorI2RlZmluZSBNU1JfSUEzMl9WTVhfTUlTQyAgICAgICAgICAgICAgIDB4MDAwMDA0ODUKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX0NSMF9GSVhFRDAgICAgICAgICAweDAwMDAwNDg2CisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9DUjBfRklYRUQxICAgICAgICAgMHgwMDAwMDQ4NworI2RlZmluZSBNU1JfSUEzMl9WTVhfQ1I0X0ZJWEVEMCAgICAgICAgIDB4MDAwMDA0ODgKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX0NSNF9GSVhFRDEgICAgICAgICAweDAwMDAwNDg5CisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9WTUNTX0VOVU0gICAgICAgICAgMHgwMDAwMDQ4YQorI2RlZmluZSBNU1JfSUEzMl9WTVhfUFJPQ0JBU0VEX0NUTFMyICAgIDB4MDAwMDA0OGIKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX0VQVF9WUElEX0NBUCAgICAgICAweDAwMDAwNDhjCisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9UUlVFX1BJTkJBU0VEX0NUTFMgIDB4MDAwMDA0OGQKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX1RSVUVfUFJPQ0JBU0VEX0NUTFMgMHgwMDAwMDQ4ZQorI2RlZmluZSBNU1JfSUEzMl9WTVhfVFJVRV9FWElUX0NUTFMgICAgICAweDAwMDAwNDhmCisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9UUlVFX0VOVFJZX0NUTFMgICAgIDB4MDAwMDA0OTAKKworLyogVk1YX0JBU0lDIGJpdHMgYW5kIGJpdG1hc2tzICovCisjZGVmaW5lIFZNWF9CQVNJQ19WTUNTX1NJWkVfU0hJRlQJMzIKKyNkZWZpbmUgVk1YX0JBU0lDXzY0CQkweDAwMDEwMDAwMDAwMDAwMDBMTFUKKyNkZWZpbmUgVk1YX0JBU0lDX01FTV9UWVBFX1NISUZUCTUwCisjZGVmaW5lIFZNWF9CQVNJQ19NRU1fVFlQRV9NQVNLCTB4MDAzYzAwMDAwMDAwMDAwMExMVQorI2RlZmluZSBWTVhfQkFTSUNfTUVNX1RZUEVfV0IJNkxMVQorI2RlZmluZSBWTVhfQkFTSUNfSU5PVVQJCTB4MDA0MDAwMDAwMDAwMDAwMExMVQorCisvKiBBTUQtViBNU1JzICovCisKKyNkZWZpbmUgTVNSX1ZNX0NSICAgICAgICAgICAgICAgICAgICAgICAweGMwMDEwMTE0CisjZGVmaW5lIE1TUl9WTV9JR05ORSAgICAgICAgICAgICAgICAgICAgMHhjMDAxMDExNQorI2RlZmluZSBNU1JfVk1fSFNBVkVfUEEgICAgICAgICAgICAgICAgIDB4YzAwMTAxMTcKKworI2VuZGlmIC8qIF9BU01fWDg2X01TUl9JTkRFWF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9tc3IuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL21zci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYWVhZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9tc3IuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIF9BU01fWDg2X01TUl9ICisjZGVmaW5lIF9BU01fWDg2X01TUl9ICisKKyNpbmNsdWRlIDxhc20vbXNyLWluZGV4Lmg+CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNkZWZpbmUgWDg2X0lPQ19SRE1TUl9SRUdTCV9JT1dSKCdjJywgMHhBMCwgX191MzJbOF0pCisjZGVmaW5lIFg4Nl9JT0NfV1JNU1JfUkVHUwlfSU9XUignYycsIDB4QTEsIF9fdTMyWzhdKQorCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisjZW5kaWYgLyogX0FTTV9YODZfTVNSX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL210cnIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL210cnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGY4ZjJmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vbXRyci5oCkBAIC0wLDAgKzEsMTA5IEBACisvKiAgR2VuZXJpYyBNVFJSIChNZW1vcnkgVHlwZSBSYW5nZSBSZWdpc3RlcikgaW9jdGxzLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTE5OTkgIFJpY2hhcmQgR29vY2gKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgICAgUmljaGFyZCBHb29jaCBtYXkgYmUgcmVhY2hlZCBieSBlbWFpbCBhdCAgcmdvb2NoQGF0bmYuY3Npcm8uYXUKKyAgICBUaGUgcG9zdGFsIGFkZHJlc3MgaXM6CisgICAgICBSaWNoYXJkIEdvb2NoLCBjL28gQVRORiwgUC4gTy4gQm94IDc2LCBFcHBpbmcsIE4uUy5XLiwgMjEyMSwgQXVzdHJhbGlhLgorKi8KKyNpZm5kZWYgX0FTTV9YODZfTVRSUl9ICisjZGVmaW5lIF9BU01fWDg2X01UUlJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKKyNkZWZpbmUJTVRSUl9JT0NUTF9CQVNFCSdNJworCitzdHJ1Y3QgbXRycl9zZW50cnkgeworICAgIHVuc2lnbmVkIGxvbmcgYmFzZTsgICAgLyogIEJhc2UgYWRkcmVzcyAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsgICAgLyogIFNpemUgb2YgcmVnaW9uICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgdHlwZTsgICAgIC8qICBUeXBlIG9mIHJlZ2lvbiAgICovCit9OworCisvKiBXYXJuaW5nOiB0aGlzIHN0cnVjdHVyZSBoYXMgYSBkaWZmZXJlbnQgb3JkZXIgZnJvbSBpMzg2CisgICBvbiB4ODYtNjQuIFRoZSAzMmJpdCBlbXVsYXRpb24gY29kZSB0YWtlcyBjYXJlIG9mIHRoYXQuCisgICBCdXQgeW91IG5lZWQgdG8gdXNlIHRoaXMgZm9yIDY0Yml0LCBvdGhlcndpc2UgeW91ciBYIHNlcnZlcgorICAgd2lsbCBicmVhay4gKi8KKworI2lmZGVmIF9faTM4Nl9fCitzdHJ1Y3QgbXRycl9nZW50cnkgeworICAgIHVuc2lnbmVkIGludCByZWdudW07ICAgLyogIFJlZ2lzdGVyIG51bWJlciAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGJhc2U7ICAgIC8qICBCYXNlIGFkZHJlc3MgICAgICovCisgICAgdW5zaWduZWQgaW50IHNpemU7ICAgIC8qICBTaXplIG9mIHJlZ2lvbiAgICovCisgICAgdW5zaWduZWQgaW50IHR5cGU7ICAgICAvKiAgVHlwZSBvZiByZWdpb24gICAqLworfTsKKworI2Vsc2UgLyogX19pMzg2X18gKi8KKworc3RydWN0IG10cnJfZ2VudHJ5IHsKKyAgICB1bnNpZ25lZCBsb25nIGJhc2U7ICAgIC8qICBCYXNlIGFkZHJlc3MgICAgICovCisgICAgdW5zaWduZWQgaW50IHNpemU7ICAgIC8qICBTaXplIG9mIHJlZ2lvbiAgICovCisgICAgdW5zaWduZWQgaW50IHJlZ251bTsgICAvKiAgUmVnaXN0ZXIgbnVtYmVyICAqLworICAgIHVuc2lnbmVkIGludCB0eXBlOyAgICAgLyogIFR5cGUgb2YgcmVnaW9uICAgKi8KK307CisjZW5kaWYgLyogIV9faTM4Nl9fICovCisKK3N0cnVjdCBtdHJyX3Zhcl9yYW5nZSB7CisJX191MzIgYmFzZV9sbzsKKwlfX3UzMiBiYXNlX2hpOworCV9fdTMyIG1hc2tfbG87CisJX191MzIgbWFza19oaTsKK307CisKKy8qIEluIHRoZSBJbnRlbCBwcm9jZXNzb3IncyBNVFJSIGludGVyZmFjZSwgdGhlIE1UUlIgdHlwZSBpcyBhbHdheXMgaGVsZCBpbgorICAgYW4gOCBiaXQgZmllbGQ6ICovCit0eXBlZGVmIF9fdTggbXRycl90eXBlOworCisjZGVmaW5lIE1UUlJfTlVNX0ZJWEVEX1JBTkdFUyA4OAorI2RlZmluZSBNVFJSX01BWF9WQVJfUkFOR0VTIDI1NgorCitzdHJ1Y3QgbXRycl9zdGF0ZV90eXBlIHsKKwlzdHJ1Y3QgbXRycl92YXJfcmFuZ2UgdmFyX3Jhbmdlc1tNVFJSX01BWF9WQVJfUkFOR0VTXTsKKwltdHJyX3R5cGUgZml4ZWRfcmFuZ2VzW01UUlJfTlVNX0ZJWEVEX1JBTkdFU107CisJdW5zaWduZWQgY2hhciBlbmFibGVkOworCXVuc2lnbmVkIGNoYXIgaGF2ZV9maXhlZDsKKwltdHJyX3R5cGUgZGVmX3R5cGU7Cit9OworCisjZGVmaW5lIE1UUlJwaHlzQmFzZV9NU1IocmVnKSAoMHgyMDAgKyAyICogKHJlZykpCisjZGVmaW5lIE1UUlJwaHlzTWFza19NU1IocmVnKSAoMHgyMDAgKyAyICogKHJlZykgKyAxKQorCisvKiAgVGhlc2UgYXJlIHRoZSB2YXJpb3VzIGlvY3RscyAgKi8KKyNkZWZpbmUgTVRSUklPQ19BRERfRU5UUlkgICAgICAgIF9JT1coTVRSUl9JT0NUTF9CQVNFLCAgMCwgc3RydWN0IG10cnJfc2VudHJ5KQorI2RlZmluZSBNVFJSSU9DX1NFVF9FTlRSWSAgICAgICAgX0lPVyhNVFJSX0lPQ1RMX0JBU0UsICAxLCBzdHJ1Y3QgbXRycl9zZW50cnkpCisjZGVmaW5lIE1UUlJJT0NfREVMX0VOVFJZICAgICAgICBfSU9XKE1UUlJfSU9DVExfQkFTRSwgIDIsIHN0cnVjdCBtdHJyX3NlbnRyeSkKKyNkZWZpbmUgTVRSUklPQ19HRVRfRU5UUlkgICAgICAgIF9JT1dSKE1UUlJfSU9DVExfQkFTRSwgMywgc3RydWN0IG10cnJfZ2VudHJ5KQorI2RlZmluZSBNVFJSSU9DX0tJTExfRU5UUlkgICAgICAgX0lPVyhNVFJSX0lPQ1RMX0JBU0UsICA0LCBzdHJ1Y3QgbXRycl9zZW50cnkpCisjZGVmaW5lIE1UUlJJT0NfQUREX1BBR0VfRU5UUlkgICBfSU9XKE1UUlJfSU9DVExfQkFTRSwgIDUsIHN0cnVjdCBtdHJyX3NlbnRyeSkKKyNkZWZpbmUgTVRSUklPQ19TRVRfUEFHRV9FTlRSWSAgIF9JT1coTVRSUl9JT0NUTF9CQVNFLCAgNiwgc3RydWN0IG10cnJfc2VudHJ5KQorI2RlZmluZSBNVFJSSU9DX0RFTF9QQUdFX0VOVFJZICAgX0lPVyhNVFJSX0lPQ1RMX0JBU0UsICA3LCBzdHJ1Y3QgbXRycl9zZW50cnkpCisjZGVmaW5lIE1UUlJJT0NfR0VUX1BBR0VfRU5UUlkgICBfSU9XUihNVFJSX0lPQ1RMX0JBU0UsIDgsIHN0cnVjdCBtdHJyX2dlbnRyeSkKKyNkZWZpbmUgTVRSUklPQ19LSUxMX1BBR0VfRU5UUlkgIF9JT1coTVRSUl9JT0NUTF9CQVNFLCAgOSwgc3RydWN0IG10cnJfc2VudHJ5KQorCisvKiAgVGhlc2UgYXJlIHRoZSByZWdpb24gdHlwZXMgICovCisjZGVmaW5lIE1UUlJfVFlQRV9VTkNBQ0hBQkxFIDAKKyNkZWZpbmUgTVRSUl9UWVBFX1dSQ09NQiAgICAgMQorLyojZGVmaW5lIE1UUlJfVFlQRV8gICAgICAgICAyKi8KKy8qI2RlZmluZSBNVFJSX1RZUEVfICAgICAgICAgMyovCisjZGVmaW5lIE1UUlJfVFlQRV9XUlRIUk9VR0ggIDQKKyNkZWZpbmUgTVRSUl9UWVBFX1dSUFJPVCAgICAgNQorI2RlZmluZSBNVFJSX1RZUEVfV1JCQUNLICAgICA2CisjZGVmaW5lIE1UUlJfTlVNX1RZUEVTICAgICAgIDcKKworCisjZW5kaWYgLyogX0FTTV9YODZfTVRSUl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9wYXJhbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vcGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjVkNDU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vcGFyYW0uaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFyYW0uaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3BvbGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3BvbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTg1MDlkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vcG9sbC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wb2xsLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9wb3NpeF90eXBlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vcG9zaXhfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmRjZmYwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vcG9zaXhfdHlwZXMuaApAQCAtMCwwICsxLDUgQEAKKyMgaWZkZWYgX19pMzg2X18KKyMgIGluY2x1ZGUgPGFzbS9wb3NpeF90eXBlc18zMi5oPgorIyBlbHNlCisjICBpbmNsdWRlIDxhc20vcG9zaXhfdHlwZXNfNjQuaD4KKyMgZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3Bvc2l4X3R5cGVzXzMyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9wb3NpeF90eXBlc18zMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZTQ1NjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9wb3NpeF90eXBlc18zMi5oCkBAIC0wLDAgKzEsNDYgQEAKKyNpZm5kZWYgX0FTTV9YODZfUE9TSVhfVFlQRVNfMzJfSAorI2RlZmluZSBfQVNNX1g4Nl9QT1NJWF9UWVBFU18zMl9ICisKKy8qCisgKiBUaGlzIGZpbGUgaXMgZ2VuZXJhbGx5IHVzZWQgYnkgdXNlci1sZXZlbCBzb2Z0d2FyZSwgc28geW91IG5lZWQgdG8KKyAqIGJlIGEgbGl0dGxlIGNhcmVmdWwgYWJvdXQgbmFtZXNwYWNlIHBvbGx1dGlvbiBldGMuICBBbHNvLCB3ZSBjYW5ub3QKKyAqIGFzc3VtZSBHQ0MgaXMgYmVpbmcgdXNlZC4KKyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJX19rZXJuZWxfaW5vX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX21vZGVfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfbmxpbmtfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfb2ZmX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfcGlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX2lwY19waWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfdWlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX2dpZF90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJX19rZXJuZWxfc2l6ZV90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX3NzaXplX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfcHRyZGlmZl90OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF90aW1lX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX3N1c2Vjb25kc190OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF9jbG9ja190OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX3RpbWVyX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfY2xvY2tpZF90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX2RhZGRyX3Q7Cit0eXBlZGVmIGNoYXIgKgkJX19rZXJuZWxfY2FkZHJfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfdWlkMTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfZ2lkMTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX3VpZDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlfX2tlcm5lbF9naWQzMl90OworCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX29sZF91aWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfb2xkX2dpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9vbGRfZGV2X3Q7CisKKyNpZmRlZiBfX0dOVUNfXwordHlwZWRlZiBsb25nIGxvbmcJX19rZXJuZWxfbG9mZl90OworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQJdmFsWzJdOworfSBfX2tlcm5lbF9mc2lkX3Q7CisKKworI2VuZGlmIC8qIF9BU01fWDg2X1BPU0lYX1RZUEVTXzMyX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3Bvc2l4X3R5cGVzXzY0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9wb3NpeF90eXBlc182NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NzYzYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9wb3NpeF90eXBlc182NC5oCkBAIC0wLDAgKzEsNDcgQEAKKyNpZm5kZWYgX0FTTV9YODZfUE9TSVhfVFlQRVNfNjRfSAorI2RlZmluZSBfQVNNX1g4Nl9QT1NJWF9UWVBFU182NF9ICisKKy8qCisgKiBUaGlzIGZpbGUgaXMgZ2VuZXJhbGx5IHVzZWQgYnkgdXNlci1sZXZlbCBzb2Z0d2FyZSwgc28geW91IG5lZWQgdG8KKyAqIGJlIGEgbGl0dGxlIGNhcmVmdWwgYWJvdXQgbmFtZXNwYWNlIHBvbGx1dGlvbiBldGMuICBBbHNvLCB3ZSBjYW5ub3QKKyAqIGFzc3VtZSBHQ0MgaXMgYmVpbmcgdXNlZC4KKyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJX19rZXJuZWxfaW5vX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlfX2tlcm5lbF9tb2RlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJX19rZXJuZWxfbmxpbmtfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfb2ZmX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfcGlkX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfaXBjX3BpZF90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJX19rZXJuZWxfdWlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlfX2tlcm5lbF9naWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlfX2tlcm5lbF9zaXplX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX3NzaXplX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX3B0cmRpZmZfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfdGltZV90OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF9zdXNlY29uZHNfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfY2xvY2tfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF90aW1lcl90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX2Nsb2NraWRfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9kYWRkcl90OwordHlwZWRlZiBjaGFyICoJCV9fa2VybmVsX2NhZGRyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX3VpZDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX2dpZDE2X3Q7CisKKyNpZmRlZiBfX0dOVUNfXwordHlwZWRlZiBsb25nIGxvbmcJX19rZXJuZWxfbG9mZl90OworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQJdmFsWzJdOworfSBfX2tlcm5lbF9mc2lkX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgX19rZXJuZWxfb2xkX3VpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBfX2tlcm5lbF9vbGRfZ2lkX3Q7Cit0eXBlZGVmIF9fa2VybmVsX3VpZF90IF9fa2VybmVsX3VpZDMyX3Q7Cit0eXBlZGVmIF9fa2VybmVsX2dpZF90IF9fa2VybmVsX2dpZDMyX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlfX2tlcm5lbF9vbGRfZGV2X3Q7CisKKworI2VuZGlmIC8qIF9BU01fWDg2X1BPU0lYX1RZUEVTXzY0X0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3ByY3RsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9wcmN0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYzUwMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9wcmN0bC5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfQVNNX1g4Nl9QUkNUTF9ICisjZGVmaW5lIF9BU01fWDg2X1BSQ1RMX0gKKworI2RlZmluZSBBUkNIX1NFVF9HUyAweDEwMDEKKyNkZWZpbmUgQVJDSF9TRVRfRlMgMHgxMDAyCisjZGVmaW5lIEFSQ0hfR0VUX0ZTIDB4MTAwMworI2RlZmluZSBBUkNIX0dFVF9HUyAweDEwMDQKKworI2VuZGlmIC8qIF9BU01fWDg2X1BSQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3Byb2Nlc3Nvci1mbGFncy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vcHJvY2Vzc29yLWZsYWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJlMTM5YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3Byb2Nlc3Nvci1mbGFncy5oCkBAIC0wLDAgKzEsOTUgQEAKKyNpZm5kZWYgX0FTTV9YODZfUFJPQ0VTU09SX0ZMQUdTX0gKKyNkZWZpbmUgX0FTTV9YODZfUFJPQ0VTU09SX0ZMQUdTX0gKKy8qIFZhcmlvdXMgZmxhZ3MgZGVmaW5lZDogY2FuIGJlIGluY2x1ZGVkIGZyb20gYXNzZW1ibGVyLiAqLworCisvKgorICogRUZMQUdTIGJpdHMKKyAqLworI2RlZmluZSBYODZfRUZMQUdTX0NGCTB4MDAwMDAwMDEgLyogQ2FycnkgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX1BGCTB4MDAwMDAwMDQgLyogUGFyaXR5IEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19BRgkweDAwMDAwMDEwIC8qIEF1eGlsaWFyeSBjYXJyeSBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfWkYJMHgwMDAwMDA0MCAvKiBaZXJvIEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19TRgkweDAwMDAwMDgwIC8qIFNpZ24gRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX1RGCTB4MDAwMDAxMDAgLyogVHJhcCBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfSUYJMHgwMDAwMDIwMCAvKiBJbnRlcnJ1cHQgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX0RGCTB4MDAwMDA0MDAgLyogRGlyZWN0aW9uIEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19PRgkweDAwMDAwODAwIC8qIE92ZXJmbG93IEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19JT1BMCTB4MDAwMDMwMDAgLyogSU9QTCBtYXNrICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfTlQJMHgwMDAwNDAwMCAvKiBOZXN0ZWQgVGFzayAqLworI2RlZmluZSBYODZfRUZMQUdTX1JGCTB4MDAwMTAwMDAgLyogUmVzdW1lIEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19WTQkweDAwMDIwMDAwIC8qIFZpcnR1YWwgTW9kZSAqLworI2RlZmluZSBYODZfRUZMQUdTX0FDCTB4MDAwNDAwMDAgLyogQWxpZ25tZW50IENoZWNrICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfVklGCTB4MDAwODAwMDAgLyogVmlydHVhbCBJbnRlcnJ1cHQgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX1ZJUAkweDAwMTAwMDAwIC8qIFZpcnR1YWwgSW50ZXJydXB0IFBlbmRpbmcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19JRAkweDAwMjAwMDAwIC8qIENQVUlEIGRldGVjdGlvbiBmbGFnICovCisKKy8qCisgKiBCYXNpYyBDUFUgY29udHJvbCBpbiBDUjAKKyAqLworI2RlZmluZSBYODZfQ1IwX1BFCTB4MDAwMDAwMDEgLyogUHJvdGVjdGlvbiBFbmFibGUgKi8KKyNkZWZpbmUgWDg2X0NSMF9NUAkweDAwMDAwMDAyIC8qIE1vbml0b3IgQ29wcm9jZXNzb3IgKi8KKyNkZWZpbmUgWDg2X0NSMF9FTQkweDAwMDAwMDA0IC8qIEVtdWxhdGlvbiAqLworI2RlZmluZSBYODZfQ1IwX1RTCTB4MDAwMDAwMDggLyogVGFzayBTd2l0Y2hlZCAqLworI2RlZmluZSBYODZfQ1IwX0VUCTB4MDAwMDAwMTAgLyogRXh0ZW5zaW9uIFR5cGUgKi8KKyNkZWZpbmUgWDg2X0NSMF9ORQkweDAwMDAwMDIwIC8qIE51bWVyaWMgRXJyb3IgKi8KKyNkZWZpbmUgWDg2X0NSMF9XUAkweDAwMDEwMDAwIC8qIFdyaXRlIFByb3RlY3QgKi8KKyNkZWZpbmUgWDg2X0NSMF9BTQkweDAwMDQwMDAwIC8qIEFsaWdubWVudCBNYXNrICovCisjZGVmaW5lIFg4Nl9DUjBfTlcJMHgyMDAwMDAwMCAvKiBOb3QgV3JpdGUtdGhyb3VnaCAqLworI2RlZmluZSBYODZfQ1IwX0NECTB4NDAwMDAwMDAgLyogQ2FjaGUgRGlzYWJsZSAqLworI2RlZmluZSBYODZfQ1IwX1BHCTB4ODAwMDAwMDAgLyogUGFnaW5nICovCisKKy8qCisgKiBQYWdpbmcgb3B0aW9ucyBpbiBDUjMKKyAqLworI2RlZmluZSBYODZfQ1IzX1BXVAkweDAwMDAwMDA4IC8qIFBhZ2UgV3JpdGUgVGhyb3VnaCAqLworI2RlZmluZSBYODZfQ1IzX1BDRAkweDAwMDAwMDEwIC8qIFBhZ2UgQ2FjaGUgRGlzYWJsZSAqLworCisvKgorICogSW50ZWwgQ1BVIGZlYXR1cmVzIGluIENSNAorICovCisjZGVmaW5lIFg4Nl9DUjRfVk1FCTB4MDAwMDAwMDEgLyogZW5hYmxlIHZtODYgZXh0ZW5zaW9ucyAqLworI2RlZmluZSBYODZfQ1I0X1BWSQkweDAwMDAwMDAyIC8qIHZpcnR1YWwgaW50ZXJydXB0cyBmbGFnIGVuYWJsZSAqLworI2RlZmluZSBYODZfQ1I0X1RTRAkweDAwMDAwMDA0IC8qIGRpc2FibGUgdGltZSBzdGFtcCBhdCBpcGwgMyAqLworI2RlZmluZSBYODZfQ1I0X0RFCTB4MDAwMDAwMDggLyogZW5hYmxlIGRlYnVnZ2luZyBleHRlbnNpb25zICovCisjZGVmaW5lIFg4Nl9DUjRfUFNFCTB4MDAwMDAwMTAgLyogZW5hYmxlIHBhZ2Ugc2l6ZSBleHRlbnNpb25zICovCisjZGVmaW5lIFg4Nl9DUjRfUEFFCTB4MDAwMDAwMjAgLyogZW5hYmxlIHBoeXNpY2FsIGFkZHJlc3MgZXh0ZW5zaW9ucyAqLworI2RlZmluZSBYODZfQ1I0X01DRQkweDAwMDAwMDQwIC8qIE1hY2hpbmUgY2hlY2sgZW5hYmxlICovCisjZGVmaW5lIFg4Nl9DUjRfUEdFCTB4MDAwMDAwODAgLyogZW5hYmxlIGdsb2JhbCBwYWdlcyAqLworI2RlZmluZSBYODZfQ1I0X1BDRQkweDAwMDAwMTAwIC8qIGVuYWJsZSBwZXJmb3JtYW5jZSBjb3VudGVycyBhdCBpcGwgMyAqLworI2RlZmluZSBYODZfQ1I0X09TRlhTUgkweDAwMDAwMjAwIC8qIGVuYWJsZSBmYXN0IEZQVSBzYXZlIGFuZCByZXN0b3JlICovCisjZGVmaW5lIFg4Nl9DUjRfT1NYTU1FWENQVCAweDAwMDAwNDAwIC8qIGVuYWJsZSB1bm1hc2tlZCBTU0UgZXhjZXB0aW9ucyAqLworI2RlZmluZSBYODZfQ1I0X1ZNWEUJMHgwMDAwMjAwMCAvKiBlbmFibGUgVk1YIHZpcnR1YWxpemF0aW9uICovCisjZGVmaW5lIFg4Nl9DUjRfUkRXUkdTRlMgMHgwMDAxMDAwMCAvKiBlbmFibGUgUkRXUkdTRlMgc3VwcG9ydCAqLworI2RlZmluZSBYODZfQ1I0X09TWFNBVkUgMHgwMDA0MDAwMCAvKiBlbmFibGUgeHNhdmUgYW5kIHhyZXN0b3JlICovCisjZGVmaW5lIFg4Nl9DUjRfU01FUAkweDAwMTAwMDAwIC8qIGVuYWJsZSBTTUVQIHN1cHBvcnQgKi8KKworLyoKKyAqIHg4Ni02NCBUYXNrIFByaW9yaXR5IFJlZ2lzdGVyLCBDUjgKKyAqLworI2RlZmluZSBYODZfQ1I4X1RQUgkweDAwMDAwMDBGIC8qIHRhc2sgcHJpb3JpdHkgcmVnaXN0ZXIgKi8KKworLyoKKyAqIEFNRCBhbmQgVHJhbnNtZXRhIHVzZSBNU1JzIGZvciBjb25maWd1cmF0aW9uOyBzZWUgPGFzbS9tc3ItaW5kZXguaD4KKyAqLworCisvKgorICogICAgICBOU0MvQ3lyaXggQ1BVIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaW5kZXhlcworICovCisjZGVmaW5lIENYODZfUENSMAkweDIwCisjZGVmaW5lIENYODZfR0NSCTB4YjgKKyNkZWZpbmUgQ1g4Nl9DQ1IwCTB4YzAKKyNkZWZpbmUgQ1g4Nl9DQ1IxCTB4YzEKKyNkZWZpbmUgQ1g4Nl9DQ1IyCTB4YzIKKyNkZWZpbmUgQ1g4Nl9DQ1IzCTB4YzMKKyNkZWZpbmUgQ1g4Nl9DQ1I0CTB4ZTgKKyNkZWZpbmUgQ1g4Nl9DQ1I1CTB4ZTkKKyNkZWZpbmUgQ1g4Nl9DQ1I2CTB4ZWEKKyNkZWZpbmUgQ1g4Nl9DQ1I3CTB4ZWIKKyNkZWZpbmUgQ1g4Nl9QQ1IxCTB4ZjAKKyNkZWZpbmUgQ1g4Nl9ESVIwCTB4ZmUKKyNkZWZpbmUgQ1g4Nl9ESVIxCTB4ZmYKKyNkZWZpbmUgQ1g4Nl9BUlJfQkFTRQkweGM0CisjZGVmaW5lIENYODZfUkNSX0JBU0UJMHhkYworCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9QUk9DRVNTT1JfRkxBR1NfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vcHRyYWNlLWFiaS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vcHRyYWNlLWFiaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMGE1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9wdHJhY2UtYWJpLmgKQEAgLTAsMCArMSw4NyBAQAorI2lmbmRlZiBfQVNNX1g4Nl9QVFJBQ0VfQUJJX0gKKyNkZWZpbmUgX0FTTV9YODZfUFRSQUNFX0FCSV9ICisKKyNpZmRlZiBfX2kzODZfXworCisjZGVmaW5lIEVCWCAwCisjZGVmaW5lIEVDWCAxCisjZGVmaW5lIEVEWCAyCisjZGVmaW5lIEVTSSAzCisjZGVmaW5lIEVESSA0CisjZGVmaW5lIEVCUCA1CisjZGVmaW5lIEVBWCA2CisjZGVmaW5lIERTIDcKKyNkZWZpbmUgRVMgOAorI2RlZmluZSBGUyA5CisjZGVmaW5lIEdTIDEwCisjZGVmaW5lIE9SSUdfRUFYIDExCisjZGVmaW5lIEVJUCAxMgorI2RlZmluZSBDUyAgMTMKKyNkZWZpbmUgRUZMIDE0CisjZGVmaW5lIFVFU1AgMTUKKyNkZWZpbmUgU1MgICAxNgorI2RlZmluZSBGUkFNRV9TSVpFIDE3CisKKyNlbHNlIC8qIF9faTM4Nl9fICovCisKKyNpZiBkZWZpbmVkKF9fQVNTRU1CTFlfXykgfHwgZGVmaW5lZChfX0ZSQU1FX09GRlNFVFMpCisjZGVmaW5lIFIxNSAwCisjZGVmaW5lIFIxNCA4CisjZGVmaW5lIFIxMyAxNgorI2RlZmluZSBSMTIgMjQKKyNkZWZpbmUgUkJQIDMyCisjZGVmaW5lIFJCWCA0MAorLyogYXJndW1lbnRzOiBpbnRlcnJ1cHRzL25vbiB0cmFjaW5nIHN5c2NhbGxzIG9ubHkgc2F2ZSB1cCB0byBoZXJlKi8KKyNkZWZpbmUgUjExIDQ4CisjZGVmaW5lIFIxMCA1NgorI2RlZmluZSBSOSA2NAorI2RlZmluZSBSOCA3MgorI2RlZmluZSBSQVggODAKKyNkZWZpbmUgUkNYIDg4CisjZGVmaW5lIFJEWCA5NgorI2RlZmluZSBSU0kgMTA0CisjZGVmaW5lIFJESSAxMTIKKyNkZWZpbmUgT1JJR19SQVggMTIwICAgICAgIC8qID0gRVJST1IgKi8KKy8qIGVuZCBvZiBhcmd1bWVudHMgKi8KKy8qIGNwdSBleGNlcHRpb24gZnJhbWUgb3IgdW5kZWZpbmVkIGluIGNhc2Ugb2YgZmFzdCBzeXNjYWxsLiAqLworI2RlZmluZSBSSVAgMTI4CisjZGVmaW5lIENTIDEzNgorI2RlZmluZSBFRkxBR1MgMTQ0CisjZGVmaW5lIFJTUCAxNTIKKyNkZWZpbmUgU1MgMTYwCisjZGVmaW5lIEFSR09GRlNFVCBSMTEKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworLyogdG9wIG9mIHN0YWNrIHBhZ2UgKi8KKyNkZWZpbmUgRlJBTUVfU0laRSAxNjgKKworI2VuZGlmIC8qICFfX2kzODZfXyAqLworCisvKiBBcmJpdHJhcmlseSBjaG9vc2UgdGhlIHNhbWUgcHRyYWNlIG51bWJlcnMgYXMgdXNlZCBieSB0aGUgU3BhcmMgY29kZS4gKi8KKyNkZWZpbmUgUFRSQUNFX0dFVFJFR1MgICAgICAgICAgICAxMgorI2RlZmluZSBQVFJBQ0VfU0VUUkVHUyAgICAgICAgICAgIDEzCisjZGVmaW5lIFBUUkFDRV9HRVRGUFJFR1MgICAgICAgICAgMTQKKyNkZWZpbmUgUFRSQUNFX1NFVEZQUkVHUyAgICAgICAgICAxNQorI2RlZmluZSBQVFJBQ0VfR0VURlBYUkVHUyAgICAgICAgIDE4CisjZGVmaW5lIFBUUkFDRV9TRVRGUFhSRUdTICAgICAgICAgMTkKKworI2RlZmluZSBQVFJBQ0VfT0xEU0VUT1BUSU9OUyAgICAgIDIxCisKKy8qIG9ubHkgdXNlZnVsIGZvciBhY2Nlc3MgMzJiaXQgcHJvZ3JhbXMgLyBrZXJuZWxzICovCisjZGVmaW5lIFBUUkFDRV9HRVRfVEhSRUFEX0FSRUEgICAgMjUKKyNkZWZpbmUgUFRSQUNFX1NFVF9USFJFQURfQVJFQSAgICAyNgorCisjaWZkZWYgX194ODZfNjRfXworIyBkZWZpbmUgUFRSQUNFX0FSQ0hfUFJDVEwJICAzMAorI2VuZGlmCisKKyNkZWZpbmUgUFRSQUNFX1NZU0VNVQkJICAzMQorI2RlZmluZSBQVFJBQ0VfU1lTRU1VX1NJTkdMRVNURVAgIDMyCisKKyNkZWZpbmUgUFRSQUNFX1NJTkdMRUJMT0NLCTMzCS8qIHJlc3VtZSBleGVjdXRpb24gdW50aWwgbmV4dCBicmFuY2ggKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2VuZGlmCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9QVFJBQ0VfQUJJX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3B0cmFjZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vcHRyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjMThlOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3B0cmFjZS5oCkBAIC0wLDAgKzEsNzQgQEAKKyNpZm5kZWYgX0FTTV9YODZfUFRSQUNFX0gKKyNkZWZpbmUgX0FTTV9YODZfUFRSQUNFX0gKKworCS8qIEZvciAqLworI2luY2x1ZGUgPGFzbS9wdHJhY2UtYWJpLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci1mbGFncy5oPgorCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpZmRlZiBfX2kzODZfXworLyogdGhpcyBzdHJ1Y3QgZGVmaW5lcyB0aGUgd2F5IHRoZSByZWdpc3RlcnMgYXJlIHN0b3JlZCBvbiB0aGUKKyAgIHN0YWNrIGR1cmluZyBhIHN5c3RlbSBjYWxsLiAqLworCisKK3N0cnVjdCBwdF9yZWdzIHsKKwlsb25nIGVieDsKKwlsb25nIGVjeDsKKwlsb25nIGVkeDsKKwlsb25nIGVzaTsKKwlsb25nIGVkaTsKKwlsb25nIGVicDsKKwlsb25nIGVheDsKKwlpbnQgIHhkczsKKwlpbnQgIHhlczsKKwlpbnQgIHhmczsKKwlpbnQgIHhnczsKKwlsb25nIG9yaWdfZWF4OworCWxvbmcgZWlwOworCWludCAgeGNzOworCWxvbmcgZWZsYWdzOworCWxvbmcgZXNwOworCWludCAgeHNzOworfTsKKworCisjZWxzZSAvKiBfX2kzODZfXyAqLworCisKK3N0cnVjdCBwdF9yZWdzIHsKKwl1bnNpZ25lZCBsb25nIHIxNTsKKwl1bnNpZ25lZCBsb25nIHIxNDsKKwl1bnNpZ25lZCBsb25nIHIxMzsKKwl1bnNpZ25lZCBsb25nIHIxMjsKKwl1bnNpZ25lZCBsb25nIHJicDsKKwl1bnNpZ25lZCBsb25nIHJieDsKKy8qIGFyZ3VtZW50czogbm9uIGludGVycnVwdHMvbm9uIHRyYWNpbmcgc3lzY2FsbHMgb25seSBzYXZlIHVwIHRvIGhlcmUqLworCXVuc2lnbmVkIGxvbmcgcjExOworCXVuc2lnbmVkIGxvbmcgcjEwOworCXVuc2lnbmVkIGxvbmcgcjk7CisJdW5zaWduZWQgbG9uZyByODsKKwl1bnNpZ25lZCBsb25nIHJheDsKKwl1bnNpZ25lZCBsb25nIHJjeDsKKwl1bnNpZ25lZCBsb25nIHJkeDsKKwl1bnNpZ25lZCBsb25nIHJzaTsKKwl1bnNpZ25lZCBsb25nIHJkaTsKKwl1bnNpZ25lZCBsb25nIG9yaWdfcmF4OworLyogZW5kIG9mIGFyZ3VtZW50cyAqLworLyogY3B1IGV4Y2VwdGlvbiBmcmFtZSBvciB1bmRlZmluZWQgKi8KKwl1bnNpZ25lZCBsb25nIHJpcDsKKwl1bnNpZ25lZCBsb25nIGNzOworCXVuc2lnbmVkIGxvbmcgZWZsYWdzOworCXVuc2lnbmVkIGxvbmcgcnNwOworCXVuc2lnbmVkIGxvbmcgc3M7CisvKiB0b3Agb2Ygc3RhY2sgcGFnZSAqLworfTsKKworI2VuZGlmIC8qICFfX2kzODZfXyAqLworCisKKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIF9BU01fWDg2X1BUUkFDRV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9yZXNvdXJjZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vcmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGJjNGRiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vcmVzb3VyY2UuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcmVzb3VyY2UuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3NlbWJ1Zi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc2VtYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1MGM4MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3NlbWJ1Zi5oCkBAIC0wLDAgKzEsMjQgQEAKKyNpZm5kZWYgX0FTTV9YODZfU0VNQlVGX0gKKyNkZWZpbmUgX0FTTV9YODZfU0VNQlVGX0gKKworLyoKKyAqIFRoZSBzZW1pZDY0X2RzIHN0cnVjdHVyZSBmb3IgeDg2IGFyY2hpdGVjdHVyZS4KKyAqIE5vdGUgZXh0cmEgcGFkZGluZyBiZWNhdXNlIHRoaXMgc3RydWN0dXJlIGlzIHBhc3NlZCBiYWNrIGFuZCBmb3J0aAorICogYmV0d2VlbiBrZXJuZWwgYW5kIHVzZXIgc3BhY2UuCisgKgorICogUGFkIHNwYWNlIGlzIGxlZnQgZm9yOgorICogLSA2NC1iaXQgdGltZV90IHRvIHNvbHZlIHkyMDM4IHByb2JsZW0KKyAqIC0gMiBtaXNjZWxsYW5lb3VzIDMyLWJpdCB2YWx1ZXMKKyAqLworc3RydWN0IHNlbWlkNjRfZHMgeworCXN0cnVjdCBpcGM2NF9wZXJtIHNlbV9wZXJtOwkvKiBwZXJtaXNzaW9ucyAuLiBzZWUgaXBjLmggKi8KKwlfX2tlcm5lbF90aW1lX3QJc2VtX290aW1lOwkvKiBsYXN0IHNlbW9wIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkMTsKKwlfX2tlcm5lbF90aW1lX3QJc2VtX2N0aW1lOwkvKiBsYXN0IGNoYW5nZSB0aW1lICovCisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDI7CisJdW5zaWduZWQgbG9uZwlzZW1fbnNlbXM7CS8qIG5vLiBvZiBzZW1hcGhvcmVzIGluIGFycmF5ICovCisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDM7CisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDQ7Cit9OworCisjZW5kaWYgLyogX0FTTV9YODZfU0VNQlVGX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3NldHVwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zZXR1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YWVmNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zZXR1cC5oCkBAIC0wLDAgKzEsNSBAQAorI2lmbmRlZiBfQVNNX1g4Nl9TRVRVUF9ICisjZGVmaW5lIF9BU01fWDg2X1NFVFVQX0gKKworCisjZW5kaWYgLyogX0FTTV9YODZfU0VUVVBfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc2htYnVmLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zaG1idWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2MwNWZjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc2htYnVmLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NobWJ1Zi5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc2lnY29udGV4dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc2lnY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOGM4Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zaWdjb250ZXh0LmgKQEAgLTAsMCArMSwyMTQgQEAKKyNpZm5kZWYgX0FTTV9YODZfU0lHQ09OVEVYVF9ICisjZGVmaW5lIF9BU01fWDg2X1NJR0NPTlRFWFRfSAorCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEZQX1hTVEFURV9NQUdJQzEJMHg0NjUwNTg1M1UKKyNkZWZpbmUgRlBfWFNUQVRFX01BR0lDMgkweDQ2NTA1ODQ1VQorI2RlZmluZSBGUF9YU1RBVEVfTUFHSUMyX1NJWkUJc2l6ZW9mKEZQX1hTVEFURV9NQUdJQzIpCisKKy8qCisgKiBieXRlcyA0NjQuLjUxMSBpbiB0aGUgY3VycmVudCA1MTJieXRlIGxheW91dCBvZiBmeHNhdmUvZnhyc3RvciBmcmFtZQorICogYXJlIHJlc2VydmVkIGZvciBTVyB1c2FnZS4gT24gY3B1J3Mgc3VwcG9ydGluZyB4c2F2ZS94cnN0b3IsIHRoZXNlIGJ5dGVzCisgKiBhcmUgdXNlZCB0byBleHRlbmRlZCB0aGUgZnBzdGF0ZSBwb2ludGVyIGluIHRoZSBzaWdjb250ZXh0LCB3aGljaCBub3cKKyAqIGluY2x1ZGVzIHRoZSBleHRlbmRlZCBzdGF0ZSBpbmZvcm1hdGlvbiBhbG9uZyB3aXRoIGZwc3RhdGUgaW5mb3JtYXRpb24uCisgKgorICogUHJlc2VuY2Ugb2YgRlBfWFNUQVRFX01BR0lDMSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgU1cgcmVzZXJ2ZWQKKyAqIGFyZWEgYW5kIEZQX1hTVEFURV9NQUdJQzIgYXQgdGhlIGVuZCBvZiBtZW1vcnkgbGF5b3V0CisgKiAoZXh0ZW5kZWRfc2l6ZSAtIEZQX1hTVEFURV9NQUdJQzJfU0laRSkgaW5kaWNhdGVzIHRoZSBwcmVzZW5jZSBvZiB0aGUKKyAqIGV4dGVuZGVkIHN0YXRlIGluZm9ybWF0aW9uIGluIHRoZSBtZW1vcnkgbGF5b3V0IHBvaW50ZWQgYnkgdGhlIGZwc3RhdGUKKyAqIHBvaW50ZXIgaW4gc2lnY29udGV4dC4KKyAqLworc3RydWN0IF9mcHhfc3dfYnl0ZXMgeworCV9fdTMyIG1hZ2ljMTsJCS8qIEZQX1hTVEFURV9NQUdJQzEgKi8KKwlfX3UzMiBleHRlbmRlZF9zaXplOwkvKiB0b3RhbCBzaXplIG9mIHRoZSBsYXlvdXQgcmVmZXJyZWQgYnkKKwkJCQkgKiBmcHN0YXRlIHBvaW50ZXIgaW4gdGhlIHNpZ2NvbnRleHQuCisJCQkJICovCisJX191NjQgeHN0YXRlX2J2OworCQkJCS8qIGZlYXR1cmUgYml0IG1hc2sgKGluY2x1ZGluZyBmcC9zc2UvZXh0ZW5kZWQKKwkJCQkgKiBzdGF0ZSkgdGhhdCBpcyBwcmVzZW50IGluIHRoZSBtZW1vcnkKKwkJCQkgKiBsYXlvdXQuCisJCQkJICovCisJX191MzIgeHN0YXRlX3NpemU7CS8qIGFjdHVhbCB4c2F2ZSBzdGF0ZSBzaXplLCBiYXNlZCBvbiB0aGUKKwkJCQkgKiBmZWF0dXJlcyBzYXZlZCBpbiB0aGUgbGF5b3V0LgorCQkJCSAqICdleHRlbmRlZF9zaXplJyB3aWxsIGJlIGdyZWF0ZXIgdGhhbgorCQkJCSAqICd4c3RhdGVfc2l6ZScuCisJCQkJICovCisJX191MzIgcGFkZGluZ1s3XTsJLyogIGZvciBmdXR1cmUgdXNlLiAqLworfTsKKworI2lmZGVmIF9faTM4Nl9fCisvKgorICogQXMgZG9jdW1lbnRlZCBpbiB0aGUgaUJDUzIgc3RhbmRhcmQuLgorICoKKyAqIFRoZSBmaXJzdCBwYXJ0IG9mICJzdHJ1Y3QgX2Zwc3RhdGUiIGlzIGp1c3QgdGhlIG5vcm1hbCBpMzg3CisgKiBoYXJkd2FyZSBzZXR1cCwgdGhlIGV4dHJhICJzdGF0dXMiIHdvcmQgaXMgdXNlZCB0byBzYXZlIHRoZQorICogY29wcm9jZXNzb3Igc3RhdHVzIHdvcmQgYmVmb3JlIGVudGVyaW5nIHRoZSBoYW5kbGVyLgorICoKKyAqIFBlbnRpdW0gSUlJIEZYU1IsIFNTRSBzdXBwb3J0CisgKglHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+LCBNYXkgMjAwMAorICoKKyAqIFRoZSBGUFUgc3RhdGUgZGF0YSBzdHJ1Y3R1cmUgaGFzIGhhZCB0byBncm93IHRvIGFjY29tbW9kYXRlIHRoZQorICogZXh0ZW5kZWQgRlBVIHN0YXRlIHJlcXVpcmVkIGJ5IHRoZSBTdHJlYW1pbmcgU0lNRCBFeHRlbnNpb25zLgorICogVGhlcmUgaXMgbm8gZG9jdW1lbnRlZCBzdGFuZGFyZCB0byBhY2NvbXBsaXNoIHRoaXMgYXQgdGhlIG1vbWVudC4KKyAqLworc3RydWN0IF9mcHJlZyB7CisJdW5zaWduZWQgc2hvcnQgc2lnbmlmaWNhbmRbNF07CisJdW5zaWduZWQgc2hvcnQgZXhwb25lbnQ7Cit9OworCitzdHJ1Y3QgX2ZweHJlZyB7CisJdW5zaWduZWQgc2hvcnQgc2lnbmlmaWNhbmRbNF07CisJdW5zaWduZWQgc2hvcnQgZXhwb25lbnQ7CisJdW5zaWduZWQgc2hvcnQgcGFkZGluZ1szXTsKK307CisKK3N0cnVjdCBfeG1tcmVnIHsKKwl1bnNpZ25lZCBsb25nIGVsZW1lbnRbNF07Cit9OworCitzdHJ1Y3QgX2Zwc3RhdGUgeworCS8qIFJlZ3VsYXIgRlBVIGVudmlyb25tZW50ICovCisJdW5zaWduZWQgbG9uZwljdzsKKwl1bnNpZ25lZCBsb25nCXN3OworCXVuc2lnbmVkIGxvbmcJdGFnOworCXVuc2lnbmVkIGxvbmcJaXBvZmY7CisJdW5zaWduZWQgbG9uZwljc3NlbDsKKwl1bnNpZ25lZCBsb25nCWRhdGFvZmY7CisJdW5zaWduZWQgbG9uZwlkYXRhc2VsOworCXN0cnVjdCBfZnByZWcJX3N0WzhdOworCXVuc2lnbmVkIHNob3J0CXN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydAltYWdpYzsJCS8qIDB4ZmZmZiA9IHJlZ3VsYXIgRlBVIGRhdGEgb25seSAqLworCisJLyogRlhTUiBGUFUgZW52aXJvbm1lbnQgKi8KKwl1bnNpZ25lZCBsb25nCV9meHNyX2Vudls2XTsJLyogRlhTUiBGUFUgZW52IGlzIGlnbm9yZWQgKi8KKwl1bnNpZ25lZCBsb25nCW14Y3NyOworCXVuc2lnbmVkIGxvbmcJcmVzZXJ2ZWQ7CisJc3RydWN0IF9mcHhyZWcJX2Z4c3Jfc3RbOF07CS8qIEZYU1IgRlBVIHJlZyBkYXRhIGlzIGlnbm9yZWQgKi8KKwlzdHJ1Y3QgX3htbXJlZwlfeG1tWzhdOworCXVuc2lnbmVkIGxvbmcJcGFkZGluZzFbNDRdOworCisJdW5pb24geworCQl1bnNpZ25lZCBsb25nCXBhZGRpbmcyWzEyXTsKKwkJc3RydWN0IF9mcHhfc3dfYnl0ZXMgc3dfcmVzZXJ2ZWQ7IC8qIHJlcHJlc2VudHMgdGhlIGV4dGVuZGVkCisJCQkJCQkgICAqIHN0YXRlIGluZm8gKi8KKwl9OworfTsKKworI2RlZmluZSBYODZfRlhTUl9NQUdJQwkJMHgwMDAwCisKKy8qCisgKiBVc2VyLXNwYWNlIG1pZ2h0IHN0aWxsIHJlbHkgb24gdGhlIG9sZCBkZWZpbml0aW9uOgorICovCitzdHJ1Y3Qgc2lnY29udGV4dCB7CisJdW5zaWduZWQgc2hvcnQgZ3MsIF9fZ3NoOworCXVuc2lnbmVkIHNob3J0IGZzLCBfX2ZzaDsKKwl1bnNpZ25lZCBzaG9ydCBlcywgX19lc2g7CisJdW5zaWduZWQgc2hvcnQgZHMsIF9fZHNoOworCXVuc2lnbmVkIGxvbmcgZWRpOworCXVuc2lnbmVkIGxvbmcgZXNpOworCXVuc2lnbmVkIGxvbmcgZWJwOworCXVuc2lnbmVkIGxvbmcgZXNwOworCXVuc2lnbmVkIGxvbmcgZWJ4OworCXVuc2lnbmVkIGxvbmcgZWR4OworCXVuc2lnbmVkIGxvbmcgZWN4OworCXVuc2lnbmVkIGxvbmcgZWF4OworCXVuc2lnbmVkIGxvbmcgdHJhcG5vOworCXVuc2lnbmVkIGxvbmcgZXJyOworCXVuc2lnbmVkIGxvbmcgZWlwOworCXVuc2lnbmVkIHNob3J0IGNzLCBfX2NzaDsKKwl1bnNpZ25lZCBsb25nIGVmbGFnczsKKwl1bnNpZ25lZCBsb25nIGVzcF9hdF9zaWduYWw7CisJdW5zaWduZWQgc2hvcnQgc3MsIF9fc3NoOworCXN0cnVjdCBfZnBzdGF0ZSAqZnBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIG9sZG1hc2s7CisJdW5zaWduZWQgbG9uZyBjcjI7Cit9OworCisjZWxzZSAvKiBfX2kzODZfXyAqLworCisvKiBGWFNBVkUgZnJhbWUgKi8KKy8qIE5vdGU6IHJlc2VydmVkMS8yIG1heSBzb21lZGF5IGNvbnRhaW4gdmFsdWFibGUgZGF0YS4gQWx3YXlzIHNhdmUvcmVzdG9yZQorICAgdGhlbSB3aGVuIHlvdSBjaGFuZ2Ugc2lnbmFsIGZyYW1lcy4gKi8KK3N0cnVjdCBfZnBzdGF0ZSB7CisJX191MTYJY3dkOworCV9fdTE2CXN3ZDsKKwlfX3UxNgl0d2Q7CQkvKiBOb3RlIHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZQorCQkJCSAgIDMyYml0L3g4Ny9GU0FWRSB0d2QgKi8KKwlfX3UxNglmb3A7CisJX191NjQJcmlwOworCV9fdTY0CXJkcDsKKwlfX3UzMglteGNzcjsKKwlfX3UzMglteGNzcl9tYXNrOworCV9fdTMyCXN0X3NwYWNlWzMyXTsJLyogOCoxNiBieXRlcyBmb3IgZWFjaCBGUC1yZWcgKi8KKwlfX3UzMgl4bW1fc3BhY2VbNjRdOwkvKiAxNioxNiBieXRlcyBmb3IgZWFjaCBYTU0tcmVnICAqLworCV9fdTMyCXJlc2VydmVkMlsxMl07CisJdW5pb24geworCQlfX3UzMglyZXNlcnZlZDNbMTJdOworCQlzdHJ1Y3QgX2ZweF9zd19ieXRlcyBzd19yZXNlcnZlZDsgLyogcmVwcmVzZW50cyB0aGUgZXh0ZW5kZWQKKwkJCQkJCSAgICogc3RhdGUgaW5mb3JtYXRpb24gKi8KKwl9OworfTsKKworLyoKKyAqIFVzZXItc3BhY2UgbWlnaHQgc3RpbGwgcmVseSBvbiB0aGUgb2xkIGRlZmluaXRpb246CisgKi8KK3N0cnVjdCBzaWdjb250ZXh0IHsKKwl1bnNpZ25lZCBsb25nIHI4OworCXVuc2lnbmVkIGxvbmcgcjk7CisJdW5zaWduZWQgbG9uZyByMTA7CisJdW5zaWduZWQgbG9uZyByMTE7CisJdW5zaWduZWQgbG9uZyByMTI7CisJdW5zaWduZWQgbG9uZyByMTM7CisJdW5zaWduZWQgbG9uZyByMTQ7CisJdW5zaWduZWQgbG9uZyByMTU7CisJdW5zaWduZWQgbG9uZyByZGk7CisJdW5zaWduZWQgbG9uZyByc2k7CisJdW5zaWduZWQgbG9uZyByYnA7CisJdW5zaWduZWQgbG9uZyByYng7CisJdW5zaWduZWQgbG9uZyByZHg7CisJdW5zaWduZWQgbG9uZyByYXg7CisJdW5zaWduZWQgbG9uZyByY3g7CisJdW5zaWduZWQgbG9uZyByc3A7CisJdW5zaWduZWQgbG9uZyByaXA7CisJdW5zaWduZWQgbG9uZyBlZmxhZ3M7CQkvKiBSRkxBR1MgKi8KKwl1bnNpZ25lZCBzaG9ydCBjczsKKwl1bnNpZ25lZCBzaG9ydCBnczsKKwl1bnNpZ25lZCBzaG9ydCBmczsKKwl1bnNpZ25lZCBzaG9ydCBfX3BhZDA7CisJdW5zaWduZWQgbG9uZyBlcnI7CisJdW5zaWduZWQgbG9uZyB0cmFwbm87CisJdW5zaWduZWQgbG9uZyBvbGRtYXNrOworCXVuc2lnbmVkIGxvbmcgY3IyOworCXN0cnVjdCBfZnBzdGF0ZSAqZnBzdGF0ZTsJLyogemVybyB3aGVuIG5vIEZQVSBjb250ZXh0ICovCisJdW5zaWduZWQgbG9uZyByZXNlcnZlZDFbOF07Cit9OworCisjZW5kaWYgLyogIV9faTM4Nl9fICovCisKK3N0cnVjdCBfeHNhdmVfaGRyIHsKKwlfX3U2NCB4c3RhdGVfYnY7CisJX191NjQgcmVzZXJ2ZWQxWzJdOworCV9fdTY0IHJlc2VydmVkMls1XTsKK307CisKK3N0cnVjdCBfeW1taF9zdGF0ZSB7CisJLyogMTYgKiAxNiBieXRlcyBmb3IgZWFjaCBZTU1ILXJlZyAqLworCV9fdTMyIHltbWhfc3BhY2VbNjRdOworfTsKKworLyoKKyAqIEV4dGVuZGVkIHN0YXRlIHBvaW50ZWQgYnkgdGhlIGZwc3RhdGUgcG9pbnRlciBpbiB0aGUgc2lnY29udGV4dC4KKyAqIEluIGFkZGl0aW9uIHRvIHRoZSBmcHN0YXRlLCBpbmZvcm1hdGlvbiBlbmNvZGVkIGluIHRoZSB4c3RhdGVfaGRyCisgKiBpbmRpY2F0ZXMgdGhlIHByZXNlbmNlIG9mIG90aGVyIGV4dGVuZGVkIHN0YXRlIGluZm9ybWF0aW9uCisgKiBzdXBwb3J0ZWQgYnkgdGhlIHByb2Nlc3NvciBhbmQgT1MuCisgKi8KK3N0cnVjdCBfeHN0YXRlIHsKKwlzdHJ1Y3QgX2Zwc3RhdGUgZnBzdGF0ZTsKKwlzdHJ1Y3QgX3hzYXZlX2hkciB4c3RhdGVfaGRyOworCXN0cnVjdCBfeW1taF9zdGF0ZSB5bW1oOworCS8qIG5ldyBwcm9jZXNzb3Igc3RhdGUgZXh0ZW5zaW9ucyBnbyBoZXJlICovCit9OworCisjZW5kaWYgLyogX0FTTV9YODZfU0lHQ09OVEVYVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zaWdjb250ZXh0MzIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3NpZ2NvbnRleHQzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMTQ3OGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zaWdjb250ZXh0MzIuaApAQCAtMCwwICsxLDc3IEBACisjaWZuZGVmIF9BU01fWDg2X1NJR0NPTlRFWFQzMl9ICisjZGVmaW5lIF9BU01fWDg2X1NJR0NPTlRFWFQzMl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBzaWduYWwgY29udGV4dCBmb3IgMzJiaXQgcHJvZ3JhbXMuICovCisKKyNkZWZpbmUgWDg2X0ZYU1JfTUFHSUMJCTB4MDAwMAorCitzdHJ1Y3QgX2ZwcmVnIHsKKwl1bnNpZ25lZCBzaG9ydCBzaWduaWZpY2FuZFs0XTsKKwl1bnNpZ25lZCBzaG9ydCBleHBvbmVudDsKK307CisKK3N0cnVjdCBfZnB4cmVnIHsKKwl1bnNpZ25lZCBzaG9ydCBzaWduaWZpY2FuZFs0XTsKKwl1bnNpZ25lZCBzaG9ydCBleHBvbmVudDsKKwl1bnNpZ25lZCBzaG9ydCBwYWRkaW5nWzNdOworfTsKKworc3RydWN0IF94bW1yZWcgeworCV9fdTMyCWVsZW1lbnRbNF07Cit9OworCisvKiBGU0FWRSBmcmFtZSB3aXRoIGV4dGVuc2lvbnMgKi8KK3N0cnVjdCBfZnBzdGF0ZV9pYTMyIHsKKwkvKiBSZWd1bGFyIEZQVSBlbnZpcm9ubWVudCAqLworCV9fdTMyIAljdzsKKwlfX3UzMglzdzsKKwlfX3UzMgl0YWc7CS8qIG5vdCBjb21wYXRpYmxlIHRvIDY0Yml0IHR3ZCAqLworCV9fdTMyCWlwb2ZmOworCV9fdTMyCWNzc2VsOworCV9fdTMyCWRhdGFvZmY7CisJX191MzIJZGF0YXNlbDsKKwlzdHJ1Y3QgX2ZwcmVnCV9zdFs4XTsKKwl1bnNpZ25lZCBzaG9ydAlzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQJbWFnaWM7CQkvKiAweGZmZmYgPSByZWd1bGFyIEZQVSBkYXRhIG9ubHkgKi8KKworCS8qIEZYU1IgRlBVIGVudmlyb25tZW50ICovCisJX191MzIJX2Z4c3JfZW52WzZdOworCV9fdTMyCW14Y3NyOworCV9fdTMyCXJlc2VydmVkOworCXN0cnVjdCBfZnB4cmVnCV9meHNyX3N0WzhdOworCXN0cnVjdCBfeG1tcmVnCV94bW1bOF07CS8qIEl0J3MgYWN0dWFsbHkgMTYgKi8KKwlfX3UzMglwYWRkaW5nWzQ0XTsKKwl1bmlvbiB7CisJCV9fdTMyIHBhZGRpbmcyWzEyXTsKKwkJc3RydWN0IF9mcHhfc3dfYnl0ZXMgc3dfcmVzZXJ2ZWQ7CisJfTsKK307CisKK3N0cnVjdCBzaWdjb250ZXh0X2lhMzIgeworICAgICAgIHVuc2lnbmVkIHNob3J0IGdzLCBfX2dzaDsKKyAgICAgICB1bnNpZ25lZCBzaG9ydCBmcywgX19mc2g7CisgICAgICAgdW5zaWduZWQgc2hvcnQgZXMsIF9fZXNoOworICAgICAgIHVuc2lnbmVkIHNob3J0IGRzLCBfX2RzaDsKKyAgICAgICB1bnNpZ25lZCBpbnQgZGk7CisgICAgICAgdW5zaWduZWQgaW50IHNpOworICAgICAgIHVuc2lnbmVkIGludCBicDsKKyAgICAgICB1bnNpZ25lZCBpbnQgc3A7CisgICAgICAgdW5zaWduZWQgaW50IGJ4OworICAgICAgIHVuc2lnbmVkIGludCBkeDsKKyAgICAgICB1bnNpZ25lZCBpbnQgY3g7CisgICAgICAgdW5zaWduZWQgaW50IGF4OworICAgICAgIHVuc2lnbmVkIGludCB0cmFwbm87CisgICAgICAgdW5zaWduZWQgaW50IGVycjsKKyAgICAgICB1bnNpZ25lZCBpbnQgaXA7CisgICAgICAgdW5zaWduZWQgc2hvcnQgY3MsIF9fY3NoOworICAgICAgIHVuc2lnbmVkIGludCBmbGFnczsKKyAgICAgICB1bnNpZ25lZCBpbnQgc3BfYXRfc2lnbmFsOworICAgICAgIHVuc2lnbmVkIHNob3J0IHNzLCBfX3NzaDsKKyAgICAgICB1bnNpZ25lZCBpbnQgZnBzdGF0ZTsJCS8qIHJlYWxseSAoc3RydWN0IF9mcHN0YXRlX2lhMzIgKikgKi8KKyAgICAgICB1bnNpZ25lZCBpbnQgb2xkbWFzazsKKyAgICAgICB1bnNpZ25lZCBpbnQgY3IyOworfTsKKworI2VuZGlmIC8qIF9BU01fWDg2X1NJR0NPTlRFWFQzMl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zaWdpbmZvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zaWdpbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMxYWE1NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3NpZ2luZm8uaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9BU01fWDg2X1NJR0lORk9fSAorI2RlZmluZSBfQVNNX1g4Nl9TSUdJTkZPX0gKKworI2lmZGVmIF9feDg2XzY0X18KKyMgZGVmaW5lIF9fQVJDSF9TSV9QUkVBTUJMRV9TSVpFCSg0ICogc2l6ZW9mKGludCkpCisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NpZ2luZm8uaD4KKworI2VuZGlmIC8qIF9BU01fWDg2X1NJR0lORk9fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc2lnbmFsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzNhMWU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc2lnbmFsLmgKQEAgLTAsMCArMSwxNDAgQEAKKyNpZm5kZWYgX0FTTV9YODZfU0lHTkFMX0gKKyNkZWZpbmUgX0FTTV9YODZfU0lHTkFMX0gKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworCisvKiBBdm9pZCB0b28gbWFueSBoZWFkZXIgb3JkZXJpbmcgcHJvYmxlbXMuICAqLworc3RydWN0IHNpZ2luZm87CisKKy8qIEhlcmUgd2UgbXVzdCBjYXRlciB0byBsaWJjcyB0aGF0IHBva2UgYWJvdXQgaW4ga2VybmVsIGhlYWRlcnMuICAqLworCisjZGVmaW5lIE5TSUcJCTMyCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgc2lnc2V0X3Q7CisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworI2RlZmluZSBTSUdIVVAJCSAxCisjZGVmaW5lIFNJR0lOVAkJIDIKKyNkZWZpbmUgU0lHUVVJVAkJIDMKKyNkZWZpbmUgU0lHSUxMCQkgNAorI2RlZmluZSBTSUdUUkFQCQkgNQorI2RlZmluZSBTSUdBQlJUCQkgNgorI2RlZmluZSBTSUdJT1QJCSA2CisjZGVmaW5lIFNJR0JVUwkJIDcKKyNkZWZpbmUgU0lHRlBFCQkgOAorI2RlZmluZSBTSUdLSUxMCQkgOQorI2RlZmluZSBTSUdVU1IxCQkxMAorI2RlZmluZSBTSUdTRUdWCQkxMQorI2RlZmluZSBTSUdVU1IyCQkxMgorI2RlZmluZSBTSUdQSVBFCQkxMworI2RlZmluZSBTSUdBTFJNCQkxNAorI2RlZmluZSBTSUdURVJNCQkxNQorI2RlZmluZSBTSUdTVEtGTFQJMTYKKyNkZWZpbmUgU0lHQ0hMRAkJMTcKKyNkZWZpbmUgU0lHQ09OVAkJMTgKKyNkZWZpbmUgU0lHU1RPUAkJMTkKKyNkZWZpbmUgU0lHVFNUUAkJMjAKKyNkZWZpbmUgU0lHVFRJTgkJMjEKKyNkZWZpbmUgU0lHVFRPVQkJMjIKKyNkZWZpbmUgU0lHVVJHCQkyMworI2RlZmluZSBTSUdYQ1BVCQkyNAorI2RlZmluZSBTSUdYRlNaCQkyNQorI2RlZmluZSBTSUdWVEFMUk0JMjYKKyNkZWZpbmUgU0lHUFJPRgkJMjcKKyNkZWZpbmUgU0lHV0lOQ0gJMjgKKyNkZWZpbmUgU0lHSU8JCTI5CisjZGVmaW5lIFNJR1BPTEwJCVNJR0lPCisvKgorI2RlZmluZSBTSUdMT1NUCQkyOQorKi8KKyNkZWZpbmUgU0lHUFdSCQkzMAorI2RlZmluZSBTSUdTWVMJCTMxCisjZGVmaW5lCVNJR1VOVVNFRAkzMQorCisvKiBUaGVzZSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgY29uc3RhbnRzIGZyb20gdXNlcmxhbmQuICAqLworI2RlZmluZSBTSUdSVE1JTgkzMgorI2RlZmluZSBTSUdSVE1BWAlfTlNJRworCisvKgorICogU0FfRkxBR1MgdmFsdWVzOgorICoKKyAqIFNBX09OU1RBQ0sgaW5kaWNhdGVzIHRoYXQgYSByZWdpc3RlcmVkIHN0YWNrX3Qgd2lsbCBiZSB1c2VkLgorICogU0FfUkVTVEFSVCBmbGFnIHRvIGdldCByZXN0YXJ0aW5nIHNpZ25hbHMgKHdoaWNoIHdlcmUgdGhlIGRlZmF1bHQgbG9uZyBhZ28pCisgKiBTQV9OT0NMRFNUT1AgZmxhZyB0byB0dXJuIG9mZiBTSUdDSExEIHdoZW4gY2hpbGRyZW4gc3RvcC4KKyAqIFNBX1JFU0VUSEFORCBjbGVhcnMgdGhlIGhhbmRsZXIgd2hlbiB0aGUgc2lnbmFsIGlzIGRlbGl2ZXJlZC4KKyAqIFNBX05PQ0xEV0FJVCBmbGFnIG9uIFNJR0NITEQgdG8gaW5oaWJpdCB6b21iaWVzLgorICogU0FfTk9ERUZFUiBwcmV2ZW50cyB0aGUgY3VycmVudCBzaWduYWwgZnJvbSBiZWluZyBtYXNrZWQgaW4gdGhlIGhhbmRsZXIuCisgKgorICogU0FfT05FU0hPVCBhbmQgU0FfTk9NQVNLIGFyZSB0aGUgaGlzdG9yaWNhbCBMaW51eCBuYW1lcyBmb3IgdGhlIFNpbmdsZQorICogVW5peCBuYW1lcyBSRVNFVEhBTkQgYW5kIE5PREVGRVIgcmVzcGVjdGl2ZWx5LgorICovCisjZGVmaW5lIFNBX05PQ0xEU1RPUAkweDAwMDAwMDAxdQorI2RlZmluZSBTQV9OT0NMRFdBSVQJMHgwMDAwMDAwMnUKKyNkZWZpbmUgU0FfU0lHSU5GTwkweDAwMDAwMDA0dQorI2RlZmluZSBTQV9PTlNUQUNLCTB4MDgwMDAwMDB1CisjZGVmaW5lIFNBX1JFU1RBUlQJMHgxMDAwMDAwMHUKKyNkZWZpbmUgU0FfTk9ERUZFUgkweDQwMDAwMDAwdQorI2RlZmluZSBTQV9SRVNFVEhBTkQJMHg4MDAwMDAwMHUKKworI2RlZmluZSBTQV9OT01BU0sJU0FfTk9ERUZFUgorI2RlZmluZSBTQV9PTkVTSE9UCVNBX1JFU0VUSEFORAorCisjZGVmaW5lIFNBX1JFU1RPUkVSCTB4MDQwMDAwMDAKKworLyoKKyAqIHNpZ2FsdHN0YWNrIGNvbnRyb2xzCisgKi8KKyNkZWZpbmUgU1NfT05TVEFDSwkxCisjZGVmaW5lIFNTX0RJU0FCTEUJMgorCisjZGVmaW5lIE1JTlNJR1NUS1NaCTIwNDgKKyNkZWZpbmUgU0lHU1RLU1oJODE5MgorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2lnbmFsLWRlZnMuaD4KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworCisjaWZkZWYgX19pMzg2X18KKy8qIEhlcmUgd2UgbXVzdCBjYXRlciB0byBsaWJjcyB0aGF0IHBva2UgYWJvdXQgaW4ga2VybmVsIGhlYWRlcnMuICAqLworCitzdHJ1Y3Qgc2lnYWN0aW9uIHsKKwl1bmlvbiB7CisJICBfX3NpZ2hhbmRsZXJfdCBfc2FfaGFuZGxlcjsKKwkgIHZvaWQgKCpfc2Ffc2lnYWN0aW9uKShpbnQsIHN0cnVjdCBzaWdpbmZvICosIHZvaWQgKik7CisJfSBfdTsKKwlzaWdzZXRfdCBzYV9tYXNrOworCXVuc2lnbmVkIGxvbmcgc2FfZmxhZ3M7CisJdm9pZCAoKnNhX3Jlc3RvcmVyKSh2b2lkKTsKK307CisKKyNkZWZpbmUgc2FfaGFuZGxlcglfdS5fc2FfaGFuZGxlcgorI2RlZmluZSBzYV9zaWdhY3Rpb24JX3UuX3NhX3NpZ2FjdGlvbgorCisjZWxzZSAvKiBfX2kzODZfXyAqLworCitzdHJ1Y3Qgc2lnYWN0aW9uIHsKKwlfX3NpZ2hhbmRsZXJfdCBzYV9oYW5kbGVyOworCXVuc2lnbmVkIGxvbmcgc2FfZmxhZ3M7CisJX19zaWdyZXN0b3JlX3Qgc2FfcmVzdG9yZXI7CisJc2lnc2V0X3Qgc2FfbWFzazsJCS8qIG1hc2sgbGFzdCBmb3IgZXh0ZW5zaWJpbGl0eSAqLworfTsKKworc3RydWN0IGtfc2lnYWN0aW9uIHsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIHNhOworfTsKKworI2VuZGlmIC8qICFfX2kzODZfXyAqLworCit0eXBlZGVmIHN0cnVjdCBzaWdhbHRzdGFjayB7CisJdm9pZCAqc3Nfc3A7CisJaW50IHNzX2ZsYWdzOworCXNpemVfdCBzc19zaXplOworfSBzdGFja190OworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9TSUdOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc29ja2V0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjcxMzg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc29ja2V0LmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NvY2tldC5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc29ja2lvcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc29ja2lvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZjZkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zb2NraW9zLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NvY2tpb3MuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3N0YXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3N0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGIxZDliCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc3RhdC5oCkBAIC0wLDAgKzEsMTE0IEBACisjaWZuZGVmIF9BU01fWDg2X1NUQVRfSAorI2RlZmluZSBfQVNNX1g4Nl9TVEFUX0gKKworI2RlZmluZSBTVEFUX0hBVkVfTlNFQyAxCisKKyNpZmRlZiBfX2kzODZfXworc3RydWN0IHN0YXQgeworCXVuc2lnbmVkIGxvbmcgIHN0X2RldjsKKwl1bnNpZ25lZCBsb25nICBzdF9pbm87CisJdW5zaWduZWQgc2hvcnQgc3RfbW9kZTsKKwl1bnNpZ25lZCBzaG9ydCBzdF9ubGluazsKKwl1bnNpZ25lZCBzaG9ydCBzdF91aWQ7CisJdW5zaWduZWQgc2hvcnQgc3RfZ2lkOworCXVuc2lnbmVkIGxvbmcgIHN0X3JkZXY7CisJdW5zaWduZWQgbG9uZyAgc3Rfc2l6ZTsKKwl1bnNpZ25lZCBsb25nICBzdF9ibGtzaXplOworCXVuc2lnbmVkIGxvbmcgIHN0X2Jsb2NrczsKKwl1bnNpZ25lZCBsb25nICBzdF9hdGltZTsKKwl1bnNpZ25lZCBsb25nICBzdF9hdGltZV9uc2VjOworCXVuc2lnbmVkIGxvbmcgIHN0X210aW1lOworCXVuc2lnbmVkIGxvbmcgIHN0X210aW1lX25zZWM7CisJdW5zaWduZWQgbG9uZyAgc3RfY3RpbWU7CisJdW5zaWduZWQgbG9uZyAgc3RfY3RpbWVfbnNlYzsKKwl1bnNpZ25lZCBsb25nICBfX3VudXNlZDQ7CisJdW5zaWduZWQgbG9uZyAgX191bnVzZWQ1OworfTsKKworI2RlZmluZSBTVEFUNjRfSEFTX0JST0tFTl9TVF9JTk8JMQorCisvKiBUaGlzIG1hdGNoZXMgc3RydWN0IHN0YXQ2NCBpbiBnbGliYzIuMSwgaGVuY2UgdGhlIGFic29sdXRlbHkKKyAqIGluc2FuZSBhbW91bnRzIG9mIHBhZGRpbmcgYXJvdW5kIGRldl90J3MuCisgKi8KK3N0cnVjdCBzdGF0NjQgeworCXVuc2lnbmVkIGxvbmcgbG9uZwlzdF9kZXY7CisJdW5zaWduZWQgY2hhcglfX3BhZDBbNF07CisKKwl1bnNpZ25lZCBsb25nCV9fc3RfaW5vOworCisJdW5zaWduZWQgaW50CXN0X21vZGU7CisJdW5zaWduZWQgaW50CXN0X25saW5rOworCisJdW5zaWduZWQgbG9uZwlzdF91aWQ7CisJdW5zaWduZWQgbG9uZwlzdF9naWQ7CisKKwl1bnNpZ25lZCBsb25nIGxvbmcJc3RfcmRldjsKKwl1bnNpZ25lZCBjaGFyCV9fcGFkM1s0XTsKKworCWxvbmcgbG9uZwlzdF9zaXplOworCXVuc2lnbmVkIGxvbmcJc3RfYmxrc2l6ZTsKKworCS8qIE51bWJlciA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAqLworCXVuc2lnbmVkIGxvbmcgbG9uZwlzdF9ibG9ja3M7CisKKwl1bnNpZ25lZCBsb25nCXN0X2F0aW1lOworCXVuc2lnbmVkIGxvbmcJc3RfYXRpbWVfbnNlYzsKKworCXVuc2lnbmVkIGxvbmcJc3RfbXRpbWU7CisJdW5zaWduZWQgaW50CXN0X210aW1lX25zZWM7CisKKwl1bnNpZ25lZCBsb25nCXN0X2N0aW1lOworCXVuc2lnbmVkIGxvbmcJc3RfY3RpbWVfbnNlYzsKKworCXVuc2lnbmVkIGxvbmcgbG9uZwlzdF9pbm87Cit9OworCisjZWxzZSAvKiBfX2kzODZfXyAqLworCitzdHJ1Y3Qgc3RhdCB7CisJdW5zaWduZWQgbG9uZwlzdF9kZXY7CisJdW5zaWduZWQgbG9uZwlzdF9pbm87CisJdW5zaWduZWQgbG9uZwlzdF9ubGluazsKKworCXVuc2lnbmVkIGludAlzdF9tb2RlOworCXVuc2lnbmVkIGludAlzdF91aWQ7CisJdW5zaWduZWQgaW50CXN0X2dpZDsKKwl1bnNpZ25lZCBpbnQJX19wYWQwOworCXVuc2lnbmVkIGxvbmcJc3RfcmRldjsKKwlsb25nCQlzdF9zaXplOworCWxvbmcJCXN0X2Jsa3NpemU7CisJbG9uZwkJc3RfYmxvY2tzOwkvKiBOdW1iZXIgNTEyLWJ5dGUgYmxvY2tzIGFsbG9jYXRlZC4gKi8KKworCXVuc2lnbmVkIGxvbmcJc3RfYXRpbWU7CisJdW5zaWduZWQgbG9uZwlzdF9hdGltZV9uc2VjOworCXVuc2lnbmVkIGxvbmcJc3RfbXRpbWU7CisJdW5zaWduZWQgbG9uZwlzdF9tdGltZV9uc2VjOworCXVuc2lnbmVkIGxvbmcJc3RfY3RpbWU7CisJdW5zaWduZWQgbG9uZyAgIHN0X2N0aW1lX25zZWM7CisJbG9uZwkJX191bnVzZWRbM107Cit9OworI2VuZGlmCisKKy8qIGZvciAzMmJpdCBlbXVsYXRpb24gYW5kIDMyIGJpdCBrZXJuZWxzICovCitzdHJ1Y3QgX19vbGRfa2VybmVsX3N0YXQgeworCXVuc2lnbmVkIHNob3J0IHN0X2RldjsKKwl1bnNpZ25lZCBzaG9ydCBzdF9pbm87CisJdW5zaWduZWQgc2hvcnQgc3RfbW9kZTsKKwl1bnNpZ25lZCBzaG9ydCBzdF9ubGluazsKKwl1bnNpZ25lZCBzaG9ydCBzdF91aWQ7CisJdW5zaWduZWQgc2hvcnQgc3RfZ2lkOworCXVuc2lnbmVkIHNob3J0IHN0X3JkZXY7CisjaWZkZWYgX19pMzg2X18KKwl1bnNpZ25lZCBsb25nICBzdF9zaXplOworCXVuc2lnbmVkIGxvbmcgIHN0X2F0aW1lOworCXVuc2lnbmVkIGxvbmcgIHN0X210aW1lOworCXVuc2lnbmVkIGxvbmcgIHN0X2N0aW1lOworI2Vsc2UKKwl1bnNpZ25lZCBpbnQgIHN0X3NpemU7CisJdW5zaWduZWQgaW50ICBzdF9hdGltZTsKKwl1bnNpZ25lZCBpbnQgIHN0X210aW1lOworCXVuc2lnbmVkIGludCAgc3RfY3RpbWU7CisjZW5kaWYKK307CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9TVEFUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3N0YXRmcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc3RhdGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQwYWRiZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3N0YXRmcy5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9YODZfU1RBVEZTX0gKKyNkZWZpbmUgX0FTTV9YODZfU1RBVEZTX0gKKworLyoKKyAqIFdlIG5lZWQgY29tcGF0X3N0YXRmczY0IHRvIGJlIHBhY2tlZCwgYmVjYXVzZSB0aGUgaTM4NiBBQkkgd29uJ3QKKyAqIGFkZCBwYWRkaW5nIGF0IHRoZSBlbmQgdG8gYnJpbmcgaXQgdG8gYSBtdWx0aXBsZSBvZiA4IGJ5dGVzLCBidXQKKyAqIHRoZSB4ODZfNjQgQUJJIHdpbGwuCisgKi8KKyNkZWZpbmUgQVJDSF9QQUNLX0NPTVBBVF9TVEFURlM2NCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsYWxpZ25lZCg0KSkpCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zdGF0ZnMuaD4KKyNlbmRpZiAvKiBfQVNNX1g4Nl9TVEFURlNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc3dhYi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MzY1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS9zd2FiLmgKQEAgLTAsMCArMSw2MSBAQAorI2lmbmRlZiBfQVNNX1g4Nl9TV0FCX0gKKyNkZWZpbmUgX0FTTV9YODZfU1dBQl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgdmFsKQoreworI2lmZGVmIF9faTM4Nl9fCisjIGlmZGVmIENPTkZJR19YODZfQlNXQVAKKwlfX2FzbV9fKCJic3dhcCAlMCIgOiAiPXIiICh2YWwpIDogIjAiICh2YWwpKTsKKyMgZWxzZQorCV9fYXNtX18oInhjaGdiICViMCwlaDBcblx0IgkvKiBzd2FwIGxvd2VyIGJ5dGVzCSovCisJICAgICJyb3JsICQxNiwlMFxuXHQiCS8qIHN3YXAgd29yZHMJCSovCisJICAgICJ4Y2hnYiAlYjAsJWgwIgkvKiBzd2FwIGhpZ2hlciBieXRlcwkqLworCSAgICA6ICI9cSIgKHZhbCkKKwkgICAgOiAiMCIgKHZhbCkpOworIyBlbmRpZgorCisjZWxzZSAvKiBfX2kzODZfXyAqLworCV9fYXNtX18oImJzd2FwbCAlMCIKKwkgICAgOiAiPXIiICh2YWwpCisJICAgIDogIjAiICh2YWwpKTsKKyNlbmRpZgorCXJldHVybiB2YWw7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgorCitzdGF0aWMgX19pbmxpbmVfXyBfX3U2NCBfX2FyY2hfc3dhYjY0KF9fdTY0IHZhbCkKK3sKKyNpZmRlZiBfX2kzODZfXworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTMyIGE7CisJCQlfX3UzMiBiOworCQl9IHM7CisJCV9fdTY0IHU7CisJfSB2OworCXYudSA9IHZhbDsKKyMgaWZkZWYgQ09ORklHX1g4Nl9CU1dBUAorCV9fYXNtX18oImJzd2FwbCAlMCA7IGJzd2FwbCAlMSA7IHhjaGdsICUwLCUxIgorCSAgICA6ICI9ciIgKHYucy5hKSwgIj1yIiAodi5zLmIpCisJICAgIDogIjAiICh2LnMuYSksICIxIiAodi5zLmIpKTsKKyMgZWxzZQorCXYucy5hID0gX19hcmNoX3N3YWIzMih2LnMuYSk7CisJdi5zLmIgPSBfX2FyY2hfc3dhYjMyKHYucy5iKTsKKwlfX2FzbV9fKCJ4Y2hnbCAlMCwlMSIKKwkgICAgOiAiPXIiICh2LnMuYSksICI9ciIgKHYucy5iKQorCSAgICA6ICIwIiAodi5zLmEpLCAiMSIgKHYucy5iKSk7CisjIGVuZGlmCisJcmV0dXJuIHYudTsKKyNlbHNlIC8qIF9faTM4Nl9fICovCisJX19hc21fXygiYnN3YXBxICUwIgorCSAgICA6ICI9ciIgKHZhbCkKKwkgICAgOiAiMCIgKHZhbCkpOworCXJldHVybiB2YWw7CisjZW5kaWYKK30KKyNkZWZpbmUgX19hcmNoX3N3YWI2NCBfX2FyY2hfc3dhYjY0CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3Rlcm1iaXRzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS90ZXJtYml0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MzViMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS90ZXJtYml0cy5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy90ZXJtYml0cy5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vdGVybWlvcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vdGVybWlvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MGQ3OGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS90ZXJtaW9zLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3Rlcm1pb3MuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3R5cGVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOGMyM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS90eXBlcy5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfQVNNX1g4Nl9UWVBFU19ICisjZGVmaW5lIF9BU01fWDg2X1RZUEVTX0gKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3R5cGVzLmg+CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9UWVBFU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS91Y29udGV4dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vdWNvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2MyOWM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vdWNvbnRleHQuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fWDg2X1VDT05URVhUX0gKKyNkZWZpbmUgX0FTTV9YODZfVUNPTlRFWFRfSAorCisjZGVmaW5lIFVDX0ZQX1hTVEFURQkweDEJLyogaW5kaWNhdGVzIHRoZSBwcmVzZW5jZSBvZiBleHRlbmRlZCBzdGF0ZQorCQkJCSAqIGluZm9ybWF0aW9uIGluIHRoZSBtZW1vcnkgbGF5b3V0IHBvaW50ZWQKKwkJCQkgKiBieSB0aGUgZnBzdGF0ZSBwb2ludGVyIGluIHRoZSB1Y29udGV4dCdzCisJCQkJICogc2lnY29udGV4dCBzdHJ1Y3QgKHVjX21jb250ZXh0KS4KKwkJCQkgKi8KKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3Vjb250ZXh0Lmg+CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9VQ09OVEVYVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS91bmlzdGQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3VuaXN0ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZWQ5MTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS91bmlzdGQuaApAQCAtMCwwICsxLDUgQEAKKyMgaWZkZWYgX19pMzg2X18KKyMgIGluY2x1ZGUgPGFzbS91bmlzdGRfMzIuaD4KKyMgZWxzZQorIyAgaW5jbHVkZSA8YXNtL3VuaXN0ZF82NC5oPgorIyBlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vdW5pc3RkXzMyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS91bmlzdGRfMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjk3OTgwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vdW5pc3RkXzMyLmgKQEAgLTAsMCArMSwzNTggQEAKKyNpZm5kZWYgX0FTTV9YODZfVU5JU1REXzMyX0gKKyNkZWZpbmUgX0FTTV9YODZfVU5JU1REXzMyX0gKKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3lzdGVtIGNhbGwgbnVtYmVycy4KKyAqLworCisjZGVmaW5lIF9fTlJfcmVzdGFydF9zeXNjYWxsICAgICAgMAorI2RlZmluZSBfX05SX2V4aXQJCSAgMQorI2RlZmluZSBfX05SX2ZvcmsJCSAgMgorI2RlZmluZSBfX05SX3JlYWQJCSAgMworI2RlZmluZSBfX05SX3dyaXRlCQkgIDQKKyNkZWZpbmUgX19OUl9vcGVuCQkgIDUKKyNkZWZpbmUgX19OUl9jbG9zZQkJICA2CisjZGVmaW5lIF9fTlJfd2FpdHBpZAkJICA3CisjZGVmaW5lIF9fTlJfY3JlYXQJCSAgOAorI2RlZmluZSBfX05SX2xpbmsJCSAgOQorI2RlZmluZSBfX05SX3VubGluawkJIDEwCisjZGVmaW5lIF9fTlJfZXhlY3ZlCQkgMTEKKyNkZWZpbmUgX19OUl9jaGRpcgkJIDEyCisjZGVmaW5lIF9fTlJfdGltZQkJIDEzCisjZGVmaW5lIF9fTlJfbWtub2QJCSAxNAorI2RlZmluZSBfX05SX2NobW9kCQkgMTUKKyNkZWZpbmUgX19OUl9sY2hvd24JCSAxNgorI2RlZmluZSBfX05SX2JyZWFrCQkgMTcKKyNkZWZpbmUgX19OUl9vbGRzdGF0CQkgMTgKKyNkZWZpbmUgX19OUl9sc2VlawkJIDE5CisjZGVmaW5lIF9fTlJfZ2V0cGlkCQkgMjAKKyNkZWZpbmUgX19OUl9tb3VudAkJIDIxCisjZGVmaW5lIF9fTlJfdW1vdW50CQkgMjIKKyNkZWZpbmUgX19OUl9zZXR1aWQJCSAyMworI2RlZmluZSBfX05SX2dldHVpZAkJIDI0CisjZGVmaW5lIF9fTlJfc3RpbWUJCSAyNQorI2RlZmluZSBfX05SX3B0cmFjZQkJIDI2CisjZGVmaW5lIF9fTlJfYWxhcm0JCSAyNworI2RlZmluZSBfX05SX29sZGZzdGF0CQkgMjgKKyNkZWZpbmUgX19OUl9wYXVzZQkJIDI5CisjZGVmaW5lIF9fTlJfdXRpbWUJCSAzMAorI2RlZmluZSBfX05SX3N0dHkJCSAzMQorI2RlZmluZSBfX05SX2d0dHkJCSAzMgorI2RlZmluZSBfX05SX2FjY2VzcwkJIDMzCisjZGVmaW5lIF9fTlJfbmljZQkJIDM0CisjZGVmaW5lIF9fTlJfZnRpbWUJCSAzNQorI2RlZmluZSBfX05SX3N5bmMJCSAzNgorI2RlZmluZSBfX05SX2tpbGwJCSAzNworI2RlZmluZSBfX05SX3JlbmFtZQkJIDM4CisjZGVmaW5lIF9fTlJfbWtkaXIJCSAzOQorI2RlZmluZSBfX05SX3JtZGlyCQkgNDAKKyNkZWZpbmUgX19OUl9kdXAJCSA0MQorI2RlZmluZSBfX05SX3BpcGUJCSA0MgorI2RlZmluZSBfX05SX3RpbWVzCQkgNDMKKyNkZWZpbmUgX19OUl9wcm9mCQkgNDQKKyNkZWZpbmUgX19OUl9icmsJCSA0NQorI2RlZmluZSBfX05SX3NldGdpZAkJIDQ2CisjZGVmaW5lIF9fTlJfZ2V0Z2lkCQkgNDcKKyNkZWZpbmUgX19OUl9zaWduYWwJCSA0OAorI2RlZmluZSBfX05SX2dldGV1aWQJCSA0OQorI2RlZmluZSBfX05SX2dldGVnaWQJCSA1MAorI2RlZmluZSBfX05SX2FjY3QJCSA1MQorI2RlZmluZSBfX05SX3Vtb3VudDIJCSA1MgorI2RlZmluZSBfX05SX2xvY2sJCSA1MworI2RlZmluZSBfX05SX2lvY3RsCQkgNTQKKyNkZWZpbmUgX19OUl9mY250bAkJIDU1CisjZGVmaW5lIF9fTlJfbXB4CQkgNTYKKyNkZWZpbmUgX19OUl9zZXRwZ2lkCQkgNTcKKyNkZWZpbmUgX19OUl91bGltaXQJCSA1OAorI2RlZmluZSBfX05SX29sZG9sZHVuYW1lCSA1OQorI2RlZmluZSBfX05SX3VtYXNrCQkgNjAKKyNkZWZpbmUgX19OUl9jaHJvb3QJCSA2MQorI2RlZmluZSBfX05SX3VzdGF0CQkgNjIKKyNkZWZpbmUgX19OUl9kdXAyCQkgNjMKKyNkZWZpbmUgX19OUl9nZXRwcGlkCQkgNjQKKyNkZWZpbmUgX19OUl9nZXRwZ3JwCQkgNjUKKyNkZWZpbmUgX19OUl9zZXRzaWQJCSA2NgorI2RlZmluZSBfX05SX3NpZ2FjdGlvbgkJIDY3CisjZGVmaW5lIF9fTlJfc2dldG1hc2sJCSA2OAorI2RlZmluZSBfX05SX3NzZXRtYXNrCQkgNjkKKyNkZWZpbmUgX19OUl9zZXRyZXVpZAkJIDcwCisjZGVmaW5lIF9fTlJfc2V0cmVnaWQJCSA3MQorI2RlZmluZSBfX05SX3NpZ3N1c3BlbmQJCSA3MgorI2RlZmluZSBfX05SX3NpZ3BlbmRpbmcJCSA3MworI2RlZmluZSBfX05SX3NldGhvc3RuYW1lCSA3NAorI2RlZmluZSBfX05SX3NldHJsaW1pdAkJIDc1CisjZGVmaW5lIF9fTlJfZ2V0cmxpbWl0CQkgNzYgICAvKiBCYWNrIGNvbXBhdGlibGUgMkdpZyBsaW1pdGVkIHJsaW1pdCAqLworI2RlZmluZSBfX05SX2dldHJ1c2FnZQkJIDc3CisjZGVmaW5lIF9fTlJfZ2V0dGltZW9mZGF5CSA3OAorI2RlZmluZSBfX05SX3NldHRpbWVvZmRheQkgNzkKKyNkZWZpbmUgX19OUl9nZXRncm91cHMJCSA4MAorI2RlZmluZSBfX05SX3NldGdyb3VwcwkJIDgxCisjZGVmaW5lIF9fTlJfc2VsZWN0CQkgODIKKyNkZWZpbmUgX19OUl9zeW1saW5rCQkgODMKKyNkZWZpbmUgX19OUl9vbGRsc3RhdAkJIDg0CisjZGVmaW5lIF9fTlJfcmVhZGxpbmsJCSA4NQorI2RlZmluZSBfX05SX3VzZWxpYgkJIDg2CisjZGVmaW5lIF9fTlJfc3dhcG9uCQkgODcKKyNkZWZpbmUgX19OUl9yZWJvb3QJCSA4OAorI2RlZmluZSBfX05SX3JlYWRkaXIJCSA4OQorI2RlZmluZSBfX05SX21tYXAJCSA5MAorI2RlZmluZSBfX05SX211bm1hcAkJIDkxCisjZGVmaW5lIF9fTlJfdHJ1bmNhdGUJCSA5MgorI2RlZmluZSBfX05SX2Z0cnVuY2F0ZQkJIDkzCisjZGVmaW5lIF9fTlJfZmNobW9kCQkgOTQKKyNkZWZpbmUgX19OUl9mY2hvd24JCSA5NQorI2RlZmluZSBfX05SX2dldHByaW9yaXR5CSA5NgorI2RlZmluZSBfX05SX3NldHByaW9yaXR5CSA5NworI2RlZmluZSBfX05SX3Byb2ZpbAkJIDk4CisjZGVmaW5lIF9fTlJfc3RhdGZzCQkgOTkKKyNkZWZpbmUgX19OUl9mc3RhdGZzCQkxMDAKKyNkZWZpbmUgX19OUl9pb3Blcm0JCTEwMQorI2RlZmluZSBfX05SX3NvY2tldGNhbGwJCTEwMgorI2RlZmluZSBfX05SX3N5c2xvZwkJMTAzCisjZGVmaW5lIF9fTlJfc2V0aXRpbWVyCQkxMDQKKyNkZWZpbmUgX19OUl9nZXRpdGltZXIJCTEwNQorI2RlZmluZSBfX05SX3N0YXQJCTEwNgorI2RlZmluZSBfX05SX2xzdGF0CQkxMDcKKyNkZWZpbmUgX19OUl9mc3RhdAkJMTA4CisjZGVmaW5lIF9fTlJfb2xkdW5hbWUJCTEwOQorI2RlZmluZSBfX05SX2lvcGwJCTExMAorI2RlZmluZSBfX05SX3ZoYW5ndXAJCTExMQorI2RlZmluZSBfX05SX2lkbGUJCTExMgorI2RlZmluZSBfX05SX3ZtODZvbGQJCTExMworI2RlZmluZSBfX05SX3dhaXQ0CQkxMTQKKyNkZWZpbmUgX19OUl9zd2Fwb2ZmCQkxMTUKKyNkZWZpbmUgX19OUl9zeXNpbmZvCQkxMTYKKyNkZWZpbmUgX19OUl9pcGMJCTExNworI2RlZmluZSBfX05SX2ZzeW5jCQkxMTgKKyNkZWZpbmUgX19OUl9zaWdyZXR1cm4JCTExOQorI2RlZmluZSBfX05SX2Nsb25lCQkxMjAKKyNkZWZpbmUgX19OUl9zZXRkb21haW5uYW1lCTEyMQorI2RlZmluZSBfX05SX3VuYW1lCQkxMjIKKyNkZWZpbmUgX19OUl9tb2RpZnlfbGR0CQkxMjMKKyNkZWZpbmUgX19OUl9hZGp0aW1leAkJMTI0CisjZGVmaW5lIF9fTlJfbXByb3RlY3QJCTEyNQorI2RlZmluZSBfX05SX3NpZ3Byb2NtYXNrCTEyNgorI2RlZmluZSBfX05SX2NyZWF0ZV9tb2R1bGUJMTI3CisjZGVmaW5lIF9fTlJfaW5pdF9tb2R1bGUJMTI4CisjZGVmaW5lIF9fTlJfZGVsZXRlX21vZHVsZQkxMjkKKyNkZWZpbmUgX19OUl9nZXRfa2VybmVsX3N5bXMJMTMwCisjZGVmaW5lIF9fTlJfcXVvdGFjdGwJCTEzMQorI2RlZmluZSBfX05SX2dldHBnaWQJCTEzMgorI2RlZmluZSBfX05SX2ZjaGRpcgkJMTMzCisjZGVmaW5lIF9fTlJfYmRmbHVzaAkJMTM0CisjZGVmaW5lIF9fTlJfc3lzZnMJCTEzNQorI2RlZmluZSBfX05SX3BlcnNvbmFsaXR5CTEzNgorI2RlZmluZSBfX05SX2Fmc19zeXNjYWxsCTEzNyAvKiBTeXNjYWxsIGZvciBBbmRyZXcgRmlsZSBTeXN0ZW0gKi8KKyNkZWZpbmUgX19OUl9zZXRmc3VpZAkJMTM4CisjZGVmaW5lIF9fTlJfc2V0ZnNnaWQJCTEzOQorI2RlZmluZSBfX05SX19sbHNlZWsJCTE0MAorI2RlZmluZSBfX05SX2dldGRlbnRzCQkxNDEKKyNkZWZpbmUgX19OUl9fbmV3c2VsZWN0CQkxNDIKKyNkZWZpbmUgX19OUl9mbG9jawkJMTQzCisjZGVmaW5lIF9fTlJfbXN5bmMJCTE0NAorI2RlZmluZSBfX05SX3JlYWR2CQkxNDUKKyNkZWZpbmUgX19OUl93cml0ZXYJCTE0NgorI2RlZmluZSBfX05SX2dldHNpZAkJMTQ3CisjZGVmaW5lIF9fTlJfZmRhdGFzeW5jCQkxNDgKKyNkZWZpbmUgX19OUl9fc3lzY3RsCQkxNDkKKyNkZWZpbmUgX19OUl9tbG9jawkJMTUwCisjZGVmaW5lIF9fTlJfbXVubG9jawkJMTUxCisjZGVmaW5lIF9fTlJfbWxvY2thbGwJCTE1MgorI2RlZmluZSBfX05SX211bmxvY2thbGwJCTE1MworI2RlZmluZSBfX05SX3NjaGVkX3NldHBhcmFtCQkxNTQKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRwYXJhbQkJMTU1CisjZGVmaW5lIF9fTlJfc2NoZWRfc2V0c2NoZWR1bGVyCQkxNTYKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRzY2hlZHVsZXIJCTE1NworI2RlZmluZSBfX05SX3NjaGVkX3lpZWxkCQkxNTgKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRfcHJpb3JpdHlfbWF4CTE1OQorI2RlZmluZSBfX05SX3NjaGVkX2dldF9wcmlvcml0eV9taW4JMTYwCisjZGVmaW5lIF9fTlJfc2NoZWRfcnJfZ2V0X2ludGVydmFsCTE2MQorI2RlZmluZSBfX05SX25hbm9zbGVlcAkJMTYyCisjZGVmaW5lIF9fTlJfbXJlbWFwCQkxNjMKKyNkZWZpbmUgX19OUl9zZXRyZXN1aWQJCTE2NAorI2RlZmluZSBfX05SX2dldHJlc3VpZAkJMTY1CisjZGVmaW5lIF9fTlJfdm04NgkJMTY2CisjZGVmaW5lIF9fTlJfcXVlcnlfbW9kdWxlCTE2NworI2RlZmluZSBfX05SX3BvbGwJCTE2OAorI2RlZmluZSBfX05SX25mc3NlcnZjdGwJCTE2OQorI2RlZmluZSBfX05SX3NldHJlc2dpZAkJMTcwCisjZGVmaW5lIF9fTlJfZ2V0cmVzZ2lkCQkxNzEKKyNkZWZpbmUgX19OUl9wcmN0bCAgICAgICAgICAgICAgMTcyCisjZGVmaW5lIF9fTlJfcnRfc2lncmV0dXJuCTE3MworI2RlZmluZSBfX05SX3J0X3NpZ2FjdGlvbgkxNzQKKyNkZWZpbmUgX19OUl9ydF9zaWdwcm9jbWFzawkxNzUKKyNkZWZpbmUgX19OUl9ydF9zaWdwZW5kaW5nCTE3NgorI2RlZmluZSBfX05SX3J0X3NpZ3RpbWVkd2FpdAkxNzcKKyNkZWZpbmUgX19OUl9ydF9zaWdxdWV1ZWluZm8JMTc4CisjZGVmaW5lIF9fTlJfcnRfc2lnc3VzcGVuZAkxNzkKKyNkZWZpbmUgX19OUl9wcmVhZDY0CQkxODAKKyNkZWZpbmUgX19OUl9wd3JpdGU2NAkJMTgxCisjZGVmaW5lIF9fTlJfY2hvd24JCTE4MgorI2RlZmluZSBfX05SX2dldGN3ZAkJMTgzCisjZGVmaW5lIF9fTlJfY2FwZ2V0CQkxODQKKyNkZWZpbmUgX19OUl9jYXBzZXQJCTE4NQorI2RlZmluZSBfX05SX3NpZ2FsdHN0YWNrCTE4NgorI2RlZmluZSBfX05SX3NlbmRmaWxlCQkxODcKKyNkZWZpbmUgX19OUl9nZXRwbXNnCQkxODgJLyogc29tZSBwZW9wbGUgYWN0dWFsbHkgd2FudCBzdHJlYW1zICovCisjZGVmaW5lIF9fTlJfcHV0cG1zZwkJMTg5CS8qIHNvbWUgcGVvcGxlIGFjdHVhbGx5IHdhbnQgc3RyZWFtcyAqLworI2RlZmluZSBfX05SX3Zmb3JrCQkxOTAKKyNkZWZpbmUgX19OUl91Z2V0cmxpbWl0CQkxOTEJLyogU3VTIGNvbXBsaWFudCBnZXRybGltaXQgKi8KKyNkZWZpbmUgX19OUl9tbWFwMgkJMTkyCisjZGVmaW5lIF9fTlJfdHJ1bmNhdGU2NAkJMTkzCisjZGVmaW5lIF9fTlJfZnRydW5jYXRlNjQJMTk0CisjZGVmaW5lIF9fTlJfc3RhdDY0CQkxOTUKKyNkZWZpbmUgX19OUl9sc3RhdDY0CQkxOTYKKyNkZWZpbmUgX19OUl9mc3RhdDY0CQkxOTcKKyNkZWZpbmUgX19OUl9sY2hvd24zMgkJMTk4CisjZGVmaW5lIF9fTlJfZ2V0dWlkMzIJCTE5OQorI2RlZmluZSBfX05SX2dldGdpZDMyCQkyMDAKKyNkZWZpbmUgX19OUl9nZXRldWlkMzIJCTIwMQorI2RlZmluZSBfX05SX2dldGVnaWQzMgkJMjAyCisjZGVmaW5lIF9fTlJfc2V0cmV1aWQzMgkJMjAzCisjZGVmaW5lIF9fTlJfc2V0cmVnaWQzMgkJMjA0CisjZGVmaW5lIF9fTlJfZ2V0Z3JvdXBzMzIJMjA1CisjZGVmaW5lIF9fTlJfc2V0Z3JvdXBzMzIJMjA2CisjZGVmaW5lIF9fTlJfZmNob3duMzIJCTIwNworI2RlZmluZSBfX05SX3NldHJlc3VpZDMyCTIwOAorI2RlZmluZSBfX05SX2dldHJlc3VpZDMyCTIwOQorI2RlZmluZSBfX05SX3NldHJlc2dpZDMyCTIxMAorI2RlZmluZSBfX05SX2dldHJlc2dpZDMyCTIxMQorI2RlZmluZSBfX05SX2Nob3duMzIJCTIxMgorI2RlZmluZSBfX05SX3NldHVpZDMyCQkyMTMKKyNkZWZpbmUgX19OUl9zZXRnaWQzMgkJMjE0CisjZGVmaW5lIF9fTlJfc2V0ZnN1aWQzMgkJMjE1CisjZGVmaW5lIF9fTlJfc2V0ZnNnaWQzMgkJMjE2CisjZGVmaW5lIF9fTlJfcGl2b3Rfcm9vdAkJMjE3CisjZGVmaW5lIF9fTlJfbWluY29yZQkJMjE4CisjZGVmaW5lIF9fTlJfbWFkdmlzZQkJMjE5CisjZGVmaW5lIF9fTlJfbWFkdmlzZTEJCTIxOQkvKiBkZWxldGUgd2hlbiBDIGxpYiBzdHViIGlzIHJlbW92ZWQgKi8KKyNkZWZpbmUgX19OUl9nZXRkZW50czY0CQkyMjAKKyNkZWZpbmUgX19OUl9mY250bDY0CQkyMjEKKy8qIDIyMyBpcyB1bnVzZWQgKi8KKyNkZWZpbmUgX19OUl9nZXR0aWQJCTIyNAorI2RlZmluZSBfX05SX3JlYWRhaGVhZAkJMjI1CisjZGVmaW5lIF9fTlJfc2V0eGF0dHIJCTIyNgorI2RlZmluZSBfX05SX2xzZXR4YXR0cgkJMjI3CisjZGVmaW5lIF9fTlJfZnNldHhhdHRyCQkyMjgKKyNkZWZpbmUgX19OUl9nZXR4YXR0cgkJMjI5CisjZGVmaW5lIF9fTlJfbGdldHhhdHRyCQkyMzAKKyNkZWZpbmUgX19OUl9mZ2V0eGF0dHIJCTIzMQorI2RlZmluZSBfX05SX2xpc3R4YXR0cgkJMjMyCisjZGVmaW5lIF9fTlJfbGxpc3R4YXR0cgkJMjMzCisjZGVmaW5lIF9fTlJfZmxpc3R4YXR0cgkJMjM0CisjZGVmaW5lIF9fTlJfcmVtb3ZleGF0dHIJMjM1CisjZGVmaW5lIF9fTlJfbHJlbW92ZXhhdHRyCTIzNgorI2RlZmluZSBfX05SX2ZyZW1vdmV4YXR0cgkyMzcKKyNkZWZpbmUgX19OUl90a2lsbAkJMjM4CisjZGVmaW5lIF9fTlJfc2VuZGZpbGU2NAkJMjM5CisjZGVmaW5lIF9fTlJfZnV0ZXgJCTI0MAorI2RlZmluZSBfX05SX3NjaGVkX3NldGFmZmluaXR5CTI0MQorI2RlZmluZSBfX05SX3NjaGVkX2dldGFmZmluaXR5CTI0MgorI2RlZmluZSBfX05SX3NldF90aHJlYWRfYXJlYQkyNDMKKyNkZWZpbmUgX19OUl9nZXRfdGhyZWFkX2FyZWEJMjQ0CisjZGVmaW5lIF9fTlJfaW9fc2V0dXAJCTI0NQorI2RlZmluZSBfX05SX2lvX2Rlc3Ryb3kJCTI0NgorI2RlZmluZSBfX05SX2lvX2dldGV2ZW50cwkyNDcKKyNkZWZpbmUgX19OUl9pb19zdWJtaXQJCTI0OAorI2RlZmluZSBfX05SX2lvX2NhbmNlbAkJMjQ5CisjZGVmaW5lIF9fTlJfZmFkdmlzZTY0CQkyNTAKKy8qIDI1MSBpcyBhdmFpbGFibGUgZm9yIHJldXNlICh3YXMgYnJpZWZseSBzeXNfc2V0X3pvbmVfcmVjbGFpbSkgKi8KKyNkZWZpbmUgX19OUl9leGl0X2dyb3VwCQkyNTIKKyNkZWZpbmUgX19OUl9sb29rdXBfZGNvb2tpZQkyNTMKKyNkZWZpbmUgX19OUl9lcG9sbF9jcmVhdGUJMjU0CisjZGVmaW5lIF9fTlJfZXBvbGxfY3RsCQkyNTUKKyNkZWZpbmUgX19OUl9lcG9sbF93YWl0CQkyNTYKKyNkZWZpbmUgX19OUl9yZW1hcF9maWxlX3BhZ2VzCTI1NworI2RlZmluZSBfX05SX3NldF90aWRfYWRkcmVzcwkyNTgKKyNkZWZpbmUgX19OUl90aW1lcl9jcmVhdGUJMjU5CisjZGVmaW5lIF9fTlJfdGltZXJfc2V0dGltZQkoX19OUl90aW1lcl9jcmVhdGUrMSkKKyNkZWZpbmUgX19OUl90aW1lcl9nZXR0aW1lCShfX05SX3RpbWVyX2NyZWF0ZSsyKQorI2RlZmluZSBfX05SX3RpbWVyX2dldG92ZXJydW4JKF9fTlJfdGltZXJfY3JlYXRlKzMpCisjZGVmaW5lIF9fTlJfdGltZXJfZGVsZXRlCShfX05SX3RpbWVyX2NyZWF0ZSs0KQorI2RlZmluZSBfX05SX2Nsb2NrX3NldHRpbWUJKF9fTlJfdGltZXJfY3JlYXRlKzUpCisjZGVmaW5lIF9fTlJfY2xvY2tfZ2V0dGltZQkoX19OUl90aW1lcl9jcmVhdGUrNikKKyNkZWZpbmUgX19OUl9jbG9ja19nZXRyZXMJKF9fTlJfdGltZXJfY3JlYXRlKzcpCisjZGVmaW5lIF9fTlJfY2xvY2tfbmFub3NsZWVwCShfX05SX3RpbWVyX2NyZWF0ZSs4KQorI2RlZmluZSBfX05SX3N0YXRmczY0CQkyNjgKKyNkZWZpbmUgX19OUl9mc3RhdGZzNjQJCTI2OQorI2RlZmluZSBfX05SX3Rna2lsbAkJMjcwCisjZGVmaW5lIF9fTlJfdXRpbWVzCQkyNzEKKyNkZWZpbmUgX19OUl9mYWR2aXNlNjRfNjQJMjcyCisjZGVmaW5lIF9fTlJfdnNlcnZlcgkJMjczCisjZGVmaW5lIF9fTlJfbWJpbmQJCTI3NAorI2RlZmluZSBfX05SX2dldF9tZW1wb2xpY3kJMjc1CisjZGVmaW5lIF9fTlJfc2V0X21lbXBvbGljeQkyNzYKKyNkZWZpbmUgX19OUl9tcV9vcGVuIAkJMjc3CisjZGVmaW5lIF9fTlJfbXFfdW5saW5rCQkoX19OUl9tcV9vcGVuKzEpCisjZGVmaW5lIF9fTlJfbXFfdGltZWRzZW5kCShfX05SX21xX29wZW4rMikKKyNkZWZpbmUgX19OUl9tcV90aW1lZHJlY2VpdmUJKF9fTlJfbXFfb3BlbiszKQorI2RlZmluZSBfX05SX21xX25vdGlmeQkJKF9fTlJfbXFfb3Blbis0KQorI2RlZmluZSBfX05SX21xX2dldHNldGF0dHIJKF9fTlJfbXFfb3Blbis1KQorI2RlZmluZSBfX05SX2tleGVjX2xvYWQJCTI4MworI2RlZmluZSBfX05SX3dhaXRpZAkJMjg0CisvKiAjZGVmaW5lIF9fTlJfc3lzX3NldGFsdHJvb3QJMjg1ICovCisjZGVmaW5lIF9fTlJfYWRkX2tleQkJMjg2CisjZGVmaW5lIF9fTlJfcmVxdWVzdF9rZXkJMjg3CisjZGVmaW5lIF9fTlJfa2V5Y3RsCQkyODgKKyNkZWZpbmUgX19OUl9pb3ByaW9fc2V0CQkyODkKKyNkZWZpbmUgX19OUl9pb3ByaW9fZ2V0CQkyOTAKKyNkZWZpbmUgX19OUl9pbm90aWZ5X2luaXQJMjkxCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9hZGRfd2F0Y2gJMjkyCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9ybV93YXRjaAkyOTMKKyNkZWZpbmUgX19OUl9taWdyYXRlX3BhZ2VzCTI5NAorI2RlZmluZSBfX05SX29wZW5hdAkJMjk1CisjZGVmaW5lIF9fTlJfbWtkaXJhdAkJMjk2CisjZGVmaW5lIF9fTlJfbWtub2RhdAkJMjk3CisjZGVmaW5lIF9fTlJfZmNob3duYXQJCTI5OAorI2RlZmluZSBfX05SX2Z1dGltZXNhdAkJMjk5CisjZGVmaW5lIF9fTlJfZnN0YXRhdDY0CQkzMDAKKyNkZWZpbmUgX19OUl91bmxpbmthdAkJMzAxCisjZGVmaW5lIF9fTlJfcmVuYW1lYXQJCTMwMgorI2RlZmluZSBfX05SX2xpbmthdAkJMzAzCisjZGVmaW5lIF9fTlJfc3ltbGlua2F0CQkzMDQKKyNkZWZpbmUgX19OUl9yZWFkbGlua2F0CQkzMDUKKyNkZWZpbmUgX19OUl9mY2htb2RhdAkJMzA2CisjZGVmaW5lIF9fTlJfZmFjY2Vzc2F0CQkzMDcKKyNkZWZpbmUgX19OUl9wc2VsZWN0NgkJMzA4CisjZGVmaW5lIF9fTlJfcHBvbGwJCTMwOQorI2RlZmluZSBfX05SX3Vuc2hhcmUJCTMxMAorI2RlZmluZSBfX05SX3NldF9yb2J1c3RfbGlzdAkzMTEKKyNkZWZpbmUgX19OUl9nZXRfcm9idXN0X2xpc3QJMzEyCisjZGVmaW5lIF9fTlJfc3BsaWNlCQkzMTMKKyNkZWZpbmUgX19OUl9zeW5jX2ZpbGVfcmFuZ2UJMzE0CisjZGVmaW5lIF9fTlJfdGVlCQkzMTUKKyNkZWZpbmUgX19OUl92bXNwbGljZQkJMzE2CisjZGVmaW5lIF9fTlJfbW92ZV9wYWdlcwkJMzE3CisjZGVmaW5lIF9fTlJfZ2V0Y3B1CQkzMTgKKyNkZWZpbmUgX19OUl9lcG9sbF9wd2FpdAkzMTkKKyNkZWZpbmUgX19OUl91dGltZW5zYXQJCTMyMAorI2RlZmluZSBfX05SX3NpZ25hbGZkCQkzMjEKKyNkZWZpbmUgX19OUl90aW1lcmZkX2NyZWF0ZQkzMjIKKyNkZWZpbmUgX19OUl9ldmVudGZkCQkzMjMKKyNkZWZpbmUgX19OUl9mYWxsb2NhdGUJCTMyNAorI2RlZmluZSBfX05SX3RpbWVyZmRfc2V0dGltZQkzMjUKKyNkZWZpbmUgX19OUl90aW1lcmZkX2dldHRpbWUJMzI2CisjZGVmaW5lIF9fTlJfc2lnbmFsZmQ0CQkzMjcKKyNkZWZpbmUgX19OUl9ldmVudGZkMgkJMzI4CisjZGVmaW5lIF9fTlJfZXBvbGxfY3JlYXRlMQkzMjkKKyNkZWZpbmUgX19OUl9kdXAzCQkzMzAKKyNkZWZpbmUgX19OUl9waXBlMgkJMzMxCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9pbml0MQkzMzIKKyNkZWZpbmUgX19OUl9wcmVhZHYJCTMzMworI2RlZmluZSBfX05SX3B3cml0ZXYJCTMzNAorI2RlZmluZSBfX05SX3J0X3Rnc2lncXVldWVpbmZvCTMzNQorI2RlZmluZSBfX05SX3BlcmZfZXZlbnRfb3BlbgkzMzYKKyNkZWZpbmUgX19OUl9yZWN2bW1zZwkJMzM3CisjZGVmaW5lIF9fTlJfZmFub3RpZnlfaW5pdAkzMzgKKyNkZWZpbmUgX19OUl9mYW5vdGlmeV9tYXJrCTMzOQorI2RlZmluZSBfX05SX3BybGltaXQ2NAkJMzQwCisjZGVmaW5lIF9fTlJfbmFtZV90b19oYW5kbGVfYXQJMzQxCisjZGVmaW5lIF9fTlJfb3Blbl9ieV9oYW5kbGVfYXQgIDM0MgorI2RlZmluZSBfX05SX2Nsb2NrX2FkanRpbWUJMzQzCisjZGVmaW5lIF9fTlJfc3luY2ZzICAgICAgICAgICAgIDM0NAorI2RlZmluZSBfX05SX3NlbmRtbXNnCQkzNDUKKyNkZWZpbmUgX19OUl9zZXRucwkJMzQ2CisjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV9yZWFkdgkzNDcKKyNkZWZpbmUgX19OUl9wcm9jZXNzX3ZtX3dyaXRldgkzNDgKKworI2VuZGlmIC8qIF9BU01fWDg2X1VOSVNURF8zMl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS91bmlzdGRfNjQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYXNtL3VuaXN0ZF82NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZTBjZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS91bmlzdGRfNjQuaApAQCAtMCwwICsxLDcxNyBAQAorI2lmbmRlZiBfQVNNX1g4Nl9VTklTVERfNjRfSAorI2RlZmluZSBfQVNNX1g4Nl9VTklTVERfNjRfSAorCisjaWZuZGVmIF9fU1lTQ0FMTAorI2RlZmluZSBfX1NZU0NBTEwoYSwgYikKKyNlbmRpZgorCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzeXN0ZW0gY2FsbCBudW1iZXJzLgorICoKKyAqIE5vdGU6IGhvbGVzIGFyZSBub3QgYWxsb3dlZC4KKyAqLworCisvKiBhdCBsZWFzdCA4IHN5c2NhbGwgcGVyIGNhY2hlbGluZSAqLworI2RlZmluZSBfX05SX3JlYWQJCQkJMAorX19TWVNDQUxMKF9fTlJfcmVhZCwgc3lzX3JlYWQpCisjZGVmaW5lIF9fTlJfd3JpdGUJCQkJMQorX19TWVNDQUxMKF9fTlJfd3JpdGUsIHN5c193cml0ZSkKKyNkZWZpbmUgX19OUl9vcGVuCQkJCTIKK19fU1lTQ0FMTChfX05SX29wZW4sIHN5c19vcGVuKQorI2RlZmluZSBfX05SX2Nsb3NlCQkJCTMKK19fU1lTQ0FMTChfX05SX2Nsb3NlLCBzeXNfY2xvc2UpCisjZGVmaW5lIF9fTlJfc3RhdAkJCQk0CitfX1NZU0NBTEwoX19OUl9zdGF0LCBzeXNfbmV3c3RhdCkKKyNkZWZpbmUgX19OUl9mc3RhdAkJCQk1CitfX1NZU0NBTEwoX19OUl9mc3RhdCwgc3lzX25ld2ZzdGF0KQorI2RlZmluZSBfX05SX2xzdGF0CQkJCTYKK19fU1lTQ0FMTChfX05SX2xzdGF0LCBzeXNfbmV3bHN0YXQpCisjZGVmaW5lIF9fTlJfcG9sbAkJCQk3CitfX1NZU0NBTEwoX19OUl9wb2xsLCBzeXNfcG9sbCkKKworI2RlZmluZSBfX05SX2xzZWVrCQkJCTgKK19fU1lTQ0FMTChfX05SX2xzZWVrLCBzeXNfbHNlZWspCisjZGVmaW5lIF9fTlJfbW1hcAkJCQk5CitfX1NZU0NBTEwoX19OUl9tbWFwLCBzeXNfbW1hcCkKKyNkZWZpbmUgX19OUl9tcHJvdGVjdAkJCQkxMAorX19TWVNDQUxMKF9fTlJfbXByb3RlY3QsIHN5c19tcHJvdGVjdCkKKyNkZWZpbmUgX19OUl9tdW5tYXAJCQkJMTEKK19fU1lTQ0FMTChfX05SX211bm1hcCwgc3lzX211bm1hcCkKKyNkZWZpbmUgX19OUl9icmsJCQkJMTIKK19fU1lTQ0FMTChfX05SX2Jyaywgc3lzX2JyaykKKyNkZWZpbmUgX19OUl9ydF9zaWdhY3Rpb24JCQkxMworX19TWVNDQUxMKF9fTlJfcnRfc2lnYWN0aW9uLCBzeXNfcnRfc2lnYWN0aW9uKQorI2RlZmluZSBfX05SX3J0X3NpZ3Byb2NtYXNrCQkJMTQKK19fU1lTQ0FMTChfX05SX3J0X3NpZ3Byb2NtYXNrLCBzeXNfcnRfc2lncHJvY21hc2spCisjZGVmaW5lIF9fTlJfcnRfc2lncmV0dXJuCQkJMTUKK19fU1lTQ0FMTChfX05SX3J0X3NpZ3JldHVybiwgc3R1Yl9ydF9zaWdyZXR1cm4pCisKKyNkZWZpbmUgX19OUl9pb2N0bAkJCQkxNgorX19TWVNDQUxMKF9fTlJfaW9jdGwsIHN5c19pb2N0bCkKKyNkZWZpbmUgX19OUl9wcmVhZDY0CQkJCTE3CitfX1NZU0NBTEwoX19OUl9wcmVhZDY0LCBzeXNfcHJlYWQ2NCkKKyNkZWZpbmUgX19OUl9wd3JpdGU2NAkJCQkxOAorX19TWVNDQUxMKF9fTlJfcHdyaXRlNjQsIHN5c19wd3JpdGU2NCkKKyNkZWZpbmUgX19OUl9yZWFkdgkJCQkxOQorX19TWVNDQUxMKF9fTlJfcmVhZHYsIHN5c19yZWFkdikKKyNkZWZpbmUgX19OUl93cml0ZXYJCQkJMjAKK19fU1lTQ0FMTChfX05SX3dyaXRldiwgc3lzX3dyaXRldikKKyNkZWZpbmUgX19OUl9hY2Nlc3MJCQkJMjEKK19fU1lTQ0FMTChfX05SX2FjY2Vzcywgc3lzX2FjY2VzcykKKyNkZWZpbmUgX19OUl9waXBlCQkJCTIyCitfX1NZU0NBTEwoX19OUl9waXBlLCBzeXNfcGlwZSkKKyNkZWZpbmUgX19OUl9zZWxlY3QJCQkJMjMKK19fU1lTQ0FMTChfX05SX3NlbGVjdCwgc3lzX3NlbGVjdCkKKworI2RlZmluZSBfX05SX3NjaGVkX3lpZWxkCQkJMjQKK19fU1lTQ0FMTChfX05SX3NjaGVkX3lpZWxkLCBzeXNfc2NoZWRfeWllbGQpCisjZGVmaW5lIF9fTlJfbXJlbWFwCQkJCTI1CitfX1NZU0NBTEwoX19OUl9tcmVtYXAsIHN5c19tcmVtYXApCisjZGVmaW5lIF9fTlJfbXN5bmMJCQkJMjYKK19fU1lTQ0FMTChfX05SX21zeW5jLCBzeXNfbXN5bmMpCisjZGVmaW5lIF9fTlJfbWluY29yZQkJCQkyNworX19TWVNDQUxMKF9fTlJfbWluY29yZSwgc3lzX21pbmNvcmUpCisjZGVmaW5lIF9fTlJfbWFkdmlzZQkJCQkyOAorX19TWVNDQUxMKF9fTlJfbWFkdmlzZSwgc3lzX21hZHZpc2UpCisjZGVmaW5lIF9fTlJfc2htZ2V0CQkJCTI5CitfX1NZU0NBTEwoX19OUl9zaG1nZXQsIHN5c19zaG1nZXQpCisjZGVmaW5lIF9fTlJfc2htYXQJCQkJMzAKK19fU1lTQ0FMTChfX05SX3NobWF0LCBzeXNfc2htYXQpCisjZGVmaW5lIF9fTlJfc2htY3RsCQkJCTMxCitfX1NZU0NBTEwoX19OUl9zaG1jdGwsIHN5c19zaG1jdGwpCisKKyNkZWZpbmUgX19OUl9kdXAJCQkJMzIKK19fU1lTQ0FMTChfX05SX2R1cCwgc3lzX2R1cCkKKyNkZWZpbmUgX19OUl9kdXAyCQkJCTMzCitfX1NZU0NBTEwoX19OUl9kdXAyLCBzeXNfZHVwMikKKyNkZWZpbmUgX19OUl9wYXVzZQkJCQkzNAorX19TWVNDQUxMKF9fTlJfcGF1c2UsIHN5c19wYXVzZSkKKyNkZWZpbmUgX19OUl9uYW5vc2xlZXAJCQkJMzUKK19fU1lTQ0FMTChfX05SX25hbm9zbGVlcCwgc3lzX25hbm9zbGVlcCkKKyNkZWZpbmUgX19OUl9nZXRpdGltZXIJCQkJMzYKK19fU1lTQ0FMTChfX05SX2dldGl0aW1lciwgc3lzX2dldGl0aW1lcikKKyNkZWZpbmUgX19OUl9hbGFybQkJCQkzNworX19TWVNDQUxMKF9fTlJfYWxhcm0sIHN5c19hbGFybSkKKyNkZWZpbmUgX19OUl9zZXRpdGltZXIJCQkJMzgKK19fU1lTQ0FMTChfX05SX3NldGl0aW1lciwgc3lzX3NldGl0aW1lcikKKyNkZWZpbmUgX19OUl9nZXRwaWQJCQkJMzkKK19fU1lTQ0FMTChfX05SX2dldHBpZCwgc3lzX2dldHBpZCkKKworI2RlZmluZSBfX05SX3NlbmRmaWxlCQkJCTQwCitfX1NZU0NBTEwoX19OUl9zZW5kZmlsZSwgc3lzX3NlbmRmaWxlNjQpCisjZGVmaW5lIF9fTlJfc29ja2V0CQkJCTQxCitfX1NZU0NBTEwoX19OUl9zb2NrZXQsIHN5c19zb2NrZXQpCisjZGVmaW5lIF9fTlJfY29ubmVjdAkJCQk0MgorX19TWVNDQUxMKF9fTlJfY29ubmVjdCwgc3lzX2Nvbm5lY3QpCisjZGVmaW5lIF9fTlJfYWNjZXB0CQkJCTQzCitfX1NZU0NBTEwoX19OUl9hY2NlcHQsIHN5c19hY2NlcHQpCisjZGVmaW5lIF9fTlJfc2VuZHRvCQkJCTQ0CitfX1NZU0NBTEwoX19OUl9zZW5kdG8sIHN5c19zZW5kdG8pCisjZGVmaW5lIF9fTlJfcmVjdmZyb20JCQkJNDUKK19fU1lTQ0FMTChfX05SX3JlY3Zmcm9tLCBzeXNfcmVjdmZyb20pCisjZGVmaW5lIF9fTlJfc2VuZG1zZwkJCQk0NgorX19TWVNDQUxMKF9fTlJfc2VuZG1zZywgc3lzX3NlbmRtc2cpCisjZGVmaW5lIF9fTlJfcmVjdm1zZwkJCQk0NworX19TWVNDQUxMKF9fTlJfcmVjdm1zZywgc3lzX3JlY3Ztc2cpCisKKyNkZWZpbmUgX19OUl9zaHV0ZG93bgkJCQk0OAorX19TWVNDQUxMKF9fTlJfc2h1dGRvd24sIHN5c19zaHV0ZG93bikKKyNkZWZpbmUgX19OUl9iaW5kCQkJCTQ5CitfX1NZU0NBTEwoX19OUl9iaW5kLCBzeXNfYmluZCkKKyNkZWZpbmUgX19OUl9saXN0ZW4JCQkJNTAKK19fU1lTQ0FMTChfX05SX2xpc3Rlbiwgc3lzX2xpc3RlbikKKyNkZWZpbmUgX19OUl9nZXRzb2NrbmFtZQkJCTUxCitfX1NZU0NBTEwoX19OUl9nZXRzb2NrbmFtZSwgc3lzX2dldHNvY2tuYW1lKQorI2RlZmluZSBfX05SX2dldHBlZXJuYW1lCQkJNTIKK19fU1lTQ0FMTChfX05SX2dldHBlZXJuYW1lLCBzeXNfZ2V0cGVlcm5hbWUpCisjZGVmaW5lIF9fTlJfc29ja2V0cGFpcgkJCQk1MworX19TWVNDQUxMKF9fTlJfc29ja2V0cGFpciwgc3lzX3NvY2tldHBhaXIpCisjZGVmaW5lIF9fTlJfc2V0c29ja29wdAkJCQk1NAorX19TWVNDQUxMKF9fTlJfc2V0c29ja29wdCwgc3lzX3NldHNvY2tvcHQpCisjZGVmaW5lIF9fTlJfZ2V0c29ja29wdAkJCQk1NQorX19TWVNDQUxMKF9fTlJfZ2V0c29ja29wdCwgc3lzX2dldHNvY2tvcHQpCisKKyNkZWZpbmUgX19OUl9jbG9uZQkJCQk1NgorX19TWVNDQUxMKF9fTlJfY2xvbmUsIHN0dWJfY2xvbmUpCisjZGVmaW5lIF9fTlJfZm9yawkJCQk1NworX19TWVNDQUxMKF9fTlJfZm9yaywgc3R1Yl9mb3JrKQorI2RlZmluZSBfX05SX3Zmb3JrCQkJCTU4CitfX1NZU0NBTEwoX19OUl92Zm9yaywgc3R1Yl92Zm9yaykKKyNkZWZpbmUgX19OUl9leGVjdmUJCQkJNTkKK19fU1lTQ0FMTChfX05SX2V4ZWN2ZSwgc3R1Yl9leGVjdmUpCisjZGVmaW5lIF9fTlJfZXhpdAkJCQk2MAorX19TWVNDQUxMKF9fTlJfZXhpdCwgc3lzX2V4aXQpCisjZGVmaW5lIF9fTlJfd2FpdDQJCQkJNjEKK19fU1lTQ0FMTChfX05SX3dhaXQ0LCBzeXNfd2FpdDQpCisjZGVmaW5lIF9fTlJfa2lsbAkJCQk2MgorX19TWVNDQUxMKF9fTlJfa2lsbCwgc3lzX2tpbGwpCisjZGVmaW5lIF9fTlJfdW5hbWUJCQkJNjMKK19fU1lTQ0FMTChfX05SX3VuYW1lLCBzeXNfbmV3dW5hbWUpCisKKyNkZWZpbmUgX19OUl9zZW1nZXQJCQkJNjQKK19fU1lTQ0FMTChfX05SX3NlbWdldCwgc3lzX3NlbWdldCkKKyNkZWZpbmUgX19OUl9zZW1vcAkJCQk2NQorX19TWVNDQUxMKF9fTlJfc2Vtb3AsIHN5c19zZW1vcCkKKyNkZWZpbmUgX19OUl9zZW1jdGwJCQkJNjYKK19fU1lTQ0FMTChfX05SX3NlbWN0bCwgc3lzX3NlbWN0bCkKKyNkZWZpbmUgX19OUl9zaG1kdAkJCQk2NworX19TWVNDQUxMKF9fTlJfc2htZHQsIHN5c19zaG1kdCkKKyNkZWZpbmUgX19OUl9tc2dnZXQJCQkJNjgKK19fU1lTQ0FMTChfX05SX21zZ2dldCwgc3lzX21zZ2dldCkKKyNkZWZpbmUgX19OUl9tc2dzbmQJCQkJNjkKK19fU1lTQ0FMTChfX05SX21zZ3NuZCwgc3lzX21zZ3NuZCkKKyNkZWZpbmUgX19OUl9tc2dyY3YJCQkJNzAKK19fU1lTQ0FMTChfX05SX21zZ3Jjdiwgc3lzX21zZ3JjdikKKyNkZWZpbmUgX19OUl9tc2djdGwJCQkJNzEKK19fU1lTQ0FMTChfX05SX21zZ2N0bCwgc3lzX21zZ2N0bCkKKworI2RlZmluZSBfX05SX2ZjbnRsCQkJCTcyCitfX1NZU0NBTEwoX19OUl9mY250bCwgc3lzX2ZjbnRsKQorI2RlZmluZSBfX05SX2Zsb2NrCQkJCTczCitfX1NZU0NBTEwoX19OUl9mbG9jaywgc3lzX2Zsb2NrKQorI2RlZmluZSBfX05SX2ZzeW5jCQkJCTc0CitfX1NZU0NBTEwoX19OUl9mc3luYywgc3lzX2ZzeW5jKQorI2RlZmluZSBfX05SX2ZkYXRhc3luYwkJCQk3NQorX19TWVNDQUxMKF9fTlJfZmRhdGFzeW5jLCBzeXNfZmRhdGFzeW5jKQorI2RlZmluZSBfX05SX3RydW5jYXRlCQkJCTc2CitfX1NZU0NBTEwoX19OUl90cnVuY2F0ZSwgc3lzX3RydW5jYXRlKQorI2RlZmluZSBfX05SX2Z0cnVuY2F0ZQkJCQk3NworX19TWVNDQUxMKF9fTlJfZnRydW5jYXRlLCBzeXNfZnRydW5jYXRlKQorI2RlZmluZSBfX05SX2dldGRlbnRzCQkJCTc4CitfX1NZU0NBTEwoX19OUl9nZXRkZW50cywgc3lzX2dldGRlbnRzKQorI2RlZmluZSBfX05SX2dldGN3ZAkJCQk3OQorX19TWVNDQUxMKF9fTlJfZ2V0Y3dkLCBzeXNfZ2V0Y3dkKQorCisjZGVmaW5lIF9fTlJfY2hkaXIJCQkJODAKK19fU1lTQ0FMTChfX05SX2NoZGlyLCBzeXNfY2hkaXIpCisjZGVmaW5lIF9fTlJfZmNoZGlyCQkJCTgxCitfX1NZU0NBTEwoX19OUl9mY2hkaXIsIHN5c19mY2hkaXIpCisjZGVmaW5lIF9fTlJfcmVuYW1lCQkJCTgyCitfX1NZU0NBTEwoX19OUl9yZW5hbWUsIHN5c19yZW5hbWUpCisjZGVmaW5lIF9fTlJfbWtkaXIJCQkJODMKK19fU1lTQ0FMTChfX05SX21rZGlyLCBzeXNfbWtkaXIpCisjZGVmaW5lIF9fTlJfcm1kaXIJCQkJODQKK19fU1lTQ0FMTChfX05SX3JtZGlyLCBzeXNfcm1kaXIpCisjZGVmaW5lIF9fTlJfY3JlYXQJCQkJODUKK19fU1lTQ0FMTChfX05SX2NyZWF0LCBzeXNfY3JlYXQpCisjZGVmaW5lIF9fTlJfbGluawkJCQk4NgorX19TWVNDQUxMKF9fTlJfbGluaywgc3lzX2xpbmspCisjZGVmaW5lIF9fTlJfdW5saW5rCQkJCTg3CitfX1NZU0NBTEwoX19OUl91bmxpbmssIHN5c191bmxpbmspCisKKyNkZWZpbmUgX19OUl9zeW1saW5rCQkJCTg4CitfX1NZU0NBTEwoX19OUl9zeW1saW5rLCBzeXNfc3ltbGluaykKKyNkZWZpbmUgX19OUl9yZWFkbGluawkJCQk4OQorX19TWVNDQUxMKF9fTlJfcmVhZGxpbmssIHN5c19yZWFkbGluaykKKyNkZWZpbmUgX19OUl9jaG1vZAkJCQk5MAorX19TWVNDQUxMKF9fTlJfY2htb2QsIHN5c19jaG1vZCkKKyNkZWZpbmUgX19OUl9mY2htb2QJCQkJOTEKK19fU1lTQ0FMTChfX05SX2ZjaG1vZCwgc3lzX2ZjaG1vZCkKKyNkZWZpbmUgX19OUl9jaG93bgkJCQk5MgorX19TWVNDQUxMKF9fTlJfY2hvd24sIHN5c19jaG93bikKKyNkZWZpbmUgX19OUl9mY2hvd24JCQkJOTMKK19fU1lTQ0FMTChfX05SX2ZjaG93biwgc3lzX2ZjaG93bikKKyNkZWZpbmUgX19OUl9sY2hvd24JCQkJOTQKK19fU1lTQ0FMTChfX05SX2xjaG93biwgc3lzX2xjaG93bikKKyNkZWZpbmUgX19OUl91bWFzawkJCQk5NQorX19TWVNDQUxMKF9fTlJfdW1hc2ssIHN5c191bWFzaykKKworI2RlZmluZSBfX05SX2dldHRpbWVvZmRheQkJCTk2CitfX1NZU0NBTEwoX19OUl9nZXR0aW1lb2ZkYXksIHN5c19nZXR0aW1lb2ZkYXkpCisjZGVmaW5lIF9fTlJfZ2V0cmxpbWl0CQkJCTk3CitfX1NZU0NBTEwoX19OUl9nZXRybGltaXQsIHN5c19nZXRybGltaXQpCisjZGVmaW5lIF9fTlJfZ2V0cnVzYWdlCQkJCTk4CitfX1NZU0NBTEwoX19OUl9nZXRydXNhZ2UsIHN5c19nZXRydXNhZ2UpCisjZGVmaW5lIF9fTlJfc3lzaW5mbwkJCQk5OQorX19TWVNDQUxMKF9fTlJfc3lzaW5mbywgc3lzX3N5c2luZm8pCisjZGVmaW5lIF9fTlJfdGltZXMJCQkJMTAwCitfX1NZU0NBTEwoX19OUl90aW1lcywgc3lzX3RpbWVzKQorI2RlZmluZSBfX05SX3B0cmFjZQkJCQkxMDEKK19fU1lTQ0FMTChfX05SX3B0cmFjZSwgc3lzX3B0cmFjZSkKKyNkZWZpbmUgX19OUl9nZXR1aWQJCQkJMTAyCitfX1NZU0NBTEwoX19OUl9nZXR1aWQsIHN5c19nZXR1aWQpCisjZGVmaW5lIF9fTlJfc3lzbG9nCQkJCTEwMworX19TWVNDQUxMKF9fTlJfc3lzbG9nLCBzeXNfc3lzbG9nKQorCisvKiBhdCB0aGUgdmVyeSBlbmQgdGhlIHN0dWZmIHRoYXQgbmV2ZXIgcnVucyBkdXJpbmcgdGhlIGJlbmNobWFya3MgKi8KKyNkZWZpbmUgX19OUl9nZXRnaWQJCQkJMTA0CitfX1NZU0NBTEwoX19OUl9nZXRnaWQsIHN5c19nZXRnaWQpCisjZGVmaW5lIF9fTlJfc2V0dWlkCQkJCTEwNQorX19TWVNDQUxMKF9fTlJfc2V0dWlkLCBzeXNfc2V0dWlkKQorI2RlZmluZSBfX05SX3NldGdpZAkJCQkxMDYKK19fU1lTQ0FMTChfX05SX3NldGdpZCwgc3lzX3NldGdpZCkKKyNkZWZpbmUgX19OUl9nZXRldWlkCQkJCTEwNworX19TWVNDQUxMKF9fTlJfZ2V0ZXVpZCwgc3lzX2dldGV1aWQpCisjZGVmaW5lIF9fTlJfZ2V0ZWdpZAkJCQkxMDgKK19fU1lTQ0FMTChfX05SX2dldGVnaWQsIHN5c19nZXRlZ2lkKQorI2RlZmluZSBfX05SX3NldHBnaWQJCQkJMTA5CitfX1NZU0NBTEwoX19OUl9zZXRwZ2lkLCBzeXNfc2V0cGdpZCkKKyNkZWZpbmUgX19OUl9nZXRwcGlkCQkJCTExMAorX19TWVNDQUxMKF9fTlJfZ2V0cHBpZCwgc3lzX2dldHBwaWQpCisjZGVmaW5lIF9fTlJfZ2V0cGdycAkJCQkxMTEKK19fU1lTQ0FMTChfX05SX2dldHBncnAsIHN5c19nZXRwZ3JwKQorCisjZGVmaW5lIF9fTlJfc2V0c2lkCQkJCTExMgorX19TWVNDQUxMKF9fTlJfc2V0c2lkLCBzeXNfc2V0c2lkKQorI2RlZmluZSBfX05SX3NldHJldWlkCQkJCTExMworX19TWVNDQUxMKF9fTlJfc2V0cmV1aWQsIHN5c19zZXRyZXVpZCkKKyNkZWZpbmUgX19OUl9zZXRyZWdpZAkJCQkxMTQKK19fU1lTQ0FMTChfX05SX3NldHJlZ2lkLCBzeXNfc2V0cmVnaWQpCisjZGVmaW5lIF9fTlJfZ2V0Z3JvdXBzCQkJCTExNQorX19TWVNDQUxMKF9fTlJfZ2V0Z3JvdXBzLCBzeXNfZ2V0Z3JvdXBzKQorI2RlZmluZSBfX05SX3NldGdyb3VwcwkJCQkxMTYKK19fU1lTQ0FMTChfX05SX3NldGdyb3Vwcywgc3lzX3NldGdyb3VwcykKKyNkZWZpbmUgX19OUl9zZXRyZXN1aWQJCQkJMTE3CitfX1NZU0NBTEwoX19OUl9zZXRyZXN1aWQsIHN5c19zZXRyZXN1aWQpCisjZGVmaW5lIF9fTlJfZ2V0cmVzdWlkCQkJCTExOAorX19TWVNDQUxMKF9fTlJfZ2V0cmVzdWlkLCBzeXNfZ2V0cmVzdWlkKQorI2RlZmluZSBfX05SX3NldHJlc2dpZAkJCQkxMTkKK19fU1lTQ0FMTChfX05SX3NldHJlc2dpZCwgc3lzX3NldHJlc2dpZCkKKworI2RlZmluZSBfX05SX2dldHJlc2dpZAkJCQkxMjAKK19fU1lTQ0FMTChfX05SX2dldHJlc2dpZCwgc3lzX2dldHJlc2dpZCkKKyNkZWZpbmUgX19OUl9nZXRwZ2lkCQkJCTEyMQorX19TWVNDQUxMKF9fTlJfZ2V0cGdpZCwgc3lzX2dldHBnaWQpCisjZGVmaW5lIF9fTlJfc2V0ZnN1aWQJCQkJMTIyCitfX1NZU0NBTEwoX19OUl9zZXRmc3VpZCwgc3lzX3NldGZzdWlkKQorI2RlZmluZSBfX05SX3NldGZzZ2lkCQkJCTEyMworX19TWVNDQUxMKF9fTlJfc2V0ZnNnaWQsIHN5c19zZXRmc2dpZCkKKyNkZWZpbmUgX19OUl9nZXRzaWQJCQkJMTI0CitfX1NZU0NBTEwoX19OUl9nZXRzaWQsIHN5c19nZXRzaWQpCisjZGVmaW5lIF9fTlJfY2FwZ2V0CQkJCTEyNQorX19TWVNDQUxMKF9fTlJfY2FwZ2V0LCBzeXNfY2FwZ2V0KQorI2RlZmluZSBfX05SX2NhcHNldAkJCQkxMjYKK19fU1lTQ0FMTChfX05SX2NhcHNldCwgc3lzX2NhcHNldCkKKworI2RlZmluZSBfX05SX3J0X3NpZ3BlbmRpbmcJCQkxMjcKK19fU1lTQ0FMTChfX05SX3J0X3NpZ3BlbmRpbmcsIHN5c19ydF9zaWdwZW5kaW5nKQorI2RlZmluZSBfX05SX3J0X3NpZ3RpbWVkd2FpdAkJCTEyOAorX19TWVNDQUxMKF9fTlJfcnRfc2lndGltZWR3YWl0LCBzeXNfcnRfc2lndGltZWR3YWl0KQorI2RlZmluZSBfX05SX3J0X3NpZ3F1ZXVlaW5mbwkJCTEyOQorX19TWVNDQUxMKF9fTlJfcnRfc2lncXVldWVpbmZvLCBzeXNfcnRfc2lncXVldWVpbmZvKQorI2RlZmluZSBfX05SX3J0X3NpZ3N1c3BlbmQJCQkxMzAKK19fU1lTQ0FMTChfX05SX3J0X3NpZ3N1c3BlbmQsIHN5c19ydF9zaWdzdXNwZW5kKQorI2RlZmluZSBfX05SX3NpZ2FsdHN0YWNrCQkJMTMxCitfX1NZU0NBTEwoX19OUl9zaWdhbHRzdGFjaywgc3R1Yl9zaWdhbHRzdGFjaykKKyNkZWZpbmUgX19OUl91dGltZQkJCQkxMzIKK19fU1lTQ0FMTChfX05SX3V0aW1lLCBzeXNfdXRpbWUpCisjZGVmaW5lIF9fTlJfbWtub2QJCQkJMTMzCitfX1NZU0NBTEwoX19OUl9ta25vZCwgc3lzX21rbm9kKQorCisvKiBPbmx5IG5lZWRlZCBmb3IgYS5vdXQgKi8KKyNkZWZpbmUgX19OUl91c2VsaWIJCQkJMTM0CitfX1NZU0NBTEwoX19OUl91c2VsaWIsIHN5c19uaV9zeXNjYWxsKQorI2RlZmluZSBfX05SX3BlcnNvbmFsaXR5CQkJMTM1CitfX1NZU0NBTEwoX19OUl9wZXJzb25hbGl0eSwgc3lzX3BlcnNvbmFsaXR5KQorCisjZGVmaW5lIF9fTlJfdXN0YXQJCQkJMTM2CitfX1NZU0NBTEwoX19OUl91c3RhdCwgc3lzX3VzdGF0KQorI2RlZmluZSBfX05SX3N0YXRmcwkJCQkxMzcKK19fU1lTQ0FMTChfX05SX3N0YXRmcywgc3lzX3N0YXRmcykKKyNkZWZpbmUgX19OUl9mc3RhdGZzCQkJCTEzOAorX19TWVNDQUxMKF9fTlJfZnN0YXRmcywgc3lzX2ZzdGF0ZnMpCisjZGVmaW5lIF9fTlJfc3lzZnMJCQkJMTM5CitfX1NZU0NBTEwoX19OUl9zeXNmcywgc3lzX3N5c2ZzKQorCisjZGVmaW5lIF9fTlJfZ2V0cHJpb3JpdHkJCQkxNDAKK19fU1lTQ0FMTChfX05SX2dldHByaW9yaXR5LCBzeXNfZ2V0cHJpb3JpdHkpCisjZGVmaW5lIF9fTlJfc2V0cHJpb3JpdHkJCQkxNDEKK19fU1lTQ0FMTChfX05SX3NldHByaW9yaXR5LCBzeXNfc2V0cHJpb3JpdHkpCisjZGVmaW5lIF9fTlJfc2NoZWRfc2V0cGFyYW0JCQkxNDIKK19fU1lTQ0FMTChfX05SX3NjaGVkX3NldHBhcmFtLCBzeXNfc2NoZWRfc2V0cGFyYW0pCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0cGFyYW0JCQkxNDMKK19fU1lTQ0FMTChfX05SX3NjaGVkX2dldHBhcmFtLCBzeXNfc2NoZWRfZ2V0cGFyYW0pCisjZGVmaW5lIF9fTlJfc2NoZWRfc2V0c2NoZWR1bGVyCQkJMTQ0CitfX1NZU0NBTEwoX19OUl9zY2hlZF9zZXRzY2hlZHVsZXIsIHN5c19zY2hlZF9zZXRzY2hlZHVsZXIpCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0c2NoZWR1bGVyCQkJMTQ1CitfX1NZU0NBTEwoX19OUl9zY2hlZF9nZXRzY2hlZHVsZXIsIHN5c19zY2hlZF9nZXRzY2hlZHVsZXIpCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21heAkJMTQ2CitfX1NZU0NBTEwoX19OUl9zY2hlZF9nZXRfcHJpb3JpdHlfbWF4LCBzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21heCkKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRfcHJpb3JpdHlfbWluCQkxNDcKK19fU1lTQ0FMTChfX05SX3NjaGVkX2dldF9wcmlvcml0eV9taW4sIHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWluKQorI2RlZmluZSBfX05SX3NjaGVkX3JyX2dldF9pbnRlcnZhbAkJMTQ4CitfX1NZU0NBTEwoX19OUl9zY2hlZF9ycl9nZXRfaW50ZXJ2YWwsIHN5c19zY2hlZF9ycl9nZXRfaW50ZXJ2YWwpCisKKyNkZWZpbmUgX19OUl9tbG9jawkJCQkxNDkKK19fU1lTQ0FMTChfX05SX21sb2NrLCBzeXNfbWxvY2spCisjZGVmaW5lIF9fTlJfbXVubG9jawkJCQkxNTAKK19fU1lTQ0FMTChfX05SX211bmxvY2ssIHN5c19tdW5sb2NrKQorI2RlZmluZSBfX05SX21sb2NrYWxsCQkJCTE1MQorX19TWVNDQUxMKF9fTlJfbWxvY2thbGwsIHN5c19tbG9ja2FsbCkKKyNkZWZpbmUgX19OUl9tdW5sb2NrYWxsCQkJCTE1MgorX19TWVNDQUxMKF9fTlJfbXVubG9ja2FsbCwgc3lzX211bmxvY2thbGwpCisKKyNkZWZpbmUgX19OUl92aGFuZ3VwCQkJCTE1MworX19TWVNDQUxMKF9fTlJfdmhhbmd1cCwgc3lzX3ZoYW5ndXApCisKKyNkZWZpbmUgX19OUl9tb2RpZnlfbGR0CQkJCTE1NAorX19TWVNDQUxMKF9fTlJfbW9kaWZ5X2xkdCwgc3lzX21vZGlmeV9sZHQpCisKKyNkZWZpbmUgX19OUl9waXZvdF9yb290CQkJCTE1NQorX19TWVNDQUxMKF9fTlJfcGl2b3Rfcm9vdCwgc3lzX3Bpdm90X3Jvb3QpCisKKyNkZWZpbmUgX19OUl9fc3lzY3RsCQkJCTE1NgorX19TWVNDQUxMKF9fTlJfX3N5c2N0bCwgc3lzX3N5c2N0bCkKKworI2RlZmluZSBfX05SX3ByY3RsCQkJCTE1NworX19TWVNDQUxMKF9fTlJfcHJjdGwsIHN5c19wcmN0bCkKKyNkZWZpbmUgX19OUl9hcmNoX3ByY3RsCQkJCTE1OAorX19TWVNDQUxMKF9fTlJfYXJjaF9wcmN0bCwgc3lzX2FyY2hfcHJjdGwpCisKKyNkZWZpbmUgX19OUl9hZGp0aW1leAkJCQkxNTkKK19fU1lTQ0FMTChfX05SX2FkanRpbWV4LCBzeXNfYWRqdGltZXgpCisKKyNkZWZpbmUgX19OUl9zZXRybGltaXQJCQkJMTYwCitfX1NZU0NBTEwoX19OUl9zZXRybGltaXQsIHN5c19zZXRybGltaXQpCisKKyNkZWZpbmUgX19OUl9jaHJvb3QJCQkJMTYxCitfX1NZU0NBTEwoX19OUl9jaHJvb3QsIHN5c19jaHJvb3QpCisKKyNkZWZpbmUgX19OUl9zeW5jCQkJCTE2MgorX19TWVNDQUxMKF9fTlJfc3luYywgc3lzX3N5bmMpCisKKyNkZWZpbmUgX19OUl9hY2N0CQkJCTE2MworX19TWVNDQUxMKF9fTlJfYWNjdCwgc3lzX2FjY3QpCisKKyNkZWZpbmUgX19OUl9zZXR0aW1lb2ZkYXkJCQkxNjQKK19fU1lTQ0FMTChfX05SX3NldHRpbWVvZmRheSwgc3lzX3NldHRpbWVvZmRheSkKKworI2RlZmluZSBfX05SX21vdW50CQkJCTE2NQorX19TWVNDQUxMKF9fTlJfbW91bnQsIHN5c19tb3VudCkKKyNkZWZpbmUgX19OUl91bW91bnQyCQkJCTE2NgorX19TWVNDQUxMKF9fTlJfdW1vdW50Miwgc3lzX3Vtb3VudCkKKworI2RlZmluZSBfX05SX3N3YXBvbgkJCQkxNjcKK19fU1lTQ0FMTChfX05SX3N3YXBvbiwgc3lzX3N3YXBvbikKKyNkZWZpbmUgX19OUl9zd2Fwb2ZmCQkJCTE2OAorX19TWVNDQUxMKF9fTlJfc3dhcG9mZiwgc3lzX3N3YXBvZmYpCisKKyNkZWZpbmUgX19OUl9yZWJvb3QJCQkJMTY5CitfX1NZU0NBTEwoX19OUl9yZWJvb3QsIHN5c19yZWJvb3QpCisKKyNkZWZpbmUgX19OUl9zZXRob3N0bmFtZQkJCTE3MAorX19TWVNDQUxMKF9fTlJfc2V0aG9zdG5hbWUsIHN5c19zZXRob3N0bmFtZSkKKyNkZWZpbmUgX19OUl9zZXRkb21haW5uYW1lCQkJMTcxCitfX1NZU0NBTEwoX19OUl9zZXRkb21haW5uYW1lLCBzeXNfc2V0ZG9tYWlubmFtZSkKKworI2RlZmluZSBfX05SX2lvcGwJCQkJMTcyCitfX1NZU0NBTEwoX19OUl9pb3BsLCBzdHViX2lvcGwpCisjZGVmaW5lIF9fTlJfaW9wZXJtCQkJCTE3MworX19TWVNDQUxMKF9fTlJfaW9wZXJtLCBzeXNfaW9wZXJtKQorCisjZGVmaW5lIF9fTlJfY3JlYXRlX21vZHVsZQkJCTE3NAorX19TWVNDQUxMKF9fTlJfY3JlYXRlX21vZHVsZSwgc3lzX25pX3N5c2NhbGwpCisjZGVmaW5lIF9fTlJfaW5pdF9tb2R1bGUJCQkxNzUKK19fU1lTQ0FMTChfX05SX2luaXRfbW9kdWxlLCBzeXNfaW5pdF9tb2R1bGUpCisjZGVmaW5lIF9fTlJfZGVsZXRlX21vZHVsZQkJCTE3NgorX19TWVNDQUxMKF9fTlJfZGVsZXRlX21vZHVsZSwgc3lzX2RlbGV0ZV9tb2R1bGUpCisjZGVmaW5lIF9fTlJfZ2V0X2tlcm5lbF9zeW1zCQkJMTc3CitfX1NZU0NBTEwoX19OUl9nZXRfa2VybmVsX3N5bXMsIHN5c19uaV9zeXNjYWxsKQorI2RlZmluZSBfX05SX3F1ZXJ5X21vZHVsZQkJCTE3OAorX19TWVNDQUxMKF9fTlJfcXVlcnlfbW9kdWxlLCBzeXNfbmlfc3lzY2FsbCkKKworI2RlZmluZSBfX05SX3F1b3RhY3RsCQkJCTE3OQorX19TWVNDQUxMKF9fTlJfcXVvdGFjdGwsIHN5c19xdW90YWN0bCkKKworI2RlZmluZSBfX05SX25mc3NlcnZjdGwJCQkJMTgwCitfX1NZU0NBTEwoX19OUl9uZnNzZXJ2Y3RsLCBzeXNfbmlfc3lzY2FsbCkKKworLyogcmVzZXJ2ZWQgZm9yIExpUy9TVFJFQU1TICovCisjZGVmaW5lIF9fTlJfZ2V0cG1zZwkJCQkxODEKK19fU1lTQ0FMTChfX05SX2dldHBtc2csIHN5c19uaV9zeXNjYWxsKQorI2RlZmluZSBfX05SX3B1dHBtc2cJCQkJMTgyCitfX1NZU0NBTEwoX19OUl9wdXRwbXNnLCBzeXNfbmlfc3lzY2FsbCkKKworLyogcmVzZXJ2ZWQgZm9yIEFGUyAqLworI2RlZmluZSBfX05SX2Fmc19zeXNjYWxsCQkJMTgzCitfX1NZU0NBTEwoX19OUl9hZnNfc3lzY2FsbCwgc3lzX25pX3N5c2NhbGwpCisKKy8qIHJlc2VydmVkIGZvciB0dXggKi8KKyNkZWZpbmUgX19OUl90dXhjYWxsCQkJCTE4NAorX19TWVNDQUxMKF9fTlJfdHV4Y2FsbCwgc3lzX25pX3N5c2NhbGwpCisKKyNkZWZpbmUgX19OUl9zZWN1cml0eQkJCQkxODUKK19fU1lTQ0FMTChfX05SX3NlY3VyaXR5LCBzeXNfbmlfc3lzY2FsbCkKKworI2RlZmluZSBfX05SX2dldHRpZAkJCQkxODYKK19fU1lTQ0FMTChfX05SX2dldHRpZCwgc3lzX2dldHRpZCkKKworI2RlZmluZSBfX05SX3JlYWRhaGVhZAkJCQkxODcKK19fU1lTQ0FMTChfX05SX3JlYWRhaGVhZCwgc3lzX3JlYWRhaGVhZCkKKyNkZWZpbmUgX19OUl9zZXR4YXR0cgkJCQkxODgKK19fU1lTQ0FMTChfX05SX3NldHhhdHRyLCBzeXNfc2V0eGF0dHIpCisjZGVmaW5lIF9fTlJfbHNldHhhdHRyCQkJCTE4OQorX19TWVNDQUxMKF9fTlJfbHNldHhhdHRyLCBzeXNfbHNldHhhdHRyKQorI2RlZmluZSBfX05SX2ZzZXR4YXR0cgkJCQkxOTAKK19fU1lTQ0FMTChfX05SX2ZzZXR4YXR0ciwgc3lzX2ZzZXR4YXR0cikKKyNkZWZpbmUgX19OUl9nZXR4YXR0cgkJCQkxOTEKK19fU1lTQ0FMTChfX05SX2dldHhhdHRyLCBzeXNfZ2V0eGF0dHIpCisjZGVmaW5lIF9fTlJfbGdldHhhdHRyCQkJCTE5MgorX19TWVNDQUxMKF9fTlJfbGdldHhhdHRyLCBzeXNfbGdldHhhdHRyKQorI2RlZmluZSBfX05SX2ZnZXR4YXR0cgkJCQkxOTMKK19fU1lTQ0FMTChfX05SX2ZnZXR4YXR0ciwgc3lzX2ZnZXR4YXR0cikKKyNkZWZpbmUgX19OUl9saXN0eGF0dHIJCQkJMTk0CitfX1NZU0NBTEwoX19OUl9saXN0eGF0dHIsIHN5c19saXN0eGF0dHIpCisjZGVmaW5lIF9fTlJfbGxpc3R4YXR0cgkJCQkxOTUKK19fU1lTQ0FMTChfX05SX2xsaXN0eGF0dHIsIHN5c19sbGlzdHhhdHRyKQorI2RlZmluZSBfX05SX2ZsaXN0eGF0dHIJCQkJMTk2CitfX1NZU0NBTEwoX19OUl9mbGlzdHhhdHRyLCBzeXNfZmxpc3R4YXR0cikKKyNkZWZpbmUgX19OUl9yZW1vdmV4YXR0cgkJCTE5NworX19TWVNDQUxMKF9fTlJfcmVtb3ZleGF0dHIsIHN5c19yZW1vdmV4YXR0cikKKyNkZWZpbmUgX19OUl9scmVtb3ZleGF0dHIJCQkxOTgKK19fU1lTQ0FMTChfX05SX2xyZW1vdmV4YXR0ciwgc3lzX2xyZW1vdmV4YXR0cikKKyNkZWZpbmUgX19OUl9mcmVtb3ZleGF0dHIJCQkxOTkKK19fU1lTQ0FMTChfX05SX2ZyZW1vdmV4YXR0ciwgc3lzX2ZyZW1vdmV4YXR0cikKKyNkZWZpbmUgX19OUl90a2lsbAkJCQkyMDAKK19fU1lTQ0FMTChfX05SX3RraWxsLCBzeXNfdGtpbGwpCisjZGVmaW5lIF9fTlJfdGltZQkJCQkyMDEKK19fU1lTQ0FMTChfX05SX3RpbWUsIHN5c190aW1lKQorI2RlZmluZSBfX05SX2Z1dGV4CQkJCTIwMgorX19TWVNDQUxMKF9fTlJfZnV0ZXgsIHN5c19mdXRleCkKKyNkZWZpbmUgX19OUl9zY2hlZF9zZXRhZmZpbml0eQkJCTIwMworX19TWVNDQUxMKF9fTlJfc2NoZWRfc2V0YWZmaW5pdHksIHN5c19zY2hlZF9zZXRhZmZpbml0eSkKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRhZmZpbml0eQkJCTIwNAorX19TWVNDQUxMKF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHksIHN5c19zY2hlZF9nZXRhZmZpbml0eSkKKyNkZWZpbmUgX19OUl9zZXRfdGhyZWFkX2FyZWEJCQkyMDUKK19fU1lTQ0FMTChfX05SX3NldF90aHJlYWRfYXJlYSwgc3lzX25pX3N5c2NhbGwpCS8qIHVzZSBhcmNoX3ByY3RsICovCisjZGVmaW5lIF9fTlJfaW9fc2V0dXAJCQkJMjA2CitfX1NZU0NBTEwoX19OUl9pb19zZXR1cCwgc3lzX2lvX3NldHVwKQorI2RlZmluZSBfX05SX2lvX2Rlc3Ryb3kJCQkJMjA3CitfX1NZU0NBTEwoX19OUl9pb19kZXN0cm95LCBzeXNfaW9fZGVzdHJveSkKKyNkZWZpbmUgX19OUl9pb19nZXRldmVudHMJCQkyMDgKK19fU1lTQ0FMTChfX05SX2lvX2dldGV2ZW50cywgc3lzX2lvX2dldGV2ZW50cykKKyNkZWZpbmUgX19OUl9pb19zdWJtaXQJCQkJMjA5CitfX1NZU0NBTEwoX19OUl9pb19zdWJtaXQsIHN5c19pb19zdWJtaXQpCisjZGVmaW5lIF9fTlJfaW9fY2FuY2VsCQkJCTIxMAorX19TWVNDQUxMKF9fTlJfaW9fY2FuY2VsLCBzeXNfaW9fY2FuY2VsKQorI2RlZmluZSBfX05SX2dldF90aHJlYWRfYXJlYQkJCTIxMQorX19TWVNDQUxMKF9fTlJfZ2V0X3RocmVhZF9hcmVhLCBzeXNfbmlfc3lzY2FsbCkJLyogdXNlIGFyY2hfcHJjdGwgKi8KKyNkZWZpbmUgX19OUl9sb29rdXBfZGNvb2tpZQkJCTIxMgorX19TWVNDQUxMKF9fTlJfbG9va3VwX2Rjb29raWUsIHN5c19sb29rdXBfZGNvb2tpZSkKKyNkZWZpbmUgX19OUl9lcG9sbF9jcmVhdGUJCQkyMTMKK19fU1lTQ0FMTChfX05SX2Vwb2xsX2NyZWF0ZSwgc3lzX2Vwb2xsX2NyZWF0ZSkKKyNkZWZpbmUgX19OUl9lcG9sbF9jdGxfb2xkCQkJMjE0CitfX1NZU0NBTEwoX19OUl9lcG9sbF9jdGxfb2xkLCBzeXNfbmlfc3lzY2FsbCkKKyNkZWZpbmUgX19OUl9lcG9sbF93YWl0X29sZAkJCTIxNQorX19TWVNDQUxMKF9fTlJfZXBvbGxfd2FpdF9vbGQsIHN5c19uaV9zeXNjYWxsKQorI2RlZmluZSBfX05SX3JlbWFwX2ZpbGVfcGFnZXMJCQkyMTYKK19fU1lTQ0FMTChfX05SX3JlbWFwX2ZpbGVfcGFnZXMsIHN5c19yZW1hcF9maWxlX3BhZ2VzKQorI2RlZmluZSBfX05SX2dldGRlbnRzNjQJCQkJMjE3CitfX1NZU0NBTEwoX19OUl9nZXRkZW50czY0LCBzeXNfZ2V0ZGVudHM2NCkKKyNkZWZpbmUgX19OUl9zZXRfdGlkX2FkZHJlc3MJCQkyMTgKK19fU1lTQ0FMTChfX05SX3NldF90aWRfYWRkcmVzcywgc3lzX3NldF90aWRfYWRkcmVzcykKKyNkZWZpbmUgX19OUl9yZXN0YXJ0X3N5c2NhbGwJCQkyMTkKK19fU1lTQ0FMTChfX05SX3Jlc3RhcnRfc3lzY2FsbCwgc3lzX3Jlc3RhcnRfc3lzY2FsbCkKKyNkZWZpbmUgX19OUl9zZW10aW1lZG9wCQkJCTIyMAorX19TWVNDQUxMKF9fTlJfc2VtdGltZWRvcCwgc3lzX3NlbXRpbWVkb3ApCisjZGVmaW5lIF9fTlJfZmFkdmlzZTY0CQkJCTIyMQorX19TWVNDQUxMKF9fTlJfZmFkdmlzZTY0LCBzeXNfZmFkdmlzZTY0KQorI2RlZmluZSBfX05SX3RpbWVyX2NyZWF0ZQkJCTIyMgorX19TWVNDQUxMKF9fTlJfdGltZXJfY3JlYXRlLCBzeXNfdGltZXJfY3JlYXRlKQorI2RlZmluZSBfX05SX3RpbWVyX3NldHRpbWUJCQkyMjMKK19fU1lTQ0FMTChfX05SX3RpbWVyX3NldHRpbWUsIHN5c190aW1lcl9zZXR0aW1lKQorI2RlZmluZSBfX05SX3RpbWVyX2dldHRpbWUJCQkyMjQKK19fU1lTQ0FMTChfX05SX3RpbWVyX2dldHRpbWUsIHN5c190aW1lcl9nZXR0aW1lKQorI2RlZmluZSBfX05SX3RpbWVyX2dldG92ZXJydW4JCQkyMjUKK19fU1lTQ0FMTChfX05SX3RpbWVyX2dldG92ZXJydW4sIHN5c190aW1lcl9nZXRvdmVycnVuKQorI2RlZmluZSBfX05SX3RpbWVyX2RlbGV0ZQkJCTIyNgorX19TWVNDQUxMKF9fTlJfdGltZXJfZGVsZXRlLCBzeXNfdGltZXJfZGVsZXRlKQorI2RlZmluZSBfX05SX2Nsb2NrX3NldHRpbWUJCQkyMjcKK19fU1lTQ0FMTChfX05SX2Nsb2NrX3NldHRpbWUsIHN5c19jbG9ja19zZXR0aW1lKQorI2RlZmluZSBfX05SX2Nsb2NrX2dldHRpbWUJCQkyMjgKK19fU1lTQ0FMTChfX05SX2Nsb2NrX2dldHRpbWUsIHN5c19jbG9ja19nZXR0aW1lKQorI2RlZmluZSBfX05SX2Nsb2NrX2dldHJlcwkJCTIyOQorX19TWVNDQUxMKF9fTlJfY2xvY2tfZ2V0cmVzLCBzeXNfY2xvY2tfZ2V0cmVzKQorI2RlZmluZSBfX05SX2Nsb2NrX25hbm9zbGVlcAkJCTIzMAorX19TWVNDQUxMKF9fTlJfY2xvY2tfbmFub3NsZWVwLCBzeXNfY2xvY2tfbmFub3NsZWVwKQorI2RlZmluZSBfX05SX2V4aXRfZ3JvdXAJCQkJMjMxCitfX1NZU0NBTEwoX19OUl9leGl0X2dyb3VwLCBzeXNfZXhpdF9ncm91cCkKKyNkZWZpbmUgX19OUl9lcG9sbF93YWl0CQkJCTIzMgorX19TWVNDQUxMKF9fTlJfZXBvbGxfd2FpdCwgc3lzX2Vwb2xsX3dhaXQpCisjZGVmaW5lIF9fTlJfZXBvbGxfY3RsCQkJCTIzMworX19TWVNDQUxMKF9fTlJfZXBvbGxfY3RsLCBzeXNfZXBvbGxfY3RsKQorI2RlZmluZSBfX05SX3Rna2lsbAkJCQkyMzQKK19fU1lTQ0FMTChfX05SX3Rna2lsbCwgc3lzX3Rna2lsbCkKKyNkZWZpbmUgX19OUl91dGltZXMJCQkJMjM1CitfX1NZU0NBTEwoX19OUl91dGltZXMsIHN5c191dGltZXMpCisjZGVmaW5lIF9fTlJfdnNlcnZlcgkJCQkyMzYKK19fU1lTQ0FMTChfX05SX3ZzZXJ2ZXIsIHN5c19uaV9zeXNjYWxsKQorI2RlZmluZSBfX05SX21iaW5kCQkJCTIzNworX19TWVNDQUxMKF9fTlJfbWJpbmQsIHN5c19tYmluZCkKKyNkZWZpbmUgX19OUl9zZXRfbWVtcG9saWN5CQkJMjM4CitfX1NZU0NBTEwoX19OUl9zZXRfbWVtcG9saWN5LCBzeXNfc2V0X21lbXBvbGljeSkKKyNkZWZpbmUgX19OUl9nZXRfbWVtcG9saWN5CQkJMjM5CitfX1NZU0NBTEwoX19OUl9nZXRfbWVtcG9saWN5LCBzeXNfZ2V0X21lbXBvbGljeSkKKyNkZWZpbmUgX19OUl9tcV9vcGVuCQkJCTI0MAorX19TWVNDQUxMKF9fTlJfbXFfb3Blbiwgc3lzX21xX29wZW4pCisjZGVmaW5lIF9fTlJfbXFfdW5saW5rCQkJCTI0MQorX19TWVNDQUxMKF9fTlJfbXFfdW5saW5rLCBzeXNfbXFfdW5saW5rKQorI2RlZmluZSBfX05SX21xX3RpbWVkc2VuZAkJCTI0MgorX19TWVNDQUxMKF9fTlJfbXFfdGltZWRzZW5kLCBzeXNfbXFfdGltZWRzZW5kKQorI2RlZmluZSBfX05SX21xX3RpbWVkcmVjZWl2ZQkJCTI0MworX19TWVNDQUxMKF9fTlJfbXFfdGltZWRyZWNlaXZlLCBzeXNfbXFfdGltZWRyZWNlaXZlKQorI2RlZmluZSBfX05SX21xX25vdGlmeQkJCQkyNDQKK19fU1lTQ0FMTChfX05SX21xX25vdGlmeSwgc3lzX21xX25vdGlmeSkKKyNkZWZpbmUgX19OUl9tcV9nZXRzZXRhdHRyCQkJMjQ1CitfX1NZU0NBTEwoX19OUl9tcV9nZXRzZXRhdHRyLCBzeXNfbXFfZ2V0c2V0YXR0cikKKyNkZWZpbmUgX19OUl9rZXhlY19sb2FkCQkJCTI0NgorX19TWVNDQUxMKF9fTlJfa2V4ZWNfbG9hZCwgc3lzX2tleGVjX2xvYWQpCisjZGVmaW5lIF9fTlJfd2FpdGlkCQkJCTI0NworX19TWVNDQUxMKF9fTlJfd2FpdGlkLCBzeXNfd2FpdGlkKQorI2RlZmluZSBfX05SX2FkZF9rZXkJCQkJMjQ4CitfX1NZU0NBTEwoX19OUl9hZGRfa2V5LCBzeXNfYWRkX2tleSkKKyNkZWZpbmUgX19OUl9yZXF1ZXN0X2tleQkJCTI0OQorX19TWVNDQUxMKF9fTlJfcmVxdWVzdF9rZXksIHN5c19yZXF1ZXN0X2tleSkKKyNkZWZpbmUgX19OUl9rZXljdGwJCQkJMjUwCitfX1NZU0NBTEwoX19OUl9rZXljdGwsIHN5c19rZXljdGwpCisjZGVmaW5lIF9fTlJfaW9wcmlvX3NldAkJCQkyNTEKK19fU1lTQ0FMTChfX05SX2lvcHJpb19zZXQsIHN5c19pb3ByaW9fc2V0KQorI2RlZmluZSBfX05SX2lvcHJpb19nZXQJCQkJMjUyCitfX1NZU0NBTEwoX19OUl9pb3ByaW9fZ2V0LCBzeXNfaW9wcmlvX2dldCkKKyNkZWZpbmUgX19OUl9pbm90aWZ5X2luaXQJCQkyNTMKK19fU1lTQ0FMTChfX05SX2lub3RpZnlfaW5pdCwgc3lzX2lub3RpZnlfaW5pdCkKKyNkZWZpbmUgX19OUl9pbm90aWZ5X2FkZF93YXRjaAkJCTI1NAorX19TWVNDQUxMKF9fTlJfaW5vdGlmeV9hZGRfd2F0Y2gsIHN5c19pbm90aWZ5X2FkZF93YXRjaCkKKyNkZWZpbmUgX19OUl9pbm90aWZ5X3JtX3dhdGNoCQkJMjU1CitfX1NZU0NBTEwoX19OUl9pbm90aWZ5X3JtX3dhdGNoLCBzeXNfaW5vdGlmeV9ybV93YXRjaCkKKyNkZWZpbmUgX19OUl9taWdyYXRlX3BhZ2VzCQkJMjU2CitfX1NZU0NBTEwoX19OUl9taWdyYXRlX3BhZ2VzLCBzeXNfbWlncmF0ZV9wYWdlcykKKyNkZWZpbmUgX19OUl9vcGVuYXQJCQkJMjU3CitfX1NZU0NBTEwoX19OUl9vcGVuYXQsIHN5c19vcGVuYXQpCisjZGVmaW5lIF9fTlJfbWtkaXJhdAkJCQkyNTgKK19fU1lTQ0FMTChfX05SX21rZGlyYXQsIHN5c19ta2RpcmF0KQorI2RlZmluZSBfX05SX21rbm9kYXQJCQkJMjU5CitfX1NZU0NBTEwoX19OUl9ta25vZGF0LCBzeXNfbWtub2RhdCkKKyNkZWZpbmUgX19OUl9mY2hvd25hdAkJCQkyNjAKK19fU1lTQ0FMTChfX05SX2ZjaG93bmF0LCBzeXNfZmNob3duYXQpCisjZGVmaW5lIF9fTlJfZnV0aW1lc2F0CQkJCTI2MQorX19TWVNDQUxMKF9fTlJfZnV0aW1lc2F0LCBzeXNfZnV0aW1lc2F0KQorI2RlZmluZSBfX05SX25ld2ZzdGF0YXQJCQkJMjYyCitfX1NZU0NBTEwoX19OUl9uZXdmc3RhdGF0LCBzeXNfbmV3ZnN0YXRhdCkKKyNkZWZpbmUgX19OUl91bmxpbmthdAkJCQkyNjMKK19fU1lTQ0FMTChfX05SX3VubGlua2F0LCBzeXNfdW5saW5rYXQpCisjZGVmaW5lIF9fTlJfcmVuYW1lYXQJCQkJMjY0CitfX1NZU0NBTEwoX19OUl9yZW5hbWVhdCwgc3lzX3JlbmFtZWF0KQorI2RlZmluZSBfX05SX2xpbmthdAkJCQkyNjUKK19fU1lTQ0FMTChfX05SX2xpbmthdCwgc3lzX2xpbmthdCkKKyNkZWZpbmUgX19OUl9zeW1saW5rYXQJCQkJMjY2CitfX1NZU0NBTEwoX19OUl9zeW1saW5rYXQsIHN5c19zeW1saW5rYXQpCisjZGVmaW5lIF9fTlJfcmVhZGxpbmthdAkJCQkyNjcKK19fU1lTQ0FMTChfX05SX3JlYWRsaW5rYXQsIHN5c19yZWFkbGlua2F0KQorI2RlZmluZSBfX05SX2ZjaG1vZGF0CQkJCTI2OAorX19TWVNDQUxMKF9fTlJfZmNobW9kYXQsIHN5c19mY2htb2RhdCkKKyNkZWZpbmUgX19OUl9mYWNjZXNzYXQJCQkJMjY5CitfX1NZU0NBTEwoX19OUl9mYWNjZXNzYXQsIHN5c19mYWNjZXNzYXQpCisjZGVmaW5lIF9fTlJfcHNlbGVjdDYJCQkJMjcwCitfX1NZU0NBTEwoX19OUl9wc2VsZWN0Niwgc3lzX3BzZWxlY3Q2KQorI2RlZmluZSBfX05SX3Bwb2xsCQkJCTI3MQorX19TWVNDQUxMKF9fTlJfcHBvbGwsCXN5c19wcG9sbCkKKyNkZWZpbmUgX19OUl91bnNoYXJlCQkJCTI3MgorX19TWVNDQUxMKF9fTlJfdW5zaGFyZSwJc3lzX3Vuc2hhcmUpCisjZGVmaW5lIF9fTlJfc2V0X3JvYnVzdF9saXN0CQkJMjczCitfX1NZU0NBTEwoX19OUl9zZXRfcm9idXN0X2xpc3QsIHN5c19zZXRfcm9idXN0X2xpc3QpCisjZGVmaW5lIF9fTlJfZ2V0X3JvYnVzdF9saXN0CQkJMjc0CitfX1NZU0NBTEwoX19OUl9nZXRfcm9idXN0X2xpc3QsIHN5c19nZXRfcm9idXN0X2xpc3QpCisjZGVmaW5lIF9fTlJfc3BsaWNlCQkJCTI3NQorX19TWVNDQUxMKF9fTlJfc3BsaWNlLCBzeXNfc3BsaWNlKQorI2RlZmluZSBfX05SX3RlZQkJCQkyNzYKK19fU1lTQ0FMTChfX05SX3RlZSwgc3lzX3RlZSkKKyNkZWZpbmUgX19OUl9zeW5jX2ZpbGVfcmFuZ2UJCQkyNzcKK19fU1lTQ0FMTChfX05SX3N5bmNfZmlsZV9yYW5nZSwgc3lzX3N5bmNfZmlsZV9yYW5nZSkKKyNkZWZpbmUgX19OUl92bXNwbGljZQkJCQkyNzgKK19fU1lTQ0FMTChfX05SX3Ztc3BsaWNlLCBzeXNfdm1zcGxpY2UpCisjZGVmaW5lIF9fTlJfbW92ZV9wYWdlcwkJCQkyNzkKK19fU1lTQ0FMTChfX05SX21vdmVfcGFnZXMsIHN5c19tb3ZlX3BhZ2VzKQorI2RlZmluZSBfX05SX3V0aW1lbnNhdAkJCQkyODAKK19fU1lTQ0FMTChfX05SX3V0aW1lbnNhdCwgc3lzX3V0aW1lbnNhdCkKKyNkZWZpbmUgX19OUl9lcG9sbF9wd2FpdAkJCTI4MQorX19TWVNDQUxMKF9fTlJfZXBvbGxfcHdhaXQsIHN5c19lcG9sbF9wd2FpdCkKKyNkZWZpbmUgX19OUl9zaWduYWxmZAkJCQkyODIKK19fU1lTQ0FMTChfX05SX3NpZ25hbGZkLCBzeXNfc2lnbmFsZmQpCisjZGVmaW5lIF9fTlJfdGltZXJmZF9jcmVhdGUJCQkyODMKK19fU1lTQ0FMTChfX05SX3RpbWVyZmRfY3JlYXRlLCBzeXNfdGltZXJmZF9jcmVhdGUpCisjZGVmaW5lIF9fTlJfZXZlbnRmZAkJCQkyODQKK19fU1lTQ0FMTChfX05SX2V2ZW50ZmQsIHN5c19ldmVudGZkKQorI2RlZmluZSBfX05SX2ZhbGxvY2F0ZQkJCQkyODUKK19fU1lTQ0FMTChfX05SX2ZhbGxvY2F0ZSwgc3lzX2ZhbGxvY2F0ZSkKKyNkZWZpbmUgX19OUl90aW1lcmZkX3NldHRpbWUJCQkyODYKK19fU1lTQ0FMTChfX05SX3RpbWVyZmRfc2V0dGltZSwgc3lzX3RpbWVyZmRfc2V0dGltZSkKKyNkZWZpbmUgX19OUl90aW1lcmZkX2dldHRpbWUJCQkyODcKK19fU1lTQ0FMTChfX05SX3RpbWVyZmRfZ2V0dGltZSwgc3lzX3RpbWVyZmRfZ2V0dGltZSkKKyNkZWZpbmUgX19OUl9hY2NlcHQ0CQkJCTI4OAorX19TWVNDQUxMKF9fTlJfYWNjZXB0NCwgc3lzX2FjY2VwdDQpCisjZGVmaW5lIF9fTlJfc2lnbmFsZmQ0CQkJCTI4OQorX19TWVNDQUxMKF9fTlJfc2lnbmFsZmQ0LCBzeXNfc2lnbmFsZmQ0KQorI2RlZmluZSBfX05SX2V2ZW50ZmQyCQkJCTI5MAorX19TWVNDQUxMKF9fTlJfZXZlbnRmZDIsIHN5c19ldmVudGZkMikKKyNkZWZpbmUgX19OUl9lcG9sbF9jcmVhdGUxCQkJMjkxCitfX1NZU0NBTEwoX19OUl9lcG9sbF9jcmVhdGUxLCBzeXNfZXBvbGxfY3JlYXRlMSkKKyNkZWZpbmUgX19OUl9kdXAzCQkJCTI5MgorX19TWVNDQUxMKF9fTlJfZHVwMywgc3lzX2R1cDMpCisjZGVmaW5lIF9fTlJfcGlwZTIJCQkJMjkzCitfX1NZU0NBTEwoX19OUl9waXBlMiwgc3lzX3BpcGUyKQorI2RlZmluZSBfX05SX2lub3RpZnlfaW5pdDEJCQkyOTQKK19fU1lTQ0FMTChfX05SX2lub3RpZnlfaW5pdDEsIHN5c19pbm90aWZ5X2luaXQxKQorI2RlZmluZSBfX05SX3ByZWFkdgkJCQkyOTUKK19fU1lTQ0FMTChfX05SX3ByZWFkdiwgc3lzX3ByZWFkdikKKyNkZWZpbmUgX19OUl9wd3JpdGV2CQkJCTI5NgorX19TWVNDQUxMKF9fTlJfcHdyaXRldiwgc3lzX3B3cml0ZXYpCisjZGVmaW5lIF9fTlJfcnRfdGdzaWdxdWV1ZWluZm8JCQkyOTcKK19fU1lTQ0FMTChfX05SX3J0X3Rnc2lncXVldWVpbmZvLCBzeXNfcnRfdGdzaWdxdWV1ZWluZm8pCisjZGVmaW5lIF9fTlJfcGVyZl9ldmVudF9vcGVuCQkJMjk4CitfX1NZU0NBTEwoX19OUl9wZXJmX2V2ZW50X29wZW4sIHN5c19wZXJmX2V2ZW50X29wZW4pCisjZGVmaW5lIF9fTlJfcmVjdm1tc2cJCQkJMjk5CitfX1NZU0NBTEwoX19OUl9yZWN2bW1zZywgc3lzX3JlY3ZtbXNnKQorI2RlZmluZSBfX05SX2Zhbm90aWZ5X2luaXQJCQkzMDAKK19fU1lTQ0FMTChfX05SX2Zhbm90aWZ5X2luaXQsIHN5c19mYW5vdGlmeV9pbml0KQorI2RlZmluZSBfX05SX2Zhbm90aWZ5X21hcmsJCQkzMDEKK19fU1lTQ0FMTChfX05SX2Zhbm90aWZ5X21hcmssIHN5c19mYW5vdGlmeV9tYXJrKQorI2RlZmluZSBfX05SX3BybGltaXQ2NAkJCQkzMDIKK19fU1lTQ0FMTChfX05SX3BybGltaXQ2NCwgc3lzX3BybGltaXQ2NCkKKyNkZWZpbmUgX19OUl9uYW1lX3RvX2hhbmRsZV9hdAkJCTMwMworX19TWVNDQUxMKF9fTlJfbmFtZV90b19oYW5kbGVfYXQsIHN5c19uYW1lX3RvX2hhbmRsZV9hdCkKKyNkZWZpbmUgX19OUl9vcGVuX2J5X2hhbmRsZV9hdAkJCTMwNAorX19TWVNDQUxMKF9fTlJfb3Blbl9ieV9oYW5kbGVfYXQsIHN5c19vcGVuX2J5X2hhbmRsZV9hdCkKKyNkZWZpbmUgX19OUl9jbG9ja19hZGp0aW1lCQkJMzA1CitfX1NZU0NBTEwoX19OUl9jbG9ja19hZGp0aW1lLCBzeXNfY2xvY2tfYWRqdGltZSkKKyNkZWZpbmUgX19OUl9zeW5jZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwNgorX19TWVNDQUxMKF9fTlJfc3luY2ZzLCBzeXNfc3luY2ZzKQorI2RlZmluZSBfX05SX3NlbmRtbXNnCQkJCTMwNworX19TWVNDQUxMKF9fTlJfc2VuZG1tc2csIHN5c19zZW5kbW1zZykKKyNkZWZpbmUgX19OUl9zZXRucwkJCQkzMDgKK19fU1lTQ0FMTChfX05SX3NldG5zLCBzeXNfc2V0bnMpCisjZGVmaW5lIF9fTlJfZ2V0Y3B1CQkJCTMwOQorX19TWVNDQUxMKF9fTlJfZ2V0Y3B1LCBzeXNfZ2V0Y3B1KQorI2RlZmluZSBfX05SX3Byb2Nlc3Nfdm1fcmVhZHYJCQkzMTAKK19fU1lTQ0FMTChfX05SX3Byb2Nlc3Nfdm1fcmVhZHYsIHN5c19wcm9jZXNzX3ZtX3JlYWR2KQorI2RlZmluZSBfX05SX3Byb2Nlc3Nfdm1fd3JpdGV2CQkJMzExCitfX1NZU0NBTEwoX19OUl9wcm9jZXNzX3ZtX3dyaXRldiwgc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2KQorCisjaWZuZGVmIF9fTk9fU1RVQlMKKyNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKKyNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1NUQVQKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX0FMQVJNCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19HRVRIT1NUTkFNRQorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfUEFVU0UKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NHRVRNQVNLCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TSUdOQUwKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1VUSU1FCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19XQUlUUElECisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TT0NLRVRDQUxMCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19GQURWSVNFNjQKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX0dFVFBHUlAKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX0xMU0VFSworI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfTklDRQorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfT0xEX0dFVFJMSU1JVAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfT0xEX1VOQU1FCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19PTERVTU9VTlQKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NJR1BFTkRJTkcKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NJR1BST0NNQVNLCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19SVF9TSUdBQ1RJT04KKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1JUX1NJR1NVU1BFTkQKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1RJTUUKKyNkZWZpbmUgX19BUkNIX1dBTlRfQ09NUEFUX1NZU19USU1FCisjZW5kaWYJLyogX19OT19TVFVCUyAqLworCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9VTklTVERfNjRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vdm04Ni5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vdm04Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMWRhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS92bTg2LmgKQEAgLTAsMCArMSwxMjkgQEAKKyNpZm5kZWYgX0FTTV9YODZfVk04Nl9ICisjZGVmaW5lIF9BU01fWDg2X1ZNODZfSAorCisvKgorICogSSdtIGd1ZXNzaW5nIGF0IHRoZSBWSUYvVklQIGZsYWcgdXNhZ2UsIGJ1dCBob3BlIHRoYXQgdGhpcyBpcyBob3cKKyAqIHRoZSBQZW50aXVtIHVzZXMgdGhlbS4gTGludXggd2lsbCByZXR1cm4gZnJvbSB2bTg2IG1vZGUgd2hlbiBib3RoCisgKiBWSUYgYW5kIFZJUCBpcyBzZXQuCisgKgorICogT24gYSBQZW50aXVtLCB3ZSBjb3VsZCBwcm9iYWJseSBvcHRpbWl6ZSB0aGUgdmlydHVhbCBmbGFncyBkaXJlY3RseQorICogaW4gdGhlIGVmbGFncyByZWdpc3RlciBpbnN0ZWFkIG9mIGRvaW5nIGl0ICJieSBoYW5kIiBpbiB2ZmxhZ3MuLi4KKyAqCisgKiBMaW51cworICovCisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLWZsYWdzLmg+CisKKyNkZWZpbmUgQklPU1NFRwkJMHgwZjAwMAorCisjZGVmaW5lIENQVV8wODYJCTAKKyNkZWZpbmUgQ1BVXzE4NgkJMQorI2RlZmluZSBDUFVfMjg2CQkyCisjZGVmaW5lIENQVV8zODYJCTMKKyNkZWZpbmUgQ1BVXzQ4NgkJNAorI2RlZmluZSBDUFVfNTg2CQk1CisKKy8qCisgKiBSZXR1cm4gdmFsdWVzIGZvciB0aGUgJ3ZtODYoKScgc3lzdGVtIGNhbGwKKyAqLworI2RlZmluZSBWTTg2X1RZUEUocmV0dmFsKQkoKHJldHZhbCkgJiAweGZmKQorI2RlZmluZSBWTTg2X0FSRyhyZXR2YWwpCSgocmV0dmFsKSA+PiA4KQorCisjZGVmaW5lIFZNODZfU0lHTkFMCTAJLyogcmV0dXJuIGR1ZSB0byBzaWduYWwgKi8KKyNkZWZpbmUgVk04Nl9VTktOT1dOCTEJLyogdW5oYW5kbGVkIEdQIGZhdWx0CisJCQkJICAgLSBJTy1pbnN0cnVjdGlvbiBvciBzaW1pbGFyICovCisjZGVmaW5lIFZNODZfSU5UeAkyCS8qIGludDMvaW50IHggaW5zdHJ1Y3Rpb24gKEFSRyA9IHgpICovCisjZGVmaW5lIFZNODZfU1RJCTMJLyogc3RpL3BvcGYvaXJldCBpbnN0cnVjdGlvbiBlbmFibGVkCisJCQkJICAgdmlydHVhbCBpbnRlcnJ1cHRzICovCisKKy8qCisgKiBBZGRpdGlvbmFsIHJldHVybiB2YWx1ZXMgd2hlbiBpbnZva2luZyBuZXcgdm04NigpCisgKi8KKyNkZWZpbmUgVk04Nl9QSUNSRVRVUk4JNAkvKiByZXR1cm4gZHVlIHRvIHBlbmRpbmcgUElDIHJlcXVlc3QgKi8KKyNkZWZpbmUgVk04Nl9UUkFQCTYJLyogcmV0dXJuIGR1ZSB0byBET1MtZGVidWdnZXIgcmVxdWVzdCAqLworCisvKgorICogZnVuY3Rpb24gY29kZXMgd2hlbiBpbnZva2luZyBuZXcgdm04NigpCisgKi8KKyNkZWZpbmUgVk04Nl9QTFVTX0lOU1RBTExfQ0hFQ0sJMAorI2RlZmluZSBWTTg2X0VOVEVSCQkxCisjZGVmaW5lIFZNODZfRU5URVJfTk9fQllQQVNTCTIKKyNkZWZpbmUJVk04Nl9SRVFVRVNUX0lSUQkzCisjZGVmaW5lIFZNODZfRlJFRV9JUlEJCTQKKyNkZWZpbmUgVk04Nl9HRVRfSVJRX0JJVFMJNQorI2RlZmluZSBWTTg2X0dFVF9BTkRfUkVTRVRfSVJRCTYKKworLyoKKyAqIFRoaXMgaXMgdGhlIHN0YWNrLWxheW91dCBzZWVuIGJ5IHRoZSB1c2VyIHNwYWNlIHByb2dyYW0gd2hlbiB3ZSBoYXZlCisgKiBkb25lIGEgdHJhbnNsYXRpb24gb2YgIlNBVkVfQUxMIiBmcm9tIHZtODYgbW9kZS4gVGhlIHJlYWwga2VybmVsIGxheW91dAorICogaXMgJ2tlcm5lbF92bTg2X3JlZ3MnIChzZWUgYmVsb3cpLgorICovCisKK3N0cnVjdCB2bTg2X3JlZ3MgeworLyoKKyAqIG5vcm1hbCByZWdzLCB3aXRoIHNwZWNpYWwgbWVhbmluZyBmb3IgdGhlIHNlZ21lbnQgZGVzY3JpcHRvcnMuLgorICovCisJbG9uZyBlYng7CisJbG9uZyBlY3g7CisJbG9uZyBlZHg7CisJbG9uZyBlc2k7CisJbG9uZyBlZGk7CisJbG9uZyBlYnA7CisJbG9uZyBlYXg7CisJbG9uZyBfX251bGxfZHM7CisJbG9uZyBfX251bGxfZXM7CisJbG9uZyBfX251bGxfZnM7CisJbG9uZyBfX251bGxfZ3M7CisJbG9uZyBvcmlnX2VheDsKKwlsb25nIGVpcDsKKwl1bnNpZ25lZCBzaG9ydCBjcywgX19jc2g7CisJbG9uZyBlZmxhZ3M7CisJbG9uZyBlc3A7CisJdW5zaWduZWQgc2hvcnQgc3MsIF9fc3NoOworLyoKKyAqIHRoZXNlIGFyZSBzcGVjaWZpYyB0byB2ODYgbW9kZToKKyAqLworCXVuc2lnbmVkIHNob3J0IGVzLCBfX2VzaDsKKwl1bnNpZ25lZCBzaG9ydCBkcywgX19kc2g7CisJdW5zaWduZWQgc2hvcnQgZnMsIF9fZnNoOworCXVuc2lnbmVkIHNob3J0IGdzLCBfX2dzaDsKK307CisKK3N0cnVjdCByZXZlY3RvcmVkX3N0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBfX21hcFs4XTsJCQkvKiAyNTYgYml0cyAqLworfTsKKworc3RydWN0IHZtODZfc3RydWN0IHsKKwlzdHJ1Y3Qgdm04Nl9yZWdzIHJlZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHNjcmVlbl9iaXRtYXA7CisJdW5zaWduZWQgbG9uZyBjcHVfdHlwZTsKKwlzdHJ1Y3QgcmV2ZWN0b3JlZF9zdHJ1Y3QgaW50X3JldmVjdG9yZWQ7CisJc3RydWN0IHJldmVjdG9yZWRfc3RydWN0IGludDIxX3JldmVjdG9yZWQ7Cit9OworCisvKgorICogZmxhZ3MgbWFza3MKKyAqLworI2RlZmluZSBWTTg2X1NDUkVFTl9CSVRNQVAJMHgwMDAxCisKK3N0cnVjdCB2bTg2cGx1c19pbmZvX3N0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBmb3JjZV9yZXR1cm5fZm9yX3BpYzoxOworCXVuc2lnbmVkIGxvbmcgdm04NmRiZ19hY3RpdmU6MTsgICAgICAgLyogZm9yIGRlYnVnZ2VyICovCisJdW5zaWduZWQgbG9uZyB2bTg2ZGJnX1RGcGVuZGlnOjE7ICAgICAvKiBmb3IgZGVidWdnZXIgKi8KKwl1bnNpZ25lZCBsb25nIHVudXNlZDoyODsKKwl1bnNpZ25lZCBsb25nIGlzX3ZtODZwdXM6MTsJICAgICAgLyogZm9yIHZtODYgaW50ZXJuYWwgdXNlICovCisJdW5zaWduZWQgY2hhciB2bTg2ZGJnX2ludHh4dGFiWzMyXTsgICAvKiBmb3IgZGVidWdnZXIgKi8KK307CitzdHJ1Y3Qgdm04NnBsdXNfc3RydWN0IHsKKwlzdHJ1Y3Qgdm04Nl9yZWdzIHJlZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHNjcmVlbl9iaXRtYXA7CisJdW5zaWduZWQgbG9uZyBjcHVfdHlwZTsKKwlzdHJ1Y3QgcmV2ZWN0b3JlZF9zdHJ1Y3QgaW50X3JldmVjdG9yZWQ7CisJc3RydWN0IHJldmVjdG9yZWRfc3RydWN0IGludDIxX3JldmVjdG9yZWQ7CisJc3RydWN0IHZtODZwbHVzX2luZm9fc3RydWN0IHZtODZwbHVzOworfTsKKworCisjZW5kaWYgLyogX0FTTV9YODZfVk04Nl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2FzbS92c3lzY2FsbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vdnN5c2NhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTY1YmIxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9hc20vdnN5c2NhbGwuaApAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIF9BU01fWDg2X1ZTWVNDQUxMX0gKKyNkZWZpbmUgX0FTTV9YODZfVlNZU0NBTExfSAorCitlbnVtIHZzeXNjYWxsX251bSB7CisJX19OUl92Z2V0dGltZW9mZGF5LAorCV9fTlJfdnRpbWUsCisJX19OUl92Z2V0Y3B1LAorfTsKKworI2RlZmluZSBWU1lTQ0FMTF9TVEFSVCAoLTEwVUwgPDwgMjApCisjZGVmaW5lIFZTWVNDQUxMX1NJWkUgMTAyNAorI2RlZmluZSBWU1lTQ0FMTF9FTkQgKC0yVUwgPDwgMjApCisjZGVmaW5lIFZTWVNDQUxMX01BUFBFRF9QQUdFUyAxCisjZGVmaW5lIFZTWVNDQUxMX0FERFIodnN5c2NhbGxfbnIpIChWU1lTQ0FMTF9TVEFSVCtWU1lTQ0FMTF9TSVpFKih2c3lzY2FsbF9ucikpCisKKworI2VuZGlmIC8qIF9BU01fWDg2X1ZTWVNDQUxMX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9hLm91dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2Eub3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZiNTJjMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9hLm91dC5oCkBAIC0wLDAgKzEsMyBAQAorI2lmbmRlZiBfX0FfT1VUX0dOVV9IX18KKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9hLm91dC5oPiBkaXJlY3RseTsgaW5jbHVkZSA8YS5vdXQuaD4gaW5zdGVhZC4iCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9ieXRlc3dhcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2J5dGVzd2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRmYjc4NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9ieXRlc3dhcC5oCkBAIC0wLDAgKzEsMTM3IEBACisvKiBNYWNyb3MgdG8gc3dhcCB0aGUgb3JkZXIgb2YgYnl0ZXMgaW4gaW50ZWdlciB2YWx1ZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDIwMDAsIDIwMDIsIDIwMDMsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMTAsIDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWYgIWRlZmluZWQgX0JZVEVTV0FQX0ggJiYgIWRlZmluZWQgX05FVElORVRfSU5fSCAmJiAhZGVmaW5lZCBfRU5ESUFOX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9ieXRlc3dhcC5oPiBkaXJlY3RseTsgaW5jbHVkZSA8Ynl0ZXN3YXAuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfQklUU19CWVRFU1dBUF9ICisjZGVmaW5lIF9CSVRTX0JZVEVTV0FQX0ggMQorCisvKiBTd2FwIGJ5dGVzIGluIDE2IGJpdCB2YWx1ZS4gICovCisjZGVmaW5lIF9fYnN3YXBfY29uc3RhbnRfMTYoeCkgXAorICAgICAoKHVuc2lnbmVkIHNob3J0IGludCkgKCgoKHgpID4+IDgpICYgMHhmZikgfCAoKCh4KSAmIDB4ZmYpIDw8IDgpKSkKKworI2lmZGVmIF9fR05VQ19fCisjIGlmIF9fR05VQ19fID49IDIKKyMgIGRlZmluZSBfX2Jzd2FwXzE2KHgpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgICAgKHsgcmVnaXN0ZXIgdW5zaWduZWQgc2hvcnQgaW50IF9fdiwgX194ID0gKHVuc2lnbmVkIHNob3J0IGludCkgKHgpOyAgICAgXAorCSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9feCkpCQkJCSAgICAgIFwKKwkgICBfX3YgPSBfX2Jzd2FwX2NvbnN0YW50XzE2IChfX3gpOwkJCQkgICAgICBcCisJIGVsc2UJCQkJCQkJCSAgICAgIFwKKwkgICBfX2FzbV9fICgicm9ydyAkOCwgJXcwIgkJCQkJICAgICAgXAorCQkgICAgOiAiPXIiIChfX3YpCQkJCQkgICAgICBcCisJCSAgICA6ICIwIiAoX194KQkJCQkJCSAgICAgIFwKKwkJICAgIDogImNjIik7CQkJCQkJICAgICAgXAorCSBfX3Y7IH0pKQorIyBlbHNlCisvKiBUaGlzIGlzIGJldHRlciB0aGFuIG5vdGhpbmcuICAqLworIyAgZGVmaW5lIF9fYnN3YXBfMTYoeCkgXAorICAgICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAgICAoeyByZWdpc3RlciB1bnNpZ25lZCBzaG9ydCBpbnQgX194ID0gKHVuc2lnbmVkIHNob3J0IGludCkgKHgpOwkgICAgICBcCisJIF9fYnN3YXBfY29uc3RhbnRfMTYgKF9feCk7IH0pKQorIyBlbmRpZgorI2Vsc2UKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBzaG9ydCBpbnQKK19fYnN3YXBfMTYgKHVuc2lnbmVkIHNob3J0IGludCBfX2JzeCkKK3sKKyAgcmV0dXJuIF9fYnN3YXBfY29uc3RhbnRfMTYgKF9fYnN4KTsKK30KKyNlbmRpZgorCisvKiBTd2FwIGJ5dGVzIGluIDMyIGJpdCB2YWx1ZS4gICovCisjZGVmaW5lIF9fYnN3YXBfY29uc3RhbnRfMzIoeCkgXAorICAgICAoKCgoeCkgJiAweGZmMDAwMDAwKSA+PiAyNCkgfCAoKCh4KSAmIDB4MDBmZjAwMDApID4+ICA4KSB8CQkgICAgICBcCisgICAgICAoKCh4KSAmIDB4MDAwMGZmMDApIDw8ICA4KSB8ICgoKHgpICYgMHgwMDAwMDBmZikgPDwgMjQpKQorCisjaWZkZWYgX19HTlVDX18KKyMgaWYgX19HTlVDX18gPj0gMgorLyogVG8gc3dhcCB0aGUgYnl0ZXMgaW4gYSB3b3JkIHRoZSBpNDg2IHByb2Nlc3NvcnMgYW5kIHVwIHByb3ZpZGUgdGhlCisgICBgYnN3YXAnIG9wY29kZS4gIE9uIGkzODYgd2UgaGF2ZSB0byB1c2UgdGhyZWUgaW5zdHJ1Y3Rpb25zLiAgKi8KKyMgIGlmICFkZWZpbmVkIF9faTQ4Nl9fICYmICFkZWZpbmVkIF9fcGVudGl1bV9fICYmICFkZWZpbmVkIF9fcGVudGl1bXByb19fIFwKKyAgICAgICYmICFkZWZpbmVkIF9fcGVudGl1bTRfXyAmJiAhZGVmaW5lZCBfX2s4X18gJiYgIWRlZmluZWQgX19hdGhsb25fXyBcCisgICAgICAmJiAhZGVmaW5lZCBfX2s2X18gJiYgIWRlZmluZWQgX19ub2NvbmFfXyAmJiAhZGVmaW5lZCBfX2NvcmUyX18gXAorICAgICAgJiYgIWRlZmluZWQgX19nZW9kZV9fICYmICFkZWZpbmVkIF9fYW1kZmFtMTBfXworIyAgIGRlZmluZSBfX2Jzd2FwXzMyKHgpCQkJCQkJICAgICAgXAorICAgICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAgICAoeyByZWdpc3RlciB1bnNpZ25lZCBpbnQgX192LCBfX3ggPSAoeCk7CQkJCSAgICAgIFwKKwkgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX3gpKQkJCQkgICAgICBcCisJICAgX192ID0gX19ic3dhcF9jb25zdGFudF8zMiAoX194KTsJCQkJICAgICAgXAorCSBlbHNlCQkJCQkJCQkgICAgICBcCisJICAgX19hc21fXyAoInJvcncgJDgsICV3MDsiCQkJCQkgICAgICBcCisJCSAgICAicm9ybCAkMTYsICUwOyIJCQkJCSAgICAgIFwKKwkJICAgICJyb3J3ICQ4LCAldzAiCQkJCQkgICAgICBcCisJCSAgICA6ICI9ciIgKF9fdikJCQkJCSAgICAgIFwKKwkJICAgIDogIjAiIChfX3gpCQkJCQkJICAgICAgXAorCQkgICAgOiAiY2MiKTsJCQkJCQkgICAgICBcCisJIF9fdjsgfSkpCisjICBlbHNlCisjICAgZGVmaW5lIF9fYnN3YXBfMzIoeCkgXAorICAgICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAgICAoeyByZWdpc3RlciB1bnNpZ25lZCBpbnQgX192LCBfX3ggPSAoeCk7CQkJCSAgICAgIFwKKwkgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX3gpKQkJCQkgICAgICBcCisJICAgX192ID0gX19ic3dhcF9jb25zdGFudF8zMiAoX194KTsJCQkJICAgICAgXAorCSBlbHNlCQkJCQkJCQkgICAgICBcCisJICAgX19hc21fXyAoImJzd2FwICUwIiA6ICI9ciIgKF9fdikgOiAiMCIgKF9feCkpOwkJICAgICAgXAorCSBfX3Y7IH0pKQorIyAgZW5kaWYKKyMgZWxzZQorIyAgZGVmaW5lIF9fYnN3YXBfMzIoeCkgXAorICAgICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAgICAoeyByZWdpc3RlciB1bnNpZ25lZCBpbnQgX194ID0gKHgpOyBfX2Jzd2FwX2NvbnN0YW50XzMyIChfX3gpOyB9KSkKKyMgZW5kaWYKKyNlbHNlCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitfX2Jzd2FwXzMyICh1bnNpZ25lZCBpbnQgX19ic3gpCit7CisgIHJldHVybiBfX2Jzd2FwX2NvbnN0YW50XzMyIChfX2JzeCk7Cit9CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyCisvKiBTd2FwIGJ5dGVzIGluIDY0IGJpdCB2YWx1ZS4gICovCisjIGRlZmluZSBfX2Jzd2FwX2NvbnN0YW50XzY0KHgpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18gKCgoKHgpICYgMHhmZjAwMDAwMDAwMDAwMDAwdWxsKSA+PiA1NikJCSAgICAgIFwKKwkJICAgICB8ICgoKHgpICYgMHgwMGZmMDAwMDAwMDAwMDAwdWxsKSA+PiA0MCkJCSAgICAgIFwKKwkJICAgICB8ICgoKHgpICYgMHgwMDAwZmYwMDAwMDAwMDAwdWxsKSA+PiAyNCkJCSAgICAgIFwKKwkJICAgICB8ICgoKHgpICYgMHgwMDAwMDBmZjAwMDAwMDAwdWxsKSA+PiA4KQkJICAgICAgXAorCQkgICAgIHwgKCgoeCkgJiAweDAwMDAwMDAwZmYwMDAwMDB1bGwpIDw8IDgpCQkgICAgICBcCisJCSAgICAgfCAoKCh4KSAmIDB4MDAwMDAwMDAwMGZmMDAwMHVsbCkgPDwgMjQpCQkgICAgICBcCisJCSAgICAgfCAoKCh4KSAmIDB4MDAwMDAwMDAwMDAwZmYwMHVsbCkgPDwgNDApCQkgICAgICBcCisJCSAgICAgfCAoKCh4KSAmIDB4MDAwMDAwMDAwMDAwMDBmZnVsbCkgPDwgNTYpKSkKKworIyBkZWZpbmUgX19ic3dhcF82NCh4KSBcCisgICAgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICAgICh7IHVuaW9uIHsgX19leHRlbnNpb25fXyB1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fbGw7CQkgICAgICBcCisJCSB1bnNpZ25lZCBsb25nIGludCBfX2xbMl07IH0gX193LCBfX3I7CQkJICAgICAgXAorCSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKHgpKQkJCQkJICAgICAgXAorCSAgIF9fci5fX2xsID0gX19ic3dhcF9jb25zdGFudF82NCAoeCk7CQkJCSAgICAgIFwKKwkgZWxzZQkJCQkJCQkJICAgICAgXAorCSAgIHsJCQkJCQkJCSAgICAgIFwKKwkgICAgIF9fdy5fX2xsID0gKHgpOwkJCQkJCSAgICAgIFwKKwkgICAgIF9fci5fX2xbMF0gPSBfX2Jzd2FwXzMyIChfX3cuX19sWzFdKTsJCQkgICAgICBcCisJICAgICBfX3IuX19sWzFdID0gX19ic3dhcF8zMiAoX193Ll9fbFswXSk7CQkJICAgICAgXAorCSAgIH0JCQkJCQkJCSAgICAgIFwKKwkgX19yLl9fbGw7IH0pKQorI2VuZGlmCisKKyNlbmRpZiAvKiBfQklUU19CWVRFU1dBUF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvY21hdGhjYWxscy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2NtYXRoY2FsbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzdmZGJlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2NtYXRoY2FsbHMuaApAQCAtMCwwICsxLDE1OSBAQAorLyogUHJvdG90eXBlIGRlY2xhcmF0aW9ucyBmb3IgY29tcGxleCBtYXRoIGZ1bmN0aW9uczsKKyAgIGhlbHBlciBmaWxlIGZvciA8Y29tcGxleC5oPi4KKyAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMjAwMSwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogTk9URTogQmVjYXVzZSBvZiB0aGUgc3BlY2lhbCB3YXkgdGhpcyBmaWxlIGlzIHVzZWQgYnkgPGNvbXBsZXguaD4sIHRoaXMKKyAgIGZpbGUgbXVzdCBOT1QgYmUgcHJvdGVjdGVkIGZyb20gbXVsdGlwbGUgaW5jbHVzaW9uIGFzIGhlYWRlciBmaWxlcworICAgdXN1YWxseSBhcmUuCisKKyAgIFRoaXMgZmlsZSBwcm92aWRlcyBwcm90b3R5cGUgZGVjbGFyYXRpb25zIGZvciB0aGUgbWF0aCBmdW5jdGlvbnMuCisgICBNb3N0IGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQgdXNpbmcgdGhlIG1hY3JvOgorCisgICBfX01BVEhDQUxMIChOQU1FLCAoQVJHUy4uLikpOworCisgICBUaGlzIG1lYW5zIHRoZXJlIGlzIGEgZnVuY3Rpb24gYE5BTUUnIHJldHVybmluZyBgZG91YmxlJyBhbmQgYSBmdW5jdGlvbgorICAgYE5BTUVmJyByZXR1cm5pbmcgYGZsb2F0Jy4gIEVhY2ggcGxhY2UgYF9NZG91YmxlXycgYXBwZWFycyBpbiB0aGUKKyAgIHByb3RvdHlwZSwgdGhhdCBpcyBhY3R1YWxseSBgZG91YmxlJyBpbiB0aGUgcHJvdG90eXBlIGZvciBgTkFNRScgYW5kCisgICBgZmxvYXQnIGluIHRoZSBwcm90b3R5cGUgZm9yIGBOQU1FZicuICBSZWVudHJhbnQgdmFyaWFudCBmdW5jdGlvbnMgYXJlCisgICBjYWxsZWQgYE5BTUVfcicgYW5kIGBOQU1FZl9yJy4KKworICAgRnVuY3Rpb25zIHJldHVybmluZyBvdGhlciB0eXBlcyBsaWtlIGBpbnQnIGFyZSBkZWNsYXJlZCB1c2luZyB0aGUgbWFjcm86CisKKyAgIF9fTUFUSERFQ0wgKFRZUEUsIE5BTUUsIChBUkdTLi4uKSk7CisKKyAgIFRoaXMgaXMganVzdCBsaWtlIF9fTUFUSENBTEwgYnV0IGZvciBhIGZ1bmN0aW9uIHJldHVybmluZyBgVFlQRScKKyAgIGluc3RlYWQgb2YgYF9NZG91YmxlXycuICBJbiBhbGwgb2YgdGhlc2UgY2FzZXMsIHRoZXJlIGlzIHN0aWxsCisgICBib3RoIGEgYE5BTUUnIGFuZCBhIGBOQU1FZicgdGhhdCB0YWtlcyBgZmxvYXQnIGFyZ3VtZW50cy4gICovCisKKyNpZm5kZWYgX0NPTVBMRVhfSAorI2Vycm9yICJOZXZlciB1c2UgPGJpdHMvY21hdGhjYWxscy5oPiBkaXJlY3RseTsgaW5jbHVkZSA8Y29tcGxleC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjZGVmaW5lIF9NZG91YmxlX2NvbXBsZXhfIF9NZG91YmxlXyBfQ29tcGxleAorCisKKy8qIFRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zLiAgKi8KKworLyogQXJjIGNvc2luZSBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNhY29zLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisvKiBBcmMgc2luZSBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNhc2luLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisvKiBBcmMgdGFuZ2VudCBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNhdGFuLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKy8qIENvc2luZSBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNjb3MsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKy8qIFNpbmUgb2YgWi4gICovCitfX01BVEhDQUxMIChjc2luLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisvKiBUYW5nZW50IG9mIFouICAqLworX19NQVRIQ0FMTCAoY3RhbiwgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworCisKKy8qIEh5cGVyYm9saWMgZnVuY3Rpb25zLiAgKi8KKworLyogSHlwZXJib2xpYyBhcmMgY29zaW5lIG9mIFouICAqLworX19NQVRIQ0FMTCAoY2Fjb3NoLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisvKiBIeXBlcmJvbGljIGFyYyBzaW5lIG9mIFouICAqLworX19NQVRIQ0FMTCAoY2FzaW5oLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisvKiBIeXBlcmJvbGljIGFyYyB0YW5nZW50IG9mIFouICAqLworX19NQVRIQ0FMTCAoY2F0YW5oLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKy8qIEh5cGVyYm9saWMgY29zaW5lIG9mIFouICAqLworX19NQVRIQ0FMTCAoY2Nvc2gsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKy8qIEh5cGVyYm9saWMgc2luZSBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNzaW5oLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisvKiBIeXBlcmJvbGljIHRhbmdlbnQgb2YgWi4gICovCitfX01BVEhDQUxMIChjdGFuaCwgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworCisKKy8qIEV4cG9uZW50aWFsIGFuZCBsb2dhcml0aG1pYyBmdW5jdGlvbnMuICAqLworCisvKiBFeHBvbmVudGlhbCBmdW5jdGlvbiBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNleHAsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworLyogTmF0dXJhbCBsb2dhcml0aG0gb2YgWi4gICovCitfX01BVEhDQUxMIChjbG9nLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRoZSBiYXNlIDEwIGxvZ2FyaXRobSBpcyBub3QgZGVmaW5lZCBieSB0aGUgc3RhbmRhcmQgYnV0IHRvIGltcGxlbWVudAorICAgdGhlIHN0YW5kYXJkIEMrKyBsaWJyYXJ5IGl0IGlzIGhhbmR5LiAgKi8KK19fTUFUSENBTEwgKGNsb2cxMCwgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworI2VuZGlmCisKKy8qIFBvd2VyIGZ1bmN0aW9ucy4gICovCisKKy8qIFJldHVybiBYIHRvIHRoZSBZIHBvd2VyLiAgKi8KK19fTUFUSENBTEwgKGNwb3csIChfTWRvdWJsZV9jb21wbGV4XyBfX3gsIF9NZG91YmxlX2NvbXBsZXhfIF9feSkpOworCisvKiBSZXR1cm4gdGhlIHNxdWFyZSByb290IG9mIFouICAqLworX19NQVRIQ0FMTCAoY3NxcnQsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworCisvKiBBYnNvbHV0ZSB2YWx1ZSwgY29uanVnYXRlcywgYW5kIHByb2plY3Rpb24uICAqLworCisvKiBBYnNvbHV0ZSB2YWx1ZSBvZiBaLiAgKi8KK19fTUFUSERFQ0wgKF9NZG91YmxlXyxjYWJzLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKy8qIEFyZ3VtZW50IHZhbHVlIG9mIFouICAqLworX19NQVRIREVDTCAoX01kb3VibGVfLGNhcmcsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworLyogQ29tcGxleCBjb25qdWdhdGUgb2YgWi4gICovCitfX01BVEhDQUxMIChjb25qLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKy8qIFByb2plY3Rpb24gb2YgWiBvbnRvIHRoZSBSaWVtYW5uIHNwaGVyZS4gICovCitfX01BVEhDQUxMIChjcHJvaiwgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworCisKKy8qIERlY29tcG9zaW5nIGNvbXBsZXggdmFsdWVzLiAgKi8KKworLyogSW1hZ2luYXJ5IHBhcnQgb2YgWi4gICovCitfX01BVEhERUNMIChfTWRvdWJsZV8sY2ltYWcsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworLyogUmVhbCBwYXJ0IG9mIFouICAqLworX19NQVRIREVDTCAoX01kb3VibGVfLGNyZWFsLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKworLyogTm93IHNvbWUgb3B0aW1pemVkIHZlcnNpb25zLiAgR0NDIGhhcyBoYW5keSBub3RhdGlvbnMgZm9yIHRoZXNlCisgICBmdW5jdGlvbnMuICBSZWNlbnQgR0NDIGhhbmRsZXMgdGhlc2UgYXMgYnVpbHRpbiBmdW5jdGlvbnMgc28gZG9lcworICAgbm90IG5lZWQgaW5saW5lcy4gICovCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiAhX19HTlVDX1BSRVJFUSAoMiwgOTcpICYmIGRlZmluZWQgX19PUFRJTUlaRV9fIFwKKyAgICAmJiBkZWZpbmVkIF9fZXh0ZXJuX2lubGluZQorCisvKiBJbWFnaW5hcnkgcGFydCBvZiBaLiAgKi8KK19fZXh0ZXJuX2lubGluZSBfTWRvdWJsZV8KK19fTUFUSF9QUkVDTkFNRShjaW1hZykgKF9NZG91YmxlX2NvbXBsZXhfIF9feikgX19USFJPVworeworICByZXR1cm4gX19pbWFnX18gX196OworfQorCisvKiBSZWFsIHBhcnQgb2YgWi4gICovCitfX2V4dGVybl9pbmxpbmUgX01kb3VibGVfCitfX01BVEhfUFJFQ05BTUUoY3JlYWwpIChfTWRvdWJsZV9jb21wbGV4XyBfX3opIF9fVEhST1cKK3sKKyAgcmV0dXJuIF9fcmVhbF9fIF9fejsKK30KKworLyogQ29tcGxleCBjb25qdWdhdGUgb2YgWi4gICovCitfX2V4dGVybl9pbmxpbmUgX01kb3VibGVfY29tcGxleF8KK19fTUFUSF9QUkVDTkFNRShjb25qKSAoX01kb3VibGVfY29tcGxleF8gX196KSBfX1RIUk9XCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIH5fX3o7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2NvbmZuYW1lLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvY29uZm5hbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWZjYWZiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2NvbmZuYW1lLmgKQEAgLTAsMCArMSw2NzcgQEAKKy8qIGBzeXNjb25mJywgYHBhdGhjb25mJywgYW5kIGBjb25mc3RyJyBOQU1FIHZhbHVlcy4gIEdlbmVyaWMgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5MywxOTk1LTE5OTgsMjAwMCwyMDAxLDIwMDMsMjAwNCwyMDA3LDIwMDksMjAxMAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1VOSVNURF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvY29uZm5hbWUuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHVuaXN0ZC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBWYWx1ZXMgZm9yIHRoZSBOQU1FIGFyZ3VtZW50IHRvIGBwYXRoY29uZicgYW5kIGBmcGF0aGNvbmYnLiAgKi8KK2VudW0KKyAgeworICAgIF9QQ19MSU5LX01BWCwKKyNkZWZpbmUJX1BDX0xJTktfTUFYCQkJX1BDX0xJTktfTUFYCisgICAgX1BDX01BWF9DQU5PTiwKKyNkZWZpbmUJX1BDX01BWF9DQU5PTgkJCV9QQ19NQVhfQ0FOT04KKyAgICBfUENfTUFYX0lOUFVULAorI2RlZmluZQlfUENfTUFYX0lOUFVUCQkJX1BDX01BWF9JTlBVVAorICAgIF9QQ19OQU1FX01BWCwKKyNkZWZpbmUJX1BDX05BTUVfTUFYCQkJX1BDX05BTUVfTUFYCisgICAgX1BDX1BBVEhfTUFYLAorI2RlZmluZQlfUENfUEFUSF9NQVgJCQlfUENfUEFUSF9NQVgKKyAgICBfUENfUElQRV9CVUYsCisjZGVmaW5lCV9QQ19QSVBFX0JVRgkJCV9QQ19QSVBFX0JVRgorICAgIF9QQ19DSE9XTl9SRVNUUklDVEVELAorI2RlZmluZQlfUENfQ0hPV05fUkVTVFJJQ1RFRAkJX1BDX0NIT1dOX1JFU1RSSUNURUQKKyAgICBfUENfTk9fVFJVTkMsCisjZGVmaW5lCV9QQ19OT19UUlVOQwkJCV9QQ19OT19UUlVOQworICAgIF9QQ19WRElTQUJMRSwKKyNkZWZpbmUgX1BDX1ZESVNBQkxFCQkJX1BDX1ZESVNBQkxFCisgICAgX1BDX1NZTkNfSU8sCisjZGVmaW5lCV9QQ19TWU5DX0lPCQkJX1BDX1NZTkNfSU8KKyAgICBfUENfQVNZTkNfSU8sCisjZGVmaW5lCV9QQ19BU1lOQ19JTwkJCV9QQ19BU1lOQ19JTworICAgIF9QQ19QUklPX0lPLAorI2RlZmluZQlfUENfUFJJT19JTwkJCV9QQ19QUklPX0lPCisgICAgX1BDX1NPQ0tfTUFYQlVGLAorI2RlZmluZQlfUENfU09DS19NQVhCVUYJCQlfUENfU09DS19NQVhCVUYKKyAgICBfUENfRklMRVNJWkVCSVRTLAorI2RlZmluZSBfUENfRklMRVNJWkVCSVRTCQlfUENfRklMRVNJWkVCSVRTCisgICAgX1BDX1JFQ19JTkNSX1hGRVJfU0laRSwKKyNkZWZpbmUgX1BDX1JFQ19JTkNSX1hGRVJfU0laRQkJX1BDX1JFQ19JTkNSX1hGRVJfU0laRQorICAgIF9QQ19SRUNfTUFYX1hGRVJfU0laRSwKKyNkZWZpbmUgX1BDX1JFQ19NQVhfWEZFUl9TSVpFCQlfUENfUkVDX01BWF9YRkVSX1NJWkUKKyAgICBfUENfUkVDX01JTl9YRkVSX1NJWkUsCisjZGVmaW5lIF9QQ19SRUNfTUlOX1hGRVJfU0laRQkJX1BDX1JFQ19NSU5fWEZFUl9TSVpFCisgICAgX1BDX1JFQ19YRkVSX0FMSUdOLAorI2RlZmluZSBfUENfUkVDX1hGRVJfQUxJR04JCV9QQ19SRUNfWEZFUl9BTElHTgorICAgIF9QQ19BTExPQ19TSVpFX01JTiwKKyNkZWZpbmUgX1BDX0FMTE9DX1NJWkVfTUlOCQlfUENfQUxMT0NfU0laRV9NSU4KKyAgICBfUENfU1lNTElOS19NQVgsCisjZGVmaW5lIF9QQ19TWU1MSU5LX01BWAkJCV9QQ19TWU1MSU5LX01BWAorICAgIF9QQ18yX1NZTUxJTktTCisjZGVmaW5lIF9QQ18yX1NZTUxJTktTCQkJX1BDXzJfU1lNTElOS1MKKyAgfTsKKworLyogVmFsdWVzIGZvciB0aGUgYXJndW1lbnQgdG8gYHN5c2NvbmYnLiAgKi8KK2VudW0KKyAgeworICAgIF9TQ19BUkdfTUFYLAorI2RlZmluZQlfU0NfQVJHX01BWAkJCV9TQ19BUkdfTUFYCisgICAgX1NDX0NISUxEX01BWCwKKyNkZWZpbmUJX1NDX0NISUxEX01BWAkJCV9TQ19DSElMRF9NQVgKKyAgICBfU0NfQ0xLX1RDSywKKyNkZWZpbmUJX1NDX0NMS19UQ0sJCQlfU0NfQ0xLX1RDSworICAgIF9TQ19OR1JPVVBTX01BWCwKKyNkZWZpbmUJX1NDX05HUk9VUFNfTUFYCQkJX1NDX05HUk9VUFNfTUFYCisgICAgX1NDX09QRU5fTUFYLAorI2RlZmluZQlfU0NfT1BFTl9NQVgJCQlfU0NfT1BFTl9NQVgKKyAgICBfU0NfU1RSRUFNX01BWCwKKyNkZWZpbmUJX1NDX1NUUkVBTV9NQVgJCQlfU0NfU1RSRUFNX01BWAorICAgIF9TQ19UWk5BTUVfTUFYLAorI2RlZmluZQlfU0NfVFpOQU1FX01BWAkJCV9TQ19UWk5BTUVfTUFYCisgICAgX1NDX0pPQl9DT05UUk9MLAorI2RlZmluZQlfU0NfSk9CX0NPTlRST0wJCQlfU0NfSk9CX0NPTlRST0wKKyAgICBfU0NfU0FWRURfSURTLAorI2RlZmluZQlfU0NfU0FWRURfSURTCQkJX1NDX1NBVkVEX0lEUworICAgIF9TQ19SRUFMVElNRV9TSUdOQUxTLAorI2RlZmluZQlfU0NfUkVBTFRJTUVfU0lHTkFMUwkJX1NDX1JFQUxUSU1FX1NJR05BTFMKKyAgICBfU0NfUFJJT1JJVFlfU0NIRURVTElORywKKyNkZWZpbmUJX1NDX1BSSU9SSVRZX1NDSEVEVUxJTkcJCV9TQ19QUklPUklUWV9TQ0hFRFVMSU5HCisgICAgX1NDX1RJTUVSUywKKyNkZWZpbmUJX1NDX1RJTUVSUwkJCV9TQ19USU1FUlMKKyAgICBfU0NfQVNZTkNIUk9OT1VTX0lPLAorI2RlZmluZQlfU0NfQVNZTkNIUk9OT1VTX0lPCQlfU0NfQVNZTkNIUk9OT1VTX0lPCisgICAgX1NDX1BSSU9SSVRJWkVEX0lPLAorI2RlZmluZQlfU0NfUFJJT1JJVElaRURfSU8JCV9TQ19QUklPUklUSVpFRF9JTworICAgIF9TQ19TWU5DSFJPTklaRURfSU8sCisjZGVmaW5lCV9TQ19TWU5DSFJPTklaRURfSU8JCV9TQ19TWU5DSFJPTklaRURfSU8KKyAgICBfU0NfRlNZTkMsCisjZGVmaW5lCV9TQ19GU1lOQwkJCV9TQ19GU1lOQworICAgIF9TQ19NQVBQRURfRklMRVMsCisjZGVmaW5lCV9TQ19NQVBQRURfRklMRVMJCV9TQ19NQVBQRURfRklMRVMKKyAgICBfU0NfTUVNTE9DSywKKyNkZWZpbmUJX1NDX01FTUxPQ0sJCQlfU0NfTUVNTE9DSworICAgIF9TQ19NRU1MT0NLX1JBTkdFLAorI2RlZmluZQlfU0NfTUVNTE9DS19SQU5HRQkJX1NDX01FTUxPQ0tfUkFOR0UKKyAgICBfU0NfTUVNT1JZX1BST1RFQ1RJT04sCisjZGVmaW5lCV9TQ19NRU1PUllfUFJPVEVDVElPTgkJX1NDX01FTU9SWV9QUk9URUNUSU9OCisgICAgX1NDX01FU1NBR0VfUEFTU0lORywKKyNkZWZpbmUJX1NDX01FU1NBR0VfUEFTU0lORwkJX1NDX01FU1NBR0VfUEFTU0lORworICAgIF9TQ19TRU1BUEhPUkVTLAorI2RlZmluZQlfU0NfU0VNQVBIT1JFUwkJCV9TQ19TRU1BUEhPUkVTCisgICAgX1NDX1NIQVJFRF9NRU1PUllfT0JKRUNUUywKKyNkZWZpbmUJX1NDX1NIQVJFRF9NRU1PUllfT0JKRUNUUwlfU0NfU0hBUkVEX01FTU9SWV9PQkpFQ1RTCisgICAgX1NDX0FJT19MSVNUSU9fTUFYLAorI2RlZmluZQlfU0NfQUlPX0xJU1RJT19NQVgJCV9TQ19BSU9fTElTVElPX01BWAorICAgIF9TQ19BSU9fTUFYLAorI2RlZmluZQlfU0NfQUlPX01BWAkJCV9TQ19BSU9fTUFYCisgICAgX1NDX0FJT19QUklPX0RFTFRBX01BWCwKKyNkZWZpbmUJX1NDX0FJT19QUklPX0RFTFRBX01BWAkJX1NDX0FJT19QUklPX0RFTFRBX01BWAorICAgIF9TQ19ERUxBWVRJTUVSX01BWCwKKyNkZWZpbmUJX1NDX0RFTEFZVElNRVJfTUFYCQlfU0NfREVMQVlUSU1FUl9NQVgKKyAgICBfU0NfTVFfT1BFTl9NQVgsCisjZGVmaW5lCV9TQ19NUV9PUEVOX01BWAkJCV9TQ19NUV9PUEVOX01BWAorICAgIF9TQ19NUV9QUklPX01BWCwKKyNkZWZpbmUJX1NDX01RX1BSSU9fTUFYCQkJX1NDX01RX1BSSU9fTUFYCisgICAgX1NDX1ZFUlNJT04sCisjZGVmaW5lCV9TQ19WRVJTSU9OCQkJX1NDX1ZFUlNJT04KKyAgICBfU0NfUEFHRVNJWkUsCisjZGVmaW5lCV9TQ19QQUdFU0laRQkJCV9TQ19QQUdFU0laRQorI2RlZmluZQlfU0NfUEFHRV9TSVpFCQkJX1NDX1BBR0VTSVpFCisgICAgX1NDX1JUU0lHX01BWCwKKyNkZWZpbmUJX1NDX1JUU0lHX01BWAkJCV9TQ19SVFNJR19NQVgKKyAgICBfU0NfU0VNX05TRU1TX01BWCwKKyNkZWZpbmUJX1NDX1NFTV9OU0VNU19NQVgJCV9TQ19TRU1fTlNFTVNfTUFYCisgICAgX1NDX1NFTV9WQUxVRV9NQVgsCisjZGVmaW5lCV9TQ19TRU1fVkFMVUVfTUFYCQlfU0NfU0VNX1ZBTFVFX01BWAorICAgIF9TQ19TSUdRVUVVRV9NQVgsCisjZGVmaW5lCV9TQ19TSUdRVUVVRV9NQVgJCV9TQ19TSUdRVUVVRV9NQVgKKyAgICBfU0NfVElNRVJfTUFYLAorI2RlZmluZQlfU0NfVElNRVJfTUFYCQkJX1NDX1RJTUVSX01BWAorCisgICAgLyogVmFsdWVzIGZvciB0aGUgYXJndW1lbnQgdG8gYHN5c2NvbmYnCisgICAgICAgY29ycmVzcG9uZGluZyB0byBfUE9TSVgyXyogc3ltYm9scy4gICovCisgICAgX1NDX0JDX0JBU0VfTUFYLAorI2RlZmluZQlfU0NfQkNfQkFTRV9NQVgJCQlfU0NfQkNfQkFTRV9NQVgKKyAgICBfU0NfQkNfRElNX01BWCwKKyNkZWZpbmUJX1NDX0JDX0RJTV9NQVgJCQlfU0NfQkNfRElNX01BWAorICAgIF9TQ19CQ19TQ0FMRV9NQVgsCisjZGVmaW5lCV9TQ19CQ19TQ0FMRV9NQVgJCV9TQ19CQ19TQ0FMRV9NQVgKKyAgICBfU0NfQkNfU1RSSU5HX01BWCwKKyNkZWZpbmUJX1NDX0JDX1NUUklOR19NQVgJCV9TQ19CQ19TVFJJTkdfTUFYCisgICAgX1NDX0NPTExfV0VJR0hUU19NQVgsCisjZGVmaW5lCV9TQ19DT0xMX1dFSUdIVFNfTUFYCQlfU0NfQ09MTF9XRUlHSFRTX01BWAorICAgIF9TQ19FUVVJVl9DTEFTU19NQVgsCisjZGVmaW5lCV9TQ19FUVVJVl9DTEFTU19NQVgJCV9TQ19FUVVJVl9DTEFTU19NQVgKKyAgICBfU0NfRVhQUl9ORVNUX01BWCwKKyNkZWZpbmUJX1NDX0VYUFJfTkVTVF9NQVgJCV9TQ19FWFBSX05FU1RfTUFYCisgICAgX1NDX0xJTkVfTUFYLAorI2RlZmluZQlfU0NfTElORV9NQVgJCQlfU0NfTElORV9NQVgKKyAgICBfU0NfUkVfRFVQX01BWCwKKyNkZWZpbmUJX1NDX1JFX0RVUF9NQVgJCQlfU0NfUkVfRFVQX01BWAorICAgIF9TQ19DSEFSQ0xBU1NfTkFNRV9NQVgsCisjZGVmaW5lCV9TQ19DSEFSQ0xBU1NfTkFNRV9NQVgJCV9TQ19DSEFSQ0xBU1NfTkFNRV9NQVgKKworICAgIF9TQ18yX1ZFUlNJT04sCisjZGVmaW5lCV9TQ18yX1ZFUlNJT04JCQlfU0NfMl9WRVJTSU9OCisgICAgX1NDXzJfQ19CSU5ELAorI2RlZmluZQlfU0NfMl9DX0JJTkQJCQlfU0NfMl9DX0JJTkQKKyAgICBfU0NfMl9DX0RFViwKKyNkZWZpbmUJX1NDXzJfQ19ERVYJCQlfU0NfMl9DX0RFVgorICAgIF9TQ18yX0ZPUlRfREVWLAorI2RlZmluZQlfU0NfMl9GT1JUX0RFVgkJCV9TQ18yX0ZPUlRfREVWCisgICAgX1NDXzJfRk9SVF9SVU4sCisjZGVmaW5lCV9TQ18yX0ZPUlRfUlVOCQkJX1NDXzJfRk9SVF9SVU4KKyAgICBfU0NfMl9TV19ERVYsCisjZGVmaW5lCV9TQ18yX1NXX0RFVgkJCV9TQ18yX1NXX0RFVgorICAgIF9TQ18yX0xPQ0FMRURFRiwKKyNkZWZpbmUJX1NDXzJfTE9DQUxFREVGCQkJX1NDXzJfTE9DQUxFREVGCisKKyAgICBfU0NfUElJLAorI2RlZmluZQlfU0NfUElJCQkJCV9TQ19QSUkKKyAgICBfU0NfUElJX1hUSSwKKyNkZWZpbmUJX1NDX1BJSV9YVEkJCQlfU0NfUElJX1hUSQorICAgIF9TQ19QSUlfU09DS0VULAorI2RlZmluZQlfU0NfUElJX1NPQ0tFVAkJCV9TQ19QSUlfU09DS0VUCisgICAgX1NDX1BJSV9JTlRFUk5FVCwKKyNkZWZpbmUJX1NDX1BJSV9JTlRFUk5FVAkJX1NDX1BJSV9JTlRFUk5FVAorICAgIF9TQ19QSUlfT1NJLAorI2RlZmluZQlfU0NfUElJX09TSQkJCV9TQ19QSUlfT1NJCisgICAgX1NDX1BPTEwsCisjZGVmaW5lCV9TQ19QT0xMCQkJX1NDX1BPTEwKKyAgICBfU0NfU0VMRUNULAorI2RlZmluZQlfU0NfU0VMRUNUCQkJX1NDX1NFTEVDVAorICAgIF9TQ19VSU9fTUFYSU9WLAorI2RlZmluZQlfU0NfVUlPX01BWElPVgkJCV9TQ19VSU9fTUFYSU9WCisgICAgX1NDX0lPVl9NQVggPSBfU0NfVUlPX01BWElPViwKKyNkZWZpbmUgX1NDX0lPVl9NQVgJCQlfU0NfSU9WX01BWAorICAgIF9TQ19QSUlfSU5URVJORVRfU1RSRUFNLAorI2RlZmluZQlfU0NfUElJX0lOVEVSTkVUX1NUUkVBTQkJX1NDX1BJSV9JTlRFUk5FVF9TVFJFQU0KKyAgICBfU0NfUElJX0lOVEVSTkVUX0RHUkFNLAorI2RlZmluZQlfU0NfUElJX0lOVEVSTkVUX0RHUkFNCQlfU0NfUElJX0lOVEVSTkVUX0RHUkFNCisgICAgX1NDX1BJSV9PU0lfQ09UUywKKyNkZWZpbmUJX1NDX1BJSV9PU0lfQ09UUwkJX1NDX1BJSV9PU0lfQ09UUworICAgIF9TQ19QSUlfT1NJX0NMVFMsCisjZGVmaW5lCV9TQ19QSUlfT1NJX0NMVFMJCV9TQ19QSUlfT1NJX0NMVFMKKyAgICBfU0NfUElJX09TSV9NLAorI2RlZmluZQlfU0NfUElJX09TSV9NCQkJX1NDX1BJSV9PU0lfTQorICAgIF9TQ19UX0lPVl9NQVgsCisjZGVmaW5lCV9TQ19UX0lPVl9NQVgJCQlfU0NfVF9JT1ZfTUFYCisKKyAgICAvKiBWYWx1ZXMgYWNjb3JkaW5nIHRvIFBPU0lYIDEwMDMuMWMgKFBPU0lYIHRocmVhZHMpLiAgKi8KKyAgICBfU0NfVEhSRUFEUywKKyNkZWZpbmUJX1NDX1RIUkVBRFMJCQlfU0NfVEhSRUFEUworICAgIF9TQ19USFJFQURfU0FGRV9GVU5DVElPTlMsCisjZGVmaW5lIF9TQ19USFJFQURfU0FGRV9GVU5DVElPTlMJX1NDX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUworICAgIF9TQ19HRVRHUl9SX1NJWkVfTUFYLAorI2RlZmluZQlfU0NfR0VUR1JfUl9TSVpFX01BWAkJX1NDX0dFVEdSX1JfU0laRV9NQVgKKyAgICBfU0NfR0VUUFdfUl9TSVpFX01BWCwKKyNkZWZpbmUJX1NDX0dFVFBXX1JfU0laRV9NQVgJCV9TQ19HRVRQV19SX1NJWkVfTUFYCisgICAgX1NDX0xPR0lOX05BTUVfTUFYLAorI2RlZmluZQlfU0NfTE9HSU5fTkFNRV9NQVgJCV9TQ19MT0dJTl9OQU1FX01BWAorICAgIF9TQ19UVFlfTkFNRV9NQVgsCisjZGVmaW5lCV9TQ19UVFlfTkFNRV9NQVgJCV9TQ19UVFlfTkFNRV9NQVgKKyAgICBfU0NfVEhSRUFEX0RFU1RSVUNUT1JfSVRFUkFUSU9OUywKKyNkZWZpbmUJX1NDX1RIUkVBRF9ERVNUUlVDVE9SX0lURVJBVElPTlMgX1NDX1RIUkVBRF9ERVNUUlVDVE9SX0lURVJBVElPTlMKKyAgICBfU0NfVEhSRUFEX0tFWVNfTUFYLAorI2RlZmluZQlfU0NfVEhSRUFEX0tFWVNfTUFYCQlfU0NfVEhSRUFEX0tFWVNfTUFYCisgICAgX1NDX1RIUkVBRF9TVEFDS19NSU4sCisjZGVmaW5lCV9TQ19USFJFQURfU1RBQ0tfTUlOCQlfU0NfVEhSRUFEX1NUQUNLX01JTgorICAgIF9TQ19USFJFQURfVEhSRUFEU19NQVgsCisjZGVmaW5lCV9TQ19USFJFQURfVEhSRUFEU19NQVgJCV9TQ19USFJFQURfVEhSRUFEU19NQVgKKyAgICBfU0NfVEhSRUFEX0FUVFJfU1RBQ0tBRERSLAorI2RlZmluZQlfU0NfVEhSRUFEX0FUVFJfU1RBQ0tBRERSCV9TQ19USFJFQURfQVRUUl9TVEFDS0FERFIKKyAgICBfU0NfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFLAorI2RlZmluZQlfU0NfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFCV9TQ19USFJFQURfQVRUUl9TVEFDS1NJWkUKKyAgICBfU0NfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcsCisjZGVmaW5lCV9TQ19USFJFQURfUFJJT1JJVFlfU0NIRURVTElORwlfU0NfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcKKyAgICBfU0NfVEhSRUFEX1BSSU9fSU5IRVJJVCwKKyNkZWZpbmUJX1NDX1RIUkVBRF9QUklPX0lOSEVSSVQJCV9TQ19USFJFQURfUFJJT19JTkhFUklUCisgICAgX1NDX1RIUkVBRF9QUklPX1BST1RFQ1QsCisjZGVmaW5lCV9TQ19USFJFQURfUFJJT19QUk9URUNUCQlfU0NfVEhSRUFEX1BSSU9fUFJPVEVDVAorICAgIF9TQ19USFJFQURfUFJPQ0VTU19TSEFSRUQsCisjZGVmaW5lCV9TQ19USFJFQURfUFJPQ0VTU19TSEFSRUQJX1NDX1RIUkVBRF9QUk9DRVNTX1NIQVJFRAorCisgICAgX1NDX05QUk9DRVNTT1JTX0NPTkYsCisjZGVmaW5lIF9TQ19OUFJPQ0VTU09SU19DT05GCQlfU0NfTlBST0NFU1NPUlNfQ09ORgorICAgIF9TQ19OUFJPQ0VTU09SU19PTkxOLAorI2RlZmluZSBfU0NfTlBST0NFU1NPUlNfT05MTgkJX1NDX05QUk9DRVNTT1JTX09OTE4KKyAgICBfU0NfUEhZU19QQUdFUywKKyNkZWZpbmUgX1NDX1BIWVNfUEFHRVMJCQlfU0NfUEhZU19QQUdFUworICAgIF9TQ19BVlBIWVNfUEFHRVMsCisjZGVmaW5lIF9TQ19BVlBIWVNfUEFHRVMJCV9TQ19BVlBIWVNfUEFHRVMKKyAgICBfU0NfQVRFWElUX01BWCwKKyNkZWZpbmUgX1NDX0FURVhJVF9NQVgJCQlfU0NfQVRFWElUX01BWAorICAgIF9TQ19QQVNTX01BWCwKKyNkZWZpbmUgX1NDX1BBU1NfTUFYCQkJX1NDX1BBU1NfTUFYCisKKyAgICBfU0NfWE9QRU5fVkVSU0lPTiwKKyNkZWZpbmUgX1NDX1hPUEVOX1ZFUlNJT04JCV9TQ19YT1BFTl9WRVJTSU9OCisgICAgX1NDX1hPUEVOX1hDVV9WRVJTSU9OLAorI2RlZmluZSBfU0NfWE9QRU5fWENVX1ZFUlNJT04JCV9TQ19YT1BFTl9YQ1VfVkVSU0lPTgorICAgIF9TQ19YT1BFTl9VTklYLAorI2RlZmluZSBfU0NfWE9QRU5fVU5JWAkJCV9TQ19YT1BFTl9VTklYCisgICAgX1NDX1hPUEVOX0NSWVBULAorI2RlZmluZSBfU0NfWE9QRU5fQ1JZUFQJCQlfU0NfWE9QRU5fQ1JZUFQKKyAgICBfU0NfWE9QRU5fRU5IX0kxOE4sCisjZGVmaW5lIF9TQ19YT1BFTl9FTkhfSTE4TgkJX1NDX1hPUEVOX0VOSF9JMThOCisgICAgX1NDX1hPUEVOX1NITSwKKyNkZWZpbmUgX1NDX1hPUEVOX1NITQkJCV9TQ19YT1BFTl9TSE0KKworICAgIF9TQ18yX0NIQVJfVEVSTSwKKyNkZWZpbmUgX1NDXzJfQ0hBUl9URVJNCQkJX1NDXzJfQ0hBUl9URVJNCisgICAgX1NDXzJfQ19WRVJTSU9OLAorI2RlZmluZSBfU0NfMl9DX1ZFUlNJT04JCQlfU0NfMl9DX1ZFUlNJT04KKyAgICBfU0NfMl9VUEUsCisjZGVmaW5lIF9TQ18yX1VQRQkJCV9TQ18yX1VQRQorCisgICAgX1NDX1hPUEVOX1hQRzIsCisjZGVmaW5lIF9TQ19YT1BFTl9YUEcyCQkJX1NDX1hPUEVOX1hQRzIKKyAgICBfU0NfWE9QRU5fWFBHMywKKyNkZWZpbmUgX1NDX1hPUEVOX1hQRzMJCQlfU0NfWE9QRU5fWFBHMworICAgIF9TQ19YT1BFTl9YUEc0LAorI2RlZmluZSBfU0NfWE9QRU5fWFBHNAkJCV9TQ19YT1BFTl9YUEc0CisKKyAgICBfU0NfQ0hBUl9CSVQsCisjZGVmaW5lCV9TQ19DSEFSX0JJVAkJCV9TQ19DSEFSX0JJVAorICAgIF9TQ19DSEFSX01BWCwKKyNkZWZpbmUJX1NDX0NIQVJfTUFYCQkJX1NDX0NIQVJfTUFYCisgICAgX1NDX0NIQVJfTUlOLAorI2RlZmluZQlfU0NfQ0hBUl9NSU4JCQlfU0NfQ0hBUl9NSU4KKyAgICBfU0NfSU5UX01BWCwKKyNkZWZpbmUJX1NDX0lOVF9NQVgJCQlfU0NfSU5UX01BWAorICAgIF9TQ19JTlRfTUlOLAorI2RlZmluZQlfU0NfSU5UX01JTgkJCV9TQ19JTlRfTUlOCisgICAgX1NDX0xPTkdfQklULAorI2RlZmluZQlfU0NfTE9OR19CSVQJCQlfU0NfTE9OR19CSVQKKyAgICBfU0NfV09SRF9CSVQsCisjZGVmaW5lCV9TQ19XT1JEX0JJVAkJCV9TQ19XT1JEX0JJVAorICAgIF9TQ19NQl9MRU5fTUFYLAorI2RlZmluZQlfU0NfTUJfTEVOX01BWAkJCV9TQ19NQl9MRU5fTUFYCisgICAgX1NDX05aRVJPLAorI2RlZmluZQlfU0NfTlpFUk8JCQlfU0NfTlpFUk8KKyAgICBfU0NfU1NJWkVfTUFYLAorI2RlZmluZQlfU0NfU1NJWkVfTUFYCQkJX1NDX1NTSVpFX01BWAorICAgIF9TQ19TQ0hBUl9NQVgsCisjZGVmaW5lCV9TQ19TQ0hBUl9NQVgJCQlfU0NfU0NIQVJfTUFYCisgICAgX1NDX1NDSEFSX01JTiwKKyNkZWZpbmUJX1NDX1NDSEFSX01JTgkJCV9TQ19TQ0hBUl9NSU4KKyAgICBfU0NfU0hSVF9NQVgsCisjZGVmaW5lCV9TQ19TSFJUX01BWAkJCV9TQ19TSFJUX01BWAorICAgIF9TQ19TSFJUX01JTiwKKyNkZWZpbmUJX1NDX1NIUlRfTUlOCQkJX1NDX1NIUlRfTUlOCisgICAgX1NDX1VDSEFSX01BWCwKKyNkZWZpbmUJX1NDX1VDSEFSX01BWAkJCV9TQ19VQ0hBUl9NQVgKKyAgICBfU0NfVUlOVF9NQVgsCisjZGVmaW5lCV9TQ19VSU5UX01BWAkJCV9TQ19VSU5UX01BWAorICAgIF9TQ19VTE9OR19NQVgsCisjZGVmaW5lCV9TQ19VTE9OR19NQVgJCQlfU0NfVUxPTkdfTUFYCisgICAgX1NDX1VTSFJUX01BWCwKKyNkZWZpbmUJX1NDX1VTSFJUX01BWAkJCV9TQ19VU0hSVF9NQVgKKworICAgIF9TQ19OTF9BUkdNQVgsCisjZGVmaW5lCV9TQ19OTF9BUkdNQVgJCQlfU0NfTkxfQVJHTUFYCisgICAgX1NDX05MX0xBTkdNQVgsCisjZGVmaW5lCV9TQ19OTF9MQU5HTUFYCQkJX1NDX05MX0xBTkdNQVgKKyAgICBfU0NfTkxfTVNHTUFYLAorI2RlZmluZQlfU0NfTkxfTVNHTUFYCQkJX1NDX05MX01TR01BWAorICAgIF9TQ19OTF9OTUFYLAorI2RlZmluZQlfU0NfTkxfTk1BWAkJCV9TQ19OTF9OTUFYCisgICAgX1NDX05MX1NFVE1BWCwKKyNkZWZpbmUJX1NDX05MX1NFVE1BWAkJCV9TQ19OTF9TRVRNQVgKKyAgICBfU0NfTkxfVEVYVE1BWCwKKyNkZWZpbmUJX1NDX05MX1RFWFRNQVgJCQlfU0NfTkxfVEVYVE1BWAorCisgICAgX1NDX1hCUzVfSUxQMzJfT0ZGMzIsCisjZGVmaW5lIF9TQ19YQlM1X0lMUDMyX09GRjMyCQlfU0NfWEJTNV9JTFAzMl9PRkYzMgorICAgIF9TQ19YQlM1X0lMUDMyX09GRkJJRywKKyNkZWZpbmUgX1NDX1hCUzVfSUxQMzJfT0ZGQklHCQlfU0NfWEJTNV9JTFAzMl9PRkZCSUcKKyAgICBfU0NfWEJTNV9MUDY0X09GRjY0LAorI2RlZmluZSBfU0NfWEJTNV9MUDY0X09GRjY0CQlfU0NfWEJTNV9MUDY0X09GRjY0CisgICAgX1NDX1hCUzVfTFBCSUdfT0ZGQklHLAorI2RlZmluZSBfU0NfWEJTNV9MUEJJR19PRkZCSUcJCV9TQ19YQlM1X0xQQklHX09GRkJJRworCisgICAgX1NDX1hPUEVOX0xFR0FDWSwKKyNkZWZpbmUgX1NDX1hPUEVOX0xFR0FDWQkJX1NDX1hPUEVOX0xFR0FDWQorICAgIF9TQ19YT1BFTl9SRUFMVElNRSwKKyNkZWZpbmUgX1NDX1hPUEVOX1JFQUxUSU1FCQlfU0NfWE9QRU5fUkVBTFRJTUUKKyAgICBfU0NfWE9QRU5fUkVBTFRJTUVfVEhSRUFEUywKKyNkZWZpbmUgX1NDX1hPUEVOX1JFQUxUSU1FX1RIUkVBRFMJX1NDX1hPUEVOX1JFQUxUSU1FX1RIUkVBRFMKKworICAgIF9TQ19BRFZJU09SWV9JTkZPLAorI2RlZmluZSBfU0NfQURWSVNPUllfSU5GTwkJX1NDX0FEVklTT1JZX0lORk8KKyAgICBfU0NfQkFSUklFUlMsCisjZGVmaW5lIF9TQ19CQVJSSUVSUwkJCV9TQ19CQVJSSUVSUworICAgIF9TQ19CQVNFLAorI2RlZmluZSBfU0NfQkFTRQkJCV9TQ19CQVNFCisgICAgX1NDX0NfTEFOR19TVVBQT1JULAorI2RlZmluZSBfU0NfQ19MQU5HX1NVUFBPUlQJCV9TQ19DX0xBTkdfU1VQUE9SVAorICAgIF9TQ19DX0xBTkdfU1VQUE9SVF9SLAorI2RlZmluZSBfU0NfQ19MQU5HX1NVUFBPUlRfUgkJX1NDX0NfTEFOR19TVVBQT1JUX1IKKyAgICBfU0NfQ0xPQ0tfU0VMRUNUSU9OLAorI2RlZmluZSBfU0NfQ0xPQ0tfU0VMRUNUSU9OCQlfU0NfQ0xPQ0tfU0VMRUNUSU9OCisgICAgX1NDX0NQVVRJTUUsCisjZGVmaW5lIF9TQ19DUFVUSU1FCQkJX1NDX0NQVVRJTUUKKyAgICBfU0NfVEhSRUFEX0NQVVRJTUUsCisjZGVmaW5lIF9TQ19USFJFQURfQ1BVVElNRQkJX1NDX1RIUkVBRF9DUFVUSU1FCisgICAgX1NDX0RFVklDRV9JTywKKyNkZWZpbmUgX1NDX0RFVklDRV9JTwkJCV9TQ19ERVZJQ0VfSU8KKyAgICBfU0NfREVWSUNFX1NQRUNJRklDLAorI2RlZmluZSBfU0NfREVWSUNFX1NQRUNJRklDCQlfU0NfREVWSUNFX1NQRUNJRklDCisgICAgX1NDX0RFVklDRV9TUEVDSUZJQ19SLAorI2RlZmluZSBfU0NfREVWSUNFX1NQRUNJRklDX1IJCV9TQ19ERVZJQ0VfU1BFQ0lGSUNfUgorICAgIF9TQ19GRF9NR01ULAorI2RlZmluZSBfU0NfRkRfTUdNVAkJCV9TQ19GRF9NR01UCisgICAgX1NDX0ZJRk8sCisjZGVmaW5lIF9TQ19GSUZPCQkJX1NDX0ZJRk8KKyAgICBfU0NfUElQRSwKKyNkZWZpbmUgX1NDX1BJUEUJCQlfU0NfUElQRQorICAgIF9TQ19GSUxFX0FUVFJJQlVURVMsCisjZGVmaW5lIF9TQ19GSUxFX0FUVFJJQlVURVMJCV9TQ19GSUxFX0FUVFJJQlVURVMKKyAgICBfU0NfRklMRV9MT0NLSU5HLAorI2RlZmluZSBfU0NfRklMRV9MT0NLSU5HCQlfU0NfRklMRV9MT0NLSU5HCisgICAgX1NDX0ZJTEVfU1lTVEVNLAorI2RlZmluZSBfU0NfRklMRV9TWVNURU0JCQlfU0NfRklMRV9TWVNURU0KKyAgICBfU0NfTU9OT1RPTklDX0NMT0NLLAorI2RlZmluZSBfU0NfTU9OT1RPTklDX0NMT0NLCQlfU0NfTU9OT1RPTklDX0NMT0NLCisgICAgX1NDX01VTFRJX1BST0NFU1MsCisjZGVmaW5lIF9TQ19NVUxUSV9QUk9DRVNTCQlfU0NfTVVMVElfUFJPQ0VTUworICAgIF9TQ19TSU5HTEVfUFJPQ0VTUywKKyNkZWZpbmUgX1NDX1NJTkdMRV9QUk9DRVNTCQlfU0NfU0lOR0xFX1BST0NFU1MKKyAgICBfU0NfTkVUV09SS0lORywKKyNkZWZpbmUgX1NDX05FVFdPUktJTkcJCQlfU0NfTkVUV09SS0lORworICAgIF9TQ19SRUFERVJfV1JJVEVSX0xPQ0tTLAorI2RlZmluZSBfU0NfUkVBREVSX1dSSVRFUl9MT0NLUwkJX1NDX1JFQURFUl9XUklURVJfTE9DS1MKKyAgICBfU0NfU1BJTl9MT0NLUywKKyNkZWZpbmUgX1NDX1NQSU5fTE9DS1MJCQlfU0NfU1BJTl9MT0NLUworICAgIF9TQ19SRUdFWFAsCisjZGVmaW5lIF9TQ19SRUdFWFAJCQlfU0NfUkVHRVhQCisgICAgX1NDX1JFR0VYX1ZFUlNJT04sCisjZGVmaW5lIF9TQ19SRUdFWF9WRVJTSU9OCQlfU0NfUkVHRVhfVkVSU0lPTgorICAgIF9TQ19TSEVMTCwKKyNkZWZpbmUgX1NDX1NIRUxMCQkJX1NDX1NIRUxMCisgICAgX1NDX1NJR05BTFMsCisjZGVmaW5lIF9TQ19TSUdOQUxTCQkJX1NDX1NJR05BTFMKKyAgICBfU0NfU1BBV04sCisjZGVmaW5lIF9TQ19TUEFXTgkJCV9TQ19TUEFXTgorICAgIF9TQ19TUE9SQURJQ19TRVJWRVIsCisjZGVmaW5lIF9TQ19TUE9SQURJQ19TRVJWRVIJCV9TQ19TUE9SQURJQ19TRVJWRVIKKyAgICBfU0NfVEhSRUFEX1NQT1JBRElDX1NFUlZFUiwKKyNkZWZpbmUgX1NDX1RIUkVBRF9TUE9SQURJQ19TRVJWRVIJX1NDX1RIUkVBRF9TUE9SQURJQ19TRVJWRVIKKyAgICBfU0NfU1lTVEVNX0RBVEFCQVNFLAorI2RlZmluZSBfU0NfU1lTVEVNX0RBVEFCQVNFCQlfU0NfU1lTVEVNX0RBVEFCQVNFCisgICAgX1NDX1NZU1RFTV9EQVRBQkFTRV9SLAorI2RlZmluZSBfU0NfU1lTVEVNX0RBVEFCQVNFX1IJCV9TQ19TWVNURU1fREFUQUJBU0VfUgorICAgIF9TQ19USU1FT1VUUywKKyNkZWZpbmUgX1NDX1RJTUVPVVRTCQkJX1NDX1RJTUVPVVRTCisgICAgX1NDX1RZUEVEX01FTU9SWV9PQkpFQ1RTLAorI2RlZmluZSBfU0NfVFlQRURfTUVNT1JZX09CSkVDVFMJX1NDX1RZUEVEX01FTU9SWV9PQkpFQ1RTCisgICAgX1NDX1VTRVJfR1JPVVBTLAorI2RlZmluZSBfU0NfVVNFUl9HUk9VUFMJCQlfU0NfVVNFUl9HUk9VUFMKKyAgICBfU0NfVVNFUl9HUk9VUFNfUiwKKyNkZWZpbmUgX1NDX1VTRVJfR1JPVVBTX1IJCV9TQ19VU0VSX0dST1VQU19SCisgICAgX1NDXzJfUEJTLAorI2RlZmluZSBfU0NfMl9QQlMJCQlfU0NfMl9QQlMKKyAgICBfU0NfMl9QQlNfQUNDT1VOVElORywKKyNkZWZpbmUgX1NDXzJfUEJTX0FDQ09VTlRJTkcJCV9TQ18yX1BCU19BQ0NPVU5USU5HCisgICAgX1NDXzJfUEJTX0xPQ0FURSwKKyNkZWZpbmUgX1NDXzJfUEJTX0xPQ0FURQkJX1NDXzJfUEJTX0xPQ0FURQorICAgIF9TQ18yX1BCU19NRVNTQUdFLAorI2RlZmluZSBfU0NfMl9QQlNfTUVTU0FHRQkJX1NDXzJfUEJTX01FU1NBR0UKKyAgICBfU0NfMl9QQlNfVFJBQ0ssCisjZGVmaW5lIF9TQ18yX1BCU19UUkFDSwkJCV9TQ18yX1BCU19UUkFDSworICAgIF9TQ19TWU1MT09QX01BWCwKKyNkZWZpbmUgX1NDX1NZTUxPT1BfTUFYCQkJX1NDX1NZTUxPT1BfTUFYCisgICAgX1NDX1NUUkVBTVMsCisjZGVmaW5lIF9TQ19TVFJFQU1TCQkJX1NDX1NUUkVBTVMKKyAgICBfU0NfMl9QQlNfQ0hFQ0tQT0lOVCwKKyNkZWZpbmUgX1NDXzJfUEJTX0NIRUNLUE9JTlQJCV9TQ18yX1BCU19DSEVDS1BPSU5UCisKKyAgICBfU0NfVjZfSUxQMzJfT0ZGMzIsCisjZGVmaW5lIF9TQ19WNl9JTFAzMl9PRkYzMgkJX1NDX1Y2X0lMUDMyX09GRjMyCisgICAgX1NDX1Y2X0lMUDMyX09GRkJJRywKKyNkZWZpbmUgX1NDX1Y2X0lMUDMyX09GRkJJRwkJX1NDX1Y2X0lMUDMyX09GRkJJRworICAgIF9TQ19WNl9MUDY0X09GRjY0LAorI2RlZmluZSBfU0NfVjZfTFA2NF9PRkY2NAkJX1NDX1Y2X0xQNjRfT0ZGNjQKKyAgICBfU0NfVjZfTFBCSUdfT0ZGQklHLAorI2RlZmluZSBfU0NfVjZfTFBCSUdfT0ZGQklHCQlfU0NfVjZfTFBCSUdfT0ZGQklHCisKKyAgICBfU0NfSE9TVF9OQU1FX01BWCwKKyNkZWZpbmUgX1NDX0hPU1RfTkFNRV9NQVgJCV9TQ19IT1NUX05BTUVfTUFYCisgICAgX1NDX1RSQUNFLAorI2RlZmluZSBfU0NfVFJBQ0UJCQlfU0NfVFJBQ0UKKyAgICBfU0NfVFJBQ0VfRVZFTlRfRklMVEVSLAorI2RlZmluZSBfU0NfVFJBQ0VfRVZFTlRfRklMVEVSCQlfU0NfVFJBQ0VfRVZFTlRfRklMVEVSCisgICAgX1NDX1RSQUNFX0lOSEVSSVQsCisjZGVmaW5lIF9TQ19UUkFDRV9JTkhFUklUCQlfU0NfVFJBQ0VfSU5IRVJJVAorICAgIF9TQ19UUkFDRV9MT0csCisjZGVmaW5lIF9TQ19UUkFDRV9MT0cJCQlfU0NfVFJBQ0VfTE9HCisKKyAgICBfU0NfTEVWRUwxX0lDQUNIRV9TSVpFLAorI2RlZmluZSBfU0NfTEVWRUwxX0lDQUNIRV9TSVpFCQlfU0NfTEVWRUwxX0lDQUNIRV9TSVpFCisgICAgX1NDX0xFVkVMMV9JQ0FDSEVfQVNTT0MsCisjZGVmaW5lIF9TQ19MRVZFTDFfSUNBQ0hFX0FTU09DCQlfU0NfTEVWRUwxX0lDQUNIRV9BU1NPQworICAgIF9TQ19MRVZFTDFfSUNBQ0hFX0xJTkVTSVpFLAorI2RlZmluZSBfU0NfTEVWRUwxX0lDQUNIRV9MSU5FU0laRQlfU0NfTEVWRUwxX0lDQUNIRV9MSU5FU0laRQorICAgIF9TQ19MRVZFTDFfRENBQ0hFX1NJWkUsCisjZGVmaW5lIF9TQ19MRVZFTDFfRENBQ0hFX1NJWkUJCV9TQ19MRVZFTDFfRENBQ0hFX1NJWkUKKyAgICBfU0NfTEVWRUwxX0RDQUNIRV9BU1NPQywKKyNkZWZpbmUgX1NDX0xFVkVMMV9EQ0FDSEVfQVNTT0MJCV9TQ19MRVZFTDFfRENBQ0hFX0FTU09DCisgICAgX1NDX0xFVkVMMV9EQ0FDSEVfTElORVNJWkUsCisjZGVmaW5lIF9TQ19MRVZFTDFfRENBQ0hFX0xJTkVTSVpFCV9TQ19MRVZFTDFfRENBQ0hFX0xJTkVTSVpFCisgICAgX1NDX0xFVkVMMl9DQUNIRV9TSVpFLAorI2RlZmluZSBfU0NfTEVWRUwyX0NBQ0hFX1NJWkUJCV9TQ19MRVZFTDJfQ0FDSEVfU0laRQorICAgIF9TQ19MRVZFTDJfQ0FDSEVfQVNTT0MsCisjZGVmaW5lIF9TQ19MRVZFTDJfQ0FDSEVfQVNTT0MJCV9TQ19MRVZFTDJfQ0FDSEVfQVNTT0MKKyAgICBfU0NfTEVWRUwyX0NBQ0hFX0xJTkVTSVpFLAorI2RlZmluZSBfU0NfTEVWRUwyX0NBQ0hFX0xJTkVTSVpFCV9TQ19MRVZFTDJfQ0FDSEVfTElORVNJWkUKKyAgICBfU0NfTEVWRUwzX0NBQ0hFX1NJWkUsCisjZGVmaW5lIF9TQ19MRVZFTDNfQ0FDSEVfU0laRQkJX1NDX0xFVkVMM19DQUNIRV9TSVpFCisgICAgX1NDX0xFVkVMM19DQUNIRV9BU1NPQywKKyNkZWZpbmUgX1NDX0xFVkVMM19DQUNIRV9BU1NPQwkJX1NDX0xFVkVMM19DQUNIRV9BU1NPQworICAgIF9TQ19MRVZFTDNfQ0FDSEVfTElORVNJWkUsCisjZGVmaW5lIF9TQ19MRVZFTDNfQ0FDSEVfTElORVNJWkUJX1NDX0xFVkVMM19DQUNIRV9MSU5FU0laRQorICAgIF9TQ19MRVZFTDRfQ0FDSEVfU0laRSwKKyNkZWZpbmUgX1NDX0xFVkVMNF9DQUNIRV9TSVpFCQlfU0NfTEVWRUw0X0NBQ0hFX1NJWkUKKyAgICBfU0NfTEVWRUw0X0NBQ0hFX0FTU09DLAorI2RlZmluZSBfU0NfTEVWRUw0X0NBQ0hFX0FTU09DCQlfU0NfTEVWRUw0X0NBQ0hFX0FTU09DCisgICAgX1NDX0xFVkVMNF9DQUNIRV9MSU5FU0laRSwKKyNkZWZpbmUgX1NDX0xFVkVMNF9DQUNIRV9MSU5FU0laRQlfU0NfTEVWRUw0X0NBQ0hFX0xJTkVTSVpFCisgICAgLyogTGVhdmUgcm9vbSBoZXJlLCBtYXliZSB3ZSBuZWVkIGEgZmV3IG1vcmUgY2FjaGUgbGV2ZWxzIHNvbWUgZGF5LiAgKi8KKworICAgIF9TQ19JUFY2ID0gX1NDX0xFVkVMMV9JQ0FDSEVfU0laRSArIDUwLAorI2RlZmluZSBfU0NfSVBWNgkJCV9TQ19JUFY2CisgICAgX1NDX1JBV19TT0NLRVRTLAorI2RlZmluZSBfU0NfUkFXX1NPQ0tFVFMJCQlfU0NfUkFXX1NPQ0tFVFMKKworICAgIF9TQ19WN19JTFAzMl9PRkYzMiwKKyNkZWZpbmUgX1NDX1Y3X0lMUDMyX09GRjMyCQlfU0NfVjdfSUxQMzJfT0ZGMzIKKyAgICBfU0NfVjdfSUxQMzJfT0ZGQklHLAorI2RlZmluZSBfU0NfVjdfSUxQMzJfT0ZGQklHCQlfU0NfVjdfSUxQMzJfT0ZGQklHCisgICAgX1NDX1Y3X0xQNjRfT0ZGNjQsCisjZGVmaW5lIF9TQ19WN19MUDY0X09GRjY0CQlfU0NfVjdfTFA2NF9PRkY2NAorICAgIF9TQ19WN19MUEJJR19PRkZCSUcsCisjZGVmaW5lIF9TQ19WN19MUEJJR19PRkZCSUcJCV9TQ19WN19MUEJJR19PRkZCSUcKKworICAgIF9TQ19TU19SRVBMX01BWCwKKyNkZWZpbmUgX1NDX1NTX1JFUExfTUFYCQkJX1NDX1NTX1JFUExfTUFYCisKKyAgICBfU0NfVFJBQ0VfRVZFTlRfTkFNRV9NQVgsCisjZGVmaW5lIF9TQ19UUkFDRV9FVkVOVF9OQU1FX01BWAlfU0NfVFJBQ0VfRVZFTlRfTkFNRV9NQVgKKyAgICBfU0NfVFJBQ0VfTkFNRV9NQVgsCisjZGVmaW5lIF9TQ19UUkFDRV9OQU1FX01BWAkJX1NDX1RSQUNFX05BTUVfTUFYCisgICAgX1NDX1RSQUNFX1NZU19NQVgsCisjZGVmaW5lIF9TQ19UUkFDRV9TWVNfTUFYCQlfU0NfVFJBQ0VfU1lTX01BWAorICAgIF9TQ19UUkFDRV9VU0VSX0VWRU5UX01BWCwKKyNkZWZpbmUgX1NDX1RSQUNFX1VTRVJfRVZFTlRfTUFYCV9TQ19UUkFDRV9VU0VSX0VWRU5UX01BWAorCisgICAgX1NDX1hPUEVOX1NUUkVBTVMsCisjZGVmaW5lIF9TQ19YT1BFTl9TVFJFQU1TCQlfU0NfWE9QRU5fU1RSRUFNUworCisgICAgX1NDX1RIUkVBRF9ST0JVU1RfUFJJT19JTkhFUklULAorI2RlZmluZSBfU0NfVEhSRUFEX1JPQlVTVF9QUklPX0lOSEVSSVQJX1NDX1RIUkVBRF9ST0JVU1RfUFJJT19JTkhFUklUCisgICAgX1NDX1RIUkVBRF9ST0JVU1RfUFJJT19QUk9URUNUCisjZGVmaW5lIF9TQ19USFJFQURfUk9CVVNUX1BSSU9fUFJPVEVDVAlfU0NfVEhSRUFEX1JPQlVTVF9QUklPX1BST1RFQ1QKKyAgfTsKKworLyogVmFsdWVzIGZvciB0aGUgTkFNRSBhcmd1bWVudCB0byBgY29uZnN0cicuICAqLworZW51bQorICB7CisgICAgX0NTX1BBVEgsCQkJLyogVGhlIGRlZmF1bHQgc2VhcmNoIHBhdGguICAqLworI2RlZmluZSBfQ1NfUEFUSAkJX0NTX1BBVEgKKworICAgIF9DU19WNl9XSURUSF9SRVNUUklDVEVEX0VOVlMsCisjZGVmaW5lIF9DU19WNl9XSURUSF9SRVNUUklDVEVEX0VOVlMJX0NTX1Y2X1dJRFRIX1JFU1RSSUNURURfRU5WUworI2RlZmluZSBfQ1NfUE9TSVhfVjZfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTCV9DU19WNl9XSURUSF9SRVNUUklDVEVEX0VOVlMKKworICAgIF9DU19HTlVfTElCQ19WRVJTSU9OLAorI2RlZmluZSBfQ1NfR05VX0xJQkNfVkVSU0lPTglfQ1NfR05VX0xJQkNfVkVSU0lPTgorICAgIF9DU19HTlVfTElCUFRIUkVBRF9WRVJTSU9OLAorI2RlZmluZSBfQ1NfR05VX0xJQlBUSFJFQURfVkVSU0lPTglfQ1NfR05VX0xJQlBUSFJFQURfVkVSU0lPTgorCisgICAgX0NTX1Y1X1dJRFRIX1JFU1RSSUNURURfRU5WUywKKyNkZWZpbmUgX0NTX1Y1X1dJRFRIX1JFU1RSSUNURURfRU5WUwlfQ1NfVjVfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTCisjZGVmaW5lIF9DU19QT1NJWF9WNV9XSURUSF9SRVNUUklDVEVEX0VOVlMJX0NTX1Y1X1dJRFRIX1JFU1RSSUNURURfRU5WUworCisgICAgX0NTX1Y3X1dJRFRIX1JFU1RSSUNURURfRU5WUywKKyNkZWZpbmUgX0NTX1Y3X1dJRFRIX1JFU1RSSUNURURfRU5WUwlfQ1NfVjdfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTCisjZGVmaW5lIF9DU19QT1NJWF9WN19XSURUSF9SRVNUUklDVEVEX0VOVlMJX0NTX1Y3X1dJRFRIX1JFU1RSSUNURURfRU5WUworCisgICAgX0NTX0xGU19DRkxBR1MgPSAxMDAwLAorI2RlZmluZSBfQ1NfTEZTX0NGTEFHUwlfQ1NfTEZTX0NGTEFHUworICAgIF9DU19MRlNfTERGTEFHUywKKyNkZWZpbmUgX0NTX0xGU19MREZMQUdTCV9DU19MRlNfTERGTEFHUworICAgIF9DU19MRlNfTElCUywKKyNkZWZpbmUgX0NTX0xGU19MSUJTCQlfQ1NfTEZTX0xJQlMKKyAgICBfQ1NfTEZTX0xJTlRGTEFHUywKKyNkZWZpbmUgX0NTX0xGU19MSU5URkxBR1MJX0NTX0xGU19MSU5URkxBR1MKKyAgICBfQ1NfTEZTNjRfQ0ZMQUdTLAorI2RlZmluZSBfQ1NfTEZTNjRfQ0ZMQUdTCV9DU19MRlM2NF9DRkxBR1MKKyAgICBfQ1NfTEZTNjRfTERGTEFHUywKKyNkZWZpbmUgX0NTX0xGUzY0X0xERkxBR1MJX0NTX0xGUzY0X0xERkxBR1MKKyAgICBfQ1NfTEZTNjRfTElCUywKKyNkZWZpbmUgX0NTX0xGUzY0X0xJQlMJX0NTX0xGUzY0X0xJQlMKKyAgICBfQ1NfTEZTNjRfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfTEZTNjRfTElOVEZMQUdTCV9DU19MRlM2NF9MSU5URkxBR1MKKworICAgIF9DU19YQlM1X0lMUDMyX09GRjMyX0NGTEFHUyA9IDExMDAsCisjZGVmaW5lIF9DU19YQlM1X0lMUDMyX09GRjMyX0NGTEFHUyBfQ1NfWEJTNV9JTFAzMl9PRkYzMl9DRkxBR1MKKyAgICBfQ1NfWEJTNV9JTFAzMl9PRkYzMl9MREZMQUdTLAorI2RlZmluZSBfQ1NfWEJTNV9JTFAzMl9PRkYzMl9MREZMQUdTIF9DU19YQlM1X0lMUDMyX09GRjMyX0xERkxBR1MKKyAgICBfQ1NfWEJTNV9JTFAzMl9PRkYzMl9MSUJTLAorI2RlZmluZSBfQ1NfWEJTNV9JTFAzMl9PRkYzMl9MSUJTIF9DU19YQlM1X0lMUDMyX09GRjMyX0xJQlMKKyAgICBfQ1NfWEJTNV9JTFAzMl9PRkYzMl9MSU5URkxBR1MsCisjZGVmaW5lIF9DU19YQlM1X0lMUDMyX09GRjMyX0xJTlRGTEFHUyBfQ1NfWEJTNV9JTFAzMl9PRkYzMl9MSU5URkxBR1MKKyAgICBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfQ0ZMQUdTLAorI2RlZmluZSBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfQ0ZMQUdTIF9DU19YQlM1X0lMUDMyX09GRkJJR19DRkxBR1MKKyAgICBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfTERGTEFHUywKKyNkZWZpbmUgX0NTX1hCUzVfSUxQMzJfT0ZGQklHX0xERkxBR1MgX0NTX1hCUzVfSUxQMzJfT0ZGQklHX0xERkxBR1MKKyAgICBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfTElCUywKKyNkZWZpbmUgX0NTX1hCUzVfSUxQMzJfT0ZGQklHX0xJQlMgX0NTX1hCUzVfSUxQMzJfT0ZGQklHX0xJQlMKKyAgICBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfTElOVEZMQUdTIF9DU19YQlM1X0lMUDMyX09GRkJJR19MSU5URkxBR1MKKyAgICBfQ1NfWEJTNV9MUDY0X09GRjY0X0NGTEFHUywKKyNkZWZpbmUgX0NTX1hCUzVfTFA2NF9PRkY2NF9DRkxBR1MgX0NTX1hCUzVfTFA2NF9PRkY2NF9DRkxBR1MKKyAgICBfQ1NfWEJTNV9MUDY0X09GRjY0X0xERkxBR1MsCisjZGVmaW5lIF9DU19YQlM1X0xQNjRfT0ZGNjRfTERGTEFHUyBfQ1NfWEJTNV9MUDY0X09GRjY0X0xERkxBR1MKKyAgICBfQ1NfWEJTNV9MUDY0X09GRjY0X0xJQlMsCisjZGVmaW5lIF9DU19YQlM1X0xQNjRfT0ZGNjRfTElCUyBfQ1NfWEJTNV9MUDY0X09GRjY0X0xJQlMKKyAgICBfQ1NfWEJTNV9MUDY0X09GRjY0X0xJTlRGTEFHUywKKyNkZWZpbmUgX0NTX1hCUzVfTFA2NF9PRkY2NF9MSU5URkxBR1MgX0NTX1hCUzVfTFA2NF9PRkY2NF9MSU5URkxBR1MKKyAgICBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfQ0ZMQUdTLAorI2RlZmluZSBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfQ0ZMQUdTIF9DU19YQlM1X0xQQklHX09GRkJJR19DRkxBR1MKKyAgICBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfTERGTEFHUywKKyNkZWZpbmUgX0NTX1hCUzVfTFBCSUdfT0ZGQklHX0xERkxBR1MgX0NTX1hCUzVfTFBCSUdfT0ZGQklHX0xERkxBR1MKKyAgICBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfTElCUywKKyNkZWZpbmUgX0NTX1hCUzVfTFBCSUdfT0ZGQklHX0xJQlMgX0NTX1hCUzVfTFBCSUdfT0ZGQklHX0xJQlMKKyAgICBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfTElOVEZMQUdTIF9DU19YQlM1X0xQQklHX09GRkJJR19MSU5URkxBR1MKKworICAgIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9DRkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9DRkxBR1MgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRjMyX0NGTEFHUworICAgIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9MREZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGMzJfTERGTEFHUyBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGMzJfTERGTEFHUworICAgIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9MSUJTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGMzJfTElCUyBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGMzJfTElCUworICAgIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9MSU5URkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9MSU5URkxBR1MgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRjMyX0xJTlRGTEFHUworICAgIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfQ0ZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGQklHX0NGTEFHUyBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGQklHX0NGTEFHUworICAgIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfTERGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRkJJR19MREZMQUdTIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfTERGTEFHUworICAgIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfTElCUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRkJJR19MSUJTIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfTElCUworICAgIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGQklHX0xJTlRGTEFHUyBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGQklHX0xJTlRGTEFHUworICAgIF9DU19QT1NJWF9WNl9MUDY0X09GRjY0X0NGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfQ0ZMQUdTIF9DU19QT1NJWF9WNl9MUDY0X09GRjY0X0NGTEFHUworICAgIF9DU19QT1NJWF9WNl9MUDY0X09GRjY0X0xERkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9MUDY0X09GRjY0X0xERkxBR1MgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfTERGTEFHUworICAgIF9DU19QT1NJWF9WNl9MUDY0X09GRjY0X0xJQlMsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9MUDY0X09GRjY0X0xJQlMgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfTElCUworICAgIF9DU19QT1NJWF9WNl9MUDY0X09GRjY0X0xJTlRGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfTElOVEZMQUdTIF9DU19QT1NJWF9WNl9MUDY0X09GRjY0X0xJTlRGTEFHUworICAgIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfQ0ZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfTFBCSUdfT0ZGQklHX0NGTEFHUyBfQ1NfUE9TSVhfVjZfTFBCSUdfT0ZGQklHX0NGTEFHUworICAgIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfTERGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0xQQklHX09GRkJJR19MREZMQUdTIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfTERGTEFHUworICAgIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfTElCUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0xQQklHX09GRkJJR19MSUJTIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfTElCUworICAgIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfTFBCSUdfT0ZGQklHX0xJTlRGTEFHUyBfQ1NfUE9TSVhfVjZfTFBCSUdfT0ZGQklHX0xJTlRGTEFHUworCisgICAgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRjMyX0NGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRjMyX0NGTEFHUyBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGMzJfQ0ZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRjMyX0xERkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WN19JTFAzMl9PRkYzMl9MREZMQUdTIF9DU19QT1NJWF9WN19JTFAzMl9PRkYzMl9MREZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRjMyX0xJQlMsCisjZGVmaW5lIF9DU19QT1NJWF9WN19JTFAzMl9PRkYzMl9MSUJTIF9DU19QT1NJWF9WN19JTFAzMl9PRkYzMl9MSUJTCisgICAgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRjMyX0xJTlRGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRjMyX0xJTlRGTEFHUyBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGMzJfTElOVEZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRkJJR19DRkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WN19JTFAzMl9PRkZCSUdfQ0ZMQUdTIF9DU19QT1NJWF9WN19JTFAzMl9PRkZCSUdfQ0ZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRkJJR19MREZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGQklHX0xERkxBR1MgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRkJJR19MREZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRkJJR19MSUJTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGQklHX0xJQlMgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRkJJR19MSUJTCisgICAgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRkJJR19MSU5URkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WN19JTFAzMl9PRkZCSUdfTElOVEZMQUdTIF9DU19QT1NJWF9WN19JTFAzMl9PRkZCSUdfTElOVEZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0xQNjRfT0ZGNjRfQ0ZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9DRkxBR1MgX0NTX1BPU0lYX1Y3X0xQNjRfT0ZGNjRfQ0ZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0xQNjRfT0ZGNjRfTERGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X0xQNjRfT0ZGNjRfTERGTEFHUyBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9MREZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0xQNjRfT0ZGNjRfTElCUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X0xQNjRfT0ZGNjRfTElCUyBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9MSUJTCisgICAgX0NTX1BPU0lYX1Y3X0xQNjRfT0ZGNjRfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9MSU5URkxBR1MgX0NTX1BPU0lYX1Y3X0xQNjRfT0ZGNjRfTElOVEZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0xQQklHX09GRkJJR19DRkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WN19MUEJJR19PRkZCSUdfQ0ZMQUdTIF9DU19QT1NJWF9WN19MUEJJR19PRkZCSUdfQ0ZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0xQQklHX09GRkJJR19MREZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjdfTFBCSUdfT0ZGQklHX0xERkxBR1MgX0NTX1BPU0lYX1Y3X0xQQklHX09GRkJJR19MREZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0xQQklHX09GRkJJR19MSUJTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjdfTFBCSUdfT0ZGQklHX0xJQlMgX0NTX1BPU0lYX1Y3X0xQQklHX09GRkJJR19MSUJTCisgICAgX0NTX1BPU0lYX1Y3X0xQQklHX09GRkJJR19MSU5URkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WN19MUEJJR19PRkZCSUdfTElOVEZMQUdTIF9DU19QT1NJWF9WN19MUEJJR19PRkZCSUdfTElOVEZMQUdTCisKKyAgICBfQ1NfVjZfRU5WLAorI2RlZmluZSBfQ1NfVjZfRU5WCQkJX0NTX1Y2X0VOVgorICAgIF9DU19WN19FTlYKKyNkZWZpbmUgX0NTX1Y3X0VOVgkJCV9DU19WN19FTlYKKyAgfTsKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9kaXJlbnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9kaXJlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njc5NGIwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2RpcmVudC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfRElSRU5UX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9kaXJlbnQuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGRpcmVudC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCitzdHJ1Y3QgZGlyZW50CisgIHsKKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorICAgIF9faW5vX3QgZF9pbm87CisgICAgX19vZmZfdCBkX29mZjsKKyNlbHNlCisgICAgX19pbm82NF90IGRfaW5vOworICAgIF9fb2ZmNjRfdCBkX29mZjsKKyNlbmRpZgorICAgIHVuc2lnbmVkIHNob3J0IGludCBkX3JlY2xlbjsKKyAgICB1bnNpZ25lZCBjaGFyIGRfdHlwZTsKKyAgICBjaGFyIGRfbmFtZVsyNTZdOwkJLyogV2UgbXVzdCBub3QgaW5jbHVkZSBsaW1pdHMuaCEgKi8KKyAgfTsKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitzdHJ1Y3QgZGlyZW50NjQKKyAgeworICAgIF9faW5vNjRfdCBkX2lubzsKKyAgICBfX29mZjY0X3QgZF9vZmY7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IGRfcmVjbGVuOworICAgIHVuc2lnbmVkIGNoYXIgZF90eXBlOworICAgIGNoYXIgZF9uYW1lWzI1Nl07CQkvKiBXZSBtdXN0IG5vdCBpbmNsdWRlIGxpbWl0cy5oISAqLworICB9OworI2VuZGlmCisKKyNkZWZpbmUgZF9maWxlbm8JZF9pbm8JLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICAqLworCisjdW5kZWYgIF9ESVJFTlRfSEFWRV9EX05BTUxFTgorI2RlZmluZSBfRElSRU5UX0hBVkVfRF9SRUNMRU4KKyNkZWZpbmUgX0RJUkVOVF9IQVZFX0RfT0ZGCisjZGVmaW5lIF9ESVJFTlRfSEFWRV9EX1RZUEUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9kbGZjbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2RsZmNuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdmZDk2YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9kbGZjbi5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qIFN5c3RlbSBkZXBlbmRlbnQgZGVmaW5pdGlvbnMgZm9yIHJ1bi10aW1lIGR5bmFtaWMgbG9hZGluZy4KKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDAxLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9ETEZDTl9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvZGxmY24uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGRsZmNuLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIFRoZSBNT0RFIGFyZ3VtZW50IHRvIGBkbG9wZW4nIGNvbnRhaW5zIG9uZSBvZiB0aGUgZm9sbG93aW5nOiAqLworI2RlZmluZSBSVExEX0xBWlkJMHgwMDAwMQkvKiBMYXp5IGZ1bmN0aW9uIGNhbGwgYmluZGluZy4gICovCisjZGVmaW5lIFJUTERfTk9XCTB4MDAwMDIJLyogSW1tZWRpYXRlIGZ1bmN0aW9uIGNhbGwgYmluZGluZy4gICovCisjZGVmaW5lCVJUTERfQklORElOR19NQVNLICAgMHgzCS8qIE1hc2sgb2YgYmluZGluZyB0aW1lIHZhbHVlLiAgKi8KKyNkZWZpbmUgUlRMRF9OT0xPQUQJMHgwMDAwNAkvKiBEbyBub3QgbG9hZCB0aGUgb2JqZWN0LiAgKi8KKyNkZWZpbmUgUlRMRF9ERUVQQklORAkweDAwMDA4CS8qIFVzZSBkZWVwIGJpbmRpbmcuICAqLworCisvKiBJZiB0aGUgZm9sbG93aW5nIGJpdCBpcyBzZXQgaW4gdGhlIE1PREUgYXJndW1lbnQgdG8gYGRsb3BlbicsCisgICB0aGUgc3ltYm9scyBvZiB0aGUgbG9hZGVkIG9iamVjdCBhbmQgaXRzIGRlcGVuZGVuY2llcyBhcmUgbWFkZQorICAgdmlzaWJsZSBhcyBpZiB0aGUgb2JqZWN0IHdlcmUgbGlua2VkIGRpcmVjdGx5IGludG8gdGhlIHByb2dyYW0uICAqLworI2RlZmluZSBSVExEX0dMT0JBTAkweDAwMTAwCisKKy8qIFVuaXg5OCBkZW1hbmRzIHRoZSBmb2xsb3dpbmcgZmxhZyB3aGljaCBpcyB0aGUgaW52ZXJzZSB0byBSVExEX0dMT0JBTC4KKyAgIFRoZSBpbXBsZW1lbnRhdGlvbiBkb2VzIHRoaXMgYnkgZGVmYXVsdCBhbmQgc28gd2UgY2FuIGRlZmluZSB0aGUKKyAgIHZhbHVlIHRvIHplcm8uICAqLworI2RlZmluZSBSVExEX0xPQ0FMCTAKKworLyogRG8gbm90IGRlbGV0ZSBvYmplY3Qgd2hlbiBjbG9zZWQuICAqLworI2RlZmluZSBSVExEX05PREVMRVRFCTB4MDEwMDAKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVG8gc3VwcG9ydCBwcm9maWxpbmcgb2Ygc2hhcmVkIG9iamVjdHMgaXQgaXMgYSBnb29kIGlkZWEgdG8gY2FsbAorICAgdGhlIGZ1bmN0aW9uIGZvdW5kIHVzaW5nIGBkbHN5bScgdXNpbmcgdGhlIGZvbGxvd2luZyBtYWNybyBzaW5jZQorICAgdGhlc2UgY2FsbHMgZG8gbm90IHVzZSB0aGUgUExULiAgQnV0IHRoaXMgd291bGQgbWVhbiB0aGUgZHluYW1pYworICAgbG9hZGVyIGhhcyBubyBjaGFuY2UgdG8gZmluZCBvdXQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLiAgVGhlCisgICBtYWNybyBhcHBsaWVzIHRoZSBuZWNlc3NhcnkgbWFnaWMgc28gdGhhdCBwcm9maWxpbmcgaXMgcG9zc2libGUuCisgICBSZXdyaXRlCisJZm9vID0gKCpmY3RwKSAoYXJnMSwgYXJnMik7CisgICBpbnRvCisgICAgICAgIGZvbyA9IERMX0NBTExfRkNUIChmY3RwLCAoYXJnMSwgYXJnMikpOworKi8KKyMgZGVmaW5lIERMX0NBTExfRkNUKGZjdHAsIGFyZ3MpIFwKKyAgKF9kbF9tY291bnRfd3JhcHBlcl9jaGVjayAoKHZvaWQgKikgKGZjdHApKSwgKCooZmN0cCkpIGFyZ3MpCisKK19fQkVHSU5fREVDTFMKKworLyogVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgcHJvZmlsaW5nIGZ1bmN0aW9ucy4gICovCitleHRlcm4gdm9pZCBfZGxfbWNvdW50X3dyYXBwZXJfY2hlY2sgKHZvaWQgKl9fc2VsZnBjKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9lbGZjbGFzcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2VsZmNsYXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwMjI3ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9lbGZjbGFzcy5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qIFRoaXMgZmlsZSBzcGVjaWZpZXMgdGhlIG5hdGl2ZSB3b3JkIHNpemUgb2YgdGhlIG1hY2hpbmUsIHdoaWNoIGluZGljYXRlcworICAgdGhlIEVMRiBmaWxlIGNsYXNzIHVzZWQgZm9yIGV4ZWN1dGFibGVzIGFuZCBzaGFyZWQgb2JqZWN0cyBvbiB0aGlzCisgICBtYWNoaW5lLiAgKi8KKworI2lmbmRlZiBfTElOS19ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvZWxmY2xhc3MuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGxpbmsuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworI2RlZmluZSBfX0VMRl9OQVRJVkVfQ0xBU1MgX19XT1JEU0laRQorCisvKiBUaGUgZW50cmllcyBpbiB0aGUgLmhhc2ggdGFibGUgYWx3YXlzIGhhdmUgYSBzaXplIG9mIDMyIGJpdHMuICAqLwordHlwZWRlZiB1aW50MzJfdCBFbGZfU3ltbmR4OwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2VuZGlhbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YmQ5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZW5kaWFuLmgKQEAgLTAsMCArMSw3IEBACisvKiBpMzg2IGlzIGxpdHRsZS1lbmRpYW4uICAqLworCisjaWZuZGVmIF9FTkRJQU5fSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2VuZGlhbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8ZW5kaWFuLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNkZWZpbmUgX19CWVRFX09SREVSIF9fTElUVExFX0VORElBTgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2Vudmlyb25tZW50cy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2Vudmlyb25tZW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NWRkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZW52aXJvbm1lbnRzLmgKQEAgLTAsMCArMSw2OCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAxLCAyMDA0LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9VTklTVERfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkuICBVc2UgPHVuaXN0ZC5oPiBpbnN0ZWFkIgorI2VuZGlmCisKKy8qIFRoaXMgaGVhZGVyIHNob3VsZCBkZWZpbmUgdGhlIGZvbGxvd2luZyBzeW1ib2xzIHVuZGVyIHRoZSBkZXNjcmliZWQKKyAgIHNpdHVhdGlvbnMuICBBIHZhbHVlIGAxJyBtZWFucyB0aGF0IHRoZSBtb2RlbCBpcyBhbHdheXMgc3VwcG9ydGVkLAorICAgYC0xJyBtZWFucyBpdCBpcyBuZXZlciBzdXBwb3J0ZWQuICBVbmRlZmluZWQgbWVhbnMgaXQgY2Fubm90IGJlCisgICBzdGF0aWNhbGx5IGRlY2lkZWQuCisKKyAgIF9QT1NJWF9WN19JTFAzMl9PRkYzMiAgIDMyYml0IGludCwgbG9uZywgcG9pbnRlcnMsIGFuZCBvZmZfdCB0eXBlCisgICBfUE9TSVhfVjdfSUxQMzJfT0ZGQklHICAzMmJpdCBpbnQsIGxvbmcsIGFuZCBwb2ludGVycyBhbmQgbGFyZ2VyIG9mZl90IHR5cGUKKworICAgX1BPU0lYX1Y3X0xQNjRfT0ZGMzIJICAgNjRiaXQgbG9uZyBhbmQgcG9pbnRlcnMgYW5kIDMyYml0IG9mZl90IHR5cGUKKyAgIF9QT1NJWF9WN19MUEJJR19PRkZCSUcgIDY0Yml0IGxvbmcgYW5kIHBvaW50ZXJzIGFuZCBsYXJnZSBvZmZfdCB0eXBlCisKKyAgIFRoZSBtYWNyb3MgX1BPU0lYX1Y2X0lMUDMyX09GRjMyLCBfUE9TSVhfVjZfSUxQMzJfT0ZGQklHLAorICAgX1BPU0lYX1Y2X0xQNjRfT0ZGMzIsIF9QT1NJWF9WNl9MUEJJR19PRkZCSUcsIF9YQlM1X0lMUDMyX09GRjMyLAorICAgX1hCUzVfSUxQMzJfT0ZGQklHLCBfWEJTNV9MUDY0X09GRjMyLCBhbmQgX1hCUzVfTFBCSUdfT0ZGQklHIHdlcmUKKyAgIHVzZWQgaW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhlIFVuaXggc3RhbmRhcmQgYW5kIGFyZSBhdmFpbGFibGUKKyAgIG9ubHkgZm9yIGNvbXBhdGliaWxpdHkuCisqLworCisvKiBCeSBkZWZhdWx0IHdlIGhhdmUgMzItYml0IHdpZGUgYGludCcsIGBsb25nIGludCcsIHBvaW50ZXJzIGFuZCBgb2ZmX3QnCisgICBhbmQgYWxsIHBsYXRmb3JtcyBzdXBwb3J0IExGUy4gICovCisjZGVmaW5lIF9QT1NJWF9WN19JTFAzMl9PRkYzMgkxCisjZGVmaW5lIF9QT1NJWF9WN19JTFAzMl9PRkZCSUcJMQorI2RlZmluZSBfUE9TSVhfVjZfSUxQMzJfT0ZGMzIJMQorI2RlZmluZSBfUE9TSVhfVjZfSUxQMzJfT0ZGQklHCTEKKyNkZWZpbmUgX1hCUzVfSUxQMzJfT0ZGMzIJMQorI2RlZmluZSBfWEJTNV9JTFAzMl9PRkZCSUcJMQorCisvKiBXZSBvcHRpb25hbGx5IHByb3ZpZGUgYW4gZW52aXJvbm1lbnQgd2l0aCB0aGUgYWJvdmUgc2l6ZSBidXQgYW4gNjQtYml0CisgICBzaWRlIGBvZmZfdCcuICBUaGVyZWZvcmUgd2UgZG9uJ3QgZGVmaW5lIF9QT1NJWF9WN19JTFAzMl9PRkZCSUcuICAqLworCisvKiBFbnZpcm9ubWVudHMgd2l0aCA2NC1iaXQgd2lkZSBwb2ludGVycyBjYW4gYmUgcHJvdmlkZWQsCisgICBzbyB0aGVzZSBtYWNyb3MgYXJlbid0IGRlZmluZWQ6CisgICAjIHVuZGVmIF9QT1NJWF9WN19MUDY0X09GRjY0CisgICAjIHVuZGVmIF9QT1NJWF9WN19MUEJJR19PRkZCSUcKKyAgICMgdW5kZWYgX1BPU0lYX1Y2X0xQNjRfT0ZGNjQKKyAgICMgdW5kZWYgX1BPU0lYX1Y2X0xQQklHX09GRkJJRworICAgIyB1bmRlZiBfWEJTNV9MUDY0X09GRjY0CisgICAjIHVuZGVmIF9YQlM1X0xQQklHX09GRkJJRworICAgYW5kIHN5c2NvbmYgdGVzdHMgZm9yIGl0IGF0IHJ1bnRpbWUuICAqLworCisjZGVmaW5lIF9fSUxQMzJfT0ZGMzJfQ0ZMQUdTCSItbTMyIgorI2RlZmluZSBfX0lMUDMyX09GRkJJR19DRkxBR1MJIi1tMzIgLURfTEFSR0VGSUxFX1NPVVJDRSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IgorI2RlZmluZSBfX0lMUDMyX09GRjMyX0xERkxBR1MJIi1tMzIiCisjZGVmaW5lIF9fSUxQMzJfT0ZGQklHX0xERkxBR1MJIi1tMzIiCisjZGVmaW5lIF9fTFA2NF9PRkY2NF9DRkxBR1MJIi1tNjQiCisjZGVmaW5lIF9fTFA2NF9PRkY2NF9MREZMQUdTCSItbTY0IgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2Vycm5vLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZXJybm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjNkN2FmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2Vycm5vLmgKQEAgLTAsMCArMSw2MyBAQAorLyogRXJyb3IgY29uc3RhbnRzLiAgTGludXggc3BlY2lmaWMgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5LCAyMDA1LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZkZWYgX0VSUk5PX0gKKworIyB1bmRlZiBFRE9NCisjIHVuZGVmIEVJTFNFUQorIyB1bmRlZiBFUkFOR0UKKyMgaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworLyogTGludXggaGFzIG5vIEVOT1RTVVAgZXJyb3IgY29kZS4gICovCisjIGRlZmluZSBFTk9UU1VQIEVPUE5PVFNVUFAKKworLyogT2xkZXIgTGludXggdmVyc2lvbnMgYWxzbyBoYWQgbm8gRUNBTkNFTEVEIGVycm9yIGNvZGUuICAqLworIyBpZm5kZWYgRUNBTkNFTEVECisjICBkZWZpbmUgRUNBTkNFTEVECTEyNQorIyBlbmRpZgorCisvKiBTdXBwb3J0IGZvciBlcnJvciBjb2RlcyB0byBzdXBwb3J0IHJvYnVzdCBtdXRleGVzIHdhcyBhZGRlZCBsYXRlciwgdG9vLiAgKi8KKyMgaWZuZGVmIEVPV05FUkRFQUQKKyMgIGRlZmluZSBFT1dORVJERUFECQkxMzAKKyMgIGRlZmluZSBFTk9UUkVDT1ZFUkFCTEUJMTMxCisjIGVuZGlmCisKKyMgaWZuZGVmIEVSRktJTEwKKyMgIGRlZmluZSBFUkZLSUxMCQkxMzIKKyMgZW5kaWYKKworIyBpZm5kZWYgX19BU1NFTUJMRVJfXworLyogRnVuY3Rpb24gdG8gZ2V0IGFkZHJlc3Mgb2YgZ2xvYmFsIGBlcnJubycgdmFyaWFibGUuICAqLworZXh0ZXJuIGludCAqX19lcnJub19sb2NhdGlvbiAodm9pZCkgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKyMgIGlmICFkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgX0xJQkNfUkVFTlRSQU5UCisvKiBXaGVuIHVzaW5nIHRocmVhZHMsIGVycm5vIGlzIGEgcGVyLXRocmVhZCB2YWx1ZS4gICovCisjICAgZGVmaW5lIGVycm5vICgqX19lcnJub19sb2NhdGlvbiAoKSkKKyMgIGVuZGlmCisjIGVuZGlmIC8qICFfX0FTU0VNQkxFUl9fICovCisjZW5kaWYgLyogX0VSUk5PX0ggKi8KKworI2lmICFkZWZpbmVkIF9FUlJOT19IICYmIGRlZmluZWQgX19uZWVkX0VtYXRoCisvKiBUaGlzIGlzIHVnbHkgYnV0IHRoZSBrZXJuZWwgaGVhZGVyIGlzIG5vdCBjbGVhbiBlbm91Z2guICBXZSBtdXN0CisgICBkZWZpbmUgb25seSB0aGUgdmFsdWVzIEVET00sIEVJTFNFUSBhbmQgRVJBTkdFIGluIGNhc2UgX19uZWVkX0VtYXRoIGlzCisgICBkZWZpbmVkLiAgKi8KKyMgZGVmaW5lIEVET00JMzMJLyogTWF0aCBhcmd1bWVudCBvdXQgb2YgZG9tYWluIG9mIGZ1bmN0aW9uLiAgKi8KKyMgZGVmaW5lIEVJTFNFUQk4NAkvKiBJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UuICAqLworIyBkZWZpbmUgRVJBTkdFCTM0CS8qIE1hdGggcmVzdWx0IG5vdCByZXByZXNlbnRhYmxlLiAgKi8KKyNlbmRpZiAvKiAhX0VSUk5PX0ggJiYgX19uZWVkX0VtYXRoICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZXJyb3IuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9lcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OWEzZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZXJyb3IuaApAQCAtMCwwICsxLDc0IEBACisvKiBTcGVjaWFsaXphdGlvbnMgZm9yIGVycm9yIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfRVJST1JfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9lcnJvci5oPiBkaXJlY3RseTsgdXNlIDxlcnJvci5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisKK2V4dGVybiB2b2lkIF9fUkVESVJFQ1QgKF9fZXJyb3JfYWxpYXMsIChpbnQgX19zdGF0dXMsIGludCBfX2Vycm51bSwKKwkJCQkJX19jb25zdCBjaGFyICpfX2Zvcm1hdCwgLi4uKSwKKwkJCWVycm9yKQorICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgNCkpKTsKK2V4dGVybiB2b2lkIF9fUkVESVJFQ1QgKF9fZXJyb3Jfbm9yZXR1cm4sIChpbnQgX19zdGF0dXMsIGludCBfX2Vycm51bSwKKwkJCQkJICAgX19jb25zdCBjaGFyICpfX2Zvcm1hdCwgLi4uKSwKKwkJCWVycm9yKQorICBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fLCBfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCA0KSkpOworCisKKy8qIElmIHdlIGtub3cgdGhlIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgcmV0dXJuIG1ha2Ugc3VyZSB0aGUgY29tcGlsZXIKKyAgIHJlYWxpemVzIHRoYXQsIHRvby4gICovCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHZvaWQKK2Vycm9yIChpbnQgX19zdGF0dXMsIGludCBfX2Vycm51bSwgX19jb25zdCBjaGFyICpfX2Zvcm1hdCwgLi4uKQoreworICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9fc3RhdHVzKSAmJiBfX3N0YXR1cyAhPSAwKQorICAgIF9fZXJyb3Jfbm9yZXR1cm4gKF9fc3RhdHVzLCBfX2Vycm51bSwgX19mb3JtYXQsIF9fdmFfYXJnX3BhY2sgKCkpOworICBlbHNlCisgICAgX19lcnJvcl9hbGlhcyAoX19zdGF0dXMsIF9fZXJybnVtLCBfX2Zvcm1hdCwgX192YV9hcmdfcGFjayAoKSk7Cit9CisKKworZXh0ZXJuIHZvaWQgX19SRURJUkVDVCAoX19lcnJvcl9hdF9saW5lX2FsaWFzLCAoaW50IF9fc3RhdHVzLCBpbnQgX19lcnJudW0sCisJCQkJCQlfX2NvbnN0IGNoYXIgKl9fZm5hbWUsCisJCQkJCQl1bnNpZ25lZCBpbnQgX19saW5lLAorCQkJCQkJX19jb25zdCBjaGFyICpfX2Zvcm1hdCwgLi4uKSwKKwkJCWVycm9yX2F0X2xpbmUpCisgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCA1LCA2KSkpOworZXh0ZXJuIHZvaWQgX19SRURJUkVDVCAoX19lcnJvcl9hdF9saW5lX25vcmV0dXJuLCAoaW50IF9fc3RhdHVzLCBpbnQgX19lcnJudW0sCisJCQkJCQkgICBfX2NvbnN0IGNoYXIgKl9fZm5hbWUsCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgX19saW5lLAorCQkJCQkJICAgX19jb25zdCBjaGFyICpfX2Zvcm1hdCwKKwkJCQkJCSAgIC4uLiksCisJCQllcnJvcl9hdF9saW5lKQorICBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fLCBfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCA1LCA2KSkpOworCisKKy8qIElmIHdlIGtub3cgdGhlIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgcmV0dXJuIG1ha2Ugc3VyZSB0aGUgY29tcGlsZXIKKyAgIHJlYWxpemVzIHRoYXQsIHRvby4gICovCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHZvaWQKK2Vycm9yX2F0X2xpbmUgKGludCBfX3N0YXR1cywgaW50IF9fZXJybnVtLCBfX2NvbnN0IGNoYXIgKl9fZm5hbWUsCisJICAgICAgIHVuc2lnbmVkIGludCBfX2xpbmUsX19jb25zdCBjaGFyICpfX2Zvcm1hdCwgLi4uKQoreworICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9fc3RhdHVzKSAmJiBfX3N0YXR1cyAhPSAwKQorICAgIF9fZXJyb3JfYXRfbGluZV9ub3JldHVybiAoX19zdGF0dXMsIF9fZXJybnVtLCBfX2ZuYW1lLCBfX2xpbmUsIF9fZm9ybWF0LAorCQkJICAgICAgX192YV9hcmdfcGFjayAoKSk7CisgIGVsc2UKKyAgICBfX2Vycm9yX2F0X2xpbmVfYWxpYXMgKF9fc3RhdHVzLCBfX2Vycm51bSwgX19mbmFtZSwgX19saW5lLAorCQkJICAgX19mb3JtYXQsIF9fdmFfYXJnX3BhY2sgKCkpOworfQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2ZjbnRsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZmNudGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjZiZTA1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2ZjbnRsLmgKQEAgLTAsMCArMSwzMzcgQEAKKy8qIE9fKiwgRl8qLCBGRF8qIGJpdCB2YWx1ZXMgZm9yIExpbnV4LgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTgsIDIwMDAsIDIwMDQsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAsIDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9GQ05UTF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvZmNudGwuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGZjbnRsLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBfX1VTRV9HTlUKKyMgaW5jbHVkZSA8Yml0cy91aW8uaD4KKyNlbmRpZgorCisKKy8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKKyAgIGxvY2F0ZWQgb24gYSBmZXcgZmlsZSBzeXN0ZW1zLiAgKi8KKyNkZWZpbmUgT19BQ0NNT0RFCSAgIDAwMDMKKyNkZWZpbmUgT19SRE9OTFkJICAgICAwMAorI2RlZmluZSBPX1dST05MWQkgICAgIDAxCisjZGVmaW5lIE9fUkRXUgkJICAgICAwMgorI2RlZmluZSBPX0NSRUFUCQkgICAwMTAwCS8qIG5vdCBmY250bCAqLworI2RlZmluZSBPX0VYQ0wJCSAgIDAyMDAJLyogbm90IGZjbnRsICovCisjZGVmaW5lIE9fTk9DVFRZCSAgIDA0MDAJLyogbm90IGZjbnRsICovCisjZGVmaW5lIE9fVFJVTkMJCSAgMDEwMDAJLyogbm90IGZjbnRsICovCisjZGVmaW5lIE9fQVBQRU5ECSAgMDIwMDAKKyNkZWZpbmUgT19OT05CTE9DSwkgIDA0MDAwCisjZGVmaW5lIE9fTkRFTEFZCU9fTk9OQkxPQ0sKKyNkZWZpbmUgT19TWU5DCSAgICAgICAwNDAxMDAwMAorI2RlZmluZSBPX0ZTWU5DCQkgT19TWU5DCisjZGVmaW5lIE9fQVNZTkMJCSAwMjAwMDAKKworI2lmZGVmIF9fVVNFX1hPUEVOMks4CisjIGRlZmluZSBPX0RJUkVDVE9SWQkwMjAwMDAwCS8qIE11c3QgYmUgYSBkaXJlY3RvcnkuCSAqLworIyBkZWZpbmUgT19OT0ZPTExPVwkwNDAwMDAwCS8qIERvIG5vdCBmb2xsb3cgbGlua3MuCSAqLworIyBkZWZpbmUgT19DTE9FWEVDICAgICAwMjAwMDAwMCAvKiBTZXQgY2xvc2Vfb25fZXhlYy4gICovCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIE9fRElSRUNUCSAwNDAwMDAJLyogRGlyZWN0IGRpc2sgYWNjZXNzLgkqLworIyBkZWZpbmUgT19OT0FUSU1FICAgICAwMTAwMDAwMCAvKiBEbyBub3Qgc2V0IGF0aW1lLiAgKi8KKyMgZGVmaW5lIE9fUEFUSAkgICAgICAwMTAwMDAwMDAgLyogUmVzb2x2ZSBwYXRobmFtZSBidXQgZG8gbm90IG9wZW4gZmlsZS4gICovCisjZW5kaWYKKworLyogRm9yIG5vdyBMaW51eCBoYXMgc3luY2hyb25pc2l0eSBvcHRpb25zIGZvciBkYXRhIGFuZCByZWFkIG9wZXJhdGlvbnMuCisgICBXZSBkZWZpbmUgdGhlIHN5bWJvbHMgaGVyZSBidXQgbGV0IHRoZW0gZG8gdGhlIHNhbWUgYXMgT19TWU5DIHNpbmNlCisgICB0aGlzIGlzIGEgc3VwZXJzZXQuCSovCisjaWYgZGVmaW5lZCBfX1VTRV9QT1NJWDE5OTMwOSB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OAorIyBkZWZpbmUgT19EU1lOQwkwMTAwMDAJLyogU3luY2hyb25pemUgZGF0YS4gICovCisjIGRlZmluZSBPX1JTWU5DCU9fU1lOQwkvKiBTeW5jaHJvbml6ZSByZWFkIG9wZXJhdGlvbnMuCSAqLworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorIyBkZWZpbmUgT19MQVJHRUZJTEUJMDEwMDAwMAorI2VuZGlmCisKKy8qIFZhbHVlcyBmb3IgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZmNudGwnLiAgKi8KKyNkZWZpbmUgRl9EVVBGRAkJMAkvKiBEdXBsaWNhdGUgZmlsZSBkZXNjcmlwdG9yLiAgKi8KKyNkZWZpbmUgRl9HRVRGRAkJMQkvKiBHZXQgZmlsZSBkZXNjcmlwdG9yIGZsYWdzLiAgKi8KKyNkZWZpbmUgRl9TRVRGRAkJMgkvKiBTZXQgZmlsZSBkZXNjcmlwdG9yIGZsYWdzLiAgKi8KKyNkZWZpbmUgRl9HRVRGTAkJMwkvKiBHZXQgZmlsZSBzdGF0dXMgZmxhZ3MuICAqLworI2RlZmluZSBGX1NFVEZMCQk0CS8qIFNldCBmaWxlIHN0YXR1cyBmbGFncy4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyMgZGVmaW5lIEZfR0VUTEsJNQkvKiBHZXQgcmVjb3JkIGxvY2tpbmcgaW5mby4gICovCisjIGRlZmluZSBGX1NFVExLCTYJLyogU2V0IHJlY29yZCBsb2NraW5nIGluZm8gKG5vbi1ibG9ja2luZykuICAqLworIyBkZWZpbmUgRl9TRVRMS1cJNwkvKiBTZXQgcmVjb3JkIGxvY2tpbmcgaW5mbyAoYmxvY2tpbmcpLgkqLworI2Vsc2UKKyMgZGVmaW5lIEZfR0VUTEsJRl9HRVRMSzY0ICAvKiBHZXQgcmVjb3JkIGxvY2tpbmcgaW5mby4JKi8KKyMgZGVmaW5lIEZfU0VUTEsJRl9TRVRMSzY0ICAvKiBTZXQgcmVjb3JkIGxvY2tpbmcgaW5mbyAobm9uLWJsb2NraW5nKS4qLworIyBkZWZpbmUgRl9TRVRMS1cJRl9TRVRMS1c2NCAvKiBTZXQgcmVjb3JkIGxvY2tpbmcgaW5mbyAoYmxvY2tpbmcpLiAgKi8KKyNlbmRpZgorI2RlZmluZSBGX0dFVExLNjQJMTIJLyogR2V0IHJlY29yZCBsb2NraW5nIGluZm8uICAqLworI2RlZmluZSBGX1NFVExLNjQJMTMJLyogU2V0IHJlY29yZCBsb2NraW5nIGluZm8gKG5vbi1ibG9ja2luZykuICAqLworI2RlZmluZSBGX1NFVExLVzY0CTE0CS8qIFNldCByZWNvcmQgbG9ja2luZyBpbmZvIChibG9ja2luZykuCSovCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisjIGRlZmluZSBGX1NFVE9XTgk4CS8qIEdldCBvd25lciAocHJvY2VzcyByZWNlaXZpbmcgU0lHSU8pLiAgKi8KKyMgZGVmaW5lIEZfR0VUT1dOCTkJLyogU2V0IG93bmVyIChwcm9jZXNzIHJlY2VpdmluZyBTSUdJTykuICAqLworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIEZfU0VUU0lHCTEwCS8qIFNldCBudW1iZXIgb2Ygc2lnbmFsIHRvIGJlIHNlbnQuICAqLworIyBkZWZpbmUgRl9HRVRTSUcJMTEJLyogR2V0IG51bWJlciBvZiBzaWduYWwgdG8gYmUgc2VudC4gICovCisjIGRlZmluZSBGX1NFVE9XTl9FWAkxNQkvKiBHZXQgb3duZXIgKHRocmVhZCByZWNlaXZpbmcgU0lHSU8pLiAgKi8KKyMgZGVmaW5lIEZfR0VUT1dOX0VYCTE2CS8qIFNldCBvd25lciAodGhyZWFkIHJlY2VpdmluZyBTSUdJTykuICAqLworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIEZfU0VUTEVBU0UJMTAyNAkvKiBTZXQgYSBsZWFzZS4JICovCisjIGRlZmluZSBGX0dFVExFQVNFCTEwMjUJLyogRW5xdWlyZSB3aGF0IGxlYXNlIGlzIGFjdGl2ZS4gICovCisjIGRlZmluZSBGX05PVElGWQkxMDI2CS8qIFJlcXVlc3Qgbm90ZmljYXRpb25zIG9uIGEgZGlyZWN0b3J5LgkgKi8KKyMgZGVmaW5lIEZfU0VUUElQRV9TWgkxMDMxCS8qIFNldCBwaXBlIHBhZ2Ugc2l6ZSBhcnJheS4gICovCisjIGRlZmluZSBGX0dFVFBJUEVfU1oJMTAzMgkvKiBTZXQgcGlwZSBwYWdlIHNpemUgYXJyYXkuICAqLworI2VuZGlmCisjaWZkZWYgX19VU0VfWE9QRU4ySzgKKyMgZGVmaW5lIEZfRFVQRkRfQ0xPRVhFQyAxMDMwCS8qIER1cGxpY2F0ZSBmaWxlIGRlc2NyaXB0b3Igd2l0aAorCQkJCSAgIGNsb3NlLW9uLWV4aXQgc2V0LiAgKi8KKyNlbmRpZgorCisvKiBGb3IgRl9bR0VUfFNFVF1GRC4gICovCisjZGVmaW5lIEZEX0NMT0VYRUMJMQkvKiBhY3R1YWxseSBhbnl0aGluZyB3aXRoIGxvdyBiaXQgc2V0IGdvZXMgKi8KKworLyogRm9yIHBvc2l4IGZjbnRsKCkgYW5kIGBsX3R5cGUnIGZpZWxkIG9mIGEgYHN0cnVjdCBmbG9jaycgZm9yIGxvY2tmKCkuICAqLworI2RlZmluZSBGX1JETENLCQkwCS8qIFJlYWQgbG9jay4gICovCisjZGVmaW5lIEZfV1JMQ0sJCTEJLyogV3JpdGUgbG9jay4JKi8KKyNkZWZpbmUgRl9VTkxDSwkJMgkvKiBSZW1vdmUgbG9jay4JICovCisKKy8qIEZvciBvbGQgaW1wbGVtZW50YXRpb24gb2YgYnNkIGZsb2NrKCkuICAqLworI2RlZmluZSBGX0VYTENLCQk0CS8qIG9yIDMgKi8KKyNkZWZpbmUgRl9TSExDSwkJOAkvKiBvciA0ICovCisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIE9wZXJhdGlvbnMgZm9yIGJzZCBmbG9jaygpLCBhbHNvIHVzZWQgYnkgdGhlIGtlcm5lbCBpbXBsZW1lbnRhdGlvbi4JKi8KKyMgZGVmaW5lIExPQ0tfU0gJMQkvKiBzaGFyZWQgbG9jayAqLworIyBkZWZpbmUgTE9DS19FWAkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCisjIGRlZmluZSBMT0NLX05CCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAorCQkJCSAgIGJsb2NraW5nICovCisjIGRlZmluZSBMT0NLX1VOCTgJLyogcmVtb3ZlIGxvY2sgKi8KKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBMT0NLX01BTkQJMzIJLyogVGhpcyBpcyBhIG1hbmRhdG9yeSBmbG9jazoJKi8KKyMgZGVmaW5lIExPQ0tfUkVBRAk2NAkvKiAuLi4gd2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCBvcGVyYXRpb25zLgkgKi8KKyMgZGVmaW5lIExPQ0tfV1JJVEUJMTI4CS8qIC4uLiB3aGljaCBhbGxvd3MgY29uY3VycmVudCB3cml0ZSBvcGVyYXRpb25zLiAgKi8KKyMgZGVmaW5lIExPQ0tfUlcJMTkyCS8qIC4uLiBXaGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkICYgd3JpdGUgb3BlcmF0aW9ucy4JICovCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVHlwZXMgb2YgZGlyZWN0b3J5IG5vdGlmaWNhdGlvbnMgdGhhdCBtYXkgYmUgcmVxdWVzdGVkIHdpdGggRl9OT1RJRlkuICAqLworIyBkZWZpbmUgRE5fQUNDRVNTCTB4MDAwMDAwMDEJLyogRmlsZSBhY2Nlc3NlZC4gICovCisjIGRlZmluZSBETl9NT0RJRlkJMHgwMDAwMDAwMgkvKiBGaWxlIG1vZGlmaWVkLiAgKi8KKyMgZGVmaW5lIEROX0NSRUFURQkweDAwMDAwMDA0CS8qIEZpbGUgY3JlYXRlZC4gICovCisjIGRlZmluZSBETl9ERUxFVEUJMHgwMDAwMDAwOAkvKiBGaWxlIHJlbW92ZWQuICAqLworIyBkZWZpbmUgRE5fUkVOQU1FCTB4MDAwMDAwMTAJLyogRmlsZSByZW5hbWVkLiAgKi8KKyMgZGVmaW5lIEROX0FUVFJJQgkweDAwMDAwMDIwCS8qIEZpbGUgY2hhbmdlZCBhdHRpYnV0ZXMuICAqLworIyBkZWZpbmUgRE5fTVVMVElTSE9UCTB4ODAwMDAwMDAJLyogRG9uJ3QgcmVtb3ZlIG5vdGlmaWVyLiAgKi8KKyNlbmRpZgorCitzdHJ1Y3QgZmxvY2sKKyAgeworICAgIHNob3J0IGludCBsX3R5cGU7CS8qIFR5cGUgb2YgbG9jazogRl9SRExDSywgRl9XUkxDSywgb3IgRl9VTkxDSy4JKi8KKyAgICBzaG9ydCBpbnQgbF93aGVuY2U7CS8qIFdoZXJlIGBsX3N0YXJ0JyBpcyByZWxhdGl2ZSB0byAobGlrZSBgbHNlZWsnKS4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgICBfX29mZl90IGxfc3RhcnQ7CS8qIE9mZnNldCB3aGVyZSB0aGUgbG9jayBiZWdpbnMuICAqLworICAgIF9fb2ZmX3QgbF9sZW47CS8qIFNpemUgb2YgdGhlIGxvY2tlZCBhcmVhOyB6ZXJvIG1lYW5zIHVudGlsIEVPRi4gICovCisjZWxzZQorICAgIF9fb2ZmNjRfdCBsX3N0YXJ0OwkvKiBPZmZzZXQgd2hlcmUgdGhlIGxvY2sgYmVnaW5zLiAgKi8KKyAgICBfX29mZjY0X3QgbF9sZW47CS8qIFNpemUgb2YgdGhlIGxvY2tlZCBhcmVhOyB6ZXJvIG1lYW5zIHVudGlsIEVPRi4gICovCisjZW5kaWYKKyAgICBfX3BpZF90IGxfcGlkOwkvKiBQcm9jZXNzIGhvbGRpbmcgdGhlIGxvY2suICAqLworICB9OworCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK3N0cnVjdCBmbG9jazY0CisgIHsKKyAgICBzaG9ydCBpbnQgbF90eXBlOwkvKiBUeXBlIG9mIGxvY2s6IEZfUkRMQ0ssIEZfV1JMQ0ssIG9yIEZfVU5MQ0suCSovCisgICAgc2hvcnQgaW50IGxfd2hlbmNlOwkvKiBXaGVyZSBgbF9zdGFydCcgaXMgcmVsYXRpdmUgdG8gKGxpa2UgYGxzZWVrJykuICAqLworICAgIF9fb2ZmNjRfdCBsX3N0YXJ0OwkvKiBPZmZzZXQgd2hlcmUgdGhlIGxvY2sgYmVnaW5zLiAgKi8KKyAgICBfX29mZjY0X3QgbF9sZW47CS8qIFNpemUgb2YgdGhlIGxvY2tlZCBhcmVhOyB6ZXJvIG1lYW5zIHVudGlsIEVPRi4gICovCisgICAgX19waWRfdCBsX3BpZDsJLyogUHJvY2VzcyBob2xkaW5nIHRoZSBsb2NrLiAgKi8KKyAgfTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisvKiBPd25lciB0eXBlcy4gICovCitlbnVtIF9fcGlkX3R5cGUKKyAgeworICAgIEZfT1dORVJfVElEID0gMCwJCS8qIEtlcm5lbCB0aHJlYWQuICAqLworICAgIEZfT1dORVJfUElELAkJLyogUHJvY2Vzcy4gICovCisgICAgRl9PV05FUl9QR1JQLAkJLyogUHJvY2VzcyBncm91cC4gICovCisgICAgRl9PV05FUl9HSUQgPSBGX09XTkVSX1BHUlAJLyogQWx0ZXJuYXRpdmUsIG9ic29sZXRlIG5hbWUuICAqLworICB9OworCisvKiBTdHJ1Y3R1cmUgdG8gdXNlIHdpdGggRl9HRVRPV05fRVggYW5kIEZfU0VUT1dOX0VYLiAgKi8KK3N0cnVjdCBmX293bmVyX2V4CisgIHsKKyAgICBlbnVtIF9fcGlkX3R5cGUgdHlwZTsJLyogT3duZXIgdHlwZSBvZiBJRC4gICovCisgICAgX19waWRfdCBwaWQ7CQkvKiBJRCBvZiBvd25lci4gICovCisgIH07CisjZW5kaWYKKworLyogRGVmaW5lIHNvbWUgbW9yZSBjb21wYXRpYmlsaXR5IG1hY3JvcyB0byBiZSBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGgKKyAgIEJTRCBzeXN0ZW1zIHdoaWNoIGRpZCBub3QgbWFuYWdlZCB0byBoaWRlIHRoZXNlIGtlcm5lbCBtYWNyb3MuICAqLworI2lmZGVmCV9fVVNFX0JTRAorIyBkZWZpbmUgRkFQUEVORAlPX0FQUEVORAorIyBkZWZpbmUgRkZTWU5DCQlPX0ZTWU5DCisjIGRlZmluZSBGQVNZTkMJCU9fQVNZTkMKKyMgZGVmaW5lIEZOT05CTE9DSwlPX05PTkJMT0NLCisjIGRlZmluZSBGTkRFTEFZCU9fTkRFTEFZCisjZW5kaWYgLyogVXNlIEJTRC4gICovCisKKy8qIEFkdmlzZSB0byBgcG9zaXhfZmFkdmlzZScuICAqLworI2lmZGVmIF9fVVNFX1hPUEVOMksKKyMgZGVmaW5lIFBPU0lYX0ZBRFZfTk9STUFMCTAgLyogTm8gZnVydGhlciBzcGVjaWFsIHRyZWF0bWVudC4gICovCisjIGRlZmluZSBQT1NJWF9GQURWX1JBTkRPTQkxIC8qIEV4cGVjdCByYW5kb20gcGFnZSByZWZlcmVuY2VzLiAgKi8KKyMgZGVmaW5lIFBPU0lYX0ZBRFZfU0VRVUVOVElBTAkyIC8qIEV4cGVjdCBzZXF1ZW50aWFsIHBhZ2UgcmVmZXJlbmNlcy4JICovCisjIGRlZmluZSBQT1NJWF9GQURWX1dJTExORUVECTMgLyogV2lsbCBuZWVkIHRoZXNlIHBhZ2VzLiAgKi8KKyMgZGVmaW5lIFBPU0lYX0ZBRFZfRE9OVE5FRUQJNCAvKiBEb24ndCBuZWVkIHRoZXNlIHBhZ2VzLiAgKi8KKyMgZGVmaW5lIFBPU0lYX0ZBRFZfTk9SRVVTRQk1IC8qIERhdGEgd2lsbCBiZSBhY2Nlc3NlZCBvbmNlLiAgKi8KKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIEZsYWdzIGZvciBTWU5DX0ZJTEVfUkFOR0UuICAqLworIyBkZWZpbmUgU1lOQ19GSUxFX1JBTkdFX1dBSVRfQkVGT1JFCTEgLyogV2FpdCB1cG9uIHdyaXRlb3V0IG9mIGFsbCBwYWdlcworCQkJCQkgICAgIGluIHRoZSByYW5nZSBiZWZvcmUgcGVyZm9ybWluZyB0aGUKKwkJCQkJICAgICB3cml0ZS4gICovCisjIGRlZmluZSBTWU5DX0ZJTEVfUkFOR0VfV1JJVEUJCTIgLyogSW5pdGlhdGUgd3JpdGVvdXQgb2YgYWxsIHRob3NlCisJCQkJCSAgICAgZGlydHkgcGFnZXMgaW4gdGhlIHJhbmdlIHdoaWNoIGFyZQorCQkJCQkgICAgIG5vdCBwcmVzZW50bHkgdW5kZXIgd3JpdGViYWNrLiAgKi8KKyMgZGVmaW5lIFNZTkNfRklMRV9SQU5HRV9XQUlUX0FGVEVSCTQgLyogV2FpdCB1cG9uIHdyaXRlb3V0IG9mIGFsbCBwYWdlcyBpbgorCQkJCQkgICAgIHRoZSByYW5nZSBhZnRlciBwZXJmb3JtaW5nIHRoZQorCQkJCQkgICAgIHdyaXRlLiAgKi8KKworLyogRmxhZ3MgZm9yIFNQTElDRSBhbmQgVk1TUExJQ0UuICAqLworIyBkZWZpbmUgU1BMSUNFX0ZfTU9WRQkJMQkvKiBNb3ZlIHBhZ2VzIGluc3RlYWQgb2YgY29weWluZy4gICovCisjIGRlZmluZSBTUExJQ0VfRl9OT05CTE9DSwkyCS8qIERvbid0IGJsb2NrIG9uIHRoZSBwaXBlIHNwbGljaW5nCisJCQkJCSAgIChidXQgd2UgbWF5IHN0aWxsIGJsb2NrIG9uIHRoZSBmZAorCQkJCQkgICB3ZSBzcGxpY2UgZnJvbS90bykuICAqLworIyBkZWZpbmUgU1BMSUNFX0ZfTU9SRQkJNAkvKiBFeHBlY3QgbW9yZSBkYXRhLiAgKi8KKyMgZGVmaW5lIFNQTElDRV9GX0dJRlQJCTgJLyogUGFnZXMgcGFzc2VkIGluIGFyZSBhIGdpZnQuICAqLworCisKKy8qIEZpbGUgaGFuZGxlIHN0cnVjdHVyZS4gICovCitzdHJ1Y3QgZmlsZV9oYW5kbGUKK3sKKyAgdW5zaWduZWQgaW50IGhhbmRsZV9ieXRlczsKKyAgaW50IGhhbmRsZV90eXBlOworICAvKiBGaWxlIGlkZW50aWZpZXIuICAqLworICB1bnNpZ25lZCBjaGFyIGZfaGFuZGxlWzBdOworfTsKKworLyogTWF4aW11bSBoYW5kbGUgc2l6ZSAoZm9yIG5vdykuICAqLworIyBkZWZpbmUgTUFYX0hBTkRMRV9TWgkxMjgKKyNlbmRpZgorCisvKiBWYWx1ZXMgZm9yIGAqYXQnIGZ1bmN0aW9ucy4gICovCisjaWZkZWYgX19VU0VfQVRGSUxFCisjIGRlZmluZSBBVF9GRENXRAkJLTEwMAkvKiBTcGVjaWFsIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUKKwkJCQkJICAgdGhlICphdCBmdW5jdGlvbnMgc2hvdWxkIHVzZSB0aGUKKwkJCQkJICAgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gKi8KKyMgZGVmaW5lIEFUX1NZTUxJTktfTk9GT0xMT1cJMHgxMDAJLyogRG8gbm90IGZvbGxvdyBzeW1ib2xpYyBsaW5rcy4gICovCisjIGRlZmluZSBBVF9SRU1PVkVESVIJCTB4MjAwCS8qIFJlbW92ZSBkaXJlY3RvcnkgaW5zdGVhZCBvZgorCQkJCQkgICB1bmxpbmtpbmcgZmlsZS4gICovCisjIGRlZmluZSBBVF9TWU1MSU5LX0ZPTExPVwkweDQwMAkvKiBGb2xsb3cgc3ltYm9saWMgbGlua3MuICAqLworIyBkZWZpbmUgQVRfTk9fQVVUT01PVU5UCTB4ODAwCS8qIFN1cHByZXNzIHRlcm1pbmFsIGF1dG9tb3VudAorCQkJCQkgICB0cmF2ZXJzYWwuICAqLworIyBkZWZpbmUgQVRfRUFDQ0VTUwkJMHgyMDAJLyogVGVzdCBhY2Nlc3MgcGVybWl0dGVkIGZvcgorCQkJCQkgICBlZmZlY3RpdmUgSURzLCBub3QgcmVhbCBJRHMuICAqLworI2VuZGlmCisKK19fQkVHSU5fREVDTFMKKworI2lmZGVmIF9fVVNFX0dOVQorCisvKiBQcm92aWRlIGtlcm5lbCBoaW50IHRvIHJlYWQgYWhlYWQuICAqLworZXh0ZXJuIHNzaXplX3QgcmVhZGFoZWFkIChpbnQgX19mZCwgX19vZmY2NF90IF9fb2Zmc2V0LCBzaXplX3QgX19jb3VudCkKKyAgICBfX1RIUk9XOworCisKKy8qIFNlbGVjdGl2ZSBmaWxlIGNvbnRlbnQgc3luY2gnaW5nLiAgKi8KK2V4dGVybiBpbnQgc3luY19maWxlX3JhbmdlIChpbnQgX19mZCwgX19vZmY2NF90IF9fb2Zmc2V0LCBfX29mZjY0X3QgX19jb3VudCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgX19mbGFncyk7CisKKworLyogU3BsaWNlIGFkZHJlc3MgcmFuZ2UgaW50byBhIHBpcGUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3Qgdm1zcGxpY2UgKGludCBfX2Zkb3V0LCBjb25zdCBzdHJ1Y3QgaW92ZWMgKl9faW92LAorCQkJIHNpemVfdCBfX2NvdW50LCB1bnNpZ25lZCBpbnQgX19mbGFncyk7CisKKy8qIFNwbGljZSB0d28gZmlsZXMgdG9nZXRoZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3Qgc3BsaWNlIChpbnQgX19mZGluLCBfX29mZjY0X3QgKl9fb2ZmaW4sIGludCBfX2Zkb3V0LAorCQkgICAgICAgX19vZmY2NF90ICpfX29mZm91dCwgc2l6ZV90IF9fbGVuLAorCQkgICAgICAgdW5zaWduZWQgaW50IF9fZmxhZ3MpOworCisvKiBJbi1rZXJuZWwgaW1wbGVtZW50YXRpb24gb2YgdGVlIGZvciBwaXBlIGJ1ZmZlcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3QgdGVlIChpbnQgX19mZGluLCBpbnQgX19mZG91dCwgc2l6ZV90IF9fbGVuLAorCQkgICAgdW5zaWduZWQgaW50IF9fZmxhZ3MpOworCisvKiBSZXNlcnZlIHN0b3JhZ2UgZm9yIHRoZSBkYXRhIG9mIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBGRC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IGZhbGxvY2F0ZSAoaW50IF9fZmQsIGludCBfX21vZGUsIF9fb2ZmX3QgX19vZmZzZXQsIF9fb2ZmX3QgX19sZW4pOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKGZhbGxvY2F0ZSwgKGludCBfX2ZkLCBpbnQgX19tb2RlLCBfX29mZjY0X3QgX19vZmZzZXQsCisJCQkJICAgX19vZmY2NF90IF9fbGVuKSwKKwkJICAgICAgIGZhbGxvY2F0ZTY0KTsKKyMgIGVsc2UKKyMgICBkZWZpbmUgZmFsbG9jYXRlIGZhbGxvY2F0ZTY0CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBmYWxsb2NhdGU2NCAoaW50IF9fZmQsIGludCBfX21vZGUsIF9fb2ZmNjRfdCBfX29mZnNldCwKKwkJCV9fb2ZmNjRfdCBfX2xlbik7CisjIGVuZGlmCisKKworLyogTWFwIGZpbGUgbmFtZSB0byBmaWxlIGhhbmRsZS4gICovCitleHRlcm4gaW50IG5hbWVfdG9faGFuZGxlX2F0IChpbnQgX19kZmQsIGNvbnN0IGNoYXIgKl9fbmFtZSwKKwkJCSAgICAgIHN0cnVjdCBmaWxlX2hhbmRsZSAqX19oYW5kbGUsIGludCAqX19tbnRfaWQsCisJCQkgICAgICBpbnQgX19mbGFncykgX19USFJPVzsKKworLyogT3BlbiBmaWxlIHVzaW5nIHRoZSBmaWxlIGhhbmRsZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IG9wZW5fYnlfaGFuZGxlX2F0IChpbnQgX19tb3VudGRpcmZkLCBzdHJ1Y3QgZmlsZV9oYW5kbGUgKl9faGFuZGxlLAorCQkJICAgICAgaW50IF9fZmxhZ3MpOworCisjZW5kaWYKKworX19FTkRfREVDTFMKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9mY250bDIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9mY250bDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmU4NTg1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2ZjbnRsMi5oCkBAIC0wLDAgKzEsMTczIEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIGZjbnRsIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfRkNOVExfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9mY250bDIuaD4gZGlyZWN0bHk7IHVzZSA8ZmNudGwuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogQ2hlY2sgdGhhdCBjYWxscyB0byBvcGVuIGFuZCBvcGVuYXQgd2l0aCBPX0NSRUFUIHNldCBoYXZlIGFuCisgICBhcHByb3ByaWF0ZSB0aGlyZC9mb3VydGggcGFyYW1ldGVyLiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBfX29wZW5fMiAoX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnKSBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKF9fb3Blbl9hbGlhcywgKF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19vZmxhZywgLi4uKSwKKwkJICAgICAgIG9wZW4pIF9fbm9ubnVsbCAoKDEpKTsKKyNlbHNlCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKF9fb3Blbl8yLCAoX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnKSwKKwkJICAgICAgIF9fb3BlbjY0XzIpIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoX19vcGVuX2FsaWFzLCAoX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnLCAuLi4pLAorCQkgICAgICAgb3BlbjY0KSBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKK19fZXJyb3JkZWNsIChfX29wZW5fdG9vX21hbnlfYXJncywKKwkgICAgICJvcGVuIGNhbiBiZSBjYWxsZWQgZWl0aGVyIHdpdGggMiBvciAzIGFyZ3VtZW50cywgbm90IG1vcmUiKTsKK19fZXJyb3JkZWNsIChfX29wZW5fbWlzc2luZ19tb2RlLAorCSAgICAgIm9wZW4gd2l0aCBPX0NSRUFUIGluIHNlY29uZCBhcmd1bWVudCBuZWVkcyAzIGFyZ3VtZW50cyIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorb3BlbiAoX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnLCAuLi4pCit7CisgIGlmIChfX3ZhX2FyZ19wYWNrX2xlbiAoKSA+IDEpCisgICAgX19vcGVuX3Rvb19tYW55X2FyZ3MgKCk7CisKKyAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX29mbGFnKSkKKyAgICB7CisgICAgICBpZiAoKF9fb2ZsYWcgJiBPX0NSRUFUKSAhPSAwICYmIF9fdmFfYXJnX3BhY2tfbGVuICgpIDwgMSkKKwl7CisJICBfX29wZW5fbWlzc2luZ19tb2RlICgpOworCSAgcmV0dXJuIF9fb3Blbl8yIChfX3BhdGgsIF9fb2ZsYWcpOworCX0KKyAgICAgIHJldHVybiBfX29wZW5fYWxpYXMgKF9fcGF0aCwgX19vZmxhZywgX192YV9hcmdfcGFjayAoKSk7CisgICAgfQorCisgIGlmIChfX3ZhX2FyZ19wYWNrX2xlbiAoKSA8IDEpCisgICAgcmV0dXJuIF9fb3Blbl8yIChfX3BhdGgsIF9fb2ZsYWcpOworCisgIHJldHVybiBfX29wZW5fYWxpYXMgKF9fcGF0aCwgX19vZmxhZywgX192YV9hcmdfcGFjayAoKSk7Cit9CisKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IF9fb3BlbjY0XzIgKF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19vZmxhZykgX19ub25udWxsICgoMSkpOworZXh0ZXJuIGludCBfX1JFRElSRUNUIChfX29wZW42NF9hbGlhcywgKF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19vZmxhZywKKwkJCQkJLi4uKSwgb3BlbjY0KSBfX25vbm51bGwgKCgxKSk7CitfX2Vycm9yZGVjbCAoX19vcGVuNjRfdG9vX21hbnlfYXJncywKKwkgICAgICJvcGVuNjQgY2FuIGJlIGNhbGxlZCBlaXRoZXIgd2l0aCAyIG9yIDMgYXJndW1lbnRzLCBub3QgbW9yZSIpOworX19lcnJvcmRlY2wgKF9fb3BlbjY0X21pc3NpbmdfbW9kZSwKKwkgICAgICJvcGVuNjQgd2l0aCBPX0NSRUFUIGluIHNlY29uZCBhcmd1bWVudCBuZWVkcyAzIGFyZ3VtZW50cyIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorb3BlbjY0IChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fb2ZsYWcsIC4uLikKK3sKKyAgaWYgKF9fdmFfYXJnX3BhY2tfbGVuICgpID4gMSkKKyAgICBfX29wZW42NF90b29fbWFueV9hcmdzICgpOworCisgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19vZmxhZykpCisgICAgeworICAgICAgaWYgKChfX29mbGFnICYgT19DUkVBVCkgIT0gMCAmJiBfX3ZhX2FyZ19wYWNrX2xlbiAoKSA8IDEpCisJeworCSAgX19vcGVuNjRfbWlzc2luZ19tb2RlICgpOworCSAgcmV0dXJuIF9fb3BlbjY0XzIgKF9fcGF0aCwgX19vZmxhZyk7CisJfQorICAgICAgcmV0dXJuIF9fb3BlbjY0X2FsaWFzIChfX3BhdGgsIF9fb2ZsYWcsIF9fdmFfYXJnX3BhY2sgKCkpOworICAgIH0KKworICBpZiAoX192YV9hcmdfcGFja19sZW4gKCkgPCAxKQorICAgIHJldHVybiBfX29wZW42NF8yIChfX3BhdGgsIF9fb2ZsYWcpOworCisgIHJldHVybiBfX29wZW42NF9hbGlhcyAoX19wYXRoLCBfX29mbGFnLCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9BVEZJTEUKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgX19vcGVuYXRfMiAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19vZmxhZykKKyAgICAgX19ub25udWxsICgoMikpOworZXh0ZXJuIGludCBfX1JFRElSRUNUIChfX29wZW5hdF9hbGlhcywgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwKKwkJCQkJaW50IF9fb2ZsYWcsIC4uLiksIG9wZW5hdCkKKyAgICAgX19ub25udWxsICgoMikpOworIyBlbHNlCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKF9fb3BlbmF0XzIsIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsCisJCQkJICAgIGludCBfX29mbGFnKSwgX19vcGVuYXQ2NF8yKQorICAgICBfX25vbm51bGwgKCgyKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKF9fb3BlbmF0X2FsaWFzLCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLAorCQkJCQlpbnQgX19vZmxhZywgLi4uKSwgb3BlbmF0NjQpCisgICAgIF9fbm9ubnVsbCAoKDIpKTsKKyMgZW5kaWYKK19fZXJyb3JkZWNsIChfX29wZW5hdF90b29fbWFueV9hcmdzLAorCSAgICAgIm9wZW5hdCBjYW4gYmUgY2FsbGVkIGVpdGhlciB3aXRoIDMgb3IgNCBhcmd1bWVudHMsIG5vdCBtb3JlIik7CitfX2Vycm9yZGVjbCAoX19vcGVuYXRfbWlzc2luZ19tb2RlLAorCSAgICAgIm9wZW5hdCB3aXRoIE9fQ1JFQVQgaW4gdGhpcmQgYXJndW1lbnQgbmVlZHMgNCBhcmd1bWVudHMiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK29wZW5hdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19vZmxhZywgLi4uKQoreworICBpZiAoX192YV9hcmdfcGFja19sZW4gKCkgPiAxKQorICAgIF9fb3BlbmF0X3Rvb19tYW55X2FyZ3MgKCk7CisKKyAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX29mbGFnKSkKKyAgICB7CisgICAgICBpZiAoKF9fb2ZsYWcgJiBPX0NSRUFUKSAhPSAwICYmIF9fdmFfYXJnX3BhY2tfbGVuICgpIDwgMSkKKwl7CisJICBfX29wZW5hdF9taXNzaW5nX21vZGUgKCk7CisJICByZXR1cm4gX19vcGVuYXRfMiAoX19mZCwgX19wYXRoLCBfX29mbGFnKTsKKwl9CisgICAgICByZXR1cm4gX19vcGVuYXRfYWxpYXMgKF9fZmQsIF9fcGF0aCwgX19vZmxhZywgX192YV9hcmdfcGFjayAoKSk7CisgICAgfQorCisgIGlmIChfX3ZhX2FyZ19wYWNrX2xlbiAoKSA8IDEpCisgICAgcmV0dXJuIF9fb3BlbmF0XzIgKF9fZmQsIF9fcGF0aCwgX19vZmxhZyk7CisKKyAgcmV0dXJuIF9fb3BlbmF0X2FsaWFzIChfX2ZkLCBfX3BhdGgsIF9fb2ZsYWcsIF9fdmFfYXJnX3BhY2sgKCkpOworfQorCisKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgX19vcGVuYXQ2NF8yIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnKQorICAgICBfX25vbm51bGwgKCgyKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKF9fb3BlbmF0NjRfYWxpYXMsIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsCisJCQkJCSAgaW50IF9fb2ZsYWcsIC4uLiksIG9wZW5hdDY0KQorICAgICBfX25vbm51bGwgKCgyKSk7CitfX2Vycm9yZGVjbCAoX19vcGVuYXQ2NF90b29fbWFueV9hcmdzLAorCSAgICAgIm9wZW5hdDY0IGNhbiBiZSBjYWxsZWQgZWl0aGVyIHdpdGggMyBvciA0IGFyZ3VtZW50cywgbm90IG1vcmUiKTsKK19fZXJyb3JkZWNsIChfX29wZW5hdDY0X21pc3NpbmdfbW9kZSwKKwkgICAgICJvcGVuYXQ2NCB3aXRoIE9fQ1JFQVQgaW4gdGhpcmQgYXJndW1lbnQgbmVlZHMgNCBhcmd1bWVudHMiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK29wZW5hdDY0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnLCAuLi4pCit7CisgIGlmIChfX3ZhX2FyZ19wYWNrX2xlbiAoKSA+IDEpCisgICAgX19vcGVuYXQ2NF90b29fbWFueV9hcmdzICgpOworCisgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19vZmxhZykpCisgICAgeworICAgICAgaWYgKChfX29mbGFnICYgT19DUkVBVCkgIT0gMCAmJiBfX3ZhX2FyZ19wYWNrX2xlbiAoKSA8IDEpCisJeworCSAgX19vcGVuYXQ2NF9taXNzaW5nX21vZGUgKCk7CisJICByZXR1cm4gX19vcGVuYXQ2NF8yIChfX2ZkLCBfX3BhdGgsIF9fb2ZsYWcpOworCX0KKyAgICAgIHJldHVybiBfX29wZW5hdDY0X2FsaWFzIChfX2ZkLCBfX3BhdGgsIF9fb2ZsYWcsIF9fdmFfYXJnX3BhY2sgKCkpOworICAgIH0KKworICBpZiAoX192YV9hcmdfcGFja19sZW4gKCkgPCAxKQorICAgIHJldHVybiBfX29wZW5hdDY0XzIgKF9fZmQsIF9fcGF0aCwgX19vZmxhZyk7CisKKyAgcmV0dXJuIF9fb3BlbmF0NjRfYWxpYXMgKF9fZmQsIF9fcGF0aCwgX19vZmxhZywgX192YV9hcmdfcGFjayAoKSk7Cit9CisjIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9mZW52LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMDA3NzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZmVudi5oCkBAIC0wLDAgKzEsMTM4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0ZFTlZfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2ZlbnYuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGZlbnYuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCisvKiBEZWZpbmUgYml0cyByZXByZXNlbnRpbmcgdGhlIGV4Y2VwdGlvbi4gIFdlIHVzZSB0aGUgYml0IHBvc2l0aW9ucworICAgb2YgdGhlIGFwcHJvcHJpYXRlIGJpdHMgaW4gdGhlIEZQVSBjb250cm9sIHdvcmQuICAqLworZW51bQorICB7CisgICAgRkVfSU5WQUxJRCA9IDB4MDEsCisjZGVmaW5lIEZFX0lOVkFMSUQJRkVfSU5WQUxJRAorICAgIF9fRkVfREVOT1JNID0gMHgwMiwKKyAgICBGRV9ESVZCWVpFUk8gPSAweDA0LAorI2RlZmluZSBGRV9ESVZCWVpFUk8JRkVfRElWQllaRVJPCisgICAgRkVfT1ZFUkZMT1cgPSAweDA4LAorI2RlZmluZSBGRV9PVkVSRkxPVwlGRV9PVkVSRkxPVworICAgIEZFX1VOREVSRkxPVyA9IDB4MTAsCisjZGVmaW5lIEZFX1VOREVSRkxPVwlGRV9VTkRFUkZMT1cKKyAgICBGRV9JTkVYQUNUID0gMHgyMAorI2RlZmluZSBGRV9JTkVYQUNUCUZFX0lORVhBQ1QKKyAgfTsKKworI2RlZmluZSBGRV9BTExfRVhDRVBUIFwKKwkoRkVfSU5FWEFDVCB8IEZFX0RJVkJZWkVSTyB8IEZFX1VOREVSRkxPVyB8IEZFX09WRVJGTE9XIHwgRkVfSU5WQUxJRCkKKworLyogVGhlIGl4ODcgRlBVIHN1cHBvcnRzIGFsbCBvZiB0aGUgZm91ciBkZWZpbmVkIHJvdW5kaW5nIG1vZGVzLiAgV2UKKyAgIHVzZSBhZ2FpbiB0aGUgYml0IHBvc2l0aW9ucyBpbiB0aGUgRlBVIGNvbnRyb2wgd29yZCBhcyB0aGUgdmFsdWVzCisgICBmb3IgdGhlIGFwcHJvcHJpYXRlIG1hY3Jvcy4gICovCitlbnVtCisgIHsKKyAgICBGRV9UT05FQVJFU1QgPSAwLAorI2RlZmluZSBGRV9UT05FQVJFU1QJRkVfVE9ORUFSRVNUCisgICAgRkVfRE9XTldBUkQgPSAweDQwMCwKKyNkZWZpbmUgRkVfRE9XTldBUkQJRkVfRE9XTldBUkQKKyAgICBGRV9VUFdBUkQgPSAweDgwMCwKKyNkZWZpbmUgRkVfVVBXQVJECUZFX1VQV0FSRAorICAgIEZFX1RPV0FSRFpFUk8gPSAweGMwMAorI2RlZmluZSBGRV9UT1dBUkRaRVJPCUZFX1RPV0FSRFpFUk8KKyAgfTsKKworCisvKiBUeXBlIHJlcHJlc2VudGluZyBleGNlcHRpb24gZmxhZ3MuICAqLwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgZmV4Y2VwdF90OworCisKKy8qIFR5cGUgcmVwcmVzZW50aW5nIGZsb2F0aW5nLXBvaW50IGVudmlyb25tZW50LiAgVGhpcyBmdW5jdGlvbiBjb3JyZXNwb25kcworICAgdG8gdGhlIGxheW91dCBvZiB0aGUgYmxvY2sgd3JpdHRlbiBieSB0aGUgYGZzdGVudicuICAqLwordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX2NvbnRyb2xfd29yZDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX191bnVzZWQxOworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3N0YXR1c193b3JkOworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3VudXNlZDI7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fdGFnczsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX191bnVzZWQzOworICAgIHVuc2lnbmVkIGludCBfX2VpcDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX19jc19zZWxlY3RvcjsKKyAgICB1bnNpZ25lZCBpbnQgX19vcGNvZGU6MTE7CisgICAgdW5zaWduZWQgaW50IF9fdW51c2VkNDo1OworICAgIHVuc2lnbmVkIGludCBfX2RhdGFfb2Zmc2V0OworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX2RhdGFfc2VsZWN0b3I7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fdW51c2VkNTsKKyAgfQorZmVudl90OworCisvKiBJZiB0aGUgZGVmYXVsdCBhcmd1bWVudCBpcyB1c2VkIHdlIHVzZSB0aGlzIHZhbHVlLiAgKi8KKyNkZWZpbmUgRkVfREZMX0VOVgkoKF9fY29uc3QgZmVudl90ICopIC0xKQorCisjaWZkZWYgX19VU0VfR05VCisvKiBGbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCB3aGVyZSBub25lIG9mIHRoZSBleGNlcHRpb24gaXMgbWFza2VkLiAgKi8KKyMgZGVmaW5lIEZFX05PTUFTS19FTlYJKChfX2NvbnN0IGZlbnZfdCAqKSAtMikKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9FWFRFUk5fSU5MSU5FUworX19CRUdJTl9ERUNMUworCisvKiBPcHRpbWl6ZWQgdmVyc2lvbnMuICAqLworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX19mZXJhaXNlZXhjZXB0X3JlbmFtZWQsIChpbnQpLCBmZXJhaXNlZXhjZXB0KTsKK19fZXh0ZXJuX2lubGluZSBpbnQKK19fTlRIIChmZXJhaXNlZXhjZXB0IChpbnQgX19leGNlcHRzKSkKK3sKKyAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX2V4Y2VwdHMpCisgICAgICAmJiAoX19leGNlcHRzICYgfihGRV9JTlZBTElEIHwgRkVfRElWQllaRVJPKSkgPT0gMCkKKyAgICB7CisgICAgICBpZiAoKEZFX0lOVkFMSUQgJiBfX2V4Y2VwdHMpICE9IDApCisJeworCSAgLyogT25lIGV4YW1wbGUgb2YgYSBpbnZhbGlkIG9wZXJhdGlvbiBpcyAwLjAgLyAwLjAuICAqLworCSAgZmxvYXQgX19mID0gMC4wOworCisjIGlmZGVmIF9fU1NFX01BVEhfXworCSAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJkaXZzcyAlMCwgJTAgIiA6IDogIngiIChfX2YpKTsKKyMgZWxzZQorCSAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJmZGl2ICUlc3QsICUlc3QoMCk7IGZ3YWl0IgorCQkJCTogIj10IiAoX19mKSA6ICIwIiAoX19mKSk7CisjIGVuZGlmCisJICAodm9pZCkgJl9fZjsKKwl9CisgICAgICBpZiAoKEZFX0RJVkJZWkVSTyAmIF9fZXhjZXB0cykgIT0gMCkKKwl7CisJICBmbG9hdCBfX2YgPSAxLjA7CisJICBmbG9hdCBfX2cgPSAwLjA7CisKKyMgaWZkZWYgX19TU0VfTUFUSF9fCisJICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImRpdnNzICUxLCAlMCIgOiA6ICJ4IiAoX19mKSwgIngiIChfX2cpKTsKKyMgZWxzZQorCSAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJmZGl2cCAlJXN0KDEpLCAlJXN0OyBmd2FpdCIKKwkJCQk6ICI9dCIgKF9fZikgOiAiMCIgKF9fZiksICJ1IiAoX19nKSA6ICJzdCgxKSIpOworIyBlbmRpZgorCSAgKHZvaWQpICZfX2Y7CisJfQorCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIF9fZmVyYWlzZWV4Y2VwdF9yZW5hbWVkIChfX2V4Y2VwdHMpOworfQorCitfX0VORF9ERUNMUworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvZmVudmlubGluZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2ZlbnZpbmxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmY3N2I1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2ZlbnZpbmxpbmUuaApAQCAtMCwwICsxLDggQEAKKy8qIFRoaXMgZmlsZSBwcm92aWRlcyBpbmxpbmUgdmVyc2lvbnMgb2YgZmxvYXRpbmctcGludCBlbnZpcm9ubWVudAorICAgaGFuZGxpbmcgZnVuY3Rpb25zLiAgSWYgdGhlcmUgd2VyZSBhbnkuICAqLworCisjaWZuZGVmIF9fTk9fTUFUSF9JTkxJTkVTCisKKy8qIEhlcmUgaXMgd2hlcmUgdGhlIGNvZGUgd291bGQgZ28uICAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9odWdlX3ZhbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2h1Z2VfdmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjYTExZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9odWdlX3ZhbC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIGBIVUdFX1ZBTCcgY29uc3RhbnQgZm9yIElFRUUgNzU0IG1hY2hpbmVzICh3aGVyZSBpdCBpcyBpbmZpbml0eSkuCisgICBVc2VkIGJ5IDxzdGRsaWIuaD4gYW5kIDxtYXRoLmg+IGZ1bmN0aW9ucyBmb3Igb3ZlcmZsb3cuCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTksIDIwMDAsIDIwMDQKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9NQVRIX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9odWdlX3ZhbC5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bWF0aC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBJRUVFIHBvc2l0aXZlIGluZmluaXR5ICgtSFVHRV9WQUwgaXMgbmVnYXRpdmUgaW5maW5pdHkpLiAgKi8KKworI2lmIF9fR05VQ19QUkVSRVEoMywzKQorIyBkZWZpbmUgSFVHRV9WQUwJKF9fYnVpbHRpbl9odWdlX3ZhbCgpKQorI2VsaWYgX19HTlVDX1BSRVJFUSgyLDk2KQorIyBkZWZpbmUgSFVHRV9WQUwJKF9fZXh0ZW5zaW9uX18gMHgxLjBwMjA0NykKKyNlbGlmIGRlZmluZWQgX19HTlVDX18KKworIyBkZWZpbmUgSFVHRV9WQUwgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoKHVuaW9uIHsgdW5zaWduZWQgX19sIF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fRElfXykpKTsgZG91YmxlIF9fZDsgfSkgICBcCisgICAgeyBfX2w6IDB4N2ZmMDAwMDAwMDAwMDAwMFVMTCB9KS5fX2QpCisKKyNlbHNlIC8qIG5vdCBHQ0MgKi8KKworIyBpbmNsdWRlIDxlbmRpYW4uaD4KKwordHlwZWRlZiB1bmlvbiB7IHVuc2lnbmVkIGNoYXIgX19jWzhdOyBkb3VibGUgX19kOyB9IF9faHVnZV92YWxfdDsKKworIyBpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisjICBkZWZpbmUgX19IVUdFX1ZBTF9ieXRlcwl7IDB4N2YsIDB4ZjAsIDAsIDAsIDAsIDAsIDAsIDAgfQorIyBlbmRpZgorIyBpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjICBkZWZpbmUgX19IVUdFX1ZBTF9ieXRlcwl7IDAsIDAsIDAsIDAsIDAsIDAsIDB4ZjAsIDB4N2YgfQorIyBlbmRpZgorCitzdGF0aWMgX19odWdlX3ZhbF90IF9faHVnZV92YWwgPSB7IF9fSFVHRV9WQUxfYnl0ZXMgfTsKKyMgZGVmaW5lIEhVR0VfVkFMCShfX2h1Z2VfdmFsLl9fZCkKKworI2VuZGlmCS8qIEdDQy4gICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvaHVnZV92YWxmLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvaHVnZV92YWxmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc4NTM0MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9odWdlX3ZhbGYuaApAQCAtMCwwICsxLDUzIEBACisvKiBgSFVHRV9WQUxGJyBjb25zdGFudCBmb3IgSUVFRSA3NTQgbWFjaGluZXMgKHdoZXJlIGl0IGlzIGluZmluaXR5KS4KKyAgIFVzZWQgYnkgPHN0ZGxpYi5oPiBhbmQgPG1hdGguaD4gZnVuY3Rpb25zIGZvciBvdmVyZmxvdy4KKyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCwgMjAwNAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01BVEhfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2h1Z2VfdmFsZi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bWF0aC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBJRUVFIHBvc2l0aXZlIGluZmluaXR5ICgtSFVHRV9WQUwgaXMgbmVnYXRpdmUgaW5maW5pdHkpLiAgKi8KKworI2lmIF9fR05VQ19QUkVSRVEoMywzKQorIyBkZWZpbmUgSFVHRV9WQUxGCShfX2J1aWx0aW5faHVnZV92YWxmKCkpCisjZWxpZiBfX0dOVUNfUFJFUkVRKDIsOTYpCisjIGRlZmluZSBIVUdFX1ZBTEYJKF9fZXh0ZW5zaW9uX18gMHgxLjBwMjU1ZikKKyNlbGlmIGRlZmluZWQgX19HTlVDX18KKworIyAgIGRlZmluZSBIVUdFX1ZBTEYgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoKHVuaW9uIHsgdW5zaWduZWQgX19sIF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fU0lfXykpKTsgZmxvYXQgX19kOyB9KSAgICBcCisgICAgeyBfX2w6IDB4N2Y4MDAwMDBVTCB9KS5fX2QpCisKKyNlbHNlIC8qIG5vdCBHQ0MgKi8KKwordHlwZWRlZiB1bmlvbiB7IHVuc2lnbmVkIGNoYXIgX19jWzRdOyBmbG9hdCBfX2Y7IH0gX19odWdlX3ZhbGZfdDsKKworIyBpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisjICBkZWZpbmUgX19IVUdFX1ZBTEZfYnl0ZXMJeyAweDdmLCAweDgwLCAwLCAwIH0KKyMgZW5kaWYKKyMgaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorIyAgZGVmaW5lIF9fSFVHRV9WQUxGX2J5dGVzCXsgMCwgMCwgMHg4MCwgMHg3ZiB9CisjIGVuZGlmCisKK3N0YXRpYyBfX2h1Z2VfdmFsZl90IF9faHVnZV92YWxmID0geyBfX0hVR0VfVkFMRl9ieXRlcyB9OworIyBkZWZpbmUgSFVHRV9WQUxGCShfX2h1Z2VfdmFsZi5fX2YpCisKKyNlbmRpZgkvKiBHQ0MuICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2h1Z2VfdmFsbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2h1Z2VfdmFsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NzhjN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvaHVnZV92YWxsLmgKQEAgLTAsMCArMSw0MyBAQAorLyogYEhVR0VfVkFMTCcgY29uc3RhbnQgZm9yIGl4ODYgKHdoZXJlIGl0IGlzIGluZmluaXR5KS4KKyAgIFVzZWQgYnkgPHN0ZGxpYi5oPiBhbmQgPG1hdGguaD4gZnVuY3Rpb25zIGZvciBvdmVyZmxvdy4KKyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCwgMjAwNAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01BVEhfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2h1Z2VfdmFsbC5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bWF0aC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWYgX19HTlVDX1BSRVJFUSgzLDMpCisjIGRlZmluZSBIVUdFX1ZBTEwJKF9fYnVpbHRpbl9odWdlX3ZhbGwoKSkKKyNlbGlmIF9fR05VQ19QUkVSRVEoMiw5NikKKyMgZGVmaW5lIEhVR0VfVkFMTAkoX19leHRlbnNpb25fXyAweDEuMHAzMjc2N0wpCisjZWxzZQorCisjIGRlZmluZSBfX0hVR0VfVkFMTF9ieXRlcwl7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4ODAsIDB4ZmYsIDB4N2YsIDAsIDAgfQorCisjIGRlZmluZSBfX2h1Z2VfdmFsbF90CXVuaW9uIHsgdW5zaWduZWQgY2hhciBfX2NbMTJdOyBsb25nIGRvdWJsZSBfX2xkOyB9CisjIGlmZGVmIF9fR05VQ19fCisjICBkZWZpbmUgSFVHRV9WQUxMCShfX2V4dGVuc2lvbl9fIFwKKwkJCSAoKF9faHVnZV92YWxsX3QpIHsgX19jOiBfX0hVR0VfVkFMTF9ieXRlcyB9KS5fX2xkKQorIyBlbHNlCS8qIE5vdCBHQ0MuICAqLworc3RhdGljIF9faHVnZV92YWxsX3QgX19odWdlX3ZhbGwgPSB7IF9fSFVHRV9WQUxMX2J5dGVzIH07CisjICBkZWZpbmUgSFVHRV9WQUxMCShfX2h1Z2VfdmFsbC5fX2xkKQorIyAgZW5kaWYgLyogR0NDLiAgKi8KKworI2VuZGlmIC8qIEdDQyAyLjk1ICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvaW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9pbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NWUxNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvaW4uaApAQCAtMCwwICsxLDE4OSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTIwMDAsMjAwNCwyMDA4LDIwMTAsMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogTGludXggdmVyc2lvbi4gICovCisKKyNpZm5kZWYgX05FVElORVRfSU5fSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2luLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxuZXRpbmV0L2luLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIE9wdGlvbnMgZm9yIHVzZSB3aXRoIGBnZXRzb2Nrb3B0JyBhbmQgYHNldHNvY2tvcHQnIGF0IHRoZSBJUCBsZXZlbC4KKyAgIFRoZSBmaXJzdCB3b3JkIGluIHRoZSBjb21tZW50IGF0IHRoZSByaWdodCBpcyB0aGUgZGF0YSB0eXBlIHVzZWQ7CisgICAiYm9vbCIgbWVhbnMgYSBib29sZWFuIHZhbHVlIHN0b3JlZCBpbiBhbiBgaW50Jy4gICovCisjZGVmaW5lICAgICAgICBJUF9PUFRJT05TICAgICAgNCAgICAgICAvKiBpcF9vcHRzOyBJUCBwZXItcGFja2V0IG9wdGlvbnMuICAqLworI2RlZmluZSAgICAgICAgSVBfSERSSU5DTCAgICAgIDMgICAgICAgLyogaW50OyBIZWFkZXIgaXMgaW5jbHVkZWQgd2l0aCBkYXRhLiAgKi8KKyNkZWZpbmUgICAgICAgIElQX1RPUyAgICAgICAgICAxICAgICAgIC8qIGludDsgSVAgdHlwZSBvZiBzZXJ2aWNlIGFuZCBwcmVjZWRlbmNlLiAgKi8KKyNkZWZpbmUgICAgICAgIElQX1RUTCAgICAgICAgICAyICAgICAgIC8qIGludDsgSVAgdGltZSB0byBsaXZlLiAgKi8KKyNkZWZpbmUgICAgICAgIElQX1JFQ1ZPUFRTICAgICA2ICAgICAgIC8qIGJvb2w7IFJlY2VpdmUgYWxsIElQIG9wdGlvbnMgdy9kYXRhZ3JhbS4gICovCisvKiBGb3IgQlNEIGNvbXBhdGliaWxpdHkuICAqLworI2RlZmluZSAgICAgICAgSVBfUkVDVlJFVE9QVFMgIElQX1JFVE9QVFMgICAgICAgLyogYm9vbDsgUmVjZWl2ZSBJUCBvcHRpb25zIGZvciByZXNwb25zZS4gICovCisjZGVmaW5lICAgICAgICBJUF9SRVRPUFRTICAgICAgNyAgICAgICAvKiBpcF9vcHRzOyBTZXQvZ2V0IElQIHBlci1wYWNrZXQgb3B0aW9ucy4gICovCisjZGVmaW5lIElQX01VTFRJQ0FTVF9JRiAzMgkvKiBpbl9hZGRyOyBzZXQvZ2V0IElQIG11bHRpY2FzdCBpL2YgKi8KKyNkZWZpbmUgSVBfTVVMVElDQVNUX1RUTCAzMwkvKiB1X2NoYXI7IHNldC9nZXQgSVAgbXVsdGljYXN0IHR0bCAqLworI2RlZmluZSBJUF9NVUxUSUNBU1RfTE9PUCAzNAkvKiBpX2NoYXI7IHNldC9nZXQgSVAgbXVsdGljYXN0IGxvb3BiYWNrICovCisjZGVmaW5lIElQX0FERF9NRU1CRVJTSElQIDM1CS8qIGlwX21yZXE7IGFkZCBhbiBJUCBncm91cCBtZW1iZXJzaGlwICovCisjZGVmaW5lIElQX0RST1BfTUVNQkVSU0hJUCAzNgkvKiBpcF9tcmVxOyBkcm9wIGFuIElQIGdyb3VwIG1lbWJlcnNoaXAgKi8KKyNkZWZpbmUgSVBfVU5CTE9DS19TT1VSQ0UgMzcJLyogaXBfbXJlcV9zb3VyY2U6IHVuYmxvY2sgZGF0YSBmcm9tIHNvdXJjZSAqLworI2RlZmluZSBJUF9CTE9DS19TT1VSQ0UgMzgJLyogaXBfbXJlcV9zb3VyY2U6IGJsb2NrIGRhdGEgZnJvbSBzb3VyY2UgKi8KKyNkZWZpbmUgSVBfQUREX1NPVVJDRV9NRU1CRVJTSElQIDM5IC8qIGlwX21yZXFfc291cmNlOiBqb2luIHNvdXJjZSBncm91cCAqLworI2RlZmluZSBJUF9EUk9QX1NPVVJDRV9NRU1CRVJTSElQIDQwIC8qIGlwX21yZXFfc291cmNlOiBsZWF2ZSBzb3VyY2UgZ3JvdXAgKi8KKyNkZWZpbmUgSVBfTVNGSUxURVIgNDEKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9HTlUKKyMgZGVmaW5lIE1DQVNUX0pPSU5fR1JPVVAgNDIJLyogZ3JvdXBfcmVxOiBqb2luIGFueS1zb3VyY2UgZ3JvdXAgKi8KKyMgZGVmaW5lIE1DQVNUX0JMT0NLX1NPVVJDRSA0MwkvKiBncm91cF9zb3VyY2VfcmVxOiBibG9jayBmcm9tIGdpdmVuIGdyb3VwICovCisjIGRlZmluZSBNQ0FTVF9VTkJMT0NLX1NPVVJDRSA0NCAvKiBncm91cF9zb3VyY2VfcmVxOiB1bmJsb2NrIGZyb20gZ2l2ZW4gZ3JvdXAqLworIyBkZWZpbmUgTUNBU1RfTEVBVkVfR1JPVVAgNDUJLyogZ3JvdXBfcmVxOiBsZWF2ZSBhbnktc291cmNlIGdyb3VwICovCisjIGRlZmluZSBNQ0FTVF9KT0lOX1NPVVJDRV9HUk9VUCA0NiAvKiBncm91cF9zb3VyY2VfcmVxOiBqb2luIHNvdXJjZS1zcGVjIGdyICovCisjIGRlZmluZSBNQ0FTVF9MRUFWRV9TT1VSQ0VfR1JPVVAgNDcgLyogZ3JvdXBfc291cmNlX3JlcTogbGVhdmUgc291cmNlLXNwZWMgZ3IqLworIyBkZWZpbmUgTUNBU1RfTVNGSUxURVIgNDgKKworIyBkZWZpbmUgTUNBU1RfRVhDTFVERSAgIDAKKyMgZGVmaW5lIE1DQVNUX0lOQ0xVREUgICAxCisjZW5kaWYKKworI2RlZmluZSBJUF9ST1VURVJfQUxFUlQJNQkvKiBib29sICovCisjZGVmaW5lIElQX1BLVElORk8JOAkvKiBib29sICovCisjZGVmaW5lIElQX1BLVE9QVElPTlMJOQorI2RlZmluZSBJUF9QTVRVRElTQwkxMAkvKiBvYnNvbGV0ZSBuYW1lPyAqLworI2RlZmluZSBJUF9NVFVfRElTQ09WRVIJMTAJLyogaW50OyBzZWUgYmVsb3cgKi8KKyNkZWZpbmUgSVBfUkVDVkVSUgkxMQkvKiBib29sICovCisjZGVmaW5lIElQX1JFQ1ZUVEwJMTIJLyogYm9vbCAqLworI2RlZmluZSBJUF9SRUNWVE9TCTEzCS8qIGJvb2wgKi8KKyNkZWZpbmUgSVBfTVRVCQkxNAkvKiBpbnQgKi8KKyNkZWZpbmUgSVBfRlJFRUJJTkQJMTUKKyNkZWZpbmUgSVBfSVBTRUNfUE9MSUNZIDE2CisjZGVmaW5lIElQX1hGUk1fUE9MSUNZCTE3CisjZGVmaW5lIElQX1BBU1NTRUMJMTgKKyNkZWZpbmUgSVBfVFJBTlNQQVJFTlQJMTkKKyNkZWZpbmUgSVBfTVVMVElDQVNUX0FMTCA0OQkvKiBib29sICovCisKKy8qIFRQcm94eSBvcmlnaW5hbCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgSVBfT1JJR0RTVEFERFIgICAgICAgMjAKKyNkZWZpbmUgSVBfUkVDVk9SSUdEU1RBRERSICAgSVBfT1JJR0RTVEFERFIKKworI2RlZmluZSBJUF9NSU5UVEwgICAgICAgMjEKKworCisvKiBJUF9NVFVfRElTQ09WRVIgYXJndW1lbnRzLiAgKi8KKyNkZWZpbmUgSVBfUE1UVURJU0NfRE9OVCAgIDAJLyogTmV2ZXIgc2VuZCBERiBmcmFtZXMuICAqLworI2RlZmluZSBJUF9QTVRVRElTQ19XQU5UICAgMQkvKiBVc2UgcGVyIHJvdXRlIGhpbnRzLiAgKi8KKyNkZWZpbmUgSVBfUE1UVURJU0NfRE8gICAgIDIJLyogQWx3YXlzIERGLiAgKi8KKyNkZWZpbmUgSVBfUE1UVURJU0NfUFJPQkUgIDMJLyogSWdub3JlIGRzdCBwbXR1LiAgKi8KKworLyogVG8gc2VsZWN0IHRoZSBJUCBsZXZlbC4gICovCisjZGVmaW5lIFNPTF9JUAkwCisKKyNkZWZpbmUgSVBfREVGQVVMVF9NVUxUSUNBU1RfVFRMICAgICAgICAxCisjZGVmaW5lIElQX0RFRkFVTFRfTVVMVElDQVNUX0xPT1AgICAgICAgMQorI2RlZmluZSBJUF9NQVhfTUVNQkVSU0hJUFMgICAgICAgICAgICAgIDIwCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9HTlUKKy8qIFN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIElQIG9wdGlvbnMgZm9yIElQX09QVElPTlMgYW5kIElQX1JFVE9QVFMuCisgICBUaGUgYGlwX2RzdCcgZmllbGQgaXMgdXNlZCBmb3IgdGhlIGZpcnN0LWhvcCBnYXRld2F5IHdoZW4gdXNpbmcgYQorICAgc291cmNlIHJvdXRlICh0aGlzIGdldHMgcHV0IGludG8gdGhlIGhlYWRlciBwcm9wZXIpLiAgKi8KK3N0cnVjdCBpcF9vcHRzCisgIHsKKyAgICBzdHJ1Y3QgaW5fYWRkciBpcF9kc3Q7CS8qIEZpcnN0IGhvcDsgemVybyB3aXRob3V0IHNvdXJjZSByb3V0ZS4gICovCisgICAgY2hhciBpcF9vcHRzWzQwXTsJCS8qIEFjdHVhbGx5IHZhcmlhYmxlIGluIHNpemUuICAqLworICB9OworCisvKiBMaWtlIGBzdHJ1Y3QgaXBfbXJlcScgYnV0IGluY2x1ZGluZyBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBieSBpbmRleC4gICovCitzdHJ1Y3QgaXBfbXJlcW4KKyAgeworICAgIHN0cnVjdCBpbl9hZGRyIGltcl9tdWx0aWFkZHI7CS8qIElQIG11bHRpY2FzdCBhZGRyZXNzIG9mIGdyb3VwICovCisgICAgc3RydWN0IGluX2FkZHIgaW1yX2FkZHJlc3M7CQkvKiBsb2NhbCBJUCBhZGRyZXNzIG9mIGludGVyZmFjZSAqLworICAgIGludAlpbXJfaWZpbmRleDsJCQkvKiBJbnRlcmZhY2UgaW5kZXggKi8KKyAgfTsKKworLyogU3RydWN0dXJlIHVzZWQgZm9yIElQX1BLVElORk8uICAqLworc3RydWN0IGluX3BrdGluZm8KKyAgeworICAgIGludCBpcGlfaWZpbmRleDsJCQkvKiBJbnRlcmZhY2UgaW5kZXggICovCisgICAgc3RydWN0IGluX2FkZHIgaXBpX3NwZWNfZHN0OwkvKiBSb3V0aW5nIGRlc3RpbmF0aW9uIGFkZHJlc3MgICovCisgICAgc3RydWN0IGluX2FkZHIgaXBpX2FkZHI7CQkvKiBIZWFkZXIgZGVzdGluYXRpb24gYWRkcmVzcyAgKi8KKyAgfTsKKyNlbmRpZgorCisvKiBPcHRpb25zIGZvciB1c2Ugd2l0aCBgZ2V0c29ja29wdCcgYW5kIGBzZXRzb2Nrb3B0JyBhdCB0aGUgSVB2NiBsZXZlbC4KKyAgIFRoZSBmaXJzdCB3b3JkIGluIHRoZSBjb21tZW50IGF0IHRoZSByaWdodCBpcyB0aGUgZGF0YSB0eXBlIHVzZWQ7CisgICAiYm9vbCIgbWVhbnMgYSBib29sZWFuIHZhbHVlIHN0b3JlZCBpbiBhbiBgaW50Jy4gICovCisjZGVmaW5lIElQVjZfQUREUkZPUk0JCTEKKyNkZWZpbmUgSVBWNl8yMjkyUEtUSU5GTwkyCisjZGVmaW5lIElQVjZfMjI5MkhPUE9QVFMJMworI2RlZmluZSBJUFY2XzIyOTJEU1RPUFRTCTQKKyNkZWZpbmUgSVBWNl8yMjkyUlRIRFIJCTUKKyNkZWZpbmUgSVBWNl8yMjkyUEtUT1BUSU9OUwk2CisjZGVmaW5lIElQVjZfQ0hFQ0tTVU0JCTcKKyNkZWZpbmUgSVBWNl8yMjkySE9QTElNSVQJOAorCisjZGVmaW5lIFNDTV9TUkNSVAkJSVBWNl9SWFNSQ1JUCisKKyNkZWZpbmUgSVBWNl9ORVhUSE9QCQk5CisjZGVmaW5lIElQVjZfQVVUSEhEUgkJMTAKKyNkZWZpbmUgSVBWNl9VTklDQVNUX0hPUFMJMTYKKyNkZWZpbmUgSVBWNl9NVUxUSUNBU1RfSUYJMTcKKyNkZWZpbmUgSVBWNl9NVUxUSUNBU1RfSE9QUwkxOAorI2RlZmluZSBJUFY2X01VTFRJQ0FTVF9MT09QCTE5CisjZGVmaW5lIElQVjZfSk9JTl9HUk9VUAkJMjAKKyNkZWZpbmUgSVBWNl9MRUFWRV9HUk9VUAkyMQorI2RlZmluZSBJUFY2X1JPVVRFUl9BTEVSVAkyMgorI2RlZmluZSBJUFY2X01UVV9ESVNDT1ZFUgkyMworI2RlZmluZSBJUFY2X01UVQkJMjQKKyNkZWZpbmUgSVBWNl9SRUNWRVJSCQkyNQorI2RlZmluZSBJUFY2X1Y2T05MWQkJMjYKKyNkZWZpbmUgSVBWNl9KT0lOX0FOWUNBU1QJMjcKKyNkZWZpbmUgSVBWNl9MRUFWRV9BTllDQVNUCTI4CisjZGVmaW5lIElQVjZfSVBTRUNfUE9MSUNZCTM0CisjZGVmaW5lIElQVjZfWEZSTV9QT0xJQ1kJMzUKKworI2RlZmluZSBJUFY2X1JFQ1ZQS1RJTkZPCTQ5CisjZGVmaW5lIElQVjZfUEtUSU5GTwkJNTAKKyNkZWZpbmUgSVBWNl9SRUNWSE9QTElNSVQJNTEKKyNkZWZpbmUgSVBWNl9IT1BMSU1JVAkJNTIKKyNkZWZpbmUgSVBWNl9SRUNWSE9QT1BUUwk1MworI2RlZmluZSBJUFY2X0hPUE9QVFMJCTU0CisjZGVmaW5lIElQVjZfUlRIRFJEU1RPUFRTCTU1CisjZGVmaW5lIElQVjZfUkVDVlJUSERSCQk1NgorI2RlZmluZSBJUFY2X1JUSERSCQk1NworI2RlZmluZSBJUFY2X1JFQ1ZEU1RPUFRTCTU4CisjZGVmaW5lIElQVjZfRFNUT1BUUwkJNTkKKworI2RlZmluZSBJUFY2X1JFQ1ZUQ0xBU1MJCTY2CisjZGVmaW5lIElQVjZfVENMQVNTCQk2NworCisvKiBPYnNvbGV0ZSBzeW5vbnltcyBmb3IgdGhlIGFib3ZlLiAgKi8KKyNkZWZpbmUgSVBWNl9BRERfTUVNQkVSU0hJUAlJUFY2X0pPSU5fR1JPVVAKKyNkZWZpbmUgSVBWNl9EUk9QX01FTUJFUlNISVAJSVBWNl9MRUFWRV9HUk9VUAorI2RlZmluZSBJUFY2X1JYSE9QT1BUUwkJSVBWNl9IT1BPUFRTCisjZGVmaW5lIElQVjZfUlhEU1RPUFRTCQlJUFY2X0RTVE9QVFMKKworLyogSVBWNl9NVFVfRElTQ09WRVIgdmFsdWVzLiAgKi8KKyNkZWZpbmUgSVBWNl9QTVRVRElTQ19ET05UCTAJLyogTmV2ZXIgc2VuZCBERiBmcmFtZXMuICAqLworI2RlZmluZSBJUFY2X1BNVFVESVNDX1dBTlQJMQkvKiBVc2UgcGVyIHJvdXRlIGhpbnRzLiAgKi8KKyNkZWZpbmUgSVBWNl9QTVRVRElTQ19ETwkyCS8qIEFsd2F5cyBERi4gICovCisjZGVmaW5lIElQVjZfUE1UVURJU0NfUFJPQkUJMwkvKiBJZ25vcmUgZHN0IHBtdHUuICAqLworCisvKiBTb2NrZXQgbGV2ZWwgdmFsdWVzIGZvciBJUHY2LiAgKi8KKyNkZWZpbmUgU09MX0lQVjYgICAgICAgIDQxCisjZGVmaW5lIFNPTF9JQ01QVjYgICAgICA1OAorCisvKiBSb3V0aW5nIGhlYWRlciBvcHRpb25zIGZvciBJUHY2LiAgKi8KKyNkZWZpbmUgSVBWNl9SVEhEUl9MT09TRQkwCS8qIEhvcCBkb2Vzbid0IG5lZWQgdG8gYmUgbmVpZ2hib3VyLiAqLworI2RlZmluZSBJUFY2X1JUSERSX1NUUklDVAkxCS8qIEhvcCBtdXN0IGJlIGEgbmVpZ2hib3VyLiAgKi8KKworI2RlZmluZSBJUFY2X1JUSERSX1RZUEVfMAkwCS8qIElQdjYgUm91dGluZyBoZWFkZXIgdHlwZSAwLiAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9pbmYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9pbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjE5Zjc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2luZi5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qIGBJTkZJTklUWScgY29uc3RhbnQgZm9yIElFRUUgNzU0IG1hY2hpbmVzLgorICAgQ29weXJpZ2h0IChDKSAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9NQVRIX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9pbmYuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPG1hdGguaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogSUVFRSBwb3NpdGl2ZSBpbmZpbml0eS4gICovCisKKyNpZiBfX0dOVUNfUFJFUkVRKDMsMykKKyMgZGVmaW5lIElORklOSVRZCShfX2J1aWx0aW5faW5mZigpKQorI2Vsc2UKKyMgZGVmaW5lIElORklOSVRZCUhVR0VfVkFMRgorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvaW5pdHNwaW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9pbml0c3Bpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNmYxNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvaW5pdHNwaW4uaApAQCAtMCwwICsxIEBACisvKiBObyB0aHJlYWQgc3VwcG9ydC4gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9pb2N0bC10eXBlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2lvY3RsLXR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1NmEwNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9pb2N0bC10eXBlcy5oCkBAIC0wLDAgKzEsNzggQEAKKy8qIFN0cnVjdHVyZSB0eXBlcyBmb3IgcHJlLXRlcm1pb3MgdGVybWluYWwgaW9jdGxzLiAgTGludXggdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX0lPQ1RMX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9pb2N0bC10eXBlcy5oPiBkaXJlY3RseTsgaW5jbHVkZSA8c3lzL2lvY3RsLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIEdldCBkZWZpbml0aW9uIG9mIGNvbnN0YW50cyBmb3IgdXNlIHdpdGggYGlvY3RsJy4gICovCisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorCisKK3N0cnVjdCB3aW5zaXplCisgIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgd3Nfcm93OworICAgIHVuc2lnbmVkIHNob3J0IGludCB3c19jb2w7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IHdzX3hwaXhlbDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgd3NfeXBpeGVsOworICB9OworCisjZGVmaW5lIE5DQyA4CitzdHJ1Y3QgdGVybWlvCisgIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgY19pZmxhZzsJCS8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgY19vZmxhZzsJCS8qIG91dHB1dCBtb2RlIGZsYWdzICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IGNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGUgZmxhZ3MgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgY19sZmxhZzsJCS8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGNfbGluZTsJCS8qIGxpbmUgZGlzY2lwbGluZSAqLworICAgIHVuc2lnbmVkIGNoYXIgY19jY1tOQ0NdOwkJLyogY29udHJvbCBjaGFyYWN0ZXJzICovCit9OworCisvKiBtb2RlbSBsaW5lcyAqLworI2RlZmluZSBUSU9DTV9MRQkweDAwMQorI2RlZmluZSBUSU9DTV9EVFIJMHgwMDIKKyNkZWZpbmUgVElPQ01fUlRTCTB4MDA0CisjZGVmaW5lIFRJT0NNX1NUCTB4MDA4CisjZGVmaW5lIFRJT0NNX1NSCTB4MDEwCisjZGVmaW5lIFRJT0NNX0NUUwkweDAyMAorI2RlZmluZSBUSU9DTV9DQVIJMHgwNDAKKyNkZWZpbmUgVElPQ01fUk5HCTB4MDgwCisjZGVmaW5lIFRJT0NNX0RTUgkweDEwMAorI2RlZmluZSBUSU9DTV9DRAlUSU9DTV9DQVIKKyNkZWZpbmUgVElPQ01fUkkJVElPQ01fUk5HCisKKy8qIGlvY3RsIChmZCwgVElPQ1NFUkdFVExTUiwgJnJlc3VsdCkgd2hlcmUgcmVzdWx0IG1heSBiZSBhcyBiZWxvdyAqLworCisvKiBsaW5lIGRpc2NpcGxpbmVzICovCisjZGVmaW5lIE5fVFRZCQkwCisjZGVmaW5lIE5fU0xJUAkJMQorI2RlZmluZSBOX01PVVNFCQkyCisjZGVmaW5lIE5fUFBQCQkzCisjZGVmaW5lIE5fU1RSSVAJCTQKKyNkZWZpbmUgTl9BWDI1CQk1CisjZGVmaW5lIE5fWDI1CQk2CS8qIFguMjUgYXN5bmMgICovCisjZGVmaW5lIE5fNlBBQ0sJCTcKKyNkZWZpbmUgTl9NQVNDCQk4CS8qIE1vYml0ZXggbW9kdWxlICAqLworI2RlZmluZSBOX1IzOTY0CQk5CS8qIFNpbWF0aWMgUjM5NjQgbW9kdWxlICAqLworI2RlZmluZSBOX1BST0ZJQlVTX0ZETAkxMAkvKiBQcm9maWJ1cyAgKi8KKyNkZWZpbmUgTl9JUkRBCQkxMQkvKiBMaW51eCBJUiAgKi8KKyNkZWZpbmUgTl9TTVNCTE9DSwkxMgkvKiBTTVMgYmxvY2sgbW9kZSAgKi8KKyNkZWZpbmUgTl9IRExDCQkxMwkvKiBzeW5jaHJvbm91cyBIRExDICAqLworI2RlZmluZSBOX1NZTkNfUFBQCTE0CS8qIHN5bmNocm9ub3VzIFBQUCAgKi8KKyNkZWZpbmUJTl9IQ0kJCTE1CS8qIEJsdWV0b290aCBIQ0kgVUFSVCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9pb2N0bHMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9pb2N0bHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWJiNGM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2lvY3Rscy5oCkBAIC0wLDAgKzEsMTA5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19JT0NUTF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvaW9jdGxzLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzeXMvaW9jdGwuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogVXNlIHRoZSBkZWZpbml0aW9ucyBmcm9tIHRoZSBrZXJuZWwgaGVhZGVyIGZpbGVzLiAgKi8KKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisKKy8qIFJvdXRpbmcgdGFibGUgY2FsbHMuICAqLworI2RlZmluZSBTSU9DQUREUlQJMHg4OTBCCQkvKiBhZGQgcm91dGluZyB0YWJsZSBlbnRyeQkqLworI2RlZmluZSBTSU9DREVMUlQJMHg4OTBDCQkvKiBkZWxldGUgcm91dGluZyB0YWJsZSBlbnRyeQkqLworI2RlZmluZSBTSU9DUlRNU0cJMHg4OTBECQkvKiBjYWxsIHRvIHJvdXRpbmcgc3lzdGVtCSovCisKKy8qIFNvY2tldCBjb25maWd1cmF0aW9uIGNvbnRyb2xzLiAqLworI2RlZmluZSBTSU9DR0lGTkFNRQkweDg5MTAJCS8qIGdldCBpZmFjZSBuYW1lCQkqLworI2RlZmluZSBTSU9DU0lGTElOSwkweDg5MTEJCS8qIHNldCBpZmFjZSBjaGFubmVsCQkqLworI2RlZmluZSBTSU9DR0lGQ09ORgkweDg5MTIJCS8qIGdldCBpZmFjZSBsaXN0CQkqLworI2RlZmluZSBTSU9DR0lGRkxBR1MJMHg4OTEzCQkvKiBnZXQgZmxhZ3MJCQkqLworI2RlZmluZSBTSU9DU0lGRkxBR1MJMHg4OTE0CQkvKiBzZXQgZmxhZ3MJCQkqLworI2RlZmluZSBTSU9DR0lGQUREUgkweDg5MTUJCS8qIGdldCBQQSBhZGRyZXNzCQkqLworI2RlZmluZSBTSU9DU0lGQUREUgkweDg5MTYJCS8qIHNldCBQQSBhZGRyZXNzCQkqLworI2RlZmluZSBTSU9DR0lGRFNUQUREUgkweDg5MTcJCS8qIGdldCByZW1vdGUgUEEgYWRkcmVzcwkqLworI2RlZmluZSBTSU9DU0lGRFNUQUREUgkweDg5MTgJCS8qIHNldCByZW1vdGUgUEEgYWRkcmVzcwkqLworI2RlZmluZSBTSU9DR0lGQlJEQUREUgkweDg5MTkJCS8qIGdldCBicm9hZGNhc3QgUEEgYWRkcmVzcwkqLworI2RlZmluZSBTSU9DU0lGQlJEQUREUgkweDg5MWEJCS8qIHNldCBicm9hZGNhc3QgUEEgYWRkcmVzcwkqLworI2RlZmluZSBTSU9DR0lGTkVUTUFTSwkweDg5MWIJCS8qIGdldCBuZXR3b3JrIFBBIG1hc2sJCSovCisjZGVmaW5lIFNJT0NTSUZORVRNQVNLCTB4ODkxYwkJLyogc2V0IG5ldHdvcmsgUEEgbWFzawkJKi8KKyNkZWZpbmUgU0lPQ0dJRk1FVFJJQwkweDg5MWQJCS8qIGdldCBtZXRyaWMJCQkqLworI2RlZmluZSBTSU9DU0lGTUVUUklDCTB4ODkxZQkJLyogc2V0IG1ldHJpYwkJCSovCisjZGVmaW5lIFNJT0NHSUZNRU0JMHg4OTFmCQkvKiBnZXQgbWVtb3J5IGFkZHJlc3MgKEJTRCkJKi8KKyNkZWZpbmUgU0lPQ1NJRk1FTQkweDg5MjAJCS8qIHNldCBtZW1vcnkgYWRkcmVzcyAoQlNEKQkqLworI2RlZmluZSBTSU9DR0lGTVRVCTB4ODkyMQkJLyogZ2V0IE1UVSBzaXplCQkJKi8KKyNkZWZpbmUgU0lPQ1NJRk1UVQkweDg5MjIJCS8qIHNldCBNVFUgc2l6ZQkJCSovCisjZGVmaW5lIFNJT0NTSUZOQU1FCTB4ODkyMwkJLyogc2V0IGludGVyZmFjZSBuYW1lCQkqLworI2RlZmluZQlTSU9DU0lGSFdBRERSCTB4ODkyNAkJLyogc2V0IGhhcmR3YXJlIGFkZHJlc3MgCSovCisjZGVmaW5lIFNJT0NHSUZFTkNBUAkweDg5MjUJCS8qIGdldC9zZXQgZW5jYXBzdWxhdGlvbnMgICAgICAgKi8KKyNkZWZpbmUgU0lPQ1NJRkVOQ0FQCTB4ODkyNgorI2RlZmluZSBTSU9DR0lGSFdBRERSCTB4ODkyNwkJLyogR2V0IGhhcmR3YXJlIGFkZHJlc3MJCSovCisjZGVmaW5lIFNJT0NHSUZTTEFWRQkweDg5MjkJCS8qIERyaXZlciBzbGF2aW5nIHN1cHBvcnQJKi8KKyNkZWZpbmUgU0lPQ1NJRlNMQVZFCTB4ODkzMAorI2RlZmluZSBTSU9DQURETVVMVEkJMHg4OTMxCQkvKiBNdWx0aWNhc3QgYWRkcmVzcyBsaXN0cwkqLworI2RlZmluZSBTSU9DREVMTVVMVEkJMHg4OTMyCisjZGVmaW5lIFNJT0NHSUZJTkRFWAkweDg5MzMJCS8qIG5hbWUgLT4gaWZfaW5kZXggbWFwcGluZwkqLworI2RlZmluZSBTSU9HSUZJTkRFWAlTSU9DR0lGSU5ERVgJLyogbWlzcHJpbnQgY29tcGF0aWJpbGl0eSA6LSkJKi8KKyNkZWZpbmUgU0lPQ1NJRlBGTEFHUwkweDg5MzQJCS8qIHNldC9nZXQgZXh0ZW5kZWQgZmxhZ3Mgc2V0CSovCisjZGVmaW5lIFNJT0NHSUZQRkxBR1MJMHg4OTM1CisjZGVmaW5lIFNJT0NESUZBRERSCTB4ODkzNgkJLyogZGVsZXRlIFBBIGFkZHJlc3MJCSovCisjZGVmaW5lCVNJT0NTSUZIV0JST0FEQ0FTVAkweDg5MzcJLyogc2V0IGhhcmR3YXJlIGJyb2FkY2FzdCBhZGRyCSovCisjZGVmaW5lIFNJT0NHSUZDT1VOVAkweDg5MzgJCS8qIGdldCBudW1iZXIgb2YgZGV2aWNlcyAqLworCisjZGVmaW5lIFNJT0NHSUZCUgkweDg5NDAJCS8qIEJyaWRnaW5nIHN1cHBvcnQJCSovCisjZGVmaW5lIFNJT0NTSUZCUgkweDg5NDEJCS8qIFNldCBicmlkZ2luZyBvcHRpb25zIAkqLworCisjZGVmaW5lIFNJT0NHSUZUWFFMRU4JMHg4OTQyCQkvKiBHZXQgdGhlIHR4IHF1ZXVlIGxlbmd0aAkqLworI2RlZmluZSBTSU9DU0lGVFhRTEVOCTB4ODk0MwkJLyogU2V0IHRoZSB0eCBxdWV1ZSBsZW5ndGggCSovCisKKworLyogQVJQIGNhY2hlIGNvbnRyb2wgY2FsbHMuICovCisJCSAgICAvKiAgMHg4OTUwIC0gMHg4OTUyICAqIG9ic29sZXRlIGNhbGxzLCBkb24ndCByZS11c2UgKi8KKyNkZWZpbmUgU0lPQ0RBUlAJMHg4OTUzCQkvKiBkZWxldGUgQVJQIHRhYmxlIGVudHJ5CSovCisjZGVmaW5lIFNJT0NHQVJQCTB4ODk1NAkJLyogZ2V0IEFSUCB0YWJsZSBlbnRyeQkJKi8KKyNkZWZpbmUgU0lPQ1NBUlAJMHg4OTU1CQkvKiBzZXQgQVJQIHRhYmxlIGVudHJ5CQkqLworCisvKiBSQVJQIGNhY2hlIGNvbnRyb2wgY2FsbHMuICovCisjZGVmaW5lIFNJT0NEUkFSUAkweDg5NjAJCS8qIGRlbGV0ZSBSQVJQIHRhYmxlIGVudHJ5CSovCisjZGVmaW5lIFNJT0NHUkFSUAkweDg5NjEJCS8qIGdldCBSQVJQIHRhYmxlIGVudHJ5CQkqLworI2RlZmluZSBTSU9DU1JBUlAJMHg4OTYyCQkvKiBzZXQgUkFSUCB0YWJsZSBlbnRyeQkJKi8KKworLyogRHJpdmVyIGNvbmZpZ3VyYXRpb24gY2FsbHMgKi8KKworI2RlZmluZSBTSU9DR0lGTUFQCTB4ODk3MAkJLyogR2V0IGRldmljZSBwYXJhbWV0ZXJzCSovCisjZGVmaW5lIFNJT0NTSUZNQVAJMHg4OTcxCQkvKiBTZXQgZGV2aWNlIHBhcmFtZXRlcnMJKi8KKworLyogRExDSSBjb25maWd1cmF0aW9uIGNhbGxzICovCisKKyNkZWZpbmUgU0lPQ0FERERMQ0kJMHg4OTgwCQkvKiBDcmVhdGUgbmV3IERMQ0kgZGV2aWNlCSovCisjZGVmaW5lIFNJT0NERUxETENJCTB4ODk4MQkJLyogRGVsZXRlIERMQ0kgZGV2aWNlCQkqLworCisvKiBEZXZpY2UgcHJpdmF0ZSBpb2N0bCBjYWxscy4gICovCisKKy8qIFRoZXNlIDE2IGlvY3RscyBhcmUgYXZhaWxhYmxlIHRvIGRldmljZXMgdmlhIHRoZSBkb19pb2N0bCgpIGRldmljZQorICAgdmVjdG9yLiAgRWFjaCBkZXZpY2Ugc2hvdWxkIGluY2x1ZGUgdGhpcyBmaWxlIGFuZCByZWRlZmluZSB0aGVzZQorICAgbmFtZXMgYXMgdGhlaXIgb3duLiBCZWNhdXNlIHRoZXNlIGFyZSBkZXZpY2UgZGVwZW5kZW50IGl0IGlzIGEgZ29vZAorICAgaWRlYSBfTk9UXyB0byBpc3N1ZSB0aGVtIHRvIHJhbmRvbSBvYmplY3RzIGFuZCBob3BlLiAgKi8KKworI2RlZmluZSBTSU9DREVWUFJJVkFURSAJCTB4ODlGMAkvKiB0byA4OUZGICovCisKKy8qCisgKglUaGVzZSAxNiBpb2N0bCBjYWxscyBhcmUgcHJvdG9jb2wgcHJpdmF0ZQorICovCisKKyNkZWZpbmUgU0lPQ1BST1RPUFJJVkFURSAweDg5RTAgLyogdG8gODlFRiAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2lwYy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2lwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYTA0M2YKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvaXBjLmgKQEAgLTAsMCArMSw1NiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19JUENfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2lwYy5oPiBkaXJlY3RseTsgaW5jbHVkZSA8c3lzL2lwYy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisvKiBNb2RlIGJpdHMgZm9yIGBtc2dnZXQnLCBgc2VtZ2V0JywgYW5kIGBzaG1nZXQnLiAgKi8KKyNkZWZpbmUgSVBDX0NSRUFUCTAxMDAwCQkvKiBDcmVhdGUga2V5IGlmIGtleSBkb2VzIG5vdCBleGlzdC4gKi8KKyNkZWZpbmUgSVBDX0VYQ0wJMDIwMDAJCS8qIEZhaWwgaWYga2V5IGV4aXN0cy4gICovCisjZGVmaW5lIElQQ19OT1dBSVQJMDQwMDAJCS8qIFJldHVybiBlcnJvciBvbiB3YWl0LiAgKi8KKworLyogQ29udHJvbCBjb21tYW5kcyBmb3IgYG1zZ2N0bCcsIGBzZW1jdGwnLCBhbmQgYHNobWN0bCcuICAqLworI2RlZmluZSBJUENfUk1JRAkwCQkvKiBSZW1vdmUgaWRlbnRpZmllci4gICovCisjZGVmaW5lIElQQ19TRVQJCTEJCS8qIFNldCBgaXBjX3Blcm0nIG9wdGlvbnMuICAqLworI2RlZmluZSBJUENfU1RBVAkyCQkvKiBHZXQgYGlwY19wZXJtJyBvcHRpb25zLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIElQQ19JTkZPCTMJCS8qIFNlZSBpcGNzLiAgKi8KKyNlbmRpZgorCisvKiBTcGVjaWFsIGtleSB2YWx1ZXMuICAqLworI2RlZmluZSBJUENfUFJJVkFURQkoKF9fa2V5X3QpIDApCS8qIFByaXZhdGUga2V5LiAgKi8KKworCisvKiBEYXRhIHN0cnVjdHVyZSB1c2VkIHRvIHBhc3MgcGVybWlzc2lvbiBpbmZvcm1hdGlvbiB0byBJUEMgb3BlcmF0aW9ucy4gICovCitzdHJ1Y3QgaXBjX3Blcm0KKyAgeworICAgIF9fa2V5X3QgX19rZXk7CQkJLyogS2V5LiAgKi8KKyAgICBfX3VpZF90IHVpZDsJCQkvKiBPd25lcidzIHVzZXIgSUQuICAqLworICAgIF9fZ2lkX3QgZ2lkOwkJCS8qIE93bmVyJ3MgZ3JvdXAgSUQuICAqLworICAgIF9fdWlkX3QgY3VpZDsJCQkvKiBDcmVhdG9yJ3MgdXNlciBJRC4gICovCisgICAgX19naWRfdCBjZ2lkOwkJCS8qIENyZWF0b3IncyBncm91cCBJRC4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IG1vZGU7CQkvKiBSZWFkL3dyaXRlIHBlcm1pc3Npb24uICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3BhZDE7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fc2VxOwkJLyogU2VxdWVuY2UgbnVtYmVyLiAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX19wYWQyOworICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMTsKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDI7CisgIH07CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvaXBjdHlwZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9pcGN0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OGNhMWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvaXBjdHlwZXMuaApAQCAtMCwwICsxLDM3IEBACisvKiBiaXRzL2lwY3R5cGVzLmggLS0gRGVmaW5lIHNvbWUgdHlwZXMgdXNlZCBieSBTeXNWIElQQy9NU0cvU0hNLiAgR2VuZXJpYy4KKyAgIENvcHlyaWdodCAoQykgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqIE5ldmVyIGluY2x1ZGUgPGJpdHMvaXBjdHlwZXMuaD4gZGlyZWN0bHkuCisgKi8KKworI2lmbmRlZiBfQklUU19JUENUWVBFU19ICisjZGVmaW5lIF9CSVRTX0lQQ1RZUEVTX0gJMQorCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisvKiBVc2VkIGluIGBzdHJ1Y3Qgc2htaWRfZHMnLiAgKi8KKyMgaWYgX19XT1JEU0laRSA9PSAzMgordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgX19pcGNfcGlkX3Q7CisjIGVsc2UKK3R5cGVkZWYgaW50IF9faXBjX3BpZF90OworIyBlbmRpZgorCisKKyNlbmRpZiAvKiBiaXRzL2lwY3R5cGVzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9saWJjLWxvY2suaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9saWJjLWxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzhmOTU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2xpYmMtbG9jay5oCkBAIC0wLDAgKzEsNjU5IEBACisvKiBsaWJjLWludGVybmFsIGludGVyZmFjZSBmb3IgbXV0ZXggbG9ja3MuICBOUFRMIHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMywgMjAwNSwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUKKyAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAorICAgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIF9CSVRTX0xJQkNfTE9DS19ICisjZGVmaW5lIF9CSVRTX0xJQkNfTE9DS19IIDEKKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNkZWZpbmUgX19uZWVkX05VTEwKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworCisvKiBGb3J0dW5hdGVseSBMaW51eCBub3cgaGFzIGEgbWVhbiB0byBkbyBsb2NraW5nIHdoaWNoIGlzIHJlYWx0aW1lCisgICBzYWZlIHdpdGhvdXQgdGhlIGFpZCBvZiB0aGUgdGhyZWFkIGxpYnJhcnkuICBXZSBhbHNvIG5lZWQgbm8gZmFuY3kKKyAgIG9wdGlvbnMgbGlrZSBlcnJvciBjaGVja2luZyBtdXRleGVzIGV0Yy4gIFdlIG9ubHkgbmVlZCBzaW1wbGUKKyAgIGxvY2tzLCBtYXliZSByZWN1cnNpdmUuICBUaGlzIGNhbiBiZSBlYXNpbHkgYW5kIGNoZWFwbHkgaW1wbGVtZW50ZWQKKyAgIHVzaW5nIGZ1dGV4ZXMuICBXZSB3aWxsIHVzZSB0aGVtIGV2ZXJ5d2hlcmUgZXhjZXB0IGluIGxkLnNvIHNpbmNlCisgICBsZC5zbyBtaWdodCBiZSB1c2VkIG9uIG9sZCBrZXJuZWxzIHdpdGggYSBkaWZmZXJlbnQgbGliYy5zby4gICovCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8bG93bGV2ZWxsb2NrLmg+CisjIGluY2x1ZGUgPHRscy5oPgorIyBpbmNsdWRlIDxwdGhyZWFkLWZ1bmN0aW9ucy5oPgorIyBpbmNsdWRlIDxlcnJuby5oPiAvKiBGb3IgRUJVU1kuICAqLworIyBpbmNsdWRlIDxnbnUvb3B0aW9uLWdyb3Vwcy5oPiAvKiBGb3IgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MuICAqLworI2VuZGlmCisKKy8qIE11dGV4IHR5cGUuICAqLworI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBfSU9fTVRTQUZFX0lPCisjIGlmIChkZWZpbmVkIE5PVF9JTl9saWJjICYmICFkZWZpbmVkIElTX0lOX2xpYnB0aHJlYWQpIHx8ICFkZWZpbmVkIF9MSUJDCit0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCBfX2xpYmNfbG9ja190OwordHlwZWRlZiBzdHJ1Y3QgeyBwdGhyZWFkX211dGV4X3QgbXV0ZXg7IH0gX19saWJjX2xvY2tfcmVjdXJzaXZlX3Q7CisjIGVsc2UKK3R5cGVkZWYgaW50IF9fbGliY19sb2NrX3Q7Cit0eXBlZGVmIHN0cnVjdCB7IGludCBsb2NrOyBpbnQgY250OyB2b2lkICpvd25lcjsgfSBfX2xpYmNfbG9ja19yZWN1cnNpdmVfdDsKKyMgZW5kaWYKK3R5cGVkZWYgc3RydWN0IHsgcHRocmVhZF9tdXRleF90IG11dGV4OyB9IF9fcnRsZF9sb2NrX3JlY3Vyc2l2ZV90OworIyBpZmRlZiBfX1VTRV9VTklYOTgKK3R5cGVkZWYgcHRocmVhZF9yd2xvY2tfdCBfX2xpYmNfcndsb2NrX3Q7CisjIGVsc2UKK3R5cGVkZWYgc3RydWN0IF9fbGliY19yd2xvY2tfb3BhcXVlX18gX19saWJjX3J3bG9ja190OworIyBlbmRpZgorI2Vsc2UKK3R5cGVkZWYgc3RydWN0IF9fbGliY19sb2NrX29wYXF1ZV9fIF9fbGliY19sb2NrX3Q7Cit0eXBlZGVmIHN0cnVjdCBfX2xpYmNfbG9ja19yZWN1cnNpdmVfb3BhcXVlX18gX19saWJjX2xvY2tfcmVjdXJzaXZlX3Q7Cit0eXBlZGVmIHN0cnVjdCBfX2xpYmNfcndsb2NrX29wYXF1ZV9fIF9fbGliY19yd2xvY2tfdDsKKyNlbmRpZgorCisvKiBUeXBlIGZvciBrZXkgdG8gdGhyZWFkLXNwZWNpZmljIGRhdGEuICAqLwordHlwZWRlZiBwdGhyZWFkX2tleV90IF9fbGliY19rZXlfdDsKKworLyogRGVmaW5lIGEgbG9jayB2YXJpYWJsZSBOQU1FIHdpdGggc3RvcmFnZSBjbGFzcyBDTEFTUy4gIFRoZSBsb2NrIG11c3QgYmUKKyAgIGluaXRpYWxpemVkIHdpdGggX19saWJjX2xvY2tfaW5pdCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQgKG9yIGRlZmluZSBpdAorICAgd2l0aCBfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQsIGJlbG93KS4gIFVzZSBgZXh0ZXJuJyBmb3IgQ0xBU1MgdG8KKyAgIGRlY2xhcmUgYSBsb2NrIGRlZmluZWQgaW4gYW5vdGhlciBtb2R1bGUuICBJbiBwdWJsaWMgc3RydWN0dXJlCisgICBkZWZpbml0aW9ucyB5b3UgbXVzdCB1c2UgYSBwb2ludGVyIHRvIHRoZSBsb2NrIHN0cnVjdHVyZSAoaS5lLiwgTkFNRQorICAgYmVnaW5zIHdpdGggYSBgKicpLCBiZWNhdXNlIGl0cyBzdG9yYWdlIHNpemUgd2lsbCBub3QgYmUga25vd24gb3V0c2lkZQorICAgb2YgbGliYy4gICovCisjZGVmaW5lIF9fbGliY19sb2NrX2RlZmluZShDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fbGliY19sb2NrX3QgTkFNRTsKKyNkZWZpbmUgX19saWJjX3J3bG9ja19kZWZpbmUoQ0xBU1MsTkFNRSkgXAorICBDTEFTUyBfX2xpYmNfcndsb2NrX3QgTkFNRTsKKyNkZWZpbmUgX19saWJjX2xvY2tfZGVmaW5lX3JlY3Vyc2l2ZShDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fbGliY19sb2NrX3JlY3Vyc2l2ZV90IE5BTUU7CisjZGVmaW5lIF9fcnRsZF9sb2NrX2RlZmluZV9yZWN1cnNpdmUoQ0xBU1MsTkFNRSkgXAorICBDTEFTUyBfX3J0bGRfbG9ja19yZWN1cnNpdmVfdCBOQU1FOworCisvKiBEZWZpbmUgYW4gaW5pdGlhbGl6ZWQgbG9jayB2YXJpYWJsZSBOQU1FIHdpdGggc3RvcmFnZSBjbGFzcyBDTEFTUy4KKworICAgRm9yIHRoZSBDIGxpYnJhcnkgd2UgdGFrZSBhIGRlZXBlciBsb29rIGF0IHRoZSBpbml0aWFsaXplci4gIEZvcgorICAgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbGwgZmllbGRzIGFyZSBpbml0aWFsaXplZCB0byB6ZXJvLiAgVGhlcmVmb3JlCisgICB3ZSBkb24ndCBpbml0aWFsaXplIHRoZSB2YXJpYWJsZSB3aGljaCBhbGxvd3MgcHV0dGluZyBpdCBpbnRvIHRoZQorICAgQlNTIHNlY3Rpb24uICAoRXhjZXB0IG9uIFBBLVJJU0MgYW5kIG90aGVyIG9kZCBhcmNoaXRlY3R1cmVzLCB3aGVyZQorICAgaW5pdGlhbGl6ZWQgbG9ja3MgbXVzdCBiZSBzZXQgdG8gb25lIGR1ZSB0byB0aGUgbGFjayBvZiBub3JtYWwKKyAgIGF0b21pYyBvcGVyYXRpb25zLikgKi8KKworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgaWYgTExMX0xPQ0tfSU5JVElBTElaRVIgPT0gMAorIyAgZGVmaW5lIF9fbGliY19sb2NrX2RlZmluZV9pbml0aWFsaXplZChDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fbGliY19sb2NrX3QgTkFNRTsKKyMgZWxzZQorIyAgZGVmaW5lIF9fbGliY19sb2NrX2RlZmluZV9pbml0aWFsaXplZChDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fbGliY19sb2NrX3QgTkFNRSA9IExMTF9MT0NLX0lOSVRJQUxJWkVSOworIyBlbmRpZgorI2Vsc2UKKyMgaWYgX19MVF9TUElOTE9DS19JTklUID09IDAKKyMgIGRlZmluZSBfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoQ0xBU1MsTkFNRSkgXAorICBDTEFTUyBfX2xpYmNfbG9ja190IE5BTUU7CisjIGVsc2UKKyMgIGRlZmluZSBfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoQ0xBU1MsTkFNRSkgXAorICBDTEFTUyBfX2xpYmNfbG9ja190IE5BTUUgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgX19saWJjX3J3bG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoQ0xBU1MsTkFNRSkgXAorICBDTEFTUyBfX2xpYmNfcndsb2NrX3QgTkFNRSA9IFBUSFJFQURfUldMT0NLX0lOSVRJQUxJWkVSOworCisvKiBEZWZpbmUgYW4gaW5pdGlhbGl6ZWQgcmVjdXJzaXZlIGxvY2sgdmFyaWFibGUgTkFNRSB3aXRoIHN0b3JhZ2UKKyAgIGNsYXNzIENMQVNTLiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDICYmICghZGVmaW5lZCBOT1RfSU5fbGliYyB8fCBkZWZpbmVkIElTX0lOX2xpYnB0aHJlYWQpCisjIGlmIExMTF9MT0NLX0lOSVRJQUxJWkVSID09IDAKKyMgIGRlZmluZSBfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWRfcmVjdXJzaXZlKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX2xvY2tfcmVjdXJzaXZlX3QgTkFNRTsKKyMgZWxzZQorIyAgZGVmaW5lIF9fbGliY19sb2NrX2RlZmluZV9pbml0aWFsaXplZF9yZWN1cnNpdmUoQ0xBU1MsTkFNRSkgXAorICBDTEFTUyBfX2xpYmNfbG9ja19yZWN1cnNpdmVfdCBOQU1FID0gX0xJQkNfTE9DS19SRUNVUlNJVkVfSU5JVElBTElaRVI7CisjIGVuZGlmCisjIGRlZmluZSBfTElCQ19MT0NLX1JFQ1VSU0lWRV9JTklUSUFMSVpFUiBcCisgIHsgTExMX0xPQ0tfSU5JVElBTElaRVIsIDAsIE5VTEwgfQorI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX2RlZmluZV9pbml0aWFsaXplZF9yZWN1cnNpdmUoQ0xBU1MsTkFNRSkgXAorICBDTEFTUyBfX2xpYmNfbG9ja19yZWN1cnNpdmVfdCBOQU1FID0gX0xJQkNfTE9DS19SRUNVUlNJVkVfSU5JVElBTElaRVI7CisjIGRlZmluZSBfTElCQ19MT0NLX1JFQ1VSU0lWRV9JTklUSUFMSVpFUiBcCisgIHtQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUH0KKyNlbmRpZgorCisjZGVmaW5lIF9fcnRsZF9sb2NrX2RlZmluZV9pbml0aWFsaXplZF9yZWN1cnNpdmUoQ0xBU1MsTkFNRSkgXAorICBDTEFTUyBfX3J0bGRfbG9ja19yZWN1cnNpdmVfdCBOQU1FID0gX1JUTERfTE9DS19SRUNVUlNJVkVfSU5JVElBTElaRVI7CisjZGVmaW5lIF9SVExEX0xPQ0tfUkVDVVJTSVZFX0lOSVRJQUxJWkVSIFwKKyAge1BUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QfQorCisjZGVmaW5lIF9fcnRsZF9sb2NrX2luaXRpYWxpemUoTkFNRSkgXAorICAodm9pZCkgKChOQU1FKSA9IChfX3J0bGRfbG9ja19yZWN1cnNpdmVfdCkgX1JUTERfTE9DS19SRUNVUlNJVkVfSU5JVElBTElaRVIpCisKKy8qIElmIHdlIGNoZWNrIGZvciBhIHdlYWtseSByZWZlcmVuY2VkIHN5bWJvbCBhbmQgdGhlbiBwZXJmb3JtIGEKKyAgIG5vcm1hbCBqdW1wIHRvIGl0IHRlIGNvZGUgZ2VuZXJhdGVkIGZvciBzb21lIHBsYXRmb3JtcyBpbiBjYXNlIG9mCisgICBQSUMgaXMgdW5uZWNlc3NhcmlseSBzbG93LiAgV2hhdCB3b3VsZCBoYXBwZW4gaXMgdGhhdCB0aGUgZnVuY3Rpb24KKyAgIGlzIGZpcnN0IHJlZmVyZW5jZWQgYXMgZGF0YSBhbmQgdGhlbiBpdCBpcyBjYWxsZWQgaW5kaXJlY3RseQorICAgdGhyb3VnaCB0aGUgUExULiAgV2UgY2FuIG1ha2UgdGhpcyBhIGRpcmVjdCBqdW1wLiAgKi8KKyNpZmRlZiBfX1BJQ19fCisjIGRlZmluZSBfX2xpYmNfbWF5YmVfY2FsbChGVU5DLCBBUkdTLCBFTFNFKSBcCisgIChfX2V4dGVuc2lvbl9fICh7IF9fdHlwZW9mIChGVU5DKSAqX2ZuID0gKEZVTkMpOyBcCisgICAgICAgICAgICAgICAgICAgIF9mbiAhPSBOVUxMID8gKCpfZm4pIEFSR1MgOiBFTFNFOyB9KSkKKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfbWF5YmVfY2FsbChGVU5DLCBBUkdTLCBFTFNFKSBcCisgIChGVU5DICE9IE5VTEwgPyBGVU5DIEFSR1MgOiBFTFNFKQorI2VuZGlmCisKKy8qIENhbGwgdGhyZWFkIGZ1bmN0aW9ucyB0aHJvdWdoIHRoZSBmdW5jdGlvbiBwb2ludGVyIHRhYmxlLiAgKi8KKyNpZiBkZWZpbmVkIFNIQVJFRCAmJiAhZGVmaW5lZCBOT1RfSU5fbGliYworIyBkZWZpbmUgUFRGQVZBSUwoTkFNRSkgX19saWJjX3B0aHJlYWRfZnVuY3Rpb25zX2luaXQKKyMgZGVmaW5lIF9fbGliY19wdGZfY2FsbChGVU5DLCBBUkdTLCBFTFNFKSBcCisgIChfX2xpYmNfcHRocmVhZF9mdW5jdGlvbnNfaW5pdCA/IFBUSEZDVF9DQUxMIChwdHJfIyNGVU5DLCBBUkdTKSA6IEVMU0UpCisjIGRlZmluZSBfX2xpYmNfcHRmX2NhbGxfYWx3YXlzKEZVTkMsIEFSR1MpIFwKKyAgUFRIRkNUX0NBTEwgKHB0cl8jI0ZVTkMsIEFSR1MpCisjZWxzZQorIyBkZWZpbmUgUFRGQVZBSUwoTkFNRSkgKE5BTUUgIT0gTlVMTCkKKyMgZGVmaW5lIF9fbGliY19wdGZfY2FsbChGVU5DLCBBUkdTLCBFTFNFKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChGVU5DLCBBUkdTLCBFTFNFKQorIyBkZWZpbmUgX19saWJjX3B0Zl9jYWxsX2Fsd2F5cyhGVU5DLCBBUkdTKSBcCisgIEZVTkMgQVJHUworI2VuZGlmCisKKworLyogSW5pdGlhbGl6ZSB0aGUgbmFtZWQgbG9jayB2YXJpYWJsZSwgbGVhdmluZyBpdCBpbiBhIGNvbnNpc3RlbnQsIHVubG9ja2VkCisgICBzdGF0ZS4gICovCisjaWYgZGVmaW5lZCBfTElCQyAmJiAoIWRlZmluZWQgTk9UX0lOX2xpYmMgfHwgZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKQorIyBkZWZpbmUgX19saWJjX2xvY2tfaW5pdChOQU1FKSAoKE5BTUUpID0gTExMX0xPQ0tfSU5JVElBTElaRVIsIDApCisjZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfaW5pdChOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfbXV0ZXhfaW5pdCwgKCYoTkFNRSksIE5VTEwpLCAwKQorI2VuZGlmCisjaWYgZGVmaW5lZCBTSEFSRUQgJiYgIWRlZmluZWQgTk9UX0lOX2xpYmMKKy8qICgoTkFNRSkgPSAoX19saWJjX3J3bG9ja190KSBQVEhSRUFEX1JXTE9DS19JTklUSUFMSVpFUiwgMCkgaXMKKyAgIGluZWZmaWNpZW50LiAgKi8KKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfaW5pdChOQU1FKSBcCisgIChfX2J1aWx0aW5fbWVtc2V0ICgmKE5BTUUpLCAnXDAnLCBzaXplb2YgKE5BTUUpKSwgMCkKKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfcndsb2NrX2luaXQoTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX3J3bG9ja19pbml0LCAoJihOQU1FKSwgTlVMTCksIDApCisjZW5kaWYKKworLyogU2FtZSBhcyBsYXN0IGJ1dCB0aGlzIHRpbWUgd2UgaW5pdGlhbGl6ZSBhIHJlY3Vyc2l2ZSBtdXRleC4gICovCisjaWYgZGVmaW5lZCBfTElCQyAmJiAoIWRlZmluZWQgTk9UX0lOX2xpYmMgfHwgZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKQorIyBkZWZpbmUgX19saWJjX2xvY2tfaW5pdF9yZWN1cnNpdmUoTkFNRSkgXAorICAoKE5BTUUpID0gKF9fbGliY19sb2NrX3JlY3Vyc2l2ZV90KSBfTElCQ19MT0NLX1JFQ1VSU0lWRV9JTklUSUFMSVpFUiwgMCkKKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja19pbml0X3JlY3Vyc2l2ZShOQU1FKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgaWYgKF9fcHRocmVhZF9tdXRleF9pbml0ICE9IE5VTEwpCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorCXB0aHJlYWRfbXV0ZXhhdHRyX3QgX19hdHRyOwkJCQkJICAgICAgXAorCV9fcHRocmVhZF9tdXRleGF0dHJfaW5pdCAoJl9fYXR0cik7CQkJCSAgICAgIFwKKwlfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUgKCZfX2F0dHIsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QKTsgICAgXAorCV9fcHRocmVhZF9tdXRleF9pbml0ICgmKE5BTUUpLm11dGV4LCAmX19hdHRyKTsJCQkgICAgICBcCisJX19wdGhyZWFkX211dGV4YXR0cl9kZXN0cm95ICgmX19hdHRyKTsJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIF9fcnRsZF9sb2NrX2luaXRfcmVjdXJzaXZlKE5BTUUpIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBpZiAoX19wdGhyZWFkX211dGV4X2luaXQgIT0gTlVMTCkJCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisJcHRocmVhZF9tdXRleGF0dHJfdCBfX2F0dHI7CQkJCQkgICAgICBcCisJX19wdGhyZWFkX211dGV4YXR0cl9pbml0ICgmX19hdHRyKTsJCQkJICAgICAgXAorCV9fcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSAoJl9fYXR0ciwgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlApOyAgICBcCisJX19wdGhyZWFkX211dGV4X2luaXQgKCYoTkFNRSkubXV0ZXgsICZfX2F0dHIpOwkJCSAgICAgIFwKKwlfX3B0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kgKCZfX2F0dHIpOwkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorCisvKiBGaW5hbGl6ZSB0aGUgbmFtZWQgbG9jayB2YXJpYWJsZSwgd2hpY2ggbXVzdCBiZSBsb2NrZWQuICBJdCBjYW5ub3QgYmUKKyAgIHVzZWQgYWdhaW4gdW50aWwgX19saWJjX2xvY2tfaW5pdCBpcyBjYWxsZWQgYWdhaW4gb24gaXQuICBUaGlzIG11c3QgYmUKKyAgIGNhbGxlZCBvbiBhIGxvY2sgdmFyaWFibGUgYmVmb3JlIHRoZSBjb250YWluaW5nIHN0b3JhZ2UgaXMgcmV1c2VkLiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDICYmICghZGVmaW5lZCBOT1RfSU5fbGliYyB8fCBkZWZpbmVkIElTX0lOX2xpYnB0aHJlYWQpCisjIGRlZmluZSBfX2xpYmNfbG9ja19maW5pKE5BTUUpICgodm9pZCkgMCkKKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja19maW5pKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF9kZXN0cm95LCAoJihOQU1FKSksIDApCisjZW5kaWYKKyNpZiBkZWZpbmVkIFNIQVJFRCAmJiAhZGVmaW5lZCBOT1RfSU5fbGliYworIyBkZWZpbmUgX19saWJjX3J3bG9ja19maW5pKE5BTUUpICgodm9pZCkgMCkKKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfcndsb2NrX2ZpbmkoTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX3J3bG9ja19kZXN0cm95LCAoJihOQU1FKSksIDApCisjZW5kaWYKKworLyogRmluYWxpemUgcmVjdXJzaXZlIG5hbWVkIGxvY2suICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgZGVmaW5lIF9fbGliY19sb2NrX2ZpbmlfcmVjdXJzaXZlKE5BTUUpICgodm9pZCkgMCkKKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja19maW5pX3JlY3Vyc2l2ZShOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSwgKCYoTkFNRSkpLCAwKQorI2VuZGlmCisKKy8qIExvY2sgdGhlIG5hbWVkIGxvY2sgdmFyaWFibGUuICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgaWYgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgIT0gMQorLyogRUdMSUJDOiBEZWNsYXJlIHdyYXBwZXIgZnVuY3Rpb24gZm9yIGEgYmlnIG1hY3JvIGlmIGVpdGhlcgorICAgIV9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TIG9yIHdlIGFyZSB1c2luZyBhIGJhY2sgZG9vciBmcm9tCisgICBzbWFsbC1tYWNyb3MtZm5zLmMgKF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TID09IDIpLiAgKi8KK2V4dGVybiB2b2lkIF9fbGliY19sb2NrX2xvY2tfZm4gKF9fbGliY19sb2NrX3QgKik7CitsaWJjX2hpZGRlbl9wcm90byAoX19saWJjX2xvY2tfbG9ja19mbik7CisjIGVuZGlmIC8qIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICE9IDEgKi8KKyMgaWYgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MKKyMgZGVmaW5lIF9fbGliY19sb2NrX2xvY2soTkFNRSkgXAorICAoeyBsbGxfbG9jayAoTkFNRSwgTExMX1BSSVZBVEUpOyAwOyB9KQorIyBlbHNlCisjICBkZWZpbmUgX19saWJjX2xvY2tfbG9jayhOQU1FKQkJXAorICBfX2xpYmNfbG9ja19sb2NrX2ZuICgmKE5BTUUpKQorIyBlbmRpZiAvKiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAqLworI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX2xvY2soTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX211dGV4X2xvY2ssICgmKE5BTUUpKSwgMCkKKyNlbmRpZgorI2RlZmluZSBfX2xpYmNfcndsb2NrX3JkbG9jayhOQU1FKSBcCisgIF9fbGliY19wdGZfY2FsbCAoX19wdGhyZWFkX3J3bG9ja19yZGxvY2ssICgmKE5BTUUpKSwgMCkKKyNkZWZpbmUgX19saWJjX3J3bG9ja193cmxvY2soTkFNRSkgXAorICBfX2xpYmNfcHRmX2NhbGwgKF9fcHRocmVhZF9yd2xvY2tfd3Jsb2NrLCAoJihOQU1FKSksIDApCisKKy8qIExvY2sgdGhlIHJlY3Vyc2l2ZSBuYW1lZCBsb2NrIHZhcmlhYmxlLiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDICYmICghZGVmaW5lZCBOT1RfSU5fbGliYyB8fCBkZWZpbmVkIElTX0lOX2xpYnB0aHJlYWQpCisjIGlmIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICE9IDEKKy8qIEVHTElCQzogRGVjbGFyZSB3cmFwcGVyIGZ1bmN0aW9uIGZvciBhIGJpZyBtYWNybyBpZiBlaXRoZXIKKyAgICFfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyBvciB3ZSBhcmUgdXNpbmcgYSBiYWNrIGRvb3IgZnJvbQorICAgc21hbGwtbWFjcm9zLWZucy5jIChfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyA9PSAyKS4gICovCitleHRlcm4gdm9pZCBfX2xpYmNfbG9ja19sb2NrX3JlY3Vyc2l2ZV9mbiAoX19saWJjX2xvY2tfcmVjdXJzaXZlX3QgKik7CitsaWJjX2hpZGRlbl9wcm90byAoX19saWJjX2xvY2tfbG9ja19yZWN1cnNpdmVfZm4pOworIyBlbmRpZiAvKiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAhPSAxICovCisjIGlmIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TCisjIGRlZmluZSBfX2xpYmNfbG9ja19sb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgdm9pZCAqc2VsZiA9IFRIUkVBRF9TRUxGOwkJCQkJCSAgICAgIFwKKyAgICBpZiAoKE5BTUUpLm93bmVyICE9IHNlbGYpCQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKwlsbGxfbG9jayAoKE5BTUUpLmxvY2ssIExMTF9QUklWQVRFKTsJCQkJICAgICAgXAorCShOQU1FKS5vd25lciA9IHNlbGY7CQkJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgICArKyhOQU1FKS5jbnQ7CQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyMgZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfbG9ja19yZWN1cnNpdmUoTkFNRSkJCQkJXAorICBfX2xpYmNfbG9ja19sb2NrX3JlY3Vyc2l2ZV9mbiAoJihOQU1FKSkKKyMgZW5kaWYgLyogX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgKi8KKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja19sb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfbXV0ZXhfbG9jaywgKCYoTkFNRSkubXV0ZXgpLCAwKQorI2VuZGlmCisKKy8qIFRyeSB0byBsb2NrIHRoZSBuYW1lZCBsb2NrIHZhcmlhYmxlLiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDICYmICghZGVmaW5lZCBOT1RfSU5fbGliYyB8fCBkZWZpbmVkIElTX0lOX2xpYnB0aHJlYWQpCisjIGlmIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICE9IDEKKy8qIEVHTElCQzogRGVjbGFyZSB3cmFwcGVyIGZ1bmN0aW9uIGZvciBhIGJpZyBtYWNybyBpZiBlaXRoZXIKKyAgICFfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyBvciB3ZSBhcmUgdXNpbmcgYSBiYWNrIGRvb3IgZnJvbQorICAgc21hbGwtbWFjcm9zLWZucy5jIChfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyA9PSAyKS4gICovCitleHRlcm4gaW50IF9fbGliY19sb2NrX3RyeWxvY2tfZm4gKF9fbGliY19sb2NrX3QgKik7CitsaWJjX2hpZGRlbl9wcm90byAoX19saWJjX2xvY2tfdHJ5bG9ja19mbik7CisjIGVuZGlmIC8qIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICE9IDEgKi8KKyMgaWYgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MKKyMgZGVmaW5lIF9fbGliY19sb2NrX3RyeWxvY2soTkFNRSkgXAorICBsbGxfdHJ5bG9jayAoTkFNRSkKKyMgZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfdHJ5bG9jayhOQU1FKSBcCisgIF9fbGliY19sb2NrX3RyeWxvY2tfZm4gKCYoTkFNRSkpCisjIGVuZGlmIC8qIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICovCisjZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfdHJ5bG9jayhOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jaywgKCYoTkFNRSkpLCAwKQorI2VuZGlmCisjZGVmaW5lIF9fbGliY19yd2xvY2tfdHJ5cmRsb2NrKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrLCAoJihOQU1FKSksIDApCisjZGVmaW5lIF9fbGliY19yd2xvY2tfdHJ5d3Jsb2NrKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrLCAoJihOQU1FKSksIDApCisKKy8qIFRyeSB0byBsb2NrIHRoZSByZWN1cnNpdmUgbmFtZWQgbG9jayB2YXJpYWJsZS4gICovCisjaWYgZGVmaW5lZCBfTElCQyAmJiAoIWRlZmluZWQgTk9UX0lOX2xpYmMgfHwgZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKQorIyBpZiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAhPSAxCisvKiBFR0xJQkM6IERlY2xhcmUgd3JhcHBlciBmdW5jdGlvbiBmb3IgYSBiaWcgbWFjcm8gaWYgZWl0aGVyCisgICAhX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1Mgb3Igd2UgYXJlIHVzaW5nIGEgYmFjayBkb29yIGZyb20KKyAgIHNtYWxsLW1hY3Jvcy1mbnMuYyAoX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgPT0gMikuICAqLworZXh0ZXJuIGludCBfX2xpYmNfbG9ja190cnlsb2NrX3JlY3Vyc2l2ZV9mbiAoX19saWJjX2xvY2tfcmVjdXJzaXZlX3QgKik7CitsaWJjX2hpZGRlbl9wcm90byAoX19saWJjX2xvY2tfdHJ5bG9ja19yZWN1cnNpdmVfZm4pOworIyBlbmRpZiAvKiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAhPSAxICovCisjIGlmIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TCisjIGRlZmluZSBfX2xpYmNfbG9ja190cnlsb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgICh7CQkJCQkJCQkJICAgICAgXAorICAgIGludCByZXN1bHQgPSAwOwkJCQkJCQkgICAgICBcCisgICAgdm9pZCAqc2VsZiA9IFRIUkVBRF9TRUxGOwkJCQkJCSAgICAgIFwKKyAgICBpZiAoKE5BTUUpLm93bmVyICE9IHNlbGYpCQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKwlpZiAobGxsX3RyeWxvY2sgKChOQU1FKS5sb2NrKSA9PSAwKQkJCQkgICAgICBcCisJICB7CQkJCQkJCQkgICAgICBcCisJICAgIChOQU1FKS5vd25lciA9IHNlbGY7CQkJCQkgICAgICBcCisJICAgIChOQU1FKS5jbnQgPSAxOwkJCQkJCSAgICAgIFwKKwkgIH0JCQkJCQkJCSAgICAgIFwKKwllbHNlCQkJCQkJCQkgICAgICBcCisJICByZXN1bHQgPSBFQlVTWTsJCQkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKKyAgICAgICsrKE5BTUUpLmNudDsJCQkJCQkJICAgICAgXAorICAgIHJlc3VsdDsJCQkJCQkJCSAgICAgIFwKKyAgfSkKKyMgZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfdHJ5bG9ja19yZWN1cnNpdmUoTkFNRSkgXAorICBfX2xpYmNfbG9ja190cnlsb2NrX3JlY3Vyc2l2ZV9mbiAoJihOQU1FKSkKKyMgZW5kaWYgLyogX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgKi8KKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja190cnlsb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jaywgKCYoTkFNRSkpLCAwKQorI2VuZGlmCisKKyNkZWZpbmUgX19ydGxkX2xvY2tfdHJ5bG9ja19yZWN1cnNpdmUoTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX211dGV4X3RyeWxvY2ssICgmKE5BTUUpLm11dGV4KSwgMCkKKworLyogVW5sb2NrIHRoZSBuYW1lZCBsb2NrIHZhcmlhYmxlLiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDICYmICghZGVmaW5lZCBOT1RfSU5fbGliYyB8fCBkZWZpbmVkIElTX0lOX2xpYnB0aHJlYWQpCisjIGlmIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICE9IDEKKy8qIEVHTElCQzogRGVjbGFyZSB3cmFwcGVyIGZ1bmN0aW9uIGZvciBhIGJpZyBtYWNybyBpZiBlaXRoZXIKKyAgICFfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUywgb3Igd2UgYXJlIHVzaW5nIGEgYmFjayBkb29yIGZyb20KKyAgIHNtYWxsLW1hY3Jvcy1mbnMuYyAoX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgPT0gMikuICAqLworZXh0ZXJuIHZvaWQgX19saWJjX2xvY2tfdW5sb2NrX2ZuIChfX2xpYmNfbG9ja190ICopOworbGliY19oaWRkZW5fcHJvdG8gKF9fbGliY19sb2NrX3VubG9ja19mbik7CisjIGVuZGlmIC8qIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICE9IDEgKi8KKyMgaWYgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MKKyMgZGVmaW5lIF9fbGliY19sb2NrX3VubG9jayhOQU1FKSBcCisgIGxsbF91bmxvY2sgKE5BTUUsIExMTF9QUklWQVRFKQorIyBlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja191bmxvY2soTkFNRSkgXAorICBfX2xpYmNfbG9ja191bmxvY2tfZm4gKCYoTkFNRSkpCisjIGVuZGlmIC8qIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICovCisjZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfdW5sb2NrKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF91bmxvY2ssICgmKE5BTUUpKSwgMCkKKyNlbmRpZgorI2RlZmluZSBfX2xpYmNfcndsb2NrX3VubG9jayhOQU1FKSBcCisgIF9fbGliY19wdGZfY2FsbCAoX19wdGhyZWFkX3J3bG9ja191bmxvY2ssICgmKE5BTUUpKSwgMCkKKworLyogVW5sb2NrIHRoZSByZWN1cnNpdmUgbmFtZWQgbG9jayB2YXJpYWJsZS4gICovCisjaWYgZGVmaW5lZCBfTElCQyAmJiAoIWRlZmluZWQgTk9UX0lOX2xpYmMgfHwgZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKQorIyBpZiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAhPSAxCisvKiBFR0xJQkM6IERlY2xhcmUgd3JhcHBlciBmdW5jdGlvbiBmb3IgYSBiaWcgbWFjcm8gaWYgZWl0aGVyCisgICAhX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MsIG9yIHdlIGFyZSB1c2luZyBhIGJhY2sgZG9vciBmcm9tCisgICBzbWFsbC1tYWNyb3MtZm5zLmMgKF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TID09IDIpLiAgKi8KK2V4dGVybiB2b2lkIF9fbGliY19sb2NrX3VubG9ja19yZWN1cnNpdmVfZm4gKF9fbGliY19sb2NrX3JlY3Vyc2l2ZV90ICopOworbGliY19oaWRkZW5fcHJvdG8gKF9fbGliY19sb2NrX3VubG9ja19yZWN1cnNpdmVfZm4pOworIyBlbmRpZiAvKiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAhPSAxICovCisjIGlmIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TCisvKiBXZSBkbyBubyBlcnJvciBjaGVja2luZyBoZXJlLiAgKi8KKyMgZGVmaW5lIF9fbGliY19sb2NrX3VubG9ja19yZWN1cnNpdmUoTkFNRSkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIGlmICgtLShOQU1FKS5jbnQgPT0gMCkJCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorCShOQU1FKS5vd25lciA9IE5VTEw7CQkJCQkJICAgICAgXAorCWxsbF91bmxvY2sgKChOQU1FKS5sb2NrLCBMTExfUFJJVkFURSk7CQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisjIGVsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX3VubG9ja19yZWN1cnNpdmUoTkFNRSkgXAorICBfX2xpYmNfbG9ja191bmxvY2tfcmVjdXJzaXZlX2ZuICgmKE5BTUUpKQorIyBlbmRpZiAvKiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAqLworI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX3VubG9ja19yZWN1cnNpdmUoTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX211dGV4X3VubG9jaywgKCYoTkFNRSkpLCAwKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9MSUJDICYmIGRlZmluZWQgU0hBUkVECisjIGRlZmluZSBfX3J0bGRfbG9ja19kZWZhdWx0X2xvY2tfcmVjdXJzaXZlKGxvY2spIFwKKyAgKysoKHB0aHJlYWRfbXV0ZXhfdCAqKShsb2NrKSktPl9fZGF0YS5fX2NvdW50OworCisjIGRlZmluZSBfX3J0bGRfbG9ja19kZWZhdWx0X3VubG9ja19yZWN1cnNpdmUobG9jaykgXAorICAtLSgocHRocmVhZF9tdXRleF90ICopKGxvY2spKS0+X19kYXRhLl9fY291bnQ7CisKKyMgZGVmaW5lIF9fcnRsZF9sb2NrX2xvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgR0woZGxfcnRsZF9sb2NrX3JlY3Vyc2l2ZSkgKCYoTkFNRSkubXV0ZXgpCisKKyMgZGVmaW5lIF9fcnRsZF9sb2NrX3VubG9ja19yZWN1cnNpdmUoTkFNRSkgXAorICBHTChkbF9ydGxkX3VubG9ja19yZWN1cnNpdmUpICgmKE5BTUUpLm11dGV4KQorI2Vsc2UKKyMgZGVmaW5lIF9fcnRsZF9sb2NrX2xvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF9sb2NrLCAoJihOQU1FKS5tdXRleCksIDApCisKKyMgZGVmaW5lIF9fcnRsZF9sb2NrX3VubG9ja19yZWN1cnNpdmUoTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX211dGV4X3VubG9jaywgKCYoTkFNRSkubXV0ZXgpLCAwKQorI2VuZGlmCisKKy8qIERlZmluZSBvbmNlIGNvbnRyb2wgdmFyaWFibGUuICAqLworI2lmIFBUSFJFQURfT05DRV9JTklUID09IDAKKy8qIFNwZWNpYWwgY2FzZSBmb3Igc3RhdGljIHZhcmlhYmxlcyB3aGVyZSB3ZSBjYW4gYXZvaWQgdGhlIGluaXRpYWxpemF0aW9uCisgICBpZiBpdCBpcyB6ZXJvLiAgKi8KKyMgZGVmaW5lIF9fbGliY19vbmNlX2RlZmluZShDTEFTUywgTkFNRSkgXAorICBDTEFTUyBwdGhyZWFkX29uY2VfdCBOQU1FCisjZWxzZQorIyBkZWZpbmUgX19saWJjX29uY2VfZGVmaW5lKENMQVNTLCBOQU1FKSBcCisgIENMQVNTIHB0aHJlYWRfb25jZV90IE5BTUUgPSBQVEhSRUFEX09OQ0VfSU5JVAorI2VuZGlmCisKKy8qIENhbGwgaGFuZGxlciBpZmYgdGhlIGZpcnN0IGNhbGwuICAqLworI2RlZmluZSBfX2xpYmNfb25jZShPTkNFX0NPTlRST0wsIElOSVRfRlVOQ1RJT04pIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBpZiAoUFRGQVZBSUwgKF9fcHRocmVhZF9vbmNlKSkJCQkJCSAgICAgIFwKKyAgICAgIF9fbGliY19wdGZfY2FsbF9hbHdheXMgKF9fcHRocmVhZF9vbmNlLCAoJihPTkNFX0NPTlRST0wpLAkJICAgICAgXAorCQkJCQkgICAgICAgSU5JVF9GVU5DVElPTikpOwkJICAgICAgXAorICAgIGVsc2UgaWYgKChPTkNFX0NPTlRST0wpID09IFBUSFJFQURfT05DRV9JTklUKSB7CQkJICAgICAgXAorICAgICAgSU5JVF9GVU5DVElPTiAoKTsJCQkJCQkJICAgICAgXAorICAgICAgKE9OQ0VfQ09OVFJPTCkgfD0gMjsJCQkJCQkgICAgICBcCisgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworCisvKiBOb3RlIHRoYXQgZm9yIEkvTyBjbGVhbnVwIGhhbmRsaW5nIHdlIGFyZSB1c2luZyB0aGUgb2xkLXN0eWxlCisgICBjYW5jZWwgaGFuZGxpbmcuICBJdCBkb2VzIG5vdCBoYXZlIHRvIGJlIGludGVncmF0ZWQgd2l0aCBDKysgc25jZQorICAgbm8gQysrIGNvZGUgaXMgY2FsbGVkIGluIHRoZSBtaWRkbGUuICBUaGUgb2xkLXN0eWxlIGhhbmRsaW5nIGlzCisgICBmYXN0ZXIgYW5kIHRoZSBzdXBwb3J0IGlzIG5vdCBnb2luZyBhd2F5LiAgKi8KK2V4dGVybiB2b2lkIF9wdGhyZWFkX2NsZWFudXBfcHVzaCAoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpyb3V0aW5lKSAodm9pZCAqKSwgdm9pZCAqYXJnKTsKK2V4dGVybiB2b2lkIF9wdGhyZWFkX2NsZWFudXBfcG9wIChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhlY3V0ZSk7CitleHRlcm4gdm9pZCBfcHRocmVhZF9jbGVhbnVwX3B1c2hfZGVmZXIgKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqcm91dGluZSkgKHZvaWQgKiksIHZvaWQgKmFyZyk7CitleHRlcm4gdm9pZCBfcHRocmVhZF9jbGVhbnVwX3BvcF9yZXN0b3JlIChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleGVjdXRlKTsKKworLyogU3RhcnQgY3JpdGljYWwgcmVnaW9uIHdpdGggY2xlYW51cC4gICovCisjZGVmaW5lIF9fbGliY19jbGVhbnVwX3JlZ2lvbl9zdGFydChET0lULCBGQ1QsIEFSRykgXAorICB7IHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciBfYnVmZmVyOwkJCQkgICAgICBcCisgICAgaW50IF9hdmFpbDsJCQkJCQkJCSAgICAgIFwKKyAgICBpZiAoRE9JVCkgewkJCQkJCQkJICAgICAgXAorICAgICAgX2F2YWlsID0gUFRGQVZBSUwgKF9wdGhyZWFkX2NsZWFudXBfcHVzaF9kZWZlcik7CQkJICAgICAgXAorICAgICAgaWYgKF9hdmFpbCkgewkJCQkJCQkgICAgICBcCisJX19saWJjX3B0Zl9jYWxsX2Fsd2F5cyAoX3B0aHJlYWRfY2xlYW51cF9wdXNoX2RlZmVyLCAoJl9idWZmZXIsIEZDVCwgIFwKKwkJCQkJCQkgICAgICBBUkcpKTsJICAgICAgXAorICAgICAgfSBlbHNlIHsJCQkJCQkJCSAgICAgIFwKKwlfYnVmZmVyLl9fcm91dGluZSA9IChGQ1QpOwkJCQkJICAgICAgXAorCV9idWZmZXIuX19hcmcgPSAoQVJHKTsJCQkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICAgIH0gZWxzZSB7CQkJCQkJCQkgICAgICBcCisgICAgICBfYXZhaWwgPSAwOwkJCQkJCQkgICAgICBcCisgICAgfQorCisvKiBFbmQgY3JpdGljYWwgcmVnaW9uIHdpdGggY2xlYW51cC4gICovCisjZGVmaW5lIF9fbGliY19jbGVhbnVwX3JlZ2lvbl9lbmQoRE9JVCkgXAorICAgIGlmIChfYXZhaWwpIHsJCQkJCQkJICAgICAgXAorICAgICAgX19saWJjX3B0Zl9jYWxsX2Fsd2F5cyAoX3B0aHJlYWRfY2xlYW51cF9wb3BfcmVzdG9yZSwgKCZfYnVmZmVyLCBET0lUKSk7XAorICAgIH0gZWxzZSBpZiAoRE9JVCkJCQkJCQkJICAgICAgXAorICAgICAgX2J1ZmZlci5fX3JvdXRpbmUgKF9idWZmZXIuX19hcmcpOwkJCQkgICAgICBcCisgIH0KKworLyogU29tZXRpbWVzIHdlIGhhdmUgdG8gZXhpdCB0aGUgYmxvY2sgaW4gdGhlIG1pZGRsZS4gICovCisjZGVmaW5lIF9fbGliY19jbGVhbnVwX2VuZChET0lUKSBcCisgICAgaWYgKF9hdmFpbCkgewkJCQkJCQkgICAgICBcCisgICAgICBfX2xpYmNfcHRmX2NhbGxfYWx3YXlzIChfcHRocmVhZF9jbGVhbnVwX3BvcF9yZXN0b3JlLCAoJl9idWZmZXIsIERPSVQpKTtcCisgICAgfSBlbHNlIGlmIChET0lUKQkJCQkJCQkgICAgICBcCisgICAgICBfYnVmZmVyLl9fcm91dGluZSAoX2J1ZmZlci5fX2FyZykKKworCisvKiBOb3JtYWwgY2xlYW51cCBoYW5kbGluZywgYmFzZWQgb24gQyBjbGVhbnVwIGF0dHJpYnV0ZS4gICovCitfX2V4dGVybl9pbmxpbmUgdm9pZAorX19saWJjX2NsZWFudXBfcm91dGluZSAoc3RydWN0IF9fcHRocmVhZF9jbGVhbnVwX2ZyYW1lICpmKQoreworICBpZiAoZi0+X19kb19pdCkKKyAgICBmLT5fX2NhbmNlbF9yb3V0aW5lIChmLT5fX2NhbmNlbF9hcmcpOworfQorCisjZGVmaW5lIF9fbGliY19jbGVhbnVwX3B1c2goZmN0LCBhcmcpIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBzdHJ1Y3QgX19wdGhyZWFkX2NsZWFudXBfZnJhbWUgX19jbGZyYW1lCQkJCSAgICAgIFwKKyAgICAgIF9fYXR0cmlidXRlX18gKChfX2NsZWFudXBfXyAoX19saWJjX2NsZWFudXBfcm91dGluZSkpKQkJICAgICAgXAorICAgICAgPSB7IC5fX2NhbmNlbF9yb3V0aW5lID0gKGZjdCksIC5fX2NhbmNlbF9hcmcgPSAoYXJnKSwJCSAgICAgIFwKKyAgICAgICAgICAuX19kb19pdCA9IDEgfTsKKworI2RlZmluZSBfX2xpYmNfY2xlYW51cF9wb3AoZXhlY3V0ZSkgXAorICAgIF9fY2xmcmFtZS5fX2RvX2l0ID0gKGV4ZWN1dGUpOwkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorCisKKy8qIENyZWF0ZSB0aHJlYWQtc3BlY2lmaWMga2V5LiAgKi8KKyNkZWZpbmUgX19saWJjX2tleV9jcmVhdGUoS0VZLCBERVNUUlVDVE9SKSBcCisgIF9fbGliY19wdGZfY2FsbCAoX19wdGhyZWFkX2tleV9jcmVhdGUsIChLRVksIERFU1RSVUNUT1IpLCAxKQorCisvKiBHZXQgdGhyZWFkLXNwZWNpZmljIGRhdGEuICAqLworI2RlZmluZSBfX2xpYmNfZ2V0c3BlY2lmaWMoS0VZKSBcCisgIF9fbGliY19wdGZfY2FsbCAoX19wdGhyZWFkX2dldHNwZWNpZmljLCAoS0VZKSwgTlVMTCkKKworLyogU2V0IHRocmVhZC1zcGVjaWZpYyBkYXRhLiAgKi8KKyNkZWZpbmUgX19saWJjX3NldHNwZWNpZmljKEtFWSwgVkFMVUUpIFwKKyAgX19saWJjX3B0Zl9jYWxsIChfX3B0aHJlYWRfc2V0c3BlY2lmaWMsIChLRVksIFZBTFVFKSwgMCkKKworCisvKiBSZWdpc3RlciBoYW5kbGVycyB0byBleGVjdXRlIGJlZm9yZSBhbmQgYWZ0ZXIgYGZvcmsnLiAgTm90ZSB0aGF0IHRoZQorICAgbGFzdCBwYXJhbWV0ZXIgaXMgTlVMTC4gIFRoZSBoYW5kbGVycyByZWdpc3RlcmVkIGJ5IHRoZSBsaWJjIGFyZQorICAgbmV2ZXIgcmVtb3ZlZCBzbyB0aGlzIGlzIE9LLiAgKi8KKyNkZWZpbmUgX19saWJjX2F0Zm9yayhQUkVQQVJFLCBQQVJFTlQsIENISUxEKSBcCisgIF9fcmVnaXN0ZXJfYXRmb3JrIChQUkVQQVJFLCBQQVJFTlQsIENISUxELCBOVUxMKQorZXh0ZXJuIGludCBfX3JlZ2lzdGVyX2F0Zm9yayAodm9pZCAoKl9fcHJlcGFyZSkgKHZvaWQpLAorCQkJICAgICAgdm9pZCAoKl9fcGFyZW50KSAodm9pZCksCisJCQkgICAgICB2b2lkICgqX19jaGlsZCkgKHZvaWQpLAorCQkJICAgICAgdm9pZCAqX19kc29faGFuZGxlKTsKKworLyogRnVuY3Rpb25zIHRoYXQgYXJlIHVzZWQgYnkgdGhpcyBmaWxlIGFuZCBhcmUgaW50ZXJuYWwgdG8gdGhlIEdOVSBDCisgICBsaWJyYXJ5LiAgKi8KKworZXh0ZXJuIGludCBfX3B0aHJlYWRfbXV0ZXhfaW5pdCAocHRocmVhZF9tdXRleF90ICpfX211dGV4LAorCQkJCSBfX2NvbnN0IHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fbXV0ZXhfYXR0cik7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX211dGV4X2Rlc3Ryb3kgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCk7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX211dGV4X3RyeWxvY2sgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCk7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX211dGV4X2xvY2sgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCk7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX211dGV4X3VubG9jayAocHRocmVhZF9tdXRleF90ICpfX211dGV4KTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX2luaXQgKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fYXR0cik7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX211dGV4YXR0cl9kZXN0cm95IChwdGhyZWFkX211dGV4YXR0cl90ICpfX2F0dHIpOworCitleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSAocHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyLAorCQkJCQlpbnQgX19raW5kKTsKKworI2lmZGVmIF9fVVNFX1VOSVg5OAorZXh0ZXJuIGludCBfX3B0aHJlYWRfcndsb2NrX2luaXQgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrLAorCQkJCSAgX19jb25zdCBwdGhyZWFkX3J3bG9ja2F0dHJfdCAqX19hdHRyKTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfcndsb2NrX2Rlc3Ryb3kgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfcndsb2NrX3JkbG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2spOworCitleHRlcm4gaW50IF9fcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrIChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jayk7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX3J3bG9ja193cmxvY2sgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2spOworCitleHRlcm4gaW50IF9fcHRocmVhZF9yd2xvY2tfdW5sb2NrIChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jayk7CisjZW5kaWYKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfa2V5X2NyZWF0ZSAocHRocmVhZF9rZXlfdCAqX19rZXksCisJCQkJIHZvaWQgKCpfX2Rlc3RyX2Z1bmN0aW9uKSAodm9pZCAqKSk7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX3NldHNwZWNpZmljIChwdGhyZWFkX2tleV90IF9fa2V5LAorCQkJCSAgX19jb25zdCB2b2lkICpfX3BvaW50ZXIpOworCitleHRlcm4gdm9pZCAqX19wdGhyZWFkX2dldHNwZWNpZmljIChwdGhyZWFkX2tleV90IF9fa2V5KTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfb25jZSAocHRocmVhZF9vbmNlX3QgKl9fb25jZV9jb250cm9sLAorCQkJICAgdm9pZCAoKl9faW5pdF9yb3V0aW5lKSAodm9pZCkpOworCitleHRlcm4gaW50IF9fcHRocmVhZF9hdGZvcmsgKHZvaWQgKCpfX3ByZXBhcmUpICh2b2lkKSwKKwkJCSAgICAgdm9pZCAoKl9fcGFyZW50KSAodm9pZCksCisJCQkgICAgIHZvaWQgKCpfX2NoaWxkKSAodm9pZCkpOworCisKKworLyogTWFrZSB0aGUgcHRocmVhZCBmdW5jdGlvbnMgd2VhayBzbyB0aGF0IHdlIGNhbiBlbGlkZSB0aGVtIGZyb20KKyAgIHNpbmdsZS10aHJlYWRlZCBwcm9jZXNzZXMuICAqLworI2lmbmRlZiBfX05PX1dFQUtfUFRIUkVBRF9BTElBU0VTCisjIGlmZGVmIHdlYWtfZXh0ZXJuCisjICBpZiBfTElCQworIyAgIGluY2x1ZGUgPGJwLXN5bS5oPgorIyAgZWxzZQorIyAgIGRlZmluZSBCUF9TWU0oc3ltKSBzeW0KKyMgIGVuZGlmCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfbXV0ZXhfaW5pdCkpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSkpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfbXV0ZXhfbG9jaykpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jaykpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9tdXRleGF0dHJfaW5pdCkpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kpKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9yd2xvY2tfaW5pdCkpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfcndsb2NrX2Rlc3Ryb3kpKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX3J3bG9ja19yZGxvY2spKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX3J3bG9ja190cnlyZGxvY2spKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX3J3bG9ja193cmxvY2spKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX3J3bG9ja190cnl3cmxvY2spKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX3J3bG9ja191bmxvY2spKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX2tleV9jcmVhdGUpKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX3NldHNwZWNpZmljKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9nZXRzcGVjaWZpYykpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfb25jZSkpCit3ZWFrX2V4dGVybiAoX19wdGhyZWFkX2luaXRpYWxpemUpCit3ZWFrX2V4dGVybiAoX19wdGhyZWFkX2F0Zm9yaykKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9wdGhyZWFkX2NsZWFudXBfcHVzaF9kZWZlcikpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfcHRocmVhZF9jbGVhbnVwX3BvcF9yZXN0b3JlKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUpKQorIyBlbHNlCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfbXV0ZXhfaW5pdAorIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX211dGV4X2Rlc3Ryb3kKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9tdXRleF9sb2NrCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jaworIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX211dGV4X3VubG9jaworIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX211dGV4YXR0cl9pbml0CisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZQorIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX3J3bG9ja19kZXN0cm95CisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfcndsb2NrX3JkbG9jaworIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX3J3bG9ja190cnlyZGxvY2sKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9yd2xvY2tfd3Jsb2NrCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jaworIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX3J3bG9ja191bmxvY2sKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9rZXlfY3JlYXRlCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfc2V0c3BlY2lmaWMKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9nZXRzcGVjaWZpYworIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX29uY2UKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9pbml0aWFsaXplCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfYXRmb3JrCisjICBwcmFnbWEgd2VhayBfcHRocmVhZF9jbGVhbnVwX3B1c2hfZGVmZXIKKyMgIHByYWdtYSB3ZWFrIF9wdGhyZWFkX2NsZWFudXBfcG9wX3Jlc3RvcmUKKyMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUKKyMgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYJLyogYml0cy9saWJjLWxvY2suaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2xpYmlvLWxkYmwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9saWJpby1sZGJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3NGJjYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9saWJpby1sZGJsLmgKQEAgLTAsMCArMSwyNSBAQAorLyogLW1sb25nLWRvdWJsZS02NCBjb21wYXRpYmlsaXR5IG1vZGUgZm9yIGxpYmlvIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfSU9fU1RESU9fSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9saWJpby1sZGJsLmg+IGRpcmVjdGx5OyB1c2UgPGxpYmlvLmg+IGluc3RlYWQuIgorI2VuZGlmCisKK19fTERCTF9SRURJUl9ERUNMIChfSU9fdmZzY2FuZikKK19fTERCTF9SRURJUl9ERUNMIChfSU9fdmZwcmludGYpCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbGluay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2xpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGY1Zjc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2xpbmsuaApAQCAtMCwwICsxLDYwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX0xJTktfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9saW5rLmg+IGRpcmVjdGx5OyB1c2UgPGxpbmsuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCisvKiBSZWdpc3RlcnMgZm9yIGVudHJ5IGludG8gUExUIG9uIElBLTMyLiAgKi8KK3R5cGVkZWYgc3RydWN0IExhX2k4Nl9yZWdzCit7CisgIHVpbnQzMl90IGxyX2VkeDsKKyAgdWludDMyX3QgbHJfZWN4OworICB1aW50MzJfdCBscl9lYXg7CisgIHVpbnQzMl90IGxyX2VicDsKKyAgdWludDMyX3QgbHJfZXNwOworfSBMYV9pODZfcmVnczsKKworLyogUmV0dXJuIHZhbHVlcyBmb3IgY2FsbHMgZnJvbSBQTFQgb24gSUEtMzIuICAqLwordHlwZWRlZiBzdHJ1Y3QgTGFfaTg2X3JldHZhbAoreworICB1aW50MzJfdCBscnZfZWF4OworICB1aW50MzJfdCBscnZfZWR4OworICBsb25nIGRvdWJsZSBscnZfc3QwOworICBsb25nIGRvdWJsZSBscnZfc3QxOworfSBMYV9pODZfcmV0dmFsOworCisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIEVsZjMyX0FkZHIgbGFfaTg2X2dudV9wbHRlbnRlciAoRWxmMzJfU3ltICpfX3N5bSwgdW5zaWduZWQgaW50IF9fbmR4LAorCQkJCSAgICAgICB1aW50cHRyX3QgKl9fcmVmY29vaywKKwkJCQkgICAgICAgdWludHB0cl90ICpfX2RlZmNvb2ssCisJCQkJICAgICAgIExhX2k4Nl9yZWdzICpfX3JlZ3MsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCAqX19mbGFncywKKwkJCQkgICAgICAgY29uc3QgY2hhciAqX19zeW1uYW1lLAorCQkJCSAgICAgICBsb25nIGludCAqX19mcmFtZXNpemVwKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbGFfaTg2X2dudV9wbHRleGl0IChFbGYzMl9TeW0gKl9fc3ltLCB1bnNpZ25lZCBpbnQgX19uZHgsCisJCQkJCXVpbnRwdHJfdCAqX19yZWZjb29rLAorCQkJCQl1aW50cHRyX3QgKl9fZGVmY29vaywKKwkJCQkJY29uc3QgTGFfaTg2X3JlZ3MgKl9faW5yZWdzLAorCQkJCQlMYV9pODZfcmV0dmFsICpfX291dHJlZ3MsCisJCQkJCWNvbnN0IGNoYXIgKl9fc3ltbmFtZSk7CisKK19fRU5EX0RFQ0xTCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbG9jYWxfbGltLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbG9jYWxfbGltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYwZGY0ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9sb2NhbF9saW0uaApAQCAtMCwwICsxLDEwMCBAQAorLyogTWluaW11bSBndWFyYW50ZWVkIG1heGltdW0gdmFsdWVzIGZvciBzeXN0ZW0gbGltaXRzLiAgTGludXggdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5My0xOTk4LDIwMDAsMjAwMi0yMDA0LDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlCisgICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKKyAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhlIGtlcm5lbCBoZWFkZXIgcG9sbHV0ZXMgdGhlIG5hbWVzcGFjZSB3aXRoIHRoZSBOUl9PUEVOIHN5bWJvbAorICAgYW5kIGRlZmluZXMgTElOS19NQVggYWx0aG91Z2ggZmlsZXN5c3RlbXMgaGF2ZSBkaWZmZXJlbnQgbWF4aW1hLiAgQQorICAgc2ltaWxhciB0aGluZyBpcyB0cnVlIGZvciBPUEVOX01BWDogdGhlIGxpbWl0IGNhbiBiZSBjaGFuZ2VkIGF0CisgICBydW50aW1lIGFuZCB0aGVyZWZvcmUgdGhlIG1hY3JvIG11c3Qgbm90IGJlIGRlZmluZWQuICBSZW1vdmUgdGhpcworICAgYWZ0ZXIgaW5jbHVkaW5nIHRoZSBoZWFkZXIgaWYgbmVjZXNzYXJ5LiAgKi8KKyNpZm5kZWYgTlJfT1BFTgorIyBkZWZpbmUgX191bmRlZl9OUl9PUEVOCisjZW5kaWYKKyNpZm5kZWYgTElOS19NQVgKKyMgZGVmaW5lIF9fdW5kZWZfTElOS19NQVgKKyNlbmRpZgorI2lmbmRlZiBPUEVOX01BWAorIyBkZWZpbmUgX191bmRlZl9PUEVOX01BWAorI2VuZGlmCisjaWZuZGVmIEFSR19NQVgKKyMgZGVmaW5lIF9fdW5kZWZfQVJHX01BWAorI2VuZGlmCisKKy8qIFRoZSBrZXJuZWwgc291cmNlcyBjb250YWluIGEgZmlsZSB3aXRoIGFsbCB0aGUgbmVlZGVkIGluZm9ybWF0aW9uLiAgKi8KKyNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KKworLyogSGF2ZSB0byByZW1vdmUgTlJfT1BFTj8gICovCisjaWZkZWYgX191bmRlZl9OUl9PUEVOCisjIHVuZGVmIE5SX09QRU4KKyMgdW5kZWYgX191bmRlZl9OUl9PUEVOCisjZW5kaWYKKy8qIEhhdmUgdG8gcmVtb3ZlIExJTktfTUFYPyAgKi8KKyNpZmRlZiBfX3VuZGVmX0xJTktfTUFYCisjIHVuZGVmIExJTktfTUFYCisjIHVuZGVmIF9fdW5kZWZfTElOS19NQVgKKyNlbmRpZgorLyogSGF2ZSB0byByZW1vdmUgT1BFTl9NQVg/ICAqLworI2lmZGVmIF9fdW5kZWZfT1BFTl9NQVgKKyMgdW5kZWYgT1BFTl9NQVgKKyMgdW5kZWYgX191bmRlZl9PUEVOX01BWAorI2VuZGlmCisvKiBIYXZlIHRvIHJlbW92ZSBBUkdfTUFYPyAgKi8KKyNpZmRlZiBfX3VuZGVmX0FSR19NQVgKKyMgdW5kZWYgQVJHX01BWAorIyB1bmRlZiBfX3VuZGVmX0FSR19NQVgKKyNlbmRpZgorCisvKiBUaGUgbnVtYmVyIG9mIGRhdGEga2V5cyBwZXIgcHJvY2Vzcy4gICovCisjZGVmaW5lIF9QT1NJWF9USFJFQURfS0VZU19NQVgJMTI4CisvKiBUaGlzIGlzIHRoZSB2YWx1ZSB0aGlzIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzLiAgKi8KKyNkZWZpbmUgUFRIUkVBRF9LRVlTX01BWAkxMDI0CisKKy8qIENvbnRyb2xsaW5nIHRoZSBpdGVyYXRpb25zIG9mIGRlc3RydWN0b3JzIGZvciB0aHJlYWQtc3BlY2lmaWMgZGF0YS4gICovCisjZGVmaW5lIF9QT1NJWF9USFJFQURfREVTVFJVQ1RPUl9JVEVSQVRJT05TCTQKKy8qIE51bWJlciBvZiBpdGVyYXRpb25zIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lcy4gICovCisjZGVmaW5lIFBUSFJFQURfREVTVFJVQ1RPUl9JVEVSQVRJT05TCV9QT1NJWF9USFJFQURfREVTVFJVQ1RPUl9JVEVSQVRJT05TCisKKy8qIFRoZSBudW1iZXIgb2YgdGhyZWFkcyBwZXIgcHJvY2Vzcy4gICovCisjZGVmaW5lIF9QT1NJWF9USFJFQURfVEhSRUFEU19NQVgJNjQKKy8qIFdlIGhhdmUgbm8gcHJlZGVmaW5lZCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHRocmVhZHMuICAqLworI3VuZGVmIFBUSFJFQURfVEhSRUFEU19NQVgKKworLyogTWF4aW11bSBhbW91bnQgYnkgd2hpY2ggYSBwcm9jZXNzIGNhbiBkZXNjcmVhc2UgaXRzIGFzeW5jaHJvbm91cyBJL08KKyAgIHByaW9yaXR5IGxldmVsLiAgKi8KKyNkZWZpbmUgQUlPX1BSSU9fREVMVEFfTUFYCTIwCisKKy8qIE1pbmltdW0gc2l6ZSBmb3IgYSB0aHJlYWQuICBXZSBhcmUgZnJlZSB0byBjaG9vc2UgYSByZWFzb25hYmxlIHZhbHVlLiAgKi8KKyNkZWZpbmUgUFRIUkVBRF9TVEFDS19NSU4JMTYzODQKKworLyogTWF4aW11bSBudW1iZXIgb2YgdGltZXIgZXhwaXJhdGlvbiBvdmVycnVucy4gICovCisjZGVmaW5lIERFTEFZVElNRVJfTUFYCTIxNDc0ODM2NDcKKworLyogTWF4aW11bSB0dHkgbmFtZSBsZW5ndGguICAqLworI2RlZmluZSBUVFlfTkFNRV9NQVgJCTMyCisKKy8qIE1heGltdW0gbG9naW4gbmFtZSBsZW5ndGguICBUaGlzIGlzIGFyYml0cmFyeS4gICovCisjZGVmaW5lIExPR0lOX05BTUVfTUFYCQkyNTYKKworLyogTWF4aW11bSBob3N0IG5hbWUgbGVuZ3RoLiAgKi8KKyNkZWZpbmUgSE9TVF9OQU1FX01BWAkJNjQKKworLyogTWF4aW11bSBtZXNzYWdlIHF1ZXVlIHByaW9yaXR5IGxldmVsLiAgKi8KKyNkZWZpbmUgTVFfUFJJT19NQVgJCTMyNzY4CisKKy8qIE1heGltdW0gdmFsdWUgdGhlIHNlbWFwaG9yZSBjYW4gaGF2ZS4gICovCisjZGVmaW5lIFNFTV9WQUxVRV9NQVggICAoMjE0NzQ4MzY0NykKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9sb2NhbGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9sb2NhbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDA2NGI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL2xvY2FsZS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qIERlZmluaXRpb24gb2YgbG9jYWxlIGNhdGVnb3J5IHN5bWJvbCB2YWx1ZXMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCBfTE9DQUxFX0ggJiYgIWRlZmluZWQgX0xBTkdJTkZPX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9sb2NhbGUuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGxvY2FsZS5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9CSVRTX0xPQ0FMRV9ICisjZGVmaW5lIF9CSVRTX0xPQ0FMRV9ICTEKKworZW51bQoreworICBfX0xDX0NUWVBFID0gMCwKKyAgX19MQ19OVU1FUklDID0gMSwKKyAgX19MQ19USU1FID0gMiwKKyAgX19MQ19DT0xMQVRFID0gMywKKyAgX19MQ19NT05FVEFSWSA9IDQsCisgIF9fTENfTUVTU0FHRVMgPSA1LAorICBfX0xDX0FMTCA9IDYsCisgIF9fTENfUEFQRVIgPSA3LAorICBfX0xDX05BTUUgPSA4LAorICBfX0xDX0FERFJFU1MgPSA5LAorICBfX0xDX1RFTEVQSE9ORSA9IDEwLAorICBfX0xDX01FQVNVUkVNRU5UID0gMTEsCisgIF9fTENfSURFTlRJRklDQVRJT04gPSAxMgorfTsKKworI2VuZGlmCS8qIGJpdHMvbG9jYWxlLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9tYXRoLWZpbml0ZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL21hdGgtZmluaXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNmNDI3YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9tYXRoLWZpbml0ZS5oCkBAIC0wLDAgKzEsMzI5IEBACisvKiBFbnRyeSBwb2ludHMgdG8gZmluaXRlLW1hdGgtb25seSBjb21waWxlciBydW5zLgorICAgQ29weXJpZ2h0IChDKSAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9NQVRIX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9tYXRoLWZpbml0ZS5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bWF0aC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBhY29zLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGFjb3MsIChkb3VibGUpLCBfX2Fjb3NfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoYWNvc2YsIChmbG9hdCksIF9fYWNvc2ZfZmluaXRlKTsKKyNpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGFjb3NsLCAobG9uZyBkb3VibGUpLCBfX2Fjb3NsX2Zpbml0ZSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CisvKiBhY29zaC4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChhY29zaCwgKGRvdWJsZSksIF9fYWNvc2hfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoYWNvc2hmLCAoZmxvYXQpLCBfX2Fjb3NoZl9maW5pdGUpOworIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGFjb3NobCwgKGxvbmcgZG91YmxlKSwgX19hY29zaGxfZmluaXRlKTsKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBhc2luLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGFzaW4sIChkb3VibGUpLCBfX2FzaW5fZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoYXNpbmYsIChmbG9hdCksIF9fYXNpbmZfZmluaXRlKTsKKyNpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGFzaW5sLCAobG9uZyBkb3VibGUpLCBfX2FzaW5sX2Zpbml0ZSk7CisjZW5kaWYKKworLyogYXRhbjIuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoYXRhbjIsIChkb3VibGUsIGRvdWJsZSksIF9fYXRhbjJfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoYXRhbjJmLCAoZmxvYXQsIGZsb2F0KSwgX19hdGFuMmZfZmluaXRlKTsKKyNpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGF0YW4ybCwgKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSksCisJCQkJICAgX19hdGFuMmxfZmluaXRlKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKKy8qIGF0YW5oLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGF0YW5oLCAoZG91YmxlKSwgX19hdGFuaF9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChhdGFuaGYsIChmbG9hdCksIF9fYXRhbmhmX2Zpbml0ZSk7CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoYXRhbmhsLCAobG9uZyBkb3VibGUpLCBfX2F0YW5obF9maW5pdGUpOworIyBlbmRpZgorI2VuZGlmCisKKy8qIGNvc2guICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoY29zaCwgKGRvdWJsZSksIF9fY29zaF9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChjb3NoZiwgKGZsb2F0KSwgX19jb3NoZl9maW5pdGUpOworI2lmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoY29zaGwsIChsb25nIGRvdWJsZSksIF9fY29zaGxfZmluaXRlKTsKKyNlbmRpZgorCisvKiBleHAuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoZXhwLCAoZG91YmxlKSwgX19leHBfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoZXhwZiwgKGZsb2F0KSwgX19leHBmX2Zpbml0ZSk7CisjaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChleHBsLCAobG9uZyBkb3VibGUpLCBfX2V4cGxfZmluaXRlKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisvKiBleHAxMC4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChleHAxMCwgKGRvdWJsZSksIF9fZXhwMTBfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoZXhwMTBmLCAoZmxvYXQpLCBfX2V4cDEwZl9maW5pdGUpOworIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGV4cDEwbCwgKGxvbmcgZG91YmxlKSwgX19leHAxMGxfZmluaXRlKTsKKyMgZW5kaWYKKworLyogcG93MTAuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAocG93MTAsIChkb3VibGUpLCBfX2V4cDEwX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKHBvdzEwZiwgKGZsb2F0KSwgX19leHAxMGZfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChwb3cxMGwsIChsb25nIGRvdWJsZSksIF9fZXhwMTBsX2Zpbml0ZSk7CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0lTT0M5OQorLyogZXhwMi4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChleHAyLCAoZG91YmxlKSwgX19leHAyX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGV4cDJmLCAoZmxvYXQpLCBfX2V4cDJmX2Zpbml0ZSk7CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoZXhwMmwsIChsb25nIGRvdWJsZSksIF9fZXhwMmxfZmluaXRlKTsKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBmbW9kLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGZtb2QsIChkb3VibGUsIGRvdWJsZSksIF9fZm1vZF9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChmbW9kZiwgKGZsb2F0LCBmbG9hdCksIF9fZm1vZGZfZmluaXRlKTsKKyNpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGZtb2RsLCAobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKSwKKwkJCQkgICBfX2Ztb2RsX2Zpbml0ZSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0lTT0M5OQorLyogaHlwb3QuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoaHlwb3QsIChkb3VibGUsIGRvdWJsZSksIF9faHlwb3RfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoaHlwb3RmLCAoZmxvYXQsIGZsb2F0KSwgX19oeXBvdGZfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChoeXBvdGwsIChsb25nIGRvdWJsZSwgbG9uZyBkb3VibGUpLAorCQkJCSAgIF9faHlwb3RsX2Zpbml0ZSk7CisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisvKiBqMC4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChqMCwgKGRvdWJsZSksIF9fajBfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoajBmLCAoZmxvYXQpLCBfX2owZl9maW5pdGUpOworIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGowbCwgKGxvbmcgZG91YmxlKSwgX19qMGxfZmluaXRlKTsKKyMgZW5kaWYKKworLyogeTAuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoeTAsIChkb3VibGUpLCBfX3kwX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKHkwZiwgKGZsb2F0KSwgX195MGZfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIICh5MGwsIChsb25nIGRvdWJsZSksIF9feTBsX2Zpbml0ZSk7CisjIGVuZGlmCisKKy8qIGoxLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGoxLCAoZG91YmxlKSwgX19qMV9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChqMWYsIChmbG9hdCksIF9fajFmX2Zpbml0ZSk7CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoajFsLCAobG9uZyBkb3VibGUpLCBfX2oxbF9maW5pdGUpOworIyBlbmRpZgorCisvKiB5MS4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIICh5MSwgKGRvdWJsZSksIF9feTFfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoeTFmLCAoZmxvYXQpLCBfX3kxZl9maW5pdGUpOworIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKHkxbCwgKGxvbmcgZG91YmxlKSwgX195MWxfZmluaXRlKTsKKyMgZW5kaWYKKworLyogam4uICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoam4sIChpbnQsIGRvdWJsZSksIF9fam5fZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoam5mLCAoaW50LCBmbG9hdCksIF9fam5mX2Zpbml0ZSk7CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoam5sLCAoaW50LCBsb25nIGRvdWJsZSksIF9fam5sX2Zpbml0ZSk7CisjIGVuZGlmCisKKy8qIHluLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKHluLCAoaW50LCBkb3VibGUpLCBfX3luX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKHluZiwgKGludCwgZmxvYXQpLCBfX3luZl9maW5pdGUpOworIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKHlubCwgKGludCwgbG9uZyBkb3VibGUpLCBfX3lubF9maW5pdGUpOworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBsZ2FtbWFfci4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChsZ2FtbWFfciwgKGRvdWJsZSwgaW50ICopLCBfX2xnYW1tYV9yX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGxnYW1tYWZfciwgKGZsb2F0LCBpbnQgKiksIF9fbGdhbW1hZl9yX2Zpbml0ZSk7CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAobGdhbW1hbF9yLCAobG9uZyBkb3VibGUsIGludCAqKSwKKwkJCQkgICBfX2xnYW1tYWxfcl9maW5pdGUpOworIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorLyogbGdhbW1hLiAgKi8KK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgZG91YmxlIF9fTlRIIChsZ2FtbWEgKGRvdWJsZSBfX2QpKQoreworIyBpZmRlZiBfX1VTRV9JU09DOTkKKyAgaW50IF9fbG9jYWxfc2lnbmdhbSA9IDA7CisgIHJldHVybiBsZ2FtbWFfciAoX19kLCAmX19sb2NhbF9zaWduZ2FtKTsKKyMgZWxzZQorICByZXR1cm4gbGdhbW1hX3IgKF9fZCwgJnNpZ25nYW0pOworIyBlbmRpZgorfQorX19leHRlcm5fYWx3YXlzX2lubGluZSBmbG9hdCBfX05USCAobGdhbW1hZiAoZmxvYXQgX19kKSkKK3sKKyMgaWZkZWYgX19VU0VfSVNPQzk5CisgIGludCBfX2xvY2FsX3NpZ25nYW0gPSAwOworICByZXR1cm4gbGdhbW1hZl9yIChfX2QsICZfX2xvY2FsX3NpZ25nYW0pOworIyBlbHNlCisgIHJldHVybiBsZ2FtbWFmX3IgKF9fZCwgJnNpZ25nYW0pOworIyBlbmRpZgorfQorIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGxvbmcgZG91YmxlIF9fTlRIIChsZ2FtbWFsIChsb25nIGRvdWJsZSBfX2QpKQoreworIyBpZmRlZiBfX1VTRV9JU09DOTkKKyAgaW50IF9fbG9jYWxfc2lnbmdhbSA9IDA7CisgIHJldHVybiBsZ2FtbWFsX3IgKF9fZCwgJl9fbG9jYWxfc2lnbmdhbSk7CisjIGVsc2UKKyAgcmV0dXJuIGxnYW1tYWxfciAoX19kLCAmc2lnbmdhbSk7CisjIGVuZGlmCit9CisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisvKiBnYW1tYS4gICovCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGRvdWJsZSBfX05USCAoZ2FtbWEgKGRvdWJsZSBfX2QpKQoreworIyBpZmRlZiBfX1VTRV9JU09DOTkKKyAgaW50IF9fbG9jYWxfc2lnbmdhbSA9IDA7CisgIHJldHVybiBsZ2FtbWFfciAoX19kLCAmX19sb2NhbF9zaWduZ2FtKTsKKyMgZWxzZQorICByZXR1cm4gbGdhbW1hX3IgKF9fZCwgJnNpZ25nYW0pOworIyBlbmRpZgorfQorX19leHRlcm5fYWx3YXlzX2lubGluZSBmbG9hdCBfX05USCAoZ2FtbWFmIChmbG9hdCBfX2QpKQoreworIyBpZmRlZiBfX1VTRV9JU09DOTkKKyAgaW50IF9fbG9jYWxfc2lnbmdhbSA9IDA7CisgIHJldHVybiBsZ2FtbWFmX3IgKF9fZCwgJl9fbG9jYWxfc2lnbmdhbSk7CisjIGVsc2UKKyAgcmV0dXJuIGxnYW1tYWZfciAoX19kLCAmc2lnbmdhbSk7CisjIGVuZGlmCit9CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgbG9uZyBkb3VibGUgX19OVEggKGdhbW1hbCAobG9uZyBkb3VibGUgX19kKSkKK3sKKyMgIGlmZGVmIF9fVVNFX0lTT0M5OQorICBpbnQgX19sb2NhbF9zaWduZ2FtID0gMDsKKyAgcmV0dXJuIGxnYW1tYWxfciAoX19kLCAmX19sb2NhbF9zaWduZ2FtKTsKKyMgIGVsc2UKKyAgcmV0dXJuIGxnYW1tYWxfciAoX19kLCAmc2lnbmdhbSk7CisjICBlbmRpZgorfQorIyBlbmRpZgorI2VuZGlmCisKKy8qIGxvZy4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChsb2csIChkb3VibGUpLCBfX2xvZ19maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChsb2dmLCAoZmxvYXQpLCBfX2xvZ2ZfZmluaXRlKTsKKyNpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGxvZ2wsIChsb25nIGRvdWJsZSksIF9fbG9nbF9maW5pdGUpOworI2VuZGlmCisKKy8qIGxvZzEwLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGxvZzEwLCAoZG91YmxlKSwgX19sb2cxMF9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChsb2cxMGYsIChmbG9hdCksIF9fbG9nMTBmX2Zpbml0ZSk7CisjaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChsb2cxMGwsIChsb25nIGRvdWJsZSksIF9fbG9nMTBsX2Zpbml0ZSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0lTT0M5OQorLyogbG9nMi4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChsb2cyLCAoZG91YmxlKSwgX19sb2cyX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGxvZzJmLCAoZmxvYXQpLCBfX2xvZzJmX2Zpbml0ZSk7CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAobG9nMmwsIChsb25nIGRvdWJsZSksIF9fbG9nMmxfZmluaXRlKTsKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBwb3cuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAocG93LCAoZG91YmxlLCBkb3VibGUpLCBfX3Bvd19maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChwb3dmLCAoZmxvYXQsIGZsb2F0KSwgX19wb3dmX2Zpbml0ZSk7CisjaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChwb3dsLCAobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKSwKKwkJCQkgICBfX3Bvd2xfZmluaXRlKTsKKyNlbmRpZgorCisvKiByZW1haW5kZXIuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAocmVtYWluZGVyLCAoZG91YmxlLCBkb3VibGUpLCBfX3JlbWFpbmRlcl9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChyZW1haW5kZXJmLCAoZmxvYXQsIGZsb2F0KSwgX19yZW1haW5kZXJmX2Zpbml0ZSk7CisjaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChyZW1haW5kZXJsLCAobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKSwKKwkJCQkgICBfX3JlbWFpbmRlcmxfZmluaXRlKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIHNjYWxiLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKHNjYWxiLCAoZG91YmxlLCBkb3VibGUpLCBfX3NjYWxiX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKHNjYWxiZiwgKGZsb2F0LCBmbG9hdCksIF9fc2NhbGJmX2Zpbml0ZSk7CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoc2NhbGJsLCAobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKSwKKwkJCQkgICBfX3NjYWxibF9maW5pdGUpOworIyBlbmRpZgorI2VuZGlmCisKKy8qIHNpbmguICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoc2luaCwgKGRvdWJsZSksIF9fc2luaF9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChzaW5oZiwgKGZsb2F0KSwgX19zaW5oZl9maW5pdGUpOworI2lmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoc2luaGwsIChsb25nIGRvdWJsZSksIF9fc2luaGxfZmluaXRlKTsKKyNlbmRpZgorCisvKiBzcXJ0LiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKHNxcnQsIChkb3VibGUpLCBfX3NxcnRfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoc3FydGYsIChmbG9hdCksIF9fc3FydGZfZmluaXRlKTsKKyNpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKHNxcnRsLCAobG9uZyBkb3VibGUpLCBfX3NxcnRsX2Zpbml0ZSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0lTT0M5OQorLyogdGdhbW1hLiAgKi8KK2V4dGVybiBkb3VibGUgX19nYW1tYV9yX2Zpbml0ZSAoZG91YmxlLCBpbnQgKik7CitfX2V4dGVybl9hbHdheXNfaW5saW5lIGRvdWJsZSBfX05USCAodGdhbW1hIChkb3VibGUgX19kKSkKK3sKKyAgaW50IF9fbG9jYWxfc2lnbmdhbSA9IDA7CisgIGRvdWJsZSBfX3JlcyA9IF9fZ2FtbWFfcl9maW5pdGUgKF9fZCwgJl9fbG9jYWxfc2lnbmdhbSk7CisgIHJldHVybiBfX2xvY2FsX3NpZ25nYW0gPCAwID8gLV9fcmVzIDogX19yZXM7Cit9CitleHRlcm4gZmxvYXQgX19nYW1tYWZfcl9maW5pdGUgKGZsb2F0LCBpbnQgKik7CitfX2V4dGVybl9hbHdheXNfaW5saW5lIGZsb2F0IF9fTlRIICh0Z2FtbWFmIChmbG9hdCBfX2QpKQoreworICBpbnQgX19sb2NhbF9zaWduZ2FtID0gMDsKKyAgZmxvYXQgX19yZXMgPSBfX2dhbW1hZl9yX2Zpbml0ZSAoX19kLCAmX19sb2NhbF9zaWduZ2FtKTsKKyAgcmV0dXJuIF9fbG9jYWxfc2lnbmdhbSA8IDAgPyAtX19yZXMgOiBfX3JlczsKK30KKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fZ2FtbWFsX3JfZmluaXRlIChsb25nIGRvdWJsZSwgaW50ICopOworX19leHRlcm5fYWx3YXlzX2lubGluZSBsb25nIGRvdWJsZSBfX05USCAodGdhbW1hbCAobG9uZyBkb3VibGUgX19kKSkKK3sKKyAgaW50IF9fbG9jYWxfc2lnbmdhbSA9IDA7CisgIGxvbmcgZG91YmxlIF9fcmVzID0gX19nYW1tYWxfcl9maW5pdGUgKF9fZCwgJl9fbG9jYWxfc2lnbmdhbSk7CisgIHJldHVybiBfX2xvY2FsX3NpZ25nYW0gPCAwID8gLV9fcmVzIDogX19yZXM7Cit9CisjIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9tYXRoY2FsbHMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9tYXRoY2FsbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjIyYWJmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL21hdGhjYWxscy5oCkBAIC0wLDAgKzEsMzY2IEBACisvKiBQcm90b3R5cGUgZGVjbGFyYXRpb25zIGZvciBtYXRoIGZ1bmN0aW9uczsgaGVscGVyIGZpbGUgZm9yIDxtYXRoLmg+LgorICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDIsIDIwMDMsIDIwMDYsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIE5PVEU6IEJlY2F1c2Ugb2YgdGhlIHNwZWNpYWwgd2F5IHRoaXMgZmlsZSBpcyB1c2VkIGJ5IDxtYXRoLmg+LCB0aGlzCisgICBmaWxlIG11c3QgTk9UIGJlIHByb3RlY3RlZCBmcm9tIG11bHRpcGxlIGluY2x1c2lvbiBhcyBoZWFkZXIgZmlsZXMKKyAgIHVzdWFsbHkgYXJlLgorCisgICBUaGlzIGZpbGUgcHJvdmlkZXMgcHJvdG90eXBlIGRlY2xhcmF0aW9ucyBmb3IgdGhlIG1hdGggZnVuY3Rpb25zLgorICAgTW9zdCBmdW5jdGlvbnMgYXJlIGRlY2xhcmVkIHVzaW5nIHRoZSBtYWNybzoKKworICAgX19NQVRIQ0FMTCAoTkFNRSxbX3JdLCAoQVJHUy4uLikpOworCisgICBUaGlzIG1lYW5zIHRoZXJlIGlzIGEgZnVuY3Rpb24gYE5BTUUnIHJldHVybmluZyBgZG91YmxlJyBhbmQgYSBmdW5jdGlvbgorICAgYE5BTUVmJyByZXR1cm5pbmcgYGZsb2F0Jy4gIEVhY2ggcGxhY2UgYF9NZG91YmxlXycgYXBwZWFycyBpbiB0aGUKKyAgIHByb3RvdHlwZSwgdGhhdCBpcyBhY3R1YWxseSBgZG91YmxlJyBpbiB0aGUgcHJvdG90eXBlIGZvciBgTkFNRScgYW5kCisgICBgZmxvYXQnIGluIHRoZSBwcm90b3R5cGUgZm9yIGBOQU1FZicuICBSZWVudHJhbnQgdmFyaWFudCBmdW5jdGlvbnMgYXJlCisgICBjYWxsZWQgYE5BTUVfcicgYW5kIGBOQU1FZl9yJy4KKworICAgRnVuY3Rpb25zIHJldHVybmluZyBvdGhlciB0eXBlcyBsaWtlIGBpbnQnIGFyZSBkZWNsYXJlZCB1c2luZyB0aGUgbWFjcm86CisKKyAgIF9fTUFUSERFQ0wgKFRZUEUsIE5BTUUsW19yXSwgKEFSR1MuLi4pKTsKKworICAgVGhpcyBpcyBqdXN0IGxpa2UgX19NQVRIQ0FMTCBidXQgZm9yIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGBUWVBFJworICAgaW5zdGVhZCBvZiBgX01kb3VibGVfJy4gIEluIGFsbCBvZiB0aGVzZSBjYXNlcywgdGhlcmUgaXMgc3RpbGwKKyAgIGJvdGggYSBgTkFNRScgYW5kIGEgYE5BTUVmJyB0aGF0IHRha2VzIGBmbG9hdCcgYXJndW1lbnRzLgorCisgICBOb3RlIHRoYXQgdGhlcmUgbXVzdCBiZSBubyB3aGl0ZXNwYWNlIGJlZm9yZSB0aGUgYXJndW1lbnQgcGFzc2VkIGZvcgorICAgTkFNRSwgdG8gbWFrZSB0b2tlbiBwYXN0aW5nIHdvcmsgd2l0aCAtdHJhZGl0aW9uYWwuICAqLworCisjaWZuZGVmIF9NQVRIX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvbWF0aGNhbGxzLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxtYXRoLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKworLyogVHJpZ29ub21ldHJpYyBmdW5jdGlvbnMuICAqLworCitfTWRvdWJsZV9CRUdJTl9OQU1FU1BBQ0UKKy8qIEFyYyBjb3NpbmUgb2YgWC4gICovCitfX01BVEhDQUxMIChhY29zLCwgKF9NZG91YmxlXyBfX3gpKTsKKy8qIEFyYyBzaW5lIG9mIFguICAqLworX19NQVRIQ0FMTCAoYXNpbiwsIChfTWRvdWJsZV8gX194KSk7CisvKiBBcmMgdGFuZ2VudCBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGF0YW4sLCAoX01kb3VibGVfIF9feCkpOworLyogQXJjIHRhbmdlbnQgb2YgWS9YLiAgKi8KK19fTUFUSENBTEwgKGF0YW4yLCwgKF9NZG91YmxlXyBfX3ksIF9NZG91YmxlXyBfX3gpKTsKKworLyogQ29zaW5lIG9mIFguICAqLworX19NQVRIQ0FMTCAoY29zLCwgKF9NZG91YmxlXyBfX3gpKTsKKy8qIFNpbmUgb2YgWC4gICovCitfX01BVEhDQUxMIChzaW4sLCAoX01kb3VibGVfIF9feCkpOworLyogVGFuZ2VudCBvZiBYLiAgKi8KK19fTUFUSENBTEwgKHRhbiwsIChfTWRvdWJsZV8gX194KSk7CisKKy8qIEh5cGVyYm9saWMgZnVuY3Rpb25zLiAgKi8KKworLyogSHlwZXJib2xpYyBjb3NpbmUgb2YgWC4gICovCitfX01BVEhDQUxMIChjb3NoLCwgKF9NZG91YmxlXyBfX3gpKTsKKy8qIEh5cGVyYm9saWMgc2luZSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKHNpbmgsLCAoX01kb3VibGVfIF9feCkpOworLyogSHlwZXJib2xpYyB0YW5nZW50IG9mIFguICAqLworX19NQVRIQ0FMTCAodGFuaCwsIChfTWRvdWJsZV8gX194KSk7CitfTWRvdWJsZV9FTkRfTkFNRVNQQUNFCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIENvc2luZSBhbmQgc2luZSBvZiBYLiAgKi8KK19fTUFUSERFQ0wgKHZvaWQsc2luY29zLCwKKwkgICAgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyAqX19zaW54LCBfTWRvdWJsZV8gKl9fY29zeCkpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBIeXBlcmJvbGljIGFyYyBjb3NpbmUgb2YgWC4gICovCitfX01BVEhDQUxMIChhY29zaCwsIChfTWRvdWJsZV8gX194KSk7CisvKiBIeXBlcmJvbGljIGFyYyBzaW5lIG9mIFguICAqLworX19NQVRIQ0FMTCAoYXNpbmgsLCAoX01kb3VibGVfIF9feCkpOworLyogSHlwZXJib2xpYyBhcmMgdGFuZ2VudCBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGF0YW5oLCwgKF9NZG91YmxlXyBfX3gpKTsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisvKiBFeHBvbmVudGlhbCBhbmQgbG9nYXJpdGhtaWMgZnVuY3Rpb25zLiAgKi8KKworX01kb3VibGVfQkVHSU5fTkFNRVNQQUNFCisvKiBFeHBvbmVudGlhbCBmdW5jdGlvbiBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGV4cCwsIChfTWRvdWJsZV8gX194KSk7CisKKy8qIEJyZWFrIFZBTFVFIGludG8gYSBub3JtYWxpemVkIGZyYWN0aW9uIGFuZCBhbiBpbnRlZ3JhbCBwb3dlciBvZiAyLiAgKi8KK19fTUFUSENBTEwgKGZyZXhwLCwgKF9NZG91YmxlXyBfX3gsIGludCAqX19leHBvbmVudCkpOworCisvKiBYIHRpbWVzICh0d28gdG8gdGhlIEVYUCBwb3dlcikuICAqLworX19NQVRIQ0FMTCAobGRleHAsLCAoX01kb3VibGVfIF9feCwgaW50IF9fZXhwb25lbnQpKTsKKworLyogTmF0dXJhbCBsb2dhcml0aG0gb2YgWC4gICovCitfX01BVEhDQUxMIChsb2csLCAoX01kb3VibGVfIF9feCkpOworCisvKiBCYXNlLXRlbiBsb2dhcml0aG0gb2YgWC4gICovCitfX01BVEhDQUxMIChsb2cxMCwsIChfTWRvdWJsZV8gX194KSk7CisKKy8qIEJyZWFrIFZBTFVFIGludG8gaW50ZWdyYWwgYW5kIGZyYWN0aW9uYWwgcGFydHMuICAqLworX19NQVRIQ0FMTCAobW9kZiwsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gKl9faXB0cikpCisgICAgIF9fYXR0cmlidXRlX18gKChfX25vbm51bGxfXyAoMikpKTsKK19NZG91YmxlX0VORF9OQU1FU1BBQ0UKKworI2lmZGVmIF9fVVNFX0dOVQorLyogQSBmdW5jdGlvbiBtaXNzaW5nIGluIGFsbCBzdGFuZGFyZHM6IGNvbXB1dGUgZXhwb25lbnQgdG8gYmFzZSB0ZW4uICAqLworX19NQVRIQ0FMTCAoZXhwMTAsLCAoX01kb3VibGVfIF9feCkpOworLyogQW5vdGhlciBuYW1lIG9jY2FzaW9uYWxseSB1c2VkLiAgKi8KK19fTUFUSENBTEwgKHBvdzEwLCwgKF9NZG91YmxlXyBfX3gpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogUmV0dXJuIGV4cChYKSAtIDEuICAqLworX19NQVRIQ0FMTCAoZXhwbTEsLCAoX01kb3VibGVfIF9feCkpOworCisvKiBSZXR1cm4gbG9nKDEgKyBYKS4gICovCitfX01BVEhDQUxMIChsb2cxcCwsIChfTWRvdWJsZV8gX194KSk7CisKKy8qIFJldHVybiB0aGUgYmFzZSAyIHNpZ25lZCBpbnRlZ3JhbCBleHBvbmVudCBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGxvZ2IsLCAoX01kb3VibGVfIF9feCkpOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogQ29tcHV0ZSBiYXNlLTIgZXhwb25lbnRpYWwgb2YgWC4gICovCitfX01BVEhDQUxMIChleHAyLCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogQ29tcHV0ZSBiYXNlLTIgbG9nYXJpdGhtIG9mIFguICAqLworX19NQVRIQ0FMTCAobG9nMiwsIChfTWRvdWJsZV8gX194KSk7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworCisvKiBQb3dlciBmdW5jdGlvbnMuICAqLworCitfTWRvdWJsZV9CRUdJTl9OQU1FU1BBQ0UKKy8qIFJldHVybiBYIHRvIHRoZSBZIHBvd2VyLiAgKi8KK19fTUFUSENBTEwgKHBvdywsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gX195KSk7CisKKy8qIFJldHVybiB0aGUgc3F1YXJlIHJvb3Qgb2YgWC4gICovCitfX01BVEhDQUxMIChzcXJ0LCwgKF9NZG91YmxlXyBfX3gpKTsKK19NZG91YmxlX0VORF9OQU1FU1BBQ0UKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIFJldHVybiBgc3FydChYKlggKyBZKlkpJy4gICovCitfX01BVEhDQUxMIChoeXBvdCwsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gX195KSk7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIFJldHVybiB0aGUgY3ViZSByb290IG9mIFguICAqLworX19NQVRIQ0FMTCAoY2JydCwsIChfTWRvdWJsZV8gX194KSk7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworCisvKiBOZWFyZXN0IGludGVnZXIsIGFic29sdXRlIHZhbHVlLCBhbmQgcmVtYWluZGVyIGZ1bmN0aW9ucy4gICovCisKK19NZG91YmxlX0JFR0lOX05BTUVTUEFDRQorLyogU21hbGxlc3QgaW50ZWdyYWwgdmFsdWUgbm90IGxlc3MgdGhhbiBYLiAgKi8KK19fTUFUSENBTExYIChjZWlsLCwgKF9NZG91YmxlXyBfX3gpLCAoX19jb25zdF9fKSk7CisKKy8qIEFic29sdXRlIHZhbHVlIG9mIFguICAqLworX19NQVRIQ0FMTFggKGZhYnMsLCAoX01kb3VibGVfIF9feCksIChfX2NvbnN0X18pKTsKKworLyogTGFyZ2VzdCBpbnRlZ2VyIG5vdCBncmVhdGVyIHRoYW4gWC4gICovCitfX01BVEhDQUxMWCAoZmxvb3IsLCAoX01kb3VibGVfIF9feCksIChfX2NvbnN0X18pKTsKKworLyogRmxvYXRpbmctcG9pbnQgbW9kdWxvIHJlbWFpbmRlciBvZiBYL1kuICAqLworX19NQVRIQ0FMTCAoZm1vZCwsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gX195KSk7CisKKworLyogUmV0dXJuIDAgaWYgVkFMVUUgaXMgZmluaXRlIG9yIE5hTiwgKzEgaWYgaXQKKyAgIGlzICtJbmZpbml0eSwgLTEgaWYgaXQgaXMgLUluZmluaXR5LiAgKi8KK19fTUFUSERFQ0xfMSAoaW50LF9faXNpbmYsLCAoX01kb3VibGVfIF9fdmFsdWUpKSBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKy8qIFJldHVybiBub256ZXJvIGlmIFZBTFVFIGlzIGZpbml0ZSBhbmQgbm90IE5hTi4gICovCitfX01BVEhERUNMXzEgKGludCxfX2Zpbml0ZSwsIChfTWRvdWJsZV8gX192YWx1ZSkpIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKK19NZG91YmxlX0VORF9OQU1FU1BBQ0UKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIFJldHVybiAwIGlmIFZBTFVFIGlzIGZpbml0ZSBvciBOYU4sICsxIGlmIGl0CisgICBpcyArSW5maW5pdHksIC0xIGlmIGl0IGlzIC1JbmZpbml0eS4gICovCitfX01BVEhERUNMXzEgKGludCxpc2luZiwsIChfTWRvdWJsZV8gX192YWx1ZSkpIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworLyogUmV0dXJuIG5vbnplcm8gaWYgVkFMVUUgaXMgZmluaXRlIGFuZCBub3QgTmFOLiAgKi8KK19fTUFUSERFQ0xfMSAoaW50LGZpbml0ZSwsIChfTWRvdWJsZV8gX192YWx1ZSkpIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworLyogUmV0dXJuIHRoZSByZW1haW5kZXIgb2YgWC9ZLiAgKi8KK19fTUFUSENBTEwgKGRyZW0sLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9feSkpOworCisKKy8qIFJldHVybiB0aGUgZnJhY3Rpb25hbCBwYXJ0IG9mIFggYWZ0ZXIgZGl2aWRpbmcgb3V0IGBpbG9nYiAoWCknLiAgKi8KK19fTUFUSENBTEwgKHNpZ25pZmljYW5kLCwgKF9NZG91YmxlXyBfX3gpKTsKKyNlbmRpZiAvKiBVc2UgbWlzYy4gICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogUmV0dXJuIFggd2l0aCBpdHMgc2lnbmVkIGNoYW5nZWQgdG8gWSdzLiAgKi8KK19fTUFUSENBTExYIChjb3B5c2lnbiwsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gX195KSwgKF9fY29uc3RfXykpOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogUmV0dXJuIHJlcHJlc2VudGF0aW9uIG9mIE5hTiBmb3IgZG91YmxlIHR5cGUuICAqLworX19NQVRIQ0FMTFggKG5hbiwsIChfX2NvbnN0IGNoYXIgKl9fdGFnYiksIChfX2NvbnN0X18pKTsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisKKy8qIFJldHVybiBub256ZXJvIGlmIFZBTFVFIGlzIG5vdCBhIG51bWJlci4gICovCitfX01BVEhERUNMXzEgKGludCxfX2lzbmFuLCwgKF9NZG91YmxlXyBfX3ZhbHVlKSkgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKy8qIFJldHVybiBub256ZXJvIGlmIFZBTFVFIGlzIG5vdCBhIG51bWJlci4gICovCitfX01BVEhERUNMXzEgKGludCxpc25hbiwsIChfTWRvdWJsZV8gX192YWx1ZSkpIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworLyogQmVzc2VsIGZ1bmN0aW9ucy4gICovCitfX01BVEhDQUxMIChqMCwsIChfTWRvdWJsZV8pKTsKK19fTUFUSENBTEwgKGoxLCwgKF9NZG91YmxlXykpOworX19NQVRIQ0FMTCAoam4sLCAoaW50LCBfTWRvdWJsZV8pKTsKK19fTUFUSENBTEwgKHkwLCwgKF9NZG91YmxlXykpOworX19NQVRIQ0FMTCAoeTEsLCAoX01kb3VibGVfKSk7CitfX01BVEhDQUxMICh5biwsIChpbnQsIF9NZG91YmxlXykpOworI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIEVycm9yIGFuZCBnYW1tYSBmdW5jdGlvbnMuICAqLworX19NQVRIQ0FMTCAoZXJmLCwgKF9NZG91YmxlXykpOworX19NQVRIQ0FMTCAoZXJmYywsIChfTWRvdWJsZV8pKTsKK19fTUFUSENBTEwgKGxnYW1tYSwsIChfTWRvdWJsZV8pKTsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIFRydWUgZ2FtbWEgZnVuY3Rpb24uICAqLworX19NQVRIQ0FMTCAodGdhbW1hLCwgKF9NZG91YmxlXykpOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorLyogT2Jzb2xldGUgYWxpYXMgZm9yIGBsZ2FtbWEnLiAgKi8KK19fTUFUSENBTEwgKGdhbW1hLCwgKF9NZG91YmxlXykpOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBSZWVudHJhbnQgdmVyc2lvbiBvZiBsZ2FtbWEuICBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGdsb2JhbCB2YXJpYWJsZQorICAgYHNpZ25nYW0nLiAgVGhlIHJlZW50cmFudCB2ZXJzaW9uIGluc3RlYWQgdGFrZXMgYSBwb2ludGVyIGFuZCBzdG9yZXMKKyAgIHRoZSB2YWx1ZSB0aHJvdWdoIGl0LiAgKi8KK19fTUFUSENBTEwgKGxnYW1tYSxfciwgKF9NZG91YmxlXywgaW50ICpfX3NpZ25nYW1wKSk7CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogUmV0dXJuIHRoZSBpbnRlZ2VyIG5lYXJlc3QgWCBpbiB0aGUgZGlyZWN0aW9uIG9mIHRoZQorICAgcHJldmFpbGluZyByb3VuZGluZyBtb2RlLiAgKi8KK19fTUFUSENBTEwgKHJpbnQsLCAoX01kb3VibGVfIF9feCkpOworCisvKiBSZXR1cm4gWCArIGVwc2lsb24gaWYgWCA8IFksIFggLSBlcHNpbG9uIGlmIFggPiBZLiAgKi8KK19fTUFUSENBTExYIChuZXh0YWZ0ZXIsLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9feSksIChfX2NvbnN0X18pKTsKKyMgaWYgZGVmaW5lZCBfX1VTRV9JU09DOTkgJiYgIWRlZmluZWQgX19MREJMX0NPTVBBVAorX19NQVRIQ0FMTFggKG5leHR0b3dhcmQsLCAoX01kb3VibGVfIF9feCwgbG9uZyBkb3VibGUgX195KSwgKF9fY29uc3RfXykpOworIyBlbmRpZgorCisvKiBSZXR1cm4gdGhlIHJlbWFpbmRlciBvZiBpbnRlZ2VyIGRpdmlzb24gWCAvIFkgd2l0aCBpbmZpbml0ZSBwcmVjaXNpb24uICAqLworX19NQVRIQ0FMTCAocmVtYWluZGVyLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3kpKTsKKworIyBpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKKy8qIFJldHVybiBYIHRpbWVzICgyIHRvIHRoZSBOdGggcG93ZXIpLiAgKi8KK19fTUFUSENBTEwgKHNjYWxibiwsIChfTWRvdWJsZV8gX194LCBpbnQgX19uKSk7CisjIGVuZGlmCisKKy8qIFJldHVybiB0aGUgYmluYXJ5IGV4cG9uZW50IG9mIFgsIHdoaWNoIG11c3QgYmUgbm9uemVyby4gICovCitfX01BVEhERUNMIChpbnQsaWxvZ2IsLCAoX01kb3VibGVfIF9feCkpOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9JU09DOTkKKy8qIFJldHVybiBYIHRpbWVzICgyIHRvIHRoZSBOdGggcG93ZXIpLiAgKi8KK19fTUFUSENBTEwgKHNjYWxibG4sLCAoX01kb3VibGVfIF9feCwgbG9uZyBpbnQgX19uKSk7CisKKy8qIFJvdW5kIFggdG8gaW50ZWdyYWwgdmFsdWUgaW4gZmxvYXRpbmctcG9pbnQgZm9ybWF0IHVzaW5nIGN1cnJlbnQKKyAgIHJvdW5kaW5nIGRpcmVjdGlvbiwgYnV0IGRvIG5vdCByYWlzZSBpbmV4YWN0IGV4Y2VwdGlvbi4gICovCitfX01BVEhDQUxMIChuZWFyYnlpbnQsLCAoX01kb3VibGVfIF9feCkpOworCisvKiBSb3VuZCBYIHRvIG5lYXJlc3QgaW50ZWdyYWwgdmFsdWUsIHJvdW5kaW5nIGhhbGZ3YXkgY2FzZXMgYXdheSBmcm9tCisgICB6ZXJvLiAgKi8KK19fTUFUSENBTExYIChyb3VuZCwsIChfTWRvdWJsZV8gX194KSwgKF9fY29uc3RfXykpOworCisvKiBSb3VuZCBYIHRvIHRoZSBpbnRlZ3JhbCB2YWx1ZSBpbiBmbG9hdGluZy1wb2ludCBmb3JtYXQgbmVhcmVzdCBidXQKKyAgIG5vdCBsYXJnZXIgaW4gbWFnbml0dWRlLiAgKi8KK19fTUFUSENBTExYICh0cnVuYywsIChfTWRvdWJsZV8gX194KSwgKF9fY29uc3RfXykpOworCisvKiBDb21wdXRlIHJlbWFpbmRlciBvZiBYIGFuZCBZIGFuZCBwdXQgaW4gKlFVTyBhIHZhbHVlIHdpdGggc2lnbiBvZiB4L3kKKyAgIGFuZCBtYWduaXR1ZGUgY29uZ3J1ZW50IGBtb2QgMl5uJyB0byB0aGUgbWFnbml0dWRlIG9mIHRoZSBpbnRlZ3JhbAorICAgcXVvdGllbnQgeC95LCB3aXRoIG4gPj0gMy4gICovCitfX01BVEhDQUxMIChyZW1xdW8sLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9feSwgaW50ICpfX3F1bykpOworCisKKy8qIENvbnZlcnNpb24gZnVuY3Rpb25zLiAgKi8KKworLyogUm91bmQgWCB0byBuZWFyZXN0IGludGVncmFsIHZhbHVlIGFjY29yZGluZyB0byBjdXJyZW50IHJvdW5kaW5nCisgICBkaXJlY3Rpb24uICAqLworX19NQVRIREVDTCAobG9uZyBpbnQsbHJpbnQsLCAoX01kb3VibGVfIF9feCkpOworX19NQVRIREVDTCAobG9uZyBsb25nIGludCxsbHJpbnQsLCAoX01kb3VibGVfIF9feCkpOworCisvKiBSb3VuZCBYIHRvIG5lYXJlc3QgaW50ZWdyYWwgdmFsdWUsIHJvdW5kaW5nIGhhbGZ3YXkgY2FzZXMgYXdheSBmcm9tCisgICB6ZXJvLiAgKi8KK19fTUFUSERFQ0wgKGxvbmcgaW50LGxyb3VuZCwsIChfTWRvdWJsZV8gX194KSk7CitfX01BVEhERUNMIChsb25nIGxvbmcgaW50LGxscm91bmQsLCAoX01kb3VibGVfIF9feCkpOworCisKKy8qIFJldHVybiBwb3NpdGl2ZSBkaWZmZXJlbmNlIGJldHdlZW4gWCBhbmQgWS4gICovCitfX01BVEhDQUxMIChmZGltLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3kpKTsKKworLyogUmV0dXJuIG1heGltdW0gbnVtZXJpYyB2YWx1ZSBmcm9tIFggYW5kIFkuICAqLworX19NQVRIQ0FMTCAoZm1heCwsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gX195KSk7CisKKy8qIFJldHVybiBtaW5pbXVtIG51bWVyaWMgdmFsdWUgZnJvbSBYIGFuZCBZLiAgKi8KK19fTUFUSENBTEwgKGZtaW4sLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9feSkpOworCisKKy8qIENsYXNzaWZ5IGdpdmVuIG51bWJlci4gICovCitfX01BVEhERUNMXzEgKGludCwgX19mcGNsYXNzaWZ5LCwgKF9NZG91YmxlXyBfX3ZhbHVlKSkKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisvKiBUZXN0IGZvciBuZWdhdGl2ZSBudW1iZXIuICAqLworX19NQVRIREVDTF8xIChpbnQsIF9fc2lnbmJpdCwsIChfTWRvdWJsZV8gX192YWx1ZSkpCisgICAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworCisvKiBNdWx0aXBseS1hZGQgZnVuY3Rpb24gY29tcHV0ZWQgYXMgYSB0ZXJuYXJ5IG9wZXJhdGlvbi4gICovCitfX01BVEhDQUxMIChmbWEsLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9feSwgX01kb3VibGVfIF9feikpOworI2VuZGlmIC8qIFVzZSBJU08gQzk5LiAgKi8KKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBSZXR1cm4gWCB0aW1lcyAoMiB0byB0aGUgTnRoIHBvd2VyKS4gICovCitfX01BVEhDQUxMIChzY2FsYiwsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gX19uKSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9tYXRoZGVmLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbWF0aGRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3OWViOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbWF0aGRlZi5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwNCwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIF9NQVRIX0ggJiYgIWRlZmluZWQgX0NPTVBMRVhfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL21hdGhkZWYuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPG1hdGguaD4gaW5zdGVhZCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9JU09DOTkgJiYgZGVmaW5lZCBfTUFUSF9IICYmICFkZWZpbmVkIF9NQVRIX0hfTUFUSERFRgorIyBkZWZpbmUgX01BVEhfSF9NQVRIREVGCTEKKworIyBpZiBkZWZpbmVkIF9fRkxUX0VWQUxfTUVUSE9EX18gJiYgX19GTFRfRVZBTF9NRVRIT0RfXyA9PSAwCisvKiBXaGVuIHVzaW5nIC1tZnBtYXRoPXNzZSwgdmFsdWVzIGFyZSBjb21wdXRlZCB3aXRoIHRoZSBwcmVjaXNzaW9uIG9mIHRoZQorICAgdXNlZCB0eXBlLiAgKi8KK3R5cGVkZWYgZmxvYXQgZmxvYXRfdDsJCS8qIGBmbG9hdCcgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBhcyBgZmxvYXQnLiAgKi8KK3R5cGVkZWYgZG91YmxlIGRvdWJsZV90OwkvKiBgZG91YmxlJyBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGFzCisJCQkJICAgYGRvdWJsZScuICAqLworIyBlbHNlCisvKiBUaGUgaXg4NyBGUFVzIGV2YWx1YXRlIGFsbCB2YWx1ZXMgaW4gdGhlIDgwIGJpdCBmbG9hdGluZy1wb2ludCBmb3JtYXQKKyAgIHdoaWNoIGlzIGFsc28gYXZhaWxhYmxlIGZvciB0aGUgdXNlciBhcyBgbG9uZyBkb3VibGUnLiAgVGhlcmVmb3JlIHdlCisgICBkZWZpbmU6ICAqLwordHlwZWRlZiBsb25nIGRvdWJsZSBmbG9hdF90OwkvKiBgZmxvYXQnIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgYXMKKwkJCQkgICBgbG9uZyBkb3VibGUnLiAgKi8KK3R5cGVkZWYgbG9uZyBkb3VibGUgZG91YmxlX3Q7CS8qIGBkb3VibGUnIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgYXMKKwkJCQkgICBgbG9uZyBkb3VibGUnLiAgKi8KKyMgZW5kaWYKKworLyogVGhlIHZhbHVlcyByZXR1cm5lZCBieSBgaWxvZ2InIGZvciAwIGFuZCBOYU4gcmVzcGVjdGl2ZWx5LiAgKi8KKyMgZGVmaW5lIEZQX0lMT0dCMAkoLTIxNDc0ODM2NDcgLSAxKQorIyBkZWZpbmUgRlBfSUxPR0JOQU4JKC0yMTQ3NDgzNjQ3IC0gMSkKKworLyogVGhlIEdDQyA0LjYgY29tcGlsZXIgd2lsbCBkZWZpbmUgX19GUF9GQVNUX0ZNQXssRixMfSBpZiB0aGUgZm1heyxmLGx9CisgICBidWlsdGlucyBhcmUgc3VwcG9ydGVkLiAgKi8KKyMgaWYgX19GUF9GQVNUX0ZNQQorIyAgZGVmaW5lIEZQX0ZBU1RfRk1BIDEKKyMgZW5kaWYKKworIyBpZiBfX0ZQX0ZBU1RfRk1BRgorIyAgZGVmaW5lIEZQX0ZBU1RfRk1BRiAxCisjIGVuZGlmCisKKyMgaWYgX19GUF9GQVNUX0ZNQUwKKyMgIGRlZmluZSBGUF9GQVNUX0ZNQUwgMQorIyBlbmRpZgorCisjZW5kaWYJLyogSVNPIEM5OSAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL21hdGhpbmxpbmUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9tYXRoaW5saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2ZWMyYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9tYXRoaW5saW5lLmgKQEAgLTAsMCArMSw3NzEgQEAKKy8qIElubGluZSBtYXRoIGZ1bmN0aW9ucyBmb3IgaTM4Ny4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwxOTk2LDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSwyMDAzLDIwMDQsMjAwNiwyMDA3LDIwMDksCisgICAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgICBDb250cmlidXRlZCBieSBKb2huIEMuIEJvd21hbiA8Ym93bWFuQG1hdGgudWFsYmVydGEuY2E+LCAxOTk1LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTUFUSF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvbWF0aGlubGluZS5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bWF0aC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fZXh0ZXJuX2lubGluZQorIyBkZWZpbmUgX19NQVRIX0lOTElORSBfX2lubGluZQorI2Vsc2UKKyMgZGVmaW5lIF9fTUFUSF9JTkxJTkUgX19leHRlcm5faW5saW5lCisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX1VTRV9JU09DOTkgJiYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyCisvKiBHQ0MgMi45NyBhbmQgdXAgaGF2ZSBidWlsdGlucyB0aGF0IGFjdHVhbGx5IGNhbiBiZSB1c2VkLiAgKi8KKyMgaWYgIV9fR05VQ19QUkVSRVEgKDIsOTcpCisvKiBJU08gQzk5IGRlZmluZXMgc29tZSBtYWNyb3MgdG8gcGVyZm9ybSB1bm9yZGVyZWQgY29tcGFyaXNvbnMuICBUaGUKKyAgIGl4ODcgRlBVIHN1cHBvcnRzIHRoaXMgd2l0aCBzcGVjaWFsIG9wY29kZXMgYW5kIHdlIHNob3VsZCB1c2UgdGhlbS4KKyAgIFRoZXNlIG11c3Qgbm90IGJlIGlubGluZSBmdW5jdGlvbnMgc2luY2Ugd2UgaGF2ZSB0byBiZSBhYmxlIHRvIGhhbmRsZQorICAgYWxsIGZsb2F0aW5nLXBvaW50IHR5cGVzLiAgKi8KKyMgIHVuZGVmIGlzZ3JlYXRlcgorIyAgdW5kZWYgaXNncmVhdGVyZXF1YWwKKyMgIHVuZGVmIGlzbGVzcworIyAgdW5kZWYgaXNsZXNzZXF1YWwKKyMgIHVuZGVmIGlzbGVzc2dyZWF0ZXIKKyMgIHVuZGVmIGlzdW5vcmRlcmVkCisjICBpZmRlZiBfX2k2ODZfXworLyogRm9yIHRoZSBQZW50aXVtUHJvIGFuZCBtb3JlIHJlY2VudCBwcm9jZXNzb3JzIHdlIGNhbiBwcm92aWRlCisgICBiZXR0ZXIgY29kZS4gICovCisjICAgZGVmaW5lIGlzZ3JlYXRlcih4LCB5KSBcCisgICAgICh7IHJlZ2lzdGVyIGNoYXIgX19yZXN1bHQ7CQkJCQkJICAgICAgXAorCV9fYXNtX18gKCJmdWNvbWlwICUlc3QoMSksICUlc3Q7IHNldGEgJSVhbCIJCQkgICAgICBcCisJCSA6ICI9YSIgKF9fcmVzdWx0KSA6ICJ1IiAoeSksICJ0IiAoeCkgOiAiY2MiLCAic3QiKTsJICAgICAgXAorCV9fcmVzdWx0OyB9KQorIyAgIGRlZmluZSBpc2dyZWF0ZXJlcXVhbCh4LCB5KSBcCisgICAgICh7IHJlZ2lzdGVyIGNoYXIgX19yZXN1bHQ7CQkJCQkJICAgICAgXAorCV9fYXNtX18gKCJmdWNvbWlwICUlc3QoMSksICUlc3Q7IHNldGFlICUlYWwiCQkJICAgICAgXAorCQkgOiAiPWEiIChfX3Jlc3VsdCkgOiAidSIgKHkpLCAidCIgKHgpIDogImNjIiwgInN0Iik7CSAgICAgIFwKKwlfX3Jlc3VsdDsgfSkKKworIyAgIGRlZmluZSBpc2xlc3MoeCwgeSkgXAorICAgICAoeyByZWdpc3RlciBjaGFyIF9fcmVzdWx0OwkJCQkJCSAgICAgIFwKKwlfX2FzbV9fICgiZnVjb21pcCAlJXN0KDEpLCAlJXN0OyBzZXRhICUlYWwiCQkJICAgICAgXAorCQkgOiAiPWEiIChfX3Jlc3VsdCkgOiAidSIgKHgpLCAidCIgKHkpIDogImNjIiwgInN0Iik7CSAgICAgIFwKKwlfX3Jlc3VsdDsgfSkKKworIyAgIGRlZmluZSBpc2xlc3NlcXVhbCh4LCB5KSBcCisgICAgICh7IHJlZ2lzdGVyIGNoYXIgX19yZXN1bHQ7CQkJCQkJICAgICAgXAorCV9fYXNtX18gKCJmdWNvbWlwICUlc3QoMSksICUlc3Q7IHNldGFlICUlYWwiCQkJICAgICAgXAorCQkgOiAiPWEiIChfX3Jlc3VsdCkgOiAidSIgKHgpLCAidCIgKHkpIDogImNjIiwgInN0Iik7CSAgICAgIFwKKwlfX3Jlc3VsdDsgfSkKKworIyAgIGRlZmluZSBpc2xlc3NncmVhdGVyKHgsIHkpIFwKKyAgICAgKHsgcmVnaXN0ZXIgY2hhciBfX3Jlc3VsdDsJCQkJCQkgICAgICBcCisJX19hc21fXyAoImZ1Y29taXAgJSVzdCgxKSwgJSVzdDsgc2V0bmUgJSVhbCIJCQkgICAgICBcCisJCSA6ICI9YSIgKF9fcmVzdWx0KSA6ICJ1IiAoeSksICJ0IiAoeCkgOiAiY2MiLCAic3QiKTsJICAgICAgXAorCV9fcmVzdWx0OyB9KQorCisjICAgZGVmaW5lIGlzdW5vcmRlcmVkKHgsIHkpIFwKKyAgICAgKHsgcmVnaXN0ZXIgY2hhciBfX3Jlc3VsdDsJCQkJCQkgICAgICBcCisJX19hc21fXyAoImZ1Y29taXAgJSVzdCgxKSwgJSVzdDsgc2V0cCAlJWFsIgkJCSAgICAgIFwKKwkJIDogIj1hIiAoX19yZXN1bHQpIDogInUiICh5KSwgInQiICh4KSA6ICJjYyIsICJzdCIpOwkgICAgICBcCisJX19yZXN1bHQ7IH0pCisjICBlbHNlCisvKiBUaGlzIGlzIHRoZSBkdW1iLCBwb3J0YWJsZSBjb2RlIGZvciBpMzg2IGFuZCBhYm92ZS4gICovCisjICAgZGVmaW5lIGlzZ3JlYXRlcih4LCB5KSBcCisgICAgICh7IHJlZ2lzdGVyIGNoYXIgX19yZXN1bHQ7CQkJCQkJICAgICAgXAorCV9fYXNtX18gKCJmdWNvbXBwOyBmbnN0c3c7IHRlc3RiICQweDQ1LCAlJWFoOyBzZXR6ICUlYWwiCSAgICAgIFwKKwkJIDogIj1hIiAoX19yZXN1bHQpIDogInUiICh5KSwgInQiICh4KSA6ICJjYyIsICJzdCIsICJzdCgxKSIpOyBcCisJX19yZXN1bHQ7IH0pCisKKyMgICBkZWZpbmUgaXNncmVhdGVyZXF1YWwoeCwgeSkgXAorICAgICAoeyByZWdpc3RlciBjaGFyIF9fcmVzdWx0OwkJCQkJCSAgICAgIFwKKwlfX2FzbV9fICgiZnVjb21wcDsgZm5zdHN3OyB0ZXN0YiAkMHgwNSwgJSVhaDsgc2V0eiAlJWFsIgkgICAgICBcCisJCSA6ICI9YSIgKF9fcmVzdWx0KSA6ICJ1IiAoeSksICJ0IiAoeCkgOiAiY2MiLCAic3QiLCAic3QoMSkiKTsgXAorCV9fcmVzdWx0OyB9KQorCisjICAgZGVmaW5lIGlzbGVzcyh4LCB5KSBcCisgICAgICh7IHJlZ2lzdGVyIGNoYXIgX19yZXN1bHQ7CQkJCQkJICAgICAgXAorCV9fYXNtX18gKCJmdWNvbXBwOyBmbnN0c3c7IHRlc3RiICQweDQ1LCAlJWFoOyBzZXR6ICUlYWwiCSAgICAgIFwKKwkJIDogIj1hIiAoX19yZXN1bHQpIDogInUiICh4KSwgInQiICh5KSA6ICJjYyIsICJzdCIsICJzdCgxKSIpOyBcCisJX19yZXN1bHQ7IH0pCisKKyMgICBkZWZpbmUgaXNsZXNzZXF1YWwoeCwgeSkgXAorICAgICAoeyByZWdpc3RlciBjaGFyIF9fcmVzdWx0OwkJCQkJCSAgICAgIFwKKwlfX2FzbV9fICgiZnVjb21wcDsgZm5zdHN3OyB0ZXN0YiAkMHgwNSwgJSVhaDsgc2V0eiAlJWFsIgkgICAgICBcCisJCSA6ICI9YSIgKF9fcmVzdWx0KSA6ICJ1IiAoeCksICJ0IiAoeSkgOiAiY2MiLCAic3QiLCAic3QoMSkiKTsgXAorCV9fcmVzdWx0OyB9KQorCisjICAgZGVmaW5lIGlzbGVzc2dyZWF0ZXIoeCwgeSkgXAorICAgICAoeyByZWdpc3RlciBjaGFyIF9fcmVzdWx0OwkJCQkJCSAgICAgIFwKKwlfX2FzbV9fICgiZnVjb21wcDsgZm5zdHN3OyB0ZXN0YiAkMHg0NCwgJSVhaDsgc2V0eiAlJWFsIgkgICAgICBcCisJCSA6ICI9YSIgKF9fcmVzdWx0KSA6ICJ1IiAoeSksICJ0IiAoeCkgOiAiY2MiLCAic3QiLCAic3QoMSkiKTsgXAorCV9fcmVzdWx0OyB9KQorCisjICAgZGVmaW5lIGlzdW5vcmRlcmVkKHgsIHkpIFwKKyAgICAgKHsgcmVnaXN0ZXIgY2hhciBfX3Jlc3VsdDsJCQkJCQkgICAgICBcCisJX19hc21fXyAoImZ1Y29tcHA7IGZuc3Rzdzsgc2FoZjsgc2V0cCAlJWFsIgkJCSAgICAgIFwKKwkJIDogIj1hIiAoX19yZXN1bHQpIDogInUiICh5KSwgInQiICh4KSA6ICJjYyIsICJzdCIsICJzdCgxKSIpOyBcCisJX19yZXN1bHQ7IH0pCisjICBlbmRpZiAvKiBfX2k2ODZfXyAqLworIyBlbmRpZgkvKiBHQ0MgMi45NyAqLworCisvKiBUaGUgZ2NjLCB2ZXJzaW9uIDIuNyBvciBiZWxvdywgaGFzIHByb2JsZW1zIHdpdGggYWxsIHRoaXMgaW5saW5pbmcKKyAgIGNvZGUuICBTbyBkaXNhYmxlIGl0IGZvciB0aGlzIHZlcnNpb24gb2YgdGhlIGNvbXBpbGVyLiAgKi8KKyMgaWYgX19HTlVDX1BSRVJFUSAoMiwgOCkKKy8qIFRlc3QgZm9yIG5lZ2F0aXZlIG51bWJlci4gIFVzZWQgaW4gdGhlIHNpZ25iaXQoKSBtYWNyby4gICovCitfX01BVEhfSU5MSU5FIGludAorX19OVEggKF9fc2lnbmJpdGYgKGZsb2F0IF9feCkpCit7CisgIF9fZXh0ZW5zaW9uX18gdW5pb24geyBmbG9hdCBfX2Y7IGludCBfX2k7IH0gX191ID0geyBfX2Y6IF9feCB9OworICByZXR1cm4gX191Ll9faSA8IDA7Cit9CitfX01BVEhfSU5MSU5FIGludAorX19OVEggKF9fc2lnbmJpdCAoZG91YmxlIF9feCkpCit7CisgIF9fZXh0ZW5zaW9uX18gdW5pb24geyBkb3VibGUgX19kOyBpbnQgX19pWzJdOyB9IF9fdSA9IHsgX19kOiBfX3ggfTsKKyAgcmV0dXJuIF9fdS5fX2lbMV0gPCAwOworfQorX19NQVRIX0lOTElORSBpbnQKK19fTlRIIChfX3NpZ25iaXRsIChsb25nIGRvdWJsZSBfX3gpKQoreworICBfX2V4dGVuc2lvbl9fIHVuaW9uIHsgbG9uZyBkb3VibGUgX19sOyBpbnQgX19pWzNdOyB9IF9fdSA9IHsgX19sOiBfX3ggfTsKKyAgcmV0dXJuIChfX3UuX19pWzJdICYgMHg4MDAwKSAhPSAwOworfQorIyBlbmRpZgorI2VuZGlmCisKKworLyogVGhlIGdjYywgdmVyc2lvbiAyLjcgb3IgYmVsb3csIGhhcyBwcm9ibGVtcyB3aXRoIGFsbCB0aGlzIGlubGluaW5nCisgICBjb2RlLiAgU28gZGlzYWJsZSBpdCBmb3IgdGhpcyB2ZXJzaW9uIG9mIHRoZSBjb21waWxlci4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMiwgOCkKKworI2lmICgoIWRlZmluZWQgX19OT19NQVRIX0lOTElORVMgfHwgZGVmaW5lZCBfX0xJQkNfSU5URVJOQUxfTUFUSF9JTkxJTkVTKSBcCisgICAgICYmIGRlZmluZWQgX19PUFRJTUlaRV9fKQorCisvKiBUaGUgaW5saW5lIGZ1bmN0aW9ucyBkbyBub3Qgc2V0IGVycm5vIG9yIHJhaXNlIG5lY2Vzc2FyaWx5IHRoZQorICAgY29ycmVjdCBleGNlcHRpb25zLiAgKi8KKyMgdW5kZWYgbWF0aF9lcnJoYW5kbGluZworCisvKiBBIG1hY3JvIHRvIGRlZmluZSBmbG9hdCwgZG91YmxlLCBhbmQgbG9uZyBkb3VibGUgdmVyc2lvbnMgb2YgdmFyaW91cworICAgbWF0aCBmdW5jdGlvbnMgZm9yIHRoZSBpeDg3IEZQVS4gIEZVTkMgaXMgdGhlIGZ1bmN0aW9uIG5hbWUgKHdoaWNoIHdpbGwKKyAgIGJlIHN1ZmZpeGVkIHdpdGggZiBhbmQgbCBmb3IgdGhlIGZsb2F0IGFuZCBsb25nIGRvdWJsZSB2ZXJzaW9uLAorICAgcmVzcGVjdGl2ZWx5KS4gIE9QIGlzIHRoZSBuYW1lIG9mIHRoZSBGUFUgb3BlcmF0aW9uLgorICAgV2UgZGVmaW5lIHR3byBzZXRzIG9mIG1hY3Jvcy4gIFRoZSBzZXQgd2l0aCB0aGUgYWRkaXRpb25hbCBOUAorICAgZG9lc24ndCBhZGQgYSBwcm90b3R5cGUgZGVjbGFyYXRpb24uICAqLworCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CisjIGRlZmluZSBfX2lubGluZV9tYXRob3AoZnVuYywgb3ApIFwKKyAgX19pbmxpbmVfbWF0aG9wXyAoZG91YmxlLCBmdW5jLCBvcCkJCQkJCSAgICAgIFwKKyAgX19pbmxpbmVfbWF0aG9wXyAoZmxvYXQsIF9fQ09OQ0FUKGZ1bmMsZiksIG9wKQkJCSAgICAgIFwKKyAgX19pbmxpbmVfbWF0aG9wXyAobG9uZyBkb3VibGUsIF9fQ09OQ0FUKGZ1bmMsbCksIG9wKQorIyBkZWZpbmUgX19pbmxpbmVfbWF0aG9wTlAoZnVuYywgb3ApIFwKKyAgX19pbmxpbmVfbWF0aG9wTlBfIChkb3VibGUsIGZ1bmMsIG9wKQkJCQkJICAgICAgXAorICBfX2lubGluZV9tYXRob3BOUF8gKGZsb2F0LCBfX0NPTkNBVChmdW5jLGYpLCBvcCkJCQkgICAgICBcCisgIF9faW5saW5lX21hdGhvcE5QXyAobG9uZyBkb3VibGUsIF9fQ09OQ0FUKGZ1bmMsbCksIG9wKQorI2Vsc2UKKyMgZGVmaW5lIF9faW5saW5lX21hdGhvcChmdW5jLCBvcCkgXAorICBfX2lubGluZV9tYXRob3BfIChkb3VibGUsIGZ1bmMsIG9wKQorIyBkZWZpbmUgX19pbmxpbmVfbWF0aG9wTlAoZnVuYywgb3ApIFwKKyAgX19pbmxpbmVfbWF0aG9wTlBfIChkb3VibGUsIGZ1bmMsIG9wKQorI2VuZGlmCisKKyNkZWZpbmUgX19pbmxpbmVfbWF0aG9wXyhmbG9hdF90eXBlLCBmdW5jLCBvcCkgXAorICBfX2lubGluZV9tYXRob3BfZGVjbF8gKGZsb2F0X3R5cGUsIGZ1bmMsIG9wLCAiMCIgKF9feCkpCisjZGVmaW5lIF9faW5saW5lX21hdGhvcE5QXyhmbG9hdF90eXBlLCBmdW5jLCBvcCkgXAorICBfX2lubGluZV9tYXRob3BfZGVjbE5QXyAoZmxvYXRfdHlwZSwgZnVuYywgb3AsICIwIiAoX194KSkKKworCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CisjIGRlZmluZSBfX2lubGluZV9tYXRob3BfZGVjbChmdW5jLCBvcCwgcGFyYW1zLi4uKSBcCisgIF9faW5saW5lX21hdGhvcF9kZWNsXyAoZG91YmxlLCBmdW5jLCBvcCwgcGFyYW1zKQkJCSAgICAgIFwKKyAgX19pbmxpbmVfbWF0aG9wX2RlY2xfIChmbG9hdCwgX19DT05DQVQoZnVuYyxmKSwgb3AsIHBhcmFtcykJCSAgICAgIFwKKyAgX19pbmxpbmVfbWF0aG9wX2RlY2xfIChsb25nIGRvdWJsZSwgX19DT05DQVQoZnVuYyxsKSwgb3AsIHBhcmFtcykKKyMgZGVmaW5lIF9faW5saW5lX21hdGhvcF9kZWNsTlAoZnVuYywgb3AsIHBhcmFtcy4uLikgXAorICBfX2lubGluZV9tYXRob3BfZGVjbE5QXyAoZG91YmxlLCBmdW5jLCBvcCwgcGFyYW1zKQkJCSAgICAgIFwKKyAgX19pbmxpbmVfbWF0aG9wX2RlY2xOUF8gKGZsb2F0LCBfX0NPTkNBVChmdW5jLGYpLCBvcCwgcGFyYW1zKQkJICAgICAgXAorICBfX2lubGluZV9tYXRob3BfZGVjbE5QXyAobG9uZyBkb3VibGUsIF9fQ09OQ0FUKGZ1bmMsbCksIG9wLCBwYXJhbXMpCisjZWxzZQorIyBkZWZpbmUgX19pbmxpbmVfbWF0aG9wX2RlY2woZnVuYywgb3AsIHBhcmFtcy4uLikgXAorICBfX2lubGluZV9tYXRob3BfZGVjbF8gKGRvdWJsZSwgZnVuYywgb3AsIHBhcmFtcykKKyMgZGVmaW5lIF9faW5saW5lX21hdGhvcF9kZWNsTlAoZnVuYywgb3AsIHBhcmFtcy4uLikgXAorICBfX2lubGluZV9tYXRob3BfZGVjbE5QXyAoZG91YmxlLCBmdW5jLCBvcCwgcGFyYW1zKQorI2VuZGlmCisKKyNkZWZpbmUgX19pbmxpbmVfbWF0aG9wX2RlY2xfKGZsb2F0X3R5cGUsIGZ1bmMsIG9wLCBwYXJhbXMuLi4pIFwKKyAgX19NQVRIX0lOTElORSBmbG9hdF90eXBlIGZ1bmMgKGZsb2F0X3R5cGUpIF9fVEhST1c7CQkJICAgICAgXAorICBfX2lubGluZV9tYXRob3BfZGVjbE5QXyAoZmxvYXRfdHlwZSwgZnVuYywgb3AsIHBhcmFtcykKKworI2RlZmluZSBfX2lubGluZV9tYXRob3BfZGVjbE5QXyhmbG9hdF90eXBlLCBmdW5jLCBvcCwgcGFyYW1zLi4uKSBcCisgIF9fTUFUSF9JTkxJTkUgZmxvYXRfdHlwZSBfX05USCAoZnVuYyAoZmxvYXRfdHlwZSBfX3gpKQkJICAgICAgXAorICB7CQkJCQkJCQkJICAgICAgXAorICAgIHJlZ2lzdGVyIGZsb2F0X3R5cGUgX19yZXN1bHQ7CQkJCQkgICAgICBcCisgICAgX19hc20gX192b2xhdGlsZV9fIChvcCA6ICI9dCIgKF9fcmVzdWx0KSA6IHBhcmFtcyk7CQkJICAgICAgXAorICAgIHJldHVybiBfX3Jlc3VsdDsJCQkJCQkJICAgICAgXAorICB9CisKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorIyBkZWZpbmUgX19pbmxpbmVfbWF0aGNvZGUoZnVuYywgYXJnLCBjb2RlKSBcCisgIF9faW5saW5lX21hdGhjb2RlXyAoZG91YmxlLCBmdW5jLCBhcmcsIGNvZGUpCQkJCSAgICAgIFwKKyAgX19pbmxpbmVfbWF0aGNvZGVfIChmbG9hdCwgX19DT05DQVQoZnVuYyxmKSwgYXJnLCBjb2RlKQkJICAgICAgXAorICBfX2lubGluZV9tYXRoY29kZV8gKGxvbmcgZG91YmxlLCBfX0NPTkNBVChmdW5jLGwpLCBhcmcsIGNvZGUpCisjIGRlZmluZSBfX2lubGluZV9tYXRoY29kZU5QKGZ1bmMsIGFyZywgY29kZSkgXAorICBfX2lubGluZV9tYXRoY29kZU5QXyAoZG91YmxlLCBmdW5jLCBhcmcsIGNvZGUpCQkJICAgICAgXAorICBfX2lubGluZV9tYXRoY29kZU5QXyAoZmxvYXQsIF9fQ09OQ0FUKGZ1bmMsZiksIGFyZywgY29kZSkJCSAgICAgIFwKKyAgX19pbmxpbmVfbWF0aGNvZGVOUF8gKGxvbmcgZG91YmxlLCBfX0NPTkNBVChmdW5jLGwpLCBhcmcsIGNvZGUpCisjIGRlZmluZSBfX2lubGluZV9tYXRoY29kZTIoZnVuYywgYXJnMSwgYXJnMiwgY29kZSkgXAorICBfX2lubGluZV9tYXRoY29kZTJfIChkb3VibGUsIGZ1bmMsIGFyZzEsIGFyZzIsIGNvZGUpCQkJICAgICAgXAorICBfX2lubGluZV9tYXRoY29kZTJfIChmbG9hdCwgX19DT05DQVQoZnVuYyxmKSwgYXJnMSwgYXJnMiwgY29kZSkJICAgICAgXAorICBfX2lubGluZV9tYXRoY29kZTJfIChsb25nIGRvdWJsZSwgX19DT05DQVQoZnVuYyxsKSwgYXJnMSwgYXJnMiwgY29kZSkKKyMgZGVmaW5lIF9faW5saW5lX21hdGhjb2RlTlAyKGZ1bmMsIGFyZzEsIGFyZzIsIGNvZGUpIFwKKyAgX19pbmxpbmVfbWF0aGNvZGVOUDJfIChkb3VibGUsIGZ1bmMsIGFyZzEsIGFyZzIsIGNvZGUpCQkgICAgICBcCisgIF9faW5saW5lX21hdGhjb2RlTlAyXyAoZmxvYXQsIF9fQ09OQ0FUKGZ1bmMsZiksIGFyZzEsIGFyZzIsIGNvZGUpCSAgICAgIFwKKyAgX19pbmxpbmVfbWF0aGNvZGVOUDJfIChsb25nIGRvdWJsZSwgX19DT05DQVQoZnVuYyxsKSwgYXJnMSwgYXJnMiwgY29kZSkKKyMgZGVmaW5lIF9faW5saW5lX21hdGhjb2RlMyhmdW5jLCBhcmcxLCBhcmcyLCBhcmczLCBjb2RlKSBcCisgIF9faW5saW5lX21hdGhjb2RlM18gKGRvdWJsZSwgZnVuYywgYXJnMSwgYXJnMiwgYXJnMywgY29kZSkJCSAgICAgIFwKKyAgX19pbmxpbmVfbWF0aGNvZGUzXyAoZmxvYXQsIF9fQ09OQ0FUKGZ1bmMsZiksIGFyZzEsIGFyZzIsIGFyZzMsIGNvZGUpCSAgICAgIFwKKyAgX19pbmxpbmVfbWF0aGNvZGUzXyAobG9uZyBkb3VibGUsIF9fQ09OQ0FUKGZ1bmMsbCksIGFyZzEsIGFyZzIsIGFyZzMsIGNvZGUpCisjIGRlZmluZSBfX2lubGluZV9tYXRoY29kZU5QMyhmdW5jLCBhcmcxLCBhcmcyLCBhcmczLCBjb2RlKSBcCisgIF9faW5saW5lX21hdGhjb2RlTlAzXyAoZG91YmxlLCBmdW5jLCBhcmcxLCBhcmcyLCBhcmczLCBjb2RlKQkJICAgICAgXAorICBfX2lubGluZV9tYXRoY29kZU5QM18gKGZsb2F0LCBfX0NPTkNBVChmdW5jLGYpLCBhcmcxLCBhcmcyLCBhcmczLCBjb2RlKSAgICAgXAorICBfX2lubGluZV9tYXRoY29kZU5QM18gKGxvbmcgZG91YmxlLCBfX0NPTkNBVChmdW5jLGwpLCBhcmcxLCBhcmcyLCBhcmczLCBjb2RlKQorI2Vsc2UKKyMgZGVmaW5lIF9faW5saW5lX21hdGhjb2RlKGZ1bmMsIGFyZywgY29kZSkgXAorICBfX2lubGluZV9tYXRoY29kZV8gKGRvdWJsZSwgZnVuYywgKGFyZyksIGNvZGUpCisjIGRlZmluZSBfX2lubGluZV9tYXRoY29kZU5QKGZ1bmMsIGFyZywgY29kZSkgXAorICBfX2lubGluZV9tYXRoY29kZU5QXyAoZG91YmxlLCBmdW5jLCAoYXJnKSwgY29kZSkKKyMgZGVmaW5lIF9faW5saW5lX21hdGhjb2RlMihmdW5jLCBhcmcxLCBhcmcyLCBjb2RlKSBcCisgIF9faW5saW5lX21hdGhjb2RlMl8gKGRvdWJsZSwgZnVuYywgYXJnMSwgYXJnMiwgY29kZSkKKyMgZGVmaW5lIF9faW5saW5lX21hdGhjb2RlTlAyKGZ1bmMsIGFyZzEsIGFyZzIsIGNvZGUpIFwKKyAgX19pbmxpbmVfbWF0aGNvZGVOUDJfIChkb3VibGUsIGZ1bmMsIGFyZzEsIGFyZzIsIGNvZGUpCisjIGRlZmluZSBfX2lubGluZV9tYXRoY29kZTMoZnVuYywgYXJnMSwgYXJnMiwgYXJnMywgY29kZSkgXAorICBfX2lubGluZV9tYXRoY29kZTNfIChkb3VibGUsIGZ1bmMsIGFyZzEsIGFyZzIsIGFyZzMsIGNvZGUpCisjIGRlZmluZSBfX2lubGluZV9tYXRoY29kZU5QMyhmdW5jLCBhcmcxLCBhcmcyLCBhcmczLCBjb2RlKSBcCisgIF9faW5saW5lX21hdGhjb2RlTlAzXyAoZG91YmxlLCBmdW5jLCBhcmcxLCBhcmcyLCBhcmczLCBjb2RlKQorI2VuZGlmCisKKyNkZWZpbmUgX19pbmxpbmVfbWF0aGNvZGVfKGZsb2F0X3R5cGUsIGZ1bmMsIGFyZywgY29kZSkgXAorICBfX01BVEhfSU5MSU5FIGZsb2F0X3R5cGUgZnVuYyAoZmxvYXRfdHlwZSkgX19USFJPVzsJCQkgICAgICBcCisgIF9faW5saW5lX21hdGhjb2RlTlBfKGZsb2F0X3R5cGUsIGZ1bmMsIGFyZywgY29kZSkKKworI2RlZmluZSBfX2lubGluZV9tYXRoY29kZU5QXyhmbG9hdF90eXBlLCBmdW5jLCBhcmcsIGNvZGUpIFwKKyAgX19NQVRIX0lOTElORSBmbG9hdF90eXBlIF9fTlRIIChmdW5jIChmbG9hdF90eXBlIGFyZykpCQkgICAgICBcCisgIHsJCQkJCQkJCQkgICAgICBcCisgICAgY29kZTsJCQkJCQkJCSAgICAgIFwKKyAgfQorCisKKyNkZWZpbmUgX19pbmxpbmVfbWF0aGNvZGUyXyhmbG9hdF90eXBlLCBmdW5jLCBhcmcxLCBhcmcyLCBjb2RlKSBcCisgIF9fTUFUSF9JTkxJTkUgZmxvYXRfdHlwZSBmdW5jIChmbG9hdF90eXBlLCBmbG9hdF90eXBlKSBfX1RIUk9XOwkgICAgICBcCisgIF9faW5saW5lX21hdGhjb2RlTlAyXyAoZmxvYXRfdHlwZSwgZnVuYywgYXJnMSwgYXJnMiwgY29kZSkKKworI2RlZmluZSBfX2lubGluZV9tYXRoY29kZU5QMl8oZmxvYXRfdHlwZSwgZnVuYywgYXJnMSwgYXJnMiwgY29kZSkgXAorICBfX01BVEhfSU5MSU5FIGZsb2F0X3R5cGUgX19OVEggKGZ1bmMgKGZsb2F0X3R5cGUgYXJnMSwgZmxvYXRfdHlwZSBhcmcyKSkgICAgXAorICB7CQkJCQkJCQkJICAgICAgXAorICAgIGNvZGU7CQkJCQkJCQkgICAgICBcCisgIH0KKworI2RlZmluZSBfX2lubGluZV9tYXRoY29kZTNfKGZsb2F0X3R5cGUsIGZ1bmMsIGFyZzEsIGFyZzIsIGFyZzMsIGNvZGUpIFwKKyAgX19NQVRIX0lOTElORSBmbG9hdF90eXBlIGZ1bmMgKGZsb2F0X3R5cGUsIGZsb2F0X3R5cGUsIGZsb2F0X3R5cGUpIF9fVEhST1c7IFwKKyAgX19pbmxpbmVfbWF0aGNvZGVOUDNfKGZsb2F0X3R5cGUsIGZ1bmMsIGFyZzEsIGFyZzIsIGFyZzMsIGNvZGUpCisKKyNkZWZpbmUgX19pbmxpbmVfbWF0aGNvZGVOUDNfKGZsb2F0X3R5cGUsIGZ1bmMsIGFyZzEsIGFyZzIsIGFyZzMsIGNvZGUpIFwKKyAgX19NQVRIX0lOTElORSBmbG9hdF90eXBlIF9fTlRIIChmdW5jIChmbG9hdF90eXBlIGFyZzEsIGZsb2F0X3R5cGUgYXJnMiwgICAgIFwKKwkJCQkJZmxvYXRfdHlwZSBhcmczKSkJCSAgICAgIFwKKyAgewkJCQkJCQkJCSAgICAgIFwKKyAgICBjb2RlOwkJCQkJCQkJICAgICAgXAorICB9CisjZW5kaWYKKworCisjaWYgIWRlZmluZWQgX19OT19NQVRIX0lOTElORVMgJiYgZGVmaW5lZCBfX09QVElNSVpFX18KKy8qIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zICovCisKK19faW5saW5lX21hdGhjb2RlIChfX3NnbiwgX194LCBcCisgIHJldHVybiBfX3ggPT0gMC4wID8gMC4wIDogKF9feCA+IDAuMCA/IDEuMCA6IC0xLjApKQorCisvKiBfX0ZBU1RfTUFUSF9fIGlzIGRlZmluZWQgYnkgZ2NjIC1mZmFzdC1tYXRoLiAgKi8KKyNpZmRlZiBfX0ZBU1RfTUFUSF9fCitfX2lubGluZV9tYXRoY29kZSAoX19wb3cyLCBfX3gsIFwKKyAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX192YWx1ZTsJCQkJCQkgICAgICBcCisgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fZXhwb25lbnQ7CQkJCQkgICAgICBcCisgIF9fZXh0ZW5zaW9uX18gbG9uZyBsb25nIGludCBfX3AgPSAobG9uZyBsb25nIGludCkgX194OwkJICAgICAgXAorICBpZiAoX194ID09IChsb25nIGRvdWJsZSkgX19wKQkJCQkJCSAgICAgIFwKKyAgICB7CQkJCQkJCQkJICAgICAgXAorICAgICAgX19hc20gX192b2xhdGlsZV9fCQkJCQkJICAgICAgXAorCSgiZnNjYWxlIgkJCQkJCQkgICAgICBcCisJIDogIj10IiAoX192YWx1ZSkgOiAiMCIgKDEuMCksICJ1IiAoX194KSk7CQkJICAgICAgXAorICAgICAgcmV0dXJuIF9fdmFsdWU7CQkJCQkJCSAgICAgIFwKKyAgICB9CQkJCQkJCQkJICAgICAgXAorICBfX2FzbSBfX3ZvbGF0aWxlX18JCQkJCQkJICAgICAgXAorICAgICgiZmxkCSUlc3QoMClcblx0IgkJCQkJCSAgICAgIFwKKyAgICAgImZybmRpbnQJCQkjIGludCh4KVxuXHQiCQkJCSAgICAgIFwKKyAgICAgImZ4Y2hcblx0IgkJCQkJCQkJICAgICAgXAorICAgICAiZnN1YgklJXN0KDEpCQkjIGZyYWN0KHgpXG5cdCIJCQkJICAgICAgXAorICAgICAiZjJ4bTEJCQkjIDJeKGZyYWN0KHgpKSAtIDFcblx0IgkJCSAgICAgIFwKKyAgICAgOiAiPXQiIChfX3ZhbHVlKSwgIj11IiAoX19leHBvbmVudCkgOiAiMCIgKF9feCkpOwkJCSAgICAgIFwKKyAgX192YWx1ZSArPSAxLjA7CQkJCQkJCSAgICAgIFwKKyAgX19hc20gX192b2xhdGlsZV9fCQkJCQkJCSAgICAgIFwKKyAgICAoImZzY2FsZSIJCQkJCQkJCSAgICAgIFwKKyAgICAgOiAiPXQiIChfX3ZhbHVlKSA6ICIwIiAoX192YWx1ZSksICJ1IiAoX19leHBvbmVudCkpOwkJICAgICAgXAorICByZXR1cm4gX192YWx1ZSkKKworIyBpZmRlZiBfX1VTRV9HTlUKKyMgIGRlZmluZSBfX3NpbmNvc19jb2RlIFwKKyAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX19jb3NyOwkJCQkJCSAgICAgIFwKKyAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX19zaW5yOwkJCQkJCSAgICAgIFwKKyAgX19hc20gX192b2xhdGlsZV9fCQkJCQkJCSAgICAgIFwKKyAgICAoImZzaW5jb3Ncblx0IgkJCQkJCQkgICAgICBcCisgICAgICJmbnN0c3cJJSVheFxuXHQiCQkJCQkJICAgICAgXAorICAgICAidGVzdGwJJDB4NDAwLCAlJWVheFxuXHQiCQkJCQkgICAgICBcCisgICAgICJqegkxZlxuXHQiCQkJCQkJCSAgICAgIFwKKyAgICAgImZsZHBpXG5cdCIJCQkJCQkJICAgICAgXAorICAgICAiZmFkZAklJXN0KDApXG5cdCIJCQkJCQkgICAgICBcCisgICAgICJmeGNoCSUlc3QoMSlcblx0IgkJCQkJCSAgICAgIFwKKyAgICAgIjI6IGZwcmVtMVxuXHQiCQkJCQkJCSAgICAgIFwKKyAgICAgImZuc3RzdwklJWF4XG5cdCIJCQkJCQkgICAgICBcCisgICAgICJ0ZXN0bAkkMHg0MDAsICUlZWF4XG5cdCIJCQkJCSAgICAgIFwKKyAgICAgImpuegkyYlxuXHQiCQkJCQkJCSAgICAgIFwKKyAgICAgImZzdHAJJSVzdCgxKVxuXHQiCQkJCQkJICAgICAgXAorICAgICAiZnNpbmNvc1xuXHQiCQkJCQkJCSAgICAgIFwKKyAgICAgIjE6IgkJCQkJCQkJICAgICAgXAorICAgICA6ICI9dCIgKF9fY29zciksICI9dSIgKF9fc2lucikgOiAiMCIgKF9feCkpOwkJCSAgICAgIFwKKyAgKl9fc2lueCA9IF9fc2lucjsJCQkJCQkJICAgICAgXAorICAqX19jb3N4ID0gX19jb3NyCisKK19fTUFUSF9JTkxJTkUgdm9pZAorX19OVEggKF9fc2luY29zIChkb3VibGUgX194LCBkb3VibGUgKl9fc2lueCwgZG91YmxlICpfX2Nvc3gpKQoreworICBfX3NpbmNvc19jb2RlOworfQorCitfX01BVEhfSU5MSU5FIHZvaWQKK19fTlRIIChfX3NpbmNvc2YgKGZsb2F0IF9feCwgZmxvYXQgKl9fc2lueCwgZmxvYXQgKl9fY29zeCkpCit7CisgIF9fc2luY29zX2NvZGU7Cit9CisKK19fTUFUSF9JTkxJTkUgdm9pZAorX19OVEggKF9fc2luY29zbCAobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSAqX19zaW54LCBsb25nIGRvdWJsZSAqX19jb3N4KSkKK3sKKyAgX19zaW5jb3NfY29kZTsKK30KKyMgZW5kaWYKKworCisvKiBPcHRpbWl6ZWQgaW5saW5lIGltcGxlbWVudGF0aW9uLCBzb21ldGltZXMgd2l0aCByZWR1Y2VkIHByZWNpc2lvbgorICAgYW5kL29yIGFyZ3VtZW50IHJhbmdlLiAgKi8KKworIyBpZiBfX0dOVUNfUFJFUkVRICgzLCA1KQorIyAgZGVmaW5lIF9fZXhwbTFfY29kZSBcCisgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fdGVtcDsJCQkJCQkgICAgICBcCisgIF9fdGVtcCA9IF9fYnVpbHRpbl9leHBtMWwgKF9feCk7CQkJCQkgICAgICBcCisgIHJldHVybiBfX3RlbXAgPyBfX3RlbXAgOiBfX3gKKyMgZWxzZQorIyAgZGVmaW5lIF9fZXhwbTFfY29kZSBcCisgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fdmFsdWU7CQkJCQkJICAgICAgXAorICByZWdpc3RlciBsb25nIGRvdWJsZSBfX2V4cG9uZW50OwkJCQkJICAgICAgXAorICByZWdpc3RlciBsb25nIGRvdWJsZSBfX3RlbXA7CQkJCQkJICAgICAgXAorICBfX2FzbSBfX3ZvbGF0aWxlX18JCQkJCQkJICAgICAgXAorICAgICgiZmxkbDJlCQkJIyBlXnggLSAxID0gMl4oeCAqIGxvZzIoZSkpIC0gMVxuXHQiCSAgICAgIFwKKyAgICAgImZtdWwJJSVzdCgxKQkJIyB4ICogbG9nMihlKVxuXHQiCQkJICAgICAgXAorICAgICAiZnN0CSUlc3QoMSlcblx0IgkJCQkJCSAgICAgIFwKKyAgICAgImZybmRpbnQJCQkjIGludCh4ICogbG9nMihlKSlcblx0IgkJCSAgICAgIFwKKyAgICAgImZ4Y2hcblx0IgkJCQkJCQkJICAgICAgXAorICAgICAiZnN1YgklJXN0KDEpCQkjIGZyYWN0KHggKiBsb2cyKGUpKVxuXHQiCQkgICAgICBcCisgICAgICJmMnhtMQkJCSMgMl4oZnJhY3QoeCAqIGxvZzIoZSkpKSAtIDFcblx0IgkgICAgICBcCisgICAgICJmc2NhbGUJCQkjIDJeKHggKiBsb2cyKGUpKSAtIDJeKGludCh4ICogbG9nMihlKSkpXG5cdCIgXAorICAgICA6ICI9dCIgKF9fdmFsdWUpLCAiPXUiIChfX2V4cG9uZW50KSA6ICIwIiAoX194KSk7CQkJICAgICAgXAorICBfX2FzbSBfX3ZvbGF0aWxlX18JCQkJCQkJICAgICAgXAorICAgICgiZnNjYWxlCQkJIyAyXmludCh4ICogbG9nMihlKSlcblx0IgkJICAgICAgXAorICAgICA6ICI9dCIgKF9fdGVtcCkgOiAiMCIgKDEuMCksICJ1IiAoX19leHBvbmVudCkpOwkJCSAgICAgIFwKKyAgX190ZW1wIC09IDEuMDsJCQkJCQkJICAgICAgXAorICBfX3RlbXAgKz0gX192YWx1ZTsJCQkJCQkJICAgICAgXAorICByZXR1cm4gX190ZW1wID8gX190ZW1wIDogX194CisjIGVuZGlmCitfX2lubGluZV9tYXRoY29kZU5QXyAobG9uZyBkb3VibGUsIF9fZXhwbTFsLCBfX3gsIF9fZXhwbTFfY29kZSkKKworIyBpZiBfX0dOVUNfUFJFUkVRICgzLCA0KQorX19pbmxpbmVfbWF0aGNvZGVOUF8gKGxvbmcgZG91YmxlLCBfX2V4cGwsIF9feCwgcmV0dXJuIF9fYnVpbHRpbl9leHBsIChfX3gpKQorIyBlbHNlCisjICBkZWZpbmUgX19leHBfY29kZSBcCisgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fdmFsdWU7CQkJCQkJICAgICAgXAorICByZWdpc3RlciBsb25nIGRvdWJsZSBfX2V4cG9uZW50OwkJCQkJICAgICAgXAorICBfX2FzbSBfX3ZvbGF0aWxlX18JCQkJCQkJICAgICAgXAorICAgICgiZmxkbDJlCQkJIyBlXnggPSAyXih4ICogbG9nMihlKSlcblx0IgkJICAgICAgXAorICAgICAiZm11bAklJXN0KDEpCQkjIHggKiBsb2cyKGUpXG5cdCIJCQkgICAgICBcCisgICAgICJmc3QJJSVzdCgxKVxuXHQiCQkJCQkJICAgICAgXAorICAgICAiZnJuZGludAkJCSMgaW50KHggKiBsb2cyKGUpKVxuXHQiCQkJICAgICAgXAorICAgICAiZnhjaFxuXHQiCQkJCQkJCQkgICAgICBcCisgICAgICJmc3ViCSUlc3QoMSkJCSMgZnJhY3QoeCAqIGxvZzIoZSkpXG5cdCIJCSAgICAgIFwKKyAgICAgImYyeG0xCQkJIyAyXihmcmFjdCh4ICogbG9nMihlKSkpIC0gMVxuXHQiCSAgICAgIFwKKyAgICAgOiAiPXQiIChfX3ZhbHVlKSwgIj11IiAoX19leHBvbmVudCkgOiAiMCIgKF9feCkpOwkJCSAgICAgIFwKKyAgX192YWx1ZSArPSAxLjA7CQkJCQkJCSAgICAgIFwKKyAgX19hc20gX192b2xhdGlsZV9fCQkJCQkJCSAgICAgIFwKKyAgICAoImZzY2FsZSIJCQkJCQkJCSAgICAgIFwKKyAgICAgOiAiPXQiIChfX3ZhbHVlKSA6ICIwIiAoX192YWx1ZSksICJ1IiAoX19leHBvbmVudCkpOwkJICAgICAgXAorICByZXR1cm4gX192YWx1ZQorX19pbmxpbmVfbWF0aGNvZGVOUCAoZXhwLCBfX3gsIF9fZXhwX2NvZGUpCitfX2lubGluZV9tYXRoY29kZU5QXyAobG9uZyBkb3VibGUsIF9fZXhwbCwgX194LCBfX2V4cF9jb2RlKQorIyBlbmRpZgorCisKKyMgaWYgIV9fR05VQ19QUkVSRVEgKDMsIDUpCitfX2lubGluZV9tYXRoY29kZU5QICh0YW4sIF9feCwgXAorICByZWdpc3RlciBsb25nIGRvdWJsZSBfX3ZhbHVlOwkJCQkJCSAgICAgIFwKKyAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX192YWx1ZTIgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsJCSAgICAgIFwKKyAgX19hc20gX192b2xhdGlsZV9fCQkJCQkJCSAgICAgIFwKKyAgICAoImZwdGFuIgkJCQkJCQkJICAgICAgXAorICAgICA6ICI9dCIgKF9fdmFsdWUyKSwgIj11IiAoX192YWx1ZSkgOiAiMCIgKF9feCkpOwkJCSAgICAgIFwKKyAgcmV0dXJuIF9fdmFsdWUpCisjIGVuZGlmCisjZW5kaWYgLyogX19GQVNUX01BVEhfXyAqLworCisKKyNpZiBfX0dOVUNfUFJFUkVRICgzLCA0KQorX19pbmxpbmVfbWF0aGNvZGVOUDJfIChsb25nIGRvdWJsZSwgX19hdGFuMmwsIF9feSwgX194LAorCQkgICAgICAgcmV0dXJuIF9fYnVpbHRpbl9hdGFuMmwgKF9feSwgX194KSkKKyNlbHNlCisjIGRlZmluZSBfX2F0YW4yX2NvZGUgXAorICByZWdpc3RlciBsb25nIGRvdWJsZSBfX3ZhbHVlOwkJCQkJCSAgICAgIFwKKyAgX19hc20gX192b2xhdGlsZV9fCQkJCQkJCSAgICAgIFwKKyAgICAoImZwYXRhbiIJCQkJCQkJCSAgICAgIFwKKyAgICAgOiAiPXQiIChfX3ZhbHVlKSA6ICIwIiAoX194KSwgInUiIChfX3kpIDogInN0KDEpIik7CQkgICAgICBcCisgIHJldHVybiBfX3ZhbHVlCisjIGlmZGVmIF9fRkFTVF9NQVRIX18KK19faW5saW5lX21hdGhjb2RlTlAyIChhdGFuMiwgX195LCBfX3gsIF9fYXRhbjJfY29kZSkKKyMgZW5kaWYKK19faW5saW5lX21hdGhjb2RlTlAyXyAobG9uZyBkb3VibGUsIF9fYXRhbjJsLCBfX3ksIF9feCwgX19hdGFuMl9jb2RlKQorI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19GQVNUX01BVEhfXyAmJiAhX19HTlVDX1BSRVJFUSAoMywgNSkKK19faW5saW5lX21hdGhjb2RlTlAyIChmbW9kLCBfX3gsIF9feSwgXAorICByZWdpc3RlciBsb25nIGRvdWJsZSBfX3ZhbHVlOwkJCQkJCSAgICAgIFwKKyAgX19hc20gX192b2xhdGlsZV9fCQkJCQkJCSAgICAgIFwKKyAgICAoIjE6CWZwcmVtXG5cdCIJCQkJCQkgICAgICBcCisgICAgICJmbnN0c3cJJSVheFxuXHQiCQkJCQkJICAgICAgXAorICAgICAic2FoZlxuXHQiCQkJCQkJCQkgICAgICBcCisgICAgICJqcAkxYiIJCQkJCQkJICAgICAgXAorICAgICA6ICI9dCIgKF9fdmFsdWUpIDogIjAiIChfX3gpLCAidSIgKF9feSkgOiAiYXgiLCAiY2MiKTsJCSAgICAgIFwKKyAgcmV0dXJuIF9fdmFsdWUpCisjZW5kaWYKKworCisjaWZkZWYgX19GQVNUX01BVEhfXworIyBpZiAhX19HTlVDX1BSRVJFUSAoMywzKQorX19pbmxpbmVfbWF0aG9wTlAgKHNxcnQsICJmc3FydCIpCitfX2lubGluZV9tYXRob3BOUF8gKGxvbmcgZG91YmxlLCBfX3NxcnRsLCAiZnNxcnQiKQorIyAgZGVmaW5lIF9fbGliY19zcXJ0bChuKSBfX3NxcnRsIChuKQorIyBlbHNlCisjICBkZWZpbmUgX19saWJjX3NxcnRsKG4pIF9fYnVpbHRpbl9zcXJ0bCAobikKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgX19HTlVDX1BSRVJFUSAoMiwgOCkKK19faW5saW5lX21hdGhjb2RlTlBfIChkb3VibGUsIGZhYnMsIF9feCwgcmV0dXJuIF9fYnVpbHRpbl9mYWJzIChfX3gpKQorIyBpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKK19faW5saW5lX21hdGhjb2RlTlBfIChmbG9hdCwgZmFic2YsIF9feCwgcmV0dXJuIF9fYnVpbHRpbl9mYWJzZiAoX194KSkKK19faW5saW5lX21hdGhjb2RlTlBfIChsb25nIGRvdWJsZSwgZmFic2wsIF9feCwgcmV0dXJuIF9fYnVpbHRpbl9mYWJzbCAoX194KSkKKyMgZW5kaWYKK19faW5saW5lX21hdGhjb2RlTlBfIChsb25nIGRvdWJsZSwgX19mYWJzbCwgX194LCByZXR1cm4gX19idWlsdGluX2ZhYnNsIChfX3gpKQorI2Vsc2UKK19faW5saW5lX21hdGhvcCAoZmFicywgImZhYnMiKQorX19pbmxpbmVfbWF0aG9wXyAobG9uZyBkb3VibGUsIF9fZmFic2wsICJmYWJzIikKKyNlbmRpZgorCisjaWZkZWYgX19GQVNUX01BVEhfXworIyBpZiAhX19HTlVDX1BSRVJFUSAoMywgNCkKKy8qIFRoZSBhcmd1bWVudCByYW5nZSBvZiB0aGlzIGlubGluZSB2ZXJzaW9uIGlzIHJlZHVjZWQuICAqLworX19pbmxpbmVfbWF0aG9wTlAgKHNpbiwgImZzaW4iKQorLyogVGhlIGFyZ3VtZW50IHJhbmdlIG9mIHRoaXMgaW5saW5lIHZlcnNpb24gaXMgcmVkdWNlZC4gICovCitfX2lubGluZV9tYXRob3BOUCAoY29zLCAiZmNvcyIpCisKK19faW5saW5lX21hdGhvcF9kZWNsTlAgKGxvZywgImZsZGxuMjsgZnhjaDsgZnlsMngiLCAiMCIgKF9feCkgOiAic3QoMSkiKQorIyBlbmRpZgorCisjIGlmICFfX0dOVUNfUFJFUkVRICgzLCA1KQorX19pbmxpbmVfbWF0aG9wX2RlY2xOUCAobG9nMTAsICJmbGRsZzI7IGZ4Y2g7IGZ5bDJ4IiwgIjAiIChfX3gpIDogInN0KDEpIikKKworX19pbmxpbmVfbWF0aGNvZGVOUCAoYXNpbiwgX194LCByZXR1cm4gX19hdGFuMmwgKF9feCwgX19saWJjX3NxcnRsICgxLjAgLSBfX3ggKiBfX3gpKSkKK19faW5saW5lX21hdGhjb2RlTlAgKGFjb3MsIF9feCwgcmV0dXJuIF9fYXRhbjJsIChfX2xpYmNfc3FydGwgKDEuMCAtIF9feCAqIF9feCksIF9feCkpCisjIGVuZGlmCisKKyMgaWYgIV9fR05VQ19QUkVSRVEgKDMsIDQpCitfX2lubGluZV9tYXRob3BfZGVjbE5QIChhdGFuLCAiZmxkMTsgZnBhdGFuIiwgIjAiIChfX3gpIDogInN0KDEpIikKKyMgZW5kaWYKKyNlbmRpZiAvKiBfX0ZBU1RfTUFUSF9fICovCisKK19faW5saW5lX21hdGhjb2RlXyAobG9uZyBkb3VibGUsIF9fc2duMWwsIF9feCwgXAorICBfX2V4dGVuc2lvbl9fIHVuaW9uIHsgbG9uZyBkb3VibGUgX194bGQ7IHVuc2lnbmVkIGludCBfX3hpWzNdOyB9IF9fbiA9ICAgICAgXAorICAgIHsgX194bGQ6IF9feCB9OwkJCQkJCQkgICAgICBcCisgIF9fbi5fX3hpWzJdID0gKF9fbi5fX3hpWzJdICYgMHg4MDAwKSB8IDB4M2ZmZjsJCQkgICAgICBcCisgIF9fbi5fX3hpWzFdID0gMHg4MDAwMDAwMDsJCQkJCQkgICAgICBcCisgIF9fbi5fX3hpWzBdID0gMDsJCQkJCQkJICAgICAgXAorICByZXR1cm4gX19uLl9feGxkKQorCisKKyNpZmRlZiBfX0ZBU1RfTUFUSF9fCisvKiBUaGUgYXJndW1lbnQgcmFuZ2Ugb2YgdGhlIGlubGluZSB2ZXJzaW9uIG9mIHNpbmhsIGlzIHNsaWdodGx5IHJlZHVjZWQuICAqLworX19pbmxpbmVfbWF0aGNvZGVOUCAoc2luaCwgX194LCBcCisgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fZXhtMSA9IF9fZXhwbTFsIChfX2ZhYnNsIChfX3gpKTsJCSAgICAgIFwKKyAgcmV0dXJuIDAuNSAqIChfX2V4bTEgLyAoX19leG0xICsgMS4wKSArIF9fZXhtMSkgKiBfX3NnbjFsIChfX3gpKQorCitfX2lubGluZV9tYXRoY29kZU5QIChjb3NoLCBfX3gsIFwKKyAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX19leCA9IF9fZXhwbCAoX194KTsJCQkJICAgICAgXAorICByZXR1cm4gMC41ICogKF9fZXggKyAxLjAgLyBfX2V4KSkKKworX19pbmxpbmVfbWF0aGNvZGVOUCAodGFuaCwgX194LCBcCisgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fZXhtMSA9IF9fZXhwbTFsICgtX19mYWJzbCAoX194ICsgX194KSk7CSAgICAgIFwKKyAgcmV0dXJuIF9fZXhtMSAvIChfX2V4bTEgKyAyLjApICogX19zZ24xbCAoLV9feCkpCisjZW5kaWYKKworX19pbmxpbmVfbWF0aGNvZGVOUCAoZmxvb3IsIF9feCwgXAorICByZWdpc3RlciBsb25nIGRvdWJsZSBfX3ZhbHVlOwkJCQkJCSAgICAgIFwKKyAgcmVnaXN0ZXIgaW50IF9faWdub3JlOwkJCQkJCSAgICAgIFwKKyAgdW5zaWduZWQgc2hvcnQgaW50IF9fY3c7CQkJCQkJICAgICAgXAorICB1bnNpZ25lZCBzaG9ydCBpbnQgX19jd3RtcDsJCQkJCQkgICAgICBcCisgIF9fYXNtIF9fdm9sYXRpbGUgKCJmbnN0Y3cgJTNcblx0IgkJCQkJICAgICAgXAorCQkgICAgIm1vdnp3bCAlMywgJTFcblx0IgkJCQkJICAgICAgXAorCQkgICAgImFuZGwgJDB4ZjNmZiwgJTFcblx0IgkJCQkgICAgICBcCisJCSAgICAib3JsICQweDA0MDAsICUxXG5cdCIJLyogcm91bmRpbmcgZG93biAqLwkgICAgICBcCisJCSAgICAibW92dyAldzEsICUyXG5cdCIJCQkJCSAgICAgIFwKKwkJICAgICJmbGRjdyAlMlxuXHQiCQkJCQkgICAgICBcCisJCSAgICAiZnJuZGludFxuXHQiCQkJCQkgICAgICBcCisJCSAgICAiZmxkY3cgJTMiCQkJCQkJICAgICAgXAorCQkgICAgOiAiPXQiIChfX3ZhbHVlKSwgIj0mcSIgKF9faWdub3JlKSwgIj1tIiAoX19jd3RtcCksCSAgICAgIFwKKwkJICAgICAgIj1tIiAoX19jdykJCQkJCSAgICAgIFwKKwkJICAgIDogIjAiIChfX3gpKTsJCQkJCSAgICAgIFwKKyAgcmV0dXJuIF9fdmFsdWUpCisKK19faW5saW5lX21hdGhjb2RlTlAgKGNlaWwsIF9feCwgXAorICByZWdpc3RlciBsb25nIGRvdWJsZSBfX3ZhbHVlOwkJCQkJCSAgICAgIFwKKyAgcmVnaXN0ZXIgaW50IF9faWdub3JlOwkJCQkJCSAgICAgIFwKKyAgdW5zaWduZWQgc2hvcnQgaW50IF9fY3c7CQkJCQkJICAgICAgXAorICB1bnNpZ25lZCBzaG9ydCBpbnQgX19jd3RtcDsJCQkJCQkgICAgICBcCisgIF9fYXNtIF9fdm9sYXRpbGUgKCJmbnN0Y3cgJTNcblx0IgkJCQkJICAgICAgXAorCQkgICAgIm1vdnp3bCAlMywgJTFcblx0IgkJCQkJICAgICAgXAorCQkgICAgImFuZGwgJDB4ZjNmZiwgJTFcblx0IgkJCQkgICAgICBcCisJCSAgICAib3JsICQweDA4MDAsICUxXG5cdCIJLyogcm91bmRpbmcgdXAgKi8JICAgICAgXAorCQkgICAgIm1vdncgJXcxLCAlMlxuXHQiCQkJCQkgICAgICBcCisJCSAgICAiZmxkY3cgJTJcblx0IgkJCQkJICAgICAgXAorCQkgICAgImZybmRpbnRcblx0IgkJCQkJICAgICAgXAorCQkgICAgImZsZGN3ICUzIgkJCQkJCSAgICAgIFwKKwkJICAgIDogIj10IiAoX192YWx1ZSksICI9JnEiIChfX2lnbm9yZSksICI9bSIgKF9fY3d0bXApLAkgICAgICBcCisJCSAgICAgICI9bSIgKF9fY3cpCQkJCQkgICAgICBcCisJCSAgICA6ICIwIiAoX194KSk7CQkJCQkgICAgICBcCisgIHJldHVybiBfX3ZhbHVlKQorCisjaWZkZWYgX19GQVNUX01BVEhfXworIyBkZWZpbmUgX19sZGV4cF9jb2RlIFwKKyAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX192YWx1ZTsJCQkJCQkgICAgICBcCisgIF9fYXNtIF9fdm9sYXRpbGVfXwkJCQkJCQkgICAgICBcCisgICAgKCJmc2NhbGUiCQkJCQkJCQkgICAgICBcCisgICAgIDogIj10IiAoX192YWx1ZSkgOiAiMCIgKF9feCksICJ1IiAoKGxvbmcgZG91YmxlKSBfX3kpKTsJCSAgICAgIFwKKyAgcmV0dXJuIF9fdmFsdWUKKworX19NQVRIX0lOTElORSBkb3VibGUKK19fTlRIIChsZGV4cCAoZG91YmxlIF9feCwgaW50IF9feSkpCit7CisgIF9fbGRleHBfY29kZTsKK30KKyNlbmRpZgorCisKKy8qIE9wdGltaXplZCB2ZXJzaW9ucyBmb3Igc29tZSBub24tc3RhbmRhcmRpemVkIGZ1bmN0aW9ucy4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9JU09DOTkgfHwgZGVmaW5lZCBfX1VTRV9NSVNDCisKKyMgaWZkZWYgX19GQVNUX01BVEhfXworX19pbmxpbmVfbWF0aGNvZGVOUCAoZXhwbTEsIF9feCwgX19leHBtMV9jb2RlKQorCisvKiBXZSBjYW5ub3QgcmVseSBvbiBNX1NRUlQgYmVpbmcgZGVmaW5lZC4gIFNvIHdlIGRvIGl0IGZvciBvdXJzZWxmCisgICBoZXJlLiAgKi8KKyMgIGRlZmluZSBfX01fU1FSVDIJMS40MTQyMTM1NjIzNzMwOTUwNDg4MEwJLyogc3FydCgyKSAqLworCisjICBpZiAhX19HTlVDX1BSRVJFUSAoMywgNSkKK19faW5saW5lX21hdGhjb2RlTlAgKGxvZzFwLCBfX3gsIFwKKyAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX192YWx1ZTsJCQkJCQkgICAgICBcCisgIGlmIChfX2ZhYnNsIChfX3gpID49IDEuMCAtIDAuNSAqIF9fTV9TUVJUMikJCQkJICAgICAgXAorICAgIF9fdmFsdWUgPSBsb2dsICgxLjAgKyBfX3gpOwkJCQkJCSAgICAgIFwKKyAgZWxzZQkJCQkJCQkJCSAgICAgIFwKKyAgICBfX2FzbSBfX3ZvbGF0aWxlX18JCQkJCQkJICAgICAgXAorICAgICAgKCJmbGRsbjJcblx0IgkJCQkJCQkgICAgICBcCisgICAgICAgImZ4Y2hcblx0IgkJCQkJCQkgICAgICBcCisgICAgICAgImZ5bDJ4cDEiCQkJCQkJCSAgICAgIFwKKyAgICAgICA6ICI9dCIgKF9fdmFsdWUpIDogIjAiIChfX3gpIDogInN0KDEpIik7CQkJCSAgICAgIFwKKyAgcmV0dXJuIF9fdmFsdWUpCisjICBlbmRpZgorCisKKy8qIFRoZSBhcmd1bWVudCByYW5nZSBvZiB0aGUgaW5saW5lIHZlcnNpb24gb2YgYXNpbmhsIGlzIHNsaWdodGx5IHJlZHVjZWQuICAqLworX19pbmxpbmVfbWF0aGNvZGVOUCAoYXNpbmgsIF9feCwgXAorICByZWdpc3RlciBsb25nIGRvdWJsZSAgX195ID0gX19mYWJzbCAoX194KTsJCQkJICAgICAgXAorICByZXR1cm4gKGxvZzFwbCAoX195ICogX195IC8gKF9fbGliY19zcXJ0bCAoX195ICogX195ICsgMS4wKSArIDEuMCkgKyBfX3kpICAgXAorCSAgKiBfX3NnbjFsIChfX3gpKSkKKworX19pbmxpbmVfbWF0aGNvZGVOUCAoYWNvc2gsIF9feCwgXAorICByZXR1cm4gbG9nbCAoX194ICsgX19saWJjX3NxcnRsIChfX3ggLSAxLjApICogX19saWJjX3NxcnRsIChfX3ggKyAxLjApKSkKKworX19pbmxpbmVfbWF0aGNvZGVOUCAoYXRhbmgsIF9feCwgXAorICByZWdpc3RlciBsb25nIGRvdWJsZSBfX3kgPSBfX2ZhYnNsIChfX3gpOwkJCQkgICAgICBcCisgIHJldHVybiAtMC41ICogbG9nMXBsICgtKF9feSArIF9feSkgLyAoMS4wICsgX195KSkgKiBfX3NnbjFsIChfX3gpKQorCisvKiBUaGUgYXJndW1lbnQgcmFuZ2Ugb2YgdGhlIGlubGluZSB2ZXJzaW9uIG9mIGh5cG90bCBpcyBzbGlnaHRseSByZWR1Y2VkLiAgKi8KK19faW5saW5lX21hdGhjb2RlTlAyIChoeXBvdCwgX194LCBfX3ksCisJCSAgICAgIHJldHVybiBfX2xpYmNfc3FydGwgKF9feCAqIF9feCArIF9feSAqIF9feSkpCisKKyMgIGlmICFfX0dOVUNfUFJFUkVRICgzLCA1KQorX19pbmxpbmVfbWF0aGNvZGVOUChsb2diLCBfX3gsIFwKKyAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX192YWx1ZTsJCQkJCQkgICAgICBcCisgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fanVuazsJCQkJCQkgICAgICBcCisgIF9fYXNtIF9fdm9sYXRpbGVfXwkJCQkJCQkgICAgICBcCisgICAgKCJmeHRyYWN0XG5cdCIJCQkJCQkJICAgICAgXAorICAgICA6ICI9dCIgKF9fanVuayksICI9dSIgKF9fdmFsdWUpIDogIjAiIChfX3gpKTsJCQkgICAgICBcCisgIHJldHVybiBfX3ZhbHVlKQorIyAgZW5kaWYKKworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9JU09DOTkKKyMgaWZkZWYgX19GQVNUX01BVEhfXworCisjICBpZiAhX19HTlVDX1BSRVJFUSAoMywgNSkKK19faW5saW5lX21hdGhvcF9kZWNsTlAgKGxvZzIsICJmbGQxOyBmeGNoOyBmeWwyeCIsICIwIiAoX194KSA6ICJzdCgxKSIpCisjICBlbmRpZgorCitfX01BVEhfSU5MSU5FIGZsb2F0CitfX05USCAobGRleHBmIChmbG9hdCBfX3gsIGludCBfX3kpKQoreworICBfX2xkZXhwX2NvZGU7Cit9CisKK19fTUFUSF9JTkxJTkUgbG9uZyBkb3VibGUKK19fTlRIIChsZGV4cGwgKGxvbmcgZG91YmxlIF9feCwgaW50IF9feSkpCit7CisgIF9fbGRleHBfY29kZTsKK30KKworX19pbmxpbmVfbWF0aG9wTlAgKHJpbnQsICJmcm5kaW50IikKKyMgZW5kaWYgLyogX19GQVNUX01BVEhfXyAqLworCisjIGRlZmluZSBfX2xyaW50X2NvZGUgXAorICBsb25nIGludCBfX2xyaW50cmVzOwkJCQkJCQkgICAgICBcCisgIF9fYXNtX18gX192b2xhdGlsZV9fCQkJCQkJCSAgICAgIFwKKyAgICAoImZpc3RwbCAlMCIJCQkJCQkJICAgICAgXAorICAgICA6ICI9bSIgKF9fbHJpbnRyZXMpIDogInQiIChfX3gpIDogInN0Iik7CQkJCSAgICAgIFwKKyAgcmV0dXJuIF9fbHJpbnRyZXMKK19fTUFUSF9JTkxJTkUgbG9uZyBpbnQKK19fTlRIIChscmludGYgKGZsb2F0IF9feCkpCit7CisgIF9fbHJpbnRfY29kZTsKK30KK19fTUFUSF9JTkxJTkUgbG9uZyBpbnQKK19fTlRIIChscmludCAoZG91YmxlIF9feCkpCit7CisgIF9fbHJpbnRfY29kZTsKK30KK19fTUFUSF9JTkxJTkUgbG9uZyBpbnQKK19fTlRIIChscmludGwgKGxvbmcgZG91YmxlIF9feCkpCit7CisgIF9fbHJpbnRfY29kZTsKK30KKyMgdW5kZWYgX19scmludF9jb2RlCisKKyMgZGVmaW5lIF9fbGxyaW50X2NvZGUgXAorICBsb25nIGxvbmcgaW50IF9fbGxyaW50cmVzOwkJCQkJCSAgICAgIFwKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18JCQkJCQkJICAgICAgXAorICAgICgiZmlzdHBsbCAlMCIJCQkJCQkJICAgICAgXAorICAgICA6ICI9bSIgKF9fbGxyaW50cmVzKSA6ICJ0IiAoX194KSA6ICJzdCIpOwkJCQkgICAgICBcCisgIHJldHVybiBfX2xscmludHJlcworX19NQVRIX0lOTElORSBsb25nIGxvbmcgaW50CitfX05USCAobGxyaW50ZiAoZmxvYXQgX194KSkKK3sKKyAgX19sbHJpbnRfY29kZTsKK30KK19fTUFUSF9JTkxJTkUgbG9uZyBsb25nIGludAorX19OVEggKGxscmludCAoZG91YmxlIF9feCkpCit7CisgIF9fbGxyaW50X2NvZGU7Cit9CitfX01BVEhfSU5MSU5FIGxvbmcgbG9uZyBpbnQKK19fTlRIIChsbHJpbnRsIChsb25nIGRvdWJsZSBfX3gpKQoreworICBfX2xscmludF9jb2RlOworfQorIyB1bmRlZiBfX2xscmludF9jb2RlCisKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9NSVNDCisKKyMgaWYgZGVmaW5lZCBfX0ZBU1RfTUFUSF9fICYmICFfX0dOVUNfUFJFUkVRICgzLCA1KQorX19pbmxpbmVfbWF0aGNvZGVOUDIgKGRyZW0sIF9feCwgX195LCBcCisgIHJlZ2lzdGVyIGRvdWJsZSBfX3ZhbHVlOwkJCQkJCSAgICAgIFwKKyAgcmVnaXN0ZXIgaW50IF9fY2xvYmJlcmVkOwkJCQkJCSAgICAgIFwKKyAgX19hc20gX192b2xhdGlsZV9fCQkJCQkJCSAgICAgIFwKKyAgICAoIjE6CWZwcmVtMVxuXHQiCQkJCQkJICAgICAgXAorICAgICAiZnN0c3cJJSVheFxuXHQiCQkJCQkJICAgICAgXAorICAgICAic2FoZlxuXHQiCQkJCQkJCQkgICAgICBcCisgICAgICJqcAkxYiIJCQkJCQkJICAgICAgXAorICAgICA6ICI9dCIgKF9fdmFsdWUpLCAiPSZhIiAoX19jbG9iYmVyZWQpIDogIjAiIChfX3gpLCAidSIgKF9feSkgOiAiY2MiKTsgICAgXAorICByZXR1cm4gX192YWx1ZSkKKyMgZW5kaWYKKworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gdGhlIGBpc2Zpbml0ZScgbWFjcm8uICAqLworX19NQVRIX0lOTElORSBpbnQKK19fTlRIIChfX2Zpbml0ZSAoZG91YmxlIF9feCkpCit7CisgIHJldHVybiAoX19leHRlbnNpb25fXworCSAgKCgoKCh1bmlvbiB7IGRvdWJsZSBfX2Q7IGludCBfX2lbMl07IH0pIHtfX2Q6IF9feH0pLl9faVsxXQorCSAgICAgfCAweDgwMGZmZmZmdSkgKyAxKSA+PiAzMSkpOworfQorCisvKiBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyAqLworIyBpZmRlZiBfX0ZBU1RfTUFUSF9fCitfX2lubGluZV9tYXRoY29kZSAoX19jb3NobTEsIF9feCwgXAorICByZWdpc3RlciBsb25nIGRvdWJsZSBfX2V4bTEgPSBfX2V4cG0xbCAoX19mYWJzbCAoX194KSk7CQkgICAgICBcCisgIHJldHVybiAwLjUgKiAoX19leG0xIC8gKF9fZXhtMSArIDEuMCkpICogX19leG0xKQorCitfX2lubGluZV9tYXRoY29kZSAoX19hY29zaDFwLCBfX3gsIFwKKyAgcmV0dXJuIGxvZzFwbCAoX194ICsgX19saWJjX3NxcnRsIChfX3gpICogX19saWJjX3NxcnRsIChfX3ggKyAyLjApKSkKKworIyBlbmRpZiAvKiBfX0ZBU1RfTUFUSF9fICovCisjZW5kaWYgLyogX19VU0VfTUlTQyAgKi8KKworLyogVW5kZWZpbmUgc29tZSBvZiB0aGUgbGFyZ2UgbWFjcm9zIHdoaWNoIGFyZSBub3QgdXNlZCBhbnltb3JlLiAgKi8KKyN1bmRlZiBfX2F0YW4yX2NvZGUKKyNpZmRlZiBfX0ZBU1RfTUFUSF9fCisjIHVuZGVmIF9fZXhwbTFfY29kZQorIyB1bmRlZiBfX2V4cF9jb2RlCisjIHVuZGVmIF9fc2luY29zX2NvZGUKKyNlbmRpZiAvKiBfX0ZBU1RfTUFUSF9fICovCisKKyNlbmRpZiAvKiBfX05PX01BVEhfSU5MSU5FUyAgKi8KKworCisvKiBUaGlzIGNvZGUgaXMgdXNlZCBpbnRlcm5hbGx5IGluIHRoZSBHTlUgbGliYy4gICovCisjaWZkZWYgX19MSUJDX0lOVEVSTkFMX01BVEhfSU5MSU5FUworX19pbmxpbmVfbWF0aG9wIChfX2llZWU3NTRfc3FydCwgImZzcXJ0IikKK19faW5saW5lX21hdGhjb2RlMiAoX19pZWVlNzU0X2F0YW4yLCBfX3ksIF9feCwKKwkJICAgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fdmFsdWU7CisJCSAgICBfX2FzbSBfX3ZvbGF0aWxlX18gKCJmcGF0YW5cblx0IgorCQkJCQk6ICI9dCIgKF9fdmFsdWUpCisJCQkJCTogIjAiIChfX3gpLCAidSIgKF9feSkgOiAic3QoMSkiKTsKKwkJICAgIHJldHVybiBfX3ZhbHVlOykKKyNlbmRpZgorCisjZW5kaWYgLyogX19HTlVDX18gICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbW1hbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGZiZDdlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL21tYW4uaApAQCAtMCwwICsxLDExMSBAQAorLyogRGVmaW5pdGlvbnMgZm9yIFBPU0lYIG1lbW9yeSBtYXAgaW50ZXJmYWNlLiAgTGludXgvaTM4NiB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk3LDIwMDAsMjAwMywyMDA1LDIwMDYsMjAwOSwyMDEwLDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfTU1BTl9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvbW1hbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8c3lzL21tYW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBiYXNpY2FsbHkgY29tZSBmcm9tIHRoZSBrZXJuZWwgaGVhZGVycy4KKyAgIEJ1dCB0aGUga2VybmVsIGhlYWRlciBpcyBub3QgbmFtZXNwYWNlIGNsZWFuLiAgKi8KKworCisvKiBQcm90ZWN0aW9ucyBhcmUgY2hvc2VuIGZyb20gdGhlc2UgYml0cywgT1InZCB0b2dldGhlci4gIFRoZQorICAgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgbmVjZXNzYXJpbHkgc3VwcG9ydCBQUk9UX0VYRUMgb3IgUFJPVF9XUklURQorICAgd2l0aG91dCBQUk9UX1JFQUQuICBUaGUgb25seSBndWFyYW50ZWVzIGFyZSB0aGF0IG5vIHdyaXRpbmcgd2lsbCBiZQorICAgYWxsb3dlZCB3aXRob3V0IFBST1RfV1JJVEUgYW5kIG5vIGFjY2VzcyB3aWxsIGJlIGFsbG93ZWQgZm9yIFBST1RfTk9ORS4gKi8KKworI2RlZmluZSBQUk9UX1JFQUQJMHgxCQkvKiBQYWdlIGNhbiBiZSByZWFkLiAgKi8KKyNkZWZpbmUgUFJPVF9XUklURQkweDIJCS8qIFBhZ2UgY2FuIGJlIHdyaXR0ZW4uICAqLworI2RlZmluZSBQUk9UX0VYRUMJMHg0CQkvKiBQYWdlIGNhbiBiZSBleGVjdXRlZC4gICovCisjZGVmaW5lIFBST1RfTk9ORQkweDAJCS8qIFBhZ2UgY2FuIG5vdCBiZSBhY2Nlc3NlZC4gICovCisjZGVmaW5lIFBST1RfR1JPV1NET1dOCTB4MDEwMDAwMDAJLyogRXh0ZW5kIGNoYW5nZSB0byBzdGFydCBvZgorCQkJCQkgICBncm93c2Rvd24gdm1hIChtcHJvdGVjdCBvbmx5KS4gICovCisjZGVmaW5lIFBST1RfR1JPV1NVUAkweDAyMDAwMDAwCS8qIEV4dGVuZCBjaGFuZ2UgdG8gc3RhcnQgb2YKKwkJCQkJICAgZ3Jvd3N1cCB2bWEgKG1wcm90ZWN0IG9ubHkpLiAgKi8KKworLyogU2hhcmluZyB0eXBlcyAobXVzdCBjaG9vc2Ugb25lIGFuZCBvbmx5IG9uZSBvZiB0aGVzZSkuICAqLworI2RlZmluZSBNQVBfU0hBUkVECTB4MDEJCS8qIFNoYXJlIGNoYW5nZXMuICAqLworI2RlZmluZSBNQVBfUFJJVkFURQkweDAyCQkvKiBDaGFuZ2VzIGFyZSBwcml2YXRlLiAgKi8KKyNpZmRlZiBfX1VTRV9NSVNDCisjIGRlZmluZSBNQVBfVFlQRQkweDBmCQkvKiBNYXNrIGZvciB0eXBlIG9mIG1hcHBpbmcuICAqLworI2VuZGlmCisKKy8qIE90aGVyIGZsYWdzLiAgKi8KKyNkZWZpbmUgTUFQX0ZJWEVECTB4MTAJCS8qIEludGVycHJldCBhZGRyIGV4YWN0bHkuICAqLworI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIE1BUF9GSUxFCTAKKyMgZGVmaW5lIE1BUF9BTk9OWU1PVVMJMHgyMAkJLyogRG9uJ3QgdXNlIGEgZmlsZS4gICovCisjIGRlZmluZSBNQVBfQU5PTglNQVBfQU5PTllNT1VTCisjZW5kaWYKKworLyogVGhlc2UgYXJlIExpbnV4LXNwZWNpZmljLiAgKi8KKyNpZmRlZiBfX1VTRV9NSVNDCisjIGRlZmluZSBNQVBfR1JPV1NET1dOCTB4MDAxMDAJCS8qIFN0YWNrLWxpa2Ugc2VnbWVudC4gICovCisjIGRlZmluZSBNQVBfREVOWVdSSVRFCTB4MDA4MDAJCS8qIEVUWFRCU1kgKi8KKyMgZGVmaW5lIE1BUF9FWEVDVVRBQkxFCTB4MDEwMDAJCS8qIE1hcmsgaXQgYXMgYW4gZXhlY3V0YWJsZS4gICovCisjIGRlZmluZSBNQVBfTE9DS0VECTB4MDIwMDAJCS8qIExvY2sgdGhlIG1hcHBpbmcuICAqLworIyBkZWZpbmUgTUFQX05PUkVTRVJWRQkweDA0MDAwCQkvKiBEb24ndCBjaGVjayBmb3IgcmVzZXJ2YXRpb25zLiAgKi8KKyMgZGVmaW5lIE1BUF9QT1BVTEFURQkweDA4MDAwCQkvKiBQb3B1bGF0ZSAocHJlZmF1bHQpIHBhZ2V0YWJsZXMuICAqLworIyBkZWZpbmUgTUFQX05PTkJMT0NLCTB4MTAwMDAJCS8qIERvIG5vdCBibG9jayBvbiBJTy4gICovCisjIGRlZmluZSBNQVBfU1RBQ0sJMHgyMDAwMAkJLyogQWxsb2NhdGlvbiBpcyBmb3IgYSBzdGFjay4gICovCisjIGRlZmluZSBNQVBfSFVHRVRMQgkweDQwMDAwCQkvKiBDcmVhdGUgaHVnZSBwYWdlIG1hcHBpbmcuICAqLworI2VuZGlmCisKKy8qIEZsYWdzIHRvIGBtc3luYycuICAqLworI2RlZmluZSBNU19BU1lOQwkxCQkvKiBTeW5jIG1lbW9yeSBhc3luY2hyb25vdXNseS4gICovCisjZGVmaW5lIE1TX1NZTkMJCTQJCS8qIFN5bmNocm9ub3VzIG1lbW9yeSBzeW5jLiAgKi8KKyNkZWZpbmUgTVNfSU5WQUxJREFURQkyCQkvKiBJbnZhbGlkYXRlIHRoZSBjYWNoZXMuICAqLworCisvKiBGbGFncyBmb3IgYG1sb2NrYWxsJy4gICovCisjZGVmaW5lIE1DTF9DVVJSRU5UCTEJCS8qIExvY2sgYWxsIGN1cnJlbnRseSBtYXBwZWQgcGFnZXMuICAqLworI2RlZmluZSBNQ0xfRlVUVVJFCTIJCS8qIExvY2sgYWxsIGFkZGl0aW9ucyB0byBhZGRyZXNzCisJCQkJCSAgIHNwYWNlLiAgKi8KKworLyogRmxhZ3MgZm9yIGBtcmVtYXAnLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIE1SRU1BUF9NQVlNT1ZFCTEKKyMgZGVmaW5lIE1SRU1BUF9GSVhFRAkyCisjZW5kaWYKKworLyogQWR2aWNlIHRvIGBtYWR2aXNlJy4gICovCisjaWZkZWYgX19VU0VfQlNECisjIGRlZmluZSBNQURWX05PUk1BTAkgIDAJLyogTm8gZnVydGhlciBzcGVjaWFsIHRyZWF0bWVudC4gICovCisjIGRlZmluZSBNQURWX1JBTkRPTQkgIDEJLyogRXhwZWN0IHJhbmRvbSBwYWdlIHJlZmVyZW5jZXMuICAqLworIyBkZWZpbmUgTUFEVl9TRVFVRU5USUFMICAyCS8qIEV4cGVjdCBzZXF1ZW50aWFsIHBhZ2UgcmVmZXJlbmNlcy4gICovCisjIGRlZmluZSBNQURWX1dJTExORUVECSAgMwkvKiBXaWxsIG5lZWQgdGhlc2UgcGFnZXMuICAqLworIyBkZWZpbmUgTUFEVl9ET05UTkVFRAkgIDQJLyogRG9uJ3QgbmVlZCB0aGVzZSBwYWdlcy4gICovCisjIGRlZmluZSBNQURWX1JFTU9WRQkgIDkJLyogUmVtb3ZlIHRoZXNlIHBhZ2VzIGFuZCByZXNvdXJjZXMuICAqLworIyBkZWZpbmUgTUFEVl9ET05URk9SSwkgIDEwCS8qIERvIG5vdCBpbmhlcml0IGFjcm9zcyBmb3JrLiAgKi8KKyMgZGVmaW5lIE1BRFZfRE9GT1JLCSAgMTEJLyogRG8gaW5oZXJpdCBhY3Jvc3MgZm9yay4gICovCisjIGRlZmluZSBNQURWX01FUkdFQUJMRQkgIDEyCS8qIEtTTSBtYXkgbWVyZ2UgaWRlbnRpY2FsIHBhZ2VzLiAgKi8KKyMgZGVmaW5lIE1BRFZfVU5NRVJHRUFCTEUgMTMJLyogS1NNIG1heSBub3QgbWVyZ2UgaWRlbnRpY2FsIHBhZ2VzLiAgKi8KKyMgZGVmaW5lIE1BRFZfSFVHRVBBR0UJICAxNAkvKiBXb3J0aCBiYWNraW5nIHdpdGggaHVnZXBhZ2VzLiAgKi8KKyMgZGVmaW5lIE1BRFZfTk9IVUdFUEFHRSAgMTUJLyogTm90IHdvcnRoIGJhY2tpbmcgd2l0aCBodWdlcGFnZXMuICAqLworIyBkZWZpbmUgTUFEVl9IV1BPSVNPTgkgIDEwMAkvKiBQb2lzb24gYSBwYWdlIGZvciB0ZXN0aW5nLiAgKi8KKyNlbmRpZgorCisvKiBUaGUgUE9TSVggcGVvcGxlIGhhZCB0byBpbnZlbnQgc2ltaWxhciBuYW1lcyBmb3IgdGhlIHNhbWUgdGhpbmdzLiAgKi8KKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisjIGRlZmluZSBQT1NJWF9NQURWX05PUk1BTAkwIC8qIE5vIGZ1cnRoZXIgc3BlY2lhbCB0cmVhdG1lbnQuICAqLworIyBkZWZpbmUgUE9TSVhfTUFEVl9SQU5ET00JMSAvKiBFeHBlY3QgcmFuZG9tIHBhZ2UgcmVmZXJlbmNlcy4gICovCisjIGRlZmluZSBQT1NJWF9NQURWX1NFUVVFTlRJQUwJMiAvKiBFeHBlY3Qgc2VxdWVudGlhbCBwYWdlIHJlZmVyZW5jZXMuICAqLworIyBkZWZpbmUgUE9TSVhfTUFEVl9XSUxMTkVFRAkzIC8qIFdpbGwgbmVlZCB0aGVzZSBwYWdlcy4gICovCisjIGRlZmluZSBQT1NJWF9NQURWX0RPTlRORUVECTQgLyogRG9uJ3QgbmVlZCB0aGVzZSBwYWdlcy4gICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9tb25ldGFyeS1sZGJsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbW9uZXRhcnktbGRibC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMDgwZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbW9uZXRhcnktbGRibC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qIC1tbG9uZy1kb3VibGUtNjQgY29tcGF0aWJpbGl0eSBtb2RlIGZvciBtb25ldGFyeSBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01PTkVUQVJZX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvbW9uZXRhcnktbGRibC5oPiBkaXJlY3RseTsgdXNlIDxtb25ldGFyeS5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCitfX0xEQkxfUkVESVJfREVDTCAoc3RyZm1vbikKKworI2lmZGVmIF9fVVNFX0dOVQorX19MREJMX1JFRElSX0RFQ0wgKHN0cmZtb25fbCkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL21xdWV1ZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL21xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTI4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbXF1ZXVlLmgKQEAgLTAsMCArMSwzMiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9NUVVFVUVfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL21xdWV1ZS5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bXF1ZXVlLmg+IGluc3RlYWQuIgorI2VuZGlmCisKK3R5cGVkZWYgaW50IG1xZF90OworCitzdHJ1Y3QgbXFfYXR0cgoreworICBsb25nIGludCBtcV9mbGFnczsJLyogTWVzc2FnZSBxdWV1ZSBmbGFncy4gICovCisgIGxvbmcgaW50IG1xX21heG1zZzsJLyogTWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMuICAqLworICBsb25nIGludCBtcV9tc2dzaXplOwkvKiBNYXhpbXVtIG1lc3NhZ2Ugc2l6ZS4gICovCisgIGxvbmcgaW50IG1xX2N1cm1zZ3M7CS8qIE51bWJlciBvZiBtZXNzYWdlcyBjdXJyZW50bHkgcXVldWVkLiAgKi8KKyAgbG9uZyBpbnQgX19wYWRbNF07Cit9OwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL21xdWV1ZTIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9tcXVldWUyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZkMDgxNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9tcXVldWUyLmgKQEAgLTAsMCArMSw1OCBAQAorLyogQ2hlY2tpbmcgbWFjcm9zIGZvciBtcSBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX0ZDTlRMX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvbXF1ZXVlMi5oPiBkaXJlY3RseTsgdXNlIDxtcXVldWUuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogQ2hlY2sgdGhhdCBjYWxscyB0byBtcV9vcGVuIHdpdGggT19DUkVBVCBzZXQgaGF2ZSBhbiBhcHByb3ByaWF0ZSB0aGlyZCBhbmQgZm91cnRoCisgICBwYXJhbWV0ZXIuICAqLworZXh0ZXJuIG1xZF90IG1xX29wZW4gKF9fY29uc3QgY2hhciAqX19uYW1lLCBpbnQgX19vZmxhZywgLi4uKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBtcWRfdCBfX21xX29wZW5fMiAoX19jb25zdCBjaGFyICpfX25hbWUsIGludCBfX29mbGFnKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBtcWRfdCBfX1JFRElSRUNUX05USCAoX19tcV9vcGVuX2FsaWFzLCAoX19jb25zdCBjaGFyICpfX25hbWUsCisJCQkJCSAgICAgICBpbnQgX19vZmxhZywgLi4uKSwgbXFfb3BlbikKKyAgICAgX19ub25udWxsICgoMSkpOworX19lcnJvcmRlY2wgKF9fbXFfb3Blbl93cm9uZ19udW1iZXJfb2ZfYXJncywKKwkgICAgICJtcV9vcGVuIGNhbiBiZSBjYWxsZWQgZWl0aGVyIHdpdGggMiBvciA0IGFyZ3VtZW50cyIpOworX19lcnJvcmRlY2wgKF9fbXFfb3Blbl9taXNzaW5nX21vZGVfYW5kX2F0dHIsCisJICAgICAibXFfb3BlbiB3aXRoIE9fQ1JFQVQgaW4gc2Vjb25kIGFyZ3VtZW50IG5lZWRzIDQgYXJndW1lbnRzIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgbXFkX3QKK19fTlRIIChtcV9vcGVuIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgaW50IF9fb2ZsYWcsIC4uLikpCit7CisgIGlmIChfX3ZhX2FyZ19wYWNrX2xlbiAoKSAhPSAwICYmIF9fdmFfYXJnX3BhY2tfbGVuICgpICE9IDIpCisgICAgX19tcV9vcGVuX3dyb25nX251bWJlcl9vZl9hcmdzICgpOworCisgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19vZmxhZykpCisgICAgeworICAgICAgaWYgKChfX29mbGFnICYgT19DUkVBVCkgIT0gMCAmJiBfX3ZhX2FyZ19wYWNrX2xlbiAoKSA9PSAwKQorCXsKKwkgIF9fbXFfb3Blbl9taXNzaW5nX21vZGVfYW5kX2F0dHIgKCk7CisJICByZXR1cm4gX19tcV9vcGVuXzIgKF9fbmFtZSwgX19vZmxhZyk7CisJfQorICAgICAgcmV0dXJuIF9fbXFfb3Blbl9hbGlhcyAoX19uYW1lLCBfX29mbGFnLCBfX3ZhX2FyZ19wYWNrICgpKTsKKyAgICB9CisKKyAgaWYgKF9fdmFfYXJnX3BhY2tfbGVuICgpID09IDApCisgICAgcmV0dXJuIF9fbXFfb3Blbl8yIChfX25hbWUsIF9fb2ZsYWcpOworCisgIHJldHVybiBfX21xX29wZW5fYWxpYXMgKF9fbmFtZSwgX19vZmxhZywgX192YV9hcmdfcGFjayAoKSk7Cit9CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbXNxLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbXNxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJhNDliNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9tc3EuaApAQCAtMCwwICsxLDc3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19NU0dfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL21zcS5oPiBkaXJlY3RseTsgaW5jbHVkZSA8c3lzL21zZy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisvKiBEZWZpbmUgb3B0aW9ucyBmb3IgbWVzc2FnZSBxdWV1ZSBmdW5jdGlvbnMuICAqLworI2RlZmluZSBNU0dfTk9FUlJPUgkwMTAwMDAJLyogbm8gZXJyb3IgaWYgbWVzc2FnZSBpcyB0b28gYmlnICovCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBNU0dfRVhDRVBUCTAyMDAwMAkvKiByZWN2IGFueSBtc2cgZXhjZXB0IG9mIHNwZWNpZmllZCB0eXBlICovCisjZW5kaWYKKworLyogVHlwZXMgdXNlZCBpbiB0aGUgc3RydWN0dXJlIGRlZmluaXRpb24uICAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBtc2dxbnVtX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IG1zZ2xlbl90OworCisKKy8qIFN0cnVjdHVyZSBvZiByZWNvcmQgZm9yIG9uZSBtZXNzYWdlIGluc2lkZSB0aGUga2VybmVsLgorICAgVGhlIHR5cGUgYHN0cnVjdCBtc2cnIGlzIG9wYXF1ZS4gICovCitzdHJ1Y3QgbXNxaWRfZHMKK3sKKyAgc3RydWN0IGlwY19wZXJtIG1zZ19wZXJtOwkvKiBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBvcGVyYXRpb24gcGVybWlzc2lvbiAqLworICBfX3RpbWVfdCBtc2dfc3RpbWU7CQkvKiB0aW1lIG9mIGxhc3QgbXNnc25kIGNvbW1hbmQgKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQxOworICBfX3RpbWVfdCBtc2dfcnRpbWU7CQkvKiB0aW1lIG9mIGxhc3QgbXNncmN2IGNvbW1hbmQgKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQyOworICBfX3RpbWVfdCBtc2dfY3RpbWU7CQkvKiB0aW1lIG9mIGxhc3QgY2hhbmdlICovCisgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMzsKKyAgdW5zaWduZWQgbG9uZyBpbnQgX19tc2dfY2J5dGVzOyAvKiBjdXJyZW50IG51bWJlciBvZiBieXRlcyBvbiBxdWV1ZSAqLworICBtc2dxbnVtX3QgbXNnX3FudW07CQkvKiBudW1iZXIgb2YgbWVzc2FnZXMgY3VycmVudGx5IG9uIHF1ZXVlICovCisgIG1zZ2xlbl90IG1zZ19xYnl0ZXM7CQkvKiBtYXggbnVtYmVyIG9mIGJ5dGVzIGFsbG93ZWQgb24gcXVldWUgKi8KKyAgX19waWRfdCBtc2dfbHNwaWQ7CQkvKiBwaWQgb2YgbGFzdCBtc2dzbmQoKSAqLworICBfX3BpZF90IG1zZ19scnBpZDsJCS8qIHBpZCBvZiBsYXN0IG1zZ3JjdigpICovCisgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkNDsKKyAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQ1OworfTsKKworI2lmZGVmIF9fVVNFX01JU0MKKworIyBkZWZpbmUgbXNnX2NieXRlcwlfX21zZ19jYnl0ZXMKKworLyogaXBjcyBjdGwgY29tbWFuZHMgKi8KKyMgZGVmaW5lIE1TR19TVEFUIDExCisjIGRlZmluZSBNU0dfSU5GTyAxMgorCisvKiBidWZmZXIgZm9yIG1zZ2N0bCBjYWxscyBJUENfSU5GTywgTVNHX0lORk8gKi8KK3N0cnVjdCBtc2dpbmZvCisgIHsKKyAgICBpbnQgbXNncG9vbDsKKyAgICBpbnQgbXNnbWFwOworICAgIGludCBtc2dtYXg7CisgICAgaW50IG1zZ21uYjsKKyAgICBpbnQgbXNnbW5pOworICAgIGludCBtc2dzc3o7CisgICAgaW50IG1zZ3RxbDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgbXNnc2VnOworICB9OworCisjZW5kaWYgLyogX19VU0VfTUlTQyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL25hbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL25hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZTk3ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbmFuLmgKQEAgLTAsMCArMSw1MyBAQAorLyogYE5BTicgY29uc3RhbnQgZm9yIElFRUUgNzU0IG1hY2hpbmVzLgorICAgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTYsMTk5NywxOTk5LDIwMDQsMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTUFUSF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvbmFuLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxtYXRoLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKworLyogSUVFRSBOb3QgQSBOdW1iZXIuICAqLworCisjaWYgX19HTlVDX1BSRVJFUSgzLDMpCisKKyMgZGVmaW5lIE5BTgkoX19idWlsdGluX25hbmYgKCIiKSkKKworI2VsaWYgZGVmaW5lZCBfX0dOVUNfXworCisjIGRlZmluZSBOQU4gXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoKHVuaW9uIHsgdW5zaWduZWQgX19sIF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoX19TSV9fKSkpOyBmbG9hdCBfX2Q7IH0pICBcCisgICAgeyBfX2w6IDB4N2ZjMDAwMDBVTCB9KS5fX2QpCisKKyNlbHNlCisKKyMgaW5jbHVkZSA8ZW5kaWFuLmg+CisKKyMgaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorIyAgZGVmaW5lIF9fbmFuX2J5dGVzCQl7IDB4N2YsIDB4YzAsIDAsIDAgfQorIyBlbmRpZgorIyBpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjICBkZWZpbmUgX19uYW5fYnl0ZXMJCXsgMCwgMCwgMHhjMCwgMHg3ZiB9CisjIGVuZGlmCisKK3N0YXRpYyB1bmlvbiB7IHVuc2lnbmVkIGNoYXIgX19jWzRdOyBmbG9hdCBfX2Q7IH0gX19uYW5fdW5pb24KKyAgICBfX2F0dHJpYnV0ZV91c2VkX18gPSB7IF9fbmFuX2J5dGVzIH07CisjIGRlZmluZSBOQU4JKF9fbmFuX3VuaW9uLl9fZCkKKworI2VuZGlmCS8qIEdDQy4gICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbmV0ZGIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9uZXRkYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZGM3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvbmV0ZGIuaApAQCAtMCwwICsxLDMzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX05FVERCX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvbmV0ZGIuaD4gZGlyZWN0bHk7IHVzZSA8bmV0ZGIuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCisvKiBEZXNjcmlwdGlvbiBvZiBkYXRhIGJhc2UgZW50cnkgZm9yIGEgc2luZ2xlIG5ldHdvcmsuICBOT1RFOiBoZXJlIGEKKyAgIHBvb3IgYXNzdW1wdGlvbiBpcyBtYWRlLiAgVGhlIG5ldHdvcmsgbnVtYmVyIGlzIGV4cGVjdGVkIHRvIGZpdAorICAgaW50byBhbiB1bnNpZ25lZCBsb25nIGludCB2YXJpYWJsZS4gICovCitzdHJ1Y3QgbmV0ZW50Cit7CisgIGNoYXIgKm5fbmFtZTsJCQkvKiBPZmZpY2lhbCBuYW1lIG9mIG5ldHdvcmsuICAqLworICBjaGFyICoqbl9hbGlhc2VzOwkJLyogQWxpYXMgbGlzdC4gICovCisgIGludCBuX2FkZHJ0eXBlOwkJLyogTmV0IGFkZHJlc3MgdHlwZS4gICovCisgIHVpbnQzMl90IG5fbmV0OwkJLyogTmV0d29yayBudW1iZXIuICAqLworfTsKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9wb2xsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvcG9sbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZDc1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvcG9sbC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMjAwMSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1BPTExfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL3BvbGwuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHN5cy9wb2xsLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIEV2ZW50IHR5cGVzIHRoYXQgY2FuIGJlIHBvbGxlZCBmb3IuICBUaGVzZSBiaXRzIG1heSBiZSBzZXQgaW4gYGV2ZW50cycKKyAgIHRvIGluZGljYXRlIHRoZSBpbnRlcmVzdGluZyBldmVudCB0eXBlczsgdGhleSB3aWxsIGFwcGVhciBpbiBgcmV2ZW50cycKKyAgIHRvIGluZGljYXRlIHRoZSBzdGF0dXMgb2YgdGhlIGZpbGUgZGVzY3JpcHRvci4gICovCisjZGVmaW5lIFBPTExJTgkJMHgwMDEJCS8qIFRoZXJlIGlzIGRhdGEgdG8gcmVhZC4gICovCisjZGVmaW5lIFBPTExQUkkJCTB4MDAyCQkvKiBUaGVyZSBpcyB1cmdlbnQgZGF0YSB0byByZWFkLiAgKi8KKyNkZWZpbmUgUE9MTE9VVAkJMHgwMDQJCS8qIFdyaXRpbmcgbm93IHdpbGwgbm90IGJsb2NrLiAgKi8KKworI2lmIGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorLyogVGhlc2UgdmFsdWVzIGFyZSBkZWZpbmVkIGluIFhQRzQuMi4gICovCisjIGRlZmluZSBQT0xMUkROT1JNCTB4MDQwCQkvKiBOb3JtYWwgZGF0YSBtYXkgYmUgcmVhZC4gICovCisjIGRlZmluZSBQT0xMUkRCQU5ECTB4MDgwCQkvKiBQcmlvcml0eSBkYXRhIG1heSBiZSByZWFkLiAgKi8KKyMgZGVmaW5lIFBPTExXUk5PUk0JMHgxMDAJCS8qIFdyaXRpbmcgbm93IHdpbGwgbm90IGJsb2NrLiAgKi8KKyMgZGVmaW5lIFBPTExXUkJBTkQJMHgyMDAJCS8qIFByaW9yaXR5IGRhdGEgbWF5IGJlIHdyaXR0ZW4uICAqLworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRoZXNlIGFyZSBleHRlbnNpb25zIGZvciBMaW51eC4gICovCisjIGRlZmluZSBQT0xMTVNHCTB4NDAwCisjIGRlZmluZSBQT0xMUkVNT1ZFCTB4MTAwMAorIyBkZWZpbmUgUE9MTFJESFVQCTB4MjAwMAorI2VuZGlmCisKKy8qIEV2ZW50IHR5cGVzIGFsd2F5cyBpbXBsaWNpdGx5IHBvbGxlZCBmb3IuICBUaGVzZSBiaXRzIG5lZWQgbm90IGJlIHNldCBpbgorICAgYGV2ZW50cycsIGJ1dCB0aGV5IHdpbGwgYXBwZWFyIGluIGByZXZlbnRzJyB0byBpbmRpY2F0ZSB0aGUgc3RhdHVzIG9mCisgICB0aGUgZmlsZSBkZXNjcmlwdG9yLiAgKi8KKyNkZWZpbmUgUE9MTEVSUgkJMHgwMDgJCS8qIEVycm9yIGNvbmRpdGlvbi4gICovCisjZGVmaW5lIFBPTExIVVAJCTB4MDEwCQkvKiBIdW5nIHVwLiAgKi8KKyNkZWZpbmUgUE9MTE5WQUwJMHgwMjAJCS8qIEludmFsaWQgcG9sbGluZyByZXF1ZXN0LiAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9wb3NpeDFfbGltLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvcG9zaXgxX2xpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZWI0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvcG9zaXgxX2xpbS5oCkBAIC0wLDAgKzEsMTcyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5Myw5Niw5OCwyMDAwLTIwMDMsMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCVBPU0lYIFN0YW5kYXJkOiAyLjkuMiBNaW5pbXVtIFZhbHVlcwlBZGRlZCB0byA8bGltaXRzLmg+CisgKgorICoJTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHk7IHVzZSA8bGltaXRzLmg+IGluc3RlYWQuCisgKi8KKworI2lmbmRlZglfQklUU19QT1NJWDFfTElNX0gKKyNkZWZpbmUJX0JJVFNfUE9TSVgxX0xJTV9ICTEKKworCisvKiBUaGVzZSBhcmUgdGhlIHN0YW5kYXJkLW1hbmRhdGVkIG1pbmltdW0gdmFsdWVzLiAgKi8KKworLyogTWluaW11bSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBpbiBvbmUgbGlzdCBJL08gY2FsbC4gICovCisjZGVmaW5lIF9QT1NJWF9BSU9fTElTVElPX01BWAkyCisKKy8qIE1pbmltYWwgbnVtYmVyIG9mIG91dHN0YW5kaW5nIGFzeW5jaHJvbm91cyBJL08gb3BlcmF0aW9ucy4gICovCisjZGVmaW5lIF9QT1NJWF9BSU9fTUFYCQkxCisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIGFyZ3VtZW50cyB0byBgZXhlY3ZlJywgaW5jbHVkaW5nIGVudmlyb25tZW50LiAgKi8KKyNkZWZpbmUJX1BPU0lYX0FSR19NQVgJCTQwOTYKKworLyogTWF4aW11bSBzaW11bHRhbmVvdXMgcHJvY2Vzc2VzIHBlciByZWFsIHVzZXIgSUQuICAqLworI2lmZGVmIF9fVVNFX1hPUEVOMksKKyMgZGVmaW5lIF9QT1NJWF9DSElMRF9NQVgJMjUKKyNlbHNlCisjIGRlZmluZSBfUE9TSVhfQ0hJTERfTUFYCTYKKyNlbmRpZgorCisvKiBNaW5pbWFsIG51bWJlciBvZiB0aW1lciBleHBpcmF0aW9uIG92ZXJydW5zLiAgKi8KKyNkZWZpbmUgX1BPU0lYX0RFTEFZVElNRVJfTUFYCTMyCisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIGEgaG9zdCBuYW1lIChub3QgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBudWxsKQorICAgYXMgcmV0dXJuZWQgZnJvbSB0aGUgR0VUSE9TVE5BTUUgZnVuY3Rpb24uICAqLworI2RlZmluZSBfUE9TSVhfSE9TVF9OQU1FX01BWAkyNTUKKworLyogTWF4aW11bSBsaW5rIGNvdW50IG9mIGEgZmlsZS4gICovCisjZGVmaW5lCV9QT1NJWF9MSU5LX01BWAkJOAorCisvKiBNYXhpbXVtIGxlbmd0aCBvZiBsb2dpbiBuYW1lLiAgKi8KKyNkZWZpbmUJX1BPU0lYX0xPR0lOX05BTUVfTUFYCTkKKworLyogTnVtYmVyIG9mIGJ5dGVzIGluIGEgdGVybWluYWwgY2Fub25pY2FsIGlucHV0IHF1ZXVlLiAgKi8KKyNkZWZpbmUJX1BPU0lYX01BWF9DQU5PTgkyNTUKKworLyogTnVtYmVyIG9mIGJ5dGVzIGZvciB3aGljaCBzcGFjZSB3aWxsIGJlCisgICBhdmFpbGFibGUgaW4gYSB0ZXJtaW5hbCBpbnB1dCBxdWV1ZS4gICovCisjZGVmaW5lCV9QT1NJWF9NQVhfSU5QVVQJMjU1CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2UgcXVldWVzIG9wZW4gZm9yIGEgcHJvY2Vzcy4gICovCisjZGVmaW5lIF9QT1NJWF9NUV9PUEVOX01BWAk4CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCBtZXNzYWdlIHByaW9yaXRpZXMuICAqLworI2RlZmluZSBfUE9TSVhfTVFfUFJJT19NQVgJMzIKKworLyogTnVtYmVyIG9mIGJ5dGVzIGluIGEgZmlsZW5hbWUuICAqLworI2RlZmluZQlfUE9TSVhfTkFNRV9NQVgJCTE0CisKKy8qIE51bWJlciBvZiBzaW11bHRhbmVvdXMgc3VwcGxlbWVudGFyeSBncm91cCBJRHMgcGVyIHByb2Nlc3MuICAqLworI2lmZGVmIF9fVVNFX1hPUEVOMksKKyMgZGVmaW5lIF9QT1NJWF9OR1JPVVBTX01BWAk4CisjZWxzZQorIyBkZWZpbmUgX1BPU0lYX05HUk9VUFNfTUFYCTAKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgZmlsZXMgb25lIHByb2Nlc3MgY2FuIGhhdmUgb3BlbiBhdCBvbmNlLiAgKi8KKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisjIGRlZmluZSBfUE9TSVhfT1BFTl9NQVgJMjAKKyNlbHNlCisjIGRlZmluZSBfUE9TSVhfT1BFTl9NQVgJMTYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgX19VU0VfWE9QRU4ySyB8fCBkZWZpbmVkIF9fVVNFX0dOVQorLyogTnVtYmVyIG9mIGRlc2NyaXB0b3JzIHRoYXQgYSBwcm9jZXNzIG1heSBleGFtaW5lIHdpdGggYHBzZWxlY3QnIG9yCisgICBgc2VsZWN0Jy4gICovCisjIGRlZmluZSBfUE9TSVhfRkRfU0VUU0laRQlfUE9TSVhfT1BFTl9NQVgKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gYSBwYXRobmFtZS4gICovCisjZGVmaW5lCV9QT1NJWF9QQVRIX01BWAkJMjU2CisKKy8qIE51bWJlciBvZiBieXRlcyB0aGFuIGNhbiBiZSB3cml0dGVuIGF0b21pY2FsbHkgdG8gYSBwaXBlLiAgKi8KKyNkZWZpbmUJX1BPU0lYX1BJUEVfQlVGCQk1MTIKKworLyogVGhlIG51bWJlciBvZiByZXBlYXRlZCBvY2N1cnJlbmNlcyBvZiBhIEJSRSBwZXJtaXR0ZWQgYnkgdGhlCisgICBSRUdFWEVDIGFuZCBSRUdDT01QIGZ1bmN0aW9ucyB3aGVuIHVzaW5nIHRoZSBpbnRlcnZhbCBub3RhdGlvbi4gICovCisjZGVmaW5lIF9QT1NJWF9SRV9EVVBfTUFYCTI1NQorCisvKiBNaW5pbWFsIG51bWJlciBvZiByZWFsdGltZSBzaWduYWxzIHJlc2VydmVkIGZvciB0aGUgYXBwbGljYXRpb24uICAqLworI2RlZmluZSBfUE9TSVhfUlRTSUdfTUFYCTgKKworLyogTnVtYmVyIG9mIHNlbWFwaG9yZXMgYSBwcm9jZXNzIGNhbiBoYXZlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1NFTV9OU0VNU19NQVgJMjU2CisKKy8qIE1heGltYWwgdmFsdWUgb2YgYSBzZW1hcGhvcmUuICAqLworI2RlZmluZSBfUE9TSVhfU0VNX1ZBTFVFX01BWAkzMjc2NworCisvKiBOdW1iZXIgb2YgcGVuZGluZyByZWFsdGltZSBzaWduYWxzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1NJR1FVRVVFX01BWAkzMgorCisvKiBMYXJnZXN0IHZhbHVlIG9mIGEgYHNzaXplX3QnLiAgKi8KKyNkZWZpbmUJX1BPU0lYX1NTSVpFX01BWAkzMjc2NworCisvKiBOdW1iZXIgb2Ygc3RyZWFtcyBhIHByb2Nlc3MgY2FuIGhhdmUgb3BlbiBhdCBvbmNlLiAgKi8KKyNkZWZpbmUJX1BPU0lYX1NUUkVBTV9NQVgJOAorCisvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgc3ltYm9saWMgbGluay4gICovCisjZGVmaW5lIF9QT1NJWF9TWU1MSU5LX01BWAkyNTUKKworLyogVGhlIG51bWJlciBvZiBzeW1ib2xpYyBsaW5rcyB0aGF0IGNhbiBiZSB0cmF2ZXJzZWQgaW4gdGhlCisgICByZXNvbHV0aW9uIG9mIGEgcGF0aG5hbWUgaW4gdGhlIGFic2VuY2Ugb2YgYSBsb29wLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1NZTUxPT1BfTUFYCTgKKworLyogTnVtYmVyIG9mIHRpbWVyIGZvciBhIHByb2Nlc3MuICAqLworI2RlZmluZSBfUE9TSVhfVElNRVJfTUFYCTMyCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYSB0dHkgbmFtZS4gICovCisjZGVmaW5lCV9QT1NJWF9UVFlfTkFNRV9NQVgJOQorCisvKiBNYXhpbXVtIGxlbmd0aCBvZiBhIHRpbWV6b25lIG5hbWUgKGVsZW1lbnQgb2YgYHR6bmFtZScpLiAgKi8KKyNkZWZpbmUJX1BPU0lYX1RaTkFNRV9NQVgJNgorCisjaWYgIWRlZmluZWQgX19VU0VfWE9QRU4ySyB8fCBkZWZpbmVkIF9fVVNFX0dOVQorLyogTWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCBjYW4gYmUgcXVldWVkIG9uIGEgc29ja2V0LiAgKi8KKyMgZGVmaW5lIF9QT1NJWF9RTElNSVQJCTEKKworLyogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgYnVmZmVyZWQgb24gYSBzb2NrZXQgZm9yIHNlbmQKKyAgIG9yIHJlY2VpdmUuICAqLworIyBkZWZpbmUgX1BPU0lYX0hJV0FUCQlfUE9TSVhfUElQRV9CVUYKKworLyogTWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYW4gYGlvdmVjJyBhcnJheS4gICovCisjIGRlZmluZSBfUE9TSVhfVUlPX01BWElPVgkxNgorI2VuZGlmCisKKy8qIE1heGltdW0gY2xvY2sgcmVzb2x1dGlvbiBpbiBuYW5vc2Vjb25kcy4gICovCisjZGVmaW5lIF9QT1NJWF9DTE9DS1JFU19NSU4JMjAwMDAwMDAKKworCisvKiBHZXQgdGhlIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHZhbHVlcyBmb3IgdGhlIGFib3ZlLiAgKi8KKyNpbmNsdWRlIDxiaXRzL2xvY2FsX2xpbS5oPgorCisKKyNpZm5kZWYJU1NJWkVfTUFYCisjIGRlZmluZSBTU0laRV9NQVgJTE9OR19NQVgKKyNlbmRpZgorCisKKy8qIFRoaXMgdmFsdWUgaXMgYSBndWFyYW50ZWVkIG1pbmltdW0gbWF4aW11bS4KKyAgIFRoZSBjdXJyZW50IG1heGltdW0gY2FuIGJlIGdvdCBmcm9tIGBzeXNjb25mJy4gICovCisKKyNpZm5kZWYJTkdST1VQU19NQVgKKyMgZGVmaW5lIE5HUk9VUFNfTUFYCTgKKyNlbmRpZgorCisjZW5kaWYJLyogYml0cy9wb3NpeDFfbGltLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvcG9zaXgyX2xpbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3Bvc2l4Ml9saW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDQ4M2EwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3Bvc2l4Ml9saW0uaApAQCAtMCwwICsxLDkxIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTYsIDE5OTksIDIwMDAsIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKiBOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseTsgaW5jbHVkZSA8bGltaXRzLmg+IGluc3RlYWQuCisgKi8KKworI2lmbmRlZglfQklUU19QT1NJWDJfTElNX0gKKyNkZWZpbmUJX0JJVFNfUE9TSVgyX0xJTV9ICTEKKworCisvKiBUaGUgbWF4aW11bSBgaWJhc2UnIGFuZCBgb2Jhc2UnIHZhbHVlcyBhbGxvd2VkIGJ5IHRoZSBgYmMnIHV0aWxpdHkuICAqLworI2RlZmluZQlfUE9TSVgyX0JDX0JBU0VfTUFYCQk5OQorCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgYWxsb3dlZCBpbiBhbiBhcnJheSBieSB0aGUgYGJjJyB1dGlsaXR5LiAgKi8KKyNkZWZpbmUJX1BPU0lYMl9CQ19ESU1fTUFYCQkyMDQ4CisKKy8qIFRoZSBtYXhpbXVtIGBzY2FsZScgdmFsdWUgYWxsb3dlZCBieSB0aGUgYGJjJyB1dGlsaXR5LiAgKi8KKyNkZWZpbmUJX1BPU0lYMl9CQ19TQ0FMRV9NQVgJCTk5CisKKy8qIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIHN0cmluZyBjb25zdGFudCBhY2NlcHRlZCBieSB0aGUgYGJjJyB1dGlsaXR5LiAgKi8KKyNkZWZpbmUJX1BPU0lYMl9CQ19TVFJJTkdfTUFYCQkxMDAwCisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiB3ZWlnaHRzIHRoYXQgY2FuIGJlIGFzc2lnbmVkIHRvIGFuIGVudHJ5IG9mCisgICB0aGUgTENfQ09MTEFURSBgb3JkZXInIGtleXdvcmQgaW4gdGhlIGxvY2FsZSBkZWZpbml0aW9uIGZpbGUuICAqLworI2RlZmluZQlfUE9TSVgyX0NPTExfV0VJR0hUU19NQVgJMgorCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZXhwcmVzc2lvbnMgdGhhdCBjYW4gYmUgbmVzdGVkCisgICB3aXRoaW4gcGFyZW50aGVzZXMgYnkgdGhlIGBleHByJyB1dGlsaXR5LiAgKi8KKyNkZWZpbmUJX1BPU0lYMl9FWFBSX05FU1RfTUFYCQkzMgorCisvKiBUaGUgbWF4aW11bSBsZW5ndGgsIGluIGJ5dGVzLCBvZiBhbiBpbnB1dCBsaW5lLiAgKi8KKyNkZWZpbmUJX1BPU0lYMl9MSU5FX01BWAkJMjA0OAorCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVwZWF0ZWQgb2NjdXJyZW5jZXMgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgIHBlcm1pdHRlZCB3aGVuIHVzaW5nIHRoZSBpbnRlcnZhbCBub3RhdGlvbiBgXHtNLE5cfScuICAqLworI2RlZmluZQlfUE9TSVgyX1JFX0RVUF9NQVgJCTI1NQorCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBjaGFyYWN0ZXIgY2xhc3MgbmFtZS4gIFdlIGhhdmUgbm8KKyAgIGZpeGVkIGxpbWl0LCAyMDQ4IGlzIGEgaGlnaCBudW1iZXIuICAqLworI2RlZmluZQlfUE9TSVgyX0NIQVJDTEFTU19OQU1FX01BWAkxNAorCisKKy8qIFRoZXNlIHZhbHVlcyBhcmUgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMsCisgICBhbmQgbWF5IHZhcnkgd2l0aGluIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgIFRoZWlyIHByZWNpc2UgdmFsdWVzIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHN5c2NvbmYuICAqLworCisjaWZuZGVmCUJDX0JBU0VfTUFYCisjZGVmaW5lCUJDX0JBU0VfTUFYCQlfUE9TSVgyX0JDX0JBU0VfTUFYCisjZW5kaWYKKyNpZm5kZWYJQkNfRElNX01BWAorI2RlZmluZQlCQ19ESU1fTUFYCQlfUE9TSVgyX0JDX0RJTV9NQVgKKyNlbmRpZgorI2lmbmRlZglCQ19TQ0FMRV9NQVgKKyNkZWZpbmUJQkNfU0NBTEVfTUFYCQlfUE9TSVgyX0JDX1NDQUxFX01BWAorI2VuZGlmCisjaWZuZGVmCUJDX1NUUklOR19NQVgKKyNkZWZpbmUJQkNfU1RSSU5HX01BWAkJX1BPU0lYMl9CQ19TVFJJTkdfTUFYCisjZW5kaWYKKyNpZm5kZWYJQ09MTF9XRUlHSFRTX01BWAorI2RlZmluZQlDT0xMX1dFSUdIVFNfTUFYCTI1NQorI2VuZGlmCisjaWZuZGVmCUVYUFJfTkVTVF9NQVgKKyNkZWZpbmUJRVhQUl9ORVNUX01BWAkJX1BPU0lYMl9FWFBSX05FU1RfTUFYCisjZW5kaWYKKyNpZm5kZWYJTElORV9NQVgKKyNkZWZpbmUJTElORV9NQVgJCV9QT1NJWDJfTElORV9NQVgKKyNlbmRpZgorI2lmbmRlZglDSEFSQ0xBU1NfTkFNRV9NQVgKKyNkZWZpbmUJQ0hBUkNMQVNTX05BTUVfTUFYCTIwNDgKKyNlbmRpZgorCisvKiBUaGlzIHZhbHVlIGlzIGRlZmluZWQgbGlrZSB0aGlzIGluIHJlZ2V4LmguICAqLworI2RlZmluZQlSRV9EVVBfTUFYICgweDdmZmYpCisKKyNlbmRpZgkvKiBiaXRzL3Bvc2l4Ml9saW0uaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3Bvc2l4X29wdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3Bvc2l4X29wdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NTAzNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvcG9zaXhfb3B0LmgKQEAgLTAsMCArMSwxOTIgQEAKKy8qIERlZmluZSBQT1NJWCBvcHRpb25zIGZvciBMaW51eC4KKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDA0LCAyMDA2LCAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCisgICB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYJX0JJVFNfUE9TSVhfT1BUX0gKKyNkZWZpbmUJX0JJVFNfUE9TSVhfT1BUX0gJMQorCisvKiBKb2IgY29udHJvbCBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZQlfUE9TSVhfSk9CX0NPTlRST0wJMQorCisvKiBQcm9jZXNzZXMgaGF2ZSBhIHNhdmVkIHNldC11c2VyLUlEIGFuZCBhIHNhdmVkIHNldC1ncm91cC1JRC4gICovCisjZGVmaW5lCV9QT1NJWF9TQVZFRF9JRFMJMQorCisvKiBQcmlvcml0eSBzY2hlZHVsaW5nIGlzIHN1cHBvcnRlZC4gICovCisjZGVmaW5lCV9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HCTIwMDgwOUwKKworLyogU3luY2hyb25pemluZyBmaWxlIGRhdGEgaXMgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUJX1BPU0lYX1NZTkNIUk9OSVpFRF9JTwkyMDA4MDlMCisKKy8qIFRoZSBmc3luYyBmdW5jdGlvbiBpcyBwcmVzZW50LiAgKi8KKyNkZWZpbmUJX1BPU0lYX0ZTWU5DCTIwMDgwOUwKKworLyogTWFwcGluZyBvZiBmaWxlcyB0byBtZW1vcnkgaXMgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUJX1BPU0lYX01BUFBFRF9GSUxFUwkyMDA4MDlMCisKKy8qIExvY2tpbmcgb2YgYWxsIG1lbW9yeSBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZQlfUE9TSVhfTUVNTE9DSwkyMDA4MDlMCisKKy8qIExvY2tpbmcgb2YgcmFuZ2VzIG9mIG1lbW9yeSBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZQlfUE9TSVhfTUVNTE9DS19SQU5HRQkyMDA4MDlMCisKKy8qIFNldHRpbmcgb2YgbWVtb3J5IHByb3RlY3Rpb25zIGlzIHN1cHBvcnRlZC4gICovCisjZGVmaW5lCV9QT1NJWF9NRU1PUllfUFJPVEVDVElPTgkyMDA4MDlMCisKKy8qIFNvbWUgZmlsZXN5c3RlbXMgYWxsb3cgYWxsIHVzZXJzIHRvIGNoYW5nZSBmaWxlIG93bmVyc2hpcC4gICovCisjZGVmaW5lCV9QT1NJWF9DSE9XTl9SRVNUUklDVEVECTAKKworLyogYGNfY2MnIG1lbWJlciBvZiAnc3RydWN0IHRlcm1pb3MnIHN0cnVjdHVyZSBjYW4gYmUgZGlzYWJsZWQgYnkKKyAgIHVzaW5nIHRoZSB2YWx1ZSBfUE9TSVhfVkRJU0FCTEUuICAqLworI2RlZmluZQlfUE9TSVhfVkRJU0FCTEUJJ1wwJworCisvKiBGaWxlbmFtZXMgYXJlIG5vdCBzaWxlbnRseSB0cnVuY2F0ZWQuICAqLworI2RlZmluZQlfUE9TSVhfTk9fVFJVTkMJMQorCisvKiBYL09wZW4gcmVhbHRpbWUgc3VwcG9ydCBpcyBhdmFpbGFibGUuICAqLworI2RlZmluZSBfWE9QRU5fUkVBTFRJTUUJMQorCisvKiBYL09wZW4gdGhyZWFkIHJlYWx0aW1lIHN1cHBvcnQgaXMgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1hPUEVOX1JFQUxUSU1FX1RIUkVBRFMJMQorCisvKiBYUEc0LjIgc2hhcmVkIG1lbW9yeSBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZQlfWE9QRU5fU0hNCTEKKworLyogVGVsbCB3ZSBoYXZlIFBPU0lYIHRocmVhZHMuICAqLworI2RlZmluZSBfUE9TSVhfVEhSRUFEUwkyMDA4MDlMCisKKy8qIFdlIGhhdmUgdGhlIHJlZW50cmFudCBmdW5jdGlvbnMgZGVzY3JpYmVkIGluIFBPU0lYLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1JFRU5UUkFOVF9GVU5DVElPTlMgICAgICAxCisjZGVmaW5lIF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMJMjAwODA5TAorCisvKiBXZSBwcm92aWRlIHByaW9yaXR5IHNjaGVkdWxpbmcgZm9yIHRocmVhZHMuICAqLworI2RlZmluZSBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcJMjAwODA5TAorCisvKiBXZSBzdXBwb3J0IHVzZXItZGVmaW5lZCBzdGFjayBzaXplcy4gICovCisjZGVmaW5lIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUJMjAwODA5TAorCisvKiBXZSBzdXBwb3J0IHVzZXItZGVmaW5lZCBzdGFja3MuICAqLworI2RlZmluZSBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tBRERSCTIwMDgwOUwKKworLyogV2Ugc3VwcG9ydCBwcmlvcml0eSBpbmhlcml0ZW5jZS4gICovCisjZGVmaW5lIF9QT1NJWF9USFJFQURfUFJJT19JTkhFUklUCTIwMDgwOUwKKworLyogV2Ugc3VwcG9ydCBwcmlvcml0eSBwcm90ZWN0aW9uLCB0aG91Z2ggb25seSBmb3Igbm9uLXJvYnVzdAorICAgbXV0ZXhlcy4gICovCisjZGVmaW5lIF9QT1NJWF9USFJFQURfUFJJT19QUk9URUNUCTIwMDgwOUwKKworI2lmZGVmIF9fVVNFX1hPUEVOMks4CisvKiBXZSBzdXBwb3J0IHByaW9yaXR5IGluaGVyaXRlbmNlIGZvciByb2J1c3QgbXV0ZXhlcy4gICovCisjIGRlZmluZSBfUE9TSVhfVEhSRUFEX1JPQlVTVF9QUklPX0lOSEVSSVQJMjAwODA5TAorCisvKiBXZSBkbyBub3Qgc3VwcG9ydCBwcmlvcml0eSBwcm90ZWN0aW9uIGZvciByb2J1c3QgbXV0ZXhlcy4gICovCisjIGRlZmluZSBfUE9TSVhfVEhSRUFEX1JPQlVTVF9QUklPX1BST1RFQ1QJLTEKKyNlbmRpZgorCisvKiBXZSBzdXBwb3J0IFBPU0lYLjFiIHNlbWFwaG9yZXMuICAqLworI2RlZmluZSBfUE9TSVhfU0VNQVBIT1JFUwkyMDA4MDlMCisKKy8qIFJlYWwtdGltZSBzaWduYWxzIGFyZSBzdXBwb3J0ZWQuICAqLworI2RlZmluZSBfUE9TSVhfUkVBTFRJTUVfU0lHTkFMUwkyMDA4MDlMCisKKy8qIFdlIHN1cHBvcnQgYXN5bmNocm9ub3VzIEkvTy4gICovCisjZGVmaW5lIF9QT1NJWF9BU1lOQ0hST05PVVNfSU8JMjAwODA5TAorI2RlZmluZSBfUE9TSVhfQVNZTkNfSU8JCTEKKy8qIEFsdGVybmF0aXZlIG5hbWUgZm9yIFVuaXg5OC4gICovCisjZGVmaW5lIF9MRlNfQVNZTkNIUk9OT1VTX0lPCTEKKy8qIFN1cHBvcnQgZm9yIHByaW9yaXRpemF0aW9uIGlzIGFsc28gYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1BSSU9SSVRJWkVEX0lPCTIwMDgwOUwKKworLyogVGhlIExGUyBzdXBwb3J0IGluIGFzeW5jaHJvbm91cyBJL08gaXMgYWxzbyBhdmFpbGFibGUuICAqLworI2RlZmluZSBfTEZTNjRfQVNZTkNIUk9OT1VTX0lPCTEKKworLyogVGhlIHJlc3Qgb2YgdGhlIExGUyBpcyBhbHNvIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9MRlNfTEFSR0VGSUxFCQkxCisjZGVmaW5lIF9MRlM2NF9MQVJHRUZJTEUJMQorI2RlZmluZSBfTEZTNjRfU1RESU8JCTEKKworLyogUE9TSVggc2hhcmVkIG1lbW9yeSBvYmplY3RzIGFyZSBpbXBsZW1lbnRlZC4gICovCisjZGVmaW5lIF9QT1NJWF9TSEFSRURfTUVNT1JZX09CSkVDVFMJMjAwODA5TAorCisvKiBDUFUtdGltZSBjbG9ja3Mgc3VwcG9ydCBuZWVkcyB0byBiZSBjaGVja2VkIGF0IHJ1bnRpbWUuICAqLworI2RlZmluZSBfUE9TSVhfQ1BVVElNRQkwCisKKy8qIENsb2NrIHN1cHBvcnQgaW4gdGhyZWFkcyBtdXN0IGJlIGFsc28gY2hlY2tlZCBhdCBydW50aW1lLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9DUFVUSU1FCTAKKworLyogR05VIGxpYmMgcHJvdmlkZXMgcmVndWxhciBleHByZXNzaW9uIGhhbmRsaW5nLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1JFR0VYUAkxCisKKy8qIFJlYWRlci9Xcml0ZXIgbG9ja3MgYXJlIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9QT1NJWF9SRUFERVJfV1JJVEVSX0xPQ0tTCTIwMDgwOUwKKworLyogV2UgaGF2ZSBhIFBPU0lYIHNoZWxsLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1NIRUxMCTEKKworLyogV2Ugc3VwcG9ydCB0aGUgVGltZW91dHMgb3B0aW9uLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RJTUVPVVRTCTIwMDgwOUwKKworLyogV2Ugc3VwcG9ydCBzcGlubG9ja3MuICAqLworI2RlZmluZSBfUE9TSVhfU1BJTl9MT0NLUwkyMDA4MDlMCisKKy8qIFRoZSBgc3Bhd24nIGZ1bmN0aW9uIGZhbWlseSBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZSBfUE9TSVhfU1BBV04JMjAwODA5TAorCisvKiBXZSBoYXZlIFBPU0lYIHRpbWVycy4gICovCisjZGVmaW5lIF9QT1NJWF9USU1FUlMJMjAwODA5TAorCisvKiBUaGUgYmFycmllciBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9QT1NJWF9CQVJSSUVSUwkyMDA4MDlMCisKKy8qIFBPU0lYIG1lc3NhZ2UgcXVldWVzIGFyZSBhdmFpbGFibGUuICAqLworI2RlZmluZQlfUE9TSVhfTUVTU0FHRV9QQVNTSU5HCTIwMDgwOUwKKworLyogVGhyZWFkIHByb2Nlc3Mtc2hhcmVkIHN5bmNocm9uaXphdGlvbiBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZSBfUE9TSVhfVEhSRUFEX1BST0NFU1NfU0hBUkVECTIwMDgwOUwKKworLyogVGhlIG1vbm90b25pYyBjbG9jayBtaWdodCBiZSBhdmFpbGFibGUuICAqLworI2RlZmluZSBfUE9TSVhfTU9OT1RPTklDX0NMT0NLCTAKKworLyogVGhlIGNsb2NrIHNlbGVjdGlvbiBpbnRlcmZhY2VzIGFyZSBhdmFpbGFibGUuICAqLworI2RlZmluZSBfUE9TSVhfQ0xPQ0tfU0VMRUNUSU9OCTIwMDgwOUwKKworLyogQWR2aXNvcnkgaW5mb3JtYXRpb24gaW50ZXJmYWNlcyBhcmUgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX0FEVklTT1JZX0lORk8JMjAwODA5TAorCisvKiBJUHY2IHN1cHBvcnQgaXMgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX0lQVjYJMjAwODA5TAorCisvKiBSYXcgc29ja2V0IHN1cHBvcnQgaXMgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1JBV19TT0NLRVRTCTIwMDgwOUwKKworLyogV2UgaGF2ZSBhdCBsZWFzdCBvbmUgdGVybWluYWwuICAqLworI2RlZmluZSBfUE9TSVgyX0NIQVJfVEVSTQkyMDA4MDlMCisKKy8qIE5laXRoZXIgcHJvY2VzcyBub3IgdGhyZWFkIHNwb3JhZGljIHNlcnZlciBpbnRlcmZhY2VzIGlzIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9QT1NJWF9TUE9SQURJQ19TRVJWRVIJLTEKKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9TUE9SQURJQ19TRVJWRVIJLTEKKworLyogdHJhY2UuaCBpcyBub3QgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RSQUNFCS0xCisjZGVmaW5lIF9QT1NJWF9UUkFDRV9FVkVOVF9GSUxURVIJLTEKKyNkZWZpbmUgX1BPU0lYX1RSQUNFX0lOSEVSSVQJLTEKKyNkZWZpbmUgX1BPU0lYX1RSQUNFX0xPRwktMQorCisvKiBUeXBlZCBtZW1vcnkgb2JqZWN0cyBhcmUgbm90IGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9QT1NJWF9UWVBFRF9NRU1PUllfT0JKRUNUUwktMQorCisjZW5kaWYgLyogYml0cy9wb3NpeF9vcHQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3ByZWRlZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9wcmVkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwNDg0YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9wcmVkZWZzLmgKQEAgLTAsMCArMSwzMCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9GRUFUVVJFU19ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvcHJlZGVmcy5oPiBkaXJlY3RseTsgaW5jbHVkZSA8ZmVhdHVyZXMuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfUFJFREVGU19ICisjZGVmaW5lIF9QUkVERUZTX0gKKworLyogV2UgZG8gc3VwcG9ydCB0aGUgSUVDIDU1OSBtYXRoIGZ1bmN0aW9uYWxpdHksIHJlYWwgYW5kIGNvbXBsZXguICAqLworI2RlZmluZSBfX1NURENfSUVDXzU1OV9fCQkxCisjZGVmaW5lIF9fU1REQ19JRUNfNTU5X0NPTVBMRVhfXwkxCisKKyNlbmRpZiAvKiBwcmVkZWZzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9wcmludGYtbGRibC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3ByaW50Zi1sZGJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JkYzNmMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9wcmludGYtbGRibC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qIC1tbG9uZy1kb3VibGUtNjQgY29tcGF0aWJpbGl0eSBtb2RlIGZvciA8cHJpbnRmLmg+IGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfUFJJTlRGX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvcHJpbnRmLWxkYmwuaD4gZGlyZWN0bHk7IHVzZSA8cHJpbnRmLmg+IGluc3RlYWQuIgorI2VuZGlmCisKK19fTERCTF9SRURJUl9ERUNMIChwcmludGZfc2l6ZSkKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9wdGhyZWFkdHlwZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9wdGhyZWFkdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTNlMDE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3B0aHJlYWR0eXBlcy5oCkBAIC0wLDAgKzEsMTczIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwMywyMDA0LDIwMDUsMjAwNiwyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9CSVRTX1BUSFJFQURUWVBFU19ICisjZGVmaW5lIF9CSVRTX1BUSFJFQURUWVBFU19ICTEKKworI2RlZmluZSBfX1NJWkVPRl9QVEhSRUFEX0FUVFJfVCAzNgorI2RlZmluZSBfX1NJWkVPRl9QVEhSRUFEX01VVEVYX1QgMjQKKyNkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9NVVRFWEFUVFJfVCA0CisjZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfQ09ORF9UIDQ4CisjZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfQ09ORF9DT01QQVRfVCAxMgorI2RlZmluZSBfX1NJWkVPRl9QVEhSRUFEX0NPTkRBVFRSX1QgNAorI2RlZmluZSBfX1NJWkVPRl9QVEhSRUFEX1JXTE9DS19UIDMyCisjZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfUldMT0NLQVRUUl9UIDgKKyNkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9CQVJSSUVSX1QgMjAKKyNkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9CQVJSSUVSQVRUUl9UIDQKKworCisvKiBUaHJlYWQgaWRlbnRpZmllcnMuICBUaGUgc3RydWN0dXJlIG9mIHRoZSBhdHRyaWJ1dGUgdHlwZSBpcyBub3QKKyAgIGV4cG9zZWQgb24gcHVycG9zZS4gICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHB0aHJlYWRfdDsKKworCit0eXBlZGVmIHVuaW9uCit7CisgIGNoYXIgX19zaXplW19fU0laRU9GX1BUSFJFQURfQVRUUl9UXTsKKyAgbG9uZyBpbnQgX19hbGlnbjsKK30gcHRocmVhZF9hdHRyX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgX19wdGhyZWFkX2ludGVybmFsX3NsaXN0Cit7CisgIHN0cnVjdCBfX3B0aHJlYWRfaW50ZXJuYWxfc2xpc3QgKl9fbmV4dDsKK30gX19wdGhyZWFkX3NsaXN0X3Q7CisKKworLyogRGF0YSBzdHJ1Y3R1cmVzIGZvciBtdXRleCBoYW5kbGluZy4gIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGF0dHJpYnV0ZQorICAgdHlwZSBpcyBub3QgZXhwb3NlZCBvbiBwdXJwb3NlLiAgKi8KK3R5cGVkZWYgdW5pb24KK3sKKyAgc3RydWN0IF9fcHRocmVhZF9tdXRleF9zCisgIHsKKyAgICBpbnQgX19sb2NrOworICAgIHVuc2lnbmVkIGludCBfX2NvdW50OworICAgIGludCBfX293bmVyOworICAgIC8qIEtJTkQgbXVzdCBzdGF5IGF0IHRoaXMgcG9zaXRpb24gaW4gdGhlIHN0cnVjdHVyZSB0byBtYWludGFpbgorICAgICAgIGJpbmFyeSBjb21wYXRpYmlsaXR5LiAgKi8KKyAgICBpbnQgX19raW5kOworICAgIHVuc2lnbmVkIGludCBfX251c2VyczsKKyAgICBfX2V4dGVuc2lvbl9fIHVuaW9uCisgICAgeworICAgICAgaW50IF9fc3BpbnM7CisgICAgICBfX3B0aHJlYWRfc2xpc3RfdCBfX2xpc3Q7CisgICAgfTsKKyAgfSBfX2RhdGE7CisgIGNoYXIgX19zaXplW19fU0laRU9GX1BUSFJFQURfTVVURVhfVF07CisgIGxvbmcgaW50IF9fYWxpZ247Cit9IHB0aHJlYWRfbXV0ZXhfdDsKKwordHlwZWRlZiB1bmlvbgoreworICBjaGFyIF9fc2l6ZVtfX1NJWkVPRl9QVEhSRUFEX01VVEVYQVRUUl9UXTsKKyAgbG9uZyBpbnQgX19hbGlnbjsKK30gcHRocmVhZF9tdXRleGF0dHJfdDsKKworCisvKiBEYXRhIHN0cnVjdHVyZSBmb3IgY29uZGl0aW9uYWwgdmFyaWFibGUgaGFuZGxpbmcuICBUaGUgc3RydWN0dXJlIG9mCisgICB0aGUgYXR0cmlidXRlIHR5cGUgaXMgbm90IGV4cG9zZWQgb24gcHVycG9zZS4gICovCit0eXBlZGVmIHVuaW9uCit7CisgIHN0cnVjdAorICB7CisgICAgaW50IF9fbG9jazsKKyAgICB1bnNpZ25lZCBpbnQgX19mdXRleDsKKyAgICBfX2V4dGVuc2lvbl9fIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX190b3RhbF9zZXE7CisgICAgX19leHRlbnNpb25fXyB1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fd2FrZXVwX3NlcTsKKyAgICBfX2V4dGVuc2lvbl9fIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX193b2tlbl9zZXE7CisgICAgdm9pZCAqX19tdXRleDsKKyAgICB1bnNpZ25lZCBpbnQgX19ud2FpdGVyczsKKyAgICB1bnNpZ25lZCBpbnQgX19icm9hZGNhc3Rfc2VxOworICB9IF9fZGF0YTsKKyAgY2hhciBfX3NpemVbX19TSVpFT0ZfUFRIUkVBRF9DT05EX1RdOworICBfX2V4dGVuc2lvbl9fIGxvbmcgbG9uZyBpbnQgX19hbGlnbjsKK30gcHRocmVhZF9jb25kX3Q7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgY2hhciBfX3NpemVbX19TSVpFT0ZfUFRIUkVBRF9DT05EQVRUUl9UXTsKKyAgbG9uZyBpbnQgX19hbGlnbjsKK30gcHRocmVhZF9jb25kYXR0cl90OworCisKKy8qIEtleXMgZm9yIHRocmVhZC1zcGVjaWZpYyBkYXRhICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBwdGhyZWFkX2tleV90OworCisKKy8qIE9uY2Utb25seSBleGVjdXRpb24gKi8KK3R5cGVkZWYgaW50IHB0aHJlYWRfb25jZV90OworCisKKyNpZiBkZWZpbmVkIF9fVVNFX1VOSVg5OCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIERhdGEgc3RydWN0dXJlIGZvciByZWFkLXdyaXRlIGxvY2sgdmFyaWFibGUgaGFuZGxpbmcuICBUaGUKKyAgIHN0cnVjdHVyZSBvZiB0aGUgYXR0cmlidXRlIHR5cGUgaXMgbm90IGV4cG9zZWQgb24gcHVycG9zZS4gICovCit0eXBlZGVmIHVuaW9uCit7CisgIHN0cnVjdAorICB7CisgICAgaW50IF9fbG9jazsKKyAgICB1bnNpZ25lZCBpbnQgX19ucl9yZWFkZXJzOworICAgIHVuc2lnbmVkIGludCBfX3JlYWRlcnNfd2FrZXVwOworICAgIHVuc2lnbmVkIGludCBfX3dyaXRlcl93YWtldXA7CisgICAgdW5zaWduZWQgaW50IF9fbnJfcmVhZGVyc19xdWV1ZWQ7CisgICAgdW5zaWduZWQgaW50IF9fbnJfd3JpdGVyc19xdWV1ZWQ7CisgICAgLyogRkxBR1MgbXVzdCBzdGF5IGF0IHRoaXMgcG9zaXRpb24gaW4gdGhlIHN0cnVjdHVyZSB0byBtYWludGFpbgorICAgICAgIGJpbmFyeSBjb21wYXRpYmlsaXR5LiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIF9fZmxhZ3M7CisgICAgdW5zaWduZWQgY2hhciBfX3NoYXJlZDsKKyAgICB1bnNpZ25lZCBjaGFyIF9fcGFkMTsKKyAgICB1bnNpZ25lZCBjaGFyIF9fcGFkMjsKKyAgICBpbnQgX193cml0ZXI7CisgIH0gX19kYXRhOworICBjaGFyIF9fc2l6ZVtfX1NJWkVPRl9QVEhSRUFEX1JXTE9DS19UXTsKKyAgbG9uZyBpbnQgX19hbGlnbjsKK30gcHRocmVhZF9yd2xvY2tfdDsKKwordHlwZWRlZiB1bmlvbgoreworICBjaGFyIF9fc2l6ZVtfX1NJWkVPRl9QVEhSRUFEX1JXTE9DS0FUVFJfVF07CisgIGxvbmcgaW50IF9fYWxpZ247Cit9IHB0aHJlYWRfcndsb2NrYXR0cl90OworI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX1hPUEVOMksKKy8qIFBPU0lYIHNwaW5sb2NrIGRhdGEgdHlwZS4gICovCit0eXBlZGVmIHZvbGF0aWxlIGludCBwdGhyZWFkX3NwaW5sb2NrX3Q7CisKKworLyogUE9TSVggYmFycmllcnMgZGF0YSB0eXBlLiAgVGhlIHN0cnVjdHVyZSBvZiB0aGUgdHlwZSBpcworICAgZGVsaWJlcmF0ZWx5IG5vdCBleHBvc2VkLiAgKi8KK3R5cGVkZWYgdW5pb24KK3sKKyAgY2hhciBfX3NpemVbX19TSVpFT0ZfUFRIUkVBRF9CQVJSSUVSX1RdOworICBsb25nIGludCBfX2FsaWduOworfSBwdGhyZWFkX2JhcnJpZXJfdDsKKwordHlwZWRlZiB1bmlvbgoreworICBjaGFyIF9fc2l6ZVtfX1NJWkVPRl9QVEhSRUFEX0JBUlJJRVJBVFRSX1RdOworICBpbnQgX19hbGlnbjsKK30gcHRocmVhZF9iYXJyaWVyYXR0cl90OworI2VuZGlmCisKKworLyogRXh0cmEgYXR0cmlidXRlcyBmb3IgdGhlIGNsZWFudXAgZnVuY3Rpb25zLiAgKi8KKyNkZWZpbmUgX19jbGVhbnVwX2ZjdF9hdHRyaWJ1dGUgX19hdHRyaWJ1dGVfXyAoKF9fcmVncGFybV9fICgxKSkpCisKKyNlbmRpZgkvKiBiaXRzL3B0aHJlYWR0eXBlcy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvcmVzb3VyY2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9yZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNmMxOTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvcmVzb3VyY2UuaApAQCAtMCwwICsxLDI2OCBAQAorLyogQml0IHZhbHVlcyAmIHN0cnVjdHVyZXMgZm9yIHJlc291cmNlIGxpbWl0cy4gIExpbnV4IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTYtMjAwMCwgMjAwNCwgMjAwNSwgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19SRVNPVVJDRV9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvcmVzb3VyY2UuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisvKiBUcmFuc211dGUgZGVmaW5lcyB0byBlbnVtZXJhdGlvbnMuICBUaGUgbWFjcm8gcmUtZGVmaW5pdGlvbnMgYXJlCisgICBuZWNlc3NhcnkgYmVjYXVzZSBzb21lIHByb2dyYW1zIHdhbnQgdG8gdGVzdCBmb3Igb3BlcmF0aW5nIHN5c3RlbQorICAgZmVhdHVyZXMgd2l0aCAjaWZkZWYgUlVTQUdFX1NFTEYuICBJbiBJU08gQyB0aGUgcmVmbGV4aXZlCisgICBkZWZpbml0aW9uIGlzIGEgbm8tb3AuICAqLworCisvKiBLaW5kcyBvZiByZXNvdXJjZSBsaW1pdC4gICovCitlbnVtIF9fcmxpbWl0X3Jlc291cmNlCit7CisgIC8qIFBlci1wcm9jZXNzIENQVSBsaW1pdCwgaW4gc2Vjb25kcy4gICovCisgIFJMSU1JVF9DUFUgPSAwLAorI2RlZmluZSBSTElNSVRfQ1BVIFJMSU1JVF9DUFUKKworICAvKiBMYXJnZXN0IGZpbGUgdGhhdCBjYW4gYmUgY3JlYXRlZCwgaW4gYnl0ZXMuICAqLworICBSTElNSVRfRlNJWkUgPSAxLAorI2RlZmluZQlSTElNSVRfRlNJWkUgUkxJTUlUX0ZTSVpFCisKKyAgLyogTWF4aW11bSBzaXplIG9mIGRhdGEgc2VnbWVudCwgaW4gYnl0ZXMuICAqLworICBSTElNSVRfREFUQSA9IDIsCisjZGVmaW5lCVJMSU1JVF9EQVRBIFJMSU1JVF9EQVRBCisKKyAgLyogTWF4aW11bSBzaXplIG9mIHN0YWNrIHNlZ21lbnQsIGluIGJ5dGVzLiAgKi8KKyAgUkxJTUlUX1NUQUNLID0gMywKKyNkZWZpbmUJUkxJTUlUX1NUQUNLIFJMSU1JVF9TVEFDSworCisgIC8qIExhcmdlc3QgY29yZSBmaWxlIHRoYXQgY2FuIGJlIGNyZWF0ZWQsIGluIGJ5dGVzLiAgKi8KKyAgUkxJTUlUX0NPUkUgPSA0LAorI2RlZmluZQlSTElNSVRfQ09SRSBSTElNSVRfQ09SRQorCisgIC8qIExhcmdlc3QgcmVzaWRlbnQgc2V0IHNpemUsIGluIGJ5dGVzLgorICAgICBUaGlzIGFmZmVjdHMgc3dhcHBpbmc7IHByb2Nlc3NlcyB0aGF0IGFyZSBleGNlZWRpbmcgdGhlaXIKKyAgICAgcmVzaWRlbnQgc2V0IHNpemUgd2lsbCBiZSBtb3JlIGxpa2VseSB0byBoYXZlIHBoeXNpY2FsIG1lbW9yeQorICAgICB0YWtlbiBmcm9tIHRoZW0uICAqLworICBfX1JMSU1JVF9SU1MgPSA1LAorI2RlZmluZQlSTElNSVRfUlNTIF9fUkxJTUlUX1JTUworCisgIC8qIE51bWJlciBvZiBvcGVuIGZpbGVzLiAgKi8KKyAgUkxJTUlUX05PRklMRSA9IDcsCisgIF9fUkxJTUlUX09GSUxFID0gUkxJTUlUX05PRklMRSwgLyogQlNEIG5hbWUgZm9yIHNhbWUuICAqLworI2RlZmluZSBSTElNSVRfTk9GSUxFIFJMSU1JVF9OT0ZJTEUKKyNkZWZpbmUgUkxJTUlUX09GSUxFIF9fUkxJTUlUX09GSUxFCisKKyAgLyogQWRkcmVzcyBzcGFjZSBsaW1pdC4gICovCisgIFJMSU1JVF9BUyA9IDksCisjZGVmaW5lIFJMSU1JVF9BUyBSTElNSVRfQVMKKworICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VzLiAgKi8KKyAgX19STElNSVRfTlBST0MgPSA2LAorI2RlZmluZSBSTElNSVRfTlBST0MgX19STElNSVRfTlBST0MKKworICAvKiBMb2NrZWQtaW4tbWVtb3J5IGFkZHJlc3Mgc3BhY2UuICAqLworICBfX1JMSU1JVF9NRU1MT0NLID0gOCwKKyNkZWZpbmUgUkxJTUlUX01FTUxPQ0sgX19STElNSVRfTUVNTE9DSworCisgIC8qIE1heGltdW0gbnVtYmVyIG9mIGZpbGUgbG9ja3MuICAqLworICBfX1JMSU1JVF9MT0NLUyA9IDEwLAorI2RlZmluZSBSTElNSVRfTE9DS1MgX19STElNSVRfTE9DS1MKKworICAvKiBNYXhpbXVtIG51bWJlciBvZiBwZW5kaW5nIHNpZ25hbHMuICAqLworICBfX1JMSU1JVF9TSUdQRU5ESU5HID0gMTEsCisjZGVmaW5lIFJMSU1JVF9TSUdQRU5ESU5HIF9fUkxJTUlUX1NJR1BFTkRJTkcKKworICAvKiBNYXhpbXVtIGJ5dGVzIGluIFBPU0lYIG1lc3NhZ2UgcXVldWVzLiAgKi8KKyAgX19STElNSVRfTVNHUVVFVUUgPSAxMiwKKyNkZWZpbmUgUkxJTUlUX01TR1FVRVVFIF9fUkxJTUlUX01TR1FVRVVFCisKKyAgLyogTWF4aW11bSBuaWNlIHByaW9yaXR5IGFsbG93ZWQgdG8gcmFpc2UgdG8uCisgICAgIE5pY2UgbGV2ZWxzIDE5IC4uIC0yMCBjb3JyZXNwb25kIHRvIDAgLi4gMzkKKyAgICAgdmFsdWVzIG9mIHRoaXMgcmVzb3VyY2UgbGltaXQuICAqLworICBfX1JMSU1JVF9OSUNFID0gMTMsCisjZGVmaW5lIFJMSU1JVF9OSUNFIF9fUkxJTUlUX05JQ0UKKworICAvKiBNYXhpbXVtIHJlYWx0aW1lIHByaW9yaXR5IGFsbG93ZWQgZm9yIG5vbi1wcml2aWxlZGdlZAorICAgICBwcm9jZXNzZXMuICAqLworICBfX1JMSU1JVF9SVFBSSU8gPSAxNCwKKyNkZWZpbmUgUkxJTUlUX1JUUFJJTyBfX1JMSU1JVF9SVFBSSU8KKworICAvKiBNYXhpbXVtIENQVSB0aW1lIGluIMK1cyB0aGF0IGEgcHJvY2VzcyBzY2hlZHVsZWQgdW5kZXIgYSByZWFsLXRpbWUKKyAgICAgc2NoZWR1bGluZyBwb2xpY3kgbWF5IGNvbnN1bWUgd2l0aG91dCBtYWtpbmcgYSBibG9ja2luZyBzeXN0ZW0KKyAgICAgY2FsbCBiZWZvcmUgYmVpbmcgZm9yY2libHkgZGVzY2hlZHVsZWQuICAqLworICBfX1JMSU1JVF9SVFRJTUUgPSAxNSwKKyNkZWZpbmUgUkxJTUlUX1JUVElNRSBfX1JMSU1JVF9SVFRJTUUKKworICBfX1JMSU1JVF9OTElNSVRTID0gMTYsCisgIF9fUkxJTV9OTElNSVRTID0gX19STElNSVRfTkxJTUlUUworI2RlZmluZSBSTElNSVRfTkxJTUlUUyBfX1JMSU1JVF9OTElNSVRTCisjZGVmaW5lIFJMSU1fTkxJTUlUUyBfX1JMSU1fTkxJTUlUUworfTsKKworLyogVmFsdWUgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyBsaW1pdC4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyMgZGVmaW5lIFJMSU1fSU5GSU5JVFkgKCh1bnNpZ25lZCBsb25nIGludCkofjBVTCkpCisjZWxzZQorIyBkZWZpbmUgUkxJTV9JTkZJTklUWSAweGZmZmZmZmZmZmZmZmZmZmZ1TEwKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKKyMgZGVmaW5lIFJMSU02NF9JTkZJTklUWSAweGZmZmZmZmZmZmZmZmZmZmZ1TEwKKyNlbmRpZgorCisvKiBXZSBjYW4gcmVwcmVzZW50IGFsbCBsaW1pdHMuICAqLworI2RlZmluZSBSTElNX1NBVkVEX01BWAlSTElNX0lORklOSVRZCisjZGVmaW5lIFJMSU1fU0FWRURfQ1VSCVJMSU1fSU5GSU5JVFkKKworCisvKiBUeXBlIGZvciByZXNvdXJjZSBxdWFudGl0eSBtZWFzdXJlbWVudC4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX19ybGltX3QgcmxpbV90OworI2Vsc2UKK3R5cGVkZWYgX19ybGltNjRfdCBybGltX3Q7CisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAordHlwZWRlZiBfX3JsaW02NF90IHJsaW02NF90OworI2VuZGlmCisKK3N0cnVjdCBybGltaXQKKyAgeworICAgIC8qIFRoZSBjdXJyZW50IChzb2Z0KSBsaW1pdC4gICovCisgICAgcmxpbV90IHJsaW1fY3VyOworICAgIC8qIFRoZSBoYXJkIGxpbWl0LiAgKi8KKyAgICBybGltX3QgcmxpbV9tYXg7CisgIH07CisKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorc3RydWN0IHJsaW1pdDY0CisgIHsKKyAgICAvKiBUaGUgY3VycmVudCAoc29mdCkgbGltaXQuICAqLworICAgIHJsaW02NF90IHJsaW1fY3VyOworICAgIC8qIFRoZSBoYXJkIGxpbWl0LiAgKi8KKyAgICBybGltNjRfdCBybGltX21heDsKKyB9OworI2VuZGlmCisKKy8qIFdob3NlIHVzYWdlIHN0YXRpc3RpY3MgZG8geW91IHdhbnQ/ICAqLworZW51bSBfX3J1c2FnZV93aG8KK3sKKyAgLyogVGhlIGNhbGxpbmcgcHJvY2Vzcy4gICovCisgIFJVU0FHRV9TRUxGID0gMCwKKyNkZWZpbmUgUlVTQUdFX1NFTEYgUlVTQUdFX1NFTEYKKworICAvKiBBbGwgb2YgaXRzIHRlcm1pbmF0ZWQgY2hpbGQgcHJvY2Vzc2VzLiAgKi8KKyAgUlVTQUdFX0NISUxEUkVOID0gLTEKKyNkZWZpbmUgUlVTQUdFX0NISUxEUkVOIFJVU0FHRV9DSElMRFJFTgorCisjaWZkZWYgX19VU0VfR05VCisgICwKKyAgLyogVGhlIGNhbGxpbmcgdGhyZWFkLiAgKi8KKyAgUlVTQUdFX1RIUkVBRCA9IDEKKyMgZGVmaW5lIFJVU0FHRV9USFJFQUQgUlVTQUdFX1RIUkVBRAorICAvKiBOYW1lIGZvciB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IG9uIFNvbGFyaXMuICAqLworIyBkZWZpbmUgUlVTQUdFX0xXUCBSVVNBR0VfVEhSRUFECisjZW5kaWYKK307CisKKyNkZWZpbmUgX19uZWVkX3RpbWV2YWwKKyNpbmNsdWRlIDxiaXRzL3RpbWUuaD4JCS8qIEZvciBgc3RydWN0IHRpbWV2YWwnLiAgKi8KKworLyogU3RydWN0dXJlIHdoaWNoIHNheXMgaG93IG11Y2ggb2YgZWFjaCByZXNvdXJjZSBoYXMgYmVlbiB1c2VkLiAgKi8KK3N0cnVjdCBydXNhZ2UKKyAgeworICAgIC8qIFRvdGFsIGFtb3VudCBvZiB1c2VyIHRpbWUgdXNlZC4gICovCisgICAgc3RydWN0IHRpbWV2YWwgcnVfdXRpbWU7CisgICAgLyogVG90YWwgYW1vdW50IG9mIHN5c3RlbSB0aW1lIHVzZWQuICAqLworICAgIHN0cnVjdCB0aW1ldmFsIHJ1X3N0aW1lOworICAgIC8qIE1heGltdW0gcmVzaWRlbnQgc2V0IHNpemUgKGluIGtpbG9ieXRlcykuICAqLworICAgIGxvbmcgaW50IHJ1X21heHJzczsKKyAgICAvKiBBbW91bnQgb2Ygc2hhcmluZyBvZiB0ZXh0IHNlZ21lbnQgbWVtb3J5CisgICAgICAgd2l0aCBvdGhlciBwcm9jZXNzZXMgKGtpbG9ieXRlLXNlY29uZHMpLiAgKi8KKyAgICBsb25nIGludCBydV9peHJzczsKKyAgICAvKiBBbW91bnQgb2YgZGF0YSBzZWdtZW50IG1lbW9yeSB1c2VkIChraWxvYnl0ZS1zZWNvbmRzKS4gICovCisgICAgbG9uZyBpbnQgcnVfaWRyc3M7CisgICAgLyogQW1vdW50IG9mIHN0YWNrIG1lbW9yeSB1c2VkIChraWxvYnl0ZS1zZWNvbmRzKS4gICovCisgICAgbG9uZyBpbnQgcnVfaXNyc3M7CisgICAgLyogTnVtYmVyIG9mIHNvZnQgcGFnZSBmYXVsdHMgKGkuZS4gdGhvc2Ugc2VydmljZWQgYnkgcmVjbGFpbWluZworICAgICAgIGEgcGFnZSBmcm9tIHRoZSBsaXN0IG9mIHBhZ2VzIGF3YWl0aW5nIHJlYWxsb2NhdGlvbi4gICovCisgICAgbG9uZyBpbnQgcnVfbWluZmx0OworICAgIC8qIE51bWJlciBvZiBoYXJkIHBhZ2UgZmF1bHRzIChpLmUuIHRob3NlIHRoYXQgcmVxdWlyZWQgSS9PKS4gICovCisgICAgbG9uZyBpbnQgcnVfbWFqZmx0OworICAgIC8qIE51bWJlciBvZiB0aW1lcyBhIHByb2Nlc3Mgd2FzIHN3YXBwZWQgb3V0IG9mIHBoeXNpY2FsIG1lbW9yeS4gICovCisgICAgbG9uZyBpbnQgcnVfbnN3YXA7CisgICAgLyogTnVtYmVyIG9mIGlucHV0IG9wZXJhdGlvbnMgdmlhIHRoZSBmaWxlIHN5c3RlbS4gIE5vdGU6IFRoaXMKKyAgICAgICBhbmQgYHJ1X291YmxvY2snIGRvIG5vdCBpbmNsdWRlIG9wZXJhdGlvbnMgd2l0aCB0aGUgY2FjaGUuICAqLworICAgIGxvbmcgaW50IHJ1X2luYmxvY2s7CisgICAgLyogTnVtYmVyIG9mIG91dHB1dCBvcGVyYXRpb25zIHZpYSB0aGUgZmlsZSBzeXN0ZW0uICAqLworICAgIGxvbmcgaW50IHJ1X291YmxvY2s7CisgICAgLyogTnVtYmVyIG9mIElQQyBtZXNzYWdlcyBzZW50LiAgKi8KKyAgICBsb25nIGludCBydV9tc2dzbmQ7CisgICAgLyogTnVtYmVyIG9mIElQQyBtZXNzYWdlcyByZWNlaXZlZC4gICovCisgICAgbG9uZyBpbnQgcnVfbXNncmN2OworICAgIC8qIE51bWJlciBvZiBzaWduYWxzIGRlbGl2ZXJlZC4gICovCisgICAgbG9uZyBpbnQgcnVfbnNpZ25hbHM7CisgICAgLyogTnVtYmVyIG9mIHZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzLCBpLmUuIGJlY2F1c2UgdGhlIHByb2Nlc3MKKyAgICAgICBnYXZlIHVwIHRoZSBwcm9jZXNzIGJlZm9yZSBpdCBoYWQgdG8gKHVzdWFsbHkgdG8gd2FpdCBmb3Igc29tZQorICAgICAgIHJlc291cmNlIHRvIGJlIGF2YWlsYWJsZSkuICAqLworICAgIGxvbmcgaW50IHJ1X252Y3N3OworICAgIC8qIE51bWJlciBvZiBpbnZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzLCBpLmUuIGEgaGlnaGVyIHByaW9yaXR5IHByb2Nlc3MKKyAgICAgICBiZWNhbWUgcnVubmFibGUgb3IgdGhlIGN1cnJlbnQgcHJvY2VzcyB1c2VkIHVwIGl0cyB0aW1lIHNsaWNlLiAgKi8KKyAgICBsb25nIGludCBydV9uaXZjc3c7CisgIH07CisKKy8qIFByaW9yaXR5IGxpbWl0cy4gICovCisjZGVmaW5lIFBSSU9fTUlOCS0yMAkvKiBNaW5pbXVtIHByaW9yaXR5IGEgcHJvY2VzcyBjYW4gaGF2ZS4gICovCisjZGVmaW5lIFBSSU9fTUFYCTIwCS8qIE1heGltdW0gcHJpb3JpdHkgYSBwcm9jZXNzIGNhbiBoYXZlLiAgKi8KKworLyogVGhlIHR5cGUgb2YgdGhlIFdISUNIIGFyZ3VtZW50IHRvIGBnZXRwcmlvcml0eScgYW5kIGBzZXRwcmlvcml0eScsCisgICBpbmRpY2F0aW5nIHdoYXQgZmxhdm9yIG9mIGVudGl0eSB0aGUgV0hPIGFyZ3VtZW50IHNwZWNpZmllcy4gICovCitlbnVtIF9fcHJpb3JpdHlfd2hpY2gKK3sKKyAgUFJJT19QUk9DRVNTID0gMCwJCS8qIFdITyBpcyBhIHByb2Nlc3MgSUQuICAqLworI2RlZmluZSBQUklPX1BST0NFU1MgUFJJT19QUk9DRVNTCisgIFBSSU9fUEdSUCA9IDEsCQkvKiBXSE8gaXMgYSBwcm9jZXNzIGdyb3VwIElELiAgKi8KKyNkZWZpbmUgUFJJT19QR1JQIFBSSU9fUEdSUAorICBQUklPX1VTRVIgPSAyCQkJLyogV0hPIGlzIGEgdXNlciBJRC4gICovCisjZGVmaW5lIFBSSU9fVVNFUiBQUklPX1VTRVIKK307CisKKworX19CRUdJTl9ERUNMUworCisjaWZkZWYgX19VU0VfR05VCisvKiBNb2RpZnkgYW5kIHJldHVybiByZXNvdXJjZSBsaW1pdHMgb2YgYSBwcm9jZXNzIGF0b21pY2FsbHkuICAqLworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBwcmxpbWl0IChfX3BpZF90IF9fcGlkLCBlbnVtIF9fcmxpbWl0X3Jlc291cmNlIF9fcmVzb3VyY2UsCisJCSAgICBfX2NvbnN0IHN0cnVjdCBybGltaXQgKl9fbmV3X2xpbWl0LAorCQkgICAgc3RydWN0IHJsaW1pdCAqX19vbGRfbGltaXQpIF9fVEhST1c7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChwcmxpbWl0LCAoX19waWRfdCBfX3BpZCwKKwkJCQkgICAgIGVudW0gX19ybGltaXRfcmVzb3VyY2UgX19yZXNvdXJjZSwKKwkJCQkgICAgIF9fY29uc3Qgc3RydWN0IHJsaW1pdCAqX19uZXdfbGltaXQsCisJCQkJICAgICBzdHJ1Y3QgcmxpbWl0ICpfX29sZF9saW1pdCksIHBybGltaXQ2NCk7CisjICBlbHNlCisjICAgZGVmaW5lIHBybGltaXQgcHJsaW1pdDY0CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBwcmxpbWl0NjQgKF9fcGlkX3QgX19waWQsIGVudW0gX19ybGltaXRfcmVzb3VyY2UgX19yZXNvdXJjZSwKKwkJICAgICAgX19jb25zdCBzdHJ1Y3QgcmxpbWl0NjQgKl9fbmV3X2xpbWl0LAorCQkgICAgICBzdHJ1Y3QgcmxpbWl0NjQgKl9fb2xkX2xpbWl0KSBfX1RIUk9XOworIyBlbmRpZgorI2VuZGlmCisKK19fRU5EX0RFQ0xTCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2NoZWQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zY2hlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMTQzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2NoZWQuaApAQCAtMCwwICsxLDIxMiBAQAorLyogRGVmaW5pdGlvbnMgb2YgY29uc3RhbnRzIGFuZCBkYXRhIHN0cnVjdHVyZSBmb3IgUE9TSVggMTAwMy4xYi0xOTkzCisgICBzY2hlZHVsaW5nIGludGVyZmFjZS4KKyAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5LDIwMDEtMjAwMywyMDA1LDIwMDYsMjAwNywyMDA4LDIwMDksMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX19uZWVkX3NjaGVkcGFyYW0KKworI2lmbmRlZiBfU0NIRURfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zY2hlZC5oPiBkaXJlY3RseTsgdXNlIDxzY2hlZC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisKKy8qIFNjaGVkdWxpbmcgYWxnb3JpdGhtcy4gICovCisjZGVmaW5lIFNDSEVEX09USEVSCQkwCisjZGVmaW5lIFNDSEVEX0ZJRk8JCTEKKyNkZWZpbmUgU0NIRURfUlIJCTIKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIFNDSEVEX0JBVENICQkzCisjIGRlZmluZSBTQ0hFRF9JRExFCQk1CisKKyMgZGVmaW5lIFNDSEVEX1JFU0VUX09OX0ZPUksJMHg0MDAwMDAwMAorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIENsb25pbmcgZmxhZ3MuICAqLworIyBkZWZpbmUgQ1NJR05BTCAgICAgICAweDAwMDAwMGZmIC8qIFNpZ25hbCBtYXNrIHRvIGJlIHNlbnQgYXQgZXhpdC4gICovCisjIGRlZmluZSBDTE9ORV9WTSAgICAgIDB4MDAwMDAxMDAgLyogU2V0IGlmIFZNIHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3Nlcy4gICovCisjIGRlZmluZSBDTE9ORV9GUyAgICAgIDB4MDAwMDAyMDAgLyogU2V0IGlmIGZzIGluZm8gc2hhcmVkIGJldHdlZW4gcHJvY2Vzc2VzLiAgKi8KKyMgZGVmaW5lIENMT05FX0ZJTEVTICAgMHgwMDAwMDQwMCAvKiBTZXQgaWYgb3BlbiBmaWxlcyBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMuICAqLworIyBkZWZpbmUgQ0xPTkVfU0lHSEFORCAweDAwMDAwODAwIC8qIFNldCBpZiBzaWduYWwgaGFuZGxlcnMgc2hhcmVkLiAgKi8KKyMgZGVmaW5lIENMT05FX1BUUkFDRSAgMHgwMDAwMjAwMCAvKiBTZXQgaWYgdHJhY2luZyBjb250aW51ZXMgb24gdGhlIGNoaWxkLiAgKi8KKyMgZGVmaW5lIENMT05FX1ZGT1JLICAgMHgwMDAwNDAwMCAvKiBTZXQgaWYgdGhlIHBhcmVudCB3YW50cyB0aGUgY2hpbGQgdG8KKwkJCQkgICAgIHdha2UgaXQgdXAgb24gbW1fcmVsZWFzZS4gICovCisjIGRlZmluZSBDTE9ORV9QQVJFTlQgIDB4MDAwMDgwMDAgLyogU2V0IGlmIHdlIHdhbnQgdG8gaGF2ZSB0aGUgc2FtZQorCQkJCSAgICAgcGFyZW50IGFzIHRoZSBjbG9uZXIuICAqLworIyBkZWZpbmUgQ0xPTkVfVEhSRUFEICAweDAwMDEwMDAwIC8qIFNldCB0byBhZGQgdG8gc2FtZSB0aHJlYWQgZ3JvdXAuICAqLworIyBkZWZpbmUgQ0xPTkVfTkVXTlMgICAweDAwMDIwMDAwIC8qIFNldCB0byBjcmVhdGUgbmV3IG5hbWVzcGFjZS4gICovCisjIGRlZmluZSBDTE9ORV9TWVNWU0VNIDB4MDAwNDAwMDAgLyogU2V0IHRvIHNoYXJlZCBTVklEIFNFTV9VTkRPIHNlbWFudGljcy4gICovCisjIGRlZmluZSBDTE9ORV9TRVRUTFMgIDB4MDAwODAwMDAgLyogU2V0IFRMUyBpbmZvLiAgKi8KKyMgZGVmaW5lIENMT05FX1BBUkVOVF9TRVRUSUQgMHgwMDEwMDAwMCAvKiBTdG9yZSBUSUQgaW4gdXNlcmxldmVsIGJ1ZmZlcgorCQkJCQkgICBiZWZvcmUgTU0gY29weS4gICovCisjIGRlZmluZSBDTE9ORV9DSElMRF9DTEVBUlRJRCAweDAwMjAwMDAwIC8qIFJlZ2lzdGVyIGV4aXQgZnV0ZXggYW5kIG1lbW9yeQorCQkJCQkgICAgbG9jYXRpb24gdG8gY2xlYXIuICAqLworIyBkZWZpbmUgQ0xPTkVfREVUQUNIRUQgMHgwMDQwMDAwMCAvKiBDcmVhdGUgY2xvbmUgZGV0YWNoZWQuICAqLworIyBkZWZpbmUgQ0xPTkVfVU5UUkFDRUQgMHgwMDgwMDAwMCAvKiBTZXQgaWYgdGhlIHRyYWNpbmcgcHJvY2VzcyBjYW4ndAorCQkJCSAgICAgIGZvcmNlIENMT05FX1BUUkFDRSBvbiB0aGlzIGNsb25lLiAgKi8KKyMgZGVmaW5lIENMT05FX0NISUxEX1NFVFRJRCAweDAxMDAwMDAwIC8qIFN0b3JlIFRJRCBpbiB1c2VybGV2ZWwgYnVmZmVyIGluCisJCQkJCSAgdGhlIGNoaWxkLiAgKi8KKyMgZGVmaW5lIENMT05FX05FV1VUUwkweDA0MDAwMDAwCS8qIE5ldyB1dHNuYW1lIGdyb3VwLiAgKi8KKyMgZGVmaW5lIENMT05FX05FV0lQQwkweDA4MDAwMDAwCS8qIE5ldyBpcGNzLiAgKi8KKyMgZGVmaW5lIENMT05FX05FV1VTRVIJMHgxMDAwMDAwMAkvKiBOZXcgdXNlciBuYW1lc3BhY2UuICAqLworIyBkZWZpbmUgQ0xPTkVfTkVXUElECTB4MjAwMDAwMDAJLyogTmV3IHBpZCBuYW1lc3BhY2UuICAqLworIyBkZWZpbmUgQ0xPTkVfTkVXTkVUCTB4NDAwMDAwMDAJLyogTmV3IG5ldHdvcmsgbmFtZXNwYWNlLiAgKi8KKyMgZGVmaW5lIENMT05FX0lPCTB4ODAwMDAwMDAJLyogQ2xvbmUgSS9PIGNvbnRleHQuICAqLworI2VuZGlmCisKKy8qIFRoZSBvZmZpY2lhbCBkZWZpbml0aW9uLiAgKi8KK3N0cnVjdCBzY2hlZF9wYXJhbQorICB7CisgICAgaW50IF9fc2NoZWRfcHJpb3JpdHk7CisgIH07CisKK19fQkVHSU5fREVDTFMKKworI2lmZGVmIF9fVVNFX0dOVQorLyogQ2xvbmUgY3VycmVudCBwcm9jZXNzLiAgKi8KK2V4dGVybiBpbnQgY2xvbmUgKGludCAoKl9fZm4pICh2b2lkICpfX2FyZyksIHZvaWQgKl9fY2hpbGRfc3RhY2ssCisJCSAgaW50IF9fZmxhZ3MsIHZvaWQgKl9fYXJnLCAuLi4pIF9fVEhST1c7CisKKy8qIFVuc2hhcmUgdGhlIHNwZWNpZmllZCByZXNvdXJjZXMuICAqLworZXh0ZXJuIGludCB1bnNoYXJlIChpbnQgX19mbGFncykgX19USFJPVzsKKworLyogR2V0IGluZGV4IG9mIGN1cnJlbnRseSB1c2VkIENQVS4gICovCitleHRlcm4gaW50IHNjaGVkX2dldGNwdSAodm9pZCkgX19USFJPVzsKKworLyogU3dpdGNoIHByb2Nlc3MgdG8gbmFtZXNwYWNlIG9mIHR5cGUgTlNUWVBFIGluZGljYXRlZCBieSBGRC4gICovCitleHRlcm4gaW50IHNldG5zIChpbnQgX19mZCwgaW50IF9fbnN0eXBlKSBfX1RIUk9XOworI2VuZGlmCisKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIG5lZWQgc2NoZWRwYXJhbSAqLworCisjaWYgIWRlZmluZWQgX19kZWZpbmVkX3NjaGVkcGFyYW0gXAorICAgICYmIChkZWZpbmVkIF9fbmVlZF9zY2hlZHBhcmFtIHx8IGRlZmluZWQgX1NDSEVEX0gpCisjIGRlZmluZSBfX2RlZmluZWRfc2NoZWRwYXJhbQkxCisvKiBEYXRhIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHByb2Nlc3MnIHNjaGVkdWxhYmlsaXR5LiAgKi8KK3N0cnVjdCBfX3NjaGVkX3BhcmFtCisgIHsKKyAgICBpbnQgX19zY2hlZF9wcmlvcml0eTsKKyAgfTsKKyMgdW5kZWYgX19uZWVkX3NjaGVkcGFyYW0KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9TQ0hFRF9IICYmICFkZWZpbmVkIF9fY3B1X3NldF90X2RlZmluZWQKKyMgZGVmaW5lIF9fY3B1X3NldF90X2RlZmluZWQKKy8qIFNpemUgZGVmaW5pdGlvbiBmb3IgQ1BVIHNldHMuICAqLworIyBkZWZpbmUgX19DUFVfU0VUU0laRQkxMDI0CisjIGRlZmluZSBfX05DUFVCSVRTCSg4ICogc2l6ZW9mIChfX2NwdV9tYXNrKSkKKworLyogVHlwZSBmb3IgYXJyYXkgZWxlbWVudHMgaW4gJ2NwdV9zZXRfdCcuICAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBfX2NwdV9tYXNrOworCisvKiBCYXNpYyBhY2Nlc3MgZnVuY3Rpb25zLiAgKi8KKyMgZGVmaW5lIF9fQ1BVRUxUKGNwdSkJKChjcHUpIC8gX19OQ1BVQklUUykKKyMgZGVmaW5lIF9fQ1BVTUFTSyhjcHUpCSgoX19jcHVfbWFzaykgMSA8PCAoKGNwdSkgJSBfX05DUFVCSVRTKSkKKworLyogRGF0YSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgQ1BVIG1hc2suICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgX19jcHVfbWFzayBfX2JpdHNbX19DUFVfU0VUU0laRSAvIF9fTkNQVUJJVFNdOworfSBjcHVfc2V0X3Q7CisKKy8qIEFjY2VzcyBmdW5jdGlvbnMgZm9yIENQVSBtYXNrcy4gICovCisjIGlmIF9fR05VQ19QUkVSRVEgKDIsIDkxKQorIyAgZGVmaW5lIF9fQ1BVX1pFUk9fUyhzZXRzaXplLCBjcHVzZXRwKSBcCisgIGRvIF9fYnVpbHRpbl9tZW1zZXQgKGNwdXNldHAsICdcMCcsIHNldHNpemUpOyB3aGlsZSAoMCkKKyMgZWxzZQorIyAgZGVmaW5lIF9fQ1BVX1pFUk9fUyhzZXRzaXplLCBjcHVzZXRwKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgc2l6ZV90IF9faTsJCQkJCQkJCSAgICAgIFwKKyAgICBzaXplX3QgX19pbWF4ID0gKHNldHNpemUpIC8gc2l6ZW9mIChfX2NwdV9tYXNrKTsJCQkgICAgICBcCisgICAgX19jcHVfbWFzayAqX19iaXRzID0gKGNwdXNldHApLT5fX2JpdHM7CQkJCSAgICAgIFwKKyAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9faW1heDsgKytfX2kpCQkJCQkgICAgICBcCisgICAgICBfX2JpdHNbX19pXSA9IDA7CQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyMgZW5kaWYKKyMgZGVmaW5lIF9fQ1BVX1NFVF9TKGNwdSwgc2V0c2l6ZSwgY3B1c2V0cCkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBzaXplX3QgX19jcHUgPSAoY3B1KTsJCQkJCQkgICAgICBcCisgICAgICBfX2NwdSA8IDggKiAoc2V0c2l6ZSkJCQkJCQkgICAgICBcCisgICAgICA/ICgoKF9fY3B1X21hc2sgKikgKChjcHVzZXRwKS0+X19iaXRzKSlbX19DUFVFTFQgKF9fY3B1KV0JCSAgICAgIFwKKwkgfD0gX19DUFVNQVNLIChfX2NwdSkpCQkJCQkJICAgICAgXAorICAgICAgOiAwOyB9KSkKKyMgZGVmaW5lIF9fQ1BVX0NMUl9TKGNwdSwgc2V0c2l6ZSwgY3B1c2V0cCkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBzaXplX3QgX19jcHUgPSAoY3B1KTsJCQkJCQkgICAgICBcCisgICAgICBfX2NwdSA8IDggKiAoc2V0c2l6ZSkJCQkJCQkgICAgICBcCisgICAgICA/ICgoKF9fY3B1X21hc2sgKikgKChjcHVzZXRwKS0+X19iaXRzKSlbX19DUFVFTFQgKF9fY3B1KV0JCSAgICAgIFwKKwkgJj0gfl9fQ1BVTUFTSyAoX19jcHUpKQkJCQkJCSAgICAgIFwKKyAgICAgIDogMDsgfSkpCisjIGRlZmluZSBfX0NQVV9JU1NFVF9TKGNwdSwgc2V0c2l6ZSwgY3B1c2V0cCkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBzaXplX3QgX19jcHUgPSAoY3B1KTsJCQkJCQkgICAgICBcCisgICAgICBfX2NwdSA8IDggKiAoc2V0c2l6ZSkJCQkJCQkgICAgICBcCisgICAgICA/ICgoKChfX2NvbnN0IF9fY3B1X21hc2sgKikgKChjcHVzZXRwKS0+X19iaXRzKSlbX19DUFVFTFQgKF9fY3B1KV0gICAgICBcCisJICAmIF9fQ1BVTUFTSyAoX19jcHUpKSkgIT0gMAkJCQkJICAgICAgXAorICAgICAgOiAwOyB9KSkKKworIyBkZWZpbmUgX19DUFVfQ09VTlRfUyhzZXRzaXplLCBjcHVzZXRwKSBcCisgIF9fc2NoZWRfY3B1Y291bnQgKHNldHNpemUsIGNwdXNldHApCisKKyMgaWYgX19HTlVDX1BSRVJFUSAoMiwgOTEpCisjICBkZWZpbmUgX19DUFVfRVFVQUxfUyhzZXRzaXplLCBjcHVzZXRwMSwgY3B1c2V0cDIpIFwKKyAgKF9fYnVpbHRpbl9tZW1jbXAgKGNwdXNldHAxLCBjcHVzZXRwMiwgc2V0c2l6ZSkgPT0gMCkKKyMgZWxzZQorIyAgZGVmaW5lIF9fQ1BVX0VRVUFMX1Moc2V0c2l6ZSwgY3B1c2V0cDEsIGNwdXNldHAyKSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7IF9fY29uc3QgX19jcHVfbWFzayAqX19hcnIxID0gKGNwdXNldHAxKS0+X19iaXRzOwkJCSAgICAgIFwKKyAgICAgIF9fY29uc3QgX19jcHVfbWFzayAqX19hcnIyID0gKGNwdXNldHAyKS0+X19iaXRzOwkJCSAgICAgIFwKKyAgICAgIHNpemVfdCBfX2ltYXggPSAoc2V0c2l6ZSkgLyBzaXplb2YgKF9fY3B1X21hc2spOwkJCSAgICAgIFwKKyAgICAgIHNpemVfdCBfX2k7CQkJCQkJCSAgICAgIFwKKyAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19pbWF4OyArK19faSkJCQkJICAgICAgXAorCWlmIChfX2FycjFbX19pXSAhPSBfX2FycjJbX19pXSkJCQkJCSAgICAgIFwKKwkgIGJyZWFrOwkJCQkJCQkgICAgICBcCisgICAgICBfX2kgPT0gX19pbWF4OyB9KSkKKyMgZW5kaWYKKworIyBkZWZpbmUgX19DUFVfT1BfUyhzZXRzaXplLCBkZXN0c2V0LCBzcmNzZXQxLCBzcmNzZXQyLCBvcCkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBjcHVfc2V0X3QgKl9fZGVzdCA9IChkZXN0c2V0KTsJCQkJCSAgICAgIFwKKyAgICAgIF9fY29uc3QgX19jcHVfbWFzayAqX19hcnIxID0gKHNyY3NldDEpLT5fX2JpdHM7CQkJICAgICAgXAorICAgICAgX19jb25zdCBfX2NwdV9tYXNrICpfX2FycjIgPSAoc3Jjc2V0MiktPl9fYml0czsJCQkgICAgICBcCisgICAgICBzaXplX3QgX19pbWF4ID0gKHNldHNpemUpIC8gc2l6ZW9mIChfX2NwdV9tYXNrKTsJCQkgICAgICBcCisgICAgICBzaXplX3QgX19pOwkJCQkJCQkgICAgICBcCisgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9faW1heDsgKytfX2kpCQkJCSAgICAgIFwKKwkoKF9fY3B1X21hc2sgKikgX19kZXN0LT5fX2JpdHMpW19faV0gPSBfX2FycjFbX19pXSBvcCBfX2FycjJbX19pXTsgICAgXAorICAgICAgX19kZXN0OyB9KSkKKworIyBkZWZpbmUgX19DUFVfQUxMT0NfU0laRShjb3VudCkgXAorICAoKCgoY291bnQpICsgX19OQ1BVQklUUyAtIDEpIC8gX19OQ1BVQklUUykgKiBzaXplb2YgKF9fY3B1X21hc2spKQorIyBkZWZpbmUgX19DUFVfQUxMT0MoY291bnQpIF9fc2NoZWRfY3B1YWxsb2MgKGNvdW50KQorIyBkZWZpbmUgX19DUFVfRlJFRShjcHVzZXQpIF9fc2NoZWRfY3B1ZnJlZSAoY3B1c2V0KQorCitfX0JFR0lOX0RFQ0xTCisKK2V4dGVybiBpbnQgX19zY2hlZF9jcHVjb3VudCAoc2l6ZV90IF9fc2V0c2l6ZSwgY29uc3QgY3B1X3NldF90ICpfX3NldHApCisgIF9fVEhST1c7CitleHRlcm4gY3B1X3NldF90ICpfX3NjaGVkX2NwdWFsbG9jIChzaXplX3QgX19jb3VudCkgX19USFJPVyBfX3d1cjsKK2V4dGVybiB2b2lkIF9fc2NoZWRfY3B1ZnJlZSAoY3B1X3NldF90ICpfX3NldCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2VsZWN0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2VsZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0YzU2YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zZWxlY3QuaApAQCAtMCwwICsxLDU1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDEsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TRUxFQ1RfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL3NlbGVjdC5oPiBkaXJlY3RseTsgaW5jbHVkZSA8c3lzL3NlbGVjdC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIKKyMgZGVmaW5lIF9fRkRfWkVSTyhmZHNwKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgaW50IF9fZDAsIF9fZDE7CQkJCQkJCSAgICAgIFwKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNsZDsgcmVwOyBzdG9zbCIJCQkJICAgICAgXAorCQkJICA6ICI9YyIgKF9fZDApLCAiPUQiIChfX2QxKQkJCSAgICAgIFwKKwkJCSAgOiAiYSIgKDApLCAiMCIgKHNpemVvZiAoZmRfc2V0KQkJICAgICAgXAorCQkJCQkgIC8gc2l6ZW9mIChfX2ZkX21hc2spKSwJICAgICAgXAorCQkJICAgICIxIiAoJl9fRkRTX0JJVFMgKGZkc3ApWzBdKQkJCSAgICAgIFwKKwkJCSAgOiAibWVtb3J5Iik7CQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNlbHNlCS8qICEgR05VIENDICovCisKKy8qIFdlIGRvbid0IHVzZSBgbWVtc2V0JyBiZWNhdXNlIHRoaXMgd291bGQgcmVxdWlyZSBhIHByb3RvdHlwZSBhbmQKKyAgIHRoZSBhcnJheSBpc24ndCB0b28gYmlnLiAgKi8KKyMgZGVmaW5lIF9fRkRfWkVSTyhzZXQpICBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgdW5zaWduZWQgaW50IF9faTsJCQkJCQkJICAgICAgXAorICAgIGZkX3NldCAqX19hcnIgPSAoc2V0KTsJCQkJCQkgICAgICBcCisgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBzaXplb2YgKGZkX3NldCkgLyBzaXplb2YgKF9fZmRfbWFzayk7ICsrX19pKQkgICAgICBcCisgICAgICBfX0ZEU19CSVRTIChfX2FycilbX19pXSA9IDA7CQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNlbmRpZgkvKiBHTlUgQ0MgKi8KKworI2RlZmluZSBfX0ZEX1NFVChkLCBzZXQpIFwKKyAgKCh2b2lkKSAoX19GRFNfQklUUyAoc2V0KVtfX0ZEX0VMVCAoZCldIHw9IF9fRkRfTUFTSyAoZCkpKQorI2RlZmluZSBfX0ZEX0NMUihkLCBzZXQpIFwKKyAgKCh2b2lkKSAoX19GRFNfQklUUyAoc2V0KVtfX0ZEX0VMVCAoZCldICY9IH5fX0ZEX01BU0sgKGQpKSkKKyNkZWZpbmUgX19GRF9JU1NFVChkLCBzZXQpIFwKKyAgKChfX0ZEU19CSVRTIChzZXQpW19fRkRfRUxUIChkKV0gJiBfX0ZEX01BU0sgKGQpKSAhPSAwKQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NlbGVjdDIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zZWxlY3QyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjZTFiNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zZWxlY3QyLmgKQEAgLTAsMCArMSwzNSBAQAorLyogQ2hlY2tpbmcgbWFjcm9zIGZvciBzZWxlY3QgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU0VMRUNUX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc2VsZWN0Mi5oPiBkaXJlY3RseTsgdXNlIDxzeXMvc2VsZWN0Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIEhlbHBlciBmdW5jdGlvbnMgdG8gaXNzdWUgd2FybmluZ3MgYW5kIGVycm9ycyB3aGVuIG5lZWRlZC4gICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQgX19mZGVsdF9jaGsgKHVuc2lnbmVkIGxvbmcgaW50IF9fZCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQgX19mZGVsdF93YXJuICh1bnNpZ25lZCBsb25nIGludCBfX2QpCisgIF9fd2FybmF0dHIgKCJiaXQgb3V0c2lkZSBvZiBmZF9zZXQgc2VsZWN0ZWQiKTsKKyN1bmRlZiBfX0ZEX0VMVAorI2RlZmluZQlfX0ZEX0VMVChkKSBcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCSAgICBcCisgICh7IHVuc2lnbmVkIGxvbmcgaW50IF9fZCA9IChkKTsJCQkJCSAgICBcCisgICAgIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19kKQkJCQkJICAgIFwKKyAgICAgID8gKF9fZCA+PSBfX0ZEX1NFVFNJWkUJCQkJCQkgICAgXAorCSA/IF9fZmRlbHRfd2FybiAoX19kKSA6IChfX2QgLyBfX05GREJJVFMpKQkJCSAgICBcCisgICAgICA6IF9fZmRlbHRfY2hrIChfX2QpKTsgfSkKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zZW0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTkzNTAxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NlbS5oCkBAIC0wLDAgKzEsODcgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NFTV9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3NlbS5oPiBkaXJlY3RseTsgdXNlIDxzeXMvc2VtLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogRmxhZ3MgZm9yIGBzZW1vcCcuICAqLworI2RlZmluZSBTRU1fVU5ETwkweDEwMDAJCS8qIHVuZG8gdGhlIG9wZXJhdGlvbiBvbiBleGl0ICovCisKKy8qIENvbW1hbmRzIGZvciBgc2VtY3RsJy4gICovCisjZGVmaW5lIEdFVFBJRAkJMTEJCS8qIGdldCBzZW1waWQgKi8KKyNkZWZpbmUgR0VUVkFMCQkxMgkJLyogZ2V0IHNlbXZhbCAqLworI2RlZmluZSBHRVRBTEwJCTEzCQkvKiBnZXQgYWxsIHNlbXZhbCdzICovCisjZGVmaW5lIEdFVE5DTlQJCTE0CQkvKiBnZXQgc2VtbmNudCAqLworI2RlZmluZSBHRVRaQ05UCQkxNQkJLyogZ2V0IHNlbXpjbnQgKi8KKyNkZWZpbmUgU0VUVkFMCQkxNgkJLyogc2V0IHNlbXZhbCAqLworI2RlZmluZSBTRVRBTEwJCTE3CQkvKiBzZXQgYWxsIHNlbXZhbCdzICovCisKKworLyogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHNldCBvZiBzZW1hcGhvcmVzLiAgKi8KK3N0cnVjdCBzZW1pZF9kcworeworICBzdHJ1Y3QgaXBjX3Blcm0gc2VtX3Blcm07CQkvKiBvcGVyYXRpb24gcGVybWlzc2lvbiBzdHJ1Y3QgKi8KKyAgX190aW1lX3Qgc2VtX290aW1lOwkJCS8qIGxhc3Qgc2Vtb3AoKSB0aW1lICovCisgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMTsKKyAgX190aW1lX3Qgc2VtX2N0aW1lOwkJCS8qIGxhc3QgdGltZSBjaGFuZ2VkIGJ5IHNlbWN0bCgpICovCisgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMjsKKyAgdW5zaWduZWQgbG9uZyBpbnQgc2VtX25zZW1zOwkJLyogbnVtYmVyIG9mIHNlbWFwaG9yZXMgaW4gc2V0ICovCisgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMzsKKyAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQ0OworfTsKKworLyogVGhlIHVzZXIgc2hvdWxkIGRlZmluZSBhIHVuaW9uIGxpa2UgdGhlIGZvbGxvd2luZyB0byB1c2UgaXQgZm9yIGFyZ3VtZW50cworICAgZm9yIGBzZW1jdGwnLgorCisgICB1bmlvbiBzZW11bgorICAgeworICAgICBpbnQgdmFsOwkJCQk8PSB2YWx1ZSBmb3IgU0VUVkFMCisgICAgIHN0cnVjdCBzZW1pZF9kcyAqYnVmOwkJPD0gYnVmZmVyIGZvciBJUENfU1RBVCAmIElQQ19TRVQKKyAgICAgdW5zaWduZWQgc2hvcnQgaW50ICphcnJheTsJCTw9IGFycmF5IGZvciBHRVRBTEwgJiBTRVRBTEwKKyAgICAgc3RydWN0IHNlbWluZm8gKl9fYnVmOwkJPD0gYnVmZmVyIGZvciBJUENfSU5GTworICAgfTsKKworICAgUHJldmlvdXMgdmVyc2lvbnMgb2YgdGhpcyBmaWxlIHVzZWQgdG8gZGVmaW5lIHRoaXMgdW5pb24gYnV0IHRoaXMgaXMKKyAgIGluY29ycmVjdC4gIE9uZSBjYW4gdGVzdCB0aGUgbWFjcm8gX1NFTV9TRU1VTl9VTkRFRklORUQgdG8gc2VlIHdoZXRoZXIKKyAgIG9uZSBtdXN0IGRlZmluZSB0aGUgdW5pb24gb3Igbm90LiAgKi8KKyNkZWZpbmUgX1NFTV9TRU1VTl9VTkRFRklORUQJMQorCisjaWZkZWYgX19VU0VfTUlTQworCisvKiBpcGNzIGN0bCBjbWRzICovCisjIGRlZmluZSBTRU1fU1RBVCAxOAorIyBkZWZpbmUgU0VNX0lORk8gMTkKKworc3RydWN0ICBzZW1pbmZvCit7CisgIGludCBzZW1tYXA7CisgIGludCBzZW1tbmk7CisgIGludCBzZW1tbnM7CisgIGludCBzZW1tbnU7CisgIGludCBzZW1tc2w7CisgIGludCBzZW1vcG07CisgIGludCBzZW11bWU7CisgIGludCBzZW11c3o7CisgIGludCBzZW12bXg7CisgIGludCBzZW1hZW07Cit9OworCisjZW5kaWYgLyogX19VU0VfTUlTQyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NlbWFwaG9yZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NlbWFwaG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNDQ5M2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2VtYXBob3JlLmgKQEAgLTAsMCArMSwzNiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NFTUFQSE9SRV9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvc2VtYXBob3JlLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzZW1hcGhvcmUuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCisjZGVmaW5lIF9fU0laRU9GX1NFTV9UCTE2CisKKworLyogVmFsdWUgcmV0dXJuZWQgaWYgYHNlbV9vcGVuJyBmYWlsZWQuICAqLworI2RlZmluZSBTRU1fRkFJTEVEICAgICAgKChzZW1fdCAqKSAwKQorCisKK3R5cGVkZWYgdW5pb24KK3sKKyAgY2hhciBfX3NpemVbX19TSVpFT0ZfU0VNX1RdOworICBsb25nIGludCBfX2FsaWduOworfSBzZW1fdDsKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zZXRqbXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zZXRqbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTMzYzQwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NldGptcC5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywxOTk4LDIwMDAsMjAwMSwyMDAzLDIwMDUsMjAwNgorCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBEZWZpbmUgdGhlIG1hY2hpbmUtZGVwZW5kZW50IHR5cGUgYGptcF9idWYnLiAgSW50ZWwgMzg2IHZlcnNpb24uICAqLworI2lmbmRlZiBfQklUU19TRVRKTVBfSAorI2RlZmluZSBfQklUU19TRVRKTVBfSAkxCisKKyNpZiAhZGVmaW5lZCBfU0VUSk1QX0ggJiYgIWRlZmluZWQgX1BUSFJFQURfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zZXRqbXAuaD4gZGlyZWN0bHk7IHVzZSA8c2V0am1wLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYJX0FTTQordHlwZWRlZiBpbnQgX19qbXBfYnVmWzZdOworI2VuZGlmCisKKyNlbmRpZgkvKiBiaXRzL3NldGptcC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2V0am1wMi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NldGptcDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDY1ZDI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NldGptcDIuaApAQCAtMCwwICsxLDQxIEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHNldGptcCBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NFVEpNUF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3NldGptcDIuaD4gZGlyZWN0bHk7IHVzZSA8c2V0am1wLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIFZhcmlhbnQgb2YgdGhlIGxvbmdqbXAgZnVuY3Rpb25zIHdoaWNoIHBlcmZvcm0gc29tZSBzYW5pdHkgY2hlY2tpbmcuICAqLworI2lmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gdm9pZCBfX1JFRElSRUNUX05USE5MIChsb25nam1wLAorCQkJICAgICAgKHN0cnVjdCBfX2ptcF9idWZfdGFnIF9fZW52WzFdLCBpbnQgX192YWwpLAorCQkJICAgICAgX19sb25nam1wX2NoaykgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworZXh0ZXJuIHZvaWQgX19SRURJUkVDVF9OVEhOTCAoX2xvbmdqbXAsCisJCQkgICAgICAoc3RydWN0IF9fam1wX2J1Zl90YWcgX19lbnZbMV0sIGludCBfX3ZhbCksCisJCQkgICAgICBfX2xvbmdqbXBfY2hrKSBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CitleHRlcm4gdm9pZCBfX1JFRElSRUNUX05USE5MIChzaWdsb25nam1wLAorCQkJICAgICAgKHN0cnVjdCBfX2ptcF9idWZfdGFnIF9fZW52WzFdLCBpbnQgX192YWwpLAorCQkJICAgICAgX19sb25nam1wX2NoaykgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworI2Vsc2UKK2V4dGVybiB2b2lkIF9fbG9uZ2ptcF9jaGsgKHN0cnVjdCBfX2ptcF9idWZfdGFnIF9fZW52WzFdLCBpbnQgX192YWwpLAorICAgICBfX1RIUk9XTkwgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworIyBkZWZpbmUgbG9uZ2ptcCBfX2xvbmdqbXBfY2hrCisjIGRlZmluZSBfbG9uZ2ptcCBfX2xvbmdqbXBfY2hrCisjIGRlZmluZSBzaWdsb25nam1wIF9fbG9uZ2ptcF9jaGsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NobS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NobS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYWQwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2htLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NSwxOTk2LDE5OTcsMjAwMCwyMDAyLDIwMDQsMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NITV9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3NobS5oPiBkaXJlY3RseTsgdXNlIDxzeXMvc2htLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKy8qIFBlcm1pc3Npb24gZmxhZyBmb3Igc2htZ2V0LiAgKi8KKyNkZWZpbmUgU0hNX1IJCTA0MDAJCS8qIG9yIFNfSVJVR08gZnJvbSA8bGludXgvc3RhdC5oPiAqLworI2RlZmluZSBTSE1fVwkJMDIwMAkJLyogb3IgU19JV1VHTyBmcm9tIDxsaW51eC9zdGF0Lmg+ICovCisKKy8qIEZsYWdzIGZvciBgc2htYXQnLiAgKi8KKyNkZWZpbmUgU0hNX1JET05MWQkwMTAwMDAJCS8qIGF0dGFjaCByZWFkLW9ubHkgZWxzZSByZWFkLXdyaXRlICovCisjZGVmaW5lIFNITV9STkQJCTAyMDAwMAkJLyogcm91bmQgYXR0YWNoIGFkZHJlc3MgdG8gU0hNTEJBICovCisjZGVmaW5lIFNITV9SRU1BUAkwNDAwMDAJCS8qIHRha2Utb3ZlciByZWdpb24gb24gYXR0YWNoICovCisjZGVmaW5lIFNITV9FWEVDCTAxMDAwMDAJCS8qIGV4ZWN1dGlvbiBhY2Nlc3MgKi8KKworLyogQ29tbWFuZHMgZm9yIGBzaG1jdGwnLiAgKi8KKyNkZWZpbmUgU0hNX0xPQ0sJMTEJCS8qIGxvY2sgc2VnbWVudCAocm9vdCBvbmx5KSAqLworI2RlZmluZSBTSE1fVU5MT0NLCTEyCQkvKiB1bmxvY2sgc2VnbWVudCAocm9vdCBvbmx5KSAqLworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFNlZ21lbnQgbG93IGJvdW5kYXJ5IGFkZHJlc3MgbXVsdGlwbGUuICAqLworI2RlZmluZSBTSE1MQkEJCShfX2dldHBhZ2VzaXplICgpKQorZXh0ZXJuIGludCBfX2dldHBhZ2VzaXplICh2b2lkKSBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworCisvKiBUeXBlIHRvIGNvdW50IG51bWJlciBvZiBhdHRhY2hlcy4gICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHNobWF0dF90OworCisvKiBEYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIGEgc2hhcmVkIG1lbW9yeSBzZWdtZW50LiAgKi8KK3N0cnVjdCBzaG1pZF9kcworICB7CisgICAgc3RydWN0IGlwY19wZXJtIHNobV9wZXJtOwkJLyogb3BlcmF0aW9uIHBlcm1pc3Npb24gc3RydWN0ICovCisgICAgc2l6ZV90IHNobV9zZWdzejsJCQkvKiBzaXplIG9mIHNlZ21lbnQgaW4gYnl0ZXMgKi8KKyAgICBfX3RpbWVfdCBzaG1fYXRpbWU7CQkJLyogdGltZSBvZiBsYXN0IHNobWF0KCkgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDE7CisgICAgX190aW1lX3Qgc2htX2R0aW1lOwkJCS8qIHRpbWUgb2YgbGFzdCBzaG1kdCgpICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQyOworICAgIF9fdGltZV90IHNobV9jdGltZTsJCQkvKiB0aW1lIG9mIGxhc3QgY2hhbmdlIGJ5IHNobWN0bCgpICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQzOworICAgIF9fcGlkX3Qgc2htX2NwaWQ7CQkJLyogcGlkIG9mIGNyZWF0b3IgKi8KKyAgICBfX3BpZF90IHNobV9scGlkOwkJCS8qIHBpZCBvZiBsYXN0IHNobW9wICovCisgICAgc2htYXR0X3Qgc2htX25hdHRjaDsJCS8qIG51bWJlciBvZiBjdXJyZW50IGF0dGFjaGVzICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQ0OworICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkNTsKKyAgfTsKKworI2lmZGVmIF9fVVNFX01JU0MKKworLyogaXBjcyBjdGwgY29tbWFuZHMgKi8KKyMgZGVmaW5lIFNITV9TVEFUIAkxMworIyBkZWZpbmUgU0hNX0lORk8gCTE0CisKKy8qIHNobV9tb2RlIHVwcGVyIGJ5dGUgZmxhZ3MgKi8KKyMgZGVmaW5lIFNITV9ERVNUCTAxMDAwCS8qIHNlZ21lbnQgd2lsbCBiZSBkZXN0cm95ZWQgb24gbGFzdCBkZXRhY2ggKi8KKyMgZGVmaW5lIFNITV9MT0NLRUQJMDIwMDAgICAvKiBzZWdtZW50IHdpbGwgbm90IGJlIHN3YXBwZWQgKi8KKyMgZGVmaW5lIFNITV9IVUdFVExCCTA0MDAwCS8qIHNlZ21lbnQgaXMgbWFwcGVkIHZpYSBodWdldGxiICovCisjIGRlZmluZSBTSE1fTk9SRVNFUlZFCTAxMDAwMAkvKiBkb24ndCBjaGVjayBmb3IgcmVzZXJ2YXRpb25zICovCisKK3N0cnVjdAlzaG1pbmZvCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCBzaG1tYXg7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgc2htbWluOworICAgIHVuc2lnbmVkIGxvbmcgaW50IHNobW1uaTsKKyAgICB1bnNpZ25lZCBsb25nIGludCBzaG1zZWc7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgc2htYWxsOworICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMTsKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDI7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQzOworICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkNDsKKyAgfTsKKworc3RydWN0IHNobV9pbmZvCisgIHsKKyAgICBpbnQgdXNlZF9pZHM7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgc2htX3RvdDsJLyogdG90YWwgYWxsb2NhdGVkIHNobSAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHNobV9yc3M7CS8qIHRvdGFsIHJlc2lkZW50IHNobSAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHNobV9zd3A7CS8qIHRvdGFsIHN3YXBwZWQgc2htICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgc3dhcF9hdHRlbXB0czsKKyAgICB1bnNpZ25lZCBsb25nIGludCBzd2FwX3N1Y2Nlc3NlczsKKyAgfTsKKworI2VuZGlmIC8qIF9fVVNFX01JU0MgKi8KKworX19FTkRfREVDTFMKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zaWdhY3Rpb24uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zaWdhY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmJlMDY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NpZ2FjdGlvbi5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qIFRoZSBwcm9wZXIgZGVmaW5pdGlvbnMgZm9yIExpbnV4J3Mgc2lnYWN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTksIDIwMDAsIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NJR05BTF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3NpZ2FjdGlvbi5oPiBkaXJlY3RseTsgdXNlIDxzaWduYWwuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIGFjdGlvbiB0byBiZSB0YWtlbiB3aGVuIGEgc2lnbmFsIGFycml2ZXMuICAqLworc3RydWN0IHNpZ2FjdGlvbgorICB7CisgICAgLyogU2lnbmFsIGhhbmRsZXIuICAqLworI2lmZGVmIF9fVVNFX1BPU0lYMTk5MzA5CisgICAgdW5pb24KKyAgICAgIHsKKwkvKiBVc2VkIGlmIFNBX1NJR0lORk8gaXMgbm90IHNldC4gICovCisJX19zaWdoYW5kbGVyX3Qgc2FfaGFuZGxlcjsKKwkvKiBVc2VkIGlmIFNBX1NJR0lORk8gaXMgc2V0LiAgKi8KKwl2b2lkICgqc2Ffc2lnYWN0aW9uKSAoaW50LCBzaWdpbmZvX3QgKiwgdm9pZCAqKTsKKyAgICAgIH0KKyAgICBfX3NpZ2FjdGlvbl9oYW5kbGVyOworIyBkZWZpbmUgc2FfaGFuZGxlcglfX3NpZ2FjdGlvbl9oYW5kbGVyLnNhX2hhbmRsZXIKKyMgZGVmaW5lIHNhX3NpZ2FjdGlvbglfX3NpZ2FjdGlvbl9oYW5kbGVyLnNhX3NpZ2FjdGlvbgorI2Vsc2UKKyAgICBfX3NpZ2hhbmRsZXJfdCBzYV9oYW5kbGVyOworI2VuZGlmCisKKyAgICAvKiBBZGRpdGlvbmFsIHNldCBvZiBzaWduYWxzIHRvIGJlIGJsb2NrZWQuICAqLworICAgIF9fc2lnc2V0X3Qgc2FfbWFzazsKKworICAgIC8qIFNwZWNpYWwgZmxhZ3MuICAqLworICAgIGludCBzYV9mbGFnczsKKworICAgIC8qIFJlc3RvcmUgaGFuZGxlci4gICovCisgICAgdm9pZCAoKnNhX3Jlc3RvcmVyKSAodm9pZCk7CisgIH07CisKKy8qIEJpdHMgaW4gYHNhX2ZsYWdzJy4gICovCisjZGVmaW5lCVNBX05PQ0xEU1RPUCAgMQkJIC8qIERvbid0IHNlbmQgU0lHQ0hMRCB3aGVuIGNoaWxkcmVuIHN0b3AuICAqLworI2RlZmluZSBTQV9OT0NMRFdBSVQgIDIJCSAvKiBEb24ndCBjcmVhdGUgem9tYmllIG9uIGNoaWxkIGRlYXRoLiAgKi8KKyNkZWZpbmUgU0FfU0lHSU5GTyAgICA0CQkgLyogSW52b2tlIHNpZ25hbC1jYXRjaGluZyBmdW5jdGlvbiB3aXRoCisJCQkJICAgIHRocmVlIGFyZ3VtZW50cyBpbnN0ZWFkIG9mIG9uZS4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9VTklYOTggfHwgZGVmaW5lZCBfX1VTRV9NSVNDCisjIGRlZmluZSBTQV9PTlNUQUNLICAgMHgwODAwMDAwMCAvKiBVc2Ugc2lnbmFsIHN0YWNrIGJ5IHVzaW5nIGBzYV9yZXN0b3JlcicuICovCisjZW5kaWYKKyNpZiBkZWZpbmVkIF9fVVNFX1VOSVg5OCB8fCBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorIyBkZWZpbmUgU0FfUkVTVEFSVCAgIDB4MTAwMDAwMDAgLyogUmVzdGFydCBzeXNjYWxsIG9uIHNpZ25hbCByZXR1cm4uICAqLworIyBkZWZpbmUgU0FfTk9ERUZFUiAgIDB4NDAwMDAwMDAgLyogRG9uJ3QgYXV0b21hdGljYWxseSBibG9jayB0aGUgc2lnbmFsIHdoZW4KKwkJCQkgICAgaXRzIGhhbmRsZXIgaXMgYmVpbmcgZXhlY3V0ZWQuICAqLworIyBkZWZpbmUgU0FfUkVTRVRIQU5EIDB4ODAwMDAwMDAgLyogUmVzZXQgdG8gU0lHX0RGTCBvbiBlbnRyeSB0byBoYW5kbGVyLiAgKi8KKyNlbmRpZgorI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIFNBX0lOVEVSUlVQVCAweDIwMDAwMDAwIC8qIEhpc3RvcmljYWwgbm8tb3AuICAqLworCisvKiBTb21lIGFsaWFzZXMgZm9yIHRoZSBTQV8gY29uc3RhbnRzLiAgKi8KKyMgZGVmaW5lIFNBX05PTUFTSyAgICBTQV9OT0RFRkVSCisjIGRlZmluZSBTQV9PTkVTSE9UICAgU0FfUkVTRVRIQU5ECisjIGRlZmluZSBTQV9TVEFDSyAgICAgU0FfT05TVEFDSworI2VuZGlmCisKKy8qIFZhbHVlcyBmb3IgdGhlIEhPVyBhcmd1bWVudCB0byBgc2lncHJvY21hc2snLiAgKi8KKyNkZWZpbmUJU0lHX0JMT0NLICAgICAwCQkgLyogQmxvY2sgc2lnbmFscy4gICovCisjZGVmaW5lCVNJR19VTkJMT0NLICAgMQkJIC8qIFVuYmxvY2sgc2lnbmFscy4gICovCisjZGVmaW5lCVNJR19TRVRNQVNLICAgMgkJIC8qIFNldCB0aGUgc2V0IG9mIGJsb2NrZWQgc2lnbmFscy4gICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2lnY29udGV4dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NpZ2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjViNjA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NpZ2NvbnRleHQuaApAQCAtMCwwICsxLDMzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCBfU0lHTkFMX0ggJiYgIWRlZmluZWQgX1NZU19VQ09OVEVYVF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvc2lnY29udGV4dC5oPiBkaXJlY3RseTsgaW5jbHVkZSA8c2lnbmFsLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgc2lnY29udGV4dF9zdHJ1Y3QKKy8qIEtlcm5lbCBoZWFkZXJzIGJlZm9yZSAyLjEuMSBkZWZpbmUgYSBzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QsIGJ1dAorICAgd2UgbmVlZCBzaWdjb250ZXh0LiAgKi8KKyMgZGVmaW5lIHNpZ2NvbnRleHRfc3RydWN0IHNpZ2NvbnRleHQKKworIyBpbmNsdWRlIDxhc20vc2lnY29udGV4dC5oPgorCisvKiBUaGUgTGludXgga2VybmVsIGhlYWRlcnMgcmVkZWZpbmUgTlVMTCB3cm9uZ2x5LCBzbyBjbGVhbnVwIGFmdGVyd2FyZHMuICAqLworIyBkZWZpbmUgX19uZWVkX05VTEwKKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zaWdpbmZvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2lnaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZGQ0YzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc2lnaW5mby5oCkBAIC0wLDAgKzEsMzEzIEBACisvKiBzaWdpbmZvX3QsIHNpZ2V2ZW50IGFuZCBjb25zdGFudHMuICBMaW51eCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDIsIDIwMDMsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCBfU0lHTkFMX0ggJiYgIWRlZmluZWQgX19uZWVkX3NpZ2luZm9fdCBcCisgICAgJiYgIWRlZmluZWQgX19uZWVkX3NpZ2V2ZW50X3QKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LiAgVXNlIDxzaWduYWwuaD4gaW5zdGVhZCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjaWYgKCFkZWZpbmVkIF9faGF2ZV9zaWd2YWxfdCBcCisgICAgICYmIChkZWZpbmVkIF9TSUdOQUxfSCB8fCBkZWZpbmVkIF9fbmVlZF9zaWdpbmZvX3QgXAorCSB8fCBkZWZpbmVkIF9fbmVlZF9zaWdldmVudF90KSkKKyMgZGVmaW5lIF9faGF2ZV9zaWd2YWxfdAkxCisKKy8qIFR5cGUgZm9yIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgc2lnbmFsLiAgKi8KK3R5cGVkZWYgdW5pb24gc2lndmFsCisgIHsKKyAgICBpbnQgc2l2YWxfaW50OworICAgIHZvaWQgKnNpdmFsX3B0cjsKKyAgfSBzaWd2YWxfdDsKKyNlbmRpZgorCisjaWYgKCFkZWZpbmVkIF9faGF2ZV9zaWdpbmZvX3QgXAorICAgICAmJiAoZGVmaW5lZCBfU0lHTkFMX0ggfHwgZGVmaW5lZCBfX25lZWRfc2lnaW5mb190KSkKKyMgZGVmaW5lIF9faGF2ZV9zaWdpbmZvX3QJMQorCisjIGRlZmluZSBfX1NJX01BWF9TSVpFICAgICAxMjgKKyMgaWYgX19XT1JEU0laRSA9PSA2NAorIyAgZGVmaW5lIF9fU0lfUEFEX1NJWkUgICAgICgoX19TSV9NQVhfU0laRSAvIHNpemVvZiAoaW50KSkgLSA0KQorIyBlbHNlCisjICBkZWZpbmUgX19TSV9QQURfU0laRSAgICAgKChfX1NJX01BWF9TSVpFIC8gc2l6ZW9mIChpbnQpKSAtIDMpCisjIGVuZGlmCisKK3R5cGVkZWYgc3RydWN0IHNpZ2luZm8KKyAgeworICAgIGludCBzaV9zaWdubzsJCS8qIFNpZ25hbCBudW1iZXIuICAqLworICAgIGludCBzaV9lcnJubzsJCS8qIElmIG5vbi16ZXJvLCBhbiBlcnJubyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGgKKwkJCQkgICB0aGlzIHNpZ25hbCwgYXMgZGVmaW5lZCBpbiA8ZXJybm8uaD4uICAqLworICAgIGludCBzaV9jb2RlOwkJLyogU2lnbmFsIGNvZGUuICAqLworCisgICAgdW5pb24KKyAgICAgIHsKKwlpbnQgX3BhZFtfX1NJX1BBRF9TSVpFXTsKKworCSAvKiBraWxsKCkuICAqLworCXN0cnVjdAorCSAgeworCSAgICBfX3BpZF90IHNpX3BpZDsJLyogU2VuZGluZyBwcm9jZXNzIElELiAgKi8KKwkgICAgX191aWRfdCBzaV91aWQ7CS8qIFJlYWwgdXNlciBJRCBvZiBzZW5kaW5nIHByb2Nlc3MuICAqLworCSAgfSBfa2lsbDsKKworCS8qIFBPU0lYLjFiIHRpbWVycy4gICovCisJc3RydWN0CisJICB7CisJICAgIGludCBzaV90aWQ7CQkvKiBUaW1lciBJRC4gICovCisJICAgIGludCBzaV9vdmVycnVuOwkvKiBPdmVycnVuIGNvdW50LiAgKi8KKwkgICAgc2lndmFsX3Qgc2lfc2lndmFsOwkvKiBTaWduYWwgdmFsdWUuICAqLworCSAgfSBfdGltZXI7CisKKwkvKiBQT1NJWC4xYiBzaWduYWxzLiAgKi8KKwlzdHJ1Y3QKKwkgIHsKKwkgICAgX19waWRfdCBzaV9waWQ7CS8qIFNlbmRpbmcgcHJvY2VzcyBJRC4gICovCisJICAgIF9fdWlkX3Qgc2lfdWlkOwkvKiBSZWFsIHVzZXIgSUQgb2Ygc2VuZGluZyBwcm9jZXNzLiAgKi8KKwkgICAgc2lndmFsX3Qgc2lfc2lndmFsOwkvKiBTaWduYWwgdmFsdWUuICAqLworCSAgfSBfcnQ7CisKKwkvKiBTSUdDSExELiAgKi8KKwlzdHJ1Y3QKKwkgIHsKKwkgICAgX19waWRfdCBzaV9waWQ7CS8qIFdoaWNoIGNoaWxkLiAgKi8KKwkgICAgX191aWRfdCBzaV91aWQ7CS8qIFJlYWwgdXNlciBJRCBvZiBzZW5kaW5nIHByb2Nlc3MuICAqLworCSAgICBpbnQgc2lfc3RhdHVzOwkvKiBFeGl0IHZhbHVlIG9yIHNpZ25hbC4gICovCisJICAgIF9fY2xvY2tfdCBzaV91dGltZTsKKwkgICAgX19jbG9ja190IHNpX3N0aW1lOworCSAgfSBfc2lnY2hsZDsKKworCS8qIFNJR0lMTCwgU0lHRlBFLCBTSUdTRUdWLCBTSUdCVVMuICAqLworCXN0cnVjdAorCSAgeworCSAgICB2b2lkICpzaV9hZGRyOwkvKiBGYXVsdGluZyBpbnNuL21lbW9yeSByZWYuICAqLworCSAgfSBfc2lnZmF1bHQ7CisKKwkvKiBTSUdQT0xMLiAgKi8KKwlzdHJ1Y3QKKwkgIHsKKwkgICAgbG9uZyBpbnQgc2lfYmFuZDsJLyogQmFuZCBldmVudCBmb3IgU0lHUE9MTC4gICovCisJICAgIGludCBzaV9mZDsKKwkgIH0gX3NpZ3BvbGw7CisgICAgICB9IF9zaWZpZWxkczsKKyAgfSBzaWdpbmZvX3Q7CisKKworLyogWC9PcGVuIHJlcXVpcmVzIHNvbWUgbW9yZSBmaWVsZHMgd2l0aCBmaXhlZCBuYW1lcy4gICovCisjIGRlZmluZSBzaV9waWQJCV9zaWZpZWxkcy5fa2lsbC5zaV9waWQKKyMgZGVmaW5lIHNpX3VpZAkJX3NpZmllbGRzLl9raWxsLnNpX3VpZAorIyBkZWZpbmUgc2lfdGltZXJpZAlfc2lmaWVsZHMuX3RpbWVyLnNpX3RpZAorIyBkZWZpbmUgc2lfb3ZlcnJ1bglfc2lmaWVsZHMuX3RpbWVyLnNpX292ZXJydW4KKyMgZGVmaW5lIHNpX3N0YXR1cwlfc2lmaWVsZHMuX3NpZ2NobGQuc2lfc3RhdHVzCisjIGRlZmluZSBzaV91dGltZQlfc2lmaWVsZHMuX3NpZ2NobGQuc2lfdXRpbWUKKyMgZGVmaW5lIHNpX3N0aW1lCV9zaWZpZWxkcy5fc2lnY2hsZC5zaV9zdGltZQorIyBkZWZpbmUgc2lfdmFsdWUJX3NpZmllbGRzLl9ydC5zaV9zaWd2YWwKKyMgZGVmaW5lIHNpX2ludAkJX3NpZmllbGRzLl9ydC5zaV9zaWd2YWwuc2l2YWxfaW50CisjIGRlZmluZSBzaV9wdHIJCV9zaWZpZWxkcy5fcnQuc2lfc2lndmFsLnNpdmFsX3B0cgorIyBkZWZpbmUgc2lfYWRkcglfc2lmaWVsZHMuX3NpZ2ZhdWx0LnNpX2FkZHIKKyMgZGVmaW5lIHNpX2JhbmQJX3NpZmllbGRzLl9zaWdwb2xsLnNpX2JhbmQKKyMgZGVmaW5lIHNpX2ZkCQlfc2lmaWVsZHMuX3NpZ3BvbGwuc2lfZmQKKworCisvKiBWYWx1ZXMgZm9yIGBzaV9jb2RlJy4gIFBvc2l0aXZlIHZhbHVlcyBhcmUgcmVzZXJ2ZWQgZm9yIGtlcm5lbC1nZW5lcmF0ZWQKKyAgIHNpZ25hbHMuICAqLworZW51bQoreworICBTSV9BU1lOQ05MID0gLTYwLAkJLyogU2VudCBieSBhc3luY2ggbmFtZSBsb29rdXAgY29tcGxldGlvbi4gICovCisjIGRlZmluZSBTSV9BU1lOQ05MCVNJX0FTWU5DTkwKKyAgU0lfVEtJTEwgPSAtNiwJCS8qIFNlbnQgYnkgdGtpbGwuICAqLworIyBkZWZpbmUgU0lfVEtJTEwJU0lfVEtJTEwKKyAgU0lfU0lHSU8sCQkJLyogU2VudCBieSBxdWV1ZWQgU0lHSU8uICovCisjIGRlZmluZSBTSV9TSUdJTwlTSV9TSUdJTworICBTSV9BU1lOQ0lPLAkJCS8qIFNlbnQgYnkgQUlPIGNvbXBsZXRpb24uICAqLworIyBkZWZpbmUgU0lfQVNZTkNJTwlTSV9BU1lOQ0lPCisgIFNJX01FU0dRLAkJCS8qIFNlbnQgYnkgcmVhbCB0aW1lIG1lc3Egc3RhdGUgY2hhbmdlLiAgKi8KKyMgZGVmaW5lIFNJX01FU0dRCVNJX01FU0dRCisgIFNJX1RJTUVSLAkJCS8qIFNlbnQgYnkgdGltZXIgZXhwaXJhdGlvbi4gICovCisjIGRlZmluZSBTSV9USU1FUglTSV9USU1FUgorICBTSV9RVUVVRSwJCQkvKiBTZW50IGJ5IHNpZ3F1ZXVlLiAgKi8KKyMgZGVmaW5lIFNJX1FVRVVFCVNJX1FVRVVFCisgIFNJX1VTRVIsCQkJLyogU2VudCBieSBraWxsLCBzaWdzZW5kLiAgKi8KKyMgZGVmaW5lIFNJX1VTRVIJU0lfVVNFUgorICBTSV9LRVJORUwgPSAweDgwCQkvKiBTZW5kIGJ5IGtlcm5lbC4gICovCisjZGVmaW5lIFNJX0tFUk5FTAlTSV9LRVJORUwKK307CisKKworLyogYHNpX2NvZGUnIHZhbHVlcyBmb3IgU0lHSUxMIHNpZ25hbC4gICovCitlbnVtCit7CisgIElMTF9JTExPUEMgPSAxLAkJLyogSWxsZWdhbCBvcGNvZGUuICAqLworIyBkZWZpbmUgSUxMX0lMTE9QQwlJTExfSUxMT1BDCisgIElMTF9JTExPUE4sCQkJLyogSWxsZWdhbCBvcGVyYW5kLiAgKi8KKyMgZGVmaW5lIElMTF9JTExPUE4JSUxMX0lMTE9QTgorICBJTExfSUxMQURSLAkJCS8qIElsbGVnYWwgYWRkcmVzc2luZyBtb2RlLiAgKi8KKyMgZGVmaW5lIElMTF9JTExBRFIJSUxMX0lMTEFEUgorICBJTExfSUxMVFJQLAkJCS8qIElsbGVnYWwgdHJhcC4gKi8KKyMgZGVmaW5lIElMTF9JTExUUlAJSUxMX0lMTFRSUAorICBJTExfUFJWT1BDLAkJCS8qIFByaXZpbGVnZWQgb3Bjb2RlLiAgKi8KKyMgZGVmaW5lIElMTF9QUlZPUEMJSUxMX1BSVk9QQworICBJTExfUFJWUkVHLAkJCS8qIFByaXZpbGVnZWQgcmVnaXN0ZXIuICAqLworIyBkZWZpbmUgSUxMX1BSVlJFRwlJTExfUFJWUkVHCisgIElMTF9DT1BST0MsCQkJLyogQ29wcm9jZXNzb3IgZXJyb3IuICAqLworIyBkZWZpbmUgSUxMX0NPUFJPQwlJTExfQ09QUk9DCisgIElMTF9CQURTVEsJCQkvKiBJbnRlcm5hbCBzdGFjayBlcnJvci4gICovCisjIGRlZmluZSBJTExfQkFEU1RLCUlMTF9CQURTVEsKK307CisKKy8qIGBzaV9jb2RlJyB2YWx1ZXMgZm9yIFNJR0ZQRSBzaWduYWwuICAqLworZW51bQoreworICBGUEVfSU5URElWID0gMSwJCS8qIEludGVnZXIgZGl2aWRlIGJ5IHplcm8uICAqLworIyBkZWZpbmUgRlBFX0lOVERJVglGUEVfSU5URElWCisgIEZQRV9JTlRPVkYsCQkJLyogSW50ZWdlciBvdmVyZmxvdy4gICovCisjIGRlZmluZSBGUEVfSU5UT1ZGCUZQRV9JTlRPVkYKKyAgRlBFX0ZMVERJViwJCQkvKiBGbG9hdGluZyBwb2ludCBkaXZpZGUgYnkgemVyby4gICovCisjIGRlZmluZSBGUEVfRkxURElWCUZQRV9GTFRESVYKKyAgRlBFX0ZMVE9WRiwJCQkvKiBGbG9hdGluZyBwb2ludCBvdmVyZmxvdy4gICovCisjIGRlZmluZSBGUEVfRkxUT1ZGCUZQRV9GTFRPVkYKKyAgRlBFX0ZMVFVORCwJCQkvKiBGbG9hdGluZyBwb2ludCB1bmRlcmZsb3cuICAqLworIyBkZWZpbmUgRlBFX0ZMVFVORAlGUEVfRkxUVU5ECisgIEZQRV9GTFRSRVMsCQkJLyogRmxvYXRpbmcgcG9pbnQgaW5leGFjdCByZXN1bHQuICAqLworIyBkZWZpbmUgRlBFX0ZMVFJFUwlGUEVfRkxUUkVTCisgIEZQRV9GTFRJTlYsCQkJLyogRmxvYXRpbmcgcG9pbnQgaW52YWxpZCBvcGVyYXRpb24uICAqLworIyBkZWZpbmUgRlBFX0ZMVElOVglGUEVfRkxUSU5WCisgIEZQRV9GTFRTVUIJCQkvKiBTdWJzY3JpcHQgb3V0IG9mIHJhbmdlLiAgKi8KKyMgZGVmaW5lIEZQRV9GTFRTVUIJRlBFX0ZMVFNVQgorfTsKKworLyogYHNpX2NvZGUnIHZhbHVlcyBmb3IgU0lHU0VHViBzaWduYWwuICAqLworZW51bQoreworICBTRUdWX01BUEVSUiA9IDEsCQkvKiBBZGRyZXNzIG5vdCBtYXBwZWQgdG8gb2JqZWN0LiAgKi8KKyMgZGVmaW5lIFNFR1ZfTUFQRVJSCVNFR1ZfTUFQRVJSCisgIFNFR1ZfQUNDRVJSCQkJLyogSW52YWxpZCBwZXJtaXNzaW9ucyBmb3IgbWFwcGVkIG9iamVjdC4gICovCisjIGRlZmluZSBTRUdWX0FDQ0VSUglTRUdWX0FDQ0VSUgorfTsKKworLyogYHNpX2NvZGUnIHZhbHVlcyBmb3IgU0lHQlVTIHNpZ25hbC4gICovCitlbnVtCit7CisgIEJVU19BRFJBTE4gPSAxLAkJLyogSW52YWxpZCBhZGRyZXNzIGFsaWdubWVudC4gICovCisjIGRlZmluZSBCVVNfQURSQUxOCUJVU19BRFJBTE4KKyAgQlVTX0FEUkVSUiwJCQkvKiBOb24tZXhpc3RhbnQgcGh5c2ljYWwgYWRkcmVzcy4gICovCisjIGRlZmluZSBCVVNfQURSRVJSCUJVU19BRFJFUlIKKyAgQlVTX09CSkVSUgkJCS8qIE9iamVjdCBzcGVjaWZpYyBoYXJkd2FyZSBlcnJvci4gICovCisjIGRlZmluZSBCVVNfT0JKRVJSCUJVU19PQkpFUlIKK307CisKKy8qIGBzaV9jb2RlJyB2YWx1ZXMgZm9yIFNJR1RSQVAgc2lnbmFsLiAgKi8KK2VudW0KK3sKKyAgVFJBUF9CUktQVCA9IDEsCQkvKiBQcm9jZXNzIGJyZWFrcG9pbnQuICAqLworIyBkZWZpbmUgVFJBUF9CUktQVAlUUkFQX0JSS1BUCisgIFRSQVBfVFJBQ0UJCQkvKiBQcm9jZXNzIHRyYWNlIHRyYXAuICAqLworIyBkZWZpbmUgVFJBUF9UUkFDRQlUUkFQX1RSQUNFCit9OworCisvKiBgc2lfY29kZScgdmFsdWVzIGZvciBTSUdDSExEIHNpZ25hbC4gICovCitlbnVtCit7CisgIENMRF9FWElURUQgPSAxLAkJLyogQ2hpbGQgaGFzIGV4aXRlZC4gICovCisjIGRlZmluZSBDTERfRVhJVEVECUNMRF9FWElURUQKKyAgQ0xEX0tJTExFRCwJCQkvKiBDaGlsZCB3YXMga2lsbGVkLiAgKi8KKyMgZGVmaW5lIENMRF9LSUxMRUQJQ0xEX0tJTExFRAorICBDTERfRFVNUEVELAkJCS8qIENoaWxkIHRlcm1pbmF0ZWQgYWJub3JtYWxseS4gICovCisjIGRlZmluZSBDTERfRFVNUEVECUNMRF9EVU1QRUQKKyAgQ0xEX1RSQVBQRUQsCQkJLyogVHJhY2VkIGNoaWxkIGhhcyB0cmFwcGVkLiAgKi8KKyMgZGVmaW5lIENMRF9UUkFQUEVECUNMRF9UUkFQUEVECisgIENMRF9TVE9QUEVELAkJCS8qIENoaWxkIGhhcyBzdG9wcGVkLiAgKi8KKyMgZGVmaW5lIENMRF9TVE9QUEVECUNMRF9TVE9QUEVECisgIENMRF9DT05USU5VRUQJCQkvKiBTdG9wcGVkIGNoaWxkIGhhcyBjb250aW51ZWQuICAqLworIyBkZWZpbmUgQ0xEX0NPTlRJTlVFRAlDTERfQ09OVElOVUVECit9OworCisvKiBgc2lfY29kZScgdmFsdWVzIGZvciBTSUdQT0xMIHNpZ25hbC4gICovCitlbnVtCit7CisgIFBPTExfSU4gPSAxLAkJCS8qIERhdGEgaW5wdXQgYXZhaWxhYmxlLiAgKi8KKyMgZGVmaW5lIFBPTExfSU4JUE9MTF9JTgorICBQT0xMX09VVCwJCQkvKiBPdXRwdXQgYnVmZmVycyBhdmFpbGFibGUuICAqLworIyBkZWZpbmUgUE9MTF9PVVQJUE9MTF9PVVQKKyAgUE9MTF9NU0csCQkJLyogSW5wdXQgbWVzc2FnZSBhdmFpbGFibGUuICAgKi8KKyMgZGVmaW5lIFBPTExfTVNHCVBPTExfTVNHCisgIFBPTExfRVJSLAkJCS8qIEkvTyBlcnJvci4gICovCisjIGRlZmluZSBQT0xMX0VSUglQT0xMX0VSUgorICBQT0xMX1BSSSwJCQkvKiBIaWdoIHByaW9yaXR5IGlucHV0IGF2YWlsYWJsZS4gICovCisjIGRlZmluZSBQT0xMX1BSSQlQT0xMX1BSSQorICBQT0xMX0hVUAkJCS8qIERldmljZSBkaXNjb25uZWN0ZWQuICAqLworIyBkZWZpbmUgUE9MTF9IVVAJUE9MTF9IVVAKK307CisKKyMgdW5kZWYgX19uZWVkX3NpZ2luZm9fdAorI2VuZGlmCS8qICFoYXZlIHNpZ2luZm9fdCAmJiAoaGF2ZSBfU0lHTkFMX0ggfHwgbmVlZCBzaWdpbmZvX3QpLiAgKi8KKworCisjaWYgKGRlZmluZWQgX1NJR05BTF9IIHx8IGRlZmluZWQgX19uZWVkX3NpZ2V2ZW50X3QpIFwKKyAgICAmJiAhZGVmaW5lZCBfX2hhdmVfc2lnZXZlbnRfdAorIyBkZWZpbmUgX19oYXZlX3NpZ2V2ZW50X3QJMQorCisvKiBTdHJ1Y3R1cmUgdG8gdHJhbnNwb3J0IGFwcGxpY2F0aW9uLWRlZmluZWQgdmFsdWVzIHdpdGggc2lnbmFscy4gICovCisjIGRlZmluZSBfX1NJR0VWX01BWF9TSVpFCTY0CisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBfX1NJR0VWX1BBRF9TSVpFCSgoX19TSUdFVl9NQVhfU0laRSAvIHNpemVvZiAoaW50KSkgLSA0KQorIyBlbHNlCisjICBkZWZpbmUgX19TSUdFVl9QQURfU0laRQkoKF9fU0lHRVZfTUFYX1NJWkUgLyBzaXplb2YgKGludCkpIC0gMykKKyMgZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3Qgc2lnZXZlbnQKKyAgeworICAgIHNpZ3ZhbF90IHNpZ2V2X3ZhbHVlOworICAgIGludCBzaWdldl9zaWdubzsKKyAgICBpbnQgc2lnZXZfbm90aWZ5OworCisgICAgdW5pb24KKyAgICAgIHsKKwlpbnQgX3BhZFtfX1NJR0VWX1BBRF9TSVpFXTsKKworCS8qIFdoZW4gU0lHRVZfU0lHTkFMIGFuZCBTSUdFVl9USFJFQURfSUQgc2V0LCBMV1AgSUQgb2YgdGhlCisJICAgdGhyZWFkIHRvIHJlY2VpdmUgdGhlIHNpZ25hbC4gICovCisJX19waWRfdCBfdGlkOworCisJc3RydWN0CisJICB7CisJICAgIHZvaWQgKCpfZnVuY3Rpb24pIChzaWd2YWxfdCk7CS8qIEZ1bmN0aW9uIHRvIHN0YXJ0LiAgKi8KKwkgICAgdm9pZCAqX2F0dHJpYnV0ZTsJCQkvKiBSZWFsbHkgcHRocmVhZF9hdHRyX3QuICAqLworCSAgfSBfc2lnZXZfdGhyZWFkOworICAgICAgfSBfc2lnZXZfdW47CisgIH0gc2lnZXZlbnRfdDsKKworLyogUE9TSVggbmFtZXMgdG8gYWNjZXNzIHNvbWUgb2YgdGhlIG1lbWJlcnMuICAqLworIyBkZWZpbmUgc2lnZXZfbm90aWZ5X2Z1bmN0aW9uICAgX3NpZ2V2X3VuLl9zaWdldl90aHJlYWQuX2Z1bmN0aW9uCisjIGRlZmluZSBzaWdldl9ub3RpZnlfYXR0cmlidXRlcyBfc2lnZXZfdW4uX3NpZ2V2X3RocmVhZC5fYXR0cmlidXRlCisKKy8qIGBzaWdldl9ub3RpZnknIHZhbHVlcy4gICovCitlbnVtCit7CisgIFNJR0VWX1NJR05BTCA9IDAsCQkvKiBOb3RpZnkgdmlhIHNpZ25hbC4gICovCisjIGRlZmluZSBTSUdFVl9TSUdOQUwJU0lHRVZfU0lHTkFMCisgIFNJR0VWX05PTkUsCQkJLyogT3RoZXIgbm90aWZpY2F0aW9uOiBtZWFuaW5nbGVzcy4gICovCisjIGRlZmluZSBTSUdFVl9OT05FCVNJR0VWX05PTkUKKyAgU0lHRVZfVEhSRUFELAkJCS8qIERlbGl2ZXIgdmlhIHRocmVhZCBjcmVhdGlvbi4gICovCisjIGRlZmluZSBTSUdFVl9USFJFQUQJU0lHRVZfVEhSRUFECisKKyAgU0lHRVZfVEhSRUFEX0lEID0gNAkJLyogU2VuZCBzaWduYWwgdG8gc3BlY2lmaWMgdGhyZWFkLiAgKi8KKyNkZWZpbmUgU0lHRVZfVEhSRUFEX0lECVNJR0VWX1RIUkVBRF9JRAorfTsKKworI2VuZGlmCS8qIGhhdmUgX1NJR05BTF9ILiAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zaWdudW0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zaWdudW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMThhYzExCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NpZ251bS5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIFNpZ25hbCBudW1iZXIgZGVmaW5pdGlvbnMuICBMaW51eCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NywxOTk4LDE5OTksMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmZGVmCV9TSUdOQUxfSAorCisvKiBGYWtlIHNpZ25hbCBmdW5jdGlvbnMuICAqLworI2RlZmluZSBTSUdfRVJSCSgoX19zaWdoYW5kbGVyX3QpIC0xKQkJLyogRXJyb3IgcmV0dXJuLiAgKi8KKyNkZWZpbmUgU0lHX0RGTAkoKF9fc2lnaGFuZGxlcl90KSAwKQkJLyogRGVmYXVsdCBhY3Rpb24uICAqLworI2RlZmluZSBTSUdfSUdOCSgoX19zaWdoYW5kbGVyX3QpIDEpCQkvKiBJZ25vcmUgc2lnbmFsLiAgKi8KKworI2lmZGVmIF9fVVNFX1VOSVg5OAorIyBkZWZpbmUgU0lHX0hPTEQJKChfX3NpZ2hhbmRsZXJfdCkgMikJLyogQWRkIHNpZ25hbCB0byBob2xkIG1hc2suICAqLworI2VuZGlmCisKKworLyogU2lnbmFscy4gICovCisjZGVmaW5lCVNJR0hVUAkJMQkvKiBIYW5ndXAgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR0lOVAkJMgkvKiBJbnRlcnJ1cHQgKEFOU0kpLiAgKi8KKyNkZWZpbmUJU0lHUVVJVAkJMwkvKiBRdWl0IChQT1NJWCkuICAqLworI2RlZmluZQlTSUdJTEwJCTQJLyogSWxsZWdhbCBpbnN0cnVjdGlvbiAoQU5TSSkuICAqLworI2RlZmluZQlTSUdUUkFQCQk1CS8qIFRyYWNlIHRyYXAgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR0FCUlQJCTYJLyogQWJvcnQgKEFOU0kpLiAgKi8KKyNkZWZpbmUJU0lHSU9UCQk2CS8qIElPVCB0cmFwICg0LjIgQlNEKS4gICovCisjZGVmaW5lCVNJR0JVUwkJNwkvKiBCVVMgZXJyb3IgKDQuMiBCU0QpLiAgKi8KKyNkZWZpbmUJU0lHRlBFCQk4CS8qIEZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbiAoQU5TSSkuICAqLworI2RlZmluZQlTSUdLSUxMCQk5CS8qIEtpbGwsIHVuYmxvY2thYmxlIChQT1NJWCkuICAqLworI2RlZmluZQlTSUdVU1IxCQkxMAkvKiBVc2VyLWRlZmluZWQgc2lnbmFsIDEgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR1NFR1YJCTExCS8qIFNlZ21lbnRhdGlvbiB2aW9sYXRpb24gKEFOU0kpLiAgKi8KKyNkZWZpbmUJU0lHVVNSMgkJMTIJLyogVXNlci1kZWZpbmVkIHNpZ25hbCAyIChQT1NJWCkuICAqLworI2RlZmluZQlTSUdQSVBFCQkxMwkvKiBCcm9rZW4gcGlwZSAoUE9TSVgpLiAgKi8KKyNkZWZpbmUJU0lHQUxSTQkJMTQJLyogQWxhcm0gY2xvY2sgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR1RFUk0JCTE1CS8qIFRlcm1pbmF0aW9uIChBTlNJKS4gICovCisjZGVmaW5lCVNJR1NUS0ZMVAkxNgkvKiBTdGFjayBmYXVsdC4gICovCisjZGVmaW5lCVNJR0NMRAkJU0lHQ0hMRAkvKiBTYW1lIGFzIFNJR0NITEQgKFN5c3RlbSBWKS4gICovCisjZGVmaW5lCVNJR0NITEQJCTE3CS8qIENoaWxkIHN0YXR1cyBoYXMgY2hhbmdlZCAoUE9TSVgpLiAgKi8KKyNkZWZpbmUJU0lHQ09OVAkJMTgJLyogQ29udGludWUgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR1NUT1AJCTE5CS8qIFN0b3AsIHVuYmxvY2thYmxlIChQT1NJWCkuICAqLworI2RlZmluZQlTSUdUU1RQCQkyMAkvKiBLZXlib2FyZCBzdG9wIChQT1NJWCkuICAqLworI2RlZmluZQlTSUdUVElOCQkyMQkvKiBCYWNrZ3JvdW5kIHJlYWQgZnJvbSB0dHkgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR1RUT1UJCTIyCS8qIEJhY2tncm91bmQgd3JpdGUgdG8gdHR5IChQT1NJWCkuICAqLworI2RlZmluZQlTSUdVUkcJCTIzCS8qIFVyZ2VudCBjb25kaXRpb24gb24gc29ja2V0ICg0LjIgQlNEKS4gICovCisjZGVmaW5lCVNJR1hDUFUJCTI0CS8qIENQVSBsaW1pdCBleGNlZWRlZCAoNC4yIEJTRCkuICAqLworI2RlZmluZQlTSUdYRlNaCQkyNQkvKiBGaWxlIHNpemUgbGltaXQgZXhjZWVkZWQgKDQuMiBCU0QpLiAgKi8KKyNkZWZpbmUJU0lHVlRBTFJNCTI2CS8qIFZpcnR1YWwgYWxhcm0gY2xvY2sgKDQuMiBCU0QpLiAgKi8KKyNkZWZpbmUJU0lHUFJPRgkJMjcJLyogUHJvZmlsaW5nIGFsYXJtIGNsb2NrICg0LjIgQlNEKS4gICovCisjZGVmaW5lCVNJR1dJTkNICTI4CS8qIFdpbmRvdyBzaXplIGNoYW5nZSAoNC4zIEJTRCwgU3VuKS4gICovCisjZGVmaW5lCVNJR1BPTEwJCVNJR0lPCS8qIFBvbGxhYmxlIGV2ZW50IG9jY3VycmVkIChTeXN0ZW0gVikuICAqLworI2RlZmluZQlTSUdJTwkJMjkJLyogSS9PIG5vdyBwb3NzaWJsZSAoNC4yIEJTRCkuICAqLworI2RlZmluZQlTSUdQV1IJCTMwCS8qIFBvd2VyIGZhaWx1cmUgcmVzdGFydCAoU3lzdGVtIFYpLiAgKi8KKyNkZWZpbmUgU0lHU1lTCQkzMQkvKiBCYWQgc3lzdGVtIGNhbGwuICAqLworI2RlZmluZSBTSUdVTlVTRUQJMzEKKworI2RlZmluZQlfTlNJRwkJNjUJLyogQmlnZ2VzdCBzaWduYWwgbnVtYmVyICsgMQorCQkJCSAgIChpbmNsdWRpbmcgcmVhbC10aW1lIHNpZ25hbHMpLiAgKi8KKworI2RlZmluZSBTSUdSVE1JTiAgICAgICAgKF9fbGliY19jdXJyZW50X3NpZ3J0bWluICgpKQorI2RlZmluZSBTSUdSVE1BWCAgICAgICAgKF9fbGliY19jdXJyZW50X3NpZ3J0bWF4ICgpKQorCisvKiBUaGVzZSBhcmUgdGhlIGhhcmQgbGltaXRzIG9mIHRoZSBrZXJuZWwuICBUaGVzZSB2YWx1ZXMgc2hvdWxkIG5vdCBiZQorICAgdXNlZCBkaXJlY3RseSBhdCB1c2VyIGxldmVsLiAgKi8KKyNkZWZpbmUgX19TSUdSVE1JTgkzMgorI2RlZmluZSBfX1NJR1JUTUFYCShfTlNJRyAtIDEpCisKKyNlbmRpZgkvKiA8c2lnbmFsLmg+IGluY2x1ZGVkLiAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zaWdzZXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zaWdzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWVjOGFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NpZ3NldC5oCkBAIC0wLDAgKzEsMTI2IEBACisvKiBfX3NpZ19hdG9taWNfdCwgX19zaWdzZXRfdCwgYW5kIHJlbGF0ZWQgZGVmaW5pdGlvbnMuICBMaW51eCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTk0LCAxOTk2LCAxOTk3LCAyMDA3CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU0lHU0VUX0hfdHlwZXMKKyMgZGVmaW5lIF9TSUdTRVRfSF90eXBlcwkxCisKK3R5cGVkZWYgaW50IF9fc2lnX2F0b21pY190OworCisvKiBBIGBzaWdzZXRfdCcgaGFzIGEgYml0IGZvciBlYWNoIHNpZ25hbC4gICovCisKKyMgZGVmaW5lIF9TSUdTRVRfTldPUkRTCSgxMDI0IC8gKDggKiBzaXplb2YgKHVuc2lnbmVkIGxvbmcgaW50KSkpCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX192YWxbX1NJR1NFVF9OV09SRFNdOworICB9IF9fc2lnc2V0X3Q7CisKKyNlbmRpZgorCisKKy8qIFdlIG9ubHkgd2FudCB0byBkZWZpbmUgdGhlc2UgZnVuY3Rpb25zIGlmIDxzaWduYWwuaD4gd2FzIGFjdHVhbGx5CisgICBpbmNsdWRlZDsgb3RoZXJ3aXNlIHdlIHdlcmUgaW5jbHVkZWQganVzdCB0byBkZWZpbmUgdGhlIHR5cGVzLiAgU2luY2Ugd2UKKyAgIGFyZSBuYW1lc3BhY2UtY2xlYW4sIGl0IHdvdWxkbid0IGh1cnQgdG8gZGVmaW5lIGV4dHJhIG1hY3Jvcy4gIEJ1dAorICAgdHJvdWJsZSBjYW4gYmUgY2F1c2VkIGJ5IGZ1bmN0aW9ucyBiZWluZyBkZWZpbmVkIChlLmcuLCBhbnkgZ2xvYmFsCisgICByZWdpc3RlciB2YXJzIGRlY2xhcmVkIGxhdGVyIHdpbGwgY2F1c2UgY29tcGlsYXRpb24gZXJyb3JzKS4gICovCisKKyNpZiAhZGVmaW5lZCBfU0lHU0VUX0hfZm5zICYmIGRlZmluZWQgX1NJR05BTF9ICisjIGRlZmluZSBfU0lHU0VUX0hfZm5zIDEKKworIyBpZm5kZWYgX0VYVEVSTl9JTkxJTkUKKyMgIGRlZmluZSBfRVhURVJOX0lOTElORSBfX2V4dGVybl9pbmxpbmUKKyMgZW5kaWYKKworLyogUmV0dXJuIGEgbWFzayB0aGF0IGluY2x1ZGVzIHRoZSBiaXQgZm9yIFNJRyBvbmx5LiAgKi8KKyMgZGVmaW5lIF9fc2lnbWFzayhzaWcpIFwKKyAgKCgodW5zaWduZWQgbG9uZyBpbnQpIDEpIDw8ICgoKHNpZykgLSAxKSAlICg4ICogc2l6ZW9mICh1bnNpZ25lZCBsb25nIGludCkpKSkKKworLyogUmV0dXJuIHRoZSB3b3JkIGluZGV4IGZvciBTSUcuICAqLworIyBkZWZpbmUgX19zaWd3b3JkKHNpZykJKCgoc2lnKSAtIDEpIC8gKDggKiBzaXplb2YgKHVuc2lnbmVkIGxvbmcgaW50KSkpCisKKyMgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyCisjICBkZWZpbmUgX19zaWdlbXB0eXNldChzZXQpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgaW50IF9fY250ID0gX1NJR1NFVF9OV09SRFM7CQkJCSAgICAgIFwKKwkJICAgIHNpZ3NldF90ICpfX3NldCA9IChzZXQpOwkJCQkgICAgICBcCisJCSAgICB3aGlsZSAoLS1fX2NudCA+PSAwKSBfX3NldC0+X192YWxbX19jbnRdID0gMDsJICAgICAgXAorCQkgICAgMDsgfSkpCisjICBkZWZpbmUgX19zaWdmaWxsc2V0KHNldCkgXAorICAoX19leHRlbnNpb25fXyAoeyBpbnQgX19jbnQgPSBfU0lHU0VUX05XT1JEUzsJCQkJICAgICAgXAorCQkgICAgc2lnc2V0X3QgKl9fc2V0ID0gKHNldCk7CQkJCSAgICAgIFwKKwkJICAgIHdoaWxlICgtLV9fY250ID49IDApIF9fc2V0LT5fX3ZhbFtfX2NudF0gPSB+MFVMOwkgICAgICBcCisJCSAgICAwOyB9KSkKKworIyAgaWZkZWYgX19VU0VfR05VCisvKiBUaGUgUE9TSVggZG9lcyBub3Qgc3BlY2lmeSBmb3IgaGFuZGxpbmcgdGhlIHdob2xlIHNpZ25hbCBzZXQgaW4gb25lCisgICBjb21tYW5kLiAgVGhpcyBpcyBvZnRlbiB3YW50ZWQgYW5kIHNvIHdlIGRlZmluZSB0aHJlZSBtb3JlIGZ1bmN0aW9ucworICAgaGVyZS4gICovCisjICAgZGVmaW5lIF9fc2lnaXNlbXB0eXNldChzZXQpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgaW50IF9fY250ID0gX1NJR1NFVF9OV09SRFM7CQkJCSAgICAgIFwKKwkJICAgIGNvbnN0IHNpZ3NldF90ICpfX3NldCA9IChzZXQpOwkJCSAgICAgIFwKKwkJICAgIGludCBfX3JldCA9IF9fc2V0LT5fX3ZhbFstLV9fY250XTsJCQkgICAgICBcCisJCSAgICB3aGlsZSAoIV9fcmV0ICYmIC0tX19jbnQgPj0gMCkJCQkgICAgICBcCisJCQlfX3JldCA9IF9fc2V0LT5fX3ZhbFtfX2NudF07CQkJICAgICAgXAorCQkgICAgX19yZXQgPT0gMDsgfSkpCisjICAgZGVmaW5lIF9fc2lnYW5kc2V0KGRlc3QsIGxlZnQsIHJpZ2h0KSBcCisgIChfX2V4dGVuc2lvbl9fICh7IGludCBfX2NudCA9IF9TSUdTRVRfTldPUkRTOwkJCQkgICAgICBcCisJCSAgICBzaWdzZXRfdCAqX19kZXN0ID0gKGRlc3QpOwkJCQkgICAgICBcCisJCSAgICBjb25zdCBzaWdzZXRfdCAqX19sZWZ0ID0gKGxlZnQpOwkJCSAgICAgIFwKKwkJICAgIGNvbnN0IHNpZ3NldF90ICpfX3JpZ2h0ID0gKHJpZ2h0KTsJCQkgICAgICBcCisJCSAgICB3aGlsZSAoLS1fX2NudCA+PSAwKQkJCQkgICAgICBcCisJCSAgICAgIF9fZGVzdC0+X192YWxbX19jbnRdID0gKF9fbGVmdC0+X192YWxbX19jbnRdCSAgICAgIFwKKwkJCQkJICAgICAgJiBfX3JpZ2h0LT5fX3ZhbFtfX2NudF0pOwkgICAgICBcCisJCSAgICAwOyB9KSkKKyMgICBkZWZpbmUgX19zaWdvcnNldChkZXN0LCBsZWZ0LCByaWdodCkgXAorICAoX19leHRlbnNpb25fXyAoeyBpbnQgX19jbnQgPSBfU0lHU0VUX05XT1JEUzsJCQkJICAgICAgXAorCQkgICAgc2lnc2V0X3QgKl9fZGVzdCA9IChkZXN0KTsJCQkJICAgICAgXAorCQkgICAgY29uc3Qgc2lnc2V0X3QgKl9fbGVmdCA9IChsZWZ0KTsJCQkgICAgICBcCisJCSAgICBjb25zdCBzaWdzZXRfdCAqX19yaWdodCA9IChyaWdodCk7CQkJICAgICAgXAorCQkgICAgd2hpbGUgKC0tX19jbnQgPj0gMCkJCQkJICAgICAgXAorCQkgICAgICBfX2Rlc3QtPl9fdmFsW19fY250XSA9IChfX2xlZnQtPl9fdmFsW19fY250XQkgICAgICBcCisJCQkJCSAgICAgIHwgX19yaWdodC0+X192YWxbX19jbnRdKTsJICAgICAgXAorCQkgICAgMDsgfSkpCisjICBlbmRpZgorIyBlbmRpZgorCisvKiBUaGVzZSBmdW5jdGlvbnMgbmVlZG4ndCBjaGVjayBmb3IgYSBib2d1cyBzaWduYWwgbnVtYmVyIC0tIGVycm9yCisgICBjaGVja2luZyBpcyBkb25lIGluIHRoZSBub24gX18gdmVyc2lvbnMuICAqLworCitleHRlcm4gaW50IF9fc2lnaXNtZW1iZXIgKF9fY29uc3QgX19zaWdzZXRfdCAqLCBpbnQpOworZXh0ZXJuIGludCBfX3NpZ2FkZHNldCAoX19zaWdzZXRfdCAqLCBpbnQpOworZXh0ZXJuIGludCBfX3NpZ2RlbHNldCAoX19zaWdzZXRfdCAqLCBpbnQpOworCisjIGlmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCisjICBkZWZpbmUgX19TSUdTRVRGTihOQU1FLCBCT0RZLCBDT05TVCkJCQkJCSAgICAgIFwKKyAgX0VYVEVSTl9JTkxJTkUgaW50CQkJCQkJCSAgICAgIFwKKyAgTkFNRSAoQ09OU1QgX19zaWdzZXRfdCAqX19zZXQsIGludCBfX3NpZykJCQkJICAgICAgXAorICB7CQkJCQkJCQkJICAgICAgXAorICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fbWFzayA9IF9fc2lnbWFzayAoX19zaWcpOwkJCSAgICAgIFwKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3dvcmQgPSBfX3NpZ3dvcmQgKF9fc2lnKTsJCQkgICAgICBcCisgICAgcmV0dXJuIEJPRFk7CQkJCQkJCSAgICAgIFwKKyAgfQorCitfX1NJR1NFVEZOIChfX3NpZ2lzbWVtYmVyLCAoX19zZXQtPl9fdmFsW19fd29yZF0gJiBfX21hc2spID8gMSA6IDAsIF9fY29uc3QpCitfX1NJR1NFVEZOIChfX3NpZ2FkZHNldCwgKChfX3NldC0+X192YWxbX193b3JkXSB8PSBfX21hc2spLCAwKSwgKQorX19TSUdTRVRGTiAoX19zaWdkZWxzZXQsICgoX19zZXQtPl9fdmFsW19fd29yZF0gJj0gfl9fbWFzayksIDApLCApCisKKyMgIHVuZGVmIF9fU0lHU0VURk4KKyMgZW5kaWYKKworCisjZW5kaWYgLyogISBfU0lHU0VUX0hfZm5zLiAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zaWdzdGFjay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NpZ3N0YWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YyNjAzNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zaWdzdGFjay5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIHNpZ3N0YWNrLCBzaWdhbHRzdGFjayBkZWZpbml0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU0lHTkFMX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LiAgVXNlIDxzaWduYWwuaD4gaW5zdGVhZCIKKyNlbmRpZgorCisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIGEgc2lnbmFsIHN0YWNrIChvYnNvbGV0ZSkuICAqLworc3RydWN0IHNpZ3N0YWNrCisgIHsKKyAgICB2b2lkICpzc19zcDsJCS8qIFNpZ25hbCBzdGFjayBwb2ludGVyLiAgKi8KKyAgICBpbnQgc3Nfb25zdGFjazsJCS8qIE5vbnplcm8gaWYgZXhlY3V0aW5nIG9uIHRoaXMgc3RhY2suICAqLworICB9OworCisKKy8qIFBvc3NpYmxlIHZhbHVlcyBmb3IgYHNzX2ZsYWdzLicuICAqLworZW51bQoreworICBTU19PTlNUQUNLID0gMSwKKyNkZWZpbmUgU1NfT05TVEFDSwlTU19PTlNUQUNLCisgIFNTX0RJU0FCTEUKKyNkZWZpbmUgU1NfRElTQUJMRQlTU19ESVNBQkxFCit9OworCisvKiBNaW5pbXVtIHN0YWNrIHNpemUgZm9yIGEgc2lnbmFsIGhhbmRsZXIuICAqLworI2RlZmluZSBNSU5TSUdTVEtTWgkyMDQ4CisKKy8qIFN5c3RlbSBkZWZhdWx0IHN0YWNrIHNpemUuICAqLworI2RlZmluZSBTSUdTVEtTWgk4MTkyCisKKworLyogQWx0ZXJuYXRlLCBwcmVmZXJyZWQgaW50ZXJmYWNlLiAgKi8KK3R5cGVkZWYgc3RydWN0IHNpZ2FsdHN0YWNrCisgIHsKKyAgICB2b2lkICpzc19zcDsKKyAgICBpbnQgc3NfZmxhZ3M7CisgICAgc2l6ZV90IHNzX3NpemU7CisgIH0gc3RhY2tfdDsKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zaWd0aHJlYWQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zaWd0aHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTUyNGU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NpZ3RocmVhZC5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qIFNpZ25hbCBoYW5kbGluZyBmdW5jdGlvbiBmb3IgdGhyZWFkZWQgcHJvZ3JhbXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlCisgICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKKyAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBfQklUU19TSUdUSFJFQURfSAorI2RlZmluZSBfQklUU19TSUdUSFJFQURfSAkxCisKKyNpZiAhZGVmaW5lZCBfU0lHTkFMX0ggJiYgIWRlZmluZWQgX1BUSFJFQURfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkuICBVc2UgPHB0aHJlYWQuaD4gaW5zdGVhZCIKKyNlbmRpZgorCisvKiBGdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHNpZ25hbHMuICovCisKKy8qIE1vZGlmeSB0aGUgc2lnbmFsIG1hc2sgZm9yIHRoZSBjYWxsaW5nIHRocmVhZC4gIFRoZSBhcmd1bWVudHMgaGF2ZQorICAgdGhlIHNhbWUgbWVhbmluZyBhcyBmb3Igc2lncHJvY21hc2soMikuICovCitleHRlcm4gaW50IHB0aHJlYWRfc2lnbWFzayAoaW50IF9faG93LAorCQkJICAgIF9fY29uc3QgX19zaWdzZXRfdCAqX19yZXN0cmljdCBfX25ld21hc2ssCisJCQkgICAgX19zaWdzZXRfdCAqX19yZXN0cmljdCBfX29sZG1hc2spX19USFJPVzsKKworLyogU2VuZCBzaWduYWwgU0lHTk8gdG8gdGhlIGdpdmVuIHRocmVhZC4gKi8KK2V4dGVybiBpbnQgcHRocmVhZF9raWxsIChwdGhyZWFkX3QgX190aHJlYWRpZCwgaW50IF9fc2lnbm8pIF9fVEhST1c7CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFF1ZXVlIHNpZ25hbCBhbmQgZGF0YSB0byBhIHRocmVhZC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfc2lncXVldWUgKHB0aHJlYWRfdCBfX3RocmVhZGlkLCBpbnQgX19zaWdubywKKwkJCSAgICAgY29uc3QgdW5pb24gc2lndmFsIF9fdmFsdWUpIF9fVEhST1c7CisjZW5kaWYKKworI2VuZGlmCS8qIGJpdHMvc2lndGhyZWFkLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zb2NrYWRkci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NvY2thZGRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxZDEzMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zb2NrYWRkci5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qIERlZmluaXRpb24gb2YgYHN0cnVjdCBzb2NrYWRkcl8qJyBjb21tb24gbWVtYmVycy4gIEdlbmVyaWMvNC4yIEJTRCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NywxOTk4LDIwMDAsMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqIE5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5OyB1c2UgPHN5cy9zb2NrZXQuaD4gaW5zdGVhZC4KKyAqLworCisjaWZuZGVmIF9CSVRTX1NPQ0tBRERSX0gKKyNkZWZpbmUgX0JJVFNfU09DS0FERFJfSAkxCisKKworLyogUE9TSVguMWcgc3BlY2lmaWVzIHRoaXMgdHlwZSBuYW1lIGZvciB0aGUgYHNhX2ZhbWlseScgbWVtYmVyLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IHNhX2ZhbWlseV90OworCisvKiBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gZGVjbGFyZSB0aGUgaW5pdGlhbCBjb21tb24gbWVtYmVycworICAgb2YgdGhlIGRhdGEgdHlwZXMgdXNlZCBmb3Igc29ja2V0IGFkZHJlc3NlcywgYHN0cnVjdCBzb2NrYWRkcicsCisgICBgc3RydWN0IHNvY2thZGRyX2luJywgYHN0cnVjdCBzb2NrYWRkcl91bicsIGV0Yy4gICovCisKKyNkZWZpbmUJX19TT0NLQUREUl9DT01NT04oc2FfcHJlZml4KSBcCisgIHNhX2ZhbWlseV90IHNhX3ByZWZpeCMjZmFtaWx5CisKKyNkZWZpbmUgX19TT0NLQUREUl9DT01NT05fU0laRQkoc2l6ZW9mICh1bnNpZ25lZCBzaG9ydCBpbnQpKQorCisjZW5kaWYJLyogYml0cy9zb2NrYWRkci5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc29ja2V0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllMDkwYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zb2NrZXQuaApAQCAtMCwwICsxLDQ0NCBAQAorLyogU3lzdGVtLXNwZWNpZmljIHNvY2tldCBjb25zdGFudHMgYW5kIHR5cGVzLiAgTGludXggdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5NC0yMDAxLCAyMDA0LCAyMDA2LTIwMTAsIDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9fQklUU19TT0NLRVRfSAorI2RlZmluZSBfX0JJVFNfU09DS0VUX0gKKworI2lmbmRlZiBfU1lTX1NPQ0tFVF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3NvY2tldC5oPiBkaXJlY3RseTsgdXNlIDxzeXMvc29ja2V0Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNkZWZpbmUJX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qIFR5cGUgZm9yIGxlbmd0aCBhcmd1bWVudHMgaW4gc29ja2V0IGNhbGxzLiAgKi8KKyNpZm5kZWYgX19zb2NrbGVuX3RfZGVmaW5lZAordHlwZWRlZiBfX3NvY2tsZW5fdCBzb2NrbGVuX3Q7CisjIGRlZmluZSBfX3NvY2tsZW5fdF9kZWZpbmVkCisjZW5kaWYKKworLyogVHlwZXMgb2Ygc29ja2V0cy4gICovCitlbnVtIF9fc29ja2V0X3R5cGUKK3sKKyAgU09DS19TVFJFQU0gPSAxLAkJLyogU2VxdWVuY2VkLCByZWxpYWJsZSwgY29ubmVjdGlvbi1iYXNlZAorCQkJCSAgIGJ5dGUgc3RyZWFtcy4gICovCisjZGVmaW5lIFNPQ0tfU1RSRUFNIFNPQ0tfU1RSRUFNCisgIFNPQ0tfREdSQU0gPSAyLAkJLyogQ29ubmVjdGlvbmxlc3MsIHVucmVsaWFibGUgZGF0YWdyYW1zCisJCQkJICAgb2YgZml4ZWQgbWF4aW11bSBsZW5ndGguICAqLworI2RlZmluZSBTT0NLX0RHUkFNIFNPQ0tfREdSQU0KKyAgU09DS19SQVcgPSAzLAkJCS8qIFJhdyBwcm90b2NvbCBpbnRlcmZhY2UuICAqLworI2RlZmluZSBTT0NLX1JBVyBTT0NLX1JBVworICBTT0NLX1JETSA9IDQsCQkJLyogUmVsaWFibHktZGVsaXZlcmVkIG1lc3NhZ2VzLiAgKi8KKyNkZWZpbmUgU09DS19SRE0gU09DS19SRE0KKyAgU09DS19TRVFQQUNLRVQgPSA1LAkJLyogU2VxdWVuY2VkLCByZWxpYWJsZSwgY29ubmVjdGlvbi1iYXNlZCwKKwkJCQkgICBkYXRhZ3JhbXMgb2YgZml4ZWQgbWF4aW11bSBsZW5ndGguICAqLworI2RlZmluZSBTT0NLX1NFUVBBQ0tFVCBTT0NLX1NFUVBBQ0tFVAorICBTT0NLX0RDQ1AgPSA2LAkJLyogRGF0YWdyYW0gQ29uZ2VzdGlvbiBDb250cm9sIFByb3RvY29sLiAgKi8KKyNkZWZpbmUgU09DS19EQ0NQIFNPQ0tfRENDUAorICBTT0NLX1BBQ0tFVCA9IDEwLAkJLyogTGludXggc3BlY2lmaWMgd2F5IG9mIGdldHRpbmcgcGFja2V0cworCQkJCSAgIGF0IHRoZSBkZXYgbGV2ZWwuICBGb3Igd3JpdGluZyByYXJwIGFuZAorCQkJCSAgIG90aGVyIHNpbWlsYXIgdGhpbmdzIG9uIHRoZSB1c2VyIGxldmVsLiAqLworI2RlZmluZSBTT0NLX1BBQ0tFVCBTT0NLX1BBQ0tFVAorCisgIC8qIEZsYWdzIHRvIGJlIE9SZWQgaW50byB0aGUgdHlwZSBwYXJhbWV0ZXIgb2Ygc29ja2V0IGFuZCBzb2NrZXRwYWlyIGFuZAorICAgICB1c2VkIGZvciB0aGUgZmxhZ3MgcGFyYW1ldGVyIG9mIHBhY2NlcHQuICAqLworCisgIFNPQ0tfQ0xPRVhFQyA9IDAyMDAwMDAwLAkvKiBBdG9taWNhbGx5IHNldCBjbG9zZS1vbi1leGVjIGZsYWcgZm9yIHRoZQorCQkJCSAgIG5ldyBkZXNjcmlwdG9yKHMpLiAgKi8KKyNkZWZpbmUgU09DS19DTE9FWEVDIFNPQ0tfQ0xPRVhFQworICBTT0NLX05PTkJMT0NLID0gMDQwMDAJCS8qIEF0b21pY2FsbHkgbWFyayBkZXNjcmlwdG9yKHMpIGFzCisJCQkJICAgbm9uLWJsb2NraW5nLiAgKi8KKyNkZWZpbmUgU09DS19OT05CTE9DSyBTT0NLX05PTkJMT0NLCit9OworCisvKiBQcm90b2NvbCBmYW1pbGllcy4gICovCisjZGVmaW5lCVBGX1VOU1BFQwkwCS8qIFVuc3BlY2lmaWVkLiAgKi8KKyNkZWZpbmUJUEZfTE9DQUwJMQkvKiBMb2NhbCB0byBob3N0IChwaXBlcyBhbmQgZmlsZS1kb21haW4pLiAgKi8KKyNkZWZpbmUJUEZfVU5JWAkJUEZfTE9DQUwgLyogUE9TSVggbmFtZSBmb3IgUEZfTE9DQUwuICAqLworI2RlZmluZQlQRl9GSUxFCQlQRl9MT0NBTCAvKiBBbm90aGVyIG5vbi1zdGFuZGFyZCBuYW1lIGZvciBQRl9MT0NBTC4gICovCisjZGVmaW5lCVBGX0lORVQJCTIJLyogSVAgcHJvdG9jb2wgZmFtaWx5LiAgKi8KKyNkZWZpbmUJUEZfQVgyNQkJMwkvKiBBbWF0ZXVyIFJhZGlvIEFYLjI1LiAgKi8KKyNkZWZpbmUJUEZfSVBYCQk0CS8qIE5vdmVsbCBJbnRlcm5ldCBQcm90b2NvbC4gICovCisjZGVmaW5lCVBGX0FQUExFVEFMSwk1CS8qIEFwcGxldGFsayBERFAuICAqLworI2RlZmluZQlQRl9ORVRST00JNgkvKiBBbWF0ZXVyIHJhZGlvIE5ldFJPTS4gICovCisjZGVmaW5lCVBGX0JSSURHRQk3CS8qIE11bHRpcHJvdG9jb2wgYnJpZGdlLiAgKi8KKyNkZWZpbmUJUEZfQVRNUFZDCTgJLyogQVRNIFBWQ3MuICAqLworI2RlZmluZQlQRl9YMjUJCTkJLyogUmVzZXJ2ZWQgZm9yIFguMjUgcHJvamVjdC4gICovCisjZGVmaW5lCVBGX0lORVQ2CTEwCS8qIElQIHZlcnNpb24gNi4gICovCisjZGVmaW5lCVBGX1JPU0UJCTExCS8qIEFtYXRldXIgUmFkaW8gWC4yNSBQTFAuICAqLworI2RlZmluZQlQRl9ERUNuZXQJMTIJLyogUmVzZXJ2ZWQgZm9yIERFQ25ldCBwcm9qZWN0LiAgKi8KKyNkZWZpbmUJUEZfTkVUQkVVSQkxMwkvKiBSZXNlcnZlZCBmb3IgODAyLjJMTEMgcHJvamVjdC4gICovCisjZGVmaW5lCVBGX1NFQ1VSSVRZCTE0CS8qIFNlY3VyaXR5IGNhbGxiYWNrIHBzZXVkbyBBRi4gICovCisjZGVmaW5lCVBGX0tFWQkJMTUJLyogUEZfS0VZIGtleSBtYW5hZ2VtZW50IEFQSS4gICovCisjZGVmaW5lCVBGX05FVExJTksJMTYKKyNkZWZpbmUJUEZfUk9VVEUJUEZfTkVUTElOSyAvKiBBbGlhcyB0byBlbXVsYXRlIDQuNEJTRC4gICovCisjZGVmaW5lCVBGX1BBQ0tFVAkxNwkvKiBQYWNrZXQgZmFtaWx5LiAgKi8KKyNkZWZpbmUJUEZfQVNICQkxOAkvKiBBc2guICAqLworI2RlZmluZQlQRl9FQ09ORVQJMTkJLyogQWNvcm4gRWNvbmV0LiAgKi8KKyNkZWZpbmUJUEZfQVRNU1ZDCTIwCS8qIEFUTSBTVkNzLiAgKi8KKyNkZWZpbmUgUEZfUkRTCQkyMQkvKiBSRFMgc29ja2V0cy4gICovCisjZGVmaW5lCVBGX1NOQQkJMjIJLyogTGludXggU05BIFByb2plY3QgKi8KKyNkZWZpbmUJUEZfSVJEQQkJMjMJLyogSVJEQSBzb2NrZXRzLiAgKi8KKyNkZWZpbmUJUEZfUFBQT1gJMjQJLyogUFBQb1ggc29ja2V0cy4gICovCisjZGVmaW5lCVBGX1dBTlBJUEUJMjUJLyogV2FucGlwZSBBUEkgc29ja2V0cy4gICovCisjZGVmaW5lIFBGX0xMQwkJMjYJLyogTGludXggTExDLiAgKi8KKyNkZWZpbmUgUEZfQ0FOCQkyOQkvKiBDb250cm9sbGVyIEFyZWEgTmV0d29yay4gICovCisjZGVmaW5lIFBGX1RJUEMJCTMwCS8qIFRJUEMgc29ja2V0cy4gICovCisjZGVmaW5lCVBGX0JMVUVUT09USAkzMQkvKiBCbHVldG9vdGggc29ja2V0cy4gICovCisjZGVmaW5lCVBGX0lVQ1YJCTMyCS8qIElVQ1Ygc29ja2V0cy4gICovCisjZGVmaW5lIFBGX1JYUlBDCTMzCS8qIFJ4UlBDIHNvY2tldHMuICAqLworI2RlZmluZSBQRl9JU0ROCQkzNAkvKiBtSVNETiBzb2NrZXRzLiAgKi8KKyNkZWZpbmUgUEZfUEhPTkVUCTM1CS8qIFBob25ldCBzb2NrZXRzLiAgKi8KKyNkZWZpbmUgUEZfSUVFRTgwMjE1NAkzNgkvKiBJRUVFIDgwMi4xNS40IHNvY2tldHMuICAqLworI2RlZmluZSBQRl9DQUlGCQkzNwkvKiBDQUlGIHNvY2tldHMuICAqLworI2RlZmluZSBQRl9BTEcJCTM4CS8qIEFsZ29yaXRobSBzb2NrZXRzLiAgKi8KKyNkZWZpbmUgUEZfTkZDCQkzOQkvKiBORkMgc29ja2V0cy4gICovCisjZGVmaW5lCVBGX01BWAkJNDAJLyogRm9yIG5vdy4uICAqLworCisvKiBBZGRyZXNzIGZhbWlsaWVzLiAgKi8KKyNkZWZpbmUJQUZfVU5TUEVDCVBGX1VOU1BFQworI2RlZmluZQlBRl9MT0NBTAlQRl9MT0NBTAorI2RlZmluZQlBRl9VTklYCQlQRl9VTklYCisjZGVmaW5lCUFGX0ZJTEUJCVBGX0ZJTEUKKyNkZWZpbmUJQUZfSU5FVAkJUEZfSU5FVAorI2RlZmluZQlBRl9BWDI1CQlQRl9BWDI1CisjZGVmaW5lCUFGX0lQWAkJUEZfSVBYCisjZGVmaW5lCUFGX0FQUExFVEFMSwlQRl9BUFBMRVRBTEsKKyNkZWZpbmUJQUZfTkVUUk9NCVBGX05FVFJPTQorI2RlZmluZQlBRl9CUklER0UJUEZfQlJJREdFCisjZGVmaW5lCUFGX0FUTVBWQwlQRl9BVE1QVkMKKyNkZWZpbmUJQUZfWDI1CQlQRl9YMjUKKyNkZWZpbmUJQUZfSU5FVDYJUEZfSU5FVDYKKyNkZWZpbmUJQUZfUk9TRQkJUEZfUk9TRQorI2RlZmluZQlBRl9ERUNuZXQJUEZfREVDbmV0CisjZGVmaW5lCUFGX05FVEJFVUkJUEZfTkVUQkVVSQorI2RlZmluZQlBRl9TRUNVUklUWQlQRl9TRUNVUklUWQorI2RlZmluZQlBRl9LRVkJCVBGX0tFWQorI2RlZmluZQlBRl9ORVRMSU5LCVBGX05FVExJTksKKyNkZWZpbmUJQUZfUk9VVEUJUEZfUk9VVEUKKyNkZWZpbmUJQUZfUEFDS0VUCVBGX1BBQ0tFVAorI2RlZmluZQlBRl9BU0gJCVBGX0FTSAorI2RlZmluZQlBRl9FQ09ORVQJUEZfRUNPTkVUCisjZGVmaW5lCUFGX0FUTVNWQwlQRl9BVE1TVkMKKyNkZWZpbmUgQUZfUkRTCQlQRl9SRFMKKyNkZWZpbmUJQUZfU05BCQlQRl9TTkEKKyNkZWZpbmUJQUZfSVJEQQkJUEZfSVJEQQorI2RlZmluZQlBRl9QUFBPWAlQRl9QUFBPWAorI2RlZmluZQlBRl9XQU5QSVBFCVBGX1dBTlBJUEUKKyNkZWZpbmUgQUZfTExDCQlQRl9MTEMKKyNkZWZpbmUgQUZfQ0FOCQlQRl9DQU4KKyNkZWZpbmUgQUZfVElQQwkJUEZfVElQQworI2RlZmluZQlBRl9CTFVFVE9PVEgJUEZfQkxVRVRPT1RICisjZGVmaW5lCUFGX0lVQ1YJCVBGX0lVQ1YKKyNkZWZpbmUgQUZfUlhSUEMJUEZfUlhSUEMKKyNkZWZpbmUgQUZfSVNETgkJUEZfSVNETgorI2RlZmluZSBBRl9QSE9ORVQJUEZfUEhPTkVUCisjZGVmaW5lIEFGX0lFRUU4MDIxNTQJUEZfSUVFRTgwMjE1NAorI2RlZmluZSBBRl9DQUlGCQlQRl9DQUlGCisjZGVmaW5lIEFGX0FMRwkJUEZfQUxHCisjZGVmaW5lIEFGX05GQwkJUEZfTkZDCisjZGVmaW5lCUFGX01BWAkJUEZfTUFYCisKKy8qIFNvY2tldCBsZXZlbCB2YWx1ZXMuICBPdGhlcnMgYXJlIGRlZmluZWQgaW4gdGhlIGFwcHJvcHJpYXRlIGhlYWRlcnMuCisKKyAgIFhYWCBUaGVzZSBkZWZpbml0aW9ucyBhbHNvIHNob3VsZCBnbyBpbnRvIHRoZSBhcHByb3ByaWF0ZSBoZWFkZXJzIGFzCisgICBmYXIgYXMgdGhleSBhcmUgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgU09MX1JBVwkJMjU1CisjZGVmaW5lIFNPTF9ERUNORVQgICAgICAyNjEKKyNkZWZpbmUgU09MX1gyNSAgICAgICAgIDI2MgorI2RlZmluZSBTT0xfUEFDS0VUCTI2MworI2RlZmluZSBTT0xfQVRNCQkyNjQJLyogQVRNIGxheWVyIChjZWxsIGxldmVsKS4gICovCisjZGVmaW5lIFNPTF9BQUwJCTI2NQkvKiBBVE0gQWRhcHRpb24gTGF5ZXIgKHBhY2tldCBsZXZlbCkuICAqLworI2RlZmluZSBTT0xfSVJEQQkyNjYKKworLyogTWF4aW11bSBxdWV1ZSBsZW5ndGggc3BlY2lmaWFibGUgYnkgbGlzdGVuLiAgKi8KKyNkZWZpbmUgU09NQVhDT05OCTEyOAorCisvKiBHZXQgdGhlIGRlZmluaXRpb24gb2YgdGhlIG1hY3JvIHRvIGRlZmluZSB0aGUgY29tbW9uIHNvY2thZGRyIG1lbWJlcnMuICAqLworI2luY2x1ZGUgPGJpdHMvc29ja2FkZHIuaD4KKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgYSBnZW5lcmljIHNvY2tldCBhZGRyZXNzLiAgKi8KK3N0cnVjdCBzb2NrYWRkcgorICB7CisgICAgX19TT0NLQUREUl9DT01NT04gKHNhXyk7CS8qIENvbW1vbiBkYXRhOiBhZGRyZXNzIGZhbWlseSBhbmQgbGVuZ3RoLiAgKi8KKyAgICBjaGFyIHNhX2RhdGFbMTRdOwkJLyogQWRkcmVzcyBkYXRhLiAgKi8KKyAgfTsKKworCisvKiBTdHJ1Y3R1cmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYW55IHNvY2tldCBhZGRyZXNzICh3aXRoIHRoZSBoaXN0b3JpY2FsCisgICBleGNlcHRpb24gb2YgQUZfVU5JWCkuICBXZSByZXNlcnZlIDEyOCBieXRlcy4gICovCisjZGVmaW5lIF9fc3NfYWxpZ250eXBlCXVuc2lnbmVkIGxvbmcgaW50CisjZGVmaW5lIF9TU19TSVpFCTEyOAorI2RlZmluZSBfU1NfUEFEU0laRQkoX1NTX1NJWkUgLSAoMiAqIHNpemVvZiAoX19zc19hbGlnbnR5cGUpKSkKKworc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UKKyAgeworICAgIF9fU09DS0FERFJfQ09NTU9OIChzc18pOwkvKiBBZGRyZXNzIGZhbWlseSwgZXRjLiAgKi8KKyAgICBfX3NzX2FsaWdudHlwZSBfX3NzX2FsaWduOwkvKiBGb3JjZSBkZXNpcmVkIGFsaWdubWVudC4gICovCisgICAgY2hhciBfX3NzX3BhZGRpbmdbX1NTX1BBRFNJWkVdOworICB9OworCisKKy8qIEJpdHMgaW4gdGhlIEZMQUdTIGFyZ3VtZW50IHRvIGBzZW5kJywgYHJlY3YnLCBldCBhbC4gICovCitlbnVtCisgIHsKKyAgICBNU0dfT09CCQk9IDB4MDEsCS8qIFByb2Nlc3Mgb3V0LW9mLWJhbmQgZGF0YS4gICovCisjZGVmaW5lIE1TR19PT0IJCU1TR19PT0IKKyAgICBNU0dfUEVFSwkJPSAweDAyLAkvKiBQZWVrIGF0IGluY29taW5nIG1lc3NhZ2VzLiAgKi8KKyNkZWZpbmUgTVNHX1BFRUsJTVNHX1BFRUsKKyAgICBNU0dfRE9OVFJPVVRFCT0gMHgwNCwJLyogRG9uJ3QgdXNlIGxvY2FsIHJvdXRpbmcuICAqLworI2RlZmluZSBNU0dfRE9OVFJPVVRFCU1TR19ET05UUk9VVEUKKyNpZmRlZiBfX1VTRV9HTlUKKyAgICAvKiBERUNuZXQgdXNlcyBhIGRpZmZlcmVudCBuYW1lLiAgKi8KKyAgICBNU0dfVFJZSEFSRAkJPSBNU0dfRE9OVFJPVVRFLAorIyBkZWZpbmUgTVNHX1RSWUhBUkQJTVNHX0RPTlRST1VURQorI2VuZGlmCisgICAgTVNHX0NUUlVOQwkJPSAweDA4LAkvKiBDb250cm9sIGRhdGEgbG9zdCBiZWZvcmUgZGVsaXZlcnkuICAqLworI2RlZmluZSBNU0dfQ1RSVU5DCU1TR19DVFJVTkMKKyAgICBNU0dfUFJPWFkJCT0gMHgxMCwJLyogU3VwcGx5IG9yIGFzayBzZWNvbmQgYWRkcmVzcy4gICovCisjZGVmaW5lIE1TR19QUk9YWQlNU0dfUFJPWFkKKyAgICBNU0dfVFJVTkMJCT0gMHgyMCwKKyNkZWZpbmUJTVNHX1RSVU5DCU1TR19UUlVOQworICAgIE1TR19ET05UV0FJVAk9IDB4NDAsIC8qIE5vbmJsb2NraW5nIElPLiAgKi8KKyNkZWZpbmUJTVNHX0RPTlRXQUlUCU1TR19ET05UV0FJVAorICAgIE1TR19FT1IJCT0gMHg4MCwgLyogRW5kIG9mIHJlY29yZC4gICovCisjZGVmaW5lCU1TR19FT1IJCU1TR19FT1IKKyAgICBNU0dfV0FJVEFMTAkJPSAweDEwMCwgLyogV2FpdCBmb3IgYSBmdWxsIHJlcXVlc3QuICAqLworI2RlZmluZQlNU0dfV0FJVEFMTAlNU0dfV0FJVEFMTAorICAgIE1TR19GSU4JCT0gMHgyMDAsCisjZGVmaW5lCU1TR19GSU4JCU1TR19GSU4KKyAgICBNU0dfU1lOCQk9IDB4NDAwLAorI2RlZmluZQlNU0dfU1lOCQlNU0dfU1lOCisgICAgTVNHX0NPTkZJUk0JCT0gMHg4MDAsIC8qIENvbmZpcm0gcGF0aCB2YWxpZGl0eS4gICovCisjZGVmaW5lCU1TR19DT05GSVJNCU1TR19DT05GSVJNCisgICAgTVNHX1JTVAkJPSAweDEwMDAsCisjZGVmaW5lCU1TR19SU1QJCU1TR19SU1QKKyAgICBNU0dfRVJSUVVFVUUJPSAweDIwMDAsIC8qIEZldGNoIG1lc3NhZ2UgZnJvbSBlcnJvciBxdWV1ZS4gICovCisjZGVmaW5lCU1TR19FUlJRVUVVRQlNU0dfRVJSUVVFVUUKKyAgICBNU0dfTk9TSUdOQUwJPSAweDQwMDAsIC8qIERvIG5vdCBnZW5lcmF0ZSBTSUdQSVBFLiAgKi8KKyNkZWZpbmUJTVNHX05PU0lHTkFMCU1TR19OT1NJR05BTAorICAgIE1TR19NT1JFCQk9IDB4ODAwMCwgIC8qIFNlbmRlciB3aWxsIHNlbmQgbW9yZS4gICovCisjZGVmaW5lCU1TR19NT1JFCU1TR19NT1JFCisgICAgTVNHX1dBSVRGT1JPTkUJPSAweDEwMDAwLCAvKiBXYWl0IGZvciBhdCBsZWFzdCBvbmUgcGFja2V0IHRvIHJldHVybi4qLworI2RlZmluZSBNU0dfV0FJVEZPUk9ORQlNU0dfV0FJVEZPUk9ORQorCisgICAgTVNHX0NNU0dfQ0xPRVhFQwk9IDB4NDAwMDAwMDAJLyogU2V0IGNsb3NlX29uX2V4aXQgZm9yIGZpbGUKKwkJCQkJICAgZGVzY3JpcHRvciByZWNlaXZlZCB0aHJvdWdoCisJCQkJCSAgIFNDTV9SSUdIVFMuICAqLworI2RlZmluZSBNU0dfQ01TR19DTE9FWEVDIE1TR19DTVNHX0NMT0VYRUMKKyAgfTsKKworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBtZXNzYWdlcyBzZW50IGJ5CisgICBgc2VuZG1zZycgYW5kIHJlY2VpdmVkIGJ5IGByZWN2bXNnJy4gICovCitzdHJ1Y3QgbXNnaGRyCisgIHsKKyAgICB2b2lkICptc2dfbmFtZTsJCS8qIEFkZHJlc3MgdG8gc2VuZCB0by9yZWNlaXZlIGZyb20uICAqLworICAgIHNvY2tsZW5fdCBtc2dfbmFtZWxlbjsJLyogTGVuZ3RoIG9mIGFkZHJlc3MgZGF0YS4gICovCisKKyAgICBzdHJ1Y3QgaW92ZWMgKm1zZ19pb3Y7CS8qIFZlY3RvciBvZiBkYXRhIHRvIHNlbmQvcmVjZWl2ZSBpbnRvLiAgKi8KKyAgICBzaXplX3QgbXNnX2lvdmxlbjsJCS8qIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLiAgKi8KKworICAgIHZvaWQgKm1zZ19jb250cm9sOwkJLyogQW5jaWxsYXJ5IGRhdGEgKGVnIEJTRCBmaWxlZGVzYyBwYXNzaW5nKS4gKi8KKyAgICBzaXplX3QgbXNnX2NvbnRyb2xsZW47CS8qIEFuY2lsbGFyeSBkYXRhIGJ1ZmZlciBsZW5ndGguCisJCQkJICAgISEgVGhlIHR5cGUgc2hvdWxkIGJlIHNvY2tsZW5fdCBidXQgdGhlCisJCQkJICAgZGVmaW5pdGlvbiBvZiB0aGUga2VybmVsIGlzIGluY29tcGF0aWJsZQorCQkJCSAgIHdpdGggdGhpcy4gICovCisKKyAgICBpbnQgbXNnX2ZsYWdzOwkJLyogRmxhZ3Mgb24gcmVjZWl2ZWQgbWVzc2FnZS4gICovCisgIH07CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIEZvciBgcmVjdm1tc2cnLiAgKi8KK3N0cnVjdCBtbXNnaGRyCisgIHsKKyAgICBzdHJ1Y3QgbXNnaGRyIG1zZ19oZHI7CS8qIEFjdHVhbCBtZXNzYWdlIGhlYWRlci4gICovCisgICAgdW5zaWduZWQgaW50IG1zZ19sZW47CS8qIE51bWJlciBvZiByZWNlaXZlZCBieXRlcyBmb3IgdGhlIGVudHJ5LiAgKi8KKyAgfTsKKyNlbmRpZgorCisvKiBTdHJ1Y3R1cmUgdXNlZCBmb3Igc3RvcmFnZSBvZiBhbmNpbGxhcnkgZGF0YSBvYmplY3QgaW5mb3JtYXRpb24uICAqLworc3RydWN0IGNtc2doZHIKKyAgeworICAgIHNpemVfdCBjbXNnX2xlbjsJCS8qIExlbmd0aCBvZiBkYXRhIGluIGNtc2dfZGF0YSBwbHVzIGxlbmd0aAorCQkJCSAgIG9mIGNtc2doZHIgc3RydWN0dXJlLgorCQkJCSAgICEhIFRoZSB0eXBlIHNob3VsZCBiZSBzb2NrbGVuX3QgYnV0IHRoZQorCQkJCSAgIGRlZmluaXRpb24gb2YgdGhlIGtlcm5lbCBpcyBpbmNvbXBhdGlibGUKKwkJCQkgICB3aXRoIHRoaXMuICAqLworICAgIGludCBjbXNnX2xldmVsOwkJLyogT3JpZ2luYXRpbmcgcHJvdG9jb2wuICAqLworICAgIGludCBjbXNnX3R5cGU7CQkvKiBQcm90b2NvbCBzcGVjaWZpYyB0eXBlLiAgKi8KKyNpZiAoIWRlZmluZWQgX19TVFJJQ1RfQU5TSV9fICYmIF9fR05VQ19fID49IDIpIHx8IF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorICAgIF9fZXh0ZW5zaW9uX18gdW5zaWduZWQgY2hhciBfX2Ntc2dfZGF0YSBfX2ZsZXhhcnI7IC8qIEFuY2lsbGFyeSBkYXRhLiAgKi8KKyNlbmRpZgorICB9OworCisvKiBBbmNpbGxhcnkgZGF0YSBvYmplY3QgbWFuaXB1bGF0aW9uIG1hY3Jvcy4gICovCisjaWYgKCFkZWZpbmVkIF9fU1RSSUNUX0FOU0lfXyAmJiBfX0dOVUNfXyA+PSAyKSB8fCBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyMgZGVmaW5lIENNU0dfREFUQShjbXNnKSAoKGNtc2cpLT5fX2Ntc2dfZGF0YSkKKyNlbHNlCisjIGRlZmluZSBDTVNHX0RBVEEoY21zZykgKCh1bnNpZ25lZCBjaGFyICopICgoc3RydWN0IGNtc2doZHIgKikgKGNtc2cpICsgMSkpCisjZW5kaWYKKyNkZWZpbmUgQ01TR19OWFRIRFIobWhkciwgY21zZykgX19jbXNnX254dGhkciAobWhkciwgY21zZykKKyNkZWZpbmUgQ01TR19GSVJTVEhEUihtaGRyKSBcCisgICgoc2l6ZV90KSAobWhkciktPm1zZ19jb250cm9sbGVuID49IHNpemVvZiAoc3RydWN0IGNtc2doZHIpCQkgICAgICBcCisgICA/IChzdHJ1Y3QgY21zZ2hkciAqKSAobWhkciktPm1zZ19jb250cm9sIDogKHN0cnVjdCBjbXNnaGRyICopIDApCisjZGVmaW5lIENNU0dfQUxJR04obGVuKSAoKChsZW4pICsgc2l6ZW9mIChzaXplX3QpIC0gMSkgXAorCQkJICYgKHNpemVfdCkgfihzaXplb2YgKHNpemVfdCkgLSAxKSkKKyNkZWZpbmUgQ01TR19TUEFDRShsZW4pIChDTVNHX0FMSUdOIChsZW4pIFwKKwkJCSArIENNU0dfQUxJR04gKHNpemVvZiAoc3RydWN0IGNtc2doZHIpKSkKKyNkZWZpbmUgQ01TR19MRU4obGVuKSAgIChDTVNHX0FMSUdOIChzaXplb2YgKHN0cnVjdCBjbXNnaGRyKSkgKyAobGVuKSkKKworZXh0ZXJuIHN0cnVjdCBjbXNnaGRyICpfX2Ntc2dfbnh0aGRyIChzdHJ1Y3QgbXNnaGRyICpfX21oZHIsCisJCQkJICAgICAgc3RydWN0IGNtc2doZHIgKl9fY21zZykgX19USFJPVzsKKyNpZmRlZiBfX1VTRV9FWFRFUk5fSU5MSU5FUworIyBpZm5kZWYgX0VYVEVSTl9JTkxJTkUKKyMgIGRlZmluZSBfRVhURVJOX0lOTElORSBfX2V4dGVybl9pbmxpbmUKKyMgZW5kaWYKK19FWFRFUk5fSU5MSU5FIHN0cnVjdCBjbXNnaGRyICoKK19fTlRIIChfX2Ntc2dfbnh0aGRyIChzdHJ1Y3QgbXNnaGRyICpfX21oZHIsIHN0cnVjdCBjbXNnaGRyICpfX2Ntc2cpKQoreworICBpZiAoKHNpemVfdCkgX19jbXNnLT5jbXNnX2xlbiA8IHNpemVvZiAoc3RydWN0IGNtc2doZHIpKQorICAgIC8qIFRoZSBrZXJuZWwgaGVhZGVyIGRvZXMgdGhpcyBzbyB0aGVyZSBtYXkgYmUgYSByZWFzb24uICAqLworICAgIHJldHVybiAoc3RydWN0IGNtc2doZHIgKikgMDsKKworICBfX2Ntc2cgPSAoc3RydWN0IGNtc2doZHIgKikgKCh1bnNpZ25lZCBjaGFyICopIF9fY21zZworCQkJICAgICAgICsgQ01TR19BTElHTiAoX19jbXNnLT5jbXNnX2xlbikpOworICBpZiAoKHVuc2lnbmVkIGNoYXIgKikgKF9fY21zZyArIDEpID4gKCh1bnNpZ25lZCBjaGFyICopIF9fbWhkci0+bXNnX2NvbnRyb2wKKwkJCQkJKyBfX21oZHItPm1zZ19jb250cm9sbGVuKQorICAgICAgfHwgKCh1bnNpZ25lZCBjaGFyICopIF9fY21zZyArIENNU0dfQUxJR04gKF9fY21zZy0+Y21zZ19sZW4pCisJICA+ICgodW5zaWduZWQgY2hhciAqKSBfX21oZHItPm1zZ19jb250cm9sICsgX19taGRyLT5tc2dfY29udHJvbGxlbikpKQorICAgIC8qIE5vIG1vcmUgZW50cmllcy4gICovCisgICAgcmV0dXJuIChzdHJ1Y3QgY21zZ2hkciAqKSAwOworICByZXR1cm4gX19jbXNnOworfQorI2VuZGlmCS8qIFVzZSBgZXh0ZXJuIGlubGluZScuICAqLworCisvKiBTb2NrZXQgbGV2ZWwgbWVzc2FnZSB0eXBlcy4gIFRoaXMgbXVzdCBtYXRjaCB0aGUgZGVmaW5pdGlvbnMgaW4KKyAgIDxsaW51eC9zb2NrZXQuaD4uICAqLworZW51bQorICB7CisgICAgU0NNX1JJR0hUUyA9IDB4MDEJCS8qIFRyYW5zZmVyIGZpbGUgZGVzY3JpcHRvcnMuICAqLworI2RlZmluZSBTQ01fUklHSFRTIFNDTV9SSUdIVFMKKyNpZmRlZiBfX1VTRV9HTlUKKyAgICAsIFNDTV9DUkVERU5USUFMUyA9IDB4MDIJLyogQ3JlZGVudGlhbHMgcGFzc2luZy4gICovCisjIGRlZmluZSBTQ01fQ1JFREVOVElBTFMgU0NNX0NSRURFTlRJQUxTCisjZW5kaWYKKyAgfTsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVXNlciB2aXNpYmxlIHN0cnVjdHVyZSBmb3IgU0NNX0NSRURFTlRJQUxTIG1lc3NhZ2UgKi8KK3N0cnVjdCB1Y3JlZAoreworICBwaWRfdCBwaWQ7CQkJLyogUElEIG9mIHNlbmRpbmcgcHJvY2Vzcy4gICovCisgIHVpZF90IHVpZDsJCQkvKiBVSUQgb2Ygc2VuZGluZyBwcm9jZXNzLiAgKi8KKyAgZ2lkX3QgZ2lkOwkJCS8qIEdJRCBvZiBzZW5kaW5nIHByb2Nlc3MuICAqLworfTsKKyNlbmRpZgorCisvKiBVZ2x5IHdvcmthcm91bmQgZm9yIHVuY2xlYW4ga2VybmVsIGhlYWRlcnMuICAqLworI2lmICFkZWZpbmVkIF9fVVNFX01JU0MgJiYgIWRlZmluZWQgX19VU0VfR05VCisjIGlmbmRlZiBGSU9HRVRPV04KKyMgIGRlZmluZSBfX1NZU19TT0NLRVRfSF91bmRlZl9GSU9HRVRPV04KKyMgZW5kaWYKKyMgaWZuZGVmIEZJT1NFVE9XTgorIyAgZGVmaW5lIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX0ZJT1NFVE9XTgorIyBlbmRpZgorIyBpZm5kZWYgU0lPQ0FUTUFSSworIyAgZGVmaW5lIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NBVE1BUksKKyMgZW5kaWYKKyMgaWZuZGVmIFNJT0NHUEdSUAorIyAgZGVmaW5lIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NHUEdSUAorIyBlbmRpZgorIyBpZm5kZWYgU0lPQ0dTVEFNUAorIyAgZGVmaW5lIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NHU1RBTVAKKyMgZW5kaWYKKyMgaWZuZGVmIFNJT0NHU1RBTVBOUworIyAgZGVmaW5lIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NHU1RBTVBOUworIyBlbmRpZgorIyBpZm5kZWYgU0lPQ1NQR1JQCisjICBkZWZpbmUgX19TWVNfU09DS0VUX0hfdW5kZWZfU0lPQ1NQR1JQCisjIGVuZGlmCisjZW5kaWYKKworLyogR2V0IHNvY2tldCBtYW5pcHVsYXRpb24gcmVsYXRlZCBpbmZvcm1hdGlvbnMgZnJvbSBrZXJuZWwgaGVhZGVycy4gICovCisjaW5jbHVkZSA8YXNtL3NvY2tldC5oPgorCisjaWYgIWRlZmluZWQgX19VU0VfTUlTQyAmJiAhZGVmaW5lZCBfX1VTRV9HTlUKKyMgaWZkZWYgX19TWVNfU09DS0VUX0hfdW5kZWZfRklPR0VUT1dOCisjICB1bmRlZiBfX1NZU19TT0NLRVRfSF91bmRlZl9GSU9HRVRPV04KKyMgIHVuZGVmIEZJT0dFVE9XTgorIyBlbmRpZgorIyBpZmRlZiBfX1NZU19TT0NLRVRfSF91bmRlZl9GSU9TRVRPV04KKyMgIHVuZGVmIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX0ZJT1NFVE9XTgorIyAgdW5kZWYgRklPU0VUT1dOCisjIGVuZGlmCisjIGlmZGVmIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NBVE1BUksKKyMgIHVuZGVmIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NBVE1BUksKKyMgIHVuZGVmIFNJT0NBVE1BUksKKyMgZW5kaWYKKyMgaWZkZWYgX19TWVNfU09DS0VUX0hfdW5kZWZfU0lPQ0dQR1JQCisjICB1bmRlZiBfX1NZU19TT0NLRVRfSF91bmRlZl9TSU9DR1BHUlAKKyMgIHVuZGVmIFNJT0NHUEdSUAorIyBlbmRpZgorIyBpZmRlZiBfX1NZU19TT0NLRVRfSF91bmRlZl9TSU9DR1NUQU1QCisjICB1bmRlZiBfX1NZU19TT0NLRVRfSF91bmRlZl9TSU9DR1NUQU1QCisjICB1bmRlZiBTSU9DR1NUQU1QCisjIGVuZGlmCisjIGlmZGVmIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NHU1RBTVBOUworIyAgdW5kZWYgX19TWVNfU09DS0VUX0hfdW5kZWZfU0lPQ0dTVEFNUE5TCisjICB1bmRlZiBTSU9DR1NUQU1QTlMKKyMgZW5kaWYKKyMgaWZkZWYgX19TWVNfU09DS0VUX0hfdW5kZWZfU0lPQ1NQR1JQCisjICB1bmRlZiBfX1NZU19TT0NLRVRfSF91bmRlZl9TSU9DU1BHUlAKKyMgIHVuZGVmIFNJT0NTUEdSUAorIyBlbmRpZgorI2VuZGlmCisKKy8qIFN0cnVjdHVyZSB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIFNPX0xJTkdFUiBvcHRpb24uICAqLworc3RydWN0IGxpbmdlcgorICB7CisgICAgaW50IGxfb25vZmY7CQkvKiBOb256ZXJvIHRvIGxpbmdlciBvbiBjbG9zZS4gICovCisgICAgaW50IGxfbGluZ2VyOwkJLyogVGltZSB0byBsaW5nZXIuICAqLworICB9OworCisKK19fQkVHSU5fREVDTFMKKworLyogUmVjZWl2ZSB1cCB0byBWTEVOIG1lc3NhZ2VzIGFzIGRlc2NyaWJlZCBieSBWTUVTU0FHRVMgZnJvbSBzb2NrZXQgRkQuCisgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcmVjdm1tc2cgKGludCBfX2ZkLCBzdHJ1Y3QgbW1zZ2hkciAqX192bWVzc2FnZXMsCisJCSAgICAgdW5zaWduZWQgaW50IF9fdmxlbiwgaW50IF9fZmxhZ3MsCisJCSAgICAgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fdG1vKTsKKworLyogU2VuZCBhIFZMRU4gbWVzc2FnZXMgYXMgZGVzY3JpYmVkIGJ5IFZNRVNTQUdFUyB0byBzb2NrZXQgRkQuCisgICBSZXR1cm4gdGhlIG51bWJlciBvZiBkYXRhZ3JhbXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4gb3IgLTEgZm9yIGVycm9ycy4KK1RoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBzZW5kbW1zZyAoaW50IF9fZmQsIHN0cnVjdCBtbXNnaGRyICpfX3ZtZXNzYWdlcywKKwkJICAgICB1bnNpZ25lZCBpbnQgX192bGVuLCBpbnQgX19mbGFncyk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBiaXRzL3NvY2tldC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc29ja2V0Mi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NvY2tldDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzRjYjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3NvY2tldDIuaApAQCAtMCwwICsxLDc4IEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHNvY2tldCBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TT0NLRVRfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zb2NrZXQyLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zb2NrZXQuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworZXh0ZXJuIHNzaXplX3QgX19yZWN2X2NoayAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uLCBzaXplX3QgX19idWZsZW4sCisJCQkgICBpbnQgX19mbGFncyk7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChfX3JlY3ZfYWxpYXMsIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX24sCisJCQkJCSAgaW50IF9fZmxhZ3MpLCByZWN2KTsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1QgKF9fcmVjdl9jaGtfd2FybiwKKwkJCSAgIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX24sIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICBpbnQgX19mbGFncyksIF9fcmVjdl9jaGspCisgICAgIF9fd2FybmF0dHIgKCJyZWN2IGNhbGxlZCB3aXRoIGJpZ2dlciBsZW5ndGggdGhhbiBzaXplIG9mIGRlc3RpbmF0aW9uICIKKwkJICJidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBzc2l6ZV90CityZWN2IChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX24sIGludCBfX2ZsYWdzKQoreworICBpZiAoX19ib3MwIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSkKKwlyZXR1cm4gX19yZWN2X2NoayAoX19mZCwgX19idWYsIF9fbiwgX19ib3MwIChfX2J1ZiksIF9fZmxhZ3MpOworCisgICAgICBpZiAoX19uID4gX19ib3MwIChfX2J1ZikpCisJcmV0dXJuIF9fcmVjdl9jaGtfd2FybiAoX19mZCwgX19idWYsIF9fbiwgX19ib3MwIChfX2J1ZiksIF9fZmxhZ3MpOworICAgIH0KKyAgcmV0dXJuIF9fcmVjdl9hbGlhcyAoX19mZCwgX19idWYsIF9fbiwgX19mbGFncyk7Cit9CisKK2V4dGVybiBzc2l6ZV90IF9fcmVjdmZyb21fY2hrIChpbnQgX19mZCwgdm9pZCAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbiwKKwkJCSAgICAgICBzaXplX3QgX19idWZsZW4sIGludCBfX2ZsYWdzLAorCQkJICAgICAgIF9fU09DS0FERFJfQVJHIF9fYWRkciwKKwkJCSAgICAgICBzb2NrbGVuX3QgKl9fcmVzdHJpY3QgX19hZGRyX2xlbik7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChfX3JlY3Zmcm9tX2FsaWFzLAorCQkJICAgKGludCBfX2ZkLCB2b2lkICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19uLAorCQkJICAgIGludCBfX2ZsYWdzLCBfX1NPQ0tBRERSX0FSRyBfX2FkZHIsCisJCQkgICAgc29ja2xlbl90ICpfX3Jlc3RyaWN0IF9fYWRkcl9sZW4pLCByZWN2ZnJvbSk7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChfX3JlY3Zmcm9tX2Noa193YXJuLAorCQkJICAgKGludCBfX2ZkLCB2b2lkICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19uLAorCQkJICAgIHNpemVfdCBfX2J1ZmxlbiwgaW50IF9fZmxhZ3MsCisJCQkgICAgX19TT0NLQUREUl9BUkcgX19hZGRyLAorCQkJICAgIHNvY2tsZW5fdCAqX19yZXN0cmljdCBfX2FkZHJfbGVuKSwgX19yZWN2ZnJvbV9jaGspCisgICAgIF9fd2FybmF0dHIgKCJyZWN2ZnJvbSBjYWxsZWQgd2l0aCBiaWdnZXIgbGVuZ3RoIHRoYW4gc2l6ZSBvZiAiCisJCSAiZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgc3NpemVfdAorcmVjdmZyb20gKGludCBfX2ZkLCB2b2lkICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19uLCBpbnQgX19mbGFncywKKwkgIF9fU09DS0FERFJfQVJHIF9fYWRkciwgc29ja2xlbl90ICpfX3Jlc3RyaWN0IF9fYWRkcl9sZW4pCit7CisgIGlmIChfX2JvczAgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pKQorCXJldHVybiBfX3JlY3Zmcm9tX2NoayAoX19mZCwgX19idWYsIF9fbiwgX19ib3MwIChfX2J1ZiksIF9fZmxhZ3MsCisJCQkgICAgICAgX19hZGRyLCBfX2FkZHJfbGVuKTsKKyAgICAgIGlmIChfX24gPiBfX2JvczAgKF9fYnVmKSkKKwlyZXR1cm4gX19yZWN2ZnJvbV9jaGtfd2FybiAoX19mZCwgX19idWYsIF9fbiwgX19ib3MwIChfX2J1ZiksIF9fZmxhZ3MsCisJCQkJICAgIF9fYWRkciwgX19hZGRyX2xlbik7CisgICAgfQorICByZXR1cm4gX19yZWN2ZnJvbV9hbGlhcyAoX19mZCwgX19idWYsIF9fbiwgX19mbGFncywgX19hZGRyLCBfX2FkZHJfbGVuKTsKK30KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGFiLmRlZiBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGFiLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDU0Nzc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0YWIuZGVmCkBAIC0wLDAgKzEsMjM0IEBACisvKiBUYWJsZSBvZiBEQlggc3ltYm9sIGNvZGVzIGZvciB0aGUgR05VIHN5c3RlbS4KKyAgIENvcHlyaWdodCAoQykgMTk4OCwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogVGhpcyBjb250YWlucyBjb250cmlidXRpb24gZnJvbSBDeWdudXMgU3VwcG9ydC4gICovCisMCisvKiBHbG9iYWwgdmFyaWFibGUuICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LgorICAgVG8gZmluZCB0aGUgYWRkcmVzcywgbG9vayBpbiB0aGUgY29ycmVzcG9uZGluZyBleHRlcm5hbCBzeW1ib2wuICAqLworX19kZWZpbmVfc3RhYiAoTl9HU1lNLCAweDIwLCAiR1NZTSIpCisKKy8qIEZ1bmN0aW9uIG5hbWUgZm9yIEJTRCBGb3J0cmFuLiAgT25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4KKyAgIFRvIGZpbmQgdGhlIGFkZHJlc3MsIGxvb2sgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZXh0ZXJuYWwgc3ltYm9sLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRk5BTUUsIDB4MjIsICJGTkFNRSIpCisKKy8qIEZ1bmN0aW9uIG5hbWUgb3IgdGV4dC1zZWdtZW50IHZhcmlhYmxlIGZvciBDLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuCisgICBEZXNjIGlzIHN1cHBvc2VkbHkgc3RhcnRpbmcgbGluZSBudW1iZXIsIGJ1dCBHQ0MgZG9lc24ndCBzZXQgaXQKKyAgIGFuZCBEQlggc2VlbXMgbm90IHRvIG1pc3MgaXQuICAqLworX19kZWZpbmVfc3RhYiAoTl9GVU4sIDB4MjQsICJGVU4iKQorCisvKiBEYXRhLXNlZ21lbnQgdmFyaWFibGUgd2l0aCBpbnRlcm5hbCBsaW5rYWdlLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuCisgICAiU3RhdGljIFN5bSIuICAqLworX19kZWZpbmVfc3RhYiAoTl9TVFNZTSwgMHgyNiwgIlNUU1lNIikKKworLyogQlNTLXNlZ21lbnQgdmFyaWFibGUgd2l0aCBpbnRlcm5hbCBsaW5rYWdlLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuICAqLworX19kZWZpbmVfc3RhYiAoTl9MQ1NZTSwgMHgyOCwgIkxDU1lNIikKKworLyogTmFtZSBvZiBtYWluIHJvdXRpbmUuICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LgorICAgVGhpcyBpcyBub3QgdXNlZCBpbiBDLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fTUFJTiwgMHgyYSwgIk1BSU4iKQorCisvKiBHbG9iYWwgc3ltYm9sIGluIFBhc2NhbC4KKyAgIFN1cHBvc2VkbHkgdGhlIHZhbHVlIGlzIGl0cyBsaW5lIG51bWJlcjsgSSdtIHNrZXB0aWNhbC4gICovCitfX2RlZmluZV9zdGFiIChOX1BDLCAweDMwLCAiUEMiKQorCisvKiBOdW1iZXIgb2Ygc3ltYm9sczogIDAsIGZpbGVzLCxmdW5jcyxsaW5lcyBhY2NvcmRpbmcgdG8gVWx0cml4IFY0LjAuICovCitfX2RlZmluZV9zdGFiIChOX05TWU1TLCAweDMyLCAiTlNZTVMiKQorCisvKiAiTm8gRFNUIG1hcCBmb3Igc3ltOiBuYW1lLCAsMCx0eXBlLGlnbm9yZWQiICBhY2NvcmRpbmcgdG8gVWx0cml4IFY0LjAuICovCitfX2RlZmluZV9zdGFiIChOX05PTUFQLCAweDM0LCAiTk9NQVAiKQorCisvKiBOZXcgc3RhYiBmcm9tIFNvbGFyaXMuICBJIGRvbid0IGtub3cgd2hhdCBpdCBtZWFucywgYnV0IGl0CisgICBkb24ndCBzZWVtIHRvIGNvbnRhaW4gdXNlZnVsIGluZm9ybWF0aW9uLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fT0JKLCAweDM4LCAiT0JKIikKKworLyogTmV3IHN0YWIgZnJvbSBTb2xhcmlzLiAgSSBkb24ndCBrbm93IHdoYXQgaXQgbWVhbnMsIGJ1dCBpdAorICAgZG9uJ3Qgc2VlbSB0byBjb250YWluIHVzZWZ1bCBpbmZvcm1hdGlvbi4gIFBvc3NpYmx5IHJlbGF0ZWQgdG8gdGhlCisgICBvcHRpbWl6YXRpb24gZmxhZ3MgdXNlZCBpbiB0aGlzIG1vZHVsZS4gICovCitfX2RlZmluZV9zdGFiIChOX09QVCwgMHgzYywgIk9QVCIpCisKKy8qIFJlZ2lzdGVyIHZhcmlhYmxlLiAgVmFsdWUgaXMgbnVtYmVyIG9mIHJlZ2lzdGVyLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fUlNZTSwgMHg0MCwgIlJTWU0iKQorCisvKiBNb2R1bGEtMiBjb21waWxhdGlvbiB1bml0LiAgQ2FuIHNvbWVvbmUgc2F5IHdoYXQgaW5mbyBpdCBjb250YWlucz8gICovCitfX2RlZmluZV9zdGFiIChOX00yQywgMHg0MiwgIk0yQyIpCisKKy8qIExpbmUgbnVtYmVyIGluIHRleHQgc2VnbWVudC4gIERlc2MgaXMgdGhlIGxpbmUgbnVtYmVyOworICAgdmFsdWUgaXMgY29ycmVzcG9uZGluZyBhZGRyZXNzLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fU0xJTkUsIDB4NDQsICJTTElORSIpCisKKy8qIFNpbWlsYXIsIGZvciBkYXRhIHNlZ21lbnQuICAqLworX19kZWZpbmVfc3RhYiAoTl9EU0xJTkUsIDB4NDYsICJEU0xJTkUiKQorCisvKiBTaW1pbGFyLCBmb3IgYnNzIHNlZ21lbnQuICAqLworX19kZWZpbmVfc3RhYiAoTl9CU0xJTkUsIDB4NDgsICJCU0xJTkUiKQorCisvKiBTdW4ncyBzb3VyY2UtY29kZSBicm93c2VyIHN0YWJzLiAgPz8gRG9uJ3Qga25vdyB3aGF0IHRoZSBmaWVsZHMgYXJlLgorICAgU3VwcG9zZWRseSB0aGUgZmllbGQgaXMgInBhdGggdG8gYXNzb2NpYXRlZCAuY2IgZmlsZSIuICBUSElTIFZBTFVFCisgICBPVkVSTEFQUyBXSVRIIE5fQlNMSU5FISAgKi8KK19fZGVmaW5lX3N0YWIgKE5fQlJPV1MsIDB4NDgsICJCUk9XUyIpCisKKy8qIEdOVSBNb2R1bGEtMiBkZWZpbml0aW9uIG1vZHVsZSBkZXBlbmRlbmN5LiAgVmFsdWUgaXMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lCisgICBvZiB0aGUgZGVmaW5pdGlvbiBmaWxlLiAgT3RoZXIgaXMgbm9uLXplcm8gaWYgaXQgaXMgaW1wb3J0ZWQgd2l0aCB0aGUKKyAgIEdOVSBNMiBrZXl3b3JkICVJTklUSUFMSVpFLiAgUGVyaGFwcyBOX00yQyBjYW4gYmUgdXNlZCBpZiB0aGVyZQorICAgYXJlIGVub3VnaCBlbXB0eSBmaWVsZHM/ICovCitfX2RlZmluZV9zdGFiKE5fREVGRCwgMHg0YSwgIkRFRkQiKQorCisvKiBUSEUgRk9MTE9XSU5HIFRXTyBTVEFCIFZBTFVFUyBDT05GTElDVC4gIEhhcHBpbHksIG9uZSBpcyBmb3IgTW9kdWxhLTIKKyAgIGFuZCBvbmUgaXMgZm9yIEMrKy4gICBTdGlsbCwuLi4gKi8KKy8qIEdOVSBDKysgZXhjZXB0aW9uIHZhcmlhYmxlLiAgTmFtZSBpcyB2YXJpYWJsZSBuYW1lLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRUhERUNMLCAweDUwLCAiRUhERUNMIikKKy8qIE1vZHVsYTIgaW5mbyAiZm9yIGltYyI6ICBuYW1lLCwwLDAsMCAgYWNjb3JkaW5nIHRvIFVsdHJpeCBWNC4wLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fTU9EMiwgMHg1MCwgIk1PRDIiKQorCisvKiBHTlUgQysrIGBjYXRjaCcgY2xhdXNlLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuICBEZXNjIGlzIG5vbnplcm8gaWYKKyAgIHRoaXMgZW50cnkgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBDQVVHSFQgc3RhYiBzYXlpbmcgd2hhdCBleGNlcHRpb24KKyAgIHdhcyBjYXVnaHQuICBNdWx0aXBsZSBDQVVHSFQgc3RhYnMgbWVhbnMgdGhhdCBtdWx0aXBsZSBleGNlcHRpb25zCisgICBjYW4gYmUgY2F1Z2h0IGhlcmUuICBJZiBEZXNjIGlzIDAsIGl0IG1lYW5zIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQKKyAgIGhlcmUuICAqLworX19kZWZpbmVfc3RhYiAoTl9DQVRDSCwgMHg1NCwgIkNBVENIIikKKworLyogU3RydWN0dXJlIG9yIHVuaW9uIGVsZW1lbnQuICBWYWx1ZSBpcyBvZmZzZXQgaW4gdGhlIHN0cnVjdHVyZS4gICovCitfX2RlZmluZV9zdGFiIChOX1NTWU0sIDB4NjAsICJTU1lNIikKKworLyogTmFtZSBvZiBtYWluIHNvdXJjZSBmaWxlLgorICAgVmFsdWUgaXMgc3RhcnRpbmcgdGV4dCBhZGRyZXNzIG9mIHRoZSBjb21waWxhdGlvbi4gICovCitfX2RlZmluZV9zdGFiIChOX1NPLCAweDY0LCAiU08iKQorCisvKiBBdXRvbWF0aWMgdmFyaWFibGUgaW4gdGhlIHN0YWNrLiAgVmFsdWUgaXMgb2Zmc2V0IGZyb20gZnJhbWUgcG9pbnRlci4KKyAgIEFsc28gdXNlZCBmb3IgdHlwZSBkZXNjcmlwdGlvbnMuICAqLworX19kZWZpbmVfc3RhYiAoTl9MU1lNLCAweDgwLCAiTFNZTSIpCisKKy8qIEJlZ2lubmluZyBvZiBhbiBpbmNsdWRlIGZpbGUuICBPbmx5IFN1biB1c2VzIHRoaXMuCisgICBJbiBhbiBvYmplY3QgZmlsZSwgb25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4KKyAgIFRoZSBTdW4gbGlua2VyIHB1dHMgZGF0YSBpbnRvIHNvbWUgb2YgdGhlIG90aGVyIGZpZWxkcy4gICovCitfX2RlZmluZV9zdGFiIChOX0JJTkNMLCAweDgyLCAiQklOQ0wiKQorCisvKiBOYW1lIG9mIHN1Yi1zb3VyY2UgZmlsZSAoI2luY2x1ZGUgZmlsZSkuCisgICBWYWx1ZSBpcyBzdGFydGluZyB0ZXh0IGFkZHJlc3Mgb2YgdGhlIGNvbXBpbGF0aW9uLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fU09MLCAweDg0LCAiU09MIikKKworLyogUGFyYW1ldGVyIHZhcmlhYmxlLiAgVmFsdWUgaXMgb2Zmc2V0IGZyb20gYXJndW1lbnQgcG9pbnRlci4KKyAgIChPbiBtb3N0IG1hY2hpbmVzIHRoZSBhcmd1bWVudCBwb2ludGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBmcmFtZSBwb2ludGVyLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fUFNZTSwgMHhhMCwgIlBTWU0iKQorCisvKiBFbmQgb2YgYW4gaW5jbHVkZSBmaWxlLiAgTm8gbmFtZS4KKyAgIFRoaXMgYW5kIE5fQklOQ0wgYWN0IGFzIGJyYWNrZXRzIGFyb3VuZCB0aGUgZmlsZSdzIG91dHB1dC4KKyAgIEluIGFuIG9iamVjdCBmaWxlLCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBkYXRhIGluIHRoaXMgZW50cnkuCisgICBUaGUgU3VuIGxpbmtlciBwdXRzIGRhdGEgaW50byBzb21lIG9mIHRoZSBmaWVsZHMuICAqLworX19kZWZpbmVfc3RhYiAoTl9FSU5DTCwgMHhhMiwgIkVJTkNMIikKKworLyogQWx0ZXJuYXRlIGVudHJ5IHBvaW50LiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuICAqLworX19kZWZpbmVfc3RhYiAoTl9FTlRSWSwgMHhhNCwgIkVOVFJZIikKKworLyogQmVnaW5uaW5nIG9mIGxleGljYWwgYmxvY2suCisgICBUaGUgZGVzYyBpcyB0aGUgbmVzdGluZyBsZXZlbCBpbiBsZXhpY2FsIGJsb2Nrcy4KKyAgIFRoZSB2YWx1ZSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHRleHQgZm9yIHRoZSBibG9jay4KKyAgIFRoZSB2YXJpYWJsZXMgZGVjbGFyZWQgaW5zaWRlIHRoZSBibG9jayAqcHJlY2VkZSogdGhlIE5fTEJSQUMgc3ltYm9sLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fTEJSQUMsIDB4YzAsICJMQlJBQyIpCisKKy8qIFBsYWNlIGhvbGRlciBmb3IgZGVsZXRlZCBpbmNsdWRlIGZpbGUuICBSZXBsYWNlcyBhIE5fQklOQ0wgYW5kIGV2ZXJ5dGhpbmcKKyAgIHVwIHRvIHRoZSBjb3JyZXNwb25kaW5nIE5fRUlOQ0wuICBUaGUgU3VuIGxpbmtlciBnZW5lcmF0ZXMgdGhlc2Ugd2hlbgorICAgaXQgZmluZHMgbXVsdGlwbGUgaWRlbnRpY2FsIGNvcGllcyBvZiB0aGUgc3ltYm9scyBmcm9tIGFuIGluY2x1ZGUgZmlsZS4KKyAgIFRoaXMgYXBwZWFycyBvbmx5IGluIG91dHB1dCBmcm9tIHRoZSBTdW4gbGlua2VyLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRVhDTCwgMHhjMiwgIkVYQ0wiKQorCisvKiBNb2R1bGEtMiBzY29wZSBpbmZvcm1hdGlvbi4gIENhbiBzb21lb25lIHNheSB3aGF0IGluZm8gaXQgY29udGFpbnM/ICAqLworX19kZWZpbmVfc3RhYiAoTl9TQ09QRSwgMHhjNCwgIlNDT1BFIikKKworLyogRW5kIG9mIGEgbGV4aWNhbCBibG9jay4gIERlc2MgbWF0Y2hlcyB0aGUgTl9MQlJBQydzIGRlc2MuCisgICBUaGUgdmFsdWUgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgdGV4dCBmb3IgdGhlIGJsb2NrLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fUkJSQUMsIDB4ZTAsICJSQlJBQyIpCisKKy8qIEJlZ2luIG5hbWVkIGNvbW1vbiBibG9jay4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQuICAqLworX19kZWZpbmVfc3RhYiAoTl9CQ09NTSwgMHhlMiwgIkJDT01NIikKKworLyogRW5kIG5hbWVkIGNvbW1vbiBibG9jay4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQKKyAgIChhbmQgaXQgc2hvdWxkIG1hdGNoIHRoZSBOX0JDT01NKS4gICovCitfX2RlZmluZV9zdGFiIChOX0VDT01NLCAweGU0LCAiRUNPTU0iKQorCisvKiBFbmQgY29tbW9uIChsb2NhbCBuYW1lKTogdmFsdWUgaXMgYWRkcmVzcy4KKyAgIEknbSBub3Qgc3VyZSBob3cgdGhpcyBpcyB1c2VkLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRUNPTUwsIDB4ZTgsICJFQ09NTCIpCisKKy8qIFRoZXNlIFNUQUIncyBhcmUgdXNlZCBvbiBHb3VsZCBzeXN0ZW1zIGZvciBOb24tQmFzZSByZWdpc3RlciBzeW1ib2xzCisgICBvciBzb21ldGhpbmcgbGlrZSB0aGF0LiAgRklYTUUuICBJIGhhdmUgYXNzaWduZWQgdGhlIHZhbHVlcyBhdCByYW5kb20KKyAgIHNpbmNlIEkgZG9uJ3QgaGF2ZSBhIEdvdWxkIGhlcmUuICBGaXh1cHMgZnJvbSBHb3VsZCBmb2xrIHdlbGNvbWUuLi4gKi8KK19fZGVmaW5lX3N0YWIgKE5fTkJURVhULCAweEYwLCAiTkJURVhUIikKK19fZGVmaW5lX3N0YWIgKE5fTkJEQVRBLCAweEYyLCAiTkJEQVRBIikKK19fZGVmaW5lX3N0YWIgKE5fTkJCU1MsICAweEY0LCAiTkJCU1MiKQorX19kZWZpbmVfc3RhYiAoTl9OQlNUUywgIDB4RjYsICJOQlNUUyIpCitfX2RlZmluZV9zdGFiIChOX05CTENTLCAgMHhGOCwgIk5CTENTIikKKworLyogU2Vjb25kIHN5bWJvbCBlbnRyeSBjb250YWluaW5nIGEgbGVuZ3RoLXZhbHVlIGZvciB0aGUgcHJlY2VkaW5nIGVudHJ5LgorICAgVGhlIHZhbHVlIGlzIHRoZSBsZW5ndGguICAqLworX19kZWZpbmVfc3RhYiAoTl9MRU5HLCAweGZlLCAiTEVORyIpCisMCisvKiBUaGUgYWJvdmUgaW5mb3JtYXRpb24sIGluIG1hdHJpeCBmb3JtYXQuCisKKwkJCVNUQUIgTUFUUklYCisJX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCXwgMDAgLSAxRiBhcmUgbm90IGRieCBzdGFiIHN5bWJvbHMJCXwKKwl8IEluIG1vc3QgY2FzZXMsIHRoZSBsb3cgYml0IGlzIHRoZSBFWFRlcm5hbCBiaXR8CisKKwl8IDAwIFVOREVGICB8IDAyIEFCUwl8IDA0IFRFWFQgICB8IDA2IERBVEEJfAorCXwgMDEgIHxFWFQgIHwgMDMgIHxFWFQJfCAwNSAgfEVYVCAgfCAwNyAgfEVYVAl8CisKKwl8IDA4IEJTUyAgICB8IDBBIElORFIJfCAwQyBGTl9TRVEgfCAwRSAgIAl8CisJfCAwOSAgfEVYVCAgfCAwQiAJfCAwRAkgICAgfCAwRgl8CisKKwl8IDEwIAkgICAgfCAxMiBDT01NCXwgMTQgU0VUQSAgIHwgMTYgU0VUVAl8CisJfCAxMQkgICAgfCAxMwl8IDE1IAkgICAgfCAxNwl8CisKKwl8IDE4IFNFVEQgICB8IDFBIFNFVEIJfCAxQyBTRVRWICAgfCAxRSBXQVJOSU5HfAorCXwgMTkJICAgIHwgMUIJfCAxRCAJICAgIHwgMUYgRk4JfAorCisJfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorCXwgRGVidWcgZW50cmllcyB3aXRoIGJpdCAwMSBzZXQgYXJlIHVudXNlZC4JfAorCXwgMjAgR1NZTSAgIHwgMjIgRk5BTUUJfCAyNCBGVU4gICAgfCAyNiBTVFNZTQl8CisJfCAyOCBMQ1NZTSAgfCAyQSBNQUlOCXwgMkMJICAgIHwgMkUJfAorCXwgMzAgUEMJICAgIHwgMzIgTlNZTVMJfCAzNCBOT01BUCAgfCAzNgl8CisJfCAzOCBPQkogICAgfCAzQQl8IDNDIE9QVCAgICB8IDNFCXwKKwl8IDQwIFJTWU0gICB8IDQyIE0yQwl8IDQ0IFNMSU5FICB8IDQ2IERTTElORSB8CisJfCA0OCBCU0xJTkUqfCA0QSBERUZECXwgNEMgICAgICAgIHwgNEUJfAorCXwgNTAgRUhERUNMKnwgNTIJfCA1NCBDQVRDSCAgfCA1NiAgICAgICAgfAorCXwgNTggICAgICAgIHwgNUEgICAgICAgIHwgNUMgICAgICAgIHwgNUUJfAorCXwgNjAgU1NZTSAgIHwgNjIJfCA2NCBTTwkgICAgfCA2NiAJfAorCXwgNjggCSAgICB8IDZBCXwgNkMJICAgIHwgNkUJfAorCXwgNzAJICAgIHwgNzIJfCA3NAkgICAgfCA3Ngl8CisJfCA3OAkgICAgfCA3QQl8IDdDCSAgICB8IDdFCXwKKwl8IDgwIExTWU0gICB8IDgyIEJJTkNMCXwgODQgU09MICAgIHwgODYJfAorCXwgODgJICAgIHwgOEEJfCA4QwkgICAgfCA4RQl8CisJfCA5MAkgICAgfCA5Mgl8IDk0CSAgICB8IDk2CXwKKwl8IDk4CSAgICB8IDlBCXwgOUMJICAgIHwgOUUJfAorCXwgQTAgUFNZTSAgIHwgQTIgRUlOQ0wJfCBBNCBFTlRSWSAgfCBBNgl8CisJfCBBOAkgICAgfCBBQQl8IEFDCSAgICB8IEFFCXwKKwl8IEIwCSAgICB8IEIyCXwgQjQJICAgIHwgQjYJfAorCXwgQjgJICAgIHwgQkEJfCBCQwkgICAgfCBCRQl8CisJfCBDMCBMQlJBQyAgfCBDMiBFWENMCXwgQzQgU0NPUEUgIHwgQzYJfAorCXwgQzgJICAgIHwgQ0EJfCBDQwkgICAgfCBDRQl8CisJfCBEMAkgICAgfCBEMgl8IEQ0CSAgICB8IEQ2CXwKKwl8IEQ4CSAgICB8IERBCXwgREMJICAgIHwgREUJfAorCXwgRTAgUkJSQUMgIHwgRTIgQkNPTU0JfCBFNCBFQ09NTSAgfCBFNgl8CisJfCBFOCBFQ09NTCAgfCBFQQl8IEVDCSAgICB8IEVFCXwKKwl8IEYwCSAgICB8IEYyCXwgRjQJICAgIHwgRjYJfAorCXwgRjgJICAgIHwgRkEJfCBGQwkgICAgfCBGRSBMRU5HCXwKKwkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiA1MCBFSERFQ0wgaXMgYWxzbyBNT0QyLgorICogNDggQlNMSU5FIGlzIGFsc28gQlJPV1MuCisgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGF0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYzNjZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RhdC5oCkBAIC0wLDAgKzEsMTczIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTUtMjAwMiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIF9TWVNfU1RBVF9IICYmICFkZWZpbmVkIF9GQ05UTF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3N0YXQuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3N0YXQuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfQklUU19TVEFUX0gKKyNkZWZpbmUgX0JJVFNfU1RBVF9ICTEKKworLyogVmVyc2lvbnMgb2YgdGhlIGBzdHJ1Y3Qgc3RhdCcgZGF0YSBzdHJ1Y3R1cmUuICAqLworI2RlZmluZSBfU1RBVF9WRVJfTElOVVhfT0xECTEKKyNkZWZpbmUgX1NUQVRfVkVSX0tFUk5FTAkxCisjZGVmaW5lIF9TVEFUX1ZFUl9TVlI0CQkyCisjZGVmaW5lIF9TVEFUX1ZFUl9MSU5VWAkJMworI2RlZmluZSBfU1RBVF9WRVIJCV9TVEFUX1ZFUl9MSU5VWAkvKiBUaGUgb25lIGRlZmluZWQgYmVsb3cuICAqLworCisvKiBWZXJzaW9ucyBvZiB0aGUgYHhta25vZCcgaW50ZXJmYWNlLiAgKi8KKyNkZWZpbmUgX01LTk9EX1ZFUl9MSU5VWAkxCisjZGVmaW5lIF9NS05PRF9WRVJfU1ZSNAkJMgorI2RlZmluZSBfTUtOT0RfVkVSCQlfTUtOT0RfVkVSX0xJTlVYIC8qIFRoZSBiaXRzIGRlZmluZWQgYmVsb3cuICAqLworCisKK3N0cnVjdCBzdGF0CisgIHsKKyAgICBfX2Rldl90IHN0X2RldjsJCQkvKiBEZXZpY2UuICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3BhZDE7CisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgICBfX2lub190IHN0X2lubzsJCQkvKiBGaWxlIHNlcmlhbCBudW1iZXIuCSovCisjZWxzZQorICAgIF9faW5vX3QgX19zdF9pbm87CQkJLyogMzJiaXQgZmlsZSBzZXJpYWwgbnVtYmVyLgkqLworI2VuZGlmCisgICAgX19tb2RlX3Qgc3RfbW9kZTsJCQkvKiBGaWxlIG1vZGUuICAqLworICAgIF9fbmxpbmtfdCBzdF9ubGluazsJCQkvKiBMaW5rIGNvdW50LiAgKi8KKyAgICBfX3VpZF90IHN0X3VpZDsJCQkvKiBVc2VyIElEIG9mIHRoZSBmaWxlJ3Mgb3duZXIuCSovCisgICAgX19naWRfdCBzdF9naWQ7CQkJLyogR3JvdXAgSUQgb2YgdGhlIGZpbGUncyBncm91cC4qLworICAgIF9fZGV2X3Qgc3RfcmRldjsJCQkvKiBEZXZpY2UgbnVtYmVyLCBpZiBkZXZpY2UuICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3BhZDI7CisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgICBfX29mZl90IHN0X3NpemU7CQkJLyogU2l6ZSBvZiBmaWxlLCBpbiBieXRlcy4gICovCisjZWxzZQorICAgIF9fb2ZmNjRfdCBzdF9zaXplOwkJCS8qIFNpemUgb2YgZmlsZSwgaW4gYnl0ZXMuICAqLworI2VuZGlmCisgICAgX19ibGtzaXplX3Qgc3RfYmxrc2l6ZTsJCS8qIE9wdGltYWwgYmxvY2sgc2l6ZSBmb3IgSS9PLiAgKi8KKworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisgICAgX19ibGtjbnRfdCBzdF9ibG9ja3M7CQkvKiBOdW1iZXIgNTEyLWJ5dGUgYmxvY2tzIGFsbG9jYXRlZC4gKi8KKyNlbHNlCisgICAgX19ibGtjbnQ2NF90IHN0X2Jsb2NrczsJCS8qIE51bWJlciA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAqLworI2VuZGlmCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKyAgICAvKiBOYW5vc2Vjb25kIHJlc29sdXRpb24gdGltZXN0YW1wcyBhcmUgc3RvcmVkIGluIGEgZm9ybWF0CisgICAgICAgZXF1aXZhbGVudCB0byAnc3RydWN0IHRpbWVzcGVjJy4gIFRoaXMgaXMgdGhlIHR5cGUgdXNlZAorICAgICAgIHdoZW5ldmVyIHBvc3NpYmxlIGJ1dCB0aGUgVW5peCBuYW1lc3BhY2UgcnVsZXMgZG8gbm90IGFsbG93IHRoZQorICAgICAgIGlkZW50aWZpZXIgJ3RpbWVzcGVjJyB0byBhcHBlYXIgaW4gdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIuCisgICAgICAgVGhlcmVmb3JlIHdlIGhhdmUgdG8gaGFuZGxlIHRoZSB1c2Ugb2YgdGhpcyBoZWFkZXIgaW4gc3RyaWN0bHkKKyAgICAgICBzdGFuZGFyZC1jb21wbGlhbnQgc291cmNlcyBzcGVjaWFsLiAgKi8KKyAgICBzdHJ1Y3QgdGltZXNwZWMgc3RfYXRpbTsJCS8qIFRpbWUgb2YgbGFzdCBhY2Nlc3MuICAqLworICAgIHN0cnVjdCB0aW1lc3BlYyBzdF9tdGltOwkJLyogVGltZSBvZiBsYXN0IG1vZGlmaWNhdGlvbi4gICovCisgICAgc3RydWN0IHRpbWVzcGVjIHN0X2N0aW07CQkvKiBUaW1lIG9mIGxhc3Qgc3RhdHVzIGNoYW5nZS4gICovCisjIGRlZmluZSBzdF9hdGltZSBzdF9hdGltLnR2X3NlYwkvKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgKi8KKyMgZGVmaW5lIHN0X210aW1lIHN0X210aW0udHZfc2VjCisjIGRlZmluZSBzdF9jdGltZSBzdF9jdGltLnR2X3NlYworI2Vsc2UKKyAgICBfX3RpbWVfdCBzdF9hdGltZTsJCQkvKiBUaW1lIG9mIGxhc3QgYWNjZXNzLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBzdF9hdGltZW5zZWM7CS8qIE5zY2VjcyBvZiBsYXN0IGFjY2Vzcy4gICovCisgICAgX190aW1lX3Qgc3RfbXRpbWU7CQkJLyogVGltZSBvZiBsYXN0IG1vZGlmaWNhdGlvbi4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgc3RfbXRpbWVuc2VjOwkvKiBOc2VjcyBvZiBsYXN0IG1vZGlmaWNhdGlvbi4gICovCisgICAgX190aW1lX3Qgc3RfY3RpbWU7CQkJLyogVGltZSBvZiBsYXN0IHN0YXR1cyBjaGFuZ2UuICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHN0X2N0aW1lbnNlYzsJLyogTnNlY3Mgb2YgbGFzdCBzdGF0dXMgY2hhbmdlLiAgKi8KKyNlbmRpZgorI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQ0OworICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkNTsKKyNlbHNlCisgICAgX19pbm82NF90IHN0X2lubzsJCQkvKiBGaWxlIHNlcmlhbCBudW1iZXIuCSovCisjZW5kaWYKKyAgfTsKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitzdHJ1Y3Qgc3RhdDY0CisgIHsKKyAgICBfX2Rldl90IHN0X2RldjsJCQkvKiBEZXZpY2UuICAqLworICAgIHVuc2lnbmVkIGludCBfX3BhZDE7CisKKyAgICBfX2lub190IF9fc3RfaW5vOwkJCS8qIDMyYml0IGZpbGUgc2VyaWFsIG51bWJlci4JKi8KKyAgICBfX21vZGVfdCBzdF9tb2RlOwkJCS8qIEZpbGUgbW9kZS4gICovCisgICAgX19ubGlua190IHN0X25saW5rOwkJCS8qIExpbmsgY291bnQuICAqLworICAgIF9fdWlkX3Qgc3RfdWlkOwkJCS8qIFVzZXIgSUQgb2YgdGhlIGZpbGUncyBvd25lci4JKi8KKyAgICBfX2dpZF90IHN0X2dpZDsJCQkvKiBHcm91cCBJRCBvZiB0aGUgZmlsZSdzIGdyb3VwLiovCisgICAgX19kZXZfdCBzdF9yZGV2OwkJCS8qIERldmljZSBudW1iZXIsIGlmIGRldmljZS4gICovCisgICAgdW5zaWduZWQgaW50IF9fcGFkMjsKKyAgICBfX29mZjY0X3Qgc3Rfc2l6ZTsJCQkvKiBTaXplIG9mIGZpbGUsIGluIGJ5dGVzLiAgKi8KKyAgICBfX2Jsa3NpemVfdCBzdF9ibGtzaXplOwkJLyogT3B0aW1hbCBibG9jayBzaXplIGZvciBJL08uICAqLworCisgICAgX19ibGtjbnQ2NF90IHN0X2Jsb2NrczsJCS8qIE51bWJlciA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAqLworIyBpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorICAgIC8qIE5hbm9zZWNvbmQgcmVzb2x1dGlvbiB0aW1lc3RhbXBzIGFyZSBzdG9yZWQgaW4gYSBmb3JtYXQKKyAgICAgICBlcXVpdmFsZW50IHRvICdzdHJ1Y3QgdGltZXNwZWMnLiAgVGhpcyBpcyB0aGUgdHlwZSB1c2VkCisgICAgICAgd2hlbmV2ZXIgcG9zc2libGUgYnV0IHRoZSBVbml4IG5hbWVzcGFjZSBydWxlcyBkbyBub3QgYWxsb3cgdGhlCisgICAgICAgaWRlbnRpZmllciAndGltZXNwZWMnIHRvIGFwcGVhciBpbiB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlci4KKyAgICAgICBUaGVyZWZvcmUgd2UgaGF2ZSB0byBoYW5kbGUgdGhlIHVzZSBvZiB0aGlzIGhlYWRlciBpbiBzdHJpY3RseQorICAgICAgIHN0YW5kYXJkLWNvbXBsaWFudCBzb3VyY2VzIHNwZWNpYWwuICAqLworICAgIHN0cnVjdCB0aW1lc3BlYyBzdF9hdGltOwkJLyogVGltZSBvZiBsYXN0IGFjY2Vzcy4gICovCisgICAgc3RydWN0IHRpbWVzcGVjIHN0X210aW07CQkvKiBUaW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uLiAgKi8KKyAgICBzdHJ1Y3QgdGltZXNwZWMgc3RfY3RpbTsJCS8qIFRpbWUgb2YgbGFzdCBzdGF0dXMgY2hhbmdlLiAgKi8KKyMgZWxzZQorICAgIF9fdGltZV90IHN0X2F0aW1lOwkJCS8qIFRpbWUgb2YgbGFzdCBhY2Nlc3MuICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHN0X2F0aW1lbnNlYzsJLyogTnNjZWNzIG9mIGxhc3QgYWNjZXNzLiAgKi8KKyAgICBfX3RpbWVfdCBzdF9tdGltZTsJCQkvKiBUaW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBzdF9tdGltZW5zZWM7CS8qIE5zZWNzIG9mIGxhc3QgbW9kaWZpY2F0aW9uLiAgKi8KKyAgICBfX3RpbWVfdCBzdF9jdGltZTsJCQkvKiBUaW1lIG9mIGxhc3Qgc3RhdHVzIGNoYW5nZS4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgc3RfY3RpbWVuc2VjOwkvKiBOc2VjcyBvZiBsYXN0IHN0YXR1cyBjaGFuZ2UuICAqLworIyBlbmRpZgorICAgIF9faW5vNjRfdCBzdF9pbm87CQkJLyogRmlsZSBzZXJpYWwgbnVtYmVyLgkJKi8KKyAgfTsKKyNlbmRpZgorCisvKiBUZWxsIGNvZGUgd2UgaGF2ZSB0aGVzZSBtZW1iZXJzLiAgKi8KKyNkZWZpbmUJX1NUQVRCVUZfU1RfQkxLU0laRQorI2RlZmluZSBfU1RBVEJVRl9TVF9SREVWCisvKiBOYW5vc2Vjb25kIHJlc29sdXRpb24gdGltZSB2YWx1ZXMgYXJlIHN1cHBvcnRlZC4gICovCisjZGVmaW5lIF9TVEFUQlVGX1NUX05TRUMKKworLyogRW5jb2Rpbmcgb2YgdGhlIGZpbGUgbW9kZS4gICovCisKKyNkZWZpbmUJX19TX0lGTVQJMDE3MDAwMAkvKiBUaGVzZSBiaXRzIGRldGVybWluZSBmaWxlIHR5cGUuICAqLworCisvKiBGaWxlIHR5cGVzLiAgKi8KKyNkZWZpbmUJX19TX0lGRElSCTAwNDAwMDAJLyogRGlyZWN0b3J5LiAgKi8KKyNkZWZpbmUJX19TX0lGQ0hSCTAwMjAwMDAJLyogQ2hhcmFjdGVyIGRldmljZS4gICovCisjZGVmaW5lCV9fU19JRkJMSwkwMDYwMDAwCS8qIEJsb2NrIGRldmljZS4gICovCisjZGVmaW5lCV9fU19JRlJFRwkwMTAwMDAwCS8qIFJlZ3VsYXIgZmlsZS4gICovCisjZGVmaW5lCV9fU19JRklGTwkwMDEwMDAwCS8qIEZJRk8uICAqLworI2RlZmluZQlfX1NfSUZMTksJMDEyMDAwMAkvKiBTeW1ib2xpYyBsaW5rLiAgKi8KKyNkZWZpbmUJX19TX0lGU09DSwkwMTQwMDAwCS8qIFNvY2tldC4gICovCisKKy8qIFBPU0lYLjFiIG9iamVjdHMuICBOb3RlIHRoYXQgdGhlc2UgbWFjcm9zIGFsd2F5cyBldmFsdWF0ZSB0byB6ZXJvLiAgQnV0CisgICB0aGV5IGRvIGl0IGJ5IGVuZm9yY2luZyB0aGUgY29ycmVjdCB1c2Ugb2YgdGhlIG1hY3Jvcy4gICovCisjZGVmaW5lIF9fU19UWVBFSVNNUShidWYpICAoKGJ1ZiktPnN0X21vZGUgLSAoYnVmKS0+c3RfbW9kZSkKKyNkZWZpbmUgX19TX1RZUEVJU1NFTShidWYpICgoYnVmKS0+c3RfbW9kZSAtIChidWYpLT5zdF9tb2RlKQorI2RlZmluZSBfX1NfVFlQRUlTU0hNKGJ1ZikgKChidWYpLT5zdF9tb2RlIC0gKGJ1ZiktPnN0X21vZGUpCisKKy8qIFByb3RlY3Rpb24gYml0cy4gICovCisKKyNkZWZpbmUJX19TX0lTVUlECTA0MDAwCS8qIFNldCB1c2VyIElEIG9uIGV4ZWN1dGlvbi4gICovCisjZGVmaW5lCV9fU19JU0dJRAkwMjAwMAkvKiBTZXQgZ3JvdXAgSUQgb24gZXhlY3V0aW9uLiAgKi8KKyNkZWZpbmUJX19TX0lTVlRYCTAxMDAwCS8qIFNhdmUgc3dhcHBlZCB0ZXh0IGFmdGVyIHVzZSAoc3RpY2t5KS4gICovCisjZGVmaW5lCV9fU19JUkVBRAkwNDAwCS8qIFJlYWQgYnkgb3duZXIuICAqLworI2RlZmluZQlfX1NfSVdSSVRFCTAyMDAJLyogV3JpdGUgYnkgb3duZXIuICAqLworI2RlZmluZQlfX1NfSUVYRUMJMDEwMAkvKiBFeGVjdXRlIGJ5IG93bmVyLiAgKi8KKworI2lmZGVmIF9fVVNFX0FURklMRQorIyBkZWZpbmUgVVRJTUVfTk9XCSgoMWwgPDwgMzApIC0gMWwpCisjIGRlZmluZSBVVElNRV9PTUlUCSgoMWwgPDwgMzApIC0gMmwpCisjZW5kaWYKKworI2VuZGlmCS8qIGJpdHMvc3RhdC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RhdGZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RhdGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JkOTBkMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGF0ZnMuaApAQCAtMCwwICsxLDcwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwyMDAwLDIwMDIsMjAwMywyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU1RBVEZTX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3RhdGZzLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zdGF0ZnMuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworc3RydWN0IHN0YXRmcworICB7CisgICAgX19TV09SRF9UWVBFIGZfdHlwZTsKKyAgICBfX1NXT1JEX1RZUEUgZl9ic2l6ZTsKKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorICAgIF9fZnNibGtjbnRfdCBmX2Jsb2NrczsKKyAgICBfX2ZzYmxrY250X3QgZl9iZnJlZTsKKyAgICBfX2ZzYmxrY250X3QgZl9iYXZhaWw7CisgICAgX19mc2ZpbGNudF90IGZfZmlsZXM7CisgICAgX19mc2ZpbGNudF90IGZfZmZyZWU7CisjZWxzZQorICAgIF9fZnNibGtjbnQ2NF90IGZfYmxvY2tzOworICAgIF9fZnNibGtjbnQ2NF90IGZfYmZyZWU7CisgICAgX19mc2Jsa2NudDY0X3QgZl9iYXZhaWw7CisgICAgX19mc2ZpbGNudDY0X3QgZl9maWxlczsKKyAgICBfX2ZzZmlsY250NjRfdCBmX2ZmcmVlOworI2VuZGlmCisgICAgX19mc2lkX3QgZl9mc2lkOworICAgIF9fU1dPUkRfVFlQRSBmX25hbWVsZW47CisgICAgX19TV09SRF9UWVBFIGZfZnJzaXplOworICAgIF9fU1dPUkRfVFlQRSBmX2ZsYWdzOworICAgIF9fU1dPUkRfVFlQRSBmX3NwYXJlWzRdOworICB9OworCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK3N0cnVjdCBzdGF0ZnM2NAorICB7CisgICAgX19TV09SRF9UWVBFIGZfdHlwZTsKKyAgICBfX1NXT1JEX1RZUEUgZl9ic2l6ZTsKKyAgICBfX2ZzYmxrY250NjRfdCBmX2Jsb2NrczsKKyAgICBfX2ZzYmxrY250NjRfdCBmX2JmcmVlOworICAgIF9fZnNibGtjbnQ2NF90IGZfYmF2YWlsOworICAgIF9fZnNmaWxjbnQ2NF90IGZfZmlsZXM7CisgICAgX19mc2ZpbGNudDY0X3QgZl9mZnJlZTsKKyAgICBfX2ZzaWRfdCBmX2ZzaWQ7CisgICAgX19TV09SRF9UWVBFIGZfbmFtZWxlbjsKKyAgICBfX1NXT1JEX1RZUEUgZl9mcnNpemU7CisgICAgX19TV09SRF9UWVBFIGZfZmxhZ3M7CisgICAgX19TV09SRF9UWVBFIGZfc3BhcmVbNF07CisgIH07CisjZW5kaWYKKworLyogVGVsbCBjb2RlIHdlIGhhdmUgdGhlc2UgbWVtYmVycy4gICovCisjZGVmaW5lIF9TVEFURlNfRl9OQU1FTEVOCisjZGVmaW5lIF9TVEFURlNfRl9GUlNJWkUKKyNkZWZpbmUgX1NUQVRGU19GX0ZMQUdTCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RhdHZmcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0YXR2ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDcxN2MzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0YXR2ZnMuaApAQCAtMCwwICsxLDEwOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LDE5OTgsMjAwMCwyMDAxLDIwMDIsMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NUQVRWRlNfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zdGF0dmZzLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zdGF0dmZzLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+ICAvKiBGb3IgX19mc2Jsa2NudF90IGFuZCBfX2ZzZmlsY250X3QuICAqLworCisjaWYgX19XT1JEU0laRSA9PSAzMgorI2RlZmluZSBfU1RBVFZGU0JVRl9GX1VOVVNFRAorI2VuZGlmCisKK3N0cnVjdCBzdGF0dmZzCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCBmX2JzaXplOworICAgIHVuc2lnbmVkIGxvbmcgaW50IGZfZnJzaXplOworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisgICAgX19mc2Jsa2NudF90IGZfYmxvY2tzOworICAgIF9fZnNibGtjbnRfdCBmX2JmcmVlOworICAgIF9fZnNibGtjbnRfdCBmX2JhdmFpbDsKKyAgICBfX2ZzZmlsY250X3QgZl9maWxlczsKKyAgICBfX2ZzZmlsY250X3QgZl9mZnJlZTsKKyAgICBfX2ZzZmlsY250X3QgZl9mYXZhaWw7CisjZWxzZQorICAgIF9fZnNibGtjbnQ2NF90IGZfYmxvY2tzOworICAgIF9fZnNibGtjbnQ2NF90IGZfYmZyZWU7CisgICAgX19mc2Jsa2NudDY0X3QgZl9iYXZhaWw7CisgICAgX19mc2ZpbGNudDY0X3QgZl9maWxlczsKKyAgICBfX2ZzZmlsY250NjRfdCBmX2ZmcmVlOworICAgIF9fZnNmaWxjbnQ2NF90IGZfZmF2YWlsOworI2VuZGlmCisgICAgdW5zaWduZWQgbG9uZyBpbnQgZl9mc2lkOworI2lmZGVmIF9TVEFUVkZTQlVGX0ZfVU5VU0VECisgICAgaW50IF9fZl91bnVzZWQ7CisjZW5kaWYKKyAgICB1bnNpZ25lZCBsb25nIGludCBmX2ZsYWc7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgZl9uYW1lbWF4OworICAgIGludCBfX2Zfc3BhcmVbNl07CisgIH07CisKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorc3RydWN0IHN0YXR2ZnM2NAorICB7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgZl9ic2l6ZTsKKyAgICB1bnNpZ25lZCBsb25nIGludCBmX2Zyc2l6ZTsKKyAgICBfX2ZzYmxrY250NjRfdCBmX2Jsb2NrczsKKyAgICBfX2ZzYmxrY250NjRfdCBmX2JmcmVlOworICAgIF9fZnNibGtjbnQ2NF90IGZfYmF2YWlsOworICAgIF9fZnNmaWxjbnQ2NF90IGZfZmlsZXM7CisgICAgX19mc2ZpbGNudDY0X3QgZl9mZnJlZTsKKyAgICBfX2ZzZmlsY250NjRfdCBmX2ZhdmFpbDsKKyAgICB1bnNpZ25lZCBsb25nIGludCBmX2ZzaWQ7CisjaWZkZWYgX1NUQVRWRlNCVUZfRl9VTlVTRUQKKyAgICBpbnQgX19mX3VudXNlZDsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGxvbmcgaW50IGZfZmxhZzsKKyAgICB1bnNpZ25lZCBsb25nIGludCBmX25hbWVtYXg7CisgICAgaW50IF9fZl9zcGFyZVs2XTsKKyAgfTsKKyNlbmRpZgorCisvKiBEZWZpbml0aW9ucyBmb3IgdGhlIGZsYWcgaW4gYGZfZmxhZycuICBUaGVzZSBkZWZpbml0aW9ucyBzaG91bGQgYmUKKyAgIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBkZWZpbml0aW9ucyBpbiA8c3lzL21vdW50Lmg+LiAgKi8KK2VudW0KK3sKKyAgU1RfUkRPTkxZID0gMSwJCS8qIE1vdW50IHJlYWQtb25seS4gICovCisjZGVmaW5lIFNUX1JET05MWQlTVF9SRE9OTFkKKyAgU1RfTk9TVUlEID0gMgkJCS8qIElnbm9yZSBzdWlkIGFuZCBzZ2lkIGJpdHMuICAqLworI2RlZmluZSBTVF9OT1NVSUQJU1RfTk9TVUlECisjaWZkZWYgX19VU0VfR05VCisgICwKKyAgU1RfTk9ERVYgPSA0LAkJCS8qIERpc2FsbG93IGFjY2VzcyB0byBkZXZpY2Ugc3BlY2lhbCBmaWxlcy4gICovCisjIGRlZmluZSBTVF9OT0RFVglTVF9OT0RFVgorICBTVF9OT0VYRUMgPSA4LAkJLyogRGlzYWxsb3cgcHJvZ3JhbSBleGVjdXRpb24uICAqLworIyBkZWZpbmUgU1RfTk9FWEVDCVNUX05PRVhFQworICBTVF9TWU5DSFJPTk9VUyA9IDE2LAkJLyogV3JpdGVzIGFyZSBzeW5jZWQgYXQgb25jZS4gICovCisjIGRlZmluZSBTVF9TWU5DSFJPTk9VUwlTVF9TWU5DSFJPTk9VUworICBTVF9NQU5ETE9DSyA9IDY0LAkJLyogQWxsb3cgbWFuZGF0b3J5IGxvY2tzIG9uIGFuIEZTLiAgKi8KKyMgZGVmaW5lIFNUX01BTkRMT0NLCVNUX01BTkRMT0NLCisgIFNUX1dSSVRFID0gMTI4LAkJLyogV3JpdGUgb24gZmlsZS9kaXJlY3Rvcnkvc3ltbGluay4gICovCisjIGRlZmluZSBTVF9XUklURQlTVF9XUklURQorICBTVF9BUFBFTkQgPSAyNTYsCQkvKiBBcHBlbmQtb25seSBmaWxlLiAgKi8KKyMgZGVmaW5lIFNUX0FQUEVORAlTVF9BUFBFTkQKKyAgU1RfSU1NVVRBQkxFID0gNTEyLAkJLyogSW1tdXRhYmxlIGZpbGUuICAqLworIyBkZWZpbmUgU1RfSU1NVVRBQkxFCVNUX0lNTVVUQUJMRQorICBTVF9OT0FUSU1FID0gMTAyNCwJCS8qIERvIG5vdCB1cGRhdGUgYWNjZXNzIHRpbWVzLiAgKi8KKyMgZGVmaW5lIFNUX05PQVRJTUUJU1RfTk9BVElNRQorICBTVF9OT0RJUkFUSU1FID0gMjA0OCwJCS8qIERvIG5vdCB1cGRhdGUgZGlyZWN0b3J5IGFjY2VzcyB0aW1lcy4gICovCisjIGRlZmluZSBTVF9OT0RJUkFUSU1FCVNUX05PRElSQVRJTUUKKyAgU1RfUkVMQVRJTUUgPSA0MDk2CQkvKiBVcGRhdGUgYXRpbWUgcmVsYXRpdmUgdG8gbXRpbWUvY3RpbWUuICAqLworIyBkZWZpbmUgU1RfUkVMQVRJTUUJU1RfUkVMQVRJTUUKKyNlbmRpZgkvKiBVc2UgR05VLiAgKi8KK307CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RkaW8tbGRibC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0ZGlvLWxkYmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTBmMTEzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0ZGlvLWxkYmwuaApAQCAtMCwwICsxLDk3IEBACisvKiAtbWxvbmctZG91YmxlLTY0IGNvbXBhdGliaWxpdHkgbW9kZSBmb3Igc3RkaW8gZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVERJT19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3N0ZGlvLWxkYmwuaD4gZGlyZWN0bHk7IHVzZSA8c3RkaW8uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECitfX0xEQkxfUkVESVJfREVDTCAoZnByaW50ZikKK19fTERCTF9SRURJUl9ERUNMIChwcmludGYpCitfX0xEQkxfUkVESVJfREVDTCAoc3ByaW50ZikKK19fTERCTF9SRURJUl9ERUNMICh2ZnByaW50ZikKK19fTERCTF9SRURJUl9ERUNMICh2cHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKHZzcHJpbnRmKQorI2lmIGRlZmluZWQgX19VU0VfSVNPQzk5ICYmICFkZWZpbmVkIF9fVVNFX0dOVSBcCisgICAgJiYgIWRlZmluZWQgX19SRURJUkVDVCBcCisgICAgJiYgKGRlZmluZWQgX19TVFJJQ1RfQU5TSV9fIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySykKK19fTERCTF9SRURJUjFfREVDTCAoZnNjYW5mLCBfX25sZGJsX19faXNvYzk5X2ZzY2FuZikKK19fTERCTF9SRURJUjFfREVDTCAoc2NhbmYsIF9fbmxkYmxfX19pc29jOTlfc2NhbmYpCitfX0xEQkxfUkVESVIxX0RFQ0wgKHNzY2FuZiwgX19ubGRibF9fX2lzb2M5OV9zc2NhbmYpCisjZWxzZQorX19MREJMX1JFRElSX0RFQ0wgKGZzY2FuZikKK19fTERCTF9SRURJUl9ERUNMIChzY2FuZikKK19fTERCTF9SRURJUl9ERUNMIChzc2NhbmYpCisjZW5kaWYKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5IHx8IGRlZmluZWQgX19VU0VfVU5JWDk4CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKK19fTERCTF9SRURJUl9ERUNMIChzbnByaW50ZikKK19fTERCTF9SRURJUl9ERUNMICh2c25wcmludGYpCitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmZGVmCV9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisjIGlmICFkZWZpbmVkIF9fVVNFX0dOVSAmJiAhZGVmaW5lZCBfX1JFRElSRUNUIFwKKyAgICAgJiYgKGRlZmluZWQgX19TVFJJQ1RfQU5TSV9fIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySykKK19fTERCTF9SRURJUjFfREVDTCAodmZzY2FuZiwgX19ubGRibF9fX2lzb2M5OV92ZnNjYW5mKQorX19MREJMX1JFRElSMV9ERUNMICh2c2NhbmYsIF9fbmxkYmxfX19pc29jOTlfdnNjYW5mKQorX19MREJMX1JFRElSMV9ERUNMICh2c3NjYW5mLCBfX25sZGJsX19faXNvYzk5X3Zzc2NhbmYpCisjIGVsc2UKK19fTERCTF9SRURJUl9ERUNMICh2ZnNjYW5mKQorX19MREJMX1JFRElSX0RFQ0wgKHZzc2NhbmYpCitfX0xEQkxfUkVESVJfREVDTCAodnNjYW5mKQorIyBlbmRpZgorX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKK19fTERCTF9SRURJUl9ERUNMICh2ZHByaW50ZikKK19fTERCTF9SRURJUl9ERUNMIChkcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKHZhc3ByaW50ZikKK19fTERCTF9SRURJUl9ERUNMIChfX2FzcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKGFzcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKG9ic3RhY2tfcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKG9ic3RhY2tfdnByaW50ZikKKyNlbmRpZgorCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDAgJiYgZGVmaW5lZCBfX2V4dGVybl9hbHdheXNfaW5saW5lCitfX0xEQkxfUkVESVJfREVDTCAoX19zcHJpbnRmX2NoaykKK19fTERCTF9SRURJUl9ERUNMIChfX3ZzcHJpbnRmX2NoaykKKyMgaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkgfHwgZGVmaW5lZCBfX1VTRV9VTklYOTgKK19fTERCTF9SRURJUl9ERUNMIChfX3NucHJpbnRmX2NoaykKK19fTERCTF9SRURJUl9ERUNMIChfX3ZzbnByaW50Zl9jaGspCisjIGVuZGlmCisjIGlmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAxCitfX0xEQkxfUkVESVJfREVDTCAoX19mcHJpbnRmX2NoaykKK19fTERCTF9SRURJUl9ERUNMIChfX3ByaW50Zl9jaGspCitfX0xEQkxfUkVESVJfREVDTCAoX192ZnByaW50Zl9jaGspCitfX0xEQkxfUkVESVJfREVDTCAoX192cHJpbnRmX2NoaykKKyMgIGlmZGVmIF9fVVNFX0dOVQorX19MREJMX1JFRElSX0RFQ0wgKF9fYXNwcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fdmFzcHJpbnRmX2NoaykKK19fTERCTF9SRURJUl9ERUNMIChfX2RwcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fdmRwcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fb2JzdGFja19wcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fb2JzdGFja192cHJpbnRmX2NoaykKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGRpby1sb2NrLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RkaW8tbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZWZkZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RkaW8tbG9jay5oCkBAIC0wLDAgKzEsMTExIEBACisvKiBUaHJlYWQgcGFja2FnZSBzcGVjaWZpYyBkZWZpbml0aW9ucyBvZiBzdHJlYW0gbG9jayB0eXBlLiAgTlBUTCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9CSVRTX1NURElPX0xPQ0tfSAorI2RlZmluZSBfQklUU19TVERJT19MT0NLX0ggMQorCisjaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KKyNpbmNsdWRlIDxsb3dsZXZlbGxvY2suaD4KKworCisvKiBUaGUgbG9ja2luZyBoZXJlIGlzIHZlcnkgaW5leHBlbnNpdmUsIGV2ZW4gZm9yIGlubGluaW5nLiAgKi8KKyNkZWZpbmUgX0lPX2xvY2tfaW5leHBlbnNpdmUJMQorCit0eXBlZGVmIHN0cnVjdCB7IGludCBsb2NrOyBpbnQgY250OyB2b2lkICpvd25lcjsgfSBfSU9fbG9ja190OworCisjZGVmaW5lIF9JT19sb2NrX2luaXRpYWxpemVyIHsgTExMX0xPQ0tfSU5JVElBTElaRVIsIDAsIE5VTEwgfQorCisjZGVmaW5lIF9JT19sb2NrX2luaXQoX25hbWUpIFwKKyAgKChfbmFtZSkgPSAoX0lPX2xvY2tfdCkgX0lPX2xvY2tfaW5pdGlhbGl6ZXIgLCAwKQorCisjZGVmaW5lIF9JT19sb2NrX2ZpbmkoX25hbWUpIFwKKyAgKCh2b2lkKSAwKQorCisjZGVmaW5lIF9JT19sb2NrX2xvY2soX25hbWUpIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICB2b2lkICpfX3NlbGYgPSBUSFJFQURfU0VMRjsJCQkJCQkgICAgICBcCisgICAgaWYgKChfbmFtZSkub3duZXIgIT0gX19zZWxmKQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKwlsbGxfbG9jayAoKF9uYW1lKS5sb2NrLCBMTExfUFJJVkFURSk7CQkJCSAgICAgIFwKKyAgICAgICAgKF9uYW1lKS5vd25lciA9IF9fc2VsZjsJCQkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICAgICsrKF9uYW1lKS5jbnQ7CQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfSU9fbG9ja190cnlsb2NrKF9uYW1lKSBcCisgICh7CQkJCQkJCQkJICAgICAgXAorICAgIGludCBfX3Jlc3VsdCA9IDA7CQkJCQkJCSAgICAgIFwKKyAgICB2b2lkICpfX3NlbGYgPSBUSFJFQURfU0VMRjsJCQkJCQkgICAgICBcCisgICAgaWYgKChfbmFtZSkub3duZXIgIT0gX19zZWxmKQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKyAgICAgICAgaWYgKGxsbF90cnlsb2NrICgoX25hbWUpLmxvY2spID09IDApCQkJCSAgICAgIFwKKyAgICAgICAgICB7CQkJCQkJCQkgICAgICBcCisgICAgICAgICAgICAoX25hbWUpLm93bmVyID0gX19zZWxmOwkJCQkJICAgICAgXAorICAgICAgICAgICAgKF9uYW1lKS5jbnQgPSAxOwkJCQkJCSAgICAgIFwKKyAgICAgICAgICB9CQkJCQkJCQkgICAgICBcCisgICAgICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKKyAgICAgICAgICBfX3Jlc3VsdCA9IEVCVVNZOwkJCQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgICAgZWxzZQkJCQkJCQkJICAgICAgXAorICAgICAgKysoX25hbWUpLmNudDsJCQkJCQkJICAgICAgXAorICAgIF9fcmVzdWx0OwkJCQkJCQkJICAgICAgXAorICB9KQorCisjZGVmaW5lIF9JT19sb2NrX3VubG9jayhfbmFtZSkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIGlmICgtLShfbmFtZSkuY250ID09IDApCQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKyAgICAgICAgKF9uYW1lKS5vd25lciA9IE5VTEw7CQkJCQkJICAgICAgXAorCWxsbF91bmxvY2sgKChfbmFtZSkubG9jaywgTExMX1BSSVZBVEUpOwkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorCisKKworI2RlZmluZSBfSU9fY2xlYW51cF9yZWdpb25fc3RhcnQoX2ZjdCwgX2ZwKSBcCisgIF9fbGliY19jbGVhbnVwX3JlZ2lvbl9zdGFydCAoKChfZnApLT5fZmxhZ3MgJiBfSU9fVVNFUl9MT0NLKSA9PSAwLCBfZmN0LCBfZnApCisjZGVmaW5lIF9JT19jbGVhbnVwX3JlZ2lvbl9zdGFydF9ub2FyZyhfZmN0KSBcCisgIF9fbGliY19jbGVhbnVwX3JlZ2lvbl9zdGFydCAoMSwgX2ZjdCwgTlVMTCkKKyNkZWZpbmUgX0lPX2NsZWFudXBfcmVnaW9uX2VuZChfZG9pdCkgXAorICBfX2xpYmNfY2xlYW51cF9yZWdpb25fZW5kIChfZG9pdCkKKworI2lmIGRlZmluZWQgX0xJQkMgJiYgIWRlZmluZWQgTk9UX0lOX2xpYmMKKworIyBpZmRlZiBfX0VYQ0VQVElPTlMKKyMgIGRlZmluZSBfSU9fYWNxdWlyZV9sb2NrKF9mcCkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIF9JT19GSUxFICpfSU9fYWNxdWlyZV9sb2NrX2ZpbGUJCQkJCSAgICAgIFwKKwlfX2F0dHJpYnV0ZV9fKChjbGVhbnVwIChfSU9fYWNxdWlyZV9sb2NrX2ZjdCkpKQkJCSAgICAgIFwKKwk9IChfZnApOwkJCQkJCQkgICAgICBcCisgICAgX0lPX2Zsb2NrZmlsZSAoX0lPX2FjcXVpcmVfbG9ja19maWxlKTsKKyMgIGRlZmluZSBfSU9fYWNxdWlyZV9sb2NrX2NsZWFyX2ZsYWdzMihfZnApIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBfSU9fRklMRSAqX0lPX2FjcXVpcmVfbG9ja19maWxlCQkJCQkgICAgICBcCisJX19hdHRyaWJ1dGVfXygoY2xlYW51cCAoX0lPX2FjcXVpcmVfbG9ja19jbGVhcl9mbGFnczJfZmN0KSkpCSAgICAgIFwKKwk9IChfZnApOwkJCQkJCQkgICAgICBcCisgICAgX0lPX2Zsb2NrZmlsZSAoX0lPX2FjcXVpcmVfbG9ja19maWxlKTsKKyMgZWxzZQorIyAgZGVmaW5lIF9JT19hY3F1aXJlX2xvY2soX2ZwKSBfSU9fYWNxdWlyZV9sb2NrX25lZWRzX2V4Y2VwdGlvbnNfZW5hYmxlZAorIyAgZGVmaW5lIF9JT19hY3F1aXJlX2xvY2tfY2xlYXJfZmxhZ3MyKF9mcCkgX0lPX2FjcXVpcmVfbG9jayAoX2ZwKQorIyBlbmRpZgorIyBkZWZpbmUgX0lPX3JlbGVhc2VfbG9jayhfZnApIDsgfSB3aGlsZSAoMCkKKworI2VuZGlmCisKKyNlbmRpZiAvKiBiaXRzL3N0ZGlvLWxvY2suaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0ZGlvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTMwM2M2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0ZGlvLmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qIE9wdGltaXppbmcgbWFjcm9zIGFuZCBpbmxpbmUgZnVuY3Rpb25zIGZvciBzdGRpbyBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDIwMDAsIDIwMDEsIDIwMDQsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NURElPX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3RkaW8uaD4gZGlyZWN0bHk7IHVzZSA8c3RkaW8uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfX2V4dGVybl9pbmxpbmUKKyMgZGVmaW5lIF9fU1RESU9fSU5MSU5FIGlubGluZQorI2Vsc2UKKyMgZGVmaW5lIF9fU1RESU9fSU5MSU5FIF9fZXh0ZXJuX2lubGluZQorI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCisvKiBGb3IgLURfRk9SVElGWV9TT1VSQ0V7LD0yfSBiaXRzL3N0ZGlvMi5oIHdpbGwgZGVmaW5lIGEgZGlmZmVyZW50CisgICBpbmxpbmUuICAqLworIyBpZiAhKF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAwICYmIGRlZmluZWQgX19leHRlcm5fYWx3YXlzX2lubGluZSkKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gc3Rkb3V0IGZyb20gYXJndW1lbnQgbGlzdCBBUkcuICAqLworX19TVERJT19JTkxJTkUgaW50Cit2cHJpbnRmIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIF9HX3ZhX2xpc3QgX19hcmcpCit7CisgIHJldHVybiB2ZnByaW50ZiAoc3Rkb3V0LCBfX2ZtdCwgX19hcmcpOworfQorIyBlbmRpZgorCisvKiBSZWFkIGEgY2hhcmFjdGVyIGZyb20gc3RkaW4uICAqLworX19TVERJT19JTkxJTkUgaW50CitnZXRjaGFyICh2b2lkKQoreworICByZXR1cm4gX0lPX2dldGMgKHN0ZGluKTsKK30KKworCisjIGlmZGVmIF9fVVNFX01JU0MKKy8qIEZhc3RlciB2ZXJzaW9uIHdoZW4gbG9ja2luZyBpcyBub3QgbmVjZXNzYXJ5LiAgKi8KK19fU1RESU9fSU5MSU5FIGludAorZmdldGNfdW5sb2NrZWQgKEZJTEUgKl9fZnApCit7CisgIHJldHVybiBfSU9fZ2V0Y191bmxvY2tlZCAoX19mcCk7Cit9CisjIGVuZGlmIC8qIG1pc2MgKi8KKworCisjIGlmIGRlZmluZWQgX19VU0VfUE9TSVggfHwgZGVmaW5lZCBfX1VTRV9NSVNDCisvKiBUaGlzIGlzIGRlZmluZWQgaW4gUE9TSVguMToxOTk2LiAgKi8KK19fU1RESU9fSU5MSU5FIGludAorZ2V0Y191bmxvY2tlZCAoRklMRSAqX19mcCkKK3sKKyAgcmV0dXJuIF9JT19nZXRjX3VubG9ja2VkIChfX2ZwKTsKK30KKworLyogVGhpcyBpcyBkZWZpbmVkIGluIFBPU0lYLjE6MTk5Ni4gICovCitfX1NURElPX0lOTElORSBpbnQKK2dldGNoYXJfdW5sb2NrZWQgKHZvaWQpCit7CisgIHJldHVybiBfSU9fZ2V0Y191bmxvY2tlZCAoc3RkaW4pOworfQorIyBlbmRpZgkvKiBQT1NJWCB8fCBtaXNjICovCisKKworLyogV3JpdGUgYSBjaGFyYWN0ZXIgdG8gc3Rkb3V0LiAgKi8KK19fU1RESU9fSU5MSU5FIGludAorcHV0Y2hhciAoaW50IF9fYykKK3sKKyAgcmV0dXJuIF9JT19wdXRjIChfX2MsIHN0ZG91dCk7Cit9CisKKworIyBpZmRlZiBfX1VTRV9NSVNDCisvKiBGYXN0ZXIgdmVyc2lvbiB3aGVuIGxvY2tpbmcgaXMgbm90IG5lY2Vzc2FyeS4gICovCitfX1NURElPX0lOTElORSBpbnQKK2ZwdXRjX3VubG9ja2VkIChpbnQgX19jLCBGSUxFICpfX3N0cmVhbSkKK3sKKyAgcmV0dXJuIF9JT19wdXRjX3VubG9ja2VkIChfX2MsIF9fc3RyZWFtKTsKK30KKyMgZW5kaWYgLyogbWlzYyAqLworCisKKyMgaWYgZGVmaW5lZCBfX1VTRV9QT1NJWCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKy8qIFRoaXMgaXMgZGVmaW5lZCBpbiBQT1NJWC4xOjE5OTYuICAqLworX19TVERJT19JTkxJTkUgaW50CitwdXRjX3VubG9ja2VkIChpbnQgX19jLCBGSUxFICpfX3N0cmVhbSkKK3sKKyAgcmV0dXJuIF9JT19wdXRjX3VubG9ja2VkIChfX2MsIF9fc3RyZWFtKTsKK30KKworLyogVGhpcyBpcyBkZWZpbmVkIGluIFBPU0lYLjE6MTk5Ni4gICovCitfX1NURElPX0lOTElORSBpbnQKK3B1dGNoYXJfdW5sb2NrZWQgKGludCBfX2MpCit7CisgIHJldHVybiBfSU9fcHV0Y191bmxvY2tlZCAoX19jLCBzdGRvdXQpOworfQorIyBlbmRpZgkvKiBQT1NJWCB8fCBtaXNjICovCisKKworIyBpZmRlZglfX1VTRV9HTlUKKy8qIExpa2UgYGdldGRlbGltJywgYnV0IHJlYWRzIHVwIHRvIGEgbmV3bGluZS4gICovCitfX1NURElPX0lOTElORSBfSU9fc3NpemVfdAorZ2V0bGluZSAoY2hhciAqKl9fbGluZXB0ciwgc2l6ZV90ICpfX24sIEZJTEUgKl9fc3RyZWFtKQoreworICByZXR1cm4gX19nZXRkZWxpbSAoX19saW5lcHRyLCBfX24sICdcbicsIF9fc3RyZWFtKTsKK30KKyMgZW5kaWYgLyogR05VICovCisKKworIyBpZmRlZiBfX1VTRV9NSVNDCisvKiBGYXN0ZXIgdmVyc2lvbnMgd2hlbiBsb2NraW5nIGlzIG5vdCByZXF1aXJlZC4gICovCitfX1NURElPX0lOTElORSBpbnQKK19fTlRIIChmZW9mX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSkpCit7CisgIHJldHVybiBfSU9fZmVvZl91bmxvY2tlZCAoX19zdHJlYW0pOworfQorCisvKiBGYXN0ZXIgdmVyc2lvbnMgd2hlbiBsb2NraW5nIGlzIG5vdCByZXF1aXJlZC4gICovCitfX1NURElPX0lOTElORSBpbnQKK19fTlRIIChmZXJyb3JfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFtKSkKK3sKKyAgcmV0dXJuIF9JT19mZXJyb3JfdW5sb2NrZWQgKF9fc3RyZWFtKTsKK30KKyMgZW5kaWYgLyogbWlzYyAqLworCisjZW5kaWYgLyogVXNlIGV4dGVybiBpbmxpbmVzLiAgKi8KKworCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDICYmIGRlZmluZWQgX19HTlVDX18gJiYgZGVmaW5lZCBfX09QVElNSVpFX18gXAorICAgICYmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisvKiBQZXJmb3JtIHNvbWUgc2ltcGxlIG9wdGltaXphdGlvbnMuICAqLworIyBkZWZpbmUgZnJlYWRfdW5sb2NrZWQocHRyLCBzaXplLCBuLCBzdHJlYW0pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc2l6ZSkgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKG4pICAgIFwKKwkJICAgJiYgKHNpemVfdCkgKHNpemUpICogKHNpemVfdCkgKG4pIDw9IDgJCSAgICAgIFwKKwkJICAgJiYgKHNpemVfdCkgKHNpemUpICE9IDApCQkJCSAgICAgIFwKKwkJICA/ICh7IGNoYXIgKl9fcHRyID0gKGNoYXIgKikgKHB0cik7CQkJICAgICAgXAorCQkgICAgICAgRklMRSAqX19zdHJlYW0gPSAoc3RyZWFtKTsJCQkgICAgICBcCisJCSAgICAgICBzaXplX3QgX19jbnQ7CQkJCQkgICAgICBcCisJCSAgICAgICBmb3IgKF9fY250ID0gKHNpemVfdCkgKHNpemUpICogKHNpemVfdCkgKG4pOwkgICAgICBcCisJCQkgICAgX19jbnQgPiAwOyAtLV9fY250KQkJCQkgICAgICBcCisJCQkgewkJCQkJCSAgICAgIFwKKwkJCSAgIGludCBfX2MgPSBfSU9fZ2V0Y191bmxvY2tlZCAoX19zdHJlYW0pOwkgICAgICBcCisJCQkgICBpZiAoX19jID09IEVPRikJCQkJICAgICAgXAorCQkJICAgICBicmVhazsJCQkJCSAgICAgIFwKKwkJCSAgICpfX3B0cisrID0gX19jOwkJCQkgICAgICBcCisJCQkgfQkJCQkJCSAgICAgIFwKKwkJICAgICAgICgoc2l6ZV90KSAoc2l6ZSkgKiAoc2l6ZV90KSAobikgLSBfX2NudCkJCSAgICAgIFwKKwkJCS8gKHNpemVfdCkgKHNpemUpOyB9KQkJCQkgICAgICBcCisJCSAgOiAoKChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc2l6ZSkgJiYgKHNpemVfdCkgKHNpemUpID09IDApICAgXAorCQkgICAgICB8fCAoX19idWlsdGluX2NvbnN0YW50X3AgKG4pICYmIChzaXplX3QpIChuKSA9PSAwKSkgICAgIFwKKwkJCS8qIEV2YWx1YXRlIGFsbCBwYXJhbWV0ZXJzIG9uY2UuICAqLwkJICAgICAgXAorCQkgICAgID8gKCh2b2lkKSAocHRyKSwgKHZvaWQpIChzdHJlYW0pLCAodm9pZCkgKHNpemUpLAkgICAgICBcCisJCQkodm9pZCkgKG4pLCAoc2l6ZV90KSAwKQkJCQkgICAgICBcCisJCSAgICAgOiBmcmVhZF91bmxvY2tlZCAocHRyLCBzaXplLCBuLCBzdHJlYW0pKSkpCisKKyMgZGVmaW5lIGZ3cml0ZV91bmxvY2tlZChwdHIsIHNpemUsIG4sIHN0cmVhbSkgXAorICAoX19leHRlbnNpb25fXyAoKF9fYnVpbHRpbl9jb25zdGFudF9wIChzaXplKSAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAobikgICAgXAorCQkgICAmJiAoc2l6ZV90KSAoc2l6ZSkgKiAoc2l6ZV90KSAobikgPD0gOAkJICAgICAgXAorCQkgICAmJiAoc2l6ZV90KSAoc2l6ZSkgIT0gMCkJCQkJICAgICAgXAorCQkgID8gKHsgY29uc3QgY2hhciAqX19wdHIgPSAoY29uc3QgY2hhciAqKSAocHRyKTsJICAgICAgXAorCQkgICAgICAgRklMRSAqX19zdHJlYW0gPSAoc3RyZWFtKTsJCQkgICAgICBcCisJCSAgICAgICBzaXplX3QgX19jbnQ7CQkJCQkgICAgICBcCisJCSAgICAgICBmb3IgKF9fY250ID0gKHNpemVfdCkgKHNpemUpICogKHNpemVfdCkgKG4pOwkgICAgICBcCisJCQkgICAgX19jbnQgPiAwOyAtLV9fY250KQkJCQkgICAgICBcCisJCQkgaWYgKF9JT19wdXRjX3VubG9ja2VkICgqX19wdHIrKywgX19zdHJlYW0pID09IEVPRikgICBcCisJCQkgICBicmVhazsJCQkJCSAgICAgIFwKKwkJICAgICAgICgoc2l6ZV90KSAoc2l6ZSkgKiAoc2l6ZV90KSAobikgLSBfX2NudCkJCSAgICAgIFwKKwkJCS8gKHNpemVfdCkgKHNpemUpOyB9KQkJCQkgICAgICBcCisJCSAgOiAoKChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc2l6ZSkgJiYgKHNpemVfdCkgKHNpemUpID09IDApICAgXAorCQkgICAgICB8fCAoX19idWlsdGluX2NvbnN0YW50X3AgKG4pICYmIChzaXplX3QpIChuKSA9PSAwKSkgICAgIFwKKwkJCS8qIEV2YWx1YXRlIGFsbCBwYXJhbWV0ZXJzIG9uY2UuICAqLwkJICAgICAgXAorCQkgICAgID8gKCh2b2lkKSAocHRyKSwgKHZvaWQpIChzdHJlYW0pLCAodm9pZCkgKHNpemUpLAkgICAgICBcCisJCQkodm9pZCkgKG4pLCAoc2l6ZV90KSAwKQkJCQkgICAgICBcCisJCSAgICAgOiBmd3JpdGVfdW5sb2NrZWQgKHB0ciwgc2l6ZSwgbiwgc3RyZWFtKSkpKQorI2VuZGlmCisKKy8qIERlZmluZSBoZWxwZXIgbWFjcm8uICAqLworI3VuZGVmIF9fU1RESU9fSU5MSU5FCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RkaW8yLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RkaW8yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyNWFhYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGRpbzIuaApAQCAtMCwwICsxLDM3NCBAQAorLyogQ2hlY2tpbmcgbWFjcm9zIGZvciBzdGRpbyBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NURElPX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3RkaW8yLmg+IGRpcmVjdGx5OyB1c2UgPHN0ZGlvLmg+IGluc3RlYWQuIgorI2VuZGlmCisKK2V4dGVybiBpbnQgX19zcHJpbnRmX2NoayAoY2hhciAqX19yZXN0cmljdCBfX3MsIGludCBfX2ZsYWcsIHNpemVfdCBfX3NsZW4sCisJCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSBfX1RIUk9XOworZXh0ZXJuIGludCBfX3ZzcHJpbnRmX2NoayAoY2hhciAqX19yZXN0cmljdCBfX3MsIGludCBfX2ZsYWcsIHNpemVfdCBfX3NsZW4sCisJCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgICBfR192YV9saXN0IF9fYXApIF9fVEhST1c7CisKKyNpZmRlZiBfX3ZhX2FyZ19wYWNrCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKHNwcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19zcHJpbnRmX2NoayAoX19zLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwKKwkJCQkgIF9fYm9zIChfX3MpLCBfX2ZtdCwgX192YV9hcmdfcGFjayAoKSk7Cit9CisjZWxpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cworIyBkZWZpbmUgc3ByaW50ZihzdHIsIC4uLikgXAorICBfX2J1aWx0aW5fX19zcHJpbnRmX2NoayAoc3RyLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19ib3MgKHN0ciksIFwKKwkJCSAgIF9fVkFfQVJHU19fKQorI2VuZGlmCisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAodnNwcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsCisJCSBfR192YV9saXN0IF9fYXApKQoreworICByZXR1cm4gX19idWlsdGluX19fdnNwcmludGZfY2hrIChfX3MsIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLAorCQkJCSAgIF9fYm9zIChfX3MpLCBfX2ZtdCwgX19hcCk7Cit9CisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OSB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OAorCitleHRlcm4gaW50IF9fc25wcmludGZfY2hrIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwgaW50IF9fZmxhZywKKwkJCSAgIHNpemVfdCBfX3NsZW4sIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgIC4uLikgX19USFJPVzsKK2V4dGVybiBpbnQgX192c25wcmludGZfY2hrIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwgaW50IF9fZmxhZywKKwkJCSAgICBzaXplX3QgX19zbGVuLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgICAgX0dfdmFfbGlzdCBfX2FwKSBfX1RIUk9XOworCisjIGlmZGVmIF9fdmFfYXJnX3BhY2sKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAoc25wcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLAorCQkgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pKQoreworICByZXR1cm4gX19idWlsdGluX19fc25wcmludGZfY2hrIChfX3MsIF9fbiwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsCisJCQkJICAgX19ib3MgKF9fcyksIF9fZm10LCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKyMgZWxpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cworIyAgZGVmaW5lIHNucHJpbnRmKHN0ciwgbGVuLCAuLi4pIFwKKyAgX19idWlsdGluX19fc25wcmludGZfY2hrIChzdHIsIGxlbiwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fYm9zIChzdHIpLCBcCisJCQkgICAgX19WQV9BUkdTX18pCisjIGVuZGlmCisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAodnNucHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwKKwkJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIF9HX3ZhX2xpc3QgX19hcCkpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX192c25wcmludGZfY2hrIChfX3MsIF9fbiwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsCisJCQkJICAgIF9fYm9zIChfX3MpLCBfX2ZtdCwgX19hcCk7Cit9CisKKyNlbmRpZgorCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDEKKworZXh0ZXJuIGludCBfX2ZwcmludGZfY2hrIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBpbnQgX19mbGFnLAorCQkJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLik7CitleHRlcm4gaW50IF9fcHJpbnRmX2NoayAoaW50IF9fZmxhZywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pOworZXh0ZXJuIGludCBfX3ZmcHJpbnRmX2NoayAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwgaW50IF9fZmxhZywKKwkJCSAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgX0dfdmFfbGlzdCBfX2FwKTsKK2V4dGVybiBpbnQgX192cHJpbnRmX2NoayAoaW50IF9fZmxhZywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICBfR192YV9saXN0IF9fYXApOworCisjIGlmZGVmIF9fdmFfYXJnX3BhY2sKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitmcHJpbnRmIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikKK3sKKyAgcmV0dXJuIF9fZnByaW50Zl9jaGsgKF9fc3RyZWFtLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsCisJCQlfX3ZhX2FyZ19wYWNrICgpKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK3ByaW50ZiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pCit7CisgIHJldHVybiBfX3ByaW50Zl9jaGsgKF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwgX192YV9hcmdfcGFjayAoKSk7Cit9CisjIGVsaWYgIWRlZmluZWQgX19jcGx1c3BsdXMKKyMgIGRlZmluZSBwcmludGYoLi4uKSBcCisgIF9fcHJpbnRmX2NoayAoX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fVkFfQVJHU19fKQorIyAgZGVmaW5lIGZwcmludGYoc3RyZWFtLCAuLi4pIFwKKyAgX19mcHJpbnRmX2NoayAoc3RyZWFtLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19WQV9BUkdTX18pCisjIGVuZGlmCisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50Cit2cHJpbnRmIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIF9HX3ZhX2xpc3QgX19hcCkKK3sKKyNpZmRlZiBfX1VTRV9FWFRFUk5fSU5MSU5FUworICByZXR1cm4gX192ZnByaW50Zl9jaGsgKHN0ZG91dCwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX2FwKTsKKyNlbHNlCisgIHJldHVybiBfX3ZwcmludGZfY2hrIChfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsIF9fYXApOworI2VuZGlmCit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50Cit2ZnByaW50ZiAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwKKwkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgX0dfdmFfbGlzdCBfX2FwKQoreworICByZXR1cm4gX192ZnByaW50Zl9jaGsgKF9fc3RyZWFtLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsIF9fYXApOworfQorCisjIGlmZGVmIF9fVVNFX0dOVQorCitleHRlcm4gaW50IF9fYXNwcmludGZfY2hrIChjaGFyICoqX19yZXN0cmljdCBfX3B0ciwgaW50IF9fZmxhZywKKwkJCSAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCA0KSkpIF9fd3VyOworZXh0ZXJuIGludCBfX3Zhc3ByaW50Zl9jaGsgKGNoYXIgKipfX3Jlc3RyaWN0IF9fcHRyLCBpbnQgX19mbGFnLAorCQkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgX0dfdmFfbGlzdCBfX2FyZykKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgMCkpKSBfX3d1cjsKK2V4dGVybiBpbnQgX19kcHJpbnRmX2NoayAoaW50IF9fZmQsIGludCBfX2ZsYWcsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwKKwkJCSAgLi4uKSBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgNCkpKTsKK2V4dGVybiBpbnQgX192ZHByaW50Zl9jaGsgKGludCBfX2ZkLCBpbnQgX19mbGFnLAorCQkJICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCBfR192YV9saXN0IF9fYXJnKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgMCkpKTsKK2V4dGVybiBpbnQgX19vYnN0YWNrX3ByaW50Zl9jaGsgKHN0cnVjdCBvYnN0YWNrICpfX3Jlc3RyaWN0IF9fb2JzdGFjaywKKwkJCQkgaW50IF9fZmxhZywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJCSAuLi4pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDQpKSk7CitleHRlcm4gaW50IF9fb2JzdGFja192cHJpbnRmX2NoayAoc3RydWN0IG9ic3RhY2sgKl9fcmVzdHJpY3QgX19vYnN0YWNrLAorCQkJCSAgaW50IF9fZmxhZywKKwkJCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCQkgIF9HX3ZhX2xpc3QgX19hcmdzKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCAwKSkpOworCisjICBpZmRlZiBfX3ZhX2FyZ19wYWNrCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKGFzcHJpbnRmIChjaGFyICoqX19yZXN0cmljdCBfX3B0ciwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pKQoreworICByZXR1cm4gX19hc3ByaW50Zl9jaGsgKF9fcHRyLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsCisJCQkgX192YV9hcmdfcGFjayAoKSk7Cit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAoX19hc3ByaW50ZiAoY2hhciAqKl9fcmVzdHJpY3QgX19wdHIsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwKKwkJICAgLi4uKSkKK3sKKyAgcmV0dXJuIF9fYXNwcmludGZfY2hrIChfX3B0ciwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LAorCQkJIF9fdmFfYXJnX3BhY2sgKCkpOworfQorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorZHByaW50ZiAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKQoreworICByZXR1cm4gX19kcHJpbnRmX2NoayAoX19mZCwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LAorCQkJX192YV9hcmdfcGFjayAoKSk7Cit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAob2JzdGFja19wcmludGYgKHN0cnVjdCBvYnN0YWNrICpfX3Jlc3RyaWN0IF9fb2JzdGFjaywKKwkJICAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKSkKK3sKKyAgcmV0dXJuIF9fb2JzdGFja19wcmludGZfY2hrIChfX29ic3RhY2ssIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwKKwkJCSAgICAgICBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKyMgIGVsaWYgIWRlZmluZWQgX19jcGx1c3BsdXMKKyMgICBkZWZpbmUgYXNwcmludGYocHRyLCAuLi4pIFwKKyAgX19hc3ByaW50Zl9jaGsgKHB0ciwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fVkFfQVJHU19fKQorIyAgIGRlZmluZSBfX2FzcHJpbnRmKHB0ciwgLi4uKSBcCisgIF9fYXNwcmludGZfY2hrIChwdHIsIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX1ZBX0FSR1NfXykKKyMgICBkZWZpbmUgZHByaW50ZihmZCwgLi4uKSBcCisgIF9fZHByaW50Zl9jaGsgKGZkLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19WQV9BUkdTX18pCisjICAgZGVmaW5lIG9ic3RhY2tfcHJpbnRmKG9ic3RhY2ssIC4uLikgXAorICBfX29ic3RhY2tfcHJpbnRmX2NoayAob2JzdGFjaywgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fVkFfQVJHU19fKQorIyAgZW5kaWYKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIICh2YXNwcmludGYgKGNoYXIgKipfX3Jlc3RyaWN0IF9fcHRyLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsCisJCSAgX0dfdmFfbGlzdCBfX2FwKSkKK3sKKyAgcmV0dXJuIF9fdmFzcHJpbnRmX2NoayAoX19wdHIsIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwgX19hcCk7Cit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50Cit2ZHByaW50ZiAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgX0dfdmFfbGlzdCBfX2FwKQoreworICByZXR1cm4gX192ZHByaW50Zl9jaGsgKF9fZmQsIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwgX19hcCk7Cit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAob2JzdGFja192cHJpbnRmIChzdHJ1Y3Qgb2JzdGFjayAqX19yZXN0cmljdCBfX29ic3RhY2ssCisJCQlfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIF9HX3ZhX2xpc3QgX19hcCkpCit7CisgIHJldHVybiBfX29ic3RhY2tfdnByaW50Zl9jaGsgKF9fb2JzdGFjaywgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LAorCQkJCV9fYXApOworfQorCisjIGVuZGlmCisKKyNlbmRpZgorCitleHRlcm4gY2hhciAqX19nZXRzX2NoayAoY2hhciAqX19zdHIsIHNpemVfdCkgX193dXI7CitleHRlcm4gY2hhciAqX19SRURJUkVDVCAoX19nZXRzX3dhcm4sIChjaGFyICpfX3N0ciksIGdldHMpCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJwbGVhc2UgdXNlIGZnZXRzIG9yIGdldGxpbmUgaW5zdGVhZCwgZ2V0cyBjYW4ndCAiCisJCSAgICAgICAic3BlY2lmeSBidWZmZXIgc2l6ZSIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIGNoYXIgKgorZ2V0cyAoY2hhciAqX19zdHIpCit7CisgIGlmIChfX2JvcyAoX19zdHIpICE9IChzaXplX3QpIC0xKQorICAgIHJldHVybiBfX2dldHNfY2hrIChfX3N0ciwgX19ib3MgKF9fc3RyKSk7CisgIHJldHVybiBfX2dldHNfd2FybiAoX19zdHIpOworfQorCitleHRlcm4gY2hhciAqX19mZ2V0c19jaGsgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19zaXplLCBpbnQgX19uLAorCQkJICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUIChfX2ZnZXRzX2FsaWFzLAorCQkJIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgaW50IF9fbiwKKwkJCSAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksIGZnZXRzKSBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUIChfX2ZnZXRzX2Noa193YXJuLAorCQkJIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fc2l6ZSwgaW50IF9fbiwKKwkJCSAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksIF9fZmdldHNfY2hrKQorICAgICBfX3d1ciBfX3dhcm5hdHRyICgiZmdldHMgY2FsbGVkIHdpdGggYmlnZ2VyIHNpemUgdGhhbiBsZW5ndGggIgorCQkgICAgICAgIm9mIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIGNoYXIgKgorZmdldHMgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBpbnQgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKQoreworICBpZiAoX19ib3MgKF9fcykgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSB8fCBfX24gPD0gMCkKKwlyZXR1cm4gX19mZ2V0c19jaGsgKF9fcywgX19ib3MgKF9fcyksIF9fbiwgX19zdHJlYW0pOworCisgICAgICBpZiAoKHNpemVfdCkgX19uID4gX19ib3MgKF9fcykpCisJcmV0dXJuIF9fZmdldHNfY2hrX3dhcm4gKF9fcywgX19ib3MgKF9fcyksIF9fbiwgX19zdHJlYW0pOworICAgIH0KKyAgcmV0dXJuIF9fZmdldHNfYWxpYXMgKF9fcywgX19uLCBfX3N0cmVhbSk7Cit9CisKK2V4dGVybiBzaXplX3QgX19mcmVhZF9jaGsgKHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3B0cmxlbiwKKwkJCSAgIHNpemVfdCBfX3NpemUsIHNpemVfdCBfX24sCisJCQkgICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSBfX3d1cjsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVCAoX19mcmVhZF9hbGlhcywKKwkJCSAgKHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3NpemUsCisJCQkgICBzaXplX3QgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSwKKwkJCSAgZnJlYWQpIF9fd3VyOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUIChfX2ZyZWFkX2Noa193YXJuLAorCQkJICAodm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fcHRybGVuLAorCQkJICAgc2l6ZV90IF9fc2l6ZSwgc2l6ZV90IF9fbiwKKwkJCSAgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLAorCQkJICBfX2ZyZWFkX2NoaykKKyAgICAgX193dXIgX193YXJuYXR0ciAoImZyZWFkIGNhbGxlZCB3aXRoIGJpZ2dlciBzaXplICogbm1lbWIgdGhhbiBsZW5ndGggIgorCQkgICAgICAgIm9mIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIHNpemVfdAorZnJlYWQgKHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3NpemUsIHNpemVfdCBfX24sCisgICAgICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkKK3sKKyAgaWYgKF9fYm9zMCAoX19wdHIpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fc2l6ZSkKKwkgIHx8ICFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKQorCSAgfHwgKF9fc2l6ZSB8IF9fbikgPj0gKCgoc2l6ZV90KSAxKSA8PCAoOCAqIHNpemVvZiAoc2l6ZV90KSAvIDIpKSkKKwlyZXR1cm4gX19mcmVhZF9jaGsgKF9fcHRyLCBfX2JvczAgKF9fcHRyKSwgX19zaXplLCBfX24sIF9fc3RyZWFtKTsKKworICAgICAgaWYgKF9fc2l6ZSAqIF9fbiA+IF9fYm9zMCAoX19wdHIpKQorCXJldHVybiBfX2ZyZWFkX2Noa193YXJuIChfX3B0ciwgX19ib3MwIChfX3B0ciksIF9fc2l6ZSwgX19uLCBfX3N0cmVhbSk7CisgICAgfQorICByZXR1cm4gX19mcmVhZF9hbGlhcyAoX19wdHIsIF9fc2l6ZSwgX19uLCBfX3N0cmVhbSk7Cit9CisKKyNpZmRlZiBfX1VTRV9HTlUKK2V4dGVybiBjaGFyICpfX2ZnZXRzX3VubG9ja2VkX2NoayAoY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX3NpemUsCisJCQkJICAgaW50IF9fbiwgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgX193dXI7CitleHRlcm4gY2hhciAqX19SRURJUkVDVCAoX19mZ2V0c191bmxvY2tlZF9hbGlhcywKKwkJCSAoY2hhciAqX19yZXN0cmljdCBfX3MsIGludCBfX24sCisJCQkgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLCBmZ2V0c191bmxvY2tlZCkgX193dXI7CitleHRlcm4gY2hhciAqX19SRURJUkVDVCAoX19mZ2V0c191bmxvY2tlZF9jaGtfd2FybiwKKwkJCSAoY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX3NpemUsIGludCBfX24sCisJCQkgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLCBfX2ZnZXRzX3VubG9ja2VkX2NoaykKKyAgICAgX193dXIgX193YXJuYXR0ciAoImZnZXRzX3VubG9ja2VkIGNhbGxlZCB3aXRoIGJpZ2dlciBzaXplIHRoYW4gbGVuZ3RoICIKKwkJICAgICAgICJvZiBkZXN0aW5hdGlvbiBidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX3d1ciBjaGFyICoKK2ZnZXRzX3VubG9ja2VkIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgaW50IF9fbiwgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkKK3sKKyAgaWYgKF9fYm9zIChfX3MpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbikgfHwgX19uIDw9IDApCisJcmV0dXJuIF9fZmdldHNfdW5sb2NrZWRfY2hrIChfX3MsIF9fYm9zIChfX3MpLCBfX24sIF9fc3RyZWFtKTsKKworICAgICAgaWYgKChzaXplX3QpIF9fbiA+IF9fYm9zIChfX3MpKQorCXJldHVybiBfX2ZnZXRzX3VubG9ja2VkX2Noa193YXJuIChfX3MsIF9fYm9zIChfX3MpLCBfX24sIF9fc3RyZWFtKTsKKyAgICB9CisgIHJldHVybiBfX2ZnZXRzX3VubG9ja2VkX2FsaWFzIChfX3MsIF9fbiwgX19zdHJlYW0pOworfQorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9NSVNDCisjIHVuZGVmIGZyZWFkX3VubG9ja2VkCitleHRlcm4gc2l6ZV90IF9fZnJlYWRfdW5sb2NrZWRfY2hrICh2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19wdHJsZW4sCisJCQkJICAgIHNpemVfdCBfX3NpemUsIHNpemVfdCBfX24sCisJCQkJICAgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pIF9fd3VyOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUIChfX2ZyZWFkX3VubG9ja2VkX2FsaWFzLAorCQkJICAodm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fc2l6ZSwKKwkJCSAgIHNpemVfdCBfX24sIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLAorCQkJICBmcmVhZF91bmxvY2tlZCkgX193dXI7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1QgKF9fZnJlYWRfdW5sb2NrZWRfY2hrX3dhcm4sCisJCQkgICh2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19wdHJsZW4sCisJCQkgICBzaXplX3QgX19zaXplLCBzaXplX3QgX19uLAorCQkJICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksCisJCQkgIF9fZnJlYWRfdW5sb2NrZWRfY2hrKQorICAgICBfX3d1ciBfX3dhcm5hdHRyICgiZnJlYWRfdW5sb2NrZWQgY2FsbGVkIHdpdGggYmlnZ2VyIHNpemUgKiBubWVtYiB0aGFuICIKKwkJICAgICAgICJsZW5ndGggb2YgZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgc2l6ZV90CitmcmVhZF91bmxvY2tlZCAodm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fc2l6ZSwgc2l6ZV90IF9fbiwKKwkJRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkKK3sKKyAgaWYgKF9fYm9zMCAoX19wdHIpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fc2l6ZSkKKwkgIHx8ICFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKQorCSAgfHwgKF9fc2l6ZSB8IF9fbikgPj0gKCgoc2l6ZV90KSAxKSA8PCAoOCAqIHNpemVvZiAoc2l6ZV90KSAvIDIpKSkKKwlyZXR1cm4gX19mcmVhZF91bmxvY2tlZF9jaGsgKF9fcHRyLCBfX2JvczAgKF9fcHRyKSwgX19zaXplLCBfX24sCisJCQkJICAgICBfX3N0cmVhbSk7CisKKyAgICAgIGlmIChfX3NpemUgKiBfX24gPiBfX2JvczAgKF9fcHRyKSkKKwlyZXR1cm4gX19mcmVhZF91bmxvY2tlZF9jaGtfd2FybiAoX19wdHIsIF9fYm9zMCAoX19wdHIpLCBfX3NpemUsIF9fbiwKKwkJCQkJICBfX3N0cmVhbSk7CisgICAgfQorCisjIGlmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCisgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19zaXplKQorICAgICAgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKF9fbikKKyAgICAgICYmIChfX3NpemUgfCBfX24pIDwgKCgoc2l6ZV90KSAxKSA8PCAoOCAqIHNpemVvZiAoc2l6ZV90KSAvIDIpKQorICAgICAgJiYgX19zaXplICogX19uIDw9IDgpCisgICAgeworICAgICAgc2l6ZV90IF9fY250ID0gX19zaXplICogX19uOworICAgICAgY2hhciAqX19jcHRyID0gKGNoYXIgKikgX19wdHI7CisgICAgICBpZiAoX19jbnQgPT0gMCkKKwlyZXR1cm4gMDsKKworICAgICAgZm9yICg7IF9fY250ID4gMDsgLS1fX2NudCkKKwl7CisJICBpbnQgX19jID0gX0lPX2dldGNfdW5sb2NrZWQgKF9fc3RyZWFtKTsKKwkgIGlmIChfX2MgPT0gRU9GKQorCSAgICBicmVhazsKKwkgICpfX2NwdHIrKyA9IF9fYzsKKwl9CisgICAgICByZXR1cm4gKF9fY3B0ciAtIChjaGFyICopIF9fcHRyKSAvIF9fc2l6ZTsKKyAgICB9CisjIGVuZGlmCisgIHJldHVybiBfX2ZyZWFkX3VubG9ja2VkX2FsaWFzIChfX3B0ciwgX19zaXplLCBfX24sIF9fc3RyZWFtKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0ZGlvX2xpbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0ZGlvX2xpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZWY2YjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RkaW9fbGltLmgKQEAgLTAsMCArMSw0MyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWYgIWRlZmluZWQgX1NURElPX0ggJiYgIWRlZmluZWQgX19uZWVkX0ZPUEVOX01BWCAmJiAhZGVmaW5lZCBfX25lZWRfSU9WX01BWAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zdGRpb19saW0uaD4gZGlyZWN0bHk7IHVzZSA8c3RkaW8uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmZGVmIF9TVERJT19ICisjIGRlZmluZSBMX3RtcG5hbSAyMAorIyBkZWZpbmUgVE1QX01BWCAyMzgzMjgKKyMgZGVmaW5lIEZJTEVOQU1FX01BWCA0MDk2CisKKyMgaWZkZWYgX19VU0VfUE9TSVgKKyMgIGRlZmluZSBMX2N0ZXJtaWQgOQorIyAgaWYgIWRlZmluZWQgX19VU0VfWE9QRU4ySyB8fCBkZWZpbmVkIF9fVVNFX0dOVQorIyAgIGRlZmluZSBMX2N1c2VyaWQgOQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX25lZWRfRk9QRU5fTUFYIHx8IGRlZmluZWQgX1NURElPX0gKKyMgdW5kZWYgIEZPUEVOX01BWAorIyBkZWZpbmUgRk9QRU5fTUFYIDE2CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19uZWVkX0lPVl9NQVggJiYgIWRlZmluZWQgSU9WX01BWAorIyBkZWZpbmUgSU9WX01BWCAxMDI0CisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGRsaWItbGRibC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0ZGxpYi1sZGJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ4ZTFmNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGRsaWItbGRibC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qIC1tbG9uZy1kb3VibGUtNjQgY29tcGF0aWJpbGl0eSBtb2RlIGZvciA8c3RkbGliLmg+IGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1RETElCX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3RkbGliLWxkYmwuaD4gZGlyZWN0bHk7IHVzZSA8c3RkbGliLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZmRlZglfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorX19MREJMX1JFRElSMV9ERUNMIChzdHJ0b2xkLCBzdHJ0b2QpCitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorX19MREJMX1JFRElSMV9ERUNMIChzdHJ0b2xkX2wsIHN0cnRvZF9sKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorIyBpZmRlZiBfX1VTRV9NSVNDCitfX0xEQkxfUkVESVIxX0RFQ0wgKHFlY3Z0LCBlY3Z0KQorX19MREJMX1JFRElSMV9ERUNMIChxZmN2dCwgZmN2dCkKK19fTERCTF9SRURJUjFfREVDTCAocWdjdnQsIGdjdnQpCitfX0xEQkxfUkVESVIxX0RFQ0wgKHFlY3Z0X3IsIGVjdnRfcikKK19fTERCTF9SRURJUjFfREVDTCAocWZjdnRfciwgZmN2dF9yKQorIyBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RkbGliLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RkbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhZjVlNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdGRsaWIuaApAQCAtMCwwICsxLDE1NiBAQAorLyogQ2hlY2tpbmcgbWFjcm9zIGZvciBzdGRsaWIgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVERMSUJfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zdGRsaWIuaD4gZGlyZWN0bHk7IHVzZSA8c3RkbGliLmg+IGluc3RlYWQuIgorI2VuZGlmCisKK2V4dGVybiBjaGFyICpfX3JlYWxwYXRoX2NoayAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSwKKwkJCSAgICAgY2hhciAqX19yZXN0cmljdCBfX3Jlc29sdmVkLAorCQkJICAgICBzaXplX3QgX19yZXNvbHZlZGxlbikgX19USFJPVyBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUX05USCAoX19yZWFscGF0aF9hbGlhcywKKwkJCSAgICAgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCQkgICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fcmVzb2x2ZWQpLCByZWFscGF0aCkgX193dXI7CitleHRlcm4gY2hhciAqX19SRURJUkVDVF9OVEggKF9fcmVhbHBhdGhfY2hrX3dhcm4sCisJCQkgICAgIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLAorCQkJICAgICAgY2hhciAqX19yZXN0cmljdCBfX3Jlc29sdmVkLAorCQkJICAgICAgc2l6ZV90IF9fcmVzb2x2ZWRsZW4pLCBfX3JlYWxwYXRoX2NoaykgX193dXIKKyAgICAgX193YXJuYXR0ciAoInNlY29uZCBhcmd1bWVudCBvZiByZWFscGF0aCBtdXN0IGJlIGVpdGhlciBOVUxMIG9yIGF0ICIKKwkJICJsZWFzdCBQQVRIX01BWCBieXRlcyBsb25nIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIGNoYXIgKgorX19OVEggKHJlYWxwYXRoIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLCBjaGFyICpfX3Jlc3RyaWN0IF9fcmVzb2x2ZWQpKQoreworICBpZiAoX19ib3MgKF9fcmVzb2x2ZWQpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyNpZiBkZWZpbmVkIF9MSUJDX0xJTUlUU19IXyAmJiBkZWZpbmVkIFBBVEhfTUFYCisgICAgICBpZiAoX19ib3MgKF9fcmVzb2x2ZWQpIDwgUEFUSF9NQVgpCisJcmV0dXJuIF9fcmVhbHBhdGhfY2hrX3dhcm4gKF9fbmFtZSwgX19yZXNvbHZlZCwgX19ib3MgKF9fcmVzb2x2ZWQpKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIF9fcmVhbHBhdGhfY2hrIChfX25hbWUsIF9fcmVzb2x2ZWQsIF9fYm9zIChfX3Jlc29sdmVkKSk7CisgICAgfQorCisgIHJldHVybiBfX3JlYWxwYXRoX2FsaWFzIChfX25hbWUsIF9fcmVzb2x2ZWQpOworfQorCisKK2V4dGVybiBpbnQgX19wdHNuYW1lX3JfY2hrIChpbnQgX19mZCwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICBzaXplX3QgX19ucmVhbCkgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX3B0c25hbWVfcl9hbGlhcywgKGludCBfX2ZkLCBjaGFyICpfX2J1ZiwKKwkJCQkJICAgICAgIHNpemVfdCBfX2J1ZmxlbiksIHB0c25hbWVfcikKKyAgICAgX19ub25udWxsICgoMikpOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX19wdHNuYW1lX3JfY2hrX3dhcm4sCisJCQkgICAoaW50IF9fZmQsIGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4sCisJCQkgICAgc2l6ZV90IF9fbnJlYWwpLCBfX3B0c25hbWVfcl9jaGspCisgICAgIF9fbm9ubnVsbCAoKDIpKSBfX3dhcm5hdHRyICgicHRzbmFtZV9yIGNhbGxlZCB3aXRoIGJ1ZmxlbiBiaWdnZXIgdGhhbiAiCisJCQkJICJzaXplIG9mIGJ1ZiIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKHB0c25hbWVfciAoaW50IF9fZmQsIGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4pKQoreworICBpZiAoX19ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2J1ZmxlbikpCisJcmV0dXJuIF9fcHRzbmFtZV9yX2NoayAoX19mZCwgX19idWYsIF9fYnVmbGVuLCBfX2JvcyAoX19idWYpKTsKKyAgICAgIGlmIChfX2J1ZmxlbiA+IF9fYm9zIChfX2J1ZikpCisJcmV0dXJuIF9fcHRzbmFtZV9yX2Noa193YXJuIChfX2ZkLCBfX2J1ZiwgX19idWZsZW4sIF9fYm9zIChfX2J1ZikpOworICAgIH0KKyAgcmV0dXJuIF9fcHRzbmFtZV9yX2FsaWFzIChfX2ZkLCBfX2J1ZiwgX19idWZsZW4pOworfQorCisKK2V4dGVybiBpbnQgX193Y3RvbWJfY2hrIChjaGFyICpfX3MsIHdjaGFyX3QgX193Y2hhciwgc2l6ZV90IF9fYnVmbGVuKQorICBfX1RIUk9XIF9fd3VyOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX193Y3RvbWJfYWxpYXMsIChjaGFyICpfX3MsIHdjaGFyX3QgX193Y2hhciksCisJCQkgICB3Y3RvbWIpIF9fd3VyOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIGludAorX19OVEggKHdjdG9tYiAoY2hhciAqX19zLCB3Y2hhcl90IF9fd2NoYXIpKQoreworICAvKiBXZSB3b3VsZCBoYXZlIHRvIGluY2x1ZGUgPGxpbWl0cy5oPiB0byBnZXQgYSBkZWZpbml0aW9uIG9mIE1CX0xFTl9NQVguCisgICAgIEJ1dCB0aGlzIHdvdWxkIG9ubHkgZGlzdHVyYiB0aGUgbmFtZXNwYWNlLiAgU28gd2UgZGVmaW5lIG91ciBvd24KKyAgICAgdmVyc2lvbiBoZXJlLiAgKi8KKyNkZWZpbmUgX19TVERMSUJfTUJfTEVOX01BWAkxNgorI2lmIGRlZmluZWQgTUJfTEVOX01BWCAmJiBNQl9MRU5fTUFYICE9IF9fU1RETElCX01CX0xFTl9NQVgKKyMgZXJyb3IgIkFzc3VtZWQgdmFsdWUgb2YgTUJfTEVOX01BWCB3cm9uZyIKKyNlbmRpZgorICBpZiAoX19ib3MgKF9fcykgIT0gKHNpemVfdCkgLTEgJiYgX19TVERMSUJfTUJfTEVOX01BWCA+IF9fYm9zIChfX3MpKQorICAgIHJldHVybiBfX3djdG9tYl9jaGsgKF9fcywgX193Y2hhciwgX19ib3MgKF9fcykpOworICByZXR1cm4gX193Y3RvbWJfYWxpYXMgKF9fcywgX193Y2hhcik7Cit9CisKKworZXh0ZXJuIHNpemVfdCBfX21ic3Rvd2NzX2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgIHNpemVfdCBfX2xlbiwgc2l6ZV90IF9fZHN0bGVuKSBfX1RIUk9XOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX19tYnN0b3djc19hbGlhcywKKwkJCSAgICAgICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgICBzaXplX3QgX19sZW4pLCBtYnN0b3djcyk7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX21ic3Rvd2NzX2Noa193YXJuLAorCQkJICAgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiwgc2l6ZV90IF9fZHN0bGVuKSwgX19tYnN0b3djc19jaGspCisgICAgIF9fd2FybmF0dHIgKCJtYnN0b3djcyBjYWxsZWQgd2l0aCBkc3QgYnVmZmVyIHNtYWxsZXIgdGhhbiBsZW4gIgorCQkgIiogc2l6ZW9mICh3Y2hhcl90KSIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHNpemVfdAorX19OVEggKG1ic3Rvd2NzICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMsCisJCSBzaXplX3QgX19sZW4pKQoreworICBpZiAoX19ib3MgKF9fZHN0KSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2xlbikpCisJcmV0dXJuIF9fbWJzdG93Y3NfY2hrIChfX2RzdCwgX19zcmMsIF9fbGVuLAorCQkJICAgICAgIF9fYm9zIChfX2RzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKworICAgICAgaWYgKF9fbGVuID4gX19ib3MgKF9fZHN0KSAvIHNpemVvZiAod2NoYXJfdCkpCisJcmV0dXJuIF9fbWJzdG93Y3NfY2hrX3dhcm4gKF9fZHN0LCBfX3NyYywgX19sZW4sCisJCQkJICAgICBfX2JvcyAoX19kc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX19tYnN0b3djc19hbGlhcyAoX19kc3QsIF9fc3JjLCBfX2xlbik7Cit9CisKKworZXh0ZXJuIHNpemVfdCBfX3djc3RvbWJzX2NoayAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgIHNpemVfdCBfX2xlbiwgc2l6ZV90IF9fZHN0bGVuKSBfX1RIUk9XOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX193Y3N0b21ic19hbGlhcywKKwkJCSAgICAgIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgICBzaXplX3QgX19sZW4pLCB3Y3N0b21icyk7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3djc3RvbWJzX2Noa193YXJuLAorCQkJICAgICAgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiwgc2l6ZV90IF9fZHN0bGVuKSwgX193Y3N0b21ic19jaGspCisgICAgIF9fd2FybmF0dHIgKCJ3Y3N0b21icyBjYWxsZWQgd2l0aCBkc3QgYnVmZmVyIHNtYWxsZXIgdGhhbiBsZW4iKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBzaXplX3QKK19fTlRIICh3Y3N0b21icyAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkgc2l6ZV90IF9fbGVuKSkKK3sKKyAgaWYgKF9fYm9zIChfX2RzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19sZW4pKQorCXJldHVybiBfX3djc3RvbWJzX2NoayAoX19kc3QsIF9fc3JjLCBfX2xlbiwgX19ib3MgKF9fZHN0KSk7CisgICAgICBpZiAoX19sZW4gPiBfX2JvcyAoX19kc3QpKQorCXJldHVybiBfX3djc3RvbWJzX2Noa193YXJuIChfX2RzdCwgX19zcmMsIF9fbGVuLCBfX2JvcyAoX19kc3QpKTsKKyAgICB9CisgIHJldHVybiBfX3djc3RvbWJzX2FsaWFzIChfX2RzdCwgX19zcmMsIF9fbGVuKTsKK30KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdHJpbmcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjhjMTA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0cmluZy5oCkBAIC0wLDAgKzEsMTk3NSBAQAorLyogT3B0aW1pemVkLCBpbmxpbmVkIHN0cmluZyBmdW5jdGlvbnMuICBpNDg2IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDMsMjAwNCwyMDA3LDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVFJJTkdfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL3N0cmluZy5oPiBkaXJlY3RseTsgaW5jbHVkZSA8c3RyaW5nLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIFRoZSBpeDg2IHByb2Nlc3NvcnMgY2FuIGFjY2VzcyB1bmFsaWduZWQgbXVsdGktYnl0ZSB2YXJpYWJsZXMuICAqLworI2RlZmluZSBfU1RSSU5HX0FSQ0hfdW5hbGlnbmVkCTEKKworCisvKiBXZSBvbmx5IHByb3ZpZGUgb3B0aW1pemF0aW9ucyBpZiB0aGUgdXNlciBzZWxlY3RzIHRoZW0gYW5kIGlmCisgICBHTlUgQ0MgaXMgdXNlZC4gICovCisjaWYgIWRlZmluZWQgX19OT19TVFJJTkdfSU5MSU5FUyAmJiBkZWZpbmVkIF9fVVNFX1NUUklOR19JTkxJTkVTIFwKKyAgICAmJiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIgJiYgIV9fQk9VTkRFRF9QT0lOVEVSU19fCisKKyNpZm5kZWYgX19TVFJJTkdfSU5MSU5FCisjIGlmbmRlZiBfX2V4dGVybl9pbmxpbmUKKyMgIGRlZmluZSBfX1NUUklOR19JTkxJTkUgaW5saW5lCisjIGVsc2UKKyMgIGRlZmluZSBfX1NUUklOR19JTkxJTkUgX19leHRlcm5faW5saW5lCisjIGVuZGlmCisjZW5kaWYKKworLyogVGhlIG1hY3JvcyBhcmUgdXNlZCBpbiBzb21lIG9mIHRoZSBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb25zIGJlbG93LiAgKi8KKyNkZWZpbmUgX19TVFJJTkdfU01BTExfR0VUMTYoc3JjLCBpZHgpIFwKKyAgKCgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoc3JjKSlbaWR4ICsgMV0gPDwgOCkJCQkgICAgICBcCisgICB8ICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChzcmMpKVtpZHhdKQorI2RlZmluZSBfX1NUUklOR19TTUFMTF9HRVQzMihzcmMsIGlkeCkgXAorICAoKCgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoc3JjKSlbaWR4ICsgM10gPDwgOAkJCSAgICAgIFwKKyAgICAgfCAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoc3JjKSlbaWR4ICsgMl0pIDw8IDgJCQkgICAgICBcCisgICAgfCAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoc3JjKSlbaWR4ICsgMV0pIDw8IDgJCQkgICAgICBcCisgICB8ICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChzcmMpKVtpZHhdKQorCisKKy8qIENvcHkgTiBieXRlcyBvZiBTUkMgdG8gREVTVC4gICovCisjZGVmaW5lIF9IQVZFX1NUUklOR19BUkNIX21lbWNweSAxCisjZGVmaW5lIG1lbWNweShkZXN0LCBzcmMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChuKQkJCQkgICAgICBcCisJCSAgPyBfX21lbWNweV9jICgoZGVzdCksIChzcmMpLCAobikpCQkJICAgICAgXAorCQkgIDogX19tZW1jcHlfZyAoKGRlc3QpLCAoc3JjKSwgKG4pKSkpCisjZGVmaW5lIF9fbWVtY3B5X2MoZGVzdCwgc3JjLCBuKSBcCisgICgobikgPT0gMAkJCQkJCQkJICAgICAgXAorICAgPyAoZGVzdCkJCQkJCQkJCSAgICAgIFwKKyAgIDogKCgobikgJSA0ID09IDApCQkJCQkJCSAgICAgIFwKKyAgICAgID8gX19tZW1jcHlfYnk0IChkZXN0LCBzcmMsIG4pCQkJCQkgICAgICBcCisgICAgICA6ICgoKG4pICUgMiA9PSAwKQkJCQkJCQkgICAgICBcCisJID8gX19tZW1jcHlfYnkyIChkZXN0LCBzcmMsIG4pCQkJCQkgICAgICBcCisJIDogX19tZW1jcHlfZyAoZGVzdCwgc3JjLCBuKSkpKQorCitfX1NUUklOR19JTkxJTkUgdm9pZCAqX19tZW1jcHlfYnk0ICh2b2lkICpfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqX19zcmMsCisJCQkJICAgIHNpemVfdCBfX24pOworCitfX1NUUklOR19JTkxJTkUgdm9pZCAqCitfX21lbWNweV9ieTQgKHZvaWQgKl9fZGVzdCwgX19jb25zdCB2b2lkICpfX3NyYywgc2l6ZV90IF9fbikKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMCwgX19kMTsKKyAgcmVnaXN0ZXIgdm9pZCAqX190bXAgPSBfX2Rlc3Q7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCIxOlxuXHQiCisgICAgICJtb3ZsCSglMiksJTBcblx0IgorICAgICAibGVhbAk0KCUyKSwlMlxuXHQiCisgICAgICJtb3ZsCSUwLCglMSlcblx0IgorICAgICAibGVhbAk0KCUxKSwlMVxuXHQiCisgICAgICJkZWNsCSUzXG5cdCIKKyAgICAgImpuegkxYiIKKyAgICAgOiAiPSZyIiAoX19kMCksICI9JnIiIChfX3RtcCksICI9JnIiIChfX3NyYyksICI9JnIiIChfX2QxKQorICAgICA6ICIxIiAoX190bXApLCAiMiIgKF9fc3JjKSwgIjMiIChfX24gLyA0KQorICAgICA6ICJtZW1vcnkiLCAiY2MiKTsKKyAgcmV0dXJuIF9fZGVzdDsKK30KKworX19TVFJJTkdfSU5MSU5FIHZvaWQgKl9fbWVtY3B5X2J5MiAodm9pZCAqX19kZXN0LCBfX2NvbnN0IHZvaWQgKl9fc3JjLAorCQkJCSAgICBzaXplX3QgX19uKTsKKworX19TVFJJTkdfSU5MSU5FIHZvaWQgKgorX19tZW1jcHlfYnkyICh2b2lkICpfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqX19zcmMsIHNpemVfdCBfX24pCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDAsIF9fZDE7CisgIHJlZ2lzdGVyIHZvaWQgKl9fdG1wID0gX19kZXN0OworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgic2hybAkkMSwlM1xuXHQiCisgICAgICJqegkyZlxuIiAgICAgICAgICAgICAgICAgLyogb25seSBhIHdvcmQgKi8KKyAgICAgIjE6XG5cdCIKKyAgICAgIm1vdmwJKCUyKSwlMFxuXHQiCisgICAgICJsZWFsCTQoJTIpLCUyXG5cdCIKKyAgICAgIm1vdmwJJTAsKCUxKVxuXHQiCisgICAgICJsZWFsCTQoJTEpLCUxXG5cdCIKKyAgICAgImRlY2wJJTNcblx0IgorICAgICAiam56CTFiXG4iCisgICAgICIyOlxuXHQiCisgICAgICJtb3Z3CSglMiksJXcwXG5cdCIKKyAgICAgIm1vdncJJXcwLCglMSkiCisgICAgIDogIj0mcSIgKF9fZDApLCAiPSZyIiAoX190bXApLCAiPSZyIiAoX19zcmMpLCAiPSZyIiAoX19kMSkKKyAgICAgOiAiMSIgKF9fdG1wKSwgIjIiIChfX3NyYyksICIzIiAoX19uIC8gMikKKyAgICAgOiAibWVtb3J5IiwgImNjIik7CisgIHJldHVybiBfX2Rlc3Q7Cit9CisKK19fU1RSSU5HX0lOTElORSB2b2lkICpfX21lbWNweV9nICh2b2lkICpfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqX19zcmMsCisJCQkJICBzaXplX3QgX19uKTsKKworX19TVFJJTkdfSU5MSU5FIHZvaWQgKgorX19tZW1jcHlfZyAodm9pZCAqX19kZXN0LCBfX2NvbnN0IHZvaWQgKl9fc3JjLCBzaXplX3QgX19uKQoreworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwLCBfX2QxLCBfX2QyOworICByZWdpc3RlciB2b2lkICpfX3RtcCA9IF9fZGVzdDsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoImNsZFxuXHQiCisgICAgICJzaHJsCSQxLCUlZWN4XG5cdCIKKyAgICAgImpuYwkxZlxuXHQiCisgICAgICJtb3ZzYlxuIgorICAgICAiMTpcblx0IgorICAgICAic2hybAkkMSwlJWVjeFxuXHQiCisgICAgICJqbmMJMmZcblx0IgorICAgICAibW92c3dcbiIKKyAgICAgIjI6XG5cdCIKKyAgICAgInJlcDsgbW92c2wiCisgICAgIDogIj0mYyIgKF9fZDApLCAiPSZEIiAoX19kMSksICI9JlMiIChfX2QyKSwKKyAgICAgICAiPW0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fbl07IH0gKilfX2Rlc3QpCisgICAgIDogIjAiIChfX24pLCAiMSIgKF9fdG1wKSwgIjIiIChfX3NyYyksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fbl07IH0gKilfX3NyYykKKyAgICAgOiAiY2MiKTsKKyAgcmV0dXJuIF9fZGVzdDsKK30KKworI2RlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9tZW1tb3ZlIDEKKyNpZm5kZWYgX0ZPUkNFX0lOTElORVMKKy8qIENvcHkgTiBieXRlcyBvZiBTUkMgdG8gREVTVCwgZ3VhcmFudGVlaW5nCisgICBjb3JyZWN0IGJlaGF2aW9yIGZvciBvdmVybGFwcGluZyBzdHJpbmdzLiAgKi8KKyNkZWZpbmUgbWVtbW92ZShkZXN0LCBzcmMsIG4pIF9fbWVtbW92ZV9nIChkZXN0LCBzcmMsIG4pCisKK19fU1RSSU5HX0lOTElORSB2b2lkICpfX21lbW1vdmVfZyAodm9pZCAqLCBfX2NvbnN0IHZvaWQgKiwgc2l6ZV90KQorICAgICBfX2FzbV9fICgibWVtbW92ZSIpOworCitfX1NUUklOR19JTkxJTkUgdm9pZCAqCitfX21lbW1vdmVfZyAodm9pZCAqX19kZXN0LCBfX2NvbnN0IHZvaWQgKl9fc3JjLCBzaXplX3QgX19uKQoreworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwLCBfX2QxLCBfX2QyOworICByZWdpc3RlciB2b2lkICpfX3RtcCA9IF9fZGVzdDsKKyAgaWYgKF9fZGVzdCA8IF9fc3JjKQorICAgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgICAoImNsZFxuXHQiCisgICAgICAgInJlcDsgbW92c2IiCisgICAgICAgOiAiPSZjIiAoX19kMCksICI9JlMiIChfX2QxKSwgIj0mRCIgKF9fZDIpLAorCSAiPW0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fbl07IH0gKilfX2Rlc3QpCisgICAgICAgOiAiMCIgKF9fbiksICIxIiAoX19zcmMpLCAiMiIgKF9fdG1wKSwKKwkgIm0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fbl07IH0gKilfX3NyYykpOworICBlbHNlCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAgICgic3RkXG5cdCIKKyAgICAgICAicmVwOyBtb3ZzYlxuXHQiCisgICAgICAgImNsZCIKKyAgICAgICA6ICI9JmMiIChfX2QwKSwgIj0mUyIgKF9fZDEpLCAiPSZEIiAoX19kMiksCisJICI9bSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19uXTsgfSAqKV9fZGVzdCkKKyAgICAgICA6ICIwIiAoX19uKSwgIjEiIChfX24gLSAxICsgKF9fY29uc3QgY2hhciAqKSBfX3NyYyksCisJICIyIiAoX19uIC0gMSArIChjaGFyICopIF9fdG1wKSwKKwkgIm0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fbl07IH0gKilfX3NyYykpOworICByZXR1cm4gX19kZXN0OworfQorI2VuZGlmCisKKy8qIENvbXBhcmUgTiBieXRlcyBvZiBTMSBhbmQgUzIuICAqLworI2RlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9tZW1jbXAgMQorI2lmbmRlZiBfRk9SQ0VfSU5MSU5FUworIyBpZm5kZWYgX19QSUNfXworLyogZ2NjIGhhcyBwcm9ibGVtcyB0byBzcGlsbCByZWdpc3RlcnMgd2hlbiB1c2luZyBQSUMuICAqLworX19TVFJJTkdfSU5MSU5FIGludAorbWVtY21wIChfX2NvbnN0IHZvaWQgKl9fczEsIF9fY29uc3Qgdm9pZCAqX19zMiwgc2l6ZV90IF9fbikKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMCwgX19kMSwgX19kMjsKKyAgcmVnaXN0ZXIgaW50IF9fcmVzOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiY2xkXG5cdCIKKyAgICAgInRlc3RsICUzLCUzXG5cdCIKKyAgICAgInJlcGU7IGNtcHNiXG5cdCIKKyAgICAgImplCTFmXG5cdCIKKyAgICAgInNiYmwJJTAsJTBcblx0IgorICAgICAib3JsCSQxLCUwXG4iCisgICAgICIxOiIKKyAgICAgOiAiPSZhIiAoX19yZXMpLCAiPSZTIiAoX19kMCksICI9JkQiIChfX2QxKSwgIj0mYyIgKF9fZDIpCisgICAgIDogIjAiICgwKSwgIjEiIChfX3MxKSwgIjIiIChfX3MyKSwgIjMiIChfX24pLAorICAgICAgICJtIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX25dOyB9ICopX19zMSksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fbl07IH0gKilfX3MyKQorICAgICA6ICJjYyIpOworICByZXR1cm4gX19yZXM7Cit9CisjIGVuZGlmCisjZW5kaWYKKworLyogU2V0IE4gYnl0ZXMgb2YgUyB0byBDLiAgKi8KKyNkZWZpbmUgX0hBVkVfU1RSSU5HX0FSQ0hfbWVtc2V0IDEKKyNkZWZpbmUgX1VTRV9TVFJJTkdfQVJDSF9tZW1zZXQgMQorI2RlZmluZSBtZW1zZXQocywgYywgbikgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKG4pICYmIChuKSA8PSAxNgkJCSAgICAgIFwKKwkJICA/ICgobikgPT0gMQkJCQkJCSAgICAgIFwKKwkJICAgICA/IF9fbWVtc2V0X2MxICgocyksIChjKSkJCQkJICAgICAgXAorCQkgICAgIDogX19tZW1zZXRfZ2MgKChzKSwgKGMpLCAobikpKQkJCSAgICAgIFwKKwkJICA6IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYykJCQkJICAgICAgXAorCQkgICAgID8gKF9fYnVpbHRpbl9jb25zdGFudF9wIChuKQkJCSAgICAgIFwKKwkJCT8gX19tZW1zZXRfY2NuICgocyksIChjKSwgKG4pKQkJCSAgICAgIFwKKwkJCTogbWVtc2V0ICgocyksIChjKSwgKG4pKSkJCQkgICAgICBcCisJCSAgICAgOiAoX19idWlsdGluX2NvbnN0YW50X3AgKG4pCQkJICAgICAgXAorCQkJPyBfX21lbXNldF9nY24gKChzKSwgKGMpLCAobikpCQkJICAgICAgXAorCQkJOiBtZW1zZXQgKChzKSwgKGMpLCAobikpKSkpKQorCisjZGVmaW5lIF9fbWVtc2V0X2MxKHMsIGMpICh7IHZvaWQgKl9fcyA9IChzKTsJCQkJICAgICAgXAorCQkJICAgICAqKCh1bnNpZ25lZCBjaGFyICopIF9fcykgPSAodW5zaWduZWQgY2hhcikgKGMpOyAgXAorCQkJICAgICBfX3M7IH0pCisKKyNkZWZpbmUgX19tZW1zZXRfZ2MocywgYywgbikgXAorICAoeyB2b2lkICpfX3MgPSAocyk7CQkJCQkJCSAgICAgIFwKKyAgICAgdW5pb24gewkJCQkJCQkJICAgICAgXAorICAgICAgIHVuc2lnbmVkIGludCBfX3VpOwkJCQkJCSAgICAgIFwKKyAgICAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX191c2k7CQkJCQkgICAgICBcCisgICAgICAgdW5zaWduZWQgY2hhciBfX3VjOwkJCQkJCSAgICAgIFwKKyAgICAgfSAqX191ID0gX19zOwkJCQkJCQkgICAgICBcCisgICAgIHVuc2lnbmVkIGludCBfX2MgPSAoKHVuc2lnbmVkIGludCkgKCh1bnNpZ25lZCBjaGFyKSAoYykpKSAqIDB4MDEwMTAxMDE7ICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgIC8qIFdlIGFwcGx5IGEgdHJpY2sgaGVyZS4gIGBnY2MnIHdvdWxkIGltcGxlbWVudCB0aGUgZm9sbG93aW5nCSAgICAgIFwKKwlhc3NpZ25tZW50cyB1c2luZyBpbW1lZGlhdGUgb3BlcmFuZHMuICBCdXQgdGhpcyB1c2VzIHRvIG11Y2gJICAgICAgXAorCW1lbW9yeSAoNywgaW5zdGVhZCBvZiA0IGJ5dGVzKS4gIFNvIHdlIGZvcmNlIHRoZSB2YWx1ZSBpbiBhCSAgICAgIFwKKwlyZWdpc3RlcnMuICAqLwkJCQkJCQkgICAgICBcCisgICAgIGlmICgobikgPT0gMyB8fCAobikgPj0gNSkJCQkJCQkgICAgICBcCisgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCIiIDogIj1yIiAoX19jKSA6ICIwIiAoX19jKSk7CQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgIC8qIFRoaXMgYHN3aXRjaCcgc3RhdGVtZW50IHdpbGwgYmUgcmVtb3ZlZCBhdCBjb21waWxlLXRpbWUuICAqLwkgICAgICBcCisgICAgIHN3aXRjaCAobikJCQkJCQkJCSAgICAgIFwKKyAgICAgICB7CQkJCQkJCQkgICAgICBcCisgICAgICAgY2FzZSAxNToJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jOwkJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgMTE6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYzsJCQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDc6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYzsJCQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDM6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191c2kgPSAodW5zaWduZWQgc2hvcnQgaW50KSBfX2M7CQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMik7CQkJICAgICAgXAorCSBfX3UtPl9fdWMgPSAodW5zaWduZWQgY2hhcikgX19jOwkJCQkgICAgICBcCisJIGJyZWFrOwkJCQkJCQkJICAgICAgXAorCQkJCQkJCQkJICAgICAgXAorICAgICAgIGNhc2UgMTQ6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYzsJCQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDEwOgkJCQkJCQkJICAgICAgXAorCSBfX3UtPl9fdWkgPSBfX2M7CQkJCQkJICAgICAgXAorCSBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsJCQkgICAgICBcCisgICAgICAgY2FzZSA2OgkJCQkJCQkJICAgICAgXAorCSBfX3UtPl9fdWkgPSBfX2M7CQkJCQkJICAgICAgXAorCSBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsJCQkgICAgICBcCisgICAgICAgY2FzZSAyOgkJCQkJCQkJICAgICAgXAorCSBfX3UtPl9fdXNpID0gKHVuc2lnbmVkIHNob3J0IGludCkgX19jOwkJCQkgICAgICBcCisJIGJyZWFrOwkJCQkJCQkJICAgICAgXAorCQkJCQkJCQkJICAgICAgXAorICAgICAgIGNhc2UgMTM6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYzsJCQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDk6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYzsJCQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDU6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYzsJCQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDE6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191YyA9ICh1bnNpZ25lZCBjaGFyKSBfX2M7CQkJCSAgICAgIFwKKwkgYnJlYWs7CQkJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgICAgY2FzZSAxNjoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jOwkJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgMTI6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYzsJCQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDg6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYzsJCQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDQ6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYzsJCQkJCQkgICAgICBcCisgICAgICAgY2FzZSAwOgkJCQkJCQkJICAgICAgXAorCSBicmVhazsJCQkJCQkJCSAgICAgIFwKKyAgICAgICB9CQkJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgIF9fczsgfSkKKworI2RlZmluZSBfX21lbXNldF9jY24ocywgYywgbikgXAorICAoKChuKSAlIDQgPT0gMCkJCQkJCQkJICAgICAgXAorICAgPyBfX21lbXNldF9jY25fYnk0IChzLCAoKHVuc2lnbmVkIGludCkgKCh1bnNpZ25lZCBjaGFyKSAoYykpKSAqIDB4MDEwMTAxMDEsXAorCQkgICAgICAgbikJCQkJCQkgICAgICBcCisgICA6ICgoKG4pICUgMiA9PSAwKQkJCQkJCQkgICAgICBcCisgICAgICA/IF9fbWVtc2V0X2Njbl9ieTIgKHMsCQkJCQkJICAgICAgXAorCQkJICAoKHVuc2lnbmVkIGludCkgKCh1bnNpZ25lZCBjaGFyKSAoYykpKSAqIDB4MDEwMTAxMDEsXAorCQkJICAgbikJCQkJCQkgICAgICBcCisgICAgICA6IG1lbXNldCAocywgYywgbikpKQorCitfX1NUUklOR19JTkxJTkUgdm9pZCAqX19tZW1zZXRfY2NuX2J5NCAodm9pZCAqX19zLCB1bnNpZ25lZCBpbnQgX19jLAorCQkJCQlzaXplX3QgX19uKTsKKworX19TVFJJTkdfSU5MSU5FIHZvaWQgKgorX19tZW1zZXRfY2NuX2J5NCAodm9pZCAqX19zLCB1bnNpZ25lZCBpbnQgX19jLCBzaXplX3QgX19uKQoreworICByZWdpc3RlciB2b2lkICpfX3RtcCA9IF9fczsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMDsKKyNpZmRlZiBfX2k2ODZfXworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiY2xkXG5cdCIKKyAgICAgInJlcDsgc3Rvc2wiCisgICAgIDogIj0mYSIgKF9fYyksICI9JkQiIChfX3RtcCksICI9JmMiIChfX2QwKSwKKyAgICAgICAiPW0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fbl07IH0gKilfX3MpCisgICAgIDogIjAiICgodW5zaWduZWQgaW50KSBfX2MpLCAiMSIgKF9fdG1wKSwgIjIiIChfX24gLyA0KQorICAgICA6ICJjYyIpOworI2Vsc2UKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoIjE6XG5cdCIKKyAgICAgIm1vdmwJJTAsKCUxKVxuXHQiCisgICAgICJhZGRsCSQ0LCUxXG5cdCIKKyAgICAgImRlY2wJJTJcblx0IgorICAgICAiam56CTFiXG4iCisgICAgIDogIj0mciIgKF9fYyksICI9JnIiIChfX3RtcCksICI9JnIiIChfX2QwKSwKKyAgICAgICAiPW0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fbl07IH0gKilfX3MpCisgICAgIDogIjAiICgodW5zaWduZWQgaW50KSBfX2MpLCAiMSIgKF9fdG1wKSwgIjIiIChfX24gLyA0KQorICAgICA6ICJjYyIpOworI2VuZGlmCisgIHJldHVybiBfX3M7Cit9CisKK19fU1RSSU5HX0lOTElORSB2b2lkICpfX21lbXNldF9jY25fYnkyICh2b2lkICpfX3MsIHVuc2lnbmVkIGludCBfX2MsCisJCQkJCXNpemVfdCBfX24pOworCitfX1NUUklOR19JTkxJTkUgdm9pZCAqCitfX21lbXNldF9jY25fYnkyICh2b2lkICpfX3MsIHVuc2lnbmVkIGludCBfX2MsIHNpemVfdCBfX24pCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDAsIF9fZDE7CisgIHJlZ2lzdGVyIHZvaWQgKl9fdG1wID0gX19zOworI2lmZGVmIF9faTY4Nl9fCisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJjbGRcblx0IgorICAgICAicmVwOyBzdG9zbFxuIgorICAgICAic3Rvc3ciCisgICAgIDogIj0mYSIgKF9fZDApLCAiPSZEIiAoX190bXApLCAiPSZjIiAoX19kMSksCisgICAgICAgIj1tIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX25dOyB9ICopX19zKQorICAgICA6ICIwIiAoKHVuc2lnbmVkIGludCkgX19jKSwgIjEiIChfX3RtcCksICIyIiAoX19uIC8gNCkKKyAgICAgOiAiY2MiKTsKKyNlbHNlCisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCIxOlx0bW92bAklMCwoJTEpXG5cdCIKKyAgICAgImxlYWwJNCglMSksJTFcblx0IgorICAgICAiZGVjbAklMlxuXHQiCisgICAgICJqbnoJMWJcbiIKKyAgICAgIm1vdncJJXcwLCglMSkiCisgICAgIDogIj0mcSIgKF9fZDApLCAiPSZyIiAoX190bXApLCAiPSZyIiAoX19kMSksCisgICAgICAgIj1tIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX25dOyB9ICopX19zKQorICAgICA6ICIwIiAoKHVuc2lnbmVkIGludCkgX19jKSwgIjEiIChfX3RtcCksICIyIiAoX19uIC8gNCkKKyAgICAgOiAiY2MiKTsKKyNlbmRpZgorICByZXR1cm4gX19zOworfQorCisjZGVmaW5lIF9fbWVtc2V0X2djbihzLCBjLCBuKSBcCisgICgoKG4pICUgNCA9PSAwKQkJCQkJCQkgICAgICBcCisgICA/IF9fbWVtc2V0X2djbl9ieTQgKHMsIGMsIG4pCQkJCQkJICAgICAgXAorICAgOiAoKChuKSAlIDIgPT0gMCkJCQkJCQkJICAgICAgXAorICAgICAgPyBfX21lbXNldF9nY25fYnkyIChzLCBjLCBuKQkJCQkJICAgICAgXAorICAgICAgOiBtZW1zZXQgKHMsIGMsIG4pKSkKKworX19TVFJJTkdfSU5MSU5FIHZvaWQgKl9fbWVtc2V0X2djbl9ieTQgKHZvaWQgKl9fcywgaW50IF9fYywgc2l6ZV90IF9fbik7CisKK19fU1RSSU5HX0lOTElORSB2b2lkICoKK19fbWVtc2V0X2djbl9ieTQgKHZvaWQgKl9fcywgaW50IF9fYywgc2l6ZV90IF9fbikKK3sKKyAgcmVnaXN0ZXIgdm9pZCAqX190bXAgPSBfX3M7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDA7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJtb3ZiCSViMCwlaDBcbiIKKyAgICAgInB1c2h3CSV3MFxuXHQiCisgICAgICJzaGxsCSQxNiwlMFxuXHQiCisgICAgICJwb3B3CSV3MFxuIgorICAgICAiMTpcblx0IgorICAgICAibW92bAklMCwoJTEpXG5cdCIKKyAgICAgImFkZGwJJDQsJTFcblx0IgorICAgICAiZGVjbAklMlxuXHQiCisgICAgICJqbnoJMWJcbiIKKyAgICAgOiAiPSZxIiAoX19jKSwgIj0mciIgKF9fdG1wKSwgIj0mciIgKF9fZDApLAorICAgICAgICI9bSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19uXTsgfSAqKV9fcykKKyAgICAgOiAiMCIgKCh1bnNpZ25lZCBpbnQpIF9fYyksICIxIiAoX190bXApLCAiMiIgKF9fbiAvIDQpCisgICAgIDogImNjIik7CisgIHJldHVybiBfX3M7Cit9CisKK19fU1RSSU5HX0lOTElORSB2b2lkICpfX21lbXNldF9nY25fYnkyICh2b2lkICpfX3MsIGludCBfX2MsIHNpemVfdCBfX24pOworCitfX1NUUklOR19JTkxJTkUgdm9pZCAqCitfX21lbXNldF9nY25fYnkyICh2b2lkICpfX3MsIGludCBfX2MsIHNpemVfdCBfX24pCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDAsIF9fZDE7CisgIHJlZ2lzdGVyIHZvaWQgKl9fdG1wID0gX19zOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgibW92YgklYjAsJWgwXG5cdCIKKyAgICAgInB1c2h3CSV3MFxuXHQiCisgICAgICJzaGxsCSQxNiwlMFxuXHQiCisgICAgICJwb3B3CSV3MFxuIgorICAgICAiMTpcblx0IgorICAgICAibW92bAklMCwoJTEpXG5cdCIKKyAgICAgImxlYWwJNCglMSksJTFcblx0IgorICAgICAiZGVjbAklMlxuXHQiCisgICAgICJqbnoJMWJcbiIKKyAgICAgIm1vdncJJXcwLCglMSkiCisgICAgIDogIj0mcSIgKF9fZDApLCAiPSZyIiAoX190bXApLCAiPSZyIiAoX19kMSksCisgICAgICAgIj1tIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX25dOyB9ICopX19zKQorICAgICA6ICIwIiAoKHVuc2lnbmVkIGludCkgX19jKSwgIjEiIChfX3RtcCksICIyIiAoX19uIC8gNCkKKyAgICAgOiAiY2MiKTsKKyAgcmV0dXJuIF9fczsKK30KKworCisvKiBTZWFyY2ggTiBieXRlcyBvZiBTIGZvciBDLiAgKi8KKyNkZWZpbmUgX0hBVkVfU1RSSU5HX0FSQ0hfbWVtY2hyIDEKKyNpZm5kZWYgX0ZPUkNFX0lOTElORVMKK19fU1RSSU5HX0lOTElORSB2b2lkICoKK21lbWNociAoX19jb25zdCB2b2lkICpfX3MsIGludCBfX2MsIHNpemVfdCBfX24pCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDA7CisjaWZkZWYgX19pNjg2X18KKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMTsKKyNlbmRpZgorICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpfX3JlczsKKyAgaWYgKF9fbiA9PSAwKQorICAgIHJldHVybiBOVUxMOworI2lmZGVmIF9faTY4Nl9fCisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJjbGRcblx0IgorICAgICAicmVwbmU7IHNjYXNiXG5cdCIKKyAgICAgImNtb3ZuZSAlMiwlMCIKKyAgICAgOiAiPUQiIChfX3JlcyksICI9JmMiIChfX2QwKSwgIj0mciIgKF9fZDEpCisgICAgIDogImEiIChfX2MpLCAiMCIgKF9fcyksICIxIiAoX19uKSwgIjIiICgxKSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19uXTsgfSAqKV9fcykKKyAgICAgOiAiY2MiKTsKKyNlbHNlCisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJjbGRcblx0IgorICAgICAicmVwbmU7IHNjYXNiXG5cdCIKKyAgICAgImplCTFmXG5cdCIKKyAgICAgIm1vdmwJJDEsJTBcbiIKKyAgICAgIjE6IgorICAgICA6ICI9RCIgKF9fcmVzKSwgIj0mYyIgKF9fZDApCisgICAgIDogImEiIChfX2MpLCAiMCIgKF9fcyksICIxIiAoX19uKSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19uXTsgfSAqKV9fcykKKyAgICAgOiAiY2MiKTsKKyNlbmRpZgorICByZXR1cm4gX19yZXMgLSAxOworfQorI2VuZGlmCisKKyNkZWZpbmUgX0hBVkVfU1RSSU5HX0FSQ0hfbWVtcmNociAxCisjaWZuZGVmIF9GT1JDRV9JTkxJTkVTCitfX1NUUklOR19JTkxJTkUgdm9pZCAqX19tZW1yY2hyIChfX2NvbnN0IHZvaWQgKl9fcywgaW50IF9fYywgc2l6ZV90IF9fbik7CisKK19fU1RSSU5HX0lOTElORSB2b2lkICoKK19fbWVtcmNociAoX19jb25zdCB2b2lkICpfX3MsIGludCBfX2MsIHNpemVfdCBfX24pCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDA7CisjIGlmZGVmIF9faTY4Nl9fCisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDE7CisjIGVuZGlmCisgIHJlZ2lzdGVyIHZvaWQgKl9fcmVzOworICBpZiAoX19uID09IDApCisgICAgcmV0dXJuIE5VTEw7CisjIGlmZGVmIF9faTY4Nl9fCisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJzdGRcblx0IgorICAgICAicmVwbmU7IHNjYXNiXG5cdCIKKyAgICAgImNtb3ZuZSAlMiwlMFxuXHQiCisgICAgICJjbGRcblx0IgorICAgICAiaW5jbCAlMCIKKyAgICAgOiAiPUQiIChfX3JlcyksICI9JmMiIChfX2QwKSwgIj0mciIgKF9fZDEpCisgICAgIDogImEiIChfX2MpLCAiMCIgKF9fcyArIF9fbiAtIDEpLCAiMSIgKF9fbiksICIyIiAoLTEpLAorICAgICAgICJtIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX25dOyB9ICopX19zKQorICAgICA6ICJjYyIpOworIyBlbHNlCisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJzdGRcblx0IgorICAgICAicmVwbmU7IHNjYXNiXG5cdCIKKyAgICAgImplIDFmXG5cdCIKKyAgICAgIm9ybCAkLTEsJTBcbiIKKyAgICAgIjE6XHRjbGRcblx0IgorICAgICAiaW5jbCAlMCIKKyAgICAgOiAiPUQiIChfX3JlcyksICI9JmMiIChfX2QwKQorICAgICA6ICJhIiAoX19jKSwgIjAiIChfX3MgKyBfX24gLSAxKSwgIjEiIChfX24pLAorICAgICAgICJtIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX25dOyB9ICopX19zKQorICAgICA6ICJjYyIpOworIyBlbmRpZgorICByZXR1cm4gX19yZXM7Cit9CisjIGlmZGVmIF9fVVNFX0dOVQorIyAgZGVmaW5lIG1lbXJjaHIocywgYywgbikgX19tZW1yY2hyICgocyksIChjKSwgKG4pKQorIyBlbmRpZgorI2VuZGlmCisKKy8qIFJldHVybiBwb2ludGVyIHRvIEMgaW4gUy4gICovCisjZGVmaW5lIF9IQVZFX1NUUklOR19BUkNIX3Jhd21lbWNociAxCitfX1NUUklOR19JTkxJTkUgdm9pZCAqX19yYXdtZW1jaHIgKGNvbnN0IHZvaWQgKl9fcywgaW50IF9fYyk7CisKKyNpZm5kZWYgX0ZPUkNFX0lOTElORVMKK19fU1RSSU5HX0lOTElORSB2b2lkICoKK19fcmF3bWVtY2hyIChjb25zdCB2b2lkICpfX3MsIGludCBfX2MpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDA7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKl9fcmVzOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiY2xkXG5cdCIKKyAgICAgInJlcG5lOyBzY2FzYlxuXHQiCisgICAgIDogIj1EIiAoX19yZXMpLCAiPSZjIiAoX19kMCkKKyAgICAgOiAiYSIgKF9fYyksICIwIiAoX19zKSwgIjEiICgweGZmZmZmZmZmKSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IGNoYXIgX194WzB4ZmZmZmZmZl07IH0gKilfX3MpCisgICAgIDogImNjIik7CisgIHJldHVybiBfX3JlcyAtIDE7Cit9CisjIGlmZGVmIF9fVVNFX0dOVQorX19TVFJJTkdfSU5MSU5FIHZvaWQgKgorcmF3bWVtY2hyIChjb25zdCB2b2lkICpfX3MsIGludCBfX2MpCit7CisgIHJldHVybiBfX3Jhd21lbWNociAoX19zLCBfX2MpOworfQorIyBlbmRpZgkvKiB1c2UgR05VICovCisjZW5kaWYKKworCisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiBTLiAgKi8KKyNkZWZpbmUgX0hBVkVfU1RSSU5HX0FSQ0hfc3RybGVuIDEKKyNkZWZpbmUgc3RybGVuKHN0cikgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHN0cikJCQkJICAgICAgXAorCQkgID8gX19idWlsdGluX3N0cmxlbiAoc3RyKQkJCQkgICAgICBcCisJCSAgOiBfX3N0cmxlbl9nIChzdHIpKSkKK19fU1RSSU5HX0lOTElORSBzaXplX3QgX19zdHJsZW5fZyAoX19jb25zdCBjaGFyICpfX3N0cik7CisKK19fU1RSSU5HX0lOTElORSBzaXplX3QKK19fc3RybGVuX2cgKF9fY29uc3QgY2hhciAqX19zdHIpCit7CisgIHJlZ2lzdGVyIGNoYXIgX19kdW1teTsKKyAgcmVnaXN0ZXIgX19jb25zdCBjaGFyICpfX3RtcCA9IF9fc3RyOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiMTpcblx0IgorICAgICAibW92YgkoJTApLCViMVxuXHQiCisgICAgICJsZWFsCTEoJTApLCUwXG5cdCIKKyAgICAgInRlc3RiCSViMSwlYjFcblx0IgorICAgICAiam5lCTFiIgorICAgICA6ICI9ciIgKF9fdG1wKSwgIj0mcSIgKF9fZHVtbXkpCisgICAgIDogIjAiIChfX3N0ciksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBjaGFyIF9feFsweGZmZmZmZmZdOyB9ICopX19zdHIpCisgICAgIDogImNjIiApOworICByZXR1cm4gX190bXAgLSBfX3N0ciAtIDE7Cit9CisKKworLyogQ29weSBTUkMgdG8gREVTVC4gICovCisjZGVmaW5lIF9IQVZFX1NUUklOR19BUkNIX3N0cmNweSAxCisjZGVmaW5lIHN0cmNweShkZXN0LCBzcmMpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzcmMpCQkJCSAgICAgIFwKKwkJICA/IChzaXplb2YgKChzcmMpWzBdKSA9PSAxICYmIHN0cmxlbiAoc3JjKSArIDEgPD0gOAkgICAgICBcCisJCSAgICAgPyBfX3N0cmNweV9hX3NtYWxsICgoZGVzdCksIChzcmMpLCBzdHJsZW4gKHNyYykgKyAxKSAgICAgXAorCQkgICAgIDogKGNoYXIgKikgbWVtY3B5ICgoY2hhciAqKSAoZGVzdCksCQkgICAgICBcCisJCQkJCShfX2NvbnN0IGNoYXIgKikgKHNyYyksCQkgICAgICBcCisJCQkJCXN0cmxlbiAoc3JjKSArIDEpKQkJICAgICAgXAorCQkgIDogX19zdHJjcHlfZyAoKGRlc3QpLCAoc3JjKSkpKQorCisjZGVmaW5lIF9fc3RyY3B5X2Ffc21hbGwoZGVzdCwgc3JjLCBzcmNsZW4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgY2hhciAqX19kZXN0ID0gKGRlc3QpOwkJCQkgICAgICBcCisJCSAgICB1bmlvbiB7CQkJCQkJICAgICAgXAorCQkgICAgICB1bnNpZ25lZCBpbnQgX191aTsJCQkJICAgICAgXAorCQkgICAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX191c2k7CQkJCSAgICAgIFwKKwkJICAgICAgdW5zaWduZWQgY2hhciBfX3VjOwkJCQkgICAgICBcCisJCSAgICAgIGNoYXIgX19jOwkJCQkJCSAgICAgIFwKKwkJICAgIH0gKl9fdSA9ICh2b2lkICopIF9fZGVzdDsJCQkJICAgICAgXAorCQkgICAgc3dpdGNoIChzcmNsZW4pCQkJCQkgICAgICBcCisJCSAgICAgIHsJCQkJCQkJICAgICAgXAorCQkgICAgICBjYXNlIDE6CQkJCQkJICAgICAgXAorCQkJX191LT5fX3VjID0gJ1wwJzsJCQkJICAgICAgXAorCQkJYnJlYWs7CQkJCQkJICAgICAgXAorCQkgICAgICBjYXNlIDI6CQkJCQkJICAgICAgXAorCQkJX191LT5fX3VzaSA9IF9fU1RSSU5HX1NNQUxMX0dFVDE2IChzcmMsIDApOwkgICAgICBcCisJCQlicmVhazsJCQkJCQkgICAgICBcCisJCSAgICAgIGNhc2UgMzoJCQkJCQkgICAgICBcCisJCQlfX3UtPl9fdXNpID0gX19TVFJJTkdfU01BTExfR0VUMTYgKHNyYywgMCk7CSAgICAgIFwKKwkJCV9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOwkJICAgICAgXAorCQkJX191LT5fX3VjID0gJ1wwJzsJCQkJICAgICAgXAorCQkJYnJlYWs7CQkJCQkJICAgICAgXAorCQkgICAgICBjYXNlIDQ6CQkJCQkJICAgICAgXAorCQkJX191LT5fX3VpID0gX19TVFJJTkdfU01BTExfR0VUMzIgKHNyYywgMCk7CSAgICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICAgIFwKKwkJICAgICAgY2FzZSA1OgkJCQkJCSAgICAgIFwKKwkJCV9fdS0+X191aSA9IF9fU1RSSU5HX1NNQUxMX0dFVDMyIChzcmMsIDApOwkgICAgICBcCisJCQlfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsJCSAgICAgIFwKKwkJCV9fdS0+X191YyA9ICdcMCc7CQkJCSAgICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICAgIFwKKwkJICAgICAgY2FzZSA2OgkJCQkJCSAgICAgIFwKKwkJCV9fdS0+X191aSA9IF9fU1RSSU5HX1NNQUxMX0dFVDMyIChzcmMsIDApOwkgICAgICBcCisJCQlfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsJCSAgICAgIFwKKwkJCV9fdS0+X191c2kgPSBfX1NUUklOR19TTUFMTF9HRVQxNiAoc3JjLCA0KTsJICAgICAgXAorCQkJYnJlYWs7CQkJCQkJICAgICAgXAorCQkgICAgICBjYXNlIDc6CQkJCQkJICAgICAgXAorCQkJX191LT5fX3VpID0gX19TVFJJTkdfU01BTExfR0VUMzIgKHNyYywgMCk7CSAgICAgIFwKKwkJCV9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJICAgICAgXAorCQkJX191LT5fX3VzaSA9IF9fU1RSSU5HX1NNQUxMX0dFVDE2IChzcmMsIDQpOwkgICAgICBcCisJCQlfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAyKTsJCSAgICAgIFwKKwkJCV9fdS0+X191YyA9ICdcMCc7CQkJCSAgICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICAgIFwKKwkJICAgICAgY2FzZSA4OgkJCQkJCSAgICAgIFwKKwkJCV9fdS0+X191aSA9IF9fU1RSSU5HX1NNQUxMX0dFVDMyIChzcmMsIDApOwkgICAgICBcCisJCQlfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsJCSAgICAgIFwKKwkJCV9fdS0+X191aSA9IF9fU1RSSU5HX1NNQUxMX0dFVDMyIChzcmMsIDQpOwkgICAgICBcCisJCQlicmVhazsJCQkJCQkgICAgICBcCisJCSAgICAgIH0JCQkJCQkJICAgICAgXAorCQkgICAgKGNoYXIgKikgX19kZXN0OyB9KSkKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RyY3B5X2cgKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyICpfX3NyYyk7CisKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RyY3B5X2cgKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyICpfX3NyYykKK3sKKyAgcmVnaXN0ZXIgY2hhciAqX190bXAgPSBfX2Rlc3Q7CisgIHJlZ2lzdGVyIGNoYXIgX19kdW1teTsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoCisgICAgICIxOlxuXHQiCisgICAgICJtb3ZiCSglMCksJWIyXG5cdCIKKyAgICAgImxlYWwJMSglMCksJTBcblx0IgorICAgICAibW92YgklYjIsKCUxKVxuXHQiCisgICAgICJsZWFsCTEoJTEpLCUxXG5cdCIKKyAgICAgInRlc3RiCSViMiwlYjJcblx0IgorICAgICAiam5lCTFiIgorICAgICA6ICI9JnIiIChfX3NyYyksICI9JnIiIChfX3RtcCksICI9JnEiIChfX2R1bW15KSwKKyAgICAgICAiPW0iICggKihzdHJ1Y3QgeyBjaGFyIF9feFsweGZmZmZmZmZdOyB9ICopX19kZXN0KQorICAgICA6ICIwIiAoX19zcmMpLCAiMSIgKF9fdG1wKSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IGNoYXIgX194WzB4ZmZmZmZmZl07IH0gKilfX3NyYykKKyAgICAgOiAiY2MiKTsKKyAgcmV0dXJuIF9fZGVzdDsKK30KKworCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9zdHBjcHkgMQorLyogQ29weSBTUkMgdG8gREVTVC4gICovCisjIGRlZmluZSBfX3N0cGNweShkZXN0LCBzcmMpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzcmMpCQkJCSAgICAgIFwKKwkJICA/IChzdHJsZW4gKHNyYykgKyAxIDw9IDgJCQkJICAgICAgXAorCQkgICAgID8gX19zdHBjcHlfYV9zbWFsbCAoKGRlc3QpLCAoc3JjKSwgc3RybGVuIChzcmMpICsgMSkgICAgIFwKKwkJICAgICA6IF9fc3RwY3B5X2MgKChkZXN0KSwgKHNyYyksIHN0cmxlbiAoc3JjKSArIDEpKQkgICAgICBcCisJCSAgOiBfX3N0cGNweV9nICgoZGVzdCksIChzcmMpKSkpCisjIGRlZmluZSBfX3N0cGNweV9jKGRlc3QsIHNyYywgc3JjbGVuKSBcCisgICgoc3JjbGVuKSAlIDQgPT0gMAkJCQkJCQkgICAgICBcCisgICA/IF9fbWVtcGNweV9ieTQgKGRlc3QsIHNyYywgc3JjbGVuKSAtIDEJCQkJICAgICAgXAorICAgOiAoKHNyY2xlbikgJSAyID09IDAJCQkJCQkJICAgICAgXAorICAgICAgPyBfX21lbXBjcHlfYnkyIChkZXN0LCBzcmMsIHNyY2xlbikgLSAxCQkJCSAgICAgIFwKKyAgICAgIDogX19tZW1wY3B5X2J5biAoZGVzdCwgc3JjLCBzcmNsZW4pIC0gMSkpCisKKy8qIEluIGdsaWJjIGl0c2VsZiB3ZSB1c2UgdGhpcyBzeW1ib2wgZm9yIG5hbWVzcGFjZSByZWFzb25zLiAgKi8KKyMgZGVmaW5lIHN0cGNweShkZXN0LCBzcmMpIF9fc3RwY3B5ICgoZGVzdCksIChzcmMpKQorCisjIGRlZmluZSBfX3N0cGNweV9hX3NtYWxsKGRlc3QsIHNyYywgc3JjbGVuKSBcCisgIChfX2V4dGVuc2lvbl9fICh7IHVuaW9uIHsJCQkJCQkgICAgICBcCisJCSAgICAgIHVuc2lnbmVkIGludCBfX3VpOwkJCQkgICAgICBcCisJCSAgICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3VzaTsJCQkJICAgICAgXAorCQkgICAgICB1bnNpZ25lZCBjaGFyIF9fdWM7CQkJCSAgICAgIFwKKwkJICAgICAgY2hhciBfX2M7CQkJCQkJICAgICAgXAorCQkgICAgfSAqX191ID0gKHZvaWQgKikgKGRlc3QpOwkJCQkgICAgICBcCisJCSAgICBzd2l0Y2ggKHNyY2xlbikJCQkJCSAgICAgIFwKKwkJICAgICAgewkJCQkJCQkgICAgICBcCisJCSAgICAgIGNhc2UgMToJCQkJCQkgICAgICBcCisJCQlfX3UtPl9fdWMgPSAnXDAnOwkJCQkgICAgICBcCisJCQlicmVhazsJCQkJCQkgICAgICBcCisJCSAgICAgIGNhc2UgMjoJCQkJCQkgICAgICBcCisJCQlfX3UtPl9fdXNpID0gX19TVFJJTkdfU01BTExfR0VUMTYgKHNyYywgMCk7CSAgICAgIFwKKwkJCV9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDEpOwkJICAgICAgXAorCQkJYnJlYWs7CQkJCQkJICAgICAgXAorCQkgICAgICBjYXNlIDM6CQkJCQkJICAgICAgXAorCQkJX191LT5fX3VzaSA9IF9fU1RSSU5HX1NNQUxMX0dFVDE2IChzcmMsIDApOwkgICAgICBcCisJCQlfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAyKTsJCSAgICAgIFwKKwkJCV9fdS0+X191YyA9ICdcMCc7CQkJCSAgICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICAgIFwKKwkJICAgICAgY2FzZSA0OgkJCQkJCSAgICAgIFwKKwkJCV9fdS0+X191aSA9IF9fU1RSSU5HX1NNQUxMX0dFVDMyIChzcmMsIDApOwkgICAgICBcCisJCQlfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAzKTsJCSAgICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICAgIFwKKwkJICAgICAgY2FzZSA1OgkJCQkJCSAgICAgIFwKKwkJCV9fdS0+X191aSA9IF9fU1RSSU5HX1NNQUxMX0dFVDMyIChzcmMsIDApOwkgICAgICBcCisJCQlfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsJCSAgICAgIFwKKwkJCV9fdS0+X191YyA9ICdcMCc7CQkJCSAgICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICAgIFwKKwkJICAgICAgY2FzZSA2OgkJCQkJCSAgICAgIFwKKwkJCV9fdS0+X191aSA9IF9fU1RSSU5HX1NNQUxMX0dFVDMyIChzcmMsIDApOwkgICAgICBcCisJCQlfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsJCSAgICAgIFwKKwkJCV9fdS0+X191c2kgPSBfX1NUUklOR19TTUFMTF9HRVQxNiAoc3JjLCA0KTsJICAgICAgXAorCQkJX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMSk7CQkgICAgICBcCisJCQlicmVhazsJCQkJCQkgICAgICBcCisJCSAgICAgIGNhc2UgNzoJCQkJCQkgICAgICBcCisJCQlfX3UtPl9fdWkgPSBfX1NUUklOR19TTUFMTF9HRVQzMiAoc3JjLCAwKTsJICAgICAgXAorCQkJX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkgICAgICBcCisJCQlfX3UtPl9fdXNpID0gX19TVFJJTkdfU01BTExfR0VUMTYgKHNyYywgNCk7CSAgICAgIFwKKwkJCV9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOwkJICAgICAgXAorCQkJX191LT5fX3VjID0gJ1wwJzsJCQkJICAgICAgXAorCQkJYnJlYWs7CQkJCQkJICAgICAgXAorCQkgICAgICBjYXNlIDg6CQkJCQkJICAgICAgXAorCQkJX191LT5fX3VpID0gX19TVFJJTkdfU01BTExfR0VUMzIgKHNyYywgMCk7CSAgICAgIFwKKwkJCV9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJICAgICAgXAorCQkJX191LT5fX3VpID0gX19TVFJJTkdfU01BTExfR0VUMzIgKHNyYywgNCk7CSAgICAgIFwKKwkJCV9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDMpOwkJICAgICAgXAorCQkJYnJlYWs7CQkJCQkJICAgICAgXAorCQkgICAgICB9CQkJCQkJCSAgICAgIFwKKwkJICAgIChjaGFyICopIF9fdTsgfSkpCisKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX21lbXBjcHlfYnk0IChjaGFyICpfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19zcmMsCisJCQkJICAgICBzaXplX3QgX19zcmNsZW4pOworCitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX21lbXBjcHlfYnk0IChjaGFyICpfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19zcmMsIHNpemVfdCBfX3NyY2xlbikKK3sKKyAgcmVnaXN0ZXIgY2hhciAqX190bXAgPSBfX2Rlc3Q7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDAsIF9fZDE7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCIxOlxuXHQiCisgICAgICJtb3ZsCSglMiksJTBcblx0IgorICAgICAibGVhbAk0KCUyKSwlMlxuXHQiCisgICAgICJtb3ZsCSUwLCglMSlcblx0IgorICAgICAibGVhbAk0KCUxKSwlMVxuXHQiCisgICAgICJkZWNsCSUzXG5cdCIKKyAgICAgImpuegkxYiIKKyAgICAgOiAiPSZyIiAoX19kMCksICI9ciIgKF9fdG1wKSwgIj0mciIgKF9fc3JjKSwgIj0mciIgKF9fZDEpCisgICAgIDogIjEiIChfX3RtcCksICIyIiAoX19zcmMpLCAiMyIgKF9fc3JjbGVuIC8gNCkKKyAgICAgOiAibWVtb3J5IiwgImNjIik7CisgIHJldHVybiBfX3RtcDsKK30KKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fbWVtcGNweV9ieTIgKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyICpfX3NyYywKKwkJCQkgICAgIHNpemVfdCBfX3NyY2xlbik7CisKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fbWVtcGNweV9ieTIgKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyICpfX3NyYywgc2l6ZV90IF9fc3JjbGVuKQoreworICByZWdpc3RlciBjaGFyICpfX3RtcCA9IF9fZGVzdDsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMCwgX19kMTsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoInNocmwJJDEsJTNcblx0IgorICAgICAianoJMmZcbiIgICAgICAgICAgICAgICAgIC8qIG9ubHkgYSB3b3JkICovCisgICAgICIxOlxuXHQiCisgICAgICJtb3ZsCSglMiksJTBcblx0IgorICAgICAibGVhbAk0KCUyKSwlMlxuXHQiCisgICAgICJtb3ZsCSUwLCglMSlcblx0IgorICAgICAibGVhbAk0KCUxKSwlMVxuXHQiCisgICAgICJkZWNsCSUzXG5cdCIKKyAgICAgImpuegkxYlxuIgorICAgICAiMjpcblx0IgorICAgICAibW92dwkoJTIpLCV3MFxuXHQiCisgICAgICJtb3Z3CSV3MCwoJTEpIgorICAgICA6ICI9JnEiIChfX2QwKSwgIj1yIiAoX190bXApLCAiPSZyIiAoX19zcmMpLCAiPSZyIiAoX19kMSksCisgICAgICAgIj1tIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX3NyY2xlbl07IH0gKilfX2Rlc3QpCisgICAgIDogIjEiIChfX3RtcCksICIyIiAoX19zcmMpLCAiMyIgKF9fc3JjbGVuIC8gMiksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fc3JjbGVuXTsgfSAqKV9fc3JjKQorICAgICA6ICJjYyIpOworICByZXR1cm4gX190bXAgKyAyOworfQorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19tZW1wY3B5X2J5biAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fc3JjLAorCQkJCSAgICAgc2l6ZV90IF9fc3JjbGVuKTsKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19tZW1wY3B5X2J5biAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fc3JjLCBzaXplX3QgX19zcmNsZW4pCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX19kMCwgX19kMTsKKyAgcmVnaXN0ZXIgY2hhciAqX190bXAgPSBfX2Rlc3Q7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJjbGRcblx0IgorICAgICAic2hybAkkMSwlJWVjeFxuXHQiCisgICAgICJqbmMJMWZcblx0IgorICAgICAibW92c2JcbiIKKyAgICAgIjE6XG5cdCIKKyAgICAgInNocmwJJDEsJSVlY3hcblx0IgorICAgICAiam5jCTJmXG5cdCIKKyAgICAgIm1vdnN3XG4iCisgICAgICIyOlxuXHQiCisgICAgICJyZXA7IG1vdnNsIgorICAgICA6ICI9RCIgKF9fdG1wKSwgIj0mYyIgKF9fZDApLCAiPSZTIiAoX19kMSksCisgICAgICAgIj1tIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX3NyY2xlbl07IH0gKilfX2Rlc3QpCisgICAgIDogIjAiIChfX3RtcCksICIxIiAoX19zcmNsZW4pLCAiMiIgKF9fc3JjKSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19zcmNsZW5dOyB9ICopX19zcmMpCisgICAgIDogImNjIik7CisgIHJldHVybiBfX3RtcDsKK30KKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RwY3B5X2cgKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyICpfX3NyYyk7CisKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RwY3B5X2cgKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyICpfX3NyYykKK3sKKyAgcmVnaXN0ZXIgY2hhciAqX190bXAgPSBfX2Rlc3Q7CisgIHJlZ2lzdGVyIGNoYXIgX19kdW1teTsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoCisgICAgICIxOlxuXHQiCisgICAgICJtb3ZiCSglMCksJWIyXG5cdCIKKyAgICAgImxlYWwJMSglMCksJTBcblx0IgorICAgICAibW92YgklYjIsKCUxKVxuXHQiCisgICAgICJsZWFsCTEoJTEpLCUxXG5cdCIKKyAgICAgInRlc3RiCSViMiwlYjJcblx0IgorICAgICAiam5lCTFiIgorICAgICA6ICI9JnIiIChfX3NyYyksICI9ciIgKF9fdG1wKSwgIj0mcSIgKF9fZHVtbXkpLAorICAgICAgICI9bSIgKCAqKHN0cnVjdCB7IGNoYXIgX194WzB4ZmZmZmZmZl07IH0gKilfX2Rlc3QpCisgICAgIDogIjAiIChfX3NyYyksICIxIiAoX190bXApLAorICAgICAgICJtIiAoICooc3RydWN0IHsgY2hhciBfX3hbMHhmZmZmZmZmXTsgfSAqKV9fc3JjKQorICAgICA6ICJjYyIpOworICByZXR1cm4gX190bXAgLSAxOworfQorI2VuZGlmCisKKworLyogQ29weSBubyBtb3JlIHRoYW4gTiBjaGFyYWN0ZXJzIG9mIFNSQyB0byBERVNULiAgKi8KKyNkZWZpbmUgX0hBVkVfU1RSSU5HX0FSQ0hfc3RybmNweSAxCisjZGVmaW5lIHN0cm5jcHkoZGVzdCwgc3JjLCBuKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc3JjKQkJCQkgICAgICBcCisJCSAgPyAoKHN0cmxlbiAoc3JjKSArIDEgPj0gKChzaXplX3QpIChuKSkJCSAgICAgIFwKKwkJICAgICAgPyAoY2hhciAqKSBtZW1jcHkgKChjaGFyICopIChkZXN0KSwJCSAgICAgIFwKKwkJCQkJIChfX2NvbnN0IGNoYXIgKikgKHNyYyksIG4pCSAgICAgIFwKKwkJICAgICAgOiBfX3N0cm5jcHlfY2cgKChkZXN0KSwgKHNyYyksIHN0cmxlbiAoc3JjKSArIDEsIG4pKSkgICBcCisJCSAgOiBfX3N0cm5jcHlfZ2cgKChkZXN0KSwgKHNyYyksIG4pKSkKKyNkZWZpbmUgX19zdHJuY3B5X2NnKGRlc3QsIHNyYywgc3JjbGVuLCBuKSBcCisgICgoKHNyY2xlbikgJSA0ID09IDApCQkJCQkJCSAgICAgIFwKKyAgID8gX19zdHJuY3B5X2J5NCAoZGVzdCwgc3JjLCBzcmNsZW4sIG4pCQkJCSAgICAgIFwKKyAgIDogKCgoc3JjbGVuKSAlIDIgPT0gMCkJCQkJCQkgICAgICBcCisgICAgICA/IF9fc3RybmNweV9ieTIgKGRlc3QsIHNyYywgc3JjbGVuLCBuKQkJCQkgICAgICBcCisgICAgICA6IF9fc3RybmNweV9ieW4gKGRlc3QsIHNyYywgc3JjbGVuLCBuKSkpCisKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cm5jcHlfYnk0IChjaGFyICpfX2Rlc3QsIF9fY29uc3QgY2hhciBfX3NyY1tdLAorCQkJCSAgICAgc2l6ZV90IF9fc3JjbGVuLCBzaXplX3QgX19uKTsKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJuY3B5X2J5NCAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgX19zcmNbXSwgc2l6ZV90IF9fc3JjbGVuLCBzaXplX3QgX19uKQoreworICByZWdpc3RlciBjaGFyICpfX3RtcCA9IF9fZGVzdDsKKyAgcmVnaXN0ZXIgaW50IF9fZHVtbXkxLCBfX2R1bW15MjsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoIjE6XG5cdCIKKyAgICAgIm1vdmwJKCUyKSwlMFxuXHQiCisgICAgICJsZWFsCTQoJTIpLCUyXG5cdCIKKyAgICAgIm1vdmwJJTAsKCUxKVxuXHQiCisgICAgICJsZWFsCTQoJTEpLCUxXG5cdCIKKyAgICAgImRlY2wJJTNcblx0IgorICAgICAiam56CTFiIgorICAgICA6ICI9JnIiIChfX2R1bW15MSksICI9ciIgKF9fdG1wKSwgIj0mciIgKF9fc3JjKSwgIj0mciIgKF9fZHVtbXkyKSwKKyAgICAgICAiPW0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fc3JjbGVuXTsgfSAqKV9fZGVzdCkKKyAgICAgOiAiMSIgKF9fdG1wKSwgIjIiIChfX3NyYyksICIzIiAoX19zcmNsZW4gLyA0KSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19zcmNsZW5dOyB9ICopX19zcmMpCisgICAgIDogImNjIik7CisgICh2b2lkKSBtZW1zZXQgKF9fdG1wLCAnXDAnLCBfX24gLSBfX3NyY2xlbik7CisgIHJldHVybiBfX2Rlc3Q7Cit9CisKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cm5jcHlfYnkyIChjaGFyICpfX2Rlc3QsIF9fY29uc3QgY2hhciBfX3NyY1tdLAorCQkJCSAgICAgc2l6ZV90IF9fc3JjbGVuLCBzaXplX3QgX19uKTsKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJuY3B5X2J5MiAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgX19zcmNbXSwgc2l6ZV90IF9fc3JjbGVuLCBzaXplX3QgX19uKQoreworICByZWdpc3RlciBjaGFyICpfX3RtcCA9IF9fZGVzdDsKKyAgcmVnaXN0ZXIgaW50IF9fZHVtbXkxLCBfX2R1bW15MjsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoInNocmwJJDEsJTNcblx0IgorICAgICAianoJMmZcbiIgICAgICAgICAgICAgICAgIC8qIG9ubHkgYSB3b3JkICovCisgICAgICIxOlxuXHQiCisgICAgICJtb3ZsCSglMiksJTBcblx0IgorICAgICAibGVhbAk0KCUyKSwlMlxuXHQiCisgICAgICJtb3ZsCSUwLCglMSlcblx0IgorICAgICAibGVhbAk0KCUxKSwlMVxuXHQiCisgICAgICJkZWNsCSUzXG5cdCIKKyAgICAgImpuegkxYlxuIgorICAgICAiMjpcblx0IgorICAgICAibW92dwkoJTIpLCV3MFxuXHQiCisgICAgICJtb3Z3CSV3MCwoJTEpXG5cdCIKKyAgICAgOiAiPSZxIiAoX19kdW1teTEpLCAiPXIiIChfX3RtcCksICI9JnIiIChfX3NyYyksICI9JnIiIChfX2R1bW15MiksCisgICAgICAgIj1tIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX3NyY2xlbl07IH0gKilfX2Rlc3QpCisgICAgIDogIjEiIChfX3RtcCksICIyIiAoX19zcmMpLCAiMyIgKF9fc3JjbGVuIC8gMiksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fc3JjbGVuXTsgfSAqKV9fc3JjKQorICAgICA6ICJjYyIpOworICAodm9pZCkgbWVtc2V0IChfX3RtcCArIDIsICdcMCcsIF9fbiAtIF9fc3JjbGVuKTsKKyAgcmV0dXJuIF9fZGVzdDsKK30KKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RybmNweV9ieW4gKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyIF9fc3JjW10sCisJCQkJICAgICBzaXplX3QgX19zcmNsZW4sIHNpemVfdCBfX24pOworCitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cm5jcHlfYnluIChjaGFyICpfX2Rlc3QsIF9fY29uc3QgY2hhciBfX3NyY1tdLCBzaXplX3QgX19zcmNsZW4sIHNpemVfdCBfX24pCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDAsIF9fZDE7CisgIHJlZ2lzdGVyIGNoYXIgKl9fdG1wID0gX19kZXN0OworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiY2xkXG5cdCIKKyAgICAgInNocmwJJDEsJTFcblx0IgorICAgICAiam5jCTFmXG5cdCIKKyAgICAgIm1vdnNiXG4iCisgICAgICIxOlxuXHQiCisgICAgICJzaHJsCSQxLCUxXG5cdCIKKyAgICAgImpuYwkyZlxuXHQiCisgICAgICJtb3Zzd1xuIgorICAgICAiMjpcblx0IgorICAgICAicmVwOyBtb3ZzbCIKKyAgICAgOiAiPUQiIChfX3RtcCksICI9JmMiIChfX2QwKSwgIj0mUyIgKF9fZDEpLAorICAgICAgICI9bSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19zcmNsZW5dOyB9ICopX19kZXN0KQorICAgICA6ICIxIiAoX19zcmNsZW4pLCAiMCIgKF9fdG1wKSwiMiIgKF9fc3JjKSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19zcmNsZW5dOyB9ICopX19zcmMpCisgICAgIDogImNjIik7CisgICh2b2lkKSBtZW1zZXQgKF9fdG1wLCAnXDAnLCBfX24gLSBfX3NyY2xlbik7CisgIHJldHVybiBfX2Rlc3Q7Cit9CisKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cm5jcHlfZ2cgKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyICpfX3NyYywKKwkJCQkgICAgc2l6ZV90IF9fbik7CisKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RybmNweV9nZyAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fc3JjLCBzaXplX3QgX19uKQoreworICByZWdpc3RlciBjaGFyICpfX3RtcCA9IF9fZGVzdDsKKyAgcmVnaXN0ZXIgY2hhciBfX2R1bW15OworICBpZiAoX19uID4gMCkKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICAgKCIxOlxuXHQiCisgICAgICAgIm1vdmIJKCUwKSwlMlxuXHQiCisgICAgICAgImluY2wJJTBcblx0IgorICAgICAgICJtb3ZiCSUyLCglMSlcblx0IgorICAgICAgICJpbmNsCSUxXG5cdCIKKyAgICAgICAiZGVjbAklM1xuXHQiCisgICAgICAgImplCTNmXG5cdCIKKyAgICAgICAidGVzdGIJJTIsJTJcblx0IgorICAgICAgICJqbmUJMWJcblx0IgorICAgICAgICIyOlxuXHQiCisgICAgICAgIm1vdmIJJTIsKCUxKVxuXHQiCisgICAgICAgImluY2wJJTFcblx0IgorICAgICAgICJkZWNsCSUzXG5cdCIKKyAgICAgICAiam5lCTJiXG5cdCIKKyAgICAgICAiMzoiCisgICAgICAgOiAiPSZyIiAoX19zcmMpLCAiPSZyIiAoX190bXApLCAiPSZxIiAoX19kdW1teSksICI9JnIiIChfX24pCisgICAgICAgOiAiMCIgKF9fc3JjKSwgIjEiIChfX3RtcCksICIzIiAoX19uKQorICAgICAgIDogIm1lbW9yeSIsICJjYyIpOworCisgIHJldHVybiBfX2Rlc3Q7Cit9CisKKworLyogQXBwZW5kIFNSQyBvbnRvIERFU1QuICAqLworI2RlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9zdHJjYXQgMQorI2RlZmluZSBzdHJjYXQoZGVzdCwgc3JjKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc3JjKQkJCQkgICAgICBcCisJCSAgPyBfX3N0cmNhdF9jICgoZGVzdCksIChzcmMpLCBzdHJsZW4gKHNyYykgKyAxKQkgICAgICBcCisJCSAgOiBfX3N0cmNhdF9nICgoZGVzdCksIChzcmMpKSkpCisKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cmNhdF9jIChjaGFyICpfX2Rlc3QsIF9fY29uc3QgY2hhciBfX3NyY1tdLAorCQkJCSAgc2l6ZV90IF9fc3JjbGVuKTsKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJjYXRfYyAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgX19zcmNbXSwgc2l6ZV90IF9fc3JjbGVuKQoreworI2lmZGVmIF9faTY4Nl9fCisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDA7CisgIHJlZ2lzdGVyIGNoYXIgKl9fdG1wOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgicmVwbmU7IHNjYXNiIgorICAgICA6ICI9RCIgKF9fdG1wKSwgIj0mYyIgKF9fZDApLAorICAgICAgICI9bSIgKCAqKHN0cnVjdCB7IGNoYXIgX194WzB4ZmZmZmZmZl07IH0gKilfX2Rlc3QpCisgICAgIDogIjAiIChfX2Rlc3QpLCAiMSIgKDB4ZmZmZmZmZmYpLCAiYSIgKDApLAorICAgICAgICJtIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX3NyY2xlbl07IH0gKilfX3NyYykKKyAgICAgOiAiY2MiKTsKKyAgLS1fX3RtcDsKKyNlbHNlCisgIHJlZ2lzdGVyIGNoYXIgKl9fdG1wID0gX19kZXN0IC0gMTsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoIjE6XG5cdCIKKyAgICAgImluY2wJJTBcblx0IgorICAgICAiY21wYgkkMCwoJTApXG5cdCIKKyAgICAgImpuZQkxYlxuIgorICAgICA6ICI9ciIgKF9fdG1wKSwKKyAgICAgICAiPW0iICggKihzdHJ1Y3QgeyBjaGFyIF9feFsweGZmZmZmZmZdOyB9ICopX19kZXN0KQorICAgICA6ICIwIiAoX190bXApLAorICAgICAgICJtIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX3NyY2xlbl07IH0gKilfX3NyYykKKyAgICAgOiAiY2MiKTsKKyNlbmRpZgorICAodm9pZCkgbWVtY3B5IChfX3RtcCwgX19zcmMsIF9fc3JjbGVuKTsKKyAgcmV0dXJuIF9fZGVzdDsKK30KKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RyY2F0X2cgKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyICpfX3NyYyk7CisKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RyY2F0X2cgKGNoYXIgKl9fZGVzdCwgX19jb25zdCBjaGFyICpfX3NyYykKK3sKKyAgcmVnaXN0ZXIgY2hhciAqX190bXAgPSBfX2Rlc3QgLSAxOworICByZWdpc3RlciBjaGFyIF9fZHVtbXk7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCIxOlxuXHQiCisgICAgICJpbmNsCSUxXG5cdCIKKyAgICAgImNtcGIJJDAsKCUxKVxuXHQiCisgICAgICJqbmUJMWJcbiIKKyAgICAgIjI6XG5cdCIKKyAgICAgIm1vdmIJKCUyKSwlYjBcblx0IgorICAgICAiaW5jbAklMlxuXHQiCisgICAgICJtb3ZiCSViMCwoJTEpXG5cdCIKKyAgICAgImluY2wJJTFcblx0IgorICAgICAidGVzdGIJJWIwLCViMFxuXHQiCisgICAgICJqbmUJMmJcbiIKKyAgICAgOiAiPSZxIiAoX19kdW1teSksICI9JnIiIChfX3RtcCksICI9JnIiIChfX3NyYyksCisgICAgICAgIj1tIiAoICooc3RydWN0IHsgY2hhciBfX3hbMHhmZmZmZmZmXTsgfSAqKV9fZGVzdCkKKyAgICAgOiAiMSIgIChfX3RtcCksICIyIiAgKF9fc3JjKSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IGNoYXIgX194WzB4ZmZmZmZmZl07IH0gKilfX3NyYykKKyAgICAgOiAibWVtb3J5IiwgImNjIik7CisgIHJldHVybiBfX2Rlc3Q7Cit9CisKKworLyogQXBwZW5kIG5vIG1vcmUgdGhhbiBOIGNoYXJhY3RlcnMgZnJvbSBTUkMgb250byBERVNULiAgKi8KKyNkZWZpbmUgX0hBVkVfU1RSSU5HX0FSQ0hfc3RybmNhdCAxCisjZGVmaW5lIHN0cm5jYXQoZGVzdCwgc3JjLCBuKSBcCisgIChfX2V4dGVuc2lvbl9fICh7IGNoYXIgKl9fZGVzdCA9IChkZXN0KTsJCQkJICAgICAgXAorCQkgICAgX19idWlsdGluX2NvbnN0YW50X3AgKHNyYykgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKG4pICAgIFwKKwkJICAgID8gKHN0cmxlbiAoc3JjKSA8ICgoc2l6ZV90KSAobikpCQkJICAgICAgXAorCQkgICAgICAgPyBzdHJjYXQgKF9fZGVzdCwgKHNyYykpCQkJCSAgICAgIFwKKwkJICAgICAgIDogKCooY2hhciAqKV9fbWVtcGNweSAoc3RyY2hyIChfX2Rlc3QsICdcMCcpLAkgICAgICBcCisJCQkJCSAgICAgICAoX19jb25zdCBjaGFyICopIChzcmMpLAkgICAgICBcCisJCQkJCSAgICAgIChuKSkgPSAwLCBfX2Rlc3QpKQkgICAgICBcCisJCSAgICA6IF9fc3RybmNhdF9nIChfX2Rlc3QsIChzcmMpLCAobikpOyB9KSkKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RybmNhdF9nIChjaGFyICpfX2Rlc3QsIF9fY29uc3QgY2hhciBfX3NyY1tdLAorCQkJCSAgIHNpemVfdCBfX24pOworCitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cm5jYXRfZyAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgX19zcmNbXSwgc2l6ZV90IF9fbikKK3sKKyAgcmVnaXN0ZXIgY2hhciAqX190bXAgPSBfX2Rlc3Q7CisgIHJlZ2lzdGVyIGNoYXIgX19kdW1teTsKKyNpZmRlZiBfX2k2ODZfXworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgicmVwbmU7IHNjYXNiXG4iCisgICAgICJtb3ZsICU0LCAlM1xuXHQiCisgICAgICJkZWNsICUxXG5cdCIKKyAgICAgIjE6XG5cdCIKKyAgICAgInN1YmwJJDEsJTNcblx0IgorICAgICAiamMJMmZcblx0IgorICAgICAibW92YgkoJTIpLCViMFxuXHQiCisgICAgICJtb3ZzYlxuXHQiCisgICAgICJ0ZXN0YgklYjAsJWIwXG5cdCIKKyAgICAgImpuZQkxYlxuXHQiCisgICAgICJkZWNsCSUxXG4iCisgICAgICIyOlxuXHQiCisgICAgICJtb3ZiCSQwLCglMSkiCisgICAgIDogIj0mYSIgKF9fZHVtbXkpLCAiPSZEIiAoX190bXApLCAiPSZTIiAoX19zcmMpLCAiPSZjIiAoX19uKQorICAgICA6ICAiZyIgKF9fbiksICIwIiAoMCksICIxIiAoX190bXApLCAiMiIgKF9fc3JjKSwgIjMiICgweGZmZmZmZmZmKQorICAgICA6ICJtZW1vcnkiLCAiY2MiKTsKKyNlbHNlCisgIC0tX190bXA7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCIxOlxuXHQiCisgICAgICJjbXBiCSQwLDEoJTEpXG5cdCIKKyAgICAgImxlYWwJMSglMSksJTFcblx0IgorICAgICAiam5lCTFiXG4iCisgICAgICIyOlxuXHQiCisgICAgICJzdWJsCSQxLCUzXG5cdCIKKyAgICAgImpjCTNmXG5cdCIKKyAgICAgIm1vdmIJKCUyKSwlYjBcblx0IgorICAgICAibGVhbAkxKCUyKSwlMlxuXHQiCisgICAgICJtb3ZiCSViMCwoJTEpXG5cdCIKKyAgICAgImxlYWwJMSglMSksJTFcblx0IgorICAgICAidGVzdGIJJWIwLCViMFxuXHQiCisgICAgICJqbmUJMmJcblx0IgorICAgICAiZGVjbAklMVxuIgorICAgICAiMzpcblx0IgorICAgICAibW92YgkkMCwoJTEpIgorICAgICA6ICI9JnEiIChfX2R1bW15KSwgIj0mciIgKF9fdG1wKSwgIj0mciIgKF9fc3JjKSwgIj0mciIgKF9fbikKKyAgICAgOiAiMSIgKF9fdG1wKSwgIjIiIChfX3NyYyksICIzIiAoX19uKQorICAgICA6ICJtZW1vcnkiLCAiY2MiKTsKKyNlbmRpZgorICByZXR1cm4gX19kZXN0OworfQorCisKKy8qIENvbXBhcmUgUzEgYW5kIFMyLiAgKi8KKyNkZWZpbmUgX0hBVkVfU1RSSU5HX0FSQ0hfc3RyY21wIDEKKyNkZWZpbmUgc3RyY21wKHMxLCBzMikgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHMxKSAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAoczIpICAgICAgXAorCQkgICYmIChzaXplb2YgKChzMSlbMF0pICE9IDEgfHwgc3RybGVuIChzMSkgPj0gNCkJICAgICAgXAorCQkgICYmIChzaXplb2YgKChzMilbMF0pICE9IDEgfHwgc3RybGVuIChzMikgPj0gNCkJICAgICAgXAorCQkgID8gbWVtY21wICgoX19jb25zdCBjaGFyICopIChzMSksIChfX2NvbnN0IGNoYXIgKikgKHMyKSwgICAgIFwKKwkJCSAgICAoc3RybGVuIChzMSkgPCBzdHJsZW4gKHMyKQkJCSAgICAgIFwKKwkJCSAgICAgPyBzdHJsZW4gKHMxKSA6IHN0cmxlbiAoczIpKSArIDEpCQkgICAgICBcCisJCSAgOiAoX19idWlsdGluX2NvbnN0YW50X3AgKHMxKSAmJiBzaXplb2YgKChzMSlbMF0pID09IDEJICAgICAgXAorCQkgICAgICYmIHNpemVvZiAoKHMyKVswXSkgPT0gMSAmJiBzdHJsZW4gKHMxKSA8IDQJICAgICAgXAorCQkgICAgID8gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMikgJiYgc2l6ZW9mICgoczIpWzBdKSA9PSAxICAgIFwKKwkJCT8gX19zdHJjbXBfY2MgKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKHMxKSwJICAgICAgXAorCQkJCSAgICAgICAoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChzMiksCSAgICAgIFwKKwkJCQkgICAgICAgc3RybGVuIChzMSkpCQkJICAgICAgXAorCQkJOiBfX3N0cmNtcF9jZyAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoczEpLAkgICAgICBcCisJCQkJICAgICAgIChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKHMyKSwJICAgICAgXAorCQkJCSAgICAgICBzdHJsZW4gKHMxKSkpCQkJICAgICAgXAorCQkgICAgIDogKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMikgJiYgc2l6ZW9mICgoczEpWzBdKSA9PSAxICAgIFwKKwkJCSYmIHNpemVvZiAoKHMyKVswXSkgPT0gMSAmJiBzdHJsZW4gKHMyKSA8IDQJICAgICAgXAorCQkJPyAoX19idWlsdGluX2NvbnN0YW50X3AgKHMxKQkJCSAgICAgIFwKKwkJCSAgID8gX19zdHJjbXBfY2MgKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKHMxKSwgICAgIFwKKwkJCQkJICAoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChzMiksICAgICBcCisJCQkJCSAgc3RybGVuIChzMikpCQkJICAgICAgXAorCQkJICAgOiBfX3N0cmNtcF9nYyAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoczEpLCAgICAgXAorCQkJCQkgIChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKHMyKSwgICAgIFwKKwkJCQkJICBzdHJsZW4gKHMyKSkpCQkJICAgICAgXAorCQkJOiBfX3N0cmNtcF9nZyAoKHMxKSwgKHMyKSkpKSkpCisKKyNkZWZpbmUgX19zdHJjbXBfY2MoczEsIHMyLCBsKSBcCisgIChfX2V4dGVuc2lvbl9fICh7IHJlZ2lzdGVyIGludCBfX3Jlc3VsdCA9IChzMSlbMF0gLSAoczIpWzBdOwkJICAgICAgXAorCQkgICAgaWYgKGwgPiAwICYmIF9fcmVzdWx0ID09IDApCQkJCSAgICAgIFwKKwkJICAgICAgewkJCQkJCQkgICAgICBcCisJCQlfX3Jlc3VsdCA9IChzMSlbMV0gLSAoczIpWzFdOwkJCSAgICAgIFwKKwkJCWlmIChsID4gMSAmJiBfX3Jlc3VsdCA9PSAwKQkJCSAgICAgIFwKKwkJCSAgewkJCQkJCSAgICAgIFwKKwkJCSAgICBfX3Jlc3VsdCA9IChzMSlbMl0gLSAoczIpWzJdOwkJICAgICAgXAorCQkJICAgIGlmIChsID4gMiAmJiBfX3Jlc3VsdCA9PSAwKQkJCSAgICAgIFwKKwkJCSAgICAgIF9fcmVzdWx0ID0gKHMxKVszXSAtIChzMilbM107CQkgICAgICBcCisJCQkgIH0JCQkJCQkgICAgICBcCisJCSAgICAgIH0JCQkJCQkJICAgICAgXAorCQkgICAgX19yZXN1bHQ7IH0pKQorCisjZGVmaW5lIF9fc3RyY21wX2NnKHMxLCBzMiwgbDEpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgX19jb25zdCB1bnNpZ25lZCBjaGFyICpfX3MyID0gKHMyKTsJCQkgICAgICBcCisJCSAgICByZWdpc3RlciBpbnQgX19yZXN1bHQgPSAoczEpWzBdIC0gX19zMlswXTsJCSAgICAgIFwKKwkJICAgIGlmIChsMSA+IDAgJiYgX19yZXN1bHQgPT0gMCkJCQkgICAgICBcCisJCSAgICAgIHsJCQkJCQkJICAgICAgXAorCQkJX19yZXN1bHQgPSAoczEpWzFdIC0gX19zMlsxXTsJCQkgICAgICBcCisJCQlpZiAobDEgPiAxICYmIF9fcmVzdWx0ID09IDApCQkJICAgICAgXAorCQkJICB7CQkJCQkJICAgICAgXAorCQkJICAgIF9fcmVzdWx0ID0gKHMxKVsyXSAtIF9fczJbMl07CQkgICAgICBcCisJCQkgICAgaWYgKGwxID4gMiAmJiBfX3Jlc3VsdCA9PSAwKQkJICAgICAgXAorCQkJICAgICAgX19yZXN1bHQgPSAoczEpWzNdIC0gX19zMlszXTsJCSAgICAgIFwKKwkJCSAgfQkJCQkJCSAgICAgIFwKKwkJICAgICAgfQkJCQkJCQkgICAgICBcCisJCSAgICBfX3Jlc3VsdDsgfSkpCisKKyNkZWZpbmUgX19zdHJjbXBfZ2MoczEsIHMyLCBsMikgXAorICAoX19leHRlbnNpb25fXyAoeyBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKl9fczEgPSAoczEpOwkJCSAgICAgIFwKKwkJICAgIHJlZ2lzdGVyIGludCBfX3Jlc3VsdCA9IF9fczFbMF0gLSAoczIpWzBdOwkJICAgICAgXAorCQkgICAgaWYgKGwyID4gMCAmJiBfX3Jlc3VsdCA9PSAwKQkJCSAgICAgIFwKKwkJICAgICAgewkJCQkJCQkgICAgICBcCisJCQlfX3Jlc3VsdCA9IF9fczFbMV0gLSAoczIpWzFdOwkJCSAgICAgIFwKKwkJCWlmIChsMiA+IDEgJiYgX19yZXN1bHQgPT0gMCkJCQkgICAgICBcCisJCQkgIHsJCQkJCQkgICAgICBcCisJCQkgICAgX19yZXN1bHQgPSBfX3MxWzJdIC0gKHMyKVsyXTsJCSAgICAgIFwKKwkJCSAgICBpZiAobDIgPiAyICYmIF9fcmVzdWx0ID09IDApCQkgICAgICBcCisJCQkgICAgICBfX3Jlc3VsdCA9IF9fczFbM10gLSAoczIpWzNdOwkJICAgICAgXAorCQkJICB9CQkJCQkJICAgICAgXAorCQkgICAgICB9CQkJCQkJCSAgICAgIFwKKwkJICAgIF9fcmVzdWx0OyB9KSkKKworX19TVFJJTkdfSU5MSU5FIGludCBfX3N0cmNtcF9nZyAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIpOworCitfX1NUUklOR19JTkxJTkUgaW50CitfX3N0cmNtcF9nZyAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIpCit7CisgIHJlZ2lzdGVyIGludCBfX3JlczsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoIjE6XG5cdCIKKyAgICAgIm1vdmIJKCUxKSwlYjBcblx0IgorICAgICAibGVhbAkxKCUxKSwlMVxuXHQiCisgICAgICJjbXBiCSViMCwoJTIpXG5cdCIKKyAgICAgImpuZQkyZlxuXHQiCisgICAgICJsZWFsCTEoJTIpLCUyXG5cdCIKKyAgICAgInRlc3RiCSViMCwlYjBcblx0IgorICAgICAiam5lCTFiXG5cdCIKKyAgICAgInhvcmwJJTAsJTBcblx0IgorICAgICAiam1wCTNmXG4iCisgICAgICIyOlxuXHQiCisgICAgICJtb3ZsCSQxLCUwXG5cdCIKKyAgICAgImpiCTNmXG5cdCIKKyAgICAgIm5lZ2wJJTBcbiIKKyAgICAgIjM6IgorICAgICA6ICI9cSIgKF9fcmVzKSwgIj0mciIgKF9fczEpLCAiPSZyIiAoX19zMikKKyAgICAgOiAiMSIgKF9fczEpLCAiMiIgKF9fczIpLAorICAgICAgICJtIiAoICooc3RydWN0IHsgY2hhciBfX3hbMHhmZmZmZmZmXTsgfSAqKV9fczEpLAorICAgICAgICJtIiAoICooc3RydWN0IHsgY2hhciBfX3hbMHhmZmZmZmZmXTsgfSAqKV9fczIpCisgICAgIDogImNjIik7CisgIHJldHVybiBfX3JlczsKK30KKworCisvKiBDb21wYXJlIE4gY2hhcmFjdGVycyBvZiBTMSBhbmQgUzIuICAqLworI2RlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9zdHJuY21wIDEKKyNkZWZpbmUgc3RybmNtcChzMSwgczIsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMSkgJiYgc3RybGVuIChzMSkgPCAoKHNpemVfdCkgKG4pKSAgIFwKKwkJICA/IHN0cmNtcCAoKHMxKSwgKHMyKSkJCQkJCSAgICAgIFwKKwkJICA6IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczIpICYmIHN0cmxlbiAoczIpIDwgKChzaXplX3QpIChuKSlcCisJCSAgICAgPyBzdHJjbXAgKChzMSksIChzMikpCQkJCSAgICAgIFwKKwkJICAgICA6IF9fc3RybmNtcF9nICgoczEpLCAoczIpLCAobikpKSkpCisKK19fU1RSSU5HX0lOTElORSBpbnQgX19zdHJuY21wX2cgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyLAorCQkJCSBzaXplX3QgX19uKTsKKworX19TVFJJTkdfSU5MSU5FIGludAorX19zdHJuY21wX2cgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyLCBzaXplX3QgX19uKQoreworICByZWdpc3RlciBpbnQgX19yZXM7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCIxOlxuXHQiCisgICAgICJzdWJsCSQxLCUzXG5cdCIKKyAgICAgImpjCTJmXG5cdCIKKyAgICAgIm1vdmIJKCUxKSwlYjBcblx0IgorICAgICAiaW5jbAklMVxuXHQiCisgICAgICJjbXBiCSViMCwoJTIpXG5cdCIKKyAgICAgImpuZQkzZlxuXHQiCisgICAgICJpbmNsCSUyXG5cdCIKKyAgICAgInRlc3RiCSViMCwlYjBcblx0IgorICAgICAiam5lCTFiXG4iCisgICAgICIyOlxuXHQiCisgICAgICJ4b3JsCSUwLCUwXG5cdCIKKyAgICAgImptcAk0ZlxuIgorICAgICAiMzpcblx0IgorICAgICAibW92bAkkMSwlMFxuXHQiCisgICAgICJqYgk0ZlxuXHQiCisgICAgICJuZWdsCSUwXG4iCisgICAgICI0OiIKKyAgICAgOiAiPXEiIChfX3JlcyksICI9JnIiIChfX3MxKSwgIj0mciIgKF9fczIpLCAiPSZyIiAoX19uKQorICAgICA6ICIxIiAgKF9fczEpLCAiMiIgIChfX3MyKSwgICIzIiAoX19uKSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IF9fZXh0ZW5zaW9uX18gY2hhciBfX3hbX19uXTsgfSAqKV9fczEpLAorICAgICAgICJtIiAoICooc3RydWN0IHsgX19leHRlbnNpb25fXyBjaGFyIF9feFtfX25dOyB9ICopX19zMikKKyAgICAgOiAiY2MiKTsKKyAgcmV0dXJuIF9fcmVzOworfQorCisKKy8qIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgQyBpbiBTLiAgKi8KKyNkZWZpbmUgX0hBVkVfU1RSSU5HX0FSQ0hfc3RyY2hyIDEKKyNkZWZpbmUgX1VTRV9TVFJJTkdfQVJDSF9zdHJjaHIgMQorI2RlZmluZSBzdHJjaHIocywgYykgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKGMpCQkJCSAgICAgIFwKKwkJICA/ICgoYykgPT0gJ1wwJwkJCQkJICAgICAgXAorCQkgICAgID8gKGNoYXIgKikgX19yYXdtZW1jaHIgKChzKSwgKGMpKQkJCSAgICAgIFwKKwkJICAgICA6IF9fc3RyY2hyX2MgKChzKSwgKChjKSAmIDB4ZmYpIDw8IDgpKQkJICAgICAgXAorCQkgIDogX19zdHJjaHJfZyAoKHMpLCAoYykpKSkKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RyY2hyX2MgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKTsKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJjaHJfYyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDA7CisgIHJlZ2lzdGVyIGNoYXIgKl9fcmVzOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiMTpcblx0IgorICAgICAibW92YgkoJTApLCUlYWxcblx0IgorICAgICAiY21wYgklJWFoLCUlYWxcblx0IgorICAgICAiamUJMmZcblx0IgorICAgICAibGVhbAkxKCUwKSwlMFxuXHQiCisgICAgICJ0ZXN0YgklJWFsLCUlYWxcblx0IgorICAgICAiam5lCTFiXG5cdCIKKyAgICAgInhvcmwJJTAsJTBcbiIKKyAgICAgIjI6IgorICAgICA6ICI9ciIgKF9fcmVzKSwgIj0mYSIgKF9fZDApCisgICAgIDogIjAiIChfX3MpLCAiMSIgKF9fYyksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBjaGFyIF9feFsweGZmZmZmZmZdOyB9ICopX19zKQorICAgICA6ICJjYyIpOworICByZXR1cm4gX19yZXM7Cit9CisKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cmNocl9nIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYyk7CisKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RyY2hyX2cgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKQoreworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwOworICByZWdpc3RlciBjaGFyICpfX3JlczsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoIm1vdmIJJSVhbCwlJWFoXG4iCisgICAgICIxOlxuXHQiCisgICAgICJtb3ZiCSglMCksJSVhbFxuXHQiCisgICAgICJjbXBiCSUlYWgsJSVhbFxuXHQiCisgICAgICJqZQkyZlxuXHQiCisgICAgICJsZWFsCTEoJTApLCUwXG5cdCIKKyAgICAgInRlc3RiCSUlYWwsJSVhbFxuXHQiCisgICAgICJqbmUJMWJcblx0IgorICAgICAieG9ybAklMCwlMFxuIgorICAgICAiMjoiCisgICAgIDogIj1yIiAoX19yZXMpLCAiPSZhIiAoX19kMCkKKyAgICAgOiAiMCIgKF9fcyksICIxIiAoX19jKSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IGNoYXIgX194WzB4ZmZmZmZmZl07IH0gKilfX3MpCisgICAgIDogImNjIik7CisgIHJldHVybiBfX3JlczsKK30KKworCisvKiBGaW5kIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIEMgaW4gUyBvciB0aGUgZmluYWwgTlVMIGJ5dGUuICAqLworI2RlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9zdHJjaHJudWwgMQorI2RlZmluZSBfX3N0cmNocm51bChzLCBjKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYykJCQkJICAgICAgXAorCQkgID8gKChjKSA9PSAnXDAnCQkJCQkgICAgICBcCisJCSAgICAgPyAoY2hhciAqKSBfX3Jhd21lbWNociAoKHMpLCBjKQkJCSAgICAgIFwKKwkJICAgICA6IF9fc3RyY2hybnVsX2MgKChzKSwgKChjKSAmIDB4ZmYpIDw8IDgpKQkJICAgICAgXAorCQkgIDogX19zdHJjaHJudWxfZyAoKHMpLCBjKSkpCisKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cmNocm51bF9jIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYyk7CisKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RyY2hybnVsX2MgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKQoreworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwOworICByZWdpc3RlciBjaGFyICpfX3JlczsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoIjE6XG5cdCIKKyAgICAgIm1vdmIJKCUwKSwlJWFsXG5cdCIKKyAgICAgImNtcGIJJSVhaCwlJWFsXG5cdCIKKyAgICAgImplCTJmXG5cdCIKKyAgICAgImxlYWwJMSglMCksJTBcblx0IgorICAgICAidGVzdGIJJSVhbCwlJWFsXG5cdCIKKyAgICAgImpuZQkxYlxuXHQiCisgICAgICJkZWNsCSUwXG4iCisgICAgICIyOiIKKyAgICAgOiAiPXIiIChfX3JlcyksICI9JmEiIChfX2QwKQorICAgICA6ICIwIiAoX19zKSwgIjEiIChfX2MpLAorICAgICAgICJtIiAoICooc3RydWN0IHsgY2hhciBfX3hbMHhmZmZmZmZmXTsgfSAqKV9fcykKKyAgICAgOiAiY2MiKTsKKyAgcmV0dXJuIF9fcmVzOworfQorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJjaHJudWxfZyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpOworCitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cmNocm51bF9nIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMDsKKyAgcmVnaXN0ZXIgY2hhciAqX19yZXM7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJtb3ZiCSUlYWwsJSVhaFxuIgorICAgICAiMTpcblx0IgorICAgICAibW92YgkoJTApLCUlYWxcblx0IgorICAgICAiY21wYgklJWFoLCUlYWxcblx0IgorICAgICAiamUJMmZcblx0IgorICAgICAibGVhbAkxKCUwKSwlMFxuXHQiCisgICAgICJ0ZXN0YgklJWFsLCUlYWxcblx0IgorICAgICAiam5lCTFiXG5cdCIKKyAgICAgImRlY2wJJTBcbiIKKyAgICAgIjI6IgorICAgICA6ICI9ciIgKF9fcmVzKSwgIj0mYSIgKF9fZDApCisgICAgIDogIjAiIChfX3MpLCAiMSIgKF9fYyksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBjaGFyIF9feFsweGZmZmZmZmZdOyB9ICopX19zKQorICAgICA6ICJjYyIpOworICByZXR1cm4gX19yZXM7Cit9CisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBzdHJjaHJudWwocywgYykgX19zdHJjaHJudWwgKChzKSwgKGMpKQorI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgQyBpbiBTLiAgVGhpcyBpcyB0aGUgQlNEIG5hbWUuICAqLworIyBkZWZpbmUgX0hBVkVfU1RSSU5HX0FSQ0hfaW5kZXggMQorIyBkZWZpbmUgaW5kZXgocywgYykgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKGMpCQkJCSAgICAgIFwKKwkJICA/IF9fc3RyY2hyX2MgKChzKSwgKChjKSAmIDB4ZmYpIDw8IDgpCQkJICAgICAgXAorCQkgIDogX19zdHJjaHJfZyAoKHMpLCAoYykpKSkKKyNlbmRpZgorCisKKy8qIEZpbmQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBDIGluIFMuICAqLworI2RlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9zdHJyY2hyIDEKKyNkZWZpbmUgc3RycmNocihzLCBjKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYykJCQkJICAgICAgXAorCQkgID8gX19zdHJyY2hyX2MgKChzKSwgKChjKSAmIDB4ZmYpIDw8IDgpCQkgICAgICBcCisJCSAgOiBfX3N0cnJjaHJfZyAoKHMpLCAoYykpKSkKKworI2lmZGVmIF9faTY4Nl9fCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJyY2hyX2MgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKTsKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJyY2hyX2MgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKQoreworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwLCBfX2QxOworICByZWdpc3RlciBjaGFyICpfX3JlczsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoImNsZFxuIgorICAgICAiMTpcblx0IgorICAgICAibG9kc2Jcblx0IgorICAgICAiY21wYgklaDIsJWIyXG5cdCIKKyAgICAgImNtb3ZlCSUxLCUwXG5cdCIKKyAgICAgInRlc3RiCSViMiwlYjJcblx0IgorICAgICAiam5lIDFiIgorICAgICA6ICI9ZCIgKF9fcmVzKSwgIj0mUyIgKF9fZDApLCAiPSZhIiAoX19kMSkKKyAgICAgOiAiMCIgKDEpLCAiMSIgKF9fcyksICIyIiAoX19jKSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IGNoYXIgX194WzB4ZmZmZmZmZl07IH0gKilfX3MpCisgICAgIDogImNjIik7CisgIHJldHVybiBfX3JlcyAtIDE7Cit9CisKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cnJjaHJfZyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpOworCitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cnJjaHJfZyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDAsIF9fZDE7CisgIHJlZ2lzdGVyIGNoYXIgKl9fcmVzOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgibW92YgklYjIsJWgyXG4iCisgICAgICJjbGRcblx0IgorICAgICAiMTpcblx0IgorICAgICAibG9kc2Jcblx0IgorICAgICAiY21wYgklaDIsJWIyXG5cdCIKKyAgICAgImNtb3ZlCSUxLCUwXG5cdCIKKyAgICAgInRlc3RiCSViMiwlYjJcblx0IgorICAgICAiam5lIDFiIgorICAgICA6ICI9ZCIgKF9fcmVzKSwgIj0mUyIgKF9fZDApLCAiPSZhIiAoX19kMSkKKyAgICAgOiAiMCIgKDEpLCAiMSIgKF9fcyksICIyIiAoX19jKSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IGNoYXIgX194WzB4ZmZmZmZmZl07IH0gKilfX3MpCisgICAgIDogImNjIik7CisgIHJldHVybiBfX3JlcyAtIDE7Cit9CisjZWxzZQorX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RycmNocl9jIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYyk7CisKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RycmNocl9jIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMCwgX19kMTsKKyAgcmVnaXN0ZXIgY2hhciAqX19yZXM7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJjbGRcbiIKKyAgICAgIjE6XG5cdCIKKyAgICAgImxvZHNiXG5cdCIKKyAgICAgImNtcGIJJSVhaCwlJWFsXG5cdCIKKyAgICAgImpuZQkyZlxuXHQiCisgICAgICJsZWFsCS0xKCUlZXNpKSwlMFxuIgorICAgICAiMjpcblx0IgorICAgICAidGVzdGIJJSVhbCwlJWFsXG5cdCIKKyAgICAgImpuZSAxYiIKKyAgICAgOiAiPWQiIChfX3JlcyksICI9JlMiIChfX2QwKSwgIj0mYSIgKF9fZDEpCisgICAgIDogIjAiICgwKSwgIjEiIChfX3MpLCAiMiIgKF9fYyksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBjaGFyIF9feFsweGZmZmZmZmZdOyB9ICopX19zKQorICAgICA6ICJjYyIpOworICByZXR1cm4gX19yZXM7Cit9CisKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cnJjaHJfZyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpOworCitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cnJjaHJfZyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDAsIF9fZDE7CisgIHJlZ2lzdGVyIGNoYXIgKl9fcmVzOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgibW92YgklJWFsLCUlYWhcbiIKKyAgICAgImNsZFxuXHQiCisgICAgICIxOlxuXHQiCisgICAgICJsb2RzYlxuXHQiCisgICAgICJjbXBiCSUlYWgsJSVhbFxuXHQiCisgICAgICJqbmUJMmZcblx0IgorICAgICAibGVhbAktMSglJWVzaSksJTBcbiIKKyAgICAgIjI6XG5cdCIKKyAgICAgInRlc3RiCSUlYWwsJSVhbFxuXHQiCisgICAgICJqbmUgMWIiCisgICAgIDogIj1yIiAoX19yZXMpLCAiPSZTIiAoX19kMCksICI9JmEiIChfX2QxKQorICAgICA6ICIwIiAoMCksICIxIiAoX19zKSwgIjIiIChfX2MpLAorICAgICAgICJtIiAoICooc3RydWN0IHsgY2hhciBfX3hbMHhmZmZmZmZmXTsgfSAqKV9fcykKKyAgICAgOiAiY2MiKTsKKyAgcmV0dXJuIF9fcmVzOworfQorI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIEZpbmQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBDIGluIFMuICBUaGlzIGlzIHRoZSBCU0QgbmFtZS4gICovCisjIGRlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9yaW5kZXggMQorIyBkZWZpbmUgcmluZGV4KHMsIGMpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChjKQkJCQkgICAgICBcCisJCSAgPyBfX3N0cnJjaHJfYyAoKHMpLCAoKGMpICYgMHhmZikgPDwgOCkJCSAgICAgIFwKKwkJICA6IF9fc3RycmNocl9nICgocyksIChjKSkpKQorI2VuZGlmCisKKworLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgc2VnbWVudCBvZiBTIHdoaWNoCisgICBjb25zaXN0cyBlbnRpcmVseSBvZiBjaGFyYWN0ZXJzIG5vdCBpbiBSRUpFQ1QuICAqLworI2RlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9zdHJjc3BuIDEKKyNkZWZpbmUgc3RyY3NwbihzLCByZWplY3QpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChyZWplY3QpICYmIHNpemVvZiAoKHJlamVjdClbMF0pID09IDEgIFwKKwkJICA/ICgocmVqZWN0KVswXSA9PSAnXDAnCQkJCSAgICAgIFwKKwkJICAgICA/IHN0cmxlbiAocykJCQkJCSAgICAgIFwKKwkJICAgICA6ICgocmVqZWN0KVsxXSA9PSAnXDAnCQkJCSAgICAgIFwKKwkJCT8gX19zdHJjc3BuX2MxICgocyksICgoKHJlamVjdClbMF0gPDwgOCkgJiAweGZmMDApKSAgIFwKKwkJCTogX19zdHJjc3BuX2NnICgocyksIChyZWplY3QpLCBzdHJsZW4gKHJlamVjdCkpKSkgICAgIFwKKwkJICA6IF9fc3RyY3Nwbl9nICgocyksIChyZWplY3QpKSkpCisKK19fU1RSSU5HX0lOTElORSBzaXplX3QgX19zdHJjc3BuX2MxIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fcmVqZWN0KTsKKworI2lmbmRlZiBfRk9SQ0VfSU5MSU5FUworX19TVFJJTkdfSU5MSU5FIHNpemVfdAorX19zdHJjc3BuX2MxIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fcmVqZWN0KQoreworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwOworICByZWdpc3RlciBjaGFyICpfX3JlczsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoIjE6XG5cdCIKKyAgICAgIm1vdmIJKCUwKSwlJWFsXG5cdCIKKyAgICAgImxlYWwJMSglMCksJTBcblx0IgorICAgICAiY21wYgklJWFoLCUlYWxcblx0IgorICAgICAiamUJMmZcblx0IgorICAgICAidGVzdGIJJSVhbCwlJWFsXG5cdCIKKyAgICAgImpuZQkxYlxuIgorICAgICAiMjoiCisgICAgIDogIj1yIiAoX19yZXMpLCAiPSZhIiAoX19kMCkKKyAgICAgOiAiMCIgKF9fcyksICIxIiAoX19yZWplY3QpLAorICAgICAgICJtIiAoICooc3RydWN0IHsgY2hhciBfX3hbMHhmZmZmZmZmXTsgfSAqKV9fcykKKyAgICAgOiAiY2MiKTsKKyAgcmV0dXJuIChfX3JlcyAtIDEpIC0gX19zOworfQorI2VuZGlmCisKK19fU1RSSU5HX0lOTElORSBzaXplX3QgX19zdHJjc3BuX2NnIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBjaGFyIF9fcmVqZWN0W10sCisJCQkJICAgIHNpemVfdCBfX3JlamVjdF9sZW4pOworCitfX1NUUklOR19JTkxJTkUgc2l6ZV90CitfX3N0cmNzcG5fY2cgKF9fY29uc3QgY2hhciAqX19zLCBfX2NvbnN0IGNoYXIgX19yZWplY3RbXSwgc2l6ZV90IF9fcmVqZWN0X2xlbikKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMCwgX19kMSwgX19kMjsKKyAgcmVnaXN0ZXIgX19jb25zdCBjaGFyICpfX3JlczsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoImNsZFxuIgorICAgICAiMTpcblx0IgorICAgICAibG9kc2Jcblx0IgorICAgICAidGVzdGIJJSVhbCwlJWFsXG5cdCIKKyAgICAgImplCTJmXG5cdCIKKyAgICAgIm1vdmwJJTUsJSVlZGlcblx0IgorICAgICAibW92bAklNiwlJWVjeFxuXHQiCisgICAgICJyZXBuZTsgc2Nhc2Jcblx0IgorICAgICAiam5lCTFiXG4iCisgICAgICIyOiIKKyAgICAgOiAiPVMiIChfX3JlcyksICI9JmEiIChfX2QwKSwgIj0mYyIgKF9fZDEpLCAiPSZEIiAoX19kMikKKyAgICAgOiAiMCIgKF9fcyksICJkIiAoX19yZWplY3QpLCAiZyIgKF9fcmVqZWN0X2xlbikKKyAgICAgOiAibWVtb3J5IiwgImNjIik7CisgIHJldHVybiAoX19yZXMgLSAxKSAtIF9fczsKK30KKworX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cmNzcG5fZyAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciAqX19yZWplY3QpOworI2lmZGVmIF9fUElDX18KKworX19TVFJJTkdfSU5MSU5FIHNpemVfdAorX19zdHJjc3BuX2cgKF9fY29uc3QgY2hhciAqX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVqZWN0KQoreworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwLCBfX2QxLCBfX2QyOworICByZWdpc3RlciBfX2NvbnN0IGNoYXIgKl9fcmVzOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgicHVzaGwJJSVlYnhcblx0IgorICAgICAibW92bAklNCwlJWVkaVxuXHQiCisgICAgICJjbGRcblx0IgorICAgICAicmVwbmU7IHNjYXNiXG5cdCIKKyAgICAgIm5vdGwJJSVlY3hcblx0IgorICAgICAibGVhbAktMSglJWVjeCksJSVlYnhcbiIKKyAgICAgIjE6XG5cdCIKKyAgICAgImxvZHNiXG5cdCIKKyAgICAgInRlc3RiCSUlYWwsJSVhbFxuXHQiCisgICAgICJqZQkyZlxuXHQiCisgICAgICJtb3ZsCSU0LCUlZWRpXG5cdCIKKyAgICAgIm1vdmwJJSVlYngsJSVlY3hcblx0IgorICAgICAicmVwbmU7IHNjYXNiXG5cdCIKKyAgICAgImpuZQkxYlxuIgorICAgICAiMjpcblx0IgorICAgICAicG9wbAklJWVieCIKKyAgICAgOiAiPVMiIChfX3JlcyksICI9JmEiIChfX2QwKSwgIj0mYyIgKF9fZDEpLCAiPSZEIiAoX19kMikKKyAgICAgOiAiciIgKF9fcmVqZWN0KSwgIjAiIChfX3MpLCAiMSIgKDApLCAiMiIgKDB4ZmZmZmZmZmYpCisgICAgIDogIm1lbW9yeSIsICJjYyIpOworICByZXR1cm4gKF9fcmVzIC0gMSkgLSBfX3M7Cit9CisjZWxzZQorX19TVFJJTkdfSU5MSU5FIHNpemVfdAorX19zdHJjc3BuX2cgKF9fY29uc3QgY2hhciAqX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVqZWN0KQoreworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwLCBfX2QxLCBfX2QyLCBfX2QzOworICByZWdpc3RlciBfX2NvbnN0IGNoYXIgKl9fcmVzOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiY2xkXG5cdCIKKyAgICAgInJlcG5lOyBzY2FzYlxuXHQiCisgICAgICJub3RsCSUlZWN4XG5cdCIKKyAgICAgImxlYWwJLTEoJSVlY3gpLCUlZWR4XG4iCisgICAgICIxOlxuXHQiCisgICAgICJsb2RzYlxuXHQiCisgICAgICJ0ZXN0YgklJWFsLCUlYWxcblx0IgorICAgICAiamUJMmZcblx0IgorICAgICAibW92bAklJWVieCwlJWVkaVxuXHQiCisgICAgICJtb3ZsCSUlZWR4LCUlZWN4XG5cdCIKKyAgICAgInJlcG5lOyBzY2FzYlxuXHQiCisgICAgICJqbmUJMWJcbiIKKyAgICAgIjI6IgorICAgICA6ICI9UyIgKF9fcmVzKSwgIj0mYSIgKF9fZDApLCAiPSZjIiAoX19kMSksICI9JkQiIChfX2QyKSwgIj0mZCIgKF9fZDMpCisgICAgIDogIjAiIChfX3MpLCAiMSIgKDApLCAiMiIgKDB4ZmZmZmZmZmYpLCAiMyIgKF9fcmVqZWN0KSwgImIiIChfX3JlamVjdCkKKyAgICAgLyogQ2xvYmJlciBtZW1vcnksIG90aGVyd2lzZSBHQ0MgY2Fubm90IGhhbmRsZSB0aGlzLiAgKi8KKyAgICAgOiAibWVtb3J5IiwgImNjIik7CisgIHJldHVybiAoX19yZXMgLSAxKSAtIF9fczsKK30KKyNlbmRpZgorCisKKy8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbml0aWFsIHNlZ21lbnQgb2YgUyB3aGljaAorICAgY29uc2lzdHMgZW50aXJlbHkgb2YgY2hhcmFjdGVycyBpbiBBQ0NFUFQuICAqLworI2RlZmluZSBfSEFWRV9TVFJJTkdfQVJDSF9zdHJzcG4gMQorI2RlZmluZSBzdHJzcG4ocywgYWNjZXB0KSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYWNjZXB0KSAmJiBzaXplb2YgKChhY2NlcHQpWzBdKSA9PSAxICBcCisJCSAgPyAoKGFjY2VwdClbMF0gPT0gJ1wwJwkJCQkgICAgICBcCisJCSAgICAgPyAoKHZvaWQpIChzKSwgMCkJCQkJCSAgICAgIFwKKwkJICAgICA6ICgoYWNjZXB0KVsxXSA9PSAnXDAnCQkJCSAgICAgIFwKKwkJCT8gX19zdHJzcG5fYzEgKChzKSwgKCgoYWNjZXB0KVswXSA8PCA4ICkgJiAweGZmMDApKSAgIFwKKwkJCTogX19zdHJzcG5fY2cgKChzKSwgKGFjY2VwdCksIHN0cmxlbiAoYWNjZXB0KSkpKSAgICAgIFwKKwkJICA6IF9fc3Ryc3BuX2cgKChzKSwgKGFjY2VwdCkpKSkKKworI2lmbmRlZiBfRk9SQ0VfSU5MSU5FUworX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cnNwbl9jMSAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2FjY2VwdCk7CisKK19fU1RSSU5HX0lOTElORSBzaXplX3QKK19fc3Ryc3BuX2MxIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYWNjZXB0KQoreworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwOworICByZWdpc3RlciBjaGFyICpfX3JlczsKKyAgLyogUGxlYXNlIG5vdGUgdGhhdCBfX2FjY2VwdCBuZXZlciBjYW4gYmUgJ1wwJy4gICovCisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCIxOlxuXHQiCisgICAgICJtb3ZiCSglMCksJWIxXG5cdCIKKyAgICAgImxlYWwJMSglMCksJTBcblx0IgorICAgICAiY21wYgklaDEsJWIxXG5cdCIKKyAgICAgImplCTFiIgorICAgICA6ICI9ciIgKF9fcmVzKSwgIj0mcSIgKF9fZDApCisgICAgIDogIjAiIChfX3MpLCAiMSIgKF9fYWNjZXB0KSwKKyAgICAgICAibSIgKCAqKHN0cnVjdCB7IGNoYXIgX194WzB4ZmZmZmZmZl07IH0gKilfX3MpCisgICAgIDogImNjIik7CisgIHJldHVybiAoX19yZXMgLSAxKSAtIF9fczsKK30KKyNlbmRpZgorCitfX1NUUklOR19JTkxJTkUgc2l6ZV90IF9fc3Ryc3BuX2NnIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBjaGFyIF9fYWNjZXB0W10sCisJCQkJICAgIHNpemVfdCBfX2FjY2VwdF9sZW4pOworCitfX1NUUklOR19JTkxJTkUgc2l6ZV90CitfX3N0cnNwbl9jZyAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciBfX2FjY2VwdFtdLCBzaXplX3QgX19hY2NlcHRfbGVuKQoreworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwLCBfX2QxLCBfX2QyOworICByZWdpc3RlciBfX2NvbnN0IGNoYXIgKl9fcmVzOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiY2xkXG4iCisgICAgICIxOlxuXHQiCisgICAgICJsb2RzYlxuXHQiCisgICAgICJ0ZXN0YgklJWFsLCUlYWxcblx0IgorICAgICAiamUJMmZcblx0IgorICAgICAibW92bAklNSwlJWVkaVxuXHQiCisgICAgICJtb3ZsCSU2LCUlZWN4XG5cdCIKKyAgICAgInJlcG5lOyBzY2FzYlxuXHQiCisgICAgICJqZQkxYlxuIgorICAgICAiMjoiCisgICAgIDogIj1TIiAoX19yZXMpLCAiPSZhIiAoX19kMCksICI9JmMiIChfX2QxKSwgIj0mRCIgKF9fZDIpCisgICAgIDogIjAiIChfX3MpLCAiZyIgKF9fYWNjZXB0KSwgImciIChfX2FjY2VwdF9sZW4pLAorICAgICAgIC8qIFNpbmNlIHdlIGRvIG5vdCBrbm93IGhvdyBsYXJnZSB0aGUgbWVtb3J5IHdlIGFjY2VzcyBpdCwgdXNlIGEKKwkgIHJlYWxseSBsYXJnZSBhbW91bnQuICAqLworICAgICAgICJtIiAoICooc3RydWN0IHsgY2hhciBfX3hbMHhmZmZmZmZmXTsgfSAqKV9fcyksCisgICAgICAgIm0iICggKihzdHJ1Y3QgeyBfX2V4dGVuc2lvbl9fIGNoYXIgX194W19fYWNjZXB0X2xlbl07IH0gKilfX2FjY2VwdCkKKyAgICAgOiAiY2MiKTsKKyAgcmV0dXJuIChfX3JlcyAtIDEpIC0gX19zOworfQorCitfX1NUUklOR19JTkxJTkUgc2l6ZV90IF9fc3Ryc3BuX2cgKF9fY29uc3QgY2hhciAqX19zLCBfX2NvbnN0IGNoYXIgKl9fYWNjZXB0KTsKKyNpZmRlZiBfX1BJQ19fCisKK19fU1RSSU5HX0lOTElORSBzaXplX3QKK19fc3Ryc3BuX2cgKF9fY29uc3QgY2hhciAqX19zLCBfX2NvbnN0IGNoYXIgKl9fYWNjZXB0KQoreworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwLCBfX2QxLCBfX2QyOworICByZWdpc3RlciBfX2NvbnN0IGNoYXIgKl9fcmVzOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgicHVzaGwJJSVlYnhcblx0IgorICAgICAiY2xkXG5cdCIKKyAgICAgInJlcG5lOyBzY2FzYlxuXHQiCisgICAgICJub3RsCSUlZWN4XG5cdCIKKyAgICAgImxlYWwJLTEoJSVlY3gpLCUlZWJ4XG4iCisgICAgICIxOlxuXHQiCisgICAgICJsb2RzYlxuXHQiCisgICAgICJ0ZXN0YgklJWFsLCUlYWxcblx0IgorICAgICAiamUJMmZcblx0IgorICAgICAibW92bAklJWVkeCwlJWVkaVxuXHQiCisgICAgICJtb3ZsCSUlZWJ4LCUlZWN4XG5cdCIKKyAgICAgInJlcG5lOyBzY2FzYlxuXHQiCisgICAgICJqZQkxYlxuIgorICAgICAiMjpcblx0IgorICAgICAicG9wbAklJWVieCIKKyAgICAgOiAiPVMiIChfX3JlcyksICI9JmEiIChfX2QwKSwgIj0mYyIgKF9fZDEpLCAiPSZEIiAoX19kMikKKyAgICAgOiAiZCIgKF9fYWNjZXB0KSwgIjAiIChfX3MpLCAiMSIgKDApLCAiMiIgKDB4ZmZmZmZmZmYpLCAiMyIgKF9fYWNjZXB0KQorICAgICA6ICJtZW1vcnkiLCAiY2MiKTsKKyAgcmV0dXJuIChfX3JlcyAtIDEpIC0gX19zOworfQorI2Vsc2UKK19fU1RSSU5HX0lOTElORSBzaXplX3QKK19fc3Ryc3BuX2cgKF9fY29uc3QgY2hhciAqX19zLCBfX2NvbnN0IGNoYXIgKl9fYWNjZXB0KQoreworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwLCBfX2QxLCBfX2QyLCBfX2QzOworICByZWdpc3RlciBfX2NvbnN0IGNoYXIgKl9fcmVzOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiY2xkXG5cdCIKKyAgICAgInJlcG5lOyBzY2FzYlxuXHQiCisgICAgICJub3RsCSUlZWN4XG5cdCIKKyAgICAgImxlYWwJLTEoJSVlY3gpLCUlZWR4XG4iCisgICAgICIxOlxuXHQiCisgICAgICJsb2RzYlxuXHQiCisgICAgICJ0ZXN0YgklJWFsLCUlYWxcblx0IgorICAgICAiamUJMmZcblx0IgorICAgICAibW92bAklJWVieCwlJWVkaVxuXHQiCisgICAgICJtb3ZsCSUlZWR4LCUlZWN4XG5cdCIKKyAgICAgInJlcG5lOyBzY2FzYlxuXHQiCisgICAgICJqZQkxYlxuIgorICAgICAiMjoiCisgICAgIDogIj1TIiAoX19yZXMpLCAiPSZhIiAoX19kMCksICI9JmMiIChfX2QxKSwgIj0mRCIgKF9fZDIpLCAiPSZkIiAoX19kMykKKyAgICAgOiAiMCIgKF9fcyksICIxIiAoMCksICIyIiAoMHhmZmZmZmZmZiksICIzIiAoX19hY2NlcHQpLCAiYiIgKF9fYWNjZXB0KQorICAgICA6ICJtZW1vcnkiLCAiY2MiKTsKKyAgcmV0dXJuIChfX3JlcyAtIDEpIC0gX19zOworfQorI2VuZGlmCisKKworLyogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBpbiBTIG9mIGFueSBjaGFyYWN0ZXIgaW4gQUNDRVBULiAgKi8KKyNkZWZpbmUgX0hBVkVfU1RSSU5HX0FSQ0hfc3RycGJyayAxCisjZGVmaW5lIHN0cnBicmsocywgYWNjZXB0KSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYWNjZXB0KSAmJiBzaXplb2YgKChhY2NlcHQpWzBdKSA9PSAxICBcCisJCSAgPyAoKGFjY2VwdClbMF0gPT0gJ1wwJwkJCQkgICAgICBcCisJCSAgICAgPyAoKHZvaWQpIChzKSwgKGNoYXIgKikgMCkJCQkJICAgICAgXAorCQkgICAgIDogKChhY2NlcHQpWzFdID09ICdcMCcJCQkJICAgICAgXAorCQkJPyBzdHJjaHIgKChzKSwgKGFjY2VwdClbMF0pCQkJICAgICAgXAorCQkJOiBfX3N0cnBicmtfY2cgKChzKSwgKGFjY2VwdCksIHN0cmxlbiAoYWNjZXB0KSkpKSAgICAgXAorCQkgIDogX19zdHJwYnJrX2cgKChzKSwgKGFjY2VwdCkpKSkKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RycGJya19jZyAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciBfX2FjY2VwdFtdLAorCQkJCSAgICBzaXplX3QgX19hY2NlcHRfbGVuKTsKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJwYnJrX2NnIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBjaGFyIF9fYWNjZXB0W10sIHNpemVfdCBfX2FjY2VwdF9sZW4pCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDAsIF9fZDEsIF9fZDI7CisgIHJlZ2lzdGVyIGNoYXIgKl9fcmVzOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiY2xkXG4iCisgICAgICIxOlxuXHQiCisgICAgICJsb2RzYlxuXHQiCisgICAgICJ0ZXN0YgklJWFsLCUlYWxcblx0IgorICAgICAiamUJMmZcblx0IgorICAgICAibW92bAklNSwlJWVkaVxuXHQiCisgICAgICJtb3ZsCSU2LCUlZWN4XG5cdCIKKyAgICAgInJlcG5lOyBzY2FzYlxuXHQiCisgICAgICJqbmUJMWJcblx0IgorICAgICAiZGVjbAklMFxuXHQiCisgICAgICJqbXAJM2ZcbiIKKyAgICAgIjI6XG5cdCIKKyAgICAgInhvcmwJJTAsJTBcbiIKKyAgICAgIjM6IgorICAgICA6ICI9UyIgKF9fcmVzKSwgIj0mYSIgKF9fZDApLCAiPSZjIiAoX19kMSksICI9JkQiIChfX2QyKQorICAgICA6ICIwIiAoX19zKSwgImQiIChfX2FjY2VwdCksICJnIiAoX19hY2NlcHRfbGVuKQorICAgICA6ICJtZW1vcnkiLCAiY2MiKTsKKyAgcmV0dXJuIF9fcmVzOworfQorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJwYnJrX2cgKF9fY29uc3QgY2hhciAqX19zLCBfX2NvbnN0IGNoYXIgKl9fYWNjZXB0KTsKKyNpZmRlZiBfX1BJQ19fCisKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RycGJya19nIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBjaGFyICpfX2FjY2VwdCkKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMCwgX19kMSwgX19kMjsKKyAgcmVnaXN0ZXIgY2hhciAqX19yZXM7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJwdXNobAklJWVieFxuXHQiCisgICAgICJtb3ZsCSUlZWR4LCUlZWRpXG5cdCIKKyAgICAgImNsZFxuXHQiCisgICAgICJyZXBuZTsgc2Nhc2Jcblx0IgorICAgICAibm90bAklJWVjeFxuXHQiCisgICAgICJsZWFsCS0xKCUlZWN4KSwlJWVieFxuIgorICAgICAiMTpcblx0IgorICAgICAibG9kc2Jcblx0IgorICAgICAidGVzdGIJJSVhbCwlJWFsXG5cdCIKKyAgICAgImplCTJmXG5cdCIKKyAgICAgIm1vdmwJJSVlZHgsJSVlZGlcblx0IgorICAgICAibW92bAklJWVieCwlJWVjeFxuXHQiCisgICAgICJyZXBuZTsgc2Nhc2Jcblx0IgorICAgICAiam5lCTFiXG5cdCIKKyAgICAgImRlY2wJJTBcblx0IgorICAgICAiam1wCTNmXG4iCisgICAgICIyOlxuXHQiCisgICAgICJ4b3JsCSUwLCUwXG4iCisgICAgICIzOlxuXHQiCisgICAgICJwb3BsCSUlZWJ4IgorICAgICA6ICI9UyIgKF9fcmVzKSwgIj0mYSIgKF9fZDApLCAiPSZjIiAoX19kMSksICI9JkQiIChfX2QyKQorICAgICA6ICJkIiAoX19hY2NlcHQpLCAiMCIgKF9fcyksICIxIiAoMCksICIyIiAoMHhmZmZmZmZmZikKKyAgICAgOiAibWVtb3J5IiwgImNjIik7CisgIHJldHVybiBfX3JlczsKK30KKyNlbHNlCitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cnBicmtfZyAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciAqX19hY2NlcHQpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDAsIF9fZDEsIF9fZDIsIF9fZDM7CisgIHJlZ2lzdGVyIGNoYXIgKl9fcmVzOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgibW92bAklJWVieCwlJWVkaVxuXHQiCisgICAgICJjbGRcblx0IgorICAgICAicmVwbmU7IHNjYXNiXG5cdCIKKyAgICAgIm5vdGwJJSVlY3hcblx0IgorICAgICAibGVhbAktMSglJWVjeCksJSVlZHhcbiIKKyAgICAgIjE6XG5cdCIKKyAgICAgImxvZHNiXG5cdCIKKyAgICAgInRlc3RiCSUlYWwsJSVhbFxuXHQiCisgICAgICJqZQkyZlxuXHQiCisgICAgICJtb3ZsCSUlZWJ4LCUlZWRpXG5cdCIKKyAgICAgIm1vdmwJJSVlZHgsJSVlY3hcblx0IgorICAgICAicmVwbmU7IHNjYXNiXG5cdCIKKyAgICAgImpuZQkxYlxuXHQiCisgICAgICJkZWNsCSUwXG5cdCIKKyAgICAgImptcAkzZlxuIgorICAgICAiMjpcblx0IgorICAgICAieG9ybAklMCwlMFxuIgorICAgICAiMzoiCisgICAgIDogIj1TIiAoX19yZXMpLCAiPSZhIiAoX19kMCksICI9JmMiIChfX2QxKSwgIj0mZCIgKF9fZDIpLCAiPSZEIiAoX19kMykKKyAgICAgOiAiMCIgKF9fcyksICIxIiAoMCksICIyIiAoMHhmZmZmZmZmZiksICJiIiAoX19hY2NlcHQpCisgICAgIDogIm1lbW9yeSIsICJjYyIpOworICByZXR1cm4gX19yZXM7Cit9CisjZW5kaWYKKworCisvKiBGaW5kIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIE5FRURMRSBpbiBIQVlTVEFDSy4gICovCisjZGVmaW5lIF9IQVZFX1NUUklOR19BUkNIX3N0cnN0ciAxCisjZGVmaW5lIHN0cnN0cihoYXlzdGFjaywgbmVlZGxlKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAobmVlZGxlKSAmJiBzaXplb2YgKChuZWVkbGUpWzBdKSA9PSAxICBcCisJCSAgPyAoKG5lZWRsZSlbMF0gPT0gJ1wwJwkJCQkgICAgICBcCisJCSAgICAgPyAoaGF5c3RhY2spCQkJCQkgICAgICBcCisJCSAgICAgOiAoKG5lZWRsZSlbMV0gPT0gJ1wwJwkJCQkgICAgICBcCisJCQk/IHN0cmNociAoKGhheXN0YWNrKSwgKG5lZWRsZSlbMF0pCQkgICAgICBcCisJCQk6IF9fc3Ryc3RyX2NnICgoaGF5c3RhY2spLCAobmVlZGxlKSwJCSAgICAgIFwKKwkJCQkgICAgICAgc3RybGVuIChuZWVkbGUpKSkpCQkgICAgICBcCisJCSAgOiBfX3N0cnN0cl9nICgoaGF5c3RhY2spLCAobmVlZGxlKSkpKQorCisvKiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gbmVlZCBub3QgaGFuZGxlIE5FRURMRXMgd2l0aCBhCisgICBsZW5ndGggc2hvcnRlciB0aGFuIHR3by4gICovCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJzdHJfY2cgKF9fY29uc3QgY2hhciAqX19oYXlzdGFjaywgX19jb25zdCBjaGFyIF9fbmVlZGxlW10sCisJCQkJICAgc2l6ZV90IF9fbmVlZGxlX2xlbik7CisKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3Ryc3RyX2NnIChfX2NvbnN0IGNoYXIgKl9faGF5c3RhY2ssIF9fY29uc3QgY2hhciBfX25lZWRsZVtdLAorCSAgICAgc2l6ZV90IF9fbmVlZGxlX2xlbikKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgX19kMCwgX19kMSwgX19kMjsKKyAgcmVnaXN0ZXIgY2hhciAqX19yZXM7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJjbGRcbiIgXAorICAgICAiMTpcblx0IgorICAgICAibW92bAklNiwlJWVkaVxuXHQiCisgICAgICJtb3ZsCSU1LCUlZWF4XG5cdCIKKyAgICAgIm1vdmwJJTQsJSVlY3hcblx0IgorICAgICAicmVwZTsgY21wc2Jcblx0IgorICAgICAiamUJMmZcblx0IgorICAgICAiY21wYgkkMCwtMSglJWVzaSlcblx0IgorICAgICAibGVhbAkxKCUlZWF4KSwlNVxuXHQiCisgICAgICJqbmUJMWJcblx0IgorICAgICAieG9ybAklJWVheCwlJWVheFxuIgorICAgICAiMjoiCisgICAgIDogIj0mYSIgKF9fcmVzKSwgIj0mUyIgKF9fZDApLCAiPSZEIiAoX19kMSksICI9JmMiIChfX2QyKQorICAgICA6ICJnIiAoX19uZWVkbGVfbGVuKSwgIjEiIChfX2hheXN0YWNrKSwgImQiIChfX25lZWRsZSkKKyAgICAgOiAibWVtb3J5IiwgImNjIik7CisgIHJldHVybiBfX3JlczsKK30KKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3Ryc3RyX2cgKF9fY29uc3QgY2hhciAqX19oYXlzdGFjaywgX19jb25zdCBjaGFyICpfX25lZWRsZSk7CisjaWZkZWYgX19QSUNfXworCitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cnN0cl9nIChfX2NvbnN0IGNoYXIgKl9faGF5c3RhY2ssIF9fY29uc3QgY2hhciAqX19uZWVkbGUpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IF9fZDAsIF9fZDEsIF9fZDI7CisgIHJlZ2lzdGVyIGNoYXIgKl9fcmVzOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICgiY2xkXG5cdCIKKyAgICAgInJlcG5lOyBzY2FzYlxuXHQiCisgICAgICJub3RsCSUlZWN4XG5cdCIKKyAgICAgInB1c2hsCSUlZWJ4XG5cdCIKKyAgICAgImRlY2wJJSVlY3hcblx0IgkvKiBOT1RFISBUaGlzIGFsc28gc2V0cyBaIGlmIHNlYXJjaHN0cmluZz0nJyAqLworICAgICAibW92bAklJWVjeCwlJWVieFxuIgorICAgICAiMTpcblx0IgorICAgICAibW92bAklJWVkeCwlJWVkaVxuXHQiCisgICAgICJtb3ZsCSUlZXNpLCUlZWF4XG5cdCIKKyAgICAgIm1vdmwJJSVlYngsJSVlY3hcblx0IgorICAgICAicmVwZTsgY21wc2Jcblx0IgorICAgICAiamUJMmZcblx0IgkJLyogYWxzbyB3b3JrcyBmb3IgZW1wdHkgc3RyaW5nLCBzZWUgYWJvdmUgKi8KKyAgICAgImNtcGIJJDAsLTEoJSVlc2kpXG5cdCIKKyAgICAgImxlYWwJMSglJWVheCksJSVlc2lcblx0IgorICAgICAiam5lCTFiXG5cdCIKKyAgICAgInhvcmwJJSVlYXgsJSVlYXhcbiIKKyAgICAgIjI6XG5cdCIKKyAgICAgInBvcGwJJSVlYngiCisgICAgIDogIj0mYSIgKF9fcmVzKSwgIj0mYyIgKF9fZDApLCAiPSZTIiAoX19kMSksICI9JkQiIChfX2QyKQorICAgICA6ICIwIiAoMCksICIxIiAoMHhmZmZmZmZmZiksICIyIiAoX19oYXlzdGFjayksICIzIiAoX19uZWVkbGUpLAorICAgICAgICJkIiAoX19uZWVkbGUpCisgICAgIDogIm1lbW9yeSIsICJjYyIpOworICByZXR1cm4gX19yZXM7Cit9CisjZWxzZQorX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJzdHJfZyAoX19jb25zdCBjaGFyICpfX2hheXN0YWNrLCBfX2NvbnN0IGNoYXIgKl9fbmVlZGxlKQoreworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBfX2QwLCBfX2QxLCBfX2QyLCBfX2QzOworICByZWdpc3RlciBjaGFyICpfX3JlczsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18KKyAgICAoImNsZFxuXHQiCisgICAgICJyZXBuZTsgc2Nhc2Jcblx0IgorICAgICAibm90bAklJWVjeFxuXHQiCisgICAgICJkZWNsCSUlZWN4XG5cdCIJLyogTk9URSEgVGhpcyBhbHNvIHNldHMgWiBpZiBzZWFyY2hzdHJpbmc9JycgKi8KKyAgICAgIm1vdmwJJSVlY3gsJSVlZHhcbiIKKyAgICAgIjE6XG5cdCIKKyAgICAgIm1vdmwJJSVlYngsJSVlZGlcblx0IgorICAgICAibW92bAklJWVzaSwlJWVheFxuXHQiCisgICAgICJtb3ZsCSUlZWR4LCUlZWN4XG5cdCIKKyAgICAgInJlcGU7IGNtcHNiXG5cdCIKKyAgICAgImplCTJmXG5cdCIJCS8qIGFsc28gd29ya3MgZm9yIGVtcHR5IHN0cmluZywgc2VlIGFib3ZlICovCisgICAgICJjbXBiCSQwLC0xKCUlZXNpKVxuXHQiCisgICAgICJsZWFsCTEoJSVlYXgpLCUlZXNpXG5cdCIKKyAgICAgImpuZQkxYlxuXHQiCisgICAgICJ4b3JsCSUlZWF4LCUlZWF4XG4iCisgICAgICIyOiIKKyAgICAgOiAiPSZhIiAoX19yZXMpLCAiPSZjIiAoX19kMCksICI9JlMiIChfX2QxKSwgIj0mRCIgKF9fZDIpLCAiPSZkIiAoX19kMykKKyAgICAgOiAiMCIgKDApLCAiMSIgKDB4ZmZmZmZmZmYpLCAiMiIgKF9faGF5c3RhY2spLCAiMyIgKF9fbmVlZGxlKSwKKyAgICAgICAiYiIgKF9fbmVlZGxlKQorICAgICA6ICJtZW1vcnkiLCAiY2MiKTsKKyAgcmV0dXJuIF9fcmVzOworfQorI2VuZGlmCisKKworLyogQml0IGZpbmQgZnVuY3Rpb25zLiAgV2UgZGVmaW5lIG9ubHkgdGhlIGk2ODYgdmVyc2lvbiBzaW5jZSBmb3IgdGhlIG90aGVyCisgICBwcm9jZXNzb3JzIGdjYyBnZW5lcmF0ZXMgZ29vZCBjb2RlLiAgKi8KKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisjIGlmZGVmIF9faTY4Nl9fCisjICBkZWZpbmUgX0hBVkVfU1RSSU5HX0FSQ0hfZmZzIDEKKyMgIGRlZmluZSBmZnMod29yZCkgKF9fYnVpbHRpbl9jb25zdGFudF9wICh3b3JkKQkJCSAgICAgIFwKKwkJICAgICA/IF9fYnVpbHRpbl9mZnMgKHdvcmQpCQkJCSAgICAgIFwKKwkJICAgICA6ICh7IGludCBfX2NudCwgX190bXA7CQkJCSAgICAgIFwKKwkJCSAgX19hc21fXyBfX3ZvbGF0aWxlX18JCQkJICAgICAgXAorCQkJICAgICgiYnNmbCAlMiwlMFxuXHQiCQkJCSAgICAgIFwKKwkJCSAgICAgImNtb3ZlbCAlMSwlMCIJCQkJICAgICAgXAorCQkJICAgICA6ICI9JnIiIChfX2NudCksICI9ciIgKF9fdG1wKQkJICAgICAgXAorCQkJICAgICA6ICJybSIgKHdvcmQpLCAiMSIgKC0xKSk7CQkJICAgICAgXAorCQkJICBfX2NudCArIDE7IH0pKQorCisjICBpZm5kZWYgZmZzbAorIyAgIGRlZmluZSBmZnNsKHdvcmQpIGZmcyh3b3JkKQorIyAgZW5kaWYKKyMgZW5kaWYJLyogaTY4NiAqLworI2VuZGlmCS8qIEJTRCB8fCBYL09wZW4gKi8KKworI2lmbmRlZiBfRk9SQ0VfSU5MSU5FUworIyB1bmRlZiBfX1NUUklOR19JTkxJTkUKKyNlbmRpZgorCisjZW5kaWYJLyogdXNlIHN0cmluZyBpbmxpbmVzICYmIEdOVSBDQyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0cmluZzIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdHJpbmcyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc5OGFjZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdHJpbmcyLmgKQEAgLTAsMCArMSwxMzU0IEBACisvKiBNYWNoaW5lLWluZGVwZW5kYW50IHN0cmluZyBmdW5jdGlvbiBvcHRpbWl6YXRpb25zLgorICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDMsIDIwMDQsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk3LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1RSSU5HX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9zdHJpbmcyLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzdHJpbmcuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmICFkZWZpbmVkIF9fTk9fU1RSSU5HX0lOTElORVMgJiYgIWRlZmluZWQgX19CT1VOREVEX1BPSU5URVJTX18KKworLyogVW5saWtlIHRoZSBkZWZpbml0aW9ucyBpbiB0aGUgaGVhZGVyIDxiaXRzL3N0cmluZy5oPiB0aGUKKyAgIGRlZmluaXRpb25zIGNvbnRhaW5lZCBoZXJlIGFyZSBub3Qgb3B0aW1pemVkIGRvd24gdG8gYXNzZW1ibGVyCisgICBsZXZlbC4gIFRob3NlIG9wdGltaXphdGlvbnMgYXJlIG5vdCBhbHdheXMgYSBnb29kIGlkZWEgc2luY2UgdGhpcworICAgbWVhbnMgdGhlIGNvZGUgc2l6ZSBpbmNyZWFzZXMgYSBsb3QuICBJbnN0ZWFkIHRoZSBkZWZpbml0aW9ucyBoZXJlCisgICBvcHRpbWl6ZSBzb21lIGZ1bmN0aW9ucyBpbiBhIHdheSB3aGljaCBkbyBub3QgZHJhbWF0aWNhbGx5CisgICBpbmNyZWFzZSB0aGUgY29kZSBzaXplIGFuZCB3aGljaCBkbyBub3QgdXNlIGFzc2VtYmxlci4gIFRoZSBtYWluCisgICB0cmljayBpcyB0byB1c2UgR0NDJ3MgYF9fYnVpbHRpbl9jb25zdGFudF9wJyBmdW5jdGlvbi4KKworICAgRXZlcnkgZnVuY3Rpb24gWFhYIHdoaWNoIGhhcyBhIGRlZmluZWQgdmVyc2lvbiBpbgorICAgPGJpdHMvc3RyaW5nLmg+IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBzeW1ib2wgX0hBVkVfU1RSSU5HX0FSQ0hfWFhYCisgICB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IHJlZGVmaW5pdGlvbnMuCisKKyAgIFdlIG11c3QgdXNlIGhlcmUgbWFjcm9zIGluc3RlYWQgb2YgaW5saW5lIGZ1bmN0aW9ucyBzaW5jZSB0aGUKKyAgIHRyaWNrIHdvbid0IHdvcmsgd2l0aCB0aGUgbGF0dGVyLiAgKi8KKworI2lmbmRlZiBfX1NUUklOR19JTkxJTkUKKyMgaWZkZWYgX19jcGx1c3BsdXMKKyMgIGRlZmluZSBfX1NUUklOR19JTkxJTkUgaW5saW5lCisjIGVsc2UKKyMgIGRlZmluZSBfX1NUUklOR19JTkxJTkUgX19leHRlcm5faW5saW5lCisjIGVuZGlmCisjZW5kaWYKKworI2lmIF9TVFJJTkdfQVJDSF91bmFsaWduZWQKKy8qIElmIHdlIGNhbiBkbyB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzIHdlIG11c3Qga25vdyB0aGUgZW5kaWFuZXNzLiAgKi8KKyMgaW5jbHVkZSA8ZW5kaWFuLmg+CisjIGluY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworIyBpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjICBkZWZpbmUgX19TVFJJTkcyX1NNQUxMX0dFVDE2KHNyYywgaWR4KSBcCisgICAgICgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHggKyAxXSA8PCA4CSAgICAgIFwKKyAgICAgIHwgKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbaWR4XSkKKyMgIGRlZmluZSBfX1NUUklORzJfU01BTExfR0VUMzIoc3JjLCBpZHgpIFwKKyAgICAgKCgoKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbaWR4ICsgM10gPDwgOCAgICAgIFwKKwl8ICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHNyYykpW2lkeCArIDJdKSA8PCA4ICAgXAorICAgICAgIHwgKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbaWR4ICsgMV0pIDw8IDggICAgXAorICAgICAgfCAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHhdKQorIyBlbHNlCisjICBkZWZpbmUgX19TVFJJTkcyX1NNQUxMX0dFVDE2KHNyYywgaWR4KSBcCisgICAgICgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHhdIDw8IDgJICAgICAgXAorICAgICAgfCAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHggKyAxXSkKKyMgIGRlZmluZSBfX1NUUklORzJfU01BTExfR0VUMzIoc3JjLCBpZHgpIFwKKyAgICAgKCgoKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbaWR4XSA8PCA4CSAgICAgIFwKKwl8ICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHNyYykpW2lkeCArIDFdKSA8PCA4ICAgXAorICAgICAgIHwgKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbaWR4ICsgMl0pIDw8IDggICAgXAorICAgICAgfCAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHggKyAzXSkKKyMgZW5kaWYKKyNlbHNlCisvKiBUaGVzZSBhcmUgYSBmZXcgdHlwZXMgd2UgbmVlZCBmb3IgdGhlIG9wdGltaXphdGlvbnMgaWYgd2UgY2Fubm90CisgICB1c2UgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3Nlcy4gICovCisjIGRlZmluZSBfX1NUUklORzJfQ09QWV9UWVBFKE4pIFwKKyAgdHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBjaGFyIF9fYXJyW05dOyB9CQkJCSAgICAgIFwKKyAgICBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIF9fU1RSSU5HMl9DT1BZX0FSUiMjTgorX19TVFJJTkcyX0NPUFlfVFlQRSAoMik7CitfX1NUUklORzJfQ09QWV9UWVBFICgzKTsKK19fU1RSSU5HMl9DT1BZX1RZUEUgKDQpOworX19TVFJJTkcyX0NPUFlfVFlQRSAoNSk7CitfX1NUUklORzJfQ09QWV9UWVBFICg2KTsKK19fU1RSSU5HMl9DT1BZX1RZUEUgKDcpOworX19TVFJJTkcyX0NPUFlfVFlQRSAoOCk7CisjIHVuZGVmIF9fU1RSSU5HMl9DT1BZX1RZUEUKKyNlbmRpZgorCisvKiBEZXJlZmVyZW5jaW5nIGEgcG9pbnRlciBhcmcgdG8gcnVuIHNpemVvZiBvbiBpdCBmYWlscyBmb3IgdGhlIHZvaWQKKyAgIHBvaW50ZXIgY2FzZSwgc28gd2UgdXNlIHRoaXMgaW5zdGVhZC4KKyAgIE5vdGUgdGhhdCBfX3ggaXMgZXZhbHVhdGVkIHR3aWNlLiAqLworI2RlZmluZSBfX3N0cmluZzJfMWJwdHJfcChfX3gpIFwKKyAgKChzaXplX3QpKGNvbnN0IHZvaWQgKikoKF9feCkgKyAxKSAtIChzaXplX3QpKGNvbnN0IHZvaWQgKikoX194KSA9PSAxKQorCisvKiBTZXQgTiBieXRlcyBvZiBTIHRvIEMuICAqLworI2lmICFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX21lbXNldAorIyBpZiAhX19HTlVDX1BSRVJFUSAoMywgMCkKKyMgIGlmIF9TVFJJTkdfQVJDSF91bmFsaWduZWQKKyMgICBkZWZpbmUgbWVtc2V0KHMsIGMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChuKSAmJiAobikgPD0gMTYJCQkgICAgICBcCisJCSAgPyAoKG4pID09IDEJCQkJCQkgICAgICBcCisJCSAgICAgPyBfX21lbXNldF8xIChzLCBjKQkJCQkgICAgICBcCisJCSAgICAgOiBfX21lbXNldF9nYyAocywgYywgbikpCQkJCSAgICAgIFwKKwkJICA6IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYykgJiYgKGMpID09ICdcMCcJCSAgICAgIFwKKwkJICAgICA/ICh7IHZvaWQgKl9fcyA9IChzKTsgX19iemVybyAoX19zLCBuKTsgX19zOyB9KQkgICAgICBcCisJCSAgICAgOiBtZW1zZXQgKHMsIGMsIG4pKSkpCisKKyMgICBkZWZpbmUgX19tZW1zZXRfMShzLCBjKSAoeyB2b2lkICpfX3MgPSAocyk7CQkJCSAgICAgIFwKKwkJCSAgICAqKChfX3VpbnQ4X3QgKikgX19zKSA9IChfX3VpbnQ4X3QpIGM7IF9fczsgfSkKKworIyAgIGRlZmluZSBfX21lbXNldF9nYyhzLCBjLCBuKSBcCisgICh7IHZvaWQgKl9fcyA9IChzKTsJCQkJCQkJICAgICAgXAorICAgICB1bmlvbiB7CQkJCQkJCQkgICAgICBcCisgICAgICAgdW5zaWduZWQgaW50IF9fdWk7CQkJCQkJICAgICAgXAorICAgICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3VzaTsJCQkJCSAgICAgIFwKKyAgICAgICB1bnNpZ25lZCBjaGFyIF9fdWM7CQkJCQkJICAgICAgXAorICAgICB9ICpfX3UgPSBfX3M7CQkJCQkJCSAgICAgIFwKKyAgICAgX191aW50OF90IF9fYyA9IChfX3VpbnQ4X3QpIChjKTsJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKyAgICAgLyogVGhpcyBgc3dpdGNoJyBzdGF0ZW1lbnQgd2lsbCBiZSByZW1vdmVkIGF0IGNvbXBpbGUtdGltZS4gICovCSAgICAgIFwKKyAgICAgc3dpdGNoICgodW5zaWduZWQgaW50KSAobikpCQkJCQkgICAgICBcCisgICAgICAgewkJCQkJCQkJICAgICAgXAorICAgICAgIGNhc2UgMTU6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDExOgkJCQkJCQkJICAgICAgXAorCSBfX3UtPl9fdWkgPSBfX2MgKiAweDAxMDEwMTAxOwkJCQkJICAgICAgXAorCSBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsJCQkgICAgICBcCisgICAgICAgY2FzZSA3OgkJCQkJCQkJICAgICAgXAorCSBfX3UtPl9fdWkgPSBfX2MgKiAweDAxMDEwMTAxOwkJCQkJICAgICAgXAorCSBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsJCQkgICAgICBcCisgICAgICAgY2FzZSAzOgkJCQkJCQkJICAgICAgXAorCSBfX3UtPl9fdXNpID0gKHVuc2lnbmVkIHNob3J0IGludCkgX19jICogMHgwMTAxOwkJICAgICAgXAorCSBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAyKTsJCQkgICAgICBcCisJIF9fdS0+X191YyA9ICh1bnNpZ25lZCBjaGFyKSBfX2M7CQkJCSAgICAgIFwKKwkgYnJlYWs7CQkJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgICAgY2FzZSAxNDoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgMTA6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDY6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDI6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191c2kgPSAodW5zaWduZWQgc2hvcnQgaW50KSBfX2MgKiAweDAxMDE7CQkgICAgICBcCisJIGJyZWFrOwkJCQkJCQkJICAgICAgXAorCQkJCQkJCQkJICAgICAgXAorICAgICAgIGNhc2UgMTM6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDk6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDU6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDE6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191YyA9ICh1bnNpZ25lZCBjaGFyKSBfX2M7CQkJCSAgICAgIFwKKwkgYnJlYWs7CQkJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgICAgY2FzZSAxNjoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgMTI6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDg6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDQ6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisgICAgICAgY2FzZSAwOgkJCQkJCQkJICAgICAgXAorCSBicmVhazsJCQkJCQkJCSAgICAgIFwKKyAgICAgICB9CQkJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgIF9fczsgfSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgbWVtc2V0KHMsIGMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChjKSAmJiAoYykgPT0gJ1wwJwkJICAgICAgXAorCQkgID8gKHsgdm9pZCAqX19zID0gKHMpOyBfX2J6ZXJvIChfX3MsIG4pOyBfX3M7IH0pCSAgICAgIFwKKwkJICA6IG1lbXNldCAocywgYywgbikpKQorIyAgZW5kaWYKKyMgZW5kaWYKKworLyogR0NDIDwgMy4wIG9wdGltaXplcyBtZW1zZXQocywgMCwgbikgYnV0IG5vdCBiemVybyhzLCBuKS4KKyAgIFRoZSBvcHRpbWl6YXRpb24gaXMgYnJva2VuIGJlZm9yZSBFR0NTIDEuMS4KKyAgIEdDQyAzLjArIGhhcyBfX2J1aWx0aW5fYnplcm8gYXMgd2VsbCwgYnV0IGF0IGxlYXN0IHRpbGwgR0NDIDMuNAorICAgaWYgaXQgZGVjaWRlcyB0byBjYWxsIHRoZSBsaWJyYXJ5IGZ1bmN0aW9uLCBpdCBjYWxscyBtZW1zZXQKKyAgIGFuZCBub3QgYnplcm8uICAqLworIyBpZiBfX0dOVUNfUFJFUkVRICgyLCA5MSkKKyMgIGRlZmluZSBfX2J6ZXJvKHMsIG4pIF9fYnVpbHRpbl9tZW1zZXQgKHMsICdcMCcsIG4pCisjIGVuZGlmCisKKyNlbmRpZgorCisKKy8qIENvcHkgTiBieXRlcyBmcm9tIFNSQyB0byBERVNULCByZXR1cm5pbmcgcG9pbnRlciB0byBieXRlIGZvbGxvd2luZyB0aGUKKyAgIGxhc3QgY29waWVkLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgaWYgIWRlZmluZWQgX0hBVkVfU1RSSU5HX0FSQ0hfbWVtcGNweSB8fCBkZWZpbmVkIF9GT1JDRV9JTkxJTkVTCisjICBpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfbWVtcGNweQorIyAgIGlmIF9fR05VQ19QUkVSRVEgKDMsIDQpCisjICAgIGRlZmluZSBfX21lbXBjcHkoZGVzdCwgc3JjLCBuKSBfX2J1aWx0aW5fbWVtcGNweSAoZGVzdCwgc3JjLCBuKQorIyAgIGVsaWYgX19HTlVDX1BSRVJFUSAoMywgMCkKKyMgICAgZGVmaW5lIF9fbWVtcGNweShkZXN0LCBzcmMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzcmMpICYmIF9fYnVpbHRpbl9jb25zdGFudF9wIChuKSAgICAgIFwKKwkJICAmJiBfX3N0cmluZzJfMWJwdHJfcCAoc3JjKSAmJiBuIDw9IDgJCQkgICAgICBcCisJCSAgPyBfX2J1aWx0aW5fbWVtY3B5IChkZXN0LCBzcmMsIG4pICsgKG4pCQkgICAgICBcCisJCSAgOiBfX21lbXBjcHkgKGRlc3QsIHNyYywgbikpKQorIyAgIGVsc2UKKyMgICAgZGVmaW5lIF9fbWVtcGNweShkZXN0LCBzcmMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzcmMpICYmIF9fYnVpbHRpbl9jb25zdGFudF9wIChuKSAgICAgIFwKKwkJICAmJiBfX3N0cmluZzJfMWJwdHJfcCAoc3JjKSAmJiBuIDw9IDgJCQkgICAgICBcCisJCSAgPyBfX21lbXBjcHlfc21hbGwgKGRlc3QsIF9fbWVtcGNweV9hcmdzIChzcmMpLCBuKQkgICAgICBcCisJCSAgOiBfX21lbXBjcHkgKGRlc3QsIHNyYywgbikpKQorIyAgIGVuZGlmCisvKiBJbiBnbGliYyB3ZSB1c2UgdGhpcyBmdW5jdGlvbiBmcmVxdWVudGx5IGJ1dCBmb3IgbmFtZXNwYWNlIHJlYXNvbnMKKyAgIHdlIGhhdmUgdG8gdXNlIHRoZSBuYW1lIGBfX21lbXBjcHknLiAgKi8KKyMgICBkZWZpbmUgbWVtcGNweShkZXN0LCBzcmMsIG4pIF9fbWVtcGNweSAoZGVzdCwgc3JjLCBuKQorIyAgZW5kaWYKKworIyAgaWYgIV9fR05VQ19QUkVSRVEgKDMsIDApIHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgICBpZiBfU1RSSU5HX0FSQ0hfdW5hbGlnbmVkCisjICAgIGlmbmRlZiBfRk9SQ0VfSU5MSU5FUworIyAgICAgZGVmaW5lIF9fbWVtcGNweV9hcmdzKHNyYykgXAorICAgICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwJCSAgICAgIFwKKyAgICAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzRdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNl0sCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDE2IChzcmMsIDApLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyBfX1NUUklORzJfU01BTExfR0VUMTYgKHNyYywgNCksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fIF9fU1RSSU5HMl9TTUFMTF9HRVQzMiAoc3JjLCAwKSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDMyIChzcmMsIDQpCisjICAgIGVuZGlmCitfX1NUUklOR19JTkxJTkUgdm9pZCAqX19tZW1wY3B5X3NtYWxsICh2b2lkICosIGNoYXIsIGNoYXIsIGNoYXIsIGNoYXIsCisJCQkJICAgICAgIF9fdWludDE2X3QsIF9fdWludDE2X3QsIF9fdWludDMyX3QsCisJCQkJICAgICAgIF9fdWludDMyX3QsIHNpemVfdCk7CitfX1NUUklOR19JTkxJTkUgdm9pZCAqCitfX21lbXBjcHlfc21hbGwgKHZvaWQgKl9fZGVzdDEsCisJCSBjaGFyIF9fc3JjMF8xLCBjaGFyIF9fc3JjMl8xLCBjaGFyIF9fc3JjNF8xLCBjaGFyIF9fc3JjNl8xLAorCQkgX191aW50MTZfdCBfX3NyYzBfMiwgX191aW50MTZfdCBfX3NyYzRfMiwKKwkJIF9fdWludDMyX3QgX19zcmMwXzQsIF9fdWludDMyX3QgX19zcmM0XzQsCisJCSBzaXplX3QgX19zcmNsZW4pCit7CisgIHVuaW9uIHsKKyAgICBfX3VpbnQzMl90IF9fdWk7CisgICAgX191aW50MTZfdCBfX3VzaTsKKyAgICB1bnNpZ25lZCBjaGFyIF9fdWM7CisgICAgdW5zaWduZWQgY2hhciBfX2M7CisgIH0gKl9fdSA9IF9fZGVzdDE7CisgIHN3aXRjaCAoKHVuc2lnbmVkIGludCkgX19zcmNsZW4pCisgICAgeworICAgIGNhc2UgMToKKyAgICAgIF9fdS0+X19jID0gX19zcmMwXzE7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIF9fdS0+X191c2kgPSBfX3NyYzBfMjsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgX191LT5fX3VzaSA9IF9fc3JjMF8yOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMik7CisgICAgICBfX3UtPl9fYyA9IF9fc3JjMl8xOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X19jID0gX19zcmM0XzE7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBfX3UtPl9fdXNpID0gX19zcmM0XzI7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBfX3UtPl9fdXNpID0gX19zcmM0XzI7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAyKTsKKyAgICAgIF9fdS0+X19jID0gX19zcmM2XzE7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzRfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gKHZvaWQgKikgX191OworfQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIF9GT1JDRV9JTkxJTkVTCisjICAgICBkZWZpbmUgX19tZW1wY3B5X2FyZ3Moc3JjKSBcCisgICAgICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwJCQkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjIpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSB9IH0pLCAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjMpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdIH0gfSksCQkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjQpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbM10gfSB9KSwgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI1KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0gfSB9KSwJCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSNikJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzRdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNV0gfSB9KSwgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI3KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVs1XSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzZdIH0gfSksCQkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjgpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbM10sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVs0XSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzVdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVs3XSB9IH0pCisjICAgIGVuZGlmCitfX1NUUklOR19JTkxJTkUgdm9pZCAqX19tZW1wY3B5X3NtYWxsICh2b2lkICosIGNoYXIsIF9fU1RSSU5HMl9DT1BZX0FSUjIsCisJCQkJICAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjMsCisJCQkJICAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjQsCisJCQkJICAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjUsCisJCQkJICAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjYsCisJCQkJICAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjcsCisJCQkJICAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjgsIHNpemVfdCk7CitfX1NUUklOR19JTkxJTkUgdm9pZCAqCitfX21lbXBjcHlfc21hbGwgKHZvaWQgKl9fZGVzdCwgY2hhciBfX3NyYzEsCisJCSBfX1NUUklORzJfQ09QWV9BUlIyIF9fc3JjMiwgX19TVFJJTkcyX0NPUFlfQVJSMyBfX3NyYzMsCisJCSBfX1NUUklORzJfQ09QWV9BUlI0IF9fc3JjNCwgX19TVFJJTkcyX0NPUFlfQVJSNSBfX3NyYzUsCisJCSBfX1NUUklORzJfQ09QWV9BUlI2IF9fc3JjNiwgX19TVFJJTkcyX0NPUFlfQVJSNyBfX3NyYzcsCisJCSBfX1NUUklORzJfQ09QWV9BUlI4IF9fc3JjOCwgc2l6ZV90IF9fc3JjbGVuKQoreworICB1bmlvbiB7CisgICAgY2hhciBfX2M7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSMiBfX3NjYTI7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSMyBfX3NjYTM7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSNCBfX3NjYTQ7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSNSBfX3NjYTU7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSNiBfX3NjYTY7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSNyBfX3NjYTc7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSOCBfX3NjYTg7CisgIH0gKl9fdSA9IF9fZGVzdDsKKyAgc3dpdGNoICgodW5zaWduZWQgaW50KSBfX3NyY2xlbikKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgX191LT5fX2MgPSBfX3NyYzE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2EyID0gX19zcmMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhMyA9IF9fc3JjMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTQgPSBfX3NyYzQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E1ID0gX19zcmM1OworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNiA9IF9fc3JjNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTcgPSBfX3NyYzc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E4ID0gX19zcmM4OworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgX19zcmNsZW4pOworfQorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKworLyogUmV0dXJuIHBvaW50ZXIgdG8gQyBpbiBTLiAgKi8KKyNpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfc3RyY2hyCitleHRlcm4gdm9pZCAqX19yYXdtZW1jaHIgKGNvbnN0IHZvaWQgKl9fcywgaW50IF9fYyk7CisjIGlmIF9fR05VQ19QUkVSRVEgKDMsIDIpCisjICBkZWZpbmUgc3RyY2hyKHMsIGMpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChjKSAmJiAhX19idWlsdGluX2NvbnN0YW50X3AgKHMpCSAgICAgIFwKKwkJICAmJiAoYykgPT0gJ1wwJwkJCQkJICAgICAgXAorCQkgID8gKGNoYXIgKikgX19yYXdtZW1jaHIgKHMsIGMpCQkJCSAgICAgIFwKKwkJICA6IF9fYnVpbHRpbl9zdHJjaHIgKHMsIGMpKSkKKyMgZWxzZQorIyAgZGVmaW5lIHN0cmNocihzLCBjKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYykgJiYgKGMpID09ICdcMCcJCSAgICAgIFwKKwkJICA/IChjaGFyICopIF9fcmF3bWVtY2hyIChzLCBjKQkJCQkgICAgICBcCisJCSAgOiBzdHJjaHIgKHMsIGMpKSkKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIENvcHkgU1JDIHRvIERFU1QuICAqLworI2lmICghZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJjcHkgJiYgIV9fR05VQ19QUkVSRVEgKDMsIDApKSBcCisgICAgfHwgZGVmaW5lZCBfRk9SQ0VfSU5MSU5FUworIyBpZiAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJjcHkgJiYgIV9fR05VQ19QUkVSRVEgKDMsIDApCisjICBkZWZpbmUgc3RyY3B5KGRlc3QsIHNyYykgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHNyYykJCQkJICAgICAgXAorCQkgID8gKF9fc3RyaW5nMl8xYnB0cl9wIChzcmMpICYmIHN0cmxlbiAoc3JjKSArIDEgPD0gOAkgICAgICBcCisJCSAgICAgPyBfX3N0cmNweV9zbWFsbCAoZGVzdCwgX19zdHJjcHlfYXJncyAoc3JjKSwJICAgICAgXAorCQkJCSAgICAgICBzdHJsZW4gKHNyYykgKyAxKQkJICAgICAgXAorCQkgICAgIDogKGNoYXIgKikgbWVtY3B5IChkZXN0LCBzcmMsIHN0cmxlbiAoc3JjKSArIDEpKQkgICAgICBcCisJCSAgOiBzdHJjcHkgKGRlc3QsIHNyYykpKQorIyBlbmRpZgorCisjIGlmIF9TVFJJTkdfQVJDSF91bmFsaWduZWQKKyMgIGlmbmRlZiBfRk9SQ0VfSU5MSU5FUworIyAgIGRlZmluZSBfX3N0cmNweV9hcmdzKHNyYykgXAorICAgICBfX2V4dGVuc2lvbl9fIF9fU1RSSU5HMl9TTUFMTF9HRVQxNiAoc3JjLCAwKSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDE2IChzcmMsIDQpLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyBfX1NUUklORzJfU01BTExfR0VUMzIgKHNyYywgMCksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fIF9fU1RSSU5HMl9TTUFMTF9HRVQzMiAoc3JjLCA0KQorIyAgZW5kaWYKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cmNweV9zbWFsbCAoY2hhciAqLCBfX3VpbnQxNl90LCBfX3VpbnQxNl90LAorCQkJCSAgICAgIF9fdWludDMyX3QsIF9fdWludDMyX3QsIHNpemVfdCk7CitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cmNweV9zbWFsbCAoY2hhciAqX19kZXN0LAorCQlfX3VpbnQxNl90IF9fc3JjMF8yLCBfX3VpbnQxNl90IF9fc3JjNF8yLAorCQlfX3VpbnQzMl90IF9fc3JjMF80LCBfX3VpbnQzMl90IF9fc3JjNF80LAorCQlzaXplX3QgX19zcmNsZW4pCit7CisgIHVuaW9uIHsKKyAgICBfX3VpbnQzMl90IF9fdWk7CisgICAgX191aW50MTZfdCBfX3VzaTsKKyAgICB1bnNpZ25lZCBjaGFyIF9fdWM7CisgIH0gKl9fdSA9ICh2b2lkICopIF9fZGVzdDsKKyAgc3dpdGNoICgodW5zaWduZWQgaW50KSBfX3NyY2xlbikKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgX191LT5fX3VjID0gJ1wwJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIF9fdS0+X191c2kgPSBfX3NyYzBfMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIF9fdS0+X191c2kgPSBfX3NyYzBfMjsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOworICAgICAgX191LT5fX3VjID0gJ1wwJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X191YyA9ICdcMCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgX191LT5fX3VzaSA9IF9fc3JjNF8yOworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X191c2kgPSBfX3NyYzRfMjsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOworICAgICAgX191LT5fX3VjID0gJ1wwJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzRfNDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIF9fZGVzdDsKK30KKyMgZWxzZQorIyAgaWZuZGVmIF9GT1JDRV9JTkxJTkVTCisjICAgZGVmaW5lIF9fc3RyY3B5X2FyZ3Moc3JjKSBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlIyKQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAnXDAnIH0gfSksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSMykJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAnXDAnIH0gfSksCQkJCQkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjQpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAnXDAnIH0gfSksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSNSkJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSwJICAgICAgXAorCSAgJ1wwJyB9IH0pLAkJCQkJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI2KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICdcMCcgfSB9KSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI3KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVs1XSwJICAgICAgXAorCSAgJ1wwJyB9IH0pLAkJCQkJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI4KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVs1XSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzZdLCAnXDAnIH0gfSkKKyMgIGVuZGlmCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJjcHlfc21hbGwgKGNoYXIgKiwgX19TVFJJTkcyX0NPUFlfQVJSMiwKKwkJCQkgICAgICBfX1NUUklORzJfQ09QWV9BUlIzLAorCQkJCSAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjQsCisJCQkJICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNSwKKwkJCQkgICAgICBfX1NUUklORzJfQ09QWV9BUlI2LAorCQkJCSAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjcsCisJCQkJICAgICAgX19TVFJJTkcyX0NPUFlfQVJSOCwgc2l6ZV90KTsKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RyY3B5X3NtYWxsIChjaGFyICpfX2Rlc3QsCisJCV9fU1RSSU5HMl9DT1BZX0FSUjIgX19zcmMyLCBfX1NUUklORzJfQ09QWV9BUlIzIF9fc3JjMywKKwkJX19TVFJJTkcyX0NPUFlfQVJSNCBfX3NyYzQsIF9fU1RSSU5HMl9DT1BZX0FSUjUgX19zcmM1LAorCQlfX1NUUklORzJfQ09QWV9BUlI2IF9fc3JjNiwgX19TVFJJTkcyX0NPUFlfQVJSNyBfX3NyYzcsCisJCV9fU1RSSU5HMl9DT1BZX0FSUjggX19zcmM4LCBzaXplX3QgX19zcmNsZW4pCit7CisgIHVuaW9uIHsKKyAgICBjaGFyIF9fYzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlIyIF9fc2NhMjsKKyAgICBfX1NUUklORzJfQ09QWV9BUlIzIF9fc2NhMzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI0IF9fc2NhNDsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI1IF9fc2NhNTsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI2IF9fc2NhNjsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI3IF9fc2NhNzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI4IF9fc2NhODsKKyAgfSAqX191ID0gKHZvaWQgKikgX19kZXN0OworICBzd2l0Y2ggKCh1bnNpZ25lZCBpbnQpIF9fc3JjbGVuKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBfX3UtPl9fYyA9ICdcMCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2EyID0gX19zcmMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhMyA9IF9fc3JjMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTQgPSBfX3NyYzQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E1ID0gX19zcmM1OworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNiA9IF9fc3JjNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTcgPSBfX3NyYzc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E4ID0gX19zcmM4OworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIF9fZGVzdDsKK30KKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIENvcHkgU1JDIHRvIERFU1QsIHJldHVybmluZyBwb2ludGVyIHRvIGZpbmFsIE5VTCBieXRlLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgaWYgIWRlZmluZWQgX0hBVkVfU1RSSU5HX0FSQ0hfc3RwY3B5IHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgIGlmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHBjcHkKKyMgICBpZiBfX0dOVUNfUFJFUkVRICgzLCA0KQorIyAgICBkZWZpbmUgX19zdHBjcHkoZGVzdCwgc3JjKSBfX2J1aWx0aW5fc3RwY3B5IChkZXN0LCBzcmMpCisjICAgZWxpZiBfX0dOVUNfUFJFUkVRICgzLCAwKQorIyAgICBkZWZpbmUgX19zdHBjcHkoZGVzdCwgc3JjKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc3JjKQkJCQkgICAgICBcCisJCSAgPyAoX19zdHJpbmcyXzFicHRyX3AgKHNyYykgJiYgc3RybGVuIChzcmMpICsgMSA8PSA4CSAgICAgIFwKKwkJICAgICA/IF9fYnVpbHRpbl9zdHJjcHkgKGRlc3QsIHNyYykgKyBzdHJsZW4gKHNyYykJICAgICAgXAorCQkgICAgIDogKChjaGFyICopIChfX21lbXBjcHkpIChkZXN0LCBzcmMsIHN0cmxlbiAoc3JjKSArIDEpICAgIFwKKwkJCS0gMSkpCQkJCQkJICAgICAgXAorCQkgIDogX19zdHBjcHkgKGRlc3QsIHNyYykpKQorIyAgIGVsc2UKKyMgICAgZGVmaW5lIF9fc3RwY3B5KGRlc3QsIHNyYykgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHNyYykJCQkJICAgICAgXAorCQkgID8gKF9fc3RyaW5nMl8xYnB0cl9wIChzcmMpICYmIHN0cmxlbiAoc3JjKSArIDEgPD0gOAkgICAgICBcCisJCSAgICAgPyBfX3N0cGNweV9zbWFsbCAoZGVzdCwgX19zdHBjcHlfYXJncyAoc3JjKSwJICAgICAgXAorCQkJCSAgICAgICBzdHJsZW4gKHNyYykgKyAxKQkJICAgICAgXAorCQkgICAgIDogKChjaGFyICopIChfX21lbXBjcHkpIChkZXN0LCBzcmMsIHN0cmxlbiAoc3JjKSArIDEpICAgIFwKKwkJCS0gMSkpCQkJCQkJICAgICAgXAorCQkgIDogX19zdHBjcHkgKGRlc3QsIHNyYykpKQorIyAgIGVuZGlmCisvKiBJbiBnbGliYyB3ZSB1c2UgdGhpcyBmdW5jdGlvbiBmcmVxdWVudGx5IGJ1dCBmb3IgbmFtZXNwYWNlIHJlYXNvbnMKKyAgIHdlIGhhdmUgdG8gdXNlIHRoZSBuYW1lIGBfX3N0cGNweScuICAqLworIyAgIGRlZmluZSBzdHBjcHkoZGVzdCwgc3JjKSBfX3N0cGNweSAoZGVzdCwgc3JjKQorIyAgZW5kaWYKKworIyAgaWYgIV9fR05VQ19QUkVSRVEgKDMsIDApIHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgICBpZiBfU1RSSU5HX0FSQ0hfdW5hbGlnbmVkCisjICAgIGlmbmRlZiBfRk9SQ0VfSU5MSU5FUworIyAgICAgZGVmaW5lIF9fc3RwY3B5X2FyZ3Moc3JjKSBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDE2IChzcmMsIDApLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyBfX1NUUklORzJfU01BTExfR0VUMTYgKHNyYywgNCksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fIF9fU1RSSU5HMl9TTUFMTF9HRVQzMiAoc3JjLCAwKSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDMyIChzcmMsIDQpCisjICAgIGVuZGlmCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHBjcHlfc21hbGwgKGNoYXIgKiwgX191aW50MTZfdCwgX191aW50MTZfdCwKKwkJCQkgICAgICBfX3VpbnQzMl90LCBfX3VpbnQzMl90LCBzaXplX3QpOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHBjcHlfc21hbGwgKGNoYXIgKl9fZGVzdCwKKwkJX191aW50MTZfdCBfX3NyYzBfMiwgX191aW50MTZfdCBfX3NyYzRfMiwKKwkJX191aW50MzJfdCBfX3NyYzBfNCwgX191aW50MzJfdCBfX3NyYzRfNCwKKwkJc2l6ZV90IF9fc3JjbGVuKQoreworICB1bmlvbiB7CisgICAgdW5zaWduZWQgaW50IF9fdWk7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fdXNpOworICAgIHVuc2lnbmVkIGNoYXIgX191YzsKKyAgICBjaGFyIF9fYzsKKyAgfSAqX191ID0gKHZvaWQgKikgX19kZXN0OworICBzd2l0Y2ggKCh1bnNpZ25lZCBpbnQpIF9fc3JjbGVuKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBfX3UtPl9fdWMgPSAnXDAnOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgX191LT5fX3VzaSA9IF9fc3JjMF8yOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBfX3UtPl9fdXNpID0gX19zcmMwXzI7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAyKTsKKyAgICAgIF9fdS0+X191YyA9ICdcMCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X191YyA9ICdcMCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgX191LT5fX3VzaSA9IF9fc3JjNF8yOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgX191LT5fX3VzaSA9IF9fc3JjNF8yOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMik7CisgICAgICBfX3UtPl9fdWMgPSAnXDAnOworICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjNF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMyk7CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAmX191LT5fX2M7Cit9CisjICAgZWxzZQorIyAgICBpZm5kZWYgX0ZPUkNFX0lOTElORVMKKyMgICAgIGRlZmluZSBfX3N0cGNweV9hcmdzKHNyYykgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSMikJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgJ1wwJyB9IH0pLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjMpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgJ1wwJyB9IH0pLAkJCQkJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI0KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgJ1wwJyB9IH0pLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjUpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbM10sCSAgICAgIFwKKwkgICdcMCcgfSB9KSwJCQkJCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSNikJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzRdLCAnXDAnIH0gfSksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSNykJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzRdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNV0sCSAgICAgIFwKKwkgICdcMCcgfSB9KSwJCQkJCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSOCkJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzRdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVs2XSwgJ1wwJyB9IH0pCisjICAgIGVuZGlmCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHBjcHlfc21hbGwgKGNoYXIgKiwgX19TVFJJTkcyX0NPUFlfQVJSMiwKKwkJCQkgICAgICBfX1NUUklORzJfQ09QWV9BUlIzLAorCQkJCSAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjQsCisJCQkJICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNSwKKwkJCQkgICAgICBfX1NUUklORzJfQ09QWV9BUlI2LAorCQkJCSAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjcsCisJCQkJICAgICAgX19TVFJJTkcyX0NPUFlfQVJSOCwgc2l6ZV90KTsKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RwY3B5X3NtYWxsIChjaGFyICpfX2Rlc3QsCisJCV9fU1RSSU5HMl9DT1BZX0FSUjIgX19zcmMyLCBfX1NUUklORzJfQ09QWV9BUlIzIF9fc3JjMywKKwkJX19TVFJJTkcyX0NPUFlfQVJSNCBfX3NyYzQsIF9fU1RSSU5HMl9DT1BZX0FSUjUgX19zcmM1LAorCQlfX1NUUklORzJfQ09QWV9BUlI2IF9fc3JjNiwgX19TVFJJTkcyX0NPUFlfQVJSNyBfX3NyYzcsCisJCV9fU1RSSU5HMl9DT1BZX0FSUjggX19zcmM4LCBzaXplX3QgX19zcmNsZW4pCit7CisgIHVuaW9uIHsKKyAgICBjaGFyIF9fYzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlIyIF9fc2NhMjsKKyAgICBfX1NUUklORzJfQ09QWV9BUlIzIF9fc2NhMzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI0IF9fc2NhNDsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI1IF9fc2NhNTsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI2IF9fc2NhNjsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI3IF9fc2NhNzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI4IF9fc2NhODsKKyAgfSAqX191ID0gKHZvaWQgKikgX19kZXN0OworICBzd2l0Y2ggKCh1bnNpZ25lZCBpbnQpIF9fc3JjbGVuKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBfX3UtPl9fYyA9ICdcMCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2EyID0gX19zcmMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhMyA9IF9fc3JjMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTQgPSBfX3NyYzQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E1ID0gX19zcmM1OworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNiA9IF9fc3JjNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTcgPSBfX3NyYzc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E4ID0gX19zcmM4OworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIF9fZGVzdCArIF9fc3JjbGVuIC0gMTsKK30KKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIENvcHkgbm8gbW9yZSB0aGFuIE4gY2hhcmFjdGVycyBvZiBTUkMgdG8gREVTVC4gICovCisjaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cm5jcHkKKyMgaWYgX19HTlVDX1BSRVJFUSAoMywgMikKKyMgIGRlZmluZSBzdHJuY3B5KGRlc3QsIHNyYywgbikgX19idWlsdGluX3N0cm5jcHkgKGRlc3QsIHNyYywgbikKKyMgZWxzZQorIyAgZGVmaW5lIHN0cm5jcHkoZGVzdCwgc3JjLCBuKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc3JjKSAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAobikgICAgICBcCisJCSAgPyAoc3RybGVuIChzcmMpICsgMSA+PSAoKHNpemVfdCkgKG4pKQkJCSAgICAgIFwKKwkJICAgICA/IChjaGFyICopIG1lbWNweSAoZGVzdCwgc3JjLCBuKQkJCSAgICAgIFwKKwkJICAgICA6IHN0cm5jcHkgKGRlc3QsIHNyYywgbikpCQkJCSAgICAgIFwKKwkJICA6IHN0cm5jcHkgKGRlc3QsIHNyYywgbikpKQorIyBlbmRpZgorI2VuZGlmCisKKworLyogQXBwZW5kIG5vIG1vcmUgdGhhbiBOIGNoYXJhY3RlcnMgZnJvbSBTUkMgb250byBERVNULiAgKi8KKyNpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfc3RybmNhdAorIyBpZmRlZiBfVVNFX1NUUklOR19BUkNIX3N0cmNocgorIyAgZGVmaW5lIHN0cm5jYXQoZGVzdCwgc3JjLCBuKSBcCisgIChfX2V4dGVuc2lvbl9fICh7IGNoYXIgKl9fZGVzdCA9IChkZXN0KTsJCQkJICAgICAgXAorCQkgICAgX19idWlsdGluX2NvbnN0YW50X3AgKHNyYykgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKG4pICAgIFwKKwkJICAgID8gKHN0cmxlbiAoc3JjKSA8ICgoc2l6ZV90KSAobikpCQkJICAgICAgXAorCQkgICAgICAgPyBzdHJjYXQgKF9fZGVzdCwgc3JjKQkJCQkgICAgICBcCisJCSAgICAgICA6ICgqKChjaGFyICopIF9fbWVtcGNweSAoc3RyY2hyIChfX2Rlc3QsICdcMCcpLAkgICAgICBcCisJCQkJCQlzcmMsIG4pKSA9ICdcMCcsIF9fZGVzdCkpICAgICBcCisJCSAgICA6IHN0cm5jYXQgKGRlc3QsIHNyYywgbik7IH0pKQorIyBlbGlmIF9fR05VQ19QUkVSRVEgKDMsIDIpCisjICBkZWZpbmUgc3RybmNhdChkZXN0LCBzcmMsIG4pIF9fYnVpbHRpbl9zdHJuY2F0IChkZXN0LCBzcmMsIG4pCisjIGVsc2UKKyMgIGRlZmluZSBzdHJuY2F0KGRlc3QsIHNyYywgbikgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHNyYykgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKG4pICAgICAgXAorCQkgID8gKHN0cmxlbiAoc3JjKSA8ICgoc2l6ZV90KSAobikpCQkJICAgICAgXAorCQkgICAgID8gc3RyY2F0IChkZXN0LCBzcmMpCQkJCSAgICAgIFwKKwkJICAgICA6IHN0cm5jYXQgKGRlc3QsIHNyYywgbikpCQkJCSAgICAgIFwKKwkJICA6IHN0cm5jYXQgKGRlc3QsIHNyYywgbikpKQorIyBlbmRpZgorI2VuZGlmCisKKworLyogQ29tcGFyZSBjaGFyYWN0ZXJzIG9mIFMxIGFuZCBTMi4gICovCisjaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cmNtcAorIyBpZiBfX0dOVUNfUFJFUkVRICgzLCAyKQorIyAgZGVmaW5lIHN0cmNtcChzMSwgczIpIFwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJICAgICAgXAorICAoeyBzaXplX3QgX19zMV9sZW4sIF9fczJfbGVuOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMSkgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKHMyKQkJICAgICAgXAorICAgICAgJiYgKF9fczFfbGVuID0gX19idWlsdGluX3N0cmxlbiAoczEpLCBfX3MyX2xlbiA9IF9fYnVpbHRpbl9zdHJsZW4gKHMyKSwgXAorCSAgKCFfX3N0cmluZzJfMWJwdHJfcCAoczEpIHx8IF9fczFfbGVuID49IDQpCQkJICAgICAgXAorCSAgJiYgKCFfX3N0cmluZzJfMWJwdHJfcCAoczIpIHx8IF9fczJfbGVuID49IDQpKQkJICAgICAgXAorICAgICAgPyBfX2J1aWx0aW5fc3RyY21wIChzMSwgczIpCQkJCQkgICAgICBcCisgICAgICA6IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczEpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzMSkJCSAgICAgIFwKKwkgJiYgKF9fczFfbGVuID0gX19idWlsdGluX3N0cmxlbiAoczEpLCBfX3MxX2xlbiA8IDQpCQkgICAgICBcCisJID8gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMikgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMyKQkJICAgICAgXAorCSAgICA/IF9fYnVpbHRpbl9zdHJjbXAgKHMxLCBzMikJCQkJCSAgICAgIFwKKwkgICAgOiBfX3N0cmNtcF9jZyAoczEsIHMyLCBfX3MxX2xlbikpCQkJCSAgICAgIFwKKwkgOiAoX19idWlsdGluX2NvbnN0YW50X3AgKHMyKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoczIpCQkgICAgICBcCisJICAgICYmIChfX3MyX2xlbiA9IF9fYnVpbHRpbl9zdHJsZW4gKHMyKSwgX19zMl9sZW4gPCA0KQkJICAgICAgXAorCSAgICA/IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczEpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzMSkJICAgICAgXAorCSAgICAgICA/IF9fYnVpbHRpbl9zdHJjbXAgKHMxLCBzMikJCQkJICAgICAgXAorCSAgICAgICA6IF9fc3RyY21wX2djIChzMSwgczIsIF9fczJfbGVuKSkJCQkgICAgICBcCisJICAgIDogX19idWlsdGluX3N0cmNtcCAoczEsIHMyKSkpKTsgfSkKKyMgZWxzZQorIyAgZGVmaW5lIHN0cmNtcChzMSwgczIpIFwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJICAgICAgXAorICAoeyBzaXplX3QgX19zMV9sZW4sIF9fczJfbGVuOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMSkgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKHMyKQkJICAgICAgXAorICAgICAgJiYgKF9fczFfbGVuID0gc3RybGVuIChzMSksIF9fczJfbGVuID0gc3RybGVuIChzMiksCQkgICAgICBcCisJICAoIV9fc3RyaW5nMl8xYnB0cl9wIChzMSkgfHwgX19zMV9sZW4gPj0gNCkJCQkgICAgICBcCisJICAmJiAoIV9fc3RyaW5nMl8xYnB0cl9wIChzMikgfHwgX19zMl9sZW4gPj0gNCkpCQkgICAgICBcCisgICAgICA/IG1lbWNtcCAoKF9fY29uc3QgY2hhciAqKSAoczEpLCAoX19jb25zdCBjaGFyICopIChzMiksCQkgICAgICBcCisJCShfX3MxX2xlbiA8IF9fczJfbGVuID8gX19zMV9sZW4gOiBfX3MyX2xlbikgKyAxKQkgICAgICBcCisgICAgICA6IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczEpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzMSkJCSAgICAgIFwKKwkgJiYgKF9fczFfbGVuID0gc3RybGVuIChzMSksIF9fczFfbGVuIDwgNCkJCQkgICAgICBcCisJID8gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMikgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMyKQkJICAgICAgXAorCSAgICA/IF9fc3RyY21wX2NjIChzMSwgczIsIF9fczFfbGVuKQkJCQkgICAgICBcCisJICAgIDogX19zdHJjbXBfY2cgKHMxLCBzMiwgX19zMV9sZW4pKQkJCQkgICAgICBcCisJIDogKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMikgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMyKQkJICAgICAgXAorCSAgICAmJiAoX19zMl9sZW4gPSBzdHJsZW4gKHMyKSwgX19zMl9sZW4gPCA0KQkJCSAgICAgIFwKKwkgICAgPyAoX19idWlsdGluX2NvbnN0YW50X3AgKHMxKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoczEpCSAgICAgIFwKKwkgICAgICAgPyBfX3N0cmNtcF9jYyAoczEsIHMyLCBfX3MyX2xlbikJCQkJICAgICAgXAorCSAgICAgICA6IF9fc3RyY21wX2djIChzMSwgczIsIF9fczJfbGVuKSkJCQkgICAgICBcCisJICAgIDogc3RyY21wIChzMSwgczIpKSkpOyB9KQorIyBlbmRpZgorCisjIGRlZmluZSBfX3N0cmNtcF9jYyhzMSwgczIsIGwpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgcmVnaXN0ZXIgaW50IF9fcmVzdWx0ID0JCQkJICAgICAgXAorCQkgICAgICAoKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoczEpKVswXSAgIFwKKwkJICAgICAgIC0gKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKShzMikpWzBdKTtcCisJCSAgICBpZiAobCA+IDAgJiYgX19yZXN1bHQgPT0gMCkJCQkJICAgICAgXAorCQkgICAgICB7CQkJCQkJCSAgICAgIFwKKwkJCV9fcmVzdWx0ID0gKCgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopCQkgICAgICBcCisJCQkJICAgICAoX19jb25zdCBjaGFyICopIChzMSkpWzFdCQkgICAgICBcCisJCQkJICAgIC0gKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJICAgICAgXAorCQkJCSAgICAgICAoX19jb25zdCBjaGFyICopIChzMikpWzFdKTsJICAgICAgXAorCQkJaWYgKGwgPiAxICYmIF9fcmVzdWx0ID09IDApCQkJICAgICAgXAorCQkJICB7CQkJCQkJICAgICAgXAorCQkJICAgIF9fcmVzdWx0ID0JCQkJCSAgICAgIFwKKwkJCSAgICAgICgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkJICAgICAgXAorCQkJCShfX2NvbnN0IGNoYXIgKikgKHMxKSlbMl0JCSAgICAgIFwKKwkJCSAgICAgICAtICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopCQkgICAgICBcCisJCQkJICAoX19jb25zdCBjaGFyICopIChzMikpWzJdKTsJCSAgICAgIFwKKwkJCSAgICBpZiAobCA+IDIgJiYgX19yZXN1bHQgPT0gMCkJCQkgICAgICBcCisJCQkgICAgICBfX3Jlc3VsdCA9CQkJCSAgICAgIFwKKwkJCQkoKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJCSAgICAgIFwKKwkJCQkgIChfX2NvbnN0IGNoYXIgKikgKHMxKSlbM10JCSAgICAgIFwKKwkJCQkgLSAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkJICAgICAgXAorCQkJCSAgICAoX19jb25zdCBjaGFyICopIChzMikpWzNdKTsJCSAgICAgIFwKKwkJCSAgfQkJCQkJCSAgICAgIFwKKwkJICAgICAgfQkJCQkJCQkgICAgICBcCisJCSAgICBfX3Jlc3VsdDsgfSkpCisKKyMgZGVmaW5lIF9fc3RyY21wX2NnKHMxLCBzMiwgbDEpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgX19jb25zdCB1bnNpZ25lZCBjaGFyICpfX3MyID0JCQkgICAgICBcCisJCSAgICAgIChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoczIpOwkgICAgICBcCisJCSAgICByZWdpc3RlciBpbnQgX19yZXN1bHQgPQkJCQkgICAgICBcCisJCSAgICAgICgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzMSkpWzBdICAgXAorCQkgICAgICAgLSBfX3MyWzBdKTsJCQkJCSAgICAgIFwKKwkJICAgIGlmIChsMSA+IDAgJiYgX19yZXN1bHQgPT0gMCkJCQkgICAgICBcCisJCSAgICAgIHsJCQkJCQkJICAgICAgXAorCQkJX19yZXN1bHQgPSAoKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJCSAgICAgIFwKKwkJCQkgICAgIChfX2NvbnN0IGNoYXIgKikgKHMxKSlbMV0gLSBfX3MyWzFdKTsgICAgXAorCQkJaWYgKGwxID4gMSAmJiBfX3Jlc3VsdCA9PSAwKQkJCSAgICAgIFwKKwkJCSAgewkJCQkJCSAgICAgIFwKKwkJCSAgICBfX3Jlc3VsdCA9ICgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkgICAgICBcCisJCQkJCSAoX19jb25zdCBjaGFyICopIChzMSkpWzJdIC0gX19zMlsyXSk7XAorCQkJICAgIGlmIChsMSA+IDIgJiYgX19yZXN1bHQgPT0gMCkJCSAgICAgIFwKKwkJCSAgICAgIF9fcmVzdWx0ID0gKCgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopCSAgICAgIFwKKwkJCQkJICAoX19jb25zdCBjaGFyICopICAoczEpKVszXQkgICAgICBcCisJCQkJCSAgLSBfX3MyWzNdKTsJCQkgICAgICBcCisJCQkgIH0JCQkJCQkgICAgICBcCisJCSAgICAgIH0JCQkJCQkJICAgICAgXAorCQkgICAgX19yZXN1bHQ7IH0pKQorCisjIGRlZmluZSBfX3N0cmNtcF9nYyhzMSwgczIsIGwyKSBcCisgIChfX2V4dGVuc2lvbl9fICh7IF9fY29uc3QgdW5zaWduZWQgY2hhciAqX19zMSA9CQkJICAgICAgXAorCQkgICAgICAoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHMxKTsJICAgICAgXAorCQkgICAgcmVnaXN0ZXIgaW50IF9fcmVzdWx0ID0JCQkJICAgICAgXAorCQkgICAgICBfX3MxWzBdIC0gKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJCSAgICAgIFwKKwkJCQkgKF9fY29uc3QgY2hhciAqKSAoczIpKVswXTsJCSAgICAgIFwKKwkJICAgIGlmIChsMiA+IDAgJiYgX19yZXN1bHQgPT0gMCkJCQkgICAgICBcCisJCSAgICAgIHsJCQkJCQkJICAgICAgXAorCQkJX19yZXN1bHQgPSAoX19zMVsxXQkJCQkgICAgICBcCisJCQkJICAgIC0gKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJICAgICAgXAorCQkJCSAgICAgICAoX19jb25zdCBjaGFyICopIChzMikpWzFdKTsJICAgICAgXAorCQkJaWYgKGwyID4gMSAmJiBfX3Jlc3VsdCA9PSAwKQkJCSAgICAgIFwKKwkJCSAgewkJCQkJCSAgICAgIFwKKwkJCSAgICBfX3Jlc3VsdCA9CQkJCQkgICAgICBcCisJCQkgICAgICAoX19zMVsyXSAtICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopCSAgICAgIFwKKwkJCQkJICAoX19jb25zdCBjaGFyICopIChzMikpWzJdKTsJICAgICAgXAorCQkJICAgIGlmIChsMiA+IDIgJiYgX19yZXN1bHQgPT0gMCkJCSAgICAgIFwKKwkJCSAgICAgIF9fcmVzdWx0ID0JCQkJICAgICAgXAorCQkJCShfX3MxWzNdCQkJCSAgICAgIFwKKwkJCQkgLSAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkJICAgICAgXAorCQkJCSAgICAoX19jb25zdCBjaGFyICopIChzMikpWzNdKTsJCSAgICAgIFwKKwkJCSAgfQkJCQkJCSAgICAgIFwKKwkJICAgICAgfQkJCQkJCQkgICAgICBcCisJCSAgICBfX3Jlc3VsdDsgfSkpCisjZW5kaWYKKworCisvKiBDb21wYXJlIE4gY2hhcmFjdGVycyBvZiBTMSBhbmQgUzIuICAqLworI2lmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHJuY21wCisjIGRlZmluZSBzdHJuY21wKHMxLCBzMiwgbikJCQkJCQkgICAgICBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAobikJCQkJICAgICAgXAorCQkgICYmICgoX19idWlsdGluX2NvbnN0YW50X3AgKHMxKQkJCSAgICAgIFwKKwkJICAgICAgICYmIHN0cmxlbiAoczEpIDwgKChzaXplX3QpIChuKSkpCQkJICAgICAgXAorCQkgICAgICB8fCAoX19idWlsdGluX2NvbnN0YW50X3AgKHMyKQkJCSAgICAgIFwKKwkJCSAgJiYgc3RybGVuIChzMikgPCAoKHNpemVfdCkgKG4pKSkpCQkgICAgICBcCisJCSAgPyBzdHJjbXAgKHMxLCBzMikgOiBzdHJuY21wIChzMSwgczIsIG4pKSkKKyNlbmRpZgorCisKKy8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbml0aWFsIHNlZ21lbnQgb2YgUyB3aGljaAorICAgY29uc2lzdHMgZW50aXJlbHkgb2YgY2hhcmFjdGVycyBub3QgaW4gUkVKRUNULiAgKi8KKyNpZiAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJjc3BuIHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cmNzcG4KKyMgIGlmIF9fR05VQ19QUkVSRVEgKDMsIDIpCisjICAgZGVmaW5lIHN0cmNzcG4ocywgcmVqZWN0KSBcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCSAgICAgIFwKKyAgKHsgY2hhciBfX3IwLCBfX3IxLCBfX3IyOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChyZWplY3QpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChyZWplY3QpCSAgICAgIFwKKyAgICAgID8gKChfX2J1aWx0aW5fY29uc3RhbnRfcCAocykgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMpKQkJICAgICAgXAorCSA/IF9fYnVpbHRpbl9zdHJjc3BuIChzLCByZWplY3QpCQkJCSAgICAgIFwKKwkgOiAoKF9fcjAgPSAoKF9fY29uc3QgY2hhciAqKSAocmVqZWN0KSlbMF0sIF9fcjAgPT0gJ1wwJykJICAgICAgXAorCSAgICA/IHN0cmxlbiAocykJCQkJCQkgICAgICBcCisJICAgIDogKChfX3IxID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzFdLCBfX3IxID09ICdcMCcpCSAgICAgIFwKKwkgICAgICAgPyBfX3N0cmNzcG5fYzEgKHMsIF9fcjApCQkJCQkgICAgICBcCisJICAgICAgIDogKChfX3IyID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzJdLCBfX3IyID09ICdcMCcpCSAgICAgIFwKKwkJICA/IF9fc3RyY3Nwbl9jMiAocywgX19yMCwgX19yMSkJCQkgICAgICBcCisJCSAgOiAoKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzNdID09ICdcMCcJCSAgICAgIFwKKwkJICAgICA/IF9fc3RyY3Nwbl9jMyAocywgX19yMCwgX19yMSwgX19yMikJCSAgICAgIFwKKwkJICAgICA6IF9fYnVpbHRpbl9zdHJjc3BuIChzLCByZWplY3QpKSkpKSkJCSAgICAgIFwKKyAgICAgIDogX19idWlsdGluX3N0cmNzcG4gKHMsIHJlamVjdCkpOyB9KQorIyAgZWxzZQorIyAgIGRlZmluZSBzdHJjc3BuKHMsIHJlamVjdCkgXAorICBfX2V4dGVuc2lvbl9fCQkJCQkJCQkgICAgICBcCisgICh7IGNoYXIgX19yMCwgX19yMSwgX19yMjsJCQkJCQkgICAgICBcCisgICAgIChfX2J1aWx0aW5fY29uc3RhbnRfcCAocmVqZWN0KSAmJiBfX3N0cmluZzJfMWJwdHJfcCAocmVqZWN0KQkgICAgICBcCisgICAgICA/ICgoX19yMCA9ICgoX19jb25zdCBjaGFyICopIChyZWplY3QpKVswXSwgX19yMCA9PSAnXDAnKQkJICAgICAgXAorCSA/IHN0cmxlbiAocykJCQkJCQkJICAgICAgXAorCSA6ICgoX19yMSA9ICgoX19jb25zdCBjaGFyICopIChyZWplY3QpKVsxXSwgX19yMSA9PSAnXDAnKQkgICAgICBcCisJICAgID8gX19zdHJjc3BuX2MxIChzLCBfX3IwKQkJCQkJICAgICAgXAorCSAgICA6ICgoX19yMiA9ICgoX19jb25zdCBjaGFyICopIChyZWplY3QpKVsyXSwgX19yMiA9PSAnXDAnKQkgICAgICBcCisJICAgICAgID8gX19zdHJjc3BuX2MyIChzLCBfX3IwLCBfX3IxKQkJCQkgICAgICBcCisJICAgICAgIDogKCgoX19jb25zdCBjaGFyICopIChyZWplY3QpKVszXSA9PSAnXDAnCQkgICAgICBcCisJCSAgPyBfX3N0cmNzcG5fYzMgKHMsIF9fcjAsIF9fcjEsIF9fcjIpCQkJICAgICAgXAorCQkgIDogc3RyY3NwbiAocywgcmVqZWN0KSkpKSkJCQkJICAgICAgXAorICAgICAgOiBzdHJjc3BuIChzLCByZWplY3QpKTsgfSkKKyMgIGVuZGlmCisjIGVuZGlmCisKK19fU1RSSU5HX0lOTElORSBzaXplX3QgX19zdHJjc3BuX2MxIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fcmVqZWN0KTsKK19fU1RSSU5HX0lOTElORSBzaXplX3QKK19fc3RyY3Nwbl9jMSAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX3JlamVjdCkKK3sKKyAgcmVnaXN0ZXIgc2l6ZV90IF9fcmVzdWx0ID0gMDsKKyAgd2hpbGUgKF9fc1tfX3Jlc3VsdF0gIT0gJ1wwJyAmJiBfX3NbX19yZXN1bHRdICE9IF9fcmVqZWN0KQorICAgICsrX19yZXN1bHQ7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKworX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cmNzcG5fYzIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19yZWplY3QxLAorCQkJCSAgICAgaW50IF9fcmVqZWN0Mik7CitfX1NUUklOR19JTkxJTkUgc2l6ZV90CitfX3N0cmNzcG5fYzIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19yZWplY3QxLCBpbnQgX19yZWplY3QyKQoreworICByZWdpc3RlciBzaXplX3QgX19yZXN1bHQgPSAwOworICB3aGlsZSAoX19zW19fcmVzdWx0XSAhPSAnXDAnICYmIF9fc1tfX3Jlc3VsdF0gIT0gX19yZWplY3QxCisJICYmIF9fc1tfX3Jlc3VsdF0gIT0gX19yZWplY3QyKQorICAgICsrX19yZXN1bHQ7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKworX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cmNzcG5fYzMgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19yZWplY3QxLAorCQkJCSAgICAgaW50IF9fcmVqZWN0MiwgaW50IF9fcmVqZWN0Myk7CitfX1NUUklOR19JTkxJTkUgc2l6ZV90CitfX3N0cmNzcG5fYzMgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19yZWplY3QxLCBpbnQgX19yZWplY3QyLAorCSAgICAgIGludCBfX3JlamVjdDMpCit7CisgIHJlZ2lzdGVyIHNpemVfdCBfX3Jlc3VsdCA9IDA7CisgIHdoaWxlIChfX3NbX19yZXN1bHRdICE9ICdcMCcgJiYgX19zW19fcmVzdWx0XSAhPSBfX3JlamVjdDEKKwkgJiYgX19zW19fcmVzdWx0XSAhPSBfX3JlamVjdDIgJiYgX19zW19fcmVzdWx0XSAhPSBfX3JlamVjdDMpCisgICAgKytfX3Jlc3VsdDsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorI2VuZGlmCisKKworLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgc2VnbWVudCBvZiBTIHdoaWNoCisgICBjb25zaXN0cyBlbnRpcmVseSBvZiBjaGFyYWN0ZXJzIGluIEFDQ0VQVC4gICovCisjaWYgIWRlZmluZWQgX0hBVkVfU1RSSU5HX0FSQ0hfc3Ryc3BuIHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cnNwbgorIyAgaWYgX19HTlVDX1BSRVJFUSAoMywgMikKKyMgICBkZWZpbmUgc3Ryc3BuKHMsIGFjY2VwdCkgXAorICBfX2V4dGVuc2lvbl9fCQkJCQkJCQkgICAgICBcCisgICh7IGNoYXIgX19hMCwgX19hMSwgX19hMjsJCQkJCQkgICAgICBcCisgICAgIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYWNjZXB0KSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoYWNjZXB0KQkgICAgICBcCisgICAgICA/ICgoX19idWlsdGluX2NvbnN0YW50X3AgKHMpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzKSkJCSAgICAgIFwKKwkgPyBfX2J1aWx0aW5fc3Ryc3BuIChzLCBhY2NlcHQpCQkJCQkgICAgICBcCisJIDogKChfX2EwID0gKChfX2NvbnN0IGNoYXIgKikgKGFjY2VwdCkpWzBdLCBfX2EwID09ICdcMCcpCSAgICAgIFwKKwkgICAgPyAoKHZvaWQpIChzKSwgMCkJCQkJCQkgICAgICBcCisJICAgIDogKChfX2ExID0gKChfX2NvbnN0IGNoYXIgKikgKGFjY2VwdCkpWzFdLCBfX2ExID09ICdcMCcpCSAgICAgIFwKKwkgICAgICAgPyBfX3N0cnNwbl9jMSAocywgX19hMCkJCQkJCSAgICAgIFwKKwkgICAgICAgOiAoKF9fYTIgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMl0sIF9fYTIgPT0gJ1wwJykJICAgICAgXAorCQkgID8gX19zdHJzcG5fYzIgKHMsIF9fYTAsIF9fYTEpCQkJCSAgICAgIFwKKwkJICA6ICgoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbM10gPT0gJ1wwJwkJICAgICAgXAorCQkgICAgID8gX19zdHJzcG5fYzMgKHMsIF9fYTAsIF9fYTEsIF9fYTIpCQkgICAgICBcCisJCSAgICAgOiBfX2J1aWx0aW5fc3Ryc3BuIChzLCBhY2NlcHQpKSkpKSkJCSAgICAgIFwKKyAgICAgIDogX19idWlsdGluX3N0cnNwbiAocywgYWNjZXB0KSk7IH0pCisjICBlbHNlCisjICAgZGVmaW5lIHN0cnNwbihzLCBhY2NlcHQpIFwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJICAgICAgXAorICAoeyBjaGFyIF9fYTAsIF9fYTEsIF9fYTI7CQkJCQkJICAgICAgXAorICAgICAoX19idWlsdGluX2NvbnN0YW50X3AgKGFjY2VwdCkgJiYgX19zdHJpbmcyXzFicHRyX3AgKGFjY2VwdCkJICAgICAgXAorICAgICAgPyAoKF9fYTAgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMF0sIF9fYTAgPT0gJ1wwJykJCSAgICAgIFwKKwkgPyAoKHZvaWQpIChzKSwgMCkJCQkJCQkgICAgICBcCisJIDogKChfX2ExID0gKChfX2NvbnN0IGNoYXIgKikgKGFjY2VwdCkpWzFdLCBfX2ExID09ICdcMCcpCSAgICAgIFwKKwkgICAgPyBfX3N0cnNwbl9jMSAocywgX19hMCkJCQkJCSAgICAgIFwKKwkgICAgOiAoKF9fYTIgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMl0sIF9fYTIgPT0gJ1wwJykJICAgICAgXAorCSAgICAgICA/IF9fc3Ryc3BuX2MyIChzLCBfX2EwLCBfX2ExKQkJCQkgICAgICBcCisJICAgICAgIDogKCgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVszXSA9PSAnXDAnCQkgICAgICBcCisJCSAgPyBfX3N0cnNwbl9jMyAocywgX19hMCwgX19hMSwgX19hMikJCQkgICAgICBcCisJCSAgOiBzdHJzcG4gKHMsIGFjY2VwdCkpKSkpCQkJCSAgICAgIFwKKyAgICAgIDogc3Ryc3BuIChzLCBhY2NlcHQpKTsgfSkKKyMgIGVuZGlmCisjIGVuZGlmCisKK19fU1RSSU5HX0lOTElORSBzaXplX3QgX19zdHJzcG5fYzEgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQpOworX19TVFJJTkdfSU5MSU5FIHNpemVfdAorX19zdHJzcG5fYzEgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQpCit7CisgIHJlZ2lzdGVyIHNpemVfdCBfX3Jlc3VsdCA9IDA7CisgIC8qIFBsZWFzZSBub3RlIHRoYXQgX19hY2NlcHQgbmV2ZXIgY2FuIGJlICdcMCcuICAqLworICB3aGlsZSAoX19zW19fcmVzdWx0XSA9PSBfX2FjY2VwdCkKKyAgICArK19fcmVzdWx0OworICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK19fU1RSSU5HX0lOTElORSBzaXplX3QgX19zdHJzcG5fYzIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLAorCQkJCSAgICBpbnQgX19hY2NlcHQyKTsKK19fU1RSSU5HX0lOTElORSBzaXplX3QKK19fc3Ryc3BuX2MyIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYWNjZXB0MSwgaW50IF9fYWNjZXB0MikKK3sKKyAgcmVnaXN0ZXIgc2l6ZV90IF9fcmVzdWx0ID0gMDsKKyAgLyogUGxlYXNlIG5vdGUgdGhhdCBfX2FjY2VwdDEgYW5kIF9fYWNjZXB0MiBuZXZlciBjYW4gYmUgJ1wwJy4gICovCisgIHdoaWxlIChfX3NbX19yZXN1bHRdID09IF9fYWNjZXB0MSB8fCBfX3NbX19yZXN1bHRdID09IF9fYWNjZXB0MikKKyAgICArK19fcmVzdWx0OworICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK19fU1RSSU5HX0lOTElORSBzaXplX3QgX19zdHJzcG5fYzMgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLAorCQkJCSAgICBpbnQgX19hY2NlcHQyLCBpbnQgX19hY2NlcHQzKTsKK19fU1RSSU5HX0lOTElORSBzaXplX3QKK19fc3Ryc3BuX2MzIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYWNjZXB0MSwgaW50IF9fYWNjZXB0MiwgaW50IF9fYWNjZXB0MykKK3sKKyAgcmVnaXN0ZXIgc2l6ZV90IF9fcmVzdWx0ID0gMDsKKyAgLyogUGxlYXNlIG5vdGUgdGhhdCBfX2FjY2VwdDEgdG8gX19hY2NlcHQzIG5ldmVyIGNhbiBiZSAnXDAnLiAgKi8KKyAgd2hpbGUgKF9fc1tfX3Jlc3VsdF0gPT0gX19hY2NlcHQxIHx8IF9fc1tfX3Jlc3VsdF0gPT0gX19hY2NlcHQyCisJIHx8IF9fc1tfX3Jlc3VsdF0gPT0gX19hY2NlcHQzKQorICAgICsrX19yZXN1bHQ7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKyNlbmRpZgorCisKKy8qIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2UgaW4gUyBvZiBhbnkgY2hhcmFjdGVyIGluIEFDQ0VQVC4gICovCisjaWYgIWRlZmluZWQgX0hBVkVfU1RSSU5HX0FSQ0hfc3RycGJyayB8fCBkZWZpbmVkIF9GT1JDRV9JTkxJTkVTCisjIGlmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHJwYnJrCisjICBpZiBfX0dOVUNfUFJFUkVRICgzLCAyKQorIyAgIGRlZmluZSBzdHJwYnJrKHMsIGFjY2VwdCkgXAorICBfX2V4dGVuc2lvbl9fCQkJCQkJCQkgICAgICBcCisgICh7IGNoYXIgX19hMCwgX19hMSwgX19hMjsJCQkJCQkgICAgICBcCisgICAgIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYWNjZXB0KSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoYWNjZXB0KQkgICAgICBcCisgICAgICA/ICgoX19idWlsdGluX2NvbnN0YW50X3AgKHMpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzKSkJCSAgICAgIFwKKwkgPyBfX2J1aWx0aW5fc3RycGJyayAocywgYWNjZXB0KQkJCQkgICAgICBcCisJIDogKChfX2EwID0gKChfX2NvbnN0IGNoYXIgICopIChhY2NlcHQpKVswXSwgX19hMCA9PSAnXDAnKQkgICAgICBcCisJICAgID8gKCh2b2lkKSAocyksIChjaGFyICopIE5VTEwpCQkJCSAgICAgIFwKKwkgICAgOiAoKF9fYTEgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMV0sIF9fYTEgPT0gJ1wwJykJICAgICAgXAorCSAgICAgICA/IF9fYnVpbHRpbl9zdHJjaHIgKHMsIF9fYTApCQkJCSAgICAgIFwKKwkgICAgICAgOiAoKF9fYTIgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMl0sIF9fYTIgPT0gJ1wwJykJICAgICAgXAorCQkgID8gX19zdHJwYnJrX2MyIChzLCBfX2EwLCBfX2ExKQkJCSAgICAgIFwKKwkJICA6ICgoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbM10gPT0gJ1wwJwkJICAgICAgXAorCQkgICAgID8gX19zdHJwYnJrX2MzIChzLCBfX2EwLCBfX2ExLCBfX2EyKQkJICAgICAgXAorCQkgICAgIDogX19idWlsdGluX3N0cnBicmsgKHMsIGFjY2VwdCkpKSkpKQkJICAgICAgXAorICAgICAgOiBfX2J1aWx0aW5fc3RycGJyayAocywgYWNjZXB0KSk7IH0pCisjICBlbHNlCisjICAgZGVmaW5lIHN0cnBicmsocywgYWNjZXB0KSBcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCSAgICAgIFwKKyAgKHsgY2hhciBfX2EwLCBfX2ExLCBfX2EyOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChhY2NlcHQpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChhY2NlcHQpCSAgICAgIFwKKyAgICAgID8gKChfX2EwID0gKChfX2NvbnN0IGNoYXIgICopIChhY2NlcHQpKVswXSwgX19hMCA9PSAnXDAnKQkJICAgICAgXAorCSA/ICgodm9pZCkgKHMpLCAoY2hhciAqKSBOVUxMKQkJCQkJICAgICAgXAorCSA6ICgoX19hMSA9ICgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVsxXSwgX19hMSA9PSAnXDAnKQkgICAgICBcCisJICAgID8gc3RyY2hyIChzLCBfX2EwKQkJCQkJCSAgICAgIFwKKwkgICAgOiAoKF9fYTIgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMl0sIF9fYTIgPT0gJ1wwJykJICAgICAgXAorCSAgICAgICA/IF9fc3RycGJya19jMiAocywgX19hMCwgX19hMSkJCQkJICAgICAgXAorCSAgICAgICA6ICgoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbM10gPT0gJ1wwJwkJICAgICAgXAorCQkgID8gX19zdHJwYnJrX2MzIChzLCBfX2EwLCBfX2ExLCBfX2EyKQkJCSAgICAgIFwKKwkJICA6IHN0cnBicmsgKHMsIGFjY2VwdCkpKSkpCQkJCSAgICAgIFwKKyAgICAgIDogc3RycGJyayAocywgYWNjZXB0KSk7IH0pCisjICBlbmRpZgorIyBlbmRpZgorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJwYnJrX2MyIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYWNjZXB0MSwKKwkJCQkgICAgIGludCBfX2FjY2VwdDIpOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJwYnJrX2MyIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYWNjZXB0MSwgaW50IF9fYWNjZXB0MikKK3sKKyAgLyogUGxlYXNlIG5vdGUgdGhhdCBfX2FjY2VwdDEgYW5kIF9fYWNjZXB0MiBuZXZlciBjYW4gYmUgJ1wwJy4gICovCisgIHdoaWxlICgqX19zICE9ICdcMCcgJiYgKl9fcyAhPSBfX2FjY2VwdDEgJiYgKl9fcyAhPSBfX2FjY2VwdDIpCisgICAgKytfX3M7CisgIHJldHVybiAqX19zID09ICdcMCcgPyBOVUxMIDogKGNoYXIgKikgKHNpemVfdCkgX19zOworfQorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJwYnJrX2MzIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYWNjZXB0MSwKKwkJCQkgICAgIGludCBfX2FjY2VwdDIsIGludCBfX2FjY2VwdDMpOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJwYnJrX2MzIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYWNjZXB0MSwgaW50IF9fYWNjZXB0MiwKKwkgICAgICBpbnQgX19hY2NlcHQzKQoreworICAvKiBQbGVhc2Ugbm90ZSB0aGF0IF9fYWNjZXB0MSB0byBfX2FjY2VwdDMgbmV2ZXIgY2FuIGJlICdcMCcuICAqLworICB3aGlsZSAoKl9fcyAhPSAnXDAnICYmICpfX3MgIT0gX19hY2NlcHQxICYmICpfX3MgIT0gX19hY2NlcHQyCisJICYmICpfX3MgIT0gX19hY2NlcHQzKQorICAgICsrX19zOworICByZXR1cm4gKl9fcyA9PSAnXDAnID8gTlVMTCA6IChjaGFyICopIChzaXplX3QpIF9fczsKK30KKyNlbmRpZgorCisKKy8qIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgTkVFRExFIGluIEhBWVNUQUNLLiAgTmV3ZXIgZ2NjIHZlcnNpb25zCisgICBkbyB0aGlzIGl0c2VsZi4gICovCisjaWYgIWRlZmluZWQgX0hBVkVfU1RSSU5HX0FSQ0hfc3Ryc3RyICYmICFfX0dOVUNfUFJFUkVRICgyLCA5NykKKyMgZGVmaW5lIHN0cnN0cihoYXlzdGFjaywgbmVlZGxlKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAobmVlZGxlKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAobmVlZGxlKSBcCisJCSAgPyAoKChfX2NvbnN0IGNoYXIgKikgKG5lZWRsZSkpWzBdID09ICdcMCcJCSAgICAgIFwKKwkJICAgICA/IChjaGFyICopIChzaXplX3QpIChoYXlzdGFjaykJCQkgICAgICBcCisJCSAgICAgOiAoKChfX2NvbnN0IGNoYXIgKikgKG5lZWRsZSkpWzFdID09ICdcMCcJCSAgICAgIFwKKwkJCT8gc3RyY2hyIChoYXlzdGFjaywJCQkJICAgICAgXAorCQkJCSAgKChfX2NvbnN0IGNoYXIgKikgKG5lZWRsZSkpWzBdKSAJICAgICAgXAorCQkJOiBzdHJzdHIgKGhheXN0YWNrLCBuZWVkbGUpKSkJCQkgICAgICBcCisJCSAgOiBzdHJzdHIgKGhheXN0YWNrLCBuZWVkbGUpKSkKKyNlbmRpZgorCisKKyNpZiAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJ0b2tfciB8fCBkZWZpbmVkIF9GT1JDRV9JTkxJTkVTCisjIGlmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHJ0b2tfcgorIyAgZGVmaW5lIF9fc3RydG9rX3Iocywgc2VwLCBuZXh0cCkgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHNlcCkgJiYgX19zdHJpbmcyXzFicHRyX3AgKHNlcCkJICAgICAgXAorCQkgICYmICgoX19jb25zdCBjaGFyICopIChzZXApKVswXSAhPSAnXDAnCQkgICAgICBcCisJCSAgJiYgKChfX2NvbnN0IGNoYXIgKikgKHNlcCkpWzFdID09ICdcMCcJCSAgICAgIFwKKwkJICA/IF9fc3RydG9rX3JfMWMgKHMsICgoX19jb25zdCBjaGFyICopIChzZXApKVswXSwgbmV4dHApICAgICBcCisJCSAgOiBfX3N0cnRva19yIChzLCBzZXAsIG5leHRwKSkpCisjIGVuZGlmCisKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cnRva19yXzFjIChjaGFyICpfX3MsIGNoYXIgX19zZXAsIGNoYXIgKipfX25leHRwKTsKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RydG9rX3JfMWMgKGNoYXIgKl9fcywgY2hhciBfX3NlcCwgY2hhciAqKl9fbmV4dHApCit7CisgIGNoYXIgKl9fcmVzdWx0OworICBpZiAoX19zID09IE5VTEwpCisgICAgX19zID0gKl9fbmV4dHA7CisgIHdoaWxlICgqX19zID09IF9fc2VwKQorICAgICsrX19zOworICBfX3Jlc3VsdCA9IE5VTEw7CisgIGlmICgqX19zICE9ICdcMCcpCisgICAgeworICAgICAgX19yZXN1bHQgPSBfX3MrKzsKKyAgICAgIHdoaWxlICgqX19zICE9ICdcMCcpCisJaWYgKCpfX3MrKyA9PSBfX3NlcCkKKwkgIHsKKwkgICAgX19zWy0xXSA9ICdcMCc7CisJICAgIGJyZWFrOworCSAgfQorICAgIH0KKyAgKl9fbmV4dHAgPSBfX3M7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKyMgaWYgZGVmaW5lZCBfX1VTRV9QT1NJWCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKyMgIGRlZmluZSBzdHJ0b2tfcihzLCBzZXAsIG5leHRwKSBfX3N0cnRva19yIChzLCBzZXAsIG5leHRwKQorIyBlbmRpZgorI2VuZGlmCisKKworI2lmICFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX3N0cnNlcCB8fCBkZWZpbmVkIF9GT1JDRV9JTkxJTkVTCisjIGlmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHJzZXAKKworZXh0ZXJuIGNoYXIgKl9fc3Ryc2VwX2cgKGNoYXIgKipfX3N0cmluZ3AsIF9fY29uc3QgY2hhciAqX19kZWxpbSk7CisjICBkZWZpbmUgX19zdHJzZXAocywgcmVqZWN0KSBcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCSAgICAgIFwKKyAgKHsgY2hhciBfX3IwLCBfX3IxLCBfX3IyOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChyZWplY3QpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChyZWplY3QpCSAgICAgIFwKKyAgICAgICYmIChfX3IwID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzBdLAkJCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChyZWplY3QpKVswXSAhPSAnXDAnKQkJCSAgICAgIFwKKyAgICAgID8gKChfX3IxID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzFdLAkJCSAgICAgIFwKKwkgKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzFdID09ICdcMCcpCQkJICAgICAgXAorCSA/IF9fc3Ryc2VwXzFjIChzLCBfX3IwKQkJCQkJICAgICAgXAorCSA6ICgoX19yMiA9ICgoX19jb25zdCBjaGFyICopIChyZWplY3QpKVsyXSwgX19yMiA9PSAnXDAnKQkgICAgICBcCisJICAgID8gX19zdHJzZXBfMmMgKHMsIF9fcjAsIF9fcjEpCQkJCSAgICAgIFwKKwkgICAgOiAoKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzNdID09ICdcMCcJCQkgICAgICBcCisJICAgICAgID8gX19zdHJzZXBfM2MgKHMsIF9fcjAsIF9fcjEsIF9fcjIpCQkJICAgICAgXAorCSAgICAgICA6IF9fc3Ryc2VwX2cgKHMsIHJlamVjdCkpKSkJCQkJICAgICAgXAorICAgICAgOiBfX3N0cnNlcF9nIChzLCByZWplY3QpKTsgfSkKKyMgZW5kaWYKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3Ryc2VwXzFjIChjaGFyICoqX19zLCBjaGFyIF9fcmVqZWN0KTsKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3Ryc2VwXzFjIChjaGFyICoqX19zLCBjaGFyIF9fcmVqZWN0KQoreworICByZWdpc3RlciBjaGFyICpfX3JldHZhbCA9ICpfX3M7CisgIGlmIChfX3JldHZhbCAhPSBOVUxMICYmICgqX19zID0gc3RyY2hyIChfX3JldHZhbCwgX19yZWplY3QpKSAhPSBOVUxMKQorICAgICooKl9fcykrKyA9ICdcMCc7CisgIHJldHVybiBfX3JldHZhbDsKK30KKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3Ryc2VwXzJjIChjaGFyICoqX19zLCBjaGFyIF9fcmVqZWN0MSwgY2hhciBfX3JlamVjdDIpOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJzZXBfMmMgKGNoYXIgKipfX3MsIGNoYXIgX19yZWplY3QxLCBjaGFyIF9fcmVqZWN0MikKK3sKKyAgcmVnaXN0ZXIgY2hhciAqX19yZXR2YWwgPSAqX19zOworICBpZiAoX19yZXR2YWwgIT0gTlVMTCkKKyAgICB7CisgICAgICByZWdpc3RlciBjaGFyICpfX2NwID0gX19yZXR2YWw7CisgICAgICB3aGlsZSAoMSkKKwl7CisJICBpZiAoKl9fY3AgPT0gJ1wwJykKKwkgICAgeworCSAgICAgIF9fY3AgPSBOVUxMOworCSAgYnJlYWs7CisJICAgIH0KKwkgIGlmICgqX19jcCA9PSBfX3JlamVjdDEgfHwgKl9fY3AgPT0gX19yZWplY3QyKQorCSAgICB7CisJICAgICAgKl9fY3ArKyA9ICdcMCc7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICsrX19jcDsKKwl9CisgICAgICAqX19zID0gX19jcDsKKyAgICB9CisgIHJldHVybiBfX3JldHZhbDsKK30KKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3Ryc2VwXzNjIChjaGFyICoqX19zLCBjaGFyIF9fcmVqZWN0MSwgY2hhciBfX3JlamVjdDIsCisJCQkJICAgY2hhciBfX3JlamVjdDMpOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJzZXBfM2MgKGNoYXIgKipfX3MsIGNoYXIgX19yZWplY3QxLCBjaGFyIF9fcmVqZWN0MiwgY2hhciBfX3JlamVjdDMpCit7CisgIHJlZ2lzdGVyIGNoYXIgKl9fcmV0dmFsID0gKl9fczsKKyAgaWYgKF9fcmV0dmFsICE9IE5VTEwpCisgICAgeworICAgICAgcmVnaXN0ZXIgY2hhciAqX19jcCA9IF9fcmV0dmFsOworICAgICAgd2hpbGUgKDEpCisJeworCSAgaWYgKCpfX2NwID09ICdcMCcpCisJICAgIHsKKwkgICAgICBfX2NwID0gTlVMTDsKKwkgIGJyZWFrOworCSAgICB9CisJICBpZiAoKl9fY3AgPT0gX19yZWplY3QxIHx8ICpfX2NwID09IF9fcmVqZWN0MiB8fCAqX19jcCA9PSBfX3JlamVjdDMpCisJICAgIHsKKwkgICAgICAqX19jcCsrID0gJ1wwJzsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgKytfX2NwOworCX0KKyAgICAgICpfX3MgPSBfX2NwOworICAgIH0KKyAgcmV0dXJuIF9fcmV0dmFsOworfQorIyBpZmRlZiBfX1VTRV9CU0QKKyMgIGRlZmluZSBzdHJzZXAocywgcmVqZWN0KSBfX3N0cnNlcCAocywgcmVqZWN0KQorIyBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG5lZWQgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBmb3IgaW5saW5lIHN0cmR1cCgpLgorICAgUmVmZXJyaW5nIHRvIHN0ZGxpYi5oIChldmVuIG1pbmltYWxseSkgaXMgbm90IGFsbG93ZWQKKyAgIGluIGFueSBvZiB0aGUgdGlnaHQgc3RhbmRhcmRzIGNvbXBsaWFudCBtb2Rlcy4gICovCisjaWZkZWYgX19VU0VfTUlTQworCisjIGlmICFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX3N0cmR1cCB8fCAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJuZHVwCisjICBkZWZpbmUgX19uZWVkX21hbGxvY19hbmRfY2FsbG9jCisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgZW5kaWYKKworIyBpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfc3RyZHVwCisKK2V4dGVybiBjaGFyICpfX3N0cmR1cCAoX19jb25zdCBjaGFyICpfX3N0cmluZykgX19USFJPVyBfX2F0dHJpYnV0ZV9tYWxsb2NfXzsKKyMgIGRlZmluZSBfX3N0cmR1cChzKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAocykgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMpCSAgICAgIFwKKwkJICA/ICgoKF9fY29uc3QgY2hhciAqKSAocykpWzBdID09ICdcMCcJCQkgICAgICBcCisJCSAgICAgPyAoY2hhciAqKSBjYWxsb2MgKChzaXplX3QpIDEsIChzaXplX3QpIDEpCQkgICAgICBcCisJCSAgICAgOiAoeyBzaXplX3QgX19sZW4gPSBzdHJsZW4gKHMpICsgMTsJCSAgICAgIFwKKwkJCSAgY2hhciAqX19yZXR2YWwgPSAoY2hhciAqKSBtYWxsb2MgKF9fbGVuKTsJICAgICAgXAorCQkJICBpZiAoX19yZXR2YWwgIT0gTlVMTCkJCQkJICAgICAgXAorCQkJICAgIF9fcmV0dmFsID0gKGNoYXIgKikgbWVtY3B5IChfX3JldHZhbCwgcywgX19sZW4pOyAgXAorCQkJICBfX3JldHZhbDsgfSkpCQkJCQkgICAgICBcCisJCSAgOiBfX3N0cmR1cCAocykpKQorCisjICBpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorIyAgIGRlZmluZSBzdHJkdXAocykgX19zdHJkdXAgKHMpCisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHJuZHVwCisKK2V4dGVybiBjaGFyICpfX3N0cm5kdXAgKF9fY29uc3QgY2hhciAqX19zdHJpbmcsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfbWFsbG9jX187CisjICBkZWZpbmUgX19zdHJuZHVwKHMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAocykJICAgICAgXAorCQkgID8gKCgoX19jb25zdCBjaGFyICopIChzKSlbMF0gPT0gJ1wwJwkJCSAgICAgIFwKKwkJICAgICA/IChjaGFyICopIGNhbGxvYyAoKHNpemVfdCkgMSwgKHNpemVfdCkgMSkJCSAgICAgIFwKKwkJICAgICA6ICh7IHNpemVfdCBfX2xlbiA9IHN0cmxlbiAocykgKyAxOwkJICAgICAgXAorCQkJICBzaXplX3QgX19uID0gKG4pOwkJCQkgICAgICBcCisJCQkgIGNoYXIgKl9fcmV0dmFsOwkJCQkgICAgICBcCisJCQkgIGlmIChfX24gPCBfX2xlbikJCQkJICAgICAgXAorCQkJICAgIF9fbGVuID0gX19uICsgMTsJCQkJICAgICAgXAorCQkJICBfX3JldHZhbCA9IChjaGFyICopIG1hbGxvYyAoX19sZW4pOwkJICAgICAgXAorCQkJICBpZiAoX19yZXR2YWwgIT0gTlVMTCkJCQkJICAgICAgXAorCQkJICAgIHsJCQkJCQkgICAgICBcCisJCQkgICAgICBfX3JldHZhbFtfX2xlbiAtIDFdID0gJ1wwJzsJCSAgICAgIFwKKwkJCSAgICAgIF9fcmV0dmFsID0gKGNoYXIgKikgbWVtY3B5IChfX3JldHZhbCwgcywJICAgICAgXAorCQkJCQkJCSAgX19sZW4gLSAxKTsJICAgICAgXAorCQkJICAgIH0JCQkJCQkgICAgICBcCisJCQkgIF9fcmV0dmFsOyB9KSkJCQkJCSAgICAgIFwKKwkJICA6IF9fc3RybmR1cCAocywgbikpKQorCisjICBpZmRlZiBfX1VTRV9HTlUKKyMgICBkZWZpbmUgc3RybmR1cChzLCBuKSBfX3N0cm5kdXAgKHMsIG4pCisjICBlbmRpZgorIyBlbmRpZgorCisjZW5kaWYgLyogVXNlIG1pc2MuIG9yIHVzZSBHTlUuICAqLworCisjaWZuZGVmIF9GT1JDRV9JTkxJTkVTCisjIHVuZGVmIF9fU1RSSU5HX0lOTElORQorI2VuZGlmCisKKyNlbmRpZiAvKiBObyBzdHJpbmcgaW5saW5lcy4gICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3RyaW5nMy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0cmluZzMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjQ3NzI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0cmluZzMuaApAQCAtMCwwICsxLDE1MyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVFJJTkdfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL3N0cmluZzMuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHN0cmluZy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCitfX3dhcm5kZWNsIChfX3dhcm5fbWVtc2V0X3plcm9fbGVuLAorCSAgICAibWVtc2V0IHVzZWQgd2l0aCBjb25zdGFudCB6ZXJvIGxlbmd0aCBwYXJhbWV0ZXI7IHRoaXMgY291bGQgYmUgZHVlIHRvIHRyYW5zcG9zZWQgcGFyYW1ldGVycyIpOworCisjaWZuZGVmIF9fY3BsdXNwbHVzCisvKiBYWFggVGhpcyBpcyB0ZW1wb3JhcmlseS4gIFdlIHNob3VsZCBub3QgcmVkZWZpbmUgYW55IG9mIHRoZSBzeW1ib2xzCisgICBhbmQgaW5zdGVhZCBpbnRlZ3JhdGUgdGhlIGVycm9yIGNoZWNraW5nIGludG8gdGhlIG9yaWdpbmFsCisgICBkZWZpbml0aW9ucy4gICovCisjIHVuZGVmIG1lbWNweQorIyB1bmRlZiBtZW1tb3ZlCisjIHVuZGVmIG1lbXNldAorIyB1bmRlZiBzdHJjYXQKKyMgdW5kZWYgc3RyY3B5CisjIHVuZGVmIHN0cm5jYXQKKyMgdW5kZWYgc3RybmNweQorIyBpZmRlZiBfX1VTRV9HTlUKKyMgIHVuZGVmIG1lbXBjcHkKKyMgIHVuZGVmIHN0cGNweQorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9CU0QKKyMgIHVuZGVmIGJjb3B5CisjICB1bmRlZiBiemVybworIyBlbmRpZgorI2VuZGlmCisKKworX19leHRlcm5fYWx3YXlzX2lubGluZSB2b2lkICoKK19fTlRIIChtZW1jcHkgKHZvaWQgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IHZvaWQgKl9fcmVzdHJpY3QgX19zcmMsCisJICAgICAgIHNpemVfdCBfX2xlbikpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19tZW1jcHlfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2xlbiwgX19ib3MwIChfX2Rlc3QpKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSB2b2lkICoKK19fTlRIIChtZW1tb3ZlICh2b2lkICpfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqX19zcmMsIHNpemVfdCBfX2xlbikpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19tZW1tb3ZlX2NoayAoX19kZXN0LCBfX3NyYywgX19sZW4sIF9fYm9zMCAoX19kZXN0KSk7Cit9CisKKyNpZmRlZiBfX1VTRV9HTlUKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgdm9pZCAqCitfX05USCAobWVtcGNweSAodm9pZCAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqX19yZXN0cmljdCBfX3NyYywKKwkJc2l6ZV90IF9fbGVuKSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX21lbXBjcHlfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2xlbiwgX19ib3MwIChfX2Rlc3QpKTsKK30KKyNlbmRpZgorCisKKy8qIFRoZSBmaXJzdCB0d28gdGVzdHMgaGVyZSBoZWxwIHRvIGNhdGNoIGEgc29tZXdoYXQgY29tbW9uIHByb2JsZW0KKyAgIHdoZXJlIHRoZSBzZWNvbmQgYW5kIHRoaXJkIHBhcmFtZXRlciBhcmUgdHJhbnNwb3NlZC4gIFRoaXMgaXMKKyAgIGVzcGVjaWFsbHkgcHJvYmxlbWF0aWMgaWYgdGhlIGludGVuZGVkIGZpbGwgdmFsdWUgaXMgemVyby4gIEluIHRoaXMKKyAgIGNhc2Ugbm8gd29yayBpcyBkb25lIGF0IGFsbC4gIFdlIGRldGVjdCB0aGVzZSBwcm9ibGVtcyBieSByZWZlcnJpbmcKKyAgIG5vbi1leGlzdGluZyBmdW5jdGlvbnMuICAqLworX19leHRlcm5fYWx3YXlzX2lubGluZSB2b2lkICoKK19fTlRIIChtZW1zZXQgKHZvaWQgKl9fZGVzdCwgaW50IF9fY2gsIHNpemVfdCBfX2xlbikpCit7CisgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19sZW4pICYmIF9fbGVuID09IDAKKyAgICAgICYmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fY2gpIHx8IF9fY2ggIT0gMCkpCisgICAgeworICAgICAgX193YXJuX21lbXNldF96ZXJvX2xlbiAoKTsKKyAgICAgIHJldHVybiBfX2Rlc3Q7CisgICAgfQorICByZXR1cm4gX19idWlsdGluX19fbWVtc2V0X2NoayAoX19kZXN0LCBfX2NoLCBfX2xlbiwgX19ib3MwIChfX2Rlc3QpKTsKK30KKworI2lmZGVmIF9fVVNFX0JTRAorX19leHRlcm5fYWx3YXlzX2lubGluZSB2b2lkCitfX05USCAoYmNvcHkgKF9fY29uc3Qgdm9pZCAqX19zcmMsIHZvaWQgKl9fZGVzdCwgc2l6ZV90IF9fbGVuKSkKK3sKKyAgKHZvaWQpIF9fYnVpbHRpbl9fX21lbW1vdmVfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2xlbiwgX19ib3MwIChfX2Rlc3QpKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSB2b2lkCitfX05USCAoYnplcm8gKHZvaWQgKl9fZGVzdCwgc2l6ZV90IF9fbGVuKSkKK3sKKyAgKHZvaWQpIF9fYnVpbHRpbl9fX21lbXNldF9jaGsgKF9fZGVzdCwgJ1wwJywgX19sZW4sIF9fYm9zMCAoX19kZXN0KSk7Cit9CisjZW5kaWYKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBjaGFyICoKK19fTlRIIChzdHJjcHkgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMpKQoreworICByZXR1cm4gX19idWlsdGluX19fc3RyY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19ib3MgKF9fZGVzdCkpOworfQorCisjaWZkZWYgX19VU0VfR05VCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGNoYXIgKgorX19OVEggKHN0cGNweSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYykpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19zdHBjcHlfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2JvcyAoX19kZXN0KSk7Cit9CisjZW5kaWYKKworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGNoYXIgKgorX19OVEggKHN0cm5jcHkgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMsCisJCXNpemVfdCBfX2xlbikpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19zdHJuY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19sZW4sIF9fYm9zIChfX2Rlc3QpKTsKK30KKworLy8gWFhYIFdlIGhhdmUgbm8gY29ycmVzcG9uZGluZyBidWlsdGluIHlldC4KK2V4dGVybiBjaGFyICpfX3N0cG5jcHlfY2hrIChjaGFyICpfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19zcmMsIHNpemVfdCBfX24sCisJCQkgICAgc2l6ZV90IF9fZGVzdGxlbikgX19USFJPVzsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUX05USCAoX19zdHBuY3B5X2FsaWFzLCAoY2hhciAqX19kZXN0LAorCQkJCQkgICAgICAgX19jb25zdCBjaGFyICpfX3NyYywKKwkJCQkJICAgICAgIHNpemVfdCBfX24pLCBzdHBuY3B5KTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBjaGFyICoKK19fTlRIIChzdHBuY3B5IChjaGFyICpfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19zcmMsIHNpemVfdCBfX24pKQoreworICBpZiAoX19ib3MgKF9fZGVzdCkgIT0gKHNpemVfdCkgLTEKKyAgICAgICYmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbikgfHwgX19uIDw9IF9fYm9zIChfX2Rlc3QpKSkKKyAgICByZXR1cm4gX19zdHBuY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19uLCBfX2JvcyAoX19kZXN0KSk7CisgIHJldHVybiBfX3N0cG5jcHlfYWxpYXMgKF9fZGVzdCwgX19zcmMsIF9fbik7Cit9CisKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBjaGFyICoKK19fTlRIIChzdHJjYXQgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMpKQoreworICByZXR1cm4gX19idWlsdGluX19fc3RyY2F0X2NoayAoX19kZXN0LCBfX3NyYywgX19ib3MgKF9fZGVzdCkpOworfQorCisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgY2hhciAqCitfX05USCAoc3RybmNhdCAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywKKwkJc2l6ZV90IF9fbGVuKSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX3N0cm5jYXRfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2xlbiwgX19ib3MgKF9fZGVzdCkpOworfQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N0cm9wdHMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdHJvcHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlMmMyYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zdHJvcHRzLmgKQEAgLTAsMCArMSwyMzEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1RST1BUU19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3N0cm9wdHMuaD4gZGlyZWN0bHk7IHVzZSA8c3Ryb3B0cy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9CSVRTX1NUUk9QVFNfSAorI2RlZmluZSBfQklUU19TVFJPUFRTX0gJMQorCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisvKiBNYWNyb3MgdXNlZCBhcyBgcmVxdWVzdCcgYXJndW1lbnQgdG8gYGlvY3RsJy4gICovCisjZGVmaW5lIF9fU0lECQkoJ1MnIDw8IDgpCisKKyNkZWZpbmUgSV9OUkVBRAkgICAgKF9fU0lEIHwgMSkJLyogQ291bnRzIHRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyBpbiB0aGUgZGF0YQorCQkJCSAgIGJsb2NrIGluIHRoZSBmaXJzdCBtZXNzYWdlLiAgKi8KKyNkZWZpbmUgSV9QVVNICSAgICAoX19TSUQgfCAyKQkvKiBQdXNoIFNUUkVBTVMgbW9kdWxlIG9udG8gdG9wIG9mIHRoZSBjdXJyZW50CisJCQkJICAgU1RSRUFNLCBqdXN0IGJlbG93IHRoZSBTVFJFQU0gaGVhZC4gICovCisjZGVmaW5lIElfUE9QCSAgICAoX19TSUQgfCAzKQkvKiBSZW1vdmUgU1RSRUFNUyBtb2R1bGUgZnJvbSBqdXN0IGJlbG93IHRoZQorCQkJCSAgIFNUUkVBTSBoZWFkLiAgKi8KKyNkZWZpbmUgSV9MT09LCSAgICAoX19TSUQgfCA0KQkvKiBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIGp1c3QgYmVsb3cKKwkJCQkgICB0aGUgU1RSRUFNIGhlYWQgYW5kIHBsYWNlIGl0IGluIGEgY2hhcmFjdGVyCisJCQkJICAgc3RyaW5nLiAgKi8KKyNkZWZpbmUgSV9GTFVTSAkgICAgKF9fU0lEIHwgNSkJLyogRmx1c2ggYWxsIGlucHV0IGFuZC9vciBvdXRwdXQuICAqLworI2RlZmluZSBJX1NSRE9QVCAgICAoX19TSUQgfCA2KQkvKiBTZXRzIHRoZSByZWFkIG1vZGUuICAqLworI2RlZmluZSBJX0dSRE9QVCAgICAoX19TSUQgfCA3KQkvKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJlYWQgbW9kZSBzZXR0aW5nLiAgKi8KKyNkZWZpbmUgSV9TVFIJICAgIChfX1NJRCB8IDgpCS8qIENvbnN0cnVjdCBhbiBpbnRlcm5hbCBTVFJFQU1TIGBpb2N0bCcKKwkJCQkgICBtZXNzYWdlIGFuZCBzZW5kIHRoYXQgbWVzc2FnZSBkb3duc3RyZWFtLiAqLworI2RlZmluZSBJX1NFVFNJRyAgICAoX19TSUQgfCA5KQkvKiBJbmZvcm0gdGhlIFNUUkVBTSBoZWFkIHRoYXQgdGhlIHByb2Nlc3MKKwkJCQkgICB3YW50cyB0aGUgU0lHUE9MTCBzaWduYWwgaXNzdWVkLiAgKi8KKyNkZWZpbmUgSV9HRVRTSUcgICAgKF9fU0lEIHwxMCkgLyogUmV0dXJuIHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZSBjYWxsaW5nCisJCQkJICAgcHJvY2VzcyBpcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCB0byBiZSBzZW50CisJCQkJICAgYSBTSUdQT0xMIHNpZ25hbC4gICovCisjZGVmaW5lIElfRklORAkgICAgKF9fU0lEIHwxMSkgLyogQ29tcGFyZXMgdGhlIG5hbWVzIG9mIGFsbCBtb2R1bGVzIGN1cnJlbnRseQorCQkJCSAgIHByZXNlbnQgaW4gdGhlIFNUUkVBTSB0byB0aGUgbmFtZSBwb2ludGVkIHRvCisJCQkJICAgYnkgYGFyZycuICAqLworI2RlZmluZSBJX0xJTksJICAgIChfX1NJRCB8MTIpIC8qIENvbm5lY3QgdHdvIFNUUkVBTXMuICAqLworI2RlZmluZSBJX1VOTElOSyAgICAoX19TSUQgfDEzKSAvKiBEaXNjb25uZWN0cyB0aGUgdHdvIFNUUkVBTXMuICAqLworI2RlZmluZSBJX1BFRUsJICAgIChfX1NJRCB8MTUpIC8qIEFsbG93cyBhIHByb2Nlc3MgdG8gcmV0cmlldmUgdGhlIGluZm9ybWF0aW9uCisJCQkJICAgaW4gdGhlIGZpcnN0IG1lc3NhZ2Ugb24gdGhlIFNUUkVBTSBoZWFkIHJlYWQKKwkJCQkgICBxdWV1ZSB3aXRob3V0IHRha2luZyB0aGUgbWVzc2FnZSBvZmYgdGhlCisJCQkJICAgcXVldWUuICAqLworI2RlZmluZSBJX0ZESU5TRVJUICAoX19TSUQgfDE2KSAvKiBDcmVhdGUgYSBtZXNzYWdlIGZyb20gdGhlIHNwZWNpZmllZAorCQkJCSAgIGJ1ZmZlcihzKSwgYWRkcyBpbmZvcm1hdGlvbiBhYm91dCBhbm90aGVyCisJCQkJICAgU1RSRUFNLCBhbmQgc2VuZCB0aGUgbWVzc2FnZSBkb3duc3RyZWFtLiAgKi8KKyNkZWZpbmUgSV9TRU5ERkQgICAgKF9fU0lEIHwxNykgLyogUmVxdWVzdHMgdGhlIFNUUkVBTSBhc3NvY2lhdGVkIHdpdGggYGZpbGRlcycKKwkJCQkgICB0byBzZW5kIGEgbWVzc2FnZSwgY29udGFpbmluZyBhIGZpbGUKKwkJCQkgICBwb2ludGVyLCB0byB0aGUgU1RSRUFNIGhlYWQgYXQgdGhlIG90aGVyIGVuZAorCQkJCSAgIG9mIGEgU1RSRUFNUyBwaXBlLiAgKi8KKyNkZWZpbmUgSV9SRUNWRkQgICAgKF9fU0lEIHwxNCkgLyogTm9uLUVGVCBkZWZpbml0aW9uLiAgKi8KKyNkZWZpbmUgSV9TV1JPUFQgICAgKF9fU0lEIHwxOSkgLyogU2V0IHRoZSB3cml0ZSBtb2RlLiAgKi8KKyNkZWZpbmUgSV9HV1JPUFQgICAgKF9fU0lEIHwyMCkgLyogUmV0dXJuIHRoZSBjdXJyZW50IHdyaXRlIG1vZGUgc2V0dGluZy4gICovCisjZGVmaW5lIElfTElTVAkgICAgKF9fU0lEIHwyMSkgLyogTGlzdCBhbGwgdGhlIG1vZHVsZSBuYW1lcyBvbiB0aGUgU1RSRUFNLCB1cAorCQkJCSAgIHRvIGFuZCBpbmNsdWRpbmcgdGhlIHRvcG1vc3QgZHJpdmVyIG5hbWUuICovCisjZGVmaW5lIElfUExJTksJICAgIChfX1NJRCB8MjIpIC8qIENvbm5lY3QgdHdvIFNUUkVBTXMgd2l0aCBhIHBlcnNpc3RlbnQKKwkJCQkgICBsaW5rLiAgKi8KKyNkZWZpbmUgSV9QVU5MSU5LICAgKF9fU0lEIHwyMykgLyogRGlzY29ubmVjdCB0aGUgdHdvIFNUUkVBTXMgdGhhdCB3ZXJlCisJCQkJICAgY29ubmVjdGVkIHdpdGggYSBwZXJzaXN0ZW50IGxpbmsuICAqLworI2RlZmluZSBJX0ZMVVNIQkFORCAoX19TSUQgfDI4KSAvKiBGbHVzaCBvbmx5IGJhbmQgc3BlY2lmaWVkLiAgKi8KKyNkZWZpbmUgSV9DS0JBTkQgICAgKF9fU0lEIHwyOSkgLyogQ2hlY2sgaWYgdGhlIG1lc3NhZ2Ugb2YgYSBnaXZlbiBwcmlvcml0eQorCQkJCSAgIGJhbmQgZXhpc3RzIG9uIHRoZSBTVFJFQU0gaGVhZCByZWFkCisJCQkJICAgcXVldWUuICAqLworI2RlZmluZSBJX0dFVEJBTkQgICAoX19TSUQgfDMwKSAvKiBSZXR1cm4gdGhlIHByaW9yaXR5IGJhbmQgb2YgdGhlIGZpcnN0CisJCQkJICAgbWVzc2FnZSBvbiB0aGUgU1RSRUFNIGhlYWQgcmVhZCBxdWV1ZS4gICovCisjZGVmaW5lIElfQVRNQVJLICAgIChfX1NJRCB8MzEpIC8qIFNlZSBpZiB0aGUgY3VycmVudCBtZXNzYWdlIG9uIHRoZSBTVFJFQU0KKwkJCQkgICBoZWFkIHJlYWQgcXVldWUgaXMgIm1hcmtlZCIgYnkgc29tZSBtb2R1bGUKKwkJCQkgICBkb3duc3RyZWFtLiAgKi8KKyNkZWZpbmUgSV9TRVRDTFRJTUUgKF9fU0lEIHwzMikgLyogU2V0IHRoZSB0aW1lIHRoZSBTVFJFQU0gaGVhZCB3aWxsIGRlbGF5IHdoZW4KKwkJCQkgICBhIFNUUkVBTSBpcyBjbG9zaW5nIGFuZCB0aGVyZSBpcyBkYXRhIG9uCisJCQkJICAgdGhlIHdyaXRlIHF1ZXVlcy4gICovCisjZGVmaW5lIElfR0VUQ0xUSU1FIChfX1NJRCB8MzMpIC8qIEdldCBjdXJyZW50IHZhbHVlIGZvciBjbG9zaW5nIHRpbWVvdXQuICAqLworI2RlZmluZSBJX0NBTlBVVCAgICAoX19TSUQgfDM0KSAvKiBDaGVjayBpZiBhIGNlcnRhaW4gYmFuZCBpcyB3cml0YWJsZS4gICovCisKKworLyogVXNlZCBpbiBgSV9MT09LJyByZXF1ZXN0LiAgKi8KKyNkZWZpbmUgRk1OQU1FU1oJOAkvKiBjb21wYXRpYmlsaXR5IHcvVW5peFdhcmUvU29sYXJpcy4gICovCisKKy8qIEZsdXNoIG9wdGlvbnMuICAqLworI2RlZmluZSBGTFVTSFIJCTB4MDEJLyogRmx1c2ggcmVhZCBxdWV1ZXMuICAqLworI2RlZmluZSBGTFVTSFcJCTB4MDIJLyogRmx1c2ggd3JpdGUgcXVldWVzLiAgKi8KKyNkZWZpbmUgRkxVU0hSVwkJMHgwMwkvKiBGbHVzaCByZWFkIGFuZCB3cml0ZSBxdWV1ZXMuICAqLworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgRkxVU0hCQU5ECTB4MDQJLyogRmx1c2ggb25seSBzcGVjaWZpZWQgYmFuZC4gICovCisjZW5kaWYKKworLyogUG9zc2libGUgYXJndW1lbnRzIGZvciBgSV9TRVRTSUcnLiAgKi8KKyNkZWZpbmUgU19JTlBVVAkJMHgwMDAxCS8qIEEgbWVzc2FnZSwgb3RoZXIgdGhhbiBhIGhpZ2gtcHJpb3JpdHkKKwkJCQkgICBtZXNzYWdlLCBoYXMgYXJyaXZlZC4gICovCisjZGVmaW5lIFNfSElQUkkJCTB4MDAwMgkvKiBBIGhpZ2gtcHJpb3JpdHkgbWVzc2FnZSBpcyBwcmVzZW50LiAgKi8KKyNkZWZpbmUgU19PVVRQVVQJMHgwMDA0CS8qIFRoZSB3cml0ZSBxdWV1ZSBmb3Igbm9ybWFsIGRhdGEgaXMgbm8gbG9uZ2VyCisJCQkJICAgZnVsbC4gICovCisjZGVmaW5lIFNfTVNHCQkweDAwMDgJLyogQSBTVFJFQU1TIHNpZ25hbCBtZXNzYWdlIHRoYXQgY29udGFpbnMgdGhlCisJCQkJICAgU0lHUE9MTCBzaWduYWwgcmVhY2hlcyB0aGUgZnJvbnQgb2YgdGhlCisJCQkJICAgU1RSRUFNIGhlYWQgcmVhZCBxdWV1ZS4gICovCisjZGVmaW5lIFNfRVJST1IJCTB4MDAxMAkvKiBOb3RpZmljYXRpb24gb2YgYW4gZXJyb3IgY29uZGl0aW9uLiAgKi8KKyNkZWZpbmUgU19IQU5HVVAJMHgwMDIwCS8qIE5vdGlmaWNhdGlvbiBvZiBhIGhhbmd1cC4gICovCisjZGVmaW5lIFNfUkROT1JNCTB4MDA0MAkvKiBBIG5vcm1hbCBtZXNzYWdlIGhhcyBhcnJpdmVkLiAgKi8KKyNkZWZpbmUgU19XUk5PUk0JU19PVVRQVVQKKyNkZWZpbmUgU19SREJBTkQJMHgwMDgwCS8qIEEgbWVzc2FnZSB3aXRoIGEgbm9uLXplcm8gcHJpb3JpdHkgaGFzCisJCQkJICAgYXJyaXZlZC4gICovCisjZGVmaW5lIFNfV1JCQU5ECTB4MDEwMAkvKiBUaGUgd3JpdGUgcXVldWUgZm9yIGEgbm9uLXplcm8gcHJpb3JpdHkKKwkJCQkgICBiYW5kIGlzIG5vIGxvbmdlciBmdWxsLiAgKi8KKyNkZWZpbmUgU19CQU5EVVJHCTB4MDIwMAkvKiBXaGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTX1JEQkFORCwKKwkJCQkgICBTSUdVUkcgaXMgZ2VuZXJhdGVkIGluc3RlYWQgb2YgU0lHUE9MTCB3aGVuCisJCQkJICAgYSBwcmlvcml0eSBtZXNzYWdlIHJlYWNoZXMgdGhlIGZyb250IG9mIHRoZQorCQkJCSAgIFNUUkVBTSBoZWFkIHJlYWQgcXVldWUuICAqLworCisvKiBPcHRpb24gZm9yIGBJX1BFRUsnLiAgKi8KKyNkZWZpbmUgUlNfSElQUkkJMHgwMQkvKiBPbmx5IGxvb2sgZm9yIGhpZ2gtcHJpb3JpdHkgbWVzc2FnZXMuICAqLworCisvKiBPcHRpb25zIGZvciBgSV9TUkRPUFQnLiAgKi8KKyNkZWZpbmUgUk5PUk0JCTB4MDAwMAkvKiBCeXRlLVNUUkVBTSBtb2RlLCB0aGUgZGVmYXVsdC4gICovCisjZGVmaW5lIFJNU0dECQkweDAwMDEJLyogTWVzc2FnZS1kaXNjYXJkIG1vZGUuICAgKi8KKyNkZWZpbmUgUk1TR04JCTB4MDAwMgkvKiBNZXNzYWdlLW5vbmRpc2NhcmQgbW9kZS4gICAqLworI2RlZmluZSBSUFJPVERBVAkweDAwMDQJLyogRGVsaXZlciB0aGUgY29udHJvbCBwYXJ0IG9mIGEgbWVzc2FnZSBhcworCQkJCSAgIGRhdGEuICAqLworI2RlZmluZSBSUFJPVERJUwkweDAwMDgJLyogRGlzY2FyZCB0aGUgY29udHJvbCBwYXJ0IG9mIGEgbWVzc2FnZSwKKwkJCQkgICBkZWxpdmVyaW5nIGFueSBkYXRhIHBhcnQuICAqLworI2RlZmluZSBSUFJPVE5PUk0JMHgwMDEwCS8qIEZhaWwgYHJlYWQnIHdpdGggRUJBRE1TRyBpZiBhIG1lc3NhZ2UKKwkJCQkgICBjb250YWluaW5nIGEgY29udHJvbCBwYXJ0IGlzIGF0IHRoZSBmcm9udAorCQkJCSAgIG9mIHRoZSBTVFJFQU0gaGVhZCByZWFkIHF1ZXVlLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIFJQUk9UTUFTSwkweDAwMUMJLyogVGhlIFJQUk9UIGJpdHMgKi8KKyNlbmRpZgorCisvKiBQb3NzaWJsZSBtb2RlIGZvciBgSV9TV1JPUFQnLiAgKi8KKyNkZWZpbmUgU05EWkVSTwkJMHgwMDEJLyogU2VuZCBhIHplcm8tbGVuZ3RoIG1lc3NhZ2UgZG93bnN0cmVhbSB3aGVuIGEKKwkJCQkgICBgd3JpdGUnIG9mIDAgYnl0ZXMgb2NjdXJzLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIFNORFBJUEUJMHgwMDIJLyogU2VuZCBTSUdQSVBFIG9uIHdyaXRlIGFuZCBwdXRtc2cgaWYKKwkJCQkgICBzZF93ZXJyb3IgaXMgc2V0LiAgKi8KKyNlbmRpZgorCisvKiBBcmd1bWVudHMgZm9yIGBJX0FUTUFSSycuICAqLworI2RlZmluZSBBTllNQVJLCQkweDAxCS8qIENoZWNrIGlmIHRoZSBtZXNzYWdlIGlzIG1hcmtlZC4gICovCisjZGVmaW5lIExBU1RNQVJLCTB4MDIJLyogQ2hlY2sgaWYgdGhlIG1lc3NhZ2UgaXMgdGhlIGxhc3Qgb25lIG1hcmtlZAorCQkJCSAgIG9uIHRoZSBxdWV1ZS4gICovCisKKy8qIEFyZ3VtZW50IGZvciBgSV9VTkxJTksnLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIE1VWElEX0FMTAkoLTEpCS8qIFVubGluayBhbGwgU1RSRUFNcyBsaW5rZWQgdG8gdGhlIFNUUkVBTQorCQkJCSAgIGFzc29jaWF0ZWQgd2l0aCBgZmlsZGVzJy4gICovCisjZW5kaWYKKworCisvKiBNYWNyb3MgZm9yIGBnZXRtc2cnLCBgZ2V0cG1zZycsIGBwdXRtc2cnIGFuZCBgcHV0cG1zZycuICAqLworI2RlZmluZSBNU0dfSElQUkkJMHgwMQkvKiBTZW5kL3JlY2VpdmUgaGlnaCBwcmlvcml0eSBtZXNzYWdlLiAgKi8KKyNkZWZpbmUgTVNHX0FOWQkJMHgwMgkvKiBSZWNlaXZlIGFueSBtZXNzYWdlLiAgKi8KKyNkZWZpbmUgTVNHX0JBTkQJMHgwNAkvKiBSZWNlaXZlIG1lc3NhZ2UgZnJvbSBzcGVjaWZpZWQgYmFuZC4gICovCisKKy8qIFZhbHVlcyByZXR1cm5lZCBieSBnZXRtc2cgYW5kIGdldHBtc2cgKi8KKyNkZWZpbmUgTU9SRUNUTAkJMQkvKiBNb3JlIGNvbnRyb2wgaW5mb3JtYXRpb24gaXMgbGVmdCBpbgorCQkJCSAgIG1lc3NhZ2UuICAqLworI2RlZmluZSBNT1JFREFUQQkyCS8qIE1vcmUgZGF0YSBpcyBsZWZ0IGluIG1lc3NhZ2UuICAqLworCisKKy8qIFN0cnVjdHVyZSB1c2VkIGZvciB0aGUgSV9GTFVTSEJBTkQgaW9jdGwgb24gc3RyZWFtcy4gICovCitzdHJ1Y3QgYmFuZGluZm8KKyAgeworICAgIHVuc2lnbmVkIGNoYXIgYmlfcHJpOworICAgIGludCBiaV9mbGFnOworICB9OworCitzdHJ1Y3Qgc3RyYnVmCisgIHsKKyAgICBpbnQgbWF4bGVuOwkJLyogTWF4aW11bSBidWZmZXIgbGVuZ3RoLiAgKi8KKyAgICBpbnQgbGVuOwkJLyogTGVuZ3RoIG9mIGRhdGEuICAqLworICAgIGNoYXIgKmJ1ZjsJCS8qIFBvaW50ZXIgdG8gYnVmZmVyLiAgKi8KKyAgfTsKKworc3RydWN0IHN0cnBlZWsKKyAgeworICAgIHN0cnVjdCBzdHJidWYgY3RsYnVmOworICAgIHN0cnVjdCBzdHJidWYgZGF0YWJ1ZjsKKyAgICB0X3VzY2FsYXJfdCBmbGFnczsJCQkvKiBVbml4V2FyZS9Tb2xhcmlzIGNvbXBhdGliaWxpdHkuICAqLworICB9OworCitzdHJ1Y3Qgc3RyZmRpbnNlcnQKKyAgeworICAgIHN0cnVjdCBzdHJidWYgY3RsYnVmOworICAgIHN0cnVjdCBzdHJidWYgZGF0YWJ1ZjsKKyAgICB0X3VzY2FsYXJfdCBmbGFnczsJCQkvKiBVbml4V2FyZS9Tb2xhcmlzIGNvbXBhdGliaWxpdHkuICAqLworICAgIGludCBmaWxkZXM7CisgICAgaW50IG9mZnNldDsKKyAgfTsKKworc3RydWN0IHN0cmlvY3RsCisgIHsKKyAgICBpbnQgaWNfY21kOworICAgIGludCBpY190aW1vdXQ7CisgICAgaW50IGljX2xlbjsKKyAgICBjaGFyICppY19kcDsKKyAgfTsKKworc3RydWN0IHN0cnJlY3ZmZAorICB7CisgICAgaW50IGZkOworICAgIHVpZF90IHVpZDsKKyAgICBnaWRfdCBnaWQ7CisgICAgY2hhciBfX2ZpbGxbOF07CQkJLyogVW5peFdhcmUvU29sYXJpcyBjb21wYXRpYmlsaXR5ICovCisgIH07CisKKworc3RydWN0IHN0cl9tbGlzdAorICB7CisgICAgY2hhciBsX25hbWVbRk1OQU1FU1ogKyAxXTsKKyAgfTsKKworc3RydWN0IHN0cl9saXN0CisgIHsKKyAgICBpbnQgc2xfbm1vZHM7CisgICAgc3RydWN0IHN0cl9tbGlzdCAqc2xfbW9kbGlzdDsKKyAgfTsKKworI2VuZGlmIC8qIGJpdHMvc3Ryb3B0cy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3lzX2Vycmxpc3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zeXNfZXJybGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTU2ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3lzX2Vycmxpc3QuaApAQCAtMCwwICsxLDMzIEBACisvKiBEZWNsYXJlIHN5c19lcnJsaXN0IGFuZCBzeXNfbmVyciwgb3IgZG9uJ3QuICBDb21wYXRpYmlsaXR5IChkbykgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1RESU9fSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zeXNfZXJybGlzdC5oPiBkaXJlY3RseTsgdXNlIDxzdGRpby5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBzeXNfZXJybGlzdCBhbmQgc3lzX25lcnIgYXJlIGRlcHJlY2F0ZWQuICBVc2Ugc3RyZXJyb3IgaW5zdGVhZC4gICovCisKKyNpZmRlZiAgX19VU0VfQlNECitleHRlcm4gaW50IHN5c19uZXJyOworZXh0ZXJuIF9fY29uc3QgY2hhciAqX19jb25zdCBzeXNfZXJybGlzdFtdOworI2VuZGlmCisjaWZkZWYgIF9fVVNFX0dOVQorZXh0ZXJuIGludCBfc3lzX25lcnI7CitleHRlcm4gX19jb25zdCBjaGFyICpfX2NvbnN0IF9zeXNfZXJybGlzdFtdOworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3lzY2FsbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N5c2NhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2UyMTI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N5c2NhbGwuaApAQCAtMCwwICsxLDM1NCBAQAorLyogR2VuZXJhdGVkIGF0IGxpYmMgYnVpbGQgdGltZSBmcm9tIGtlcm5lbCBzeXNjYWxsIGxpc3QuICAqLworCisjaWZuZGVmIF9TWVNDQUxMX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9zeXNjYWxsLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjZGVmaW5lIFNZU19fbGxzZWVrIF9fTlJfX2xsc2VlaworI2RlZmluZSBTWVNfX25ld3NlbGVjdCBfX05SX19uZXdzZWxlY3QKKyNkZWZpbmUgU1lTX19zeXNjdGwgX19OUl9fc3lzY3RsCisjZGVmaW5lIFNZU19hY2Nlc3MgX19OUl9hY2Nlc3MKKyNkZWZpbmUgU1lTX2FjY3QgX19OUl9hY2N0CisjZGVmaW5lIFNZU19hZGRfa2V5IF9fTlJfYWRkX2tleQorI2RlZmluZSBTWVNfYWRqdGltZXggX19OUl9hZGp0aW1leAorI2RlZmluZSBTWVNfYWZzX3N5c2NhbGwgX19OUl9hZnNfc3lzY2FsbAorI2RlZmluZSBTWVNfYWxhcm0gX19OUl9hbGFybQorI2RlZmluZSBTWVNfYmRmbHVzaCBfX05SX2JkZmx1c2gKKyNkZWZpbmUgU1lTX2JyZWFrIF9fTlJfYnJlYWsKKyNkZWZpbmUgU1lTX2JyayBfX05SX2JyaworI2RlZmluZSBTWVNfY2FwZ2V0IF9fTlJfY2FwZ2V0CisjZGVmaW5lIFNZU19jYXBzZXQgX19OUl9jYXBzZXQKKyNkZWZpbmUgU1lTX2NoZGlyIF9fTlJfY2hkaXIKKyNkZWZpbmUgU1lTX2NobW9kIF9fTlJfY2htb2QKKyNkZWZpbmUgU1lTX2Nob3duIF9fTlJfY2hvd24KKyNkZWZpbmUgU1lTX2Nob3duMzIgX19OUl9jaG93bjMyCisjZGVmaW5lIFNZU19jaHJvb3QgX19OUl9jaHJvb3QKKyNkZWZpbmUgU1lTX2Nsb2NrX2FkanRpbWUgX19OUl9jbG9ja19hZGp0aW1lCisjZGVmaW5lIFNZU19jbG9ja19nZXRyZXMgX19OUl9jbG9ja19nZXRyZXMKKyNkZWZpbmUgU1lTX2Nsb2NrX2dldHRpbWUgX19OUl9jbG9ja19nZXR0aW1lCisjZGVmaW5lIFNZU19jbG9ja19uYW5vc2xlZXAgX19OUl9jbG9ja19uYW5vc2xlZXAKKyNkZWZpbmUgU1lTX2Nsb2NrX3NldHRpbWUgX19OUl9jbG9ja19zZXR0aW1lCisjZGVmaW5lIFNZU19jbG9uZSBfX05SX2Nsb25lCisjZGVmaW5lIFNZU19jbG9zZSBfX05SX2Nsb3NlCisjZGVmaW5lIFNZU19jcmVhdCBfX05SX2NyZWF0CisjZGVmaW5lIFNZU19jcmVhdGVfbW9kdWxlIF9fTlJfY3JlYXRlX21vZHVsZQorI2RlZmluZSBTWVNfZGVsZXRlX21vZHVsZSBfX05SX2RlbGV0ZV9tb2R1bGUKKyNkZWZpbmUgU1lTX2R1cCBfX05SX2R1cAorI2RlZmluZSBTWVNfZHVwMiBfX05SX2R1cDIKKyNkZWZpbmUgU1lTX2R1cDMgX19OUl9kdXAzCisjZGVmaW5lIFNZU19lcG9sbF9jcmVhdGUgX19OUl9lcG9sbF9jcmVhdGUKKyNkZWZpbmUgU1lTX2Vwb2xsX2NyZWF0ZTEgX19OUl9lcG9sbF9jcmVhdGUxCisjZGVmaW5lIFNZU19lcG9sbF9jdGwgX19OUl9lcG9sbF9jdGwKKyNkZWZpbmUgU1lTX2Vwb2xsX3B3YWl0IF9fTlJfZXBvbGxfcHdhaXQKKyNkZWZpbmUgU1lTX2Vwb2xsX3dhaXQgX19OUl9lcG9sbF93YWl0CisjZGVmaW5lIFNZU19ldmVudGZkIF9fTlJfZXZlbnRmZAorI2RlZmluZSBTWVNfZXZlbnRmZDIgX19OUl9ldmVudGZkMgorI2RlZmluZSBTWVNfZXhlY3ZlIF9fTlJfZXhlY3ZlCisjZGVmaW5lIFNZU19leGl0IF9fTlJfZXhpdAorI2RlZmluZSBTWVNfZXhpdF9ncm91cCBfX05SX2V4aXRfZ3JvdXAKKyNkZWZpbmUgU1lTX2ZhY2Nlc3NhdCBfX05SX2ZhY2Nlc3NhdAorI2RlZmluZSBTWVNfZmFkdmlzZTY0IF9fTlJfZmFkdmlzZTY0CisjZGVmaW5lIFNZU19mYWR2aXNlNjRfNjQgX19OUl9mYWR2aXNlNjRfNjQKKyNkZWZpbmUgU1lTX2ZhbGxvY2F0ZSBfX05SX2ZhbGxvY2F0ZQorI2RlZmluZSBTWVNfZmFub3RpZnlfaW5pdCBfX05SX2Zhbm90aWZ5X2luaXQKKyNkZWZpbmUgU1lTX2Zhbm90aWZ5X21hcmsgX19OUl9mYW5vdGlmeV9tYXJrCisjZGVmaW5lIFNZU19mY2hkaXIgX19OUl9mY2hkaXIKKyNkZWZpbmUgU1lTX2ZjaG1vZCBfX05SX2ZjaG1vZAorI2RlZmluZSBTWVNfZmNobW9kYXQgX19OUl9mY2htb2RhdAorI2RlZmluZSBTWVNfZmNob3duIF9fTlJfZmNob3duCisjZGVmaW5lIFNZU19mY2hvd24zMiBfX05SX2ZjaG93bjMyCisjZGVmaW5lIFNZU19mY2hvd25hdCBfX05SX2ZjaG93bmF0CisjZGVmaW5lIFNZU19mY250bCBfX05SX2ZjbnRsCisjZGVmaW5lIFNZU19mY250bDY0IF9fTlJfZmNudGw2NAorI2RlZmluZSBTWVNfZmRhdGFzeW5jIF9fTlJfZmRhdGFzeW5jCisjZGVmaW5lIFNZU19mZ2V0eGF0dHIgX19OUl9mZ2V0eGF0dHIKKyNkZWZpbmUgU1lTX2ZsaXN0eGF0dHIgX19OUl9mbGlzdHhhdHRyCisjZGVmaW5lIFNZU19mbG9jayBfX05SX2Zsb2NrCisjZGVmaW5lIFNZU19mb3JrIF9fTlJfZm9yaworI2RlZmluZSBTWVNfZnJlbW92ZXhhdHRyIF9fTlJfZnJlbW92ZXhhdHRyCisjZGVmaW5lIFNZU19mc2V0eGF0dHIgX19OUl9mc2V0eGF0dHIKKyNkZWZpbmUgU1lTX2ZzdGF0IF9fTlJfZnN0YXQKKyNkZWZpbmUgU1lTX2ZzdGF0NjQgX19OUl9mc3RhdDY0CisjZGVmaW5lIFNZU19mc3RhdGF0NjQgX19OUl9mc3RhdGF0NjQKKyNkZWZpbmUgU1lTX2ZzdGF0ZnMgX19OUl9mc3RhdGZzCisjZGVmaW5lIFNZU19mc3RhdGZzNjQgX19OUl9mc3RhdGZzNjQKKyNkZWZpbmUgU1lTX2ZzeW5jIF9fTlJfZnN5bmMKKyNkZWZpbmUgU1lTX2Z0aW1lIF9fTlJfZnRpbWUKKyNkZWZpbmUgU1lTX2Z0cnVuY2F0ZSBfX05SX2Z0cnVuY2F0ZQorI2RlZmluZSBTWVNfZnRydW5jYXRlNjQgX19OUl9mdHJ1bmNhdGU2NAorI2RlZmluZSBTWVNfZnV0ZXggX19OUl9mdXRleAorI2RlZmluZSBTWVNfZnV0aW1lc2F0IF9fTlJfZnV0aW1lc2F0CisjZGVmaW5lIFNZU19nZXRfa2VybmVsX3N5bXMgX19OUl9nZXRfa2VybmVsX3N5bXMKKyNkZWZpbmUgU1lTX2dldF9tZW1wb2xpY3kgX19OUl9nZXRfbWVtcG9saWN5CisjZGVmaW5lIFNZU19nZXRfcm9idXN0X2xpc3QgX19OUl9nZXRfcm9idXN0X2xpc3QKKyNkZWZpbmUgU1lTX2dldF90aHJlYWRfYXJlYSBfX05SX2dldF90aHJlYWRfYXJlYQorI2RlZmluZSBTWVNfZ2V0Y3B1IF9fTlJfZ2V0Y3B1CisjZGVmaW5lIFNZU19nZXRjd2QgX19OUl9nZXRjd2QKKyNkZWZpbmUgU1lTX2dldGRlbnRzIF9fTlJfZ2V0ZGVudHMKKyNkZWZpbmUgU1lTX2dldGRlbnRzNjQgX19OUl9nZXRkZW50czY0CisjZGVmaW5lIFNZU19nZXRlZ2lkIF9fTlJfZ2V0ZWdpZAorI2RlZmluZSBTWVNfZ2V0ZWdpZDMyIF9fTlJfZ2V0ZWdpZDMyCisjZGVmaW5lIFNZU19nZXRldWlkIF9fTlJfZ2V0ZXVpZAorI2RlZmluZSBTWVNfZ2V0ZXVpZDMyIF9fTlJfZ2V0ZXVpZDMyCisjZGVmaW5lIFNZU19nZXRnaWQgX19OUl9nZXRnaWQKKyNkZWZpbmUgU1lTX2dldGdpZDMyIF9fTlJfZ2V0Z2lkMzIKKyNkZWZpbmUgU1lTX2dldGdyb3VwcyBfX05SX2dldGdyb3VwcworI2RlZmluZSBTWVNfZ2V0Z3JvdXBzMzIgX19OUl9nZXRncm91cHMzMgorI2RlZmluZSBTWVNfZ2V0aXRpbWVyIF9fTlJfZ2V0aXRpbWVyCisjZGVmaW5lIFNZU19nZXRwZ2lkIF9fTlJfZ2V0cGdpZAorI2RlZmluZSBTWVNfZ2V0cGdycCBfX05SX2dldHBncnAKKyNkZWZpbmUgU1lTX2dldHBpZCBfX05SX2dldHBpZAorI2RlZmluZSBTWVNfZ2V0cG1zZyBfX05SX2dldHBtc2cKKyNkZWZpbmUgU1lTX2dldHBwaWQgX19OUl9nZXRwcGlkCisjZGVmaW5lIFNZU19nZXRwcmlvcml0eSBfX05SX2dldHByaW9yaXR5CisjZGVmaW5lIFNZU19nZXRyZXNnaWQgX19OUl9nZXRyZXNnaWQKKyNkZWZpbmUgU1lTX2dldHJlc2dpZDMyIF9fTlJfZ2V0cmVzZ2lkMzIKKyNkZWZpbmUgU1lTX2dldHJlc3VpZCBfX05SX2dldHJlc3VpZAorI2RlZmluZSBTWVNfZ2V0cmVzdWlkMzIgX19OUl9nZXRyZXN1aWQzMgorI2RlZmluZSBTWVNfZ2V0cmxpbWl0IF9fTlJfZ2V0cmxpbWl0CisjZGVmaW5lIFNZU19nZXRydXNhZ2UgX19OUl9nZXRydXNhZ2UKKyNkZWZpbmUgU1lTX2dldHNpZCBfX05SX2dldHNpZAorI2RlZmluZSBTWVNfZ2V0dGlkIF9fTlJfZ2V0dGlkCisjZGVmaW5lIFNZU19nZXR0aW1lb2ZkYXkgX19OUl9nZXR0aW1lb2ZkYXkKKyNkZWZpbmUgU1lTX2dldHVpZCBfX05SX2dldHVpZAorI2RlZmluZSBTWVNfZ2V0dWlkMzIgX19OUl9nZXR1aWQzMgorI2RlZmluZSBTWVNfZ2V0eGF0dHIgX19OUl9nZXR4YXR0cgorI2RlZmluZSBTWVNfZ3R0eSBfX05SX2d0dHkKKyNkZWZpbmUgU1lTX2lkbGUgX19OUl9pZGxlCisjZGVmaW5lIFNZU19pbml0X21vZHVsZSBfX05SX2luaXRfbW9kdWxlCisjZGVmaW5lIFNZU19pbm90aWZ5X2FkZF93YXRjaCBfX05SX2lub3RpZnlfYWRkX3dhdGNoCisjZGVmaW5lIFNZU19pbm90aWZ5X2luaXQgX19OUl9pbm90aWZ5X2luaXQKKyNkZWZpbmUgU1lTX2lub3RpZnlfaW5pdDEgX19OUl9pbm90aWZ5X2luaXQxCisjZGVmaW5lIFNZU19pbm90aWZ5X3JtX3dhdGNoIF9fTlJfaW5vdGlmeV9ybV93YXRjaAorI2RlZmluZSBTWVNfaW9fY2FuY2VsIF9fTlJfaW9fY2FuY2VsCisjZGVmaW5lIFNZU19pb19kZXN0cm95IF9fTlJfaW9fZGVzdHJveQorI2RlZmluZSBTWVNfaW9fZ2V0ZXZlbnRzIF9fTlJfaW9fZ2V0ZXZlbnRzCisjZGVmaW5lIFNZU19pb19zZXR1cCBfX05SX2lvX3NldHVwCisjZGVmaW5lIFNZU19pb19zdWJtaXQgX19OUl9pb19zdWJtaXQKKyNkZWZpbmUgU1lTX2lvY3RsIF9fTlJfaW9jdGwKKyNkZWZpbmUgU1lTX2lvcGVybSBfX05SX2lvcGVybQorI2RlZmluZSBTWVNfaW9wbCBfX05SX2lvcGwKKyNkZWZpbmUgU1lTX2lvcHJpb19nZXQgX19OUl9pb3ByaW9fZ2V0CisjZGVmaW5lIFNZU19pb3ByaW9fc2V0IF9fTlJfaW9wcmlvX3NldAorI2RlZmluZSBTWVNfaXBjIF9fTlJfaXBjCisjZGVmaW5lIFNZU19rZXhlY19sb2FkIF9fTlJfa2V4ZWNfbG9hZAorI2RlZmluZSBTWVNfa2V5Y3RsIF9fTlJfa2V5Y3RsCisjZGVmaW5lIFNZU19raWxsIF9fTlJfa2lsbAorI2RlZmluZSBTWVNfbGNob3duIF9fTlJfbGNob3duCisjZGVmaW5lIFNZU19sY2hvd24zMiBfX05SX2xjaG93bjMyCisjZGVmaW5lIFNZU19sZ2V0eGF0dHIgX19OUl9sZ2V0eGF0dHIKKyNkZWZpbmUgU1lTX2xpbmsgX19OUl9saW5rCisjZGVmaW5lIFNZU19saW5rYXQgX19OUl9saW5rYXQKKyNkZWZpbmUgU1lTX2xpc3R4YXR0ciBfX05SX2xpc3R4YXR0cgorI2RlZmluZSBTWVNfbGxpc3R4YXR0ciBfX05SX2xsaXN0eGF0dHIKKyNkZWZpbmUgU1lTX2xvY2sgX19OUl9sb2NrCisjZGVmaW5lIFNZU19sb29rdXBfZGNvb2tpZSBfX05SX2xvb2t1cF9kY29va2llCisjZGVmaW5lIFNZU19scmVtb3ZleGF0dHIgX19OUl9scmVtb3ZleGF0dHIKKyNkZWZpbmUgU1lTX2xzZWVrIF9fTlJfbHNlZWsKKyNkZWZpbmUgU1lTX2xzZXR4YXR0ciBfX05SX2xzZXR4YXR0cgorI2RlZmluZSBTWVNfbHN0YXQgX19OUl9sc3RhdAorI2RlZmluZSBTWVNfbHN0YXQ2NCBfX05SX2xzdGF0NjQKKyNkZWZpbmUgU1lTX21hZHZpc2UgX19OUl9tYWR2aXNlCisjZGVmaW5lIFNZU19tYWR2aXNlMSBfX05SX21hZHZpc2UxCisjZGVmaW5lIFNZU19tYmluZCBfX05SX21iaW5kCisjZGVmaW5lIFNZU19taWdyYXRlX3BhZ2VzIF9fTlJfbWlncmF0ZV9wYWdlcworI2RlZmluZSBTWVNfbWluY29yZSBfX05SX21pbmNvcmUKKyNkZWZpbmUgU1lTX21rZGlyIF9fTlJfbWtkaXIKKyNkZWZpbmUgU1lTX21rZGlyYXQgX19OUl9ta2RpcmF0CisjZGVmaW5lIFNZU19ta25vZCBfX05SX21rbm9kCisjZGVmaW5lIFNZU19ta25vZGF0IF9fTlJfbWtub2RhdAorI2RlZmluZSBTWVNfbWxvY2sgX19OUl9tbG9jaworI2RlZmluZSBTWVNfbWxvY2thbGwgX19OUl9tbG9ja2FsbAorI2RlZmluZSBTWVNfbW1hcCBfX05SX21tYXAKKyNkZWZpbmUgU1lTX21tYXAyIF9fTlJfbW1hcDIKKyNkZWZpbmUgU1lTX21vZGlmeV9sZHQgX19OUl9tb2RpZnlfbGR0CisjZGVmaW5lIFNZU19tb3VudCBfX05SX21vdW50CisjZGVmaW5lIFNZU19tb3ZlX3BhZ2VzIF9fTlJfbW92ZV9wYWdlcworI2RlZmluZSBTWVNfbXByb3RlY3QgX19OUl9tcHJvdGVjdAorI2RlZmluZSBTWVNfbXB4IF9fTlJfbXB4CisjZGVmaW5lIFNZU19tcV9nZXRzZXRhdHRyIF9fTlJfbXFfZ2V0c2V0YXR0cgorI2RlZmluZSBTWVNfbXFfbm90aWZ5IF9fTlJfbXFfbm90aWZ5CisjZGVmaW5lIFNZU19tcV9vcGVuIF9fTlJfbXFfb3BlbgorI2RlZmluZSBTWVNfbXFfdGltZWRyZWNlaXZlIF9fTlJfbXFfdGltZWRyZWNlaXZlCisjZGVmaW5lIFNZU19tcV90aW1lZHNlbmQgX19OUl9tcV90aW1lZHNlbmQKKyNkZWZpbmUgU1lTX21xX3VubGluayBfX05SX21xX3VubGluaworI2RlZmluZSBTWVNfbXJlbWFwIF9fTlJfbXJlbWFwCisjZGVmaW5lIFNZU19tc3luYyBfX05SX21zeW5jCisjZGVmaW5lIFNZU19tdW5sb2NrIF9fTlJfbXVubG9jaworI2RlZmluZSBTWVNfbXVubG9ja2FsbCBfX05SX211bmxvY2thbGwKKyNkZWZpbmUgU1lTX211bm1hcCBfX05SX211bm1hcAorI2RlZmluZSBTWVNfbmFtZV90b19oYW5kbGVfYXQgX19OUl9uYW1lX3RvX2hhbmRsZV9hdAorI2RlZmluZSBTWVNfbmFub3NsZWVwIF9fTlJfbmFub3NsZWVwCisjZGVmaW5lIFNZU19uZnNzZXJ2Y3RsIF9fTlJfbmZzc2VydmN0bAorI2RlZmluZSBTWVNfbmljZSBfX05SX25pY2UKKyNkZWZpbmUgU1lTX29sZGZzdGF0IF9fTlJfb2xkZnN0YXQKKyNkZWZpbmUgU1lTX29sZGxzdGF0IF9fTlJfb2xkbHN0YXQKKyNkZWZpbmUgU1lTX29sZG9sZHVuYW1lIF9fTlJfb2xkb2xkdW5hbWUKKyNkZWZpbmUgU1lTX29sZHN0YXQgX19OUl9vbGRzdGF0CisjZGVmaW5lIFNZU19vbGR1bmFtZSBfX05SX29sZHVuYW1lCisjZGVmaW5lIFNZU19vcGVuIF9fTlJfb3BlbgorI2RlZmluZSBTWVNfb3Blbl9ieV9oYW5kbGVfYXQgX19OUl9vcGVuX2J5X2hhbmRsZV9hdAorI2RlZmluZSBTWVNfb3BlbmF0IF9fTlJfb3BlbmF0CisjZGVmaW5lIFNZU19wYXVzZSBfX05SX3BhdXNlCisjZGVmaW5lIFNZU19wZXJmX2V2ZW50X29wZW4gX19OUl9wZXJmX2V2ZW50X29wZW4KKyNkZWZpbmUgU1lTX3BlcnNvbmFsaXR5IF9fTlJfcGVyc29uYWxpdHkKKyNkZWZpbmUgU1lTX3BpcGUgX19OUl9waXBlCisjZGVmaW5lIFNZU19waXBlMiBfX05SX3BpcGUyCisjZGVmaW5lIFNZU19waXZvdF9yb290IF9fTlJfcGl2b3Rfcm9vdAorI2RlZmluZSBTWVNfcG9sbCBfX05SX3BvbGwKKyNkZWZpbmUgU1lTX3Bwb2xsIF9fTlJfcHBvbGwKKyNkZWZpbmUgU1lTX3ByY3RsIF9fTlJfcHJjdGwKKyNkZWZpbmUgU1lTX3ByZWFkNjQgX19OUl9wcmVhZDY0CisjZGVmaW5lIFNZU19wcmVhZHYgX19OUl9wcmVhZHYKKyNkZWZpbmUgU1lTX3BybGltaXQ2NCBfX05SX3BybGltaXQ2NAorI2RlZmluZSBTWVNfcHJvY2Vzc192bV9yZWFkdiBfX05SX3Byb2Nlc3Nfdm1fcmVhZHYKKyNkZWZpbmUgU1lTX3Byb2Nlc3Nfdm1fd3JpdGV2IF9fTlJfcHJvY2Vzc192bV93cml0ZXYKKyNkZWZpbmUgU1lTX3Byb2YgX19OUl9wcm9mCisjZGVmaW5lIFNZU19wcm9maWwgX19OUl9wcm9maWwKKyNkZWZpbmUgU1lTX3BzZWxlY3Q2IF9fTlJfcHNlbGVjdDYKKyNkZWZpbmUgU1lTX3B0cmFjZSBfX05SX3B0cmFjZQorI2RlZmluZSBTWVNfcHV0cG1zZyBfX05SX3B1dHBtc2cKKyNkZWZpbmUgU1lTX3B3cml0ZTY0IF9fTlJfcHdyaXRlNjQKKyNkZWZpbmUgU1lTX3B3cml0ZXYgX19OUl9wd3JpdGV2CisjZGVmaW5lIFNZU19xdWVyeV9tb2R1bGUgX19OUl9xdWVyeV9tb2R1bGUKKyNkZWZpbmUgU1lTX3F1b3RhY3RsIF9fTlJfcXVvdGFjdGwKKyNkZWZpbmUgU1lTX3JlYWQgX19OUl9yZWFkCisjZGVmaW5lIFNZU19yZWFkYWhlYWQgX19OUl9yZWFkYWhlYWQKKyNkZWZpbmUgU1lTX3JlYWRkaXIgX19OUl9yZWFkZGlyCisjZGVmaW5lIFNZU19yZWFkbGluayBfX05SX3JlYWRsaW5rCisjZGVmaW5lIFNZU19yZWFkbGlua2F0IF9fTlJfcmVhZGxpbmthdAorI2RlZmluZSBTWVNfcmVhZHYgX19OUl9yZWFkdgorI2RlZmluZSBTWVNfcmVib290IF9fTlJfcmVib290CisjZGVmaW5lIFNZU19yZWN2bW1zZyBfX05SX3JlY3ZtbXNnCisjZGVmaW5lIFNZU19yZW1hcF9maWxlX3BhZ2VzIF9fTlJfcmVtYXBfZmlsZV9wYWdlcworI2RlZmluZSBTWVNfcmVtb3ZleGF0dHIgX19OUl9yZW1vdmV4YXR0cgorI2RlZmluZSBTWVNfcmVuYW1lIF9fTlJfcmVuYW1lCisjZGVmaW5lIFNZU19yZW5hbWVhdCBfX05SX3JlbmFtZWF0CisjZGVmaW5lIFNZU19yZXF1ZXN0X2tleSBfX05SX3JlcXVlc3Rfa2V5CisjZGVmaW5lIFNZU19yZXN0YXJ0X3N5c2NhbGwgX19OUl9yZXN0YXJ0X3N5c2NhbGwKKyNkZWZpbmUgU1lTX3JtZGlyIF9fTlJfcm1kaXIKKyNkZWZpbmUgU1lTX3J0X3NpZ2FjdGlvbiBfX05SX3J0X3NpZ2FjdGlvbgorI2RlZmluZSBTWVNfcnRfc2lncGVuZGluZyBfX05SX3J0X3NpZ3BlbmRpbmcKKyNkZWZpbmUgU1lTX3J0X3NpZ3Byb2NtYXNrIF9fTlJfcnRfc2lncHJvY21hc2sKKyNkZWZpbmUgU1lTX3J0X3NpZ3F1ZXVlaW5mbyBfX05SX3J0X3NpZ3F1ZXVlaW5mbworI2RlZmluZSBTWVNfcnRfc2lncmV0dXJuIF9fTlJfcnRfc2lncmV0dXJuCisjZGVmaW5lIFNZU19ydF9zaWdzdXNwZW5kIF9fTlJfcnRfc2lnc3VzcGVuZAorI2RlZmluZSBTWVNfcnRfc2lndGltZWR3YWl0IF9fTlJfcnRfc2lndGltZWR3YWl0CisjZGVmaW5lIFNZU19ydF90Z3NpZ3F1ZXVlaW5mbyBfX05SX3J0X3Rnc2lncXVldWVpbmZvCisjZGVmaW5lIFNZU19zY2hlZF9nZXRfcHJpb3JpdHlfbWF4IF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21heAorI2RlZmluZSBTWVNfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiBfX05SX3NjaGVkX2dldF9wcmlvcml0eV9taW4KKyNkZWZpbmUgU1lTX3NjaGVkX2dldGFmZmluaXR5IF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkKKyNkZWZpbmUgU1lTX3NjaGVkX2dldHBhcmFtIF9fTlJfc2NoZWRfZ2V0cGFyYW0KKyNkZWZpbmUgU1lTX3NjaGVkX2dldHNjaGVkdWxlciBfX05SX3NjaGVkX2dldHNjaGVkdWxlcgorI2RlZmluZSBTWVNfc2NoZWRfcnJfZ2V0X2ludGVydmFsIF9fTlJfc2NoZWRfcnJfZ2V0X2ludGVydmFsCisjZGVmaW5lIFNZU19zY2hlZF9zZXRhZmZpbml0eSBfX05SX3NjaGVkX3NldGFmZmluaXR5CisjZGVmaW5lIFNZU19zY2hlZF9zZXRwYXJhbSBfX05SX3NjaGVkX3NldHBhcmFtCisjZGVmaW5lIFNZU19zY2hlZF9zZXRzY2hlZHVsZXIgX19OUl9zY2hlZF9zZXRzY2hlZHVsZXIKKyNkZWZpbmUgU1lTX3NjaGVkX3lpZWxkIF9fTlJfc2NoZWRfeWllbGQKKyNkZWZpbmUgU1lTX3NlbGVjdCBfX05SX3NlbGVjdAorI2RlZmluZSBTWVNfc2VuZGZpbGUgX19OUl9zZW5kZmlsZQorI2RlZmluZSBTWVNfc2VuZGZpbGU2NCBfX05SX3NlbmRmaWxlNjQKKyNkZWZpbmUgU1lTX3NlbmRtbXNnIF9fTlJfc2VuZG1tc2cKKyNkZWZpbmUgU1lTX3NldF9tZW1wb2xpY3kgX19OUl9zZXRfbWVtcG9saWN5CisjZGVmaW5lIFNZU19zZXRfcm9idXN0X2xpc3QgX19OUl9zZXRfcm9idXN0X2xpc3QKKyNkZWZpbmUgU1lTX3NldF90aHJlYWRfYXJlYSBfX05SX3NldF90aHJlYWRfYXJlYQorI2RlZmluZSBTWVNfc2V0X3RpZF9hZGRyZXNzIF9fTlJfc2V0X3RpZF9hZGRyZXNzCisjZGVmaW5lIFNZU19zZXRkb21haW5uYW1lIF9fTlJfc2V0ZG9tYWlubmFtZQorI2RlZmluZSBTWVNfc2V0ZnNnaWQgX19OUl9zZXRmc2dpZAorI2RlZmluZSBTWVNfc2V0ZnNnaWQzMiBfX05SX3NldGZzZ2lkMzIKKyNkZWZpbmUgU1lTX3NldGZzdWlkIF9fTlJfc2V0ZnN1aWQKKyNkZWZpbmUgU1lTX3NldGZzdWlkMzIgX19OUl9zZXRmc3VpZDMyCisjZGVmaW5lIFNZU19zZXRnaWQgX19OUl9zZXRnaWQKKyNkZWZpbmUgU1lTX3NldGdpZDMyIF9fTlJfc2V0Z2lkMzIKKyNkZWZpbmUgU1lTX3NldGdyb3VwcyBfX05SX3NldGdyb3VwcworI2RlZmluZSBTWVNfc2V0Z3JvdXBzMzIgX19OUl9zZXRncm91cHMzMgorI2RlZmluZSBTWVNfc2V0aG9zdG5hbWUgX19OUl9zZXRob3N0bmFtZQorI2RlZmluZSBTWVNfc2V0aXRpbWVyIF9fTlJfc2V0aXRpbWVyCisjZGVmaW5lIFNZU19zZXRucyBfX05SX3NldG5zCisjZGVmaW5lIFNZU19zZXRwZ2lkIF9fTlJfc2V0cGdpZAorI2RlZmluZSBTWVNfc2V0cHJpb3JpdHkgX19OUl9zZXRwcmlvcml0eQorI2RlZmluZSBTWVNfc2V0cmVnaWQgX19OUl9zZXRyZWdpZAorI2RlZmluZSBTWVNfc2V0cmVnaWQzMiBfX05SX3NldHJlZ2lkMzIKKyNkZWZpbmUgU1lTX3NldHJlc2dpZCBfX05SX3NldHJlc2dpZAorI2RlZmluZSBTWVNfc2V0cmVzZ2lkMzIgX19OUl9zZXRyZXNnaWQzMgorI2RlZmluZSBTWVNfc2V0cmVzdWlkIF9fTlJfc2V0cmVzdWlkCisjZGVmaW5lIFNZU19zZXRyZXN1aWQzMiBfX05SX3NldHJlc3VpZDMyCisjZGVmaW5lIFNZU19zZXRyZXVpZCBfX05SX3NldHJldWlkCisjZGVmaW5lIFNZU19zZXRyZXVpZDMyIF9fTlJfc2V0cmV1aWQzMgorI2RlZmluZSBTWVNfc2V0cmxpbWl0IF9fTlJfc2V0cmxpbWl0CisjZGVmaW5lIFNZU19zZXRzaWQgX19OUl9zZXRzaWQKKyNkZWZpbmUgU1lTX3NldHRpbWVvZmRheSBfX05SX3NldHRpbWVvZmRheQorI2RlZmluZSBTWVNfc2V0dWlkIF9fTlJfc2V0dWlkCisjZGVmaW5lIFNZU19zZXR1aWQzMiBfX05SX3NldHVpZDMyCisjZGVmaW5lIFNZU19zZXR4YXR0ciBfX05SX3NldHhhdHRyCisjZGVmaW5lIFNZU19zZ2V0bWFzayBfX05SX3NnZXRtYXNrCisjZGVmaW5lIFNZU19zaWdhY3Rpb24gX19OUl9zaWdhY3Rpb24KKyNkZWZpbmUgU1lTX3NpZ2FsdHN0YWNrIF9fTlJfc2lnYWx0c3RhY2sKKyNkZWZpbmUgU1lTX3NpZ25hbCBfX05SX3NpZ25hbAorI2RlZmluZSBTWVNfc2lnbmFsZmQgX19OUl9zaWduYWxmZAorI2RlZmluZSBTWVNfc2lnbmFsZmQ0IF9fTlJfc2lnbmFsZmQ0CisjZGVmaW5lIFNZU19zaWdwZW5kaW5nIF9fTlJfc2lncGVuZGluZworI2RlZmluZSBTWVNfc2lncHJvY21hc2sgX19OUl9zaWdwcm9jbWFzaworI2RlZmluZSBTWVNfc2lncmV0dXJuIF9fTlJfc2lncmV0dXJuCisjZGVmaW5lIFNZU19zaWdzdXNwZW5kIF9fTlJfc2lnc3VzcGVuZAorI2RlZmluZSBTWVNfc29ja2V0Y2FsbCBfX05SX3NvY2tldGNhbGwKKyNkZWZpbmUgU1lTX3NwbGljZSBfX05SX3NwbGljZQorI2RlZmluZSBTWVNfc3NldG1hc2sgX19OUl9zc2V0bWFzaworI2RlZmluZSBTWVNfc3RhdCBfX05SX3N0YXQKKyNkZWZpbmUgU1lTX3N0YXQ2NCBfX05SX3N0YXQ2NAorI2RlZmluZSBTWVNfc3RhdGZzIF9fTlJfc3RhdGZzCisjZGVmaW5lIFNZU19zdGF0ZnM2NCBfX05SX3N0YXRmczY0CisjZGVmaW5lIFNZU19zdGltZSBfX05SX3N0aW1lCisjZGVmaW5lIFNZU19zdHR5IF9fTlJfc3R0eQorI2RlZmluZSBTWVNfc3dhcG9mZiBfX05SX3N3YXBvZmYKKyNkZWZpbmUgU1lTX3N3YXBvbiBfX05SX3N3YXBvbgorI2RlZmluZSBTWVNfc3ltbGluayBfX05SX3N5bWxpbmsKKyNkZWZpbmUgU1lTX3N5bWxpbmthdCBfX05SX3N5bWxpbmthdAorI2RlZmluZSBTWVNfc3luYyBfX05SX3N5bmMKKyNkZWZpbmUgU1lTX3N5bmNfZmlsZV9yYW5nZSBfX05SX3N5bmNfZmlsZV9yYW5nZQorI2RlZmluZSBTWVNfc3luY2ZzIF9fTlJfc3luY2ZzCisjZGVmaW5lIFNZU19zeXNmcyBfX05SX3N5c2ZzCisjZGVmaW5lIFNZU19zeXNpbmZvIF9fTlJfc3lzaW5mbworI2RlZmluZSBTWVNfc3lzbG9nIF9fTlJfc3lzbG9nCisjZGVmaW5lIFNZU190ZWUgX19OUl90ZWUKKyNkZWZpbmUgU1lTX3Rna2lsbCBfX05SX3Rna2lsbAorI2RlZmluZSBTWVNfdGltZSBfX05SX3RpbWUKKyNkZWZpbmUgU1lTX3RpbWVyX2NyZWF0ZSBfX05SX3RpbWVyX2NyZWF0ZQorI2RlZmluZSBTWVNfdGltZXJfZGVsZXRlIF9fTlJfdGltZXJfZGVsZXRlCisjZGVmaW5lIFNZU190aW1lcl9nZXRvdmVycnVuIF9fTlJfdGltZXJfZ2V0b3ZlcnJ1bgorI2RlZmluZSBTWVNfdGltZXJfZ2V0dGltZSBfX05SX3RpbWVyX2dldHRpbWUKKyNkZWZpbmUgU1lTX3RpbWVyX3NldHRpbWUgX19OUl90aW1lcl9zZXR0aW1lCisjZGVmaW5lIFNZU190aW1lcmZkX2NyZWF0ZSBfX05SX3RpbWVyZmRfY3JlYXRlCisjZGVmaW5lIFNZU190aW1lcmZkX2dldHRpbWUgX19OUl90aW1lcmZkX2dldHRpbWUKKyNkZWZpbmUgU1lTX3RpbWVyZmRfc2V0dGltZSBfX05SX3RpbWVyZmRfc2V0dGltZQorI2RlZmluZSBTWVNfdGltZXMgX19OUl90aW1lcworI2RlZmluZSBTWVNfdGtpbGwgX19OUl90a2lsbAorI2RlZmluZSBTWVNfdHJ1bmNhdGUgX19OUl90cnVuY2F0ZQorI2RlZmluZSBTWVNfdHJ1bmNhdGU2NCBfX05SX3RydW5jYXRlNjQKKyNkZWZpbmUgU1lTX3VnZXRybGltaXQgX19OUl91Z2V0cmxpbWl0CisjZGVmaW5lIFNZU191bGltaXQgX19OUl91bGltaXQKKyNkZWZpbmUgU1lTX3VtYXNrIF9fTlJfdW1hc2sKKyNkZWZpbmUgU1lTX3Vtb3VudCBfX05SX3Vtb3VudAorI2RlZmluZSBTWVNfdW1vdW50MiBfX05SX3Vtb3VudDIKKyNkZWZpbmUgU1lTX3VuYW1lIF9fTlJfdW5hbWUKKyNkZWZpbmUgU1lTX3VubGluayBfX05SX3VubGluaworI2RlZmluZSBTWVNfdW5saW5rYXQgX19OUl91bmxpbmthdAorI2RlZmluZSBTWVNfdW5zaGFyZSBfX05SX3Vuc2hhcmUKKyNkZWZpbmUgU1lTX3VzZWxpYiBfX05SX3VzZWxpYgorI2RlZmluZSBTWVNfdXN0YXQgX19OUl91c3RhdAorI2RlZmluZSBTWVNfdXRpbWUgX19OUl91dGltZQorI2RlZmluZSBTWVNfdXRpbWVuc2F0IF9fTlJfdXRpbWVuc2F0CisjZGVmaW5lIFNZU191dGltZXMgX19OUl91dGltZXMKKyNkZWZpbmUgU1lTX3Zmb3JrIF9fTlJfdmZvcmsKKyNkZWZpbmUgU1lTX3ZoYW5ndXAgX19OUl92aGFuZ3VwCisjZGVmaW5lIFNZU192bTg2IF9fTlJfdm04NgorI2RlZmluZSBTWVNfdm04Nm9sZCBfX05SX3ZtODZvbGQKKyNkZWZpbmUgU1lTX3Ztc3BsaWNlIF9fTlJfdm1zcGxpY2UKKyNkZWZpbmUgU1lTX3ZzZXJ2ZXIgX19OUl92c2VydmVyCisjZGVmaW5lIFNZU193YWl0NCBfX05SX3dhaXQ0CisjZGVmaW5lIFNZU193YWl0aWQgX19OUl93YWl0aWQKKyNkZWZpbmUgU1lTX3dhaXRwaWQgX19OUl93YWl0cGlkCisjZGVmaW5lIFNZU193cml0ZSBfX05SX3dyaXRlCisjZGVmaW5lIFNZU193cml0ZXYgX19OUl93cml0ZXYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zeXNsb2ctbGRibC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N5c2xvZy1sZGJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0ZTcwYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zeXNsb2ctbGRibC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIC1tbG9uZy1kb3VibGUtNjQgY29tcGF0aWJpbGl0eSBtb2RlIGZvciBzeXNsb2cgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU1lTTE9HX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3lzbG9nLWxkYmwuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3N5c2xvZy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCitfX0xEQkxfUkVESVJfREVDTCAoc3lzbG9nKQorCisjaWZkZWYgX19VU0VfQlNECitfX0xEQkxfUkVESVJfREVDTCAodnN5c2xvZykKKyNlbmRpZgorCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDAgJiYgZGVmaW5lZCBfX2V4dGVybl9hbHdheXNfaW5saW5lCitfX0xEQkxfUkVESVJfREVDTCAoX19zeXNsb2dfY2hrKQorCisjIGlmZGVmIF9fVVNFX0JTRAorX19MREJMX1JFRElSX0RFQ0wgKF9fdnN5c2xvZ19jaGspCisjIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zeXNsb2ctcGF0aC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N5c2xvZy1wYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiYmQ2YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy9zeXNsb2ctcGF0aC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIDxiaXRzL3N5c2xvZy1wYXRoLmg+IC0tIF9QQVRIX0xPRyBkZWZpbml0aW9uCisgICBDb3B5cmlnaHQgKEMpIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TWVNMT0dfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkuICBVc2UgPHN5cy9zeXNsb2cuaD4gaW5zdGVhZCIKKyNlbmRpZgorCisjaWZuZGVmIF9CSVRTX1NZU0xPR19QQVRIX0gKKyNkZWZpbmUgX0JJVFNfU1lTTE9HX1BBVEhfSCAxCisKKyNkZWZpbmUJX1BBVEhfTE9HCSIvZGV2L2xvZyIKKworI2VuZGlmIC8qIGJpdHMvc3lzbG9nLXBhdGguaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N5c2xvZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3N5c2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNjRkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvc3lzbG9nLmgKQEAgLTAsMCArMSw1MCBAQAorLyogQ2hlY2tpbmcgbWFjcm9zIGZvciBzeXNsb2cgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA3LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU1lTTE9HX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3lzbG9nLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zeXNsb2cuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCitleHRlcm4gdm9pZCBfX3N5c2xvZ19jaGsgKGludCBfX3ByaSwgaW50IF9fZmxhZywgX19jb25zdCBjaGFyICpfX2ZtdCwgLi4uKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgNCkpKTsKKworI2lmZGVmIF9fdmFfYXJnX3BhY2sKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgdm9pZAorc3lzbG9nIChpbnQgX19wcmksIF9fY29uc3QgY2hhciAqX19mbXQsIC4uLikKK3sKKyAgX19zeXNsb2dfY2hrIChfX3ByaSwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKyNlbGlmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisjIGRlZmluZSBzeXNsb2cocHJpLCAuLi4pIFwKKyAgX19zeXNsb2dfY2hrIChwcmksIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX1ZBX0FSR1NfXykKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9CU0QKK2V4dGVybiB2b2lkIF9fdnN5c2xvZ19jaGsgKGludCBfX3ByaSwgaW50IF9fZmxhZywgX19jb25zdCBjaGFyICpfX2ZtdCwKKwkJCSAgIF9fZ251Y192YV9saXN0IF9fYXApCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCAwKSkpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHZvaWQKK3ZzeXNsb2cgKGludCBfX3ByaSwgX19jb25zdCBjaGFyICpfX2ZtdCwgX19nbnVjX3ZhX2xpc3QgX19hcCkKK3sKKyAgX192c3lzbG9nX2NoayAoX19wcmksICBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsIF9fYXApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdGVybWlvcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3Rlcm1pb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2I0Y2UwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3Rlcm1pb3MuaApAQCAtMCwwICsxLDIyMCBAQAorLyogdGVybWlvcyB0eXBlIGFuZCBtYWNybyBkZWZpbml0aW9ucy4gIExpbnV4IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5OSwgMjAwMywgMjAwNSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfVEVSTUlPU19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3Rlcm1pb3MuaD4gZGlyZWN0bHk7IHVzZSA8dGVybWlvcy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJY2NfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CXNwZWVkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAl0Y2ZsYWdfdDsKKworI2RlZmluZSBOQ0NTIDMyCitzdHJ1Y3QgdGVybWlvcworICB7CisgICAgdGNmbGFnX3QgY19pZmxhZzsJCS8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKyAgICB0Y2ZsYWdfdCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKyAgICB0Y2ZsYWdfdCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisgICAgdGNmbGFnX3QgY19sZmxhZzsJCS8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKyAgICBjY190IGNfbGluZTsJCQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKyAgICBjY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KKyAgICBzcGVlZF90IGNfaXNwZWVkOwkJLyogaW5wdXQgc3BlZWQgKi8KKyAgICBzcGVlZF90IGNfb3NwZWVkOwkJLyogb3V0cHV0IHNwZWVkICovCisjZGVmaW5lIF9IQVZFX1NUUlVDVF9URVJNSU9TX0NfSVNQRUVEIDEKKyNkZWZpbmUgX0hBVkVfU1RSVUNUX1RFUk1JT1NfQ19PU1BFRUQgMQorICB9OworCisvKiBjX2NjIGNoYXJhY3RlcnMgKi8KKyNkZWZpbmUgVklOVFIgMAorI2RlZmluZSBWUVVJVCAxCisjZGVmaW5lIFZFUkFTRSAyCisjZGVmaW5lIFZLSUxMIDMKKyNkZWZpbmUgVkVPRiA0CisjZGVmaW5lIFZUSU1FIDUKKyNkZWZpbmUgVk1JTiA2CisjZGVmaW5lIFZTV1RDIDcKKyNkZWZpbmUgVlNUQVJUIDgKKyNkZWZpbmUgVlNUT1AgOQorI2RlZmluZSBWU1VTUCAxMAorI2RlZmluZSBWRU9MIDExCisjZGVmaW5lIFZSRVBSSU5UIDEyCisjZGVmaW5lIFZESVNDQVJEIDEzCisjZGVmaW5lIFZXRVJBU0UgMTQKKyNkZWZpbmUgVkxORVhUIDE1CisjZGVmaW5lIFZFT0wyIDE2CisKKy8qIGNfaWZsYWcgYml0cyAqLworI2RlZmluZSBJR05CUksJMDAwMDAwMQorI2RlZmluZSBCUktJTlQJMDAwMDAwMgorI2RlZmluZSBJR05QQVIJMDAwMDAwNAorI2RlZmluZSBQQVJNUksJMDAwMDAxMAorI2RlZmluZSBJTlBDSwkwMDAwMDIwCisjZGVmaW5lIElTVFJJUAkwMDAwMDQwCisjZGVmaW5lIElOTENSCTAwMDAxMDAKKyNkZWZpbmUgSUdOQ1IJMDAwMDIwMAorI2RlZmluZSBJQ1JOTAkwMDAwNDAwCisjZGVmaW5lIElVQ0xDCTAwMDEwMDAKKyNkZWZpbmUgSVhPTgkwMDAyMDAwCisjZGVmaW5lIElYQU5ZCTAwMDQwMDAKKyNkZWZpbmUgSVhPRkYJMDAxMDAwMAorI2RlZmluZSBJTUFYQkVMCTAwMjAwMDAKKyNkZWZpbmUgSVVURjgJMDA0MDAwMAorCisvKiBjX29mbGFnIGJpdHMgKi8KKyNkZWZpbmUgT1BPU1QJMDAwMDAwMQorI2RlZmluZSBPTENVQwkwMDAwMDAyCisjZGVmaW5lIE9OTENSCTAwMDAwMDQKKyNkZWZpbmUgT0NSTkwJMDAwMDAxMAorI2RlZmluZSBPTk9DUgkwMDAwMDIwCisjZGVmaW5lIE9OTFJFVAkwMDAwMDQwCisjZGVmaW5lIE9GSUxMCTAwMDAxMDAKKyNkZWZpbmUgT0ZERUwJMDAwMDIwMAorI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisjIGRlZmluZSBOTERMWQkwMDAwNDAwCisjIGRlZmluZSAgIE5MMAkwMDAwMDAwCisjIGRlZmluZSAgIE5MMQkwMDAwNDAwCisjIGRlZmluZSBDUkRMWQkwMDAzMDAwCisjIGRlZmluZSAgIENSMAkwMDAwMDAwCisjIGRlZmluZSAgIENSMQkwMDAxMDAwCisjIGRlZmluZSAgIENSMgkwMDAyMDAwCisjIGRlZmluZSAgIENSMwkwMDAzMDAwCisjIGRlZmluZSBUQUJETFkJMDAxNDAwMAorIyBkZWZpbmUgICBUQUIwCTAwMDAwMDAKKyMgZGVmaW5lICAgVEFCMQkwMDA0MDAwCisjIGRlZmluZSAgIFRBQjIJMDAxMDAwMAorIyBkZWZpbmUgICBUQUIzCTAwMTQwMDAKKyMgZGVmaW5lIEJTRExZCTAwMjAwMDAKKyMgZGVmaW5lICAgQlMwCTAwMDAwMDAKKyMgZGVmaW5lICAgQlMxCTAwMjAwMDAKKyMgZGVmaW5lIEZGRExZCTAxMDAwMDAKKyMgZGVmaW5lICAgRkYwCTAwMDAwMDAKKyMgZGVmaW5lICAgRkYxCTAxMDAwMDAKKyNlbmRpZgorCisjZGVmaW5lIFZURExZCTAwNDAwMDAKKyNkZWZpbmUgICBWVDAJMDAwMDAwMAorI2RlZmluZSAgIFZUMQkwMDQwMDAwCisKKyNpZmRlZiBfX1VTRV9NSVNDCisjIGRlZmluZSBYVEFCUwkwMDE0MDAwCisjZW5kaWYKKworLyogY19jZmxhZyBiaXQgbWVhbmluZyAqLworI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIENCQVVECTAwMTAwMTcKKyNlbmRpZgorI2RlZmluZSAgQjAJMDAwMDAwMAkJLyogaGFuZyB1cCAqLworI2RlZmluZSAgQjUwCTAwMDAwMDEKKyNkZWZpbmUgIEI3NQkwMDAwMDAyCisjZGVmaW5lICBCMTEwCTAwMDAwMDMKKyNkZWZpbmUgIEIxMzQJMDAwMDAwNAorI2RlZmluZSAgQjE1MAkwMDAwMDA1CisjZGVmaW5lICBCMjAwCTAwMDAwMDYKKyNkZWZpbmUgIEIzMDAJMDAwMDAwNworI2RlZmluZSAgQjYwMAkwMDAwMDEwCisjZGVmaW5lICBCMTIwMAkwMDAwMDExCisjZGVmaW5lICBCMTgwMAkwMDAwMDEyCisjZGVmaW5lICBCMjQwMAkwMDAwMDEzCisjZGVmaW5lICBCNDgwMAkwMDAwMDE0CisjZGVmaW5lICBCOTYwMAkwMDAwMDE1CisjZGVmaW5lICBCMTkyMDAJMDAwMDAxNgorI2RlZmluZSAgQjM4NDAwCTAwMDAwMTcKKyNpZmRlZiBfX1VTRV9NSVNDCisjIGRlZmluZSBFWFRBIEIxOTIwMAorIyBkZWZpbmUgRVhUQiBCMzg0MDAKKyNlbmRpZgorI2RlZmluZSBDU0laRQkwMDAwMDYwCisjZGVmaW5lICAgQ1M1CTAwMDAwMDAKKyNkZWZpbmUgICBDUzYJMDAwMDAyMAorI2RlZmluZSAgIENTNwkwMDAwMDQwCisjZGVmaW5lICAgQ1M4CTAwMDAwNjAKKyNkZWZpbmUgQ1NUT1BCCTAwMDAxMDAKKyNkZWZpbmUgQ1JFQUQJMDAwMDIwMAorI2RlZmluZSBQQVJFTkIJMDAwMDQwMAorI2RlZmluZSBQQVJPREQJMDAwMTAwMAorI2RlZmluZSBIVVBDTAkwMDAyMDAwCisjZGVmaW5lIENMT0NBTAkwMDA0MDAwCisjaWZkZWYgX19VU0VfTUlTQworIyBkZWZpbmUgQ0JBVURFWCAwMDEwMDAwCisjZW5kaWYKKyNkZWZpbmUgIEI1NzYwMCAgIDAwMTAwMDEKKyNkZWZpbmUgIEIxMTUyMDAgIDAwMTAwMDIKKyNkZWZpbmUgIEIyMzA0MDAgIDAwMTAwMDMKKyNkZWZpbmUgIEI0NjA4MDAgIDAwMTAwMDQKKyNkZWZpbmUgIEI1MDAwMDAgIDAwMTAwMDUKKyNkZWZpbmUgIEI1NzYwMDAgIDAwMTAwMDYKKyNkZWZpbmUgIEI5MjE2MDAgIDAwMTAwMDcKKyNkZWZpbmUgIEIxMDAwMDAwIDAwMTAwMTAKKyNkZWZpbmUgIEIxMTUyMDAwIDAwMTAwMTEKKyNkZWZpbmUgIEIxNTAwMDAwIDAwMTAwMTIKKyNkZWZpbmUgIEIyMDAwMDAwIDAwMTAwMTMKKyNkZWZpbmUgIEIyNTAwMDAwIDAwMTAwMTQKKyNkZWZpbmUgIEIzMDAwMDAwIDAwMTAwMTUKKyNkZWZpbmUgIEIzNTAwMDAwIDAwMTAwMTYKKyNkZWZpbmUgIEI0MDAwMDAwIDAwMTAwMTcKKyNkZWZpbmUgX19NQVhfQkFVRCBCNDAwMDAwMAorI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIENJQkFVRAkgIDAwMjAwMzYwMDAwMAkJLyogaW5wdXQgYmF1ZCByYXRlIChub3QgdXNlZCkgKi8KKyMgZGVmaW5lIENNU1BBUiAgIDAxMDAwMDAwMDAwMAkJLyogbWFyayBvciBzcGFjZSAoc3RpY2spIHBhcml0eSAqLworIyBkZWZpbmUgQ1JUU0NUUyAgMDIwMDAwMDAwMDAwCQkvKiBmbG93IGNvbnRyb2wgKi8KKyNlbmRpZgorCisvKiBjX2xmbGFnIGJpdHMgKi8KKyNkZWZpbmUgSVNJRwkwMDAwMDAxCisjZGVmaW5lIElDQU5PTgkwMDAwMDAyCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKyMgZGVmaW5lIFhDQVNFCTAwMDAwMDQKKyNlbmRpZgorI2RlZmluZSBFQ0hPCTAwMDAwMTAKKyNkZWZpbmUgRUNIT0UJMDAwMDAyMAorI2RlZmluZSBFQ0hPSwkwMDAwMDQwCisjZGVmaW5lIEVDSE9OTAkwMDAwMTAwCisjZGVmaW5lIE5PRkxTSAkwMDAwMjAwCisjZGVmaW5lIFRPU1RPUAkwMDAwNDAwCisjaWZkZWYgX19VU0VfTUlTQworIyBkZWZpbmUgRUNIT0NUTCAwMDAxMDAwCisjIGRlZmluZSBFQ0hPUFJUIDAwMDIwMDAKKyMgZGVmaW5lIEVDSE9LRQkgMDAwNDAwMAorIyBkZWZpbmUgRkxVU0hPCSAwMDEwMDAwCisjIGRlZmluZSBQRU5ESU4JIDAwNDAwMDAKKyNlbmRpZgorI2RlZmluZSBJRVhURU4JMDEwMDAwMAorI2lmZGVmIF9fVVNFX0JTRAorIyBkZWZpbmUgRVhUUFJPQyAwMjAwMDAwCisjZW5kaWYKKworLyogdGNmbG93KCkgYW5kIFRDWE9OQyB1c2UgdGhlc2UgKi8KKyNkZWZpbmUJVENPT0ZGCQkwCisjZGVmaW5lCVRDT09OCQkxCisjZGVmaW5lCVRDSU9GRgkJMgorI2RlZmluZQlUQ0lPTgkJMworCisvKiB0Y2ZsdXNoKCkgYW5kIFRDRkxTSCB1c2UgdGhlc2UgKi8KKyNkZWZpbmUJVENJRkxVU0gJMAorI2RlZmluZQlUQ09GTFVTSAkxCisjZGVmaW5lCVRDSU9GTFVTSAkyCisKKy8qIHRjc2V0YXR0ciB1c2VzIHRoZXNlICovCisjZGVmaW5lCVRDU0FOT1cJCTAKKyNkZWZpbmUJVENTQURSQUlOCTEKKyNkZWZpbmUJVENTQUZMVVNICTIKKworCisjZGVmaW5lIF9JT1RfdGVybWlvcyAvKiBIdXJkIGlvY3RsIHR5cGUgZmllbGQuICAqLyBcCisgIF9JT1QgKF9JT1RTIChjZmxhZ190KSwgNCwgX0lPVFMgKGNjX3QpLCBOQ0NTLCBfSU9UUyAoc3BlZWRfdCksIDIpCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdGltZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGY5YTY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3RpbWUuaApAQCAtMCwwICsxLDk5IEBACisvKiBTeXN0ZW0tZGVwZW5kZW50IHRpbWluZyBkZWZpbml0aW9ucy4gIExpbnV4IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsMTk5NywxOTk5LTIwMDMsMjAxMCwyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICogTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHk7IHVzZSA8dGltZS5oPiBpbnN0ZWFkLgorICovCisKKyNpZiBkZWZpbmVkIF9fbmVlZF90aW1ldmFsIHx8IGRlZmluZWQgX19VU0VfR05VCisjIGlmbmRlZiBfU1RSVUNUX1RJTUVWQUwKKyMgIGRlZmluZSBfU1RSVUNUX1RJTUVWQUwJMQorIyAgaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisvKiBBIHRpbWUgdmFsdWUgdGhhdCBpcyBhY2N1cmF0ZSB0byB0aGUgbmVhcmVzdAorICAgbWljcm9zZWNvbmQgYnV0IGFsc28gaGFzIGEgcmFuZ2Ugb2YgeWVhcnMuICAqLworc3RydWN0IHRpbWV2YWwKKyAgeworICAgIF9fdGltZV90IHR2X3NlYzsJCS8qIFNlY29uZHMuICAqLworICAgIF9fc3VzZWNvbmRzX3QgdHZfdXNlYzsJLyogTWljcm9zZWNvbmRzLiAgKi8KKyAgfTsKKyMgZW5kaWYJLyogc3RydWN0IHRpbWV2YWwgKi8KKyNlbmRpZgorCisjaWZuZGVmIF9fbmVlZF90aW1ldmFsCisjIGlmbmRlZiBfQklUU19USU1FX0gKKyMgIGRlZmluZSBfQklUU19USU1FX0gJMQorCisvKiBJU08vSUVDIDk4OTk6MTk5MCA3LjEyLjE6IDx0aW1lLmg+CisgICBUaGUgbWFjcm8gYENMT0NLU19QRVJfU0VDJyBpcyB0aGUgbnVtYmVyIHBlciBzZWNvbmQgb2YgdGhlIHZhbHVlCisgICByZXR1cm5lZCBieSB0aGUgYGNsb2NrJyBmdW5jdGlvbi4gKi8KKy8qIENBRSBYU0gsIElzc3VlIDQsIFZlcnNpb24gMjogPHRpbWUuaD4KKyAgIFRoZSB2YWx1ZSBvZiBDTE9DS1NfUEVSX1NFQyBpcyByZXF1aXJlZCB0byBiZSAxIG1pbGxpb24gb24gYWxsCisgICBYU0ktY29uZm9ybWFudCBzeXN0ZW1zLiAqLworIyAgZGVmaW5lIENMT0NLU19QRVJfU0VDICAxMDAwMDAwbAorCisjICBpZiAhZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gJiYgIWRlZmluZWQgX19VU0VfWE9QRU4ySworLyogRXZlbiB0aG91Z2ggQ0xPQ0tTX1BFUl9TRUMgaGFzIHN1Y2ggYSBzdHJhbmdlIHZhbHVlIENMS19UQ0sKKyAgIHByZXNlbnRzIHRoZSByZWFsIHZhbHVlIGZvciBjbG9jayB0aWNrcyBwZXIgc2Vjb25kIGZvciB0aGUgc3lzdGVtLiAgKi8KKyMgICBpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CitleHRlcm4gbG9uZyBpbnQgX19zeXNjb25mIChpbnQpOworIyAgIGRlZmluZSBDTEtfVENLICgoX19jbG9ja190KSBfX3N5c2NvbmYgKDIpKQkvKiAyIGlzIF9TQ19DTEtfVENLICovCisjICBlbmRpZgorCisjICBpZmRlZiBfX1VTRV9QT1NJWDE5OTMwOQorLyogSWRlbnRpZmllciBmb3Igc3lzdGVtLXdpZGUgcmVhbHRpbWUgY2xvY2suICAqLworIyAgIGRlZmluZSBDTE9DS19SRUFMVElNRQkJMAorLyogTW9ub3RvbmljIHN5c3RlbS13aWRlIGNsb2NrLiAgKi8KKyMgICBkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDCQkxCisvKiBIaWdoLXJlc29sdXRpb24gdGltZXIgZnJvbSB0aGUgQ1BVLiAgKi8KKyMgICBkZWZpbmUgQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lECTIKKy8qIFRocmVhZC1zcGVjaWZpYyBDUFUtdGltZSBjbG9jay4gICovCisjICAgZGVmaW5lIENMT0NLX1RIUkVBRF9DUFVUSU1FX0lECTMKKy8qIE1vbm90b25pYyBzeXN0ZW0td2lkZSBjbG9jaywgbm90IGFkanVzdGVkIGZvciBmcmVxdWVuY3kgc2NhbGluZy4gICovCisjICAgZGVmaW5lIENMT0NLX01PTk9UT05JQ19SQVcJCTQKKy8qIElkZW50aWZpZXIgZm9yIHN5c3RlbS13aWRlIHJlYWx0aW1lIGNsb2NrLCB1cGRhdGVkIG9ubHkgb24gdGlja3MuICAqLworIyAgIGRlZmluZSBDTE9DS19SRUFMVElNRV9DT0FSU0UJNQorLyogTW9ub3RvbmljIHN5c3RlbS13aWRlIGNsb2NrLCB1cGRhdGVkIG9ubHkgb24gdGlja3MuICAqLworIyAgIGRlZmluZSBDTE9DS19NT05PVE9OSUNfQ09BUlNFCTYKKy8qIE1vbm90b25pYyBzeXN0ZW0td2lkZSBjbG9jayB0aGF0IGluY2x1ZGVzIHRpbWUgc3BlbnQgaW4gc3VzcGVuc2lvbi4gICovCisjICAgZGVmaW5lIENMT0NLX0JPT1RUSU1FCQk3CisvKiBMaWtlIENMT0NLX1JFQUxUSU1FIGJ1dCBhbHNvIHdha2VzIHN1c3BlbmRlZCBzeXN0ZW0uICAqLworIyAgIGRlZmluZSBDTE9DS19SRUFMVElNRV9BTEFSTQkJOAorLyogTGlrZSBDTE9DS19CT09UVElNRSBidXQgYWxzbyB3YWtlcyBzdXNwZW5kZWQgc3lzdGVtLiAgKi8KKyMgICBkZWZpbmUgQ0xPQ0tfQk9PVFRJTUVfQUxBUk0JCTkKKworLyogRmxhZyB0byBpbmRpY2F0ZSB0aW1lIGlzIGFic29sdXRlLiAgKi8KKyMgICBkZWZpbmUgVElNRVJfQUJTVElNRQkJMQorIyAgZW5kaWYKKworIyAgaWZkZWYgX19VU0VfR05VCisjICAgaW5jbHVkZSA8Yml0cy90aW1leC5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFR1bmUgYSBQT1NJWCBjbG9jay4gICovCitleHRlcm4gaW50IGNsb2NrX2FkanRpbWUgKF9fY2xvY2tpZF90IF9fY2xvY2tfaWQsIHN0cnVjdCB0aW1leCAqX191dHgpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisjICBlbmRpZiAvKiB1c2UgR05VICovCisKKyMgZW5kaWYJLyogYml0cy90aW1lLmggKi8KKyNlbmRpZgorCisjdW5kZWYgX19uZWVkX3RpbWV2YWwKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy90aW1leC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3RpbWV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkZTY3ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy90aW1leC5oCkBAIC0wLDAgKzEsMTA4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywxOTk5LDIwMDcsMjAwOSwyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9CSVRTX1RJTUVYX0gKKyNkZWZpbmUJX0JJVFNfVElNRVhfSAkxCisKKy8qIFRoZXNlIGRlZmluaXRpb25zIGZyb20gbGludXgvdGltZXguaCBhcyBvZiAyLjYuMzAuICAqLworCitzdHJ1Y3QgdGltZXgKK3sKKyAgdW5zaWduZWQgaW50IG1vZGVzOwkvKiBtb2RlIHNlbGVjdG9yICovCisgIGxvbmcgaW50IG9mZnNldDsJLyogdGltZSBvZmZzZXQgKHVzZWMpICovCisgIGxvbmcgaW50IGZyZXE7CS8qIGZyZXF1ZW5jeSBvZmZzZXQgKHNjYWxlZCBwcG0pICovCisgIGxvbmcgaW50IG1heGVycm9yOwkvKiBtYXhpbXVtIGVycm9yICh1c2VjKSAqLworICBsb25nIGludCBlc3RlcnJvcjsJLyogZXN0aW1hdGVkIGVycm9yICh1c2VjKSAqLworICBpbnQgc3RhdHVzOwkJLyogY2xvY2sgY29tbWFuZC9zdGF0dXMgKi8KKyAgbG9uZyBpbnQgY29uc3RhbnQ7CS8qIHBsbCB0aW1lIGNvbnN0YW50ICovCisgIGxvbmcgaW50IHByZWNpc2lvbjsJLyogY2xvY2sgcHJlY2lzaW9uICh1c2VjKSAocmVhZCBvbmx5KSAqLworICBsb25nIGludCB0b2xlcmFuY2U7CS8qIGNsb2NrIGZyZXF1ZW5jeSB0b2xlcmFuY2UgKHBwbSkgKHJlYWQgb25seSkgKi8KKyAgc3RydWN0IHRpbWV2YWwgdGltZTsJLyogKHJlYWQgb25seSkgKi8KKyAgbG9uZyBpbnQgdGljazsJLyogKG1vZGlmaWVkKSB1c2VjcyBiZXR3ZWVuIGNsb2NrIHRpY2tzICovCisKKyAgbG9uZyBpbnQgcHBzZnJlcTsJLyogcHBzIGZyZXF1ZW5jeSAoc2NhbGVkIHBwbSkgKHJvKSAqLworICBsb25nIGludCBqaXR0ZXI7CS8qIHBwcyBqaXR0ZXIgKHVzKSAocm8pICovCisgIGludCBzaGlmdDsJCS8qIGludGVydmFsIGR1cmF0aW9uIChzKSAoc2hpZnQpIChybykgKi8KKyAgbG9uZyBpbnQgc3RhYmlsOwkvKiBwcHMgc3RhYmlsaXR5IChzY2FsZWQgcHBtKSAocm8pICovCisgIGxvbmcgaW50IGppdGNudDsJLyogaml0dGVyIGxpbWl0IGV4Y2VlZGVkIChybykgKi8KKyAgbG9uZyBpbnQgY2FsY250OwkvKiBjYWxpYnJhdGlvbiBpbnRlcnZhbHMgKHJvKSAqLworICBsb25nIGludCBlcnJjbnQ7CS8qIGNhbGlicmF0aW9uIGVycm9ycyAocm8pICovCisgIGxvbmcgaW50IHN0YmNudDsJLyogc3RhYmlsaXR5IGxpbWl0IGV4Y2VlZGVkIChybykgKi8KKworICBpbnQgdGFpOwkJLyogVEFJIG9mZnNldCAocm8pICovCisKKyAgLyogPz8/ICovCisgIGludCAgOjMyOyBpbnQgIDozMjsgaW50ICA6MzI7IGludCAgOjMyOworICBpbnQgIDozMjsgaW50ICA6MzI7IGludCAgOjMyOyBpbnQgIDozMjsKKyAgaW50ICA6MzI7IGludCAgOjMyOyBpbnQgIDozMjsKK307CisKKy8qIE1vZGUgY29kZXMgKHRpbWV4Lm1vZGUpICovCisjZGVmaW5lIEFESl9PRkZTRVQJCTB4MDAwMQkvKiB0aW1lIG9mZnNldCAqLworI2RlZmluZSBBREpfRlJFUVVFTkNZCQkweDAwMDIJLyogZnJlcXVlbmN5IG9mZnNldCAqLworI2RlZmluZSBBREpfTUFYRVJST1IJCTB4MDAwNAkvKiBtYXhpbXVtIHRpbWUgZXJyb3IgKi8KKyNkZWZpbmUgQURKX0VTVEVSUk9SCQkweDAwMDgJLyogZXN0aW1hdGVkIHRpbWUgZXJyb3IgKi8KKyNkZWZpbmUgQURKX1NUQVRVUwkJMHgwMDEwCS8qIGNsb2NrIHN0YXR1cyAqLworI2RlZmluZSBBREpfVElNRUNPTlNUCQkweDAwMjAJLyogcGxsIHRpbWUgY29uc3RhbnQgKi8KKyNkZWZpbmUgQURKX1RBSQkJCTB4MDA4MAkvKiBzZXQgVEFJIG9mZnNldCAqLworI2RlZmluZSBBREpfTUlDUk8JCTB4MTAwMAkvKiBzZWxlY3QgbWljcm9zZWNvbmQgcmVzb2x1dGlvbiAqLworI2RlZmluZSBBREpfTkFOTwkJMHgyMDAwCS8qIHNlbGVjdCBuYW5vc2Vjb25kIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgQURKX1RJQ0sJCTB4NDAwMAkvKiB0aWNrIHZhbHVlICovCisjZGVmaW5lIEFESl9PRkZTRVRfU0lOR0xFU0hPVAkweDgwMDEJLyogb2xkLWZhc2hpb25lZCBhZGp0aW1lICovCisjZGVmaW5lIEFESl9PRkZTRVRfU1NfUkVBRAkweGEwMDEJLyogcmVhZC1vbmx5IGFkanRpbWUgKi8KKworLyogeG50cCAzLjQgY29tcGF0aWJpbGl0eSBuYW1lcyAqLworI2RlZmluZSBNT0RfT0ZGU0VUCUFESl9PRkZTRVQKKyNkZWZpbmUgTU9EX0ZSRVFVRU5DWQlBREpfRlJFUVVFTkNZCisjZGVmaW5lIE1PRF9NQVhFUlJPUglBREpfTUFYRVJST1IKKyNkZWZpbmUgTU9EX0VTVEVSUk9SCUFESl9FU1RFUlJPUgorI2RlZmluZSBNT0RfU1RBVFVTCUFESl9TVEFUVVMKKyNkZWZpbmUgTU9EX1RJTUVDT05TVAlBREpfVElNRUNPTlNUCisjZGVmaW5lIE1PRF9DTEtCCUFESl9USUNLCisjZGVmaW5lIE1PRF9DTEtBCUFESl9PRkZTRVRfU0lOR0xFU0hPVCAvKiAweDgwMDAgaW4gb3JpZ2luYWwgKi8KKyNkZWZpbmUgTU9EX1RBSQkJQURKX1RBSQorI2RlZmluZSBNT0RfTUlDUk8JQURKX01JQ1JPCisjZGVmaW5lIE1PRF9OQU5PCUFESl9OQU5PCisKKworLyogU3RhdHVzIGNvZGVzICh0aW1leC5zdGF0dXMpICovCisjZGVmaW5lIFNUQV9QTEwJCTB4MDAwMQkvKiBlbmFibGUgUExMIHVwZGF0ZXMgKHJ3KSAqLworI2RlZmluZSBTVEFfUFBTRlJFUQkweDAwMDIJLyogZW5hYmxlIFBQUyBmcmVxIGRpc2NpcGxpbmUgKHJ3KSAqLworI2RlZmluZSBTVEFfUFBTVElNRQkweDAwMDQJLyogZW5hYmxlIFBQUyB0aW1lIGRpc2NpcGxpbmUgKHJ3KSAqLworI2RlZmluZSBTVEFfRkxMCQkweDAwMDgJLyogc2VsZWN0IGZyZXF1ZW5jeS1sb2NrIG1vZGUgKHJ3KSAqLworCisjZGVmaW5lIFNUQV9JTlMJCTB4MDAxMAkvKiBpbnNlcnQgbGVhcCAocncpICovCisjZGVmaW5lIFNUQV9ERUwJCTB4MDAyMAkvKiBkZWxldGUgbGVhcCAocncpICovCisjZGVmaW5lIFNUQV9VTlNZTkMJMHgwMDQwCS8qIGNsb2NrIHVuc3luY2hyb25pemVkIChydykgKi8KKyNkZWZpbmUgU1RBX0ZSRVFIT0xECTB4MDA4MAkvKiBob2xkIGZyZXF1ZW5jeSAocncpICovCisKKyNkZWZpbmUgU1RBX1BQU1NJR05BTAkweDAxMDAJLyogUFBTIHNpZ25hbCBwcmVzZW50IChybykgKi8KKyNkZWZpbmUgU1RBX1BQU0pJVFRFUgkweDAyMDAJLyogUFBTIHNpZ25hbCBqaXR0ZXIgZXhjZWVkZWQgKHJvKSAqLworI2RlZmluZSBTVEFfUFBTV0FOREVSCTB4MDQwMAkvKiBQUFMgc2lnbmFsIHdhbmRlciBleGNlZWRlZCAocm8pICovCisjZGVmaW5lIFNUQV9QUFNFUlJPUgkweDA4MDAJLyogUFBTIHNpZ25hbCBjYWxpYnJhdGlvbiBlcnJvciAocm8pICovCisKKyNkZWZpbmUgU1RBX0NMT0NLRVJSCTB4MTAwMAkvKiBjbG9jayBoYXJkd2FyZSBmYXVsdCAocm8pICovCisjZGVmaW5lIFNUQV9OQU5PCTB4MjAwMAkvKiByZXNvbHV0aW9uICgwID0gdXMsIDEgPSBucykgKHJvKSAqLworI2RlZmluZSBTVEFfTU9ERQkweDQwMDAJLyogbW9kZSAoMCA9IFBMTCwgMSA9IEZMTCkgKHJvKSAqLworI2RlZmluZSBTVEFfQ0xLCQkweDgwMDAJLyogY2xvY2sgc291cmNlICgwID0gQSwgMSA9IEIpIChybykgKi8KKworLyogUmVhZC1vbmx5IGJpdHMgKi8KKyNkZWZpbmUgU1RBX1JPTkxZIChTVEFfUFBTU0lHTkFMIHwgU1RBX1BQU0pJVFRFUiB8IFNUQV9QUFNXQU5ERVIgfCBcCisgICAgU1RBX1BQU0VSUk9SIHwgU1RBX0NMT0NLRVJSIHwgU1RBX05BTk8gfCBTVEFfTU9ERSB8IFNUQV9DTEspCisKKyNlbmRpZiAvKiBiaXRzL3RpbWV4LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy90eXBlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ViZTgyZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy90eXBlcy5oCkBAIC0wLDAgKzEsMTk3IEBACisvKiBiaXRzL3R5cGVzLmggLS0gZGVmaW5pdGlvbnMgb2YgX18qX3QgdHlwZXMgdW5kZXJseWluZyAqX3QgdHlwZXMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKiBOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseTsgdXNlIDxzeXMvdHlwZXMuaD4gaW5zdGVhZC4KKyAqLworCisjaWZuZGVmCV9CSVRTX1RZUEVTX0gKKyNkZWZpbmUJX0JJVFNfVFlQRVNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworLyogQ29udmVuaWVuY2UgdHlwZXMuICAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdV9jaGFyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgX191X3Nob3J0OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgX191X2ludDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgX191X2xvbmc7CisKKy8qIEZpeGVkLXNpemUgdHlwZXMsIHVuZGVybHlpbmcgdHlwZXMgZGVwZW5kIG9uIHdvcmQgc2l6ZSBhbmQgY29tcGlsZXIuICAqLwordHlwZWRlZiBzaWduZWQgY2hhciBfX2ludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBfX3VpbnQ4X3Q7Cit0eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgX19pbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgX191aW50MTZfdDsKK3R5cGVkZWYgc2lnbmVkIGludCBfX2ludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBfX3VpbnQzMl90OworI2lmIF9fV09SRFNJWkUgPT0gNjQKK3R5cGVkZWYgc2lnbmVkIGxvbmcgaW50IF9faW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgX191aW50NjRfdDsKKyNlbGlmIGRlZmluZWQgX19HTElCQ19IQVZFX0xPTkdfTE9ORworX19leHRlbnNpb25fXyB0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgaW50IF9faW50NjRfdDsKK19fZXh0ZW5zaW9uX18gdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fdWludDY0X3Q7CisjZW5kaWYKKworLyogcXVhZF90IGlzIGFsc28gNjQgYml0cy4gICovCisjaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiBsb25nIGludCBfX3F1YWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgX191X3F1YWRfdDsKKyNlbGlmIGRlZmluZWQgX19HTElCQ19IQVZFX0xPTkdfTE9ORworX19leHRlbnNpb25fXyB0eXBlZGVmIGxvbmcgbG9uZyBpbnQgX19xdWFkX3Q7CitfX2V4dGVuc2lvbl9fIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCBfX3VfcXVhZF90OworI2Vsc2UKK3R5cGVkZWYgc3RydWN0Cit7CisgIGxvbmcgX192YWxbMl07Cit9IF9fcXVhZF90OwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgX191X2xvbmcgX192YWxbMl07Cit9IF9fdV9xdWFkX3Q7CisjZW5kaWYKKworCisvKiBUaGUgbWFjaGluZS1kZXBlbmRlbnQgZmlsZSA8Yml0cy90eXBlc2l6ZXMuaD4gZGVmaW5lcyBfXypfVF9UWVBFCisgICBtYWNyb3MgZm9yIGVhY2ggb2YgdGhlIE9TIHR5cGVzIHdlIGRlZmluZSBiZWxvdy4gIFRoZSBkZWZpbml0aW9ucworICAgb2YgdGhvc2UgbWFjcm9zIG11c3QgdXNlIHRoZSBmb2xsb3dpbmcgbWFjcm9zIGZvciB1bmRlcmx5aW5nIHR5cGVzLgorICAgV2UgZGVmaW5lIF9fUzxTSVpFPl9UWVBFIGFuZCBfX1U8U0laRT5fVFlQRSBmb3IgdGhlIHNpZ25lZCBhbmQgdW5zaWduZWQKKyAgIHZhcmlhbnRzIG9mIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBpbnRlZ2VyIHR5cGVzIG9uIHRoaXMgbWFjaGluZS4KKworCTE2CQktLSAibmF0dXJhbCIgMTYtYml0IHR5cGUgKGFsd2F5cyBzaG9ydCkKKwkzMgkJLS0gIm5hdHVyYWwiIDMyLWJpdCB0eXBlIChhbHdheXMgaW50KQorCTY0CQktLSAibmF0dXJhbCIgNjQtYml0IHR5cGUgKGxvbmcgb3IgbG9uZyBsb25nKQorCUxPTkczMgkJLS0gMzItYml0IHR5cGUsIHRyYWRpdGlvbmFsbHkgbG9uZworCVFVQUQJCS0tIDY0LWJpdCB0eXBlLCBhbHdheXMgbG9uZyBsb25nCisJV09SRAkJLS0gbmF0dXJhbCB0eXBlIG9mIF9fV09SRFNJWkUgYml0cyAoaW50IG9yIGxvbmcpCisJTE9OR1dPUkQJLS0gdHlwZSBvZiBfX1dPUkRTSVpFIGJpdHMsIHRyYWRpdGlvbmFsbHkgbG9uZworCisgICBXZSBkaXN0aW5ndWlzaCBXT1JEL0xPTkdXT1JELCAzMi9MT05HMzIsIGFuZCA2NC9RVUFEIHNvIHRoYXQgdGhlCisgICBjb252ZW50aW9uYWwgdXNlcyBvZiBgbG9uZycgb3IgYGxvbmcgbG9uZycgdHlwZSBtb2RpZmllcnMgbWF0Y2ggdGhlCisgICB0eXBlcyB3ZSBkZWZpbmUsIGV2ZW4gd2hlbiBhIGxlc3MtYWRvcm5lZCB0eXBlIHdvdWxkIGJlIHRoZSBzYW1lIHNpemUuCisgICBUaGlzIG1hdHRlcnMgZm9yIChzb21ld2hhdCkgcG9ydGFibHkgd3JpdGluZyBwcmludGYvc2NhbmYgZm9ybWF0cyBmb3IKKyAgIHRoZXNlIHR5cGVzLCB3aGVyZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgbCBvciBsbCBmb3JtYXQgbW9kaWZpZXJzIGNhbgorICAgbWFrZSB0aGUgdHlwZWRlZnMgYW5kIHRoZSBmb3JtYXRzIG1hdGNoIHVwIGFjcm9zcyBhbGwgR05VIHBsYXRmb3Jtcy4gIElmCisgICB3ZSB1c2VkIGBsb25nJyB3aGVuIGl0J3MgNjQgYml0cyB3aGVyZSBgbG9uZyBsb25nJyBpcyBleHBlY3RlZCwgdGhlbiB0aGUKKyAgIGNvbXBpbGVyIHdvdWxkIHdhcm4gYWJvdXQgdGhlIGZvcm1hdHMgbm90IG1hdGNoaW5nIHRoZSBhcmd1bWVudCB0eXBlcywKKyAgIGFuZCB0aGUgcHJvZ3JhbW1lciBjaGFuZ2luZyB0aGVtIHRvIHNodXQgdXAgdGhlIGNvbXBpbGVyIHdvdWxkIGJyZWFrIHRoZQorICAgcHJvZ3JhbSdzIHBvcnRhYmlsaXR5LgorCisgICBIZXJlIHdlIGFzc3VtZSB3aGF0IGlzIHByZXNlbnRseSB0aGUgY2FzZSBpbiBhbGwgdGhlIEdDQyBjb25maWd1cmF0aW9ucworICAgd2Ugc3VwcG9ydDogbG9uZyBsb25nIGlzIGFsd2F5cyA2NCBiaXRzLCBsb25nIGlzIGFsd2F5cyB3b3JkL2FkZHJlc3Mgc2l6ZSwKKyAgIGFuZCBpbnQgaXMgYWx3YXlzIDMyIGJpdHMuICAqLworCisjZGVmaW5lCV9fUzE2X1RZUEUJCXNob3J0IGludAorI2RlZmluZSBfX1UxNl9UWVBFCQl1bnNpZ25lZCBzaG9ydCBpbnQKKyNkZWZpbmUJX19TMzJfVFlQRQkJaW50CisjZGVmaW5lIF9fVTMyX1RZUEUJCXVuc2lnbmVkIGludAorI2RlZmluZSBfX1NMT05HV09SRF9UWVBFCWxvbmcgaW50CisjZGVmaW5lIF9fVUxPTkdXT1JEX1RZUEUJdW5zaWduZWQgbG9uZyBpbnQKKyNpZiBfX1dPUkRTSVpFID09IDMyCisjIGRlZmluZSBfX1NRVUFEX1RZUEUJCV9fcXVhZF90CisjIGRlZmluZSBfX1VRVUFEX1RZUEUJCV9fdV9xdWFkX3QKKyMgZGVmaW5lIF9fU1dPUkRfVFlQRQkJaW50CisjIGRlZmluZSBfX1VXT1JEX1RZUEUJCXVuc2lnbmVkIGludAorIyBkZWZpbmUgX19TTE9ORzMyX1RZUEUJCWxvbmcgaW50CisjIGRlZmluZSBfX1VMT05HMzJfVFlQRQkJdW5zaWduZWQgbG9uZyBpbnQKKyMgZGVmaW5lIF9fUzY0X1RZUEUJCV9fcXVhZF90CisjIGRlZmluZSBfX1U2NF9UWVBFCQlfX3VfcXVhZF90CisvKiBXZSB3YW50IF9fZXh0ZW5zaW9uX18gYmVmb3JlIHR5cGVkZWYncyB0aGF0IHVzZSBub25zdGFuZGFyZCBiYXNlIHR5cGVzCisgICBzdWNoIGFzIGBsb25nIGxvbmcnIGluIEM4OSBtb2RlLiAgKi8KKyMgZGVmaW5lIF9fU1REX1RZUEUJCV9fZXh0ZW5zaW9uX18gdHlwZWRlZgorI2VsaWYgX19XT1JEU0laRSA9PSA2NAorIyBkZWZpbmUgX19TUVVBRF9UWVBFCQlsb25nIGludAorIyBkZWZpbmUgX19VUVVBRF9UWVBFCQl1bnNpZ25lZCBsb25nIGludAorIyBkZWZpbmUgX19TV09SRF9UWVBFCQlsb25nIGludAorIyBkZWZpbmUgX19VV09SRF9UWVBFCQl1bnNpZ25lZCBsb25nIGludAorIyBkZWZpbmUgX19TTE9ORzMyX1RZUEUJCWludAorIyBkZWZpbmUgX19VTE9ORzMyX1RZUEUJCXVuc2lnbmVkIGludAorIyBkZWZpbmUgX19TNjRfVFlQRQkJbG9uZyBpbnQKKyMgZGVmaW5lIF9fVTY0X1RZUEUJCXVuc2lnbmVkIGxvbmcgaW50CisvKiBObyBuZWVkIHRvIG1hcmsgdGhlIHR5cGVkZWYgd2l0aCBfX2V4dGVuc2lvbl9fLiAgICovCisjIGRlZmluZSBfX1NURF9UWVBFCQl0eXBlZGVmCisjZWxzZQorIyBlcnJvcgorI2VuZGlmCisjaW5jbHVkZSA8Yml0cy90eXBlc2l6ZXMuaD4JLyogRGVmaW5lcyBfXypfVF9UWVBFIG1hY3Jvcy4gICovCisKKworX19TVERfVFlQRSBfX0RFVl9UX1RZUEUgX19kZXZfdDsJLyogVHlwZSBvZiBkZXZpY2UgbnVtYmVycy4gICovCitfX1NURF9UWVBFIF9fVUlEX1RfVFlQRSBfX3VpZF90OwkvKiBUeXBlIG9mIHVzZXIgaWRlbnRpZmljYXRpb25zLiAgKi8KK19fU1REX1RZUEUgX19HSURfVF9UWVBFIF9fZ2lkX3Q7CS8qIFR5cGUgb2YgZ3JvdXAgaWRlbnRpZmljYXRpb25zLiAgKi8KK19fU1REX1RZUEUgX19JTk9fVF9UWVBFIF9faW5vX3Q7CS8qIFR5cGUgb2YgZmlsZSBzZXJpYWwgbnVtYmVycy4gICovCitfX1NURF9UWVBFIF9fSU5PNjRfVF9UWVBFIF9faW5vNjRfdDsJLyogVHlwZSBvZiBmaWxlIHNlcmlhbCBudW1iZXJzIChMRlMpLiovCitfX1NURF9UWVBFIF9fTU9ERV9UX1RZUEUgX19tb2RlX3Q7CS8qIFR5cGUgb2YgZmlsZSBhdHRyaWJ1dGUgYml0bWFza3MuICAqLworX19TVERfVFlQRSBfX05MSU5LX1RfVFlQRSBfX25saW5rX3Q7CS8qIFR5cGUgb2YgZmlsZSBsaW5rIGNvdW50cy4gICovCitfX1NURF9UWVBFIF9fT0ZGX1RfVFlQRSBfX29mZl90OwkvKiBUeXBlIG9mIGZpbGUgc2l6ZXMgYW5kIG9mZnNldHMuICAqLworX19TVERfVFlQRSBfX09GRjY0X1RfVFlQRSBfX29mZjY0X3Q7CS8qIFR5cGUgb2YgZmlsZSBzaXplcyBhbmQgb2Zmc2V0cyAoTEZTKS4gICovCitfX1NURF9UWVBFIF9fUElEX1RfVFlQRSBfX3BpZF90OwkvKiBUeXBlIG9mIHByb2Nlc3MgaWRlbnRpZmljYXRpb25zLiAgKi8KK19fU1REX1RZUEUgX19GU0lEX1RfVFlQRSBfX2ZzaWRfdDsJLyogVHlwZSBvZiBmaWxlIHN5c3RlbSBJRHMuICAqLworX19TVERfVFlQRSBfX0NMT0NLX1RfVFlQRSBfX2Nsb2NrX3Q7CS8qIFR5cGUgb2YgQ1BVIHVzYWdlIGNvdW50cy4gICovCitfX1NURF9UWVBFIF9fUkxJTV9UX1RZUEUgX19ybGltX3Q7CS8qIFR5cGUgZm9yIHJlc291cmNlIG1lYXN1cmVtZW50LiAgKi8KK19fU1REX1RZUEUgX19STElNNjRfVF9UWVBFIF9fcmxpbTY0X3Q7CS8qIFR5cGUgZm9yIHJlc291cmNlIG1lYXN1cmVtZW50IChMRlMpLiAgKi8KK19fU1REX1RZUEUgX19JRF9UX1RZUEUgX19pZF90OwkJLyogR2VuZXJhbCB0eXBlIGZvciBJRHMuICAqLworX19TVERfVFlQRSBfX1RJTUVfVF9UWVBFIF9fdGltZV90OwkvKiBTZWNvbmRzIHNpbmNlIHRoZSBFcG9jaC4gICovCitfX1NURF9UWVBFIF9fVVNFQ09ORFNfVF9UWVBFIF9fdXNlY29uZHNfdDsgLyogQ291bnQgb2YgbWljcm9zZWNvbmRzLiAgKi8KK19fU1REX1RZUEUgX19TVVNFQ09ORFNfVF9UWVBFIF9fc3VzZWNvbmRzX3Q7IC8qIFNpZ25lZCBjb3VudCBvZiBtaWNyb3NlY29uZHMuICAqLworCitfX1NURF9UWVBFIF9fREFERFJfVF9UWVBFIF9fZGFkZHJfdDsJLyogVGhlIHR5cGUgb2YgYSBkaXNrIGFkZHJlc3MuICAqLworX19TVERfVFlQRSBfX1NXQkxLX1RfVFlQRSBfX3N3YmxrX3Q7CS8qIFR5cGUgb2YgYSBzd2FwIGJsb2NrIG1heWJlPyAgKi8KK19fU1REX1RZUEUgX19LRVlfVF9UWVBFIF9fa2V5X3Q7CS8qIFR5cGUgb2YgYW4gSVBDIGtleS4gICovCisKKy8qIENsb2NrIElEIHVzZWQgaW4gY2xvY2sgYW5kIHRpbWVyIGZ1bmN0aW9ucy4gICovCitfX1NURF9UWVBFIF9fQ0xPQ0tJRF9UX1RZUEUgX19jbG9ja2lkX3Q7CisKKy8qIFRpbWVyIElEIHJldHVybmVkIGJ5IGB0aW1lcl9jcmVhdGUnLiAgKi8KK19fU1REX1RZUEUgX19USU1FUl9UX1RZUEUgX190aW1lcl90OworCisvKiBUeXBlIHRvIHJlcHJlc2VudCBibG9jayBzaXplLiAgKi8KK19fU1REX1RZUEUgX19CTEtTSVpFX1RfVFlQRSBfX2Jsa3NpemVfdDsKKworLyogVHlwZXMgZnJvbSB0aGUgTGFyZ2UgRmlsZSBTdXBwb3J0IGludGVyZmFjZS4gICovCisKKy8qIFR5cGUgdG8gY291bnQgbnVtYmVyIG9mIGRpc2sgYmxvY2tzLiAgKi8KK19fU1REX1RZUEUgX19CTEtDTlRfVF9UWVBFIF9fYmxrY250X3Q7CitfX1NURF9UWVBFIF9fQkxLQ05UNjRfVF9UWVBFIF9fYmxrY250NjRfdDsKKworLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBibG9ja3MuICAqLworX19TVERfVFlQRSBfX0ZTQkxLQ05UX1RfVFlQRSBfX2ZzYmxrY250X3Q7CitfX1NURF9UWVBFIF9fRlNCTEtDTlQ2NF9UX1RZUEUgX19mc2Jsa2NudDY0X3Q7CisKKy8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gbm9kZXMuICAqLworX19TVERfVFlQRSBfX0ZTRklMQ05UX1RfVFlQRSBfX2ZzZmlsY250X3Q7CitfX1NURF9UWVBFIF9fRlNGSUxDTlQ2NF9UX1RZUEUgX19mc2ZpbGNudDY0X3Q7CisKK19fU1REX1RZUEUgX19TU0laRV9UX1RZUEUgX19zc2l6ZV90OyAvKiBUeXBlIG9mIGEgYnl0ZSBjb3VudCwgb3IgZXJyb3IuICAqLworCisvKiBUaGVzZSBmZXcgZG9uJ3QgcmVhbGx5IHZhcnkgYnkgc3lzdGVtLCB0aGV5IGFsd2F5cyBjb3JyZXNwb25kCisgICB0byBvbmUgb2YgdGhlIG90aGVyIGRlZmluZWQgdHlwZXMuICAqLwordHlwZWRlZiBfX29mZjY0X3QgX19sb2ZmX3Q7CS8qIFR5cGUgb2YgZmlsZSBzaXplcyBhbmQgb2Zmc2V0cyAoTEZTKS4gICovCit0eXBlZGVmIF9fcXVhZF90ICpfX3FhZGRyX3Q7Cit0eXBlZGVmIGNoYXIgKl9fY2FkZHJfdDsKKworLyogRHVwbGljYXRlcyBpbmZvIGZyb20gc3RkaW50LmggYnV0IHRoaXMgaXMgdXNlZCBpbiB1bmlzdGQuaC4gICovCitfX1NURF9UWVBFIF9fU1dPUkRfVFlQRSBfX2ludHB0cl90OworCisvKiBEdXBsaWNhdGUgaW5mbyBmcm9tIHN5cy9zb2NrZXQuaC4gICovCitfX1NURF9UWVBFIF9fVTMyX1RZUEUgX19zb2NrbGVuX3Q7CisKKworI3VuZGVmIF9fU1REX1RZUEUKKworI2VuZGlmIC8qIGJpdHMvdHlwZXMuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3R5cGVzaXplcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3R5cGVzaXplcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MjI2YzQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdHlwZXNpemVzLmgKQEAgLTAsMCArMSw2NiBAQAorLyogYml0cy90eXBlc2l6ZXMuaCAtLSB1bmRlcmx5aW5nIHR5cGVzIGZvciAqX3QuICBHZW5lcmljIHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0JJVFNfVFlQRVNfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy90eXBlc2l6ZXMuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3R5cGVzLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYJX0JJVFNfVFlQRVNJWkVTX0gKKyNkZWZpbmUJX0JJVFNfVFlQRVNJWkVTX0gJMQorCisvKiBTZWUgPGJpdHMvdHlwZXMuaD4gZm9yIHRoZSBtZWFuaW5nIG9mIHRoZXNlIG1hY3Jvcy4gIFRoaXMgZmlsZSBleGlzdHMgc28KKyAgIHRoYXQgPGJpdHMvdHlwZXMuaD4gbmVlZCBub3QgdmFyeSBhY3Jvc3MgZGlmZmVyZW50IEdOVSBwbGF0Zm9ybXMuICAqLworCisjZGVmaW5lIF9fREVWX1RfVFlQRQkJX19VUVVBRF9UWVBFCisjZGVmaW5lIF9fVUlEX1RfVFlQRQkJX19VMzJfVFlQRQorI2RlZmluZSBfX0dJRF9UX1RZUEUJCV9fVTMyX1RZUEUKKyNkZWZpbmUgX19JTk9fVF9UWVBFCQlfX1VMT05HV09SRF9UWVBFCisjZGVmaW5lIF9fSU5PNjRfVF9UWVBFCQlfX1VRVUFEX1RZUEUKKyNkZWZpbmUgX19NT0RFX1RfVFlQRQkJX19VMzJfVFlQRQorI2RlZmluZSBfX05MSU5LX1RfVFlQRQkJX19VV09SRF9UWVBFCisjZGVmaW5lIF9fT0ZGX1RfVFlQRQkJX19TTE9OR1dPUkRfVFlQRQorI2RlZmluZSBfX09GRjY0X1RfVFlQRQkJX19TUVVBRF9UWVBFCisjZGVmaW5lIF9fUElEX1RfVFlQRQkJX19TMzJfVFlQRQorI2RlZmluZSBfX1JMSU1fVF9UWVBFCQlfX1VMT05HV09SRF9UWVBFCisjZGVmaW5lIF9fUkxJTTY0X1RfVFlQRQkJX19VUVVBRF9UWVBFCisjZGVmaW5lCV9fQkxLQ05UX1RfVFlQRQkJX19TTE9OR1dPUkRfVFlQRQorI2RlZmluZQlfX0JMS0NOVDY0X1RfVFlQRQlfX1NRVUFEX1RZUEUKKyNkZWZpbmUJX19GU0JMS0NOVF9UX1RZUEUJX19VTE9OR1dPUkRfVFlQRQorI2RlZmluZQlfX0ZTQkxLQ05UNjRfVF9UWVBFCV9fVVFVQURfVFlQRQorI2RlZmluZQlfX0ZTRklMQ05UX1RfVFlQRQlfX1VMT05HV09SRF9UWVBFCisjZGVmaW5lCV9fRlNGSUxDTlQ2NF9UX1RZUEUJX19VUVVBRF9UWVBFCisjZGVmaW5lCV9fSURfVF9UWVBFCQlfX1UzMl9UWVBFCisjZGVmaW5lIF9fQ0xPQ0tfVF9UWVBFCQlfX1NMT05HV09SRF9UWVBFCisjZGVmaW5lIF9fVElNRV9UX1RZUEUJCV9fU0xPTkdXT1JEX1RZUEUKKyNkZWZpbmUgX19VU0VDT05EU19UX1RZUEUJX19VMzJfVFlQRQorI2RlZmluZSBfX1NVU0VDT05EU19UX1RZUEUJX19TTE9OR1dPUkRfVFlQRQorI2RlZmluZSBfX0RBRERSX1RfVFlQRQkJX19TMzJfVFlQRQorI2RlZmluZSBfX1NXQkxLX1RfVFlQRQkJX19TTE9OR1dPUkRfVFlQRQorI2RlZmluZSBfX0tFWV9UX1RZUEUJCV9fUzMyX1RZUEUKKyNkZWZpbmUgX19DTE9DS0lEX1RfVFlQRQlfX1MzMl9UWVBFCisjZGVmaW5lIF9fVElNRVJfVF9UWVBFCQl2b2lkICoKKyNkZWZpbmUgX19CTEtTSVpFX1RfVFlQRQlfX1NMT05HV09SRF9UWVBFCisjZGVmaW5lIF9fRlNJRF9UX1RZUEUJCXN0cnVjdCB7IGludCBfX3ZhbFsyXTsgfQorI2RlZmluZSBfX1NTSVpFX1RfVFlQRQkJX19TV09SRF9UWVBFCisKKy8qIE51bWJlciBvZiBkZXNjcmlwdG9ycyB0aGF0IGNhbiBmaXQgaW4gYW4gYGZkX3NldCcuICAqLworI2RlZmluZQlfX0ZEX1NFVFNJWkUJCTEwMjQKKworCisjZW5kaWYgLyogYml0cy90eXBlc2l6ZXMuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3Vpby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3Vpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZDc3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdWlvLmgKQEAgLTAsMCArMSw3NSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAyMDA2LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWYgIWRlZmluZWQgX1NZU19VSU9fSCAmJiAhZGVmaW5lZCBfRkNOVExfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy91aW8uaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3Vpby5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9CSVRTX1VJT19ICisjZGVmaW5lIF9CSVRTX1VJT19ICTEKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisKKy8qIFdlIHNob3VsZCBub3JtYWxseSB1c2UgdGhlIExpbnV4IGtlcm5lbCBoZWFkZXIgZmlsZSB0byBkZWZpbmUgdGhpcworICAgdHlwZSBhbmQgbWFjcm9zIGJ1dCB0aGlzIGNhbGxzIGZvciB0cm91YmxlIGJlY2F1c2Ugb2YgdGhlIGhlYWRlcgorICAgaW5jbHVkZXMgb3RoZXIga2VybmVsIGhlYWRlcnMuICAqLworCisvKiBTaXplIG9mIG9iamVjdCB3aGljaCBjYW4gYmUgd3JpdHRlbiBhdG9taWNhbGx5LgorCisgICBUaGlzIG1hY3JvIGhhcyBkaWZmZXJlbnQgdmFsdWVzIGluIGRpZmZlcmVudCBrZXJuZWwgdmVyc2lvbnMuICBUaGUKKyAgIGxhdGVzdCB2ZXJzaW9ucyBvZiB0aGUga2VybmVsIHVzZSAxMDI0IGFuZCB0aGlzIGlzIGdvb2QgY2hvaWNlLiAgU2luY2UKKyAgIHRoZSBDIGxpYnJhcnkgaW1wbGVtZW50YXRpb24gb2YgcmVhZHYvd3JpdGV2IGlzIGFibGUgdG8gZW11bGF0ZSB0aGUKKyAgIGZ1bmN0aW9uYWxpdHkgZXZlbiBpZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcga2VybmVsIGRvZXMgbm90IHN1cHBvcnQKKyAgIHRoaXMgbGFyZ2UgdmFsdWUgdGhlIHJlYWR2L3dyaXRldiBjYWxsIHdpbGwgbm90IGZhaWwgYmVjYXVzZSBvZiB0aGlzLiAgKi8KKyNkZWZpbmUgVUlPX01BWElPVgkxMDI0CisKKworLyogU3RydWN0dXJlIGZvciBzY2F0dGVyL2dhdGhlciBJL08uICAqLworc3RydWN0IGlvdmVjCisgIHsKKyAgICB2b2lkICppb3ZfYmFzZTsJLyogUG9pbnRlciB0byBkYXRhLiAgKi8KKyAgICBzaXplX3QgaW92X2xlbjsJLyogTGVuZ3RoIG9mIGRhdGEuICAqLworICB9OworCisjZW5kaWYKKworI2lmIGRlZmluZWQgX1NZU19VSU9fSCAmJiAhZGVmaW5lZCBfQklUU19VSU9fSF9GT1JfU1lTX1VJT19ICisjZGVmaW5lIF9CSVRTX1VJT19IX0ZPUl9TWVNfVUlPX0ggMQorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJlYWQgZnJvbSBhbm90aGVyIHByb2Nlc3MnIGFkZHJlc3Mgc3BhY2UuICAqLworZXh0ZXJuIHNzaXplX3QgcHJvY2Vzc192bV9yZWFkdiAocGlkX3QgX19waWQsIF9fY29uc3Qgc3RydWN0IGlvdmVjICpfX2x2ZWMsCisJCQkJIHVuc2lnbmVkIGxvbmcgaW50IF9fbGlvdmNudCwKKwkJCQkgX19jb25zdCBzdHJ1Y3QgaW92ZWMgKl9fcnZlYywKKwkJCQkgdW5zaWduZWQgbG9uZyBpbnQgX19yaW92Y250LAorCQkJCSB1bnNpZ25lZCBsb25nIGludCBfX2ZsYWdzKQorICBfX1RIUk9XOworCisvKiBXcml0ZSB0byBhbm90aGVyIHByb2Nlc3MnIGFkZHJlc3Mgc3BhY2UuICAqLworZXh0ZXJuIHNzaXplX3QgcHJvY2Vzc192bV93cml0ZXYgKHBpZF90IF9fcGlkLCBfX2NvbnN0IHN0cnVjdCBpb3ZlYyAqX19sdmVjLAorCQkJCSAgdW5zaWduZWQgbG9uZyBpbnQgX19saW92Y250LAorCQkJCSAgX19jb25zdCBzdHJ1Y3QgaW92ZWMgKl9fcnZlYywKKwkJCQkgIHVuc2lnbmVkIGxvbmcgaW50IF9fcmlvdmNudCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgaW50IF9fZmxhZ3MpCisgIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3VuaXN0ZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3VuaXN0ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyOWI0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdW5pc3RkLmgKQEAgLTAsMCArMSwzODYgQEAKKy8qIENoZWNraW5nIG1hY3JvcyBmb3IgdW5pc3RkIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfVU5JU1REX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvdW5pc3RkLmg+IGRpcmVjdGx5OyB1c2UgPHVuaXN0ZC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCitleHRlcm4gc3NpemVfdCBfX3JlYWRfY2hrIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcywKKwkJCSAgIHNpemVfdCBfX2J1ZmxlbikgX193dXI7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChfX3JlYWRfYWxpYXMsIChpbnQgX19mZCwgdm9pZCAqX19idWYsCisJCQkJCSAgc2l6ZV90IF9fbmJ5dGVzKSwgcmVhZCkgX193dXI7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChfX3JlYWRfY2hrX3dhcm4sCisJCQkgICAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsCisJCQkgICAgc2l6ZV90IF9fYnVmbGVuKSwgX19yZWFkX2NoaykKKyAgICAgX193dXIgX193YXJuYXR0ciAoInJlYWQgY2FsbGVkIHdpdGggYmlnZ2VyIGxlbmd0aCB0aGFuIHNpemUgb2YgIgorCQkgICAgICAgInRoZSBkZXN0aW5hdGlvbiBidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX3d1ciBzc2l6ZV90CityZWFkIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcykKK3sKKyAgaWYgKF9fYm9zMCAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbmJ5dGVzKSkKKwlyZXR1cm4gX19yZWFkX2NoayAoX19mZCwgX19idWYsIF9fbmJ5dGVzLCBfX2JvczAgKF9fYnVmKSk7CisKKyAgICAgIGlmIChfX25ieXRlcyA+IF9fYm9zMCAoX19idWYpKQorCXJldHVybiBfX3JlYWRfY2hrX3dhcm4gKF9fZmQsIF9fYnVmLCBfX25ieXRlcywgX19ib3MwIChfX2J1ZikpOworICAgIH0KKyAgcmV0dXJuIF9fcmVhZF9hbGlhcyAoX19mZCwgX19idWYsIF9fbmJ5dGVzKTsKK30KKworI2lmZGVmIF9fVVNFX1VOSVg5OAorZXh0ZXJuIHNzaXplX3QgX19wcmVhZF9jaGsgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzLAorCQkJICAgIF9fb2ZmX3QgX19vZmZzZXQsIHNpemVfdCBfX2J1ZnNpemUpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19wcmVhZDY0X2NoayAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsCisJCQkgICAgICBfX29mZjY0X3QgX19vZmZzZXQsIHNpemVfdCBfX2J1ZnNpemUpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAoX19wcmVhZF9hbGlhcywKKwkJCSAgIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcywKKwkJCSAgICBfX29mZl90IF9fb2Zmc2V0KSwgcHJlYWQpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAoX19wcmVhZDY0X2FsaWFzLAorCQkJICAgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzLAorCQkJICAgIF9fb2ZmNjRfdCBfX29mZnNldCksIHByZWFkNjQpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAoX19wcmVhZF9jaGtfd2FybiwKKwkJCSAgIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcywKKwkJCSAgICBfX29mZl90IF9fb2Zmc2V0LCBzaXplX3QgX19idWZzaXplKSwgX19wcmVhZF9jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJwcmVhZCBjYWxsZWQgd2l0aCBiaWdnZXIgbGVuZ3RoIHRoYW4gc2l6ZSBvZiAiCisJCSAgICAgICAidGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAoX19wcmVhZDY0X2Noa193YXJuLAorCQkJICAgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzLAorCQkJICAgIF9fb2ZmNjRfdCBfX29mZnNldCwgc2l6ZV90IF9fYnVmc2l6ZSksCisJCQkgICAgX19wcmVhZDY0X2NoaykKKyAgICAgX193dXIgX193YXJuYXR0ciAoInByZWFkNjQgY2FsbGVkIHdpdGggYmlnZ2VyIGxlbmd0aCB0aGFuIHNpemUgb2YgIgorCQkgICAgICAgInRoZSBkZXN0aW5hdGlvbiBidWZmZXIiKTsKKworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorX19leHRlcm5fYWx3YXlzX2lubGluZSBfX3d1ciBzc2l6ZV90CitwcmVhZCAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsIF9fb2ZmX3QgX19vZmZzZXQpCit7CisgIGlmIChfX2JvczAgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX25ieXRlcykpCisJcmV0dXJuIF9fcHJlYWRfY2hrIChfX2ZkLCBfX2J1ZiwgX19uYnl0ZXMsIF9fb2Zmc2V0LCBfX2JvczAgKF9fYnVmKSk7CisKKyAgICAgIGlmICggX19uYnl0ZXMgPiBfX2JvczAgKF9fYnVmKSkKKwlyZXR1cm4gX19wcmVhZF9jaGtfd2FybiAoX19mZCwgX19idWYsIF9fbmJ5dGVzLCBfX29mZnNldCwKKwkJCQkgX19ib3MwIChfX2J1ZikpOworICAgIH0KKyAgcmV0dXJuIF9fcHJlYWRfYWxpYXMgKF9fZmQsIF9fYnVmLCBfX25ieXRlcywgX19vZmZzZXQpOworfQorIyBlbHNlCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIHNzaXplX3QKK3ByZWFkIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcywgX19vZmY2NF90IF9fb2Zmc2V0KQoreworICBpZiAoX19ib3MwIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uYnl0ZXMpKQorCXJldHVybiBfX3ByZWFkNjRfY2hrIChfX2ZkLCBfX2J1ZiwgX19uYnl0ZXMsIF9fb2Zmc2V0LCBfX2JvczAgKF9fYnVmKSk7CisKKyAgICAgIGlmICggX19uYnl0ZXMgPiBfX2JvczAgKF9fYnVmKSkKKwlyZXR1cm4gX19wcmVhZDY0X2Noa193YXJuIChfX2ZkLCBfX2J1ZiwgX19uYnl0ZXMsIF9fb2Zmc2V0LAorCQkJCSAgIF9fYm9zMCAoX19idWYpKTsKKyAgICB9CisKKyAgcmV0dXJuIF9fcHJlYWQ2NF9hbGlhcyAoX19mZCwgX19idWYsIF9fbmJ5dGVzLCBfX29mZnNldCk7Cit9CisjIGVuZGlmCisKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgc3NpemVfdAorcHJlYWQ2NCAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsIF9fb2ZmNjRfdCBfX29mZnNldCkKK3sKKyAgaWYgKF9fYm9zMCAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbmJ5dGVzKSkKKwlyZXR1cm4gX19wcmVhZDY0X2NoayAoX19mZCwgX19idWYsIF9fbmJ5dGVzLCBfX29mZnNldCwgX19ib3MwIChfX2J1ZikpOworCisgICAgICBpZiAoIF9fbmJ5dGVzID4gX19ib3MwIChfX2J1ZikpCisJcmV0dXJuIF9fcHJlYWQ2NF9jaGtfd2FybiAoX19mZCwgX19idWYsIF9fbmJ5dGVzLCBfX29mZnNldCwKKwkJCQkgICBfX2JvczAgKF9fYnVmKSk7CisgICAgfQorCisgIHJldHVybiBfX3ByZWFkNjRfYWxpYXMgKF9fZmQsIF9fYnVmLCBfX25ieXRlcywgX19vZmZzZXQpOworfQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworZXh0ZXJuIHNzaXplX3QgX19yZWFkbGlua19jaGsgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsCisJCQkgICAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbGVuLAorCQkJICAgICAgIHNpemVfdCBfX2J1ZmxlbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSkgX193dXI7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUX05USCAoX19yZWFkbGlua19hbGlhcywKKwkJCSAgICAgICAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGF0aCwKKwkJCQljaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19sZW4pLCByZWFkbGluaykKKyAgICAgX19ub25udWxsICgoMSwgMikpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVF9OVEggKF9fcmVhZGxpbmtfY2hrX3dhcm4sCisJCQkgICAgICAgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsCisJCQkJY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbGVuLAorCQkJCXNpemVfdCBfX2J1ZmxlbiksIF9fcmVhZGxpbmtfY2hrKQorICAgICBfX25vbm51bGwgKCgxLCAyKSkgX193dXIgX193YXJuYXR0ciAoInJlYWRsaW5rIGNhbGxlZCB3aXRoIGJpZ2dlciBsZW5ndGggIgorCQkJCQkgICJ0aGFuIHNpemUgb2YgZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX19ub25udWxsICgoMSwgMikpIF9fd3VyIHNzaXplX3QKK19fTlRIIChyZWFkbGluayAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGF0aCwgY2hhciAqX19yZXN0cmljdCBfX2J1ZiwKKwkJIHNpemVfdCBfX2xlbikpCit7CisgIGlmIChfX2JvcyAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbGVuKSkKKwlyZXR1cm4gX19yZWFkbGlua19jaGsgKF9fcGF0aCwgX19idWYsIF9fbGVuLCBfX2JvcyAoX19idWYpKTsKKworICAgICAgaWYgKCBfX2xlbiA+IF9fYm9zIChfX2J1ZikpCisJcmV0dXJuIF9fcmVhZGxpbmtfY2hrX3dhcm4gKF9fcGF0aCwgX19idWYsIF9fbGVuLCBfX2JvcyAoX19idWYpKTsKKyAgICB9CisgIHJldHVybiBfX3JlYWRsaW5rX2FsaWFzIChfX3BhdGgsIF9fYnVmLCBfX2xlbik7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0FURklMRQorZXh0ZXJuIHNzaXplX3QgX19yZWFkbGlua2F0X2NoayAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsCisJCQkJIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2xlbiwKKwkJCQkgc2l6ZV90IF9fYnVmbGVuKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDMpKSBfX3d1cjsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3JlYWRsaW5rYXRfYWxpYXMsCisJCQkgICAgICAgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wYXRoLAorCQkJCWNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2xlbiksCisJCQkgICAgICAgcmVhZGxpbmthdCkKKyAgICAgX19ub25udWxsICgoMiwgMykpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVF9OVEggKF9fcmVhZGxpbmthdF9jaGtfd2FybiwKKwkJCSAgICAgICAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsCisJCQkJY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbGVuLAorCQkJCXNpemVfdCBfX2J1ZmxlbiksIF9fcmVhZGxpbmthdF9jaGspCisgICAgIF9fbm9ubnVsbCAoKDIsIDMpKSBfX3d1ciBfX3dhcm5hdHRyICgicmVhZGxpbmthdCBjYWxsZWQgd2l0aCBiaWdnZXIgIgorCQkJCQkgICJsZW5ndGggdGhhbiBzaXplIG9mIGRlc3RpbmF0aW9uICIKKwkJCQkJICAiYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX19ub25udWxsICgoMiwgMykpIF9fd3VyIHNzaXplX3QKK19fTlRIIChyZWFkbGlua2F0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGF0aCwKKwkJICAgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbGVuKSkKK3sKKyAgaWYgKF9fYm9zIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19sZW4pKQorCXJldHVybiBfX3JlYWRsaW5rYXRfY2hrIChfX2ZkLCBfX3BhdGgsIF9fYnVmLCBfX2xlbiwgX19ib3MgKF9fYnVmKSk7CisKKyAgICAgIGlmIChfX2xlbiA+IF9fYm9zIChfX2J1ZikpCisJcmV0dXJuIF9fcmVhZGxpbmthdF9jaGtfd2FybiAoX19mZCwgX19wYXRoLCBfX2J1ZiwgX19sZW4sCisJCQkJICAgICAgX19ib3MgKF9fYnVmKSk7CisgICAgfQorICByZXR1cm4gX19yZWFkbGlua2F0X2FsaWFzIChfX2ZkLCBfX3BhdGgsIF9fYnVmLCBfX2xlbik7Cit9CisjZW5kaWYKKworZXh0ZXJuIGNoYXIgKl9fZ2V0Y3dkX2NoayAoY2hhciAqX19idWYsIHNpemVfdCBfX3NpemUsIHNpemVfdCBfX2J1ZmxlbikKKyAgICAgX19USFJPVyBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUX05USCAoX19nZXRjd2RfYWxpYXMsCisJCQkgICAgIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fc2l6ZSksIGdldGN3ZCkgX193dXI7CitleHRlcm4gY2hhciAqX19SRURJUkVDVF9OVEggKF9fZ2V0Y3dkX2Noa193YXJuLAorCQkJICAgICAoY2hhciAqX19idWYsIHNpemVfdCBfX3NpemUsIHNpemVfdCBfX2J1ZmxlbiksCisJCQkgICAgIF9fZ2V0Y3dkX2NoaykKKyAgICAgX193dXIgX193YXJuYXR0ciAoImdldGN3ZCBjYWxsZXIgd2l0aCBiaWdnZXIgbGVuZ3RoIHRoYW4gc2l6ZSBvZiAiCisJCSAgICAgICAiZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgY2hhciAqCitfX05USCAoZ2V0Y3dkIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fc2l6ZSkpCit7CisgIGlmIChfX2JvcyAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fc2l6ZSkpCisJcmV0dXJuIF9fZ2V0Y3dkX2NoayAoX19idWYsIF9fc2l6ZSwgX19ib3MgKF9fYnVmKSk7CisKKyAgICAgIGlmIChfX3NpemUgPiBfX2JvcyAoX19idWYpKQorCXJldHVybiBfX2dldGN3ZF9jaGtfd2FybiAoX19idWYsIF9fc2l6ZSwgX19ib3MgKF9fYnVmKSk7CisgICAgfQorICByZXR1cm4gX19nZXRjd2RfYWxpYXMgKF9fYnVmLCBfX3NpemUpOworfQorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorZXh0ZXJuIGNoYXIgKl9fZ2V0d2RfY2hrIChjaGFyICpfX2J1Ziwgc2l6ZV90IGJ1ZmxlbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CitleHRlcm4gY2hhciAqX19SRURJUkVDVF9OVEggKF9fZ2V0d2Rfd2FybiwgKGNoYXIgKl9fYnVmKSwgZ2V0d2QpCisgICAgIF9fbm9ubnVsbCAoKDEpKSBfX3d1ciBfX3dhcm5hdHRyICgicGxlYXNlIHVzZSBnZXRjd2QgaW5zdGVhZCwgYXMgZ2V0d2QgIgorCQkJCSAgICAgICAiZG9lc24ndCBzcGVjaWZ5IGJ1ZmZlciBzaXplIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX19ub25udWxsICgoMSkpIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXyBfX3d1ciBjaGFyICoKK19fTlRIIChnZXR3ZCAoY2hhciAqX19idWYpKQoreworICBpZiAoX19ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICByZXR1cm4gX19nZXR3ZF9jaGsgKF9fYnVmLCBfX2JvcyAoX19idWYpKTsKKyAgcmV0dXJuIF9fZ2V0d2Rfd2FybiAoX19idWYpOworfQorI2VuZGlmCisKK2V4dGVybiBzaXplX3QgX19jb25mc3RyX2NoayAoaW50IF9fbmFtZSwgY2hhciAqX19idWYsIHNpemVfdCBfX2xlbiwKKwkJCSAgICAgc2l6ZV90IF9fYnVmbGVuKSBfX1RIUk9XOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX19jb25mc3RyX2FsaWFzLCAoaW50IF9fbmFtZSwgY2hhciAqX19idWYsCisJCQkJCQlzaXplX3QgX19sZW4pLCBjb25mc3RyKTsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fY29uZnN0cl9jaGtfd2FybiwKKwkJCSAgICAgIChpbnQgX19uYW1lLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fbGVuLAorCQkJICAgICAgIHNpemVfdCBfX2J1ZmxlbiksIF9fY29uZnN0cl9jaGspCisgICAgIF9fd2FybmF0dHIgKCJjb25mc3RyIGNhbGxlZCB3aXRoIGJpZ2dlciBsZW5ndGggdGhhbiBzaXplIG9mIGRlc3RpbmF0aW9uICIKKwkJICJidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBzaXplX3QKK19fTlRIIChjb25mc3RyIChpbnQgX19uYW1lLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fbGVuKSkKK3sKKyAgaWYgKF9fYm9zIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19sZW4pKQorCXJldHVybiBfX2NvbmZzdHJfY2hrIChfX25hbWUsIF9fYnVmLCBfX2xlbiwgX19ib3MgKF9fYnVmKSk7CisKKyAgICAgIGlmIChfX2JvcyAoX19idWYpIDwgX19sZW4pCisJcmV0dXJuIF9fY29uZnN0cl9jaGtfd2FybiAoX19uYW1lLCBfX2J1ZiwgX19sZW4sIF9fYm9zIChfX2J1ZikpOworICAgIH0KKyAgcmV0dXJuIF9fY29uZnN0cl9hbGlhcyAoX19uYW1lLCBfX2J1ZiwgX19sZW4pOworfQorCisKK2V4dGVybiBpbnQgX19nZXRncm91cHNfY2hrIChpbnQgX19zaXplLCBfX2dpZF90IF9fbGlzdFtdLCBzaXplX3QgX19saXN0bGVuKQorICAgICBfX1RIUk9XIF9fd3VyOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX19nZXRncm91cHNfYWxpYXMsIChpbnQgX19zaXplLCBfX2dpZF90IF9fbGlzdFtdKSwKKwkJCSAgIGdldGdyb3VwcykgX193dXI7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX2dldGdyb3Vwc19jaGtfd2FybiwKKwkJCSAgIChpbnQgX19zaXplLCBfX2dpZF90IF9fbGlzdFtdLCBzaXplX3QgX19saXN0bGVuKSwKKwkJCSAgIF9fZ2V0Z3JvdXBzX2NoaykKKyAgICAgX193dXIgX193YXJuYXR0ciAoImdldGdyb3VwcyBjYWxsZWQgd2l0aCBiaWdnZXIgZ3JvdXAgY291bnQgdGhhbiB3aGF0ICIKKwkJICAgICAgICJjYW4gZml0IGludG8gZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAoZ2V0Z3JvdXBzIChpbnQgX19zaXplLCBfX2dpZF90IF9fbGlzdFtdKSkKK3sKKyAgaWYgKF9fYm9zIChfX2xpc3QpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fc2l6ZSkgfHwgX19zaXplIDwgMCkKKwlyZXR1cm4gX19nZXRncm91cHNfY2hrIChfX3NpemUsIF9fbGlzdCwgX19ib3MgKF9fbGlzdCkpOworCisgICAgICBpZiAoX19zaXplICogc2l6ZW9mIChfX2dpZF90KSA+IF9fYm9zIChfX2xpc3QpKQorCXJldHVybiBfX2dldGdyb3Vwc19jaGtfd2FybiAoX19zaXplLCBfX2xpc3QsIF9fYm9zIChfX2xpc3QpKTsKKyAgICB9CisgIHJldHVybiBfX2dldGdyb3Vwc19hbGlhcyAoX19zaXplLCBfX2xpc3QpOworfQorCisKK2V4dGVybiBpbnQgX190dHluYW1lX3JfY2hrIChpbnQgX19mZCwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICBzaXplX3QgX19ucmVhbCkgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX3R0eW5hbWVfcl9hbGlhcywgKGludCBfX2ZkLCBjaGFyICpfX2J1ZiwKKwkJCQkJICAgICAgIHNpemVfdCBfX2J1ZmxlbiksIHR0eW5hbWVfcikKKyAgICAgX19ub25udWxsICgoMikpOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX190dHluYW1lX3JfY2hrX3dhcm4sCisJCQkgICAoaW50IF9fZmQsIGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4sCisJCQkgICAgc2l6ZV90IF9fbnJlYWwpLCBfX3R0eW5hbWVfcl9jaGspCisgICAgIF9fbm9ubnVsbCAoKDIpKSBfX3dhcm5hdHRyICgidHR5bmFtZV9yIGNhbGxlZCB3aXRoIGJpZ2dlciBidWZsZW4gdGhhbiAiCisJCQkJICJzaXplIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKHR0eW5hbWVfciAoaW50IF9fZmQsIGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4pKQoreworICBpZiAoX19ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2J1ZmxlbikpCisJcmV0dXJuIF9fdHR5bmFtZV9yX2NoayAoX19mZCwgX19idWYsIF9fYnVmbGVuLCBfX2JvcyAoX19idWYpKTsKKworICAgICAgaWYgKF9fYnVmbGVuID4gX19ib3MgKF9fYnVmKSkKKwlyZXR1cm4gX190dHluYW1lX3JfY2hrX3dhcm4gKF9fZmQsIF9fYnVmLCBfX2J1ZmxlbiwgX19ib3MgKF9fYnVmKSk7CisgICAgfQorICByZXR1cm4gX190dHluYW1lX3JfYWxpYXMgKF9fZmQsIF9fYnVmLCBfX2J1Zmxlbik7Cit9CisKKworI2lmIGRlZmluZWQgX19VU0VfUkVFTlRSQU5UIHx8IGRlZmluZWQgX19VU0VfUE9TSVgxOTk1MDYKK2V4dGVybiBpbnQgX19nZXRsb2dpbl9yX2NoayAoY2hhciAqX19idWYsIHNpemVfdCBfX2J1Zmxlbiwgc2l6ZV90IF9fbnJlYWwpCisgICAgIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoX19nZXRsb2dpbl9yX2FsaWFzLCAoY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbiksCisJCSAgICAgICBnZXRsb2dpbl9yKSBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKF9fZ2V0bG9naW5fcl9jaGtfd2FybiwKKwkJICAgICAgIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLCBzaXplX3QgX19ucmVhbCksCisJCSAgICAgICBfX2dldGxvZ2luX3JfY2hrKQorICAgICBfX25vbm51bGwgKCgxKSkgX193YXJuYXR0ciAoImdldGxvZ2luX3IgY2FsbGVkIHdpdGggYmlnZ2VyIGJ1ZmxlbiB0aGFuICIKKwkJCQkgInNpemUgb2YgZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitnZXRsb2dpbl9yIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKQoreworICBpZiAoX19ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2J1ZmxlbikpCisJcmV0dXJuIF9fZ2V0bG9naW5fcl9jaGsgKF9fYnVmLCBfX2J1ZmxlbiwgX19ib3MgKF9fYnVmKSk7CisKKyAgICAgIGlmIChfX2J1ZmxlbiA+IF9fYm9zIChfX2J1ZikpCisJcmV0dXJuIF9fZ2V0bG9naW5fcl9jaGtfd2FybiAoX19idWYsIF9fYnVmbGVuLCBfX2JvcyAoX19idWYpKTsKKyAgICB9CisgIHJldHVybiBfX2dldGxvZ2luX3JfYWxpYXMgKF9fYnVmLCBfX2J1Zmxlbik7Cit9CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9VTklYOTgKK2V4dGVybiBpbnQgX19nZXRob3N0bmFtZV9jaGsgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4sIHNpemVfdCBfX25yZWFsKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fZ2V0aG9zdG5hbWVfYWxpYXMsIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKSwKKwkJCSAgIGdldGhvc3RuYW1lKSBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX2dldGhvc3RuYW1lX2Noa193YXJuLAorCQkJICAgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4sIHNpemVfdCBfX25yZWFsKSwKKwkJCSAgIF9fZ2V0aG9zdG5hbWVfY2hrKQorICAgICBfX25vbm51bGwgKCgxKSkgX193YXJuYXR0ciAoImdldGhvc3RuYW1lIGNhbGxlZCB3aXRoIGJpZ2dlciBidWZsZW4gdGhhbiAiCisJCQkJICJzaXplIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKGdldGhvc3RuYW1lIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKSkKK3sKKyAgaWYgKF9fYm9zIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19idWZsZW4pKQorCXJldHVybiBfX2dldGhvc3RuYW1lX2NoayAoX19idWYsIF9fYnVmbGVuLCBfX2JvcyAoX19idWYpKTsKKworICAgICAgaWYgKF9fYnVmbGVuID4gX19ib3MgKF9fYnVmKSkKKwlyZXR1cm4gX19nZXRob3N0bmFtZV9jaGtfd2FybiAoX19idWYsIF9fYnVmbGVuLCBfX2JvcyAoX19idWYpKTsKKyAgICB9CisgIHJldHVybiBfX2dldGhvc3RuYW1lX2FsaWFzIChfX2J1ZiwgX19idWZsZW4pOworfQorI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IChkZWZpbmVkIF9fVVNFX1hPUEVOICYmICFkZWZpbmVkIF9fVVNFX1VOSVg5OCkKK2V4dGVybiBpbnQgX19nZXRkb21haW5uYW1lX2NoayAoY2hhciAqX19idWYsIHNpemVfdCBfX2J1Zmxlbiwgc2l6ZV90IF9fbnJlYWwpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX19nZXRkb21haW5uYW1lX2FsaWFzLCAoY2hhciAqX19idWYsCisJCQkJCQkgICBzaXplX3QgX19idWZsZW4pLAorCQkJICAgZ2V0ZG9tYWlubmFtZSkgX19ub25udWxsICgoMSkpIF9fd3VyOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX19nZXRkb21haW5uYW1lX2Noa193YXJuLAorCQkJICAgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4sIHNpemVfdCBfX25yZWFsKSwKKwkJCSAgIF9fZ2V0ZG9tYWlubmFtZV9jaGspCisgICAgIF9fbm9ubnVsbCAoKDEpKSBfX3d1ciBfX3dhcm5hdHRyICgiZ2V0ZG9tYWlubmFtZSBjYWxsZWQgd2l0aCBiaWdnZXIgIgorCQkJCSAgICAgICAiYnVmbGVuIHRoYW4gc2l6ZSBvZiBkZXN0aW5hdGlvbiAiCisJCQkJICAgICAgICJidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIIChnZXRkb21haW5uYW1lIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKSkKK3sKKyAgaWYgKF9fYm9zIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19idWZsZW4pKQorCXJldHVybiBfX2dldGRvbWFpbm5hbWVfY2hrIChfX2J1ZiwgX19idWZsZW4sIF9fYm9zIChfX2J1ZikpOworCisgICAgICBpZiAoX19idWZsZW4gPiBfX2JvcyAoX19idWYpKQorCXJldHVybiBfX2dldGRvbWFpbm5hbWVfY2hrX3dhcm4gKF9fYnVmLCBfX2J1ZmxlbiwgX19ib3MgKF9fYnVmKSk7CisgICAgfQorICByZXR1cm4gX19nZXRkb21haW5uYW1lX2FsaWFzIChfX2J1ZiwgX19idWZsZW4pOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdXN0YXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy91c3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YzZiNzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdXN0YXQuaApAQCAtMCwwICsxLDMxIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19VU1RBVF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3VzdGF0Lmg+IGRpcmVjdGx5OyB1c2UgPHN5cy91c3RhdC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK3N0cnVjdCB1c3RhdAorICB7CisgICAgX19kYWRkcl90IGZfdGZyZWU7CQkvKiBOdW1iZXIgb2YgZnJlZSBibG9ja3MuICAqLworICAgIF9faW5vX3QgZl90aW5vZGU7CQkvKiBOdW1iZXIgb2YgZnJlZSBpbm9kZXMuICAqLworICAgIGNoYXIgZl9mbmFtZVs2XTsKKyAgICBjaGFyIGZfZnBhY2tbNl07CisgIH07CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdXRtcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3V0bXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODU1YWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3V0bXAuaApAQCAtMCwwICsxLDEyNSBAQAorLyogVGhlIGBzdHJ1Y3QgdXRtcCcgdHlwZSwgZGVzY3JpYmluZyBlbnRyaWVzIGluIHRoZSB1dG1wIGZpbGUuICBHTlUgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMgorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1VUTVBfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy91dG1wLmg+IGRpcmVjdGx5OyB1c2UgPHV0bXAuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPHBhdGhzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKworI2RlZmluZSBVVF9MSU5FU0laRQkzMgorI2RlZmluZSBVVF9OQU1FU0laRQkzMgorI2RlZmluZSBVVF9IT1NUU0laRQkyNTYKKworCisvKiBUaGUgc3RydWN0dXJlIGRlc2NyaWJpbmcgYW4gZW50cnkgaW4gdGhlIGRhdGFiYXNlIG9mCisgICBwcmV2aW91cyBsb2dpbnMuICAqLworc3RydWN0IGxhc3Rsb2cKKyAgeworI2lmIF9fV09SRFNJWkUgPT0gNjQgJiYgZGVmaW5lZCBfX1dPUkRTSVpFX0NPTVBBVDMyCisgICAgaW50MzJfdCBsbF90aW1lOworI2Vsc2UKKyAgICBfX3RpbWVfdCBsbF90aW1lOworI2VuZGlmCisgICAgY2hhciBsbF9saW5lW1VUX0xJTkVTSVpFXTsKKyAgICBjaGFyIGxsX2hvc3RbVVRfSE9TVFNJWkVdOworICB9OworCisKKy8qIFRoZSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgc3RhdHVzIG9mIGEgdGVybWluYXRlZCBwcm9jZXNzLiAgVGhpcworICAgdHlwZSBpcyB1c2VkIGluIGBzdHJ1Y3QgdXRtcCcgYmVsb3cuICAqLworc3RydWN0IGV4aXRfc3RhdHVzCisgIHsKKyAgICBzaG9ydCBpbnQgZV90ZXJtaW5hdGlvbjsJLyogUHJvY2VzcyB0ZXJtaW5hdGlvbiBzdGF0dXMuICAqLworICAgIHNob3J0IGludCBlX2V4aXQ7CQkvKiBQcm9jZXNzIGV4aXQgc3RhdHVzLiAgKi8KKyAgfTsKKworCisvKiBUaGUgc3RydWN0dXJlIGRlc2NyaWJpbmcgYW4gZW50cnkgaW4gdGhlIHVzZXIgYWNjb3VudGluZyBkYXRhYmFzZS4gICovCitzdHJ1Y3QgdXRtcAoreworICBzaG9ydCBpbnQgdXRfdHlwZTsJCS8qIFR5cGUgb2YgbG9naW4uICAqLworICBwaWRfdCB1dF9waWQ7CQkJLyogUHJvY2VzcyBJRCBvZiBsb2dpbiBwcm9jZXNzLiAgKi8KKyAgY2hhciB1dF9saW5lW1VUX0xJTkVTSVpFXTsJLyogRGV2aWNlbmFtZS4gICovCisgIGNoYXIgdXRfaWRbNF07CQkvKiBJbml0dGFiIElELiAgKi8KKyAgY2hhciB1dF91c2VyW1VUX05BTUVTSVpFXTsJLyogVXNlcm5hbWUuICAqLworICBjaGFyIHV0X2hvc3RbVVRfSE9TVFNJWkVdOwkvKiBIb3N0bmFtZSBmb3IgcmVtb3RlIGxvZ2luLiAgKi8KKyAgc3RydWN0IGV4aXRfc3RhdHVzIHV0X2V4aXQ7CS8qIEV4aXQgc3RhdHVzIG9mIGEgcHJvY2VzcyBtYXJrZWQKKwkJCQkgICBhcyBERUFEX1BST0NFU1MuICAqLworLyogVGhlIHV0X3Nlc3Npb24gYW5kIHV0X3R2IGZpZWxkcyBtdXN0IGJlIHRoZSBzYW1lIHNpemUgd2hlbiBjb21waWxlZAorICAgMzItIGFuZCA2NC1iaXQuICBUaGlzIGFsbG93cyBkYXRhIGZpbGVzIGFuZCBzaGFyZWQgbWVtb3J5IHRvIGJlCisgICBzaGFyZWQgYmV0d2VlbiAzMi0gYW5kIDY0LWJpdCBhcHBsaWNhdGlvbnMuICAqLworI2lmIF9fV09SRFNJWkUgPT0gNjQgJiYgZGVmaW5lZCBfX1dPUkRTSVpFX0NPTVBBVDMyCisgIGludDMyX3QgdXRfc2Vzc2lvbjsJCS8qIFNlc3Npb24gSUQsIHVzZWQgZm9yIHdpbmRvd2luZy4gICovCisgIHN0cnVjdAorICB7CisgICAgaW50MzJfdCB0dl9zZWM7CQkvKiBTZWNvbmRzLiAgKi8KKyAgICBpbnQzMl90IHR2X3VzZWM7CQkvKiBNaWNyb3NlY29uZHMuICAqLworICB9IHV0X3R2OwkJCS8qIFRpbWUgZW50cnkgd2FzIG1hZGUuICAqLworI2Vsc2UKKyAgbG9uZyBpbnQgdXRfc2Vzc2lvbjsJCS8qIFNlc3Npb24gSUQsIHVzZWQgZm9yIHdpbmRvd2luZy4gICovCisgIHN0cnVjdCB0aW1ldmFsIHV0X3R2OwkJLyogVGltZSBlbnRyeSB3YXMgbWFkZS4gICovCisjZW5kaWYKKworICBpbnQzMl90IHV0X2FkZHJfdjZbNF07CS8qIEludGVybmV0IGFkZHJlc3Mgb2YgcmVtb3RlIGhvc3QuICAqLworICBjaGFyIF9fdW51c2VkWzIwXTsJCS8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAgKi8KK307CisKKy8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGhhY2tzLiAgKi8KKyNkZWZpbmUgdXRfbmFtZQkJdXRfdXNlcgorI2lmbmRlZiBfTk9fVVRfVElNRQorLyogV2UgaGF2ZSBhIHByb2JsZW0gaGVyZTogYHV0X3RpbWUnIGlzIGFsc28gdXNlZCBvdGhlcndpc2UuICBEZWZpbmUKKyAgIF9OT19VVF9USU1FIGlmIHRoZSBjb21waWxlciBjb21wbGFpbnMuICAqLworIyBkZWZpbmUgdXRfdGltZQl1dF90di50dl9zZWMKKyNlbmRpZgorI2RlZmluZSB1dF94dGltZQl1dF90di50dl9zZWMKKyNkZWZpbmUgdXRfYWRkcgkJdXRfYWRkcl92NlswXQorCisKKy8qIFZhbHVlcyBmb3IgdGhlIGB1dF90eXBlJyBmaWVsZCBvZiBhIGBzdHJ1Y3QgdXRtcCcuICAqLworI2RlZmluZSBFTVBUWQkJMAkvKiBObyB2YWxpZCB1c2VyIGFjY291bnRpbmcgaW5mb3JtYXRpb24uICAqLworCisjZGVmaW5lIFJVTl9MVkwJCTEJLyogVGhlIHN5c3RlbSdzIHJ1bmxldmVsLiAgKi8KKyNkZWZpbmUgQk9PVF9USU1FCTIJLyogVGltZSBvZiBzeXN0ZW0gYm9vdC4gICovCisjZGVmaW5lIE5FV19USU1FCTMJLyogVGltZSBhZnRlciBzeXN0ZW0gY2xvY2sgY2hhbmdlZC4gICovCisjZGVmaW5lIE9MRF9USU1FCTQJLyogVGltZSB3aGVuIHN5c3RlbSBjbG9jayBjaGFuZ2VkLiAgKi8KKworI2RlZmluZSBJTklUX1BST0NFU1MJNQkvKiBQcm9jZXNzIHNwYXduZWQgYnkgdGhlIGluaXQgcHJvY2Vzcy4gICovCisjZGVmaW5lIExPR0lOX1BST0NFU1MJNgkvKiBTZXNzaW9uIGxlYWRlciBvZiBhIGxvZ2dlZCBpbiB1c2VyLiAgKi8KKyNkZWZpbmUgVVNFUl9QUk9DRVNTCTcJLyogTm9ybWFsIHByb2Nlc3MuICAqLworI2RlZmluZSBERUFEX1BST0NFU1MJOAkvKiBUZXJtaW5hdGVkIHByb2Nlc3MuICAqLworCisjZGVmaW5lIEFDQ09VTlRJTkcJOQorCisvKiBPbGQgTGludXggbmFtZSBmb3IgdGhlIEVNUFRZIHR5cGUuICAqLworI2RlZmluZSBVVF9VTktOT1dOCUVNUFRZCisKKworLyogVGVsbCB0aGUgdXNlciB0aGF0IHdlIGhhdmUgYSBtb2Rlcm4gc3lzdGVtIHdpdGggVVRfSE9TVCwgVVRfUElELAorICAgVVRfVFlQRSwgVVRfSUQgYW5kIFVUX1RWIGZpZWxkcy4gICovCisjZGVmaW5lIF9IQVZFX1VUX1RZUEUJMQorI2RlZmluZSBfSEFWRV9VVF9QSUQJMQorI2RlZmluZSBfSEFWRV9VVF9JRAkxCisjZGVmaW5lIF9IQVZFX1VUX1RWCTEKKyNkZWZpbmUgX0hBVkVfVVRfSE9TVAkxCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdXRtcHguaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy91dG1weC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NGNkYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdXRtcHguaApAQCAtMCwwICsxLDEwMyBAQAorLyogU3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMgZm9yIHRoZSB1c2VyIGFjY291bnRpbmcgZGF0YWJhc2UuICBHTlUgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMjAwMCwgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfVVRNUFhfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy91dG1weC5oPiBkaXJlY3RseTsgdXNlIDx1dG1weC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisKKyNpZmRlZiBfX1VTRV9HTlUKKyMgaW5jbHVkZSA8cGF0aHMuaD4KKyMgZGVmaW5lIF9QQVRIX1VUTVBYCV9QQVRIX1VUTVAKKyMgZGVmaW5lIF9QQVRIX1dUTVBYCV9QQVRIX1dUTVAKKyNlbmRpZgorCisKKyNkZWZpbmUgX19VVF9MSU5FU0laRQkzMgorI2RlZmluZSBfX1VUX05BTUVTSVpFCTMyCisjZGVmaW5lIF9fVVRfSE9TVFNJWkUJMjU2CisKKworLyogVGhlIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBzdGF0dXMgb2YgYSB0ZXJtaW5hdGVkIHByb2Nlc3MuICBUaGlzCisgICB0eXBlIGlzIHVzZWQgaW4gYHN0cnVjdCB1dG1weCcgYmVsb3cuICAqLworc3RydWN0IF9fZXhpdF9zdGF0dXMKKyAgeworI2lmZGVmIF9fVVNFX0dOVQorICAgIHNob3J0IGludCBlX3Rlcm1pbmF0aW9uOwkvKiBQcm9jZXNzIHRlcm1pbmF0aW9uIHN0YXR1cy4gICovCisgICAgc2hvcnQgaW50IGVfZXhpdDsJCS8qIFByb2Nlc3MgZXhpdCBzdGF0dXMuICAqLworI2Vsc2UKKyAgICBzaG9ydCBpbnQgX19lX3Rlcm1pbmF0aW9uOwkvKiBQcm9jZXNzIHRlcm1pbmF0aW9uIHN0YXR1cy4gICovCisgICAgc2hvcnQgaW50IF9fZV9leGl0OwkJLyogUHJvY2VzcyBleGl0IHN0YXR1cy4gICovCisjZW5kaWYKKyAgfTsKKworCisvKiBUaGUgc3RydWN0dXJlIGRlc2NyaWJpbmcgYW4gZW50cnkgaW4gdGhlIHVzZXIgYWNjb3VudGluZyBkYXRhYmFzZS4gICovCitzdHJ1Y3QgdXRtcHgKK3sKKyAgc2hvcnQgaW50IHV0X3R5cGU7CQkvKiBUeXBlIG9mIGxvZ2luLiAgKi8KKyAgX19waWRfdCB1dF9waWQ7CQkvKiBQcm9jZXNzIElEIG9mIGxvZ2luIHByb2Nlc3MuICAqLworICBjaGFyIHV0X2xpbmVbX19VVF9MSU5FU0laRV07CS8qIERldmljZW5hbWUuICAqLworICBjaGFyIHV0X2lkWzRdOwkJLyogSW5pdHRhYiBJRC4gKi8KKyAgY2hhciB1dF91c2VyW19fVVRfTkFNRVNJWkVdOwkvKiBVc2VybmFtZS4gICovCisgIGNoYXIgdXRfaG9zdFtfX1VUX0hPU1RTSVpFXTsJLyogSG9zdG5hbWUgZm9yIHJlbW90ZSBsb2dpbi4gICovCisgIHN0cnVjdCBfX2V4aXRfc3RhdHVzIHV0X2V4aXQ7CS8qIEV4aXQgc3RhdHVzIG9mIGEgcHJvY2VzcyBtYXJrZWQKKwkJCQkgICBhcyBERUFEX1BST0NFU1MuICAqLworCisvKiBUaGUgZmllbGRzIHV0X3Nlc3Npb24gYW5kIHV0X3R2IG11c3QgYmUgdGhlIHNhbWUgc2l6ZSB3aGVuIGNvbXBpbGVkCisgICAzMi0gYW5kIDY0LWJpdC4gIFRoaXMgYWxsb3dzIGZpbGVzIGFuZCBzaGFyZWQgbWVtb3J5IHRvIGJlIHNoYXJlZAorICAgYmV0d2VlbiAzMi0gYW5kIDY0LWJpdCBhcHBsaWNhdGlvbnMuICAqLworI2lmIF9fV09SRFNJWkUgPT0gNjQgJiYgZGVmaW5lZCBfX1dPUkRTSVpFX0NPTVBBVDMyCisgIF9faW50MzJfdCB1dF9zZXNzaW9uOwkJLyogU2Vzc2lvbiBJRCwgdXNlZCBmb3Igd2luZG93aW5nLiAgKi8KKyAgc3RydWN0CisgIHsKKyAgICBfX2ludDMyX3QgdHZfc2VjOwkJLyogU2Vjb25kcy4gICovCisgICAgX19pbnQzMl90IHR2X3VzZWM7CQkvKiBNaWNyb3NlY29uZHMuICAqLworICB9IHV0X3R2OwkJCS8qIFRpbWUgZW50cnkgd2FzIG1hZGUuICAqLworI2Vsc2UKKyAgbG9uZyBpbnQgdXRfc2Vzc2lvbjsJCS8qIFNlc3Npb24gSUQsIHVzZWQgZm9yIHdpbmRvd2luZy4gICovCisgIHN0cnVjdCB0aW1ldmFsIHV0X3R2OwkJLyogVGltZSBlbnRyeSB3YXMgbWFkZS4gICovCisjZW5kaWYKKyAgX19pbnQzMl90IHV0X2FkZHJfdjZbNF07CS8qIEludGVybmV0IGFkZHJlc3Mgb2YgcmVtb3RlIGhvc3QuICAqLworICBjaGFyIF9fdW51c2VkWzIwXTsJCS8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAgKi8KK307CisKKworLyogVmFsdWVzIGZvciB0aGUgYHV0X3R5cGUnIGZpZWxkIG9mIGEgYHN0cnVjdCB1dG1weCcuICAqLworI2RlZmluZSBFTVBUWQkJMAkvKiBObyB2YWxpZCB1c2VyIGFjY291bnRpbmcgaW5mb3JtYXRpb24uICAqLworCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBSVU5fTFZMCTEJLyogVGhlIHN5c3RlbSdzIHJ1bmxldmVsLiAgKi8KKyNlbmRpZgorI2RlZmluZSBCT09UX1RJTUUJMgkvKiBUaW1lIG9mIHN5c3RlbSBib290LiAgKi8KKyNkZWZpbmUgTkVXX1RJTUUJMwkvKiBUaW1lIGFmdGVyIHN5c3RlbSBjbG9jayBjaGFuZ2VkLiAgKi8KKyNkZWZpbmUgT0xEX1RJTUUJNAkvKiBUaW1lIHdoZW4gc3lzdGVtIGNsb2NrIGNoYW5nZWQuICAqLworCisjZGVmaW5lIElOSVRfUFJPQ0VTUwk1CS8qIFByb2Nlc3Mgc3Bhd25lZCBieSB0aGUgaW5pdCBwcm9jZXNzLiAgKi8KKyNkZWZpbmUgTE9HSU5fUFJPQ0VTUwk2CS8qIFNlc3Npb24gbGVhZGVyIG9mIGEgbG9nZ2VkIGluIHVzZXIuICAqLworI2RlZmluZSBVU0VSX1BST0NFU1MJNwkvKiBOb3JtYWwgcHJvY2Vzcy4gICovCisjZGVmaW5lIERFQURfUFJPQ0VTUwk4CS8qIFRlcm1pbmF0ZWQgcHJvY2Vzcy4gICovCisKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIEFDQ09VTlRJTkcJOQkvKiBTeXN0ZW0gYWNjb3VudGluZy4gICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy91dHNuYW1lLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdXRzbmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZTcxZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvdXRzbmFtZS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1VUU05BTUVfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy91dHNuYW1lLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy91dHNuYW1lLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIExlbmd0aCBvZiB0aGUgZW50cmllcyBpbiBgc3RydWN0IHV0c25hbWUnIGlzIDY1LiAgKi8KKyNkZWZpbmUgX1VUU05BTUVfTEVOR1RIIDY1CisKKy8qIExpbnV4IHByb3ZpZGVzIGFzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIGBzdHJ1Y3QgdXRzbmFtZScKKyAgIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGRvbWFpbi4gIERlZmluZSBfVVRTTkFNRV9ET01BSU5fTEVOR1RICisgICB0byBhIHZhbHVlICE9IDAgdG8gYWN0aXZhdGUgdGhpcyBlbnRyeS4gICovCisjZGVmaW5lIF9VVFNOQU1FX0RPTUFJTl9MRU5HVEggX1VUU05BTUVfTEVOR1RICmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvd2FpdGZsYWdzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvd2FpdGZsYWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY0Y2VkYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy93YWl0ZmxhZ3MuaApAQCAtMCwwICsxLDM4IEBACisvKiBEZWZpbml0aW9ucyBvZiBmbGFnIGJpdHMgZm9yIGB3YWl0cGlkJyBldCBhbC4KKyAgIENvcHlyaWdodCAoQykgMTk5MiwxOTk2LDE5OTcsMjAwMCwyMDA0LDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCBfU1lTX1dBSVRfSCAmJiAhZGVmaW5lZCBfU1RETElCX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvd2FpdGZsYWdzLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy93YWl0Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKKworLyogQml0cyBpbiB0aGUgdGhpcmQgYXJndW1lbnQgdG8gYHdhaXRwaWQnLiAgKi8KKyNkZWZpbmUJV05PSEFORwkJMQkvKiBEb24ndCBibG9jayB3YWl0aW5nLiAgKi8KKyNkZWZpbmUJV1VOVFJBQ0VECTIJLyogUmVwb3J0IHN0YXR1cyBvZiBzdG9wcGVkIGNoaWxkcmVuLiAgKi8KKworLyogQml0cyBpbiB0aGUgZm91cnRoIGFyZ3VtZW50IHRvIGB3YWl0aWQnLiAgKi8KKyNkZWZpbmUgV1NUT1BQRUQJMgkvKiBSZXBvcnQgc3RvcHBlZCBjaGlsZCAoc2FtZSBhcyBXVU5UUkFDRUQpLiAqLworI2RlZmluZSBXRVhJVEVECQk0CS8qIFJlcG9ydCBkZWFkIGNoaWxkLiAgKi8KKyNkZWZpbmUgV0NPTlRJTlVFRAk4CS8qIFJlcG9ydCBjb250aW51ZWQgY2hpbGQuICAqLworI2RlZmluZSBXTk9XQUlUCQkweDAxMDAwMDAwIC8qIERvbid0IHJlYXAsIGp1c3QgcG9sbCBzdGF0dXMuICAqLworCisjZGVmaW5lIF9fV05PVEhSRUFEICAgICAweDIwMDAwMDAwIC8qIERvbid0IHdhaXQgb24gY2hpbGRyZW4gb2Ygb3RoZXIgdGhyZWFkcworCQkJCSAgICAgIGluIHRoaXMgZ3JvdXAgKi8KKyNkZWZpbmUgX19XQUxMCQkweDQwMDAwMDAwIC8qIFdhaXQgZm9yIGFueSBjaGlsZC4gICovCisjZGVmaW5lIF9fV0NMT05FCTB4ODAwMDAwMDAgLyogV2FpdCBmb3IgY2xvbmVkIHByb2Nlc3MuICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3dhaXRzdGF0dXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy93YWl0c3RhdHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5YzIyNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy93YWl0c3RhdHVzLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qIERlZmluaXRpb25zIG9mIHN0YXR1cyBiaXRzIGZvciBgd2FpdCcgZXQgYWwuCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5NCwxOTk2LDE5OTcsMjAwMCwyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWYgIWRlZmluZWQgX1NZU19XQUlUX0ggJiYgIWRlZmluZWQgX1NURExJQl9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3dhaXRzdGF0dXMuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3dhaXQuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCisvKiBFdmVyeXRoaW5nIGV4dGFudCBzbyBmYXIgdXNlcyB0aGVzZSBzYW1lIGJpdHMuICAqLworCisKKy8qIElmIFdJRkVYSVRFRChTVEFUVVMpLCB0aGUgbG93LW9yZGVyIDggYml0cyBvZiB0aGUgc3RhdHVzLiAgKi8KKyNkZWZpbmUJX19XRVhJVFNUQVRVUyhzdGF0dXMpCSgoKHN0YXR1cykgJiAweGZmMDApID4+IDgpCisKKy8qIElmIFdJRlNJR05BTEVEKFNUQVRVUyksIHRoZSB0ZXJtaW5hdGluZyBzaWduYWwuICAqLworI2RlZmluZQlfX1dURVJNU0lHKHN0YXR1cykJKChzdGF0dXMpICYgMHg3ZikKKworLyogSWYgV0lGU1RPUFBFRChTVEFUVVMpLCB0aGUgc2lnbmFsIHRoYXQgc3RvcHBlZCB0aGUgY2hpbGQuICAqLworI2RlZmluZQlfX1dTVE9QU0lHKHN0YXR1cykJX19XRVhJVFNUQVRVUyhzdGF0dXMpCisKKy8qIE5vbnplcm8gaWYgU1RBVFVTIGluZGljYXRlcyBub3JtYWwgdGVybWluYXRpb24uICAqLworI2RlZmluZQlfX1dJRkVYSVRFRChzdGF0dXMpCShfX1dURVJNU0lHKHN0YXR1cykgPT0gMCkKKworLyogTm9uemVybyBpZiBTVEFUVVMgaW5kaWNhdGVzIHRlcm1pbmF0aW9uIGJ5IGEgc2lnbmFsLiAgKi8KKyNkZWZpbmUgX19XSUZTSUdOQUxFRChzdGF0dXMpIFwKKyAgKCgoc2lnbmVkIGNoYXIpICgoKHN0YXR1cykgJiAweDdmKSArIDEpID4+IDEpID4gMCkKKworLyogTm9uemVybyBpZiBTVEFUVVMgaW5kaWNhdGVzIHRoZSBjaGlsZCBpcyBzdG9wcGVkLiAgKi8KKyNkZWZpbmUJX19XSUZTVE9QUEVEKHN0YXR1cykJKCgoc3RhdHVzKSAmIDB4ZmYpID09IDB4N2YpCisKKy8qIE5vbnplcm8gaWYgU1RBVFVTIGluZGljYXRlcyB0aGUgY2hpbGQgY29udGludWVkIGFmdGVyIGEgc3RvcC4gIFdlIG9ubHkKKyAgIGRlZmluZSB0aGlzIGlmIDxiaXRzL3dhaXRmbGFncy5oPiBwcm92aWRlcyB0aGUgV0NPTlRJTlVFRCBmbGFnIGJpdC4gICovCisjaWZkZWYgV0NPTlRJTlVFRAorIyBkZWZpbmUgX19XSUZDT05USU5VRUQoc3RhdHVzKQkoKHN0YXR1cykgPT0gX19XX0NPTlRJTlVFRCkKKyNlbmRpZgorCisvKiBOb256ZXJvIGlmIFNUQVRVUyBpbmRpY2F0ZXMgdGhlIGNoaWxkIGR1bXBlZCBjb3JlLiAgKi8KKyNkZWZpbmUJX19XQ09SRURVTVAoc3RhdHVzKQkoKHN0YXR1cykgJiBfX1dDT1JFRkxBRykKKworLyogTWFjcm9zIGZvciBjb25zdHJ1Y3Rpbmcgc3RhdHVzIHZhbHVlcy4gICovCisjZGVmaW5lCV9fV19FWElUQ09ERShyZXQsIHNpZykJKChyZXQpIDw8IDggfCAoc2lnKSkKKyNkZWZpbmUJX19XX1NUT1BDT0RFKHNpZykJKChzaWcpIDw8IDggfCAweDdmKQorI2RlZmluZSBfX1dfQ09OVElOVUVECQkweGZmZmYKKyNkZWZpbmUJX19XQ09SRUZMQUcJCTB4ODAKKworCisjaWZkZWYJX19VU0VfQlNECisKKyMgaW5jbHVkZSA8ZW5kaWFuLmg+CisKK3VuaW9uIHdhaXQKKyAgeworICAgIGludCB3X3N0YXR1czsKKyAgICBzdHJ1Y3QKKyAgICAgIHsKKyMgaWYJX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCXVuc2lnbmVkIGludCBfX3dfdGVybXNpZzo3OyAvKiBUZXJtaW5hdGluZyBzaWduYWwuICAqLworCXVuc2lnbmVkIGludCBfX3dfY29yZWR1bXA6MTsgLyogU2V0IGlmIGR1bXBlZCBjb3JlLiAgKi8KKwl1bnNpZ25lZCBpbnQgX193X3JldGNvZGU6ODsgLyogUmV0dXJuIGNvZGUgaWYgZXhpdGVkIG5vcm1hbGx5LiAgKi8KKwl1bnNpZ25lZCBpbnQ6MTY7CisjIGVuZGlmCQkJCS8qIExpdHRsZSBlbmRpYW4uICAqLworIyBpZglfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdW5zaWduZWQgaW50OjE2OworCXVuc2lnbmVkIGludCBfX3dfcmV0Y29kZTo4OworCXVuc2lnbmVkIGludCBfX3dfY29yZWR1bXA6MTsKKwl1bnNpZ25lZCBpbnQgX193X3Rlcm1zaWc6NzsKKyMgZW5kaWYJCQkJLyogQmlnIGVuZGlhbi4gICovCisgICAgICB9IF9fd2FpdF90ZXJtaW5hdGVkOworICAgIHN0cnVjdAorICAgICAgeworIyBpZglfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdW5zaWduZWQgaW50IF9fd19zdG9wdmFsOjg7IC8qIFdfU1RPUFBFRCBpZiBzdG9wcGVkLiAgKi8KKwl1bnNpZ25lZCBpbnQgX193X3N0b3BzaWc6ODsgLyogU3RvcHBpbmcgc2lnbmFsLiAgKi8KKwl1bnNpZ25lZCBpbnQ6MTY7CisjIGVuZGlmCQkJCS8qIExpdHRsZSBlbmRpYW4uICAqLworIyBpZglfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdW5zaWduZWQgaW50OjE2OworCXVuc2lnbmVkIGludCBfX3dfc3RvcHNpZzo4OyAvKiBTdG9wcGluZyBzaWduYWwuICAqLworCXVuc2lnbmVkIGludCBfX3dfc3RvcHZhbDo4OyAvKiBXX1NUT1BQRUQgaWYgc3RvcHBlZC4gICovCisjIGVuZGlmCQkJCS8qIEJpZyBlbmRpYW4uICAqLworICAgICAgfSBfX3dhaXRfc3RvcHBlZDsKKyAgfTsKKworIyBkZWZpbmUgd190ZXJtc2lnCV9fd2FpdF90ZXJtaW5hdGVkLl9fd190ZXJtc2lnCisjIGRlZmluZSB3X2NvcmVkdW1wCV9fd2FpdF90ZXJtaW5hdGVkLl9fd19jb3JlZHVtcAorIyBkZWZpbmUgd19yZXRjb2RlCV9fd2FpdF90ZXJtaW5hdGVkLl9fd19yZXRjb2RlCisjIGRlZmluZSB3X3N0b3BzaWcJX193YWl0X3N0b3BwZWQuX193X3N0b3BzaWcKKyMgZGVmaW5lIHdfc3RvcHZhbAlfX3dhaXRfc3RvcHBlZC5fX3dfc3RvcHZhbAorCisjZW5kaWYJLyogVXNlIEJTRC4gICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvd2NoYXItbGRibC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3djaGFyLWxkYmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGE2YTY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3djaGFyLWxkYmwuaApAQCAtMCwwICsxLDc1IEBACisvKiAtbWxvbmctZG91YmxlLTY0IGNvbXBhdGliaWxpdHkgbW9kZSBmb3IgPHdjaGFyLmg+IGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfV0NIQVJfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy93Y2hhci1sZGJsLmg+IGRpcmVjdGx5OyB1c2UgPHdjaGFyLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0lTT0M5NSB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OAorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CitfX0xEQkxfUkVESVJfREVDTCAoZndwcmludGYpOworX19MREJMX1JFRElSX0RFQ0wgKHdwcmludGYpOworX19MREJMX1JFRElSX0RFQ0wgKHN3cHJpbnRmKTsKK19fTERCTF9SRURJUl9ERUNMICh2ZndwcmludGYpOworX19MREJMX1JFRElSX0RFQ0wgKHZ3cHJpbnRmKTsKK19fTERCTF9SRURJUl9ERUNMICh2c3dwcmludGYpOworIyBpZiBkZWZpbmVkIF9fVVNFX0lTT0M5OSAmJiAhZGVmaW5lZCBfX1VTRV9HTlUgXAorICAgICAmJiAhZGVmaW5lZCBfX1JFRElSRUNUIFwKKyAgICAgJiYgKGRlZmluZWQgX19TVFJJQ1RfQU5TSV9fIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySykKK19fTERCTF9SRURJUjFfREVDTCAoZndzY2FuZiwgX19ubGRibF9fX2lzb2M5OV9md3NjYW5mKQorX19MREJMX1JFRElSMV9ERUNMICh3c2NhbmYsIF9fbmxkYmxfX19pc29jOTlfd3NjYW5mKSAgCitfX0xEQkxfUkVESVIxX0RFQ0wgKHN3c2NhbmYsIF9fbmxkYmxfX19pc29jOTlfc3dzY2FuZikKKyMgZWxzZQorX19MREJMX1JFRElSX0RFQ0wgKGZ3c2NhbmYpOworX19MREJMX1JFRElSX0RFQ0wgKHdzY2FuZik7CitfX0xEQkxfUkVESVJfREVDTCAoc3dzY2FuZik7CisjIGVuZGlmCitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CitfX0xEQkxfUkVESVIxX0RFQ0wgKHdjc3RvbGQsIHdjc3RvZCk7CisjIGlmICFkZWZpbmVkIF9fVVNFX0dOVSAmJiAhZGVmaW5lZCBfX1JFRElSRUNUIFwKKyAgICAgJiYgKGRlZmluZWQgX19TVFJJQ1RfQU5TSV9fIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySykKK19fTERCTF9SRURJUjFfREVDTCAodmZ3c2NhbmYsIF9fbmxkYmxfX19pc29jOTlfdmZ3c2NhbmYpCitfX0xEQkxfUkVESVIxX0RFQ0wgKHZ3c2NhbmYsIF9fbmxkYmxfX19pc29jOTlfdndzY2FuZikgIAorX19MREJMX1JFRElSMV9ERUNMICh2c3dzY2FuZiwgX19ubGRibF9fX2lzb2M5OV92c3dzY2FuZikKKyMgZWxzZQorX19MREJMX1JFRElSX0RFQ0wgKHZmd3NjYW5mKTsKK19fTERCTF9SRURJUl9ERUNMICh2d3NjYW5mKTsKK19fTERCTF9SRURJUl9ERUNMICh2c3dzY2FuZik7CisjIGVuZGlmCitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorX19MREJMX1JFRElSMV9ERUNMICh3Y3N0b2xkX2wsIHdjc3RvZF9sKTsKKyNlbmRpZgorCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDAgJiYgZGVmaW5lZCBfX2V4dGVybl9hbHdheXNfaW5saW5lCitfX0xEQkxfUkVESVJfREVDTCAoX19zd3ByaW50Zl9jaGspCitfX0xEQkxfUkVESVJfREVDTCAoX192c3dwcmludGZfY2hrKQorIyBpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMQorX19MREJMX1JFRElSX0RFQ0wgKF9fZndwcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fd3ByaW50Zl9jaGspCitfX0xEQkxfUkVESVJfREVDTCAoX192ZndwcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fdndwcmludGZfY2hrKQorIyBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvd2NoYXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy93Y2hhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MmE0NjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvd2NoYXIuaApAQCAtMCwwICsxLDI2IEBACisvKiB3Y2hhcl90IHR5cGUgcmVsYXRlZCBkZWZpbml0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfQklUU19XQ0hBUl9ICisjZGVmaW5lIF9CSVRTX1dDSEFSX0gJMQorCisjZGVmaW5lIF9fV0NIQVJfTUlOCSgtMjE0NzQ4MzY0N2wgLSAxbCkKKyNkZWZpbmUgX19XQ0hBUl9NQVgJKDIxNDc0ODM2NDdsKQorCisjZW5kaWYJLyogYml0cy93Y2hhci5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvd2NoYXIyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvd2NoYXIyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4ZWFhMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy93Y2hhcjIuaApAQCAtMCwwICsxLDU5NCBAQAorLyogQ2hlY2tpbmcgbWFjcm9zIGZvciB3Y2hhciBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1dDSEFSX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvd2NoYXIyLmg+IGRpcmVjdGx5OyB1c2UgPHdjaGFyLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKworZXh0ZXJuIHdjaGFyX3QgKl9fd21lbWNweV9jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMSwKKwkJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwgc2l6ZV90IF9fbiwKKwkJCSAgICAgICBzaXplX3QgX19uczEpIF9fVEhST1c7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd21lbWNweV9hbGlhcywKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwgc2l6ZV90IF9fbiksCisJCQkJd21lbWNweSk7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd21lbWNweV9jaGtfd2FybiwKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwgc2l6ZV90IF9fbiwKKwkJCQkgc2l6ZV90IF9fbnMxKSwgX193bWVtY3B5X2NoaykKKyAgICAgX193YXJuYXR0ciAoIndtZW1jcHkgY2FsbGVkIHdpdGggbGVuZ3RoIGJpZ2dlciB0aGFuIHNpemUgb2YgZGVzdGluYXRpb24gIgorCQkgImJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHdjaGFyX3QgKgorX19OVEggKHdtZW1jcHkgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczIsCisJCXNpemVfdCBfX24pKQoreworICBpZiAoX19ib3MwIChfX3MxKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pKQorCXJldHVybiBfX3dtZW1jcHlfY2hrIChfX3MxLCBfX3MyLCBfX24sCisJCQkgICAgICBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisKKyAgICAgIGlmIChfX24gPiBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSkKKwlyZXR1cm4gX193bWVtY3B5X2Noa193YXJuIChfX3MxLCBfX3MyLCBfX24sCisJCQkJICAgX19ib3MwIChfX3MxKSAvIHNpemVvZiAod2NoYXJfdCkpOworICAgIH0KKyAgcmV0dXJuIF9fd21lbWNweV9hbGlhcyAoX19zMSwgX19zMiwgX19uKTsKK30KKworCitleHRlcm4gd2NoYXJfdCAqX193bWVtbW92ZV9jaGsgKHdjaGFyX3QgKl9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19zMiwKKwkJCQlzaXplX3QgX19uLCBzaXplX3QgX19uczEpIF9fVEhST1c7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd21lbW1vdmVfYWxpYXMsICh3Y2hhcl90ICpfX3MxLAorCQkJCQkJICAgX19jb25zdCB3Y2hhcl90ICpfX3MyLAorCQkJCQkJICAgc2l6ZV90IF9fbiksIHdtZW1tb3ZlKTsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193bWVtbW92ZV9jaGtfd2FybiwKKwkJCQkod2NoYXJfdCAqX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3MyLAorCQkJCSBzaXplX3QgX19uLCBzaXplX3QgX19uczEpLCBfX3dtZW1tb3ZlX2NoaykKKyAgICAgX193YXJuYXR0ciAoIndtZW1tb3ZlIGNhbGxlZCB3aXRoIGxlbmd0aCBiaWdnZXIgdGhhbiBzaXplIG9mIGRlc3RpbmF0aW9uICIKKwkJICJidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSB3Y2hhcl90ICoKK19fTlRIICh3bWVtbW92ZSAod2NoYXJfdCAqX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3MyLCBzaXplX3QgX19uKSkKK3sKKyAgaWYgKF9fYm9zMCAoX19zMSkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSkKKwlyZXR1cm4gX193bWVtbW92ZV9jaGsgKF9fczEsIF9fczIsIF9fbiwKKwkJCSAgICAgICBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisKKyAgICAgIGlmIChfX24gPiBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSkKKwlyZXR1cm4gX193bWVtbW92ZV9jaGtfd2FybiAoX19zMSwgX19zMiwgX19uLAorCQkJCSAgICBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX193bWVtbW92ZV9hbGlhcyAoX19zMSwgX19zMiwgX19uKTsKK30KKworCisjaWZkZWYgX19VU0VfR05VCitleHRlcm4gd2NoYXJfdCAqX193bWVtcGNweV9jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMSwKKwkJCQlfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwgc2l6ZV90IF9fbiwKKwkJCQlzaXplX3QgX19uczEpIF9fVEhST1c7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd21lbXBjcHlfYWxpYXMsCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMSwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczIsCisJCQkJIHNpemVfdCBfX24pLCB3bWVtcGNweSk7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd21lbXBjcHlfY2hrX3dhcm4sCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMSwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczIsIHNpemVfdCBfX24sCisJCQkJIHNpemVfdCBfX25zMSksIF9fd21lbXBjcHlfY2hrKQorICAgICBfX3dhcm5hdHRyICgid21lbXBjcHkgY2FsbGVkIHdpdGggbGVuZ3RoIGJpZ2dlciB0aGFuIHNpemUgb2YgZGVzdGluYXRpb24gIgorCQkgImJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHdjaGFyX3QgKgorX19OVEggKHdtZW1wY3B5ICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MyLAorCQkgc2l6ZV90IF9fbikpCit7CisgIGlmIChfX2JvczAgKF9fczEpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbikpCisJcmV0dXJuIF9fd21lbXBjcHlfY2hrIChfX3MxLCBfX3MyLCBfX24sCisJCQkgICAgICAgX19ib3MwIChfX3MxKSAvIHNpemVvZiAod2NoYXJfdCkpOworCisgICAgICBpZiAoX19uID4gX19ib3MwIChfX3MxKSAvIHNpemVvZiAod2NoYXJfdCkpCisJcmV0dXJuIF9fd21lbXBjcHlfY2hrX3dhcm4gKF9fczEsIF9fczIsIF9fbiwKKwkJCQkgICAgX19ib3MwIChfX3MxKSAvIHNpemVvZiAod2NoYXJfdCkpOworICAgIH0KKyAgcmV0dXJuIF9fd21lbXBjcHlfYWxpYXMgKF9fczEsIF9fczIsIF9fbik7Cit9CisjZW5kaWYKKworCitleHRlcm4gd2NoYXJfdCAqX193bWVtc2V0X2NoayAod2NoYXJfdCAqX19zLCB3Y2hhcl90IF9fYywgc2l6ZV90IF9fbiwKKwkJCSAgICAgICBzaXplX3QgX19ucykgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193bWVtc2V0X2FsaWFzLCAod2NoYXJfdCAqX19zLCB3Y2hhcl90IF9fYywKKwkJCQkJCSAgc2l6ZV90IF9fbiksIHdtZW1zZXQpOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1RfTlRIIChfX3dtZW1zZXRfY2hrX3dhcm4sCisJCQkJKHdjaGFyX3QgKl9fcywgd2NoYXJfdCBfX2MsIHNpemVfdCBfX24sCisJCQkJIHNpemVfdCBfX25zKSwgX193bWVtc2V0X2NoaykKKyAgICAgX193YXJuYXR0ciAoIndtZW1zZXQgY2FsbGVkIHdpdGggbGVuZ3RoIGJpZ2dlciB0aGFuIHNpemUgb2YgZGVzdGluYXRpb24gIgorCQkgImJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHdjaGFyX3QgKgorX19OVEggKHdtZW1zZXQgKHdjaGFyX3QgKl9fcywgd2NoYXJfdCBfX2MsIHNpemVfdCBfX24pKQoreworICBpZiAoX19ib3MwIChfX3MpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbikpCisJcmV0dXJuIF9fd21lbXNldF9jaGsgKF9fcywgX19jLCBfX24sIF9fYm9zMCAoX19zKSAvIHNpemVvZiAod2NoYXJfdCkpOworCisgICAgICBpZiAoX19uID4gX19ib3MwIChfX3MpIC8gc2l6ZW9mICh3Y2hhcl90KSkKKwlyZXR1cm4gX193bWVtc2V0X2Noa193YXJuIChfX3MsIF9fYywgX19uLAorCQkJCSAgIF9fYm9zMCAoX19zKSAvIHNpemVvZiAod2NoYXJfdCkpOworICAgIH0KKyAgcmV0dXJuIF9fd21lbXNldF9hbGlhcyAoX19zLCBfX2MsIF9fbik7Cit9CisKKworZXh0ZXJuIHdjaGFyX3QgKl9fd2NzY3B5X2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICBzaXplX3QgX19uKSBfX1RIUk9XOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1RfTlRIIChfX3djc2NweV9hbGlhcywKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYyksIHdjc2NweSk7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgd2NoYXJfdCAqCitfX05USCAod2NzY3B5ICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjKSkKK3sKKyAgaWYgKF9fYm9zIChfX2Rlc3QpICE9IChzaXplX3QpIC0xKQorICAgIHJldHVybiBfX3djc2NweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fYm9zIChfX2Rlc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgIHJldHVybiBfX3djc2NweV9hbGlhcyAoX19kZXN0LCBfX3NyYyk7Cit9CisKKworZXh0ZXJuIHdjaGFyX3QgKl9fd2NwY3B5X2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICBzaXplX3QgX19kZXN0bGVuKSBfX1RIUk9XOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1RfTlRIIChfX3djcGNweV9hbGlhcywKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYyksIHdjcGNweSk7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgd2NoYXJfdCAqCitfX05USCAod2NwY3B5ICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjKSkKK3sKKyAgaWYgKF9fYm9zIChfX2Rlc3QpICE9IChzaXplX3QpIC0xKQorICAgIHJldHVybiBfX3djcGNweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fYm9zIChfX2Rlc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgIHJldHVybiBfX3djcGNweV9hbGlhcyAoX19kZXN0LCBfX3NyYyk7Cit9CisKKworZXh0ZXJuIHdjaGFyX3QgKl9fd2NzbmNweV9jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbiwKKwkJCSAgICAgICBzaXplX3QgX19kZXN0bGVuKSBfX1RIUk9XOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1RfTlRIIChfX3djc25jcHlfYWxpYXMsCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCQkJIHNpemVfdCBfX24pLCB3Y3NuY3B5KTsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193Y3NuY3B5X2Noa193YXJuLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJCSBzaXplX3QgX19uLCBzaXplX3QgX19kZXN0bGVuKSwgX193Y3NuY3B5X2NoaykKKyAgICAgX193YXJuYXR0ciAoIndjc25jcHkgY2FsbGVkIHdpdGggbGVuZ3RoIGJpZ2dlciB0aGFuIHNpemUgb2YgZGVzdGluYXRpb24gIgorCQkgImJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHdjaGFyX3QgKgorX19OVEggKHdjc25jcHkgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCXNpemVfdCBfX24pKQoreworICBpZiAoX19ib3MgKF9fZGVzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSkKKwlyZXR1cm4gX193Y3NuY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19uLAorCQkJICAgICAgX19ib3MgKF9fZGVzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgICAgIGlmIChfX24gPiBfX2JvcyAoX19kZXN0KSAvIHNpemVvZiAod2NoYXJfdCkpCisJcmV0dXJuIF9fd2NzbmNweV9jaGtfd2FybiAoX19kZXN0LCBfX3NyYywgX19uLAorCQkJCSAgIF9fYm9zIChfX2Rlc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX193Y3NuY3B5X2FsaWFzIChfX2Rlc3QsIF9fc3JjLCBfX24pOworfQorCisKK2V4dGVybiB3Y2hhcl90ICpfX3djcG5jcHlfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX24sCisJCQkgICAgICAgc2l6ZV90IF9fZGVzdGxlbikgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193Y3BuY3B5X2FsaWFzLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJCSBzaXplX3QgX19uKSwgd2NwbmNweSk7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd2NwbmNweV9jaGtfd2FybiwKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCQkgc2l6ZV90IF9fbiwgc2l6ZV90IF9fZGVzdGxlbiksIF9fd2NwbmNweV9jaGspCisgICAgIF9fd2FybmF0dHIgKCJ3Y3BuY3B5IGNhbGxlZCB3aXRoIGxlbmd0aCBiaWdnZXIgdGhhbiBzaXplIG9mIGRlc3RpbmF0aW9uICIKKwkJICJidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSB3Y2hhcl90ICoKK19fTlRIICh3Y3BuY3B5ICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQlzaXplX3QgX19uKSkKK3sKKyAgaWYgKF9fYm9zIChfX2Rlc3QpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbikpCisJcmV0dXJuIF9fd2NwbmNweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbiwKKwkJCSAgICAgIF9fYm9zIChfX2Rlc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgICBpZiAoX19uID4gX19ib3MgKF9fZGVzdCkgLyBzaXplb2YgKHdjaGFyX3QpKQorCXJldHVybiBfX3djcG5jcHlfY2hrX3dhcm4gKF9fZGVzdCwgX19zcmMsIF9fbiwKKwkJCQkgICBfX2JvcyAoX19kZXN0KSAvIHNpemVvZiAod2NoYXJfdCkpOworICAgIH0KKyAgcmV0dXJuIF9fd2NwbmNweV9hbGlhcyAoX19kZXN0LCBfX3NyYywgX19uKTsKK30KKworCitleHRlcm4gd2NoYXJfdCAqX193Y3NjYXRfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCSAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgIHNpemVfdCBfX2Rlc3RsZW4pIF9fVEhST1c7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd2NzY2F0X2FsaWFzLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjKSwgd2NzY2F0KTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSB3Y2hhcl90ICoKK19fTlRIICh3Y3NjYXQgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMpKQoreworICBpZiAoX19ib3MgKF9fZGVzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgcmV0dXJuIF9fd2NzY2F0X2NoayAoX19kZXN0LCBfX3NyYywgX19ib3MgKF9fZGVzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgcmV0dXJuIF9fd2NzY2F0X2FsaWFzIChfX2Rlc3QsIF9fc3JjKTsKK30KKworCitleHRlcm4gd2NoYXJfdCAqX193Y3NuY2F0X2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkgICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX24sIHNpemVfdCBfX2Rlc3RsZW4pIF9fVEhST1c7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd2NzbmNhdF9hbGlhcywKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCQkgc2l6ZV90IF9fbiksIHdjc25jYXQpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHdjaGFyX3QgKgorX19OVEggKHdjc25jYXQgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCXNpemVfdCBfX24pKQoreworICBpZiAoX19ib3MgKF9fZGVzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgcmV0dXJuIF9fd2NzbmNhdF9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbiwKKwkJCSAgX19ib3MgKF9fZGVzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgcmV0dXJuIF9fd2NzbmNhdF9hbGlhcyAoX19kZXN0LCBfX3NyYywgX19uKTsKK30KKworCitleHRlcm4gaW50IF9fc3dwcmludGZfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwKKwkJCSAgIGludCBfX2ZsYWcsIHNpemVfdCBfX3NfbGVuLAorCQkJICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pCisgICAgIF9fVEhST1cgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3ByaW50Zl9fLCA1LCA2KSkpICovOworCitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIX0xEQkwgKF9fc3dwcmludGZfYWxpYXMsCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mbXQsIC4uLiksCisJCQkJc3dwcmludGYpOworCisjaWZkZWYgX192YV9hcmdfcGFjaworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIIChzd3ByaW50ZiAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikpCit7CisgIGlmIChfX2JvcyAoX19zKSAhPSAoc2l6ZV90KSAtMSB8fCBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMSkKKyAgICByZXR1cm4gX19zd3ByaW50Zl9jaGsgKF9fcywgX19uLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwKKwkJCSAgIF9fYm9zIChfX3MpIC8gc2l6ZW9mICh3Y2hhcl90KSwKKwkJCSAgIF9fZm10LCBfX3ZhX2FyZ19wYWNrICgpKTsKKyAgcmV0dXJuIF9fc3dwcmludGZfYWxpYXMgKF9fcywgX19uLCBfX2ZtdCwgX192YV9hcmdfcGFjayAoKSk7Cit9CisjZWxpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cworLyogWFhYIFdlIG1pZ2h0IHdhbnQgdG8gaGF2ZSBzdXBwb3J0IGluIGdjYyBmb3Igc3dwcmludGYuICAqLworIyBkZWZpbmUgc3dwcmludGYocywgbiwgLi4uKSBcCisgIChfX2JvcyAocykgIT0gKHNpemVfdCkgLTEgfHwgX19VU0VfRk9SVElGWV9MRVZFTCA+IDEJCQkgICAgICBcCisgICA/IF9fc3dwcmludGZfY2hrIChzLCBuLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwJCQkgICAgICBcCisJCSAgICAgX19ib3MgKHMpIC8gc2l6ZW9mICh3Y2hhcl90KSwgX19WQV9BUkdTX18pCQkgICAgICBcCisgICA6IHN3cHJpbnRmIChzLCBuLCBfX1ZBX0FSR1NfXykpCisjZW5kaWYKKworZXh0ZXJuIGludCBfX3Zzd3ByaW50Zl9jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLAorCQkJICAgIGludCBfX2ZsYWcsIHNpemVfdCBfX3NfbGVuLAorCQkJICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgICBfX2dudWNfdmFfbGlzdCBfX2FyZykKKyAgICAgX19USFJPVyAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193cHJpbnRmX18sIDUsIDApKSkgKi87CisKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEhfTERCTCAoX192c3dwcmludGZfYWxpYXMsCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mbXQsCisJCQkJIF9fZ251Y192YV9saXN0IF9fYXApLCB2c3dwcmludGYpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKHZzd3ByaW50ZiAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJCSAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm10LCBfX2dudWNfdmFfbGlzdCBfX2FwKSkKK3sKKyAgaWYgKF9fYm9zIChfX3MpICE9IChzaXplX3QpIC0xIHx8IF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAxKQorICAgIHJldHVybiBfX3Zzd3ByaW50Zl9jaGsgKF9fcywgX19uLCAgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsCisJCQkgICAgX19ib3MgKF9fcykgLyBzaXplb2YgKHdjaGFyX3QpLCBfX2ZtdCwgX19hcCk7CisgIHJldHVybiBfX3Zzd3ByaW50Zl9hbGlhcyAoX19zLCBfX24sIF9fZm10LCBfX2FwKTsKK30KKworCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDEKKworZXh0ZXJuIGludCBfX2Z3cHJpbnRmX2NoayAoX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBpbnQgX19mbGFnLAorCQkJICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pOworZXh0ZXJuIGludCBfX3dwcmludGZfY2hrIChpbnQgX19mbGFnLCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgIC4uLik7CitleHRlcm4gaW50IF9fdmZ3cHJpbnRmX2NoayAoX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBpbnQgX19mbGFnLAorCQkJICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgICBfX2dudWNfdmFfbGlzdCBfX2FwKTsKK2V4dGVybiBpbnQgX192d3ByaW50Zl9jaGsgKGludCBfX2ZsYWcsIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgIF9fZ251Y192YV9saXN0IF9fYXApOworCisjIGlmZGVmIF9fdmFfYXJnX3BhY2sKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50Cit3cHJpbnRmIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikKK3sKKyAgcmV0dXJuIF9fd3ByaW50Zl9jaGsgKF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwgX192YV9hcmdfcGFjayAoKSk7Cit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50Citmd3ByaW50ZiAoX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikKK3sKKyAgcmV0dXJuIF9fZndwcmludGZfY2hrIChfX3N0cmVhbSwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LAorCQkJIF9fdmFfYXJnX3BhY2sgKCkpOworfQorIyBlbGlmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgd3ByaW50ZiguLi4pIFwKKyAgX193cHJpbnRmX2NoayAoX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fVkFfQVJHU19fKQorIyAgZGVmaW5lIGZ3cHJpbnRmKHN0cmVhbSwgLi4uKSBcCisgIF9fZndwcmludGZfY2hrIChzdHJlYW0sIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX1ZBX0FSR1NfXykKKyMgZW5kaWYKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK3Z3cHJpbnRmIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mbXQsIF9fZ251Y192YV9saXN0IF9fYXApCit7CisgIHJldHVybiBfX3Z3cHJpbnRmX2NoayAoX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX2FwKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK3Zmd3ByaW50ZiAoX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCSAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2ZtdCwgX19nbnVjX3ZhX2xpc3QgX19hcCkKK3sKKyAgcmV0dXJuIF9fdmZ3cHJpbnRmX2NoayAoX19zdHJlYW0sIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwgX19hcCk7Cit9CisKKyNlbmRpZgorCitleHRlcm4gd2NoYXJfdCAqX19mZ2V0d3NfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fc2l6ZSwgaW50IF9fbiwKKwkJCSAgICAgIF9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgX193dXI7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVCAoX19mZ2V0d3NfYWxpYXMsCisJCQkgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBpbnQgX19uLAorCQkJICAgICBfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLCBmZ2V0d3MpIF9fd3VyOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1QgKF9fZmdldHdzX2Noa193YXJuLAorCQkJICAgICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fc2l6ZSwgaW50IF9fbiwKKwkJCSAgICAgX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSwgX19mZ2V0d3NfY2hrKQorICAgICBfX3d1ciBfX3dhcm5hdHRyICgiZmdldHdzIGNhbGxlZCB3aXRoIGJpZ2dlciBzaXplIHRoYW4gbGVuZ3RoICIKKwkJICAgICAgICJvZiBkZXN0aW5hdGlvbiBidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX3d1ciB3Y2hhcl90ICoKK2ZnZXR3cyAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIGludCBfX24sIF9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkKK3sKKyAgaWYgKF9fYm9zIChfX3MpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbikgfHwgX19uIDw9IDApCisJcmV0dXJuIF9fZmdldHdzX2NoayAoX19zLCBfX2JvcyAoX19zKSAvIHNpemVvZiAod2NoYXJfdCksCisJCQkgICAgIF9fbiwgX19zdHJlYW0pOworCisgICAgICBpZiAoKHNpemVfdCkgX19uID4gX19ib3MgKF9fcykgLyBzaXplb2YgKHdjaGFyX3QpKQorCXJldHVybiBfX2ZnZXR3c19jaGtfd2FybiAoX19zLCBfX2JvcyAoX19zKSAvIHNpemVvZiAod2NoYXJfdCksCisJCQkJICBfX24sIF9fc3RyZWFtKTsKKyAgICB9CisgIHJldHVybiBfX2ZnZXR3c19hbGlhcyAoX19zLCBfX24sIF9fc3RyZWFtKTsKK30KKworI2lmZGVmIF9fVVNFX0dOVQorZXh0ZXJuIHdjaGFyX3QgKl9fZmdldHdzX3VubG9ja2VkX2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX3NpemUsCisJCQkJICAgICAgIGludCBfX24sIF9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkKKyAgX193dXI7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVCAoX19mZ2V0d3NfdW5sb2NrZWRfYWxpYXMsCisJCQkgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBpbnQgX19uLAorCQkJICAgICBfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLCBmZ2V0d3NfdW5sb2NrZWQpCisgIF9fd3VyOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1QgKF9fZmdldHdzX3VubG9ja2VkX2Noa193YXJuLAorCQkJICAgICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fc2l6ZSwgaW50IF9fbiwKKwkJCSAgICAgX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSwKKwkJCSAgICBfX2ZnZXR3c191bmxvY2tlZF9jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJmZ2V0d3NfdW5sb2NrZWQgY2FsbGVkIHdpdGggYmlnZ2VyIHNpemUgdGhhbiBsZW5ndGggIgorCQkgICAgICAgIm9mIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIHdjaGFyX3QgKgorZmdldHdzX3VubG9ja2VkICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgaW50IF9fbiwgX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKQoreworICBpZiAoX19ib3MgKF9fcykgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSB8fCBfX24gPD0gMCkKKwlyZXR1cm4gX19mZ2V0d3NfdW5sb2NrZWRfY2hrIChfX3MsIF9fYm9zIChfX3MpIC8gc2l6ZW9mICh3Y2hhcl90KSwKKwkJCQkgICAgICBfX24sIF9fc3RyZWFtKTsKKworICAgICAgaWYgKChzaXplX3QpIF9fbiA+IF9fYm9zIChfX3MpIC8gc2l6ZW9mICh3Y2hhcl90KSkKKwlyZXR1cm4gX19mZ2V0d3NfdW5sb2NrZWRfY2hrX3dhcm4gKF9fcywgX19ib3MgKF9fcykgLyBzaXplb2YgKHdjaGFyX3QpLAorCQkJCQkgICBfX24sIF9fc3RyZWFtKTsKKyAgICB9CisgIHJldHVybiBfX2ZnZXR3c191bmxvY2tlZF9hbGlhcyAoX19zLCBfX24sIF9fc3RyZWFtKTsKK30KKyNlbmRpZgorCisKK2V4dGVybiBzaXplX3QgX193Y3J0b21iX2NoayAoY2hhciAqX19yZXN0cmljdCBfX3MsIHdjaGFyX3QgX193Y2hhciwKKwkJCSAgICAgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcCwKKwkJCSAgICAgc2l6ZV90IF9fYnVmbGVuKSBfX1RIUk9XIF9fd3VyOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX193Y3J0b21iX2FsaWFzLAorCQkJICAgICAgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCB3Y2hhcl90IF9fd2NoYXIsCisJCQkgICAgICAgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpLCB3Y3J0b21iKSBfX3d1cjsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX3d1ciBzaXplX3QKK19fTlRIICh3Y3J0b21iIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgd2NoYXJfdCBfX3djaGFyLAorCQltYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykpCit7CisgIC8qIFdlIHdvdWxkIGhhdmUgdG8gaW5jbHVkZSA8bGltaXRzLmg+IHRvIGdldCBhIGRlZmluaXRpb24gb2YgTUJfTEVOX01BWC4KKyAgICAgQnV0IHRoaXMgd291bGQgb25seSBkaXN0dXJiIHRoZSBuYW1lc3BhY2UuICBTbyB3ZSBkZWZpbmUgb3VyIG93bgorICAgICB2ZXJzaW9uIGhlcmUuICAqLworI2RlZmluZSBfX1dDSEFSX01CX0xFTl9NQVgJMTYKKyNpZiBkZWZpbmVkIE1CX0xFTl9NQVggJiYgTUJfTEVOX01BWCAhPSBfX1dDSEFSX01CX0xFTl9NQVgKKyMgZXJyb3IgIkFzc3VtZWQgdmFsdWUgb2YgTUJfTEVOX01BWCB3cm9uZyIKKyNlbmRpZgorICBpZiAoX19ib3MgKF9fcykgIT0gKHNpemVfdCkgLTEgJiYgX19XQ0hBUl9NQl9MRU5fTUFYID4gX19ib3MgKF9fcykpCisgICAgcmV0dXJuIF9fd2NydG9tYl9jaGsgKF9fcywgX193Y2hhciwgX19wcywgX19ib3MgKF9fcykpOworICByZXR1cm4gX193Y3J0b21iX2FsaWFzIChfX3MsIF9fd2NoYXIsIF9fcHMpOworfQorCisKK2V4dGVybiBzaXplX3QgX19tYnNydG93Y3NfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3QgY2hhciAqKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICAgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcywKKwkJCSAgICAgICBzaXplX3QgX19kc3RsZW4pIF9fVEhST1c7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX21ic3J0b3djc19hbGlhcywKKwkJCSAgICAgICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3QgY2hhciAqKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICAgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcyksCisJCQkgICAgICBtYnNydG93Y3MpOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX19tYnNydG93Y3NfY2hrX3dhcm4sCisJCQkgICAgICAod2NoYXJfdCAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IGNoYXIgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMsCisJCQkgICAgICAgc2l6ZV90IF9fZHN0bGVuKSwgX19tYnNydG93Y3NfY2hrKQorICAgICBfX3dhcm5hdHRyICgibWJzcnRvd2NzIGNhbGxlZCB3aXRoIGRzdCBidWZmZXIgc21hbGxlciB0aGFuIGxlbiAiCisJCSAiKiBzaXplb2YgKHdjaGFyX3QpIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgc2l6ZV90CitfX05USCAobWJzcnRvd2NzICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LCBfX2NvbnN0IGNoYXIgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkgIHNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpKQoreworICBpZiAoX19ib3MgKF9fZHN0KSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2xlbikpCisJcmV0dXJuIF9fbWJzcnRvd2NzX2NoayAoX19kc3QsIF9fc3JjLCBfX2xlbiwgX19wcywKKwkJCQlfX2JvcyAoX19kc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisKKyAgICAgIGlmIChfX2xlbiA+IF9fYm9zIChfX2RzdCkgLyBzaXplb2YgKHdjaGFyX3QpKQorCXJldHVybiBfX21ic3J0b3djc19jaGtfd2FybiAoX19kc3QsIF9fc3JjLCBfX2xlbiwgX19wcywKKwkJCQkgICAgIF9fYm9zIChfX2RzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgICB9CisgIHJldHVybiBfX21ic3J0b3djc19hbGlhcyAoX19kc3QsIF9fc3JjLCBfX2xlbiwgX19wcyk7Cit9CisKKworZXh0ZXJuIHNpemVfdCBfX3djc3J0b21ic19jaGsgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCB3Y2hhcl90ICoqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgICBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzLAorCQkJICAgICAgIHNpemVfdCBfX2RzdGxlbikgX19USFJPVzsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fd2NzcnRvbWJzX2FsaWFzLAorCQkJICAgICAgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCB3Y2hhcl90ICoqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgICBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSwKKwkJCSAgICAgIHdjc3J0b21icyk7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3djc3J0b21ic19jaGtfd2FybiwKKwkJCSAgICAgIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICAgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcywKKwkJCSAgICAgICBzaXplX3QgX19kc3RsZW4pLCBfX3djc3J0b21ic19jaGspCisgICAgX193YXJuYXR0ciAoIndjc3J0b21icyBjYWxsZWQgd2l0aCBkc3QgYnVmZmVyIHNtYWxsZXIgdGhhbiBsZW4iKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBzaXplX3QKK19fTlRIICh3Y3NydG9tYnMgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsIF9fY29uc3Qgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19zcmMsCisJCSAgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykpCit7CisgIGlmIChfX2JvcyAoX19kc3QpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbGVuKSkKKwlyZXR1cm4gX193Y3NydG9tYnNfY2hrIChfX2RzdCwgX19zcmMsIF9fbGVuLCBfX3BzLCBfX2JvcyAoX19kc3QpKTsKKworICAgICAgaWYgKF9fbGVuID4gX19ib3MgKF9fZHN0KSkKKwlyZXR1cm4gX193Y3NydG9tYnNfY2hrX3dhcm4gKF9fZHN0LCBfX3NyYywgX19sZW4sIF9fcHMsIF9fYm9zIChfX2RzdCkpOworICAgIH0KKyAgcmV0dXJuIF9fd2NzcnRvbWJzX2FsaWFzIChfX2RzdCwgX19zcmMsIF9fbGVuLCBfX3BzKTsKK30KKworCisjaWZkZWYgX19VU0VfR05VCitleHRlcm4gc2l6ZV90IF9fbWJzbnJ0b3djc19jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkJX19jb25zdCBjaGFyICoqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbm1jLAorCQkJCXNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMsCisJCQkJc2l6ZV90IF9fZHN0bGVuKSBfX1RIUk9XOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX19tYnNucnRvd2NzX2FsaWFzLAorCQkJICAgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCBjaGFyICoqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbm1jLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpLAorCQkJICAgICAgbWJzbnJ0b3djcyk7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX21ic25ydG93Y3NfY2hrX3dhcm4sCisJCQkgICAgICAod2NoYXJfdCAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IGNoYXIgKipfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19ubWMsCisJCQkgICAgICAgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcywKKwkJCSAgICAgICBzaXplX3QgX19kc3RsZW4pLCBfX21ic25ydG93Y3NfY2hrKQorICAgICBfX3dhcm5hdHRyICgibWJzbnJ0b3djcyBjYWxsZWQgd2l0aCBkc3QgYnVmZmVyIHNtYWxsZXIgdGhhbiBsZW4gIgorCQkgIiogc2l6ZW9mICh3Y2hhcl90KSIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHNpemVfdAorX19OVEggKG1ic25ydG93Y3MgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsIF9fY29uc3QgY2hhciAqKl9fcmVzdHJpY3QgX19zcmMsCisJCSAgIHNpemVfdCBfX25tYywgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykpCit7CisgIGlmIChfX2JvcyAoX19kc3QpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbGVuKSkKKwlyZXR1cm4gX19tYnNucnRvd2NzX2NoayAoX19kc3QsIF9fc3JjLCBfX25tYywgX19sZW4sIF9fcHMsCisJCQkJIF9fYm9zIChfX2RzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKworICAgICAgaWYgKF9fbGVuID4gX19ib3MgKF9fZHN0KSAvIHNpemVvZiAod2NoYXJfdCkpCisJcmV0dXJuIF9fbWJzbnJ0b3djc19jaGtfd2FybiAoX19kc3QsIF9fc3JjLCBfX25tYywgX19sZW4sIF9fcHMsCisJCQkJICAgICAgX19ib3MgKF9fZHN0KSAvIHNpemVvZiAod2NoYXJfdCkpOworICAgIH0KKyAgcmV0dXJuIF9fbWJzbnJ0b3djc19hbGlhcyAoX19kc3QsIF9fc3JjLCBfX25tYywgX19sZW4sIF9fcHMpOworfQorCisKK2V4dGVybiBzaXplX3QgX193Y3NucnRvbWJzX2NoayAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwKKwkJCQlfX2NvbnN0IHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkJCXNpemVfdCBfX253Yywgc2l6ZV90IF9fbGVuLAorCQkJCW1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzLCBzaXplX3QgX19kc3RsZW4pCisgICAgIF9fVEhST1c7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3djc25ydG9tYnNfYWxpYXMsCisJCQkgICAgICAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX253Yywgc2l6ZV90IF9fbGVuLAorCQkJICAgICAgIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSwgd2NzbnJ0b21icyk7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3djc25ydG9tYnNfY2hrX3dhcm4sCisJCQkgICAgICAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX253Yywgc2l6ZV90IF9fbGVuLAorCQkJICAgICAgIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzLAorCQkJICAgICAgIHNpemVfdCBfX2RzdGxlbiksIF9fd2NzbnJ0b21ic19jaGspCisgICAgIF9fd2FybmF0dHIgKCJ3Y3NucnRvbWJzIGNhbGxlZCB3aXRoIGRzdCBidWZmZXIgc21hbGxlciB0aGFuIGxlbiIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHNpemVfdAorX19OVEggKHdjc25ydG9tYnMgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsIF9fY29uc3Qgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19zcmMsCisJCSAgIHNpemVfdCBfX253Yywgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykpCit7CisgIGlmIChfX2JvcyAoX19kc3QpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbGVuKSkKKwlyZXR1cm4gX193Y3NucnRvbWJzX2NoayAoX19kc3QsIF9fc3JjLCBfX253YywgX19sZW4sIF9fcHMsCisJCQkJIF9fYm9zIChfX2RzdCkpOworCisgICAgICBpZiAoX19sZW4gPiBfX2JvcyAoX19kc3QpKQorCXJldHVybiBfX3djc25ydG9tYnNfY2hrX3dhcm4gKF9fZHN0LCBfX3NyYywgX19ud2MsIF9fbGVuLCBfX3BzLAorCQkJCSAgICAgIF9fYm9zIChfX2RzdCkpOworICAgIH0KKyAgcmV0dXJuIF9fd2NzbnJ0b21ic19hbGlhcyAoX19kc3QsIF9fc3JjLCBfX253YywgX19sZW4sIF9fcHMpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvd29yZHNpemUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy93b3Jkc2l6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNjQzYjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMvd29yZHNpemUuaApAQCAtMCwwICsxLDE5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNkZWZpbmUgX19XT1JEU0laRQkzMgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3hvcGVuX2xpbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3hvcGVuX2xpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMzYxMTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2JpdHMveG9wZW5fbGltLmgKQEAgLTAsMCArMSwxNDQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqIE5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5OyB1c2UgPGxpbWl0cy5oPiBpbnN0ZWFkLgorICovCisKKy8qIEFkZGl0aW9uYWwgZGVmaW5pdGlvbnMgZnJvbSBYL09wZW4gUG9ydGFiaWxpdHkgR3VpZGUsIElzc3VlIDQsIFZlcnNpb24gMgorICAgU3lzdGVtIEludGVyZmFjZXMgYW5kIEhlYWRlcnMsIDQuMTYgPGxpbWl0cy5oPgorCisgICBQbGVhc2Ugbm90ZSBvbmx5IHRoZSB2YWx1ZXMgd2hpY2ggYXJlIG5vdCBncmVhdGVyIHRoYW4gdGhlIG1pbmltdW0KKyAgIHN0YXRlZCBpbiB0aGUgc3RhbmRhcmQgZG9jdW1lbnQgYXJlIGxpc3RlZC4gIFRoZSBgc3lzY29uZicgZnVuY3Rpb25zCisgICBzaG91bGQgYmUgdXNlZCB0byBvYnRhaW4gdGhlIGFjdHVhbCB2YWx1ZS4gICovCisKKyNpZm5kZWYgX1hPUEVOX0xJTV9ICisjZGVmaW5lIF9YT1BFTl9MSU1fSAkxCisKKyNkZWZpbmUgX19uZWVkX0lPVl9NQVgKKyNpbmNsdWRlIDxiaXRzL3N0ZGlvX2xpbS5oPgorCisvKiBXZSBkbyBub3QgcHJvdmlkZSBmaXhlZCB2YWx1ZXMgZm9yCisKKyAgIEFSR19NQVgJTWF4aW11bSBsZW5ndGggb2YgYXJndW1lbnQgdG8gdGhlIGBleGVjJyBmdW5jdGlvbgorCQlpbmNsdWRpbmcgZW52aXJvbm1lbnQgZGF0YS4KKworICAgQVRFWElUX01BWAlNYXhpbXVtIG51bWJlciBvZiBmdW5jdGlvbnMgdGhhdCBtYXkgYmUgcmVnaXN0ZXJlZAorCQl3aXRoIGBhdGV4aXQnLgorCisgICBDSElMRF9NQVgJTWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIHByb2Nlc3NlcyBwZXIgcmVhbAorCQl1c2VyIElELgorCisgICBPUEVOX01BWAlNYXhpbXVtIG51bWJlciBvZiBmaWxlcyB0aGF0IG9uZSBwcm9jZXNzIGNhbiBoYXZlIG9wZW4KKwkJYXQgYW55b25lIHRpbWUuCisKKyAgIFBBR0VTSVpFCisgICBQQUdFX1NJWkUJU2l6ZSBvZiBieXRlcyBvZiBhIHBhZ2UuCisKKyAgIFBBU1NfTUFYCU1heGltdW0gbnVtYmVyIG9mIHNpZ25pZmljYW50IGJ5dGVzIGluIGEgcGFzc3dvcmQuCisKKyAgIFdlIG9ubHkgcHJvdmlkZSBhIGZpeGVkIGxpbWl0IGZvcgorCisgICBJT1ZfTUFYCU1heGltdW0gbnVtYmVyIG9mIGBpb3ZlYycgc3RydWN0dXJlcyB0aGF0IG9uZSBwcm9jZXNzIGhhcworCQlhdmFpbGFibGUgZm9yIHVzZSB3aXRoIGByZWFkdicgb3Igd3JpdGV2Jy4KKworICAgaWYgdGhpcyBpcyBpbmRlZWQgZml4ZWQgYnkgdGhlIHVuZGVybHlpbmcgc3lzdGVtLgorKi8KKworCisvKiBNYXhpbXVtIG51bWJlciBvZiBgaW92ZWMnIHN0cnVjdHVyZXMgdGhhdCBvbmUgcHJvY2VzcyBoYXMgYXZhaWxhYmxlCisgICBmb3IgdXNlIHdpdGggYHJlYWR2JyBvciB3cml0ZXYnLiAgKi8KKyNkZWZpbmUJX1hPUEVOX0lPVl9NQVgJX1BPU0lYX1VJT19NQVhJT1YKKworCisvKiBNYXhpbXVtIHZhbHVlIG9mIGBkaWdpdCcgaW4gY2FsbHMgdG8gdGhlIGBwcmludGYnIGFuZCBgc2NhbmYnCisgICBmdW5jdGlvbnMuICBXZSBoYXZlIG5vIGxpbWl0LCBzbyByZXR1cm4gYSByZWFzb25hYmxlIHZhbHVlLiAgKi8KKyNkZWZpbmUgTkxfQVJHTUFYCV9QT1NJWF9BUkdfTUFYCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGluIGEgYExBTkcnIG5hbWUuICBXZSBoYXZlIG5vIGxpbWl0LiAgKi8KKyNkZWZpbmUgTkxfTEFOR01BWAlfUE9TSVgyX0xJTkVfTUFYCisKKy8qIE1heGltdW0gbWVzc2FnZSBudW1iZXIuICBXZSBoYXZlIG5vIGxpbWl0LiAgKi8KKyNkZWZpbmUgTkxfTVNHTUFYCUlOVF9NQVgKKworLyogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgaW4gTi10by0xIGNvbGxhdGlvbiBtYXBwaW5nLiAgV2UgaGF2ZSBubworICAgbGltaXQuICAqLworI2RlZmluZSBOTF9OTUFYCQlJTlRfTUFYCisKKy8qIE1heGltdW0gc2V0IG51bWJlci4gIFdlIGhhdmUgbm8gbGltaXQuICAqLworI2RlZmluZSBOTF9TRVRNQVgJSU5UX01BWAorCisvKiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyBpbiBhIG1lc3NhZ2UuICBXZSBoYXZlIG5vIGxpbWl0LiAgKi8KKyNkZWZpbmUgTkxfVEVYVE1BWAlJTlRfTUFYCisKKy8qIERlZmF1bHQgcHJvY2VzcyBwcmlvcml0eS4gICovCisjZGVmaW5lIE5aRVJPCQkyMAorCisKKy8qIE51bWJlciBvZiBiaXRzIGluIGEgd29yZCBvZiB0eXBlIGBpbnQnLiAgKi8KKyNpZmRlZiBJTlRfTUFYCisjIGlmIElOVF9NQVggPT0gMzI3NjcKKyMgIGRlZmluZSBXT1JEX0JJVAkxNgorIyBlbHNlCisjICBpZiBJTlRfTUFYID09IDIxNDc0ODM2NDcKKyMgICBkZWZpbmUgV09SRF9CSVQJMzIKKyMgIGVsc2UKKy8qIFNhZmUgYXNzdW1wdGlvbi4gICovCisjICAgZGVmaW5lIFdPUkRfQklUCTY0CisjICBlbmRpZgorIyBlbmRpZgorI2VsaWYgZGVmaW5lZCBfX0lOVF9NQVhfXworIyBpZiBfX0lOVF9NQVhfXyA9PSAzMjc2NworIyAgZGVmaW5lIFdPUkRfQklUCTE2CisjIGVsc2UKKyMgIGlmIF9fSU5UX01BWF9fID09IDIxNDc0ODM2NDcKKyMgICBkZWZpbmUgV09SRF9CSVQJMzIKKyMgIGVsc2UKKy8qIFNhZmUgYXNzdW1wdGlvbi4gICovCisjICAgZGVmaW5lIFdPUkRfQklUCTY0CisjICBlbmRpZgorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIFdPUkRfQklUCTMyCisjZW5kaWYKKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSB3b3JkIG9mIHR5cGUgYGxvbmcgaW50Jy4gICovCisjaWZkZWYgTE9OR19NQVgKKyMgaWYgTE9OR19NQVggPT0gMjE0NzQ4MzY0NworIyAgZGVmaW5lIExPTkdfQklUCTMyCisjIGVsc2UKKy8qIFNhZmUgYXNzdW1wdGlvbi4gICovCisjICBkZWZpbmUgTE9OR19CSVQJNjQKKyMgZW5kaWYKKyNlbGlmIGRlZmluZWQgX19MT05HX01BWF9fCisjIGlmIF9fTE9OR19NQVhfXyA9PSAyMTQ3NDgzNjQ3CisjICBkZWZpbmUgTE9OR19CSVQJMzIKKyMgZWxzZQorLyogU2FmZSBhc3N1bXB0aW9uLiAgKi8KKyMgIGRlZmluZSBMT05HX0JJVAk2NAorIyBlbmRpZgorI2Vsc2UKKyMgaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorIyBpZiBfX1dPUkRTSVpFID09IDY0CisjICBkZWZpbmUgTE9OR19CSVQJNjQKKyMgZWxzZQorIyAgZGVmaW5lIExPTkdfQklUCTMyCisjIGVuZGlmCisjZW5kaWYKKworI2VuZGlmIC8qIGJpdHMveG9wZW5fbGltLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy94dGl0eXBlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9iaXRzL3h0aXR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIxYmZiMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvYml0cy94dGl0eXBlcy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qIGJpdHMveHRpdHlwZXMuaCAtLSBEZWZpbmUgc29tZSB0eXBlcyB1c2VkIGJ5IDxiaXRzL3N0cm9wdHMuaD4uICBHZW5lcmljLgorICAgQ29weXJpZ2h0IChDKSAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVFJPUFRTX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMveHRpdHlwZXMuaD4gZGlyZWN0bHk7IHVzZSA8c3Ryb3B0cy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9CSVRTX1hUSVRZUEVTX0gKKyNkZWZpbmUgX0JJVFNfWFRJVFlQRVNfSAkxCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKy8qIFRoaXMgdHlwZSBpcyB1c2VkIGJ5IHNvbWUgc3RydWN0cyBpbiA8Yml0cy9zdHJvcHRzLmg+LiAgKi8KK3R5cGVkZWYgX19TTE9OR1dPUkRfVFlQRSBfX3Rfc2NhbGFyX3Q7Cit0eXBlZGVmIF9fVUxPTkdXT1JEX1RZUEUgX190X3VzY2FsYXJfdDsKKworCisjZW5kaWYgLyogYml0cy94dGl0eXBlcy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2ZwdV9jb250cm9sLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2ZwdV9jb250cm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE5YjU3YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvZnB1X2NvbnRyb2wuaApAQCAtMCwwICsxLDEwMiBAQAorLyogRlBVIGNvbnRyb2wgd29yZCBiaXRzLiAgaTM4NyB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLDE5OTUtMTk5OCwyMDAwLDIwMDEsMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgQ29udHJpYnV0ZWQgYnkgT2xhZiBGbGViYmUuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9GUFVfQ09OVFJPTF9ICisjZGVmaW5lIF9GUFVfQ09OVFJPTF9ICTEKKworLyogSGVyZSBpcyB0aGUgZGlydHkgcGFydC4gU2V0IHVwIHlvdXIgMzg3IHRocm91Z2ggdGhlIGNvbnRyb2wgd29yZAorICogKGN3KSByZWdpc3Rlci4KKyAqCisgKiAgICAgMTUtMTMgICAgMTIgIDExLTEwICA5LTggICAgIDctNiAgICAgNSAgICA0ICAgIDMgICAgMiAgICAxICAgIDAKKyAqIHwgcmVzZXJ2ZWQgfCBJQyB8IFJDICB8IFBDIHwgcmVzZXJ2ZWQgfCBQTSB8IFVNIHwgT00gfCBaTSB8IERNIHwgSU0KKyAqCisgKiBJTTogSW52YWxpZCBvcGVyYXRpb24gbWFzaworICogRE06IERlbm9ybWFsaXplZCBvcGVyYW5kIG1hc2sKKyAqIFpNOiBaZXJvLWRpdmlkZSBtYXNrCisgKiBPTTogT3ZlcmZsb3cgbWFzaworICogVU06IFVuZGVyZmxvdyBtYXNrCisgKiBQTTogUHJlY2lzaW9uIChpbmV4YWN0IHJlc3VsdCkgbWFzaworICoKKyAqIE1hc2sgYml0IGlzIDEgbWVhbnMgbm8gaW50ZXJydXB0LgorICoKKyAqIFBDOiBQcmVjaXNpb24gY29udHJvbAorICogMTEgLSByb3VuZCB0byBleHRlbmRlZCBwcmVjaXNpb24KKyAqIDEwIC0gcm91bmQgdG8gZG91YmxlIHByZWNpc2lvbgorICogMDAgLSByb3VuZCB0byBzaW5nbGUgcHJlY2lzaW9uCisgKgorICogUkM6IFJvdW5kaW5nIGNvbnRyb2wKKyAqIDAwIC0gcm91bmRpbmcgdG8gbmVhcmVzdAorICogMDEgLSByb3VuZGluZyBkb3duICh0b3dhcmQgLSBpbmZpbml0eSkKKyAqIDEwIC0gcm91bmRpbmcgdXAgKHRvd2FyZCArIGluZmluaXR5KQorICogMTEgLSByb3VuZGluZyB0b3dhcmQgemVybworICoKKyAqIElDOiBJbmZpbml0eSBjb250cm9sCisgKiBUaGF0IGlzIGZvciA4MDg3IGFuZCA4MDI4NyBvbmx5LgorICoKKyAqIFRoZSBoYXJkd2FyZSBkZWZhdWx0IGlzIDB4MDM3ZiB3aGljaCB3ZSB1c2UuCisgKi8KKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIG1hc2tpbmcgb2YgaW50ZXJydXB0cyAqLworI2RlZmluZSBfRlBVX01BU0tfSU0gIDB4MDEKKyNkZWZpbmUgX0ZQVV9NQVNLX0RNICAweDAyCisjZGVmaW5lIF9GUFVfTUFTS19aTSAgMHgwNAorI2RlZmluZSBfRlBVX01BU0tfT00gIDB4MDgKKyNkZWZpbmUgX0ZQVV9NQVNLX1VNICAweDEwCisjZGVmaW5lIF9GUFVfTUFTS19QTSAgMHgyMAorCisvKiBwcmVjaXNpb24gY29udHJvbCAqLworI2RlZmluZSBfRlBVX0VYVEVOREVEIDB4MzAwCS8qIGxpYm0gcmVxdWlyZXMgZG91YmxlIGV4dGVuZGVkIHByZWNpc2lvbi4gICovCisjZGVmaW5lIF9GUFVfRE9VQkxFICAgMHgyMDAKKyNkZWZpbmUgX0ZQVV9TSU5HTEUgICAweDAKKworLyogcm91bmRpbmcgY29udHJvbCAqLworI2RlZmluZSBfRlBVX1JDX05FQVJFU1QgMHgwICAgIC8qIFJFQ09NTUVOREVEICovCisjZGVmaW5lIF9GUFVfUkNfRE9XTiAgICAweDQwMAorI2RlZmluZSBfRlBVX1JDX1VQICAgICAgMHg4MDAKKyNkZWZpbmUgX0ZQVV9SQ19aRVJPICAgIDB4QzAwCisKKyNkZWZpbmUgX0ZQVV9SRVNFUlZFRCAweEYwQzAgIC8qIFJlc2VydmVkIGJpdHMgaW4gY3cgKi8KKworCisvKiBUaGUgZmRsaWJtIGNvZGUgcmVxdWlyZXMgc3RyaWN0IElFRUUgZG91YmxlIHByZWNpc2lvbiBhcml0aG1ldGljLAorICAgYW5kIG5vIGludGVycnVwdHMgZm9yIGV4Y2VwdGlvbnMsIHJvdW5kaW5nIHRvIG5lYXJlc3QuICAqLworCisjZGVmaW5lIF9GUFVfREVGQVVMVCAgMHgwMzdmCisKKy8qIElFRUU6ICBzYW1lIGFzIGFib3ZlLiAgKi8KKyNkZWZpbmUgX0ZQVV9JRUVFICAgICAweDAzN2YKKworLyogVHlwZSBvZiB0aGUgY29udHJvbCB3b3JkLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IGZwdV9jb250cm9sX3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX0hJX18pKSk7CisKKy8qIE1hY3JvcyBmb3IgYWNjZXNzaW5nIHRoZSBoYXJkd2FyZSBjb250cm9sIHdvcmQuCisKKyAgIE5vdGUgdGhhdCB0aGUgdXNlIG9mIHRoZXNlIG1hY3JvcyBpcyBubyBzdWZmaWNpZW50IGFueW1vcmUgd2l0aAorICAgcmVjZW50IGhhcmR3YXJlLiAgU29tZSBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zIGFyZSBleGVjdXRlZCBpbgorICAgdGhlIFNTRS9TU0UyIGVuZ2luZXMgd2hpY2ggaGF2ZSB0aGVpciBvd24gY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVyLiAgKi8KKyNkZWZpbmUgX0ZQVV9HRVRDVyhjdykgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJmbnN0Y3cgJTAiIDogIj1tIiAoKiZjdykpCisjZGVmaW5lIF9GUFVfU0VUQ1coY3cpIF9fYXNtX18gX192b2xhdGlsZV9fICgiZmxkY3cgJTAiIDogOiAibSIgKComY3cpKQorCisvKiBEZWZhdWx0IGNvbnRyb2wgd29yZCBzZXQgYXQgc3RhcnR1cC4gICovCitleHRlcm4gZnB1X2NvbnRyb2xfdCBfX2ZwdV9jb250cm9sOworCisjZW5kaWYJLyogZnB1X2NvbnRyb2wuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9nbnUvbGliLW5hbWVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2dudS9saWItbmFtZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODcyZjIwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9nbnUvbGliLW5hbWVzLmgKQEAgLTAsMCArMSw2MSBAQAorLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLgorICAgSXQgZGVmaW5lcyBtYWNyb3MgdG8gYWxsb3cgdXNlciBwcm9ncmFtIHRvIGZpbmQgdGhlIHNoYXJlZAorICAgbGlicmFyeSBmaWxlcyB3aGljaCBjb21lIGFzIHBhcnQgb2YgR05VIGxpYmMuICAqLworI2lmbmRlZiBfX0dOVV9MSUJfTkFNRVNfSAorI2RlZmluZSBfX0dOVV9MSUJfTkFNRVNfSAkxCisKKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKyNpZiBfX1dPUkRTSVpFID09IDMyCisjIGRlZmluZSBMRF9MSU5VWF9TTyAgICAgICAgICAgICAgICAgICAgImxkLWxpbnV4LnNvLjIiCisjIGRlZmluZSBMRF9TTyAgICAgICAgICAgICAgICAgICAgICAgICAgImxkLWxpbnV4LnNvLjIiCisjIGRlZmluZSBMSUJBTkxfU08gICAgICAgICAgICAgICAgICAgICAgImxpYmFubC5zby4xIgorIyBkZWZpbmUgTElCQlJPS0VOTE9DQUxFX1NPICAgICAgICAgICAgICJsaWJCcm9rZW5Mb2NhbGUuc28uMSIKKyMgZGVmaW5lIExJQkNJRE5fU08gICAgICAgICAgICAgICAgICAgICAibGliY2lkbi5zby4xIgorIyBkZWZpbmUgTElCQ1JZUFRfU08gICAgICAgICAgICAgICAgICAgICJsaWJjcnlwdC5zby4xIgorIyBkZWZpbmUgTElCQ19TTyAgICAgICAgICAgICAgICAgICAgICAgICJsaWJjLnNvLjYiCisjIGRlZmluZSBMSUJETF9TTyAgICAgICAgICAgICAgICAgICAgICAgImxpYmRsLnNvLjIiCisjIGRlZmluZSBMSUJNX1NPICAgICAgICAgICAgICAgICAgICAgICAgImxpYm0uc28uNiIKKyMgZGVmaW5lIExJQk5TTF9TTyAgICAgICAgICAgICAgICAgICAgICAibGlibnNsLnNvLjEiCisjIGRlZmluZSBMSUJOU1NfQ09NUEFUX1NPICAgICAgICAgICAgICAgImxpYm5zc19jb21wYXQuc28uMiIKKyMgZGVmaW5lIExJQk5TU19EQl9TTyAgICAgICAgICAgICAgICAgICAibGlibnNzX2RiLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfRE5TX1NPICAgICAgICAgICAgICAgICAgImxpYm5zc19kbnMuc28uMiIKKyMgZGVmaW5lIExJQk5TU19GSUxFU19TTyAgICAgICAgICAgICAgICAibGlibnNzX2ZpbGVzLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfSEVTSU9EX1NPICAgICAgICAgICAgICAgImxpYm5zc19oZXNpb2Quc28uMiIKKyMgZGVmaW5lIExJQk5TU19MREFQX1NPICAgICAgICAgICAgICAgICAibGlibnNzX2xkYXAuc28uMiIKKyMgZGVmaW5lIExJQk5TU19OSVNQTFVTX1NPICAgICAgICAgICAgICAibGlibnNzX25pc3BsdXMuc28uMiIKKyMgZGVmaW5lIExJQk5TU19OSVNfU08gICAgICAgICAgICAgICAgICAibGlibnNzX25pcy5zby4yIgorIyBkZWZpbmUgTElCTlNTX1RFU1QxX1NPICAgICAgICAgICAgICAgICJsaWJuc3NfdGVzdDEuc28uMiIKKyMgZGVmaW5lIExJQlBUSFJFQURfU08gICAgICAgICAgICAgICAgICAibGlicHRocmVhZC5zby4wIgorIyBkZWZpbmUgTElCUkVTT0xWX1NPICAgICAgICAgICAgICAgICAgICJsaWJyZXNvbHYuc28uMiIKKyMgZGVmaW5lIExJQlJUX1NPICAgICAgICAgICAgICAgICAgICAgICAibGlicnQuc28uMSIKKyMgZGVmaW5lIExJQlRIUkVBRF9EQl9TTyAgICAgICAgICAgICAgICAibGlidGhyZWFkX2RiLnNvLjEiCisjIGRlZmluZSBMSUJVVElMX1NPICAgICAgICAgICAgICAgICAgICAgImxpYnV0aWwuc28uMSIKKyNlbHNlCisjIGRlZmluZSBMRF9MSU5VWF9YODZfNjRfU08gICAgICAgICAgICAgImxkLWxpbnV4LXg4Ni02NC5zby4yIgorIyBkZWZpbmUgTERfU08gICAgICAgICAgICAgICAgICAgICAgICAgICJsZC1saW51eC14ODYtNjQuc28uMiIKKyMgZGVmaW5lIExJQkFOTF9TTyAgICAgICAgICAgICAgICAgICAgICAibGliYW5sLnNvLjEiCisjIGRlZmluZSBMSUJCUk9LRU5MT0NBTEVfU08gICAgICAgICAgICAgImxpYkJyb2tlbkxvY2FsZS5zby4xIgorIyBkZWZpbmUgTElCQ0lETl9TTyAgICAgICAgICAgICAgICAgICAgICJsaWJjaWRuLnNvLjEiCisjIGRlZmluZSBMSUJDUllQVF9TTyAgICAgICAgICAgICAgICAgICAgImxpYmNyeXB0LnNvLjEiCisjIGRlZmluZSBMSUJDX1NPICAgICAgICAgICAgICAgICAgICAgICAgImxpYmMuc28uNiIKKyMgZGVmaW5lIExJQkRMX1NPICAgICAgICAgICAgICAgICAgICAgICAibGliZGwuc28uMiIKKyMgZGVmaW5lIExJQk1fU08gICAgICAgICAgICAgICAgICAgICAgICAibGlibS5zby42IgorIyBkZWZpbmUgTElCTlNMX1NPICAgICAgICAgICAgICAgICAgICAgICJsaWJuc2wuc28uMSIKKyMgZGVmaW5lIExJQk5TU19DT01QQVRfU08gICAgICAgICAgICAgICAibGlibnNzX2NvbXBhdC5zby4yIgorIyBkZWZpbmUgTElCTlNTX0RCX1NPICAgICAgICAgICAgICAgICAgICJsaWJuc3NfZGIuc28uMiIKKyMgZGVmaW5lIExJQk5TU19ETlNfU08gICAgICAgICAgICAgICAgICAibGlibnNzX2Rucy5zby4yIgorIyBkZWZpbmUgTElCTlNTX0ZJTEVTX1NPICAgICAgICAgICAgICAgICJsaWJuc3NfZmlsZXMuc28uMiIKKyMgZGVmaW5lIExJQk5TU19IRVNJT0RfU08gICAgICAgICAgICAgICAibGlibnNzX2hlc2lvZC5zby4yIgorIyBkZWZpbmUgTElCTlNTX0xEQVBfU08gICAgICAgICAgICAgICAgICJsaWJuc3NfbGRhcC5zby4yIgorIyBkZWZpbmUgTElCTlNTX05JU1BMVVNfU08gICAgICAgICAgICAgICJsaWJuc3NfbmlzcGx1cy5zby4yIgorIyBkZWZpbmUgTElCTlNTX05JU19TTyAgICAgICAgICAgICAgICAgICJsaWJuc3NfbmlzLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfVEVTVDFfU08gICAgICAgICAgICAgICAgImxpYm5zc190ZXN0MS5zby4yIgorIyBkZWZpbmUgTElCUFRIUkVBRF9TTyAgICAgICAgICAgICAgICAgICJsaWJwdGhyZWFkLnNvLjAiCisjIGRlZmluZSBMSUJSRVNPTFZfU08gICAgICAgICAgICAgICAgICAgImxpYnJlc29sdi5zby4yIgorIyBkZWZpbmUgTElCUlRfU08gICAgICAgICAgICAgICAgICAgICAgICJsaWJydC5zby4xIgorIyBkZWZpbmUgTElCVEhSRUFEX0RCX1NPICAgICAgICAgICAgICAgICJsaWJ0aHJlYWRfZGIuc28uMSIKKyMgZGVmaW5lIExJQlVUSUxfU08gICAgICAgICAgICAgICAgICAgICAibGlidXRpbC5zby4xIgorI2VuZGlmCisKKyNlbmRpZgkvKiBnbnUvbGliLW5hbWVzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvZ251L2xpYmMtdmVyc2lvbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9nbnUvbGliYy12ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcwNzFmZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvZ251L2xpYmMtdmVyc2lvbi5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIEludGVyZmFjZSB0byBHTlUgbGliYyBzcGVjaWZpYyBmdW5jdGlvbnMgZm9yIHZlcnNpb24gaW5mb3JtYXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0dOVV9MSUJDX1ZFUlNJT05fSAorI2RlZmluZQlfR05VX0xJQkNfVkVSU0lPTl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogUmV0dXJuIHN0cmluZyBkZXNjcmliaW5nIHJlbGVhc2Ugc3RhdHVzIG9mIGN1cnJlbnRseSBydW5uaW5nIEdOVSBsaWJjLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICpnbnVfZ2V0X2xpYmNfcmVsZWFzZSAodm9pZCkgX19USFJPVzsKKworLyogUmV0dXJuIHN0cmluZyBkZXNjcmliaW5nIHZlcnNpb24gb2YgY3VycmVudGx5IHJ1bm5pbmcgR05VIGxpYmMuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmdudV9nZXRfbGliY192ZXJzaW9uICh2b2lkKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogZ251L2xpYmMtdmVyc2lvbi5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2dudS9vcHRpb24tZ3JvdXBzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2dudS9vcHRpb24tZ3JvdXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkNmQ0OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvZ251L29wdGlvbi1ncm91cHMuaApAQCAtMCwwICsxLDUyIEBACisvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgc2NyaXB0cy9vcHRpb24tZ3JvdXBzLmF3aworICAgaW4gdGhlIEVHTElCQyBzb3VyY2UgdHJlZS4KKworICAgSXQgZGVmaW5lcyBtYWNyb3MgdGhhdCBpbmRpY2F0ZSB3aGljaCBFR0xJQkMgb3B0aW9uIGdyb3VwcyB3ZXJlCisgICBjb25maWd1cmVkIGluICdvcHRpb24tZ3JvdXBzLmNvbmZpZycgd2hlbiB0aGlzIEMgbGlicmFyeSB3YXMKKyAgIGJ1aWx0LiAgRm9yIGVhY2ggb3B0aW9uIGdyb3VwIG5hbWVkIE9QVElPTl9mb28sIGl0ICNkZWZpbmVzCisgICBfX09QVElPTl9mb28gdG8gYmUgMSBpZiB0aGUgZ3JvdXAgaXMgZW5hYmxlZCwgb3IgbGVhdmVzIHRoYXQKKyAgIHN5bWJvbCB1bmRlZmluZWQgaWYgdGhlIGdyb3VwIGlzIGRpc2FibGVkLiAgKi8KKworI2lmbmRlZiBfX0dOVV9PUFRJT05fR1JPVVBTX0gKKyNkZWZpbmUgX19HTlVfT1BUSU9OX0dST1VQU19ICisKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0FEVkFOQ0VEX0lORVQ2IDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0JBQ0tUUkFDRSAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0JTRCAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19DQVRHRVRTIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0NIQVJTRVRTIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0NSWVBUIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0NSWVBUX1VGQyAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19DWFhfVEVTVFMgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfREJfQUxJQVNFUyAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19FTlZaIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0ZDVlQgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfRk1UTVNHIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0ZTVEFCIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0ZUUkFWRVJTRSAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19HRVRMT0dJTiAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19JRE4gMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfSU5FVCAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19JTkVUX0FOTCAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19MSUJNIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0xJQk1fQklHIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0xPQ0FMRVMgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfTE9DQUxFX0NPREUgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfTUVNVVNBR0UgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfTklTIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX05TU1dJVENIIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX1JDTUQgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfUlRMRF9ERUJVRyAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19TUEFXTiAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19TVFJFQU1TIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX1NVTlJQQyAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19VVE1QIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX1VUTVBYIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX1dPUkRFWFAgMQorI2RlZmluZSBfX09QVElPTl9QT1NJWF9DX0xBTkdfV0lERV9DSEFSIDEKKyNkZWZpbmUgX19PUFRJT05fUE9TSVhfUkVHRVhQIDEKKyNkZWZpbmUgX19PUFRJT05fUE9TSVhfUkVHRVhQX0dMSUJDIDEKKyNkZWZpbmUgX19PUFRJT05fUE9TSVhfV0lERV9DSEFSX0RFVklDRV9JTyAxCisKKyNlbmRpZiAvKiBfX0dOVV9PUFRJT05fR1JPVVBTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvZ251L3N0dWJzLTMyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2dudS9zdHVicy0zMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmODY5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L2dudS9zdHVicy0zMi5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4KKyAgIEl0IGRlZmluZXMgYSBzeW1ib2wgYF9fc3R1Yl9GVU5DVElPTicgZm9yIGVhY2ggZnVuY3Rpb24KKyAgIGluIHRoZSBDIGxpYnJhcnkgd2hpY2ggaXMgYSBzdHViLCBtZWFuaW5nIGl0IHdpbGwgZmFpbAorICAgZXZlcnkgdGltZSBjYWxsZWQsIHVzdWFsbHkgc2V0dGluZyBlcnJubyB0byBFTk9TWVMuICAqLworCisjaWZkZWYgX0xJQkMKKyMgZXJyb3IgQXBwbGljYXRpb25zIG1heSBub3QgZGVmaW5lIHRoZSBtYWNybyBfTElCQworI2VuZGlmCisKKyNkZWZpbmUgX19zdHViX19fa2VybmVsX2Nvc2wKKyNkZWZpbmUgX19zdHViX19fa2VybmVsX3NpbmwKKyNkZWZpbmUgX19zdHViX19fa2VybmVsX3RhbmwKKyNkZWZpbmUgX19zdHViX2NoZmxhZ3MKKyNkZWZpbmUgX19zdHViX2ZhdHRhY2gKKyNkZWZpbmUgX19zdHViX2ZjaGZsYWdzCisjZGVmaW5lIF9fc3R1Yl9mZGV0YWNoCisjZGVmaW5lIF9fc3R1Yl9ndHR5CisjZGVmaW5lIF9fc3R1Yl9sY2htb2QKKyNkZWZpbmUgX19zdHViX3Jldm9rZQorI2RlZmluZSBfX3N0dWJfc2V0bG9naW4KKyNkZWZpbmUgX19zdHViX3NpZ3JldHVybgorI2RlZmluZSBfX3N0dWJfc3N0aworI2RlZmluZSBfX3N0dWJfc3R0eQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9nbnUvc3R1YnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvZ251L3N0dWJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMwODZiZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvZ251L3N0dWJzLmgKQEAgLTAsMCArMSwxMiBAQAorLyogVGhpcyBmaWxlIHNlbGVjdHMgdGhlIHJpZ2h0IGdlbmVyYXRlZCBmaWxlIG9mIGBfX3N0dWJfRlVOQ1RJT04nIG1hY3JvcworICAgYmFzZWQgb24gdGhlIGFyY2hpdGVjdHVyZSBiZWluZyBjb21waWxlZCBmb3IuICAqLworCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjaWYgX19XT1JEU0laRSA9PSAzMgorIyBpbmNsdWRlIDxnbnUvc3R1YnMtMzIuaD4KKyNlbGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgaW5jbHVkZSA8Z251L3N0dWJzLTY0Lmg+CisjZWxzZQorIyBlcnJvciAidW5leHBlY3RlZCB2YWx1ZSBmb3IgX19XT1JEU0laRSBtYWNybyIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvYWNjdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvYWNjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YzYzZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9hY2N0LmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX0FDQ1RfSAorI2RlZmluZSBfU1lTX0FDQ1RfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8ZW5kaWFuLmg+CisjZGVmaW5lCV9fbmVlZF90aW1lX3QKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2RlZmluZSBBQ0NUX0NPTU0gMTYKKworLyoKKyAgY29tcF90IGlzIGEgMTYtYml0ICJmbG9hdGluZyIgcG9pbnQgbnVtYmVyIHdpdGggYSAzLWJpdCBiYXNlIDgKKyAgZXhwb25lbnQgYW5kIGEgMTMtYml0IGZyYWN0aW9uLiBTZWUgbGludXgva2VybmVsL2FjY3QuYyBmb3IgdGhlCisgIHNwZWNpZmljIGVuY29kaW5nIHN5c3RlbSB1c2VkLgorKi8KKwordHlwZWRlZiB1X2ludDE2X3QgY29tcF90OworCitzdHJ1Y3QgYWNjdAoreworICBjaGFyIGFjX2ZsYWc7CQkJLyogRmxhZ3MuICAqLworICB1X2ludDE2X3QgYWNfdWlkOwkJLyogUmVhbCB1c2VyIElELiAgKi8KKyAgdV9pbnQxNl90IGFjX2dpZDsJCS8qIFJlYWwgZ3JvdXAgSUQuICAqLworICB1X2ludDE2X3QgYWNfdHR5OwkJLyogQ29udHJvbGxpbmcgdGVybWluYWwuICAqLworICB1X2ludDMyX3QgYWNfYnRpbWU7CQkvKiBCZWdpbm5pbmcgdGltZS4gICovCisgIGNvbXBfdCBhY191dGltZTsJCS8qIFVzZXIgdGltZS4gICovCisgIGNvbXBfdCBhY19zdGltZTsJCS8qIFN5c3RlbSB0aW1lLiAgKi8KKyAgY29tcF90IGFjX2V0aW1lOwkJLyogRWxhcHNlZCB0aW1lLiAgKi8KKyAgY29tcF90IGFjX21lbTsJCS8qIEF2ZXJhZ2UgbWVtb3J5IHVzYWdlLiAgKi8KKyAgY29tcF90IGFjX2lvOwkJCS8qIENoYXJzIHRyYW5zZmVycmVkLiAgKi8KKyAgY29tcF90IGFjX3J3OwkJCS8qIEJsb2NrcyByZWFkIG9yIHdyaXR0ZW4uICAqLworICBjb21wX3QgYWNfbWluZmx0OwkJLyogTWlub3IgcGFnZWZhdWx0cy4gICovCisgIGNvbXBfdCBhY19tYWpmbHQ7CQkvKiBNYWpvciBwYWdlZmF1bHRzLiAgKi8KKyAgY29tcF90IGFjX3N3YXBzOwkJLyogTnVtYmVyIG9mIHN3YXBzLiAgKi8KKyAgdV9pbnQzMl90IGFjX2V4aXRjb2RlOwkvKiBQcm9jZXNzIGV4aXRjb2RlLiAgKi8KKyAgY2hhciBhY19jb21tW0FDQ1RfQ09NTSsxXTsJLyogQ29tbWFuZCBuYW1lLiAgKi8KKyAgY2hhciBhY19wYWRbMTBdOwkJLyogUGFkZGluZyBieXRlcy4gICovCit9OworCisKK3N0cnVjdCBhY2N0X3YzCit7CisgIGNoYXIgYWNfZmxhZzsJCQkvKiBGbGFncyAqLworICBjaGFyIGFjX3ZlcnNpb247CQkvKiBBbHdheXMgc2V0IHRvIEFDQ1RfVkVSU0lPTiAqLworICB1X2ludDE2X3QgYWNfdHR5OwkJLyogQ29udHJvbCBUZXJtaW5hbCAqLworICB1X2ludDMyX3QgYWNfZXhpdGNvZGU7CS8qIEV4aXRjb2RlICovCisgIHVfaW50MzJfdCBhY191aWQ7CQkvKiBSZWFsIFVzZXIgSUQgKi8KKyAgdV9pbnQzMl90IGFjX2dpZDsJCS8qIFJlYWwgR3JvdXAgSUQgKi8KKyAgdV9pbnQzMl90IGFjX3BpZDsJCS8qIFByb2Nlc3MgSUQgKi8KKyAgdV9pbnQzMl90IGFjX3BwaWQ7CQkvKiBQYXJlbnQgUHJvY2VzcyBJRCAqLworICB1X2ludDMyX3QgYWNfYnRpbWU7CQkvKiBQcm9jZXNzIENyZWF0aW9uIFRpbWUgKi8KKyAgZmxvYXQgYWNfZXRpbWU7CQkvKiBFbGFwc2VkIFRpbWUgKi8KKyAgY29tcF90IGFjX3V0aW1lOwkJLyogVXNlciBUaW1lICovCisgIGNvbXBfdCBhY19zdGltZTsJCS8qIFN5c3RlbSBUaW1lICovCisgIGNvbXBfdCBhY19tZW07CQkvKiBBdmVyYWdlIE1lbW9yeSBVc2FnZSAqLworICBjb21wX3QgYWNfaW87CQkJLyogQ2hhcnMgVHJhbnNmZXJyZWQgKi8KKyAgY29tcF90IGFjX3J3OwkJCS8qIEJsb2NrcyBSZWFkIG9yIFdyaXR0ZW4gKi8KKyAgY29tcF90IGFjX21pbmZsdDsJCS8qIE1pbm9yIFBhZ2VmYXVsdHMgKi8KKyAgY29tcF90IGFjX21hamZsdDsJCS8qIE1ham9yIFBhZ2VmYXVsdHMgKi8KKyAgY29tcF90IGFjX3N3YXBzOwkJLyogTnVtYmVyIG9mIFN3YXBzICovCisgIGNoYXIgYWNfY29tbVtBQ0NUX0NPTU1dOwkvKiBDb21tYW5kIE5hbWUgKi8KK307CisKKworZW51bQorICB7CisgICAgQUZPUksgPSAweDAxLAkJLyogSGFzIGV4ZWN1dGVkIGZvcmssIGJ1dCBubyBleGVjLiAgKi8KKyAgICBBU1UgPSAweDAyLAkJCS8qIFVzZWQgc3VwZXItdXNlciBwcml2aWxlZ2VzLiAgKi8KKyAgICBBQ09SRSA9IDB4MDgsCQkvKiBEdW1wZWQgY29yZS4gICovCisgICAgQVhTSUcgPSAweDEwCQkvKiBLaWxsZWQgYnkgYSBzaWduYWwuICAqLworICB9OworCisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorIyBkZWZpbmUgQUNDVF9CWVRFT1JERVIgMHg4MAkvKiBBY2NvdW50aW5nIGZpbGUgaXMgYmlnIGVuZGlhbi4gICovCisjZWxzZQorIyBkZWZpbmUgQUNDVF9CWVRFT1JERVIgMHgwMAkvKiBBY2NvdW50aW5nIGZpbGUgaXMgbGl0dGxlIGVuZGlhbi4gICovCisjZW5kaWYKKworI2RlZmluZSBBSFogICAgIDEwMAorCisKKy8qIFN3aXRjaCBwcm9jZXNzIGFjY291bnRpbmcgb24gYW5kIG9mZi4gICovCitleHRlcm4gaW50IGFjY3QgKF9fY29uc3QgY2hhciAqX19maWxlbmFtZSkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHN5cy9hY2N0LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2JpdHlwZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2JpdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTk4NjBmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvYml0eXBlcy5oCkBAIC0wLDAgKzEsMyBAQAorLyogVGhlIEdOVSA8c3lzL3R5cGVzLmg+IGRlZmluZXMgYWxsIHRoZSBuZWNlc3NhcnkgdHlwZXMuICAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9jZGVmcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvY2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODU2ZTg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvY2RlZnMuaApAQCAtMCwwICsxLDQxMiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkyLTIwMDEsIDIwMDIsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfQ0RFRlNfSAorI2RlZmluZQlfU1lTX0NERUZTX0gJMQorCisvKiBXZSBhcmUgYWxtb3N0IGFsd2F5cyBpbmNsdWRlZCBmcm9tIGZlYXR1cmVzLmguICovCisjaWZuZGVmIF9GRUFUVVJFU19ICisjIGluY2x1ZGUgPGZlYXR1cmVzLmg+CisjZW5kaWYKKworLyogVGhlIEdOVSBsaWJjIGRvZXMgbm90IHN1cHBvcnQgYW55IEsmUiBjb21waWxlcnMgb3IgdGhlIHRyYWRpdGlvbmFsIG1vZGUKKyAgIG9mIElTTyBDIGNvbXBpbGVycyBhbnltb3JlLiAgQ2hlY2sgZm9yIHNvbWUgb2YgdGhlIGNvbWJpbmF0aW9ucyBub3QKKyAgIGFueW1vcmUgc3VwcG9ydGVkLiAgKi8KKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmICFkZWZpbmVkIF9fU1REQ19fCisjIGVycm9yICJZb3UgbmVlZCBhIElTTyBDIGNvbmZvcm1pbmcgY29tcGlsZXIgdG8gdXNlIHRoZSBnbGliYyBoZWFkZXJzIgorI2VuZGlmCisKKy8qIFNvbWUgdXNlciBoZWFkZXIgZmlsZSBtaWdodCBoYXZlIGRlZmluZWQgdGhpcyBiZWZvcmUuICAqLworI3VuZGVmCV9fUAorI3VuZGVmCV9fUE1UCisKKyNpZmRlZiBfX0dOVUNfXworCisvKiBBbGwgZnVuY3Rpb25zLCBleGNlcHQgdGhvc2Ugd2l0aCBjYWxsYmFja3Mgb3IgdGhvc2UgdGhhdAorICAgc3luY2hyb25pemUgbWVtb3J5LCBhcmUgbGVhZiBmdW5jdGlvbnMuICAqLworIyBpZiBfX0dOVUNfUFJFUkVRICg0LCA2KSAmJiAhZGVmaW5lZCBfTElCQworIyAgZGVmaW5lIF9fTEVBRiAsIF9fbGVhZl9fCisjICBkZWZpbmUgX19MRUFGX0FUVFIgX19hdHRyaWJ1dGVfXyAoKF9fbGVhZl9fKSkKKyMgZWxzZQorIyAgZGVmaW5lIF9fTEVBRgorIyAgZGVmaW5lIF9fTEVBRl9BVFRSCisjIGVuZGlmCisKKy8qIEdDQyBjYW4gYWx3YXlzIGdyb2sgcHJvdG90eXBlcy4gIEZvciBDKysgcHJvZ3JhbXMgd2UgYWRkIHRocm93KCkKKyAgIHRvIGhlbHAgaXQgb3B0aW1pemUgdGhlIGZ1bmN0aW9uIGNhbGxzLiAgQnV0IHRoaXMgd29ya3Mgb25seSB3aXRoCisgICBnY2MgMi44LnggYW5kIGVnY3MuICBGb3IgZ2NjIDMuMiBhbmQgdXAgd2UgZXZlbiBtYXJrIEMgZnVuY3Rpb25zCisgICBhcyBub24tdGhyb3dpbmcgdXNpbmcgYSBmdW5jdGlvbiBhdHRyaWJ1dGUgc2luY2UgcHJvZ3JhbXMgY2FuIHVzZQorICAgdGhlIC1mZXhjZXB0aW9ucyBvcHRpb25zIGZvciBDIGNvZGUgYXMgd2VsbC4gICovCisjIGlmICFkZWZpbmVkIF9fY3BsdXNwbHVzICYmIF9fR05VQ19QUkVSRVEgKDMsIDMpCisjICBkZWZpbmUgX19USFJPVwlfX2F0dHJpYnV0ZV9fICgoX19ub3Rocm93X18gX19MRUFGKSkKKyMgIGRlZmluZSBfX1RIUk9XTkwJX19hdHRyaWJ1dGVfXyAoKF9fbm90aHJvd19fKSkKKyMgIGRlZmluZSBfX05USChmY3QpCV9fYXR0cmlidXRlX18gKChfX25vdGhyb3dfXyBfX0xFQUYpKSBmY3QKKyMgZWxzZQorIyAgaWYgZGVmaW5lZCBfX2NwbHVzcGx1cyAmJiBfX0dOVUNfUFJFUkVRICgyLDgpCisjICAgZGVmaW5lIF9fVEhST1cJdGhyb3cgKCkKKyMgICBkZWZpbmUgX19USFJPV05MCXRocm93ICgpCisjICAgZGVmaW5lIF9fTlRIKGZjdCkJX19MRUFGX0FUVFIgZmN0IHRocm93ICgpCisjICBlbHNlCisjICAgZGVmaW5lIF9fVEhST1cKKyMgICBkZWZpbmUgX19USFJPV05MCisjICAgZGVmaW5lIF9fTlRIKGZjdCkJZmN0CisjICBlbmRpZgorIyBlbmRpZgorCisjZWxzZQkvKiBOb3QgR0NDLiAgKi8KKworIyBkZWZpbmUgX19pbmxpbmUJCS8qIE5vIGlubGluZSBmdW5jdGlvbnMuICAqLworCisjIGRlZmluZSBfX1RIUk9XCisjIGRlZmluZSBfX1RIUk9XTkwKKyMgZGVmaW5lIF9fTlRIKGZjdCkJZmN0CisKKyMgZGVmaW5lIF9fY29uc3QJY29uc3QKKyMgZGVmaW5lIF9fc2lnbmVkCXNpZ25lZAorIyBkZWZpbmUgX192b2xhdGlsZQl2b2xhdGlsZQorCisjZW5kaWYJLyogR0NDLiAgKi8KKworLyogVGhlc2UgdHdvIG1hY3JvcyBhcmUgbm90IHVzZWQgaW4gZ2xpYmMgYW55bW9yZS4gIFRoZXkgYXJlIGtlcHQgaGVyZQorICAgb25seSBiZWNhdXNlIHNvbWUgb3RoZXIgcHJvamVjdHMgZXhwZWN0IHRoZSBtYWNyb3MgdG8gYmUgZGVmaW5lZC4gICovCisjZGVmaW5lIF9fUChhcmdzKQlhcmdzCisjZGVmaW5lIF9fUE1UKGFyZ3MpCWFyZ3MKKworLyogRm9yIHRoZXNlIHRoaW5ncywgR0NDIGJlaGF2ZXMgdGhlIEFOU0kgd2F5IG5vcm1hbGx5LAorICAgYW5kIHRoZSBub24tQU5TSSB3YXkgdW5kZXIgLXRyYWRpdGlvbmFsLiAgKi8KKworI2RlZmluZSBfX0NPTkNBVCh4LHkpCXggIyMgeQorI2RlZmluZSBfX1NUUklORyh4KQkjeAorCisvKiBUaGlzIGlzIG5vdCBhIHR5cGVkZWYgc28gYGNvbnN0IF9fcHRyX3QnIGRvZXMgdGhlIHJpZ2h0IHRoaW5nLiAgKi8KKyNkZWZpbmUgX19wdHJfdCB2b2lkICoKKyNkZWZpbmUgX19sb25nX2RvdWJsZV90ICBsb25nIGRvdWJsZQorCisKKy8qIEMrKyBuZWVkcyB0byBrbm93IHRoYXQgdHlwZXMgYW5kIGRlY2xhcmF0aW9ucyBhcmUgQywgbm90IEMrKy4gICovCisjaWZkZWYJX19jcGx1c3BsdXMKKyMgZGVmaW5lIF9fQkVHSU5fREVDTFMJZXh0ZXJuICJDIiB7CisjIGRlZmluZSBfX0VORF9ERUNMUwl9CisjZWxzZQorIyBkZWZpbmUgX19CRUdJTl9ERUNMUworIyBkZWZpbmUgX19FTkRfREVDTFMKKyNlbmRpZgorCisKKy8qIFRoZSBzdGFuZGFyZCBsaWJyYXJ5IG5lZWRzIHRoZSBmdW5jdGlvbnMgZnJvbSB0aGUgSVNPIEM5MCBzdGFuZGFyZAorICAgaW4gdGhlIHN0ZCBuYW1lc3BhY2UuICBBdCB0aGUgc2FtZSB0aW1lIHdlIHdhbnQgdG8gYmUgc2FmZSBmb3IKKyAgIGZ1dHVyZSBjaGFuZ2VzIGFuZCB3ZSBpbmNsdWRlIHRoZSBJU08gQzk5IGNvZGUgaW4gdGhlIG5vbi1zdGFuZGFyZAorICAgbmFtZXNwYWNlIF9fYzk5LiAgVGhlIEMrKyB3cmFwcGVyIGhlYWRlciB0YWtlIGNhc2Ugb2YgYWRkaW5nIHRoZQorICAgZGVmaW5pdGlvbnMgdG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICAqLworI2lmIGRlZmluZWQgX19jcGx1c3BsdXMgJiYgZGVmaW5lZCBfR0xJQkNQUF9VU0VfTkFNRVNQQUNFUworIyBkZWZpbmUgX19CRUdJTl9OQU1FU1BBQ0VfU1RECW5hbWVzcGFjZSBzdGQgeworIyBkZWZpbmUgX19FTkRfTkFNRVNQQUNFX1NURAl9CisjIGRlZmluZSBfX1VTSU5HX05BTUVTUEFDRV9TVEQobmFtZSkgdXNpbmcgc3RkOjpuYW1lOworIyBkZWZpbmUgX19CRUdJTl9OQU1FU1BBQ0VfQzk5CW5hbWVzcGFjZSBfX2M5OSB7CisjIGRlZmluZSBfX0VORF9OQU1FU1BBQ0VfQzk5CX0KKyMgZGVmaW5lIF9fVVNJTkdfTkFNRVNQQUNFX0M5OShuYW1lKSB1c2luZyBfX2M5OTo6bmFtZTsKKyNlbHNlCisvKiBGb3IgY29tcGF0aWJpbGl0eSB3ZSBkbyBub3QgYWRkIHRoZSBkZWNsYXJhdGlvbnMgaW50byBhbnkKKyAgIG5hbWVzcGFjZS4gIFRoZXkgd2lsbCBlbmQgdXAgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2Ugd2hpY2ggaXMgd2hhdAorICAgb2xkIGNvZGUgZXhwZWN0cy4gICovCisjIGRlZmluZSBfX0JFR0lOX05BTUVTUEFDRV9TVEQKKyMgZGVmaW5lIF9fRU5EX05BTUVTUEFDRV9TVEQKKyMgZGVmaW5lIF9fVVNJTkdfTkFNRVNQQUNFX1NURChuYW1lKQorIyBkZWZpbmUgX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisjIGRlZmluZSBfX0VORF9OQU1FU1BBQ0VfQzk5CisjIGRlZmluZSBfX1VTSU5HX05BTUVTUEFDRV9DOTkobmFtZSkKKyNlbmRpZgorCisKKy8qIFN1cHBvcnQgZm9yIGJvdW5kZWQgcG9pbnRlcnMuICAqLworI2lmbmRlZiBfX0JPVU5ERURfUE9JTlRFUlNfXworIyBkZWZpbmUgX19ib3VuZGVkCS8qIG5vdGhpbmcgKi8KKyMgZGVmaW5lIF9fdW5ib3VuZGVkCS8qIG5vdGhpbmcgKi8KKyMgZGVmaW5lIF9fcHRydmFsdWUJLyogbm90aGluZyAqLworI2VuZGlmCisKKworLyogRm9ydGlmeSBzdXBwb3J0LiAgKi8KKyNkZWZpbmUgX19ib3MocHRyKSBfX2J1aWx0aW5fb2JqZWN0X3NpemUgKHB0ciwgX19VU0VfRk9SVElGWV9MRVZFTCA+IDEpCisjZGVmaW5lIF9fYm9zMChwdHIpIF9fYnVpbHRpbl9vYmplY3Rfc2l6ZSAocHRyLCAwKQorCisjaWYgX19HTlVDX1BSRVJFUSAoNCwzKQorIyBkZWZpbmUgX193YXJuZGVjbChuYW1lLCBtc2cpIFwKKyAgZXh0ZXJuIHZvaWQgbmFtZSAodm9pZCkgX19hdHRyaWJ1dGVfXygoX193YXJuaW5nX18gKG1zZykpKQorIyBkZWZpbmUgX193YXJuYXR0cihtc2cpIF9fYXR0cmlidXRlX18oKF9fd2FybmluZ19fIChtc2cpKSkKKyMgZGVmaW5lIF9fZXJyb3JkZWNsKG5hbWUsIG1zZykgXAorICBleHRlcm4gdm9pZCBuYW1lICh2b2lkKSBfX2F0dHJpYnV0ZV9fKChfX2Vycm9yX18gKG1zZykpKQorI2Vsc2UKKyMgZGVmaW5lIF9fd2FybmRlY2wobmFtZSwgbXNnKSBleHRlcm4gdm9pZCBuYW1lICh2b2lkKQorIyBkZWZpbmUgX193YXJuYXR0cihtc2cpCisjIGRlZmluZSBfX2Vycm9yZGVjbChuYW1lLCBtc2cpIGV4dGVybiB2b2lkIG5hbWUgKHZvaWQpCisjZW5kaWYKKworLyogU3VwcG9ydCBmb3IgZmxleGlibGUgYXJyYXlzLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICgyLDk3KQorLyogR0NDIDIuOTcgc3VwcG9ydHMgQzk5IGZsZXhpYmxlIGFycmF5IG1lbWJlcnMuICAqLworIyBkZWZpbmUgX19mbGV4YXJyCVtdCisjZWxzZQorIyBpZmRlZiBfX0dOVUNfXworIyAgZGVmaW5lIF9fZmxleGFycglbMF0KKyMgZWxzZQorIyAgaWYgZGVmaW5lZCBfX1NURENfVkVSU0lPTl9fICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorIyAgIGRlZmluZSBfX2ZsZXhhcnIJW10KKyMgIGVsc2UKKy8qIFNvbWUgb3RoZXIgbm9uLUM5OSBjb21waWxlci4gIEFwcHJveGltYXRlIHdpdGggWzFdLiAgKi8KKyMgICBkZWZpbmUgX19mbGV4YXJyCVsxXQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIF9fYXNtX18gKCJ4eXoiKSBpcyB1c2VkIHRocm91Z2hvdXQgdGhlIGhlYWRlcnMgdG8gcmVuYW1lIGZ1bmN0aW9ucworICAgYXQgdGhlIGFzc2VtYmx5IGxhbmd1YWdlIGxldmVsLiAgVGhpcyBpcyB3cmFwcGVkIGJ5IHRoZSBfX1JFRElSRUNUCisgICBtYWNybywgaW4gb3JkZXIgdG8gc3VwcG9ydCBjb21waWxlcnMgdGhhdCBjYW4gZG8gdGhpcyBzb21lIG90aGVyCisgICB3YXkuICBXaGVuIGNvbXBpbGVycyBkb24ndCBzdXBwb3J0IGFzbS1uYW1lcyBhdCBhbGwsIHdlIGhhdmUgdG8gZG8KKyAgIHByZXByb2Nlc3NvciB0cmlja3MgaW5zdGVhZCAod2hpY2ggZG9uJ3QgaGF2ZSBleGFjdGx5IHRoZSByaWdodAorICAgc2VtYW50aWNzLCBidXQgaXQncyB0aGUgYmVzdCB3ZSBjYW4gZG8pLgorCisgICBFeGFtcGxlOgorICAgaW50IF9fUkVESVJFQ1Qoc2V0cGdycCwgKF9fcGlkX3QgcGlkLCBfX3BpZF90IHBncnApLCBzZXRwZ2lkKTsgKi8KKworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMgorCisjIGRlZmluZSBfX1JFRElSRUNUKG5hbWUsIHByb3RvLCBhbGlhcykgbmFtZSBwcm90byBfX2FzbV9fIChfX0FTTU5BTUUgKCNhbGlhcykpCisjIGlmZGVmIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgX19SRURJUkVDVF9OVEgobmFtZSwgcHJvdG8sIGFsaWFzKSBcCisgICAgIG5hbWUgcHJvdG8gX19USFJPVyBfX2FzbV9fIChfX0FTTU5BTUUgKCNhbGlhcykpCisjICBkZWZpbmUgX19SRURJUkVDVF9OVEhOTChuYW1lLCBwcm90bywgYWxpYXMpIFwKKyAgICAgbmFtZSBwcm90byBfX1RIUk9XTkwgX19hc21fXyAoX19BU01OQU1FICgjYWxpYXMpKQorIyBlbHNlCisjICBkZWZpbmUgX19SRURJUkVDVF9OVEgobmFtZSwgcHJvdG8sIGFsaWFzKSBcCisgICAgIG5hbWUgcHJvdG8gX19hc21fXyAoX19BU01OQU1FICgjYWxpYXMpKSBfX1RIUk9XCisjICBkZWZpbmUgX19SRURJUkVDVF9OVEhOTChuYW1lLCBwcm90bywgYWxpYXMpIFwKKyAgICAgbmFtZSBwcm90byBfX2FzbV9fIChfX0FTTU5BTUUgKCNhbGlhcykpIF9fVEhST1dOTAorIyBlbmRpZgorIyBkZWZpbmUgX19BU01OQU1FKGNuYW1lKSAgX19BU01OQU1FMiAoX19VU0VSX0xBQkVMX1BSRUZJWF9fLCBjbmFtZSkKKyMgZGVmaW5lIF9fQVNNTkFNRTIocHJlZml4LCBjbmFtZSkgX19TVFJJTkcgKHByZWZpeCkgY25hbWUKKworLyoKKyNlbGlmIF9fU09NRV9PVEhFUl9DT01QSUxFUl9fCisKKyMgZGVmaW5lIF9fUkVESVJFQ1QobmFtZSwgcHJvdG8sIGFsaWFzKSBuYW1lIHByb3RvOyBcCisJX1ByYWdtYSgibGV0ICIgI25hbWUgIiA9ICIgI2FsaWFzKQorKi8KKyNlbmRpZgorCisvKiBHQ0MgaGFzIHZhcmlvdXMgdXNlZnVsIGRlY2xhcmF0aW9ucyB0aGF0IGNhbiBiZSBtYWRlIHdpdGggdGhlCisgICBgX19hdHRyaWJ1dGVfXycgc3ludGF4LiAgQWxsIG9mIHRoZSB3YXlzIHdlIHVzZSB0aGlzIGRvIGZpbmUgaWYKKyAgIHRoZXkgYXJlIG9taXR0ZWQgZm9yIGNvbXBpbGVycyB0aGF0IGRvbid0IHVuZGVyc3RhbmQgaXQuICovCisjaWYgIWRlZmluZWQgX19HTlVDX18gfHwgX19HTlVDX18gPCAyCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9fKHh5eikJLyogSWdub3JlICovCisjZW5kaWYKKworLyogQXQgc29tZSBwb2ludCBkdXJpbmcgdGhlIGdjYyAyLjk2IGRldmVsb3BtZW50IHRoZSBgbWFsbG9jJyBhdHRyaWJ1dGUKKyAgIGZvciBmdW5jdGlvbnMgd2FzIGludHJvZHVjZWQuICBXZSBkb24ndCB3YW50IHRvIHVzZSBpdCB1bmNvbmRpdGlvbmFsbHkKKyAgIChhbHRob3VnaCB0aGlzIHdvdWxkIGJlIHBvc3NpYmxlKSBzaW5jZSBpdCBnZW5lcmF0ZXMgd2FybmluZ3MuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDIsOTYpCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBfX2F0dHJpYnV0ZV9fICgoX19tYWxsb2NfXykpCisjZWxzZQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfbWFsbG9jX18gLyogSWdub3JlICovCisjZW5kaWYKKworLyogQXQgc29tZSBwb2ludCBkdXJpbmcgdGhlIGdjYyAyLjk2IGRldmVsb3BtZW50IHRoZSBgcHVyZScgYXR0cmlidXRlCisgICBmb3IgZnVuY3Rpb25zIHdhcyBpbnRyb2R1Y2VkLiAgV2UgZG9uJ3Qgd2FudCB0byB1c2UgaXQgdW5jb25kaXRpb25hbGx5CisgICAoYWx0aG91Z2ggdGhpcyB3b3VsZCBiZSBwb3NzaWJsZSkgc2luY2UgaXQgZ2VuZXJhdGVzIHdhcm5pbmdzLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICgyLDk2KQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfcHVyZV9fIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCisjZWxzZQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfcHVyZV9fIC8qIElnbm9yZSAqLworI2VuZGlmCisKKy8qIFRoaXMgZGVjbGFyYXRpb24gdGVsbHMgdGhlIGNvbXBpbGVyIHRoYXQgdGhlIHZhbHVlIGlzIGNvbnN0YW50LiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICgyLDUpCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKQorI2Vsc2UKKyMgZGVmaW5lIF9fYXR0cmlidXRlX2NvbnN0X18gLyogSWdub3JlICovCisjZW5kaWYKKworLyogQXQgc29tZSBwb2ludCBkdXJpbmcgdGhlIGdjYyAzLjEgZGV2ZWxvcG1lbnQgdGhlIGB1c2VkJyBhdHRyaWJ1dGUKKyAgIGZvciBmdW5jdGlvbnMgd2FzIGludHJvZHVjZWQuICBXZSBkb24ndCB3YW50IHRvIHVzZSBpdCB1bmNvbmRpdGlvbmFsbHkKKyAgIChhbHRob3VnaCB0aGlzIHdvdWxkIGJlIHBvc3NpYmxlKSBzaW5jZSBpdCBnZW5lcmF0ZXMgd2FybmluZ3MuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDMsMSkKKyMgZGVmaW5lIF9fYXR0cmlidXRlX3VzZWRfXyBfX2F0dHJpYnV0ZV9fICgoX191c2VkX18pKQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfbm9pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fICgoX19ub2lubGluZV9fKSkKKyNlbHNlCisjIGRlZmluZSBfX2F0dHJpYnV0ZV91c2VkX18gX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfbm9pbmxpbmVfXyAvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBnY2MgYWxsb3dzIG1hcmtpbmcgZGVwcmVjYXRlZCBmdW5jdGlvbnMuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDMsMikKKyMgZGVmaW5lIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXyBfX2F0dHJpYnV0ZV9fICgoX19kZXByZWNhdGVkX18pKQorI2Vsc2UKKyMgZGVmaW5lIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXyAvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgZ2NjIDIuOCBkZXZlbG9wbWVudCB0aGUgYGZvcm1hdF9hcmcnIGF0dHJpYnV0ZQorICAgZm9yIGZ1bmN0aW9ucyB3YXMgaW50cm9kdWNlZC4gIFdlIGRvbid0IHdhbnQgdG8gdXNlIGl0IHVuY29uZGl0aW9uYWxseQorICAgKGFsdGhvdWdoIHRoaXMgd291bGQgYmUgcG9zc2libGUpIHNpbmNlIGl0IGdlbmVyYXRlcyB3YXJuaW5ncy4KKyAgIElmIHNldmVyYWwgYGZvcm1hdF9hcmcnIGF0dHJpYnV0ZXMgYXJlIGdpdmVuIGZvciB0aGUgc2FtZSBmdW5jdGlvbiwgaW4KKyAgIGdjYy0zLjAgYW5kIG9sZGVyLCBhbGwgYnV0IHRoZSBsYXN0IG9uZSBhcmUgaWdub3JlZC4gIEluIG5ld2VyIGdjY3MsCisgICBhbGwgZGVzaWduYXRlZCBhcmd1bWVudHMgYXJlIGNvbnNpZGVyZWQuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDIsOCkKKyMgZGVmaW5lIF9fYXR0cmlidXRlX2Zvcm1hdF9hcmdfXyh4KSBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfYXJnX18gKHgpKSkKKyNlbHNlCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9mb3JtYXRfYXJnX18oeCkgLyogSWdub3JlICovCisjZW5kaWYKKworLyogQXQgc29tZSBwb2ludCBkdXJpbmcgdGhlIGdjYyAyLjk3IGRldmVsb3BtZW50IHRoZSBgc3RyZm1vbicgZm9ybWF0CisgICBhdHRyaWJ1dGUgZm9yIGZ1bmN0aW9ucyB3YXMgaW50cm9kdWNlZC4gIFdlIGRvbid0IHdhbnQgdG8gdXNlIGl0CisgICB1bmNvbmRpdGlvbmFsbHkgKGFsdGhvdWdoIHRoaXMgd291bGQgYmUgcG9zc2libGUpIHNpbmNlIGl0CisgICBnZW5lcmF0ZXMgd2FybmluZ3MuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDIsOTcpCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9mb3JtYXRfc3RyZm1vbl9fKGEsYikgXAorICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19zdHJmbW9uX18sIGEsIGIpKSkKKyNlbHNlCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9mb3JtYXRfc3RyZm1vbl9fKGEsYikgLyogSWdub3JlICovCisjZW5kaWYKKworLyogVGhlIG5vbnVsbCBmdW5jdGlvbiBhdHRyaWJ1dGUgYWxsb3dzIHRvIG1hcmsgcG9pbnRlciBwYXJhbWV0ZXJzIHdoaWNoCisgICBtdXN0IG5vdCBiZSBOVUxMLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICgzLDMpCisjIGRlZmluZSBfX25vbm51bGwocGFyYW1zKSBfX2F0dHJpYnV0ZV9fICgoX19ub25udWxsX18gcGFyYW1zKSkKKyNlbHNlCisjIGRlZmluZSBfX25vbm51bGwocGFyYW1zKQorI2VuZGlmCisKKy8qIElmIGZvcnRpZmljYXRpb24gbW9kZSwgd2Ugd2FybiBhYm91dCB1bnVzZWQgcmVzdWx0cyBvZiBjZXJ0YWluCisgICBmdW5jdGlvbiBjYWxscyB3aGljaCBjYW4gbGVhZCB0byBwcm9ibGVtcy4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMyw0KQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfd2Fybl91bnVzZWRfcmVzdWx0X18gXAorICAgX19hdHRyaWJ1dGVfXyAoKF9fd2Fybl91bnVzZWRfcmVzdWx0X18pKQorIyBpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMAorIyAgZGVmaW5lIF9fd3VyIF9fYXR0cmlidXRlX3dhcm5fdW51c2VkX3Jlc3VsdF9fCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfd2Fybl91bnVzZWRfcmVzdWx0X18gLyogZW1wdHkgKi8KKyNlbmRpZgorI2lmbmRlZiBfX3d1cgorIyBkZWZpbmUgX193dXIgLyogSWdub3JlICovCisjZW5kaWYKKworLyogRm9yY2VzIGEgZnVuY3Rpb24gdG8gYmUgYWx3YXlzIGlubGluZWQuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDMsMikKKyMgZGVmaW5lIF9fYWx3YXlzX2lubGluZSBfX2lubGluZSBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18pKQorI2Vsc2UKKyMgZGVmaW5lIF9fYWx3YXlzX2lubGluZSBfX2lubGluZQorI2VuZGlmCisKKy8qIEdDQyA0LjMgYW5kIGFib3ZlIHdpdGggLXN0ZD1jOTkgb3IgLXN0ZD1nbnU5OSBpbXBsZW1lbnRzIElTTyBDOTkKKyAgIGlubGluZSBzZW1hbnRpY3MsIHVubGVzcyAtZmdudTg5LWlubGluZSBpcyB1c2VkLiAgKi8KKyNpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBfX0dOVUNfUFJFUkVRICg0LDMpCisjIGlmIGRlZmluZWQgX19HTlVDX1NURENfSU5MSU5FX18gfHwgZGVmaW5lZCBfX2NwbHVzcGx1cworIyAgZGVmaW5lIF9fZXh0ZXJuX2lubGluZSBleHRlcm4gX19pbmxpbmUgX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fKSkKKyMgIGlmIF9fR05VQ19QUkVSRVEgKDQsMykKKyMgICBkZWZpbmUgX19leHRlcm5fYWx3YXlzX2lubGluZSBcCisgIGV4dGVybiBfX2Fsd2F5c19pbmxpbmUgX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCisjICBlbHNlCisjICAgZGVmaW5lIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgXAorICBleHRlcm4gX19hbHdheXNfaW5saW5lIF9fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXykpCisjICBlbmRpZgorIyBlbHNlCisjICBkZWZpbmUgX19leHRlcm5faW5saW5lIGV4dGVybiBfX2lubGluZQorIyAgaWYgX19HTlVDX1BSRVJFUSAoNCwzKQorIyAgIGRlZmluZSBfX2V4dGVybl9hbHdheXNfaW5saW5lIFwKKyAgZXh0ZXJuIF9fYWx3YXlzX2lubGluZSBfX2F0dHJpYnV0ZV9fICgoX19hcnRpZmljaWFsX18pKQorIyAgZWxzZQorIyAgIGRlZmluZSBfX2V4dGVybl9hbHdheXNfaW5saW5lIGV4dGVybiBfX2Fsd2F5c19pbmxpbmUKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworLyogR0NDIDQuMyBhbmQgYWJvdmUgYWxsb3cgcGFzc2luZyBhbGwgYW5vbnltb3VzIGFyZ3VtZW50cyBvZiBhbgorICAgX19leHRlcm5fYWx3YXlzX2lubGluZSBmdW5jdGlvbiB0byBzb21lIG90aGVyIHZhcmFyZyBmdW5jdGlvbi4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoNCwzKQorIyBkZWZpbmUgX192YV9hcmdfcGFjaygpIF9fYnVpbHRpbl92YV9hcmdfcGFjayAoKQorIyBkZWZpbmUgX192YV9hcmdfcGFja19sZW4oKSBfX2J1aWx0aW5fdmFfYXJnX3BhY2tfbGVuICgpCisjZW5kaWYKKworLyogSXQgaXMgcG9zc2libGUgdG8gY29tcGlsZSBjb250YWluaW5nIEdDQyBleHRlbnNpb25zIGV2ZW4gaWYgR0NDIGlzCisgICBydW4gaW4gcGVkYW50aWMgbW9kZSBpZiB0aGUgdXNlcyBhcmUgY2FyZWZ1bGx5IG1hcmtlZCB1c2luZyB0aGUKKyAgIGBfX2V4dGVuc2lvbl9fJyBrZXl3b3JkLiAgQnV0IHRoaXMgaXMgbm90IGdlbmVyYWxseSBhdmFpbGFibGUgYmVmb3JlCisgICB2ZXJzaW9uIDIuOC4gICovCisjaWYgIV9fR05VQ19QUkVSRVEgKDIsOCkKKyMgZGVmaW5lIF9fZXh0ZW5zaW9uX18JCS8qIElnbm9yZSAqLworI2VuZGlmCisKKy8qIF9fcmVzdHJpY3QgaXMga25vd24gaW4gRUdDUyAxLjIgYW5kIGFib3ZlLiAqLworI2lmICFfX0dOVUNfUFJFUkVRICgyLDkyKQorIyBkZWZpbmUgX19yZXN0cmljdAkvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBJU08gQzk5IGFsc28gYWxsb3dzIHRvIGRlY2xhcmUgYXJyYXlzIGFzIG5vbi1vdmVybGFwcGluZy4gIFRoZSBzeW50YXggaXMKKyAgICAgYXJyYXlfbmFtZVtyZXN0cmljdF0KKyAgIEdDQyAzLjEgc3VwcG9ydHMgdGhpcy4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMywxKSAmJiAhZGVmaW5lZCBfX0dOVUdfXworIyBkZWZpbmUgX19yZXN0cmljdF9hcnIJX19yZXN0cmljdAorI2Vsc2UKKyMgaWZkZWYgX19HTlVDX18KKyMgIGRlZmluZSBfX3Jlc3RyaWN0X2FycgkvKiBOb3Qgc3VwcG9ydGVkIGluIG9sZCBHQ0MuICAqLworIyBlbHNlCisjICBpZiBkZWZpbmVkIF9fU1REQ19WRVJTSU9OX18gJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjICAgZGVmaW5lIF9fcmVzdHJpY3RfYXJyCXJlc3RyaWN0CisjICBlbHNlCisvKiBTb21lIG90aGVyIG5vbi1DOTkgY29tcGlsZXIuICAqLworIyAgIGRlZmluZSBfX3Jlc3RyaWN0X2FycgkvKiBOb3Qgc3VwcG9ydGVkLiAgKi8KKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworI2lmIGRlZmluZWQgX19MT05HX0RPVUJMRV9NQVRIX09QVElPTkFMICYmIGRlZmluZWQgX19OT19MT05HX0RPVUJMRV9NQVRICisjIGRlZmluZSBfX0xEQkxfQ09NUEFUIDEKKyMgaWZkZWYgX19SRURJUkVDVAorIyAgZGVmaW5lIF9fTERCTF9SRURJUjEobmFtZSwgcHJvdG8sIGFsaWFzKSBfX1JFRElSRUNUIChuYW1lLCBwcm90bywgYWxpYXMpCisjICBkZWZpbmUgX19MREJMX1JFRElSKG5hbWUsIHByb3RvKSBcCisgIF9fTERCTF9SRURJUjEgKG5hbWUsIHByb3RvLCBfX25sZGJsXyMjbmFtZSkKKyMgIGRlZmluZSBfX0xEQkxfUkVESVIxX05USChuYW1lLCBwcm90bywgYWxpYXMpIF9fUkVESVJFQ1RfTlRIIChuYW1lLCBwcm90bywgYWxpYXMpCisjICBkZWZpbmUgX19MREJMX1JFRElSX05USChuYW1lLCBwcm90bykgXAorICBfX0xEQkxfUkVESVIxX05USCAobmFtZSwgcHJvdG8sIF9fbmxkYmxfIyNuYW1lKQorIyAgZGVmaW5lIF9fTERCTF9SRURJUjFfREVDTChuYW1lLCBhbGlhcykgXAorICBleHRlcm4gX190eXBlb2YgKG5hbWUpIG5hbWUgX19hc20gKF9fQVNNTkFNRSAoI2FsaWFzKSk7CisjICBkZWZpbmUgX19MREJMX1JFRElSX0RFQ0wobmFtZSkgXAorICBleHRlcm4gX190eXBlb2YgKG5hbWUpIG5hbWUgX19hc20gKF9fQVNNTkFNRSAoIl9fbmxkYmxfIiAjbmFtZSkpOworIyAgZGVmaW5lIF9fUkVESVJFQ1RfTERCTChuYW1lLCBwcm90bywgYWxpYXMpIFwKKyAgX19MREJMX1JFRElSMSAobmFtZSwgcHJvdG8sIF9fbmxkYmxfIyNhbGlhcykKKyMgIGRlZmluZSBfX1JFRElSRUNUX05USF9MREJMKG5hbWUsIHByb3RvLCBhbGlhcykgXAorICBfX0xEQkxfUkVESVIxX05USCAobmFtZSwgcHJvdG8sIF9fbmxkYmxfIyNhbGlhcykKKyMgZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkIF9fTERCTF9DT01QQVQgfHwgIWRlZmluZWQgX19SRURJUkVDVAorIyBkZWZpbmUgX19MREJMX1JFRElSMShuYW1lLCBwcm90bywgYWxpYXMpIG5hbWUgcHJvdG8KKyMgZGVmaW5lIF9fTERCTF9SRURJUihuYW1lLCBwcm90bykgbmFtZSBwcm90bworIyBkZWZpbmUgX19MREJMX1JFRElSMV9OVEgobmFtZSwgcHJvdG8sIGFsaWFzKSBuYW1lIHByb3RvIF9fVEhST1cKKyMgZGVmaW5lIF9fTERCTF9SRURJUl9OVEgobmFtZSwgcHJvdG8pIG5hbWUgcHJvdG8gX19USFJPVworIyBkZWZpbmUgX19MREJMX1JFRElSX0RFQ0wobmFtZSkKKyMgaWZkZWYgX19SRURJUkVDVAorIyAgZGVmaW5lIF9fUkVESVJFQ1RfTERCTChuYW1lLCBwcm90bywgYWxpYXMpIF9fUkVESVJFQ1QgKG5hbWUsIHByb3RvLCBhbGlhcykKKyMgIGRlZmluZSBfX1JFRElSRUNUX05USF9MREJMKG5hbWUsIHByb3RvLCBhbGlhcykgXAorICBfX1JFRElSRUNUX05USCAobmFtZSwgcHJvdG8sIGFsaWFzKQorIyBlbmRpZgorI2VuZGlmCisKKyNlbmRpZgkgLyogc3lzL2NkZWZzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2RlYnVncmVnLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9kZWJ1Z3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OWM5NDMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9kZWJ1Z3JlZy5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OCwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX0RFQlVHUkVHX0gKKyNkZWZpbmUgX1NZU19ERUJVR1JFR19ICTEKKworLyogSW5kaWNhdGUgdGhlIHJlZ2lzdGVyIG51bWJlcnMgZm9yIGEgbnVtYmVyIG9mIHRoZSBzcGVjaWZpYworICAgZGVidWcgcmVnaXN0ZXJzLiAgUmVnaXN0ZXJzIDAtMyBjb250YWluIHRoZSBhZGRyZXNzZXMgd2Ugd2lzaCB0byB0cmFwIG9uICovCisjZGVmaW5lIERSX0ZJUlNUQUREUiAwICAgICAgICAvKiB1X2RlYnVncmVnW0RSX0ZJUlNUQUREUl0gKi8KKyNkZWZpbmUgRFJfTEFTVEFERFIgMyAgICAgICAgIC8qIHVfZGVidWdyZWdbRFJfTEFTVEFERFJdICAqLworCisjZGVmaW5lIERSX1NUQVRVUyA2ICAgICAgICAgICAvKiB1X2RlYnVncmVnW0RSX1NUQVRVU10gICAgICovCisjZGVmaW5lIERSX0NPTlRST0wgNyAgICAgICAgICAvKiB1X2RlYnVncmVnW0RSX0NPTlRST0xdICovCisKKy8qIERlZmluZSBhIGZldyB0aGluZ3MgZm9yIHRoZSBzdGF0dXMgcmVnaXN0ZXIuICBXZSBjYW4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lCisgICB3aGljaCBkZWJ1Z2dpbmcgcmVnaXN0ZXIgd2FzIHJlc3BvbnNpYmxlIGZvciB0aGUgdHJhcC4gIFRoZSBvdGhlciBiaXRzCisgICBhcmUgZWl0aGVyIHJlc2VydmVkIG9yIG5vdCBvZiBpbnRlcmVzdCB0byB1cy4gKi8KKworI2RlZmluZSBEUl9UUkFQMAkoMHgxKQkJLyogZGIwICovCisjZGVmaW5lIERSX1RSQVAxCSgweDIpCQkvKiBkYjEgKi8KKyNkZWZpbmUgRFJfVFJBUDIJKDB4NCkJCS8qIGRiMiAqLworI2RlZmluZSBEUl9UUkFQMwkoMHg4KQkJLyogZGIzICovCisKKyNkZWZpbmUgRFJfU1RFUAkJKDB4NDAwMCkJLyogc2luZ2xlLXN0ZXAgKi8KKyNkZWZpbmUgRFJfU1dJVENICSgweDgwMDApCS8qIHRhc2sgc3dpdGNoICovCisKKy8qIE5vdyBkZWZpbmUgYSBidW5jaCBvZiB0aGluZ3MgZm9yIG1hbmlwdWxhdGluZyB0aGUgY29udHJvbCByZWdpc3Rlci4KKyAgIFRoZSB0b3AgdHdvIGJ5dGVzIG9mIHRoZSBjb250cm9sIHJlZ2lzdGVyIGNvbnNpc3Qgb2YgNCBmaWVsZHMgb2YgNAorICAgYml0cyAtIGVhY2ggZmllbGQgY29ycmVzcG9uZHMgdG8gb25lIG9mIHRoZSBmb3VyIGRlYnVnIHJlZ2lzdGVycywKKyAgIGFuZCBpbmRpY2F0ZXMgd2hhdCB0eXBlcyBvZiBhY2Nlc3Mgd2UgdHJhcCBvbiwgYW5kIGhvdyBsYXJnZSB0aGUgZGF0YQorICAgZmllbGQgaXMgdGhhdCB3ZSBhcmUgbG9va2luZyBhdCAqLworCisjZGVmaW5lIERSX0NPTlRST0xfU0hJRlQgMTYgICAvKiBTa2lwIHRoaXMgbWFueSBiaXRzIGluIGN0bCByZWdpc3RlciAqLworI2RlZmluZSBEUl9DT05UUk9MX1NJWkUgIDQgICAgLyogNCBjb250cm9sIGJpdHMgcGVyIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgRFJfUldfRVhFQ1VURQkoMHgwKSAvKiBTZXR0aW5ncyBmb3IgdGhlIGFjY2VzcyB0eXBlcyB0byB0cmFwIG9uICovCisjZGVmaW5lIERSX1JXX1dSSVRFCSgweDEpCisjZGVmaW5lIERSX1JXX1JFQUQJKDB4MykKKworI2RlZmluZSBEUl9MRU5fMSAoMHgwKQkgICAgICAvKiBTZXR0aW5ncyBmb3IgZGF0YSBsZW5ndGggdG8gdHJhcCBvbiAqLworI2RlZmluZSBEUl9MRU5fMiAoMHg0KQorI2RlZmluZSBEUl9MRU5fNCAoMHhDKQorCisvKiBUaGUgbG93IGJ5dGUgdG8gdGhlIGNvbnRyb2wgcmVnaXN0ZXIgZGV0ZXJtaW5lIHdoaWNoIHJlZ2lzdGVycyBhcmUKKyAgIGVuYWJsZWQuICBUaGVyZSBhcmUgNCBmaWVsZHMgb2YgdHdvIGJpdHMuICBPbmUgYml0IGlzICJsb2NhbCIsIG1lYW5pbmcKKyAgIHRoYXQgdGhlIHByb2Nlc3NvciB3aWxsIHJlc2V0IHRoZSBiaXQgYWZ0ZXIgYSB0YXNrIHN3aXRjaCBhbmQgdGhlIG90aGVyCisgICBpcyBnbG9iYWwgbWVhbmluZyB0aGF0IHdlIGhhdmUgdG8gZXhwbGljaXRseSByZXNldCB0aGUgYml0LiAgV2l0aCBsaW51eCwKKyAgIHlvdSBjYW4gdXNlIGVpdGhlciBvbmUsIHNpbmNlIHdlIGV4cGxpY2l0bHkgemVybyB0aGUgcmVnaXN0ZXIgd2hlbiB3ZSBlbnRlcgorICAga2VybmVsIG1vZGUuICovCisKKyNkZWZpbmUgRFJfTE9DQUxfRU5BQkxFX1NISUZUICAwICAgLyogRXh0cmEgc2hpZnQgdG8gdGhlIGxvY2FsIGVuYWJsZSBiaXQgKi8KKyNkZWZpbmUgRFJfR0xPQkFMX0VOQUJMRV9TSElGVCAxICAgLyogRXh0cmEgc2hpZnQgdG8gdGhlIGdsb2JhbCBlbmFibGUgYml0ICovCisjZGVmaW5lIERSX0VOQUJMRV9TSVpFCSAgICAgICAyICAgLyogMiBlbmFibGUgYml0cyBwZXIgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBEUl9MT0NBTF9FTkFCTEVfTUFTSyAgKDB4NTUpIC8qIFNldCAgbG9jYWwgYml0cyBmb3IgYWxsIDQgcmVncyAqLworI2RlZmluZSBEUl9HTE9CQUxfRU5BQkxFX01BU0sgKDB4QUEpIC8qIFNldCBnbG9iYWwgYml0cyBmb3IgYWxsIDQgcmVncyAqLworCisvKiBUaGUgc2Vjb25kIGJ5dGUgdG8gdGhlIGNvbnRyb2wgcmVnaXN0ZXIgaGFzIGEgZmV3IHNwZWNpYWwgdGhpbmdzLgorCisgICAgT24gdGhlIGkzODYsIHlvdSBzaG91bGQgc2V0IHRoZSBEUl9MT0NBTF9TTE9XRE9XTiBvcgorICAgIERSX0dMT0JBTF9TTE9XRE9XTiBiaXRzIGlmIHlvdSB3YW50IHRvIGtub3cgZXhhY3RseSB3aGljaAorICAgIGluc3RydWN0aW9uIHRyaWdnZXJlZCB0aGUgd2F0Y2hwb2ludC4gIFNldHRpbmcgdGhlc2UgYml0cyBjYXVzZXMKKyAgICB0aGUgcHJvY2Vzc29yIHRvIHJ1biBtb3JlIHNsb3dseSwgYnV0IGxlYXZpbmcgdGhlbSBjbGVhciBtYWtlcyBpdAorICAgIHRyZWF0IHdhdGNocG9pbnQgaGl0cyBhcyBpbXByZWNpc2UgZXhjZXB0aW9ucywgc28geW91IGNhbid0CisgICAgcmVsaWFibHkgZGV0ZXJtaW5lIHdoaWNoIGluc3RydWN0aW9uIGNhdXNlZCB0aGUgaGl0LgorCisgICAgVGhlIGk0ODYgYW5kIGFsbCBsYXRlciBJQS0zMiBwcm9jZXNzb3JzIGlnbm9yZSBEUl9MT0NBTF9TTE9XRE9XTgorICAgIGFuZCBEUl9HTE9CQUxfU0xPV0RPV04uICBUaGV5IGFsd2F5cyByZXBvcnQgdGhlIGV4Y2VwdGlvbgorICAgIHByZWNpc2VseSwgZXhjZXB0IGluIHNvbWUgcmFyZSBjYXNlcywgd2hpY2ggdGhlIHVzZXIgY2FuJ3QgZG8KKyAgICBhbnl0aGluZyBhYm91dC4gICovCisKKyNkZWZpbmUgRFJfQ09OVFJPTF9SRVNFUlZFRCAoMHhGQzAwKSAvKiBSZXNlcnZlZCBieSBJbnRlbCAqLworI2RlZmluZSBEUl9MT0NBTF9TTE9XRE9XTiAgICgweDEwMCkgIC8qIExvY2FsIHNsb3cgdGhlIHBpcGVsaW5lICovCisjZGVmaW5lIERSX0dMT0JBTF9TTE9XRE9XTiAgKDB4MjAwKSAgLyogR2xvYmFsIHNsb3cgdGhlIHBpcGVsaW5lICovCisKKyNlbmRpZgkvKiBzeXMvZGVidWdyZWcuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZGlyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9kaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjExZDZjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZGlyLmgKQEAgLTAsMCArMSwyOCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfRElSX0gKKyNkZWZpbmUJX1NZU19ESVJfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisKKyNkZWZpbmUJZGlyZWN0CWRpcmVudAorCisjZW5kaWYJLyogc3lzL2Rpci5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZWxmLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9lbGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTU5Y2RjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZWxmLmgKQEAgLTAsMCArMSwyNiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk4LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfRUxGX0gKKyNkZWZpbmUgX1NZU19FTEZfSAkxCisKKyN3YXJuaW5nICJUaGlzIGhlYWRlciBpcyBvYnNvbGV0ZTsgdXNlIDxzeXMvcHJvY2ZzLmg+IGluc3RlYWQuIgorCisjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgorCisjZW5kaWYJLyogX1NZU19FTEZfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZXBvbGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2Vwb2xsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIzZGI5MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2Vwb2xsLmgKQEAgLTAsMCArMSwxNDQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA5LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfRVBPTExfSAorI2RlZmluZQlfU1lTX0VQT0xMX0gJMQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qIEdldCBfX3NpZ3NldF90LiAgKi8KKyNpbmNsdWRlIDxiaXRzL3NpZ3NldC5oPgorCisjaWZuZGVmIF9fc2lnc2V0X3RfZGVmaW5lZAorIyBkZWZpbmUgX19zaWdzZXRfdF9kZWZpbmVkCit0eXBlZGVmIF9fc2lnc2V0X3Qgc2lnc2V0X3Q7CisjZW5kaWYKKworCisvKiBGbGFncyB0byBiZSBwYXNzZWQgdG8gZXBvbGxfY3JlYXRlMS4gICovCitlbnVtCisgIHsKKyAgICBFUE9MTF9DTE9FWEVDID0gMDIwMDAwMDAsCisjZGVmaW5lIEVQT0xMX0NMT0VYRUMgRVBPTExfQ0xPRVhFQworICAgIEVQT0xMX05PTkJMT0NLID0gMDQwMDAKKyNkZWZpbmUgRVBPTExfTk9OQkxPQ0sgRVBPTExfTk9OQkxPQ0sKKyAgfTsKKworCitlbnVtIEVQT0xMX0VWRU5UUworICB7CisgICAgRVBPTExJTiA9IDB4MDAxLAorI2RlZmluZSBFUE9MTElOIEVQT0xMSU4KKyAgICBFUE9MTFBSSSA9IDB4MDAyLAorI2RlZmluZSBFUE9MTFBSSSBFUE9MTFBSSQorICAgIEVQT0xMT1VUID0gMHgwMDQsCisjZGVmaW5lIEVQT0xMT1VUIEVQT0xMT1VUCisgICAgRVBPTExSRE5PUk0gPSAweDA0MCwKKyNkZWZpbmUgRVBPTExSRE5PUk0gRVBPTExSRE5PUk0KKyAgICBFUE9MTFJEQkFORCA9IDB4MDgwLAorI2RlZmluZSBFUE9MTFJEQkFORCBFUE9MTFJEQkFORAorICAgIEVQT0xMV1JOT1JNID0gMHgxMDAsCisjZGVmaW5lIEVQT0xMV1JOT1JNIEVQT0xMV1JOT1JNCisgICAgRVBPTExXUkJBTkQgPSAweDIwMCwKKyNkZWZpbmUgRVBPTExXUkJBTkQgRVBPTExXUkJBTkQKKyAgICBFUE9MTE1TRyA9IDB4NDAwLAorI2RlZmluZSBFUE9MTE1TRyBFUE9MTE1TRworICAgIEVQT0xMRVJSID0gMHgwMDgsCisjZGVmaW5lIEVQT0xMRVJSIEVQT0xMRVJSCisgICAgRVBPTExIVVAgPSAweDAxMCwKKyNkZWZpbmUgRVBPTExIVVAgRVBPTExIVVAKKyAgICBFUE9MTFJESFVQID0gMHgyMDAwLAorI2RlZmluZSBFUE9MTFJESFVQIEVQT0xMUkRIVVAKKyAgICBFUE9MTE9ORVNIT1QgPSAxdSA8PCAzMCwKKyNkZWZpbmUgRVBPTExPTkVTSE9UIEVQT0xMT05FU0hPVAorICAgIEVQT0xMRVQgPSAxdSA8PCAzMQorI2RlZmluZSBFUE9MTEVUIEVQT0xMRVQKKyAgfTsKKworCisvKiBWYWxpZCBvcGNvZGVzICggIm9wIiBwYXJhbWV0ZXIgKSB0byBpc3N1ZSB0byBlcG9sbF9jdGwoKS4gICovCisjZGVmaW5lIEVQT0xMX0NUTF9BREQgMQkvKiBBZGQgYSBmaWxlIGRlc2NyaXB0b3IgdG8gdGhlIGludGVyZmFjZS4gICovCisjZGVmaW5lIEVQT0xMX0NUTF9ERUwgMgkvKiBSZW1vdmUgYSBmaWxlIGRlc2NyaXB0b3IgZnJvbSB0aGUgaW50ZXJmYWNlLiAgKi8KKyNkZWZpbmUgRVBPTExfQ1RMX01PRCAzCS8qIENoYW5nZSBmaWxlIGRlc2NyaXB0b3IgZXBvbGxfZXZlbnQgc3RydWN0dXJlLiAgKi8KKworCit0eXBlZGVmIHVuaW9uIGVwb2xsX2RhdGEKK3sKKyAgdm9pZCAqcHRyOworICBpbnQgZmQ7CisgIHVpbnQzMl90IHUzMjsKKyAgdWludDY0X3QgdTY0OworfSBlcG9sbF9kYXRhX3Q7CisKK3N0cnVjdCBlcG9sbF9ldmVudAoreworICB1aW50MzJfdCBldmVudHM7CS8qIEVwb2xsIGV2ZW50cyAqLworICBlcG9sbF9kYXRhX3QgZGF0YTsJLyogVXNlciBkYXRhIHZhcmlhYmxlICovCit9OworCisKK19fQkVHSU5fREVDTFMKKworLyogQ3JlYXRlcyBhbiBlcG9sbCBpbnN0YW5jZS4gIFJldHVybnMgYW4gZmQgZm9yIHRoZSBuZXcgaW5zdGFuY2UuCisgICBUaGUgInNpemUiIHBhcmFtZXRlciBpcyBhIGhpbnQgc3BlY2lmeWluZyB0aGUgbnVtYmVyIG9mIGZpbGUKKyAgIGRlc2NyaXB0b3JzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IGluc3RhbmNlLiAgVGhlIGZkCisgICByZXR1cm5lZCBieSBlcG9sbF9jcmVhdGUoKSBzaG91bGQgYmUgY2xvc2VkIHdpdGggY2xvc2UoKS4gICovCitleHRlcm4gaW50IGVwb2xsX2NyZWF0ZSAoaW50IF9fc2l6ZSkgX19USFJPVzsKKworLyogU2FtZSBhcyBlcG9sbF9jcmVhdGUgYnV0IHdpdGggYW4gRkxBR1MgcGFyYW1ldGVyLiAgVGhlIHVudXNlZCBTSVpFCisgICBwYXJhbWV0ZXIgaGFzIGJlZW4gZHJvcHBlZC4gICovCitleHRlcm4gaW50IGVwb2xsX2NyZWF0ZTEgKGludCBfX2ZsYWdzKSBfX1RIUk9XOworCisKKy8qIE1hbmlwdWxhdGUgYW4gZXBvbGwgaW5zdGFuY2UgImVwZmQiLiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLAorICAgLTEgaW4gY2FzZSBvZiBlcnJvciAoIHRoZSAiZXJybm8iIHZhcmlhYmxlIHdpbGwgY29udGFpbiB0aGUKKyAgIHNwZWNpZmljIGVycm9yIGNvZGUgKSBUaGUgIm9wIiBwYXJhbWV0ZXIgaXMgb25lIG9mIHRoZSBFUE9MTF9DVExfKgorICAgY29uc3RhbnRzIGRlZmluZWQgYWJvdmUuIFRoZSAiZmQiIHBhcmFtZXRlciBpcyB0aGUgdGFyZ2V0IG9mIHRoZQorICAgb3BlcmF0aW9uLiBUaGUgImV2ZW50IiBwYXJhbWV0ZXIgZGVzY3JpYmVzIHdoaWNoIGV2ZW50cyB0aGUgY2FsbGVyCisgICBpcyBpbnRlcmVzdGVkIGluIGFuZCBhbnkgYXNzb2NpYXRlZCB1c2VyIGRhdGEuICAqLworZXh0ZXJuIGludCBlcG9sbF9jdGwgKGludCBfX2VwZmQsIGludCBfX29wLCBpbnQgX19mZCwKKwkJICAgICAgc3RydWN0IGVwb2xsX2V2ZW50ICpfX2V2ZW50KSBfX1RIUk9XOworCisKKy8qIFdhaXQgZm9yIGV2ZW50cyBvbiBhbiBlcG9sbCBpbnN0YW5jZSAiZXBmZCIuIFJldHVybnMgdGhlIG51bWJlciBvZgorICAgdHJpZ2dlcmVkIGV2ZW50cyByZXR1cm5lZCBpbiAiZXZlbnRzIiBidWZmZXIuIE9yIC0xIGluIGNhc2Ugb2YKKyAgIGVycm9yIHdpdGggdGhlICJlcnJubyIgdmFyaWFibGUgc2V0IHRvIHRoZSBzcGVjaWZpYyBlcnJvciBjb2RlLiBUaGUKKyAgICJldmVudHMiIHBhcmFtZXRlciBpcyBhIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbiB0cmlnZ2VyZWQKKyAgIGV2ZW50cy4gVGhlICJtYXhldmVudHMiIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBldmVudHMgdG8gYmUKKyAgIHJldHVybmVkICggdXN1YWxseSBzaXplIG9mICJldmVudHMiICkuIFRoZSAidGltZW91dCIgcGFyYW1ldGVyCisgICBzcGVjaWZpZXMgdGhlIG1heGltdW0gd2FpdCB0aW1lIGluIG1pbGxpc2Vjb25kcyAoLTEgPT0gaW5maW5pdGUpLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZXBvbGxfd2FpdCAoaW50IF9fZXBmZCwgc3RydWN0IGVwb2xsX2V2ZW50ICpfX2V2ZW50cywKKwkJICAgICAgIGludCBfX21heGV2ZW50cywgaW50IF9fdGltZW91dCk7CisKKworLyogU2FtZSBhcyBlcG9sbF93YWl0LCBidXQgdGhlIHRocmVhZCdzIHNpZ25hbCBtYXNrIGlzIHRlbXBvcmFyaWx5CisgICBhbmQgYXRvbWljYWxseSByZXBsYWNlZCB3aXRoIHRoZSBvbmUgcHJvdmlkZWQgYXMgcGFyYW1ldGVyLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZXBvbGxfcHdhaXQgKGludCBfX2VwZmQsIHN0cnVjdCBlcG9sbF9ldmVudCAqX19ldmVudHMsCisJCQlpbnQgX19tYXhldmVudHMsIGludCBfX3RpbWVvdXQsCisJCQlfX2NvbnN0IF9fc2lnc2V0X3QgKl9fc3MpOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL2Vwb2xsLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2Vycm5vLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9lcnJuby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOWY0ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9lcnJuby5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxlcnJuby5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZXZlbnRmZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZXZlbnRmZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NDJkZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9ldmVudGZkLmgKQEAgLTAsMCArMSw1NCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfRVZFTlRGRF9ICisjZGVmaW5lCV9TWVNfRVZFTlRGRF9ICTEKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisKKy8qIFR5cGUgZm9yIGV2ZW50IGNvdW50ZXIuICAqLwordHlwZWRlZiB1aW50NjRfdCBldmVudGZkX3Q7CisKKy8qIEZsYWdzIGZvciBzaWduYWxmZC4gICovCitlbnVtCisgIHsKKyAgICBFRkRfU0VNQVBIT1JFID0gMSwKKyNkZWZpbmUgRUZEX1NFTUFQSE9SRSBFRkRfU0VNQVBIT1JFCisgICAgRUZEX0NMT0VYRUMgPSAwMjAwMDAwMCwKKyNkZWZpbmUgRUZEX0NMT0VYRUMgRUZEX0NMT0VYRUMKKyAgICBFRkRfTk9OQkxPQ0sgPSAwNDAwMAorI2RlZmluZSBFRkRfTk9OQkxPQ0sgRUZEX05PTkJMT0NLCisgIH07CisKKworX19CRUdJTl9ERUNMUworCisvKiBSZXR1cm4gZmlsZSBkZXNjcmlwdG9yIGZvciBnZW5lcmljIGV2ZW50IGNoYW5uZWwuICBTZXQgaW5pdGlhbAorICAgdmFsdWUgdG8gQ09VTlQuICAqLworZXh0ZXJuIGludCBldmVudGZkIChpbnQgX19jb3VudCwgaW50IF9fZmxhZ3MpIF9fVEhST1c7CisKKy8qIFJlYWQgZXZlbnQgY291bnRlciBhbmQgcG9zc2libHkgd2FpdCBmb3IgZXZlbnRzLiAgKi8KK2V4dGVybiBpbnQgZXZlbnRmZF9yZWFkIChpbnQgX19mZCwgZXZlbnRmZF90ICpfX3ZhbHVlKTsKKworLyogSW5jcmVtZW50IGV2ZW50IGNvdW50ZXIuICAqLworZXh0ZXJuIGludCBldmVudGZkX3dyaXRlIChpbnQgX19mZCwgZXZlbnRmZF90IF9fdmFsdWUpOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL2V2ZW50ZmQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZmFub3RpZnkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2Zhbm90aWZ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4NTAwYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2Zhbm90aWZ5LmgKQEAgLTAsMCArMSwzOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfRkFOT1RJRllfSAorI2RlZmluZQlfU1lTX0ZBTk9USUZZX0gJMQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8bGludXgvZmFub3RpZnkuaD4KKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBmYW5vdGlmeSBncm91cC4gICovCitleHRlcm4gaW50IGZhbm90aWZ5X2luaXQgKHVuc2lnbmVkIGludCBfX2ZsYWdzLCB1bnNpZ25lZCBpbnQgX19ldmVudF9mX2ZsYWdzKQorICBfX1RIUk9XOworCisvKiBBZGQsIHJlbW92ZSwgb3IgbW9kaWZ5IGFuIGZhbm90aWZ5IG1hcmsgb24gYSBmaWxlc3lzdGVtIG9iamVjdC4gICovCitleHRlcm4gaW50IGZhbm90aWZ5X21hcmsgKGludCBfX2Zhbm90aWZ5X2ZkLCB1bnNpZ25lZCBpbnQgX19mbGFncywKKwkJCSAgdWludDY0X3QgX19tYXNrLCBpbnQgX19kZmQsIGNvbnN0IGNoYXIgKl9fcGF0aG5hbWUpCisgICAgIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvZmFub3RpZnkuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZmNudGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2ZjbnRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzMDQ1NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2ZjbnRsLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGZjbnRsLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9maWxlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiMzYzNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2ZpbGUuaApAQCAtMCwwICsxLDU2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5NiwgOTcsIDk4LCA5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX0ZJTEVfSAorI2RlZmluZQlfU1lTX0ZJTEVfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaWZuZGVmCV9GQ05UTF9ICisjIGluY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYKKworX19CRUdJTl9ERUNMUworCisKKy8qIEFsdGVybmF0ZSBuYW1lcyBmb3IgdmFsdWVzIGZvciB0aGUgV0hFTkNFIGFyZ3VtZW50IHRvIGBsc2VlaycuCisgICBUaGVzZSBhcmUgdGhlIHNhbWUgYXMgU0VFS19TRVQsIFNFRUtfQ1VSLCBhbmQgU0VFS19FTkQsIHJlc3BlY3RpdmVseS4gICovCisjaWZuZGVmIExfU0VUCisjIGRlZmluZSBMX1NFVAkwCS8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCisjIGRlZmluZSBMX0lOQ1IJMQkvKiBTZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbi4gICovCisjIGRlZmluZSBMX1hUTkQJMgkvKiBTZWVrIGZyb20gZW5kIG9mIGZpbGUuICAqLworI2VuZGlmCisKKworLyogT3BlcmF0aW9ucyBmb3IgdGhlIGBmbG9jaycgY2FsbC4gICovCisjZGVmaW5lCUxPQ0tfU0gJMQkvKiBTaGFyZWQgbG9jay4gICovCisjZGVmaW5lCUxPQ0tfRVgJMiAJLyogRXhjbHVzaXZlIGxvY2suICAqLworI2RlZmluZQlMT0NLX1VOCTgJLyogVW5sb2NrLiAgKi8KKworLyogQ2FuIGJlIE9SJ2QgaW4gdG8gb25lIG9mIHRoZSBhYm92ZS4gICovCisjZGVmaW5lCUxPQ0tfTkIJNAkvKiBEb24ndCBibG9jayB3aGVuIGxvY2tpbmcuICAqLworCisKKy8qIEFwcGx5IG9yIHJlbW92ZSBhbiBhZHZpc29yeSBsb2NrLCBhY2NvcmRpbmcgdG8gT1BFUkFUSU9OLAorICAgb24gdGhlIGZpbGUgRkQgcmVmZXJzIHRvLiAgKi8KK2V4dGVybiBpbnQgZmxvY2sgKGludCBfX2ZkLCBpbnQgX19vcGVyYXRpb24pIF9fVEhST1c7CisKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9maWxlLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9mc3VpZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZnN1aWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWNiMTk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZnN1aWQuaApAQCAtMCwwICsxLDM2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19GU1VJRF9ICisjZGVmaW5lIF9TWVNfRlNVSURfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIENoYW5nZSB1aWQgdXNlZCBmb3IgZmlsZSBhY2Nlc3MgY29udHJvbCB0byBVSUQsIHdpdGhvdXQgYWZmZWN0aW5nCisgICBvdGhlciBwcml2aWxlZ2VzIChzdWNoIGFzIHdobyBjYW4gc2VuZCBzaWduYWxzIGF0IHRoZSBwcm9jZXNzKS4gICovCitleHRlcm4gaW50IHNldGZzdWlkIChfX3VpZF90IF9fdWlkKSBfX1RIUk9XOworCisvKiBEaXR0byBmb3IgZ3JvdXAgaWQuICovCitleHRlcm4gaW50IHNldGZzZ2lkIChfX2dpZF90IF9fZ2lkKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogZnN1aWQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZ21vbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZ21vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMmY4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9nbW9uLmgKQEAgLTAsMCArMSwyMDEgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkyLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWdtb24uaAk4LjIgKEJlcmtlbGV5KSAxLzQvOTQKKyAqLworCisjaWZuZGVmCV9TWVNfR01PTl9ICisjZGVmaW5lCV9TWVNfR01PTl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyoKKyAqIFNlZSBnbW9uX291dC5oIGZvciBnbW9uLm91dCBmb3JtYXQuCisgKi8KKworLyogc3RydWN0dXJlIGVtaXR0ZWQgYnkgImdjYyAtYSIuICBUaGlzIG11c3QgbWF0Y2ggc3RydWN0IGJiIGluCisgICBnY2MvbGliZ2NjMi5jLiAgSXQgaXMgT0sgZm9yIGdjYyB0byBkZWNsYXJlIGEgbG9uZ2VyIHN0cnVjdHVyZSBhcworICAgbG9uZyBhcyB0aGUgbWVtYmVycyBiZWxvdyBhcmUgcHJlc2VudC4gICovCitzdHJ1Y3QgX19iYgoreworICBsb25nCQkJemVyb193b3JkOworICBjb25zdCBjaGFyCQkqZmlsZW5hbWU7CisgIGxvbmcJCQkqY291bnRzOworICBsb25nCQkJbmNvdW50czsKKyAgc3RydWN0IF9fYmIJCSpuZXh0OworICBjb25zdCB1bnNpZ25lZCBsb25nCSphZGRyZXNzZXM7Cit9OworCitleHRlcm4gc3RydWN0IF9fYmIgKl9fYmJfaGVhZDsKKworLyoKKyAqIGhpc3RvZ3JhbSBjb3VudGVycyBhcmUgdW5zaWduZWQgc2hvcnRzIChhY2NvcmRpbmcgdG8gdGhlIGtlcm5lbCkuCisgKi8KKyNkZWZpbmUJSElTVENPVU5URVIJdW5zaWduZWQgc2hvcnQKKworLyoKKyAqIGZyYWN0aW9uIG9mIHRleHQgc3BhY2UgdG8gYWxsb2NhdGUgZm9yIGhpc3RvZ3JhbSBjb3VudGVycyBoZXJlLCAxLzIKKyAqLworI2RlZmluZQlISVNURlJBQ1RJT04JMgorCisvKgorICogRnJhY3Rpb24gb2YgdGV4dCBzcGFjZSB0byBhbGxvY2F0ZSBmb3IgZnJvbSBoYXNoIGJ1Y2tldHMuCisgKiBUaGUgdmFsdWUgb2YgSEFTSEZSQUNUSU9OIGlzIGJhc2VkIG9uIHRoZSBtaW5pbXVtIG51bWJlciBvZiBieXRlcworICogb2Ygc2VwYXJhdGlvbiBiZXR3ZWVuIHR3byBzdWJyb3V0aW5lIGNhbGwgcG9pbnRzIGluIHRoZSBvYmplY3QgY29kZS4KKyAqIEdpdmVuIE1JTl9TVUJSX1NFUEFSQVRJT04gYnl0ZXMgb2Ygc2VwYXJhdGlvbiB0aGUgdmFsdWUgb2YKKyAqIEhBU0hGUkFDVElPTiBpcyBjYWxjdWxhdGVkIGFzOgorICoKKyAqCUhBU0hGUkFDVElPTiA9IE1JTl9TVUJSX1NFUEFSQVRJT04gLyAoMiAqIHNpemVvZihzaG9ydCkgLSAxKTsKKyAqCisgKiBGb3IgZXhhbXBsZSwgb24gdGhlIFZBWCwgdGhlIHNob3J0ZXN0IHR3byBjYWxsIHNlcXVlbmNlIGlzOgorICoKKyAqCWNhbGxzCSQwLChyMCkKKyAqCWNhbGxzCSQwLChyMCkKKyAqCisgKiB3aGljaCBpcyBzZXBhcmF0ZWQgYnkgb25seSB0aHJlZSBieXRlcywgdGh1cyBIQVNIRlJBQ1RJT04gaXMKKyAqIGNhbGN1bGF0ZWQgYXM6CisgKgorICoJSEFTSEZSQUNUSU9OID0gMyAvICgyICogMiAtIDEpID0gMQorICoKKyAqIE5vdGUgdGhhdCB0aGUgZGl2aXNpb24gYWJvdmUgcm91bmRzIGRvd24sIHRodXMgaWYgTUlOX1NVQlJfRlJBQ1RJT04KKyAqIGlzIGxlc3MgdGhhbiB0aHJlZSwgdGhpcyBhbGdvcml0aG0gd2lsbCBub3Qgd29yayEKKyAqCisgKiBJbiBwcmFjdGljZSwgaG93ZXZlciwgY2FsbCBpbnN0cnVjdGlvbnMgYXJlIHJhcmVseSBhdCBhIG1pbmltYWwKKyAqIGRpc3RhbmNlLiAgSGVuY2UsIHdlIHdpbGwgZGVmaW5lIEhBU0hGUkFDVElPTiB0byBiZSAyIGFjcm9zcyBhbGwKKyAqIGFyY2hpdGVjdHVyZXMuICBUaGlzIHNhdmVzIGEgcmVhc29uYWJsZSBhbW91bnQgb2Ygc3BhY2UgZm9yCisgKiBwcm9maWxpbmcgZGF0YSBzdHJ1Y3R1cmVzIHdpdGhvdXQgKGluIHByYWN0aWNlKSBzYWNyaWZpY2luZworICogYW55IGdyYW51bGFyaXR5LgorICovCisjZGVmaW5lCUhBU0hGUkFDVElPTgkyCisKKy8qCisgKiBQZXJjZW50IG9mIHRleHQgc3BhY2UgdG8gYWxsb2NhdGUgZm9yIHRvc3RydWN0cy4KKyAqIFRoaXMgaXMgYSBoZXVyaXN0aWM7IHdlIHdpbGwgZmFpbCB3aXRoIGEgd2FybmluZyB3aGVuIHByb2ZpbGluZyBwcm9ncmFtcworICogd2l0aCBhIHZlcnkgbGFyZ2UgbnVtYmVyIG9mIHZlcnkgc21hbGwgZnVuY3Rpb25zLCBidXQgdGhhdCdzCisgKiBub3JtYWxseSBPSy4KKyAqIDIgaXMgcHJvYmFibHkgc3RpbGwgYSBnb29kIHZhbHVlIGZvciBub3JtYWwgcHJvZ3JhbXMuCisgKiBQcm9maWxpbmcgYSB0ZXN0IGNhc2Ugd2l0aCA2NDAwMCBzbWFsbCBmdW5jdGlvbnMgd2lsbCB3b3JrIGlmCisgKiB5b3UgcmFpc2UgdGhpcyB2YWx1ZSB0byAzIGFuZCBsaW5rIHN0YXRpY2FsbHkgKHdoaWNoIGJsb2F0cyB0aGUKKyAqIHRleHQgc2l6ZSwgdGh1cyByYWlzaW5nIHRoZSBudW1iZXIgb2YgYXJjcyBleHBlY3RlZCBieSB0aGUgaGV1cmlzdGljKS4KKyAqLworI2RlZmluZSBBUkNERU5TSVRZCTMKKworLyoKKyAqIEFsd2F5cyBhbGxvY2F0ZSBhdCBsZWFzdCB0aGlzIG1hbnkgdG9zdHJ1Y3RzLiAgVGhpcworICogaGlkZXMgdGhlIGluYWRlcXVhY3kgb2YgdGhlIEFSQ0RFTlNJVFkgaGV1cmlzdGljLCBhdCBsZWFzdAorICogZm9yIHNtYWxsIHByb2dyYW1zLgorICovCisjZGVmaW5lIE1JTkFSQ1MJCTUwCisKKy8qCisgKiBUaGUgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCBpbmRpY2VzIGludG8gZ21vbnBhcmFtLnRvc1tdLgorICovCisjZGVmaW5lCUFSQ0lOREVYCXVfbG9uZworCisvKiAKKyAqIE1heGltdW0gbnVtYmVyIG9mIGFyY3Mgd2Ugd2FudCB0byBhbGxvdy4KKyAqIFVzZWQgdG8gYmUgbWF4IHJlcHJlc2VudGFibGUgdmFsdWUgb2YgQVJDSU5ERVggbWludXMgMiwgYnV0IG5vdyAKKyAqIHRoYXQgQVJDSU5ERVggaXMgYSBsb25nLCB0aGF0J3MgdG9vIGxhcmdlOyB3ZSBkb24ndCByZWFsbHkgd2FudCAKKyAqIHRvIGFsbG93IGEgNDggZ2lnYWJ5dGUgdGFibGUuCisgKiBUaGUgb2xkIHZhbHVlIG9mIDE8PDE2IHdhc24ndCBoaWdoIGVub3VnaCBpbiBwcmFjdGljZSBmb3IgbGFyZ2UgQysrCisgKiBwcm9ncmFtczsgd2lsbCAxPDwyMCBiZSBhZGVxdWF0ZSBmb3IgbG9uZz8gIEZJWE1FCisgKi8KKyNkZWZpbmUgTUFYQVJDUwkJKDEgPDwgMjApCisKK3N0cnVjdCB0b3N0cnVjdCB7CisJdV9sb25nCQlzZWxmcGM7CisJbG9uZwkJY291bnQ7CisJQVJDSU5ERVgJbGluazsKK307CisKKy8qCisgKiBhIHJhdyBhcmMsIHdpdGggcG9pbnRlcnMgdG8gdGhlIGNhbGxpbmcgc2l0ZSBhbmQKKyAqIHRoZSBjYWxsZWQgc2l0ZSBhbmQgYSBjb3VudC4KKyAqLworc3RydWN0IHJhd2FyYyB7CisJdV9sb25nCXJhd19mcm9tcGM7CisJdV9sb25nCXJhd19zZWxmcGM7CisJbG9uZwlyYXdfY291bnQ7Cit9OworCisvKgorICogZ2VuZXJhbCByb3VuZGluZyBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUgUk9VTkRET1dOKHgseSkJKCgoeCkvKHkpKSooeSkpCisjZGVmaW5lIFJPVU5EVVAoeCx5KQkoKCgoeCkrKHkpLTEpLyh5KSkqKHkpKQorCisvKgorICogVGhlIHByb2ZpbGluZyBkYXRhIHN0cnVjdHVyZXMgYXJlIGhvdXNlZCBpbiB0aGlzIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IGdtb25wYXJhbSB7CisJbG9uZyBpbnQJc3RhdGU7CisJdV9zaG9ydAkJKmtjb3VudDsKKwl1X2xvbmcJCWtjb3VudHNpemU7CisJQVJDSU5ERVgJKmZyb21zOworCXVfbG9uZwkJZnJvbXNzaXplOworCXN0cnVjdCB0b3N0cnVjdAkqdG9zOworCXVfbG9uZwkJdG9zc2l6ZTsKKwlsb25nCQl0b2xpbWl0OworCXVfbG9uZwkJbG93cGM7CisJdV9sb25nCQloaWdocGM7CisJdV9sb25nCQl0ZXh0c2l6ZTsKKwl1X2xvbmcJCWhhc2hmcmFjdGlvbjsKKwlsb25nCQlsb2dfaGFzaGZyYWN0aW9uOworfTsKKworLyoKKyAqIFBvc3NpYmxlIHN0YXRlcyBvZiBwcm9maWxpbmcuCisgKi8KKyNkZWZpbmUJR01PTl9QUk9GX09OCTAKKyNkZWZpbmUJR01PTl9QUk9GX0JVU1kJMQorI2RlZmluZQlHTU9OX1BST0ZfRVJST1IJMgorI2RlZmluZQlHTU9OX1BST0ZfT0ZGCTMKKworLyoKKyAqIFN5c2N0bCBkZWZpbml0aW9ucyBmb3IgZXh0cmFjdGluZyBwcm9maWxpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUga2VybmVsLgorICovCisjZGVmaW5lCUdQUk9GX1NUQVRFCTAJLyogaW50OiBwcm9maWxpbmcgZW5hYmxpbmcgdmFyaWFibGUgKi8KKyNkZWZpbmUJR1BST0ZfQ09VTlQJMQkvKiBzdHJ1Y3Q6IHByb2ZpbGUgdGljayBjb3VudCBidWZmZXIgKi8KKyNkZWZpbmUJR1BST0ZfRlJPTVMJMgkvKiBzdHJ1Y3Q6IGZyb20gbG9jYXRpb24gaGFzaCBidWNrZXQgKi8KKyNkZWZpbmUJR1BST0ZfVE9TCTMJLyogc3RydWN0OiBkZXN0aW5hdGlvbi9jb3VudCBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUJR1BST0ZfR01PTlBBUkFNCTQJLyogc3RydWN0OiBwcm9maWxpbmcgcGFyYW1ldGVycyAoc2VlIGFib3ZlKSAqLworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFNldCB1cCBkYXRhIHN0cnVjdHVyZXMgYW5kIHN0YXJ0IHByb2ZpbGluZy4gICovCitleHRlcm4gdm9pZCBfX21vbnN0YXJ0dXAgKHVfbG9uZyBfX2xvd3BjLCB1X2xvbmcgX19oaWdocGMpIF9fVEhST1c7CitleHRlcm4gdm9pZCBtb25zdGFydHVwICh1X2xvbmcgX19sb3dwYywgdV9sb25nIF9faGlnaHBjKSBfX1RIUk9XOworCisvKiBDbGVhbiB1cCBwcm9maWxpbmcgYW5kIHdyaXRlIG91dCBnbW9uLm91dC4gICovCitleHRlcm4gdm9pZCBfbWNsZWFudXAgKHZvaWQpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvZ21vbi5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9nbW9uX291dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZ21vbl9vdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmEwOWU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvZ21vbl9vdXQuaApAQCAtMCwwICsxLDgwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIE1vc2JlcmdlciA8ZGF2aWRtQGNzLmFyaXpvbmEuZWR1Pi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiBnbW9uLm91dCBmaWxlcy4gIEl0IHNob3VsZCBoYXZlCisgICBhcyBmZXcgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGFzIHBvc3NpYmxlIGFzIGl0IGlzIGdvaW5nIHRvIGJlIGluY2x1ZGVkCisgICBpbiBtYW55IGRpZmZlcmVudCBwcm9ncmFtcy4gIFRoYXQgaXMsIG1pbmltaXplIHRoZSBudW1iZXIgb2YgI2luY2x1ZGUncy4KKworICAgQSBnbW9uLm91dCBmaWxlIGNvbnNpc3RzIG9mIGEgaGVhZGVyIChkZWZpbmVkIGJ5IGdtb25faGRyKSBmb2xsb3dlZCBieQorICAgYSBzZXF1ZW5jZSBvZiByZWNvcmRzLiAgRWFjaCByZWNvcmQgc3RhcnRzIHdpdGggYSBvbmUtYnl0ZSB0YWcKKyAgIGlkZW50aWZ5aW5nIHRoZSB0eXBlIG9mIHJlY29yZHMsIGZvbGxvd2VkIGJ5IHJlY29yZHMgc3BlY2lmaWMgZGF0YS4gKi8KKworI2lmbmRlZiBfU1lTX0dNT05fT1VUX0gKKyNkZWZpbmUgX1NZU19HTU9OX09VVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNkZWZpbmUJR01PTl9NQUdJQwkiZ21vbiIJLyogbWFnaWMgY29va2llICovCisjZGVmaW5lIEdNT05fVkVSU0lPTgkxCS8qIHZlcnNpb24gbnVtYmVyICovCisKKy8qIEZvciBwcm9maWxpbmcgc2hhcmVkIG9iamVjdCB3ZSBuZWVkIGEgbmV3IGZvcm1hdC4gICovCisjZGVmaW5lIEdNT05fU0hPQkpfVkVSU0lPTgkweDFmZmZmCisKK19fQkVHSU5fREVDTFMKKworLyoKKyAqIFJhdyBoZWFkZXIgYXMgaXQgYXBwZWFycyBvbiBmaWxlICh3aXRob3V0IHBhZGRpbmcpLiAgVGhpcyBoZWFkZXIKKyAqIGFsd2F5cyBjb21lcyBmaXJzdCBpbiBnbW9uLm91dCBhbmQgaXMgdGhlbiBmb2xsb3dlZCBieSBhIHNlcmllcworICogcmVjb3JkcyBkZWZpbmVkIGJlbG93LgorICovCitzdHJ1Y3QgZ21vbl9oZHIKKyAgeworICAgIGNoYXIgY29va2llWzRdOworICAgIGNoYXIgdmVyc2lvbls0XTsKKyAgICBjaGFyIHNwYXJlWzMgKiA0XTsKKyAgfTsKKworLyogdHlwZXMgb2YgcmVjb3JkcyBpbiB0aGlzIGZpbGU6ICovCit0eXBlZGVmIGVudW0KKyAgeworICAgIEdNT05fVEFHX1RJTUVfSElTVCA9IDAsCisgICAgR01PTl9UQUdfQ0dfQVJDID0gMSwKKyAgICBHTU9OX1RBR19CQl9DT1VOVCA9IDIKKyAgfSBHTU9OX1JlY29yZF9UYWc7CisKK3N0cnVjdCBnbW9uX2hpc3RfaGRyCisgIHsKKyAgICBjaGFyIGxvd19wY1tzaXplb2YgKGNoYXIgKildOwkvKiBiYXNlIHBjIGFkZHJlc3Mgb2Ygc2FtcGxlIGJ1ZmZlciAqLworICAgIGNoYXIgaGlnaF9wY1tzaXplb2YgKGNoYXIgKildOwkvKiBtYXggcGMgYWRkcmVzcyBvZiBzYW1wbGVkIGJ1ZmZlciAqLworICAgIGNoYXIgaGlzdF9zaXplWzRdOwkJCS8qIHNpemUgb2Ygc2FtcGxlIGJ1ZmZlciAqLworICAgIGNoYXIgcHJvZl9yYXRlWzRdOwkJCS8qIHByb2ZpbGluZyBjbG9jayByYXRlICovCisgICAgY2hhciBkaW1lblsxNV07CQkJLyogcGh5cy4gZGltLiwgdXN1YWxseSAic2Vjb25kcyIgKi8KKyAgICBjaGFyIGRpbWVuX2FiYnJldjsJCQkvKiB1c3VhbGx5ICdzJyBmb3IgInNlY29uZHMiICovCisgIH07CisKK3N0cnVjdCBnbW9uX2NnX2FyY19yZWNvcmQKKyAgeworICAgIGNoYXIgZnJvbV9wY1tzaXplb2YgKGNoYXIgKildOwkvKiBhZGRyZXNzIHdpdGhpbiBjYWxsZXIncyBib2R5ICovCisgICAgY2hhciBzZWxmX3BjW3NpemVvZiAoY2hhciAqKV07CS8qIGFkZHJlc3Mgd2l0aGluIGNhbGxlZSdzIGJvZHkgKi8KKyAgICBjaGFyIGNvdW50WzRdOwkJCS8qIG51bWJlciBvZiBhcmMgdHJhdmVyc2FscyAqLworICB9OworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL2dtb25fb3V0LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2lub3RpZnkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2lub3RpZnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWU5OTlhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvaW5vdGlmeS5oCkBAIC0wLDAgKzEsMTA3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDgsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19JTk9USUZZX0gKKyNkZWZpbmUJX1NZU19JTk9USUZZX0gJMQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKworLyogRmxhZ3MgZm9yIHRoZSBwYXJhbWV0ZXIgb2YgaW5vdGlmeV9pbml0MS4gICovCitlbnVtCisgIHsKKyAgICBJTl9DTE9FWEVDID0gMDIwMDAwMDAsCisjZGVmaW5lIElOX0NMT0VYRUMgSU5fQ0xPRVhFQworICAgIElOX05PTkJMT0NLID0gMDQwMDAKKyNkZWZpbmUgSU5fTk9OQkxPQ0sgSU5fTk9OQkxPQ0sKKyAgfTsKKworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhbiBpbm90aWZ5IGV2ZW50LiAgKi8KK3N0cnVjdCBpbm90aWZ5X2V2ZW50Cit7CisgIGludCB3ZDsJCS8qIFdhdGNoIGRlc2NyaXB0b3IuICAqLworICB1aW50MzJfdCBtYXNrOwkvKiBXYXRjaCBtYXNrLiAgKi8KKyAgdWludDMyX3QgY29va2llOwkvKiBDb29raWUgdG8gc3luY2hyb25pemUgdHdvIGV2ZW50cy4gICovCisgIHVpbnQzMl90IGxlbjsJCS8qIExlbmd0aCAoaW5jbHVkaW5nIE5VTHMpIG9mIG5hbWUuICAqLworICBjaGFyIG5hbWUgX19mbGV4YXJyOwkvKiBOYW1lLiAgKi8KK307CisKKworLyogU3VwcG9ydGVkIGV2ZW50cyBzdWl0YWJsZSBmb3IgTUFTSyBwYXJhbWV0ZXIgb2YgSU5PVElGWV9BRERfV0FUQ0guICAqLworI2RlZmluZSBJTl9BQ0NFU1MJIDB4MDAwMDAwMDEJLyogRmlsZSB3YXMgYWNjZXNzZWQuICAqLworI2RlZmluZSBJTl9NT0RJRlkJIDB4MDAwMDAwMDIJLyogRmlsZSB3YXMgbW9kaWZpZWQuICAqLworI2RlZmluZSBJTl9BVFRSSUIJIDB4MDAwMDAwMDQJLyogTWV0YWRhdGEgY2hhbmdlZC4gICovCisjZGVmaW5lIElOX0NMT1NFX1dSSVRFCSAweDAwMDAwMDA4CS8qIFdyaXR0YWJsZSBmaWxlIHdhcyBjbG9zZWQuICAqLworI2RlZmluZSBJTl9DTE9TRV9OT1dSSVRFIDB4MDAwMDAwMTAJLyogVW53cml0dGFibGUgZmlsZSBjbG9zZWQuICAqLworI2RlZmluZSBJTl9DTE9TRQkgKElOX0NMT1NFX1dSSVRFIHwgSU5fQ0xPU0VfTk9XUklURSkgLyogQ2xvc2UuICAqLworI2RlZmluZSBJTl9PUEVOCQkgMHgwMDAwMDAyMAkvKiBGaWxlIHdhcyBvcGVuZWQuICAqLworI2RlZmluZSBJTl9NT1ZFRF9GUk9NCSAweDAwMDAwMDQwCS8qIEZpbGUgd2FzIG1vdmVkIGZyb20gWC4gICovCisjZGVmaW5lIElOX01PVkVEX1RPICAgICAgMHgwMDAwMDA4MAkvKiBGaWxlIHdhcyBtb3ZlZCB0byBZLiAgKi8KKyNkZWZpbmUgSU5fTU9WRQkJIChJTl9NT1ZFRF9GUk9NIHwgSU5fTU9WRURfVE8pIC8qIE1vdmVzLiAgKi8KKyNkZWZpbmUgSU5fQ1JFQVRFCSAweDAwMDAwMTAwCS8qIFN1YmZpbGUgd2FzIGNyZWF0ZWQuICAqLworI2RlZmluZSBJTl9ERUxFVEUJIDB4MDAwMDAyMDAJLyogU3ViZmlsZSB3YXMgZGVsZXRlZC4gICovCisjZGVmaW5lIElOX0RFTEVURV9TRUxGCSAweDAwMDAwNDAwCS8qIFNlbGYgd2FzIGRlbGV0ZWQuICAqLworI2RlZmluZSBJTl9NT1ZFX1NFTEYJIDB4MDAwMDA4MDAJLyogU2VsZiB3YXMgbW92ZWQuICAqLworCisvKiBFdmVudHMgc2VudCBieSB0aGUga2VybmVsLiAgKi8KKyNkZWZpbmUgSU5fVU5NT1VOVAkgMHgwMDAwMjAwMAkvKiBCYWNraW5nIGZzIHdhcyB1bm1vdW50ZWQuICAqLworI2RlZmluZSBJTl9RX09WRVJGTE9XCSAweDAwMDA0MDAwCS8qIEV2ZW50IHF1ZXVlZCBvdmVyZmxvd2VkLiAgKi8KKyNkZWZpbmUgSU5fSUdOT1JFRAkgMHgwMDAwODAwMAkvKiBGaWxlIHdhcyBpZ25vcmVkLiAgKi8KKworLyogSGVscGVyIGV2ZW50cy4gICovCisjZGVmaW5lIElOX0NMT1NFCSAoSU5fQ0xPU0VfV1JJVEUgfCBJTl9DTE9TRV9OT1dSSVRFKQkvKiBDbG9zZS4gICovCisjZGVmaW5lIElOX01PVkUJCSAoSU5fTU9WRURfRlJPTSB8IElOX01PVkVEX1RPKQkJLyogTW92ZXMuICAqLworCisvKiBTcGVjaWFsIGZsYWdzLiAgKi8KKyNkZWZpbmUgSU5fT05MWURJUgkgMHgwMTAwMDAwMAkvKiBPbmx5IHdhdGNoIHRoZSBwYXRoIGlmIGl0IGlzIGEKKwkJCQkJICAgZGlyZWN0b3J5LiAgKi8KKyNkZWZpbmUgSU5fRE9OVF9GT0xMT1cJIDB4MDIwMDAwMDAJLyogRG8gbm90IGZvbGxvdyBhIHN5bSBsaW5rLiAgKi8KKyNkZWZpbmUgSU5fRVhDTF9VTkxJTksJIDB4MDQwMDAwMDAJLyogRXhjbHVkZSBldmVudHMgb24gdW5saW5rZWQKKwkJCQkJICAgb2JqZWN0cy4gICovCisjZGVmaW5lIElOX01BU0tfQURECSAweDIwMDAwMDAwCS8qIEFkZCB0byB0aGUgbWFzayBvZiBhbiBhbHJlYWR5CisJCQkJCSAgIGV4aXN0aW5nIHdhdGNoLiAgKi8KKyNkZWZpbmUgSU5fSVNESVIJIDB4NDAwMDAwMDAJLyogRXZlbnQgb2NjdXJyZWQgYWdhaW5zdCBkaXIuICAqLworI2RlZmluZSBJTl9PTkVTSE9UCSAweDgwMDAwMDAwCS8qIE9ubHkgc2VuZCBldmVudCBvbmNlLiAgKi8KKworLyogQWxsIGV2ZW50cyB3aGljaCBhIHByb2dyYW0gY2FuIHdhaXQgb24uICAqLworI2RlZmluZSBJTl9BTExfRVZFTlRTCSAoSU5fQUNDRVNTIHwgSU5fTU9ESUZZIHwgSU5fQVRUUklCIHwgSU5fQ0xPU0VfV1JJVEUgIFwKKwkJCSAgfCBJTl9DTE9TRV9OT1dSSVRFIHwgSU5fT1BFTiB8IElOX01PVkVEX0ZST00JICAgICAgXAorCQkJICB8IElOX01PVkVEX1RPIHwgSU5fQ1JFQVRFIHwgSU5fREVMRVRFCQkgICAgICBcCisJCQkgIHwgSU5fREVMRVRFX1NFTEYgfCBJTl9NT1ZFX1NFTEYpCisKKworX19CRUdJTl9ERUNMUworCisvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgaW5vdGlmeSBpbnN0YW5jZS4gICovCitleHRlcm4gaW50IGlub3RpZnlfaW5pdCAodm9pZCkgX19USFJPVzsKKworLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGlub3RpZnkgaW5zdGFuY2UuICAqLworZXh0ZXJuIGludCBpbm90aWZ5X2luaXQxIChpbnQgX19mbGFncykgX19USFJPVzsKKworLyogQWRkIHdhdGNoIG9mIG9iamVjdCBOQU1FIHRvIGlub3RpZnkgaW5zdGFuY2UgRkQuICBOb3RpZnkgYWJvdXQKKyAgIGV2ZW50cyBzcGVjaWZpZWQgYnkgTUFTSy4gICovCitleHRlcm4gaW50IGlub3RpZnlfYWRkX3dhdGNoIChpbnQgX19mZCwgY29uc3QgY2hhciAqX19uYW1lLCB1aW50MzJfdCBfX21hc2spCisgIF9fVEhST1c7CisKKy8qIFJlbW92ZSB0aGUgd2F0Y2ggc3BlY2lmaWVkIGJ5IFdEIGZyb20gdGhlIGlub3RpZnkgaW5zdGFuY2UgRkQuICAqLworZXh0ZXJuIGludCBpbm90aWZ5X3JtX3dhdGNoIChpbnQgX19mZCwgaW50IF9fd2QpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvaW5vdGlmeS5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9pby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjhjMmNhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvaW8uaApAQCAtMCwwICsxLDE4NSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAyMDAwLCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfSU9fSAorI2RlZmluZQlfU1lTX0lPX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBJZiBUVVJOX09OIGlzIFRSVUUsIHJlcXVlc3QgZm9yIHBlcm1pc3Npb24gdG8gZG8gZGlyZWN0IGkvbyBvbiB0aGUKKyAgIHBvcnQgbnVtYmVycyBpbiB0aGUgcmFuZ2UgW0ZST00sRlJPTStOVU0tMV0uICBPdGhlcndpc2UsIHR1cm4gSS9PCisgICBwZXJtaXNzaW9uIG9mZiBmb3IgdGhhdCByYW5nZS4gIFRoaXMgY2FsbCByZXF1aXJlcyByb290IHByaXZpbGVnZXMuCisKKyAgIFBvcnRhYmlsaXR5IG5vdGU6IG5vdCBhbGwgTGludXggcGxhdGZvcm1zIHN1cHBvcnQgdGhpcyBjYWxsLiAgTW9zdAorICAgcGxhdGZvcm1zIGJhc2VkIG9uIHRoZSBQQyBJL08gYXJjaGl0ZWN0dXJlIHByb2JhYmx5IHdpbGwsIGhvd2V2ZXIuCisgICBFLmcuLCBMaW51eC9BbHBoYSBmb3IgQWxwaGEgUENzIHN1cHBvcnRzIHRoaXMuICAqLworZXh0ZXJuIGludCBpb3Blcm0gKHVuc2lnbmVkIGxvbmcgaW50IF9fZnJvbSwgdW5zaWduZWQgbG9uZyBpbnQgX19udW0sCisgICAgICAgICAgICAgICAgICAgaW50IF9fdHVybl9vbikgX19USFJPVzsKKworLyogU2V0IHRoZSBJL08gcHJpdmlsZWdlIGxldmVsIHRvIExFVkVMLiAgSWYgTEVWRUw+MywgcGVybWlzc2lvbiB0bworICAgYWNjZXNzIGFueSBJL08gcG9ydCBpcyBncmFudGVkLiAgVGhpcyBjYWxsIHJlcXVpcmVzIHJvb3QKKyAgIHByaXZpbGVnZXMuICovCitleHRlcm4gaW50IGlvcGwgKGludCBfX2xldmVsKSBfX1RIUk9XOworCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyCisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBjaGFyCitpbmIgKHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQpCit7CisgIHVuc2lnbmVkIGNoYXIgX3Y7CisKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpbmIgJXcxLCUwIjoiPWEiIChfdik6Ik5kIiAoX19wb3J0KSk7CisgIHJldHVybiBfdjsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGNoYXIKK2luYl9wICh1bnNpZ25lZCBzaG9ydCBpbnQgX19wb3J0KQoreworICB1bnNpZ25lZCBjaGFyIF92OworCisgIF9fYXNtX18gX192b2xhdGlsZV9fICgiaW5iICV3MSwlMFxub3V0YiAlJWFsLCQweDgwIjoiPWEiIChfdik6Ik5kIiAoX19wb3J0KSk7CisgIHJldHVybiBfdjsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIHNob3J0IGludAoraW53ICh1bnNpZ25lZCBzaG9ydCBpbnQgX19wb3J0KQoreworICB1bnNpZ25lZCBzaG9ydCBfdjsKKworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImludyAldzEsJTAiOiI9YSIgKF92KToiTmQiIChfX3BvcnQpKTsKKyAgcmV0dXJuIF92OworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50CitpbndfcCAodW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCkKK3sKKyAgdW5zaWduZWQgc2hvcnQgaW50IF92OworCisgIF9fYXNtX18gX192b2xhdGlsZV9fICgiaW53ICV3MSwlMFxub3V0YiAlJWFsLCQweDgwIjoiPWEiIChfdik6Ik5kIiAoX19wb3J0KSk7CisgIHJldHVybiBfdjsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAoraW5sICh1bnNpZ25lZCBzaG9ydCBpbnQgX19wb3J0KQoreworICB1bnNpZ25lZCBpbnQgX3Y7CisKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpbmwgJXcxLCUwIjoiPWEiIChfdik6Ik5kIiAoX19wb3J0KSk7CisgIHJldHVybiBfdjsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAoraW5sX3AgKHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQpCit7CisgIHVuc2lnbmVkIGludCBfdjsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpbmwgJXcxLCUwXG5vdXRiICUlYWwsJDB4ODAiOiI9YSIgKF92KQorCQkJOiJOZCIgKF9fcG9ydCkpOworICByZXR1cm4gX3Y7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitvdXRiICh1bnNpZ25lZCBjaGFyIHZhbHVlLCB1bnNpZ25lZCBzaG9ydCBpbnQgX19wb3J0KQoreworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm91dGIgJWIwLCV3MSI6IDoiYSIgKHZhbHVlKSwgIk5kIiAoX19wb3J0KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitvdXRiX3AgKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgib3V0YiAlYjAsJXcxXG5vdXRiICUlYWwsJDB4ODAiOiA6ImEiICh2YWx1ZSksCisJCQkiTmQiIChfX3BvcnQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK291dHcgKHVuc2lnbmVkIHNob3J0IGludCB2YWx1ZSwgdW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJvdXR3ICV3MCwldzEiOiA6ImEiICh2YWx1ZSksICJOZCIgKF9fcG9ydCkpOworCit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitvdXR3X3AgKHVuc2lnbmVkIHNob3J0IGludCB2YWx1ZSwgdW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJvdXR3ICV3MCwldzFcbm91dGIgJSVhbCwkMHg4MCI6IDoiYSIgKHZhbHVlKSwKKwkJCSJOZCIgKF9fcG9ydCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorb3V0bCAodW5zaWduZWQgaW50IHZhbHVlLCB1bnNpZ25lZCBzaG9ydCBpbnQgX19wb3J0KQoreworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm91dGwgJTAsJXcxIjogOiJhIiAodmFsdWUpLCAiTmQiIChfX3BvcnQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK291dGxfcCAodW5zaWduZWQgaW50IHZhbHVlLCB1bnNpZ25lZCBzaG9ydCBpbnQgX19wb3J0KQoreworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm91dGwgJTAsJXcxXG5vdXRiICUlYWwsJDB4ODAiOiA6ImEiICh2YWx1ZSksCisJCQkiTmQiIChfX3BvcnQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2luc2IgKHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQsIHZvaWQgKl9fYWRkciwgdW5zaWduZWQgbG9uZyBpbnQgX19jb3VudCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGQgOyByZXAgOyBpbnNiIjoiPUQiIChfX2FkZHIpLCAiPWMiIChfX2NvdW50KQorCQkJOiJkIiAoX19wb3J0KSwgIjAiIChfX2FkZHIpLCAiMSIgKF9fY291bnQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2luc3cgKHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQsIHZvaWQgKl9fYWRkciwgdW5zaWduZWQgbG9uZyBpbnQgX19jb3VudCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGQgOyByZXAgOyBpbnN3IjoiPUQiIChfX2FkZHIpLCAiPWMiIChfX2NvdW50KQorCQkJOiJkIiAoX19wb3J0KSwgIjAiIChfX2FkZHIpLCAiMSIgKF9fY291bnQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2luc2wgKHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQsIHZvaWQgKl9fYWRkciwgdW5zaWduZWQgbG9uZyBpbnQgX19jb3VudCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGQgOyByZXAgOyBpbnNsIjoiPUQiIChfX2FkZHIpLCAiPWMiIChfX2NvdW50KQorCQkJOiJkIiAoX19wb3J0KSwgIjAiIChfX2FkZHIpLCAiMSIgKF9fY291bnQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK291dHNiICh1bnNpZ25lZCBzaG9ydCBpbnQgX19wb3J0LCBjb25zdCB2b2lkICpfX2FkZHIsCisgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgX19jb3VudCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGQgOyByZXAgOyBvdXRzYiI6Ij1TIiAoX19hZGRyKSwgIj1jIiAoX19jb3VudCkKKwkJCToiZCIgKF9fcG9ydCksICIwIiAoX19hZGRyKSwgIjEiIChfX2NvdW50KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitvdXRzdyAodW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCwgY29uc3Qgdm9pZCAqX19hZGRyLAorICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fY291bnQpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgiY2xkIDsgcmVwIDsgb3V0c3ciOiI9UyIgKF9fYWRkciksICI9YyIgKF9fY291bnQpCisJCQk6ImQiIChfX3BvcnQpLCAiMCIgKF9fYWRkciksICIxIiAoX19jb3VudCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorb3V0c2wgKHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQsIGNvbnN0IHZvaWQgKl9fYWRkciwKKyAgICAgICB1bnNpZ25lZCBsb25nIGludCBfX2NvdW50KQoreworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNsZCA7IHJlcCA7IG91dHNsIjoiPVMiIChfX2FkZHIpLCAiPWMiIChfX2NvdW50KQorCQkJOiJkIiAoX19wb3J0KSwgIjAiIChfX2FkZHIpLCAiMSIgKF9fY291bnQpKTsKK30KKworI2VuZGlmCS8qIEdOVSBDICovCisKK19fRU5EX0RFQ0xTCisjZW5kaWYgLyogX1NZU19JT19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9pb2N0bC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDhhMGY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvaW9jdGwuaApAQCAtMCwwICsxLDQ2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk2LCA5OCwgOTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19JT0NUTF9ICisjZGVmaW5lCV9TWVNfSU9DVExfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIEdldCB0aGUgbGlzdCBvZiBgaW9jdGwnIHJlcXVlc3RzIGFuZCByZWxhdGVkIGNvbnN0YW50cy4gICovCisjaW5jbHVkZSA8Yml0cy9pb2N0bHMuaD4KKworLyogRGVmaW5lIHNvbWUgdHlwZXMgdXNlZCBieSBgaW9jdGwnIHJlcXVlc3RzLiAgKi8KKyNpbmNsdWRlIDxiaXRzL2lvY3RsLXR5cGVzLmg+CisKKy8qIE9uIGEgVW5peCBzeXN0ZW0sIHRoZSBzeXN0ZW0gPHN5cy9pb2N0bC5oPiBwcm9iYWJseSBkZWZpbmVzIHNvbWUgb2YKKyAgIHRoZSBzeW1ib2xzIHdlIGRlZmluZSBpbiA8c3lzL3R0eWRlZmF1bHRzLmg+ICh1c3VhbGx5IHdpdGggdGhlIHNhbWUKKyAgIHZhbHVlcykuICBUaGUgY29kZSB0byBnZW5lcmF0ZSA8Yml0cy9pb2N0bHMuaD4gaGFzIG9taXR0ZWQgdGhlc2UKKyAgIHN5bWJvbHMgdG8gYXZvaWQgdGhlIGNvbmZsaWN0LCBidXQgYSBVbml4IHByb2dyYW0gZXhwZWN0cyA8c3lzL2lvY3RsLmg+CisgICB0byBkZWZpbmUgdGhlbSwgc28gd2UgbXVzdCBpbmNsdWRlIDxzeXMvdHR5ZGVmYXVsdHMuaD4gaGVyZS4gICovCisjaW5jbHVkZSA8c3lzL3R0eWRlZmF1bHRzLmg+CisKKy8qIFBlcmZvcm0gdGhlIEkvTyBjb250cm9sIG9wZXJhdGlvbiBzcGVjaWZpZWQgYnkgUkVRVUVTVCBvbiBGRC4KKyAgIE9uZSBhcmd1bWVudCBtYXkgZm9sbG93OyBpdHMgcHJlc2VuY2UgYW5kIHR5cGUgZGVwZW5kIG9uIFJFUVVFU1QuCisgICBSZXR1cm4gdmFsdWUgZGVwZW5kcyBvbiBSRVFVRVNULiAgVXN1YWxseSAtMSBpbmRpY2F0ZXMgZXJyb3IuICAqLworZXh0ZXJuIGludCBpb2N0bCAoaW50IF9fZmQsIHVuc2lnbmVkIGxvbmcgaW50IF9fcmVxdWVzdCwgLi4uKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL2lvY3RsLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2lwYy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvaXBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU4YzA5ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2lwYy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NSwxOTk2LDE5OTcsMTk5OSwyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfSVBDX0gKKyNkZWZpbmUgX1NZU19JUENfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaWYgIWRlZmluZWQgX19VU0VfU1ZJRCAmJiAhZGVmaW5lZCBfX1VTRV9YT1BFTiAmJiBfX0dOVUNfXyA+PSAyCisjIHdhcm5pbmcgIkZpbGVzIHVzaW5nIHRoaXMgaGVhZGVyIG11c3QgYmUgY29tcGlsZWQgd2l0aCBfU1ZJRF9TT1VSQ0Ugb3IgX1hPUEVOX1NPVVJDRSIKKyNlbmRpZgorCisvKiBHZXQgc3lzdGVtIGRlcGVuZGVudCBkZWZpbml0aW9uIG9mIGBzdHJ1Y3QgaXBjX3Blcm0nIGFuZCBtb3JlLiAgKi8KKyNpbmNsdWRlIDxiaXRzL2lwY3R5cGVzLmg+CisjaW5jbHVkZSA8Yml0cy9pcGMuaD4KKworI2lmbmRlZiBfX3VpZF90X2RlZmluZWQKK3R5cGVkZWYgX191aWRfdCB1aWRfdDsKKyMgZGVmaW5lIF9fdWlkX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX19naWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fZ2lkX3QgZ2lkX3Q7CisjIGRlZmluZSBfX2dpZF90X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fbW9kZV90X2RlZmluZWQKK3R5cGVkZWYgX19tb2RlX3QgbW9kZV90OworIyBkZWZpbmUgX19tb2RlX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX19rZXlfdF9kZWZpbmVkCit0eXBlZGVmIF9fa2V5X3Qga2V5X3Q7CisjIGRlZmluZSBfX2tleV90X2RlZmluZWQKKyNlbmRpZgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIEdlbmVyYXRlcyBrZXkgZm9yIFN5c3RlbSBWIHN0eWxlIElQQy4gICovCitleHRlcm4ga2V5X3QgZnRvayAoX19jb25zdCBjaGFyICpfX3BhdGhuYW1lLCBpbnQgX19wcm9qX2lkKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL2lwYy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9rZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMva2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDU5YzA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMva2QuaApAQCAtMCwwICsxLDM1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19LRF9ICisjZGVmaW5lIF9TWVNfS0RfSAkxCisKKy8qIE1ha2Ugc3VyZSB0aGUgPGxpbnV4L3R5cGVzLmg+IGhlYWRlciBpcyBub3QgbG9hZGVkLiAgKi8KKyNpZm5kZWYgX0xJTlVYX1RZUEVTX0gKKyMgZGVmaW5lIF9MSU5VWF9UWVBFU19ICQkxCisjIGRlZmluZSBfX3VuZGVmX0xJTlVYX1RZUEVTX0gKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgva2QuaD4KKworI2lmZGVmIF9fdW5kZWZfTElOVVhfVFlQRVNfSAorIyB1bmRlZiBfTElOVVhfVFlQRVNfSAorIyB1bmRlZiBfX3VuZGVmX0xJTlVYX1RZUEVTX0gKKyNlbmRpZgorCisjZW5kaWYJLyogc3lzL2tkLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2tkYWVtb24uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2tkYWVtb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTQ5MWY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMva2RhZW1vbi5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogSW50ZXJmYWNlcyB0byBjb250cm9sIHRoZSB2YXJpb3VzIGtlcm5lbCBkYWVtb25zLiAgKi8KKworI2lmbmRlZiBfU1lTX0tEQUVNT05fSAorCisjZGVmaW5lIF9TWVNfS0RBRU1PTl9ICTEKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFN0YXJ0LCBmbHVzaCwgb3IgdHVuZSB0aGUga2VybmVsJ3MgYnVmZmVyIGZsdXNoaW5nIGRhZW1vbi4gICovCitleHRlcm4gaW50IGJkZmx1c2ggKGludCBfX2Z1bmMsIGxvbmcgaW50IF9fZGF0YSkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9TWVNfS0RBRU1PTl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9rbG9nLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9rbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmNWZlNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL2tsb2cuaApAQCAtMCwwICsxLDM0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19LTE9HX0gKKworI2RlZmluZQlfU1lTX0tMT0dfSAkxCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBDb250cm9sIHRoZSBrZXJuZWwncyBsb2dnaW5nIGZhY2lsaXR5LiAgVGhpcyBjb3JyZXNwb25kcyBleGFjdGx5IHRvCisgICB0aGUga2VybmVsJ3Mgc3lzbG9nIHN5c3RlbSBjYWxsLCBidXQgdGhhdCBuYW1lIGlzIGVhc2lseSBjb25mdXNlZAorICAgd2l0aCB0aGUgdXNlci1sZXZlbCBzeXNsb2cgZmFjaWxpdHksIHdoaWNoIGlzIHNvbWV0aGluZyBjb21wbGV0ZWx5CisgICBkaWZmZXJlbnQuICAqLworZXh0ZXJuIGludCBrbG9nY3RsIChpbnQgX190eXBlLCBjaGFyICpfX2J1ZnAsIGludCBfX2xlbikgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9TWVNfS0xPR19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9tbWFuLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNkOGEzZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL21tYW4uaApAQCAtMCwwICsxLDE1MiBAQAorLyogRGVmaW5pdGlvbnMgZm9yIEJTRC1zdHlsZSBtZW1vcnkgbWFuYWdlbWVudC4KKyAgIENvcHlyaWdodCAoQykgMTk5NC0yMDAwLCAyMDAzLCAyMDA0LCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfTU1BTl9ICisjZGVmaW5lCV9TWVNfTU1BTl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorI2RlZmluZSBfX25lZWRfc2l6ZV90CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpZm5kZWYgX19vZmZfdF9kZWZpbmVkCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0Cit0eXBlZGVmIF9fb2ZmX3Qgb2ZmX3Q7CisjIGVsc2UKK3R5cGVkZWYgX19vZmY2NF90IG9mZl90OworIyBlbmRpZgorIyBkZWZpbmUgX19vZmZfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX21vZGVfdF9kZWZpbmVkCit0eXBlZGVmIF9fbW9kZV90IG1vZGVfdDsKKyMgZGVmaW5lIF9fbW9kZV90X2RlZmluZWQKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy9tbWFuLmg+CisKKy8qIFJldHVybiB2YWx1ZSBvZiBgbW1hcCcgaW4gY2FzZSBvZiBhbiBlcnJvci4gICovCisjZGVmaW5lIE1BUF9GQUlMRUQJKCh2b2lkICopIC0xKQorCitfX0JFR0lOX0RFQ0xTCisvKiBNYXAgYWRkcmVzc2VzIHN0YXJ0aW5nIG5lYXIgQUREUiBhbmQgZXh0ZW5kaW5nIGZvciBMRU4gYnl0ZXMuICBmcm9tCisgICBPRkZTRVQgaW50byB0aGUgZmlsZSBGRCBkZXNjcmliZXMgYWNjb3JkaW5nIHRvIFBST1QgYW5kIEZMQUdTLiAgSWYgQUREUgorICAgaXMgbm9uemVybywgaXQgaXMgdGhlIGRlc2lyZWQgbWFwcGluZyBhZGRyZXNzLiAgSWYgdGhlIE1BUF9GSVhFRCBiaXQgaXMKKyAgIHNldCBpbiBGTEFHUywgdGhlIG1hcHBpbmcgd2lsbCBiZSBhdCBBRERSIGV4YWN0bHkgKHdoaWNoIG11c3QgYmUKKyAgIHBhZ2UtYWxpZ25lZCk7IG90aGVyd2lzZSB0aGUgc3lzdGVtIGNob29zZXMgYSBjb252ZW5pZW50IG5lYXJieSBhZGRyZXNzLgorICAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgYWN0dWFsIG1hcHBpbmcgYWRkcmVzcyBjaG9zZW4gb3IgTUFQX0ZBSUxFRAorICAgZm9yIGVycm9ycyAoaW4gd2hpY2ggY2FzZSBgZXJybm8nIGlzIHNldCkuICBBIHN1Y2Nlc3NmdWwgYG1tYXAnIGNhbGwKKyAgIGRlYWxsb2NhdGVzIGFueSBwcmV2aW91cyBtYXBwaW5nIGZvciB0aGUgYWZmZWN0ZWQgcmVnaW9uLiAgKi8KKworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gdm9pZCAqbW1hcCAodm9pZCAqX19hZGRyLCBzaXplX3QgX19sZW4sIGludCBfX3Byb3QsCisJCSAgIGludCBfX2ZsYWdzLCBpbnQgX19mZCwgX19vZmZfdCBfX29mZnNldCkgX19USFJPVzsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gdm9pZCAqIF9fUkVESVJFQ1RfTlRIIChtbWFwLAorCQkJICAgICAgKHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fbGVuLCBpbnQgX19wcm90LAorCQkJICAgICAgIGludCBfX2ZsYWdzLCBpbnQgX19mZCwgX19vZmY2NF90IF9fb2Zmc2V0KSwKKwkJCSAgICAgIG1tYXA2NCk7CisjIGVsc2UKKyMgIGRlZmluZSBtbWFwIG1tYXA2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiB2b2lkICptbWFwNjQgKHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fbGVuLCBpbnQgX19wcm90LAorCQkgICAgIGludCBfX2ZsYWdzLCBpbnQgX19mZCwgX19vZmY2NF90IF9fb2Zmc2V0KSBfX1RIUk9XOworI2VuZGlmCisKKy8qIERlYWxsb2NhdGUgYW55IG1hcHBpbmcgZm9yIHRoZSByZWdpb24gc3RhcnRpbmcgYXQgQUREUiBhbmQgZXh0ZW5kaW5nIExFTgorICAgYnl0ZXMuICBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgLTEgZm9yIGVycm9ycyAoYW5kIHNldHMgZXJybm8pLiAgKi8KK2V4dGVybiBpbnQgbXVubWFwICh2b2lkICpfX2FkZHIsIHNpemVfdCBfX2xlbikgX19USFJPVzsKKworLyogQ2hhbmdlIHRoZSBtZW1vcnkgcHJvdGVjdGlvbiBvZiB0aGUgcmVnaW9uIHN0YXJ0aW5nIGF0IEFERFIgYW5kCisgICBleHRlbmRpbmcgTEVOIGJ5dGVzIHRvIFBST1QuICBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgLTEgZm9yIGVycm9ycworICAgKGFuZCBzZXRzIGVycm5vKS4gICovCitleHRlcm4gaW50IG1wcm90ZWN0ICh2b2lkICpfX2FkZHIsIHNpemVfdCBfX2xlbiwgaW50IF9fcHJvdCkgX19USFJPVzsKKworLyogU3luY2hyb25pemUgdGhlIHJlZ2lvbiBzdGFydGluZyBhdCBBRERSIGFuZCBleHRlbmRpbmcgTEVOIGJ5dGVzIHdpdGggdGhlCisgICBmaWxlIGl0IG1hcHMuICBGaWxlc3lzdGVtIG9wZXJhdGlvbnMgb24gYSBmaWxlIGJlaW5nIG1hcHBlZCBhcmUKKyAgIHVucHJlZGljdGFibGUgYmVmb3JlIHRoaXMgaXMgZG9uZS4gIEZsYWdzIGFyZSBmcm9tIHRoZSBNU18qIHNldC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IG1zeW5jICh2b2lkICpfX2FkZHIsIHNpemVfdCBfX2xlbiwgaW50IF9fZmxhZ3MpOworCisjaWZkZWYgX19VU0VfQlNECisvKiBBZHZpc2UgdGhlIHN5c3RlbSBhYm91dCBwYXJ0aWN1bGFyIHVzYWdlIHBhdHRlcm5zIHRoZSBwcm9ncmFtIGZvbGxvd3MKKyAgIGZvciB0aGUgcmVnaW9uIHN0YXJ0aW5nIGF0IEFERFIgYW5kIGV4dGVuZGluZyBMRU4gYnl0ZXMuICAqLworZXh0ZXJuIGludCBtYWR2aXNlICh2b2lkICpfX2FkZHIsIHNpemVfdCBfX2xlbiwgaW50IF9fYWR2aWNlKSBfX1RIUk9XOworI2VuZGlmCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogVGhpcyBpcyB0aGUgUE9TSVggbmFtZSBmb3IgdGhpcyBmdW5jdGlvbi4gICovCitleHRlcm4gaW50IHBvc2l4X21hZHZpc2UgKHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fbGVuLCBpbnQgX19hZHZpY2UpIF9fVEhST1c7CisjZW5kaWYKKworLyogR3VhcmFudGVlIGFsbCB3aG9sZSBwYWdlcyBtYXBwZWQgYnkgdGhlIHJhbmdlIFtBRERSLEFERFIrTEVOKSB0bworICAgYmUgbWVtb3J5IHJlc2lkZW50LiAgKi8KK2V4dGVybiBpbnQgbWxvY2sgKF9fY29uc3Qgdm9pZCAqX19hZGRyLCBzaXplX3QgX19sZW4pIF9fVEhST1c7CisKKy8qIFVubG9jayB3aG9sZSBwYWdlcyBwcmV2aW91c2x5IG1hcHBlZCBieSB0aGUgcmFuZ2UgW0FERFIsQUREUitMRU4pLiAgKi8KK2V4dGVybiBpbnQgbXVubG9jayAoX19jb25zdCB2b2lkICpfX2FkZHIsIHNpemVfdCBfX2xlbikgX19USFJPVzsKKworLyogQ2F1c2UgYWxsIGN1cnJlbnRseSBtYXBwZWQgcGFnZXMgb2YgdGhlIHByb2Nlc3MgdG8gYmUgbWVtb3J5IHJlc2lkZW50CisgICB1bnRpbCB1bmxvY2tlZCBieSBhIGNhbGwgdG8gdGhlIGBtdW5sb2NrYWxsJywgdW50aWwgdGhlIHByb2Nlc3MgZXhpdHMsCisgICBvciB1bnRpbCB0aGUgcHJvY2VzcyBjYWxscyBgZXhlY3ZlJy4gICovCitleHRlcm4gaW50IG1sb2NrYWxsIChpbnQgX19mbGFncykgX19USFJPVzsKKworLyogQWxsIGN1cnJlbnRseSBtYXBwZWQgcGFnZXMgb2YgdGhlIHByb2Nlc3MnIGFkZHJlc3Mgc3BhY2UgYmVjb21lCisgICB1bmxvY2tlZC4gICovCitleHRlcm4gaW50IG11bmxvY2thbGwgKHZvaWQpIF9fVEhST1c7CisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBtaW5jb3JlIHJldHVybnMgdGhlIG1lbW9yeSByZXNpZGVuY3kgc3RhdHVzIG9mIHRoZSBwYWdlcyBpbiB0aGUKKyAgIGN1cnJlbnQgcHJvY2VzcydzIGFkZHJlc3Mgc3BhY2Ugc3BlY2lmaWVkIGJ5IFtzdGFydCwgc3RhcnQgKyBsZW4pLgorICAgVGhlIHN0YXR1cyBpcyByZXR1cm5lZCBpbiBhIHZlY3RvciBvZiBieXRlcy4gIFRoZSBsZWFzdCBzaWduaWZpY2FudAorICAgYml0IG9mIGVhY2ggYnl0ZSBpcyAxIGlmIHRoZSByZWZlcmVuY2VkIHBhZ2UgaXMgaW4gbWVtb3J5LCBvdGhlcndpc2UKKyAgIGl0IGlzIHplcm8uICAqLworZXh0ZXJuIGludCBtaW5jb3JlICh2b2lkICpfX3N0YXJ0LCBzaXplX3QgX19sZW4sIHVuc2lnbmVkIGNoYXIgKl9fdmVjKQorICAgICBfX1RIUk9XOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFJlbWFwIHBhZ2VzIG1hcHBlZCBieSB0aGUgcmFuZ2UgW0FERFIsQUREUitPTERfTEVOKSB0byBuZXcgbGVuZ3RoCisgICBORVdfTEVOLiAgSWYgTVJFTUFQX01BWU1PVkUgaXMgc2V0IGluIEZMQUdTIHRoZSByZXR1cm5lZCBhZGRyZXNzCisgICBtYXkgZGlmZmVyIGZyb20gQUREUi4gIElmIE1SRU1BUF9GSVhFRCBpcyBzZXQgaW4gRkxBR1MgdGhlIGZ1bmN0aW9uCisgICB0YWtlcyBhbm90aGVyIHBhcmFtdGVyIHdoaWNoIGlzIGEgZml4ZWQgYWRkcmVzcyBhdCB3aGljaCB0aGUgYmxvY2sKKyAgIHJlc2lkZXMgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwuICAqLworZXh0ZXJuIHZvaWQgKm1yZW1hcCAodm9pZCAqX19hZGRyLCBzaXplX3QgX19vbGRfbGVuLCBzaXplX3QgX19uZXdfbGVuLAorCQkgICAgIGludCBfX2ZsYWdzLCAuLi4pIF9fVEhST1c7CisKKy8qIFJlbWFwIGFyYml0cmFyeSBwYWdlcyBvZiBhIHNoYXJlZCBiYWNraW5nIHN0b3JlIHdpdGhpbiBhbiBleGlzdGluZworICAgVk1BLiAgKi8KK2V4dGVybiBpbnQgcmVtYXBfZmlsZV9wYWdlcyAodm9pZCAqX19zdGFydCwgc2l6ZV90IF9fc2l6ZSwgaW50IF9fcHJvdCwKKwkJCSAgICAgc2l6ZV90IF9fcGdvZmYsIGludCBfX2ZsYWdzKSBfX1RIUk9XOworI2VuZGlmCisKKworLyogT3BlbiBzaGFyZWQgbWVtb3J5IHNlZ21lbnQuICAqLworZXh0ZXJuIGludCBzaG1fb3BlbiAoX19jb25zdCBjaGFyICpfX25hbWUsIGludCBfX29mbGFnLCBtb2RlX3QgX19tb2RlKTsKKworLyogUmVtb3ZlIHNoYXJlZCBtZW1vcnkgc2VnbWVudC4gICovCitleHRlcm4gaW50IHNobV91bmxpbmsgKF9fY29uc3QgY2hhciAqX19uYW1lKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHN5cy9tbWFuLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL21vdW50LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9tb3VudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyM2I0NjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9tb3VudC5oCkBAIC0wLDAgKzEsMTQ4IEBACisvKiBIZWFkZXIgZmlsZSBmb3IgbW91bnRpbmcvdW5tb3VudCBMaW51eCBmaWxlc3lzdGVtcy4KKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDAwLCAyMDA0LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBUaGlzIGlzIHRha2VuIGZyb20gL3Vzci9pbmNsdWRlL2xpbnV4L2ZzLmguICAqLworCisjaWZuZGVmIF9TWVNfTU9VTlRfSAorI2RlZmluZSBfU1lTX01PVU5UX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworI2RlZmluZSBCTE9DS19TSVpFCTEwMjQKKyNkZWZpbmUgQkxPQ0tfU0laRV9CSVRTCTEwCisKKworLyogVGhlc2UgYXJlIHRoZSBmcy1pbmRlcGVuZGVudCBtb3VudC1mbGFnczogdXAgdG8gMTYgZmxhZ3MgYXJlCisgICBzdXBwb3J0ZWQgICovCitlbnVtCit7CisgIE1TX1JET05MWSA9IDEsCQkvKiBNb3VudCByZWFkLW9ubHkuICAqLworI2RlZmluZSBNU19SRE9OTFkJTVNfUkRPTkxZCisgIE1TX05PU1VJRCA9IDIsCQkvKiBJZ25vcmUgc3VpZCBhbmQgc2dpZCBiaXRzLiAgKi8KKyNkZWZpbmUgTVNfTk9TVUlECU1TX05PU1VJRAorICBNU19OT0RFViA9IDQsCQkJLyogRGlzYWxsb3cgYWNjZXNzIHRvIGRldmljZSBzcGVjaWFsIGZpbGVzLiAgKi8KKyNkZWZpbmUgTVNfTk9ERVYJTVNfTk9ERVYKKyAgTVNfTk9FWEVDID0gOCwJCS8qIERpc2FsbG93IHByb2dyYW0gZXhlY3V0aW9uLiAgKi8KKyNkZWZpbmUgTVNfTk9FWEVDCU1TX05PRVhFQworICBNU19TWU5DSFJPTk9VUyA9IDE2LAkJLyogV3JpdGVzIGFyZSBzeW5jZWQgYXQgb25jZS4gICovCisjZGVmaW5lIE1TX1NZTkNIUk9OT1VTCU1TX1NZTkNIUk9OT1VTCisgIE1TX1JFTU9VTlQgPSAzMiwJCS8qIEFsdGVyIGZsYWdzIG9mIGEgbW91bnRlZCBGUy4gICovCisjZGVmaW5lIE1TX1JFTU9VTlQJTVNfUkVNT1VOVAorICBNU19NQU5ETE9DSyA9IDY0LAkJLyogQWxsb3cgbWFuZGF0b3J5IGxvY2tzIG9uIGFuIEZTLiAgKi8KKyNkZWZpbmUgTVNfTUFORExPQ0sJTVNfTUFORExPQ0sKKyAgTVNfRElSU1lOQyA9IDEyOCwJCS8qIERpcmVjdG9yeSBtb2RpZmljYXRpb25zIGFyZSBzeW5jaHJvbm91cy4gICovCisjZGVmaW5lIE1TX0RJUlNZTkMJTVNfRElSU1lOQworICBNU19OT0FUSU1FID0gMTAyNCwJCS8qIERvIG5vdCB1cGRhdGUgYWNjZXNzIHRpbWVzLiAgKi8KKyNkZWZpbmUgTVNfTk9BVElNRQlNU19OT0FUSU1FCisgIE1TX05PRElSQVRJTUUgPSAyMDQ4LAkJLyogRG8gbm90IHVwZGF0ZSBkaXJlY3RvcnkgYWNjZXNzIHRpbWVzLiAgKi8KKyNkZWZpbmUgTVNfTk9ESVJBVElNRQlNU19OT0RJUkFUSU1FCisgIE1TX0JJTkQgPSA0MDk2LAkJLyogQmluZCBkaXJlY3RvcnkgYXQgZGlmZmVyZW50IHBsYWNlLiAgKi8KKyNkZWZpbmUgTVNfQklORAkJTVNfQklORAorICBNU19NT1ZFID0gODE5MiwKKyNkZWZpbmUgTVNfTU9WRQkJTVNfTU9WRQorICBNU19SRUMgPSAxNjM4NCwKKyNkZWZpbmUgTVNfUkVDCQlNU19SRUMKKyAgTVNfU0lMRU5UID0gMzI3NjgsCisjZGVmaW5lIE1TX1NJTEVOVAlNU19TSUxFTlQKKyAgTVNfUE9TSVhBQ0wgPSAxIDw8IDE2LAkvKiBWRlMgZG9lcyBub3QgYXBwbHkgdGhlIHVtYXNrLiAgKi8KKyNkZWZpbmUgTVNfUE9TSVhBQ0wJTVNfUE9TSVhBQ0wKKyAgTVNfVU5CSU5EQUJMRSA9IDEgPDwgMTcsCS8qIENoYW5nZSB0byB1bmJpbmRhYmxlLiAgKi8KKyNkZWZpbmUgTVNfVU5CSU5EQUJMRQlNU19VTkJJTkRBQkxFCisgIE1TX1BSSVZBVEUgPSAxIDw8IDE4LAkJLyogQ2hhbmdlIHRvIHByaXZhdGUuICAqLworI2RlZmluZSBNU19QUklWQVRFCU1TX1BSSVZBVEUKKyAgTVNfU0xBVkUgPSAxIDw8IDE5LAkJLyogQ2hhbmdlIHRvIHNsYXZlLiAgKi8KKyNkZWZpbmUgTVNfU0xBVkUJTVNfU0xBVkUKKyAgTVNfU0hBUkVEID0gMSA8PCAyMCwJCS8qIENoYW5nZSB0byBzaGFyZWQuICAqLworI2RlZmluZSBNU19TSEFSRUQJTVNfU0hBUkVECisgIE1TX1JFTEFUSU1FID0gMSA8PCAyMSwJLyogVXBkYXRlIGF0aW1lIHJlbGF0aXZlIHRvIG10aW1lL2N0aW1lLiAgKi8KKyNkZWZpbmUgTVNfUkVMQVRJTUUJTVNfUkVMQVRJTUUKKyAgTVNfS0VSTk1PVU5UID0gMSA8PCAyMiwJLyogVGhpcyBpcyBhIGtlcm5fbW91bnQgY2FsbC4gICovCisjZGVmaW5lIE1TX0tFUk5NT1VOVAlNU19LRVJOTU9VTlQKKyAgTVNfSV9WRVJTSU9OID0gIDEgPDwgMjMsCS8qIFVwZGF0ZSBpbm9kZSBJX3ZlcnNpb24gZmllbGQuICAqLworI2RlZmluZSBNU19JX1ZFUlNJT04JTVNfSV9WRVJTSU9OCisgIE1TX1NUUklDVEFUSU1FID0gMSA8PCAyNCwJLyogQWx3YXlzIHBlcmZvcm0gYXRpbWUgdXBkYXRlcy4gICovCisjZGVmaW5lIE1TX1NUUklDVEFUSU1FCU1TX1NUUklDVEFUSU1FCisgIE1TX0FDVElWRSA9IDEgPDwgMzAsCisjZGVmaW5lIE1TX0FDVElWRQlNU19BQ1RJVkUKKyAgTVNfTk9VU0VSID0gMSA8PCAzMQorI2RlZmluZSBNU19OT1VTRVIJTVNfTk9VU0VSCit9OworCisvKiBGbGFncyB0aGF0IGNhbiBiZSBhbHRlcmVkIGJ5IE1TX1JFTU9VTlQgICovCisjZGVmaW5lIE1TX1JNVF9NQVNLIChNU19SRE9OTFl8TVNfU1lOQ0hST05PVVN8TVNfTUFORExPQ0t8TVNfSV9WRVJTSU9OKQorCisKKy8qIE1hZ2ljIG1vdW50IGZsYWcgbnVtYmVyLiBIYXMgdG8gYmUgb3ItZWQgdG8gdGhlIGZsYWcgdmFsdWVzLiAgKi8KKworI2RlZmluZSBNU19NR0NfVkFMIDB4YzBlZDAwMDAJLyogTWFnaWMgZmxhZyBudW1iZXIgdG8gaW5kaWNhdGUgIm5ldyIgZmxhZ3MgKi8KKyNkZWZpbmUgTVNfTUdDX01TSyAweGZmZmYwMDAwCS8qIE1hZ2ljIGZsYWcgbnVtYmVyIG1hc2sgKi8KKworCisvKiBUaGUgcmVhZC1vbmx5IHN0dWZmIGRvZXNuJ3QgcmVhbGx5IGJlbG9uZyBoZXJlLCBidXQgYW55IG90aGVyIHBsYWNlCisgICBpcyBwcm9iYWJseSBhcyBiYWQgYW5kIEkgZG9uJ3Qgd2FudCB0byBjcmVhdGUgeWV0IGFub3RoZXIgaW5jbHVkZQorICAgZmlsZS4gICovCisKKyNkZWZpbmUgQkxLUk9TRVQgICBfSU8oMHgxMiwgOTMpIC8qIFNldCBkZXZpY2UgcmVhZC1vbmx5ICgwID0gcmVhZC13cml0ZSkuICAqLworI2RlZmluZSBCTEtST0dFVCAgIF9JTygweDEyLCA5NCkgLyogR2V0IHJlYWQtb25seSBzdGF0dXMgKDAgPSByZWFkX3dyaXRlKS4gICovCisjZGVmaW5lIEJMS1JSUEFSVCAgX0lPKDB4MTIsIDk1KSAvKiBSZS1yZWFkIHBhcnRpdGlvbiB0YWJsZS4gICovCisjZGVmaW5lIEJMS0dFVFNJWkUgX0lPKDB4MTIsIDk2KSAvKiBSZXR1cm4gZGV2aWNlIHNpemUuICAqLworI2RlZmluZSBCTEtGTFNCVUYgIF9JTygweDEyLCA5NykgLyogRmx1c2ggYnVmZmVyIGNhY2hlLiAgKi8KKyNkZWZpbmUgQkxLUkFTRVQgICBfSU8oMHgxMiwgOTgpIC8qIFNldCByZWFkIGFoZWFkIGZvciBibG9jayBkZXZpY2UuICAqLworI2RlZmluZSBCTEtSQUdFVCAgIF9JTygweDEyLCA5OSkgLyogR2V0IGN1cnJlbnQgcmVhZCBhaGVhZCBzZXR0aW5nLiAgKi8KKyNkZWZpbmUgQkxLRlJBU0VUICBfSU8oMHgxMiwxMDApIC8qIFNldCBmaWxlc3lzdGVtIHJlYWQtYWhlYWQuICAqLworI2RlZmluZSBCTEtGUkFHRVQgIF9JTygweDEyLDEwMSkgLyogR2V0IGZpbGVzeXN0ZW0gcmVhZC1haGVhZC4gICovCisjZGVmaW5lIEJMS1NFQ1RTRVQgX0lPKDB4MTIsMTAyKSAvKiBTZXQgbWF4IHNlY3RvcnMgcGVyIHJlcXVlc3QuICAqLworI2RlZmluZSBCTEtTRUNUR0VUIF9JTygweDEyLDEwMykgLyogR2V0IG1heCBzZWN0b3JzIHBlciByZXF1ZXN0LiAgKi8KKyNkZWZpbmUgQkxLU1NaR0VUICBfSU8oMHgxMiwxMDQpIC8qIEdldCBibG9jayBkZXZpY2Ugc2VjdG9yIHNpemUuICAqLworI2RlZmluZSBCTEtCU1pHRVQgIF9JT1IoMHgxMiwxMTIsc2l6ZV90KQorI2RlZmluZSBCTEtCU1pTRVQgIF9JT1coMHgxMiwxMTMsc2l6ZV90KQorI2RlZmluZSBCTEtHRVRTSVpFNjQgX0lPUigweDEyLDExNCxzaXplX3QpIC8qIHJldHVybiBkZXZpY2Ugc2l6ZS4gICovCisKKworLyogUG9zc2libGUgdmFsdWUgZm9yIEZMQUdTIHBhcmFtZXRlciBvZiBgdW1vdW50MicuICAqLworZW51bQoreworICBNTlRfRk9SQ0UgPSAxLAkJLyogRm9yY2UgdW5tb3VudGluZy4gICovCisjZGVmaW5lIE1OVF9GT1JDRSBNTlRfRk9SQ0UKKyAgTU5UX0RFVEFDSCA9IDIsCQkvKiBKdXN0IGRldGFjaCBmcm9tIHRoZSB0cmVlLiAgKi8KKyNkZWZpbmUgTU5UX0RFVEFDSCBNTlRfREVUQUNICisgIE1OVF9FWFBJUkUgPSA0LAkJLyogTWFyayBmb3IgZXhwaXJ5LiAgKi8KKyNkZWZpbmUgTU5UX0VYUElSRSBNTlRfRVhQSVJFCisgIFVNT1VOVF9OT0ZPTExPVyA9IDgJCS8qIERvbid0IGZvbGxvdyBzeW1saW5rIG9uIHVtb3VudC4gICovCisjZGVmaW5lIFVNT1VOVF9OT0ZPTExPVyBVTU9VTlRfTk9GT0xMT1cKK307CisKKworX19CRUdJTl9ERUNMUworCisvKiBNb3VudCBhIGZpbGVzeXN0ZW0uICAqLworZXh0ZXJuIGludCBtb3VudCAoX19jb25zdCBjaGFyICpfX3NwZWNpYWxfZmlsZSwgX19jb25zdCBjaGFyICpfX2RpciwKKwkJICBfX2NvbnN0IGNoYXIgKl9fZnN0eXBlLCB1bnNpZ25lZCBsb25nIGludCBfX3J3ZmxhZywKKwkJICBfX2NvbnN0IHZvaWQgKl9fZGF0YSkgX19USFJPVzsKKworLyogVW5tb3VudCBhIGZpbGVzeXN0ZW0uICAqLworZXh0ZXJuIGludCB1bW91bnQgKF9fY29uc3QgY2hhciAqX19zcGVjaWFsX2ZpbGUpIF9fVEhST1c7CisKKy8qIFVubW91bnQgYSBmaWxlc3lzdGVtLiAgRm9yY2UgdW5tb3VudGluZyBpZiBGTEFHUyBpcyBzZXQgdG8gTU5UX0ZPUkNFLiAgKi8KK2V4dGVybiBpbnQgdW1vdW50MiAoX19jb25zdCBjaGFyICpfX3NwZWNpYWxfZmlsZSwgaW50IF9fZmxhZ3MpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfU1lTX01PVU5UX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL21zZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvbXNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjOTZiZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL21zZy5oCkBAIC0wLDAgKzEsODUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LDE5OTksMjAwMCwyMDAzLDIwMDYsMjAwNworICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19NU0dfSAorI2RlZmluZSBfU1lTX01TR19ICisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogR2V0IGNvbW1vbiBkZWZpbml0aW9uIG9mIFN5c3RlbSBWIHN0eWxlIElQQy4gICovCisjaW5jbHVkZSA8c3lzL2lwYy5oPgorCisvKiBHZXQgc3lzdGVtIGRlcGVuZGVudCBkZWZpbml0aW9uIG9mIGBzdHJ1Y3QgbXNxaWRfZHMnIGFuZCBtb3JlLiAgKi8KKyNpbmNsdWRlIDxiaXRzL21zcS5oPgorCisvKiBEZWZpbmUgdHlwZXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkLiAgKi8KKyNkZWZpbmUJX19uZWVkX3RpbWVfdAorI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmbmRlZiBfX3BpZF90X2RlZmluZWQKK3R5cGVkZWYgX19waWRfdCBwaWRfdDsKKyMgZGVmaW5lIF9fcGlkX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX19zc2l6ZV90X2RlZmluZWQKK3R5cGVkZWYgX19zc2l6ZV90IHNzaXplX3Q7CisjIGRlZmluZSBfX3NzaXplX3RfZGVmaW5lZAorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgU3lzdGVtIFYgc3R5bGUgSVBDIGZ1bmN0aW9ucyBpbXBsZW1lbnQgYSBtZXNzYWdlIHF1ZXVlCisgICBzeXN0ZW0uICBUaGUgZGVmaW5pdGlvbiBpcyBmb3VuZCBpbiBYUEcyLiAgKi8KKworI2lmZGVmIF9fVVNFX0dOVQorLyogVGVtcGxhdGUgZm9yIHN0cnVjdCB0byBiZSB1c2VkIGFzIGFyZ3VtZW50IGZvciBgbXNnc25kJyBhbmQgYG1zZ3JjdicuICAqLworc3RydWN0IG1zZ2J1ZgorICB7CisgICAgbG9uZyBpbnQgbXR5cGU7CQkvKiB0eXBlIG9mIHJlY2VpdmVkL3NlbnQgbWVzc2FnZSAqLworICAgIGNoYXIgbXRleHRbMV07CQkvKiB0ZXh0IG9mIHRoZSBtZXNzYWdlICovCisgIH07CisjZW5kaWYKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIE1lc3NhZ2UgcXVldWUgY29udHJvbCBvcGVyYXRpb24uICAqLworZXh0ZXJuIGludCBtc2djdGwgKGludCBfX21zcWlkLCBpbnQgX19jbWQsIHN0cnVjdCBtc3FpZF9kcyAqX19idWYpIF9fVEhST1c7CisKKy8qIEdldCBtZXNzYWdlcyBxdWV1ZS4gICovCitleHRlcm4gaW50IG1zZ2dldCAoa2V5X3QgX19rZXksIGludCBfX21zZ2ZsZykgX19USFJPVzsKKworLyogUmVjZWl2ZSBtZXNzYWdlIGZyb20gbWVzc2FnZSBxdWV1ZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCBtc2dyY3YgKGludCBfX21zcWlkLCB2b2lkICpfX21zZ3AsIHNpemVfdCBfX21zZ3N6LAorCQkgICAgICAgbG9uZyBpbnQgX19tc2d0eXAsIGludCBfX21zZ2ZsZyk7CisKKy8qIFNlbmQgbWVzc2FnZSB0byBtZXNzYWdlIHF1ZXVlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgbXNnc25kIChpbnQgX19tc3FpZCwgX19jb25zdCB2b2lkICpfX21zZ3AsIHNpemVfdCBfX21zZ3N6LAorCQkgICBpbnQgX19tc2dmbGcpOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL21zZy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9tdGlvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9tdGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFmYTU1MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL210aW8uaApAQCAtMCwwICsxLDI3NyBAQAorLyogU3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMgZm9yIG1hZ25ldGljIHRhcGUgSS9PIGNvbnRyb2wgY29tbWFuZHMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIFdyaXR0ZW4gYnkgSC4gQmVyZ21hbiA8aGVubnVzQGN5YmVyY29tbS5ubD4uICAqLworCisjaWZuZGVmIF9TWVNfTVRJT19ICisjZGVmaW5lIF9TWVNfTVRJT19ICTEKKworLyogR2V0IG5lY2Vzc2FyeSBkZWZpbml0aW9ucyBmcm9tIHN5c3RlbSBhbmQga2VybmVsIGhlYWRlcnMuICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisKKy8qIFN0cnVjdHVyZSBmb3IgTVRJT0NUT1AgLSBtYWduZXRpYyB0YXBlIG9wZXJhdGlvbiBjb21tYW5kLiAgKi8KK3N0cnVjdCBtdG9wCisgIHsKKyAgICBzaG9ydCBpbnQgbXRfb3A7CQkvKiBPcGVyYXRpb25zIGRlZmluZWQgYmVsb3cuICAqLworICAgIGludCBtdF9jb3VudDsJCS8qIEhvdyBtYW55IG9mIHRoZW0uICAqLworICB9OworI2RlZmluZSBfSU9UX210b3AgLyogSHVyZCBpb2N0bCB0eXBlIGZpZWxkLiAgKi8gXAorICBfSU9UIChfSU9UUyAoc2hvcnQpLCAxLCBfSU9UUyAoaW50KSwgMSwgMCwgMCkKKworLyogTWFnbmV0aWMgVGFwZSBvcGVyYXRpb25zIFtOb3QgYWxsIG9wZXJhdGlvbnMgc3VwcG9ydGVkIGJ5IGFsbCBkcml2ZXJzXS4gICovCisjZGVmaW5lIE1UUkVTRVQgMAkvKiArcmVzZXQgZHJpdmUgaW4gY2FzZSBvZiBwcm9ibGVtcy4gICovCisjZGVmaW5lIE1URlNGCTEJLyogRm9yd2FyZCBzcGFjZSBvdmVyIEZpbGVNYXJrLAorCQkJICogcG9zaXRpb24gYXQgZmlyc3QgcmVjb3JkIG9mIG5leHQgZmlsZS4gICovCisjZGVmaW5lIE1UQlNGCTIJLyogQmFja3dhcmQgc3BhY2UgRmlsZU1hcmsgKHBvc2l0aW9uIGJlZm9yZSBGTSkuICAqLworI2RlZmluZSBNVEZTUgkzCS8qIEZvcndhcmQgc3BhY2UgcmVjb3JkLiAgKi8KKyNkZWZpbmUgTVRCU1IJNAkvKiBCYWNrd2FyZCBzcGFjZSByZWNvcmQuICAqLworI2RlZmluZSBNVFdFT0YJNQkvKiBXcml0ZSBhbiBlbmQtb2YtZmlsZSByZWNvcmQgKG1hcmspLiAgKi8KKyNkZWZpbmUgTVRSRVcJNgkvKiBSZXdpbmQuICAqLworI2RlZmluZSBNVE9GRkwJNwkvKiBSZXdpbmQgYW5kIHB1dCB0aGUgZHJpdmUgb2ZmbGluZSAoZWplY3Q/KS4gICovCisjZGVmaW5lIE1UTk9QCTgJLyogTm8gb3AsIHNldCBzdGF0dXMgb25seSAocmVhZCB3aXRoIE1USU9DR0VUKS4gICovCisjZGVmaW5lIE1UUkVURU4gOQkvKiBSZXRlbnNpb24gdGFwZS4gICovCisjZGVmaW5lIE1UQlNGTQkxMAkvKiArYmFja3dhcmQgc3BhY2UgRmlsZU1hcmssIHBvc2l0aW9uIGF0IEZNLiAgKi8KKyNkZWZpbmUgTVRGU0ZNICAxMQkvKiArZm9yd2FyZCBzcGFjZSBGaWxlTWFyaywgcG9zaXRpb24gYXQgRk0uICAqLworI2RlZmluZSBNVEVPTQkxMgkvKiBHb3RvIGVuZCBvZiByZWNvcmRlZCBtZWRpYSAoZm9yIGFwcGVuZGluZyBmaWxlcykuCisJCQkgICBNVEVPTSBwb3NpdGlvbnMgYWZ0ZXIgdGhlIGxhc3QgRk0sIHJlYWR5IGZvcgorCQkJICAgYXBwZW5kaW5nIGFub3RoZXIgZmlsZS4gICovCisjZGVmaW5lIE1URVJBU0UgMTMJLyogRXJhc2UgdGFwZSAtLSBiZSBjYXJlZnVsISAgKi8KKworI2RlZmluZSBNVFJBUzEgIDE0CS8qIFJ1biBzZWxmIHRlc3QgMSAobm9uZGVzdHJ1Y3RpdmUpLiAgKi8KKyNkZWZpbmUgTVRSQVMyCTE1CS8qIFJ1biBzZWxmIHRlc3QgMiAoZGVzdHJ1Y3RpdmUpLiAgKi8KKyNkZWZpbmUgTVRSQVMzICAxNgkvKiBSZXNlcnZlZCBmb3Igc2VsZiB0ZXN0IDMuICAqLworCisjZGVmaW5lIE1UU0VUQkxLIDIwCS8qIFNldCBibG9jayBsZW5ndGggKFNDU0kpLiAgKi8KKyNkZWZpbmUgTVRTRVRERU5TSVRZIDIxCS8qIFNldCB0YXBlIGRlbnNpdHkgKFNDU0kpLiAgKi8KKyNkZWZpbmUgTVRTRUVLCTIyCS8qIFNlZWsgdG8gYmxvY2sgKFRhbmRiZXJnLCBldGMuKS4gICovCisjZGVmaW5lIE1UVEVMTAkyMwkvKiBUZWxsIGJsb2NrIChUYW5kYmVyZywgZXRjLikuICAqLworI2RlZmluZSBNVFNFVERSVkJVRkZFUiAyNCAvKiBTZXQgdGhlIGRyaXZlIGJ1ZmZlcmluZyBhY2NvcmRpbmcgdG8gU0NTSS0yLgorCQkJICAgICBPcmRpbmFyeSBidWZmZXJlZCBvcGVyYXRpb24gd2l0aCBjb2RlIDEuICAqLworI2RlZmluZSBNVEZTUwkyNQkvKiBTcGFjZSBmb3J3YXJkIG92ZXIgc2V0bWFya3MuICAqLworI2RlZmluZSBNVEJTUwkyNgkvKiBTcGFjZSBiYWNrd2FyZCBvdmVyIHNldG1hcmtzLiAgKi8KKyNkZWZpbmUgTVRXU00JMjcJLyogV3JpdGUgc2V0bWFya3MuICAqLworCisjZGVmaW5lIE1UTE9DSyAgMjgJLyogTG9jayB0aGUgZHJpdmUgZG9vci4gICovCisjZGVmaW5lIE1UVU5MT0NLIDI5CS8qIFVubG9jayB0aGUgZHJpdmUgZG9vci4gICovCisjZGVmaW5lIE1UTE9BRCAgMzAJLyogRXhlY3V0ZSB0aGUgU0NTSSBsb2FkIGNvbW1hbmQuICAqLworI2RlZmluZSBNVFVOTE9BRCAzMQkvKiBFeGVjdXRlIHRoZSBTQ1NJIHVubG9hZCBjb21tYW5kLiAgKi8KKyNkZWZpbmUgTVRDT01QUkVTU0lPTiAzMi8qIENvbnRyb2wgY29tcHJlc3Npb24gd2l0aCBTQ1NJIG1vZGUgcGFnZSAxNS4gICovCisjZGVmaW5lIE1UU0VUUEFSVCAzMwkvKiBDaGFuZ2UgdGhlIGFjdGl2ZSB0YXBlIHBhcnRpdGlvbi4gICovCisjZGVmaW5lIE1UTUtQQVJUICAzNAkvKiBGb3JtYXQgdGhlIHRhcGUgd2l0aCBvbmUgb3IgdHdvIHBhcnRpdGlvbnMuICAqLworCisvKiBzdHJ1Y3R1cmUgZm9yIE1USU9DR0VUIC0gbWFnIHRhcGUgZ2V0IHN0YXR1cyBjb21tYW5kICovCisKK3N0cnVjdCBtdGdldAorICB7CisgICAgbG9uZyBpbnQgbXRfdHlwZTsJCS8qIFR5cGUgb2YgbWFndGFwZSBkZXZpY2UuICAqLworICAgIGxvbmcgaW50IG10X3Jlc2lkOwkJLyogUmVzaWR1YWwgY291bnQ6IChub3Qgc3VyZSkKKwkJCQkgICBudW1iZXIgb2YgYnl0ZXMgaWdub3JlZCwgb3IKKwkJCQkgICBudW1iZXIgb2YgZmlsZXMgbm90IHNraXBwZWQsIG9yCisJCQkJICAgbnVtYmVyIG9mIHJlY29yZHMgbm90IHNraXBwZWQuICAqLworICAgIC8qIFRoZSBmb2xsb3dpbmcgcmVnaXN0ZXJzIGFyZSBkZXZpY2UgZGVwZW5kZW50LiAgKi8KKyAgICBsb25nIGludCBtdF9kc3JlZzsJCS8qIFN0YXR1cyByZWdpc3Rlci4gICovCisgICAgbG9uZyBpbnQgbXRfZ3N0YXQ7CQkvKiBHZW5lcmljIChkZXZpY2UgaW5kZXBlbmRlbnQpIHN0YXR1cy4gICovCisgICAgbG9uZyBpbnQgbXRfZXJyZWc7CQkvKiBFcnJvciByZWdpc3Rlci4gICovCisgICAgLyogVGhlIG5leHQgdHdvIGZpZWxkcyBhcmUgbm90IGFsd2F5cyB1c2VkLiAgKi8KKyAgICBfX2RhZGRyX3QgbXRfZmlsZW5vOwkvKiBOdW1iZXIgb2YgY3VycmVudCBmaWxlIG9uIHRhcGUuICAqLworICAgIF9fZGFkZHJfdCBtdF9ibGtubzsJCS8qIEN1cnJlbnQgYmxvY2sgbnVtYmVyLiAgKi8KKyAgfTsKKyNkZWZpbmUgX0lPVF9tdGdldCAvKiBIdXJkIGlvY3RsIHR5cGUgZmllbGQuICAqLyBcCisgIF9JT1QgKF9JT1RTIChsb25nKSwgNywgMCwgMCwgMCwgMCkKKworCisvKiBDb25zdGFudHMgZm9yIG10X3R5cGUuIE5vdCBhbGwgb2YgdGhlc2UgYXJlIHN1cHBvcnRlZCwgYW5kCisgICB0aGVzZSBhcmUgbm90IGFsbCBvZiB0aGUgb25lcyB0aGF0IGFyZSBzdXBwb3J0ZWQuICAqLworI2RlZmluZSBNVF9JU1VOS05PV04JCTB4MDEKKyNkZWZpbmUgTVRfSVNRSUMwMgkJMHgwMgkvKiBHZW5lcmljIFFJQy0wMiB0YXBlIHN0cmVhbWVyLiAgKi8KKyNkZWZpbmUgTVRfSVNXVDUxNTAJCTB4MDMJLyogV2FuZ3RlayA1MTUwRVEsIFFJQy0xNTAsIFFJQy0wMi4gICovCisjZGVmaW5lIE1UX0lTQVJDSElWRV81OTQ1TDIJMHgwNAkvKiBBcmNoaXZlIDU5NDVMLTIsIFFJQy0yNCwgUUlDLTAyPy4gKi8KKyNkZWZpbmUgTVRfSVNDTVNKNTAwCQkweDA1CS8qIENNUyBKdW1ibyA1MDAgKFFJQy0wMj8pLiAgKi8KKyNkZWZpbmUgTVRfSVNUREMzNjEwCQkweDA2CS8qIFRhbmRiZXJnIDYzMTAsIFFJQy0yNC4gICovCisjZGVmaW5lIE1UX0lTQVJDSElWRV9WUDYwSQkweDA3CS8qIEFyY2hpdmUgVlA2MGksIFFJQy0wMi4gICovCisjZGVmaW5lIE1UX0lTQVJDSElWRV8yMTUwTAkweDA4CS8qIEFyY2hpdmUgVmlwZXIgMjE1MEwuICAqLworI2RlZmluZSBNVF9JU0FSQ0hJVkVfMjA2MEwJMHgwOQkvKiBBcmNoaXZlIFZpcGVyIDIwNjBMLiAgKi8KKyNkZWZpbmUgTVRfSVNBUkNISVZFU0M0OTkJMHgwQQkvKiBBcmNoaXZlIFNDLTQ5OSBRSUMtMzYgY29udHJvbGxlci4gKi8KKyNkZWZpbmUgTVRfSVNRSUMwMl9BTExfRkVBVFVSRVMJMHgwRgkvKiBHZW5lcmljIFFJQy0wMiB3aXRoIGFsbCBmZWF0dXJlcy4gKi8KKyNkZWZpbmUgTVRfSVNXVDUwOTlFRU4yNAkweDExCS8qIFdhbmd0ZWsgNTA5OS1lZW4yNCwgNjBNQiwgUUlDLTI0LiAqLworI2RlZmluZSBNVF9JU1RFQUNfTVQyU1QJCTB4MTIJLyogVGVhYyBNVC0yU1QgMTU1bWIgZHJpdmUsCisJCQkJCSAgIFRlYWMgREMtMSBjYXJkIChXYW5ndGVrIHR5cGUpLiAgKi8KKyNkZWZpbmUgTVRfSVNFVkVSRVhfRlQ0MEEJMHgzMgkvKiBFdmVyZXggRlQ0MEEgKFFJQy00MCkuICAqLworI2RlZmluZSBNVF9JU0REUzEJCTB4NTEJLyogRERTIGRldmljZSB3aXRob3V0IHBhcnRpdGlvbnMuICAqLworI2RlZmluZSBNVF9JU0REUzIJCTB4NTIJLyogRERTIGRldmljZSB3aXRoIHBhcnRpdGlvbnMuICAqLworI2RlZmluZSBNVF9JU1NDU0kxCQkweDcxCS8qIEdlbmVyaWMgQU5TSSBTQ1NJLTEgdGFwZSB1bml0LiAgKi8KKyNkZWZpbmUgTVRfSVNTQ1NJMgkJMHg3MgkvKiBHZW5lcmljIEFOU0kgU0NTSS0yIHRhcGUgdW5pdC4gICovCisKKy8qIFFJQy00MC84MC8zMDEwLzMwMjAgZnRhcGUgc3VwcG9ydGVkIGRyaXZlcy4KKyAgIDIwYml0IHZlbmRvciBJRCArIDB4ODAwMDAwIChzZWUgdmVuZG9ycy5oIGluIGZ0YXBlIGRpc3RyaWJ1dGlvbikuICAqLworI2RlZmluZSBNVF9JU0ZUQVBFX1VOS05PV04JMHg4MDAwMDAgLyogb2Jzb2xldGUgKi8KKyNkZWZpbmUgTVRfSVNGVEFQRV9GTEFHCQkweDgwMDAwMAorCitzdHJ1Y3QgbXRfdGFwZV9pbmZvCisgIHsKKyAgICBsb25nIGludCB0X3R5cGU7CQkvKiBEZXZpY2UgdHlwZSBpZCAobXRfdHlwZSkuICAqLworICAgIGNoYXIgKnRfbmFtZTsJCS8qIERlc2NyaXB0aXZlIG5hbWUuICAqLworICB9OworCisjZGVmaW5lIE1UX1RBUEVfSU5GTyBcCisgIHsJCQkJCQkJCQkgICAgICBcCisJe01UX0lTVU5LTk9XTiwJCSJVbmtub3duIHR5cGUgb2YgdGFwZSBkZXZpY2UifSwJCSAgICAgIFwKKwl7TVRfSVNRSUMwMiwJCSJHZW5lcmljIFFJQy0wMiB0YXBlIHN0cmVhbWVyIn0sCSAgICAgIFwKKwl7TVRfSVNXVDUxNTAsCQkiV2FuZ3RlayA1MTUwLCBRSUMtMTUwIn0sCQkgICAgICBcCisJe01UX0lTQVJDSElWRV81OTQ1TDIsCSJBcmNoaXZlIDU5NDVMLTIifSwJCQkgICAgICBcCisJe01UX0lTQ01TSjUwMCwJCSJDTVMgSnVtYm8gNTAwIn0sCQkJICAgICAgXAorCXtNVF9JU1REQzM2MTAsCQkiVGFuZGJlcmcgVERDIDM2MTAsIFFJQy0yNCJ9LAkJICAgICAgXAorCXtNVF9JU0FSQ0hJVkVfVlA2MEksCSJBcmNoaXZlIFZQNjBpLCBRSUMtMDIifSwJCSAgICAgIFwKKwl7TVRfSVNBUkNISVZFXzIxNTBMLAkiQXJjaGl2ZSBWaXBlciAyMTUwTCJ9LAkJCSAgICAgIFwKKwl7TVRfSVNBUkNISVZFXzIwNjBMLAkiQXJjaGl2ZSBWaXBlciAyMDYwTCJ9LAkJCSAgICAgIFwKKwl7TVRfSVNBUkNISVZFU0M0OTksCSJBcmNoaXZlIFNDLTQ5OSBRSUMtMzYgY29udHJvbGxlciJ9LAkgICAgICBcCisJe01UX0lTUUlDMDJfQUxMX0ZFQVRVUkVTLCAiR2VuZXJpYyBRSUMtMDIgdGFwZSwgYWxsIGZlYXR1cmVzIn0sCSAgICAgIFwKKwl7TVRfSVNXVDUwOTlFRU4yNCwJIldhbmd0ZWsgNTA5OS1lZW4yNCwgNjBNQiJ9LAkJICAgICAgXAorCXtNVF9JU1RFQUNfTVQyU1QsCSJUZWFjIE1ULTJTVCAxNTVtYiBkYXRhIGNhc3NldHRlIGRyaXZlIn0sICAgICBcCisJe01UX0lTRVZFUkVYX0ZUNDBBLAkiRXZlcmV4IEZUNDBBLCBRSUMtNDAifSwJCSAgICAgIFwKKwl7TVRfSVNTQ1NJMSwJCSJHZW5lcmljIFNDU0ktMSB0YXBlIn0sCQkJICAgICAgXAorCXtNVF9JU1NDU0kyLAkJIkdlbmVyaWMgU0NTSS0yIHRhcGUifSwJCQkgICAgICBcCisJezAsIE5VTEx9CQkJCQkJCSAgICAgIFwKKyAgfQorCisKKy8qIFN0cnVjdHVyZSBmb3IgTVRJT0NQT1MgLSBtYWcgdGFwZSBnZXQgcG9zaXRpb24gY29tbWFuZC4gICovCisKK3N0cnVjdCBtdHBvcworICB7CisgICAgbG9uZyBpbnQgbXRfYmxrbm87CS8qIEN1cnJlbnQgYmxvY2sgbnVtYmVyLiAgKi8KKyAgfTsKKyNkZWZpbmUgX0lPVF9tdHBvcyAvKiBIdXJkIGlvY3RsIHR5cGUgZmllbGQuICAqLyBcCisgIF9JT1RfU0lNUExFIChsb25nKQorCisKKy8qIFN0cnVjdHVyZSBmb3IgTVRJT0NHRVRDT05GSUcvTVRJT0NTRVRDT05GSUcgcHJpbWFyaWx5IGludGVuZGVkCisgICBhcyBhbiBpbnRlcmltIHNvbHV0aW9uIGZvciBRSUMtMDIgdW50aWwgRERJIGlzIGZ1bGx5IGltcGxlbWVudGVkLiAgKi8KK3N0cnVjdCBtdGNvbmZpZ2luZm8KKyAgeworICAgIGxvbmcgaW50IG10X3R5cGU7CQkvKiBEcml2ZSB0eXBlLiAgKi8KKyAgICBsb25nIGludCBpZmNfdHlwZTsJCS8qIEludGVyZmFjZSBjYXJkIHR5cGUuICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBpcnFucjsJLyogSVJRIG51bWJlciB0byB1c2UuICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBkbWFucjsJLyogRE1BIGNoYW5uZWwgdG8gdXNlLiAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgcG9ydDsJLyogSU8gcG9ydCBiYXNlIGFkZHJlc3MuICAqLworCisgICAgdW5zaWduZWQgbG9uZyBpbnQgZGVidWc7CS8qIERlYnVnZ2luZyBmbGFncy4gICovCisKKyAgICB1bnNpZ25lZCBoYXZlX2RlbnM6MTsKKyAgICB1bnNpZ25lZCBoYXZlX2JzZjoxOworICAgIHVuc2lnbmVkIGhhdmVfZnNyOjE7CisgICAgdW5zaWduZWQgaGF2ZV9ic3I6MTsKKyAgICB1bnNpZ25lZCBoYXZlX2VvZDoxOworICAgIHVuc2lnbmVkIGhhdmVfc2VlazoxOworICAgIHVuc2lnbmVkIGhhdmVfdGVsbDoxOworICAgIHVuc2lnbmVkIGhhdmVfcmFzMToxOworICAgIHVuc2lnbmVkIGhhdmVfcmFzMjoxOworICAgIHVuc2lnbmVkIGhhdmVfcmFzMzoxOworICAgIHVuc2lnbmVkIGhhdmVfcWZhOjE7CisKKyAgICB1bnNpZ25lZCBwYWQxOjU7CisgICAgY2hhciByZXNlcnZlZFsxMF07CisgIH07CisjZGVmaW5lIF9JT1RfbXRjb25maWdpbmZvIC8qIEh1cmQgaW9jdGwgdHlwZSBmaWVsZC4gICovIFwKKyAgX0lPVCAoX0lPVFMgKGxvbmcpLCAyLCBfSU9UUyAoc2hvcnQpLCAzLCBfSU9UUyAobG9uZyksIDEpIC8qIFhYWCB3cm9uZyAqLworCisKKy8qIE1hZ25ldGljIHRhcGUgSS9PIGNvbnRyb2wgY29tbWFuZHMuICAqLworI2RlZmluZQlNVElPQ1RPUAlfSU9XKCdtJywgMSwgc3RydWN0IG10b3ApCS8qIERvIGEgbWFnIHRhcGUgb3AuICovCisjZGVmaW5lCU1USU9DR0VUCV9JT1IoJ20nLCAyLCBzdHJ1Y3QgbXRnZXQpCS8qIEdldCB0YXBlIHN0YXR1cy4gICovCisjZGVmaW5lCU1USU9DUE9TCV9JT1IoJ20nLCAzLCBzdHJ1Y3QgbXRwb3MpCS8qIEdldCB0YXBlIHBvc2l0aW9uLiovCisKKy8qIFRoZSBuZXh0IHR3byBhcmUgdXNlZCBieSB0aGUgUUlDLTAyIGRyaXZlciBmb3IgcnVudGltZSByZWNvbmZpZ3VyYXRpb24uCisgICBTZWUgdHBxaWMwMi5oIGZvciBzdHJ1Y3QgbXRjb25maWdpbmZvLiAgKi8KKyNkZWZpbmUJTVRJT0NHRVRDT05GSUcJX0lPUignbScsIDQsIHN0cnVjdCBtdGNvbmZpZ2luZm8pIC8qIEdldCB0YXBlIGNvbmZpZy4qLworI2RlZmluZQlNVElPQ1NFVENPTkZJRwlfSU9XKCdtJywgNSwgc3RydWN0IG10Y29uZmlnaW5mbykgLyogU2V0IHRhcGUgY29uZmlnLiovCisKKy8qIEdlbmVyaWMgTWFnIFRhcGUgKGRldmljZSBpbmRlcGVuZGVudCkgc3RhdHVzIG1hY3JvcyBmb3IgZXhhbWluaW5nCisgICBtdF9nc3RhdCAtLSBIUC1VWCBjb21wYXRpYmxlLgorICAgVGhlcmUgaXMgcm9vbSBmb3IgbW9yZSBnZW5lcmljIHN0YXR1cyBiaXRzIGhlcmUsIGJ1dCBJIGRvbid0CisgICBrbm93IHdoaWNoIG9mIHRoZW0gYXJlIHJlc2VydmVkLiBBdCBsZWFzdCB0aHJlZSBvciBzbyBzaG91bGQKKyAgIGJlIGFkZGVkIHRvIG1ha2UgdGhpcyByZWFsbHkgdXNlZnVsLiAgKi8KKyNkZWZpbmUgR01UX0VPRih4KSAgICAgICAgICAgICAgKCh4KSAmIDB4ODAwMDAwMDApCisjZGVmaW5lIEdNVF9CT1QoeCkgICAgICAgICAgICAgICgoeCkgJiAweDQwMDAwMDAwKQorI2RlZmluZSBHTVRfRU9UKHgpICAgICAgICAgICAgICAoKHgpICYgMHgyMDAwMDAwMCkKKyNkZWZpbmUgR01UX1NNKHgpICAgICAgICAgICAgICAgKCh4KSAmIDB4MTAwMDAwMDApICAvKiBERFMgc2V0bWFyayAqLworI2RlZmluZSBHTVRfRU9EKHgpICAgICAgICAgICAgICAoKHgpICYgMHgwODAwMDAwMCkgIC8qIEREUyBFT0QgKi8KKyNkZWZpbmUgR01UX1dSX1BST1QoeCkgICAgICAgICAgKCh4KSAmIDB4MDQwMDAwMDApCisvKiAjZGVmaW5lIEdNVF8gPyAJCSgoeCkgJiAweDAyMDAwMDAwKSAqLworI2RlZmluZSBHTVRfT05MSU5FKHgpICAgICAgICAgICAoKHgpICYgMHgwMTAwMDAwMCkKKyNkZWZpbmUgR01UX0RfNjI1MCh4KSAgICAgICAgICAgKCh4KSAmIDB4MDA4MDAwMDApCisjZGVmaW5lIEdNVF9EXzE2MDAoeCkgICAgICAgICAgICgoeCkgJiAweDAwNDAwMDAwKQorI2RlZmluZSBHTVRfRF84MDAoeCkgICAgICAgICAgICAoKHgpICYgMHgwMDIwMDAwMCkKKy8qICNkZWZpbmUgR01UXyA/IAkJKCh4KSAmIDB4MDAxMDAwMDApICovCisvKiAjZGVmaW5lIEdNVF8gPyAJCSgoeCkgJiAweDAwMDgwMDAwKSAqLworI2RlZmluZSBHTVRfRFJfT1BFTih4KSAgICAgICAgICAoKHgpICYgMHgwMDA0MDAwMCkgIC8qIERvb3Igb3BlbiAobm8gdGFwZSkuICAqLworLyogI2RlZmluZSBHTVRfID8gCQkoKHgpICYgMHgwMDAyMDAwMCkgKi8KKyNkZWZpbmUgR01UX0lNX1JFUF9FTih4KSAgICAgICAgKCh4KSAmIDB4MDAwMTAwMDApICAvKiBJbW1lZGlhdGUgcmVwb3J0IG1vZGUuKi8KKy8qIDE2IGdlbmVyaWMgc3RhdHVzIGJpdHMgdW51c2VkLiAgKi8KKworCisvKiBTQ1NJLXRhcGUgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICBCaXRmaWVsZCBzaGlmdHMgaW4gdGhlIHN0YXR1cyAgKi8KKyNkZWZpbmUgTVRfU1RfQkxLU0laRV9TSElGVAkwCisjZGVmaW5lIE1UX1NUX0JMS1NJWkVfTUFTSwkweGZmZmZmZgorI2RlZmluZSBNVF9TVF9ERU5TSVRZX1NISUZUCTI0CisjZGVmaW5lIE1UX1NUX0RFTlNJVFlfTUFTSwkweGZmMDAwMDAwCisKKyNkZWZpbmUgTVRfU1RfU09GVEVSUl9TSElGVAkwCisjZGVmaW5lIE1UX1NUX1NPRlRFUlJfTUFTSwkweGZmZmYKKworLyogQml0ZmllbGRzIGZvciB0aGUgTVRTRVREUlZCVUZGRVIgaW9jdGwuICAqLworI2RlZmluZSBNVF9TVF9PUFRJT05TCQkweGYwMDAwMDAwCisjZGVmaW5lIE1UX1NUX0JPT0xFQU5TCQkweDEwMDAwMDAwCisjZGVmaW5lIE1UX1NUX1NFVEJPT0xFQU5TCTB4MzAwMDAwMDAKKyNkZWZpbmUgTVRfU1RfQ0xFQVJCT09MRUFOUwkweDQwMDAwMDAwCisjZGVmaW5lIE1UX1NUX1dSSVRFX1RIUkVTSE9MRAkweDIwMDAwMDAwCisjZGVmaW5lIE1UX1NUX0RFRl9CTEtTSVpFCTB4NTAwMDAwMDAKKyNkZWZpbmUgTVRfU1RfREVGX09QVElPTlMJMHg2MDAwMDAwMAorCisjZGVmaW5lIE1UX1NUX0JVRkZFUl9XUklURVMJMHgxCisjZGVmaW5lIE1UX1NUX0FTWU5DX1dSSVRFUwkweDIKKyNkZWZpbmUgTVRfU1RfUkVBRF9BSEVBRAkweDQKKyNkZWZpbmUgTVRfU1RfREVCVUdHSU5HCQkweDgKKyNkZWZpbmUgTVRfU1RfVFdPX0ZNCQkweDEwCisjZGVmaW5lIE1UX1NUX0ZBU1RfTVRFT00JMHgyMAorI2RlZmluZSBNVF9TVF9BVVRPX0xPQ0sJCTB4NDAKKyNkZWZpbmUgTVRfU1RfREVGX1dSSVRFUwkweDgwCisjZGVmaW5lIE1UX1NUX0NBTl9CU1IJCTB4MTAwCisjZGVmaW5lIE1UX1NUX05PX0JMS0xJTVMJMHgyMDAKKyNkZWZpbmUgTVRfU1RfQ0FOX1BBUlRJVElPTlMgICAgMHg0MDAKKyNkZWZpbmUgTVRfU1RfU0NTSTJMT0dJQ0FMICAgICAgMHg4MDAKKworLyogVGhlIG1vZGUgcGFyYW1ldGVycyB0byBiZSBjb250cm9sbGVkLiBQYXJhbWV0ZXIgY2hvc2VuIHdpdGggYml0cyAyMC0yOC4gICovCisjZGVmaW5lIE1UX1NUX0NMRUFSX0RFRkFVTFQJMHhmZmZmZgorI2RlZmluZSBNVF9TVF9ERUZfREVOU0lUWQkoTVRfU1RfREVGX09QVElPTlMgfCAweDEwMDAwMCkKKyNkZWZpbmUgTVRfU1RfREVGX0NPTVBSRVNTSU9OCShNVF9TVF9ERUZfT1BUSU9OUyB8IDB4MjAwMDAwKQorI2RlZmluZSBNVF9TVF9ERUZfRFJWQlVGRkVSCShNVF9TVF9ERUZfT1BUSU9OUyB8IDB4MzAwMDAwKQorCisvKiBUaGUgb2Zmc2V0IGZvciB0aGUgYXJndW1lbnRzIGZvciB0aGUgc3BlY2lhbCBIUCBjaGFuZ2VyIGxvYWQgY29tbWFuZC4gICovCisjZGVmaW5lIE1UX1NUX0hQTE9BREVSX09GRlNFVCAxMDAwMAorCisKKy8qIFNwZWNpZnkgZGVmYXVsdCB0YXBlIGRldmljZS4gICovCisjaWZuZGVmIERFRlRBUEUKKyMgZGVmaW5lIERFRlRBUEUJIi9kZXYvdGFwZSIKKyNlbmRpZgorCisjZW5kaWYgLyogbXRpby5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9wYXJhbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYThmNWU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcGFyYW0uaApAQCAtMCwwICsxLDgzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywyMDAwLDIwMDEsMjAwMywyMDA4LDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfUEFSQU1fSAorI2RlZmluZSBfU1lTX1BBUkFNX0gJMQorCisjaWZuZGVmIEFSR19NQVgKKyMgZGVmaW5lIF9fdW5kZWZfQVJHX01BWAorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorCisvKiBUaGUga2VybmVsIGhlYWRlcnMgZGVmaW5lcyBBUkdfTUFYLiAgVGhlIHZhbHVlIGlzIHdyb25nLCB0aG91Z2guICAqLworI2lmZGVmIF9fdW5kZWZfQVJHX01BWAorIyB1bmRlZiBBUkdfTUFYCisjIHVuZGVmIF9fdW5kZWZfQVJHX01BWAorI2VuZGlmCisKKy8qIEJTRCBuYW1lcyBmb3Igc29tZSA8bGltaXRzLmg+IHZhbHVlcy4gICovCisKKyNkZWZpbmUJTkJCWQkJQ0hBUl9CSVQKKyNpZm5kZWYJTkdST1VQUworIyBkZWZpbmUgTkdST1VQUwlOR1JPVVBTX01BWAorI2VuZGlmCisjZGVmaW5lCU1BWFNZTUxJTktTCTIwCisjZGVmaW5lCUNBTkJTSVoJCU1BWF9DQU5PTgorI2RlZmluZSBNQVhQQVRITEVOCVBBVEhfTUFYCisvKiBUaGUgZm9sbG93aW5nIGFyZSBub3QgcmVhbGx5IGNvcnJlY3QgYnV0IGl0IGlzIGEgdmFsdWUgd2UgdXNlZCBmb3IgYQorICAgbG9uZyB0aW1lIGFuZCB3aGljaCBzZWVtcyB0byBiZSB1c2FibGUuICBQZW9wbGUgc2hvdWxkIG5vdCB1c2UgTk9GSUxFCisgICBhbmQgTkNBUkdTIGFueXdheS4gICovCisjZGVmaW5lIE5PRklMRQkJMjU2CisjZGVmaW5lCU5DQVJHUwkJMTMxMDcyCisKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKiBCaXQgbWFwIHJlbGF0ZWQgbWFjcm9zLiAgKi8KKyNkZWZpbmUJc2V0Yml0KGEsaSkJKChhKVsoaSkvTkJCWV0gfD0gMTw8KChpKSVOQkJZKSkKKyNkZWZpbmUJY2xyYml0KGEsaSkJKChhKVsoaSkvTkJCWV0gJj0gfigxPDwoKGkpJU5CQlkpKSkKKyNkZWZpbmUJaXNzZXQoYSxpKQkoKGEpWyhpKS9OQkJZXSAmICgxPDwoKGkpJU5CQlkpKSkKKyNkZWZpbmUJaXNjbHIoYSxpKQkoKChhKVsoaSkvTkJCWV0gJiAoMTw8KChpKSVOQkJZKSkpID09IDApCisKKy8qIE1hY3JvcyBmb3IgY291bnRpbmcgYW5kIHJvdW5kaW5nLiAgKi8KKyNpZm5kZWYgaG93bWFueQorIyBkZWZpbmUgaG93bWFueSh4LCB5KQkoKCh4KSArICgoeSkgLSAxKSkgLyAoeSkpCisjZW5kaWYKKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgcm91bmR1cCh4LCB5KQkoX19idWlsdGluX2NvbnN0YW50X3AgKHkpICYmIHBvd2Vyb2YyICh5KQkgICAgICBcCisJCQkgPyAoKCh4KSArICh5KSAtIDEpICYgfigoeSkgLSAxKSkJCSAgICAgIFwKKwkJCSA6ICgoKCh4KSArICgoeSkgLSAxKSkgLyAoeSkpICogKHkpKSkKKyNlbHNlCisjIGRlZmluZSByb3VuZHVwKHgsIHkpCSgoKCh4KSArICgoeSkgLSAxKSkgLyAoeSkpICogKHkpKQorI2VuZGlmCisjZGVmaW5lIHBvd2Vyb2YyKHgpCSgoKCh4KSAtIDEpICYgKHgpKSA9PSAwKQorCisvKiBNYWNyb3MgZm9yIG1pbi9tYXguICAqLworI2RlZmluZQlNSU4oYSxiKSAoKChhKTwoYikpPyhhKTooYikpCisjZGVmaW5lCU1BWChhLGIpICgoKGEpPihiKSk/KGEpOihiKSkKKworCisvKiBVbml0IG9mIGBzdF9ibG9ja3MnLiAgKi8KKyNkZWZpbmUgREVWX0JTSVpFICAgICAgIDUxMgorCisKKyNlbmRpZgkvKiBzeXMvcGFyYW0uaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcGNpLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjI2MjY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcGNpLmgKQEAgLTAsMCArMSwyNSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfUENJX0gKKyNkZWZpbmUgX1NZU19QQ0lfSAkxCisKKy8qIFdlIHVzZSB0aGUgY29uc3RhbnRzIGZyb20gdGhlIGtlcm5lbC4gICovCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNlbmRpZiAvKiBzeXMvcGNpLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3Blcm0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3Blcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzg5ZTY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcGVybS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1BFUk1fSAorCisjZGVmaW5lIF9TWVNfUEVSTV9ICTEKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFNldCBwb3J0IGlucHV0L291dHB1dCBwZXJtaXNzaW9ucy4gICovCitleHRlcm4gaW50IGlvcGVybSAodW5zaWduZWQgbG9uZyBpbnQgX19mcm9tLCB1bnNpZ25lZCBsb25nIGludCBfX251bSwKKwkJICAgaW50IF9fdHVybl9vbikgX19USFJPVzsKKworCisvKiBDaGFuZ2UgSS9PIHByaXZpbGVnZSBsZXZlbC4gICovCitleHRlcm4gaW50IGlvcGwgKGludCBfX2xldmVsKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogX1NZU19QRVJNX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3BlcnNvbmFsaXR5LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9wZXJzb25hbGl0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1M2E0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9wZXJzb25hbGl0eS5oCkBAIC0wLDAgKzEsNzggQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogVGFrZW4gdmVyYmF0aW0gZnJvbSBMaW51eCAyLjYgKGluY2x1ZGUvbGludXgvcGVyc29uYWxpdHkuaCkuICAqLworCisjaWZuZGVmIF9TWVNfUEVSU09OQUxJVFlfSAorI2RlZmluZSBfU1lTX1BFUlNPTkFMSVRZX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogRmxhZ3MgZm9yIGJ1ZyBlbXVsYXRpb24uCisgICBUaGVzZSBvY2N1cHkgdGhlIHRvcCB0aHJlZSBieXRlcy4gICovCitlbnVtCisgIHsKKyAgICBBRERSX05PX1JBTkRPTUlaRSA9IDB4MDA0MDAwMCwKKyAgICBNTUFQX1BBR0VfWkVSTyA9IDB4MDEwMDAwMCwKKyAgICBBRERSX0NPTVBBVF9MQVlPVVQgPSAweDAyMDAwMDAsCisgICAgUkVBRF9JTVBMSUVTX0VYRUMgPSAweDA0MDAwMDAsCisgICAgQUREUl9MSU1JVF8zMkJJVCA9IDB4MDgwMDAwMCwKKyAgICBTSE9SVF9JTk9ERSA9IDB4MTAwMDAwMCwKKyAgICBXSE9MRV9TRUNPTkRTID0gMHgyMDAwMDAwLAorICAgIFNUSUNLWV9USU1FT1VUUyA9IDB4NDAwMDAwMCwKKyAgICBBRERSX0xJTUlUXzNHQiA9IAkweDgwMDAwMDAKKyAgfTsKKworLyogUGVyc29uYWxpdHkgdHlwZXMuCisKKyAgIFRoZXNlIGdvIGluIHRoZSBsb3cgYnl0ZS4gIEF2b2lkIHVzaW5nIHRoZSB0b3AgYml0LCBpdCB3aWxsCisgICBjb25mbGljdCB3aXRoIGVycm9yIHJldHVybnMuICAqLworZW51bSAKKyAgeworICAgIFBFUl9MSU5VWCA9IDB4MDAwMCwKKyAgICBQRVJfTElOVVhfMzJCSVQgPSAweDAwMDAgfCBBRERSX0xJTUlUXzMyQklULAorICAgIFBFUl9TVlI0ID0gMHgwMDAxIHwgU1RJQ0tZX1RJTUVPVVRTIHwgTU1BUF9QQUdFX1pFUk8sCisgICAgUEVSX1NWUjMgPSAweDAwMDIgfCBTVElDS1lfVElNRU9VVFMgfCBTSE9SVF9JTk9ERSwKKyAgICBQRVJfU0NPU1ZSMyA9IDB4MDAwMyB8IFNUSUNLWV9USU1FT1VUUyB8IFdIT0xFX1NFQ09ORFMgfCBTSE9SVF9JTk9ERSwKKyAgICBQRVJfT1NSNSA9IDB4MDAwMyB8IFNUSUNLWV9USU1FT1VUUyB8IFdIT0xFX1NFQ09ORFMsCisgICAgUEVSX1dZU0VWMzg2ID0gMHgwMDA0IHwgU1RJQ0tZX1RJTUVPVVRTIHwgU0hPUlRfSU5PREUsCisgICAgUEVSX0lTQ1I0ID0gMHgwMDA1IHwgU1RJQ0tZX1RJTUVPVVRTLAorICAgIFBFUl9CU0QgPSAweDAwMDYsCisgICAgUEVSX1NVTk9TID0gMHgwMDA2IHwgU1RJQ0tZX1RJTUVPVVRTLAorICAgIFBFUl9YRU5JWCA9IDB4MDAwNyB8IFNUSUNLWV9USU1FT1VUUyB8IFNIT1JUX0lOT0RFLAorICAgIFBFUl9MSU5VWDMyID0gMHgwMDA4LAorICAgIFBFUl9MSU5VWDMyXzNHQiA9IDB4MDAwOCB8IEFERFJfTElNSVRfM0dCLAorICAgIFBFUl9JUklYMzIgPSAweDAwMDkgfCBTVElDS1lfVElNRU9VVFMsCS8qIElSSVg1IDMyLWJpdCAqLworICAgIFBFUl9JUklYTjMyID0gMHgwMDBhIHwgU1RJQ0tZX1RJTUVPVVRTLAkvKiBJUklYNiBuZXcgMzItYml0ICovCisgICAgUEVSX0lSSVg2NCA9IDB4MDAwYiB8IFNUSUNLWV9USU1FT1VUUywJLyogSVJJWDYgNjQtYml0ICovCisgICAgUEVSX1JJU0NPUyA9IDB4MDAwYywKKyAgICBQRVJfU09MQVJJUyA9IDB4MDAwZCB8IFNUSUNLWV9USU1FT1VUUywKKyAgICBQRVJfVVc3ID0gMHgwMDBlIHwgU1RJQ0tZX1RJTUVPVVRTIHwgTU1BUF9QQUdFX1pFUk8sCisgICAgUEVSX09TRjQgPSAweDAwMGYsCisgICAgUEVSX0hQVVggPSAweDAwMTAsCisgICAgUEVSX01BU0sgPSAweDAwZmYsCisgIH07CisKK19fQkVHSU5fREVDTFMKKworLyogU2V0IGRpZmZlcmVudCBBQklzIChwZXJzb25hbGl0aWVzKS4gICovCitleHRlcm4gaW50IHBlcnNvbmFsaXR5ICh1bnNpZ25lZCBsb25nIGludCBfX3BlcnNvbmEpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvcGVyc29uYWxpdHkuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcG9sbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcG9sbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwODViNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9wb2xsLmgKQEAgLTAsMCArMSw3NCBAQAorLyogQ29tcGF0aWJpbGl0eSBkZWZpbml0aW9ucyBmb3IgU3lzdGVtIFYgYHBvbGwnIGludGVyZmFjZS4KKyAgIENvcHlyaWdodCAoQykgMTk5NCwxOTk2LTIwMDEsMjAwNCwyMDA1LDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19QT0xMX0gKKyNkZWZpbmUJX1NZU19QT0xMX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogR2V0IHRoZSBwbGF0Zm9ybSBkZXBlbmRlbnQgYml0cyBvZiBgcG9sbCcuICAqLworI2luY2x1ZGUgPGJpdHMvcG9sbC5oPgorI2lmZGVmIF9fVVNFX0dOVQorLyogR2V0IHRoZSBfX3NpZ3NldF90IGRlZmluaXRpb24uICAqLworIyBpbmNsdWRlIDxiaXRzL3NpZ3NldC5oPgorLyogR2V0IHRoZSB0aW1lc3BlYyBkZWZpbml0aW9uLiAgKi8KKyMgZGVmaW5lIF9fbmVlZF90aW1lc3BlYworIyBpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYKKworCisvKiBUeXBlIHVzZWQgZm9yIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycy4gICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IG5mZHNfdDsKKworLyogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHBvbGxpbmcgcmVxdWVzdC4gICovCitzdHJ1Y3QgcG9sbGZkCisgIHsKKyAgICBpbnQgZmQ7CQkJLyogRmlsZSBkZXNjcmlwdG9yIHRvIHBvbGwuICAqLworICAgIHNob3J0IGludCBldmVudHM7CQkvKiBUeXBlcyBvZiBldmVudHMgcG9sbGVyIGNhcmVzIGFib3V0LiAgKi8KKyAgICBzaG9ydCBpbnQgcmV2ZW50czsJCS8qIFR5cGVzIG9mIGV2ZW50cyB0aGF0IGFjdHVhbGx5IG9jY3VycmVkLiAgKi8KKyAgfTsKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFBvbGwgdGhlIGZpbGUgZGVzY3JpcHRvcnMgZGVzY3JpYmVkIGJ5IHRoZSBORkRTIHN0cnVjdHVyZXMgc3RhcnRpbmcgYXQKKyAgIEZEUy4gIElmIFRJTUVPVVQgaXMgbm9uemVybyBhbmQgbm90IC0xLCBhbGxvdyBUSU1FT1VUIG1pbGxpc2Vjb25kcyBmb3IKKyAgIGFuIGV2ZW50IHRvIG9jY3VyOyBpZiBUSU1FT1VUIGlzIC0xLCBibG9jayB1bnRpbCBhbiBldmVudCBvY2N1cnMuCisgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyB3aXRoIGV2ZW50cywgemVybyBpZiB0aW1lZCBvdXQsCisgICBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcG9sbCAoc3RydWN0IHBvbGxmZCAqX19mZHMsIG5mZHNfdCBfX25mZHMsIGludCBfX3RpbWVvdXQpOworCisjaWZkZWYgX19VU0VfR05VCisvKiBMaWtlIHBvbGwsIGJ1dCBiZWZvcmUgd2FpdGluZyB0aGUgdGhyZWFkcyBzaWduYWwgbWFzayBpcyByZXBsYWNlZAorICAgd2l0aCB0aGF0IHNwZWNpZmllZCBpbiB0aGUgZm91cnRoIHBhcmFtZXRlci4gIEZvciBiZXR0ZXIgdXNhYmlsaXR5LAorICAgdGhlIHRpbWVvdXQgdmFsdWUgaXMgc3BlY2lmaWVkIHVzaW5nIGEgVElNRVNQRUMgb2JqZWN0LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcHBvbGwgKHN0cnVjdCBwb2xsZmQgKl9fZmRzLCBuZmRzX3QgX19uZmRzLAorCQkgIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3RpbWVvdXQsCisJCSAgX19jb25zdCBfX3NpZ3NldF90ICpfX3NzKTsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3lzL3BvbGwuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcHJjdGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3ByY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U5YjcyZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3ByY3RsLmgKQEAgLTAsMCArMSwzMiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfUFJDVExfSAorI2RlZmluZSBfU1lTX1BSQ1RMX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmN0bC5oPiAgLyogIFRoZSBtYWdpYyB2YWx1ZXMgY29tZSBmcm9tIGhlcmUgICovCisKK19fQkVHSU5fREVDTFMKKworLyogQ29udHJvbCBwcm9jZXNzIGV4ZWN1dGlvbi4gICovCitleHRlcm4gaW50IHByY3RsIChpbnQgX19vcHRpb24sIC4uLikgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmICAvKiBzeXMvcHJjdGwuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcHJvY2ZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9wcm9jZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGJlNDMzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcHJvY2ZzLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1BST0NGU19ICisjZGVmaW5lIF9TWVNfUFJPQ0ZTX0gJMQorCisvKiBUaGlzIGlzIHNvbWV3aGF0IG1vZGVsbGVkIGFmdGVyIHRoZSBmaWxlIG9mIHRoZSBzYW1lIG5hbWUgb24gU1ZSNAorICAgc3lzdGVtcy4gIEl0IHByb3ZpZGVzIGEgZGVmaW5pdGlvbiBvZiB0aGUgY29yZSBmaWxlIGZvcm1hdCBmb3IgRUxGCisgICB1c2VkIG9uIExpbnV4LiAgSXQgZG9lc24ndCBoYXZlIGFueXRoaW5nIHRvIGRvIHdpdGggdGhlIC9wcm9jIGZpbGUKKyAgIHN5c3RlbSwgZXZlbiB0aG91Z2ggTGludXggaGFzIG9uZS4KKworICAgQW55d2F5LCB0aGUgd2hvbGUgcHVycG9zZSBvZiB0aGlzIGZpbGUgaXMgZm9yIEdEQiBhbmQgR0RCIG9ubHkuCisgICBEb24ndCByZWFkIHRvbyBtdWNoIGludG8gaXQuICBEb24ndCB1c2UgaXQgZm9yIGFueXRoaW5nIG90aGVyIHRoYW4KKyAgIEdEQiB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLiAgKi8KKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdXNlci5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFR5cGUgZm9yIGEgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVyLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBlbGZfZ3JlZ190OworCisvKiBBbmQgdGhlIHdob2xlIGJ1bmNoIG9mIHRoZW0uICBXZSBjb3VsZCBoYXZlIHVzZWQgYHN0cnVjdAorICAgdXNlcl9yZWdzX3N0cnVjdCcgZGlyZWN0bHkgaW4gdGhlIHR5cGVkZWYsIGJ1dCB0cmFkaXRpb24gc2F5cyB0aGF0CisgICB0aGUgcmVnaXN0ZXIgc2V0IGlzIGFuIGFycmF5LCB3aGljaCBkb2VzIGhhdmUgc29tZSBwZWN1bGlhcgorICAgc2VtYW50aWNzLCBzbyBsZWF2ZSBpdCB0aGF0IHdheS4gICovCisjZGVmaW5lIEVMRl9OR1JFRyAoc2l6ZW9mIChzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCkgLyBzaXplb2YoZWxmX2dyZWdfdCkpCit0eXBlZGVmIGVsZl9ncmVnX3QgZWxmX2dyZWdzZXRfdFtFTEZfTkdSRUddOworCisvKiBSZWdpc3RlciBzZXQgZm9yIHRoZSBmbG9hdGluZy1wb2ludCByZWdpc3RlcnMuICAqLwordHlwZWRlZiBzdHJ1Y3QgdXNlcl9mcHJlZ3Nfc3RydWN0IGVsZl9mcHJlZ3NldF90OworCisvKiBSZWdpc3RlciBzZXQgZm9yIHRoZSBleHRlbmRlZCBmbG9hdGluZy1wb2ludCByZWdpc3RlcnMuICBJbmNsdWRlcworICAgdGhlIFBlbnRpdW0gSUlJIFNTRSByZWdpc3RlcnMgaW4gYWRkaXRpb24gdG8gdGhlIGNsYXNzaWMKKyAgIGZsb2F0aW5nLXBvaW50IHN0dWZmLiAgKi8KK3R5cGVkZWYgc3RydWN0IHVzZXJfZnB4cmVnc19zdHJ1Y3QgZWxmX2ZweHJlZ3NldF90OworCisKKy8qIFNpZ25hbCBpbmZvLiAgKi8KK3N0cnVjdCBlbGZfc2lnaW5mbworICB7CisgICAgaW50IHNpX3NpZ25vOwkJCS8qIFNpZ25hbCBudW1iZXIuICAqLworICAgIGludCBzaV9jb2RlOwkJCS8qIEV4dHJhIGNvZGUuICAqLworICAgIGludCBzaV9lcnJubzsJCQkvKiBFcnJuby4gICovCisgIH07CisKKworLyogRGVmaW5pdGlvbnMgdG8gZ2VuZXJhdGUgSW50ZWwgU1ZSNC1saWtlIGNvcmUgZmlsZXMuICBUaGVzZSBtb3N0bHkKKyAgIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIFNWUjQgdHlwZXMgd2l0aCAiZWxmXyIgdGFja2VkIG9uIHRoZQorICAgZnJvbnQgdG8gcHJldmVudCBjbGFzaGVzIHdpdGggTGludXggZGVmaW5pdGlvbnMsIGFuZCB0aGUgdHlwZWRlZgorICAgZm9ybXMgaGF2ZSBiZWVuIGF2b2lkZWQuICBUaGlzIGlzIG1vc3RseSBsaWtlIHRoZSBTVlI0IHN0cnVjdHVyZSwKKyAgIGJ1dCBtb3JlIExpbnV4eSwgd2l0aCB0aGluZ3MgdGhhdCBMaW51eCBkb2VzIG5vdCBzdXBwb3J0IGFuZCB3aGljaAorICAgR0RCIGRvZXNuJ3QgcmVhbGx5IHVzZSBleGNsdWRlZC4gICovCisKK3N0cnVjdCBlbGZfcHJzdGF0dXMKKyAgeworICAgIHN0cnVjdCBlbGZfc2lnaW5mbyBwcl9pbmZvOwkJLyogSW5mbyBhc3NvY2lhdGVkIHdpdGggc2lnbmFsLiAgKi8KKyAgICBzaG9ydCBpbnQgcHJfY3Vyc2lnOwkJLyogQ3VycmVudCBzaWduYWwuICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHByX3NpZ3BlbmQ7CS8qIFNldCBvZiBwZW5kaW5nIHNpZ25hbHMuICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHByX3NpZ2hvbGQ7CS8qIFNldCBvZiBoZWxkIHNpZ25hbHMuICAqLworICAgIF9fcGlkX3QgcHJfcGlkOworICAgIF9fcGlkX3QgcHJfcHBpZDsKKyAgICBfX3BpZF90IHByX3BncnA7CisgICAgX19waWRfdCBwcl9zaWQ7CisgICAgc3RydWN0IHRpbWV2YWwgcHJfdXRpbWU7CQkvKiBVc2VyIHRpbWUuICAqLworICAgIHN0cnVjdCB0aW1ldmFsIHByX3N0aW1lOwkJLyogU3lzdGVtIHRpbWUuICAqLworICAgIHN0cnVjdCB0aW1ldmFsIHByX2N1dGltZTsJCS8qIEN1bXVsYXRpdmUgdXNlciB0aW1lLiAgKi8KKyAgICBzdHJ1Y3QgdGltZXZhbCBwcl9jc3RpbWU7CQkvKiBDdW11bGF0aXZlIHN5c3RlbSB0aW1lLiAgKi8KKyAgICBlbGZfZ3JlZ3NldF90IHByX3JlZzsJCS8qIEdQIHJlZ2lzdGVycy4gICovCisgICAgaW50IHByX2ZwdmFsaWQ7CQkJLyogVHJ1ZSBpZiBtYXRoIGNvcHJvIGJlaW5nIHVzZWQuICAqLworICB9OworCisKKyNkZWZpbmUgRUxGX1BSQVJHU1ogICAgICg4MCkgICAgLyogTnVtYmVyIG9mIGNoYXJzIGZvciBhcmdzLiAgKi8KKworc3RydWN0IGVsZl9wcnBzaW5mbworICB7CisgICAgY2hhciBwcl9zdGF0ZTsJCQkvKiBOdW1lcmljIHByb2Nlc3Mgc3RhdGUuICAqLworICAgIGNoYXIgcHJfc25hbWU7CQkJLyogQ2hhciBmb3IgcHJfc3RhdGUuICAqLworICAgIGNoYXIgcHJfem9tYjsJCQkvKiBab21iaWUuICAqLworICAgIGNoYXIgcHJfbmljZTsJCQkvKiBOaWNlIHZhbC4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgcHJfZmxhZzsJCS8qIEZsYWdzLiAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgcHJfdWlkOworICAgIHVuc2lnbmVkIHNob3J0IGludCBwcl9naWQ7CisgICAgaW50IHByX3BpZCwgcHJfcHBpZCwgcHJfcGdycCwgcHJfc2lkOworICAgIC8qIExvdHMgbWlzc2luZyAqLworICAgIGNoYXIgcHJfZm5hbWVbMTZdOwkJCS8qIEZpbGVuYW1lIG9mIGV4ZWN1dGFibGUuICAqLworICAgIGNoYXIgcHJfcHNhcmdzW0VMRl9QUkFSR1NaXTsJLyogSW5pdGlhbCBwYXJ0IG9mIGFyZyBsaXN0LiAgKi8KKyAgfTsKKworCisvKiBUaGUgcmVzdCBvZiB0aGlzIGZpbGUgcHJvdmlkZXMgdGhlIHR5cGVzIGZvciBlbXVsYXRpb24gb2YgdGhlCisgICBTb2xhcmlzIDxwcm9jX3NlcnZpY2UuaD4gaW50ZXJmYWNlcyB0aGF0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieQorICAgdXNlcnMgb2YgbGlidGhyZWFkX2RiLiAgKi8KKworLyogQWRkcmVzc2VzLiAgKi8KK3R5cGVkZWYgdm9pZCAqcHNhZGRyX3Q7CisKKy8qIFJlZ2lzdGVyIHNldHMuICBMaW51eCBoYXMgZGlmZmVyZW50IG5hbWVzLiAgKi8KK3R5cGVkZWYgZWxmX2dyZWdzZXRfdCBwcmdyZWdzZXRfdDsKK3R5cGVkZWYgZWxmX2ZwcmVnc2V0X3QgcHJmcHJlZ3NldF90OworCisvKiBXZSBkb24ndCBoYXZlIGFueSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHByb2Nlc3NlcyBhbmQgdGhyZWFkcywKKyAgIHRoZXJlZm9yZSBoYXZlIG9ubHkgb25lIFBJRCB0eXBlLiAgKi8KK3R5cGVkZWYgX19waWRfdCBsd3BpZF90OworCisvKiBQcm9jZXNzIHN0YXR1cyBhbmQgaW5mby4gIEluIHRoZSBlbmQgd2UgZG8gcHJvdmlkZSB0eXBlZGVmcyBmb3IgdGhlbS4gICovCit0eXBlZGVmIHN0cnVjdCBlbGZfcHJzdGF0dXMgcHJzdGF0dXNfdDsKK3R5cGVkZWYgc3RydWN0IGVsZl9wcnBzaW5mbyBwcnBzaW5mb190OworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3lzL3Byb2Nmcy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9wcm9maWwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3Byb2ZpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDhlYzcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9wcm9maWwuaApAQCAtMCwwICsxLDYxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1BST0ZJTF9ICisjZGVmaW5lIF9QUk9GSUxfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogVGhpcyBpbnRlcmZhY2UgaXMgaW50ZW5kZWQgdG8gZm9sbG93IHRoZSBzcHJvZmlsKCkgc3lzdGVtIGNhbGxzIGFzCisgICBkZXNjcmliZWQgYnkgdGhlIHNwcm9maWwoMikgbWFuIHBhZ2Ugb2YgSXJpeCB2Ni41LCBleGNlcHQgdGhhdDoKKworCS0gdGhlcmUgaXMgbm8gYSBwcmlvcmkgbGltaXQgb24gbnVtYmVyIG9mIHRleHQgc2VjdGlvbnMKKwktIHByX3NjYWxlIGlzIGRlY2xhcmVkIGFzIHVuc2lnbmVkIGxvbmcgKGluc3RlYWQgb2YgInVuc2lnbmVkIGludCIpCisJLSBwcl9zaXplIGlzIGRlY2xhcmVkIGFzIHNpemVfdCAoaW5zdGVhZCBvZiAidW5zaWduZWQgaW50IikKKwktIHByX29mZiBpcyBkZWNsYXJlZCBhcyB2b2lkICogKGluc3RlYWQgb2YgIl9fcHN1bnNpZ25lZF90IikKKwktIHRoZSBvdmVyZmxvdyBiaW4gKHByX2Jhc2U9PTAsIHByX3NjYWxlPT0yKSBjYW4gYXBwZWFyIGFueXdoZXJlCisJICBpbiB0aGUgcHJvZnAgYXJyYXkKKwktIFBST0ZfRkFTVCBoYXMgbm8gZWZmZWN0ICAqLworCitzdHJ1Y3QgcHJvZgorICB7CisgICAgdm9pZCAqcHJfYmFzZTsJCS8qIGJ1ZmZlciBiYXNlICovCisgICAgc2l6ZV90IHByX3NpemU7CQkvKiBidWZmZXIgc2l6ZSAqLworICAgIHNpemVfdCBwcl9vZmY7CQkvKiBwYyBvZmZzZXQgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBwcl9zY2FsZTsJLyogcGMgc2NhbGluZyAoZml4ZWQtcG9pbnQgbnVtYmVyKSAqLworICB9OworCitlbnVtCisgIHsKKyAgICBQUk9GX1VTSE9SVAk9IDAsCQkvKiB1c2UgMTYtYml0IGNvdW50ZXJzIChkZWZhdWx0KSAqLworICAgIFBST0ZfVUlOVAk9IDEgPDwgMCwJLyogdXNlIDMyLWJpdCBjb3VudGVycyAqLworICAgIFBST0ZfRkFTVCAgID0gMSA8PCAxCS8qIHByb2ZpbGUgZmFzdGVyIHRoYW4gdXN1YWwgKi8KKyAgfTsKKworCitfX0JFR0lOX0RFQ0xTCisKK2V4dGVybiBpbnQgc3Byb2ZpbCAoc3RydWN0IHByb2YgKl9fcHJvZnAsIGludCBfX3Byb2ZjbnQsCisJCSAgICBzdHJ1Y3QgdGltZXZhbCAqX190dnAsIHVuc2lnbmVkIGludCBfX2ZsYWdzKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcHJvZmlsLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3B0cmFjZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcHRyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwZjI5NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3B0cmFjZS5oCkBAIC0wLDAgKzEsMTk2IEBACisvKiBgcHRyYWNlJyBkZWJ1Z2dlciBzdXBwb3J0IGludGVyZmFjZS4gIExpbnV4IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSwyMDAwLDIwMDYsMjAwNywyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfUFRSQUNFX0gKKyNkZWZpbmUgX1NZU19QVFJBQ0VfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFR5cGUgb2YgdGhlIFJFUVVFU1QgYXJndW1lbnQgdG8gYHB0cmFjZS4nICAqLworZW51bSBfX3B0cmFjZV9yZXF1ZXN0Cit7CisgIC8qIEluZGljYXRlIHRoYXQgdGhlIHByb2Nlc3MgbWFraW5nIHRoaXMgcmVxdWVzdCBzaG91bGQgYmUgdHJhY2VkLgorICAgICBBbGwgc2lnbmFscyByZWNlaXZlZCBieSB0aGlzIHByb2Nlc3MgY2FuIGJlIGludGVyY2VwdGVkIGJ5IGl0cworICAgICBwYXJlbnQsIGFuZCBpdHMgcGFyZW50IGNhbiB1c2UgdGhlIG90aGVyIGBwdHJhY2UnIHJlcXVlc3RzLiAgKi8KKyAgUFRSQUNFX1RSQUNFTUUgPSAwLAorI2RlZmluZSBQVF9UUkFDRV9NRSBQVFJBQ0VfVFJBQ0VNRQorCisgIC8qIFJldHVybiB0aGUgd29yZCBpbiB0aGUgcHJvY2VzcydzIHRleHQgc3BhY2UgYXQgYWRkcmVzcyBBRERSLiAgKi8KKyAgUFRSQUNFX1BFRUtURVhUID0gMSwKKyNkZWZpbmUgUFRfUkVBRF9JIFBUUkFDRV9QRUVLVEVYVAorCisgIC8qIFJldHVybiB0aGUgd29yZCBpbiB0aGUgcHJvY2VzcydzIGRhdGEgc3BhY2UgYXQgYWRkcmVzcyBBRERSLiAgKi8KKyAgUFRSQUNFX1BFRUtEQVRBID0gMiwKKyNkZWZpbmUgUFRfUkVBRF9EIFBUUkFDRV9QRUVLREFUQQorCisgIC8qIFJldHVybiB0aGUgd29yZCBpbiB0aGUgcHJvY2VzcydzIHVzZXIgYXJlYSBhdCBvZmZzZXQgQUREUi4gICovCisgIFBUUkFDRV9QRUVLVVNFUiA9IDMsCisjZGVmaW5lIFBUX1JFQURfVSBQVFJBQ0VfUEVFS1VTRVIKKworICAvKiBXcml0ZSB0aGUgd29yZCBEQVRBIGludG8gdGhlIHByb2Nlc3MncyB0ZXh0IHNwYWNlIGF0IGFkZHJlc3MgQUREUi4gICovCisgIFBUUkFDRV9QT0tFVEVYVCA9IDQsCisjZGVmaW5lIFBUX1dSSVRFX0kgUFRSQUNFX1BPS0VURVhUCisKKyAgLyogV3JpdGUgdGhlIHdvcmQgREFUQSBpbnRvIHRoZSBwcm9jZXNzJ3MgZGF0YSBzcGFjZSBhdCBhZGRyZXNzIEFERFIuICAqLworICBQVFJBQ0VfUE9LRURBVEEgPSA1LAorI2RlZmluZSBQVF9XUklURV9EIFBUUkFDRV9QT0tFREFUQQorCisgIC8qIFdyaXRlIHRoZSB3b3JkIERBVEEgaW50byB0aGUgcHJvY2VzcydzIHVzZXIgYXJlYSBhdCBvZmZzZXQgQUREUi4gICovCisgIFBUUkFDRV9QT0tFVVNFUiA9IDYsCisjZGVmaW5lIFBUX1dSSVRFX1UgUFRSQUNFX1BPS0VVU0VSCisKKyAgLyogQ29udGludWUgdGhlIHByb2Nlc3MuICAqLworICBQVFJBQ0VfQ09OVCA9IDcsCisjZGVmaW5lIFBUX0NPTlRJTlVFIFBUUkFDRV9DT05UCisKKyAgLyogS2lsbCB0aGUgcHJvY2Vzcy4gICovCisgIFBUUkFDRV9LSUxMID0gOCwKKyNkZWZpbmUgUFRfS0lMTCBQVFJBQ0VfS0lMTAorCisgIC8qIFNpbmdsZSBzdGVwIHRoZSBwcm9jZXNzLgorICAgICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgb24gYWxsIG1hY2hpbmVzLiAgKi8KKyAgUFRSQUNFX1NJTkdMRVNURVAgPSA5LAorI2RlZmluZSBQVF9TVEVQIFBUUkFDRV9TSU5HTEVTVEVQCisKKyAgLyogR2V0IGFsbCBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIHVzZWQgYnkgYSBwcm9jZXNzZXMuCisgICAgIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBvbiBhbGwgbWFjaGluZXMuICAqLworICAgUFRSQUNFX0dFVFJFR1MgPSAxMiwKKyNkZWZpbmUgUFRfR0VUUkVHUyBQVFJBQ0VfR0VUUkVHUworCisgIC8qIFNldCBhbGwgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyB1c2VkIGJ5IGEgcHJvY2Vzc2VzLgorICAgICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgb24gYWxsIG1hY2hpbmVzLiAgKi8KKyAgIFBUUkFDRV9TRVRSRUdTID0gMTMsCisjZGVmaW5lIFBUX1NFVFJFR1MgUFRSQUNFX1NFVFJFR1MKKworICAvKiBHZXQgYWxsIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyB1c2VkIGJ5IGEgcHJvY2Vzc2VzLgorICAgICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgb24gYWxsIG1hY2hpbmVzLiAgKi8KKyAgIFBUUkFDRV9HRVRGUFJFR1MgPSAxNCwKKyNkZWZpbmUgUFRfR0VURlBSRUdTIFBUUkFDRV9HRVRGUFJFR1MKKworICAvKiBTZXQgYWxsIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyB1c2VkIGJ5IGEgcHJvY2Vzc2VzLgorICAgICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgb24gYWxsIG1hY2hpbmVzLiAgKi8KKyAgIFBUUkFDRV9TRVRGUFJFR1MgPSAxNSwKKyNkZWZpbmUgUFRfU0VURlBSRUdTIFBUUkFDRV9TRVRGUFJFR1MKKworICAvKiBBdHRhY2ggdG8gYSBwcm9jZXNzIHRoYXQgaXMgYWxyZWFkeSBydW5uaW5nLiAqLworICBQVFJBQ0VfQVRUQUNIID0gMTYsCisjZGVmaW5lIFBUX0FUVEFDSCBQVFJBQ0VfQVRUQUNICisKKyAgLyogRGV0YWNoIGZyb20gYSBwcm9jZXNzIGF0dGFjaGVkIHRvIHdpdGggUFRSQUNFX0FUVEFDSC4gICovCisgIFBUUkFDRV9ERVRBQ0ggPSAxNywKKyNkZWZpbmUgUFRfREVUQUNIIFBUUkFDRV9ERVRBQ0gKKworICAvKiBHZXQgYWxsIGV4dGVuZGVkIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyB1c2VkIGJ5IGEgcHJvY2Vzc2VzLgorICAgICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgb24gYWxsIG1hY2hpbmVzLiAgKi8KKyAgIFBUUkFDRV9HRVRGUFhSRUdTID0gMTgsCisjZGVmaW5lIFBUX0dFVEZQWFJFR1MgUFRSQUNFX0dFVEZQWFJFR1MKKworICAvKiBTZXQgYWxsIGV4dGVuZGVkIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyB1c2VkIGJ5IGEgcHJvY2Vzc2VzLgorICAgICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgb24gYWxsIG1hY2hpbmVzLiAgKi8KKyAgIFBUUkFDRV9TRVRGUFhSRUdTID0gMTksCisjZGVmaW5lIFBUX1NFVEZQWFJFR1MgUFRSQUNFX1NFVEZQWFJFR1MKKworICAvKiBDb250aW51ZSBhbmQgc3RvcCBhdCB0aGUgbmV4dCAocmV0dXJuIGZyb20pIHN5c2NhbGwuICAqLworICBQVFJBQ0VfU1lTQ0FMTCA9IDI0LAorI2RlZmluZSBQVF9TWVNDQUxMIFBUUkFDRV9TWVNDQUxMCisKKyAgLyogU2V0IHB0cmFjZSBmaWx0ZXIgb3B0aW9ucy4gICovCisgIFBUUkFDRV9TRVRPUFRJT05TID0gMHg0MjAwLAorI2RlZmluZSBQVF9TRVRPUFRJT05TIFBUUkFDRV9TRVRPUFRJT05TCisKKyAgLyogR2V0IGxhc3QgcHRyYWNlIG1lc3NhZ2UuICAqLworICBQVFJBQ0VfR0VURVZFTlRNU0cgPSAweDQyMDEsCisjZGVmaW5lIFBUX0dFVEVWRU5UTVNHIFBUUkFDRV9HRVRFVkVOVE1TRworCisgIC8qIEdldCBzaWdpbmZvIGZvciBwcm9jZXNzLiAgKi8KKyAgUFRSQUNFX0dFVFNJR0lORk8gPSAweDQyMDIsCisjZGVmaW5lIFBUX0dFVFNJR0lORk8gUFRSQUNFX0dFVFNJR0lORk8KKworICAvKiBTZXQgbmV3IHNpZ2luZm8gZm9yIHByb2Nlc3MuICAqLworICBQVFJBQ0VfU0VUU0lHSU5GTyA9IDB4NDIwMywKKyNkZWZpbmUgUFRfU0VUU0lHSU5GTyBQVFJBQ0VfU0VUU0lHSU5GTworCisgIC8qIEdldCByZWdpc3RlciBjb250ZW50LiAgKi8KKyAgUFRSQUNFX0dFVFJFR1NFVCA9IDB4NDIwNCwKKyNkZWZpbmUgUFRSQUNFX0dFVFJFR1NFVCBQVFJBQ0VfR0VUUkVHU0VUCisKKyAgLyogU2V0IHJlZ2lzdGVyIGNvbnRlbnQuICAqLworICBQVFJBQ0VfU0VUUkVHU0VUID0gMHg0MjA1LAorI2RlZmluZSBQVFJBQ0VfU0VUUkVHU0VUIFBUUkFDRV9TRVRSRUdTRVQKKworICAvKiBMaWtlIFBUUkFDRV9BVFRBQ0gsIGJ1dCBkbyBub3QgZm9yY2UgdHJhY2VlIHRvIHRyYXAgYW5kIGRvIG5vdCBhZmZlY3QKKyAgICAgc2lnbmFsIG9yIGdyb3VwIHN0b3Agc3RhdGUuICAqLworICBQVFJBQ0VfU0VJWkUgPSAweDQyMDYsCisjZGVmaW5lIFBUUkFDRV9TRUlaRSBQVFJBQ0VfU0VJWkUKKworICAvKiBUcmFwIHNlaXplZCB0cmFjZWUuICAqLworICBQVFJBQ0VfSU5URVJSVVBUID0gMHg0MjA3LAorI2RlZmluZSBQVFJBQ0VfSU5URVJSVVBUIFBUUkFDRV9JTlRFUlJVUFQKKworICAvKiBXYWl0IGZvciBuZXh0IGdyb3VwIGV2ZW50LiAgKi8KKyAgUFRSQUNFX0xJU1RFTiA9IDB4NDIwOAorfTsKKworCisvKiBGbGFnIGZvciBQVFJBQ0VfTElTVEVOLiAgKi8KK2VudW0gX19wdHJhY2VfZmxhZ3MKK3sKKyAgUFRSQUNFX1NFSVpFX0RFVkVMID0gMHg4MDAwMDAwMAorfTsKKworLyogT3B0aW9ucyBzZXQgdXNpbmcgUFRSQUNFX1NFVE9QVElPTlMuICAqLworZW51bSBfX3B0cmFjZV9zZXRvcHRpb25zCit7CisgIFBUUkFDRV9PX1RSQUNFU1lTR09PRAk9IDB4MDAwMDAwMDEsCisgIFBUUkFDRV9PX1RSQUNFRk9SSwk9IDB4MDAwMDAwMDIsCisgIFBUUkFDRV9PX1RSQUNFVkZPUksgICA9IDB4MDAwMDAwMDQsCisgIFBUUkFDRV9PX1RSQUNFQ0xPTkUJPSAweDAwMDAwMDA4LAorICBQVFJBQ0VfT19UUkFDRUVYRUMJPSAweDAwMDAwMDEwLAorICBQVFJBQ0VfT19UUkFDRVZGT1JLRE9ORSA9IDB4MDAwMDAwMjAsCisgIFBUUkFDRV9PX1RSQUNFRVhJVAk9IDB4MDAwMDAwNDAsCisgIFBUUkFDRV9PX01BU0sJCT0gMHgwMDAwMDA3ZgorfTsKKworLyogV2FpdCBleHRlbmRlZCByZXN1bHQgY29kZXMgZm9yIHRoZSBhYm92ZSB0cmFjZSBvcHRpb25zLiAgKi8KK2VudW0gX19wdHJhY2VfZXZlbnRjb2RlcworeworICBQVFJBQ0VfRVZFTlRfRk9SSwk9IDEsCisgIFBUUkFDRV9FVkVOVF9WRk9SSwk9IDIsCisgIFBUUkFDRV9FVkVOVF9DTE9ORQk9IDMsCisgIFBUUkFDRV9FVkVOVF9FWEVDCT0gNCwKKyAgUFRSQUNFX0VWRU5UX1ZGT1JLX0RPTkUgPSA1LAorICBQVFJBQ0VfRVZFTlRfRVhJVAk9IDYKK307CisKKy8qIFBlcmZvcm0gcHJvY2VzcyB0cmFjaW5nIGZ1bmN0aW9ucy4gIFJFUVVFU1QgaXMgb25lIG9mIHRoZSB2YWx1ZXMKKyAgIGFib3ZlLCBhbmQgZGV0ZXJtaW5lcyB0aGUgYWN0aW9uIHRvIGJlIHRha2VuLgorICAgRm9yIGFsbCByZXF1ZXN0cyBleGNlcHQgUFRSQUNFX1RSQUNFTUUsIFBJRCBzcGVjaWZpZXMgdGhlIHByb2Nlc3MgdG8gYmUKKyAgIHRyYWNlZC4KKworICAgUElEIGFuZCB0aGUgb3RoZXIgYXJndW1lbnRzIGRlc2NyaWJlZCBhYm92ZSBmb3IgdGhlIHZhcmlvdXMgcmVxdWVzdHMgc2hvdWxkCisgICBhcHBlYXIgKHRob3NlIHRoYXQgYXJlIHVzZWQgZm9yIHRoZSBwYXJ0aWN1bGFyIHJlcXVlc3QpIGFzOgorICAgICBwaWRfdCBQSUQsIHZvaWQgKkFERFIsIGludCBEQVRBLCB2b2lkICpBRERSMgorICAgYWZ0ZXIgUkVRVUVTVC4gICovCitleHRlcm4gbG9uZyBpbnQgcHRyYWNlIChlbnVtIF9fcHRyYWNlX3JlcXVlc3QgX19yZXF1ZXN0LCAuLi4pIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfU1lTX1BUUkFDRV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9xdWV1ZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWY0NTUzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcXVldWUuaApAQCAtMCwwICsxLDU3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylxdWV1ZS5oCTguNSAoQmVya2VsZXkpIDgvMjAvOTQKKyAqLworCisjaWZuZGVmCV9TWVNfUVVFVUVfSF8KKyNkZWZpbmUJX1NZU19RVUVVRV9IXworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgZml2ZSB0eXBlcyBvZiBkYXRhIHN0cnVjdHVyZXM6IHNpbmdseS1saW5rZWQgbGlzdHMsCisgKiBsaXN0cywgc2ltcGxlIHF1ZXVlcywgdGFpbCBxdWV1ZXMsIGFuZCBjaXJjdWxhciBxdWV1ZXMuCisgKgorICogQSBzaW5nbHktbGlua2VkIGxpc3QgaXMgaGVhZGVkIGJ5IGEgc2luZ2xlIGZvcndhcmQgcG9pbnRlci4gVGhlCisgKiBlbGVtZW50cyBhcmUgc2luZ2x5IGxpbmtlZCBmb3IgbWluaW11bSBzcGFjZSBhbmQgcG9pbnRlciBtYW5pcHVsYXRpb24KKyAqIG92ZXJoZWFkIGF0IHRoZSBleHBlbnNlIG9mIE8obikgcmVtb3ZhbCBmb3IgYXJiaXRyYXJ5IGVsZW1lbnRzLiBOZXcKKyAqIGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBhZnRlciBhbiBleGlzdGluZyBlbGVtZW50IG9yIGF0IHRoZQorICogaGVhZCBvZiB0aGUgbGlzdC4gIEVsZW1lbnRzIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgaGVhZCBvZiB0aGUgbGlzdAorICogc2hvdWxkIHVzZSB0aGUgZXhwbGljaXQgbWFjcm8gZm9yIHRoaXMgcHVycG9zZSBmb3Igb3B0aW11bQorICogZWZmaWNpZW5jeS4gQSBzaW5nbHktbGlua2VkIGxpc3QgbWF5IG9ubHkgYmUgdHJhdmVyc2VkIGluIHRoZSBmb3J3YXJkCisgKiBkaXJlY3Rpb24uICBTaW5nbHktbGlua2VkIGxpc3RzIGFyZSBpZGVhbCBmb3IgYXBwbGljYXRpb25zIHdpdGggbGFyZ2UKKyAqIGRhdGFzZXRzIGFuZCBmZXcgb3Igbm8gcmVtb3ZhbHMgb3IgZm9yIGltcGxlbWVudGluZyBhIExJRk8gcXVldWUuCisgKgorICogQSBsaXN0IGlzIGhlYWRlZCBieSBhIHNpbmdsZSBmb3J3YXJkIHBvaW50ZXIgKG9yIGFuIGFycmF5IG9mIGZvcndhcmQKKyAqIHBvaW50ZXJzIGZvciBhIGhhc2ggdGFibGUgaGVhZGVyKS4gVGhlIGVsZW1lbnRzIGFyZSBkb3VibHkgbGlua2VkCisgKiBzbyB0aGF0IGFuIGFyYml0cmFyeSBlbGVtZW50IGNhbiBiZSByZW1vdmVkIHdpdGhvdXQgYSBuZWVkIHRvCisgKiB0cmF2ZXJzZSB0aGUgbGlzdC4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBiZWZvcmUKKyAqIG9yIGFmdGVyIGFuIGV4aXN0aW5nIGVsZW1lbnQgb3IgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuIEEgbGlzdAorICogbWF5IG9ubHkgYmUgdHJhdmVyc2VkIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbi4KKyAqCisgKiBBIHNpbXBsZSBxdWV1ZSBpcyBoZWFkZWQgYnkgYSBwYWlyIG9mIHBvaW50ZXJzLCBvbmUgdGhlIGhlYWQgb2YgdGhlCisgKiBsaXN0IGFuZCB0aGUgb3RoZXIgdG8gdGhlIHRhaWwgb2YgdGhlIGxpc3QuIFRoZSBlbGVtZW50cyBhcmUgc2luZ2x5CisgKiBsaW5rZWQgdG8gc2F2ZSBzcGFjZSwgc28gZWxlbWVudHMgY2FuIG9ubHkgYmUgcmVtb3ZlZCBmcm9tIHRoZQorICogaGVhZCBvZiB0aGUgbGlzdC4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBhZnRlcgorICogYW4gZXhpc3RpbmcgZWxlbWVudCwgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIG9yIGF0IHRoZSBlbmQgb2YgdGhlCisgKiBsaXN0LiBBIHNpbXBsZSBxdWV1ZSBtYXkgb25seSBiZSB0cmF2ZXJzZWQgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLgorICoKKyAqIEEgdGFpbCBxdWV1ZSBpcyBoZWFkZWQgYnkgYSBwYWlyIG9mIHBvaW50ZXJzLCBvbmUgdG8gdGhlIGhlYWQgb2YgdGhlCisgKiBsaXN0IGFuZCB0aGUgb3RoZXIgdG8gdGhlIHRhaWwgb2YgdGhlIGxpc3QuIFRoZSBlbGVtZW50cyBhcmUgZG91Ymx5CisgKiBsaW5rZWQgc28gdGhhdCBhbiBhcmJpdHJhcnkgZWxlbWVudCBjYW4gYmUgcmVtb3ZlZCB3aXRob3V0IGEgbmVlZCB0bworICogdHJhdmVyc2UgdGhlIGxpc3QuIE5ldyBlbGVtZW50cyBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3QgYmVmb3JlIG9yCisgKiBhZnRlciBhbiBleGlzdGluZyBlbGVtZW50LCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgb3IgYXQgdGhlIGVuZCBvZgorICogdGhlIGxpc3QuIEEgdGFpbCBxdWV1ZSBtYXkgYmUgdHJhdmVyc2VkIGluIGVpdGhlciBkaXJlY3Rpb24uCisgKgorICogQSBjaXJjbGUgcXVldWUgaXMgaGVhZGVkIGJ5IGEgcGFpciBvZiBwb2ludGVycywgb25lIHRvIHRoZSBoZWFkIG9mIHRoZQorICogbGlzdCBhbmQgdGhlIG90aGVyIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0LiBUaGUgZWxlbWVudHMgYXJlIGRvdWJseQorICogbGlua2VkIHNvIHRoYXQgYW4gYXJiaXRyYXJ5IGVsZW1lbnQgY2FuIGJlIHJlbW92ZWQgd2l0aG91dCBhIG5lZWQgdG8KKyAqIHRyYXZlcnNlIHRoZSBsaXN0LiBOZXcgZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGJlZm9yZSBvciBhZnRlcgorICogYW4gZXhpc3RpbmcgZWxlbWVudCwgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIG9yIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCisgKiBBIGNpcmNsZSBxdWV1ZSBtYXkgYmUgdHJhdmVyc2VkIGluIGVpdGhlciBkaXJlY3Rpb24sIGJ1dCBoYXMgYSBtb3JlCisgKiBjb21wbGV4IGVuZCBvZiBsaXN0IGRldGVjdGlvbi4KKyAqCisgKiBGb3IgZGV0YWlscyBvbiB0aGUgdXNlIG9mIHRoZXNlIG1hY3Jvcywgc2VlIHRoZSBxdWV1ZSgzKSBtYW51YWwgcGFnZS4KKyAqLworCisvKgorICogTGlzdCBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZQlMSVNUX0hFQUQobmFtZSwgdHlwZSkJCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKmxoX2ZpcnN0OwkvKiBmaXJzdCBlbGVtZW50ICovCQkJXAorfQorCisjZGVmaW5lCUxJU1RfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgTlVMTCB9CisKKyNkZWZpbmUJTElTVF9FTlRSWSh0eXBlKQkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKmxlX25leHQ7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKKwlzdHJ1Y3QgdHlwZSAqKmxlX3ByZXY7CS8qIGFkZHJlc3Mgb2YgcHJldmlvdXMgbmV4dCBlbGVtZW50ICovCVwKK30KKworLyoKKyAqIExpc3QgZnVuY3Rpb25zLgorICovCisjZGVmaW5lCUxJU1RfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAorCShoZWFkKS0+bGhfZmlyc3QgPSBOVUxMOwkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJTElTVF9JTlNFUlRfQUZURVIobGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKChlbG0pLT5maWVsZC5sZV9uZXh0ID0gKGxpc3RlbG0pLT5maWVsZC5sZV9uZXh0KSAhPSBOVUxMKQlcCisJCShsaXN0ZWxtKS0+ZmllbGQubGVfbmV4dC0+ZmllbGQubGVfcHJldiA9CQlcCisJCSAgICAmKGVsbSktPmZpZWxkLmxlX25leHQ7CQkJCVwKKwkobGlzdGVsbSktPmZpZWxkLmxlX25leHQgPSAoZWxtKTsJCQkJXAorCShlbG0pLT5maWVsZC5sZV9wcmV2ID0gJihsaXN0ZWxtKS0+ZmllbGQubGVfbmV4dDsJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCUxJU1RfSU5TRVJUX0JFRk9SRShsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC5sZV9wcmV2ID0gKGxpc3RlbG0pLT5maWVsZC5sZV9wcmV2OwkJXAorCShlbG0pLT5maWVsZC5sZV9uZXh0ID0gKGxpc3RlbG0pOwkJCQlcCisJKihsaXN0ZWxtKS0+ZmllbGQubGVfcHJldiA9IChlbG0pOwkJCQlcCisJKGxpc3RlbG0pLT5maWVsZC5sZV9wcmV2ID0gJihlbG0pLT5maWVsZC5sZV9uZXh0OwkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJTElTVF9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoKChlbG0pLT5maWVsZC5sZV9uZXh0ID0gKGhlYWQpLT5saF9maXJzdCkgIT0gTlVMTCkJCVwKKwkJKGhlYWQpLT5saF9maXJzdC0+ZmllbGQubGVfcHJldiA9ICYoZWxtKS0+ZmllbGQubGVfbmV4dDtcCisJKGhlYWQpLT5saF9maXJzdCA9IChlbG0pOwkJCQkJXAorCShlbG0pLT5maWVsZC5sZV9wcmV2ID0gJihoZWFkKS0+bGhfZmlyc3Q7CQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJTElTVF9SRU1PVkUoZWxtLCBmaWVsZCkgZG8gewkJCQkJXAorCWlmICgoZWxtKS0+ZmllbGQubGVfbmV4dCAhPSBOVUxMKQkJCQlcCisJCShlbG0pLT5maWVsZC5sZV9uZXh0LT5maWVsZC5sZV9wcmV2ID0gCQkJXAorCQkgICAgKGVsbSktPmZpZWxkLmxlX3ByZXY7CQkJCVwKKwkqKGVsbSktPmZpZWxkLmxlX3ByZXYgPSAoZWxtKS0+ZmllbGQubGVfbmV4dDsJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlMSVNUX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJCVwKKwlmb3IgKCh2YXIpID0gKChoZWFkKS0+bGhfZmlyc3QpOwkJCQlcCisJCSh2YXIpOwkJCQkJCQlcCisJCSh2YXIpID0gKCh2YXIpLT5maWVsZC5sZV9uZXh0KSkKKworLyoKKyAqIExpc3QgYWNjZXNzIG1ldGhvZHMuCisgKi8KKyNkZWZpbmUJTElTVF9FTVBUWShoZWFkKQkJKChoZWFkKS0+bGhfZmlyc3QgPT0gTlVMTCkKKyNkZWZpbmUJTElTVF9GSVJTVChoZWFkKQkJKChoZWFkKS0+bGhfZmlyc3QpCisjZGVmaW5lCUxJU1RfTkVYVChlbG0sIGZpZWxkKQkJKChlbG0pLT5maWVsZC5sZV9uZXh0KQorCisKKy8qCisgKiBTaW5nbHktbGlua2VkIExpc3QgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUJU0xJU1RfSEVBRChuYW1lLCB0eXBlKQkJCQkJCVwKK3N0cnVjdCBuYW1lIHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc2xoX2ZpcnN0OwkvKiBmaXJzdCBlbGVtZW50ICovCQkJXAorfQorCisjZGVmaW5lCVNMSVNUX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJCVwKKwl7IE5VTEwgfQorCisjZGVmaW5lCVNMSVNUX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc2xlX25leHQ7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKK30KKworLyoKKyAqIFNpbmdseS1saW5rZWQgTGlzdCBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUJU0xJU1RfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAorCShoZWFkKS0+c2xoX2ZpcnN0ID0gTlVMTDsJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNMSVNUX0lOU0VSVF9BRlRFUihzbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwkoZWxtKS0+ZmllbGQuc2xlX25leHQgPSAoc2xpc3RlbG0pLT5maWVsZC5zbGVfbmV4dDsJCVwKKwkoc2xpc3RlbG0pLT5maWVsZC5zbGVfbmV4dCA9IChlbG0pOwkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTTElTVF9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC5zbGVfbmV4dCA9IChoZWFkKS0+c2xoX2ZpcnN0OwkJCVwKKwkoaGVhZCktPnNsaF9maXJzdCA9IChlbG0pOwkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU0xJU1RfUkVNT1ZFX0hFQUQoaGVhZCwgZmllbGQpIGRvIHsJCQkJXAorCShoZWFkKS0+c2xoX2ZpcnN0ID0gKGhlYWQpLT5zbGhfZmlyc3QtPmZpZWxkLnNsZV9uZXh0OwkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU0xJU1RfUkVNT1ZFKGhlYWQsIGVsbSwgdHlwZSwgZmllbGQpIGRvIHsJCQlcCisJaWYgKChoZWFkKS0+c2xoX2ZpcnN0ID09IChlbG0pKSB7CQkJCVwKKwkJU0xJU1RfUkVNT1ZFX0hFQUQoKGhlYWQpLCBmaWVsZCk7CQkJXAorCX0JCQkJCQkJCVwKKwllbHNlIHsJCQkJCQkJCVwKKwkJc3RydWN0IHR5cGUgKmN1cmVsbSA9IChoZWFkKS0+c2xoX2ZpcnN0OwkJXAorCQl3aGlsZShjdXJlbG0tPmZpZWxkLnNsZV9uZXh0ICE9IChlbG0pKQkJCVwKKwkJCWN1cmVsbSA9IGN1cmVsbS0+ZmllbGQuc2xlX25leHQ7CQlcCisJCWN1cmVsbS0+ZmllbGQuc2xlX25leHQgPQkJCQlcCisJCSAgICBjdXJlbG0tPmZpZWxkLnNsZV9uZXh0LT5maWVsZC5zbGVfbmV4dDsJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTTElTVF9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkJCQlcCisJZm9yKCh2YXIpID0gKGhlYWQpLT5zbGhfZmlyc3Q7ICh2YXIpOyAodmFyKSA9ICh2YXIpLT5maWVsZC5zbGVfbmV4dCkKKworLyoKKyAqIFNpbmdseS1saW5rZWQgTGlzdCBhY2Nlc3MgbWV0aG9kcy4KKyAqLworI2RlZmluZQlTTElTVF9FTVBUWShoZWFkKQkoKGhlYWQpLT5zbGhfZmlyc3QgPT0gTlVMTCkKKyNkZWZpbmUJU0xJU1RfRklSU1QoaGVhZCkJKChoZWFkKS0+c2xoX2ZpcnN0KQorI2RlZmluZQlTTElTVF9ORVhUKGVsbSwgZmllbGQpCSgoZWxtKS0+ZmllbGQuc2xlX25leHQpCisKKworLyoKKyAqIFNpbmdseS1saW5rZWQgVGFpbCBxdWV1ZSBkZWNsYXJhdGlvbnMuCisgKi8KKyNkZWZpbmUJU1RBSUxRX0hFQUQobmFtZSwgdHlwZSkJCQkJCVwKK3N0cnVjdCBuYW1lIHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc3RxaF9maXJzdDsJLyogZmlyc3QgZWxlbWVudCAqLwkJCVwKKwlzdHJ1Y3QgdHlwZSAqKnN0cWhfbGFzdDsJLyogYWRkciBvZiBsYXN0IG5leHQgZWxlbWVudCAqLwkJXAorfQorCisjZGVmaW5lCVNUQUlMUV9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpCQkJCQlcCisJeyBOVUxMLCAmKGhlYWQpLnN0cWhfZmlyc3QgfQorCisjZGVmaW5lCVNUQUlMUV9FTlRSWSh0eXBlKQkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnN0cWVfbmV4dDsJLyogbmV4dCBlbGVtZW50ICovCQkJXAorfQorCisvKgorICogU2luZ2x5LWxpbmtlZCBUYWlsIHF1ZXVlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlTVEFJTFFfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAorCShoZWFkKS0+c3RxaF9maXJzdCA9IE5VTEw7CQkJCQlcCisJKGhlYWQpLT5zdHFoX2xhc3QgPSAmKGhlYWQpLT5zdHFoX2ZpcnN0OwkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTVEFJTFFfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKChlbG0pLT5maWVsZC5zdHFlX25leHQgPSAoaGVhZCktPnN0cWhfZmlyc3QpID09IE5VTEwpCVwKKwkJKGhlYWQpLT5zdHFoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnN0cWVfbmV4dDsJCVwKKwkoaGVhZCktPnN0cWhfZmlyc3QgPSAoZWxtKTsJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNUQUlMUV9JTlNFUlRfVEFJTChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC5zdHFlX25leHQgPSBOVUxMOwkJCQkJXAorCSooaGVhZCktPnN0cWhfbGFzdCA9IChlbG0pOwkJCQkJXAorCShoZWFkKS0+c3RxaF9sYXN0ID0gJihlbG0pLT5maWVsZC5zdHFlX25leHQ7CQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU1RBSUxRX0lOU0VSVF9BRlRFUihoZWFkLCBsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQlcCisJaWYgKCgoZWxtKS0+ZmllbGQuc3RxZV9uZXh0ID0gKGxpc3RlbG0pLT5maWVsZC5zdHFlX25leHQpID09IE5VTEwpXAorCQkoaGVhZCktPnN0cWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQuc3RxZV9uZXh0OwkJXAorCShsaXN0ZWxtKS0+ZmllbGQuc3RxZV9uZXh0ID0gKGVsbSk7CQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNUQUlMUV9SRU1PVkVfSEVBRChoZWFkLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKCgoaGVhZCktPnN0cWhfZmlyc3QgPSAoaGVhZCktPnN0cWhfZmlyc3QtPmZpZWxkLnN0cWVfbmV4dCkgPT0gTlVMTCkgXAorCQkoaGVhZCktPnN0cWhfbGFzdCA9ICYoaGVhZCktPnN0cWhfZmlyc3Q7CQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU1RBSUxRX1JFTU9WRShoZWFkLCBlbG0sIHR5cGUsIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoaGVhZCktPnN0cWhfZmlyc3QgPT0gKGVsbSkpIHsJCQkJXAorCQlTVEFJTFFfUkVNT1ZFX0hFQUQoKGhlYWQpLCBmaWVsZCk7CQkJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJc3RydWN0IHR5cGUgKmN1cmVsbSA9IChoZWFkKS0+c3RxaF9maXJzdDsJCVwKKwkJd2hpbGUgKGN1cmVsbS0+ZmllbGQuc3RxZV9uZXh0ICE9IChlbG0pKQkJCVwKKwkJCWN1cmVsbSA9IGN1cmVsbS0+ZmllbGQuc3RxZV9uZXh0OwkJXAorCQlpZiAoKGN1cmVsbS0+ZmllbGQuc3RxZV9uZXh0ID0JCQkJXAorCQkJY3VyZWxtLT5maWVsZC5zdHFlX25leHQtPmZpZWxkLnN0cWVfbmV4dCkgPT0gTlVMTCkgXAorCQkJICAgIChoZWFkKS0+c3RxaF9sYXN0ID0gJihjdXJlbG0pLT5maWVsZC5zdHFlX25leHQ7IFwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTVEFJTFFfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQlcCisJZm9yICgodmFyKSA9ICgoaGVhZCktPnN0cWhfZmlyc3QpOwkJCQlcCisJCSh2YXIpOwkJCQkJCQlcCisJCSh2YXIpID0gKCh2YXIpLT5maWVsZC5zdHFlX25leHQpKQorCisjZGVmaW5lCVNUQUlMUV9DT05DQVQoaGVhZDEsIGhlYWQyKSBkbyB7CQkJCVwKKwlpZiAoIVNUQUlMUV9FTVBUWSgoaGVhZDIpKSkgewkJCQkJXAorCQkqKGhlYWQxKS0+c3RxaF9sYXN0ID0gKGhlYWQyKS0+c3RxaF9maXJzdDsJCVwKKwkJKGhlYWQxKS0+c3RxaF9sYXN0ID0gKGhlYWQyKS0+c3RxaF9sYXN0OwkJXAorCQlTVEFJTFFfSU5JVCgoaGVhZDIpKTsJCQkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworLyoKKyAqIFNpbmdseS1saW5rZWQgVGFpbCBxdWV1ZSBhY2Nlc3MgbWV0aG9kcy4KKyAqLworI2RlZmluZQlTVEFJTFFfRU1QVFkoaGVhZCkJKChoZWFkKS0+c3RxaF9maXJzdCA9PSBOVUxMKQorI2RlZmluZQlTVEFJTFFfRklSU1QoaGVhZCkJKChoZWFkKS0+c3RxaF9maXJzdCkKKyNkZWZpbmUJU1RBSUxRX05FWFQoZWxtLCBmaWVsZCkJKChlbG0pLT5maWVsZC5zdHFlX25leHQpCisKKworLyoKKyAqIFNpbXBsZSBxdWV1ZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZQlTSU1QTEVRX0hFQUQobmFtZSwgdHlwZSkJCQkJCVwKK3N0cnVjdCBuYW1lIHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc3FoX2ZpcnN0OwkvKiBmaXJzdCBlbGVtZW50ICovCQkJXAorCXN0cnVjdCB0eXBlICoqc3FoX2xhc3Q7CS8qIGFkZHIgb2YgbGFzdCBuZXh0IGVsZW1lbnQgKi8JCVwKK30KKworI2RlZmluZQlTSU1QTEVRX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJCVwKKwl7IE5VTEwsICYoaGVhZCkuc3FoX2ZpcnN0IH0KKworI2RlZmluZQlTSU1QTEVRX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc3FlX25leHQ7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKK30KKworLyoKKyAqIFNpbXBsZSBxdWV1ZSBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUJU0lNUExFUV9JTklUKGhlYWQpIGRvIHsJCQkJCQlcCisJKGhlYWQpLT5zcWhfZmlyc3QgPSBOVUxMOwkJCQkJXAorCShoZWFkKS0+c3FoX2xhc3QgPSAmKGhlYWQpLT5zcWhfZmlyc3Q7CQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNJTVBMRVFfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKChlbG0pLT5maWVsZC5zcWVfbmV4dCA9IChoZWFkKS0+c3FoX2ZpcnN0KSA9PSBOVUxMKQlcCisJCShoZWFkKS0+c3FoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnNxZV9uZXh0OwkJXAorCShoZWFkKS0+c3FoX2ZpcnN0ID0gKGVsbSk7CQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTSU1QTEVRX0lOU0VSVF9UQUlMKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLnNxZV9uZXh0ID0gTlVMTDsJCQkJCVwKKwkqKGhlYWQpLT5zcWhfbGFzdCA9IChlbG0pOwkJCQkJXAorCShoZWFkKS0+c3FoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnNxZV9uZXh0OwkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNJTVBMRVFfSU5TRVJUX0FGVEVSKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCVwKKwlpZiAoKChlbG0pLT5maWVsZC5zcWVfbmV4dCA9IChsaXN0ZWxtKS0+ZmllbGQuc3FlX25leHQpID09IE5VTEwpXAorCQkoaGVhZCktPnNxaF9sYXN0ID0gJihlbG0pLT5maWVsZC5zcWVfbmV4dDsJCVwKKwkobGlzdGVsbSktPmZpZWxkLnNxZV9uZXh0ID0gKGVsbSk7CQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNJTVBMRVFfUkVNT1ZFX0hFQUQoaGVhZCwgZmllbGQpIGRvIHsJCQkJXAorCWlmICgoKGhlYWQpLT5zcWhfZmlyc3QgPSAoaGVhZCktPnNxaF9maXJzdC0+ZmllbGQuc3FlX25leHQpID09IE5VTEwpIFwKKwkJKGhlYWQpLT5zcWhfbGFzdCA9ICYoaGVhZCktPnNxaF9maXJzdDsJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTSU1QTEVRX1JFTU9WRShoZWFkLCBlbG0sIHR5cGUsIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoaGVhZCktPnNxaF9maXJzdCA9PSAoZWxtKSkgewkJCQlcCisJCVNJTVBMRVFfUkVNT1ZFX0hFQUQoKGhlYWQpLCBmaWVsZCk7CQkJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJc3RydWN0IHR5cGUgKmN1cmVsbSA9IChoZWFkKS0+c3FoX2ZpcnN0OwkJXAorCQl3aGlsZSAoY3VyZWxtLT5maWVsZC5zcWVfbmV4dCAhPSAoZWxtKSkJCQlcCisJCQljdXJlbG0gPSBjdXJlbG0tPmZpZWxkLnNxZV9uZXh0OwkJXAorCQlpZiAoKGN1cmVsbS0+ZmllbGQuc3FlX25leHQgPQkJCQlcCisJCQljdXJlbG0tPmZpZWxkLnNxZV9uZXh0LT5maWVsZC5zcWVfbmV4dCkgPT0gTlVMTCkgXAorCQkJICAgIChoZWFkKS0+c3FoX2xhc3QgPSAmKGN1cmVsbSktPmZpZWxkLnNxZV9uZXh0OyBcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU0lNUExFUV9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkJCVwKKwlmb3IgKCh2YXIpID0gKChoZWFkKS0+c3FoX2ZpcnN0KTsJCQkJXAorCQkodmFyKTsJCQkJCQkJXAorCQkodmFyKSA9ICgodmFyKS0+ZmllbGQuc3FlX25leHQpKQorCisvKgorICogU2ltcGxlIHF1ZXVlIGFjY2VzcyBtZXRob2RzLgorICovCisjZGVmaW5lCVNJTVBMRVFfRU1QVFkoaGVhZCkJCSgoaGVhZCktPnNxaF9maXJzdCA9PSBOVUxMKQorI2RlZmluZQlTSU1QTEVRX0ZJUlNUKGhlYWQpCQkoKGhlYWQpLT5zcWhfZmlyc3QpCisjZGVmaW5lCVNJTVBMRVFfTkVYVChlbG0sIGZpZWxkKQkoKGVsbSktPmZpZWxkLnNxZV9uZXh0KQorCisKKy8qCisgKiBUYWlsIHF1ZXVlIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lCV9UQUlMUV9IRUFEKG5hbWUsIHR5cGUsIHF1YWwpCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJcXVhbCB0eXBlICp0cWhfZmlyc3Q7CQkvKiBmaXJzdCBlbGVtZW50ICovCQlcCisJcXVhbCB0eXBlICpxdWFsICp0cWhfbGFzdDsJLyogYWRkciBvZiBsYXN0IG5leHQgZWxlbWVudCAqLwlcCit9CisjZGVmaW5lIFRBSUxRX0hFQUQobmFtZSwgdHlwZSkJX1RBSUxRX0hFQUQobmFtZSwgc3RydWN0IHR5cGUsKQorCisjZGVmaW5lCVRBSUxRX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJCVwKKwl7IE5VTEwsICYoaGVhZCkudHFoX2ZpcnN0IH0KKworI2RlZmluZQlfVEFJTFFfRU5UUlkodHlwZSwgcXVhbCkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisJcXVhbCB0eXBlICp0cWVfbmV4dDsJCS8qIG5leHQgZWxlbWVudCAqLwkJXAorCXF1YWwgdHlwZSAqcXVhbCAqdHFlX3ByZXY7CS8qIGFkZHJlc3Mgb2YgcHJldmlvdXMgbmV4dCBlbGVtZW50ICovXAorfQorI2RlZmluZSBUQUlMUV9FTlRSWSh0eXBlKQlfVEFJTFFfRU5UUlkoc3RydWN0IHR5cGUsKQorCisvKgorICogVGFpbCBxdWV1ZSBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUJVEFJTFFfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAorCShoZWFkKS0+dHFoX2ZpcnN0ID0gTlVMTDsJCQkJCVwKKwkoaGVhZCktPnRxaF9sYXN0ID0gJihoZWFkKS0+dHFoX2ZpcnN0OwkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlUQUlMUV9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoKGVsbSktPmZpZWxkLnRxZV9uZXh0ID0gKGhlYWQpLT50cWhfZmlyc3QpICE9IE5VTEwpCVwKKwkJKGhlYWQpLT50cWhfZmlyc3QtPmZpZWxkLnRxZV9wcmV2ID0JCQlcCisJCSAgICAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gJihlbG0pLT5maWVsZC50cWVfbmV4dDsJCVwKKwkoaGVhZCktPnRxaF9maXJzdCA9IChlbG0pOwkJCQkJXAorCShlbG0pLT5maWVsZC50cWVfcHJldiA9ICYoaGVhZCktPnRxaF9maXJzdDsJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlUQUlMUV9JTlNFUlRfVEFJTChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC50cWVfbmV4dCA9IE5VTEw7CQkJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gKGhlYWQpLT50cWhfbGFzdDsJCQlcCisJKihoZWFkKS0+dHFoX2xhc3QgPSAoZWxtKTsJCQkJCVwKKwkoaGVhZCktPnRxaF9sYXN0ID0gJihlbG0pLT5maWVsZC50cWVfbmV4dDsJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlUQUlMUV9JTlNFUlRfQUZURVIoaGVhZCwgbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJXAorCWlmICgoKGVsbSktPmZpZWxkLnRxZV9uZXh0ID0gKGxpc3RlbG0pLT5maWVsZC50cWVfbmV4dCkgIT0gTlVMTClcCisJCShlbG0pLT5maWVsZC50cWVfbmV4dC0+ZmllbGQudHFlX3ByZXYgPSAJCVwKKwkJICAgICYoZWxtKS0+ZmllbGQudHFlX25leHQ7CQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCShoZWFkKS0+dHFoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJXAorCShsaXN0ZWxtKS0+ZmllbGQudHFlX25leHQgPSAoZWxtKTsJCQkJXAorCShlbG0pLT5maWVsZC50cWVfcHJldiA9ICYobGlzdGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJVEFJTFFfSU5TRVJUX0JFRk9SRShsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC50cWVfcHJldiA9IChsaXN0ZWxtKS0+ZmllbGQudHFlX3ByZXY7CQlcCisJKGVsbSktPmZpZWxkLnRxZV9uZXh0ID0gKGxpc3RlbG0pOwkJCQlcCisJKihsaXN0ZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAoZWxtKTsJCQkJXAorCShsaXN0ZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJVEFJTFFfUkVNT1ZFKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQkJXAorCWlmICgoKGVsbSktPmZpZWxkLnRxZV9uZXh0KSAhPSBOVUxMKQkJCQlcCisJCShlbG0pLT5maWVsZC50cWVfbmV4dC0+ZmllbGQudHFlX3ByZXYgPSAJCVwKKwkJICAgIChlbG0pLT5maWVsZC50cWVfcHJldjsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGhlYWQpLT50cWhfbGFzdCA9IChlbG0pLT5maWVsZC50cWVfcHJldjsJCVwKKwkqKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVRBSUxRX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJCVwKKwlmb3IgKCh2YXIpID0gKChoZWFkKS0+dHFoX2ZpcnN0KTsJCQkJXAorCQkodmFyKTsJCQkJCQkJXAorCQkodmFyKSA9ICgodmFyKS0+ZmllbGQudHFlX25leHQpKQorCisjZGVmaW5lCVRBSUxRX0ZPUkVBQ0hfUkVWRVJTRSh2YXIsIGhlYWQsIGhlYWRuYW1lLCBmaWVsZCkJCVwKKwlmb3IgKCh2YXIpID0gKCooKChzdHJ1Y3QgaGVhZG5hbWUgKikoKGhlYWQpLT50cWhfbGFzdCkpLT50cWhfbGFzdCkpOwlcCisJCSh2YXIpOwkJCQkJCQlcCisJCSh2YXIpID0gKCooKChzdHJ1Y3QgaGVhZG5hbWUgKikoKHZhciktPmZpZWxkLnRxZV9wcmV2KSktPnRxaF9sYXN0KSkpCisKKyNkZWZpbmUJVEFJTFFfQ09OQ0FUKGhlYWQxLCBoZWFkMiwgZmllbGQpIGRvIHsJCQkJXAorCWlmICghVEFJTFFfRU1QVFkoaGVhZDIpKSB7CQkJCQlcCisJCSooaGVhZDEpLT50cWhfbGFzdCA9IChoZWFkMiktPnRxaF9maXJzdDsJCVwKKwkJKGhlYWQyKS0+dHFoX2ZpcnN0LT5maWVsZC50cWVfcHJldiA9IChoZWFkMSktPnRxaF9sYXN0OwlcCisJCShoZWFkMSktPnRxaF9sYXN0ID0gKGhlYWQyKS0+dHFoX2xhc3Q7CQkJXAorCQlUQUlMUV9JTklUKChoZWFkMikpOwkJCQkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisvKgorICogVGFpbCBxdWV1ZSBhY2Nlc3MgbWV0aG9kcy4KKyAqLworI2RlZmluZQlUQUlMUV9FTVBUWShoZWFkKQkJKChoZWFkKS0+dHFoX2ZpcnN0ID09IE5VTEwpCisjZGVmaW5lCVRBSUxRX0ZJUlNUKGhlYWQpCQkoKGhlYWQpLT50cWhfZmlyc3QpCisjZGVmaW5lCVRBSUxRX05FWFQoZWxtLCBmaWVsZCkJCSgoZWxtKS0+ZmllbGQudHFlX25leHQpCisKKyNkZWZpbmUJVEFJTFFfTEFTVChoZWFkLCBoZWFkbmFtZSkgXAorCSgqKCgoc3RydWN0IGhlYWRuYW1lICopKChoZWFkKS0+dHFoX2xhc3QpKS0+dHFoX2xhc3QpKQorI2RlZmluZQlUQUlMUV9QUkVWKGVsbSwgaGVhZG5hbWUsIGZpZWxkKSBcCisJKCooKChzdHJ1Y3QgaGVhZG5hbWUgKikoKGVsbSktPmZpZWxkLnRxZV9wcmV2KSktPnRxaF9sYXN0KSkKKworCisvKgorICogQ2lyY3VsYXIgcXVldWUgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUJQ0lSQ0xFUV9IRUFEKG5hbWUsIHR5cGUpCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKmNxaF9maXJzdDsJCS8qIGZpcnN0IGVsZW1lbnQgKi8JCVwKKwlzdHJ1Y3QgdHlwZSAqY3FoX2xhc3Q7CQkvKiBsYXN0IGVsZW1lbnQgKi8JCVwKK30KKworI2RlZmluZQlDSVJDTEVRX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJCVwKKwl7ICh2b2lkICopJmhlYWQsICh2b2lkICopJmhlYWQgfQorCisjZGVmaW5lCUNJUkNMRVFfRU5UUlkodHlwZSkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpjcWVfbmV4dDsJCS8qIG5leHQgZWxlbWVudCAqLwkJXAorCXN0cnVjdCB0eXBlICpjcWVfcHJldjsJCS8qIHByZXZpb3VzIGVsZW1lbnQgKi8JCVwKK30KKworLyoKKyAqIENpcmN1bGFyIHF1ZXVlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlDSVJDTEVRX0lOSVQoaGVhZCkgZG8gewkJCQkJCVwKKwkoaGVhZCktPmNxaF9maXJzdCA9ICh2b2lkICopKGhlYWQpOwkJCQlcCisJKGhlYWQpLT5jcWhfbGFzdCA9ICh2b2lkICopKGhlYWQpOwkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlDSVJDTEVRX0lOU0VSVF9BRlRFUihoZWFkLCBsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQlcCisJKGVsbSktPmZpZWxkLmNxZV9uZXh0ID0gKGxpc3RlbG0pLT5maWVsZC5jcWVfbmV4dDsJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX3ByZXYgPSAobGlzdGVsbSk7CQkJCVwKKwlpZiAoKGxpc3RlbG0pLT5maWVsZC5jcWVfbmV4dCA9PSAodm9pZCAqKShoZWFkKSkJCVwKKwkJKGhlYWQpLT5jcWhfbGFzdCA9IChlbG0pOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkobGlzdGVsbSktPmZpZWxkLmNxZV9uZXh0LT5maWVsZC5jcWVfcHJldiA9IChlbG0pOwlcCisJKGxpc3RlbG0pLT5maWVsZC5jcWVfbmV4dCA9IChlbG0pOwkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlDSVJDTEVRX0lOU0VSVF9CRUZPUkUoaGVhZCwgbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJXAorCShlbG0pLT5maWVsZC5jcWVfbmV4dCA9IChsaXN0ZWxtKTsJCQkJXAorCShlbG0pLT5maWVsZC5jcWVfcHJldiA9IChsaXN0ZWxtKS0+ZmllbGQuY3FlX3ByZXY7CQlcCisJaWYgKChsaXN0ZWxtKS0+ZmllbGQuY3FlX3ByZXYgPT0gKHZvaWQgKikoaGVhZCkpCQlcCisJCShoZWFkKS0+Y3FoX2ZpcnN0ID0gKGVsbSk7CQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCShsaXN0ZWxtKS0+ZmllbGQuY3FlX3ByZXYtPmZpZWxkLmNxZV9uZXh0ID0gKGVsbSk7CVwKKwkobGlzdGVsbSktPmZpZWxkLmNxZV9wcmV2ID0gKGVsbSk7CQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCUNJUkNMRVFfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX25leHQgPSAoaGVhZCktPmNxaF9maXJzdDsJCQlcCisJKGVsbSktPmZpZWxkLmNxZV9wcmV2ID0gKHZvaWQgKikoaGVhZCk7CQkJCVwKKwlpZiAoKGhlYWQpLT5jcWhfbGFzdCA9PSAodm9pZCAqKShoZWFkKSkJCQkJXAorCQkoaGVhZCktPmNxaF9sYXN0ID0gKGVsbSk7CQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCShoZWFkKS0+Y3FoX2ZpcnN0LT5maWVsZC5jcWVfcHJldiA9IChlbG0pOwkJXAorCShoZWFkKS0+Y3FoX2ZpcnN0ID0gKGVsbSk7CQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlDSVJDTEVRX0lOU0VSVF9UQUlMKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLmNxZV9uZXh0ID0gKHZvaWQgKikoaGVhZCk7CQkJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX3ByZXYgPSAoaGVhZCktPmNxaF9sYXN0OwkJCVwKKwlpZiAoKGhlYWQpLT5jcWhfZmlyc3QgPT0gKHZvaWQgKikoaGVhZCkpCQkJXAorCQkoaGVhZCktPmNxaF9maXJzdCA9IChlbG0pOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPmNxaF9sYXN0LT5maWVsZC5jcWVfbmV4dCA9IChlbG0pOwkJXAorCShoZWFkKS0+Y3FoX2xhc3QgPSAoZWxtKTsJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCUNJUkNMRVFfUkVNT1ZFKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQkJXAorCWlmICgoZWxtKS0+ZmllbGQuY3FlX25leHQgPT0gKHZvaWQgKikoaGVhZCkpCQkJXAorCQkoaGVhZCktPmNxaF9sYXN0ID0gKGVsbSktPmZpZWxkLmNxZV9wcmV2OwkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGVsbSktPmZpZWxkLmNxZV9uZXh0LT5maWVsZC5jcWVfcHJldiA9CQkJXAorCQkgICAgKGVsbSktPmZpZWxkLmNxZV9wcmV2OwkJCQlcCisJaWYgKChlbG0pLT5maWVsZC5jcWVfcHJldiA9PSAodm9pZCAqKShoZWFkKSkJCQlcCisJCShoZWFkKS0+Y3FoX2ZpcnN0ID0gKGVsbSktPmZpZWxkLmNxZV9uZXh0OwkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGVsbSktPmZpZWxkLmNxZV9wcmV2LT5maWVsZC5jcWVfbmV4dCA9CQkJXAorCQkgICAgKGVsbSktPmZpZWxkLmNxZV9uZXh0OwkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlDSVJDTEVRX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJXAorCWZvciAoKHZhcikgPSAoKGhlYWQpLT5jcWhfZmlyc3QpOwkJCQlcCisJCSh2YXIpICE9IChjb25zdCB2b2lkICopKGhlYWQpOwkJCQlcCisJCSh2YXIpID0gKCh2YXIpLT5maWVsZC5jcWVfbmV4dCkpCisKKyNkZWZpbmUJQ0lSQ0xFUV9GT1JFQUNIX1JFVkVSU0UodmFyLCBoZWFkLCBmaWVsZCkJCQlcCisJZm9yICgodmFyKSA9ICgoaGVhZCktPmNxaF9sYXN0KTsJCQkJXAorCQkodmFyKSAhPSAoY29uc3Qgdm9pZCAqKShoZWFkKTsJCQkJXAorCQkodmFyKSA9ICgodmFyKS0+ZmllbGQuY3FlX3ByZXYpKQorCisvKgorICogQ2lyY3VsYXIgcXVldWUgYWNjZXNzIG1ldGhvZHMuCisgKi8KKyNkZWZpbmUJQ0lSQ0xFUV9FTVBUWShoZWFkKQkJKChoZWFkKS0+Y3FoX2ZpcnN0ID09ICh2b2lkICopKGhlYWQpKQorI2RlZmluZQlDSVJDTEVRX0ZJUlNUKGhlYWQpCQkoKGhlYWQpLT5jcWhfZmlyc3QpCisjZGVmaW5lCUNJUkNMRVFfTEFTVChoZWFkKQkJKChoZWFkKS0+Y3FoX2xhc3QpCisjZGVmaW5lCUNJUkNMRVFfTkVYVChlbG0sIGZpZWxkKQkoKGVsbSktPmZpZWxkLmNxZV9uZXh0KQorI2RlZmluZQlDSVJDTEVRX1BSRVYoZWxtLCBmaWVsZCkJKChlbG0pLT5maWVsZC5jcWVfcHJldikKKworI2RlZmluZSBDSVJDTEVRX0xPT1BfTkVYVChoZWFkLCBlbG0sIGZpZWxkKQkJCQlcCisJKCgoZWxtKS0+ZmllbGQuY3FlX25leHQgPT0gKHZvaWQgKikoaGVhZCkpCQkJXAorCSAgICA/ICgoaGVhZCktPmNxaF9maXJzdCkJCQkJCVwKKwkgICAgOiAoZWxtLT5maWVsZC5jcWVfbmV4dCkpCisjZGVmaW5lIENJUkNMRVFfTE9PUF9QUkVWKGhlYWQsIGVsbSwgZmllbGQpCQkJCVwKKwkoKChlbG0pLT5maWVsZC5jcWVfcHJldiA9PSAodm9pZCAqKShoZWFkKSkJCQlcCisJICAgID8gKChoZWFkKS0+Y3FoX2xhc3QpCQkJCQlcCisJICAgIDogKGVsbS0+ZmllbGQuY3FlX3ByZXYpKQorCisjZW5kaWYJLyogc3lzL3F1ZXVlLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3F1b3RhLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9xdW90YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYTBlYzAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9xdW90YS5oCkBAIC0wLDAgKzEsMjI1IEBACisvKiBUaGlzIGp1c3QgcmVwcmVzZW50cyB0aGUgbm9uLWtlcm5lbCBwYXJ0cyBvZiA8bGludXgvcXVvdGEuaD4uCisgKgorICogaGVyZSdzIHRoZSBjb3JyZXNwb25kaW5nIGNvcHlyaWdodDoKKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIFJvYmVydCBFbHogYXQgVGhlIFVuaXZlcnNpdHkgb2YgTWVsYm91cm5lLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9TWVNfUVVPVEFfSAorI2RlZmluZSBfU1lTX1FVT1RBX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyoKKyAqIFNlbGVjdCBiZXR3ZWVuIGRpZmZlcmVudCBpbmNvbXBhdGlibGUgcXVvdGEgdmVyc2lvbnMuCisgKiBEZWZhdWx0IHRvIHRoZSB2ZXJzaW9uIHVzZWQgYnkgTGludXgga2VybmVsIHZlcnNpb24gMi40LjIyCisgKiBvciBsYXRlci4gICovCisjaWZuZGVmIF9MSU5VWF9RVU9UQV9WRVJTSU9OCisjIGRlZmluZSBfTElOVVhfUVVPVEFfVkVSU0lPTiAyCisjZW5kaWYKKworLyoKKyAqIENvbnZlcnQgZGlza2Jsb2NrcyB0byBibG9ja3MgYW5kIHRoZSBvdGhlciB3YXkgYXJvdW5kLgorICogY3VycmVudGx5IG9ubHkgdG8gZm9vbCB0aGUgQlNEIHNvdXJjZS4gOi0pCisgKi8KKyNkZWZpbmUgZGJ0b2IobnVtKSAoKG51bSkgPDwgMTApCisjZGVmaW5lIGJ0b2RiKG51bSkgKChudW0pID4+IDEwKQorCisvKgorICogQ29udmVydCBjb3VudCBvZiBmaWxlc3lzdGVtIGJsb2NrcyB0byBkaXNrcXVvdGEgYmxvY2tzLCBtZWFudAorICogZm9yIGZpbGVzeXN0ZW1zIHdoZXJlIGlfYmxrc2l6ZSAhPSBCTE9DS19TSVpFCisgKi8KKyNkZWZpbmUgZnNfdG9fZHFfYmxvY2tzKG51bSwgYmxrc2l6ZSkgKCgobnVtKSAqIChibGtzaXplKSkgLyBCTE9DS19TSVpFKQorCisvKgorICogRGVmaW5pdGlvbnMgZm9yIGRpc2sgcXVvdGFzIGltcG9zZWQgb24gdGhlIGF2ZXJhZ2UgdXNlcgorICogKGJpZyBicm90aGVyIGZpbmFsbHkgaGl0cyBMaW51eCkuCisgKgorICogVGhlIGZvbGxvd2luZyBjb25zdGFudHMgZGVmaW5lIHRoZSBhbW91bnQgb2YgdGltZSBnaXZlbiBhIHVzZXIKKyAqIGJlZm9yZSB0aGUgc29mdCBsaW1pdHMgYXJlIHRyZWF0ZWQgYXMgaGFyZCBsaW1pdHMgKHVzdWFsbHkgcmVzdWx0aW5nCisgKiBpbiBhbiBhbGxvY2F0aW9uIGZhaWx1cmUpLiBUaGUgdGltZXIgaXMgc3RhcnRlZCB3aGVuIHRoZSB1c2VyIGNyb3NzZXMKKyAqIHRoZWlyIHNvZnQgbGltaXQsIGl0IGlzIHJlc2V0IHdoZW4gdGhleSBnbyBiZWxvdyB0aGVpciBzb2Z0IGxpbWl0LgorICovCisjZGVmaW5lIE1BWF9JUV9USU1FICA2MDQ4MDAJLyogKDcqMjQqNjAqNjApIDEgd2VlayAqLworI2RlZmluZSBNQVhfRFFfVElNRSAgNjA0ODAwCS8qICg3KjI0KjYwKjYwKSAxIHdlZWsgKi8KKworI2RlZmluZSBNQVhRVU9UQVMgMgorI2RlZmluZSBVU1JRVU9UQSAgMAkJLyogZWxlbWVudCB1c2VkIGZvciB1c2VyIHF1b3RhcyAqLworI2RlZmluZSBHUlBRVU9UQSAgMQkJLyogZWxlbWVudCB1c2VkIGZvciBncm91cCBxdW90YXMgKi8KKworLyoKKyAqIERlZmluaXRpb25zIGZvciB0aGUgZGVmYXVsdCBuYW1lcyBvZiB0aGUgcXVvdGFzIGZpbGVzLgorICovCisjZGVmaW5lIElOSVRRRk5BTUVTIHsgXAorICAgInVzZXIiLCAgICAgIC8qIFVTUlFVT1RBICovIFwKKyAgICJncm91cCIsICAgLyogR1JQUVVPVEEgKi8gXAorICAgInVuZGVmaW5lZCIsIFwKK307CisKKyNkZWZpbmUgUVVPVEFGSUxFTkFNRSAicXVvdGEiCisjZGVmaW5lIFFVT1RBR1JPVVAgInN0YWZmIgorCisjZGVmaW5lIE5SX0RRSEFTSCA0MyAgICAgICAgICAvKiBKdXN0IGFuIGFyYml0cmFyeSBudW1iZXIgYW55IHN1Z2dlc3Rpb25zID8gKi8KKyNkZWZpbmUgTlJfRFFVT1RTIDI1NiAgICAgICAgIC8qIE51bWJlciBvZiBxdW90YXMgYWN0aXZlIGF0IG9uZSB0aW1lICovCisKKy8qCisgKiBDb21tYW5kIGRlZmluaXRpb25zIGZvciB0aGUgJ3F1b3RhY3RsJyBzeXN0ZW0gY2FsbC4KKyAqIFRoZSBjb21tYW5kcyBhcmUgYnJva2VuIGludG8gYSBtYWluIGNvbW1hbmQgZGVmaW5lZCBiZWxvdworICogYW5kIGEgc3ViY29tbWFuZCB0aGF0IGlzIHVzZWQgdG8gY29udmV5IHRoZSB0eXBlIG9mCisgKiBxdW90YSB0aGF0IGlzIGJlaW5nIG1hbmlwdWxhdGVkIChzZWUgYWJvdmUpLgorICovCisjZGVmaW5lIFNVQkNNRE1BU0sgIDB4MDBmZgorI2RlZmluZSBTVUJDTURTSElGVCA4CisjZGVmaW5lIFFDTUQoY21kLCB0eXBlKSAgKCgoY21kKSA8PCBTVUJDTURTSElGVCkgfCAoKHR5cGUpICYgU1VCQ01ETUFTSykpCisKKyNpZiBfTElOVVhfUVVPVEFfVkVSU0lPTiA8IDIKKyMgZGVmaW5lIFFfUVVPVEFPTiAgMHgwMTAwCS8qIGVuYWJsZSBxdW90YXMgKi8KKyMgZGVmaW5lIFFfUVVPVEFPRkYgMHgwMjAwCS8qIGRpc2FibGUgcXVvdGFzICovCisjIGRlZmluZSBRX0dFVFFVT1RBIDB4MDMwMAkvKiBnZXQgbGltaXRzIGFuZCB1c2FnZSAqLworIyBkZWZpbmUgUV9TRVRRVU9UQSAweDA0MDAJLyogc2V0IGxpbWl0cyBhbmQgdXNhZ2UgKi8KKyMgZGVmaW5lIFFfU0VUVVNFICAgMHgwNTAwCS8qIHNldCB1c2FnZSAqLworIyBkZWZpbmUgUV9TWU5DICAgICAweDA2MDAJLyogc3luYyBkaXNrIGNvcHkgb2YgYSBmaWxlc3lzdGVtcyBxdW90YXMgKi8KKyMgZGVmaW5lIFFfU0VUUUxJTSAgMHgwNzAwCS8qIHNldCBsaW1pdHMgKi8KKyMgZGVmaW5lIFFfR0VUU1RBVFMgMHgwODAwCS8qIGdldCBjb2xsZWN0ZWQgc3RhdHMgKi8KKyMgZGVmaW5lIFFfUlNRVUFTSCAgMHgxMDAwCS8qIHNldCByb290X3NxdWFzaCBvcHRpb24gKi8KKyNlbHNlCisjIGRlZmluZSBRX1NZTkMgICAgIDB4ODAwMDAxCS8qIHN5bmMgZGlzayBjb3B5IG9mIGEgZmlsZXN5c3RlbXMgcXVvdGFzICovCisjIGRlZmluZSBRX1FVT1RBT04gIDB4ODAwMDAyCS8qIHR1cm4gcXVvdGFzIG9uICovCisjIGRlZmluZSBRX1FVT1RBT0ZGIDB4ODAwMDAzCS8qIHR1cm4gcXVvdGFzIG9mZiAqLworIyBkZWZpbmUgUV9HRVRGTVQgICAweDgwMDAwNAkvKiBnZXQgcXVvdGEgZm9ybWF0IHVzZWQgb24gZ2l2ZW4gZmlsZXN5c3RlbSAqLworIyBkZWZpbmUgUV9HRVRJTkZPICAweDgwMDAwNQkvKiBnZXQgaW5mb3JtYXRpb24gYWJvdXQgcXVvdGEgZmlsZXMgKi8KKyMgZGVmaW5lIFFfU0VUSU5GTyAgMHg4MDAwMDYJLyogc2V0IGluZm9ybWF0aW9uIGFib3V0IHF1b3RhIGZpbGVzICovCisjIGRlZmluZSBRX0dFVFFVT1RBIDB4ODAwMDA3CS8qIGdldCB1c2VyIHF1b3RhIHN0cnVjdHVyZSAqLworIyBkZWZpbmUgUV9TRVRRVU9UQSAweDgwMDAwOAkvKiBzZXQgdXNlciBxdW90YSBzdHJ1Y3R1cmUgKi8KKyNlbmRpZgorCisvKgorICogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZm9ybWF0IG9mIHRoZSBkaXNrIHF1b3RhIGZpbGUKKyAqIChhcyBpdCBhcHBlYXJzIG9uIGRpc2spIC0gdGhlIGZpbGUgaXMgYW4gYXJyYXkgb2YgdGhlc2Ugc3RydWN0dXJlcworICogaW5kZXhlZCBieSB1c2VyIG9yIGdyb3VwIG51bWJlci4KKyAqLworI2lmIF9MSU5VWF9RVU9UQV9WRVJTSU9OIDwgMgorc3RydWN0IGRxYmxrCisgIHsKKyAgICB1X2ludDMyX3QgZHFiX2JoYXJkbGltaXQ7CS8qIGFic29sdXRlIGxpbWl0IG9uIGRpc2sgYmxrcyBhbGxvYyAqLworICAgIHVfaW50MzJfdCBkcWJfYnNvZnRsaW1pdDsJLyogcHJlZmVycmVkIGxpbWl0IG9uIGRpc2sgYmxrcyAqLworICAgIHVfaW50MzJfdCBkcWJfY3VyYmxvY2tzOwkvKiBjdXJyZW50IGJsb2NrIGNvdW50ICovCisgICAgdV9pbnQzMl90IGRxYl9paGFyZGxpbWl0OwkvKiBtYXhpbXVtICMgYWxsb2NhdGVkIGlub2RlcyAqLworICAgIHVfaW50MzJfdCBkcWJfaXNvZnRsaW1pdDsJLyogcHJlZmVycmVkIGlub2RlIGxpbWl0ICovCisgICAgdV9pbnQzMl90IGRxYl9jdXJpbm9kZXM7CS8qIGN1cnJlbnQgIyBhbGxvY2F0ZWQgaW5vZGVzICovCisgICAgdGltZV90IGRxYl9idGltZTsJCS8qIHRpbWUgbGltaXQgZm9yIGV4Y2Vzc2l2ZSBkaXNrIHVzZSAqLworICAgIHRpbWVfdCBkcWJfaXRpbWU7CQkvKiB0aW1lIGxpbWl0IGZvciBleGNlc3NpdmUgZmlsZXMgKi8KKyAgfTsKKyNlbHNlCisKKy8qIEZsYWdzIHRoYXQgaW5kaWNhdGUgd2hpY2ggZmllbGRzIGluIGRxYmxrIHN0cnVjdHVyZSBhcmUgdmFsaWQuICAqLworI2RlZmluZSBRSUZfQkxJTUlUUwkxCisjZGVmaW5lIFFJRl9TUEFDRQkyCisjZGVmaW5lIFFJRl9JTElNSVRTCTQKKyNkZWZpbmUgUUlGX0lOT0RFUwk4CisjZGVmaW5lIFFJRl9CVElNRQkxNgorI2RlZmluZSBRSUZfSVRJTUUJMzIKKyNkZWZpbmUgUUlGX0xJTUlUUwkoUUlGX0JMSU1JVFMgfCBRSUZfSUxJTUlUUykKKyNkZWZpbmUgUUlGX1VTQUdFCShRSUZfU1BBQ0UgfCBRSUZfSU5PREVTKQorI2RlZmluZSBRSUZfVElNRVMJKFFJRl9CVElNRSB8IFFJRl9JVElNRSkKKyNkZWZpbmUgUUlGX0FMTAkJKFFJRl9MSU1JVFMgfCBRSUZfVVNBR0UgfCBRSUZfVElNRVMpCisKK3N0cnVjdCBkcWJsaworICB7CisgICAgdV9pbnQ2NF90IGRxYl9iaGFyZGxpbWl0OwkvKiBhYnNvbHV0ZSBsaW1pdCBvbiBkaXNrIHF1b3RhIGJsb2NrcyBhbGxvYyAqLworICAgIHVfaW50NjRfdCBkcWJfYnNvZnRsaW1pdDsJLyogcHJlZmVycmVkIGxpbWl0IG9uIGRpc2sgcXVvdGEgYmxvY2tzICovCisgICAgdV9pbnQ2NF90IGRxYl9jdXJzcGFjZTsJLyogY3VycmVudCBxdW90YSBibG9jayBjb3VudCAqLworICAgIHVfaW50NjRfdCBkcWJfaWhhcmRsaW1pdDsJLyogbWF4aW11bSAjIGFsbG9jYXRlZCBpbm9kZXMgKi8KKyAgICB1X2ludDY0X3QgZHFiX2lzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBpbm9kZSBsaW1pdCAqLworICAgIHVfaW50NjRfdCBkcWJfY3VyaW5vZGVzOwkvKiBjdXJyZW50ICMgYWxsb2NhdGVkIGlub2RlcyAqLworICAgIHVfaW50NjRfdCBkcWJfYnRpbWU7CS8qIHRpbWUgbGltaXQgZm9yIGV4Y2Vzc2l2ZSBkaXNrIHVzZSAqLworICAgIHVfaW50NjRfdCBkcWJfaXRpbWU7CS8qIHRpbWUgbGltaXQgZm9yIGV4Y2Vzc2l2ZSBmaWxlcyAqLworICAgIHVfaW50MzJfdCBkcWJfdmFsaWQ7CS8qIGJpdG1hc2sgb2YgUUlGXyogY29uc3RhbnRzICovCisgIH07CisjZW5kaWYKKworLyoKKyAqIFNob3J0aGFuZCBub3RhdGlvbi4KKyAqLworI2RlZmluZQlkcV9iaGFyZGxpbWl0CWRxX2RxYi5kcWJfYmhhcmRsaW1pdAorI2RlZmluZQlkcV9ic29mdGxpbWl0CWRxX2RxYi5kcWJfYnNvZnRsaW1pdAorI2lmIF9MSU5VWF9RVU9UQV9WRVJTSU9OIDwgMgorIyBkZWZpbmUgZHFfY3VyYmxvY2tzCWRxX2RxYi5kcWJfY3VyYmxvY2tzCisjZWxzZQorIyBkZWZpbmUgZHFfY3Vyc3BhY2UJZHFfZHFiLmRxYl9jdXJzcGFjZQorIyBkZWZpbmUgZHFfdmFsaWQJZHFfZHFiLmRxYl92YWxpZAorI2VuZGlmCisjZGVmaW5lCWRxX2loYXJkbGltaXQJZHFfZHFiLmRxYl9paGFyZGxpbWl0CisjZGVmaW5lCWRxX2lzb2Z0bGltaXQJZHFfZHFiLmRxYl9pc29mdGxpbWl0CisjZGVmaW5lCWRxX2N1cmlub2RlcwlkcV9kcWIuZHFiX2N1cmlub2RlcworI2RlZmluZQlkcV9idGltZQlkcV9kcWIuZHFiX2J0aW1lCisjZGVmaW5lCWRxX2l0aW1lCWRxX2RxYi5kcWJfaXRpbWUKKworI2RlZmluZSBkcW9mZihVSUQpICAgICAgKChsb2ZmX3QpKChVSUQpICogc2l6ZW9mIChzdHJ1Y3QgZHFibGspKSkKKworI2lmIF9MSU5VWF9RVU9UQV9WRVJTSU9OIDwgMgorc3RydWN0IGRxc3RhdHMKKyAgeworICAgIHVfaW50MzJfdCBsb29rdXBzOworICAgIHVfaW50MzJfdCBkcm9wczsKKyAgICB1X2ludDMyX3QgcmVhZHM7CisgICAgdV9pbnQzMl90IHdyaXRlczsKKyAgICB1X2ludDMyX3QgY2FjaGVfaGl0czsKKyAgICB1X2ludDMyX3QgcGFnZXNfYWxsb2NhdGVkOworICAgIHVfaW50MzJfdCBhbGxvY2F0ZWRfZHF1b3RzOworICAgIHVfaW50MzJfdCBmcmVlX2RxdW90czsKKyAgICB1X2ludDMyX3Qgc3luY3M7CisgIH07CisjZWxzZQorCisvKiBGbGFncyB0aGF0IGluZGljYXRlIHdoaWNoIGZpZWxkcyBpbiBkcWluZm8gc3RydWN0dXJlIGFyZSB2YWxpZC4gICovCisjIGRlZmluZSBJSUZfQkdSQUNFCTEKKyMgZGVmaW5lIElJRl9JR1JBQ0UJMgorIyBkZWZpbmUgSUlGX0ZMQUdTCTQKKyMgZGVmaW5lIElJRl9BTEwJKElJRl9CR1JBQ0UgfCBJSUZfSUdSQUNFIHwgSUlGX0ZMQUdTKQorCitzdHJ1Y3QgZHFpbmZvCisgIHsKKyAgICB1X2ludDY0X3QgZHFpX2JncmFjZTsKKyAgICB1X2ludDY0X3QgZHFpX2lncmFjZTsKKyAgICB1X2ludDMyX3QgZHFpX2ZsYWdzOworICAgIHVfaW50MzJfdCBkcWlfdmFsaWQ7CisgIH07CisjZW5kaWYKKworX19CRUdJTl9ERUNMUworCitleHRlcm4gaW50IHF1b3RhY3RsIChpbnQgX19jbWQsIGNvbnN0IGNoYXIgKl9fc3BlY2lhbCwgaW50IF9faWQsCisJCSAgICAgY2FkZHJfdCBfX2FkZHIpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvcXVvdGEuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcmF3LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9yYXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDJmNzhjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcmF3LmgKQEAgLTAsMCArMSwzOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfUkFXX0gKKyNkZWZpbmUgX1NZU19SQVdfSAkxCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworLyogVGhlIG1ham9yIGRldmljZSBudW1iZXIgZm9yIHJhdyBkZXZpY2VzLiAgKi8KKyNkZWZpbmUgUkFXX01BSk9SCTE2MgorCisvKiBgaW9jdGwnIGNvbW1hbmRzIGZvciByYXcgZGV2aWNlcy4gICovCisjZGVmaW5lIFJBV19TRVRCSU5EICAgICBfSU8oMHhhYywgMCkKKyNkZWZpbmUgUkFXX0dFVEJJTkQgICAgIF9JTygweGFjLCAxKQorCitzdHJ1Y3QgcmF3X2NvbmZpZ19yZXF1ZXN0Cit7CisgIGludCByYXdfbWlub3I7CisgIHVpbnQ2NF90IGJsb2NrX21ham9yOworICB1aW50NjRfdCBibG9ja19taW5vcjsKK307CisKKyNlbmRpZiAvKiBzeXMvcmF3LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3JlYm9vdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcmVib290LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE3MTljNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3JlYm9vdC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIHNob3VsZCBkZWZpbmUgUkJfKiBtYWNyb3MgdG8gYmUgdXNlZCBhcyBmbGFnCisgICBiaXRzIGluIHRoZSBhcmd1bWVudCB0byB0aGUgYHJlYm9vdCcgc3lzdGVtIGNhbGwuICAqLworCisjaWZuZGVmIF9TWVNfUkVCT09UX0gKKyNkZWZpbmUgX1NZU19SRUJPT1RfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBQZXJmb3JtIGEgaGFyZCByZXNldCBub3cuICAqLworI2RlZmluZSBSQl9BVVRPQk9PVAkweDAxMjM0NTY3CisKKy8qIEhhbHQgdGhlIHN5c3RlbS4gICovCisjZGVmaW5lIFJCX0hBTFRfU1lTVEVNCTB4Y2RlZjAxMjMKKworLyogRW5hYmxlIHJlYm9vdCB1c2luZyBDdHJsLUFsdC1EZWxldGUga2V5c3Ryb2tlLiAgKi8KKyNkZWZpbmUgUkJfRU5BQkxFX0NBRAkweDg5YWJjZGVmCisKKy8qIERpc2FibGUgcmVib290IHVzaW5nIEN0cmwtQWx0LURlbGV0ZSBrZXlzdHJva2UuICAqLworI2RlZmluZSBSQl9ESVNBQkxFX0NBRAkwCisKKy8qIFN0b3Agc3lzdGVtIGFuZCBzd2l0Y2ggcG93ZXIgb2ZmIGlmIHBvc3NpYmxlLiAgKi8KKyNkZWZpbmUgUkJfUE9XRVJfT0ZGCTB4NDMyMWZlZGMKKworX19CRUdJTl9ERUNMUworCisvKiBSZWJvb3Qgb3IgaGFsdCB0aGUgc3lzdGVtLiAgKi8KK2V4dGVybiBpbnQgcmVib290IChpbnQgX19ob3d0bykgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIF9TWVNfUkVCT09UX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3JlZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwMDNjNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3JlZy5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1JFR19ICisjZGVmaW5lIF9TWVNfUkVHX0gJMQorCisvKiBJbmRleCBpbnRvIGFuIGFycmF5IG9mIDQgYnl0ZSBpbnRlZ2VycyByZXR1cm5lZCBmcm9tIHB0cmFjZSBmb3IKKyAqIGxvY2F0aW9uIG9mIHRoZSB1c2Vycycgc3RvcmVkIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMuICovCisKKyNkZWZpbmUgRUJYIDAKKyNkZWZpbmUgRUNYIDEKKyNkZWZpbmUgRURYIDIKKyNkZWZpbmUgRVNJIDMKKyNkZWZpbmUgRURJIDQKKyNkZWZpbmUgRUJQIDUKKyNkZWZpbmUgRUFYIDYKKyNkZWZpbmUgRFMgNworI2RlZmluZSBFUyA4CisjZGVmaW5lIEZTIDkKKyNkZWZpbmUgR1MgMTAKKyNkZWZpbmUgT1JJR19FQVggMTEKKyNkZWZpbmUgRUlQIDEyCisjZGVmaW5lIENTICAxMworI2RlZmluZSBFRkwgMTQKKyNkZWZpbmUgVUVTUCAxNQorI2RlZmluZSBTUyAgIDE2CisKKyNlbmRpZgkvKiBfU1lTX1JFR19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9yZXNvdXJjZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTEyNzQxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvcmVzb3VyY2UuaApAQCAtMCwwICsxLDEwMyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkyLDk0LDE5OTYtMjAwMCwyMDAyLDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19SRVNPVVJDRV9ICisjZGVmaW5lCV9TWVNfUkVTT1VSQ0VfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVmaW5pdGlvbnMgb2Ygc3RydWN0dXJlcyBhbmQgYml0IHZhbHVlcy4gICovCisjaW5jbHVkZSA8Yml0cy9yZXNvdXJjZS5oPgorCisjaWZuZGVmIF9faWRfdF9kZWZpbmVkCit0eXBlZGVmIF9faWRfdCBpZF90OworIyBkZWZpbmUgX19pZF90X2RlZmluZWQKKyNlbmRpZgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoZSBYL09wZW4gc3RhbmRhcmQgZGVmaW5lcyB0aGF0IGFsbCB0aGUgZnVuY3Rpb25zIGJlbG93IG11c3QgdXNlCisgICBgaW50JyBhcyB0aGUgdHlwZSBmb3IgdGhlIGZpcnN0IGFyZ3VtZW50LiAgV2hlbiB3ZSBhcmUgY29tcGlsaW5nIHdpdGgKKyAgIEdOVSBleHRlbnNpb25zIHdlIGNoYW5nZSB0aGlzIHNsaWdodGx5IHRvIHByb3ZpZGUgYmV0dGVyIGVycm9yCisgICBjaGVja2luZy4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9HTlUgJiYgIWRlZmluZWQgX19jcGx1c3BsdXMKK3R5cGVkZWYgZW51bSBfX3JsaW1pdF9yZXNvdXJjZSBfX3JsaW1pdF9yZXNvdXJjZV90OwordHlwZWRlZiBlbnVtIF9fcnVzYWdlX3dobyBfX3J1c2FnZV93aG9fdDsKK3R5cGVkZWYgZW51bSBfX3ByaW9yaXR5X3doaWNoIF9fcHJpb3JpdHlfd2hpY2hfdDsKKyNlbHNlCit0eXBlZGVmIGludCBfX3JsaW1pdF9yZXNvdXJjZV90OwordHlwZWRlZiBpbnQgX19ydXNhZ2Vfd2hvX3Q7Cit0eXBlZGVmIGludCBfX3ByaW9yaXR5X3doaWNoX3Q7CisjZW5kaWYKKworLyogUHV0IHRoZSBzb2Z0IGFuZCBoYXJkIGxpbWl0cyBmb3IgUkVTT1VSQ0UgaW4gKlJMSU1JVFMuCisgICBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgLTEgaWYgbm90IChhbmQgc2V0cyBlcnJubykuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IGdldHJsaW1pdCAoX19ybGltaXRfcmVzb3VyY2VfdCBfX3Jlc291cmNlLAorCQkgICAgICBzdHJ1Y3QgcmxpbWl0ICpfX3JsaW1pdHMpIF9fVEhST1c7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoZ2V0cmxpbWl0LCAoX19ybGltaXRfcmVzb3VyY2VfdCBfX3Jlc291cmNlLAorCQkJCSAgICAgICBzdHJ1Y3QgcmxpbWl0ICpfX3JsaW1pdHMpLCBnZXRybGltaXQ2NCk7CisjIGVsc2UKKyMgIGRlZmluZSBnZXRybGltaXQgZ2V0cmxpbWl0NjQKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IGdldHJsaW1pdDY0IChfX3JsaW1pdF9yZXNvdXJjZV90IF9fcmVzb3VyY2UsCisJCQlzdHJ1Y3QgcmxpbWl0NjQgKl9fcmxpbWl0cykgX19USFJPVzsKKyNlbmRpZgorCisvKiBTZXQgdGhlIHNvZnQgYW5kIGhhcmQgbGltaXRzIGZvciBSRVNPVVJDRSB0byAqUkxJTUlUUy4KKyAgIE9ubHkgdGhlIHN1cGVyLXVzZXIgY2FuIGluY3JlYXNlIGhhcmQgbGltaXRzLgorICAgUmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bCwgLTEgaWYgbm90IChhbmQgc2V0cyBlcnJubykuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IHNldHJsaW1pdCAoX19ybGltaXRfcmVzb3VyY2VfdCBfX3Jlc291cmNlLAorCQkgICAgICBfX2NvbnN0IHN0cnVjdCBybGltaXQgKl9fcmxpbWl0cykgX19USFJPVzsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChzZXRybGltaXQsIChfX3JsaW1pdF9yZXNvdXJjZV90IF9fcmVzb3VyY2UsCisJCQkJICAgICAgIF9fY29uc3Qgc3RydWN0IHJsaW1pdCAqX19ybGltaXRzKSwKKwkJCSAgIHNldHJsaW1pdDY0KTsKKyMgZWxzZQorIyAgZGVmaW5lIHNldHJsaW1pdCBzZXRybGltaXQ2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgc2V0cmxpbWl0NjQgKF9fcmxpbWl0X3Jlc291cmNlX3QgX19yZXNvdXJjZSwKKwkJCV9fY29uc3Qgc3RydWN0IHJsaW1pdDY0ICpfX3JsaW1pdHMpIF9fVEhST1c7CisjZW5kaWYKKworLyogUmV0dXJuIHJlc291cmNlIHVzYWdlIGluZm9ybWF0aW9uIG9uIHByb2Nlc3MgaW5kaWNhdGVkIGJ5IFdITworICAgYW5kIHB1dCBpdCBpbiAqVVNBR0UuICBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIC0xIGZvciBmYWlsdXJlLiAgKi8KK2V4dGVybiBpbnQgZ2V0cnVzYWdlIChfX3J1c2FnZV93aG9fdCBfX3dobywgc3RydWN0IHJ1c2FnZSAqX191c2FnZSkgX19USFJPVzsKKworLyogUmV0dXJuIHRoZSBoaWdoZXN0IHByaW9yaXR5IG9mIGFueSBwcm9jZXNzIHNwZWNpZmllZCBieSBXSElDSCBhbmQgV0hPCisgICAoc2VlIGFib3ZlKTsgaWYgV0hPIGlzIHplcm8sIHRoZSBjdXJyZW50IHByb2Nlc3MsIHByb2Nlc3MgZ3JvdXAsIG9yIHVzZXIKKyAgIChhcyBzcGVjaWZpZWQgYnkgV0hPKSBpcyB1c2VkLiAgQSBsb3dlciBwcmlvcml0eSBudW1iZXIgbWVhbnMgaGlnaGVyCisgICBwcmlvcml0eS4gIFByaW9yaXRpZXMgcmFuZ2UgZnJvbSBQUklPX01JTiB0byBQUklPX01BWCAoYWJvdmUpLiAgKi8KK2V4dGVybiBpbnQgZ2V0cHJpb3JpdHkgKF9fcHJpb3JpdHlfd2hpY2hfdCBfX3doaWNoLCBpZF90IF9fd2hvKSBfX1RIUk9XOworCisvKiBTZXQgdGhlIHByaW9yaXR5IG9mIGFsbCBwcm9jZXNzZXMgc3BlY2lmaWVkIGJ5IFdISUNIIGFuZCBXSE8gKHNlZSBhYm92ZSkKKyAgIHRvIFBSSU8uICBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgc2V0cHJpb3JpdHkgKF9fcHJpb3JpdHlfd2hpY2hfdCBfX3doaWNoLCBpZF90IF9fd2hvLCBpbnQgX19wcmlvKQorICAgICBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3lzL3Jlc291cmNlLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zZWxlY3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3NlbGVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZjJiM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zZWxlY3QuaApAQCAtMCwwICsxLDEzNCBAQAorLyogYGZkX3NldCcgdHlwZSBhbmQgcmVsYXRlZCBtYWNyb3MsIGFuZCBgc2VsZWN0Jy9gcHNlbGVjdCcgZGVjbGFyYXRpb25zLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDMsIDIwMDksIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCVBPU0lYIDEwMDMuMWc6IDYuMiBTZWxlY3QgZnJvbSBGaWxlIERlc2NyaXB0b3IgU2V0cyA8c3lzL3NlbGVjdC5oPiAgKi8KKworI2lmbmRlZiBfU1lTX1NFTEVDVF9ICisjZGVmaW5lIF9TWVNfU0VMRUNUX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogR2V0IGRlZmluaXRpb24gb2YgbmVlZGVkIGJhc2ljIHR5cGVzLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKy8qIEdldCBfX0ZEXyogZGVmaW5pdGlvbnMuICAqLworI2luY2x1ZGUgPGJpdHMvc2VsZWN0Lmg+CisKKy8qIEdldCBfX3NpZ3NldF90LiAgKi8KKyNpbmNsdWRlIDxiaXRzL3NpZ3NldC5oPgorCisjaWZuZGVmIF9fc2lnc2V0X3RfZGVmaW5lZAorIyBkZWZpbmUgX19zaWdzZXRfdF9kZWZpbmVkCit0eXBlZGVmIF9fc2lnc2V0X3Qgc2lnc2V0X3Q7CisjZW5kaWYKKworLyogR2V0IGRlZmluaXRpb24gb2YgdGltZXIgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmVzLiAgKi8KKyNkZWZpbmUgX19uZWVkX3RpbWVfdAorI2RlZmluZSBfX25lZWRfdGltZXNwZWMKKyNpbmNsdWRlIDx0aW1lLmg+CisjZGVmaW5lIF9fbmVlZF90aW1ldmFsCisjaW5jbHVkZSA8Yml0cy90aW1lLmg+CisKKyNpZm5kZWYgX19zdXNlY29uZHNfdF9kZWZpbmVkCit0eXBlZGVmIF9fc3VzZWNvbmRzX3Qgc3VzZWNvbmRzX3Q7CisjIGRlZmluZSBfX3N1c2Vjb25kc190X2RlZmluZWQKKyNlbmRpZgorCisKKy8qIFRoZSBmZF9zZXQgbWVtYmVyIGlzIHJlcXVpcmVkIHRvIGJlIGFuIGFycmF5IG9mIGxvbmdzLiAgKi8KK3R5cGVkZWYgbG9uZyBpbnQgX19mZF9tYXNrOworCisvKiBTb21lIHZlcnNpb25zIG9mIDxsaW51eC9wb3NpeF90eXBlcy5oPiBkZWZpbmUgdGhpcyBtYWNyb3MuICAqLworI3VuZGVmCV9fTkZEQklUUworLyogSXQncyBlYXNpZXIgdG8gYXNzdW1lIDgtYml0IGJ5dGVzIHRoYW4gdG8gZ2V0IENIQVJfQklULiAgKi8KKyNkZWZpbmUgX19ORkRCSVRTCSg4ICogKGludCkgc2l6ZW9mIChfX2ZkX21hc2spKQorI2RlZmluZQlfX0ZEX0VMVChkKQkoKGQpIC8gX19ORkRCSVRTKQorI2RlZmluZQlfX0ZEX01BU0soZCkJKChfX2ZkX21hc2spIDEgPDwgKChkKSAlIF9fTkZEQklUUykpCisKKy8qIGZkX3NldCBmb3Igc2VsZWN0IGFuZCBwc2VsZWN0LiAgKi8KK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICAvKiBYUEc0LjIgcmVxdWlyZXMgdGhpcyBtZW1iZXIgbmFtZS4gIE90aGVyd2lzZSBhdm9pZCB0aGUgbmFtZQorICAgICAgIGZyb20gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICAqLworI2lmZGVmIF9fVVNFX1hPUEVOCisgICAgX19mZF9tYXNrIGZkc19iaXRzW19fRkRfU0VUU0laRSAvIF9fTkZEQklUU107CisjIGRlZmluZSBfX0ZEU19CSVRTKHNldCkgKChzZXQpLT5mZHNfYml0cykKKyNlbHNlCisgICAgX19mZF9tYXNrIF9fZmRzX2JpdHNbX19GRF9TRVRTSVpFIC8gX19ORkRCSVRTXTsKKyMgZGVmaW5lIF9fRkRTX0JJVFMoc2V0KSAoKHNldCktPl9fZmRzX2JpdHMpCisjZW5kaWYKKyAgfSBmZF9zZXQ7CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgaW4gYGZkX3NldCcuICAqLworI2RlZmluZQlGRF9TRVRTSVpFCQlfX0ZEX1NFVFNJWkUKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIFNvbWV0aW1lcyB0aGUgZmRfc2V0IG1lbWJlciBpcyBhc3N1bWVkIHRvIGhhdmUgdGhpcyB0eXBlLiAgKi8KK3R5cGVkZWYgX19mZF9tYXNrIGZkX21hc2s7CisKKy8qIE51bWJlciBvZiBiaXRzIHBlciB3b3JkIG9mIGBmZF9zZXQnIChzb21lIGNvZGUgYXNzdW1lcyB0aGlzIGlzIDMyKS4gICovCisjIGRlZmluZSBORkRCSVRTCQlfX05GREJJVFMKKyNlbmRpZgorCisKKy8qIEFjY2VzcyBtYWNyb3MgZm9yIGBmZF9zZXQnLiAgKi8KKyNkZWZpbmUJRkRfU0VUKGZkLCBmZHNldHApCV9fRkRfU0VUIChmZCwgZmRzZXRwKQorI2RlZmluZQlGRF9DTFIoZmQsIGZkc2V0cCkJX19GRF9DTFIgKGZkLCBmZHNldHApCisjZGVmaW5lCUZEX0lTU0VUKGZkLCBmZHNldHApCV9fRkRfSVNTRVQgKGZkLCBmZHNldHApCisjZGVmaW5lCUZEX1pFUk8oZmRzZXRwKQkJX19GRF9aRVJPIChmZHNldHApCisKKworX19CRUdJTl9ERUNMUworCisvKiBDaGVjayB0aGUgZmlyc3QgTkZEUyBkZXNjcmlwdG9ycyBlYWNoIGluIFJFQURGRFMgKGlmIG5vdCBOVUxMKSBmb3IgcmVhZAorICAgcmVhZGluZXNzLCBpbiBXUklURUZEUyAoaWYgbm90IE5VTEwpIGZvciB3cml0ZSByZWFkaW5lc3MsIGFuZCBpbiBFWENFUFRGRFMKKyAgIChpZiBub3QgTlVMTCkgZm9yIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbnMuICBJZiBUSU1FT1VUIGlzIG5vdCBOVUxMLCB0aW1lIG91dAorICAgYWZ0ZXIgd2FpdGluZyB0aGUgaW50ZXJ2YWwgc3BlY2lmaWVkIHRoZXJlaW4uICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVhZHkKKyAgIGRlc2NyaXB0b3JzLCBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgc2VsZWN0IChpbnQgX19uZmRzLCBmZF9zZXQgKl9fcmVzdHJpY3QgX19yZWFkZmRzLAorCQkgICBmZF9zZXQgKl9fcmVzdHJpY3QgX193cml0ZWZkcywKKwkJICAgZmRfc2V0ICpfX3Jlc3RyaWN0IF9fZXhjZXB0ZmRzLAorCQkgICBzdHJ1Y3QgdGltZXZhbCAqX19yZXN0cmljdCBfX3RpbWVvdXQpOworCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogU2FtZSBhcyBhYm92ZSBvbmx5IHRoYXQgdGhlIFRJTUVPVVQgdmFsdWUgaXMgZ2l2ZW4gd2l0aCBoaWdoZXIKKyAgIHJlc29sdXRpb24gYW5kIGEgc2lnbWFzayB3aGljaCBpcyBiZWVuIHNldCB0ZW1wb3JhcmlseS4gIFRoaXMgdmVyc2lvbgorICAgc2hvdWxkIGJlIHVzZWQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwc2VsZWN0IChpbnQgX19uZmRzLCBmZF9zZXQgKl9fcmVzdHJpY3QgX19yZWFkZmRzLAorCQkgICAgZmRfc2V0ICpfX3Jlc3RyaWN0IF9fd3JpdGVmZHMsCisJCSAgICBmZF9zZXQgKl9fcmVzdHJpY3QgX19leGNlcHRmZHMsCisJCSAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVzdHJpY3QgX190aW1lb3V0LAorCQkgICAgY29uc3QgX19zaWdzZXRfdCAqX19yZXN0cmljdCBfX3NpZ21hc2spOworI2VuZGlmCisKKworLyogRGVmaW5lIHNvbWUgaW5saW5lcyBoZWxwaW5nIHRvIGNhdGNoIGNvbW1vbiBwcm9ibGVtcy4gICovCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDAgJiYgZGVmaW5lZCBfX0dOVUNfXworIyBpbmNsdWRlIDxiaXRzL3NlbGVjdDIuaD4KKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3NlbGVjdC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zZW0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3NlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YTU3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zZW0uaApAQCAtMCwwICsxLDY5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMCwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NFTV9ICisjZGVmaW5lIF9TWVNfU0VNX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2RlZmluZSBfX25lZWRfc2l6ZV90CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIEdldCBjb21tb24gZGVmaW5pdGlvbiBvZiBTeXN0ZW0gViBzdHlsZSBJUEMuICAqLworI2luY2x1ZGUgPHN5cy9pcGMuaD4KKworLyogR2V0IHN5c3RlbSBkZXBlbmRlbnQgZGVmaW5pdGlvbiBvZiBgc3RydWN0IHNlbWlkX2RzJyBhbmQgbW9yZS4gICovCisjaW5jbHVkZSA8Yml0cy9zZW0uaD4KKworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgX19uZWVkX3RpbWVzcGVjCisjIGluY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIFN5c3RlbSBWIHN0eWxlIElQQyBmdW5jdGlvbnMgaW1wbGVtZW50IGEgc2VtYXBob3JlCisgICBoYW5kbGluZy4gIFRoZSBkZWZpbml0aW9uIGlzIGZvdW5kIGluIFhQRzIuICAqLworCisvKiBTdHJ1Y3R1cmUgdXNlZCBmb3IgYXJndW1lbnQgdG8gYHNlbW9wJyB0byBkZXNjcmliZSBvcGVyYXRpb25zLiAgKi8KK3N0cnVjdCBzZW1idWYKK3sKKyAgdW5zaWduZWQgc2hvcnQgaW50IHNlbV9udW07CS8qIHNlbWFwaG9yZSBudW1iZXIgKi8KKyAgc2hvcnQgaW50IHNlbV9vcDsJCS8qIHNlbWFwaG9yZSBvcGVyYXRpb24gKi8KKyAgc2hvcnQgaW50IHNlbV9mbGc7CQkvKiBvcGVyYXRpb24gZmxhZyAqLworfTsKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFNlbWFwaG9yZSBjb250cm9sIG9wZXJhdGlvbi4gICovCitleHRlcm4gaW50IHNlbWN0bCAoaW50IF9fc2VtaWQsIGludCBfX3NlbW51bSwgaW50IF9fY21kLCAuLi4pIF9fVEhST1c7CisKKy8qIEdldCBzZW1hcGhvcmUuICAqLworZXh0ZXJuIGludCBzZW1nZXQgKGtleV90IF9fa2V5LCBpbnQgX19uc2VtcywgaW50IF9fc2VtZmxnKSBfX1RIUk9XOworCisvKiBPcGVyYXRlIG9uIHNlbWFwaG9yZS4gICovCitleHRlcm4gaW50IHNlbW9wIChpbnQgX19zZW1pZCwgc3RydWN0IHNlbWJ1ZiAqX19zb3BzLCBzaXplX3QgX19uc29wcykgX19USFJPVzsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogT3BlcmF0ZSBvbiBzZW1hcGhvcmUgd2l0aCB0aW1lb3V0LiAgKi8KK2V4dGVybiBpbnQgc2VtdGltZWRvcCAoaW50IF9fc2VtaWQsIHN0cnVjdCBzZW1idWYgKl9fc29wcywgc2l6ZV90IF9fbnNvcHMsCisJCSAgICAgICBfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX190aW1lb3V0KSBfX1RIUk9XOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvc2VtLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3NlbmRmaWxlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zZW5kZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTM2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zZW5kZmlsZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIHNlbmRmaWxlIC0tIGNvcHkgZGF0YSBkaXJlY3RseSBmcm9tIG9uZSBmaWxlIGRlc2NyaXB0b3IgdG8gYW5vdGhlcgorICAgQ29weXJpZ2h0IChDKSAxOTk4LDk5LDAxLDIwMDIsMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NFTkRGSUxFX0gKKyNkZWZpbmUgX1NZU19TRU5ERklMRV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogU2VuZCB1cCB0byBDT1VOVCBieXRlcyBmcm9tIGZpbGUgYXNzb2NpYXRlZCB3aXRoIElOX0ZEIHN0YXJ0aW5nIGF0CisgICAqT0ZGU0VUIHRvIGRlc2NyaXB0b3IgT1VUX0ZELiAgU2V0ICpPRkZTRVQgdG8gdGhlIElOX0ZEJ3MgZmlsZSBwb3NpdGlvbgorICAgZm9sbG93aW5nIHRoZSByZWFkIGJ5dGVzLiAgSWYgT0ZGU0VUIGlzIGEgbnVsbCBwb2ludGVyLCB1c2UgdGhlIG5vcm1hbAorICAgZmlsZSBwb3NpdGlvbiBpbnN0ZWFkLiAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygd3JpdHRlbiBieXRlcywgb3IgLTEgaW4KKyAgIGNhc2Ugb2YgZXJyb3IuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gc3NpemVfdCBzZW5kZmlsZSAoaW50IF9fb3V0X2ZkLCBpbnQgX19pbl9mZCwgb2ZmX3QgKl9fb2Zmc2V0LAorCQkJIHNpemVfdCBfX2NvdW50KSBfX1RIUk9XOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChzZW5kZmlsZSwKKwkJCSAgICAgICAoaW50IF9fb3V0X2ZkLCBpbnQgX19pbl9mZCwgX19vZmY2NF90ICpfX29mZnNldCwKKwkJCQlzaXplX3QgX19jb3VudCksIHNlbmRmaWxlNjQpOworIyBlbHNlCisjICBkZWZpbmUgc2VuZGZpbGUgc2VuZGZpbGU2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBzc2l6ZV90IHNlbmRmaWxlNjQgKGludCBfX291dF9mZCwgaW50IF9faW5fZmQsIF9fb2ZmNjRfdCAqX19vZmZzZXQsCisJCQkgICBzaXplX3QgX19jb3VudCkgX19USFJPVzsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3lzL3NlbmRmaWxlLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3NobS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc2htLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg2Y2U3NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3NobS5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU0hNX0gKKyNkZWZpbmUgX1NZU19TSE1fSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogR2V0IGNvbW1vbiBkZWZpbml0aW9uIG9mIFN5c3RlbSBWIHN0eWxlIElQQy4gICovCisjaW5jbHVkZSA8c3lzL2lwYy5oPgorCisvKiBHZXQgc3lzdGVtIGRlcGVuZGVudCBkZWZpbml0aW9uIG9mIGBzdHJ1Y3Qgc2htaWRfZHMnIGFuZCBtb3JlLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3NobS5oPgorCisvKiBEZWZpbmUgdHlwZXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkLiAgKi8KKyNkZWZpbmUgX19uZWVkX3RpbWVfdAorI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmZGVmIF9fVVNFX1hPUEVOCisjIGlmbmRlZiBfX3BpZF90X2RlZmluZWQKK3R5cGVkZWYgX19waWRfdCBwaWRfdDsKKyMgIGRlZmluZSBfX3BpZF90X2RlZmluZWQKKyMgZW5kaWYKKyNlbmRpZgkvKiBYL09wZW4gKi8KKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoZSBmb2xsb3dpbmcgU3lzdGVtIFYgc3R5bGUgSVBDIGZ1bmN0aW9ucyBpbXBsZW1lbnQgYSBzaGFyZWQgbWVtb3J5CisgICBmYWNpbGl0eS4gIFRoZSBkZWZpbml0aW9uIGlzIGZvdW5kIGluIFhQRzQuMi4gICovCisKKy8qIFNoYXJlZCBtZW1vcnkgY29udHJvbCBvcGVyYXRpb24uICAqLworZXh0ZXJuIGludCBzaG1jdGwgKGludCBfX3NobWlkLCBpbnQgX19jbWQsIHN0cnVjdCBzaG1pZF9kcyAqX19idWYpIF9fVEhST1c7CisKKy8qIEdldCBzaGFyZWQgbWVtb3J5IHNlZ21lbnQuICAqLworZXh0ZXJuIGludCBzaG1nZXQgKGtleV90IF9fa2V5LCBzaXplX3QgX19zaXplLCBpbnQgX19zaG1mbGcpIF9fVEhST1c7CisKKy8qIEF0dGFjaCBzaGFyZWQgbWVtb3J5IHNlZ21lbnQuICAqLworZXh0ZXJuIHZvaWQgKnNobWF0IChpbnQgX19zaG1pZCwgX19jb25zdCB2b2lkICpfX3NobWFkZHIsIGludCBfX3NobWZsZykKKyAgICAgX19USFJPVzsKKworLyogRGV0YWNoIHNoYXJlZCBtZW1vcnkgc2VnbWVudC4gICovCitleHRlcm4gaW50IHNobWR0IChfX2NvbnN0IHZvaWQgKl9fc2htYWRkcikgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9zaG0uaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc2lnbmFsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTYwMmRhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc2lnbmFsLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPHNpZ25hbC5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc2lnbmFsZmQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3NpZ25hbGZkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWViMjdlZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3NpZ25hbGZkLmgKQEAgLTAsMCArMSw2NiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfU0lHTkFMRkRfSAorI2RlZmluZQlfU1lTX1NJR05BTEZEX0gJMQorCisjZGVmaW5lIF9fbmVlZF9zaWdzZXRfdAorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisKK3N0cnVjdCBzaWduYWxmZF9zaWdpbmZvCit7CisgIHVpbnQzMl90IHNzaV9zaWdubzsKKyAgaW50MzJfdCBzc2lfZXJybm87CisgIGludDMyX3Qgc3NpX2NvZGU7CisgIHVpbnQzMl90IHNzaV9waWQ7CisgIHVpbnQzMl90IHNzaV91aWQ7CisgIGludDMyX3Qgc3NpX2ZkOworICB1aW50MzJfdCBzc2lfdGlkOworICB1aW50MzJfdCBzc2lfYmFuZDsKKyAgdWludDMyX3Qgc3NpX292ZXJydW47CisgIHVpbnQzMl90IHNzaV90cmFwbm87CisgIGludDMyX3Qgc3NpX3N0YXR1czsKKyAgaW50MzJfdCBzc2lfaW50OworICB1aW50NjRfdCBzc2lfcHRyOworICB1aW50NjRfdCBzc2lfdXRpbWU7CisgIHVpbnQ2NF90IHNzaV9zdGltZTsKKyAgdWludDY0X3Qgc3NpX2FkZHI7CisgIHVpbnQ4X3QgX19wYWRbNDhdOworfTsKKworLyogRmxhZ3MgZm9yIHNpZ25hbGZkLiAgKi8KK2VudW0KKyAgeworICAgIFNGRF9DTE9FWEVDID0gMDIwMDAwMDAsCisjZGVmaW5lIFNGRF9DTE9FWEVDIFNGRF9DTE9FWEVDCisgICAgU0ZEX05PTkJMT0NLID0gMDQwMDAKKyNkZWZpbmUgU0ZEX05PTkJMT0NLIFNGRF9OT05CTE9DSworICB9OworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJlcXVlc3Qgbm90aWZpY2F0aW9uIGZvciBkZWxpdmVyeSBvZiBzaWduYWxzIGluIE1BU0sgdG8gYmUKKyAgIHBlcmZvcm1lZCB1c2luZyBkZXNjcmlwdG9yIEZELiovCitleHRlcm4gaW50IHNpZ25hbGZkIChpbnQgX19mZCwgY29uc3Qgc2lnc2V0X3QgKl9fbWFzaywgaW50IF9fZmxhZ3MpCisgIF9fVEhST1cgX19ub25udWxsICgoMikpOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3NpZ25hbGZkLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3NvY2tldC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIxZjU2ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3NvY2tldC5oCkBAIC0wLDAgKzEsMjU2IEBACisvKiBEZWNsYXJhdGlvbnMgb2Ygc29ja2V0IGNvbnN0YW50cywgdHlwZXMsIGFuZCBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTEsOTIsMTk5NC0yMDAxLDIwMDMsMjAwNSwyMDA3LDIwMDgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfU09DS0VUX0gKKyNkZWZpbmUJX1NZU19TT0NLRVRfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjZGVmaW5lCV9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpZmRlZiBfX1VTRV9HTlUKKy8qIEdldCB0aGUgX19zaWdzZXRfdCBkZWZpbml0aW9uLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy9zaWdzZXQuaD4KKyNlbmRpZgorCisKKy8qIFRoaXMgb3BlcmF0aW5nIHN5c3RlbS1zcGVjaWZpYyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBTT0NLXyosIFBGXyosCisgICBBRl8qLCBNU0dfKiwgU09MXyosIGFuZCBTT18qIGNvbnN0YW50cywgYW5kIHRoZSBgc3RydWN0IHNvY2thZGRyJywKKyAgIGBzdHJ1Y3QgbXNnaGRyJywgYW5kIGBzdHJ1Y3QgbGluZ2VyJyB0eXBlcy4gICovCisjaW5jbHVkZSA8Yml0cy9zb2NrZXQuaD4KKworI2lmZGVmIF9fVVNFX0JTRAorLyogVGhpcyBpcyB0aGUgNC4zIEJTRCBgc3RydWN0IHNvY2thZGRyJyBmb3JtYXQsIHdoaWNoIGlzIHVzZWQgYXMgd2lyZQorICAgZm9ybWF0IGluIHRoZSBncm90dHkgb2xkIDQuMyBgdGFsaycgcHJvdG9jb2wuICAqLworc3RydWN0IG9zb2NrYWRkcgorICB7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IHNhX2ZhbWlseTsKKyAgICB1bnNpZ25lZCBjaGFyIHNhX2RhdGFbMTRdOworICB9OworI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZgorICAgYHNodXRkb3duJy4gICovCitlbnVtCit7CisgIFNIVVRfUkQgPSAwLAkJLyogTm8gbW9yZSByZWNlcHRpb25zLiAgKi8KKyNkZWZpbmUgU0hVVF9SRAkJU0hVVF9SRAorICBTSFVUX1dSLAkJLyogTm8gbW9yZSB0cmFuc21pc3Npb25zLiAgKi8KKyNkZWZpbmUgU0hVVF9XUgkJU0hVVF9XUgorICBTSFVUX1JEV1IJCS8qIE5vIG1vcmUgcmVjZXB0aW9ucyBvciB0cmFuc21pc3Npb25zLiAgKi8KKyNkZWZpbmUgU0hVVF9SRFdSCVNIVVRfUkRXUgorfTsKKworLyogVGhpcyBpcyB0aGUgdHlwZSB3ZSB1c2UgZm9yIGdlbmVyaWMgc29ja2V0IGFkZHJlc3MgYXJndW1lbnRzLgorCisgICBXaXRoIEdDQyAyLjcgYW5kIGxhdGVyLCB0aGUgZnVua3kgdW5pb24gY2F1c2VzIHJlZGVjbGFyYXRpb25zIG9yCisgICB1c2VzIHdpdGggYW55IG9mIHRoZSBsaXN0ZWQgdHlwZXMgdG8gYmUgYWxsb3dlZCB3aXRob3V0IGNvbXBsYWludC4KKyAgIEcrKyAyLjcgZG9lcyBub3Qgc3VwcG9ydCB0cmFuc3BhcmVudCB1bmlvbnMgc28gdGhlcmUgd2Ugd2FudCB0aGUKKyAgIG9sZC1zdHlsZSBkZWNsYXJhdGlvbiwgdG9vLiAgKi8KKyNpZiBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8ICFfX0dOVUNfUFJFUkVRICgyLCA3KSB8fCAhZGVmaW5lZCBfX1VTRV9HTlUKKyMgZGVmaW5lIF9fU09DS0FERFJfQVJHCQlzdHJ1Y3Qgc29ja2FkZHIgKl9fcmVzdHJpY3QKKyMgZGVmaW5lIF9fQ09OU1RfU09DS0FERFJfQVJHCV9fY29uc3Qgc3RydWN0IHNvY2thZGRyICoKKyNlbHNlCisvKiBBZGQgbW9yZSBgc3RydWN0IHNvY2thZGRyX0FGJyB0eXBlcyBoZXJlIGFzIG5lY2Vzc2FyeS4KKyAgIFRoZXNlIGFyZSBhbGwgdGhlIG9uZXMgSSBmb3VuZCBvbiBOZXRCU0QgYW5kIExpbnV4LiAgKi8KKyMgZGVmaW5lIF9fU09DS0FERFJfQUxMVFlQRVMgXAorICBfX1NPQ0tBRERSX09ORVRZUEUgKHNvY2thZGRyKSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfYXQpIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl9heDI1KSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfZGwpIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl9lb24pIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl9pbikgXAorICBfX1NPQ0tBRERSX09ORVRZUEUgKHNvY2thZGRyX2luNikgXAorICBfX1NPQ0tBRERSX09ORVRZUEUgKHNvY2thZGRyX2luYXJwKSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfaXB4KSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfaXNvKSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfbnMpIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl91bikgXAorICBfX1NPQ0tBRERSX09ORVRZUEUgKHNvY2thZGRyX3gyNSkKKworIyBkZWZpbmUgX19TT0NLQUREUl9PTkVUWVBFKHR5cGUpIHN0cnVjdCB0eXBlICpfX3Jlc3RyaWN0IF9fIyN0eXBlIyNfXzsKK3R5cGVkZWYgdW5pb24geyBfX1NPQ0tBRERSX0FMTFRZUEVTCisJICAgICAgfSBfX1NPQ0tBRERSX0FSRyBfX2F0dHJpYnV0ZV9fICgoX190cmFuc3BhcmVudF91bmlvbl9fKSk7CisjIHVuZGVmIF9fU09DS0FERFJfT05FVFlQRQorIyBkZWZpbmUgX19TT0NLQUREUl9PTkVUWVBFKHR5cGUpIF9fY29uc3Qgc3RydWN0IHR5cGUgKl9fcmVzdHJpY3QgX18jI3R5cGUjI19fOwordHlwZWRlZiB1bmlvbiB7IF9fU09DS0FERFJfQUxMVFlQRVMKKwkgICAgICB9IF9fQ09OU1RfU09DS0FERFJfQVJHIF9fYXR0cmlidXRlX18gKChfX3RyYW5zcGFyZW50X3VuaW9uX18pKTsKKyMgdW5kZWYgX19TT0NLQUREUl9PTkVUWVBFCisjZW5kaWYKKworCisvKiBDcmVhdGUgYSBuZXcgc29ja2V0IG9mIHR5cGUgVFlQRSBpbiBkb21haW4gRE9NQUlOLCB1c2luZworICAgcHJvdG9jb2wgUFJPVE9DT0wuICBJZiBQUk9UT0NPTCBpcyB6ZXJvLCBvbmUgaXMgY2hvc2VuIGF1dG9tYXRpY2FsbHkuCisgICBSZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgbmV3IHNvY2tldCwgb3IgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IHNvY2tldCAoaW50IF9fZG9tYWluLCBpbnQgX190eXBlLCBpbnQgX19wcm90b2NvbCkgX19USFJPVzsKKworLyogQ3JlYXRlIHR3byBuZXcgc29ja2V0cywgb2YgdHlwZSBUWVBFIGluIGRvbWFpbiBET01BSU4gYW5kIHVzaW5nCisgICBwcm90b2NvbCBQUk9UT0NPTCwgd2hpY2ggYXJlIGNvbm5lY3RlZCB0byBlYWNoIG90aGVyLCBhbmQgcHV0IGZpbGUKKyAgIGRlc2NyaXB0b3JzIGZvciB0aGVtIGluIEZEU1swXSBhbmQgRkRTWzFdLiAgSWYgUFJPVE9DT0wgaXMgemVybywKKyAgIG9uZSB3aWxsIGJlIGNob3NlbiBhdXRvbWF0aWNhbGx5LiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIGludCBzb2NrZXRwYWlyIChpbnQgX19kb21haW4sIGludCBfX3R5cGUsIGludCBfX3Byb3RvY29sLAorCQkgICAgICAgaW50IF9fZmRzWzJdKSBfX1RIUk9XOworCisvKiBHaXZlIHRoZSBzb2NrZXQgRkQgdGhlIGxvY2FsIGFkZHJlc3MgQUREUiAod2hpY2ggaXMgTEVOIGJ5dGVzIGxvbmcpLiAgKi8KK2V4dGVybiBpbnQgYmluZCAoaW50IF9fZmQsIF9fQ09OU1RfU09DS0FERFJfQVJHIF9fYWRkciwgc29ja2xlbl90IF9fbGVuKQorICAgICBfX1RIUk9XOworCisvKiBQdXQgdGhlIGxvY2FsIGFkZHJlc3Mgb2YgRkQgaW50byAqQUREUiBhbmQgaXRzIGxlbmd0aCBpbiAqTEVOLiAgKi8KK2V4dGVybiBpbnQgZ2V0c29ja25hbWUgKGludCBfX2ZkLCBfX1NPQ0tBRERSX0FSRyBfX2FkZHIsCisJCQlzb2NrbGVuX3QgKl9fcmVzdHJpY3QgX19sZW4pIF9fVEhST1c7CisKKy8qIE9wZW4gYSBjb25uZWN0aW9uIG9uIHNvY2tldCBGRCB0byBwZWVyIGF0IEFERFIgKHdoaWNoIExFTiBieXRlcyBsb25nKS4KKyAgIEZvciBjb25uZWN0aW9ubGVzcyBzb2NrZXQgdHlwZXMsIGp1c3Qgc2V0IHRoZSBkZWZhdWx0IGFkZHJlc3MgdG8gc2VuZCB0bworICAgYW5kIHRoZSBvbmx5IGFkZHJlc3MgZnJvbSB3aGljaCB0byBhY2NlcHQgdHJhbnNtaXNzaW9ucy4KKyAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBjb25uZWN0IChpbnQgX19mZCwgX19DT05TVF9TT0NLQUREUl9BUkcgX19hZGRyLCBzb2NrbGVuX3QgX19sZW4pOworCisvKiBQdXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHBlZXIgY29ubmVjdGVkIHRvIHNvY2tldCBGRCBpbnRvICpBRERSCisgICAod2hpY2ggaXMgKkxFTiBieXRlcyBsb25nKSwgYW5kIGl0cyBhY3R1YWwgbGVuZ3RoIGludG8gKkxFTi4gICovCitleHRlcm4gaW50IGdldHBlZXJuYW1lIChpbnQgX19mZCwgX19TT0NLQUREUl9BUkcgX19hZGRyLAorCQkJc29ja2xlbl90ICpfX3Jlc3RyaWN0IF9fbGVuKSBfX1RIUk9XOworCisKKy8qIFNlbmQgTiBieXRlcyBvZiBCVUYgdG8gc29ja2V0IEZELiAgUmV0dXJucyB0aGUgbnVtYmVyIHNlbnQgb3IgLTEuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3Qgc2VuZCAoaW50IF9fZmQsIF9fY29uc3Qgdm9pZCAqX19idWYsIHNpemVfdCBfX24sIGludCBfX2ZsYWdzKTsKKworLyogUmVhZCBOIGJ5dGVzIGludG8gQlVGIGZyb20gc29ja2V0IEZELgorICAgUmV0dXJucyB0aGUgbnVtYmVyIHJlYWQgb3IgLTEgZm9yIGVycm9ycy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCByZWN2IChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX24sIGludCBfX2ZsYWdzKTsKKworLyogU2VuZCBOIGJ5dGVzIG9mIEJVRiBvbiBzb2NrZXQgRkQgdG8gcGVlciBhdCBhZGRyZXNzIEFERFIgKHdoaWNoIGlzCisgICBBRERSX0xFTiBieXRlcyBsb25nKS4gIFJldHVybnMgdGhlIG51bWJlciBzZW50LCBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHNlbmR0byAoaW50IF9fZmQsIF9fY29uc3Qgdm9pZCAqX19idWYsIHNpemVfdCBfX24sCisJCSAgICAgICBpbnQgX19mbGFncywgX19DT05TVF9TT0NLQUREUl9BUkcgX19hZGRyLAorCQkgICAgICAgc29ja2xlbl90IF9fYWRkcl9sZW4pOworCisvKiBSZWFkIE4gYnl0ZXMgaW50byBCVUYgdGhyb3VnaCBzb2NrZXQgRkQuCisgICBJZiBBRERSIGlzIG5vdCBOVUxMLCBmaWxsIGluICpBRERSX0xFTiBieXRlcyBvZiBpdCB3aXRoIHRoYSBhZGRyZXNzIG9mCisgICB0aGUgc2VuZGVyLCBhbmQgc3RvcmUgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBhZGRyZXNzIGluICpBRERSX0xFTi4KKyAgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xIGZvciBlcnJvcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3QgcmVjdmZyb20gKGludCBfX2ZkLCB2b2lkICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19uLAorCQkJIGludCBfX2ZsYWdzLCBfX1NPQ0tBRERSX0FSRyBfX2FkZHIsCisJCQkgc29ja2xlbl90ICpfX3Jlc3RyaWN0IF9fYWRkcl9sZW4pOworCisKKy8qIFNlbmQgYSBtZXNzYWdlIGRlc2NyaWJlZCBNRVNTQUdFIG9uIHNvY2tldCBGRC4KKyAgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBzZW50LCBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHNlbmRtc2cgKGludCBfX2ZkLCBfX2NvbnN0IHN0cnVjdCBtc2doZHIgKl9fbWVzc2FnZSwKKwkJCWludCBfX2ZsYWdzKTsKKworLyogUmVjZWl2ZSBhIG1lc3NhZ2UgYXMgZGVzY3JpYmVkIGJ5IE1FU1NBR0UgZnJvbSBzb2NrZXQgRkQuCisgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHJlY3Ztc2cgKGludCBfX2ZkLCBzdHJ1Y3QgbXNnaGRyICpfX21lc3NhZ2UsIGludCBfX2ZsYWdzKTsKKworCisvKiBQdXQgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHNvY2tldCBGRCdzIG9wdGlvbiBPUFROQU1FIGF0IHByb3RvY29sIGxldmVsIExFVkVMCisgICBpbnRvIE9QVFZBTCAod2hpY2ggaXMgKk9QVExFTiBieXRlcyBsb25nKSwgYW5kIHNldCAqT1BUTEVOIHRvIHRoZSB2YWx1ZSdzCisgICBhY3R1YWwgbGVuZ3RoLiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIGludCBnZXRzb2Nrb3B0IChpbnQgX19mZCwgaW50IF9fbGV2ZWwsIGludCBfX29wdG5hbWUsCisJCSAgICAgICB2b2lkICpfX3Jlc3RyaWN0IF9fb3B0dmFsLAorCQkgICAgICAgc29ja2xlbl90ICpfX3Jlc3RyaWN0IF9fb3B0bGVuKSBfX1RIUk9XOworCisvKiBTZXQgc29ja2V0IEZEJ3Mgb3B0aW9uIE9QVE5BTUUgYXQgcHJvdG9jb2wgbGV2ZWwgTEVWRUwKKyAgIHRvICpPUFRWQUwgKHdoaWNoIGlzIE9QVExFTiBieXRlcyBsb25nKS4KKyAgIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgc2V0c29ja29wdCAoaW50IF9fZmQsIGludCBfX2xldmVsLCBpbnQgX19vcHRuYW1lLAorCQkgICAgICAgX19jb25zdCB2b2lkICpfX29wdHZhbCwgc29ja2xlbl90IF9fb3B0bGVuKSBfX1RIUk9XOworCisKKy8qIFByZXBhcmUgdG8gYWNjZXB0IGNvbm5lY3Rpb25zIG9uIHNvY2tldCBGRC4KKyAgIE4gY29ubmVjdGlvbiByZXF1ZXN0cyB3aWxsIGJlIHF1ZXVlZCBiZWZvcmUgZnVydGhlciByZXF1ZXN0cyBhcmUgcmVmdXNlZC4KKyAgIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgbGlzdGVuIChpbnQgX19mZCwgaW50IF9fbikgX19USFJPVzsKKworLyogQXdhaXQgYSBjb25uZWN0aW9uIG9uIHNvY2tldCBGRC4KKyAgIFdoZW4gYSBjb25uZWN0aW9uIGFycml2ZXMsIG9wZW4gYSBuZXcgc29ja2V0IHRvIGNvbW11bmljYXRlIHdpdGggaXQsCisgICBzZXQgKkFERFIgKHdoaWNoIGlzICpBRERSX0xFTiBieXRlcyBsb25nKSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgY29ubmVjdGluZworICAgcGVlciBhbmQgKkFERFJfTEVOIHRvIHRoZSBhZGRyZXNzJ3MgYWN0dWFsIGxlbmd0aCwgYW5kIHJldHVybiB0aGUKKyAgIG5ldyBzb2NrZXQncyBkZXNjcmlwdG9yLCBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgYWNjZXB0IChpbnQgX19mZCwgX19TT0NLQUREUl9BUkcgX19hZGRyLAorCQkgICBzb2NrbGVuX3QgKl9fcmVzdHJpY3QgX19hZGRyX2xlbik7CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFNpbWlsYXIgdG8gJ2FjY2VwdCcgYnV0IHRha2VzIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIHRvIHNwZWNpZnkgZmxhZ3MuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBhY2NlcHQ0IChpbnQgX19mZCwgX19TT0NLQUREUl9BUkcgX19hZGRyLAorCQkgICAgc29ja2xlbl90ICpfX3Jlc3RyaWN0IF9fYWRkcl9sZW4sIGludCBfX2ZsYWdzKTsKKyNlbmRpZgorCisvKiBTaHV0IGRvd24gYWxsIG9yIHBhcnQgb2YgdGhlIGNvbm5lY3Rpb24gb3BlbiBvbiBzb2NrZXQgRkQuCisgICBIT1cgZGV0ZXJtaW5lcyB3aGF0IHRvIHNodXQgZG93bjoKKyAgICAgU0hVVF9SRCAgID0gTm8gbW9yZSByZWNlcHRpb25zOworICAgICBTSFVUX1dSICAgPSBObyBtb3JlIHRyYW5zbWlzc2lvbnM7CisgICAgIFNIVVRfUkRXUiA9IE5vIG1vcmUgcmVjZXB0aW9ucyBvciB0cmFuc21pc3Npb25zLgorICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIGludCBzaHV0ZG93biAoaW50IF9fZmQsIGludCBfX2hvdykgX19USFJPVzsKKworCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogRGV0ZXJtaW5lIHdoZXRlciBzb2NrZXQgaXMgYXQgYSBvdXQtb2YtYmFuZCBtYXJrLiAgKi8KK2V4dGVybiBpbnQgc29ja2F0bWFyayAoaW50IF9fZmQpIF9fVEhST1c7CisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfTUlTQworLyogRkRUWVBFIGlzIFNfSUZTT0NLIG9yIGFub3RoZXIgU19JRiogbWFjcm8gZGVmaW5lZCBpbiA8c3lzL3N0YXQuaD47CisgICByZXR1cm5zIDEgaWYgRkQgaXMgb3BlbiBvbiBhbiBvYmplY3Qgb2YgdGhlIGluZGljYXRlZCB0eXBlLCAwIGlmIG5vdCwKKyAgIG9yIC0xIGZvciBlcnJvcnMgKHNldHRpbmcgZXJybm8pLiAgKi8KK2V4dGVybiBpbnQgaXNmZHR5cGUgKGludCBfX2ZkLCBpbnQgX19mZHR5cGUpIF9fVEhST1c7CisjZW5kaWYKKworCisvKiBEZWZpbmUgc29tZSBtYWNyb3MgaGVscGluZyB0byBjYXRjaCBidWZmZXIgb3ZlcmZsb3dzLiAgKi8KKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUKKyMgaW5jbHVkZSA8Yml0cy9zb2NrZXQyLmg+CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9zb2NrZXQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc29ja2V0dmFyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zb2NrZXR2YXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTc3MTU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc29ja2V0dmFyLmgKQEAgLTAsMCArMSwzIEBACisvKiBUaGlzIGhlYWRlciBpcyB1c2VkIG9uIG1hbnkgc3lzdGVtcyBidXQgZm9yIEdOVSB3ZSBoYXZlIGV2ZXJ5dGhpbmcKKyAgIGFscmVhZHkgZGVmaW5lZCBpbiB0aGUgc3RhbmRhcmQgaGVhZGVyLiAgKi8KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zb3VuZGNhcmQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3NvdW5kY2FyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZGU5ODYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zb3VuZGNhcmQuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zdGF0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzODllZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3N0YXQuaApAQCAtMCwwICsxLDUzOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTk1LTIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJUE9TSVggU3RhbmRhcmQ6IDUuNiBGaWxlIENoYXJhY3RlcmlzdGljcwk8c3lzL3N0YXQuaD4KKyAqLworCisjaWZuZGVmCV9TWVNfU1RBVF9ICisjZGVmaW5lCV9TWVNfU1RBVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CQkvKiBGb3IgX19tb2RlX3QgYW5kIF9fZGV2X3QuICAqLworCisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksgfHwgZGVmaW5lZCBfX1VTRV9NSVNDIFwKKwkgfHwgZGVmaW5lZCBfX1VTRV9BVEZJTEUKKyMgaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKyMgIGRlZmluZSBfX25lZWRfdGltZV90CisjIGVuZGlmCisjIGlmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX0FURklMRQorIyAgZGVmaW5lIF9fbmVlZF90aW1lc3BlYworIyBlbmRpZgorIyBpbmNsdWRlIDx0aW1lLmg+CQkvKiBGb3IgdGltZV90IHJlc3AuIHRpbWVzcGVjLiAgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIFRoZSBTaW5nbGUgVW5peCBzcGVjaWZpY2F0aW9uIHNheXMgdGhhdCBzb21lIG1vcmUgdHlwZXMgYXJlCisgICBhdmFpbGFibGUgaGVyZS4gICovCisjIGlmbmRlZiBfX2Rldl90X2RlZmluZWQKK3R5cGVkZWYgX19kZXZfdCBkZXZfdDsKKyMgIGRlZmluZSBfX2Rldl90X2RlZmluZWQKKyMgZW5kaWYKKworIyBpZm5kZWYgX19naWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fZ2lkX3QgZ2lkX3Q7CisjICBkZWZpbmUgX19naWRfdF9kZWZpbmVkCisjIGVuZGlmCisKKyMgaWZuZGVmIF9faW5vX3RfZGVmaW5lZAorIyAgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX19pbm9fdCBpbm9fdDsKKyMgIGVsc2UKK3R5cGVkZWYgX19pbm82NF90IGlub190OworIyAgZW5kaWYKKyMgIGRlZmluZSBfX2lub190X2RlZmluZWQKKyMgZW5kaWYKKworIyBpZm5kZWYgX19tb2RlX3RfZGVmaW5lZAordHlwZWRlZiBfX21vZGVfdCBtb2RlX3Q7CisjICBkZWZpbmUgX19tb2RlX3RfZGVmaW5lZAorIyBlbmRpZgorCisjIGlmbmRlZiBfX25saW5rX3RfZGVmaW5lZAordHlwZWRlZiBfX25saW5rX3QgbmxpbmtfdDsKKyMgIGRlZmluZSBfX25saW5rX3RfZGVmaW5lZAorIyBlbmRpZgorCisjIGlmbmRlZiBfX29mZl90X2RlZmluZWQKKyMgIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0Cit0eXBlZGVmIF9fb2ZmX3Qgb2ZmX3Q7CisjICBlbHNlCit0eXBlZGVmIF9fb2ZmNjRfdCBvZmZfdDsKKyMgIGVuZGlmCisjICBkZWZpbmUgX19vZmZfdF9kZWZpbmVkCisjIGVuZGlmCisKKyMgaWZuZGVmIF9fdWlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3VpZF90IHVpZF90OworIyAgZGVmaW5lIF9fdWlkX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCS8qIFgvT3BlbiAqLworCisjaWZkZWYgX19VU0VfVU5JWDk4CisjIGlmbmRlZiBfX2Jsa2NudF90X2RlZmluZWQKKyMgIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0Cit0eXBlZGVmIF9fYmxrY250X3QgYmxrY250X3Q7CisjICBlbHNlCit0eXBlZGVmIF9fYmxrY250NjRfdCBibGtjbnRfdDsKKyMgIGVuZGlmCisjICBkZWZpbmUgX19ibGtjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisKKyMgaWZuZGVmIF9fYmxrc2l6ZV90X2RlZmluZWQKK3R5cGVkZWYgX19ibGtzaXplX3QgYmxrc2l6ZV90OworIyAgZGVmaW5lIF9fYmxrc2l6ZV90X2RlZmluZWQKKyMgZW5kaWYKKyNlbmRpZgkvKiBVbml4OTggKi8KKworX19CRUdJTl9ERUNMUworCisjaW5jbHVkZSA8Yml0cy9zdGF0Lmg+CisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorIyBkZWZpbmUgU19JRk1UCQlfX1NfSUZNVAorIyBkZWZpbmUgU19JRkRJUglfX1NfSUZESVIKKyMgZGVmaW5lIFNfSUZDSFIJX19TX0lGQ0hSCisjIGRlZmluZSBTX0lGQkxLCV9fU19JRkJMSworIyBkZWZpbmUgU19JRlJFRwlfX1NfSUZSRUcKKyMgaWZkZWYgX19TX0lGSUZPCisjICBkZWZpbmUgU19JRklGTwlfX1NfSUZJRk8KKyMgZW5kaWYKKyMgaWZkZWYgX19TX0lGTE5LCisjICBkZWZpbmUgU19JRkxOSwlfX1NfSUZMTksKKyMgZW5kaWYKKyMgaWYgKGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OCkgXAorICAgICAmJiBkZWZpbmVkIF9fU19JRlNPQ0sKKyMgIGRlZmluZSBTX0lGU09DSwlfX1NfSUZTT0NLCisjIGVuZGlmCisjZW5kaWYKKworLyogVGVzdCBtYWNyb3MgZm9yIGZpbGUgdHlwZXMuCSovCisKKyNkZWZpbmUJX19TX0lTVFlQRShtb2RlLCBtYXNrKQkoKChtb2RlKSAmIF9fU19JRk1UKSA9PSAobWFzaykpCisKKyNkZWZpbmUJU19JU0RJUihtb2RlKQkgX19TX0lTVFlQRSgobW9kZSksIF9fU19JRkRJUikKKyNkZWZpbmUJU19JU0NIUihtb2RlKQkgX19TX0lTVFlQRSgobW9kZSksIF9fU19JRkNIUikKKyNkZWZpbmUJU19JU0JMSyhtb2RlKQkgX19TX0lTVFlQRSgobW9kZSksIF9fU19JRkJMSykKKyNkZWZpbmUJU19JU1JFRyhtb2RlKQkgX19TX0lTVFlQRSgobW9kZSksIF9fU19JRlJFRykKKyNpZmRlZiBfX1NfSUZJRk8KKyMgZGVmaW5lIFNfSVNGSUZPKG1vZGUpCSBfX1NfSVNUWVBFKChtb2RlKSwgX19TX0lGSUZPKQorI2VuZGlmCisjaWZkZWYgX19TX0lGTE5LCisjIGRlZmluZSBTX0lTTE5LKG1vZGUpCSBfX1NfSVNUWVBFKChtb2RlKSwgX19TX0lGTE5LKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCAmJiAhZGVmaW5lZCBfX1NfSUZMTksKKyMgZGVmaW5lIFNfSVNMTksobW9kZSkgIDAKKyNlbmRpZgorCisjaWYgKGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfVU5JWDk4IHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySykgXAorICAgICYmIGRlZmluZWQgX19TX0lGU09DSworIyBkZWZpbmUgU19JU1NPQ0sobW9kZSkgX19TX0lTVFlQRSgobW9kZSksIF9fU19JRlNPQ0spCisjZWxpZiBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKyMgZGVmaW5lIFNfSVNTT0NLKG1vZGUpIDAKKyNlbmRpZgorCisvKiBUaGVzZSBhcmUgZnJvbSBQT1NJWC4xYi4gIElmIHRoZSBvYmplY3RzIGFyZSBub3QgaW1wbGVtZW50ZWQgdXNpbmcgc2VwYXJhdGUKKyAgIGRpc3RpbmN0IGZpbGUgdHlwZXMsIHRoZSBtYWNyb3MgYWx3YXlzIHdpbGwgZXZhbHVhdGUgdG8gemVyby4gIFVubGlrZSB0aGUKKyAgIG90aGVyIFNfKiBtYWNyb3MgdGhlIGZvbGxvd2luZyB0aHJlZSB0YWtlIGEgcG9pbnRlciB0byBhIGBzdHJ1Y3Qgc3RhdCcKKyAgIG9iamVjdCBhcyB0aGUgYXJndW1lbnQuICAqLworI2lmZGVmCV9fVVNFX1BPU0lYMTk5MzA5CisjIGRlZmluZSBTX1RZUEVJU01RKGJ1ZikgX19TX1RZUEVJU01RKGJ1ZikKKyMgZGVmaW5lIFNfVFlQRUlTU0VNKGJ1ZikgX19TX1RZUEVJU1NFTShidWYpCisjIGRlZmluZSBTX1RZUEVJU1NITShidWYpIF9fU19UWVBFSVNTSE0oYnVmKQorI2VuZGlmCisKKworLyogUHJvdGVjdGlvbiBiaXRzLiAgKi8KKworI2RlZmluZQlTX0lTVUlEIF9fU19JU1VJRAkvKiBTZXQgdXNlciBJRCBvbiBleGVjdXRpb24uICAqLworI2RlZmluZQlTX0lTR0lECV9fU19JU0dJRAkvKiBTZXQgZ3JvdXAgSUQgb24gZXhlY3V0aW9uLiAgKi8KKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisvKiBTYXZlIHN3YXBwZWQgdGV4dCBhZnRlciB1c2UgKHN0aWNreSBiaXQpLiAgVGhpcyBpcyBwcmV0dHkgd2VsbCBvYnNvbGV0ZS4gICovCisjIGRlZmluZSBTX0lTVlRYCV9fU19JU1ZUWAorI2VuZGlmCisKKyNkZWZpbmUJU19JUlVTUglfX1NfSVJFQUQJLyogUmVhZCBieSBvd25lci4gICovCisjZGVmaW5lCVNfSVdVU1IJX19TX0lXUklURQkvKiBXcml0ZSBieSBvd25lci4gICovCisjZGVmaW5lCVNfSVhVU1IJX19TX0lFWEVDCS8qIEV4ZWN1dGUgYnkgb3duZXIuICAqLworLyogUmVhZCwgd3JpdGUsIGFuZCBleGVjdXRlIGJ5IG93bmVyLiAgKi8KKyNkZWZpbmUJU19JUldYVQkoX19TX0lSRUFEfF9fU19JV1JJVEV8X19TX0lFWEVDKQorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDICYmIGRlZmluZWQgX19VU0VfQlNECisjIGRlZmluZSBTX0lSRUFECVNfSVJVU1IKKyMgZGVmaW5lIFNfSVdSSVRFCVNfSVdVU1IKKyMgZGVmaW5lIFNfSUVYRUMJU19JWFVTUgorI2VuZGlmCisKKyNkZWZpbmUJU19JUkdSUAkoU19JUlVTUiA+PiAzKQkvKiBSZWFkIGJ5IGdyb3VwLiAgKi8KKyNkZWZpbmUJU19JV0dSUAkoU19JV1VTUiA+PiAzKQkvKiBXcml0ZSBieSBncm91cC4gICovCisjZGVmaW5lCVNfSVhHUlAJKFNfSVhVU1IgPj4gMykJLyogRXhlY3V0ZSBieSBncm91cC4gICovCisvKiBSZWFkLCB3cml0ZSwgYW5kIGV4ZWN1dGUgYnkgZ3JvdXAuICAqLworI2RlZmluZQlTX0lSV1hHCShTX0lSV1hVID4+IDMpCisKKyNkZWZpbmUJU19JUk9USAkoU19JUkdSUCA+PiAzKQkvKiBSZWFkIGJ5IG90aGVycy4gICovCisjZGVmaW5lCVNfSVdPVEgJKFNfSVdHUlAgPj4gMykJLyogV3JpdGUgYnkgb3RoZXJzLiAgKi8KKyNkZWZpbmUJU19JWE9USAkoU19JWEdSUCA+PiAzKQkvKiBFeGVjdXRlIGJ5IG90aGVycy4gICovCisvKiBSZWFkLCB3cml0ZSwgYW5kIGV4ZWN1dGUgYnkgb3RoZXJzLiAgKi8KKyNkZWZpbmUJU19JUldYTwkoU19JUldYRyA+PiAzKQorCisKKyNpZmRlZglfX1VTRV9CU0QKKy8qIE1hY3JvcyBmb3IgY29tbW9uIG1vZGUgYml0IG1hc2tzLiAgKi8KKyMgZGVmaW5lIEFDQ0VTU1BFUk1TIChTX0lSV1hVfFNfSVJXWEd8U19JUldYTykgLyogMDc3NyAqLworIyBkZWZpbmUgQUxMUEVSTVMgKFNfSVNVSUR8U19JU0dJRHxTX0lTVlRYfFNfSVJXWFV8U19JUldYR3xTX0lSV1hPKS8qIDA3Nzc3ICovCisjIGRlZmluZSBERUZGSUxFTU9ERSAoU19JUlVTUnxTX0lXVVNSfFNfSVJHUlB8U19JV0dSUHxTX0lST1RIfFNfSVdPVEgpLyogMDY2NiovCisKKyMgZGVmaW5lIFNfQkxLU0laRQk1MTIJLyogQmxvY2sgc2l6ZSBmb3IgYHN0X2Jsb2NrcycuICAqLworI2VuZGlmCisKKworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisvKiBHZXQgZmlsZSBhdHRyaWJ1dGVzIGZvciBGSUxFIGFuZCBwdXQgdGhlbSBpbiBCVUYuICAqLworZXh0ZXJuIGludCBzdGF0IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkgc3RydWN0IHN0YXQgKl9fcmVzdHJpY3QgX19idWYpIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBHZXQgZmlsZSBhdHRyaWJ1dGVzIGZvciB0aGUgZmlsZSwgZGV2aWNlLCBwaXBlLCBvciBzb2NrZXQKKyAgIHRoYXQgZmlsZSBkZXNjcmlwdG9yIEZEIGlzIG9wZW4gb24gYW5kIHB1dCB0aGVtIGluIEJVRi4gICovCitleHRlcm4gaW50IGZzdGF0IChpbnQgX19mZCwgc3RydWN0IHN0YXQgKl9fYnVmKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChzdGF0LCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJCQkgIHN0cnVjdCBzdGF0ICpfX3Jlc3RyaWN0IF9fYnVmKSwgc3RhdDY0KQorICAgICBfX25vbm51bGwgKCgxLCAyKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChmc3RhdCwgKGludCBfX2ZkLCBzdHJ1Y3Qgc3RhdCAqX19idWYpLCBmc3RhdDY0KQorICAgICBfX25vbm51bGwgKCgyKSk7CisjIGVsc2UKKyMgIGRlZmluZSBzdGF0IHN0YXQ2NAorIyAgZGVmaW5lIGZzdGF0IGZzdGF0NjQKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IHN0YXQ2NCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJICAgc3RydWN0IHN0YXQ2NCAqX19yZXN0cmljdCBfX2J1ZikgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CitleHRlcm4gaW50IGZzdGF0NjQgKGludCBfX2ZkLCBzdHJ1Y3Qgc3RhdDY0ICpfX2J1ZikgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0FURklMRQorLyogU2ltaWxhciB0byBzdGF0LCBnZXQgdGhlIGF0dHJpYnV0ZXMgZm9yIEZJTEUgYW5kIHB1dCB0aGVtIGluIEJVRi4KKyAgIFJlbGF0aXZlIHBhdGggbmFtZXMgYXJlIGludGVycHJldGVkIHJlbGF0aXZlIHRvIEZEIHVubGVzcyBGRCBpcworICAgQVRfRkRDV0QuICAqLworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBmc3RhdGF0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJICAgIHN0cnVjdCBzdGF0ICpfX3Jlc3RyaWN0IF9fYnVmLCBpbnQgX19mbGFnKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDMpKTsKKyMgZWxzZQorIyAgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKGZzdGF0YXQsIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJCQkgICAgIHN0cnVjdCBzdGF0ICpfX3Jlc3RyaWN0IF9fYnVmLAorCQkJCSAgICAgaW50IF9fZmxhZyksCisJCQkgICBmc3RhdGF0NjQpIF9fbm9ubnVsbCAoKDIsIDMpKTsKKyMgIGVsc2UKKyMgICBkZWZpbmUgZnN0YXRhdCBmc3RhdGF0NjQKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgZnN0YXRhdDY0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJICAgICAgc3RydWN0IHN0YXQ2NCAqX19yZXN0cmljdCBfX2J1ZiwgaW50IF9fZmxhZykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyLCAzKSk7CisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisvKiBHZXQgZmlsZSBhdHRyaWJ1dGVzIGFib3V0IEZJTEUgYW5kIHB1dCB0aGVtIGluIEJVRi4KKyAgIElmIEZJTEUgaXMgYSBzeW1ib2xpYyBsaW5rLCBkbyBub3QgZm9sbG93IGl0LiAgKi8KK2V4dGVybiBpbnQgbHN0YXQgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZpbGUsCisJCSAgc3RydWN0IHN0YXQgKl9fcmVzdHJpY3QgX19idWYpIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAobHN0YXQsCisJCQkgICAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJCSAgICBzdHJ1Y3Qgc3RhdCAqX19yZXN0cmljdCBfX2J1ZiksIGxzdGF0NjQpCisgICAgIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgIGVsc2UKKyMgICBkZWZpbmUgbHN0YXQgbHN0YXQ2NAorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgbHN0YXQ2NCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJICAgIHN0cnVjdCBzdGF0NjQgKl9fcmVzdHJpY3QgX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworIyBlbmRpZgorI2VuZGlmCisKKy8qIFNldCBmaWxlIGFjY2VzcyBwZXJtaXNzaW9ucyBmb3IgRklMRSB0byBNT0RFLgorICAgSWYgRklMRSBpcyBhIHN5bWJvbGljIGxpbmssIHRoaXMgYWZmZWN0cyBpdHMgdGFyZ2V0IGluc3RlYWQuICAqLworZXh0ZXJuIGludCBjaG1vZCAoX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fbW9kZV90IF9fbW9kZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIFNldCBmaWxlIGFjY2VzcyBwZXJtaXNzaW9ucyBmb3IgRklMRSB0byBNT0RFLgorICAgSWYgRklMRSBpcyBhIHN5bWJvbGljIGxpbmssIHRoaXMgYWZmZWN0cyB0aGUgbGluayBpdHNlbGYKKyAgIHJhdGhlciB0aGFuIGl0cyB0YXJnZXQuICAqLworZXh0ZXJuIGludCBsY2htb2QgKF9fY29uc3QgY2hhciAqX19maWxlLCBfX21vZGVfdCBfX21vZGUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKy8qIFNldCBmaWxlIGFjY2VzcyBwZXJtaXNzaW9ucyBvZiB0aGUgZmlsZSBGRCBpcyBvcGVuIG9uIHRvIE1PREUuICAqLworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorZXh0ZXJuIGludCBmY2htb2QgKGludCBfX2ZkLCBfX21vZGVfdCBfX21vZGUpIF9fVEhST1c7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0FURklMRQorLyogU2V0IGZpbGUgYWNjZXNzIHBlcm1pc3Npb25zIG9mIEZJTEUgcmVsYXRpdmUgdG8KKyAgIHRoZSBkaXJlY3RvcnkgRkQgaXMgb3BlbiBvbi4gICovCitleHRlcm4gaW50IGZjaG1vZGF0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fbW9kZV90IF9fbW9kZSwKKwkJICAgICBpbnQgX19mbGFnKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKSBfX3d1cjsKKyNlbmRpZiAvKiBVc2UgQVRGSUxFLiAgKi8KKworCisKKy8qIFNldCB0aGUgZmlsZSBjcmVhdGlvbiBtYXNrIG9mIHRoZSBjdXJyZW50IHByb2Nlc3MgdG8gTUFTSywKKyAgIGFuZCByZXR1cm4gdGhlIG9sZCBjcmVhdGlvbiBtYXNrLiAgKi8KK2V4dGVybiBfX21vZGVfdCB1bWFzayAoX19tb2RlX3QgX19tYXNrKSBfX1RIUk9XOworCisjaWZkZWYJX19VU0VfR05VCisvKiBHZXQgdGhlIGN1cnJlbnQgYHVtYXNrJyB2YWx1ZSB3aXRob3V0IGNoYW5naW5nIGl0LgorICAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIEh1cmQuICAqLworZXh0ZXJuIF9fbW9kZV90IGdldHVtYXNrICh2b2lkKSBfX1RIUk9XOworI2VuZGlmCisKKy8qIENyZWF0ZSBhIG5ldyBkaXJlY3RvcnkgbmFtZWQgUEFUSCwgd2l0aCBwZXJtaXNzaW9uIGJpdHMgTU9ERS4gICovCitleHRlcm4gaW50IG1rZGlyIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19tb2RlX3QgX19tb2RlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmZGVmIF9fVVNFX0FURklMRQorLyogTGlrZSBta2RpciwgY3JlYXRlIGEgbmV3IGRpcmVjdG9yeSB3aXRoIHBlcm1pc3Npb24gYml0cyBNT0RFLiAgQnV0CisgICBpbnRlcnByZXQgcmVsYXRpdmUgUEFUSCBuYW1lcyByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGFzc29jaWF0ZWQKKyAgIHdpdGggRkQuICAqLworZXh0ZXJuIGludCBta2RpcmF0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsIF9fbW9kZV90IF9fbW9kZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZW5kaWYKKworLyogQ3JlYXRlIGEgZGV2aWNlIGZpbGUgbmFtZWQgUEFUSCwgd2l0aCBwZXJtaXNzaW9uIGFuZCBzcGVjaWFsIGJpdHMgTU9ERQorICAgYW5kIGRldmljZSBudW1iZXIgREVWICh3aGljaCBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSBtYWpvciBhbmQgbWlub3IKKyAgIGRldmljZSBudW1iZXJzIHdpdGggdGhlIGBtYWtlZGV2JyBtYWNybyBhYm92ZSkuICAqLworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECitleHRlcm4gaW50IG1rbm9kIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19tb2RlX3QgX19tb2RlLCBfX2Rldl90IF9fZGV2KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworIyBpZmRlZiBfX1VTRV9BVEZJTEUKKy8qIExpa2UgbWtub2QsIGNyZWF0ZSBhIG5ldyBkZXZpY2UgZmlsZSB3aXRoIHBlcm1pc3Npb24gYml0cyBNT0RFIGFuZAorICAgZGV2aWNlIG51bWJlciBERVYuICBCdXQgaW50ZXJwcmV0IHJlbGF0aXZlIFBBVEggbmFtZXMgcmVsYXRpdmUgdG8KKyAgIHRoZSBkaXJlY3RvcnkgYXNzb2NpYXRlZCB3aXRoIEZELiAgKi8KK2V4dGVybiBpbnQgbWtub2RhdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUsCisJCSAgICBfX2Rldl90IF9fZGV2KSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIENyZWF0ZSBhIG5ldyBGSUZPIG5hbWVkIFBBVEgsIHdpdGggcGVybWlzc2lvbiBiaXRzIE1PREUuICAqLworZXh0ZXJuIGludCBta2ZpZm8gKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjaWZkZWYgX19VU0VfQVRGSUxFCisvKiBMaWtlIG1rZmlmbywgY3JlYXRlIGEgbmV3IEZJRk8gd2l0aCBwZXJtaXNzaW9uIGJpdHMgTU9ERS4gIEJ1dAorICAgaW50ZXJwcmV0IHJlbGF0aXZlIFBBVEggbmFtZXMgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBhc3NvY2lhdGVkCisgICB3aXRoIEZELiAgKi8KK2V4dGVybiBpbnQgbWtmaWZvYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19tb2RlX3QgX19tb2RlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbmRpZgorDAorI2lmZGVmIF9fVVNFX0FURklMRQorLyogU2V0IGZpbGUgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gdGltZXMgcmVsYXRpdmUgdG8gZGlyZWN0b3J5IGZpbGUKKyAgIGRlc2NyaXB0b3IuICAqLworZXh0ZXJuIGludCB1dGltZW5zYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwKKwkJICAgICAgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgX190aW1lc1syXSwKKwkJICAgICAgaW50IF9fZmxhZ3MpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLOAorLyogU2V0IGZpbGUgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gdGltZXMgb2YgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIEZELiAgKi8KK2V4dGVybiBpbnQgZnV0aW1lbnMgKGludCBfX2ZkLCBfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyBfX3RpbWVzWzJdKSBfX1RIUk9XOworI2VuZGlmCisMCisvKiBUbyBhbGxvdyB0aGUgYHN0cnVjdCBzdGF0JyBzdHJ1Y3R1cmUgYW5kIHRoZSBmaWxlIHR5cGUgYG1vZGVfdCcKKyAgIGJpdHMgdG8gdmFyeSB3aXRob3V0IGNoYW5naW5nIHNoYXJlZCBsaWJyYXJ5IG1ham9yIHZlcnNpb24gbnVtYmVyLAorICAgdGhlIGBzdGF0JyBmYW1pbHkgb2YgZnVuY3Rpb25zIGFuZCBgbWtub2QnIGFyZSBpbiBmYWN0IGlubGluZQorICAgd3JhcHBlcnMgYXJvdW5kIGNhbGxzIHRvIGB4c3RhdCcsIGBmeHN0YXQnLCBgbHhzdGF0JywgYW5kIGB4bWtub2QnLAorICAgd2hpY2ggYWxsIHRha2UgYSBsZWFkaW5nIHZlcnNpb24tbnVtYmVyIGFyZ3VtZW50IGRlc2lnbmF0aW5nIHRoZQorICAgZGF0YSBzdHJ1Y3R1cmUgYW5kIGJpdHMgdXNlZC4gIDxiaXRzL3N0YXQuaD4gZGVmaW5lcyBfU1RBVF9WRVIgd2l0aAorICAgdGhlIHZlcnNpb24gbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gYHN0cnVjdCBzdGF0JyBhcyBkZWZpbmVkIGluCisgICB0aGF0IGZpbGU7IGFuZCBfTUtOT0RfVkVSIHdpdGggdGhlIHZlcnNpb24gbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8KKyAgIHRoZSBTX0lGKiBtYWNyb3MgZGVmaW5lZCB0aGVyZWluLiAgSXQgaXMgYXJyYW5nZWQgdGhhdCB3aGVuIG5vdAorICAgaW5saW5lZCB0aGVzZSBmdW5jdGlvbiBhcmUgYWx3YXlzIHN0YXRpY2FsbHkgbGlua2VkOyB0aGF0IHdheSBhCisgICBkeW5hbWljYWxseS1saW5rZWQgZXhlY3V0YWJsZSBhbHdheXMgZW5jb2RlcyB0aGUgdmVyc2lvbiBudW1iZXIKKyAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRhdGEgc3RydWN0dXJlcyBpdCB1c2VzLCBzbyB0aGUgYHgnIGZ1bmN0aW9ucworICAgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5IGNhbiBhZGFwdCB3aXRob3V0IG5lZWRpbmcgdG8gcmVjb21waWxlIGFsbAorICAgY2FsbGVycy4gICovCisKKyNpZm5kZWYgX1NUQVRfVkVSCisjIGRlZmluZSBfU1RBVF9WRVIJMAorI2VuZGlmCisjaWZuZGVmIF9NS05PRF9WRVIKKyMgZGVmaW5lIF9NS05PRF9WRVIJMAorI2VuZGlmCisKKy8qIFdyYXBwZXJzIGZvciBzdGF0IGFuZCBta25vZCBzeXN0ZW0gY2FsbHMuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IF9fZnhzdGF0IChpbnQgX192ZXIsIGludCBfX2ZpbGRlcywgc3RydWN0IHN0YXQgKl9fc3RhdF9idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMykpOworZXh0ZXJuIGludCBfX3hzdGF0IChpbnQgX192ZXIsIF9fY29uc3QgY2hhciAqX19maWxlbmFtZSwKKwkJICAgIHN0cnVjdCBzdGF0ICpfX3N0YXRfYnVmKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDMpKTsKK2V4dGVybiBpbnQgX19seHN0YXQgKGludCBfX3ZlciwgX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkgICAgIHN0cnVjdCBzdGF0ICpfX3N0YXRfYnVmKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDMpKTsKK2V4dGVybiBpbnQgX19meHN0YXRhdCAoaW50IF9fdmVyLCBpbnQgX19maWxkZXMsIF9fY29uc3QgY2hhciAqX19maWxlbmFtZSwKKwkJICAgICAgIHN0cnVjdCBzdGF0ICpfX3N0YXRfYnVmLCBpbnQgX19mbGFnKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDMsIDQpKTsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX2Z4c3RhdCwgKGludCBfX3ZlciwgaW50IF9fZmlsZGVzLAorCQkJCSAgICAgIHN0cnVjdCBzdGF0ICpfX3N0YXRfYnVmKSwgX19meHN0YXQ2NCkKKyAgICAgX19ub25udWxsICgoMykpOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX194c3RhdCwgKGludCBfX3ZlciwgX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkJCSAgICAgc3RydWN0IHN0YXQgKl9fc3RhdF9idWYpLCBfX3hzdGF0NjQpCisgICAgIF9fbm9ubnVsbCAoKDIsIDMpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fbHhzdGF0LCAoaW50IF9fdmVyLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsCisJCQkJICAgICAgc3RydWN0IHN0YXQgKl9fc3RhdF9idWYpLCBfX2x4c3RhdDY0KQorICAgICBfX25vbm51bGwgKCgyLCAzKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX2Z4c3RhdGF0LCAoaW50IF9fdmVyLCBpbnQgX19maWxkZXMsCisJCQkJCV9fY29uc3QgY2hhciAqX19maWxlbmFtZSwKKwkJCQkJc3RydWN0IHN0YXQgKl9fc3RhdF9idWYsIGludCBfX2ZsYWcpLAorCQkJICAgX19meHN0YXRhdDY0KSBfX25vbm51bGwgKCgzLCA0KSk7CisKKyMgZWxzZQorIyAgZGVmaW5lIF9fZnhzdGF0IF9fZnhzdGF0NjQKKyMgIGRlZmluZSBfX3hzdGF0IF9feHN0YXQ2NAorIyAgZGVmaW5lIF9fbHhzdGF0IF9fbHhzdGF0NjQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgX19meHN0YXQ2NCAoaW50IF9fdmVyLCBpbnQgX19maWxkZXMsIHN0cnVjdCBzdGF0NjQgKl9fc3RhdF9idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMykpOworZXh0ZXJuIGludCBfX3hzdGF0NjQgKGludCBfX3ZlciwgX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkgICAgICBzdHJ1Y3Qgc3RhdDY0ICpfX3N0YXRfYnVmKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDMpKTsKK2V4dGVybiBpbnQgX19seHN0YXQ2NCAoaW50IF9fdmVyLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsCisJCSAgICAgICBzdHJ1Y3Qgc3RhdDY0ICpfX3N0YXRfYnVmKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDMpKTsKK2V4dGVybiBpbnQgX19meHN0YXRhdDY0IChpbnQgX192ZXIsIGludCBfX2ZpbGRlcywgX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkJIHN0cnVjdCBzdGF0NjQgKl9fc3RhdF9idWYsIGludCBfX2ZsYWcpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMywgNCkpOworI2VuZGlmCitleHRlcm4gaW50IF9feG1rbm9kIChpbnQgX192ZXIsIF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUsCisJCSAgICAgX19kZXZfdCAqX19kZXYpIF9fVEhST1cgX19ub25udWxsICgoMiwgNCkpOworCitleHRlcm4gaW50IF9feG1rbm9kYXQgKGludCBfX3ZlciwgaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLAorCQkgICAgICAgX19tb2RlX3QgX19tb2RlLCBfX2Rldl90ICpfX2RldikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgzLCA1KSk7CisKKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIgJiYgZGVmaW5lZCBfX1VTRV9FWFRFUk5fSU5MSU5FU19JTl9MSUJDCisvKiBJbmxpbmVkIHZlcnNpb25zIG9mIHRoZSByZWFsIHN0YXQgYW5kIG1rbm9kIGZ1bmN0aW9ucy4gICovCisKK19fZXh0ZXJuX2lubGluZSBpbnQKK19fTlRIIChzdGF0IChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgc3RydWN0IHN0YXQgKl9fc3RhdGJ1ZikpCit7CisgIHJldHVybiBfX3hzdGF0IChfU1RBVF9WRVIsIF9fcGF0aCwgX19zdGF0YnVmKTsKK30KKworIyBpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAobHN0YXQgKF9fY29uc3QgY2hhciAqX19wYXRoLCBzdHJ1Y3Qgc3RhdCAqX19zdGF0YnVmKSkKK3sKKyAgcmV0dXJuIF9fbHhzdGF0IChfU1RBVF9WRVIsIF9fcGF0aCwgX19zdGF0YnVmKTsKK30KKyMgZW5kaWYKKworX19leHRlcm5faW5saW5lIGludAorX19OVEggKGZzdGF0IChpbnQgX19mZCwgc3RydWN0IHN0YXQgKl9fc3RhdGJ1ZikpCit7CisgIHJldHVybiBfX2Z4c3RhdCAoX1NUQVRfVkVSLCBfX2ZkLCBfX3N0YXRidWYpOworfQorCisjIGlmZGVmIF9fVVNFX0FURklMRQorX19leHRlcm5faW5saW5lIGludAorX19OVEggKGZzdGF0YXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsIHN0cnVjdCBzdGF0ICpfX3N0YXRidWYsCisJCWludCBfX2ZsYWcpKQoreworICByZXR1cm4gX19meHN0YXRhdCAoX1NUQVRfVkVSLCBfX2ZkLCBfX2ZpbGVuYW1lLCBfX3N0YXRidWYsIF9fZmxhZyk7Cit9CisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfQlNECitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAobWtub2QgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUsIF9fZGV2X3QgX19kZXYpKQoreworICByZXR1cm4gX194bWtub2QgKF9NS05PRF9WRVIsIF9fcGF0aCwgX19tb2RlLCAmX19kZXYpOworfQorIyBlbmRpZgorCisjIGlmZGVmIF9fVVNFX0FURklMRQorX19leHRlcm5faW5saW5lIGludAorX19OVEggKG1rbm9kYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19tb2RlX3QgX19tb2RlLAorCQlfX2Rldl90IF9fZGV2KSkKK3sKKyAgcmV0dXJuIF9feG1rbm9kYXQgKF9NS05PRF9WRVIsIF9fZmQsIF9fcGF0aCwgX19tb2RlLCAmX19kZXYpOworfQorIyBlbmRpZgorCisjIGlmIGRlZmluZWQgX19VU0VfTEFSR0VGSUxFNjQgXAorICAmJiAoISBkZWZpbmVkIF9fVVNFX0ZJTEVfT0ZGU0VUNjQgXAorICAgICAgfHwgKGRlZmluZWQgX19SRURJUkVDVF9OVEggJiYgZGVmaW5lZCBfX09QVElNSVpFX18pKQorX19leHRlcm5faW5saW5lIGludAorX19OVEggKHN0YXQ2NCAoX19jb25zdCBjaGFyICpfX3BhdGgsIHN0cnVjdCBzdGF0NjQgKl9fc3RhdGJ1ZikpCit7CisgIHJldHVybiBfX3hzdGF0NjQgKF9TVEFUX1ZFUiwgX19wYXRoLCBfX3N0YXRidWYpOworfQorCisjICBpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAobHN0YXQ2NCAoX19jb25zdCBjaGFyICpfX3BhdGgsIHN0cnVjdCBzdGF0NjQgKl9fc3RhdGJ1ZikpCit7CisgIHJldHVybiBfX2x4c3RhdDY0IChfU1RBVF9WRVIsIF9fcGF0aCwgX19zdGF0YnVmKTsKK30KKyMgIGVuZGlmCisKK19fZXh0ZXJuX2lubGluZSBpbnQKK19fTlRIIChmc3RhdDY0IChpbnQgX19mZCwgc3RydWN0IHN0YXQ2NCAqX19zdGF0YnVmKSkKK3sKKyAgcmV0dXJuIF9fZnhzdGF0NjQgKF9TVEFUX1ZFUiwgX19mZCwgX19zdGF0YnVmKTsKK30KKworIyAgaWZkZWYgX19VU0VfQVRGSUxFCitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAoZnN0YXRhdDY0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdDY0ICpfX3N0YXRidWYsCisJCSAgaW50IF9fZmxhZykpCit7CisgIHJldHVybiBfX2Z4c3RhdGF0NjQgKF9TVEFUX1ZFUiwgX19mZCwgX19maWxlbmFtZSwgX19zdGF0YnVmLCBfX2ZsYWcpOworfQorIyAgZW5kaWYKKworIyBlbmRpZgorCisjZW5kaWYKKworX19FTkRfREVDTFMKKworCisjZW5kaWYgLyogc3lzL3N0YXQuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3N0YXRmcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3RhdGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyMjI2YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3N0YXRmcy5oCkBAIC0wLDAgKzEsNjggQEAKKy8qIERlZmluaXRpb25zIGZvciBnZXR0aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgZmlsZXN5c3RlbS4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX1NUQVRGU19ICisjZGVmaW5lCV9TWVNfU1RBVEZTX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogR2V0IHRoZSBzeXN0ZW0tc3BlY2lmaWMgZGVmaW5pdGlvbiBvZiBgc3RydWN0IHN0YXRmcycuICAqLworI2luY2x1ZGUgPGJpdHMvc3RhdGZzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWxlc3lzdGVtIG9uIHdoaWNoIEZJTEUgcmVzaWRlcy4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgc3RhdGZzIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgc3RydWN0IHN0YXRmcyAqX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHN0YXRmcywKKwkJCSAgIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgc3RydWN0IHN0YXRmcyAqX19idWYpLAorCQkJICAgc3RhdGZzNjQpIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgZWxzZQorIyAgZGVmaW5lIHN0YXRmcyBzdGF0ZnM2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgc3RhdGZzNjQgKF9fY29uc3QgY2hhciAqX19maWxlLCBzdHJ1Y3Qgc3RhdGZzNjQgKl9fYnVmKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyNlbmRpZgorCisvKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbGVzeXN0ZW0gY29udGFpbmluZyB0aGUgZmlsZSBGSUxERVMKKyAgIHJlZmVycyB0by4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgZnN0YXRmcyAoaW50IF9fZmlsZGVzLCBzdHJ1Y3Qgc3RhdGZzICpfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoZnN0YXRmcywgKGludCBfX2ZpbGRlcywgc3RydWN0IHN0YXRmcyAqX19idWYpLAorCQkJICAgZnN0YXRmczY0KSBfX25vbm51bGwgKCgyKSk7CisjIGVsc2UKKyMgIGRlZmluZSBmc3RhdGZzIGZzdGF0ZnM2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgZnN0YXRmczY0IChpbnQgX19maWxkZXMsIHN0cnVjdCBzdGF0ZnM2NCAqX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvc3RhdGZzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3N0YXR2ZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3N0YXR2ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDk2NjJiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3RhdHZmcy5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qIERlZmluaXRpb25zIGZvciBnZXR0aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgZmlsZXN5c3RlbS4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX1NUQVRWRlNfSAorI2RlZmluZQlfU1lTX1NUQVRWRlNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgdGhlIHN5c3RlbS1zcGVjaWZpYyBkZWZpbml0aW9uIG9mIGBzdHJ1Y3Qgc3RhdGZzJy4gICovCisjaW5jbHVkZSA8Yml0cy9zdGF0dmZzLmg+CisKKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorIyBpZm5kZWYgX19mc2Jsa2NudF90X2RlZmluZWQKK3R5cGVkZWYgX19mc2Jsa2NudF90IGZzYmxrY250X3Q7IC8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gYmxvY2tzLiAgKi8KKyMgIGRlZmluZSBfX2ZzYmxrY250X3RfZGVmaW5lZAorIyBlbmRpZgorIyBpZm5kZWYgX19mc2ZpbGNudF90X2RlZmluZWQKK3R5cGVkZWYgX19mc2ZpbGNudF90IGZzZmlsY250X3Q7IC8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gaW5vZGVzLiAgKi8KKyMgIGRlZmluZSBfX2ZzZmlsY250X3RfZGVmaW5lZAorIyBlbmRpZgorI2Vsc2UKKyMgaWZuZGVmIF9fZnNibGtjbnRfdF9kZWZpbmVkCit0eXBlZGVmIF9fZnNibGtjbnQ2NF90IGZzYmxrY250X3Q7IC8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gYmxvY2tzLiAgKi8KKyMgIGRlZmluZSBfX2ZzYmxrY250X3RfZGVmaW5lZAorIyBlbmRpZgorIyBpZm5kZWYgX19mc2ZpbGNudF90X2RlZmluZWQKK3R5cGVkZWYgX19mc2ZpbGNudDY0X3QgZnNmaWxjbnRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBpbm9kZXMuICAqLworIyAgZGVmaW5lIF9fZnNmaWxjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYKKworX19CRUdJTl9ERUNMUworCisvKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbGVzeXN0ZW0gb24gd2hpY2ggRklMRSByZXNpZGVzLiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBzdGF0dmZzIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkgICAgc3RydWN0IHN0YXR2ZnMgKl9fcmVzdHJpY3QgX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHN0YXR2ZnMsCisJCQkgICAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJCSAgICBzdHJ1Y3Qgc3RhdHZmcyAqX19yZXN0cmljdCBfX2J1ZiksIHN0YXR2ZnM2NCkKKyAgICAgX19ub25udWxsICgoMSwgMikpOworIyBlbHNlCisjICBkZWZpbmUgc3RhdHZmcyBzdGF0dmZzNjQKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IHN0YXR2ZnM2NCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJICAgICAgc3RydWN0IHN0YXR2ZnM2NCAqX19yZXN0cmljdCBfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjZW5kaWYKKworLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWxlc3lzdGVtIGNvbnRhaW5pbmcgdGhlIGZpbGUgRklMREVTCisgICByZWZlcnMgdG8uICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IGZzdGF0dmZzIChpbnQgX19maWxkZXMsIHN0cnVjdCBzdGF0dmZzICpfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoZnN0YXR2ZnMsIChpbnQgX19maWxkZXMsIHN0cnVjdCBzdGF0dmZzICpfX2J1ZiksCisJCQkgICBmc3RhdHZmczY0KSBfX25vbm51bGwgKCgyKSk7CisjIGVsc2UKKyMgIGRlZmluZSBmc3RhdHZmcyBmc3RhdHZmczY0CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBmc3RhdHZmczY0IChpbnQgX19maWxkZXMsIHN0cnVjdCBzdGF0dmZzNjQgKl9fYnVmKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3lzL3N0YXR2ZnMuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3Ryb3B0cy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3Ryb3B0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNWJjMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zdHJvcHRzLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPHN0cm9wdHMuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3N3YXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3N3YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjEwMDZjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3dhcC5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qIENhbGxzIHRvIGVuYWJsZSBhbmQgZGlzYWJsZSBzd2FwcGluZyBvbiBzcGVjaWZpZWQgbG9jYXRpb25zLiAgTGludXggdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMTk5OSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NXQVBfSAorCisjZGVmaW5lIF9TWVNfU1dBUF9ICTEKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBUaGUgc3dhcCBwcmlvcml0eSBpcyBlbmNvZGVkIGFzOgorICAgKHByaW8gPDwgU1dBUF9GTEFHX1BSSU9fU0hJRlQpICYgU1dBUF9GTEFHX1BSSU9fTUFTSworKi8KKyNkZWZpbmUJU1dBUF9GTEFHX1BSRUZFUgkweDgwMDAJLyogU2V0IGlmIHN3YXAgcHJpb3JpdHkgaXMgc3BlY2lmaWVkLiAqLworI2RlZmluZQlTV0FQX0ZMQUdfUFJJT19NQVNLCTB4N2ZmZgorI2RlZmluZQlTV0FQX0ZMQUdfUFJJT19TSElGVAkwCisjZGVmaW5lIFNXQVBfRkxBR19ESVNDQVJECTB4MTAwMDAJLyogRGlzY2FyZCBzd2FwIGNsdXN0ZXIgYWZ0ZXIgdXNlLiAgKi8KKworX19CRUdJTl9ERUNMUworCisvKiBNYWtlIHRoZSBibG9jayBzcGVjaWFsIGRldmljZSBQQVRIIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtIGZvciBzd2FwcGluZy4KKyAgIFRoaXMgY2FsbCBpcyByZXN0cmljdGVkIHRvIHRoZSBzdXBlci11c2VyLiAgKi8KK2V4dGVybiBpbnQgc3dhcG9uIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fZmxhZ3MpIF9fVEhST1c7CisKKy8qIFN0b3AgdXNpbmcgYmxvY2sgc3BlY2lhbCBkZXZpY2UgUEFUSCBmb3Igc3dhcHBpbmcuICAqLworZXh0ZXJuIGludCBzd2Fwb2ZmIChfX2NvbnN0IGNoYXIgKl9fcGF0aCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9TWVNfU1dBUF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zeXNjYWxsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zeXNjYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkNzJkMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3N5c2NhbGwuaApAQCAtMCwwICsxLDM1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU0NBTExfSAorI2RlZmluZSBfU1lTQ0FMTF9ICTEKKworLyogVGhpcyBmaWxlIHNob3VsZCBsaXN0IHRoZSBudW1iZXJzIG9mIHRoZSBzeXN0ZW0gY2FsbHMgdGhlIHN5c3RlbSBrbm93cy4KKyAgIEJ1dCBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIHRoaXMgd2UgdXNlIHRoZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUKKyAgIGZyb20gdGhlIGtlcm5lbCBzb3VyY2VzLiAgKi8KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKKyNpZm5kZWYgX0xJQkMKKy8qIFRoZSBMaW51eCBrZXJuZWwgaGVhZGVyIGZpbGUgZGVmaW5lcyBtYWNyb3MgYF9fTlJfPG5hbWU+JywgYnV0IHNvbWUKKyAgIHByb2dyYW1zIGV4cGVjdCB0aGUgdHJhZGl0aW9uYWwgZm9ybSBgU1lTXzxuYW1lPicuICBTbyBpbiBidWlsZGluZyBsaWJjCisgICB3ZSBzY2FuIHRoZSBrZXJuZWwncyBsaXN0IGFuZCBwcm9kdWNlIDxiaXRzL3N5c2NhbGwuaD4gd2l0aCBtYWNyb3MgZm9yCisgICBhbGwgdGhlIGBTWVNfJyBuYW1lcy4gICovCisjIGluY2x1ZGUgPGJpdHMvc3lzY2FsbC5oPgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3lzY3RsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zeXNjdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTBlZmFhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3lzY3RsLmgKQEAgLTAsMCArMSw3MiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5LCAyMDAyLCAyMDAzLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfU1lTQ1RMX0gKKyNkZWZpbmUJX1NZU19TWVNDVExfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2RlZmluZSBfX25lZWRfc2l6ZV90CisjaW5jbHVkZSA8c3RkZGVmLmg+CisvKiBQcmV2ZW50IG1vcmUga2VybmVsIGhlYWRlcnMgdGhhbiBuZWNlc3NhcnkgdG8gYmUgaW5jbHVkZWQuICAqLworI2lmbmRlZiBfTElOVVhfS0VSTkVMX0gKKyMgZGVmaW5lIF9MSU5VWF9LRVJORUxfSAkxCisjIGRlZmluZSBfX3VuZGVmX0xJTlVYX0tFUk5FTF9ICisjZW5kaWYKKyNpZm5kZWYgX0xJTlVYX1RZUEVTX0gKKyMgZGVmaW5lIF9MSU5VWF9UWVBFU19ICQkxCisjIGRlZmluZSBfX3VuZGVmX0xJTlVYX1RZUEVTX0gKKyNlbmRpZgorI2lmbmRlZiBfTElOVVhfTElTVF9ICisjIGRlZmluZSBfTElOVVhfTElTVF9ICQkxCisjIGRlZmluZSBfX3VuZGVmX0xJTlVYX0xJU1RfSAorI2VuZGlmCisjaWZuZGVmIF9fTElOVVhfQ09NUElMRVJfSAorIyBkZWZpbmUgX19MSU5VWF9DT01QSUxFUl9ICTEKKyMgZGVmaW5lIF9fdXNlcgorIyBkZWZpbmUgX191bmRlZl9fTElOVVhfQ09NUElMRVJfSAorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKworI2lmZGVmIF9fdW5kZWZfTElOVVhfS0VSTkVMX0gKKyMgdW5kZWYgX0xJTlVYX0tFUk5FTF9ICisjIHVuZGVmIF9fdW5kZWZfTElOVVhfS0VSTkVMX0gKKyNlbmRpZgorI2lmZGVmIF9fdW5kZWZfTElOVVhfVFlQRVNfSAorIyB1bmRlZiBfTElOVVhfVFlQRVNfSAorIyB1bmRlZiBfX3VuZGVmX0xJTlVYX1RZUEVTX0gKKyNlbmRpZgorI2lmZGVmIF9fdW5kZWZfTElOVVhfTElTVF9ICisjIHVuZGVmIF9MSU5VWF9MSVNUX0gKKyMgdW5kZWYgX191bmRlZl9MSU5VWF9MSVNUX0gKKyNlbmRpZgorI2lmZGVmIF9fdW5kZWZfX0xJTlVYX0NPTVBJTEVSX0gKKyMgdW5kZWYgX19MSU5VWF9DT01QSUxFUl9ICisjIHVuZGVmIF9fdXNlcgorIyB1bmRlZiBfX3VuZGVmX19MSU5VWF9DT01QSUxFUl9ICisjZW5kaWYKKworX19CRUdJTl9ERUNMUworCisvKiBSZWFkIG9yIHdyaXRlIHN5c3RlbSBwYXJhbWV0ZXJzLiAgKi8KK2V4dGVybiBpbnQgc3lzY3RsIChpbnQgKl9fbmFtZSwgaW50IF9fbmxlbiwgdm9pZCAqX19vbGR2YWwsCisJCSAgIHNpemVfdCAqX19vbGRsZW5wLCB2b2lkICpfX25ld3ZhbCwgc2l6ZV90IF9fbmV3bGVuKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogX1NZU19TWVNDVExfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3lzaW5mby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3lzaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NzI3YjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy9zeXNpbmZvLmgKQEAgLTAsMCArMSw0OCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5LCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU1lTSU5GT19ICisjZGVmaW5lIF9TWVNfU1lTSU5GT19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIEdldCBzeXNpbmZvIHN0cnVjdHVyZSBmcm9tIGtlcm5lbCBoZWFkZXIuICAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJldHVybnMgaW5mb3JtYXRpb24gb24gb3ZlcmFsbCBzeXN0ZW0gc3RhdGlzdGljcy4gICovCitleHRlcm4gaW50IHN5c2luZm8gKHN0cnVjdCBzeXNpbmZvICpfX2luZm8pIF9fVEhST1c7CisKKworLyogUmV0dXJuIG51bWJlciBvZiBjb25maWd1cmVkIHByb2Nlc3NvcnMuICAqLworZXh0ZXJuIGludCBnZXRfbnByb2NzX2NvbmYgKHZvaWQpIF9fVEhST1c7CisKKy8qIFJldHVybiBudW1iZXIgb2YgYXZhaWxhYmxlIHByb2Nlc3NvcnMuICAqLworZXh0ZXJuIGludCBnZXRfbnByb2NzICh2b2lkKSBfX1RIUk9XOworCisKKy8qIFJldHVybiBudW1iZXIgb2YgcGh5c2ljYWwgcGFnZXMgb2YgbWVtb3J5IGluIHRoZSBzeXN0ZW0uICAqLworZXh0ZXJuIGxvbmcgaW50IGdldF9waHlzX3BhZ2VzICh2b2lkKSBfX1RIUk9XOworCisvKiBSZXR1cm4gbnVtYmVyIG9mIGF2YWlsYWJsZSBwaHlzaWNhbCBwYWdlcyBvZiBtZW1vcnkgaW4gdGhlIHN5c3RlbS4gICovCitleHRlcm4gbG9uZyBpbnQgZ2V0X2F2cGh5c19wYWdlcyAodm9pZCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHN5cy9zeXNpbmZvLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3N5c2xvZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3lzbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkYTFjZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3N5c2xvZy5oCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTg4LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXN5c2xvZy5oCTguMSAoQmVya2VsZXkpIDYvMi85MworICovCisKKyNpZm5kZWYgX1NZU19TWVNMT0dfSAorI2RlZmluZSBfU1lTX1NZU0xPR19IIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjZGVmaW5lIF9fbmVlZF9fX3ZhX2xpc3QKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyogVGhpcyBmaWxlIGRlZmluZXMgX1BBVEhfTE9HLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3N5c2xvZy1wYXRoLmg+CisKKy8qCisgKiBwcmlvcml0aWVzL2ZhY2lsaXRpZXMgYXJlIGVuY29kZWQgaW50byBhIHNpbmdsZSAzMi1iaXQgcXVhbnRpdHksIHdoZXJlIHRoZQorICogYm90dG9tIDMgYml0cyBhcmUgdGhlIHByaW9yaXR5ICgwLTcpIGFuZCB0aGUgdG9wIDI4IGJpdHMgYXJlIHRoZSBmYWNpbGl0eQorICogKDAtYmlnIG51bWJlcikuICBCb3RoIHRoZSBwcmlvcml0aWVzIGFuZCB0aGUgZmFjaWxpdGllcyBtYXAgcm91Z2hseQorICogb25lLXRvLW9uZSB0byBzdHJpbmdzIGluIHRoZSBzeXNsb2dkKDgpIHNvdXJjZSBjb2RlLiAgVGhpcyBtYXBwaW5nIGlzCisgKiBpbmNsdWRlZCBpbiB0aGlzIGZpbGUuCisgKgorICogcHJpb3JpdGllcyAodGhlc2UgYXJlIG9yZGVyZWQpCisgKi8KKyNkZWZpbmUJTE9HX0VNRVJHCTAJLyogc3lzdGVtIGlzIHVudXNhYmxlICovCisjZGVmaW5lCUxPR19BTEVSVAkxCS8qIGFjdGlvbiBtdXN0IGJlIHRha2VuIGltbWVkaWF0ZWx5ICovCisjZGVmaW5lCUxPR19DUklUCTIJLyogY3JpdGljYWwgY29uZGl0aW9ucyAqLworI2RlZmluZQlMT0dfRVJSCQkzCS8qIGVycm9yIGNvbmRpdGlvbnMgKi8KKyNkZWZpbmUJTE9HX1dBUk5JTkcJNAkvKiB3YXJuaW5nIGNvbmRpdGlvbnMgKi8KKyNkZWZpbmUJTE9HX05PVElDRQk1CS8qIG5vcm1hbCBidXQgc2lnbmlmaWNhbnQgY29uZGl0aW9uICovCisjZGVmaW5lCUxPR19JTkZPCTYJLyogaW5mb3JtYXRpb25hbCAqLworI2RlZmluZQlMT0dfREVCVUcJNwkvKiBkZWJ1Zy1sZXZlbCBtZXNzYWdlcyAqLworCisjZGVmaW5lCUxPR19QUklNQVNLCTB4MDcJLyogbWFzayB0byBleHRyYWN0IHByaW9yaXR5IHBhcnQgKGludGVybmFsKSAqLworCQkJCS8qIGV4dHJhY3QgcHJpb3JpdHkgKi8KKyNkZWZpbmUJTE9HX1BSSShwKQkoKHApICYgTE9HX1BSSU1BU0spCisjZGVmaW5lCUxPR19NQUtFUFJJKGZhYywgcHJpKQkoKChmYWMpIDw8IDMpIHwgKHByaSkpCisKKyNpZmRlZiBTWVNMT0dfTkFNRVMKKyNkZWZpbmUJSU5URVJOQUxfTk9QUkkJMHgxMAkvKiB0aGUgIm5vIHByaW9yaXR5IiBwcmlvcml0eSAqLworCQkJCS8qIG1hcmsgImZhY2lsaXR5IiAqLworI2RlZmluZQlJTlRFUk5BTF9NQVJLCUxPR19NQUtFUFJJKExPR19ORkFDSUxJVElFUywgMCkKK3R5cGVkZWYgc3RydWN0IF9jb2RlIHsKKwljaGFyCSpjX25hbWU7CisJaW50CWNfdmFsOworfSBDT0RFOworCitDT0RFIHByaW9yaXR5bmFtZXNbXSA9CisgIHsKKyAgICB7ICJhbGVydCIsIExPR19BTEVSVCB9LAorICAgIHsgImNyaXQiLCBMT0dfQ1JJVCB9LAorICAgIHsgImRlYnVnIiwgTE9HX0RFQlVHIH0sCisgICAgeyAiZW1lcmciLCBMT0dfRU1FUkcgfSwKKyAgICB7ICJlcnIiLCBMT0dfRVJSIH0sCisgICAgeyAiZXJyb3IiLCBMT0dfRVJSIH0sCQkvKiBERVBSRUNBVEVEICovCisgICAgeyAiaW5mbyIsIExPR19JTkZPIH0sCisgICAgeyAibm9uZSIsIElOVEVSTkFMX05PUFJJIH0sCQkvKiBJTlRFUk5BTCAqLworICAgIHsgIm5vdGljZSIsIExPR19OT1RJQ0UgfSwKKyAgICB7ICJwYW5pYyIsIExPR19FTUVSRyB9LAkJLyogREVQUkVDQVRFRCAqLworICAgIHsgIndhcm4iLCBMT0dfV0FSTklORyB9LAkJLyogREVQUkVDQVRFRCAqLworICAgIHsgIndhcm5pbmciLCBMT0dfV0FSTklORyB9LAorICAgIHsgTlVMTCwgLTEgfQorICB9OworI2VuZGlmCisKKy8qIGZhY2lsaXR5IGNvZGVzICovCisjZGVmaW5lCUxPR19LRVJOCSgwPDwzKQkvKiBrZXJuZWwgbWVzc2FnZXMgKi8KKyNkZWZpbmUJTE9HX1VTRVIJKDE8PDMpCS8qIHJhbmRvbSB1c2VyLWxldmVsIG1lc3NhZ2VzICovCisjZGVmaW5lCUxPR19NQUlMCSgyPDwzKQkvKiBtYWlsIHN5c3RlbSAqLworI2RlZmluZQlMT0dfREFFTU9OCSgzPDwzKQkvKiBzeXN0ZW0gZGFlbW9ucyAqLworI2RlZmluZQlMT0dfQVVUSAkoNDw8MykJLyogc2VjdXJpdHkvYXV0aG9yaXphdGlvbiBtZXNzYWdlcyAqLworI2RlZmluZQlMT0dfU1lTTE9HCSg1PDwzKQkvKiBtZXNzYWdlcyBnZW5lcmF0ZWQgaW50ZXJuYWxseSBieSBzeXNsb2dkICovCisjZGVmaW5lCUxPR19MUFIJCSg2PDwzKQkvKiBsaW5lIHByaW50ZXIgc3Vic3lzdGVtICovCisjZGVmaW5lCUxPR19ORVdTCSg3PDwzKQkvKiBuZXR3b3JrIG5ld3Mgc3Vic3lzdGVtICovCisjZGVmaW5lCUxPR19VVUNQCSg4PDwzKQkvKiBVVUNQIHN1YnN5c3RlbSAqLworI2RlZmluZQlMT0dfQ1JPTgkoOTw8MykJLyogY2xvY2sgZGFlbW9uICovCisjZGVmaW5lCUxPR19BVVRIUFJJVgkoMTA8PDMpCS8qIHNlY3VyaXR5L2F1dGhvcml6YXRpb24gbWVzc2FnZXMgKHByaXZhdGUpICovCisjZGVmaW5lCUxPR19GVFAJCSgxMTw8MykJLyogZnRwIGRhZW1vbiAqLworCisJLyogb3RoZXIgY29kZXMgdGhyb3VnaCAxNSByZXNlcnZlZCBmb3Igc3lzdGVtIHVzZSAqLworI2RlZmluZQlMT0dfTE9DQUwwCSgxNjw8MykJLyogcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZSAqLworI2RlZmluZQlMT0dfTE9DQUwxCSgxNzw8MykJLyogcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZSAqLworI2RlZmluZQlMT0dfTE9DQUwyCSgxODw8MykJLyogcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZSAqLworI2RlZmluZQlMT0dfTE9DQUwzCSgxOTw8MykJLyogcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZSAqLworI2RlZmluZQlMT0dfTE9DQUw0CSgyMDw8MykJLyogcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZSAqLworI2RlZmluZQlMT0dfTE9DQUw1CSgyMTw8MykJLyogcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZSAqLworI2RlZmluZQlMT0dfTE9DQUw2CSgyMjw8MykJLyogcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZSAqLworI2RlZmluZQlMT0dfTE9DQUw3CSgyMzw8MykJLyogcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZSAqLworCisjZGVmaW5lCUxPR19ORkFDSUxJVElFUwkyNAkvKiBjdXJyZW50IG51bWJlciBvZiBmYWNpbGl0aWVzICovCisjZGVmaW5lCUxPR19GQUNNQVNLCTB4MDNmOAkvKiBtYXNrIHRvIGV4dHJhY3QgZmFjaWxpdHkgcGFydCAqLworCQkJCS8qIGZhY2lsaXR5IG9mIHByaSAqLworI2RlZmluZQlMT0dfRkFDKHApCSgoKHApICYgTE9HX0ZBQ01BU0spID4+IDMpCisKKyNpZmRlZiBTWVNMT0dfTkFNRVMKK0NPREUgZmFjaWxpdHluYW1lc1tdID0KKyAgeworICAgIHsgImF1dGgiLCBMT0dfQVVUSCB9LAorICAgIHsgImF1dGhwcml2IiwgTE9HX0FVVEhQUklWIH0sCisgICAgeyAiY3JvbiIsIExPR19DUk9OIH0sCisgICAgeyAiZGFlbW9uIiwgTE9HX0RBRU1PTiB9LAorICAgIHsgImZ0cCIsIExPR19GVFAgfSwKKyAgICB7ICJrZXJuIiwgTE9HX0tFUk4gfSwKKyAgICB7ICJscHIiLCBMT0dfTFBSIH0sCisgICAgeyAibWFpbCIsIExPR19NQUlMIH0sCisgICAgeyAibWFyayIsIElOVEVSTkFMX01BUksgfSwJCS8qIElOVEVSTkFMICovCisgICAgeyAibmV3cyIsIExPR19ORVdTIH0sCisgICAgeyAic2VjdXJpdHkiLCBMT0dfQVVUSCB9LAkJLyogREVQUkVDQVRFRCAqLworICAgIHsgInN5c2xvZyIsIExPR19TWVNMT0cgfSwKKyAgICB7ICJ1c2VyIiwgTE9HX1VTRVIgfSwKKyAgICB7ICJ1dWNwIiwgTE9HX1VVQ1AgfSwKKyAgICB7ICJsb2NhbDAiLCBMT0dfTE9DQUwwIH0sCisgICAgeyAibG9jYWwxIiwgTE9HX0xPQ0FMMSB9LAorICAgIHsgImxvY2FsMiIsIExPR19MT0NBTDIgfSwKKyAgICB7ICJsb2NhbDMiLCBMT0dfTE9DQUwzIH0sCisgICAgeyAibG9jYWw0IiwgTE9HX0xPQ0FMNCB9LAorICAgIHsgImxvY2FsNSIsIExPR19MT0NBTDUgfSwKKyAgICB7ICJsb2NhbDYiLCBMT0dfTE9DQUw2IH0sCisgICAgeyAibG9jYWw3IiwgTE9HX0xPQ0FMNyB9LAorICAgIHsgTlVMTCwgLTEgfQorICB9OworI2VuZGlmCisKKy8qCisgKiBhcmd1bWVudHMgdG8gc2V0bG9nbWFzay4KKyAqLworI2RlZmluZQlMT0dfTUFTSyhwcmkpCSgxIDw8IChwcmkpKQkJLyogbWFzayBmb3Igb25lIHByaW9yaXR5ICovCisjZGVmaW5lCUxPR19VUFRPKHByaSkJKCgxIDw8ICgocHJpKSsxKSkgLSAxKQkvKiBhbGwgcHJpb3JpdGllcyB0aHJvdWdoIHByaSAqLworCisvKgorICogT3B0aW9uIGZsYWdzIGZvciBvcGVubG9nLgorICoKKyAqIExPR19PREVMQVkgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuCisgKiBMT0dfTkRFTEFZIGlzIHRoZSBpbnZlcnNlIG9mIHdoYXQgaXQgdXNlZCB0byBiZS4KKyAqLworI2RlZmluZQlMT0dfUElECQkweDAxCS8qIGxvZyB0aGUgcGlkIHdpdGggZWFjaCBtZXNzYWdlICovCisjZGVmaW5lCUxPR19DT05TCTB4MDIJLyogbG9nIG9uIHRoZSBjb25zb2xlIGlmIGVycm9ycyBpbiBzZW5kaW5nICovCisjZGVmaW5lCUxPR19PREVMQVkJMHgwNAkvKiBkZWxheSBvcGVuIHVudGlsIGZpcnN0IHN5c2xvZygpIChkZWZhdWx0KSAqLworI2RlZmluZQlMT0dfTkRFTEFZCTB4MDgJLyogZG9uJ3QgZGVsYXkgb3BlbiAqLworI2RlZmluZQlMT0dfTk9XQUlUCTB4MTAJLyogZG9uJ3Qgd2FpdCBmb3IgY29uc29sZSBmb3JrczogREVQUkVDQVRFRCAqLworI2RlZmluZQlMT0dfUEVSUk9SCTB4MjAJLyogbG9nIHRvIHN0ZGVyciBhcyB3ZWxsICovCisKK19fQkVHSU5fREVDTFMKKworLyogQ2xvc2UgZGVzY3JpcHRvciB1c2VkIHRvIHdyaXRlIHRvIHN5c3RlbSBsb2dnZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgY2xvc2Vsb2cgKHZvaWQpOworCisvKiBPcGVuIGNvbm5lY3Rpb24gdG8gc3lzdGVtIGxvZ2dlci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBvcGVubG9nIChfX2NvbnN0IGNoYXIgKl9faWRlbnQsIGludCBfX29wdGlvbiwgaW50IF9fZmFjaWxpdHkpOworCisvKiBTZXQgdGhlIGxvZyBtYXNrIGxldmVsLiAgKi8KK2V4dGVybiBpbnQgc2V0bG9nbWFzayAoaW50IF9fbWFzaykgX19USFJPVzsKKworLyogR2VuZXJhdGUgYSBsb2cgbWVzc2FnZSB1c2luZyBGTVQgc3RyaW5nIGFuZCBvcHRpb24gYXJndW1lbnRzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIHN5c2xvZyAoaW50IF9fcHJpLCBfX2NvbnN0IGNoYXIgKl9fZm10LCAuLi4pCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAyLCAzKSkpOworCisjaWZkZWYgX19VU0VfQlNECisvKiBHZW5lcmF0ZSBhIGxvZyBtZXNzYWdlIHVzaW5nIEZNVCBhbmQgdXNpbmcgYXJndW1lbnRzIHBvaW50ZWQgdG8gYnkgQVAuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIHZzeXNsb2cgKGludCBfX3ByaSwgX19jb25zdCBjaGFyICpfX2ZtdCwgX19nbnVjX3ZhX2xpc3QgX19hcCkKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDIsIDApKSk7CisjZW5kaWYKKworCisvKiBEZWZpbmUgc29tZSBtYWNyb3MgaGVscGluZyB0byBjYXRjaCBidWZmZXIgb3ZlcmZsb3dzLiAgKi8KKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUKKyMgaW5jbHVkZSA8Yml0cy9zeXNsb2cuaD4KKyNlbmRpZgorI2lmZGVmIF9fTERCTF9DT01QQVQKKyMgaW5jbHVkZSA8Yml0cy9zeXNsb2ctbGRibC5oPgorI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvc3lzbG9nLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3N5c21hY3Jvcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvc3lzbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwMGM5MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3N5c21hY3Jvcy5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIERlZmluaXRpb25zIG9mIG1hY3JvcyB0byBhY2Nlc3MgYGRldl90JyB2YWx1ZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTksIDIwMDMsIDIwMDQsIDIwMDcsIDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU1lTTUFDUk9TX0gKKyNkZWZpbmUgX1NZU19TWVNNQUNST1NfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBJZiB0aGUgY29tcGlsZXIgZG9lcyBub3Qga25vdyBsb25nIGxvbmcgaXQgaXMgb3V0IG9mIGx1Y2suICBXZSBhcmUKKyAgIG5vdCBnb2luZyB0byBoYWNrIHdlaXJkIGhhY2tzIHRvIHN1cHBvcnQgdGhlIGRldl90IHJlcHJlc2VudGF0aW9uCisgICB0aGV5IG5lZWQuICAqLworI2lmZGVmIF9fR0xJQkNfSEFWRV9MT05HX0xPTkcKK19fQkVHSU5fREVDTFMKKworX19leHRlbnNpb25fXworZXh0ZXJuIHVuc2lnbmVkIGludCBnbnVfZGV2X21ham9yICh1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fZGV2KQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2NvbnN0X187CitfX2V4dGVuc2lvbl9fCitleHRlcm4gdW5zaWduZWQgaW50IGdudV9kZXZfbWlub3IgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX19kZXYpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfY29uc3RfXzsKK19fZXh0ZW5zaW9uX18KK2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IGdudV9kZXZfbWFrZWRldiAodW5zaWduZWQgaW50IF9fbWFqb3IsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgX19taW5vcikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9jb25zdF9fOworCisjIGlmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMiAmJiBkZWZpbmVkIF9fVVNFX0VYVEVSTl9JTkxJTkVTCitfX2V4dGVuc2lvbl9fIF9fZXh0ZXJuX2lubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIHVuc2lnbmVkIGludAorX19OVEggKGdudV9kZXZfbWFqb3IgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX19kZXYpKQoreworICByZXR1cm4gKChfX2RldiA+PiA4KSAmIDB4ZmZmKSB8ICgodW5zaWduZWQgaW50KSAoX19kZXYgPj4gMzIpICYgfjB4ZmZmKTsKK30KKworX19leHRlbnNpb25fXyBfX2V4dGVybl9pbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyB1bnNpZ25lZCBpbnQKK19fTlRIIChnbnVfZGV2X21pbm9yICh1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fZGV2KSkKK3sKKyAgcmV0dXJuIChfX2RldiAmIDB4ZmYpIHwgKCh1bnNpZ25lZCBpbnQpIChfX2RldiA+PiAxMikgJiB+MHhmZik7Cit9CisKK19fZXh0ZW5zaW9uX18gX19leHRlcm5faW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gdW5zaWduZWQgbG9uZyBsb25nIGludAorX19OVEggKGdudV9kZXZfbWFrZWRldiAodW5zaWduZWQgaW50IF9fbWFqb3IsIHVuc2lnbmVkIGludCBfX21pbm9yKSkKK3sKKyAgcmV0dXJuICgoX19taW5vciAmIDB4ZmYpIHwgKChfX21ham9yICYgMHhmZmYpIDw8IDgpCisJICB8ICgoKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIChfX21pbm9yICYgfjB4ZmYpKSA8PCAxMikKKwkgIHwgKCgodW5zaWduZWQgbG9uZyBsb25nIGludCkgKF9fbWFqb3IgJiB+MHhmZmYpKSA8PCAzMikpOworfQorIyBlbmRpZgorX19FTkRfREVDTFMKKworLyogQWNjZXNzIHRoZSBmdW5jdGlvbnMgd2l0aCB0aGVpciB0cmFkaXRpb25hbCBuYW1lcy4gICovCisjIGRlZmluZSBtYWpvcihkZXYpIGdudV9kZXZfbWFqb3IgKGRldikKKyMgZGVmaW5lIG1pbm9yKGRldikgZ251X2Rldl9taW5vciAoZGV2KQorIyBkZWZpbmUgbWFrZWRldihtYWosIG1pbikgZ251X2Rldl9tYWtlZGV2IChtYWosIG1pbikKKyNlbmRpZgorCisjZW5kaWYgLyogc3lzL3N5c21hY3Jvcy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy90ZXJtaW9zLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy90ZXJtaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxODgwNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3Rlcm1pb3MuaApAQCAtMCwwICsxLDQgQEAKKyNpZm5kZWYgX1NZU19URVJNSU9TX0gKKyNkZWZpbmUgX1NZU19URVJNSU9TX0gKKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3RpbWUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWVjZjYwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdGltZS5oCkBAIC0wLDAgKzEsMTkzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NCwxOTk2LTIwMDMsMjAwNSwyMDA2LDIwMDkKKwlGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1RJTUVfSAorI2RlZmluZSBfU1lTX1RJTUVfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorI2RlZmluZSBfX25lZWRfdGltZV90CisjaW5jbHVkZSA8dGltZS5oPgorI2RlZmluZSBfX25lZWRfdGltZXZhbAorI2luY2x1ZGUgPGJpdHMvdGltZS5oPgorCisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorCisjaWZuZGVmIF9fc3VzZWNvbmRzX3RfZGVmaW5lZAordHlwZWRlZiBfX3N1c2Vjb25kc190IHN1c2Vjb25kc190OworIyBkZWZpbmUgX19zdXNlY29uZHNfdF9kZWZpbmVkCisjZW5kaWYKKworCitfX0JFR0lOX0RFQ0xTCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIE1hY3JvcyBmb3IgY29udmVydGluZyBiZXR3ZWVuIGBzdHJ1Y3QgdGltZXZhbCcgYW5kIGBzdHJ1Y3QgdGltZXNwZWMnLiAgKi8KKyMgZGVmaW5lIFRJTUVWQUxfVE9fVElNRVNQRUModHYsIHRzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh0cyktPnR2X3NlYyA9ICh0diktPnR2X3NlYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh0cyktPnR2X25zZWMgPSAodHYpLT50dl91c2VjICogMTAwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjIGRlZmluZSBUSU1FU1BFQ19UT19USU1FVkFMKHR2LCB0cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAodHYpLT50dl9zZWMgPSAodHMpLT50dl9zZWM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAodHYpLT50dl91c2VjID0gKHRzKS0+dHZfbnNlYyAvIDEwMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0JTRAorLyogU3RydWN0dXJlIGNydWRlbHkgcmVwcmVzZW50aW5nIGEgdGltZXpvbmUuCisgICBUaGlzIGlzIG9ic29sZXRlIGFuZCBzaG91bGQgbmV2ZXIgYmUgdXNlZC4gICovCitzdHJ1Y3QgdGltZXpvbmUKKyAgeworICAgIGludCB0el9taW51dGVzd2VzdDsJCS8qIE1pbnV0ZXMgd2VzdCBvZiBHTVQuICAqLworICAgIGludCB0el9kc3R0aW1lOwkJLyogTm9uemVybyBpZiBEU1QgaXMgZXZlciBpbiBlZmZlY3QuICAqLworICB9OworCit0eXBlZGVmIHN0cnVjdCB0aW1lem9uZSAqX19yZXN0cmljdCBfX3RpbWV6b25lX3B0cl90OworI2Vsc2UKK3R5cGVkZWYgdm9pZCAqX19yZXN0cmljdCBfX3RpbWV6b25lX3B0cl90OworI2VuZGlmCisKKy8qIEdldCB0aGUgY3VycmVudCB0aW1lIG9mIGRheSBhbmQgdGltZXpvbmUgaW5mb3JtYXRpb24sCisgICBwdXR0aW5nIGl0IGludG8gKlRWIGFuZCAqVFouICBJZiBUWiBpcyBOVUxMLCAqVFogaXMgbm90IGZpbGxlZC4KKyAgIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcnMuCisgICBOT1RFOiBUaGlzIGZvcm0gb2YgdGltZXpvbmUgaW5mb3JtYXRpb24gaXMgb2Jzb2xldGUuCisgICBVc2UgdGhlIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGRlY2xhcmVkIGluIDx0aW1lLmg+IGluc3RlYWQuICAqLworZXh0ZXJuIGludCBnZXR0aW1lb2ZkYXkgKHN0cnVjdCB0aW1ldmFsICpfX3Jlc3RyaWN0IF9fdHYsCisJCQkgX190aW1lem9uZV9wdHJfdCBfX3R6KSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmZGVmIF9fVVNFX0JTRAorLyogU2V0IHRoZSBjdXJyZW50IHRpbWUgb2YgZGF5IGFuZCB0aW1lem9uZSBpbmZvcm1hdGlvbi4KKyAgIFRoaXMgY2FsbCBpcyByZXN0cmljdGVkIHRvIHRoZSBzdXBlci11c2VyLiAgKi8KK2V4dGVybiBpbnQgc2V0dGltZW9mZGF5IChfX2NvbnN0IHN0cnVjdCB0aW1ldmFsICpfX3R2LAorCQkJIF9fY29uc3Qgc3RydWN0IHRpbWV6b25lICpfX3R6KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogQWRqdXN0IHRoZSBjdXJyZW50IHRpbWUgb2YgZGF5IGJ5IHRoZSBhbW91bnQgaW4gREVMVEEuCisgICBJZiBPTERERUxUQSBpcyBub3QgTlVMTCwgaXQgaXMgZmlsbGVkIGluIHdpdGggdGhlIGFtb3VudAorICAgb2YgdGltZSBhZGp1c3RtZW50IHJlbWFpbmluZyB0byBiZSBkb25lIGZyb20gdGhlIGxhc3QgYGFkanRpbWUnIGNhbGwuCisgICBUaGlzIGNhbGwgaXMgcmVzdHJpY3RlZCB0byB0aGUgc3VwZXItdXNlci4gICovCitleHRlcm4gaW50IGFkanRpbWUgKF9fY29uc3Qgc3RydWN0IHRpbWV2YWwgKl9fZGVsdGEsCisJCSAgICBzdHJ1Y3QgdGltZXZhbCAqX19vbGRkZWx0YSkgX19USFJPVzsKKyNlbmRpZgorCisKKy8qIFZhbHVlcyBmb3IgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGBnZXRpdGltZXInIGFuZCBgc2V0aXRpbWVyJy4gICovCitlbnVtIF9faXRpbWVyX3doaWNoCisgIHsKKyAgICAvKiBUaW1lcnMgcnVuIGluIHJlYWwgdGltZS4gICovCisgICAgSVRJTUVSX1JFQUwgPSAwLAorI2RlZmluZSBJVElNRVJfUkVBTCBJVElNRVJfUkVBTAorICAgIC8qIFRpbWVycyBydW4gb25seSB3aGVuIHRoZSBwcm9jZXNzIGlzIGV4ZWN1dGluZy4gICovCisgICAgSVRJTUVSX1ZJUlRVQUwgPSAxLAorI2RlZmluZSBJVElNRVJfVklSVFVBTCBJVElNRVJfVklSVFVBTAorICAgIC8qIFRpbWVycyBydW4gd2hlbiB0aGUgcHJvY2VzcyBpcyBleGVjdXRpbmcgYW5kIHdoZW4KKyAgICAgICB0aGUgc3lzdGVtIGlzIGV4ZWN1dGluZyBvbiBiZWhhbGYgb2YgdGhlIHByb2Nlc3MuICAqLworICAgIElUSU1FUl9QUk9GID0gMgorI2RlZmluZSBJVElNRVJfUFJPRiBJVElNRVJfUFJPRgorICB9OworCisvKiBUeXBlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGdldGl0aW1lcicgYW5kCisgICB0aGUgc2Vjb25kIGFuZCB0aGlyZCBhcmd1bWVudHMgYHNldGl0aW1lcicuICAqLworc3RydWN0IGl0aW1lcnZhbAorICB7CisgICAgLyogVmFsdWUgdG8gcHV0IGludG8gYGl0X3ZhbHVlJyB3aGVuIHRoZSB0aW1lciBleHBpcmVzLiAgKi8KKyAgICBzdHJ1Y3QgdGltZXZhbCBpdF9pbnRlcnZhbDsKKyAgICAvKiBUaW1lIHRvIHRoZSBuZXh0IHRpbWVyIGV4cGlyYXRpb24uICAqLworICAgIHN0cnVjdCB0aW1ldmFsIGl0X3ZhbHVlOworICB9OworCisjaWYgZGVmaW5lZCBfX1VTRV9HTlUgJiYgIWRlZmluZWQgX19jcGx1c3BsdXMKKy8qIFVzZSB0aGUgbmljZXIgcGFyYW1ldGVyIHR5cGUgb25seSBpbiBHTlUgbW9kZSBhbmQgbm90IGZvciBDKysgc2luY2UgdGhlCisgICBzdHJpY3QgQysrIHJ1bGVzIHByZXZlbnQgdGhlIGF1dG9tYXRpYyBwcm9tb3Rpb24uICAqLwordHlwZWRlZiBlbnVtIF9faXRpbWVyX3doaWNoIF9faXRpbWVyX3doaWNoX3Q7CisjZWxzZQordHlwZWRlZiBpbnQgX19pdGltZXJfd2hpY2hfdDsKKyNlbmRpZgorCisvKiBTZXQgKlZBTFVFIHRvIHRoZSBjdXJyZW50IHNldHRpbmcgb2YgdGltZXIgV0hJQ0guCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcnMuICAqLworZXh0ZXJuIGludCBnZXRpdGltZXIgKF9faXRpbWVyX3doaWNoX3QgX193aGljaCwKKwkJICAgICAgc3RydWN0IGl0aW1lcnZhbCAqX192YWx1ZSkgX19USFJPVzsKKworLyogU2V0IHRoZSB0aW1lciBXSElDSCB0byAqTkVXLiAgSWYgT0xEIGlzIG5vdCBOVUxMLAorICAgc2V0ICpPTEQgdG8gdGhlIG9sZCB2YWx1ZSBvZiB0aW1lciBXSElDSC4KKyAgIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcnMuICAqLworZXh0ZXJuIGludCBzZXRpdGltZXIgKF9faXRpbWVyX3doaWNoX3QgX193aGljaCwKKwkJICAgICAgX19jb25zdCBzdHJ1Y3QgaXRpbWVydmFsICpfX3Jlc3RyaWN0IF9fbmV3LAorCQkgICAgICBzdHJ1Y3QgaXRpbWVydmFsICpfX3Jlc3RyaWN0IF9fb2xkKSBfX1RIUk9XOworCisvKiBDaGFuZ2UgdGhlIGFjY2VzcyB0aW1lIG9mIEZJTEUgdG8gVFZQWzBdIGFuZCB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YKKyAgIEZJTEUgdG8gVFZQWzFdLiAgSWYgVFZQIGlzIGEgbnVsbCBwb2ludGVyLCB1c2UgdGhlIGN1cnJlbnQgdGltZSBpbnN0ZWFkLgorICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9ycy4gICovCitleHRlcm4gaW50IHV0aW1lcyAoX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fY29uc3Qgc3RydWN0IHRpbWV2YWwgX190dnBbMl0pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjaWZkZWYgX19VU0VfQlNECisvKiBTYW1lIGFzIGB1dGltZXMnLCBidXQgZG9lcyBub3QgZm9sbG93IHN5bWJvbGljIGxpbmtzLiAgKi8KK2V4dGVybiBpbnQgbHV0aW1lcyAoX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fY29uc3Qgc3RydWN0IHRpbWV2YWwgX190dnBbMl0pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBTYW1lIGFzIGB1dGltZXMnLCBidXQgdGFrZXMgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IgaW5zdGVhZCBvZiBhIG5hbWUuICAqLworZXh0ZXJuIGludCBmdXRpbWVzIChpbnQgX19mZCwgX19jb25zdCBzdHJ1Y3QgdGltZXZhbCBfX3R2cFsyXSkgX19USFJPVzsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisvKiBDaGFuZ2UgdGhlIGFjY2VzcyB0aW1lIG9mIEZJTEUgcmVsYXRpdmUgdG8gRkQgdG8gVFZQWzBdIGFuZCB0aGUKKyAgIG1vZGlmaWNhdGlvbiB0aW1lIG9mIEZJTEUgdG8gVFZQWzFdLiAgSWYgVFZQIGlzIGEgbnVsbCBwb2ludGVyLCB1c2UKKyAgIHRoZSBjdXJyZW50IHRpbWUgaW5zdGVhZC4gIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcnMuICAqLworZXh0ZXJuIGludCBmdXRpbWVzYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fZmlsZSwKKwkJICAgICAgX19jb25zdCBzdHJ1Y3QgdGltZXZhbCBfX3R2cFsyXSkgX19USFJPVzsKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIENvbnZlbmllbmNlIG1hY3JvcyBmb3Igb3BlcmF0aW9ucyBvbiB0aW1ldmFscy4KKyAgIE5PVEU6IGB0aW1lcmNtcCcgZG9lcyBub3Qgd29yayBmb3IgPj0gb3IgPD0uICAqLworIyBkZWZpbmUgdGltZXJpc3NldCh0dnApCSgodHZwKS0+dHZfc2VjIHx8ICh0dnApLT50dl91c2VjKQorIyBkZWZpbmUgdGltZXJjbGVhcih0dnApCSgodHZwKS0+dHZfc2VjID0gKHR2cCktPnR2X3VzZWMgPSAwKQorIyBkZWZpbmUgdGltZXJjbXAoYSwgYiwgQ01QKSAJCQkJCQkgICAgICBcCisgICgoKGEpLT50dl9zZWMgPT0gKGIpLT50dl9zZWMpID8gCQkJCQkgICAgICBcCisgICAoKGEpLT50dl91c2VjIENNUCAoYiktPnR2X3VzZWMpIDogCQkJCQkgICAgICBcCisgICAoKGEpLT50dl9zZWMgQ01QIChiKS0+dHZfc2VjKSkKKyMgZGVmaW5lIHRpbWVyYWRkKGEsIGIsIHJlc3VsdCkJCQkJCQkgICAgICBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgKHJlc3VsdCktPnR2X3NlYyA9IChhKS0+dHZfc2VjICsgKGIpLT50dl9zZWM7CQkJICAgICAgXAorICAgIChyZXN1bHQpLT50dl91c2VjID0gKGEpLT50dl91c2VjICsgKGIpLT50dl91c2VjOwkJCSAgICAgIFwKKyAgICBpZiAoKHJlc3VsdCktPnR2X3VzZWMgPj0gMTAwMDAwMCkJCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisJKysocmVzdWx0KS0+dHZfc2VjOwkJCQkJCSAgICAgIFwKKwkocmVzdWx0KS0+dHZfdXNlYyAtPSAxMDAwMDAwOwkJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIHRpbWVyc3ViKGEsIGIsIHJlc3VsdCkJCQkJCQkgICAgICBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgKHJlc3VsdCktPnR2X3NlYyA9IChhKS0+dHZfc2VjIC0gKGIpLT50dl9zZWM7CQkJICAgICAgXAorICAgIChyZXN1bHQpLT50dl91c2VjID0gKGEpLT50dl91c2VjIC0gKGIpLT50dl91c2VjOwkJCSAgICAgIFwKKyAgICBpZiAoKHJlc3VsdCktPnR2X3VzZWMgPCAwKSB7CQkJCQkgICAgICBcCisgICAgICAtLShyZXN1bHQpLT50dl9zZWM7CQkJCQkJICAgICAgXAorICAgICAgKHJlc3VsdCktPnR2X3VzZWMgKz0gMTAwMDAwMDsJCQkJCSAgICAgIFwKKyAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorI2VuZGlmCS8qIEJTRCAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3RpbWUuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdGltZWIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3RpbWViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJkYmY0NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3RpbWViLmgKQEAgLTAsMCArMSw0NiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfVElNRUJfSAorI2RlZmluZSBfU1lTX1RJTUVCX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2RlZmluZSBfX25lZWRfdGltZV90CisjaW5jbHVkZSA8dGltZS5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogU3RydWN0dXJlIHJldHVybmVkIGJ5IHRoZSBgZnRpbWUnIGZ1bmN0aW9uLiAgKi8KKworc3RydWN0IHRpbWViCisgIHsKKyAgICB0aW1lX3QgdGltZTsJCS8qIFNlY29uZHMgc2luY2UgZXBvY2gsIGFzIGZyb20gYHRpbWUnLiAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgbWlsbGl0bTsJLyogQWRkaXRpb25hbCBtaWxsaXNlY29uZHMuICAqLworICAgIHNob3J0IGludCB0aW1lem9uZTsJCS8qIE1pbnV0ZXMgd2VzdCBvZiBHTVQuICAqLworICAgIHNob3J0IGludCBkc3RmbGFnOwkJLyogTm9uemVybyBpZiBEYXlsaWdodCBTYXZpbmdzIFRpbWUgdXNlZC4gICovCisgIH07CisKKy8qIEZpbGwgaW4gVElNRUJVRiB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHRpbWUuICAqLworCitleHRlcm4gaW50IGZ0aW1lIChzdHJ1Y3QgdGltZWIgKl9fdGltZWJ1Zik7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvdGltZWIuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdGltZXJmZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdGltZXJmZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYmIwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy90aW1lcmZkLmgKQEAgLTAsMCArMSw2MCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfVElNRVJGRF9ICisjZGVmaW5lCV9TWVNfVElNRVJGRF9ICTEKKworI2luY2x1ZGUgPHRpbWUuaD4KKworCisvKiBCaXRzIHRvIGJlIHNldCBpbiB0aGUgRkxBR1MgcGFyYW1ldGVyIG9mIGB0aW1lcmZkX2NyZWF0ZScuICAqLworZW51bQorICB7CisgICAgVEZEX0NMT0VYRUMgPSAwMjAwMDAwMCwKKyNkZWZpbmUgVEZEX0NMT0VYRUMgVEZEX0NMT0VYRUMKKyAgICBURkRfTk9OQkxPQ0sgPSAwNDAwMAorI2RlZmluZSBURkRfTk9OQkxPQ0sgVEZEX05PTkJMT0NLCisgIH07CisKKworLyogQml0cyB0byBiZSBzZXQgaW4gdGhlIEZMQUdTIHBhcmFtZXRlciBvZiBgdGltZXJmZF9zZXR0aW1lJy4gICovCitlbnVtCisgIHsKKyAgICBURkRfVElNRVJfQUJTVElNRSA9IDEgPDwgMAorI2RlZmluZSBURkRfVElNRVJfQUJTVElNRSBURkRfVElNRVJfQUJTVElNRQorICB9OworCisKK19fQkVHSU5fREVDTFMKKworLyogUmV0dXJuIGZpbGUgZGVzY3JpcHRvciBmb3IgbmV3IGludGVydmFsIHRpbWVyIHNvdXJjZS4gICovCitleHRlcm4gaW50IHRpbWVyZmRfY3JlYXRlIChjbG9ja2lkX3QgX19jbG9ja19pZCwgaW50IF9fZmxhZ3MpIF9fVEhST1c7CisKKy8qIFNldCBuZXh0IGV4cGlyYXRpb24gdGltZSBvZiBpbnRlcnZhbCB0aW1lciBzb3VyY2UgVUZEIHRvIFVUTVIuICBJZgorICAgRkxBR1MgaGFzIHRoZSBURkRfVElNRVJfQUJTVElNRSBmbGFnIHNldCB0aGUgdGltZW91dCB2YWx1ZSBpcworICAgYWJzb2x1dGUuICBPcHRpb25hbGx5IHJldHVybiB0aGUgb2xkIGV4cGlyYXRpb24gdGltZSBpbiBPVE1SLiAgKi8KK2V4dGVybiBpbnQgdGltZXJmZF9zZXR0aW1lIChpbnQgX191ZmQsIGludCBfX2ZsYWdzLAorCQkJICAgIF9fY29uc3Qgc3RydWN0IGl0aW1lcnNwZWMgKl9fdXRtciwKKwkJCSAgICBzdHJ1Y3QgaXRpbWVyc3BlYyAqX19vdG1yKSBfX1RIUk9XOworCisvKiBSZXR1cm4gdGhlIG5leHQgZXhwaXJhdGlvbiB0aW1lIG9mIFVGRC4gICovCitleHRlcm4gaW50IHRpbWVyZmRfZ2V0dGltZSAoaW50IF9fdWZkLCBzdHJ1Y3QgaXRpbWVyc3BlYyAqX19vdG1yKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3RpbWVyZmQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdGltZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3RpbWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyMmYyZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3RpbWVzLmgKQEAgLTAsMCArMSw1MyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTk2LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJUE9TSVggU3RhbmRhcmQ6IDQuNS4yIFByb2Nlc3MgVGltZXMJPHN5cy90aW1lcy5oPgorICovCisKKyNpZm5kZWYJX1NZU19USU1FU19ICisjZGVmaW5lCV9TWVNfVElNRVNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZGVmaW5lCV9fbmVlZF9jbG9ja190CisjaW5jbHVkZSA8dGltZS5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgQ1BVIHRpbWUgdXNlZCBieSBhIHByb2Nlc3MgYW5kIGl0cyBjaGlsZHJlbi4gICovCitzdHJ1Y3QgdG1zCisgIHsKKyAgICBjbG9ja190IHRtc191dGltZTsJCS8qIFVzZXIgQ1BVIHRpbWUuICAqLworICAgIGNsb2NrX3QgdG1zX3N0aW1lOwkJLyogU3lzdGVtIENQVSB0aW1lLiAgKi8KKworICAgIGNsb2NrX3QgdG1zX2N1dGltZTsJCS8qIFVzZXIgQ1BVIHRpbWUgb2YgZGVhZCBjaGlsZHJlbi4gICovCisgICAgY2xvY2tfdCB0bXNfY3N0aW1lOwkJLyogU3lzdGVtIENQVSB0aW1lIG9mIGRlYWQgY2hpbGRyZW4uICAqLworICB9OworCisKKy8qIFN0b3JlIHRoZSBDUFUgdGltZSB1c2VkIGJ5IHRoaXMgcHJvY2VzcyBhbmQgYWxsIGl0cworICAgZGVhZCBjaGlsZHJlbiAoYW5kIHRoZWlyIGRlYWQgY2hpbGRyZW4pIGluIEJVRkZFUi4KKyAgIFJldHVybiB0aGUgZWxhcHNlZCByZWFsIHRpbWUsIG9yIChjbG9ja190KSAtMSBmb3IgZXJyb3JzLgorICAgQWxsIHRpbWVzIGFyZSBpbiBDTEtfVENLdGhzIG9mIGEgc2Vjb25kLiAgKi8KK2V4dGVybiBjbG9ja190IHRpbWVzIChzdHJ1Y3QgdG1zICpfX2J1ZmZlcikgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy90aW1lcy5oCSovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy90aW1leC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdGltZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTYxYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdGltZXguaApAQCAtMCwwICsxLDcyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywxOTk5LDIwMDcsMjAwOSwyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfVElNRVhfSAorI2RlZmluZQlfU1lTX1RJTUVYX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisvKiBUaGVzZSBkZWZpbml0aW9ucyBmcm9tIGxpbnV4L3RpbWV4LmggYXMgb2YgMi42LjMwLiAgKi8KKworI2luY2x1ZGUgPGJpdHMvdGltZXguaD4KKworI2RlZmluZSBOVFBfQVBJCTQJLyogTlRQIEFQSSB2ZXJzaW9uICovCisKK3N0cnVjdCBudHB0aW1ldmFsCit7CisgIHN0cnVjdCB0aW1ldmFsIHRpbWU7CS8qIGN1cnJlbnQgdGltZSAocm8pICovCisgIGxvbmcgaW50IG1heGVycm9yOwkvKiBtYXhpbXVtIGVycm9yICh1cykgKHJvKSAqLworICBsb25nIGludCBlc3RlcnJvcjsJLyogZXN0aW1hdGVkIGVycm9yICh1cykgKHJvKSAqLworICBsb25nIGludCB0YWk7CQkvKiBUQUkgb2Zmc2V0IChybykgKi8KKworICBsb25nIGludCBfX3VudXNlZDE7CisgIGxvbmcgaW50IF9fdW51c2VkMjsKKyAgbG9uZyBpbnQgX191bnVzZWQzOworICBsb25nIGludCBfX3VudXNlZDQ7Cit9OworCisvKiBDbG9jayBzdGF0ZXMgKHRpbWVfc3RhdGUpICovCisjZGVmaW5lIFRJTUVfT0sJCTAJLyogY2xvY2sgc3luY2hyb25pemVkLCBubyBsZWFwIHNlY29uZCAqLworI2RlZmluZSBUSU1FX0lOUwkxCS8qIGluc2VydCBsZWFwIHNlY29uZCAqLworI2RlZmluZSBUSU1FX0RFTAkyCS8qIGRlbGV0ZSBsZWFwIHNlY29uZCAqLworI2RlZmluZSBUSU1FX09PUAkzCS8qIGxlYXAgc2Vjb25kIGluIHByb2dyZXNzICovCisjZGVmaW5lIFRJTUVfV0FJVAk0CS8qIGxlYXAgc2Vjb25kIGhhcyBvY2N1cnJlZCAqLworI2RlZmluZSBUSU1FX0VSUk9SCTUJLyogY2xvY2sgbm90IHN5bmNocm9uaXplZCAqLworI2RlZmluZSBUSU1FX0JBRAlUSU1FX0VSUk9SIC8qIGJ3IGNvbXBhdCAqLworCisvKiBNYXhpbXVtIHRpbWUgY29uc3RhbnQgb2YgdGhlIFBMTC4gICovCisjZGVmaW5lIE1BWFRDCQk2CisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIGludCBfX2FkanRpbWV4IChzdHJ1Y3QgdGltZXggKl9fbnR4KSBfX1RIUk9XOworZXh0ZXJuIGludCBhZGp0aW1leCAoc3RydWN0IHRpbWV4ICpfX250eCkgX19USFJPVzsKKworI2lmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChudHBfZ2V0dGltZSwgKHN0cnVjdCBudHB0aW1ldmFsICpfX250diksCisJCQkgICBudHBfZ2V0dGltZXgpOworI2Vsc2UKK2V4dGVybiBpbnQgbnRwX2dldHRpbWV4IChzdHJ1Y3QgbnRwdGltZXZhbCAqX19udHYpIF9fVEhST1c7CisjIGRlZmluZSBudHBfZ2V0dGltZSBudHBfZ2V0dGltZXgKKyNlbmRpZgorZXh0ZXJuIGludCBudHBfYWRqdGltZSAoc3RydWN0IHRpbWV4ICpfX3RudHgpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvdGltZXguaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdHR5Y2hhcnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3R0eWNoYXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0M2Y2MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3R0eWNoYXJzLmgKQEAgLTAsMCArMSw2MSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTAsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdHR5Y2hhcnMuaAk4LjIgKEJlcmtlbGV5KSAxLzQvOTQKKyAqLworCisvKgorICogNC4zIENPTVBBVElCSUxJVFkgRklMRQorICoKKyAqIFVzZXIgdmlzaWJsZSBzdHJ1Y3R1cmVzIGFuZCBjb25zdGFudHMgcmVsYXRlZCB0byB0ZXJtaW5hbCBoYW5kbGluZy4KKyAqLworI2lmbmRlZiBfU1lTX1RUWUNIQVJTX0gKKyNkZWZpbmUJX1NZU19UVFlDSEFSU19IIDEKKworc3RydWN0IHR0eWNoYXJzIHsKKwljaGFyCXRjX2VyYXNlOwkvKiBlcmFzZSBsYXN0IGNoYXJhY3RlciAqLworCWNoYXIJdGNfa2lsbDsJLyogZXJhc2UgZW50aXJlIGxpbmUgKi8KKwljaGFyCXRjX2ludHJjOwkvKiBpbnRlcnJ1cHQgKi8KKwljaGFyCXRjX3F1aXRjOwkvKiBxdWl0ICovCisJY2hhcgl0Y19zdGFydGM7CS8qIHN0YXJ0IG91dHB1dCAqLworCWNoYXIJdGNfc3RvcGM7CS8qIHN0b3Agb3V0cHV0ICovCisJY2hhcgl0Y19lb2ZjOwkvKiBlbmQtb2YtZmlsZSAqLworCWNoYXIJdGNfYnJrYzsJLyogaW5wdXQgZGVsaW1pdGVyIChsaWtlIG5sKSAqLworCWNoYXIJdGNfc3VzcGM7CS8qIHN0b3AgcHJvY2VzcyBzaWduYWwgKi8KKwljaGFyCXRjX2RzdXNwYzsJLyogZGVsYXllZCBzdG9wIHByb2Nlc3Mgc2lnbmFsICovCisJY2hhcgl0Y19ycHJudGM7CS8qIHJlcHJpbnQgbGluZSAqLworCWNoYXIJdGNfZmx1c2hjOwkvKiBmbHVzaCBvdXRwdXQgKHRvZ2dsZXMpICovCisJY2hhcgl0Y193ZXJhc2M7CS8qIHdvcmQgZXJhc2UgKi8KKwljaGFyCXRjX2xuZXh0YzsJLyogbGl0ZXJhbCBuZXh0IGNoYXJhY3RlciAqLworfTsKKworI2lmZGVmIF9fVVNFX09MRF9UVFkKKyNpbmNsdWRlIDxzeXMvdHR5ZGVmYXVsdHMuaD4JLyogdG8gcGljayB1cCBjaGFyYWN0ZXIgZGVmYXVsdHMgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogc3lzL3R0eWNoYXJzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3R0eWRlZmF1bHRzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy90dHlkZWZhdWx0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZTE2OGIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy90dHlkZWZhdWx0cy5oCkBAIC0wLDAgKzEsMTAwIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAoYykgVU5JWCBTeXN0ZW0gTGFib3JhdG9yaWVzLCBJbmMuCisgKiBBbGwgb3Igc29tZSBwb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSBtYXRlcmlhbCBsaWNlbnNlZAorICogdG8gdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBieSBBbWVyaWNhbiBUZWxlcGhvbmUgYW5kIFRlbGVncmFwaAorICogQ28uIG9yIFVuaXggU3lzdGVtIExhYm9yYXRvcmllcywgSW5jLiBhbmQgYXJlIHJlcHJvZHVjZWQgaGVyZWluIHdpdGgKKyAqIHRoZSBwZXJtaXNzaW9uIG9mIFVOSVggU3lzdGVtIExhYm9yYXRvcmllcywgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdHR5ZGVmYXVsdHMuaAk4LjQgKEJlcmtlbGV5KSAxLzIxLzk0CisgKi8KKworLyoKKyAqIFN5c3RlbSB3aWRlIGRlZmF1bHRzIGZvciB0ZXJtaW5hbCBzdGF0ZS4gIExpbnV4IHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX1NZU19UVFlERUZBVUxUU19IXworI2RlZmluZQlfU1lTX1RUWURFRkFVTFRTX0hfCisKKy8qCisgKiBEZWZhdWx0cyBvbiAiZmlyc3QiIG9wZW4uCisgKi8KKyNkZWZpbmUJVFRZREVGX0lGTEFHCShCUktJTlQgfCBJU1RSSVAgfCBJQ1JOTCB8IElNQVhCRUwgfCBJWE9OIHwgSVhBTlkpCisjZGVmaW5lIFRUWURFRl9PRkxBRwkoT1BPU1QgfCBPTkxDUiB8IFhUQUJTKQorI2RlZmluZSBUVFlERUZfTEZMQUcJKEVDSE8gfCBJQ0FOT04gfCBJU0lHIHwgSUVYVEVOIHwgRUNIT0V8RUNIT0tFfEVDSE9DVEwpCisjZGVmaW5lIFRUWURFRl9DRkxBRwkoQ1JFQUQgfCBDUzcgfCBQQVJFTkIgfCBIVVBDTCkKKyNkZWZpbmUgVFRZREVGX1NQRUVECShCOTYwMCkKKworLyoKKyAqIENvbnRyb2wgQ2hhcmFjdGVyIERlZmF1bHRzCisgKi8KKyNkZWZpbmUgQ1RSTCh4KQkoeCYwMzcpCisjZGVmaW5lCUNFT0YJCUNUUkwoJ2QnKQorI2lmZGVmIF9QT1NJWF9WRElTQUJMRQorIyBkZWZpbmUgQ0VPTAkJX1BPU0lYX1ZESVNBQkxFCisjZWxzZQorIyBkZWZpbmUgQ0VPTAkJJ1wwJwkJLyogWFhYIGF2b2lkIF9QT1NJWF9WRElTQUJMRSAqLworI2VuZGlmCisjZGVmaW5lCUNFUkFTRQkJMDE3NworI2RlZmluZQlDSU5UUgkJQ1RSTCgnYycpCisjaWZkZWYgX1BPU0lYX1ZESVNBQkxFCisjIGRlZmluZSBDU1RBVFVTCV9QT1NJWF9WRElTQUJMRQorI2Vsc2UKKyMgZGVmaW5lIENTVEFUVVMJJ1wwJwkJLyogWFhYIGF2b2lkIF9QT1NJWF9WRElTQUJMRSAqLworI2VuZGlmCisjZGVmaW5lCUNLSUxMCQlDVFJMKCd1JykKKyNkZWZpbmUJQ01JTgkJMQorI2RlZmluZQlDUVVJVAkJMDM0CQkvKiBGUywgXlwgKi8KKyNkZWZpbmUJQ1NVU1AJCUNUUkwoJ3onKQorI2RlZmluZQlDVElNRQkJMAorI2RlZmluZQlDRFNVU1AJCUNUUkwoJ3knKQorI2RlZmluZQlDU1RBUlQJCUNUUkwoJ3EnKQorI2RlZmluZQlDU1RPUAkJQ1RSTCgncycpCisjZGVmaW5lCUNMTkVYVAkJQ1RSTCgndicpCisjZGVmaW5lCUNESVNDQVJEIAlDVFJMKCdvJykKKyNkZWZpbmUJQ1dFUkFTRSAJQ1RSTCgndycpCisjZGVmaW5lCUNSRVBSSU5UIAlDVFJMKCdyJykKKyNkZWZpbmUJQ0VPVAkJQ0VPRgorLyogY29tcGF0ICovCisjZGVmaW5lCUNCUksJCUNFT0wKKyNkZWZpbmUgQ1JQUk5UCQlDUkVQUklOVAorI2RlZmluZQlDRkxVU0gJCUNESVNDQVJECisKKy8qIFBST1RFQ1RFRCBJTkNMVVNJT04gRU5EUyBIRVJFICovCisjZW5kaWYgLyogIV9TWVNfVFRZREVGQVVMVFNfSF8gKi8KKworLyoKKyAqICNkZWZpbmUgVFRZREVGQ0hBUlMgdG8gaW5jbHVkZSBhbiBhcnJheSBvZiBkZWZhdWx0IGNvbnRyb2wgY2hhcmFjdGVycy4KKyAqLworI2lmZGVmIFRUWURFRkNIQVJTCitjY190CXR0eWRlZmNoYXJzW05DQ1NdID0geworCUNFT0YsCUNFT0wsCUNFT0wsCUNFUkFTRSwgQ1dFUkFTRSwgQ0tJTEwsIENSRVBSSU5ULAorCV9QT1NJWF9WRElTQUJMRSwgQ0lOVFIsCUNRVUlULAlDU1VTUCwJQ0RTVVNQLAlDU1RBUlQsCUNTVE9QLAlDTE5FWFQsCisJQ0RJU0NBUkQsIENNSU4sCUNUSU1FLCAgQ1NUQVRVUywgX1BPU0lYX1ZESVNBQkxFCit9OworI3VuZGVmIFRUWURFRkNIQVJTCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3R5cGVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZTkwODQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy90eXBlcy5oCkBAIC0wLDAgKzEsMjc2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsMTk5MiwxOTk0LTIwMDIsMjAwNiwyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJUE9TSVggU3RhbmRhcmQ6IDIuNiBQcmltaXRpdmUgU3lzdGVtIERhdGEgVHlwZXMJPHN5cy90eXBlcy5oPgorICovCisKKyNpZm5kZWYJX1NZU19UWVBFU19ICisjZGVmaW5lCV9TWVNfVFlQRVNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKyNpZmRlZglfX1VTRV9CU0QKKyMgaWZuZGVmIF9fdV9jaGFyX2RlZmluZWQKK3R5cGVkZWYgX191X2NoYXIgdV9jaGFyOwordHlwZWRlZiBfX3Vfc2hvcnQgdV9zaG9ydDsKK3R5cGVkZWYgX191X2ludCB1X2ludDsKK3R5cGVkZWYgX191X2xvbmcgdV9sb25nOwordHlwZWRlZiBfX3F1YWRfdCBxdWFkX3Q7Cit0eXBlZGVmIF9fdV9xdWFkX3QgdV9xdWFkX3Q7Cit0eXBlZGVmIF9fZnNpZF90IGZzaWRfdDsKKyMgIGRlZmluZSBfX3VfY2hhcl9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYKKwordHlwZWRlZiBfX2xvZmZfdCBsb2ZmX3Q7CisKKyNpZm5kZWYgX19pbm9fdF9kZWZpbmVkCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0Cit0eXBlZGVmIF9faW5vX3QgaW5vX3Q7CisjIGVsc2UKK3R5cGVkZWYgX19pbm82NF90IGlub190OworIyBlbmRpZgorIyBkZWZpbmUgX19pbm9fdF9kZWZpbmVkCisjZW5kaWYKKyNpZiBkZWZpbmVkIF9fVVNFX0xBUkdFRklMRTY0ICYmICFkZWZpbmVkIF9faW5vNjRfdF9kZWZpbmVkCit0eXBlZGVmIF9faW5vNjRfdCBpbm82NF90OworIyBkZWZpbmUgX19pbm82NF90X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fZGV2X3RfZGVmaW5lZAordHlwZWRlZiBfX2Rldl90IGRldl90OworIyBkZWZpbmUgX19kZXZfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX2dpZF90X2RlZmluZWQKK3R5cGVkZWYgX19naWRfdCBnaWRfdDsKKyMgZGVmaW5lIF9fZ2lkX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX19tb2RlX3RfZGVmaW5lZAordHlwZWRlZiBfX21vZGVfdCBtb2RlX3Q7CisjIGRlZmluZSBfX21vZGVfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX25saW5rX3RfZGVmaW5lZAordHlwZWRlZiBfX25saW5rX3QgbmxpbmtfdDsKKyMgZGVmaW5lIF9fbmxpbmtfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX3VpZF90X2RlZmluZWQKK3R5cGVkZWYgX191aWRfdCB1aWRfdDsKKyMgZGVmaW5lIF9fdWlkX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX19vZmZfdF9kZWZpbmVkCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0Cit0eXBlZGVmIF9fb2ZmX3Qgb2ZmX3Q7CisjIGVsc2UKK3R5cGVkZWYgX19vZmY2NF90IG9mZl90OworIyBlbmRpZgorIyBkZWZpbmUgX19vZmZfdF9kZWZpbmVkCisjZW5kaWYKKyNpZiBkZWZpbmVkIF9fVVNFX0xBUkdFRklMRTY0ICYmICFkZWZpbmVkIF9fb2ZmNjRfdF9kZWZpbmVkCit0eXBlZGVmIF9fb2ZmNjRfdCBvZmY2NF90OworIyBkZWZpbmUgX19vZmY2NF90X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fcGlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3BpZF90IHBpZF90OworIyBkZWZpbmUgX19waWRfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmIChkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4KSBcCisgICAgJiYgIWRlZmluZWQgX19pZF90X2RlZmluZWQKK3R5cGVkZWYgX19pZF90IGlkX3Q7CisjIGRlZmluZSBfX2lkX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX19zc2l6ZV90X2RlZmluZWQKK3R5cGVkZWYgX19zc2l6ZV90IHNzaXplX3Q7CisjIGRlZmluZSBfX3NzaXplX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZmRlZglfX1VTRV9CU0QKKyMgaWZuZGVmIF9fZGFkZHJfdF9kZWZpbmVkCit0eXBlZGVmIF9fZGFkZHJfdCBkYWRkcl90OwordHlwZWRlZiBfX2NhZGRyX3QgY2FkZHJfdDsKKyMgIGRlZmluZSBfX2RhZGRyX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCisKKyNpZiAoZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4pICYmICFkZWZpbmVkIF9fa2V5X3RfZGVmaW5lZAordHlwZWRlZiBfX2tleV90IGtleV90OworIyBkZWZpbmUgX19rZXlfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorIyBkZWZpbmUgX19uZWVkX2Nsb2NrX3QKKyNlbmRpZgorI2RlZmluZQlfX25lZWRfdGltZV90CisjZGVmaW5lIF9fbmVlZF90aW1lcl90CisjZGVmaW5lIF9fbmVlZF9jbG9ja2lkX3QKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZmRlZiBfX1VTRV9YT1BFTgorIyBpZm5kZWYgX191c2Vjb25kc190X2RlZmluZWQKK3R5cGVkZWYgX191c2Vjb25kc190IHVzZWNvbmRzX3Q7CisjICBkZWZpbmUgX191c2Vjb25kc190X2RlZmluZWQKKyMgZW5kaWYKKyMgaWZuZGVmIF9fc3VzZWNvbmRzX3RfZGVmaW5lZAordHlwZWRlZiBfX3N1c2Vjb25kc190IHN1c2Vjb25kc190OworIyAgZGVmaW5lIF9fc3VzZWNvbmRzX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUJX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaWZkZWYgX19VU0VfTUlTQworLyogT2xkIGNvbXBhdGliaWxpdHkgbmFtZXMgZm9yIEMgdHlwZXMuICAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCB1bG9uZzsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IHVzaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQ7CisjZW5kaWYKKworLyogVGhlc2Ugc2l6ZS1zcGVjaWZpYyBuYW1lcyBhcmUgdXNlZCBieSBzb21lIG9mIHRoZSBpbmV0IGNvZGUuICAqLworCisjaWYgIV9fR05VQ19QUkVSRVEgKDIsIDcpCisKKy8qIFRoZXNlIHR5cGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBJU08gQzk5IGhlYWRlciA8aW50dHlwZXMuaD4uICovCisjIGlmbmRlZiBfX2ludDhfdF9kZWZpbmVkCisjICBkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAordHlwZWRlZgljaGFyIGludDhfdDsKK3R5cGVkZWYJc2hvcnQgaW50IGludDE2X3Q7Cit0eXBlZGVmCWludCBpbnQzMl90OworIyAgaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiBsb25nIGludCBpbnQ2NF90OworIyAgZWxpZiBfX0dMSUJDX0hBVkVfTE9OR19MT05HCitfX2V4dGVuc2lvbl9fIHR5cGVkZWYgbG9uZyBsb25nIGludCBpbnQ2NF90OworIyAgZW5kaWYKKyMgZW5kaWYKKworLyogQnV0IHRoZXNlIHdlcmUgZGVmaW5lZCBieSBJU08gQyB3aXRob3V0IHRoZSBmaXJzdCBgXycuICAqLwordHlwZWRlZgl1bnNpZ25lZCBjaGFyIHVfaW50OF90OwordHlwZWRlZgl1bnNpZ25lZCBzaG9ydCBpbnQgdV9pbnQxNl90OwordHlwZWRlZgl1bnNpZ25lZCBpbnQgdV9pbnQzMl90OworIyBpZiBfX1dPUkRTSVpFID09IDY0Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHVfaW50NjRfdDsKKyMgZWxpZiBfX0dMSUJDX0hBVkVfTE9OR19MT05HCitfX2V4dGVuc2lvbl9fIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCB1X2ludDY0X3Q7CisjIGVuZGlmCisKK3R5cGVkZWYgaW50IHJlZ2lzdGVyX3Q7CisKKyNlbHNlCisKKy8qIEZvciBHQ0MgMi43IGFuZCBsYXRlciwgd2UgY2FuIHVzZSBzcGVjaWZpYyB0eXBlLXNpemUgYXR0cmlidXRlcy4gICovCisjIGRlZmluZSBfX2ludE5fdChOLCBNT0RFKSBcCisgIHR5cGVkZWYgaW50IGludCMjTiMjX3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChNT0RFKSkpCisjIGRlZmluZSBfX3VfaW50Tl90KE4sIE1PREUpIFwKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgdV9pbnQjI04jI190IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoTU9ERSkpKQorCisjIGlmbmRlZiBfX2ludDhfdF9kZWZpbmVkCisjICBkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAorX19pbnROX3QgKDgsIF9fUUlfXyk7CitfX2ludE5fdCAoMTYsIF9fSElfXyk7CitfX2ludE5fdCAoMzIsIF9fU0lfXyk7CitfX2ludE5fdCAoNjQsIF9fRElfXyk7CisjIGVuZGlmCisKK19fdV9pbnROX3QgKDgsIF9fUUlfXyk7CitfX3VfaW50Tl90ICgxNiwgX19ISV9fKTsKK19fdV9pbnROX3QgKDMyLCBfX1NJX18pOworX191X2ludE5fdCAoNjQsIF9fRElfXyk7CisKK3R5cGVkZWYgaW50IHJlZ2lzdGVyX3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX3dvcmRfXykpKTsKKworCisvKiBTb21lIGNvZGUgZnJvbSBCSU5EIHRlc3RzIHRoaXMgbWFjcm8gdG8gc2VlIGlmIHRoZSB0eXBlcyBhYm92ZSBhcmUKKyAgIGRlZmluZWQuICAqLworI2VuZGlmCisjZGVmaW5lIF9fQklUX1RZUEVTX0RFRklORURfXwkxCisKKworI2lmZGVmCV9fVVNFX0JTRAorLyogSW4gQlNEIDxzeXMvdHlwZXMuaD4gaXMgZXhwZWN0ZWQgdG8gZGVmaW5lIEJZVEVfT1JERVIuICAqLworIyBpbmNsdWRlIDxlbmRpYW4uaD4KKworLyogSXQgYWxzbyBkZWZpbmVzIGBmZF9zZXQnIGFuZCB0aGUgRkRfKiBtYWNyb3MgZm9yIGBzZWxlY3QnLiAgKi8KKyMgaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorCisvKiBCU0QgZGVmaW5lcyB0aGVzZSBzeW1ib2xzLCBzbyB3ZSBmb2xsb3cuICAqLworIyBpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CisjZW5kaWYgLyogVXNlIEJTRC4gICovCisKKworI2lmIChkZWZpbmVkIF9fVVNFX1VOSVg5OCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4KSBcCisgICAgJiYgIWRlZmluZWQgX19ibGtzaXplX3RfZGVmaW5lZAordHlwZWRlZiBfX2Jsa3NpemVfdCBibGtzaXplX3Q7CisjIGRlZmluZSBfX2Jsa3NpemVfdF9kZWZpbmVkCisjZW5kaWYKKworLyogVHlwZXMgZnJvbSB0aGUgTGFyZ2UgRmlsZSBTdXBwb3J0IGludGVyZmFjZS4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyMgaWZuZGVmIF9fYmxrY250X3RfZGVmaW5lZAordHlwZWRlZiBfX2Jsa2NudF90IGJsa2NudF90OwkgLyogVHlwZSB0byBjb3VudCBudW1iZXIgb2YgZGlzayBibG9ja3MuICAqLworIyAgZGVmaW5lIF9fYmxrY250X3RfZGVmaW5lZAorIyBlbmRpZgorIyBpZm5kZWYgX19mc2Jsa2NudF90X2RlZmluZWQKK3R5cGVkZWYgX19mc2Jsa2NudF90IGZzYmxrY250X3Q7IC8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gYmxvY2tzLiAgKi8KKyMgIGRlZmluZSBfX2ZzYmxrY250X3RfZGVmaW5lZAorIyBlbmRpZgorIyBpZm5kZWYgX19mc2ZpbGNudF90X2RlZmluZWQKK3R5cGVkZWYgX19mc2ZpbGNudF90IGZzZmlsY250X3Q7IC8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gaW5vZGVzLiAgKi8KKyMgIGRlZmluZSBfX2ZzZmlsY250X3RfZGVmaW5lZAorIyBlbmRpZgorI2Vsc2UKKyMgaWZuZGVmIF9fYmxrY250X3RfZGVmaW5lZAordHlwZWRlZiBfX2Jsa2NudDY0X3QgYmxrY250X3Q7CSAgIC8qIFR5cGUgdG8gY291bnQgbnVtYmVyIG9mIGRpc2sgYmxvY2tzLiAgKi8KKyMgIGRlZmluZSBfX2Jsa2NudF90X2RlZmluZWQKKyMgZW5kaWYKKyMgaWZuZGVmIF9fZnNibGtjbnRfdF9kZWZpbmVkCit0eXBlZGVmIF9fZnNibGtjbnQ2NF90IGZzYmxrY250X3Q7IC8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gYmxvY2tzLiAgKi8KKyMgIGRlZmluZSBfX2ZzYmxrY250X3RfZGVmaW5lZAorIyBlbmRpZgorIyBpZm5kZWYgX19mc2ZpbGNudF90X2RlZmluZWQKK3R5cGVkZWYgX19mc2ZpbGNudDY0X3QgZnNmaWxjbnRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBpbm9kZXMuICAqLworIyAgZGVmaW5lIF9fZnNmaWxjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0Cit0eXBlZGVmIF9fYmxrY250NjRfdCBibGtjbnQ2NF90OyAgICAgLyogVHlwZSB0byBjb3VudCBudW1iZXIgb2YgZGlzayBibG9ja3MuICovCit0eXBlZGVmIF9fZnNibGtjbnQ2NF90IGZzYmxrY250NjRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBibG9ja3MuICAqLwordHlwZWRlZiBfX2ZzZmlsY250NjRfdCBmc2ZpbGNudDY0X3Q7IC8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gaW5vZGVzLiAgKi8KKyNlbmRpZgorCisKKy8qIE5vdyBhZGQgdGhlIHRocmVhZCB0eXBlcy4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9QT1NJWDE5OTUwNiB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OAorIyBpbmNsdWRlIDxiaXRzL3B0aHJlYWR0eXBlcy5oPgorI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvdHlwZXMuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdWNvbnRleHQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3Vjb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0NzRjNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3Vjb250ZXh0LmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1VDT05URVhUX0gKKyNkZWZpbmUgX1NZU19VQ09OVEVYVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKy8qIFdlIG5lZWQgdGhlIHNpZ25hbCBjb250ZXh0IGRlZmluaXRpb25zIGV2ZW4gaWYgdGhleSBhcmUgbm90IHVzZWQKKyAgIGluY2x1ZGVkIGluIDxzaWduYWwuaD4uICAqLworI2luY2x1ZGUgPGJpdHMvc2lnY29udGV4dC5oPgorCisKKy8qIFR5cGUgZm9yIGdlbmVyYWwgcmVnaXN0ZXIuICAqLwordHlwZWRlZiBpbnQgZ3JlZ190OworCisvKiBOdW1iZXIgb2YgZ2VuZXJhbCByZWdpc3RlcnMuICAqLworI2RlZmluZSBOR1JFRwkxOQorCisvKiBDb250YWluZXIgZm9yIGFsbCBnZW5lcmFsIHJlZ2lzdGVycy4gICovCit0eXBlZGVmIGdyZWdfdCBncmVnc2V0X3RbTkdSRUddOworCisjaWZkZWYgX19VU0VfR05VCisvKiBOdW1iZXIgb2YgZWFjaCByZWdpc3RlciBpcyB0aGUgYGdyZWdzZXRfdCcgYXJyYXkuICAqLworZW51bQoreworICBSRUdfR1MgPSAwLAorIyBkZWZpbmUgUkVHX0dTCQlSRUdfR1MKKyAgUkVHX0ZTLAorIyBkZWZpbmUgUkVHX0ZTCQlSRUdfRlMKKyAgUkVHX0VTLAorIyBkZWZpbmUgUkVHX0VTCQlSRUdfRVMKKyAgUkVHX0RTLAorIyBkZWZpbmUgUkVHX0RTCQlSRUdfRFMKKyAgUkVHX0VESSwKKyMgZGVmaW5lIFJFR19FREkJUkVHX0VESQorICBSRUdfRVNJLAorIyBkZWZpbmUgUkVHX0VTSQlSRUdfRVNJCisgIFJFR19FQlAsCisjIGRlZmluZSBSRUdfRUJQCVJFR19FQlAKKyAgUkVHX0VTUCwKKyMgZGVmaW5lIFJFR19FU1AJUkVHX0VTUAorICBSRUdfRUJYLAorIyBkZWZpbmUgUkVHX0VCWAlSRUdfRUJYCisgIFJFR19FRFgsCisjIGRlZmluZSBSRUdfRURYCVJFR19FRFgKKyAgUkVHX0VDWCwKKyMgZGVmaW5lIFJFR19FQ1gJUkVHX0VDWAorICBSRUdfRUFYLAorIyBkZWZpbmUgUkVHX0VBWAlSRUdfRUFYCisgIFJFR19UUkFQTk8sCisjIGRlZmluZSBSRUdfVFJBUE5PCVJFR19UUkFQTk8KKyAgUkVHX0VSUiwKKyMgZGVmaW5lIFJFR19FUlIJUkVHX0VSUgorICBSRUdfRUlQLAorIyBkZWZpbmUgUkVHX0VJUAlSRUdfRUlQCisgIFJFR19DUywKKyMgZGVmaW5lIFJFR19DUwkJUkVHX0NTCisgIFJFR19FRkwsCisjIGRlZmluZSBSRUdfRUZMCVJFR19FRkwKKyAgUkVHX1VFU1AsCisjIGRlZmluZSBSRUdfVUVTUAlSRUdfVUVTUAorICBSRUdfU1MKKyMgZGVmaW5lIFJFR19TUwlSRUdfU1MKK307CisjZW5kaWYKKworLyogRGVmaW5pdGlvbnMgdGFrZW4gZnJvbSB0aGUga2VybmVsIGhlYWRlcnMuICAqLworc3RydWN0IF9saWJjX2ZwcmVnCit7CisgIHVuc2lnbmVkIHNob3J0IGludCBzaWduaWZpY2FuZFs0XTsKKyAgdW5zaWduZWQgc2hvcnQgaW50IGV4cG9uZW50OworfTsKKworc3RydWN0IF9saWJjX2Zwc3RhdGUKK3sKKyAgdW5zaWduZWQgbG9uZyBpbnQgY3c7CisgIHVuc2lnbmVkIGxvbmcgaW50IHN3OworICB1bnNpZ25lZCBsb25nIGludCB0YWc7CisgIHVuc2lnbmVkIGxvbmcgaW50IGlwb2ZmOworICB1bnNpZ25lZCBsb25nIGludCBjc3NlbDsKKyAgdW5zaWduZWQgbG9uZyBpbnQgZGF0YW9mZjsKKyAgdW5zaWduZWQgbG9uZyBpbnQgZGF0YXNlbDsKKyAgc3RydWN0IF9saWJjX2ZwcmVnIF9zdFs4XTsKKyAgdW5zaWduZWQgbG9uZyBpbnQgc3RhdHVzOworfTsKKworLyogU3RydWN0dXJlIHRvIGRlc2NyaWJlIEZQVSByZWdpc3RlcnMuICAqLwordHlwZWRlZiBzdHJ1Y3QgX2xpYmNfZnBzdGF0ZSAqZnByZWdzZXRfdDsKKworLyogQ29udGV4dCB0byBkZXNjcmliZSB3aG9sZSBwcm9jZXNzb3Igc3RhdGUuICAqLwordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIGdyZWdzZXRfdCBncmVnczsKKyAgICAvKiBEdWUgdG8gTGludXgncyBoaXN0b3J5IHdlIGhhdmUgdG8gdXNlIGEgcG9pbnRlciBoZXJlLiAgVGhlIFN5c1YvaTM4NgorICAgICAgIEFCSSByZXF1aXJlcyBhIHN0cnVjdCB3aXRoIHRoZSB2YWx1ZXMuICAqLworICAgIGZwcmVnc2V0X3QgZnByZWdzOworICAgIHVuc2lnbmVkIGxvbmcgaW50IG9sZG1hc2s7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgY3IyOworICB9IG1jb250ZXh0X3Q7CisKKy8qIFVzZXJsZXZlbCBjb250ZXh0LiAgKi8KK3R5cGVkZWYgc3RydWN0IHVjb250ZXh0CisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCB1Y19mbGFnczsKKyAgICBzdHJ1Y3QgdWNvbnRleHQgKnVjX2xpbms7CisgICAgc3RhY2tfdCB1Y19zdGFjazsKKyAgICBtY29udGV4dF90IHVjX21jb250ZXh0OworICAgIF9fc2lnc2V0X3QgdWNfc2lnbWFzazsKKyAgICBzdHJ1Y3QgX2xpYmNfZnBzdGF0ZSBfX2ZwcmVnc19tZW07CisgIH0gdWNvbnRleHRfdDsKKworI2VuZGlmIC8qIHN5cy91Y29udGV4dC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy91aW8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3Vpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMmI3ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy91aW8uaApAQCAtMCwwICsxLDEyMyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLDE5OTIsMTk5Ni0xOTk5LDIwMDMsMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1VJT19ICisjZGVmaW5lIF9TWVNfVUlPX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoaXMgZmlsZSBkZWZpbmVzIGBzdHJ1Y3QgaW92ZWMnLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3Vpby5oPgorCisKKy8qIFJlYWQgZGF0YSBmcm9tIGZpbGUgZGVzY3JpcHRvciBGRCwgYW5kIHB1dCB0aGUgcmVzdWx0IGluIHRoZQorICAgYnVmZmVycyBkZXNjcmliZWQgYnkgSU9WRUMsIHdoaWNoIGlzIGEgdmVjdG9yIG9mIENPVU5UICdzdHJ1Y3QgaW92ZWMncy4KKyAgIFRoZSBidWZmZXJzIGFyZSBmaWxsZWQgaW4gdGhlIG9yZGVyIHNwZWNpZmllZC4KKyAgIE9wZXJhdGVzIGp1c3QgbGlrZSAncmVhZCcgKHNlZSA8dW5pc3RkLmg+KSBleGNlcHQgdGhhdCBkYXRhIGFyZQorICAgcHV0IGluIElPVkVDIGluc3RlYWQgb2YgYSBjb250aWd1b3VzIGJ1ZmZlci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCByZWFkdiAoaW50IF9fZmQsIF9fY29uc3Qgc3RydWN0IGlvdmVjICpfX2lvdmVjLCBpbnQgX19jb3VudCkKKyAgX193dXI7CisKKy8qIFdyaXRlIGRhdGEgcG9pbnRlZCBieSB0aGUgYnVmZmVycyBkZXNjcmliZWQgYnkgSU9WRUMsIHdoaWNoCisgICBpcyBhIHZlY3RvciBvZiBDT1VOVCAnc3RydWN0IGlvdmVjJ3MsIHRvIGZpbGUgZGVzY3JpcHRvciBGRC4KKyAgIFRoZSBkYXRhIGlzIHdyaXR0ZW4gaW4gdGhlIG9yZGVyIHNwZWNpZmllZC4KKyAgIE9wZXJhdGVzIGp1c3QgbGlrZSAnd3JpdGUnIChzZWUgPHVuaXN0ZC5oPikgZXhjZXB0IHRoYXQgdGhlIGRhdGEKKyAgIGFyZSB0YWtlbiBmcm9tIElPVkVDIGluc3RlYWQgb2YgYSBjb250aWd1b3VzIGJ1ZmZlci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCB3cml0ZXYgKGludCBfX2ZkLCBfX2NvbnN0IHN0cnVjdCBpb3ZlYyAqX19pb3ZlYywgaW50IF9fY291bnQpCisgIF9fd3VyOworCisKKyNpZmRlZiBfX1VTRV9CU0QKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKy8qIFJlYWQgZGF0YSBmcm9tIGZpbGUgZGVzY3JpcHRvciBGRCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gT0ZGU0VUCisgICB3aXRob3V0IGNoYW5nZSB0aGUgZmlsZSBwb2ludGVyLCBhbmQgcHV0IHRoZSByZXN1bHQgaW4gdGhlIGJ1ZmZlcnMKKyAgIGRlc2NyaWJlZCBieSBJT1ZFQywgd2hpY2ggaXMgYSB2ZWN0b3Igb2YgQ09VTlQgJ3N0cnVjdCBpb3ZlYydzLgorICAgVGhlIGJ1ZmZlcnMgYXJlIGZpbGxlZCBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkLiAgT3BlcmF0ZXMganVzdCBsaWtlCisgICAncHJlYWQnIChzZWUgPHVuaXN0ZC5oPikgZXhjZXB0IHRoYXQgZGF0YSBhcmUgcHV0IGluIElPVkVDIGluc3RlYWQKKyAgIG9mIGEgY29udGlndW91cyBidWZmZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3QgcHJlYWR2IChpbnQgX19mZCwgX19jb25zdCBzdHJ1Y3QgaW92ZWMgKl9faW92ZWMsIGludCBfX2NvdW50LAorCQkgICAgICAgX19vZmZfdCBfX29mZnNldCkgX193dXI7CisKKy8qIFdyaXRlIGRhdGEgcG9pbnRlZCBieSB0aGUgYnVmZmVycyBkZXNjcmliZWQgYnkgSU9WRUMsIHdoaWNoIGlzIGEKKyAgIHZlY3RvciBvZiBDT1VOVCAnc3RydWN0IGlvdmVjJ3MsIHRvIGZpbGUgZGVzY3JpcHRvciBGRCBhdCB0aGUgZ2l2ZW4KKyAgIHBvc2l0aW9uIE9GRlNFVCB3aXRob3V0IGNoYW5nZSB0aGUgZmlsZSBwb2ludGVyLiAgVGhlIGRhdGEgaXMKKyAgIHdyaXR0ZW4gaW4gdGhlIG9yZGVyIHNwZWNpZmllZC4gIE9wZXJhdGVzIGp1c3QgbGlrZSAncHdyaXRlJyAoc2VlCisgICA8dW5pc3RkLmg+KSBleGNlcHQgdGhhdCB0aGUgZGF0YSBhcmUgdGFrZW4gZnJvbSBJT1ZFQyBpbnN0ZWFkIG9mIGEKKyAgIGNvbnRpZ3VvdXMgYnVmZmVyLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHB3cml0ZXYgKGludCBfX2ZkLCBfX2NvbnN0IHN0cnVjdCBpb3ZlYyAqX19pb3ZlYywgaW50IF9fY291bnQsCisJCQlfX29mZl90IF9fb2Zmc2V0KSBfX3d1cjsKKyMgZWxzZQorIyAgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAocHJlYWR2LCAoaW50IF9fZmQsIF9fY29uc3Qgc3RydWN0IGlvdmVjICpfX2lvdmVjLAorCQkJCSAgICBpbnQgX19jb3VudCwgX19vZmY2NF90IF9fb2Zmc2V0KSwKKwkJCSAgIHByZWFkdjY0KSBfX3d1cjsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1QgKHB3cml0ZXYsIChpbnQgX19mZCwgX19jb25zdCBzdHJ1Y3QgaW92ZWMgKl9faW92ZWMsCisJCQkJICAgICBpbnQgX19jb3VudCwgX19vZmY2NF90IF9fb2Zmc2V0KSwKKwkJCSAgIHB3cml0ZXY2NCkgX193dXI7CisjICBlbHNlCisjICAgZGVmaW5lIHByZWFkdiBwcmVhZHY2NAorIyAgIGRlZmluZSBwd3JpdGV2IHB3cml0ZXY2NAorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorLyogUmVhZCBkYXRhIGZyb20gZmlsZSBkZXNjcmlwdG9yIEZEIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBPRkZTRVQKKyAgIHdpdGhvdXQgY2hhbmdlIHRoZSBmaWxlIHBvaW50ZXIsIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiB0aGUgYnVmZmVycworICAgZGVzY3JpYmVkIGJ5IElPVkVDLCB3aGljaCBpcyBhIHZlY3RvciBvZiBDT1VOVCAnc3RydWN0IGlvdmVjJ3MuCisgICBUaGUgYnVmZmVycyBhcmUgZmlsbGVkIGluIHRoZSBvcmRlciBzcGVjaWZpZWQuICBPcGVyYXRlcyBqdXN0IGxpa2UKKyAgICdwcmVhZCcgKHNlZSA8dW5pc3RkLmg+KSBleGNlcHQgdGhhdCBkYXRhIGFyZSBwdXQgaW4gSU9WRUMgaW5zdGVhZAorICAgb2YgYSBjb250aWd1b3VzIGJ1ZmZlci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCBwcmVhZHY2NCAoaW50IF9fZmQsIF9fY29uc3Qgc3RydWN0IGlvdmVjICpfX2lvdmVjLCBpbnQgX19jb3VudCwKKwkJCSBfX29mZjY0X3QgX19vZmZzZXQpIF9fd3VyOworCisvKiBXcml0ZSBkYXRhIHBvaW50ZWQgYnkgdGhlIGJ1ZmZlcnMgZGVzY3JpYmVkIGJ5IElPVkVDLCB3aGljaCBpcyBhCisgICB2ZWN0b3Igb2YgQ09VTlQgJ3N0cnVjdCBpb3ZlYydzLCB0byBmaWxlIGRlc2NyaXB0b3IgRkQgYXQgdGhlIGdpdmVuCisgICBwb3NpdGlvbiBPRkZTRVQgd2l0aG91dCBjaGFuZ2UgdGhlIGZpbGUgcG9pbnRlci4gIFRoZSBkYXRhIGlzCisgICB3cml0dGVuIGluIHRoZSBvcmRlciBzcGVjaWZpZWQuICBPcGVyYXRlcyBqdXN0IGxpa2UgJ3B3cml0ZScgKHNlZQorICAgPHVuaXN0ZC5oPikgZXhjZXB0IHRoYXQgdGhlIGRhdGEgYXJlIHRha2VuIGZyb20gSU9WRUMgaW5zdGVhZCBvZiBhCisgICBjb250aWd1b3VzIGJ1ZmZlci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCBwd3JpdGV2NjQgKGludCBfX2ZkLCBfX2NvbnN0IHN0cnVjdCBpb3ZlYyAqX19pb3ZlYywgaW50IF9fY291bnQsCisJCQkgIF9fb2ZmNjRfdCBfX29mZnNldCkgX193dXI7CisjIGVuZGlmCisjZW5kaWYJLyogVXNlIEJTRCAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3Vpby5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy91bHRyYXNvdW5kLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy91bHRyYXNvdW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY1YzM4NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3VsdHJhc291bmQuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8bGludXgvdWx0cmFzb3VuZC5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhMTBlNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3VuLmgKQEAgLTAsMCArMSw0NyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk1LCAxOTk2LCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfVU5fSAorI2RlZmluZQlfU1lTX1VOX0gJMQorCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisKKy8qIEdldCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgbWFjcm8gdG8gZGVmaW5lIHRoZSBjb21tb24gc29ja2FkZHIgbWVtYmVycy4gICovCisjaW5jbHVkZSA8Yml0cy9zb2NrYWRkci5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBhZGRyZXNzIG9mIGFuIEFGX0xPQ0FMIChha2EgQUZfVU5JWCkgc29ja2V0LiAgKi8KK3N0cnVjdCBzb2NrYWRkcl91bgorICB7CisgICAgX19TT0NLQUREUl9DT01NT04gKHN1bl8pOworICAgIGNoYXIgc3VuX3BhdGhbMTA4XTsJCS8qIFBhdGggbmFtZS4gICovCisgIH07CisKKworI2lmZGVmIF9fVVNFX01JU0MKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CQkvKiBGb3IgcHJvdG90eXBlIG9mIGBzdHJsZW4nLiAgKi8KKworLyogRXZhbHVhdGUgdG8gYWN0dWFsIGxlbmd0aCBvZiB0aGUgYHNvY2thZGRyX3VuJyBzdHJ1Y3R1cmUuICAqLworIyBkZWZpbmUgU1VOX0xFTihwdHIpICgoc2l6ZV90KSAoKChzdHJ1Y3Qgc29ja2FkZHJfdW4gKikgMCktPnN1bl9wYXRoKQkgICAgICBcCisJCSAgICAgICsgc3RybGVuICgocHRyKS0+c3VuX3BhdGgpKQorI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvdW4uaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3VuaXN0ZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdW5pc3RkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU4MjNmYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3VuaXN0ZC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDx1bmlzdGQuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3VzZXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3VzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2E0NmU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdXNlci5oCkBAIC0wLDAgKzEsMTAzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19VU0VSX0gKKyNkZWZpbmUgX1NZU19VU0VSX0gJMQorCisvKiBUaGUgd2hvbGUgcHVycG9zZSBvZiB0aGlzIGZpbGUgaXMgZm9yIEdEQiBhbmQgR0RCIG9ubHkuICBEb24ndCByZWFkCisgICB0b28gbXVjaCBpbnRvIGl0LiAgRG9uJ3QgdXNlIGl0IGZvciBhbnl0aGluZyBvdGhlciB0aGFuIEdEQiB1bmxlc3MKKyAgIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4gICovCisKK3N0cnVjdCB1c2VyX2ZwcmVnc19zdHJ1Y3QKK3sKKyAgbG9uZyBpbnQgY3dkOworICBsb25nIGludCBzd2Q7CisgIGxvbmcgaW50IHR3ZDsKKyAgbG9uZyBpbnQgZmlwOworICBsb25nIGludCBmY3M7CisgIGxvbmcgaW50IGZvbzsKKyAgbG9uZyBpbnQgZm9zOworICBsb25nIGludCBzdF9zcGFjZSBbMjBdOworfTsKKworc3RydWN0IHVzZXJfZnB4cmVnc19zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgc2hvcnQgaW50IGN3ZDsKKyAgdW5zaWduZWQgc2hvcnQgaW50IHN3ZDsKKyAgdW5zaWduZWQgc2hvcnQgaW50IHR3ZDsKKyAgdW5zaWduZWQgc2hvcnQgaW50IGZvcDsKKyAgbG9uZyBpbnQgZmlwOworICBsb25nIGludCBmY3M7CisgIGxvbmcgaW50IGZvbzsKKyAgbG9uZyBpbnQgZm9zOworICBsb25nIGludCBteGNzcjsKKyAgbG9uZyBpbnQgcmVzZXJ2ZWQ7CisgIGxvbmcgaW50IHN0X3NwYWNlWzMyXTsgICAvKiA4KjE2IGJ5dGVzIGZvciBlYWNoIEZQLXJlZyA9IDEyOCBieXRlcyAqLworICBsb25nIGludCB4bW1fc3BhY2VbMzJdOyAgLyogOCoxNiBieXRlcyBmb3IgZWFjaCBYTU0tcmVnID0gMTI4IGJ5dGVzICovCisgIGxvbmcgaW50IHBhZGRpbmdbNTZdOworfTsKKworc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QKK3sKKyAgbG9uZyBpbnQgZWJ4OworICBsb25nIGludCBlY3g7CisgIGxvbmcgaW50IGVkeDsKKyAgbG9uZyBpbnQgZXNpOworICBsb25nIGludCBlZGk7CisgIGxvbmcgaW50IGVicDsKKyAgbG9uZyBpbnQgZWF4OworICBsb25nIGludCB4ZHM7CisgIGxvbmcgaW50IHhlczsKKyAgbG9uZyBpbnQgeGZzOworICBsb25nIGludCB4Z3M7CisgIGxvbmcgaW50IG9yaWdfZWF4OworICBsb25nIGludCBlaXA7CisgIGxvbmcgaW50IHhjczsKKyAgbG9uZyBpbnQgZWZsYWdzOworICBsb25nIGludCBlc3A7CisgIGxvbmcgaW50IHhzczsKK307CisKK3N0cnVjdCB1c2VyCit7CisgIHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0CXJlZ3M7CisgIGludAkJCQl1X2ZwdmFsaWQ7CisgIHN0cnVjdCB1c2VyX2ZwcmVnc19zdHJ1Y3QJaTM4NzsKKyAgdW5zaWduZWQgbG9uZyBpbnQJCXVfdHNpemU7CisgIHVuc2lnbmVkIGxvbmcgaW50CQl1X2RzaXplOworICB1bnNpZ25lZCBsb25nIGludAkJdV9zc2l6ZTsKKyAgdW5zaWduZWQgbG9uZwkJCXN0YXJ0X2NvZGU7CisgIHVuc2lnbmVkIGxvbmcJCQlzdGFydF9zdGFjazsKKyAgbG9uZyBpbnQJCQlzaWduYWw7CisgIGludAkJCQlyZXNlcnZlZDsKKyAgc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QqCXVfYXIwOworICBzdHJ1Y3QgdXNlcl9mcHJlZ3Nfc3RydWN0Kgl1X2Zwc3RhdGU7CisgIHVuc2lnbmVkIGxvbmcgaW50CQltYWdpYzsKKyAgY2hhcgkJCQl1X2NvbW0gWzMyXTsKKyAgaW50CQkJCXVfZGVidWdyZWcgWzhdOworfTsKKworI2RlZmluZSBQQUdFX1NISUZUCQkxMgorI2RlZmluZSBQQUdFX1NJWkUJCSgxVUwgPDwgUEFHRV9TSElGVCkKKyNkZWZpbmUgUEFHRV9NQVNLCQkofihQQUdFX1NJWkUtMSkpCisjZGVmaW5lIE5CUEcJCQlQQUdFX1NJWkUKKyNkZWZpbmUgVVBBR0VTCQkJMQorI2RlZmluZSBIT1NUX1RFWFRfU1RBUlRfQUREUgkodS5zdGFydF9jb2RlKQorI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSCSh1LnN0YXJ0X3N0YWNrICsgdS51X3NzaXplICogTkJQRykKKworI2VuZGlmCS8qIF9TWVNfVVNFUl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy91c3RhdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdXN0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTljZGFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdXN0YXQuaApAQCAtMCwwICsxLDM4IEBACisvKiBIZWFkZXIgZGVzY3JpYmluZyBvYnNvbGV0ZSBgdXN0YXQnIGludGVyZmFjZS4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG9ic29sZXRlLiAgVXNlIDxzeXMvc3RhdGZzLmg+IGluc3RlYWQuCisgKi8KKworI2lmbmRlZiBfU1lTX1VTVEFUX0gKKyNkZWZpbmUJX1NZU19VU1RBVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3VzdGF0Lmg+CisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIGludCB1c3RhdCAoX19kZXZfdCBfX2Rldiwgc3RydWN0IHVzdGF0ICpfX3VidWYpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvdXN0YXQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdXRzbmFtZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdXRzbmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwM2FhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy91dHNuYW1lLmgKQEAgLTAsMCArMSw4NyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLDkyLDk0LDk2LDk3LDk5LDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglQT1NJWCBTdGFuZGFyZDogNC40IFN5c3RlbSBJZGVudGlmaWNhdGlvbgk8c3lzL3V0c25hbWUuaD4KKyAqLworCisjaWZuZGVmCV9TWVNfVVRTTkFNRV9ICisjZGVmaW5lCV9TWVNfVVRTTkFNRV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2luY2x1ZGUgPGJpdHMvdXRzbmFtZS5oPgorCisjaWZuZGVmIF9VVFNOQU1FX1NZU05BTUVfTEVOR1RICisjIGRlZmluZSBfVVRTTkFNRV9TWVNOQU1FX0xFTkdUSCBfVVRTTkFNRV9MRU5HVEgKKyNlbmRpZgorI2lmbmRlZiBfVVRTTkFNRV9OT0RFTkFNRV9MRU5HVEgKKyMgZGVmaW5lIF9VVFNOQU1FX05PREVOQU1FX0xFTkdUSCBfVVRTTkFNRV9MRU5HVEgKKyNlbmRpZgorI2lmbmRlZiBfVVRTTkFNRV9SRUxFQVNFX0xFTkdUSAorIyBkZWZpbmUgX1VUU05BTUVfUkVMRUFTRV9MRU5HVEggX1VUU05BTUVfTEVOR1RICisjZW5kaWYKKyNpZm5kZWYgX1VUU05BTUVfVkVSU0lPTl9MRU5HVEgKKyMgZGVmaW5lIF9VVFNOQU1FX1ZFUlNJT05fTEVOR1RIIF9VVFNOQU1FX0xFTkdUSAorI2VuZGlmCisjaWZuZGVmIF9VVFNOQU1FX01BQ0hJTkVfTEVOR1RICisjIGRlZmluZSBfVVRTTkFNRV9NQUNISU5FX0xFTkdUSCBfVVRTTkFNRV9MRU5HVEgKKyNlbmRpZgorCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgc3lzdGVtIGFuZCBtYWNoaW5lLiAgKi8KK3N0cnVjdCB1dHNuYW1lCisgIHsKKyAgICAvKiBOYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gICovCisgICAgY2hhciBzeXNuYW1lW19VVFNOQU1FX1NZU05BTUVfTEVOR1RIXTsKKworICAgIC8qIE5hbWUgb2YgdGhpcyBub2RlIG9uIHRoZSBuZXR3b3JrLiAgKi8KKyAgICBjaGFyIG5vZGVuYW1lW19VVFNOQU1FX05PREVOQU1FX0xFTkdUSF07CisKKyAgICAvKiBDdXJyZW50IHJlbGVhc2UgbGV2ZWwgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbi4gICovCisgICAgY2hhciByZWxlYXNlW19VVFNOQU1FX1JFTEVBU0VfTEVOR1RIXTsKKyAgICAvKiBDdXJyZW50IHZlcnNpb24gbGV2ZWwgb2YgdGhpcyByZWxlYXNlLiAgKi8KKyAgICBjaGFyIHZlcnNpb25bX1VUU05BTUVfVkVSU0lPTl9MRU5HVEhdOworCisgICAgLyogTmFtZSBvZiB0aGUgaGFyZHdhcmUgdHlwZSB0aGUgc3lzdGVtIGlzIHJ1bm5pbmcgb24uICAqLworICAgIGNoYXIgbWFjaGluZVtfVVRTTkFNRV9NQUNISU5FX0xFTkdUSF07CisKKyNpZiBfVVRTTkFNRV9ET01BSU5fTEVOR1RIIC0gMAorICAgIC8qIE5hbWUgb2YgdGhlIGRvbWFpbiBvZiB0aGlzIG5vZGUgb24gdGhlIG5ldHdvcmsuICAqLworIyBpZmRlZiBfX1VTRV9HTlUKKyAgICBjaGFyIGRvbWFpbm5hbWVbX1VUU05BTUVfRE9NQUlOX0xFTkdUSF07CisjIGVsc2UKKyAgICBjaGFyIF9fZG9tYWlubmFtZVtfVVRTTkFNRV9ET01BSU5fTEVOR1RIXTsKKyMgZW5kaWYKKyNlbmRpZgorICB9OworCisjaWZkZWYgX19VU0VfU1ZJRAorLyogTm90ZSB0aGF0IFNWSUQgYXNzdW1lcyBhbGwgbWVtYmVycyBoYXZlIHRoZSBzYW1lIHNpemUuICAqLworIyBkZWZpbmUgU1lTX05NTE4gIF9VVFNOQU1FX0xFTkdUSAorI2VuZGlmCisKKworLyogUHV0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzeXN0ZW0gaW4gTkFNRS4gICovCitleHRlcm4gaW50IHVuYW1lIChzdHJ1Y3QgdXRzbmFtZSAqX19uYW1lKSBfX1RIUk9XOworCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvdXRzbmFtZS5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdmZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy92ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTIyZDMxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdmZzLmgKQEAgLTAsMCArMSw0IEBACisvKiBPdGhlciBzeXN0ZW1zIGRlY2xhcmUgYHN0cnVjdCBzdGF0ZnMnIGV0IGFsIGluIDxzeXMvdmZzLmg+LAorICAgc28gd2UgaGF2ZSB0aGlzIGZpbGUgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHByb2dyYW1zIGV4cGVjdGluZyBpdC4gICovCisKKyNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy92bGltaXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3ZsaW1pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmN2EwOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy92bGltaXQuaApAQCAtMCwwICsxLDY4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19WTElNSVRfSAorI2RlZmluZSBfU1lTX1ZMSU1JVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogVGhpcyBpbnRlcmZhY2UgaXMgb2Jzb2xldGUsIGFuZCBpcyBzdXBlcnNlZGVkIGJ5IDxzeXMvcmVzb3VyY2UuaD4uICAqLworCisvKiBLaW5kcyBvZiByZXNvdXJjZSBsaW1pdC4gICovCitlbnVtIF9fdmxpbWl0X3Jlc291cmNlCit7CisgIC8qIFNldHRpbmcgdGhpcyBub24temVybyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHJhaXNlIGxpbWl0cy4KKyAgICAgT25seSB0aGUgc3VwZXItdXNlIGNhbiBzZXQgaXQgdG8gemVyby4KKworICAgICBUaGlzIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiByZWNlbnQgdmVyc2lvbnMgb2YgQlNELCBub3IgYnkKKyAgICAgdGhlIEdOVSBDIGxpYnJhcnkuICAqLworICBMSU1fTk9SQUlTRSwKKworICAvKiBDUFUgdGltZSBhdmFpbGFibGUgZm9yIGVhY2ggcHJvY2VzcyAoc2Vjb25kcykuICAqLworICBMSU1fQ1BVLAorCisgIC8qIExhcmdlc3QgZmlsZSB3aGljaCBjYW4gYmUgY3JlYXRlZCAoYnl0ZXMpLiAgKi8KKyAgTElNX0ZTSVpFLAorCisgIC8qIE1heGltdW0gc2l6ZSBvZiB0aGUgZGF0YSBzZWdtZW50IChieXRlcykuICAqLworICBMSU1fREFUQSwKKworICAvKiBNYXhpbXVtIHNpemUgb2YgdGhlIHN0YWNrIHNlZ21lbnQgKGJ5dGVzKS4gICovCisgIExJTV9TVEFDSywKKworICAvKiBMYXJnZXN0IGNvcmUgZmlsZSB0aGF0IHdpbGwgYmUgY3JlYXRlZCAoYnl0ZXMpLiAgKi8KKyAgTElNX0NPUkUsCisKKyAgLyogUmVzaWRlbnQgc2V0IHNpemUgKGJ5dGVzKS4gICovCisgIExJTV9NQVhSU1MKK307CisKKy8qIFRoaXMgbWVhbnMgbm8gbGltaXQuICAqLworI2RlZmluZSBJTkZJTklUWSAweDdmZmZmZmZmCisKKworLyogU2V0IHRoZSBzb2Z0IGxpbWl0IGZvciBSRVNPVVJDRSB0byBiZSBWQUxVRS4KKyAgIFJldHVybnMgMCBmb3Igc3VjY2VzcywgLTEgZm9yIGZhaWx1cmUuICAqLworZXh0ZXJuIGludCB2bGltaXQgKGVudW0gX192bGltaXRfcmVzb3VyY2UgX19yZXNvdXJjZSwgaW50IF9fdmFsdWUpIF9fVEhST1c7CisKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy92bGltaXQuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3ZtODYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3ZtODYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzUxNTJjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdm04Ni5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1ZNODZfSAorCisjZGVmaW5lIF9TWVNfVk04Nl9ICTEKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgY29uc3RhbnRzIGFuZCBkYXRhIHR5cGVzIGZyb20ga2VybmVsIGhlYWRlciBmaWxlLiAgKi8KKyNpbmNsdWRlIDxhc20vdm04Ni5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIEVudGVyIHZpcnR1YWwgODA4NiBtb2RlLiAgKi8KK2V4dGVybiBpbnQgdm04NiAodW5zaWduZWQgbG9uZyBpbnQgX19zdWJmdW5jdGlvbiwKKwkJIHN0cnVjdCB2bTg2cGx1c19zdHJ1Y3QgKl9faW5mbykgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIF9TWVNfVk04Nl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy92dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzRhYmZiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdnQuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8bGludXgvdnQuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3Z0aW1lcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMvdnRpbWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU3ZjNhNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3Z0aW1lcy5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1ZUSU1FU19ICisjZGVmaW5lIF9TWVNfVlRJTUVTX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBUaGlzIGludGVyZmFjZSBpcyBvYnNvbGV0ZTsgdXNlIGBnZXRydXNhZ2UnIGluc3RlYWQuICAqLworCisvKiBHcmFudWxhcml0eSBvZiB0aGUgYHZtX3V0aW1lJyBhbmQgYHZtX3N0aW1lJyBmaWVsZHMgb2YgYSBgc3RydWN0IHZ0aW1lcycuCisgICAoVGhpcyBpcyB0aGUgZnJlcXVlbmN5IG9mIHRoZSBtYWNoaW5lJ3MgcG93ZXIgc3VwcGx5LCBpbiBIei4pICAqLworI2RlZmluZQlWVElNRVNfVU5JVFNfUEVSX1NFQ09ORAk2MAorCitzdHJ1Y3QgdnRpbWVzCit7CisgIC8qIFVzZXIgdGltZSB1c2VkIGluIHVuaXRzIG9mIDEvVlRJTUVTX1VOSVRTX1BFUl9TRUNPTkQgc2Vjb25kcy4gICovCisgIGludCB2bV91dGltZTsKKyAgLyogU3lzdGVtIHRpbWUgdXNlZCBpbiB1bml0cyBvZiAxL1ZUSU1FU19VTklUU19QRVJfU0VDT05EIHNlY29uZHMuICAqLworICBpbnQgdm1fc3RpbWU7CisKKyAgLyogQW1vdW50IG9mIGRhdGEgYW5kIHN0YWNrIG1lbW9yeSB1c2VkIChraWxvYnl0ZS1zZWNvbmRzKS4gICovCisgIHVuc2lnbmVkIGludCB2bV9pZHNyc3M7CisgIC8qIEFtb3VudCBvZiB0ZXh0IG1lbW9yeSB1c2VkIChraWxvYnl0ZS1zZWNvbmRzKS4gICovCisgIHVuc2lnbmVkIGludCB2bV9peHJzczsKKyAgLyogTWF4aW11bSByZXNpZGVudCBzZXQgc2l6ZSAodGV4dCwgZGF0YSwgYW5kIHN0YWNrKSAoa2lsb2J5dGVzKS4gICovCisgIGludCB2bV9tYXhyc3M7CisKKyAgLyogTnVtYmVyIG9mIGhhcmQgcGFnZSBmYXVsdHMgKGkuZS4gdGhvc2UgdGhhdCByZXF1aXJlZCBJL08pLiAgKi8KKyAgaW50IHZtX21hamZsdDsKKyAgLyogTnVtYmVyIG9mIHNvZnQgcGFnZSBmYXVsdHMgKGkuZS4gdGhvc2Ugc2VydmljZWQgYnkgcmVjbGFpbWluZworICAgICBhIHBhZ2UgZnJvbSB0aGUgbGlzdCBvZiBwYWdlcyBhd2FpdGluZyByZWFsbG9jYXRpb24uICAqLworICBpbnQgdm1fbWluZmx0OworCisgIC8qIE51bWJlciBvZiB0aW1lcyBhIHByb2Nlc3Mgd2FzIHN3YXBwZWQgb3V0IG9mIHBoeXNpY2FsIG1lbW9yeS4gICovCisgIGludCB2bV9uc3dhcDsKKworICAvKiBOdW1iZXIgb2YgaW5wdXQgb3BlcmF0aW9ucyB2aWEgdGhlIGZpbGUgc3lzdGVtLiAgTm90ZTogVGhpcworICAgICBhbmQgYHJ1X291YmxvY2snIGRvIG5vdCBpbmNsdWRlIG9wZXJhdGlvbnMgd2l0aCB0aGUgY2FjaGUuICAqLworICBpbnQgdm1faW5ibGs7CisgIC8qIE51bWJlciBvZiBvdXRwdXQgb3BlcmF0aW9ucyB2aWEgdGhlIGZpbGUgc3lzdGVtLiAgKi8KKyAgaW50IHZtX291YmxrOworfTsKKworLyogSWYgQ1VSUkVOVCBpcyBub3QgTlVMTCwgd3JpdGUgc3RhdGlzdGljcyBmb3IgdGhlIGN1cnJlbnQgcHJvY2VzcyBpbnRvCisgICAqQ1VSUkVOVC4gIElmIENISUxEIGlzIG5vdCBOVUxMLCB3cml0ZSBzdGF0aXN0aWNzIGZvciBhbGwgdGVybWluYXRlZCBjaGlsZAorICAgcHJvY2Vzc2VzIGludG8gKkNISUxELiAgUmV0dXJucyAwIGZvciBzdWNjZXNzLCAtMSBmb3IgZmFpbHVyZS4gICovCitleHRlcm4gaW50IHZ0aW1lcyAoc3RydWN0IHZ0aW1lcyAqIF9fY3VycmVudCwgc3RydWN0IHZ0aW1lcyAqIF9fY2hpbGQpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvdnRpbWVzLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy93YWl0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy93YWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmZDU4ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUvc3lzL3dhaXQuaApAQCAtMCwwICsxLDE4MiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTQsMTk5Ni0yMDAxLDIwMDMsMjAwNCwyMDA1LDIwMDcsMjAwOSwyMDEwLDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJUE9TSVggU3RhbmRhcmQ6IDMuMi4xIFdhaXQgZm9yIFByb2Nlc3MgVGVybWluYXRpb24JPHN5cy93YWl0Lmg+CisgKi8KKworI2lmbmRlZglfU1lTX1dBSVRfSAorI2RlZmluZQlfU1lTX1dBSVRfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKworLyogVGhlc2UgbWFjcm9zIGNvdWxkIGFsc28gYmUgZGVmaW5lZCBpbiA8c3RkbGliLmg+LiAgKi8KKyNpZiAhZGVmaW5lZCBfU1RETElCX0ggfHwgKCFkZWZpbmVkIF9fVVNFX1hPUEVOICYmICFkZWZpbmVkIF9fVVNFX1hPUEVOMks4KQorLyogVGhpcyB3aWxsIGRlZmluZSB0aGUgYFcqJyBtYWNyb3MgZm9yIHRoZSBmbGFnCisgICBiaXRzIHRvIGB3YWl0cGlkJywgYHdhaXQzJywgYW5kIGB3YWl0NCcuICAqLworIyBpbmNsdWRlIDxiaXRzL3dhaXRmbGFncy5oPgorCisjIGlmZGVmCV9fVVNFX0JTRAorCisvKiBMb3RzIG9mIGhhaXIgdG8gYWxsb3cgdHJhZGl0aW9uYWwgQlNEIHVzZSBvZiBgdW5pb24gd2FpdCcKKyAgIGFzIHdlbGwgYXMgUE9TSVguMSB1c2Ugb2YgYGludCcgZm9yIHRoZSBzdGF0dXMgd29yZC4gICovCisKKyMgIGlmIGRlZmluZWQgX19HTlVDX18gJiYgIWRlZmluZWQgX19jcGx1c3BsdXMKKyMgICBkZWZpbmUgX19XQUlUX0lOVChzdGF0dXMpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKCgodW5pb24geyBfX3R5cGVvZihzdGF0dXMpIF9faW47IGludCBfX2k7IH0pIFwKKwkJICAgeyAuX19pbiA9IChzdGF0dXMpIH0pLl9faSkpCisjICBlbHNlCisjICAgZGVmaW5lIF9fV0FJVF9JTlQoc3RhdHVzKQkoKihfX2NvbnN0IGludCAqKSAmKHN0YXR1cykpCisjICBlbmRpZgorCisvKiBUaGlzIGlzIHRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudCB0byBgd2FpdCcuICBUaGUgZnVua3kgdW5pb24KKyAgIGNhdXNlcyByZWRlY2xhcmF0aW9ucyB3aXRoIGVpdGhlciBgaW50IConIG9yIGB1bmlvbiB3YWl0IConIHRvIGJlCisgICBhbGxvd2VkIHdpdGhvdXQgY29tcGxhaW50LiAgX19XQUlUX1NUQVRVU19ERUZOIGlzIHRoZSB0eXBlIHVzZWQgaW4KKyAgIHRoZSBhY3R1YWwgZnVuY3Rpb24gZGVmaW5pdGlvbnMuICAqLworCisjICBpZiAhZGVmaW5lZCBfX0dOVUNfXyB8fCBfX0dOVUNfXyA8IDIgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cworIyAgIGRlZmluZSBfX1dBSVRfU1RBVFVTCXZvaWQgKgorIyAgIGRlZmluZSBfX1dBSVRfU1RBVFVTX0RFRk4Jdm9pZCAqCisjICBlbHNlCisvKiBUaGlzIHdvcmtzIGluIEdDQyAyLjYuMSBhbmQgbGF0ZXIuICAqLwordHlwZWRlZiB1bmlvbgorICB7CisgICAgdW5pb24gd2FpdCAqX191cHRyOworICAgIGludCAqX19pcHRyOworICB9IF9fV0FJVF9TVEFUVVMgX19hdHRyaWJ1dGVfXyAoKF9fdHJhbnNwYXJlbnRfdW5pb25fXykpOworIyAgIGRlZmluZSBfX1dBSVRfU1RBVFVTX0RFRk4JaW50ICoKKyMgIGVuZGlmCisKKyMgZWxzZSAvKiBEb24ndCB1c2UgQlNELiAgKi8KKworIyAgZGVmaW5lIF9fV0FJVF9JTlQoc3RhdHVzKQkoc3RhdHVzKQorIyAgZGVmaW5lIF9fV0FJVF9TVEFUVVMJCWludCAqCisjICBkZWZpbmUgX19XQUlUX1NUQVRVU19ERUZOCWludCAqCisKKyMgZW5kaWYgLyogVXNlIEJTRC4gICovCisKKy8qIFRoaXMgd2lsbCBkZWZpbmUgYWxsIHRoZSBgX19XKicgbWFjcm9zLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy93YWl0c3RhdHVzLmg+CisKKyMgZGVmaW5lIFdFWElUU1RBVFVTKHN0YXR1cykJX19XRVhJVFNUQVRVUyAoX19XQUlUX0lOVCAoc3RhdHVzKSkKKyMgZGVmaW5lIFdURVJNU0lHKHN0YXR1cykJX19XVEVSTVNJRyAoX19XQUlUX0lOVCAoc3RhdHVzKSkKKyMgZGVmaW5lIFdTVE9QU0lHKHN0YXR1cykJX19XU1RPUFNJRyAoX19XQUlUX0lOVCAoc3RhdHVzKSkKKyMgZGVmaW5lIFdJRkVYSVRFRChzdGF0dXMpCV9fV0lGRVhJVEVEIChfX1dBSVRfSU5UIChzdGF0dXMpKQorIyBkZWZpbmUgV0lGU0lHTkFMRUQoc3RhdHVzKQlfX1dJRlNJR05BTEVEIChfX1dBSVRfSU5UIChzdGF0dXMpKQorIyBkZWZpbmUgV0lGU1RPUFBFRChzdGF0dXMpCV9fV0lGU1RPUFBFRCAoX19XQUlUX0lOVCAoc3RhdHVzKSkKKyMgaWZkZWYgX19XSUZDT05USU5VRUQKKyMgIGRlZmluZSBXSUZDT05USU5VRUQoc3RhdHVzKQlfX1dJRkNPTlRJTlVFRCAoX19XQUlUX0lOVCAoc3RhdHVzKSkKKyMgZW5kaWYKKyNlbmRpZgkvKiA8c3RkbGliLmg+IG5vdCBpbmNsdWRlZC4gICovCisKKyNpZmRlZglfX1VTRV9CU0QKKyMgZGVmaW5lIFdDT1JFRkxBRwkJX19XQ09SRUZMQUcKKyMgZGVmaW5lIFdDT1JFRFVNUChzdGF0dXMpCV9fV0NPUkVEVU1QIChfX1dBSVRfSU5UIChzdGF0dXMpKQorIyBkZWZpbmUgV19FWElUQ09ERShyZXQsIHNpZykJX19XX0VYSVRDT0RFIChyZXQsIHNpZykKKyMgZGVmaW5lIFdfU1RPUENPREUoc2lnKQlfX1dfU1RPUENPREUgKHNpZykKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgdXNlZCBieSB0aGUgYHdhaXRpZCcgZnVuY3Rpb24uICAqLworI2lmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKK3R5cGVkZWYgZW51bQoreworICBQX0FMTCwJCS8qIFdhaXQgZm9yIGFueSBjaGlsZC4gICovCisgIFBfUElELAkJLyogV2FpdCBmb3Igc3BlY2lmaWVkIHByb2Nlc3MuICAqLworICBQX1BHSUQJCS8qIFdhaXQgZm9yIG1lbWJlcnMgb2YgcHJvY2VzcyBncm91cC4gICovCit9IGlkdHlwZV90OworI2VuZGlmCisKKworLyogV2FpdCBmb3IgYSBjaGlsZCB0byBkaWUuICBXaGVuIG9uZSBkb2VzLCBwdXQgaXRzIHN0YXR1cyBpbiAqU1RBVF9MT0MKKyAgIGFuZCByZXR1cm4gaXRzIHByb2Nlc3MgSUQuICBGb3IgZXJyb3JzLCByZXR1cm4gKHBpZF90KSAtMS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gX19waWRfdCB3YWl0IChfX1dBSVRfU1RBVFVTIF9fc3RhdF9sb2MpOworCisjaWZkZWYJX19VU0VfQlNECisvKiBTcGVjaWFsIHZhbHVlcyBmb3IgdGhlIFBJRCBhcmd1bWVudCB0byBgd2FpdHBpZCcgYW5kIGB3YWl0NCcuICAqLworIyBkZWZpbmUgV0FJVF9BTlkJKC0xKQkvKiBBbnkgcHJvY2Vzcy4gICovCisjIGRlZmluZSBXQUlUX01ZUEdSUAkwCS8qIEFueSBwcm9jZXNzIGluIG15IHByb2Nlc3MgZ3JvdXAuICAqLworI2VuZGlmCisKKy8qIFdhaXQgZm9yIGEgY2hpbGQgbWF0Y2hpbmcgUElEIHRvIGRpZS4KKyAgIElmIFBJRCBpcyBncmVhdGVyIHRoYW4gMCwgbWF0Y2ggYW55IHByb2Nlc3Mgd2hvc2UgcHJvY2VzcyBJRCBpcyBQSUQuCisgICBJZiBQSUQgaXMgKHBpZF90KSAtMSwgbWF0Y2ggYW55IHByb2Nlc3MuCisgICBJZiBQSUQgaXMgKHBpZF90KSAwLCBtYXRjaCBhbnkgcHJvY2VzcyB3aXRoIHRoZQorICAgc2FtZSBwcm9jZXNzIGdyb3VwIGFzIHRoZSBjdXJyZW50IHByb2Nlc3MuCisgICBJZiBQSUQgaXMgbGVzcyB0aGFuIC0xLCBtYXRjaCBhbnkgcHJvY2VzcyB3aG9zZQorICAgcHJvY2VzcyBncm91cCBpcyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgUElELgorICAgSWYgdGhlIFdOT0hBTkcgYml0IGlzIHNldCBpbiBPUFRJT05TLCBhbmQgdGhhdCBjaGlsZAorICAgaXMgbm90IGFscmVhZHkgZGVhZCwgcmV0dXJuIChwaWRfdCkgMC4gIElmIHN1Y2Nlc3NmdWwsCisgICByZXR1cm4gUElEIGFuZCBzdG9yZSB0aGUgZGVhZCBjaGlsZCdzIHN0YXR1cyBpbiBTVEFUX0xPQy4KKyAgIFJldHVybiAocGlkX3QpIC0xIGZvciBlcnJvcnMuICBJZiB0aGUgV1VOVFJBQ0VEIGJpdCBpcworICAgc2V0IGluIE9QVElPTlMsIHJldHVybiBzdGF0dXMgZm9yIHN0b3BwZWQgY2hpbGRyZW47IG90aGVyd2lzZSBkb24ndC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gX19waWRfdCB3YWl0cGlkIChfX3BpZF90IF9fcGlkLCBpbnQgKl9fc3RhdF9sb2MsIGludCBfX29wdGlvbnMpOworCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorIyBkZWZpbmUgX19uZWVkX3NpZ2luZm9fdAorIyBpbmNsdWRlIDxiaXRzL3NpZ2luZm8uaD4KKy8qIFdhaXQgZm9yIGEgY2hpbGRpbmcgbWF0Y2hpbmcgSURUWVBFIGFuZCBJRCB0byBjaGFuZ2UgdGhlIHN0YXR1cyBhbmQKKyAgIHBsYWNlIGFwcHJvcHJpYXRlIGluZm9ybWF0aW9uIGluICpJTkZPUC4KKyAgIElmIElEVFlQRSBpcyBQX1BJRCwgbWF0Y2ggYW55IHByb2Nlc3Mgd2hvc2UgcHJvY2VzcyBJRCBpcyBJRC4KKyAgIElmIElEVFlQRSBpcyBQX1BHSUQsIG1hdGNoIGFueSBwcm9jZXNzIHdob3NlIHByb2Nlc3MgZ3JvdXAgaXMgSUQuCisgICBJZiBJRFRZUEUgaXMgUF9BTEwsIG1hdGNoIGFueSBwcm9jZXNzLgorICAgSWYgdGhlIFdOT0hBTkcgYml0IGlzIHNldCBpbiBPUFRJT05TLCBhbmQgdGhhdCBjaGlsZAorICAgaXMgbm90IGFscmVhZHkgZGVhZCwgY2xlYXIgKklORk9QIGFuZCByZXR1cm4gMC4gIElmIHN1Y2Nlc3NmdWwsIHN0b3JlCisgICBleGl0IGNvZGUgYW5kIHN0YXR1cyBpbiAqSU5GT1AuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCB3YWl0aWQgKGlkdHlwZV90IF9faWR0eXBlLCBfX2lkX3QgX19pZCwgc2lnaW5mb190ICpfX2luZm9wLAorCQkgICBpbnQgX19vcHRpb25zKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogVGhpcyBiZWluZyBoZXJlIG1ha2VzIHRoZSBwcm90b3R5cGVzIHZhbGlkIHdoZXRoZXIgb3Igbm90CisgICB3ZSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgPHN5cy9yZXNvdXJjZS5oPiB0byBkZWZpbmUgYHN0cnVjdCBydXNhZ2UnLiAgKi8KK3N0cnVjdCBydXNhZ2U7CisKKy8qIFdhaXQgZm9yIGEgY2hpbGQgdG8gZXhpdC4gIFdoZW4gb25lIGRvZXMsIHB1dCBpdHMgc3RhdHVzIGluICpTVEFUX0xPQyBhbmQKKyAgIHJldHVybiBpdHMgcHJvY2VzcyBJRC4gIEZvciBlcnJvcnMgcmV0dXJuIChwaWRfdCkgLTEuICBJZiBVU0FHRSBpcyBub3QKKyAgIG5pbCwgc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoaWxkJ3MgcmVzb3VyY2UgdXNhZ2UgdGhlcmUuICBJZiB0aGUKKyAgIFdVTlRSQUNFRCBiaXQgaXMgc2V0IGluIE9QVElPTlMsIHJldHVybiBzdGF0dXMgZm9yIHN0b3BwZWQgY2hpbGRyZW47CisgICBvdGhlcndpc2UgZG9uJ3QuICAqLworZXh0ZXJuIF9fcGlkX3Qgd2FpdDMgKF9fV0FJVF9TVEFUVVMgX19zdGF0X2xvYywgaW50IF9fb3B0aW9ucywKKwkJICAgICAgc3RydWN0IHJ1c2FnZSAqIF9fdXNhZ2UpIF9fVEhST1dOTDsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfQlNECisvKiBQSUQgaXMgbGlrZSB3YWl0cGlkLiAgT3RoZXIgYXJncyBhcmUgbGlrZSB3YWl0My4gICovCitleHRlcm4gX19waWRfdCB3YWl0NCAoX19waWRfdCBfX3BpZCwgX19XQUlUX1NUQVRVUyBfX3N0YXRfbG9jLCBpbnQgX19vcHRpb25zLAorCQkgICAgICBzdHJ1Y3QgcnVzYWdlICpfX3VzYWdlKSBfX1RIUk9XTkw7CisjZW5kaWYgLyogVXNlIEJTRC4gICovCisKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy93YWl0LmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2kzODYtbGludXgtZ251L3N5cy94YXR0ci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMveGF0dHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzM3ZjkwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pMzg2LWxpbnV4LWdudS9zeXMveGF0dHIuaApAQCAtMCwwICsxLDEwNCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfWEFUVFJfSAorI2RlZmluZSBfU1lTX1hBVFRSX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgZmlmdGggcGFyYW1ldGVyIG9mCisgICBgKnNldHhhdHRyJy4gICovCitlbnVtCit7CisgIFhBVFRSX0NSRUFURSA9IDEsCS8qIHNldCB2YWx1ZSwgZmFpbCBpZiBhdHRyIGFscmVhZHkgZXhpc3RzLiAgKi8KKyNkZWZpbmUgWEFUVFJfQ1JFQVRFCVhBVFRSX0NSRUFURQorICBYQVRUUl9SRVBMQUNFID0gMgkvKiBzZXQgdmFsdWUsIGZhaWwgaWYgYXR0ciBkb2VzIG5vdCBleGlzdC4gICovCisjZGVmaW5lIFhBVFRSX1JFUExBQ0UJWEFUVFJfUkVQTEFDRQorfTsKKworLyogU2V0IHRoZSBhdHRyaWJ1dGUgTkFNRSBvZiB0aGUgZmlsZSBwb2ludGVkIHRvIGJ5IFBBVEggdG8gVkFMVUUgKHdoaWNoCisgICBpcyBTSVpFIGJ5dGVzIGxvbmcpLiAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IHNldHhhdHRyIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19jb25zdCBjaGFyICpfX25hbWUsCisJCSAgICAgX19jb25zdCB2b2lkICpfX3ZhbHVlLCBzaXplX3QgX19zaXplLCBpbnQgX19mbGFncykKKwlfX1RIUk9XOworCisvKiBTZXQgdGhlIGF0dHJpYnV0ZSBOQU1FIG9mIHRoZSBmaWxlIHBvaW50ZWQgdG8gYnkgUEFUSCB0byBWQUxVRSAod2hpY2ggaXMKKyAgIFNJWkUgYnl0ZXMgbG9uZyksIG5vdCBmb2xsb3dpbmcgc3ltbGlua3MgZm9yIHRoZSBsYXN0IHBhdGhuYW1lIGNvbXBvbmVudC4KKyAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIGludCBsc2V0eGF0dHIgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX2NvbnN0IGNoYXIgKl9fbmFtZSwKKwkJICAgICAgX19jb25zdCB2b2lkICpfX3ZhbHVlLCBzaXplX3QgX19zaXplLCBpbnQgX19mbGFncykKKwlfX1RIUk9XOworCisvKiBTZXQgdGhlIGF0dHJpYnV0ZSBOQU1FIG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IgRkQgdG8gVkFMVUUgKHdoaWNoIGlzIFNJWkUKKyAgIGJ5dGVzIGxvbmcpLiAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IGZzZXR4YXR0ciAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19uYW1lLCBfX2NvbnN0IHZvaWQgKl9fdmFsdWUsCisJCSAgICAgIHNpemVfdCBfX3NpemUsIGludCBfX2ZsYWdzKSBfX1RIUk9XOworCisvKiBHZXQgdGhlIGF0dHJpYnV0ZSBOQU1FIG9mIHRoZSBmaWxlIHBvaW50ZWQgdG8gYnkgUEFUSCB0byBWQUxVRSAod2hpY2ggaXMKKyAgIFNJWkUgYnl0ZXMgbG9uZykuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBzc2l6ZV90IGdldHhhdHRyIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19jb25zdCBjaGFyICpfX25hbWUsCisJCQkgdm9pZCAqX192YWx1ZSwgc2l6ZV90IF9fc2l6ZSkgX19USFJPVzsKKworLyogR2V0IHRoZSBhdHRyaWJ1dGUgTkFNRSBvZiB0aGUgZmlsZSBwb2ludGVkIHRvIGJ5IFBBVEggdG8gVkFMVUUgKHdoaWNoIGlzCisgICBTSVpFIGJ5dGVzIGxvbmcpLCBub3QgZm9sbG93aW5nIHN5bWxpbmtzIGZvciB0aGUgbGFzdCBwYXRobmFtZSBjb21wb25lbnQuCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBzc2l6ZV90IGxnZXR4YXR0ciAoX19jb25zdCBjaGFyICpfX3BhdGgsIF9fY29uc3QgY2hhciAqX19uYW1lLAorCQkJICB2b2lkICpfX3ZhbHVlLCBzaXplX3QgX19zaXplKSBfX1RIUk9XOworCisvKiBHZXQgdGhlIGF0dHJpYnV0ZSBOQU1FIG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IgRkQgdG8gVkFMVUUgKHdoaWNoIGlzIFNJWkUKKyAgIGJ5dGVzIGxvbmcpLiAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gc3NpemVfdCBmZ2V0eGF0dHIgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fbmFtZSwgdm9pZCAqX192YWx1ZSwKKwkJCSAgc2l6ZV90IF9fc2l6ZSkgX19USFJPVzsKKworLyogTGlzdCBhdHRyaWJ1dGVzIG9mIHRoZSBmaWxlIHBvaW50ZWQgdG8gYnkgUEFUSCBpbnRvIHRoZSB1c2VyLXN1cHBsaWVkCisgICBidWZmZXIgTElTVCAod2hpY2ggaXMgU0laRSBieXRlcyBiaWcpLiAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgZm9yCisgICBlcnJvcnMuICAqLworZXh0ZXJuIHNzaXplX3QgbGlzdHhhdHRyIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgY2hhciAqX19saXN0LCBzaXplX3QgX19zaXplKQorCV9fVEhST1c7CisKKy8qIExpc3QgYXR0cmlidXRlcyBvZiB0aGUgZmlsZSBwb2ludGVkIHRvIGJ5IFBBVEggaW50byB0aGUgdXNlci1zdXBwbGllZAorICAgYnVmZmVyIExJU1QgKHdoaWNoIGlzIFNJWkUgYnl0ZXMgYmlnKSwgbm90IGZvbGxvd2luZyBzeW1saW5rcyBmb3IgdGhlCisgICBsYXN0IHBhdGhuYW1lIGNvbXBvbmVudC4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIHNzaXplX3QgbGxpc3R4YXR0ciAoX19jb25zdCBjaGFyICpfX3BhdGgsIGNoYXIgKl9fbGlzdCwgc2l6ZV90IF9fc2l6ZSkKKwlfX1RIUk9XOworCisvKiBMaXN0IGF0dHJpYnV0ZXMgb2YgdGhlIGZpbGUgZGVzY3JpcHRvciBGRCBpbnRvIHRoZSB1c2VyLXN1cHBsaWVkIGJ1ZmZlcgorICAgTElTVCAod2hpY2ggaXMgU0laRSBieXRlcyBiaWcpLiAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gc3NpemVfdCBmbGlzdHhhdHRyIChpbnQgX19mZCwgY2hhciAqX19saXN0LCBzaXplX3QgX19zaXplKQorCV9fVEhST1c7CisKKy8qIFJlbW92ZSB0aGUgYXR0cmlidXRlIE5BTUUgZnJvbSB0aGUgZmlsZSBwb2ludGVkIHRvIGJ5IFBBVEguICBSZXR1cm4gMAorICAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IHJlbW92ZXhhdHRyIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19jb25zdCBjaGFyICpfX25hbWUpIF9fVEhST1c7CisKKy8qIFJlbW92ZSB0aGUgYXR0cmlidXRlIE5BTUUgZnJvbSB0aGUgZmlsZSBwb2ludGVkIHRvIGJ5IFBBVEgsIG5vdAorICAgZm9sbG93aW5nIHN5bWxpbmtzIGZvciB0aGUgbGFzdCBwYXRobmFtZSBjb21wb25lbnQuICBSZXR1cm4gMCBvbgorICAgc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IGxyZW1vdmV4YXR0ciAoX19jb25zdCBjaGFyICpfX3BhdGgsIF9fY29uc3QgY2hhciAqX19uYW1lKSBfX1RIUk9XOworCisvKiBSZW1vdmUgdGhlIGF0dHJpYnV0ZSBOQU1FIGZyb20gdGhlIGZpbGUgZGVzY3JpcHRvciBGRC4gIFJldHVybiAwIG9uCisgICBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgZnJlbW92ZXhhdHRyIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX25hbWUpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMveGF0dHIuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaWNvbnYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaWNvbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDliNzliCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pY29udi5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwLCAyMDAzLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9JQ09OVl9ICisjZGVmaW5lIF9JQ09OVl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIElkZW50aWZpZXIgZm9yIGNvbnZlcnNpb24gbWV0aG9kIGZyb20gb25lIGNvZGVzZXQgdG8gYW5vdGhlci4gICovCit0eXBlZGVmIHZvaWQgKmljb252X3Q7CisKKworLyogQWxsb2NhdGUgZGVzY3JpcHRvciBmb3IgY29kZSBjb252ZXJzaW9uIGZyb20gY29kZXNldCBGUk9NQ09ERSB0bworICAgY29kZXNldCBUT0NPREUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGljb252X3QgaWNvbnZfb3BlbiAoX19jb25zdCBjaGFyICpfX3RvY29kZSwgX19jb25zdCBjaGFyICpfX2Zyb21jb2RlKTsKKworLyogQ29udmVydCBhdCBtb3N0ICpJTkJZVEVTTEVGVCBieXRlcyBmcm9tICpJTkJVRiBhY2NvcmRpbmcgdG8gdGhlCisgICBjb2RlIGNvbnZlcnNpb24gYWxnb3JpdGhtIHNwZWNpZmllZCBieSBDRCBhbmQgcGxhY2UgdXAgdG8KKyAgICpPVVRCWVRFU0xFRlQgYnl0ZXMgaW4gYnVmZmVyIGF0ICpPVVRCVUYuICAqLworZXh0ZXJuIHNpemVfdCBpY29udiAoaWNvbnZfdCBfX2NkLCBjaGFyICoqX19yZXN0cmljdCBfX2luYnVmLAorCQkgICAgIHNpemVfdCAqX19yZXN0cmljdCBfX2luYnl0ZXNsZWZ0LAorCQkgICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fb3V0YnVmLAorCQkgICAgIHNpemVfdCAqX19yZXN0cmljdCBfX291dGJ5dGVzbGVmdCk7CisKKy8qIEZyZWUgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgZGVzY3JpcHRvciBDRCBmb3IgY29kZSBjb252ZXJzaW9uLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgaWNvbnZfY2xvc2UgKGljb252X3QgX19jZCk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBpY29udi5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2llZWU3NTQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaWVlZTc1NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxN2MyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2llZWU3NTQuaApAQCAtMCwwICsxLDE5OSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk1LCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9JRUVFNzU0X0gKKworI2RlZmluZSBfSUVFRTc1NF9IIDEKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8ZW5kaWFuLmg+CisKK19fQkVHSU5fREVDTFMKKwordW5pb24gaWVlZTc1NF9mbG9hdAorICB7CisgICAgZmxvYXQgZjsKKworICAgIC8qIFRoaXMgaXMgdGhlIElFRUUgNzU0IHNpbmdsZS1wcmVjaXNpb24gZm9ybWF0LiAgKi8KKyAgICBzdHJ1Y3QKKyAgICAgIHsKKyNpZglfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdW5zaWduZWQgaW50IG5lZ2F0aXZlOjE7CisJdW5zaWduZWQgaW50IGV4cG9uZW50Ojg7CisJdW5zaWduZWQgaW50IG1hbnRpc3NhOjIzOworI2VuZGlmCQkJCS8qIEJpZyBlbmRpYW4uICAqLworI2lmCV9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwl1bnNpZ25lZCBpbnQgbWFudGlzc2E6MjM7CisJdW5zaWduZWQgaW50IGV4cG9uZW50Ojg7CisJdW5zaWduZWQgaW50IG5lZ2F0aXZlOjE7CisjZW5kaWYJCQkJLyogTGl0dGxlIGVuZGlhbi4gICovCisgICAgICB9IGllZWU7CisKKyAgICAvKiBUaGlzIGZvcm1hdCBtYWtlcyBpdCBlYXNpZXIgdG8gc2VlIGlmIGEgTmFOIGlzIGEgc2lnbmFsbGluZyBOYU4uICAqLworICAgIHN0cnVjdAorICAgICAgeworI2lmCV9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1bnNpZ25lZCBpbnQgbmVnYXRpdmU6MTsKKwl1bnNpZ25lZCBpbnQgZXhwb25lbnQ6ODsKKwl1bnNpZ25lZCBpbnQgcXVpZXRfbmFuOjE7CisJdW5zaWduZWQgaW50IG1hbnRpc3NhOjIyOworI2VuZGlmCQkJCS8qIEJpZyBlbmRpYW4uICAqLworI2lmCV9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwl1bnNpZ25lZCBpbnQgbWFudGlzc2E6MjI7CisJdW5zaWduZWQgaW50IHF1aWV0X25hbjoxOworCXVuc2lnbmVkIGludCBleHBvbmVudDo4OworCXVuc2lnbmVkIGludCBuZWdhdGl2ZToxOworI2VuZGlmCQkJCS8qIExpdHRsZSBlbmRpYW4uICAqLworICAgICAgfSBpZWVlX25hbjsKKyAgfTsKKworI2RlZmluZSBJRUVFNzU0X0ZMT0FUX0JJQVMJMHg3ZiAvKiBBZGRlZCB0byBleHBvbmVudC4gICovCisKKwordW5pb24gaWVlZTc1NF9kb3VibGUKKyAgeworICAgIGRvdWJsZSBkOworCisgICAgLyogVGhpcyBpcyB0aGUgSUVFRSA3NTQgZG91YmxlLXByZWNpc2lvbiBmb3JtYXQuICAqLworICAgIHN0cnVjdAorICAgICAgeworI2lmCV9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1bnNpZ25lZCBpbnQgbmVnYXRpdmU6MTsKKwl1bnNpZ25lZCBpbnQgZXhwb25lbnQ6MTE7CisJLyogVG9nZXRoZXIgdGhlc2UgY29tcHJpc2UgdGhlIG1hbnRpc3NhLiAgKi8KKwl1bnNpZ25lZCBpbnQgbWFudGlzc2EwOjIwOworCXVuc2lnbmVkIGludCBtYW50aXNzYTE6MzI7CisjZW5kaWYJCQkJLyogQmlnIGVuZGlhbi4gICovCisjaWYJX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorIyBpZglfX0ZMT0FUX1dPUkRfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdW5zaWduZWQgaW50IG1hbnRpc3NhMDoyMDsKKwl1bnNpZ25lZCBpbnQgZXhwb25lbnQ6MTE7CisJdW5zaWduZWQgaW50IG5lZ2F0aXZlOjE7CisJdW5zaWduZWQgaW50IG1hbnRpc3NhMTozMjsKKyMgZWxzZQorCS8qIFRvZ2V0aGVyIHRoZXNlIGNvbXByaXNlIHRoZSBtYW50aXNzYS4gICovCisJdW5zaWduZWQgaW50IG1hbnRpc3NhMTozMjsKKwl1bnNpZ25lZCBpbnQgbWFudGlzc2EwOjIwOworCXVuc2lnbmVkIGludCBleHBvbmVudDoxMTsKKwl1bnNpZ25lZCBpbnQgbmVnYXRpdmU6MTsKKyMgZW5kaWYKKyNlbmRpZgkJCQkvKiBMaXR0bGUgZW5kaWFuLiAgKi8KKyAgICAgIH0gaWVlZTsKKworICAgIC8qIFRoaXMgZm9ybWF0IG1ha2VzIGl0IGVhc2llciB0byBzZWUgaWYgYSBOYU4gaXMgYSBzaWduYWxsaW5nIE5hTi4gICovCisgICAgc3RydWN0CisgICAgICB7CisjaWYJX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVuc2lnbmVkIGludCBuZWdhdGl2ZToxOworCXVuc2lnbmVkIGludCBleHBvbmVudDoxMTsKKwl1bnNpZ25lZCBpbnQgcXVpZXRfbmFuOjE7CisJLyogVG9nZXRoZXIgdGhlc2UgY29tcHJpc2UgdGhlIG1hbnRpc3NhLiAgKi8KKwl1bnNpZ25lZCBpbnQgbWFudGlzc2EwOjE5OworCXVuc2lnbmVkIGludCBtYW50aXNzYTE6MzI7CisjZWxzZQorIyBpZglfX0ZMT0FUX1dPUkRfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdW5zaWduZWQgaW50IG1hbnRpc3NhMDoxOTsKKwl1bnNpZ25lZCBpbnQgcXVpZXRfbmFuOjE7CisJdW5zaWduZWQgaW50IGV4cG9uZW50OjExOworCXVuc2lnbmVkIGludCBuZWdhdGl2ZToxOworCXVuc2lnbmVkIGludCBtYW50aXNzYTE6MzI7CisjIGVsc2UKKwkvKiBUb2dldGhlciB0aGVzZSBjb21wcmlzZSB0aGUgbWFudGlzc2EuICAqLworCXVuc2lnbmVkIGludCBtYW50aXNzYTE6MzI7CisJdW5zaWduZWQgaW50IG1hbnRpc3NhMDoxOTsKKwl1bnNpZ25lZCBpbnQgcXVpZXRfbmFuOjE7CisJdW5zaWduZWQgaW50IGV4cG9uZW50OjExOworCXVuc2lnbmVkIGludCBuZWdhdGl2ZToxOworIyBlbmRpZgorI2VuZGlmCisgICAgICB9IGllZWVfbmFuOworICB9OworCisjZGVmaW5lIElFRUU3NTRfRE9VQkxFX0JJQVMJMHgzZmYgLyogQWRkZWQgdG8gZXhwb25lbnQuICAqLworCisKK3VuaW9uIGllZWU4NTRfbG9uZ19kb3VibGUKKyAgeworICAgIGxvbmcgZG91YmxlIGQ7CisKKyAgICAvKiBUaGlzIGlzIHRoZSBJRUVFIDg1NCBkb3VibGUtZXh0ZW5kZWQtcHJlY2lzaW9uIGZvcm1hdC4gICovCisgICAgc3RydWN0CisgICAgICB7CisjaWYJX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVuc2lnbmVkIGludCBuZWdhdGl2ZToxOworCXVuc2lnbmVkIGludCBleHBvbmVudDoxNTsKKwl1bnNpZ25lZCBpbnQgZW1wdHk6MTY7CisJdW5zaWduZWQgaW50IG1hbnRpc3NhMDozMjsKKwl1bnNpZ25lZCBpbnQgbWFudGlzc2ExOjMyOworI2VuZGlmCisjaWYJX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorIyBpZglfX0ZMT0FUX1dPUkRfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdW5zaWduZWQgaW50IGV4cG9uZW50OjE1OworCXVuc2lnbmVkIGludCBuZWdhdGl2ZToxOworCXVuc2lnbmVkIGludCBlbXB0eToxNjsKKwl1bnNpZ25lZCBpbnQgbWFudGlzc2EwOjMyOworCXVuc2lnbmVkIGludCBtYW50aXNzYTE6MzI7CisjIGVsc2UKKwl1bnNpZ25lZCBpbnQgbWFudGlzc2ExOjMyOworCXVuc2lnbmVkIGludCBtYW50aXNzYTA6MzI7CisJdW5zaWduZWQgaW50IGV4cG9uZW50OjE1OworCXVuc2lnbmVkIGludCBuZWdhdGl2ZToxOworCXVuc2lnbmVkIGludCBlbXB0eToxNjsKKyMgZW5kaWYKKyNlbmRpZgorICAgICAgfSBpZWVlOworCisgICAgLyogVGhpcyBpcyBmb3IgTmFOcyBpbiB0aGUgSUVFRSA4NTQgZG91YmxlLWV4dGVuZGVkLXByZWNpc2lvbiBmb3JtYXQuICAqLworICAgIHN0cnVjdAorICAgICAgeworI2lmCV9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1bnNpZ25lZCBpbnQgbmVnYXRpdmU6MTsKKwl1bnNpZ25lZCBpbnQgZXhwb25lbnQ6MTU7CisJdW5zaWduZWQgaW50IGVtcHR5OjE2OworCXVuc2lnbmVkIGludCBvbmU6MTsKKwl1bnNpZ25lZCBpbnQgcXVpZXRfbmFuOjE7CisJdW5zaWduZWQgaW50IG1hbnRpc3NhMDozMDsKKwl1bnNpZ25lZCBpbnQgbWFudGlzc2ExOjMyOworI2VuZGlmCisjaWYJX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorIyBpZglfX0ZMT0FUX1dPUkRfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdW5zaWduZWQgaW50IGV4cG9uZW50OjE1OworCXVuc2lnbmVkIGludCBuZWdhdGl2ZToxOworCXVuc2lnbmVkIGludCBlbXB0eToxNjsKKwl1bnNpZ25lZCBpbnQgbWFudGlzc2EwOjMwOworCXVuc2lnbmVkIGludCBxdWlldF9uYW46MTsKKwl1bnNpZ25lZCBpbnQgb25lOjE7CisJdW5zaWduZWQgaW50IG1hbnRpc3NhMTozMjsKKyMgZWxzZQorCXVuc2lnbmVkIGludCBtYW50aXNzYTE6MzI7CisJdW5zaWduZWQgaW50IG1hbnRpc3NhMDozMDsKKwl1bnNpZ25lZCBpbnQgcXVpZXRfbmFuOjE7CisJdW5zaWduZWQgaW50IG9uZToxOworCXVuc2lnbmVkIGludCBleHBvbmVudDoxNTsKKwl1bnNpZ25lZCBpbnQgbmVnYXRpdmU6MTsKKwl1bnNpZ25lZCBpbnQgZW1wdHk6MTY7CisjIGVuZGlmCisjZW5kaWYKKyAgICAgIH0gaWVlZV9uYW47CisgIH07CisKKyNkZWZpbmUgSUVFRTg1NF9MT05HX0RPVUJMRV9CSUFTIDB4M2ZmZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogaWVlZTc1NC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2lmYWRkcnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaWZhZGRycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNmExNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2lmYWRkcnMuaApAQCAtMCwwICsxLDc0IEBACisvKiBpZmFkZHJzLmggLS0gZGVjbGFyYXRpb25zIGZvciBnZXR0aW5nIG5ldHdvcmsgaW50ZXJmYWNlIGFkZHJlc3NlcworICAgQ29weXJpZ2h0IChDKSAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9JRkFERFJTX0gKKyNkZWZpbmUgX0lGQUREUlNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBUaGUgYGdldGlmYWRkcnMnIGZ1bmN0aW9uIGdlbmVyYXRlcyBhIGxpbmtlZCBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMuCisgICBFYWNoIGVsZW1lbnQgb2YgdGhlIGxpc3QgZGVzY3JpYmVzIG9uZSBuZXR3b3JrIGludGVyZmFjZS4gICovCitzdHJ1Y3QgaWZhZGRycworeworICBzdHJ1Y3QgaWZhZGRycyAqaWZhX25leHQ7CS8qIFBvaW50ZXIgdG8gdGhlIG5leHQgc3RydWN0dXJlLiAgKi8KKworICBjaGFyICppZmFfbmFtZTsJCS8qIE5hbWUgb2YgdGhpcyBuZXR3b3JrIGludGVyZmFjZS4gICovCisgIHVuc2lnbmVkIGludCBpZmFfZmxhZ3M7CS8qIEZsYWdzIGFzIGZyb20gU0lPQ0dJRkZMQUdTIGlvY3RsLiAgKi8KKworICBzdHJ1Y3Qgc29ja2FkZHIgKmlmYV9hZGRyOwkvKiBOZXR3b3JrIGFkZHJlc3Mgb2YgdGhpcyBpbnRlcmZhY2UuICAqLworICBzdHJ1Y3Qgc29ja2FkZHIgKmlmYV9uZXRtYXNrOyAvKiBOZXRtYXNrIG9mIHRoaXMgaW50ZXJmYWNlLiAgKi8KKyAgdW5pb24KKyAgeworICAgIC8qIEF0IG1vc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGlzIHZhbGlkLiAgSWYgdGhlIElGRl9CUk9BRENBU1QKKyAgICAgICBiaXQgaXMgc2V0IGluIGBpZmFfZmxhZ3MnLCB0aGVuIGBpZmFfYnJvYWRhZGRyJyBpcyB2YWxpZC4gIElmIHRoZQorICAgICAgIElGRl9QT0lOVE9QT0lOVCBiaXQgaXMgc2V0LCB0aGVuIGBpZmFfZHN0YWRkcicgaXMgdmFsaWQuCisgICAgICAgSXQgaXMgbmV2ZXIgdGhlIGNhc2UgdGhhdCBib3RoIHRoZXNlIGJpdHMgYXJlIHNldCBhdCBvbmNlLiAgKi8KKyAgICBzdHJ1Y3Qgc29ja2FkZHIgKmlmdV9icm9hZGFkZHI7IC8qIEJyb2FkY2FzdCBhZGRyZXNzIG9mIHRoaXMgaW50ZXJmYWNlLiAqLworICAgIHN0cnVjdCBzb2NrYWRkciAqaWZ1X2RzdGFkZHI7IC8qIFBvaW50LXRvLXBvaW50IGRlc3RpbmF0aW9uIGFkZHJlc3MuICAqLworICB9IGlmYV9pZnU7CisgIC8qIFRoZXNlIHZlcnkgc2FtZSBtYWNyb3MgYXJlIGRlZmluZWQgYnkgPG5ldC9pZi5oPiBmb3IgYHN0cnVjdCBpZmFkZHInLgorICAgICBTbyBpZiB0aGV5IGFyZSBkZWZpbmVkIGFscmVhZHksIHRoZSBleGlzdGluZyBkZWZpbml0aW9ucyB3aWxsIGJlIGZpbmUuICAqLworIyBpZm5kZWYgaWZhX2Jyb2FkYWRkcgorIyAgZGVmaW5lIGlmYV9icm9hZGFkZHIJaWZhX2lmdS5pZnVfYnJvYWRhZGRyCisjIGVuZGlmCisjIGlmbmRlZiBpZmFfZHN0YWRkcgorIyAgZGVmaW5lIGlmYV9kc3RhZGRyCWlmYV9pZnUuaWZ1X2RzdGFkZHIKKyMgZW5kaWYKKworICB2b2lkICppZmFfZGF0YTsJCS8qIEFkZHJlc3Mtc3BlY2lmaWMgZGF0YSAobWF5IGJlIHVudXNlZCkuICAqLworfTsKKworCisvKiBDcmVhdGUgYSBsaW5rZWQgbGlzdCBvZiBgc3RydWN0IGlmYWRkcnMnIHN0cnVjdHVyZXMsIG9uZSBmb3IgZWFjaAorICAgbmV0d29yayBpbnRlcmZhY2Ugb24gdGhlIGhvc3QgbWFjaGluZS4gIElmIHN1Y2Nlc3NmdWwsIHN0b3JlIHRoZQorICAgbGlzdCBpbiAqSUZBUCBhbmQgcmV0dXJuIDAuICBPbiBlcnJvcnMsIHJldHVybiAtMSBhbmQgc2V0IGBlcnJubycuCisKKyAgIFRoZSBzdG9yYWdlIHJldHVybmVkIGluICpJRkFQIGlzIGFsbG9jYXRlZCBkeW5hbWljYWxseSBhbmQgY2FuCisgICBvbmx5IGJlIHByb3Blcmx5IGZyZWVkIGJ5IHBhc3NpbmcgaXQgdG8gYGZyZWVpZmFkZHJzJy4gICovCitleHRlcm4gaW50IGdldGlmYWRkcnMgKHN0cnVjdCBpZmFkZHJzICoqX19pZmFwKSBfX1RIUk9XOworCisvKiBSZWNsYWltIHRoZSBzdG9yYWdlIGFsbG9jYXRlZCBieSBhIHByZXZpb3VzIGBnZXRpZmFkZHJzJyBjYWxsLiAgKi8KK2V4dGVybiB2b2lkIGZyZWVpZmFkZHJzIChzdHJ1Y3QgaWZhZGRycyAqX19pZmEpICBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogaWZhZGRycy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2ludHR5cGVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2ludHR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwZmZmYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaW50dHlwZXMuaApAQCAtMCwwICsxLDQ0NCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LTIwMDEsIDIwMDQsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglJU08gQzk5OiA3LjggRm9ybWF0IGNvbnZlcnNpb24gb2YgaW50ZWdlciB0eXBlcwk8aW50dHlwZXMuaD4KKyAqLworCisjaWZuZGVmIF9JTlRUWVBFU19ICisjZGVmaW5lIF9JTlRUWVBFU19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisvKiBHZXQgdGhlIHR5cGUgZGVmaW5pdGlvbnMuICAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBHZXQgYSBkZWZpbml0aW9uIGZvciB3Y2hhcl90LiAgQnV0IHdlIG11c3Qgbm90IGRlZmluZSB3Y2hhcl90IGl0c2VsZi4gICovCisjaWZuZGVmIF9fX19nd2NoYXJfdF9kZWZpbmVkCisjIGlmZGVmIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgX19nd2NoYXJfdCB3Y2hhcl90CisjIGVsaWYgZGVmaW5lZCBfX1dDSEFSX1RZUEVfXwordHlwZWRlZiBfX1dDSEFSX1RZUEVfXyBfX2d3Y2hhcl90OworIyBlbHNlCisjICBkZWZpbmUgX19uZWVkX3djaGFyX3QKKyMgIGluY2x1ZGUgPHN0ZGRlZi5oPgordHlwZWRlZiB3Y2hhcl90IF9fZ3djaGFyX3Q7CisjIGVuZGlmCisjIGRlZmluZSBfX19fZ3djaGFyX3RfZGVmaW5lZAkxCisjZW5kaWYKKworCisvKiBUaGUgSVNPIEM5OSBzdGFuZGFyZCBzcGVjaWZpZXMgdGhhdCB0aGVzZSBtYWNyb3MgbXVzdCBvbmx5IGJlCisgICBkZWZpbmVkIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiAgKi8KKyNpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9fU1REQ19GT1JNQVRfTUFDUk9TCisKKyMgaWYgX19XT1JEU0laRSA9PSA2NAorIyAgZGVmaW5lIF9fUFJJNjRfUFJFRklYCSJsIgorIyAgZGVmaW5lIF9fUFJJUFRSX1BSRUZJWAkibCIKKyMgZWxzZQorIyAgZGVmaW5lIF9fUFJJNjRfUFJFRklYCSJsbCIKKyMgIGRlZmluZSBfX1BSSVBUUl9QUkVGSVgKKyMgZW5kaWYKKworLyogTWFjcm9zIGZvciBwcmludGluZyBmb3JtYXQgc3BlY2lmaWVycy4gICovCisKKy8qIERlY2ltYWwgbm90YXRpb24uICAqLworIyBkZWZpbmUgUFJJZDgJCSJkIgorIyBkZWZpbmUgUFJJZDE2CQkiZCIKKyMgZGVmaW5lIFBSSWQzMgkJImQiCisjIGRlZmluZSBQUklkNjQJCV9fUFJJNjRfUFJFRklYICJkIgorCisjIGRlZmluZSBQUklkTEVBU1Q4CSJkIgorIyBkZWZpbmUgUFJJZExFQVNUMTYJImQiCisjIGRlZmluZSBQUklkTEVBU1QzMgkiZCIKKyMgZGVmaW5lIFBSSWRMRUFTVDY0CV9fUFJJNjRfUFJFRklYICJkIgorCisjIGRlZmluZSBQUklkRkFTVDgJImQiCisjIGRlZmluZSBQUklkRkFTVDE2CV9fUFJJUFRSX1BSRUZJWCAiZCIKKyMgZGVmaW5lIFBSSWRGQVNUMzIJX19QUklQVFJfUFJFRklYICJkIgorIyBkZWZpbmUgUFJJZEZBU1Q2NAlfX1BSSTY0X1BSRUZJWCAiZCIKKworCisjIGRlZmluZSBQUklpOAkJImkiCisjIGRlZmluZSBQUklpMTYJCSJpIgorIyBkZWZpbmUgUFJJaTMyCQkiaSIKKyMgZGVmaW5lIFBSSWk2NAkJX19QUkk2NF9QUkVGSVggImkiCisKKyMgZGVmaW5lIFBSSWlMRUFTVDgJImkiCisjIGRlZmluZSBQUklpTEVBU1QxNgkiaSIKKyMgZGVmaW5lIFBSSWlMRUFTVDMyCSJpIgorIyBkZWZpbmUgUFJJaUxFQVNUNjQJX19QUkk2NF9QUkVGSVggImkiCisKKyMgZGVmaW5lIFBSSWlGQVNUOAkiaSIKKyMgZGVmaW5lIFBSSWlGQVNUMTYJX19QUklQVFJfUFJFRklYICJpIgorIyBkZWZpbmUgUFJJaUZBU1QzMglfX1BSSVBUUl9QUkVGSVggImkiCisjIGRlZmluZSBQUklpRkFTVDY0CV9fUFJJNjRfUFJFRklYICJpIgorCisvKiBPY3RhbCBub3RhdGlvbi4gICovCisjIGRlZmluZSBQUklvOAkJIm8iCisjIGRlZmluZSBQUklvMTYJCSJvIgorIyBkZWZpbmUgUFJJbzMyCQkibyIKKyMgZGVmaW5lIFBSSW82NAkJX19QUkk2NF9QUkVGSVggIm8iCisKKyMgZGVmaW5lIFBSSW9MRUFTVDgJIm8iCisjIGRlZmluZSBQUklvTEVBU1QxNgkibyIKKyMgZGVmaW5lIFBSSW9MRUFTVDMyCSJvIgorIyBkZWZpbmUgUFJJb0xFQVNUNjQJX19QUkk2NF9QUkVGSVggIm8iCisKKyMgZGVmaW5lIFBSSW9GQVNUOAkibyIKKyMgZGVmaW5lIFBSSW9GQVNUMTYJX19QUklQVFJfUFJFRklYICJvIgorIyBkZWZpbmUgUFJJb0ZBU1QzMglfX1BSSVBUUl9QUkVGSVggIm8iCisjIGRlZmluZSBQUklvRkFTVDY0CV9fUFJJNjRfUFJFRklYICJvIgorCisvKiBVbnNpZ25lZCBpbnRlZ2Vycy4gICovCisjIGRlZmluZSBQUkl1OAkJInUiCisjIGRlZmluZSBQUkl1MTYJCSJ1IgorIyBkZWZpbmUgUFJJdTMyCQkidSIKKyMgZGVmaW5lIFBSSXU2NAkJX19QUkk2NF9QUkVGSVggInUiCisKKyMgZGVmaW5lIFBSSXVMRUFTVDgJInUiCisjIGRlZmluZSBQUkl1TEVBU1QxNgkidSIKKyMgZGVmaW5lIFBSSXVMRUFTVDMyCSJ1IgorIyBkZWZpbmUgUFJJdUxFQVNUNjQJX19QUkk2NF9QUkVGSVggInUiCisKKyMgZGVmaW5lIFBSSXVGQVNUOAkidSIKKyMgZGVmaW5lIFBSSXVGQVNUMTYJX19QUklQVFJfUFJFRklYICJ1IgorIyBkZWZpbmUgUFJJdUZBU1QzMglfX1BSSVBUUl9QUkVGSVggInUiCisjIGRlZmluZSBQUkl1RkFTVDY0CV9fUFJJNjRfUFJFRklYICJ1IgorCisvKiBsb3dlcmNhc2UgaGV4YWRlY2ltYWwgbm90YXRpb24uICAqLworIyBkZWZpbmUgUFJJeDgJCSJ4IgorIyBkZWZpbmUgUFJJeDE2CQkieCIKKyMgZGVmaW5lIFBSSXgzMgkJIngiCisjIGRlZmluZSBQUkl4NjQJCV9fUFJJNjRfUFJFRklYICJ4IgorCisjIGRlZmluZSBQUkl4TEVBU1Q4CSJ4IgorIyBkZWZpbmUgUFJJeExFQVNUMTYJIngiCisjIGRlZmluZSBQUkl4TEVBU1QzMgkieCIKKyMgZGVmaW5lIFBSSXhMRUFTVDY0CV9fUFJJNjRfUFJFRklYICJ4IgorCisjIGRlZmluZSBQUkl4RkFTVDgJIngiCisjIGRlZmluZSBQUkl4RkFTVDE2CV9fUFJJUFRSX1BSRUZJWCAieCIKKyMgZGVmaW5lIFBSSXhGQVNUMzIJX19QUklQVFJfUFJFRklYICJ4IgorIyBkZWZpbmUgUFJJeEZBU1Q2NAlfX1BSSTY0X1BSRUZJWCAieCIKKworLyogVVBQRVJDQVNFIGhleGFkZWNpbWFsIG5vdGF0aW9uLiAgKi8KKyMgZGVmaW5lIFBSSVg4CQkiWCIKKyMgZGVmaW5lIFBSSVgxNgkJIlgiCisjIGRlZmluZSBQUklYMzIJCSJYIgorIyBkZWZpbmUgUFJJWDY0CQlfX1BSSTY0X1BSRUZJWCAiWCIKKworIyBkZWZpbmUgUFJJWExFQVNUOAkiWCIKKyMgZGVmaW5lIFBSSVhMRUFTVDE2CSJYIgorIyBkZWZpbmUgUFJJWExFQVNUMzIJIlgiCisjIGRlZmluZSBQUklYTEVBU1Q2NAlfX1BSSTY0X1BSRUZJWCAiWCIKKworIyBkZWZpbmUgUFJJWEZBU1Q4CSJYIgorIyBkZWZpbmUgUFJJWEZBU1QxNglfX1BSSVBUUl9QUkVGSVggIlgiCisjIGRlZmluZSBQUklYRkFTVDMyCV9fUFJJUFRSX1BSRUZJWCAiWCIKKyMgZGVmaW5lIFBSSVhGQVNUNjQJX19QUkk2NF9QUkVGSVggIlgiCisKKworLyogTWFjcm9zIGZvciBwcmludGluZyBgaW50bWF4X3QnIGFuZCBgdWludG1heF90Jy4gICovCisjIGRlZmluZSBQUklkTUFYCV9fUFJJNjRfUFJFRklYICJkIgorIyBkZWZpbmUgUFJJaU1BWAlfX1BSSTY0X1BSRUZJWCAiaSIKKyMgZGVmaW5lIFBSSW9NQVgJX19QUkk2NF9QUkVGSVggIm8iCisjIGRlZmluZSBQUkl1TUFYCV9fUFJJNjRfUFJFRklYICJ1IgorIyBkZWZpbmUgUFJJeE1BWAlfX1BSSTY0X1BSRUZJWCAieCIKKyMgZGVmaW5lIFBSSVhNQVgJX19QUkk2NF9QUkVGSVggIlgiCisKKworLyogTWFjcm9zIGZvciBwcmludGluZyBgaW50cHRyX3QnIGFuZCBgdWludHB0cl90Jy4gICovCisjIGRlZmluZSBQUklkUFRSCV9fUFJJUFRSX1BSRUZJWCAiZCIKKyMgZGVmaW5lIFBSSWlQVFIJX19QUklQVFJfUFJFRklYICJpIgorIyBkZWZpbmUgUFJJb1BUUglfX1BSSVBUUl9QUkVGSVggIm8iCisjIGRlZmluZSBQUkl1UFRSCV9fUFJJUFRSX1BSRUZJWCAidSIKKyMgZGVmaW5lIFBSSXhQVFIJX19QUklQVFJfUFJFRklYICJ4IgorIyBkZWZpbmUgUFJJWFBUUglfX1BSSVBUUl9QUkVGSVggIlgiCisKKworLyogTWFjcm9zIGZvciBzY2FubmluZyBmb3JtYXQgc3BlY2lmaWVycy4gICovCisKKy8qIFNpZ25lZCBkZWNpbWFsIG5vdGF0aW9uLiAgKi8KKyMgZGVmaW5lIFNDTmQ4CQkiaGhkIgorIyBkZWZpbmUgU0NOZDE2CQkiaGQiCisjIGRlZmluZSBTQ05kMzIJCSJkIgorIyBkZWZpbmUgU0NOZDY0CQlfX1BSSTY0X1BSRUZJWCAiZCIKKworIyBkZWZpbmUgU0NOZExFQVNUOAkiaGhkIgorIyBkZWZpbmUgU0NOZExFQVNUMTYJImhkIgorIyBkZWZpbmUgU0NOZExFQVNUMzIJImQiCisjIGRlZmluZSBTQ05kTEVBU1Q2NAlfX1BSSTY0X1BSRUZJWCAiZCIKKworIyBkZWZpbmUgU0NOZEZBU1Q4CSJoaGQiCisjIGRlZmluZSBTQ05kRkFTVDE2CV9fUFJJUFRSX1BSRUZJWCAiZCIKKyMgZGVmaW5lIFNDTmRGQVNUMzIJX19QUklQVFJfUFJFRklYICJkIgorIyBkZWZpbmUgU0NOZEZBU1Q2NAlfX1BSSTY0X1BSRUZJWCAiZCIKKworLyogU2lnbmVkIGRlY2ltYWwgbm90YXRpb24uICAqLworIyBkZWZpbmUgU0NOaTgJCSJoaGkiCisjIGRlZmluZSBTQ05pMTYJCSJoaSIKKyMgZGVmaW5lIFNDTmkzMgkJImkiCisjIGRlZmluZSBTQ05pNjQJCV9fUFJJNjRfUFJFRklYICJpIgorCisjIGRlZmluZSBTQ05pTEVBU1Q4CSJoaGkiCisjIGRlZmluZSBTQ05pTEVBU1QxNgkiaGkiCisjIGRlZmluZSBTQ05pTEVBU1QzMgkiaSIKKyMgZGVmaW5lIFNDTmlMRUFTVDY0CV9fUFJJNjRfUFJFRklYICJpIgorCisjIGRlZmluZSBTQ05pRkFTVDgJImhoaSIKKyMgZGVmaW5lIFNDTmlGQVNUMTYJX19QUklQVFJfUFJFRklYICJpIgorIyBkZWZpbmUgU0NOaUZBU1QzMglfX1BSSVBUUl9QUkVGSVggImkiCisjIGRlZmluZSBTQ05pRkFTVDY0CV9fUFJJNjRfUFJFRklYICJpIgorCisvKiBVbnNpZ25lZCBkZWNpbWFsIG5vdGF0aW9uLiAgKi8KKyMgZGVmaW5lIFNDTnU4CQkiaGh1IgorIyBkZWZpbmUgU0NOdTE2CQkiaHUiCisjIGRlZmluZSBTQ051MzIJCSJ1IgorIyBkZWZpbmUgU0NOdTY0CQlfX1BSSTY0X1BSRUZJWCAidSIKKworIyBkZWZpbmUgU0NOdUxFQVNUOAkiaGh1IgorIyBkZWZpbmUgU0NOdUxFQVNUMTYJImh1IgorIyBkZWZpbmUgU0NOdUxFQVNUMzIJInUiCisjIGRlZmluZSBTQ051TEVBU1Q2NAlfX1BSSTY0X1BSRUZJWCAidSIKKworIyBkZWZpbmUgU0NOdUZBU1Q4CSJoaHUiCisjIGRlZmluZSBTQ051RkFTVDE2CV9fUFJJUFRSX1BSRUZJWCAidSIKKyMgZGVmaW5lIFNDTnVGQVNUMzIJX19QUklQVFJfUFJFRklYICJ1IgorIyBkZWZpbmUgU0NOdUZBU1Q2NAlfX1BSSTY0X1BSRUZJWCAidSIKKworLyogT2N0YWwgbm90YXRpb24uICAqLworIyBkZWZpbmUgU0NObzgJCSJoaG8iCisjIGRlZmluZSBTQ05vMTYJCSJobyIKKyMgZGVmaW5lIFNDTm8zMgkJIm8iCisjIGRlZmluZSBTQ05vNjQJCV9fUFJJNjRfUFJFRklYICJvIgorCisjIGRlZmluZSBTQ05vTEVBU1Q4CSJoaG8iCisjIGRlZmluZSBTQ05vTEVBU1QxNgkiaG8iCisjIGRlZmluZSBTQ05vTEVBU1QzMgkibyIKKyMgZGVmaW5lIFNDTm9MRUFTVDY0CV9fUFJJNjRfUFJFRklYICJvIgorCisjIGRlZmluZSBTQ05vRkFTVDgJImhobyIKKyMgZGVmaW5lIFNDTm9GQVNUMTYJX19QUklQVFJfUFJFRklYICJvIgorIyBkZWZpbmUgU0NOb0ZBU1QzMglfX1BSSVBUUl9QUkVGSVggIm8iCisjIGRlZmluZSBTQ05vRkFTVDY0CV9fUFJJNjRfUFJFRklYICJvIgorCisvKiBIZXhhZGVjaW1hbCBub3RhdGlvbi4gICovCisjIGRlZmluZSBTQ054OAkJImhoeCIKKyMgZGVmaW5lIFNDTngxNgkJImh4IgorIyBkZWZpbmUgU0NOeDMyCQkieCIKKyMgZGVmaW5lIFNDTng2NAkJX19QUkk2NF9QUkVGSVggIngiCisKKyMgZGVmaW5lIFNDTnhMRUFTVDgJImhoeCIKKyMgZGVmaW5lIFNDTnhMRUFTVDE2CSJoeCIKKyMgZGVmaW5lIFNDTnhMRUFTVDMyCSJ4IgorIyBkZWZpbmUgU0NOeExFQVNUNjQJX19QUkk2NF9QUkVGSVggIngiCisKKyMgZGVmaW5lIFNDTnhGQVNUOAkiaGh4IgorIyBkZWZpbmUgU0NOeEZBU1QxNglfX1BSSVBUUl9QUkVGSVggIngiCisjIGRlZmluZSBTQ054RkFTVDMyCV9fUFJJUFRSX1BSRUZJWCAieCIKKyMgZGVmaW5lIFNDTnhGQVNUNjQJX19QUkk2NF9QUkVGSVggIngiCisKKworLyogTWFjcm9zIGZvciBzY2FubmluZyBgaW50bWF4X3QnIGFuZCBgdWludG1heF90Jy4gICovCisjIGRlZmluZSBTQ05kTUFYCV9fUFJJNjRfUFJFRklYICJkIgorIyBkZWZpbmUgU0NOaU1BWAlfX1BSSTY0X1BSRUZJWCAiaSIKKyMgZGVmaW5lIFNDTm9NQVgJX19QUkk2NF9QUkVGSVggIm8iCisjIGRlZmluZSBTQ051TUFYCV9fUFJJNjRfUFJFRklYICJ1IgorIyBkZWZpbmUgU0NOeE1BWAlfX1BSSTY0X1BSRUZJWCAieCIKKworLyogTWFjcm9zIGZvciBzY2FuaW5nIGBpbnRwdHJfdCcgYW5kIGB1aW50cHRyX3QnLiAgKi8KKyMgZGVmaW5lIFNDTmRQVFIJX19QUklQVFJfUFJFRklYICJkIgorIyBkZWZpbmUgU0NOaVBUUglfX1BSSVBUUl9QUkVGSVggImkiCisjIGRlZmluZSBTQ05vUFRSCV9fUFJJUFRSX1BSRUZJWCAibyIKKyMgZGVmaW5lIFNDTnVQVFIJX19QUklQVFJfUFJFRklYICJ1IgorIyBkZWZpbmUgU0NOeFBUUglfX1BSSVBUUl9QUkVGSVggIngiCisKKyNlbmRpZgkvKiBDKysgJiYgZm9ybWF0IG1hY3JvcyAqLworCisKK19fQkVHSU5fREVDTFMKKworI2lmIF9fV09SRFNJWkUgPT0gNjQKKworLyogV2UgaGF2ZSB0byBkZWZpbmUgdGhlIGB1aW50bWF4X3QnIHR5cGUgdXNpbmcgYGxkaXZfdCcuICAqLwordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIGxvbmcgaW50IHF1b3Q7CQkvKiBRdW90aWVudC4gICovCisgICAgbG9uZyBpbnQgcmVtOwkJLyogUmVtYWluZGVyLiAgKi8KKyAgfSBpbWF4ZGl2X3Q7CisKKyNlbHNlCisKKy8qIFdlIGhhdmUgdG8gZGVmaW5lIHRoZSBgdWludG1heF90JyB0eXBlIHVzaW5nIGBsbGRpdl90Jy4gICovCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgbG9uZyBsb25nIGludCBxdW90OwkJLyogUXVvdGllbnQuICAqLworICAgIGxvbmcgbG9uZyBpbnQgcmVtOwkJLyogUmVtYWluZGVyLiAgKi8KKyAgfSBpbWF4ZGl2X3Q7CisKKyNlbmRpZgorCisKKy8qIENvbXB1dGUgYWJzb2x1dGUgdmFsdWUgb2YgTi4gICovCitleHRlcm4gaW50bWF4X3QgaW1heGFicyAoaW50bWF4X3QgX19uKSBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworLyogUmV0dXJuIHRoZSBgaW1heGRpdl90JyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUgb2YgTlVNRVIgb3ZlciBERU5PTS4gKi8KK2V4dGVybiBpbWF4ZGl2X3QgaW1heGRpdiAoaW50bWF4X3QgX19udW1lciwgaW50bWF4X3QgX19kZW5vbSkKKyAgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisvKiBMaWtlIGBzdHJ0b2wnIGJ1dCBjb252ZXJ0IHRvIGBpbnRtYXhfdCcuICAqLworZXh0ZXJuIGludG1heF90IHN0cnRvaW1heCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCSAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlKSBfX1RIUk9XOworCisvKiBMaWtlIGBzdHJ0b3VsJyBidXQgY29udmVydCB0byBgdWludG1heF90Jy4gICovCitleHRlcm4gdWludG1heF90IHN0cnRvdW1heCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCSAgICBjaGFyICoqIF9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpIF9fVEhST1c7CisKKy8qIExpa2UgYHdjc3RvbCcgYnV0IGNvbnZlcnQgdG8gYGludG1heF90Jy4gICovCitleHRlcm4gaW50bWF4X3Qgd2NzdG9pbWF4IChfX2NvbnN0IF9fZ3djaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJICAgX19nd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpCisgICAgIF9fVEhST1c7CisKKy8qIExpa2UgYHdjc3RvdWwnIGJ1dCBjb252ZXJ0IHRvIGB1aW50bWF4X3QnLiAgKi8KK2V4dGVybiB1aW50bWF4X3Qgd2NzdG91bWF4IChfX2NvbnN0IF9fZ3djaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJICAgIF9fZ3djaGFyX3QgKiogX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSkKKyAgICAgX19USFJPVzsKKworI2lmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCisKKyMgaWYgX19XT1JEU0laRSA9PSA2NAorCitleHRlcm4gbG9uZyBpbnQgX19zdHJ0b2xfaW50ZXJuYWwgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCQkJICAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCisJCQkJICAgaW50IF9fYmFzZSwgaW50IF9fZ3JvdXApCisgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworLyogTGlrZSBgc3RydG9sJyBidXQgY29udmVydCB0byBgaW50bWF4X3QnLiAgKi8KK19fZXh0ZXJuX2lubGluZSBpbnRtYXhfdAorX19OVEggKHN0cnRvaW1heCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IG5wdHIsIGNoYXIgKipfX3Jlc3RyaWN0IGVuZHB0ciwKKwkJICBpbnQgYmFzZSkpCit7CisgIHJldHVybiBfX3N0cnRvbF9pbnRlcm5hbCAobnB0ciwgZW5kcHRyLCBiYXNlLCAwKTsKK30KKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IF9fc3RydG91bF9pbnRlcm5hbCAoX19jb25zdCBjaGFyICoKKwkJCQkJICAgICBfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQkJICAgICBjaGFyICoqIF9fcmVzdHJpY3QgX19lbmRwdHIsCisJCQkJCSAgICAgaW50IF9fYmFzZSwgaW50IF9fZ3JvdXApCisgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworLyogTGlrZSBgc3RydG91bCcgYnV0IGNvbnZlcnQgdG8gYHVpbnRtYXhfdCcuICAqLworX19leHRlcm5faW5saW5lIHVpbnRtYXhfdAorX19OVEggKHN0cnRvdW1heCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IG5wdHIsIGNoYXIgKipfX3Jlc3RyaWN0IGVuZHB0ciwKKwkJICBpbnQgYmFzZSkpCit7CisgIHJldHVybiBfX3N0cnRvdWxfaW50ZXJuYWwgKG5wdHIsIGVuZHB0ciwgYmFzZSwgMCk7Cit9CisKK2V4dGVybiBsb25nIGludCBfX3djc3RvbF9pbnRlcm5hbCAoX19jb25zdCBfX2d3Y2hhcl90ICogX19yZXN0cmljdCBfX25wdHIsCisJCQkJICAgX19nd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCisJCQkJICAgaW50IF9fYmFzZSwgaW50IF9fZ3JvdXApCisgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworLyogTGlrZSBgd2NzdG9sJyBidXQgY29udmVydCB0byBgaW50bWF4X3QnLiAgKi8KK19fZXh0ZXJuX2lubGluZSBpbnRtYXhfdAorX19OVEggKHdjc3RvaW1heCAoX19jb25zdCBfX2d3Y2hhcl90ICpfX3Jlc3RyaWN0IG5wdHIsCisJCSAgX19nd2NoYXJfdCAqKl9fcmVzdHJpY3QgZW5kcHRyLCBpbnQgYmFzZSkpCit7CisgIHJldHVybiBfX3djc3RvbF9pbnRlcm5hbCAobnB0ciwgZW5kcHRyLCBiYXNlLCAwKTsKK30KKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IF9fd2NzdG91bF9pbnRlcm5hbCAoX19jb25zdCBfX2d3Y2hhcl90ICoKKwkJCQkJICAgICBfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQkJICAgICBfX2d3Y2hhcl90ICoqCisJCQkJCSAgICAgX19yZXN0cmljdCBfX2VuZHB0ciwKKwkJCQkJICAgICBpbnQgX19iYXNlLCBpbnQgX19ncm91cCkKKyAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisvKiBMaWtlIGB3Y3N0b3VsJyBidXQgY29udmVydCB0byBgdWludG1heF90Jy4gICovCitfX2V4dGVybl9pbmxpbmUgdWludG1heF90CitfX05USCAod2NzdG91bWF4IChfX2NvbnN0IF9fZ3djaGFyX3QgKl9fcmVzdHJpY3QgbnB0ciwKKwkJICBfX2d3Y2hhcl90ICoqX19yZXN0cmljdCBlbmRwdHIsIGludCBiYXNlKSkKK3sKKyAgcmV0dXJuIF9fd2NzdG91bF9pbnRlcm5hbCAobnB0ciwgZW5kcHRyLCBiYXNlLCAwKTsKK30KKworIyBlbHNlIC8qIF9fV09SRFNJWkUgPT0gMzIgKi8KKworX19leHRlbnNpb25fXworZXh0ZXJuIGxvbmcgbG9uZyBpbnQgX19zdHJ0b2xsX2ludGVybmFsIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJCQkgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCisJCQkJCSBpbnQgX19iYXNlLCBpbnQgX19ncm91cCkKKyAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisvKiBMaWtlIGBzdHJ0b2wnIGJ1dCBjb252ZXJ0IHRvIGBpbnRtYXhfdCcuICAqLworX19leHRlcm5faW5saW5lIGludG1heF90CitfX05USCAoc3RydG9pbWF4IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgbnB0ciwgY2hhciAqKl9fcmVzdHJpY3QgZW5kcHRyLAorCQkgIGludCBiYXNlKSkKK3sKKyAgcmV0dXJuIF9fc3RydG9sbF9pbnRlcm5hbCAobnB0ciwgZW5kcHRyLCBiYXNlLCAwKTsKK30KKworX19leHRlbnNpb25fXworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX19zdHJ0b3VsbF9pbnRlcm5hbCAoX19jb25zdCBjaGFyICoKKwkJCQkJCSAgIF9fcmVzdHJpY3QgX19ucHRyLAorCQkJCQkJICAgY2hhciAqKgorCQkJCQkJICAgX19yZXN0cmljdCBfX2VuZHB0ciwKKwkJCQkJCSAgIGludCBfX2Jhc2UsCisJCQkJCQkgICBpbnQgX19ncm91cCkKKyAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisvKiBMaWtlIGBzdHJ0b3VsJyBidXQgY29udmVydCB0byBgdWludG1heF90Jy4gICovCitfX2V4dGVybl9pbmxpbmUgdWludG1heF90CitfX05USCAoc3RydG91bWF4IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgbnB0ciwgY2hhciAqKl9fcmVzdHJpY3QgZW5kcHRyLAorCQkgIGludCBiYXNlKSkKK3sKKyAgcmV0dXJuIF9fc3RydG91bGxfaW50ZXJuYWwgKG5wdHIsIGVuZHB0ciwgYmFzZSwgMCk7Cit9CisKK19fZXh0ZW5zaW9uX18KK2V4dGVybiBsb25nIGxvbmcgaW50IF9fd2NzdG9sbF9pbnRlcm5hbCAoX19jb25zdCBfX2d3Y2hhcl90ICoKKwkJCQkJIF9fcmVzdHJpY3QgX19ucHRyLAorCQkJCQkgX19nd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCisJCQkJCSBpbnQgX19iYXNlLCBpbnQgX19ncm91cCkKKyAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisvKiBMaWtlIGB3Y3N0b2wnIGJ1dCBjb252ZXJ0IHRvIGBpbnRtYXhfdCcuICAqLworX19leHRlcm5faW5saW5lIGludG1heF90CitfX05USCAod2NzdG9pbWF4IChfX2NvbnN0IF9fZ3djaGFyX3QgKl9fcmVzdHJpY3QgbnB0ciwKKwkJICBfX2d3Y2hhcl90ICoqX19yZXN0cmljdCBlbmRwdHIsIGludCBiYXNlKSkKK3sKKyAgcmV0dXJuIF9fd2NzdG9sbF9pbnRlcm5hbCAobnB0ciwgZW5kcHRyLCBiYXNlLCAwKTsKK30KKworCitfX2V4dGVuc2lvbl9fCitleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIGludCBfX3djc3RvdWxsX2ludGVybmFsIChfX2NvbnN0IF9fZ3djaGFyX3QgKgorCQkJCQkJICAgX19yZXN0cmljdCBfX25wdHIsCisJCQkJCQkgICBfX2d3Y2hhcl90ICoqCisJCQkJCQkgICBfX3Jlc3RyaWN0IF9fZW5kcHRyLAorCQkJCQkJICAgaW50IF9fYmFzZSwKKwkJCQkJCSAgIGludCBfX2dyb3VwKQorICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKy8qIExpa2UgYHdjc3RvdWwnIGJ1dCBjb252ZXJ0IHRvIGB1aW50bWF4X3QnLiAgKi8KK19fZXh0ZXJuX2lubGluZSB1aW50bWF4X3QKK19fTlRIICh3Y3N0b3VtYXggKF9fY29uc3QgX19nd2NoYXJfdCAqX19yZXN0cmljdCBucHRyLAorCQkgIF9fZ3djaGFyX3QgKipfX3Jlc3RyaWN0IGVuZHB0ciwgaW50IGJhc2UpKQoreworICByZXR1cm4gX193Y3N0b3VsbF9pbnRlcm5hbCAobnB0ciwgZW5kcHRyLCBiYXNlLCAwKTsKK30KKworIyBlbmRpZgkvKiBfX1dPUkRTSVpFID09IDMyCSovCisjZW5kaWYJLyogVXNlIGV4dGVybiBpbmxpbmVzLiAgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGludHR5cGVzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGFuZ2luZm8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGFuZ2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTUzMzY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9sYW5naW5mby5oCkBAIC0wLDAgKzEsNjAwIEBACisvKiBBY2Nlc3MgdG8gbG9jYWxlLWRlcGVuZGVudCBwYXJhbWV0ZXJzLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIsMjAwMywyMDA0LDIwMDUsMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTEFOR0lORk9fSAorI2RlZmluZQlfTEFOR0lORk9fSCAxCisKKy8qIEdldCB0aGUgdHlwZSBkZWZpbml0aW9uLiAgKi8KKyNpbmNsdWRlIDxubF90eXBlcy5oPgorCisjaW5jbHVkZSA8Yml0cy9sb2NhbGUuaD4JLyogRGVmaW5lIHRoZSBfX0xDXyogY2F0ZWdvcnkgbmFtZXMuICAqLworCisKK19fQkVHSU5fREVDTFMKKworLyogQ29uc3RydWN0IGFuIGBubF9pdGVtJyB2YWx1ZSBmb3IgYG5sX2xhbmdpbmZvJyBmcm9tIGEgbG9jYWxlIGNhdGVnb3J5CisgICAoTENfKikgYW5kIGFuIGl0ZW0gaW5kZXggd2l0aGluIHRoZSBjYXRlZ29yeS4gIFNvbWUgY29kZSBtYXkgZGVwZW5kIG9uCisgICB0aGUgaXRlbSB2YWx1ZXMgd2l0aGluIGEgY2F0ZWdvcnkgaW5jcmVhc2luZyBtb25vdG9uaWNhbGx5IHdpdGggdGhlCisgICBpbmRpY2VzLiAgKi8KKyNkZWZpbmUgX05MX0lURU0oY2F0ZWdvcnksIGluZGV4KQkoKChjYXRlZ29yeSkgPDwgMTYpIHwgKGluZGV4KSkKKworLyogRXh0cmFjdCB0aGUgY2F0ZWdvcnkgYW5kIGl0ZW0gaW5kZXggZnJvbSBhIGNvbnN0cnVjdGVkIGBubF9pdGVtJyB2YWx1ZS4gICovCisjZGVmaW5lIF9OTF9JVEVNX0NBVEVHT1JZKGl0ZW0pCQkoKGludCkgKGl0ZW0pID4+IDE2KQorI2RlZmluZSBfTkxfSVRFTV9JTkRFWChpdGVtKQkJKChpbnQpIChpdGVtKSAmIDB4ZmZmZikKKworLyogRW51bWVyYXRpb24gb2YgbG9jYWxlIGl0ZW1zIHRoYXQgY2FuIGJlIHF1ZXJpZWQgd2l0aCBgbmxfbGFuZ2luZm8nLiAgKi8KK2VudW0KK3sKKyAgLyogTENfVElNRSBjYXRlZ29yeTogZGF0ZSBhbmQgdGltZSBmb3JtYXR0aW5nLiAgKi8KKworICAvKiBBYmJyZXZpYXRlZCBkYXlzIG9mIHRoZSB3ZWVrLiAqLworICBBQkRBWV8xID0gX05MX0lURU0gKF9fTENfVElNRSwgMCksIC8qIFN1biAqLworI2RlZmluZSBBQkRBWV8xCQkJQUJEQVlfMQorICBBQkRBWV8yLAorI2RlZmluZSBBQkRBWV8yCQkJQUJEQVlfMgorICBBQkRBWV8zLAorI2RlZmluZSBBQkRBWV8zCQkJQUJEQVlfMworICBBQkRBWV80LAorI2RlZmluZSBBQkRBWV80CQkJQUJEQVlfNAorICBBQkRBWV81LAorI2RlZmluZSBBQkRBWV81CQkJQUJEQVlfNQorICBBQkRBWV82LAorI2RlZmluZSBBQkRBWV82CQkJQUJEQVlfNgorICBBQkRBWV83LAorI2RlZmluZSBBQkRBWV83CQkJQUJEQVlfNworCisgIC8qIExvbmctbmFtZWQgZGF5cyBvZiB0aGUgd2Vlay4gKi8KKyAgREFZXzEsCQkJLyogU3VuZGF5ICovCisjZGVmaW5lIERBWV8xCQkJREFZXzEKKyAgREFZXzIsCQkJLyogTW9uZGF5ICovCisjZGVmaW5lIERBWV8yCQkJREFZXzIKKyAgREFZXzMsCQkJLyogVHVlc2RheSAqLworI2RlZmluZSBEQVlfMwkJCURBWV8zCisgIERBWV80LAkJCS8qIFdlZG5lc2RheSAqLworI2RlZmluZSBEQVlfNAkJCURBWV80CisgIERBWV81LAkJCS8qIFRodXJzZGF5ICovCisjZGVmaW5lIERBWV81CQkJREFZXzUKKyAgREFZXzYsCQkJLyogRnJpZGF5ICovCisjZGVmaW5lIERBWV82CQkJREFZXzYKKyAgREFZXzcsCQkJLyogU2F0dXJkYXkgKi8KKyNkZWZpbmUgREFZXzcJCQlEQVlfNworCisgIC8qIEFiYnJldmlhdGVkIG1vbnRoIG5hbWVzLiAgKi8KKyAgQUJNT05fMSwJCQkvKiBKYW4gKi8KKyNkZWZpbmUgQUJNT05fMQkJCUFCTU9OXzEKKyAgQUJNT05fMiwKKyNkZWZpbmUgQUJNT05fMgkJCUFCTU9OXzIKKyAgQUJNT05fMywKKyNkZWZpbmUgQUJNT05fMwkJCUFCTU9OXzMKKyAgQUJNT05fNCwKKyNkZWZpbmUgQUJNT05fNAkJCUFCTU9OXzQKKyAgQUJNT05fNSwKKyNkZWZpbmUgQUJNT05fNQkJCUFCTU9OXzUKKyAgQUJNT05fNiwKKyNkZWZpbmUgQUJNT05fNgkJCUFCTU9OXzYKKyAgQUJNT05fNywKKyNkZWZpbmUgQUJNT05fNwkJCUFCTU9OXzcKKyAgQUJNT05fOCwKKyNkZWZpbmUgQUJNT05fOAkJCUFCTU9OXzgKKyAgQUJNT05fOSwKKyNkZWZpbmUgQUJNT05fOQkJCUFCTU9OXzkKKyAgQUJNT05fMTAsCisjZGVmaW5lIEFCTU9OXzEwCQlBQk1PTl8xMAorICBBQk1PTl8xMSwKKyNkZWZpbmUgQUJNT05fMTEJCUFCTU9OXzExCisgIEFCTU9OXzEyLAorI2RlZmluZSBBQk1PTl8xMgkJQUJNT05fMTIKKworICAvKiBMb25nIG1vbnRoIG5hbWVzLiAgKi8KKyAgTU9OXzEsCQkJLyogSmFudWFyeSAqLworI2RlZmluZSBNT05fMQkJCU1PTl8xCisgIE1PTl8yLAorI2RlZmluZSBNT05fMgkJCU1PTl8yCisgIE1PTl8zLAorI2RlZmluZSBNT05fMwkJCU1PTl8zCisgIE1PTl80LAorI2RlZmluZSBNT05fNAkJCU1PTl80CisgIE1PTl81LAorI2RlZmluZSBNT05fNQkJCU1PTl81CisgIE1PTl82LAorI2RlZmluZSBNT05fNgkJCU1PTl82CisgIE1PTl83LAorI2RlZmluZSBNT05fNwkJCU1PTl83CisgIE1PTl84LAorI2RlZmluZSBNT05fOAkJCU1PTl84CisgIE1PTl85LAorI2RlZmluZSBNT05fOQkJCU1PTl85CisgIE1PTl8xMCwKKyNkZWZpbmUgTU9OXzEwCQkJTU9OXzEwCisgIE1PTl8xMSwKKyNkZWZpbmUgTU9OXzExCQkJTU9OXzExCisgIE1PTl8xMiwKKyNkZWZpbmUgTU9OXzEyCQkJTU9OXzEyCisKKyAgQU1fU1RSLAkJCS8qIEFudGUgbWVyaWRpZW0gc3RyaW5nLiAgKi8KKyNkZWZpbmUgQU1fU1RSCQkJQU1fU1RSCisgIFBNX1NUUiwJCQkvKiBQb3N0IG1lcmlkaWVtIHN0cmluZy4gICovCisjZGVmaW5lIFBNX1NUUgkJCVBNX1NUUgorCisgIERfVF9GTVQsCQkJLyogRGF0ZSBhbmQgdGltZSBmb3JtYXQgZm9yIHN0cmZ0aW1lLiAgKi8KKyNkZWZpbmUgRF9UX0ZNVAkJCURfVF9GTVQKKyAgRF9GTVQsCQkJLyogRGF0ZSBmb3JtYXQgZm9yIHN0cmZ0aW1lLiAgKi8KKyNkZWZpbmUgRF9GTVQJCQlEX0ZNVAorICBUX0ZNVCwJCQkvKiBUaW1lIGZvcm1hdCBmb3Igc3RyZnRpbWUuICAqLworI2RlZmluZSBUX0ZNVAkJCVRfRk1UCisgIFRfRk1UX0FNUE0sCQkJLyogMTItaG91ciB0aW1lIGZvcm1hdCBmb3Igc3RyZnRpbWUuICAqLworI2RlZmluZSBUX0ZNVF9BTVBNCQlUX0ZNVF9BTVBNCisKKyAgRVJBLAkJCQkvKiBBbHRlcm5hdGUgZXJhLiAgKi8KKyNkZWZpbmUgRVJBCQkJRVJBCisgIF9fRVJBX1lFQVIsCQkJLyogWWVhciBpbiBhbHRlcm5hdGUgZXJhIGZvcm1hdC4gICovCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBFUkFfWUVBUgkJX19FUkFfWUVBUgorI2VuZGlmCisgIEVSQV9EX0ZNVCwJCQkvKiBEYXRlIGluIGFsdGVybmF0ZSBlcmEgZm9ybWF0LiAgKi8KKyNkZWZpbmUgRVJBX0RfRk1UCQlFUkFfRF9GTVQKKyAgQUxUX0RJR0lUUywJCQkvKiBBbHRlcm5hdGUgc3ltYm9scyBmb3IgZGlnaXRzLiAgKi8KKyNkZWZpbmUgQUxUX0RJR0lUUwkJQUxUX0RJR0lUUworICBFUkFfRF9UX0ZNVCwJCQkvKiBEYXRlIGFuZCB0aW1lIGluIGFsdGVybmF0ZSBlcmEgZm9ybWF0LiAgKi8KKyNkZWZpbmUgRVJBX0RfVF9GTVQJCUVSQV9EX1RfRk1UCisgIEVSQV9UX0ZNVCwJCQkvKiBUaW1lIGluIGFsdGVybmF0ZSBlcmEgZm9ybWF0LiAgKi8KKyNkZWZpbmUgRVJBX1RfRk1UCQlFUkFfVF9GTVQKKworICBfTkxfVElNRV9FUkFfTlVNX0VOVFJJRVMsCS8qIE51bWJlciBlbnRyaWVzIGluIHRoZSBlcmEgYXJyYXlzLiAgKi8KKyAgX05MX1RJTUVfRVJBX0VOVFJJRVMsCQkvKiBTdHJ1Y3R1cmUgd2l0aCBlcmEgZW50cmllcyBpbiB1c2FibGUgZm9ybS4qLworCisgIF9OTF9XQUJEQVlfMSwJCS8qIFN1biAqLworICBfTkxfV0FCREFZXzIsCisgIF9OTF9XQUJEQVlfMywKKyAgX05MX1dBQkRBWV80LAorICBfTkxfV0FCREFZXzUsCisgIF9OTF9XQUJEQVlfNiwKKyAgX05MX1dBQkRBWV83LAorCisgIC8qIExvbmctbmFtZWQgZGF5cyBvZiB0aGUgd2Vlay4gKi8KKyAgX05MX1dEQVlfMSwJCS8qIFN1bmRheSAqLworICBfTkxfV0RBWV8yLAkJLyogTW9uZGF5ICovCisgIF9OTF9XREFZXzMsCQkvKiBUdWVzZGF5ICovCisgIF9OTF9XREFZXzQsCQkvKiBXZWRuZXNkYXkgKi8KKyAgX05MX1dEQVlfNSwJCS8qIFRodXJzZGF5ICovCisgIF9OTF9XREFZXzYsCQkvKiBGcmlkYXkgKi8KKyAgX05MX1dEQVlfNywJCS8qIFNhdHVyZGF5ICovCisKKyAgLyogQWJicmV2aWF0ZWQgbW9udGggbmFtZXMuICAqLworICBfTkxfV0FCTU9OXzEsCQkvKiBKYW4gKi8KKyAgX05MX1dBQk1PTl8yLAorICBfTkxfV0FCTU9OXzMsCisgIF9OTF9XQUJNT05fNCwKKyAgX05MX1dBQk1PTl81LAorICBfTkxfV0FCTU9OXzYsCisgIF9OTF9XQUJNT05fNywKKyAgX05MX1dBQk1PTl84LAorICBfTkxfV0FCTU9OXzksCisgIF9OTF9XQUJNT05fMTAsCisgIF9OTF9XQUJNT05fMTEsCisgIF9OTF9XQUJNT05fMTIsCisKKyAgLyogTG9uZyBtb250aCBuYW1lcy4gICovCisgIF9OTF9XTU9OXzEsCQkvKiBKYW51YXJ5ICovCisgIF9OTF9XTU9OXzIsCisgIF9OTF9XTU9OXzMsCisgIF9OTF9XTU9OXzQsCisgIF9OTF9XTU9OXzUsCisgIF9OTF9XTU9OXzYsCisgIF9OTF9XTU9OXzcsCisgIF9OTF9XTU9OXzgsCisgIF9OTF9XTU9OXzksCisgIF9OTF9XTU9OXzEwLAorICBfTkxfV01PTl8xMSwKKyAgX05MX1dNT05fMTIsCisKKyAgX05MX1dBTV9TVFIsCQkvKiBBbnRlIG1lcmlkaWVtIHN0cmluZy4gICovCisgIF9OTF9XUE1fU1RSLAkJLyogUG9zdCBtZXJpZGllbSBzdHJpbmcuICAqLworCisgIF9OTF9XRF9UX0ZNVCwJCS8qIERhdGUgYW5kIHRpbWUgZm9ybWF0IGZvciBzdHJmdGltZS4gICovCisgIF9OTF9XRF9GTVQsCQkvKiBEYXRlIGZvcm1hdCBmb3Igc3RyZnRpbWUuICAqLworICBfTkxfV1RfRk1ULAkJLyogVGltZSBmb3JtYXQgZm9yIHN0cmZ0aW1lLiAgKi8KKyAgX05MX1dUX0ZNVF9BTVBNLAkvKiAxMi1ob3VyIHRpbWUgZm9ybWF0IGZvciBzdHJmdGltZS4gICovCisKKyAgX05MX1dFUkFfWUVBUiwJLyogWWVhciBpbiBhbHRlcm5hdGUgZXJhIGZvcm1hdC4gICovCisgIF9OTF9XRVJBX0RfRk1ULAkvKiBEYXRlIGluIGFsdGVybmF0ZSBlcmEgZm9ybWF0LiAgKi8KKyAgX05MX1dBTFRfRElHSVRTLAkvKiBBbHRlcm5hdGUgc3ltYm9scyBmb3IgZGlnaXRzLiAgKi8KKyAgX05MX1dFUkFfRF9UX0ZNVCwJLyogRGF0ZSBhbmQgdGltZSBpbiBhbHRlcm5hdGUgZXJhIGZvcm1hdC4gICovCisgIF9OTF9XRVJBX1RfRk1ULAkvKiBUaW1lIGluIGFsdGVybmF0ZSBlcmEgZm9ybWF0LiAgKi8KKworICBfTkxfVElNRV9XRUVLX05EQVlTLAorICBfTkxfVElNRV9XRUVLXzFTVERBWSwKKyAgX05MX1RJTUVfV0VFS18xU1RXRUVLLAorICBfTkxfVElNRV9GSVJTVF9XRUVLREFZLAorICBfTkxfVElNRV9GSVJTVF9XT1JLREFZLAorICBfTkxfVElNRV9DQUxfRElSRUNUSU9OLAorICBfTkxfVElNRV9USU1FWk9ORSwKKworICBfREFURV9GTVQsCQkvKiBzdHJmdGltZSBmb3JtYXQgZm9yIGRhdGUuICAqLworI2RlZmluZSBfREFURV9GTVQJX0RBVEVfRk1UCisgIF9OTF9XX0RBVEVfRk1ULAorCisgIF9OTF9USU1FX0NPREVTRVQsCisKKyAgX05MX05VTV9MQ19USU1FLAkvKiBOdW1iZXIgb2YgaW5kaWNlcyBpbiBMQ19USU1FIGNhdGVnb3J5LiAgKi8KKworICAvKiBMQ19DT0xMQVRFIGNhdGVnb3J5OiB0ZXh0IHNvcnRpbmcuCisgICAgIFRoaXMgaW5mb3JtYXRpb24gaXMgYWNjZXNzZWQgYnkgdGhlIHN0cmNvbGwgYW5kIHN0cnhmcm0gZnVuY3Rpb25zLgorICAgICBUaGVzZSBgbmxfbGFuZ2luZm8nIG5hbWVzIGFyZSB1c2VkIG9ubHkgaW50ZXJuYWxseS4gICovCisgIF9OTF9DT0xMQVRFX05SVUxFUyA9IF9OTF9JVEVNIChfX0xDX0NPTExBVEUsIDApLAorICBfTkxfQ09MTEFURV9SVUxFU0VUUywKKyAgX05MX0NPTExBVEVfVEFCTEVNQiwKKyAgX05MX0NPTExBVEVfV0VJR0hUTUIsCisgIF9OTF9DT0xMQVRFX0VYVFJBTUIsCisgIF9OTF9DT0xMQVRFX0lORElSRUNUTUIsCisgIF9OTF9DT0xMQVRFX0dBUDEsCisgIF9OTF9DT0xMQVRFX0dBUDIsCisgIF9OTF9DT0xMQVRFX0dBUDMsCisgIF9OTF9DT0xMQVRFX1RBQkxFV0MsCisgIF9OTF9DT0xMQVRFX1dFSUdIVFdDLAorICBfTkxfQ09MTEFURV9FWFRSQVdDLAorICBfTkxfQ09MTEFURV9JTkRJUkVDVFdDLAorICBfTkxfQ09MTEFURV9TWU1CX0hBU0hfU0laRU1CLAorICBfTkxfQ09MTEFURV9TWU1CX1RBQkxFTUIsCisgIF9OTF9DT0xMQVRFX1NZTUJfRVhUUkFNQiwKKyAgX05MX0NPTExBVEVfQ09MTFNFUU1CLAorICBfTkxfQ09MTEFURV9DT0xMU0VRV0MsCisgIF9OTF9DT0xMQVRFX0NPREVTRVQsCisgIF9OTF9OVU1fTENfQ09MTEFURSwKKworICAvKiBMQ19DVFlQRSBjYXRlZ29yeTogY2hhcmFjdGVyIGNsYXNzaWZpY2F0aW9uLgorICAgICBUaGlzIGluZm9ybWF0aW9uIGlzIGFjY2Vzc2VkIGJ5IHRoZSBmdW5jdGlvbnMgaW4gPGN0eXBlLmg+LgorICAgICBUaGVzZSBgbmxfbGFuZ2luZm8nIG5hbWVzIGFyZSB1c2VkIG9ubHkgaW50ZXJuYWxseS4gICovCisgIF9OTF9DVFlQRV9DTEFTUyA9IF9OTF9JVEVNIChfX0xDX0NUWVBFLCAwKSwKKyAgX05MX0NUWVBFX1RPVVBQRVIsCisgIF9OTF9DVFlQRV9HQVAxLAorICBfTkxfQ1RZUEVfVE9MT1dFUiwKKyAgX05MX0NUWVBFX0dBUDIsCisgIF9OTF9DVFlQRV9DTEFTUzMyLAorICBfTkxfQ1RZUEVfR0FQMywKKyAgX05MX0NUWVBFX0dBUDQsCisgIF9OTF9DVFlQRV9HQVA1LAorICBfTkxfQ1RZUEVfR0FQNiwKKyAgX05MX0NUWVBFX0NMQVNTX05BTUVTLAorICBfTkxfQ1RZUEVfTUFQX05BTUVTLAorICBfTkxfQ1RZUEVfV0lEVEgsCisgIF9OTF9DVFlQRV9NQl9DVVJfTUFYLAorICBfTkxfQ1RZUEVfQ09ERVNFVF9OQU1FLAorICBDT0RFU0VUID0gX05MX0NUWVBFX0NPREVTRVRfTkFNRSwKKyNkZWZpbmUgQ09ERVNFVAkJCUNPREVTRVQKKyAgX05MX0NUWVBFX1RPVVBQRVIzMiwKKyAgX05MX0NUWVBFX1RPTE9XRVIzMiwKKyAgX05MX0NUWVBFX0NMQVNTX09GRlNFVCwKKyAgX05MX0NUWVBFX01BUF9PRkZTRVQsCisgIF9OTF9DVFlQRV9JTkRJR0lUU19NQl9MRU4sCisgIF9OTF9DVFlQRV9JTkRJR0lUUzBfTUIsCisgIF9OTF9DVFlQRV9JTkRJR0lUUzFfTUIsCisgIF9OTF9DVFlQRV9JTkRJR0lUUzJfTUIsCisgIF9OTF9DVFlQRV9JTkRJR0lUUzNfTUIsCisgIF9OTF9DVFlQRV9JTkRJR0lUUzRfTUIsCisgIF9OTF9DVFlQRV9JTkRJR0lUUzVfTUIsCisgIF9OTF9DVFlQRV9JTkRJR0lUUzZfTUIsCisgIF9OTF9DVFlQRV9JTkRJR0lUUzdfTUIsCisgIF9OTF9DVFlQRV9JTkRJR0lUUzhfTUIsCisgIF9OTF9DVFlQRV9JTkRJR0lUUzlfTUIsCisgIF9OTF9DVFlQRV9JTkRJR0lUU19XQ19MRU4sCisgIF9OTF9DVFlQRV9JTkRJR0lUUzBfV0MsCisgIF9OTF9DVFlQRV9JTkRJR0lUUzFfV0MsCisgIF9OTF9DVFlQRV9JTkRJR0lUUzJfV0MsCisgIF9OTF9DVFlQRV9JTkRJR0lUUzNfV0MsCisgIF9OTF9DVFlQRV9JTkRJR0lUUzRfV0MsCisgIF9OTF9DVFlQRV9JTkRJR0lUUzVfV0MsCisgIF9OTF9DVFlQRV9JTkRJR0lUUzZfV0MsCisgIF9OTF9DVFlQRV9JTkRJR0lUUzdfV0MsCisgIF9OTF9DVFlQRV9JTkRJR0lUUzhfV0MsCisgIF9OTF9DVFlQRV9JTkRJR0lUUzlfV0MsCisgIF9OTF9DVFlQRV9PVVRESUdJVDBfTUIsCisgIF9OTF9DVFlQRV9PVVRESUdJVDFfTUIsCisgIF9OTF9DVFlQRV9PVVRESUdJVDJfTUIsCisgIF9OTF9DVFlQRV9PVVRESUdJVDNfTUIsCisgIF9OTF9DVFlQRV9PVVRESUdJVDRfTUIsCisgIF9OTF9DVFlQRV9PVVRESUdJVDVfTUIsCisgIF9OTF9DVFlQRV9PVVRESUdJVDZfTUIsCisgIF9OTF9DVFlQRV9PVVRESUdJVDdfTUIsCisgIF9OTF9DVFlQRV9PVVRESUdJVDhfTUIsCisgIF9OTF9DVFlQRV9PVVRESUdJVDlfTUIsCisgIF9OTF9DVFlQRV9PVVRESUdJVDBfV0MsCisgIF9OTF9DVFlQRV9PVVRESUdJVDFfV0MsCisgIF9OTF9DVFlQRV9PVVRESUdJVDJfV0MsCisgIF9OTF9DVFlQRV9PVVRESUdJVDNfV0MsCisgIF9OTF9DVFlQRV9PVVRESUdJVDRfV0MsCisgIF9OTF9DVFlQRV9PVVRESUdJVDVfV0MsCisgIF9OTF9DVFlQRV9PVVRESUdJVDZfV0MsCisgIF9OTF9DVFlQRV9PVVRESUdJVDdfV0MsCisgIF9OTF9DVFlQRV9PVVRESUdJVDhfV0MsCisgIF9OTF9DVFlQRV9PVVRESUdJVDlfV0MsCisgIF9OTF9DVFlQRV9UUkFOU0xJVF9UQUJfU0laRSwKKyAgX05MX0NUWVBFX1RSQU5TTElUX0ZST01fSURYLAorICBfTkxfQ1RZUEVfVFJBTlNMSVRfRlJPTV9UQkwsCisgIF9OTF9DVFlQRV9UUkFOU0xJVF9UT19JRFgsCisgIF9OTF9DVFlQRV9UUkFOU0xJVF9UT19UQkwsCisgIF9OTF9DVFlQRV9UUkFOU0xJVF9ERUZBVUxUX01JU1NJTkdfTEVOLAorICBfTkxfQ1RZUEVfVFJBTlNMSVRfREVGQVVMVF9NSVNTSU5HLAorICBfTkxfQ1RZUEVfVFJBTlNMSVRfSUdOT1JFX0xFTiwKKyAgX05MX0NUWVBFX1RSQU5TTElUX0lHTk9SRSwKKyAgX05MX0NUWVBFX01BUF9UT19OT05BU0NJSSwKKyAgX05MX0NUWVBFX05PTkFTQ0lJX0NBU0UsCisgIF9OTF9DVFlQRV9FWFRSQV9NQVBfMSwKKyAgX05MX0NUWVBFX0VYVFJBX01BUF8yLAorICBfTkxfQ1RZUEVfRVhUUkFfTUFQXzMsCisgIF9OTF9DVFlQRV9FWFRSQV9NQVBfNCwKKyAgX05MX0NUWVBFX0VYVFJBX01BUF81LAorICBfTkxfQ1RZUEVfRVhUUkFfTUFQXzYsCisgIF9OTF9DVFlQRV9FWFRSQV9NQVBfNywKKyAgX05MX0NUWVBFX0VYVFJBX01BUF84LAorICBfTkxfQ1RZUEVfRVhUUkFfTUFQXzksCisgIF9OTF9DVFlQRV9FWFRSQV9NQVBfMTAsCisgIF9OTF9DVFlQRV9FWFRSQV9NQVBfMTEsCisgIF9OTF9DVFlQRV9FWFRSQV9NQVBfMTIsCisgIF9OTF9DVFlQRV9FWFRSQV9NQVBfMTMsCisgIF9OTF9DVFlQRV9FWFRSQV9NQVBfMTQsCisgIF9OTF9OVU1fTENfQ1RZUEUsCisKKyAgLyogTENfTU9ORVRBUlkgY2F0ZWdvcnk6IGZvcm1hdHRpbmcgb2YgbW9uZXRhcnkgcXVhbnRpdGllcy4KKyAgICAgVGhlc2UgaXRlbXMgZWFjaCBjb3JyZXNwb25kIHRvIGEgbWVtYmVyIG9mIGBzdHJ1Y3QgbGNvbnYnLAorICAgICBkZWZpbmVkIGluIDxsb2NhbGUuaD4uICAqLworICBfX0lOVF9DVVJSX1NZTUJPTCA9IF9OTF9JVEVNIChfX0xDX01PTkVUQVJZLCAwKSwKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIElOVF9DVVJSX1NZTUJPTAlfX0lOVF9DVVJSX1NZTUJPTAorI2VuZGlmCisgIF9fQ1VSUkVOQ1lfU1lNQk9MLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgQ1VSUkVOQ1lfU1lNQk9MCV9fQ1VSUkVOQ1lfU1lNQk9MCisjZW5kaWYKKyAgX19NT05fREVDSU1BTF9QT0lOVCwKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIE1PTl9ERUNJTUFMX1BPSU5UCV9fTU9OX0RFQ0lNQUxfUE9JTlQKKyNlbmRpZgorICBfX01PTl9USE9VU0FORFNfU0VQLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgTU9OX1RIT1VTQU5EU19TRVAJX19NT05fVEhPVVNBTkRTX1NFUAorI2VuZGlmCisgIF9fTU9OX0dST1VQSU5HLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgTU9OX0dST1VQSU5HCQlfX01PTl9HUk9VUElORworI2VuZGlmCisgIF9fUE9TSVRJVkVfU0lHTiwKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIFBPU0lUSVZFX1NJR04JCV9fUE9TSVRJVkVfU0lHTgorI2VuZGlmCisgIF9fTkVHQVRJVkVfU0lHTiwKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIE5FR0FUSVZFX1NJR04JCV9fTkVHQVRJVkVfU0lHTgorI2VuZGlmCisgIF9fSU5UX0ZSQUNfRElHSVRTLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgSU5UX0ZSQUNfRElHSVRTCV9fSU5UX0ZSQUNfRElHSVRTCisjZW5kaWYKKyAgX19GUkFDX0RJR0lUUywKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIEZSQUNfRElHSVRTCQlfX0ZSQUNfRElHSVRTCisjZW5kaWYKKyAgX19QX0NTX1BSRUNFREVTLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgUF9DU19QUkVDRURFUwkJX19QX0NTX1BSRUNFREVTCisjZW5kaWYKKyAgX19QX1NFUF9CWV9TUEFDRSwKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIFBfU0VQX0JZX1NQQUNFCQlfX1BfU0VQX0JZX1NQQUNFCisjZW5kaWYKKyAgX19OX0NTX1BSRUNFREVTLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgTl9DU19QUkVDRURFUwkJX19OX0NTX1BSRUNFREVTCisjZW5kaWYKKyAgX19OX1NFUF9CWV9TUEFDRSwKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIE5fU0VQX0JZX1NQQUNFCQlfX05fU0VQX0JZX1NQQUNFCisjZW5kaWYKKyAgX19QX1NJR05fUE9TTiwKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIFBfU0lHTl9QT1NOCQlfX1BfU0lHTl9QT1NOCisjZW5kaWYKKyAgX19OX1NJR05fUE9TTiwKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIE5fU0lHTl9QT1NOCQlfX05fU0lHTl9QT1NOCisjZW5kaWYKKyAgX05MX01PTkVUQVJZX0NSTkNZU1RSLAorI2RlZmluZSBDUk5DWVNUUgkJX05MX01PTkVUQVJZX0NSTkNZU1RSCisgIF9fSU5UX1BfQ1NfUFJFQ0VERVMsCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBJTlRfUF9DU19QUkVDRURFUwlfX0lOVF9QX0NTX1BSRUNFREVTCisjZW5kaWYKKyAgX19JTlRfUF9TRVBfQllfU1BBQ0UsCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBJTlRfUF9TRVBfQllfU1BBQ0UJX19JTlRfUF9TRVBfQllfU1BBQ0UKKyNlbmRpZgorICBfX0lOVF9OX0NTX1BSRUNFREVTLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgSU5UX05fQ1NfUFJFQ0VERVMJX19JTlRfTl9DU19QUkVDRURFUworI2VuZGlmCisgIF9fSU5UX05fU0VQX0JZX1NQQUNFLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgSU5UX05fU0VQX0JZX1NQQUNFCV9fSU5UX05fU0VQX0JZX1NQQUNFCisjZW5kaWYKKyAgX19JTlRfUF9TSUdOX1BPU04sCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBJTlRfUF9TSUdOX1BPU04JX19JTlRfUF9TSUdOX1BPU04KKyNlbmRpZgorICBfX0lOVF9OX1NJR05fUE9TTiwKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIElOVF9OX1NJR05fUE9TTglfX0lOVF9OX1NJR05fUE9TTgorI2VuZGlmCisgIF9OTF9NT05FVEFSWV9EVU9fSU5UX0NVUlJfU1lNQk9MLAorICBfTkxfTU9ORVRBUllfRFVPX0NVUlJFTkNZX1NZTUJPTCwKKyAgX05MX01PTkVUQVJZX0RVT19JTlRfRlJBQ19ESUdJVFMsCisgIF9OTF9NT05FVEFSWV9EVU9fRlJBQ19ESUdJVFMsCisgIF9OTF9NT05FVEFSWV9EVU9fUF9DU19QUkVDRURFUywKKyAgX05MX01PTkVUQVJZX0RVT19QX1NFUF9CWV9TUEFDRSwKKyAgX05MX01PTkVUQVJZX0RVT19OX0NTX1BSRUNFREVTLAorICBfTkxfTU9ORVRBUllfRFVPX05fU0VQX0JZX1NQQUNFLAorICBfTkxfTU9ORVRBUllfRFVPX0lOVF9QX0NTX1BSRUNFREVTLAorICBfTkxfTU9ORVRBUllfRFVPX0lOVF9QX1NFUF9CWV9TUEFDRSwKKyAgX05MX01PTkVUQVJZX0RVT19JTlRfTl9DU19QUkVDRURFUywKKyAgX05MX01PTkVUQVJZX0RVT19JTlRfTl9TRVBfQllfU1BBQ0UsCisgIF9OTF9NT05FVEFSWV9EVU9fUF9TSUdOX1BPU04sCisgIF9OTF9NT05FVEFSWV9EVU9fTl9TSUdOX1BPU04sCisgIF9OTF9NT05FVEFSWV9EVU9fSU5UX1BfU0lHTl9QT1NOLAorICBfTkxfTU9ORVRBUllfRFVPX0lOVF9OX1NJR05fUE9TTiwKKyAgX05MX01PTkVUQVJZX1VOT19WQUxJRF9GUk9NLAorICBfTkxfTU9ORVRBUllfVU5PX1ZBTElEX1RPLAorICBfTkxfTU9ORVRBUllfRFVPX1ZBTElEX0ZST00sCisgIF9OTF9NT05FVEFSWV9EVU9fVkFMSURfVE8sCisgIF9OTF9NT05FVEFSWV9DT05WRVJTSU9OX1JBVEUsCisgIF9OTF9NT05FVEFSWV9ERUNJTUFMX1BPSU5UX1dDLAorICBfTkxfTU9ORVRBUllfVEhPVVNBTkRTX1NFUF9XQywKKyAgX05MX01PTkVUQVJZX0NPREVTRVQsCisgIF9OTF9OVU1fTENfTU9ORVRBUlksCisKKyAgLyogTENfTlVNRVJJQyBjYXRlZ29yeTogZm9ybWF0dGluZyBvZiBudW1iZXJzLgorICAgICBUaGVzZSBhbHNvIGNvcnJlc3BvbmQgdG8gbWVtYmVycyBvZiBgc3RydWN0IGxjb252Jzsgc2VlIDxsb2NhbGUuaD4uICAqLworICBfX0RFQ0lNQUxfUE9JTlQgPSBfTkxfSVRFTSAoX19MQ19OVU1FUklDLCAwKSwKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIERFQ0lNQUxfUE9JTlQJCV9fREVDSU1BTF9QT0lOVAorI2VuZGlmCisgIFJBRElYQ0hBUiA9IF9fREVDSU1BTF9QT0lOVCwKKyNkZWZpbmUgUkFESVhDSEFSCQlSQURJWENIQVIKKyAgX19USE9VU0FORFNfU0VQLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgVEhPVVNBTkRTX1NFUAkJX19USE9VU0FORFNfU0VQCisjZW5kaWYKKyAgVEhPVVNFUCA9IF9fVEhPVVNBTkRTX1NFUCwKKyNkZWZpbmUgVEhPVVNFUAkJCVRIT1VTRVAKKyAgX19HUk9VUElORywKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIEdST1VQSU5HCQlfX0dST1VQSU5HCisjZW5kaWYKKyAgX05MX05VTUVSSUNfREVDSU1BTF9QT0lOVF9XQywKKyAgX05MX05VTUVSSUNfVEhPVVNBTkRTX1NFUF9XQywKKyAgX05MX05VTUVSSUNfQ09ERVNFVCwKKyAgX05MX05VTV9MQ19OVU1FUklDLAorCisgIF9fWUVTRVhQUiA9IF9OTF9JVEVNIChfX0xDX01FU1NBR0VTLCAwKSwgLyogUmVnZXggbWF0Y2hpbmcgYGB5ZXMnJyBpbnB1dC4gICovCisjZGVmaW5lIFlFU0VYUFIJCQlfX1lFU0VYUFIKKyAgX19OT0VYUFIsCQkJLyogUmVnZXggbWF0Y2hpbmcgYGBubycnIGlucHV0LiAgKi8KKyNkZWZpbmUgTk9FWFBSCQkJX19OT0VYUFIKKyAgX19ZRVNTVFIsCQkJLyogT3V0cHV0IHN0cmluZyBmb3IgYGB5ZXMnJy4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9HTlUgfHwgKGRlZmluZWQgX19VU0VfWE9QRU4gJiYgIWRlZmluZWQgX19VU0VfWE9QRU4ySykKKyMgZGVmaW5lIFlFU1NUUgkJCV9fWUVTU1RSCisjZW5kaWYKKyAgX19OT1NUUiwJCQkvKiBPdXRwdXQgc3RyaW5nIGZvciBgYG5vJycuICAqLworI2lmIGRlZmluZWQgX19VU0VfR05VIHx8IChkZWZpbmVkIF9fVVNFX1hPUEVOICYmICFkZWZpbmVkIF9fVVNFX1hPUEVOMkspCisjIGRlZmluZSBOT1NUUgkJCV9fTk9TVFIKKyNlbmRpZgorICBfTkxfTUVTU0FHRVNfQ09ERVNFVCwKKyAgX05MX05VTV9MQ19NRVNTQUdFUywKKworICBfTkxfUEFQRVJfSEVJR0hUID0gX05MX0lURU0gKF9fTENfUEFQRVIsIDApLAorICBfTkxfUEFQRVJfV0lEVEgsCisgIF9OTF9QQVBFUl9DT0RFU0VULAorICBfTkxfTlVNX0xDX1BBUEVSLAorCisgIF9OTF9OQU1FX05BTUVfRk1UID0gX05MX0lURU0gKF9fTENfTkFNRSwgMCksCisgIF9OTF9OQU1FX05BTUVfR0VOLAorICBfTkxfTkFNRV9OQU1FX01SLAorICBfTkxfTkFNRV9OQU1FX01SUywKKyAgX05MX05BTUVfTkFNRV9NSVNTLAorICBfTkxfTkFNRV9OQU1FX01TLAorICBfTkxfTkFNRV9DT0RFU0VULAorICBfTkxfTlVNX0xDX05BTUUsCisKKyAgX05MX0FERFJFU1NfUE9TVEFMX0ZNVCA9IF9OTF9JVEVNIChfX0xDX0FERFJFU1MsIDApLAorICBfTkxfQUREUkVTU19DT1VOVFJZX05BTUUsCisgIF9OTF9BRERSRVNTX0NPVU5UUllfUE9TVCwKKyAgX05MX0FERFJFU1NfQ09VTlRSWV9BQjIsCisgIF9OTF9BRERSRVNTX0NPVU5UUllfQUIzLAorICBfTkxfQUREUkVTU19DT1VOVFJZX0NBUiwKKyAgX05MX0FERFJFU1NfQ09VTlRSWV9OVU0sCisgIF9OTF9BRERSRVNTX0NPVU5UUllfSVNCTiwKKyAgX05MX0FERFJFU1NfTEFOR19OQU1FLAorICBfTkxfQUREUkVTU19MQU5HX0FCLAorICBfTkxfQUREUkVTU19MQU5HX1RFUk0sCisgIF9OTF9BRERSRVNTX0xBTkdfTElCLAorICBfTkxfQUREUkVTU19DT0RFU0VULAorICBfTkxfTlVNX0xDX0FERFJFU1MsCisKKyAgX05MX1RFTEVQSE9ORV9URUxfSU5UX0ZNVCA9IF9OTF9JVEVNIChfX0xDX1RFTEVQSE9ORSwgMCksCisgIF9OTF9URUxFUEhPTkVfVEVMX0RPTV9GTVQsCisgIF9OTF9URUxFUEhPTkVfSU5UX1NFTEVDVCwKKyAgX05MX1RFTEVQSE9ORV9JTlRfUFJFRklYLAorICBfTkxfVEVMRVBIT05FX0NPREVTRVQsCisgIF9OTF9OVU1fTENfVEVMRVBIT05FLAorCisgIF9OTF9NRUFTVVJFTUVOVF9NRUFTVVJFTUVOVCA9IF9OTF9JVEVNIChfX0xDX01FQVNVUkVNRU5ULCAwKSwKKyAgX05MX01FQVNVUkVNRU5UX0NPREVTRVQsCisgIF9OTF9OVU1fTENfTUVBU1VSRU1FTlQsCisKKyAgX05MX0lERU5USUZJQ0FUSU9OX1RJVExFID0gX05MX0lURU0gKF9fTENfSURFTlRJRklDQVRJT04sIDApLAorICBfTkxfSURFTlRJRklDQVRJT05fU09VUkNFLAorICBfTkxfSURFTlRJRklDQVRJT05fQUREUkVTUywKKyAgX05MX0lERU5USUZJQ0FUSU9OX0NPTlRBQ1QsCisgIF9OTF9JREVOVElGSUNBVElPTl9FTUFJTCwKKyAgX05MX0lERU5USUZJQ0FUSU9OX1RFTCwKKyAgX05MX0lERU5USUZJQ0FUSU9OX0ZBWCwKKyAgX05MX0lERU5USUZJQ0FUSU9OX0xBTkdVQUdFLAorICBfTkxfSURFTlRJRklDQVRJT05fVEVSUklUT1JZLAorICBfTkxfSURFTlRJRklDQVRJT05fQVVESUVOQ0UsCisgIF9OTF9JREVOVElGSUNBVElPTl9BUFBMSUNBVElPTiwKKyAgX05MX0lERU5USUZJQ0FUSU9OX0FCQlJFVklBVElPTiwKKyAgX05MX0lERU5USUZJQ0FUSU9OX1JFVklTSU9OLAorICBfTkxfSURFTlRJRklDQVRJT05fREFURSwKKyAgX05MX0lERU5USUZJQ0FUSU9OX0NBVEVHT1JZLAorICBfTkxfSURFTlRJRklDQVRJT05fQ09ERVNFVCwKKyAgX05MX05VTV9MQ19JREVOVElGSUNBVElPTiwKKworICAvKiBUaGlzIG1hcmtzIHRoZSBoaWdoZXN0IHZhbHVlIHVzZWQuICAqLworICBfTkxfTlVNCit9OworCisvKiBUaGlzIG1hY3JvIHByb2R1Y2VzIGFuIGl0ZW0geW91IGNhbiBwYXNzIHRvIGBubF9sYW5naW5mbycgb3IKKyAgIGBubF9sYW5naW5mb19sJyB0byBnZXQgdGhlIG5hbWUgb2YgdGhlIGxvY2FsZSBpbiB1c2UgZm9yIENBVEVHT1JZLiAgKi8KKyNkZWZpbmUgX05MX0xPQ0FMRV9OQU1FKGNhdGVnb3J5KQlfTkxfSVRFTSAoKGNhdGVnb3J5KSwJCSAgICAgIFwKKwkJCQkJCSAgX05MX0lURU1fSU5ERVggKC0xKSkKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIE5MX0xPQ0FMRV9OQU1FKGNhdGVnb3J5KQlfTkxfTE9DQUxFX05BTUUgKGNhdGVnb3J5KQorI2VuZGlmCisKKworLyogUmV0dXJuIHRoZSBjdXJyZW50IGxvY2FsZSdzIHZhbHVlIGZvciBJVEVNLgorICAgSWYgSVRFTSBpcyBpbnZhbGlkLCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCisKKyAgIFRoZSBzdHJpbmcgcmV0dXJuZWQgd2lsbCBub3QgY2hhbmdlIHVudGlsIGBzZXRsb2NhbGUnIGlzIGNhbGxlZDsKKyAgIGl0IGlzIHVzdWFsbHkgaW4gcmVhZC1vbmx5IG1lbW9yeSBhbmQgY2Fubm90IGJlIG1vZGlmaWVkLiAgKi8KKworZXh0ZXJuIGNoYXIgKm5sX2xhbmdpbmZvIChubF9pdGVtIF9faXRlbSkgX19USFJPVzsKKworCisjaWZkZWYJX19VU0VfWE9QRU4ySworLyogVGhpcyBpbnRlcmZhY2UgaXMgZm9yIHRoZSBleHRlbmRlZCBsb2NhbGUgbW9kZWwuICBTZWUgPGxvY2FsZS5oPiBmb3IKKyAgIG1vcmUgaW5mb3JtYXRpb24uICAqLworCisvKiBHZXQgbG9jYWxlIGRhdGF0eXBlIGRlZmluaXRpb24uICAqLworIyBpbmNsdWRlIDx4bG9jYWxlLmg+CisKKy8qIEp1c3QgbGlrZSBubF9sYW5naW5mbyBidXQgZ2V0IHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBsb2NhbGUgb2JqZWN0IEwuICAqLworZXh0ZXJuIGNoYXIgKm5sX2xhbmdpbmZvX2wgKG5sX2l0ZW0gX19pdGVtLCBfX2xvY2FsZV90IF9fbCk7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIGxhbmdpbmZvLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGFzdGxvZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9sYXN0bG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNjNDI1NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGFzdGxvZy5oCkBAIC0wLDAgKzEsNCBAQAorLyogVGhpcyBoZWFkZXIgZmlsZSBpcyB1c2VkIGluIDQuM0JTRCB0byBkZWZpbmUgYHN0cnVjdCBsYXN0bG9nJywKKyAgIHdoaWNoIHdlIGRlZmluZSBpbiA8Yml0cy91dG1wLmg+LiAgKi8KKworI2luY2x1ZGUgPHV0bXAuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGliZ2VuLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpYmdlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNTI1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpYmdlbi5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTElCR0VOX0gKKyNkZWZpbmUgX0xJQkdFTl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogUmV0dXJuIGRpcmVjdG9yeSBwYXJ0IG9mIFBBVEggb3IgIi4iIGlmIG5vbmUgaXMgYXZhaWxhYmxlLiAgKi8KK2V4dGVybiBjaGFyICpkaXJuYW1lIChjaGFyICpfX3BhdGgpIF9fVEhST1c7CisKKy8qIFJldHVybiBmaW5hbCBjb21wb25lbnQgb2YgUEFUSC4KKworICAgVGhpcyBpcyB0aGUgd2VpcmQgWFBHIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbi4gIEl0IHNvbWV0aW1lcyB3aWxsCisgICBtb2RpZnkgaXRzIGFyZ3VtZW50LiAgVGhlcmVmb3JlIHdlIG5vcm1hbGx5IHVzZSB0aGUgR05VIHZlcnNpb24gKGluCisgICA8c3RyaW5nLmg+KSBhbmQgb25seSBpZiB0aGlzIGhlYWRlciBpcyBpbmNsdWRlZCBtYWtlIHRoZSBYUEcKKyAgIHZlcnNpb24gYXZhaWxhYmxlIHVuZGVyIHRoZSByZWFsIG5hbWUuICAqLworZXh0ZXJuIGNoYXIgKl9feHBnX2Jhc2VuYW1lIChjaGFyICpfX3BhdGgpIF9fVEhST1c7CisjZGVmaW5lIGJhc2VuYW1lCV9feHBnX2Jhc2VuYW1lCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBsaWJnZW4uaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saWJpbnRsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpYmludGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDRkZWMzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saWJpbnRsLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qIE1lc3NhZ2UgY2F0YWxvZ3MgZm9yIGludGVybmF0aW9uYWxpemF0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIsIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gdGhlIGZpbGUgbGliZ2V0dGV4dC5oIGluIHRoZSBHTlUgZ2V0dGV4dCBwYWNrYWdlLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTElCSU5UTF9ICisjZGVmaW5lIF9MSUJJTlRMX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogV2UgZGVmaW5lIGFuIGFkZGl0aW9uYWwgc3ltYm9sIHRvIHNpZ25hbCB0aGF0IHdlIHVzZSB0aGUgR05VCisgICBpbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXh0LiAgKi8KKyNkZWZpbmUgX19VU0VfR05VX0dFVFRFWFQgMQorCisvKiBQcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdXBwb3J0ZWQgZmlsZSBmb3JtYXRzLiAgUmV0dXJucyB0aGUKKyAgIG1heGltdW0gbWlub3IgcmV2aXNpb24gbnVtYmVyIHN1cHBvcnRlZCBmb3IgYSBnaXZlbiBtYWpvciByZXZpc2lvbi4gICovCisjZGVmaW5lIF9fR05VX0dFVFRFWFRfU1VQUE9SVEVEX1JFVklTSU9OKG1ham9yKSBcCisgICgobWFqb3IpID09IDAgPyAxIDogLTEpCisKK19fQkVHSU5fREVDTFMKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKKyAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0CisgICB0ZXh0KS4gICovCitleHRlcm4gY2hhciAqZ2V0dGV4dCAoX19jb25zdCBjaGFyICpfX21zZ2lkKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2Zvcm1hdF9hcmdfXyAoMSk7CisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAorICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KK2V4dGVybiBjaGFyICpkZ2V0dGV4dCAoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIF9fY29uc3QgY2hhciAqX19tc2dpZCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9mb3JtYXRfYXJnX18gKDIpOworZXh0ZXJuIGNoYXIgKl9fZGdldHRleHQgKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBfX2NvbnN0IGNoYXIgKl9fbXNnaWQpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fICgyKTsKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCisgICBsb2NhbGUuICAqLworZXh0ZXJuIGNoYXIgKmRjZ2V0dGV4dCAoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQlfX2NvbnN0IGNoYXIgKl9fbXNnaWQsIGludCBfX2NhdGVnb3J5KQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2Zvcm1hdF9hcmdfXyAoMik7CitleHRlcm4gY2hhciAqX19kY2dldHRleHQgKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJICBfX2NvbnN0IGNoYXIgKl9fbXNnaWQsIGludCBfX2NhdGVnb3J5KQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2Zvcm1hdF9hcmdfXyAoMik7CisKKworLyogU2ltaWxhciB0byBgZ2V0dGV4dCcgYnV0IHNlbGVjdCB0aGUgcGx1cmFsIGZvcm0gY29ycmVzcG9uZGluZyB0byB0aGUKKyAgIG51bWJlciBOLiAgKi8KK2V4dGVybiBjaGFyICpuZ2V0dGV4dCAoX19jb25zdCBjaGFyICpfX21zZ2lkMSwgX19jb25zdCBjaGFyICpfX21zZ2lkMiwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9mb3JtYXRfYXJnX18gKDEpIF9fYXR0cmlidXRlX2Zvcm1hdF9hcmdfXyAoMik7CisKKy8qIFNpbWlsYXIgdG8gYGRnZXR0ZXh0JyBidXQgc2VsZWN0IHRoZSBwbHVyYWwgZm9ybSBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgbnVtYmVyIE4uICAqLworZXh0ZXJuIGNoYXIgKmRuZ2V0dGV4dCAoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIF9fY29uc3QgY2hhciAqX19tc2dpZDEsCisJCQlfX2NvbnN0IGNoYXIgKl9fbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBfX24pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fICgyKSBfX2F0dHJpYnV0ZV9mb3JtYXRfYXJnX18gKDMpOworCisvKiBTaW1pbGFyIHRvIGBkY2dldHRleHQnIGJ1dCBzZWxlY3QgdGhlIHBsdXJhbCBmb3JtIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICBudW1iZXIgTi4gICovCitleHRlcm4gY2hhciAqZGNuZ2V0dGV4dCAoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIF9fY29uc3QgY2hhciAqX19tc2dpZDEsCisJCQkgX19jb25zdCBjaGFyICpfX21zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgX19uLAorCQkJIGludCBfX2NhdGVnb3J5KQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2Zvcm1hdF9hcmdfXyAoMikgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fICgzKTsKKworCisvKiBTZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgdG8gRE9NQUlOTkFNRS4KKyAgIElmIERPTUFJTk5BTUUgaXMgbnVsbCwgcmV0dXJuIHRoZSBjdXJyZW50IGRlZmF1bHQuCisgICBJZiBET01BSU5OQU1FIGlzICIiLCByZXNldCB0byB0aGUgZGVmYXVsdCBvZiAibWVzc2FnZXMiLiAgKi8KK2V4dGVybiBjaGFyICp0ZXh0ZG9tYWluIChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkgX19USFJPVzsKKworLyogU3BlY2lmeSB0aGF0IHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIGZvdW5kCisgICBpbiBESVJOQU1FIHJhdGhlciB0aGFuIGluIHRoZSBzeXN0ZW0gbG9jYWxlIGRhdGEgYmFzZS4gICovCitleHRlcm4gY2hhciAqYmluZHRleHRkb21haW4gKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJICAgICBfX2NvbnN0IGNoYXIgKl9fZGlybmFtZSkgX19USFJPVzsKKworLyogU3BlY2lmeSB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGluIHdoaWNoIHRoZSBtZXNzYWdlcyBmcm9tIHRoZQorICAgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSByZXR1cm5lZC4gICovCitleHRlcm4gY2hhciAqYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJCSAgICAgIF9fY29uc3QgY2hhciAqX19jb2Rlc2V0KSBfX1RIUk9XOworCisKKy8qIE9wdGltaXplZCB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBhYm92ZS4gICovCisjaWYgZGVmaW5lZCBfX09QVElNSVpFX18gJiYgIWRlZmluZWQgX19jcGx1c3BsdXMKKworLyogV2UgbmVlZCBOVUxMIGZvciBgZ2V0dGV4dCcuICAqLworIyBkZWZpbmUgX19uZWVkX05VTEwKKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIFdlIG5lZWQgTENfTUVTU0FHRVMgZm9yIGBkZ2V0dGV4dCcuICAqLworIyBpbmNsdWRlIDxsb2NhbGUuaD4KKworLyogVGhlc2UgbXVzdCBiZSBtYWNyb3MuICBJbmxpbmVkIGZ1bmN0aW9ucyBhcmUgdXNlbGVzcyBiZWNhdXNlIHRoZQorICAgYF9fYnVpbHRpbl9jb25zdGFudF9wJyBwcmVkaWNhdGUgaW4gZGNnZXR0ZXh0IHdvdWxkIGFsd2F5cyByZXR1cm4KKyAgIGZhbHNlLiAgKi8KKworIyBkZWZpbmUgZ2V0dGV4dChtc2dpZCkgZGdldHRleHQgKE5VTEwsIG1zZ2lkKQorCisjIGRlZmluZSBkZ2V0dGV4dChkb21haW5uYW1lLCBtc2dpZCkgXAorICBkY2dldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkLCBMQ19NRVNTQUdFUykKKworIyBkZWZpbmUgbmdldHRleHQobXNnaWQxLCBtc2dpZDIsIG4pIGRuZ2V0dGV4dCAoTlVMTCwgbXNnaWQxLCBtc2dpZDIsIG4pCisKKyMgZGVmaW5lIGRuZ2V0dGV4dChkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgbikgXAorICBkY25nZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgbiwgTENfTUVTU0FHRVMpCisKKyNlbmRpZgkvKiBPcHRpbWl6aW5nLiAgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGxpYmludGwuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saWJpby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saWJpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYmMxMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpYmlvLmgKQEAgLTAsMCArMSw1NTcgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0xOTk1LDE5OTctMjAwNiwyMDA3LDIwMDksMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgV3JpdHRlbiBieSBQZXIgQm90aG5lciA8Ym90aG5lckBjeWdudXMuY29tPi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4KKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgaWYgeW91IGxpbmsgdGhlIGNvZGUgaW4gdGhpcyBmaWxlIHdpdGgKKyAgIGZpbGVzIGNvbXBpbGVkIHdpdGggYSBHTlUgY29tcGlsZXIgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLAorICAgdGhhdCBkb2VzIG5vdCBjYXVzZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdG8gYmUgY292ZXJlZCBieQorICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgZXhjZXB0aW9uIGRvZXMgbm90CisgICBob3dldmVyIGludmFsaWRhdGUgYW55IG90aGVyIHJlYXNvbnMgd2h5IHRoZSBleGVjdXRhYmxlIGZpbGUKKyAgIG1pZ2h0IGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAgIFRoaXMgZXhjZXB0aW9uIGFwcGxpZXMgdG8gY29kZSByZWxlYXNlZCBieSBpdHMgY29weXJpZ2h0IGhvbGRlcnMKKyAgIGluIGZpbGVzIGNvbnRhaW5pbmcgdGhlIGV4Y2VwdGlvbi4gICovCisKKyNpZm5kZWYgX0lPX1NURElPX0gKKyNkZWZpbmUgX0lPX1NURElPX0gKKworI2luY2x1ZGUgPF9HX2NvbmZpZy5oPgorLyogQUxMIG9mIHRoZXNlIHNob3VsZCBiZSBkZWZpbmVkIGluIF9HX2NvbmZpZy5oICovCisjZGVmaW5lIF9JT19wb3NfdCBfR19mcG9zX3QgLyogb2Jzb2xldGUgKi8KKyNkZWZpbmUgX0lPX2Zwb3NfdCBfR19mcG9zX3QKKyNkZWZpbmUgX0lPX2Zwb3M2NF90IF9HX2Zwb3M2NF90CisjZGVmaW5lIF9JT19zaXplX3QgX0dfc2l6ZV90CisjZGVmaW5lIF9JT19zc2l6ZV90IF9HX3NzaXplX3QKKyNkZWZpbmUgX0lPX29mZl90IF9HX29mZl90CisjZGVmaW5lIF9JT19vZmY2NF90IF9HX29mZjY0X3QKKyNkZWZpbmUgX0lPX3BpZF90IF9HX3BpZF90CisjZGVmaW5lIF9JT191aWRfdCBfR191aWRfdAorI2RlZmluZSBfSU9faWNvbnZfdCBfR19pY29udl90CisjZGVmaW5lIF9JT19IQVZFX1NZU19XQUlUIF9HX0hBVkVfU1lTX1dBSVQKKyNkZWZpbmUgX0lPX0hBVkVfU1RfQkxLU0laRSBfR19IQVZFX1NUX0JMS1NJWkUKKyNkZWZpbmUgX0lPX0JVRlNJWiBfR19CVUZTSVoKKyNkZWZpbmUgX0lPX3ZhX2xpc3QgX0dfdmFfbGlzdAorI2RlZmluZSBfSU9fd2ludF90IF9HX3dpbnRfdAorCisjaWZkZWYgX0dfTkVFRF9TVERBUkdfSAorLyogVGhpcyBkZWZpbmUgYXZvaWRzIG5hbWUgcG9sbHV0aW9uIGlmIHdlJ3JlIHVzaW5nIEdOVSBzdGRhcmcuaCAqLworIyBkZWZpbmUgX19uZWVkX19fdmFfbGlzdAorIyBpbmNsdWRlIDxzdGRhcmcuaD4KKyMgaWZkZWYgX19HTlVDX1ZBX0xJU1QKKyMgIHVuZGVmIF9JT192YV9saXN0CisjICBkZWZpbmUgX0lPX3ZhX2xpc3QgX19nbnVjX3ZhX2xpc3QKKyMgZW5kaWYgLyogX19HTlVDX1ZBX0xJU1QgKi8KKyNlbmRpZgorCisjaWZuZGVmIF9fUAorIyBpZiBfR19IQVZFX1NZU19DREVGUworIyAgaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjIGVsc2UKKyMgIGlmZGVmIF9fU1REQ19fCisjICAgZGVmaW5lIF9fUChwKSBwCisjICAgZGVmaW5lIF9fUE1UKHApIHAKKyMgIGVsc2UKKyMgICBkZWZpbmUgX19QKHApICgpCisjICAgZGVmaW5lIF9fUE1UKHApICgpCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmIC8qIV9fUCovCisKKy8qIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisjaWZuZGVmIF9QQVJBTVMKKyMgZGVmaW5lIF9QQVJBTVMocHJvdG9zKSBfX1AocHJvdG9zKQorI2VuZGlmIC8qIV9QQVJBTVMqLworCisjaWZuZGVmIF9fU1REQ19fCisjIGlmbmRlZiBjb25zdAorIyAgZGVmaW5lIGNvbnN0CisjIGVuZGlmCisjZW5kaWYKKyNkZWZpbmUgX0lPX1VOSUZJRURfSlVNUFRBQkxFUyAxCisjaWZuZGVmIF9HX0hBVkVfUFJJTlRGX0ZQCisjIGRlZmluZSBfSU9fVVNFX0RUT0EgMQorI2VuZGlmCisKKyNpZm5kZWYgRU9GCisjIGRlZmluZSBFT0YgKC0xKQorI2VuZGlmCisjaWZuZGVmIE5VTEwKKyMgaWYgZGVmaW5lZCBfX0dOVUdfXyAmJiBcCisgICAgKF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA4KSkKKyMgIGRlZmluZSBOVUxMIChfX251bGwpCisjIGVsc2UKKyMgIGlmICFkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgIGRlZmluZSBOVUxMICgodm9pZCopMCkKKyMgIGVsc2UKKyMgICBkZWZpbmUgTlVMTCAoMCkKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2RlZmluZSBfSU9TX0lOUFVUCTEKKyNkZWZpbmUgX0lPU19PVVRQVVQJMgorI2RlZmluZSBfSU9TX0FURU5ECTQKKyNkZWZpbmUgX0lPU19BUFBFTkQJOAorI2RlZmluZSBfSU9TX1RSVU5DCTE2CisjZGVmaW5lIF9JT1NfTk9DUkVBVEUJMzIKKyNkZWZpbmUgX0lPU19OT1JFUExBQ0UJNjQKKyNkZWZpbmUgX0lPU19CSU4JMTI4CisKKy8qIE1hZ2ljIG51bWJlcnMgYW5kIGJpdHMgZm9yIHRoZSBfZmxhZ3MgZmllbGQuCisgICBUaGUgbWFnaWMgbnVtYmVycyB1c2UgdGhlIGhpZ2gtb3JkZXIgYml0cyBvZiBfZmxhZ3M7CisgICB0aGUgcmVtYWluaW5nIGJpdHMgYXJlIGF2YWlsYWJsZSBmb3IgdmFyaWFibGUgZmxhZ3MuCisgICBOb3RlOiBUaGUgbWFnaWMgbnVtYmVycyBtdXN0IGFsbCBiZSBuZWdhdGl2ZSBpZiBzdGRpbworICAgZW11bGF0aW9uIGlzIGRlc2lyZWQuICovCisKKyNkZWZpbmUgX0lPX01BR0lDIDB4RkJBRDAwMDAgLyogTWFnaWMgbnVtYmVyICovCisjZGVmaW5lIF9PTERfU1RESU9fTUFHSUMgMHhGQUJDMDAwMCAvKiBFbXVsYXRlIG9sZCBzdGRpby4gKi8KKyNkZWZpbmUgX0lPX01BR0lDX01BU0sgMHhGRkZGMDAwMAorI2RlZmluZSBfSU9fVVNFUl9CVUYgMSAvKiBVc2VyIG93bnMgYnVmZmVyOyBkb24ndCBkZWxldGUgaXQgb24gY2xvc2UuICovCisjZGVmaW5lIF9JT19VTkJVRkZFUkVEIDIKKyNkZWZpbmUgX0lPX05PX1JFQURTIDQgLyogUmVhZGluZyBub3QgYWxsb3dlZCAqLworI2RlZmluZSBfSU9fTk9fV1JJVEVTIDggLyogV3JpdGluZyBub3QgYWxsb3dkICovCisjZGVmaW5lIF9JT19FT0ZfU0VFTiAweDEwCisjZGVmaW5lIF9JT19FUlJfU0VFTiAweDIwCisjZGVmaW5lIF9JT19ERUxFVEVfRE9OVF9DTE9TRSAweDQwIC8qIERvbid0IGNhbGwgY2xvc2UoX2ZpbGVubykgb24gY2xlYW51cC4gKi8KKyNkZWZpbmUgX0lPX0xJTktFRCAweDgwIC8qIFNldCBpZiBsaW5rZWQgKHVzaW5nIF9jaGFpbikgdG8gc3RyZWFtYnVmOjpfbGlzdF9hbGwuKi8KKyNkZWZpbmUgX0lPX0lOX0JBQ0tVUCAweDEwMAorI2RlZmluZSBfSU9fTElORV9CVUYgMHgyMDAKKyNkZWZpbmUgX0lPX1RJRURfUFVUX0dFVCAweDQwMCAvKiBTZXQgaWYgcHV0IGFuZCBnZXQgcG9pbnRlciBsb2dpY2x5IHRpZWQuICovCisjZGVmaW5lIF9JT19DVVJSRU5UTFlfUFVUVElORyAweDgwMAorI2RlZmluZSBfSU9fSVNfQVBQRU5ESU5HIDB4MTAwMAorI2RlZmluZSBfSU9fSVNfRklMRUJVRiAweDIwMDAKKyNkZWZpbmUgX0lPX0JBRF9TRUVOIDB4NDAwMAorI2RlZmluZSBfSU9fVVNFUl9MT0NLIDB4ODAwMAorCisjZGVmaW5lIF9JT19GTEFHUzJfTU1BUCAxCisjZGVmaW5lIF9JT19GTEFHUzJfTk9UQ0FOQ0VMIDIKKyNpZmRlZiBfTElCQworIyBkZWZpbmUgX0lPX0ZMQUdTMl9GT1JUSUZZIDQKKyNlbmRpZgorI2RlZmluZSBfSU9fRkxBR1MyX1VTRVJfV0JVRiA4CisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIF9JT19GTEFHUzJfU0NBTkZfU1REIDE2CisjIGRlZmluZSBfSU9fRkxBR1MyX05PQ0xPU0UgMzIKKyMgZGVmaW5lIF9JT19GTEFHUzJfQ0xPRVhFQyA2NAorI2VuZGlmCisKKy8qIFRoZXNlIGFyZSAiZm9ybWF0dGluZyBmbGFncyIgbWF0Y2hpbmcgdGhlIGlvc3RyZWFtIGZtdGZsYWdzIGVudW0gdmFsdWVzLiAqLworI2RlZmluZSBfSU9fU0tJUFdTIDAxCisjZGVmaW5lIF9JT19MRUZUIDAyCisjZGVmaW5lIF9JT19SSUdIVCAwNAorI2RlZmluZSBfSU9fSU5URVJOQUwgMDEwCisjZGVmaW5lIF9JT19ERUMgMDIwCisjZGVmaW5lIF9JT19PQ1QgMDQwCisjZGVmaW5lIF9JT19IRVggMDEwMAorI2RlZmluZSBfSU9fU0hPV0JBU0UgMDIwMAorI2RlZmluZSBfSU9fU0hPV1BPSU5UIDA0MDAKKyNkZWZpbmUgX0lPX1VQUEVSQ0FTRSAwMTAwMAorI2RlZmluZSBfSU9fU0hPV1BPUyAwMjAwMAorI2RlZmluZSBfSU9fU0NJRU5USUZJQyAwNDAwMAorI2RlZmluZSBfSU9fRklYRUQgMDEwMDAwCisjZGVmaW5lIF9JT19VTklUQlVGIDAyMDAwMAorI2RlZmluZSBfSU9fU1RESU8gMDQwMDAwCisjZGVmaW5lIF9JT19ET05UX0NMT1NFIDAxMDAwMDAKKyNkZWZpbmUgX0lPX0JPT0xBTFBIQSAwMjAwMDAwCisKKworc3RydWN0IF9JT19qdW1wX3Q7ICBzdHJ1Y3QgX0lPX0ZJTEU7CisKKy8qIEhhbmRsZSBsb2NrLiAgKi8KKyNpZmRlZiBfSU9fTVRTQUZFX0lPCisjIGlmIGRlZmluZWQgX19HTElCQ19fICYmIF9fR0xJQkNfXyA+PSAyCisjICBpbmNsdWRlIDxiaXRzL3N0ZGlvLWxvY2suaD4KKyMgZWxzZQorLyojIGluY2x1ZGUgPGNvbXRocmVhZC5oPiovCisjIGVuZGlmCisjZWxzZQordHlwZWRlZiB2b2lkIF9JT19sb2NrX3Q7CisjZW5kaWYKKworCisvKiBBIHN0cmVhbW1hcmtlciByZW1lbWJlcnMgYSBwb3NpdGlvbiBpbiBhIGJ1ZmZlci4gKi8KKworc3RydWN0IF9JT19tYXJrZXIgeworICBzdHJ1Y3QgX0lPX21hcmtlciAqX25leHQ7CisgIHN0cnVjdCBfSU9fRklMRSAqX3NidWY7CisgIC8qIElmIF9wb3MgPj0gMAorIGl0IHBvaW50cyB0byBfYnVmLT5HYmFzZSgpK19wb3MuIEZJWE1FIGNvbW1lbnQgKi8KKyAgLyogaWYgX3BvcyA8IDAsIGl0IHBvaW50cyB0byBfYnVmLT5lQnB0cigpK19wb3MuIEZJWE1FIGNvbW1lbnQgKi8KKyAgaW50IF9wb3M7CisjaWYgMAorICAgIHZvaWQgc2V0X3N0cmVhbXBvcyhzdHJlYW1wb3Mgc3ApIHsgX3Nwb3MgPSBzcDsgfQorICAgIHZvaWQgc2V0X29mZnNldChpbnQgb2Zmc2V0KSB7IF9wb3MgPSBvZmZzZXQ7IF9zcG9zID0gKHN0cmVhbXBvcykoLTIpOyB9CisgIHB1YmxpYzoKKyAgICBzdHJlYW1tYXJrZXIoc3RyZWFtYnVmICpzYik7CisgICAgfnN0cmVhbW1hcmtlcigpOworICAgIGludCBzYXZpbmcoKSB7IHJldHVybiAgX3Nwb3MgPT0gLTI7IH0KKyAgICBpbnQgZGVsdGEoc3RyZWFtbWFya2VyJik7CisgICAgaW50IGRlbHRhKCk7CisjZW5kaWYKK307CisKKy8qIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBmcm9tIHRoZSBsaWJzdGRjKysgY29kZWN2dCBjbGFzcy4gICovCitlbnVtIF9fY29kZWN2dF9yZXN1bHQKK3sKKyAgX19jb2RlY3Z0X29rLAorICBfX2NvZGVjdnRfcGFydGlhbCwKKyAgX19jb2RlY3Z0X2Vycm9yLAorICBfX2NvZGVjdnRfbm9jb252Cit9OworCisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIF9HTElCQ1BQX1VTRV9XQ0hBUl9UCisvKiBUaGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBmb2xsb3dpbmcgc3RydWN0IG11c3QgbWF0Y2ggdGhlIG9yZGVyCisgICBvZiB0aGUgdmlydHVhbCBmdW5jdGlvbnMgaW4gdGhlIGxpYnN0ZGMrKyBjb2RlY3Z0IGNsYXNzLiAgKi8KK3N0cnVjdCBfSU9fY29kZWN2dAoreworICB2b2lkICgqX19jb2RlY3Z0X2Rlc3RyKSAoc3RydWN0IF9JT19jb2RlY3Z0ICopOworICBlbnVtIF9fY29kZWN2dF9yZXN1bHQgKCpfX2NvZGVjdnRfZG9fb3V0KSAoc3RydWN0IF9JT19jb2RlY3Z0ICosCisJCQkJCSAgICAgX19tYnN0YXRlX3QgKiwKKwkJCQkJICAgICBjb25zdCB3Y2hhcl90ICosCisJCQkJCSAgICAgY29uc3Qgd2NoYXJfdCAqLAorCQkJCQkgICAgIGNvbnN0IHdjaGFyX3QgKiosIGNoYXIgKiwKKwkJCQkJICAgICBjaGFyICosIGNoYXIgKiopOworICBlbnVtIF9fY29kZWN2dF9yZXN1bHQgKCpfX2NvZGVjdnRfZG9fdW5zaGlmdCkgKHN0cnVjdCBfSU9fY29kZWN2dCAqLAorCQkJCQkJIF9fbWJzdGF0ZV90ICosIGNoYXIgKiwKKwkJCQkJCSBjaGFyICosIGNoYXIgKiopOworICBlbnVtIF9fY29kZWN2dF9yZXN1bHQgKCpfX2NvZGVjdnRfZG9faW4pIChzdHJ1Y3QgX0lPX2NvZGVjdnQgKiwKKwkJCQkJICAgIF9fbWJzdGF0ZV90ICosCisJCQkJCSAgICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKiosIHdjaGFyX3QgKiwKKwkJCQkJICAgIHdjaGFyX3QgKiwgd2NoYXJfdCAqKik7CisgIGludCAoKl9fY29kZWN2dF9kb19lbmNvZGluZykgKHN0cnVjdCBfSU9fY29kZWN2dCAqKTsKKyAgaW50ICgqX19jb2RlY3Z0X2RvX2Fsd2F5c19ub2NvbnYpIChzdHJ1Y3QgX0lPX2NvZGVjdnQgKik7CisgIGludCAoKl9fY29kZWN2dF9kb19sZW5ndGgpIChzdHJ1Y3QgX0lPX2NvZGVjdnQgKiwgX19tYnN0YXRlX3QgKiwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBfSU9fc2l6ZV90KTsKKyAgaW50ICgqX19jb2RlY3Z0X2RvX21heF9sZW5ndGgpIChzdHJ1Y3QgX0lPX2NvZGVjdnQgKik7CisKKyAgX0lPX2ljb252X3QgX19jZF9pbjsKKyAgX0lPX2ljb252X3QgX19jZF9vdXQ7Cit9OworCisvKiBFeHRyYSBkYXRhIGZvciB3aWRlIGNoYXJhY3RlciBzdHJlYW1zLiAgKi8KK3N0cnVjdCBfSU9fd2lkZV9kYXRhCit7CisgIHdjaGFyX3QgKl9JT19yZWFkX3B0cjsJLyogQ3VycmVudCByZWFkIHBvaW50ZXIgKi8KKyAgd2NoYXJfdCAqX0lPX3JlYWRfZW5kOwkvKiBFbmQgb2YgZ2V0IGFyZWEuICovCisgIHdjaGFyX3QgKl9JT19yZWFkX2Jhc2U7CS8qIFN0YXJ0IG9mIHB1dGJhY2srZ2V0IGFyZWEuICovCisgIHdjaGFyX3QgKl9JT193cml0ZV9iYXNlOwkvKiBTdGFydCBvZiBwdXQgYXJlYS4gKi8KKyAgd2NoYXJfdCAqX0lPX3dyaXRlX3B0cjsJLyogQ3VycmVudCBwdXQgcG9pbnRlci4gKi8KKyAgd2NoYXJfdCAqX0lPX3dyaXRlX2VuZDsJLyogRW5kIG9mIHB1dCBhcmVhLiAqLworICB3Y2hhcl90ICpfSU9fYnVmX2Jhc2U7CS8qIFN0YXJ0IG9mIHJlc2VydmUgYXJlYS4gKi8KKyAgd2NoYXJfdCAqX0lPX2J1Zl9lbmQ7CQkvKiBFbmQgb2YgcmVzZXJ2ZSBhcmVhLiAqLworICAvKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgdXNlZCB0byBzdXBwb3J0IGJhY2tpbmcgdXAgYW5kIHVuZG8uICovCisgIHdjaGFyX3QgKl9JT19zYXZlX2Jhc2U7CS8qIFBvaW50ZXIgdG8gc3RhcnQgb2Ygbm9uLWN1cnJlbnQgZ2V0IGFyZWEuICovCisgIHdjaGFyX3QgKl9JT19iYWNrdXBfYmFzZTsJLyogUG9pbnRlciB0byBmaXJzdCB2YWxpZCBjaGFyYWN0ZXIgb2YKKwkJCQkgICBiYWNrdXAgYXJlYSAqLworICB3Y2hhcl90ICpfSU9fc2F2ZV9lbmQ7CS8qIFBvaW50ZXIgdG8gZW5kIG9mIG5vbi1jdXJyZW50IGdldCBhcmVhLiAqLworCisgIF9fbWJzdGF0ZV90IF9JT19zdGF0ZTsKKyAgX19tYnN0YXRlX3QgX0lPX2xhc3Rfc3RhdGU7CisgIHN0cnVjdCBfSU9fY29kZWN2dCBfY29kZWN2dDsKKworICB3Y2hhcl90IF9zaG9ydGJ1ZlsxXTsKKworICBjb25zdCBzdHJ1Y3QgX0lPX2p1bXBfdCAqX3dpZGVfdnRhYmxlOworfTsKKyNlbmRpZgorCitzdHJ1Y3QgX0lPX0ZJTEUgeworICBpbnQgX2ZsYWdzOwkJLyogSGlnaC1vcmRlciB3b3JkIGlzIF9JT19NQUdJQzsgcmVzdCBpcyBmbGFncy4gKi8KKyNkZWZpbmUgX0lPX2ZpbGVfZmxhZ3MgX2ZsYWdzCisKKyAgLyogVGhlIGZvbGxvd2luZyBwb2ludGVycyBjb3JyZXNwb25kIHRvIHRoZSBDKysgc3RyZWFtYnVmIHByb3RvY29sLiAqLworICAvKiBOb3RlOiAgVGsgdXNlcyB0aGUgX0lPX3JlYWRfcHRyIGFuZCBfSU9fcmVhZF9lbmQgZmllbGRzIGRpcmVjdGx5LiAqLworICBjaGFyKiBfSU9fcmVhZF9wdHI7CS8qIEN1cnJlbnQgcmVhZCBwb2ludGVyICovCisgIGNoYXIqIF9JT19yZWFkX2VuZDsJLyogRW5kIG9mIGdldCBhcmVhLiAqLworICBjaGFyKiBfSU9fcmVhZF9iYXNlOwkvKiBTdGFydCBvZiBwdXRiYWNrK2dldCBhcmVhLiAqLworICBjaGFyKiBfSU9fd3JpdGVfYmFzZTsJLyogU3RhcnQgb2YgcHV0IGFyZWEuICovCisgIGNoYXIqIF9JT193cml0ZV9wdHI7CS8qIEN1cnJlbnQgcHV0IHBvaW50ZXIuICovCisgIGNoYXIqIF9JT193cml0ZV9lbmQ7CS8qIEVuZCBvZiBwdXQgYXJlYS4gKi8KKyAgY2hhciogX0lPX2J1Zl9iYXNlOwkvKiBTdGFydCBvZiByZXNlcnZlIGFyZWEuICovCisgIGNoYXIqIF9JT19idWZfZW5kOwkvKiBFbmQgb2YgcmVzZXJ2ZSBhcmVhLiAqLworICAvKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgdXNlZCB0byBzdXBwb3J0IGJhY2tpbmcgdXAgYW5kIHVuZG8uICovCisgIGNoYXIgKl9JT19zYXZlX2Jhc2U7IC8qIFBvaW50ZXIgdG8gc3RhcnQgb2Ygbm9uLWN1cnJlbnQgZ2V0IGFyZWEuICovCisgIGNoYXIgKl9JT19iYWNrdXBfYmFzZTsgIC8qIFBvaW50ZXIgdG8gZmlyc3QgdmFsaWQgY2hhcmFjdGVyIG9mIGJhY2t1cCBhcmVhICovCisgIGNoYXIgKl9JT19zYXZlX2VuZDsgLyogUG9pbnRlciB0byBlbmQgb2Ygbm9uLWN1cnJlbnQgZ2V0IGFyZWEuICovCisKKyAgc3RydWN0IF9JT19tYXJrZXIgKl9tYXJrZXJzOworCisgIHN0cnVjdCBfSU9fRklMRSAqX2NoYWluOworCisgIGludCBfZmlsZW5vOworI2lmIDAKKyAgaW50IF9ibGtzaXplOworI2Vsc2UKKyAgaW50IF9mbGFnczI7CisjZW5kaWYKKyAgX0lPX29mZl90IF9vbGRfb2Zmc2V0OyAvKiBUaGlzIHVzZWQgdG8gYmUgX29mZnNldCBidXQgaXQncyB0b28gc21hbGwuICAqLworCisjZGVmaW5lIF9fSEFWRV9DT0xVTU4gLyogdGVtcG9yYXJ5ICovCisgIC8qIDErY29sdW1uIG51bWJlciBvZiBwYmFzZSgpOyAwIGlzIHVua25vd24uICovCisgIHVuc2lnbmVkIHNob3J0IF9jdXJfY29sdW1uOworICBzaWduZWQgY2hhciBfdnRhYmxlX29mZnNldDsKKyAgY2hhciBfc2hvcnRidWZbMV07CisKKyAgLyogIGNoYXIqIF9zYXZlX2dwdHI7ICBjaGFyKiBfc2F2ZV9lZ3B0cjsgKi8KKworICBfSU9fbG9ja190ICpfbG9jazsKKyNpZmRlZiBfSU9fVVNFX09MRF9JT19GSUxFCit9OworCitzdHJ1Y3QgX0lPX0ZJTEVfY29tcGxldGUKK3sKKyAgc3RydWN0IF9JT19GSUxFIF9maWxlOworI2VuZGlmCisjaWYgZGVmaW5lZCBfR19JT19JT19GSUxFX1ZFUlNJT04gJiYgX0dfSU9fSU9fRklMRV9WRVJTSU9OID09IDB4MjAwMDEKKyAgX0lPX29mZjY0X3QgX29mZnNldDsKKyMgaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIF9HTElCQ1BQX1VTRV9XQ0hBUl9UCisgIC8qIFdpZGUgY2hhcmFjdGVyIHN0cmVhbSBzdHVmZi4gICovCisgIHN0cnVjdCBfSU9fY29kZWN2dCAqX2NvZGVjdnQ7CisgIHN0cnVjdCBfSU9fd2lkZV9kYXRhICpfd2lkZV9kYXRhOworICBzdHJ1Y3QgX0lPX0ZJTEUgKl9mcmVlcmVzX2xpc3Q7CisgIHZvaWQgKl9mcmVlcmVzX2J1ZjsKKyAgc2l6ZV90IF9mcmVlcmVzX3NpemU7CisjIGVsc2UKKyAgdm9pZCAqX19wYWQxOworICB2b2lkICpfX3BhZDI7CisgIHZvaWQgKl9fcGFkMzsKKyAgdm9pZCAqX19wYWQ0OworICBzaXplX3QgX19wYWQ1OworIyBlbmRpZgorICBpbnQgX21vZGU7CisgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgaW50byB0cm91YmxlIGFnYWluLiAgKi8KKyAgY2hhciBfdW51c2VkMlsxNSAqIHNpemVvZiAoaW50KSAtIDQgKiBzaXplb2YgKHZvaWQgKikgLSBzaXplb2YgKHNpemVfdCldOworI2VuZGlmCit9OworCisjaWZuZGVmIF9fY3BsdXNwbHVzCit0eXBlZGVmIHN0cnVjdCBfSU9fRklMRSBfSU9fRklMRTsKKyNlbmRpZgorCitzdHJ1Y3QgX0lPX0ZJTEVfcGx1czsKKworZXh0ZXJuIHN0cnVjdCBfSU9fRklMRV9wbHVzIF9JT18yXzFfc3RkaW5fOworZXh0ZXJuIHN0cnVjdCBfSU9fRklMRV9wbHVzIF9JT18yXzFfc3Rkb3V0XzsKK2V4dGVybiBzdHJ1Y3QgX0lPX0ZJTEVfcGx1cyBfSU9fMl8xX3N0ZGVycl87CisjaWZuZGVmIF9MSUJDCisjZGVmaW5lIF9JT19zdGRpbiAoKF9JT19GSUxFKikoJl9JT18yXzFfc3RkaW5fKSkKKyNkZWZpbmUgX0lPX3N0ZG91dCAoKF9JT19GSUxFKikoJl9JT18yXzFfc3Rkb3V0XykpCisjZGVmaW5lIF9JT19zdGRlcnIgKChfSU9fRklMRSopKCZfSU9fMl8xX3N0ZGVycl8pKQorI2Vsc2UKK2V4dGVybiBfSU9fRklMRSAqX0lPX3N0ZGluIGF0dHJpYnV0ZV9oaWRkZW47CitleHRlcm4gX0lPX0ZJTEUgKl9JT19zdGRvdXQgYXR0cmlidXRlX2hpZGRlbjsKK2V4dGVybiBfSU9fRklMRSAqX0lPX3N0ZGVyciBhdHRyaWJ1dGVfaGlkZGVuOworI2VuZGlmCisKKworLyogRnVuY3Rpb25zIHRvIGRvIEkvTyBhbmQgZmlsZSBtYW5hZ2VtZW50IGZvciBhIHN0cmVhbS4gICovCisKKy8qIFJlYWQgTkJZVEVTIGJ5dGVzIGZyb20gQ09PS0lFIGludG8gYSBidWZmZXIgcG9pbnRlZCB0byBieSBCVUYuCisgICBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQuICAqLwordHlwZWRlZiBfX3NzaXplX3QgX19pb19yZWFkX2ZuICh2b2lkICpfX2Nvb2tpZSwgY2hhciAqX19idWYsIHNpemVfdCBfX25ieXRlcyk7CisKKy8qIFdyaXRlIE4gYnl0ZXMgcG9pbnRlZCB0byBieSBCVUYgdG8gQ09PS0lFLiAgV3JpdGUgYWxsIE4gYnl0ZXMKKyAgIHVubGVzcyB0aGVyZSBpcyBhbiBlcnJvci4gIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgb3IgLTEgaWYKKyAgIHRoZXJlIGlzIGFuIGVycm9yIHdpdGhvdXQgd3JpdGluZyBhbnl0aGluZy4gIElmIHRoZSBmaWxlIGhhcyBiZWVuCisgICBvcGVuZWQgZm9yIGFwcGVuZCAoX19tb2RlLl9fYXBwZW5kIHNldCksIHRoZW4gc2V0IHRoZSBmaWxlIHBvaW50ZXIKKyAgIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIHRoZW4gZG8gdGhlIHdyaXRlOyBpZiBub3QsIGp1c3Qgd3JpdGUgYXQKKyAgIHRoZSBjdXJyZW50IGZpbGUgcG9pbnRlci4gICovCit0eXBlZGVmIF9fc3NpemVfdCBfX2lvX3dyaXRlX2ZuICh2b2lkICpfX2Nvb2tpZSwgX19jb25zdCBjaGFyICpfX2J1ZiwKKwkJCQkgc2l6ZV90IF9fbik7CisKKy8qIE1vdmUgQ09PS0lFJ3MgZmlsZSBwb3NpdGlvbiB0byAqUE9TIGJ5dGVzIGZyb20gdGhlCisgICBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgKGlmIFcgaXMgU0VFS19TRVQpLAorICAgdGhlIGN1cnJlbnQgcG9zaXRpb24gKGlmIFcgaXMgU0VFS19DVVIpLAorICAgb3IgdGhlIGVuZCBvZiB0aGUgZmlsZSAoaWYgVyBpcyBTRUVLX0VORCkuCisgICBTZXQgKlBPUyB0byB0aGUgbmV3IGZpbGUgcG9zaXRpb24uCisgICBSZXR1cm5zIHplcm8gaWYgc3VjY2Vzc2Z1bCwgbm9uemVybyBpZiBub3QuICAqLwordHlwZWRlZiBpbnQgX19pb19zZWVrX2ZuICh2b2lkICpfX2Nvb2tpZSwgX0lPX29mZjY0X3QgKl9fcG9zLCBpbnQgX193KTsKKworLyogQ2xvc2UgQ09PS0lFLiAgKi8KK3R5cGVkZWYgaW50IF9faW9fY2xvc2VfZm4gKHZvaWQgKl9fY29va2llKTsKKworCisjaWZkZWYgX0dOVV9TT1VSQ0UKKy8qIFVzZXItdmlzaWJsZSBuYW1lcyBmb3IgdGhlIGFib3ZlLiAgKi8KK3R5cGVkZWYgX19pb19yZWFkX2ZuIGNvb2tpZV9yZWFkX2Z1bmN0aW9uX3Q7Cit0eXBlZGVmIF9faW9fd3JpdGVfZm4gY29va2llX3dyaXRlX2Z1bmN0aW9uX3Q7Cit0eXBlZGVmIF9faW9fc2Vla19mbiBjb29raWVfc2Vla19mdW5jdGlvbl90OwordHlwZWRlZiBfX2lvX2Nsb3NlX2ZuIGNvb2tpZV9jbG9zZV9mdW5jdGlvbl90OworCisvKiBUaGUgc3RydWN0dXJlIHdpdGggdGhlIGNvb2tpZSBmdW5jdGlvbiBwb2ludGVycy4gICovCit0eXBlZGVmIHN0cnVjdAoreworICBfX2lvX3JlYWRfZm4gKnJlYWQ7CQkvKiBSZWFkIGJ5dGVzLiAgKi8KKyAgX19pb193cml0ZV9mbiAqd3JpdGU7CQkvKiBXcml0ZSBieXRlcy4gICovCisgIF9faW9fc2Vla19mbiAqc2VlazsJCS8qIFNlZWsvdGVsbCBmaWxlIHBvc2l0aW9uLiAgKi8KKyAgX19pb19jbG9zZV9mbiAqY2xvc2U7CQkvKiBDbG9zZSBmaWxlLiAgKi8KK30gX0lPX2Nvb2tpZV9pb19mdW5jdGlvbnNfdDsKK3R5cGVkZWYgX0lPX2Nvb2tpZV9pb19mdW5jdGlvbnNfdCBjb29raWVfaW9fZnVuY3Rpb25zX3Q7CisKK3N0cnVjdCBfSU9fY29va2llX2ZpbGU7CisKKy8qIEluaXRpYWxpemUgb25lIG9mIHRob3NlLiAgKi8KK2V4dGVybiB2b2lkIF9JT19jb29raWVfaW5pdCAoc3RydWN0IF9JT19jb29raWVfZmlsZSAqX19jZmlsZSwgaW50IF9fcmVhZF93cml0ZSwKKwkJCSAgICAgdm9pZCAqX19jb29raWUsIF9JT19jb29raWVfaW9fZnVuY3Rpb25zX3QgX19mbnMpOworI2VuZGlmCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gaW50IF9fdW5kZXJmbG93IChfSU9fRklMRSAqKTsKK2V4dGVybiBpbnQgX191ZmxvdyAoX0lPX0ZJTEUgKik7CitleHRlcm4gaW50IF9fb3ZlcmZsb3cgKF9JT19GSUxFICosIGludCk7CisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIF9HTElCQ1BQX1VTRV9XQ0hBUl9UCitleHRlcm4gX0lPX3dpbnRfdCBfX3d1bmRlcmZsb3cgKF9JT19GSUxFICopOworZXh0ZXJuIF9JT193aW50X3QgX193dWZsb3cgKF9JT19GSUxFICopOworZXh0ZXJuIF9JT193aW50X3QgX193b3ZlcmZsb3cgKF9JT19GSUxFICosIF9JT193aW50X3QpOworI2VuZGlmCisKKyNpZiAgX19HTlVDX18gPj0gMworIyBkZWZpbmUgX0lPX0JFKGV4cHIsIHJlcykgX19idWlsdGluX2V4cGVjdCAoKGV4cHIpLCByZXMpCisjZWxzZQorIyBkZWZpbmUgX0lPX0JFKGV4cHIsIHJlcykgKGV4cHIpCisjZW5kaWYKKworI2RlZmluZSBfSU9fZ2V0Y191bmxvY2tlZChfZnApIFwKKyAgICAgICAoX0lPX0JFICgoX2ZwKS0+X0lPX3JlYWRfcHRyID49IChfZnApLT5fSU9fcmVhZF9lbmQsIDApIFwKKwk/IF9fdWZsb3cgKF9mcCkgOiAqKHVuc2lnbmVkIGNoYXIgKikgKF9mcCktPl9JT19yZWFkX3B0cisrKQorI2RlZmluZSBfSU9fcGVla2NfdW5sb2NrZWQoX2ZwKSBcCisgICAgICAgKF9JT19CRSAoKF9mcCktPl9JT19yZWFkX3B0ciA+PSAoX2ZwKS0+X0lPX3JlYWRfZW5kLCAwKSBcCisJICAmJiBfX3VuZGVyZmxvdyAoX2ZwKSA9PSBFT0YgPyBFT0YgXAorCTogKih1bnNpZ25lZCBjaGFyICopIChfZnApLT5fSU9fcmVhZF9wdHIpCisjZGVmaW5lIF9JT19wdXRjX3VubG9ja2VkKF9jaCwgX2ZwKSBcCisgICAoX0lPX0JFICgoX2ZwKS0+X0lPX3dyaXRlX3B0ciA+PSAoX2ZwKS0+X0lPX3dyaXRlX2VuZCwgMCkgXAorICAgID8gX19vdmVyZmxvdyAoX2ZwLCAodW5zaWduZWQgY2hhcikgKF9jaCkpIFwKKyAgICA6ICh1bnNpZ25lZCBjaGFyKSAoKihfZnApLT5fSU9fd3JpdGVfcHRyKysgPSAoX2NoKSkpCisKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgX0dMSUJDUFBfVVNFX1dDSEFSX1QKKyMgZGVmaW5lIF9JT19nZXR3Y191bmxvY2tlZChfZnApIFwKKyAgKF9JT19CRSAoKF9mcCktPl93aWRlX2RhdGEgPT0gTlVMTAkJCQkJXAorCSAgIHx8ICgoX2ZwKS0+X3dpZGVfZGF0YS0+X0lPX3JlYWRfcHRyCQkJCVwKKwkgICAgICAgPj0gKF9mcCktPl93aWRlX2RhdGEtPl9JT19yZWFkX2VuZCksIDApCQkJXAorICAgPyBfX3d1ZmxvdyAoX2ZwKSA6IChfSU9fd2ludF90KSAqKF9mcCktPl93aWRlX2RhdGEtPl9JT19yZWFkX3B0cisrKQorIyBkZWZpbmUgX0lPX3B1dHdjX3VubG9ja2VkKF93Y2gsIF9mcCkgXAorICAoX0lPX0JFICgoX2ZwKS0+X3dpZGVfZGF0YSA9PSBOVUxMCQkJCQlcCisJICAgfHwgKChfZnApLT5fd2lkZV9kYXRhLT5fSU9fd3JpdGVfcHRyCQkJCVwKKwkgICAgICAgPj0gKF9mcCktPl93aWRlX2RhdGEtPl9JT193cml0ZV9lbmQpLCAwKQkJCVwKKyAgID8gX193b3ZlcmZsb3cgKF9mcCwgX3djaCkJCQkJCQlcCisgICA6IChfSU9fd2ludF90KSAoKihfZnApLT5fd2lkZV9kYXRhLT5fSU9fd3JpdGVfcHRyKysgPSAoX3djaCkpKQorI2VuZGlmCisKKyNkZWZpbmUgX0lPX2Zlb2ZfdW5sb2NrZWQoX19mcCkgKCgoX19mcCktPl9mbGFncyAmIF9JT19FT0ZfU0VFTikgIT0gMCkKKyNkZWZpbmUgX0lPX2ZlcnJvcl91bmxvY2tlZChfX2ZwKSAoKChfX2ZwKS0+X2ZsYWdzICYgX0lPX0VSUl9TRUVOKSAhPSAwKQorCitleHRlcm4gaW50IF9JT19nZXRjIChfSU9fRklMRSAqX19mcCk7CitleHRlcm4gaW50IF9JT19wdXRjIChpbnQgX19jLCBfSU9fRklMRSAqX19mcCk7CitleHRlcm4gaW50IF9JT19mZW9mIChfSU9fRklMRSAqX19mcCkgX19USFJPVzsKK2V4dGVybiBpbnQgX0lPX2ZlcnJvciAoX0lPX0ZJTEUgKl9fZnApIF9fVEhST1c7CisKK2V4dGVybiBpbnQgX0lPX3BlZWtjX2xvY2tlZCAoX0lPX0ZJTEUgKl9fZnApOworCisvKiBUaGlzIG9uZSBpcyBmb3IgRW1hY3MuICovCisjZGVmaW5lIF9JT19QRU5ESU5HX09VVFBVVF9DT1VOVChfZnApCVwKKwkoKF9mcCktPl9JT193cml0ZV9wdHIgLSAoX2ZwKS0+X0lPX3dyaXRlX2Jhc2UpCisKK2V4dGVybiB2b2lkIF9JT19mbG9ja2ZpbGUgKF9JT19GSUxFICopIF9fVEhST1c7CitleHRlcm4gdm9pZCBfSU9fZnVubG9ja2ZpbGUgKF9JT19GSUxFICopIF9fVEhST1c7CitleHRlcm4gaW50IF9JT19mdHJ5bG9ja2ZpbGUgKF9JT19GSUxFICopIF9fVEhST1c7CisKKyNpZmRlZiBfSU9fTVRTQUZFX0lPCisjIGRlZmluZSBfSU9fcGVla2MoX2ZwKSBfSU9fcGVla2NfbG9ja2VkIChfZnApCisjIGRlZmluZSBfSU9fZmxvY2tmaWxlKF9mcCkgXAorICBpZiAoKChfZnApLT5fZmxhZ3MgJiBfSU9fVVNFUl9MT0NLKSA9PSAwKSBfSU9fZmxvY2tmaWxlIChfZnApCisjIGRlZmluZSBfSU9fZnVubG9ja2ZpbGUoX2ZwKSBcCisgIGlmICgoKF9mcCktPl9mbGFncyAmIF9JT19VU0VSX0xPQ0spID09IDApIF9JT19mdW5sb2NrZmlsZSAoX2ZwKQorI2Vsc2UKKyMgZGVmaW5lIF9JT19wZWVrYyhfZnApIF9JT19wZWVrY191bmxvY2tlZCAoX2ZwKQorIyBkZWZpbmUgX0lPX2Zsb2NrZmlsZShfZnApIC8qKi8KKyMgZGVmaW5lIF9JT19mdW5sb2NrZmlsZShfZnApIC8qKi8KKyMgZGVmaW5lIF9JT19mdHJ5bG9ja2ZpbGUoX2ZwKSAvKiovCisjIGRlZmluZSBfSU9fY2xlYW51cF9yZWdpb25fc3RhcnQoX2ZjdCwgX2ZwKSAvKiovCisjIGRlZmluZSBfSU9fY2xlYW51cF9yZWdpb25fZW5kKF9Eb2l0KSAvKiovCisjZW5kaWYgLyogIV9JT19NVFNBRkVfSU8gKi8KKworZXh0ZXJuIGludCBfSU9fdmZzY2FuZiAoX0lPX0ZJTEUgKiBfX3Jlc3RyaWN0LCBjb25zdCBjaGFyICogX19yZXN0cmljdCwKKwkJCV9JT192YV9saXN0LCBpbnQgKl9fcmVzdHJpY3QpOworZXh0ZXJuIGludCBfSU9fdmZwcmludGYgKF9JT19GSUxFICpfX3Jlc3RyaWN0LCBjb25zdCBjaGFyICpfX3Jlc3RyaWN0LAorCQkJIF9JT192YV9saXN0KTsKK2V4dGVybiBfSU9fc3NpemVfdCBfSU9fcGFkbiAoX0lPX0ZJTEUgKiwgaW50LCBfSU9fc3NpemVfdCk7CitleHRlcm4gX0lPX3NpemVfdCBfSU9fc2dldG4gKF9JT19GSUxFICosIHZvaWQgKiwgX0lPX3NpemVfdCk7CisKK2V4dGVybiBfSU9fb2ZmNjRfdCBfSU9fc2Vla29mZiAoX0lPX0ZJTEUgKiwgX0lPX29mZjY0X3QsIGludCwgaW50KTsKK2V4dGVybiBfSU9fb2ZmNjRfdCBfSU9fc2Vla3BvcyAoX0lPX0ZJTEUgKiwgX0lPX29mZjY0X3QsIGludCk7CisKK2V4dGVybiB2b2lkIF9JT19mcmVlX2JhY2t1cF9hcmVhIChfSU9fRklMRSAqKSBfX1RIUk9XOworCisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIF9HTElCQ1BQX1VTRV9XQ0hBUl9UCitleHRlcm4gX0lPX3dpbnRfdCBfSU9fZ2V0d2MgKF9JT19GSUxFICpfX2ZwKTsKK2V4dGVybiBfSU9fd2ludF90IF9JT19wdXR3YyAod2NoYXJfdCBfX3djLCBfSU9fRklMRSAqX19mcCk7CitleHRlcm4gaW50IF9JT19md2lkZSAoX0lPX0ZJTEUgKl9fZnAsIGludCBfX21vZGUpIF9fVEhST1c7CisjIGlmIF9fR05VQ19fID49IDIKKy8qIFdoaWxlIGNvbXBpbGluZyBnbGliYyB3ZSBoYXZlIHRvIGhhbmRsZSBjb21wYXRpYmlsaXR5IHdpdGggdmVyeSBvbGQKKyAgIHZlcnNpb25zLiAgKi8KKyMgIGlmIGRlZmluZWQgX0xJQkMgJiYgZGVmaW5lZCBTSEFSRUQKKyMgICBpbmNsdWRlIDxzaGxpYi1jb21wYXQuaD4KKyMgICBpZiBTSExJQl9DT01QQVQgKGxpYmMsIEdMSUJDXzJfMCwgR0xJQkNfMl8xKQorIyAgICBkZWZpbmUgX0lPX2Z3aWRlX21heWJlX2luY29tcGF0aWJsZSBcCisgIChfX2J1aWx0aW5fZXhwZWN0ICgmX0lPX3N0ZGluX3VzZWQgPT0gTlVMTCwgMCkpCitleHRlcm4gY29uc3QgaW50IF9JT19zdGRpbl91c2VkOword2Vha19leHRlcm4gKF9JT19zdGRpbl91c2VkKTsKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmbmRlZiBfSU9fZndpZGVfbWF5YmVfaW5jb21wYXRpYmxlCisjICAgZGVmaW5lIF9JT19md2lkZV9tYXliZV9pbmNvbXBhdGlibGUgKDApCisjICBlbmRpZgorLyogQSBzcGVjaWFsIG9wdGltaXplZCB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBhYm92ZS4gIEl0IG9wdGltaXplcyB0aGUKKyAgIGNhc2Ugb2YgaW5pdGlhbGl6aW5nIGFuIHVub3JpZW50ZWQgYnl0ZSBzdHJlYW0uICAqLworIyAgZGVmaW5lIF9JT19md2lkZShfX2ZwLCBfX21vZGUpIFwKKyAgKHsgaW50IF9fcmVzdWx0ID0gKF9fbW9kZSk7CQkJCQkJICAgICAgXAorICAgICBpZiAoX19yZXN1bHQgPCAwICYmICEgX0lPX2Z3aWRlX21heWJlX2luY29tcGF0aWJsZSkJCSAgICAgIFwKKyAgICAgICB7CQkJCQkJCQkgICAgICBcCisJIGlmICgoX19mcCktPl9tb2RlID09IDApCQkJCQkgICAgICBcCisJICAgLyogV2Uga25vdyB0aGF0IGFsbCB3ZSBoYXZlIHRvIGRvIGlzIHRvIHNldCB0aGUgZmxhZy4gICovCSAgICAgIFwKKwkgICAoX19mcCktPl9tb2RlID0gLTE7CQkJCQkJICAgICAgXAorCSBfX3Jlc3VsdCA9IChfX2ZwKS0+X21vZGU7CQkJCQkgICAgICBcCisgICAgICAgfQkJCQkJCQkJICAgICAgXAorICAgICBlbHNlIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19tb2RlKSAmJiAoX19tb2RlKSA9PSAwKQkJICAgICAgXAorICAgICAgIF9fcmVzdWx0ID0gX0lPX2Z3aWRlX21heWJlX2luY29tcGF0aWJsZSA/IC0xIDogKF9fZnApLT5fbW9kZTsJICAgICAgXAorICAgICBlbHNlCQkJCQkJCQkgICAgICBcCisgICAgICAgX19yZXN1bHQgPSBfSU9fZndpZGUgKF9fZnAsIF9fcmVzdWx0KTsJCQkJICAgICAgXAorICAgICBfX3Jlc3VsdDsgfSkKKyMgZW5kaWYKKworZXh0ZXJuIGludCBfSU9fdmZ3c2NhbmYgKF9JT19GSUxFICogX19yZXN0cmljdCwgY29uc3Qgd2NoYXJfdCAqIF9fcmVzdHJpY3QsCisJCQkgX0lPX3ZhX2xpc3QsIGludCAqX19yZXN0cmljdCk7CitleHRlcm4gaW50IF9JT192ZndwcmludGYgKF9JT19GSUxFICpfX3Jlc3RyaWN0LCBjb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0LAorCQkJICBfSU9fdmFfbGlzdCk7CitleHRlcm4gX0lPX3NzaXplX3QgX0lPX3dwYWRuIChfSU9fRklMRSAqLCB3aW50X3QsIF9JT19zc2l6ZV90KTsKK2V4dGVybiB2b2lkIF9JT19mcmVlX3diYWNrdXBfYXJlYSAoX0lPX0ZJTEUgKikgX19USFJPVzsKKyNlbmRpZgorCisjaWZkZWYgX19MREJMX0NPTVBBVAorIyBpbmNsdWRlIDxiaXRzL2xpYmlvLWxkYmwuaD4KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX0lPX1NURElPX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGltaXRzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOWE1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbWl0cy5oCkBAIC0wLDAgKzEsMTU0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJSVNPIEM5OSBTdGFuZGFyZDogNy4xMC81LjIuNC4yLjEgU2l6ZXMgb2YgaW50ZWdlciB0eXBlcwk8bGltaXRzLmg+CisgKi8KKworI2lmbmRlZiBfTElCQ19MSU1JVFNfSF8KKyNkZWZpbmUgX0xJQkNfTElNSVRTX0hfCTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKworLyogTWF4aW11bSBsZW5ndGggb2YgYW55IG11bHRpYnl0ZSBjaGFyYWN0ZXIgaW4gYW55IGxvY2FsZS4KKyAgIFdlIGRlZmluZSB0aGlzIHZhbHVlIGhlcmUgc2luY2UgdGhlIGdjYyBoZWFkZXIgZG9lcyBub3QgZGVmaW5lCisgICB0aGUgY29ycmVjdCB2YWx1ZS4gICovCisjZGVmaW5lIE1CX0xFTl9NQVgJMTYKKworCisvKiBJZiB3ZSBhcmUgbm90IHVzaW5nIEdOVSBDQyB3ZSBoYXZlIHRvIGRlZmluZSBhbGwgdGhlIHN5bWJvbHMgb3Vyc2VsZi4KKyAgIE90aGVyd2lzZSB1c2UgZ2NjJ3MgZGVmaW5pdGlvbnMgKHNlZSBiZWxvdykuICAqLworI2lmICFkZWZpbmVkIF9fR05VQ19fIHx8IF9fR05VQ19fIDwgMgorCisvKiBXZSBvbmx5IHByb3RlY3QgZnJvbSBtdWx0aXBsZSBpbmNsdXNpb24gaGVyZSwgYmVjYXVzZSBhbGwgdGhlIG90aGVyCisgICAjaW5jbHVkZSdzIHByb3RlY3QgdGhlbXNlbHZlcywgYW5kIGluIEdDQyAyIHdlIG1heSAjaW5jbHVkZV9uZXh0IHRocm91Z2gKKyAgIG11bHRpcGxlIGNvcGllcyBvZiB0aGlzIGZpbGUgYmVmb3JlIHdlIGdldCB0byBHQ0Mncy4gICovCisjIGlmbmRlZiBfTElNSVRTX0gKKyMgIGRlZmluZSBfTElNSVRTX0gJMQorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisvKiBXZSBkb24ndCBoYXZlICNpbmNsdWRlX25leHQuCisgICBEZWZpbmUgQU5TSSA8bGltaXRzLmg+IGZvciBzdGFuZGFyZCAzMi1iaXQgd29yZHMuICAqLworCisvKiBUaGVzZSBhc3N1bWUgOC1iaXQgYGNoYXIncywgMTYtYml0IGBzaG9ydCBpbnQncywKKyAgIGFuZCAzMi1iaXQgYGludCdzIGFuZCBgbG9uZyBpbnQncy4gICovCisKKy8qIE51bWJlciBvZiBiaXRzIGluIGEgYGNoYXInLgkqLworIyAgZGVmaW5lIENIQVJfQklUCTgKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGNoYXInIGNhbiBob2xkLiAgKi8KKyMgIGRlZmluZSBTQ0hBUl9NSU4JKC0xMjgpCisjICBkZWZpbmUgU0NIQVJfTUFYCTEyNworCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBjaGFyJyBjYW4gaG9sZC4gIChNaW5pbXVtIGlzIDAuKSAgKi8KKyMgIGRlZmluZSBVQ0hBUl9NQVgJMjU1CisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYGNoYXInIGNhbiBob2xkLiAgKi8KKyMgIGlmZGVmIF9fQ0hBUl9VTlNJR05FRF9fCisjICAgZGVmaW5lIENIQVJfTUlOCTAKKyMgICBkZWZpbmUgQ0hBUl9NQVgJVUNIQVJfTUFYCisjICBlbHNlCisjICAgZGVmaW5lIENIQVJfTUlOCVNDSEFSX01JTgorIyAgIGRlZmluZSBDSEFSX01BWAlTQ0hBUl9NQVgKKyMgIGVuZGlmCisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBzaG9ydCBpbnQnIGNhbiBob2xkLiAgKi8KKyMgIGRlZmluZSBTSFJUX01JTgkoLTMyNzY4KQorIyAgZGVmaW5lIFNIUlRfTUFYCTMyNzY3CisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIHNob3J0IGludCcgY2FuIGhvbGQuICAoTWluaW11bSBpcyAwLikgICovCisjICBkZWZpbmUgVVNIUlRfTUFYCTY1NTM1CisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBpbnQnIGNhbiBob2xkLiAgKi8KKyMgIGRlZmluZSBJTlRfTUlOCSgtSU5UX01BWCAtIDEpCisjICBkZWZpbmUgSU5UX01BWAkyMTQ3NDgzNjQ3CisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIGludCcgY2FuIGhvbGQuICAoTWluaW11bSBpcyAwLikgICovCisjICBkZWZpbmUgVUlOVF9NQVgJNDI5NDk2NzI5NVUKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGxvbmcgaW50JyBjYW4gaG9sZC4gICovCisjICBpZiBfX1dPUkRTSVpFID09IDY0CisjICAgZGVmaW5lIExPTkdfTUFYCTkyMjMzNzIwMzY4NTQ3NzU4MDdMCisjICBlbHNlCisjICAgZGVmaW5lIExPTkdfTUFYCTIxNDc0ODM2NDdMCisjICBlbmRpZgorIyAgZGVmaW5lIExPTkdfTUlOCSgtTE9OR19NQVggLSAxTCkKKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgbG9uZyBpbnQnIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMC4pICAqLworIyAgaWYgX19XT1JEU0laRSA9PSA2NAorIyAgIGRlZmluZSBVTE9OR19NQVgJMTg0NDY3NDQwNzM3MDk1NTE2MTVVTAorIyAgZWxzZQorIyAgIGRlZmluZSBVTE9OR19NQVgJNDI5NDk2NzI5NVVMCisjICBlbmRpZgorCisjICBpZmRlZiBfX1VTRV9JU09DOTkKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGxvbmcgbG9uZyBpbnQnIGNhbiBob2xkLiAgKi8KKyMgICBkZWZpbmUgTExPTkdfTUFYCTkyMjMzNzIwMzY4NTQ3NzU4MDdMTAorIyAgIGRlZmluZSBMTE9OR19NSU4JKC1MTE9OR19NQVggLSAxTEwpCisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQnIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMC4pICAqLworIyAgIGRlZmluZSBVTExPTkdfTUFYCTE4NDQ2NzQ0MDczNzA5NTUxNjE1VUxMCisKKyMgIGVuZGlmIC8qIElTTyBDOTkgKi8KKworIyBlbmRpZgkvKiBsaW1pdHMuaCAgKi8KKyNlbmRpZgkvKiBHQ0MgMi4gICovCisKKyNlbmRpZgkvKiAhX0xJQkNfTElNSVRTX0hfICovCisKKyAvKiBHZXQgdGhlIGNvbXBpbGVyJ3MgbGltaXRzLmgsIHdoaWNoIGRlZmluZXMgYWxtb3N0IGFsbCB0aGUgSVNPIGNvbnN0YW50cy4KKworICAgIFdlIHB1dCB0aGlzICNpbmNsdWRlX25leHQgb3V0c2lkZSB0aGUgZG91YmxlIGluY2x1c2lvbiBjaGVjayBiZWNhdXNlCisgICAgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGluY2x1ZGUgdGhpcyBmaWxlIG1vcmUgdGhhbiBvbmNlIGFuZCBzdGlsbCBnZXQKKyAgICB0aGUgZGVmaW5pdGlvbnMgZnJvbSBnY2MncyBoZWFkZXIuICAqLworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgIWRlZmluZWQgX0dDQ19MSU1JVFNfSF8KKy8qIGBfR0NDX0xJTUlUU19IXycgaXMgd2hhdCBHQ0MncyBmaWxlIGRlZmluZXMuICAqLworIyBpbmNsdWRlX25leHQgPGxpbWl0cy5oPgorI2VuZGlmCisKKy8qIFRoZSA8bGltaXRzLmg+IGZpbGVzIGluIHNvbWUgZ2NjIHZlcnNpb25zIGRvbid0IGRlZmluZSBMTE9OR19NSU4sCisgICBMTE9OR19NQVgsIGFuZCBVTExPTkdfTUFYLiAgSW5zdGVhZCBvbmx5IHRoZSB2YWx1ZXMgZ2NjIGRlZmluZWQgZm9yCisgICBhZ2VzIGFyZSBhdmFpbGFibGUuICAqLworI2lmIGRlZmluZWQgX19VU0VfSVNPQzk5ICYmIGRlZmluZWQgX19HTlVDX18KKyMgaWZuZGVmIExMT05HX01JTgorIyAgZGVmaW5lIExMT05HX01JTgkoLUxMT05HX01BWC0xKQorIyBlbmRpZgorIyBpZm5kZWYgTExPTkdfTUFYCisjICBkZWZpbmUgTExPTkdfTUFYCV9fTE9OR19MT05HX01BWF9fCisjIGVuZGlmCisjIGlmbmRlZiBVTExPTkdfTUFYCisjICBkZWZpbmUgVUxMT05HX01BWAkoTExPTkdfTUFYICogMlVMTCArIDEpCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmCV9fVVNFX1BPU0lYCisvKiBQT1NJWCBhZGRzIHRoaW5ncyB0byA8bGltaXRzLmg+LiAgKi8KKyMgaW5jbHVkZSA8Yml0cy9wb3NpeDFfbGltLmg+CisjZW5kaWYKKworI2lmZGVmCV9fVVNFX1BPU0lYMgorIyBpbmNsdWRlIDxiaXRzL3Bvc2l4Ml9saW0uaD4KKyNlbmRpZgorCisjaWZkZWYJX19VU0VfWE9QRU4KKyMgaW5jbHVkZSA8Yml0cy94b3Blbl9saW0uaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW5rLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzY1MzFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW5rLmgKQEAgLTAsMCArMSwxOTQgQEAKKy8qIERhdGEgc3RydWN0dXJlIGZvciBjb21tdW5pY2F0aW9uIGZyb20gdGhlIHJ1bi10aW1lIGR5bmFtaWMgbGlua2VyIGZvcgorICAgbG9hZGVkIEVMRiBzaGFyZWQgb2JqZWN0cy4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0yMDAxLCAyMDA0LCAyMDA1LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9MSU5LX0gKKyNkZWZpbmUJX0xJTktfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGVsZi5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qIFdlIHVzZSB0aGlzIG1hY3JvIHRvIHJlZmVyIHRvIEVMRiB0eXBlcyBpbmRlcGVuZGVudCBvZiB0aGUgbmF0aXZlIHdvcmRzaXplLgorICAgYEVsZlcoVFlQRSknIGlzIHVzZWQgaW4gcGxhY2Ugb2YgYEVsZjMyX1RZUEUnIG9yIGBFbGY2NF9UWVBFJy4gICovCisjZGVmaW5lIEVsZlcodHlwZSkJX0VsZlcgKEVsZiwgX19FTEZfTkFUSVZFX0NMQVNTLCB0eXBlKQorI2RlZmluZSBfRWxmVyhlLHcsdCkJX0VsZldfMSAoZSwgdywgXyMjdCkKKyNkZWZpbmUgX0VsZldfMShlLHcsdCkJZSMjdyMjdAorCisjaW5jbHVkZSA8Yml0cy9lbGZjbGFzcy5oPgkJLyogRGVmaW5lcyBfX0VMRl9OQVRJVkVfQ0xBU1MuICAqLworI2luY2x1ZGUgPGJpdHMvbGluay5oPgorCisvKiBSZW5kZXp2b3VzIHN0cnVjdHVyZSB1c2VkIGJ5IHRoZSBydW4tdGltZSBkeW5hbWljIGxpbmtlciB0byBjb21tdW5pY2F0ZQorICAgZGV0YWlscyBvZiBzaGFyZWQgb2JqZWN0IGxvYWRpbmcgdG8gdGhlIGRlYnVnZ2VyLiAgSWYgdGhlIGV4ZWN1dGFibGUncworICAgZHluYW1pYyBzZWN0aW9uIGhhcyBhIERUX0RFQlVHIGVsZW1lbnQsIHRoZSBydW4tdGltZSBsaW5rZXIgc2V0cyB0aGF0CisgICBlbGVtZW50J3MgdmFsdWUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgdGhpcyBzdHJ1Y3R1cmUgY2FuIGJlIGZvdW5kLiAgKi8KKworc3RydWN0IHJfZGVidWcKKyAgeworICAgIGludCByX3ZlcnNpb247CQkvKiBWZXJzaW9uIG51bWJlciBmb3IgdGhpcyBwcm90b2NvbC4gICovCisKKyAgICBzdHJ1Y3QgbGlua19tYXAgKnJfbWFwOwkvKiBIZWFkIG9mIHRoZSBjaGFpbiBvZiBsb2FkZWQgb2JqZWN0cy4gICovCisKKyAgICAvKiBUaGlzIGlzIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gaW50ZXJuYWwgdG8gdGhlIHJ1bi10aW1lIGxpbmtlciwKKyAgICAgICB0aGF0IHdpbGwgYWx3YXlzIGJlIGNhbGxlZCB3aGVuIHRoZSBsaW5rZXIgYmVnaW5zIHRvIG1hcCBpbiBhCisgICAgICAgbGlicmFyeSBvciB1bm1hcCBpdCwgYW5kIGFnYWluIHdoZW4gdGhlIG1hcHBpbmcgY2hhbmdlIGlzIGNvbXBsZXRlLgorICAgICAgIFRoZSBkZWJ1Z2dlciBjYW4gc2V0IGEgYnJlYWtwb2ludCBhdCB0aGlzIGFkZHJlc3MgaWYgaXQgd2FudHMgdG8KKyAgICAgICBub3RpY2Ugc2hhcmVkIG9iamVjdCBtYXBwaW5nIGNoYW5nZXMuICAqLworICAgIEVsZlcoQWRkcikgcl9icms7CisgICAgZW51bQorICAgICAgeworCS8qIFRoaXMgc3RhdGUgdmFsdWUgZGVzY3JpYmVzIHRoZSBtYXBwaW5nIGNoYW5nZSB0YWtpbmcgcGxhY2Ugd2hlbgorCSAgIHRoZSBgcl9icmsnIGFkZHJlc3MgaXMgY2FsbGVkLiAgKi8KKwlSVF9DT05TSVNURU5ULAkJLyogTWFwcGluZyBjaGFuZ2UgaXMgY29tcGxldGUuICAqLworCVJUX0FERCwJCQkvKiBCZWdpbm5pbmcgdG8gYWRkIGEgbmV3IG9iamVjdC4gICovCisJUlRfREVMRVRFCQkvKiBCZWdpbm5pbmcgdG8gcmVtb3ZlIGFuIG9iamVjdCBtYXBwaW5nLiAgKi8KKyAgICAgIH0gcl9zdGF0ZTsKKworICAgIEVsZlcoQWRkcikgcl9sZGJhc2U7CS8qIEJhc2UgYWRkcmVzcyB0aGUgbGlua2VyIGlzIGxvYWRlZCBhdC4gICovCisgIH07CisKKy8qIFRoaXMgaXMgdGhlIGluc3RhbmNlIG9mIHRoYXQgc3RydWN0dXJlIHVzZWQgYnkgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KK2V4dGVybiBzdHJ1Y3Qgcl9kZWJ1ZyBfcl9kZWJ1ZzsKKworLyogVGhpcyBzeW1ib2wgcmVmZXJzIHRvIHRoZSAiZHluYW1pYyBzdHJ1Y3R1cmUiIGluIHRoZSBgLmR5bmFtaWMnIHNlY3Rpb24KKyAgIG9mIHdoYXRldmVyIG1vZHVsZSByZWZlcnMgdG8gYF9EWU5BTUlDJy4gIFNvLCB0byBmaW5kIGl0cyBvd24KKyAgIGBzdHJ1Y3Qgcl9kZWJ1ZycsIGEgcHJvZ3JhbSBjb3VsZCBkbzoKKyAgICAgZm9yIChkeW4gPSBfRFlOQU1JQzsgZHluLT5kX3RhZyAhPSBEVF9OVUxMOyArK2R5bikKKyAgICAgICBpZiAoZHluLT5kX3RhZyA9PSBEVF9ERUJVRykKKwkgcl9kZWJ1ZyA9IChzdHJ1Y3Qgcl9kZWJ1ZyAqKSBkeW4tPmRfdW4uZF9wdHI7CisgICAqLworZXh0ZXJuIEVsZlcoRHluKSBfRFlOQU1JQ1tdOworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIGxvYWRlZCBzaGFyZWQgb2JqZWN0LiAgVGhlIGBsX25leHQnIGFuZCBgbF9wcmV2JworICAgbWVtYmVycyBmb3JtIGEgY2hhaW4gb2YgYWxsIHRoZSBzaGFyZWQgb2JqZWN0cyBsb2FkZWQgYXQgc3RhcnR1cC4KKworICAgVGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIGV4aXN0IGluIHNwYWNlIHVzZWQgYnkgdGhlIHJ1bi10aW1lIGR5bmFtaWMgbGlua2VyOworICAgbW9kaWZ5aW5nIHRoZW0gbWF5IGhhdmUgZGlzYXN0cm91cyByZXN1bHRzLiAgKi8KKworc3RydWN0IGxpbmtfbWFwCisgIHsKKyAgICAvKiBUaGVzZSBmaXJzdCBmZXcgbWVtYmVycyBhcmUgcGFydCBvZiB0aGUgcHJvdG9jb2wgd2l0aCB0aGUgZGVidWdnZXIuCisgICAgICAgVGhpcyBpcyB0aGUgc2FtZSBmb3JtYXQgdXNlZCBpbiBTVlI0LiAgKi8KKworICAgIEVsZlcoQWRkcikgbF9hZGRyOwkJLyogQmFzZSBhZGRyZXNzIHNoYXJlZCBvYmplY3QgaXMgbG9hZGVkIGF0LiAgKi8KKyAgICBjaGFyICpsX25hbWU7CQkvKiBBYnNvbHV0ZSBmaWxlIG5hbWUgb2JqZWN0IHdhcyBmb3VuZCBpbi4gICovCisgICAgRWxmVyhEeW4pICpsX2xkOwkJLyogRHluYW1pYyBzZWN0aW9uIG9mIHRoZSBzaGFyZWQgb2JqZWN0LiAgKi8KKyAgICBzdHJ1Y3QgbGlua19tYXAgKmxfbmV4dCwgKmxfcHJldjsgLyogQ2hhaW4gb2YgbG9hZGVkIG9iamVjdHMuICAqLworICB9OworCisjaWZkZWYgX19VU0VfR05VCisKKy8qIFZlcnNpb24gbnVtYmVycyBmb3IgbGFfdmVyc2lvbiBoYW5kc2hha2UgaW50ZXJmYWNlLiAgKi8KKyNkZWZpbmUgTEFWX0NVUlJFTlQJMQorCisvKiBBY3Rpdml0eSB0eXBlcyBzaWduYWxlZCB0aHJvdWdoIGxhX2FjdGl2aXR5LiAgKi8KK2VudW0KKyAgeworICAgIExBX0FDVF9DT05TSVNURU5ULAkJLyogTGluayBtYXAgY29uc2lzdGVudCBhZ2Fpbi4gICovCisgICAgTEFfQUNUX0FERCwJCQkvKiBOZXcgb2JqZWN0IHdpbGwgYmUgYWRkZWQuICAqLworICAgIExBX0FDVF9ERUxFVEUJCS8qIE9iamVjdHMgd2lsbCBiZSByZW1vdmVkLiAgKi8KKyAgfTsKKworLyogVmFsdWVzIHJlcHJlc2VudGluZyBvcmlnaW4gb2YgbmFtZSBmb3IgZHluYW1pYyBsb2FkaW5nLiAgKi8KK2VudW0KKyAgeworICAgIExBX1NFUl9PUklHID0gMHgwMSwJCS8qIE9yaWdpbmFsIG5hbWUuICAqLworICAgIExBX1NFUl9MSUJQQVRIID0gMHgwMiwJLyogRGlyZWN0b3J5IGZyb20gTERfTElCUkFSWV9QQVRILiAgKi8KKyAgICBMQV9TRVJfUlVOUEFUSCA9IDB4MDQsCS8qIERpcmVjdG9yeSBmcm9tIFJQQVRIL1JVTlBBVEguICAqLworICAgIExBX1NFUl9DT05GSUcgPSAweDA4LAkvKiBGb3VuZCB0aHJvdWdoIGxkY29uZmlnLiAgKi8KKyAgICBMQV9TRVJfREVGQVVMVCA9IDB4NDAsCS8qIERlZmF1bHQgZGlyZWN0b3J5LiAgKi8KKyAgICBMQV9TRVJfU0VDVVJFID0gMHg4MAkvKiBVbnVzZWQuICAqLworICB9OworCisvKiBWYWx1ZXMgZm9yIGxhX29iam9wZW4gcmV0dXJuIHZhbHVlLiAgKi8KK2VudW0KKyAgeworICAgIExBX0ZMR19CSU5EVE8gPSAweDAxLAkvKiBBdWRpdCBzeW1ib2xzIGJvdW5kIHRvIHRoaXMgb2JqZWN0LiAgKi8KKyAgICBMQV9GTEdfQklOREZST00gPSAweDAyCS8qIEF1ZGl0IHN5bWJvbHMgYm91bmQgZnJvbSB0aGlzIG9iamVjdC4gICovCisgIH07CisKKy8qIFZhbHVlcyBmb3IgbGFfc3ltYmluZCBmbGFncyBwYXJhbWV0ZXIuICAqLworZW51bQorICB7CisgICAgTEFfU1lNQl9OT1BMVEVOVEVSID0gMHgwMSwJLyogbGFfcGx0ZW50ZXIgd2lsbCBub3QgYmUgY2FsbGVkLiAgKi8KKyAgICBMQV9TWU1CX05PUExURVhJVCA9IDB4MDIsCS8qIGxhX3BsdGV4aXQgd2lsbCBub3QgYmUgY2FsbGVkLiAgKi8KKyAgICBMQV9TWU1CX1NUUlVDVENBTEwgPSAweDA0LAkvKiBSZXR1cm4gdmFsdWUgaXMgYSBzdHJ1Y3R1cmUuICAqLworICAgIExBX1NZTUJfRExTWU0gPSAweDA4LAkvKiBCaW5kaW5nIGR1ZSB0byBkbHN5bSBjYWxsLiAgKi8KKyAgICBMQV9TWU1CX0FMVFZBTFVFID0gMHgxMAkvKiBWYWx1ZSBoYXMgYmVlbiBjaGFuZ2VkIGJ5IGEgcHJldmlvdXMKKwkJCQkgICBsYV9zeW1iaW5kIGNhbGwuICAqLworICB9OworCitzdHJ1Y3QgZGxfcGhkcl9pbmZvCisgIHsKKyAgICBFbGZXKEFkZHIpIGRscGlfYWRkcjsKKyAgICBjb25zdCBjaGFyICpkbHBpX25hbWU7CisgICAgY29uc3QgRWxmVyhQaGRyKSAqZGxwaV9waGRyOworICAgIEVsZlcoSGFsZikgZGxwaV9waG51bTsKKworICAgIC8qIE5vdGU6IEZvbGxvd2luZyBtZW1iZXJzIHdlcmUgaW50cm9kdWNlZCBhZnRlciB0aGUgZmlyc3QKKyAgICAgICB2ZXJzaW9uIG9mIHRoaXMgc3RydWN0dXJlIHdhcyBhdmFpbGFibGUuICBDaGVjayB0aGUgU0laRQorICAgICAgIGFyZ3VtZW50IHBhc3NlZCB0byB0aGUgZGxfaXRlcmF0ZV9waGRyIGNhbGxiYWNrIHRvIGRldGVybWluZQorICAgICAgIHdoZXRoZXIgb3Igbm90IGVhY2ggbGF0ZXIgbWVtYmVyIGlzIGF2YWlsYWJsZS4gICovCisKKyAgICAvKiBJbmNyZW1lbnRlZCB3aGVuIGEgbmV3IG9iamVjdCBtYXkgaGF2ZSBiZWVuIGFkZGVkLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgaW50IGRscGlfYWRkczsKKyAgICAvKiBJbmNyZW1lbnRlZCB3aGVuIGFuIG9iamVjdCBtYXkgaGF2ZSBiZWVuIHJlbW92ZWQuICAqLworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgZGxwaV9zdWJzOworCisgICAgLyogSWYgdGhlcmUgaXMgYSBQVF9UTFMgc2VnbWVudCwgaXRzIG1vZHVsZSBJRCBhcyB1c2VkIGluCisgICAgICAgVExTIHJlbG9jYXRpb25zLCBlbHNlIHplcm8uICAqLworICAgIHNpemVfdCBkbHBpX3Rsc19tb2RpZDsKKworICAgIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBjYWxsaW5nIHRocmVhZCdzIGluc3RhbmNlIG9mIHRoaXMgbW9kdWxlJ3MKKyAgICAgICBQVF9UTFMgc2VnbWVudCwgaWYgaXQgaGFzIG9uZSBhbmQgaXQgaGFzIGJlZW4gYWxsb2NhdGVkCisgICAgICAgaW4gdGhlIGNhbGxpbmcgdGhyZWFkLCBvdGhlcndpc2UgYSBudWxsIHBvaW50ZXIuICAqLworICAgIHZvaWQgKmRscGlfdGxzX2RhdGE7CisgIH07CisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIGludCBkbF9pdGVyYXRlX3BoZHIgKGludCAoKl9fY2FsbGJhY2spIChzdHJ1Y3QgZGxfcGhkcl9pbmZvICosCisJCQkJCSAgICAgICBzaXplX3QsIHZvaWQgKiksCisJCQkgICAgdm9pZCAqX19kYXRhKTsKKworCisvKiBQcm90b3R5cGVzIGZvciB0aGUgbGQuc28gYXVkaXRpbmcgaW50ZXJmYWNlcy4gIFRoZXNlIGFyZSBub3QKKyAgIGRlZmluZWQgYW55d2hlcmUgaW4gbGQuc28gYnV0IGluc3RlYWQgaGF2ZSB0byBiZSBwcm92aWRlZCBieSB0aGUKKyAgIGF1ZGl0aW5nIERTTy4gICovCitleHRlcm4gdW5zaWduZWQgaW50IGxhX3ZlcnNpb24gKHVuc2lnbmVkIGludCBfX3ZlcnNpb24pOworZXh0ZXJuIHZvaWQgbGFfYWN0aXZpdHkgKHVpbnRwdHJfdCAqX19jb29raWUsIHVuc2lnbmVkIGludCBfX2ZsYWcpOworZXh0ZXJuIGNoYXIgKmxhX29ianNlYXJjaCAoY29uc3QgY2hhciAqX19uYW1lLCB1aW50cHRyX3QgKl9fY29va2llLAorCQkJICAgdW5zaWduZWQgaW50IF9fZmxhZyk7CitleHRlcm4gdW5zaWduZWQgaW50IGxhX29iam9wZW4gKHN0cnVjdCBsaW5rX21hcCAqX19tYXAsIExtaWRfdCBfX2xtaWQsCisJCQkJdWludHB0cl90ICpfX2Nvb2tpZSk7CitleHRlcm4gdm9pZCBsYV9wcmVpbml0ICh1aW50cHRyX3QgKl9fY29va2llKTsKK2V4dGVybiB1aW50cHRyX3QgbGFfc3ltYmluZDMyIChFbGYzMl9TeW0gKl9fc3ltLCB1bnNpZ25lZCBpbnQgX19uZHgsCisJCQkgICAgICAgdWludHB0cl90ICpfX3JlZmNvb2ssIHVpbnRwdHJfdCAqX19kZWZjb29rLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqX19mbGFncywgY29uc3QgY2hhciAqX19zeW1uYW1lKTsKK2V4dGVybiB1aW50cHRyX3QgbGFfc3ltYmluZDY0IChFbGY2NF9TeW0gKl9fc3ltLCB1bnNpZ25lZCBpbnQgX19uZHgsCisJCQkgICAgICAgdWludHB0cl90ICpfX3JlZmNvb2ssIHVpbnRwdHJfdCAqX19kZWZjb29rLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqX19mbGFncywgY29uc3QgY2hhciAqX19zeW1uYW1lKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbGFfb2JqY2xvc2UgKHVpbnRwdHJfdCAqX19jb29raWUpOworCitfX0VORF9ERUNMUworCisjZW5kaWYKKworI2VuZGlmIC8qIGxpbmsuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hLm91dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hLm91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMjcxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Eub3V0LmgKQEAgLTAsMCArMSwyNzAgQEAKKyNpZm5kZWYgX19BX09VVF9HTlVfSF9fCisjZGVmaW5lIF9fQV9PVVRfR05VX0hfXworCisjZGVmaW5lIF9fR05VX0VYRUNfTUFDUk9TX18KKworI2lmbmRlZiBfX1NUUlVDVF9FWEVDX09WRVJSSURFX18KKworI2luY2x1ZGUgPGFzbS9hLm91dC5oPgorCisjZW5kaWYgLyogX19TVFJVQ1RfRVhFQ19PVkVSUklERV9fICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKy8qIHRoZXNlIGdvIGluIHRoZSBOX01BQ0hUWVBFIGZpZWxkICovCitlbnVtIG1hY2hpbmVfdHlwZSB7CisjaWYgZGVmaW5lZCAoTV9PTERTVU4yKQorICBNX19PTERTVU4yID0gTV9PTERTVU4yLAorI2Vsc2UKKyAgTV9PTERTVU4yID0gMCwKKyNlbmRpZgorI2lmIGRlZmluZWQgKE1fNjgwMTApCisgIE1fXzY4MDEwID0gTV82ODAxMCwKKyNlbHNlCisgIE1fNjgwMTAgPSAxLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoTV82ODAyMCkKKyAgTV9fNjgwMjAgPSBNXzY4MDIwLAorI2Vsc2UKKyAgTV82ODAyMCA9IDIsCisjZW5kaWYKKyNpZiBkZWZpbmVkIChNX1NQQVJDKQorICBNX19TUEFSQyA9IE1fU1BBUkMsCisjZWxzZQorICBNX1NQQVJDID0gMywKKyNlbmRpZgorICAvKiBza2lwIGEgYnVuY2ggc28gd2UgZG9uJ3QgcnVuIGludG8gYW55IG9mIHN1bidzIG51bWJlcnMgKi8KKyAgTV8zODYgPSAxMDAsCisgIE1fTUlQUzEgPSAxNTEsCS8qIE1JUFMgUjMwMDAvUjMwMDAgYmluYXJ5ICovCisgIE1fTUlQUzIgPSAxNTIJCS8qIE1JUFMgUjYwMDAvUjQwMDAgYmluYXJ5ICovCit9OworCisjaWYgIWRlZmluZWQgKE5fTUFHSUMpCisjZGVmaW5lIE5fTUFHSUMoZXhlYykgKChleGVjKS5hX2luZm8gJiAweGZmZmYpCisjZW5kaWYKKyNkZWZpbmUgTl9NQUNIVFlQRShleGVjKSAoKGVudW0gbWFjaGluZV90eXBlKSgoKGV4ZWMpLmFfaW5mbyA+PiAxNikgJiAweGZmKSkKKyNkZWZpbmUgTl9GTEFHUyhleGVjKSAoKChleGVjKS5hX2luZm8gPj4gMjQpICYgMHhmZikKKyNkZWZpbmUgTl9TRVRfSU5GTyhleGVjLCBtYWdpYywgdHlwZSwgZmxhZ3MpIFwKKwkoKGV4ZWMpLmFfaW5mbyA9ICgobWFnaWMpICYgMHhmZmZmKSBcCisJIHwgKCgoaW50KSh0eXBlKSAmIDB4ZmYpIDw8IDE2KSBcCisJIHwgKCgoZmxhZ3MpICYgMHhmZikgPDwgMjQpKQorI2RlZmluZSBOX1NFVF9NQUdJQyhleGVjLCBtYWdpYykgXAorCSgoZXhlYykuYV9pbmZvID0gKCgoZXhlYykuYV9pbmZvICYgMHhmZmZmMDAwMCkgfCAoKG1hZ2ljKSAmIDB4ZmZmZikpKQorCisjZGVmaW5lIE5fU0VUX01BQ0hUWVBFKGV4ZWMsIG1hY2h0eXBlKSBcCisJKChleGVjKS5hX2luZm8gPSBcCisJICgoZXhlYykuYV9pbmZvJjB4ZmYwMGZmZmYpIHwgKCgoKGludCkobWFjaHR5cGUpKSYweGZmKSA8PCAxNikpCisKKyNkZWZpbmUgTl9TRVRfRkxBR1MoZXhlYywgZmxhZ3MpIFwKKwkoKGV4ZWMpLmFfaW5mbyA9IFwKKwkgKChleGVjKS5hX2luZm8mMHgwMGZmZmZmZikgfCAoKChmbGFncykgJiAweGZmKSA8PCAyNCkpCisKKy8qIENvZGUgaW5kaWNhdGluZyBvYmplY3QgZmlsZSBvciBpbXB1cmUgZXhlY3V0YWJsZS4gICovCisjZGVmaW5lIE9NQUdJQyAwNDA3CisvKiBDb2RlIGluZGljYXRpbmcgcHVyZSBleGVjdXRhYmxlLiAgKi8KKyNkZWZpbmUgTk1BR0lDIDA0MTAKKy8qIENvZGUgaW5kaWNhdGluZyBkZW1hbmQtcGFnZWQgZXhlY3V0YWJsZS4gICovCisjZGVmaW5lIFpNQUdJQyAwNDEzCisvKiBUaGlzIGluZGljYXRlcyBhIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlIHdpdGggdGhlIGhlYWRlciBpbiB0aGUgdGV4dC4gCisgICBUaGUgZmlyc3QgcGFnZSBpcyB1bm1hcHBlZCB0byBoZWxwIHRyYXAgTlVMTCBwb2ludGVyIHJlZmVyZW5jZXMgKi8KKyNkZWZpbmUgUU1BR0lDIDAzMTQKKworLyogQ29kZSBpbmRpY2F0aW5nIGNvcmUgZmlsZS4gICovCisjZGVmaW5lIENNQUdJQyAwNDIxCisKKyNpZiAhZGVmaW5lZCAoTl9CQURNQUcpCisjZGVmaW5lIE5fQkFETUFHKHgpCSAgKE5fTUFHSUMoeCkgIT0gT01BR0lDCQlcCisJCQkmJiBOX01BR0lDKHgpICE9IE5NQUdJQwkJXAorICAJCQkmJiBOX01BR0lDKHgpICE9IFpNQUdJQyBcCisJCSAgICAgICAgJiYgTl9NQUdJQyh4KSAhPSBRTUFHSUMpCisjZW5kaWYKKworI2RlZmluZSBfTl9IRFJPRkYoeCkgKDEwMjQgLSBzaXplb2YgKHN0cnVjdCBleGVjKSkKKworI2lmICFkZWZpbmVkIChOX1RYVE9GRikKKyNkZWZpbmUgTl9UWFRPRkYoeCkgXAorIChOX01BR0lDKHgpID09IFpNQUdJQyA/IF9OX0hEUk9GRigoeCkpICsgc2l6ZW9mIChzdHJ1Y3QgZXhlYykgOiBcCisgIChOX01BR0lDKHgpID09IFFNQUdJQyA/IDAgOiBzaXplb2YgKHN0cnVjdCBleGVjKSkpCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChOX0RBVE9GRikKKyNkZWZpbmUgTl9EQVRPRkYoeCkgKE5fVFhUT0ZGKHgpICsgKHgpLmFfdGV4dCkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKE5fVFJFTE9GRikKKyNkZWZpbmUgTl9UUkVMT0ZGKHgpIChOX0RBVE9GRih4KSArICh4KS5hX2RhdGEpCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChOX0RSRUxPRkYpCisjZGVmaW5lIE5fRFJFTE9GRih4KSAoTl9UUkVMT0ZGKHgpICsgTl9UUlNJWkUoeCkpCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChOX1NZTU9GRikKKyNkZWZpbmUgTl9TWU1PRkYoeCkgKE5fRFJFTE9GRih4KSArIE5fRFJTSVpFKHgpKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoTl9TVFJPRkYpCisjZGVmaW5lIE5fU1RST0ZGKHgpIChOX1NZTU9GRih4KSArIE5fU1lNU0laRSh4KSkKKyNlbmRpZgorCisvKiBBZGRyZXNzIG9mIHRleHQgc2VnbWVudCBpbiBtZW1vcnkgYWZ0ZXIgaXQgaXMgbG9hZGVkLiAgKi8KKyNpZiAhZGVmaW5lZCAoTl9UWFRBRERSKQorI2RlZmluZSBOX1RYVEFERFIoeCkgKE5fTUFHSUMoeCkgPT0gUU1BR0lDID8gUEFHRV9TSVpFIDogMCkKKyNlbmRpZgorCisvKiBBZGRyZXNzIG9mIGRhdGEgc2VnbWVudCBpbiBtZW1vcnkgYWZ0ZXIgaXQgaXMgbG9hZGVkLgorICAgTm90ZSB0aGF0IGl0IGlzIHVwIHRvIHlvdSB0byBkZWZpbmUgU0VHTUVOVF9TSVpFCisgICBvbiBtYWNoaW5lcyBub3QgbGlzdGVkIGhlcmUuICAqLworI2lmIGRlZmluZWQodmF4KSB8fCBkZWZpbmVkKGhwMzAwKSB8fCBkZWZpbmVkKHB5cikKKyNkZWZpbmUgU0VHTUVOVF9TSVpFIHBhZ2Vfc2l6ZQorI2VuZGlmCisjaWZkZWYJc29ueQorI2RlZmluZQlTRUdNRU5UX1NJWkUJMHgyMDAwCisjZW5kaWYJLyogU29ueS4gICovCisjaWZkZWYgaXM2OGsKKyNkZWZpbmUgU0VHTUVOVF9TSVpFIDB4MjAwMDAKKyNlbmRpZgorI2lmIGRlZmluZWQobTY4aykgJiYgZGVmaW5lZChQT1JUQVIpCisjZGVmaW5lIFBBR0VfU0laRSAweDQwMAorI2RlZmluZSBTRUdNRU5UX1NJWkUgUEFHRV9TSVpFCisjZW5kaWYKKworI2lmZGVmIGxpbnV4CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX21jNjgwMDBfXykKKyNkZWZpbmUgU0VHTUVOVF9TSVpFCTEwMjQKKyNlbHNlCisjaWZuZGVmIFNFR01FTlRfU0laRQorI2RlZmluZSBTRUdNRU5UX1NJWkUgICBnZXRwYWdlc2l6ZSgpCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgX05fU0VHTUVOVF9ST1VORCh4KSBBTElHTih4LCBTRUdNRU5UX1NJWkUpCisKKyNkZWZpbmUgX05fVFhURU5EQUREUih4KSAoTl9UWFRBRERSKHgpKyh4KS5hX3RleHQpCisKKyNpZm5kZWYgTl9EQVRBRERSCisjZGVmaW5lIE5fREFUQUREUih4KSBcCisgICAgKE5fTUFHSUMoeCk9PU9NQUdJQz8gKF9OX1RYVEVOREFERFIoeCkpIFwKKyAgICAgOiAoX05fU0VHTUVOVF9ST1VORCAoX05fVFhURU5EQUREUih4KSkpKQorI2VuZGlmCisKKy8qIEFkZHJlc3Mgb2YgYnNzIHNlZ21lbnQgaW4gbWVtb3J5IGFmdGVyIGl0IGlzIGxvYWRlZC4gICovCisjaWYgIWRlZmluZWQgKE5fQlNTQUREUikKKyNkZWZpbmUgTl9CU1NBRERSKHgpIChOX0RBVEFERFIoeCkgKyAoeCkuYV9kYXRhKQorI2VuZGlmCisMCisjaWYgIWRlZmluZWQgKE5fTkxJU1RfREVDTEFSRUQpCitzdHJ1Y3Qgbmxpc3QgeworICB1bmlvbiB7CisgICAgY2hhciAqbl9uYW1lOworICAgIHN0cnVjdCBubGlzdCAqbl9uZXh0OworICAgIGxvbmcgbl9zdHJ4OworICB9IG5fdW47CisgIHVuc2lnbmVkIGNoYXIgbl90eXBlOworICBjaGFyIG5fb3RoZXI7CisgIHNob3J0IG5fZGVzYzsKKyAgdW5zaWduZWQgbG9uZyBuX3ZhbHVlOworfTsKKyNlbmRpZiAvKiBubyBOX05MSVNUX0RFQ0xBUkVELiAgKi8KKworI2lmICFkZWZpbmVkIChOX1VOREYpCisjZGVmaW5lIE5fVU5ERiAwCisjZW5kaWYKKyNpZiAhZGVmaW5lZCAoTl9BQlMpCisjZGVmaW5lIE5fQUJTIDIKKyNlbmRpZgorI2lmICFkZWZpbmVkIChOX1RFWFQpCisjZGVmaW5lIE5fVEVYVCA0CisjZW5kaWYKKyNpZiAhZGVmaW5lZCAoTl9EQVRBKQorI2RlZmluZSBOX0RBVEEgNgorI2VuZGlmCisjaWYgIWRlZmluZWQgKE5fQlNTKQorI2RlZmluZSBOX0JTUyA4CisjZW5kaWYKKyNpZiAhZGVmaW5lZCAoTl9GTikKKyNkZWZpbmUgTl9GTiAxNQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoTl9FWFQpCisjZGVmaW5lIE5fRVhUIDEKKyNlbmRpZgorI2lmICFkZWZpbmVkIChOX1RZUEUpCisjZGVmaW5lIE5fVFlQRSAwMzYKKyNlbmRpZgorI2lmICFkZWZpbmVkIChOX1NUQUIpCisjZGVmaW5lIE5fU1RBQiAwMzQwCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyB0eXBlIGluZGljYXRlcyB0aGUgZGVmaW5pdGlvbiBvZiBhIHN5bWJvbCBhcyBiZWluZworICAgYW4gaW5kaXJlY3QgcmVmZXJlbmNlIHRvIGFub3RoZXIgc3ltYm9sLiAgVGhlIG90aGVyIHN5bWJvbAorICAgYXBwZWFycyBhcyBhbiB1bmRlZmluZWQgcmVmZXJlbmNlLCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhpcyBzeW1ib2wuCisKKyAgIEluZGlyZWN0aW9uIGlzIGFzeW1tZXRyaWNhbC4gIFRoZSBvdGhlciBzeW1ib2wncyB2YWx1ZSB3aWxsIGJlIHVzZWQKKyAgIHRvIHNhdGlzZnkgcmVxdWVzdHMgZm9yIHRoZSBpbmRpcmVjdCBzeW1ib2wsIGJ1dCBub3QgdmljZSB2ZXJzYS4KKyAgIElmIHRoZSBvdGhlciBzeW1ib2wgZG9lcyBub3QgaGF2ZSBhIGRlZmluaXRpb24sIGxpYnJhcmllcyB3aWxsCisgICBiZSBzZWFyY2hlZCB0byBmaW5kIGEgZGVmaW5pdGlvbi4gICovCisjZGVmaW5lIE5fSU5EUiAweGEKKworLyogVGhlIGZvbGxvd2luZyBzeW1ib2xzIHJlZmVyIHRvIHNldCBlbGVtZW50cy4KKyAgIEFsbCB0aGUgTl9TRVRbQVREQl0gc3ltYm9scyB3aXRoIHRoZSBzYW1lIG5hbWUgZm9ybSBvbmUgc2V0LgorICAgU3BhY2UgaXMgYWxsb2NhdGVkIGZvciB0aGUgc2V0IGluIHRoZSB0ZXh0IHNlY3Rpb24sIGFuZCBlYWNoIHNldAorICAgZWxlbWVudCdzIHZhbHVlIGlzIHN0b3JlZCBpbnRvIG9uZSB3b3JkIG9mIHRoZSBzcGFjZS4KKyAgIFRoZSBmaXJzdCB3b3JkIG9mIHRoZSBzcGFjZSBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXQgKG51bWJlciBvZiBlbGVtZW50cykuCisKKyAgIFRoZSBhZGRyZXNzIG9mIHRoZSBzZXQgaXMgbWFkZSBpbnRvIGFuIE5fU0VUViBzeW1ib2wKKyAgIHdob3NlIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlIHNldC4KKyAgIFRoaXMgc3ltYm9sIGFjdHMgbGlrZSBhIE5fREFUQSBnbG9iYWwgc3ltYm9sCisgICBpbiB0aGF0IGl0IGNhbiBzYXRpc2Z5IHVuZGVmaW5lZCBleHRlcm5hbCByZWZlcmVuY2VzLiAgKi8KKworLyogVGhlc2UgYXBwZWFyIGFzIGlucHV0IHRvIExELCBpbiBhIC5vIGZpbGUuICAqLworI2RlZmluZQlOX1NFVEEJMHgxNAkJLyogQWJzb2x1dGUgc2V0IGVsZW1lbnQgc3ltYm9sICovCisjZGVmaW5lCU5fU0VUVAkweDE2CQkvKiBUZXh0IHNldCBlbGVtZW50IHN5bWJvbCAqLworI2RlZmluZQlOX1NFVEQJMHgxOAkJLyogRGF0YSBzZXQgZWxlbWVudCBzeW1ib2wgKi8KKyNkZWZpbmUJTl9TRVRCCTB4MUEJCS8qIEJzcyBzZXQgZWxlbWVudCBzeW1ib2wgKi8KKworLyogVGhpcyBpcyBvdXRwdXQgZnJvbSBMRC4gICovCisjZGVmaW5lIE5fU0VUVgkweDFDCQkvKiBQb2ludGVyIHRvIHNldCB2ZWN0b3IgaW4gZGF0YSBhcmVhLiAgKi8KKwwKKyNpZiAhZGVmaW5lZCAoTl9SRUxPQ0FUSU9OX0lORk9fREVDTEFSRUQpCisvKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBzaW5nbGUgcmVsb2NhdGlvbiB0byBiZSBwZXJmb3JtZWQuCisgICBUaGUgdGV4dC1yZWxvY2F0aW9uIHNlY3Rpb24gb2YgdGhlIGZpbGUgaXMgYSB2ZWN0b3Igb2YgdGhlc2Ugc3RydWN0dXJlcywKKyAgIGFsbCBvZiB3aGljaCBhcHBseSB0byB0aGUgdGV4dCBzZWN0aW9uLgorICAgTGlrZXdpc2UsIHRoZSBkYXRhLXJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIHRoZSBkYXRhIHNlY3Rpb24uICAqLworCitzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvCit7CisgIC8qIEFkZHJlc3MgKHdpdGhpbiBzZWdtZW50KSB0byBiZSByZWxvY2F0ZWQuICAqLworICBpbnQgcl9hZGRyZXNzOworICAvKiBUaGUgbWVhbmluZyBvZiByX3N5bWJvbG51bSBkZXBlbmRzIG9uIHJfZXh0ZXJuLiAgKi8KKyAgdW5zaWduZWQgaW50IHJfc3ltYm9sbnVtOjI0OworICAvKiBOb256ZXJvIG1lYW5zIHZhbHVlIGlzIGEgcGMtcmVsYXRpdmUgb2Zmc2V0CisgICAgIGFuZCBpdCBzaG91bGQgYmUgcmVsb2NhdGVkIGZvciBjaGFuZ2VzIGluIGl0cyBvd24gYWRkcmVzcworICAgICBhcyB3ZWxsIGFzIGZvciBjaGFuZ2VzIGluIHRoZSBzeW1ib2wgb3Igc2VjdGlvbiBzcGVjaWZpZWQuICAqLworICB1bnNpZ25lZCBpbnQgcl9wY3JlbDoxOworICAvKiBMZW5ndGggKGFzIGV4cG9uZW50IG9mIDIpIG9mIHRoZSBmaWVsZCB0byBiZSByZWxvY2F0ZWQuCisgICAgIFRodXMsIGEgdmFsdWUgb2YgMiBpbmRpY2F0ZXMgMTw8MiBieXRlcy4gICovCisgIHVuc2lnbmVkIGludCByX2xlbmd0aDoyOworICAvKiAxID0+IHJlbG9jYXRlIHdpdGggdmFsdWUgb2Ygc3ltYm9sLgorICAgICAgICAgIHJfc3ltYm9sbnVtIGlzIHRoZSBpbmRleCBvZiB0aGUgc3ltYm9sCisJICBpbiBmaWxlJ3MgdGhlIHN5bWJvbCB0YWJsZS4KKyAgICAgMCA9PiByZWxvY2F0ZSB3aXRoIHRoZSBhZGRyZXNzIG9mIGEgc2VnbWVudC4KKyAgICAgICAgICByX3N5bWJvbG51bSBpcyBOX1RFWFQsIE5fREFUQSwgTl9CU1Mgb3IgTl9BQlMKKwkgICh0aGUgTl9FWFQgYml0IG1heSBiZSBzZXQgYWxzbywgYnV0IHNpZ25pZmllcyBub3RoaW5nKS4gICovCisgIHVuc2lnbmVkIGludCByX2V4dGVybjoxOworICAvKiBGb3VyIGJpdHMgdGhhdCBhcmVuJ3QgdXNlZCwgYnV0IHdoZW4gd3JpdGluZyBhbiBvYmplY3QgZmlsZQorICAgICBpdCBpcyBkZXNpcmFibGUgdG8gY2xlYXIgdGhlbS4gICovCisjaWZkZWYgTlMzMksKKyAgdW5zaWduZWQgcl9ic3I6MTsKKyAgdW5zaWduZWQgcl9kaXNwOjE7CisgIHVuc2lnbmVkIHJfcGFkOjI7CisjZWxzZQorICB1bnNpZ25lZCBpbnQgcl9wYWQ6NDsKKyNlbmRpZgorfTsKKyNlbmRpZiAvKiBubyBOX1JFTE9DQVRJT05fSU5GT19ERUNMQVJFRC4gICovCisKKyNlbmRpZiAvKl9fQVNTRU1CTFlfXyAqLworI2VuZGlmIC8qIF9fQV9PVVRfR05VX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hY2N0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FjY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmMyZGE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hY2N0LmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiAgQlNEIFByb2Nlc3MgQWNjb3VudGluZyBmb3IgTGludXggLSBEZWZpbml0aW9ucworICoKKyAqICBBdXRob3I6IE1hcmNvIHZhbiBXaWVyaW5nZW4gKG12d0BwbGFuZXRzLmVsbS5uZXQpCisgKgorICogIFRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIG5lZWRlZCB0byBpbXBsZW1lbnQKKyAqICBCU0Qtc3R5bGUgcHJvY2VzcyBhY2NvdW50aW5nLiBUaGUga2VybmVsIGFjY291bnRpbmcgY29kZSBhbmQgYWxsCisgKiAgdXNlci1sZXZlbCBwcm9ncmFtcyB0aGF0IHRyeSB0byBkbyBzb21ldGhpbmcgdXNlZnVsIHdpdGggdGhlCisgKiAgcHJvY2VzcyBhY2NvdW50aW5nIGxvZyBtdXN0IGluY2x1ZGUgdGhpcyBmaWxlLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUgLSAxOTk3IE1hcmNvIHZhbiBXaWVyaW5nZW4gLSBFTE0gQ29uc3VsdGFuY3kgQi5WLgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9BQ0NUX0gKKyNkZWZpbmUgX0xJTlVYX0FDQ1RfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworLyogCisgKiAgY29tcF90IGlzIGEgMTYtYml0ICJmbG9hdGluZyIgcG9pbnQgbnVtYmVyIHdpdGggYSAzLWJpdCBiYXNlIDgKKyAqICBleHBvbmVudCBhbmQgYSAxMy1iaXQgZnJhY3Rpb24uCisgKiAgY29tcDJfdCBpcyAyNC1iaXQgd2l0aCA1LWJpdCBiYXNlIDIgZXhwb25lbnQgYW5kIDIwIGJpdCBmcmFjdGlvbgorICogIChsZWFkaW5nIDEgbm90IHN0b3JlZCkuCisgKiAgU2VlIGxpbnV4L2tlcm5lbC9hY2N0LmMgZm9yIHRoZSBzcGVjaWZpYyBlbmNvZGluZyBzeXN0ZW1zIHVzZWQuCisgKi8KKwordHlwZWRlZiBfX3UxNgljb21wX3Q7Cit0eXBlZGVmIF9fdTMyCWNvbXAyX3Q7CisKKy8qCisgKiAgIGFjY291bnRpbmcgZmlsZSByZWNvcmQKKyAqCisgKiAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gd3JpdHRlbiBvdXQgdG8gdGhlCisgKiAgIHByb2Nlc3MgYWNjb3VudGluZyBmaWxlIHdoZW5ldmVyIGEgcHJvY2VzcyBleGl0cy4KKyAqLworCisjZGVmaW5lIEFDQ1RfQ09NTQkxNgorCitzdHJ1Y3QgYWNjdAoreworCWNoYXIJCWFjX2ZsYWc7CQkvKiBGbGFncyAqLworCWNoYXIJCWFjX3ZlcnNpb247CQkvKiBBbHdheXMgc2V0IHRvIEFDQ1RfVkVSU0lPTiAqLworCS8qIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSBiYWNrIHVudGlsIDIuMCAqLworCV9fdTE2CQlhY191aWQxNjsJCS8qIExTQiBvZiBSZWFsIFVzZXIgSUQgKi8KKwlfX3UxNgkJYWNfZ2lkMTY7CQkvKiBMU0Igb2YgUmVhbCBHcm91cCBJRCAqLworCV9fdTE2CQlhY190dHk7CQkJLyogQ29udHJvbCBUZXJtaW5hbCAqLworCV9fdTMyCQlhY19idGltZTsJCS8qIFByb2Nlc3MgQ3JlYXRpb24gVGltZSAqLworCWNvbXBfdAkJYWNfdXRpbWU7CQkvKiBVc2VyIFRpbWUgKi8KKwljb21wX3QJCWFjX3N0aW1lOwkJLyogU3lzdGVtIFRpbWUgKi8KKwljb21wX3QJCWFjX2V0aW1lOwkJLyogRWxhcHNlZCBUaW1lICovCisJY29tcF90CQlhY19tZW07CQkJLyogQXZlcmFnZSBNZW1vcnkgVXNhZ2UgKi8KKwljb21wX3QJCWFjX2lvOwkJCS8qIENoYXJzIFRyYW5zZmVycmVkICovCisJY29tcF90CQlhY19ydzsJCQkvKiBCbG9ja3MgUmVhZCBvciBXcml0dGVuICovCisJY29tcF90CQlhY19taW5mbHQ7CQkvKiBNaW5vciBQYWdlZmF1bHRzICovCisJY29tcF90CQlhY19tYWpmbHQ7CQkvKiBNYWpvciBQYWdlZmF1bHRzICovCisJY29tcF90CQlhY19zd2FwczsJCS8qIE51bWJlciBvZiBTd2FwcyAqLworLyogbTY4ayBoYWQgbm8gcGFkZGluZyBoZXJlLiAqLworCV9fdTE2CQlhY19haHo7CQkJLyogQUhaICovCisJX191MzIJCWFjX2V4aXRjb2RlOwkJLyogRXhpdGNvZGUgKi8KKwljaGFyCQlhY19jb21tW0FDQ1RfQ09NTSArIDFdOwkvKiBDb21tYW5kIE5hbWUgKi8KKwlfX3U4CQlhY19ldGltZV9oaTsJCS8qIEVsYXBzZWQgVGltZSBNU0IgKi8KKwlfX3UxNgkJYWNfZXRpbWVfbG87CQkvKiBFbGFwc2VkIFRpbWUgTFNCICovCisJX191MzIJCWFjX3VpZDsJCQkvKiBSZWFsIFVzZXIgSUQgKi8KKwlfX3UzMgkJYWNfZ2lkOwkJCS8qIFJlYWwgR3JvdXAgSUQgKi8KK307CisKK3N0cnVjdCBhY2N0X3YzCit7CisJY2hhcgkJYWNfZmxhZzsJCS8qIEZsYWdzICovCisJY2hhcgkJYWNfdmVyc2lvbjsJCS8qIEFsd2F5cyBzZXQgdG8gQUNDVF9WRVJTSU9OICovCisJX191MTYJCWFjX3R0eTsJCQkvKiBDb250cm9sIFRlcm1pbmFsICovCisJX191MzIJCWFjX2V4aXRjb2RlOwkJLyogRXhpdGNvZGUgKi8KKwlfX3UzMgkJYWNfdWlkOwkJCS8qIFJlYWwgVXNlciBJRCAqLworCV9fdTMyCQlhY19naWQ7CQkJLyogUmVhbCBHcm91cCBJRCAqLworCV9fdTMyCQlhY19waWQ7CQkJLyogUHJvY2VzcyBJRCAqLworCV9fdTMyCQlhY19wcGlkOwkJLyogUGFyZW50IFByb2Nlc3MgSUQgKi8KKwlfX3UzMgkJYWNfYnRpbWU7CQkvKiBQcm9jZXNzIENyZWF0aW9uIFRpbWUgKi8KKwlmbG9hdAkJYWNfZXRpbWU7CQkvKiBFbGFwc2VkIFRpbWUgKi8KKwljb21wX3QJCWFjX3V0aW1lOwkJLyogVXNlciBUaW1lICovCisJY29tcF90CQlhY19zdGltZTsJCS8qIFN5c3RlbSBUaW1lICovCisJY29tcF90CQlhY19tZW07CQkJLyogQXZlcmFnZSBNZW1vcnkgVXNhZ2UgKi8KKwljb21wX3QJCWFjX2lvOwkJCS8qIENoYXJzIFRyYW5zZmVycmVkICovCisJY29tcF90CQlhY19ydzsJCQkvKiBCbG9ja3MgUmVhZCBvciBXcml0dGVuICovCisJY29tcF90CQlhY19taW5mbHQ7CQkvKiBNaW5vciBQYWdlZmF1bHRzICovCisJY29tcF90CQlhY19tYWpmbHQ7CQkvKiBNYWpvciBQYWdlZmF1bHRzICovCisJY29tcF90CQlhY19zd2FwczsJCS8qIE51bWJlciBvZiBTd2FwcyAqLworCWNoYXIJCWFjX2NvbW1bQUNDVF9DT01NXTsJLyogQ29tbWFuZCBOYW1lICovCit9OworCisvKgorICogIGFjY291bnRpbmcgZmxhZ3MKKyAqLworCQkJCS8qIGJpdCBzZXQgd2hlbiB0aGUgcHJvY2VzcyAuLi4gKi8KKyNkZWZpbmUgQUZPUksJCTB4MDEJLyogLi4uIGV4ZWN1dGVkIGZvcmssIGJ1dCBkaWQgbm90IGV4ZWMgKi8KKyNkZWZpbmUgQVNVCQkweDAyCS8qIC4uLiB1c2VkIHN1cGVyLXVzZXIgcHJpdmlsZWdlcyAqLworI2RlZmluZSBBQ09NUEFUCQkweDA0CS8qIC4uLiB1c2VkIGNvbXBhdGliaWxpdHkgbW9kZSAoVkFYIG9ubHkgbm90IHVzZWQpICovCisjZGVmaW5lIEFDT1JFCQkweDA4CS8qIC4uLiBkdW1wZWQgY29yZSAqLworI2RlZmluZSBBWFNJRwkJMHgxMAkvKiAuLi4gd2FzIGtpbGxlZCBieSBhIHNpZ25hbCAqLworCisjaWZkZWYgX19CSUdfRU5ESUFOCisjZGVmaW5lIEFDQ1RfQllURU9SREVSCTB4ODAJLyogYWNjb3VudGluZyBmaWxlIGlzIGJpZyBlbmRpYW4gKi8KKyNlbHNlCisjZGVmaW5lIEFDQ1RfQllURU9SREVSCTB4MDAJLyogYWNjb3VudGluZyBmaWxlIGlzIGxpdHRsZSBlbmRpYW4gKi8KKyNlbmRpZgorCisjZGVmaW5lIEFDQ1RfVkVSU0lPTgkyCisjZGVmaW5lIEFIWgkJKEhaKQorCisKKyNlbmRpZgkvKiBfTElOVVhfQUNDVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FkYi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODE1MDI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hZGIuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogRGVmaW5pdGlvbnMgZm9yIEFEQiAoQXBwbGUgRGVza3RvcCBCdXMpIHN1cHBvcnQuCisgKi8KKyNpZm5kZWYgX19BREJfSAorI2RlZmluZSBfX0FEQl9ICisKKy8qIEFEQiBjb21tYW5kcyAqLworI2RlZmluZSBBREJfQlVTUkVTRVQJCTAKKyNkZWZpbmUgQURCX0ZMVVNIKGlkKQkJKDB4MDEgfCAoKGlkKSA8PCA0KSkKKyNkZWZpbmUgQURCX1dSSVRFUkVHKGlkLCByZWcpCSgweDA4IHwgKHJlZykgfCAoKGlkKSA8PCA0KSkKKyNkZWZpbmUgQURCX1JFQURSRUcoaWQsIHJlZykJKDB4MEMgfCAocmVnKSB8ICgoaWQpIDw8IDQpKQorCisvKiBBREIgZGVmYXVsdCBkZXZpY2UgSURzICh1cHBlciA0IGJpdHMgb2YgQURCIGNvbW1hbmQgYnl0ZSkgKi8KKyNkZWZpbmUgQURCX0RPTkdMRQkxCS8qICJzb2Z0d2FyZSBleGVjdXRpb24gY29udHJvbCIgZGV2aWNlcyAqLworI2RlZmluZSBBREJfS0VZQk9BUkQJMgorI2RlZmluZSBBREJfTU9VU0UJMworI2RlZmluZSBBREJfVEFCTEVUCTQKKyNkZWZpbmUgQURCX01PREVNCTUKKyNkZWZpbmUgQURCX01JU0MJNwkvKiBtYXliZSBhIG1vbml0b3IgKi8KKworI2RlZmluZSBBREJfUkVUX09LCTAKKyNkZWZpbmUgQURCX1JFVF9USU1FT1VUCTMKKworLyogVGhlIGtpbmQgb2YgQURCIHJlcXVlc3QuIFRoZSBjb250cm9sbGVyIG1heSBlbXVsYXRlIHNvbWUKKyAgIG9yIGFsbCBvZiB0aG9zZSBDVURBL1BNVSBwYWNrZXQga2luZHMgKi8KKyNkZWZpbmUgQURCX1BBQ0tFVAkwCisjZGVmaW5lIENVREFfUEFDS0VUCTEKKyNkZWZpbmUgRVJST1JfUEFDS0VUCTIKKyNkZWZpbmUgVElNRVJfUEFDS0VUCTMKKyNkZWZpbmUgUE9XRVJfUEFDS0VUCTQKKyNkZWZpbmUgTUFDSUlDX1BBQ0tFVAk1CisjZGVmaW5lIFBNVV9QQUNLRVQJNgorI2RlZmluZSBBREJfUVVFUlkJNworCisvKiBBREIgcXVlcmllcyAqLworCisvKiBBREJfUVVFUllfR0VUREVWSU5GTworICogUXVlcnkgQURCIHNsb3QgZm9yIGRldmljZSBwcmVzZW5jZQorICogZGF0YVsyXSA9IGlkLCByZXBbMF0gPSBvcmlnIGFkZHIsIHJlcFsxXSA9IGhhbmRsZXJfaWQKKyAqLworI2RlZmluZSBBREJfUVVFUllfR0VUREVWSU5GTwkxCisKKworI2VuZGlmIC8qIF9fQURCX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYWRmc19mcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hZGZzX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM5YTVhMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYWRmc19mcy5oCkBAIC0wLDAgKzEsNDQgQEAKKyNpZm5kZWYgX0FERlNfRlNfSAorI2RlZmluZSBfQURGU19GU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisKKy8qCisgKiBEaXNjIFJlY29yZCBhdCBkaXNjIGFkZHJlc3MgMHhjMDAKKyAqLworc3RydWN0IGFkZnNfZGlzY3JlY29yZCB7CisgICAgX191OCAgbG9nMnNlY3NpemU7CisgICAgX191OCAgc2Vjc3BlcnRyYWNrOworICAgIF9fdTggIGhlYWRzOworICAgIF9fdTggIGRlbnNpdHk7CisgICAgX191OCAgaWRsZW47CisgICAgX191OCAgbG9nMmJwbWI7CisgICAgX191OCAgc2tldzsKKyAgICBfX3U4ICBib290b3B0aW9uOworICAgIF9fdTggIGxvd3NlY3RvcjsKKyAgICBfX3U4ICBuem9uZXM7CisgICAgX19sZTE2IHpvbmVfc3BhcmU7CisgICAgX19sZTMyIHJvb3Q7CisgICAgX19sZTMyIGRpc2Nfc2l6ZTsKKyAgICBfX2xlMTYgZGlzY19pZDsKKyAgICBfX3U4ICBkaXNjX25hbWVbMTBdOworICAgIF9fbGUzMiBkaXNjX3R5cGU7CisgICAgX19sZTMyIGRpc2Nfc2l6ZV9oaWdoOworICAgIF9fdTggIGxvZzJzaGFyZXNpemU6NDsKKyAgICBfX3U4ICB1bnVzZWQ0MDo0OworICAgIF9fdTggIGJpZ19mbGFnOjE7CisgICAgX191OCAgdW51c2VkNDE6MTsKKyAgICBfX3U4ICBuem9uZXNfaGlnaDsKKyAgICBfX2xlMzIgZm9ybWF0X3ZlcnNpb247CisgICAgX19sZTMyIHJvb3Rfc2l6ZTsKKyAgICBfX3U4ICB1bnVzZWQ1Mls2MCAtIDUyXTsKK307CisKKyNkZWZpbmUgQURGU19ESVNDUkVDT1JECQkoMHhjMDApCisjZGVmaW5lIEFERlNfRFJfT0ZGU0VUCQkoMHgxYzApCisjZGVmaW5lIEFERlNfRFJfU0laRQkJIDYwCisjZGVmaW5lIEFERlNfRFJfU0laRV9CSVRTCShBREZTX0RSX1NJWkUgPDwgMykKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYWZmc19oYXJkYmxvY2tzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FmZnNfaGFyZGJsb2Nrcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYjk0OGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FmZnNfaGFyZGJsb2Nrcy5oCkBAIC0wLDAgKzEsNjggQEAKKyNpZm5kZWYJQUZGU19IQVJEQkxPQ0tTX0gKKyNkZWZpbmUJQUZGU19IQVJEQkxPQ0tTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIEp1c3QgdGhlIG5lZWRlZCBkZWZpbml0aW9ucyBmb3IgdGhlIFJEQiBvZiBhbiBBbWlnYSBIRC4gKi8KKworc3RydWN0IFJpZ2lkRGlza0Jsb2NrIHsKKwlfX3UzMglyZGJfSUQ7CisJX19iZTMyCXJkYl9TdW1tZWRMb25nczsKKwlfX3MzMglyZGJfQ2hrU3VtOworCV9fdTMyCXJkYl9Ib3N0SUQ7CisJX19iZTMyCXJkYl9CbG9ja0J5dGVzOworCV9fdTMyCXJkYl9GbGFnczsKKwlfX3UzMglyZGJfQmFkQmxvY2tMaXN0OworCV9fYmUzMglyZGJfUGFydGl0aW9uTGlzdDsKKwlfX3UzMglyZGJfRmlsZVN5c0hlYWRlckxpc3Q7CisJX191MzIJcmRiX0RyaXZlSW5pdDsKKwlfX3UzMglyZGJfUmVzZXJ2ZWQxWzZdOworCV9fdTMyCXJkYl9DeWxpbmRlcnM7CisJX191MzIJcmRiX1NlY3RvcnM7CisJX191MzIJcmRiX0hlYWRzOworCV9fdTMyCXJkYl9JbnRlcmxlYXZlOworCV9fdTMyCXJkYl9QYXJrOworCV9fdTMyCXJkYl9SZXNlcnZlZDJbM107CisJX191MzIJcmRiX1dyaXRlUHJlQ29tcDsKKwlfX3UzMglyZGJfUmVkdWNlZFdyaXRlOworCV9fdTMyCXJkYl9TdGVwUmF0ZTsKKwlfX3UzMglyZGJfUmVzZXJ2ZWQzWzVdOworCV9fdTMyCXJkYl9SREJCbG9ja3NMbzsKKwlfX3UzMglyZGJfUkRCQmxvY2tzSGk7CisJX191MzIJcmRiX0xvQ3lsaW5kZXI7CisJX191MzIJcmRiX0hpQ3lsaW5kZXI7CisJX191MzIJcmRiX0N5bEJsb2NrczsKKwlfX3UzMglyZGJfQXV0b1BhcmtTZWNvbmRzOworCV9fdTMyCXJkYl9IaWdoUkRTS0Jsb2NrOworCV9fdTMyCXJkYl9SZXNlcnZlZDQ7CisJY2hhcglyZGJfRGlza1ZlbmRvcls4XTsKKwljaGFyCXJkYl9EaXNrUHJvZHVjdFsxNl07CisJY2hhcglyZGJfRGlza1JldmlzaW9uWzRdOworCWNoYXIJcmRiX0NvbnRyb2xsZXJWZW5kb3JbOF07CisJY2hhcglyZGJfQ29udHJvbGxlclByb2R1Y3RbMTZdOworCWNoYXIJcmRiX0NvbnRyb2xsZXJSZXZpc2lvbls0XTsKKwlfX3UzMglyZGJfUmVzZXJ2ZWQ1WzEwXTsKK307CisKKyNkZWZpbmUJSUROQU1FX1JJR0lERElTSwkweDUyNDQ1MzRCCS8qICJSRFNLIiAqLworCitzdHJ1Y3QgUGFydGl0aW9uQmxvY2sgeworCV9fYmUzMglwYl9JRDsKKwlfX2JlMzIJcGJfU3VtbWVkTG9uZ3M7CisJX19zMzIJcGJfQ2hrU3VtOworCV9fdTMyCXBiX0hvc3RJRDsKKwlfX2JlMzIJcGJfTmV4dDsKKwlfX3UzMglwYl9GbGFnczsKKwlfX3UzMglwYl9SZXNlcnZlZDFbMl07CisJX191MzIJcGJfRGV2RmxhZ3M7CisJX191OAlwYl9Ecml2ZU5hbWVbMzJdOworCV9fdTMyCXBiX1Jlc2VydmVkMlsxNV07CisJX19iZTMyCXBiX0Vudmlyb25tZW50WzE3XTsKKwlfX3UzMglwYl9FUmVzZXJ2ZWRbMTVdOworfTsKKworI2RlZmluZQlJRE5BTUVfUEFSVElUSU9OCTB4NTA0MTUyNTQJLyogIlBBUlQiICovCisKKyNkZWZpbmUgUkRCX0FMTE9DQVRJT05fTElNSVQJMTYKKworI2VuZGlmCS8qIEFGRlNfSEFSREJMT0NLU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FncGdhcnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYWdwZ2FydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZjk1ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FncGdhcnQuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIEFHUEdBUlQgbW9kdWxlIHZlcnNpb24gMC45OQorICogQ29weXJpZ2h0IChDKSAxOTk5IEplZmYgSGFydG1hbm4KKyAqIENvcHlyaWdodCAoQykgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAxOTk5IFhpIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBKRUZGIEhBUlRNQU5OLCBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSAKKyAqIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9BR1BfSAorI2RlZmluZSBfQUdQX0ggMQorCisjZGVmaW5lIEFHUElPQ19CQVNFICAgICAgICdBJworI2RlZmluZSBBR1BJT0NfSU5GTyAgICAgICBfSU9SIChBR1BJT0NfQkFTRSwgMCwgc3RydWN0IGFncF9pbmZvKikKKyNkZWZpbmUgQUdQSU9DX0FDUVVJUkUgICAgX0lPICAoQUdQSU9DX0JBU0UsIDEpCisjZGVmaW5lIEFHUElPQ19SRUxFQVNFICAgIF9JTyAgKEFHUElPQ19CQVNFLCAyKQorI2RlZmluZSBBR1BJT0NfU0VUVVAgICAgICBfSU9XIChBR1BJT0NfQkFTRSwgMywgc3RydWN0IGFncF9zZXR1cCopCisjZGVmaW5lIEFHUElPQ19SRVNFUlZFICAgIF9JT1cgKEFHUElPQ19CQVNFLCA0LCBzdHJ1Y3QgYWdwX3JlZ2lvbiopCisjZGVmaW5lIEFHUElPQ19QUk9URUNUICAgIF9JT1cgKEFHUElPQ19CQVNFLCA1LCBzdHJ1Y3QgYWdwX3JlZ2lvbiopCisjZGVmaW5lIEFHUElPQ19BTExPQ0FURSAgIF9JT1dSKEFHUElPQ19CQVNFLCA2LCBzdHJ1Y3QgYWdwX2FsbG9jYXRlKikKKyNkZWZpbmUgQUdQSU9DX0RFQUxMT0NBVEUgX0lPVyAoQUdQSU9DX0JBU0UsIDcsIGludCkKKyNkZWZpbmUgQUdQSU9DX0JJTkQgICAgICAgX0lPVyAoQUdQSU9DX0JBU0UsIDgsIHN0cnVjdCBhZ3BfYmluZCopCisjZGVmaW5lIEFHUElPQ19VTkJJTkQgICAgIF9JT1cgKEFHUElPQ19CQVNFLCA5LCBzdHJ1Y3QgYWdwX3VuYmluZCopCisjZGVmaW5lIEFHUElPQ19DSElQU0VUX0ZMVVNIIF9JTyAoQUdQSU9DX0JBU0UsIDEwKQorCisjZGVmaW5lIEFHUF9ERVZJQ0UgICAgICAiL2Rldi9hZ3BnYXJ0IgorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAxCisjZW5kaWYKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBhZ3BfdmVyc2lvbiB7CisJX191MTYgbWFqb3I7CisJX191MTYgbWlub3I7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfYWdwX2luZm8geworCXN0cnVjdCBhZ3BfdmVyc2lvbiB2ZXJzaW9uOwkvKiB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgICAgICAgICovCisJX191MzIgYnJpZGdlX2lkOwkvKiBicmlkZ2UgdmVuZG9yL2RldmljZSAgICAgICAgICovCisJX191MzIgYWdwX21vZGU7CQkvKiBtb2RlIGluZm8gb2YgYnJpZGdlICAgICAgICAgICovCisJdW5zaWduZWQgbG9uZyBhcGVyX2Jhc2U7LyogYmFzZSBvZiBhcGVydHVyZSAgICAgICAgICAgICAqLworCXNpemVfdCBhcGVyX3NpemU7CS8qIHNpemUgb2YgYXBlcnR1cmUgICAgICAgICAgICAgKi8KKwlzaXplX3QgcGdfdG90YWw7CS8qIG1heCBwYWdlcyAoc3dhcCArIHN5c3RlbSkgICAgKi8KKwlzaXplX3QgcGdfc3lzdGVtOwkvKiBtYXggcGFnZXMgKHN5c3RlbSkgICAgICAgICAgICovCisJc2l6ZV90IHBnX3VzZWQ7CQkvKiBjdXJyZW50IHBhZ2VzIHVzZWQgICAgICAgICAgICovCit9IGFncF9pbmZvOworCit0eXBlZGVmIHN0cnVjdCBfYWdwX3NldHVwIHsKKwlfX3UzMiBhZ3BfbW9kZTsJCS8qIG1vZGUgaW5mbyBvZiBicmlkZ2UgICAgICAgICAgKi8KK30gYWdwX3NldHVwOworCisvKgorICogVGhlICJwcm90IiBkb3duIGJlbG93IG5lZWRzIHN0aWxsIGEgInNsZWVwIiBmbGFnIHNvbWVob3cgLi4uCisgKi8KK3R5cGVkZWYgc3RydWN0IF9hZ3Bfc2VnbWVudCB7CisJX19rZXJuZWxfb2ZmX3QgcGdfc3RhcnQ7CS8qIHN0YXJ0aW5nIHBhZ2UgdG8gcG9wdWxhdGUgICAgKi8KKwlfX2tlcm5lbF9zaXplX3QgcGdfY291bnQ7CS8qIG51bWJlciBvZiBwYWdlcyAgICAgICAgICAgICAgKi8KKwlpbnQgcHJvdDsJCQkvKiBwcm90IGZsYWdzIGZvciBtbWFwICAgICAgICAgICovCit9IGFncF9zZWdtZW50OworCit0eXBlZGVmIHN0cnVjdCBfYWdwX3JlZ2lvbiB7CisJX19rZXJuZWxfcGlkX3QgcGlkOwkJLyogcGlkIG9mIHByb2Nlc3MgICAgICAgKi8KKwlfX2tlcm5lbF9zaXplX3Qgc2VnX2NvdW50OwkvKiBudW1iZXIgb2Ygc2VnbWVudHMgICAqLworCXN0cnVjdCBfYWdwX3NlZ21lbnQgKnNlZ19saXN0OworfSBhZ3BfcmVnaW9uOworCit0eXBlZGVmIHN0cnVjdCBfYWdwX2FsbG9jYXRlIHsKKwlpbnQga2V5OwkJLyogdGFnIG9mIGFsbG9jYXRpb24gICAgICAgICAgICAqLworCV9fa2VybmVsX3NpemVfdCBwZ19jb3VudDsvKiBudW1iZXIgb2YgcGFnZXMgICAgICAgICAgICAgKi8KKwlfX3UzMiB0eXBlOwkJLyogMCA9PSBub3JtYWwsIG90aGVyIGRldnNwZWMgICAqLworICAgCV9fdTMyIHBoeXNpY2FsOyAgICAgICAgIC8qIGRldmljZSBzcGVjaWZpYyAoc29tZSBkZXZpY2VzICAKKwkJCQkgKiBuZWVkIGEgcGh5cyBhZGRyZXNzIG9mIHRoZSAgICAgCisJCQkJICogYWN0dWFsIHBhZ2UgYmVoaW5kIHRoZSBnYXR0ICAgIAorCQkJCSAqIHRhYmxlKSAgICAgICAgICAgICAgICAgICAgICAgICovCit9IGFncF9hbGxvY2F0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgX2FncF9iaW5kIHsKKwlpbnQga2V5OwkJLyogdGFnIG9mIGFsbG9jYXRpb24gICAgICAgICAgICAqLworCV9fa2VybmVsX29mZl90IHBnX3N0YXJ0Oy8qIHN0YXJ0aW5nIHBhZ2UgdG8gcG9wdWxhdGUgICAgKi8KK30gYWdwX2JpbmQ7CisKK3R5cGVkZWYgc3RydWN0IF9hZ3BfdW5iaW5kIHsKKwlpbnQga2V5OwkJLyogdGFnIG9mIGFsbG9jYXRpb24gICAgICAgICAgICAqLworCV9fdTMyIHByaW9yaXR5OwkJLyogcHJpb3JpdHkgZm9yIHBhZ2luZyBvdXQgICAgICAqLworfSBhZ3BfdW5iaW5kOworCisKKyNlbmRpZgkJCQkvKiBfQUdQX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYWlvX2FiaS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9haW9fYWJpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM4NzMxNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYWlvX2FiaS5oCkBAIC0wLDAgKzEsMTExIEBACisvKiBpbmNsdWRlL2xpbnV4L2Fpb19hYmkuaAorICoKKyAqIENvcHlyaWdodCAyMDAwLDIwMDEsMjAwMiBSZWQgSGF0LgorICoKKyAqIFdyaXR0ZW4gYnkgQmVuamFtaW4gTGFIYWlzZSA8YmNybEBrdmFjay5vcmc+CisgKgorICogRGlzdHJpYnV0ZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTHYyIChzZWUgLi4vLi4vQ09QWUlORykgb3IgdW5kZXIgCisgKiB0aGUgZm9sbG93aW5nIHRlcm1zLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCB3aXRob3V0IGFueQorICogd2FycmFudHksIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFJlZCBIYXQgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0CisgKiB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgUkVEIEhBVCBCRSBMSUFCTEUgVE8gQU5ZIFBBUlRZIEZPUiBESVJFQ1QsIElORElSRUNULAorICogU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUgQU5EIElUUyBET0NVTUVOVEFUSU9OLCBFVkVOIElGIFJFRCBIQVQgSEFTIEJFRU4gQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFJFRCBIQVQgRElTQ0xBSU1TIEFOWSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBUSEUgU09GVFdBUkUgUFJPVklERUQgSEVSRVVOREVSIElTIE9OIEFOICJBUyBJUyIgQkFTSVMsIEFORAorICogUkVEIEhBVCBIQVMgTk8gT0JMSUdBVElPTiBUTyBQUk9WSURFIE1BSU5URU5BTkNFLCBTVVBQT1JULCBVUERBVEVTLAorICogRU5IQU5DRU1FTlRTLCBPUiBNT0RJRklDQVRJT05TLgorICovCisjaWZuZGVmIF9fTElOVVhfX0FJT19BQklfSAorI2RlZmluZSBfX0xJTlVYX19BSU9fQUJJX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJYWlvX2NvbnRleHRfdDsKKworZW51bSB7CisJSU9DQl9DTURfUFJFQUQgPSAwLAorCUlPQ0JfQ01EX1BXUklURSA9IDEsCisJSU9DQl9DTURfRlNZTkMgPSAyLAorCUlPQ0JfQ01EX0ZEU1lOQyA9IDMsCisJLyogVGhlc2UgdHdvIGFyZSBleHBlcmltZW50YWwuCisJICogSU9DQl9DTURfUFJFQURYID0gNCwKKwkgKiBJT0NCX0NNRF9QT0xMID0gNSwKKwkgKi8KKwlJT0NCX0NNRF9OT09QID0gNiwKKwlJT0NCX0NNRF9QUkVBRFYgPSA3LAorCUlPQ0JfQ01EX1BXUklURVYgPSA4LAorfTsKKworLyoKKyAqIFZhbGlkIGZsYWdzIGZvciB0aGUgImFpb19mbGFncyIgbWVtYmVyIG9mIHRoZSAic3RydWN0IGlvY2IiLgorICoKKyAqIElPQ0JfRkxBR19SRVNGRCAtIFNldCBpZiB0aGUgImFpb19yZXNmZCIgbWVtYmVyIG9mIHRoZSAic3RydWN0IGlvY2IiCisgKiAgICAgICAgICAgICAgICAgICBpcyB2YWxpZC4KKyAqLworI2RlZmluZSBJT0NCX0ZMQUdfUkVTRkQJCSgxIDw8IDApCisKKy8qIHJlYWQoKSBmcm9tIC9kZXYvYWlvIHJldHVybnMgdGhlc2Ugc3RydWN0dXJlcy4gKi8KK3N0cnVjdCBpb19ldmVudCB7CisJX191NjQJCWRhdGE7CQkvKiB0aGUgZGF0YSBmaWVsZCBmcm9tIHRoZSBpb2NiICovCisJX191NjQJCW9iajsJCS8qIHdoYXQgaW9jYiB0aGlzIGV2ZW50IGNhbWUgZnJvbSAqLworCV9fczY0CQlyZXM7CQkvKiByZXN1bHQgY29kZSBmb3IgdGhpcyBldmVudCAqLworCV9fczY0CQlyZXMyOwkJLyogc2Vjb25kYXJ5IHJlc3VsdCAqLworfTsKKworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorI2RlZmluZSBQQURERUQoeCx5KQl4LCB5CisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKyNkZWZpbmUgUEFEREVEKHgseSkJeSwgeAorI2Vsc2UKKyNlcnJvciBlZGl0IGZvciB5b3VyIG9kZCBieXRlb3JkZXIuCisjZW5kaWYKKworLyoKKyAqIHdlIGFsd2F5cyB1c2UgYSA2NGJpdCBvZmZfdCB3aGVuIGNvbW11bmljYXRpbmcKKyAqIHdpdGggdXNlcmxhbmQuICBpdHMgdXAgdG8gbGlicmFyaWVzIHRvIGRvIHRoZQorICogcHJvcGVyIHBhZGRpbmcgYW5kIGFpb19lcnJvciBhYnN0cmFjdGlvbgorICovCisKK3N0cnVjdCBpb2NiIHsKKwkvKiB0aGVzZSBhcmUgaW50ZXJuYWwgdG8gdGhlIGtlcm5lbC9saWJjLiAqLworCV9fdTY0CWFpb19kYXRhOwkvKiBkYXRhIHRvIGJlIHJldHVybmVkIGluIGV2ZW50J3MgZGF0YSAqLworCV9fdTMyCVBBRERFRChhaW9fa2V5LCBhaW9fcmVzZXJ2ZWQxKTsKKwkJCQkvKiB0aGUga2VybmVsIHNldHMgYWlvX2tleSB0byB0aGUgcmVxICMgKi8KKworCS8qIGNvbW1vbiBmaWVsZHMgKi8KKwlfX3UxNglhaW9fbGlvX29wY29kZTsJLyogc2VlIElPQ0JfQ01EXyBhYm92ZSAqLworCV9fczE2CWFpb19yZXFwcmlvOworCV9fdTMyCWFpb19maWxkZXM7CisKKwlfX3U2NAlhaW9fYnVmOworCV9fdTY0CWFpb19uYnl0ZXM7CisJX19zNjQJYWlvX29mZnNldDsKKworCS8qIGV4dHJhIHBhcmFtZXRlcnMgKi8KKwlfX3U2NAlhaW9fcmVzZXJ2ZWQyOwkvKiBUT0RPOiB1c2UgdGhpcyBmb3IgYSAoc3RydWN0IHNpZ2V2ZW50ICopICovCisKKwkvKiBmbGFncyBmb3IgdGhlICJzdHJ1Y3QgaW9jYiIgKi8KKwlfX3UzMglhaW9fZmxhZ3M7CisKKwkvKgorCSAqIGlmIHRoZSBJT0NCX0ZMQUdfUkVTRkQgZmxhZyBvZiAiYWlvX2ZsYWdzIiBpcyBzZXQsIHRoaXMgaXMgYW4KKwkgKiBldmVudGZkIHRvIHNpZ25hbCBBSU8gcmVhZGluZXNzIHRvCisJICovCisJX191MzIJYWlvX3Jlc2ZkOworfTsgLyogNjQgYnl0ZXMgKi8KKworI3VuZGVmIElGQklHCisjdW5kZWYgSUZMSVRUTEUKKworI2VuZGlmIC8qIF9fTElOVVhfX0FJT19BQklfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FwbV9iaW9zLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FwbV9iaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVlMTlhMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXBtX2Jpb3MuaApAQCAtMCwwICsxLDEzNSBAQAorI2lmbmRlZiBfTElOVVhfQVBNX0gKKyNkZWZpbmUgX0xJTlVYX0FQTV9ICisKKy8qCisgKiBJbmNsdWRlIGZpbGUgZm9yIHRoZSBpbnRlcmZhY2UgdG8gYW4gQVBNIEJJT1MKKyAqIENvcHlyaWdodCAxOTk0LTIwMDEgU3RlcGhlbiBSb3Rod2VsbCAoc2ZyQGNhbmIuYXV1Zy5vcmcuYXUpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CWFwbV9ldmVudF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlhcG1fZXZlbnRpbmZvX3Q7CisKK3N0cnVjdCBhcG1fYmlvc19pbmZvIHsKKwlfX3UxNgl2ZXJzaW9uOworCV9fdTE2CWNzZWc7CisJX191MzIJb2Zmc2V0OworCV9fdTE2CWNzZWdfMTY7CisJX191MTYJZHNlZzsKKwlfX3UxNglmbGFnczsKKwlfX3UxNgljc2VnX2xlbjsKKwlfX3UxNgljc2VnXzE2X2xlbjsKKwlfX3UxNglkc2VnX2xlbjsKK307CisKKworLyoKKyAqIFBvd2VyIHN0YXRlcworICovCisjZGVmaW5lIEFQTV9TVEFURV9SRUFEWQkJMHgwMDAwCisjZGVmaW5lIEFQTV9TVEFURV9TVEFOREJZCTB4MDAwMQorI2RlZmluZSBBUE1fU1RBVEVfU1VTUEVORAkweDAwMDIKKyNkZWZpbmUgQVBNX1NUQVRFX09GRgkJMHgwMDAzCisjZGVmaW5lIEFQTV9TVEFURV9CVVNZCQkweDAwMDQKKyNkZWZpbmUgQVBNX1NUQVRFX1JFSkVDVAkweDAwMDUKKyNkZWZpbmUgQVBNX1NUQVRFX09FTV9TWVMJMHgwMDIwCisjZGVmaW5lIEFQTV9TVEFURV9PRU1fREVWCTB4MDA0MAorCisjZGVmaW5lIEFQTV9TVEFURV9ESVNBQkxFCTB4MDAwMAorI2RlZmluZSBBUE1fU1RBVEVfRU5BQkxFCTB4MDAwMQorCisjZGVmaW5lIEFQTV9TVEFURV9ESVNFTkdBR0UJMHgwMDAwCisjZGVmaW5lIEFQTV9TVEFURV9FTkdBR0UJMHgwMDAxCisKKy8qCisgKiBFdmVudHMgKHJlc3VsdHMgb2YgR2V0IFBNIEV2ZW50KQorICovCisjZGVmaW5lIEFQTV9TWVNfU1RBTkRCWQkJMHgwMDAxCisjZGVmaW5lIEFQTV9TWVNfU1VTUEVORAkJMHgwMDAyCisjZGVmaW5lIEFQTV9OT1JNQUxfUkVTVU1FCTB4MDAwMworI2RlZmluZSBBUE1fQ1JJVElDQUxfUkVTVU1FCTB4MDAwNAorI2RlZmluZSBBUE1fTE9XX0JBVFRFUlkJCTB4MDAwNQorI2RlZmluZSBBUE1fUE9XRVJfU1RBVFVTX0NIQU5HRQkweDAwMDYKKyNkZWZpbmUgQVBNX1VQREFURV9USU1FCQkweDAwMDcKKyNkZWZpbmUgQVBNX0NSSVRJQ0FMX1NVU1BFTkQJMHgwMDA4CisjZGVmaW5lIEFQTV9VU0VSX1NUQU5EQlkJMHgwMDA5CisjZGVmaW5lIEFQTV9VU0VSX1NVU1BFTkQJMHgwMDBhCisjZGVmaW5lIEFQTV9TVEFOREJZX1JFU1VNRQkweDAwMGIKKyNkZWZpbmUgQVBNX0NBUEFCSUxJVFlfQ0hBTkdFCTB4MDAwYworCisvKgorICogRXJyb3IgY29kZXMKKyAqLworI2RlZmluZSBBUE1fU1VDQ0VTUwkJMHgwMAorI2RlZmluZSBBUE1fRElTQUJMRUQJCTB4MDEKKyNkZWZpbmUgQVBNX0NPTk5FQ1RFRAkJMHgwMgorI2RlZmluZSBBUE1fTk9UX0NPTk5FQ1RFRAkweDAzCisjZGVmaW5lIEFQTV8xNl9DT05ORUNURUQJMHgwNQorI2RlZmluZSBBUE1fMTZfVU5TVVBQT1JURUQJMHgwNgorI2RlZmluZSBBUE1fMzJfQ09OTkVDVEVECTB4MDcKKyNkZWZpbmUgQVBNXzMyX1VOU1VQUE9SVEVECTB4MDgKKyNkZWZpbmUgQVBNX0JBRF9ERVZJQ0UJCTB4MDkKKyNkZWZpbmUgQVBNX0JBRF9QQVJBTQkJMHgwYQorI2RlZmluZSBBUE1fTk9UX0VOR0FHRUQJCTB4MGIKKyNkZWZpbmUgQVBNX0JBRF9GVU5DVElPTgkweDBjCisjZGVmaW5lIEFQTV9SRVNVTUVfRElTQUJMRUQJMHgwZAorI2RlZmluZSBBUE1fTk9fRVJST1IJCTB4NTMKKyNkZWZpbmUgQVBNX0JBRF9TVEFURQkJMHg2MAorI2RlZmluZSBBUE1fTk9fRVZFTlRTCQkweDgwCisjZGVmaW5lIEFQTV9OT1RfUFJFU0VOVAkJMHg4NgorCisvKgorICogQVBNIERldmljZSBJRHMKKyAqLworI2RlZmluZSBBUE1fREVWSUNFX0JJT1MJCTB4MDAwMAorI2RlZmluZSBBUE1fREVWSUNFX0FMTAkJMHgwMDAxCisjZGVmaW5lIEFQTV9ERVZJQ0VfRElTUExBWQkweDAxMDAKKyNkZWZpbmUgQVBNX0RFVklDRV9TVE9SQUdFCTB4MDIwMAorI2RlZmluZSBBUE1fREVWSUNFX1BBUkFMTEVMCTB4MDMwMAorI2RlZmluZSBBUE1fREVWSUNFX1NFUklBTAkweDA0MDAKKyNkZWZpbmUgQVBNX0RFVklDRV9ORVRXT1JLCTB4MDUwMAorI2RlZmluZSBBUE1fREVWSUNFX1BDTUNJQQkweDA2MDAKKyNkZWZpbmUgQVBNX0RFVklDRV9CQVRURVJZCTB4ODAwMAorI2RlZmluZSBBUE1fREVWSUNFX09FTQkJMHhlMDAwCisjZGVmaW5lIEFQTV9ERVZJQ0VfT0xEX0FMTAkweGZmZmYKKyNkZWZpbmUgQVBNX0RFVklDRV9DTEFTUwkweDAwZmYKKyNkZWZpbmUgQVBNX0RFVklDRV9NQVNLCQkweGZmMDAKKworCisvKgorICogQmF0dGVyeSBzdGF0dXMKKyAqLworI2RlZmluZSBBUE1fTUFYX0JBVFRFUklFUwkyCisKKy8qCisgKiBBUE0gZGVmaW5lZCBjYXBhYmlsaXR5IGJpdCBmbGFncworICovCisjZGVmaW5lIEFQTV9DQVBfR0xPQkFMX1NUQU5EQlkJCTB4MDAwMQorI2RlZmluZSBBUE1fQ0FQX0dMT0JBTF9TVVNQRU5ECQkweDAwMDIKKyNkZWZpbmUgQVBNX0NBUF9SRVNVTUVfU1RBTkRCWV9USU1FUgkweDAwMDQgLyogVGltZXIgcmVzdW1lIGZyb20gc3RhbmRieSAqLworI2RlZmluZSBBUE1fQ0FQX1JFU1VNRV9TVVNQRU5EX1RJTUVSCTB4MDAwOCAvKiBUaW1lciByZXN1bWUgZnJvbSBzdXNwZW5kICovCisjZGVmaW5lIEFQTV9DQVBfUkVTVU1FX1NUQU5EQllfUklORwkweDAwMTAgLyogUmVzdW1lIG9uIFJpbmcgZnIgc3RhbmRieSAqLworI2RlZmluZSBBUE1fQ0FQX1JFU1VNRV9TVVNQRU5EX1JJTkcJMHgwMDIwIC8qIFJlc3VtZSBvbiBSaW5nIGZyIHN1c3BlbmQgKi8KKyNkZWZpbmUgQVBNX0NBUF9SRVNVTUVfU1RBTkRCWV9QQ01DSUEJMHgwMDQwIC8qIFJlc3VtZSBvbiBQQ01DSUEgUmluZwkqLworI2RlZmluZSBBUE1fQ0FQX1JFU1VNRV9TVVNQRU5EX1BDTUNJQQkweDAwODAgLyogUmVzdW1lIG9uIFBDTUNJQSBSaW5nCSovCisKKy8qCisgKiBpb2N0bCBvcGVyYXRpb25zCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisjZGVmaW5lIEFQTV9JT0NfU1RBTkRCWQkJX0lPKCdBJywgMSkKKyNkZWZpbmUgQVBNX0lPQ19TVVNQRU5ECQlfSU8oJ0EnLCAyKQorCisjZW5kaWYJLyogTElOVVhfQVBNX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXJjZmIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXJjZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjFlNzY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hcmNmYi5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfX0xJTlVYX0FSQ0ZCX0hfXworI2RlZmluZSBfX0xJTlVYX0FSQ0ZCX0hfXworCisjZGVmaW5lIEZCSU9fV0FJVEVWRU5UCQlfSU8oJ0YnLCAweDg4KQorI2RlZmluZSBGQklPX0dFVENPTlRST0wyCV9JT1IoJ0YnLCAweDg5LCBzaXplX3QpCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0YWxrLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0YWxrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU1ZWVmZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRhbGsuaApAQCAtMCwwICsxLDQ0IEBACisjaWZuZGVmIF9fTElOVVhfQVRBTEtfSF9fCisjZGVmaW5lIF9fTElOVVhfQVRBTEtfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKworLyoKKyAqIEFwcGxlVGFsayBuZXR3b3JraW5nIHN0cnVjdHVyZXMKKyAqCisgKiBUaGUgZm9sbG93aW5nIGFyZSBkaXJlY3RseSByZWZlcmVuY2VkIGZyb20gdGhlIFVuaXZlcnNpdHkgT2YgTWljaGlnYW4KKyAqIG5ldGF0YWxrIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuCisgKi8KKyNkZWZpbmUgQVRQT1JUX0ZJUlNUCTEKKyNkZWZpbmUgQVRQT1JUX1JFU0VSVkVECTEyOAorI2RlZmluZSBBVFBPUlRfTEFTVAkyNTQJCS8qIDI1NCBpcyBvbmx5IGxlZ2FsIG9uIGxvY2FsdGFsayAqLyAKKyNkZWZpbmUgQVRBRERSX0FOWU5FVAkoX191MTYpMAorI2RlZmluZSBBVEFERFJfQU5ZTk9ERQkoX191OCkwCisjZGVmaW5lIEFUQUREUl9BTllQT1JUICAoX191OCkwCisjZGVmaW5lIEFUQUREUl9CQ0FTVAkoX191OCkyNTUKKyNkZWZpbmUgRERQX01BWFNaCTU4NworI2RlZmluZSBERFBfTUFYSE9QUyAgICAgMTUJCS8qIDQgYml0cyBvZiBob3AgY291bnRlciAqLworCisjZGVmaW5lIFNJT0NBVEFMS0RJRkFERFIgICAgICAgKFNJT0NQUk9UT1BSSVZBVEUgKyAwKQorCitzdHJ1Y3QgYXRhbGtfYWRkciB7CisJX19iZTE2CXNfbmV0OworCV9fdTgJc19ub2RlOworfTsKKworc3RydWN0IHNvY2thZGRyX2F0IHsKKwlfX2tlcm5lbF9zYV9mYW1pbHlfdCBzYXRfZmFtaWx5OworCV9fdTgJCSAgc2F0X3BvcnQ7CisJc3RydWN0IGF0YWxrX2FkZHIgc2F0X2FkZHI7CisJY2hhcgkJICBzYXRfemVyb1s4XTsKK307CisKK3N0cnVjdCBhdGFsa19uZXRyYW5nZSB7CisJX191OAlucl9waGFzZTsKKwlfX2JlMTYJbnJfZmlyc3RuZXQ7CisJX19iZTE2CW5yX2xhc3RuZXQ7Cit9OworCisjZW5kaWYgLyogX19MSU5VWF9BVEFMS19IX18gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMWMzNmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bS5oCkBAIC0wLDAgKzEsMjQxIEBACisvKiBhdG0uaCAtIGdlbmVyYWwgQVRNIGRlY2xhcmF0aW9ucyAqLworIAorLyogV3JpdHRlbiAxOTk1LTIwMDAgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKyAKKworLyoKKyAqIFdBUk5JTkc6IFVzZXItc3BhY2UgcHJvZ3JhbXMgc2hvdWxkIG5vdCAjaW5jbHVkZSA8bGludXgvYXRtLmg+IGRpcmVjdGx5LgorICogICAgICAgICAgSW5zdGVhZCwgI2luY2x1ZGUgPGF0bS5oPgorICovCisKKyNpZm5kZWYgX0xJTlVYX0FUTV9ICisjZGVmaW5lIF9MSU5VWF9BVE1fSAorCisvKgorICogQkVHSU5feHggYW5kIEVORF94eCBtYXJrZXJzIGFyZSB1c2VkIGZvciBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBvZgorICogZG9jdW1lbnRhdGlvbi4gRG8gbm90IGNoYW5nZSB0aGVtLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2F0bWFwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bXNhcC5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWlvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKworLyogZ2VuZXJhbCBBVE0gY29uc3RhbnRzICovCisjZGVmaW5lIEFUTV9DRUxMX1NJWkUJCSAgICA1MwkvKiBBVE0gY2VsbCBzaXplIGluY2wuIGhlYWRlciAqLworI2RlZmluZSBBVE1fQ0VMTF9QQVlMT0FECSAgICA0OAkvKiBBVE0gcGF5bG9hZCBzaXplICovCisjZGVmaW5lIEFUTV9BQUwwX1NEVQkJICAgIDUyCS8qIEFBTDAgU0RVIHNpemUgKi8KKyNkZWZpbmUgQVRNX01BWF9BQUwzNF9QRFUJIDY1NTM1CS8qIG1heGltdW0gQUFMMy80IFBEVSBwYXlsb2FkICovCisjZGVmaW5lIEFUTV9BQUw1X1RSQUlMRVIJICAgICA4CS8qIEFBTDUgdHJhaWxlciBzaXplICovCisjZGVmaW5lIEFUTV9NQVhfQUFMNV9QRFUJIDY1NTM1CS8qIG1heGltdW0gQUFMNSBQRFUgcGF5bG9hZCAqLworI2RlZmluZSBBVE1fTUFYX0NEVgkJICA5OTk5CS8qIG1heGltdW0gKGRlZmF1bHQpIENEViAqLworI2RlZmluZSBBVE1fTk9UX1JTVl9WQ0kJCSAgICAzMgkvKiBmaXJzdCBub24tcmVzZXJ2ZWQgVkNJIHZhbHVlICovCisKKyNkZWZpbmUgQVRNX01BWF9WUEkJCSAgIDI1NQkvKiBtYXhpbXVtIFZQSSBhdCB0aGUgVU5JICovCisjZGVmaW5lIEFUTV9NQVhfVlBJX05OSQkJICA0MDk2CS8qIG1heGltdW0gVlBJIGF0IHRoZSBOTkkgKi8KKyNkZWZpbmUgQVRNX01BWF9WQ0kJCSA2NTUzNQkvKiBtYXhpbXVtIFZDSSAqLworCisKKy8qICJwcm90Y29sIiB2YWx1ZXMgZm9yIHRoZSBzb2NrZXQgc3lzdGVtIGNhbGwgKi8KKyNkZWZpbmUgQVRNX05PX0FBTAkwCQkvKiBBQUwgbm90IHNwZWNpZmllZCAqLworI2RlZmluZSBBVE1fQUFMMAkxMwkJLyogInJhdyIgQVRNIGNlbGxzICovCisjZGVmaW5lIEFUTV9BQUwxCTEJCS8qIEFBTDEgKENCUikgKi8KKyNkZWZpbmUgQVRNX0FBTDIJMgkJLyogQUFMMiAoVkJSKSAqLworI2RlZmluZSBBVE1fQUFMMzQJMwkJLyogQUFMMy80IChkYXRhKSAqLworI2RlZmluZSBBVE1fQUFMNQk1CQkvKiBBQUw1IChkYXRhKSAqLworCisvKgorICogc29ja2V0IG9wdGlvbiBuYW1lIGNvZGluZyBmdW5jdGlvbnMKKyAqCisgKiBOb3RlIHRoYXQgX19TT19FTkNPREUgYW5kIF9fU09fTEVWRUwgYXJlIHNvbWV3aGF0IGEgaGFjayBzaW5jZSB0aGUKKyAqIDw8IDIyIG9ubHkgcmVzZXJ2ZXMgOSBiaXRzIGZvciB0aGUgbGV2ZWwuICBPbiBzb21lIGFyY2hpdGVjdHVyZXMKKyAqIFNPTF9TT0NLRVQgaXMgMHhGRkZGLCBzbyB0aGF0J3MgYSBiaXQgb2YgYSBwcm9ibGVtCisgKi8KKworI2RlZmluZSBfX1NPX0VOQ09ERShsLG4sdCkJKCgoKGwpICYgMHgxRkYpIDw8IDIyKSB8ICgobikgPDwgMTYpIHwgXAorCQkJCXNpemVvZih0KSkKKyNkZWZpbmUgX19TT19MRVZFTF9NQVRDSChjLG0pCSgoKGMpID4+IDIyKSA9PSAoKG0pICYgMHgxRkYpKQorI2RlZmluZSBfX1NPX05VTUJFUihjKQkJKCgoYykgPj4gMTYpICYgMHgzZikKKyNkZWZpbmUgX19TT19TSVpFKGMpCQkoKGMpICYgMHgzZmZmKQorCisvKgorICogQVRNIGxheWVyCisgKi8KKworI2RlZmluZSBTT19TRVRDTFAJX19TT19FTkNPREUoU09MX0FUTSwwLGludCkKKwkJCSAgICAvKiBzZXQgQ0xQIGJpdCB2YWx1ZSAtIFRPRE8gKi8KKyNkZWZpbmUgU09fQ0lSQU5HRQlfX1NPX0VOQ09ERShTT0xfQVRNLDEsc3RydWN0IGF0bV9jaXJhbmdlKQorCQkJICAgIC8qIGNvbm5lY3Rpb24gaWRlbnRpZmllciByYW5nZTsgc29ja2V0IG11c3QgYmUKKwkJCSAgICAgICBib3VuZCBvciBjb25uZWN0ZWQgKi8KKyNkZWZpbmUgU09fQVRNUU9TCV9fU09fRU5DT0RFKFNPTF9BVE0sMixzdHJ1Y3QgYXRtX3FvcykKKwkJCSAgICAvKiBRdWFsaXR5IG9mIFNlcnZpY2Ugc2V0dGluZyAqLworI2RlZmluZSBTT19BVE1TQVAJX19TT19FTkNPREUoU09MX0FUTSwzLHN0cnVjdCBhdG1fc2FwKQorCQkJICAgIC8qIFNlcnZpY2UgQWNjZXNzIFBvaW50ICovCisjZGVmaW5lIFNPX0FUTVBWQwlfX1NPX0VOQ09ERShTT0xfQVRNLDQsc3RydWN0IHNvY2thZGRyX2F0bXB2YykKKwkJCSAgICAvKiAiUFZDIiBhZGRyZXNzIChhbHNvIGZvciBTVkNzKTsgZ2V0IG9ubHkgKi8KKyNkZWZpbmUgU09fTVVMVElQT0lOVAlfX1NPX0VOQ09ERShTT0xfQVRNLCA1LCBpbnQpCisJCQkgICAgLyogbWFrZSB0aGlzIHZjIGEgcDJtcCAqLworCisKKy8qCisgKiBOb3RlIEBAQDogc2luY2UgdGhlIHNvY2tldCBsYXllcnMgZG9uJ3QgcmVhbGx5IGRpc3Rpbmd1aXNoIHRoZSBjb250cm9sIGFuZAorICogdGhlIGRhdGEgcGxhbmUgYnV0IGdlbmVyYWxseSBzZWVtcyB0byBiZSBkYXRhIHBsYW5lLWNlbnRyaWMsIGFueSBsYXllciBpcworICogYWJvdXQgZXF1YWxseSB3cm9uZyBmb3IgdGhlIFNBUC4gSWYgeW91IGhhdmUgYSBiZXR0ZXIgaWRlYSBhYm91dCB0aGlzLAorICogcGxlYXNlIHNwZWFrIHVwIC4uLgorICovCisKKworLyogQVRNIGNlbGwgaGVhZGVyIChmb3IgQUFMMCkgKi8KKworLyogQkVHSU5fQ0ggKi8KKyNkZWZpbmUgQVRNX0hEUl9HRkNfTUFTSwkweGYwMDAwMDAwCisjZGVmaW5lIEFUTV9IRFJfR0ZDX1NISUZUCTI4CisjZGVmaW5lIEFUTV9IRFJfVlBJX01BU0sJMHgwZmYwMDAwMAorI2RlZmluZSBBVE1fSERSX1ZQSV9TSElGVAkyMAorI2RlZmluZSBBVE1fSERSX1ZDSV9NQVNLCTB4MDAwZmZmZjAKKyNkZWZpbmUgQVRNX0hEUl9WQ0lfU0hJRlQJNAorI2RlZmluZSBBVE1fSERSX1BUSV9NQVNLCTB4MDAwMDAwMGUKKyNkZWZpbmUgQVRNX0hEUl9QVElfU0hJRlQJMQorI2RlZmluZSBBVE1fSERSX0NMUAkJMHgwMDAwMDAwMQorLyogRU5EX0NIICovCisKKworLyogUFRJIGNvZGluZ3MgKi8KKworLyogQkVHSU5fUFRJICovCisjZGVmaW5lIEFUTV9QVElfVVMwCTAgIC8qIHVzZXIgZGF0YSBjZWxsLCBjb25nZXN0aW9uIG5vdCBleHAsIFNEVS10eXBlIDAgKi8KKyNkZWZpbmUgQVRNX1BUSV9VUzEJMSAgLyogdXNlciBkYXRhIGNlbGwsIGNvbmdlc3Rpb24gbm90IGV4cCwgU0RVLXR5cGUgMSAqLworI2RlZmluZSBBVE1fUFRJX1VDRVMwCTIgIC8qIHVzZXIgZGF0YSBjZWxsLCBjb25nLiBleHBlcmllbmNlZCwgU0RVLXR5cGUgMCAqLworI2RlZmluZSBBVE1fUFRJX1VDRVMxCTMgIC8qIHVzZXIgZGF0YSBjZWxsLCBjb25nLiBleHBlcmllbmNlZCwgU0RVLXR5cGUgMSAqLworI2RlZmluZSBBVE1fUFRJX1NFR0Y1CTQgIC8qIHNlZ21lbnQgT0FNIEY1IGZsb3cgcmVsYXRlZCBjZWxsICovCisjZGVmaW5lIEFUTV9QVElfRTJFRjUJNSAgLyogZW5kLXRvLWVuZCBPQU0gRjUgZmxvdyByZWxhdGVkIGNlbGwgKi8KKyNkZWZpbmUgQVRNX1BUSV9SU1ZfUk0JNiAgLyogcmVzZXJ2ZWQgZm9yIHRyYWZmaWMgY29udHJvbC9yZXNvdXJjZSBtZ210ICovCisjZGVmaW5lIEFUTV9QVElfUlNWCTcgIC8qIHJlc2VydmVkICovCisvKiBFTkRfUFRJICovCisKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgaXRlbXMgc2hvdWxkIHN0YXkgaW4gbGludXgvYXRtLmgsIHdoaWNoIHNob3VsZCBiZSBsaW5rZWQgdG8KKyAqIG5ldGF0bS9hdG0uaAorICovCisKKy8qIFRyYWZmaWMgZGVzY3JpcHRpb24gKi8KKworI2RlZmluZSBBVE1fTk9ORQkwCQkvKiBubyB0cmFmZmljICovCisjZGVmaW5lIEFUTV9VQlIJCTEKKyNkZWZpbmUgQVRNX0NCUgkJMgorI2RlZmluZSBBVE1fVkJSCQkzCisjZGVmaW5lIEFUTV9BQlIJCTQKKyNkZWZpbmUgQVRNX0FOWUNMQVNTCTUJCS8qIGNvbXBhdGlibGUgd2l0aCBldmVyeXRoaW5nICovCisKKyNkZWZpbmUgQVRNX01BWF9QQ1IJLTEJCS8qIG1heGltdW0gYXZhaWxhYmxlIFBDUiAqLworCitzdHJ1Y3QgYXRtX3RyYWZwcm0geworCXVuc2lnbmVkIGNoYXIJdHJhZmZpY19jbGFzczsJLyogdHJhZmZpYyBjbGFzcyAoQVRNX1VCUiwgLi4uKSAqLworCWludAkJbWF4X3BjcjsJLyogbWF4aW11bSBQQ1IgaW4gY2VsbHMgcGVyIHNlY29uZCAqLworCWludAkJcGNyOwkJLyogZGVzaXJlZCBQQ1IgaW4gY2VsbHMgcGVyIHNlY29uZCAqLworCWludAkJbWluX3BjcjsJLyogbWluaW11bSBQQ1IgaW4gY2VsbHMgcGVyIHNlY29uZCAqLworCWludAkJbWF4X2NkdjsJLyogbWF4aW11bSBDRFYgaW4gbWljcm9zZWNvbmRzICovCisJaW50CQltYXhfc2R1OwkvKiBtYXhpbXVtIFNEVSBpbiBieXRlcyAqLworICAgICAgICAvKiBleHRyYSBwYXJhbXMgZm9yIEFCUiAqLworICAgICAgICB1bnNpZ25lZCBpbnQgCWljcjsgICAgICAgICAJLyogSW5pdGlhbCBDZWxsIFJhdGUgKDI0LWJpdCkgKi8KKyAgICAgICAgdW5zaWduZWQgaW50CXRiZTsJCS8qIFRyYW5zaWVudCBCdWZmZXIgRXhwb3N1cmUgKDI0LWJpdCkgKi8gCisgICAgICAgIHVuc2lnbmVkIGludCAJZnJ0dCA6IDI0OwkvKiBGaXhlZCBSb3VuZCBUcmlwIFRpbWUgKDI0LWJpdCkgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IAlyaWYgIDogNDsgICAgICAgLyogUmF0ZSBJbmNyZW1lbnQgRmFjdG9yICg0LWJpdCkgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IAlyZGYgIDogNDsgICAgICAgLyogUmF0ZSBEZWNyZWFzZSBGYWN0b3IgKDQtYml0KSAqLworICAgICAgICB1bnNpZ25lZCBpbnQgbnJtX3ByZXMgIDoxOyAgICAgIC8qIG5ybSBwcmVzZW50IGJpdCAqLworICAgICAgICB1bnNpZ25lZCBpbnQgdHJtX3ByZXMgIDoxOyAgICAgCS8qIHJtIHByZXNlbnQgYml0ICovCisgICAgICAgIHVuc2lnbmVkIGludCBhZHRmX3ByZXMgOjE7ICAgICAJLyogYWR0ZiBwcmVzZW50IGJpdCAqLworICAgICAgICB1bnNpZ25lZCBpbnQgY2RmX3ByZXMgIDoxOyAgICAJLyogY2RmIHByZXNlbnQgYml0Ki8KKyAgICAgICAgdW5zaWduZWQgaW50IG5ybSAgICAgICA6MzsgICAgIAkvKiBNYXggIyBvZiBDZWxscyBmb3IgZWFjaCBmb3J3YXJkIFJNIGNlbGwgKDMtYml0KSAqLworICAgICAgICB1bnNpZ25lZCBpbnQgdHJtICAgICAgIDozOyAgICAJLyogVGltZSBiZXR3ZWVuIGZvcndhcmQgUk0gY2VsbHMgKDMtYml0KSAqLyAgICAKKwl1bnNpZ25lZCBpbnQgYWR0ZiAgICAgIDoxMDsgICAgIC8qIEFDUiBEZWNyZWFzZSBUaW1lIEZhY3RvciAoMTAtYml0KSAqLworCXVuc2lnbmVkIGludCBjZGYgICAgICAgOjM7ICAgICAgLyogQ3V0b2ZmIERlY3JlYXNlIEZhY3RvciAoMy1iaXQpICovCisgICAgICAgIHVuc2lnbmVkIGludCBzcGFyZSAgICAgOjk7ICAgICAgLyogc3BhcmUgYml0cyAqLyAKK307CisKK3N0cnVjdCBhdG1fcW9zIHsKKwlzdHJ1Y3QgYXRtX3RyYWZwcm0gdHh0cDsJLyogcGFyYW1ldGVycyBpbiBUWCBkaXJlY3Rpb24gKi8KKwlzdHJ1Y3QgYXRtX3RyYWZwcm0gcnh0cCBfX0FUTV9BUElfQUxJR047CisJCQkJCS8qIHBhcmFtZXRlcnMgaW4gUlggZGlyZWN0aW9uICovCisJdW5zaWduZWQgY2hhciBhYWwgX19BVE1fQVBJX0FMSUdOOworfTsKKworLyogUFZDIGFkZHJlc3NpbmcgKi8KKworI2RlZmluZSBBVE1fSVRGX0FOWQktMQkJLyogIm1hZ2ljIiBQVkMgYWRkcmVzcyB2YWx1ZXMgKi8KKyNkZWZpbmUgQVRNX1ZQSV9BTlkJLTEKKyNkZWZpbmUgQVRNX1ZDSV9BTlkJLTEKKyNkZWZpbmUgQVRNX1ZQSV9VTlNQRUMJLTIKKyNkZWZpbmUgQVRNX1ZDSV9VTlNQRUMJLTIKKworCitzdHJ1Y3Qgc29ja2FkZHJfYXRtcHZjIHsKKwl1bnNpZ25lZCBzaG9ydCAJc2FwX2ZhbWlseTsJLyogYWRkcmVzcyBmYW1pbHksIEFGX0FUTVBWQyAgKi8KKwlzdHJ1Y3QgewkJCS8qIFBWQyBhZGRyZXNzICovCisJCXNob3J0CWl0ZjsJCS8qIEFUTSBpbnRlcmZhY2UgKi8KKwkJc2hvcnQJdnBpOwkJLyogVlBJIChvbmx5IDggYml0cyBhdCBVTkkpICovCisJCWludAl2Y2k7CQkvKiBWQ0kgKG9ubHkgMTYgYml0cyBhdCBVTkkpICovCisJfSBzYXBfYWRkciBfX0FUTV9BUElfQUxJR047CS8qIFBWQyBhZGRyZXNzICovCit9OworCisvKiBTVkMgYWRkcmVzc2luZyAqLworCisjZGVmaW5lCUFUTV9FU0FfTEVOCTIwCQkvKiBBVE0gRW5kIFN5c3RlbSBBZGRyZXNzIGxlbmd0aCAqLworI2RlZmluZSBBVE1fRTE2NF9MRU4JMTIJCS8qIG1heGltdW0gRS4xNjQgbnVtYmVyIGxlbmd0aCAqLworCisjZGVmaW5lIEFUTV9BRklfRENDCTB4MzkJCS8qIERDQyBBVE0gRm9ybWF0ICovCisjZGVmaW5lIEFUTV9BRklfSUNECTB4NDcJCS8qIElDRCBBVE0gRm9ybWF0ICovCisjZGVmaW5lIEFUTV9BRklfRTE2NAkweDQ1CQkvKiBFLjE2NCBBVE0gRm9ybWF0ICovCisjZGVmaW5lIEFUTV9BRklfTE9DQUwJMHg0OQkJLyogTG9jYWwgQVRNIEZvcm1hdCAqLyAKKworI2RlZmluZSBBVE1fQUZJX0RDQ19HUk9VUAkweEJECS8qIERDQyBBVE0gR3JvdXAgRm9ybWF0ICovCisjZGVmaW5lIEFUTV9BRklfSUNEX0dST1VQCTB4QzUJLyogSUNEIEFUTSBHcm91cCBGb3JtYXQgKi8KKyNkZWZpbmUgQVRNX0FGSV9FMTY0X0dST1VQCTB4QzMJLyogRS4xNjQgQVRNIEdyb3VwIEZvcm1hdCAqLworI2RlZmluZSBBVE1fQUZJX0xPQ0FMX0dST1VQCTB4QzcJLyogTG9jYWwgQVRNIEdyb3VwIEZvcm1hdCAqLworCisjZGVmaW5lIEFUTV9MSUpfTk9ORQkwCQkvKiBubyBsZWFmLWluaXRpYXRlZCBqb2luICovCisjZGVmaW5lIEFUTV9MSUoJCTEJCS8qIHJlcXVlc3Qgam9pbmluZyAqLworI2RlZmluZSBBVE1fTElKX1JQSgkyCQkvKiBzZXQgdG8gcm9vdC1wcm9tcHRlZCBqb2luICovCisjZGVmaW5lIEFUTV9MSUpfTkoJMwkJLyogc2V0IHRvIG5ldHdvcmsgam9pbiAqLworCisKK3N0cnVjdCBzb2NrYWRkcl9hdG1zdmMgeworICAgIHVuc2lnbmVkIHNob3J0IAlzYXNfZmFtaWx5OwkvKiBhZGRyZXNzIGZhbWlseSwgQUZfQVRNU1ZDICovCisgICAgc3RydWN0IHsJCQkJLyogU1ZDIGFkZHJlc3MgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhcglwcnZbQVRNX0VTQV9MRU5dOy8qIHByaXZhdGUgQVRNIGFkZHJlc3MgKi8KKyAgICAgICAgY2hhcgkJcHViW0FUTV9FMTY0X0xFTisxXTsgLyogcHVibGljIGFkZHJlc3MgKEUuMTY0KSAqLworICAgIAkJCQkJLyogdW51c2VkIGFkZHJlc3NlcyBtdXN0IGJlIGJ6ZXJvJ2VkICovCisJY2hhcgkJbGlqX3R5cGU7CS8qIHJvbGUgaW4gTElKIGNhbGw7IG9uZSBvZiBBVE1fTElKKiAqLworCV9fdTMyCWxpal9pZDsJCS8qIExJSiBjYWxsIGlkZW50aWZpZXIgKi8KKyAgICB9IHNhc19hZGRyIF9fQVRNX0FQSV9BTElHTjsJCS8qIFNWQyBhZGRyZXNzICovCit9OworCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBhdG1zdmNfYWRkcl9pbl91c2Uoc3RydWN0IHNvY2thZGRyX2F0bXN2YyBhZGRyKQoreworCXJldHVybiAqYWRkci5zYXNfYWRkci5wcnYgfHwgKmFkZHIuc2FzX2FkZHIucHViOworfQorCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBhdG1wdmNfYWRkcl9pbl91c2Uoc3RydWN0IHNvY2thZGRyX2F0bXB2YyBhZGRyKQoreworCXJldHVybiBhZGRyLnNhcF9hZGRyLml0ZiB8fCBhZGRyLnNhcF9hZGRyLnZwaSB8fCBhZGRyLnNhcF9hZGRyLnZjaTsKK30KKworCisvKgorICogU29tZSBzdHVmZiBmb3IgbGludXgvc29ja2lvcy5oCisgKi8KKworc3RydWN0IGF0bWlmX3Npb2MgeworCWludCBudW1iZXI7CisJaW50IGxlbmd0aDsKKwl2b2lkICphcmc7Cit9OworCisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgYXRtX2JhY2tlbmRfdDsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1fZW5pLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV9lbmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGYzMTc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1fZW5pLmgKQEAgLTAsMCArMSwyMyBAQAorLyogYXRtX2VuaS5oIC0gRHJpdmVyLXNwZWNpZmljIGRlY2xhcmF0aW9ucyBvZiB0aGUgRU5JIGRyaXZlciAoZm9yIHVzZSBieQorCSAgICAgICBkcml2ZXItc3BlY2lmaWMgdXRpbGl0aWVzKSAqLworCisvKiBXcml0dGVuIDE5OTUtMjAwMCBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwgTFJDL0lDQSAqLworCisKKyNpZm5kZWYgTElOVVhfQVRNX0VOSV9ICisjZGVmaW5lIExJTlVYX0FUTV9FTklfSAorCisjaW5jbHVkZSA8bGludXgvYXRtaW9jLmg+CisKKworc3RydWN0IGVuaV9tdWx0aXBsaWVycyB7CisJaW50IHR4LHJ4OwkvKiB2YWx1ZXMgYXJlIGluIHBlcmNlbnQgYW5kIG11c3QgYmUgPiAxMDAgKi8KK307CisKKworI2RlZmluZSBFTklfTUVNRFVNUCAgICAgX0lPVygnYScsQVRNSU9DX1NBUlBSVixzdHJ1Y3QgYXRtaWZfc2lvYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByaW50ayBtZW1vcnkgbWFwICovCisjZGVmaW5lIEVOSV9TRVRNVUxUCV9JT1coJ2EnLEFUTUlPQ19TQVJQUlYrNyxzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJCS8qIHNldCBidWZmZXIgbXVsdGlwbGllcnMgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV9oZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1faGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTc3MTNiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1faGUuaApAQCAtMCwwICsxLDIwIEBACisvKiBhdG1faGUuaCAqLworCisjaWZuZGVmIExJTlVYX0FUTV9IRV9ICisjZGVmaW5lIExJTlVYX0FUTV9IRV9ICisKKyNpbmNsdWRlIDxsaW51eC9hdG1pb2MuaD4KKworI2RlZmluZSBIRV9HRVRfUkVHCV9JT1coJ2EnLCBBVE1JT0NfU0FSUFJWLCBzdHJ1Y3QgYXRtaWZfc2lvYykKKworI2RlZmluZSBIRV9SRUdUWVBFX1BDSQkxCisjZGVmaW5lIEhFX1JFR1RZUEVfUkNNCTIKKyNkZWZpbmUgSEVfUkVHVFlQRV9UQ00JMworI2RlZmluZSBIRV9SRUdUWVBFX01CT1gJNAorCitzdHJ1Y3QgaGVfaW9jdGxfcmVnIHsKKwl1bnNpZ25lZCBhZGRyLCB2YWw7CisJY2hhciB0eXBlOworfTsKKworI2VuZGlmIC8qIExJTlVYX0FUTV9IRV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV9pZHQ3NzEwNS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1faWR0NzcxMDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjcyNDAwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1faWR0NzcxMDUuaApAQCAtMCwwICsxLDI4IEBACisvKiBhdG1faWR0NzcxMDUuaCAtIERyaXZlci1zcGVjaWZpYyBkZWNsYXJhdGlvbnMgb2YgdGhlIElEVDc3MTA1IGRyaXZlciAoZm9yCisgKiB1c2UgYnkgZHJpdmVyLXNwZWNpZmljIHV0aWxpdGllcykgKi8KKworLyogV3JpdHRlbiAxOTk5IGJ5IEdyZWcgQmFua3MgPGduYkBsaW51eGZhbi5jb20+LiBDb3BpZWQgZnJvbSBhdG1fc3VuaS5oLiAqLworCisKKyNpZm5kZWYgTElOVVhfQVRNX0lEVDc3MTA1X0gKKyNkZWZpbmUgTElOVVhfQVRNX0lEVDc3MTA1X0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvYXRtaW9jLmg+CisjaW5jbHVkZSA8bGludXgvYXRtZGV2Lmg+CisKKy8qCisgKiBTdHJ1Y3R1cmUgZm9yIElEVDc3MTA1X0dFVFNUQVQgYW5kIElEVDc3MTA1X0dFVFNUQVRaIGlvY3Rscy4KKyAqIFBvaW50ZWQgdG8gYnkgYGFyZycgaW4gYXRtaWZfc2lvYy4KKyAqLworc3RydWN0IGlkdDc3MTA1X3N0YXRzIHsKKyAgICAgICAgX191MzIgc3ltYm9sX2Vycm9yczsgIC8qIHdpcmUgc3ltYm9sIGVycm9ycyAqLworICAgICAgICBfX3UzMiB0eF9jZWxsczsgICAgICAgLyogY2VsbHMgdHJhbnNtaXR0ZWQgKi8KKyAgICAgICAgX191MzIgcnhfY2VsbHM7ICAgICAgIC8qIGNlbGxzIHJlY2VpdmVkICovCisgICAgICAgIF9fdTMyIHJ4X2hlY19lcnJvcnM7ICAvKiBIZWFkZXIgRXJyb3IgQ2hlY2sgZXJyb3JzIG9uIHJlY2VpdmUgKi8KK307CisKKyNkZWZpbmUgSURUNzcxMDVfR0VUU1RBVAlfSU9XKCdhJyxBVE1JT0NfUEhZUFJWKzIsc3RydWN0IGF0bWlmX3Npb2MpCS8qIGdldCBzdGF0cyAqLworI2RlZmluZSBJRFQ3NzEwNV9HRVRTVEFUWglfSU9XKCdhJyxBVE1JT0NfUEhZUFJWKzMsc3RydWN0IGF0bWlmX3Npb2MpCS8qIGdldCBzdGF0cyBhbmQgemVybyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtX25pY3N0YXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtX25pY3N0YXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzdiNzlmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1fbmljc3Rhci5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhdG1fbmljc3Rhci5oCisgKgorICogRHJpdmVyLXNwZWNpZmljIGRlY2xhcmF0aW9ucyBmb3IgdXNlIGJ5IE5JQ1NUQVIgZHJpdmVyIHNwZWNpZmljIHV0aWxzLgorICoKKyAqIEF1dGhvcjogUnVpIFByaW9yCisgKgorICogKEMpIElORVNDIDE5OTgKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgTElOVVhfQVRNX05JQ1NUQVJfSAorI2RlZmluZSBMSU5VWF9BVE1fTklDU1RBUl9ICisKKy8qIE5vdGU6IG5vbi1rZXJuZWwgcHJvZ3JhbXMgaW5jbHVkaW5nIHRoaXMgZmlsZSBtdXN0IGFsc28gaW5jbHVkZQorICogc3lzL3R5cGVzLmggZm9yIHN0cnVjdCB0aW1ldmFsCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2F0bWFwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWlvYy5oPgorCisjZGVmaW5lIE5TX0dFVFBTVEFUCV9JT1dSKCdhJyxBVE1JT0NfU0FSUFJWKzEsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCQkvKiBnZXQgcG9vbCBzdGF0aXN0aWNzICovCisjZGVmaW5lIE5TX1NFVEJVRkxFVglfSU9XKCdhJyxBVE1JT0NfU0FSUFJWKzIsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCQkvKiBzZXQgYnVmZmVyIGxldmVsIG1hcmtlcnMgKi8KKyNkZWZpbmUgTlNfQURKQlVGTEVWCV9JTygnYScsQVRNSU9DX1NBUlBSViszKQorCQkJCQkJLyogYWRqdXN0IGJ1ZmZlciBsZXZlbCAqLworCit0eXBlZGVmIHN0cnVjdCBidWZfbnIKK3sKKyAgIHVuc2lnbmVkIG1pbjsKKyAgIHVuc2lnbmVkIGluaXQ7CisgICB1bnNpZ25lZCBtYXg7Cit9YnVmX25yOworCisKK3R5cGVkZWYgc3RydWN0IHBvb2xfbGV2ZWxzCit7CisgICBpbnQgYnVmdHlwZTsKKyAgIGludCBjb3VudDsJCS8qIChBdCBsZWFzdCBmb3Igbm93KSBvbmx5IHVzZWQgaW4gTlNfR0VUUFNUQVQgKi8KKyAgIGJ1Zl9uciBsZXZlbDsKK30gcG9vbF9sZXZlbHM7CisKKy8qIHR5cGUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzogKi8KKyNkZWZpbmUgTlNfQlVGVFlQRV9TTUFMTCAxCisjZGVmaW5lIE5TX0JVRlRZUEVfTEFSR0UgMgorI2RlZmluZSBOU19CVUZUWVBFX0hVR0UgMworI2RlZmluZSBOU19CVUZUWVBFX0lPVkVDIDQKKworCisjZW5kaWYgLyogTElOVVhfQVRNX05JQ1NUQVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1fdGNwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV90Y3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTJlNmFiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1fdGNwLmgKQEAgLTAsMCArMSw2MSBAQAorLyogYXRtX3RjcC5oIC0gRHJpdmVyLXNwZWNpZmljIGRlY2xhcmF0aW9ucyBvZiB0aGUgQVRNVENQIGRyaXZlciAoZm9yIHVzZSBieQorCSAgICAgICBkcml2ZXItc3BlY2lmaWMgdXRpbGl0aWVzKSAqLworCisvKiBXcml0dGVuIDE5OTctMjAwMCBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwgTFJDL0lDQSAqLworCisKKyNpZm5kZWYgTElOVVhfQVRNX1RDUF9ICisjZGVmaW5lIExJTlVYX0FUTV9UQ1BfSAorCisjaW5jbHVkZSA8bGludXgvYXRtYXBpLmg+CisjaW5jbHVkZSA8bGludXgvYXRtLmg+CisjaW5jbHVkZSA8bGludXgvYXRtaW9jLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworCisvKgorICogQWxsIHZhbHVlcyBpbiBzdHJ1Y3QgYXRtdGNwX2hkciBhcmUgaW4gbmV0d29yayBieXRlIG9yZGVyCisgKi8KKworc3RydWN0IGF0bXRjcF9oZHIgeworCV9fdTE2CXZwaTsKKwlfX3UxNgl2Y2k7CisJX191MzIJbGVuZ3RoOwkJLyogLi4uIG9mIGRhdGEgcGFydCAqLworfTsKKworLyoKKyAqIEFsbCB2YWx1ZXMgaW4gc3RydWN0IGF0bXRjcF9jb21tYW5kIGFyZSBpbiBob3N0IGJ5dGUgb3JkZXIKKyAqLworCisjZGVmaW5lIEFUTVRDUF9IRFJfTUFHSUMJKH4wKQkvKiB0aGlzIGxlbmd0aCBpbmRpY2F0ZXMgYSBjb21tYW5kICovCisjZGVmaW5lIEFUTVRDUF9DVFJMX09QRU4JMQkvKiByZXF1ZXN0L3JlcGx5ICovCisjZGVmaW5lIEFUTVRDUF9DVFJMX0NMT1NFCTIJLyogcmVxdWVzdC9yZXBseSAqLworCitzdHJ1Y3QgYXRtdGNwX2NvbnRyb2wgeworCXN0cnVjdCBhdG10Y3BfaGRyIGhkcjsJLyogbXVzdCBiZSBmaXJzdCAqLworCWludCB0eXBlOwkJLyogbWVzc2FnZSB0eXBlOyBib3RoIGRpcmVjdGlvbnMgKi8KKwlhdG1fa3B0cl90IHZjYzsJCS8qIGJvdGggZGlyZWN0aW9ucyAqLworCXN0cnVjdCBzb2NrYWRkcl9hdG1wdmMgYWRkcjsgLyogc3VnZ2VzdGVkIHZhbHVlIGZyb20ga2VybmVsICovCisJc3RydWN0IGF0bV9xb3MJcW9zOwkvKiBib3RoIGRpcmVjdGlvbnMgKi8KKwlpbnQgcmVzdWx0OwkJLyogdG8ga2VybmVsIG9ubHkgKi8KK30gX19BVE1fQVBJX0FMSUdOOworCisvKgorICogRmllbGQgdXNhZ2U6CisgKiBNZXNzZ2UgdHlwZQlkaXIuCWhkci52P2kJdHlwZQlhZGRyCXFvcwl2Y2MJcmVzdWx0CisgKiAtLS0tLS0tLS0tLSAgLS0tLQktLS0tLS0tIC0tLS0JLS0tLQktLS0JLS0tCS0tLS0tLQorICogT1BFTgkJSy0+RAlZCVkJWQlZCVkJMAorICogT1BFTgkJRC0+SwktCVkJWQlZCVkJWQorICogQ0xPU0UJSy0+RAktCS0JWQktCVkJMAorICogQ0xPU0UJRC0+SwktCS0JLQktCVkJWQorICovCisKKyNkZWZpbmUgU0lPQ1NJRkFUTVRDUAlfSU8oJ2EnLEFUTUlPQ19JVEYpCS8qIHNldCBBVE1UQ1AgbW9kZSAqLworI2RlZmluZSBBVE1UQ1BfQ1JFQVRFCV9JTygnYScsQVRNSU9DX0lURisxNCkJLyogY3JlYXRlIHBlcnNpc3RlbnQgQVRNVENQCisJCQkJCQkgICBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgQVRNVENQX1JFTU9WRQlfSU8oJ2EnLEFUTUlPQ19JVEYrMTUpCS8qIGRlc3Ryb3kgcGVyc2lzdGVudCBBVE1UQ1AKKwkJCQkJCSAgIGludGVyZmFjZSAqLworCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV96YXRtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV96YXRtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBmMGZhMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtX3phdG0uaApAQCAtMCwwICsxLDUyIEBACisvKiBhdG1femF0bS5oIC0gRHJpdmVyLXNwZWNpZmljIGRlY2xhcmF0aW9ucyBvZiB0aGUgWkFUTSBkcml2ZXIgKGZvciB1c2UgYnkKKwkJZHJpdmVyLXNwZWNpZmljIHV0aWxpdGllcykgKi8KKworLyogV3JpdHRlbiAxOTk1LTE5OTkgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKworCisjaWZuZGVmIExJTlVYX0FUTV9aQVRNX0gKKyNkZWZpbmUgTElOVVhfQVRNX1pBVE1fSAorCisvKgorICogTm90ZTogbm9uLWtlcm5lbCBwcm9ncmFtcyBpbmNsdWRpbmcgdGhpcyBmaWxlIG11c3QgYWxzbyBpbmNsdWRlCisgKiBzeXMvdHlwZXMuaCBmb3Igc3RydWN0IHRpbWV2YWwKKyAqLworCisjaW5jbHVkZSA8bGludXgvYXRtYXBpLmg+CisjaW5jbHVkZSA8bGludXgvYXRtaW9jLmg+CisKKyNkZWZpbmUgWkFUTV9HRVRQT09MCV9JT1coJ2EnLEFUTUlPQ19TQVJQUlYrMSxzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJCS8qIGdldCBwb29sIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgWkFUTV9HRVRQT09MWglfSU9XKCdhJyxBVE1JT0NfU0FSUFJWKzIsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCQkvKiBnZXQgc3RhdGlzdGljcyBhbmQgemVybyAqLworI2RlZmluZSBaQVRNX1NFVFBPT0wJX0lPVygnYScsQVRNSU9DX1NBUlBSViszLHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkJLyogc2V0IHBvb2wgcGFyYW1ldGVycyAqLworCitzdHJ1Y3QgemF0bV9wb29sX2luZm8geworCWludCByZWZfY291bnQ7CQkJLyogZnJlZSBidWZmZXIgcG9vbCB1c2FnZSBjb3VudGVycyAqLworCWludCBsb3dfd2F0ZXIsaGlnaF93YXRlcjsJLyogcmVmaWxsIHBhcmFtZXRlcnMgKi8KKwlpbnQgcnFhX2NvdW50LHJxdV9jb3VudDsJLyogcXVldWUgY29uZGl0aW9uIGNvdW50ZXJzICovCisJaW50IG9mZnNldCxuZXh0X29mZjsJCS8qIGFsaWdubWVudCBvcHRpbWl6YXRpb25zOiBvZmZzZXQgKi8KKwlpbnQgbmV4dF9jbnQsbmV4dF90aHJlczsJLyogcmVwZXRpdGlvbiBjb3VudGVyIGFuZCB0aHJlc2hvbGQgKi8KK307CisKK3N0cnVjdCB6YXRtX3Bvb2xfcmVxIHsKKwlpbnQgcG9vbF9udW07CQkJLyogcG9vbCBudW1iZXIgKi8KKwlzdHJ1Y3QgemF0bV9wb29sX2luZm8gaW5mbzsJLyogYWN0dWFsIGluZm9ybWF0aW9uICovCit9OworCitzdHJ1Y3QgemF0bV90X2hpc3QgeworCXN0cnVjdCB0aW1ldmFsIHJlYWw7CQkvKiByZWFsICh3YWxsLWNsb2NrKSB0aW1lICovCisJc3RydWN0IHRpbWV2YWwgZXhwZWN0ZWQ7CS8qIGV4cGVjdGVkIHJlYWwgdGltZSAqLworfTsKKworCisjZGVmaW5lIFpBVE1fT0FNX1BPT0wJCTAJLyogZnJlZSBidWZmZXIgcG9vbCBmb3IgT0FNIGNlbGxzICovCisjZGVmaW5lIFpBVE1fQUFMMF9QT09MCQkxCS8qIGZyZWUgYnVmZmVyIHBvb2wgZm9yIEFBTDAgY2VsbHMgKi8KKyNkZWZpbmUgWkFUTV9BQUw1X1BPT0xfQkFTRQkyCS8qIGZpcnN0IEFBTDUgZnJlZSBidWZmZXIgcG9vbCAqLworI2RlZmluZSBaQVRNX0xBU1RfUE9PTAlaQVRNX0FBTDVfUE9PTF9CQVNFKzEwIC8qIG1heC4gNjQga0IgKi8KKworI2RlZmluZSBaQVRNX1RJTUVSX0hJU1RPUllfU0laRQkxNgkvKiBudW1iZXIgb2YgdGltZXIgYWRqdXN0bWVudHMgdG8KKwkJCQkJICAgcmVjb3JkOyBtdXN0IGJlIDJebiAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtYXBpLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZTU0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWFwaS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIGF0bWFwaS5oIC0gQVRNIEFQSSB1c2VyIHNwYWNlL2tlcm5lbCBjb21wYXRpYmlsaXR5ICovCisgCisvKiBXcml0dGVuIDE5OTksMjAwMCBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwgSUNBICovCisgCisKKyNpZm5kZWYgX0xJTlVYX0FUTUFQSV9ICisjZGVmaW5lIF9MSU5VWF9BVE1BUElfSAorCisjaWYgZGVmaW5lZChfX3NwYXJjX18pIHx8IGRlZmluZWQoX19pYTY0X18pCisvKiBzdWNoIGFsaWdubWVudCBpcyBub3QgcmVxdWlyZWQgb24gMzIgYml0IHNwYXJjcywgYnV0IHdlIGNhbid0CisgICBmaWd1cmUgdGhhdCB3ZSBhcmUgb24gYSBzcGFyYzY0IHdoaWxlIGNvbXBpbGluZyB1c2VyLXNwYWNlIHByb2dyYW1zLiAqLworI2RlZmluZSBfX0FUTV9BUElfQUxJR04JX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpCisjZWxzZQorI2RlZmluZSBfX0FUTV9BUElfQUxJR04KKyNlbmRpZgorCisKKy8qCisgKiBPcGFxdWUgdHlwZSBmb3Iga2VybmVsIHBvaW50ZXJzLiBOb3RlIHRoYXQgXyBpcyBuZXZlciBhY2Nlc3NlZC4gV2UgbmVlZAorICogdGhlIHN0cnVjdCBpbiBvcmRlciBoaWRlIHRoZSBhcnJheSwgc28gdGhhdCB3ZSBjYW4gbWFrZSBzaW1wbGUgYXNzaWdubWVudHMKKyAqIGluc3RlYWQgb2YgYmVpbmcgZm9yY2VkIHRvIHVzZSBtZW1jcHkuIEl0IGFsc28gaW1wcm92ZXMgZXJyb3IgcmVwb3J0aW5nIGZvcgorICogY29kZSB0aGF0IHN0aWxsIGFzc3VtZXMgdGhhdCB3ZSdyZSBwYXNzaW5nIHVuc2lnbmVkIGxvbmdzLgorICoKKyAqIENvbnZlbnRpb246IE5VTEwgcG9pbnRlcnMgYXJlIHBhc3NlZCBhcyBhIGZpZWxkIG9mIGFsbCB6ZXJvZXMuCisgKi8KKyAKK3R5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgY2hhciBfWzhdOyB9IF9fQVRNX0FQSV9BTElHTiBhdG1fa3B0cl90OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtYXJwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWFycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMWY0YmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWFycC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qIGF0bWFycC5oIC0gQVRNIEFSUCBwcm90b2NvbCBhbmQga2VybmVsLWRlbW9uIGludGVyZmFjZSBkZWZpbml0aW9ucyAqLworIAorLyogV3JpdHRlbiAxOTk1LTE5OTkgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKyAKKworI2lmbmRlZiBfTElOVVhfQVRNQVJQX0gKKyNkZWZpbmUgX0xJTlVYX0FUTUFSUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWFwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWlvYy5oPgorCisKKyNkZWZpbmUgQVRNQVJQX1JFVFJZX0RFTEFZIDMwCQkvKiByZXF1ZXN0IG5leHQgcmVzb2x1dGlvbiBvciBmb3JnZXQKKwkJCQkJICAgTkFLIGFmdGVyIDMwIHNlYyAtIHNob3VsZCBnbyBpbnRvCisJCQkJCSAgIGF0bWNsaXAuaCAqLworI2RlZmluZSBBVE1BUlBfTUFYX1VOUkVTX1BBQ0tFVFMgNQkvKiBxdWV1ZSB0aGF0IG1hbnkgcGFja2V0cyB3aGlsZQorCQkJCQkgICB3YWl0aW5nIGZvciB0aGUgcmVzb2x2ZXIgKi8KKworCisjZGVmaW5lIEFUTUFSUERfQ1RSTAlfSU8oJ2EnLEFUTUlPQ19DTElQKzEpCS8qIGJlY29tZSBhdG1hcnBkIGN0cmwgc29jayAqLworI2RlZmluZSBBVE1BUlBfTUtJUAlfSU8oJ2EnLEFUTUlPQ19DTElQKzIpCS8qIGF0dGFjaCBzb2NrZXQgdG8gSVAgKi8KKyNkZWZpbmUgQVRNQVJQX1NFVEVOVFJZCV9JTygnYScsQVRNSU9DX0NMSVArMykJLyogZmlsbCBvciBoaWRlIEFSUCBlbnRyeSAqLworI2RlZmluZSBBVE1BUlBfRU5DQVAJX0lPKCdhJyxBVE1JT0NfQ0xJUCs1KQkvKiBjaGFuZ2UgZW5jYXBzdWxhdGlvbiAqLworCisKK2VudW0gYXRtYXJwX2N0cmxfdHlwZSB7CisJYWN0X2ludmFsaWQsCQkvKiBjYXRjaCB1bmluaXRpYWxpemVkIHN0cnVjdHVyZXMgKi8KKwlhY3RfbmVlZCwJCS8qIG5lZWQgYWRkcmVzcyByZXNvbHV0aW9uICovCisJYWN0X3VwLAkJCS8qIGludGVyZmFjZSBpcyBjb21pbmcgdXAgKi8KKwlhY3RfZG93biwJCS8qIGludGVyZmFjZSBpcyBnb2luZyBkb3duICovCisJYWN0X2NoYW5nZQkJLyogaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gaGFzIGNoYW5nZWQgKi8KK307CisKK3N0cnVjdCBhdG1hcnBfY3RybCB7CisJZW51bSBhdG1hcnBfY3RybF90eXBlCXR5cGU7CS8qIG1lc3NhZ2UgdHlwZSAqLworCWludAkJCWl0Zl9udW07LyogaW50ZXJmYWNlIG51bWJlciAoaWYgcHJlc2VudCkgKi8KKwlfX2JlMzIJCQlpcDsJLyogSVAgYWRkcmVzcyAoYWN0X25lZWQgb25seSkgKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1icjI2ODQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtYnIyNjg0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRiMjYyOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtYnIyNjg0LmgKQEAgLTAsMCArMSwxMTcgQEAKKyNpZm5kZWYgX0xJTlVYX0FUTUJSMjY4NF9ICisjZGVmaW5lIF9MSU5VWF9BVE1CUjI2ODRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG0uaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgkJLyogRm9yIElGTkFNU0laICovCisKKy8qCisgKiBUeXBlIG9mIG1lZGlhIHdlJ3JlIGJyaWRnaW5nIChldGhlcm5ldCwgdG9rZW4gcmluZywgZXRjKSAgQ3VycmVudGx5IG9ubHkKKyAqIGV0aGVybmV0IGlzIHN1cHBvcnRlZAorICovCisjZGVmaW5lIEJSMjY4NF9NRURJQV9FVEhFUk5FVAkoMCkJLyogODAyLjMgKi8KKyNkZWZpbmUgQlIyNjg0X01FRElBXzgwMl80CSgxKQkvKiA4MDIuNCAqLworI2RlZmluZSBCUjI2ODRfTUVESUFfVFIJCSgyKQkvKiA4MDIuNSAtIHRva2VuIHJpbmcgKi8KKyNkZWZpbmUgQlIyNjg0X01FRElBX0ZEREkJKDMpCisjZGVmaW5lIEJSMjY4NF9NRURJQV84MDJfNgkoNCkJLyogODAyLjYgKi8KKworCQkJCQkvKiB1c2VkIG9ubHkgYXQgZGV2aWNlIGNyZWF0aW9uOiAgKi8KKyNkZWZpbmUgQlIyNjg0X0ZMQUdfUk9VVEVECSgxPDwxNikJLyogcGF5bG9hZCBpcyByb3V0ZWQsIG5vdCBicmlkZ2VkICovCisKKy8qCisgKiBJcyB0aGVyZSBGQ1MgaW5ib3VuZCBvbiB0aGlzIFZDPyAgVGhpcyBjdXJyZW50bHkgaXNuJ3Qgc3VwcG9ydGVkLgorICovCisjZGVmaW5lIEJSMjY4NF9GQ1NJTl9OTwkJKDApCisjZGVmaW5lIEJSMjY4NF9GQ1NJTl9JR05PUkUJKDEpCisjZGVmaW5lIEJSMjY4NF9GQ1NJTl9WRVJJRlkJKDIpCisKKy8qCisgKiBJcyB0aGVyZSBGQ1Mgb3V0Ym91bmQgb24gdGhpcyBWQz8gIFRoaXMgY3VycmVudGx5IGlzbid0IHN1cHBvcnRlZC4KKyAqLworI2RlZmluZSBCUjI2ODRfRkNTT1VUX05PCSgwKQorI2RlZmluZSBCUjI2ODRfRkNTT1VUX1NFTkRaRVJPCSgxKQorI2RlZmluZSBCUjI2ODRfRkNTT1VUX0dFTkVSQVRFCSgyKQorCisvKgorICogRG9lcyB0aGlzIFZDIGluY2x1ZGUgTExDIGVuY2Fwc3VsYXRpb24/CisgKi8KKyNkZWZpbmUgQlIyNjg0X0VOQ0FQU19WQwkoMCkJLyogVkMtbXV4ICovCisjZGVmaW5lIEJSMjY4NF9FTkNBUFNfTExDCSgxKQorI2RlZmluZSBCUjI2ODRfRU5DQVBTX0FVVE9ERVRFQ1QgKDIpCS8qIFVuc3Vwb3J0ZWQgKi8KKworLyoKKyAqIElzIHRoaXMgVkMgYnJpZGdlZCBvciByb3V0ZWQ/CisgKi8KKworI2RlZmluZSBCUjI2ODRfUEFZTE9BRF9ST1VURUQgICAoMCkKKyNkZWZpbmUgQlIyNjg0X1BBWUxPQURfQlJJREdFRCAgKDEpCisKKy8qCisgKiBUaGlzIGlzIGZvciB0aGUgQVRNX05FV0JBQ0tFTkRJRiBjYWxsIC0gdGhlc2UgYXJlIGxpa2Ugc29ja2V0IGZhbWlsaWVzOgorICogdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHN0cnVjdHVyZSBpcyB0aGUgYmFja2VuZCBudW1iZXIgYW5kIHRoZSByZXN0CisgKiBpcyBwZXItYmFja2VuZCBzcGVjaWZpYworICovCitzdHJ1Y3QgYXRtX25ld2lmX2JyMjY4NCB7CisJYXRtX2JhY2tlbmRfdCBiYWNrZW5kX251bTsJLyogQVRNX0JBQ0tFTkRfQlIyNjg0ICovCisJaW50IG1lZGlhOwkJLyogQlIyNjg0X01FRElBXyosIGZsYWdzIGluIHVwcGVyIGJpdHMgKi8KKwljaGFyIGlmbmFtZVtJRk5BTVNJWl07CisJaW50IG10dTsKK307CisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHNwZWNpZnkgYSBicjI2ODQgaW50ZXJmYWNlIC0gZWl0aGVyIGJ5IGEKKyAqIHBvc2l0aXZlIGludGVnZXIgKHJldHVybmVkIGJ5IEFUTV9ORVdCQUNLRU5ESUYpIG9yIHRoZSBpbnRlcmZhY2VzIG5hbWUKKyAqLworI2RlZmluZSBCUjI2ODRfRklORF9CWU5PVEhJTkcJKDApCisjZGVmaW5lIEJSMjY4NF9GSU5EX0JZTlVNCSgxKQorI2RlZmluZSBCUjI2ODRfRklORF9CWUlGTkFNRQkoMikKK3N0cnVjdCBicjI2ODRfaWZfc3BlYyB7CisJaW50IG1ldGhvZDsJCS8qIEJSMjY4NF9GSU5EXyogKi8KKwl1bmlvbiB7CisJCWNoYXIgaWZuYW1lW0lGTkFNU0laXTsKKwkJaW50IGRldm51bTsKKwl9IHNwZWM7Cit9OworCisvKgorICogVGhpcyBpcyBmb3IgdGhlIEFUTV9TRVRCQUNLRU5EIGNhbGwgLSB0aGVzZSBhcmUgbGlrZSBzb2NrZXQgZmFtaWxpZXM6CisgKiB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgc3RydWN0dXJlIGlzIHRoZSBiYWNrZW5kIG51bWJlciBhbmQgdGhlIHJlc3QKKyAqIGlzIHBlci1iYWNrZW5kIHNwZWNpZmljCisgKi8KK3N0cnVjdCBhdG1fYmFja2VuZF9icjI2ODQgeworCWF0bV9iYWNrZW5kX3QgYmFja2VuZF9udW07CS8qIEFUTV9CQUNLRU5EX0JSMjY4NCAqLworCXN0cnVjdCBicjI2ODRfaWZfc3BlYyBpZnNwZWM7CisJaW50IGZjc19pbjsJCS8qIEJSMjY4NF9GQ1NJTl8qICovCisJaW50IGZjc19vdXQ7CQkvKiBCUjI2ODRfRkNTT1VUXyogKi8KKwlpbnQgZmNzX2F1dG87CQkvKiAxOiBmY3Nfe2luLG91dH0gZGlzYWJsZWQgaWYgbm8gRkNTIHJ4J2VkICovCisJaW50IGVuY2FwczsJCS8qIEJSMjY4NF9FTkNBUFNfKiAqLworCWludCBoYXNfdnBpaWQ7CQkvKiAxOiB1c2UgdnBuX2lkIC0gVW5zdXBwb3J0ZWQgKi8KKwlfX3U4IHZwbl9pZFs3XTsKKwlpbnQgc2VuZF9wYWRkaW5nOwkvKiB1bnN1cHBvcnRlZCAqLworCWludCBtaW5fc2l6ZTsJCS8qIHdlIHdpbGwgcGFkIHNtYWxsZXIgcGFja2V0cyB0aGFuIHRoaXMgKi8KK307CisKKy8qCisgKiBUaGUgQlIyNjg0X1NFVEZJTFQgaW9jdGwgaXMgYW4gZXhwZXJpbWVudGFsIG1lY2hhbmlzbSBmb3IgZm9sa3MKKyAqIHRlcm1pbmF0aW5nIGEgbGFyZ2UgbnVtYmVyIG9mIElQLW9ubHkgdmNjJ3MuICBXaGVuIG5ldGZpbHRlciBhbGxvd3MKKyAqIGVmZmljaWVudCBwZXItaWYgaW4vb3V0IGZpbHRlcnMsIHRoaXMgc3VwcG9ydCB3aWxsIGJlIHJlbW92ZWQKKyAqLworc3RydWN0IGJyMjY4NF9maWx0ZXIgeworCV9fYmUzMiBwcmVmaXg7CQkvKiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKwlfX2JlMzIgbmV0bWFzazsJCS8qIDAgPSBkaXNhYmxlIGZpbHRlciAqLworfTsKKworc3RydWN0IGJyMjY4NF9maWx0ZXJfc2V0IHsKKwlzdHJ1Y3QgYnIyNjg0X2lmX3NwZWMgaWZzcGVjOworCXN0cnVjdCBicjI2ODRfZmlsdGVyIGZpbHRlcjsKK307CisKK2VudW0gYnIyNjg0X3BheWxvYWQgeworCXBfcm91dGVkID0gQlIyNjg0X1BBWUxPQURfUk9VVEVELAorCXBfYnJpZGdlZCA9IEJSMjY4NF9QQVlMT0FEX0JSSURHRUQsCit9OworCisjZGVmaW5lIEJSMjY4NF9TRVRGSUxUCV9JT1coICdhJywgQVRNSU9DX0JBQ0tFTkQgKyAwLCBcCisJCQkJc3RydWN0IGJyMjY4NF9maWx0ZXJfc2V0KQorCisjZW5kaWYgLyogX0xJTlVYX0FUTUJSMjY4NF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWNsaXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtY2xpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYzk0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWNsaXAuaApAQCAtMCwwICsxLDIxIEBACisvKiBhdG1jbGlwLmggLSBDbGFzc2ljYWwgSVAgb3ZlciBBVE0gKi8KKyAKKy8qIFdyaXR0ZW4gMTk5NS0xOTk4IGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBMUkMvSUNBICovCisgCisKKyNpZm5kZWYgTElOVVhfQVRNQ0xJUF9ICisjZGVmaW5lIExJTlVYX0FUTUNMSVBfSAorCisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWlvYy5oPgorCisKKyNkZWZpbmUgUkZDMTQ4M0xMQ19MRU4JOAkJLyogTExDK09VSStQSUQgPSA4ICovCisjZGVmaW5lIFJGQzE2MjZfTVRVCTkxODAJCS8qIFJGQzE2MjYgZGVmYXVsdCBNVFUgKi8KKworI2RlZmluZSBDTElQX0RFRkFVTFRfSURMRVRJTUVSIDEyMDAJLyogMjAgbWludXRlcywgc2VlIFJGQzE3NTUgKi8KKyNkZWZpbmUgQ0xJUF9DSEVDS19JTlRFUlZBTAkgMTAJLyogY2hlY2sgZXZlcnkgdGVuIHNlY29uZHMgKi8KKworI2RlZmluZQlTSU9DTUtDTElQCV9JTygnYScsQVRNSU9DX0NMSVApCS8qIGNyZWF0ZSBJUCBpbnRlcmZhY2UgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWRldi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1kZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzUxYTRiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1kZXYuaApAQCAtMCwwICsxLDIxNSBAQAorLyogYXRtZGV2LmggLSBBVE0gZGV2aWNlIGRyaXZlciBkZWNsYXJhdGlvbnMgYW5kIHZhcmlvdXMgcmVsYXRlZCBpdGVtcyAqLworIAorLyogV3JpdHRlbiAxOTk1LTIwMDAgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKyAKKworI2lmbmRlZiBMSU5VWF9BVE1ERVZfSAorI2RlZmluZSBMSU5VWF9BVE1ERVZfSAorCisKKyNpbmNsdWRlIDxsaW51eC9hdG1hcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG0uaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1pb2MuaD4KKworCisjZGVmaW5lIEVTSV9MRU4JCTYKKworI2RlZmluZSBBVE1fT0MzX1BDUgkoMTU1NTIwMDAwLzI3MCoyNjAvOC81MykKKwkJCS8qIE9DMyBsaW5rIHJhdGU6ICAxNTU1MjAwMDAgYnBzCisJCQkgICBTT05FVCBvdmVyaGVhZDogLzI3MCoyNjAgKDkgc2VjdGlvbiwgMSBwYXRoKQorCQkJICAgYml0cyBwZXIgY2VsbDogIC84LzUzCisJCQkgICBtYXggY2VsbCByYXRlOiAgMzUzMjA3LjU0NyBjZWxscy9zZWMgKi8KKyNkZWZpbmUgQVRNXzI1X1BDUgkoKDI1NjAwMDAwLzgtODAwMCkvNTQpCisJCQkvKiAyNSBNYnBzIEFUTSBjZWxsIHJhdGUgKDU5MTExKSAqLworI2RlZmluZSBBVE1fT0MxMl9QQ1IJKDYyMjA4MDAwMC8xMDgwKjEwNDAvOC81MykKKwkJCS8qIE9DMTIgbGluayByYXRlOiA2MjIwODAwMDAgYnBzCisJCQkgICBTT05FVCBvdmVyaGVhZDogLzEwODAqMTA0MAorCQkJICAgYml0cyBwZXIgY2VsbDogIC84LzUzCisJCQkgICBtYXggY2VsbCByYXRlOiAgMTQxMjgzMC4xODggY2VsbHMvc2VjICovCisjZGVmaW5lIEFUTV9EUzNfUENSCSg4MDAwKjEyKQorCQkJLyogRFMzOiAxMiBjZWxscyBpbiBhIDEyNSB1c2VjIHRpbWUgc2xvdCAqLworCisKKyNkZWZpbmUgX19BQUxfU1RBVF9JVEVNUyBcCisgICAgX19IQU5ETEVfSVRFTSh0eCk7CQkJLyogVFggb2theSAqLyBcCisgICAgX19IQU5ETEVfSVRFTSh0eF9lcnIpOwkJLyogVFggZXJyb3JzICovIFwKKyAgICBfX0hBTkRMRV9JVEVNKHJ4KTsJCQkvKiBSWCBva2F5ICovIFwKKyAgICBfX0hBTkRMRV9JVEVNKHJ4X2Vycik7CQkvKiBSWCBlcnJvcnMgKi8gXAorICAgIF9fSEFORExFX0lURU0ocnhfZHJvcCk7CQkvKiBSWCBvdXQgb2YgbWVtb3J5ICovCisKK3N0cnVjdCBhdG1fYWFsX3N0YXRzIHsKKyNkZWZpbmUgX19IQU5ETEVfSVRFTShpKSBpbnQgaQorCV9fQUFMX1NUQVRfSVRFTVMKKyN1bmRlZiBfX0hBTkRMRV9JVEVNCit9OworCisKK3N0cnVjdCBhdG1fZGV2X3N0YXRzIHsKKwlzdHJ1Y3QgYXRtX2FhbF9zdGF0cyBhYWwwOworCXN0cnVjdCBhdG1fYWFsX3N0YXRzIGFhbDM0OworCXN0cnVjdCBhdG1fYWFsX3N0YXRzIGFhbDU7Cit9IF9fQVRNX0FQSV9BTElHTjsKKworCisjZGVmaW5lIEFUTV9HRVRMSU5LUkFURQlfSU9XKCdhJyxBVE1JT0NfSVRGKzEsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIGdldCBsaW5rIHJhdGUgKi8KKyNkZWZpbmUgQVRNX0dFVE5BTUVTCV9JT1coJ2EnLEFUTUlPQ19JVEYrMyxzdHJ1Y3QgYXRtX2lvYnVmKQorCQkJCQkvKiBnZXQgaW50ZXJmYWNlIG5hbWVzIChudW1iZXJzKSAqLworI2RlZmluZSBBVE1fR0VUVFlQRQlfSU9XKCdhJyxBVE1JT0NfSVRGKzQsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIGdldCBpbnRlcmZhY2UgdHlwZSBuYW1lICovCisjZGVmaW5lIEFUTV9HRVRFU0kJX0lPVygnYScsQVRNSU9DX0lURis1LHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkvKiBnZXQgaW50ZXJmYWNlIEVTSSAqLworI2RlZmluZSBBVE1fR0VUQUREUglfSU9XKCdhJyxBVE1JT0NfSVRGKzYsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIGdldCBpdGYncyBsb2NhbCBBVE0gYWRkci4gbGlzdCAqLworI2RlZmluZSBBVE1fUlNUQUREUglfSU9XKCdhJyxBVE1JT0NfSVRGKzcsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIHJlc2V0IGl0ZidzIEFUTSBhZGRyZXNzIGxpc3QgKi8KKyNkZWZpbmUgQVRNX0FEREFERFIJX0lPVygnYScsQVRNSU9DX0lURis4LHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkvKiBhZGQgYSBsb2NhbCBBVE0gYWRkcmVzcyAqLworI2RlZmluZSBBVE1fREVMQUREUglfSU9XKCdhJyxBVE1JT0NfSVRGKzksc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIHJlbW92ZSBhIGxvY2FsIEFUTSBhZGRyZXNzICovCisjZGVmaW5lIEFUTV9HRVRDSVJBTkdFCV9JT1coJ2EnLEFUTUlPQ19JVEYrMTAsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIGdldCBjb25uZWN0aW9uIGlkZW50aWZpZXIgcmFuZ2UgKi8KKyNkZWZpbmUgQVRNX1NFVENJUkFOR0UJX0lPVygnYScsQVRNSU9DX0lURisxMSxzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJLyogc2V0IGNvbm5lY3Rpb24gaWRlbnRpZmllciByYW5nZSAqLworI2RlZmluZSBBVE1fU0VURVNJCV9JT1coJ2EnLEFUTUlPQ19JVEYrMTIsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIHNldCBpbnRlcmZhY2UgRVNJICovCisjZGVmaW5lIEFUTV9TRVRFU0lGCV9JT1coJ2EnLEFUTUlPQ19JVEYrMTMsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIGZvcmNlIGludGVyZmFjZSBFU0kgKi8KKyNkZWZpbmUgQVRNX0FERExFQ1NBRERSCV9JT1coJ2EnLCBBVE1JT0NfSVRGKzE0LCBzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJLyogcmVnaXN0ZXIgYSBMRUNTIGFkZHJlc3MgKi8KKyNkZWZpbmUgQVRNX0RFTExFQ1NBRERSCV9JT1coJ2EnLCBBVE1JT0NfSVRGKzE1LCBzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJLyogdW5yZWdpc3RlciBhIExFQ1MgYWRkcmVzcyAqLworI2RlZmluZSBBVE1fR0VUTEVDU0FERFIJX0lPVygnYScsIEFUTUlPQ19JVEYrMTYsIHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkvKiByZXRyaWV2ZSBMRUNTIGFkZHJlc3MoZXMpICovCisKKyNkZWZpbmUgQVRNX0dFVFNUQVQJX0lPVygnYScsQVRNSU9DX1NBUkNPTSswLHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkvKiBnZXQgQUFMIGxheWVyIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgQVRNX0dFVFNUQVRaCV9JT1coJ2EnLEFUTUlPQ19TQVJDT00rMSxzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJLyogZ2V0IEFBTCBsYXllciBzdGF0aXN0aWNzIGFuZCB6ZXJvICovCisjZGVmaW5lIEFUTV9HRVRMT09QCV9JT1coJ2EnLEFUTUlPQ19TQVJDT00rMixzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJLyogZ2V0IGxvb3BiYWNrIG1vZGUgKi8KKyNkZWZpbmUgQVRNX1NFVExPT1AJX0lPVygnYScsQVRNSU9DX1NBUkNPTSszLHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkvKiBzZXQgbG9vcGJhY2sgbW9kZSAqLworI2RlZmluZSBBVE1fUVVFUllMT09QCV9JT1coJ2EnLEFUTUlPQ19TQVJDT00rNCxzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJLyogcXVlcnkgc3VwcG9ydGVkIGxvb3BiYWNrIG1vZGVzICovCisjZGVmaW5lIEFUTV9TRVRTQwlfSU9XKCdhJyxBVE1JT0NfU1BFQ0lBTCsxLGludCkKKwkJCQkJLyogZW5hYmxlIG9yIGRpc2FibGUgc2luZ2xlLWNvcHkgKi8KKyNkZWZpbmUgQVRNX1NFVEJBQ0tFTkQJX0lPVygnYScsQVRNSU9DX1NQRUNJQUwrMixhdG1fYmFja2VuZF90KQorCQkJCQkvKiBzZXQgYmFja2VuZCBoYW5kbGVyICovCisjZGVmaW5lIEFUTV9ORVdCQUNLRU5ESUYgX0lPVygnYScsQVRNSU9DX1NQRUNJQUwrMyxhdG1fYmFja2VuZF90KQorCQkJCQkvKiB1c2UgYmFja2VuZCB0byBtYWtlIG5ldyBpZiAqLworI2RlZmluZSBBVE1fQUREUEFSVFkgIAlfSU9XKCdhJywgQVRNSU9DX1NQRUNJQUwrNCxzdHJ1Y3QgYXRtX2lvYnVmKQorIAkJCQkJLyogYWRkIHBhcnR5IHRvIHAybXAgY2FsbCAqLworI2lmZGVmIENPTkZJR19DT01QQVQKKy8qIEl0IGFjdHVhbGx5IHRha2VzIHN0cnVjdCBzb2NrYWRkcl9hdG1zdmMsIG5vdCBzdHJ1Y3QgYXRtX2lvYnVmICovCisjZGVmaW5lIENPTVBBVF9BVE1fQUREUEFSVFkgIAlfSU9XKCdhJywgQVRNSU9DX1NQRUNJQUwrNCxzdHJ1Y3QgY29tcGF0X2F0bV9pb2J1ZikKKyNlbmRpZgorI2RlZmluZSBBVE1fRFJPUFBBUlRZIAlfSU9XKCdhJywgQVRNSU9DX1NQRUNJQUwrNSxpbnQpCisJCQkJCS8qIGRyb3AgcGFydHkgZnJvbSBwMm1wIGNhbGwgKi8KKworLyoKKyAqIFRoZXNlIGFyZSBiYWNrZW5kIGhhbmRrZXJzIHRoYXQgY2FuIGJlIHNldCB2aWEgdGhlIEFUTV9TRVRCQUNLRU5EIGNhbGwKKyAqIGFib3ZlLiAgSW4gdGhlIGZ1dHVyZSB3ZSBtYXkgc3VwcG9ydCBkeW5hbWljIGxvYWRpbmcgb2YgdGhlc2UgLSBmb3Igbm93LAorICogdGhleSdyZSBqdXN0IGJlaW5nIHVzZWQgdG8gc2hhcmUgdGhlIEFUTUlPQ19CQUNLRU5EIGlvY3RscworICovCisjZGVmaW5lIEFUTV9CQUNLRU5EX1JBVwkJMAkKKyNkZWZpbmUgQVRNX0JBQ0tFTkRfUFBQCQkxCS8qIFBQUG9BVE0gLSBSRkMyMzY0ICovCisjZGVmaW5lIEFUTV9CQUNLRU5EX0JSMjY4NAkyCS8qIEJyaWRnZWQgUkZDMTQ4My8yNjg0ICovCisKKy8qIGZvciBBVE1fR0VUVFlQRSAqLworI2RlZmluZSBBVE1fSVRGVFlQX0xFTgk4CS8qIG1heGltdW0gbGVuZ3RoIG9mIGludGVyZmFjZSB0eXBlIG5hbWUgKi8KKworLyoKKyAqIExvb3BiYWNrIG1vZGVzIGZvciBBVE1fe1BIWSxTQVJ9X3tHRVQsU0VUfUxPT1AKKyAqLworCisvKiBQb2ludCBvZiBsb29wYmFjawkJCQlDUFUtLT5TQVItLT5QSFktLT5saW5lLS0+IC4uLiAqLworI2RlZmluZSBfX0FUTV9MTV9OT05FCTAJLyogbm8gbG9vcCBiYWNrICAgICBeICAgICBeICAgICBeICAgICAgXiAgICAgICovCisjZGVmaW5lIF9fQVRNX0xNX0FBTAkxCS8qIGxvb3AgYmFjayBQRFVzIC0tJyAgICAgfCAgICAgfCAgICAgIHwgICAgICAqLworI2RlZmluZSBfX0FUTV9MTV9BVE0JMgkvKiBsb29wIGJhY2sgQVRNIGNlbGxzIC0tLScgICAgIHwgICAgICB8ICAgICAgKi8KKy8qIFJFU0VSVkVECQk0CWxvb3AgYmFjayBvbiBQSFkgc2lkZSAgLS0tJwkJICAgICAgKi8KKyNkZWZpbmUgX19BVE1fTE1fUEhZCTgJLyogbG9vcCBiYWNrIGJpdHMgKGRpZ2l0YWwpIC0tLS0nICAgICAgfCAgICAgICovCisjZGVmaW5lIF9fQVRNX0xNX0FOQUxPRyAxNgkvKiBsb29wIGJhY2sgdGhlIGFuYWxvZyBzaWduYWwgLS0tLS0tLS0nICAgICAgKi8KKworLyogRGlyZWN0aW9uIG9mIGxvb3BiYWNrICovCisjZGVmaW5lIF9fQVRNX0xNX01LTE9DKG4pCSgobikpCSAgICAvKiBMb2NhbCAoaS5lLiBsb29wIFRYIHRvIFJYKSAqLworI2RlZmluZSBfX0FUTV9MTV9NS1JNVChuKQkoKG4pIDw8IDgpICAvKiBSZW1vdGUgKGkuZS4gbG9vcCBSWCB0byBUWCkgKi8KKworI2RlZmluZSBfX0FUTV9MTV9YVExPQyhuKQkoKG4pICYgMHhmZikKKyNkZWZpbmUgX19BVE1fTE1fWFRSTVQobikJKCgobikgPj4gOCkgJiAweGZmKQorCisjZGVmaW5lIEFUTV9MTV9OT05FCTAJLyogbm8gbG9vcGJhY2sgKi8KKworI2RlZmluZSBBVE1fTE1fTE9DX0FBTAlfX0FUTV9MTV9NS0xPQyhfX0FUTV9MTV9BQUwpCisjZGVmaW5lIEFUTV9MTV9MT0NfQVRNCV9fQVRNX0xNX01LTE9DKF9fQVRNX0xNX0FUTSkKKyNkZWZpbmUgQVRNX0xNX0xPQ19QSFkJX19BVE1fTE1fTUtMT0MoX19BVE1fTE1fUEhZKQorI2RlZmluZSBBVE1fTE1fTE9DX0FOQUxPRyBfX0FUTV9MTV9NS0xPQyhfX0FUTV9MTV9BTkFMT0cpCisKKyNkZWZpbmUgQVRNX0xNX1JNVF9BQUwJX19BVE1fTE1fTUtSTVQoX19BVE1fTE1fQUFMKQorI2RlZmluZSBBVE1fTE1fUk1UX0FUTQlfX0FUTV9MTV9NS1JNVChfX0FUTV9MTV9BVE0pCisjZGVmaW5lIEFUTV9MTV9STVRfUEhZCV9fQVRNX0xNX01LUk1UKF9fQVRNX0xNX1BIWSkKKyNkZWZpbmUgQVRNX0xNX1JNVF9BTkFMT0cgX19BVE1fTE1fTUtSTVQoX19BVE1fTE1fQU5BTE9HKQorCisvKgorICogTm90ZTogQVRNX0xNX0xPQ18qIGFuZCBBVE1fTE1fUk1UXyogY2FuIGJlIGNvbWJpbmVkLCBwcm92aWRlZCB0aGF0CisgKiBfX0FUTV9MTV9YVExPQyh4KSA8PSBfX0FUTV9MTV9YVFJNVCh4KQorICovCisKKworc3RydWN0IGF0bV9pb2J1ZiB7CisJaW50IGxlbmd0aDsKKwl2b2lkICpidWZmZXI7Cit9OworCisvKiBmb3IgQVRNX0dFVENJUkFOR0UgLyBBVE1fU0VUQ0lSQU5HRSAqLworCisjZGVmaW5lIEFUTV9DSV9NQVggICAgICAtMSAgICAgICAgICAgICAgLyogdXNlIG1heGltdW0gcmFuZ2Ugb2YgVlBJL1ZDSSAqLworIAorc3RydWN0IGF0bV9jaXJhbmdlIHsKKwlzaWduZWQgY2hhcgl2cGlfYml0czsJLyogMS4uOCwgQVRNX0NJX01BWCAoLTEpIGZvciBtYXhpbXVtICovCisJc2lnbmVkIGNoYXIJdmNpX2JpdHM7CS8qIDEuLjE2LCBBVE1fQ0lfTUFYICgtMSkgZm9yIG1heGltdW0gKi8KK307CisKKy8qIGZvciBBVE1fU0VUU0M7IGFjdHVhbGx5IHRha2VuIGZyb20gdGhlIEFUTV9WRiBudW1iZXIgc3BhY2UgKi8KKworI2RlZmluZSBBVE1fU0NfUlgJMTAyNAkJLyogZW5hYmxlIFJYIHNpbmdsZS1jb3B5ICovCisjZGVmaW5lIEFUTV9TQ19UWAkyMDQ4CQkvKiBlbmFibGUgVFggc2luZ2xlLWNvcHkgKi8KKworI2RlZmluZSBBVE1fQkFDS0xPR19ERUZBVUxUIDMyIC8qIGlmIHdlIGdldCBtb3JlLCB3ZSdyZSBsaWtlbHkgdG8gdGltZSBvdXQKKwkJCQkgIGFueXdheSAqLworCisvKiBNRjogY2hhbmdlX3FvcyAoTW9kaWZ5KSBmbGFncyAqLworCisjZGVmaW5lIEFUTV9NRl9JTU1FRAkgMQkvKiBCbG9jayB1bnRpbCBjaGFuZ2UgaXMgZWZmZWN0aXZlICovCisjZGVmaW5lIEFUTV9NRl9JTkNfUlNWCSAyCS8qIENoYW5nZSByZXNlcnZhdGlvbiBvbiBpbmNyZWFzZSAqLworI2RlZmluZSBBVE1fTUZfSU5DX1NIUAkgNAkvKiBDaGFuZ2Ugc2hhcGluZyBvbiBpbmNyZWFzZSAqLworI2RlZmluZSBBVE1fTUZfREVDX1JTVgkgOAkvKiBDaGFuZ2UgcmVzZXJ2YXRpb24gb24gZGVjcmVhc2UgKi8KKyNkZWZpbmUgQVRNX01GX0RFQ19TSFAJMTYJLyogQ2hhbmdlIHNoYXBpbmcgb24gZGVjcmVhc2UgKi8KKyNkZWZpbmUgQVRNX01GX0JXRAkzMgkvKiBTZXQgdGhlIGJhY2t3YXJkIGRpcmVjdGlvbiBwYXJhbWV0ZXJzICovCisKKyNkZWZpbmUgQVRNX01GX1NFVAkoQVRNX01GX0lOQ19SU1YgfCBBVE1fTUZfSU5DX1NIUCB8IEFUTV9NRl9ERUNfUlNWIHwgXAorCQkJICBBVE1fTUZfREVDX1NIUCB8IEFUTV9NRl9CV0QpCisKKy8qCisgKiBBVE1fVlNfKiBhcmUgdXNlZCB0byBleHByZXNzIFZDIHN0YXRlIGluIGEgaHVtYW4tZnJpZW5kbHkgd2F5LgorICovCisKKyNkZWZpbmUgQVRNX1ZTX0lETEUJMAkvKiBWQyBpcyBub3QgdXNlZCAqLworI2RlZmluZSBBVE1fVlNfQ09OTkVDVEVEIDEJLyogVkMgaXMgY29ubmVjdGVkICovCisjZGVmaW5lIEFUTV9WU19DTE9TSU5HCTIJLyogVkMgaXMgY2xvc2luZyAqLworI2RlZmluZSBBVE1fVlNfTElTVEVOCTMJLyogVkMgaXMgbGlzdGVuaW5nIGZvciBpbmNvbWluZyBzZXR1cHMgKi8KKyNkZWZpbmUgQVRNX1ZTX0lOVVNFCTQJLyogVkMgaXMgaW4gdXNlIChyZWdpc3RlcmVkIHdpdGggYXRtc2lnZCkgKi8KKyNkZWZpbmUgQVRNX1ZTX0JPVU5ECTUJLyogVkMgaXMgYm91bmQgKi8KKworI2RlZmluZSBBVE1fVlMyVFhUX01BUCBcCisgICAgIklETEUiLCAiQ09OTkVDVEVEIiwgIkNMT1NJTkciLCAiTElTVEVOIiwgIklOVVNFIiwgIkJPVU5EIgorCisjZGVmaW5lIEFUTV9WRjJUWFRfTUFQIFwKKyAgICAiQUREUiIsCSJSRUFEWSIsCSJQQVJUSUFMIiwJIlJFR0lTIiwgXAorICAgICJSRUxFQVNFRCIsICJIQVNRT1MiLAkiTElTVEVOIiwJIk1FVEEiLCBcCisgICAgIjI1NiIsCSI1MTIiLAkJIjEwMjQiLAkJIjIwNDgiLCBcCisgICAgIlNFU1NJT04iLAkiSEFTU0FQIiwJIkJPVU5EIiwJIkNMT1NFIgorCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWlvYy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1pb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2Y2N2FhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1pb2MuaApAQCAtMCwwICsxLDQxIEBACisvKiBhdG1pb2MuaCAtIHJhbmdlcyBmb3IgQVRNLXJlbGF0ZWQgaW9jdGwgbnVtYmVycyAqLworIAorLyogV3JpdHRlbiAxOTk1LTE5OTkgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKworCisvKgorICogU2VlIGh0dHA6Ly9pY2F3d3cxLmVwZmwuY2gvbGludXgtYXRtL21hZ2ljLmh0bWwgZm9yIHRoZSBjb21wbGV0ZSBsaXN0IG9mCisgKiAibWFnaWMiIGlvY3RsIG51bWJlcnMuCisgKi8KKworCisjaWZuZGVmIF9MSU5VWF9BVE1JT0NfSAorI2RlZmluZSBfTElOVVhfQVRNSU9DX0gKKworI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgorCQkvKiBldmVyeWJvZHkgaW5jbHVkaW5nIGF0bWlvYy5oIHdpbGwgYWxzbyBuZWVkIF9JT3ssUixXLFdSfSAqLworCisjZGVmaW5lIEFUTUlPQ19QSFlDT00JICAweDAwIC8qIFBIWSBkZXZpY2UgY29tbW9uIGlvY3RscywgZ2xvYmFsbHkgdW5pcXVlICovCisjZGVmaW5lIEFUTUlPQ19QSFlDT01fRU5EIDB4MGYKKyNkZWZpbmUgQVRNSU9DX1BIWVRZUAkgIDB4MTAgLyogUEhZIGRldiB0eXBlIGlvY3RscywgdW5pcXVlIHBlciBQSFkgdHlwZSAqLworI2RlZmluZSBBVE1JT0NfUEhZVFlQX0VORCAweDJmCisjZGVmaW5lIEFUTUlPQ19QSFlQUlYJICAweDMwIC8qIFBIWSBkZXYgcHJpdmF0ZSBpb2N0bHMsIHVuaXF1ZSBwZXIgZHJpdmVyICovCisjZGVmaW5lIEFUTUlPQ19QSFlQUlZfRU5EIDB4NGYKKyNkZWZpbmUgQVRNSU9DX1NBUkNPTQkgIDB4NTAgLyogU0FSIGRldmljZSBjb21tb24gaW9jdGxzLCBnbG9iYWxseSB1bmlxdWUgKi8KKyNkZWZpbmUgQVRNSU9DX1NBUkNPTV9FTkQgMHg1MAorI2RlZmluZSBBVE1JT0NfU0FSUFJWCSAgMHg2MCAvKiBTQVIgZGV2IHByaXZhdGUgaW9jdGxzLCB1bmlxdWUgcGVyIGRyaXZlciAqLworI2RlZmluZSBBVE1JT0NfU0FSUFJWX0VORCAweDdmCisjZGVmaW5lIEFUTUlPQ19JVEYJICAweDgwIC8qIEludGVyZmFjZSBpb2N0bHMsIGdsb2JhbGx5IHVuaXF1ZSAqLworI2RlZmluZSBBVE1JT0NfSVRGX0VORAkgIDB4OGYKKyNkZWZpbmUgQVRNSU9DX0JBQ0tFTkQJICAweDkwIC8qIEFUTSBnZW5lcmljIGJhY2tlbmQgaW9jdGxzLCB1LiBwZXIgYmFja2VuZCAqLworI2RlZmluZSBBVE1JT0NfQkFDS0VORF9FTkQgMHhhZgorLyogMHhiMC0weGJmOiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworI2RlZmluZSBBVE1JT0NfQVJFUVVJUEEJICAweGMwIC8qIEFwcGxpY2F0aW9uIHJlcXVlc3RlZCBJUCBvdmVyIEFUTSwgZ2xvYi4gdS4gKi8KKyNkZWZpbmUgQVRNSU9DX0xBTkUJICAweGQwIC8qIExBTiBFbXVsYXRpb24sIGdsb2JhbGx5IHVuaXF1ZSAqLworI2RlZmluZSBBVE1JT0NfTVBPQSAgICAgICAweGQ4IC8qIE1QT0EsIGdsb2JhbGx5IHVuaXF1ZSAqLworI2RlZmluZQlBVE1JT0NfQ0xJUAkgIDB4ZTAgLyogQ2xhc3NpY2FsIElQIG92ZXIgQVRNIGNvbnRyb2wsIGdsb2JhbGx5IHUuICovCisjZGVmaW5lCUFUTUlPQ19DTElQX0VORAkgIDB4ZWYKKyNkZWZpbmUJQVRNSU9DX1NQRUNJQUwJICAweGYwIC8qIFNwZWNpYWwtcHVycG9zZSBjb250cm9scywgZ2xvYmFsbHkgdW5pcXVlICovCisjZGVmaW5lCUFUTUlPQ19TUEVDSUFMX0VORCAweGZmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1sZWMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtbGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljOTE3ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtbGVjLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIEFUTSBMYW4gRW11bGF0aW9uIERhZW1vbiBkcml2ZXIgaW50ZXJmYWNlCisgKgorICogTWFya28gS2lpc2tpbGEgPG1raWlza2lsYUB5YWhvby5jb20+CisgKi8KKworI2lmbmRlZiBfQVRNTEVDX0hfCisjZGVmaW5lIF9BVE1MRUNfSF8KKworI2luY2x1ZGUgPGxpbnV4L2F0bWFwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWlvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogQVRNIGxlYyBkYWVtb24gY29udHJvbCBzb2NrZXQgKi8KKyNkZWZpbmUgQVRNTEVDX0NUUkwJX0lPKCdhJywgQVRNSU9DX0xBTkUpCisjZGVmaW5lIEFUTUxFQ19EQVRBCV9JTygnYScsIEFUTUlPQ19MQU5FKzEpCisjZGVmaW5lIEFUTUxFQ19NQ0FTVAlfSU8oJ2EnLCBBVE1JT0NfTEFORSsyKQorCisvKiBNYXhpbXVtIG51bWJlciBvZiBMRUMgaW50ZXJmYWNlcyAodHdlYWthYmxlKSAqLworI2RlZmluZSBNQVhfTEVDX0lURiA0OAorCisvKgorICogRnJvbSB0aGUgdG90YWwgb2YgTUFYX0xFQ19JVEYsIGxhc3QgTlVNX1RSX0RFVlMgYXJlIHJlc2VydmVkIGZvciBUb2tlbiBSaW5nLgorICogRS5nLiBpZiBNQVhfTEVDX0lURiA9IDQ4IGFuZCBOVU1fVFJfREVWUyA9IDgsIHRoZW4gbGVjMC1sZWMzOSBhcmUgZm9yCisgKiBFdGhlcm5ldCBFTEFOcyBhbmQgbGVjNDAtbGVjNDcgYXJlIGZvciBUb2tlbiBSaW5nIEVMQU5TLgorICovCisjZGVmaW5lIE5VTV9UUl9ERVZTIDgKKwordHlwZWRlZiBlbnVtIHsKKwlsX3NldF9tYWNfYWRkciwKKwlsX2RlbF9tYWNfYWRkciwKKwlsX3N2Y19zZXR1cCwKKwlsX2FkZHJfZGVsZXRlLAorCWxfdG9wb2xvZ3lfY2hhbmdlLAorCWxfZmx1c2hfY29tcGxldGUsCisJbF9hcnBfdXBkYXRlLAorCWxfbmFycF9yZXEsCQkvKiBMQU5FMiBtYW5kYXRlcyB0aGUgdXNlIG9mIHRoaXMgKi8KKwlsX2NvbmZpZywKKwlsX2ZsdXNoX3RyYW5faWQsCisJbF9zZXRfbGVjaWQsCisJbF9hcnBfeG10LAorCWxfcmRlc2NfYXJwX3htdCwKKwlsX2Fzc29jaWF0ZV9yZXEsCisJbF9zaG91bGRfYnJpZGdlCQkvKiBzaG91bGQgd2UgYnJpZGdlIHRoaXMgTUFDPyAqLworfSBhdG1sZWNfbXNnX3R5cGU7CisKKyNkZWZpbmUgQVRNTEVDX01TR19UWVBFX01BWCBsX3Nob3VsZF9icmlkZ2UKKworc3RydWN0IGF0bWxlY19jb25maWdfbXNnIHsKKwl1bnNpZ25lZCBpbnQgbWF4aW11bV91bmtub3duX2ZyYW1lX2NvdW50OworCXVuc2lnbmVkIGludCBtYXhfdW5rbm93bl9mcmFtZV90aW1lOworCXVuc2lnbmVkIHNob3J0IG1heF9yZXRyeV9jb3VudDsKKwl1bnNpZ25lZCBpbnQgYWdpbmdfdGltZTsKKwl1bnNpZ25lZCBpbnQgZm9yd2FyZF9kZWxheV90aW1lOworCXVuc2lnbmVkIGludCBhcnBfcmVzcG9uc2VfdGltZTsKKwl1bnNpZ25lZCBpbnQgZmx1c2hfdGltZW91dDsKKwl1bnNpZ25lZCBpbnQgcGF0aF9zd2l0Y2hpbmdfZGVsYXk7CisJdW5zaWduZWQgaW50IGxhbmVfdmVyc2lvbjsJLyogTEFORTI6IDEgZm9yIExBTkV2MSwgMiBmb3IgTEFORXYyICovCisJaW50IG10dTsKKwlpbnQgaXNfcHJveHk7Cit9OworCitzdHJ1Y3QgYXRtbGVjX21zZyB7CisJYXRtbGVjX21zZ190eXBlIHR5cGU7CisJaW50IHNpemVvZnRsdnM7CQkvKiBMQU5FMjogaWYgIT0gMCwgdGx2cyBmb2xsb3cgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBjaGFyIG1hY19hZGRyW0VUSF9BTEVOXTsKKwkJCXVuc2lnbmVkIGNoYXIgYXRtX2FkZHJbQVRNX0VTQV9MRU5dOworCQkJdW5zaWduZWQgaW50IGZsYWc7CS8qCisJCQkJCQkgKiBUb3BvbG9neV9jaGFuZ2UgZmxhZywKKwkJCQkJCSAqIHJlbW90ZWZsYWcsIHBlcm1hbmVudCBmbGFnLAorCQkJCQkJICogbGVjaWQsIHRyYW5zYWN0aW9uIGlkCisJCQkJCQkgKi8KKwkJCXVuc2lnbmVkIGludCB0YXJnZXRsZXNzX2xlX2FycDsJLyogTEFORTIgKi8KKwkJCXVuc2lnbmVkIGludCBub19zb3VyY2VfbGVfbmFycDsJLyogTEFORTIgKi8KKwkJfSBub3JtYWw7CisJCXN0cnVjdCBhdG1sZWNfY29uZmlnX21zZyBjb25maWc7CisJCXN0cnVjdCB7CisJCQlfX3UxNiBsZWNfaWQ7CQkJCS8qIHJlcXVlc3RvciBsZWNfaWQgICovCisJCQlfX3UzMiB0cmFuX2lkOwkJCQkvKiB0cmFuc2FjdGlvbiBpZCAgICAqLworCQkJdW5zaWduZWQgY2hhciBtYWNfYWRkcltFVEhfQUxFTl07CS8qIGRzdCBtYWMgYWRkciAgICAgICovCisJCQl1bnNpZ25lZCBjaGFyIGF0bV9hZGRyW0FUTV9FU0FfTEVOXTsJLyogcmVxZXN0b3IgQVRNIGFkZHIgKi8KKwkJfSBwcm94eTsJLyoKKwkJCQkgKiBGb3IgbWFwcGluZyBMRV9BUlAgcmVxdWVzdHMgdG8gcmVzcG9uc2VzLiBGaWxsZWQgYnkKKwkJCQkgKiB6ZXBwZWxpbiwgcmV0dXJuZWQgYnkga2VybmVsLiBVc2VkIG9ubHkgd2hlbiBwcm94eWluZworCQkJCSAqLworCX0gY29udGVudDsKK30gX19BVE1fQVBJX0FMSUdOOworCitzdHJ1Y3QgYXRtbGVjX2lvYyB7CisJaW50IGRldl9udW07CisJdW5zaWduZWQgY2hhciBhdG1fYWRkcltBVE1fRVNBX0xFTl07CisJdW5zaWduZWQgY2hhciByZWNlaXZlOwkvKiAxPSByZWNlaXZlIHZjYywgMCA9IHNlbmQgdmNjICovCit9OworI2VuZGlmIC8qIF9BVE1MRUNfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtbXBjLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bW1wYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYmE1NzgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bW1wYy5oCkBAIC0wLDAgKzEsMTI2IEBACisjaWZuZGVmIF9BVE1NUENfSF8KKyNkZWZpbmUgX0FUTU1QQ19IXworCisjaW5jbHVkZSA8bGludXgvYXRtYXBpLmg+CisjaW5jbHVkZSA8bGludXgvYXRtaW9jLmg+CisjaW5jbHVkZSA8bGludXgvYXRtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBBVE1NUENfQ1RSTCBfSU8oJ2EnLCBBVE1JT0NfTVBPQSkKKyNkZWZpbmUgQVRNTVBDX0RBVEEgX0lPKCdhJywgQVRNSU9DX01QT0ErMSkKKworI2RlZmluZSBNUENfU09DS0VUX0lOR1JFU1MgMQorI2RlZmluZSBNUENfU09DS0VUX0VHUkVTUyAgMgorCitzdHJ1Y3QgYXRtbXBjX2lvYyB7CisgICAgICAgIGludCBkZXZfbnVtOworICAgICAgICBfX2JlMzIgaXBhZGRyOyAgICAgICAgICAgICAgLyogdGhlIElQIGFkZHJlc3Mgb2YgdGhlIHNob3J0Y3V0ICAgICovCisgICAgICAgIGludCB0eXBlOyAgICAgICAgICAgICAgICAgICAgIC8qIGluZ3Jlc3Mgb3IgZWdyZXNzICAgICAgICAgICAgICAgICAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgaW5fY3RybF9pbmZvIHsKKyAgICAgICAgX191OCAgIExhc3RfTkhSUF9DSUVfY29kZTsKKyAgICAgICAgX191OCAgIExhc3RfUTI5MzFfY2F1c2VfdmFsdWU7CisgICAgICAgIF9fdTggICBlZ19NUENfQVRNX2FkZHJbQVRNX0VTQV9MRU5dOworICAgICAgICBfX2JlMzIgIHRhZzsKKyAgICAgICAgX19iZTMyICBpbl9kc3RfaXA7ICAgICAgLyogSVAgYWRkcmVzcyB0aGlzIGluZ3Jlc3MgTVBDIHNlbmRzIHBhY2tldHMgdG8gKi8KKyAgICAgICAgX191MTYgIGhvbGRpbmdfdGltZTsKKyAgICAgICAgX191MzIgIHJlcXVlc3RfaWQ7Cit9IGluX2N0cmxfaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgZWdfY3RybF9pbmZvIHsKKyAgICAgICAgX191OCAgIERMTF9oZWFkZXJbMjU2XTsKKyAgICAgICAgX191OCAgIERIX2xlbmd0aDsKKyAgICAgICAgX19iZTMyICBjYWNoZV9pZDsKKyAgICAgICAgX19iZTMyICB0YWc7CisgICAgICAgIF9fYmUzMiAgbXBzX2lwOworICAgICAgICBfX2JlMzIgIGVnX2RzdF9pcDsgICAgICAvKiBJUCBhZGRyZXNzIHRvIHdoaWNoIGluZ3Jlc3MgTVBDIHNlbmRzIHBhY2tldHMgKi8KKyAgICAgICAgX191OCAgIGluX01QQ19kYXRhX0FUTV9hZGRyW0FUTV9FU0FfTEVOXTsKKyAgICAgICAgX191MTYgIGhvbGRpbmdfdGltZTsKK30gZWdfY3RybF9pbmZvOworCitzdHJ1Y3QgbXBjX3BhcmFtZXRlcnMgeworICAgICAgICBfX3UxNiBtcGNfcDE7ICAgLyogU2hvcnRjdXQtU2V0dXAgRnJhbWUgQ291bnQgICAgKi8KKyAgICAgICAgX191MTYgbXBjX3AyOyAgIC8qIFNob3J0Y3V0LVNldHVwIEZyYW1lIFRpbWUgICAgICovCisgICAgICAgIF9fdTggbXBjX3AzWzhdOyAvKiBGbG93LWRldGVjdGlvbiBQcm90b2NvbHMgICAgICAqLworICAgICAgICBfX3UxNiBtcGNfcDQ7ICAgLyogTVBDIEluaXRpYWwgUmV0cnkgVGltZSAgICAgICAgKi8KKyAgICAgICAgX191MTYgbXBjX3A1OyAgIC8qIE1QQyBSZXRyeSBUaW1lIE1heGltdW0gICAgICAgICovCisgICAgICAgIF9fdTE2IG1wY19wNjsgICAvKiBIb2xkIERvd24gVGltZSAgICAgICAgICAgICAgICAqLworfSA7CisKK3N0cnVjdCBrX21lc3NhZ2UgeworICAgICAgICBfX3UxNiB0eXBlOworICAgICAgICBfX2JlMzIgaXBfbWFzazsKKyAgICAgICAgX191OCAgTVBTX2N0cmxbQVRNX0VTQV9MRU5dOworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICAgICAgaW5fY3RybF9pbmZvIGluX2luZm87CisgICAgICAgICAgICAgICAgZWdfY3RybF9pbmZvIGVnX2luZm87CisgICAgICAgICAgICAgICAgc3RydWN0IG1wY19wYXJhbWV0ZXJzIHBhcmFtczsKKyAgICAgICAgfSBjb250ZW50OworICAgICAgICBzdHJ1Y3QgYXRtX3FvcyBxb3M7ICAgICAgIAorfSBfX0FUTV9BUElfQUxJR047CisKK3N0cnVjdCBsbGNfc25hcF9oZHIgeworCS8qIFJGQyAxNDgzIExMQy9TTkFQIGVuY2Fwc3VsYXRpb24gZm9yIHJvdXRlZCBJUCBQRFVzICovCisgICAgICAgIF9fdTggIGRzYXA7ICAgIC8qIERlc3RpbmF0aW9uIFNlcnZpY2UgQWNjZXNzIFBvaW50ICgweEFBKSAgICAgKi8KKyAgICAgICAgX191OCAgc3NhcDsgICAgLyogU291cmNlIFNlcnZpY2UgQWNjZXNzIFBvaW50ICAgICAgKDB4QUEpICAgICAqLworICAgICAgICBfX3U4ICB1aTsgICAgICAvKiBVbm51bWJlcmVkIEluZm9ybWF0aW9uICAgICAgICAgICAoMHgwMykgICAgICovCisgICAgICAgIF9fdTggIG9yZ1szXTsgIC8qIE9yZ2FuaXphdGlvbmFsIGlkZW50aWZpY2F0aW9uICAgICgweDAwMDAwMCkgKi8KKyAgICAgICAgX191OCAgdHlwZVsyXTsgLyogRXRoZXIgdHlwZSAoZm9yIElQKSAgICAgICAgICAgICAgKDB4MDgwMCkgICAqLworfTsKKworLyogVExWcyB0aGlzIE1QQyByZWNvZ25pemVzICovCisjZGVmaW5lIFRMVl9NUE9BX0RFVklDRV9UWVBFICAgICAgICAgMHgwMGEwM2UyYSAgCisKKy8qIE1QT0EgZGV2aWNlIHR5cGVzIGluIE1QT0EgRGV2aWNlIFR5cGUgVExWICovCisjZGVmaW5lIE5PTl9NUE9BICAgIDAKKyNkZWZpbmUgTVBTICAgICAgICAgMQorI2RlZmluZSBNUEMgICAgICAgICAyCisjZGVmaW5lIE1QU19BTkRfTVBDIDMKKworCisvKiBNUEMgcGFyYW1ldGVyIGRlZmF1bHRzICovCisKKyNkZWZpbmUgTVBDX1AxIDEwICAvKiBTaG9ydGN1dC1TZXR1cCBGcmFtZSBDb3VudCAgKi8gCisjZGVmaW5lIE1QQ19QMiAxICAgLyogU2hvcnRjdXQtU2V0dXAgRnJhbWUgVGltZSAgICovCisjZGVmaW5lIE1QQ19QMyAwICAgLyogRmxvdy1kZXRlY3Rpb24gUHJvdG9jb2xzICAgICovCisjZGVmaW5lIE1QQ19QNCA1ICAgLyogTVBDIEluaXRpYWwgUmV0cnkgVGltZSAgICAgICovCisjZGVmaW5lIE1QQ19QNSA0MCAgLyogTVBDIFJldHJ5IFRpbWUgTWF4aW11bSAgICAgICovCisjZGVmaW5lIE1QQ19QNiAxNjAgLyogSG9sZCBEb3duIFRpbWUgICAgICAgICAgICAgICovCisjZGVmaW5lIEhPTERJTkdfVElNRV9ERUZBVUxUIDEyMDAgLyogc2FtZSBhcyBNUFMtcDcgKi8KKworLyogTVBDIGNvbnN0YW50cyAqLworCisjZGVmaW5lIE1QQ19DMSAyICAgLyogUmV0cnkgVGltZSBNdWx0aXBsaWVyICAgICAgICovCisjZGVmaW5lIE1QQ19DMiA2MCAgLyogSW5pdGlhbCBLZWVwLUFsaXZlIExpZmV0aW1lICovCisKKy8qIE1lc3NhZ2UgdHlwZXMgLSB0byBNUE9BIGRhZW1vbiAqLworCisjZGVmaW5lIFNORF9NUE9BX1JFU19SUVNUICAgIDIwMQorI2RlZmluZSBTRVRfTVBTX0NUUkxfQUREUiAgICAyMDIKKyNkZWZpbmUgU05EX01QT0FfUkVTX1JUUlkgICAgMjAzIC8qIERpZmZlcmVudCB0eXBlIGluIGEgcmV0cnkgZHVlIHRvIHJlcSBpZCAgICAgICAgICovCisjZGVmaW5lIFNUT1BfS0VFUF9BTElWRV9TTSAgIDIwNAorI2RlZmluZSBFR1JFU1NfRU5UUllfUkVNT1ZFRCAyMDUKKyNkZWZpbmUgU05EX0VHUkVTU19QVVJHRSAgICAgMjA2CisjZGVmaW5lIERJRSAgICAgICAgICAgICAgICAgIDIwNyAvKiB0ZWxsIHRoZSBkYWVtb24gdG8gZXhpdCgpICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEQVRBX1BMQU5FX1BVUkdFICAgICAyMDggLyogRGF0YSBwbGFuZSBwdXJnZSBiZWNhdXNlIG9mIGVncmVzcyBjYWNoZSBoaXQgbWlzcyBvciBkZWFkIE1QUyAqLworI2RlZmluZSBPUEVOX0lOR1JFU1NfU1ZDICAgICAyMDkKKworLyogTWVzc2FnZSB0eXBlcyAtIGZyb20gTVBPQSBkYWVtb24gKi8KKworI2RlZmluZSBNUE9BX1RSSUdHRVJfUkNWRCAgICAgMTAxCisjZGVmaW5lIE1QT0FfUkVTX1JFUExZX1JDVkQgICAxMDIKKyNkZWZpbmUgSU5HUkVTU19QVVJHRV9SQ1ZEICAgIDEwMworI2RlZmluZSBFR1JFU1NfUFVSR0VfUkNWRCAgICAgMTA0CisjZGVmaW5lIE1QU19ERUFUSCAgICAgICAgICAgICAxMDUKKyNkZWZpbmUgQ0FDSEVfSU1QT1NfUkNWRCAgICAgIDEwNgorI2RlZmluZSBTRVRfTVBDX0NUUkxfQUREUiAgICAgMTA3IC8qIE91ciBNUEMncyBjb250cm9sIEFUTSBhZGRyZXNzICAgKi8KKyNkZWZpbmUgU0VUX01QU19NQUNfQUREUiAgICAgIDEwOAorI2RlZmluZSBDTEVBTl9VUF9BTkRfRVhJVCAgICAgMTA5CisjZGVmaW5lIFNFVF9NUENfUEFSQU1TICAgICAgICAxMTAgLyogTVBDIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAgICAqLworCisvKiBNZXNzYWdlIHR5cGVzIC0gYmlkaXJlY3Rpb25hbCAqLyAgICAgICAKKworI2RlZmluZSBSRUxPQUQgICAgICAgICAgICAgICAgMzAxIC8qIGtpbGwgLUhVUCB0aGUgZGFlbW9uIGZvciByZWxvYWQgKi8KKworI2VuZGlmIC8qIF9BVE1NUENfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtcHBwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bXBwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMGRjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bXBwcC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qIGF0bXBwcC5oIC0gUkZDMjM2NCBQUFBvQVRNICovCisKKy8qIFdyaXR0ZW4gMjAwMCBieSBNaXRjaGVsbCBCbGFuayBKciAqLworCisjaWZuZGVmIF9MSU5VWF9BVE1QUFBfSAorI2RlZmluZSBfTElOVVhfQVRNUFBQX0gKKworI2luY2x1ZGUgPGxpbnV4L2F0bS5oPgorCisjZGVmaW5lIFBQUE9BVE1fRU5DQVBTX0FVVE9ERVRFQ1QJKDApCisjZGVmaW5lIFBQUE9BVE1fRU5DQVBTX1ZDCQkoMSkKKyNkZWZpbmUgUFBQT0FUTV9FTkNBUFNfTExDCQkoMikKKworLyoKKyAqIFRoaXMgaXMgZm9yIHRoZSBBVE1fU0VUQkFDS0VORCBjYWxsIC0gdGhlc2UgYXJlIGxpa2Ugc29ja2V0IGZhbWlsaWVzOgorICogdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHN0cnVjdHVyZSBpcyB0aGUgYmFja2VuZCBudW1iZXIgYW5kIHRoZSByZXN0CisgKiBpcyBwZXItYmFja2VuZCBzcGVjaWZpYworICovCitzdHJ1Y3QgYXRtX2JhY2tlbmRfcHBwIHsKKwlhdG1fYmFja2VuZF90CWJhY2tlbmRfbnVtOwkvKiBBVE1fQkFDS0VORF9QUFAgKi8KKwlpbnQJCWVuY2FwczsJCS8qIFBQUE9BVE1fRU5DQVBTXyogKi8KK307CisKKyNlbmRpZgkvKiBfTElOVVhfQVRNUFBQX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtc2FwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bXNhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OWIxMDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bXNhcC5oCkBAIC0wLDAgKzEsMTYyIEBACisvKiBhdG1zYXAuaCAtIEFUTSBTZXJ2aWNlIEFjY2VzcyBQb2ludCBhZGRyZXNzaW5nIGRlZmluaXRpb25zICovCisKKy8qIFdyaXR0ZW4gMTk5NS0xOTk5IGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBMUkMvSUNBICovCisKKworI2lmbmRlZiBfTElOVVhfQVRNU0FQX0gKKyNkZWZpbmUgX0xJTlVYX0FUTVNBUF9ICisKKyNpbmNsdWRlIDxsaW51eC9hdG1hcGkuaD4KKworLyoKKyAqIEJFR0lOX3h4IGFuZCBFTkRfeHggbWFya2VycyBhcmUgdXNlZCBmb3IgYXV0b21hdGljIGdlbmVyYXRpb24gb2YKKyAqIGRvY3VtZW50YXRpb24uIERvIG5vdCBjaGFuZ2UgdGhlbS4KKyAqLworCisKKy8qCisgKiBMYXllciAyIHByb3RvY29sIGlkZW50aWZpZXJzCisgKi8KKworLyogQkVHSU5fTDIgKi8KKyNkZWZpbmUgQVRNX0wyX05PTkUJMAkvKiBMMiBub3Qgc3BlY2lmaWVkICovCisjZGVmaW5lIEFUTV9MMl9JU08xNzQ1ICAweDAxCS8qIEJhc2ljIG1vZGUgSVNPIDE3NDUgKi8KKyNkZWZpbmUgQVRNX0wyX1EyOTEJMHgwMgkvKiBJVFUtVCBRLjI5MSAoUmVjLiBJLjQ0MSkgKi8KKyNkZWZpbmUgQVRNX0wyX1gyNV9MTAkweDA2CS8qIElUVS1UIFguMjUsIGxpbmsgbGF5ZXIgKi8KKyNkZWZpbmUgQVRNX0wyX1gyNV9NTAkweDA3CS8qIElUVS1UIFguMjUsIG11bHRpbGluayAqLworI2RlZmluZSBBVE1fTDJfTEFQQgkweDA4CS8qIEV4dGVuZGVkIExBUEIsIGhhbGYtZHVwbGV4IChSZWMuIFQuNzEpICovCisjZGVmaW5lIEFUTV9MMl9IRExDX0FSTQkweDA5CS8qIEhETEMgQVJNIChJU08vSUVDIDQzMzUpICovCisjZGVmaW5lIEFUTV9MMl9IRExDX05STQkweDBhCS8qIEhETEMgTlJNIChJU08vSUVDIDQzMzUpICovCisjZGVmaW5lIEFUTV9MMl9IRExDX0FCTQkweDBiCS8qIEhETEMgQUJNIChJU08vSUVDIDQzMzUpICovCisjZGVmaW5lIEFUTV9MMl9JU084ODAyCTB4MGMJLyogTEFOIExMQyAoSVNPL0lFQyA4ODAyLzIpICovCisjZGVmaW5lIEFUTV9MMl9YNzUJMHgwZAkvKiBJVFUtVCBYLjc1LCBTTFAgKi8KKyNkZWZpbmUgQVRNX0wyX1E5MjIJMHgwZQkvKiBJVFUtVCBRLjkyMiAqLworI2RlZmluZSBBVE1fTDJfVVNFUgkweDEwCS8qIHVzZXItc3BlY2lmaWVkICovCisjZGVmaW5lIEFUTV9MMl9JU083Nzc2CTB4MTEJLyogSVNPIDc3NzYgRFRFLURURSAqLworLyogRU5EX0wyICovCisKKworLyoKKyAqIExheWVyIDMgcHJvdG9jb2wgaWRlbnRpZmllcnMKKyAqLworCisvKiBCRUdJTl9MMyAqLworI2RlZmluZSBBVE1fTDNfTk9ORQkwCS8qIEwzIG5vdCBzcGVjaWZpZWQgKi8KKyNkZWZpbmUgQVRNX0wzX1gyNQkweDA2CS8qIElUVS1UIFguMjUsIHBhY2tldCBsYXllciAqLworI2RlZmluZSBBVE1fTDNfSVNPODIwOAkweDA3CS8qIElTTy9JRUMgODIwOCAqLworI2RlZmluZSBBVE1fTDNfWDIyMwkweDA4CS8qIElUVS1UIFguMjIzIHwgSVNPL0lFQyA4ODc4ICovCisjZGVmaW5lIEFUTV9MM19JU084NDczCTB4MDkJLyogSVRVLVQgWC4yMzMgfCBJU08vSUVDIDg0NzMgKi8KKyNkZWZpbmUgQVRNX0wzX1Q3MAkweDBhCS8qIElUVS1UIFQuNzAgbWluaW11bSBuZXR3b3JrIGxheWVyICovCisjZGVmaW5lIEFUTV9MM19UUjk1NzcJMHgwYgkvKiBJU08vSUVDIFRSIDk1NzcgKi8KKyNkZWZpbmUgQVRNX0wzX0gzMTAJMHgwYwkvKiBJVFUtVCBSZWNvbW1lbmRhdGlvbiBILjMxMCAqLworI2RlZmluZSBBVE1fTDNfSDMyMQkweDBkCS8qIElUVS1UIFJlY29tbWVuZGF0aW9uIEguMzIxICovCisjZGVmaW5lIEFUTV9MM19VU0VSCTB4MTAJLyogdXNlci1zcGVjaWZpZWQgKi8KKy8qIEVORF9MMyAqLworCisKKy8qCisgKiBIaWdoIGxheWVyIGlkZW50aWZpZXJzCisgKi8KKworLyogQkVHSU5fSEwgKi8KKyNkZWZpbmUgQVRNX0hMX05PTkUJMAkvKiBITCBub3Qgc3BlY2lmaWVkICovCisjZGVmaW5lIEFUTV9ITF9JU08JMHgwMQkvKiBJU08gKi8KKyNkZWZpbmUgQVRNX0hMX1VTRVIJMHgwMgkvKiB1c2VyLXNwZWNpZmljICovCisjZGVmaW5lIEFUTV9ITF9ITFAJMHgwMwkvKiBoaWdoIGxheWVyIHByb2ZpbGUgLSBVTkkgMy4wIG9ubHkgKi8KKyNkZWZpbmUgQVRNX0hMX1ZFTkRPUgkweDA0CS8qIHZlbmRvci1zcGVjaWZpYyBhcHBsaWNhdGlvbiBpZGVudGlmaWVyICovCisvKiBFTkRfSEwgKi8KKworCisvKgorICogSVRVLVQgY29kZWQgbW9kZSBvZiBvcGVyYXRpb24KKyAqLworCisvKiBCRUdJTl9JTUQgKi8KKyNkZWZpbmUgQVRNX0lNRF9OT05FCSAwCS8qIG1vZGUgbm90IHNwZWNpZmllZCAqLworI2RlZmluZSBBVE1fSU1EX05PUk1BTAkgMQkvKiBub3JtYWwgbW9kZSBvZiBvcGVyYXRpb24gKi8KKyNkZWZpbmUgQVRNX0lNRF9FWFRFTkRFRCAyCS8qIGV4dGVuZGVkIG1vZGUgb2Ygb3BlcmF0aW9uICovCisvKiBFTkRfSU1EICovCisKKy8qCisgKiBILjMxMCBjb2RlIHBvaW50cworICovCisKKyNkZWZpbmUgQVRNX1RUX05PTkUJMAkvKiB0ZXJtaW5hbCB0eXBlIG5vdCBzcGVjaWZpZWQgKi8KKyNkZWZpbmUgQVRNX1RUX1JYCTEJLyogcmVjZWl2ZSBvbmx5ICovCisjZGVmaW5lIEFUTV9UVF9UWAkyCS8qIHNlbmQgb25seSAqLworI2RlZmluZSBBVE1fVFRfUlhUWAkzCS8qIHJlY2VpdmUgYW5kIHNlbmQgKi8KKworI2RlZmluZSBBVE1fTUNfTk9ORQkwCS8qIG5vIG11bHRpcGxleGluZyAqLworI2RlZmluZSBBVE1fTUNfVFMJMQkvKiB0cmFuc3BvcnQgc3RyZWFtIChUUykgKi8KKyNkZWZpbmUgQVRNX01DX1RTX0ZFQwkyCS8qIHRyYW5zcG9ydCBzdHJlYW0gd2l0aCBmb3J3YXJkIGVycm9yIGNvcnIuICovCisjZGVmaW5lIEFUTV9NQ19QUwkzCS8qIHByb2dyYW0gc3RyZWFtIChQUykgKi8KKyNkZWZpbmUgQVRNX01DX1BTX0ZFQwk0CS8qIHByb2dyYW0gc3RyZWFtIHdpdGggZm9yd2FyZCBlcnJvciBjb3JyLiAqLworI2RlZmluZSBBVE1fTUNfSDIyMQk1CS8qIElUVS1UIFJlYy4gSC4yMjEgKi8KKworLyoKKyAqIFNBUCBzdHJ1Y3R1cmVzCisgKi8KKworI2RlZmluZSBBVE1fTUFYX0hMSQk4CS8qIG1heGltdW0gaGlnaC1sYXllciBpbmZvcm1hdGlvbiBsZW5ndGggKi8KKworCitzdHJ1Y3QgYXRtX2JsbGkgeworICAgIHVuc2lnbmVkIGNoYXIgbDJfcHJvdG87CS8qIGxheWVyIDIgcHJvdG9jb2wgKi8KKyAgICB1bmlvbiB7CisJc3RydWN0IHsKKwkgICAgdW5zaWduZWQgY2hhciBtb2RlOwkvKiBtb2RlIG9mIG9wZXJhdGlvbiAoQVRNX0lNRF94eHgpLCAwIGlmICovCisJCQkJLyogYWJzZW50ICovCisJICAgIHVuc2lnbmVkIGNoYXIgd2luZG93OyAvKiB3aW5kb3cgc2l6ZSAoayksIDEtMTI3ICgwIHRvIG9taXQpICovCisJfSBpdHU7CQkJLyogSVRVLVQgZW5jb2RpbmcgKi8KKwl1bnNpZ25lZCBjaGFyIHVzZXI7CS8qIHVzZXItc3BlY2lmaWVkIGwyIGluZm9ybWF0aW9uICovCisgICAgfSBsMjsKKyAgICB1bnNpZ25lZCBjaGFyIGwzX3Byb3RvOwkvKiBsYXllciAzIHByb3RvY29sICovCisgICAgdW5pb24geworCXN0cnVjdCB7CisJICAgIHVuc2lnbmVkIGNoYXIgbW9kZTsJLyogbW9kZSBvZiBvcGVyYXRpb24gKEFUTV9JTURfeHh4KSwgMCBpZiAqLworCQkJCS8qIGFic2VudCAqLworCSAgICB1bnNpZ25lZCBjaGFyIGRlZl9zaXplOyAvKiBkZWZhdWx0IHBhY2tldCBzaXplIChsb2cyKSwgNC0xMiAoMCB0byAqLworCQkJCSAgICAvKiBvbWl0KSAqLworCSAgICB1bnNpZ25lZCBjaGFyIHdpbmRvdzsvKiBwYWNrZXQgd2luZG93IHNpemUsIDEtMTI3ICgwIHRvIG9taXQpICovCisJfSBpdHU7CQkJLyogSVRVLVQgZW5jb2RpbmcgKi8KKwl1bnNpZ25lZCBjaGFyIHVzZXI7CS8qIHVzZXIgc3BlY2lmaWVkIGwzIGluZm9ybWF0aW9uICovCisJc3RydWN0IHsJCSAgICAgIC8qIGlmIGwzX3Byb3RvID0gQVRNX0wzX0gzMTAgKi8KKwkgICAgdW5zaWduZWQgY2hhciB0ZXJtX3R5cGU7ICAvKiB0ZXJtaW5hbCB0eXBlICovCisJICAgIHVuc2lnbmVkIGNoYXIgZndfbXB4X2NhcDsgLyogZm9yd2FyZCBtdWx0aXBsZXhpbmcgY2FwYWJpbGl0eSAqLworCQkJCSAgICAgIC8qIG9ubHkgaWYgdGVybV90eXBlICE9IEFUTV9UVF9OT05FICovCisJICAgIHVuc2lnbmVkIGNoYXIgYndfbXB4X2NhcDsgLyogYmFja3dhcmQgbXVsdGlwbGV4aW5nIGNhcGFiaWxpdHkgKi8KKwkJCQkgICAgICAvKiBvbmx5IGlmIHRlcm1fdHlwZSAhPSBBVE1fVFRfTk9ORSAqLworCX0gaDMxMDsKKwlzdHJ1Y3QgewkJICAvKiBpZiBsM19wcm90byA9IEFUTV9MM19UUjk1NzcgKi8KKwkgICAgdW5zaWduZWQgY2hhciBpcGk7CSAgLyogaW5pdGlhbCBwcm90b2NvbCBpZCAqLworCSAgICB1bnNpZ25lZCBjaGFyIHNuYXBbNV07LyogSUVFRSA4MDIuMSBTTkFQIGlkZW50aWZpZXIgKi8KKwkJCQkgIC8qIChvbmx5IGlmIGlwaSA9PSBOTFBJRF9JRUVFODAyXzFfU05BUCkgKi8KKwl9IHRyOTU3NzsKKyAgICB9IGwzOworfSBfX0FUTV9BUElfQUxJR047CisKKworc3RydWN0IGF0bV9iaGxpIHsKKyAgICB1bnNpZ25lZCBjaGFyIGhsX3R5cGU7CS8qIGhpZ2ggbGF5ZXIgaW5mb3JtYXRpb24gdHlwZSAqLworICAgIHVuc2lnbmVkIGNoYXIgaGxfbGVuZ3RoOwkvKiBsZW5ndGggKG9ubHkgaWYgaGxfdHlwZSA9PSBBVE1fSExfVVNFUiB8fCAqLworCQkJCS8qIGhsX3R5cGUgPT0gQVRNX0hMX0lTTykgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGhsX2luZm9bQVRNX01BWF9ITEldOy8qIGhpZ2ggbGF5ZXIgaW5mb3JtYXRpb24gKi8KK307CisKKworI2RlZmluZSBBVE1fTUFYX0JMTEkJMwkJLyogbWF4aW11bSBudW1iZXIgb2YgQkxMSSBlbGVtZW50cyAqLworCisKK3N0cnVjdCBhdG1fc2FwIHsKKwlzdHJ1Y3QgYXRtX2JobGkgYmhsaTsJCS8qIGxvY2FsIFNBUCwgaGlnaC1sYXllciBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCBhdG1fYmxsaSBibGxpW0FUTV9NQVhfQkxMSV0gX19BVE1fQVBJX0FMSUdOOworCQkJCQkvKiBsb2NhbCBTQVAsIGxvdy1sYXllciBpbmZvICovCit9OworCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBibGxpX2luX3VzZShzdHJ1Y3QgYXRtX2JsbGkgYmxsaSkKK3sKKwlyZXR1cm4gYmxsaS5sMl9wcm90byB8fCBibGxpLmwzX3Byb3RvOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtc3ZjLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bXN2Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNzE1ODMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bXN2Yy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIGF0bXN2Yy5oIC0gQVRNIHNpZ25hbGluZyBrZXJuZWwtZGVtb24gaW50ZXJmYWNlIGRlZmluaXRpb25zICovCisgCisvKiBXcml0dGVuIDE5OTUtMjAwMCBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwgTFJDL0lDQSAqLworIAorCisjaWZuZGVmIF9MSU5VWF9BVE1TVkNfSAorI2RlZmluZSBfTElOVVhfQVRNU1ZDX0gKKworI2luY2x1ZGUgPGxpbnV4L2F0bWFwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWlvYy5oPgorCisKKyNkZWZpbmUgQVRNU0lHRF9DVFJMIF9JTygnYScsQVRNSU9DX1NQRUNJQUwpCisJCQkJLyogYmVjb21lIEFUTSBzaWduYWxpbmcgZGVtb24gY29udHJvbCBzb2NrZXQgKi8KKworZW51bSBhdG1zdmNfbXNnX3R5cGUgeyBhc19jYXRjaF9udWxsLCBhc19iaW5kLCBhc19jb25uZWN0LCBhc19hY2NlcHQsIGFzX3JlamVjdCwKKwkJICAgICAgIGFzX2xpc3RlbiwgYXNfb2theSwgYXNfZXJyb3IsIGFzX2luZGljYXRlLCBhc19jbG9zZSwKKwkJICAgICAgIGFzX2l0Zl9ub3RpZnksIGFzX21vZGlmeSwgYXNfaWRlbnRpZnksIGFzX3Rlcm1pbmF0ZSwKKwkJICAgICAgIGFzX2FkZHBhcnR5LCBhc19kcm9wcGFydHkgfTsKKworc3RydWN0IGF0bXN2Y19tc2cgeworCWVudW0gYXRtc3ZjX21zZ190eXBlIHR5cGU7CisJYXRtX2twdHJfdCB2Y2M7CisJYXRtX2twdHJfdCBsaXN0ZW5fdmNjOwkJLyogaW5kaWNhdGUgKi8KKwlpbnQgcmVwbHk7CQkJLyogZm9yIG9rYXkgYW5kIGNsb3NlOgkJICAgKi8KKwkJCQkJLyogICA8IDA6IGVycm9yIGJlZm9yZSBhY3RpdmUJICAgKi8KKwkJCQkJLyogICAgICAgIChzaWdkIGhhcyBkaXNjYXJkZWQgY3R4KSAqLworCQkJCQkvKiAgID09MDogc3VjY2VzcwkJICAgKi8KKwkJCQkgICAgICAgIC8qICAgPiAwOiBlcnJvciB3aGVuIGFjdGl2ZSAoc3RpbGwgKi8KKwkJCQkJLyogICAgICAgIG5lZWQgdG8gY2xvc2UpCSAgICovCisJc3RydWN0IHNvY2thZGRyX2F0bXB2YyBwdmM7CS8qIGluZGljYXRlLCBva2F5IChjb25uZWN0KSAqLworCXN0cnVjdCBzb2NrYWRkcl9hdG1zdmMgbG9jYWw7CS8qIGxvY2FsIFNWQyBhZGRyZXNzICovCisJc3RydWN0IGF0bV9xb3MgcW9zOwkJLyogUU9TIHBhcmFtZXRlcnMgKi8KKwlzdHJ1Y3QgYXRtX3NhcCBzYXA7CQkvKiBTQVAgKi8KKwl1bnNpZ25lZCBpbnQgc2Vzc2lvbjsJCS8qIGZvciBwMnBtICovCisJc3RydWN0IHNvY2thZGRyX2F0bXN2YyBzdmM7CS8qIFNWQyBhZGRyZXNzICovCit9IF9fQVRNX0FQSV9BTElHTjsKKworLyoKKyAqIE1lc3NhZ2UgY29udGVudHM6IHNlZSBmdHA6Ly9pY2FmdHAuZXBmbC5jaC9wdWIvbGludXgvYXRtL2RvY3MvaXNwLSoudGFyLmd6CisgKi8KKworLyoKKyAqIFNvbWUgcG9saWN5IHN0dWZmIGZvciBhdG1zaWdkIGFuZCBmb3IgbmV0L2F0bS9zdmMuYy4gQm90aCBoYXZlIHRvIGFncmVlIG9uCisgKiB3aGF0IFBDUiBpcyB1c2VkIHRvIHJlcXVlc3QgYmFuZHdpZHRoIGZyb20gdGhlIGRldmljZSBkcml2ZXIuIG5ldC9hdG0vc3ZjLmMKKyAqIHRyaWVzIHRvIGRvIGJldHRlciB0aGFuIHRoYXQsIGJ1dCBvbmx5IGlmIHRoZXJlJ3Mgbm8gcm91dGluZyBkZWNpc2lvbiAoaS5lLgorICogaWYgc2lnbmFsaW5nIG9ubHkgdXNlcyBvbmUgQVRNIGludGVyZmFjZSkuCisgKi8KKworI2RlZmluZSBTRUxFQ1RfVE9QX1BDUih0cCkgKCh0cCkucGNyID8gKHRwKS5wY3IgOiBcCisgICh0cCkubWF4X3BjciAmJiAodHApLm1heF9wY3IgIT0gQVRNX01BWF9QQ1IgPyAodHApLm1heF9wY3IgOiBcCisgICh0cCkubWluX3BjciA/ICh0cCkubWluX3BjciA6IEFUTV9NQVhfUENSKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXVkaXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXVkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODhhMTlkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdWRpdC5oCkBAIC0wLDAgKzEsMzY0IEBACisvKiBhdWRpdC5oIC0tIEF1ZGl0aW5nIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA0IFJlZCBIYXQgSW5jLiwgRHVyaGFtLCBOb3J0aCBDYXJvbGluYS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqIFdyaXR0ZW4gYnkgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAcmVkaGF0LmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfQVVESVRfSF8KKyNkZWZpbmUgX0xJTlVYX0FVRElUX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi1lbS5oPgorCisvKiBUaGUgbmV0bGluayBtZXNzYWdlcyBmb3IgdGhlIGF1ZGl0IHN5c3RlbSBpcyBkaXZpZGVkIGludG8gYmxvY2tzOgorICogMTAwMCAtIDEwOTkgYXJlIGZvciBjb21tYW5kaW5nIHRoZSBhdWRpdCBzeXN0ZW0KKyAqIDExMDAgLSAxMTk5IHVzZXIgc3BhY2UgdHJ1c3RlZCBhcHBsaWNhdGlvbiBtZXNzYWdlcworICogMTIwMCAtIDEyOTkgbWVzc2FnZXMgaW50ZXJuYWwgdG8gdGhlIGF1ZGl0IGRhZW1vbgorICogMTMwMCAtIDEzOTkgYXVkaXQgZXZlbnQgbWVzc2FnZXMKKyAqIDE0MDAgLSAxNDk5IFNFIExpbnV4IHVzZQorICogMTUwMCAtIDE1OTkga2VybmVsIExTUFAgZXZlbnRzCisgKiAxNjAwIC0gMTY5OSBrZXJuZWwgY3J5cHRvIGV2ZW50cworICogMTcwMCAtIDE3OTkga2VybmVsIGFub21hbHkgcmVjb3JkcworICogMTgwMCAtIDE4OTkga2VybmVsIGludGVncml0eSBldmVudHMKKyAqIDE5MDAgLSAxOTk5IGZ1dHVyZSBrZXJuZWwgdXNlCisgKiAyMDAwIGlzIGZvciBvdGhlcndpc2UgdW5jbGFzc2lmaWVkIGtlcm5lbCBhdWRpdCBtZXNzYWdlcyAobGVnYWN5KQorICogMjAwMSAtIDIwOTkgdW51c2VkIChrZXJuZWwpCisgKiAyMTAwIC0gMjE5OSB1c2VyIHNwYWNlIGFub21hbHkgcmVjb3JkcworICogMjIwMCAtIDIyOTkgdXNlciBzcGFjZSBhY3Rpb25zIHRha2VuIGluIHJlc3BvbnNlIHRvIGFub21hbGllcworICogMjMwMCAtIDIzOTkgdXNlciBzcGFjZSBnZW5lcmF0ZWQgTFNQUCBldmVudHMKKyAqIDI0MDAgLSAyNDk5IHVzZXIgc3BhY2UgY3J5cHRvIGV2ZW50cworICogMjUwMCAtIDI5OTkgZnV0dXJlIHVzZXIgc3BhY2UgKG1heWJlIGludGVncml0eSBsYWJlbHMgYW5kIHJlbGF0ZWQgZXZlbnRzKQorICoKKyAqIE1lc3NhZ2VzIGZyb20gMTAwMC0xMTk5IGFyZSBiaS1kaXJlY3Rpb25hbC4gMTIwMC0xMjk5ICYgMjEwMCAtIDI5OTkgYXJlCisgKiBleGNsdXNpdmVseSB1c2VyIHNwYWNlLiAxMzAwLTIwOTkgaXMga2VybmVsIC0tPiB1c2VyIHNwYWNlIAorICogY29tbXVuaWNhdGlvbi4KKyAqLworI2RlZmluZSBBVURJVF9HRVQJCTEwMDAJLyogR2V0IHN0YXR1cyAqLworI2RlZmluZSBBVURJVF9TRVQJCTEwMDEJLyogU2V0IHN0YXR1cyAoZW5hYmxlL2Rpc2FibGUvYXVkaXRkKSAqLworI2RlZmluZSBBVURJVF9MSVNUCQkxMDAyCS8qIExpc3Qgc3lzY2FsbCBydWxlcyAtLSBkZXByZWNhdGVkICovCisjZGVmaW5lIEFVRElUX0FERAkJMTAwMwkvKiBBZGQgc3lzY2FsbCBydWxlIC0tIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgQVVESVRfREVMCQkxMDA0CS8qIERlbGV0ZSBzeXNjYWxsIHJ1bGUgLS0gZGVwcmVjYXRlZCAqLworI2RlZmluZSBBVURJVF9VU0VSCQkxMDA1CS8qIE1lc3NhZ2UgZnJvbSB1c2Vyc3BhY2UgLS0gZGVwcmVjYXRlZCAqLworI2RlZmluZSBBVURJVF9MT0dJTgkJMTAwNgkvKiBEZWZpbmUgdGhlIGxvZ2luIGlkIGFuZCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBBVURJVF9XQVRDSF9JTlMJCTEwMDcJLyogSW5zZXJ0IGZpbGUvZGlyIHdhdGNoIGVudHJ5ICovCisjZGVmaW5lIEFVRElUX1dBVENIX1JFTQkJMTAwOAkvKiBSZW1vdmUgZmlsZS9kaXIgd2F0Y2ggZW50cnkgKi8KKyNkZWZpbmUgQVVESVRfV0FUQ0hfTElTVAkxMDA5CS8qIExpc3QgYWxsIGZpbGUvZGlyIHdhdGNoZXMgKi8KKyNkZWZpbmUgQVVESVRfU0lHTkFMX0lORk8JMTAxMAkvKiBHZXQgaW5mbyBhYm91dCBzZW5kZXIgb2Ygc2lnbmFsIHRvIGF1ZGl0ZCAqLworI2RlZmluZSBBVURJVF9BRERfUlVMRQkJMTAxMQkvKiBBZGQgc3lzY2FsbCBmaWx0ZXJpbmcgcnVsZSAqLworI2RlZmluZSBBVURJVF9ERUxfUlVMRQkJMTAxMgkvKiBEZWxldGUgc3lzY2FsbCBmaWx0ZXJpbmcgcnVsZSAqLworI2RlZmluZSBBVURJVF9MSVNUX1JVTEVTCTEwMTMJLyogTGlzdCBzeXNjYWxsIGZpbHRlcmluZyBydWxlcyAqLworI2RlZmluZSBBVURJVF9UUklNCQkxMDE0CS8qIFRyaW0ganVuayBmcm9tIHdhdGNoZWQgdHJlZSAqLworI2RlZmluZSBBVURJVF9NQUtFX0VRVUlWCTEwMTUJLyogQXBwZW5kIHRvIHdhdGNoZWQgdHJlZSAqLworI2RlZmluZSBBVURJVF9UVFlfR0VUCQkxMDE2CS8qIEdldCBUVFkgYXVkaXRpbmcgc3RhdHVzICovCisjZGVmaW5lIEFVRElUX1RUWV9TRVQJCTEwMTcJLyogU2V0IFRUWSBhdWRpdGluZyBzdGF0dXMgKi8KKworI2RlZmluZSBBVURJVF9GSVJTVF9VU0VSX01TRwkxMTAwCS8qIFVzZXJzcGFjZSBtZXNzYWdlcyBtb3N0bHkgdW5pbnRlcmVzdGluZyB0byBrZXJuZWwgKi8KKyNkZWZpbmUgQVVESVRfVVNFUl9BVkMJCTExMDcJLyogV2UgZmlsdGVyIHRoaXMgZGlmZmVyZW50bHkgKi8KKyNkZWZpbmUgQVVESVRfVVNFUl9UVFkJCTExMjQJLyogTm9uLUlDQU5PTiBUVFkgaW5wdXQgbWVhbmluZyAqLworI2RlZmluZSBBVURJVF9MQVNUX1VTRVJfTVNHCTExOTkKKyNkZWZpbmUgQVVESVRfRklSU1RfVVNFUl9NU0cyCTIxMDAJLyogTW9yZSB1c2VyIHNwYWNlIG1lc3NhZ2VzICovCisjZGVmaW5lIEFVRElUX0xBU1RfVVNFUl9NU0cyCTI5OTkKKyAKKyNkZWZpbmUgQVVESVRfREFFTU9OX1NUQVJUICAgICAgMTIwMCAgICAvKiBEYWVtb24gc3RhcnR1cCByZWNvcmQgKi8KKyNkZWZpbmUgQVVESVRfREFFTU9OX0VORCAgICAgICAgMTIwMSAgICAvKiBEYWVtb24gbm9ybWFsIHN0b3AgcmVjb3JkICovCisjZGVmaW5lIEFVRElUX0RBRU1PTl9BQk9SVCAgICAgIDEyMDIgICAgLyogRGFlbW9uIGVycm9yIHN0b3AgcmVjb3JkICovCisjZGVmaW5lIEFVRElUX0RBRU1PTl9DT05GSUcgICAgIDEyMDMgICAgLyogRGFlbW9uIGNvbmZpZyBjaGFuZ2UgKi8KKworI2RlZmluZSBBVURJVF9TWVNDQUxMCQkxMzAwCS8qIFN5c2NhbGwgZXZlbnQgKi8KKy8qICNkZWZpbmUgQVVESVRfRlNfV0FUQ0gJMTMwMQkgKiBEZXByZWNhdGVkICovCisjZGVmaW5lIEFVRElUX1BBVEgJCTEzMDIJLyogRmlsZW5hbWUgcGF0aCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBBVURJVF9JUEMJCTEzMDMJLyogSVBDIHJlY29yZCAqLworI2RlZmluZSBBVURJVF9TT0NLRVRDQUxMCTEzMDQJLyogc3lzX3NvY2tldGNhbGwgYXJndW1lbnRzICovCisjZGVmaW5lIEFVRElUX0NPTkZJR19DSEFOR0UJMTMwNQkvKiBBdWRpdCBzeXN0ZW0gY29uZmlndXJhdGlvbiBjaGFuZ2UgKi8KKyNkZWZpbmUgQVVESVRfU09DS0FERFIJCTEzMDYJLyogc29ja2FkZHIgY29waWVkIGFzIHN5c2NhbGwgYXJnICovCisjZGVmaW5lIEFVRElUX0NXRAkJMTMwNwkvKiBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICovCisjZGVmaW5lIEFVRElUX0VYRUNWRQkJMTMwOQkvKiBleGVjdmUgYXJndW1lbnRzICovCisjZGVmaW5lIEFVRElUX0lQQ19TRVRfUEVSTQkxMzExCS8qIElQQyBuZXcgcGVybWlzc2lvbnMgcmVjb3JkIHR5cGUgKi8KKyNkZWZpbmUgQVVESVRfTVFfT1BFTgkJMTMxMgkvKiBQT1NJWCBNUSBvcGVuIHJlY29yZCB0eXBlICovCisjZGVmaW5lIEFVRElUX01RX1NFTkRSRUNWCTEzMTMJLyogUE9TSVggTVEgc2VuZC9yZWNlaXZlIHJlY29yZCB0eXBlICovCisjZGVmaW5lIEFVRElUX01RX05PVElGWQkJMTMxNAkvKiBQT1NJWCBNUSBub3RpZnkgcmVjb3JkIHR5cGUgKi8KKyNkZWZpbmUgQVVESVRfTVFfR0VUU0VUQVRUUgkxMzE1CS8qIFBPU0lYIE1RIGdldC9zZXQgYXR0cmlidXRlIHJlY29yZCB0eXBlICovCisjZGVmaW5lIEFVRElUX0tFUk5FTF9PVEhFUgkxMzE2CS8qIEZvciB1c2UgYnkgM3JkIHBhcnR5IG1vZHVsZXMgKi8KKyNkZWZpbmUgQVVESVRfRkRfUEFJUgkJMTMxNyAgICAvKiBhdWRpdCByZWNvcmQgZm9yIHBpcGUvc29ja2V0cGFpciAqLworI2RlZmluZSBBVURJVF9PQkpfUElECQkxMzE4CS8qIHB0cmFjZSB0YXJnZXQgKi8KKyNkZWZpbmUgQVVESVRfVFRZCQkxMzE5CS8qIElucHV0IG9uIGFuIGFkbWluaXN0cmF0aXZlIFRUWSAqLworI2RlZmluZSBBVURJVF9FT0UJCTEzMjAJLyogRW5kIG9mIG11bHRpLXJlY29yZCBldmVudCAqLworI2RlZmluZSBBVURJVF9CUFJNX0ZDQVBTCTEzMjEJLyogSW5mb3JtYXRpb24gYWJvdXQgZmNhcHMgaW5jcmVhc2luZyBwZXJtcyAqLworI2RlZmluZSBBVURJVF9DQVBTRVQJCTEzMjIJLyogUmVjb3JkIHNob3dpbmcgYXJndW1lbnQgdG8gc3lzX2NhcHNldCAqLworI2RlZmluZSBBVURJVF9NTUFQCQkxMzIzCS8qIFJlY29yZCBzaG93aW5nIGRlc2NyaXB0b3IgYW5kIGZsYWdzIGluIG1tYXAgKi8KKyNkZWZpbmUgQVVESVRfTkVURklMVEVSX1BLVAkxMzI0CS8qIFBhY2tldHMgdHJhdmVyc2luZyBuZXRmaWx0ZXIgY2hhaW5zICovCisjZGVmaW5lIEFVRElUX05FVEZJTFRFUl9DRkcJMTMyNQkvKiBOZXRmaWx0ZXIgY2hhaW4gbW9kaWZpY2F0aW9ucyAqLworCisjZGVmaW5lIEFVRElUX0FWQwkJMTQwMAkvKiBTRSBMaW51eCBhdmMgZGVuaWFsIG9yIGdyYW50ICovCisjZGVmaW5lIEFVRElUX1NFTElOVVhfRVJSCTE0MDEJLyogSW50ZXJuYWwgU0UgTGludXggRXJyb3JzICovCisjZGVmaW5lIEFVRElUX0FWQ19QQVRICQkxNDAyCS8qIGRlbnRyeSwgdmZzbW91bnQgcGFpciBmcm9tIGF2YyAqLworI2RlZmluZSBBVURJVF9NQUNfUE9MSUNZX0xPQUQJMTQwMwkvKiBQb2xpY3kgZmlsZSBsb2FkICovCisjZGVmaW5lIEFVRElUX01BQ19TVEFUVVMJMTQwNAkvKiBDaGFuZ2VkIGVuZm9yY2luZyxwZXJtaXNzaXZlLG9mZiAqLworI2RlZmluZSBBVURJVF9NQUNfQ09ORklHX0NIQU5HRQkxNDA1CS8qIENoYW5nZXMgdG8gYm9vbGVhbnMgKi8KKyNkZWZpbmUgQVVESVRfTUFDX1VOTEJMX0FMTE9XCTE0MDYJLyogTmV0TGFiZWw6IGFsbG93IHVubGFiZWxlZCB0cmFmZmljICovCisjZGVmaW5lIEFVRElUX01BQ19DSVBTT1Y0X0FERAkxNDA3CS8qIE5ldExhYmVsOiBhZGQgQ0lQU092NCBET0kgZW50cnkgKi8KKyNkZWZpbmUgQVVESVRfTUFDX0NJUFNPVjRfREVMCTE0MDgJLyogTmV0TGFiZWw6IGRlbCBDSVBTT3Y0IERPSSBlbnRyeSAqLworI2RlZmluZSBBVURJVF9NQUNfTUFQX0FERAkxNDA5CS8qIE5ldExhYmVsOiBhZGQgTFNNIGRvbWFpbiBtYXBwaW5nICovCisjZGVmaW5lIEFVRElUX01BQ19NQVBfREVMCTE0MTAJLyogTmV0TGFiZWw6IGRlbCBMU00gZG9tYWluIG1hcHBpbmcgKi8KKyNkZWZpbmUgQVVESVRfTUFDX0lQU0VDX0FERFNBCTE0MTEJLyogTm90IHVzZWQgKi8KKyNkZWZpbmUgQVVESVRfTUFDX0lQU0VDX0RFTFNBCTE0MTIJLyogTm90IHVzZWQgICovCisjZGVmaW5lIEFVRElUX01BQ19JUFNFQ19BRERTUEQJMTQxMwkvKiBOb3QgdXNlZCAqLworI2RlZmluZSBBVURJVF9NQUNfSVBTRUNfREVMU1BECTE0MTQJLyogTm90IHVzZWQgKi8KKyNkZWZpbmUgQVVESVRfTUFDX0lQU0VDX0VWRU5UCTE0MTUJLyogQXVkaXQgYW4gSVBTZWMgZXZlbnQgKi8KKyNkZWZpbmUgQVVESVRfTUFDX1VOTEJMX1NUQ0FERAkxNDE2CS8qIE5ldExhYmVsOiBhZGQgYSBzdGF0aWMgbGFiZWwgKi8KKyNkZWZpbmUgQVVESVRfTUFDX1VOTEJMX1NUQ0RFTAkxNDE3CS8qIE5ldExhYmVsOiBkZWwgYSBzdGF0aWMgbGFiZWwgKi8KKworI2RlZmluZSBBVURJVF9GSVJTVF9LRVJOX0FOT01fTVNHICAgMTcwMAorI2RlZmluZSBBVURJVF9MQVNUX0tFUk5fQU5PTV9NU0cgICAgMTc5OQorI2RlZmluZSBBVURJVF9BTk9NX1BST01JU0NVT1VTICAgICAgMTcwMCAvKiBEZXZpY2UgY2hhbmdlZCBwcm9taXNjdW91cyBtb2RlICovCisjZGVmaW5lIEFVRElUX0FOT01fQUJFTkQgICAgICAgICAgICAxNzAxIC8qIFByb2Nlc3MgZW5kZWQgYWJub3JtYWxseSAqLworI2RlZmluZSBBVURJVF9JTlRFR1JJVFlfREFUQQkgICAgMTgwMCAvKiBEYXRhIGludGVncml0eSB2ZXJpZmljYXRpb24gKi8KKyNkZWZpbmUgQVVESVRfSU5URUdSSVRZX01FVEFEQVRBICAgIDE4MDEgLyogTWV0YWRhdGEgaW50ZWdyaXR5IHZlcmlmaWNhdGlvbiAqLworI2RlZmluZSBBVURJVF9JTlRFR1JJVFlfU1RBVFVTCSAgICAxODAyIC8qIEludGVncml0eSBlbmFibGUgc3RhdHVzICovCisjZGVmaW5lIEFVRElUX0lOVEVHUklUWV9IQVNICSAgICAxODAzIC8qIEludGVncml0eSBIQVNIIHR5cGUgKi8KKyNkZWZpbmUgQVVESVRfSU5URUdSSVRZX1BDUgkgICAgMTgwNCAvKiBQQ1IgaW52YWxpZGF0aW9uIG1zZ3MgKi8KKyNkZWZpbmUgQVVESVRfSU5URUdSSVRZX1JVTEUJICAgIDE4MDUgLyogcG9saWN5IHJ1bGUgKi8KKworI2RlZmluZSBBVURJVF9LRVJORUwJCTIwMDAJLyogQXN5bmNocm9ub3VzIGF1ZGl0IHJlY29yZC4gTk9UIEEgUkVRVUVTVC4gKi8KKworLyogUnVsZSBmbGFncyAqLworI2RlZmluZSBBVURJVF9GSUxURVJfVVNFUgkweDAwCS8qIEFwcGx5IHJ1bGUgdG8gdXNlci1nZW5lcmF0ZWQgbWVzc2FnZXMgKi8KKyNkZWZpbmUgQVVESVRfRklMVEVSX1RBU0sJMHgwMQkvKiBBcHBseSBydWxlIGF0IHRhc2sgY3JlYXRpb24gKG5vdCBzeXNjYWxsKSAqLworI2RlZmluZSBBVURJVF9GSUxURVJfRU5UUlkJMHgwMgkvKiBBcHBseSBydWxlIGF0IHN5c2NhbGwgZW50cnkgKi8KKyNkZWZpbmUgQVVESVRfRklMVEVSX1dBVENICTB4MDMJLyogQXBwbHkgcnVsZSB0byBmaWxlIHN5c3RlbSB3YXRjaGVzICovCisjZGVmaW5lIEFVRElUX0ZJTFRFUl9FWElUCTB4MDQJLyogQXBwbHkgcnVsZSBhdCBzeXNjYWxsIGV4aXQgKi8KKyNkZWZpbmUgQVVESVRfRklMVEVSX1RZUEUJMHgwNQkvKiBBcHBseSBydWxlIGF0IGF1ZGl0X2xvZ19zdGFydCAqLworCisjZGVmaW5lIEFVRElUX05SX0ZJTFRFUlMJNgorCisjZGVmaW5lIEFVRElUX0ZJTFRFUl9QUkVQRU5ECTB4MTAJLyogUHJlcGVuZCB0byBmcm9udCBvZiBsaXN0ICovCisKKy8qIFJ1bGUgYWN0aW9ucyAqLworI2RlZmluZSBBVURJVF9ORVZFUiAgICAwCS8qIERvIG5vdCBidWlsZCBjb250ZXh0IGlmIHJ1bGUgbWF0Y2hlcyAqLworI2RlZmluZSBBVURJVF9QT1NTSUJMRSAxCS8qIEJ1aWxkIGNvbnRleHQgaWYgcnVsZSBtYXRjaGVzICAqLworI2RlZmluZSBBVURJVF9BTFdBWVMgICAyCS8qIEdlbmVyYXRlIGF1ZGl0IHJlY29yZCBpZiBydWxlIG1hdGNoZXMgKi8KKworLyogUnVsZSBzdHJ1Y3R1cmUgc2l6ZXMgLS0gaWYgdGhlc2UgY2hhbmdlLCBkaWZmZXJlbnQgQVVESVRfQUREIGFuZAorICogQVVESVRfTElTVCBjb21tYW5kcyBtdXN0IGJlIGltcGxlbWVudGVkLiAqLworI2RlZmluZSBBVURJVF9NQVhfRklFTERTICAgNjQKKyNkZWZpbmUgQVVESVRfTUFYX0tFWV9MRU4gIDI1NgorI2RlZmluZSBBVURJVF9CSVRNQVNLX1NJWkUgNjQKKyNkZWZpbmUgQVVESVRfV09SRChucikgKChfX3UzMikoKG5yKS8zMikpCisjZGVmaW5lIEFVRElUX0JJVChucikgICgxIDw8ICgobnIpIC0gQVVESVRfV09SRChucikqMzIpKQorCisjZGVmaW5lIEFVRElUX1NZU0NBTExfQ0xBU1NFUyAxNgorI2RlZmluZSBBVURJVF9DTEFTU19ESVJfV1JJVEUgMAorI2RlZmluZSBBVURJVF9DTEFTU19ESVJfV1JJVEVfMzIgMQorI2RlZmluZSBBVURJVF9DTEFTU19DSEFUVFIgMgorI2RlZmluZSBBVURJVF9DTEFTU19DSEFUVFJfMzIgMworI2RlZmluZSBBVURJVF9DTEFTU19SRUFEIDQKKyNkZWZpbmUgQVVESVRfQ0xBU1NfUkVBRF8zMiA1CisjZGVmaW5lIEFVRElUX0NMQVNTX1dSSVRFIDYKKyNkZWZpbmUgQVVESVRfQ0xBU1NfV1JJVEVfMzIgNworI2RlZmluZSBBVURJVF9DTEFTU19TSUdOQUwgOAorI2RlZmluZSBBVURJVF9DTEFTU19TSUdOQUxfMzIgOQorCisvKiBUaGlzIGJpdG1hc2sgaXMgdXNlZCB0byB2YWxpZGF0ZSB1c2VyIGlucHV0LiAgSXQgcmVwcmVzZW50cyBhbGwgYml0cyB0aGF0CisgKiBhcmUgY3VycmVudGx5IHVzZWQgaW4gYW4gYXVkaXQgZmllbGQgY29uc3RhbnQgdW5kZXJzdG9vZCBieSB0aGUga2VybmVsLgorICogSWYgeW91IGFyZSBhZGRpbmcgYSBuZXcgI2RlZmluZSBBVURJVF88d2hhdGV2ZXI+LCBwbGVhc2UgZW5zdXJlIHRoYXQKKyAqIEFVRElUX1VOVVNFRF9CSVRTIGlzIHVwZGF0ZWQgaWYgbmVlZCBiZS4gKi8KKyNkZWZpbmUgQVVESVRfVU5VU0VEX0JJVFMJMHgwN0ZGRkMwMAorCisKKy8qIFJ1bGUgZmllbGRzICovCisJCQkJLyogVGhlc2UgYXJlIHVzZWZ1bCB3aGVuIGNoZWNraW5nIHRoZQorCQkJCSAqIHRhc2sgc3RydWN0dXJlIGF0IHRhc2sgY3JlYXRpb24gdGltZQorCQkJCSAqIChBVURJVF9QRVJfVEFTSykuICAqLworI2RlZmluZSBBVURJVF9QSUQJMAorI2RlZmluZSBBVURJVF9VSUQJMQorI2RlZmluZSBBVURJVF9FVUlECTIKKyNkZWZpbmUgQVVESVRfU1VJRAkzCisjZGVmaW5lIEFVRElUX0ZTVUlECTQKKyNkZWZpbmUgQVVESVRfR0lECTUKKyNkZWZpbmUgQVVESVRfRUdJRAk2CisjZGVmaW5lIEFVRElUX1NHSUQJNworI2RlZmluZSBBVURJVF9GU0dJRAk4CisjZGVmaW5lIEFVRElUX0xPR0lOVUlECTkKKyNkZWZpbmUgQVVESVRfUEVSUwkxMAorI2RlZmluZSBBVURJVF9BUkNICTExCisjZGVmaW5lIEFVRElUX01TR1RZUEUJMTIKKyNkZWZpbmUgQVVESVRfU1VCSl9VU0VSCTEzCS8qIHNlY3VyaXR5IGxhYmVsIHVzZXIgKi8KKyNkZWZpbmUgQVVESVRfU1VCSl9ST0xFCTE0CS8qIHNlY3VyaXR5IGxhYmVsIHJvbGUgKi8KKyNkZWZpbmUgQVVESVRfU1VCSl9UWVBFCTE1CS8qIHNlY3VyaXR5IGxhYmVsIHR5cGUgKi8KKyNkZWZpbmUgQVVESVRfU1VCSl9TRU4JMTYJLyogc2VjdXJpdHkgbGFiZWwgc2Vuc2l0aXZpdHkgbGFiZWwgKi8KKyNkZWZpbmUgQVVESVRfU1VCSl9DTFIJMTcJLyogc2VjdXJpdHkgbGFiZWwgY2xlYXJhbmNlIGxhYmVsICovCisjZGVmaW5lIEFVRElUX1BQSUQJMTgKKyNkZWZpbmUgQVVESVRfT0JKX1VTRVIJMTkKKyNkZWZpbmUgQVVESVRfT0JKX1JPTEUJMjAKKyNkZWZpbmUgQVVESVRfT0JKX1RZUEUJMjEKKyNkZWZpbmUgQVVESVRfT0JKX0xFVl9MT1cJMjIKKyNkZWZpbmUgQVVESVRfT0JKX0xFVl9ISUdICTIzCisKKwkJCQkvKiBUaGVzZSBhcmUgT05MWSB1c2VmdWwgd2hlbiBjaGVja2luZworCQkJCSAqIGF0IHN5c2NhbGwgZXhpdCB0aW1lIChBVURJVF9BVF9FWElUKS4gKi8KKyNkZWZpbmUgQVVESVRfREVWTUFKT1IJMTAwCisjZGVmaW5lIEFVRElUX0RFVk1JTk9SCTEwMQorI2RlZmluZSBBVURJVF9JTk9ERQkxMDIKKyNkZWZpbmUgQVVESVRfRVhJVAkxMDMKKyNkZWZpbmUgQVVESVRfU1VDQ0VTUyAgIDEwNAkvKiBleGl0ID49IDA7IHZhbHVlIGlnbm9yZWQgKi8KKyNkZWZpbmUgQVVESVRfV0FUQ0gJMTA1CisjZGVmaW5lIEFVRElUX1BFUk0JMTA2CisjZGVmaW5lIEFVRElUX0RJUgkxMDcKKyNkZWZpbmUgQVVESVRfRklMRVRZUEUJMTA4CisKKyNkZWZpbmUgQVVESVRfQVJHMCAgICAgIDIwMAorI2RlZmluZSBBVURJVF9BUkcxICAgICAgKEFVRElUX0FSRzArMSkKKyNkZWZpbmUgQVVESVRfQVJHMiAgICAgIChBVURJVF9BUkcwKzIpCisjZGVmaW5lIEFVRElUX0FSRzMgICAgICAoQVVESVRfQVJHMCszKQorCisjZGVmaW5lIEFVRElUX0ZJTFRFUktFWQkyMTAKKworI2RlZmluZSBBVURJVF9ORUdBVEUJCQkweDgwMDAwMDAwCisKKy8qIFRoZXNlIGFyZSB0aGUgc3VwcG9ydGVkIG9wZXJhdG9ycy4KKyAqCTQgIDIgIDEgIDgKKyAqCT0gID4gIDwgID8KKyAqCS0tLS0tLS0tLS0KKyAqCTAgIDAgIDAJIDAJMDAJbm9uc2Vuc2UKKyAqCTAgIDAgIDAJIDEJMDgJJiAgYml0IG1hc2sKKyAqCTAgIDAgIDEJIDAJMTAJPAorICoJMCAgMSAgMAkgMAkyMAk+CisgKgkwICAxICAxCSAwCTMwCSE9CisgKgkxICAwICAwCSAwCTQwCT0KKyAqCTEgIDAgIDAJIDEJNDgJJj0gIGJpdCB0ZXN0CisgKgkxICAwICAxCSAwCTUwCTw9CisgKgkxICAxICAwCSAwCTYwCT49CisgKgkxICAxICAxCSAxCTc4CWFsbCBvcGVyYXRvcnMKKyAqLworI2RlZmluZSBBVURJVF9CSVRfTUFTSwkJCTB4MDgwMDAwMDAKKyNkZWZpbmUgQVVESVRfTEVTU19USEFOCQkJMHgxMDAwMDAwMAorI2RlZmluZSBBVURJVF9HUkVBVEVSX1RIQU4JCTB4MjAwMDAwMDAKKyNkZWZpbmUgQVVESVRfTk9UX0VRVUFMCQkJMHgzMDAwMDAwMAorI2RlZmluZSBBVURJVF9FUVVBTAkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgQVVESVRfQklUX1RFU1QJCQkoQVVESVRfQklUX01BU0t8QVVESVRfRVFVQUwpCisjZGVmaW5lIEFVRElUX0xFU1NfVEhBTl9PUl9FUVVBTAkoQVVESVRfTEVTU19USEFOfEFVRElUX0VRVUFMKQorI2RlZmluZSBBVURJVF9HUkVBVEVSX1RIQU5fT1JfRVFVQUwJKEFVRElUX0dSRUFURVJfVEhBTnxBVURJVF9FUVVBTCkKKyNkZWZpbmUgQVVESVRfT1BFUkFUT1JTCQkJKEFVRElUX0VRVUFMfEFVRElUX05PVF9FUVVBTHxBVURJVF9CSVRfTUFTSykKKworZW51bSB7CisJQXVkaXRfZXF1YWwsCisJQXVkaXRfbm90X2VxdWFsLAorCUF1ZGl0X2JpdG1hc2ssCisJQXVkaXRfYml0dGVzdCwKKwlBdWRpdF9sdCwKKwlBdWRpdF9ndCwKKwlBdWRpdF9sZSwKKwlBdWRpdF9nZSwKKwlBdWRpdF9iYWQKK307CisKKy8qIFN0YXR1cyBzeW1ib2xzICovCisJCQkJLyogTWFzayB2YWx1ZXMgKi8KKyNkZWZpbmUgQVVESVRfU1RBVFVTX0VOQUJMRUQJCTB4MDAwMQorI2RlZmluZSBBVURJVF9TVEFUVVNfRkFJTFVSRQkJMHgwMDAyCisjZGVmaW5lIEFVRElUX1NUQVRVU19QSUQJCTB4MDAwNAorI2RlZmluZSBBVURJVF9TVEFUVVNfUkFURV9MSU1JVAkJMHgwMDA4CisjZGVmaW5lIEFVRElUX1NUQVRVU19CQUNLTE9HX0xJTUlUCTB4MDAxMAorCQkJCS8qIEZhaWx1cmUtdG8tbG9nIGFjdGlvbnMgKi8KKyNkZWZpbmUgQVVESVRfRkFJTF9TSUxFTlQJMAorI2RlZmluZSBBVURJVF9GQUlMX1BSSU5USwkxCisjZGVmaW5lIEFVRElUX0ZBSUxfUEFOSUMJMgorCisvKiBkaXN0aW5ndWlzaCBzeXNjYWxsIHRhYmxlcyAqLworI2RlZmluZSBfX0FVRElUX0FSQ0hfNjRCSVQgMHg4MDAwMDAwMAorI2RlZmluZSBfX0FVRElUX0FSQ0hfTEUJICAgMHg0MDAwMDAwMAorI2RlZmluZSBBVURJVF9BUkNIX0FMUEhBCShFTV9BTFBIQXxfX0FVRElUX0FSQ0hfNjRCSVR8X19BVURJVF9BUkNIX0xFKQorI2RlZmluZSBBVURJVF9BUkNIX0FSTQkJKEVNX0FSTXxfX0FVRElUX0FSQ0hfTEUpCisjZGVmaW5lIEFVRElUX0FSQ0hfQVJNRUIJKEVNX0FSTSkKKyNkZWZpbmUgQVVESVRfQVJDSF9DUklTCQkoRU1fQ1JJU3xfX0FVRElUX0FSQ0hfTEUpCisjZGVmaW5lIEFVRElUX0FSQ0hfRlJWCQkoRU1fRlJWKQorI2RlZmluZSBBVURJVF9BUkNIX0g4MzAwCShFTV9IOF8zMDApCisjZGVmaW5lIEFVRElUX0FSQ0hfSTM4NgkJKEVNXzM4NnxfX0FVRElUX0FSQ0hfTEUpCisjZGVmaW5lIEFVRElUX0FSQ0hfSUE2NAkJKEVNX0lBXzY0fF9fQVVESVRfQVJDSF82NEJJVHxfX0FVRElUX0FSQ0hfTEUpCisjZGVmaW5lIEFVRElUX0FSQ0hfTTMyUgkJKEVNX00zMlIpCisjZGVmaW5lIEFVRElUX0FSQ0hfTTY4SwkJKEVNXzY4SykKKyNkZWZpbmUgQVVESVRfQVJDSF9NSVBTCQkoRU1fTUlQUykKKyNkZWZpbmUgQVVESVRfQVJDSF9NSVBTRUwJKEVNX01JUFN8X19BVURJVF9BUkNIX0xFKQorI2RlZmluZSBBVURJVF9BUkNIX01JUFM2NAkoRU1fTUlQU3xfX0FVRElUX0FSQ0hfNjRCSVQpCisjZGVmaW5lIEFVRElUX0FSQ0hfTUlQU0VMNjQJKEVNX01JUFN8X19BVURJVF9BUkNIXzY0QklUfF9fQVVESVRfQVJDSF9MRSkKKyNkZWZpbmUgQVVESVRfQVJDSF9QQVJJU0MJKEVNX1BBUklTQykKKyNkZWZpbmUgQVVESVRfQVJDSF9QQVJJU0M2NAkoRU1fUEFSSVNDfF9fQVVESVRfQVJDSF82NEJJVCkKKyNkZWZpbmUgQVVESVRfQVJDSF9QUEMJCShFTV9QUEMpCisjZGVmaW5lIEFVRElUX0FSQ0hfUFBDNjQJKEVNX1BQQzY0fF9fQVVESVRfQVJDSF82NEJJVCkKKyNkZWZpbmUgQVVESVRfQVJDSF9TMzkwCQkoRU1fUzM5MCkKKyNkZWZpbmUgQVVESVRfQVJDSF9TMzkwWAkoRU1fUzM5MHxfX0FVRElUX0FSQ0hfNjRCSVQpCisjZGVmaW5lIEFVRElUX0FSQ0hfU0gJCShFTV9TSCkKKyNkZWZpbmUgQVVESVRfQVJDSF9TSEVMCQkoRU1fU0h8X19BVURJVF9BUkNIX0xFKQorI2RlZmluZSBBVURJVF9BUkNIX1NINjQJCShFTV9TSHxfX0FVRElUX0FSQ0hfNjRCSVQpCisjZGVmaW5lIEFVRElUX0FSQ0hfU0hFTDY0CShFTV9TSHxfX0FVRElUX0FSQ0hfNjRCSVR8X19BVURJVF9BUkNIX0xFKQorI2RlZmluZSBBVURJVF9BUkNIX1NQQVJDCShFTV9TUEFSQykKKyNkZWZpbmUgQVVESVRfQVJDSF9TUEFSQzY0CShFTV9TUEFSQ1Y5fF9fQVVESVRfQVJDSF82NEJJVCkKKyNkZWZpbmUgQVVESVRfQVJDSF9YODZfNjQJKEVNX1g4Nl82NHxfX0FVRElUX0FSQ0hfNjRCSVR8X19BVURJVF9BUkNIX0xFKQorCisjZGVmaW5lIEFVRElUX1BFUk1fRVhFQwkJMQorI2RlZmluZSBBVURJVF9QRVJNX1dSSVRFCTIKKyNkZWZpbmUgQVVESVRfUEVSTV9SRUFECQk0CisjZGVmaW5lIEFVRElUX1BFUk1fQVRUUgkJOAorCitzdHJ1Y3QgYXVkaXRfc3RhdHVzIHsKKwlfX3UzMgkJbWFzazsJCS8qIEJpdCBtYXNrIGZvciB2YWxpZCBlbnRyaWVzICovCisJX191MzIJCWVuYWJsZWQ7CS8qIDEgPSBlbmFibGVkLCAwID0gZGlzYWJsZWQgKi8KKwlfX3UzMgkJZmFpbHVyZTsJLyogRmFpbHVyZS10by1sb2cgYWN0aW9uICovCisJX191MzIJCXBpZDsJCS8qIHBpZCBvZiBhdWRpdGQgcHJvY2VzcyAqLworCV9fdTMyCQlyYXRlX2xpbWl0OwkvKiBtZXNzYWdlcyByYXRlIGxpbWl0IChwZXIgc2Vjb25kKSAqLworCV9fdTMyCQliYWNrbG9nX2xpbWl0OwkvKiB3YWl0aW5nIG1lc3NhZ2VzIGxpbWl0ICovCisJX191MzIJCWxvc3Q7CQkvKiBtZXNzYWdlcyBsb3N0ICovCisJX191MzIJCWJhY2tsb2c7CS8qIG1lc3NhZ2VzIHdhaXRpbmcgaW4gcXVldWUgKi8KK307CisKK3N0cnVjdCBhdWRpdF90dHlfc3RhdHVzIHsKKwlfX3UzMgkJZW5hYmxlZDsgLyogMSA9IGVuYWJsZWQsIDAgPSBkaXNhYmxlZCAqLworfTsKKworLyogYXVkaXRfcnVsZV9kYXRhIHN1cHBvcnRzIGZpbHRlciBydWxlcyB3aXRoIGJvdGggaW50ZWdlciBhbmQgc3RyaW5nCisgKiBmaWVsZHMuICBJdCBjb3JyZXNwb25kcyB3aXRoIEFVRElUX0FERF9SVUxFLCBBVURJVF9ERUxfUlVMRSBhbmQKKyAqIEFVRElUX0xJU1RfUlVMRVMgcmVxdWVzdHMuCisgKi8KK3N0cnVjdCBhdWRpdF9ydWxlX2RhdGEgeworCV9fdTMyCQlmbGFnczsJLyogQVVESVRfUEVSX3tUQVNLLENBTEx9LCBBVURJVF9QUkVQRU5EICovCisJX191MzIJCWFjdGlvbjsJLyogQVVESVRfTkVWRVIsIEFVRElUX1BPU1NJQkxFLCBBVURJVF9BTFdBWVMgKi8KKwlfX3UzMgkJZmllbGRfY291bnQ7CisJX191MzIJCW1hc2tbQVVESVRfQklUTUFTS19TSVpFXTsgLyogc3lzY2FsbChzKSBhZmZlY3RlZCAqLworCV9fdTMyCQlmaWVsZHNbQVVESVRfTUFYX0ZJRUxEU107CisJX191MzIJCXZhbHVlc1tBVURJVF9NQVhfRklFTERTXTsKKwlfX3UzMgkJZmllbGRmbGFnc1tBVURJVF9NQVhfRklFTERTXTsKKwlfX3UzMgkJYnVmbGVuOwkvKiB0b3RhbCBsZW5ndGggb2Ygc3RyaW5nIGZpZWxkcyAqLworCWNoYXIJCWJ1ZlswXTsJLyogc3RyaW5nIGZpZWxkcyBidWZmZXIgKi8KK307CisKKy8qIGF1ZGl0X3J1bGUgaXMgc3VwcG9ydGVkIHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aAorICogdXNlcnNwYWNlLiAgSXQgc3VwcG9ydHMgaW50ZWdlciBmaWVsZHMgb25seSBhbmQgY29ycmVzcG9uZHMgdG8KKyAqIEFVRElUX0FERCwgQVVESVRfREVMIGFuZCBBVURJVF9MSVNUIHJlcXVlc3RzLgorICovCitzdHJ1Y3QgYXVkaXRfcnVsZSB7CQkvKiBmb3IgQVVESVRfTElTVCwgQVVESVRfQURELCBhbmQgQVVESVRfREVMICovCisJX191MzIJCWZsYWdzOwkvKiBBVURJVF9QRVJfe1RBU0ssQ0FMTH0sIEFVRElUX1BSRVBFTkQgKi8KKwlfX3UzMgkJYWN0aW9uOwkvKiBBVURJVF9ORVZFUiwgQVVESVRfUE9TU0lCTEUsIEFVRElUX0FMV0FZUyAqLworCV9fdTMyCQlmaWVsZF9jb3VudDsKKwlfX3UzMgkJbWFza1tBVURJVF9CSVRNQVNLX1NJWkVdOworCV9fdTMyCQlmaWVsZHNbQVVESVRfTUFYX0ZJRUxEU107CisJX191MzIJCXZhbHVlc1tBVURJVF9NQVhfRklFTERTXTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdWZzX3R5cGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXVmc190eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDliNDliYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXVmc190eXBlLmgKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMiBKdW5qaXJvIFIuIE9rYWppbWEKKyAqCisgKiBUaGlzIHByb2dyYW0sIGF1ZnMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgX19BVUZTX1RZUEVfSF9fCisjZGVmaW5lIF9fQVVGU19UWVBFX0hfXworCisjZGVmaW5lIEFVRlNfTkFNRQkiYXVmcyIKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CisKKyNkZWZpbmUgQVVGU19WRVJTSU9OCSIzLjItMjAxMjAxMDkiCisKKy8qIHRvZG8/IG1vdmUgdGhpcyB0byBsaW51eC0yLjYuMTkvaW5jbHVkZS9tYWdpYy5oICovCisjZGVmaW5lIEFVRlNfU1VQRVJfTUFHSUMJKCdhJyA8PCAyNCB8ICd1JyA8PCAxNiB8ICdmJyA8PCA4IHwgJ3MnKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBDT05GSUdfQVVGU19CUkFOQ0hfTUFYXzEyNwordHlwZWRlZiBpbnQ4X3QgYXVmc19iaW5kZXhfdDsKKyNkZWZpbmUgQVVGU19CUkFOQ0hfTUFYIDEyNworI2Vsc2UKK3R5cGVkZWYgaW50MTZfdCBhdWZzX2JpbmRleF90OworI2lmZGVmIENPTkZJR19BVUZTX0JSQU5DSF9NQVhfNTExCisjZGVmaW5lIEFVRlNfQlJBTkNIX01BWCA1MTEKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FVRlNfQlJBTkNIX01BWF8xMDIzKQorI2RlZmluZSBBVUZTX0JSQU5DSF9NQVggMTAyMworI2VsaWYgZGVmaW5lZChDT05GSUdfQVVGU19CUkFOQ0hfTUFYXzMyNzY3KQorI2RlZmluZSBBVUZTX0JSQU5DSF9NQVggMzI3NjcKKyNlbmRpZgorI2VuZGlmCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEFVRlNfRlNUWVBFCQlBVUZTX05BTUUKKworI2RlZmluZSBBVUZTX1JPT1RfSU5PCQkyCisjZGVmaW5lIEFVRlNfRklSU1RfSU5PCQkxMQorCisjZGVmaW5lIEFVRlNfV0hfUEZYCQkiLndoLiIKKyNkZWZpbmUgQVVGU19XSF9QRlhfTEVOCQkoKGludClzaXplb2YoQVVGU19XSF9QRlgpIC0gMSkKKyNkZWZpbmUgQVVGU19XSF9UTVBfTEVOCQk0CisvKiBhIGxpbWl0IGZvciBybWRpci9yZW5hbWUgYSBkaXIgKi8KKyNkZWZpbmUgQVVGU19NQVhfTkFNRUxFTgkoTkFNRV9NQVggXAorCQkJCS0gQVVGU19XSF9QRlhfTEVOICogMgkvKiBkb3VibHkgd2hpdGVvdXRlZCAqL1wKKwkJCQktIDEJCQkvKiBkb3QgKi9cCisJCQkJLSBBVUZTX1dIX1RNUF9MRU4pCS8qIGhleCAqLworI2RlZmluZSBBVUZTX1hJTk9fRk5BTUUJCSIuIiBBVUZTX05BTUUgIi54aW5vIgorI2RlZmluZSBBVUZTX1hJTk9fREVGUEFUSAkiL3RtcC8iIEFVRlNfWElOT19GTkFNRQorI2RlZmluZSBBVUZTX1hJTk9fVFJVTkNfSU5JVAk2NCAvKiBibG9ja3MgKi8KKyNkZWZpbmUgQVVGU19YSU5PX1RSVU5DX1NURVAJNCAgLyogYmxvY2tzICovCisjZGVmaW5lIEFVRlNfRElSV0hfREVGCQkzCisjZGVmaW5lIEFVRlNfUkRDQUNIRV9ERUYJMTAgLyogc2Vjb25kcyAqLworI2RlZmluZSBBVUZTX1JEQ0FDSEVfTUFYCTM2MDAgLyogc2Vjb25kcyAqLworI2RlZmluZSBBVUZTX1JEQkxLX0RFRgkJNTEyIC8qIGJ5dGVzICovCisjZGVmaW5lIEFVRlNfUkRIQVNIX0RFRgkJMzIKKyNkZWZpbmUgQVVGU19XS1FfTkFNRQkJQVVGU19OQU1FICJkIgorI2RlZmluZSBBVUZTX01GU19ERUZfU0VDCTMwIC8qIHNlY29uZHMgKi8KKyNkZWZpbmUgQVVGU19NRlNfTUFYX1NFQwkzNjAwIC8qIHNlY29uZHMgKi8KKyNkZWZpbmUgQVVGU19QTElOS19XQVJOCQkxMDAgLyogbnVtYmVyIG9mIHBsaW5rcyAqLworCisvKiBwc2V1ZG8tbGluayBtYWludGVuYWNlIHVuZGVyIC9wcm9jICovCisjZGVmaW5lIEFVRlNfUExJTktfTUFJTlRfTkFNRQkicGxpbmtfbWFpbnQiCisjZGVmaW5lIEFVRlNfUExJTktfTUFJTlRfRElSCSJmcy8iIEFVRlNfTkFNRQorI2RlZmluZSBBVUZTX1BMSU5LX01BSU5UX1BBVEgJQVVGU19QTElOS19NQUlOVF9ESVIgIi8iIEFVRlNfUExJTktfTUFJTlRfTkFNRQorCisjZGVmaW5lIEFVRlNfRElST1BRX05BTUUJQVVGU19XSF9QRlggIi5vcHEiIC8qIHdoaXRlb3V0ZWQgZG91Ymx5ICovCisjZGVmaW5lIEFVRlNfV0hfRElST1BRCQlBVUZTX1dIX1BGWCBBVUZTX0RJUk9QUV9OQU1FCisKKyNkZWZpbmUgQVVGU19CQVNFX05BTUUJCUFVRlNfV0hfUEZYIEFVRlNfTkFNRQorI2RlZmluZSBBVUZTX1BMSU5LRElSX05BTUUJQVVGU19XSF9QRlggInBsbmsiCisjZGVmaW5lIEFVRlNfT1JQSERJUl9OQU1FCUFVRlNfV0hfUEZYICJvcnBoIgorCisvKiBkb3VibHkgd2hpdGVvdXRlZCAqLworI2RlZmluZSBBVUZTX1dIX0JBU0UJCUFVRlNfV0hfUEZYIEFVRlNfQkFTRV9OQU1FCisjZGVmaW5lIEFVRlNfV0hfUExJTktESVIJQVVGU19XSF9QRlggQVVGU19QTElOS0RJUl9OQU1FCisjZGVmaW5lIEFVRlNfV0hfT1JQSERJUgkJQVVGU19XSF9QRlggQVVGU19PUlBIRElSX05BTUUKKworLyogYnJhbmNoIHBlcm1pc3Npb25zIGFuZCBhdHRyaWJ1dGVzICovCisjZGVmaW5lIEFVRlNfQlJQRVJNX1JXCQkicnciCisjZGVmaW5lIEFVRlNfQlJQRVJNX1JPCQkicm8iCisjZGVmaW5lIEFVRlNfQlJQRVJNX1JSCQkicnIiCisjZGVmaW5lIEFVRlNfQlJSQVRUUl9XSAkJIndoIgorI2RlZmluZSBBVUZTX0JSV0FUVFJfTkxXSAkibm9sd2giCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogaW9jdGwgKi8KK2VudW0geworCS8qIHJlYWRkaXIgaW4gdXNlcnNwYWNlICovCisJQXVDdGxfUkRVLAorCUF1Q3RsX1JEVV9JTk8sCisKKwkvKiBwYXRoY29uZiB3cmFwcGVyICovCisJQXVDdGxfV0JSX0ZELAorCisJLyogYnVzeSBpbm9kZSAqLworCUF1Q3RsX0lCVVNZCit9OworCisvKiBib3Jyb3dlZCBmcm9tIGxpbnV4L2luY2x1ZGUvbGludXgva2VybmVsLmggKi8KKyNpZm5kZWYgQUxJR04KKyNkZWZpbmUgQUxJR04oeCwgYSkJCV9fQUxJR05fTUFTSyh4LCAodHlwZW9mKHgpKShhKS0xKQorI2RlZmluZSBfX0FMSUdOX01BU0soeCwgbWFzaykJKCgoeCkrKG1hc2spKSZ+KG1hc2spKQorI2VuZGlmCisKKy8qIGJvcnJvd2VkIGZyb20gbGludXgvaW5jbHVkZS9saW51eC9jb21waWxlci1nY2MzLmggKi8KKyNpZm5kZWYgX19hbGlnbmVkCisjZGVmaW5lIF9fYWxpZ25lZCh4KQkJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoeCkpKQorI2VuZGlmCisKKworc3RydWN0IGF1X3JkdV9jb29raWUgeworCXVpbnQ2NF90CWhfcG9zOworCWludDE2X3QJCWJpbmRleDsKKwl1aW50OF90CQlmbGFnczsKKwl1aW50OF90CQlwYWQ7CisJdWludDMyX3QJZ2VuZXJhdGlvbjsKK30gX19hbGlnbmVkKDgpOworCitzdHJ1Y3QgYXVfcmR1X2VudCB7CisJdWludDY0X3QJaW5vOworCWludDE2X3QJCWJpbmRleDsKKwl1aW50OF90CQl0eXBlOworCXVpbnQ4X3QJCW5sZW47CisJdWludDhfdAkJd2g7CisJY2hhcgkJbmFtZVswXTsKK30gX19hbGlnbmVkKDgpOworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgYXVfcmR1X2xlbihpbnQgbmxlbikKK3sKKwkvKiBpbmNsdWRlIHRoZSB0ZXJtaW5hdGluZyBOVUxMICovCisJcmV0dXJuIEFMSUdOKHNpemVvZihzdHJ1Y3QgYXVfcmR1X2VudCkgKyBubGVuICsgMSwKKwkJICAgICBzaXplb2YodWludDY0X3QpKTsKK30KKwordW5pb24gYXVfcmR1X2VudF91bCB7CisJc3RydWN0IGF1X3JkdV9lbnQgKmU7CisJdWludDY0X3QJCQl1bDsKK307CisKK2VudW0geworCUF1ZnNDdGxSZHVWX1NaLAorCUF1ZnNDdGxSZHVWX0VuZAorfTsKKworc3RydWN0IGF1ZnNfcmR1IHsKKwkvKiBpbnB1dCAqLworCXVuaW9uIHsKKwkJdWludDY0X3QJc3o7CS8qIEF1Q3RsX1JEVSAqLworCQl1aW50NjRfdAluZW50OwkvKiBBdUN0bF9SRFVfSU5PICovCisJfTsKKwl1bmlvbiBhdV9yZHVfZW50X3VsCWVudDsKKwl1aW50MTZfdAkJdmVyaWZ5W0F1ZnNDdGxSZHVWX0VuZF07CisKKwkvKiBpbnB1dC9vdXRwdXQgKi8KKwl1aW50MzJfdAkJYmxrOworCisJLyogb3V0cHV0ICovCisJdW5pb24gYXVfcmR1X2VudF91bAl0YWlsOworCS8qIG51bWJlciBvZiBlbnRyaWVzIHdoaWNoIHdlcmUgYWRkZWQgaW4gYSBzaW5nbGUgY2FsbCAqLworCXVpbnQ2NF90CQlyZW50OworCXVpbnQ4X3QJCQlmdWxsOworCXVpbnQ4X3QJCQlzaHdoOworCisJc3RydWN0IGF1X3JkdV9jb29raWUJY29va2llOworfSBfX2FsaWduZWQoOCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGF1ZnNfd2JyX2ZkIHsKKwl1aW50MzJfdAlvZmxhZ3M7CisJaW50MTZfdAkJYnJpZDsKK30gX19hbGlnbmVkKDgpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBhdWZzX2lidXN5IHsKKwl1aW50NjRfdAlpbm8sIGhfaW5vOworCWludDE2X3QJCWJpbmRleDsKK30gX19hbGlnbmVkKDgpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQXVDdGxUeXBlCQknQScKKyNkZWZpbmUgQVVGU19DVExfUkRVCQlfSU9XUihBdUN0bFR5cGUsIEF1Q3RsX1JEVSwgc3RydWN0IGF1ZnNfcmR1KQorI2RlZmluZSBBVUZTX0NUTF9SRFVfSU5PCV9JT1dSKEF1Q3RsVHlwZSwgQXVDdGxfUkRVX0lOTywgc3RydWN0IGF1ZnNfcmR1KQorI2RlZmluZSBBVUZTX0NUTF9XQlJfRkQJCV9JT1coQXVDdGxUeXBlLCBBdUN0bF9XQlJfRkQsIFwKKwkJCQkgICAgIHN0cnVjdCBhdWZzX3dicl9mZCkKKyNkZWZpbmUgQVVGU19DVExfSUJVU1kJCV9JT1dSKEF1Q3RsVHlwZSwgQXVDdGxfSUJVU1ksIHN0cnVjdCBhdWZzX2lidXN5KQorCisjZW5kaWYgLyogX19BVUZTX1RZUEVfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F1dG9fZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXV0b19mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZjg2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F1dG9fZnMuaApAQCAtMCwwICsxLDgwIEBACisvKiAtKi0gbGludXgtYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKiAgIAorICogbGludXgvaW5jbHVkZS9saW51eC9hdXRvX2ZzLmgKKyAqCisgKiAgIENvcHlyaWdodCAxOTk3IFRyYW5zbWV0YSBDb3Jwb3JhdGlvbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKyNpZm5kZWYgX0xJTlVYX0FVVE9fRlNfSAorI2RlZmluZSBfTElOVVhfQVVUT19GU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisvKiBUaGlzIGZpbGUgZGVzY3JpYmVzIGF1dG9mcyB2MyAqLworI2RlZmluZSBBVVRPRlNfUFJPVE9fVkVSU0lPTgkzCisKKy8qIFJhbmdlIG9mIHByb3RvY29sIHZlcnNpb25zIGRlZmluZWQgKi8KKyNkZWZpbmUgQVVUT0ZTX01BWF9QUk9UT19WRVJTSU9OCUFVVE9GU19QUk9UT19WRVJTSU9OCisjZGVmaW5lIEFVVE9GU19NSU5fUFJPVE9fVkVSU0lPTglBVVRPRlNfUFJPVE9fVkVSU0lPTgorCisvKgorICogQXJjaGl0ZWN0dXJlcyB3aGVyZSBib3RoIDMyLSBhbmQgNjQtYml0IGJpbmFyaWVzIGNhbiBiZSBleGVjdXRlZAorICogb24gNjQtYml0IGtlcm5lbHMgbmVlZCB0aGlzLiAgVGhpcyBrZWVwcyB0aGUgc3RydWN0dXJlIGZvcm1hdAorICogdW5pZm9ybSwgYW5kIG1ha2VzIHN1cmUgdGhlIHdhaXRfcXVldWVfdG9rZW4gaXNuJ3QgdG9vIGJpZyB0byBiZQorICogcGFzc2VkIGJhY2sgZG93biB0byB0aGUga2VybmVsLgorICoKKyAqIFRoaXMgYXNzdW1lcyB0aGF0IG9uIHRoZXNlIGFyY2hpdGVjdHVyZXM6CisgKiBtb2RlICAgICAzMiBiaXQgICAgNjQgYml0CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBpbnQgICAgICAzMiBiaXQgICAgMzIgYml0CisgKiBsb25nICAgICAzMiBiaXQgICAgNjQgYml0CisgKgorICogSWYgc28sIDMyLWJpdCB1c2VyLXNwYWNlIGNvZGUgc2hvdWxkIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlLgorICovCisKKyNpZiBkZWZpbmVkKF9fc3BhcmNfXykgfHwgZGVmaW5lZChfX21pcHNfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSBcCisgfHwgZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgZGVmaW5lZChfX3MzOTBfXykKK3R5cGVkZWYgdW5zaWduZWQgaW50IGF1dG9mc193cXRfdDsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgYXV0b2ZzX3dxdF90OworI2VuZGlmCisKKy8qIFBhY2tldCB0eXBlcyAqLworI2RlZmluZSBhdXRvZnNfcHR5cGVfbWlzc2luZwkwCS8qIE1pc3NpbmcgZW50cnkgKG1vdW50IHJlcXVlc3QpICovCisjZGVmaW5lIGF1dG9mc19wdHlwZV9leHBpcmUJMQkvKiBFeHBpcmUgZW50cnkgKHVtb3VudCByZXF1ZXN0KSAqLworCitzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9oZHIgeworCWludCBwcm90b192ZXJzaW9uOwkJLyogUHJvdG9jb2wgdmVyc2lvbiAqLworCWludCB0eXBlOwkJCS8qIFR5cGUgb2YgcGFja2V0ICovCit9OworCitzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9taXNzaW5nIHsKKwlzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9oZHIgaGRyOworICAgICAgICBhdXRvZnNfd3F0X3Qgd2FpdF9xdWV1ZV90b2tlbjsKKwlpbnQgbGVuOworCWNoYXIgbmFtZVtOQU1FX01BWCsxXTsKK307CQorCisvKiB2MyBleHBpcmUgKHZpYSBpb2N0bCkgKi8KK3N0cnVjdCBhdXRvZnNfcGFja2V0X2V4cGlyZSB7CisJc3RydWN0IGF1dG9mc19wYWNrZXRfaGRyIGhkcjsKKwlpbnQgbGVuOworCWNoYXIgbmFtZVtOQU1FX01BWCsxXTsKK307CisKKyNkZWZpbmUgQVVUT0ZTX0lPQ19SRUFEWSAgICAgIF9JTygweDkzLDB4NjApCisjZGVmaW5lIEFVVE9GU19JT0NfRkFJTCAgICAgICBfSU8oMHg5MywweDYxKQorI2RlZmluZSBBVVRPRlNfSU9DX0NBVEFUT05JQyAgX0lPKDB4OTMsMHg2MikKKyNkZWZpbmUgQVVUT0ZTX0lPQ19QUk9UT1ZFUiAgIF9JT1IoMHg5MywweDYzLGludCkKKyNkZWZpbmUgQVVUT0ZTX0lPQ19TRVRUSU1FT1VUMzIgX0lPV1IoMHg5MywweDY0LGNvbXBhdF91bG9uZ190KQorI2RlZmluZSBBVVRPRlNfSU9DX1NFVFRJTUVPVVQgX0lPV1IoMHg5MywweDY0LHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIEFVVE9GU19JT0NfRVhQSVJFICAgICBfSU9SKDB4OTMsMHg2NSxzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9leHBpcmUpCisKKyNlbmRpZiAvKiBfTElOVVhfQVVUT19GU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F1dG9fZnM0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F1dG9fZnM0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc0YWE3NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXV0b19mczQuaApAQCAtMCwwICsxLDE2NCBAQAorLyogLSotIGMgLSotCisgKiBsaW51eC9pbmNsdWRlL2xpbnV4L2F1dG9fZnM0LmgKKyAqCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAwIEplcmVteSBGaXR6aGFyZGluZ2UgPGplcmVteUBnb29wLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9BVVRPX0ZTNF9ICisjZGVmaW5lIF9MSU5VWF9BVVRPX0ZTNF9ICisKKy8qIEluY2x1ZGUgY29tbW9uIHYzIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdXRvX2ZzLmg+CisKKy8qIGF1dG9mcyB2NCBkZWZpbml0aW9ucyAqLworI3VuZGVmIEFVVE9GU19QUk9UT19WRVJTSU9OCisjdW5kZWYgQVVUT0ZTX01JTl9QUk9UT19WRVJTSU9OCisjdW5kZWYgQVVUT0ZTX01BWF9QUk9UT19WRVJTSU9OCisKKyNkZWZpbmUgQVVUT0ZTX1BST1RPX1ZFUlNJT04JCTUKKyNkZWZpbmUgQVVUT0ZTX01JTl9QUk9UT19WRVJTSU9OCTMKKyNkZWZpbmUgQVVUT0ZTX01BWF9QUk9UT19WRVJTSU9OCTUKKworI2RlZmluZSBBVVRPRlNfUFJPVE9fU1VCVkVSU0lPTgkJMgorCisvKiBNYXNrIGZvciBleHBpcmUgYmVoYXZpb3VyICovCisjZGVmaW5lIEFVVE9GU19FWFBfSU1NRURJQVRFCQkxCisjZGVmaW5lIEFVVE9GU19FWFBfTEVBVkVTCQkyCisKKyNkZWZpbmUgQVVUT0ZTX1RZUEVfQU5ZCQkJMFUKKyNkZWZpbmUgQVVUT0ZTX1RZUEVfSU5ESVJFQ1QJCTFVCisjZGVmaW5lIEFVVE9GU19UWVBFX0RJUkVDVAkJMlUKKyNkZWZpbmUgQVVUT0ZTX1RZUEVfT0ZGU0VUCQk0VQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNldF9hdXRvZnNfdHlwZV9pbmRpcmVjdCh1bnNpZ25lZCBpbnQgKnR5cGUpCit7CisJKnR5cGUgPSBBVVRPRlNfVFlQRV9JTkRJUkVDVDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBhdXRvZnNfdHlwZV9pbmRpcmVjdCh1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKHR5cGUgPT0gQVVUT0ZTX1RZUEVfSU5ESVJFQ1QpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNldF9hdXRvZnNfdHlwZV9kaXJlY3QodW5zaWduZWQgaW50ICp0eXBlKQoreworCSp0eXBlID0gQVVUT0ZTX1RZUEVfRElSRUNUOworCXJldHVybjsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IGF1dG9mc190eXBlX2RpcmVjdCh1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKHR5cGUgPT0gQVVUT0ZTX1RZUEVfRElSRUNUKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBzZXRfYXV0b2ZzX3R5cGVfb2Zmc2V0KHVuc2lnbmVkIGludCAqdHlwZSkKK3sKKwkqdHlwZSA9IEFVVE9GU19UWVBFX09GRlNFVDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBhdXRvZnNfdHlwZV9vZmZzZXQodW5zaWduZWQgaW50IHR5cGUpCit7CisJcmV0dXJuICh0eXBlID09IEFVVE9GU19UWVBFX09GRlNFVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBhdXRvZnNfdHlwZV90cmlnZ2VyKHVuc2lnbmVkIGludCB0eXBlKQoreworCXJldHVybiAodHlwZSA9PSBBVVRPRlNfVFlQRV9ESVJFQ1QgfHwgdHlwZSA9PSBBVVRPRlNfVFlQRV9PRkZTRVQpOworfQorCisvKgorICogVGhpcyBpc24ndCByZWFsbHkgYSB0eXBlIGFzIHdlIHVzZSBpdCB0byBzYXkgIm5vIHR5cGUgc2V0IiB0bworICogaW5kaWNhdGUgd2Ugd2FudCB0byBzZWFyY2ggZm9yICJhbnkiIG1vdW50IGluIHRoZQorICogYXV0b2ZzX2Rldl9pb2N0bF9pc21vdW50cG9pbnQoKSBkZXZpY2UgaW9jdGwgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgc2V0X2F1dG9mc190eXBlX2FueSh1bnNpZ25lZCBpbnQgKnR5cGUpCit7CisJKnR5cGUgPSBBVVRPRlNfVFlQRV9BTlk7CisJcmV0dXJuOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgYXV0b2ZzX3R5cGVfYW55KHVuc2lnbmVkIGludCB0eXBlKQoreworCXJldHVybiAodHlwZSA9PSBBVVRPRlNfVFlQRV9BTlkpOworfQorCisvKiBEYWVtb24gbm90aWZpY2F0aW9uIHBhY2tldCB0eXBlcyAqLworZW51bSBhdXRvZnNfbm90aWZ5IHsKKwlORllfTk9ORSwKKwlORllfTU9VTlQsCisJTkZZX0VYUElSRQorfTsKKworLyogS2VybmVsIHByb3RvY29sIHZlcnNpb24gNCBwYWNrZXQgdHlwZXMgKi8KKworLyogRXhwaXJlIGVudHJ5ICh1bW91bnQgcmVxdWVzdCkgKi8KKyNkZWZpbmUgYXV0b2ZzX3B0eXBlX2V4cGlyZV9tdWx0aQkyCisKKy8qIEtlcm5lbCBwcm90b2NvbCB2ZXJzaW9uIDUgcGFja2V0IHR5cGVzICovCisKKy8qIEluZGlyZWN0IG1vdW50IG1pc3NpbmcgYW5kIGV4cGlyZSByZXF1ZXN0cy4gKi8KKyNkZWZpbmUgYXV0b2ZzX3B0eXBlX21pc3NpbmdfaW5kaXJlY3QJMworI2RlZmluZSBhdXRvZnNfcHR5cGVfZXhwaXJlX2luZGlyZWN0CTQKKworLyogRGlyZWN0IG1vdW50IG1pc3NpbmcgYW5kIGV4cGlyZSByZXF1ZXN0cyAqLworI2RlZmluZSBhdXRvZnNfcHR5cGVfbWlzc2luZ19kaXJlY3QJNQorI2RlZmluZSBhdXRvZnNfcHR5cGVfZXhwaXJlX2RpcmVjdAk2CisKKy8qIHY0IG11bHRpIGV4cGlyZSAodmlhIHBpcGUpICovCitzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9leHBpcmVfbXVsdGkgeworCXN0cnVjdCBhdXRvZnNfcGFja2V0X2hkciBoZHI7CisgICAgICAgIGF1dG9mc193cXRfdCB3YWl0X3F1ZXVlX3Rva2VuOworCWludCBsZW47CisJY2hhciBuYW1lW05BTUVfTUFYKzFdOworfTsKKwordW5pb24gYXV0b2ZzX3BhY2tldF91bmlvbiB7CisJc3RydWN0IGF1dG9mc19wYWNrZXRfaGRyIGhkcjsKKwlzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9taXNzaW5nIG1pc3Npbmc7CisJc3RydWN0IGF1dG9mc19wYWNrZXRfZXhwaXJlIGV4cGlyZTsKKwlzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9leHBpcmVfbXVsdGkgZXhwaXJlX211bHRpOworfTsKKworLyogYXV0b2ZzIHY1IGNvbW1vbiBwYWNrZXQgc3RydWN0ICovCitzdHJ1Y3QgYXV0b2ZzX3Y1X3BhY2tldCB7CisJc3RydWN0IGF1dG9mc19wYWNrZXRfaGRyIGhkcjsKKwlhdXRvZnNfd3F0X3Qgd2FpdF9xdWV1ZV90b2tlbjsKKwlfX3UzMiBkZXY7CisJX191NjQgaW5vOworCV9fdTMyIHVpZDsKKwlfX3UzMiBnaWQ7CisJX191MzIgcGlkOworCV9fdTMyIHRnaWQ7CisJX191MzIgbGVuOworCWNoYXIgbmFtZVtOQU1FX01BWCsxXTsKK307CisKK3R5cGVkZWYgc3RydWN0IGF1dG9mc192NV9wYWNrZXQgYXV0b2ZzX3BhY2tldF9taXNzaW5nX2luZGlyZWN0X3Q7Cit0eXBlZGVmIHN0cnVjdCBhdXRvZnNfdjVfcGFja2V0IGF1dG9mc19wYWNrZXRfZXhwaXJlX2luZGlyZWN0X3Q7Cit0eXBlZGVmIHN0cnVjdCBhdXRvZnNfdjVfcGFja2V0IGF1dG9mc19wYWNrZXRfbWlzc2luZ19kaXJlY3RfdDsKK3R5cGVkZWYgc3RydWN0IGF1dG9mc192NV9wYWNrZXQgYXV0b2ZzX3BhY2tldF9leHBpcmVfZGlyZWN0X3Q7CisKK3VuaW9uIGF1dG9mc192NV9wYWNrZXRfdW5pb24geworCXN0cnVjdCBhdXRvZnNfcGFja2V0X2hkciBoZHI7CisJc3RydWN0IGF1dG9mc192NV9wYWNrZXQgdjVfcGFja2V0OworCWF1dG9mc19wYWNrZXRfbWlzc2luZ19pbmRpcmVjdF90IG1pc3NpbmdfaW5kaXJlY3Q7CisJYXV0b2ZzX3BhY2tldF9leHBpcmVfaW5kaXJlY3RfdCBleHBpcmVfaW5kaXJlY3Q7CisJYXV0b2ZzX3BhY2tldF9taXNzaW5nX2RpcmVjdF90IG1pc3NpbmdfZGlyZWN0OworCWF1dG9mc19wYWNrZXRfZXhwaXJlX2RpcmVjdF90IGV4cGlyZV9kaXJlY3Q7Cit9OworCisjZGVmaW5lIEFVVE9GU19JT0NfRVhQSVJFX01VTFRJCQlfSU9XKDB4OTMsMHg2NixpbnQpCisjZGVmaW5lIEFVVE9GU19JT0NfRVhQSVJFX0lORElSRUNUCUFVVE9GU19JT0NfRVhQSVJFX01VTFRJCisjZGVmaW5lIEFVVE9GU19JT0NfRVhQSVJFX0RJUkVDVAlBVVRPRlNfSU9DX0VYUElSRV9NVUxUSQorI2RlZmluZSBBVVRPRlNfSU9DX1BST1RPU1VCVkVSCQlfSU9SKDB4OTMsMHg2NyxpbnQpCisjZGVmaW5lIEFVVE9GU19JT0NfQVNLVU1PVU5UCQlfSU9SKDB4OTMsMHg3MCxpbnQpCisKKworI2VuZGlmIC8qIF9MSU5VWF9BVVRPX0ZTNF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F1eHZlYy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmQxM2NmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdXh2ZWMuaApAQCAtMCwwICsxLDM1IEBACisjaWZuZGVmIF9MSU5VWF9BVVhWRUNfSAorI2RlZmluZSBfTElOVVhfQVVYVkVDX0gKKworI2luY2x1ZGUgPGFzbS9hdXh2ZWMuaD4KKworLyogU3ltYm9saWMgdmFsdWVzIGZvciB0aGUgZW50cmllcyBpbiB0aGUgYXV4aWxpYXJ5IHRhYmxlCisgICBwdXQgb24gdGhlIGluaXRpYWwgc3RhY2sgKi8KKyNkZWZpbmUgQVRfTlVMTCAgIDAJLyogZW5kIG9mIHZlY3RvciAqLworI2RlZmluZSBBVF9JR05PUkUgMQkvKiBlbnRyeSBzaG91bGQgYmUgaWdub3JlZCAqLworI2RlZmluZSBBVF9FWEVDRkQgMgkvKiBmaWxlIGRlc2NyaXB0b3Igb2YgcHJvZ3JhbSAqLworI2RlZmluZSBBVF9QSERSICAgMwkvKiBwcm9ncmFtIGhlYWRlcnMgZm9yIHByb2dyYW0gKi8KKyNkZWZpbmUgQVRfUEhFTlQgIDQJLyogc2l6ZSBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeSAqLworI2RlZmluZSBBVF9QSE5VTSAgNQkvKiBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzICovCisjZGVmaW5lIEFUX1BBR0VTWiA2CS8qIHN5c3RlbSBwYWdlIHNpemUgKi8KKyNkZWZpbmUgQVRfQkFTRSAgIDcJLyogYmFzZSBhZGRyZXNzIG9mIGludGVycHJldGVyICovCisjZGVmaW5lIEFUX0ZMQUdTICA4CS8qIGZsYWdzICovCisjZGVmaW5lIEFUX0VOVFJZICA5CS8qIGVudHJ5IHBvaW50IG9mIHByb2dyYW0gKi8KKyNkZWZpbmUgQVRfTk9URUxGIDEwCS8qIHByb2dyYW0gaXMgbm90IEVMRiAqLworI2RlZmluZSBBVF9VSUQgICAgMTEJLyogcmVhbCB1aWQgKi8KKyNkZWZpbmUgQVRfRVVJRCAgIDEyCS8qIGVmZmVjdGl2ZSB1aWQgKi8KKyNkZWZpbmUgQVRfR0lEICAgIDEzCS8qIHJlYWwgZ2lkICovCisjZGVmaW5lIEFUX0VHSUQgICAxNAkvKiBlZmZlY3RpdmUgZ2lkICovCisjZGVmaW5lIEFUX1BMQVRGT1JNIDE1ICAvKiBzdHJpbmcgaWRlbnRpZnlpbmcgQ1BVIGZvciBvcHRpbWl6YXRpb25zICovCisjZGVmaW5lIEFUX0hXQ0FQICAxNiAgICAvKiBhcmNoIGRlcGVuZGVudCBoaW50cyBhdCBDUFUgY2FwYWJpbGl0aWVzICovCisjZGVmaW5lIEFUX0NMS1RDSyAxNwkvKiBmcmVxdWVuY3kgYXQgd2hpY2ggdGltZXMoKSBpbmNyZW1lbnRzICovCisvKiBBVF8qIHZhbHVlcyAxOCB0aHJvdWdoIDIyIGFyZSByZXNlcnZlZCAqLworI2RlZmluZSBBVF9TRUNVUkUgMjMgICAvKiBzZWN1cmUgbW9kZSBib29sZWFuICovCisjZGVmaW5lIEFUX0JBU0VfUExBVEZPUk0gMjQJLyogc3RyaW5nIGlkZW50aWZ5aW5nIHJlYWwgcGxhdGZvcm0sIG1heQorCQkJCSAqIGRpZmZlciBmcm9tIEFUX1BMQVRGT1JNLiAqLworI2RlZmluZSBBVF9SQU5ET00gMjUJLyogYWRkcmVzcyBvZiAxNiByYW5kb20gYnl0ZXMgKi8KKworI2RlZmluZSBBVF9FWEVDRk4gIDMxCS8qIGZpbGVuYW1lIG9mIHByb2dyYW0gKi8KKworCisjZW5kaWYgLyogX0xJTlVYX0FVWFZFQ19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F4MjUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXgyNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Yzg5YTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F4MjUuaApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIFRoZXNlIGFyZSB0aGUgcHVibGljIGVsZW1lbnRzIG9mIHRoZSBMaW51eCBrZXJuZWwgQVguMjUgY29kZS4gQSBzaW1pbGFyCisgKiBmaWxlIG5ldHJvbS5oIGV4aXN0cyBmb3IgdGhlIE5FVC9ST00gcHJvdG9jb2wuCisgKi8KKworI2lmbmRlZglBWDI1X0tFUk5FTF9ICisjZGVmaW5lCUFYMjVfS0VSTkVMX0gKKworI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorCisjZGVmaW5lIEFYMjVfTVRVCTI1NgorI2RlZmluZSBBWDI1X01BWF9ESUdJUyAgOAorCisjZGVmaW5lIEFYMjVfV0lORE9XCTEKKyNkZWZpbmUgQVgyNV9UMQkJMgorI2RlZmluZSBBWDI1X04yCQkzCisjZGVmaW5lIEFYMjVfVDMJCTQKKyNkZWZpbmUgQVgyNV9UMgkJNQorI2RlZmluZQlBWDI1X0JBQ0tPRkYJNgorI2RlZmluZQlBWDI1X0VYVFNFUQk3CisjZGVmaW5lCUFYMjVfUElESU5DTAk4CisjZGVmaW5lIEFYMjVfSURMRQk5CisjZGVmaW5lIEFYMjVfUEFDTEVOCTEwCisjZGVmaW5lIEFYMjVfSUFNRElHSQkxMgorCisjZGVmaW5lIEFYMjVfS0lMTAk5OQorCisjZGVmaW5lIFNJT0NBWDI1R0VUVUlECQkoU0lPQ1BST1RPUFJJVkFURSswKQorI2RlZmluZSBTSU9DQVgyNUFERFVJRAkJKFNJT0NQUk9UT1BSSVZBVEUrMSkKKyNkZWZpbmUgU0lPQ0FYMjVERUxVSUQJCShTSU9DUFJPVE9QUklWQVRFKzIpCisjZGVmaW5lIFNJT0NBWDI1Tk9VSUQJCShTSU9DUFJPVE9QUklWQVRFKzMpCisjZGVmaW5lIFNJT0NBWDI1T1BUUlQJCShTSU9DUFJPVE9QUklWQVRFKzcpCisjZGVmaW5lIFNJT0NBWDI1Q1RMQ09OCQkoU0lPQ1BST1RPUFJJVkFURSs4KQorI2RlZmluZSBTSU9DQVgyNUdFVElORk9PTEQJKFNJT0NQUk9UT1BSSVZBVEUrOSkKKyNkZWZpbmUgU0lPQ0FYMjVBRERGV0QJCShTSU9DUFJPVE9QUklWQVRFKzEwKQorI2RlZmluZSBTSU9DQVgyNURFTEZXRAkJKFNJT0NQUk9UT1BSSVZBVEUrMTEpCisjZGVmaW5lIFNJT0NBWDI1REVWQ1RMICAgICAgICAgIChTSU9DUFJPVE9QUklWQVRFKzEyKQorI2RlZmluZSBTSU9DQVgyNUdFVElORk8gICAgICAgICAoU0lPQ1BST1RPUFJJVkFURSsxMykKKworI2RlZmluZSBBWDI1X1NFVF9SVF9JUE1PREUJMgorCisjZGVmaW5lIEFYMjVfTk9VSURfREVGQVVMVAkwCisjZGVmaW5lIEFYMjVfTk9VSURfQkxPQ0sJMQorCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhcgkJYXgyNV9jYWxsWzddOwkvKiA2IGNhbGwgKyBTU0lEIChzaGlmdGVkIGFzY2lpISkgKi8KK30gYXgyNV9hZGRyZXNzOworCitzdHJ1Y3Qgc29ja2FkZHJfYXgyNSB7CisJX19rZXJuZWxfc2FfZmFtaWx5X3Qgc2F4MjVfZmFtaWx5OworCWF4MjVfYWRkcmVzcwlzYXgyNV9jYWxsOworCWludAkJc2F4MjVfbmRpZ2lzOworCS8qIERpZ2lwZWF0ZXIgYXgyNV9hZGRyZXNzIHNldHMgZm9sbG93ICovCit9OworCisjZGVmaW5lIHNheDI1X3VpZAlzYXgyNV9uZGlnaXMKKworc3RydWN0IGZ1bGxfc29ja2FkZHJfYXgyNSB7CisJc3RydWN0IHNvY2thZGRyX2F4MjUgZnNhX2F4MjU7CisJYXgyNV9hZGRyZXNzCWZzYV9kaWdpcGVhdGVyW0FYMjVfTUFYX0RJR0lTXTsKK307CisKK3N0cnVjdCBheDI1X3JvdXRlc19zdHJ1Y3QgeworCWF4MjVfYWRkcmVzcwlwb3J0X2FkZHI7CisJYXgyNV9hZGRyZXNzCWRlc3RfYWRkcjsKKwl1bnNpZ25lZCBjaGFyCWRpZ2lfY291bnQ7CisJYXgyNV9hZGRyZXNzCWRpZ2lfYWRkcltBWDI1X01BWF9ESUdJU107Cit9OworCitzdHJ1Y3QgYXgyNV9yb3V0ZV9vcHRfc3RydWN0IHsKKwlheDI1X2FkZHJlc3MJcG9ydF9hZGRyOworCWF4MjVfYWRkcmVzcwlkZXN0X2FkZHI7CisJaW50CQljbWQ7CisJaW50CQlhcmc7Cit9OworCitzdHJ1Y3QgYXgyNV9jdGxfc3RydWN0IHsKKyAgICAgICAgYXgyNV9hZGRyZXNzICAgICAgICAgICAgcG9ydF9hZGRyOworICAgICAgICBheDI1X2FkZHJlc3MgICAgICAgICAgICBzb3VyY2VfYWRkcjsKKyAgICAgICAgYXgyNV9hZGRyZXNzICAgICAgICAgICAgZGVzdF9hZGRyOworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBjbWQ7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGFyZzsKKyAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICAgICAgZGlnaV9jb3VudDsKKyAgICAgICAgYXgyNV9hZGRyZXNzICAgICAgICAgICAgZGlnaV9hZGRyW0FYMjVfTUFYX0RJR0lTXTsKK307CisKKy8qIHRoaXMgd2lsbCBnbyBhd2F5LiBQbGVhc2UgZG8gbm90IGV4cG9ydCB0byB1c2VyIGxhbmQgKi8KK3N0cnVjdCBheDI1X2luZm9fc3RydWN0X2RlcHJlY2F0ZWQgeworCXVuc2lnbmVkIGludAluMiwgbjJjb3VudDsKKwl1bnNpZ25lZCBpbnQJdDEsIHQxdGltZXI7CisJdW5zaWduZWQgaW50CXQyLCB0MnRpbWVyOworCXVuc2lnbmVkIGludAl0MywgdDN0aW1lcjsKKwl1bnNpZ25lZCBpbnQJaWRsZSwgaWRsZXRpbWVyOworCXVuc2lnbmVkIGludAlzdGF0ZTsKKwl1bnNpZ25lZCBpbnQJcmN2X3EsIHNuZF9xOworfTsKKworc3RydWN0IGF4MjVfaW5mb19zdHJ1Y3QgeworCXVuc2lnbmVkIGludAluMiwgbjJjb3VudDsKKwl1bnNpZ25lZCBpbnQJdDEsIHQxdGltZXI7CisJdW5zaWduZWQgaW50CXQyLCB0MnRpbWVyOworCXVuc2lnbmVkIGludAl0MywgdDN0aW1lcjsKKwl1bnNpZ25lZCBpbnQJaWRsZSwgaWRsZXRpbWVyOworCXVuc2lnbmVkIGludAlzdGF0ZTsKKwl1bnNpZ25lZCBpbnQJcmN2X3EsIHNuZF9xOworCXVuc2lnbmVkIGludAl2cywgdnIsIHZhLCB2c19tYXg7CisJdW5zaWduZWQgaW50CXBhY2xlbjsKKwl1bnNpZ25lZCBpbnQJd2luZG93OworfTsKKworc3RydWN0IGF4MjVfZndkX3N0cnVjdCB7CisJYXgyNV9hZGRyZXNzCXBvcnRfZnJvbTsKKwlheDI1X2FkZHJlc3MJcG9ydF90bzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9iMWxsaS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9iMWxsaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxM2Y3MTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2IxbGxpLmgKQEAgLTAsMCArMSw3MyBAQAorLyogJElkOiBiMWxsaS5oLHYgMS44LjguMyAyMDAxLzA5LzIzIDIyOjI1OjA1IGthaSBFeHAgJAorICoKKyAqIElTRE4gbG93bGV2ZWwtbW9kdWxlIGZvciBBVk0gQjEtY2FyZC4KKyAqCisgKiBDb3B5cmlnaHQgMTk5NiBieSBDYXJzdGVuIFBhZXRoIChjYWxsZUBjYWxsZS5pbi1iZXJsaW4uZGUpCisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKi8KKworI2lmbmRlZiBfQjFMTElfSF8KKyNkZWZpbmUgX0IxTExJX0hfCisvKgorICogc3RydWN0IGZvciBsb2FkaW5nIHQ0IGZpbGUgCisgKi8KK3R5cGVkZWYgc3RydWN0IGF2bWIxX3Q0ZmlsZSB7CisJaW50IGxlbjsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworfSBhdm1iMV90NGZpbGU7CisKK3R5cGVkZWYgc3RydWN0IGF2bWIxX2xvYWRkZWYgeworCWludCBjb250cjsKKwlhdm1iMV90NGZpbGUgdDRmaWxlOworfSBhdm1iMV9sb2FkZGVmOworCit0eXBlZGVmIHN0cnVjdCBhdm1iMV9sb2FkYW5kY29uZmlnZGVmIHsKKwlpbnQgY29udHI7CisJYXZtYjFfdDRmaWxlIHQ0ZmlsZTsKKyAgICAgICAgYXZtYjFfdDRmaWxlIHQ0Y29uZmlnOyAKK30gYXZtYjFfbG9hZGFuZGNvbmZpZ2RlZjsKKwordHlwZWRlZiBzdHJ1Y3QgYXZtYjFfcmVzZXRkZWYgeworCWludCBjb250cjsKK30gYXZtYjFfcmVzZXRkZWY7CisKK3R5cGVkZWYgc3RydWN0IGF2bWIxX2dldGRlZiB7CisJaW50IGNvbnRyOworCWludCBjYXJkdHlwZTsKKwlpbnQgY2FyZHN0YXRlOworfSBhdm1iMV9nZXRkZWY7CisKKy8qCisgKiBzdHJ1Y3QgZm9yIGFkZGluZyBuZXcgY2FyZHMgCisgKi8KK3R5cGVkZWYgc3RydWN0IGF2bWIxX2NhcmRkZWYgeworCWludCBwb3J0OworCWludCBpcnE7Cit9IGF2bWIxX2NhcmRkZWY7CisKKyNkZWZpbmUgQVZNX0NBUkRUWVBFX0IxCQkwCisjZGVmaW5lIEFWTV9DQVJEVFlQRV9UMQkJMQorI2RlZmluZSBBVk1fQ0FSRFRZUEVfTTEJCTIKKyNkZWZpbmUgQVZNX0NBUkRUWVBFX00yCQkzCisKK3R5cGVkZWYgc3RydWN0IGF2bWIxX2V4dGNhcmRkZWYgeworCWludCBwb3J0OworCWludCBpcnE7CisgICAgICAgIGludCBjYXJkdHlwZTsKKyAgICAgICAgaW50IGNhcmRucjsgIC8qIGZvciBIRU1BL1QxICovCit9IGF2bWIxX2V4dGNhcmRkZWY7CisKKyNkZWZpbmUJQVZNQjFfTE9BRAkJMAkvKiBsb2FkIGltYWdlIHRvIGNhcmQgKi8KKyNkZWZpbmUgQVZNQjFfQUREQ0FSRAkJMQkvKiBhZGQgYSBuZXcgY2FyZCAtIE9CU09MRVRFICovCisjZGVmaW5lIEFWTUIxX1JFU0VUQ0FSRAkJMgkvKiByZXNldCBhIGNhcmQgKi8KKyNkZWZpbmUJQVZNQjFfTE9BRF9BTkRfQ09ORklHCTMJLyogbG9hZCBpbWFnZSBhbmQgY29uZmlnIHRvIGNhcmQgKi8KKyNkZWZpbmUJQVZNQjFfQUREQ0FSRF9XSVRIX1RZUEUJNAkvKiBhZGQgYSBuZXcgY2FyZCwgd2l0aCBjYXJkdHlwZSAqLworI2RlZmluZSBBVk1CMV9HRVRfQ0FSRElORk8JNQkvKiBnZXQgY2FyZHR5cGUgKi8KKyNkZWZpbmUgQVZNQjFfUkVNT1ZFQ0FSRAk2CS8qIHJlbW92ZSBhIGNhcmQgLSBPQlNPTEVURSAqLworCisjZGVmaW5lCUFWTUIxX1JFR0lTVEVSQ0FSRF9JU19PQlNPTEVURQorCisjZW5kaWYJCQkJLyogX0IxTExJX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2JheWNvbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9iYXljb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTI0OWUwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9iYXljb20uaApAQCAtMCwwICsxLDM5IEBACisvKgorICogVGhlIExpbnV4IEJBWUNPTSBkcml2ZXIgZm9yIHRoZSBCYXljb20gc2VyaWFsIDEyMDAgYmF1ZCBtb2RlbQorICogYW5kIHRoZSBwYXJhbGxlbCA5NjAwIGJhdWQgbW9kZW0KKyAqIChDKSAxOTk3LTE5OTggYnkgVGhvbWFzIFNhaWxlciwgSEI5Sk5YL0FFNFdBCisgKi8KKworI2lmbmRlZiBfQkFZQ09NX0gKKyNkZWZpbmUgX0JBWUNPTV9ICisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogc3RydWN0cyBmb3IgdGhlIElPQ1RMIGNvbW1hbmRzCisgKi8KKworc3RydWN0IGJheWNvbV9kZWJ1Z19kYXRhIHsKKwl1bnNpZ25lZCBsb25nIGRlYnVnMTsKKwl1bnNpZ25lZCBsb25nIGRlYnVnMjsKKwlsb25nIGRlYnVnMzsKK307CisKK3N0cnVjdCBiYXljb21faW9jdGwgeworCWludCBjbWQ7CisJdW5pb24geworCQlzdHJ1Y3QgYmF5Y29tX2RlYnVnX2RhdGEgZGJnOworCX0gZGF0YTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBpb2N0bCB2YWx1ZXMgY2hhbmdlIGZvciBiYXljb20KKyAqLworI2RlZmluZSBCQVlDT01DVExfR0VUREVCVUcgICAgICAgMHg5MgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZW5kaWYgLyogX0JBWUNPTV9IICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9iZnNfZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYmZzX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwYjM1NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYmZzX2ZzLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqCWluY2x1ZGUvbGludXgvYmZzX2ZzLmggLSBCRlMgZGF0YSBzdHJ1Y3R1cmVzIG9uIGRpc2suCisgKglDb3B5cmlnaHQgKEMpIDE5OTkgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKi8KKworI2lmbmRlZiBfTElOVVhfQkZTX0ZTX0gKKyNkZWZpbmUgX0xJTlVYX0JGU19GU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEJGU19CU0laRV9CSVRTCQk5CisjZGVmaW5lIEJGU19CU0laRQkJKDE8PEJGU19CU0laRV9CSVRTKQorCisjZGVmaW5lIEJGU19NQUdJQwkJMHgxQkFERkFDRQorI2RlZmluZSBCRlNfUk9PVF9JTk8JCTIKKyNkZWZpbmUgQkZTX0lOT0RFU19QRVJfQkxPQ0sJOAorCisvKiBTVlI0IHZub2RlIHR5cGUgdmFsdWVzIChiZnNfaW5vZGUtPmlfdnR5cGUpICovCisjZGVmaW5lIEJGU19WRElSIDJMCisjZGVmaW5lIEJGU19WUkVHIDFMCisKKy8qIEJGUyBpbm9kZSBsYXlvdXQgb24gZGlzayAqLworc3RydWN0IGJmc19pbm9kZSB7CisJX19sZTE2IGlfaW5vOworCV9fdTE2IGlfdW51c2VkOworCV9fbGUzMiBpX3NibG9jazsKKwlfX2xlMzIgaV9lYmxvY2s7CisJX19sZTMyIGlfZW9mZnNldDsKKwlfX2xlMzIgaV92dHlwZTsKKwlfX2xlMzIgaV9tb2RlOworCV9fbGUzMiBpX3VpZDsKKwlfX2xlMzIgaV9naWQ7CisJX19sZTMyIGlfbmxpbms7CisJX19sZTMyIGlfYXRpbWU7CisJX19sZTMyIGlfbXRpbWU7CisJX19sZTMyIGlfY3RpbWU7CisJX191MzIgaV9wYWRkaW5nWzRdOworfTsKKworI2RlZmluZSBCRlNfTkFNRUxFTgkJMTQJCisjZGVmaW5lIEJGU19ESVJFTlRfU0laRQkJMTYKKyNkZWZpbmUgQkZTX0RJUlNfUEVSX0JMT0NLCTMyCisKK3N0cnVjdCBiZnNfZGlyZW50IHsKKwlfX2xlMTYgaW5vOworCWNoYXIgbmFtZVtCRlNfTkFNRUxFTl07Cit9OworCisvKiBCRlMgc3VwZXJibG9jayBsYXlvdXQgb24gZGlzayAqLworc3RydWN0IGJmc19zdXBlcl9ibG9jayB7CisJX19sZTMyIHNfbWFnaWM7CisJX19sZTMyIHNfc3RhcnQ7CisJX19sZTMyIHNfZW5kOworCV9fbGUzMiBzX2Zyb207CisJX19sZTMyIHNfdG87CisJX19zMzIgc19iZnJvbTsKKwlfX3MzMiBzX2J0bzsKKwljaGFyICBzX2ZzbmFtZVs2XTsKKwljaGFyICBzX3ZvbHVtZVs2XTsKKwlfX3UzMiBzX3BhZGRpbmdbMTE4XTsKK307CisKKworI2RlZmluZSBCRlNfT0ZGMklOTyhvZmZzZXQpIFwKKyAgICAgICAgKCgoKG9mZnNldCkgLSBCRlNfQlNJWkUpIC8gc2l6ZW9mKHN0cnVjdCBiZnNfaW5vZGUpKSArIEJGU19ST09UX0lOTykKKworI2RlZmluZSBCRlNfSU5PMk9GRihpbm8pIFwKKwkoKF9fdTMyKSgoKGlubykgLSBCRlNfUk9PVF9JTk8pICogc2l6ZW9mKHN0cnVjdCBiZnNfaW5vZGUpKSArIEJGU19CU0laRSkKKyNkZWZpbmUgQkZTX05aRklMRVNJWkUoaXApIFwKKyAgICAgICAgKChsZTMyX3RvX2NwdSgoaXApLT5pX2VvZmZzZXQpICsgMSkgLSAgbGUzMl90b19jcHUoKGlwKS0+aV9zYmxvY2spICogQkZTX0JTSVpFKQorCisjZGVmaW5lIEJGU19GSUxFU0laRShpcCkgXAorICAgICAgICAoKGlwKS0+aV9zYmxvY2sgPT0gMCA/IDAgOiBCRlNfTlpGSUxFU0laRShpcCkpCisKKyNkZWZpbmUgQkZTX0ZJTEVCTE9DS1MoaXApIFwKKyAgICAgICAgKChpcCktPmlfc2Jsb2NrID09IDAgPyAwIDogKGxlMzJfdG9fY3B1KChpcCktPmlfZWJsb2NrKSArIDEpIC0gIGxlMzJfdG9fY3B1KChpcCktPmlfc2Jsb2NrKSkKKyNkZWZpbmUgQkZTX1VOQ0xFQU4oYmZzX3NiLCBzYikJXAorCSgobGUzMl90b19jcHUoYmZzX3NiLT5zX2Zyb20pICE9IC0xKSAmJiAobGUzMl90b19jcHUoYmZzX3NiLT5zX3RvKSAhPSAtMSkgJiYgIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCisKKworI2VuZGlmCS8qIF9MSU5VWF9CRlNfRlNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9iaW5mbXRzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDE2Nzk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9iaW5mbXRzLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfTElOVVhfQklORk1UU19ICisjZGVmaW5lIF9MSU5VWF9CSU5GTVRTX0gKKworI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKworc3RydWN0IHB0X3JlZ3M7CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIG1heGltdW0gbGVuZ3RoIGFuZCBtYXhpbXVtIG51bWJlciBvZiBzdHJpbmdzIHBhc3NlZCB0byB0aGUKKyAqIGV4ZWN2ZSgpIHN5c3RlbSBjYWxsLiAgTUFYX0FSR19TVFJMRU4gaXMgZXNzZW50aWFsbHkgcmFuZG9tIGJ1dCBzZXJ2ZXMgdG8KKyAqIHByZXZlbnQgdGhlIGtlcm5lbCBmcm9tIGJlaW5nIHVuZHVseSBpbXBhY3RlZCBieSBtaXNhZGRyZXNzZWQgcG9pbnRlcnMuCisgKiBNQVhfQVJHX1NUUklOR1MgaXMgY2hvc2VuIHRvIGZpdCBpbiBhIHNpZ25lZCAzMi1iaXQgaW50ZWdlci4KKyAqLworI2RlZmluZSBNQVhfQVJHX1NUUkxFTiAoUEFHRV9TSVpFICogMzIpCisjZGVmaW5lIE1BWF9BUkdfU1RSSU5HUyAweDdGRkZGRkZGCisKKy8qIHNpemVvZihsaW51eF9iaW5wcm0tPmJ1ZikgKi8KKyNkZWZpbmUgQklOUFJNX0JVRl9TSVpFIDEyOAorCisjZW5kaWYgLyogX0xJTlVYX0JJTkZNVFNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ibGtfdHlwZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYmxrX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY3ZDFiYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYmxrX3R5cGVzLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBCbG9jayBkYXRhIHR5cGVzIGFuZCBjb25zdGFudHMuICBEaXJlY3RseSBpbmNsdWRlIHRoaXMgZmlsZSBvbmx5IHRvCisgKiBicmVhayBpbmNsdWRlIGRlcGVuZGVuY3kgbG9vcC4KKyAqLworI2lmbmRlZiBfX0xJTlVYX0JMS19UWVBFU19ICisjZGVmaW5lIF9fTElOVVhfQkxLX1RZUEVTX0gKKworI2lmZGVmIENPTkZJR19CTE9DSworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGJpb19zZXQ7CitzdHJ1Y3QgYmlvOworc3RydWN0IGJpb19pbnRlZ3JpdHlfcGF5bG9hZDsKK3N0cnVjdCBwYWdlOworc3RydWN0IGJsb2NrX2RldmljZTsKK3R5cGVkZWYgdm9pZCAoYmlvX2VuZF9pb190KSAoc3RydWN0IGJpbyAqLCBpbnQpOwordHlwZWRlZiB2b2lkIChiaW9fZGVzdHJ1Y3Rvcl90KSAoc3RydWN0IGJpbyAqKTsKKworLyoKKyAqIHdhcyB1bnNpZ25lZCBzaG9ydCwgYnV0IHdlIG1pZ2h0IGFzIHdlbGwgYmUgcmVhZHkgZm9yID4gNjRrQiBJL08gcGFnZXMKKyAqLworc3RydWN0IGJpb192ZWMgeworCXN0cnVjdCBwYWdlCSpidl9wYWdlOworCXVuc2lnbmVkIGludAlidl9sZW47CisJdW5zaWduZWQgaW50CWJ2X29mZnNldDsKK307CisKKy8qCisgKiBtYWluIHVuaXQgb2YgSS9PIGZvciB0aGUgYmxvY2sgbGF5ZXIgYW5kIGxvd2VyIGxheWVycyAoaWUgZHJpdmVycyBhbmQKKyAqIHN0YWNraW5nIGRyaXZlcnMpCisgKi8KK3N0cnVjdCBiaW8geworCXNlY3Rvcl90CQliaV9zZWN0b3I7CS8qIGRldmljZSBhZGRyZXNzIGluIDUxMiBieXRlCisJCQkJCQkgICBzZWN0b3JzICovCisJc3RydWN0IGJpbwkJKmJpX25leHQ7CS8qIHJlcXVlc3QgcXVldWUgbGluayAqLworCXN0cnVjdCBibG9ja19kZXZpY2UJKmJpX2JkZXY7CisJdW5zaWduZWQgbG9uZwkJYmlfZmxhZ3M7CS8qIHN0YXR1cywgY29tbWFuZCwgZXRjICovCisJdW5zaWduZWQgbG9uZwkJYmlfcnc7CQkvKiBib3R0b20gYml0cyBSRUFEL1dSSVRFLAorCQkJCQkJICogdG9wIGJpdHMgcHJpb3JpdHkKKwkJCQkJCSAqLworCisJdW5zaWduZWQgc2hvcnQJCWJpX3ZjbnQ7CS8qIGhvdyBtYW55IGJpb192ZWMncyAqLworCXVuc2lnbmVkIHNob3J0CQliaV9pZHg7CQkvKiBjdXJyZW50IGluZGV4IGludG8gYnZsX3ZlYyAqLworCisJLyogTnVtYmVyIG9mIHNlZ21lbnRzIGluIHRoaXMgQklPIGFmdGVyCisJICogcGh5c2ljYWwgYWRkcmVzcyBjb2FsZXNjaW5nIGlzIHBlcmZvcm1lZC4KKwkgKi8KKwl1bnNpZ25lZCBpbnQJCWJpX3BoeXNfc2VnbWVudHM7CisKKwl1bnNpZ25lZCBpbnQJCWJpX3NpemU7CS8qIHJlc2lkdWFsIEkvTyBjb3VudCAqLworCisJLyoKKwkgKiBUbyBrZWVwIHRyYWNrIG9mIHRoZSBtYXggc2VnbWVudCBzaXplLCB3ZSBhY2NvdW50IGZvciB0aGUKKwkgKiBzaXplcyBvZiB0aGUgZmlyc3QgYW5kIGxhc3QgbWVyZ2VhYmxlIHNlZ21lbnRzIGluIHRoaXMgYmlvLgorCSAqLworCXVuc2lnbmVkIGludAkJYmlfc2VnX2Zyb250X3NpemU7CisJdW5zaWduZWQgaW50CQliaV9zZWdfYmFja19zaXplOworCisJdW5zaWduZWQgaW50CQliaV9tYXhfdmVjczsJLyogbWF4IGJ2bF92ZWNzIHdlIGNhbiBob2xkICovCisKKwlhdG9taWNfdAkJYmlfY250OwkJLyogcGluIGNvdW50ICovCisKKwlzdHJ1Y3QgYmlvX3ZlYwkJKmJpX2lvX3ZlYzsJLyogdGhlIGFjdHVhbCB2ZWMgbGlzdCAqLworCisJYmlvX2VuZF9pb190CQkqYmlfZW5kX2lvOworCisJdm9pZAkJCSpiaV9wcml2YXRlOworI2lmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfSU5URUdSSVRZKQorCXN0cnVjdCBiaW9faW50ZWdyaXR5X3BheWxvYWQgKmJpX2ludGVncml0eTsgIC8qIGRhdGEgaW50ZWdyaXR5ICovCisjZW5kaWYKKworCWJpb19kZXN0cnVjdG9yX3QJKmJpX2Rlc3RydWN0b3I7CS8qIGRlc3RydWN0b3IgKi8KKworCS8qCisJICogV2UgY2FuIF9faW5saW5lX18gYSBudW1iZXIgb2YgdmVjcyBhdCB0aGUgZW5kIG9mIHRoZSBiaW8sIHRvIGF2b2lkCisJICogZG91YmxlIGFsbG9jYXRpb25zIGZvciBhIHNtYWxsIG51bWJlciBvZiBiaW9fdmVjcy4gVGhpcyBtZW1iZXIKKwkgKiBNVVNUIG9idmlvdXNseSBiZSBrZXB0IGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgYmlvLgorCSAqLworCXN0cnVjdCBiaW9fdmVjCQliaV9pbmxpbmVfdmVjc1swXTsKK307CisKKy8qCisgKiBiaW8gZmxhZ3MKKyAqLworI2RlZmluZSBCSU9fVVBUT0RBVEUJMAkvKiBvayBhZnRlciBJL08gY29tcGxldGlvbiAqLworI2RlZmluZSBCSU9fUldfQkxPQ0sJMQkvKiBSV19BSEVBRCBzZXQsIGFuZCByZWFkL3dyaXRlIHdvdWxkIGJsb2NrICovCisjZGVmaW5lIEJJT19FT0YJCTIJLyogb3V0LW91dC1ib3VuZHMgZXJyb3IgKi8KKyNkZWZpbmUgQklPX1NFR19WQUxJRAkzCS8qIGJpX3BoeXNfc2VnbWVudHMgdmFsaWQgKi8KKyNkZWZpbmUgQklPX0NMT05FRAk0CS8qIGRvZXNuJ3Qgb3duIGRhdGEgKi8KKyNkZWZpbmUgQklPX0JPVU5DRUQJNQkvKiBiaW8gaXMgYSBib3VuY2UgYmlvICovCisjZGVmaW5lIEJJT19VU0VSX01BUFBFRCA2CS8qIGNvbnRhaW5zIHVzZXIgcGFnZXMgKi8KKyNkZWZpbmUgQklPX0VPUE5PVFNVUFAJNwkvKiBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIEJJT19OVUxMX01BUFBFRCA4CS8qIGNvbnRhaW5zIGludmFsaWQgdXNlciBwYWdlcyAqLworI2RlZmluZSBCSU9fRlNfSU5URUdSSVRZIDkJLyogZnMgb3ducyBpbnRlZ3JpdHkgZGF0YSwgbm90IGJsb2NrIGxheWVyICovCisjZGVmaW5lIEJJT19RVUlFVAkxMAkvKiBNYWtlIEJJTyBRdWlldCAqLworI2RlZmluZSBCSU9fTUFQUEVEX0lOVEVHUklUWSAxMS8qIGludGVncml0eSBtZXRhZGF0YSBoYXMgYmVlbiByZW1hcHBlZCAqLworI2RlZmluZSBiaW9fZmxhZ2dlZChiaW8sIGZsYWcpCSgoYmlvKS0+YmlfZmxhZ3MgJiAoMSA8PCAoZmxhZykpKQorCisvKgorICogdG9wIDQgYml0cyBvZiBiaW8gZmxhZ3MgaW5kaWNhdGUgdGhlIHBvb2wgdGhpcyBiaW8gY2FtZSBmcm9tCisgKi8KKyNkZWZpbmUgQklPX1BPT0xfQklUUwkJKDQpCisjZGVmaW5lIEJJT19QT09MX05PTkUJCSgoMVVMIDw8IEJJT19QT09MX0JJVFMpIC0gMSkKKyNkZWZpbmUgQklPX1BPT0xfT0ZGU0VUCQkoQklUU19QRVJfTE9ORyAtIEJJT19QT09MX0JJVFMpCisjZGVmaW5lIEJJT19QT09MX01BU0sJCSgxVUwgPDwgQklPX1BPT0xfT0ZGU0VUKQorI2RlZmluZSBCSU9fUE9PTF9JRFgoYmlvKQkoKGJpbyktPmJpX2ZsYWdzID4+IEJJT19QT09MX09GRlNFVCkKKworI2VuZGlmIC8qIENPTkZJR19CTE9DSyAqLworCisvKgorICogUmVxdWVzdCBmbGFncy4gIEZvciB1c2UgaW4gdGhlIGNtZF9mbGFncyBmaWVsZCBvZiBzdHJ1Y3QgcmVxdWVzdCwgYW5kIGluCisgKiBiaV9ydyBvZiBzdHJ1Y3QgYmlvLiAgTm90ZSB0aGF0IHNvbWUgZmxhZ3MgYXJlIG9ubHkgdmFsaWQgaW4gZWl0aGVyIG9uZS4KKyAqLworZW51bSBycV9mbGFnX2JpdHMgeworCS8qIGNvbW1vbiBmbGFncyAqLworCV9fUkVRX1dSSVRFLAkJLyogbm90IHNldCwgcmVhZC4gc2V0LCB3cml0ZSAqLworCV9fUkVRX0ZBSUxGQVNUX0RFViwJLyogbm8gZHJpdmVyIHJldHJpZXMgb2YgZGV2aWNlIGVycm9ycyAqLworCV9fUkVRX0ZBSUxGQVNUX1RSQU5TUE9SVCwgLyogbm8gZHJpdmVyIHJldHJpZXMgb2YgdHJhbnNwb3J0IGVycm9ycyAqLworCV9fUkVRX0ZBSUxGQVNUX0RSSVZFUiwJLyogbm8gZHJpdmVyIHJldHJpZXMgb2YgZHJpdmVyIGVycm9ycyAqLworCisJX19SRVFfU1lOQywJCS8qIHJlcXVlc3QgaXMgc3luYyAoc3luYyB3cml0ZSBvciByZWFkKSAqLworCV9fUkVRX01FVEEsCQkvKiBtZXRhZGF0YSBpbyByZXF1ZXN0ICovCisJX19SRVFfUFJJTywJCS8qIGJvb3N0IHByaW9yaXR5IGluIGNmcSAqLworCV9fUkVRX0RJU0NBUkQsCQkvKiByZXF1ZXN0IHRvIGRpc2NhcmQgc2VjdG9ycyAqLworCV9fUkVRX1NFQ1VSRSwJCS8qIHNlY3VyZSBkaXNjYXJkICh1c2VkIHdpdGggX19SRVFfRElTQ0FSRCkgKi8KKworCV9fUkVRX05PSURMRSwJCS8qIGRvbid0IGFudGljaXBhdGUgbW9yZSBJTyBhZnRlciB0aGlzIG9uZSAqLworCV9fUkVRX0ZVQSwJCS8qIGZvcmNlZCB1bml0IGFjY2VzcyAqLworCV9fUkVRX0ZMVVNILAkJLyogcmVxdWVzdCBmb3IgY2FjaGUgZmx1c2ggKi8KKworCS8qIGJpbyBvbmx5IGZsYWdzICovCisJX19SRVFfUkFIRUFELAkJLyogcmVhZCBhaGVhZCwgY2FuIGZhaWwgYW55dGltZSAqLworCV9fUkVRX1RIUk9UVExFRCwJLyogVGhpcyBiaW8gaGFzIGFscmVhZHkgYmVlbiBzdWJqZWN0ZWQgdG8KKwkJCQkgKiB0aHJvdHRsaW5nIHJ1bGVzLiBEb24ndCBkbyBpdCBhZ2Fpbi4gKi8KKworCS8qIHJlcXVlc3Qgb25seSBmbGFncyAqLworCV9fUkVRX1NPUlRFRCwJCS8qIGVsZXZhdG9yIGtub3dzIGFib3V0IHRoaXMgcmVxdWVzdCAqLworCV9fUkVRX1NPRlRCQVJSSUVSLAkvKiBtYXkgbm90IGJlIHBhc3NlZCBieSBpb3NjaGVkdWxlciAqLworCV9fUkVRX05PTUVSR0UsCQkvKiBkb24ndCB0b3VjaCB0aGlzIGZvciBtZXJnaW5nICovCisJX19SRVFfU1RBUlRFRCwJCS8qIGRyaXZlIGFscmVhZHkgbWF5IGhhdmUgc3RhcnRlZCB0aGlzIG9uZSAqLworCV9fUkVRX0RPTlRQUkVQLAkJLyogZG9uJ3QgY2FsbCBwcmVwIGZvciB0aGlzIG9uZSAqLworCV9fUkVRX1FVRVVFRCwJCS8qIHVzZXMgcXVldWVpbmcgKi8KKwlfX1JFUV9FTFZQUklWLAkJLyogZWxldmF0b3IgcHJpdmF0ZSBkYXRhIGF0dGFjaGVkICovCisJX19SRVFfRkFJTEVELAkJLyogc2V0IGlmIHRoZSByZXF1ZXN0IGZhaWxlZCAqLworCV9fUkVRX1FVSUVULAkJLyogZG9uJ3Qgd29ycnkgYWJvdXQgZXJyb3JzICovCisJX19SRVFfUFJFRU1QVCwJCS8qIHNldCBmb3IgImlkZV9wcmVlbXB0IiByZXF1ZXN0cyAqLworCV9fUkVRX0FMTE9DRUQsCQkvKiByZXF1ZXN0IGNhbWUgZnJvbSBvdXIgYWxsb2MgcG9vbCAqLworCV9fUkVRX0NPUFlfVVNFUiwJLyogY29udGFpbnMgY29waWVzIG9mIHVzZXIgcGFnZXMgKi8KKwlfX1JFUV9GTFVTSF9TRVEsCS8qIHJlcXVlc3QgZm9yIGZsdXNoIHNlcXVlbmNlICovCisJX19SRVFfSU9fU1RBVCwJCS8qIGFjY291bnQgSS9PIHN0YXQgKi8KKwlfX1JFUV9NSVhFRF9NRVJHRSwJLyogbWVyZ2Ugb2YgZGlmZmVyZW50IHR5cGVzLCBmYWlsIHNlcGFyYXRlbHkgKi8KKwlfX1JFUV9OUl9CSVRTLAkJLyogc3RvcHMgaGVyZSAqLworfTsKKworI2RlZmluZSBSRVFfV1JJVEUJCSgxIDw8IF9fUkVRX1dSSVRFKQorI2RlZmluZSBSRVFfRkFJTEZBU1RfREVWCSgxIDw8IF9fUkVRX0ZBSUxGQVNUX0RFVikKKyNkZWZpbmUgUkVRX0ZBSUxGQVNUX1RSQU5TUE9SVAkoMSA8PCBfX1JFUV9GQUlMRkFTVF9UUkFOU1BPUlQpCisjZGVmaW5lIFJFUV9GQUlMRkFTVF9EUklWRVIJKDEgPDwgX19SRVFfRkFJTEZBU1RfRFJJVkVSKQorI2RlZmluZSBSRVFfU1lOQwkJKDEgPDwgX19SRVFfU1lOQykKKyNkZWZpbmUgUkVRX01FVEEJCSgxIDw8IF9fUkVRX01FVEEpCisjZGVmaW5lIFJFUV9QUklPCQkoMSA8PCBfX1JFUV9QUklPKQorI2RlZmluZSBSRVFfRElTQ0FSRAkJKDEgPDwgX19SRVFfRElTQ0FSRCkKKyNkZWZpbmUgUkVRX05PSURMRQkJKDEgPDwgX19SRVFfTk9JRExFKQorCisjZGVmaW5lIFJFUV9GQUlMRkFTVF9NQVNLIFwKKwkoUkVRX0ZBSUxGQVNUX0RFViB8IFJFUV9GQUlMRkFTVF9UUkFOU1BPUlQgfCBSRVFfRkFJTEZBU1RfRFJJVkVSKQorI2RlZmluZSBSRVFfQ09NTU9OX01BU0sgXAorCShSRVFfV1JJVEUgfCBSRVFfRkFJTEZBU1RfTUFTSyB8IFJFUV9TWU5DIHwgUkVRX01FVEEgfCBSRVFfUFJJTyB8IFwKKwkgUkVRX0RJU0NBUkQgfCBSRVFfTk9JRExFIHwgUkVRX0ZMVVNIIHwgUkVRX0ZVQSB8IFJFUV9TRUNVUkUpCisjZGVmaW5lIFJFUV9DTE9ORV9NQVNLCQlSRVFfQ09NTU9OX01BU0sKKworI2RlZmluZSBSRVFfUkFIRUFECQkoMSA8PCBfX1JFUV9SQUhFQUQpCisjZGVmaW5lIFJFUV9USFJPVFRMRUQJCSgxIDw8IF9fUkVRX1RIUk9UVExFRCkKKworI2RlZmluZSBSRVFfU09SVEVECQkoMSA8PCBfX1JFUV9TT1JURUQpCisjZGVmaW5lIFJFUV9TT0ZUQkFSUklFUgkJKDEgPDwgX19SRVFfU09GVEJBUlJJRVIpCisjZGVmaW5lIFJFUV9GVUEJCQkoMSA8PCBfX1JFUV9GVUEpCisjZGVmaW5lIFJFUV9OT01FUkdFCQkoMSA8PCBfX1JFUV9OT01FUkdFKQorI2RlZmluZSBSRVFfU1RBUlRFRAkJKDEgPDwgX19SRVFfU1RBUlRFRCkKKyNkZWZpbmUgUkVRX0RPTlRQUkVQCQkoMSA8PCBfX1JFUV9ET05UUFJFUCkKKyNkZWZpbmUgUkVRX1FVRVVFRAkJKDEgPDwgX19SRVFfUVVFVUVEKQorI2RlZmluZSBSRVFfRUxWUFJJVgkJKDEgPDwgX19SRVFfRUxWUFJJVikKKyNkZWZpbmUgUkVRX0ZBSUxFRAkJKDEgPDwgX19SRVFfRkFJTEVEKQorI2RlZmluZSBSRVFfUVVJRVQJCSgxIDw8IF9fUkVRX1FVSUVUKQorI2RlZmluZSBSRVFfUFJFRU1QVAkJKDEgPDwgX19SRVFfUFJFRU1QVCkKKyNkZWZpbmUgUkVRX0FMTE9DRUQJCSgxIDw8IF9fUkVRX0FMTE9DRUQpCisjZGVmaW5lIFJFUV9DT1BZX1VTRVIJCSgxIDw8IF9fUkVRX0NPUFlfVVNFUikKKyNkZWZpbmUgUkVRX0ZMVVNICQkoMSA8PCBfX1JFUV9GTFVTSCkKKyNkZWZpbmUgUkVRX0ZMVVNIX1NFUQkJKDEgPDwgX19SRVFfRkxVU0hfU0VRKQorI2RlZmluZSBSRVFfSU9fU1RBVAkJKDEgPDwgX19SRVFfSU9fU1RBVCkKKyNkZWZpbmUgUkVRX01JWEVEX01FUkdFCQkoMSA8PCBfX1JFUV9NSVhFRF9NRVJHRSkKKyNkZWZpbmUgUkVRX1NFQ1VSRQkJKDEgPDwgX19SRVFfU0VDVVJFKQorCisjZW5kaWYgLyogX19MSU5VWF9CTEtfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ibGtwZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ibGtwZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MmRkNGIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Jsa3BnLmgKQEAgLTAsMCArMSw1OCBAQAorI2lmbmRlZiBfTElOVVhfQkxLUEdfSAorI2RlZmluZSBfTElOVVhfQkxLUEdfSAorCisvKgorICogUGFydGl0aW9uIHRhYmxlIGFuZCBkaXNrIGdlb21ldHJ5IGhhbmRsaW5nCisgKgorICogQSBzaW5nbGUgaW9jdGwgd2l0aCBsb3RzIG9mIHN1YmZ1bmN0aW9uczoKKyAqCisgKiBEZXZpY2UgbnVtYmVyIHN0dWZmOgorICogICAgZ2V0X3dob2xlX2Rpc2soKQkJKGdpdmVuIHRoZSBkZXZpY2UgbnVtYmVyIG9mIGEgcGFydGl0aW9uLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZCB0aGUgZGV2aWNlIG51bWJlciBvZiB0aGUgZW5jb21wYXNzaW5nIGRpc2spCisgKiAgICBnZXRfYWxsX3BhcnRpdGlvbnMoKQkoZ2l2ZW4gdGhlIGRldmljZSBudW1iZXIgb2YgYSBkaXNrLCByZXR1cm4gdGhlCisgKgkJCQkgZGV2aWNlIG51bWJlcnMgb2YgYWxsIGl0cyBrbm93biBwYXJ0aXRpb25zKQorICoKKyAqIFBhcnRpdGlvbiBzdHVmZjoKKyAqICAgIGFkZF9wYXJ0aXRpb24oKQorICogICAgZGVsZXRlX3BhcnRpdGlvbigpCisgKiAgICB0ZXN0X3BhcnRpdGlvbl9pbl91c2UoKQkoYWxzbyBmb3IgdGVzdF9kaXNrX2luX3VzZSkKKyAqCisgKiBHZW9tZXRyeSBzdHVmZjoKKyAqICAgIGdldF9nZW9tZXRyeSgpCisgKiAgICBzZXRfZ2VvbWV0cnkoKQorICogICAgZ2V0X2Jpb3NfZHJpdmVkYXRhKCkKKyAqCisgKiBGb3IgdG9kYXksIG9ubHkgdGhlIHBhcnRpdGlvbiBzdHVmZiAtIGFlYiwgOTkwNTE1CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNkZWZpbmUgQkxLUEcgICAgICBfSU8oMHgxMiwxMDUpCisKKy8qIFRoZSBhcmd1bWVudCBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBibGtwZ19pb2N0bF9hcmcgeworICAgICAgICBpbnQgb3A7CisgICAgICAgIGludCBmbGFnczsKKyAgICAgICAgaW50IGRhdGFsZW47CisgICAgICAgIHZvaWQgKmRhdGE7Cit9OworCisvKiBUaGUgc3ViZnVuY3Rpb25zIChmb3IgdGhlIG9wIGZpZWxkKSAqLworI2RlZmluZSBCTEtQR19BRERfUEFSVElUSU9OCTEKKyNkZWZpbmUgQkxLUEdfREVMX1BBUlRJVElPTgkyCisKKy8qIFNpemVzIG9mIG5hbWUgZmllbGRzLiBVbnVzZWQgYXQgcHJlc2VudC4gKi8KKyNkZWZpbmUgQkxLUEdfREVWTkFNRUxUSAk2NAorI2RlZmluZSBCTEtQR19WT0xOQU1FTFRICTY0CisKKy8qIFRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgQUREX1BBUlRJVElPTiBhbmQgREVMX1BBUlRJVElPTiAqLworc3RydWN0IGJsa3BnX3BhcnRpdGlvbiB7CisJbG9uZyBsb25nIHN0YXJ0OwkJLyogc3RhcnRpbmcgb2Zmc2V0IGluIGJ5dGVzICovCisJbG9uZyBsb25nIGxlbmd0aDsJCS8qIGxlbmd0aCBpbiBieXRlcyAqLworCWludCBwbm87CQkJLyogcGFydGl0aW9uIG51bWJlciAqLworCWNoYXIgZGV2bmFtZVtCTEtQR19ERVZOQU1FTFRIXTsJLyogcGFydGl0aW9uIG5hbWUsIGxpa2Ugc2RhNSBvciBjMGQxcDIsCisJCQkJCSAgIHRvIGJlIHVzZWQgaW4ga2VybmVsIG1lc3NhZ2VzICovCisJY2hhciB2b2xuYW1lW0JMS1BHX1ZPTE5BTUVMVEhdOwkvKiB2b2x1bWUgbGFiZWwgKi8KK307CisKKyNlbmRpZiAvKiBfTElOVVhfQkxLUEdfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ibGt0cmFjZV9hcGkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYmxrdHJhY2VfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJkMjBlYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYmxrdHJhY2VfYXBpLmgKQEAgLTAsMCArMSwxNDIgQEAKKyNpZm5kZWYgQkxLVFJBQ0VfSAorI2RlZmluZSBCTEtUUkFDRV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogVHJhY2UgY2F0ZWdvcmllcworICovCitlbnVtIGJsa3RyYWNlX2NhdCB7CisJQkxLX1RDX1JFQUQJPSAxIDw8IDAsCS8qIHJlYWRzICovCisJQkxLX1RDX1dSSVRFCT0gMSA8PCAxLAkvKiB3cml0ZXMgKi8KKwlCTEtfVENfRkxVU0gJPSAxIDw8IDIsCS8qIGZsdXNoICovCisJQkxLX1RDX1NZTkMJPSAxIDw8IDMsCS8qIHN5bmMgSU8gKi8KKwlCTEtfVENfU1lOQ0lPCT0gQkxLX1RDX1NZTkMsCisJQkxLX1RDX1FVRVVFCT0gMSA8PCA0LAkvKiBxdWV1ZWluZy9tZXJnaW5nICovCisJQkxLX1RDX1JFUVVFVUUJPSAxIDw8IDUsCS8qIHJlcXVldWVpbmcgKi8KKwlCTEtfVENfSVNTVUUJPSAxIDw8IDYsCS8qIGlzc3VlICovCisJQkxLX1RDX0NPTVBMRVRFCT0gMSA8PCA3LAkvKiBjb21wbGV0aW9ucyAqLworCUJMS19UQ19GUwk9IDEgPDwgOCwJLyogZnMgcmVxdWVzdHMgKi8KKwlCTEtfVENfUEMJPSAxIDw8IDksCS8qIHBjIHJlcXVlc3RzICovCisJQkxLX1RDX05PVElGWQk9IDEgPDwgMTAsCS8qIHNwZWNpYWwgbWVzc2FnZSAqLworCUJMS19UQ19BSEVBRAk9IDEgPDwgMTEsCS8qIHJlYWRhaGVhZCAqLworCUJMS19UQ19NRVRBCT0gMSA8PCAxMiwJLyogbWV0YWRhdGEgKi8KKwlCTEtfVENfRElTQ0FSRAk9IDEgPDwgMTMsCS8qIGRpc2NhcmQgcmVxdWVzdHMgKi8KKwlCTEtfVENfRFJWX0RBVEEJPSAxIDw8IDE0LAkvKiBiaW5hcnkgcGVyLWRyaXZlciBkYXRhICovCisJQkxLX1RDX0ZVQQk9IDEgPDwgMTUsCS8qIGZ1YSByZXF1ZXN0cyAqLworCisJQkxLX1RDX0VORAk9IDEgPDwgMTUsCS8qIHdlJ3ZlIHJ1biBvdXQgb2YgYml0cyEgKi8KK307CisKKyNkZWZpbmUgQkxLX1RDX1NISUZUCQkoMTYpCisjZGVmaW5lIEJMS19UQ19BQ1QoYWN0KQkJKChhY3QpIDw8IEJMS19UQ19TSElGVCkKKworLyoKKyAqIEJhc2ljIHRyYWNlIGFjdGlvbnMKKyAqLworZW51bSBibGt0cmFjZV9hY3QgeworCV9fQkxLX1RBX1FVRVVFID0gMSwJCS8qIHF1ZXVlZCAqLworCV9fQkxLX1RBX0JBQ0tNRVJHRSwJCS8qIGJhY2sgbWVyZ2VkIHRvIGV4aXN0aW5nIHJxICovCisJX19CTEtfVEFfRlJPTlRNRVJHRSwJCS8qIGZyb250IG1lcmdlIHRvIGV4aXN0aW5nIHJxICovCisJX19CTEtfVEFfR0VUUlEsCQkJLyogYWxsb2NhdGVkIG5ldyByZXF1ZXN0ICovCisJX19CTEtfVEFfU0xFRVBSUSwJCS8qIHNsZWVwaW5nIG9uIHJxIGFsbG9jYXRpb24gKi8KKwlfX0JMS19UQV9SRVFVRVVFLAkJLyogcmVxdWVzdCByZXF1ZXVlZCAqLworCV9fQkxLX1RBX0lTU1VFLAkJCS8qIHNlbnQgdG8gZHJpdmVyICovCisJX19CTEtfVEFfQ09NUExFVEUsCQkvKiBjb21wbGV0ZWQgYnkgZHJpdmVyICovCisJX19CTEtfVEFfUExVRywJCQkvKiBxdWV1ZSB3YXMgcGx1Z2dlZCAqLworCV9fQkxLX1RBX1VOUExVR19JTywJCS8qIHF1ZXVlIHdhcyB1bnBsdWdnZWQgYnkgaW8gKi8KKwlfX0JMS19UQV9VTlBMVUdfVElNRVIsCQkvKiBxdWV1ZSB3YXMgdW5wbHVnZ2VkIGJ5IHRpbWVyICovCisJX19CTEtfVEFfSU5TRVJULAkJLyogaW5zZXJ0IHJlcXVlc3QgKi8KKwlfX0JMS19UQV9TUExJVCwJCQkvKiBiaW8gd2FzIHNwbGl0ICovCisJX19CTEtfVEFfQk9VTkNFLAkJLyogYmlvIHdhcyBib3VuY2VkICovCisJX19CTEtfVEFfUkVNQVAsCQkJLyogYmlvIHdhcyByZW1hcHBlZCAqLworCV9fQkxLX1RBX0FCT1JULAkJCS8qIHJlcXVlc3QgYWJvcnRlZCAqLworCV9fQkxLX1RBX0RSVl9EQVRBLAkJLyogZHJpdmVyLXNwZWNpZmljIGJpbmFyeSBkYXRhICovCit9OworCisvKgorICogTm90aWZ5IGV2ZW50cy4KKyAqLworZW51bSBibGt0cmFjZV9ub3RpZnkgeworCV9fQkxLX1ROX1BST0NFU1MgPSAwLAkJLyogZXN0YWJsaXNoIHBpZC9uYW1lIG1hcHBpbmcgKi8KKwlfX0JMS19UTl9USU1FU1RBTVAsCQkvKiBpbmNsdWRlIHN5c3RlbSBjbG9jayAqLworCV9fQkxLX1ROX01FU1NBR0UsCQkvKiBDaGFyYWN0ZXIgc3RyaW5nIG1lc3NhZ2UgKi8KK307CisKKworLyoKKyAqIFRyYWNlIGFjdGlvbnMgaW4gZnVsbC4gQWRkaXRpb25hbGx5LCByZWFkIG9yIHdyaXRlIGlzIG1hc2tlZAorICovCisjZGVmaW5lIEJMS19UQV9RVUVVRQkJKF9fQkxLX1RBX1FVRVVFIHwgQkxLX1RDX0FDVChCTEtfVENfUVVFVUUpKQorI2RlZmluZSBCTEtfVEFfQkFDS01FUkdFCShfX0JMS19UQV9CQUNLTUVSR0UgfCBCTEtfVENfQUNUKEJMS19UQ19RVUVVRSkpCisjZGVmaW5lIEJMS19UQV9GUk9OVE1FUkdFCShfX0JMS19UQV9GUk9OVE1FUkdFIHwgQkxLX1RDX0FDVChCTEtfVENfUVVFVUUpKQorI2RlZmluZQlCTEtfVEFfR0VUUlEJCShfX0JMS19UQV9HRVRSUSB8IEJMS19UQ19BQ1QoQkxLX1RDX1FVRVVFKSkKKyNkZWZpbmUJQkxLX1RBX1NMRUVQUlEJCShfX0JMS19UQV9TTEVFUFJRIHwgQkxLX1RDX0FDVChCTEtfVENfUVVFVUUpKQorI2RlZmluZQlCTEtfVEFfUkVRVUVVRQkJKF9fQkxLX1RBX1JFUVVFVUUgfCBCTEtfVENfQUNUKEJMS19UQ19SRVFVRVVFKSkKKyNkZWZpbmUgQkxLX1RBX0lTU1VFCQkoX19CTEtfVEFfSVNTVUUgfCBCTEtfVENfQUNUKEJMS19UQ19JU1NVRSkpCisjZGVmaW5lIEJMS19UQV9DT01QTEVURQkJKF9fQkxLX1RBX0NPTVBMRVRFfCBCTEtfVENfQUNUKEJMS19UQ19DT01QTEVURSkpCisjZGVmaW5lIEJMS19UQV9QTFVHCQkoX19CTEtfVEFfUExVRyB8IEJMS19UQ19BQ1QoQkxLX1RDX1FVRVVFKSkKKyNkZWZpbmUgQkxLX1RBX1VOUExVR19JTwkoX19CTEtfVEFfVU5QTFVHX0lPIHwgQkxLX1RDX0FDVChCTEtfVENfUVVFVUUpKQorI2RlZmluZSBCTEtfVEFfVU5QTFVHX1RJTUVSCShfX0JMS19UQV9VTlBMVUdfVElNRVIgfCBCTEtfVENfQUNUKEJMS19UQ19RVUVVRSkpCisjZGVmaW5lIEJMS19UQV9JTlNFUlQJCShfX0JMS19UQV9JTlNFUlQgfCBCTEtfVENfQUNUKEJMS19UQ19RVUVVRSkpCisjZGVmaW5lIEJMS19UQV9TUExJVAkJKF9fQkxLX1RBX1NQTElUKQorI2RlZmluZSBCTEtfVEFfQk9VTkNFCQkoX19CTEtfVEFfQk9VTkNFKQorI2RlZmluZSBCTEtfVEFfUkVNQVAJCShfX0JMS19UQV9SRU1BUCB8IEJMS19UQ19BQ1QoQkxLX1RDX1FVRVVFKSkKKyNkZWZpbmUgQkxLX1RBX0FCT1JUCQkoX19CTEtfVEFfQUJPUlQgfCBCTEtfVENfQUNUKEJMS19UQ19RVUVVRSkpCisjZGVmaW5lIEJMS19UQV9EUlZfREFUQQkoX19CTEtfVEFfRFJWX0RBVEEgfCBCTEtfVENfQUNUKEJMS19UQ19EUlZfREFUQSkpCisKKyNkZWZpbmUgQkxLX1ROX1BST0NFU1MJCShfX0JMS19UTl9QUk9DRVNTIHwgQkxLX1RDX0FDVChCTEtfVENfTk9USUZZKSkKKyNkZWZpbmUgQkxLX1ROX1RJTUVTVEFNUAkoX19CTEtfVE5fVElNRVNUQU1QIHwgQkxLX1RDX0FDVChCTEtfVENfTk9USUZZKSkKKyNkZWZpbmUgQkxLX1ROX01FU1NBR0UJCShfX0JMS19UTl9NRVNTQUdFIHwgQkxLX1RDX0FDVChCTEtfVENfTk9USUZZKSkKKworI2RlZmluZSBCTEtfSU9fVFJBQ0VfTUFHSUMJMHg2NTYxNzQwMAorI2RlZmluZSBCTEtfSU9fVFJBQ0VfVkVSU0lPTgkweDA3CisKKy8qCisgKiBUaGUgdHJhY2UgaXRzZWxmCisgKi8KK3N0cnVjdCBibGtfaW9fdHJhY2UgeworCV9fdTMyIG1hZ2ljOwkJLyogTUFHSUMgPDwgOCB8IHZlcnNpb24gKi8KKwlfX3UzMiBzZXF1ZW5jZTsJCS8qIGV2ZW50IG51bWJlciAqLworCV9fdTY0IHRpbWU7CQkvKiBpbiBtaWNyb3NlY29uZHMgKi8KKwlfX3U2NCBzZWN0b3I7CQkvKiBkaXNrIG9mZnNldCAqLworCV9fdTMyIGJ5dGVzOwkJLyogdHJhbnNmZXIgbGVuZ3RoICovCisJX191MzIgYWN0aW9uOwkJLyogd2hhdCBoYXBwZW5lZCAqLworCV9fdTMyIHBpZDsJCS8qIHdobyBkaWQgaXQgKi8KKwlfX3UzMiBkZXZpY2U7CQkvKiBkZXZpY2UgbnVtYmVyICovCisJX191MzIgY3B1OwkJLyogb24gd2hhdCBjcHUgZGlkIGl0IGhhcHBlbiAqLworCV9fdTE2IGVycm9yOwkJLyogY29tcGxldGlvbiBlcnJvciAqLworCV9fdTE2IHBkdV9sZW47CQkvKiBsZW5ndGggb2YgZGF0YSBhZnRlciB0aGlzIHRyYWNlICovCit9OworCisvKgorICogVGhlIHJlbWFwIGV2ZW50CisgKi8KK3N0cnVjdCBibGtfaW9fdHJhY2VfcmVtYXAgeworCV9fYmUzMiBkZXZpY2VfZnJvbTsKKwlfX2JlMzIgZGV2aWNlX3RvOworCV9fYmU2NCBzZWN0b3JfZnJvbTsKK307CisKK2VudW0geworCUJsa3RyYWNlX3NldHVwID0gMSwKKwlCbGt0cmFjZV9ydW5uaW5nLAorCUJsa3RyYWNlX3N0b3BwZWQsCit9OworCisjZGVmaW5lIEJMS1RSQUNFX0JERVZfU0laRQkzMgorCisvKgorICogVXNlciBzZXR1cCBzdHJ1Y3R1cmUgcGFzc2VkIHdpdGggQkxLVFJBQ0VTVEFSVAorICovCitzdHJ1Y3QgYmxrX3VzZXJfdHJhY2Vfc2V0dXAgeworCWNoYXIgbmFtZVtCTEtUUkFDRV9CREVWX1NJWkVdOwkvKiBvdXRwdXQgKi8KKwlfX3UxNiBhY3RfbWFzazsJCQkvKiBpbnB1dCAqLworCV9fdTMyIGJ1Zl9zaXplOwkJCS8qIGlucHV0ICovCisJX191MzIgYnVmX25yOwkJCS8qIGlucHV0ICovCisJX191NjQgc3RhcnRfbGJhOworCV9fdTY0IGVuZF9sYmE7CisJX191MzIgcGlkOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2JwcWV0aGVyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2JwcWV0aGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjMzVlMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYnBxZXRoZXIuaApAQCAtMCwwICsxLDQxIEBACisjaWZuZGVmCV9fQlBRRVRIRVJfSAorI2RlZmluZQlfX0JQUUVUSEVSX0gKKworLyoKKyAqIAlEZWZpbmVzIGZvciB0aGUgQlBRRVRIRVIgcHNldWRvIGRldmljZSBkcml2ZXIKKyAqLworCisjaWZuZGVmIF9fTElOVVhfSUZfRVRIRVJfSAorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjZW5kaWYKKworI2RlZmluZSBTSU9DU0JQUUVUSE9QVAkJKFNJT0NERVZQUklWQVRFKzApCS8qIHJlc2VydmVkICovCisjZGVmaW5lIFNJT0NTQlBRRVRIQUREUgkJKFNJT0NERVZQUklWQVRFKzEpCisgCitzdHJ1Y3QgYnBxX2V0aGFkZHIgeworCXVuc2lnbmVkIGNoYXIgZGVzdGluYXRpb25bRVRIX0FMRU5dOworCXVuc2lnbmVkIGNoYXIgYWNjZXB0W0VUSF9BTEVOXTsKK307CisKKy8qIAorICogRm9yIFNJT0NTQlBRRVRIT1BUIC0gdGhpcyBpcyBjb21wYXRpYmxlIHdpdGggUEkyL1BhY2tldFR3aW4gY2FyZCBkcml2ZXJzLAorICogY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZCwgdGhvdWdoLiBJZiBzb21lb25lIHdhbnRzIHRvIGhvb2sgYSByYWRpbworICogdG8gaGlzIEV0aGVybmV0IGNhcmQgaGUgbWF5IGZpbmQgdGhpcyB1c2VmdWwuIDstKQorICovCisKKyNkZWZpbmUgU0lPQ0dCUFFFVEhQQVJBTQkweDUwMDAgIC8qIGdldCBMZXZlbCAxIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgU0lPQ1NCUFFFVEhQQVJBTQkweDUwMDEgIC8qIHNldCAqLworCitzdHJ1Y3QgYnBxX3JlcSAgeworICAgIGludCBjbWQ7CisgICAgaW50IHNwZWVkOwkJCS8qIHVudXNlZCAqLworICAgIGludCBjbG9ja21vZGU7CQkvKiB1bnVzZWQgKi8KKyAgICBpbnQgdHhkZWxheTsKKyAgICB1bnNpZ25lZCBjaGFyIHBlcnNpc3Q7CS8qIHVudXNlZCAqLworICAgIGludCBzbG90aW1lOwkJLyogdW51c2VkICovCisgICAgaW50IHNxdWVsZGVsYXk7CisgICAgaW50IGRtYWNoYW47CQkvKiB1bnVzZWQgKi8KKyAgICBpbnQgaXJxOwkJCS8qIHVudXNlZCAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2JzZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ic2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjEyZDVjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ic2cuaApAQCAtMCwwICsxLDY1IEBACisjaWZuZGVmIEJTR19ICisjZGVmaW5lIEJTR19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEJTR19QUk9UT0NPTF9TQ1NJCQkwCisKKyNkZWZpbmUgQlNHX1NVQl9QUk9UT0NPTF9TQ1NJX0NNRAkwCisjZGVmaW5lIEJTR19TVUJfUFJPVE9DT0xfU0NTSV9UTUYJMQorI2RlZmluZSBCU0dfU1VCX1BST1RPQ09MX1NDU0lfVFJBTlNQT1JUCTIKKworLyoKKyAqIEZvciBmbGFncyBtZW1iZXIgYmVsb3cKKyAqIHNnLmggc2dfaW9faGRyIGFsc28gaGFzIGJpdHMgZGVmaW5lZCBmb3IgaXQncyBmbGFncyBtZW1iZXIuIEhvd2V2ZXIKKyAqIG5vbmUgb2YgdGhlc2UgYml0cyBhcmUgaW1wbGVtZW50ZWQvdXNlZCBieSBic2cuIFRoZSBiaXRzIGJlbG93IGFyZQorICogYWxsb2NhdGVkIHRvIG5vdCBjb25mbGljdCB3aXRoIHNnLmggb25lcyBhbnl3YXkuCisgKi8KKyNkZWZpbmUgQlNHX0ZMQUdfUV9BVF9UQUlMIDB4MTAgLyogZGVmYXVsdCwgPT0gMCBhdCB0aGlzIGJpdCwgaXMgUV9BVF9IRUFEICovCisKK3N0cnVjdCBzZ19pb192NCB7CisJX19zMzIgZ3VhcmQ7CQkvKiBbaV0gJ1EnIHRvIGRpZmZlcmVudGlhdGUgZnJvbSB2MyAqLworCV9fdTMyIHByb3RvY29sOwkJLyogW2ldIDAgLT4gU0NTSSAsIC4uLi4gKi8KKwlfX3UzMiBzdWJwcm90b2NvbDsJLyogW2ldIDAgLT4gU0NTSSBjb21tYW5kLCAxIC0+IFNDU0kgdGFzaworCQkJCSAgIG1hbmFnZW1lbnQgZnVuY3Rpb24sIC4uLi4gKi8KKworCV9fdTMyIHJlcXVlc3RfbGVuOwkvKiBbaV0gaW4gYnl0ZXMgKi8KKwlfX3U2NCByZXF1ZXN0OwkJLyogW2ldLCBbKmldIHtTQ1NJOiBjZGJ9ICovCisJX191NjQgcmVxdWVzdF90YWc7CS8qIFtpXSB7U0NTSTogdGFzayB0YWcgKG9ubHkgaWYgZmxhZ2dlZCl9ICovCisJX191MzIgcmVxdWVzdF9hdHRyOwkvKiBbaV0ge1NDU0k6IHRhc2sgYXR0cmlidXRlfSAqLworCV9fdTMyIHJlcXVlc3RfcHJpb3JpdHk7CS8qIFtpXSB7U0NTSTogdGFzayBwcmlvcml0eX0gKi8KKwlfX3UzMiByZXF1ZXN0X2V4dHJhOwkvKiBbaV0ge3NwYXJlLCBmb3IgcGFkZGluZ30gKi8KKwlfX3UzMiBtYXhfcmVzcG9uc2VfbGVuOwkvKiBbaV0gaW4gYnl0ZXMgKi8KKwlfX3U2NCByZXNwb25zZTsJCS8qIFtpXSwgWypvXSB7U0NTSTogKGF1dG8pc2Vuc2UgZGF0YX0gKi8KKworICAgICAgICAvKiAiZG91dF8iOiBkYXRhIG91dCAodG8gZGV2aWNlKTsgImRpbl8iOiBkYXRhIGluIChmcm9tIGRldmljZSkgKi8KKwlfX3UzMiBkb3V0X2lvdmVjX2NvdW50OwkvKiBbaV0gMCAtPiAiZmxhdCIgZG91dCB0cmFuc2ZlciBlbHNlCisJCQkJICAgZG91dF94ZmVyIHBvaW50cyB0byBhcnJheSBvZiBpb3ZlYyAqLworCV9fdTMyIGRvdXRfeGZlcl9sZW47CS8qIFtpXSBieXRlcyB0byBiZSB0cmFuc2ZlcnJlZCB0byBkZXZpY2UgKi8KKwlfX3UzMiBkaW5faW92ZWNfY291bnQ7CS8qIFtpXSAwIC0+ICJmbGF0IiBkaW4gdHJhbnNmZXIgKi8KKwlfX3UzMiBkaW5feGZlcl9sZW47CS8qIFtpXSBieXRlcyB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIGRldmljZSAqLworCV9fdTY0IGRvdXRfeGZlcnA7CS8qIFtpXSwgWyppXSAqLworCV9fdTY0IGRpbl94ZmVycDsJLyogW2ldLCBbKm9dICovCisKKwlfX3UzMiB0aW1lb3V0OwkJLyogW2ldIHVuaXRzOiBtaWxsaXNlY29uZCAqLworCV9fdTMyIGZsYWdzOwkJLyogW2ldIGJpdCBtYXNrICovCisJX191NjQgdXNyX3B0cjsJCS8qIFtpLT5vXSB1bnVzZWQgaW50ZXJuYWxseSAqLworCV9fdTMyIHNwYXJlX2luOwkJLyogW2ldICovCisKKwlfX3UzMiBkcml2ZXJfc3RhdHVzOwkvKiBbb10gMCAtPiBvayAqLworCV9fdTMyIHRyYW5zcG9ydF9zdGF0dXM7CS8qIFtvXSAwIC0+IG9rICovCisJX191MzIgZGV2aWNlX3N0YXR1czsJLyogW29dIHtTQ1NJOiBjb21tYW5kIGNvbXBsZXRpb24gc3RhdHVzfSAqLworCV9fdTMyIHJldHJ5X2RlbGF5OwkvKiBbb10ge1NDU0k6IHN0YXR1cyBhdXhpbGlhcnkgaW5mb3JtYXRpb259ICovCisJX191MzIgaW5mbzsJCS8qIFtvXSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICovCisJX191MzIgZHVyYXRpb247CQkvKiBbb10gdGltZSB0byBjb21wbGV0ZSwgaW4gbWlsbGlzZWNvbmRzICovCisJX191MzIgcmVzcG9uc2VfbGVuOwkvKiBbb10gYnl0ZXMgb2YgcmVzcG9uc2UgYWN0dWFsbHkgd3JpdHRlbiAqLworCV9fczMyIGRpbl9yZXNpZDsJLyogW29dIGRpbl94ZmVyX2xlbiAtIGFjdHVhbF9kaW5feGZlcl9sZW4gKi8KKwlfX3MzMiBkb3V0X3Jlc2lkOwkvKiBbb10gZG91dF94ZmVyX2xlbiAtIGFjdHVhbF9kb3V0X3hmZXJfbGVuICovCisJX191NjQgZ2VuZXJhdGVkX3RhZzsJLyogW29dIHtTQ1NJOiB0cmFuc3BvcnQgZ2VuZXJhdGVkIHRhc2sgdGFnfSAqLworCV9fdTMyIHNwYXJlX291dDsJLyogW29dICovCisKKwlfX3UzMiBwYWRkaW5nOworfTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGVmOThkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oCkBAIC0wLDAgKzEsMTA1IEBACisjaWZuZGVmIF9MSU5VWF9CWVRFT1JERVJfQklHX0VORElBTl9ICisjZGVmaW5lIF9MSU5VWF9CWVRFT1JERVJfQklHX0VORElBTl9ICisKKyNpZm5kZWYgX19CSUdfRU5ESUFOCisjZGVmaW5lIF9fQklHX0VORElBTiA0MzIxCisjZW5kaWYKKyNpZm5kZWYgX19CSUdfRU5ESUFOX0JJVEZJRUxECisjZGVmaW5lIF9fQklHX0VORElBTl9CSVRGSUVMRAorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YWIuaD4KKworI2RlZmluZSBfX2NvbnN0YW50X2h0b25sKHgpICgoX19iZTMyKShfX3UzMikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbnRvaGwoeCkgKChfX3UzMikoX19iZTMyKSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9odG9ucyh4KSAoKF9fYmUxNikoX191MTYpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X250b2hzKHgpICgoX191MTYpKF9fYmUxNikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2xlNjQoeCkgKChfX2xlNjQpX19fY29uc3RhbnRfc3dhYjY0KCh4KSkpCisjZGVmaW5lIF9fY29uc3RhbnRfbGU2NF90b19jcHUoeCkgX19fY29uc3RhbnRfc3dhYjY0KChfX3U2NCkoX19sZTY0KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fbGUzMih4KSAoKF9fbGUzMilfX19jb25zdGFudF9zd2FiMzIoKHgpKSkKKyNkZWZpbmUgX19jb25zdGFudF9sZTMyX3RvX2NwdSh4KSBfX19jb25zdGFudF9zd2FiMzIoKF9fdTMyKShfX2xlMzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTE2KHgpICgoX19sZTE2KV9fX2NvbnN0YW50X3N3YWIxNigoeCkpKQorI2RlZmluZSBfX2NvbnN0YW50X2xlMTZfdG9fY3B1KHgpIF9fX2NvbnN0YW50X3N3YWIxNigoX191MTYpKF9fbGUxNikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlNjQoeCkgKChfX2JlNjQpKF9fdTY0KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9iZTY0X3RvX2NwdSh4KSAoKF9fdTY0KShfX2JlNjQpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19iZTMyKHgpICgoX19iZTMyKShfX3UzMikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfYmUzMl90b19jcHUoeCkgKChfX3UzMikoX19iZTMyKSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fYmUxNih4KSAoKF9fYmUxNikoX191MTYpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2JlMTZfdG9fY3B1KHgpICgoX191MTYpKF9fYmUxNikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlNjQoeCkgKChfX2xlNjQpX19zd2FiNjQoKHgpKSkKKyNkZWZpbmUgX19sZTY0X3RvX2NwdSh4KSBfX3N3YWI2NCgoX191NjQpKF9fbGU2NCkoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlMzIoeCkgKChfX2xlMzIpX19zd2FiMzIoKHgpKSkKKyNkZWZpbmUgX19sZTMyX3RvX2NwdSh4KSBfX3N3YWIzMigoX191MzIpKF9fbGUzMikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlMTYoeCkgKChfX2xlMTYpX19zd2FiMTYoKHgpKSkKKyNkZWZpbmUgX19sZTE2X3RvX2NwdSh4KSBfX3N3YWIxNigoX191MTYpKF9fbGUxNikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlNjQoeCkgKChfX2JlNjQpKF9fdTY0KSh4KSkKKyNkZWZpbmUgX19iZTY0X3RvX2NwdSh4KSAoKF9fdTY0KShfX2JlNjQpKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTMyKHgpICgoX19iZTMyKShfX3UzMikoeCkpCisjZGVmaW5lIF9fYmUzMl90b19jcHUoeCkgKChfX3UzMikoX19iZTMyKSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUxNih4KSAoKF9fYmUxNikoX191MTYpKHgpKQorI2RlZmluZSBfX2JlMTZfdG9fY3B1KHgpICgoX191MTYpKF9fYmUxNikoeCkpCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbGU2NCBfX2NwdV90b19sZTY0cChjb25zdCBfX3U2NCAqcCkKK3sKKwlyZXR1cm4gKF9fbGU2NClfX3N3YWI2NHAocCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3U2NCBfX2xlNjRfdG9fY3B1cChjb25zdCBfX2xlNjQgKnApCit7CisJcmV0dXJuIF9fc3dhYjY0cCgoX191NjQgKilwKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fbGUzMiBfX2NwdV90b19sZTMycChjb25zdCBfX3UzMiAqcCkKK3sKKwlyZXR1cm4gKF9fbGUzMilfX3N3YWIzMnAocCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBfX2xlMzJfdG9fY3B1cChjb25zdCBfX2xlMzIgKnApCit7CisJcmV0dXJuIF9fc3dhYjMycCgoX191MzIgKilwKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fbGUxNiBfX2NwdV90b19sZTE2cChjb25zdCBfX3UxNiAqcCkKK3sKKwlyZXR1cm4gKF9fbGUxNilfX3N3YWIxNnAocCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3UxNiBfX2xlMTZfdG9fY3B1cChjb25zdCBfX2xlMTYgKnApCit7CisJcmV0dXJuIF9fc3dhYjE2cCgoX191MTYgKilwKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fYmU2NCBfX2NwdV90b19iZTY0cChjb25zdCBfX3U2NCAqcCkKK3sKKwlyZXR1cm4gKF9fYmU2NCkqcDsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTY0IF9fYmU2NF90b19jcHVwKGNvbnN0IF9fYmU2NCAqcCkKK3sKKwlyZXR1cm4gKF9fdTY0KSpwOworfQorc3RhdGljIF9faW5saW5lX18gX19iZTMyIF9fY3B1X3RvX2JlMzJwKGNvbnN0IF9fdTMyICpwKQoreworCXJldHVybiAoX19iZTMyKSpwOworfQorc3RhdGljIF9faW5saW5lX18gX191MzIgX19iZTMyX3RvX2NwdXAoY29uc3QgX19iZTMyICpwKQoreworCXJldHVybiAoX191MzIpKnA7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX2JlMTYgX19jcHVfdG9fYmUxNnAoY29uc3QgX191MTYgKnApCit7CisJcmV0dXJuIChfX2JlMTYpKnA7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3UxNiBfX2JlMTZfdG9fY3B1cChjb25zdCBfX2JlMTYgKnApCit7CisJcmV0dXJuIChfX3UxNikqcDsKK30KKyNkZWZpbmUgX19jcHVfdG9fbGU2NHMoeCkgX19zd2FiNjRzKCh4KSkKKyNkZWZpbmUgX19sZTY0X3RvX2NwdXMoeCkgX19zd2FiNjRzKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUzMnMoeCkgX19zd2FiMzJzKCh4KSkKKyNkZWZpbmUgX19sZTMyX3RvX2NwdXMoeCkgX19zd2FiMzJzKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUxNnMoeCkgX19zd2FiMTZzKCh4KSkKKyNkZWZpbmUgX19sZTE2X3RvX2NwdXMoeCkgX19zd2FiMTZzKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmU2NHMoeCkgZG8geyAodm9pZCkoeCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIF9fYmU2NF90b19jcHVzKHgpIGRvIHsgKHZvaWQpKHgpOyB9IHdoaWxlICgwKQorI2RlZmluZSBfX2NwdV90b19iZTMycyh4KSBkbyB7ICh2b2lkKSh4KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgX19iZTMyX3RvX2NwdXMoeCkgZG8geyAodm9pZCkoeCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIF9fY3B1X3RvX2JlMTZzKHgpIGRvIHsgKHZvaWQpKHgpOyB9IHdoaWxlICgwKQorI2RlZmluZSBfX2JlMTZfdG9fY3B1cyh4KSBkbyB7ICh2b2lkKSh4KTsgfSB3aGlsZSAoMCkKKworCisjZW5kaWYgLyogX0xJTlVYX0JZVEVPUkRFUl9CSUdfRU5ESUFOX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGU4YTE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oCkBAIC0wLDAgKzEsMTA1IEBACisjaWZuZGVmIF9MSU5VWF9CWVRFT1JERVJfTElUVExFX0VORElBTl9ICisjZGVmaW5lIF9MSU5VWF9CWVRFT1JERVJfTElUVExFX0VORElBTl9ICisKKyNpZm5kZWYgX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIF9fTElUVExFX0VORElBTiAxMjM0CisjZW5kaWYKKyNpZm5kZWYgX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxECisjZGVmaW5lIF9fTElUVExFX0VORElBTl9CSVRGSUVMRAorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YWIuaD4KKworI2RlZmluZSBfX2NvbnN0YW50X2h0b25sKHgpICgoX19iZTMyKV9fX2NvbnN0YW50X3N3YWIzMigoeCkpKQorI2RlZmluZSBfX2NvbnN0YW50X250b2hsKHgpIF9fX2NvbnN0YW50X3N3YWIzMigoX19iZTMyKSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9odG9ucyh4KSAoKF9fYmUxNilfX19jb25zdGFudF9zd2FiMTYoKHgpKSkKKyNkZWZpbmUgX19jb25zdGFudF9udG9ocyh4KSBfX19jb25zdGFudF9zd2FiMTYoKF9fYmUxNikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2xlNjQoeCkgKChfX2xlNjQpKF9fdTY0KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9sZTY0X3RvX2NwdSh4KSAoKF9fdTY0KShfX2xlNjQpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTMyKHgpICgoX19sZTMyKShfX3UzMikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbGUzMl90b19jcHUoeCkgKChfX3UzMikoX19sZTMyKSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fbGUxNih4KSAoKF9fbGUxNikoX191MTYpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2xlMTZfdG9fY3B1KHgpICgoX191MTYpKF9fbGUxNikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlNjQoeCkgKChfX2JlNjQpX19fY29uc3RhbnRfc3dhYjY0KCh4KSkpCisjZGVmaW5lIF9fY29uc3RhbnRfYmU2NF90b19jcHUoeCkgX19fY29uc3RhbnRfc3dhYjY0KChfX3U2NCkoX19iZTY0KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fYmUzMih4KSAoKF9fYmUzMilfX19jb25zdGFudF9zd2FiMzIoKHgpKSkKKyNkZWZpbmUgX19jb25zdGFudF9iZTMyX3RvX2NwdSh4KSBfX19jb25zdGFudF9zd2FiMzIoKF9fdTMyKShfX2JlMzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19iZTE2KHgpICgoX19iZTE2KV9fX2NvbnN0YW50X3N3YWIxNigoeCkpKQorI2RlZmluZSBfX2NvbnN0YW50X2JlMTZfdG9fY3B1KHgpIF9fX2NvbnN0YW50X3N3YWIxNigoX191MTYpKF9fYmUxNikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlNjQoeCkgKChfX2xlNjQpKF9fdTY0KSh4KSkKKyNkZWZpbmUgX19sZTY0X3RvX2NwdSh4KSAoKF9fdTY0KShfX2xlNjQpKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTMyKHgpICgoX19sZTMyKShfX3UzMikoeCkpCisjZGVmaW5lIF9fbGUzMl90b19jcHUoeCkgKChfX3UzMikoX19sZTMyKSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUxNih4KSAoKF9fbGUxNikoX191MTYpKHgpKQorI2RlZmluZSBfX2xlMTZfdG9fY3B1KHgpICgoX191MTYpKF9fbGUxNikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlNjQoeCkgKChfX2JlNjQpX19zd2FiNjQoKHgpKSkKKyNkZWZpbmUgX19iZTY0X3RvX2NwdSh4KSBfX3N3YWI2NCgoX191NjQpKF9fYmU2NCkoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMzIoeCkgKChfX2JlMzIpX19zd2FiMzIoKHgpKSkKKyNkZWZpbmUgX19iZTMyX3RvX2NwdSh4KSBfX3N3YWIzMigoX191MzIpKF9fYmUzMikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMTYoeCkgKChfX2JlMTYpX19zd2FiMTYoKHgpKSkKKyNkZWZpbmUgX19iZTE2X3RvX2NwdSh4KSBfX3N3YWIxNigoX191MTYpKF9fYmUxNikoeCkpCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbGU2NCBfX2NwdV90b19sZTY0cChjb25zdCBfX3U2NCAqcCkKK3sKKwlyZXR1cm4gKF9fbGU2NCkqcDsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTY0IF9fbGU2NF90b19jcHVwKGNvbnN0IF9fbGU2NCAqcCkKK3sKKwlyZXR1cm4gKF9fdTY0KSpwOworfQorc3RhdGljIF9faW5saW5lX18gX19sZTMyIF9fY3B1X3RvX2xlMzJwKGNvbnN0IF9fdTMyICpwKQoreworCXJldHVybiAoX19sZTMyKSpwOworfQorc3RhdGljIF9faW5saW5lX18gX191MzIgX19sZTMyX3RvX2NwdXAoY29uc3QgX19sZTMyICpwKQoreworCXJldHVybiAoX191MzIpKnA7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX2xlMTYgX19jcHVfdG9fbGUxNnAoY29uc3QgX191MTYgKnApCit7CisJcmV0dXJuIChfX2xlMTYpKnA7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3UxNiBfX2xlMTZfdG9fY3B1cChjb25zdCBfX2xlMTYgKnApCit7CisJcmV0dXJuIChfX3UxNikqcDsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fYmU2NCBfX2NwdV90b19iZTY0cChjb25zdCBfX3U2NCAqcCkKK3sKKwlyZXR1cm4gKF9fYmU2NClfX3N3YWI2NHAocCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3U2NCBfX2JlNjRfdG9fY3B1cChjb25zdCBfX2JlNjQgKnApCit7CisJcmV0dXJuIF9fc3dhYjY0cCgoX191NjQgKilwKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fYmUzMiBfX2NwdV90b19iZTMycChjb25zdCBfX3UzMiAqcCkKK3sKKwlyZXR1cm4gKF9fYmUzMilfX3N3YWIzMnAocCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBfX2JlMzJfdG9fY3B1cChjb25zdCBfX2JlMzIgKnApCit7CisJcmV0dXJuIF9fc3dhYjMycCgoX191MzIgKilwKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fYmUxNiBfX2NwdV90b19iZTE2cChjb25zdCBfX3UxNiAqcCkKK3sKKwlyZXR1cm4gKF9fYmUxNilfX3N3YWIxNnAocCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3UxNiBfX2JlMTZfdG9fY3B1cChjb25zdCBfX2JlMTYgKnApCit7CisJcmV0dXJuIF9fc3dhYjE2cCgoX191MTYgKilwKTsKK30KKyNkZWZpbmUgX19jcHVfdG9fbGU2NHMoeCkgZG8geyAodm9pZCkoeCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIF9fbGU2NF90b19jcHVzKHgpIGRvIHsgKHZvaWQpKHgpOyB9IHdoaWxlICgwKQorI2RlZmluZSBfX2NwdV90b19sZTMycyh4KSBkbyB7ICh2b2lkKSh4KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgX19sZTMyX3RvX2NwdXMoeCkgZG8geyAodm9pZCkoeCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIF9fY3B1X3RvX2xlMTZzKHgpIGRvIHsgKHZvaWQpKHgpOyB9IHdoaWxlICgwKQorI2RlZmluZSBfX2xlMTZfdG9fY3B1cyh4KSBkbyB7ICh2b2lkKSh4KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgX19jcHVfdG9fYmU2NHMoeCkgX19zd2FiNjRzKCh4KSkKKyNkZWZpbmUgX19iZTY0X3RvX2NwdXMoeCkgX19zd2FiNjRzKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUzMnMoeCkgX19zd2FiMzJzKCh4KSkKKyNkZWZpbmUgX19iZTMyX3RvX2NwdXMoeCkgX19zd2FiMzJzKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUxNnMoeCkgX19zd2FiMTZzKCh4KSkKKyNkZWZpbmUgX19iZTE2X3RvX2NwdXMoeCkgX19zd2FiMTZzKCh4KSkKKworCisjZW5kaWYgLyogX0xJTlVYX0JZVEVPUkRFUl9MSVRUTEVfRU5ESUFOX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2FpZi9jYWlmX3NvY2tldC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYWlmL2NhaWZfc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YzYmFjNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2FpZi9jYWlmX3NvY2tldC5oCkBAIC0wLDAgKzEsMTk0IEBACisvKiBsaW51eC9jYWlmX3NvY2tldC5oCisgKiBDQUlGIERlZmluaXRpb25zIGZvciBDQUlGIHNvY2tldCBhbmQgbmV0d29yayBsYXllcgorICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBBQiAyMDEwCisgKiBBdXRob3I6CSBTanVyIEJyZW5kZWxhbmQvIHNqdXIuYnJhbmRlbGFuZEBzdGVyaWNzc29uLmNvbQorICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCisgKi8KKworI2lmbmRlZiBfTElOVVhfQ0FJRl9TT0NLRVRfSAorI2RlZmluZSBfTElOVVhfQ0FJRl9TT0NLRVRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKworLyoqCisgKiBlbnVtIGNhaWZfbGlua19zZWxlY3RvciAtICAgIFBoeXNpY2FsIExpbmsgU2VsZWN0aW9uLgorICogQENBSUZfTElOS19ISUdIX0JBTkRXOglQaHlzaWNhbCBpbnRlcmZhY2UgZm9yIGhpZ2gtYmFuZHdpZHRoCisgKgkJCQl0cmFmZmljLgorICogQENBSUZfTElOS19MT1dfTEFURU5DWToJUGh5c2ljYWwgaW50ZXJmYWNlIGZvciBsb3ctbGF0ZW5jeQorICoJCQkJdHJhZmZpYy4KKyAqCisgKiBDQUlGIExpbmsgTGF5ZXJzIGNhbiByZWdpc3RlciB0aGVpciBsaW5rIHByb3BlcnRpZXMuCisgKiBUaGlzIGVudW0gaXMgdXNlZCBmb3IgY2hvb3NpbmcgYmV0d2VlbiBDQUlGIExpbmsgTGF5ZXJzIHdoZW4KKyAqIHNldHRpbmcgdXAgQ0FJRiBDaGFubmVscyB3aGVuIG11bHRpcGxlIENBSUYgTGluayBMYXllcnMgZXhpc3RzLgorICovCitlbnVtIGNhaWZfbGlua19zZWxlY3RvciB7CisJQ0FJRl9MSU5LX0hJR0hfQkFORFcsCisJQ0FJRl9MSU5LX0xPV19MQVRFTkNZCit9OworCisvKioKKyAqIGVudW0gY2FpZl9jaGFubmVsX3ByaW9yaXR5IC0gQ0FJRiBjaGFubmVsIHByaW9yaXRpZXMuCisgKgorICogQENBSUZfUFJJT19NSU46CU1pbiBwcmlvcml0eSBmb3IgYSBjaGFubmVsLgorICogQENBSUZfUFJJT19MT1c6CUxvdy1wcmlvcml0eSBjaGFubmVsLgorICogQENBSUZfUFJJT19OT1JNQUw6CU5vcm1hbC9kZWZhdWx0IHByaW9yaXR5IGxldmVsLgorICogQENBSUZfUFJJT19ISUdIOglIaWdoIHByaW9yaXR5IGxldmVsCisgKiBAQ0FJRl9QUklPX01BWDoJTWF4IHByaW9yaXR5IGZvciBjaGFubmVsCisgKgorICogUHJpb3JpdHkgY2FuIGJlIHNldCBvbiBDQUlGIENoYW5uZWxzIGluIG9yZGVyIHRvCisgKiBwcmlvcml0aXplIGJldHdlZW4gdHJhZmZpYyBvbiBkaWZmZXJlbnQgQ0FJRiBDaGFubmVscy4KKyAqIFRoZXNlIHByaW9yaXR5IGxldmVscyBhcmUgcmVjb21tZW5kZWQsIGJ1dCB0aGUgcHJpb3JpdHkgdmFsdWUKKyAqIGlzIG5vdCByZXN0cmljdGVkIHRvIHRoZSB2YWx1ZXMgZGVmaW5lZCBpbiB0aGlzIGVudW0sIGFueSB2YWx1ZQorICogYmV0d2VlbiBDQUlGX1BSSU9fTUlOIGFuZCBDQUlGX1BSSU9fTUFYIGNvdWxkIGJlIHVzZWQuCisgKi8KK2VudW0gY2FpZl9jaGFubmVsX3ByaW9yaXR5IHsKKwlDQUlGX1BSSU9fTUlOCSA9IDB4MDEsCisJQ0FJRl9QUklPX0xPVwkgPSAweDA0LAorCUNBSUZfUFJJT19OT1JNQUwgPSAweDBmLAorCUNBSUZfUFJJT19ISUdICSA9IDB4MTQsCisJQ0FJRl9QUklPX01BWAkgPSAweDFGCit9OworCisvKioKKyAqIGVudW0gY2FpZl9wcm90b2NvbF90eXBlICAtCUNBSUYgQ2hhbm5lbCB0eXBlLgorICogQENBSUZQUk9UT19BVDoJCUNsYXNzaWMgQVQgY2hhbm5lbC4KKyAqIEBDQUlGUFJPVE9fREFUQUdSQU06CURhdGFncmFtIGNoYW5uZWwuCisgKiBAQ0FJRlBST1RPX0RBVEFHUkFNX0xPT1A6CURhdGFncmFtIGxvb3BiYWNrIGNoYW5uZWwsIHVzZWQgZm9yIHRlc3RpbmcuCisgKiBAQ0FJRlBST1RPX1VUSUw6CQlVdGlsaXR5IChQc29jaykgY2hhbm5lbC4KKyAqIEBDQUlGUFJPVE9fUkZNOgkJUmVtb3RlIEZpbGUgTWFuYWdlcgorICogQENBSUZQUk9UT19ERUJVRzoJCURlYnVnIGxpbmsKKyAqCisgKiBUaGlzIGVudW0gZGVmaW5lcyB0aGUgQ0FJRiBDaGFubmVsIHR5cGUgdG8gYmUgdXNlZC4gVGhpcyBkZWZpbmVzCisgKiB0aGUgc2VydmljZSB0byBjb25uZWN0IHRvIG9uIHRoZSBtb2RlbS4KKyAqLworZW51bSBjYWlmX3Byb3RvY29sX3R5cGUgeworCUNBSUZQUk9UT19BVCwKKwlDQUlGUFJPVE9fREFUQUdSQU0sCisJQ0FJRlBST1RPX0RBVEFHUkFNX0xPT1AsCisJQ0FJRlBST1RPX1VUSUwsCisJQ0FJRlBST1RPX1JGTSwKKwlDQUlGUFJPVE9fREVCVUcsCisJX0NBSUZQUk9UT19NQVgKK307CisjZGVmaW5lCUNBSUZQUk9UT19NQVggX0NBSUZQUk9UT19NQVgKKworLyoqCisgKiBlbnVtIGNhaWZfYXRfdHlwZSAtIEFUIFNlcnZpY2UgRW5kcG9pbnQKKyAqIEBDQUlGX0FUVFlQRV9QTEFJTjoJICAgICBDb25uZWN0cyB0byBhIHBsYWluIHZhbmlsbGEgQVQgY2hhbm5lbC4KKyAqLworZW51bSBjYWlmX2F0X3R5cGUgeworCUNBSUZfQVRUWVBFX1BMQUlOID0gMgorfTsKKyAvKioKKyAqIGVudW0gY2FpZl9kZWJ1Z190eXBlIC0gQ29udGVudCBzZWxlY3Rpb24gZm9yIGRlYnVnIGNvbm5lY3Rpb24KKyAqIEBDQUlGX0RFQlVHX1RSQUNFX0lOVEVSQUNUSVZFOiBDb25uZWN0aW9uIHdpbGwgY29udGFpbgorICoJCQkJYm90aCB0cmFjZSBhbmQgaW50ZXJhY3RpdmUgZGVidWcuCisgKiBAQ0FJRl9ERUJVR19UUkFDRToJCUNvbm5lY3Rpb24gY29udGFpbnMgdHJhY2Ugb25seS4KKyAqIEBDQUlGX0RFQlVHX0lOVEVSQUNUSVZFOglDb25uZWN0aW9uIHRvIGludGVyYWN0aXZlIGRlYnVnLgorICovCitlbnVtIGNhaWZfZGVidWdfdHlwZSB7CisJQ0FJRl9ERUJVR19UUkFDRV9JTlRFUkFDVElWRSA9IDAsCisJQ0FJRl9ERUJVR19UUkFDRSwKKwlDQUlGX0RFQlVHX0lOVEVSQUNUSVZFLAorfTsKKworLyoqCisgKiBlbnVtIGNhaWZfZGVidWdfc2VydmljZSAtIERlYnVnIFNlcnZpY2UgRW5kcG9pbnQKKyAqIEBDQUlGX1JBRElPX0RFQlVHX1NFUlZJQ0U6CURlYnVnIHNlcnZpY2Ugb24gdGhlIFJhZGlvIHN1Yi1zeXN0ZW0KKyAqIEBDQUlGX0FQUF9ERUJVR19TRVJWSUNFOglEZWJ1ZyBmb3IgdGhlIGFwcGxpY2F0aW9ucyBzdWItc3lzdGVtCisgKi8KK2VudW0gY2FpZl9kZWJ1Z19zZXJ2aWNlIHsKKwlDQUlGX1JBRElPX0RFQlVHX1NFUlZJQ0UgPSAxLAorCUNBSUZfQVBQX0RFQlVHX1NFUlZJQ0UKK307CisKKy8qKgorICogc3RydWN0IHNvY2thZGRyX2NhaWYgLSB0aGUgc29ja2FkZHIgc3RydWN0dXJlIGZvciBDQUlGIHNvY2tldHMuCisgKiBAZmFtaWx5OgkJICAgICBBZGRyZXNzIGZhbWlseSBudW1iZXIsIG11c3QgYmUgQUZfQ0FJRi4KKyAqIEB1OgkJCSAgICAgVW5pb24gb2YgYWRkcmVzcyBkYXRhICdzd2l0Y2hlZCcgYnkgZmFtaWx5LgorICogOgorICogQHUuYXQ6ICAgICAgICAgICAgICAgICAgICBBcHBsaWVzIHdoZW4gZmFtaWx5ID0gQ0FJRlBST1RPX0FULgorICoKKyAqIEB1LmF0LnR5cGU6ICAgICAgICAgICAgICAgVHlwZSBvZiBBVCBsaW5rIHRvIHNldCB1cCAoZW51bSBjYWlmX2F0X3R5cGUpLgorICoKKyAqIEB1LnV0aWw6ICAgICAgICAgICAgICAgICAgQXBwbGllcyB3aGVuIGZhbWlseSA9IENBSUZQUk9UT19VVElMCisgKgorICogQHUudXRpbC5zZXJ2aWNlOiAgICAgICAgICBVdGlsaXR5IHNlcnZpY2UgbmFtZS4KKyAqCisgKiBAdS5kZ206ICAgICAgICAgICAgICAgICAgIEFwcGxpZXMgd2hlbiBmYW1pbHkgPSBDQUlGUFJPVE9fREFUQUdSQU0KKyAqCisgKiBAdS5kZ20uY29ubmVjdGlvbl9pZDogICAgIERhdGFncmFtIGNvbm5lY3Rpb24gaWQuCisgKgorICogQHUuZGdtLm5zYXBpOiAgICAgICAgICAgICBOU0FQSSBvZiB0aGUgUERQLUNvbnRleHQuCisgKgorICogQHUucmZtOiAgICAgICAgICAgICAgICAgICBBcHBsaWVzIHdoZW4gZmFtaWx5ID0gQ0FJRlBST1RPX1JGTQorICoKKyAqIEB1LnJmbS5jb25uZWN0aW9uX2lkOiAgICAgQ29ubmVjdGlvbiBJRCBmb3IgUkZNLgorICoKKyAqIEB1LnJmbS52b2x1bWU6ICAgICAgICAgICAgVm9sdW1lIHRvIG1vdW50LgorICoKKyAqIEB1LmRiZzoJCSAgICAgIEFwcGxpZXMgd2hlbiBmYW1pbHkgPSBDQUlGUFJPVE9fREVCVUcuCisgKgorICogQHUuZGJnLnR5cGU6CQkJICAgICBUeXBlIG9mIGRlYnVnIGNvbm5lY3Rpb24gdG8gc2V0IHVwCisgKgkJCSAgICAgIChjYWlmX2RlYnVnX3R5cGUpLgorICoKKyAqIEB1LmRiZy5zZXJ2aWNlOgkgICAgICBTZXJ2aWNlIHN1Yi1zeXN0ZW0gdG8gY29ubmVjdCAoY2FpZl9kZWJ1Z19zZXJ2aWNlCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgc3RydWN0dXJlIGhvbGRzIHRoZSBjb25uZWN0IHBhcmFtZXRlcnMgdXNlZCBmb3Igc2V0dGluZyB1cCBhCisgKiBDQUlGIENoYW5uZWwuIEl0IGRlZmluZXMgdGhlIHNlcnZpY2UgdG8gY29ubmVjdCB0byBvbiB0aGUgbW9kZW0uCisgKi8KK3N0cnVjdCBzb2NrYWRkcl9jYWlmIHsKKwlfX2tlcm5lbF9zYV9mYW1pbHlfdCAgZmFtaWx5OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTggIHR5cGU7CQkvKiB0eXBlOiBlbnVtIGNhaWZfYXRfdHlwZSAqLworCQl9IGF0OwkJCQkvKiBDQUlGUFJPVE9fQVQgKi8KKwkJc3RydWN0IHsKKwkJCWNoYXIJICBzZXJ2aWNlWzE2XTsKKwkJfSB1dGlsOwkJCQkvKiBDQUlGUFJPVE9fVVRJTCAqLworCQl1bmlvbiB7CisJCQlfX3UzMiBjb25uZWN0aW9uX2lkOworCQkJX191OCAgbnNhcGk7CisJCX0gZGdtOwkJCQkvKiBDQUlGUFJPVE9fREFUQUdSQU0oX0xPT1ApKi8KKwkJc3RydWN0IHsKKwkJCV9fdTMyIGNvbm5lY3Rpb25faWQ7CisJCQljaGFyCSAgdm9sdW1lWzE2XTsKKwkJfSByZm07CQkJCS8qIENBSUZQUk9UT19SRk0gKi8KKwkJc3RydWN0IHsKKwkJCV9fdTggIHR5cGU7CQkvKiB0eXBlOmVudW0gY2FpZl9kZWJ1Z190eXBlICovCisJCQlfX3U4ICBzZXJ2aWNlOwkJLyogc2VydmljZTpjYWlmX2RlYnVnX3NlcnZpY2UgKi8KKwkJfSBkYmc7CQkJCS8qIENBSUZQUk9UT19ERUJVRyAqLworCX0gdTsKK307CisKKy8qKgorICogZW51bSBjYWlmX3NvY2tldF9vcHRzIC0gQ0FJRiBvcHRpb24gdmFsdWVzIGZvciBnZXRzb2Nrb3B0IGFuZCBzZXRzb2Nrb3B0LgorICoKKyAqIEBDQUlGU09fTElOS19TRUxFQ1Q6CQlTZWxlY3RvciB1c2VkIGlmIG11bHRpcGxlIENBSUYgTGluayBsYXllcnMgYXJlCisgKgkJCQlhdmFpbGFibGUuIEVpdGhlciBhIGhpZ2ggYmFuZHdpZHRoCisgKgkJCQlsaW5rIGNhbiBiZSBzZWxlY3RlZCAoQ0FJRl9MSU5LX0hJR0hfQkFORFcpIG9yCisgKgkJCQlvciBhIGxvdyBsYXRlbmN5IGxpbmsgKENBSUZfTElOS19MT1dfTEFURU5DWSkuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGlzIG9mIHR5cGUgX191MzIuCisgKgkJCQlBbHRlcm5hdGl2ZWx5IFNPX0JJTkRUT0RFVklDRSBjYW4gYmUgdXNlZC4KKyAqCisgKiBAQ0FJRlNPX1JFUV9QQVJBTToJCVVzZWQgdG8gc2V0IHRoZSByZXF1ZXN0IHBhcmFtZXRlcnMgZm9yIGEKKyAqCQkJCXV0aWxpdHkgY2hhbm5lbC4gKG1heGltdW0gMjU2IGJ5dGVzKS4gVGhpcworICoJCQkJb3B0aW9uIG11c3QgYmUgc2V0IGJlZm9yZSBjb25uZWN0aW5nLgorICoKKyAqIEBDQUlGU09fUlNQX1BBUkFNOgkJR2V0cyB0aGUgcmVzcG9uc2UgcGFyYW1ldGVycyBmb3IgYSB1dGlsaXR5CisgKgkJCQljaGFubmVsLiAobWF4aW11bSAyNTYgYnl0ZXMpLiBUaGlzIG9wdGlvbgorICoJCQkJaXMgdmFsaWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNvbm5lY3QuCisgKgorICoKKyAqIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBDQUlGIFNvY2tldCBvcHRpb25zIHRvIGJlIHVzZWQgb24gYSBzb2NrZXQKKyAqIG9mIHR5cGUgUEZfQ0FJRi4KKyAqCisgKi8KK2VudW0gY2FpZl9zb2NrZXRfb3B0cyB7CisJQ0FJRlNPX0xJTktfU0VMRUNUCT0gMTI3LAorCUNBSUZTT19SRVFfUEFSQU0JPSAxMjgsCisJQ0FJRlNPX1JTUF9QQVJBTQk9IDEyOSwKK307CisKKyNlbmRpZiAvKiBfTElOVVhfQ0FJRl9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYWlmL2lmX2NhaWYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2FpZi9pZl9jYWlmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU3ZWVkNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2FpZi9pZl9jYWlmLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgU1QtRXJpY3Nzb24gQUIgMjAxMAorICogQXV0aG9yOglTanVyIEJyZW5kZWxhbmQvIHNqdXIuYnJhbmRlbGFuZEBzdGVyaWNzc29uLmNvbQorICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCisgKi8KKworI2lmbmRlZiBJRl9DQUlGX0hfCisjZGVmaW5lIElGX0NBSUZfSF8KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKworLyoqCisgKiBlbnVtIGlmbGFfY2FpZiAtIENBSUYgTmV0bGlua1JUIHBhcmFtZXRlcnMuCisgKiBASUZMQV9DQUlGX0lQVjRfQ09OTklEOiAgQ29ubmVjdGlvbiBJRCBmb3IgSVB2NCBQRFAgQ29udGV4dC4KKyAqCQkJICAgIFRoZSB0eXBlIG9mIGF0dHJpYnV0ZSBpcyBOTEFfVTMyLgorICogQElGTEFfQ0FJRl9JUFY2X0NPTk5JRDogIENvbm5lY3Rpb24gSUQgZm9yIElQdjYgUERQIENvbnRleHQuCisgKgkJCSAgICBUaGUgdHlwZSBvZiBhdHRyaWJ1dGUgaXMgTkxBX1UzMi4KKyAqIEBJRkxBX0NBSUZfTE9PUEJBQ0s6CSAgICBJZiBkaWZmZXJlbnQgZnJvbSB6ZXJvLCBkZXZpY2UgaXMgZG9pbmcgbG9vcGJhY2sKKyAqCQkJICAgIFRoZSB0eXBlIG9mIGF0dHJpYnV0ZSBpcyBOTEFfVTguCisgKgorICogV2hlbiB1c2luZyBSVCBOZXRsaW5rIHRvIGNyZWF0ZSwgZGVzdHJveSBvciBjb25maWd1cmUgYSBDQUlGIElQIGludGVyZmFjZSwKKyAqIGVudW0gaWZsYV9jYWlmIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzLgorICovCitlbnVtIGlmbGFfY2FpZiB7CisJX19JRkxBX0NBSUZfVU5TUEVDLAorCUlGTEFfQ0FJRl9JUFY0X0NPTk5JRCwKKwlJRkxBX0NBSUZfSVBWNl9DT05OSUQsCisJSUZMQV9DQUlGX0xPT1BCQUNLLAorCV9fSUZMQV9DQUlGX01BWAorfTsKKyNkZWZpbmUJSUZMQV9DQUlGX01BWCAoX19JRkxBX0NBSUZfTUFYLTEpCisKKyNlbmRpZiAvKklGX0NBSUZfSF8qLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2FuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExOWJjYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2FuLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBsaW51eC9jYW4uaAorICoKKyAqIERlZmluaXRpb25zIGZvciBDQU4gbmV0d29yayBsYXllciAoc29ja2V0IGFkZHIgLyBDQU4gZnJhbWUgLyBDQU4gZmlsdGVyKQorICoKKyAqIEF1dGhvcnM6IE9saXZlciBIYXJ0a29wcCA8b2xpdmVyLmhhcnRrb3BwQHZvbGtzd2FnZW4uZGU+CisgKiAgICAgICAgICBVcnMgVGh1ZXJtYW5uICAgPHVycy50aHVlcm1hbm5Adm9sa3N3YWdlbi5kZT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA3IFZvbGtzd2FnZW4gR3JvdXAgRWxlY3Ryb25pYyBSZXNlYXJjaAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKi8KKworI2lmbmRlZiBDQU5fSAorI2RlZmluZSBDQU5fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKworLyogY29udHJvbGxlciBhcmVhIG5ldHdvcmsgKENBTikga2VybmVsIGRlZmluaXRpb25zICovCisKKy8qIHNwZWNpYWwgYWRkcmVzcyBkZXNjcmlwdGlvbiBmbGFncyBmb3IgdGhlIENBTl9JRCAqLworI2RlZmluZSBDQU5fRUZGX0ZMQUcgMHg4MDAwMDAwMFUgLyogRUZGL1NGRiBpcyBzZXQgaW4gdGhlIE1TQiAqLworI2RlZmluZSBDQU5fUlRSX0ZMQUcgMHg0MDAwMDAwMFUgLyogcmVtb3RlIHRyYW5zbWlzc2lvbiByZXF1ZXN0ICovCisjZGVmaW5lIENBTl9FUlJfRkxBRyAweDIwMDAwMDAwVSAvKiBlcnJvciBmcmFtZSAqLworCisvKiB2YWxpZCBiaXRzIGluIENBTiBJRCBmb3IgZnJhbWUgZm9ybWF0cyAqLworI2RlZmluZSBDQU5fU0ZGX01BU0sgMHgwMDAwMDdGRlUgLyogc3RhbmRhcmQgZnJhbWUgZm9ybWF0IChTRkYpICovCisjZGVmaW5lIENBTl9FRkZfTUFTSyAweDFGRkZGRkZGVSAvKiBleHRlbmRlZCBmcmFtZSBmb3JtYXQgKEVGRikgKi8KKyNkZWZpbmUgQ0FOX0VSUl9NQVNLIDB4MUZGRkZGRkZVIC8qIG9taXQgRUZGLCBSVFIsIEVSUiBmbGFncyAqLworCisvKgorICogQ29udHJvbGxlciBBcmVhIE5ldHdvcmsgSWRlbnRpZmllciBzdHJ1Y3R1cmUKKyAqCisgKiBiaXQgMC0yOAk6IENBTiBpZGVudGlmaWVyICgxMS8yOSBiaXQpCisgKiBiaXQgMjkJOiBlcnJvciBmcmFtZSBmbGFnICgwID0gZGF0YSBmcmFtZSwgMSA9IGVycm9yIGZyYW1lKQorICogYml0IDMwCTogcmVtb3RlIHRyYW5zbWlzc2lvbiByZXF1ZXN0IGZsYWcgKDEgPSBydHIgZnJhbWUpCisgKiBiaXQgMzEJOiBmcmFtZSBmb3JtYXQgZmxhZyAoMCA9IHN0YW5kYXJkIDExIGJpdCwgMSA9IGV4dGVuZGVkIDI5IGJpdCkKKyAqLwordHlwZWRlZiBfX3UzMiBjYW5pZF90OworCisvKgorICogQ29udHJvbGxlciBBcmVhIE5ldHdvcmsgRXJyb3IgRnJhbWUgTWFzayBzdHJ1Y3R1cmUKKyAqCisgKiBiaXQgMC0yOAk6IGVycm9yIGNsYXNzIG1hc2sgKHNlZSBpbmNsdWRlL2xpbnV4L2Nhbi9lcnJvci5oKQorICogYml0IDI5LTMxCTogc2V0IHRvIHplcm8KKyAqLwordHlwZWRlZiBfX3UzMiBjYW5fZXJyX21hc2tfdDsKKworLyoqCisgKiBzdHJ1Y3QgY2FuX2ZyYW1lIC0gYmFzaWMgQ0FOIGZyYW1lIHN0cnVjdHVyZQorICogQGNhbl9pZDogIHRoZSBDQU4gSUQgb2YgdGhlIGZyYW1lIGFuZCBDQU5fKl9GTEFHIGZsYWdzLCBzZWUgYWJvdmUuCisgKiBAY2FuX2RsYzogdGhlIGRhdGEgbGVuZ3RoIGZpZWxkIG9mIHRoZSBDQU4gZnJhbWUKKyAqIEBkYXRhOiAgICB0aGUgQ0FOIGZyYW1lIHBheWxvYWQuCisgKi8KK3N0cnVjdCBjYW5fZnJhbWUgeworCWNhbmlkX3QgY2FuX2lkOyAgLyogMzIgYml0IENBTl9JRCArIEVGRi9SVFIvRVJSIGZsYWdzICovCisJX191OCAgICBjYW5fZGxjOyAvKiBkYXRhIGxlbmd0aCBjb2RlOiAwIC4uIDggKi8KKwlfX3U4ICAgIGRhdGFbOF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworfTsKKworLyogcGFydGljdWxhciBwcm90b2NvbHMgb2YgdGhlIHByb3RvY29sIGZhbWlseSBQRl9DQU4gKi8KKyNkZWZpbmUgQ0FOX1JBVwkJMSAvKiBSQVcgc29ja2V0cyAqLworI2RlZmluZSBDQU5fQkNNCQkyIC8qIEJyb2FkY2FzdCBNYW5hZ2VyICovCisjZGVmaW5lIENBTl9UUDE2CTMgLyogVkFHIFRyYW5zcG9ydCBQcm90b2NvbCB2MS42ICovCisjZGVmaW5lIENBTl9UUDIwCTQgLyogVkFHIFRyYW5zcG9ydCBQcm90b2NvbCB2Mi4wICovCisjZGVmaW5lIENBTl9NQ05FVAk1IC8qIEJvc2NoIE1DTmV0ICovCisjZGVmaW5lIENBTl9JU09UUAk2IC8qIElTTyAxNTc2NS0yIFRyYW5zcG9ydCBQcm90b2NvbCAqLworI2RlZmluZSBDQU5fTlBST1RPCTcKKworI2RlZmluZSBTT0xfQ0FOX0JBU0UgMTAwCisKKy8qKgorICogc3RydWN0IHNvY2thZGRyX2NhbiAtIHRoZSBzb2NrYWRkciBzdHJ1Y3R1cmUgZm9yIENBTiBzb2NrZXRzCisgKiBAY2FuX2ZhbWlseTogIGFkZHJlc3MgZmFtaWx5IG51bWJlciBBRl9DQU4uCisgKiBAY2FuX2lmaW5kZXg6IENBTiBuZXR3b3JrIGludGVyZmFjZSBpbmRleC4KKyAqIEBjYW5fYWRkcjogICAgcHJvdG9jb2wgc3BlY2lmaWMgYWRkcmVzcyBpbmZvcm1hdGlvbgorICovCitzdHJ1Y3Qgc29ja2FkZHJfY2FuIHsKKwlfX2tlcm5lbF9zYV9mYW1pbHlfdCBjYW5fZmFtaWx5OworCWludCAgICAgICAgIGNhbl9pZmluZGV4OworCXVuaW9uIHsKKwkJLyogdHJhbnNwb3J0IHByb3RvY29sIGNsYXNzIGFkZHJlc3MgaW5mb3JtYXRpb24gKGUuZy4gSVNPVFApICovCisJCXN0cnVjdCB7IGNhbmlkX3QgcnhfaWQsIHR4X2lkOyB9IHRwOworCisJCS8qIHJlc2VydmVkIGZvciBmdXR1cmUgQ0FOIHByb3RvY29scyBhZGRyZXNzIGluZm9ybWF0aW9uICovCisJfSBjYW5fYWRkcjsKK307CisKKy8qKgorICogc3RydWN0IGNhbl9maWx0ZXIgLSBDQU4gSUQgYmFzZWQgZmlsdGVyIGluIGNhbl9yZWdpc3RlcigpLgorICogQGNhbl9pZDogICByZWxldmFudCBiaXRzIG9mIENBTiBJRCB3aGljaCBhcmUgbm90IG1hc2tlZCBvdXQuCisgKiBAY2FuX21hc2s6IENBTiBtYXNrIChzZWUgZGVzY3JpcHRpb24pCisgKgorICogRGVzY3JpcHRpb246CisgKiBBIGZpbHRlciBtYXRjaGVzLCB3aGVuCisgKgorICogICAgICAgICAgPHJlY2VpdmVkX2Nhbl9pZD4gJiBtYXNrID09IGNhbl9pZCAmIG1hc2sKKyAqCisgKiBUaGUgZmlsdGVyIGNhbiBiZSBpbnZlcnRlZCAoQ0FOX0lOVl9GSUxURVIgYml0IHNldCBpbiBjYW5faWQpIG9yIGl0IGNhbgorICogZmlsdGVyIGZvciBlcnJvciBmcmFtZXMgKENBTl9FUlJfRkxBRyBiaXQgc2V0IGluIG1hc2spLgorICovCitzdHJ1Y3QgY2FuX2ZpbHRlciB7CisJY2FuaWRfdCBjYW5faWQ7CisJY2FuaWRfdCBjYW5fbWFzazsKK307CisKKyNkZWZpbmUgQ0FOX0lOVl9GSUxURVIgMHgyMDAwMDAwMFUgLyogdG8gYmUgc2V0IGluIGNhbl9maWx0ZXIuY2FuX2lkICovCisKKyNlbmRpZiAvKiBDQU5fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYW4vYmNtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nhbi9iY20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWJlMzg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYW4vYmNtLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIGxpbnV4L2Nhbi9iY20uaAorICoKKyAqIERlZmluaXRpb25zIGZvciBDQU4gQnJvYWRjYXN0IE1hbmFnZXIgKEJDTSkKKyAqCisgKiBBdXRob3I6IE9saXZlciBIYXJ0a29wcCA8b2xpdmVyLmhhcnRrb3BwQHZvbGtzd2FnZW4uZGU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNyBWb2xrc3dhZ2VuIEdyb3VwIEVsZWN0cm9uaWMgUmVzZWFyY2gKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICovCisKKyNpZm5kZWYgQ0FOX0JDTV9ICisjZGVmaW5lIENBTl9CQ01fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jYW4uaD4KKworLyoqCisgKiBzdHJ1Y3QgYmNtX21zZ19oZWFkIC0gaGVhZCBvZiBtZXNzYWdlcyB0by9mcm9tIHRoZSBicm9hZGNhc3QgbWFuYWdlcgorICogQG9wY29kZTogICAgb3Bjb2RlLCBzZWUgZW51bSBiZWxvdy4KKyAqIEBmbGFnczogICAgIHNwZWNpYWwgZmxhZ3MsIHNlZSBiZWxvdy4KKyAqIEBjb3VudDogICAgIG51bWJlciBvZiBmcmFtZXMgdG8gc2VuZCBiZWZvcmUgY2hhbmdpbmcgaW50ZXJ2YWwuCisgKiBAaXZhbDE6ICAgICBpbnRlcnZhbCBmb3IgdGhlIGZpcnN0IEBjb3VudCBmcmFtZXMuCisgKiBAaXZhbDI6ICAgICBpbnRlcnZhbCBmb3IgdGhlIGZvbGxvd2luZyBmcmFtZXMuCisgKiBAY2FuX2lkOiAgICBDQU4gSUQgb2YgZnJhbWVzIHRvIGJlIHNlbnQgb3IgcmVjZWl2ZWQuCisgKiBAbmZyYW1lczogICBudW1iZXIgb2YgZnJhbWVzIGFwcGVuZGVkIHRvIHRoZSBtZXNzYWdlIGhlYWQuCisgKiBAZnJhbWVzOiAgICBhcnJheSBvZiBDQU4gZnJhbWVzLgorICovCitzdHJ1Y3QgYmNtX21zZ19oZWFkIHsKKwlfX3UzMiBvcGNvZGU7CisJX191MzIgZmxhZ3M7CisJX191MzIgY291bnQ7CisJc3RydWN0IHRpbWV2YWwgaXZhbDEsIGl2YWwyOworCWNhbmlkX3QgY2FuX2lkOworCV9fdTMyIG5mcmFtZXM7CisJc3RydWN0IGNhbl9mcmFtZSBmcmFtZXNbMF07Cit9OworCitlbnVtIHsKKwlUWF9TRVRVUCA9IDEsCS8qIGNyZWF0ZSAoY3ljbGljKSB0cmFuc21pc3Npb24gdGFzayAqLworCVRYX0RFTEVURSwJLyogcmVtb3ZlIChjeWNsaWMpIHRyYW5zbWlzc2lvbiB0YXNrICovCisJVFhfUkVBRCwJLyogcmVhZCBwcm9wZXJ0aWVzIG9mIChjeWNsaWMpIHRyYW5zbWlzc2lvbiB0YXNrICovCisJVFhfU0VORCwJLyogc2VuZCBvbmUgQ0FOIGZyYW1lICovCisJUlhfU0VUVVAsCS8qIGNyZWF0ZSBSWCBjb250ZW50IGZpbHRlciBzdWJzY3JpcHRpb24gKi8KKwlSWF9ERUxFVEUsCS8qIHJlbW92ZSBSWCBjb250ZW50IGZpbHRlciBzdWJzY3JpcHRpb24gKi8KKwlSWF9SRUFELAkvKiByZWFkIHByb3BlcnRpZXMgb2YgUlggY29udGVudCBmaWx0ZXIgc3Vic2NyaXB0aW9uICovCisJVFhfU1RBVFVTLAkvKiByZXBseSB0byBUWF9SRUFEIHJlcXVlc3QgKi8KKwlUWF9FWFBJUkVELAkvKiBub3RpZmljYXRpb24gb24gcGVyZm9ybWVkIHRyYW5zbWlzc2lvbnMgKGNvdW50PTApICovCisJUlhfU1RBVFVTLAkvKiByZXBseSB0byBSWF9SRUFEIHJlcXVlc3QgKi8KKwlSWF9USU1FT1VULAkvKiBjeWNsaWMgbWVzc2FnZSBpcyBhYnNlbnQgKi8KKwlSWF9DSEFOR0VECS8qIHVwZGF0ZWQgQ0FOIGZyYW1lIChkZXRlY3RlZCBjb250ZW50IGNoYW5nZSkgKi8KK307CisKKyNkZWZpbmUgU0VUVElNRVIgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgU1RBUlRUSU1FUiAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgVFhfQ09VTlRFVlQgICAgICAgICAweDAwMDQKKyNkZWZpbmUgVFhfQU5OT1VOQ0UgICAgICAgICAweDAwMDgKKyNkZWZpbmUgVFhfQ1BfQ0FOX0lEICAgICAgICAweDAwMTAKKyNkZWZpbmUgUlhfRklMVEVSX0lEICAgICAgICAweDAwMjAKKyNkZWZpbmUgUlhfQ0hFQ0tfRExDICAgICAgICAweDAwNDAKKyNkZWZpbmUgUlhfTk9fQVVUT1RJTUVSICAgICAweDAwODAKKyNkZWZpbmUgUlhfQU5OT1VOQ0VfUkVTVU1FICAweDAxMDAKKyNkZWZpbmUgVFhfUkVTRVRfTVVMVElfSURYICAweDAyMDAKKyNkZWZpbmUgUlhfUlRSX0ZSQU1FICAgICAgICAweDA0MDAKKworI2VuZGlmIC8qIENBTl9CQ01fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYW4vZXJyb3IuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2FuL2Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNlODU1ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2FuL2Vycm9yLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIGxpbnV4L2Nhbi9lcnJvci5oCisgKgorICogRGVmaW5pdGlvbnMgb2YgdGhlIENBTiBlcnJvciBmcmFtZSB0byBiZSBmaWx0ZXJlZCBhbmQgcGFzc2VkIHRvIHRoZSB1c2VyLgorICoKKyAqIEF1dGhvcjogT2xpdmVyIEhhcnRrb3BwIDxvbGl2ZXIuaGFydGtvcHBAdm9sa3N3YWdlbi5kZT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA3IFZvbGtzd2FnZW4gR3JvdXAgRWxlY3Ryb25pYyBSZXNlYXJjaAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKi8KKworI2lmbmRlZiBDQU5fRVJST1JfSAorI2RlZmluZSBDQU5fRVJST1JfSAorCisjZGVmaW5lIENBTl9FUlJfRExDIDggLyogZGxjIGZvciBlcnJvciBmcmFtZXMgKi8KKworLyogZXJyb3IgY2xhc3MgKG1hc2spIGluIGNhbl9pZCAqLworI2RlZmluZSBDQU5fRVJSX1RYX1RJTUVPVVQgICAweDAwMDAwMDAxVSAvKiBUWCB0aW1lb3V0IChieSBuZXRkZXZpY2UgZHJpdmVyKSAqLworI2RlZmluZSBDQU5fRVJSX0xPU1RBUkIgICAgICAweDAwMDAwMDAyVSAvKiBsb3N0IGFyYml0cmF0aW9uICAgIC8gZGF0YVswXSAgICAqLworI2RlZmluZSBDQU5fRVJSX0NSVEwgICAgICAgICAweDAwMDAwMDA0VSAvKiBjb250cm9sbGVyIHByb2JsZW1zIC8gZGF0YVsxXSAgICAqLworI2RlZmluZSBDQU5fRVJSX1BST1QgICAgICAgICAweDAwMDAwMDA4VSAvKiBwcm90b2NvbCB2aW9sYXRpb25zIC8gZGF0YVsyLi4zXSAqLworI2RlZmluZSBDQU5fRVJSX1RSWCAgICAgICAgICAweDAwMDAwMDEwVSAvKiB0cmFuc2NlaXZlciBzdGF0dXMgIC8gZGF0YVs0XSAgICAqLworI2RlZmluZSBDQU5fRVJSX0FDSyAgICAgICAgICAweDAwMDAwMDIwVSAvKiByZWNlaXZlZCBubyBBQ0sgb24gdHJhbnNtaXNzaW9uICovCisjZGVmaW5lIENBTl9FUlJfQlVTT0ZGICAgICAgIDB4MDAwMDAwNDBVIC8qIGJ1cyBvZmYgKi8KKyNkZWZpbmUgQ0FOX0VSUl9CVVNFUlJPUiAgICAgMHgwMDAwMDA4MFUgLyogYnVzIGVycm9yIChtYXkgZmxvb2QhKSAqLworI2RlZmluZSBDQU5fRVJSX1JFU1RBUlRFRCAgICAweDAwMDAwMTAwVSAvKiBjb250cm9sbGVyIHJlc3RhcnRlZCAqLworCisvKiBhcmJpdHJhdGlvbiBsb3N0IGluIGJpdCAuLi4gLyBkYXRhWzBdICovCisjZGVmaW5lIENBTl9FUlJfTE9TVEFSQl9VTlNQRUMgICAweDAwIC8qIHVuc3BlY2lmaWVkICovCisJCQkJICAgICAgLyogZWxzZSBiaXQgbnVtYmVyIGluIGJpdHN0cmVhbSAqLworCisvKiBlcnJvciBzdGF0dXMgb2YgQ0FOLWNvbnRyb2xsZXIgLyBkYXRhWzFdICovCisjZGVmaW5lIENBTl9FUlJfQ1JUTF9VTlNQRUMgICAgICAweDAwIC8qIHVuc3BlY2lmaWVkICovCisjZGVmaW5lIENBTl9FUlJfQ1JUTF9SWF9PVkVSRkxPVyAweDAxIC8qIFJYIGJ1ZmZlciBvdmVyZmxvdyAqLworI2RlZmluZSBDQU5fRVJSX0NSVExfVFhfT1ZFUkZMT1cgMHgwMiAvKiBUWCBidWZmZXIgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgQ0FOX0VSUl9DUlRMX1JYX1dBUk5JTkcgIDB4MDQgLyogcmVhY2hlZCB3YXJuaW5nIGxldmVsIGZvciBSWCBlcnJvcnMgKi8KKyNkZWZpbmUgQ0FOX0VSUl9DUlRMX1RYX1dBUk5JTkcgIDB4MDggLyogcmVhY2hlZCB3YXJuaW5nIGxldmVsIGZvciBUWCBlcnJvcnMgKi8KKyNkZWZpbmUgQ0FOX0VSUl9DUlRMX1JYX1BBU1NJVkUgIDB4MTAgLyogcmVhY2hlZCBlcnJvciBwYXNzaXZlIHN0YXR1cyBSWCAqLworI2RlZmluZSBDQU5fRVJSX0NSVExfVFhfUEFTU0lWRSAgMHgyMCAvKiByZWFjaGVkIGVycm9yIHBhc3NpdmUgc3RhdHVzIFRYICovCisJCQkJICAgICAgLyogKGF0IGxlYXN0IG9uZSBlcnJvciBjb3VudGVyIGV4Y2VlZHMgKi8KKwkJCQkgICAgICAvKiB0aGUgcHJvdG9jb2wtZGVmaW5lZCBsZXZlbCBvZiAxMjcpICAqLworCisvKiBlcnJvciBpbiBDQU4gcHJvdG9jb2wgKHR5cGUpIC8gZGF0YVsyXSAqLworI2RlZmluZSBDQU5fRVJSX1BST1RfVU5TUEVDICAgICAgMHgwMCAvKiB1bnNwZWNpZmllZCAqLworI2RlZmluZSBDQU5fRVJSX1BST1RfQklUICAgICAgICAgMHgwMSAvKiBzaW5nbGUgYml0IGVycm9yICovCisjZGVmaW5lIENBTl9FUlJfUFJPVF9GT1JNICAgICAgICAweDAyIC8qIGZyYW1lIGZvcm1hdCBlcnJvciAqLworI2RlZmluZSBDQU5fRVJSX1BST1RfU1RVRkYgICAgICAgMHgwNCAvKiBiaXQgc3R1ZmZpbmcgZXJyb3IgKi8KKyNkZWZpbmUgQ0FOX0VSUl9QUk9UX0JJVDAgICAgICAgIDB4MDggLyogdW5hYmxlIHRvIHNlbmQgZG9taW5hbnQgYml0ICovCisjZGVmaW5lIENBTl9FUlJfUFJPVF9CSVQxICAgICAgICAweDEwIC8qIHVuYWJsZSB0byBzZW5kIHJlY2Vzc2l2ZSBiaXQgKi8KKyNkZWZpbmUgQ0FOX0VSUl9QUk9UX09WRVJMT0FEICAgIDB4MjAgLyogYnVzIG92ZXJsb2FkICovCisjZGVmaW5lIENBTl9FUlJfUFJPVF9BQ1RJVkUgICAgICAweDQwIC8qIGFjdGl2ZSBlcnJvciBhbm5vdW5jZW1lbnQgKi8KKyNkZWZpbmUgQ0FOX0VSUl9QUk9UX1RYICAgICAgICAgIDB4ODAgLyogZXJyb3Igb2NjdXJyZWQgb24gdHJhbnNtaXNzaW9uICovCisKKy8qIGVycm9yIGluIENBTiBwcm90b2NvbCAobG9jYXRpb24pIC8gZGF0YVszXSAqLworI2RlZmluZSBDQU5fRVJSX1BST1RfTE9DX1VOU1BFQyAgMHgwMCAvKiB1bnNwZWNpZmllZCAqLworI2RlZmluZSBDQU5fRVJSX1BST1RfTE9DX1NPRiAgICAgMHgwMyAvKiBzdGFydCBvZiBmcmFtZSAqLworI2RlZmluZSBDQU5fRVJSX1BST1RfTE9DX0lEMjhfMjEgMHgwMiAvKiBJRCBiaXRzIDI4IC0gMjEgKFNGRjogMTAgLSAzKSAqLworI2RlZmluZSBDQU5fRVJSX1BST1RfTE9DX0lEMjBfMTggMHgwNiAvKiBJRCBiaXRzIDIwIC0gMTggKFNGRjogMiAtIDAgKSovCisjZGVmaW5lIENBTl9FUlJfUFJPVF9MT0NfU1JUUiAgICAweDA0IC8qIHN1YnN0aXR1dGUgUlRSIChTRkY6IFJUUikgKi8KKyNkZWZpbmUgQ0FOX0VSUl9QUk9UX0xPQ19JREUgICAgIDB4MDUgLyogaWRlbnRpZmllciBleHRlbnNpb24gKi8KKyNkZWZpbmUgQ0FOX0VSUl9QUk9UX0xPQ19JRDE3XzEzIDB4MDcgLyogSUQgYml0cyAxNy0xMyAqLworI2RlZmluZSBDQU5fRVJSX1BST1RfTE9DX0lEMTJfMDUgMHgwRiAvKiBJRCBiaXRzIDEyLTUgKi8KKyNkZWZpbmUgQ0FOX0VSUl9QUk9UX0xPQ19JRDA0XzAwIDB4MEUgLyogSUQgYml0cyA0LTAgKi8KKyNkZWZpbmUgQ0FOX0VSUl9QUk9UX0xPQ19SVFIgICAgIDB4MEMgLyogUlRSICovCisjZGVmaW5lIENBTl9FUlJfUFJPVF9MT0NfUkVTMSAgICAweDBEIC8qIHJlc2VydmVkIGJpdCAxICovCisjZGVmaW5lIENBTl9FUlJfUFJPVF9MT0NfUkVTMCAgICAweDA5IC8qIHJlc2VydmVkIGJpdCAwICovCisjZGVmaW5lIENBTl9FUlJfUFJPVF9MT0NfRExDICAgICAweDBCIC8qIGRhdGEgbGVuZ3RoIGNvZGUgKi8KKyNkZWZpbmUgQ0FOX0VSUl9QUk9UX0xPQ19EQVRBICAgIDB4MEEgLyogZGF0YSBzZWN0aW9uICovCisjZGVmaW5lIENBTl9FUlJfUFJPVF9MT0NfQ1JDX1NFUSAweDA4IC8qIENSQyBzZXF1ZW5jZSAqLworI2RlZmluZSBDQU5fRVJSX1BST1RfTE9DX0NSQ19ERUwgMHgxOCAvKiBDUkMgZGVsaW1pdGVyICovCisjZGVmaW5lIENBTl9FUlJfUFJPVF9MT0NfQUNLICAgICAweDE5IC8qIEFDSyBzbG90ICovCisjZGVmaW5lIENBTl9FUlJfUFJPVF9MT0NfQUNLX0RFTCAweDFCIC8qIEFDSyBkZWxpbWl0ZXIgKi8KKyNkZWZpbmUgQ0FOX0VSUl9QUk9UX0xPQ19FT0YgICAgIDB4MUEgLyogZW5kIG9mIGZyYW1lICovCisjZGVmaW5lIENBTl9FUlJfUFJPVF9MT0NfSU5URVJNICAweDEyIC8qIGludGVybWlzc2lvbiAqLworCisvKiBlcnJvciBzdGF0dXMgb2YgQ0FOLXRyYW5zY2VpdmVyIC8gZGF0YVs0XSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5IIENBTkwgKi8KKyNkZWZpbmUgQ0FOX0VSUl9UUlhfVU5TUEVDICAgICAgICAgICAgIDB4MDAgLyogMDAwMCAwMDAwICovCisjZGVmaW5lIENBTl9FUlJfVFJYX0NBTkhfTk9fV0lSRSAgICAgICAweDA0IC8qIDAwMDAgMDEwMCAqLworI2RlZmluZSBDQU5fRVJSX1RSWF9DQU5IX1NIT1JUX1RPX0JBVCAgMHgwNSAvKiAwMDAwIDAxMDEgKi8KKyNkZWZpbmUgQ0FOX0VSUl9UUlhfQ0FOSF9TSE9SVF9UT19WQ0MgIDB4MDYgLyogMDAwMCAwMTEwICovCisjZGVmaW5lIENBTl9FUlJfVFJYX0NBTkhfU0hPUlRfVE9fR05EICAweDA3IC8qIDAwMDAgMDExMSAqLworI2RlZmluZSBDQU5fRVJSX1RSWF9DQU5MX05PX1dJUkUgICAgICAgMHg0MCAvKiAwMTAwIDAwMDAgKi8KKyNkZWZpbmUgQ0FOX0VSUl9UUlhfQ0FOTF9TSE9SVF9UT19CQVQgIDB4NTAgLyogMDEwMSAwMDAwICovCisjZGVmaW5lIENBTl9FUlJfVFJYX0NBTkxfU0hPUlRfVE9fVkNDICAweDYwIC8qIDAxMTAgMDAwMCAqLworI2RlZmluZSBDQU5fRVJSX1RSWF9DQU5MX1NIT1JUX1RPX0dORCAgMHg3MCAvKiAwMTExIDAwMDAgKi8KKyNkZWZpbmUgQ0FOX0VSUl9UUlhfQ0FOTF9TSE9SVF9UT19DQU5IIDB4ODAgLyogMTAwMCAwMDAwICovCisKKy8qIGNvbnRyb2xsZXIgc3BlY2lmaWMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAvIGRhdGFbNS4uN10gKi8KKworI2VuZGlmIC8qIENBTl9FUlJPUl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nhbi9ndy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYW4vZ3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTFkYjE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYW4vZ3cuaApAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIGxpbnV4L2Nhbi9ndy5oCisgKgorICogRGVmaW5pdGlvbnMgZm9yIENBTiBmcmFtZSBHYXRld2F5L1JvdXRlci9CcmlkZ2UKKyAqCisgKiBBdXRob3I6IE9saXZlciBIYXJ0a29wcCA8b2xpdmVyLmhhcnRrb3BwQHZvbGtzd2FnZW4uZGU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgVm9sa3N3YWdlbiBHcm91cCBFbGVjdHJvbmljIFJlc2VhcmNoCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqLworCisjaWZuZGVmIENBTl9HV19ICisjZGVmaW5lIENBTl9HV19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nhbi5oPgorCitzdHJ1Y3QgcnRjYW5tc2cgeworCV9fdTggIGNhbl9mYW1pbHk7CisJX191OCAgZ3d0eXBlOworCV9fdTE2IGZsYWdzOworfTsKKworLyogQ0FOIGdhdGV3YXkgdHlwZXMgKi8KK2VudW0geworCUNHV19UWVBFX1VOU1BFQywKKwlDR1dfVFlQRV9DQU5fQ0FOLAkvKiBDQU4tPkNBTiByb3V0aW5nICovCisJX19DR1dfVFlQRV9NQVgKK307CisKKyNkZWZpbmUgQ0dXX1RZUEVfTUFYIChfX0NHV19UWVBFX01BWCAtIDEpCisKKy8qIENBTiBydG5ldGxpbmsgYXR0cmlidXRlIGRlZmluaXRpb25zICovCitlbnVtIHsKKwlDR1dfVU5TUEVDLAorCUNHV19NT0RfQU5ELAkvKiBDQU4gZnJhbWUgbW9kaWZpY2F0aW9uIGJpbmFyeSBBTkQgKi8KKwlDR1dfTU9EX09SLAkvKiBDQU4gZnJhbWUgbW9kaWZpY2F0aW9uIGJpbmFyeSBPUiAqLworCUNHV19NT0RfWE9SLAkvKiBDQU4gZnJhbWUgbW9kaWZpY2F0aW9uIGJpbmFyeSBYT1IgKi8KKwlDR1dfTU9EX1NFVCwJLyogQ0FOIGZyYW1lIG1vZGlmaWNhdGlvbiBzZXQgYWx0ZXJuYXRlIHZhbHVlcyAqLworCUNHV19DU19YT1IsCS8qIHNldCBkYXRhW10gWE9SIGNoZWNrc3VtIGludG8gZGF0YVtpbmRleF0gKi8KKwlDR1dfQ1NfQ1JDOCwJLyogc2V0IGRhdGFbXSBDUkM4IGNoZWNrc3VtIGludG8gZGF0YVtpbmRleF0gKi8KKwlDR1dfSEFORExFRCwJLyogbnVtYmVyIG9mIGhhbmRsZWQgQ0FOIGZyYW1lcyAqLworCUNHV19EUk9QUEVELAkvKiBudW1iZXIgb2YgZHJvcHBlZCBDQU4gZnJhbWVzICovCisJQ0dXX1NSQ19JRiwJLyogaWZpbmRleCBvZiBzb3VyY2UgbmV0d29yayBpbnRlcmZhY2UgKi8KKwlDR1dfRFNUX0lGLAkvKiBpZmluZGV4IG9mIGRlc3RpbmF0aW9uIG5ldHdvcmsgaW50ZXJmYWNlICovCisJQ0dXX0ZJTFRFUiwJLyogc3BlY2lmeSBzdHJ1Y3QgY2FuX2ZpbHRlciBvbiBzb3VyY2UgQ0FOIGRldmljZSAqLworCV9fQ0dXX01BWAorfTsKKworI2RlZmluZSBDR1dfTUFYIChfX0NHV19NQVggLSAxKQorCisjZGVmaW5lIENHV19GTEFHU19DQU5fRUNITyAweDAxCisjZGVmaW5lIENHV19GTEFHU19DQU5fU1JDX1RTVEFNUCAweDAyCisKKyNkZWZpbmUgQ0dXX01PRF9GVU5DUyA0IC8qIEFORCBPUiBYT1IgU0VUICovCisKKy8qIENBTiBmcmFtZSBlbGVtZW50cyB0aGF0IGFyZSBhZmZlY3RlZCBieSBjdXJyLiAzIENBTiBmcmFtZSBtb2RpZmljYXRpb25zICovCisjZGVmaW5lIENHV19NT0RfSUQJMHgwMQorI2RlZmluZSBDR1dfTU9EX0RMQwkweDAyCisjZGVmaW5lIENHV19NT0RfREFUQQkweDA0CisKKyNkZWZpbmUgQ0dXX0ZSQU1FX01PRFMgMyAvKiBJRCBETEMgREFUQSAqLworCisjZGVmaW5lIE1BWF9NT0RGVU5DVElPTlMgKENHV19NT0RfRlVOQ1MgKiBDR1dfRlJBTUVfTU9EUykKKworc3RydWN0IGNnd19mcmFtZV9tb2QgeworCXN0cnVjdCBjYW5fZnJhbWUgY2Y7CisJX191OCBtb2R0eXBlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBDR1dfTU9EQVRUUl9MRU4gc2l6ZW9mKHN0cnVjdCBjZ3dfZnJhbWVfbW9kKQorCitzdHJ1Y3QgY2d3X2NzdW1feG9yIHsKKwlfX3M4IGZyb21faWR4OworCV9fczggdG9faWR4OworCV9fczggcmVzdWx0X2lkeDsKKwlfX3U4IGluaXRfeG9yX3ZhbDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBjZ3dfY3N1bV9jcmM4IHsKKwlfX3M4IGZyb21faWR4OworCV9fczggdG9faWR4OworCV9fczggcmVzdWx0X2lkeDsKKwlfX3U4IGluaXRfY3JjX3ZhbDsKKwlfX3U4IGZpbmFsX3hvcl92YWw7CisJX191OCBjcmN0YWJbMjU2XTsKKwlfX3U4IHByb2ZpbGU7CisJX191OCBwcm9maWxlX2RhdGFbMjBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogbGVuZ3RoIG9mIGNoZWNrc3VtIG9wZXJhdGlvbiBwYXJhbWV0ZXJzLiBpZHggPSBpbmRleCBpbiBDQU4gZnJhbWUgZGF0YVtdICovCisjZGVmaW5lIENHV19DU19YT1JfTEVOICBzaXplb2Yoc3RydWN0IGNnd19jc3VtX3hvcikKKyNkZWZpbmUgQ0dXX0NTX0NSQzhfTEVOICBzaXplb2Yoc3RydWN0IGNnd19jc3VtX2NyYzgpCisKKy8qIENSQzggcHJvZmlsZXMgKGNvbXB1dGUgQ1JDIGZvciBhZGRpdGlvbmFsIGRhdGEgZWxlbWVudHMgLSBzZWUgYmVsb3cpICovCitlbnVtIHsKKwlDR1dfQ1JDOFBSRl9VTlNQRUMsCisJQ0dXX0NSQzhQUkZfMVU4LAkvKiBjb21wdXRlIG9uZSBhZGRpdGlvbmFsIHU4IHZhbHVlICovCisJQ0dXX0NSQzhQUkZfMTZVOCwJLyogdTggdmFsdWUgdGFibGUgaW5kZXhlZCBieSBkYXRhWzFdICYgMHhGICovCisJQ0dXX0NSQzhQUkZfU0ZGSURfWE9SLAkvKiAoY2FuX2lkICYgMHhGRikgXiAoY2FuX2lkID4+IDggJiAweEZGKSAqLworCV9fQ0dXX0NSQzhQUkZfTUFYCit9OworCisjZGVmaW5lIENHV19DUkM4UFJGX01BWCAoX19DR1dfQ1JDOFBSRl9NQVggLSAxKQorCisvKgorICogQ0FOIHJ0bmV0bGluayBhdHRyaWJ1dGUgY29udGVudHMgaW4gZGV0YWlsCisgKgorICogQ0dXX1hYWF9JRiAobGVuZ3RoIDQgYnl0ZXMpOgorICogU2V0cyBhbiBpbnRlcmZhY2UgaW5kZXggZm9yIHNvdXJjZS9kZXN0aW5hdGlvbiBuZXR3b3JrIGludGVyZmFjZXMuCisgKiBGb3IgdGhlIENBTi0+Q0FOIGd3dHlwZSB0aGUgaW5kaWNlcyBvZiBfdHdvXyBDQU4gaW50ZXJmYWNlcyBhcmUgbWFuZGF0b3J5LgorICoKKyAqIENHV19GSUxURVIgKGxlbmd0aCA4IGJ5dGVzKToKKyAqIFNldHMgYSBDQU4gcmVjZWl2ZSBmaWx0ZXIgZm9yIHRoZSBnYXRld2F5IGpvYiBzcGVjaWZpZWQgYnkgdGhlCisgKiBzdHJ1Y3QgY2FuX2ZpbHRlciBkZXNjcmliZWQgaW4gaW5jbHVkZS9saW51eC9jYW4uaAorICoKKyAqIENHV19NT0RfWFhYIChsZW5ndGggMTcgYnl0ZXMpOgorICogU3BlY2lmaWVzIGEgbW9kaWZpY2F0aW9uIHRoYXQncyBkb25lIHRvIGEgcmVjZWl2ZWQgQ0FOIGZyYW1lIGJlZm9yZSBpdCBpcworICogc2VuZCBvdXQgdG8gdGhlIGRlc3RpbmF0aW9uIGludGVyZmFjZS4KKyAqCisgKiA8c3RydWN0IGNhbl9mcmFtZT4gZGF0YSB1c2VkIGFzIG9wZXJhdG9yCisgKiA8dTg+IGFmZmVjdGVkIENBTiBmcmFtZSBlbGVtZW50cworICoKKyAqIENHV19DU19YT1IgKGxlbmd0aCA0IGJ5dGVzKToKKyAqIFNldCBhIHNpbXBsZSBYT1IgY2hlY2tzdW0gc3RhcnRpbmcgd2l0aCBhbiBpbml0aWFsIHZhbHVlIGludG8KKyAqIGRhdGFbcmVzdWx0LWlkeF0gdXNpbmcgZGF0YVtzdGFydC1pZHhdIC4uIGRhdGFbZW5kLWlkeF0KKyAqCisgKiBUaGUgWE9SIGNoZWNrc3VtIGlzIGNhbGN1bGF0ZWQgbGlrZSB0aGlzOgorICoKKyAqIHhvciA9IGluaXRfeG9yX3ZhbAorICoKKyAqIGZvciAoaSA9IGZyb21faWR4IC4uIHRvX2lkeCkKKyAqICAgICAgeG9yIF49IGNhbl9mcmFtZS5kYXRhW2ldCisgKgorICogY2FuX2ZyYW1lLmRhdGFbIHJlc3VsdF9pZHggXSA9IHhvcgorICoKKyAqIENHV19DU19DUkM4IChsZW5ndGggMjgyIGJ5dGVzKToKKyAqIFNldCBhIENSQzggdmFsdWUgaW50byBkYXRhW3Jlc3VsdC1pZHhdIHVzaW5nIGEgZ2l2ZW4gMjU2IGJ5dGUgQ1JDOCB0YWJsZSwKKyAqIGEgZ2l2ZW4gaW5pdGlhbCB2YWx1ZSBhbmQgYSBkZWZpbmVkIGlucHV0IGRhdGFbc3RhcnQtaWR4XSAuLiBkYXRhW2VuZC1pZHhdLgorICogRmluYWxseSB0aGUgcmVzdWx0IHZhbHVlIGlzIFhPUidlZCB3aXRoIHRoZSBmaW5hbF94b3JfdmFsLgorICoKKyAqIFRoZSBDUkM4IGNoZWNrc3VtIGlzIGNhbGN1bGF0ZWQgbGlrZSB0aGlzOgorICoKKyAqIGNyYyA9IGluaXRfY3JjX3ZhbAorICoKKyAqIGZvciAoaSA9IGZyb21faWR4IC4uIHRvX2lkeCkKKyAqICAgICAgY3JjID0gY3JjdGFiWyBjcmMgXiBjYW5fZnJhbWUuZGF0YVtpXSBdCisgKgorICogY2FuX2ZyYW1lLmRhdGFbIHJlc3VsdF9pZHggXSA9IGNyYyBeIGZpbmFsX3hvcl92YWwKKyAqCisgKiBUaGUgY2FsY3VsYXRlZCBDUkMgbWF5IGNvbnRhaW4gYWRkaXRpb25hbCBzb3VyY2UgZGF0YSBlbGVtZW50cyB0aGF0IGNhbiBiZQorICogZGVmaW5lZCBpbiB0aGUgaGFuZGxpbmcgb2YgJ2NoZWNrc3VtIHByb2ZpbGVzJyBlLmcuIHNob3duIGluIEFVVE9TQVIgc3BlY3MKKyAqIGxpa2UgaHR0cDovL3d3dy5hdXRvc2FyLm9yZy9kb3dubG9hZC9SNC4wL0FVVE9TQVJfU1dTX0UyRUxpYnJhcnkucGRmCisgKiBFLmcuIHRoZSBwcm9maWxlX2RhdGFbXSBtYXkgY29udGFpbiBhZGRpdGlvbmFsIHU4IHZhbHVlcyAoY2FsbGVkIERBVEFfSURzKQorICogdGhhdCBhcmUgdXNlZCBkZXBlbmRpbmcgb24gY291bnRlciB2YWx1ZXMgaW5zaWRlIHRoZSBDQU4gZnJhbWUgZGF0YVtdLgorICogU28gZmFyIG9ubHkgdGhyZWUgcHJvZmlsZXMgaGF2ZSBiZWVuIGltcGxlbWVudGVkIGZvciBpbGx1c3RyYXRpb24uCisgKgorICogUmVtYXJrOiBJbiBnZW5lcmFsIHRoZSBhdHRyaWJ1dGUgZGF0YSBpcyBhIGxpbmVhciBidWZmZXIuCisgKiAgICAgICAgIEJld2FyZSBvZiBzZW5kaW5nIHVucGFja2VkIG9yIGFsaWduZWQgc3RydWN0cyEKKyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2FuL25ldGxpbmsuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2FuL25ldGxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDk2NmRkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYW4vbmV0bGluay5oCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogbGludXgvY2FuL25ldGxpbmsuaAorICoKKyAqIERlZmluaXRpb25zIGZvciB0aGUgQ0FOIG5ldGxpbmsgaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IFdvbGZnYW5nIEdyYW5kZWdnZXIgPHdnQGdyYW5kZWdnZXIuY29tPgorICoKKyAqLworCisjaWZuZGVmIENBTl9ORVRMSU5LX0gKKyNkZWZpbmUgQ0FOX05FVExJTktfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIENBTiBiaXQtdGltaW5nIHBhcmFtZXRlcnMKKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlYWQgY2hhcHRlciAiOCBCSVQgVElNSU5HCisgKiBSRVFVSVJFTUVOVFMiIG9mIHRoZSAiQm9zY2ggQ0FOIFNwZWNpZmljYXRpb24gdmVyc2lvbiAyLjAiCisgKiBhdCBodHRwOi8vd3d3LnNlbWljb25kdWN0b3JzLmJvc2NoLmRlL3BkZi9jYW4yc3BlYy5wZGYuCisgKi8KK3N0cnVjdCBjYW5fYml0dGltaW5nIHsKKwlfX3UzMiBiaXRyYXRlOwkJLyogQml0LXJhdGUgaW4gYml0cy9zZWNvbmQgKi8KKwlfX3UzMiBzYW1wbGVfcG9pbnQ7CS8qIFNhbXBsZSBwb2ludCBpbiBvbmUtdGVudGggb2YgYSBwZXJjZW50ICovCisJX191MzIgdHE7CQkvKiBUaW1lIHF1YW50YSAoVFEpIGluIG5hbm9zZWNvbmRzICovCisJX191MzIgcHJvcF9zZWc7CQkvKiBQcm9wYWdhdGlvbiBzZWdtZW50IGluIFRRcyAqLworCV9fdTMyIHBoYXNlX3NlZzE7CS8qIFBoYXNlIGJ1ZmZlciBzZWdtZW50IDEgaW4gVFFzICovCisJX191MzIgcGhhc2Vfc2VnMjsJLyogUGhhc2UgYnVmZmVyIHNlZ21lbnQgMiBpbiBUUXMgKi8KKwlfX3UzMiBzanc7CQkvKiBTeW5jaHJvbmlzYXRpb24ganVtcCB3aWR0aCBpbiBUUXMgKi8KKwlfX3UzMiBicnA7CQkvKiBCaXQtcmF0ZSBwcmVzY2FsZXIgKi8KK307CisKKy8qCisgKiBDQU4gaGFyd2FyZS1kZXBlbmRlbnQgYml0LXRpbWluZyBjb25zdGFudAorICoKKyAqIFVzZWQgZm9yIGNhbGN1bGF0aW5nIGFuZCBjaGVja2luZyBiaXQtdGltaW5nIHBhcmFtZXRlcnMKKyAqLworc3RydWN0IGNhbl9iaXR0aW1pbmdfY29uc3QgeworCWNoYXIgbmFtZVsxNl07CQkvKiBOYW1lIG9mIHRoZSBDQU4gY29udHJvbGxlciBoYXJkd2FyZSAqLworCV9fdTMyIHRzZWcxX21pbjsJLyogVGltZSBzZWdlbWVudCAxID0gcHJvcF9zZWcgKyBwaGFzZV9zZWcxICovCisJX191MzIgdHNlZzFfbWF4OworCV9fdTMyIHRzZWcyX21pbjsJLyogVGltZSBzZWdlbWVudCAyID0gcGhhc2Vfc2VnMiAqLworCV9fdTMyIHRzZWcyX21heDsKKwlfX3UzMiBzandfbWF4OwkJLyogU3luY2hyb25pc2F0aW9uIGp1bXAgd2lkdGggKi8KKwlfX3UzMiBicnBfbWluOwkJLyogQml0LXJhdGUgcHJlc2NhbGVyICovCisJX191MzIgYnJwX21heDsKKwlfX3UzMiBicnBfaW5jOworfTsKKworLyoKKyAqIENBTiBjbG9jayBwYXJhbWV0ZXJzCisgKi8KK3N0cnVjdCBjYW5fY2xvY2sgeworCV9fdTMyIGZyZXE7CQkvKiBDQU4gc3lzdGVtIGNsb2NrIGZyZXF1ZW5jeSBpbiBIeiAqLworfTsKKworLyoKKyAqIENBTiBvcGVyYXRpb25hbCBhbmQgZXJyb3Igc3RhdGVzCisgKi8KK2VudW0gY2FuX3N0YXRlIHsKKwlDQU5fU1RBVEVfRVJST1JfQUNUSVZFID0gMCwJLyogUlgvVFggZXJyb3IgY291bnQgPCA5NiAqLworCUNBTl9TVEFURV9FUlJPUl9XQVJOSU5HLAkvKiBSWC9UWCBlcnJvciBjb3VudCA8IDEyOCAqLworCUNBTl9TVEFURV9FUlJPUl9QQVNTSVZFLAkvKiBSWC9UWCBlcnJvciBjb3VudCA8IDI1NiAqLworCUNBTl9TVEFURV9CVVNfT0ZGLAkJLyogUlgvVFggZXJyb3IgY291bnQgPj0gMjU2ICovCisJQ0FOX1NUQVRFX1NUT1BQRUQsCQkvKiBEZXZpY2UgaXMgc3RvcHBlZCAqLworCUNBTl9TVEFURV9TTEVFUElORywJCS8qIERldmljZSBpcyBzbGVlcGluZyAqLworCUNBTl9TVEFURV9NQVgKK307CisKKy8qCisgKiBDQU4gYnVzIGVycm9yIGNvdW50ZXJzCisgKi8KK3N0cnVjdCBjYW5fYmVycl9jb3VudGVyIHsKKwlfX3UxNiB0eGVycjsKKwlfX3UxNiByeGVycjsKK307CisKKy8qCisgKiBDQU4gY29udHJvbGxlciBtb2RlCisgKi8KK3N0cnVjdCBjYW5fY3RybG1vZGUgeworCV9fdTMyIG1hc2s7CisJX191MzIgZmxhZ3M7Cit9OworCisjZGVmaW5lIENBTl9DVFJMTU9ERV9MT09QQkFDSwkJMHgwMQkvKiBMb29wYmFjayBtb2RlICovCisjZGVmaW5lIENBTl9DVFJMTU9ERV9MSVNURU5PTkxZCQkweDAyIAkvKiBMaXN0ZW4tb25seSBtb2RlICovCisjZGVmaW5lIENBTl9DVFJMTU9ERV8zX1NBTVBMRVMJCTB4MDQJLyogVHJpcGxlIHNhbXBsaW5nIG1vZGUgKi8KKyNkZWZpbmUgQ0FOX0NUUkxNT0RFX09ORV9TSE9UCQkweDA4CS8qIE9uZS1TaG90IG1vZGUgKi8KKyNkZWZpbmUgQ0FOX0NUUkxNT0RFX0JFUlJfUkVQT1JUSU5HCTB4MTAJLyogQnVzLWVycm9yIHJlcG9ydGluZyAqLworCisvKgorICogQ0FOIGRldmljZSBzdGF0aXN0aWNzCisgKi8KK3N0cnVjdCBjYW5fZGV2aWNlX3N0YXRzIHsKKwlfX3UzMiBidXNfZXJyb3I7CS8qIEJ1cyBlcnJvcnMgKi8KKwlfX3UzMiBlcnJvcl93YXJuaW5nOwkvKiBDaGFuZ2VzIHRvIGVycm9yIHdhcm5pbmcgc3RhdGUgKi8KKwlfX3UzMiBlcnJvcl9wYXNzaXZlOwkvKiBDaGFuZ2VzIHRvIGVycm9yIHBhc3NpdmUgc3RhdGUgKi8KKwlfX3UzMiBidXNfb2ZmOwkJLyogQ2hhbmdlcyB0byBidXMgb2ZmIHN0YXRlICovCisJX191MzIgYXJiaXRyYXRpb25fbG9zdDsgLyogQXJiaXRyYXRpb24gbG9zdCBlcnJvcnMgKi8KKwlfX3UzMiByZXN0YXJ0czsJCS8qIENBTiBjb250cm9sbGVyIHJlLXN0YXJ0cyAqLworfTsKKworLyoKKyAqIENBTiBuZXRsaW5rIGludGVyZmFjZQorICovCitlbnVtIHsKKwlJRkxBX0NBTl9VTlNQRUMsCisJSUZMQV9DQU5fQklUVElNSU5HLAorCUlGTEFfQ0FOX0JJVFRJTUlOR19DT05TVCwKKwlJRkxBX0NBTl9DTE9DSywKKwlJRkxBX0NBTl9TVEFURSwKKwlJRkxBX0NBTl9DVFJMTU9ERSwKKwlJRkxBX0NBTl9SRVNUQVJUX01TLAorCUlGTEFfQ0FOX1JFU1RBUlQsCisJSUZMQV9DQU5fQkVSUl9DT1VOVEVSLAorCV9fSUZMQV9DQU5fTUFYCit9OworCisjZGVmaW5lIElGTEFfQ0FOX01BWAkoX19JRkxBX0NBTl9NQVggLSAxKQorCisjZW5kaWYgLyogQ0FOX05FVExJTktfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYW4vcmF3LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nhbi9yYXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODFmM2EzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYW4vcmF3LmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIGxpbnV4L2Nhbi9yYXcuaAorICoKKyAqIERlZmluaXRpb25zIGZvciByYXcgQ0FOIHNvY2tldHMKKyAqCisgKiBBdXRob3JzOiBPbGl2ZXIgSGFydGtvcHAgPG9saXZlci5oYXJ0a29wcEB2b2xrc3dhZ2VuLmRlPgorICogICAgICAgICAgVXJzIFRodWVybWFubiAgIDx1cnMudGh1ZXJtYW5uQHZvbGtzd2FnZW4uZGU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNyBWb2xrc3dhZ2VuIEdyb3VwIEVsZWN0cm9uaWMgUmVzZWFyY2gKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICovCisKKyNpZm5kZWYgQ0FOX1JBV19ICisjZGVmaW5lIENBTl9SQVdfSAorCisjaW5jbHVkZSA8bGludXgvY2FuLmg+CisKKyNkZWZpbmUgU09MX0NBTl9SQVcgKFNPTF9DQU5fQkFTRSArIENBTl9SQVcpCisKKy8qIGZvciBzb2NrZXQgb3B0aW9ucyBhZmZlY3RpbmcgdGhlIHNvY2tldCAobm90IHRoZSBnbG9iYWwgc3lzdGVtKSAqLworCitlbnVtIHsKKwlDQU5fUkFXX0ZJTFRFUiA9IDEsCS8qIHNldCAwIC4uIG4gY2FuX2ZpbHRlcihzKSAgICAgICAgICAqLworCUNBTl9SQVdfRVJSX0ZJTFRFUiwJLyogc2V0IGZpbHRlciBmb3IgZXJyb3IgZnJhbWVzICAgICAgICovCisJQ0FOX1JBV19MT09QQkFDSywJLyogbG9jYWwgbG9vcGJhY2sgKGRlZmF1bHQ6b24pICAgICAgICovCisJQ0FOX1JBV19SRUNWX09XTl9NU0dTCS8qIHJlY2VpdmUgbXkgb3duIG1zZ3MgKGRlZmF1bHQ6b2ZmKSAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMmZmMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaApAQCAtMCwwICsxLDM1MyBAQAorLyoKKyAqIFRoaXMgaXMgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyAqCisgKiBBbmRyZXcgRy4gTW9yZ2FuIDxtb3JnYW5Aa2VybmVsLm9yZz4KKyAqIEFsZXhhbmRlciBLamVsZGFhcyA8YXN0b3JAZ3VhcmRpYW4ubm8+CisgKiB3aXRoIGhlbHAgZnJvbSBBbGVwaDEsIFJvbGFuZCBCdXJlc3VuZCBhbmQgQW5kcmV3IE1haW4uCisgKgorICogU2VlIGhlcmUgZm9yIHRoZSBsaWJjYXAgbGlicmFyeSAoIlBPU0lYIGRyYWZ0IiBjb21wbGlhbmNlKToKKyAqCisgKiBmdHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvbGlicy9zZWN1cml0eS9saW51eC1wcml2cy9rZXJuZWwtMi42LworICovCisKKyNpZm5kZWYgX0xJTlVYX0NBUEFCSUxJVFlfSAorI2RlZmluZSBfTElOVVhfQ0FQQUJJTElUWV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgdGFza19zdHJ1Y3Q7CisKKy8qIFVzZXItbGV2ZWwgZG8gbW9zdCBvZiB0aGUgbWFwcGluZyBiZXR3ZWVuIGtlcm5lbCBhbmQgdXNlcgorICAgY2FwYWJpbGl0aWVzIGJhc2VkIG9uIHRoZSB2ZXJzaW9uIHRhZyBnaXZlbiBieSB0aGUga2VybmVsLiBUaGUKKyAgIGtlcm5lbCBtaWdodCBiZSBzb21ld2hhdCBiYWNrd2FyZHMgY29tcGF0aWJsZSwgYnV0IGRvbid0IGJldCBvbgorICAgaXQuICovCisKKy8qIE5vdGUsIGNhcF90LCBpcyBkZWZpbmVkIGJ5IFBPU0lYIChkcmFmdCkgdG8gYmUgYW4gIm9wYXF1ZSIgcG9pbnRlciB0bworICAgYSBzZXQgb2YgdGhyZWUgY2FwYWJpbGl0eSBzZXRzLiAgVGhlIHRyYW5zcG9zaXRpb24gb2YgMyp0aGUKKyAgIGZvbGxvd2luZyBzdHJ1Y3R1cmUgdG8gc3VjaCBhIGNvbXBvc2l0ZSBpcyBiZXR0ZXIgaGFuZGxlZCBpbiBhIHVzZXIKKyAgIGxpYnJhcnkgc2luY2UgdGhlIGRyYWZ0IHN0YW5kYXJkIHJlcXVpcmVzIHRoZSB1c2Ugb2YgbWFsbG9jL2ZyZWUKKyAgIGV0Yy4uICovCisKKyNkZWZpbmUgX0xJTlVYX0NBUEFCSUxJVFlfVkVSU0lPTl8xICAweDE5OTgwMzMwCisjZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1UzMlNfMSAgICAgMQorCisjZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT05fMiAgMHgyMDA3MTAyNiAgLyogZGVwcmVjYXRlZCAtIHVzZSB2MyAqLworI2RlZmluZSBfTElOVVhfQ0FQQUJJTElUWV9VMzJTXzIgICAgIDIKKworI2RlZmluZSBfTElOVVhfQ0FQQUJJTElUWV9WRVJTSU9OXzMgIDB4MjAwODA1MjIKKyNkZWZpbmUgX0xJTlVYX0NBUEFCSUxJVFlfVTMyU18zICAgICAyCisKK3R5cGVkZWYgc3RydWN0IF9fdXNlcl9jYXBfaGVhZGVyX3N0cnVjdCB7CisJX191MzIgdmVyc2lvbjsKKwlpbnQgcGlkOworfSAqY2FwX3VzZXJfaGVhZGVyX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9fdXNlcl9jYXBfZGF0YV9zdHJ1Y3QgeworICAgICAgICBfX3UzMiBlZmZlY3RpdmU7CisgICAgICAgIF9fdTMyIHBlcm1pdHRlZDsKKyAgICAgICAgX191MzIgaW5oZXJpdGFibGU7Cit9ICpjYXBfdXNlcl9kYXRhX3Q7CisKKworI2RlZmluZSBWRlNfQ0FQX1JFVklTSU9OX01BU0sJMHhGRjAwMDAwMAorI2RlZmluZSBWRlNfQ0FQX1JFVklTSU9OX1NISUZUCTI0CisjZGVmaW5lIFZGU19DQVBfRkxBR1NfTUFTSwl+VkZTX0NBUF9SRVZJU0lPTl9NQVNLCisjZGVmaW5lIFZGU19DQVBfRkxBR1NfRUZGRUNUSVZFCTB4MDAwMDAxCisKKyNkZWZpbmUgVkZTX0NBUF9SRVZJU0lPTl8xCTB4MDEwMDAwMDAKKyNkZWZpbmUgVkZTX0NBUF9VMzJfMSAgICAgICAgICAgMQorI2RlZmluZSBYQVRUUl9DQVBTX1NaXzEgICAgICAgICAoc2l6ZW9mKF9fbGUzMikqKDEgKyAyKlZGU19DQVBfVTMyXzEpKQorCisjZGVmaW5lIFZGU19DQVBfUkVWSVNJT05fMgkweDAyMDAwMDAwCisjZGVmaW5lIFZGU19DQVBfVTMyXzIgICAgICAgICAgIDIKKyNkZWZpbmUgWEFUVFJfQ0FQU19TWl8yICAgICAgICAgKHNpemVvZihfX2xlMzIpKigxICsgMipWRlNfQ0FQX1UzMl8yKSkKKworI2RlZmluZSBYQVRUUl9DQVBTX1NaICAgICAgICAgICBYQVRUUl9DQVBTX1NaXzIKKyNkZWZpbmUgVkZTX0NBUF9VMzIgICAgICAgICAgICAgVkZTX0NBUF9VMzJfMgorI2RlZmluZSBWRlNfQ0FQX1JFVklTSU9OCVZGU19DQVBfUkVWSVNJT05fMgorCitzdHJ1Y3QgdmZzX2NhcF9kYXRhIHsKKwlfX2xlMzIgbWFnaWNfZXRjOyAgICAgICAgICAgIC8qIExpdHRsZSBlbmRpYW4gKi8KKwlzdHJ1Y3QgeworCQlfX2xlMzIgcGVybWl0dGVkOyAgICAvKiBMaXR0bGUgZW5kaWFuICovCisJCV9fbGUzMiBpbmhlcml0YWJsZTsgIC8qIExpdHRsZSBlbmRpYW4gKi8KKwl9IGRhdGFbVkZTX0NBUF9VMzJdOworfTsKKworCisvKgorICogQmFja3dhcmRseSBjb21wYXRpYmxlIGRlZmluaXRpb24gZm9yIHNvdXJjZSBjb2RlIC0gdHJhcHBlZCBpbiBhCisgKiAzMi1iaXQgd29ybGQuIElmIHlvdSBmaW5kIHlvdSBuZWVkIHRoaXMsIHBsZWFzZSBjb25zaWRlciB1c2luZworICogbGliY2FwIHRvIHVudHJhcCB5b3Vyc2VsZi4uLgorICovCisjZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT04gIF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT05fMQorI2RlZmluZSBfTElOVVhfQ0FQQUJJTElUWV9VMzJTICAgICBfTElOVVhfQ0FQQUJJTElUWV9VMzJTXzEKKworCisKKy8qKgorICoqIFBPU0lYLWRyYWZ0IGRlZmluZWQgY2FwYWJpbGl0aWVzLgorICoqLworCisvKiBJbiBhIHN5c3RlbSB3aXRoIHRoZSBbX1BPU0lYX0NIT1dOX1JFU1RSSUNURURdIG9wdGlvbiBkZWZpbmVkLCB0aGlzCisgICBvdmVycmlkZXMgdGhlIHJlc3RyaWN0aW9uIG9mIGNoYW5naW5nIGZpbGUgb3duZXJzaGlwIGFuZCBncm91cAorICAgb3duZXJzaGlwLiAqLworCisjZGVmaW5lIENBUF9DSE9XTiAgICAgICAgICAgIDAKKworLyogT3ZlcnJpZGUgYWxsIERBQyBhY2Nlc3MsIGluY2x1ZGluZyBBQ0wgZXhlY3V0ZSBhY2Nlc3MgaWYKKyAgIFtfUE9TSVhfQUNMXSBpcyBkZWZpbmVkLiBFeGNsdWRpbmcgREFDIGFjY2VzcyBjb3ZlcmVkIGJ5CisgICBDQVBfTElOVVhfSU1NVVRBQkxFLiAqLworCisjZGVmaW5lIENBUF9EQUNfT1ZFUlJJREUgICAgIDEKKworLyogT3ZlcnJpZGVzIGFsbCBEQUMgcmVzdHJpY3Rpb25zIHJlZ2FyZGluZyByZWFkIGFuZCBzZWFyY2ggb24gZmlsZXMKKyAgIGFuZCBkaXJlY3RvcmllcywgaW5jbHVkaW5nIEFDTCByZXN0cmljdGlvbnMgaWYgW19QT1NJWF9BQ0xdIGlzCisgICBkZWZpbmVkLiBFeGNsdWRpbmcgREFDIGFjY2VzcyBjb3ZlcmVkIGJ5IENBUF9MSU5VWF9JTU1VVEFCTEUuICovCisKKyNkZWZpbmUgQ0FQX0RBQ19SRUFEX1NFQVJDSCAgMgorCisvKiBPdmVycmlkZXMgYWxsIHJlc3RyaWN0aW9ucyBhYm91dCBhbGxvd2VkIG9wZXJhdGlvbnMgb24gZmlsZXMsIHdoZXJlCisgICBmaWxlIG93bmVyIElEIG11c3QgYmUgZXF1YWwgdG8gdGhlIHVzZXIgSUQsIGV4Y2VwdCB3aGVyZSBDQVBfRlNFVElECisgICBpcyBhcHBsaWNhYmxlLiBJdCBkb2Vzbid0IG92ZXJyaWRlIE1BQyBhbmQgREFDIHJlc3RyaWN0aW9ucy4gKi8KKworI2RlZmluZSBDQVBfRk9XTkVSICAgICAgICAgICAzCisKKy8qIE92ZXJyaWRlcyB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9ucyB0aGF0IHRoZSBlZmZlY3RpdmUgdXNlciBJRAorICAgc2hhbGwgbWF0Y2ggdGhlIGZpbGUgb3duZXIgSUQgd2hlbiBzZXR0aW5nIHRoZSBTX0lTVUlEIGFuZCBTX0lTR0lECisgICBiaXRzIG9uIHRoYXQgZmlsZTsgdGhhdCB0aGUgZWZmZWN0aXZlIGdyb3VwIElEIChvciBvbmUgb2YgdGhlCisgICBzdXBwbGVtZW50YXJ5IGdyb3VwIElEcykgc2hhbGwgbWF0Y2ggdGhlIGZpbGUgb3duZXIgSUQgd2hlbiBzZXR0aW5nCisgICB0aGUgU19JU0dJRCBiaXQgb24gdGhhdCBmaWxlOyB0aGF0IHRoZSBTX0lTVUlEIGFuZCBTX0lTR0lEIGJpdHMgYXJlCisgICBjbGVhcmVkIG9uIHN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gY2hvd24oMikgKG5vdCBpbXBsZW1lbnRlZCkuICovCisKKyNkZWZpbmUgQ0FQX0ZTRVRJRCAgICAgICAgICAgNAorCisvKiBPdmVycmlkZXMgdGhlIHJlc3RyaWN0aW9uIHRoYXQgdGhlIHJlYWwgb3IgZWZmZWN0aXZlIHVzZXIgSUQgb2YgYQorICAgcHJvY2VzcyBzZW5kaW5nIGEgc2lnbmFsIG11c3QgbWF0Y2ggdGhlIHJlYWwgb3IgZWZmZWN0aXZlIHVzZXIgSUQKKyAgIG9mIHRoZSBwcm9jZXNzIHJlY2VpdmluZyB0aGUgc2lnbmFsLiAqLworCisjZGVmaW5lIENBUF9LSUxMICAgICAgICAgICAgIDUKKworLyogQWxsb3dzIHNldGdpZCgyKSBtYW5pcHVsYXRpb24gKi8KKy8qIEFsbG93cyBzZXRncm91cHMoMikgKi8KKy8qIEFsbG93cyBmb3JnZWQgZ2lkcyBvbiBzb2NrZXQgY3JlZGVudGlhbHMgcGFzc2luZy4gKi8KKworI2RlZmluZSBDQVBfU0VUR0lEICAgICAgICAgICA2CisKKy8qIEFsbG93cyBzZXQqdWlkKDIpIG1hbmlwdWxhdGlvbiAoaW5jbHVkaW5nIGZzdWlkKS4gKi8KKy8qIEFsbG93cyBmb3JnZWQgcGlkcyBvbiBzb2NrZXQgY3JlZGVudGlhbHMgcGFzc2luZy4gKi8KKworI2RlZmluZSBDQVBfU0VUVUlEICAgICAgICAgICA3CisKKworLyoqCisgKiogTGludXgtc3BlY2lmaWMgY2FwYWJpbGl0aWVzCisgKiovCisKKy8qIFdpdGhvdXQgVkZTIHN1cHBvcnQgZm9yIGNhcGFiaWxpdGllczoKKyAqICAgVHJhbnNmZXIgYW55IGNhcGFiaWxpdHkgaW4geW91ciBwZXJtaXR0ZWQgc2V0IHRvIGFueSBwaWQsCisgKiAgIHJlbW92ZSBhbnkgY2FwYWJpbGl0eSBpbiB5b3VyIHBlcm1pdHRlZCBzZXQgZnJvbSBhbnkgcGlkCisgKiBXaXRoIFZGUyBzdXBwb3J0IGZvciBjYXBhYmlsaXRpZXMgKG5laXRoZXIgb2YgYWJvdmUsIGJ1dCkKKyAqICAgQWRkIGFueSBjYXBhYmlsaXR5IGZyb20gY3VycmVudCdzIGNhcGFiaWxpdHkgYm91bmRpbmcgc2V0CisgKiAgICAgICB0byB0aGUgY3VycmVudCBwcm9jZXNzJyBpbmhlcml0YWJsZSBzZXQKKyAqICAgQWxsb3cgdGFraW5nIGJpdHMgb3V0IG9mIGNhcGFiaWxpdHkgYm91bmRpbmcgc2V0CisgKiAgIEFsbG93IG1vZGlmaWNhdGlvbiBvZiB0aGUgc2VjdXJlYml0cyBmb3IgYSBwcm9jZXNzCisgKi8KKworI2RlZmluZSBDQVBfU0VUUENBUCAgICAgICAgICA4CisKKy8qIEFsbG93IG1vZGlmaWNhdGlvbiBvZiBTX0lNTVVUQUJMRSBhbmQgU19BUFBFTkQgZmlsZSBhdHRyaWJ1dGVzICovCisKKyNkZWZpbmUgQ0FQX0xJTlVYX0lNTVVUQUJMRSAgOQorCisvKiBBbGxvd3MgYmluZGluZyB0byBUQ1AvVURQIHNvY2tldHMgYmVsb3cgMTAyNCAqLworLyogQWxsb3dzIGJpbmRpbmcgdG8gQVRNIFZDSXMgYmVsb3cgMzIgKi8KKworI2RlZmluZSBDQVBfTkVUX0JJTkRfU0VSVklDRSAxMAorCisvKiBBbGxvdyBicm9hZGNhc3RpbmcsIGxpc3RlbiB0byBtdWx0aWNhc3QgKi8KKworI2RlZmluZSBDQVBfTkVUX0JST0FEQ0FTVCAgICAxMQorCisvKiBBbGxvdyBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiAqLworLyogQWxsb3cgYWRtaW5pc3RyYXRpb24gb2YgSVAgZmlyZXdhbGwsIG1hc3F1ZXJhZGluZyBhbmQgYWNjb3VudGluZyAqLworLyogQWxsb3cgc2V0dGluZyBkZWJ1ZyBvcHRpb24gb24gc29ja2V0cyAqLworLyogQWxsb3cgbW9kaWZpY2F0aW9uIG9mIHJvdXRpbmcgdGFibGVzICovCisvKiBBbGxvdyBzZXR0aW5nIGFyYml0cmFyeSBwcm9jZXNzIC8gcHJvY2VzcyBncm91cCBvd25lcnNoaXAgb24KKyAgIHNvY2tldHMgKi8KKy8qIEFsbG93IGJpbmRpbmcgdG8gYW55IGFkZHJlc3MgZm9yIHRyYW5zcGFyZW50IHByb3h5aW5nIChhbHNvIHZpYSBORVRfUkFXKSAqLworLyogQWxsb3cgc2V0dGluZyBUT1MgKHR5cGUgb2Ygc2VydmljZSkgKi8KKy8qIEFsbG93IHNldHRpbmcgcHJvbWlzY3VvdXMgbW9kZSAqLworLyogQWxsb3cgY2xlYXJpbmcgZHJpdmVyIHN0YXRpc3RpY3MgKi8KKy8qIEFsbG93IG11bHRpY2FzdGluZyAqLworLyogQWxsb3cgcmVhZC93cml0ZSBvZiBkZXZpY2Utc3BlY2lmaWMgcmVnaXN0ZXJzICovCisvKiBBbGxvdyBhY3RpdmF0aW9uIG9mIEFUTSBjb250cm9sIHNvY2tldHMgKi8KKworI2RlZmluZSBDQVBfTkVUX0FETUlOICAgICAgICAxMgorCisvKiBBbGxvdyB1c2Ugb2YgUkFXIHNvY2tldHMgKi8KKy8qIEFsbG93IHVzZSBvZiBQQUNLRVQgc29ja2V0cyAqLworLyogQWxsb3cgYmluZGluZyB0byBhbnkgYWRkcmVzcyBmb3IgdHJhbnNwYXJlbnQgcHJveHlpbmcgKGFsc28gdmlhIE5FVF9BRE1JTikgKi8KKworI2RlZmluZSBDQVBfTkVUX1JBVyAgICAgICAgICAxMworCisvKiBBbGxvdyBsb2NraW5nIG9mIHNoYXJlZCBtZW1vcnkgc2VnbWVudHMgKi8KKy8qIEFsbG93IG1sb2NrIGFuZCBtbG9ja2FsbCAod2hpY2ggZG9lc24ndCByZWFsbHkgaGF2ZSBhbnl0aGluZyB0byBkbworICAgd2l0aCBJUEMpICovCisKKyNkZWZpbmUgQ0FQX0lQQ19MT0NLICAgICAgICAgMTQKKworLyogT3ZlcnJpZGUgSVBDIG93bmVyc2hpcCBjaGVja3MgKi8KKworI2RlZmluZSBDQVBfSVBDX09XTkVSICAgICAgICAxNQorCisvKiBJbnNlcnQgYW5kIHJlbW92ZSBrZXJuZWwgbW9kdWxlcyAtIG1vZGlmeSBrZXJuZWwgd2l0aG91dCBsaW1pdCAqLworI2RlZmluZSBDQVBfU1lTX01PRFVMRSAgICAgICAxNgorCisvKiBBbGxvdyBpb3Blcm0vaW9wbCBhY2Nlc3MgKi8KKy8qIEFsbG93IHNlbmRpbmcgVVNCIG1lc3NhZ2VzIHRvIGFueSBkZXZpY2UgdmlhIC9wcm9jL2J1cy91c2IgKi8KKworI2RlZmluZSBDQVBfU1lTX1JBV0lPICAgICAgICAxNworCisvKiBBbGxvdyB1c2Ugb2YgY2hyb290KCkgKi8KKworI2RlZmluZSBDQVBfU1lTX0NIUk9PVCAgICAgICAxOAorCisvKiBBbGxvdyBwdHJhY2UoKSBvZiBhbnkgcHJvY2VzcyAqLworCisjZGVmaW5lIENBUF9TWVNfUFRSQUNFICAgICAgIDE5CisKKy8qIEFsbG93IGNvbmZpZ3VyYXRpb24gb2YgcHJvY2VzcyBhY2NvdW50aW5nICovCisKKyNkZWZpbmUgQ0FQX1NZU19QQUNDVCAgICAgICAgMjAKKworLyogQWxsb3cgY29uZmlndXJhdGlvbiBvZiB0aGUgc2VjdXJlIGF0dGVudGlvbiBrZXkgKi8KKy8qIEFsbG93IGFkbWluaXN0cmF0aW9uIG9mIHRoZSByYW5kb20gZGV2aWNlICovCisvKiBBbGxvdyBleGFtaW5hdGlvbiBhbmQgY29uZmlndXJhdGlvbiBvZiBkaXNrIHF1b3RhcyAqLworLyogQWxsb3cgc2V0dGluZyB0aGUgZG9tYWlubmFtZSAqLworLyogQWxsb3cgc2V0dGluZyB0aGUgaG9zdG5hbWUgKi8KKy8qIEFsbG93IGNhbGxpbmcgYmRmbHVzaCgpICovCisvKiBBbGxvdyBtb3VudCgpIGFuZCB1bW91bnQoKSwgc2V0dGluZyB1cCBuZXcgc21iIGNvbm5lY3Rpb24gKi8KKy8qIEFsbG93IHNvbWUgYXV0b2ZzIHJvb3QgaW9jdGxzICovCisvKiBBbGxvdyBuZnNzZXJ2Y3RsICovCisvKiBBbGxvdyBWTTg2X1JFUVVFU1RfSVJRICovCisvKiBBbGxvdyB0byByZWFkL3dyaXRlIHBjaSBjb25maWcgb24gYWxwaGEgKi8KKy8qIEFsbG93IGlyaXhfcHJjdGwgb24gbWlwcyAoc2V0c3RhY2tzaXplKSAqLworLyogQWxsb3cgZmx1c2hpbmcgYWxsIGNhY2hlIG9uIG02OGsgKHN5c19jYWNoZWZsdXNoKSAqLworLyogQWxsb3cgcmVtb3Zpbmcgc2VtYXBob3JlcyAqLworLyogVXNlZCBpbnN0ZWFkIG9mIENBUF9DSE9XTiB0byAiY2hvd24iIElQQyBtZXNzYWdlIHF1ZXVlcywgc2VtYXBob3JlcworICAgYW5kIHNoYXJlZCBtZW1vcnkgKi8KKy8qIEFsbG93IGxvY2tpbmcvdW5sb2NraW5nIG9mIHNoYXJlZCBtZW1vcnkgc2VnbWVudCAqLworLyogQWxsb3cgdHVybmluZyBzd2FwIG9uL29mZiAqLworLyogQWxsb3cgZm9yZ2VkIHBpZHMgb24gc29ja2V0IGNyZWRlbnRpYWxzIHBhc3NpbmcgKi8KKy8qIEFsbG93IHNldHRpbmcgcmVhZGFoZWFkIGFuZCBmbHVzaGluZyBidWZmZXJzIG9uIGJsb2NrIGRldmljZXMgKi8KKy8qIEFsbG93IHNldHRpbmcgZ2VvbWV0cnkgaW4gZmxvcHB5IGRyaXZlciAqLworLyogQWxsb3cgdHVybmluZyBETUEgb24vb2ZmIGluIHhkIGRyaXZlciAqLworLyogQWxsb3cgYWRtaW5pc3RyYXRpb24gb2YgbWQgZGV2aWNlcyAobW9zdGx5IHRoZSBhYm92ZSwgYnV0IHNvbWUKKyAgIGV4dHJhIGlvY3RscykgKi8KKy8qIEFsbG93IHR1bmluZyB0aGUgaWRlIGRyaXZlciAqLworLyogQWxsb3cgYWNjZXNzIHRvIHRoZSBudnJhbSBkZXZpY2UgKi8KKy8qIEFsbG93IGFkbWluaXN0cmF0aW9uIG9mIGFwbV9iaW9zLCBzZXJpYWwgYW5kIGJ0dHYgKFRWKSBkZXZpY2UgKi8KKy8qIEFsbG93IG1hbnVmYWN0dXJlciBjb21tYW5kcyBpbiBpc2RuIENBUEkgc3VwcG9ydCBkcml2ZXIgKi8KKy8qIEFsbG93IHJlYWRpbmcgbm9uLXN0YW5kYXJkaXplZCBwb3J0aW9ucyBvZiBwY2kgY29uZmlndXJhdGlvbiBzcGFjZSAqLworLyogQWxsb3cgRERJIGRlYnVnIGlvY3RsIG9uIHNicGNkIGRyaXZlciAqLworLyogQWxsb3cgc2V0dGluZyB1cCBzZXJpYWwgcG9ydHMgKi8KKy8qIEFsbG93IHNlbmRpbmcgcmF3IHFpYy0xMTcgY29tbWFuZHMgKi8KKy8qIEFsbG93IGVuYWJsaW5nL2Rpc2FibGluZyB0YWdnZWQgcXVldWluZyBvbiBTQ1NJIGNvbnRyb2xsZXJzIGFuZCBzZW5kaW5nCisgICBhcmJpdHJhcnkgU0NTSSBjb21tYW5kcyAqLworLyogQWxsb3cgc2V0dGluZyBlbmNyeXB0aW9uIGtleSBvbiBsb29wYmFjayBmaWxlc3lzdGVtICovCisvKiBBbGxvdyBzZXR0aW5nIHpvbmUgcmVjbGFpbSBwb2xpY3kgKi8KKworI2RlZmluZSBDQVBfU1lTX0FETUlOICAgICAgICAyMQorCisvKiBBbGxvdyB1c2Ugb2YgcmVib290KCkgKi8KKworI2RlZmluZSBDQVBfU1lTX0JPT1QgICAgICAgICAyMgorCisvKiBBbGxvdyByYWlzaW5nIHByaW9yaXR5IGFuZCBzZXR0aW5nIHByaW9yaXR5IG9uIG90aGVyIChkaWZmZXJlbnQKKyAgIFVJRCkgcHJvY2Vzc2VzICovCisvKiBBbGxvdyB1c2Ugb2YgRklGTyBhbmQgcm91bmQtcm9iaW4gKHJlYWx0aW1lKSBzY2hlZHVsaW5nIG9uIG93bgorICAgcHJvY2Vzc2VzIGFuZCBzZXR0aW5nIHRoZSBzY2hlZHVsaW5nIGFsZ29yaXRobSB1c2VkIGJ5IGFub3RoZXIKKyAgIHByb2Nlc3MuICovCisvKiBBbGxvdyBzZXR0aW5nIGNwdSBhZmZpbml0eSBvbiBvdGhlciBwcm9jZXNzZXMgKi8KKworI2RlZmluZSBDQVBfU1lTX05JQ0UgICAgICAgICAyMworCisvKiBPdmVycmlkZSByZXNvdXJjZSBsaW1pdHMuIFNldCByZXNvdXJjZSBsaW1pdHMuICovCisvKiBPdmVycmlkZSBxdW90YSBsaW1pdHMuICovCisvKiBPdmVycmlkZSByZXNlcnZlZCBzcGFjZSBvbiBleHQyIGZpbGVzeXN0ZW0gKi8KKy8qIE1vZGlmeSBkYXRhIGpvdXJuYWxpbmcgbW9kZSBvbiBleHQzIGZpbGVzeXN0ZW0gKHVzZXMgam91cm5hbGluZworICAgcmVzb3VyY2VzKSAqLworLyogTk9URTogZXh0MiBob25vcnMgZnN1aWQgd2hlbiBjaGVja2luZyBmb3IgcmVzb3VyY2Ugb3ZlcnJpZGVzLCBzbworICAgeW91IGNhbiBvdmVycmlkZSB1c2luZyBmc3VpZCB0b28gKi8KKy8qIE92ZXJyaWRlIHNpemUgcmVzdHJpY3Rpb25zIG9uIElQQyBtZXNzYWdlIHF1ZXVlcyAqLworLyogQWxsb3cgbW9yZSB0aGFuIDY0aHogaW50ZXJydXB0cyBmcm9tIHRoZSByZWFsLXRpbWUgY2xvY2sgKi8KKy8qIE92ZXJyaWRlIG1heCBudW1iZXIgb2YgY29uc29sZXMgb24gY29uc29sZSBhbGxvY2F0aW9uICovCisvKiBPdmVycmlkZSBtYXggbnVtYmVyIG9mIGtleW1hcHMgKi8KKworI2RlZmluZSBDQVBfU1lTX1JFU09VUkNFICAgICAyNAorCisvKiBBbGxvdyBtYW5pcHVsYXRpb24gb2Ygc3lzdGVtIGNsb2NrICovCisvKiBBbGxvdyBpcml4X3N0aW1lIG9uIG1pcHMgKi8KKy8qIEFsbG93IHNldHRpbmcgdGhlIHJlYWwtdGltZSBjbG9jayAqLworCisjZGVmaW5lIENBUF9TWVNfVElNRSAgICAgICAgIDI1CisKKy8qIEFsbG93IGNvbmZpZ3VyYXRpb24gb2YgdHR5IGRldmljZXMgKi8KKy8qIEFsbG93IHZoYW5ndXAoKSBvZiB0dHkgKi8KKworI2RlZmluZSBDQVBfU1lTX1RUWV9DT05GSUcgICAyNgorCisvKiBBbGxvdyB0aGUgcHJpdmlsZWdlZCBhc3BlY3RzIG9mIG1rbm9kKCkgKi8KKworI2RlZmluZSBDQVBfTUtOT0QgICAgICAgICAgICAyNworCisvKiBBbGxvdyB0YWtpbmcgb2YgbGVhc2VzIG9uIGZpbGVzICovCisKKyNkZWZpbmUgQ0FQX0xFQVNFICAgICAgICAgICAgMjgKKworI2RlZmluZSBDQVBfQVVESVRfV1JJVEUgICAgICAyOQorCisjZGVmaW5lIENBUF9BVURJVF9DT05UUk9MICAgIDMwCisKKyNkZWZpbmUgQ0FQX1NFVEZDQVAJICAgICAzMQorCisvKiBPdmVycmlkZSBNQUMgYWNjZXNzLgorICAgVGhlIGJhc2Uga2VybmVsIGVuZm9yY2VzIG5vIE1BQyBwb2xpY3kuCisgICBBbiBMU00gbWF5IGVuZm9yY2UgYSBNQUMgcG9saWN5LCBhbmQgaWYgaXQgZG9lcyBhbmQgaXQgY2hvb3NlcworICAgdG8gaW1wbGVtZW50IGNhcGFiaWxpdHkgYmFzZWQgb3ZlcnJpZGVzIG9mIHRoYXQgcG9saWN5LCB0aGlzIGlzCisgICB0aGUgY2FwYWJpbGl0eSBpdCBzaG91bGQgdXNlIHRvIGRvIHNvLiAqLworCisjZGVmaW5lIENBUF9NQUNfT1ZFUlJJREUgICAgIDMyCisKKy8qIEFsbG93IE1BQyBjb25maWd1cmF0aW9uIG9yIHN0YXRlIGNoYW5nZXMuCisgICBUaGUgYmFzZSBrZXJuZWwgcmVxdWlyZXMgbm8gTUFDIGNvbmZpZ3VyYXRpb24uCisgICBBbiBMU00gbWF5IGVuZm9yY2UgYSBNQUMgcG9saWN5LCBhbmQgaWYgaXQgZG9lcyBhbmQgaXQgY2hvb3NlcworICAgdG8gaW1wbGVtZW50IGNhcGFiaWxpdHkgYmFzZWQgY2hlY2tzIG9uIG1vZGlmaWNhdGlvbnMgdG8gdGhhdAorICAgcG9saWN5IG9yIHRoZSBkYXRhIHJlcXVpcmVkIHRvIG1haW50YWluIGl0LCB0aGlzIGlzIHRoZQorICAgY2FwYWJpbGl0eSBpdCBzaG91bGQgdXNlIHRvIGRvIHNvLiAqLworCisjZGVmaW5lIENBUF9NQUNfQURNSU4gICAgICAgIDMzCisKKy8qIEFsbG93IGNvbmZpZ3VyaW5nIHRoZSBrZXJuZWwncyBzeXNsb2cgKHByaW50ayBiZWhhdmlvdXIpICovCisKKyNkZWZpbmUgQ0FQX1NZU0xPRyAgICAgICAgICAgMzQKKworLyogQWxsb3cgdHJpZ2dlcmluZyBzb21ldGhpbmcgdGhhdCB3aWxsIHdha2UgdGhlIHN5c3RlbSAqLworCisjZGVmaW5lIENBUF9XQUtFX0FMQVJNICAgICAgICAgICAgMzUKKworCisjZGVmaW5lIENBUF9MQVNUX0NBUCAgICAgICAgIENBUF9XQUtFX0FMQVJNCisKKyNkZWZpbmUgY2FwX3ZhbGlkKHgpICgoeCkgPj0gMCAmJiAoeCkgPD0gQ0FQX0xBU1RfQ0FQKQorCisvKgorICogQml0IGxvY2F0aW9uIG9mIGVhY2ggY2FwYWJpbGl0eSAodXNlZCBieSB1c2VyLXNwYWNlIGxpYnJhcnkgYW5kIGtlcm5lbCkKKyAqLworCisjZGVmaW5lIENBUF9UT19JTkRFWCh4KSAgICAgKCh4KSA+PiA1KSAgICAgICAgLyogMSA8PCA1ID09IGJpdHMgaW4gX191MzIgKi8KKyNkZWZpbmUgQ0FQX1RPX01BU0soeCkgICAgICAoMSA8PCAoKHgpICYgMzEpKSAvKiBtYXNrIGZvciBpbmRleGVkIF9fdTMyICovCisKKworI2VuZGlmIC8qICFfTElOVVhfQ0FQQUJJTElUWV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NhcGkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMDBhZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NhcGkuaApAQCAtMCwwICsxLDEzMSBAQAorLyogJElkOiBjYXBpLmgsdiAxLjQuNi4xIDIwMDEvMDkvMjMgMjI6MjU6MDUga2FpIEV4cCAkCisgKiAKKyAqIENBUEkgMi4wIEludGVyZmFjZSBmb3IgTGludXgKKyAqIAorICogQ29weXJpZ2h0IDE5OTcgYnkgQ2Fyc3RlbiBQYWV0aCAoY2FsbGVAY2FsbGUuaW4tYmVybGluLmRlKQorICogCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqLworCisjaWZuZGVmIF9fTElOVVhfQ0FQSV9IX18KKyNkZWZpbmUgX19MSU5VWF9DQVBJX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbGNhcGkuaD4KKworLyoKKyAqIENBUElfUkVHSVNURVIKKyAqLworCit0eXBlZGVmIHN0cnVjdCBjYXBpX3JlZ2lzdGVyX3BhcmFtcyB7CS8qIENBUElfUkVHSVNURVIgKi8KKwlfX3UzMiBsZXZlbDNjbnQ7CS8qIE5vLiBvZiBzaW11bGF0bmVvdXMgdXNlciBkYXRhIGNvbm5lY3Rpb25zICovCisJX191MzIgZGF0YWJsa2NudDsJLyogTm8uIG9mIGJ1ZmZlcmVkIGRhdGEgbWVzc2FnZXMgKi8KKwlfX3UzMiBkYXRhYmxrbGVuOwkvKiBTaXplIG9mIGJ1ZmZlcmVkIGRhdGEgbWVzc2FnZXMgKi8KK30gY2FwaV9yZWdpc3Rlcl9wYXJhbXM7CisKKyNkZWZpbmUJQ0FQSV9SRUdJU1RFUglfSU9XKCdDJywweDAxLHN0cnVjdCBjYXBpX3JlZ2lzdGVyX3BhcmFtcykKKworLyoKKyAqIENBUElfR0VUX01BTlVGQUNUVVJFUgorICovCisKKyNkZWZpbmUgQ0FQSV9NQU5VRkFDVFVSRVJfTEVOCQk2NAorCisjZGVmaW5lCUNBUElfR0VUX01BTlVGQUNUVVJFUglfSU9XUignQycsMHgwNixpbnQpCS8qIGJyb2tlbjogd2FudGVkIHNpemUgNjQgKENBUElfTUFOVUZBQ1RVUkVSX0xFTikgKi8KKworLyoKKyAqIENBUElfR0VUX1ZFUlNJT04KKyAqLworCit0eXBlZGVmIHN0cnVjdCBjYXBpX3ZlcnNpb24geworCV9fdTMyIG1ham9ydmVyc2lvbjsKKwlfX3UzMiBtaW5vcnZlcnNpb247CisJX191MzIgbWFqb3JtYW51dmVyc2lvbjsKKwlfX3UzMiBtaW5vcm1hbnV2ZXJzaW9uOworfSBjYXBpX3ZlcnNpb247CisKKyNkZWZpbmUgQ0FQSV9HRVRfVkVSU0lPTglfSU9XUignQycsMHgwNyxzdHJ1Y3QgY2FwaV92ZXJzaW9uKQorCisvKgorICogQ0FQSV9HRVRfU0VSSUFMCisgKi8KKworI2RlZmluZSBDQVBJX1NFUklBTF9MRU4JCTgKKyNkZWZpbmUgQ0FQSV9HRVRfU0VSSUFMCQlfSU9XUignQycsMHgwOCxpbnQpCS8qIGJyb2tlbjogd2FudGVkIHNpemUgOCAoQ0FQSV9TRVJJQUxfTEVOKSAqLworCisvKgorICogQ0FQSV9HRVRfUFJPRklMRQorICovCisKK3R5cGVkZWYgc3RydWN0IGNhcGlfcHJvZmlsZSB7CisJX191MTYgbmNvbnRyb2xsZXI7CS8qIG51bWJlciBvZiBpbnN0YWxsZWQgY29udHJvbGxlciAqLworCV9fdTE2IG5iY2hhbm5lbDsJLyogbnVtYmVyIG9mIEItQ2hhbm5lbHMgKi8KKwlfX3UzMiBnb3B0aW9uczsJCS8qIGdsb2JhbCBvcHRpb25zICovCisJX191MzIgc3VwcG9ydDE7CQkvKiBCMSBwcm90b2NvbHMgc3VwcG9ydCAqLworCV9fdTMyIHN1cHBvcnQyOwkJLyogQjIgcHJvdG9jb2xzIHN1cHBvcnQgKi8KKwlfX3UzMiBzdXBwb3J0MzsJCS8qIEIzIHByb3RvY29scyBzdXBwb3J0ICovCisJX191MzIgcmVzZXJ2ZWRbNl07CS8qIHJlc2VydmVkICovCisJX191MzIgbWFudVs1XTsJCS8qIG1hbnVmYWN0dXJlciBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLworfSBjYXBpX3Byb2ZpbGU7CisKKyNkZWZpbmUgQ0FQSV9HRVRfUFJPRklMRQlfSU9XUignQycsMHgwOSxzdHJ1Y3QgY2FwaV9wcm9maWxlKQorCit0eXBlZGVmIHN0cnVjdCBjYXBpX21hbnVmYWN0dXJlcl9jbWQgeworCXVuc2lnbmVkIGxvbmcgY21kOworCXZvaWQgKmRhdGE7Cit9IGNhcGlfbWFudWZhY3R1cmVyX2NtZDsKKworLyoKKyAqIENBUElfTUFOVUZBQ1RVUkVSX0NNRAorICovCisKKyNkZWZpbmUgQ0FQSV9NQU5VRkFDVFVSRVJfQ01ECV9JT1dSKCdDJywweDIwLCBzdHJ1Y3QgY2FwaV9tYW51ZmFjdHVyZXJfY21kKQorCisvKgorICogQ0FQSV9HRVRfRVJSQ09ERQorICogY2FwaSBlcnJjb2RlIGlzIHNldCwgKiBpZiByZWFkLCB3cml0ZSwgb3IgaW9jdGwgcmV0dXJucyBFSU8sCisgKiBpb2N0bCByZXR1cm5zIGVycmNvZGUgZGlyZWN0bHksIGFuZCBpbiBhcmcsIGlmICE9IDAKKyAqLworCisjZGVmaW5lIENBUElfR0VUX0VSUkNPREUJX0lPUignQycsMHgyMSwgX191MTYpCisKKy8qCisgKiBDQVBJX0lOU1RBTExFRAorICovCisjZGVmaW5lIENBUElfSU5TVEFMTEVECQlfSU9SKCdDJywweDIyLCBfX3UxNikKKworCisvKgorICogbWVtYmVyIGNvbnRyIGlzIGlucHV0IGZvcgorICogQ0FQSV9HRVRfTUFOVUZBQ1RVUkVSLCBDQVBJX1ZFUlNJT04sIENBUElfR0VUX1NFUklBTAorICogYW5kIENBUElfR0VUX1BST0ZJTEUKKyAqLwordHlwZWRlZiB1bmlvbiBjYXBpX2lvY3RsX3N0cnVjdCB7CisJX191MzIgY29udHI7CisJY2FwaV9yZWdpc3Rlcl9wYXJhbXMgcnBhcmFtczsKKwlfX3U4IG1hbnVmYWN0dXJlcltDQVBJX01BTlVGQUNUVVJFUl9MRU5dOworCWNhcGlfdmVyc2lvbiB2ZXJzaW9uOworCV9fdTggc2VyaWFsW0NBUElfU0VSSUFMX0xFTl07CisJY2FwaV9wcm9maWxlIHByb2ZpbGU7CisJY2FwaV9tYW51ZmFjdHVyZXJfY21kIGNtZDsKKwlfX3UxNiBlcnJjb2RlOworfSBjYXBpX2lvY3RsX3N0cnVjdDsKKworLyoKKyAqIE1pZGRsZXdhcmUgZXh0ZW5zaW9uCisgKi8KKworI2RlZmluZSBDQVBJRkxBR19ISUdISkFDS0lORwkweDAwMDEKKworI2RlZmluZSBDQVBJX0dFVF9GTEFHUwkJX0lPUignQycsMHgyMywgdW5zaWduZWQpCisjZGVmaW5lIENBUElfU0VUX0ZMQUdTCQlfSU9SKCdDJywweDI0LCB1bnNpZ25lZCkKKyNkZWZpbmUgQ0FQSV9DTFJfRkxBR1MJCV9JT1IoJ0MnLDB4MjUsIHVuc2lnbmVkKQorCisjZGVmaW5lIENBUElfTkNDSV9PUEVOQ09VTlQJX0lPUignQycsMHgyNiwgdW5zaWduZWQpCisKKyNkZWZpbmUgQ0FQSV9OQ0NJX0dFVFVOSVQJX0lPUignQycsMHgyNywgdW5zaWduZWQpCisKKyNlbmRpZgkJCQkvKiBfX0xJTlVYX0NBUElfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NjaXNzX2RlZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2Npc3NfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNmI2NzAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NjaXNzX2RlZnMuaApAQCAtMCwwICsxLDEzMCBAQAorI2lmbmRlZiBDQ0lTU19ERUZTX0gKKyNkZWZpbmUgQ0NJU1NfREVGU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBnZW5lcmFsIGJvdW5kYXJ5IGRlZmluaXRpb25zICovCisjZGVmaW5lIFNFTlNFSU5GT0JZVEVTICAgICAgICAgIDMyIC8qIG5vdGUgdGhhdCB0aGlzIHZhbHVlIG1heSB2YXJ5CisJCQkJICAgICAgYmV0d2VlbiBob3N0IGltcGxlbWVudGF0aW9ucyAqLworCisvKiBDb21tYW5kIFN0YXR1cyB2YWx1ZSAqLworI2RlZmluZSBDTURfU1VDQ0VTUyAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgQ01EX1RBUkdFVF9TVEFUVVMgICAgICAgMHgwMDAxCisjZGVmaW5lIENNRF9EQVRBX1VOREVSUlVOICAgICAgIDB4MDAwMgorI2RlZmluZSBDTURfREFUQV9PVkVSUlVOICAgICAgICAweDAwMDMKKyNkZWZpbmUgQ01EX0lOVkFMSUQgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIENNRF9QUk9UT0NPTF9FUlIgICAgICAgIDB4MDAwNQorI2RlZmluZSBDTURfSEFSRFdBUkVfRVJSICAgICAgICAweDAwMDYKKyNkZWZpbmUgQ01EX0NPTk5FQ1RJT05fTE9TVCAgICAgMHgwMDA3CisjZGVmaW5lIENNRF9BQk9SVEVEICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBDTURfQUJPUlRfRkFJTEVEICAgICAgICAweDAwMDkKKyNkZWZpbmUgQ01EX1VOU09MSUNJVEVEX0FCT1JUICAgMHgwMDBBCisjZGVmaW5lIENNRF9USU1FT1VUICAgICAgICAgICAgIDB4MDAwQgorI2RlZmluZSBDTURfVU5BQk9SVEFCTEUJCTB4MDAwQworCisvKiB0cmFuc2ZlciBkaXJlY3Rpb24gKi8KKyNkZWZpbmUgWEZFUl9OT05FICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBYRkVSX1dSSVRFICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFhGRVJfUkVBRCAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgWEZFUl9SU1ZEICAgICAgICAgICAgICAgMHgwMworCisvKiB0YXNrIGF0dHJpYnV0ZSAqLworI2RlZmluZSBBVFRSX1VOVEFHR0VEICAgICAgICAgICAweDAwCisjZGVmaW5lIEFUVFJfU0lNUExFICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQVRUUl9IRUFET0ZRVUVVRSAgICAgICAgMHgwNQorI2RlZmluZSBBVFRSX09SREVSRUQgICAgICAgICAgICAweDA2CisjZGVmaW5lIEFUVFJfQUNBICAgICAgICAgICAgICAgIDB4MDcKKworLyogY2RiIHR5cGUgKi8KKyNkZWZpbmUgVFlQRV9DTUQJCQkJMHgwMAorI2RlZmluZSBUWVBFX01TRwkJCQkweDAxCisKKy8qIFR5cGUgZGVmcyB1c2VkIGluIHRoZSBmb2xsb3dpbmcgc3RydWN0cyAqLworI2RlZmluZSBCWVRFIF9fdTgKKyNkZWZpbmUgV09SRCBfX3UxNgorI2RlZmluZSBIV09SRCBfX3UxNgorI2RlZmluZSBEV09SRCBfX3UzMgorCisjZGVmaW5lIENJU1NfTUFYX0xVTgkxMDI0CisKKyNkZWZpbmUgTEVWRUwyTFVOICAgMSAvKiBpbmRleCBpbnRvIFRhcmdldCh4KSBzdHJ1Y3R1cmUsIGR1ZSB0byBieXRlIHN3YXBwaW5nICovCisjZGVmaW5lIExFVkVMM0xVTiAgIDAKKworI3ByYWdtYSBwYWNrKDEpCisKKy8qIENvbW1hbmQgTGlzdCBTdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgdW5pb24gX1NDU0kzQWRkcl9zdHJ1Y3QgeworICAgc3RydWN0IHsKKyAgICBCWVRFIERldjsKKyAgICBCWVRFIEJ1czo2OworICAgIEJZVEUgTW9kZToyOyAgICAgICAgLyogYjAwICovCisgIH0gUGVyaXBEZXY7CisgICBzdHJ1Y3QgeworICAgIEJZVEUgRGV2TFNCOworICAgIEJZVEUgRGV2TVNCOjY7CisgICAgQllURSBNb2RlOjI7ICAgICAgICAvKiBiMDEgKi8KKyAgfSBMb2dEZXY7CisgICBzdHJ1Y3QgeworICAgIEJZVEUgRGV2OjU7CisgICAgQllURSBCdXM6MzsKKyAgICBCWVRFIFRhcmc6NjsKKyAgICBCWVRFIE1vZGU6MjsgICAgICAgIC8qIGIxMCAqLworICB9IExvZ1VuaXQ7Cit9IFNDU0kzQWRkcl9zdHJ1Y3Q7CisKK3R5cGVkZWYgc3RydWN0IF9QaHlzRGV2QWRkcl9zdHJ1Y3QgeworICBEV09SRCAgICAgICAgICAgICBUYXJnZXRJZDoyNDsKKyAgRFdPUkQgICAgICAgICAgICAgQnVzOjY7CisgIERXT1JEICAgICAgICAgICAgIE1vZGU6MjsKKyAgU0NTSTNBZGRyX3N0cnVjdCAgVGFyZ2V0WzJdOyAvKiAyIGxldmVsIHRhcmdldCBkZXZpY2UgYWRkciAqLworfSBQaHlzRGV2QWRkcl9zdHJ1Y3Q7CisKK3R5cGVkZWYgc3RydWN0IF9Mb2dEZXZBZGRyX3N0cnVjdCB7CisgIERXT1JEICAgICAgICAgICAgVm9sSWQ6MzA7CisgIERXT1JEICAgICAgICAgICAgTW9kZToyOworICBCWVRFICAgICAgICAgICAgIHJlc2VydmVkWzRdOworfSBMb2dEZXZBZGRyX3N0cnVjdDsKKwordHlwZWRlZiB1bmlvbiBfTFVOQWRkcl9zdHJ1Y3QgeworICBCWVRFICAgICAgICAgICAgICAgTHVuQWRkckJ5dGVzWzhdOworICBTQ1NJM0FkZHJfc3RydWN0ICAgU0NTSTNMdW5bNF07CisgIFBoeXNEZXZBZGRyX3N0cnVjdCBQaHlzRGV2OworICBMb2dEZXZBZGRyX3N0cnVjdCAgTG9nRGV2OworfSBMVU5BZGRyX3N0cnVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgX1JlcXVlc3RCbG9ja19zdHJ1Y3QgeworICBCWVRFICAgQ0RCTGVuOworICBzdHJ1Y3QgeworICAgIEJZVEUgVHlwZTozOworICAgIEJZVEUgQXR0cmlidXRlOjM7CisgICAgQllURSBEaXJlY3Rpb246MjsKKyAgfSBUeXBlOworICBIV09SRCAgVGltZW91dDsKKyAgQllURSAgIENEQlsxNl07Cit9IFJlcXVlc3RCbG9ja19zdHJ1Y3Q7CisKK3R5cGVkZWYgdW5pb24gX01vcmVFcnJJbmZvX3N0cnVjdHsKKyAgc3RydWN0IHsKKyAgICBCWVRFICBSZXNlcnZlZFszXTsKKyAgICBCWVRFICBUeXBlOworICAgIERXT1JEIEVycm9ySW5mbzsKKyAgfSBDb21tb25fSW5mbzsKKyAgc3RydWN0eworICAgIEJZVEUgIFJlc2VydmVkWzJdOworICAgIEJZVEUgIG9mZmVuc2Vfc2l6ZTsgLyogc2l6ZSBvZiBvZmZlbmRpbmcgZW50cnkgKi8KKyAgICBCWVRFICBvZmZlbnNlX251bTsgIC8qIGJ5dGUgIyBvZiBvZmZlbnNlIDAtYmFzZSAqLworICAgIERXT1JEIG9mZmVuc2VfdmFsdWU7CisgIH0gSW52YWxpZF9DbWQ7Cit9IE1vcmVFcnJJbmZvX3N0cnVjdDsKK3R5cGVkZWYgc3RydWN0IF9FcnJvckluZm9fc3RydWN0IHsKKyAgQllURSAgICAgICAgICAgICAgIFNjc2lTdGF0dXM7CisgIEJZVEUgICAgICAgICAgICAgICBTZW5zZUxlbjsKKyAgSFdPUkQgICAgICAgICAgICAgIENvbW1hbmRTdGF0dXM7CisgIERXT1JEICAgICAgICAgICAgICBSZXNpZHVhbENudDsKKyAgTW9yZUVyckluZm9fc3RydWN0IE1vcmVFcnJJbmZvOworICBCWVRFICAgICAgICAgICAgICAgU2Vuc2VJbmZvW1NFTlNFSU5GT0JZVEVTXTsKK30gRXJyb3JJbmZvX3N0cnVjdDsKKworI3ByYWdtYSBwYWNrKCkKKworI2VuZGlmIC8qIENDSVNTX0RFRlNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jY2lzc19pb2N0bC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jY2lzc19pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNWMyYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NjaXNzX2lvY3RsLmgKQEAgLTAsMCArMSw4OCBAQAorI2lmbmRlZiBDQ0lTU19JT0NUTEgKKyNkZWZpbmUgQ0NJU1NfSU9DVExICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvY2Npc3NfZGVmcy5oPgorCisjZGVmaW5lIENDSVNTX0lPQ19NQUdJQyAnQicKKworCit0eXBlZGVmIHN0cnVjdCBfY2Npc3NfcGNpX2luZm9fc3RydWN0Cit7CisJdW5zaWduZWQgY2hhciAJYnVzOworCXVuc2lnbmVkIGNoYXIgCWRldl9mbjsKKwl1bnNpZ25lZCBzaG9ydAlkb21haW47CisJX191MzIgCQlib2FyZF9pZDsKK30gY2Npc3NfcGNpX2luZm9fc3RydWN0OyAKKwordHlwZWRlZiBzdHJ1Y3QgX2NjaXNzX2NvYWxpbnRfc3RydWN0Cit7CisJX191MzIgIGRlbGF5OworCV9fdTMyICBjb3VudDsKK30gY2Npc3NfY29hbGludF9zdHJ1Y3Q7CisKK3R5cGVkZWYgY2hhciBOb2RlTmFtZV90eXBlWzE2XTsKKwordHlwZWRlZiBfX3UzMiBIZWFydGJlYXRfdHlwZTsKKworI2RlZmluZSBDSVNTX1BBUlNDU0lVMiAJMHgwMDAxCisjZGVmaW5lIENJU1NfUEFSQ1NDSVUzIAkweDAwMDIKKyNkZWZpbmUgQ0lTU19GSUJSRTFHCTB4MDEwMAorI2RlZmluZSBDSVNTX0ZJQlJFMkcJMHgwMjAwCit0eXBlZGVmIF9fdTMyIEJ1c1R5cGVzX3R5cGU7CisKK3R5cGVkZWYgY2hhciBGaXJtd2FyZVZlcl90eXBlWzRdOwordHlwZWRlZiBfX3UzMiBEcml2ZXJWZXJfdHlwZTsKKworI2RlZmluZSBNQVhfS01BTExPQ19TSVpFIDEyODAwMAorCit0eXBlZGVmIHN0cnVjdCBfSU9DVExfQ29tbWFuZF9zdHJ1Y3QgeworICBMVU5BZGRyX3N0cnVjdAkgICBMVU5faW5mbzsKKyAgUmVxdWVzdEJsb2NrX3N0cnVjdCAgICAgIFJlcXVlc3Q7CisgIEVycm9ySW5mb19zdHJ1Y3QgIAkgICBlcnJvcl9pbmZvOyAKKyAgV09SRAkJCSAgIGJ1Zl9zaXplOyAgLyogc2l6ZSBpbiBieXRlcyBvZiB0aGUgYnVmICovCisgIEJZVEUJCQkgICAqYnVmOworfSBJT0NUTF9Db21tYW5kX3N0cnVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgX0JJR19JT0NUTF9Db21tYW5kX3N0cnVjdCB7CisgIExVTkFkZHJfc3RydWN0CSAgIExVTl9pbmZvOworICBSZXF1ZXN0QmxvY2tfc3RydWN0ICAgICAgUmVxdWVzdDsKKyAgRXJyb3JJbmZvX3N0cnVjdCAgCSAgIGVycm9yX2luZm87CisgIERXT1JECQkJICAgbWFsbG9jX3NpemU7IC8qIDwgTUFYX0tNQUxMT0NfU0laRSBpbiBjY2lzcy5jICovCisgIERXT1JECQkJICAgYnVmX3NpemU7ICAgIC8qIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGJ1ZiAqLworICAJCQkJICAgICAgICAvKiA8IG1hbGxvY19zaXplICogTUFYU0dFTlRSSUVTICovCisgIEJZVEUJCQkgICAqYnVmOworfSBCSUdfSU9DVExfQ29tbWFuZF9zdHJ1Y3Q7CisKK3R5cGVkZWYgc3RydWN0IF9Mb2d2b2xJbmZvX3N0cnVjdHsKKwlfX3UzMglMdW5JRDsKKwlpbnQJbnVtX29wZW5zOyAgLyogbnVtYmVyIG9mIG9wZW5zIG9uIHRoZSBsb2dpY2FsIHZvbHVtZSAqLworCWludAludW1fcGFydHM7ICAvKiBudW1iZXIgb2YgcGFydGl0aW9ucyBjb25maWd1cmVkIG9uIGxvZ3ZvbCAqLworfSBMb2d2b2xJbmZvX3N0cnVjdDsKKworI2RlZmluZSBDQ0lTU19HRVRQQ0lJTkZPIF9JT1IoQ0NJU1NfSU9DX01BR0lDLCAxLCBjY2lzc19wY2lfaW5mb19zdHJ1Y3QpCisKKyNkZWZpbmUgQ0NJU1NfR0VUSU5USU5GTyBfSU9SKENDSVNTX0lPQ19NQUdJQywgMiwgY2Npc3NfY29hbGludF9zdHJ1Y3QpCisjZGVmaW5lIENDSVNTX1NFVElOVElORk8gX0lPVyhDQ0lTU19JT0NfTUFHSUMsIDMsIGNjaXNzX2NvYWxpbnRfc3RydWN0KQorCisjZGVmaW5lIENDSVNTX0dFVE5PREVOQU1FIF9JT1IoQ0NJU1NfSU9DX01BR0lDLCA0LCBOb2RlTmFtZV90eXBlKQorI2RlZmluZSBDQ0lTU19TRVROT0RFTkFNRSBfSU9XKENDSVNTX0lPQ19NQUdJQywgNSwgTm9kZU5hbWVfdHlwZSkKKworI2RlZmluZSBDQ0lTU19HRVRIRUFSVEJFQVQgX0lPUihDQ0lTU19JT0NfTUFHSUMsIDYsIEhlYXJ0YmVhdF90eXBlKQorI2RlZmluZSBDQ0lTU19HRVRCVVNUWVBFUyAgX0lPUihDQ0lTU19JT0NfTUFHSUMsIDcsIEJ1c1R5cGVzX3R5cGUpCisjZGVmaW5lIENDSVNTX0dFVEZJUk1WRVIgICBfSU9SKENDSVNTX0lPQ19NQUdJQywgOCwgRmlybXdhcmVWZXJfdHlwZSkKKyNkZWZpbmUgQ0NJU1NfR0VURFJJVlZFUiAgIF9JT1IoQ0NJU1NfSU9DX01BR0lDLCA5LCBEcml2ZXJWZXJfdHlwZSkKKyNkZWZpbmUgQ0NJU1NfUkVWQUxJRFZPTFMgIF9JTyhDQ0lTU19JT0NfTUFHSUMsIDEwKQorI2RlZmluZSBDQ0lTU19QQVNTVEhSVQkgICBfSU9XUihDQ0lTU19JT0NfTUFHSUMsIDExLCBJT0NUTF9Db21tYW5kX3N0cnVjdCkKKyNkZWZpbmUgQ0NJU1NfREVSRUdESVNLCSAgIF9JTyhDQ0lTU19JT0NfTUFHSUMsIDEyKQorCisvKiBubyBsb25nZXIgdXNlZC4uLiB1c2UgUkVHTkVXRCBpbnN0ZWFkICovIAorI2RlZmluZSBDQ0lTU19SRUdORVdESVNLICBfSU9XKENDSVNTX0lPQ19NQUdJQywgMTMsIGludCkKKworI2RlZmluZSBDQ0lTU19SRUdORVdECSAgIF9JTyhDQ0lTU19JT0NfTUFHSUMsIDE0KQorI2RlZmluZSBDQ0lTU19SRVNDQU5ESVNLICAgX0lPKENDSVNTX0lPQ19NQUdJQywgMTYpCisjZGVmaW5lIENDSVNTX0dFVExVTklORk8gICBfSU9SKENDSVNTX0lPQ19NQUdJQywgMTcsIExvZ3ZvbEluZm9fc3RydWN0KQorI2RlZmluZSBDQ0lTU19CSUdfUEFTU1RIUlUgX0lPV1IoQ0NJU1NfSU9DX01BR0lDLCAxOCwgQklHX0lPQ1RMX0NvbW1hbmRfc3RydWN0KQorCisjZW5kaWYgIApkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jZGsuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2RrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAwOTNhOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2RrLmgKQEAgLTAsMCArMSw0ODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCWNkay5oICAtLSBDREsgaW50ZXJmYWNlIGRlZmluaXRpb25zLgorICoKKyAqCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk4ICBTdGFsbGlvbiBUZWNobm9sb2dpZXMKKyAqCUNvcHlyaWdodCAoQykgMTk5NC0xOTk2ICBHcmVnIFVuZ2VyZXIuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZglfQ0RLX0gKKyNkZWZpbmUJX0NES19ICisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNwcmFnbWEJcGFjaygyKQorCisvKgorICoJVGhlIGZvbGxvd2luZyBzZXQgb2YgZGVmaW5pdGlvbnMgaXMgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZQorICoJc2hhcmVkIG1lbW9yeSBpbnRlcmZhY2Ugb2YgdGhlIFN0YWxsaW9uIGludGVsbGlnZW50IG11bHRpcG9ydCBzZXJpYWwKKyAqCWJvYXJkcy4gVGhlIGRlZmluaXRpb25zIGluIHRoaXMgZmlsZSBhcmUgdGFrZW4gZGlyZWN0bHkgZnJvbSB0aGUKKyAqCWRvY3VtZW50IHRpdGxlZCAiR2VuZXJpYyBTdGFja2FibGUgSW50ZXJmYWNlLCBEb3dubG9hZGVyIGFuZAorICoJQ29tbXVuaWNhdGlvbnMgRGV2ZWxvcG1lbnQgS2l0Ii4KKyAqLworCisvKgorICoJRGVmaW5lIHRoZSBzZXQgb2YgaW1wb3J0YW50IHNoYXJlZCBtZW1vcnkgYWRkcmVzc2VzLiBUaGVzZSBhcmUKKyAqCXJlcXVpcmVkIHRvIGluaXRpYWxpemUgdGhlIGJvYXJkIGFuZCBnZXQgdGhpbmdzIHN0YXJ0ZWQuIEFsbCBvZiB0aGVzZQorICoJYWRkcmVzc2VzIGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNoYXJlZCBtZW1vcnkuCisgKi8KKyNkZWZpbmUJQ0RLX1NJR0FERFIJMHgyMDAKKyNkZWZpbmUJQ0RLX0ZFQVRBRERSCTB4MjgwCisjZGVmaW5lCUNES19DREtBRERSCTB4MzAwCisjZGVmaW5lCUNES19SRFlBRERSCTB4MjYyCisKKyNkZWZpbmUJQ0RLX0FMSVZFTUFSS0VSCTEzCisKKy8qCisgKglPbiBoYXJkd2FyZSBwb3dlciB1cCB0aGUgUk9NcyBsb2NhdGVkIG9uIHRoZSBFYXN5Q29ubmVjdGlvbiA4LzY0IHdpbGwKKyAqCWZpbGwgb3V0IHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIGluZm9ybWF0aW9uIGludG8gc2hhcmVkIG1lbW9yeS4gVGhpcworICoJd2F5IHRoZSBob3N0IHN5c3RlbSBjYW4gcXVpY2tseSBkZXRlcm1pbmUgdGhhdCB0aGUgYm9hcmQgaXMgcHJlc2VudAorICoJYW5kIGlzIG9wZXJhdGlvbmFsLgorICovCit0eXBlZGVmIHN0cnVjdCBjZGtlY3BzaWcgeworCXVuc2lnbmVkIGxvbmcJbWFnaWM7CisJdW5zaWduZWQgc2hvcnQJcm9tdmVyOworCXVuc2lnbmVkIHNob3J0CWNwdXR5cGU7CisJdW5zaWduZWQgY2hhcglwYW5lbGlkWzhdOworfSBjZGtlY3BzaWdfdDsKKworI2RlZmluZQlFQ1BfTUFHSUMJMHgyMTUwNDM0NQorCisvKgorICoJT24gaGFyZHdhcmUgcG93ZXIgdXAgdGhlIFJPTXMgbG9jYXRlZCBvbiB0aGUgT05ib2FyZCwgU3RhbGxpb24gYW5kCisgKglCcnVtYnlzIHdpbGwgZmlsbCBvdXQgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgaW5mb3JtYXRpb24gaW50byBzaGFyZWQKKyAqCW1lbW9yeS4gVGhpcyB3YXkgdGhlIGhvc3Qgc3lzdGVtIGNhbiBxdWlja2x5IGRldGVybWluZSB0aGF0IHRoZSBib2FyZAorICoJaXMgcHJlc2VudCBhbmQgaXMgb3BlcmF0aW9uYWwuCisgKi8KK3R5cGVkZWYgc3RydWN0IGNka29uYnNpZyB7CisJdW5zaWduZWQgc2hvcnQJbWFnaWMwOworCXVuc2lnbmVkIHNob3J0CW1hZ2ljMTsKKwl1bnNpZ25lZCBzaG9ydAltYWdpYzI7CisJdW5zaWduZWQgc2hvcnQJbWFnaWMzOworCXVuc2lnbmVkIHNob3J0CXJvbXZlcjsKKwl1bnNpZ25lZCBzaG9ydAltZW1vZmY7CisJdW5zaWduZWQgc2hvcnQJbWVtc2VnOworCXVuc2lnbmVkIHNob3J0CWFtYXNrMDsKKwl1bnNpZ25lZCBzaG9ydAlwaWM7CisJdW5zaWduZWQgc2hvcnQJc3RhdHVzOworCXVuc2lnbmVkIHNob3J0CWJ0eXBlOworCXVuc2lnbmVkIHNob3J0CWNsa3RpY2tzOworCXVuc2lnbmVkIHNob3J0CWNsa3NwZWVkOworCXVuc2lnbmVkIHNob3J0CWFtYXNrMTsKKwl1bnNpZ25lZCBzaG9ydAlhbWFzazI7Cit9IGNka29uYnNpZ190OworCisjZGVmaW5lCU9OQl9NQUdJQzAJMHhmMmE3CisjZGVmaW5lCU9OQl9NQUdJQzEJMHhhMTQ5CisjZGVmaW5lCU9OQl9NQUdJQzIJMHg2MzUyCisjZGVmaW5lCU9OQl9NQUdJQzMJMHhmMTIxCisKKy8qCisgKglEZWZpbmUgdGhlIGZlYXR1cmUgYXJlYSBzdHJ1Y3R1cmUuIFRoZSBmZWF0dXJlIGFyZWEgaXMgdGhlIHNldCBvZgorICoJc3RhcnR1cCBwYXJhbWV0ZXJzIHVzZWQgYnkgdGhlIHNsYXZlIGltYWdlIHdoZW4gaXQgc3RhcnRzIGV4ZWN1dGluZy4KKyAqCVRoZXkgYWxsb3cgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGJ1ZmZlciBzaXplcywgZGVidWcgdHJhY2UsIGV0Yy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgY2RrZmVhdHVyZSB7CisJdW5zaWduZWQgbG9uZwlkZWJ1ZzsKKwl1bnNpZ25lZCBsb25nCWJhbm5lcjsKKwl1bnNpZ25lZCBsb25nCWV0eXBlOworCXVuc2lnbmVkIGxvbmcJbnJkZXZzOworCXVuc2lnbmVkIGxvbmcJYnJkc3BlYzsKKwl1bnNpZ25lZCBsb25nCXR4cnFzaXplOworCXVuc2lnbmVkIGxvbmcJcnhycXNpemU7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKK30gY2RrZmVhdHVyZV90OworCisjZGVmaW5lCUVUWVBfRERLCTAKKyNkZWZpbmUJRVRZUF9DREsJMQorCisvKgorICoJRGVmaW5lIHRoZSBDREsgaGVhZGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB0aGUgaW5mbyB0aGF0IHRoZSBzbGF2ZQorICoJZW52aXJvbm1lbnQgc2V0cyB1cCBhZnRlciBpdCBoYXMgYmVlbiBkb3dubG9hZGVkIGFuZCBzdGFydGVkLiBJdAorICoJZXNzZW50aWFsbHkgcHJvdmlkZXMgYSBtZW1vcnkgbWFwIGZvciB0aGUgc2hhcmVkIG1lbW9yeSBpbnRlcmZhY2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IGNka2hkciB7CisJdW5zaWduZWQgc2hvcnQJY29tbWFuZDsKKwl1bnNpZ25lZCBzaG9ydAlzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQJcG9ydDsKKwl1bnNpZ25lZCBzaG9ydAltb2RlOworCXVuc2lnbmVkIGxvbmcJY21kX2J1ZlsxNF07CisJdW5zaWduZWQgc2hvcnQJYWxpdmVfY250OworCXVuc2lnbmVkIHNob3J0CWludHJwdF9tb2RlOworCXVuc2lnbmVkIGNoYXIJaW50cnB0X2lkWzhdOworCXVuc2lnbmVkIGNoYXIJdmVyX3JlbGVhc2U7CisJdW5zaWduZWQgY2hhcgl2ZXJfbW9kaWZpY2F0aW9uOworCXVuc2lnbmVkIGNoYXIJdmVyX2ZpeDsKKwl1bnNpZ25lZCBjaGFyCWRlYWRtYW5fcmVzdGFydDsKKwl1bnNpZ25lZCBzaG9ydAlkZWFkbWFuOworCXVuc2lnbmVkIHNob3J0CW5yZGV2czsKKwl1bnNpZ25lZCBsb25nCW1lbXA7CisJdW5zaWduZWQgbG9uZwlob3N0cDsKKwl1bnNpZ25lZCBsb25nCXNsYXZlcDsKKwl1bnNpZ25lZCBjaGFyCWhvc3RyZXE7CisJdW5zaWduZWQgY2hhcglzbGF2ZXJlcTsKKwl1bnNpZ25lZCBjaGFyCWNtZF9yZXNlcnZlZFszMF07Cit9IGNka2hkcl90OworCisjZGVmaW5lCU1PREVfRERLCTAKKyNkZWZpbmUJTU9ERV9DREsJMQorCisjZGVmaW5lCUlNRF9JTlRSCTB4MAorI2RlZmluZQlJTURfUFBJTlRSCTB4MQorI2RlZmluZQlJTURfUE9MTAkweGZmCisKKy8qCisgKglEZWZpbmUgdGhlIG1lbW9yeSBtYXBwaW5nIHN0cnVjdHVyZS4gVGhpcyBzdHJ1Y3R1cmUgaXMgcG9pbnRlZCB0byBieQorICoJdGhlIG1lbXAgZmllbGQgaW4gdGhlIHN0bGNka2hkciBzdHJ1Y3QuIEFzIG1hbnkgYXMgdGhlc2Ugc3RydWN0dXJlcworICoJYXMgcmVxdWlyZWQgYXJlIGxhaWQgb3V0IGluIHNoYXJlZCBtZW1vcnkgdG8gZGVmaW5lIGhvdyB0aGUgcmVzdCBvZgorICoJc2hhcmVkIG1lbW9yeSBpcyBkaXZpZGVkIHVwLiBUaGVyZSB3aWxsIGJlIG9uZSBmb3IgZWFjaCBwb3J0LgorICovCit0eXBlZGVmIHN0cnVjdCBjZGttZW0geworCXVuc2lnbmVkIHNob3J0CWR0eXBlOworCXVuc2lnbmVkIGxvbmcJb2Zmc2V0OworfSBjZGttZW1fdDsKKworI2RlZmluZQlUWVBfVU5ERUZJTkVECTB4MAorI2RlZmluZQlUWVBfQVNZTkNUUkwJMHgxCisjZGVmaW5lCVRZUF9BU1lOQwkweDIwCisjZGVmaW5lCVRZUF9QQVJBTExFTAkweDQwCisjZGVmaW5lCVRZUF9TWU5DWDIxCTB4NjAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRm9sbG93aW5nIGlzIGEgc2V0IG9mIGRlZmluZXMgYW5kIHN0cnVjdHVyZXMgdXNlZCB0byBhY3R1YWxseSBkZWFsCisgKgl3aXRoIHRoZSBzZXJpYWwgcG9ydHMgb24gdGhlIGJvYXJkLiBGaXJzdGx5IGlzIHRoZSBzZXQgb2YgY29tbWFuZHMKKyAqCXRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gcG9ydHMuCisgKi8KKyNkZWZpbmUJQVNZQ01ECQkoKCh1bnNpZ25lZCBsb25nKSAnYScpIDw8IDgpCisKKyNkZWZpbmUJQV9OVUxMCQkoQVNZQ01EIHwgMCkKKyNkZWZpbmUJQV9GTFVTSAkJKEFTWUNNRCB8IDEpCisjZGVmaW5lCUFfQlJFQUsJCShBU1lDTUQgfCAyKQorI2RlZmluZQlBX0dFVFBPUlQJKEFTWUNNRCB8IDMpCisjZGVmaW5lCUFfU0VUUE9SVAkoQVNZQ01EIHwgNCkKKyNkZWZpbmUJQV9TRVRQT1JURgkoQVNZQ01EIHwgNSkKKyNkZWZpbmUJQV9TRVRQT1JURlRYCShBU1lDTUQgfCA2KQorI2RlZmluZQlBX1NFVFBPUlRGUlgJKEFTWUNNRCB8IDcpCisjZGVmaW5lCUFfR0VUU0lHTkFMUwkoQVNZQ01EIHwgOCkKKyNkZWZpbmUJQV9TRVRTSUdOQUxTCShBU1lDTUQgfCA5KQorI2RlZmluZQlBX1NFVFNJR05BTFNGCShBU1lDTUQgfCAxMCkKKyNkZWZpbmUJQV9TRVRTSUdOQUxTRlRYCShBU1lDTUQgfCAxMSkKKyNkZWZpbmUJQV9TRVRTSUdOQUxTRlJYCShBU1lDTUQgfCAxMikKKyNkZWZpbmUJQV9HRVROT1RJRlkJKEFTWUNNRCB8IDEzKQorI2RlZmluZQlBX1NFVE5PVElGWQkoQVNZQ01EIHwgMTQpCisjZGVmaW5lCUFfTk9USUZZCShBU1lDTUQgfCAxNSkKKyNkZWZpbmUJQV9QT1JUQ1RSTAkoQVNZQ01EIHwgMTYpCisjZGVmaW5lCUFfR0VUU1RBVFMJKEFTWUNNRCB8IDE3KQorI2RlZmluZQlBX1JRU1RBVEUJKEFTWUNNRCB8IDE4KQorI2RlZmluZQlBX0ZMT1dTVEFURQkoQVNZQ01EIHwgMTkpCisjZGVmaW5lCUFfQ0xFQVJTVEFUUwkoQVNZQ01EIHwgMjApCisKKy8qCisgKglEZWZpbmUgdGhvc2UgYXJndW1lbnRzIHVzZWQgZm9yIHNpbXBsZSBjb21tYW5kcy4KKyAqLworI2RlZmluZQlGTFVTSFJYCQkweDEKKyNkZWZpbmUJRkxVU0hUWAkJMHgyCisKKyNkZWZpbmUJQlJFQUtPTgkJLTEKKyNkZWZpbmUJQlJFQUtPRkYJLTIKKworLyoKKyAqCURlZmluZSB0aGUgcG9ydCBzZXR0aW5nIHN0cnVjdHVyZSwgYW5kIGFsbCB0aG9zZSBkZWZpbmVzIHRoYXQgZ28gYWxvbmcKKyAqCXdpdGggaXQuIEJhc2ljYWxseSB0aGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhpcworICoJcG9ydDogYmF1ZCByYXRlLCBjaGFycywgcGFyaXR5LCBpbnB1dC9vdXRwdXQgY2hhciBjb29raW5nIGV0Yy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYXN5cG9ydCB7CisJdW5zaWduZWQgbG9uZwliYXVkb3V0OworCXVuc2lnbmVkIGxvbmcJYmF1ZGluOworCXVuc2lnbmVkIGxvbmcJaWZsYWc7CisJdW5zaWduZWQgbG9uZwlvZmxhZzsKKwl1bnNpZ25lZCBsb25nCWxmbGFnOworCXVuc2lnbmVkIGxvbmcJcGZsYWc7CisJdW5zaWduZWQgbG9uZwlmbG93OworCXVuc2lnbmVkIGxvbmcJc3BhcmUxOworCXVuc2lnbmVkIHNob3J0CXZ0aW1lOworCXVuc2lnbmVkIHNob3J0CXZtaW47CisJdW5zaWduZWQgc2hvcnQJdHhsbzsKKwl1bnNpZ25lZCBzaG9ydAl0eGhpOworCXVuc2lnbmVkIHNob3J0CXJ4bG87CisJdW5zaWduZWQgc2hvcnQJcnhoaTsKKwl1bnNpZ25lZCBzaG9ydAlyeGhvZzsKKwl1bnNpZ25lZCBzaG9ydAlzcGFyZTI7CisJdW5zaWduZWQgY2hhcgljc2l6ZTsKKwl1bnNpZ25lZCBjaGFyCXN0b3BiczsKKwl1bnNpZ25lZCBjaGFyCXBhcml0eTsKKwl1bnNpZ25lZCBjaGFyCXN0b3BpbjsKKwl1bnNpZ25lZCBjaGFyCXN0YXJ0aW47CisJdW5zaWduZWQgY2hhcglzdG9wb3V0OworCXVuc2lnbmVkIGNoYXIJc3RhcnRvdXQ7CisJdW5zaWduZWQgY2hhcglwYXJtYXJrOworCXVuc2lnbmVkIGNoYXIJYnJrbWFyazsKKwl1bnNpZ25lZCBjaGFyCWNjWzExXTsKK30gYXN5cG9ydF90OworCisjZGVmaW5lCVBUX1NUT1AxCTB4MAorI2RlZmluZQlQVF9TVE9QMTUJMHgxCisjZGVmaW5lCVBUX1NUT1AyCTB4MgorCisjZGVmaW5lCVBUX05PUEFSSVRZCTB4MAorI2RlZmluZQlQVF9PRERQQVJJVFkJMHgxCisjZGVmaW5lCVBUX0VWRU5QQVJJVFkJMHgyCisjZGVmaW5lCVBUX01BUktQQVJJVFkJMHgzCisjZGVmaW5lCVBUX1NQQUNFUEFSSVRZCTB4NAorCisjZGVmaW5lCUZfTk9ORQkJMHgwCisjZGVmaW5lCUZfSVhPTgkJMHgxCisjZGVmaW5lCUZfSVhPRkYJCTB4MgorI2RlZmluZQlGX0lYQU5ZCQkweDQKKyNkZWZpbmUJRl9JT1hBTlkJMHg4CisjZGVmaW5lCUZfUlRTRkxPVwkweDEwCisjZGVmaW5lCUZfQ1RTRkxPVwkweDIwCisjZGVmaW5lCUZfRFRSRkxPVwkweDQwCisjZGVmaW5lCUZfRENERkxPVwkweDgwCisjZGVmaW5lCUZfRFNST0ZMT1cJMHgxMDAKKyNkZWZpbmUJRl9EU1JJRkxPVwkweDIwMAorCisjZGVmaW5lCUZJX05PUlgJCTB4MQorI2RlZmluZQlGSV9SQVcJCTB4MgorI2RlZmluZQlGSV9JU1RSSVAJMHg0CisjZGVmaW5lCUZJX1VDTEMJCTB4OAorI2RlZmluZQlGSV9JTkxDUgkweDEwCisjZGVmaW5lCUZJX0lDUk5MCTB4MjAKKyNkZWZpbmUJRklfSUdOQ1IJMHg0MAorI2RlZmluZQlGSV9JR05CUkVBSwkweDgwCisjZGVmaW5lCUZJX0RTQ1JEQlJFQUsJMHgxMDAKKyNkZWZpbmUJRklfMU1BUktCUkVBSwkweDIwMAorI2RlZmluZQlGSV8yTUFSS0JSRUFLCTB4NDAwCisjZGVmaW5lCUZJX1hDSE5HQlJFQUsJMHg4MDAKKyNkZWZpbmUJRklfSUdOUlhFUlJTCTB4MTAwMAorI2RlZmluZQlGSV9EU0NEUlhFUlJTCTB4MjAwMAorI2RlZmluZQlGSV8xTUFSS1JYRVJSUwkweDQwMDAKKyNkZWZpbmUJRklfMk1BUktSWEVSUlMJMHg4MDAwCisjZGVmaW5lCUZJX1hDSE5HUlhFUlJTCTB4MTAwMDAKKyNkZWZpbmUJRklfRFNDUkROVUxMCTB4MjAwMDAKKworI2RlZmluZQlGT19PTENVQwkweDEKKyNkZWZpbmUJRk9fT05MQ1IJMHgyCisjZGVmaW5lCUZPX09PQ1JOTAkweDQKKyNkZWZpbmUJRk9fT05PQ1IJMHg4CisjZGVmaW5lCUZPX09OTFJFVAkweDEwCisjZGVmaW5lCUZPX09OTAkJMHgyMAorI2RlZmluZQlGT19PQlMJCTB4NDAKKyNkZWZpbmUJRk9fT1ZUCQkweDgwCisjZGVmaW5lCUZPX09GRgkJMHgxMDAKKyNkZWZpbmUJRk9fT1RBQjEJMHgyMDAKKyNkZWZpbmUJRk9fT1RBQjIJMHg0MDAKKyNkZWZpbmUJRk9fT1RBQjMJMHg4MDAKKyNkZWZpbmUJRk9fT0NSMQkJMHgxMDAwCisjZGVmaW5lCUZPX09DUjIJCTB4MjAwMAorI2RlZmluZQlGT19PQ1IzCQkweDQwMDAKKyNkZWZpbmUJRk9fT0ZJTEwJMHg4MDAwCisjZGVmaW5lCUZPX09ERUxMCTB4MTAwMDAKKworI2RlZmluZQlQX1JUU0xPQ0sJMHgxCisjZGVmaW5lCVBfQ1RTTE9DSwkweDIKKyNkZWZpbmUJUF9NQVBSVFMJMHg0CisjZGVmaW5lCVBfTUFQQ1RTCTB4OAorI2RlZmluZQlQX0xPT1BCQUNLCTB4MTAKKyNkZWZpbmUJUF9EVFJGT0xMT1cJMHgyMAorI2RlZmluZQlQX0ZBS0VEQ0QJMHg0MAorCisjZGVmaW5lCVBfUlhJTUlOCTB4MTAwMDAKKyNkZWZpbmUJUF9SWElUSU1FCTB4MjAwMDAKKyNkZWZpbmUJUF9SWFRIT0xECTB4NDAwMDAKKworLyoKKyAqCURlZmluZSBhIHN0cnVjdHVyZSB0byBjb21tdW5pY2F0ZSBzZXJpYWwgcG9ydCBzaWduYWwgYW5kIGRhdGEgc3RhdGUKKyAqCWluZm9ybWF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBhc3lzaWdzIHsKKwl1bnNpZ25lZCBsb25nCWRhdGE7CisJdW5zaWduZWQgbG9uZwlzaWduYWw7CisJdW5zaWduZWQgbG9uZwlzaWd2YWx1ZTsKK30gYXN5c2lnc190OworCisjZGVmaW5lCURUX1RYQlVTWQkweDEKKyNkZWZpbmUJRFRfVFhFTVBUWQkweDIKKyNkZWZpbmUJRFRfVFhMT1cJMHg0CisjZGVmaW5lCURUX1RYSElHSAkweDgKKyNkZWZpbmUJRFRfVFhGVUxMCTB4MTAKKyNkZWZpbmUJRFRfVFhIT0cJMHgyMAorI2RlZmluZQlEVF9UWEZMT1dFRAkweDQwCisjZGVmaW5lCURUX1RYQlJFQUsJMHg4MAorCisjZGVmaW5lCURUX1JYQlVTWQkweDEwMAorI2RlZmluZQlEVF9SWEVNUFRZCTB4MjAwCisjZGVmaW5lCURUX1JYTE9XCTB4NDAwCisjZGVmaW5lCURUX1JYSElHSAkweDgwMAorI2RlZmluZQlEVF9SWEZVTEwJMHgxMDAwCisjZGVmaW5lCURUX1JYSE9HCTB4MjAwMAorI2RlZmluZQlEVF9SWEZMT1dFRAkweDQwMDAKKyNkZWZpbmUJRFRfUlhCUkVBSwkweDgwMDAKKworI2RlZmluZQlTR19EVFIJCTB4MQorI2RlZmluZQlTR19EQ0QJCTB4MgorI2RlZmluZQlTR19SVFMJCTB4NAorI2RlZmluZQlTR19DVFMJCTB4OAorI2RlZmluZQlTR19EU1IJCTB4MTAKKyNkZWZpbmUJU0dfUkkJCTB4MjAKKworLyoKKyAqCURlZmluZSB0aGUgbm90aWZpY2F0aW9uIHNldHRpbmcgc3RydWN0dXJlLiBUaGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUKKyAqCXBvcnQgd2hhdCBldmVudHMgd2Ugd2FudCB0byBiZSBpbmZvcm1lZCBhYm91dC4gRmllbGRzIGhlcmUgdXNlIHRoZQorICoJc2FtZSBkZWZpbmVzIGFzIGZvciB0aGUgYXN5c2lncyBzdHJ1Y3R1cmUgYWJvdmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFzeW5vdGlmeSB7CisJdW5zaWduZWQgbG9uZwljdHJsOworCXVuc2lnbmVkIGxvbmcJZGF0YTsKKwl1bnNpZ25lZCBsb25nCXNpZ25hbDsKKwl1bnNpZ25lZCBsb25nCXNpZ3ZhbHVlOworfSBhc3lub3RpZnlfdDsKKworLyoKKyAqCURlZmluZSB0aGUgcG9ydCBjb250cm9sIHN0cnVjdHVyZS4gSXQgaXMgdXNlZCB0byBkbyBmaW5lIGdyYWluCisgKgljb250cm9sIG9wZXJhdGlvbnMgb24gdGhlIHBvcnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nCXJ4Y3RybDsKKwl1bnNpZ25lZCBsb25nCXR4Y3RybDsKKwljaGFyCQlyeGltZGNoOworCWNoYXIJCXR4aW1kY2g7CisJY2hhcgkJc3BhcmUxOworCWNoYXIJCXNwYXJlMjsKK30gYXN5Y3RybF90OworCisjZGVmaW5lCUNUX0VOQUJMRQkweDEKKyNkZWZpbmUJQ1RfRElTQUJMRQkweDIKKyNkZWZpbmUJQ1RfU1RPUAkJMHg0CisjZGVmaW5lCUNUX1NUQVJUCTB4OAorI2RlZmluZQlDVF9TVEFSVEZMT1cJMHgxMAorI2RlZmluZQlDVF9TVE9QRkxPVwkweDIwCisjZGVmaW5lCUNUX1NFTkRDSFIJMHg0MAorCisvKgorICoJRGVmaW5lIHRoZSBzdGF0cyBzdHJ1Y3R1cmUga2VwdCBmb3IgZWFjaCBwb3J0LiBUaGlzIGlzIGEgdXNlZnVsIHNldAorICoJb2YgZGF0YSBjb2xsZWN0ZWQgZm9yIGVhY2ggcG9ydCBvbiB0aGUgc2xhdmUuIFRoZSBBX0dFVFNUQVRTIGNvbW1hbmQKKyAqCWlzIHVzZWQgdG8gcmV0cmlldmUgdGhpcyBkYXRhIGZyb20gdGhlIHNsYXZlLgorICovCit0eXBlZGVmIHN0cnVjdCBhc3lzdGF0cyB7CisJdW5zaWduZWQgbG9uZwlvcGVuczsKKwl1bnNpZ25lZCBsb25nCXR4Y2hhcnM7CisJdW5zaWduZWQgbG9uZwlyeGNoYXJzOworCXVuc2lnbmVkIGxvbmcJdHhyaW5ncTsKKwl1bnNpZ25lZCBsb25nCXJ4cmluZ3E7CisJdW5zaWduZWQgbG9uZwl0eG1zZ3M7CisJdW5zaWduZWQgbG9uZwlyeG1zZ3M7CisJdW5zaWduZWQgbG9uZwl0eGZsdXNoZXM7CisJdW5zaWduZWQgbG9uZwlyeGZsdXNoZXM7CisJdW5zaWduZWQgbG9uZwlvdmVycnVuczsKKwl1bnNpZ25lZCBsb25nCWZyYW1pbmc7CisJdW5zaWduZWQgbG9uZwlwYXJpdHk7CisJdW5zaWduZWQgbG9uZwlyaW5nb3ZlcjsKKwl1bnNpZ25lZCBsb25nCWxvc3Q7CisJdW5zaWduZWQgbG9uZwlyeHN0YXJ0OworCXVuc2lnbmVkIGxvbmcJcnhzdG9wOworCXVuc2lnbmVkIGxvbmcJdHhzdGFydDsKKwl1bnNpZ25lZCBsb25nCXR4c3RvcDsKKwl1bnNpZ25lZCBsb25nCWRjZGNudDsKKwl1bnNpZ25lZCBsb25nCWR0cmNudDsKKwl1bnNpZ25lZCBsb25nCWN0c2NudDsKKwl1bnNpZ25lZCBsb25nCXJ0c2NudDsKKwl1bnNpZ25lZCBsb25nCWRzcmNudDsKKwl1bnNpZ25lZCBsb25nCXJpY250OworCXVuc2lnbmVkIGxvbmcJdHhicmVha3M7CisJdW5zaWduZWQgbG9uZwlyeGJyZWFrczsKKwl1bnNpZ25lZCBsb25nCXNpZ25hbHM7CisJdW5zaWduZWQgbG9uZwlzdGF0ZTsKKwl1bnNpZ25lZCBsb25nCWh3aWQ7Cit9IGFzeXN0YXRzX3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUFsbCBjb21tYW5kIGFuZCBjb250cm9sIGNvbW11bmljYXRpb24gd2l0aCBhIGRldmljZSBvbiB0aGUgc2xhdmUgaXMKKyAqCXZpYSBhIGNvbnRyb2wgYmxvY2sgaW4gc2hhcmVkIG1lbW9yeS4gRWFjaCBkZXZpY2UgaGFzIGl0cyBvd24gY29udHJvbAorICoJYmxvY2ssIGRlZmluZWQgYnkgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUuIFRoZSBjb250cm9sIGJsb2NrIGFsbG93cworICoJdGhlIGhvc3QgdG8gb3BlbiwgY2xvc2UgYW5kIGNvbnRyb2wgdGhlIGRldmljZSBvbiB0aGUgc2xhdmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGNka2N0cmwgeworCXVuc2lnbmVkIGNoYXIJb3BlbjsKKwl1bnNpZ25lZCBjaGFyCWNsb3NlOworCXVuc2lnbmVkIGxvbmcJb3BlbmFyZzsKKwl1bnNpZ25lZCBsb25nCWNsb3NlYXJnOworCXVuc2lnbmVkIGxvbmcJY21kOworCXVuc2lnbmVkIGxvbmcJc3RhdHVzOworCXVuc2lnbmVkIGxvbmcJYXJnc1szMl07Cit9IGNka2N0cmxfdDsKKworLyoKKyAqCUVhY2ggZGV2aWNlIG9uIHRoZSBzbGF2ZSBwYXNzZXMgZGF0YSB0byBhbmQgZnJvbSB0aGUgaG9zdCB2aWEgYSByaW5nCisgKglxdWV1ZSBpbiBzaGFyZWQgbWVtb3J5LiBEZWZpbmUgYSByaW5nIHF1ZXVlIHN0cnVjdHVyZSB0byBob2xkIHRoZQorICoJdml0YWwgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCByaW5nIHF1ZXVlLiBUd28gcmluZyBxdWV1ZXMgd2lsbCBiZQorICoJYWxsb2NhdGVkIGZvciBlYWNoIHBvcnQsIG9uZSBmb3IgcmVjZWl2ZSBkYXRhIGFuZCBvbmUgZm9yIHRyYW5zbWl0CisgKglkYXRhLgorICovCit0eXBlZGVmIHN0cnVjdCBjZGthc3lycSB7CisJdW5zaWduZWQgbG9uZwlvZmZzZXQ7CisJdW5zaWduZWQgc2hvcnQJc2l6ZTsKKwl1bnNpZ25lZCBzaG9ydAloZWFkOworCXVuc2lnbmVkIHNob3J0CXRhaWw7Cit9IGNka2FzeXJxX3Q7CisKKy8qCisgKglFYWNoIGFzeW5jaHJvbm91cyBwb3J0IGlzIGRlZmluZWQgaW4gc2hhcmVkIG1lbW9yeSBieSB0aGUgZm9sbG93aW5nCisgKglzdHJ1Y3R1cmUuIEl0IGNvbnRhaW5zIGEgY29udHJvbCBibG9jayB0byBjb21tYW5kIGEgZGV2aWNlLCBhbmQgYWxzbworICoJdGhlIG5lY2Vzc2FyeSBkYXRhIGNoYW5uZWwgaW5mb3JtYXRpb24gYXMgd2VsbC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgY2RrYXN5IHsKKwljZGtjdHJsX3QJY3RybDsKKwl1bnNpZ25lZCBzaG9ydAlub3RpZnk7CisJYXN5bm90aWZ5X3QJY2hhbmdlZDsKKwl1bnNpZ25lZCBzaG9ydAlyZWNlaXZlOworCWNka2FzeXJxX3QJcnhxOworCXVuc2lnbmVkIHNob3J0CXRyYW5zbWl0OworCWNka2FzeXJxX3QJdHhxOworfSBjZGthc3lfdDsKKworI3ByYWdtYQlwYWNrKCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRGVmaW5lIHRoZSBzZXQgb2YgaW9jdGxzIHVzZWQgYnkgdGhlIGRyaXZlciB0byBkbyBzcGVjaWFsIHRoaW5ncworICoJdG8gdGhlIGJvYXJkLiBUaGVzZSBpbmNsdWRlIGludGVycnVwdGluZyBpdCwgYW5kIGluaXRpYWxpemluZworICoJdGhlIGRyaXZlciBhZnRlciBib2FyZCBzdGFydHVwIGFuZCBzaHV0ZG93bi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNkZWZpbmUJU1RMX0JJTlRSCV9JTygncycsMjApCisjZGVmaW5lCVNUTF9CU1RBUlQJX0lPKCdzJywyMSkKKyNkZWZpbmUJU1RMX0JTVE9QCV9JTygncycsMjIpCisjZGVmaW5lCVNUTF9CUkVTRVQJX0lPKCdzJywyMykKKworLyoKKyAqCURlZmluZSBhIHNldCBvZiBpb2N0bCBleHRlbnNpb25zLCB1c2VkIHRvIGdldCBhdCBzcGVjaWFsIHN0dWZmLgorICovCisjZGVmaW5lCVNUTF9HRVRQRkxBRwlfSU8oJ3MnLDgwKQorI2RlZmluZQlTVExfU0VUUEZMQUcJX0lPKCdzJyw4MSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nkcm9tLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nkcm9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFkY2FmMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2Ryb20uaApAQCAtMCwwICsxLDkxMiBAQAorLyoKKyAqIC0tIDxsaW51eC9jZHJvbS5oPgorICogR2VuZXJhbCBoZWFkZXIgZmlsZSBmb3IgbGludXggQ0QtUk9NIGRyaXZlcnMgCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIgICAgICAgICBEYXZpZCBHaWxsZXIsIHJhZmV0bWFkQG94eS5lZHUKKyAqICAgICAgICAgICAgICAgMTk5NCwgMTk5NSAgIEViZXJoYXJkIE3Dtm5rZWJlcmcsIGVtb2Vua2VAZ3dkZy5kZQorICogICAgICAgICAgICAgICAxOTk2ICAgICAgICAgRGF2aWQgdmFuIExlZXV3ZW4sIGRhdmlkQHRtLnRuby5ubAorICogICAgICAgICAgICAgICAxOTk3LCAxOTk4ICAgRXJpayBBbmRlcnNlbiwgYW5kZXJzZWVAZGViaWFuLm9yZworICogICAgICAgICAgICAgICAxOTk4LTIwMDIgICAgSmVucyBBeGJvZSwgYXhib2VAc3VzZS5kZQorICovCisgCisjaWZuZGVmCV9MSU5VWF9DRFJPTV9ICisjZGVmaW5lCV9MSU5VWF9DRFJPTV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFzIG9mIExpbnV4IDIuMS54LCBhbGwgTGludXggQ0QtUk9NIGFwcGxpY2F0aW9uIHByb2dyYW1zIHdpbGwgdXNlIHRoaXMgCisgKiAoYW5kIG9ubHkgdGhpcykgaW5jbHVkZSBmaWxlLiAgSXQgaXMgbXkgaG9wZSB0byBwcm92aWRlIExpbnV4IHdpdGgKKyAqIGEgdW5pZm9ybSBpbnRlcmZhY2UgYmV0d2VlbiBzb2Z0d2FyZSBhY2Nlc3NpbmcgQ0QtUk9NcyBhbmQgdGhlIHZhcmlvdXMgCisgKiBkZXZpY2UgZHJpdmVycyB0aGF0IGFjdHVhbGx5IHRhbGsgdG8gdGhlIGRyaXZlcy4gIFRoZXJlIG1heSBzdGlsbCBiZQorICogMjMgZGlmZmVyZW50IGtpbmRzIG9mIHN0cmFuZ2UgQ0QtUk9NIGRyaXZlcywgYnV0IGF0IGxlYXN0IHRoZXJlIHdpbGwgCisgKiBub3cgYmUgb25lLCBhbmQgb25seSBvbmUsIExpbnV4IENELVJPTSBpbnRlcmZhY2UuCisgKgorICogQWRkaXRpb25hbGx5LCBhcyBvZiBMaW51eCAyLjEueCwgYWxsIExpbnV4IGFwcGxpY2F0aW9uIHByb2dyYW1zIAorICogc2hvdWxkIHVzZSB0aGUgT19OT05CTE9DSyBvcHRpb24gd2hlbiBvcGVuaW5nIGEgQ0QtUk9NIGRldmljZSAKKyAqIGZvciBzdWJzZXF1ZW50IGlvY3RsIGNvbW1hbmRzLiAgVGhpcyBhbGxvd3MgZm9yIG5lYXQgc3lzdGVtIGVycm9ycyAKKyAqIGxpa2UgIk5vIG1lZGl1bSBmb3VuZCIgb3IgIldyb25nIG1lZGl1bSB0eXBlIiB1cG9uIGF0dGVtcHRpbmcgdG8gCisgKiBtb3VudCBvciBwbGF5IGFuIGVtcHR5IHNsb3QsIG1vdW50IGFuIGF1ZGlvIGRpc2MsIG9yIHBsYXkgYSBkYXRhIGRpc2MuCisgKiBHZW5lcmFsbHksIGNoYW5naW5nIGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdG8gc3VwcG9ydCBPX05PTkJMT0NLCisgKiBpcyBhcyBlYXN5IGFzIHRoZSBmb2xsb3dpbmc6CisgKiAgICAgICAtICAgIGRyaXZlID0gb3BlbigiL2Rldi9jZHJvbSIsIE9fUkRPTkxZKTsKKyAqICAgICAgICsgICAgZHJpdmUgPSBvcGVuKCIvZGV2L2Nkcm9tIiwgT19SRE9OTFkgfCBPX05PTkJMT0NLKTsKKyAqIEl0IGlzIHdvcnRoIHRoZSBzbWFsbCBjaGFuZ2UuCisgKgorICogIFBhdGNoZXMgZm9yIG1hbnkgY29tbW9uIENEIHByb2dyYW1zIChwcm92aWRlZCBieSBEYXZpZCBBLiB2YW4gTGVldXdlbikKKyAqICBjYW4gYmUgZm91bmQgYXQ6ICBmdHA6Ly9mdHAuZ3dkZy5kZS9wdWIvbGludXgvY2Ryb20vZHJpdmVycy9jbTIwNi8KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFdoZW4gYSBkcml2ZXIgc3VwcG9ydHMgYSBjZXJ0YWluIGZ1bmN0aW9uLCBidXQgdGhlIGNkcm9tIGRyaXZlIHdlIGFyZSAKKyAqIHVzaW5nIGRvZXNuJ3QsIHdlIHdpbGwgcmV0dXJuIHRoZSBlcnJvciBFRFJJVkVfQ0FOVF9ET19USElTLiAgV2Ugd2lsbCAKKyAqIGJvcnJvdyB0aGUgIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIiBlcnJvciBmcm9tIHRoZSBuZXR3b3JrIGZvbGtzIHRvIAorICogYWNjb21wbGlzaCB0aGlzLiAgTWF5YmUgc29tZWRheSB3ZSB3aWxsIGdldCBhIG1vcmUgdGFyZ2V0ZWQgZXJyb3IgY29kZSwgCisgKiBidXQgdGhpcyB3aWxsIGRvIGZvciBub3cuLi4gKi8KKyNkZWZpbmUgRURSSVZFX0NBTlRfRE9fVEhJUyAgRU9QTk9UU1VQUAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhlIENELVJPTSBJT0NUTCBjb21tYW5kcyAgLS0gdGhlc2Ugc2hvdWxkIGJlIHN1cHBvcnRlZCBieSAKKyAqIGFsbCB0aGUgdmFyaW91cyBjZHJvbSBkcml2ZXJzLiAgRm9yIHRoZSBDRC1ST00gaW9jdGxzLCB3ZSAKKyAqIHdpbGwgY29tbWFuZGVlciBieXRlIDB4NTMsIG9yICdTJy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBDRFJPTVBBVVNFCQkweDUzMDEgLyogUGF1c2UgQXVkaW8gT3BlcmF0aW9uICovIAorI2RlZmluZSBDRFJPTVJFU1VNRQkJMHg1MzAyIC8qIFJlc3VtZSBwYXVzZWQgQXVkaW8gT3BlcmF0aW9uICovCisjZGVmaW5lIENEUk9NUExBWU1TRgkJMHg1MzAzIC8qIFBsYXkgQXVkaW8gTVNGIChzdHJ1Y3QgY2Ryb21fbXNmKSAqLworI2RlZmluZSBDRFJPTVBMQVlUUktJTkQJCTB4NTMwNCAvKiBQbGF5IEF1ZGlvIFRyYWNrL2luZGV4IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgY2Ryb21fdGkpICovCisjZGVmaW5lIENEUk9NUkVBRFRPQ0hEUgkJMHg1MzA1IC8qIFJlYWQgVE9DIGhlYWRlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGNkcm9tX3RvY2hkcikgKi8KKyNkZWZpbmUgQ0RST01SRUFEVE9DRU5UUlkJMHg1MzA2IC8qIFJlYWQgVE9DIGVudHJ5IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgY2Ryb21fdG9jZW50cnkpICovCisjZGVmaW5lIENEUk9NU1RPUAkJMHg1MzA3IC8qIFN0b3AgdGhlIGNkcm9tIGRyaXZlICovCisjZGVmaW5lIENEUk9NU1RBUlQJCTB4NTMwOCAvKiBTdGFydCB0aGUgY2Ryb20gZHJpdmUgKi8KKyNkZWZpbmUgQ0RST01FSkVDVAkJMHg1MzA5IC8qIEVqZWN0cyB0aGUgY2Ryb20gbWVkaWEgKi8KKyNkZWZpbmUgQ0RST01WT0xDVFJMCQkweDUzMGEgLyogQ29udHJvbCBvdXRwdXQgdm9sdW1lIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgY2Ryb21fdm9sY3RybCkgKi8KKyNkZWZpbmUgQ0RST01TVUJDSE5MCQkweDUzMGIgLyogUmVhZCBzdWJjaGFubmVsIGRhdGEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBjZHJvbV9zdWJjaG5sKSAqLworI2RlZmluZSBDRFJPTVJFQURNT0RFMgkJMHg1MzBjIC8qIFJlYWQgQ0RST00gbW9kZSAyIGRhdGEgKDIzMzYgQnl0ZXMpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgY2Ryb21fcmVhZCkgKi8KKyNkZWZpbmUgQ0RST01SRUFETU9ERTEJCTB4NTMwZCAvKiBSZWFkIENEUk9NIG1vZGUgMSBkYXRhICgyMDQ4IEJ5dGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgY2Ryb21fcmVhZCkgKi8KKyNkZWZpbmUgQ0RST01SRUFEQVVESU8JCTB4NTMwZSAvKiAoc3RydWN0IGNkcm9tX3JlYWRfYXVkaW8pICovCisjZGVmaW5lIENEUk9NRUpFQ1RfU1cJCTB4NTMwZiAvKiBlbmFibGUoMSkvZGlzYWJsZSgwKSBhdXRvLWVqZWN0aW5nICovCisjZGVmaW5lIENEUk9NTVVMVElTRVNTSU9OCTB4NTMxMCAvKiBPYnRhaW4gdGhlIHN0YXJ0LW9mLWxhc3Qtc2Vzc2lvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIG9mIG11bHRpIHNlc3Npb24gZGlza3MgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBjZHJvbV9tdWx0aXNlc3Npb24pICovCisjZGVmaW5lIENEUk9NX0dFVF9NQ04JCTB4NTMxMSAvKiBPYnRhaW4gdGhlICJVbml2ZXJzYWwgUHJvZHVjdCBDb2RlIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBhdmFpbGFibGUgKHN0cnVjdCBjZHJvbV9tY24pICovCisjZGVmaW5lIENEUk9NX0dFVF9VUEMJCUNEUk9NX0dFVF9NQ04gIC8qIFRoaXMgb25lIGlzIGRlcHJlY2F0ZWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGhlcmUgYW55d2F5IGZvciBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIENEUk9NUkVTRVQJCTB4NTMxMiAvKiBoYXJkLXJlc2V0IHRoZSBkcml2ZSAqLworI2RlZmluZSBDRFJPTVZPTFJFQUQJCTB4NTMxMyAvKiBHZXQgdGhlIGRyaXZlJ3Mgdm9sdW1lIHNldHRpbmcgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGNkcm9tX3ZvbGN0cmwpICovCisjZGVmaW5lIENEUk9NUkVBRFJBVwkJMHg1MzE0CS8qIHJlYWQgZGF0YSBpbiByYXcgbW9kZSAoMjM1MiBCeXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGNkcm9tX3JlYWQpICovCisvKiAKKyAqIFRoZXNlIGlvY3RscyBhcmUgdXNlZCBvbmx5IHVzZWQgaW4gYXp0Y2QuYyBhbmQgb3B0Y2QuYworICovCisjZGVmaW5lIENEUk9NUkVBRENPT0tFRAkJMHg1MzE1CS8qIHJlYWQgZGF0YSBpbiBjb29rZWQgbW9kZSAqLworI2RlZmluZSBDRFJPTVNFRUsJCTB4NTMxNiAgLyogc2VlayBtc2YgYWRkcmVzcyAqLworICAKKy8qCisgKiBUaGlzIGlvY3RsIGlzIG9ubHkgdXNlZCBieSB0aGUgc2NzaS1jZCBkcml2ZXIuICAKKyAgIEl0IGlzIGZvciBwbGF5aW5nIGF1ZGlvIGluIGxvZ2ljYWwgYmxvY2sgYWRkcmVzc2luZyBtb2RlLgorICovCisjZGVmaW5lIENEUk9NUExBWUJMSwkJMHg1MzE3CS8qIChzdHJ1Y3QgY2Ryb21fYmxrKSAqLworCisvKiAKKyAqIFRoZXNlIGlvY3RscyBhcmUgb25seSB1c2VkIGluIG9wdGNkLmMKKyAqLworI2RlZmluZSBDRFJPTVJFQURBTEwJCTB4NTMxOAkvKiByZWFkIGFsbCAyNjQ2IGJ5dGVzICovCisKKy8qIAorICogVGhlc2UgaW9jdGxzIGFyZSAobm93KSBvbmx5IGluIGlkZS1jZC5jIGZvciBjb250cm9sbGluZyAKKyAqIGRyaXZlIHNwaW5kb3duIHRpbWUuICBUaGV5IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUKKyAqIFVuaWZvcm0gZHJpdmVyLCB2aWEgZ2VuZXJpYyBwYWNrZXQgY29tbWFuZHMsIEdQQ01EX01PREVfU0VMRUNUXzEwLAorICogR1BDTURfTU9ERV9TRU5TRV8xMCBhbmQgdGhlIEdQTU9ERV9QT1dFUl9QQUdFLi4uCisgKiAgLUVyaWsKKyAqLworI2RlZmluZSBDRFJPTUdFVFNQSU5ET1dOICAgICAgICAweDUzMWQKKyNkZWZpbmUgQ0RST01TRVRTUElORE9XTiAgICAgICAgMHg1MzFlCisKKy8qIAorICogVGhlc2UgaW9jdGxzIGFyZSBpbXBsZW1lbnRlZCB0aHJvdWdoIHRoZSB1bmlmb3JtIENELVJPTSBkcml2ZXIKKyAqIFRoZXkgX3dpbGxfIGJlIGFkb3B0ZWQgYnkgYWxsIENELVJPTSBkcml2ZXJzLCB3aGVuIGFsbCB0aGUgQ0QtUk9NCisgKiBkcml2ZXJzIGFyZSBldmVudHVhbGx5IHBvcnRlZCB0byB0aGUgdW5pZm9ybSBDRC1ST00gZHJpdmVyIGludGVyZmFjZS4KKyAqLworI2RlZmluZSBDRFJPTUNMT1NFVFJBWQkJMHg1MzE5CS8qIHBlbmRhbnQgb2YgQ0RST01FSkVDVCAqLworI2RlZmluZSBDRFJPTV9TRVRfT1BUSU9OUwkweDUzMjAgIC8qIFNldCBiZWhhdmlvciBvcHRpb25zICovCisjZGVmaW5lIENEUk9NX0NMRUFSX09QVElPTlMJMHg1MzIxICAvKiBDbGVhciBiZWhhdmlvciBvcHRpb25zICovCisjZGVmaW5lIENEUk9NX1NFTEVDVF9TUEVFRAkweDUzMjIgIC8qIFNldCB0aGUgQ0QtUk9NIHNwZWVkICovCisjZGVmaW5lIENEUk9NX1NFTEVDVF9ESVNDCTB4NTMyMyAgLyogU2VsZWN0IGRpc2MgKGZvciBqdWtlLWJveGVzKSAqLworI2RlZmluZSBDRFJPTV9NRURJQV9DSEFOR0VECTB4NTMyNSAgLyogQ2hlY2sgaXMgbWVkaWEgY2hhbmdlZCAgKi8KKyNkZWZpbmUgQ0RST01fRFJJVkVfU1RBVFVTCTB4NTMyNiAgLyogR2V0IHRyYXkgcG9zaXRpb24sIGV0Yy4gKi8KKyNkZWZpbmUgQ0RST01fRElTQ19TVEFUVVMJMHg1MzI3ICAvKiBHZXQgZGlzYyB0eXBlLCBldGMuICovCisjZGVmaW5lIENEUk9NX0NIQU5HRVJfTlNMT1RTICAgIDB4NTMyOCAgLyogR2V0IG51bWJlciBvZiBzbG90cyAqLworI2RlZmluZSBDRFJPTV9MT0NLRE9PUgkJMHg1MzI5ICAvKiBsb2NrIG9yIHVubG9jayBkb29yICovCisjZGVmaW5lIENEUk9NX0RFQlVHCQkweDUzMzAJLyogVHVybiBkZWJ1ZyBtZXNzYWdlcyBvbi9vZmYgKi8KKyNkZWZpbmUgQ0RST01fR0VUX0NBUEFCSUxJVFkJMHg1MzMxCS8qIGdldCBjYXBhYmlsaXRpZXMgKi8KKworLyogTm90ZSB0aGF0IHNjc2kvc2NzaV9pb2N0bC5oIGFsc28gdXNlcyAweDUzODIgLSAweDUzODYuCisgKiBGdXR1cmUgQ0RST00gaW9jdGxzIHNob3VsZCBiZSBrZXB0IGJlbG93IDB4NTM3RgorICovCisKKy8qIFRoaXMgaW9jdGwgaXMgb25seSB1c2VkIGJ5IHNicGNkIGF0IHRoZSBtb21lbnQgKi8KKyNkZWZpbmUgQ0RST01BVURJT0JVRlNJWiAgICAgICAgMHg1MzgyCS8qIHNldCB0aGUgYXVkaW8gYnVmZmVyIHNpemUgKi8KKwkJCQkJLyogY29uZmxpY3Qgd2l0aCBTQ1NJX0lPQ1RMX0dFVF9JRExVTiAqLworCisvKiBEVkQtUk9NIFNwZWNpZmljIGlvY3RscyAqLworI2RlZmluZSBEVkRfUkVBRF9TVFJVQ1QJCTB4NTM5MCAgLyogUmVhZCBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgRFZEX1dSSVRFX1NUUlVDVAkweDUzOTEgIC8qIFdyaXRlIHN0cnVjdHVyZSAqLworI2RlZmluZSBEVkRfQVVUSAkJMHg1MzkyICAvKiBBdXRoZW50aWNhdGlvbiAqLworCisjZGVmaW5lIENEUk9NX1NFTkRfUEFDS0VUCTB4NTM5MwkvKiBzZW5kIGEgcGFja2V0IHRvIHRoZSBkcml2ZSAqLworI2RlZmluZSBDRFJPTV9ORVhUX1dSSVRBQkxFCTB4NTM5NAkvKiBnZXQgbmV4dCB3cml0YWJsZSBibG9jayAqLworI2RlZmluZSBDRFJPTV9MQVNUX1dSSVRURU4JMHg1Mzk1CS8qIGdldCBsYXN0IGJsb2NrIHdyaXR0ZW4gb24gZGlzYyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ0RST00gSU9DVEwgc3RydWN0dXJlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEFkZHJlc3MgaW4gTVNGIGZvcm1hdCAqLworc3RydWN0IGNkcm9tX21zZjAJCQoreworCV9fdTgJbWludXRlOworCV9fdTgJc2Vjb25kOworCV9fdTgJZnJhbWU7Cit9OworCisvKiBBZGRyZXNzIGluIGVpdGhlciBNU0Ygb3IgbG9naWNhbCBmb3JtYXQgKi8KK3VuaW9uIGNkcm9tX2FkZHIJCQoreworCXN0cnVjdCBjZHJvbV9tc2YwCW1zZjsKKwlpbnQJCQlsYmE7Cit9OworCisvKiBUaGlzIHN0cnVjdCBpcyB1c2VkIGJ5IHRoZSBDRFJPTVBMQVlNU0YgaW9jdGwgKi8gCitzdHJ1Y3QgY2Ryb21fbXNmIAoreworCV9fdTgJY2Rtc2ZfbWluMDsJLyogc3RhcnQgbWludXRlICovCisJX191OAljZG1zZl9zZWMwOwkvKiBzdGFydCBzZWNvbmQgKi8KKwlfX3U4CWNkbXNmX2ZyYW1lMDsJLyogc3RhcnQgZnJhbWUgKi8KKwlfX3U4CWNkbXNmX21pbjE7CS8qIGVuZCBtaW51dGUgKi8KKwlfX3U4CWNkbXNmX3NlYzE7CS8qIGVuZCBzZWNvbmQgKi8KKwlfX3U4CWNkbXNmX2ZyYW1lMTsJLyogZW5kIGZyYW1lICovCit9OworCisvKiBUaGlzIHN0cnVjdCBpcyB1c2VkIGJ5IHRoZSBDRFJPTVBMQVlUUktJTkQgaW9jdGwgKi8KK3N0cnVjdCBjZHJvbV90aSAKK3sKKwlfX3U4CWNkdGlfdHJrMDsJLyogc3RhcnQgdHJhY2sgKi8KKwlfX3U4CWNkdGlfaW5kMDsJLyogc3RhcnQgaW5kZXggKi8KKwlfX3U4CWNkdGlfdHJrMTsJLyogZW5kIHRyYWNrICovCisJX191OAljZHRpX2luZDE7CS8qIGVuZCBpbmRleCAqLworfTsKKworLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCBieSB0aGUgQ0RST01SRUFEVE9DSERSIGlvY3RsICovCitzdHJ1Y3QgY2Ryb21fdG9jaGRyIAkKK3sKKwlfX3U4CWNkdGhfdHJrMDsJLyogc3RhcnQgdHJhY2sgKi8KKwlfX3U4CWNkdGhfdHJrMTsJLyogZW5kIHRyYWNrICovCit9OworCisvKiBUaGlzIHN0cnVjdCBpcyB1c2VkIGJ5IHRoZSBDRFJPTVZPTENUUkwgYW5kIENEUk9NVk9MUkVBRCBpb2N0bHMgKi8KK3N0cnVjdCBjZHJvbV92b2xjdHJsCit7CisJX191OAljaGFubmVsMDsKKwlfX3U4CWNoYW5uZWwxOworCV9fdTgJY2hhbm5lbDI7CisJX191OAljaGFubmVsMzsKK307CisKKy8qIFRoaXMgc3RydWN0IGlzIHVzZWQgYnkgdGhlIENEUk9NU1VCQ0hOTCBpb2N0bCAqLworc3RydWN0IGNkcm9tX3N1YmNobmwgCit7CisJX191OAljZHNjX2Zvcm1hdDsKKwlfX3U4CWNkc2NfYXVkaW9zdGF0dXM7CisJX191OAljZHNjX2FkcjoJNDsKKwlfX3U4CWNkc2NfY3RybDoJNDsKKwlfX3U4CWNkc2NfdHJrOworCV9fdTgJY2RzY19pbmQ7CisJdW5pb24gY2Ryb21fYWRkciBjZHNjX2Fic2FkZHI7CisJdW5pb24gY2Ryb21fYWRkciBjZHNjX3JlbGFkZHI7Cit9OworCisKKy8qIFRoaXMgc3RydWN0IGlzIHVzZWQgYnkgdGhlIENEUk9NUkVBRFRPQ0VOVFJZIGlvY3RsICovCitzdHJ1Y3QgY2Ryb21fdG9jZW50cnkgCit7CisJX191OAljZHRlX3RyYWNrOworCV9fdTgJY2R0ZV9hZHIJOjQ7CisJX191OAljZHRlX2N0cmwJOjQ7CisJX191OAljZHRlX2Zvcm1hdDsKKwl1bmlvbiBjZHJvbV9hZGRyIGNkdGVfYWRkcjsKKwlfX3U4CWNkdGVfZGF0YW1vZGU7Cit9OworCisvKiBUaGlzIHN0cnVjdCBpcyB1c2VkIGJ5IHRoZSBDRFJPTVJFQURNT0RFMSwgYW5kIENEUk9NUkVBRE1PREUyIGlvY3RscyAqLworc3RydWN0IGNkcm9tX3JlYWQgICAgICAKK3sKKwlpbnQJY2RyZWFkX2xiYTsKKwljaGFyIAkqY2RyZWFkX2J1ZmFkZHI7CisJaW50CWNkcmVhZF9idWZsZW47Cit9OworCisvKiBUaGlzIHN0cnVjdCBpcyB1c2VkIGJ5IHRoZSBDRFJPTVJFQURBVURJTyBpb2N0bCAqLworc3RydWN0IGNkcm9tX3JlYWRfYXVkaW8KK3sKKwl1bmlvbiBjZHJvbV9hZGRyIGFkZHI7IC8qIGZyYW1lIGFkZHJlc3MgKi8KKwlfX3U4IGFkZHJfZm9ybWF0OyAgICAgIC8qIENEUk9NX0xCQSBvciBDRFJPTV9NU0YgKi8KKwlpbnQgbmZyYW1lczsgICAgICAgICAgIC8qIG51bWJlciBvZiAyMzUyLWJ5dGUtZnJhbWVzIHRvIHJlYWQgYXQgb25jZSAqLworCV9fdTggKmJ1ZjsgICAgICAvKiBmcmFtZSBidWZmZXIgKHNpemU6IG5mcmFtZXMqMjM1MiBieXRlcykgKi8KK307CisKKy8qIFRoaXMgc3RydWN0IGlzIHVzZWQgd2l0aCB0aGUgQ0RST01NVUxUSVNFU1NJT04gaW9jdGwgKi8KK3N0cnVjdCBjZHJvbV9tdWx0aXNlc3Npb24KK3sKKwl1bmlvbiBjZHJvbV9hZGRyIGFkZHI7IC8qIGZyYW1lIGFkZHJlc3M6IHN0YXJ0LW9mLWxhc3Qtc2Vzc2lvbiAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAobm90IHRoZSBuZXcgImZyYW1lIDE2IiEpLiAgT25seSB2YWxpZAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSAieGFfZmxhZyIgaXMgdHJ1ZS4gKi8KKwlfX3U4IHhhX2ZsYWc7ICAgICAgICAvKiAxOiAiaXMgWEEgZGlzayIgKi8KKwlfX3U4IGFkZHJfZm9ybWF0OyAgICAvKiBDRFJPTV9MQkEgb3IgQ0RST01fTVNGICovCit9OworCisvKiBUaGlzIHN0cnVjdCBpcyB1c2VkIHdpdGggdGhlIENEUk9NX0dFVF9NQ04gaW9jdGwuICAKKyAqIFZlcnkgZmV3IGF1ZGlvIGRpc2NzIGFjdHVhbGx5IGhhdmUgVW5pdmVyc2FsIFByb2R1Y3QgQ29kZSBpbmZvcm1hdGlvbiwgCisgKiB3aGljaCBzaG91bGQganVzdCBiZSB0aGUgTWVkaXVtIENhdGFsb2cgTnVtYmVyIG9uIHRoZSBib3guICBBbHNvIG5vdGUgCisgKiB0aGF0IHRoZSB3YXkgdGhlIGNvZGVpcyB3cml0dGVuIG9uIENEIGlzIF9ub3RfIHVuaWZvcm0gYWNyb3NzIGFsbCBkaXNjcyEKKyAqLyAgCitzdHJ1Y3QgY2Ryb21fbWNuIAoreworICBfX3U4IG1lZGl1bV9jYXRhbG9nX251bWJlclsxNF07IC8qIDEzIEFTQ0lJIGRpZ2l0cywgbnVsbC10ZXJtaW5hdGVkICovCit9OworCisvKiBUaGlzIGlzIHVzZWQgYnkgdGhlIENEUk9NUExBWUJMSyBpb2N0bCAqLworc3RydWN0IGNkcm9tX2JsayAKK3sKKwl1bnNpZ25lZCBmcm9tOworCXVuc2lnbmVkIHNob3J0IGxlbjsKK307CisKKyNkZWZpbmUgQ0RST01fUEFDS0VUX1NJWkUJMTIKKworI2RlZmluZSBDR0NfREFUQV9VTktOT1dOCTAKKyNkZWZpbmUgQ0dDX0RBVEFfV1JJVEUJCTEKKyNkZWZpbmUgQ0dDX0RBVEFfUkVBRAkJMgorI2RlZmluZSBDR0NfREFUQV9OT05FCQkzCisKKy8qIGZvciBDRFJPTV9QQUNLRVRfQ09NTUFORCBpb2N0bCAqLworc3RydWN0IGNkcm9tX2dlbmVyaWNfY29tbWFuZAoreworCXVuc2lnbmVkIGNoYXIgCQljbWRbQ0RST01fUEFDS0VUX1NJWkVdOworCXVuc2lnbmVkIGNoYXIJCSpidWZmZXI7CisJdW5zaWduZWQgaW50IAkJYnVmbGVuOworCWludAkJCXN0YXQ7CisJc3RydWN0IHJlcXVlc3Rfc2Vuc2UJKnNlbnNlOworCXVuc2lnbmVkIGNoYXIJCWRhdGFfZGlyZWN0aW9uOworCWludAkJCXF1aWV0OworCWludAkJCXRpbWVvdXQ7CisJdm9pZAkJCSpyZXNlcnZlZFsxXTsJLyogdW51c2VkLCBhY3R1YWxseSAqLworfTsKKworLyoKKyAqIEEgQ0QtUk9NIHBoeXNpY2FsIHNlY3RvciBzaXplIGlzIDIwNDgsIDIwNTIsIDIwNTYsIDIzMjQsIDIzMzIsIDIzMzYsIAorICogMjM0MCwgb3IgMjM1MiBieXRlcyBsb25nLiAgCisKKyogICAgICAgICBTZWN0b3IgdHlwZXMgb2YgdGhlIHN0YW5kYXJkIENELVJPTSBkYXRhIGZvcm1hdHM6CisgKgorICogZm9ybWF0ICAgc2VjdG9yIHR5cGUgICAgICAgICAgICAgICB1c2VyIGRhdGEgc2l6ZSAoYnl0ZXMpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAxICAgICAoUmVkIEJvb2spICAgIENELURBICAgICAgICAgIDIzNTIgICAgKENEX0ZSQU1FU0laRV9SQVcpCisgKiAgIDIgICAgIChZZWxsb3cgQm9vaykgTW9kZTEgRm9ybTEgICAgMjA0OCAgICAoQ0RfRlJBTUVTSVpFKQorICogICAzICAgICAoWWVsbG93IEJvb2spIE1vZGUxIEZvcm0yICAgIDIzMzYgICAgKENEX0ZSQU1FU0laRV9SQVcwKQorICogICA0ICAgICAoR3JlZW4gQm9vaykgIE1vZGUyIEZvcm0xICAgIDIwNDggICAgKENEX0ZSQU1FU0laRSkKKyAqICAgNSAgICAgKEdyZWVuIEJvb2spICBNb2RlMiBGb3JtMiAgICAyMzI4ICAgICgyMzI0KzQgc3BhcmUgYnl0ZXMpCisgKgorICoKKyAqICAgICAgIFRoZSBsYXlvdXQgb2YgdGhlIHN0YW5kYXJkIENELVJPTSBkYXRhIGZvcm1hdHM6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogLSBhdWRpbyAocmVkKTogICAgICAgICAgICAgICAgICB8IGF1ZGlvX3NhbXBsZV9ieXRlcyB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIDIzNTIgICAgICAgIHwKKyAqCisgKiAtIGRhdGEgKHllbGxvdywgbW9kZTEpOiAgICAgICAgIHwgc3luYyAtIGhlYWQgLSBkYXRhIC0gRURDIC0gemVybyAtIEVDQyB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEyICAtICAgNCAgLSAyMDQ4IC0gIDQgIC0gICA4ICAtIDI3NiB8CisgKgorICogLSBkYXRhICh5ZWxsb3csIG1vZGUyKTogICAgICAgICB8IHN5bmMgLSBoZWFkIC0gZGF0YSB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEyICAtICAgNCAgLSAyMzM2IHwKKyAqCisgKiAtIFhBIGRhdGEgKGdyZWVuLCBtb2RlMiBmb3JtMSk6IHwgc3luYyAtIGhlYWQgLSBzdWIgLSBkYXRhIC0gRURDIC0gRUNDIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTIgIC0gICA0ICAtICA4ICAtIDIwNDggLSAgNCAgLSAyNzYgfAorICoKKyAqIC0gWEEgZGF0YSAoZ3JlZW4sIG1vZGUyIGZvcm0yKTogfCBzeW5jIC0gaGVhZCAtIHN1YiAtIGRhdGEgLSBTcGFyZSB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEyICAtICAgNCAgLSAgOCAgLSAyMzI0IC0gIDQgICAgfAorICoKKyAqLworCisvKiBTb21lIGdlbmVyYWxseSB1c2VmdWwgQ0QtUk9NIGluZm9ybWF0aW9uIC0tIG1vc3RseSBiYXNlZCBvbiB0aGUgYWJvdmUgKi8KKyNkZWZpbmUgQ0RfTUlOUyAgICAgICAgICAgICAgNzQgLyogbWF4LiBtaW51dGVzIHBlciBDRCwgbm90IHJlYWxseSBhIGxpbWl0ICovCisjZGVmaW5lIENEX1NFQ1MgICAgICAgICAgICAgIDYwIC8qIHNlY29uZHMgcGVyIG1pbnV0ZSAqLworI2RlZmluZSBDRF9GUkFNRVMgICAgICAgICAgICA3NSAvKiBmcmFtZXMgcGVyIHNlY29uZCAqLworI2RlZmluZSBDRF9TWU5DX1NJWkUgICAgICAgICAxMiAvKiAxMiBzeW5jIGJ5dGVzIHBlciByYXcgZGF0YSBmcmFtZSAqLworI2RlZmluZSBDRF9NU0ZfT0ZGU0VUICAgICAgIDE1MCAvKiBNU0YgbnVtYmVyaW5nIG9mZnNldCBvZiBmaXJzdCBmcmFtZSAqLworI2RlZmluZSBDRF9DSFVOS19TSVpFICAgICAgICAyNCAvKiBsb3dlc3QtbGV2ZWwgImRhdGEgYnl0ZXMgcGllY2UiICovCisjZGVmaW5lIENEX05VTV9PRl9DSFVOS1MgICAgIDk4IC8qIGNodW5rcyBwZXIgZnJhbWUgKi8KKyNkZWZpbmUgQ0RfRlJBTUVTSVpFX1NVQiAgICAgOTYgLyogc3ViY2hhbm5lbCBkYXRhICJmcmFtZSIgc2l6ZSAqLworI2RlZmluZSBDRF9IRUFEX1NJWkUgICAgICAgICAgNCAvKiBoZWFkZXIgKGFkZHJlc3MpIGJ5dGVzIHBlciByYXcgZGF0YSBmcmFtZSAqLworI2RlZmluZSBDRF9TVUJIRUFEX1NJWkUgICAgICAgOCAvKiBzdWJoZWFkZXIgYnl0ZXMgcGVyIHJhdyBYQSBkYXRhIGZyYW1lICovCisjZGVmaW5lIENEX0VEQ19TSVpFICAgICAgICAgICA0IC8qIGJ5dGVzIEVEQyBwZXIgbW9zdCByYXcgZGF0YSBmcmFtZSB0eXBlcyAqLworI2RlZmluZSBDRF9aRVJPX1NJWkUgICAgICAgICAgOCAvKiBieXRlcyB6ZXJvIHBlciB5ZWxsb3cgYm9vayBtb2RlIDEgZnJhbWUgKi8KKyNkZWZpbmUgQ0RfRUNDX1NJWkUgICAgICAgICAyNzYgLyogYnl0ZXMgRUNDIHBlciBtb3N0IHJhdyBkYXRhIGZyYW1lIHR5cGVzICovCisjZGVmaW5lIENEX0ZSQU1FU0laRSAgICAgICAyMDQ4IC8qIGJ5dGVzIHBlciBmcmFtZSwgImNvb2tlZCIgbW9kZSAqLworI2RlZmluZSBDRF9GUkFNRVNJWkVfUkFXICAgMjM1MiAvKiBieXRlcyBwZXIgZnJhbWUsICJyYXciIG1vZGUgKi8KKyNkZWZpbmUgQ0RfRlJBTUVTSVpFX1JBV0VSIDI2NDYgLyogVGhlIG1heGltdW0gcG9zc2libGUgcmV0dXJuZWQgYnl0ZXMgKi8gCisvKiBtb3N0IGRyaXZlcyBkb24ndCBkZWxpdmVyIGV2ZXJ5dGhpbmc6ICovCisjZGVmaW5lIENEX0ZSQU1FU0laRV9SQVcxIChDRF9GUkFNRVNJWkVfUkFXLUNEX1NZTkNfU0laRSkgLyoyMzQwKi8KKyNkZWZpbmUgQ0RfRlJBTUVTSVpFX1JBVzAgKENEX0ZSQU1FU0laRV9SQVctQ0RfU1lOQ19TSVpFLUNEX0hFQURfU0laRSkgLyoyMzM2Ki8KKworI2RlZmluZSBDRF9YQV9IRUFEICAgICAgICAoQ0RfSEVBRF9TSVpFK0NEX1NVQkhFQURfU0laRSkgLyogImJlZm9yZSBkYXRhIiBwYXJ0IG9mIHJhdyBYQSBmcmFtZSAqLworI2RlZmluZSBDRF9YQV9UQUlMICAgICAgICAoQ0RfRURDX1NJWkUrQ0RfRUNDX1NJWkUpIC8qICJhZnRlciBkYXRhIiBwYXJ0IG9mIHJhdyBYQSBmcmFtZSAqLworI2RlZmluZSBDRF9YQV9TWU5DX0hFQUQgICAoQ0RfU1lOQ19TSVpFK0NEX1hBX0hFQUQpIC8qIHN5bmMgYnl0ZXMgKyBoZWFkZXIgb2YgWEEgZnJhbWUgKi8KKworLyogQ0QtUk9NIGFkZHJlc3MgdHlwZXMgKGNkcm9tX3RvY2VudHJ5LmNkdGVfZm9ybWF0KSAqLworI2RlZmluZQlDRFJPTV9MQkEgMHgwMSAvKiAibG9naWNhbCBibG9jayI6IGZpcnN0IGZyYW1lIGlzICMwICovCisjZGVmaW5lCUNEUk9NX01TRiAweDAyIC8qICJtaW51dGUtc2Vjb25kLWZyYW1lIjogYmluYXJ5LCBub3QgYmNkIGhlcmUhICovCisKKy8qIGJpdCB0byB0ZWxsIHdoZXRoZXIgdHJhY2sgaXMgZGF0YSBvciBhdWRpbyAoY2Ryb21fdG9jZW50cnkuY2R0ZV9jdHJsKSAqLworI2RlZmluZQlDRFJPTV9EQVRBX1RSQUNLCTB4MDQKKworLyogVGhlIGxlYWRvdXQgdHJhY2sgaXMgYWx3YXlzIDB4QUEsIHJlZ2FyZGxlc3Mgb2YgIyBvZiB0cmFja3Mgb24gZGlzYyAqLworI2RlZmluZQlDRFJPTV9MRUFET1VUCQkweEFBCisKKy8qIGF1ZGlvIHN0YXRlcyAoZnJvbSBTQ1NJLTIsIGJ1dCBzZWVuIHdpdGggb3RoZXIgZHJpdmVzLCB0b28pICovCisjZGVmaW5lCUNEUk9NX0FVRElPX0lOVkFMSUQJMHgwMAkvKiBhdWRpbyBzdGF0dXMgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZQlDRFJPTV9BVURJT19QTEFZCTB4MTEJLyogYXVkaW8gcGxheSBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUJQ0RST01fQVVESU9fUEFVU0VECTB4MTIJLyogYXVkaW8gcGxheSBvcGVyYXRpb24gcGF1c2VkICovCisjZGVmaW5lCUNEUk9NX0FVRElPX0NPTVBMRVRFRAkweDEzCS8qIGF1ZGlvIHBsYXkgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCAqLworI2RlZmluZQlDRFJPTV9BVURJT19FUlJPUgkweDE0CS8qIGF1ZGlvIHBsYXkgc3RvcHBlZCBkdWUgdG8gZXJyb3IgKi8KKyNkZWZpbmUJQ0RST01fQVVESU9fTk9fU1RBVFVTCTB4MTUJLyogbm8gY3VycmVudCBhdWRpbyBzdGF0dXMgdG8gcmV0dXJuICovCisKKy8qIGNhcGFiaWxpdHkgZmxhZ3MgdXNlZCB3aXRoIHRoZSB1bmlmb3JtIENELVJPTSBkcml2ZXIgKi8gCisjZGVmaW5lIENEQ19DTE9TRV9UUkFZCQkweDEgICAgIC8qIGNhZGR5IHN5c3RlbXMgX2Nhbid0XyBjbG9zZSAqLworI2RlZmluZSBDRENfT1BFTl9UUkFZCQkweDIgICAgIC8qIGJ1dCBfY2FuXyBlamVjdC4gICovCisjZGVmaW5lIENEQ19MT0NLCQkweDQgICAgIC8qIGRpc2FibGUgbWFudWFsIGVqZWN0ICovCisjZGVmaW5lIENEQ19TRUxFQ1RfU1BFRUQgCTB4OCAgICAgLyogcHJvZ3JhbW1hYmxlIHNwZWVkICovCisjZGVmaW5lIENEQ19TRUxFQ1RfRElTQwkJMHgxMCAgICAvKiBzZWxlY3QgZGlzYyBmcm9tIGp1a2UtYm94ICovCisjZGVmaW5lIENEQ19NVUxUSV9TRVNTSU9OIAkweDIwICAgIC8qIHJlYWQgc2Vzc2lvbnM+MSAqLworI2RlZmluZSBDRENfTUNOCQkJMHg0MCAgICAvKiBNZWRpdW0gQ2F0YWxvZyBOdW1iZXIgKi8KKyNkZWZpbmUgQ0RDX01FRElBX0NIQU5HRUQgCTB4ODAgICAgLyogbWVkaWEgY2hhbmdlZCAqLworI2RlZmluZSBDRENfUExBWV9BVURJTwkJMHgxMDAgICAvKiBhdWRpbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgQ0RDX1JFU0VUICAgICAgICAgICAgICAgMHgyMDAgICAvKiBoYXJkIHJlc2V0IGRldmljZSAqLworI2RlZmluZSBDRENfRFJJVkVfU1RBVFVTICAgICAgICAweDgwMCAgIC8qIGRyaXZlciBpbXBsZW1lbnRzIGRyaXZlIHN0YXR1cyAqLworI2RlZmluZSBDRENfR0VORVJJQ19QQUNLRVQJMHgxMDAwCS8qIGRyaXZlciBpbXBsZW1lbnRzIGdlbmVyaWMgcGFja2V0cyAqLworI2RlZmluZSBDRENfQ0RfUgkJMHgyMDAwCS8qIGRyaXZlIGlzIGEgQ0QtUiAqLworI2RlZmluZSBDRENfQ0RfUlcJCTB4NDAwMAkvKiBkcml2ZSBpcyBhIENELVJXICovCisjZGVmaW5lIENEQ19EVkQJCQkweDgwMDAJLyogZHJpdmUgaXMgYSBEVkQgKi8KKyNkZWZpbmUgQ0RDX0RWRF9SCQkweDEwMDAwCS8qIGRyaXZlIGNhbiB3cml0ZSBEVkQtUiAqLworI2RlZmluZSBDRENfRFZEX1JBTQkJMHgyMDAwMAkvKiBkcml2ZSBjYW4gd3JpdGUgRFZELVJBTSAqLworI2RlZmluZSBDRENfTU9fRFJJVkUJCTB4NDAwMDAgLyogZHJpdmUgaXMgYW4gTU8gZGV2aWNlICovCisjZGVmaW5lIENEQ19NUlcJCQkweDgwMDAwIC8qIGRyaXZlIGNhbiByZWFkIE1SVyAqLworI2RlZmluZSBDRENfTVJXX1cJCTB4MTAwMDAwIC8qIGRyaXZlIGNhbiB3cml0ZSBNUlcgKi8KKyNkZWZpbmUgQ0RDX1JBTQkJCTB4MjAwMDAwIC8qIG9rIHRvIG9wZW4gZm9yIFdSSVRFICovCisKKy8qIGRyaXZlIHN0YXR1cyBwb3NzaWJpbGl0aWVzIHJldHVybmVkIGJ5IENEUk9NX0RSSVZFX1NUQVRVUyBpb2N0bCAqLworI2RlZmluZSBDRFNfTk9fSU5GTwkJMAkvKiBpZiBub3QgaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgQ0RTX05PX0RJU0MJCTEKKyNkZWZpbmUgQ0RTX1RSQVlfT1BFTgkJMgorI2RlZmluZSBDRFNfRFJJVkVfTk9UX1JFQURZCTMKKyNkZWZpbmUgQ0RTX0RJU0NfT0sJCTQKKworLyogcmV0dXJuIHZhbHVlcyBmb3IgdGhlIENEUk9NX0RJU0NfU1RBVFVTIGlvY3RsICovCisvKiBjYW4gYWxzbyByZXR1cm4gQ0RTX05PX1tJTkZPfERJU0NdLCBmcm9tIGFib3ZlICovCisjZGVmaW5lIENEU19BVURJTwkJMTAwCisjZGVmaW5lIENEU19EQVRBXzEJCTEwMQorI2RlZmluZSBDRFNfREFUQV8yCQkxMDIKKyNkZWZpbmUgQ0RTX1hBXzJfMQkJMTAzCisjZGVmaW5lIENEU19YQV8yXzIJCTEwNAorI2RlZmluZSBDRFNfTUlYRUQJCTEwNQorCisvKiBVc2VyLWNvbmZpZ3VyYWJsZSBiZWhhdmlvciBvcHRpb25zIGZvciB0aGUgdW5pZm9ybSBDRC1ST00gZHJpdmVyICovCisjZGVmaW5lIENET19BVVRPX0NMT1NFCQkweDEgICAgIC8qIGNsb3NlIHRyYXkgb24gZmlyc3Qgb3BlbigpICovCisjZGVmaW5lIENET19BVVRPX0VKRUNUCQkweDIgICAgIC8qIG9wZW4gdHJheSBvbiBsYXN0IHJlbGVhc2UoKSAqLworI2RlZmluZSBDRE9fVVNFX0ZGTEFHUwkJMHg0ICAgICAvKiB1c2UgT19OT05CTE9DSyBpbmZvcm1hdGlvbiBvbiBvcGVuICovCisjZGVmaW5lIENET19MT0NLCQkweDggICAgIC8qIGxvY2sgdHJheSBvbiBvcGVuIGZpbGVzICovCisjZGVmaW5lIENET19DSEVDS19UWVBFCQkweDEwICAgIC8qIGNoZWNrIHR5cGUgb24gb3BlbiBmb3IgZGF0YSAqLworCisvKiBTcGVjaWFsIGNvZGVzIHVzZWQgd2hlbiBzcGVjaWZ5aW5nIGNoYW5nZXIgc2xvdHMuICovCisjZGVmaW5lIENEU0xfTk9ORSAgICAgICAJKElOVF9NQVgtMSkKKyNkZWZpbmUgQ0RTTF9DVVJSRU5UICAgIAlJTlRfTUFYCisKKy8qIEZvciBwYXJ0aXRpb24gYmFzZWQgbXVsdGlzZXNzaW9uIGFjY2Vzcy4gSURFIGNhbiBoYW5kbGUgNjQgcGFydGl0aW9ucworICogcGVyIGRyaXZlIC0gU0NTSSBDRC1ST00ncyB1c2UgbWlub3JzIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUKKyAqIHZhcmlvdXMgZHJpdmVzLCBzbyB3ZSBjYW4ndCBkbyBtdWx0aXNlc3Npb25zIHRoZSBzYW1lIHdheSB0aGVyZS4KKyAqIFVzZSB0aGUgLW8gc2Vzc2lvbj14IG9wdGlvbiB0byBtb3VudCBvbiB0aGVtLgorICovCisjZGVmaW5lIENEX1BBUlRfTUFYCQk2NAorI2RlZmluZSBDRF9QQVJUX01BU0sJCShDRF9QQVJUX01BWCAtIDEpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdlbmVyaWMgUGFja2V0IGNvbW1hbmRzLCBNTUMgY29tbWFuZHMsIGFuZCBzdWNoCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgLyogVGhlIGdlbmVyaWMgcGFja2V0IGNvbW1hbmQgb3Bjb2RlcyBmb3IgQ0QvRFZEIExvZ2ljYWwgVW5pdHMsCisgKiBGcm9tIFRhYmxlIDU3IG9mIHRoZSBTRkY4MDkwIFZlci4gMyAoTXQuIEZ1amkpIGRyYWZ0IHN0YW5kYXJkLiAqLworI2RlZmluZSBHUENNRF9CTEFOSwkJCSAgICAweGExCisjZGVmaW5lIEdQQ01EX0NMT1NFX1RSQUNLCQkgICAgMHg1YgorI2RlZmluZSBHUENNRF9GTFVTSF9DQUNIRQkJICAgIDB4MzUKKyNkZWZpbmUgR1BDTURfRk9STUFUX1VOSVQJCSAgICAweDA0CisjZGVmaW5lIEdQQ01EX0dFVF9DT05GSUdVUkFUSU9OCQkgICAgMHg0NgorI2RlZmluZSBHUENNRF9HRVRfRVZFTlRfU1RBVFVTX05PVElGSUNBVElPTiAweDRhCisjZGVmaW5lIEdQQ01EX0dFVF9QRVJGT1JNQU5DRQkJICAgIDB4YWMKKyNkZWZpbmUgR1BDTURfSU5RVUlSWQkJCSAgICAweDEyCisjZGVmaW5lIEdQQ01EX0xPQURfVU5MT0FECQkgICAgMHhhNgorI2RlZmluZSBHUENNRF9NRUNIQU5JU01fU1RBVFVTCQkgICAgMHhiZAorI2RlZmluZSBHUENNRF9NT0RFX1NFTEVDVF8xMAkJICAgIDB4NTUKKyNkZWZpbmUgR1BDTURfTU9ERV9TRU5TRV8xMAkJICAgIDB4NWEKKyNkZWZpbmUgR1BDTURfUEFVU0VfUkVTVU1FCQkgICAgMHg0YgorI2RlZmluZSBHUENNRF9QTEFZX0FVRElPXzEwCQkgICAgMHg0NQorI2RlZmluZSBHUENNRF9QTEFZX0FVRElPX01TRgkJICAgIDB4NDcKKyNkZWZpbmUgR1BDTURfUExBWV9BVURJT19USQkJICAgIDB4NDgKKyNkZWZpbmUgR1BDTURfUExBWV9DRAkJCSAgICAweGJjCisjZGVmaW5lIEdQQ01EX1BSRVZFTlRfQUxMT1dfTUVESVVNX1JFTU9WQUwgIDB4MWUKKyNkZWZpbmUgR1BDTURfUkVBRF8xMAkJCSAgICAweDI4CisjZGVmaW5lIEdQQ01EX1JFQURfMTIJCQkgICAgMHhhOAorI2RlZmluZSBHUENNRF9SRUFEX0JVRkZFUgkJICAgIDB4M2MKKyNkZWZpbmUgR1BDTURfUkVBRF9CVUZGRVJfQ0FQQUNJVFkJICAgIDB4NWMKKyNkZWZpbmUgR1BDTURfUkVBRF9DRFZEX0NBUEFDSVRZCSAgICAweDI1CisjZGVmaW5lIEdQQ01EX1JFQURfQ0QJCQkgICAgMHhiZQorI2RlZmluZSBHUENNRF9SRUFEX0NEX01TRgkJICAgIDB4YjkKKyNkZWZpbmUgR1BDTURfUkVBRF9ESVNDX0lORk8JCSAgICAweDUxCisjZGVmaW5lIEdQQ01EX1JFQURfRFZEX1NUUlVDVFVSRQkgICAgMHhhZAorI2RlZmluZSBHUENNRF9SRUFEX0ZPUk1BVF9DQVBBQ0lUSUVTCSAgICAweDIzCisjZGVmaW5lIEdQQ01EX1JFQURfSEVBREVSCQkgICAgMHg0NAorI2RlZmluZSBHUENNRF9SRUFEX1RSQUNLX1JaT05FX0lORk8JICAgIDB4NTIKKyNkZWZpbmUgR1BDTURfUkVBRF9TVUJDSEFOTkVMCQkgICAgMHg0MgorI2RlZmluZSBHUENNRF9SRUFEX1RPQ19QTUFfQVRJUAkJICAgIDB4NDMKKyNkZWZpbmUgR1BDTURfUkVQQUlSX1JaT05FX1RSQUNLCSAgICAweDU4CisjZGVmaW5lIEdQQ01EX1JFUE9SVF9LRVkJCSAgICAweGE0CisjZGVmaW5lIEdQQ01EX1JFUVVFU1RfU0VOU0UJCSAgICAweDAzCisjZGVmaW5lIEdQQ01EX1JFU0VSVkVfUlpPTkVfVFJBQ0sJICAgIDB4NTMKKyNkZWZpbmUgR1BDTURfU0VORF9DVUVfU0hFRVQJCSAgICAweDVkCisjZGVmaW5lIEdQQ01EX1NDQU4JCQkgICAgMHhiYQorI2RlZmluZSBHUENNRF9TRUVLCQkJICAgIDB4MmIKKyNkZWZpbmUgR1BDTURfU0VORF9EVkRfU1RSVUNUVVJFCSAgICAweGJmCisjZGVmaW5lIEdQQ01EX1NFTkRfRVZFTlQJCSAgICAweGEyCisjZGVmaW5lIEdQQ01EX1NFTkRfS0VZCQkJICAgIDB4YTMKKyNkZWZpbmUgR1BDTURfU0VORF9PUEMJCQkgICAgMHg1NAorI2RlZmluZSBHUENNRF9TRVRfUkVBRF9BSEVBRAkJICAgIDB4YTcKKyNkZWZpbmUgR1BDTURfU0VUX1NUUkVBTUlORwkJICAgIDB4YjYKKyNkZWZpbmUgR1BDTURfU1RBUlRfU1RPUF9VTklUCQkgICAgMHgxYgorI2RlZmluZSBHUENNRF9TVE9QX1BMQVlfU0NBTgkJICAgIDB4NGUKKyNkZWZpbmUgR1BDTURfVEVTVF9VTklUX1JFQURZCQkgICAgMHgwMAorI2RlZmluZSBHUENNRF9WRVJJRllfMTAJCQkgICAgMHgyZgorI2RlZmluZSBHUENNRF9XUklURV8xMAkJCSAgICAweDJhCisjZGVmaW5lIEdQQ01EX1dSSVRFXzEyCQkJICAgIDB4YWEKKyNkZWZpbmUgR1BDTURfV1JJVEVfQU5EX1ZFUklGWV8xMAkgICAgMHgyZQorI2RlZmluZSBHUENNRF9XUklURV9CVUZGRVIJCSAgICAweDNiCisvKiBUaGlzIGlzIGxpc3RlZCBhcyBvcHRpb25hbCBpbiBBVEFQSSAyLjYsIGJ1dCBpcyAoY3VyaW91c2x5KSAKKyAqIG1pc3NpbmcgZnJvbSBNdC4gRnVqaSwgVGFibGUgNTcuICBJdCBfaXNfIG1lbnRpb25lZCBpbiBNdC4gRnVqaQorICogVGFibGUgMzc3IGFzIGFuIE1NQyBjb21tYW5kIGZvciBTQ1NpIGRldmljZXMgdGhvdWdoLi4uICBNb3N0IEFUQVBJCisgKiBkcml2ZXMgc3VwcG9ydCBpdC4gKi8KKyNkZWZpbmUgR1BDTURfU0VUX1NQRUVECQkJICAgIDB4YmIKKy8qIFRoaXMgc2VlbXMgdG8gYmUgYSBTQ1NJIHNwZWNpZmljIENELVJPTSBvcGNvZGUgCisgKiB0byBwbGF5IGRhdGEgYXQgdHJhY2svaW5kZXggKi8KKyNkZWZpbmUgR1BDTURfUExBWUFVRElPX1RJCQkgICAgMHg0OAorLyoKKyAqIEZyb20gTVMgTWVkaWEgU3RhdHVzIE5vdGlmaWNhdGlvbiBTdXBwb3J0IFNwZWNpZmljYXRpb24uIEZvcgorICogb2xkZXIgZHJpdmVzIG9ubHkuCisgKi8KKyNkZWZpbmUgR1BDTURfR0VUX01FRElBX1NUQVRVUwkJICAgIDB4ZGEKKworLyogTW9kZSBwYWdlIGNvZGVzIGZvciBtb2RlIHNlbnNlL3NldCAqLworI2RlZmluZSBHUE1PREVfVkVORE9SX1BBR0UJCTB4MDAKKyNkZWZpbmUgR1BNT0RFX1JfV19FUlJPUl9QQUdFCQkweDAxCisjZGVmaW5lIEdQTU9ERV9XUklURV9QQVJNU19QQUdFCQkweDA1CisjZGVmaW5lIEdQTU9ERV9XQ0FDSElOR19QQUdFCQkweDA4CisjZGVmaW5lIEdQTU9ERV9BVURJT19DVExfUEFHRQkJMHgwZQorI2RlZmluZSBHUE1PREVfUE9XRVJfUEFHRQkJMHgxYQorI2RlZmluZSBHUE1PREVfRkFVTFRfRkFJTF9QQUdFCQkweDFjCisjZGVmaW5lIEdQTU9ERV9UT19QUk9URUNUX1BBR0UJCTB4MWQKKyNkZWZpbmUgR1BNT0RFX0NBUEFCSUxJVElFU19QQUdFCTB4MmEKKyNkZWZpbmUgR1BNT0RFX0FMTF9QQUdFUwkJMHgzZgorLyogTm90IGluIE10LiBGdWppLCBidXQgaW4gQVRBUEkgMi42IC0tIGRlcHJlY2F0ZWQgbm93IGluIGZhdm9yCisgKiBvZiBNT0RFX1NFTlNFX1BPV0VSX1BBR0UgKi8KKyNkZWZpbmUgR1BNT0RFX0NEUk9NX1BBR0UJCTB4MGQKKworCisKKy8qIERWRCBzdHJ1Y3QgdHlwZXMgKi8KKyNkZWZpbmUgRFZEX1NUUlVDVF9QSFlTSUNBTAkweDAwCisjZGVmaW5lIERWRF9TVFJVQ1RfQ09QWVJJR0hUCTB4MDEKKyNkZWZpbmUgRFZEX1NUUlVDVF9ESVNDS0VZCTB4MDIKKyNkZWZpbmUgRFZEX1NUUlVDVF9CQ0EJCTB4MDMKKyNkZWZpbmUgRFZEX1NUUlVDVF9NQU5VRkFDVAkweDA0CisKK3N0cnVjdCBkdmRfbGF5ZXIgeworCV9fdTggYm9va192ZXJzaW9uCTogNDsKKwlfX3U4IGJvb2tfdHlwZQkJOiA0OworCV9fdTggbWluX3JhdGUJCTogNDsKKwlfX3U4IGRpc2Nfc2l6ZQkJOiA0OworCV9fdTggbGF5ZXJfdHlwZQkJOiA0OworCV9fdTggdHJhY2tfcGF0aAkJOiAxOworCV9fdTggbmxheWVycwkJOiAyOworCV9fdTggdHJhY2tfZGVuc2l0eQk6IDQ7CisJX191OCBsaW5lYXJfZGVuc2l0eQk6IDQ7CisJX191OCBiY2EJCTogMTsKKwlfX3UzMiBzdGFydF9zZWN0b3I7CisJX191MzIgZW5kX3NlY3RvcjsKKwlfX3UzMiBlbmRfc2VjdG9yX2wwOworfTsKKworI2RlZmluZSBEVkRfTEFZRVJTCTQKKworc3RydWN0IGR2ZF9waHlzaWNhbCB7CisJX191OCB0eXBlOworCV9fdTggbGF5ZXJfbnVtOworCXN0cnVjdCBkdmRfbGF5ZXIgbGF5ZXJbRFZEX0xBWUVSU107Cit9OworCitzdHJ1Y3QgZHZkX2NvcHlyaWdodCB7CisJX191OCB0eXBlOworCisJX191OCBsYXllcl9udW07CisJX191OCBjcHN0OworCV9fdTggcm1pOworfTsKKworc3RydWN0IGR2ZF9kaXNja2V5IHsKKwlfX3U4IHR5cGU7CisKKwl1bnNpZ25lZCBhZ2lkCQk6IDI7CisJX191OCB2YWx1ZVsyMDQ4XTsKK307CisKK3N0cnVjdCBkdmRfYmNhIHsKKwlfX3U4IHR5cGU7CisKKwlpbnQgbGVuOworCV9fdTggdmFsdWVbMTg4XTsKK307CisKK3N0cnVjdCBkdmRfbWFudWZhY3QgeworCV9fdTggdHlwZTsKKworCV9fdTggbGF5ZXJfbnVtOworCWludCBsZW47CisJX191OCB2YWx1ZVsyMDQ4XTsKK307CisKK3R5cGVkZWYgdW5pb24geworCV9fdTggdHlwZTsKKworCXN0cnVjdCBkdmRfcGh5c2ljYWwJcGh5c2ljYWw7CisJc3RydWN0IGR2ZF9jb3B5cmlnaHQJY29weXJpZ2h0OworCXN0cnVjdCBkdmRfZGlzY2tleQlkaXNja2V5OworCXN0cnVjdCBkdmRfYmNhCQliY2E7CisJc3RydWN0IGR2ZF9tYW51ZmFjdAltYW51ZmFjdDsKK30gZHZkX3N0cnVjdDsKKworLyoKKyAqIERWRCBhdXRoZW50aWNhdGlvbiBpb2N0bAorICovCisKKy8qIEF1dGhlbnRpY2F0aW9uIHN0YXRlcyAqLworI2RlZmluZSBEVkRfTFVfU0VORF9BR0lECTAKKyNkZWZpbmUgRFZEX0hPU1RfU0VORF9DSEFMTEVOR0UJMQorI2RlZmluZSBEVkRfTFVfU0VORF9LRVkxCTIKKyNkZWZpbmUgRFZEX0xVX1NFTkRfQ0hBTExFTkdFCTMKKyNkZWZpbmUgRFZEX0hPU1RfU0VORF9LRVkyCTQKKworLyogVGVybWluYXRpb24gc3RhdGVzICovCisjZGVmaW5lIERWRF9BVVRIX0VTVEFCTElTSEVECTUKKyNkZWZpbmUgRFZEX0FVVEhfRkFJTFVSRQk2CisKKy8qIE90aGVyIGZ1bmN0aW9ucyAqLworI2RlZmluZSBEVkRfTFVfU0VORF9USVRMRV9LRVkJNworI2RlZmluZSBEVkRfTFVfU0VORF9BU0YJCTgKKyNkZWZpbmUgRFZEX0lOVkFMSURBVEVfQUdJRAk5CisjZGVmaW5lIERWRF9MVV9TRU5EX1JQQ19TVEFURQkxMAorI2RlZmluZSBEVkRfSE9TVF9TRU5EX1JQQ19TVEFURQkxMQorCisvKiBTdGF0ZSBkYXRhICovCit0eXBlZGVmIF9fdTggZHZkX2tleVs1XTsJCS8qIDQwLWJpdCB2YWx1ZSwgTVNCIGlzIGZpcnN0IGVsZW0uICovCit0eXBlZGVmIF9fdTggZHZkX2NoYWxsZW5nZVsxMF07CS8qIDgwLWJpdCB2YWx1ZSwgTVNCIGlzIGZpcnN0IGVsZW0uICovCisKK3N0cnVjdCBkdmRfbHVfc2VuZF9hZ2lkIHsKKwlfX3U4IHR5cGU7CisJdW5zaWduZWQgYWdpZAkJOiAyOworfTsKKworc3RydWN0IGR2ZF9ob3N0X3NlbmRfY2hhbGxlbmdlIHsKKwlfX3U4IHR5cGU7CisJdW5zaWduZWQgYWdpZAkJOiAyOworCisJZHZkX2NoYWxsZW5nZSBjaGFsOworfTsKKworc3RydWN0IGR2ZF9zZW5kX2tleSB7CisJX191OCB0eXBlOworCXVuc2lnbmVkIGFnaWQJCTogMjsKKworCWR2ZF9rZXkga2V5OworfTsKKworc3RydWN0IGR2ZF9sdV9zZW5kX2NoYWxsZW5nZSB7CisJX191OCB0eXBlOworCXVuc2lnbmVkIGFnaWQJCTogMjsKKworCWR2ZF9jaGFsbGVuZ2UgY2hhbDsKK307CisKKyNkZWZpbmUgRFZEX0NQTV9OT19DT1BZUklHSFQJMAorI2RlZmluZSBEVkRfQ1BNX0NPUFlSSUdIVEVECTEKKworI2RlZmluZSBEVkRfQ1BfU0VDX05PTkUJCTAKKyNkZWZpbmUgRFZEX0NQX1NFQ19FWElTVAkxCisKKyNkZWZpbmUgRFZEX0NHTVNfVU5SRVNUUklDVEVECTAKKyNkZWZpbmUgRFZEX0NHTVNfU0lOR0xFCQkyCisjZGVmaW5lIERWRF9DR01TX1JFU1RSSUNURUQJMworCitzdHJ1Y3QgZHZkX2x1X3NlbmRfdGl0bGVfa2V5IHsKKwlfX3U4IHR5cGU7CisJdW5zaWduZWQgYWdpZAkJOiAyOworCisJZHZkX2tleSB0aXRsZV9rZXk7CisJaW50IGxiYTsKKwl1bnNpZ25lZCBjcG0JCTogMTsKKwl1bnNpZ25lZCBjcF9zZWMJCTogMTsKKwl1bnNpZ25lZCBjZ21zCQk6IDI7Cit9OworCitzdHJ1Y3QgZHZkX2x1X3NlbmRfYXNmIHsKKwlfX3U4IHR5cGU7CisJdW5zaWduZWQgYWdpZAkJOiAyOworCisJdW5zaWduZWQgYXNmCQk6IDE7Cit9OworCitzdHJ1Y3QgZHZkX2hvc3Rfc2VuZF9ycGNzdGF0ZSB7CisJX191OCB0eXBlOworCV9fdTggcGRyYzsKK307CisKK3N0cnVjdCBkdmRfbHVfc2VuZF9ycGNzdGF0ZSB7CisJX191OCB0eXBlCQk6IDI7CisJX191OCB2cmEJCTogMzsKKwlfX3U4IHVjY2EJCTogMzsKKwlfX3U4IHJlZ2lvbl9tYXNrOworCV9fdTggcnBjX3NjaGVtZTsKK307CisKK3R5cGVkZWYgdW5pb24geworCV9fdTggdHlwZTsKKworCXN0cnVjdCBkdmRfbHVfc2VuZF9hZ2lkCQlsc2E7CisJc3RydWN0IGR2ZF9ob3N0X3NlbmRfY2hhbGxlbmdlCWhzYzsKKwlzdHJ1Y3QgZHZkX3NlbmRfa2V5CQlsc2s7CisJc3RydWN0IGR2ZF9sdV9zZW5kX2NoYWxsZW5nZQlsc2M7CisJc3RydWN0IGR2ZF9zZW5kX2tleQkJaHNrOworCXN0cnVjdCBkdmRfbHVfc2VuZF90aXRsZV9rZXkJbHN0azsKKwlzdHJ1Y3QgZHZkX2x1X3NlbmRfYXNmCQlsc2FzZjsKKwlzdHJ1Y3QgZHZkX2hvc3Rfc2VuZF9ycGNzdGF0ZQlocnBjczsKKwlzdHJ1Y3QgZHZkX2x1X3NlbmRfcnBjc3RhdGUJbHJwY3M7Cit9IGR2ZF9hdXRoaW5mbzsKKworc3RydWN0IHJlcXVlc3Rfc2Vuc2UgeworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggdmFsaWQJCTogMTsKKwlfX3U4IGVycm9yX2NvZGUJCTogNzsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggZXJyb3JfY29kZQkJOiA3OworCV9fdTggdmFsaWQJCTogMTsKKyNlbmRpZgorCV9fdTggc2VnbWVudF9udW1iZXI7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OCByZXNlcnZlZDEJCTogMjsKKwlfX3U4IGlsaQkJOiAxOworCV9fdTggcmVzZXJ2ZWQyCQk6IDE7CisJX191OCBzZW5zZV9rZXkJCTogNDsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggc2Vuc2Vfa2V5CQk6IDQ7CisJX191OCByZXNlcnZlZDIJCTogMTsKKwlfX3U4IGlsaQkJOiAxOworCV9fdTggcmVzZXJ2ZWQxCQk6IDI7CisjZW5kaWYKKwlfX3U4IGluZm9ybWF0aW9uWzRdOworCV9fdTggYWRkX3NlbnNlX2xlbjsKKwlfX3U4IGNvbW1hbmRfaW5mb1s0XTsKKwlfX3U4IGFzYzsKKwlfX3U4IGFzY3E7CisJX191OCBmcnVjOworCV9fdTggc2tzWzNdOworCV9fdTggYXNiWzQ2XTsKK307CisKKy8qCisgKiBmZWF0dXJlIHByb2ZpbGUKKyAqLworI2RlZmluZSBDREZfUldSVAkweDAwMjAJLyogIlJhbmRvbSBXcml0YWJsZSIgKi8KKyNkZWZpbmUgQ0RGX0hXRE0JMHgwMDI0CS8qICJIYXJkd2FyZSBEZWZlY3QgTWFuYWdlbWVudCIgKi8KKyNkZWZpbmUgQ0RGX01SVyAJMHgwMDI4CisKKy8qCisgKiBtZWRpYSBzdGF0dXMgYml0cworICovCisjZGVmaW5lIENETV9NUldfTk9UTVJXCQkJMAorI2RlZmluZSBDRE1fTVJXX0JHRk9STUFUX0lOQUNUSVZFCTEKKyNkZWZpbmUgQ0RNX01SV19CR0ZPUk1BVF9BQ1RJVkUJCTIKKyNkZWZpbmUgQ0RNX01SV19CR0ZPUk1BVF9DT01QTEVURQkzCisKKy8qCisgKiBtcncgYWRkcmVzcyBzcGFjZXMKKyAqLworI2RlZmluZSBNUldfTEJBX0RNQQkJCTAKKyNkZWZpbmUgTVJXX0xCQV9HQUEJCQkxCisKKy8qCisgKiBtcncgbW9kZSBwYWdlcyAoZmlyc3QgaXMgZGVwcmVjYXRlZCkgLS0gcHJvYmVkIGF0IGluaXQgdGltZSBhbmQKKyAqIGNkaS0+bXJ3X21vZGVfcGFnZSBpcyBzZXQKKyAqLworI2RlZmluZSBNUldfTU9ERV9QQ19QUkUxCQkweDJjCisjZGVmaW5lIE1SV19NT0RFX1BDCQkJMHgwMworCitzdHJ1Y3QgbXJ3X2ZlYXR1cmVfZGVzYyB7CisJX19iZTE2IGZlYXR1cmVfY29kZTsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHJlc2VydmVkMQkJOiAyOworCV9fdTggZmVhdHVyZV92ZXJzaW9uCTogNDsKKwlfX3U4IHBlcnNpc3RlbnQJCTogMTsKKwlfX3U4IGN1cnIJCTogMTsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggY3VycgkJOiAxOworCV9fdTggcGVyc2lzdGVudAkJOiAxOworCV9fdTggZmVhdHVyZV92ZXJzaW9uCTogNDsKKwlfX3U4IHJlc2VydmVkMQkJOiAyOworI2VuZGlmCisJX191OCBhZGRfbGVuOworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggcmVzZXJ2ZWQyCQk6IDc7CisJX191OCB3cml0ZQkJOiAxOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OCB3cml0ZQkJOiAxOworCV9fdTggcmVzZXJ2ZWQyCQk6IDc7CisjZW5kaWYKKwlfX3U4IHJlc2VydmVkMzsKKwlfX3U4IHJlc2VydmVkNDsKKwlfX3U4IHJlc2VydmVkNTsKK307CisKKy8qIGNmLiBtbWM0cjAyZy5wZGYgNS4zLjEwIFJhbmRvbSBXcml0YWJsZSBGZWF0dXJlICgwMDIwaCkgcGcgMTk3IG9mIDYzNSAqLworc3RydWN0IHJ3cnRfZmVhdHVyZV9kZXNjIHsKKwlfX2JlMTYgZmVhdHVyZV9jb2RlOworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggcmVzZXJ2ZWQxCQk6IDI7CisJX191OCBmZWF0dXJlX3ZlcnNpb24JOiA0OworCV9fdTggcGVyc2lzdGVudAkJOiAxOworCV9fdTggY3VycgkJOiAxOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OCBjdXJyCQk6IDE7CisJX191OCBwZXJzaXN0ZW50CQk6IDE7CisJX191OCBmZWF0dXJlX3ZlcnNpb24JOiA0OworCV9fdTggcmVzZXJ2ZWQxCQk6IDI7CisjZW5kaWYKKwlfX3U4IGFkZF9sZW47CisJX191MzIgbGFzdF9sYmE7CisJX191MzIgYmxvY2tfc2l6ZTsKKwlfX3UxNiBibG9ja2luZzsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHJlc2VydmVkMgkJOiA3OworCV9fdTggcGFnZV9wcmVzZW50CTogMTsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggcGFnZV9wcmVzZW50CTogMTsKKwlfX3U4IHJlc2VydmVkMgkJOiA3OworI2VuZGlmCisJX191OCByZXNlcnZlZDM7Cit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJX19iZTE2IGRpc2NfaW5mb3JtYXRpb25fbGVuZ3RoOworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggcmVzZXJ2ZWQxCQkJOiAzOworICAgICAgICBfX3U4IGVyYXNhYmxlCQkJOiAxOworICAgICAgICBfX3U4IGJvcmRlcl9zdGF0dXMJCTogMjsKKyAgICAgICAgX191OCBkaXNjX3N0YXR1cwkJOiAyOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisgICAgICAgIF9fdTggZGlzY19zdGF0dXMJCTogMjsKKyAgICAgICAgX191OCBib3JkZXJfc3RhdHVzCQk6IDI7CisgICAgICAgIF9fdTggZXJhc2FibGUJCQk6IDE7CisJX191OCByZXNlcnZlZDEJCQk6IDM7CisjZWxzZQorI2Vycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisJX191OCBuX2ZpcnN0X3RyYWNrOworCV9fdTggbl9zZXNzaW9uc19sc2I7CisJX191OCBmaXJzdF90cmFja19sc2I7CisJX191OCBsYXN0X3RyYWNrX2xzYjsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IGRpZF92CQkJOiAxOworICAgICAgICBfX3U4IGRiY192CQkJOiAxOworICAgICAgICBfX3U4IHVydQkJCTogMTsKKyAgICAgICAgX191OCByZXNlcnZlZDIJCQk6IDI7CisJX191OCBkYml0CQkJOiAxOworCV9fdTggbXJ3X3N0YXR1cwkJCTogMjsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggbXJ3X3N0YXR1cwkJCTogMjsKKwlfX3U4IGRiaXQJCQk6IDE7CisgICAgICAgIF9fdTggcmVzZXJ2ZWQyCQkJOiAyOworICAgICAgICBfX3U4IHVydQkJCTogMTsKKyAgICAgICAgX191OCBkYmNfdgkJCTogMTsKKwlfX3U4IGRpZF92CQkJOiAxOworI2VuZGlmCisJX191OCBkaXNjX3R5cGU7CisJX191OCBuX3Nlc3Npb25zX21zYjsKKwlfX3U4IGZpcnN0X3RyYWNrX21zYjsKKwlfX3U4IGxhc3RfdHJhY2tfbXNiOworCV9fdTMyIGRpc2NfaWQ7CisJX191MzIgbGVhZF9pbjsKKwlfX3UzMiBsZWFkX291dDsKKwlfX3U4IGRpc2NfYmFyX2NvZGVbOF07CisJX191OCByZXNlcnZlZDM7CisJX191OCBuX29wYzsKK30gZGlzY19pbmZvcm1hdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fYmUxNiB0cmFja19pbmZvcm1hdGlvbl9sZW5ndGg7CisJX191OCB0cmFja19sc2I7CisJX191OCBzZXNzaW9uX2xzYjsKKwlfX3U4IHJlc2VydmVkMTsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHJlc2VydmVkMgkJCTogMjsKKyAgICAgICAgX191OCBkYW1hZ2UJCQk6IDE7CisgICAgICAgIF9fdTggY29weQkJCTogMTsKKyAgICAgICAgX191OCB0cmFja19tb2RlCQkJOiA0OworCV9fdTggcnQJCQkJOiAxOworCV9fdTggYmxhbmsJCQk6IDE7CisJX191OCBwYWNrZXQJCQk6IDE7CisJX191OCBmcAkJCQk6IDE7CisJX191OCBkYXRhX21vZGUJCQk6IDQ7CisJX191OCByZXNlcnZlZDMJCQk6IDY7CisJX191OCBscmFfdgkJCTogMTsKKwlfX3U4IG53YV92CQkJOiAxOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisgICAgICAgIF9fdTggdHJhY2tfbW9kZQkJCTogNDsKKyAgICAgICAgX191OCBjb3B5CQkJOiAxOworICAgICAgICBfX3U4IGRhbWFnZQkJCTogMTsKKwlfX3U4IHJlc2VydmVkMgkJCTogMjsKKwlfX3U4IGRhdGFfbW9kZQkJCTogNDsKKwlfX3U4IGZwCQkJCTogMTsKKwlfX3U4IHBhY2tldAkJCTogMTsKKwlfX3U4IGJsYW5rCQkJOiAxOworCV9fdTggcnQJCQkJOiAxOworCV9fdTggbndhX3YJCQk6IDE7CisJX191OCBscmFfdgkJCTogMTsKKwlfX3U4IHJlc2VydmVkMwkJCTogNjsKKyNlbmRpZgorCV9fYmUzMiB0cmFja19zdGFydDsKKwlfX2JlMzIgbmV4dF93cml0YWJsZTsKKwlfX2JlMzIgZnJlZV9ibG9ja3M7CisJX19iZTMyIGZpeGVkX3BhY2tldF9zaXplOworCV9fYmUzMiB0cmFja19zaXplOworCV9fYmUzMiBsYXN0X3JlY19hZGRyZXNzOworfSB0cmFja19pbmZvcm1hdGlvbjsKKworc3RydWN0IGZlYXR1cmVfaGVhZGVyIHsKKwlfX3UzMiBkYXRhX2xlbjsKKwlfX3U4IHJlc2VydmVkMTsKKwlfX3U4IHJlc2VydmVkMjsKKwlfX3UxNiBjdXJyX3Byb2ZpbGU7Cit9OworCitzdHJ1Y3QgbW9kZV9wYWdlX2hlYWRlciB7CisJX19iZTE2IG1vZGVfZGF0YV9sZW5ndGg7CisJX191OCBtZWRpdW1fdHlwZTsKKwlfX3U4IHJlc2VydmVkMTsKKwlfX3U4IHJlc2VydmVkMjsKKwlfX3U4IHJlc2VydmVkMzsKKwlfX2JlMTYgZGVzY19sZW5ndGg7Cit9OworCisKKyNlbmRpZiAgLyogX0xJTlVYX0NEUk9NX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2dyb3Vwc3RhdHMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2dyb3Vwc3RhdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzUzYzMzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jZ3JvdXBzdGF0cy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qIGNncm91cHN0YXRzLmggLSBleHBvcnRpbmcgcGVyLWNncm91cCBzdGF0aXN0aWNzCisgKgorICogQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiwgMjAwNworICogQXV0aG9yIEJhbGJpciBTaW5naCA8YmFsYmlyQGxpbnV4LnZuZXQuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMi4xIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBfTElOVVhfQ0dST1VQU1RBVFNfSAorI2RlZmluZSBfTElOVVhfQ0dST1VQU1RBVFNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90YXNrc3RhdHMuaD4KKworLyoKKyAqIERhdGEgc2hhcmVkIGJldHdlZW4gdXNlciBzcGFjZSBhbmQga2VybmVsIHNwYWNlIG9uIGEgcGVyIGNncm91cAorICogYmFzaXMuIFRoaXMgZGF0YSBpcyBzaGFyZWQgdXNpbmcgdGFza3N0YXRzLgorICoKKyAqIE1vc3Qgb2YgdGhlc2Ugc3RhdGVzIGFyZSBkZXJpdmVkIGJ5IGxvb2tpbmcgYXQgdGhlIHRhc2stPnN0YXRlIHZhbHVlCisgKiBGb3IgdGhlIG5yX2lvX3dhaXQgc3RhdGUsIGEgZmxhZyBpbiB0aGUgZGVsYXkgYWNjb3VudGluZyBzdHJ1Y3R1cmUKKyAqIGluZGljYXRlcyB0aGF0IHRoZSB0YXNrIGlzIHdhaXRpbmcgb24gSU8KKyAqCisgKiBFYWNoIG1lbWJlciBpcyBhbGlnbmVkIHRvIGEgOCBieXRlIGJvdW5kYXJ5LgorICovCitzdHJ1Y3QgY2dyb3Vwc3RhdHMgeworCV9fdTY0CW5yX3NsZWVwaW5nOwkJLyogTnVtYmVyIG9mIHRhc2tzIHNsZWVwaW5nICovCisJX191NjQJbnJfcnVubmluZzsJCS8qIE51bWJlciBvZiB0YXNrcyBydW5uaW5nICovCisJX191NjQJbnJfc3RvcHBlZDsJCS8qIE51bWJlciBvZiB0YXNrcyBpbiBzdG9wcGVkIHN0YXRlICovCisJX191NjQJbnJfdW5pbnRlcnJ1cHRpYmxlOwkvKiBOdW1iZXIgb2YgdGFza3MgaW4gdW5pbnRlcnJ1cHRpYmxlICovCisJCQkJCS8qIHN0YXRlICovCisJX191NjQJbnJfaW9fd2FpdDsJCS8qIE51bWJlciBvZiB0YXNrcyB3YWl0aW5nIG9uIElPICovCit9OworCisvKgorICogQ29tbWFuZHMgc2VudCBmcm9tIHVzZXJzcGFjZQorICogTm90IHZlcnNpb25lZC4gTmV3IGNvbW1hbmRzIHNob3VsZCBvbmx5IGJlIGluc2VydGVkIGF0IHRoZSBlbnVtJ3MgZW5kCisgKiBwcmlvciB0byBfX0NHUk9VUFNUQVRTX0NNRF9NQVgKKyAqLworCitlbnVtIHsKKwlDR1JPVVBTVEFUU19DTURfVU5TUEVDID0gX19UQVNLU1RBVFNfQ01EX01BWCwJLyogUmVzZXJ2ZWQgKi8KKwlDR1JPVVBTVEFUU19DTURfR0VULAkJLyogdXNlci0+a2VybmVsIHJlcXVlc3QvZ2V0LXJlc3BvbnNlICovCisJQ0dST1VQU1RBVFNfQ01EX05FVywJCS8qIGtlcm5lbC0+dXNlciBldmVudCAqLworCV9fQ0dST1VQU1RBVFNfQ01EX01BWCwKK307CisKKyNkZWZpbmUgQ0dST1VQU1RBVFNfQ01EX01BWCAoX19DR1JPVVBTVEFUU19DTURfTUFYIC0gMSkKKworZW51bSB7CisJQ0dST1VQU1RBVFNfVFlQRV9VTlNQRUMgPSAwLAkvKiBSZXNlcnZlZCAqLworCUNHUk9VUFNUQVRTX1RZUEVfQ0dST1VQX1NUQVRTLAkvKiBjb250YWlucyBuYW1lICsgc3RhdHMgKi8KKwlfX0NHUk9VUFNUQVRTX1RZUEVfTUFYLAorfTsKKworI2RlZmluZSBDR1JPVVBTVEFUU19UWVBFX01BWCAoX19DR1JPVVBTVEFUU19UWVBFX01BWCAtIDEpCisKK2VudW0geworCUNHUk9VUFNUQVRTX0NNRF9BVFRSX1VOU1BFQyA9IDAsCisJQ0dST1VQU1RBVFNfQ01EX0FUVFJfRkQsCisJX19DR1JPVVBTVEFUU19DTURfQVRUUl9NQVgsCit9OworCisjZGVmaW5lIENHUk9VUFNUQVRTX0NNRF9BVFRSX01BWCAoX19DR1JPVVBTVEFUU19DTURfQVRUUl9NQVggLSAxKQorCisjZW5kaWYgLyogX0xJTlVYX0NHUk9VUFNUQVRTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2hpby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jaGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3Y2Q5OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2hpby5oCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogaW9jdGwgaW50ZXJmYWNlIGZvciB0aGUgc2NzaSBtZWRpYSBjaGFuZ2VyIGRyaXZlcgorICovCisKKy8qIGNoYW5nZXIgZWxlbWVudCB0eXBlcyAqLworI2RlZmluZSBDSEVUX01UICAgMAkvKiBtZWRpYSB0cmFuc3BvcnQgZWxlbWVudCAocm9ib3QpICovCisjZGVmaW5lIENIRVRfU1QgICAxCS8qIHN0b3JhZ2UgZWxlbWVudCAobWVkaWEgc2xvdHMpICovCisjZGVmaW5lIENIRVRfSUUgICAyCS8qIGltcG9ydC9leHBvcnQgZWxlbWVudCAqLworI2RlZmluZSBDSEVUX0RUICAgMwkvKiBkYXRhIHRyYW5zZmVyIGVsZW1lbnQgKHRhcGUvY2Ryb20vd2hhdGV2ZXIpICovCisjZGVmaW5lIENIRVRfVjEgICA0CS8qIHZlbmRvciBzcGVjaWZpYyAjMSAqLworI2RlZmluZSBDSEVUX1YyICAgNQkvKiB2ZW5kb3Igc3BlY2lmaWMgIzIgKi8KKyNkZWZpbmUgQ0hFVF9WMyAgIDYJLyogdmVuZG9yIHNwZWNpZmljICMzICovCisjZGVmaW5lIENIRVRfVjQgICA3CS8qIHZlbmRvciBzcGVjaWZpYyAjNCAqLworCisKKy8qCisgKiBDSElPR1BBUkFNUworICogICAgcXVlcnkgY2hhbmdlciBwcm9wZXJ0aWVzCisgKgorICogQ0hJT1ZHUEFSQU1TCisgKiAgICBxdWVyeSB2ZW5kb3Itc3BlY2lmaWMgZWxlbWVudCB0eXBlcworICoKKyAqICAgIGFjY2Vzc2luZyBlbGVtZW50cyB3b3JrcyBieSBzcGVjaWZpbmcgdHlwZSBhbmQgdW5pdCBvZiB0aGUgZWxlbWVudC4KKyAqICAgIGZvciBleGFtcGxlLCBzdG9yYWdlIGVsZW1lbnRzIGFyZSBhZGRyZXNzZWQgd2l0aCB0eXBlID0gQ0hFVF9TVCBhbmQKKyAqICAgIHVuaXQgPSAwIC4uIGNwX25zbG90cy0xCisgKgorICovCitzdHJ1Y3QgY2hhbmdlcl9wYXJhbXMgeworCWludCBjcF9jdXJwaWNrZXI7ICAvKiBjdXJyZW50IHRyYW5zcG9ydCBlbGVtZW50ICovCisJaW50IGNwX25waWNrZXJzOyAgIC8qIG51bWJlciBvZiB0cmFuc3BvcnQgZWxlbWVudHMgICAgICAoQ0hFVF9NVCkgKi8KKwlpbnQgY3BfbnNsb3RzOyAgICAgLyogbnVtYmVyIG9mIHN0b3JhZ2UgZWxlbWVudHMgICAgICAgIChDSEVUX1NUKSAqLworCWludCBjcF9ucG9ydGFsczsgICAvKiBudW1iZXIgb2YgaW1wb3J0L2V4cG9ydCBlbGVtZW50cyAgKENIRVRfSUUpICovCisJaW50IGNwX25kcml2ZXM7ICAgIC8qIG51bWJlciBvZiBkYXRhIHRyYW5zZmVyIGVsZW1lbnRzICAoQ0hFVF9EVCkgKi8KK307CitzdHJ1Y3QgY2hhbmdlcl92ZW5kb3JfcGFyYW1zIHsKKwlpbnQgIGN2cF9uMTsgICAgICAgLyogbnVtYmVyIG9mIHZlbmRvciBzcGVjaWZpYyBlbGVtcyAgIChDSEVUX1YxKSAqLworCWNoYXIgY3ZwX2xhYmVsMVsxNl07CisJaW50ICBjdnBfbjI7ICAgICAgIC8qIG51bWJlciBvZiB2ZW5kb3Igc3BlY2lmaWMgZWxlbXMgICAoQ0hFVF9WMikgKi8KKwljaGFyIGN2cF9sYWJlbDJbMTZdOworCWludCAgY3ZwX24zOyAgICAgICAvKiBudW1iZXIgb2YgdmVuZG9yIHNwZWNpZmljIGVsZW1zICAgKENIRVRfVjMpICovCisJY2hhciBjdnBfbGFiZWwzWzE2XTsKKwlpbnQgIGN2cF9uNDsgICAgICAgLyogbnVtYmVyIG9mIHZlbmRvciBzcGVjaWZpYyBlbGVtcyAgIChDSEVUX1Y0KSAqLworCWNoYXIgY3ZwX2xhYmVsNFsxNl07CisJaW50ICByZXNlcnZlZFs4XTsKK307CisKKworLyoKKyAqIENISU9NT1ZFCisgKiAgICBtb3ZlIGEgbWVkaXVtIGZyb20gb25lIGVsZW1lbnQgdG8gYW5vdGhlcgorICovCitzdHJ1Y3QgY2hhbmdlcl9tb3ZlIHsKKwlpbnQgY21fZnJvbXR5cGU7CS8qIHR5cGUvdW5pdCBvZiBzb3VyY2UgZWxlbWVudCAqLworCWludCBjbV9mcm9tdW5pdDsJCisJaW50IGNtX3RvdHlwZTsJLyogdHlwZS91bml0IG9mIGRlc3RpbmF0aW9uIGVsZW1lbnQgKi8KKwlpbnQgY21fdG91bml0OworCWludCBjbV9mbGFnczsKK307CisjZGVmaW5lIENNX0lOVkVSVCAgIDEgICAvKiBmbGFnOiByb3RhdGUgbWVkaWEgKGZvciBkb3VibGUtc2lkZWQgbGlrZSBNT0QpICovCisKKworLyoKKyAqIENISU9FWENIQU5HRQorICogICAgbW92ZSBvbmUgbWVkaXVtIGZyb20gZWxlbWVudCAjMSB0byBlbGVtZW50ICMyLAorICogICAgYW5kIGFub3RoZXIgb25lIGZyb20gZWxlbWVudCAjMiB0byBlbGVtZW50ICMzLgorICogICAgZWxlbWVudCAjMSBhbmQgIzMgYXJlIGFsbG93ZWQgdG8gYmUgaWRlbnRpY2FsLgorICovCitzdHJ1Y3QgY2hhbmdlcl9leGNoYW5nZSB7CisJaW50IGNlX3NyY3R5cGU7CSAgICAvKiB0eXBlL3VuaXQgb2YgZWxlbWVudCAjMSAqLworCWludCBjZV9zcmN1bml0OworCWludCBjZV9mZHN0dHlwZTsgICAgLyogdHlwZS91bml0IG9mIGVsZW1lbnQgIzIgKi8KKwlpbnQgY2VfZmRzdHVuaXQ7CisJaW50IGNlX3Nkc3R0eXBlOyAgICAvKiB0eXBlL3VuaXQgb2YgZWxlbWVudCAjMyAqLworCWludCBjZV9zZHN0dW5pdDsKKwlpbnQgY2VfZmxhZ3M7Cit9OworI2RlZmluZSBDRV9JTlZFUlQxICAgMQorI2RlZmluZSBDRV9JTlZFUlQyICAgMgorCisKKy8qCisgKiBDSElPUE9TSVRJT04KKyAqICAgIG1vdmUgdGhlIHRyYW5zcG9ydCBlbGVtZW50IChyb2JvdCBhcm0pIHRvIGEgc3BlY2lmaWMgZWxlbWVudC4KKyAqLworc3RydWN0IGNoYW5nZXJfcG9zaXRpb24geworCWludCBjcF90eXBlOworCWludCBjcF91bml0OworCWludCBjcF9mbGFnczsKK307CisjZGVmaW5lIENQX0lOVkVSVCAgIDEKKworCisvKgorICogQ0hJT0dTVEFUVVMKKyAqICAgIGdldCBlbGVtZW50IHN0YXR1cyBmb3IgYWxsIGVsZW1lbnRzIG9mIGEgc3BlY2lmaWMgdHlwZQorICovCitzdHJ1Y3QgY2hhbmdlcl9lbGVtZW50X3N0YXR1cyB7CisJaW50ICAgICAgICAgICAgIGNlc190eXBlOworCXVuc2lnbmVkIGNoYXIgICAqY2VzX2RhdGE7Cit9OworI2RlZmluZSBDRVNUQVRVU19GVUxMICAgICAweDAxIC8qIGZ1bGwgKi8KKyNkZWZpbmUgQ0VTVEFUVVNfSU1QRVhQICAgMHgwMgkvKiBtZWRpYSB3YXMgaW1wb3J0ZWQgKGluc2VydGVkIGJ5IHN5c29wKSAqLworI2RlZmluZSBDRVNUQVRVU19FWENFUFQgICAweDA0CS8qIGVycm9yIGNvbmRpdGlvbiAqLworI2RlZmluZSBDRVNUQVRVU19BQ0NFU1MgICAweDA4CS8qIGFjY2VzcyBhbGxvd2VkICovCisjZGVmaW5lIENFU1RBVFVTX0VYRU5BQiAgIDB4MTAJLyogZWxlbWVudCBjYW4gZXhwb3J0IG1lZGlhICovCisjZGVmaW5lIENFU1RBVFVTX0lORU5BQiAgIDB4MjAJLyogZWxlbWVudCBjYW4gaW1wb3J0IG1lZGlhICovCisKKworLyoKKyAqIENISU9HRUxFTQorICogICAgZ2V0IG1vcmUgZGV0YWlsZWQgc3RhdHVzIGluZm9ybWF0aW9uIGZvciBhIHNpbmdsZSBlbGVtZW50CisgKi8KK3N0cnVjdCBjaGFuZ2VyX2dldF9lbGVtZW50IHsKKwlpbnQJY2dlX3R5cGU7CSAvKiB0eXBlL3VuaXQgKi8KKwlpbnQJY2dlX3VuaXQ7CisJaW50CWNnZV9zdGF0dXM7ICAgICAgLyogc3RhdHVzICovCisJaW50ICAgICBjZ2VfZXJybm87ICAgICAgIC8qIGVycm5vICovCisJaW50ICAgICBjZ2Vfc3JjdHlwZTsgICAgIC8qIHNvdXJjZSBlbGVtZW50IG9mIHRoZSBsYXN0IG1vdmUvZXhjaGFuZ2UgKi8KKwlpbnQgICAgIGNnZV9zcmN1bml0OworCWludCAgICAgY2dlX2lkOyAgICAgICAgICAvKiBzY3NpIGlkICAoZm9yIGRhdGEgdHJhbnNmZXIgZWxlbWVudHMpICovCisJaW50ICAgICBjZ2VfbHVuOyAgICAgICAgIC8qIHNjc2kgbHVuIChmb3IgZGF0YSB0cmFuc2ZlciBlbGVtZW50cykgKi8KKwljaGFyICAgIGNnZV9wdm9sdGFnWzM2XTsgLyogcHJpbWFyeSB2b2x1bWUgdGFnICovCisJY2hhciAgICBjZ2VfYXZvbHRhZ1szNl07IC8qIGFsdGVybmF0ZSB2b2x1bWUgdGFnICovCisJaW50ICAgICBjZ2VfZmxhZ3M7Cit9OworLyogZmxhZ3MgKi8KKyNkZWZpbmUgQ0dFX0VSUk5PICAgICAweDAxICAgICAgIC8qIGVycm5vIGF2YWlsYWJsZSAgICAgICAqLworI2RlZmluZSBDR0VfSU5WRVJUICAgIDB4MDIgICAgICAgLyogbWVkaWEgaW52ZXJ0ZWQgICAgICAgICovCisjZGVmaW5lIENHRV9TUkMgICAgICAgMHgwNCAgICAgICAvKiBtZWRpYSBzcmMgYXZhaWxhYmxlICAgKi8KKyNkZWZpbmUgQ0dFX0lETFVOICAgICAweDA4ICAgICAgIC8qIElEK0xVTiBhdmFpbGFibGUgICAgICAqLworI2RlZmluZSBDR0VfUFZPTFRBRyAgIDB4MTAgICAgICAgLyogcHJpbWFyeSB2b2x1bWUgdGFnIGF2YWlsYWJsZSAqLworI2RlZmluZSBDR0VfQVZPTFRBRyAgIDB4MjAgICAgICAgLyogYWx0ZXJuYXRlIHZvbHVtZSB0YWcgYXZhaWxhYmxlICovCisKKworLyoKKyAqIENISU9TVk9MVEFHCisgKiAgICBzZXQgdm9sdW1lIHRhZworICovCitzdHJ1Y3QgY2hhbmdlcl9zZXRfdm9sdGFnIHsKKwlpbnQJY3N2X3R5cGU7CSAvKiB0eXBlL3VuaXQgKi8KKwlpbnQJY3N2X3VuaXQ7CisJY2hhciAgICBjc3Zfdm9sdGFnWzM2XTsgIC8qIHZvbHVtZSB0YWcgKi8KKwlpbnQgICAgIGNzdl9mbGFnczsKK307CisjZGVmaW5lIENTVl9QVk9MVEFHICAgMHgwMSAgICAgICAvKiBwcmltYXJ5IHZvbHVtZSB0YWcgKi8KKyNkZWZpbmUgQ1NWX0FWT0xUQUcgICAweDAyICAgICAgIC8qIGFsdGVybmF0ZSB2b2x1bWUgdGFnICovCisjZGVmaW5lIENTVl9DTEVBUlRBRyAgMHgwNCAgICAgICAvKiBjbGVhciB2b2x1bWUgdGFnICovCisKKy8qIGlvY3RscyAqLworI2RlZmluZSBDSElPTU9WRSAgICAgICBfSU9XKCdjJywgMSxzdHJ1Y3QgY2hhbmdlcl9tb3ZlKQorI2RlZmluZSBDSElPRVhDSEFOR0UgICBfSU9XKCdjJywgMixzdHJ1Y3QgY2hhbmdlcl9leGNoYW5nZSkKKyNkZWZpbmUgQ0hJT1BPU0lUSU9OICAgX0lPVygnYycsIDMsc3RydWN0IGNoYW5nZXJfcG9zaXRpb24pCisjZGVmaW5lIENISU9HUElDS0VSICAgIF9JT1IoJ2MnLCA0LGludCkgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgaW1wbC4gKi8KKyNkZWZpbmUgQ0hJT1NQSUNLRVIgICAgX0lPVygnYycsIDUsaW50KSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBpbXBsLiAqLworI2RlZmluZSBDSElPR1BBUkFNUyAgICBfSU9SKCdjJywgNixzdHJ1Y3QgY2hhbmdlcl9wYXJhbXMpCisjZGVmaW5lIENISU9HU1RBVFVTICAgIF9JT1coJ2MnLCA4LHN0cnVjdCBjaGFuZ2VyX2VsZW1lbnRfc3RhdHVzKQorI2RlZmluZSBDSElPR0VMRU0gICAgICBfSU9XKCdjJywxNixzdHJ1Y3QgY2hhbmdlcl9nZXRfZWxlbWVudCkKKyNkZWZpbmUgQ0hJT0lOSVRFTEVNICAgX0lPKCdjJywxNykKKyNkZWZpbmUgQ0hJT1NWT0xUQUcgICAgX0lPVygnYycsMTgsc3RydWN0IGNoYW5nZXJfc2V0X3ZvbHRhZykKKyNkZWZpbmUgQ0hJT0dWUEFSQU1TICAgX0lPUignYycsMTksc3RydWN0IGNoYW5nZXJfdmVuZG9yX3BhcmFtcykKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jbTQwMDBfY3MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY200MDAwX2NzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzMGYwNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY200MDAwX2NzLmgKQEAgLTAsMCArMSw2MiBAQAorI2lmbmRlZglfQ000MDAwX0hfCisjZGVmaW5lCV9DTTQwMDBfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUJTUFYX0FUUgkJCTMzCisKKyNkZWZpbmUJQ000MDAwX01BWF9ERVYJCTQKKworLyogdGhvc2UgdHdvIHN0cnVjdHVyZXMgYXJlIHBhc3NlZCB2aWEgaW9jdGwoKSBmcm9tL3RvIHVzZXJzcGFjZS4gIFRoZXkgYXJlCisgKiB1c2VkIGJ5IGV4aXN0aW5nIHVzZXJzcGFjZSBwcm9ncmFtcywgc28gSSBrZXB0aCB0aGUgYXdrd2FyZCAiYklGU0QiIG5hbWluZworICogbm90IHRvIGJyZWFrIGNvbXBpbGF0aW9uIG9mIHVzZXJzcGFjZSBhcHBzLiAtSFcgKi8KKwordHlwZWRlZiBzdHJ1Y3QgYXRyZXEgeworCV9fczMyIGF0cl9sZW47CisJdW5zaWduZWQgY2hhciBhdHJbNjRdOworCV9fczMyIHBvd2VyX2FjdDsKKwl1bnNpZ25lZCBjaGFyIGJJRlNEOworCXVuc2lnbmVkIGNoYXIgYklGU0M7Cit9IGF0cmVxX3Q7CisKKworLyogd2hhdCBpcyBwYXJ0aWN1bGFybHkgc3R1cGlkIGluIHRoZSBvcmlnaW5hbCBkcml2ZXIgaXMgdGhlIGFyY2gtZGVwZW5kZW50CisgKiBtZW1iZXIgc2l6ZXMuIFRoaXMgbGVhZHMgdG8gQ09ORklHX0NPTVBBVCBicmVha2FnZSwgc2luY2UgMzJiaXQgdXNlcnNwYWNlCisgKiB3aWxsIGxheSBvdXQgdGhlIHN0cnVjdHVyZSBtZW1iZXJzIGRpZmZlcmVudGx5IHRoYW4gdGhlIDY0Yml0IGtlcm5lbC4KKyAqCisgKiBJJ3ZlIGNoYW5nZWQgInB0c3JlcS5wcm90b2NvbCIgZnJvbSAidW5zaWduZWQgbG9uZyIgdG8gIl9fdTMyIi4KKyAqIE9uIDMyYml0IHRoaXMgd2lsbCBtYWtlIG5vIGRpZmZlcmVuY2UuICBXaXRoIDY0Yml0IGtlcm5lbHMsIGl0IHdpbGwgbWFrZQorICogMzJiaXQgYXBwcyB3b3JrLCB0b28uCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgcHRzcmVxIHsKKwlfX3UzMiBwcm90b2NvbDsgLypUPTA6IDJeMCwgVD0xOiAgMl4xKi8KKyAJdW5zaWduZWQgY2hhciBmbGFnczsKKyAJdW5zaWduZWQgY2hhciBwdHMxOworIAl1bnNpZ25lZCBjaGFyIHB0czI7CisJdW5zaWduZWQgY2hhciBwdHMzOworfSBwdHNyZXFfdDsKKworI2RlZmluZQlDTV9JT0NfTUFHSUMJCSdjJworI2RlZmluZQlDTV9JT0NfTUFYTlIJICAgICAgICAyNTUKKworI2RlZmluZQlDTV9JT0NHU1RBVFVTCQlfSU9SIChDTV9JT0NfTUFHSUMsIDAsIHVuc2lnbmVkIGNoYXIgKikKKyNkZWZpbmUJQ01fSU9DR0FUUgkJX0lPV1IoQ01fSU9DX01BR0lDLCAxLCBhdHJlcV90ICopCisjZGVmaW5lCUNNX0lPQ1NQVFMJCV9JT1cgKENNX0lPQ19NQUdJQywgMiwgcHRzcmVxX3QgKikKKyNkZWZpbmUJQ01fSU9DU1JEUgkJX0lPICAoQ01fSU9DX01BR0lDLCAzKQorI2RlZmluZSBDTV9JT0NBUkRPRkYgICAgICAgICAgICBfSU8gIChDTV9JT0NfTUFHSUMsIDQpCisKKyNkZWZpbmUgQ01fSU9TREJHTFZMICAgICAgICAgICAgX0lPVyhDTV9JT0NfTUFHSUMsIDI1MCwgaW50KikKKworLyogY2FyZCBhbmQgZGV2aWNlIHN0YXRlcyAqLworI2RlZmluZQlDTV9DQVJEX0lOU0VSVEVECQkweDAxCisjZGVmaW5lCUNNX0NBUkRfUE9XRVJFRAkJCTB4MDIKKyNkZWZpbmUJQ01fQVRSX1BSRVNFTlQJCQkweDA0CisjZGVmaW5lCUNNX0FUUl9WQUxJRAkgCQkweDA4CisjZGVmaW5lCUNNX1NUQVRFX1ZBTElECQkJMHgwZgorLyogZXh0cmEgaW5mbyBvbmx5IGZyb20gQ000MDAwICovCisjZGVmaW5lCUNNX05PX1JFQURFUgkJCTB4MTAKKyNkZWZpbmUJQ01fQkFEX0NBUkQJCQkweDIwCisKKworI2VuZGlmCS8qIF9DTTQwMDBfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY25fcHJvYy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jbl9wcm9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMyM2NiOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY25fcHJvYy5oCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogY25fcHJvYy5oIC0gcHJvY2VzcyBldmVudHMgY29ubmVjdG9yCisgKgorICogQ29weXJpZ2h0IChDKSBNYXR0IEhlbHNsZXksIElCTSBDb3JwLiAyMDA1CisgKiBCYXNlZCBvbiBjbl9mb3JrLmggYnkgTmd1eWVuIEFuaCBRdXluaCBhbmQgR3VpbGxhdW1lIFRob3V2ZW5pbgorICogQ29weXJpZ2h0IChDKSAyMDA1IE5ndXllbiBBbmggUXV5bmggPGFxdXluaEBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgR3VpbGxhdW1lIFRob3V2ZW5pbiA8Z3VpbGxhdW1lLnRob3V2ZW5pbkBidWxsLm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMi4xIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBDTl9QUk9DX0gKKyNkZWZpbmUgQ05fUFJPQ19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogVXNlcnNwYWNlIHNlbmRzIHRoaXMgZW51bSB0byByZWdpc3RlciB3aXRoIHRoZSBrZXJuZWwgdGhhdCBpdCBpcyBsaXN0ZW5pbmcKKyAqIGZvciBldmVudHMgb24gdGhlIGNvbm5lY3Rvci4KKyAqLworZW51bSBwcm9jX2NuX21jYXN0X29wIHsKKwlQUk9DX0NOX01DQVNUX0xJU1RFTiA9IDEsCisJUFJPQ19DTl9NQ0FTVF9JR05PUkUgPSAyCit9OworCisvKgorICogRnJvbSB0aGUgdXNlcidzIHBvaW50IG9mIHZpZXcsIHRoZSBwcm9jZXNzCisgKiBJRCBpcyB0aGUgdGhyZWFkIGdyb3VwIElEIGFuZCB0aHJlYWQgSUQgaXMgdGhlIGludGVybmFsCisgKiBrZXJuZWwgInBpZCIuIFNvLCBmaWVsZHMgYXJlIGFzc2lnbmVkIGFzIGZvbGxvdzoKKyAqCisgKiAgSW4gdXNlciBzcGFjZSAgICAgLSAgSW4gIGtlcm5lbCBzcGFjZQorICoKKyAqIHBhcmVudCBwcm9jZXNzIElEICA9ICBwYXJlbnQtPnRnaWQKKyAqIHBhcmVudCB0aHJlYWQgIElEICA9ICBwYXJlbnQtPnBpZAorICogY2hpbGQgIHByb2Nlc3MgSUQgID0gIGNoaWxkLT50Z2lkCisgKiBjaGlsZCAgdGhyZWFkICBJRCAgPSAgY2hpbGQtPnBpZAorICovCisKK3N0cnVjdCBwcm9jX2V2ZW50IHsKKwllbnVtIHdoYXQgeworCQkvKiBVc2Ugc3VjY2Vzc2l2ZSBiaXRzIHNvIHRoZSBlbnVtcyBjYW4gYmUgdXNlZCB0byByZWNvcmQKKwkJICogc2V0cyBvZiBldmVudHMgYXMgd2VsbAorCQkgKi8KKwkJUFJPQ19FVkVOVF9OT05FID0gMHgwMDAwMDAwMCwKKwkJUFJPQ19FVkVOVF9GT1JLID0gMHgwMDAwMDAwMSwKKwkJUFJPQ19FVkVOVF9FWEVDID0gMHgwMDAwMDAwMiwKKwkJUFJPQ19FVkVOVF9VSUQgID0gMHgwMDAwMDAwNCwKKwkJUFJPQ19FVkVOVF9HSUQgID0gMHgwMDAwMDA0MCwKKwkJUFJPQ19FVkVOVF9TSUQgID0gMHgwMDAwMDA4MCwKKwkJUFJPQ19FVkVOVF9QVFJBQ0UgPSAweDAwMDAwMTAwLAorCQlQUk9DX0VWRU5UX0NPTU0gPSAweDAwMDAwMjAwLAorCQkvKiAibmV4dCIgc2hvdWxkIGJlIDB4MDAwMDA0MDAgKi8KKwkJLyogImxhc3QiIGlzIHRoZSBsYXN0IHByb2Nlc3MgZXZlbnQ6IGV4aXQgKi8KKwkJUFJPQ19FVkVOVF9FWElUID0gMHg4MDAwMDAwMAorCX0gd2hhdDsKKwlfX3UzMiBjcHU7CisJX191NjQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpIHRpbWVzdGFtcF9uczsKKwkJLyogTnVtYmVyIG9mIG5hbm8gc2Vjb25kcyBzaW5jZSBzeXN0ZW0gYm9vdCAqLworCXVuaW9uIHsgLyogbXVzdCBiZSBsYXN0IGZpZWxkIG9mIHByb2NfZXZlbnQgc3RydWN0ICovCisJCXN0cnVjdCB7CisJCQlfX3UzMiBlcnI7CisJCX0gYWNrOworCisJCXN0cnVjdCBmb3JrX3Byb2NfZXZlbnQgeworCQkJX19rZXJuZWxfcGlkX3QgcGFyZW50X3BpZDsKKwkJCV9fa2VybmVsX3BpZF90IHBhcmVudF90Z2lkOworCQkJX19rZXJuZWxfcGlkX3QgY2hpbGRfcGlkOworCQkJX19rZXJuZWxfcGlkX3QgY2hpbGRfdGdpZDsKKwkJfSBmb3JrOworCisJCXN0cnVjdCBleGVjX3Byb2NfZXZlbnQgeworCQkJX19rZXJuZWxfcGlkX3QgcHJvY2Vzc19waWQ7CisJCQlfX2tlcm5lbF9waWRfdCBwcm9jZXNzX3RnaWQ7CisJCX0gZXhlYzsKKworCQlzdHJ1Y3QgaWRfcHJvY19ldmVudCB7CisJCQlfX2tlcm5lbF9waWRfdCBwcm9jZXNzX3BpZDsKKwkJCV9fa2VybmVsX3BpZF90IHByb2Nlc3NfdGdpZDsKKwkJCXVuaW9uIHsKKwkJCQlfX3UzMiBydWlkOyAvKiB0YXNrIHVpZCAqLworCQkJCV9fdTMyIHJnaWQ7IC8qIHRhc2sgZ2lkICovCisJCQl9IHI7CisJCQl1bmlvbiB7CisJCQkJX191MzIgZXVpZDsKKwkJCQlfX3UzMiBlZ2lkOworCQkJfSBlOworCQl9IGlkOworCisJCXN0cnVjdCBzaWRfcHJvY19ldmVudCB7CisJCQlfX2tlcm5lbF9waWRfdCBwcm9jZXNzX3BpZDsKKwkJCV9fa2VybmVsX3BpZF90IHByb2Nlc3NfdGdpZDsKKwkJfSBzaWQ7CisKKwkJc3RydWN0IHB0cmFjZV9wcm9jX2V2ZW50IHsKKwkJCV9fa2VybmVsX3BpZF90IHByb2Nlc3NfcGlkOworCQkJX19rZXJuZWxfcGlkX3QgcHJvY2Vzc190Z2lkOworCQkJX19rZXJuZWxfcGlkX3QgdHJhY2VyX3BpZDsKKwkJCV9fa2VybmVsX3BpZF90IHRyYWNlcl90Z2lkOworCQl9IHB0cmFjZTsKKworCQlzdHJ1Y3QgY29tbV9wcm9jX2V2ZW50IHsKKwkJCV9fa2VybmVsX3BpZF90IHByb2Nlc3NfcGlkOworCQkJX19rZXJuZWxfcGlkX3QgcHJvY2Vzc190Z2lkOworCQkJY2hhciAgICAgICAgICAgY29tbVsxNl07CisJCX0gY29tbTsKKworCQlzdHJ1Y3QgZXhpdF9wcm9jX2V2ZW50IHsKKwkJCV9fa2VybmVsX3BpZF90IHByb2Nlc3NfcGlkOworCQkJX19rZXJuZWxfcGlkX3QgcHJvY2Vzc190Z2lkOworCQkJX191MzIgZXhpdF9jb2RlLCBleGl0X3NpZ25hbDsKKwkJfSBleGl0OworCX0gZXZlbnRfZGF0YTsKK307CisKKyNlbmRpZgkvKiBDTl9QUk9DX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY29kYS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb2RhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwYzdlYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY29kYS5oCkBAIC0wLDAgKzEsNzM3IEBACisvKiAKKyAgIFlvdSBtYXkgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIG9mIHRoZSB0d28gbGljZW5zZXMgdGhhdAorICAgZm9sbG93IGF0IHlvdXIgZGlzY3JldGlvbi4KKyovCisKKy8qIEJMVVJCIGxncGwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kYSBGaWxlIFN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZSA1CisKKyAgICAgICAgICBDb3B5cmlnaHQgKGMpIDE5ODctMTk5OSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQorICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbCBjb3B5cmlnaHRzIGxpc3RlZCBiZWxvdworCitUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kIHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2VuY2UgVmVyc2lvbiAyLCBhcworc2hvd24gaW4gdGhlIGZpbGUgTElDRU5TRSwgb3IgdW5kZXIgdGhlIGxpY2Vuc2Ugc2hvd24gYmVsb3cuIFRoZQordGVjaG5pY2FsIGFuZCBmaW5hbmNpYWwgY29udHJpYnV0b3JzIHRvIENvZGEgYXJlIGxpc3RlZCBpbiB0aGUgZmlsZQorQ1JFRElUUy4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbCBjb3B5cmlnaHRzIAorKi8KKworLyoKKworICAgICAgICAgICAgQ29kYTogYW4gRXhwZXJpbWVudGFsIERpc3RyaWJ1dGVkIEZpbGUgU3lzdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbGVhc2UgNC4wCisKKyAgICAgICAgICBDb3B5cmlnaHQgKGMpIDE5ODctMTk5OSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQorICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworUGVybWlzc2lvbiAgdG8gIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgIHByb3ZpZGVkICB0aGF0ICBib3RoICB0aGUgIGNvcHlyaWdodAorbm90aWNlICBhbmQgIHRoaXMgIHBlcm1pc3Npb24gIG5vdGljZSAgYXBwZWFyICBpbiAgYWxsICBjb3BpZXMgIG9mIHRoZQorc29mdHdhcmUsIGRlcml2YXRpdmUgd29ya3Mgb3IgIG1vZGlmaWVkICB2ZXJzaW9ucywgIGFuZCAgYW55ICBwb3J0aW9ucwordGhlcmVvZiwgYW5kIHRoYXQgYm90aCBub3RpY2VzIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZAordGhhdCBjcmVkaXQgaXMgZ2l2ZW4gdG8gQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgIGluICBhbGwgIGRvY3VtZW50cworYW5kIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpcmVjdCBvciBpbmRpcmVjdCB1c2Ugb2YgdGhpcyBjb2RlIG9yIGl0cworZGVyaXZhdGl2ZXMuCisKK0NPREEgSVMgQU4gRVhQRVJJTUVOVEFMIFNPRlRXQVJFIFNZU1RFTSBBTkQgSVMgIEtOT1dOICBUTyAgSEFWRSAgQlVHUywKK1NPTUUgIE9GICBXSElDSCBNQVkgSEFWRSBTRVJJT1VTIENPTlNFUVVFTkNFUy4gIENBUk5FR0lFIE1FTExPTiBBTExPV1MKK0ZSRUUgVVNFIE9GIFRISVMgU09GVFdBUkUgSU4gSVRTICJBUyBJUyIgQ09ORElUSU9OLiAgIENBUk5FR0lFICBNRUxMT04KK0RJU0NMQUlNUyAgQU5ZICBMSUFCSUxJVFkgIE9GICBBTlkgIEtJTkQgIEZPUiAgQU5ZICBEQU1BR0VTIFdIQVRTT0VWRVIKK1JFU1VMVElORyBESVJFQ1RMWSBPUiBJTkRJUkVDVExZIEZST00gVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFICBPUiAgT0YKK0FOWSBERVJJVkFUSVZFIFdPUksuCisKK0Nhcm5lZ2llICBNZWxsb24gIGVuY291cmFnZXMgIHVzZXJzICBvZiAgdGhpcyAgc29mdHdhcmUgIHRvIHJldHVybiBhbnkKK2ltcHJvdmVtZW50cyBvciBleHRlbnNpb25zIHRoYXQgIHRoZXkgIG1ha2UsICBhbmQgIHRvICBncmFudCAgQ2FybmVnaWUKK01lbGxvbiB0aGUgcmlnaHRzIHRvIHJlZGlzdHJpYnV0ZSB0aGVzZSBjaGFuZ2VzIHdpdGhvdXQgZW5jdW1icmFuY2UuCisqLworCisvKgorICoKKyAqIEJhc2VkIG9uIGNmcy5oIGZyb20gTWFjaCwgYnV0IHJldmFtcGVkIGZvciBpbmNyZWFzZWQgc2ltcGxpY2l0eS4KKyAqIExpbnV4IG1vZGlmaWNhdGlvbnMgYnkgCisgKiBQZXRlciBCcmFhbSwgQXVnIDE5OTYKKyAqLworCisjaWZuZGVmIF9DT0RBX0hFQURFUl8KKyNkZWZpbmUgX0NPREFfSEVBREVSXworCisKKy8qIENhdGNoIG5ldyBfS0VSTkVMIGRlZm4gZm9yIE5ldEJTRCBhbmQgREpHUFAvX19DWUdXSU4zMl9fICovCisjaWYgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBcCisgICgoZGVmaW5lZChESkdQUCkgfHwgZGVmaW5lZChfX0NZR1dJTjMyX18pKSAmJiAhZGVmaW5lZChLRVJORUwpKQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmIAorCisjaWZuZGVmIENPREFfTUFYU1lNTElOS1MKKyNkZWZpbmUgQ09EQV9NQVhTWU1MSU5LUyAxMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERKR1BQKSB8fCBkZWZpbmVkKF9fQ1lHV0lOMzJfXykKKyNpZmRlZiBLRVJORUwKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1X2xvbmc7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1X2ludDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdV9zaG9ydDsKK3R5cGVkZWYgdV9sb25nIGlub190OwordHlwZWRlZiB1X2xvbmcgZGV2X3Q7Cit0eXBlZGVmIHZvaWQgKiBjYWRkcl90OworI2lmZGVmIERPUwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IHVfcXVhZF90OworI2Vsc2UgCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1X3F1YWRfdDsKKyNlbmRpZgorCisjZGVmaW5lIF9faW5saW5lX18KKworc3RydWN0IHRpbWVzcGVjIHsKKyAgICAgICAgbG9uZyAgICAgICB0c19zZWM7CisgICAgICAgIGxvbmcgICAgICAgdHNfbnNlYzsKK307CisjZWxzZSAgLyogREpHUFAgYnV0IG5vdCBLRVJORUwgKi8KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdV9xdWFkX3Q7CisjZW5kaWYgLyogIUtFUk5FTCAqLworI2VuZGlmIC8qICFESkdQUCAqLworCisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjZGVmaW5lIGNkZXZfdCB1X3F1YWRfdAorI2lmICFkZWZpbmVkKF9VUVVBRF9UXykgJiYgKCFkZWZpbmVkKF9fR0xJQkNfXykgfHwgX19HTElCQ19fIDwgMikKKyNkZWZpbmUgX1VRVUFEX1RfIDEKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVfcXVhZF90OworI2VuZGlmCisjZWxzZQorI2RlZmluZSBjZGV2X3QgZGV2X3QKKyNlbmRpZgorCisjaWZkZWYgX19DWUdXSU4zMl9fCitzdHJ1Y3QgdGltZXNwZWMgeworICAgICAgICB0aW1lX3QgIHR2X3NlYzsgICAgICAgICAvKiBzZWNvbmRzICovCisgICAgICAgIGxvbmcgICAgdHZfbnNlYzsgICAgICAgIC8qIG5hbm9zZWNvbmRzICovCit9OworI2VuZGlmCisKKyNpZm5kZWYgX19CSVRfVFlQRVNfREVGSU5FRF9fCisjZGVmaW5lIF9fQklUX1RZUEVTX0RFRklORURfXwordHlwZWRlZiBzaWduZWQgY2hhcgkgICAgICBpbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJICAgIHVfaW50OF90OwordHlwZWRlZiBzaG9ydAkJICAgICBpbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkgICB1X2ludDE2X3Q7Cit0eXBlZGVmIGludAkJICAgICBpbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJICAgdV9pbnQzMl90OworI2VuZGlmCisKKworLyoKKyAqIENmcyBjb25zdGFudHMKKyAqLworI2RlZmluZSBDT0RBX01BWE5BTUxFTiAgIDI1NQorI2RlZmluZSBDT0RBX01BWFBBVEhMRU4gIDEwMjQKKyNkZWZpbmUgQ09EQV9NQVhTWU1MSU5LICAxMAorCisvKiB0aGVzZSBhcmUgQ29kYSdzIHZlcnNpb24gb2YgT19SRE9OTFkgZXRjIGNvbWJpbmF0aW9ucworICogdG8gZGVhbCB3aXRoIFZGUyBvcGVuIG1vZGVzCisgKi8KKyNkZWZpbmUJQ19PX1JFQUQJMHgwMDEKKyNkZWZpbmUJQ19PX1dSSVRFICAgICAgIDB4MDAyCisjZGVmaW5lIENfT19UUlVOQyAgICAgICAweDAxMAorI2RlZmluZSBDX09fRVhDTAkweDEwMAorI2RlZmluZSBDX09fQ1JFQVQJMHgyMDAKKworLyogdGhlc2UgYXJlIHRvIGZpbmQgbW9kZSBiaXRzIGluIFZlbnVzICovIAorI2RlZmluZSBDX01fUkVBRCAgMDA0MDAKKyNkZWZpbmUgQ19NX1dSSVRFIDAwMjAwCisKKy8qIGZvciBhY2Nlc3MgVmVudXMgd2lsbCB1c2UgKi8KKyNkZWZpbmUgQ19BX0NfT0sgICAgOCAgICAgICAgICAgICAgIC8qIFRlc3QgZm9yIHdyaXRpbmcgdXBvbiBjcmVhdGUuICAqLworI2RlZmluZSBDX0FfUl9PSyAgICA0ICAgICAgICAgICAgICAgLyogVGVzdCBmb3IgcmVhZCBwZXJtaXNzaW9uLiAgKi8KKyNkZWZpbmUgQ19BX1dfT0sgICAgMiAgICAgICAgICAgICAgIC8qIFRlc3QgZm9yIHdyaXRlIHBlcm1pc3Npb24uICAqLworI2RlZmluZSBDX0FfWF9PSyAgICAxICAgICAgICAgICAgICAgLyogVGVzdCBmb3IgZXhlY3V0ZSBwZXJtaXNzaW9uLiAgKi8KKyNkZWZpbmUgQ19BX0ZfT0sgICAgMCAgICAgICAgICAgICAgIC8qIFRlc3QgZm9yIGV4aXN0ZW5jZS4gICovCisKKworCisjaWZuZGVmIF9WRU5VU19ESVJFTlRfVF8KKyNkZWZpbmUgX1ZFTlVTX0RJUkVOVF9UXyAxCitzdHJ1Y3QgdmVudXNfZGlyZW50IHsKKyAgICAgICAgdV9pbnQzMl90IGRfZmlsZW5vOwkJLyogZmlsZSBudW1iZXIgb2YgZW50cnkgKi8KKyAgICAgICAgdV9pbnQxNl90IGRfcmVjbGVuOwkJLyogbGVuZ3RoIG9mIHRoaXMgcmVjb3JkICovCisgICAgICAgIHVfaW50OF90ICBkX3R5cGU7CQkJLyogZmlsZSB0eXBlLCBzZWUgYmVsb3cgKi8KKyAgICAgICAgdV9pbnQ4X3QgIGRfbmFtbGVuOwkJLyogbGVuZ3RoIG9mIHN0cmluZyBpbiBkX25hbWUgKi8KKyAgICAgICAgY2hhcgkgIGRfbmFtZVtDT0RBX01BWE5BTUxFTiArIDFdOy8qIG5hbWUgbXVzdCBiZSBubyBsb25nZXIgdGhhbiB0aGlzICovCit9OworI3VuZGVmIERJUlNJWgorI2RlZmluZSBESVJTSVooZHApICAgICAgKChzaXplb2YgKHN0cnVjdCB2ZW51c19kaXJlbnQpIC0gKENPREFfTUFYTkFNTEVOKzEpKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKChkcCktPmRfbmFtbGVuKzEgKyAzKSAmfiAzKSkKKworLyoKKyAqIEZpbGUgdHlwZXMKKyAqLworI2RlZmluZQlDRFRfVU5LTk9XTgkgMAorI2RlZmluZQlDRFRfRklGTwkgMQorI2RlZmluZQlDRFRfQ0hSCQkgMgorI2RlZmluZQlDRFRfRElSCQkgNAorI2RlZmluZQlDRFRfQkxLCQkgNgorI2RlZmluZQlDRFRfUkVHCQkgOAorI2RlZmluZQlDRFRfTE5LCQkxMAorI2RlZmluZQlDRFRfU09DSwkxMgorI2RlZmluZQlDRFRfV0hUCQkxNAorCisvKgorICogQ29udmVydCBiZXR3ZWVuIHN0YXQgc3RydWN0dXJlIHR5cGVzIGFuZCBkaXJlY3RvcnkgdHlwZXMuCisgKi8KKyNkZWZpbmUJSUZUT0NEVChtb2RlKQkoKChtb2RlKSAmIDAxNzAwMDApID4+IDEyKQorI2RlZmluZQlDRFRUT0lGKGRpcnR5cGUpCSgoZGlydHlwZSkgPDwgMTIpCisKKyNlbmRpZgorCisjaWZuZGVmIF9WVUlEX1RfCisjZGVmaW5lIF9WVUlEX1RfCit0eXBlZGVmIHVfaW50MzJfdCB2dWlkX3Q7Cit0eXBlZGVmIHVfaW50MzJfdCB2Z2lkX3Q7CisjZW5kaWYgLypfVlVJRF9UXyAqLworCitzdHJ1Y3QgQ29kYUZpZCB7CisJdV9pbnQzMl90IG9wYXF1ZVs0XTsKK307CisKKyNkZWZpbmUgY29kYV9mMmkoZmlkKVwKKwkoZmlkID8gKGZpZC0+b3BhcXVlWzNdIF4gKGZpZC0+b3BhcXVlWzJdPDwxMCkgXiAoZmlkLT5vcGFxdWVbMV08PDIwKSBeIGZpZC0+b3BhcXVlWzBdKSA6IDApCisKKyNpZm5kZWYgX1ZFTlVTX1ZBVFRSX1RfCisjZGVmaW5lIF9WRU5VU19WQVRUUl9UXworLyoKKyAqIFZub2RlIHR5cGVzLiAgVk5PTiBtZWFucyBubyB0eXBlLgorICovCitlbnVtIGNvZGFfdnR5cGUJeyBDX1ZOT04sIENfVlJFRywgQ19WRElSLCBDX1ZCTEssIENfVkNIUiwgQ19WTE5LLCBDX1ZTT0NLLCBDX1ZGSUZPLCBDX1ZCQUQgfTsKKworc3RydWN0IGNvZGFfdmF0dHIgeworCWxvbmcgICAgIAl2YV90eXBlOwkvKiB2bm9kZSB0eXBlIChmb3IgY3JlYXRlKSAqLworCXVfc2hvcnQJCXZhX21vZGU7CS8qIGZpbGVzIGFjY2VzcyBtb2RlIGFuZCB0eXBlICovCisJc2hvcnQJCXZhX25saW5rOwkvKiBudW1iZXIgb2YgcmVmZXJlbmNlcyB0byBmaWxlICovCisJdnVpZF90CQl2YV91aWQ7CQkvKiBvd25lciB1c2VyIGlkICovCisJdmdpZF90CQl2YV9naWQ7CQkvKiBvd25lciBncm91cCBpZCAqLworCWxvbmcJCXZhX2ZpbGVpZDsJLyogZmlsZSBpZCAqLworCXVfcXVhZF90CXZhX3NpemU7CS8qIGZpbGUgc2l6ZSBpbiBieXRlcyAqLworCWxvbmcJCXZhX2Jsb2Nrc2l6ZTsJLyogYmxvY2tzaXplIHByZWZlcnJlZCBmb3IgaS9vICovCisJc3RydWN0IHRpbWVzcGVjCXZhX2F0aW1lOwkvKiB0aW1lIG9mIGxhc3QgYWNjZXNzICovCisJc3RydWN0IHRpbWVzcGVjCXZhX210aW1lOwkvKiB0aW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uICovCisJc3RydWN0IHRpbWVzcGVjCXZhX2N0aW1lOwkvKiB0aW1lIGZpbGUgY2hhbmdlZCAqLworCXVfbG9uZwkJdmFfZ2VuOwkJLyogZ2VuZXJhdGlvbiBudW1iZXIgb2YgZmlsZSAqLworCXVfbG9uZwkJdmFfZmxhZ3M7CS8qIGZsYWdzIGRlZmluZWQgZm9yIGZpbGUgKi8KKwljZGV2X3QJICAgICAgICB2YV9yZGV2OwkvKiBkZXZpY2Ugc3BlY2lhbCBmaWxlIHJlcHJlc2VudHMgKi8KKwl1X3F1YWRfdAl2YV9ieXRlczsJLyogYnl0ZXMgb2YgZGlzayBzcGFjZSBoZWxkIGJ5IGZpbGUgKi8KKwl1X3F1YWRfdAl2YV9maWxlcmV2OwkvKiBmaWxlIG1vZGlmaWNhdGlvbiBudW1iZXIgKi8KK307CisKKyNlbmRpZiAKKworLyogc3RydWN0dXJlIHVzZWQgYnkgQ09EQV9TVEFURlMgZm9yIGdldHRpbmcgY2FjaGUgaW5mb3JtYXRpb24gZnJvbSB2ZW51cyAqLworc3RydWN0IGNvZGFfc3RhdGZzIHsKKyAgICBpbnQzMl90IGZfYmxvY2tzOworICAgIGludDMyX3QgZl9iZnJlZTsKKyAgICBpbnQzMl90IGZfYmF2YWlsOworICAgIGludDMyX3QgZl9maWxlczsKKyAgICBpbnQzMl90IGZfZmZyZWU7Cit9OworCisvKgorICogS2VybmVsIDwtLT4gVmVudXMgY29tbXVuaWNhdGlvbnMuCisgKi8KKworI2RlZmluZSBDT0RBX1JPT1QJMgorI2RlZmluZSBDT0RBX09QRU5fQllfRkQJMworI2RlZmluZSBDT0RBX09QRU4JNAorI2RlZmluZSBDT0RBX0NMT1NFCTUKKyNkZWZpbmUgQ09EQV9JT0NUTAk2CisjZGVmaW5lIENPREFfR0VUQVRUUgk3CisjZGVmaW5lIENPREFfU0VUQVRUUgk4CisjZGVmaW5lIENPREFfQUNDRVNTCTkKKyNkZWZpbmUgQ09EQV9MT09LVVAJMTAKKyNkZWZpbmUgQ09EQV9DUkVBVEUJMTEKKyNkZWZpbmUgQ09EQV9SRU1PVkUJMTIKKyNkZWZpbmUgQ09EQV9MSU5LCTEzCisjZGVmaW5lIENPREFfUkVOQU1FCTE0CisjZGVmaW5lIENPREFfTUtESVIJMTUKKyNkZWZpbmUgQ09EQV9STURJUgkxNgorI2RlZmluZSBDT0RBX1NZTUxJTksJMTgKKyNkZWZpbmUgQ09EQV9SRUFETElOSwkxOQorI2RlZmluZSBDT0RBX0ZTWU5DCTIwCisjZGVmaW5lIENPREFfVkdFVAkyMgorI2RlZmluZSBDT0RBX1NJR05BTAkyMworI2RlZmluZSBDT0RBX1JFUExBQ0UJIDI0IC8qIERPV05DQUxMICovCisjZGVmaW5lIENPREFfRkxVU0ggICAgICAgMjUgLyogRE9XTkNBTEwgKi8KKyNkZWZpbmUgQ09EQV9QVVJHRVVTRVIgICAyNiAvKiBET1dOQ0FMTCAqLworI2RlZmluZSBDT0RBX1pBUEZJTEUgICAgIDI3IC8qIERPV05DQUxMICovCisjZGVmaW5lIENPREFfWkFQRElSICAgICAgMjggLyogRE9XTkNBTEwgKi8KKyNkZWZpbmUgQ09EQV9QVVJHRUZJRCAgICAzMCAvKiBET1dOQ0FMTCAqLworI2RlZmluZSBDT0RBX09QRU5fQllfUEFUSCAzMQorI2RlZmluZSBDT0RBX1JFU09MVkUgICAgIDMyCisjZGVmaW5lIENPREFfUkVJTlRFR1JBVEUgMzMKKyNkZWZpbmUgQ09EQV9TVEFURlMJIDM0CisjZGVmaW5lIENPREFfU1RPUkUJIDM1CisjZGVmaW5lIENPREFfUkVMRUFTRQkgMzYKKyNkZWZpbmUgQ09EQV9OQ0FMTFMgMzcKKworI2RlZmluZSBET1dOQ0FMTChvcGNvZGUpIChvcGNvZGUgPj0gQ09EQV9SRVBMQUNFICYmIG9wY29kZSA8PSBDT0RBX1BVUkdFRklEKQorCisjZGVmaW5lIFZDX01BWERBVEFTSVpFCSAgICA4MTkyCisjZGVmaW5lIFZDX01BWE1TR1NJWkUgICAgICBzaXplb2YodW5pb24gaW5wdXRBcmdzKStzaXplb2YodW5pb24gb3V0cHV0QXJncykgK1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ19NQVhEQVRBU0laRSAgCisKKyNkZWZpbmUgQ0lPQ19LRVJORUxfVkVSU0lPTiBfSU9XUignYycsIDEwLCBzaXplX3QpCisKKyNkZWZpbmUgQ09EQV9LRVJORUxfVkVSU0lPTiAzIC8qIDEyOC1iaXQgZmlsZSBpZGVudGlmaWVycyAqLworCisvKgorICogICAgICAgIFZlbnVzIDwtPiBDb2RhICBSUEMgYXJndW1lbnRzCisgKi8KK3N0cnVjdCBjb2RhX2luX2hkciB7CisgICAgdV9pbnQzMl90IG9wY29kZTsKKyAgICB1X2ludDMyX3QgdW5pcXVlOwkgICAgLyogS2VlcCBtdWx0aXBsZSBvdXRzdGFuZGluZyBtc2dzIGRpc3RpbmN0ICovCisgICAgcGlkX3QgcGlkOworICAgIHBpZF90IHBnaWQ7CisgICAgdnVpZF90IHVpZDsKK307CisKKy8qIFJlYWxseSBpbXBvcnRhbnQgdGhhdCBvcGNvZGUgYW5kIHVuaXF1ZSBhcmUgMXN0IHR3byBmaWVsZHMhICovCitzdHJ1Y3QgY29kYV9vdXRfaGRyIHsKKyAgICB1X2ludDMyX3Qgb3Bjb2RlOworICAgIHVfaW50MzJfdCB1bmlxdWU7CQorICAgIHVfaW50MzJfdCByZXN1bHQ7Cit9OworCisvKiBjb2RhX3Jvb3Q6IE5PX0lOICovCitzdHJ1Y3QgY29kYV9yb290X291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBWRmlkOworfTsKKworc3RydWN0IGNvZGFfcm9vdF9pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGluOworfTsKKworLyogY29kYV9vcGVuOiAqLworc3RydWN0IGNvZGFfb3Blbl9pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgaW50CWZsYWdzOworfTsKKworc3RydWN0IGNvZGFfb3Blbl9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb2g7CisgICAgY2Rldl90CWRldjsKKyAgICBpbm9fdAlpbm9kZTsKK307CisKKworLyogY29kYV9zdG9yZTogKi8KK3N0cnVjdCBjb2RhX3N0b3JlX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBpbnQJZmxhZ3M7Cit9OworCitzdHJ1Y3QgY29kYV9zdG9yZV9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb3V0OworfTsKKworLyogY29kYV9yZWxlYXNlOiAqLworc3RydWN0IGNvZGFfcmVsZWFzZV9pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgaW50CWZsYWdzOworfTsKKworc3RydWN0IGNvZGFfcmVsZWFzZV9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb3V0OworfTsKKworLyogY29kYV9jbG9zZTogKi8KK3N0cnVjdCBjb2RhX2Nsb3NlX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBpbnQJZmxhZ3M7Cit9OworCitzdHJ1Y3QgY29kYV9jbG9zZV9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb3V0OworfTsKKworLyogY29kYV9pb2N0bDogKi8KK3N0cnVjdCBjb2RhX2lvY3RsX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBpbnQJY21kOworICAgIGludAlsZW47CisgICAgaW50CXJ3ZmxhZzsKKyAgICBjaGFyICpkYXRhOwkJCS8qIFBsYWNlIGhvbGRlciBmb3IgZGF0YS4gKi8KK307CisKK3N0cnVjdCBjb2RhX2lvY3RsX291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvaDsKKyAgICBpbnQJbGVuOworICAgIGNhZGRyX3QJZGF0YTsJCS8qIFBsYWNlIGhvbGRlciBmb3IgZGF0YS4gKi8KK307CisKKworLyogY29kYV9nZXRhdHRyOiAqLworc3RydWN0IGNvZGFfZ2V0YXR0cl9pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7Cit9OworCitzdHJ1Y3QgY29kYV9nZXRhdHRyX291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvaDsKKyAgICBzdHJ1Y3QgY29kYV92YXR0ciBhdHRyOworfTsKKworCisvKiBjb2RhX3NldGF0dHI6IE5PX09VVCAqLworc3RydWN0IGNvZGFfc2V0YXR0cl9pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgc3RydWN0IGNvZGFfdmF0dHIgYXR0cjsKK307CisKK3N0cnVjdCBjb2RhX3NldGF0dHJfb3V0IHsKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG91dDsKK307CisKKy8qIGNvZGFfYWNjZXNzOiBOT19PVVQgKi8KK3N0cnVjdCBjb2RhX2FjY2Vzc19pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgaW50CWZsYWdzOworfTsKKworc3RydWN0IGNvZGFfYWNjZXNzX291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvdXQ7Cit9OworCisKKy8qIGxvb2t1cCBmbGFncyAqLworI2RlZmluZSBDTFVfQ0FTRV9TRU5TSVRJVkUgICAgIDB4MDEKKyNkZWZpbmUgQ0xVX0NBU0VfSU5TRU5TSVRJVkUgICAweDAyCisKKy8qIGNvZGFfbG9va3VwOiAqLworc3RydWN0ICBjb2RhX2xvb2t1cF9pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgaW50ICAgICAgICAgbmFtZTsJCS8qIFBsYWNlIGhvbGRlciBmb3IgZGF0YS4gKi8KKyAgICBpbnQgICAgICAgICBmbGFnczsJCit9OworCitzdHJ1Y3QgY29kYV9sb29rdXBfb3V0IHsKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG9oOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgaW50CXZ0eXBlOworfTsKKworCisvKiBjb2RhX2NyZWF0ZTogKi8KK3N0cnVjdCBjb2RhX2NyZWF0ZV9pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgc3RydWN0IGNvZGFfdmF0dHIgYXR0cjsKKyAgICBpbnQgZXhjbDsKKyAgICBpbnQgbW9kZTsKKyAgICBpbnQgCW5hbWU7CQkvKiBQbGFjZSBob2xkZXIgZm9yIGRhdGEuICovCit9OworCitzdHJ1Y3QgY29kYV9jcmVhdGVfb3V0IHsKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG9oOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgc3RydWN0IGNvZGFfdmF0dHIgYXR0cjsKK307CisKKworLyogY29kYV9yZW1vdmU6IE5PX09VVCAqLworc3RydWN0IGNvZGFfcmVtb3ZlX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBpbnQgbmFtZTsJCS8qIFBsYWNlIGhvbGRlciBmb3IgZGF0YS4gKi8KK307CisKK3N0cnVjdCBjb2RhX3JlbW92ZV9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb3V0OworfTsKKworLyogY29kYV9saW5rOiBOT19PVVQgKi8KK3N0cnVjdCBjb2RhX2xpbmtfaW4geworICAgIHN0cnVjdCBjb2RhX2luX2hkciBpaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBzb3VyY2VGaWQ7CS8qIGNub2RlIHRvIGxpbmsgKnRvKiAqLworICAgIHN0cnVjdCBDb2RhRmlkIGRlc3RGaWQ7CS8qIERpcmVjdG9yeSBpbiB3aGljaCB0byBwbGFjZSBsaW5rICovCisgICAgaW50IHRuYW1lOwkJLyogUGxhY2UgaG9sZGVyIGZvciBkYXRhLiAqLworfTsKKworc3RydWN0IGNvZGFfbGlua19vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb3V0OworfTsKKworCisvKiBjb2RhX3JlbmFtZTogTk9fT1VUICovCitzdHJ1Y3QgY29kYV9yZW5hbWVfaW4geworICAgIHN0cnVjdCBjb2RhX2luX2hkciBpaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBzb3VyY2VGaWQ7CisgICAgaW50IAlzcmNuYW1lOworICAgIHN0cnVjdCBDb2RhRmlkIGRlc3RGaWQ7CisgICAgaW50IAlkZXN0bmFtZTsKK307CisKK3N0cnVjdCBjb2RhX3JlbmFtZV9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb3V0OworfTsKKworLyogY29kYV9ta2RpcjogKi8KK3N0cnVjdCBjb2RhX21rZGlyX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBzdHJ1Y3QgY29kYV92YXR0ciBhdHRyOworICAgIGludAkgICBuYW1lOwkJLyogUGxhY2UgaG9sZGVyIGZvciBkYXRhLiAqLworfTsKKworc3RydWN0IGNvZGFfbWtkaXJfb3V0IHsKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG9oOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgc3RydWN0IGNvZGFfdmF0dHIgYXR0cjsKK307CisKKworLyogY29kYV9ybWRpcjogTk9fT1VUICovCitzdHJ1Y3QgY29kYV9ybWRpcl9pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgaW50IG5hbWU7CQkvKiBQbGFjZSBob2xkZXIgZm9yIGRhdGEuICovCit9OworCitzdHJ1Y3QgY29kYV9ybWRpcl9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb3V0OworfTsKKworLyogY29kYV9zeW1saW5rOiBOT19PVVQgKi8KK3N0cnVjdCBjb2RhX3N5bWxpbmtfaW4geworICAgIHN0cnVjdCBjb2RhX2luX2hkciBpaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBWRmlkOwkvKiBEaXJlY3RvcnkgdG8gcHV0IHN5bWxpbmsgaW4gKi8KKyAgICBpbnQgc3JjbmFtZTsKKyAgICBzdHJ1Y3QgY29kYV92YXR0ciBhdHRyOworICAgIGludCB0bmFtZTsKK307CisKK3N0cnVjdCBjb2RhX3N5bWxpbmtfb3V0IHsKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG91dDsKK307CisKKy8qIGNvZGFfcmVhZGxpbms6ICovCitzdHJ1Y3QgY29kYV9yZWFkbGlua19pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7Cit9OworCitzdHJ1Y3QgY29kYV9yZWFkbGlua19vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb2g7CisgICAgaW50CWNvdW50OworICAgIGNhZGRyX3QJZGF0YTsJCS8qIFBsYWNlIGhvbGRlciBmb3IgZGF0YS4gKi8KK307CisKKworLyogY29kYV9mc3luYzogTk9fT1VUICovCitzdHJ1Y3QgY29kYV9mc3luY19pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7Cit9OworCitzdHJ1Y3QgY29kYV9mc3luY19vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb3V0OworfTsKKworLyogY29kYV92Z2V0OiAqLworc3RydWN0IGNvZGFfdmdldF9pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7Cit9OworCitzdHJ1Y3QgY29kYV92Z2V0X291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBWRmlkOworICAgIGludAl2dHlwZTsKK307CisKKworLyogQ09EQV9TSUdOQUwgaXMgb3V0LW9mLWJhbmQsIGRvZXNuJ3QgbmVlZCBkYXRhLiAqLworLyogQ09EQV9JTlZBTElEQVRFIGlzIGEgdmVudXMtPmtlcm5lbCBjYWxsICovCisvKiBDT0RBX0ZMVVNIIGlzIGEgdmVudXMtPmtlcm5lbCBjYWxsICovCisKKy8qIGNvZGFfcHVyZ2V1c2VyOiAqLworLyogQ09EQV9QVVJHRVVTRVIgaXMgYSB2ZW51cy0+a2VybmVsIGNhbGwgKi8KK3N0cnVjdCBjb2RhX3B1cmdldXNlcl9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb2g7CisgICAgdnVpZF90IHVpZDsKK307CisKKy8qIGNvZGFfemFwZmlsZTogKi8KKy8qIENPREFfWkFQRklMRSBpcyBhIHZlbnVzLT5rZXJuZWwgY2FsbCAqLworc3RydWN0IGNvZGFfemFwZmlsZV9vdXQgeyAgCisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBDb2RhRmlkOworfTsKKworLyogY29kYV96YXBkaXI6ICovCisvKiBDT0RBX1pBUERJUiBpcyBhIHZlbnVzLT5rZXJuZWwgY2FsbCAqLwkKK3N0cnVjdCBjb2RhX3phcGRpcl9vdXQgewkgIAorICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb2g7CisgICAgc3RydWN0IENvZGFGaWQgQ29kYUZpZDsKK307CisKKy8qIGNvZGFfcHVyZ2VmaWQ6ICovCisvKiBDT0RBX1BVUkdFRklEIGlzIGEgdmVudXMtPmtlcm5lbCBjYWxsICovCQorc3RydWN0IGNvZGFfcHVyZ2VmaWRfb3V0IHsgCisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBDb2RhRmlkOworfTsKKworLyogY29kYV9yZXBsYWNlOiAqLworLyogQ09EQV9SRVBMQUNFIGlzIGEgdmVudXMtPmtlcm5lbCBjYWxsICovCQorc3RydWN0IGNvZGFfcmVwbGFjZV9vdXQgeyAvKiBjb2RhX3JlcGxhY2UgaXMgYSB2ZW51cy0+a2VybmVsIGNhbGwgKi8KKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG9oOworICAgIHN0cnVjdCBDb2RhRmlkIE5ld0ZpZDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBPbGRGaWQ7Cit9OworCisvKiBjb2RhX29wZW5fYnlfZmQ6ICovCitzdHJ1Y3QgY29kYV9vcGVuX2J5X2ZkX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBpbnQgICAgICAgIGZsYWdzOworfTsKKworc3RydWN0IGNvZGFfb3Blbl9ieV9mZF9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb2g7CisgICAgaW50IGZkOworCit9OworCisvKiBjb2RhX29wZW5fYnlfcGF0aDogKi8KK3N0cnVjdCBjb2RhX29wZW5fYnlfcGF0aF9pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgaW50CWZsYWdzOworfTsKKworc3RydWN0IGNvZGFfb3Blbl9ieV9wYXRoX291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvaDsKKwlpbnQgcGF0aDsKK307CisKKy8qIGNvZGFfc3RhdGZzOiBOT19JTiAqLworc3RydWN0IGNvZGFfc3RhdGZzX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaW47Cit9OworCitzdHJ1Y3QgY29kYV9zdGF0ZnNfb3V0IHsKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG9oOworICAgIHN0cnVjdCBjb2RhX3N0YXRmcyBzdGF0OworfTsKKworLyogCisgKiBPY2Nhc2lvbmFsbHksIHdlIGRvbid0IGNhY2hlIHRoZSBmaWQgcmV0dXJuZWQgYnkgQ09EQV9MT09LVVAuIAorICogRm9yIGluc3RhbmNlLCBpZiB0aGUgZmlkIGlzIGluY29uc2lzdGVudC4gCisgKiBUaGlzIGNhc2UgaXMgaGFuZGxlZCBieSBzZXR0aW5nIHRoZSB0b3AgYml0IG9mIHRoZSB0eXBlIHJlc3VsdCBwYXJhbWV0ZXIuCisgKi8KKyNkZWZpbmUgQ09EQV9OT0NBQ0hFICAgICAgICAgIDB4ODAwMDAwMDAKKwordW5pb24gaW5wdXRBcmdzIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CQkvKiBOQjogZXZlcnkgc3RydWN0IGJlbG93IGJlZ2lucyB3aXRoIGFuIGloICovCisgICAgc3RydWN0IGNvZGFfb3Blbl9pbiBjb2RhX29wZW47CisgICAgc3RydWN0IGNvZGFfc3RvcmVfaW4gY29kYV9zdG9yZTsKKyAgICBzdHJ1Y3QgY29kYV9yZWxlYXNlX2luIGNvZGFfcmVsZWFzZTsKKyAgICBzdHJ1Y3QgY29kYV9jbG9zZV9pbiBjb2RhX2Nsb3NlOworICAgIHN0cnVjdCBjb2RhX2lvY3RsX2luIGNvZGFfaW9jdGw7CisgICAgc3RydWN0IGNvZGFfZ2V0YXR0cl9pbiBjb2RhX2dldGF0dHI7CisgICAgc3RydWN0IGNvZGFfc2V0YXR0cl9pbiBjb2RhX3NldGF0dHI7CisgICAgc3RydWN0IGNvZGFfYWNjZXNzX2luIGNvZGFfYWNjZXNzOworICAgIHN0cnVjdCBjb2RhX2xvb2t1cF9pbiBjb2RhX2xvb2t1cDsKKyAgICBzdHJ1Y3QgY29kYV9jcmVhdGVfaW4gY29kYV9jcmVhdGU7CisgICAgc3RydWN0IGNvZGFfcmVtb3ZlX2luIGNvZGFfcmVtb3ZlOworICAgIHN0cnVjdCBjb2RhX2xpbmtfaW4gY29kYV9saW5rOworICAgIHN0cnVjdCBjb2RhX3JlbmFtZV9pbiBjb2RhX3JlbmFtZTsKKyAgICBzdHJ1Y3QgY29kYV9ta2Rpcl9pbiBjb2RhX21rZGlyOworICAgIHN0cnVjdCBjb2RhX3JtZGlyX2luIGNvZGFfcm1kaXI7CisgICAgc3RydWN0IGNvZGFfc3ltbGlua19pbiBjb2RhX3N5bWxpbms7CisgICAgc3RydWN0IGNvZGFfcmVhZGxpbmtfaW4gY29kYV9yZWFkbGluazsKKyAgICBzdHJ1Y3QgY29kYV9mc3luY19pbiBjb2RhX2ZzeW5jOworICAgIHN0cnVjdCBjb2RhX3ZnZXRfaW4gY29kYV92Z2V0OworICAgIHN0cnVjdCBjb2RhX29wZW5fYnlfZmRfaW4gY29kYV9vcGVuX2J5X2ZkOworICAgIHN0cnVjdCBjb2RhX29wZW5fYnlfcGF0aF9pbiBjb2RhX29wZW5fYnlfcGF0aDsKKyAgICBzdHJ1Y3QgY29kYV9zdGF0ZnNfaW4gY29kYV9zdGF0ZnM7Cit9OworCit1bmlvbiBvdXRwdXRBcmdzIHsKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG9oOwkJLyogTkI6IGV2ZXJ5IHN0cnVjdCBiZWxvdyBiZWdpbnMgd2l0aCBhbiBvaCAqLworICAgIHN0cnVjdCBjb2RhX3Jvb3Rfb3V0IGNvZGFfcm9vdDsKKyAgICBzdHJ1Y3QgY29kYV9vcGVuX291dCBjb2RhX29wZW47CisgICAgc3RydWN0IGNvZGFfaW9jdGxfb3V0IGNvZGFfaW9jdGw7CisgICAgc3RydWN0IGNvZGFfZ2V0YXR0cl9vdXQgY29kYV9nZXRhdHRyOworICAgIHN0cnVjdCBjb2RhX2xvb2t1cF9vdXQgY29kYV9sb29rdXA7CisgICAgc3RydWN0IGNvZGFfY3JlYXRlX291dCBjb2RhX2NyZWF0ZTsKKyAgICBzdHJ1Y3QgY29kYV9ta2Rpcl9vdXQgY29kYV9ta2RpcjsKKyAgICBzdHJ1Y3QgY29kYV9yZWFkbGlua19vdXQgY29kYV9yZWFkbGluazsKKyAgICBzdHJ1Y3QgY29kYV92Z2V0X291dCBjb2RhX3ZnZXQ7CisgICAgc3RydWN0IGNvZGFfcHVyZ2V1c2VyX291dCBjb2RhX3B1cmdldXNlcjsKKyAgICBzdHJ1Y3QgY29kYV96YXBmaWxlX291dCBjb2RhX3phcGZpbGU7CisgICAgc3RydWN0IGNvZGFfemFwZGlyX291dCBjb2RhX3phcGRpcjsKKyAgICBzdHJ1Y3QgY29kYV9wdXJnZWZpZF9vdXQgY29kYV9wdXJnZWZpZDsKKyAgICBzdHJ1Y3QgY29kYV9yZXBsYWNlX291dCBjb2RhX3JlcGxhY2U7CisgICAgc3RydWN0IGNvZGFfb3Blbl9ieV9mZF9vdXQgY29kYV9vcGVuX2J5X2ZkOworICAgIHN0cnVjdCBjb2RhX29wZW5fYnlfcGF0aF9vdXQgY29kYV9vcGVuX2J5X3BhdGg7CisgICAgc3RydWN0IGNvZGFfc3RhdGZzX291dCBjb2RhX3N0YXRmczsKK307ICAgIAorCit1bmlvbiBjb2RhX2Rvd25jYWxscyB7CisgICAgLyogQ09EQV9JTlZBTElEQVRFIGlzIGEgdmVudXMtPmtlcm5lbCBjYWxsICovCisgICAgLyogQ09EQV9GTFVTSCBpcyBhIHZlbnVzLT5rZXJuZWwgY2FsbCAqLworICAgIHN0cnVjdCBjb2RhX3B1cmdldXNlcl9vdXQgcHVyZ2V1c2VyOworICAgIHN0cnVjdCBjb2RhX3phcGZpbGVfb3V0IHphcGZpbGU7CisgICAgc3RydWN0IGNvZGFfemFwZGlyX291dCB6YXBkaXI7CisgICAgc3RydWN0IGNvZGFfcHVyZ2VmaWRfb3V0IHB1cmdlZmlkOworICAgIHN0cnVjdCBjb2RhX3JlcGxhY2Vfb3V0IHJlcGxhY2U7Cit9OworCisKKy8qCisgKiBVc2VkIGZvciBpZGVudGlmeWluZyB1c2FnZSBvZiAiQ29udHJvbCIgYW5kIHBpb2N0bHMKKyAqLworCisjZGVmaW5lIFBJT0NQQVJNX01BU0sgMHgwMDAwZmZmZgorc3RydWN0IFZpY2VJb2N0bCB7CisgICAgICAgIHZvaWQgKmluOyAgICAgICAgLyogRGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBpbiAqLworICAgICAgICB2b2lkICpvdXQ7ICAgICAgIC8qIERhdGEgdG8gYmUgdHJhbnNmZXJyZWQgb3V0ICovCisgICAgICAgIHVfc2hvcnQgaW5fc2l6ZTsgICAgICAgIC8qIFNpemUgb2YgaW5wdXQgYnVmZmVyIDw9IDJLICovCisgICAgICAgIHVfc2hvcnQgb3V0X3NpemU7ICAgICAgIC8qIE1heGltdW0gc2l6ZSBvZiBvdXRwdXQgYnVmZmVyLCA8PSAySyAqLworfTsKKworc3RydWN0IFBpb2N0bERhdGEgeworICAgICAgICBjb25zdCBjaGFyICpwYXRoOworICAgICAgICBpbnQgZm9sbG93OworICAgICAgICBzdHJ1Y3QgVmljZUlvY3RsIHZpOworfTsKKworI2RlZmluZSBDT0RBX0NPTlRST0wJCSIuQ09OVFJPTCIKKyNkZWZpbmUgQ09EQV9DT05UUk9MTEVOCQk4CisjZGVmaW5lIENUTF9JTk8JCQktMQorCisvKiBEYXRhIHBhc3NlZCB0byBtb3VudCAqLworCisjZGVmaW5lIENPREFfTU9VTlRfVkVSU0lPTiAxCisKK3N0cnVjdCBjb2RhX21vdW50X2RhdGEgeworCWludAkJdmVyc2lvbjsKKwlpbnQJCWZkOyAgICAgICAvKiBPcGVuZWQgZGV2aWNlICovCit9OworCisjZW5kaWYgCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY29kYV9wc2Rldi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb2RhX3BzZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJhYzMyNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY29kYV9wc2Rldi5oCkBAIC0wLDAgKzEsMjcgQEAKKyNpZm5kZWYgX19DT0RBX1BTREVWX0gKKyNkZWZpbmUgX19DT0RBX1BTREVWX0gKKworI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisKKyNkZWZpbmUgQ09EQV9QU0RFVl9NQUpPUiA2NworI2RlZmluZSBNQVhfQ09EQURFVlMgIDUJICAgLyogaG93IG1hbnkgZG8gd2UgYWxsb3cgKi8KKworCisvKiBtZXNzYWdlcyBiZXR3ZWVuIGNvZGEgZmlsZXN5c3RlbSBpbiBrZXJuZWwgYW5kIFZlbnVzICovCitzdHJ1Y3QgdXBjX3JlcSB7CisJc3RydWN0IGxpc3RfaGVhZCAgICB1Y19jaGFpbjsKKwljYWRkcl90CSAgICAgICAgICAgIHVjX2RhdGE7CisJdV9zaG9ydAkgICAgICAgICAgICB1Y19mbGFnczsKKwl1X3Nob3J0ICAgICAgICAgICAgIHVjX2luU2l6ZTsgIC8qIFNpemUgaXMgYXQgbW9zdCA1MDAwIGJ5dGVzICovCisJdV9zaG9ydAkgICAgICAgICAgICB1Y19vdXRTaXplOworCXVfc2hvcnQJICAgICAgICAgICAgdWNfb3Bjb2RlOyAgLyogY29waWVkIGZyb20gZGF0YSB0byBzYXZlIGxvb2t1cCAqLworCWludAkJICAgIHVjX3VuaXF1ZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAgIHVjX3NsZWVwOyAgIC8qIHByb2Nlc3MnIHdhaXQgcXVldWUgKi8KK307CisKKyNkZWZpbmUgQ09EQV9SRVFfQVNZTkMgIDB4MQorI2RlZmluZSBDT0RBX1JFUV9SRUFEICAgMHgyCisjZGVmaW5lIENPREFfUkVRX1dSSVRFICAweDQKKyNkZWZpbmUgQ09EQV9SRVFfQUJPUlQgIDB4OAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY29mZi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb2ZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM1NGE3ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY29mZi5oCkBAIC0wLDAgKzEsMzUxIEBACisvKiBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBHQVMgMi4xLjQgYXNzZW1ibGVyIGNvbnRyb2wgZmlsZS4KKyAgIFRoZSBHQVMgcHJvZHVjdCBpcyB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiBvciBsYXRlci4KKyAgIEFzIHN1Y2gsIHRoaXMgZmlsZSBpcyBhbHNvIHVuZGVyIHRoYXQgbGljZW5zZS4KKworICAgSWYgdGhlIGZpbGUgZm9ybWF0IGNoYW5nZXMgaW4gdGhlIENPRkYgb2JqZWN0LCB0aGlzIGZpbGUgc2hvdWxkIGJlCisgICBzdWJzZXF1ZW50bHkgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBjaGFuZ2VzLgorCisgICBUaGUgYWN0dWFsIGxvYWRlciBtb2R1bGUgb25seSB1c2VzIGEgZmV3IG9mIHRoZXNlIHN0cnVjdHVyZXMuIFRoZSBmdWxsCisgICBzZXQgaXMgZG9jdW1lbnRlZCBoZXJlIGJlY2F1c2UgSSByZWNlaXZlZCB0aGUgZnVsbCBzZXQuIElmIHlvdSB3aXNoCisgICBtb3JlIGluZm9ybWF0aW9uIGFib3V0IENPRkYsIHRoZW4gTydSZWlsbHkgaGFzIGEgdmVyeSBleGNlbGxlbnQgYm9vay4KKyovCisKKyNkZWZpbmUgIEVfU1lNTk1MRU4gIDggICAvKiBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lICAgICAgICAgKi8KKyNkZWZpbmUgIEVfRklMTk1MRU4gMTQgICAvKiBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZSAgICAgICAgICAgKi8KKyNkZWZpbmUgIEVfRElNTlVNICAgIDQgICAvKiBOdW1iZXIgb2YgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KKworLyoKKyAqIFRoZXNlIGRlZmluZXMgYXJlIGJ5dGUgb3JkZXIgaW5kZXBlbmRlbnQuIFRoZXJlIGlzIG5vIGFsaWdubWVudCBvZiBmaWVsZHMKKyAqIHBlcm1pdHRlZCBpbiB0aGUgc3RydWN0dXJlcy4gVGhlcmVmb3JlIHRoZXkgYXJlIGRlY2xhcmVkIGFzIGNoYXJhY3RlcnMKKyAqIGFuZCB0aGUgdmFsdWVzIGxvYWRlZCBmcm9tIHRoZSBjaGFyYWN0ZXIgcG9zaXRpb25zLiBJdCBhbHNvIG1ha2VzIGl0CisgKiBuaWNlIHRvIGhhdmUgaXQgImVuZGlhbiIgaW5kZXBlbmRlbnQuCisgKi8KKyAKKy8qIExvYWQgYSBzaG9ydCBpbnQgZnJvbSB0aGUgZm9sbG93aW5nIHRhYmxlcyB3aXRoIGxpdHRsZS1lbmRpYW4gZm9ybWF0cyAqLworI2RlZmluZSBDT0ZGX1NIT1JUX0wocHMpICgoc2hvcnQpKCgodW5zaWduZWQgc2hvcnQpKCh1bnNpZ25lZCBjaGFyKXBzWzFdKTw8OCl8XAorCQkJCSAgKCh1bnNpZ25lZCBzaG9ydCkoKHVuc2lnbmVkIGNoYXIpcHNbMF0pKSkpCisKKy8qIExvYWQgYSBsb25nIGludCBmcm9tIHRoZSBmb2xsb3dpbmcgdGFibGVzIHdpdGggbGl0dGxlLWVuZGlhbiBmb3JtYXRzICovCisjZGVmaW5lIENPRkZfTE9OR19MKHBzKSAoKChsb25nKSgoKHVuc2lnbmVkIGxvbmcpKCh1bnNpZ25lZCBjaGFyKXBzWzNdKTw8MjQpIHxcCisJCQkJICgodW5zaWduZWQgbG9uZykoKHVuc2lnbmVkIGNoYXIpcHNbMl0pPDwxNikgfFwKKwkJCQkgKCh1bnNpZ25lZCBsb25nKSgodW5zaWduZWQgY2hhcilwc1sxXSk8PDgpICB8XAorCQkJCSAoKHVuc2lnbmVkIGxvbmcpKCh1bnNpZ25lZCBjaGFyKXBzWzBdKSkpKSkKKyAKKy8qIExvYWQgYSBzaG9ydCBpbnQgZnJvbSB0aGUgZm9sbG93aW5nIHRhYmxlcyB3aXRoIGJpZy1lbmRpYW4gZm9ybWF0cyAqLworI2RlZmluZSBDT0ZGX1NIT1JUX0gocHMpICgoc2hvcnQpKCgodW5zaWduZWQgc2hvcnQpKCh1bnNpZ25lZCBjaGFyKXBzWzBdKTw8OCl8XAorCQkJCSAgKCh1bnNpZ25lZCBzaG9ydCkoKHVuc2lnbmVkIGNoYXIpcHNbMV0pKSkpCisKKy8qIExvYWQgYSBsb25nIGludCBmcm9tIHRoZSBmb2xsb3dpbmcgdGFibGVzIHdpdGggYmlnLWVuZGlhbiBmb3JtYXRzICovCisjZGVmaW5lIENPRkZfTE9OR19IKHBzKSAoKChsb25nKSgoKHVuc2lnbmVkIGxvbmcpKCh1bnNpZ25lZCBjaGFyKXBzWzBdKTw8MjQpIHxcCisJCQkJICgodW5zaWduZWQgbG9uZykoKHVuc2lnbmVkIGNoYXIpcHNbMV0pPDwxNikgfFwKKwkJCQkgKCh1bnNpZ25lZCBsb25nKSgodW5zaWduZWQgY2hhcilwc1syXSk8PDgpICB8XAorCQkJCSAoKHVuc2lnbmVkIGxvbmcpKCh1bnNpZ25lZCBjaGFyKXBzWzNdKSkpKSkKKworLyogVGhlc2UgbWF5IGJlIG92ZXJyaWRkZW4gbGF0ZXIgYnkgYnJhaW4gZGVhZCBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggZ2VuZXJhdGUKKyAgIGEgYmlnLWVuZGlhbiBoZWFkZXIgd2l0aCBsaXR0bGUtZW5kaWFuIGRhdGEuIEluIHRoYXQgY2FzZSwgZ2VuZXJhdGUgYQorICAgcmVwbGFjZW1lbnQgbWFjcm8gd2hpY2ggdGVzdHMgYSBmbGFnIGFuZCB1c2VzIGVpdGhlciBvZiB0aGUgdHdvIGFib3ZlCisgICBhcyBhcHByb3ByaWF0ZS4gKi8KKworI2RlZmluZSBDT0ZGX0xPTkcodikgICBDT0ZGX0xPTkdfTCh2KQorI2RlZmluZSBDT0ZGX1NIT1JUKHYpICBDT0ZGX1NIT1JUX0wodikKKworLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBJbnRlbCAzODYvNDg2LiAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IENPRkZfZmlsZWhkciB7CisJY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLworCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLworCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLworCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KKwljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLworCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLworCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLworfTsKKworLyoKKyAqICAgQml0cyBmb3IgZl9mbGFnczoKKyAqCisgKglGX1JFTEZMRwlyZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgZnJvbSBmaWxlCisgKglGX0VYRUMJCWZpbGUgaXMgZXhlY3V0YWJsZSAgKGkuZS4gbm8gdW5yZXNvbHZlZCBleHRlcm5hbAorICoJCQlyZWZlcmVuY2VzKQorICoJRl9MTk5PCQlsaW5lIG51bWJlcnMgc3RyaXBwZWQgZnJvbSBmaWxlCisgKglGX0xTWU1TCQlsb2NhbCBzeW1ib2xzIHN0cmlwcGVkIGZyb20gZmlsZQorICoJRl9NSU5NQUwJdGhpcyBpcyBhIG1pbmltYWwgb2JqZWN0IGZpbGUgKCIubSIpIG91dHB1dCBvZiBmZXh0cmFjdAorICoJRl9VUERBVEUJdGhpcyBpcyBhIGZ1bGx5IGJvdW5kIHVwZGF0ZSBmaWxlLCBvdXRwdXQgb2Ygb2dlbgorICoJRl9TV0FCRAkJdGhpcyBmaWxlIGhhcyBoYWQgaXRzIGJ5dGVzIHN3YWJiZWQgKGluIG5hbWVzKQorICoJRl9BUjE2V1IJdGhpcyBmaWxlIGhhcyB0aGUgYnl0ZSBvcmRlcmluZyBvZiBhbiBBUjE2V1IKKyAqCQkJKGUuZy4gMTEvNzApIG1hY2hpbmUKKyAqCUZfQVIzMldSCXRoaXMgZmlsZSBoYXMgdGhlIGJ5dGUgb3JkZXJpbmcgb2YgYW4gQVIzMldSIG1hY2hpbmUKKyAqCQkJKGUuZy4gdmF4IGFuZCBpTlRFTCAzODYpCisgKglGX0FSMzJXCQl0aGlzIGZpbGUgaGFzIHRoZSBieXRlIG9yZGVyaW5nIG9mIGFuIEFSMzJXIG1hY2hpbmUKKyAqCQkJKGUuZy4gM2IsbWF4aSkKKyAqCUZfUEFUQ0gJCWZpbGUgY29udGFpbnMgInBhdGNoIiBsaXN0IGluIG9wdGlvbmFsIGhlYWRlcgorICoJRl9OT0RGCQkobWluaW1hbCBmaWxlIG9ubHkpIG5vIGRlY2lzaW9uIGZ1bmN0aW9ucyBmb3IKKyAqCQkJcmVwbGFjZWQgZnVuY3Rpb25zCisgKi8KKworI2RlZmluZSAgQ09GRl9GX1JFTEZMRwkJMDAwMDAwMQorI2RlZmluZSAgQ09GRl9GX0VYRUMJCTAwMDAwMDIKKyNkZWZpbmUgIENPRkZfRl9MTk5PCQkwMDAwMDA0CisjZGVmaW5lICBDT0ZGX0ZfTFNZTVMJCTAwMDAwMTAKKyNkZWZpbmUgIENPRkZfRl9NSU5NQUwJCTAwMDAwMjAKKyNkZWZpbmUgIENPRkZfRl9VUERBVEUJCTAwMDAwNDAKKyNkZWZpbmUgIENPRkZfRl9TV0FCRAkJMDAwMDEwMAorI2RlZmluZSAgQ09GRl9GX0FSMTZXUgkJMDAwMDIwMAorI2RlZmluZSAgQ09GRl9GX0FSMzJXUgkJMDAwMDQwMAorI2RlZmluZSAgQ09GRl9GX0FSMzJXCQkwMDAxMDAwCisjZGVmaW5lICBDT0ZGX0ZfUEFUQ0gJCTAwMDIwMDAKKyNkZWZpbmUgIENPRkZfRl9OT0RGCQkwMDAyMDAwCisKKyNkZWZpbmUJQ09GRl9JMzg2TUFHSUMJICAgICAgICAweDE0YyAgIC8qIExpbnV4J3Mgc3lzdGVtICAgICovCisKKyNpZiAwICAgLyogUGVyaGFwcywgc29tZWRheSwgdGhlc2UgZm9ybWF0cyBtYXkgYmUgdXNlZC4gICAgICAqLworI2RlZmluZSBDT0ZGX0kzODZQVFhNQUdJQwkweDE1NAorI2RlZmluZSBDT0ZGX0kzODZBSVhNQUdJQwkweDE3NSAgIC8qIElCTSdzIEFJWCBzeXN0ZW0gICovCisjZGVmaW5lIENPRkZfSTM4NkJBRE1BRyh4KSAoKENPRkZfU0hPUlQoKHgpLmZfbWFnaWMpICE9IENPRkZfSTM4Nk1BR0lDKSBcCisJCQkgICYmIENPRkZfU0hPUlQoKHgpLmZfbWFnaWMpICE9IENPRkZfSTM4NlBUWE1BR0lDIFwKKwkJCSAgJiYgQ09GRl9TSE9SVCgoeCkuZl9tYWdpYykgIT0gQ09GRl9JMzg2QUlYTUFHSUMpCisjZWxzZQorI2RlZmluZSBDT0ZGX0kzODZCQURNQUcoeCkgKENPRkZfU0hPUlQoKHgpLmZfbWFnaWMpICE9IENPRkZfSTM4Nk1BR0lDKQorI2VuZGlmCisKKyNkZWZpbmUJQ09GRl9GSUxIRFIJc3RydWN0IENPRkZfZmlsZWhkcgorI2RlZmluZQlDT0ZGX0ZJTEhTWglzaXplb2YoQ09GRl9GSUxIRFIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTGludXggQ09GRiBtdXN0IGhhdmUgdGhpcyAib3B0aW9uYWwiIGhlYWRlci4gU3RhbmRhcmQgQ09GRiBoYXMgbm8gZW50cnkKKyAgIGxvY2F0aW9uIGZvciB0aGUgImVudHJ5IiBwb2ludC4gVGhleSBub3JtYWxseSB3b3VsZCBzdGFydCB3aXRoIHRoZSBmaXJzdAorICAgbG9jYXRpb24gb2YgdGhlIC50ZXh0IHNlY3Rpb24uIFRoaXMgaXMgbm90IGEgZ29vZCBpZGVhIGZvciBsaW51eC4gU28sCisgICB0aGUgdXNlIG9mIHRoaXMgIm9wdGlvbmFsIiBoZWFkZXIgaXMgbm90IG9wdGlvbmFsLiBJdCBpcyByZXF1aXJlZC4KKworICAgRG8gbm90IGJlIHRlbXB0ZWQgdG8gYXNzdW1lIHRoYXQgdGhlIHNpemUgb2YgdGhlIG9wdGlvbmFsIGhlYWRlciBpcworICAgYSBjb25zdGFudCBhbmQgc2ltcGx5IGluZGV4IHRoZSBuZXh0IGJ5dGUgYnkgdGhlIHNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUuCisgICBVc2UgdGhlICdmX29wdGhkcicgZmllbGQgaW4gdGhlIG1haW4gY29mZiBoZWFkZXIgZm9yIHRoZSBzaXplIG9mIHRoZQorICAgc3RydWN0dXJlIGFjdHVhbGx5IHdyaXR0ZW4gdG8gdGhlIGZpbGUhIQorKi8KKwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSAqLworICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkgKi8KKyAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkgKi8KKyAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkICAgZGF0YSAiICAgIgkJICovCisgIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSAqLworICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSAqLworICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAgICAgICAqLworICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAgICAgICAqLworfQorQ09GRl9BT1VUSERSOworCisjZGVmaW5lIENPRkZfQU9VVFNaIChzaXplb2YoQ09GRl9BT1VUSERSKSkKKworI2RlZmluZSBDT0ZGX1NUTUFHSUMJMDQwMQorI2RlZmluZSBDT0ZGX09NQUdJQyAgICAgMDQwNAorI2RlZmluZSBDT0ZGX0pNQUdJQyAgICAgMDQwNyAgICAvKiBkaXJ0eSB0ZXh0IGFuZCBkYXRhIGltYWdlLCBjYW4ndCBzaGFyZSAgKi8KKyNkZWZpbmUgQ09GRl9ETUFHSUMgICAgIDA0MTAgICAgLyogZGlydHkgdGV4dCBzZWdtZW50LCBkYXRhIGFsaWduZWQgICAgICAgICovCisjZGVmaW5lIENPRkZfWk1BR0lDICAgICAwNDEzICAgIC8qIFRoZSBwcm9wZXIgbWFnaWMgbnVtYmVyIGZvciBleGVjdXRhYmxlcyAgKi8KKyNkZWZpbmUgQ09GRl9TSE1BR0lDCTA0NDMJLyogc2hhcmVkIGxpYnJhcnkgaGVhZGVyICAgICAgICAgICAgICAgICAgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBDT0ZGX3NjbmhkciB7CisgIGNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJICAgICovCisgIGNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCisgIGNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJICAgICovCisgIGNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJICAgICovCisgIGNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLworICBjaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkgICAgKi8KKyAgY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJICAgICovCisgIGNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSAgICAqLworICBjaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyAgICAqLworICBjaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSAgICAqLworfTsKKworI2RlZmluZQlDT0ZGX1NDTkhEUglzdHJ1Y3QgQ09GRl9zY25oZHIKKyNkZWZpbmUJQ09GRl9TQ05IU1oJc2l6ZW9mKENPRkZfU0NOSERSKQorCisvKgorICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCisgKi8KKworI2RlZmluZSBDT0ZGX1RFWFQJIi50ZXh0IgorI2RlZmluZSBDT0ZGX0RBVEEJIi5kYXRhIgorI2RlZmluZSBDT0ZGX0JTUwkiLmJzcyIKKyNkZWZpbmUgQ09GRl9DT01NRU5UICAgICIuY29tbWVudCIKKyNkZWZpbmUgQ09GRl9MSUIgICAgICAgICIubGliIgorCisjZGVmaW5lIENPRkZfU0VDVF9URVhUICAwICAgICAgLyogU2VjdGlvbiBmb3IgaW5zdHJ1Y3Rpb24gY29kZSAgICAgICAgICAgICAqLworI2RlZmluZSBDT0ZGX1NFQ1RfREFUQSAgMSAgICAgIC8qIFNlY3Rpb24gZm9yIGluaXRpYWxpemVkIGdsb2JhbHMgICAgICAgICAgKi8KKyNkZWZpbmUgQ09GRl9TRUNUX0JTUyAgIDIgICAgICAvKiBTZWN0aW9uIGZvciB1bi1pbml0aWFsaXplZCBnbG9iYWxzICAgICAgICovCisjZGVmaW5lIENPRkZfU0VDVF9SRVFEICAzICAgICAgLyogTWluaW11bSBudW1iZXIgb2Ygc2VjdGlvbnMgZm9yIGdvb2QgZmlsZSAqLworCisjZGVmaW5lIENPRkZfU1RZUF9SRUcgICAgIDB4MDAgLyogcmVndWxhciBzZWdtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT0ZGX1NUWVBfRFNFQ1QgICAweDAxIC8qIGR1bW15IHNlZ21lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09GRl9TVFlQX05PTE9BRCAgMHgwMiAvKiBuby1sb2FkIHNlZ21lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPRkZfU1RZUF9HUk9VUCAgIDB4MDQgLyogZ3JvdXAgc2VnbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT0ZGX1NUWVBfUEFEICAgICAweDA4IC8qIC5wYWQgc2VnbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09GRl9TVFlQX0NPUFkgICAgMHgxMCAvKiBjb3B5IHNlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPRkZfU1RZUF9URVhUICAgIDB4MjAgLyogLnRleHQgc2VnbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT0ZGX1NUWVBfREFUQSAgICAweDQwIC8qIC5kYXRhIHNlZ21lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09GRl9TVFlQX0JTUyAgICAgMHg4MCAvKiAuYnNzIHNlZ21lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPRkZfU1RZUF9JTkZPICAgMHgyMDAgLyogLmNvbW1lbnQgc2VjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT0ZGX1NUWVBfT1ZFUiAgIDB4NDAwIC8qIG92ZXJsYXkgc2VjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09GRl9TVFlQX0xJQiAgICAweDgwMCAvKiBsaWJyYXJ5IHNlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qCisgKiBTaGFyZWQgbGlicmFyaWVzIGhhdmUgdGhlIGZvbGxvd2luZyBzZWN0aW9uIGhlYWRlciBpbiB0aGUgZGF0YSBmaWVsZCBmb3IKKyAqIGVhY2ggbGlicmFyeS4KKyAqLworCitzdHJ1Y3QgQ09GRl9zbGliIHsKKyAgY2hhcgkJc2xfZW50c3pbNF07CS8qIFNpemUgb2YgdGhpcyBlbnRyeSAgICAgICAgICAgICAgICovCisgIGNoYXIJCXNsX3BhdGhuZHhbNF07CS8qIHNpemUgb2YgdGhlIGhlYWRlciBmaWVsZCAgICAgICAgICovCit9OworCisjZGVmaW5lCUNPRkZfU0xJQkhECXN0cnVjdCBDT0ZGX3NsaWIKKyNkZWZpbmUJQ09GRl9TTElCU1oJc2l6ZW9mKENPRkZfU0xJQkhEKQorCisvKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCisgKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KKyAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCisgKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCisgKi8KKworc3RydWN0IENPRkZfbGluZW5vIHsKKyAgdW5pb24geworICAgIGNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLworICAgIGNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCisgIH0gbF9hZGRyOworICBjaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCit9OworCisjZGVmaW5lCUNPRkZfTElORU5PCXN0cnVjdCBDT0ZGX2xpbmVubworI2RlZmluZQlDT0ZGX0xJTkVTWgk2CisKKy8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDT0ZGX0VfU1lNTk1MRU4JIDgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc2hvcnQgc3ltYm9sIG5hbWUJKi8KKyNkZWZpbmUgQ09GRl9FX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KKyNkZWZpbmUgQ09GRl9FX0RJTU5VTQkgNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCisKKy8qCisgKiAgQWxsIHN5bWJvbHMgYW5kIHNlY3Rpb25zIGhhdmUgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uCisgKi8KKworc3RydWN0IENPRkZfc3ltZW50IAoreworICB1bmlvbiB7CisgICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07ICAgIC8qIFN5bWJvbCBuYW1lIChmaXJzdCA4IGNoYXJhY3RlcnMpICovCisgICAgc3RydWN0IHsKKyAgICAgIGNoYXIgZV96ZXJvZXNbNF07ICAgICAgICAgLyogTGVhZGluZyB6ZXJvcyAqLworICAgICAgY2hhciBlX29mZnNldFs0XTsgICAgICAgICAvKiBPZmZzZXQgaWYgdGhpcyBpcyBhIGhlYWRlciBzZWN0aW9uICovCisgICAgfSBlOworICB9IGU7CisKKyAgY2hhciBlX3ZhbHVlWzRdOyAgICAgICAgICAgICAgLyogVmFsdWUgKGFkZHJlc3MpIG9mIHRoZSBzZWdtZW50ICovCisgIGNoYXIgZV9zY251bVsyXTsgICAgICAgICAgICAgIC8qIFNlY3Rpb24gbnVtYmVyICovCisgIGNoYXIgZV90eXBlWzJdOyAgICAgICAgICAgICAgIC8qIFR5cGUgb2Ygc2VjdGlvbiAqLworICBjaGFyIGVfc2NsYXNzWzFdOyAgICAgICAgICAgICAvKiBMb2FkZXIgY2xhc3MgKi8KKyAgY2hhciBlX251bWF1eFsxXTsgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGF1eGlsaWFyeSBlbnRyaWVzIHdoaWNoIGZvbGxvdyAqLworfTsKKworI2RlZmluZSBDT0ZGX05fQlRNQVNLCSgweGYpICAgLyogTWFzayBmb3IgaW1wb3J0YW50IGNsYXNzIGJpdHMgKi8KKyNkZWZpbmUgQ09GRl9OX1RNQVNLCSgweDMwKSAgLyogTWFzayBmb3IgaW1wb3J0YW50IHR5cGUgYml0cyAgKi8KKyNkZWZpbmUgQ09GRl9OX0JUU0hGVAkoNCkgICAgIC8qICMgYml0cyB0byBzaGlmdCBjbGFzcyBmaWVsZCAgICovCisjZGVmaW5lIENPRkZfTl9UU0hJRlQJKDIpICAgICAvKiAjIGJpdHMgdG8gc2hpZnQgdHlwZSBmaWVsZCAgICAqLworCisvKgorICogIEF1eGlsaWFyeSBlbnRyaWVzIGJlY2F1c2UgdGhlIG1haW4gdGFibGUgaXMgdG9vIGxpbWl0aW5nLgorICovCisgIAordW5pb24gQ09GRl9hdXhlbnQgeworCisvKgorICogIERlYnVnZ2VyIGluZm9ybWF0aW9uCisgKi8KKworICBzdHJ1Y3QgeworICAgIGNoYXIgeF90YWduZHhbNF07CSAgICAgICAgLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLworICAgIHVuaW9uIHsKKyAgICAgIHN0cnVjdCB7CisJY2hhciAgeF9sbm5vWzJdOyAgICAgICAgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KKwljaGFyICB4X3NpemVbMl07ICAgICAgICAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLworICAgICAgfSB4X2xuc3o7CisgICAgICBjaGFyIHhfZnNpemVbNF07CSAgICAgICAgLyogc2l6ZSBvZiBmdW5jdGlvbiAqLworICAgIH0geF9taXNjOworCisgICAgdW5pb24geworICAgICAgc3RydWN0IHsJCSAgICAgICAgLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCisJY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCisJY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCisgICAgICB9IHhfZmNuOworCisgICAgICBzdHJ1Y3QgewkJICAgICAgICAvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KKwljaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOworICAgICAgfSB4X2FyeTsKKyAgICB9IHhfZmNuYXJ5OworCisgICAgY2hhciB4X3R2bmR4WzJdOwkvKiB0diBpbmRleCAqLworICB9IHhfc3ltOworCisvKgorICogICBTb3VyY2UgZmlsZSBuYW1lcyAoZGVidWdnZXIgaW5mb3JtYXRpb24pCisgKi8KKworICB1bmlvbiB7CisgICAgY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOworICAgIHN0cnVjdCB7CisgICAgICBjaGFyIHhfemVyb2VzWzRdOworICAgICAgY2hhciB4X29mZnNldFs0XTsKKyAgICB9IHhfbjsKKyAgfSB4X2ZpbGU7CisKKy8qCisgKiAgIFNlY3Rpb24gaW5mb3JtYXRpb24KKyAqLworCisgIHN0cnVjdCB7CisgICAgY2hhciB4X3Njbmxlbls0XTsJLyogc2VjdGlvbiBsZW5ndGggKi8KKyAgICBjaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLworICAgIGNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCisgIH0geF9zY247CisKKy8qCisgKiAgIFRyYW5zZmVyIHZlY3RvciAoYnJhbmNoIHRhYmxlKQorICovCisgIAorICBzdHJ1Y3QgeworICAgIGNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KKyAgICBjaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KKyAgICBjaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCisgIH0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KK307CisKKyNkZWZpbmUJQ09GRl9TWU1FTlQJc3RydWN0IENPRkZfc3ltZW50CisjZGVmaW5lCUNPRkZfU1lNRVNaCTE4CQorI2RlZmluZQlDT0ZGX0FVWEVOVAl1bmlvbiBDT0ZGX2F1eGVudAorI2RlZmluZQlDT0ZGX0FVWEVTWgkxOAorCisjZGVmaW5lIENPRkZfRVRFWFQJImV0ZXh0IgorCisvKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IENPRkZfcmVsb2MgeworICBjaGFyIHJfdmFkZHJbNF07ICAgICAgICAvKiBWaXJ0dWFsIGFkZHJlc3Mgb2YgaXRlbSAgICAqLworICBjaGFyIHJfc3ltbmR4WzRdOyAgICAgICAvKiBTeW1ib2wgaW5kZXggaW4gdGhlIHN5bXRhYiAqLworICBjaGFyIHJfdHlwZVsyXTsgICAgICAgICAvKiBSZWxvY2F0aW9uIHR5cGUgICAgICAgICAgICAqLworfTsKKworI2RlZmluZSBDT0ZGX1JFTE9DIHN0cnVjdCBDT0ZGX3JlbG9jCisjZGVmaW5lIENPRkZfUkVMU1ogMTAKKworI2RlZmluZSBDT0ZGX0RFRl9EQVRBX1NFQ1RJT05fQUxJR05NRU5UICA0CisjZGVmaW5lIENPRkZfREVGX0JTU19TRUNUSU9OX0FMSUdOTUVOVCAgIDQKKyNkZWZpbmUgQ09GRl9ERUZfVEVYVF9TRUNUSU9OX0FMSUdOTUVOVCAgNAorCisvKiBGb3IgbmV3IHNlY3Rpb25zIHdlIGhhdmVuJ3QgaGVhcmQgb2YgYmVmb3JlICovCisjZGVmaW5lIENPRkZfREVGX1NFQ1RJT05fQUxJR05NRU5UICAgICAgIDQKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY29tc3RhdHMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY29tc3RhdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjVlYThlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb21zdGF0cy5oCkBAIC0wLDAgKzEsMTE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKgljb21zdGF0cy5oICAtLSBTZXJpYWwgUG9ydCBTdGF0cy4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OCAgU3RhbGxpb24gVGVjaG5vbG9naWVzCisgKglDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiAgR3JlZyBVbmdlcmVyLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYJX0NPTVNUQVRTX0gKKyNkZWZpbmUJX0NPTVNUQVRTX0gKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVNlcmlhbCBwb3J0IHN0YXRzIHN0cnVjdHVyZS4gVGhlIHN0cnVjdHVyZSBpdHNlbGYgaXMgVUFSVAorICoJaW5kZXBlbmRlbnQsIGJ1dCBzb21lIGZpZWxkcyBtYXkgYmUgVUFSVC9kcml2ZXIgc3BlY2lmaWMgKGZvcgorICoJZXhhbXBsZSBzdGF0ZSkuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcJYnJkOworCXVuc2lnbmVkIGxvbmcJcGFuZWw7CisJdW5zaWduZWQgbG9uZwlwb3J0OworCXVuc2lnbmVkIGxvbmcJaHdpZDsKKwl1bnNpZ25lZCBsb25nCXR5cGU7CisJdW5zaWduZWQgbG9uZwl0eHRvdGFsOworCXVuc2lnbmVkIGxvbmcJcnh0b3RhbDsKKwl1bnNpZ25lZCBsb25nCXR4YnVmZmVyZWQ7CisJdW5zaWduZWQgbG9uZwlyeGJ1ZmZlcmVkOworCXVuc2lnbmVkIGxvbmcJcnhvdmVycnVuOworCXVuc2lnbmVkIGxvbmcJcnhwYXJpdHk7CisJdW5zaWduZWQgbG9uZwlyeGZyYW1pbmc7CisJdW5zaWduZWQgbG9uZwlyeGxvc3Q7CisJdW5zaWduZWQgbG9uZwl0eGJyZWFrczsKKwl1bnNpZ25lZCBsb25nCXJ4YnJlYWtzOworCXVuc2lnbmVkIGxvbmcJdHh4b247CisJdW5zaWduZWQgbG9uZwl0eHhvZmY7CisJdW5zaWduZWQgbG9uZwlyeHhvbjsKKwl1bnNpZ25lZCBsb25nCXJ4eG9mZjsKKwl1bnNpZ25lZCBsb25nCXR4Y3Rzb247CisJdW5zaWduZWQgbG9uZwl0eGN0c29mZjsKKwl1bnNpZ25lZCBsb25nCXJ4cnRzb247CisJdW5zaWduZWQgbG9uZwlyeHJ0c29mZjsKKwl1bnNpZ25lZCBsb25nCW1vZGVtOworCXVuc2lnbmVkIGxvbmcJc3RhdGU7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwl1bnNpZ25lZCBsb25nCXR0eXN0YXRlOworCXVuc2lnbmVkIGxvbmcJY2ZsYWdzOworCXVuc2lnbmVkIGxvbmcJaWZsYWdzOworCXVuc2lnbmVkIGxvbmcJb2ZsYWdzOworCXVuc2lnbmVkIGxvbmcJbGZsYWdzOworCXVuc2lnbmVkIGxvbmcJc2lnbmFsczsKK30gY29tc3RhdHNfdDsKKworCisvKgorICoJQm9hcmQgc3RhdHMgc3RydWN0dXJlLiBSZXR1cm5zIHVzZWZ1bCBpbmZvIGFib3V0IHRoZSBib2FyZC4KKyAqLworCisjZGVmaW5lCUNPTV9NQVhQQU5FTFMJOAorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZwlwYW5lbDsKKwl1bnNpZ25lZCBsb25nCXR5cGU7CisJdW5zaWduZWQgbG9uZwlod2lkOworCXVuc2lnbmVkIGxvbmcJbnJwb3J0czsKK30gY29tcGFuZWxfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcJYnJkOworCXVuc2lnbmVkIGxvbmcJdHlwZTsKKwl1bnNpZ25lZCBsb25nCWh3aWQ7CisJdW5zaWduZWQgbG9uZwlzdGF0ZTsKKwl1bnNpZ25lZCBsb25nCWlvYWRkcjsKKwl1bnNpZ25lZCBsb25nCWlvYWRkcjI7CisJdW5zaWduZWQgbG9uZwltZW1hZGRyOworCXVuc2lnbmVkIGxvbmcJaXJxOworCXVuc2lnbmVkIGxvbmcJbnJwYW5lbHM7CisJdW5zaWduZWQgbG9uZwlucnBvcnRzOworCWNvbXBhbmVsX3QJcGFuZWxzW0NPTV9NQVhQQU5FTFNdOworfSBjb21icmRfdDsKKworCisvKgorICoJRGVmaW5lIHRoZSBpb2N0bCBvcGVyYXRpb25zIGZvciBzdGF0cyBzdHVmZi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNkZWZpbmUJQ09NX0dFVFBPUlRTVEFUUwlfSU8oJ2MnLDMwKQorI2RlZmluZQlDT01fQ0xSUE9SVFNUQVRTCV9JTygnYycsMzEpCisjZGVmaW5lCUNPTV9HRVRCUkRTVEFUUwkJX0lPKCdjJywzMikKKworCisvKgorICoJRGVmaW5lIHRoZSBzZXQgb2YgaW9jdGxzIHRoYXQgZ2l2ZSB1c2VyIGxldmVsIGFjY2VzcyB0byB0aGUKKyAqCXByaXZhdGUgcG9ydCwgcGFuZWwgYW5kIGJvYXJkIHN0cnVjdHVyZXMuIFRoZSBhcmd1bWVudCByZXF1aXJlZAorICoJd2lsbCBiZSBkcml2ZXIgZGVwZW5kZW50ISAgCisgKi8KKyNkZWZpbmUJQ09NX1JFQURQT1JUCQlfSU8oJ2MnLDQwKQorI2RlZmluZQlDT01fUkVBREJPQVJECQlfSU8oJ2MnLDQxKQorI2RlZmluZQlDT01fUkVBRFBBTkVMCQlfSU8oJ2MnLDQyKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY29ubmVjdG9yLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nvbm5lY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNGQ3NDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nvbm5lY3Rvci5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiAJY29ubmVjdG9yLmgKKyAqIAorICogMjAwNC0yMDA1IENvcHlyaWdodCAoYykgRXZnZW5peSBQb2x5YWtvdiA8emJyQGlvcmVtYXAubmV0PgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX19DT05ORUNUT1JfSAorI2RlZmluZSBfX0NPTk5FQ1RPUl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogUHJvY2VzcyBFdmVudHMgY29ubmVjdG9yIHVuaXF1ZSBpZHMgLS0gdXNlZCBmb3IgbWVzc2FnZSByb3V0aW5nCisgKi8KKyNkZWZpbmUgQ05fSURYX1BST0MJCQkweDEKKyNkZWZpbmUgQ05fVkFMX1BST0MJCQkweDEKKyNkZWZpbmUgQ05fSURYX0NJRlMJCQkweDIKKyNkZWZpbmUgQ05fVkFMX0NJRlMgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgQ05fVzFfSURYCQkJMHgzCS8qIHcxIGNvbW11bmljYXRpb24gKi8KKyNkZWZpbmUgQ05fVzFfVkFMCQkJMHgxCisjZGVmaW5lIENOX0lEWF9WODZECQkJMHg0CisjZGVmaW5lIENOX1ZBTF9WODZEX1VWRVNBRkIJCTB4MQorI2RlZmluZSBDTl9JRFhfQkIJCQkweDUJLyogQmxhY2tCb2FyZCwgZnJvbSB0aGUgVFNQIEdQTCBzYW1wbGluZyBmcmFtZXdvcmsgKi8KKyNkZWZpbmUgQ05fRFNUX0lEWAkJCTB4NgorI2RlZmluZSBDTl9EU1RfVkFMCQkJMHgxCisjZGVmaW5lIENOX0lEWF9ETQkJCTB4NwkvKiBEZXZpY2UgTWFwcGVyICovCisjZGVmaW5lIENOX1ZBTF9ETV9VU0VSU1BBQ0VfTE9HCQkweDEKKyNkZWZpbmUgQ05fSURYX0RSQkQJCQkweDgKKyNkZWZpbmUgQ05fVkFMX0RSQkQJCQkweDEKKyNkZWZpbmUgQ05fS1ZQX0lEWAkJCTB4OQkvKiBIeXBlclYgS1ZQICovCisjZGVmaW5lIENOX0tWUF9WQUwJCQkweDEJLyogcXVlcmllcyBmcm9tIHRoZSBrZXJuZWwgKi8KKworI2RlZmluZSBDTl9ORVRMSU5LX1VTRVJTCQkxMAkvKiBIaWdoZXN0IGluZGV4ICsgMSAqLworCisvKgorICogTWF4aW11bSBjb25uZWN0b3IncyBtZXNzYWdlIHNpemUuCisgKi8KKyNkZWZpbmUgQ09OTkVDVE9SX01BWF9NU0dfU0laRQkJMTYzODQKKworLyoKKyAqIGlkeCBhbmQgdmFsIGFyZSB1bmlxdWUgaWRlbnRpZmllcnMgd2hpY2ggCisgKiBhcmUgdXNlZCBmb3IgbWVzc2FnZSByb3V0aW5nIGFuZCAKKyAqIG11c3QgYmUgcmVnaXN0ZXJlZCBpbiBjb25uZWN0b3IuaCBmb3IgaW4ta2VybmVsIHVzYWdlLgorICovCisKK3N0cnVjdCBjYl9pZCB7CisJX191MzIgaWR4OworCV9fdTMyIHZhbDsKK307CisKK3N0cnVjdCBjbl9tc2cgeworCXN0cnVjdCBjYl9pZCBpZDsKKworCV9fdTMyIHNlcTsKKwlfX3UzMiBhY2s7CisKKwlfX3UxNiBsZW47CQkvKiBMZW5ndGggb2YgdGhlIGZvbGxvd2luZyBkYXRhICovCisJX191MTYgZmxhZ3M7CisJX191OCBkYXRhWzBdOworfTsKKworI2VuZGlmCQkJCS8qIF9fQ09OTkVDVE9SX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY29uc3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY29uc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjJjNzA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb25zdC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qIGNvbnN0Lmg6IE1hY3JvcyBmb3IgZGVhbGluZyB3aXRoIGNvbnN0YW50cy4gICovCisKKyNpZm5kZWYgX0xJTlVYX0NPTlNUX0gKKyNkZWZpbmUgX0xJTlVYX0NPTlNUX0gKKworLyogU29tZSBjb25zdGFudCBtYWNyb3MgYXJlIHVzZWQgaW4gYm90aCBhc3NlbWJsZXIgYW5kCisgKiBDIGNvZGUuICBUaGVyZWZvcmUgd2UgY2Fubm90IGFubm90YXRlIHRoZW0gYWx3YXlzIHdpdGgKKyAqICdVTCcgYW5kIG90aGVyIHR5cGUgc3BlY2lmaWVycyB1bmlsYXRlcmFsbHkuICBXZQorICogdXNlIHRoZSBmb2xsb3dpbmcgbWFjcm9zIHRvIGRlYWwgd2l0aCB0aGlzLgorICoKKyAqIFNpbWlsYXJseSwgX0FUKCkgd2lsbCBjYXN0IGFuIGV4cHJlc3Npb24gd2l0aCBhIHR5cGUgaW4gQywgYnV0CisgKiBsZWF2ZSBpdCB1bmNoYW5nZWQgaW4gYXNtLgorICovCisKKyNpZmRlZiBfX0FTU0VNQkxZX18KKyNkZWZpbmUgX0FDKFgsWSkJWAorI2RlZmluZSBfQVQoVCxYKQlYCisjZWxzZQorI2RlZmluZSBfX0FDKFgsWSkJKFgjI1kpCisjZGVmaW5lIF9BQyhYLFkpCV9fQUMoWCxZKQorI2RlZmluZSBfQVQoVCxYKQkoKFQpKFgpKQorI2VuZGlmCisKKyNlbmRpZiAvKiAhKF9MSU5VWF9DT05TVF9IKSAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jcmFtZnNfZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY3JhbWZzX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjYWYyZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY3JhbWZzX2ZzLmgKQEAgLTAsMCArMSw4OCBAQAorI2lmbmRlZiBfX0NSQU1GU19ICisjZGVmaW5lIF9fQ1JBTUZTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KKworI2RlZmluZSBDUkFNRlNfU0lHTkFUVVJFCSJDb21wcmVzc2VkIFJPTUZTIgorCisvKgorICogV2lkdGggb2YgdmFyaW91cyBiaXRmaWVsZHMgaW4gc3RydWN0IGNyYW1mc19pbm9kZS4KKyAqIFByaW1hcmlseSB1c2VkIHRvIGdlbmVyYXRlIHdhcm5pbmdzIGluIG1rY3JhbWZzLgorICovCisjZGVmaW5lIENSQU1GU19NT0RFX1dJRFRIIDE2CisjZGVmaW5lIENSQU1GU19VSURfV0lEVEggMTYKKyNkZWZpbmUgQ1JBTUZTX1NJWkVfV0lEVEggMjQKKyNkZWZpbmUgQ1JBTUZTX0dJRF9XSURUSCA4CisjZGVmaW5lIENSQU1GU19OQU1FTEVOX1dJRFRIIDYKKyNkZWZpbmUgQ1JBTUZTX09GRlNFVF9XSURUSCAyNgorCisvKgorICogU2luY2UgaW5vZGUubmFtZWxlbiBpcyBhIHVuc2lnbmVkIDYtYml0IG51bWJlciwgdGhlIG1heGltdW0gY3JhbWZzCisgKiBwYXRoIGxlbmd0aCBpcyA2MyA8PCAyID0gMjUyLgorICovCisjZGVmaW5lIENSQU1GU19NQVhQQVRITEVOICgoKDEgPDwgQ1JBTUZTX05BTUVMRU5fV0lEVEgpIC0gMSkgPDwgMikKKworLyoKKyAqIFJlYXNvbmFibHkgdGVyc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlub2RlIGRhdGEuCisgKi8KK3N0cnVjdCBjcmFtZnNfaW5vZGUgeworCV9fdTMyIG1vZGU6Q1JBTUZTX01PREVfV0lEVEgsIHVpZDpDUkFNRlNfVUlEX1dJRFRIOworCS8qIFNJWkUgZm9yIGRldmljZSBmaWxlcyBpcyBpX3JkZXYgKi8KKwlfX3UzMiBzaXplOkNSQU1GU19TSVpFX1dJRFRILCBnaWQ6Q1JBTUZTX0dJRF9XSURUSDsKKwkvKiBOQU1FTEVOIGlzIHRoZSBsZW5ndGggb2YgdGhlIGZpbGUgbmFtZSwgZGl2aWRlZCBieSA0IGFuZAorICAgICAgICAgICByb3VuZGVkIHVwLiAgKGNyYW1mcyBkb2Vzbid0IHN1cHBvcnQgaGFyZCBsaW5rcy4pICovCisJLyogT0ZGU0VUOiBGb3Igc3ltbGlua3MgYW5kIG5vbi1lbXB0eSByZWd1bGFyIGZpbGVzLCB0aGlzCisJICAgY29udGFpbnMgdGhlIG9mZnNldCAoZGl2aWRlZCBieSA0KSBvZiB0aGUgZmlsZSBkYXRhIGluCisJICAgY29tcHJlc3NlZCBmb3JtIChzdGFydGluZyB3aXRoIGFuIGFycmF5IG9mIGJsb2NrIHBvaW50ZXJzOworCSAgIHNlZSBSRUFETUUpLiAgRm9yIG5vbi1lbXB0eSBkaXJlY3RvcmllcyBpdCBpcyB0aGUgb2Zmc2V0CisJICAgKGRpdmlkZWQgYnkgNCkgb2YgdGhlIGlub2RlIG9mIHRoZSBmaXJzdCBmaWxlIGluIHRoYXQKKwkgICBkaXJlY3RvcnkuICBGb3IgYW55dGhpbmcgZWxzZSwgb2Zmc2V0IGlzIHplcm8uICovCisJX191MzIgbmFtZWxlbjpDUkFNRlNfTkFNRUxFTl9XSURUSCwgb2Zmc2V0OkNSQU1GU19PRkZTRVRfV0lEVEg7Cit9OworCitzdHJ1Y3QgY3JhbWZzX2luZm8geworCV9fdTMyIGNyYzsKKwlfX3UzMiBlZGl0aW9uOworCV9fdTMyIGJsb2NrczsKKwlfX3UzMiBmaWxlczsKK307CisKKy8qCisgKiBTdXBlcmJsb2NrIGluZm9ybWF0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIEZTLgorICovCitzdHJ1Y3QgY3JhbWZzX3N1cGVyIHsKKwlfX3UzMiBtYWdpYzsJCQkvKiAweDI4Y2QzZDQ1IC0gcmFuZG9tIG51bWJlciAqLworCV9fdTMyIHNpemU7CQkJLyogbGVuZ3RoIGluIGJ5dGVzICovCisJX191MzIgZmxhZ3M7CQkJLyogZmVhdHVyZSBmbGFncyAqLworCV9fdTMyIGZ1dHVyZTsJCQkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworCV9fdTggc2lnbmF0dXJlWzE2XTsJCS8qICJDb21wcmVzc2VkIFJPTUZTIiAqLworCXN0cnVjdCBjcmFtZnNfaW5mbyBmc2lkOwkvKiB1bmlxdWUgZmlsZXN5c3RlbSBpbmZvICovCisJX191OCBuYW1lWzE2XTsJCQkvKiB1c2VyLWRlZmluZWQgbmFtZSAqLworCXN0cnVjdCBjcmFtZnNfaW5vZGUgcm9vdDsJLyogcm9vdCBpbm9kZSBkYXRhICovCit9OworCisvKgorICogRmVhdHVyZSBmbGFncworICoKKyAqIDB4MDAwMDAwMDAgLSAweDAwMDAwMGZmOiBmZWF0dXJlcyB0aGF0IHdvcmsgZm9yIGFsbCBwYXN0IGtlcm5lbHMKKyAqIDB4MDAwMDAxMDAgLSAweGZmZmZmZmZmOiBmZWF0dXJlcyB0aGF0IGRvbid0IHdvcmsgZm9yIHBhc3Qga2VybmVscworICovCisjZGVmaW5lIENSQU1GU19GTEFHX0ZTSURfVkVSU0lPTl8yCTB4MDAwMDAwMDEJLyogZnNpZCB2ZXJzaW9uICMyICovCisjZGVmaW5lIENSQU1GU19GTEFHX1NPUlRFRF9ESVJTCQkweDAwMDAwMDAyCS8qIHNvcnRlZCBkaXJzICovCisjZGVmaW5lIENSQU1GU19GTEFHX0hPTEVTCQkweDAwMDAwMTAwCS8qIHN1cHBvcnQgZm9yIGhvbGVzICovCisjZGVmaW5lIENSQU1GU19GTEFHX1dST05HX1NJR05BVFVSRQkweDAwMDAwMjAwCS8qIHJlc2VydmVkICovCisjZGVmaW5lIENSQU1GU19GTEFHX1NISUZURURfUk9PVF9PRkZTRVQJMHgwMDAwMDQwMAkvKiBzaGlmdGVkIHJvb3QgZnMgKi8KKworLyoKKyAqIFZhbGlkIHZhbHVlcyBpbiBzdXBlci5mbGFncy4gIEN1cnJlbnRseSB3ZSByZWZ1c2UgdG8gbW91bnQKKyAqIGlmIChmbGFncyAmIH5DUkFNRlNfU1VQUE9SVEVEX0ZMQUdTKS4gIE1heWJlIHRoYXQgc2hvdWxkIGJlCisgKiBjaGFuZ2VkIHRvIHRlc3Qgc3VwZXIuZnV0dXJlIGluc3RlYWQuCisgKi8KKyNkZWZpbmUgQ1JBTUZTX1NVUFBPUlRFRF9GTEFHUwkoIDB4MDAwMDAwZmYgXAorCQkJCXwgQ1JBTUZTX0ZMQUdfSE9MRVMgXAorCQkJCXwgQ1JBTUZTX0ZMQUdfV1JPTkdfU0lHTkFUVVJFIFwKKwkJCQl8IENSQU1GU19GTEFHX1NISUZURURfUk9PVF9PRkZTRVQgKQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jdWRhLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2N1ZGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWM4YmYwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jdWRhLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIERlZmluaXRpb25zIGZvciB0YWxraW5nIHRvIHRoZSBDVURBLiAgVGhlIENVREEgaXMgYSBtaWNyb2NvbnRyb2xsZXIKKyAqIHdoaWNoIGNvbnRyb2xzIHRoZSBBREIsIHN5c3RlbSBwb3dlciwgUlRDLCBhbmQgdmFyaW91cyBvdGhlciB0aGluZ3MuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzLgorICovCisKKy8qIENVREEgY29tbWFuZHMgKDJuZCBieXRlKSAqLworI2RlZmluZSBDVURBX1dBUk1fU1RBUlQJCTAKKyNkZWZpbmUgQ1VEQV9BVVRPUE9MTAkJMQorI2RlZmluZSBDVURBX0dFVF82ODA1X0FERFIJMgorI2RlZmluZSBDVURBX0dFVF9USU1FCQkzCisjZGVmaW5lIENVREFfR0VUX1BSQU0JCTcKKyNkZWZpbmUgQ1VEQV9TRVRfNjgwNV9BRERSCTgKKyNkZWZpbmUgQ1VEQV9TRVRfVElNRQkJOQorI2RlZmluZSBDVURBX1BPV0VSRE9XTgkJMHhhCisjZGVmaW5lIENVREFfUE9XRVJVUF9USU1FCTB4YgorI2RlZmluZSBDVURBX1NFVF9QUkFNCQkweGMKKyNkZWZpbmUgQ1VEQV9NU19SRVNFVAkJMHhkCisjZGVmaW5lIENVREFfU0VORF9ERkFDCQkweGUKKyNkZWZpbmUgQ1VEQV9SRVNFVF9TWVNURU0JMHgxMQorI2RlZmluZSBDVURBX1NFVF9JUEwJCTB4MTIKKyNkZWZpbmUgQ1VEQV9TRVRfQVVUT19SQVRFCTB4MTQKKyNkZWZpbmUgQ1VEQV9HRVRfQVVUT19SQVRFCTB4MTYKKyNkZWZpbmUgQ1VEQV9TRVRfREVWSUNFX0xJU1QJMHgxOQorI2RlZmluZSBDVURBX0dFVF9ERVZJQ0VfTElTVAkweDFhCisjZGVmaW5lIENVREFfR0VUX1NFVF9JSUMJMHgyMgorCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2N5Y2xhZGVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2N5Y2xhZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1ZTNjOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY3ljbGFkZXMuaApAQCAtMCwwICsxLDQ5MyBAQAorLyogJFJldmlzaW9uOiAzLjAgJCREYXRlOiAxOTk4LzExLzAyIDE0OjIwOjU5ICQKKyAqIGxpbnV4L2luY2x1ZGUvbGludXgvY3ljbGFkZXMuaAorICoKKyAqIFRoaXMgZmlsZSB3YXMgaW5pdGlhbGx5IHdyaXR0ZW4gYnkKKyAqIFJhbmRvbHBoIEJlbnRzb24gPGJlbnRzb25AZ3JpZWcuc2Vhc2x1Zy5vcmc+IGFuZCBpcyBtYWludGFpbmVkIGJ5CisgKiBJdmFuIFBhc3NvcyA8aXZhbkBjeWNsYWRlcy5jb20+LgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZ2VuZXJhbCBkZWZpbml0aW9ucyBmb3IgdGhlIGN5Y2xhZGVzLmMgZHJpdmVyCisgKiRMb2c6IGN5Y2xhZGVzLmgsdiAkCisgKlJldmlzaW9uIDMuMSAgMjAwMi8wMS8yOSAxMTozNjoxNiAgaGVucmlxdWUKKyAqYWRkZWQgdGhyb3R0bGUgZmllbGQgb24gc3RydWN0IGN5Y2xhZGVzX3BvcnQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUKKyAqcG9ydCBpcyB0aHJvdHRsZWQgb3Igbm90CisgKgorICpSZXZpc2lvbiAzLjEgIDIwMDAvMDQvMTkgMTg6NTI6NTIgIGl2YW4KKyAqY29udmVydGVkIGFkZHJlc3MgZmllbGRzIHRvIHVuc2lnbmVkIGxvbmcgYW5kIGFkZGVkIGZpZWxkcyBmb3IgcGh5c2ljYWwKKyAqYWRkcmVzc2VzIG9uIGN5Y2xhZGVzX2NhcmQgc3RydWN0dXJlOworICoKKyAqUmV2aXNpb24gMy4wICAxOTk4LzExLzAyIDE0OjIwOjU5ICBpdmFuCisgKmFkZGVkIG5wb3J0cyBmaWVsZCBvbiBjeWNsYWRlc19jYXJkIHN0cnVjdHVyZTsKKyAqCisgKlJldmlzaW9uIDIuNSAgMTk5OC8wOC8wMyAxNjo1NzowMSAgaXZhbgorICphZGRlZCBjeWNsYWRlc19pZGxlX3N0YXRzIHN0cnVjdHVyZTsKKyAqIAorICpSZXZpc2lvbiAyLjQgIDE5OTgvMDYvMDEgMTI6MDk6NTMgIGl2YW4KKyAqcmVtb3ZlZCBjbG9zaW5nX3dhaXQyIGZyb20gY3ljbGFkZXNfcG9ydCBzdHJ1Y3R1cmU7CisgKgorICpSZXZpc2lvbiAyLjMgIDE5OTgvMDMvMTYgMTg6MDE6MTIgIGl2YW4KKyAqY2hhbmdlcyBpbiB0aGUgY3ljbGFkZXNfcG9ydCBzdHJ1Y3R1cmUgdG8gZ2V0IGl0IGNsb3NlciB0byB0aGUgCisgKnN0YW5kYXJkIHNlcmlhbCBwb3J0IHN0cnVjdHVyZTsKKyAqYWRkZWQgY29uc3RhbnRzIGZvciBuZXcgaW9jdGxzOworICoKKyAqUmV2aXNpb24gMi4yICAxOTk4LzAyLzE3IDE2OjUwOjAwICBpdmFuCisgKmNoYW5nZXMgaW4gdGhlIGN5Y2xhZGVzX3BvcnQgc3RydWN0dXJlIChhZGRpdGlvbiBvZiBzaHV0ZG93bl93YWl0IGFuZCAKKyAqY2hpcF9yZXYgdmFyaWFibGVzKTsKKyAqYWRkZWQgY29uc3RhbnRzIGZvciBuZXcgaW9jdGxzIGFuZCBmb3IgQ0QxNDAwIHJldi4gbnVtYmVycy4KKyAqCisgKlJldmlzaW9uIDIuMQkxOTk3LzEwLzI0IDE2OjAzOjAwICBpdmFuCisgKmFkZGVkIHJmbG93ICh3aGljaCBhbGxvd3MgZW5hYmxpbmcgdGhlIENEMTQwMCBzcGVjaWFsIGZsb3cgY29udHJvbCAKKyAqZmVhdHVyZSkgYW5kIHJ0c2R0cl9pbnYgKHdoaWNoIGFsbG93cyBEVFIvUlRTIHBpbiBpbnZlcnNpb24pIHRvIAorICpjeWNsYWRlc19wb3J0IHN0cnVjdHVyZTsKKyAqYWRkZWQgQWxwaGEgc3VwcG9ydAorICoKKyAqUmV2aXNpb24gMi4wICAxOTk3LzA2LzMwIDEwOjMwOjAwICBpdmFuCisgKmFkZGVkIHNvbWUgbmV3IGRvb3JiZWxsIGNvbW1hbmQgY29uc3RhbnRzIHJlbGF0ZWQgdG8gSU9DVExXIGFuZAorICpVQVJUIGVycm9yIHNpZ25hbGluZworICoKKyAqUmV2aXNpb24gMS44ICAxOTk3LzA2LzAzIDE1OjMwOjAwICBpdmFuCisgKmFkZGVkIGNvbnN0YW50IFpGSVJNX0hMVAorICphZGRlZCBjb25zdGFudCBDeVBDSV9aZV93aW4gKCA9IDIgKiBDeV9QQ0lfWndpbikKKyAqCisgKlJldmlzaW9uIDEuNyAgMTk5Ny8wMy8yNiAxMDozMDowMCAgZGFuaWVsCisgKm5ldyBlbnRyaWVzIGF0IHRoZSBlbmQgb2YgY3ljbGFkZXNfcG9ydCBzdHJ1Y3QgdG8gcmVhbGxvY2F0ZQorICp2YXJpYWJsZXMgaWxsZWdhbGx5IGFsbG9jYXRlZCB3aXRoaW4gY2FyZCBtZW1vcnkuCisgKgorICpSZXZpc2lvbiAxLjYgIDE5OTYvMDkvMDkgMTg6MzU6MzAgIGJlbnRzb24KKyAqZm9sZCBpbiBjaGFuZ2VzIGZvciBDeWNsb20tWiAtLSBpbmNsdWRpbmcgc3RydWN0dXJlcyBmb3IKKyAqY29tbXVuaWNhdGluZyB3aXRoIGJvYXJkIGFzIHdlbGwgbW9kZXN0IGNoYW5nZXMgdG8gb3JpZ2luYWwKKyAqc3RydWN0dXJlcyB0byBzdXBwb3J0IG5ldyBmZWF0dXJlcy4KKyAqCisgKlJldmlzaW9uIDEuNSAgMTk5NS8xMS8xMyAyMToxMzozMSAgYmVudHNvbgorICpjaGFuZ2VzIHN1Z2dlc3RlZCBieSBNaWNoYWVsIENoYXN0YWluIDxtZWNAZHVyYWNlZi5zaG91dC5uZXQ+CisgKnRvIHN1cHBvcnQgdXNlIG9mIHRoaXMgZmlsZSBpbiBub24ta2VybmVsIGFwcGxpY2F0aW9ucworICoKKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfQ1lDTEFERVNfSAorI2RlZmluZSBfTElOVVhfQ1lDTEFERVNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGN5Y2xhZGVzX21vbml0b3IgeworICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBpbnRfY291bnQ7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGNoYXJfY291bnQ7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGNoYXJfbWF4OworICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBjaGFyX2xhc3Q7Cit9OworCisvKgorICogVGhlc2Ugc3RhdHMgYWxsIHJlZmxlY3QgYWN0aXZpdHkgc2luY2UgdGhlIGRldmljZSB3YXMgbGFzdCBpbml0aWFsaXplZC4KKyAqIChpLmUuLCBzaW5jZSB0aGUgcG9ydCB3YXMgb3BlbmVkIHdpdGggbm8gb3RoZXIgcHJvY2Vzc2VzIGFscmVhZHkgaGF2aW5nIGl0CisgKiBvcGVuKQorICovCitzdHJ1Y3QgY3ljbGFkZXNfaWRsZV9zdGF0cyB7CisgICAgX19rZXJuZWxfdGltZV90IGluX3VzZTsJLyogVGltZSBkZXZpY2UgaGFzIGJlZW4gaW4gdXNlIChzZWNzKSAqLworICAgIF9fa2VybmVsX3RpbWVfdCByZWN2X2lkbGU7CS8qIFRpbWUgc2luY2UgbGFzdCBjaGFyIHJlY2VpdmVkIChzZWNzKSAqLworICAgIF9fa2VybmVsX3RpbWVfdCB4bWl0X2lkbGU7CS8qIFRpbWUgc2luY2UgbGFzdCBjaGFyIHRyYW5zbWl0dGVkIChzZWNzKSAqLworICAgIHVuc2lnbmVkIGxvbmcgIHJlY3ZfYnl0ZXM7CS8qIEJ5dGVzIHJlY2VpdmVkICovCisgICAgdW5zaWduZWQgbG9uZyAgeG1pdF9ieXRlczsJLyogQnl0ZXMgdHJhbnNtaXR0ZWQgKi8KKyAgICB1bnNpZ25lZCBsb25nICBvdmVycnVuczsJLyogSW5wdXQgb3ZlcnJ1bnMgKi8KKyAgICB1bnNpZ25lZCBsb25nICBmcmFtZV9lcnJzOwkvKiBJbnB1dCBmcmFtaW5nIGVycm9ycyAqLworICAgIHVuc2lnbmVkIGxvbmcgIHBhcml0eV9lcnJzOwkvKiBJbnB1dCBwYXJpdHkgZXJyb3JzICovCit9OworCisjZGVmaW5lIENZQ0xBREVTX01BR0lDICAweDQzNTkKKworI2RlZmluZSBDWUdFVE1PTiAgICAgICAgICAgICAgICAweDQzNTkwMQorI2RlZmluZSBDWUdFVFRIUkVTSCAgICAgICAgICAgICAweDQzNTkwMgorI2RlZmluZSBDWVNFVFRIUkVTSCAgICAgICAgICAgICAweDQzNTkwMworI2RlZmluZSBDWUdFVERFRlRIUkVTSCAgICAgICAgICAweDQzNTkwNAorI2RlZmluZSBDWVNFVERFRlRIUkVTSCAgICAgICAgICAweDQzNTkwNQorI2RlZmluZSBDWUdFVFRJTUVPVVQgICAgICAgICAgICAweDQzNTkwNgorI2RlZmluZSBDWVNFVFRJTUVPVVQgICAgICAgICAgICAweDQzNTkwNworI2RlZmluZSBDWUdFVERFRlRJTUVPVVQgICAgICAgICAweDQzNTkwOAorI2RlZmluZSBDWVNFVERFRlRJTUVPVVQgICAgICAgICAweDQzNTkwOQorI2RlZmluZSBDWVNFVFJGTE9XCQkweDQzNTkwYQorI2RlZmluZSBDWUdFVFJGTE9XCQkweDQzNTkwYgorI2RlZmluZSBDWVNFVFJUU0RUUl9JTlYJCTB4NDM1OTBjCisjZGVmaW5lIENZR0VUUlRTRFRSX0lOVgkJMHg0MzU5MGQKKyNkZWZpbmUgQ1laU0VUUE9MTENZQ0xFCQkweDQzNTkwZQorI2RlZmluZSBDWVpHRVRQT0xMQ1lDTEUJCTB4NDM1OTBmCisjZGVmaW5lIENZR0VUQ0QxNDAwVkVSCQkweDQzNTkxMAorI2RlZmluZQlDWVNFVFdBSVQJCTB4NDM1OTEyCisjZGVmaW5lCUNZR0VUV0FJVAkJMHg0MzU5MTMKKworLyoqKioqKioqKioqKioqKiBDWUNMT00tWiBBRERJVElPTlMgKioqKioqKioqKioqKioqLworCisjZGVmaW5lIENaSU9DICAgICAgICAgICAoJ00nIDw8IDgpCisjZGVmaW5lIENaX05CT0FSRFMgICAgICAoQ1pJT0N8MHhmYSkKKyNkZWZpbmUgQ1pfQk9PVF9TVEFSVCAgIChDWklPQ3wweGZiKQorI2RlZmluZSBDWl9CT09UX0RBVEEgICAgKENaSU9DfDB4ZmMpCisjZGVmaW5lIENaX0JPT1RfRU5EICAgICAoQ1pJT0N8MHhmZCkKKyNkZWZpbmUgQ1pfVEVTVCAgICAgICAgIChDWklPQ3wweGZlKQorCisjZGVmaW5lIENaX0RFRl9QT0xMCShIWi8yNSkKKworI2RlZmluZSBNQVhfQk9BUkQgICAgICAgNCAgICAgICAvKiBNYXggbnVtYmVyIG9mIGJvYXJkcyAqLworI2RlZmluZSBNQVhfREVWICAgICAgICAgMjU2ICAgICAvKiBNYXggbnVtYmVyIG9mIHBvcnRzIHRvdGFsICovCisjZGVmaW5lCUNZWl9NQVhfU1BFRUQJOTIxNjAwCisKKyNkZWZpbmUJQ1laX0ZJRk9fU0laRQkxNgorCisjZGVmaW5lIENZWl9CT09UX05XT1JEUyAweDEwMAorc3RydWN0IENZWl9CT09UX0NUUkwgeworICAgICAgICB1bnNpZ25lZCBzaG9ydCAgbmJvYXJkOworICAgICAgICBpbnQgICAgICAgICAgICAgc3RhdHVzW01BWF9CT0FSRF07CisgICAgICAgIGludCAgICAgICAgICAgICBuY2hhbm5lbFtNQVhfQk9BUkRdOworICAgICAgICBpbnQgICAgICAgICAgICAgZndfcmV2W01BWF9CT0FSRF07CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICBvZmZzZXQ7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICBkYXRhW0NZWl9CT09UX05XT1JEU107Cit9OworCisKKyNpZm5kZWYgRFBfV0lORE9XX1NJWkUKKy8qCisgKglNZW1vcnkgV2luZG93IFNpemVzCisgKi8KKworI2RlZmluZQlEUF9XSU5ET1dfU0laRQkJKDB4MDAwODAwMDApCS8qIHdpbmRvdyBzaXplIDUxMiBLYiAqLworI2RlZmluZQlaRV9EUF9XSU5ET1dfU0laRQkoMHgwMDEwMDAwMCkJLyogd2luZG93IHNpemUgMSBNYiAoWmUgYW5kCisJCQkJCQkgIDhabyBWLjIgKi8KKyNkZWZpbmUJQ1RSTF9XSU5ET1dfU0laRQkoMHgwMDAwMDA4MCkJLyogcnVudGltZSByZWdzIDEyOCBieXRlcyAqLworCisvKgorICoJQ1VTVE9NX1JFRyAtIEN5Y2xvbS1aL1BDSSBDdXN0b20gUmVnaXN0ZXJzIFNldC4gVGhlIGRyaXZlcgorICoJbm9ybWFsbHkgd2lsbCBhY2Nlc3Mgb25seSBpbnRlcmVzdGVkIG9uIHRoZSBmcGdhX2lkLCBmcGdhX3ZlcnNpb24sCisgKglzdGFydF9jcHUgYW5kIHN0b3BfY3B1LgorICovCisKK3N0cnVjdAlDVVNUT01fUkVHIHsKKwlfX3UzMglmcGdhX2lkOwkJLyogRlBHQSBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAqLworCV9fdTMyCWZwZ2FfdmVyc2lvbjsJCS8qIEZQR0EgVmVyc2lvbiBOdW1iZXIgUmVnaXN0ZXIgKi8KKwlfX3UzMgljcHVfc3RhcnQ7CQkvKiBDUFUgc3RhcnQgUmVnaXN0ZXIgKHdyaXRlKSAqLworCV9fdTMyCWNwdV9zdG9wOwkJLyogQ1BVIHN0b3AgUmVnaXN0ZXIgKHdyaXRlKSAqLworCV9fdTMyCW1pc2NfcmVnOwkJLyogTWlzY2VsbGFuZW91cyBSZWdpc3RlciAqLworCV9fdTMyCWlkdF9tb2RlOwkJLyogSURUIG1vZGUgUmVnaXN0ZXIgKi8KKwlfX3UzMgl1YXJ0X2lycV9zdGF0dXM7CS8qIFVBUlQgSVJRIHN0YXR1cyBSZWdpc3RlciAqLworCV9fdTMyCWNsZWFyX3RpbWVyMF9pcnE7CS8qIENsZWFyIHRpbWVyIGludGVycnVwdCBSZWdpc3RlciAqLworCV9fdTMyCWNsZWFyX3RpbWVyMV9pcnE7CS8qIENsZWFyIHRpbWVyIGludGVycnVwdCBSZWdpc3RlciAqLworCV9fdTMyCWNsZWFyX3RpbWVyMl9pcnE7CS8qIENsZWFyIHRpbWVyIGludGVycnVwdCBSZWdpc3RlciAqLworCV9fdTMyCXRlc3RfcmVnaXN0ZXI7CQkvKiBUZXN0IFJlZ2lzdGVyICovCisJX191MzIJdGVzdF9jb3VudDsJCS8qIFRlc3QgQ291bnQgUmVnaXN0ZXIgKi8KKwlfX3UzMgl0aW1lcl9zZWxlY3Q7CQkvKiBUaW1lciBzZWxlY3QgcmVnaXN0ZXIgKi8KKwlfX3UzMglwcl91YXJ0X2lycV9zdGF0dXM7CS8qIFByaW9yaXRpemVkIFVBUlQgSVJRIHN0YXQgUmVnICovCisJX191MzIJcmFtX3dhaXRfc3RhdGU7CQkvKiBSQU0gd2FpdC1zdGF0ZSBSZWdpc3RlciAqLworCV9fdTMyCXVhcnRfd2FpdF9zdGF0ZTsJLyogVUFSVCB3YWl0LXN0YXRlIFJlZ2lzdGVyICovCisJX191MzIJdGltZXJfd2FpdF9zdGF0ZTsJLyogdGltZXIgd2FpdC1zdGF0ZSBSZWdpc3RlciAqLworCV9fdTMyCWFja193YWl0X3N0YXRlOwkJLyogQUNLIHdhaXQgU3RhdGUgUmVnaXN0ZXIgKi8KK307CisKKy8qCisgKglSVU5USU1FXzkwNjAgLSBQTFggUENJOTA2MEVTIGxvY2FsIGNvbmZpZ3VyYXRpb24gYW5kIHNoYXJlZCBydW50aW1lCisgKglyZWdpc3RlcnMuIFRoaXMgc3RydWN0dXJlIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgOTA2MCByZWdpc3RlcnMKKyAqCShtZW1vcnkgbWFwcGVkKS4KKyAqLworCitzdHJ1Y3QgUlVOVElNRV85MDYwIHsKKwlfX3UzMglsb2NfYWRkcl9yYW5nZTsJLyogMDBoIC0gTG9jYWwgQWRkcmVzcyBSYW5nZSAqLworCV9fdTMyCWxvY19hZGRyX2Jhc2U7CS8qIDA0aCAtIExvY2FsIEFkZHJlc3MgQmFzZSAqLworCV9fdTMyCWxvY19hcmJpdHI7CS8qIDA4aCAtIExvY2FsIEFyYml0cmF0aW9uICovCisJX191MzIJZW5kaWFuX2Rlc2NyOwkvKiAwQ2ggLSBCaWcvTGl0dGxlIEVuZGlhbiBEZXNjcmlwdG9yICovCisJX191MzIJbG9jX3JvbV9yYW5nZTsJLyogMTBoIC0gTG9jYWwgUk9NIFJhbmdlICovCisJX191MzIJbG9jX3JvbV9iYXNlOwkvKiAxNGggLSBMb2NhbCBST00gQmFzZSAqLworCV9fdTMyCWxvY19idXNfZGVzY3I7CS8qIDE4aCAtIExvY2FsIEJ1cyBkZXNjcmlwdG9yICovCisJX191MzIJbG9jX3JhbmdlX21zdDsJLyogMUNoIC0gTG9jYWwgUmFuZ2UgZm9yIE1hc3RlciB0byBQQ0kgKi8KKwlfX3UzMglsb2NfYmFzZV9tc3Q7CS8qIDIwaCAtIExvY2FsIEJhc2UgZm9yIE1hc3RlciBQQ0kgKi8KKwlfX3UzMglsb2NfcmFuZ2VfaW87CS8qIDI0aCAtIExvY2FsIFJhbmdlIGZvciBNYXN0ZXIgSU8gKi8KKwlfX3UzMglwY2lfYmFzZV9tc3Q7CS8qIDI4aCAtIFBDSSBCYXNlIGZvciBNYXN0ZXIgUENJICovCisJX191MzIJcGNpX2NvbmZfaW87CS8qIDJDaCAtIFBDSSBjb25maWd1cmF0aW9uIGZvciBNYXN0ZXIgSU8gKi8KKwlfX3UzMglmaWxsZXIxOwkvKiAzMGggKi8KKwlfX3UzMglmaWxsZXIyOwkvKiAzNGggKi8KKwlfX3UzMglmaWxsZXIzOwkvKiAzOGggKi8KKwlfX3UzMglmaWxsZXI0OwkvKiAzQ2ggKi8KKwlfX3UzMgltYWlsX2JveF8wOwkvKiA0MGggLSBNYWlsIEJveCAwICovCisJX191MzIJbWFpbF9ib3hfMTsJLyogNDRoIC0gTWFpbCBCb3ggMSAqLworCV9fdTMyCW1haWxfYm94XzI7CS8qIDQ4aCAtIE1haWwgQm94IDIgKi8KKwlfX3UzMgltYWlsX2JveF8zOwkvKiA0Q2ggLSBNYWlsIEJveCAzICovCisJX191MzIJZmlsbGVyNTsJLyogNTBoICovCisJX191MzIJZmlsbGVyNjsJLyogNTRoICovCisJX191MzIJZmlsbGVyNzsJLyogNThoICovCisJX191MzIJZmlsbGVyODsJLyogNUNoICovCisJX191MzIJcGNpX2Rvb3JiZWxsOwkvKiA2MGggLSBQQ0kgdG8gTG9jYWwgRG9vcmJlbGwgKi8KKwlfX3UzMglsb2NfZG9vcmJlbGw7CS8qIDY0aCAtIExvY2FsIHRvIFBDSSBEb29yYmVsbCAqLworCV9fdTMyCWludHJfY3RybF9zdGF0OwkvKiA2OGggLSBJbnRlcnJ1cHQgQ29udHJvbC9TdGF0dXMgKi8KKwlfX3UzMglpbml0X2N0cmw7CS8qIDZDaCAtIEVFUFJPTSBjb250cm9sLCBJbml0IENvbnRyb2wsIGV0YyAqLworfTsKKworLyogVmFsdWVzIGZvciB0aGUgTG9jYWwgQmFzZSBBZGRyZXNzIHJlLW1hcCByZWdpc3RlciAqLworCisjZGVmaW5lCVdJTl9SQU0JCTB4MDAwMDAwMDFMCS8qIHNldCB0aGUgc2xpZGluZyB3aW5kb3cgdG8gUkFNICovCisjZGVmaW5lCVdJTl9DUkVHCTB4MTQwMDAwMDFMCS8qIHNldCB0aGUgd2luZG93IHRvIGN1c3RvbSBSZWdpc3RlcnMgKi8KKworLyogVmFsdWVzIHRpbWVyIHNlbGVjdCByZWdpc3RlcnMgKi8KKworI2RlZmluZQlUSU1FUl9CWV8xTQkweDAwCQkvKiBjbG9jayBkaXZpZGVkIGJ5IDFNICovCisjZGVmaW5lCVRJTUVSX0JZXzI1NksJMHgwMQkJLyogY2xvY2sgZGl2aWRlZCBieSAyNTZrICovCisjZGVmaW5lCVRJTUVSX0JZXzEyOEsJMHgwMgkJLyogY2xvY2sgZGl2aWRlZCBieSAxMjhrICovCisjZGVmaW5lCVRJTUVSX0JZXzMySwkweDAzCQkvKiBjbG9jayBkaXZpZGVkIGJ5IDMyayAqLworCisvKioqKioqKioqKioqKioqKioqICoqKioqKioqKioqKioqKioqKiAqKioqKioqKioqKioqKioqKioqLworI2VuZGlmCisKKyNpZm5kZWYgWkZJUk1fSUQKKy8qICNpbmNsdWRlICJ6ZndpbnQuaCIgKi8KKy8qKioqKioqKioqKioqKioqKiogKioqKioqKioqKioqKioqKioqICoqKioqKioqKioqKioqKioqKiovCisvKgorICoJVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgaW50ZXJmYWNpbmcgd2l0aCB0aGUKKyAqCUN5Y2xvbS1aIFpGSVJNIEZpcm13YXJlLgorICovCisKKy8qIEdlbmVyYWwgQ29uc3RhbnQgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZQlNQVhfQ0hBTgk2NAkJLyogbWF4IG51bWJlciBvZiBjaGFubmVscyBwZXIgYm9hcmQgKi8KKworLyogZmlybXdhcmUgaWQgc3RydWN0dXJlIChzZXQgYWZ0ZXIgYm9vdCkgKi8KKworI2RlZmluZSBJRF9BRERSRVNTCTB4MDAwMDAxODBMCS8qIHNpZ25hdHVyZS9wb2ludGVyIGFkZHJlc3MgKi8KKyNkZWZpbmUJWkZJUk1fSUQJMHg1NTU3NDY1QUwJLyogWkZJUk0vVSBzaWduYXR1cmUgKi8KKyNkZWZpbmUJWkZJUk1fSExUCTB4NTk1MDVCNUNMCS8qIFpGSVJNIG5lZWRzIGV4dGVybmFsIHBvd2VyIHN1cHBseSAqLworI2RlZmluZQlaRklSTV9SU1QJMHg1NjA0MDY3NEwJLyogUlNUIHNpZ25hbCAoZHVlIHRvIEZXIHJlc2V0KSAqLworCisjZGVmaW5lCVpGX1RJTkFDVF9ERUYJMTAwMAkJLyogZGVmYXVsdCBpbmFjdGl2aXR5IHRpbWVvdXQgCisJCQkJCSAgICgxMDAwIG1zKSAqLworI2RlZmluZQlaRl9USU5BQ1QJWkZfVElOQUNUX0RFRgorCitzdHJ1Y3QJRklSTV9JRCB7CisJX191MzIJc2lnbmF0dXJlOwkJLyogWkZJUk0vVSBzaWduYXR1cmUgKi8KKwlfX3UzMgl6ZndjdHJsX2FkZHI7CQkvKiBwb2ludGVyIHRvIFpGV19DVFJMIHN0cnVjdHVyZSAqLworfTsKKworLyogT3AuIFN5c3RlbSBpZCAqLworCisjZGVmaW5lCUNfT1NfTElOVVgJMHgwMDAwMDAzMAkvKiBnZW5lcmljIExpbnV4IHN5c3RlbSAqLworCisvKiBjaGFubmVsIG9wX21vZGUgKi8KKworI2RlZmluZQlDX0NIX0RJU0FCTEUJMHgwMDAwMDAwMAkvKiBjaGFubmVsIGlzIGRpc2FibGVkICovCisjZGVmaW5lCUNfQ0hfVFhFTkFCTEUJMHgwMDAwMDAwMQkvKiBjaGFubmVsIFR4IGVuYWJsZWQgKi8KKyNkZWZpbmUJQ19DSF9SWEVOQUJMRQkweDAwMDAwMDAyCS8qIGNoYW5uZWwgUnggZW5hYmxlZCAqLworI2RlZmluZQlDX0NIX0VOQUJMRQkweDAwMDAwMDAzCS8qIGNoYW5uZWwgVHgvUnggZW5hYmxlZCAqLworI2RlZmluZQlDX0NIX0xPT1BCQUNLCTB4MDAwMDAwMDQJLyogTG9vcGJhY2sgbW9kZSAqLworCisvKiBjb21tX3Bhcml0eSAtIHBhcml0eSAqLworCisjZGVmaW5lCUNfUFJfTk9ORQkweDAwMDAwMDAwCS8qIE5vbmUgKi8KKyNkZWZpbmUJQ19QUl9PREQJMHgwMDAwMDAwMQkvKiBPZGQgKi8KKyNkZWZpbmUgQ19QUl9FVkVOCTB4MDAwMDAwMDIJLyogRXZlbiAqLworI2RlZmluZSBDX1BSX01BUksJMHgwMDAwMDAwNAkvKiBNYXJrICovCisjZGVmaW5lIENfUFJfU1BBQ0UJMHgwMDAwMDAwOAkvKiBTcGFjZSAqLworI2RlZmluZSBDX1BSX1BBUklUWQkweDAwMDAwMGZmCisKKyNkZWZpbmUJQ19QUl9ESVNDQVJECTB4MDAwMDAxMDAJLyogZGlzY2FyZCBjaGFyIHdpdGggZnJhbWUvcGFyIGVycm9yICovCisjZGVmaW5lIENfUFJfSUdOT1JFCTB4MDAwMDAyMDAJLyogaWdub3JlIGZyYW1lL3BhciBlcnJvciAqLworCisvKiBjb21tX2RhdGFfbCAtIGRhdGEgbGVuZ3RoIGFuZCBzdG9wIGJpdHMgKi8KKworI2RlZmluZSBDX0RMX0NTNQkweDAwMDAwMDAxCisjZGVmaW5lIENfRExfQ1M2CTB4MDAwMDAwMDIKKyNkZWZpbmUgQ19ETF9DUzcJMHgwMDAwMDAwNAorI2RlZmluZSBDX0RMX0NTOAkweDAwMDAwMDA4CisjZGVmaW5lCUNfRExfQ1MJCTB4MDAwMDAwMGYKKyNkZWZpbmUgQ19ETF8xU1RPUAkweDAwMDAwMDEwCisjZGVmaW5lIENfRExfMTVTVE9QCTB4MDAwMDAwMjAKKyNkZWZpbmUgQ19ETF8yU1RPUAkweDAwMDAwMDQwCisjZGVmaW5lCUNfRExfU1RPUAkweDAwMDAwMGYwCisKKy8qIGludGVycnVwdCBlbmFibGluZy9zdGF0dXMgKi8KKworI2RlZmluZQlDX0lOX0RJU0FCTEUJMHgwMDAwMDAwMAkvKiB6ZXJvLCBkaXNhYmxlIGludGVycnVwdHMgKi8KKyNkZWZpbmUJQ19JTl9UWEJFTVBUWQkweDAwMDAwMDAxCS8qIHR4IGJ1ZmZlciBlbXB0eSAqLworI2RlZmluZQlDX0lOX1RYTE9XV00JMHgwMDAwMDAwMgkvKiB0eCBidWZmZXIgYmVsb3cgTFdNICovCisjZGVmaW5lCUNfSU5fUlhISVdNCTB4MDAwMDAwMTAJLyogcnggYnVmZmVyIGFib3ZlIEhXTSAqLworI2RlZmluZQlDX0lOX1JYTk5EVAkweDAwMDAwMDIwCS8qIHJ4IG5vIG5ldyBkYXRhIHRpbWVvdXQgKi8KKyNkZWZpbmUJQ19JTl9NRENECTB4MDAwMDAxMDAJLyogbW9kZW0gRENEIGNoYW5nZSAqLworI2RlZmluZQlDX0lOX01EU1IJMHgwMDAwMDIwMAkvKiBtb2RlbSBEU1IgY2hhbmdlICovCisjZGVmaW5lCUNfSU5fTVJJCTB4MDAwMDA0MDAJLyogbW9kZW0gUkkgY2hhbmdlICovCisjZGVmaW5lCUNfSU5fTUNUUwkweDAwMDAwODAwCS8qIG1vZGVtIENUUyBjaGFuZ2UgKi8KKyNkZWZpbmUJQ19JTl9SWEJSSwkweDAwMDAxMDAwCS8qIEJyZWFrIHJlY2VpdmVkICovCisjZGVmaW5lCUNfSU5fUFJfRVJST1IJMHgwMDAwMjAwMAkvKiBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUJQ19JTl9GUl9FUlJPUgkweDAwMDA0MDAwCS8qIGZyYW1lIGVycm9yICovCisjZGVmaW5lIENfSU5fT1ZSX0VSUk9SICAweDAwMDA4MDAwICAgICAgLyogb3ZlcnJ1biBlcnJvciAqLworI2RlZmluZSBDX0lOX1JYT0ZMCTB4MDAwMTAwMDAgICAgICAvKiBSWCBidWZmZXIgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgQ19JTl9JT0NUTFcJMHgwMDAyMDAwMCAgICAgIC8qIEkvTyBjb250cm9sIHcvIHdhaXQgKi8KKyNkZWZpbmUgQ19JTl9NUlRTCTB4MDAwNDAwMDAJLyogbW9kZW0gUlRTIGRyb3AgKi8KKyNkZWZpbmUgQ19JTl9JQ0hBUgkweDAwMDgwMDAwCisgCisvKiBmbG93IGNvbnRyb2wgKi8KKworI2RlZmluZQlDX0ZMX09YWAkweDAwMDAwMDAxCS8qIG91dHB1dCBYb24vWG9mZiBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUJQ19GTF9JWFgJMHgwMDAwMDAwMgkvKiBvdXRwdXQgWG9uL1hvZmYgZmxvdyBjb250cm9sICovCisjZGVmaW5lIENfRkxfT0lYQU5ZCTB4MDAwMDAwMDQJLyogb3V0cHV0IFhvbi9Yb2ZmIChhbnkgeG9uKSAqLworI2RlZmluZQlDX0ZMX1NXRkxPVwkweDAwMDAwMDBmCisKKy8qIGZsb3cgc3RhdHVzICovCisKKyNkZWZpbmUJQ19GU19UWElETEUJMHgwMDAwMDAwMAkvKiBubyBUeCBkYXRhIGluIHRoZSBidWZmZXIgb3IgVUFSVCAqLworI2RlZmluZQlDX0ZTX1NFTkRJTkcJMHgwMDAwMDAwMQkvKiBVQVJUIGlzIHNlbmRpbmcgZGF0YSAqLworI2RlZmluZQlDX0ZTX1NXRkxPVwkweDAwMDAwMDAyCS8qIFR4IGlzIHN0b3BwZWQgYnkgcmVjZWl2ZWQgWG9mZiAqLworCisvKiByc19jb250cm9sL3JzX3N0YXR1cyBSUy0yMzIgc2lnbmFscyAqLworCisjZGVmaW5lIENfUlNfUEFSQU0JMHg4MDAwMDAwMAkvKiBJbmRpY2F0ZXMgcHJlc2VuY2Ugb2YgcGFyYW1ldGVyIGluIAorCQkJCQkgICBJT0NUTE0gY29tbWFuZCAqLworI2RlZmluZQlDX1JTX1JUUwkweDAwMDAwMDAxCS8qIFJUUyAqLworI2RlZmluZQlDX1JTX0RUUgkweDAwMDAwMDA0CS8qIERUUiAqLworI2RlZmluZQlDX1JTX0RDRAkweDAwMDAwMTAwCS8qIENEICovCisjZGVmaW5lCUNfUlNfRFNSCTB4MDAwMDAyMDAJLyogRFNSICovCisjZGVmaW5lCUNfUlNfUkkJCTB4MDAwMDA0MDAJLyogUkkgKi8KKyNkZWZpbmUJQ19SU19DVFMJMHgwMDAwMDgwMAkvKiBDVFMgKi8KKworLyogY29tbWFuZHMgSG9zdCA8LT4gQm9hcmQgKi8KKworI2RlZmluZQlDX0NNX1JFU0VUCTB4MDEJCS8qIHJlc2V0L2ZsdXNoIGJ1ZmZlcnMgKi8KKyNkZWZpbmUJQ19DTV9JT0NUTAkweDAyCQkvKiByZS1yZWFkIENIX0NUUkwgKi8KKyNkZWZpbmUJQ19DTV9JT0NUTFcJMHgwMwkJLyogcmUtcmVhZCBDSF9DVFJMLCBpbnRyIHdoZW4gZG9uZSAqLworI2RlZmluZQlDX0NNX0lPQ1RMTQkweDA0CQkvKiBSUy0yMzIgb3V0cHV0cyBjaGFuZ2UgKi8KKyNkZWZpbmUJQ19DTV9TRU5EWE9GRgkweDEwCQkvKiBzZW5kIFhvZmYgKi8KKyNkZWZpbmUJQ19DTV9TRU5EWE9OCTB4MTEJCS8qIHNlbmQgWG9uICovCisjZGVmaW5lIENfQ01fQ0xGTE9XCTB4MTIJCS8qIENsZWFyIGZsb3cgY29udHJvbCAocmVzdW1lKSAqLworI2RlZmluZQlDX0NNX1NFTkRCUksJMHg0MQkJLyogc2VuZCBicmVhayAqLworI2RlZmluZQlDX0NNX0lOVEJBQ0sJMHg0MgkJLyogSW50ZXJydXB0IGJhY2sgKi8KKyNkZWZpbmUJQ19DTV9TRVRfQlJFQUsJMHg0MwkJLyogVHggYnJlYWsgb24gKi8KKyNkZWZpbmUJQ19DTV9DTFJfQlJFQUsJMHg0NAkJLyogVHggYnJlYWsgb2ZmICovCisjZGVmaW5lCUNfQ01fQ01EX0RPTkUJMHg0NQkJLyogUHJldmlvdXMgY29tbWFuZCBkb25lICovCisjZGVmaW5lIENfQ01fSU5UQkFDSzIJMHg0NgkJLyogQWx0ZXJuYXRlIEludGVycnVwdCBiYWNrICovCisjZGVmaW5lCUNfQ01fVElOQUNUCTB4NTEJCS8qIHNldCBpbmFjdGl2aXR5IGRldGVjdGlvbiAqLworI2RlZmluZQlDX0NNX0lSUV9FTkJMCTB4NTIJCS8qIGVuYWJsZSBnZW5lcmF0aW9uIG9mIGludGVycnVwdHMgKi8KKyNkZWZpbmUJQ19DTV9JUlFfRFNCTAkweDUzCQkvKiBkaXNhYmxlIGdlbmVyYXRpb24gb2YgaW50ZXJydXB0cyAqLworI2RlZmluZQlDX0NNX0FDS19FTkJMCTB4NTQJCS8qIGVuYWJsZSBhY2tub3dsZWRnZWQgaW50ZXJydXB0IG1vZGUgKi8KKyNkZWZpbmUJQ19DTV9BQ0tfRFNCTAkweDU1CQkvKiBkaXNhYmxlIGFja25vd2xlZGdlZCBpbnRyIG1vZGUgKi8KKyNkZWZpbmUJQ19DTV9GTFVTSF9SWAkweDU2CQkvKiBmbHVzaGVzIFJ4IGJ1ZmZlciAqLworI2RlZmluZQlDX0NNX0ZMVVNIX1RYCTB4NTcJCS8qIGZsdXNoZXMgVHggYnVmZmVyICovCisjZGVmaW5lIENfQ01fUV9FTkFCTEUJMHg1OAkJLyogZW5hYmxlcyBxdWV1ZSBhY2Nlc3MgZnJvbSB0aGUgCisJCQkJCSAgIGRyaXZlciAqLworI2RlZmluZSBDX0NNX1FfRElTQUJMRSAgMHg1OSAgICAgICAgICAgIC8qIGRpc2FibGVzIHF1ZXVlIGFjY2VzcyBmcm9tIHRoZSAKKwkJCQkJICAgZHJpdmVyICovCisKKyNkZWZpbmUJQ19DTV9UWEJFTVBUWQkweDYwCQkvKiBUeCBidWZmZXIgaXMgZW1wdHkgKi8KKyNkZWZpbmUJQ19DTV9UWExPV1dNCTB4NjEJCS8qIFR4IGJ1ZmZlciBsb3cgd2F0ZXIgbWFyayAqLworI2RlZmluZQlDX0NNX1JYSElXTQkweDYyCQkvKiBSeCBidWZmZXIgaGlnaCB3YXRlciBtYXJrICovCisjZGVmaW5lCUNfQ01fUlhOTkRUCTB4NjMJCS8qIHJ4IG5vIG5ldyBkYXRhIHRpbWVvdXQgKi8KKyNkZWZpbmUJQ19DTV9UWEZFTVBUWQkweDY0CisjZGVmaW5lCUNfQ01fSUNIQVIJMHg2NQorI2RlZmluZQlDX0NNX01EQ0QJMHg3MAkJLyogbW9kZW0gRENEIGNoYW5nZSAqLworI2RlZmluZQlDX0NNX01EU1IJMHg3MQkJLyogbW9kZW0gRFNSIGNoYW5nZSAqLworI2RlZmluZQlDX0NNX01SSQkweDcyCQkvKiBtb2RlbSBSSSBjaGFuZ2UgKi8KKyNkZWZpbmUJQ19DTV9NQ1RTCTB4NzMJCS8qIG1vZGVtIENUUyBjaGFuZ2UgKi8KKyNkZWZpbmUgQ19DTV9NUlRTCTB4NzQJCS8qIG1vZGVtIFJUUyBkcm9wICovCisjZGVmaW5lCUNfQ01fUlhCUksJMHg4NAkJLyogQnJlYWsgcmVjZWl2ZWQgKi8KKyNkZWZpbmUJQ19DTV9QUl9FUlJPUgkweDg1CQkvKiBQYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUJQ19DTV9GUl9FUlJPUgkweDg2CQkvKiBGcmFtZSBlcnJvciAqLworI2RlZmluZSBDX0NNX09WUl9FUlJPUiAgMHg4NyAgICAgICAgICAgIC8qIE92ZXJydW4gZXJyb3IgKi8KKyNkZWZpbmUgQ19DTV9SWE9GTAkweDg4ICAgICAgICAgICAgLyogUlggYnVmZmVyIG92ZXJmbG93ICovCisjZGVmaW5lCUNfQ01fQ01ERVJST1IJMHg5MAkJLyogY29tbWFuZCBlcnJvciAqLworI2RlZmluZQlDX0NNX0ZBVEFMCTB4OTEJCS8qIGZhdGFsIGVycm9yICovCisjZGVmaW5lCUNfQ01fSFdfUkVTRVQJMHg5MgkJLyogcmVzZXQgYm9hcmQgKi8KKworLyoKKyAqCUNIX0NUUkwgLSBUaGlzIHBlciBwb3J0IHN0cnVjdHVyZSBjb250YWlucyBhbGwgcGFyYW1ldGVycworICoJdGhhdCBjb250cm9sIGFuIHNwZWNpZmljIHBvcnQuIEl0IGNhbiBiZSBzZWVuIGFzIHRoZQorICoJY29uZmlndXJhdGlvbiByZWdpc3RlcnMgb2YgYSAic3VwZXItc2VyaWFsLWNvbnRyb2xsZXIiLgorICovCisKK3N0cnVjdCBDSF9DVFJMIHsKKwlfX3UzMglvcF9tb2RlOwkvKiBvcGVyYXRpb24gbW9kZSAqLworCV9fdTMyCWludHJfZW5hYmxlOwkvKiBpbnRlcnJ1cHQgbWFza2luZyAqLworCV9fdTMyCXN3X2Zsb3c7CS8qIFNXIGZsb3cgY29udHJvbCAqLworCV9fdTMyCWZsb3dfc3RhdHVzOwkvKiBvdXRwdXQgZmxvdyBzdGF0dXMgKi8KKwlfX3UzMgljb21tX2JhdWQ7CS8qIGJhdWQgcmF0ZSAgLSBudW1lcmljYWxseSBzcGVjaWZpZWQgKi8KKwlfX3UzMgljb21tX3Bhcml0eTsJLyogcGFyaXR5ICovCisJX191MzIJY29tbV9kYXRhX2w7CS8qIGRhdGEgbGVuZ3RoL3N0b3AgKi8KKwlfX3UzMgljb21tX2ZsYWdzOwkvKiBvdGhlciBmbGFncyAqLworCV9fdTMyCWh3X2Zsb3c7CS8qIEhXIGZsb3cgY29udHJvbCAqLworCV9fdTMyCXJzX2NvbnRyb2w7CS8qIFJTLTIzMiBvdXRwdXRzICovCisJX191MzIJcnNfc3RhdHVzOwkvKiBSUy0yMzIgaW5wdXRzICovCisJX191MzIJZmxvd194b247CS8qIHhvbiBjaGFyICovCisJX191MzIJZmxvd194b2ZmOwkvKiB4b2ZmIGNoYXIgKi8KKwlfX3UzMglod19vdmVyZmxvdzsJLyogaHcgb3ZlcmZsb3cgY291bnRlciAqLworCV9fdTMyCXN3X292ZXJmbG93OwkvKiBzdyBvdmVyZmxvdyBjb3VudGVyICovCisJX191MzIJY29tbV9lcnJvcjsJLyogZnJhbWUvcGFyaXR5IGVycm9yIGNvdW50ZXIgKi8KKwlfX3UzMiBpY2hhcjsKKwlfX3UzMiBmaWxsZXJbN107Cit9OworCisKKy8qCisgKglCVUZfQ1RSTCAtIFRoaXMgcGVyIGNoYW5uZWwgc3RydWN0dXJlIGNvbnRhaW5zCisgKglhbGwgVHggYW5kIFJ4IGJ1ZmZlciBjb250cm9sIGZvciBhIGdpdmVuIGNoYW5uZWwuCisgKi8KKworc3RydWN0CUJVRl9DVFJMCXsKKwlfX3UzMglmbGFnX2RtYTsJLyogYnVmZmVycyBhcmUgaW4gSG9zdCBtZW1vcnkgKi8KKwlfX3UzMgl0eF9idWZhZGRyOwkvKiBhZGRyZXNzIG9mIHRoZSB0eCBidWZmZXIgKi8KKwlfX3UzMgl0eF9idWZzaXplOwkvKiB0eCBidWZmZXIgc2l6ZSAqLworCV9fdTMyCXR4X3RocmVzaG9sZDsJLyogdHggbG93IHdhdGVyIG1hcmsgKi8KKwlfX3UzMgl0eF9nZXQ7CQkvKiB0YWlsIGluZGV4IHR4IGJ1ZiAqLworCV9fdTMyCXR4X3B1dDsJCS8qIGhlYWQgaW5kZXggdHggYnVmICovCisJX191MzIJcnhfYnVmYWRkcjsJLyogYWRkcmVzcyBvZiB0aGUgcnggYnVmZmVyICovCisJX191MzIJcnhfYnVmc2l6ZTsJLyogcnggYnVmZmVyIHNpemUgKi8KKwlfX3UzMglyeF90aHJlc2hvbGQ7CS8qIHJ4IGhpZ2ggd2F0ZXIgbWFyayAqLworCV9fdTMyCXJ4X2dldDsJCS8qIHRhaWwgaW5kZXggcnggYnVmICovCisJX191MzIJcnhfcHV0OwkJLyogaGVhZCBpbmRleCByeCBidWYgKi8KKwlfX3UzMglmaWxsZXJbNV07CS8qIGZpbGxlciB0byBhbGlnbiBzdHJ1Y3R1cmVzICovCit9OworCisvKgorICoJQk9BUkRfQ1RSTCAtIFRoaXMgcGVyIGJvYXJkIHN0cnVjdHVyZSBjb250YWlucyBhbGwgZ2xvYmFsIAorICoJY29udHJvbCBmaWVsZHMgcmVsYXRlZCB0byB0aGUgYm9hcmQuCisgKi8KKworc3RydWN0IEJPQVJEX0NUUkwgeworCisJLyogc3RhdGljIGluZm8gcHJvdmlkZWQgYnkgdGhlIG9uLWJvYXJkIENQVSAqLworCV9fdTMyCW5fY2hhbm5lbDsJLyogbnVtYmVyIG9mIGNoYW5uZWxzICovCisJX191MzIJZndfdmVyc2lvbjsJLyogZmlybXdhcmUgdmVyc2lvbiAqLworCisJLyogc3RhdGljIGluZm8gcHJvdmlkZWQgYnkgdGhlIGRyaXZlciAqLworCV9fdTMyCW9wX3N5c3RlbTsJLyogb3Bfc3lzdGVtIGlkICovCisJX191MzIJZHJfdmVyc2lvbjsJLyogZHJpdmVyIHZlcnNpb24gKi8KKworCS8qIGJvYXJkIGNvbnRyb2wgYXJlYSAqLworCV9fdTMyCWluYWN0aXZpdHk7CS8qIGluYWN0aXZpdHkgY29udHJvbCAqLworCisJLyogaG9zdCB0byBGVyBjb21tYW5kcyAqLworCV9fdTMyCWhjbWRfY2hhbm5lbDsJLyogY2hhbm5lbCBudW1iZXIgKi8KKwlfX3UzMgloY21kX3BhcmFtOwkvKiBwb2ludGVyIHRvIHBhcmFtZXRlcnMgKi8KKworCS8qIEZXIHRvIEhvc3QgY29tbWFuZHMgKi8KKwlfX3UzMglmd2NtZF9jaGFubmVsOwkvKiBjaGFubmVsIG51bWJlciAqLworCV9fdTMyCWZ3Y21kX3BhcmFtOwkvKiBwb2ludGVyIHRvIHBhcmFtZXRlcnMgKi8KKwlfX3UzMgl6Zl9pbnRfcXVldWVfYWRkcjsgLyogb2Zmc2V0IGZvciBJTlRfUVVFVUUgc3RydWN0dXJlICovCisKKwkvKiBmaWxsZXIgc28gdGhlIHN0cnVjdHVyZXMgYXJlIGFsaWduZWQgKi8KKwlfX3UzMglmaWxsZXJbNl07Cit9OworCisvKiBIb3N0IEludGVycnVwdCBRdWV1ZSAqLworCisjZGVmaW5lIFFVRVVFX1NJWkUJKDEwKk1BWF9DSEFOKQorCitzdHJ1Y3QJSU5UX1FVRVVFIHsKKwl1bnNpZ25lZCBjaGFyCWludHJfY29kZVtRVUVVRV9TSVpFXTsKKwl1bnNpZ25lZCBsb25nCWNoYW5uZWxbUVVFVUVfU0laRV07CisJdW5zaWduZWQgbG9uZwlwYXJhbVtRVUVVRV9TSVpFXTsKKwl1bnNpZ25lZCBsb25nCXB1dDsKKwl1bnNpZ25lZCBsb25nCWdldDsKK307CisKKy8qCisgKglaRldfQ1RSTCAtIFRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIHRoYXQgaW5jbHVkZXMgYWxsIG90aGVyCisgKglkYXRhIHN0cnVjdHVyZXMgdXNlZCBieSB0aGUgRmlybXdhcmUuCisgKi8KKyAKK3N0cnVjdCBaRldfQ1RSTCB7CisJc3RydWN0IEJPQVJEX0NUUkwJYm9hcmRfY3RybDsKKwlzdHJ1Y3QgQ0hfQ1RSTAkJY2hfY3RybFtNQVhfQ0hBTl07CisJc3RydWN0IEJVRl9DVFJMCQlidWZfY3RybFtNQVhfQ0hBTl07Cit9OworCisvKioqKioqKioqKioqKioqKioqICoqKioqKioqKioqKioqKioqKiAqKioqKioqKioqKioqKioqKioqLworI2VuZGlmCisKKyNlbmRpZiAvKiBfTElOVVhfQ1lDTEFERVNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jeWN4X2NmbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jeWN4X2NmbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMmQyNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2N5Y3hfY2ZtLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisqIGN5Y3hfY2ZtLmgJQ3ljbG9tIDJYIFdBTiBMaW5rIERyaXZlci4KKyoJCURlZmluaXRpb25zIGZvciB0aGUgQ3ljbG9tIDJYIEZpcm13YXJlIE1vZHVsZSAoQ0ZNKS4KKyoKKyogQXV0aG9yOglBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyoKKyogQ29weXJpZ2h0OgkoYykgMTk5OC0yMDAzIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbworKgorKiBCYXNlZCBvbiBzZGxhc2ZtLmggYnkgR2VuZSBLb3ppbiA8NzQ2MDQuMTUyQGNvbXB1c2VydmUuY29tPgorKgorKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiAxOTk4LzA4LzA4CWFjbWUJCUluaXRpYWwgdmVyc2lvbi4KKyovCisjaWZuZGVmCV9DWUNYX0NGTV9ICisjZGVmaW5lCV9DWUNYX0NGTV9ICisKKy8qIERlZmluZXMgKi8KKworI2RlZmluZQlDRk1fVkVSU0lPTgkyCisjZGVmaW5lCUNGTV9TSUdOQVRVUkUJIkNGTSAtIEN5Y2xhZGVzIENZQ1ggRmlybXdhcmUgTW9kdWxlIgorCisvKiBtaW4vbWF4ICovCisjZGVmaW5lCUNGTV9JTUFHRV9TSVpFCTB4MjAwMDAJLyogbWF4IHNpemUgb2YgQ1lDWCBjb2RlIGltYWdlIGZpbGUgKi8KKyNkZWZpbmUJQ0ZNX0RFU0NSX0xFTgkyNTYJLyogbWF4IGxlbmd0aCBvZiBkZXNjcmlwdGlvbiBzdHJpbmcgKi8KKyNkZWZpbmUJQ0ZNX01BWF9DWUNYCTEJLyogbWF4IG51bWJlciBvZiBjb21wYXRpYmxlIGFkYXB0ZXJzICovCisjZGVmaW5lCUNGTV9MT0FEX0JVRlNaCTB4NDAwCS8qIGJ1ZmZlciBzaXplIGZvciByZXNldCBjb2RlIChidWZmZXJfbG9hZCkgKi8KKworLyogRmlybXdhcmUgQ29tbWFuZHMgKi8KKyNkZWZpbmUgR0VOX1BPV0VSX09OCTB4MTI4MAorCisjZGVmaW5lIEdFTl9TRVRfU0VHCTB4MTQwMQkvKiBib290IHNlZ21lbnQgc2V0dGluZy4gKi8KKyNkZWZpbmUgR0VOX0JPT1RfREFUCTB4MTQwMgkvKiBib290IGRhdGEuICovCisjZGVmaW5lIEdFTl9TVEFSVAkweDE0MDMJLyogYm9hcmQgc3RhcnQuICovCisjZGVmaW5lIEdFTl9ERUZQQVIJMHgxNDA0CS8qIGJ1ZmZlciBsZW5ndGggZm9yIGJvb3QuICovCisKKy8qIEFkYXB0ZXIgVHlwZXMgKi8KKyNkZWZpbmUgQ1lDWF8yWAkJMgorLyogZm9yIG5vdyBvbmx5IHRoZSAyWCBpcyBzdXBwb3J0ZWQsIG5vIHBsYW5zIHRvIHN1cHBvcnQgOFggb3IgMTZYICovCisjZGVmaW5lIENZQ1hfOFgJCTgKKyNkZWZpbmUgQ1lDWF8xNlgJMTYKKworI2RlZmluZQlDRklEX1gyNV8yWAk1MjAwCisKKy8qKgorICoJc3RydWN0IGN5Y3hfZndfaW5mbyAtIGZpcm13YXJlIG1vZHVsZSBpbmZvcm1hdGlvbi4KKyAqCUBjb2RlaWQgLSBmaXJtd2FyZSBJRAorICoJQHZlcnNpb24gLSBmaXJtd2FyZSB2ZXJzaW9uIG51bWJlcgorICoJQGFkYXB0ZXIgLSBjb21wYXRpYmxlIGFkYXB0ZXIgdHlwZXMKKyAqCUBtZW1zaXplIC0gbWluaW11bSBtZW1vcnkgc2l6ZQorICoJQHJlc2VydmVkIC0gcmVzZXJ2ZWQKKyAqCUBzdGFydG9mZnMgLSBlbnRyeSBwb2ludCBvZmZzZXQKKyAqCUB3aW5vZmZzIC0gZHVhbC1wb3J0IG1lbW9yeSB3aW5kb3cgb2Zmc2V0CisgKglAY29kZW9mZnMgLSBjb2RlIGxvYWQgb2Zmc2V0CisgKglAY29kZXNpemUgLSBjb2RlIHNpemUKKyAqCUBkYXRhb2ZmcyAtIGNvbmZpZ3VyYXRpb24gZGF0YSBsb2FkIG9mZnNldAorICoJQGRhdGFzaXplIC0gY29uZmlndXJhdGlvbiBkYXRhIHNpemUKKyAqLworc3RydWN0IGN5Y3hfZndfaW5mbyB7CisJdW5zaWduZWQgc2hvcnQJY29kZWlkOworCXVuc2lnbmVkIHNob3J0CXZlcnNpb247CisJdW5zaWduZWQgc2hvcnQJYWRhcHRlcltDRk1fTUFYX0NZQ1hdOworCXVuc2lnbmVkIGxvbmcJbWVtc2l6ZTsKKwl1bnNpZ25lZCBzaG9ydAlyZXNlcnZlZFsyXTsKKwl1bnNpZ25lZCBzaG9ydAlzdGFydG9mZnM7CisJdW5zaWduZWQgc2hvcnQJd2lub2ZmczsKKwl1bnNpZ25lZCBzaG9ydAljb2Rlb2ZmczsKKwl1bnNpZ25lZCBsb25nCWNvZGVzaXplOworCXVuc2lnbmVkIHNob3J0CWRhdGFvZmZzOworCXVuc2lnbmVkIGxvbmcJZGF0YXNpemU7Cit9OworCisvKioKKyAqCXN0cnVjdCBjeWN4X2Zpcm13YXJlIC0gQ1lDWCBmaXJtd2FyZSBmaWxlIHN0cnVjdHVyZQorICoJQHNpZ25hdHVyZSAtIENGTSBmaWxlIHNpZ25hdHVyZQorICoJQHZlcnNpb24gLSBmaWxlIGZvcm1hdCB2ZXJzaW9uCisgKglAY2hlY2tzdW0gLSBpbmZvICsgaW1hZ2UKKyAqCUByZXNlcnZlZCAtIHJlc2VydmVkCisgKglAZGVzY3IgLSBkZXNjcmlwdGlvbiBzdHJpbmcKKyAqCUBpbmZvIC0gZmlybXdhcmUgbW9kdWxlIGluZm8KKyAqCUBpbWFnZSAtIGNvZGUgaW1hZ2UgKHZhcmlhYmxlIHNpemUpCisgKi8KK3N0cnVjdCBjeWN4X2Zpcm13YXJlIHsKKwljaGFyCQkgICAgc2lnbmF0dXJlWzgwXTsKKwl1bnNpZ25lZCBzaG9ydAkgICAgdmVyc2lvbjsKKwl1bnNpZ25lZCBzaG9ydAkgICAgY2hlY2tzdW07CisJdW5zaWduZWQgc2hvcnQJICAgIHJlc2VydmVkWzZdOworCWNoYXIJCSAgICBkZXNjcltDRk1fREVTQ1JfTEVOXTsKKwlzdHJ1Y3QgY3ljeF9md19pbmZvIGluZm87CisJdW5zaWduZWQgY2hhcgkgICAgaW1hZ2VbMF07Cit9OworCitzdHJ1Y3QgY3ljeF9md19oZWFkZXIgeworCXVuc2lnbmVkIGxvbmcgIHJlc2V0X3NpemU7CisJdW5zaWduZWQgbG9uZyAgZGF0YV9zaXplOworCXVuc2lnbmVkIGxvbmcgIGNvZGVfc2l6ZTsKK307CisjZW5kaWYJLyogX0NZQ1hfQ0ZNX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGNibmwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGNibmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWEyNTYyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kY2JubC5oCkBAIC0wLDAgKzEsNjcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTEsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCisgKiBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiBBdXRob3I6IEx1Y3kgTGl1IDxsdWN5LmxpdUBpbnRlbC5jb20+CisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0RDQk5MX0hfXworI2RlZmluZSBfX0xJTlVYX0RDQk5MX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogSUVFRSA4MDIuMVFheiBzdGQgc3VwcG9ydGVkIHZhbHVlcyAqLworI2RlZmluZSBJRUVFXzgwMjFRQVpfTUFYX1RDUwk4CisKKyNkZWZpbmUgSUVFRV84MDIxUUFaX1RTQV9TVFJJQ1QJCTAKKyNkZWZpbmUgSUVFRV84MDIxUUFaX1RTQV9DQl9TSEFQRVIJMQorI2RlZmluZSBJRUVFXzgwMjFRQVpfVFNBX0VUUwkJMgorI2RlZmluZSBJRUVFXzgwMjFRQVpfVFNBX1ZFTkRPUgkJMjU1CisKKy8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBJRUVFIDgwMi4xUWF6IEVUUyBtYW5hZ2VkIG9iamVjdAorICoKKyAqIEB3aWxsaW5nOiB3aWxsaW5nIGJpdCBpbiBFVFMgY29uZmlndXJhdGlvbiBUTFYKKyAqIEBldHNfY2FwOiBpbmRpY2F0ZXMgc3VwcG9ydGVkIGNhcGFjaXR5IG9mIGV0cyBmZWF0dXJlCisgKiBAY2JzOiBjcmVkaXQgYmFzZWQgc2hhcGVyIGV0cyBhbGdvcml0aG0gc3VwcG9ydGVkCisgKiBAdGNfdHhfYnc6IHRjIHR4IGJhbmR3aWR0aCBpbmRleGVkIGJ5IHRyYWZmaWMgY2xhc3MKKyAqIEB0Y19yeF9idzogdGMgcnggYmFuZHdpZHRoIGluZGV4ZWQgYnkgdHJhZmZpYyBjbGFzcworICogQHRjX3RzYTogVFNBIEFzc2lnbm1lbnQgdGFibGUsIGluZGV4ZWQgYnkgdHJhZmZpYyBjbGFzcworICogQHByaW9fdGM6IHByaW9yaXR5IGFzc2lnbm1lbnQgdGFibGUgbWFwcGluZyA4MDIxUXAgdG8gdHJhZmZpYyBjbGFzcworICogQHRjX3JlY29fYnc6IHJlY29tbWVuZGVkIHRjIGJhbmR3aWR0aCBpbmRleGVkIGJ5IHRyYWZmaWMgY2xhc3MgZm9yIFRMVgorICogQHRjX3JlY29fdHNhOiByZWNvbW1lbmRlZCB0YyBiYW5kd2lkdGggaW5kZXhlZCBieSB0cmFmZmljIGNsYXNzIGZvciBUTFYKKyAqIEByZWNvX3ByaW9fdGM6IHJlY29tbWVuZGVkIHRjIHR4IGJhbmR3aWR0aCBpbmRleGVkIGJ5IHRyYWZmaWMgY2xhc3MgZm9yIFRMVgorICoKKyAqIFJlY29tbWVuZGVkIHZhbHVlcyBhcmUgdXNlZCB0byBzZXQgZmllbGRzIGluIHRoZSBFVFMgcmVjb21tZW5kYXRpb24gVExWCisgKiB3aXRoIGhhcmR3YXJlIG9mZmxvYWRlZCBMTERQLgorICoKKyAqIC0tLS0KKyAqICBUU0EgQXNzaWdubWVudCA4IGJpdCBpZGVudGlmaWVycworICoJMAlzdHJpY3QgcHJpb3JpdHkKKyAqCTEJY3JlZGl0LWJhc2VkIHNoYXBlcgorICoJMgllbmhhbmNlZCB0cmFuc21pc3Npb24gc2VsZWN0aW9uCisgKgkzLTI1NAlyZXNlcnZlZAorICoJMjU1CXZlbmRvciBzcGVjaWZpYworICovCitzdHJ1Y3QgaWVlZV9ldHMgeworCV9fdTgJd2lsbGluZzsKKwlfX3U4CWV0c19jYXA7CisJX191OAljYnM7CisJX191OAl0Y190eF9id1tJRUVFXzgwMjFRQVpfTUFYX1RDU107CisJX191OAl0Y19yeF9id1tJRUVFXzgwMjFRQVpfTUFYX1RDU107CisJX191OAl0Y190c2FbSUVFRV84MDIxUUFaX01BWF9UQ1NdOworCV9fdTgJcHJpb190Y1tJRUVFXzgwMjFRQVpfTUFYX1RDU107CisJX191OAl0Y19yZWNvX2J3W0lFRUVfODAyMVFBWl9NQVhfVENTXTsKKwlfX3U4CXRjX3JlY29fdHNhW0lFRUVfODAyMVFBWl9NQVhfVENTXTsKKwlfX3U4CXJlY29fcHJpb190Y1tJRUVFXzgwMjFRQVpfTUFYX1RDU107Cit9OworCisvKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgSUVFRSA4MDIuMVFheiBQRkMgbWFuYWdlZCBvYmplY3QKKyAqCisgKiBAcGZjX2NhcDogSW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgdHJhZmZpYyBjbGFzc2VzIG9uIHRoZSBsb2NhbCBkZXZpY2UKKyAqCSAgICAgdGhhdCBtYXkgc2ltdWx0YW5lb3VzbHkgaGF2ZSBQRkMgZW5hYmxlZC4KKyAqIEBwZmNfZW46IGJpdG1hcCBpbmRpY2F0aW5nIHBmYyBlbmFibGVkIHRyYWZmaWMgY2xhc3NlcworICogQG1iYzogZW5hYmxlIG1hY3NlYyBieXBhc3MgY2FwYWJpbGl0eQorICogQGRlbGF5OiB0aGUgYWxsb3dhbmNlIG1hZGUgZm9yIGEgcm91bmQtdHJpcCBwcm9wYWdhdGlvbiBkZWxheSBvZiB0aGUKKyAqCSAgIGxpbmsgaW4gYml0cy4KKyAqIEByZXF1ZXN0czogY291bnQgb2YgdGhlIHNlbnQgcGZjIGZyYW1lcworICogQGluZGljYXRpb25zOiBjb3VudCBvZiB0aGUgcmVjZWl2ZWQgcGZjIGZyYW1lcworICovCitzdHJ1Y3QgaWVlZV9wZmMgeworCV9fdTgJcGZjX2NhcDsKKwlfX3U4CXBmY19lbjsKKwlfX3U4CW1iYzsKKwlfX3UxNglkZWxheTsKKwlfX3U2NAlyZXF1ZXN0c1tJRUVFXzgwMjFRQVpfTUFYX1RDU107CisJX191NjQJaW5kaWNhdGlvbnNbSUVFRV84MDIxUUFaX01BWF9UQ1NdOworfTsKKworLyogQ0VFIERDQlggc3RkIHN1cHBvcnRlZCB2YWx1ZXMgKi8KKyNkZWZpbmUgQ0VFX0RDQlhfTUFYX1BHUwk4CisjZGVmaW5lIENFRV9EQ0JYX01BWF9QUklPCTgKKworLyoqCisgKiBzdHJ1Y3QgY2VlX3BnIC0gQ0VFIFByaW9yaXR5LUdyb3VwIG1hbmFnZWQgb2JqZWN0CisgKgorICogQHdpbGxpbmc6IHdpbGxpbmcgYml0IGluIHRoZSBQRyB0bHYKKyAqIEBlcnJvcjogZXJyb3IgYml0IGluIHRoZSBQRyB0bHYKKyAqIEBwZ19lbjogZW5hYmxlIGJpdCBvZiB0aGUgUEcgZmVhdHVyZQorICogQHRjc19zdXBwb3J0ZWQ6IG51bWJlciBvZiB0cmFmZmljIGNsYXNzZXMgc3VwcG9ydGVkCisgKiBAcGdfYnc6IGJhbmR3aWR0aCBwZXJjZW50YWdlIGZvciBlYWNoIHByaW9yaXR5IGdyb3VwCisgKiBAcHJpb19wZzogcHJpb3JpdHkgdG8gUEcgbWFwcGluZyBpbmRleGVkIGJ5IHByaW9yaXR5CisgKi8KK3N0cnVjdCBjZWVfcGcgeworCV9fdTggICAgd2lsbGluZzsKKwlfX3U4ICAgIGVycm9yOworCV9fdTggICAgcGdfZW47CisJX191OCAgICB0Y3Nfc3VwcG9ydGVkOworCV9fdTggICAgcGdfYndbQ0VFX0RDQlhfTUFYX1BHU107CisJX191OCAgICBwcmlvX3BnW0NFRV9EQ0JYX01BWF9QR1NdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2VlX3BmYyAtIENFRSBQRkMgbWFuYWdlZCBvYmplY3QKKyAqCisgKiBAd2lsbGluZzogd2lsbGluZyBiaXQgaW4gdGhlIFBGQyB0bHYKKyAqIEBlcnJvcjogZXJyb3IgYml0IGluIHRoZSBQRkMgdGx2CisgKiBAcGZjX2VuOiBiaXRtYXAgaW5kaWNhdGluZyBwZmMgZW5hYmxlZCB0cmFmZmljIGNsYXNzZXMKKyAqIEB0Y3Nfc3VwcG9ydGVkOiBudW1iZXIgb2YgdHJhZmZpYyBjbGFzc2VzIHN1cHBvcnRlZAorICovCitzdHJ1Y3QgY2VlX3BmYyB7CisJX191OCAgICB3aWxsaW5nOworCV9fdTggICAgZXJyb3I7CisJX191OCAgICBwZmNfZW47CisJX191OCAgICB0Y3Nfc3VwcG9ydGVkOworfTsKKworLyogSUVFRSA4MDIuMVFheiBzdGQgc3VwcG9ydGVkIHZhbHVlcyAqLworI2RlZmluZSBJRUVFXzgwMjFRQVpfQVBQX1NFTF9FVEhFUlRZUEUJMQorI2RlZmluZSBJRUVFXzgwMjFRQVpfQVBQX1NFTF9TVFJFQU0JMgorI2RlZmluZSBJRUVFXzgwMjFRQVpfQVBQX1NFTF9ER1JBTQkzCisjZGVmaW5lIElFRUVfODAyMVFBWl9BUFBfU0VMX0FOWQk0CisKKy8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBJRUVFIDgwMi4xUWF6IEFQUCBtYW5hZ2VkIG9iamVjdC4gVGhpcworICogb2JqZWN0IGlzIGFsc28gdXNlZCBmb3IgdGhlIENFRSBzdGQgYXMgd2VsbC4gVGhlcmUgaXMgbm8gZGlmZmVyZW5jZQorICogYmV0d2VlbiB0aGUgb2JqZWN0cy4KKyAqCisgKiBAc2VsZWN0b3I6IHByb3RvY29sIGlkZW50aWZpZXIgdHlwZQorICogQHByb3RvY29sOiBwcm90b2NvbCBvZiB0eXBlIGluZGljYXRlZAorICogQHByaW9yaXR5OiAzLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGluZGljYXRpbmcgcHJpb3JpdHkKKyAqCisgKiAtLS0tCisgKiAgU2VsZWN0b3IgZmllbGQgdmFsdWVzCisgKgkwCVJlc2VydmVkCisgKgkxCUV0aGVydHlwZQorICoJMglXZWxsIGtub3duIHBvcnQgbnVtYmVyIG92ZXIgVENQIG9yIFNDVFAKKyAqCTMJV2VsbCBrbm93biBwb3J0IG51bWJlciBvdmVyIFVEUCBvciBEQ0NQCisgKgk0CVdlbGwga25vd24gcG9ydCBudW1iZXIgb3ZlciBUQ1AsIFNDVFAsIFVEUCwgb3IgRENDUAorICoJNS03CVJlc2VydmVkCisgKi8KK3N0cnVjdCBkY2JfYXBwIHsKKwlfX3U4CXNlbGVjdG9yOworCV9fdTgJcHJpb3JpdHk7CisJX191MTYJcHJvdG9jb2w7Cit9OworCisvKioKKyAqIHN0cnVjdCBkY2JfcGVlcl9hcHBfaW5mbyAtIEFQUCBmZWF0dXJlIGluZm9ybWF0aW9uIHNlbnQgYnkgdGhlIHBlZXIKKyAqCisgKiBAd2lsbGluZzogd2lsbGluZyBiaXQgaW4gdGhlIHBlZXIgQVBQIHRsdgorICogQGVycm9yOiBlcnJvciBiaXQgaW4gdGhlIHBlZXIgQVBQIHRsdgorICoKKyAqIEluIGFkZGl0aW9uIHRvIHRoaXMgaW5mb3JtYXRpb24gdGhlIGZ1bGwgcGVlciBBUFAgdGx2IGFsc28gY29udGFpbnMKKyAqIGEgdGFibGUgb2YgJ2FwcF9jb3VudCcgQVBQIG9iamVjdHMgZGVmaW5lZCBhYm92ZS4KKyAqLworc3RydWN0IGRjYl9wZWVyX2FwcF9pbmZvIHsKKwlfX3U4CXdpbGxpbmc7CisJX191OAllcnJvcjsKK307CisKK3N0cnVjdCBkY2Jtc2cgeworCV9fdTggICAgICAgICAgICAgICBkY2JfZmFtaWx5OworCV9fdTggICAgICAgICAgICAgICBjbWQ7CisJX191MTYgICAgICAgICAgICAgIGRjYl9wYWQ7Cit9OworCisvKioKKyAqIGVudW0gZGNibmxfY29tbWFuZHMgLSBzdXBwb3J0ZWQgRENCIGNvbW1hbmRzCisgKgorICogQERDQl9DTURfVU5ERUZJTkVEOiB1bnNwZWNpZmllZCBjb21tYW5kIHRvIGNhdGNoIGVycm9ycworICogQERDQl9DTURfR1NUQVRFOiByZXF1ZXN0IHRoZSBzdGF0ZSBvZiBEQ0IgaW4gdGhlIGRldmljZQorICogQERDQl9DTURfU1NUQVRFOiBzZXQgdGhlIHN0YXRlIG9mIERDQiBpbiB0aGUgZGV2aWNlCisgKiBARENCX0NNRF9QR1RYX0dDRkc6IHJlcXVlc3QgdGhlIHByaW9yaXR5IGdyb3VwIGNvbmZpZ3VyYXRpb24gZm9yIFR4CisgKiBARENCX0NNRF9QR1RYX1NDRkc6IHNldCB0aGUgcHJpb3JpdHkgZ3JvdXAgY29uZmlndXJhdGlvbiBmb3IgVHgKKyAqIEBEQ0JfQ01EX1BHUlhfR0NGRzogcmVxdWVzdCB0aGUgcHJpb3JpdHkgZ3JvdXAgY29uZmlndXJhdGlvbiBmb3IgUngKKyAqIEBEQ0JfQ01EX1BHUlhfU0NGRzogc2V0IHRoZSBwcmlvcml0eSBncm91cCBjb25maWd1cmF0aW9uIGZvciBSeAorICogQERDQl9DTURfUEZDX0dDRkc6IHJlcXVlc3QgdGhlIHByaW9yaXR5IGZsb3cgY29udHJvbCBjb25maWd1cmF0aW9uCisgKiBARENCX0NNRF9QRkNfU0NGRzogc2V0IHRoZSBwcmlvcml0eSBmbG93IGNvbnRyb2wgY29uZmlndXJhdGlvbgorICogQERDQl9DTURfU0VUX0FMTDogYXBwbHkgYWxsIGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgZGV2aWNlCisgKiBARENCX0NNRF9HUEVSTV9IV0FERFI6IGdldCB0aGUgcGVybWFuZW50IE1BQyBhZGRyZXNzIG9mIHRoZSB1bmRlcmx5aW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS4gIE9ubHkgdXNlZnVsIHdoZW4gdXNpbmcgYm9uZGluZy4KKyAqIEBEQ0JfQ01EX0dDQVA6IHJlcXVlc3QgdGhlIERDQiBjYXBhYmlsaXRpZXMgb2YgdGhlIGRldmljZQorICogQERDQl9DTURfR05VTVRDUzogZ2V0IHRoZSBudW1iZXIgb2YgdHJhZmZpYyBjbGFzc2VzIGN1cnJlbnRseSBzdXBwb3J0ZWQKKyAqIEBEQ0JfQ01EX1NOVU1UQ1M6IHNldCB0aGUgbnVtYmVyIG9mIHRyYWZmaWMgY2xhc3NlcworICogQERDQl9DTURfR0JDTjogc2V0IGJhY2t3YXJkIGNvbmdlc3Rpb24gbm90aWZpY2F0aW9uIGNvbmZpZ3VyYXRpb24KKyAqIEBEQ0JfQ01EX1NCQ046IGdldCBiYWNrd2FyZCBjb25nZXN0aW9uIG5vdGlmaWNhdGlvbiBjb25maWdyYXRpb24uCisgKiBARENCX0NNRF9HQVBQOiBnZXQgYXBwbGljYXRpb24gcHJvdG9jb2wgY29uZmlndXJhdGlvbgorICogQERDQl9DTURfU0FQUDogc2V0IGFwcGxpY2F0aW9uIHByb3RvY29sIGNvbmZpZ3VyYXRpb24KKyAqIEBEQ0JfQ01EX0lFRUVfU0VUOiBzZXQgSUVFRSA4MDIuMVFheiBjb25maWd1cmF0aW9uCisgKiBARENCX0NNRF9JRUVFX0dFVDogZ2V0IElFRUUgODAyLjFRYXogY29uZmlndXJhdGlvbgorICogQERDQl9DTURfR0RDQlg6IGdldCBEQ0JYIGVuZ2luZSBjb25maWd1cmF0aW9uCisgKiBARENCX0NNRF9TRENCWDogc2V0IERDQlggZW5naW5lIGNvbmZpZ3VyYXRpb24KKyAqIEBEQ0JfQ01EX0dGRUFUQ0ZHOiBnZXQgRENCWCBmZWF0dXJlcyBmbGFncworICogQERDQl9DTURfU0ZFQVRDRkc6IHNldCBEQ0JYIGZlYXR1cmVzIG5lZ290aWF0aW9uIGZsYWdzCisgKiBARENCX0NNRF9DRUVfR0VUOiBnZXQgQ0VFIGFnZ3JlZ2F0ZWQgY29uZmlndXJhdGlvbgorICogQERDQl9DTURfSUVFRV9ERUw6IGRlbGV0ZSBJRUVFIDgwMi4xUWF6IGNvbmZpZ3VyYXRpb24KKyAqLworZW51bSBkY2JubF9jb21tYW5kcyB7CisJRENCX0NNRF9VTkRFRklORUQsCisKKwlEQ0JfQ01EX0dTVEFURSwKKwlEQ0JfQ01EX1NTVEFURSwKKworCURDQl9DTURfUEdUWF9HQ0ZHLAorCURDQl9DTURfUEdUWF9TQ0ZHLAorCURDQl9DTURfUEdSWF9HQ0ZHLAorCURDQl9DTURfUEdSWF9TQ0ZHLAorCisJRENCX0NNRF9QRkNfR0NGRywKKwlEQ0JfQ01EX1BGQ19TQ0ZHLAorCisJRENCX0NNRF9TRVRfQUxMLAorCisJRENCX0NNRF9HUEVSTV9IV0FERFIsCisKKwlEQ0JfQ01EX0dDQVAsCisKKwlEQ0JfQ01EX0dOVU1UQ1MsCisJRENCX0NNRF9TTlVNVENTLAorCisJRENCX0NNRF9QRkNfR1NUQVRFLAorCURDQl9DTURfUEZDX1NTVEFURSwKKworCURDQl9DTURfQkNOX0dDRkcsCisJRENCX0NNRF9CQ05fU0NGRywKKworCURDQl9DTURfR0FQUCwKKwlEQ0JfQ01EX1NBUFAsCisKKwlEQ0JfQ01EX0lFRUVfU0VULAorCURDQl9DTURfSUVFRV9HRVQsCisKKwlEQ0JfQ01EX0dEQ0JYLAorCURDQl9DTURfU0RDQlgsCisKKwlEQ0JfQ01EX0dGRUFUQ0ZHLAorCURDQl9DTURfU0ZFQVRDRkcsCisKKwlEQ0JfQ01EX0NFRV9HRVQsCisJRENCX0NNRF9JRUVFX0RFTCwKKworCV9fRENCX0NNRF9FTlVNX01BWCwKKwlEQ0JfQ01EX01BWCA9IF9fRENCX0NNRF9FTlVNX01BWCAtIDEsCit9OworCisvKioKKyAqIGVudW0gZGNibmxfYXR0cnMgLSBEQ0IgdG9wLWxldmVsIG5ldGxpbmsgYXR0cmlidXRlcworICoKKyAqIEBEQ0JfQVRUUl9VTkRFRklORUQ6IHVuc3BlY2lmaWVkIGF0dHJpYnV0ZSB0byBjYXRjaCBlcnJvcnMKKyAqIEBEQ0JfQVRUUl9JRk5BTUU6IGludGVyZmFjZSBuYW1lIG9mIHRoZSB1bmRlcmx5aW5nIGRldmljZSAoTkxBX1NUUklORykKKyAqIEBEQ0JfQVRUUl9TVEFURTogZW5hYmxlIHN0YXRlIG9mIERDQiBpbiB0aGUgZGV2aWNlIChOTEFfVTgpCisgKiBARENCX0FUVFJfUEZDX1NUQVRFOiBlbmFibGUgc3RhdGUgb2YgUEZDIGluIHRoZSBkZXZpY2UgKE5MQV9VOCkKKyAqIEBEQ0JfQVRUUl9QRkNfQ0ZHOiBwcmlvcml0eSBmbG93IGNvbnRyb2wgY29uZmlndXJhdGlvbiAoTkxBX05FU1RFRCkKKyAqIEBEQ0JfQVRUUl9OVU1fVEM6IG51bWJlciBvZiB0cmFmZmljIGNsYXNzZXMgc3VwcG9ydGVkIGluIHRoZSBkZXZpY2UgKE5MQV9VOCkKKyAqIEBEQ0JfQVRUUl9QR19DRkc6IHByaW9yaXR5IGdyb3VwIGNvbmZpZ3VyYXRpb24gKE5MQV9ORVNURUQpCisgKiBARENCX0FUVFJfU0VUX0FMTDogYm9vbCB0byBjb21taXQgY2hhbmdlcyB0byBoYXJkd2FyZSBvciBub3QgKE5MQV9VOCkKKyAqIEBEQ0JfQVRUUl9QRVJNX0hXQUREUjogTUFDIGFkZHJlc3Mgb2YgdGhlIHBoeXNpY2FsIGRldmljZSAoTkxBX05FU1RFRCkKKyAqIEBEQ0JfQVRUUl9DQVA6IERDQiBjYXBhYmlsaXRpZXMgb2YgdGhlIGRldmljZSAoTkxBX05FU1RFRCkKKyAqIEBEQ0JfQVRUUl9OVU1UQ1M6IG51bWJlciBvZiB0cmFmZmljIGNsYXNzZXMgc3VwcG9ydGVkIChOTEFfTkVTVEVEKQorICogQERDQl9BVFRSX0JDTjogYmFja3dhcmQgY29uZ2VzdGlvbiBub3RpZmljYXRpb24gY29uZmlndXJhdGlvbiAoTkxBX05FU1RFRCkKKyAqIEBEQ0JfQVRUUl9JRUVFOiBJRUVFIDgwMi4xUWF6IHN1cHBvcnRlZCBhdHRyaWJ1dGVzIChOTEFfTkVTVEVEKQorICogQERDQl9BVFRSX0RDQlg6IERDQlggZW5naW5lIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGRldmljZSAoTkxBX1U4KQorICogQERDQl9BVFRSX0ZFQVRDRkc6IERDQlggZmVhdHVyZXMgZmxhZ3MgKE5MQV9ORVNURUQpCisgKiBARENCX0FUVFJfQ0VFOiBDRUUgc3RkIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIChOTEFfTkVTVEVEKQorICovCitlbnVtIGRjYm5sX2F0dHJzIHsKKwlEQ0JfQVRUUl9VTkRFRklORUQsCisKKwlEQ0JfQVRUUl9JRk5BTUUsCisJRENCX0FUVFJfU1RBVEUsCisJRENCX0FUVFJfUEZDX1NUQVRFLAorCURDQl9BVFRSX1BGQ19DRkcsCisJRENCX0FUVFJfTlVNX1RDLAorCURDQl9BVFRSX1BHX0NGRywKKwlEQ0JfQVRUUl9TRVRfQUxMLAorCURDQl9BVFRSX1BFUk1fSFdBRERSLAorCURDQl9BVFRSX0NBUCwKKwlEQ0JfQVRUUl9OVU1UQ1MsCisJRENCX0FUVFJfQkNOLAorCURDQl9BVFRSX0FQUCwKKworCS8qIElFRUUgc3RkIGF0dHJpYnV0ZXMgKi8KKwlEQ0JfQVRUUl9JRUVFLAorCisJRENCX0FUVFJfRENCWCwKKwlEQ0JfQVRUUl9GRUFUQ0ZHLAorCisJLyogQ0VFIG5lc3RlZCBhdHRyaWJ1dGVzICovCisJRENCX0FUVFJfQ0VFLAorCisJX19EQ0JfQVRUUl9FTlVNX01BWCwKKwlEQ0JfQVRUUl9NQVggPSBfX0RDQl9BVFRSX0VOVU1fTUFYIC0gMSwKK307CisKKy8qKgorICogZW51bSBpZWVlX2F0dHJzIC0gSUVFRSA4MDIuMVFheiBnZXQvc2V0IGF0dHJpYnV0ZXMKKyAqCisgKiBARENCX0FUVFJfSUVFRV9VTlNQRUM6IHVuc3BlY2lmaWVkCisgKiBARENCX0FUVFJfSUVFRV9FVFM6IG5lZ290aWF0ZWQgRVRTIGNvbmZpZ3VyYXRpb24KKyAqIEBEQ0JfQVRUUl9JRUVFX1BGQzogbmVnb3RpYXRlZCBQRkMgY29uZmlndXJhdGlvbgorICogQERDQl9BVFRSX0lFRUVfQVBQX1RBQkxFOiBuZWdvdGlhdGVkIEFQUCBjb25maWd1cmF0aW9uCisgKiBARENCX0FUVFJfSUVFRV9QRUVSX0VUUzogcGVlciBFVFMgY29uZmlndXJhdGlvbiAtIGdldCBvbmx5CisgKiBARENCX0FUVFJfSUVFRV9QRUVSX1BGQzogcGVlciBQRkMgY29uZmlndXJhdGlvbiAtIGdldCBvbmx5CisgKiBARENCX0FUVFJfSUVFRV9QRUVSX0FQUDogcGVlciBBUFAgdGx2IC0gZ2V0IG9ubHkKKyAqLworZW51bSBpZWVlX2F0dHJzIHsKKwlEQ0JfQVRUUl9JRUVFX1VOU1BFQywKKwlEQ0JfQVRUUl9JRUVFX0VUUywKKwlEQ0JfQVRUUl9JRUVFX1BGQywKKwlEQ0JfQVRUUl9JRUVFX0FQUF9UQUJMRSwKKwlEQ0JfQVRUUl9JRUVFX1BFRVJfRVRTLAorCURDQl9BVFRSX0lFRUVfUEVFUl9QRkMsCisJRENCX0FUVFJfSUVFRV9QRUVSX0FQUCwKKwlfX0RDQl9BVFRSX0lFRUVfTUFYCit9OworI2RlZmluZSBEQ0JfQVRUUl9JRUVFX01BWCAoX19EQ0JfQVRUUl9JRUVFX01BWCAtIDEpCisKK2VudW0gaWVlZV9hdHRyc19hcHAgeworCURDQl9BVFRSX0lFRUVfQVBQX1VOU1BFQywKKwlEQ0JfQVRUUl9JRUVFX0FQUCwKKwlfX0RDQl9BVFRSX0lFRUVfQVBQX01BWAorfTsKKyNkZWZpbmUgRENCX0FUVFJfSUVFRV9BUFBfTUFYIChfX0RDQl9BVFRSX0lFRUVfQVBQX01BWCAtIDEpCisKKy8qKgorICogZW51bSBjZWVfYXR0cnMgLSBDRUUgRENCWCBnZXQgYXR0cmlidXRlcy4KKyAqCisgKiBARENCX0FUVFJfQ0VFX1VOU1BFQzogdW5zcGVjaWZpZWQKKyAqIEBEQ0JfQVRUUl9DRUVfUEVFUl9QRzogcGVlciBQRyBjb25maWd1cmF0aW9uIC0gZ2V0IG9ubHkKKyAqIEBEQ0JfQVRUUl9DRUVfUEVFUl9QRkM6IHBlZXIgUEZDIGNvbmZpZ3VyYXRpb24gLSBnZXQgb25seQorICogQERDQl9BVFRSX0NFRV9QRUVSX0FQUF9UQUJMRTogcGVlciBBUFAgdGx2IC0gZ2V0IG9ubHkKKyAqIEBEQ0JfQVRUUl9DRUVfVFhfUEc6IFRYIFBHIGNvbmZpZ3VyYXRpb24gKERDQl9DTURfUEdUWF9HQ0ZHKQorICogQERDQl9BVFRSX0NFRV9SWF9QRzogUlggUEcgY29uZmlndXJhdGlvbiAoRENCX0NNRF9QR1JYX0dDRkcpCisgKiBARENCX0FUVFJfQ0VFX1BGQzogUEZDIGNvbmZpZ3VyYXRpb24gKERDQl9DTURfUEZDX0dDRkcpCisgKiBARENCX0FUVFJfQ0VFX0FQUF9UQUJMRTogQVBQIGNvbmZpZ3VyYXRpb24gKG11bHRpIERDQl9DTURfR0FQUCkKKyAqIEBEQ0JfQVRUUl9DRUVfRkVBVDogRENCWCBmZWF0dXJlcyBmbGFncyAoRENCX0NNRF9HRkVBVENGRykKKyAqCisgKiBBbiBhZ2dyZWdhdGVkIGNvbGxlY3Rpb24gb2YgdGhlIGNlZSBzdGQgbmVnb3RpYXRlZCBwYXJhbWV0ZXJzLgorICovCitlbnVtIGNlZV9hdHRycyB7CisJRENCX0FUVFJfQ0VFX1VOU1BFQywKKwlEQ0JfQVRUUl9DRUVfUEVFUl9QRywKKwlEQ0JfQVRUUl9DRUVfUEVFUl9QRkMsCisJRENCX0FUVFJfQ0VFX1BFRVJfQVBQX1RBQkxFLAorCURDQl9BVFRSX0NFRV9UWF9QRywKKwlEQ0JfQVRUUl9DRUVfUlhfUEcsCisJRENCX0FUVFJfQ0VFX1BGQywKKwlEQ0JfQVRUUl9DRUVfQVBQX1RBQkxFLAorCURDQl9BVFRSX0NFRV9GRUFULAorCV9fRENCX0FUVFJfQ0VFX01BWAorfTsKKyNkZWZpbmUgRENCX0FUVFJfQ0VFX01BWCAoX19EQ0JfQVRUUl9DRUVfTUFYIC0gMSkKKworZW51bSBwZWVyX2FwcF9hdHRyIHsKKwlEQ0JfQVRUUl9DRUVfUEVFUl9BUFBfVU5TUEVDLAorCURDQl9BVFRSX0NFRV9QRUVSX0FQUF9JTkZPLAorCURDQl9BVFRSX0NFRV9QRUVSX0FQUCwKKwlfX0RDQl9BVFRSX0NFRV9QRUVSX0FQUF9NQVgKK307CisjZGVmaW5lIERDQl9BVFRSX0NFRV9QRUVSX0FQUF9NQVggKF9fRENCX0FUVFJfQ0VFX1BFRVJfQVBQX01BWCAtIDEpCisKK2VudW0gY2VlX2F0dHJzX2FwcCB7CisJRENCX0FUVFJfQ0VFX0FQUF9VTlNQRUMsCisJRENCX0FUVFJfQ0VFX0FQUCwKKwlfX0RDQl9BVFRSX0NFRV9BUFBfTUFYCit9OworI2RlZmluZSBEQ0JfQVRUUl9DRUVfQVBQX01BWCAoX19EQ0JfQVRUUl9DRUVfQVBQX01BWCAtIDEpCisKKy8qKgorICogZW51bSBkY2JubF9wZmNfYXR0cnMgLSBEQ0IgUHJpb3JpdHkgRmxvdyBDb250cm9sIHVzZXIgcHJpb3JpdHkgbmVzdGVkIGF0dHJzCisgKgorICogQERDQl9QRkNfVVBfQVRUUl9VTkRFRklORUQ6IHVuc3BlY2lmaWVkIGF0dHJpYnV0ZSB0byBjYXRjaCBlcnJvcnMKKyAqIEBEQ0JfUEZDX1VQX0FUVFJfMDogUHJpb3JpdHkgRmxvdyBDb250cm9sIHZhbHVlIGZvciBVc2VyIFByaW9yaXR5IDAgKE5MQV9VOCkKKyAqIEBEQ0JfUEZDX1VQX0FUVFJfMTogUHJpb3JpdHkgRmxvdyBDb250cm9sIHZhbHVlIGZvciBVc2VyIFByaW9yaXR5IDEgKE5MQV9VOCkKKyAqIEBEQ0JfUEZDX1VQX0FUVFJfMjogUHJpb3JpdHkgRmxvdyBDb250cm9sIHZhbHVlIGZvciBVc2VyIFByaW9yaXR5IDIgKE5MQV9VOCkKKyAqIEBEQ0JfUEZDX1VQX0FUVFJfMzogUHJpb3JpdHkgRmxvdyBDb250cm9sIHZhbHVlIGZvciBVc2VyIFByaW9yaXR5IDMgKE5MQV9VOCkKKyAqIEBEQ0JfUEZDX1VQX0FUVFJfNDogUHJpb3JpdHkgRmxvdyBDb250cm9sIHZhbHVlIGZvciBVc2VyIFByaW9yaXR5IDQgKE5MQV9VOCkKKyAqIEBEQ0JfUEZDX1VQX0FUVFJfNTogUHJpb3JpdHkgRmxvdyBDb250cm9sIHZhbHVlIGZvciBVc2VyIFByaW9yaXR5IDUgKE5MQV9VOCkKKyAqIEBEQ0JfUEZDX1VQX0FUVFJfNjogUHJpb3JpdHkgRmxvdyBDb250cm9sIHZhbHVlIGZvciBVc2VyIFByaW9yaXR5IDYgKE5MQV9VOCkKKyAqIEBEQ0JfUEZDX1VQX0FUVFJfNzogUHJpb3JpdHkgRmxvdyBDb250cm9sIHZhbHVlIGZvciBVc2VyIFByaW9yaXR5IDcgKE5MQV9VOCkKKyAqIEBEQ0JfUEZDX1VQX0FUVFJfTUFYOiBoaWdoZXN0IGF0dHJpYnV0ZSBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKKyAqIEBEQ0JfUEZDX1VQX0FUVFJfQUxMOiBhcHBseSB0byBhbGwgcHJpb3JpdHkgZmxvdyBjb250cm9sIGF0dHJzIChOTEFfRkxBRykKKyAqCisgKi8KK2VudW0gZGNibmxfcGZjX3VwX2F0dHJzIHsKKwlEQ0JfUEZDX1VQX0FUVFJfVU5ERUZJTkVELAorCisJRENCX1BGQ19VUF9BVFRSXzAsCisJRENCX1BGQ19VUF9BVFRSXzEsCisJRENCX1BGQ19VUF9BVFRSXzIsCisJRENCX1BGQ19VUF9BVFRSXzMsCisJRENCX1BGQ19VUF9BVFRSXzQsCisJRENCX1BGQ19VUF9BVFRSXzUsCisJRENCX1BGQ19VUF9BVFRSXzYsCisJRENCX1BGQ19VUF9BVFRSXzcsCisJRENCX1BGQ19VUF9BVFRSX0FMTCwKKworCV9fRENCX1BGQ19VUF9BVFRSX0VOVU1fTUFYLAorCURDQl9QRkNfVVBfQVRUUl9NQVggPSBfX0RDQl9QRkNfVVBfQVRUUl9FTlVNX01BWCAtIDEsCit9OworCisvKioKKyAqIGVudW0gZGNibmxfcGdfYXR0cnMgLSBEQ0IgUHJpb3JpdHkgR3JvdXAgYXR0cmlidXRlcworICoKKyAqIEBEQ0JfUEdfQVRUUl9VTkRFRklORUQ6IHVuc3BlY2lmaWVkIGF0dHJpYnV0ZSB0byBjYXRjaCBlcnJvcnMKKyAqIEBEQ0JfUEdfQVRUUl9UQ18wOiBQcmlvcml0eSBHcm91cCBUcmFmZmljIENsYXNzIDAgY29uZmlndXJhdGlvbiAoTkxBX05FU1RFRCkKKyAqIEBEQ0JfUEdfQVRUUl9UQ18xOiBQcmlvcml0eSBHcm91cCBUcmFmZmljIENsYXNzIDEgY29uZmlndXJhdGlvbiAoTkxBX05FU1RFRCkKKyAqIEBEQ0JfUEdfQVRUUl9UQ18yOiBQcmlvcml0eSBHcm91cCBUcmFmZmljIENsYXNzIDIgY29uZmlndXJhdGlvbiAoTkxBX05FU1RFRCkKKyAqIEBEQ0JfUEdfQVRUUl9UQ18zOiBQcmlvcml0eSBHcm91cCBUcmFmZmljIENsYXNzIDMgY29uZmlndXJhdGlvbiAoTkxBX05FU1RFRCkKKyAqIEBEQ0JfUEdfQVRUUl9UQ180OiBQcmlvcml0eSBHcm91cCBUcmFmZmljIENsYXNzIDQgY29uZmlndXJhdGlvbiAoTkxBX05FU1RFRCkKKyAqIEBEQ0JfUEdfQVRUUl9UQ181OiBQcmlvcml0eSBHcm91cCBUcmFmZmljIENsYXNzIDUgY29uZmlndXJhdGlvbiAoTkxBX05FU1RFRCkKKyAqIEBEQ0JfUEdfQVRUUl9UQ182OiBQcmlvcml0eSBHcm91cCBUcmFmZmljIENsYXNzIDYgY29uZmlndXJhdGlvbiAoTkxBX05FU1RFRCkKKyAqIEBEQ0JfUEdfQVRUUl9UQ183OiBQcmlvcml0eSBHcm91cCBUcmFmZmljIENsYXNzIDcgY29uZmlndXJhdGlvbiAoTkxBX05FU1RFRCkKKyAqIEBEQ0JfUEdfQVRUUl9UQ19NQVg6IGhpZ2hlc3QgYXR0cmlidXRlIG51bWJlciBjdXJyZW50bHkgZGVmaW5lZAorICogQERDQl9QR19BVFRSX1RDX0FMTDogYXBwbHkgdG8gYWxsIHRyYWZmaWMgY2xhc3NlcyAoTkxBX05FU1RFRCkKKyAqIEBEQ0JfUEdfQVRUUl9CV19JRF8wOiBQZXJjZW50IG9mIGxpbmsgYmFuZHdpZHRoIGZvciBQcmlvcml0eSBHcm91cCAwIChOTEFfVTgpCisgKiBARENCX1BHX0FUVFJfQldfSURfMTogUGVyY2VudCBvZiBsaW5rIGJhbmR3aWR0aCBmb3IgUHJpb3JpdHkgR3JvdXAgMSAoTkxBX1U4KQorICogQERDQl9QR19BVFRSX0JXX0lEXzI6IFBlcmNlbnQgb2YgbGluayBiYW5kd2lkdGggZm9yIFByaW9yaXR5IEdyb3VwIDIgKE5MQV9VOCkKKyAqIEBEQ0JfUEdfQVRUUl9CV19JRF8zOiBQZXJjZW50IG9mIGxpbmsgYmFuZHdpZHRoIGZvciBQcmlvcml0eSBHcm91cCAzIChOTEFfVTgpCisgKiBARENCX1BHX0FUVFJfQldfSURfNDogUGVyY2VudCBvZiBsaW5rIGJhbmR3aWR0aCBmb3IgUHJpb3JpdHkgR3JvdXAgNCAoTkxBX1U4KQorICogQERDQl9QR19BVFRSX0JXX0lEXzU6IFBlcmNlbnQgb2YgbGluayBiYW5kd2lkdGggZm9yIFByaW9yaXR5IEdyb3VwIDUgKE5MQV9VOCkKKyAqIEBEQ0JfUEdfQVRUUl9CV19JRF82OiBQZXJjZW50IG9mIGxpbmsgYmFuZHdpZHRoIGZvciBQcmlvcml0eSBHcm91cCA2IChOTEFfVTgpCisgKiBARENCX1BHX0FUVFJfQldfSURfNzogUGVyY2VudCBvZiBsaW5rIGJhbmR3aWR0aCBmb3IgUHJpb3JpdHkgR3JvdXAgNyAoTkxBX1U4KQorICogQERDQl9QR19BVFRSX0JXX0lEX01BWDogaGlnaGVzdCBhdHRyaWJ1dGUgbnVtYmVyIGN1cnJlbnRseSBkZWZpbmVkCisgKiBARENCX1BHX0FUVFJfQldfSURfQUxMOiBhcHBseSB0byBhbGwgcHJpb3JpdHkgZ3JvdXBzIChOTEFfRkxBRykKKyAqCisgKi8KK2VudW0gZGNibmxfcGdfYXR0cnMgeworCURDQl9QR19BVFRSX1VOREVGSU5FRCwKKworCURDQl9QR19BVFRSX1RDXzAsCisJRENCX1BHX0FUVFJfVENfMSwKKwlEQ0JfUEdfQVRUUl9UQ18yLAorCURDQl9QR19BVFRSX1RDXzMsCisJRENCX1BHX0FUVFJfVENfNCwKKwlEQ0JfUEdfQVRUUl9UQ181LAorCURDQl9QR19BVFRSX1RDXzYsCisJRENCX1BHX0FUVFJfVENfNywKKwlEQ0JfUEdfQVRUUl9UQ19NQVgsCisJRENCX1BHX0FUVFJfVENfQUxMLAorCisJRENCX1BHX0FUVFJfQldfSURfMCwKKwlEQ0JfUEdfQVRUUl9CV19JRF8xLAorCURDQl9QR19BVFRSX0JXX0lEXzIsCisJRENCX1BHX0FUVFJfQldfSURfMywKKwlEQ0JfUEdfQVRUUl9CV19JRF80LAorCURDQl9QR19BVFRSX0JXX0lEXzUsCisJRENCX1BHX0FUVFJfQldfSURfNiwKKwlEQ0JfUEdfQVRUUl9CV19JRF83LAorCURDQl9QR19BVFRSX0JXX0lEX01BWCwKKwlEQ0JfUEdfQVRUUl9CV19JRF9BTEwsCisKKwlfX0RDQl9QR19BVFRSX0VOVU1fTUFYLAorCURDQl9QR19BVFRSX01BWCA9IF9fRENCX1BHX0FUVFJfRU5VTV9NQVggLSAxLAorfTsKKworLyoqCisgKiBlbnVtIGRjYm5sX3RjX2F0dHJzIC0gRENCIFRyYWZmaWMgQ2xhc3MgYXR0cmlidXRlcworICoKKyAqIEBEQ0JfVENfQVRUUl9QQVJBTV9VTkRFRklORUQ6IHVuc3BlY2lmaWVkIGF0dHJpYnV0ZSB0byBjYXRjaCBlcnJvcnMKKyAqIEBEQ0JfVENfQVRUUl9QQVJBTV9QR0lEOiAoTkxBX1U4KSBQcmlvcml0eSBncm91cCB0aGUgdHJhZmZpYyBjbGFzcyBiZWxvbmdzIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgdmFsdWVzIGFyZTogIDAtNworICogQERDQl9UQ19BVFRSX1BBUkFNX1VQX01BUFBJTkc6IChOTEFfVTgpIFRyYWZmaWMgY2xhc3MgdG8gdXNlciBwcmlvcml0eSBtYXAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb21lIGRldmljZXMgbWF5IG5vdCBzdXBwb3J0IGNoYW5naW5nIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgcHJpb3JpdHkgbWFwIG9mIGEgVEMuCisgKiBARENCX1RDX0FUVFJfUEFSQU1fU1RSSUNUX1BSSU86IChOTEFfVTgpIFN0cmljdCBwcmlvcml0eSBzZXR0aW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSBub25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBncm91cCBzdHJpY3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAtIGxpbmsgc3RyaWN0CisgKiBARENCX1RDX0FUVFJfUEFSQU1fQldfUENUOiBvcHRpb25hbCAtIChOTEFfVTgpIElmIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGNvbmZpZ3VyZWQgdG8gdXNlIGxpbmsgc3RyaWN0IHByaW9yaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyB0aGUgcGVyY2VudGFnZSBvZiBiYW5kd2lkdGggb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSBncm91cCB0aGlzIHRyYWZmaWMgY2xhc3MgYmVsb25ncyB0bworICogQERDQl9UQ19BVFRSX1BBUkFNX0FMTDogKE5MQV9GTEFHKSBhbGwgdHJhZmZpYyBjbGFzcyBwYXJhbWV0ZXJzCisgKgorICovCitlbnVtIGRjYm5sX3RjX2F0dHJzIHsKKwlEQ0JfVENfQVRUUl9QQVJBTV9VTkRFRklORUQsCisKKwlEQ0JfVENfQVRUUl9QQVJBTV9QR0lELAorCURDQl9UQ19BVFRSX1BBUkFNX1VQX01BUFBJTkcsCisJRENCX1RDX0FUVFJfUEFSQU1fU1RSSUNUX1BSSU8sCisJRENCX1RDX0FUVFJfUEFSQU1fQldfUENULAorCURDQl9UQ19BVFRSX1BBUkFNX0FMTCwKKworCV9fRENCX1RDX0FUVFJfUEFSQU1fRU5VTV9NQVgsCisJRENCX1RDX0FUVFJfUEFSQU1fTUFYID0gX19EQ0JfVENfQVRUUl9QQVJBTV9FTlVNX01BWCAtIDEsCit9OworCisvKioKKyAqIGVudW0gZGNibmxfY2FwX2F0dHJzIC0gRENCIENhcGFiaWxpdHkgYXR0cmlidXRlcworICoKKyAqIEBEQ0JfQ0FQX0FUVFJfVU5ERUZJTkVEOiB1bnNwZWNpZmllZCBhdHRyaWJ1dGUgdG8gY2F0Y2ggZXJyb3JzCisgKiBARENCX0NBUF9BVFRSX0FMTDogKE5MQV9GTEFHKSBhbGwgY2FwYWJpbGl0eSBwYXJhbWV0ZXJzCisgKiBARENCX0NBUF9BVFRSX1BHOiAoTkxBX1U4KSBkZXZpY2Ugc3VwcG9ydHMgUHJpb3JpdHkgR3JvdXBzCisgKiBARENCX0NBUF9BVFRSX1BGQzogKE5MQV9VOCkgZGV2aWNlIHN1cHBvcnRzIFByaW9yaXR5IEZsb3cgQ29udHJvbAorICogQERDQl9DQVBfQVRUUl9VUDJUQzogKE5MQV9VOCkgZGV2aWNlIHN1cHBvcnRzIHVzZXIgcHJpb3JpdHkgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWZmaWMgY2xhc3MgbWFwcGluZworICogQERDQl9DQVBfQVRUUl9QR19UQ1M6IChOTEFfVTgpIGJpdG1hcCB3aGVyZSBlYWNoIGJpdCByZXByZXNlbnRzIGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgdHJhZmZpYyBjbGFzc2VzIHRoZSBkZXZpY2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgY29uZmlndXJlZCB0byB1c2UgZm9yIFByaW9yaXR5IEdyb3VwcworICogQERDQl9DQVBfQVRUUl9QRkNfVENTOiAoTkxBX1U4KSBiaXRtYXAgd2hlcmUgZWFjaCBiaXQgcmVwcmVzZW50cyBhCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiB0cmFmZmljIGNsYXNzZXMgdGhlIGRldmljZSBjYW4gYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZCB0byB1c2UgZm9yIFByaW9yaXR5IEZsb3cgQ29udHJvbAorICogQERDQl9DQVBfQVRUUl9HU1A6IChOTEFfVTgpIGRldmljZSBzdXBwb3J0cyBncm91cCBzdHJpY3QgcHJpb3JpdHkKKyAqIEBEQ0JfQ0FQX0FUVFJfQkNOOiAoTkxBX1U4KSBkZXZpY2Ugc3VwcG9ydHMgQmFja3dhcmRzIENvbmdlc3Rpb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24KKyAqIEBEQ0JfQ0FQX0FUVFJfRENCWDogKE5MQV9VOCkgZGV2aWNlIHN1cHBvcnRzIERDQlggZW5naW5lCisgKgorICovCitlbnVtIGRjYm5sX2NhcF9hdHRycyB7CisJRENCX0NBUF9BVFRSX1VOREVGSU5FRCwKKwlEQ0JfQ0FQX0FUVFJfQUxMLAorCURDQl9DQVBfQVRUUl9QRywKKwlEQ0JfQ0FQX0FUVFJfUEZDLAorCURDQl9DQVBfQVRUUl9VUDJUQywKKwlEQ0JfQ0FQX0FUVFJfUEdfVENTLAorCURDQl9DQVBfQVRUUl9QRkNfVENTLAorCURDQl9DQVBfQVRUUl9HU1AsCisJRENCX0NBUF9BVFRSX0JDTiwKKwlEQ0JfQ0FQX0FUVFJfRENCWCwKKworCV9fRENCX0NBUF9BVFRSX0VOVU1fTUFYLAorCURDQl9DQVBfQVRUUl9NQVggPSBfX0RDQl9DQVBfQVRUUl9FTlVNX01BWCAtIDEsCit9OworCisvKioKKyAqIERDQlggY2FwYWJpbGl0eSBmbGFncworICoKKyAqIEBEQ0JfQ0FQX0RDQlhfSE9TVDogRENCWCBuZWdvdGlhdGlvbiBpcyBwZXJmb3JtZWQgYnkgdGhlIGhvc3QgTExEUCBhZ2VudC4KKyAqICAgICAgICAgICAgICAgICAgICAgJ3NldCcgcm91dGluZXMgYXJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBkZXZpY2Ugd2l0aAorICogICAgICAgICAgICAgICAgICAgICB0aGUgbmVnb3RpYXRlZCBwYXJhbWV0ZXJzCisgKgorICogQERDQl9DQVBfRENCWF9MTERfTUFOQUdFRDogRENCWCBuZWdvdGlhdGlvbiBpcyBub3QgcGVyZm9ybWVkIGluIHRoZSBob3N0IGJ1dAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgYW5vdGhlciBlbnRpdHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnZXQnIHJvdXRpbmVzIGFyZSB1c2VkIHRvIHJldHJpZXZlIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnb3RpYXRlZCBwYXJhbWV0ZXJzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0JyByb3V0aW5lcyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGluaXRpYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ290aWF0aW9uIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBARENCX0NBUF9EQ0JYX1ZFUl9DRUU6IGZvciBhIG5vbi1ob3N0IERDQlggZW5naW5lLCBpbmRpY2F0ZXMgdGhlIGVuZ2luZQorICogICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0cyB0aGUgQ0VFIHByb3RvY29sIGZsYXZvcgorICoKKyAqIEBEQ0JfQ0FQX0RDQlhfVkVSX0lFRUU6IGZvciBhIG5vbi1ob3N0IERDQlggZW5naW5lLCBpbmRpY2F0ZXMgdGhlIGVuZ2luZQorICogICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgdGhlIElFRUUgcHJvdG9jb2wgZmxhdm9yCisgKgorICogQERDQl9DQVBfRENCWF9TVEFUSUM6IGZvciBhIG5vbi1ob3N0IERDQlggZW5naW5lLCBpbmRpY2F0ZXMgdGhlIGVuZ2luZQorICogICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzIHN0YXRpYyBjb25maWd1cmF0aW9uIChpLmUgbm8gYWN0dWFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgbmVnb3RpYXRpb24gaXMgcGVyZm9ybWVkIG5lZ290aWF0ZWQgcGFyYW1ldGVycyBlcXVhbAorICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbml0aWFsIGNvbmZpZ3VyYXRpb24pCisgKgorICovCisjZGVmaW5lIERDQl9DQVBfRENCWF9IT1NUCQkweDAxCisjZGVmaW5lIERDQl9DQVBfRENCWF9MTERfTUFOQUdFRAkweDAyCisjZGVmaW5lIERDQl9DQVBfRENCWF9WRVJfQ0VFCQkweDA0CisjZGVmaW5lIERDQl9DQVBfRENCWF9WRVJfSUVFRQkJMHgwOAorI2RlZmluZSBEQ0JfQ0FQX0RDQlhfU1RBVElDCQkweDEwCisKKy8qKgorICogZW51bSBkY2JubF9udW10Y3NfYXR0cnMgLSBudW1iZXIgb2YgdHJhZmZpYyBjbGFzc2VzCisgKgorICogQERDQl9OVU1UQ1NfQVRUUl9VTkRFRklORUQ6IHVuc3BlY2lmaWVkIGF0dHJpYnV0ZSB0byBjYXRjaCBlcnJvcnMKKyAqIEBEQ0JfTlVNVENTX0FUVFJfQUxMOiAoTkxBX0ZMQUcpIGFsbCB0cmFmZmljIGNsYXNzIGF0dHJpYnV0ZXMKKyAqIEBEQ0JfTlVNVENTX0FUVFJfUEc6IChOTEFfVTgpIG51bWJlciBvZiB0cmFmZmljIGNsYXNzZXMgdXNlZCBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5IGdyb3VwcworICogQERDQl9OVU1UQ1NfQVRUUl9QRkM6IChOTEFfVTgpIG51bWJlciBvZiB0cmFmZmljIGNsYXNzZXMgd2hpY2ggY2FuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCBwcmlvcml0eSBmbG93IGNvbnRyb2wKKyAqLworZW51bSBkY2JubF9udW10Y3NfYXR0cnMgeworCURDQl9OVU1UQ1NfQVRUUl9VTkRFRklORUQsCisJRENCX05VTVRDU19BVFRSX0FMTCwKKwlEQ0JfTlVNVENTX0FUVFJfUEcsCisJRENCX05VTVRDU19BVFRSX1BGQywKKworCV9fRENCX05VTVRDU19BVFRSX0VOVU1fTUFYLAorCURDQl9OVU1UQ1NfQVRUUl9NQVggPSBfX0RDQl9OVU1UQ1NfQVRUUl9FTlVNX01BWCAtIDEsCit9OworCitlbnVtIGRjYm5sX2Jjbl9hdHRyc3sKKwlEQ0JfQkNOX0FUVFJfVU5ERUZJTkVEID0gMCwKKworCURDQl9CQ05fQVRUUl9SUF8wLAorCURDQl9CQ05fQVRUUl9SUF8xLAorCURDQl9CQ05fQVRUUl9SUF8yLAorCURDQl9CQ05fQVRUUl9SUF8zLAorCURDQl9CQ05fQVRUUl9SUF80LAorCURDQl9CQ05fQVRUUl9SUF81LAorCURDQl9CQ05fQVRUUl9SUF82LAorCURDQl9CQ05fQVRUUl9SUF83LAorCURDQl9CQ05fQVRUUl9SUF9BTEwsCisKKwlEQ0JfQkNOX0FUVFJfQkNOQV8wLAorCURDQl9CQ05fQVRUUl9CQ05BXzEsCisJRENCX0JDTl9BVFRSX0FMUEhBLAorCURDQl9CQ05fQVRUUl9CRVRBLAorCURDQl9CQ05fQVRUUl9HRCwKKwlEQ0JfQkNOX0FUVFJfR0ksCisJRENCX0JDTl9BVFRSX1RNQVgsCisJRENCX0JDTl9BVFRSX1RELAorCURDQl9CQ05fQVRUUl9STUlOLAorCURDQl9CQ05fQVRUUl9XLAorCURDQl9CQ05fQVRUUl9SRCwKKwlEQ0JfQkNOX0FUVFJfUlUsCisJRENCX0JDTl9BVFRSX1dSVFQsCisJRENCX0JDTl9BVFRSX1JJLAorCURDQl9CQ05fQVRUUl9DLAorCURDQl9CQ05fQVRUUl9BTEwsCisKKwlfX0RDQl9CQ05fQVRUUl9FTlVNX01BWCwKKwlEQ0JfQkNOX0FUVFJfTUFYID0gX19EQ0JfQkNOX0FUVFJfRU5VTV9NQVggLSAxLAorfTsKKworLyoqCisgKiBlbnVtIGRjYl9nZW5lcmFsX2F0dHJfdmFsdWVzIC0gZ2VuZXJhbCBEQ0IgYXR0cmlidXRlIHZhbHVlcworICoKKyAqIEBEQ0JfQVRUUl9VTkRFRklORUQ6IHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgYW4gYXR0cmlidXRlIGlzIG5vdCBzdXBwb3J0ZWQKKyAqCisgKi8KK2VudW0gZGNiX2dlbmVyYWxfYXR0cl92YWx1ZXMgeworCURDQl9BVFRSX1ZBTFVFX1VOREVGSU5FRCA9IDB4ZmYKK307CisKKyNkZWZpbmUgRENCX0FQUF9JRFRZUEVfRVRIVFlQRQkweDAwCisjZGVmaW5lIERDQl9BUFBfSURUWVBFX1BPUlROVU0JMHgwMQorZW51bSBkY2JubF9hcHBfYXR0cnMgeworCURDQl9BUFBfQVRUUl9VTkRFRklORUQsCisKKwlEQ0JfQVBQX0FUVFJfSURUWVBFLAorCURDQl9BUFBfQVRUUl9JRCwKKwlEQ0JfQVBQX0FUVFJfUFJJT1JJVFksCisKKwlfX0RDQl9BUFBfQVRUUl9FTlVNX01BWCwKKwlEQ0JfQVBQX0FUVFJfTUFYID0gX19EQ0JfQVBQX0FUVFJfRU5VTV9NQVggLSAxLAorfTsKKworLyoqCisgKiBlbnVtIGRjYm5sX2ZlYXRjZmdfYXR0cnMgLSBmZWF0dXJlcyBjb25pZmlndXJhdGlvbiBmbGFncworICoKKyAqIEBEQ0JfRkVBVENGR19BVFRSX1VOREVGSU5FRDogdW5zcGVjaWZpZWQgYXR0cmlidXRlIHRvIGNhdGNoIGVycm9ycworICogQERDQl9GRUFUQ0ZHX0FUVFJfQUxMOiAoTkxBX0ZMQUcpIGFsbCBmZWF0dXJlcyBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMKKyAqIEBEQ0JfRkVBVENGR19BVFRSX1BHOiAoTkxBX1U4KSBjb25maWd1cmF0aW9uIGZsYWdzIGZvciBwcmlvcml0eSBncm91cHMKKyAqIEBEQ0JfRkVBVENGR19BVFRSX1BGQzogKE5MQV9VOCkgY29uZmlndXJhdGlvbiBmbGFncyBmb3IgcHJpb3JpdHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdyBjb250cm9sCisgKiBARENCX0ZFQVRDRkdfQVRUUl9BUFA6IChOTEFfVTgpIGNvbmZpZ3VyYXRpb24gZmxhZ3MgZm9yIGFwcGxpY2F0aW9uIFRMVgorICoKKyAqLworI2RlZmluZSBEQ0JfRkVBVENGR19FUlJPUgkweDAxCS8qIGVycm9yIGluIGZlYXR1cmUgcmVzb2x1dGlvbiAqLworI2RlZmluZSBEQ0JfRkVBVENGR19FTkFCTEUJMHgwMgkvKiBlbmFibGUgZmVhdHVyZSAqLworI2RlZmluZSBEQ0JfRkVBVENGR19XSUxMSU5HCTB4MDQJLyogZmVhdHVyZSBpcyB3aWxsaW5nICovCisjZGVmaW5lIERDQl9GRUFUQ0ZHX0FEVkVSVElTRQkweDA4CS8qIGFkdmVydGlzZSBmZWF0dXJlICovCitlbnVtIGRjYm5sX2ZlYXRjZmdfYXR0cnMgeworCURDQl9GRUFUQ0ZHX0FUVFJfVU5ERUZJTkVELAorCURDQl9GRUFUQ0ZHX0FUVFJfQUxMLAorCURDQl9GRUFUQ0ZHX0FUVFJfUEcsCisJRENCX0ZFQVRDRkdfQVRUUl9QRkMsCisJRENCX0ZFQVRDRkdfQVRUUl9BUFAsCisKKwlfX0RDQl9GRUFUQ0ZHX0FUVFJfRU5VTV9NQVgsCisJRENCX0ZFQVRDRkdfQVRUUl9NQVggPSBfX0RDQl9GRUFUQ0ZHX0FUVFJfRU5VTV9NQVggLSAxLAorfTsKKworI2VuZGlmIC8qIF9fTElOVVhfRENCTkxfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RjY3AuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGNjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZTIyMjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RjY3AuaApAQCAtMCwwICsxLDIzNyBAQAorI2lmbmRlZiBfTElOVVhfRENDUF9ICisjZGVmaW5lIF9MSU5VWF9EQ0NQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKioKKyAqIHN0cnVjdCBkY2NwX2hkciAtIGdlbmVyaWMgcGFydCBvZiBEQ0NQIHBhY2tldCBoZWFkZXIKKyAqCisgKiBAZGNjcGhfc3BvcnQgLSBSZWxldmFudCBwb3J0IG9uIHRoZSBlbmRwb2ludCB0aGF0IHNlbnQgdGhpcyBwYWNrZXQKKyAqIEBkY2NwaF9kcG9ydCAtIFJlbGV2YW50IHBvcnQgb24gdGhlIG90aGVyIGVuZHBvaW50CisgKiBAZGNjcGhfZG9mZiAtIERhdGEgT2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBEQ0NQIGhlYWRlciwgaW4gMzItYml0IHdvcmRzCisgKiBAZGNjcGhfY2N2YWwgLSBVc2VkIGJ5IHRoZSBIQy1TZW5kZXIgQ0NJRAorICogQGRjY3BoX2NzY292IC0gUGFydHMgb2YgdGhlIHBhY2tldCB0aGF0IGFyZSBjb3ZlcmVkIGJ5IHRoZSBDaGVja3N1bSBmaWVsZAorICogQGRjY3BoX2NoZWNrc3VtIC0gSW50ZXJuZXQgY2hlY2tzdW0sIGRlcGVuZHMgb24gZGNjcGhfY3Njb3YKKyAqIEBkY2NwaF94IC0gMCA9IDI0IGJpdCBzZXF1ZW5jZSBudW1iZXIsIDEgPSA0OAorICogQGRjY3BoX3R5cGUgLSBwYWNrZXQgdHlwZSwgc2VlIERDQ1BfUEtUXyBwcmVmaXhlZCBtYWNyb3MKKyAqIEBkY2NwaF9zZXEgLSBzZXF1ZW5jZSBudW1iZXIgaGlnaCBvciBsb3cgb3JkZXIgMjQgYml0cywgZGVwZW5kcyBvbiBkY2NwaF94CisgKi8KK3N0cnVjdCBkY2NwX2hkciB7CisJX19iZTE2CWRjY3BoX3Nwb3J0LAorCQlkY2NwaF9kcG9ydDsKKwlfX3U4CWRjY3BoX2RvZmY7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OAlkY2NwaF9jc2Nvdjo0LAorCQlkY2NwaF9jY3ZhbDo0OworI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OAlkY2NwaF9jY3ZhbDo0LAorCQlkY2NwaF9jc2Nvdjo0OworI2Vsc2UKKyNlcnJvciAgIkFkanVzdCB5b3VyIDxhc20vYnl0ZW9yZGVyLmg+IGRlZmluZXMiCisjZW5kaWYKKwlfX3N1bTE2CWRjY3BoX2NoZWNrc3VtOworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTgJZGNjcGhfeDoxLAorCQlkY2NwaF90eXBlOjQsCisJCWRjY3BoX3Jlc2VydmVkOjM7CisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4CWRjY3BoX3Jlc2VydmVkOjMsCisJCWRjY3BoX3R5cGU6NCwKKwkJZGNjcGhfeDoxOworI2Vsc2UKKyNlcnJvciAgIkFkanVzdCB5b3VyIDxhc20vYnl0ZW9yZGVyLmg+IGRlZmluZXMiCisjZW5kaWYKKwlfX3U4CWRjY3BoX3NlcTI7CisJX19iZTE2CWRjY3BoX3NlcTsKK307CisKKy8qKgorICogc3RydWN0IGRjY3BfaGRyX2V4dCAtIHRoZSBsb3cgYml0cyBvZiBhIDQ4IGJpdCBzZXEgcGFja2V0CisgKgorICogQGRjY3BoX3NlcV9sb3cgLSBsb3cgMjQgYml0cyBvZiBhIDQ4IGJpdCBzZXEgcGFja2V0CisgKi8KK3N0cnVjdCBkY2NwX2hkcl9leHQgeworCV9fYmUzMglkY2NwaF9zZXFfbG93OworfTsKKworLyoqCisgKiBzdHJ1Y3QgZGNjcF9oZHJfcmVxdWVzdCAtIENvbm5lY3Rpb24gaW5pdGlhdGlvbiByZXF1ZXN0IGhlYWRlcgorICoKKyAqIEBkY2NwaF9yZXFfc2VydmljZSAtIFNlcnZpY2UgdG8gd2hpY2ggdGhlIGNsaWVudCBhcHAgd2FudHMgdG8gY29ubmVjdAorICovCitzdHJ1Y3QgZGNjcF9oZHJfcmVxdWVzdCB7CisJX19iZTMyCWRjY3BoX3JlcV9zZXJ2aWNlOworfTsKKy8qKgorICogc3RydWN0IGRjY3BfaGRyX2Fja19iaXRzIC0gYWNrbm93bGVkZ21lbnQgYml0cyBjb21tb24gdG8gbW9zdCBwYWNrZXRzCisgKgorICogQGRjY3BoX3Jlc3BfYWNrX25yX2hpZ2ggLSA0OCBiaXQgYWNrIG51bWJlciBoaWdoIG9yZGVyIGJpdHMsIGNvbnRhaW5zIEdTUgorICogQGRjY3BoX3Jlc3BfYWNrX25yX2xvdyAtIDQ4IGJpdCBhY2sgbnVtYmVyIGxvdyBvcmRlciBiaXRzLCBjb250YWlucyBHU1IKKyAqLworc3RydWN0IGRjY3BfaGRyX2Fja19iaXRzIHsKKwlfX2JlMTYJZGNjcGhfcmVzZXJ2ZWQxOworCV9fYmUxNglkY2NwaF9hY2tfbnJfaGlnaDsKKwlfX2JlMzIJZGNjcGhfYWNrX25yX2xvdzsKK307CisvKioKKyAqIHN0cnVjdCBkY2NwX2hkcl9yZXNwb25zZSAtIENvbm5lY3Rpb24gaW5pdGlhdGlvbiByZXNwb25zZSBoZWFkZXIKKyAqCisgKiBAZGNjcGhfcmVzcF9hY2sgLSA0OCBiaXQgQWNrbm93bGVkZ21lbnQgTnVtYmVyIFN1YmhlYWRlciAoNS4zKQorICogQGRjY3BoX3Jlc3Bfc2VydmljZSAtIEVjaG9lcyB0aGUgU2VydmljZSBDb2RlIG9uIGEgcmVjZWl2ZWQgRENDUC1SZXF1ZXN0CisgKi8KK3N0cnVjdCBkY2NwX2hkcl9yZXNwb25zZSB7CisJc3RydWN0IGRjY3BfaGRyX2Fja19iaXRzCWRjY3BoX3Jlc3BfYWNrOworCV9fYmUzMgkJCQlkY2NwaF9yZXNwX3NlcnZpY2U7Cit9OworCisvKioKKyAqIHN0cnVjdCBkY2NwX2hkcl9yZXNldCAtIFVuY29uZGl0aW9uYWxseSBzaHV0IGRvd24gYSBjb25uZWN0aW9uCisgKgorICogQGRjY3BoX3Jlc2V0X2FjayAtIDQ4IGJpdCBBY2tub3dsZWRnbWVudCBOdW1iZXIgU3ViaGVhZGVyICg1LjYpCisgKiBAZGNjcGhfcmVzZXRfY29kZSAtIG9uZSBvZiAlZGNjcF9yZXNldF9jb2RlcworICogQGRjY3BoX3Jlc2V0X2RhdGEgLSB0aGUgRGF0YSAxIC4uLiBEYXRhIDMgZmllbGRzIGZyb20gNS42CisgKi8KK3N0cnVjdCBkY2NwX2hkcl9yZXNldCB7CisJc3RydWN0IGRjY3BfaGRyX2Fja19iaXRzCWRjY3BoX3Jlc2V0X2FjazsKKwlfX3U4CQkJCWRjY3BoX3Jlc2V0X2NvZGUsCisJCQkJCWRjY3BoX3Jlc2V0X2RhdGFbM107Cit9OworCitlbnVtIGRjY3BfcGt0X3R5cGUgeworCURDQ1BfUEtUX1JFUVVFU1QgPSAwLAorCURDQ1BfUEtUX1JFU1BPTlNFLAorCURDQ1BfUEtUX0RBVEEsCisJRENDUF9QS1RfQUNLLAorCURDQ1BfUEtUX0RBVEFBQ0ssCisJRENDUF9QS1RfQ0xPU0VSRVEsCisJRENDUF9QS1RfQ0xPU0UsCisJRENDUF9QS1RfUkVTRVQsCisJRENDUF9QS1RfU1lOQywKKwlEQ0NQX1BLVF9TWU5DQUNLLAorCURDQ1BfUEtUX0lOVkFMSUQsCit9OworCisjZGVmaW5lIERDQ1BfTlJfUEtUX1RZUEVTIERDQ1BfUEtUX0lOVkFMSUQKKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IGRjY3BfcGFja2V0X2hkcl9sZW4oY29uc3QgX191OCB0eXBlKQoreworCWlmICh0eXBlID09IERDQ1BfUEtUX0RBVEEpCisJCXJldHVybiAwOworCWlmICh0eXBlID09IERDQ1BfUEtUX0RBVEFBQ0sJfHwKKwkgICAgdHlwZSA9PSBEQ0NQX1BLVF9BQ0sJfHwKKwkgICAgdHlwZSA9PSBEQ0NQX1BLVF9TWU5DCXx8CisJICAgIHR5cGUgPT0gRENDUF9QS1RfU1lOQ0FDSwl8fAorCSAgICB0eXBlID09IERDQ1BfUEtUX0NMT1NFCXx8CisJICAgIHR5cGUgPT0gRENDUF9QS1RfQ0xPU0VSRVEpCisJCXJldHVybiBzaXplb2Yoc3RydWN0IGRjY3BfaGRyX2Fja19iaXRzKTsKKwlpZiAodHlwZSA9PSBEQ0NQX1BLVF9SRVFVRVNUKQorCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcl9yZXF1ZXN0KTsKKwlpZiAodHlwZSA9PSBEQ0NQX1BLVF9SRVNQT05TRSkKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZGNjcF9oZHJfcmVzcG9uc2UpOworCXJldHVybiBzaXplb2Yoc3RydWN0IGRjY3BfaGRyX3Jlc2V0KTsKK30KK2VudW0gZGNjcF9yZXNldF9jb2RlcyB7CisJRENDUF9SRVNFVF9DT0RFX1VOU1BFQ0lGSUVEID0gMCwKKwlEQ0NQX1JFU0VUX0NPREVfQ0xPU0VELAorCURDQ1BfUkVTRVRfQ09ERV9BQk9SVEVELAorCURDQ1BfUkVTRVRfQ09ERV9OT19DT05ORUNUSU9OLAorCURDQ1BfUkVTRVRfQ09ERV9QQUNLRVRfRVJST1IsCisJRENDUF9SRVNFVF9DT0RFX09QVElPTl9FUlJPUiwKKwlEQ0NQX1JFU0VUX0NPREVfTUFOREFUT1JZX0VSUk9SLAorCURDQ1BfUkVTRVRfQ09ERV9DT05ORUNUSU9OX1JFRlVTRUQsCisJRENDUF9SRVNFVF9DT0RFX0JBRF9TRVJWSUNFX0NPREUsCisJRENDUF9SRVNFVF9DT0RFX1RPT19CVVNZLAorCURDQ1BfUkVTRVRfQ09ERV9CQURfSU5JVF9DT09LSUUsCisJRENDUF9SRVNFVF9DT0RFX0FHR1JFU1NJT05fUEVOQUxUWSwKKworCURDQ1BfTUFYX1JFU0VUX0NPREVTCQkvKiBMZWF2ZSBhdCB0aGUgZW5kISAgKi8KK307CisKKy8qIERDQ1Agb3B0aW9ucyAqLworZW51bSB7CisJRENDUE9fUEFERElORyA9IDAsCisJRENDUE9fTUFOREFUT1JZID0gMSwKKwlEQ0NQT19NSU5fUkVTRVJWRUQgPSAzLAorCURDQ1BPX01BWF9SRVNFUlZFRCA9IDMxLAorCURDQ1BPX0NIQU5HRV9MID0gMzIsCisJRENDUE9fQ09ORklSTV9MID0gMzMsCisJRENDUE9fQ0hBTkdFX1IgPSAzNCwKKwlEQ0NQT19DT05GSVJNX1IgPSAzNSwKKwlEQ0NQT19ORFBfQ09VTlQgPSAzNywKKwlEQ0NQT19BQ0tfVkVDVE9SXzAgPSAzOCwKKwlEQ0NQT19BQ0tfVkVDVE9SXzEgPSAzOSwKKwlEQ0NQT19USU1FU1RBTVAgPSA0MSwKKwlEQ0NQT19USU1FU1RBTVBfRUNITyA9IDQyLAorCURDQ1BPX0VMQVBTRURfVElNRSA9IDQzLAorCURDQ1BPX01BWCA9IDQ1LAorCURDQ1BPX01JTl9SWF9DQ0lEX1NQRUNJRklDID0gMTI4LAkvKiBmcm9tIHNlbmRlciB0byByZWNlaXZlciAqLworCURDQ1BPX01BWF9SWF9DQ0lEX1NQRUNJRklDID0gMTkxLAorCURDQ1BPX01JTl9UWF9DQ0lEX1NQRUNJRklDID0gMTkyLAkvKiBmcm9tIHJlY2VpdmVyIHRvIHNlbmRlciAqLworCURDQ1BPX01BWF9UWF9DQ0lEX1NQRUNJRklDID0gMjU1LAorfTsKKy8qIG1heGltdW0gc2l6ZSBvZiBhIHNpbmdsZSBUTFYtZW5jb2RlZCBEQ0NQIG9wdGlvbiAoc2FucyB0eXBlL2xlbiBieXRlcykgKi8KKyNkZWZpbmUgRENDUF9TSU5HTEVfT1BUX01BWExFTgkyNTMKKworLyogRENDUCBDQ0lEUyAqLworZW51bSB7CisJRENDUENfQ0NJRDIgPSAyLAorCURDQ1BDX0NDSUQzID0gMywKK307CisKKy8qIERDQ1AgZmVhdHVyZXMgKFJGQyA0MzQwIHNlY3Rpb24gNi40KSAqLworZW51bSBkY2NwX2ZlYXR1cmVfbnVtYmVycyB7CisJRENDUEZfUkVTRVJWRUQgPSAwLAorCURDQ1BGX0NDSUQgPSAxLAorCURDQ1BGX1NIT1JUX1NFUU5PUyA9IDIsCisJRENDUEZfU0VRVUVOQ0VfV0lORE9XID0gMywKKwlEQ0NQRl9FQ05fSU5DQVBBQkxFID0gNCwKKwlEQ0NQRl9BQ0tfUkFUSU8gPSA1LAorCURDQ1BGX1NFTkRfQUNLX1ZFQ1RPUiA9IDYsCisJRENDUEZfU0VORF9ORFBfQ09VTlQgPSA3LAorCURDQ1BGX01JTl9DU1VNX0NPVkVSID0gOCwKKwlEQ0NQRl9EQVRBX0NIRUNLU1VNID0gOSwKKwkvKiAxMC0xMjcgcmVzZXJ2ZWQgKi8KKwlEQ0NQRl9NSU5fQ0NJRF9TUEVDSUZJQyA9IDEyOCwKKwlEQ0NQRl9TRU5EX0xFVl9SQVRFID0gMTkyLAkvKiBSRkMgNDM0Miwgc2VjLiA4LjQgKi8KKwlEQ0NQRl9NQVhfQ0NJRF9TUEVDSUZJQyA9IDI1NSwKK307CisKKy8qIERDQ1Agc29ja2V0IGNvbnRyb2wgbWVzc2FnZSB0eXBlcyBmb3IgY21zZyAqLworZW51bSBkY2NwX2Ntc2dfdHlwZSB7CisJRENDUF9TQ01fUFJJT1JJVFkgPSAxLAorCURDQ1BfU0NNX1FQT0xJQ1lfTUFYID0gMHhGRkZGLAorCS8qIF4tLSBVcCB0byBoZXJlIHJlc2VydmVkIGV4Y2x1c2l2ZWx5IGZvciBxcG9saWN5IHBhcmFtZXRlcnMgKi8KKwlEQ0NQX1NDTV9NQVgKK307CisKKy8qIERDQ1AgcHJpb3JpdGllcyBmb3Igb3V0Z29pbmcvcXVldWVkIHBhY2tldHMgKi8KK2VudW0gZGNjcF9wYWNrZXRfZGVxdWV1ZWluZ19wb2xpY3kgeworCURDQ1BRX1BPTElDWV9TSU1QTEUsCisJRENDUFFfUE9MSUNZX1BSSU8sCisJRENDUFFfUE9MSUNZX01BWAorfTsKKworLyogRENDUCBzb2NrZXQgb3B0aW9ucyAqLworI2RlZmluZSBEQ0NQX1NPQ0tPUFRfUEFDS0VUX1NJWkUJMSAvKiBYWFggZGVwcmVjYXRlZCwgd2l0aG91dCBlZmZlY3QgKi8KKyNkZWZpbmUgRENDUF9TT0NLT1BUX1NFUlZJQ0UJCTIKKyNkZWZpbmUgRENDUF9TT0NLT1BUX0NIQU5HRV9MCQkzCisjZGVmaW5lIERDQ1BfU09DS09QVF9DSEFOR0VfUgkJNAorI2RlZmluZSBEQ0NQX1NPQ0tPUFRfR0VUX0NVUl9NUFMJNQorI2RlZmluZSBEQ0NQX1NPQ0tPUFRfU0VSVkVSX1RJTUVXQUlUCTYKKyNkZWZpbmUgRENDUF9TT0NLT1BUX1NFTkRfQ1NDT1YJCTEwCisjZGVmaW5lIERDQ1BfU09DS09QVF9SRUNWX0NTQ09WCQkxMQorI2RlZmluZSBEQ0NQX1NPQ0tPUFRfQVZBSUxBQkxFX0NDSURTCTEyCisjZGVmaW5lIERDQ1BfU09DS09QVF9DQ0lECQkxMworI2RlZmluZSBEQ0NQX1NPQ0tPUFRfVFhfQ0NJRAkJMTQKKyNkZWZpbmUgRENDUF9TT0NLT1BUX1JYX0NDSUQJCTE1CisjZGVmaW5lIERDQ1BfU09DS09QVF9RUE9MSUNZX0lECQkxNgorI2RlZmluZSBEQ0NQX1NPQ0tPUFRfUVBPTElDWV9UWFFMRU4JMTcKKyNkZWZpbmUgRENDUF9TT0NLT1BUX0NDSURfUlhfSU5GTwkxMjgKKyNkZWZpbmUgRENDUF9TT0NLT1BUX0NDSURfVFhfSU5GTwkxOTIKKworLyogbWF4aW11bSBudW1iZXIgb2Ygc2VydmljZXMgcHJvdmlkZWQgb24gdGhlIHNhbWUgbGlzdGVuaW5nIHBvcnQgKi8KKyNkZWZpbmUgRENDUF9TRVJWSUNFX0xJU1RfTUFYX0xFTiAgICAgIDMyCisKKworI2VuZGlmIC8qIF9MSU5VWF9EQ0NQX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGxtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RsbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzc4MGIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RsbS5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgQ29weXJpZ2h0IChDKSBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuICAxOTk3LTIwMDMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDggUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoqCisqKiAgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisqKiAgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyoqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0RMTV9ET1RfSF9fCisjZGVmaW5lIF9fRExNX0RPVF9IX18KKworLyoKKyAqIEludGVyZmFjZSB0byBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIgKERMTSkKKyAqIHJvdXRpbmVzIGFuZCBzdHJ1Y3R1cmVzIHRvIHVzZSBETE0gbG9ja3NwYWNlcworICovCisKKy8qIExvY2sgbGV2ZWxzIGFuZCBmbGFncyBhcmUgaGVyZSAqLworI2luY2x1ZGUgPGxpbnV4L2RsbWNvbnN0YW50cy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3R5cGVkZWYgdm9pZCBkbG1fbG9ja3NwYWNlX3Q7CisKKy8qCisgKiBMb2NrIHN0YXR1cyBibG9jaworICoKKyAqIFVzZSB0aGlzIHN0cnVjdHVyZSB0byBzcGVjaWZ5IHRoZSBjb250ZW50cyBvZiB0aGUgbG9jayB2YWx1ZSBibG9jay4gIEZvciBhCisgKiBjb252ZXJzaW9uIHJlcXVlc3QsIHRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jayBJRCBvZiB0aGUKKyAqIGxvY2suICBETE0gd3JpdGVzIHRoZSBzdGF0dXMgb2YgdGhlIGxvY2sgcmVxdWVzdCBhbmQgdGhlIGxvY2sgSUQgYXNzaWduZWQKKyAqIHRvIHRoZSByZXF1ZXN0IGluIHRoZSBsb2NrIHN0YXR1cyBibG9jay4KKyAqCisgKiBzYl9sa2lkOiB0aGUgcmV0dXJuZWQgbG9jayBJRC4gIEl0IGlzIHNldCBvbiBuZXcgKG5vbi1jb252ZXJzaW9uKSByZXF1ZXN0cy4KKyAqIEl0IGlzIGF2YWlsYWJsZSB3aGVuIGRsbV9sb2NrIHJldHVybnMuCisgKgorICogc2JfbHZicHRyOiBzYXZlcyBvciByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgbG9jaydzIExWQiBhY2NvcmRpbmcgdG8gcnVsZXMKKyAqIHNob3duIGZvciB0aGUgRExNX0xLRl9WQUxCTEsgZmxhZy4KKyAqCisgKiBzYl9mbGFnczogRExNX1NCRl9ERU1PVEVEIGlzIHJldHVybmVkIGlmIGluIHRoZSBwcm9jZXNzIG9mIHByb21vdGluZyBhIGxvY2ssCisgKiBpdCB3YXMgZmlyc3QgZGVtb3RlZCB0byBOTCB0byBhdm9pZCBjb252ZXJzaW9uIGRlYWRsb2NrLgorICogRExNX1NCRl9WQUxOT1RWQUxJRCBpcyByZXR1cm5lZCBpZiB0aGUgcmVzb3VyY2UncyBMVkIgaXMgbWFya2VkIGludmFsaWQuCisgKgorICogc2Jfc3RhdHVzOiB0aGUgcmV0dXJuZWQgc3RhdHVzIG9mIHRoZSBsb2NrIHJlcXVlc3Qgc2V0IHByaW9yIHRvIEFTVAorICogZXhlY3V0aW9uLiAgUG9zc2libGUgcmV0dXJuIHZhbHVlczoKKyAqCisgKiAwIGlmIGxvY2sgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bAorICogLUVBR0FJTiBpZiByZXF1ZXN0IHdvdWxkIGJsb2NrIGFuZCBpcyBmbGFnZ2VkIERMTV9MS0ZfTk9RVUVVRQorICogLURMTV9FVU5MT0NLIGlmIHVubG9jayByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsCisgKiAtRExNX0VDQU5DRUwgaWYgYSBjYW5jZWwgY29tcGxldGVkIHN1Y2Nlc3NmdWxseQorICogLUVERUFETEsgaWYgYSBkZWFkbG9jayB3YXMgZGV0ZWN0ZWQKKyAqIC1FVElNRURPVVQgaWYgdGhlIGxvY2sgcmVxdWVzdCB3YXMgY2FuY2VsZWQgZHVlIHRvIGEgdGltZW91dAorICovCisKKyNkZWZpbmUgRExNX1NCRl9ERU1PVEVECQkweDAxCisjZGVmaW5lIERMTV9TQkZfVkFMTk9UVkFMSUQJMHgwMgorI2RlZmluZSBETE1fU0JGX0FMVE1PREUJCTB4MDQKKworc3RydWN0IGRsbV9sa3NiIHsKKwlpbnQgCSBzYl9zdGF0dXM7CisJX191MzIJIHNiX2xraWQ7CisJY2hhciAJIHNiX2ZsYWdzOworCWNoYXIgKgkgc2JfbHZicHRyOworfTsKKworLyogZGxtX25ld19sb2Nrc3BhY2UoKSBmbGFncyAqLworCisjZGVmaW5lIERMTV9MU0ZMX05PRElSCQkweDAwMDAwMDAxCisjZGVmaW5lIERMTV9MU0ZMX1RJTUVXQVJOCTB4MDAwMDAwMDIKKyNkZWZpbmUgRExNX0xTRkxfRlMgICAgIAkweDAwMDAwMDA0CisjZGVmaW5lIERMTV9MU0ZMX05FV0VYQ0wgICAgIAkweDAwMDAwMDA4CisKKworI2VuZGlmCQkJCS8qIF9fRExNX0RPVF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kbG1fZGV2aWNlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RsbV9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmQ5ZWJmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kbG1fZGV2aWNlLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgQ29weXJpZ2h0IChDKSBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuICAxOTk3LTIwMDMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoqCisqKiAgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisqKiAgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyoqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfTElOVVhfRExNX0RFVklDRV9ICisjZGVmaW5lIF9MSU5VWF9ETE1fREVWSUNFX0gKKworLyogVGhpcyBpcyB0aGUgZGV2aWNlIGludGVyZmFjZSBmb3IgZGxtLCBtb3N0IHVzZXJzIHdpbGwgdXNlIGEgbGlicmFyeQorICogaW50ZXJmYWNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kbG0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIERMTV9VU0VSX0xWQl9MRU4JMzIKKworLyogVmVyc2lvbiBvZiB0aGUgZGV2aWNlIGludGVyZmFjZSAqLworI2RlZmluZSBETE1fREVWSUNFX1ZFUlNJT05fTUFKT1IgNgorI2RlZmluZSBETE1fREVWSUNFX1ZFUlNJT05fTUlOT1IgMAorI2RlZmluZSBETE1fREVWSUNFX1ZFUlNJT05fUEFUQ0ggMQorCisvKiBzdHJ1Y3QgcGFzc2VkIHRvIHRoZSBsb2NrIHdyaXRlICovCitzdHJ1Y3QgZGxtX2xvY2tfcGFyYW1zIHsKKwlfX3U4IG1vZGU7CisJX191OCBuYW1lbGVuOworCV9fdTE2IHVudXNlZDsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBsa2lkOworCV9fdTMyIHBhcmVudDsKKwlfX3U2NCB4aWQ7CisJX191NjQgdGltZW91dDsKKwl2b2lkICpjYXN0cGFyYW07CisJdm9pZCAqY2FzdGFkZHI7CisJdm9pZCAqYmFzdHBhcmFtOworCXZvaWQgKmJhc3RhZGRyOworCXN0cnVjdCBkbG1fbGtzYiAqbGtzYjsKKwljaGFyIGx2YltETE1fVVNFUl9MVkJfTEVOXTsKKwljaGFyIG5hbWVbMF07Cit9OworCitzdHJ1Y3QgZGxtX2xzcGFjZV9wYXJhbXMgeworCV9fdTMyIGZsYWdzOworCV9fdTMyIG1pbm9yOworCWNoYXIgbmFtZVswXTsKK307CisKK3N0cnVjdCBkbG1fcHVyZ2VfcGFyYW1zIHsKKwlfX3UzMiBub2RlaWQ7CisJX191MzIgcGlkOworfTsKKworc3RydWN0IGRsbV93cml0ZV9yZXF1ZXN0IHsKKwlfX3UzMiB2ZXJzaW9uWzNdOworCV9fdTggY21kOworCV9fdTggaXM2NGJpdDsKKwlfX3U4IHVudXNlZFsyXTsKKworCXVuaW9uICB7CisJCXN0cnVjdCBkbG1fbG9ja19wYXJhbXMgICBsb2NrOworCQlzdHJ1Y3QgZGxtX2xzcGFjZV9wYXJhbXMgbHNwYWNlOworCQlzdHJ1Y3QgZGxtX3B1cmdlX3BhcmFtcyAgcHVyZ2U7CisJfSBpOworfTsKKworc3RydWN0IGRsbV9kZXZpY2VfdmVyc2lvbiB7CisJX191MzIgdmVyc2lvblszXTsKK307CisKKy8qIHN0cnVjdCByZWFkIGZyb20gdGhlICJkZXZpY2UiIGZkLAorICAgY29uc2lzdHMgbWFpbmx5IG9mIHVzZXJzcGFjZSBwb2ludGVycyBmb3IgdGhlIGxpYnJhcnkgdG8gdXNlICovCisKK3N0cnVjdCBkbG1fbG9ja19yZXN1bHQgeworCV9fdTMyIHZlcnNpb25bM107CisJX191MzIgbGVuZ3RoOworCXZvaWQgKiB1c2VyX2FzdGFkZHI7CisJdm9pZCAqIHVzZXJfYXN0cGFyYW07CisJc3RydWN0IGRsbV9sa3NiICogdXNlcl9sa3NiOworCXN0cnVjdCBkbG1fbGtzYiBsa3NiOworCV9fdTggYmFzdF9tb2RlOworCV9fdTggdW51c2VkWzNdOworCS8qIE9mZnNldHMgbWF5IGJlIHplcm8gaWYgbm8gZGF0YSBpcyBwcmVzZW50ICovCisJX191MzIgbHZiX29mZnNldDsKK307CisKKy8qIENvbW1hbmRzIHBhc3NlZCB0byB0aGUgZGV2aWNlICovCisjZGVmaW5lIERMTV9VU0VSX0xPQ0sgICAgICAgICAxCisjZGVmaW5lIERMTV9VU0VSX1VOTE9DSyAgICAgICAyCisjZGVmaW5lIERMTV9VU0VSX1FVRVJZICAgICAgICAzCisjZGVmaW5lIERMTV9VU0VSX0NSRUFURV9MT0NLU1BBQ0UgIDQKKyNkZWZpbmUgRExNX1VTRVJfUkVNT1ZFX0xPQ0tTUEFDRSAgNQorI2RlZmluZSBETE1fVVNFUl9QVVJHRSAgICAgICAgNgorI2RlZmluZSBETE1fVVNFUl9ERUFETE9DSyAgICAgNworCisvKiBMb2Nrc3BhY2UgZmxhZ3MgKi8KKyNkZWZpbmUgRExNX1VTRVJfTFNGTEdfQVVUT0ZSRUUgICAxCisjZGVmaW5lIERMTV9VU0VSX0xTRkxHX0ZPUkNFRlJFRSAgMgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kbG1fbmV0bGluay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kbG1fbmV0bGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0N2M4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RsbV9uZXRsaW5rLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisgKi8KKworI2lmbmRlZiBfRExNX05FVExJTktfSAorI2RlZmluZSBfRExNX05FVExJTktfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSB7CisJRExNX1NUQVRVU19XQUlUSU5HID0gMSwKKwlETE1fU1RBVFVTX0dSQU5URUQgPSAyLAorCURMTV9TVEFUVVNfQ09OVkVSVCA9IDMsCit9OworCisjZGVmaW5lIERMTV9MT0NLX0RBVEFfVkVSU0lPTiAxCisKK3N0cnVjdCBkbG1fbG9ja19kYXRhIHsKKwlfX3UxNiB2ZXJzaW9uOworCV9fdTMyIGxvY2tzcGFjZV9pZDsKKwlpbnQgbm9kZWlkOworCWludCBvd25waWQ7CisJX191MzIgaWQ7CisJX191MzIgcmVtaWQ7CisJX191NjQgeGlkOworCV9fczggc3RhdHVzOworCV9fczggZ3Jtb2RlOworCV9fczggcnFtb2RlOworCXVuc2lnbmVkIGxvbmcgdGltZXN0YW1wOworCWludCByZXNvdXJjZV9uYW1lbGVuOworCWNoYXIgcmVzb3VyY2VfbmFtZVtETE1fUkVTTkFNRV9NQVhMRU5dOworfTsKKworZW51bSB7CisJRExNX0NNRF9VTlNQRUMgPSAwLAorCURMTV9DTURfSEVMTE8sCQkvKiB1c2VyLT5rZXJuZWwgKi8KKwlETE1fQ01EX1RJTUVPVVQsCS8qIGtlcm5lbC0+dXNlciAqLworCV9fRExNX0NNRF9NQVgsCit9OworCisjZGVmaW5lIERMTV9DTURfTUFYIChfX0RMTV9DTURfTUFYIC0gMSkKKworZW51bSB7CisJRExNX1RZUEVfVU5TUEVDID0gMCwKKwlETE1fVFlQRV9MT0NLLAorCV9fRExNX1RZUEVfTUFYLAorfTsKKworI2RlZmluZSBETE1fVFlQRV9NQVggKF9fRExNX1RZUEVfTUFYIC0gMSkKKworI2RlZmluZSBETE1fR0VOTF9WRVJTSU9OIDB4MQorI2RlZmluZSBETE1fR0VOTF9OQU1FICJETE0iCisKKyNlbmRpZiAvKiBfRExNX05FVExJTktfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kbG1fcGxvY2suaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGxtX3Bsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM1YjQ1MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGxtX3Bsb2NrLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA4IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyAqLworCisjaWZuZGVmIF9fRExNX1BMT0NLX0RPVF9IX18KKyNkZWZpbmUgX19ETE1fUExPQ0tfRE9UX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBETE1fUExPQ0tfTUlTQ19OQU1FCQkiZGxtX3Bsb2NrIgorCisjZGVmaW5lIERMTV9QTE9DS19WRVJTSU9OX01BSk9SCTEKKyNkZWZpbmUgRExNX1BMT0NLX1ZFUlNJT05fTUlOT1IJMgorI2RlZmluZSBETE1fUExPQ0tfVkVSU0lPTl9QQVRDSAkwCisKK2VudW0geworCURMTV9QTE9DS19PUF9MT0NLID0gMSwKKwlETE1fUExPQ0tfT1BfVU5MT0NLLAorCURMTV9QTE9DS19PUF9HRVQsCit9OworCisjZGVmaW5lIERMTV9QTE9DS19GTF9DTE9TRSAxCisKK3N0cnVjdCBkbG1fcGxvY2tfaW5mbyB7CisJX191MzIgdmVyc2lvblszXTsKKwlfX3U4IG9wdHlwZTsKKwlfX3U4IGV4OworCV9fdTggd2FpdDsKKwlfX3U4IGZsYWdzOworCV9fdTMyIHBpZDsKKwlfX3MzMiBub2RlaWQ7CisJX19zMzIgcnY7CisJX191MzIgZnNpZDsKKwlfX3U2NCBudW1iZXI7CisJX191NjQgc3RhcnQ7CisJX191NjQgZW5kOworCV9fdTY0IG93bmVyOworfTsKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kbG1jb25zdGFudHMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGxtY29uc3RhbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdiZjA4ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGxtY29uc3RhbnRzLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgQ29weXJpZ2h0IChDKSBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuICAxOTk3LTIwMDMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoqCisqKiAgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisqKiAgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyoqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0RMTUNPTlNUQU5UU19ET1RfSF9fCisjZGVmaW5lIF9fRExNQ09OU1RBTlRTX0RPVF9IX18KKworLyoKKyAqIENvbnN0YW50cyB1c2VkIGJ5IERMTSBpbnRlcmZhY2UuCisgKi8KKworI2RlZmluZSBETE1fTE9DS1NQQUNFX0xFTiAgICAgICA2NAorI2RlZmluZSBETE1fUkVTTkFNRV9NQVhMRU4gICAgICA2NAorCisKKy8qCisgKiBMb2NrIE1vZGVzCisgKi8KKworI2RlZmluZSBETE1fTE9DS19JVgkJKC0xKQkvKiBpbnZhbGlkICovCisjZGVmaW5lIERMTV9MT0NLX05MCQkwCS8qIG51bGwgKi8KKyNkZWZpbmUgRExNX0xPQ0tfQ1IJCTEJLyogY29uY3VycmVudCByZWFkICovCisjZGVmaW5lIERMTV9MT0NLX0NXCQkyCS8qIGNvbmN1cnJlbnQgd3JpdGUgKi8KKyNkZWZpbmUgRExNX0xPQ0tfUFIJCTMJLyogcHJvdGVjdGVkIHJlYWQgKi8KKyNkZWZpbmUgRExNX0xPQ0tfUFcJCTQJLyogcHJvdGVjdGVkIHdyaXRlICovCisjZGVmaW5lIERMTV9MT0NLX0VYCQk1CS8qIGV4Y2x1c2l2ZSAqLworCisKKy8qCisgKiBGbGFncyB0byBkbG1fbG9jaworICoKKyAqIERMTV9MS0ZfTk9RVUVVRQorICoKKyAqIERvIG5vdCBxdWV1ZSB0aGUgbG9jayByZXF1ZXN0IG9uIHRoZSB3YWl0IHF1ZXVlIGlmIGl0IGNhbm5vdCBiZSBncmFudGVkCisgKiBpbW1lZGlhdGVseS4gIElmIHRoZSBsb2NrIGNhbm5vdCBiZSBncmFudGVkIGJlY2F1c2Ugb2YgdGhpcyBmbGFnLCBETE0gd2lsbAorICogZWl0aGVyIHJldHVybiAtRUFHQUlOIGZyb20gdGhlIGRsbV9sb2NrIGNhbGwgb3Igd2lsbCByZXR1cm4gMCBmcm9tCisgKiBkbG1fbG9jayBhbmQgLUVBR0FJTiBpbiB0aGUgbG9jayBzdGF0dXMgYmxvY2sgd2hlbiB0aGUgQVNUIGlzIGV4ZWN1dGVkLgorICoKKyAqIERMTV9MS0ZfQ0FOQ0VMCisgKgorICogVXNlZCB0byBjYW5jZWwgYSBwZW5kaW5nIGxvY2sgcmVxdWVzdCBvciBjb252ZXJzaW9uLiAgQSBjb252ZXJ0aW5nIGxvY2sgaXMKKyAqIHJldHVybmVkIHRvIGl0cyBwcmV2aW91c2x5IGdyYW50ZWQgbW9kZS4KKyAqCisgKiBETE1fTEtGX0NPTlZFUlQKKyAqCisgKiBJbmRpY2F0ZXMgYSBsb2NrIGNvbnZlcnNpb24gcmVxdWVzdC4gIEZvciBjb252ZXJzaW9ucyB0aGUgbmFtZSBhbmQgbmFtZWxlbgorICogYXJlIGlnbm9yZWQgYW5kIHRoZSBsb2NrIElEIGluIHRoZSBMS1NCIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGxvY2suCisgKgorICogRExNX0xLRl9WQUxCTEsKKyAqCisgKiBSZXF1ZXN0cyBETE0gdG8gcmV0dXJuIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBsb2NrIHZhbHVlIGJsb2NrIGluIHRoZQorICogbG9jayBzdGF0dXMgYmxvY2suICBXaGVuIHRoaXMgZmxhZyBpcyBzZXQgaW4gYSBsb2NrIGNvbnZlcnNpb24gZnJvbSBQVyBvciBFWAorICogbW9kZXMsIERMTSBhc3NpZ25zIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIGxvY2sgc3RhdHVzIGJsb2NrIHRvIHRoZSBsb2NrCisgKiB2YWx1ZSBibG9jayBvZiB0aGUgbG9jayByZXNvdXJjZS4gIFRoZSBMVkIgaXMgYSBETE1fTFZCX0xFTiBzaXplIGFycmF5CisgKiBjb250YWluaW5nIGFwcGxpY2F0aW9uLXNwZWNpZmljIGluZm9ybWF0aW9uLgorICoKKyAqIERMTV9MS0ZfUVVFQ1ZUCisgKgorICogRm9yY2UgYSBjb252ZXJzaW9uIHJlcXVlc3QgdG8gYmUgcXVldWVkLCBldmVuIGlmIGl0IGlzIGNvbXBhdGlibGUgd2l0aAorICogdGhlIGdyYW50ZWQgbW9kZXMgb2Ygb3RoZXIgbG9ja3Mgb24gdGhlIHNhbWUgcmVzb3VyY2UuCisgKgorICogRExNX0xLRl9JVlZBTEJMSworICoKKyAqIEludmFsaWRhdGUgdGhlIGxvY2sgdmFsdWUgYmxvY2suCisgKgorICogRExNX0xLRl9DT05WREVBRExLCisgKgorICogQWxsb3dzIHRoZSBkbG0gdG8gcmVzb2x2ZSBjb252ZXJzaW9uIGRlYWRsb2NrcyBpbnRlcm5hbGx5IGJ5IGRlbW90aW5nIHRoZQorICogZ3JhbnRlZCBtb2RlIG9mIGEgY29udmVydGluZyBsb2NrIHRvIE5MLiAgVGhlIERMTV9TQkZfREVNT1RFRCBmbGFnIGlzCisgKiByZXR1cm5lZCBmb3IgYSBjb252ZXJzaW9uIHRoYXQncyBiZWVuIGVmZmVjdGVkIGJ5IHRoaXMuCisgKgorICogRExNX0xLRl9QRVJTSVNURU5UCisgKgorICogT25seSByZWxldmFudCB0byBsb2NrcyBvcmlnaW5hdGluZyBpbiB1c2Vyc3BhY2UuICBBIHBlcnNpc3RlbnQgbG9jayB3aWxsIG5vdAorICogYmUgcmVtb3ZlZCBpZiB0aGUgcHJvY2VzcyBob2xkaW5nIHRoZSBsb2NrIGV4aXRzLgorICoKKyAqIERMTV9MS0ZfTk9ETENLV1QKKyAqCisgKiBEbyBub3QgY2FuY2VsIHRoZSBsb2NrIGlmIGl0IGdldHMgaW50byBjb252ZXJzaW9uIGRlYWRsb2NrLgorICogRXhjbHVkZSB0aGlzIGxvY2sgZnJvbSBiZWluZyBtb25pdG9yZWQgZHVlIHRvIERMTV9MU0ZMX1RJTUVXQVJOLgorICoKKyAqIERMTV9MS0ZfTk9ETENLQkxLCisgKgorICogbmV0IHlldCBpbXBsZW1lbnRlZAorICoKKyAqIERMTV9MS0ZfRVhQRURJVEUKKyAqCisgKiBVc2VkIG9ubHkgd2l0aCBuZXcgcmVxdWVzdHMgZm9yIE5MIG1vZGUgbG9ja3MuICBUZWxscyB0aGUgbG9jayBtYW5hZ2VyCisgKiB0byBncmFudCB0aGUgbG9jaywgaWdub3Jpbmcgb3RoZXIgbG9ja3MgaW4gY29udmVydCBhbmQgd2FpdCBxdWV1ZXMuCisgKgorICogRExNX0xLRl9OT1FVRVVFQkFTVAorICoKKyAqIFNlbmQgYmxvY2tpbmcgQVNUJ3MgYmVmb3JlIHJldHVybmluZyAtRUFHQUlOIHRvIHRoZSBjYWxsZXIuICBJdCBpcyBvbmx5CisgKiB1c2VkIGFsb25nIHdpdGggdGhlIE5PUVVFVUUgZmxhZy4gIEJsb2NraW5nIEFTVCdzIGFyZSBub3Qgc2VudCBmb3IgZmFpbGVkCisgKiBOT1FVRVVFIHJlcXVlc3RzIG90aGVyd2lzZS4KKyAqCisgKiBETE1fTEtGX0hFQURRVUUKKyAqCisgKiBBZGQgYSBsb2NrIHRvIHRoZSBoZWFkIG9mIHRoZSBjb252ZXJ0IG9yIHdhaXQgcXVldWUgcmF0aGVyIHRoYW4gdGhlIHRhaWwuCisgKgorICogRExNX0xLRl9OT09SREVSCisgKgorICogRGlzcmVnYXJkIHRoZSBzdGFuZGFyZCBncmFudCBvcmRlciBydWxlcyBhbmQgZ3JhbnQgYSBsb2NrIGFzIHNvb24gYXMgaXQKKyAqIGlzIGNvbXBhdGlibGUgd2l0aCBvdGhlciBncmFudGVkIGxvY2tzLgorICoKKyAqIERMTV9MS0ZfT1JQSEFOCisgKgorICogbm90IHlldCBpbXBsZW1lbnRlZAorICoKKyAqIERMTV9MS0ZfQUxUUFIKKyAqCisgKiBJZiB0aGUgcmVxdWVzdGVkIG1vZGUgY2Fubm90IGJlIGdyYW50ZWQgaW1tZWRpYXRlbHksIHRyeSB0byBncmFudCB0aGUgbG9jaworICogaW4gUFIgbW9kZSBpbnN0ZWFkLiAgSWYgdGhpcyBhbHRlcm5hdGUgbW9kZSBpcyBncmFudGVkIGluc3RlYWQgb2YgdGhlCisgKiByZXF1ZXN0ZWQgbW9kZSwgRExNX1NCRl9BTFRNT0RFIGlzIHJldHVybmVkIGluIHRoZSBsa3NiLgorICoKKyAqIERMTV9MS0ZfQUxUQ1cKKyAqCisgKiBUaGUgc2FtZSBhcyBBTFRQUiwgYnV0IHRoZSBhbHRlcm5hdGUgbW9kZSBpcyBDVy4KKyAqCisgKiBETE1fTEtGX0ZPUkNFVU5MT0NLCisgKgorICogVW5sb2NrIHRoZSBsb2NrIGV2ZW4gaWYgaXQgaXMgY29udmVydGluZyBvciB3YWl0aW5nIG9yIGhhcyBzdWJsb2Nrcy4KKyAqIE9ubHkgcmVhbGx5IGZvciB1c2UgYnkgdGhlIHVzZXJsYW5kIGRldmljZS5jIGNvZGUuCisgKgorICovCisKKyNkZWZpbmUgRExNX0xLRl9OT1FVRVVFCQkweDAwMDAwMDAxCisjZGVmaW5lIERMTV9MS0ZfQ0FOQ0VMCQkweDAwMDAwMDAyCisjZGVmaW5lIERMTV9MS0ZfQ09OVkVSVAkJMHgwMDAwMDAwNAorI2RlZmluZSBETE1fTEtGX1ZBTEJMSwkJMHgwMDAwMDAwOAorI2RlZmluZSBETE1fTEtGX1FVRUNWVAkJMHgwMDAwMDAxMAorI2RlZmluZSBETE1fTEtGX0lWVkFMQkxLCTB4MDAwMDAwMjAKKyNkZWZpbmUgRExNX0xLRl9DT05WREVBRExLCTB4MDAwMDAwNDAKKyNkZWZpbmUgRExNX0xLRl9QRVJTSVNURU5UCTB4MDAwMDAwODAKKyNkZWZpbmUgRExNX0xLRl9OT0RMQ0tXVAkweDAwMDAwMTAwCisjZGVmaW5lIERMTV9MS0ZfTk9ETENLQkxLCTB4MDAwMDAyMDAKKyNkZWZpbmUgRExNX0xLRl9FWFBFRElURQkweDAwMDAwNDAwCisjZGVmaW5lIERMTV9MS0ZfTk9RVUVVRUJBU1QJMHgwMDAwMDgwMAorI2RlZmluZSBETE1fTEtGX0hFQURRVUUJCTB4MDAwMDEwMDAKKyNkZWZpbmUgRExNX0xLRl9OT09SREVSCQkweDAwMDAyMDAwCisjZGVmaW5lIERMTV9MS0ZfT1JQSEFOCQkweDAwMDA0MDAwCisjZGVmaW5lIERMTV9MS0ZfQUxUUFIJCTB4MDAwMDgwMDAKKyNkZWZpbmUgRExNX0xLRl9BTFRDVwkJMHgwMDAxMDAwMAorI2RlZmluZSBETE1fTEtGX0ZPUkNFVU5MT0NLCTB4MDAwMjAwMDAKKyNkZWZpbmUgRExNX0xLRl9USU1FT1VUCQkweDAwMDQwMDAwCisKKy8qCisgKiBTb21lIHJldHVybiBjb2RlcyB0aGF0IGFyZSBub3QgaW4gZXJybm8uaAorICovCisKKyNkZWZpbmUgRExNX0VDQU5DRUwJCTB4MTAwMDEKKyNkZWZpbmUgRExNX0VVTkxPQ0sJCTB4MTAwMDIKKworI2VuZGlmICAvKiBfX0RMTUNPTlNUQU5UU19ET1RfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RtLWlvY3RsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RtLWlvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmZDU1NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZG0taW9jdGwuaApAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDMgU2lzdGluYSBTb2Z0d2FyZSAoVUspIExpbWl0ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA5IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIExHUEwuCisgKi8KKworI2lmbmRlZiBfTElOVVhfRE1fSU9DVExfVjRfSAorI2RlZmluZSBfTElOVVhfRE1fSU9DVExfVjRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBETV9ESVIgIm1hcHBlciIJCS8qIFNsYXNoZXMgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBETV9DT05UUk9MX05PREUgImNvbnRyb2wiCisjZGVmaW5lIERNX01BWF9UWVBFX05BTUUgMTYKKyNkZWZpbmUgRE1fTkFNRV9MRU4gMTI4CisjZGVmaW5lIERNX1VVSURfTEVOIDEyOQorCisvKgorICogQSB0cmFkaXRpb25hbCBpb2N0bCBpbnRlcmZhY2UgZm9yIHRoZSBkZXZpY2UgbWFwcGVyLgorICoKKyAqIEVhY2ggZGV2aWNlIGNhbiBoYXZlIHR3byB0YWJsZXMgYXNzb2NpYXRlZCB3aXRoIGl0LCBhbgorICogJ2FjdGl2ZScgdGFibGUgd2hpY2ggaXMgdGhlIG9uZSBjdXJyZW50bHkgdXNlZCBieSBpbyBwYXNzaW5nCisgKiB0aHJvdWdoIHRoZSBkZXZpY2UsIGFuZCBhbiAnaW5hY3RpdmUnIG9uZSB3aGljaCBpcyBhIHRhYmxlCisgKiB0aGF0IGlzIGJlaW5nIHByZXBhcmVkIGFzIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSAnYWN0aXZlJyBvbmUuCisgKgorICogRE1fVkVSU0lPTjoKKyAqIEp1c3QgZ2V0IHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciB0aGUgaW9jdGwgaW50ZXJmYWNlLgorICoKKyAqIERNX1JFTU9WRV9BTEw6CisgKiBSZW1vdmUgYWxsIGRtIGRldmljZXMsIGRlc3Ryb3kgYWxsIHRhYmxlcy4gIE9ubHkgcmVhbGx5IHVzZWQKKyAqIGZvciBkZWJ1Zy4KKyAqCisgKiBETV9MSVNUX0RFVklDRVM6CisgKiBHZXQgYSBsaXN0IG9mIGFsbCB0aGUgZG0gZGV2aWNlIG5hbWVzLgorICoKKyAqIERNX0RFVl9DUkVBVEU6CisgKiBDcmVhdGUgYSBuZXcgZGV2aWNlLCBuZWl0aGVyIHRoZSAnYWN0aXZlJyBvciAnaW5hY3RpdmUnIHRhYmxlCisgKiBzbG90cyB3aWxsIGJlIGZpbGxlZC4gIFRoZSBkZXZpY2Ugd2lsbCBiZSBpbiBzdXNwZW5kZWQgc3RhdGUKKyAqIGFmdGVyIGNyZWF0aW9uLCBob3dldmVyIGFueSBpbyB0byB0aGUgZGV2aWNlIHdpbGwgZ2V0IGVycm9yZWQKKyAqIHNpbmNlIGl0IHdpbGwgYmUgb3V0LW9mLWJvdW5kcy4KKyAqCisgKiBETV9ERVZfUkVNT1ZFOgorICogUmVtb3ZlIGEgZGV2aWNlLCBkZXN0cm95IGFueSB0YWJsZXMuCisgKgorICogRE1fREVWX1JFTkFNRToKKyAqIFJlbmFtZSBhIGRldmljZSBvciBzZXQgaXRzIHV1aWQgaWYgbm9uZSB3YXMgcHJldmlvdXNseSBzdXBwbGllZC4KKyAqCisgKiBETV9TVVNQRU5EOgorICogVGhpcyBwZXJmb3JtcyBib3RoIHN1c3BlbmQgYW5kIHJlc3VtZSwgZGVwZW5kaW5nIHdoaWNoIGZsYWcgaXMKKyAqIHBhc3NlZCBpbi4KKyAqIFN1c3BlbmQ6IFRoaXMgY29tbWFuZCB3aWxsIG5vdCByZXR1cm4gdW50aWwgYWxsIHBlbmRpbmcgaW8gdG8KKyAqIHRoZSBkZXZpY2UgaGFzIGNvbXBsZXRlZC4gIEZ1cnRoZXIgaW8gd2lsbCBiZSBkZWZlcnJlZCB1bnRpbAorICogdGhlIGRldmljZSBpcyByZXN1bWVkLgorICogUmVzdW1lOiBJdCBpcyBubyBsb25nZXIgYW4gZXJyb3IgdG8gaXNzdWUgdGhpcyBjb21tYW5kIG9uIGFuCisgKiB1bnN1c3BlbmRlZCBkZXZpY2UuICBJZiBhIHRhYmxlIGlzIHByZXNlbnQgaW4gdGhlICdpbmFjdGl2ZScKKyAqIHNsb3QsIGl0IHdpbGwgYmUgbW92ZWQgdG8gdGhlIGFjdGl2ZSBzbG90LCB0aGVuIHRoZSBvbGQgdGFibGUKKyAqIGZyb20gdGhlIGFjdGl2ZSBzbG90IHdpbGwgYmUgX2Rlc3Ryb3llZF8uICBGaW5hbGx5IHRoZSBkZXZpY2UKKyAqIGlzIHJlc3VtZWQuCisgKgorICogRE1fREVWX1NUQVRVUzoKKyAqIFJldHJpZXZlcyB0aGUgc3RhdHVzIGZvciB0aGUgdGFibGUgaW4gdGhlICdhY3RpdmUnIHNsb3QuCisgKgorICogRE1fREVWX1dBSVQ6CisgKiBXYWl0IGZvciBhIHNpZ25pZmljYW50IGV2ZW50IHRvIG9jY3VyIHRvIHRoZSBkZXZpY2UuICBUaGlzCisgKiBjb3VsZCBlaXRoZXIgYmUgY2F1c2VkIGJ5IGFuIGV2ZW50IHRyaWdnZXJlZCBieSBvbmUgb2YgdGhlCisgKiB0YXJnZXRzIG9mIHRoZSB0YWJsZSBpbiB0aGUgJ2FjdGl2ZScgc2xvdCwgb3IgYSB0YWJsZSBjaGFuZ2UuCisgKgorICogRE1fVEFCTEVfTE9BRDoKKyAqIExvYWQgYSB0YWJsZSBpbnRvIHRoZSAnaW5hY3RpdmUnIHNsb3QgZm9yIHRoZSBkZXZpY2UuICBUaGUKKyAqIGRldmljZSBkb2VzIF9ub3RfIG5lZWQgdG8gYmUgc3VzcGVuZGVkIHByaW9yIHRvIHRoaXMgY29tbWFuZC4KKyAqCisgKiBETV9UQUJMRV9DTEVBUjoKKyAqIERlc3Ryb3kgYW55IHRhYmxlIGluIHRoZSAnaW5hY3RpdmUnIHNsb3QgKGllLiBhYm9ydCkuCisgKgorICogRE1fVEFCTEVfREVQUzoKKyAqIFJldHVybiBhIHNldCBvZiBkZXZpY2UgZGVwZW5kZW5jaWVzIGZvciB0aGUgJ2FjdGl2ZScgdGFibGUuCisgKgorICogRE1fVEFCTEVfU1RBVFVTOgorICogUmV0dXJuIHRoZSB0YXJnZXRzIHN0YXR1cyBmb3IgdGhlICdhY3RpdmUnIHRhYmxlLgorICoKKyAqIERNX1RBUkdFVF9NU0c6CisgKiBQYXNzIGEgbWVzc2FnZSBzdHJpbmcgdG8gdGhlIHRhcmdldCBhdCBhIHNwZWNpZmljIG9mZnNldCBvZiBhIGRldmljZS4KKyAqCisgKiBETV9ERVZfU0VUX0dFT01FVFJZOgorICogU2V0IHRoZSBnZW9tZXRyeSBvZiBhIGRldmljZSBieSBwYXNzaW5nIGluIGEgc3RyaW5nIGluIHRoaXMgZm9ybWF0OgorICoKKyAqICJjeWxpbmRlcnMgaGVhZHMgc2VjdG9yc19wZXJfdHJhY2sgc3RhcnRfc2VjdG9yIgorICoKKyAqIEJld2FyZSB0aGF0IENIUyBnZW9tZXRyeSBpcyBuZWFybHkgb2Jzb2xldGUgYW5kIG9ubHkgcHJvdmlkZWQKKyAqIGZvciBjb21wYXRpYmlsaXR5IHdpdGggZG0gZGV2aWNlcyB0aGF0IGNhbiBiZSBib290ZWQgYnkgYSBQQworICogQklPUy4gIFNlZSBzdHJ1Y3QgaGRfZ2VvbWV0cnkgZm9yIHJhbmdlIGxpbWl0cy4gIEFsc28gbm90ZSB0aGF0CisgKiB0aGUgZ2VvbWV0cnkgaXMgZXJhc2VkIGlmIHRoZSBkZXZpY2Ugc2l6ZSBjaGFuZ2VzLgorICovCisKKy8qCisgKiBBbGwgaW9jdGwgYXJndW1lbnRzIGNvbnNpc3Qgb2YgYSBzaW5nbGUgY2h1bmsgb2YgbWVtb3J5LCB3aXRoCisgKiB0aGlzIHN0cnVjdHVyZSBhdCB0aGUgc3RhcnQuICBJZiBhIHV1aWQgaXMgc3BlY2lmaWVkIGFueQorICogbG9va3VwIChlZy4gZm9yIGEgRE1fSU5GTykgd2lsbCBiZSBkb25lIG9uIHRoYXQsICpub3QqIHRoZQorICogbmFtZS4KKyAqLworc3RydWN0IGRtX2lvY3RsIHsKKwkvKgorCSAqIFRoZSB2ZXJzaW9uIG51bWJlciBpcyBtYWRlIHVwIG9mIHRocmVlIHBhcnRzOgorCSAqIG1ham9yIC0gbm8gYmFja3dhcmQgb3IgZm9yd2FyZCBjb21wYXRpYmlsaXR5LAorCSAqIG1pbm9yIC0gb25seSBiYWNrd2FyZHMgY29tcGF0aWJsZSwKKwkgKiBwYXRjaCAtIGJvdGggYmFja3dhcmRzIGFuZCBmb3J3YXJkcyBjb21wYXRpYmxlLgorCSAqCisJICogQWxsIGNsaWVudHMgb2YgdGhlIGlvY3RsIGludGVyZmFjZSBzaG91bGQgZmlsbCBpbiB0aGUKKwkgKiB2ZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgdGhleSB3ZXJlCisJICogY29tcGlsZWQgd2l0aC4KKwkgKgorCSAqIEFsbCByZWNvZ25pc2VkIGlvY3RsIGNvbW1hbmRzIChpZS4gdGhvc2UgdGhhdCBkb24ndAorCSAqIHJldHVybiAtRU5PVFRZKSBmaWxsIG91dCB0aGlzIGZpZWxkLCBldmVuIGlmIHRoZQorCSAqIGNvbW1hbmQgZmFpbGVkLgorCSAqLworCV9fdTMyIHZlcnNpb25bM107CS8qIGluL291dCAqLworCV9fdTMyIGRhdGFfc2l6ZTsJLyogdG90YWwgc2l6ZSBvZiBkYXRhIHBhc3NlZCBpbgorCQkJCSAqIGluY2x1ZGluZyB0aGlzIHN0cnVjdCAqLworCisJX191MzIgZGF0YV9zdGFydDsJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGRhdGEKKwkJCQkgKiByZWxhdGl2ZSB0byBzdGFydCBvZiB0aGlzIHN0cnVjdCAqLworCisJX191MzIgdGFyZ2V0X2NvdW50OwkvKiBpbi9vdXQgKi8KKwlfX3MzMiBvcGVuX2NvdW50OwkvKiBvdXQgKi8KKwlfX3UzMiBmbGFnczsJCS8qIGluL291dCAqLworCisJLyoKKwkgKiBldmVudF9uciBob2xkcyBlaXRoZXIgdGhlIGV2ZW50IG51bWJlciAoaW5wdXQgYW5kIG91dHB1dCkgb3IgdGhlCisJICogdWRldiBjb29raWUgdmFsdWUgKGlucHV0IG9ubHkpLgorCSAqIFRoZSBETV9ERVZfV0FJVCBpb2N0bCB0YWtlcyBhbiBldmVudCBudW1iZXIgYXMgaW5wdXQuCisJICogVGhlIERNX1NVU1BFTkQsIERNX0RFVl9SRU1PVkUgYW5kIERNX0RFVl9SRU5BTUUgaW9jdGxzCisJICogdXNlIHRoZSBmaWVsZCBhcyBhIGNvb2tpZSB0byByZXR1cm4gaW4gdGhlIERNX0NPT0tJRQorCSAqIHZhcmlhYmxlIHdpdGggdGhlIHVldmVudHMgdGhleSBpc3N1ZS4KKwkgKiBGb3Igb3V0cHV0LCB0aGUgaW9jdGxzIHJldHVybiB0aGUgZXZlbnQgbnVtYmVyLCBub3QgdGhlIGNvb2tpZS4KKwkgKi8KKwlfX3UzMiBldmVudF9ucjsgICAgICAJLyogaW4vb3V0ICovCisJX191MzIgcGFkZGluZzsKKworCV9fdTY0IGRldjsJCS8qIGluL291dCAqLworCisJY2hhciBuYW1lW0RNX05BTUVfTEVOXTsJLyogZGV2aWNlIG5hbWUgKi8KKwljaGFyIHV1aWRbRE1fVVVJRF9MRU5dOwkvKiB1bmlxdWUgaWRlbnRpZmllciBmb3IKKwkJCQkgKiB0aGUgYmxvY2sgZGV2aWNlICovCisJY2hhciBkYXRhWzddOwkJLyogcGFkZGluZyBvciBkYXRhICovCit9OworCisvKgorICogVXNlZCB0byBzcGVjaWZ5IHRhYmxlcy4gIFRoZXNlIHN0cnVjdHVyZXMgYXBwZWFyIGFmdGVyIHRoZQorICogZG1faW9jdGwuCisgKi8KK3N0cnVjdCBkbV90YXJnZXRfc3BlYyB7CisJX191NjQgc2VjdG9yX3N0YXJ0OworCV9fdTY0IGxlbmd0aDsKKwlfX3MzMiBzdGF0dXM7CQkvKiB1c2VkIHdoZW4gcmVhZGluZyBmcm9tIGtlcm5lbCBvbmx5ICovCisKKwkvKgorCSAqIExvY2F0aW9uIG9mIHRoZSBuZXh0IGRtX3RhcmdldF9zcGVjLgorCSAqIC0gV2hlbiBzcGVjaWZ5aW5nIHRhcmdldHMgb24gYSBETV9UQUJMRV9MT0FEIGNvbW1hbmQsIHRoaXMgdmFsdWUgaXMKKwkgKiAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlICJjdXJyZW50IiBkbV90YXJnZXRfc3BlYworCSAqICAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAibmV4dCIgZG1fdGFyZ2V0X3NwZWMuCisJICogLSBXaGVuIHJldHJpZXZpbmcgdGFyZ2V0cyBvbiBhIERNX1RBQkxFX1NUQVRVUyBjb21tYW5kLCB0aGlzIHZhbHVlCisJICogICBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBkbV90YXJnZXRfc3BlYworCSAqICAgKHRoYXQgZm9sbG93cyB0aGUgZG1faW9jdGwgc3RydWN0KSB0byB0aGUgc3RhcnQgb2YgdGhlICJuZXh0IgorCSAqICAgZG1fdGFyZ2V0X3NwZWMuCisJICovCisJX191MzIgbmV4dDsKKworCWNoYXIgdGFyZ2V0X3R5cGVbRE1fTUFYX1RZUEVfTkFNRV07CisKKwkvKgorCSAqIFBhcmFtZXRlciBzdHJpbmcgc3RhcnRzIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgb2JqZWN0LgorCSAqIEJlIGNhcmVmdWwgdG8gYWRkIHBhZGRpbmcgYWZ0ZXIgc3RyaW5nIHRvIGVuc3VyZSBjb3JyZWN0CisJICogYWxpZ25tZW50IG9mIHN1YnNlcXVlbnQgZG1fdGFyZ2V0X3NwZWMuCisJICovCit9OworCisvKgorICogVXNlZCB0byByZXRyaWV2ZSB0aGUgdGFyZ2V0IGRlcGVuZGVuY2llcy4KKyAqLworc3RydWN0IGRtX3RhcmdldF9kZXBzIHsKKwlfX3UzMiBjb3VudDsJLyogQXJyYXkgc2l6ZSAqLworCV9fdTMyIHBhZGRpbmc7CS8qIHVudXNlZCAqLworCV9fdTY0IGRldlswXTsJLyogb3V0ICovCit9OworCisvKgorICogVXNlZCB0byBnZXQgYSBsaXN0IG9mIGFsbCBkbSBkZXZpY2VzLgorICovCitzdHJ1Y3QgZG1fbmFtZV9saXN0IHsKKwlfX3U2NCBkZXY7CisJX191MzIgbmV4dDsJCS8qIG9mZnNldCB0byB0aGUgbmV4dCByZWNvcmQgZnJvbQorCQkJCSAgIHRoZSBfc3RhcnRfIG9mIHRoaXMgKi8KKwljaGFyIG5hbWVbMF07Cit9OworCisvKgorICogVXNlZCB0byByZXRyaWV2ZSB0aGUgdGFyZ2V0IHZlcnNpb25zCisgKi8KK3N0cnVjdCBkbV90YXJnZXRfdmVyc2lvbnMgeworICAgICAgICBfX3UzMiBuZXh0OworICAgICAgICBfX3UzMiB2ZXJzaW9uWzNdOworCisgICAgICAgIGNoYXIgbmFtZVswXTsKK307CisKKy8qCisgKiBVc2VkIHRvIHBhc3MgbWVzc2FnZSB0byBhIHRhcmdldAorICovCitzdHJ1Y3QgZG1fdGFyZ2V0X21zZyB7CisJX191NjQgc2VjdG9yOwkvKiBEZXZpY2Ugc2VjdG9yICovCisKKwljaGFyIG1lc3NhZ2VbMF07Cit9OworCisvKgorICogSWYgeW91IGNoYW5nZSB0aGlzIG1ha2Ugc3VyZSB5b3UgbWFrZSB0aGUgY29ycmVzcG9uZGluZyBjaGFuZ2UKKyAqIHRvIGRtLWlvY3RsLmM6bG9va3VwX2lvY3RsKCkKKyAqLworZW51bSB7CisJLyogVG9wIGxldmVsIGNtZHMgKi8KKwlETV9WRVJTSU9OX0NNRCA9IDAsCisJRE1fUkVNT1ZFX0FMTF9DTUQsCisJRE1fTElTVF9ERVZJQ0VTX0NNRCwKKworCS8qIGRldmljZSBsZXZlbCBjbWRzICovCisJRE1fREVWX0NSRUFURV9DTUQsCisJRE1fREVWX1JFTU9WRV9DTUQsCisJRE1fREVWX1JFTkFNRV9DTUQsCisJRE1fREVWX1NVU1BFTkRfQ01ELAorCURNX0RFVl9TVEFUVVNfQ01ELAorCURNX0RFVl9XQUlUX0NNRCwKKworCS8qIFRhYmxlIGxldmVsIGNtZHMgKi8KKwlETV9UQUJMRV9MT0FEX0NNRCwKKwlETV9UQUJMRV9DTEVBUl9DTUQsCisJRE1fVEFCTEVfREVQU19DTUQsCisJRE1fVEFCTEVfU1RBVFVTX0NNRCwKKworCS8qIEFkZGVkIGxhdGVyICovCisJRE1fTElTVF9WRVJTSU9OU19DTUQsCisJRE1fVEFSR0VUX01TR19DTUQsCisJRE1fREVWX1NFVF9HRU9NRVRSWV9DTUQKK307CisKKyNkZWZpbmUgRE1fSU9DVEwgMHhmZAorCisjZGVmaW5lIERNX1ZFUlNJT04gICAgICAgX0lPV1IoRE1fSU9DVEwsIERNX1ZFUlNJT05fQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisjZGVmaW5lIERNX1JFTU9WRV9BTEwgICAgX0lPV1IoRE1fSU9DVEwsIERNX1JFTU9WRV9BTExfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisjZGVmaW5lIERNX0xJU1RfREVWSUNFUyAgX0lPV1IoRE1fSU9DVEwsIERNX0xJU1RfREVWSUNFU19DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKworI2RlZmluZSBETV9ERVZfQ1JFQVRFICAgIF9JT1dSKERNX0lPQ1RMLCBETV9ERVZfQ1JFQVRFX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorI2RlZmluZSBETV9ERVZfUkVNT1ZFICAgIF9JT1dSKERNX0lPQ1RMLCBETV9ERVZfUkVNT1ZFX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorI2RlZmluZSBETV9ERVZfUkVOQU1FICAgIF9JT1dSKERNX0lPQ1RMLCBETV9ERVZfUkVOQU1FX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorI2RlZmluZSBETV9ERVZfU1VTUEVORCAgIF9JT1dSKERNX0lPQ1RMLCBETV9ERVZfU1VTUEVORF9DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKyNkZWZpbmUgRE1fREVWX1NUQVRVUyAgICBfSU9XUihETV9JT0NUTCwgRE1fREVWX1NUQVRVU19DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKyNkZWZpbmUgRE1fREVWX1dBSVQgICAgICBfSU9XUihETV9JT0NUTCwgRE1fREVWX1dBSVRfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisKKyNkZWZpbmUgRE1fVEFCTEVfTE9BRCAgICBfSU9XUihETV9JT0NUTCwgRE1fVEFCTEVfTE9BRF9DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKyNkZWZpbmUgRE1fVEFCTEVfQ0xFQVIgICBfSU9XUihETV9JT0NUTCwgRE1fVEFCTEVfQ0xFQVJfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisjZGVmaW5lIERNX1RBQkxFX0RFUFMgICAgX0lPV1IoRE1fSU9DVEwsIERNX1RBQkxFX0RFUFNfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisjZGVmaW5lIERNX1RBQkxFX1NUQVRVUyAgX0lPV1IoRE1fSU9DVEwsIERNX1RBQkxFX1NUQVRVU19DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKworI2RlZmluZSBETV9MSVNUX1ZFUlNJT05TIF9JT1dSKERNX0lPQ1RMLCBETV9MSVNUX1ZFUlNJT05TX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorCisjZGVmaW5lIERNX1RBUkdFVF9NU0cJIF9JT1dSKERNX0lPQ1RMLCBETV9UQVJHRVRfTVNHX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorI2RlZmluZSBETV9ERVZfU0VUX0dFT01FVFJZCV9JT1dSKERNX0lPQ1RMLCBETV9ERVZfU0VUX0dFT01FVFJZX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorCisjZGVmaW5lIERNX1ZFUlNJT05fTUFKT1IJNAorI2RlZmluZSBETV9WRVJTSU9OX01JTk9SCTIyCisjZGVmaW5lIERNX1ZFUlNJT05fUEFUQ0hMRVZFTAkwCisjZGVmaW5lIERNX1ZFUlNJT05fRVhUUkEJIi1pb2N0bCAoMjAxMS0xMC0xOSkiCisKKy8qIFN0YXR1cyBiaXRzICovCisjZGVmaW5lIERNX1JFQURPTkxZX0ZMQUcJKDEgPDwgMCkgLyogSW4vT3V0ICovCisjZGVmaW5lIERNX1NVU1BFTkRfRkxBRwkJKDEgPDwgMSkgLyogSW4vT3V0ICovCisjZGVmaW5lIERNX1BFUlNJU1RFTlRfREVWX0ZMQUcJKDEgPDwgMykgLyogSW4gKi8KKworLyoKKyAqIEZsYWcgcGFzc2VkIGludG8gaW9jdGwgU1RBVFVTIGNvbW1hbmQgdG8gZ2V0IHRhYmxlIGluZm9ybWF0aW9uCisgKiByYXRoZXIgdGhhbiBjdXJyZW50IHN0YXR1cy4KKyAqLworI2RlZmluZSBETV9TVEFUVVNfVEFCTEVfRkxBRwkoMSA8PCA0KSAvKiBJbiAqLworCisvKgorICogRmxhZ3MgdGhhdCBpbmRpY2F0ZSB3aGV0aGVyIGEgdGFibGUgaXMgcHJlc2VudCBpbiBlaXRoZXIgb2YKKyAqIHRoZSB0d28gdGFibGUgc2xvdHMgdGhhdCBhIGRldmljZSBoYXMuCisgKi8KKyNkZWZpbmUgRE1fQUNUSVZFX1BSRVNFTlRfRkxBRyAgICgxIDw8IDUpIC8qIE91dCAqLworI2RlZmluZSBETV9JTkFDVElWRV9QUkVTRU5UX0ZMQUcgKDEgPDwgNikgLyogT3V0ICovCisKKy8qCisgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgYnVmZmVyIHBhc3NlZCBpbiB3YXNuJ3QgYmlnIGVub3VnaCBmb3IgdGhlCisgKiByZXN1bHRzLgorICovCisjZGVmaW5lIERNX0JVRkZFUl9GVUxMX0ZMQUcJKDEgPDwgOCkgLyogT3V0ICovCisKKy8qCisgKiBUaGlzIGZsYWcgaXMgbm93IGlnbm9yZWQuCisgKi8KKyNkZWZpbmUgRE1fU0tJUF9CREdFVF9GTEFHCSgxIDw8IDkpIC8qIEluICovCisKKy8qCisgKiBTZXQgdGhpcyB0byBhdm9pZCBhdHRlbXB0aW5nIHRvIGZyZWV6ZSBhbnkgZmlsZXN5c3RlbSB3aGVuIHN1c3BlbmRpbmcuCisgKi8KKyNkZWZpbmUgRE1fU0tJUF9MT0NLRlNfRkxBRwkoMSA8PCAxMCkgLyogSW4gKi8KKworLyoKKyAqIFNldCB0aGlzIHRvIHN1c3BlbmQgd2l0aG91dCBmbHVzaGluZyBxdWV1ZWQgaW9zLgorICovCisjZGVmaW5lIERNX05PRkxVU0hfRkxBRwkJKDEgPDwgMTEpIC8qIEluICovCisKKy8qCisgKiBJZiBzZXQsIGFueSB0YWJsZSBpbmZvcm1hdGlvbiByZXR1cm5lZCB3aWxsIHJlbGF0ZSB0byB0aGUgaW5hY3RpdmUKKyAqIHRhYmxlIGluc3RlYWQgb2YgdGhlIGxpdmUgb25lLiAgQWx3YXlzIGNoZWNrIERNX0lOQUNUSVZFX1BSRVNFTlRfRkxBRworICogaXMgc2V0IGJlZm9yZSB1c2luZyB0aGUgZGF0YSByZXR1cm5lZC4KKyAqLworI2RlZmluZSBETV9RVUVSWV9JTkFDVElWRV9UQUJMRV9GTEFHCSgxIDw8IDEyKSAvKiBJbiAqLworCisvKgorICogSWYgc2V0LCBhIHVldmVudCB3YXMgZ2VuZXJhdGVkIGZvciB3aGljaCB0aGUgY2FsbGVyIG1heSBuZWVkIHRvIHdhaXQuCisgKi8KKyNkZWZpbmUgRE1fVUVWRU5UX0dFTkVSQVRFRF9GTEFHCSgxIDw8IDEzKSAvKiBPdXQgKi8KKworLyoKKyAqIElmIHNldCwgcmVuYW1lIGNoYW5nZXMgdGhlIHV1aWQgbm90IHRoZSBuYW1lLiAgT25seSBwZXJtaXR0ZWQKKyAqIGlmIG5vIHV1aWQgd2FzIHByZXZpb3VzbHkgc3VwcGxpZWQ6IGFuIGV4aXN0aW5nIHV1aWQgY2Fubm90IGJlIGNoYW5nZWQuCisgKi8KKyNkZWZpbmUgRE1fVVVJRF9GTEFHCQkJKDEgPDwgMTQpIC8qIEluICovCisKKy8qCisgKiBJZiBzZXQsIGFsbCBidWZmZXJzIGFyZSB3aXBlZCBhZnRlciB1c2UuIFVzZSB3aGVuIHNlbmRpbmcKKyAqIG9yIHJlcXVlc3Rpbmcgc2Vuc2l0aXZlIGRhdGEgc3VjaCBhcyBhbiBlbmNyeXB0aW9uIGtleS4KKyAqLworI2RlZmluZSBETV9TRUNVUkVfREFUQV9GTEFHCQkoMSA8PCAxNSkgLyogSW4gKi8KKworI2VuZGlmCQkJCS8qIF9MSU5VWF9ETV9JT0NUTF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RtLWxvZy11c2Vyc3BhY2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZG0tbG9nLXVzZXJzcGFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NzhjMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RtLWxvZy11c2Vyc3BhY2UuaApAQCAtMCwwICsxLDQxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA5IFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIExHUEwuCisgKi8KKworI2lmbmRlZiBfX0RNX0xPR19VU0VSU1BBQ0VfSF9fCisjZGVmaW5lIF9fRE1fTE9HX1VTRVJTUEFDRV9IX18KKworI2luY2x1ZGUgPGxpbnV4L2RtLWlvY3RsLmg+IC8qIEZvciBETV9VVUlEX0xFTiAqLworCisvKgorICogVGhlIGRldmljZS1tYXBwZXIgdXNlcnNwYWNlIGxvZyBtb2R1bGUgY29uc2lzdHMgb2YgYSBrZXJuZWwgY29tcG9uZW50IGFuZAorICogYSB1c2VyLXNwYWNlIGNvbXBvbmVudC4gIFRoZSBrZXJuZWwgY29tcG9uZW50IGltcGxlbWVudHMgdGhlIEFQSSBkZWZpbmVkCisgKiBpbiBkbS1kaXJ0eS1sb2cuaC4gIEl0cyBwdXJwb3NlIGlzIHNpbXBseSB0byBwYXNzIHRoZSBwYXJhbWV0ZXJzIGFuZAorICogcmV0dXJuIHZhbHVlcyBvZiB0aG9zZSBBUEkgZnVuY3Rpb25zIGJldHdlZW4ga2VybmVsIGFuZCB1c2VyLXNwYWNlLgorICoKKyAqIEJlbG93IGFyZSBkZWZpbmVkIHRoZSAncmVxdWVzdF90eXBlcycgLSBETV9VTE9HX0NUUiwgRE1fVUxPR19EVFIsIGV0Yy4KKyAqIFRoZXNlIHJlcXVlc3QgdHlwZXMgcmVwcmVzZW50IHRoZSBkaWZmZXJlbnQgZnVuY3Rpb25zIGluIHRoZSBkZXZpY2UtbWFwcGVyCisgKiBkaXJ0eSBsb2cgQVBJLiAgRWFjaCBvZiB0aGVzZSBpcyBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgYmVsb3cuCisgKgorICogVGhlIHVzZXItc3BhY2UgcHJvZ3JhbSBtdXN0IGxpc3RlbiBmb3IgcmVxdWVzdHMgZnJvbSB0aGUga2VybmVsIChyZXByZXNlbnRpbmcKKyAqIHRoZSB2YXJpb3VzIEFQSSBmdW5jdGlvbnMpIGFuZCBwcm9jZXNzIHRoZW0uCisgKgorICogVXNlci1zcGFjZSBiZWdpbnMgYnkgc2V0dGluZyB1cCB0aGUgY29tbXVuaWNhdGlvbiBsaW5rIChlcnJvciBjaGVja2luZworICogcmVtb3ZlZCBmb3IgY2xhcml0eSk6CisgKglmZCA9IHNvY2tldChQRl9ORVRMSU5LLCBTT0NLX0RHUkFNLCBORVRMSU5LX0NPTk5FQ1RPUik7CisgKglhZGRyLm5sX2ZhbWlseSA9IEFGX05FVExJTks7CisgKglhZGRyLm5sX2dyb3VwcyA9IENOX0lEWF9ETTsKKyAqCWFkZHIubmxfcGlkID0gMDsKKyAqCXIgPSBiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworICoJb3B0ID0gYWRkci5ubF9ncm91cHM7CisgKglzZXRzb2Nrb3B0KGZkLCBTT0xfTkVUTElOSywgTkVUTElOS19BRERfTUVNQkVSU0hJUCwgJm9wdCwgc2l6ZW9mKG9wdCkpOworICoKKyAqIFVzZXItc3BhY2Ugd2lsbCB0aGVuIHdhaXQgdG8gcmVjZWl2ZSByZXF1ZXN0cyBmb3JtIHRoZSBrZXJuZWwsIHdoaWNoIGl0CisgKiB3aWxsIHByb2Nlc3MgYXMgZGVzY3JpYmVkIGJlbG93LiAgVGhlIHJlcXVlc3RzIGFyZSByZWNlaXZlZCBpbiB0aGUgZm9ybSwKKyAqICgoc3RydWN0IGRtX3Vsb2dfcmVxdWVzdCkgKyAoYWRkaXRpb25hbCBkYXRhKSkuICBEZXBlbmRpbmcgb24gdGhlIHJlcXVlc3QKKyAqIHR5cGUsIHRoZXJlIG1heSBvciBtYXkgbm90IGJlICdhZGRpdGlvbmFsIGRhdGEnLiAgSW4gdGhlIGRlc2NyaXB0aW9ucyBiZWxvdywKKyAqIHlvdSB3aWxsIHNlZSAnUGF5bG9hZC10by11c2Vyc3BhY2UnIGFuZCAnUGF5bG9hZC10by1rZXJuZWwnLiAgVGhlCisgKiAnUGF5bG9hZC10by11c2Vyc3BhY2UnIGlzIHdoYXQgdGhlIGtlcm5lbCBzZW5kcyBpbiAnYWRkaXRpb25hbCBkYXRhJyBhcworICogbmVjZXNzYXJ5IHBhcmFtZXRlcnMgdG8gY29tcGxldGUgdGhlIHJlcXVlc3QuICBUaGUgJ1BheWxvYWQtdG8ta2VybmVsJyBpcworICogdGhlICdhZGRpdGlvbmFsIGRhdGEnIHJldHVybmVkIHRvIHRoZSBrZXJuZWwgdGhhdCBjb250YWlucyB0aGUgbmVjZXNzYXJ5CisgKiByZXN1bHRzIG9mIHRoZSByZXF1ZXN0LiAgVGhlICdkYXRhX3NpemUnIGZpZWxkIGluIHRoZSBkbV91bG9nX3JlcXVlc3QKKyAqIHN0cnVjdHVyZSBkZW5vdGVzIHRoZSBhdmFpbGFiaWxpdHkgYW5kIGFtb3VudCBvZiBwYXlsb2FkIGRhdGEuCisgKi8KKworLyoKKyAqIERNX1VMT0dfQ1RSIGNvcnJlc3BvbmRzIHRvIChmb3VuZCBpbiBkbS1kaXJ0eS1sb2cuaCk6CisgKiBpbnQgKCpjdHIpKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZywgc3RydWN0IGRtX3RhcmdldCAqdGksCisgKgkgICAgICB1bnNpZ25lZCBhcmdjLCBjaGFyICoqYXJndik7CisgKgorICogUGF5bG9hZC10by11c2Vyc3BhY2U6CisgKglBIHNpbmdsZSBzdHJpbmcgY29udGFpbmluZyBhbGwgdGhlIGFyZ3YgYXJndW1lbnRzIHNlcGFyYXRlZCBieSAnICdzCisgKiBQYXlsb2FkLXRvLWtlcm5lbDoKKyAqCUEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIHRoYXQgaXMgdGhlIG5hbWUgb2YgdGhlIGRldmljZSB0aGF0IGlzIHVzZWQKKyAqCWFzIHRoZSBiYWNraW5nIHN0b3JlIGZvciB0aGUgbG9nIGRhdGEuICAnZG1fZ2V0X2RldmljZScgd2lsbCBiZSBjYWxsZWQKKyAqCW9uIHRoaXMgZGV2aWNlLiAgKCdkbV9wdXRfZGV2aWNlJyB3aWxsIGJlIGNhbGxlZCBvbiB0aGlzIGRldmljZQorICoJYXV0b21hdGljYWxseSBhZnRlciBjYWxsaW5nIERNX1VMT0dfRFRSLikgIElmIHRoZXJlIGlzIG5vIGRldmljZSBuZWVkZWQKKyAqCWZvciBsb2cgZGF0YSwgJ2RhdGFfc2l6ZScgaW4gdGhlIGRtX3Vsb2dfcmVxdWVzdCBzdHJ1Y3Qgc2hvdWxkIGJlIDAuCisgKgorICogVGhlIFVVSUQgY29udGFpbmVkIGluIHRoZSBkbV91bG9nX3JlcXVlc3Qgc3RydWN0dXJlIGlzIHRoZSByZWZlcmVuY2UgdGhhdAorICogd2lsbCBiZSB1c2VkIGJ5IGFsbCByZXF1ZXN0IHR5cGVzIHRvIGEgc3BlY2lmaWMgbG9nLiAgVGhlIGNvbnN0cnVjdG9yIG11c3QKKyAqIHJlY29yZCB0aGlzIGFzc29jaWF0aW9uIHdpdGggdGhlIGluc3RhbmNlIGNyZWF0ZWQuCisgKgorICogV2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIHVzZXItc3BhY2UgbXVzdCByZXR1cm4gdGhlCisgKiBkbV91bG9nX3JlcXVlc3QgdG8gdGhlIGtlcm5lbCAtIHNldHRpbmcgdGhlICdlcnJvcicgZmllbGQsIGZpbGxpbmcgdGhlCisgKiBkYXRhIGZpZWxkIHdpdGggdGhlIGxvZyBkZXZpY2UgaWYgbmVjZXNzYXJ5LCBhbmQgc2V0dGluZyAnZGF0YV9zaXplJworICogYXBwcm9wcmlhdGVseS4KKyAqLworI2RlZmluZSBETV9VTE9HX0NUUiAgICAgICAgICAgICAgICAgICAgMQorCisvKgorICogRE1fVUxPR19EVFIgY29ycmVzcG9uZHMgdG8gKGZvdW5kIGluIGRtLWRpcnR5LWxvZy5oKToKKyAqIHZvaWQgKCpkdHIpKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZyk7CisgKgorICogUGF5bG9hZC10by11c2Vyc3BhY2U6CisgKglBIHNpbmdsZSBzdHJpbmcgY29udGFpbmluZyBhbGwgdGhlIGFyZ3YgYXJndW1lbnRzIHNlcGFyYXRlZCBieSAnICdzCisgKiBQYXlsb2FkLXRvLWtlcm5lbDoKKyAqCU5vbmUuICAoJ2RhdGFfc2l6ZScgaW4gdGhlIGRtX3Vsb2dfcmVxdWVzdCBzdHJ1Y3Qgc2hvdWxkIGJlIDAuKQorICoKKyAqIFRoZSBVVUlEIGNvbnRhaW5lZCBpbiB0aGUgZG1fdWxvZ19yZXF1ZXN0IHN0cnVjdHVyZSBpcyBhbGwgdGhhdCBpcworICogbmVjZXNzYXJ5IHRvIGlkZW50aWZ5IHRoZSBsb2cgaW5zdGFuY2UgYmVpbmcgZGVzdHJveWVkLiAgVGhlcmUgaXMgbm8KKyAqIHBheWxvYWQgZGF0YS4KKyAqCisgKiBXaGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZCwgdXNlci1zcGFjZSBtdXN0IHJldHVybiB0aGUKKyAqIGRtX3Vsb2dfcmVxdWVzdCB0byB0aGUga2VybmVsIC0gc2V0dGluZyB0aGUgJ2Vycm9yJyBmaWVsZCBhbmQgY2xlYXJpbmcKKyAqICdkYXRhX3NpemUnIGFwcHJvcHJpYXRlbHkuCisgKi8KKyNkZWZpbmUgRE1fVUxPR19EVFIgICAgICAgICAgICAgICAgICAgIDIKKworLyoKKyAqIERNX1VMT0dfUFJFU1VTUEVORCBjb3JyZXNwb25kcyB0byAoZm91bmQgaW4gZG0tZGlydHktbG9nLmgpOgorICogaW50ICgqcHJlc3VzcGVuZCkoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nKTsKKyAqCisgKiBQYXlsb2FkLXRvLXVzZXJzcGFjZToKKyAqCU5vbmUuCisgKiBQYXlsb2FkLXRvLWtlcm5lbDoKKyAqCU5vbmUuCisgKgorICogVGhlIFVVSUQgY29udGFpbmVkIGluIHRoZSBkbV91bG9nX3JlcXVlc3Qgc3RydWN0dXJlIGlzIGFsbCB0aGF0IGlzCisgKiBuZWNlc3NhcnkgdG8gaWRlbnRpZnkgdGhlIGxvZyBpbnN0YW5jZSBiZWluZyBwcmVzdXNwZW5kZWQuICBUaGVyZSBpcyBubworICogcGF5bG9hZCBkYXRhLgorICoKKyAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCB1c2VyLXNwYWNlIG11c3QgcmV0dXJuIHRoZQorICogZG1fdWxvZ19yZXF1ZXN0IHRvIHRoZSBrZXJuZWwgLSBzZXR0aW5nIHRoZSAnZXJyb3InIGZpZWxkIGFuZAorICogJ2RhdGFfc2l6ZScgYXBwcm9wcmlhdGVseS4KKyAqLworI2RlZmluZSBETV9VTE9HX1BSRVNVU1BFTkQgICAgICAgICAgICAgMworCisvKgorICogRE1fVUxPR19QT1NUU1VTUEVORCBjb3JyZXNwb25kcyB0byAoZm91bmQgaW4gZG0tZGlydHktbG9nLmgpOgorICogaW50ICgqcG9zdHN1c3BlbmQpKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZyk7CisgKgorICogUGF5bG9hZC10by11c2Vyc3BhY2U6CisgKglOb25lLgorICogUGF5bG9hZC10by1rZXJuZWw6CisgKglOb25lLgorICoKKyAqIFRoZSBVVUlEIGNvbnRhaW5lZCBpbiB0aGUgZG1fdWxvZ19yZXF1ZXN0IHN0cnVjdHVyZSBpcyBhbGwgdGhhdCBpcworICogbmVjZXNzYXJ5IHRvIGlkZW50aWZ5IHRoZSBsb2cgaW5zdGFuY2UgYmVpbmcgcG9zdHN1c3BlbmRlZC4gIFRoZXJlIGlzIG5vCisgKiBwYXlsb2FkIGRhdGEuCisgKgorICogV2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIHVzZXItc3BhY2UgbXVzdCByZXR1cm4gdGhlCisgKiBkbV91bG9nX3JlcXVlc3QgdG8gdGhlIGtlcm5lbCAtIHNldHRpbmcgdGhlICdlcnJvcicgZmllbGQgYW5kCisgKiAnZGF0YV9zaXplJyBhcHByb3ByaWF0ZWx5LgorICovCisjZGVmaW5lIERNX1VMT0dfUE9TVFNVU1BFTkQgICAgICAgICAgICA0CisKKy8qCisgKiBETV9VTE9HX1JFU1VNRSBjb3JyZXNwb25kcyB0byAoZm91bmQgaW4gZG0tZGlydHktbG9nLmgpOgorICogaW50ICgqcmVzdW1lKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cpOworICoKKyAqIFBheWxvYWQtdG8tdXNlcnNwYWNlOgorICoJTm9uZS4KKyAqIFBheWxvYWQtdG8ta2VybmVsOgorICoJTm9uZS4KKyAqCisgKiBUaGUgVVVJRCBjb250YWluZWQgaW4gdGhlIGRtX3Vsb2dfcmVxdWVzdCBzdHJ1Y3R1cmUgaXMgYWxsIHRoYXQgaXMKKyAqIG5lY2Vzc2FyeSB0byBpZGVudGlmeSB0aGUgbG9nIGluc3RhbmNlIGJlaW5nIHJlc3VtZWQuICBUaGVyZSBpcyBubworICogcGF5bG9hZCBkYXRhLgorICoKKyAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCB1c2VyLXNwYWNlIG11c3QgcmV0dXJuIHRoZQorICogZG1fdWxvZ19yZXF1ZXN0IHRvIHRoZSBrZXJuZWwgLSBzZXR0aW5nIHRoZSAnZXJyb3InIGZpZWxkIGFuZAorICogJ2RhdGFfc2l6ZScgYXBwcm9wcmlhdGVseS4KKyAqLworI2RlZmluZSBETV9VTE9HX1JFU1VNRSAgICAgICAgICAgICAgICAgNQorCisvKgorICogRE1fVUxPR19HRVRfUkVHSU9OX1NJWkUgY29ycmVzcG9uZHMgdG8gKGZvdW5kIGluIGRtLWRpcnR5LWxvZy5oKToKKyAqIHVpbnQzMl90ICgqZ2V0X3JlZ2lvbl9zaXplKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2cpOworICoKKyAqIFBheWxvYWQtdG8tdXNlcnNwYWNlOgorICoJTm9uZS4KKyAqIFBheWxvYWQtdG8ta2VybmVsOgorICoJdWludDY0X3QgLSBjb250YWlucyB0aGUgcmVnaW9uIHNpemUKKyAqCisgKiBUaGUgcmVnaW9uIHNpemUgaXMgc29tZXRoaW5nIHRoYXQgd2FzIGRldGVybWluZWQgYXQgY29uc3RydWN0b3IgdGltZS4KKyAqIEl0IGlzIHJldHVybmVkIGluIHRoZSBwYXlsb2FkIGFyZWEgYW5kICdkYXRhX3NpemUnIGlzIHNldCB0bworICogcmVmbGVjdCB0aGlzLgorICoKKyAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCB1c2VyLXNwYWNlIG11c3QgcmV0dXJuIHRoZQorICogZG1fdWxvZ19yZXF1ZXN0IHRvIHRoZSBrZXJuZWwgLSBzZXR0aW5nIHRoZSAnZXJyb3InIGZpZWxkIGFwcHJvcHJpYXRlbHkuCisgKi8KKyNkZWZpbmUgRE1fVUxPR19HRVRfUkVHSU9OX1NJWkUgICAgICAgIDYKKworLyoKKyAqIERNX1VMT0dfSVNfQ0xFQU4gY29ycmVzcG9uZHMgdG8gKGZvdW5kIGluIGRtLWRpcnR5LWxvZy5oKToKKyAqIGludCAoKmlzX2NsZWFuKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2csIHJlZ2lvbl90IHJlZ2lvbik7CisgKgorICogUGF5bG9hZC10by11c2Vyc3BhY2U6CisgKgl1aW50NjRfdCAtIHRoZSByZWdpb24gdG8gZ2V0IGNsZWFuIHN0YXR1cyBvbgorICogUGF5bG9hZC10by1rZXJuZWw6CisgKglpbnQ2NF90ICAtIDEgaWYgY2xlYW4sIDAgb3RoZXJ3aXNlCisgKgorICogUGF5bG9hZCBpcyBzaXplb2YodWludDY0X3QpIGFuZCBjb250YWlucyB0aGUgcmVnaW9uIGZvciB3aGljaCB0aGUgY2xlYW4KKyAqIHN0YXR1cyBpcyBiZWluZyBtYWRlLgorICoKKyAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCB1c2VyLXNwYWNlIG11c3QgcmV0dXJuIHRoZQorICogZG1fdWxvZ19yZXF1ZXN0IHRvIHRoZSBrZXJuZWwgLSBmaWxsaW5nIHRoZSBwYXlsb2FkIHdpdGggMCAobm90IGNsZWFuKSBvcgorICogMSAoY2xlYW4pLCBzZXR0aW5nICdkYXRhX3NpemUnIGFuZCAnZXJyb3InIGFwcHJvcHJpYXRlbHkuCisgKi8KKyNkZWZpbmUgRE1fVUxPR19JU19DTEVBTiAgICAgICAgICAgICAgIDcKKworLyoKKyAqIERNX1VMT0dfSU5fU1lOQyBjb3JyZXNwb25kcyB0byAoZm91bmQgaW4gZG0tZGlydHktbG9nLmgpOgorICogaW50ICgqaW5fc3luYykoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nLCByZWdpb25fdCByZWdpb24sCisgKgkJICBpbnQgY2FuX2Jsb2NrKTsKKyAqCisgKiBQYXlsb2FkLXRvLXVzZXJzcGFjZToKKyAqCXVpbnQ2NF90IC0gdGhlIHJlZ2lvbiB0byBnZXQgc3luYyBzdGF0dXMgb24KKyAqIFBheWxvYWQtdG8ta2VybmVsOgorICoJaW50NjRfdCAtIDEgaWYgaW4tc3luYywgMCBvdGhlcndpc2UKKyAqCisgKiBFeGFjdGx5IHRoZSBzYW1lIGFzICdpc19jbGVhbicgYWJvdmUsIGV4Y2VwdCB0aGlzIHRpbWUgYXNraW5nICJoYXMgdGhlCisgKiByZWdpb24gYmVlbiByZWNvdmVyZWQ/IiB2cy4gImlzIHRoZSByZWdpb24gbm90IGJlaW5nIG1vZGlmaWVkPyIKKyAqLworI2RlZmluZSBETV9VTE9HX0lOX1NZTkMgICAgICAgICAgICAgICAgOAorCisvKgorICogRE1fVUxPR19GTFVTSCBjb3JyZXNwb25kcyB0byAoZm91bmQgaW4gZG0tZGlydHktbG9nLmgpOgorICogaW50ICgqZmx1c2gpKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZyk7CisgKgorICogUGF5bG9hZC10by11c2Vyc3BhY2U6CisgKglOb25lLgorICogUGF5bG9hZC10by1rZXJuZWw6CisgKglOb25lLgorICoKKyAqIE5vIGluY29taW5nIG9yIG91dGdvaW5nIHBheWxvYWQuICBTaW1wbHkgZmx1c2ggbG9nIHN0YXRlIHRvIGRpc2suCisgKgorICogV2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIHVzZXItc3BhY2UgbXVzdCByZXR1cm4gdGhlCisgKiBkbV91bG9nX3JlcXVlc3QgdG8gdGhlIGtlcm5lbCAtIHNldHRpbmcgdGhlICdlcnJvcicgZmllbGQgYW5kIGNsZWFyaW5nCisgKiAnZGF0YV9zaXplJyBhcHByb3ByaWF0ZWx5LgorICovCisjZGVmaW5lIERNX1VMT0dfRkxVU0ggICAgICAgICAgICAgICAgICA5CisKKy8qCisgKiBETV9VTE9HX01BUktfUkVHSU9OIGNvcnJlc3BvbmRzIHRvIChmb3VuZCBpbiBkbS1kaXJ0eS1sb2cuaCk6CisgKiB2b2lkICgqbWFya19yZWdpb24pKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZywgcmVnaW9uX3QgcmVnaW9uKTsKKyAqCisgKiBQYXlsb2FkLXRvLXVzZXJzcGFjZToKKyAqCXVpbnQ2NF90IFtdIC0gcmVnaW9uKHMpIHRvIG1hcmsKKyAqIFBheWxvYWQtdG8ta2VybmVsOgorICoJTm9uZS4KKyAqCisgKiBJbmNvbWluZyBwYXlsb2FkIGNvbnRhaW5zIHRoZSBvbmUgb3IgbW9yZSByZWdpb25zIHRvIG1hcmsgZGlydHkuCisgKiBUaGUgbnVtYmVyIG9mIHJlZ2lvbnMgY29udGFpbmVkIGluIHRoZSBwYXlsb2FkIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20KKyAqICdkYXRhX3NpemUvc2l6ZW9mKHVpbnQ2NF90KScuCisgKgorICogV2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIHVzZXItc3BhY2UgbXVzdCByZXR1cm4gdGhlCisgKiBkbV91bG9nX3JlcXVlc3QgdG8gdGhlIGtlcm5lbCAtIHNldHRpbmcgdGhlICdlcnJvcicgZmllbGQgYW5kIGNsZWFyaW5nCisgKiAnZGF0YV9zaXplJyBhcHByb3ByaWF0ZWx5LgorICovCisjZGVmaW5lIERNX1VMT0dfTUFSS19SRUdJT04gICAgICAgICAgIDEwCisKKy8qCisgKiBETV9VTE9HX0NMRUFSX1JFR0lPTiBjb3JyZXNwb25kcyB0byAoZm91bmQgaW4gZG0tZGlydHktbG9nLmgpOgorICogdm9pZCAoKmNsZWFyX3JlZ2lvbikoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nLCByZWdpb25fdCByZWdpb24pOworICoKKyAqIFBheWxvYWQtdG8tdXNlcnNwYWNlOgorICoJdWludDY0X3QgW10gLSByZWdpb24ocykgdG8gY2xlYXIKKyAqIFBheWxvYWQtdG8ta2VybmVsOgorICoJTm9uZS4KKyAqCisgKiBJbmNvbWluZyBwYXlsb2FkIGNvbnRhaW5zIHRoZSBvbmUgb3IgbW9yZSByZWdpb25zIHRvIG1hcmsgY2xlYW4uCisgKiBUaGUgbnVtYmVyIG9mIHJlZ2lvbnMgY29udGFpbmVkIGluIHRoZSBwYXlsb2FkIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20KKyAqICdkYXRhX3NpemUvc2l6ZW9mKHVpbnQ2NF90KScuCisgKgorICogV2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIHVzZXItc3BhY2UgbXVzdCByZXR1cm4gdGhlCisgKiBkbV91bG9nX3JlcXVlc3QgdG8gdGhlIGtlcm5lbCAtIHNldHRpbmcgdGhlICdlcnJvcicgZmllbGQgYW5kIGNsZWFyaW5nCisgKiAnZGF0YV9zaXplJyBhcHByb3ByaWF0ZWx5LgorICovCisjZGVmaW5lIERNX1VMT0dfQ0xFQVJfUkVHSU9OICAgICAgICAgIDExCisKKy8qCisgKiBETV9VTE9HX0dFVF9SRVNZTkNfV09SSyBjb3JyZXNwb25kcyB0byAoZm91bmQgaW4gZG0tZGlydHktbG9nLmgpOgorICogaW50ICgqZ2V0X3Jlc3luY193b3JrKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2csIHJlZ2lvbl90ICpyZWdpb24pOworICoKKyAqIFBheWxvYWQtdG8tdXNlcnNwYWNlOgorICoJTm9uZS4KKyAqIFBheWxvYWQtdG8ta2VybmVsOgorICoJeworICoJCWludDY0X3QgaTsgLS0gMSBpZiByZWNvdmVyeSBuZWNlc3NhcnksIDAgb3RoZXJ3aXNlCisgKgkJdWludDY0X3QgcjsgLS0gVGhlIHJlZ2lvbiB0byByZWNvdmVyIGlmIGk9MQorICoJfQorICogJ2RhdGFfc2l6ZScgc2hvdWxkIGJlIHNldCBhcHByb3ByaWF0ZWx5LgorICoKKyAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCB1c2VyLXNwYWNlIG11c3QgcmV0dXJuIHRoZQorICogZG1fdWxvZ19yZXF1ZXN0IHRvIHRoZSBrZXJuZWwgLSBzZXR0aW5nIHRoZSAnZXJyb3InIGZpZWxkIGFwcHJvcHJpYXRlbHkuCisgKi8KKyNkZWZpbmUgRE1fVUxPR19HRVRfUkVTWU5DX1dPUksgICAgICAgMTIKKworLyoKKyAqIERNX1VMT0dfU0VUX1JFR0lPTl9TWU5DIGNvcnJlc3BvbmRzIHRvIChmb3VuZCBpbiBkbS1kaXJ0eS1sb2cuaCk6CisgKiB2b2lkICgqc2V0X3JlZ2lvbl9zeW5jKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2csCisgKgkJCSAgIHJlZ2lvbl90IHJlZ2lvbiwgaW50IGluX3N5bmMpOworICoKKyAqIFBheWxvYWQtdG8tdXNlcnNwYWNlOgorICoJeworICoJCXVpbnQ2NF90IC0gcmVnaW9uIHRvIHNldCBzeW5jIHN0YXRlIG9uCisgKgkJaW50NjRfdCAgLSAwIGlmIG5vdC1pbi1zeW5jLCAxIGlmIGluLXN5bmMKKyAqCX0KKyAqIFBheWxvYWQtdG8ta2VybmVsOgorICoJTm9uZS4KKyAqCisgKiBXaGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZCwgdXNlci1zcGFjZSBtdXN0IHJldHVybiB0aGUKKyAqIGRtX3Vsb2dfcmVxdWVzdCB0byB0aGUga2VybmVsIC0gc2V0dGluZyB0aGUgJ2Vycm9yJyBmaWVsZCBhbmQgY2xlYXJpbmcKKyAqICdkYXRhX3NpemUnIGFwcHJvcHJpYXRlbHkuCisgKi8KKyNkZWZpbmUgRE1fVUxPR19TRVRfUkVHSU9OX1NZTkMgICAgICAgMTMKKworLyoKKyAqIERNX1VMT0dfR0VUX1NZTkNfQ09VTlQgY29ycmVzcG9uZHMgdG8gKGZvdW5kIGluIGRtLWRpcnR5LWxvZy5oKToKKyAqIHJlZ2lvbl90ICgqZ2V0X3N5bmNfY291bnQpKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZyk7CisgKgorICogUGF5bG9hZC10by11c2Vyc3BhY2U6CisgKglOb25lLgorICogUGF5bG9hZC10by1rZXJuZWw6CisgKgl1aW50NjRfdCAtIHRoZSBudW1iZXIgb2YgaW4tc3luYyByZWdpb25zCisgKgorICogTm8gaW5jb21pbmcgcGF5bG9hZC4gIEtlcm5lbC1ib3VuZCBwYXlsb2FkIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YKKyAqIHJlZ2lvbnMgdGhhdCBhcmUgaW4tc3luYyAoaW4gYSBzaXplX3QpLgorICoKKyAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCB1c2VyLXNwYWNlIG11c3QgcmV0dXJuIHRoZQorICogZG1fdWxvZ19yZXF1ZXN0IHRvIHRoZSBrZXJuZWwgLSBzZXR0aW5nIHRoZSAnZXJyb3InIGZpZWxkIGFuZAorICogJ2RhdGFfc2l6ZScgYXBwcm9wcmlhdGVseS4KKyAqLworI2RlZmluZSBETV9VTE9HX0dFVF9TWU5DX0NPVU5UICAgICAgICAxNAorCisvKgorICogRE1fVUxPR19TVEFUVVNfSU5GTyBjb3JyZXNwb25kcyB0byAoZm91bmQgaW4gZG0tZGlydHktbG9nLmgpOgorICogaW50ICgqc3RhdHVzKShzdHJ1Y3QgZG1fZGlydHlfbG9nICpsb2csIFNUQVRVU1RZUEVfSU5GTywKKyAqCQkgY2hhciAqcmVzdWx0LCB1bnNpZ25lZCBtYXhsZW4pOworICoKKyAqIFBheWxvYWQtdG8tdXNlcnNwYWNlOgorICoJTm9uZS4KKyAqIFBheWxvYWQtdG8ta2VybmVsOgorICoJQ2hhcmFjdGVyIHN0cmluZyBjb250YWluaW5nIFNUQVRVU1RZUEVfSU5GTworICoKKyAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCB1c2VyLXNwYWNlIG11c3QgcmV0dXJuIHRoZQorICogZG1fdWxvZ19yZXF1ZXN0IHRvIHRoZSBrZXJuZWwgLSBzZXR0aW5nIHRoZSAnZXJyb3InIGZpZWxkIGFuZAorICogJ2RhdGFfc2l6ZScgYXBwcm9wcmlhdGVseS4KKyAqLworI2RlZmluZSBETV9VTE9HX1NUQVRVU19JTkZPICAgICAgICAgICAxNQorCisvKgorICogRE1fVUxPR19TVEFUVVNfVEFCTEUgY29ycmVzcG9uZHMgdG8gKGZvdW5kIGluIGRtLWRpcnR5LWxvZy5oKToKKyAqIGludCAoKnN0YXR1cykoc3RydWN0IGRtX2RpcnR5X2xvZyAqbG9nLCBTVEFUVVNUWVBFX1RBQkxFLAorICoJCSBjaGFyICpyZXN1bHQsIHVuc2lnbmVkIG1heGxlbik7CisgKgorICogUGF5bG9hZC10by11c2Vyc3BhY2U6CisgKglOb25lLgorICogUGF5bG9hZC10by1rZXJuZWw6CisgKglDaGFyYWN0ZXIgc3RyaW5nIGNvbnRhaW5pbmcgU1RBVFVTVFlQRV9UQUJMRQorICoKKyAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCB1c2VyLXNwYWNlIG11c3QgcmV0dXJuIHRoZQorICogZG1fdWxvZ19yZXF1ZXN0IHRvIHRoZSBrZXJuZWwgLSBzZXR0aW5nIHRoZSAnZXJyb3InIGZpZWxkIGFuZAorICogJ2RhdGFfc2l6ZScgYXBwcm9wcmlhdGVseS4KKyAqLworI2RlZmluZSBETV9VTE9HX1NUQVRVU19UQUJMRSAgICAgICAgICAxNgorCisvKgorICogRE1fVUxPR19JU19SRU1PVEVfUkVDT1ZFUklORyBjb3JyZXNwb25kcyB0byAoZm91bmQgaW4gZG0tZGlydHktbG9nLmgpOgorICogaW50ICgqaXNfcmVtb3RlX3JlY292ZXJpbmcpKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZywgcmVnaW9uX3QgcmVnaW9uKTsKKyAqCisgKiBQYXlsb2FkLXRvLXVzZXJzcGFjZToKKyAqCXVpbnQ2NF90IC0gcmVnaW9uIHRvIGRldGVybWluZSByZWNvdmVyeSBzdGF0dXMgb24KKyAqIFBheWxvYWQtdG8ta2VybmVsOgorICoJeworICoJCWludDY0X3QgaXNfcmVjb3ZlcmluZzsgIC0tIDAgaWYgbm8sIDEgaWYgeWVzCisgKgkJdWludDY0X3QgaW5fc3luY19oaW50OyAgLS0gbG93ZXN0IHJlZ2lvbiBzdGlsbCBuZWVkaW5nIHJlc3luYworICoJfQorICoKKyAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCB1c2VyLXNwYWNlIG11c3QgcmV0dXJuIHRoZQorICogZG1fdWxvZ19yZXF1ZXN0IHRvIHRoZSBrZXJuZWwgLSBzZXR0aW5nIHRoZSAnZXJyb3InIGZpZWxkIGFuZAorICogJ2RhdGFfc2l6ZScgYXBwcm9wcmlhdGVseS4KKyAqLworI2RlZmluZSBETV9VTE9HX0lTX1JFTU9URV9SRUNPVkVSSU5HICAxNworCisvKgorICogKERNX1VMT0dfUkVRVUVTVF9NQVNLICYgcmVxdWVzdF90eXBlKSB0byBnZXQgdGhlIHJlcXVlc3QgdHlwZQorICoKKyAqIFBheWxvYWQtdG8tdXNlcnNwYWNlOgorICoJQSBzaW5nbGUgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIHRoZSBhcmd2IGFyZ3VtZW50cyBzZXBhcmF0ZWQgYnkgJyAncworICogUGF5bG9hZC10by1rZXJuZWw6CisgKglOb25lLiAgKCdkYXRhX3NpemUnIGluIHRoZSBkbV91bG9nX3JlcXVlc3Qgc3RydWN0IHNob3VsZCBiZSAwLikKKyAqCisgKiBXZSBhcmUgcmVzZXJ2aW5nIDggYml0cyBvZiB0aGUgMzItYml0ICdyZXF1ZXN0X3R5cGUnIGZpZWxkIGZvciB0aGUKKyAqIHZhcmlvdXMgcmVxdWVzdCB0eXBlcyBhYm92ZS4gIFRoZSByZW1haW5pbmcgMjQtYml0cyBhcmUgY3VycmVudGx5CisgKiBzZXQgdG8gemVybyBhbmQgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBjb21wYXRpYmlsaXR5IGNvbmNlcm5zLgorICoKKyAqIFVzZXItc3BhY2Ugc2hvdWxkIGFsd2F5cyB1c2UgRE1fVUxPR19SRVFVRVNUX1RZUEUgdG8gYWNxdWlyZSB0aGUKKyAqIHJlcXVlc3QgdHlwZSBmcm9tIHRoZSAncmVxdWVzdF90eXBlJyBmaWVsZCB0byBtYWludGFpbiBmb3J3YXJkIGNvbXBhdGliaWxpdHkuCisgKi8KKyNkZWZpbmUgRE1fVUxPR19SRVFVRVNUX01BU0sgMHhGRgorI2RlZmluZSBETV9VTE9HX1JFUVVFU1RfVFlQRShyZXF1ZXN0X3R5cGUpIFwKKwkoRE1fVUxPR19SRVFVRVNUX01BU0sgJiAocmVxdWVzdF90eXBlKSkKKworLyoKKyAqIERNX1VMT0dfUkVRVUVTVF9WRVJTSU9OIGlzIGluY3JlbWVudGVkIHdoZW4gdGhlcmUgaXMgYQorICogY2hhbmdlIHRvIHRoZSB3YXkgaW5mb3JtYXRpb24gaXMgcGFzc2VkIGJldHdlZW4ga2VybmVsCisgKiBhbmQgdXNlcnNwYWNlLiAgVGhpcyBjb3VsZCBiZSBhIHN0cnVjdHVyZSBjaGFuZ2Ugb2YKKyAqIGRtX3Vsb2dfcmVxdWVzdCBvciBhIGNoYW5nZSBpbiB0aGUgd2F5IHJlcXVlc3RzIGFyZQorICogaXNzdWVkL2hhbmRsZWQuICBDaGFuZ2VzIGFyZSBvdXRsaW5lZCBoZXJlOgorICoJdmVyc2lvbiAxOiAgSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoJdmVyc2lvbiAyOiAgRE1fVUxPR19DVFIgYWxsb3dlZCB0byByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhCisgKgkgICAgICAgICAgICBkZXZpY2UgbmFtZSB0aGF0IGlzIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBETSB2aWEKKyAqCSAgICAgICAgICAgICdkbV9nZXRfZGV2aWNlJy4KKyAqLworI2RlZmluZSBETV9VTE9HX1JFUVVFU1RfVkVSU0lPTiAyCisKK3N0cnVjdCBkbV91bG9nX3JlcXVlc3QgeworCS8qCisJICogVGhlIGxvY2FsIHVuaXF1ZSBpZGVudGlmaWVyIChsdWlkKSBhbmQgdGhlIHVuaXZlcnNhbGx5IHVuaXF1ZQorCSAqIGlkZW50aWZpZXIgKHV1aWQpIGFyZSB1c2VkIHRvIHRpZSBhIHJlcXVlc3QgdG8gYSBzcGVjaWZpYworCSAqIG1pcnJvciBsb2cuICBBIHNpbmdsZSBtYWNoaW5lIGxvZyBjb3VsZCBwcm9iYWJseSBtYWtlIGR1ZSB3aXRoCisJICoganVzdCB0aGUgJ2x1aWQnLCBidXQgYSBjbHVzdGVyLWF3YXJlIGxvZyBtdXN0IHVzZSB0aGUgJ3V1aWQnIGFuZAorCSAqIHRoZSAnbHVpZCcuICBUaGUgdXVpZCBpcyB3aGF0IGlzIHJlcXVpcmVkIGZvciBub2RlIHRvIG5vZGUKKwkgKiBjb21tdW5pY2F0aW9uIGNvbmNlcm5pbmcgYSBwYXJ0aWN1bGFyIGxvZywgYnV0IHRoZSAnbHVpZCcgaGVscHMKKwkgKiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbG9ncyB0aGF0IGFyZSBiZWluZyBzd2FwcGVkIGFuZCBoYXZlIHRoZQorCSAqIHNhbWUgJ3V1aWQnLiAgKFRoaW5rICJsaXZlIiBhbmQgImluYWN0aXZlIiBkZXZpY2UtbWFwcGVyIHRhYmxlcy4pCisJICovCisJdWludDY0X3QgbHVpZDsKKwljaGFyIHV1aWRbRE1fVVVJRF9MRU5dOworCWNoYXIgcGFkZGluZ1szXTsgICAgICAgIC8qIFBhZGRpbmcgYmVjYXVzZSBETV9VVUlEX0xFTiA9IDEyOSAqLworCisJdWludDMyX3QgdmVyc2lvbjsgICAgICAgLyogU2VlIERNX1VMT0dfUkVRVUVTVF9WRVJTSU9OICovCisJaW50MzJfdCBlcnJvcjsgICAgICAgICAgLyogVXNlZCB0byByZXBvcnQgYmFjayBwcm9jZXNzaW5nIGVycm9ycyAqLworCisJdWludDMyX3Qgc2VxOyAgICAgICAgICAgLyogU2VxdWVuY2UgbnVtYmVyIGZvciByZXF1ZXN0ICovCisJdWludDMyX3QgcmVxdWVzdF90eXBlOyAgLyogRE1fVUxPR18qIGRlZmluZWQgYWJvdmUgKi8KKwl1aW50MzJfdCBkYXRhX3NpemU7ICAgICAvKiBIb3cgbXVjaCBkYXRhIChub3QgaW5jbHVkaW5nIHRoaXMgc3RydWN0KSAqLworCisJY2hhciBkYXRhWzBdOworfTsKKworI2VuZGlmIC8qIF9fRE1fTE9HX1VTRVJTUEFDRV9IX18gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZG4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZG4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzUwNDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kbi5oCkBAIC0wLDAgKzEsMTQ2IEBACisjaWZuZGVmIF9MSU5VWF9ETl9ICisjZGVmaW5lIF9MSU5VWF9ETl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorCisJREVDbmV0IERhdGEgU3RydWN0dXJlcyBhbmQgQ29uc3RhbnRzCisKKyovCisKKy8qIAorICogRE5QUk9UT19OU1AgY2FuJ3QgYmUgdGhlIHNhbWUgYXMgU09MX1NPQ0tFVCwgCisgKiBzbyBpbmNyZW1lbnQgZWFjaCBieSBvbmUgKGNvbXBhcmVkIHRvIFVMVFJJWCkKKyAqLworI2RlZmluZSBETlBST1RPX05TUCAgICAgMiAgICAgICAgICAgICAgICAgICAgICAgLyogTlNQIHByb3RvY29sIG51bWJlciAgICAgICAqLworI2RlZmluZSBETlBST1RPX1JPVSAgICAgMyAgICAgICAgICAgICAgICAgICAgICAgLyogUm91dGluZyBwcm90b2NvbCBudW1iZXIgICAqLworI2RlZmluZSBETlBST1RPX05NTCAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgLyogTmV0IG1ndCBwcm90b2NvbCBudW1iZXIgICAqLworI2RlZmluZSBETlBST1RPX0VWTCAgICAgNSAgICAgICAgICAgICAgICAgICAgICAgLyogRXZsIHByb3RvY29sIG51bWJlciAodXNyKSAqLworI2RlZmluZSBETlBST1RPX0VWUiAgICAgNiAgICAgICAgICAgICAgICAgICAgICAgLyogRXZsIHByb3RvY29sIG51bWJlciAoZXZsKSAqLworI2RlZmluZSBETlBST1RPX05TUFQgICAgNyAgICAgICAgICAgICAgICAgICAgICAgLyogTlNQIHRyYWNlIHByb3RvY29sIG51bWJlciAqLworCisKKyNkZWZpbmUgRE5fQURETAkJMgorI2RlZmluZSBETl9NQVhBRERMCTIgLyogVUxUUklYIGhlYWRlcnMgaGF2ZSAyMCBoZXJlLCBidXQgcGF0aHdvcmtzIGhhcyAyICovCisjZGVmaW5lIEROX01BWE9QVEwJMTYKKyNkZWZpbmUgRE5fTUFYT0JKTAkxNgorI2RlZmluZSBETl9NQVhBQ0NMCTQwCisjZGVmaW5lIEROX01BWEFMSUFTTAkxMjgKKyNkZWZpbmUgRE5fTUFYTk9ERUwJMjU2CisjZGVmaW5lIEROQlVGU0laRQk2NTAyMworCisvKiAKKyAqIFNFVC9HRVQgU29ja2V0IG9wdGlvbnMgIC0gbXVzdCBtYXRjaCB0aGUgRFNPXyBudW1iZXJzIGJlbG93CisgKi8KKyNkZWZpbmUgU09fQ09OREFUQSAgICAgIDEKKyNkZWZpbmUgU09fQ09OQUNDRVNTICAgIDIKKyNkZWZpbmUgU09fUFJPWFlVU1IgICAgIDMKKyNkZWZpbmUgU09fTElOS0lORk8gICAgIDcKKworI2RlZmluZSBEU09fQ09OREFUQSAgICAgMSAgICAgICAgLyogU2V0L0dldCBjb25uZWN0IGRhdGEgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRFNPX0RJU0RBVEEgICAgIDEwICAgICAgIC8qIFNldC9HZXQgZGlzY29ubmVjdCBkYXRhICAgICAgICAgICAgICovCisjZGVmaW5lIERTT19DT05BQ0NFU1MgICAyICAgICAgICAvKiBTZXQvR2V0IGNvbm5lY3QgYWNjZXNzIGRhdGEgICAgICAgICAqLworI2RlZmluZSBEU09fQUNDRVBUTU9ERSAgNCAgICAgICAgLyogU2V0L0dldCBhY2NlcHQgbW9kZSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRFNPX0NPTkFDQ0VQVCAgIDUgICAgICAgIC8qIEFjY2VwdCBkZWZlcnJlZCBjb25uZWN0aW9uICAgICAgICAgICovCisjZGVmaW5lIERTT19DT05SRUpFQ1QgICA2ICAgICAgICAvKiBSZWplY3QgZGVmZXJyZWQgY29ubmVjdGlvbiAgICAgICAgICAqLworI2RlZmluZSBEU09fTElOS0lORk8gICAgNyAgICAgICAgLyogU2V0L0dldCBsaW5rIGluZm9ybWF0aW9uICAgICAgICAgICAgKi8KKyNkZWZpbmUgRFNPX1NUUkVBTSAgICAgIDggICAgICAgIC8qIFNldCBzb2NrZXQgdHlwZSB0byBzdHJlYW0gICAgICAgICAgICovCisjZGVmaW5lIERTT19TRVFQQUNLRVQgICA5ICAgICAgICAvKiBTZXQgc29ja2V0IHR5cGUgdG8gc2VxdWVuY2VkIHBhY2tldCAqLworI2RlZmluZSBEU09fTUFYV0lORE9XICAgMTEgICAgICAgLyogTWF4aW11bSB3aW5kb3cgc2l6ZSBhbGxvd2VkICAgICAgICAgKi8KKyNkZWZpbmUgRFNPX05PREVMQVkJMTIgICAgICAgLyogVHVybiBvZmYgbmFnbGUgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRFNPX0NPUksgICAgICAgIDEzICAgICAgIC8qIFdhaXQgZm9yIG1vcmUgZGF0YSEgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERTT19TRVJWSUNFUwkxNCAgICAgICAvKiBOU1AgU2VydmljZXMgZmllbGQgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEU09fSU5GTwkxNSAgICAgICAvKiBOU1AgSW5mbyBmaWVsZCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEU09fTUFYICAgICAgICAgMTUgICAgICAgLyogTWF4aW11bSBvcHRpb24gbnVtYmVyICAgICAgICAgICAgICAgKi8KKworCisvKiBMSU5LIFN0YXRlcyAqLworI2RlZmluZSBMTF9JTkFDVElWRQkwCisjZGVmaW5lIExMX0NPTk5FQ1RJTkcJMQorI2RlZmluZSBMTF9SVU5OSU5HCTIKKyNkZWZpbmUgTExfRElTQ09OTkVDVElORyAzCisKKyNkZWZpbmUgQUNDX0lNTUVEIDAKKyNkZWZpbmUgQUNDX0RFRkVSIDEKKworI2RlZmluZSBTREZfV0lMRCAgICAgICAgMSAgICAgICAgICAgICAgICAgIC8qIFdpbGQgY2FyZCBvYmplY3QgICAgICAgICAgKi8KKyNkZWZpbmUgU0RGX1BST1hZICAgICAgIDIgICAgICAgICAgICAgICAgICAvKiBBZGRyIGVsaWdpYmxlIGZvciBwcm94eSAgICovCisjZGVmaW5lIFNERl9VSUNQUk9YWSAgICA0ICAgICAgICAgICAgICAgICAgLyogVXNlIHVpYy1iYXNlZCBwcm94eSAgICAgICAqLworCisvKiBTdHJ1Y3R1cmVzICovCisKKworc3RydWN0IGRuX25hZGRyIHsKKwlfX2xlMTYJCWFfbGVuOworCV9fdTggYV9hZGRyW0ROX01BWEFERExdOyAvKiBUd28gYnl0ZXMgbGl0dGxlIGVuZGlhbiAqLworfTsKKworc3RydWN0IHNvY2thZGRyX2RuIHsKKwlfX3UxNgkJc2RuX2ZhbWlseTsKKwlfX3U4CQlzZG5fZmxhZ3M7CisJX191OAkJc2RuX29iam51bTsKKwlfX2xlMTYJCXNkbl9vYmpuYW1lbDsKKwlfX3U4CQlzZG5fb2JqbmFtZVtETl9NQVhPQkpMXTsKKwlzdHJ1Y3QgICBkbl9uYWRkcglzZG5fYWRkOworfTsKKyNkZWZpbmUgc2RuX25vZGVhZGRybCAgIHNkbl9hZGQuYV9sZW4gICAvKiBOb2RlIGFkZHJlc3MgbGVuZ3RoICAqLworI2RlZmluZSBzZG5fbm9kZWFkZHIgICAgc2RuX2FkZC5hX2FkZHIgIC8qIE5vZGUgYWRkcmVzcyAgICAgICAgICovCisKKworCisvKgorICogREVDbmV0IHNldC9nZXQgRFNPX0NPTkRBVEEsIERTT19ESVNEQVRBIChvcHRpb25hbCBkYXRhKSBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IG9wdGRhdGFfZG4geworICAgICAgICBfX2xlMTYgIG9wdF9zdGF0dXM7ICAgICAvKiBFeHRlbmRlZCBzdGF0dXMgcmV0dXJuICovCisjZGVmaW5lIG9wdF9zdHMgb3B0X3N0YXR1cworICAgICAgICBfX2xlMTYgIG9wdF9vcHRsOyAgICAgICAvKiBMZW5ndGggb2YgdXNlciBkYXRhICAgICovCisgICAgICAgIF9fdTggICBvcHRfZGF0YVsxNl07ICAgLyogVXNlciBkYXRhICAgICAgICAgICAgICAqLworfTsKKworc3RydWN0IGFjY2Vzc2RhdGFfZG4geworCV9fdTgJCWFjY19hY2NsOworCV9fdTgJCWFjY19hY2NbRE5fTUFYQUNDTF07CisJX191OCAJCWFjY19wYXNzbDsKKwlfX3U4CQlhY2NfcGFzc1tETl9NQVhBQ0NMXTsKKwlfX3U4IAkJYWNjX3VzZXJsOworCV9fdTgJCWFjY191c2VyW0ROX01BWEFDQ0xdOworfTsKKworLyoKKyAqIERFQ25ldCBsb2dpY2FsIGxpbmsgaW5mb3JtYXRpb24gc3RydWN0dXJlCisgKi8KK3N0cnVjdCBsaW5raW5mb19kbiB7CisgICAgICAgIF9fdTE2ICBpZG5fc2Vnc2l6ZTsgICAgLyogU2VnbWVudCBzaXplIGZvciBsaW5rICovCisgICAgICAgIF9fdTggICBpZG5fbGlua3N0YXRlOyAgLyogTG9naWNhbCBsaW5rIHN0YXRlICAgICovCit9OworCisvKgorICogRXRoZXJuZXQgYWRkcmVzcyBmb3JtYXQgKGZvciBERUNuZXQpCisgKi8KK3VuaW9uIGV0aGVyYWRkcmVzcyB7CisgICAgICAgIF9fdTggZG5lX2FkZHJbNl07ICAgICAgICAgICAgIC8qIEZ1bGwgZXRoZXJuZXQgYWRkcmVzcyAqLworICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgIF9fdTggZG5lX2hpb3JkWzRdOyAgICAvKiBERUNuZXQgSElPUkQgcHJlZml4ICAgKi8KKyAgICAgICAgICAgICAgICBfX3U4IGRuZV9ub2RlYWRkclsyXTsgLyogREVDbmV0IG5vZGUgYWRkcmVzcyAgICovCisgIH0gZG5lX3JlbW90ZTsKK307CisKKworLyoKKyAqIERFQ25ldCBwaHlzaWNhbCBzb2NrZXQgYWRkcmVzcyBmb3JtYXQKKyAqLworc3RydWN0IGRuX2FkZHIgeworICAgICAgICBfX2xlMTYgZG5hX2ZhbWlseTsgICAgICAvKiBBRl9ERUNuZXQgICAgICAgICAgICAgICAqLworICAgICAgICB1bmlvbiBldGhlcmFkZHJlc3MgZG5hX25ldGFkZHI7IC8qIERFQ25ldCBldGhlcm5ldCBhZGRyZXNzICovCit9OworCisjZGVmaW5lIERFQ05FVF9JT0NUTF9CQVNFIDB4ODkgLyogUFJPVE9QUklWQVRFIHJhbmdlICovCisKKyNkZWZpbmUgU0lPQ1NORVRBRERSICBfSU9XKERFQ05FVF9JT0NUTF9CQVNFLCAweGUwLCBzdHJ1Y3QgZG5fbmFkZHIpCisjZGVmaW5lIFNJT0NHTkVUQUREUiAgX0lPUihERUNORVRfSU9DVExfQkFTRSwgMHhlMSwgc3RydWN0IGRuX25hZGRyKQorI2RlZmluZSBPU0lPQ1NORVRBRERSIF9JT1coREVDTkVUX0lPQ1RMX0JBU0UsIDB4ZTAsIGludCkKKyNkZWZpbmUgT1NJT0NHTkVUQUREUiBfSU9SKERFQ05FVF9JT0NUTF9CQVNFLCAweGUxLCBpbnQpCisKKyNlbmRpZiAvKiBfTElOVVhfRE5fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kcWJsa194ZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHFibGtfeGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY1NTI4MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHFibGtfeGZzLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUtMjAwMSwyMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2V0IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworI2lmbmRlZiBfTElOVVhfRFFCTEtfWEZTX0gKKyNkZWZpbmUgX0xJTlVYX0RRQkxLX1hGU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogRGlzayBxdW90YSAtIHF1b3RhY3RsKDIpIGNvbW1hbmRzIGZvciB0aGUgWEZTIFF1b3RhIE1hbmFnZXIgKFhRTSkuCisgKi8KKworI2RlZmluZSBYUU1fQ01EKHgpCSgoJ1gnPDw4KSsoeCkpCS8qIG5vdGU6IGZvcm1zIGZpcnN0IFFDTUQgYXJndW1lbnQgKi8KKyNkZWZpbmUgWFFNX0NPTU1BTkQoeCkJKCgoeCkgJiAoMHhmZjw8OCkpID09ICgnWCc8PDgpKQkvKiB0ZXN0IGlmIGZvciBYRlMgKi8KKworI2RlZmluZSBYUU1fVVNSUVVPVEEJMAkvKiBzeXN0ZW0gY2FsbCB1c2VyIHF1b3RhIHR5cGUgKi8KKyNkZWZpbmUgWFFNX0dSUFFVT1RBCTEJLyogc3lzdGVtIGNhbGwgZ3JvdXAgcXVvdGEgdHlwZSAqLworI2RlZmluZSBYUU1fUFJKUVVPVEEJMgkvKiBzeXN0ZW0gY2FsbCBwcm9qZWN0IHF1b3RhIHR5cGUgKi8KKyNkZWZpbmUgWFFNX01BWFFVT1RBUwkzCisKKyNkZWZpbmUgUV9YUVVPVEFPTglYUU1fQ01EKDEpCS8qIGVuYWJsZSBhY2NvdW50aW5nL2VuZm9yY2VtZW50ICovCisjZGVmaW5lIFFfWFFVT1RBT0ZGCVhRTV9DTUQoMikJLyogZGlzYWJsZSBhY2NvdW50aW5nL2VuZm9yY2VtZW50ICovCisjZGVmaW5lIFFfWEdFVFFVT1RBCVhRTV9DTUQoMykJLyogZ2V0IGRpc2sgbGltaXRzIGFuZCB1c2FnZSAqLworI2RlZmluZSBRX1hTRVRRTElNCVhRTV9DTUQoNCkJLyogc2V0IGRpc2sgbGltaXRzICovCisjZGVmaW5lIFFfWEdFVFFTVEFUCVhRTV9DTUQoNSkJLyogZ2V0IHF1b3RhIHN1YnN5c3RlbSBzdGF0dXMgKi8KKyNkZWZpbmUgUV9YUVVPVEFSTQlYUU1fQ01EKDYpCS8qIGZyZWUgZGlzayBzcGFjZSB1c2VkIGJ5IGRxdW90cyAqLworI2RlZmluZSBRX1hRVU9UQVNZTkMJWFFNX0NNRCg3KQkvKiBkZWxhbGxvYyBmbHVzaCwgdXBkYXRlcyBkcXVvdHMgKi8KKworLyoKKyAqIGZzX2Rpc2tfcXVvdGEgc3RydWN0dXJlOgorICoKKyAqIFRoaXMgY29udGFpbnMgdGhlIGN1cnJlbnQgcXVvdGEgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGEgdXNlci9wcm9qL2dyb3VwLgorICogSXQgaXMgNjQtYml0IGFsaWduZWQsIGFuZCBhbGwgdGhlIGJsayB1bml0cyBhcmUgaW4gQkJzIChCYXNpYyBCbG9ja3MpIG9mCisgKiA1MTIgYnl0ZXMuCisgKi8KKyNkZWZpbmUgRlNfRFFVT1RfVkVSU0lPTgkxCS8qIGZzX2Rpc2tfcXVvdGEuZF92ZXJzaW9uICovCit0eXBlZGVmIHN0cnVjdCBmc19kaXNrX3F1b3RhIHsKKwlfX3M4CQlkX3ZlcnNpb247CS8qIHZlcnNpb24gb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKwlfX3M4CQlkX2ZsYWdzOwkvKiBGU197VVNFUixQUk9KLEdST1VQfV9RVU9UQSAqLworCV9fdTE2CQlkX2ZpZWxkbWFzazsJLyogZmllbGQgc3BlY2lmaWVyICovCisJX191MzIJCWRfaWQ7CQkvKiB1c2VyLCBwcm9qZWN0LCBvciBncm91cCBJRCAqLworCV9fdTY0CQlkX2Jsa19oYXJkbGltaXQ7LyogYWJzb2x1dGUgbGltaXQgb24gZGlzayBibGtzICovCisJX191NjQJCWRfYmxrX3NvZnRsaW1pdDsvKiBwcmVmZXJyZWQgbGltaXQgb24gZGlzayBibGtzICovCisJX191NjQJCWRfaW5vX2hhcmRsaW1pdDsvKiBtYXhpbXVtICMgYWxsb2NhdGVkIGlub2RlcyAqLworCV9fdTY0CQlkX2lub19zb2Z0bGltaXQ7LyogcHJlZmVycmVkIGlub2RlIGxpbWl0ICovCisJX191NjQJCWRfYmNvdW50OwkvKiAjIGRpc2sgYmxvY2tzIG93bmVkIGJ5IHRoZSB1c2VyICovCisJX191NjQJCWRfaWNvdW50OwkvKiAjIGlub2RlcyBvd25lZCBieSB0aGUgdXNlciAqLworCV9fczMyCQlkX2l0aW1lcjsJLyogemVybyBpZiB3aXRoaW4gaW5vZGUgbGltaXRzICovCisJCQkJCS8qIGlmIG5vdCwgd2UgcmVmdXNlIHNlcnZpY2UgKi8KKwlfX3MzMgkJZF9idGltZXI7CS8qIHNpbWlsYXIgdG8gYWJvdmU7IGZvciBkaXNrIGJsb2NrcyAqLworCV9fdTE2CSAgCWRfaXdhcm5zOyAgICAgICAvKiAjIHdhcm5pbmdzIGlzc3VlZCB3cnQgbnVtIGlub2RlcyAqLworCV9fdTE2CSAgCWRfYndhcm5zOyAgICAgICAvKiAjIHdhcm5pbmdzIGlzc3VlZCB3cnQgZGlzayBibG9ja3MgKi8KKwlfX3MzMgkJZF9wYWRkaW5nMjsJLyogcGFkZGluZzIgLSBmb3IgZnV0dXJlIHVzZSAqLworCV9fdTY0CQlkX3J0Yl9oYXJkbGltaXQ7LyogYWJzb2x1dGUgbGltaXQgb24gcmVhbHRpbWUgYmxrcyAqLworCV9fdTY0CQlkX3J0Yl9zb2Z0bGltaXQ7LyogcHJlZmVycmVkIGxpbWl0IG9uIFJUIGRpc2sgYmxrcyAqLworCV9fdTY0CQlkX3J0YmNvdW50OwkvKiAjIHJlYWx0aW1lIGJsb2NrcyBvd25lZCAqLworCV9fczMyCQlkX3J0YnRpbWVyOwkvKiBzaW1pbGFyIHRvIGFib3ZlOyBmb3IgUlQgZGlzayBibGtzICovCisJX191MTYJICAJZF9ydGJ3YXJuczsgICAgIC8qICMgd2FybmluZ3MgaXNzdWVkIHdydCBSVCBkaXNrIGJsa3MgKi8KKwlfX3MxNgkJZF9wYWRkaW5nMzsJLyogcGFkZGluZzMgLSBmb3IgZnV0dXJlIHVzZSAqLwkKKwljaGFyCQlkX3BhZGRpbmc0WzhdOwkvKiB5ZXQgbW9yZSBwYWRkaW5nICovCit9IGZzX2Rpc2tfcXVvdGFfdDsKKworLyoKKyAqIFRoZXNlIGZpZWxkcyBhcmUgc2VudCB0byBRX1hTRVRRTElNIHRvIHNwZWNpZnkgZmllbGRzIHRoYXQgbmVlZCB0byBjaGFuZ2UuCisgKi8KKyNkZWZpbmUgRlNfRFFfSVNPRlQJKDE8PDApCisjZGVmaW5lIEZTX0RRX0lIQVJECSgxPDwxKQorI2RlZmluZSBGU19EUV9CU09GVAkoMTw8MikKKyNkZWZpbmUgRlNfRFFfQkhBUkQgCSgxPDwzKQorI2RlZmluZSBGU19EUV9SVEJTT0ZUCSgxPDw0KQorI2RlZmluZSBGU19EUV9SVEJIQVJECSgxPDw1KQorI2RlZmluZSBGU19EUV9MSU1JVF9NQVNLCShGU19EUV9JU09GVCB8IEZTX0RRX0lIQVJEIHwgRlNfRFFfQlNPRlQgfCBcCisJCQkJIEZTX0RRX0JIQVJEIHwgRlNfRFFfUlRCU09GVCB8IEZTX0RRX1JUQkhBUkQpCisvKgorICogVGhlc2UgdGltZXJzIGNhbiBvbmx5IGJlIHNldCBpbiBzdXBlciB1c2VyJ3MgZHF1b3QuIEZvciBvdGhlcnMsIHRpbWVycyBhcmUKKyAqIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBhbmQgc3RvcHBlZC4gU3VwZXJ1c2VycyB0aW1lciB2YWx1ZXMgc2V0IHRoZSBsaW1pdHMKKyAqIGZvciB0aGUgcmVzdC4gIEluIGNhc2UgdGhlc2UgdmFsdWVzIGFyZSB6ZXJvLCB0aGUgRFFfe0YsQn1USU1FTElNSVQgdmFsdWVzCisgKiBkZWZpbmVkIGJlbG93IGFyZSB1c2VkLiAKKyAqIFRoZXNlIHZhbHVlcyBhbHNvIGFwcGx5IG9ubHkgdG8gdGhlIGRfZmllbGRtYXNrIGZpZWxkIGZvciBRX1hTRVRRTElNLgorICovCisjZGVmaW5lIEZTX0RRX0JUSU1FUgkoMTw8NikKKyNkZWZpbmUgRlNfRFFfSVRJTUVSCSgxPDw3KQorI2RlZmluZSBGU19EUV9SVEJUSU1FUiAJKDE8PDgpCisjZGVmaW5lIEZTX0RRX1RJTUVSX01BU0sJKEZTX0RRX0JUSU1FUiB8IEZTX0RRX0lUSU1FUiB8IEZTX0RRX1JUQlRJTUVSKQorCisvKgorICogV2FybmluZyBjb3VudHMgYXJlIHNldCBpbiBib3RoIHN1cGVyIHVzZXIncyBkcXVvdCBhbmQgb3RoZXJzLiBGb3Igb3RoZXJzLAorICogd2FybmluZ3MgYXJlIHNldC9jbGVhcmVkIGJ5IHRoZSBhZG1pbmlzdHJhdG9ycyAob3IgYXV0b21hdGljYWxseSBieSBnb2luZworICogYmVsb3cgdGhlIHNvZnQgbGltaXQpLiAgU3VwZXJ1c2VycyB3YXJuaW5nIHZhbHVlcyBzZXQgdGhlIHdhcm5pbmcgbGltaXRzCisgKiBmb3IgdGhlIHJlc3QuICBJbiBjYXNlIHRoZXNlIHZhbHVlcyBhcmUgemVybywgdGhlIERRX3tGLEJ9V0FSTkxJTUlUIHZhbHVlcworICogZGVmaW5lZCBiZWxvdyBhcmUgdXNlZC4gCisgKiBUaGVzZSB2YWx1ZXMgYWxzbyBhcHBseSBvbmx5IHRvIHRoZSBkX2ZpZWxkbWFzayBmaWVsZCBmb3IgUV9YU0VUUUxJTS4KKyAqLworI2RlZmluZSBGU19EUV9CV0FSTlMJKDE8PDkpCisjZGVmaW5lIEZTX0RRX0lXQVJOUwkoMTw8MTApCisjZGVmaW5lIEZTX0RRX1JUQldBUk5TCSgxPDwxMSkKKyNkZWZpbmUgRlNfRFFfV0FSTlNfTUFTSwkoRlNfRFFfQldBUk5TIHwgRlNfRFFfSVdBUk5TIHwgRlNfRFFfUlRCV0FSTlMpCisKKy8qCisgKiBBY2NvdW50aW5nIHZhbHVlcy4gIFRoZXNlIGNhbiBvbmx5IGJlIHNldCBmb3IgZmlsZXN5c3RlbSB3aXRoCisgKiBub24tdHJhbnNhY3Rpb25hbCBxdW90YXMgdGhhdCByZXF1aXJlIHF1b3RhY2hlY2soOCkgaW4gdXNlcnNwYWNlLgorICovCisjZGVmaW5lIEZTX0RRX0JDT1VOVAkJKDE8PDEyKQorI2RlZmluZSBGU19EUV9JQ09VTlQJCSgxPDwxMykKKyNkZWZpbmUgRlNfRFFfUlRCQ09VTlQJCSgxPDwxNCkKKyNkZWZpbmUgRlNfRFFfQUNDVF9NQVNLCQkoRlNfRFFfQkNPVU5UIHwgRlNfRFFfSUNPVU5UIHwgRlNfRFFfUlRCQ09VTlQpCisKKy8qCisgKiBWYXJpb3VzIGZsYWdzIHJlbGF0ZWQgdG8gcXVvdGFjdGwoMikuCisgKi8KKyNkZWZpbmUgRlNfUVVPVEFfVURRX0FDQ1QJKDE8PDApICAvKiB1c2VyIHF1b3RhIGFjY291bnRpbmcgKi8KKyNkZWZpbmUgRlNfUVVPVEFfVURRX0VORkQJKDE8PDEpICAvKiB1c2VyIHF1b3RhIGxpbWl0cyBlbmZvcmNlbWVudCAqLworI2RlZmluZSBGU19RVU9UQV9HRFFfQUNDVAkoMTw8MikgIC8qIGdyb3VwIHF1b3RhIGFjY291bnRpbmcgKi8KKyNkZWZpbmUgRlNfUVVPVEFfR0RRX0VORkQJKDE8PDMpICAvKiBncm91cCBxdW90YSBsaW1pdHMgZW5mb3JjZW1lbnQgKi8KKyNkZWZpbmUgRlNfUVVPVEFfUERRX0FDQ1QJKDE8PDQpICAvKiBwcm9qZWN0IHF1b3RhIGFjY291bnRpbmcgKi8KKyNkZWZpbmUgRlNfUVVPVEFfUERRX0VORkQJKDE8PDUpICAvKiBwcm9qZWN0IHF1b3RhIGxpbWl0cyBlbmZvcmNlbWVudCAqLworCisjZGVmaW5lIEZTX1VTRVJfUVVPVEEJCSgxPDwwKQkvKiB1c2VyIHF1b3RhIHR5cGUgKi8KKyNkZWZpbmUgRlNfUFJPSl9RVU9UQQkJKDE8PDEpCS8qIHByb2plY3QgcXVvdGEgdHlwZSAqLworI2RlZmluZSBGU19HUk9VUF9RVU9UQQkJKDE8PDIpCS8qIGdyb3VwIHF1b3RhIHR5cGUgKi8KKworLyoKKyAqIGZzX3F1b3RhX3N0YXQgaXMgdGhlIHN0cnVjdCByZXR1cm5lZCBpbiBRX1hHRVRRU1RBVCBmb3IgYSBnaXZlbiBmaWxlIHN5c3RlbS4KKyAqIFByb3ZpZGVzIGEgY2VudHJhbGl6ZWQgd2F5IHRvIGdldCBtZXRhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBxdW90YSBzdWJzeXN0ZW0uCisgKiBlZy4gc3BhY2UgdGFrZW4gdXAgZm9yIHVzZXIgYW5kIGdyb3VwIHF1b3RhcywgbnVtYmVyIG9mIGRxdW90cyBjdXJyZW50bHkKKyAqIGluY29yZS4KKyAqLworI2RlZmluZSBGU19RU1RBVF9WRVJTSU9OCTEJLyogZnNfcXVvdGFfc3RhdC5xc192ZXJzaW9uICovCisKKy8qCisgKiBTb21lIGJhc2ljIGluZm9ybWF0aW9uIGFib3V0ICdxdW90YSBmaWxlcycuCisgKi8KK3R5cGVkZWYgc3RydWN0IGZzX3FmaWxlc3RhdCB7CisJX191NjQJCXFmc19pbm87CS8qIGlub2RlIG51bWJlciAqLworCV9fdTY0CQlxZnNfbmJsa3M7CS8qIG51bWJlciBvZiBCQnMgNTEyLWJ5dGUtYmxrcyAqLworCV9fdTMyCQlxZnNfbmV4dGVudHM7CS8qIG51bWJlciBvZiBleHRlbnRzICovCit9IGZzX3FmaWxlc3RhdF90OworCit0eXBlZGVmIHN0cnVjdCBmc19xdW90YV9zdGF0IHsKKwlfX3M4CQlxc192ZXJzaW9uOwkvKiB2ZXJzaW9uIG51bWJlciBmb3IgZnV0dXJlIGNoYW5nZXMgKi8KKwlfX3UxNgkJcXNfZmxhZ3M7CS8qIEZTX1FVT1RBX3tVLFAsR31EUV97QUNDVCxFTkZEfSAqLworCV9fczgJCXFzX3BhZDsJCS8qIHVudXNlZCAqLworCWZzX3FmaWxlc3RhdF90CXFzX3VxdW90YTsJLyogdXNlciBxdW90YSBzdG9yYWdlIGluZm9ybWF0aW9uICovCisJZnNfcWZpbGVzdGF0X3QJcXNfZ3F1b3RhOwkvKiBncm91cCBxdW90YSBzdG9yYWdlIGluZm9ybWF0aW9uICovCisJX191MzIJCXFzX2luY29yZWRxczsJLyogbnVtYmVyIG9mIGRxdW90cyBpbmNvcmUgKi8KKwlfX3MzMgkJcXNfYnRpbWVsaW1pdDsgIC8qIGxpbWl0IGZvciBibGtzIHRpbWVyICovCQorCV9fczMyCQlxc19pdGltZWxpbWl0OyAgLyogbGltaXQgZm9yIGlub2RlcyB0aW1lciAqLwkKKwlfX3MzMgkJcXNfcnRidGltZWxpbWl0Oy8qIGxpbWl0IGZvciBydCBibGtzIHRpbWVyICovCQorCV9fdTE2CQlxc19id2FybmxpbWl0OwkvKiBsaW1pdCBmb3IgbnVtIHdhcm5pbmdzICovCisJX191MTYJCXFzX2l3YXJubGltaXQ7CS8qIGxpbWl0IGZvciBudW0gd2FybmluZ3MgKi8KK30gZnNfcXVvdGFfc3RhdF90OworCisjZW5kaWYJLyogX0xJTlVYX0RRQkxLX1hGU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi9hdWRpby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDdiY2NkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvYXVkaW8uaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIGF1ZGlvLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgUmFscGggIE1ldHpsZXIgPHJhbHBoQGNvbnZlcmdlbmNlLmRlPgorICogICAgICAgICAgICAgICAgICAmIE1hcmN1cyBNZXR6bGVyIDxtYXJjdXNAY29udmVyZ2VuY2UuZGU+CisgKiAgICAgICAgICAgICAgICAgICAgZm9yIGNvbnZlcmdlbmNlIGludGVncmF0ZWQgbWVkaWEgR21iSAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIExlc3NlciBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMQorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfRFZCQVVESU9fSF8KKyNkZWZpbmUgX0RWQkFVRElPX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCit0eXBlZGVmIGVudW0geworCUFVRElPX1NPVVJDRV9ERU1VWCwgLyogU2VsZWN0IHRoZSBkZW11eCBhcyB0aGUgbWFpbiBzb3VyY2UgKi8KKwlBVURJT19TT1VSQ0VfTUVNT1JZIC8qIFNlbGVjdCBpbnRlcm5hbCBtZW1vcnkgYXMgdGhlIG1haW4gc291cmNlICovCit9IGF1ZGlvX3N0cmVhbV9zb3VyY2VfdDsKKworCit0eXBlZGVmIGVudW0geworCUFVRElPX1NUT1BQRUQsICAgICAgLyogRGV2aWNlIGlzIHN0b3BwZWQgKi8KKwlBVURJT19QTEFZSU5HLCAgICAgIC8qIERldmljZSBpcyBjdXJyZW50bHkgcGxheWluZyAqLworCUFVRElPX1BBVVNFRCAgICAgICAgLyogRGV2aWNlIGlzIHBhdXNlZCAqLworfSBhdWRpb19wbGF5X3N0YXRlX3Q7CisKKwordHlwZWRlZiBlbnVtIHsKKwlBVURJT19TVEVSRU8sCisJQVVESU9fTU9OT19MRUZULAorCUFVRElPX01PTk9fUklHSFQsCisJQVVESU9fTU9OTywKKwlBVURJT19TVEVSRU9fU1dBUFBFRAorfSBhdWRpb19jaGFubmVsX3NlbGVjdF90OworCisKK3R5cGVkZWYgc3RydWN0IGF1ZGlvX21peGVyIHsKKwl1bnNpZ25lZCBpbnQgdm9sdW1lX2xlZnQ7CisJdW5zaWduZWQgaW50IHZvbHVtZV9yaWdodDsKKyAgLy8gd2hhdCBlbHNlIGRvIHdlIG5lZWQ/IGJhc3MsIHBhc3MtdGhyb3VnaCwgLi4uCit9IGF1ZGlvX21peGVyX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgYXVkaW9fc3RhdHVzIHsKKwlpbnQgICAgICAgICAgICAgICAgICAgIEFWX3N5bmNfc3RhdGU7ICAvKiBzeW5jIGF1ZGlvIGFuZCB2aWRlbz8gKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgIG11dGVfc3RhdGU7ICAgICAvKiBhdWRpbyBpcyBtdXRlZCAqLworCWF1ZGlvX3BsYXlfc3RhdGVfdCAgICAgcGxheV9zdGF0ZTsgICAgIC8qIGN1cnJlbnQgcGxheWJhY2sgc3RhdGUgKi8KKwlhdWRpb19zdHJlYW1fc291cmNlX3QgIHN0cmVhbV9zb3VyY2U7ICAvKiBjdXJyZW50IHN0cmVhbSBzb3VyY2UgKi8KKwlhdWRpb19jaGFubmVsX3NlbGVjdF90IGNoYW5uZWxfc2VsZWN0OyAvKiBjdXJyZW50bHkgc2VsZWN0ZWQgY2hhbm5lbCAqLworCWludCAgICAgICAgICAgICAgICAgICAgYnlwYXNzX21vZGU7ICAgIC8qIHBhc3Mgb24gYXVkaW8gZGF0YSB0byAqLworCWF1ZGlvX21peGVyX3QJICAgICAgIG1peGVyX3N0YXRlOyAgICAvKiBjdXJyZW50IG1peGVyIHN0YXRlICovCit9IGF1ZGlvX3N0YXR1c190OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcGFyYXRlIGRlY29kZXIgaGFyZHdhcmUgKi8KKworCit0eXBlZGVmCitzdHJ1Y3QgYXVkaW9fa2FyYW9rZSB7ICAvKiBpZiBWb2NhbDEgb3IgVm9jYWwyIGFyZSBub24temVybywgdGhleSBnZXQgbWl4ZWQgICovCisJaW50IHZvY2FsMTsgICAgLyogaW50byBsZWZ0IGFuZCByaWdodCB0IGF0IDcwJSBlYWNoICovCisJaW50IHZvY2FsMjsgICAgLyogaWYgYm90aCwgVm9jYWwxIGFuZCBWb2NhbDIgYXJlIG5vbi16ZXJvLCBWb2NhbDEgZ2V0cyovCisJaW50IG1lbG9keTsgICAgLyogbWl4ZWQgaW50byB0aGUgbGVmdCBjaGFubmVsIGFuZCAqLworCQkgICAgICAgLyogVm9jYWwyIGludG8gdGhlIHJpZ2h0IGNoYW5uZWwgYXQgMTAwJSBlYWNoLiAqLworCQkgICAgICAgLyogaWYgTWVsb2R5IGlzIG5vbi16ZXJvLCB0aGUgbWVsb2R5IGNoYW5uZWwgZ2V0cyBtaXhlZCovCit9IGF1ZGlvX2thcmFva2VfdDsgICAgIC8qIGludG8gbGVmdCBhbmQgcmlnaHQgICovCisKKwordHlwZWRlZiBfX3UxNiBhdWRpb19hdHRyaWJ1dGVzX3Q7CisvKiAgIGJpdHM6IGRlc2NyLiAqLworLyogICAxNS0xMyBhdWRpbyBjb2RpbmcgbW9kZSAoMD1hYzMsIDI9bXBlZzEsIDM9bXBlZzJleHQsIDQ9TFBDTSwgNj1EVFMsICovCisvKiAgIDEyICAgIG11bHRpY2hhbm5lbCBleHRlbnNpb24gKi8KKy8qICAgMTEtMTAgYXVkaW8gdHlwZSAoMD1ub3Qgc3BlYywgMT1sYW5ndWFnZSBpbmNsdWRlZCkgKi8KKy8qICAgIDktIDggYXVkaW8gYXBwbGljYXRpb24gbW9kZSAoMD1ub3Qgc3BlYywgMT1rYXJhb2tlLCAyPXN1cnJvdW5kKSAqLworLyogICAgNy0gNiBRdWFudGl6YXRpb24gLyBEUkMgKG1wZWcgYXVkaW86IDE9RFJDIGV4aXN0cykobHBjbTogMD0xNmJpdCwgICovCisvKiAgICA1LSA0IFNhbXBsZSBmcmVxdWVuY3kgZnMgKDA9NDhrSHosIDE9OTZrSHopICovCisvKiAgICAyLSAwIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyAobisxIGNoYW5uZWxzKSAqLworCisKKy8qIGZvciBHRVRfQ0FQQUJJTElUSUVTIGFuZCBTRVRfRk9STUFULCB0aGUgbGF0dGVyIHNob3VsZCBvbmx5IHNldCBvbmUgYml0ICovCisjZGVmaW5lIEFVRElPX0NBUF9EVFMgICAgMQorI2RlZmluZSBBVURJT19DQVBfTFBDTSAgIDIKKyNkZWZpbmUgQVVESU9fQ0FQX01QMSAgICA0CisjZGVmaW5lIEFVRElPX0NBUF9NUDIgICAgOAorI2RlZmluZSBBVURJT19DQVBfTVAzICAgMTYKKyNkZWZpbmUgQVVESU9fQ0FQX0FBQyAgIDMyCisjZGVmaW5lIEFVRElPX0NBUF9PR0cgICA2NAorI2RlZmluZSBBVURJT19DQVBfU0REUyAxMjgKKyNkZWZpbmUgQVVESU9fQ0FQX0FDMyAgMjU2CisKKyNkZWZpbmUgQVVESU9fU1RPUCAgICAgICAgICAgICAgICAgX0lPKCdvJywgMSkKKyNkZWZpbmUgQVVESU9fUExBWSAgICAgICAgICAgICAgICAgX0lPKCdvJywgMikKKyNkZWZpbmUgQVVESU9fUEFVU0UgICAgICAgICAgICAgICAgX0lPKCdvJywgMykKKyNkZWZpbmUgQVVESU9fQ09OVElOVUUgICAgICAgICAgICAgX0lPKCdvJywgNCkKKyNkZWZpbmUgQVVESU9fU0VMRUNUX1NPVVJDRSAgICAgICAgX0lPKCdvJywgNSkKKyNkZWZpbmUgQVVESU9fU0VUX01VVEUgICAgICAgICAgICAgX0lPKCdvJywgNikKKyNkZWZpbmUgQVVESU9fU0VUX0FWX1NZTkMgICAgICAgICAgX0lPKCdvJywgNykKKyNkZWZpbmUgQVVESU9fU0VUX0JZUEFTU19NT0RFICAgICAgX0lPKCdvJywgOCkKKyNkZWZpbmUgQVVESU9fQ0hBTk5FTF9TRUxFQ1QgICAgICAgX0lPKCdvJywgOSkKKyNkZWZpbmUgQVVESU9fR0VUX1NUQVRVUyAgICAgICAgICAgX0lPUignbycsIDEwLCBhdWRpb19zdGF0dXNfdCkKKworI2RlZmluZSBBVURJT19HRVRfQ0FQQUJJTElUSUVTICAgICBfSU9SKCdvJywgMTEsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgQVVESU9fQ0xFQVJfQlVGRkVSICAgICAgICAgX0lPKCdvJywgIDEyKQorI2RlZmluZSBBVURJT19TRVRfSUQgICAgICAgICAgICAgICBfSU8oJ28nLCAxMykKKyNkZWZpbmUgQVVESU9fU0VUX01JWEVSICAgICAgICAgICAgX0lPVygnbycsIDE0LCBhdWRpb19taXhlcl90KQorI2RlZmluZSBBVURJT19TRVRfU1RSRUFNVFlQRSAgICAgICBfSU8oJ28nLCAxNSkKKyNkZWZpbmUgQVVESU9fU0VUX0VYVF9JRCAgICAgICAgICAgX0lPKCdvJywgMTYpCisjZGVmaW5lIEFVRElPX1NFVF9BVFRSSUJVVEVTICAgICAgIF9JT1coJ28nLCAxNywgYXVkaW9fYXR0cmlidXRlc190KQorI2RlZmluZSBBVURJT19TRVRfS0FSQU9LRSAgICAgICAgICBfSU9XKCdvJywgMTgsIGF1ZGlvX2thcmFva2VfdCkKKworLyoqCisgKiBBVURJT19HRVRfUFRTCisgKgorICogUmVhZCB0aGUgMzMgYml0IHByZXNlbnRhdGlvbiB0aW1lIHN0YW1wIGFzIGRlZmluZWQKKyAqIGluIElUVSBULVJFQy1ILjIyMi4wIC8gSVNPL0lFQyAxMzgxOC0xLgorICoKKyAqIFRoZSBQVFMgc2hvdWxkIGJlbG9uZyB0byB0aGUgY3VycmVudGx5IHBsYXllZAorICogZnJhbWUgaWYgcG9zc2libGUsIGJ1dCBtYXkgYWxzbyBiZSBhIHZhbHVlIGNsb3NlIHRvIGl0CisgKiBsaWtlIHRoZSBQVFMgb2YgdGhlIGxhc3QgZGVjb2RlZCBmcmFtZSBvciB0aGUgbGFzdCBQVFMKKyAqIGV4dHJhY3RlZCBieSB0aGUgUEVTIHBhcnNlci4KKyAqLworI2RlZmluZSBBVURJT19HRVRfUFRTICAgICAgICAgICAgICBfSU9SKCdvJywgMTksIF9fdTY0KQorI2RlZmluZSBBVURJT19CSUxJTkdVQUxfQ0hBTk5FTF9TRUxFQ1QgX0lPKCdvJywgMjApCisKKyNlbmRpZiAvKiBfRFZCQVVESU9fSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL2NhLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi9jYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxODUzN2YKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi9jYS5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBjYS5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIFJhbHBoICBNZXR6bGVyIDxyYWxwaEBjb252ZXJnZW5jZS5kZT4KKyAqICAgICAgICAgICAgICAgICAgJiBNYXJjdXMgTWV0emxlciA8bWFyY3VzQGNvbnZlcmdlbmNlLmRlPgorICogICAgICAgICAgICAgICAgICAgIGZvciBjb252ZXJnZW5jZSBpbnRlZ3JhdGVkIG1lZGlhIEdtYkgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBMZXNzZXIgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX0RWQkNBX0hfCisjZGVmaW5lIF9EVkJDQV9IXworCisvKiBzbG90IGludGVyZmFjZSB0eXBlcyBhbmQgaW5mbyAqLworCit0eXBlZGVmIHN0cnVjdCBjYV9zbG90X2luZm8geworCWludCBudW07ICAgICAgICAgICAgICAgLyogc2xvdCBudW1iZXIgKi8KKworCWludCB0eXBlOyAgICAgICAgICAgICAgLyogQ0EgaW50ZXJmYWNlIHRoaXMgc2xvdCBzdXBwb3J0cyAqLworI2RlZmluZSBDQV9DSSAgICAgICAgICAgIDEgICAgIC8qIENJIGhpZ2ggbGV2ZWwgaW50ZXJmYWNlICovCisjZGVmaW5lIENBX0NJX0xJTksgICAgICAgMiAgICAgLyogQ0kgbGluayBsYXllciBsZXZlbCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgQ0FfQ0lfUEhZUyAgICAgICA0ICAgICAvKiBDSSBwaHlzaWNhbCBsYXllciBsZXZlbCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgQ0FfREVTQ1IgICAgICAgICA4ICAgICAvKiBidWlsdC1pbiBkZXNjcmFtYmxlciAqLworI2RlZmluZSBDQV9TQyAgICAgICAgICAxMjggICAgIC8qIHNpbXBsZSBzbWFydCBjYXJkIGludGVyZmFjZSAqLworCisJdW5zaWduZWQgaW50IGZsYWdzOworI2RlZmluZSBDQV9DSV9NT0RVTEVfUFJFU0VOVCAxIC8qIG1vZHVsZSAob3IgY2FyZCkgaW5zZXJ0ZWQgKi8KKyNkZWZpbmUgQ0FfQ0lfTU9EVUxFX1JFQURZICAgMgorfSBjYV9zbG90X2luZm9fdDsKKworCisvKiBkZXNjcmFtYmxlciB0eXBlcyBhbmQgaW5mbyAqLworCit0eXBlZGVmIHN0cnVjdCBjYV9kZXNjcl9pbmZvIHsKKwl1bnNpZ25lZCBpbnQgbnVtOyAgICAgICAgICAvKiBudW1iZXIgb2YgYXZhaWxhYmxlIGRlc2NyYW1ibGVycyAoa2V5cykgKi8KKwl1bnNpZ25lZCBpbnQgdHlwZTsgICAgICAgICAvKiB0eXBlIG9mIHN1cHBvcnRlZCBzY3JhbWJsaW5nIHN5c3RlbSAqLworI2RlZmluZSBDQV9FQ0QgICAgICAgICAgIDEKKyNkZWZpbmUgQ0FfTkRTICAgICAgICAgICAyCisjZGVmaW5lIENBX0RTUyAgICAgICAgICAgNAorfSBjYV9kZXNjcl9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IGNhX2NhcHMgeworCXVuc2lnbmVkIGludCBzbG90X251bTsgICAgIC8qIHRvdGFsIG51bWJlciBvZiBDQSBjYXJkIGFuZCBtb2R1bGUgc2xvdHMgKi8KKwl1bnNpZ25lZCBpbnQgc2xvdF90eXBlOyAgICAvKiBPUiBvZiBhbGwgc3VwcG9ydGVkIHR5cGVzICovCisJdW5zaWduZWQgaW50IGRlc2NyX251bTsgICAgLyogdG90YWwgbnVtYmVyIG9mIGRlc2NyYW1ibGVyIHNsb3RzIChrZXlzKSAqLworCXVuc2lnbmVkIGludCBkZXNjcl90eXBlOyAgIC8qIE9SIG9mIGFsbCBzdXBwb3J0ZWQgdHlwZXMgKi8KK30gY2FfY2Fwc190OworCisvKiBhIG1lc3NhZ2UgdG8vZnJvbSBhIENJLUNBTSAqLwordHlwZWRlZiBzdHJ1Y3QgY2FfbXNnIHsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJdW5zaWduZWQgaW50IHR5cGU7CisJdW5zaWduZWQgaW50IGxlbmd0aDsKKwl1bnNpZ25lZCBjaGFyIG1zZ1syNTZdOworfSBjYV9tc2dfdDsKKwordHlwZWRlZiBzdHJ1Y3QgY2FfZGVzY3IgeworCXVuc2lnbmVkIGludCBpbmRleDsKKwl1bnNpZ25lZCBpbnQgcGFyaXR5OwkvKiAwID09IGV2ZW4sIDEgPT0gb2RkICovCisJdW5zaWduZWQgY2hhciBjd1s4XTsKK30gY2FfZGVzY3JfdDsKKwordHlwZWRlZiBzdHJ1Y3QgY2FfcGlkIHsKKwl1bnNpZ25lZCBpbnQgcGlkOworCWludCBpbmRleDsJCS8qIC0xID09IGRpc2FibGUqLworfSBjYV9waWRfdDsKKworI2RlZmluZSBDQV9SRVNFVCAgICAgICAgICBfSU8oJ28nLCAxMjgpCisjZGVmaW5lIENBX0dFVF9DQVAgICAgICAgIF9JT1IoJ28nLCAxMjksIGNhX2NhcHNfdCkKKyNkZWZpbmUgQ0FfR0VUX1NMT1RfSU5GTyAgX0lPUignbycsIDEzMCwgY2Ffc2xvdF9pbmZvX3QpCisjZGVmaW5lIENBX0dFVF9ERVNDUl9JTkZPIF9JT1IoJ28nLCAxMzEsIGNhX2Rlc2NyX2luZm9fdCkKKyNkZWZpbmUgQ0FfR0VUX01TRyAgICAgICAgX0lPUignbycsIDEzMiwgY2FfbXNnX3QpCisjZGVmaW5lIENBX1NFTkRfTVNHICAgICAgIF9JT1coJ28nLCAxMzMsIGNhX21zZ190KQorI2RlZmluZSBDQV9TRVRfREVTQ1IgICAgICBfSU9XKCdvJywgMTM0LCBjYV9kZXNjcl90KQorI2RlZmluZSBDQV9TRVRfUElEICAgICAgICBfSU9XKCdvJywgMTM1LCBjYV9waWRfdCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi9kbXguaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL2RteC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MWU4YWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi9kbXguaApAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIGRteC5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIE1hcmN1cyBNZXR6bGVyIDxtYXJjdXNAY29udmVyZ2VuY2UuZGU+CisgKiAgICAgICAgICAgICAgICAgICYgUmFscGggIE1ldHpsZXIgPHJhbHBoQGNvbnZlcmdlbmNlLmRlPgorICogICAgICAgICAgICAgICAgICAgIGZvciBjb252ZXJnZW5jZSBpbnRlZ3JhdGVkIG1lZGlhIEdtYkgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX0RWQkRNWF9IXworI2RlZmluZSBfRFZCRE1YX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworCisjZGVmaW5lIERNWF9GSUxURVJfU0laRSAxNgorCit0eXBlZGVmIGVudW0KK3sKKwlETVhfT1VUX0RFQ09ERVIsIC8qIFN0cmVhbWluZyBkaXJlY3RseSB0byBkZWNvZGVyLiAqLworCURNWF9PVVRfVEFQLCAgICAgLyogT3V0cHV0IGdvaW5nIHRvIGEgbWVtb3J5IGJ1ZmZlciAqLworCQkJIC8qICh0byBiZSByZXRyaWV2ZWQgdmlhIHRoZSByZWFkIGNvbW1hbmQpLiovCisJRE1YX09VVF9UU19UQVAsICAvKiBPdXRwdXQgbXVsdGlwbGV4ZWQgaW50byBhIG5ldyBUUyAgKi8KKwkJCSAvKiAodG8gYmUgcmV0cmlldmVkIGJ5IHJlYWRpbmcgZnJvbSB0aGUgKi8KKwkJCSAvKiBsb2dpY2FsIERWUiBkZXZpY2UpLiAgICAgICAgICAgICAgICAgKi8KKwlETVhfT1VUX1RTREVNVVhfVEFQIC8qIExpa2UgVFNfVEFQIGJ1dCByZXRyaWV2ZWQgZnJvbSB0aGUgRE1YIGRldmljZSAqLworfSBkbXhfb3V0cHV0X3Q7CisKKwordHlwZWRlZiBlbnVtCit7CisJRE1YX0lOX0ZST05URU5ELCAvKiBJbnB1dCBmcm9tIGEgZnJvbnQtZW5kIGRldmljZS4gICovCisJRE1YX0lOX0RWUiAgICAgICAvKiBJbnB1dCBmcm9tIHRoZSBsb2dpY2FsIERWUiBkZXZpY2UuICAqLworfSBkbXhfaW5wdXRfdDsKKworCit0eXBlZGVmIGVudW0KK3sKKwlETVhfUEVTX0FVRElPMCwKKwlETVhfUEVTX1ZJREVPMCwKKwlETVhfUEVTX1RFTEVURVhUMCwKKwlETVhfUEVTX1NVQlRJVExFMCwKKwlETVhfUEVTX1BDUjAsCisKKwlETVhfUEVTX0FVRElPMSwKKwlETVhfUEVTX1ZJREVPMSwKKwlETVhfUEVTX1RFTEVURVhUMSwKKwlETVhfUEVTX1NVQlRJVExFMSwKKwlETVhfUEVTX1BDUjEsCisKKwlETVhfUEVTX0FVRElPMiwKKwlETVhfUEVTX1ZJREVPMiwKKwlETVhfUEVTX1RFTEVURVhUMiwKKwlETVhfUEVTX1NVQlRJVExFMiwKKwlETVhfUEVTX1BDUjIsCisKKwlETVhfUEVTX0FVRElPMywKKwlETVhfUEVTX1ZJREVPMywKKwlETVhfUEVTX1RFTEVURVhUMywKKwlETVhfUEVTX1NVQlRJVExFMywKKwlETVhfUEVTX1BDUjMsCisKKwlETVhfUEVTX09USEVSCit9IGRteF9wZXNfdHlwZV90OworCisjZGVmaW5lIERNWF9QRVNfQVVESU8gICAgRE1YX1BFU19BVURJTzAKKyNkZWZpbmUgRE1YX1BFU19WSURFTyAgICBETVhfUEVTX1ZJREVPMAorI2RlZmluZSBETVhfUEVTX1RFTEVURVhUIERNWF9QRVNfVEVMRVRFWFQwCisjZGVmaW5lIERNWF9QRVNfU1VCVElUTEUgRE1YX1BFU19TVUJUSVRMRTAKKyNkZWZpbmUgRE1YX1BFU19QQ1IgICAgICBETVhfUEVTX1BDUjAKKworCit0eXBlZGVmIHN0cnVjdCBkbXhfZmlsdGVyCit7CisJX191OCAgZmlsdGVyW0RNWF9GSUxURVJfU0laRV07CisJX191OCAgbWFza1tETVhfRklMVEVSX1NJWkVdOworCV9fdTggIG1vZGVbRE1YX0ZJTFRFUl9TSVpFXTsKK30gZG14X2ZpbHRlcl90OworCisKK3N0cnVjdCBkbXhfc2N0X2ZpbHRlcl9wYXJhbXMKK3sKKwlfX3UxNiAgICAgICAgICBwaWQ7CisJZG14X2ZpbHRlcl90ICAgZmlsdGVyOworCV9fdTMyICAgICAgICAgIHRpbWVvdXQ7CisJX191MzIgICAgICAgICAgZmxhZ3M7CisjZGVmaW5lIERNWF9DSEVDS19DUkMgICAgICAgMQorI2RlZmluZSBETVhfT05FU0hPVCAgICAgICAgIDIKKyNkZWZpbmUgRE1YX0lNTUVESUFURV9TVEFSVCA0CisjZGVmaW5lIERNWF9LRVJORUxfQ0xJRU5UICAgMHg4MDAwCit9OworCisKK3N0cnVjdCBkbXhfcGVzX2ZpbHRlcl9wYXJhbXMKK3sKKwlfX3UxNiAgICAgICAgICBwaWQ7CisJZG14X2lucHV0X3QgICAgaW5wdXQ7CisJZG14X291dHB1dF90ICAgb3V0cHV0OworCWRteF9wZXNfdHlwZV90IHBlc190eXBlOworCV9fdTMyICAgICAgICAgIGZsYWdzOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZG14X2NhcHMgeworCV9fdTMyIGNhcHM7CisJaW50IG51bV9kZWNvZGVyczsKK30gZG14X2NhcHNfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlETVhfU09VUkNFX0ZST05UMCA9IDAsCisJRE1YX1NPVVJDRV9GUk9OVDEsCisJRE1YX1NPVVJDRV9GUk9OVDIsCisJRE1YX1NPVVJDRV9GUk9OVDMsCisJRE1YX1NPVVJDRV9EVlIwICAgPSAxNiwKKwlETVhfU09VUkNFX0RWUjEsCisJRE1YX1NPVVJDRV9EVlIyLAorCURNWF9TT1VSQ0VfRFZSMworfSBkbXhfc291cmNlX3Q7CisKK3N0cnVjdCBkbXhfc3RjIHsKKwl1bnNpZ25lZCBpbnQgbnVtOwkvKiBpbnB1dCA6IHdoaWNoIFNUQz8gMC4uTiAqLworCXVuc2lnbmVkIGludCBiYXNlOwkvKiBvdXRwdXQ6IGRpdmlzb3IgZm9yIHN0YyB0byBnZXQgOTAga0h6IGNsb2NrICovCisJX191NjQgc3RjOwkJLyogb3V0cHV0OiBzdGMgaW4gJ2Jhc2UnKjkwIGtIeiB1bml0cyAqLworfTsKKworCisjZGVmaW5lIERNWF9TVEFSVCAgICAgICAgICAgICAgICBfSU8oJ28nLCA0MSkKKyNkZWZpbmUgRE1YX1NUT1AgICAgICAgICAgICAgICAgIF9JTygnbycsIDQyKQorI2RlZmluZSBETVhfU0VUX0ZJTFRFUiAgICAgICAgICAgX0lPVygnbycsIDQzLCBzdHJ1Y3QgZG14X3NjdF9maWx0ZXJfcGFyYW1zKQorI2RlZmluZSBETVhfU0VUX1BFU19GSUxURVIgICAgICAgX0lPVygnbycsIDQ0LCBzdHJ1Y3QgZG14X3Blc19maWx0ZXJfcGFyYW1zKQorI2RlZmluZSBETVhfU0VUX0JVRkZFUl9TSVpFICAgICAgX0lPKCdvJywgNDUpCisjZGVmaW5lIERNWF9HRVRfUEVTX1BJRFMgICAgICAgICBfSU9SKCdvJywgNDcsIF9fdTE2WzVdKQorI2RlZmluZSBETVhfR0VUX0NBUFMgICAgICAgICAgICAgX0lPUignbycsIDQ4LCBkbXhfY2Fwc190KQorI2RlZmluZSBETVhfU0VUX1NPVVJDRSAgICAgICAgICAgX0lPVygnbycsIDQ5LCBkbXhfc291cmNlX3QpCisjZGVmaW5lIERNWF9HRVRfU1RDICAgICAgICAgICAgICBfSU9XUignbycsIDUwLCBzdHJ1Y3QgZG14X3N0YykKKyNkZWZpbmUgRE1YX0FERF9QSUQgICAgICAgICAgICAgIF9JT1coJ28nLCA1MSwgX191MTYpCisjZGVmaW5lIERNWF9SRU1PVkVfUElEICAgICAgICAgICBfSU9XKCdvJywgNTIsIF9fdTE2KQorCisjZW5kaWYgLypfRFZCRE1YX0hfKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL2Zyb250ZW5kLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi9mcm9udGVuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMTA5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi9mcm9udGVuZC5oCkBAIC0wLDAgKzEsNDI3IEBACisvKgorICogZnJvbnRlbmQuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBNYXJjdXMgTWV0emxlciA8bWFyY3VzQGNvbnZlcmdlbmNlLmRlPgorICoJCSAgICBSYWxwaCAgTWV0emxlciA8cmFscGhAY29udmVyZ2VuY2UuZGU+CisgKgkJICAgIEhvbGdlciBXYWVjaHRsZXIgPGhvbGdlckBjb252ZXJnZW5jZS5kZT4KKyAqCQkgICAgQW5kcmUgRHJhc3ppayA8YWRAY29udmVyZ2VuY2UuZGU+CisgKgkJICAgIGZvciBjb252ZXJnZW5jZSBpbnRlZ3JhdGVkIG1lZGlhIEdtYkgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX0RWQkZST05URU5EX0hfCisjZGVmaW5lIF9EVkJGUk9OVEVORF9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwordHlwZWRlZiBlbnVtIGZlX3R5cGUgeworCUZFX1FQU0ssCisJRkVfUUFNLAorCUZFX09GRE0sCisJRkVfQVRTQworfSBmZV90eXBlX3Q7CisKKwordHlwZWRlZiBlbnVtIGZlX2NhcHMgeworCUZFX0lTX1NUVVBJRAkJCT0gMCwKKwlGRV9DQU5fSU5WRVJTSU9OX0FVVE8JCT0gMHgxLAorCUZFX0NBTl9GRUNfMV8yCQkJPSAweDIsCisJRkVfQ0FOX0ZFQ18yXzMJCQk9IDB4NCwKKwlGRV9DQU5fRkVDXzNfNAkJCT0gMHg4LAorCUZFX0NBTl9GRUNfNF81CQkJPSAweDEwLAorCUZFX0NBTl9GRUNfNV82CQkJPSAweDIwLAorCUZFX0NBTl9GRUNfNl83CQkJPSAweDQwLAorCUZFX0NBTl9GRUNfN184CQkJPSAweDgwLAorCUZFX0NBTl9GRUNfOF85CQkJPSAweDEwMCwKKwlGRV9DQU5fRkVDX0FVVE8JCQk9IDB4MjAwLAorCUZFX0NBTl9RUFNLCQkJPSAweDQwMCwKKwlGRV9DQU5fUUFNXzE2CQkJPSAweDgwMCwKKwlGRV9DQU5fUUFNXzMyCQkJPSAweDEwMDAsCisJRkVfQ0FOX1FBTV82NAkJCT0gMHgyMDAwLAorCUZFX0NBTl9RQU1fMTI4CQkJPSAweDQwMDAsCisJRkVfQ0FOX1FBTV8yNTYJCQk9IDB4ODAwMCwKKwlGRV9DQU5fUUFNX0FVVE8JCQk9IDB4MTAwMDAsCisJRkVfQ0FOX1RSQU5TTUlTU0lPTl9NT0RFX0FVVE8JPSAweDIwMDAwLAorCUZFX0NBTl9CQU5EV0lEVEhfQVVUTwkJPSAweDQwMDAwLAorCUZFX0NBTl9HVUFSRF9JTlRFUlZBTF9BVVRPCT0gMHg4MDAwMCwKKwlGRV9DQU5fSElFUkFSQ0hZX0FVVE8JCT0gMHgxMDAwMDAsCisJRkVfQ0FOXzhWU0IJCQk9IDB4MjAwMDAwLAorCUZFX0NBTl8xNlZTQgkJCT0gMHg0MDAwMDAsCisJRkVfSEFTX0VYVEVOREVEX0NBUFMJCT0gMHg4MDAwMDAsICAgLyogV2UgbmVlZCBtb3JlIGJpdHNwYWNlIGZvciBuZXdlciBBUElzLCBpbmRpY2F0ZSB0aGlzLiAqLworCUZFX0NBTl9UVVJCT19GRUMJCT0gMHg4MDAwMDAwLCAgLyogZnJvbnRlbmQgc3VwcG9ydHMgInR1cmJvIGZlYyBtb2R1bGF0aW9uIiAqLworCUZFX0NBTl8yR19NT0RVTEFUSU9OCQk9IDB4MTAwMDAwMDAsIC8qIGZyb250ZW5kIHN1cHBvcnRzICIybmQgZ2VuZXJhdGlvbiBtb2R1bGF0aW9uIiAoRFZCLVMyKSAqLworCUZFX05FRURTX0JFTkRJTkcJCT0gMHgyMDAwMDAwMCwgLyogbm90IHN1cHBvcnRlZCBhbnltb3JlLCBkb24ndCB1c2UgKGZyb250ZW5kIHJlcXVpcmVzIGZyZXF1ZW5jeSBiZW5kaW5nKSAqLworCUZFX0NBTl9SRUNPVkVSCQkJPSAweDQwMDAwMDAwLCAvKiBmcm9udGVuZCBjYW4gcmVjb3ZlciBmcm9tIGEgY2FibGUgdW5wbHVnIGF1dG9tYXRpY2FsbHkgKi8KKwlGRV9DQU5fTVVURV9UUwkJCT0gMHg4MDAwMDAwMCAgLyogZnJvbnRlbmQgY2FuIHN0b3Agc3B1cmlvdXMgVFMgZGF0YSBvdXRwdXQgKi8KK30gZmVfY2Fwc190OworCisKK3N0cnVjdCBkdmJfZnJvbnRlbmRfaW5mbyB7CisJY2hhciAgICAgICBuYW1lWzEyOF07CisJZmVfdHlwZV90ICB0eXBlOworCV9fdTMyICAgICAgZnJlcXVlbmN5X21pbjsKKwlfX3UzMiAgICAgIGZyZXF1ZW5jeV9tYXg7CisJX191MzIgICAgICBmcmVxdWVuY3lfc3RlcHNpemU7CisJX191MzIgICAgICBmcmVxdWVuY3lfdG9sZXJhbmNlOworCV9fdTMyICAgICAgc3ltYm9sX3JhdGVfbWluOworCV9fdTMyICAgICAgc3ltYm9sX3JhdGVfbWF4OworCV9fdTMyICAgICAgc3ltYm9sX3JhdGVfdG9sZXJhbmNlOwkvKiBwcG0gKi8KKwlfX3UzMiAgICAgIG5vdGlmaWVyX2RlbGF5OwkJLyogREVQUkVDQVRFRCAqLworCWZlX2NhcHNfdCAgY2FwczsKK307CisKKworLyoqCisgKiAgQ2hlY2sgb3V0IHRoZSBEaVNFcUMgYnVzIHNwZWMgYXZhaWxhYmxlIG9uIGh0dHA6Ly93d3cuZXV0ZWxzYXQub3JnLyBmb3IKKyAqICB0aGUgbWVhbmluZyBvZiB0aGlzIHN0cnVjdC4uLgorICovCitzdHJ1Y3QgZHZiX2Rpc2VxY19tYXN0ZXJfY21kIHsKKwlfX3U4IG1zZyBbNl07CS8qICB7IGZyYW1pbmcsIGFkZHJlc3MsIGNvbW1hbmQsIGRhdGEgWzNdIH0gKi8KKwlfX3U4IG1zZ19sZW47CS8qICB2YWxpZCB2YWx1ZXMgYXJlIDMuLi42ICAqLworfTsKKworCitzdHJ1Y3QgZHZiX2Rpc2VxY19zbGF2ZV9yZXBseSB7CisJX191OCBtc2cgWzRdOwkvKiAgeyBmcmFtaW5nLCBkYXRhIFszXSB9ICovCisJX191OCBtc2dfbGVuOwkvKiAgdmFsaWQgdmFsdWVzIGFyZSAwLi4uNCwgMCBtZWFucyBubyBtc2cgICovCisJaW50ICB0aW1lb3V0OwkvKiAgcmV0dXJuIGZyb20gaW9jdGwgYWZ0ZXIgdGltZW91dCBtcyB3aXRoICovCit9OwkJCS8qICBlcnJvcmNvZGUgd2hlbiBubyBtZXNzYWdlIHdhcyByZWNlaXZlZCAgKi8KKworCit0eXBlZGVmIGVudW0gZmVfc2VjX3ZvbHRhZ2UgeworCVNFQ19WT0xUQUdFXzEzLAorCVNFQ19WT0xUQUdFXzE4LAorCVNFQ19WT0xUQUdFX09GRgorfSBmZV9zZWNfdm9sdGFnZV90OworCisKK3R5cGVkZWYgZW51bSBmZV9zZWNfdG9uZV9tb2RlIHsKKwlTRUNfVE9ORV9PTiwKKwlTRUNfVE9ORV9PRkYKK30gZmVfc2VjX3RvbmVfbW9kZV90OworCisKK3R5cGVkZWYgZW51bSBmZV9zZWNfbWluaV9jbWQgeworCVNFQ19NSU5JX0EsCisJU0VDX01JTklfQgorfSBmZV9zZWNfbWluaV9jbWRfdDsKKworCit0eXBlZGVmIGVudW0gZmVfc3RhdHVzIHsKKwlGRV9IQVNfU0lHTkFMCT0gMHgwMSwgICAvKiBmb3VuZCBzb21ldGhpbmcgYWJvdmUgdGhlIG5vaXNlIGxldmVsICovCisJRkVfSEFTX0NBUlJJRVIJPSAweDAyLCAgIC8qIGZvdW5kIGEgRFZCIHNpZ25hbCAgKi8KKwlGRV9IQVNfVklURVJCSQk9IDB4MDQsICAgLyogRkVDIGlzIHN0YWJsZSAgKi8KKwlGRV9IQVNfU1lOQwk9IDB4MDgsICAgLyogZm91bmQgc3luYyBieXRlcyAgKi8KKwlGRV9IQVNfTE9DSwk9IDB4MTAsICAgLyogZXZlcnl0aGluZydzIHdvcmtpbmcuLi4gKi8KKwlGRV9USU1FRE9VVAk9IDB4MjAsICAgLyogbm8gbG9jayB3aXRoaW4gdGhlIGxhc3QgfjIgc2Vjb25kcyAqLworCUZFX1JFSU5JVAk9IDB4NDAgICAgLyogZnJvbnRlbmQgd2FzIHJlaW5pdGlhbGl6ZWQsICAqLworfSBmZV9zdGF0dXNfdDsJCQkgIC8qIGFwcGxpY2F0aW9uIGlzIHJlY29tbWVuZGVkIHRvIHJlc2V0ICovCisJCQkJICAvKiBEaVNFcUMsIHRvbmUgYW5kIHBhcmFtZXRlcnMgKi8KKwordHlwZWRlZiBlbnVtIGZlX3NwZWN0cmFsX2ludmVyc2lvbiB7CisJSU5WRVJTSU9OX09GRiwKKwlJTlZFUlNJT05fT04sCisJSU5WRVJTSU9OX0FVVE8KK30gZmVfc3BlY3RyYWxfaW52ZXJzaW9uX3Q7CisKKwordHlwZWRlZiBlbnVtIGZlX2NvZGVfcmF0ZSB7CisJRkVDX05PTkUgPSAwLAorCUZFQ18xXzIsCisJRkVDXzJfMywKKwlGRUNfM180LAorCUZFQ180XzUsCisJRkVDXzVfNiwKKwlGRUNfNl83LAorCUZFQ183XzgsCisJRkVDXzhfOSwKKwlGRUNfQVVUTywKKwlGRUNfM181LAorCUZFQ185XzEwLAorfSBmZV9jb2RlX3JhdGVfdDsKKworCit0eXBlZGVmIGVudW0gZmVfbW9kdWxhdGlvbiB7CisJUVBTSywKKwlRQU1fMTYsCisJUUFNXzMyLAorCVFBTV82NCwKKwlRQU1fMTI4LAorCVFBTV8yNTYsCisJUUFNX0FVVE8sCisJVlNCXzgsCisJVlNCXzE2LAorCVBTS184LAorCUFQU0tfMTYsCisJQVBTS18zMiwKKwlEUVBTSywKK30gZmVfbW9kdWxhdGlvbl90OworCit0eXBlZGVmIGVudW0gZmVfdHJhbnNtaXRfbW9kZSB7CisJVFJBTlNNSVNTSU9OX01PREVfMkssCisJVFJBTlNNSVNTSU9OX01PREVfOEssCisJVFJBTlNNSVNTSU9OX01PREVfQVVUTywKKwlUUkFOU01JU1NJT05fTU9ERV80SywKKwlUUkFOU01JU1NJT05fTU9ERV8xSywKKwlUUkFOU01JU1NJT05fTU9ERV8xNkssCisJVFJBTlNNSVNTSU9OX01PREVfMzJLLAorfSBmZV90cmFuc21pdF9tb2RlX3Q7CisKK3R5cGVkZWYgZW51bSBmZV9iYW5kd2lkdGggeworCUJBTkRXSURUSF84X01IWiwKKwlCQU5EV0lEVEhfN19NSFosCisJQkFORFdJRFRIXzZfTUhaLAorCUJBTkRXSURUSF9BVVRPLAorCUJBTkRXSURUSF81X01IWiwKKwlCQU5EV0lEVEhfMTBfTUhaLAorCUJBTkRXSURUSF8xXzcxMl9NSFosCit9IGZlX2JhbmR3aWR0aF90OworCisKK3R5cGVkZWYgZW51bSBmZV9ndWFyZF9pbnRlcnZhbCB7CisJR1VBUkRfSU5URVJWQUxfMV8zMiwKKwlHVUFSRF9JTlRFUlZBTF8xXzE2LAorCUdVQVJEX0lOVEVSVkFMXzFfOCwKKwlHVUFSRF9JTlRFUlZBTF8xXzQsCisJR1VBUkRfSU5URVJWQUxfQVVUTywKKwlHVUFSRF9JTlRFUlZBTF8xXzEyOCwKKwlHVUFSRF9JTlRFUlZBTF8xOV8xMjgsCisJR1VBUkRfSU5URVJWQUxfMTlfMjU2LAorfSBmZV9ndWFyZF9pbnRlcnZhbF90OworCisKK3R5cGVkZWYgZW51bSBmZV9oaWVyYXJjaHkgeworCUhJRVJBUkNIWV9OT05FLAorCUhJRVJBUkNIWV8xLAorCUhJRVJBUkNIWV8yLAorCUhJRVJBUkNIWV80LAorCUhJRVJBUkNIWV9BVVRPCit9IGZlX2hpZXJhcmNoeV90OworCisKK3N0cnVjdCBkdmJfcXBza19wYXJhbWV0ZXJzIHsKKwlfX3UzMgkJc3ltYm9sX3JhdGU7ICAvKiBzeW1ib2wgcmF0ZSBpbiBTeW1ib2xzIHBlciBzZWNvbmQgKi8KKwlmZV9jb2RlX3JhdGVfdAlmZWNfaW5uZXI7ICAgIC8qIGZvcndhcmQgZXJyb3IgY29ycmVjdGlvbiAoc2VlIGFib3ZlKSAqLworfTsKKworc3RydWN0IGR2Yl9xYW1fcGFyYW1ldGVycyB7CisJX191MzIJCXN5bWJvbF9yYXRlOyAvKiBzeW1ib2wgcmF0ZSBpbiBTeW1ib2xzIHBlciBzZWNvbmQgKi8KKwlmZV9jb2RlX3JhdGVfdAlmZWNfaW5uZXI7ICAgLyogZm9yd2FyZCBlcnJvciBjb3JyZWN0aW9uIChzZWUgYWJvdmUpICovCisJZmVfbW9kdWxhdGlvbl90CW1vZHVsYXRpb247ICAvKiBtb2R1bGF0aW9uIHR5cGUgKHNlZSBhYm92ZSkgKi8KK307CisKK3N0cnVjdCBkdmJfdnNiX3BhcmFtZXRlcnMgeworCWZlX21vZHVsYXRpb25fdAltb2R1bGF0aW9uOyAgLyogbW9kdWxhdGlvbiB0eXBlIChzZWUgYWJvdmUpICovCit9OworCitzdHJ1Y3QgZHZiX29mZG1fcGFyYW1ldGVycyB7CisJZmVfYmFuZHdpZHRoX3QgICAgICBiYW5kd2lkdGg7CisJZmVfY29kZV9yYXRlX3QgICAgICBjb2RlX3JhdGVfSFA7ICAvKiBoaWdoIHByaW9yaXR5IHN0cmVhbSBjb2RlIHJhdGUgKi8KKwlmZV9jb2RlX3JhdGVfdCAgICAgIGNvZGVfcmF0ZV9MUDsgIC8qIGxvdyBwcmlvcml0eSBzdHJlYW0gY29kZSByYXRlICovCisJZmVfbW9kdWxhdGlvbl90ICAgICBjb25zdGVsbGF0aW9uOyAvKiBtb2R1bGF0aW9uIHR5cGUgKHNlZSBhYm92ZSkgKi8KKwlmZV90cmFuc21pdF9tb2RlX3QgIHRyYW5zbWlzc2lvbl9tb2RlOworCWZlX2d1YXJkX2ludGVydmFsX3QgZ3VhcmRfaW50ZXJ2YWw7CisJZmVfaGllcmFyY2h5X3QgICAgICBoaWVyYXJjaHlfaW5mb3JtYXRpb247Cit9OworCisKK3N0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyB7CisJX191MzIgZnJlcXVlbmN5OyAgICAgLyogKGFic29sdXRlKSBmcmVxdWVuY3kgaW4gSHogZm9yIFFBTS9PRkRNL0FUU0MgKi8KKwkJCSAgICAgLyogaW50ZXJtZWRpYXRlIGZyZXF1ZW5jeSBpbiBrSHogZm9yIFFQU0sgKi8KKwlmZV9zcGVjdHJhbF9pbnZlcnNpb25fdCBpbnZlcnNpb247CisJdW5pb24geworCQlzdHJ1Y3QgZHZiX3Fwc2tfcGFyYW1ldGVycyBxcHNrOworCQlzdHJ1Y3QgZHZiX3FhbV9wYXJhbWV0ZXJzICBxYW07CisJCXN0cnVjdCBkdmJfb2ZkbV9wYXJhbWV0ZXJzIG9mZG07CisJCXN0cnVjdCBkdmJfdnNiX3BhcmFtZXRlcnMgdnNiOworCX0gdTsKK307CisKKworc3RydWN0IGR2Yl9mcm9udGVuZF9ldmVudCB7CisJZmVfc3RhdHVzX3Qgc3RhdHVzOworCXN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyBwYXJhbWV0ZXJzOworfTsKKworLyogUzJBUEkgQ29tbWFuZHMgKi8KKyNkZWZpbmUgRFRWX1VOREVGSU5FRAkJMAorI2RlZmluZSBEVFZfVFVORQkJMQorI2RlZmluZSBEVFZfQ0xFQVIJCTIKKyNkZWZpbmUgRFRWX0ZSRVFVRU5DWQkJMworI2RlZmluZSBEVFZfTU9EVUxBVElPTgkJNAorI2RlZmluZSBEVFZfQkFORFdJRFRIX0haCTUKKyNkZWZpbmUgRFRWX0lOVkVSU0lPTgkJNgorI2RlZmluZSBEVFZfRElTRVFDX01BU1RFUgk3CisjZGVmaW5lIERUVl9TWU1CT0xfUkFURQkJOAorI2RlZmluZSBEVFZfSU5ORVJfRkVDCQk5CisjZGVmaW5lIERUVl9WT0xUQUdFCQkxMAorI2RlZmluZSBEVFZfVE9ORQkJMTEKKyNkZWZpbmUgRFRWX1BJTE9UCQkxMgorI2RlZmluZSBEVFZfUk9MTE9GRgkJMTMKKyNkZWZpbmUgRFRWX0RJU0VRQ19TTEFWRV9SRVBMWQkxNAorCisvKiBCYXNpYyBlbnVtZXJhdGlvbiBzZXQgZm9yIHF1ZXJ5aW5nIHVubGltaXRlZCBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgRFRWX0ZFX0NBUEFCSUxJVFlfQ09VTlQJMTUKKyNkZWZpbmUgRFRWX0ZFX0NBUEFCSUxJVFkJMTYKKyNkZWZpbmUgRFRWX0RFTElWRVJZX1NZU1RFTQkxNworCisvKiBJU0RCLVQgYW5kIElTREItVHNiICovCisjZGVmaW5lIERUVl9JU0RCVF9QQVJUSUFMX1JFQ0VQVElPTgkxOAorI2RlZmluZSBEVFZfSVNEQlRfU09VTkRfQlJPQURDQVNUSU5HCTE5CisKKyNkZWZpbmUgRFRWX0lTREJUX1NCX1NVQkNIQU5ORUxfSUQJMjAKKyNkZWZpbmUgRFRWX0lTREJUX1NCX1NFR01FTlRfSURYCTIxCisjZGVmaW5lIERUVl9JU0RCVF9TQl9TRUdNRU5UX0NPVU5UCTIyCisKKyNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQV9GRUMJCQkyMworI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJBX01PRFVMQVRJT04JCTI0CisjZGVmaW5lIERUVl9JU0RCVF9MQVlFUkFfU0VHTUVOVF9DT1VOVAkJMjUKKyNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQV9USU1FX0lOVEVSTEVBVklORwkyNgorCisjZGVmaW5lIERUVl9JU0RCVF9MQVlFUkJfRkVDCQkJMjcKKyNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQl9NT0RVTEFUSU9OCQkyOAorI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJCX1NFR01FTlRfQ09VTlQJCTI5CisjZGVmaW5lIERUVl9JU0RCVF9MQVlFUkJfVElNRV9JTlRFUkxFQVZJTkcJMzAKKworI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJDX0ZFQwkJCTMxCisjZGVmaW5lIERUVl9JU0RCVF9MQVlFUkNfTU9EVUxBVElPTgkJMzIKKyNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQ19TRUdNRU5UX0NPVU5UCQkzMworI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJDX1RJTUVfSU5URVJMRUFWSU5HCTM0CisKKyNkZWZpbmUgRFRWX0FQSV9WRVJTSU9OCQkzNQorCisjZGVmaW5lIERUVl9DT0RFX1JBVEVfSFAJMzYKKyNkZWZpbmUgRFRWX0NPREVfUkFURV9MUAkzNworI2RlZmluZSBEVFZfR1VBUkRfSU5URVJWQUwJMzgKKyNkZWZpbmUgRFRWX1RSQU5TTUlTU0lPTl9NT0RFCTM5CisjZGVmaW5lIERUVl9ISUVSQVJDSFkJCTQwCisKKyNkZWZpbmUgRFRWX0lTREJUX0xBWUVSX0VOQUJMRUQJNDEKKworI2RlZmluZSBEVFZfSVNEQlNfVFNfSUQJCTQyCisKKyNkZWZpbmUgRFRWX0RWQlQyX1BMUF9JRAk0MworCisjZGVmaW5lIERUVl9NQVhfQ09NTUFORAkJCQlEVFZfRFZCVDJfUExQX0lECisKK3R5cGVkZWYgZW51bSBmZV9waWxvdCB7CisJUElMT1RfT04sCisJUElMT1RfT0ZGLAorCVBJTE9UX0FVVE8sCit9IGZlX3BpbG90X3Q7CisKK3R5cGVkZWYgZW51bSBmZV9yb2xsb2ZmIHsKKwlST0xMT0ZGXzM1LCAvKiBJbXBsaWVkIHZhbHVlIGluIERWQi1TLCBkZWZhdWx0IGZvciBEVkItUzIgKi8KKwlST0xMT0ZGXzIwLAorCVJPTExPRkZfMjUsCisJUk9MTE9GRl9BVVRPLAorfSBmZV9yb2xsb2ZmX3Q7CisKK3R5cGVkZWYgZW51bSBmZV9kZWxpdmVyeV9zeXN0ZW0geworCVNZU19VTkRFRklORUQsCisJU1lTX0RWQkNfQU5ORVhfQUMsCisJU1lTX0RWQkNfQU5ORVhfQiwKKwlTWVNfRFZCVCwKKwlTWVNfRFNTLAorCVNZU19EVkJTLAorCVNZU19EVkJTMiwKKwlTWVNfRFZCSCwKKwlTWVNfSVNEQlQsCisJU1lTX0lTREJTLAorCVNZU19JU0RCQywKKwlTWVNfQVRTQywKKwlTWVNfQVRTQ01ILAorCVNZU19ETUJUSCwKKwlTWVNfQ01NQiwKKwlTWVNfREFCLAorCVNZU19EVkJUMiwKKwlTWVNfVFVSQk8sCit9IGZlX2RlbGl2ZXJ5X3N5c3RlbV90OworCitzdHJ1Y3QgZHR2X2NtZHNfaCB7CisJY2hhcgkqbmFtZTsJCS8qIEEgZGlzcGxheSBuYW1lIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgKi8KKworCV9fdTMyCWNtZDsJCS8qIEEgdW5pcXVlIElEICovCisKKwkvKiBGbGFncyAqLworCV9fdTMyCXNldDoxOwkJLyogRWl0aGVyIGEgc2V0IG9yIGdldCBwcm9wZXJ0eSAqLworCV9fdTMyCWJ1ZmZlcjoxOwkvKiBEb2VzIHRoaXMgcHJvcGVydHkgdXNlIHRoZSBidWZmZXI/ICovCisJX191MzIJcmVzZXJ2ZWQ6MzA7CS8qIEFsaWduICovCit9OworCitzdHJ1Y3QgZHR2X3Byb3BlcnR5IHsKKwlfX3UzMiBjbWQ7CisJX191MzIgcmVzZXJ2ZWRbM107CisJdW5pb24geworCQlfX3UzMiBkYXRhOworCQlzdHJ1Y3QgeworCQkJX191OCBkYXRhWzMyXTsKKwkJCV9fdTMyIGxlbjsKKwkJCV9fdTMyIHJlc2VydmVkMVszXTsKKwkJCXZvaWQgKnJlc2VydmVkMjsKKwkJfSBidWZmZXI7CisJfSB1OworCWludCByZXN1bHQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogbnVtIG9mIHByb3BlcnRpZXMgY2Fubm90IGV4Y2VlZCBEVFZfSU9DVExfTUFYX01TR1MgcGVyIGlvY3RsICovCisjZGVmaW5lIERUVl9JT0NUTF9NQVhfTVNHUyA2NAorCitzdHJ1Y3QgZHR2X3Byb3BlcnRpZXMgeworCV9fdTMyIG51bTsKKwlzdHJ1Y3QgZHR2X3Byb3BlcnR5ICpwcm9wczsKK307CisKKyNkZWZpbmUgRkVfU0VUX1BST1BFUlRZCQkgICBfSU9XKCdvJywgODIsIHN0cnVjdCBkdHZfcHJvcGVydGllcykKKyNkZWZpbmUgRkVfR0VUX1BST1BFUlRZCQkgICBfSU9SKCdvJywgODMsIHN0cnVjdCBkdHZfcHJvcGVydGllcykKKworCisvKioKKyAqIFdoZW4gc2V0LCB0aGlzIGZsYWcgd2lsbCBkaXNhYmxlIGFueSB6aWd6YWdnaW5nIG9yIG90aGVyICJub3JtYWwiIHR1bmluZworICogYmVoYXZpb3VyLiBBZGRpdGlvbmFsbHksIHRoZXJlIHdpbGwgYmUgbm8gYXV0b21hdGljIG1vbml0b3Jpbmcgb2YgdGhlIGxvY2sKKyAqIHN0YXR1cywgYW5kIGhlbmNlIG5vIGZyb250ZW5kIGV2ZW50cyB3aWxsIGJlIGdlbmVyYXRlZC4gSWYgYSBmcm9udGVuZCBkZXZpY2UKKyAqIGlzIGNsb3NlZCwgdGhpcyBmbGFnIHdpbGwgYmUgYXV0b21hdGljYWxseSB0dXJuZWQgb2ZmIHdoZW4gdGhlIGRldmljZSBpcworICogcmVvcGVuZWQgcmVhZC13cml0ZS4KKyAqLworI2RlZmluZSBGRV9UVU5FX01PREVfT05FU0hPVCAweDAxCisKKworI2RlZmluZSBGRV9HRVRfSU5GTwkJICAgX0lPUignbycsIDYxLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX2luZm8pCisKKyNkZWZpbmUgRkVfRElTRVFDX1JFU0VUX09WRVJMT0FEICAgX0lPKCdvJywgNjIpCisjZGVmaW5lIEZFX0RJU0VRQ19TRU5EX01BU1RFUl9DTUQgIF9JT1coJ28nLCA2Mywgc3RydWN0IGR2Yl9kaXNlcWNfbWFzdGVyX2NtZCkKKyNkZWZpbmUgRkVfRElTRVFDX1JFQ1ZfU0xBVkVfUkVQTFkgX0lPUignbycsIDY0LCBzdHJ1Y3QgZHZiX2Rpc2VxY19zbGF2ZV9yZXBseSkKKyNkZWZpbmUgRkVfRElTRVFDX1NFTkRfQlVSU1QgICAgICAgX0lPKCdvJywgNjUpICAvKiBmZV9zZWNfbWluaV9jbWRfdCAqLworCisjZGVmaW5lIEZFX1NFVF9UT05FCQkgICBfSU8oJ28nLCA2NikgIC8qIGZlX3NlY190b25lX21vZGVfdCAqLworI2RlZmluZSBGRV9TRVRfVk9MVEFHRQkJICAgX0lPKCdvJywgNjcpICAvKiBmZV9zZWNfdm9sdGFnZV90ICovCisjZGVmaW5lIEZFX0VOQUJMRV9ISUdIX0xOQl9WT0xUQUdFIF9JTygnbycsIDY4KSAgLyogaW50ICovCisKKyNkZWZpbmUgRkVfUkVBRF9TVEFUVVMJCSAgIF9JT1IoJ28nLCA2OSwgZmVfc3RhdHVzX3QpCisjZGVmaW5lIEZFX1JFQURfQkVSCQkgICBfSU9SKCdvJywgNzAsIF9fdTMyKQorI2RlZmluZSBGRV9SRUFEX1NJR05BTF9TVFJFTkdUSCAgICBfSU9SKCdvJywgNzEsIF9fdTE2KQorI2RlZmluZSBGRV9SRUFEX1NOUgkJICAgX0lPUignbycsIDcyLCBfX3UxNikKKyNkZWZpbmUgRkVfUkVBRF9VTkNPUlJFQ1RFRF9CTE9DS1MgX0lPUignbycsIDczLCBfX3UzMikKKworI2RlZmluZSBGRV9TRVRfRlJPTlRFTkQJCSAgIF9JT1coJ28nLCA3Niwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKQorI2RlZmluZSBGRV9HRVRfRlJPTlRFTkQJCSAgIF9JT1IoJ28nLCA3Nywgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKQorI2RlZmluZSBGRV9TRVRfRlJPTlRFTkRfVFVORV9NT0RFICBfSU8oJ28nLCA4MSkgLyogdW5zaWduZWQgaW50ICovCisjZGVmaW5lIEZFX0dFVF9FVkVOVAkJICAgX0lPUignbycsIDc4LCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX2V2ZW50KQorCisjZGVmaW5lIEZFX0RJU0hORVRXT1JLX1NFTkRfTEVHQUNZX0NNRCBfSU8oJ28nLCA4MCkgLyogdW5zaWduZWQgaW50ICovCisKKyNlbmRpZiAvKl9EVkJGUk9OVEVORF9IXyovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi9uZXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL25ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NTFlN2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi9uZXQuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogbmV0LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTWFyY3VzIE1ldHpsZXIgPG1hcmN1c0Bjb252ZXJnZW5jZS5kZT4KKyAqICAgICAgICAgICAgICAgICAgJiBSYWxwaCAgTWV0emxlciA8cmFscGhAY29udmVyZ2VuY2UuZGU+CisgKiAgICAgICAgICAgICAgICAgICAgZm9yIGNvbnZlcmdlbmNlIGludGVncmF0ZWQgbWVkaWEgR21iSAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMQorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfRFZCTkVUX0hfCisjZGVmaW5lIF9EVkJORVRfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBkdmJfbmV0X2lmIHsKKwlfX3UxNiBwaWQ7CisJX191MTYgaWZfbnVtOworCV9fdTggIGZlZWR0eXBlOworI2RlZmluZSBEVkJfTkVUX0ZFRURUWVBFX01QRSAwCS8qIG11bHRpIHByb3RvY29sIGVuY2Fwc3VsYXRpb24gKi8KKyNkZWZpbmUgRFZCX05FVF9GRUVEVFlQRV9VTEUgMQkvKiB1bHRyYSBsaWdodHdlaWdodCBlbmNhcHN1bGF0aW9uICovCit9OworCisKKyNkZWZpbmUgTkVUX0FERF9JRiAgICBfSU9XUignbycsIDUyLCBzdHJ1Y3QgZHZiX25ldF9pZikKKyNkZWZpbmUgTkVUX1JFTU9WRV9JRiBfSU8oJ28nLCA1MykKKyNkZWZpbmUgTkVUX0dFVF9JRiAgICBfSU9XUignbycsIDU0LCBzdHJ1Y3QgZHZiX25ldF9pZikKKworCisvKiBiaW5hcnkgY29tcGF0aWJpbGl0eSBjcnVmdDogKi8KK3N0cnVjdCBfX2R2Yl9uZXRfaWZfb2xkIHsKKwlfX3UxNiBwaWQ7CisJX191MTYgaWZfbnVtOworfTsKKyNkZWZpbmUgX19ORVRfQUREX0lGX09MRCBfSU9XUignbycsIDUyLCBzdHJ1Y3QgX19kdmJfbmV0X2lmX29sZCkKKyNkZWZpbmUgX19ORVRfR0VUX0lGX09MRCBfSU9XUignbycsIDU0LCBzdHJ1Y3QgX19kdmJfbmV0X2lmX29sZCkKKworCisjZW5kaWYgLypfRFZCTkVUX0hfKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL29zZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvb3NkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4YzdjYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL29zZC5oCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogb3NkLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgUmFscGggIE1ldHpsZXIgPHJhbHBoQGNvbnZlcmdlbmNlLmRlPgorICogICAgICAgICAgICAgICAgICAmIE1hcmN1cyBNZXR6bGVyIDxtYXJjdXNAY29udmVyZ2VuY2UuZGU+CisgKiAgICAgICAgICAgICAgICAgICAgZm9yIGNvbnZlcmdlbmNlIGludGVncmF0ZWQgbWVkaWEgR21iSAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIExlc3NlciBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMQorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfRFZCT1NEX0hfCisjZGVmaW5lIF9EVkJPU0RfSF8KKworCisKK3R5cGVkZWYgZW51bSB7CisgIC8vIEFsbCBmdW5jdGlvbnMgcmV0dXJuIC0yIG9uICJub3Qgb3BlbiIKKyAgT1NEX0Nsb3NlPTEsICAgIC8vICgpCisgIC8vIERpc2FibGVzIE9TRCBhbmQgcmVsZWFzZXMgdGhlIGJ1ZmZlcnMKKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyAgT1NEX09wZW4sICAgICAgIC8vICh4MCx5MCx4MSx5MSxCaXRQZXJQaXhlbFsyLzQvOF0oY29sb3ImMHgwRiksbWl4WzAuLjE1XShjb2xvciYweEYwKSkKKyAgLy8gT3BlbnMgT1NEIHdpdGggdGhpcyBzaXplIGFuZCBiaXQgZGVwdGgKKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIERSQU0gYWxsb2NhdGlvbiBlcnJvciwgLTIgb24gImFscmVhZHkgb3BlbiIKKyAgT1NEX1Nob3csICAgICAgIC8vICgpCisgIC8vIGVuYWJsZXMgT1NEIG1vZGUKKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyAgT1NEX0hpZGUsICAgICAgIC8vICgpCisgIC8vIGRpc2FibGVzIE9TRCBtb2RlCisgIC8vIHJldHVybnMgMCBvbiBzdWNjZXNzCisgIE9TRF9DbGVhciwgICAgICAvLyAoKQorICAvLyBTZXRzIGFsbCBwaXhlbCB0byBjb2xvciAwCisgIC8vIHJldHVybnMgMCBvbiBzdWNjZXNzCisgIE9TRF9GaWxsLCAgICAgICAvLyAoY29sb3IpCisgIC8vIFNldHMgYWxsIHBpeGVsIHRvIGNvbG9yIDxjb2w+CisgIC8vIHJldHVybnMgMCBvbiBzdWNjZXNzCisgIE9TRF9TZXRDb2xvciwgICAvLyAoY29sb3IsUnt4MH0sR3t5MH0sQnt4MX0sb3BhY2l0eXt5MX0pCisgIC8vIHNldCBwYWxldHRlIGVudHJ5IDxudW0+IHRvIDxyLGcsYj4sIDxtaXg+IGFuZCA8dHJhbnM+IGFwcGx5CisgIC8vIFIsRyxCOiAwLi4yNTUKKyAgLy8gUj1SZWQsIEc9R3JlZW4sIEI9Qmx1ZQorICAvLyBvcGFjaXR5PTA6ICAgICAgcGl4ZWwgb3BhY2l0eSAwJSAob25seSB2aWRlbyBwaXhlbCBzaG93cykKKyAgLy8gb3BhY2l0eT0xLi4yNTQ6IHBpeGVsIG9wYWNpdHkgYXMgc3BlY2lmaWVkIGluIGhlYWRlcgorICAvLyBvcGFjaXR5PTI1NTogICAgcGl4ZWwgb3BhY2l0eSAxMDAlIChvbmx5IE9TRCBwaXhlbCBzaG93cykKKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCisgIE9TRF9TZXRQYWxldHRlLCAvLyAoZmlyc3Rjb2xvcntjb2xvcn0sbGFzdGNvbG9ye3gwfSxkYXRhKQorICAvLyBTZXQgYSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcGFsZXR0ZQorICAvLyBzZXRzIHRoZSBlbnRyaWVzICJmaXJzdGNvbG9yIiB0aHJvdWdoICJsYXN0Y29sb3IiIGZyb20gdGhlIGFycmF5ICJkYXRhIgorICAvLyBkYXRhIGhhcyA0IGJ5dGUgZm9yIGVhY2ggY29sb3I6CisgIC8vIFIsRyxCLCBhbmQgYSBvcGFjaXR5IHZhbHVlOiAwLT50cmFuc3BhcmVudCwgMS4uMjU0LT5taXgsIDI1NS0+cGl4ZWwKKyAgT1NEX1NldFRyYW5zLCAgIC8vICh0cmFuc3BhcmVuY3l7Y29sb3J9KQorICAvLyBTZXRzIHRyYW5zcGFyZW5jeSBvZiBtaXhlZCBwaXhlbCAoMC4uMTUpCisgIC8vIHJldHVybnMgMCBvbiBzdWNjZXNzCisgIE9TRF9TZXRQaXhlbCwgICAvLyAoeDAseTAsY29sb3IpCisgIC8vIHNldHMgcGl4ZWwgPHg+LDx5PiB0byBjb2xvciBudW1iZXIgPGNvbD4KKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCisgIE9TRF9HZXRQaXhlbCwgICAvLyAoeDAseTApCisgIC8vIHJldHVybnMgY29sb3IgbnVtYmVyIG9mIHBpeGVsIDx4Piw8eT4sICBvciAtMQorICBPU0RfU2V0Um93LCAgICAgLy8gKHgwLHkwLHgxLGRhdGEpCisgIC8vIGZpbGxzIHBpeGVscyB4MCx5IHRocm91Z2ggIHgxLHkgd2l0aCB0aGUgY29udGVudCBvZiBkYXRhW10KKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGNsaXBwaW5nIGFsbCBwaXhlbCAobm8gcGl4ZWwgZHJhd24pCisgIE9TRF9TZXRCbG9jaywgICAvLyAoeDAseTAseDEseTEsaW5jcmVtZW50e2NvbG9yfSxkYXRhKQorICAvLyBmaWxscyBwaXhlbHMgeDAseTAgdGhyb3VnaCAgeDEseTEgd2l0aCB0aGUgY29udGVudCBvZiBkYXRhW10KKyAgLy8gaW5jIGNvbnRhaW5zIHRoZSB3aWR0aCBvZiBvbmUgbGluZSBpbiB0aGUgZGF0YSBibG9jaywKKyAgLy8gaW5jPD0wIHVzZXMgYmxvY2t3aWR0aCBhcyBsaW5ld2lkdGgKKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGNsaXBwaW5nIGFsbCBwaXhlbAorICBPU0RfRmlsbFJvdywgICAgLy8gKHgwLHkwLHgxLGNvbG9yKQorICAvLyBmaWxscyBwaXhlbHMgeDAseSB0aHJvdWdoICB4MSx5IHdpdGggdGhlIGNvbG9yIDxjb2w+CisgIC8vIHJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBjbGlwcGluZyBhbGwgcGl4ZWwKKyAgT1NEX0ZpbGxCbG9jaywgIC8vICh4MCx5MCx4MSx5MSxjb2xvcikKKyAgLy8gZmlsbHMgcGl4ZWxzIHgwLHkwIHRocm91Z2ggIHgxLHkxIHdpdGggdGhlIGNvbG9yIDxjb2w+CisgIC8vIHJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBjbGlwcGluZyBhbGwgcGl4ZWwKKyAgT1NEX0xpbmUsICAgICAgIC8vICh4MCx5MCx4MSx5MSxjb2xvcikKKyAgLy8gZHJhdyBhIGxpbmUgZnJvbSB4MCx5MCB0byB4MSx5MSB3aXRoIHRoZSBjb2xvciA8Y29sPgorICAvLyByZXR1cm5zIDAgb24gc3VjY2VzcworICBPU0RfUXVlcnksICAgICAgLy8gKHgwLHkwLHgxLHkxLHhhc3B7Y29sb3J9fSksIHlhc3A9MTEKKyAgLy8gZmlsbHMgcGFyYW1ldGVycyB3aXRoIHRoZSBwaWN0dXJlIGRpbWVuc2lvbnMgYW5kIHRoZSBwaXhlbCBhc3BlY3QgcmF0aW8KKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyAgT1NEX1Rlc3QsICAgICAgIC8vICgpCisgIC8vIGRyYXdzIGEgdGVzdCBwaWN0dXJlLiBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkKKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MKKy8vIFRPRE86IHJlbW92ZSAidGVzdCIgaW4gZmluYWwgdmVyc2lvbgorICBPU0RfVGV4dCwgICAgICAgLy8gKHgwLHkwLHNpemUsY29sb3IsdGV4dCkKKyAgT1NEX1NldFdpbmRvdywgLy8gICh4MCkgc2V0IHdpbmRvdyB3aXRoIG51bWJlciAwPHgwPDggYXMgY3VycmVudAorICBPU0RfTW92ZVdpbmRvdywgLy8gIG1vdmUgY3VycmVudCB3aW5kb3cgdG8gKHgwLCB5MCkKKyAgT1NEX09wZW5SYXcsCS8vIE9wZW4gb3RoZXIgdHlwZXMgb2YgT1NEIHdpbmRvd3MKK30gT1NEX0NvbW1hbmQ7CisKK3R5cGVkZWYgc3RydWN0IG9zZF9jbWRfcyB7CisJT1NEX0NvbW1hbmQgY21kOworCWludCB4MDsKKwlpbnQgeTA7CisJaW50IHgxOworCWludCB5MTsKKwlpbnQgY29sb3I7CisJdm9pZCAqZGF0YTsKK30gb3NkX2NtZF90OworCisvKiBPU0RfT3BlblJhdzogc2V0ICdjb2xvcicgdG8gZGVzaXJlZCB3aW5kb3cgdHlwZSAqLwordHlwZWRlZiBlbnVtIHsKKwlPU0RfQklUTUFQMSwgICAgICAgICAgIC8qIDEgYml0IGJpdG1hcCAqLworCU9TRF9CSVRNQVAyLCAgICAgICAgICAgLyogMiBiaXQgYml0bWFwICovCisJT1NEX0JJVE1BUDQsICAgICAgICAgICAvKiA0IGJpdCBiaXRtYXAgKi8KKwlPU0RfQklUTUFQOCwgICAgICAgICAgIC8qIDggYml0IGJpdG1hcCAqLworCU9TRF9CSVRNQVAxSFIsICAgICAgICAgLyogMSBCaXQgYml0bWFwIGhhbGYgcmVzb2x1dGlvbiAqLworCU9TRF9CSVRNQVAySFIsICAgICAgICAgLyogMiBiaXQgYml0bWFwIGhhbGYgcmVzb2x1dGlvbiAqLworCU9TRF9CSVRNQVA0SFIsICAgICAgICAgLyogNCBiaXQgYml0bWFwIGhhbGYgcmVzb2x1dGlvbiAqLworCU9TRF9CSVRNQVA4SFIsICAgICAgICAgLyogOCBiaXQgYml0bWFwIGhhbGYgcmVzb2x1dGlvbiAqLworCU9TRF9ZQ1JDQjQyMiwgICAgICAgICAgLyogNDoyOjIgWUNSQ0IgR3JhcGhpYyBEaXNwbGF5ICovCisJT1NEX1lDUkNCNDQ0LCAgICAgICAgICAvKiA0OjQ6NCBZQ1JDQiBHcmFwaGljIERpc3BsYXkgKi8KKwlPU0RfWUNSQ0I0NDRIUiwgICAgICAgIC8qIDQ6NDo0IFlDUkNCIGdyYXBoaWMgaGFsZiByZXNvbHV0aW9uICovCisJT1NEX1ZJREVPVFNJWkUsICAgICAgICAvKiBUcnVlIFNpemUgTm9ybWFsIE1QRUcgVmlkZW8gRGlzcGxheSAqLworCU9TRF9WSURFT0hTSVpFLCAgICAgICAgLyogTVBFRyBWaWRlbyBEaXNwbGF5IEhhbGYgUmVzb2x1dGlvbiAqLworCU9TRF9WSURFT1FTSVpFLCAgICAgICAgLyogTVBFRyBWaWRlbyBEaXNwbGF5IFF1YXJ0ZXIgUmVzb2x1dGlvbiAqLworCU9TRF9WSURFT0RTSVpFLCAgICAgICAgLyogTVBFRyBWaWRlbyBEaXNwbGF5IERvdWJsZSBSZXNvbHV0aW9uICovCisJT1NEX1ZJREVPVEhTSVpFLCAgICAgICAvKiBUcnVlIFNpemUgTVBFRyBWaWRlbyBEaXNwbGF5IEhhbGYgUmVzb2x1dGlvbiAqLworCU9TRF9WSURFT1RRU0laRSwgICAgICAgLyogVHJ1ZSBTaXplIE1QRUcgVmlkZW8gRGlzcGxheSBRdWFydGVyIFJlc29sdXRpb24qLworCU9TRF9WSURFT1REU0laRSwgICAgICAgLyogVHJ1ZSBTaXplIE1QRUcgVmlkZW8gRGlzcGxheSBEb3VibGUgUmVzb2x1dGlvbiAqLworCU9TRF9WSURFT05TSVpFLCAgICAgICAgLyogRnVsbCBTaXplIE1QRUcgVmlkZW8gRGlzcGxheSAqLworCU9TRF9DVVJTT1IgICAgICAgICAgICAgLyogQ3Vyc29yICovCit9IG9zZF9yYXdfd2luZG93X3Q7CisKK3R5cGVkZWYgc3RydWN0IG9zZF9jYXBfcyB7CisJaW50ICBjbWQ7CisjZGVmaW5lIE9TRF9DQVBfTUVNU0laRSAgICAgICAgIDEgIC8qIG1lbW9yeSBzaXplICovCisJbG9uZyB2YWw7Cit9IG9zZF9jYXBfdDsKKworCisjZGVmaW5lIE9TRF9TRU5EX0NNRCAgICAgICAgICAgIF9JT1coJ28nLCAxNjAsIG9zZF9jbWRfdCkKKyNkZWZpbmUgT1NEX0dFVF9DQVBBQklMSVRZICAgICAgX0lPUignbycsIDE2MSwgb3NkX2NhcF90KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL3ZlcnNpb24uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjU5NGIxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvdmVyc2lvbi5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiB2ZXJzaW9uLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgSG9sZ2VyIFdhZWNodGxlciA8aG9sZ2VyQGNvbnZlcmdlbmNlLmRlPgorICogICAgICAgICAgICAgICAgICAgIGZvciBjb252ZXJnZW5jZSBpbnRlZ3JhdGVkIG1lZGlhIEdtYkgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX0RWQlZFUlNJT05fSF8KKyNkZWZpbmUgX0RWQlZFUlNJT05fSF8KKworI2RlZmluZSBEVkJfQVBJX1ZFUlNJT04gNQorI2RlZmluZSBEVkJfQVBJX1ZFUlNJT05fTUlOT1IgNAorCisjZW5kaWYgLypfRFZCVkVSU0lPTl9IXyovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi92aWRlby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvdmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWM3OWE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvdmlkZW8uaApAQCAtMCwwICsxLDI3MiBAQAorLyoKKyAqIHZpZGVvLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTWFyY3VzIE1ldHpsZXIgPG1hcmN1c0Bjb252ZXJnZW5jZS5kZT4KKyAqICAgICAgICAgICAgICAgICAgJiBSYWxwaCAgTWV0emxlciA8cmFscGhAY29udmVyZ2VuY2UuZGU+CisgKiAgICAgICAgICAgICAgICAgICAgZm9yIGNvbnZlcmdlbmNlIGludGVncmF0ZWQgbWVkaWEgR21iSAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMQorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfRFZCVklERU9fSF8KKyNkZWZpbmUgX0RWQlZJREVPX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKwordHlwZWRlZiBlbnVtIHsKKwlWSURFT19GT1JNQVRfNF8zLCAgICAgLyogU2VsZWN0IDQ6MyBmb3JtYXQgKi8KKwlWSURFT19GT1JNQVRfMTZfOSwgICAgLyogU2VsZWN0IDE2OjkgZm9ybWF0LiAqLworCVZJREVPX0ZPUk1BVF8yMjFfMSAgICAvKiAyLjIxOjEgKi8KK30gdmlkZW9fZm9ybWF0X3Q7CisKKwordHlwZWRlZiBlbnVtIHsKKwkgVklERU9fU1lTVEVNX1BBTCwKKwkgVklERU9fU1lTVEVNX05UU0MsCisJIFZJREVPX1NZU1RFTV9QQUxOLAorCSBWSURFT19TWVNURU1fUEFMTmMsCisJIFZJREVPX1NZU1RFTV9QQUxNLAorCSBWSURFT19TWVNURU1fTlRTQzYwLAorCSBWSURFT19TWVNURU1fUEFMNjAsCisJIFZJREVPX1NZU1RFTV9QQUxNNjAKK30gdmlkZW9fc3lzdGVtX3Q7CisKKwordHlwZWRlZiBlbnVtIHsKKwlWSURFT19QQU5fU0NBTiwgICAgICAgLyogdXNlIHBhbiBhbmQgc2NhbiBmb3JtYXQgKi8KKwlWSURFT19MRVRURVJfQk9YLCAgICAgLyogdXNlIGxldHRlcmJveCBmb3JtYXQgKi8KKwlWSURFT19DRU5URVJfQ1VUX09VVCAgLyogdXNlIGNlbnRlciBjdXQgb3V0IGZvcm1hdCAqLworfSB2aWRlb19kaXNwbGF5Zm9ybWF0X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdzsKKwlpbnQgaDsKKwl2aWRlb19mb3JtYXRfdCBhc3BlY3RfcmF0aW87Cit9IHZpZGVvX3NpemVfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlWSURFT19TT1VSQ0VfREVNVVgsIC8qIFNlbGVjdCB0aGUgZGVtdXggYXMgdGhlIG1haW4gc291cmNlICovCisJVklERU9fU09VUkNFX01FTU9SWSAvKiBJZiB0aGlzIHNvdXJjZSBpcyBzZWxlY3RlZCwgdGhlIHN0cmVhbQorCQkJICAgICAgIGNvbWVzIGZyb20gdGhlIHVzZXIgdGhyb3VnaCB0aGUgd3JpdGUKKwkJCSAgICAgICBzeXN0ZW0gY2FsbCAqLworfSB2aWRlb19zdHJlYW1fc291cmNlX3Q7CisKKwordHlwZWRlZiBlbnVtIHsKKwlWSURFT19TVE9QUEVELCAvKiBWaWRlbyBpcyBzdG9wcGVkICovCisJVklERU9fUExBWUlORywgLyogVmlkZW8gaXMgY3VycmVudGx5IHBsYXlpbmcgKi8KKwlWSURFT19GUkVFWkVEICAvKiBWaWRlbyBpcyBmcmVlemVkICovCit9IHZpZGVvX3BsYXlfc3RhdGVfdDsKKworCisvKiBEZWNvZGVyIGNvbW1hbmRzICovCisjZGVmaW5lIFZJREVPX0NNRF9QTEFZICAgICAgICAoMCkKKyNkZWZpbmUgVklERU9fQ01EX1NUT1AgICAgICAgICgxKQorI2RlZmluZSBWSURFT19DTURfRlJFRVpFICAgICAgKDIpCisjZGVmaW5lIFZJREVPX0NNRF9DT05USU5VRSAgICAoMykKKworLyogRmxhZ3MgZm9yIFZJREVPX0NNRF9GUkVFWkUgKi8KKyNkZWZpbmUgVklERU9fQ01EX0ZSRUVaRV9UT19CTEFDSyAgICAgCSgxIDw8IDApCisKKy8qIEZsYWdzIGZvciBWSURFT19DTURfU1RPUCAqLworI2RlZmluZSBWSURFT19DTURfU1RPUF9UT19CTEFDSyAgICAgIAkoMSA8PCAwKQorI2RlZmluZSBWSURFT19DTURfU1RPUF9JTU1FRElBVEVMWSAgICAgCSgxIDw8IDEpCisKKy8qIFBsYXkgaW5wdXQgZm9ybWF0czogKi8KKy8qIFRoZSBkZWNvZGVyIGhhcyBubyBzcGVjaWFsIGZvcm1hdCByZXF1aXJlbWVudHMgKi8KKyNkZWZpbmUgVklERU9fUExBWV9GTVRfTk9ORSAgICAgICAgICgwKQorLyogVGhlIGRlY29kZXIgcmVxdWlyZXMgZnVsbCBHT1BzICovCisjZGVmaW5lIFZJREVPX1BMQVlfRk1UX0dPUCAgICAgICAgICAoMSkKKworLyogVGhlIHN0cnVjdHVyZSBtdXN0IGJlIHplcm9lZCBiZWZvcmUgdXNlIGJ5IHRoZSBhcHBsaWNhdGlvbgorICAgVGhpcyBlbnN1cmVzIGl0IGNhbiBiZSBleHRlbmRlZCBzYWZlbHkgaW4gdGhlIGZ1dHVyZS4gKi8KK3N0cnVjdCB2aWRlb19jb21tYW5kIHsKKwlfX3UzMiBjbWQ7CisJX191MzIgZmxhZ3M7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191NjQgcHRzOworCQl9IHN0b3A7CisKKwkJc3RydWN0IHsKKwkJCS8qIDAgb3IgMTAwMCBzcGVjaWZpZXMgbm9ybWFsIHNwZWVkLAorCQkJICAgMSBzcGVjaWZpZXMgZm9yd2FyZCBzaW5nbGUgc3RlcHBpbmcsCisJCQkgICAtMSBzcGVjaWZpZXMgYmFja3dhcmQgc2luZ2xlIHN0ZXBwaW5nLAorCQkJICAgPjE6IHBsYXliYWNrIGF0IHNwZWVkLzEwMDAgb2YgdGhlIG5vcm1hbCBzcGVlZCwKKwkJCSAgIDwtMTogcmV2ZXJzZSBwbGF5YmFjayBhdCAoLXNwZWVkLzEwMDApIG9mIHRoZSBub3JtYWwgc3BlZWQuICovCisJCQlfX3MzMiBzcGVlZDsKKwkJCV9fdTMyIGZvcm1hdDsKKwkJfSBwbGF5OworCisJCXN0cnVjdCB7CisJCQlfX3UzMiBkYXRhWzE2XTsKKwkJfSByYXc7CisJfTsKK307CisKKy8qIEZJRUxEX1VOS05PV04gY2FuIGJlIHVzZWQgaWYgdGhlIGhhcmR3YXJlIGRvZXMgbm90IGtub3cgd2hldGhlcgorICAgdGhlIFZzeW5jIGlzIGZvciBhbiBvZGQsIGV2ZW4gb3IgcHJvZ3Jlc3NpdmUgKGkuZS4gbm9uLWludGVybGFjZWQpCisgICBmaWVsZC4gKi8KKyNkZWZpbmUgVklERU9fVlNZTkNfRklFTERfVU5LTk9XTiAgCSgwKQorI2RlZmluZSBWSURFT19WU1lOQ19GSUVMRF9PREQgCQkoMSkKKyNkZWZpbmUgVklERU9fVlNZTkNfRklFTERfRVZFTgkJKDIpCisjZGVmaW5lIFZJREVPX1ZTWU5DX0ZJRUxEX1BST0dSRVNTSVZFCSgzKQorCitzdHJ1Y3QgdmlkZW9fZXZlbnQgeworCV9fczMyIHR5cGU7CisjZGVmaW5lIFZJREVPX0VWRU5UX1NJWkVfQ0hBTkdFRAkxCisjZGVmaW5lIFZJREVPX0VWRU5UX0ZSQU1FX1JBVEVfQ0hBTkdFRAkyCisjZGVmaW5lIFZJREVPX0VWRU5UX0RFQ09ERVJfU1RPUFBFRCAJMworI2RlZmluZSBWSURFT19FVkVOVF9WU1lOQyAJCTQKKwlfX2tlcm5lbF90aW1lX3QgdGltZXN0YW1wOworCXVuaW9uIHsKKwkJdmlkZW9fc2l6ZV90IHNpemU7CisJCXVuc2lnbmVkIGludCBmcmFtZV9yYXRlOwkvKiBpbiBmcmFtZXMgcGVyIDEwMDBzZWMgKi8KKwkJdW5zaWduZWQgY2hhciB2c3luY19maWVsZDsJLyogdW5rbm93bi9vZGQvZXZlbi9wcm9ncmVzc2l2ZSAqLworCX0gdTsKK307CisKKworc3RydWN0IHZpZGVvX3N0YXR1cyB7CisJaW50ICAgICAgICAgICAgICAgICAgIHZpZGVvX2JsYW5rOyAgIC8qIGJsYW5rIHZpZGVvIG9uIGZyZWV6ZT8gKi8KKwl2aWRlb19wbGF5X3N0YXRlX3QgICAgcGxheV9zdGF0ZTsgICAgLyogY3VycmVudCBzdGF0ZSBvZiBwbGF5YmFjayAqLworCXZpZGVvX3N0cmVhbV9zb3VyY2VfdCBzdHJlYW1fc291cmNlOyAvKiBjdXJyZW50IHNvdXJjZSAoZGVtdXgvbWVtb3J5KSAqLworCXZpZGVvX2Zvcm1hdF90ICAgICAgICB2aWRlb19mb3JtYXQ7ICAvKiBjdXJyZW50IGFzcGVjdCByYXRpbyBvZiBzdHJlYW0qLworCXZpZGVvX2Rpc3BsYXlmb3JtYXRfdCBkaXNwbGF5X2Zvcm1hdDsvKiBzZWxlY3RlZCBjcm9wcGluZyBtb2RlICovCit9OworCisKK3N0cnVjdCB2aWRlb19zdGlsbF9waWN0dXJlIHsKKwljaGFyICppRnJhbWU7ICAgICAgICAvKiBwb2ludGVyIHRvIGEgc2luZ2xlIGlmcmFtZSBpbiBtZW1vcnkgKi8KKwlfX3MzMiBzaXplOworfTsKKworCit0eXBlZGVmCitzdHJ1Y3QgdmlkZW9faGlnaGxpZ2h0IHsKKwlpbnQgICAgIGFjdGl2ZTsgICAgICAvKiAgICAxPXNob3cgaGlnaGxpZ2h0LCAwPWhpZGUgaGlnaGxpZ2h0ICovCisJX191OCAgICBjb250cmFzdDE7ICAgLyogICAgNy0gNCAgUGF0dGVybiBwaXhlbCBjb250cmFzdCAqLworCQkJICAgICAvKiAgICAzLSAwICBCYWNrZ3JvdW5kIHBpeGVsIGNvbnRyYXN0ICovCisJX191OCAgICBjb250cmFzdDI7ICAgLyogICAgNy0gNCAgRW1waGFzaXMgcGl4ZWwtMiBjb250cmFzdCAqLworCQkJICAgICAvKiAgICAzLSAwICBFbXBoYXNpcyBwaXhlbC0xIGNvbnRyYXN0ICovCisJX191OCAgICBjb2xvcjE7ICAgICAgLyogICAgNy0gNCAgUGF0dGVybiBwaXhlbCBjb2xvciAqLworCQkJICAgICAvKiAgICAzLSAwICBCYWNrZ3JvdW5kIHBpeGVsIGNvbG9yICovCisJX191OCAgICBjb2xvcjI7ICAgICAgLyogICAgNy0gNCAgRW1waGFzaXMgcGl4ZWwtMiBjb2xvciAqLworCQkJICAgICAvKiAgICAzLSAwICBFbXBoYXNpcyBwaXhlbC0xIGNvbG9yICovCisJX191MzIgICAgeXBvczsgICAgICAgLyogICAyMy0yMiAgYXV0byBhY3Rpb24gbW9kZSAqLworCQkJICAgICAvKiAgIDIxLTEyICBzdGFydCB5ICovCisJCQkgICAgIC8qICAgIDktIDAgIGVuZCB5ICovCisJX191MzIgICAgeHBvczsgICAgICAgLyogICAyMy0yMiAgYnV0dG9uIGNvbG9yIG51bWJlciAqLworCQkJICAgICAvKiAgIDIxLTEyICBzdGFydCB4ICovCisJCQkgICAgIC8qICAgIDktIDAgIGVuZCB4ICovCit9IHZpZGVvX2hpZ2hsaWdodF90OworCisKK3R5cGVkZWYgc3RydWN0IHZpZGVvX3NwdSB7CisJaW50IGFjdGl2ZTsKKwlpbnQgc3RyZWFtX2lkOworfSB2aWRlb19zcHVfdDsKKworCit0eXBlZGVmIHN0cnVjdCB2aWRlb19zcHVfcGFsZXR0ZSB7ICAgICAgLyogU1BVIFBhbGV0dGUgaW5mb3JtYXRpb24gKi8KKwlpbnQgbGVuZ3RoOworCV9fdTggKnBhbGV0dGU7Cit9IHZpZGVvX3NwdV9wYWxldHRlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgdmlkZW9fbmF2aV9wYWNrIHsKKwlpbnQgbGVuZ3RoOyAgICAgICAgICAvKiAwIC4uLiAxMDI0ICovCisJX191OCBkYXRhWzEwMjRdOworfSB2aWRlb19uYXZpX3BhY2tfdDsKKworCit0eXBlZGVmIF9fdTE2IHZpZGVvX2F0dHJpYnV0ZXNfdDsKKy8qICAgYml0czogZGVzY3IuICovCisvKiAgIDE1LTE0IFZpZGVvIGNvbXByZXNzaW9uIG1vZGUgKDA9TVBFRy0xLCAxPU1QRUctMikgKi8KKy8qICAgMTMtMTIgVFYgc3lzdGVtICgwPTUyNS82MCwgMT02MjUvNTApICovCisvKiAgIDExLTEwIEFzcGVjdCByYXRpbyAoMD00OjMsIDM9MTY6OSkgKi8KKy8qICAgIDktIDggcGVybWl0dGVkIGRpc3BsYXkgbW9kZSBvbiA0OjMgbW9uaXRvciAoMD1ib3RoLCAxPW9ubHkgcGFuLXNjYSAqLworLyogICAgNyAgICBsaW5lIDIxLTEgZGF0YSBwcmVzZW50IGluIEdPUCAoMT15ZXMsIDA9bm8pICovCisvKiAgICA2ICAgIGxpbmUgMjEtMiBkYXRhIHByZXNlbnQgaW4gR09QICgxPXllcywgMD1ubykgKi8KKy8qICAgIDUtIDMgc291cmNlIHJlc29sdXRpb24gKDA9NzIweDQ4MC81NzYsIDE9NzA0eDQ4MC81NzYsIDI9MzUyeDQ4MC81NyAqLworLyogICAgMiAgICBzb3VyY2UgbGV0dGVyYm94ZWQgKDE9eWVzLCAwPW5vKSAqLworLyogICAgMCAgICBmaWxtL2NhbWVyYSBtb2RlICgwPWNhbWVyYSwgMT1maWxtICg2MjUvNTAgb25seSkpICovCisKKworLyogYml0IGRlZmluaXRpb25zIGZvciBjYXBhYmlsaXRpZXM6ICovCisvKiBjYW4gdGhlIGhhcmR3YXJlIGRlY29kZSBNUEVHMSBhbmQvb3IgTVBFRzI/ICovCisjZGVmaW5lIFZJREVPX0NBUF9NUEVHMSAgIDEKKyNkZWZpbmUgVklERU9fQ0FQX01QRUcyICAgMgorLyogY2FuIHlvdSBzZW5kIGEgc3lzdGVtIGFuZC9vciBwcm9ncmFtIHN0cmVhbSB0byB2aWRlbyBkZXZpY2U/CisgICAoeW91IHN0aWxsIGhhdmUgdG8gb3BlbiB0aGUgdmlkZW8gYW5kIHRoZSBhdWRpbyBkZXZpY2UgYnV0IG9ubHkKKyAgICBzZW5kIHRoZSBzdHJlYW0gdG8gdGhlIHZpZGVvIGRldmljZSkgKi8KKyNkZWZpbmUgVklERU9fQ0FQX1NZUyAgICAgNAorI2RlZmluZSBWSURFT19DQVBfUFJPRyAgICA4CisvKiBjYW4gdGhlIGRyaXZlciBhbHNvIGhhbmRsZSBTUFUsIE5BVkkgYW5kIENTUyBlbmNvZGVkIGRhdGE/CisgICAoQ1NTIEFQSSBpcyBub3QgcHJlc2VudCB5ZXQpICovCisjZGVmaW5lIFZJREVPX0NBUF9TUFUgICAgMTYKKyNkZWZpbmUgVklERU9fQ0FQX05BVkkgICAzMgorI2RlZmluZSBWSURFT19DQVBfQ1NTICAgIDY0CisKKworI2RlZmluZSBWSURFT19TVE9QICAgICAgICAgICAgICAgICBfSU8oJ28nLCAyMSkKKyNkZWZpbmUgVklERU9fUExBWSAgICAgICAgICAgICAgICAgX0lPKCdvJywgMjIpCisjZGVmaW5lIFZJREVPX0ZSRUVaRSAgICAgICAgICAgICAgIF9JTygnbycsIDIzKQorI2RlZmluZSBWSURFT19DT05USU5VRSAgICAgICAgICAgICBfSU8oJ28nLCAyNCkKKyNkZWZpbmUgVklERU9fU0VMRUNUX1NPVVJDRSAgICAgICAgX0lPKCdvJywgMjUpCisjZGVmaW5lIFZJREVPX1NFVF9CTEFOSyAgICAgICAgICAgIF9JTygnbycsIDI2KQorI2RlZmluZSBWSURFT19HRVRfU1RBVFVTICAgICAgICAgICBfSU9SKCdvJywgMjcsIHN0cnVjdCB2aWRlb19zdGF0dXMpCisjZGVmaW5lIFZJREVPX0dFVF9FVkVOVCAgICAgICAgICAgIF9JT1IoJ28nLCAyOCwgc3RydWN0IHZpZGVvX2V2ZW50KQorI2RlZmluZSBWSURFT19TRVRfRElTUExBWV9GT1JNQVQgICBfSU8oJ28nLCAyOSkKKyNkZWZpbmUgVklERU9fU1RJTExQSUNUVVJFICAgICAgICAgX0lPVygnbycsIDMwLCBzdHJ1Y3QgdmlkZW9fc3RpbGxfcGljdHVyZSkKKyNkZWZpbmUgVklERU9fRkFTVF9GT1JXQVJEICAgICAgICAgX0lPKCdvJywgMzEpCisjZGVmaW5lIFZJREVPX1NMT1dNT1RJT04gICAgICAgICAgIF9JTygnbycsIDMyKQorI2RlZmluZSBWSURFT19HRVRfQ0FQQUJJTElUSUVTICAgICBfSU9SKCdvJywgMzMsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgVklERU9fQ0xFQVJfQlVGRkVSICAgICAgICAgX0lPKCdvJywgIDM0KQorI2RlZmluZSBWSURFT19TRVRfSUQgICAgICAgICAgICAgICBfSU8oJ28nLCAzNSkKKyNkZWZpbmUgVklERU9fU0VUX1NUUkVBTVRZUEUgICAgICAgX0lPKCdvJywgMzYpCisjZGVmaW5lIFZJREVPX1NFVF9GT1JNQVQgICAgICAgICAgIF9JTygnbycsIDM3KQorI2RlZmluZSBWSURFT19TRVRfU1lTVEVNICAgICAgICAgICBfSU8oJ28nLCAzOCkKKyNkZWZpbmUgVklERU9fU0VUX0hJR0hMSUdIVCAgICAgICAgX0lPVygnbycsIDM5LCB2aWRlb19oaWdobGlnaHRfdCkKKyNkZWZpbmUgVklERU9fU0VUX1NQVSAgICAgICAgICAgICAgX0lPVygnbycsIDUwLCB2aWRlb19zcHVfdCkKKyNkZWZpbmUgVklERU9fU0VUX1NQVV9QQUxFVFRFICAgICAgX0lPVygnbycsIDUxLCB2aWRlb19zcHVfcGFsZXR0ZV90KQorI2RlZmluZSBWSURFT19HRVRfTkFWSSAgICAgICAgICAgICBfSU9SKCdvJywgNTIsIHZpZGVvX25hdmlfcGFja190KQorI2RlZmluZSBWSURFT19TRVRfQVRUUklCVVRFUyAgICAgICBfSU8oJ28nLCA1MykKKyNkZWZpbmUgVklERU9fR0VUX1NJWkUgICAgICAgICAgICAgX0lPUignbycsIDU1LCB2aWRlb19zaXplX3QpCisjZGVmaW5lIFZJREVPX0dFVF9GUkFNRV9SQVRFICAgICAgIF9JT1IoJ28nLCA1NiwgdW5zaWduZWQgaW50KQorCisvKioKKyAqIFZJREVPX0dFVF9QVFMKKyAqCisgKiBSZWFkIHRoZSAzMyBiaXQgcHJlc2VudGF0aW9uIHRpbWUgc3RhbXAgYXMgZGVmaW5lZAorICogaW4gSVRVIFQtUkVDLUguMjIyLjAgLyBJU08vSUVDIDEzODE4LTEuCisgKgorICogVGhlIFBUUyBzaG91bGQgYmVsb25nIHRvIHRoZSBjdXJyZW50bHkgcGxheWVkCisgKiBmcmFtZSBpZiBwb3NzaWJsZSwgYnV0IG1heSBhbHNvIGJlIGEgdmFsdWUgY2xvc2UgdG8gaXQKKyAqIGxpa2UgdGhlIFBUUyBvZiB0aGUgbGFzdCBkZWNvZGVkIGZyYW1lIG9yIHRoZSBsYXN0IFBUUworICogZXh0cmFjdGVkIGJ5IHRoZSBQRVMgcGFyc2VyLgorICovCisjZGVmaW5lIFZJREVPX0dFVF9QVFMgICAgICAgICAgICAgIF9JT1IoJ28nLCA1NywgX191NjQpCisKKy8qIFJlYWQgdGhlIG51bWJlciBvZiBkaXNwbGF5ZWQgZnJhbWVzIHNpbmNlIHRoZSBkZWNvZGVyIHdhcyBzdGFydGVkICovCisjZGVmaW5lIFZJREVPX0dFVF9GUkFNRV9DT1VOVCAgCSAgIF9JT1IoJ28nLCA1OCwgX191NjQpCisKKyNkZWZpbmUgVklERU9fQ09NTUFORCAgICAgCSAgIF9JT1dSKCdvJywgNTksIHN0cnVjdCB2aWRlb19jb21tYW5kKQorI2RlZmluZSBWSURFT19UUllfQ09NTUFORCAJICAgX0lPV1IoJ28nLCA2MCwgc3RydWN0IHZpZGVvX2NvbW1hbmQpCisKKyNlbmRpZiAvKl9EVkJWSURFT19IXyovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VkZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lZGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWMyYjEyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lZGQuaApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIGxpbnV4L2luY2x1ZGUvbGludXgvZWRkLmgKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQgRGVsbCBJbmMuCisgKiAgYnkgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPgorICoKKyAqIHN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zIGZvciB0aGUgaW50IDEzaCwgYXg9ezQxLDQ4fWgKKyAqIEJJT1MgRW5oYW5jZWQgRGlzayBEcml2ZSBTZXJ2aWNlcworICogVGhpcyBpcyBiYXNlZCBvbiB0aGUgVDEzIGdyb3VwIGRvY3VtZW50IEQxNTcyIFJldmlzaW9uIDAgKEF1Z3VzdCAxNCAyMDAyKQorICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cudDEzLm9yZy9kb2NzMjAwMi9kMTU3MnIwLnBkZi4gIEl0IGlzCisgKiB2ZXJ5IHNpbWlsYXIgdG8gRDE0ODQgUmV2aXNpb24gMyBodHRwOi8vd3d3LnQxMy5vcmcvZG9jczIwMDIvZDE0ODRyMy5wZGYKKyAqCisgKiBJbiBhIG51dHNoZWxsLCBhcmNoL3tpMzg2LHg4Nl82NH0vYm9vdC9zZXR1cC5TIHBvcHVsYXRlcyBhIHNjcmF0Y2gKKyAqIHRhYmxlIGluIHRoZSBib290X3BhcmFtcyB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBCSU9TLWVudW1lcmF0ZWQKKyAqIGJvb3QgZGV2aWNlcy4KKyAqIEluIGFyY2gve2kzODYseDg2XzY0fS9rZXJuZWwvc2V0dXAuYywgdGhpcyBpbmZvcm1hdGlvbiBpcworICogdHJhbnNmZXJyZWQgaW50byB0aGUgZWRkIHN0cnVjdHVyZSwgYW5kIGluIGRyaXZlcnMvZmlybXdhcmUvZWRkLmMsIHRoYXQKKyAqIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gaWRlbnRpZnkgQklPUyBib290IGRpc2suICBUaGUgY29kZSBpbiBzZXR1cC5TCisgKiBpcyB2ZXJ5IHNlbnNpdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGVzZSBzdHJ1Y3R1cmVzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjAgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNpZm5kZWYgX0xJTlVYX0VERF9ICisjZGVmaW5lIF9MSU5VWF9FRERfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBFREROUiAweDFlOQkJLyogYWRkciBvZiBudW1iZXIgb2YgZWRkX2luZm8gc3RydWN0cyBhdCBFRERCVUYKKwkJCQkgICBpbiBib290X3BhcmFtcyAtIHRyZWF0IHRoaXMgYXMgMSBieXRlICAqLworI2RlZmluZSBFRERCVUYJMHhkMDAJCS8qIGFkZHIgb2YgZWRkX2luZm8gc3RydWN0cyBpbiBib290X3BhcmFtcyAqLworI2RlZmluZSBFRERNQVhOUiA2CQkvKiBudW1iZXIgb2YgZWRkX2luZm8gc3RydWN0cyBzdGFydGluZyBhdCBFRERCVUYgICovCisjZGVmaW5lIEVEREVYVFNJWkUgOAkJLyogY2hhbmdlIHRoZXNlIGlmIHlvdSBtdWNrIHdpdGggdGhlIHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUgRUREUEFSTVNJWkUgNzQKKyNkZWZpbmUgQ0hFQ0tFWFRFTlNJT05TUFJFU0VOVCAweDQxCisjZGVmaW5lIEdFVERFVklDRVBBUkFNRVRFUlMgMHg0OAorI2RlZmluZSBMRUdBQ1lHRVRERVZJQ0VQQVJBTUVURVJTIDB4MDgKKyNkZWZpbmUgRURETUFHSUMxIDB4NTVBQQorI2RlZmluZSBFRERNQUdJQzIgMHhBQTU1CisKKworI2RlZmluZSBSRUFEX1NFQ1RPUlMgMHgwMiAgICAgICAgIC8qIGludDEzIEFIPTB4MDIgaXMgUkVBRF9TRUNUT1JTIGNvbW1hbmQgKi8KKyNkZWZpbmUgRUREX01CUl9TSUdfT0ZGU0VUIDB4MUI4ICAvKiBvZmZzZXQgb2Ygc2lnbmF0dXJlIGluIHRoZSBNQlIgKi8KKyNkZWZpbmUgRUREX01CUl9TSUdfQlVGICAgIDB4MjkwICAvKiBhZGRyIGluIGJvb3QgcGFyYW1zICovCisjZGVmaW5lIEVERF9NQlJfU0lHX01BWCAxNiAgICAgICAgLyogbWF4IG51bWJlciBvZiBzaWduYXR1cmVzIHRvIHN0b3JlICovCisjZGVmaW5lIEVERF9NQlJfU0lHX05SX0JVRiAweDFlYSAgLyogYWRkciBvZiBudW1iZXIgb2YgTUJSIHNpZ250YXVyZXMgYXQgRUREX01CUl9TSUdfQlVGCisJCQkJICAgICBpbiBib290X3BhcmFtcyAtIHRyZWF0IHRoaXMgYXMgMSBieXRlICAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjZGVmaW5lIEVERF9FWFRfRklYRURfRElTS19BQ0NFU1MgICAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIEVERF9FWFRfREVWSUNFX0xPQ0tJTkdfQU5EX0VKRUNUSU5HICgxIDw8IDEpCisjZGVmaW5lIEVERF9FWFRfRU5IQU5DRURfRElTS19EUklWRV9TVVBQT1JUICgxIDw8IDIpCisjZGVmaW5lIEVERF9FWFRfNjRCSVRfRVhURU5TSU9OUyAgICAgICAgICAgICgxIDw8IDMpCisKKyNkZWZpbmUgRUREX0lORk9fRE1BX0JPVU5EQVJZX0VSUk9SX1RSQU5TUEFSRU5UICgxIDw8IDApCisjZGVmaW5lIEVERF9JTkZPX0dFT01FVFJZX1ZBTElEICAgICAgICAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIEVERF9JTkZPX1JFTU9WQUJMRSAgICAgICAgICAgICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIEVERF9JTkZPX1dSSVRFX1ZFUklGWSAgICAgICAgICAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIEVERF9JTkZPX01FRElBX0NIQU5HRV9OT1RJRklDQVRJT04gICAgICgxIDw8IDQpCisjZGVmaW5lIEVERF9JTkZPX0xPQ0tBQkxFICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDUpCisjZGVmaW5lIEVERF9JTkZPX05PX01FRElBX1BSRVNFTlQgICAgICAgICAgICAgICgxIDw8IDYpCisjZGVmaW5lIEVERF9JTkZPX1VTRV9JTlQxM19GTjUwICAgICAgICAgICAgICAgICgxIDw8IDcpCisKK3N0cnVjdCBlZGRfZGV2aWNlX3BhcmFtcyB7CisJX191MTYgbGVuZ3RoOworCV9fdTE2IGluZm9fZmxhZ3M7CisJX191MzIgbnVtX2RlZmF1bHRfY3lsaW5kZXJzOworCV9fdTMyIG51bV9kZWZhdWx0X2hlYWRzOworCV9fdTMyIHNlY3RvcnNfcGVyX3RyYWNrOworCV9fdTY0IG51bWJlcl9vZl9zZWN0b3JzOworCV9fdTE2IGJ5dGVzX3Blcl9zZWN0b3I7CisJX191MzIgZHB0ZV9wdHI7CQkvKiAweEZGRkZGRkZGIGZvciBvdXIgcHVycG9zZXMgKi8KKwlfX3UxNiBrZXk7CQkvKiA9IDB4QkVERCAqLworCV9fdTggZGV2aWNlX3BhdGhfaW5mb19sZW5ndGg7CS8qID0gNDQgKi8KKwlfX3U4IHJlc2VydmVkMjsKKwlfX3UxNiByZXNlcnZlZDM7CisJX191OCBob3N0X2J1c190eXBlWzRdOworCV9fdTggaW50ZXJmYWNlX3R5cGVbOF07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191MTYgYmFzZV9hZGRyZXNzOworCQkJX191MTYgcmVzZXJ2ZWQxOworCQkJX191MzIgcmVzZXJ2ZWQyOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBpc2E7CisJCXN0cnVjdCB7CisJCQlfX3U4IGJ1czsKKwkJCV9fdTggc2xvdDsKKwkJCV9fdTggZnVuY3Rpb247CisJCQlfX3U4IGNoYW5uZWw7CisJCQlfX3UzMiByZXNlcnZlZDsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgcGNpOworCQkvKiBwY2l4IGlzIHNhbWUgYXMgcGNpICovCisJCXN0cnVjdCB7CisJCQlfX3U2NCByZXNlcnZlZDsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgaWJuZDsKKwkJc3RydWN0IHsKKwkJCV9fdTY0IHJlc2VydmVkOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB4cHJzOworCQlzdHJ1Y3QgeworCQkJX191NjQgcmVzZXJ2ZWQ7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGh0cHQ7CisJCXN0cnVjdCB7CisJCQlfX3U2NCByZXNlcnZlZDsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdW5rbm93bjsKKwl9IGludGVyZmFjZV9wYXRoOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTggZGV2aWNlOworCQkJX191OCByZXNlcnZlZDE7CisJCQlfX3UxNiByZXNlcnZlZDI7CisJCQlfX3UzMiByZXNlcnZlZDM7CisJCQlfX3U2NCByZXNlcnZlZDQ7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGF0YTsKKwkJc3RydWN0IHsKKwkJCV9fdTggZGV2aWNlOworCQkJX191OCBsdW47CisJCQlfX3U4IHJlc2VydmVkMTsKKwkJCV9fdTggcmVzZXJ2ZWQyOworCQkJX191MzIgcmVzZXJ2ZWQzOworCQkJX191NjQgcmVzZXJ2ZWQ0OworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBhdGFwaTsKKwkJc3RydWN0IHsKKwkJCV9fdTE2IGlkOworCQkJX191NjQgbHVuOworCQkJX191MTYgcmVzZXJ2ZWQxOworCQkJX191MzIgcmVzZXJ2ZWQyOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBzY3NpOworCQlzdHJ1Y3QgeworCQkJX191NjQgc2VyaWFsX251bWJlcjsKKwkJCV9fdTY0IHJlc2VydmVkOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1c2I7CisJCXN0cnVjdCB7CisJCQlfX3U2NCBldWk7CisJCQlfX3U2NCByZXNlcnZlZDsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgaTEzOTQ7CisJCXN0cnVjdCB7CisJCQlfX3U2NCB3d2lkOworCQkJX191NjQgbHVuOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBmaWJyZTsKKwkJc3RydWN0IHsKKwkJCV9fdTY0IGlkZW50aXR5X3RhZzsKKwkJCV9fdTY0IHJlc2VydmVkOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBpMm87CisJCXN0cnVjdCB7CisJCQlfX3UzMiBhcnJheV9udW1iZXI7CisJCQlfX3UzMiByZXNlcnZlZDE7CisJCQlfX3U2NCByZXNlcnZlZDI7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHJhaWQ7CisJCXN0cnVjdCB7CisJCQlfX3U4IGRldmljZTsKKwkJCV9fdTggcmVzZXJ2ZWQxOworCQkJX191MTYgcmVzZXJ2ZWQyOworCQkJX191MzIgcmVzZXJ2ZWQzOworCQkJX191NjQgcmVzZXJ2ZWQ0OworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBzYXRhOworCQlzdHJ1Y3QgeworCQkJX191NjQgcmVzZXJ2ZWQxOworCQkJX191NjQgcmVzZXJ2ZWQyOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1bmtub3duOworCX0gZGV2aWNlX3BhdGg7CisJX191OCByZXNlcnZlZDQ7CisJX191OCBjaGVja3N1bTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgZWRkX2luZm8geworCV9fdTggZGV2aWNlOworCV9fdTggdmVyc2lvbjsKKwlfX3UxNiBpbnRlcmZhY2Vfc3VwcG9ydDsKKwlfX3UxNiBsZWdhY3lfbWF4X2N5bGluZGVyOworCV9fdTggbGVnYWN5X21heF9oZWFkOworCV9fdTggbGVnYWN5X3NlY3RvcnNfcGVyX3RyYWNrOworCXN0cnVjdCBlZGRfZGV2aWNlX3BhcmFtcyBwYXJhbXM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGVkZCB7CisJdW5zaWduZWQgaW50IG1icl9zaWduYXR1cmVbRUREX01CUl9TSUdfTUFYXTsKKwlzdHJ1Y3QgZWRkX2luZm8gZWRkX2luZm9bRURETUFYTlJdOworCXVuc2lnbmVkIGNoYXIgbWJyX3NpZ25hdHVyZV9ucjsKKwl1bnNpZ25lZCBjaGFyIGVkZF9pbmZvX25yOworfTsKKworI2VuZGlmCQkJCS8qIV9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYJCQkJLyogX0xJTlVYX0VERF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Vmc19mc19zYi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lZnNfZnNfc2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDFiZTkwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lZnNfZnNfc2IuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogZWZzX2ZzX3NiLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgQWwgU21pdGgKKyAqCisgKiBQb3J0aW9ucyBkZXJpdmVkIGZyb20gSVJJWCBoZWFkZXIgZmlsZXMgKGMpIDE5ODggU2lsaWNvbiBHcmFwaGljcworICovCisKKyNpZm5kZWYgX19FRlNfRlNfU0JfSF9fCisjZGVmaW5lIF9fRUZTX0ZTX1NCX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorCisvKiBFRlMgc3VwZXJibG9jayBtYWdpYyBudW1iZXJzICovCisjZGVmaW5lIEVGU19NQUdJQwkweDA3Mjk1OQorI2RlZmluZSBFRlNfTkVXTUFHSUMJMHgwNzI5NWEKKworI2RlZmluZSBJU19FRlNfTUFHSUMoeCkJKCh4ID09IEVGU19NQUdJQykgfHwgKHggPT0gRUZTX05FV01BR0lDKSkKKworI2RlZmluZSBFRlNfU1VQRVIJCTEKKyNkZWZpbmUgRUZTX1JPT1RJTk9ERQkJMgorCisvKiBlZnMgc3VwZXJibG9jayBvbiBkaXNrICovCitzdHJ1Y3QgZWZzX3N1cGVyIHsKKwlfX2JlMzIJCWZzX3NpemU7ICAgICAgICAvKiBzaXplIG9mIGZpbGVzeXN0ZW0sIGluIHNlY3RvcnMgKi8KKwlfX2JlMzIJCWZzX2ZpcnN0Y2c7ICAgICAvKiBiYiBvZmZzZXQgdG8gZmlyc3QgY2cgKi8KKwlfX2JlMzIJCWZzX2NnZnNpemU7ICAgICAvKiBzaXplIG9mIGN5bGluZGVyIGdyb3VwIGluIGJiJ3MgKi8KKwlfX2JlMTYJCWZzX2NnaXNpemU7ICAgICAvKiBiYidzIG9mIGlub2RlcyBwZXIgY3lsaW5kZXIgZ3JvdXAgKi8KKwlfX2JlMTYJCWZzX3NlY3RvcnM7ICAgICAvKiBzZWN0b3JzIHBlciB0cmFjayAqLworCV9fYmUxNgkJZnNfaGVhZHM7ICAgICAgIC8qIGhlYWRzIHBlciBjeWxpbmRlciAqLworCV9fYmUxNgkJZnNfbmNnOyAgICAgICAgIC8qICMgb2YgY3lsaW5kZXIgZ3JvdXBzIGluIGZpbGVzeXN0ZW0gKi8KKwlfX2JlMTYJCWZzX2RpcnR5OyAgICAgICAvKiBmcyBuZWVkcyB0byBiZSBmc2NrJ2QgKi8KKwlfX2JlMzIJCWZzX3RpbWU7ICAgICAgICAvKiBsYXN0IHN1cGVyLWJsb2NrIHVwZGF0ZSAqLworCV9fYmUzMgkJZnNfbWFnaWM7ICAgICAgIC8qIG1hZ2ljIG51bWJlciAqLworCWNoYXIJCWZzX2ZuYW1lWzZdOyAgICAvKiBmaWxlIHN5c3RlbSBuYW1lICovCisJY2hhcgkJZnNfZnBhY2tbNl07ICAgIC8qIGZpbGUgc3lzdGVtIHBhY2sgbmFtZSAqLworCV9fYmUzMgkJZnNfYm1zaXplOyAgICAgIC8qIHNpemUgb2YgYml0bWFwIGluIGJ5dGVzICovCisJX19iZTMyCQlmc190ZnJlZTsgICAgICAgLyogdG90YWwgZnJlZSBkYXRhIGJsb2NrcyAqLworCV9fYmUzMgkJZnNfdGlub2RlOyAgICAgIC8qIHRvdGFsIGZyZWUgaW5vZGVzICovCisJX19iZTMyCQlmc19ibWJsb2NrOyAgICAgLyogYml0bWFwIGxvY2F0aW9uLiAqLworCV9fYmUzMgkJZnNfcmVwbHNiOyAgICAgIC8qIExvY2F0aW9uIG9mIHJlcGxpY2F0ZWQgc3VwZXJibG9jay4gKi8KKwlfX2JlMzIJCWZzX2xhc3RpYWxsb2M7ICAvKiBsYXN0IGFsbG9jYXRlZCBpbm9kZSAqLworCWNoYXIJCWZzX3NwYXJlWzIwXTsgICAvKiBzcGFjZSBmb3IgZXhwYW5zaW9uIC0gTVVTVCBCRSBaRVJPICovCisJX19iZTMyCQlmc19jaGVja3N1bTsgICAgLyogY2hlY2tzdW0gb2Ygdm9sdW1lIHBvcnRpb24gb2YgZnMgKi8KK307CisKKy8qIGVmcyBzdXBlcmJsb2NrIGluZm9ybWF0aW9uIGluIG1lbW9yeSAqLworc3RydWN0IGVmc19zYl9pbmZvIHsKKwlfX3UzMglmc19tYWdpYzsJLyogc3VwZXJibG9jayBtYWdpYyBudW1iZXIgKi8KKwlfX3UzMglmc19zdGFydDsJLyogZmlyc3QgYmxvY2sgb2YgZmlsZXN5c3RlbSAqLworCV9fdTMyCWZpcnN0X2Jsb2NrOwkvKiBmaXJzdCBkYXRhIGJsb2NrIGluIGZpbGVzeXN0ZW0gKi8KKwlfX3UzMgl0b3RhbF9ibG9ja3M7CS8qIHRvdGFsIG51bWJlciBvZiBibG9ja3MgaW4gZmlsZXN5c3RlbSAqLworCV9fdTMyCWdyb3VwX3NpemU7CS8qICMgb2YgYmxvY2tzIGEgZ3JvdXAgY29uc2lzdHMgb2YgKi8gCisJX191MzIJZGF0YV9mcmVlOwkvKiAjIG9mIGZyZWUgZGF0YSBibG9ja3MgKi8KKwlfX3UzMglpbm9kZV9mcmVlOwkvKiAjIG9mIGZyZWUgaW5vZGVzICovCisJX191MTYJaW5vZGVfYmxvY2tzOwkvKiAjIG9mIGJsb2NrcyB1c2VkIGZvciBpbm9kZXMgaW4gZXZlcnkgZ3JwICovCisJX191MTYJdG90YWxfZ3JvdXBzOwkvKiAjIG9mIGdyb3VwcyAqLworfTsKKworI2VuZGlmIC8qIF9fRUZTX0ZTX1NCX0hfXyAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VsZi1lbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lbGYtZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGJlYTc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lbGYtZW0uaApAQCAtMCwwICsxLDU1IEBACisjaWZuZGVmIF9MSU5VWF9FTEZfRU1fSAorI2RlZmluZSBfTElOVVhfRUxGX0VNX0gKKworLyogVGhlc2UgY29uc3RhbnRzIGRlZmluZSB0aGUgdmFyaW91cyBFTEYgdGFyZ2V0IG1hY2hpbmVzICovCisjZGVmaW5lIEVNX05PTkUJCTAKKyNkZWZpbmUgRU1fTTMyCQkxCisjZGVmaW5lIEVNX1NQQVJDCTIKKyNkZWZpbmUgRU1fMzg2CQkzCisjZGVmaW5lIEVNXzY4SwkJNAorI2RlZmluZSBFTV84OEsJCTUKKyNkZWZpbmUgRU1fNDg2CQk2CS8qIFBlcmhhcHMgZGlzdXNlZCAqLworI2RlZmluZSBFTV84NjAJCTcKKyNkZWZpbmUgRU1fTUlQUwkJOAkvKiBNSVBTIFIzMDAwIChvZmZpY2lhbGx5LCBiaWctZW5kaWFuIG9ubHkpICovCisJCQkJLyogTmV4dCB0d28gYXJlIGhpc3RvcmljYWwgYW5kIGJpbmFyaWVzIGFuZAorCQkJCSAgIG1vZHVsZXMgb2YgdGhlc2UgdHlwZXMgd2lsbCBiZSByZWplY3RlZCBieQorCQkJCSAgIExpbnV4LiAgKi8KKyNkZWZpbmUgRU1fTUlQU19SUzNfTEUJMTAJLyogTUlQUyBSMzAwMCBsaXR0bGUtZW5kaWFuICovCisjZGVmaW5lIEVNX01JUFNfUlM0X0JFCTEwCS8qIE1JUFMgUjQwMDAgYmlnLWVuZGlhbiAqLworCisjZGVmaW5lIEVNX1BBUklTQwkxNQkvKiBIUFBBICovCisjZGVmaW5lIEVNX1NQQVJDMzJQTFVTCTE4CS8qIFN1bidzICJ2OHBsdXMiICovCisjZGVmaW5lIEVNX1BQQwkJMjAJLyogUG93ZXJQQyAqLworI2RlZmluZSBFTV9QUEM2NAkyMQkgLyogUG93ZXJQQzY0ICovCisjZGVmaW5lIEVNX1NQVQkJMjMJLyogQ2VsbCBCRSBTUFUgKi8KKyNkZWZpbmUgRU1fU0gJCTQyCS8qIFN1cGVySCAqLworI2RlZmluZSBFTV9TUEFSQ1Y5CTQzCS8qIFNQQVJDIHY5IDY0LWJpdCAqLworI2RlZmluZSBFTV9JQV82NAk1MAkvKiBIUC9JbnRlbCBJQS02NCAqLworI2RlZmluZSBFTV9YODZfNjQJNjIJLyogQU1EIHg4Ni02NCAqLworI2RlZmluZSBFTV9TMzkwCQkyMgkvKiBJQk0gUy8zOTAgKi8KKyNkZWZpbmUgRU1fQ1JJUwkJNzYJLyogQXhpcyBDb21tdW5pY2F0aW9ucyAzMi1iaXQgZW1iZWRkZWQgcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX1Y4NTAJCTg3CS8qIE5FQyB2ODUwICovCisjZGVmaW5lIEVNX00zMlIJCTg4CS8qIFJlbmVzYXMgTTMyUiAqLworI2RlZmluZSBFTV9IOF8zMDAJNDYJLyogUmVuZXNhcyBIOC8zMDAsMzAwSCxIOFMgKi8KKyNkZWZpbmUgRU1fTU4xMDMwMAk4OQkvKiBQYW5hc29uaWMvTUVJIE1OMTAzMDAsIEFNMzMgKi8KKyNkZWZpbmUgRU1fQkxBQ0tGSU4gICAgIDEwNiAgICAgLyogQURJIEJsYWNrZmluIFByb2Nlc3NvciAqLworI2RlZmluZSBFTV9GUlYJCTB4NTQ0MQkvKiBGdWppdHN1IEZSLVYgKi8KKyNkZWZpbmUgRU1fQVZSMzIJMHgxOGFkCS8qIEF0bWVsIEFWUjMyICovCisKKy8qCisgKiBUaGlzIGlzIGFuIGludGVyaW0gdmFsdWUgdGhhdCB3ZSB3aWxsIHVzZSB1bnRpbCB0aGUgY29tbWl0dGVlIGNvbWVzCisgKiB1cCB3aXRoIGEgZmluYWwgbnVtYmVyLgorICovCisjZGVmaW5lIEVNX0FMUEhBCTB4OTAyNgorCisvKiBCb2d1cyBvbGQgdjg1MCBtYWdpYyBudW1iZXIsIHVzZWQgYnkgb2xkIHRvb2xzLiAqLworI2RlZmluZSBFTV9DWUdOVVNfVjg1MAkweDkwODAKKy8qIEJvZ3VzIG9sZCBtMzJyIG1hZ2ljIG51bWJlciwgdXNlZCBieSBvbGQgdG9vbHMuICovCisjZGVmaW5lIEVNX0NZR05VU19NMzJSCTB4OTA0MQorLyogVGhpcyBpcyB0aGUgb2xkIGludGVyaW0gdmFsdWUgZm9yIFMvMzkwIGFyY2hpdGVjdHVyZSAqLworI2RlZmluZSBFTV9TMzkwX09MRAkweEEzOTAKKy8qIEFsc28gUGFuYXNvbmljL01FSSBNTjEwMzAwLCBBTTMzICovCisjZGVmaW5lIEVNX0NZR05VU19NTjEwMzAwIDB4YmVlZgorCisKKyNlbmRpZiAvKiBfTElOVVhfRUxGX0VNX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZWxmLWZkcGljLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VsZi1mZHBpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MmY2MzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VsZi1mZHBpYy5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qIGVsZi1mZHBpYy5oOiBGRFBJQyBFTEYgbG9hZCBtYXAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfRUxGX0ZEUElDX0gKKyNkZWZpbmUgX0xJTlVYX0VMRl9GRFBJQ19ICisKKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKworI2RlZmluZSBQVF9HTlVfU1RBQ0sgICAgKFBUX0xPT1MgKyAweDQ3NGU1NTEpCisKKy8qIHNlZ21lbnQgbWFwcGluZ3MgZm9yIEVMRiBGRFBJQyBsaWJyYXJpZXMvZXhlY3V0YWJsZXMvaW50ZXJwcmV0ZXJzICovCitzdHJ1Y3QgZWxmMzJfZmRwaWNfbG9hZHNlZyB7CisJRWxmMzJfQWRkcglhZGRyOwkJLyogY29yZSBhZGRyZXNzIHRvIHdoaWNoIG1hcHBlZCAqLworCUVsZjMyX0FkZHIJcF92YWRkcjsJLyogVk1BIHJlY29yZGVkIGluIGZpbGUgKi8KKwlFbGYzMl9Xb3JkCXBfbWVtc3o7CS8qIGFsbG9jYXRpb24gc2l6ZSByZWNvcmRlZCBpbiBmaWxlICovCit9OworCitzdHJ1Y3QgZWxmMzJfZmRwaWNfbG9hZG1hcCB7CisJRWxmMzJfSGFsZgl2ZXJzaW9uOwkvKiB2ZXJzaW9uIG9mIHRoZXNlIHN0cnVjdHVyZXMsIGp1c3QgaW4gY2FzZS4uLiAqLworCUVsZjMyX0hhbGYJbnNlZ3M7CQkvKiBudW1iZXIgb2Ygc2VnbWVudHMgKi8KKwlzdHJ1Y3QgZWxmMzJfZmRwaWNfbG9hZHNlZyBzZWdzW107Cit9OworCisjZGVmaW5lIEVMRjMyX0ZEUElDX0xPQURNQVBfVkVSU0lPTgkweDAwMDAKKworLyoKKyAqIGJpbmZtdCBiaW5hcnkgcGFyYW1ldGVycyBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGVsZl9mZHBpY19wYXJhbXMgeworCXN0cnVjdCBlbGZoZHIJCQloZHI7CQkvKiByZWYgY29weSBvZiBFTEYgaGVhZGVyICovCisJc3RydWN0IGVsZl9waGRyCQkJKnBoZHJzOwkJLyogcmVmIGNvcHkgb2YgUFRfUEhEUiB0YWJsZSAqLworCXN0cnVjdCBlbGYzMl9mZHBpY19sb2FkbWFwCSpsb2FkbWFwOwkvKiBsb2FkbWFwIHRvIGJlIHBhc3NlZCB0byB1c2Vyc3BhY2UgKi8KKwl1bnNpZ25lZCBsb25nCQkJZWxmaGRyX2FkZHI7CS8qIG1hcHBlZCBFTEYgaGVhZGVyIHVzZXIgYWRkcmVzcyAqLworCXVuc2lnbmVkIGxvbmcJCQlwaF9hZGRyOwkvKiBtYXBwZWQgUFRfUEhEUiB1c2VyIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nCQkJbWFwX2FkZHI7CS8qIG1hcHBlZCBsb2FkbWFwIHVzZXIgYWRkcmVzcyAqLworCXVuc2lnbmVkIGxvbmcJCQllbnRyeV9hZGRyOwkvKiBtYXBwZWQgZW50cnkgdXNlciBhZGRyZXNzICovCisJdW5zaWduZWQgbG9uZwkJCXN0YWNrX3NpemU7CS8qIHN0YWNrIHNpemUgcmVxdWVzdGVkIChQVF9HTlVfU1RBQ0spICovCisJdW5zaWduZWQgbG9uZwkJCWR5bmFtaWNfYWRkcjsJLyogbWFwcGVkIFBUX0RZTkFNSUMgdXNlciBhZGRyZXNzICovCisJdW5zaWduZWQgbG9uZwkJCWxvYWRfYWRkcjsJLyogdXNlciBhZGRyZXNzIGF0IHdoaWNoIHRvIG1hcCBiaW5hcnkgKi8KKwl1bnNpZ25lZCBsb25nCQkJZmxhZ3M7CisjZGVmaW5lIEVMRl9GRFBJQ19GTEFHX0FSUkFOR0VNRU5UCTB4MDAwMDAwMGYJLyogUFRfTE9BRCBhcnJhbmdlbWVudCBmbGFncyAqLworI2RlZmluZSBFTEZfRkRQSUNfRkxBR19JTkRFUEVOREVOVAkweDAwMDAwMDAwCS8qIFBUX0xPQURzIGNhbiBiZSBwdXQgYW55d2hlcmUgKi8KKyNkZWZpbmUgRUxGX0ZEUElDX0ZMQUdfSE9OT1VSVkFERFIJMHgwMDAwMDAwMQkvKiBQVF9MT0FELnZhZGRyIG11c3QgYmUgaG9ub3VyZWQgKi8KKyNkZWZpbmUgRUxGX0ZEUElDX0ZMQUdfQ09OU1RESVNQCTB4MDAwMDAwMDIJLyogUFRfTE9BRHMgcmVxdWlyZSBjb25zdGFudAorCQkJCQkJCSAqIGRpc3BsYWNlbWVudCAqLworI2RlZmluZSBFTEZfRkRQSUNfRkxBR19DT05USUdVT1VTCTB4MDAwMDAwMDMJLyogUFRfTE9BRHMgc2hvdWxkIGJlIGNvbnRpZ3VvdXMgKi8KKyNkZWZpbmUgRUxGX0ZEUElDX0ZMQUdfRVhFQ19TVEFDSwkweDAwMDAwMDEwCS8qIFQgaWYgc3RhY2sgdG8gYmUgZXhlY3V0YWJsZSAqLworI2RlZmluZSBFTEZfRkRQSUNfRkxBR19OT0VYRUNfU1RBQ0sJMHgwMDAwMDAyMAkvKiBUIGlmIHN0YWNrIG5vdCB0byBiZSBleGVjdXRhYmxlICovCisjZGVmaW5lIEVMRl9GRFBJQ19GTEFHX0VYRUNVVEFCTEUJMHgwMDAwMDA0MAkvKiBUIGlmIHRoaXMgb2JqZWN0IGlzIHRoZSBleGVjdXRhYmxlICovCisjZGVmaW5lIEVMRl9GRFBJQ19GTEFHX1BSRVNFTlQJCTB4ODAwMDAwMDAJLyogVCBpZiB0aGlzIG9iamVjdCBpcyBwcmVzZW50ICovCit9OworCisKKyNlbmRpZiAvKiBfTElOVVhfRUxGX0ZEUElDX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZWxmLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VsZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3N2Q1NjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VsZi5oCkBAIC0wLDAgKzEsNDEzIEBACisjaWZuZGVmIF9MSU5VWF9FTEZfSAorI2RlZmluZSBfTElOVVhfRUxGX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLWVtLmg+CisKK3N0cnVjdCBmaWxlOworCisjaWZuZGVmIGVsZl9yZWFkX2ltcGxpZXNfZXhlYworICAvKiBFeGVjdXRhYmxlcyBmb3Igd2hpY2ggZWxmX3JlYWRfaW1wbGllc19leGVjKCkgcmV0dXJucyBUUlVFIHdpbGwKKyAgICAgaGF2ZSB0aGUgUkVBRF9JTVBMSUVTX0VYRUMgcGVyc29uYWxpdHkgZmxhZyBzZXQgYXV0b21hdGljYWxseS4KKyAgICAgT3ZlcnJpZGUgaW4gYXNtL2VsZi5oIGFzIG5lZWRlZC4gICovCisjIGRlZmluZSBlbGZfcmVhZF9pbXBsaWVzX2V4ZWMoZXgsIGhhdmVfcHRfZ251X3N0YWNrKQkwCisjZW5kaWYKKworLyogMzItYml0IEVMRiBiYXNlIHR5cGVzLiAqLwordHlwZWRlZiBfX3UzMglFbGYzMl9BZGRyOwordHlwZWRlZiBfX3UxNglFbGYzMl9IYWxmOwordHlwZWRlZiBfX3UzMglFbGYzMl9PZmY7Cit0eXBlZGVmIF9fczMyCUVsZjMyX1N3b3JkOwordHlwZWRlZiBfX3UzMglFbGYzMl9Xb3JkOworCisvKiA2NC1iaXQgRUxGIGJhc2UgdHlwZXMuICovCit0eXBlZGVmIF9fdTY0CUVsZjY0X0FkZHI7Cit0eXBlZGVmIF9fdTE2CUVsZjY0X0hhbGY7Cit0eXBlZGVmIF9fczE2CUVsZjY0X1NIYWxmOwordHlwZWRlZiBfX3U2NAlFbGY2NF9PZmY7Cit0eXBlZGVmIF9fczMyCUVsZjY0X1N3b3JkOwordHlwZWRlZiBfX3UzMglFbGY2NF9Xb3JkOwordHlwZWRlZiBfX3U2NAlFbGY2NF9Yd29yZDsKK3R5cGVkZWYgX19zNjQJRWxmNjRfU3h3b3JkOworCisvKiBUaGVzZSBjb25zdGFudHMgYXJlIGZvciB0aGUgc2VnbWVudCB0eXBlcyBzdG9yZWQgaW4gdGhlIGltYWdlIGhlYWRlcnMgKi8KKyNkZWZpbmUgUFRfTlVMTCAgICAwCisjZGVmaW5lIFBUX0xPQUQgICAgMQorI2RlZmluZSBQVF9EWU5BTUlDIDIKKyNkZWZpbmUgUFRfSU5URVJQICAzCisjZGVmaW5lIFBUX05PVEUgICAgNAorI2RlZmluZSBQVF9TSExJQiAgIDUKKyNkZWZpbmUgUFRfUEhEUiAgICA2CisjZGVmaW5lIFBUX1RMUyAgICAgNyAgICAgICAgICAgICAgIC8qIFRocmVhZCBsb2NhbCBzdG9yYWdlIHNlZ21lbnQgKi8KKyNkZWZpbmUgUFRfTE9PUyAgICAweDYwMDAwMDAwICAgICAgLyogT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgUFRfSElPUyAgICAweDZmZmZmZmZmICAgICAgLyogT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgUFRfTE9QUk9DICAweDcwMDAwMDAwCisjZGVmaW5lIFBUX0hJUFJPQyAgMHg3ZmZmZmZmZgorI2RlZmluZSBQVF9HTlVfRUhfRlJBTUUJCTB4NjQ3NGU1NTAKKworI2RlZmluZSBQVF9HTlVfU1RBQ0sJKFBUX0xPT1MgKyAweDQ3NGU1NTEpCisKKy8qCisgKiBFeHRlbmRlZCBOdW1iZXJpbmcKKyAqCisgKiBJZiB0aGUgcmVhbCBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cmllcyBpcyBsYXJnZXIgdGhhbgorICogb3IgZXF1YWwgdG8gUE5fWE5VTSgweGZmZmYpLCBpdCBpcyBzZXQgdG8gc2hfaW5mbyBmaWVsZCBvZiB0aGUKKyAqIHNlY3Rpb24gaGVhZGVyIGF0IGluZGV4IDAsIGFuZCBQTl9YTlVNIGlzIHNldCB0byBlX3BobnVtCisgKiBmaWVsZC4gT3RoZXJ3aXNlLCB0aGUgc2VjdGlvbiBoZWFkZXIgYXQgaW5kZXggMCBpcyB6ZXJvCisgKiBpbml0aWFsaXplZCwgaWYgaXQgZXhpc3RzLgorICoKKyAqIFNwZWNpZmljYXRpb25zIGFyZSBhdmFpbGFibGUgaW46CisgKgorICogLSBTdW4gbWljcm9zeXN0ZW1zOiBMaW5rZXIgYW5kIExpYnJhcmllcy4KKyAqICAgUGFydCBObzogODE3LTE5ODQtMTcsIFNlcHRlbWJlciAyMDA4LgorICogICBVUkw6IGh0dHA6Ly9kb2NzLnN1bi5jb20vYXBwL2RvY3MvZG9jLzgxNy0xOTg0CisgKgorICogLSBTeXN0ZW0gViBBQkkgQU1ENjQgQXJjaGl0ZWN0dXJlIFByb2Nlc3NvciBTdXBwbGVtZW50CisgKiAgIERyYWZ0IFZlcnNpb24gMC45OS4sCisgKiAgIE1heSAxMSwgMjAwOS4KKyAqICAgVVJMOiBodHRwOi8vd3d3Lng4Ni02NC5vcmcvCisgKi8KKyNkZWZpbmUgUE5fWE5VTSAweGZmZmYKKworLyogVGhlc2UgY29uc3RhbnRzIGRlZmluZSB0aGUgZGlmZmVyZW50IGVsZiBmaWxlIHR5cGVzICovCisjZGVmaW5lIEVUX05PTkUgICAwCisjZGVmaW5lIEVUX1JFTCAgICAxCisjZGVmaW5lIEVUX0VYRUMgICAyCisjZGVmaW5lIEVUX0RZTiAgICAzCisjZGVmaW5lIEVUX0NPUkUgICA0CisjZGVmaW5lIEVUX0xPUFJPQyAweGZmMDAKKyNkZWZpbmUgRVRfSElQUk9DIDB4ZmZmZgorCisvKiBUaGlzIGlzIHRoZSBpbmZvIHRoYXQgaXMgbmVlZGVkIHRvIHBhcnNlIHRoZSBkeW5hbWljIHNlY3Rpb24gb2YgdGhlIGZpbGUgKi8KKyNkZWZpbmUgRFRfTlVMTAkJMAorI2RlZmluZSBEVF9ORUVERUQJMQorI2RlZmluZSBEVF9QTFRSRUxTWgkyCisjZGVmaW5lIERUX1BMVEdPVAkzCisjZGVmaW5lIERUX0hBU0gJCTQKKyNkZWZpbmUgRFRfU1RSVEFCCTUKKyNkZWZpbmUgRFRfU1lNVEFCCTYKKyNkZWZpbmUgRFRfUkVMQQkJNworI2RlZmluZSBEVF9SRUxBU1oJOAorI2RlZmluZSBEVF9SRUxBRU5UCTkKKyNkZWZpbmUgRFRfU1RSU1oJMTAKKyNkZWZpbmUgRFRfU1lNRU5UCTExCisjZGVmaW5lIERUX0lOSVQJCTEyCisjZGVmaW5lIERUX0ZJTkkJCTEzCisjZGVmaW5lIERUX1NPTkFNRQkxNAorI2RlZmluZSBEVF9SUEFUSCAJMTUKKyNkZWZpbmUgRFRfU1lNQk9MSUMJMTYKKyNkZWZpbmUgRFRfUkVMCSAgICAgICAgMTcKKyNkZWZpbmUgRFRfUkVMU1oJMTgKKyNkZWZpbmUgRFRfUkVMRU5UCTE5CisjZGVmaW5lIERUX1BMVFJFTAkyMAorI2RlZmluZSBEVF9ERUJVRwkyMQorI2RlZmluZSBEVF9URVhUUkVMCTIyCisjZGVmaW5lIERUX0pNUFJFTAkyMworI2RlZmluZSBEVF9FTkNPRElORwkzMgorI2RlZmluZSBPTERfRFRfTE9PUwkweDYwMDAwMDAwCisjZGVmaW5lIERUX0xPT1MJCTB4NjAwMDAwMGQKKyNkZWZpbmUgRFRfSElPUwkJMHg2ZmZmZjAwMAorI2RlZmluZSBEVF9WQUxSTkdMTwkweDZmZmZmZDAwCisjZGVmaW5lIERUX1ZBTFJOR0hJCTB4NmZmZmZkZmYKKyNkZWZpbmUgRFRfQUREUlJOR0xPCTB4NmZmZmZlMDAKKyNkZWZpbmUgRFRfQUREUlJOR0hJCTB4NmZmZmZlZmYKKyNkZWZpbmUgRFRfVkVSU1lNCTB4NmZmZmZmZjAKKyNkZWZpbmUgRFRfUkVMQUNPVU5UCTB4NmZmZmZmZjkKKyNkZWZpbmUgRFRfUkVMQ09VTlQJMHg2ZmZmZmZmYQorI2RlZmluZSBEVF9GTEFHU18xCTB4NmZmZmZmZmIKKyNkZWZpbmUgRFRfVkVSREVGCTB4NmZmZmZmZmMKKyNkZWZpbmUJRFRfVkVSREVGTlVNCTB4NmZmZmZmZmQKKyNkZWZpbmUgRFRfVkVSTkVFRAkweDZmZmZmZmZlCisjZGVmaW5lCURUX1ZFUk5FRUROVU0JMHg2ZmZmZmZmZgorI2RlZmluZSBPTERfRFRfSElPUyAgICAgMHg2ZmZmZmZmZgorI2RlZmluZSBEVF9MT1BST0MJMHg3MDAwMDAwMAorI2RlZmluZSBEVF9ISVBST0MJMHg3ZmZmZmZmZgorCisvKiBUaGlzIGluZm8gaXMgbmVlZGVkIHdoZW4gcGFyc2luZyB0aGUgc3ltYm9sIHRhYmxlICovCisjZGVmaW5lIFNUQl9MT0NBTCAgMAorI2RlZmluZSBTVEJfR0xPQkFMIDEKKyNkZWZpbmUgU1RCX1dFQUsgICAyCisKKyNkZWZpbmUgU1RUX05PVFlQRSAgMAorI2RlZmluZSBTVFRfT0JKRUNUICAxCisjZGVmaW5lIFNUVF9GVU5DICAgIDIKKyNkZWZpbmUgU1RUX1NFQ1RJT04gMworI2RlZmluZSBTVFRfRklMRSAgICA0CisjZGVmaW5lIFNUVF9DT01NT04gIDUKKyNkZWZpbmUgU1RUX1RMUyAgICAgNgorCisjZGVmaW5lIEVMRl9TVF9CSU5EKHgpCQkoKHgpID4+IDQpCisjZGVmaW5lIEVMRl9TVF9UWVBFKHgpCQkoKCh1bnNpZ25lZCBpbnQpIHgpICYgMHhmKQorI2RlZmluZSBFTEYzMl9TVF9CSU5EKHgpCUVMRl9TVF9CSU5EKHgpCisjZGVmaW5lIEVMRjMyX1NUX1RZUEUoeCkJRUxGX1NUX1RZUEUoeCkKKyNkZWZpbmUgRUxGNjRfU1RfQklORCh4KQlFTEZfU1RfQklORCh4KQorI2RlZmluZSBFTEY2NF9TVF9UWVBFKHgpCUVMRl9TVF9UWVBFKHgpCisKK3R5cGVkZWYgc3RydWN0IGR5bmFtaWN7CisgIEVsZjMyX1N3b3JkIGRfdGFnOworICB1bmlvbnsKKyAgICBFbGYzMl9Td29yZAlkX3ZhbDsKKyAgICBFbGYzMl9BZGRyCWRfcHRyOworICB9IGRfdW47Cit9IEVsZjMyX0R5bjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBFbGY2NF9TeHdvcmQgZF90YWc7CQkvKiBlbnRyeSB0YWcgdmFsdWUgKi8KKyAgdW5pb24geworICAgIEVsZjY0X1h3b3JkIGRfdmFsOworICAgIEVsZjY0X0FkZHIgZF9wdHI7CisgIH0gZF91bjsKK30gRWxmNjRfRHluOworCisvKiBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIHdpdGggcmVsb2NhdGlvbnMgKi8KKyNkZWZpbmUgRUxGMzJfUl9TWU0oeCkgKCh4KSA+PiA4KQorI2RlZmluZSBFTEYzMl9SX1RZUEUoeCkgKCh4KSAmIDB4ZmYpCisKKyNkZWZpbmUgRUxGNjRfUl9TWU0oaSkJCQkoKGkpID4+IDMyKQorI2RlZmluZSBFTEY2NF9SX1RZUEUoaSkJCQkoKGkpICYgMHhmZmZmZmZmZikKKwordHlwZWRlZiBzdHJ1Y3QgZWxmMzJfcmVsIHsKKyAgRWxmMzJfQWRkcglyX29mZnNldDsKKyAgRWxmMzJfV29yZAlyX2luZm87Cit9IEVsZjMyX1JlbDsKKwordHlwZWRlZiBzdHJ1Y3QgZWxmNjRfcmVsIHsKKyAgRWxmNjRfQWRkciByX29mZnNldDsJLyogTG9jYXRpb24gYXQgd2hpY2ggdG8gYXBwbHkgdGhlIGFjdGlvbiAqLworICBFbGY2NF9Yd29yZCByX2luZm87CS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KK30gRWxmNjRfUmVsOworCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9yZWxheworICBFbGYzMl9BZGRyCXJfb2Zmc2V0OworICBFbGYzMl9Xb3JkCXJfaW5mbzsKKyAgRWxmMzJfU3dvcmQJcl9hZGRlbmQ7Cit9IEVsZjMyX1JlbGE7CisKK3R5cGVkZWYgc3RydWN0IGVsZjY0X3JlbGEgeworICBFbGY2NF9BZGRyIHJfb2Zmc2V0OwkvKiBMb2NhdGlvbiBhdCB3aGljaCB0byBhcHBseSB0aGUgYWN0aW9uICovCisgIEVsZjY0X1h3b3JkIHJfaW5mbzsJLyogaW5kZXggYW5kIHR5cGUgb2YgcmVsb2NhdGlvbiAqLworICBFbGY2NF9TeHdvcmQgcl9hZGRlbmQ7CS8qIENvbnN0YW50IGFkZGVuZCB1c2VkIHRvIGNvbXB1dGUgdmFsdWUgKi8KK30gRWxmNjRfUmVsYTsKKwordHlwZWRlZiBzdHJ1Y3QgZWxmMzJfc3lteworICBFbGYzMl9Xb3JkCXN0X25hbWU7CisgIEVsZjMyX0FkZHIJc3RfdmFsdWU7CisgIEVsZjMyX1dvcmQJc3Rfc2l6ZTsKKyAgdW5zaWduZWQgY2hhcglzdF9pbmZvOworICB1bnNpZ25lZCBjaGFyCXN0X290aGVyOworICBFbGYzMl9IYWxmCXN0X3NobmR4OworfSBFbGYzMl9TeW07CisKK3R5cGVkZWYgc3RydWN0IGVsZjY0X3N5bSB7CisgIEVsZjY0X1dvcmQgc3RfbmFtZTsJCS8qIFN5bWJvbCBuYW1lLCBpbmRleCBpbiBzdHJpbmcgdGJsICovCisgIHVuc2lnbmVkIGNoYXIJc3RfaW5mbzsJLyogVHlwZSBhbmQgYmluZGluZyBhdHRyaWJ1dGVzICovCisgIHVuc2lnbmVkIGNoYXIJc3Rfb3RoZXI7CS8qIE5vIGRlZmluZWQgbWVhbmluZywgMCAqLworICBFbGY2NF9IYWxmIHN0X3NobmR4OwkJLyogQXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCisgIEVsZjY0X0FkZHIgc3RfdmFsdWU7CQkvKiBWYWx1ZSBvZiB0aGUgc3ltYm9sICovCisgIEVsZjY0X1h3b3JkIHN0X3NpemU7CQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBzaXplICovCit9IEVsZjY0X1N5bTsKKworCisjZGVmaW5lIEVJX05JREVOVAkxNgorCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9oZHJ7CisgIHVuc2lnbmVkIGNoYXIJZV9pZGVudFtFSV9OSURFTlRdOworICBFbGYzMl9IYWxmCWVfdHlwZTsKKyAgRWxmMzJfSGFsZgllX21hY2hpbmU7CisgIEVsZjMyX1dvcmQJZV92ZXJzaW9uOworICBFbGYzMl9BZGRyCWVfZW50cnk7ICAvKiBFbnRyeSBwb2ludCAqLworICBFbGYzMl9PZmYJZV9waG9mZjsKKyAgRWxmMzJfT2ZmCWVfc2hvZmY7CisgIEVsZjMyX1dvcmQJZV9mbGFnczsKKyAgRWxmMzJfSGFsZgllX2Voc2l6ZTsKKyAgRWxmMzJfSGFsZgllX3BoZW50c2l6ZTsKKyAgRWxmMzJfSGFsZgllX3BobnVtOworICBFbGYzMl9IYWxmCWVfc2hlbnRzaXplOworICBFbGYzMl9IYWxmCWVfc2hudW07CisgIEVsZjMyX0hhbGYJZV9zaHN0cm5keDsKK30gRWxmMzJfRWhkcjsKKwordHlwZWRlZiBzdHJ1Y3QgZWxmNjRfaGRyIHsKKyAgdW5zaWduZWQgY2hhcgllX2lkZW50W0VJX05JREVOVF07CS8qIEVMRiAibWFnaWMgbnVtYmVyIiAqLworICBFbGY2NF9IYWxmIGVfdHlwZTsKKyAgRWxmNjRfSGFsZiBlX21hY2hpbmU7CisgIEVsZjY0X1dvcmQgZV92ZXJzaW9uOworICBFbGY2NF9BZGRyIGVfZW50cnk7CQkvKiBFbnRyeSBwb2ludCB2aXJ0dWFsIGFkZHJlc3MgKi8KKyAgRWxmNjRfT2ZmIGVfcGhvZmY7CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLworICBFbGY2NF9PZmYgZV9zaG9mZjsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCisgIEVsZjY0X1dvcmQgZV9mbGFnczsKKyAgRWxmNjRfSGFsZiBlX2Voc2l6ZTsKKyAgRWxmNjRfSGFsZiBlX3BoZW50c2l6ZTsKKyAgRWxmNjRfSGFsZiBlX3BobnVtOworICBFbGY2NF9IYWxmIGVfc2hlbnRzaXplOworICBFbGY2NF9IYWxmIGVfc2hudW07CisgIEVsZjY0X0hhbGYgZV9zaHN0cm5keDsKK30gRWxmNjRfRWhkcjsKKworLyogVGhlc2UgY29uc3RhbnRzIGRlZmluZSB0aGUgcGVybWlzc2lvbnMgb24gc2VjdGlvbnMgaW4gdGhlIHByb2dyYW0KKyAgIGhlYWRlciwgcF9mbGFncy4gKi8KKyNkZWZpbmUgUEZfUgkJMHg0CisjZGVmaW5lIFBGX1cJCTB4MgorI2RlZmluZSBQRl9YCQkweDEKKwordHlwZWRlZiBzdHJ1Y3QgZWxmMzJfcGhkcnsKKyAgRWxmMzJfV29yZAlwX3R5cGU7CisgIEVsZjMyX09mZglwX29mZnNldDsKKyAgRWxmMzJfQWRkcglwX3ZhZGRyOworICBFbGYzMl9BZGRyCXBfcGFkZHI7CisgIEVsZjMyX1dvcmQJcF9maWxlc3o7CisgIEVsZjMyX1dvcmQJcF9tZW1zejsKKyAgRWxmMzJfV29yZAlwX2ZsYWdzOworICBFbGYzMl9Xb3JkCXBfYWxpZ247Cit9IEVsZjMyX1BoZHI7CisKK3R5cGVkZWYgc3RydWN0IGVsZjY0X3BoZHIgeworICBFbGY2NF9Xb3JkIHBfdHlwZTsKKyAgRWxmNjRfV29yZCBwX2ZsYWdzOworICBFbGY2NF9PZmYgcF9vZmZzZXQ7CQkvKiBTZWdtZW50IGZpbGUgb2Zmc2V0ICovCisgIEVsZjY0X0FkZHIgcF92YWRkcjsJCS8qIFNlZ21lbnQgdmlydHVhbCBhZGRyZXNzICovCisgIEVsZjY0X0FkZHIgcF9wYWRkcjsJCS8qIFNlZ21lbnQgcGh5c2ljYWwgYWRkcmVzcyAqLworICBFbGY2NF9Yd29yZCBwX2ZpbGVzejsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBmaWxlICovCisgIEVsZjY0X1h3b3JkIHBfbWVtc3o7CQkvKiBTZWdtZW50IHNpemUgaW4gbWVtb3J5ICovCisgIEVsZjY0X1h3b3JkIHBfYWxpZ247CQkvKiBTZWdtZW50IGFsaWdubWVudCwgZmlsZSAmIG1lbW9yeSAqLworfSBFbGY2NF9QaGRyOworCisvKiBzaF90eXBlICovCisjZGVmaW5lIFNIVF9OVUxMCTAKKyNkZWZpbmUgU0hUX1BST0dCSVRTCTEKKyNkZWZpbmUgU0hUX1NZTVRBQgkyCisjZGVmaW5lIFNIVF9TVFJUQUIJMworI2RlZmluZSBTSFRfUkVMQQk0CisjZGVmaW5lIFNIVF9IQVNICTUKKyNkZWZpbmUgU0hUX0RZTkFNSUMJNgorI2RlZmluZSBTSFRfTk9URQk3CisjZGVmaW5lIFNIVF9OT0JJVFMJOAorI2RlZmluZSBTSFRfUkVMCQk5CisjZGVmaW5lIFNIVF9TSExJQgkxMAorI2RlZmluZSBTSFRfRFlOU1lNCTExCisjZGVmaW5lIFNIVF9OVU0JCTEyCisjZGVmaW5lIFNIVF9MT1BST0MJMHg3MDAwMDAwMAorI2RlZmluZSBTSFRfSElQUk9DCTB4N2ZmZmZmZmYKKyNkZWZpbmUgU0hUX0xPVVNFUgkweDgwMDAwMDAwCisjZGVmaW5lIFNIVF9ISVVTRVIJMHhmZmZmZmZmZgorCisvKiBzaF9mbGFncyAqLworI2RlZmluZSBTSEZfV1JJVEUJMHgxCisjZGVmaW5lIFNIRl9BTExPQwkweDIKKyNkZWZpbmUgU0hGX0VYRUNJTlNUUgkweDQKKyNkZWZpbmUgU0hGX01BU0tQUk9DCTB4ZjAwMDAwMDAKKworLyogc3BlY2lhbCBzZWN0aW9uIGluZGV4ZXMgKi8KKyNkZWZpbmUgU0hOX1VOREVGCTAKKyNkZWZpbmUgU0hOX0xPUkVTRVJWRQkweGZmMDAKKyNkZWZpbmUgU0hOX0xPUFJPQwkweGZmMDAKKyNkZWZpbmUgU0hOX0hJUFJPQwkweGZmMWYKKyNkZWZpbmUgU0hOX0FCUwkJMHhmZmYxCisjZGVmaW5lIFNITl9DT01NT04JMHhmZmYyCisjZGVmaW5lIFNITl9ISVJFU0VSVkUJMHhmZmZmCisgCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9zaGRyIHsKKyAgRWxmMzJfV29yZAlzaF9uYW1lOworICBFbGYzMl9Xb3JkCXNoX3R5cGU7CisgIEVsZjMyX1dvcmQJc2hfZmxhZ3M7CisgIEVsZjMyX0FkZHIJc2hfYWRkcjsKKyAgRWxmMzJfT2ZmCXNoX29mZnNldDsKKyAgRWxmMzJfV29yZAlzaF9zaXplOworICBFbGYzMl9Xb3JkCXNoX2xpbms7CisgIEVsZjMyX1dvcmQJc2hfaW5mbzsKKyAgRWxmMzJfV29yZAlzaF9hZGRyYWxpZ247CisgIEVsZjMyX1dvcmQJc2hfZW50c2l6ZTsKK30gRWxmMzJfU2hkcjsKKwordHlwZWRlZiBzdHJ1Y3QgZWxmNjRfc2hkciB7CisgIEVsZjY0X1dvcmQgc2hfbmFtZTsJCS8qIFNlY3Rpb24gbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLworICBFbGY2NF9Xb3JkIHNoX3R5cGU7CQkvKiBUeXBlIG9mIHNlY3Rpb24gKi8KKyAgRWxmNjRfWHdvcmQgc2hfZmxhZ3M7CQkvKiBNaXNjZWxsYW5lb3VzIHNlY3Rpb24gYXR0cmlidXRlcyAqLworICBFbGY2NF9BZGRyIHNoX2FkZHI7CQkvKiBTZWN0aW9uIHZpcnR1YWwgYWRkciBhdCBleGVjdXRpb24gKi8KKyAgRWxmNjRfT2ZmIHNoX29mZnNldDsJCS8qIFNlY3Rpb24gZmlsZSBvZmZzZXQgKi8KKyAgRWxmNjRfWHdvcmQgc2hfc2l6ZTsJCS8qIFNpemUgb2Ygc2VjdGlvbiBpbiBieXRlcyAqLworICBFbGY2NF9Xb3JkIHNoX2xpbms7CQkvKiBJbmRleCBvZiBhbm90aGVyIHNlY3Rpb24gKi8KKyAgRWxmNjRfV29yZCBzaF9pbmZvOwkJLyogQWRkaXRpb25hbCBzZWN0aW9uIGluZm9ybWF0aW9uICovCisgIEVsZjY0X1h3b3JkIHNoX2FkZHJhbGlnbjsJLyogU2VjdGlvbiBhbGlnbm1lbnQgKi8KKyAgRWxmNjRfWHdvcmQgc2hfZW50c2l6ZTsJLyogRW50cnkgc2l6ZSBpZiBzZWN0aW9uIGhvbGRzIHRhYmxlICovCit9IEVsZjY0X1NoZHI7CisKKyNkZWZpbmUJRUlfTUFHMAkJMAkJLyogZV9pZGVudFtdIGluZGV4ZXMgKi8KKyNkZWZpbmUJRUlfTUFHMQkJMQorI2RlZmluZQlFSV9NQUcyCQkyCisjZGVmaW5lCUVJX01BRzMJCTMKKyNkZWZpbmUJRUlfQ0xBU1MJNAorI2RlZmluZQlFSV9EQVRBCQk1CisjZGVmaW5lCUVJX1ZFUlNJT04JNgorI2RlZmluZQlFSV9PU0FCSQk3CisjZGVmaW5lCUVJX1BBRAkJOAorCisjZGVmaW5lCUVMRk1BRzAJCTB4N2YJCS8qIEVJX01BRyAqLworI2RlZmluZQlFTEZNQUcxCQknRScKKyNkZWZpbmUJRUxGTUFHMgkJJ0wnCisjZGVmaW5lCUVMRk1BRzMJCSdGJworI2RlZmluZQlFTEZNQUcJCSJcMTc3RUxGIgorI2RlZmluZQlTRUxGTUFHCQk0CisKKyNkZWZpbmUJRUxGQ0xBU1NOT05FCTAJCS8qIEVJX0NMQVNTICovCisjZGVmaW5lCUVMRkNMQVNTMzIJMQorI2RlZmluZQlFTEZDTEFTUzY0CTIKKyNkZWZpbmUJRUxGQ0xBU1NOVU0JMworCisjZGVmaW5lIEVMRkRBVEFOT05FCTAJCS8qIGVfaWRlbnRbRUlfREFUQV0gKi8KKyNkZWZpbmUgRUxGREFUQTJMU0IJMQorI2RlZmluZSBFTEZEQVRBMk1TQgkyCisKKyNkZWZpbmUgRVZfTk9ORQkJMAkJLyogZV92ZXJzaW9uLCBFSV9WRVJTSU9OICovCisjZGVmaW5lIEVWX0NVUlJFTlQJMQorI2RlZmluZSBFVl9OVU0JCTIKKworI2RlZmluZSBFTEZPU0FCSV9OT05FCTAKKyNkZWZpbmUgRUxGT1NBQklfTElOVVgJMworCisjaWZuZGVmIEVMRl9PU0FCSQorI2RlZmluZSBFTEZfT1NBQkkgRUxGT1NBQklfTk9ORQorI2VuZGlmCisKKy8qCisgKiBOb3RlcyB1c2VkIGluIEVUX0NPUkUuIEFyY2hpdGVjdHVyZXMgZXhwb3J0IHNvbWUgb2YgdGhlIGFyY2ggcmVnaXN0ZXIgc2V0cworICogdXNpbmcgdGhlIGNvcnJlc3BvbmRpbmcgbm90ZSB0eXBlcyB2aWEgdGhlIFBUUkFDRV9HRVRSRUdTRVQgYW5kCisgKiBQVFJBQ0VfU0VUUkVHU0VUIHJlcXVlc3RzLgorICovCisjZGVmaW5lIE5UX1BSU1RBVFVTCTEKKyNkZWZpbmUgTlRfUFJGUFJFRwkyCisjZGVmaW5lIE5UX1BSUFNJTkZPCTMKKyNkZWZpbmUgTlRfVEFTS1NUUlVDVAk0CisjZGVmaW5lIE5UX0FVWFYJCTYKKyNkZWZpbmUgTlRfUFJYRlBSRUcgICAgIDB4NDZlNjJiN2YgICAgICAvKiBjb3BpZWQgZnJvbSBnZGI1LjEvaW5jbHVkZS9lbGYvY29tbW9uLmggKi8KKyNkZWZpbmUgTlRfUFBDX1ZNWAkweDEwMAkJLyogUG93ZXJQQyBBbHRpdmVjL1ZNWCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlRfUFBDX1NQRQkweDEwMQkJLyogUG93ZXJQQyBTUEUvRVZSIHJlZ2lzdGVycyAqLworI2RlZmluZSBOVF9QUENfVlNYCTB4MTAyCQkvKiBQb3dlclBDIFZTWCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlRfMzg2X1RMUwkweDIwMAkJLyogaTM4NiBUTFMgc2xvdHMgKHN0cnVjdCB1c2VyX2Rlc2MpICovCisjZGVmaW5lIE5UXzM4Nl9JT1BFUk0JMHgyMDEJCS8qIHg4NiBpbyBwZXJtaXNzaW9uIGJpdG1hcCAoMT1kZW55KSAqLworI2RlZmluZSBOVF9YODZfWFNUQVRFCTB4MjAyCQkvKiB4ODYgZXh0ZW5kZWQgc3RhdGUgdXNpbmcgeHNhdmUgKi8KKyNkZWZpbmUgTlRfUzM5MF9ISUdIX0dQUlMJMHgzMDAJLyogczM5MCB1cHBlciByZWdpc3RlciBoYWx2ZXMgKi8KKyNkZWZpbmUgTlRfUzM5MF9USU1FUgkweDMwMQkJLyogczM5MCB0aW1lciByZWdpc3RlciAqLworI2RlZmluZSBOVF9TMzkwX1RPRENNUAkweDMwMgkJLyogczM5MCBUT0QgY2xvY2sgY29tcGFyYXRvciByZWdpc3RlciAqLworI2RlZmluZSBOVF9TMzkwX1RPRFBSRUcJMHgzMDMJCS8qIHMzOTAgVE9EIHByb2dyYW1tYWJsZSByZWdpc3RlciAqLworI2RlZmluZSBOVF9TMzkwX0NUUlMJMHgzMDQJCS8qIHMzOTAgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlRfUzM5MF9QUkVGSVgJMHgzMDUJCS8qIHMzOTAgcHJlZml4IHJlZ2lzdGVyICovCisjZGVmaW5lIE5UX1MzOTBfTEFTVF9CUkVBSwkweDMwNgkvKiBzMzkwIGJyZWFraW5nIGV2ZW50IGFkZHJlc3MgKi8KKyNkZWZpbmUgTlRfUzM5MF9TWVNURU1fQ0FMTAkweDMwNwkvKiBzMzkwIHN5c3RlbSBjYWxsIHJlc3RhcnQgZGF0YSAqLworI2RlZmluZSBOVF9BUk1fVkZQCTB4NDAwCQkvKiBBUk0gVkZQL05FT04gcmVnaXN0ZXJzICovCisKKworLyogTm90ZSBoZWFkZXIgaW4gYSBQVF9OT1RFIHNlY3Rpb24gKi8KK3R5cGVkZWYgc3RydWN0IGVsZjMyX25vdGUgeworICBFbGYzMl9Xb3JkCW5fbmFtZXN6OwkvKiBOYW1lIHNpemUgKi8KKyAgRWxmMzJfV29yZAluX2Rlc2NzejsJLyogQ29udGVudCBzaXplICovCisgIEVsZjMyX1dvcmQJbl90eXBlOwkJLyogQ29udGVudCB0eXBlICovCit9IEVsZjMyX05oZHI7CisKKy8qIE5vdGUgaGVhZGVyIGluIGEgUFRfTk9URSBzZWN0aW9uICovCit0eXBlZGVmIHN0cnVjdCBlbGY2NF9ub3RlIHsKKyAgRWxmNjRfV29yZCBuX25hbWVzejsJLyogTmFtZSBzaXplICovCisgIEVsZjY0X1dvcmQgbl9kZXNjc3o7CS8qIENvbnRlbnQgc2l6ZSAqLworICBFbGY2NF9Xb3JkIG5fdHlwZTsJLyogQ29udGVudCB0eXBlICovCit9IEVsZjY0X05oZHI7CisKKyNlbmRpZiAvKiBfTElOVVhfRUxGX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZWxmY29yZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lbGZjb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkNzg0YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZWxmY29yZS5oCkBAIC0wLDAgKzEsOTYgQEAKKyNpZm5kZWYgX0xJTlVYX0VMRkNPUkVfSAorI2RlZmluZSBfTElOVVhfRUxGQ09SRV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCitzdHJ1Y3QgZWxmX3NpZ2luZm8KK3sKKwlpbnQJc2lfc2lnbm87CQkJLyogc2lnbmFsIG51bWJlciAqLworCWludAlzaV9jb2RlOwkJCS8qIGV4dHJhIGNvZGUgKi8KKwlpbnQJc2lfZXJybm87CQkJLyogZXJybm8gKi8KK307CisKKwordHlwZWRlZiBlbGZfZ3JlZ190IGdyZWdfdDsKK3R5cGVkZWYgZWxmX2dyZWdzZXRfdCBncmVnc2V0X3Q7Cit0eXBlZGVmIGVsZl9mcHJlZ3NldF90IGZwcmVnc2V0X3Q7Cit0eXBlZGVmIGVsZl9mcHhyZWdzZXRfdCBmcHhyZWdzZXRfdDsKKyNkZWZpbmUgTkdSRUcgRUxGX05HUkVHCisKKy8qCisgKiBEZWZpbml0aW9ucyB0byBnZW5lcmF0ZSBJbnRlbCBTVlI0LWxpa2UgY29yZSBmaWxlcy4KKyAqIFRoZXNlIG1vc3RseSBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBTVlI0IHR5cGVzIHdpdGggImVsZl8iCisgKiB0YWNrZWQgb24gdGhlIGZyb250IHRvIHByZXZlbnQgY2xhc2hlcyB3aXRoIGxpbnV4IGRlZmluaXRpb25zLAorICogYW5kIHRoZSB0eXBlZGVmIGZvcm1zIGhhdmUgYmVlbiBhdm9pZGVkLiAgVGhpcyBpcyBtb3N0bHkgbGlrZQorICogdGhlIFNWUjQgc3RydWN0dXJlLCBidXQgbW9yZSBMaW51eHksIHdpdGggdGhpbmdzIHRoYXQgTGludXggZG9lcworICogbm90IHN1cHBvcnQgYW5kIHdoaWNoIGdkYiBkb2Vzbid0IHJlYWxseSB1c2UgZXhjbHVkZWQuCisgKiBGaWVsZHMgcHJlc2VudCBidXQgbm90IHVzZWQgYXJlIG1hcmtlZCB3aXRoICJYWFgiLgorICovCitzdHJ1Y3QgZWxmX3Byc3RhdHVzCit7CisjaWYgMAorCWxvbmcJcHJfZmxhZ3M7CS8qIFhYWCBQcm9jZXNzIGZsYWdzICovCisJc2hvcnQJcHJfd2h5OwkJLyogWFhYIFJlYXNvbiBmb3IgcHJvY2VzcyBoYWx0ICovCisJc2hvcnQJcHJfd2hhdDsJLyogWFhYIE1vcmUgZGV0YWlsZWQgcmVhc29uICovCisjZW5kaWYKKwlzdHJ1Y3QgZWxmX3NpZ2luZm8gcHJfaW5mbzsJLyogSW5mbyBhc3NvY2lhdGVkIHdpdGggc2lnbmFsICovCisJc2hvcnQJcHJfY3Vyc2lnOwkJLyogQ3VycmVudCBzaWduYWwgKi8KKwl1bnNpZ25lZCBsb25nIHByX3NpZ3BlbmQ7CS8qIFNldCBvZiBwZW5kaW5nIHNpZ25hbHMgKi8KKwl1bnNpZ25lZCBsb25nIHByX3NpZ2hvbGQ7CS8qIFNldCBvZiBoZWxkIHNpZ25hbHMgKi8KKyNpZiAwCisJc3RydWN0IHNpZ2FsdHN0YWNrIHByX2FsdHN0YWNrOwkvKiBBbHRlcm5hdGUgc3RhY2sgaW5mbyAqLworCXN0cnVjdCBzaWdhY3Rpb24gcHJfYWN0aW9uOwkvKiBTaWduYWwgYWN0aW9uIGZvciBjdXJyZW50IHNpZyAqLworI2VuZGlmCisJcGlkX3QJcHJfcGlkOworCXBpZF90CXByX3BwaWQ7CisJcGlkX3QJcHJfcGdycDsKKwlwaWRfdAlwcl9zaWQ7CisJc3RydWN0IHRpbWV2YWwgcHJfdXRpbWU7CS8qIFVzZXIgdGltZSAqLworCXN0cnVjdCB0aW1ldmFsIHByX3N0aW1lOwkvKiBTeXN0ZW0gdGltZSAqLworCXN0cnVjdCB0aW1ldmFsIHByX2N1dGltZTsJLyogQ3VtdWxhdGl2ZSB1c2VyIHRpbWUgKi8KKwlzdHJ1Y3QgdGltZXZhbCBwcl9jc3RpbWU7CS8qIEN1bXVsYXRpdmUgc3lzdGVtIHRpbWUgKi8KKyNpZiAwCisJbG9uZwlwcl9pbnN0cjsJCS8qIEN1cnJlbnQgaW5zdHJ1Y3Rpb24gKi8KKyNlbmRpZgorCWVsZl9ncmVnc2V0X3QgcHJfcmVnOwkvKiBHUCByZWdpc3RlcnMgKi8KKyNpZmRlZiBDT05GSUdfQklORk1UX0VMRl9GRFBJQworCS8qIFdoZW4gdXNpbmcgRkRQSUMsIHRoZSBsb2FkbWFwIGFkZHJlc3NlcyBuZWVkIHRvIGJlIGNvbW11bmljYXRlZAorCSAqIHRvIEdEQiBpbiBvcmRlciBmb3IgR0RCIHRvIGRvIHRoZSBuZWNlc3NhcnkgcmVsb2NhdGlvbnMuICBUaGUKKwkgKiBmaWVsZHMgKGJlbG93KSB1c2VkIHRvIGNvbW11bmljYXRlIHRoaXMgaW5mb3JtYXRpb24gYXJlIHBsYWNlZAorCSAqIGltbWVkaWF0ZWx5IGFmdGVyIGBgcHJfcmVnJycsIHNvIHRoYXQgdGhlIGxvYWRtYXAgYWRkcmVzc2VzIG1heQorCSAqIGJlIHZpZXdlZCBhcyBwYXJ0IG9mIHRoZSByZWdpc3RlciBzZXQgaWYgc28gZGVzaXJlZC4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIHByX2V4ZWNfZmRwaWNfbG9hZG1hcDsKKwl1bnNpZ25lZCBsb25nIHByX2ludGVycF9mZHBpY19sb2FkbWFwOworI2VuZGlmCisJaW50IHByX2ZwdmFsaWQ7CQkvKiBUcnVlIGlmIG1hdGggY28tcHJvY2Vzc29yIGJlaW5nIHVzZWQuICAqLworfTsKKworI2RlZmluZSBFTEZfUFJBUkdTWgkoODApCS8qIE51bWJlciBvZiBjaGFycyBmb3IgYXJncyAqLworCitzdHJ1Y3QgZWxmX3BycHNpbmZvCit7CisJY2hhcglwcl9zdGF0ZTsJLyogbnVtZXJpYyBwcm9jZXNzIHN0YXRlICovCisJY2hhcglwcl9zbmFtZTsJLyogY2hhciBmb3IgcHJfc3RhdGUgKi8KKwljaGFyCXByX3pvbWI7CS8qIHpvbWJpZSAqLworCWNoYXIJcHJfbmljZTsJLyogbmljZSB2YWwgKi8KKwl1bnNpZ25lZCBsb25nIHByX2ZsYWc7CS8qIGZsYWdzICovCisJX19rZXJuZWxfdWlkX3QJcHJfdWlkOworCV9fa2VybmVsX2dpZF90CXByX2dpZDsKKwlwaWRfdAlwcl9waWQsIHByX3BwaWQsIHByX3BncnAsIHByX3NpZDsKKwkvKiBMb3RzIG1pc3NpbmcgKi8KKwljaGFyCXByX2ZuYW1lWzE2XTsJLyogZmlsZW5hbWUgb2YgZXhlY3V0YWJsZSAqLworCWNoYXIJcHJfcHNhcmdzW0VMRl9QUkFSR1NaXTsJLyogaW5pdGlhbCBwYXJ0IG9mIGFyZyBsaXN0ICovCit9OworCit0eXBlZGVmIHN0cnVjdCBlbGZfcHJzdGF0dXMgcHJzdGF0dXNfdDsKK3R5cGVkZWYgc3RydWN0IGVsZl9wcnBzaW5mbyBwcnBzaW5mb190OworI2RlZmluZSBQUkFSR1NaIEVMRl9QUkFSR1NaIAorCisKKyNlbmRpZiAvKiBfTElOVVhfRUxGQ09SRV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Vycm5vLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Vycm5vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM4NWZhMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZXJybm8uaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgX0xJTlVYX0VSUk5PX0gKKyNkZWZpbmUgX0xJTlVYX0VSUk5PX0gKKworI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lcnJxdWV1ZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lcnJxdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYjBhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VycnF1ZXVlLmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBfTElOVVhfRVJSUVVFVUVfSAorI2RlZmluZSBfTElOVVhfRVJSUVVFVUVfSCAxCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3Qgc29ja19leHRlbmRlZF9lcnIgeworCV9fdTMyCWVlX2Vycm5vOwkKKwlfX3U4CWVlX29yaWdpbjsKKwlfX3U4CWVlX3R5cGU7CisJX191OAllZV9jb2RlOworCV9fdTgJZWVfcGFkOworCV9fdTMyICAgZWVfaW5mbzsKKwlfX3UzMiAgIGVlX2RhdGE7Cit9OworCisjZGVmaW5lIFNPX0VFX09SSUdJTl9OT05FCTAKKyNkZWZpbmUgU09fRUVfT1JJR0lOX0xPQ0FMCTEKKyNkZWZpbmUgU09fRUVfT1JJR0lOX0lDTVAJMgorI2RlZmluZSBTT19FRV9PUklHSU5fSUNNUDYJMworI2RlZmluZSBTT19FRV9PUklHSU5fVElNRVNUQU1QSU5HIDQKKworI2RlZmluZSBTT19FRV9PRkZFTkRFUihlZSkJKChzdHJ1Y3Qgc29ja2FkZHIqKSgoZWUpKzEpKQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ldGh0b29sLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2V0aHRvb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTYwMzdmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ldGh0b29sLmgKQEAgLTAsMCArMSw5NDAgQEAKKy8qCisgKiBldGh0b29sLmg6IERlZmluZXMgZm9yIExpbnV4IGV0aHRvb2wuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqIENvcHlyaWdodCAyMDAxIEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKyAqIFBvcnRpb25zIENvcHlyaWdodCAyMDAxIFN1biBNaWNyb3N5c3RlbXMgKHRob2NraW5Ac3VuLmNvbSkKKyAqIFBvcnRpb25zIENvcHlyaWdodCAyMDAyIEludGVsIChlbGkua3VwZXJtYW5uQGludGVsLmNvbSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHJpc3RvcGhlci5sZWVjaEBpbnRlbC5jb20sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvdHQuZmVsZG1hbkBpbnRlbC5jb20pCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIFN1biBNaWNyb3N5c3RlbXMgMjAwOAorICovCisKKyNpZm5kZWYgX0xJTlVYX0VUSFRPT0xfSAorI2RlZmluZSBfTElOVVhfRVRIVE9PTF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisKKy8qIFRoaXMgc2hvdWxkIHdvcmsgZm9yIGJvdGggMzIgYW5kIDY0IGJpdCB1c2VybGFuZC4gKi8KK3N0cnVjdCBldGh0b29sX2NtZCB7CisJX191MzIJY21kOworCV9fdTMyCXN1cHBvcnRlZDsJLyogRmVhdHVyZXMgdGhpcyBpbnRlcmZhY2Ugc3VwcG9ydHMgKi8KKwlfX3UzMglhZHZlcnRpc2luZzsJLyogRmVhdHVyZXMgdGhpcyBpbnRlcmZhY2UgYWR2ZXJ0aXNlcyAqLworCV9fdTE2CXNwZWVkOwkgICAgICAgIC8qIFRoZSBmb3JjZWQgc3BlZWQgKGxvd2VyIGJpdHMpIGluCisJCQkJICogTWJwcy4gUGxlYXNlIHVzZQorCQkJCSAqIGV0aHRvb2xfY21kX3NwZWVkKCkvX3NldCgpIHRvCisJCQkJICogYWNjZXNzIGl0ICovCisJX191OAlkdXBsZXg7CQkvKiBEdXBsZXgsIGhhbGYgb3IgZnVsbCAqLworCV9fdTgJcG9ydDsJCS8qIFdoaWNoIGNvbm5lY3RvciBwb3J0ICovCisJX191OAlwaHlfYWRkcmVzczsKKwlfX3U4CXRyYW5zY2VpdmVyOwkvKiBXaGljaCB0cmFuc2NlaXZlciB0byB1c2UgKi8KKwlfX3U4CWF1dG9uZWc7CS8qIEVuYWJsZSBvciBkaXNhYmxlIGF1dG9uZWdvdGlhdGlvbiAqLworCV9fdTgJbWRpb19zdXBwb3J0OworCV9fdTMyCW1heHR4cGt0OwkvKiBUeCBwa3RzIGJlZm9yZSBnZW5lcmF0aW5nIHR4IGludCAqLworCV9fdTMyCW1heHJ4cGt0OwkvKiBSeCBwa3RzIGJlZm9yZSBnZW5lcmF0aW5nIHJ4IGludCAqLworCV9fdTE2CXNwZWVkX2hpOyAgICAgICAvKiBUaGUgZm9yY2VkIHNwZWVkICh1cHBlcgorCQkJCSAqIGJpdHMpIGluIE1icHMuIFBsZWFzZSB1c2UKKwkJCQkgKiBldGh0b29sX2NtZF9zcGVlZCgpL19zZXQoKSB0bworCQkJCSAqIGFjY2VzcyBpdCAqLworCV9fdTgJZXRoX3RwX21kaXg7CisJX191OAlyZXNlcnZlZDI7CisJX191MzIJbHBfYWR2ZXJ0aXNpbmc7CS8qIEZlYXR1cmVzIHRoZSBsaW5rIHBhcnRuZXIgYWR2ZXJ0aXNlcyAqLworCV9fdTMyCXJlc2VydmVkWzJdOworfTsKKworc3RhdGljIF9faW5saW5lX18gdm9pZCBldGh0b29sX2NtZF9zcGVlZF9zZXQoc3RydWN0IGV0aHRvb2xfY21kICplcCwKKwkJCQkJIF9fdTMyIHNwZWVkKQoreworCisJZXAtPnNwZWVkID0gKF9fdTE2KXNwZWVkOworCWVwLT5zcGVlZF9oaSA9IChfX3UxNikoc3BlZWQgPj4gMTYpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBldGh0b29sX2NtZF9zcGVlZChjb25zdCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVwKQoreworCXJldHVybiAoZXAtPnNwZWVkX2hpIDw8IDE2KSB8IGVwLT5zcGVlZDsKK30KKworI2RlZmluZSBFVEhUT09MX0ZXVkVSU19MRU4JMzIKKyNkZWZpbmUgRVRIVE9PTF9CVVNJTkZPX0xFTgkzMgorLyogdGhlc2Ugc3RyaW5ncyBhcmUgc2V0IHRvIHdoYXRldmVyIHRoZSBkcml2ZXIgYXV0aG9yIGRlY2lkZXMuLi4gKi8KK3N0cnVjdCBldGh0b29sX2RydmluZm8geworCV9fdTMyCWNtZDsKKwljaGFyCWRyaXZlclszMl07CS8qIGRyaXZlciBzaG9ydCBuYW1lLCAidHVsaXAiLCAiZWVwcm8xMDAiICovCisJY2hhcgl2ZXJzaW9uWzMyXTsJLyogZHJpdmVyIHZlcnNpb24gc3RyaW5nICovCisJY2hhcglmd192ZXJzaW9uW0VUSFRPT0xfRldWRVJTX0xFTl07CS8qIGZpcm13YXJlIHZlcnNpb24gc3RyaW5nICovCisJY2hhcglidXNfaW5mb1tFVEhUT09MX0JVU0lORk9fTEVOXTsJLyogQnVzIGluZm8gZm9yIHRoaXMgSUYuICovCisJCQkJLyogRm9yIFBDSSBkZXZpY2VzLCB1c2UgcGNpX25hbWUocGNpX2RldikuICovCisJY2hhcglyZXNlcnZlZDFbMzJdOworCWNoYXIJcmVzZXJ2ZWQyWzEyXTsKKwkJCQkvKgorCQkJCSAqIFNvbWUgc3RydWN0IG1lbWJlcnMgYmVsb3cgYXJlIGZpbGxlZCBpbgorCQkJCSAqIHVzaW5nIG9wcy0+Z2V0X3NzZXRfY291bnQoKS4gIE9idGFpbmluZworCQkJCSAqIHRoaXMgaW5mbyBmcm9tIGV0aHRvb2xfZHJ2aW5mbyBpcyBub3cKKwkJCQkgKiBkZXByZWNhdGVkOyBVc2UgRVRIVE9PTF9HU1NFVF9JTkZPCisJCQkJICogaW5zdGVhZC4KKwkJCQkgKi8KKwlfX3UzMgluX3ByaXZfZmxhZ3M7CS8qIG51bWJlciBvZiBmbGFncyB2YWxpZCBpbiBFVEhUT09MX0dQRkxBR1MgKi8KKwlfX3UzMgluX3N0YXRzOwkvKiBudW1iZXIgb2YgdTY0J3MgZnJvbSBFVEhUT09MX0dTVEFUUyAqLworCV9fdTMyCXRlc3RpbmZvX2xlbjsKKwlfX3UzMgllZWR1bXBfbGVuOwkvKiBTaXplIG9mIGRhdGEgZnJvbSBFVEhUT09MX0dFRVBST00gKGJ5dGVzKSAqLworCV9fdTMyCXJlZ2R1bXBfbGVuOwkvKiBTaXplIG9mIGRhdGEgZnJvbSBFVEhUT09MX0dSRUdTIChieXRlcykgKi8KK307CisKKyNkZWZpbmUgU09QQVNTX01BWAk2CisvKiB3YWtlLW9uLWxhbiBzZXR0aW5ncyAqLworc3RydWN0IGV0aHRvb2xfd29saW5mbyB7CisJX191MzIJY21kOworCV9fdTMyCXN1cHBvcnRlZDsKKwlfX3UzMgl3b2xvcHRzOworCV9fdTgJc29wYXNzW1NPUEFTU19NQVhdOyAvKiBTZWN1cmVPbih0bSkgcGFzc3dvcmQgKi8KK307CisKKy8qIGZvciBwYXNzaW5nIHNpbmdsZSB2YWx1ZXMgKi8KK3N0cnVjdCBldGh0b29sX3ZhbHVlIHsKKwlfX3UzMgljbWQ7CisJX191MzIJZGF0YTsKK307CisKKy8qIGZvciBwYXNzaW5nIGJpZyBjaHVua3Mgb2YgZGF0YSAqLworc3RydWN0IGV0aHRvb2xfcmVncyB7CisJX191MzIJY21kOworCV9fdTMyCXZlcnNpb247IC8qIGRyaXZlci1zcGVjaWZpYywgaW5kaWNhdGVzIGRpZmZlcmVudCBjaGlwcy9yZXZzICovCisJX191MzIJbGVuOyAvKiBieXRlcyAqLworCV9fdTgJZGF0YVswXTsKK307CisKKy8qIGZvciBwYXNzaW5nIEVFUFJPTSBjaHVua3MgKi8KK3N0cnVjdCBldGh0b29sX2VlcHJvbSB7CisJX191MzIJY21kOworCV9fdTMyCW1hZ2ljOworCV9fdTMyCW9mZnNldDsgLyogaW4gYnl0ZXMgKi8KKwlfX3UzMglsZW47IC8qIGluIGJ5dGVzICovCisJX191OAlkYXRhWzBdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAtIGNvYWxlc2NpbmcgcGFyYW1ldGVycyBmb3IgSVJRcyBhbmQgc3RhdHMgdXBkYXRlcworICogQGNtZDogRVRIVE9PTF97RyxTfUNPQUxFU0NFCisgKiBAcnhfY29hbGVzY2VfdXNlY3M6IEhvdyBtYW55IHVzZWNzIHRvIGRlbGF5IGFuIFJYIGludGVycnVwdCBhZnRlcgorICoJYSBwYWNrZXQgYXJyaXZlcy4KKyAqIEByeF9tYXhfY29hbGVzY2VkX2ZyYW1lczogTWF4aW11bSBudW1iZXIgb2YgcGFja2V0cyB0byByZWNlaXZlCisgKgliZWZvcmUgYW4gUlggaW50ZXJydXB0LgorICogQHJ4X2NvYWxlc2NlX3VzZWNzX2lycTogU2FtZSBhcyBAcnhfY29hbGVzY2VfdXNlY3MsIGV4Y2VwdCB0aGF0CisgKgl0aGlzIHZhbHVlIGFwcGxpZXMgd2hpbGUgYW4gSVJRIGlzIGJlaW5nIHNlcnZpY2VkIGJ5IHRoZSBob3N0LgorICogQHJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycTogU2FtZSBhcyBAcnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMsCisgKglleGNlcHQgdGhhdCB0aGlzIHZhbHVlIGFwcGxpZXMgd2hpbGUgYW4gSVJRIGlzIGJlaW5nIHNlcnZpY2VkCisgKglieSB0aGUgaG9zdC4KKyAqIEB0eF9jb2FsZXNjZV91c2VjczogSG93IG1hbnkgdXNlY3MgdG8gZGVsYXkgYSBUWCBpbnRlcnJ1cHQgYWZ0ZXIKKyAqCWEgcGFja2V0IGlzIHNlbnQuCisgKiBAdHhfbWF4X2NvYWxlc2NlZF9mcmFtZXM6IE1heGltdW0gbnVtYmVyIG9mIHBhY2tldHMgdG8gYmUgc2VudAorICoJYmVmb3JlIGEgVFggaW50ZXJydXB0LgorICogQHR4X2NvYWxlc2NlX3VzZWNzX2lycTogU2FtZSBhcyBAdHhfY29hbGVzY2VfdXNlY3MsIGV4Y2VwdCB0aGF0CisgKgl0aGlzIHZhbHVlIGFwcGxpZXMgd2hpbGUgYW4gSVJRIGlzIGJlaW5nIHNlcnZpY2VkIGJ5IHRoZSBob3N0LgorICogQHR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycTogU2FtZSBhcyBAdHhfbWF4X2NvYWxlc2NlZF9mcmFtZXMsCisgKglleGNlcHQgdGhhdCB0aGlzIHZhbHVlIGFwcGxpZXMgd2hpbGUgYW4gSVJRIGlzIGJlaW5nIHNlcnZpY2VkCisgKglieSB0aGUgaG9zdC4KKyAqIEBzdGF0c19ibG9ja19jb2FsZXNjZV91c2VjczogSG93IG1hbnkgdXNlY3MgdG8gZGVsYXkgaW4tbWVtb3J5CisgKglzdGF0aXN0aWNzIGJsb2NrIHVwZGF0ZXMuICBTb21lIGRyaXZlcnMgZG8gbm90IGhhdmUgYW4KKyAqCWluLW1lbW9yeSBzdGF0aXN0aWMgYmxvY2ssIGFuZCBpbiBzdWNoIGNhc2VzIHRoaXMgdmFsdWUgaXMKKyAqCWlnbm9yZWQuICBUaGlzIHZhbHVlIG11c3Qgbm90IGJlIHplcm8uCisgKiBAdXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlOiBFbmFibGUgYWRhcHRpdmUgUlggY29hbGVzY2luZy4KKyAqIEB1c2VfYWRhcHRpdmVfdHhfY29hbGVzY2U6IEVuYWJsZSBhZGFwdGl2ZSBUWCBjb2FsZXNjaW5nLgorICogQHBrdF9yYXRlX2xvdzogVGhyZXNob2xkIGZvciBsb3cgcGFja2V0IHJhdGUgKHBhY2tldHMgcGVyIHNlY29uZCkuCisgKiBAcnhfY29hbGVzY2VfdXNlY3NfbG93OiBIb3cgbWFueSB1c2VjcyB0byBkZWxheSBhbiBSWCBpbnRlcnJ1cHQgYWZ0ZXIKKyAqCWEgcGFja2V0IGFycml2ZXMsIHdoZW4gdGhlIHBhY2tldCByYXRlIGlzIGJlbG93IEBwa3RfcmF0ZV9sb3cuCisgKiBAcnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfbG93OiBNYXhpbXVtIG51bWJlciBvZiBwYWNrZXRzIHRvIGJlIHJlY2VpdmVkCisgKgliZWZvcmUgYW4gUlggaW50ZXJydXB0LCB3aGVuIHRoZSBwYWNrZXQgcmF0ZSBpcyBiZWxvdyBAcGt0X3JhdGVfbG93LgorICogQHR4X2NvYWxlc2NlX3VzZWNzX2xvdzogSG93IG1hbnkgdXNlY3MgdG8gZGVsYXkgYSBUWCBpbnRlcnJ1cHQgYWZ0ZXIKKyAqCWEgcGFja2V0IGlzIHNlbnQsIHdoZW4gdGhlIHBhY2tldCByYXRlIGlzIGJlbG93IEBwa3RfcmF0ZV9sb3cuCisgKiBAdHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfbG93OiBNYXhpbXVtIG51dW1iZXIgb2YgcGFja2V0cyB0byBiZSBzZW50IGJlZm9yZQorICoJYSBUWCBpbnRlcnJ1cHQsIHdoZW4gdGhlIHBhY2tldCByYXRlIGlzIGJlbG93IEBwa3RfcmF0ZV9sb3cuCisgKiBAcGt0X3JhdGVfaGlnaDogVGhyZXNob2xkIGZvciBoaWdoIHBhY2tldCByYXRlIChwYWNrZXRzIHBlciBzZWNvbmQpLgorICogQHJ4X2NvYWxlc2NlX3VzZWNzX2hpZ2g6IEhvdyBtYW55IHVzZWNzIHRvIGRlbGF5IGFuIFJYIGludGVycnVwdCBhZnRlcgorICoJYSBwYWNrZXQgYXJyaXZlcywgd2hlbiB0aGUgcGFja2V0IHJhdGUgaXMgYWJvdmUgQHBrdF9yYXRlX2hpZ2guCisgKiBAcnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaGlnaDogTWF4aW11bSBudW1iZXIgb2YgcGFja2V0cyB0byBiZSByZWNlaXZlZAorICoJYmVmb3JlIGFuIFJYIGludGVycnVwdCwgd2hlbiB0aGUgcGFja2V0IHJhdGUgaXMgYWJvdmUgQHBrdF9yYXRlX2hpZ2guCisgKiBAdHhfY29hbGVzY2VfdXNlY3NfaGlnaDogSG93IG1hbnkgdXNlY3MgdG8gZGVsYXkgYSBUWCBpbnRlcnJ1cHQgYWZ0ZXIKKyAqCWEgcGFja2V0IGlzIHNlbnQsIHdoZW4gdGhlIHBhY2tldCByYXRlIGlzIGFib3ZlIEBwa3RfcmF0ZV9oaWdoLgorICogQHR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2hpZ2g6IE1heGltdW0gbnVtYmVyIG9mIHBhY2tldHMgdG8gYmUgc2VudCBiZWZvcmUKKyAqCWEgVFggaW50ZXJydXB0LCB3aGVuIHRoZSBwYWNrZXQgcmF0ZSBpcyBhYm92ZSBAcGt0X3JhdGVfaGlnaC4KKyAqIEByYXRlX3NhbXBsZV9pbnRlcnZhbDogSG93IG9mdGVuIHRvIGRvIGFkYXB0aXZlIGNvYWxlc2NpbmcgcGFja2V0IHJhdGUKKyAqCXNhbXBsaW5nLCBtZWFzdXJlZCBpbiBzZWNvbmRzLiAgTXVzdCBub3QgYmUgemVyby4KKyAqCisgKiBFYWNoIHBhaXIgb2YgKHVzZWNzLCBtYXhfZnJhbWVzKSBmaWVsZHMgc3BlY2lmaWVzIHRoaXMgZXhpdAorICogY29uZGl0aW9uIGZvciBpbnRlcnJ1cHQgY29hbGVzY2luZzoKKyAqCSh1c2VjcyA+IDAgJiYgdGltZV9zaW5jZV9maXJzdF9jb21wbGV0aW9uID49IHVzZWNzKSB8fAorICoJKG1heF9mcmFtZXMgPiAwICYmIGNvbXBsZXRlZF9mcmFtZXMgPj0gbWF4X2ZyYW1lcykKKyAqIEl0IGlzIGlsbGVnYWwgdG8gc2V0IGJvdGggdXNlY3MgYW5kIG1heF9mcmFtZXMgdG8gemVybyBhcyB0aGlzCisgKiB3b3VsZCBjYXVzZSBpbnRlcnJ1cHRzIHRvIG5ldmVyIGJlIGdlbmVyYXRlZC4gIFRvIGRpc2FibGUKKyAqIGNvYWxlc2NpbmcsIHNldCB1c2VjcyA9IDAgYW5kIG1heF9mcmFtZXMgPSAxLgorICoKKyAqIFNvbWUgaW1wbGVtZW50YXRpb25zIGlnbm9yZSB0aGUgdmFsdWUgb2YgbWF4X2ZyYW1lcyBhbmQgdXNlIHRoZQorICogY29uZGl0aW9uOgorICoJdGltZV9zaW5jZV9maXJzdF9jb21wbGV0aW9uID49IHVzZWNzCisgKiBUaGlzIGlzIGRlcHJlY2F0ZWQuICBEcml2ZXJzIGZvciBoYXJkd2FyZSB0aGF0IGRvZXMgbm90IHN1cHBvcnQKKyAqIGNvdW50aW5nIGNvbXBsZXRpb25zIHNob3VsZCB2YWxpZGF0ZSB0aGF0IG1heF9mcmFtZXMgPT0gIXJ4X3VzZWNzLgorICoKKyAqIEFkYXB0aXZlIFJYL1RYIGNvYWxlc2NpbmcgaXMgYW4gYWxnb3JpdGhtIGltcGxlbWVudGVkIGJ5IHNvbWUKKyAqIGRyaXZlcnMgdG8gaW1wcm92ZSBsYXRlbmN5IHVuZGVyIGxvdyBwYWNrZXQgcmF0ZXMgYW5kIGltcHJvdmUKKyAqIHRocm91Z2hwdXQgdW5kZXIgaGlnaCBwYWNrZXQgcmF0ZXMuICBTb21lIGRyaXZlcnMgb25seSBpbXBsZW1lbnQKKyAqIG9uZSBvZiBSWCBvciBUWCBhZGFwdGl2ZSBjb2FsZXNjaW5nLiAgQW55dGhpbmcgbm90IGltcGxlbWVudGVkIGJ5CisgKiB0aGUgZHJpdmVyIGNhdXNlcyB0aGVzZSB2YWx1ZXMgdG8gYmUgc2lsZW50bHkgaWdub3JlZC4KKyAqCisgKiBXaGVuIHRoZSBwYWNrZXQgcmF0ZSBpcyBiZWxvdyBAcGt0X3JhdGVfaGlnaCBidXQgYWJvdmUKKyAqIEBwa3RfcmF0ZV9sb3cgKGJvdGggbWVhc3VyZWQgaW4gcGFja2V0cyBwZXIgc2Vjb25kKSB0aGUKKyAqIG5vcm1hbCB7cngsdHh9XyogY29hbGVzY2luZyBwYXJhbWV0ZXJzIGFyZSB1c2VkLgorICovCitzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSB7CisJX191MzIJY21kOworCV9fdTMyCXJ4X2NvYWxlc2NlX3VzZWNzOworCV9fdTMyCXJ4X21heF9jb2FsZXNjZWRfZnJhbWVzOworCV9fdTMyCXJ4X2NvYWxlc2NlX3VzZWNzX2lycTsKKwlfX3UzMglyeF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnE7CisJX191MzIJdHhfY29hbGVzY2VfdXNlY3M7CisJX191MzIJdHhfbWF4X2NvYWxlc2NlZF9mcmFtZXM7CisJX191MzIJdHhfY29hbGVzY2VfdXNlY3NfaXJxOworCV9fdTMyCXR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycTsKKwlfX3UzMglzdGF0c19ibG9ja19jb2FsZXNjZV91c2VjczsKKwlfX3UzMgl1c2VfYWRhcHRpdmVfcnhfY29hbGVzY2U7CisJX191MzIJdXNlX2FkYXB0aXZlX3R4X2NvYWxlc2NlOworCV9fdTMyCXBrdF9yYXRlX2xvdzsKKwlfX3UzMglyeF9jb2FsZXNjZV91c2Vjc19sb3c7CisJX191MzIJcnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfbG93OworCV9fdTMyCXR4X2NvYWxlc2NlX3VzZWNzX2xvdzsKKwlfX3UzMgl0eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19sb3c7CisJX191MzIJcGt0X3JhdGVfaGlnaDsKKwlfX3UzMglyeF9jb2FsZXNjZV91c2Vjc19oaWdoOworCV9fdTMyCXJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2hpZ2g7CisJX191MzIJdHhfY29hbGVzY2VfdXNlY3NfaGlnaDsKKwlfX3UzMgl0eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19oaWdoOworCV9fdTMyCXJhdGVfc2FtcGxlX2ludGVydmFsOworfTsKKworLyogZm9yIGNvbmZpZ3VyaW5nIFJYL1RYIHJpbmcgcGFyYW1ldGVycyAqLworc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtIHsKKwlfX3UzMgljbWQ7CS8qIEVUSFRPT0xfe0csU31SSU5HUEFSQU0gKi8KKworCS8qIFJlYWQgb25seSBhdHRyaWJ1dGVzLiAgVGhlc2UgaW5kaWNhdGUgdGhlIG1heGltdW0gbnVtYmVyCisJICogb2YgcGVuZGluZyBSWC9UWCByaW5nIGVudHJpZXMgdGhlIGRyaXZlciB3aWxsIGFsbG93IHRoZQorCSAqIHVzZXIgdG8gc2V0LgorCSAqLworCV9fdTMyCXJ4X21heF9wZW5kaW5nOworCV9fdTMyCXJ4X21pbmlfbWF4X3BlbmRpbmc7CisJX191MzIJcnhfanVtYm9fbWF4X3BlbmRpbmc7CisJX191MzIJdHhfbWF4X3BlbmRpbmc7CisKKwkvKiBWYWx1ZXMgY2hhbmdlYWJsZSBieSB0aGUgdXNlci4gIFRoZSB2YWxpZCB2YWx1ZXMgYXJlCisJICogaW4gdGhlIHJhbmdlIDEgdG8gdGhlICIqX21heF9wZW5kaW5nIiBjb3VudGVycGFydCBhYm92ZS4KKwkgKi8KKwlfX3UzMglyeF9wZW5kaW5nOworCV9fdTMyCXJ4X21pbmlfcGVuZGluZzsKKwlfX3UzMglyeF9qdW1ib19wZW5kaW5nOworCV9fdTMyCXR4X3BlbmRpbmc7Cit9OworCisvKioKKyAqIHN0cnVjdCBldGh0b29sX2NoYW5uZWxzIC0gY29uZmlndXJpbmcgbnVtYmVyIG9mIG5ldHdvcmsgY2hhbm5lbAorICogQGNtZDogRVRIVE9PTF97RyxTfUNIQU5ORUxTCisgKiBAbWF4X3J4OiBSZWFkIG9ubHkuIE1heGltdW0gbnVtYmVyIG9mIHJlY2VpdmUgY2hhbm5lbCB0aGUgZHJpdmVyIHN1cHBvcnQuCisgKiBAbWF4X3R4OiBSZWFkIG9ubHkuIE1heGltdW0gbnVtYmVyIG9mIHRyYW5zbWl0IGNoYW5uZWwgdGhlIGRyaXZlciBzdXBwb3J0LgorICogQG1heF9vdGhlcjogUmVhZCBvbmx5LiBNYXhpbXVtIG51bWJlciBvZiBvdGhlciBjaGFubmVsIHRoZSBkcml2ZXIgc3VwcG9ydC4KKyAqIEBtYXhfY29tYmluZWQ6IFJlYWQgb25seS4gTWF4aW11bSBudW1iZXIgb2YgY29tYmluZWQgY2hhbm5lbCB0aGUgZHJpdmVyCisgKglzdXBwb3J0LiBTZXQgb2YgcXVldWVzIFJYLCBUWCBvciBvdGhlci4KKyAqIEByeF9jb3VudDogVmFsaWQgdmFsdWVzIGFyZSBpbiB0aGUgcmFuZ2UgMSB0byB0aGUgbWF4X3J4LgorICogQHR4X2NvdW50OiBWYWxpZCB2YWx1ZXMgYXJlIGluIHRoZSByYW5nZSAxIHRvIHRoZSBtYXhfdHguCisgKiBAb3RoZXJfY291bnQ6IFZhbGlkIHZhbHVlcyBhcmUgaW4gdGhlIHJhbmdlIDEgdG8gdGhlIG1heF9vdGhlci4KKyAqIEBjb21iaW5lZF9jb3VudDogVmFsaWQgdmFsdWVzIGFyZSBpbiB0aGUgcmFuZ2UgMSB0byB0aGUgbWF4X2NvbWJpbmVkLgorICoKKyAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIFJYLCBUWCBhbmQgb3RoZXIgY2hhbm5lbHMuCisgKi8KKworc3RydWN0IGV0aHRvb2xfY2hhbm5lbHMgeworCV9fdTMyCWNtZDsKKwlfX3UzMgltYXhfcng7CisJX191MzIJbWF4X3R4OworCV9fdTMyCW1heF9vdGhlcjsKKwlfX3UzMgltYXhfY29tYmluZWQ7CisJX191MzIJcnhfY291bnQ7CisJX191MzIJdHhfY291bnQ7CisJX191MzIJb3RoZXJfY291bnQ7CisJX191MzIJY29tYmluZWRfY291bnQ7Cit9OworCisvKiBmb3IgY29uZmlndXJpbmcgbGluayBmbG93IGNvbnRyb2wgcGFyYW1ldGVycyAqLworc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSB7CisJX191MzIJY21kOwkvKiBFVEhUT09MX3tHLFN9UEFVU0VQQVJBTSAqLworCisJLyogSWYgdGhlIGxpbmsgaXMgYmVpbmcgYXV0by1uZWdvdGlhdGVkICh2aWEgZXRodG9vbF9jbWQuYXV0b25lZworCSAqIGJlaW5nIHRydWUpIHRoZSB1c2VyIG1heSBzZXQgJ2F1dG9uZWcnIGhlcmUgbm9uLXplcm8gdG8gaGF2ZSB0aGUKKwkgKiBwYXVzZSBwYXJhbWV0ZXJzIGJlIGF1dG8tbmVnb3RpYXRlZCB0b28uICBJbiBzdWNoIGEgY2FzZSwgdGhlCisJICoge3J4LHR4fV9wYXVzZSB2YWx1ZXMgYmVsb3cgZGV0ZXJtaW5lIHdoYXQgY2FwYWJpbGl0aWVzIGFyZQorCSAqIGFkdmVydGlzZWQuCisJICoKKwkgKiBJZiAnYXV0b25lZycgaXMgemVybyBvciB0aGUgbGluayBpcyBub3QgYmVpbmcgYXV0by1uZWdvdGlhdGVkLAorCSAqIHRoZW4ge3J4LHR4fV9wYXVzZSBmb3JjZSB0aGUgZHJpdmVyIHRvIHVzZS9ub3QtdXNlIHBhdXNlCisJICogZmxvdyBjb250cm9sLgorCSAqLworCV9fdTMyCWF1dG9uZWc7CisJX191MzIJcnhfcGF1c2U7CisJX191MzIJdHhfcGF1c2U7Cit9OworCisjZGVmaW5lIEVUSF9HU1RSSU5HX0xFTgkJMzIKK2VudW0gZXRodG9vbF9zdHJpbmdzZXQgeworCUVUSF9TU19URVNUCQk9IDAsCisJRVRIX1NTX1NUQVRTLAorCUVUSF9TU19QUklWX0ZMQUdTLAorCUVUSF9TU19OVFVQTEVfRklMVEVSUywJLyogRG8gbm90IHVzZSwgR1JYTlRVUExFIGlzIG5vdyBkZXByZWNhdGVkICovCisJRVRIX1NTX0ZFQVRVUkVTLAorfTsKKworLyogZm9yIHBhc3Npbmcgc3RyaW5nIHNldHMgZm9yIGRhdGEgdGFnZ2luZyAqLworc3RydWN0IGV0aHRvb2xfZ3N0cmluZ3MgeworCV9fdTMyCWNtZDsJCS8qIEVUSFRPT0xfR1NUUklOR1MgKi8KKwlfX3UzMglzdHJpbmdfc2V0OwkvKiBzdHJpbmcgc2V0IGlkIGUuYy4gRVRIX1NTX1RFU1QsIGV0YyovCisJX191MzIJbGVuOwkJLyogbnVtYmVyIG9mIHN0cmluZ3MgaW4gdGhlIHN0cmluZyBzZXQgKi8KKwlfX3U4CWRhdGFbMF07Cit9OworCitzdHJ1Y3QgZXRodG9vbF9zc2V0X2luZm8geworCV9fdTMyCWNtZDsJCS8qIEVUSFRPT0xfR1NTRVRfSU5GTyAqLworCV9fdTMyCXJlc2VydmVkOworCV9fdTY0CXNzZXRfbWFzazsJLyogaW5wdXQ6IGVhY2ggYml0IHNlbGVjdHMgYW4gc3NldCB0byBxdWVyeSAqLworCQkJCS8qIG91dHB1dDogZWFjaCBiaXQgYSByZXR1cm5lZCBzc2V0ICovCisJX191MzIJZGF0YVswXTsJLyogRVRIX1NTX3h4eCBjb3VudCwgaW4gb3JkZXIsIGJhc2VkIG9uIGJpdHMKKwkJCQkgICBpbiBzc2V0X21hc2suICBPbmUgYml0IGltcGxpZXMgb25lCisJCQkJICAgX191MzIsIHR3byBiaXRzIGltcGxpZXMgdHdvCisJCQkJICAgX191MzIncywgZXRjLiAqLworfTsKKworLyoqCisgKiBlbnVtIGV0aHRvb2xfdGVzdF9mbGFncyAtIGZsYWdzIGRlZmluaXRpb24gb2YgZXRodG9vbF90ZXN0CisgKiBARVRIX1RFU1RfRkxfT0ZGTElORTogaWYgc2V0IHBlcmZvcm0gb25saW5lIGFuZCBvZmZsaW5lIHRlc3RzLCBvdGhlcndpc2UKKyAqCW9ubHkgb25saW5lIHRlc3RzLgorICogQEVUSF9URVNUX0ZMX0ZBSUxFRDogRHJpdmVyIHNldCB0aGlzIGZsYWcgaWYgdGVzdCBmYWlscy4KKyAqIEBFVEhfVEVTVF9GTF9FWFRFUk5BTF9MQjogQXBwbGljYXRpb24gcmVxdWVzdCB0byBwZXJmb3JtIGV4dGVybmFsIGxvb3BiYWNrCisgKgl0ZXN0LgorICogQEVUSF9URVNUX0ZMX0VYVEVSTkFMX0xCX0RPTkU6IERyaXZlciBwZXJmb3JtZWQgdGhlIGV4dGVybmFsIGxvb3BiYWNrIHRlc3QKKyAqLworCitlbnVtIGV0aHRvb2xfdGVzdF9mbGFncyB7CisJRVRIX1RFU1RfRkxfT0ZGTElORQk9ICgxIDw8IDApLAorCUVUSF9URVNUX0ZMX0ZBSUxFRAk9ICgxIDw8IDEpLAorCUVUSF9URVNUX0ZMX0VYVEVSTkFMX0xCCT0gKDEgPDwgMiksCisJRVRIX1RFU1RfRkxfRVhURVJOQUxfTEJfRE9ORQk9ICgxIDw8IDMpLAorfTsKKworLyogZm9yIHJlcXVlc3RpbmcgTklDIHRlc3QgYW5kIGdldHRpbmcgcmVzdWx0cyovCitzdHJ1Y3QgZXRodG9vbF90ZXN0IHsKKwlfX3UzMgljbWQ7CQkvKiBFVEhUT09MX1RFU1QgKi8KKwlfX3UzMglmbGFnczsJCS8qIEVUSF9URVNUX0ZMX3h4eCAqLworCV9fdTMyCXJlc2VydmVkOworCV9fdTMyCWxlbjsJCS8qIHJlc3VsdCBsZW5ndGgsIGluIG51bWJlciBvZiB1NjQgZWxlbWVudHMgKi8KKwlfX3U2NAlkYXRhWzBdOworfTsKKworLyogZm9yIGR1bXBpbmcgTklDLXNwZWNpZmljIHN0YXRpc3RpY3MgKi8KK3N0cnVjdCBldGh0b29sX3N0YXRzIHsKKwlfX3UzMgljbWQ7CQkvKiBFVEhUT09MX0dTVEFUUyAqLworCV9fdTMyCW5fc3RhdHM7CS8qIG51bWJlciBvZiB1NjQncyBiZWluZyByZXR1cm5lZCAqLworCV9fdTY0CWRhdGFbMF07Cit9OworCitzdHJ1Y3QgZXRodG9vbF9wZXJtX2FkZHIgeworCV9fdTMyCWNtZDsJCS8qIEVUSFRPT0xfR1BFUk1BRERSICovCisJX191MzIJc2l6ZTsKKwlfX3U4CWRhdGFbMF07Cit9OworCisvKiBib29sZWFuIGZsYWdzIGNvbnRyb2xsaW5nIHBlci1pbnRlcmZhY2UgYmVoYXZpb3IgY2hhcmFjdGVyaXN0aWNzLgorICogV2hlbiByZWFkaW5nLCB0aGUgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgYSBjZXJ0YWluIGJlaGF2aW9yCisgKiBpcyBlbmFibGVkL3ByZXNlbnQuICBXaGVuIHdyaXRpbmcsIHRoZSBmbGFnIGluZGljYXRlcyB3aGV0aGVyCisgKiBvciBub3QgdGhlIGRyaXZlciBzaG91bGQgdHVybiBvbiAoc2V0KSBvciBvZmYgKGNsZWFyKSBhIGJlaGF2aW9yLgorICoKKyAqIFNvbWUgYmVoYXZpb3JzIG1heSByZWFkLW9ubHkgKHVuY29uZGl0aW9uYWxseSBhYnNlbnQgb3IgcHJlc2VudCkuCisgKiBJZiBzdWNoIGlzIHRoZSBjYXNlLCByZXR1cm4gRUlOVkFMIGluIHRoZSBzZXQtZmxhZ3Mgb3BlcmF0aW9uIGlmIHRoZQorICogZmxhZyBkaWZmZXJzIGZyb20gdGhlIHJlYWQtb25seSB2YWx1ZS4KKyAqLworZW51bSBldGh0b29sX2ZsYWdzIHsKKwlFVEhfRkxBR19UWFZMQU4JCT0gKDEgPDwgNyksCS8qIFRYIFZMQU4gb2ZmbG9hZCBlbmFibGVkICovCisJRVRIX0ZMQUdfUlhWTEFOCQk9ICgxIDw8IDgpLAkvKiBSWCBWTEFOIG9mZmxvYWQgZW5hYmxlZCAqLworCUVUSF9GTEFHX0xSTwkJPSAoMSA8PCAxNSksCS8qIExSTyBpcyBlbmFibGVkICovCisJRVRIX0ZMQUdfTlRVUExFCQk9ICgxIDw8IDI3KSwJLyogTi10dXBsZSBmaWx0ZXJzIGVuYWJsZWQgKi8KKwlFVEhfRkxBR19SWEhBU0gJCT0gKDEgPDwgMjgpLAorfTsKKworLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmVzIGFyZSBmb3Igc3VwcG9ydGluZyBSWCBuZXR3b3JrIGZsb3cKKyAqIGNsYXNzaWZpY2F0aW9uIGFuZCBSWCBuLXR1cGxlIGNvbmZpZ3VyYXRpb24uIE5vdGUsIGFsbCBtdWx0aWJ5dGUKKyAqIGZpZWxkcywgZS5nLiwgaXA0c3JjLCBpcDRkc3QsIHBzcmMsIHBkc3QsIHNwaSwgZXRjLiBhcmUgZXhwZWN0ZWQgdG8KKyAqIGJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqLworCisvKioKKyAqIHN0cnVjdCBldGh0b29sX3RjcGlwNF9zcGVjIC0gZmxvdyBzcGVjaWZpY2F0aW9uIGZvciBUQ1AvSVB2NCBldGMuCisgKiBAaXA0c3JjOiBTb3VyY2UgaG9zdAorICogQGlwNGRzdDogRGVzdGluYXRpb24gaG9zdAorICogQHBzcmM6IFNvdXJjZSBwb3J0CisgKiBAcGRzdDogRGVzdGluYXRpb24gcG9ydAorICogQHRvczogVHlwZS1vZi1zZXJ2aWNlCisgKgorICogVGhpcyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgVENQL0lQdjQsIFVEUC9JUHY0IG9yIFNDVFAvSVB2NCBmbG93LgorICovCitzdHJ1Y3QgZXRodG9vbF90Y3BpcDRfc3BlYyB7CisJX19iZTMyCWlwNHNyYzsKKwlfX2JlMzIJaXA0ZHN0OworCV9fYmUxNglwc3JjOworCV9fYmUxNglwZHN0OworCV9fdTggICAgdG9zOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZXRodG9vbF9haF9lc3BpcDRfc3BlYyAtIGZsb3cgc3BlY2lmaWNhdGlvbiBmb3IgSVBzZWMvSVB2NAorICogQGlwNHNyYzogU291cmNlIGhvc3QKKyAqIEBpcDRkc3Q6IERlc3RpbmF0aW9uIGhvc3QKKyAqIEBzcGk6IFNlY3VyaXR5IHBhcmFtZXRlcnMgaW5kZXgKKyAqIEB0b3M6IFR5cGUtb2Ytc2VydmljZQorICoKKyAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBJUHNlYyB0cmFuc3BvcnQgb3IgdHVubmVsIG92ZXIgSVB2NC4KKyAqLworc3RydWN0IGV0aHRvb2xfYWhfZXNwaXA0X3NwZWMgeworCV9fYmUzMglpcDRzcmM7CisJX19iZTMyCWlwNGRzdDsKKwlfX2JlMzIJc3BpOworCV9fdTggICAgdG9zOworfTsKKworI2RlZmluZQlFVEhfUlhfTkZDX0lQNAkxCisKKy8qKgorICogc3RydWN0IGV0aHRvb2xfdXNyaXA0X3NwZWMgLSBnZW5lcmFsIGZsb3cgc3BlY2lmaWNhdGlvbiBmb3IgSVB2NAorICogQGlwNHNyYzogU291cmNlIGhvc3QKKyAqIEBpcDRkc3Q6IERlc3RpbmF0aW9uIGhvc3QKKyAqIEBsNF80X2J5dGVzOiBGaXJzdCA0IGJ5dGVzIG9mIHRyYW5zcG9ydCAobGF5ZXIgNCkgaGVhZGVyCisgKiBAdG9zOiBUeXBlLW9mLXNlcnZpY2UKKyAqIEBpcF92ZXI6IFZhbHVlIG11c3QgYmUgJUVUSF9SWF9ORkNfSVA0OyBtYXNrIG11c3QgYmUgMAorICogQHByb3RvOiBUcmFuc3BvcnQgcHJvdG9jb2wgbnVtYmVyOyBtYXNrIG11c3QgYmUgMAorICovCitzdHJ1Y3QgZXRodG9vbF91c3JpcDRfc3BlYyB7CisJX19iZTMyCWlwNHNyYzsKKwlfX2JlMzIJaXA0ZHN0OworCV9fYmUzMglsNF80X2J5dGVzOworCV9fdTggICAgdG9zOworCV9fdTggICAgaXBfdmVyOworCV9fdTggICAgcHJvdG87Cit9OworCit1bmlvbiBldGh0b29sX2Zsb3dfdW5pb24geworCXN0cnVjdCBldGh0b29sX3RjcGlwNF9zcGVjCQl0Y3BfaXA0X3NwZWM7CisJc3RydWN0IGV0aHRvb2xfdGNwaXA0X3NwZWMJCXVkcF9pcDRfc3BlYzsKKwlzdHJ1Y3QgZXRodG9vbF90Y3BpcDRfc3BlYwkJc2N0cF9pcDRfc3BlYzsKKwlzdHJ1Y3QgZXRodG9vbF9haF9lc3BpcDRfc3BlYwkJYWhfaXA0X3NwZWM7CisJc3RydWN0IGV0aHRvb2xfYWhfZXNwaXA0X3NwZWMJCWVzcF9pcDRfc3BlYzsKKwlzdHJ1Y3QgZXRodG9vbF91c3JpcDRfc3BlYwkJdXNyX2lwNF9zcGVjOworCXN0cnVjdCBldGhoZHIJCQkJZXRoZXJfc3BlYzsKKwlfX3U4CQkJCQloZGF0YVs2MF07Cit9OworCitzdHJ1Y3QgZXRodG9vbF9mbG93X2V4dCB7CisJX19iZTE2CXZsYW5fZXR5cGU7CisJX19iZTE2CXZsYW5fdGNpOworCV9fYmUzMglkYXRhWzJdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZXRodG9vbF9yeF9mbG93X3NwZWMgLSBjbGFzc2lmaWNhdGlvbiBydWxlIGZvciBSWCBmbG93cworICogQGZsb3dfdHlwZTogVHlwZSBvZiBtYXRjaCB0byBwZXJmb3JtLCBlLmcuICVUQ1BfVjRfRkxPVworICogQGhfdTogRmxvdyBmaWVsZHMgdG8gbWF0Y2ggKGRlcGVuZGVudCBvbiBAZmxvd190eXBlKQorICogQGhfZXh0OiBBZGRpdGlvbmFsIGZpZWxkcyB0byBtYXRjaAorICogQG1fdTogTWFza3MgZm9yIGZsb3cgZmllbGQgYml0cyB0byBiZSBtYXRjaGVkCisgKiBAbV9leHQ6IE1hc2tzIGZvciBhZGRpdGlvbmFsIGZpZWxkIGJpdHMgdG8gYmUgbWF0Y2hlZAorICoJTm90ZSwgYWxsIGFkZGl0aW9uYWwgZmllbGRzIG11c3QgYmUgaWdub3JlZCB1bmxlc3MgQGZsb3dfdHlwZQorICoJaW5jbHVkZXMgdGhlICVGTE9XX0VYVCBmbGFnLgorICogQHJpbmdfY29va2llOiBSWCByaW5nL3F1ZXVlIGluZGV4IHRvIGRlbGl2ZXIgdG8sIG9yICVSWF9DTFNfRkxPV19ESVNDCisgKglpZiBwYWNrZXRzIHNob3VsZCBiZSBkaXNjYXJkZWQKKyAqIEBsb2NhdGlvbjogTG9jYXRpb24gb2YgcnVsZSBpbiB0aGUgdGFibGUuICBMb2NhdGlvbnMgbXVzdCBiZQorICoJbnVtYmVyZWQgc3VjaCB0aGF0IGEgZmxvdyBtYXRjaGluZyBtdWx0aXBsZSBydWxlcyB3aWxsIGJlCisgKgljbGFzc2lmaWVkIGFjY29yZGluZyB0byB0aGUgZmlyc3QgKGxvd2VzdCBudW1iZXJlZCkgcnVsZS4KKyAqLworc3RydWN0IGV0aHRvb2xfcnhfZmxvd19zcGVjIHsKKwlfX3UzMgkJZmxvd190eXBlOworCXVuaW9uIGV0aHRvb2xfZmxvd191bmlvbiBoX3U7CisJc3RydWN0IGV0aHRvb2xfZmxvd19leHQgaF9leHQ7CisJdW5pb24gZXRodG9vbF9mbG93X3VuaW9uIG1fdTsKKwlzdHJ1Y3QgZXRodG9vbF9mbG93X2V4dCBtX2V4dDsKKwlfX3U2NAkJcmluZ19jb29raWU7CisJX191MzIJCWxvY2F0aW9uOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZXRodG9vbF9yeG5mYyAtIGNvbW1hbmQgdG8gZ2V0IG9yIHNldCBSWCBmbG93IGNsYXNzaWZpY2F0aW9uIHJ1bGVzCisgKiBAY21kOiBTcGVjaWZpYyBjb21tYW5kIG51bWJlciAtICVFVEhUT09MX0dSWEZILCAlRVRIVE9PTF9TUlhGSCwKKyAqCSVFVEhUT09MX0dSWFJJTkdTLCAlRVRIVE9PTF9HUlhDTFNSTENOVCwgJUVUSFRPT0xfR1JYQ0xTUlVMRSwKKyAqCSVFVEhUT09MX0dSWENMU1JMQUxMLCAlRVRIVE9PTF9TUlhDTFNSTERFTCBvciAlRVRIVE9PTF9TUlhDTFNSTElOUworICogQGZsb3dfdHlwZTogVHlwZSBvZiBmbG93IHRvIGJlIGFmZmVjdGVkLCBlLmcuICVUQ1BfVjRfRkxPVworICogQGRhdGE6IENvbW1hbmQtZGVwZW5kZW50IHZhbHVlCisgKiBAZnM6IEZsb3cgY2xhc3NpZmljYXRpb24gcnVsZQorICogQHJ1bGVfY250OiBOdW1iZXIgb2YgcnVsZXMgdG8gYmUgYWZmZWN0ZWQKKyAqIEBydWxlX2xvY3M6IEFycmF5IG9mIHVzZWQgcnVsZSBsb2NhdGlvbnMKKyAqCisgKiBGb3IgJUVUSFRPT0xfR1JYRkggYW5kICVFVEhUT09MX1NSWEZILCBAZGF0YSBpcyBhIGJpdG1hc2sgaW5kaWNhdGluZworICogdGhlIGZpZWxkcyBpbmNsdWRlZCBpbiB0aGUgZmxvdyBoYXNoLCBlLmcuICVSWEhfSVBfU1JDLiAgVGhlIGZvbGxvd2luZworICogc3RydWN0dXJlIGZpZWxkcyBtdXN0IG5vdCBiZSB1c2VkLgorICoKKyAqIEZvciAlRVRIVE9PTF9HUlhSSU5HUywgQGRhdGEgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgUlggcmluZ3MvcXVldWVzCisgKiBvbiByZXR1cm4uCisgKgorICogRm9yICVFVEhUT09MX0dSWENMU1JMQ05ULCBAcnVsZV9jbnQgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgZGVmaW5lZAorICogcnVsZXMgb24gcmV0dXJuLgorICoKKyAqIEZvciAlRVRIVE9PTF9HUlhDTFNSVUxFLCBAZnMuQGxvY2F0aW9uIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgYW4KKyAqIGV4aXN0aW5nIHJ1bGUgb24gZW50cnkgYW5kIEBmcyBjb250YWlucyB0aGUgcnVsZSBvbiByZXR1cm4uCisgKgorICogRm9yICVFVEhUT09MX0dSWENMU1JMQUxMLCBAcnVsZV9jbnQgc3BlY2lmaWVzIHRoZSBhcnJheSBzaXplIG9mIHRoZQorICogdXNlciBidWZmZXIgZm9yIEBydWxlX2xvY3Mgb24gZW50cnkuICBPbiByZXR1cm4sIEBkYXRhIGlzIHRoZSBzaXplCisgKiBvZiB0aGUgcnVsZSB0YWJsZSwgQHJ1bGVfY250IGlzIHRoZSBudW1iZXIgb2YgZGVmaW5lZCBydWxlcywgYW5kCisgKiBAcnVsZV9sb2NzIGNvbnRhaW5zIHRoZSBsb2NhdGlvbnMgb2YgdGhlIGRlZmluZWQgcnVsZXMuICBEcml2ZXJzCisgKiBtdXN0IHVzZSB0aGUgc2Vjb25kIHBhcmFtZXRlciB0byBnZXRfcnhuZmMoKSBpbnN0ZWFkIG9mIEBydWxlX2xvY3MuCisgKgorICogRm9yICVFVEhUT09MX1NSWENMU1JMSU5TLCBAZnMgc3BlY2lmaWVzIHRoZSBydWxlIHRvIGFkZCBvciB1cGRhdGUuCisgKiBAZnMuQGxvY2F0aW9uIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gdG8gdXNlIGFuZCBtdXN0IG5vdCBiZSBpZ25vcmVkLgorICoKKyAqIEZvciAlRVRIVE9PTF9TUlhDTFNSTERFTCwgQGZzLkBsb2NhdGlvbiBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIGFuCisgKiBleGlzdGluZyBydWxlIG9uIGVudHJ5LgorICovCitzdHJ1Y3QgZXRodG9vbF9yeG5mYyB7CisJX191MzIJCQkJY21kOworCV9fdTMyCQkJCWZsb3dfdHlwZTsKKwlfX3U2NAkJCQlkYXRhOworCXN0cnVjdCBldGh0b29sX3J4X2Zsb3dfc3BlYwlmczsKKwlfX3UzMgkJCQlydWxlX2NudDsKKwlfX3UzMgkJCQlydWxlX2xvY3NbMF07Cit9OworCisKKy8qKgorICogc3RydWN0IGV0aHRvb2xfcnhmaF9pbmRpciAtIGNvbW1hbmQgdG8gZ2V0IG9yIHNldCBSWCBmbG93IGhhc2ggaW5kaXJlY3Rpb24KKyAqIEBjbWQ6IFNwZWNpZmljIGNvbW1hbmQgbnVtYmVyIC0gJUVUSFRPT0xfR1JYRkhJTkRJUiBvciAlRVRIVE9PTF9TUlhGSElORElSCisgKiBAc2l6ZTogT24gZW50cnksIHRoZSBhcnJheSBzaXplIG9mIHRoZSB1c2VyIGJ1ZmZlci4gIE9uIHJldHVybiBmcm9tCisgKgklRVRIVE9PTF9HUlhGSElORElSLCB0aGUgYXJyYXkgc2l6ZSBvZiB0aGUgaGFyZHdhcmUgaW5kaXJlY3Rpb24gdGFibGUuCisgKiBAcmluZ19pbmRleDogUlggcmluZy9xdWV1ZSBpbmRleCBmb3IgZWFjaCBoYXNoIHZhbHVlCisgKi8KK3N0cnVjdCBldGh0b29sX3J4ZmhfaW5kaXIgeworCV9fdTMyCWNtZDsKKwlfX3UzMglzaXplOworCV9fdTMyCXJpbmdfaW5kZXhbMF07Cit9OworCisvKioKKyAqIHN0cnVjdCBldGh0b29sX3J4X250dXBsZV9mbG93X3NwZWMgLSBzcGVjaWZpY2F0aW9uIGZvciBSWCBmbG93IGZpbHRlcgorICogQGZsb3dfdHlwZTogVHlwZSBvZiBtYXRjaCB0byBwZXJmb3JtLCBlLmcuICVUQ1BfVjRfRkxPVworICogQGhfdTogRmxvdyBmaWVsZCB2YWx1ZXMgdG8gbWF0Y2ggKGRlcGVuZGVudCBvbiBAZmxvd190eXBlKQorICogQG1fdTogTWFza3MgZm9yIGZsb3cgZmllbGQgdmFsdWUgYml0cyB0byBiZSBpZ25vcmVkCisgKiBAdmxhbl90YWc6IFZMQU4gdGFnIHRvIG1hdGNoCisgKiBAdmxhbl90YWdfbWFzazogTWFzayBmb3IgVkxBTiB0YWcgYml0cyB0byBiZSBpZ25vcmVkCisgKiBAZGF0YTogRHJpdmVyLWRlcGVuZGVudCBkYXRhIHRvIG1hdGNoCisgKiBAZGF0YV9tYXNrOiBNYXNrIGZvciBkcml2ZXItZGVwZW5kZW50IGRhdGEgYml0cyB0byBiZSBpZ25vcmVkCisgKiBAYWN0aW9uOiBSWCByaW5nL3F1ZXVlIGluZGV4IHRvIGRlbGl2ZXIgdG8gKG5vbi1uZWdhdGl2ZSkgb3Igb3RoZXIgYWN0aW9uCisgKgkobmVnYXRpdmUsIGUuZy4gJUVUSFRPT0xfUlhOVFVQTEVfQUNUSU9OX0RST1ApCisgKgorICogRm9yIGZsb3cgdHlwZXMgJVRDUF9WNF9GTE9XLCAlVURQX1Y0X0ZMT1cgYW5kICVTQ1RQX1Y0X0ZMT1csIHdoZXJlCisgKiBhIGZpZWxkIHZhbHVlIGFuZCBtYXNrIGFyZSBib3RoIHplcm8gdGhpcyBpcyB0cmVhdGVkIGFzIGlmIGFsbCBtYXNrCisgKiBiaXRzIGFyZSBzZXQgaS5lLiB0aGUgZmllbGQgaXMgaWdub3JlZC4KKyAqLworc3RydWN0IGV0aHRvb2xfcnhfbnR1cGxlX2Zsb3dfc3BlYyB7CisJX191MzIJCSBmbG93X3R5cGU7CisJdW5pb24geworCQlzdHJ1Y3QgZXRodG9vbF90Y3BpcDRfc3BlYwkJdGNwX2lwNF9zcGVjOworCQlzdHJ1Y3QgZXRodG9vbF90Y3BpcDRfc3BlYwkJdWRwX2lwNF9zcGVjOworCQlzdHJ1Y3QgZXRodG9vbF90Y3BpcDRfc3BlYwkJc2N0cF9pcDRfc3BlYzsKKwkJc3RydWN0IGV0aHRvb2xfYWhfZXNwaXA0X3NwZWMJCWFoX2lwNF9zcGVjOworCQlzdHJ1Y3QgZXRodG9vbF9haF9lc3BpcDRfc3BlYwkJZXNwX2lwNF9zcGVjOworCQlzdHJ1Y3QgZXRodG9vbF91c3JpcDRfc3BlYwkJdXNyX2lwNF9zcGVjOworCQlzdHJ1Y3QgZXRoaGRyCQkJCWV0aGVyX3NwZWM7CisJCV9fdTgJCQkJCWhkYXRhWzcyXTsKKwl9IGhfdSwgbV91OworCisJX191MTYJICAgICAgICB2bGFuX3RhZzsKKwlfX3UxNgkgICAgICAgIHZsYW5fdGFnX21hc2s7CisJX191NjQJCWRhdGE7CisJX191NjQJCWRhdGFfbWFzazsKKworCV9fczMyCQlhY3Rpb247CisjZGVmaW5lIEVUSFRPT0xfUlhOVFVQTEVfQUNUSU9OX0RST1AJKC0xKQkvKiBkcm9wIHBhY2tldCAqLworI2RlZmluZSBFVEhUT09MX1JYTlRVUExFX0FDVElPTl9DTEVBUgkoLTIpCS8qIGNsZWFyIGZpbHRlciAqLworfTsKKworLyoqCisgKiBzdHJ1Y3QgZXRodG9vbF9yeF9udHVwbGUgLSBjb21tYW5kIHRvIHNldCBvciBjbGVhciBSWCBmbG93IGZpbHRlcgorICogQGNtZDogQ29tbWFuZCBudW1iZXIgLSAlRVRIVE9PTF9TUlhOVFVQTEUKKyAqIEBmczogRmxvdyBmaWx0ZXIgc3BlY2lmaWNhdGlvbgorICovCitzdHJ1Y3QgZXRodG9vbF9yeF9udHVwbGUgeworCV9fdTMyCQkJCQljbWQ7CisJc3RydWN0IGV0aHRvb2xfcnhfbnR1cGxlX2Zsb3dfc3BlYwlmczsKK307CisKKyNkZWZpbmUgRVRIVE9PTF9GTEFTSF9NQVhfRklMRU5BTUUJMTI4CitlbnVtIGV0aHRvb2xfZmxhc2hfb3BfdHlwZSB7CisJRVRIVE9PTF9GTEFTSF9BTExfUkVHSU9OUwk9IDAsCit9OworCisvKiBmb3IgcGFzc2luZyBmaXJtd2FyZSBmbGFzaGluZyByZWxhdGVkIHBhcmFtZXRlcnMgKi8KK3N0cnVjdCBldGh0b29sX2ZsYXNoIHsKKwlfX3UzMgljbWQ7CisJX191MzIJcmVnaW9uOworCWNoYXIJZGF0YVtFVEhUT09MX0ZMQVNIX01BWF9GSUxFTkFNRV07Cit9OworCisvKioKKyAqIHN0cnVjdCBldGh0b29sX2R1bXAgLSB1c2VkIGZvciByZXRyaWV2aW5nLCBzZXR0aW5nIGRldmljZSBkdW1wCisgKiBAY21kOiBDb21tYW5kIG51bWJlciAtICVFVEhUT09MX0dFVF9EVU1QX0ZMQUcsICVFVEhUT09MX0dFVF9EVU1QX0RBVEEsIG9yCisgKiAJJUVUSFRPT0xfU0VUX0RVTVAKKyAqIEB2ZXJzaW9uOiBGVyB2ZXJzaW9uIG9mIHRoZSBkdW1wLCBmaWxsZWQgaW4gYnkgZHJpdmVyCisgKiBAZmxhZzogZHJpdmVyIGRlcGVuZGVudCBmbGFnIGZvciBkdW1wIHNldHRpbmcsIGZpbGxlZCBpbiBieSBkcml2ZXIgZHVyaW5nCisgKiAJICBnZXQgYW5kIGZpbGxlZCBpbiBieSBldGh0b29sIGZvciBzZXQgb3BlcmF0aW9uCisgKiBAbGVuOiBsZW5ndGggb2YgZHVtcCBkYXRhLCB1c2VkIGFzIHRoZSBsZW5ndGggb2YgdGhlIHVzZXIgYnVmZmVyIG9uIGVudHJ5IHRvCisgKiAJICVFVEhUT09MX0dFVF9EVU1QX0RBVEEgYW5kIHRoaXMgaXMgcmV0dXJuZWQgYXMgZHVtcCBsZW5ndGggYnkgZHJpdmVyCisgKiAJIGZvciAlRVRIVE9PTF9HRVRfRFVNUF9GTEFHIGNvbW1hbmQKKyAqIEBkYXRhOiBkYXRhIGNvbGxlY3RlZCBmb3IgZ2V0IGR1bXAgZGF0YSBvcGVyYXRpb24KKyAqLworc3RydWN0IGV0aHRvb2xfZHVtcCB7CisJX191MzIJY21kOworCV9fdTMyCXZlcnNpb247CisJX191MzIJZmxhZzsKKwlfX3UzMglsZW47CisJX191OAlkYXRhWzBdOworfTsKKworLyogZm9yIHJldHVybmluZyBhbmQgY2hhbmdpbmcgZmVhdHVyZSBzZXRzICovCisKKy8qKgorICogc3RydWN0IGV0aHRvb2xfZ2V0X2ZlYXR1cmVzX2Jsb2NrIC0gYmxvY2sgd2l0aCBzdGF0ZSBvZiAzMiBmZWF0dXJlcworICogQGF2YWlsYWJsZTogbWFzayBvZiBjaGFuZ2VhYmxlIGZlYXR1cmVzCisgKiBAcmVxdWVzdGVkOiBtYXNrIG9mIGZlYXR1cmVzIHJlcXVlc3RlZCB0byBiZSBlbmFibGVkIGlmIHBvc3NpYmxlCisgKiBAYWN0aXZlOiBtYXNrIG9mIGN1cnJlbnRseSBlbmFibGVkIGZlYXR1cmVzCisgKiBAbmV2ZXJfY2hhbmdlZDogbWFzayBvZiBmZWF0dXJlcyBub3QgY2hhbmdlYWJsZSBmb3IgYW55IGRldmljZQorICovCitzdHJ1Y3QgZXRodG9vbF9nZXRfZmVhdHVyZXNfYmxvY2sgeworCV9fdTMyCWF2YWlsYWJsZTsKKwlfX3UzMglyZXF1ZXN0ZWQ7CisJX191MzIJYWN0aXZlOworCV9fdTMyCW5ldmVyX2NoYW5nZWQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBldGh0b29sX2dmZWF0dXJlcyAtIGNvbW1hbmQgdG8gZ2V0IHN0YXRlIG9mIGRldmljZSdzIGZlYXR1cmVzCisgKiBAY21kOiBjb21tYW5kIG51bWJlciA9ICVFVEhUT09MX0dGRUFUVVJFUworICogQHNpemU6IGluOiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGZlYXR1cmVzW10gYXJyYXk7CisgKiAgICAgICBvdXQ6IG51bWJlciBvZiBlbGVtZW50cyBpbiBmZWF0dXJlc1tdIG5lZWRlZCB0byBob2xkIGFsbCBmZWF0dXJlcworICogQGZlYXR1cmVzOiBzdGF0ZSBvZiBmZWF0dXJlcworICovCitzdHJ1Y3QgZXRodG9vbF9nZmVhdHVyZXMgeworCV9fdTMyCWNtZDsKKwlfX3UzMglzaXplOworCXN0cnVjdCBldGh0b29sX2dldF9mZWF0dXJlc19ibG9jayBmZWF0dXJlc1swXTsKK307CisKKy8qKgorICogc3RydWN0IGV0aHRvb2xfc2V0X2ZlYXR1cmVzX2Jsb2NrIC0gYmxvY2sgd2l0aCByZXF1ZXN0IGZvciAzMiBmZWF0dXJlcworICogQHZhbGlkOiBtYXNrIG9mIGZlYXR1cmVzIHRvIGJlIGNoYW5nZWQKKyAqIEByZXF1ZXN0ZWQ6IHZhbHVlcyBvZiBmZWF0dXJlcyB0byBiZSBjaGFuZ2VkCisgKi8KK3N0cnVjdCBldGh0b29sX3NldF9mZWF0dXJlc19ibG9jayB7CisJX191MzIJdmFsaWQ7CisJX191MzIJcmVxdWVzdGVkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZXRodG9vbF9zZmVhdHVyZXMgLSBjb21tYW5kIHRvIHJlcXVlc3QgY2hhbmdlIGluIGRldmljZSdzIGZlYXR1cmVzCisgKiBAY21kOiBjb21tYW5kIG51bWJlciA9ICVFVEhUT09MX1NGRUFUVVJFUworICogQHNpemU6IGFycmF5IHNpemUgb2YgdGhlIGZlYXR1cmVzW10gYXJyYXkKKyAqIEBmZWF0dXJlczogZmVhdHVyZSBjaGFuZ2UgbWFza3MKKyAqLworc3RydWN0IGV0aHRvb2xfc2ZlYXR1cmVzIHsKKwlfX3UzMgljbWQ7CisJX191MzIJc2l6ZTsKKwlzdHJ1Y3QgZXRodG9vbF9zZXRfZmVhdHVyZXNfYmxvY2sgZmVhdHVyZXNbMF07Cit9OworCisvKgorICogJUVUSFRPT0xfU0ZFQVRVUkVTIGNoYW5nZXMgZmVhdHVyZXMgcHJlc2VudCBpbiBmZWF0dXJlc1tdLnZhbGlkIHRvIHRoZQorICogdmFsdWVzIG9mIGNvcnJlc3BvbmRpbmcgYml0cyBpbiBmZWF0dXJlc1tdLnJlcXVlc3RlZC4gQml0cyBpbiAucmVxdWVzdGVkCisgKiBub3Qgc2V0IGluIC52YWxpZCBvciBub3QgY2hhbmdlYWJsZSBhcmUgaWdub3JlZC4KKyAqCisgKiBSZXR1cm5zICVFSU5WQUwgd2hlbiAudmFsaWQgY29udGFpbnMgdW5kZWZpbmVkIG9yIG5ldmVyLWNoYW5nZWFibGUgYml0cworICogb3Igc2l6ZSBpcyBub3QgZXF1YWwgdG8gcmVxdWlyZWQgbnVtYmVyIG9mIGZlYXR1cmVzIHdvcmRzICgzMi1iaXQgYmxvY2tzKS4KKyAqIFJldHVybnMgPj0gMCBpZiByZXF1ZXN0IHdhcyBjb21wbGV0ZWQ7IGJpdHMgc2V0IGluIHRoZSB2YWx1ZSBtZWFuOgorICogICAlRVRIVE9PTF9GX1VOU1VQUE9SVEVEIC0gdGhlcmUgd2VyZSBiaXRzIHNldCBpbiAudmFsaWQgdGhhdCBhcmUgbm90CisgKgljaGFuZ2VhYmxlIChub3QgcHJlc2VudCBpbiAlRVRIVE9PTF9HRkVBVFVSRVMnIGZlYXR1cmVzW10uYXZhaWxhYmxlKQorICoJdGhvc2UgYml0cyB3ZXJlIGlnbm9yZWQuCisgKiAgICVFVEhUT09MX0ZfV0lTSCAtIHNvbWUgb3IgYWxsIGNoYW5nZXMgcmVxdWVzdGVkIHdlcmUgcmVjb3JkZWQgYnV0IHRoZQorICogICAgICByZXN1bHRpbmcgc3RhdGUgb2YgYml0cyBtYXNrZWQgYnkgLnZhbGlkIGlzIG5vdCBlcXVhbCB0byAucmVxdWVzdGVkLgorICogICAgICBQcm9iYWJseSB0aGVyZSBhcmUgb3RoZXIgZGV2aWNlLXNwZWNpZmljIGNvbnN0cmFpbnRzIG9uIHNvbWUgZmVhdHVyZXMKKyAqICAgICAgaW4gdGhlIHNldC4gV2hlbiAlRVRIVE9PTF9GX1VOU1VQUE9SVEVEIGlzIHNldCwgLnZhbGlkIGlzIGNvbnNpZGVyZWQKKyAqICAgICAgaGVyZSBhcyB0aG91Z2ggaWdub3JlZCBiaXRzIHdlcmUgY2xlYXJlZC4KKyAqICAgJUVUSFRPT0xfRl9DT01QQVQgLSBzb21lIG9yIGFsbCBjaGFuZ2VzIHJlcXVlc3RlZCB3ZXJlIG1hZGUgYnkgY2FsbGluZworICogICAgICBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucy4gUmVxdWVzdGVkIG9mZmxvYWQgc3RhdGUgY2Fubm90IGJlIHByb3Blcmx5CisgKiAgICAgIG1hbmFnZWQgYnkga2VybmVsLgorICoKKyAqIE1lYW5pbmcgb2YgYml0cyBpbiB0aGUgbWFza3MgYXJlIG9idGFpbmVkIGJ5ICVFVEhUT09MX0dTU0VUX0lORk8gKG51bWJlciBvZgorICogYml0cyBpbiB0aGUgYXJyYXlzIC0gYWx3YXlzIG11bHRpcGxlIG9mIDMyKSBhbmQgJUVUSFRPT0xfR1NUUklOR1MgY29tbWFuZHMKKyAqIGZvciBFVEhfU1NfRkVBVFVSRVMgc3RyaW5nIHNldC4gRmlyc3QgZW50cnkgaW4gdGhlIHRhYmxlIGNvcnJlc3BvbmRzIHRvIGxlYXN0CisgKiBzaWduaWZpY2FudCBiaXQgaW4gZmVhdHVyZXNbMF0gZmllbGRzLiBFbXB0eSBzdHJpbmdzIG1hcmsgdW5kZWZpbmVkIGZlYXR1cmVzLgorICovCitlbnVtIGV0aHRvb2xfc2ZlYXR1cmVzX3JldHZhbF9iaXRzIHsKKwlFVEhUT09MX0ZfVU5TVVBQT1JURURfX0JJVCwKKwlFVEhUT09MX0ZfV0lTSF9fQklULAorCUVUSFRPT0xfRl9DT01QQVRfX0JJVCwKK307CisKKyNkZWZpbmUgRVRIVE9PTF9GX1VOU1VQUE9SVEVEICAgKDEgPDwgRVRIVE9PTF9GX1VOU1VQUE9SVEVEX19CSVQpCisjZGVmaW5lIEVUSFRPT0xfRl9XSVNIICAgICAgICAgICgxIDw8IEVUSFRPT0xfRl9XSVNIX19CSVQpCisjZGVmaW5lIEVUSFRPT0xfRl9DT01QQVQgICAgICAgICgxIDw8IEVUSFRPT0xfRl9DT01QQVRfX0JJVCkKKworCisvKiBDTURzIGN1cnJlbnRseSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgRVRIVE9PTF9HU0VUCQkweDAwMDAwMDAxIC8qIEdldCBzZXR0aW5ncy4gKi8KKyNkZWZpbmUgRVRIVE9PTF9TU0VUCQkweDAwMDAwMDAyIC8qIFNldCBzZXR0aW5ncy4gKi8KKyNkZWZpbmUgRVRIVE9PTF9HRFJWSU5GTwkweDAwMDAwMDAzIC8qIEdldCBkcml2ZXIgaW5mby4gKi8KKyNkZWZpbmUgRVRIVE9PTF9HUkVHUwkJMHgwMDAwMDAwNCAvKiBHZXQgTklDIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgRVRIVE9PTF9HV09MCQkweDAwMDAwMDA1IC8qIEdldCB3YWtlLW9uLWxhbiBvcHRpb25zLiAqLworI2RlZmluZSBFVEhUT09MX1NXT0wJCTB4MDAwMDAwMDYgLyogU2V0IHdha2Utb24tbGFuIG9wdGlvbnMuICovCisjZGVmaW5lIEVUSFRPT0xfR01TR0xWTAkJMHgwMDAwMDAwNyAvKiBHZXQgZHJpdmVyIG1lc3NhZ2UgbGV2ZWwgKi8KKyNkZWZpbmUgRVRIVE9PTF9TTVNHTFZMCQkweDAwMDAwMDA4IC8qIFNldCBkcml2ZXIgbXNnIGxldmVsLiAqLworI2RlZmluZSBFVEhUT09MX05XQVlfUlNUCTB4MDAwMDAwMDkgLyogUmVzdGFydCBhdXRvbmVnb3RpYXRpb24uICovCisvKiBHZXQgbGluayBzdGF0dXMgZm9yIGhvc3QsIGkuZS4gd2hldGhlciB0aGUgaW50ZXJmYWNlICphbmQqIHRoZQorICogcGh5c2ljYWwgcG9ydCAoaWYgdGhlcmUgaXMgb25lKSBhcmUgdXAgKGV0aHRvb2xfdmFsdWUpLiAqLworI2RlZmluZSBFVEhUT09MX0dMSU5LCQkweDAwMDAwMDBhCisjZGVmaW5lIEVUSFRPT0xfR0VFUFJPTQkJMHgwMDAwMDAwYiAvKiBHZXQgRUVQUk9NIGRhdGEgKi8KKyNkZWZpbmUgRVRIVE9PTF9TRUVQUk9NCQkweDAwMDAwMDBjIC8qIFNldCBFRVBST00gZGF0YS4gKi8KKyNkZWZpbmUgRVRIVE9PTF9HQ09BTEVTQ0UJMHgwMDAwMDAwZSAvKiBHZXQgY29hbGVzY2UgY29uZmlnICovCisjZGVmaW5lIEVUSFRPT0xfU0NPQUxFU0NFCTB4MDAwMDAwMGYgLyogU2V0IGNvYWxlc2NlIGNvbmZpZy4gKi8KKyNkZWZpbmUgRVRIVE9PTF9HUklOR1BBUkFNCTB4MDAwMDAwMTAgLyogR2V0IHJpbmcgcGFyYW1ldGVycyAqLworI2RlZmluZSBFVEhUT09MX1NSSU5HUEFSQU0JMHgwMDAwMDAxMSAvKiBTZXQgcmluZyBwYXJhbWV0ZXJzLiAqLworI2RlZmluZSBFVEhUT09MX0dQQVVTRVBBUkFNCTB4MDAwMDAwMTIgLyogR2V0IHBhdXNlIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgRVRIVE9PTF9TUEFVU0VQQVJBTQkweDAwMDAwMDEzIC8qIFNldCBwYXVzZSBwYXJhbWV0ZXJzLiAqLworI2RlZmluZSBFVEhUT09MX0dSWENTVU0JCTB4MDAwMDAwMTQgLyogR2V0IFJYIGh3IGNzdW0gZW5hYmxlIChldGh0b29sX3ZhbHVlKSAqLworI2RlZmluZSBFVEhUT09MX1NSWENTVU0JCTB4MDAwMDAwMTUgLyogU2V0IFJYIGh3IGNzdW0gZW5hYmxlIChldGh0b29sX3ZhbHVlKSAqLworI2RlZmluZSBFVEhUT09MX0dUWENTVU0JCTB4MDAwMDAwMTYgLyogR2V0IFRYIGh3IGNzdW0gZW5hYmxlIChldGh0b29sX3ZhbHVlKSAqLworI2RlZmluZSBFVEhUT09MX1NUWENTVU0JCTB4MDAwMDAwMTcgLyogU2V0IFRYIGh3IGNzdW0gZW5hYmxlIChldGh0b29sX3ZhbHVlKSAqLworI2RlZmluZSBFVEhUT09MX0dTRwkJMHgwMDAwMDAxOCAvKiBHZXQgc2NhdHRlci1nYXRoZXIgZW5hYmxlCisJCQkJCSAgICAqIChldGh0b29sX3ZhbHVlKSAqLworI2RlZmluZSBFVEhUT09MX1NTRwkJMHgwMDAwMDAxOSAvKiBTZXQgc2NhdHRlci1nYXRoZXIgZW5hYmxlCisJCQkJCSAgICAqIChldGh0b29sX3ZhbHVlKS4gKi8KKyNkZWZpbmUgRVRIVE9PTF9URVNUCQkweDAwMDAwMDFhIC8qIGV4ZWN1dGUgTklDIHNlbGYtdGVzdC4gKi8KKyNkZWZpbmUgRVRIVE9PTF9HU1RSSU5HUwkweDAwMDAwMDFiIC8qIGdldCBzcGVjaWZpZWQgc3RyaW5nIHNldCAqLworI2RlZmluZSBFVEhUT09MX1BIWVNfSUQJCTB4MDAwMDAwMWMgLyogaWRlbnRpZnkgdGhlIE5JQyAqLworI2RlZmluZSBFVEhUT09MX0dTVEFUUwkJMHgwMDAwMDAxZCAvKiBnZXQgTklDLXNwZWNpZmljIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgRVRIVE9PTF9HVFNPCQkweDAwMDAwMDFlIC8qIEdldCBUU08gZW5hYmxlIChldGh0b29sX3ZhbHVlKSAqLworI2RlZmluZSBFVEhUT09MX1NUU08JCTB4MDAwMDAwMWYgLyogU2V0IFRTTyBlbmFibGUgKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfR1BFUk1BRERSCTB4MDAwMDAwMjAgLyogR2V0IHBlcm1hbmVudCBoYXJkd2FyZSBhZGRyZXNzICovCisjZGVmaW5lIEVUSFRPT0xfR1VGTwkJMHgwMDAwMDAyMSAvKiBHZXQgVUZPIGVuYWJsZSAoZXRodG9vbF92YWx1ZSkgKi8KKyNkZWZpbmUgRVRIVE9PTF9TVUZPCQkweDAwMDAwMDIyIC8qIFNldCBVRk8gZW5hYmxlIChldGh0b29sX3ZhbHVlKSAqLworI2RlZmluZSBFVEhUT09MX0dHU08JCTB4MDAwMDAwMjMgLyogR2V0IEdTTyBlbmFibGUgKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfU0dTTwkJMHgwMDAwMDAyNCAvKiBTZXQgR1NPIGVuYWJsZSAoZXRodG9vbF92YWx1ZSkgKi8KKyNkZWZpbmUgRVRIVE9PTF9HRkxBR1MJCTB4MDAwMDAwMjUgLyogR2V0IGZsYWdzIGJpdG1hcChldGh0b29sX3ZhbHVlKSAqLworI2RlZmluZSBFVEhUT09MX1NGTEFHUwkJMHgwMDAwMDAyNiAvKiBTZXQgZmxhZ3MgYml0bWFwKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfR1BGTEFHUwkJMHgwMDAwMDAyNyAvKiBHZXQgZHJpdmVyLXByaXZhdGUgZmxhZ3MgYml0bWFwICovCisjZGVmaW5lIEVUSFRPT0xfU1BGTEFHUwkJMHgwMDAwMDAyOCAvKiBTZXQgZHJpdmVyLXByaXZhdGUgZmxhZ3MgYml0bWFwICovCisKKyNkZWZpbmUgRVRIVE9PTF9HUlhGSAkJMHgwMDAwMDAyOSAvKiBHZXQgUlggZmxvdyBoYXNoIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgRVRIVE9PTF9TUlhGSAkJMHgwMDAwMDAyYSAvKiBTZXQgUlggZmxvdyBoYXNoIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgRVRIVE9PTF9HR1JPCQkweDAwMDAwMDJiIC8qIEdldCBHUk8gZW5hYmxlIChldGh0b29sX3ZhbHVlKSAqLworI2RlZmluZSBFVEhUT09MX1NHUk8JCTB4MDAwMDAwMmMgLyogU2V0IEdSTyBlbmFibGUgKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfR1JYUklOR1MJMHgwMDAwMDAyZCAvKiBHZXQgUlggcmluZ3MgYXZhaWxhYmxlIGZvciBMQiAqLworI2RlZmluZSBFVEhUT09MX0dSWENMU1JMQ05UCTB4MDAwMDAwMmUgLyogR2V0IFJYIGNsYXNzIHJ1bGUgY291bnQgKi8KKyNkZWZpbmUgRVRIVE9PTF9HUlhDTFNSVUxFCTB4MDAwMDAwMmYgLyogR2V0IFJYIGNsYXNzaWZpY2F0aW9uIHJ1bGUgKi8KKyNkZWZpbmUgRVRIVE9PTF9HUlhDTFNSTEFMTAkweDAwMDAwMDMwIC8qIEdldCBhbGwgUlggY2xhc3NpZmljYXRpb24gcnVsZSAqLworI2RlZmluZSBFVEhUT09MX1NSWENMU1JMREVMCTB4MDAwMDAwMzEgLyogRGVsZXRlIFJYIGNsYXNzaWZpY2F0aW9uIHJ1bGUgKi8KKyNkZWZpbmUgRVRIVE9PTF9TUlhDTFNSTElOUwkweDAwMDAwMDMyIC8qIEluc2VydCBSWCBjbGFzc2lmaWNhdGlvbiBydWxlICovCisjZGVmaW5lIEVUSFRPT0xfRkxBU0hERVYJMHgwMDAwMDAzMyAvKiBGbGFzaCBmaXJtd2FyZSB0byBkZXZpY2UgKi8KKyNkZWZpbmUgRVRIVE9PTF9SRVNFVAkJMHgwMDAwMDAzNCAvKiBSZXNldCBoYXJkd2FyZSAqLworI2RlZmluZSBFVEhUT09MX1NSWE5UVVBMRQkweDAwMDAwMDM1IC8qIEFkZCBhbiBuLXR1cGxlIGZpbHRlciB0byBkZXZpY2UgKi8KKyNkZWZpbmUgRVRIVE9PTF9HUlhOVFVQTEUJMHgwMDAwMDAzNiAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIEVUSFRPT0xfR1NTRVRfSU5GTwkweDAwMDAwMDM3IC8qIEdldCBzdHJpbmcgc2V0IGluZm8gKi8KKyNkZWZpbmUgRVRIVE9PTF9HUlhGSElORElSCTB4MDAwMDAwMzggLyogR2V0IFJYIGZsb3cgaGFzaCBpbmRpciduIHRhYmxlICovCisjZGVmaW5lIEVUSFRPT0xfU1JYRkhJTkRJUgkweDAwMDAwMDM5IC8qIFNldCBSWCBmbG93IGhhc2ggaW5kaXInbiB0YWJsZSAqLworCisjZGVmaW5lIEVUSFRPT0xfR0ZFQVRVUkVTCTB4MDAwMDAwM2EgLyogR2V0IGRldmljZSBvZmZsb2FkIHNldHRpbmdzICovCisjZGVmaW5lIEVUSFRPT0xfU0ZFQVRVUkVTCTB4MDAwMDAwM2IgLyogQ2hhbmdlIGRldmljZSBvZmZsb2FkIHNldHRpbmdzICovCisjZGVmaW5lIEVUSFRPT0xfR0NIQU5ORUxTCTB4MDAwMDAwM2MgLyogR2V0IG5vIG9mIGNoYW5uZWxzICovCisjZGVmaW5lIEVUSFRPT0xfU0NIQU5ORUxTCTB4MDAwMDAwM2QgLyogU2V0IG5vIG9mIGNoYW5uZWxzICovCisjZGVmaW5lIEVUSFRPT0xfU0VUX0RVTVAJMHgwMDAwMDAzZSAvKiBTZXQgZHVtcCBzZXR0aW5ncyAqLworI2RlZmluZSBFVEhUT09MX0dFVF9EVU1QX0ZMQUcJMHgwMDAwMDAzZiAvKiBHZXQgZHVtcCBzZXR0aW5ncyAqLworI2RlZmluZSBFVEhUT09MX0dFVF9EVU1QX0RBVEEJMHgwMDAwMDA0MCAvKiBHZXQgZHVtcCBkYXRhICovCisKKy8qIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBjb2RlICovCisjZGVmaW5lIFNQQVJDX0VUSF9HU0VUCQlFVEhUT09MX0dTRVQKKyNkZWZpbmUgU1BBUkNfRVRIX1NTRVQJCUVUSFRPT0xfU1NFVAorCisvKiBJbmRpY2F0ZXMgd2hhdCBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBpbnRlcmZhY2UuICovCisjZGVmaW5lIFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYJCSgxIDw8IDApCisjZGVmaW5lIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwJCSgxIDw8IDEpCisjZGVmaW5lIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmCQkoMSA8PCAyKQorI2RlZmluZSBTVVBQT1JURURfMTAwYmFzZVRfRnVsbAkJKDEgPDwgMykKKyNkZWZpbmUgU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmCSgxIDw8IDQpCisjZGVmaW5lIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbAkoMSA8PCA1KQorI2RlZmluZSBTVVBQT1JURURfQXV0b25lZwkJKDEgPDwgNikKKyNkZWZpbmUgU1VQUE9SVEVEX1RQCQkJKDEgPDwgNykKKyNkZWZpbmUgU1VQUE9SVEVEX0FVSQkJCSgxIDw8IDgpCisjZGVmaW5lIFNVUFBPUlRFRF9NSUkJCQkoMSA8PCA5KQorI2RlZmluZSBTVVBQT1JURURfRklCUkUJCQkoMSA8PCAxMCkKKyNkZWZpbmUgU1VQUE9SVEVEX0JOQwkJCSgxIDw8IDExKQorI2RlZmluZSBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsCSgxIDw8IDEyKQorI2RlZmluZSBTVVBQT1JURURfUGF1c2UJCQkoMSA8PCAxMykKKyNkZWZpbmUgU1VQUE9SVEVEX0FzeW1fUGF1c2UJCSgxIDw8IDE0KQorI2RlZmluZSBTVVBQT1JURURfMjUwMGJhc2VYX0Z1bGwJKDEgPDwgMTUpCisjZGVmaW5lIFNVUFBPUlRFRF9CYWNrcGxhbmUJCSgxIDw8IDE2KQorI2RlZmluZSBTVVBQT1JURURfMTAwMGJhc2VLWF9GdWxsCSgxIDw8IDE3KQorI2RlZmluZSBTVVBQT1JURURfMTAwMDBiYXNlS1g0X0Z1bGwJKDEgPDwgMTgpCisjZGVmaW5lIFNVUFBPUlRFRF8xMDAwMGJhc2VLUl9GdWxsCSgxIDw8IDE5KQorI2RlZmluZSBTVVBQT1JURURfMTAwMDBiYXNlUl9GRUMJKDEgPDwgMjApCisjZGVmaW5lIFNVUFBPUlRFRF8yMDAwMGJhc2VNTEQyX0Z1bGwJKDEgPDwgMjEpCisjZGVmaW5lIFNVUFBPUlRFRF8yMDAwMGJhc2VLUjJfRnVsbAkoMSA8PCAyMikKKworLyogSW5kaWNhdGVzIHdoYXQgZmVhdHVyZXMgYXJlIGFkdmVydGlzZWQgYnkgdGhlIGludGVyZmFjZS4gKi8KKyNkZWZpbmUgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYJCSgxIDw8IDApCisjZGVmaW5lIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsCQkoMSA8PCAxKQorI2RlZmluZSBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYJKDEgPDwgMikKKyNkZWZpbmUgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsCSgxIDw8IDMpCisjZGVmaW5lIEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYJKDEgPDwgNCkKKyNkZWZpbmUgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbAkoMSA8PCA1KQorI2RlZmluZSBBRFZFUlRJU0VEX0F1dG9uZWcJCSgxIDw8IDYpCisjZGVmaW5lIEFEVkVSVElTRURfVFAJCQkoMSA8PCA3KQorI2RlZmluZSBBRFZFUlRJU0VEX0FVSQkJCSgxIDw8IDgpCisjZGVmaW5lIEFEVkVSVElTRURfTUlJCQkJKDEgPDwgOSkKKyNkZWZpbmUgQURWRVJUSVNFRF9GSUJSRQkJKDEgPDwgMTApCisjZGVmaW5lIEFEVkVSVElTRURfQk5DCQkJKDEgPDwgMTEpCisjZGVmaW5lIEFEVkVSVElTRURfMTAwMDBiYXNlVF9GdWxsCSgxIDw8IDEyKQorI2RlZmluZSBBRFZFUlRJU0VEX1BhdXNlCQkoMSA8PCAxMykKKyNkZWZpbmUgQURWRVJUSVNFRF9Bc3ltX1BhdXNlCQkoMSA8PCAxNCkKKyNkZWZpbmUgQURWRVJUSVNFRF8yNTAwYmFzZVhfRnVsbAkoMSA8PCAxNSkKKyNkZWZpbmUgQURWRVJUSVNFRF9CYWNrcGxhbmUJCSgxIDw8IDE2KQorI2RlZmluZSBBRFZFUlRJU0VEXzEwMDBiYXNlS1hfRnVsbAkoMSA8PCAxNykKKyNkZWZpbmUgQURWRVJUSVNFRF8xMDAwMGJhc2VLWDRfRnVsbAkoMSA8PCAxOCkKKyNkZWZpbmUgQURWRVJUSVNFRF8xMDAwMGJhc2VLUl9GdWxsCSgxIDw8IDE5KQorI2RlZmluZSBBRFZFUlRJU0VEXzEwMDAwYmFzZVJfRkVDCSgxIDw8IDIwKQorI2RlZmluZSBBRFZFUlRJU0VEXzIwMDAwYmFzZU1MRDJfRnVsbAkoMSA8PCAyMSkKKyNkZWZpbmUgQURWRVJUSVNFRF8yMDAwMGJhc2VLUjJfRnVsbAkoMSA8PCAyMikKKworLyogVGhlIGZvbGxvd2luZyBhcmUgYWxsIGludm9sdmVkIGluIGZvcmNpbmcgYSBwYXJ0aWN1bGFyIGxpbmsKKyAqIG1vZGUgZm9yIHRoZSBkZXZpY2UgZm9yIHNldHRpbmcgdGhpbmdzLiAgV2hlbiBnZXR0aW5nIHRoZQorICogZGV2aWNlcyBzZXR0aW5ncywgdGhlc2UgaW5kaWNhdGUgdGhlIGN1cnJlbnQgbW9kZSBhbmQgd2hldGhlcgorICogaXQgd2FzIGZvcmNlZCB1cCBpbnRvIHRoaXMgbW9kZSBvciBhdXRvbmVnb3RpYXRlZC4KKyAqLworCisvKiBUaGUgZm9yY2VkIHNwZWVkLCAxME1iLCAxMDBNYiwgZ2lnYWJpdCwgMi41R2IsIDEwR2JFLiAqLworI2RlZmluZSBTUEVFRF8xMAkJMTAKKyNkZWZpbmUgU1BFRURfMTAwCQkxMDAKKyNkZWZpbmUgU1BFRURfMTAwMAkJMTAwMAorI2RlZmluZSBTUEVFRF8yNTAwCQkyNTAwCisjZGVmaW5lIFNQRUVEXzEwMDAwCQkxMDAwMAorI2RlZmluZSBTUEVFRF9VTktOT1dOCQktMQorCisvKiBEdXBsZXgsIGhhbGYgb3IgZnVsbC4gKi8KKyNkZWZpbmUgRFVQTEVYX0hBTEYJCTB4MDAKKyNkZWZpbmUgRFVQTEVYX0ZVTEwJCTB4MDEKKyNkZWZpbmUgRFVQTEVYX1VOS05PV04JCTB4ZmYKKworLyogV2hpY2ggY29ubmVjdG9yIHBvcnQuICovCisjZGVmaW5lIFBPUlRfVFAJCQkweDAwCisjZGVmaW5lIFBPUlRfQVVJCQkweDAxCisjZGVmaW5lIFBPUlRfTUlJCQkweDAyCisjZGVmaW5lIFBPUlRfRklCUkUJCTB4MDMKKyNkZWZpbmUgUE9SVF9CTkMJCTB4MDQKKyNkZWZpbmUgUE9SVF9EQQkJCTB4MDUKKyNkZWZpbmUgUE9SVF9OT05FCQkweGVmCisjZGVmaW5lIFBPUlRfT1RIRVIJCTB4ZmYKKworLyogV2hpY2ggdHJhbnNjZWl2ZXIgdG8gdXNlLiAqLworI2RlZmluZSBYQ1ZSX0lOVEVSTkFMCQkweDAwCisjZGVmaW5lIFhDVlJfRVhURVJOQUwJCTB4MDEKKyNkZWZpbmUgWENWUl9EVU1NWTEJCTB4MDIKKyNkZWZpbmUgWENWUl9EVU1NWTIJCTB4MDMKKyNkZWZpbmUgWENWUl9EVU1NWTMJCTB4MDQKKworLyogRW5hYmxlIG9yIGRpc2FibGUgYXV0b25lZ290aWF0aW9uLiAgSWYgdGhpcyBpcyBzZXQgdG8gZW5hYmxlLAorICogdGhlIGZvcmNlZCBsaW5rIG1vZGVzIGFib3ZlIGFyZSBjb21wbGV0ZWx5IGlnbm9yZWQuCisgKi8KKyNkZWZpbmUgQVVUT05FR19ESVNBQkxFCQkweDAwCisjZGVmaW5lIEFVVE9ORUdfRU5BQkxFCQkweDAxCisKKy8qIE1vZGUgTURJIG9yIE1ESS1YICovCisjZGVmaW5lIEVUSF9UUF9NRElfSU5WQUxJRAkweDAwCisjZGVmaW5lIEVUSF9UUF9NREkJCTB4MDEKKyNkZWZpbmUgRVRIX1RQX01ESV9YCQkweDAyCisKKy8qIFdha2UtT24tTGFuIG9wdGlvbnMuICovCisjZGVmaW5lIFdBS0VfUEhZCQkoMSA8PCAwKQorI2RlZmluZSBXQUtFX1VDQVNUCQkoMSA8PCAxKQorI2RlZmluZSBXQUtFX01DQVNUCQkoMSA8PCAyKQorI2RlZmluZSBXQUtFX0JDQVNUCQkoMSA8PCAzKQorI2RlZmluZSBXQUtFX0FSUAkJKDEgPDwgNCkKKyNkZWZpbmUgV0FLRV9NQUdJQwkJKDEgPDwgNSkKKyNkZWZpbmUgV0FLRV9NQUdJQ1NFQ1VSRQkoMSA8PCA2KSAvKiBvbmx5IG1lYW5pbmdmdWwgaWYgV0FLRV9NQUdJQyAqLworCisvKiBMMi1MNCBuZXR3b3JrIHRyYWZmaWMgZmxvdyB0eXBlcyAqLworI2RlZmluZQlUQ1BfVjRfRkxPVwkweDAxCS8qIGhhc2ggb3Igc3BlYyAodGNwX2lwNF9zcGVjKSAqLworI2RlZmluZQlVRFBfVjRfRkxPVwkweDAyCS8qIGhhc2ggb3Igc3BlYyAodWRwX2lwNF9zcGVjKSAqLworI2RlZmluZQlTQ1RQX1Y0X0ZMT1cJMHgwMwkvKiBoYXNoIG9yIHNwZWMgKHNjdHBfaXA0X3NwZWMpICovCisjZGVmaW5lCUFIX0VTUF9WNF9GTE9XCTB4MDQJLyogaGFzaCBvbmx5ICovCisjZGVmaW5lCVRDUF9WNl9GTE9XCTB4MDUJLyogaGFzaCBvbmx5ICovCisjZGVmaW5lCVVEUF9WNl9GTE9XCTB4MDYJLyogaGFzaCBvbmx5ICovCisjZGVmaW5lCVNDVFBfVjZfRkxPVwkweDA3CS8qIGhhc2ggb25seSAqLworI2RlZmluZQlBSF9FU1BfVjZfRkxPVwkweDA4CS8qIGhhc2ggb25seSAqLworI2RlZmluZQlBSF9WNF9GTE9XCTB4MDkJLyogaGFzaCBvciBzcGVjIChhaF9pcDRfc3BlYykgKi8KKyNkZWZpbmUJRVNQX1Y0X0ZMT1cJMHgwYQkvKiBoYXNoIG9yIHNwZWMgKGVzcF9pcDRfc3BlYykgKi8KKyNkZWZpbmUJQUhfVjZfRkxPVwkweDBiCS8qIGhhc2ggb25seSAqLworI2RlZmluZQlFU1BfVjZfRkxPVwkweDBjCS8qIGhhc2ggb25seSAqLworI2RlZmluZQlJUF9VU0VSX0ZMT1cJMHgwZAkvKiBzcGVjIG9ubHkgKHVzcl9pcDRfc3BlYykgKi8KKyNkZWZpbmUJSVBWNF9GTE9XCTB4MTAJLyogaGFzaCBvbmx5ICovCisjZGVmaW5lCUlQVjZfRkxPVwkweDExCS8qIGhhc2ggb25seSAqLworI2RlZmluZQlFVEhFUl9GTE9XCTB4MTIJLyogc3BlYyBvbmx5IChldGhlcl9zcGVjKSAqLworLyogRmxhZyB0byBlbmFibGUgYWRkaXRpb25hbCBmaWVsZHMgaW4gc3RydWN0IGV0aHRvb2xfcnhfZmxvd19zcGVjICovCisjZGVmaW5lCUZMT1dfRVhUCTB4ODAwMDAwMDAKKworLyogTDMtTDQgbmV0d29yayB0cmFmZmljIGZsb3cgaGFzaCBvcHRpb25zICovCisjZGVmaW5lCVJYSF9MMkRBCSgxIDw8IDEpCisjZGVmaW5lCVJYSF9WTEFOCSgxIDw8IDIpCisjZGVmaW5lCVJYSF9MM19QUk9UTwkoMSA8PCAzKQorI2RlZmluZQlSWEhfSVBfU1JDCSgxIDw8IDQpCisjZGVmaW5lCVJYSF9JUF9EU1QJKDEgPDwgNSkKKyNkZWZpbmUJUlhIX0w0X0JfMF8xCSgxIDw8IDYpIC8qIHNyYyBwb3J0IGluIGNhc2Ugb2YgVENQL1VEUC9TQ1RQICovCisjZGVmaW5lCVJYSF9MNF9CXzJfMwkoMSA8PCA3KSAvKiBkc3QgcG9ydCBpbiBjYXNlIG9mIFRDUC9VRFAvU0NUUCAqLworI2RlZmluZQlSWEhfRElTQ0FSRAkoMSA8PCAzMSkKKworI2RlZmluZQlSWF9DTFNfRkxPV19ESVNDCTB4ZmZmZmZmZmZmZmZmZmZmZlVMTAorCisvKiBSZXNldCBmbGFncyAqLworLyogVGhlIHJlc2V0KCkgb3BlcmF0aW9uIG11c3QgY2xlYXIgdGhlIGZsYWdzIGZvciB0aGUgY29tcG9uZW50cyB3aGljaAorICogd2VyZSBhY3R1YWxseSByZXNldC4gIE9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCB0aGUgZmxhZ3MgaW5kaWNhdGUgdGhlCisgKiBjb21wb25lbnRzIHdoaWNoIHdlcmUgbm90IHJlc2V0LCBlaXRoZXIgYmVjYXVzZSB0aGV5IGRvIG5vdCBleGlzdAorICogaW4gdGhlIGhhcmR3YXJlIG9yIGJlY2F1c2UgdGhleSBjYW5ub3QgYmUgcmVzZXQgaW5kZXBlbmRlbnRseS4gIFRoZQorICogZHJpdmVyIG11c3QgbmV2ZXIgcmVzZXQgYW55IGNvbXBvbmVudHMgdGhhdCB3ZXJlIG5vdCByZXF1ZXN0ZWQuCisgKi8KK2VudW0gZXRodG9vbF9yZXNldF9mbGFncyB7CisJLyogVGhlc2UgZmxhZ3MgcmVwcmVzZW50IGNvbXBvbmVudHMgZGVkaWNhdGVkIHRvIHRoZSBpbnRlcmZhY2UKKwkgKiB0aGUgY29tbWFuZCBpcyBhZGRyZXNzZWQgdG8uICBTaGlmdCBhbnkgZmxhZyBsZWZ0IGJ5CisJICogRVRIX1JFU0VUX1NIQVJFRF9TSElGVCB0byByZXNldCBhIHNoYXJlZCBjb21wb25lbnQgb2YgdGhlCisJICogc2FtZSB0eXBlLgorCSAqLworCUVUSF9SRVNFVF9NR01UCQk9IDEgPDwgMCwJLyogTWFuYWdlbWVudCBwcm9jZXNzb3IgKi8KKwlFVEhfUkVTRVRfSVJRCQk9IDEgPDwgMSwJLyogSW50ZXJydXB0IHJlcXVlc3RlciAqLworCUVUSF9SRVNFVF9ETUEJCT0gMSA8PCAyLAkvKiBETUEgZW5naW5lICovCisJRVRIX1JFU0VUX0ZJTFRFUgk9IDEgPDwgMywJLyogRmlsdGVyaW5nL2Zsb3cgZGlyZWN0aW9uICovCisJRVRIX1JFU0VUX09GRkxPQUQJPSAxIDw8IDQsCS8qIFByb3RvY29sIG9mZmxvYWQgKi8KKwlFVEhfUkVTRVRfTUFDCQk9IDEgPDwgNSwJLyogTWVkaWEgYWNjZXNzIGNvbnRyb2xsZXIgKi8KKwlFVEhfUkVTRVRfUEhZCQk9IDEgPDwgNiwJLyogVHJhbnNjZWl2ZXIvUEhZICovCisJRVRIX1JFU0VUX1JBTQkJPSAxIDw8IDcsCS8qIFJBTSBzaGFyZWQgYmV0d2VlbgorCQkJCQkJICogbXVsdGlwbGUgY29tcG9uZW50cyAqLworCisJRVRIX1JFU0VUX0RFRElDQVRFRAk9IDB4MDAwMGZmZmYsCS8qIEFsbCBjb21wb25lbnRzIGRlZGljYXRlZCB0bworCQkJCQkJICogdGhpcyBpbnRlcmZhY2UgKi8KKwlFVEhfUkVTRVRfQUxMCQk9IDB4ZmZmZmZmZmYsCS8qIEFsbCBjb21wb25lbnRzIHVzZWQgYnkgdGhpcworCQkJCQkJICogaW50ZXJmYWNlLCBldmVuIGlmIHNoYXJlZCAqLworfTsKKyNkZWZpbmUgRVRIX1JFU0VUX1NIQVJFRF9TSElGVAkxNgorCisjZW5kaWYgLyogX0xJTlVYX0VUSFRPT0xfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ldmVudHBvbGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZXZlbnRwb2xsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4YTAyZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZXZlbnRwb2xsLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqICBpbmNsdWRlL2xpbnV4L2V2ZW50cG9sbC5oICggRWZmaWNpZW50IGV2ZW50IHBvbGxpbmcgaW1wbGVtZW50YXRpb24gKQorICogIENvcHlyaWdodCAoQykgMjAwMSwuLi4sMjAwNgkgRGF2aWRlIExpYmVuemkKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9FVkVOVFBPTExfSAorI2RlZmluZSBfTElOVVhfRVZFTlRQT0xMX0gKKworLyogRm9yIE9fQ0xPRVhFQyAqLworI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogRmxhZ3MgZm9yIGVwb2xsX2NyZWF0ZTEuICAqLworI2RlZmluZSBFUE9MTF9DTE9FWEVDIE9fQ0xPRVhFQworCisvKiBWYWxpZCBvcGNvZGVzIHRvIGlzc3VlIHRvIHN5c19lcG9sbF9jdGwoKSAqLworI2RlZmluZSBFUE9MTF9DVExfQUREIDEKKyNkZWZpbmUgRVBPTExfQ1RMX0RFTCAyCisjZGVmaW5lIEVQT0xMX0NUTF9NT0QgMworCisvKiBTZXQgdGhlIE9uZSBTaG90IGJlaGF2aW91ciBmb3IgdGhlIHRhcmdldCBmaWxlIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgRVBPTExPTkVTSE9UICgxIDw8IDMwKQorCisvKiBTZXQgdGhlIEVkZ2UgVHJpZ2dlcmVkIGJlaGF2aW91ciBmb3IgdGhlIHRhcmdldCBmaWxlIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgRVBPTExFVCAoMSA8PCAzMSkKKworLyogCisgKiBPbiB4ODYtNjQgbWFrZSB0aGUgNjRiaXQgc3RydWN0dXJlIGhhdmUgdGhlIHNhbWUgYWxpZ25tZW50IGFzIHRoZQorICogMzJiaXQgc3RydWN0dXJlLiBUaGlzIG1ha2VzIDMyYml0IGVtdWxhdGlvbiBlYXNpZXIuCisgKgorICogVU1ML3g4Nl82NCBuZWVkcyB0aGUgc2FtZSBwYWNraW5nIGFzIHg4Nl82NAorICovCisjaWZkZWYgX194ODZfNjRfXworI2RlZmluZSBFUE9MTF9QQUNLRUQgX19hdHRyaWJ1dGVfXygocGFja2VkKSkKKyNlbHNlCisjZGVmaW5lIEVQT0xMX1BBQ0tFRAorI2VuZGlmCisKK3N0cnVjdCBlcG9sbF9ldmVudCB7CisJX191MzIgZXZlbnRzOworCV9fdTY0IGRhdGE7Cit9IEVQT0xMX1BBQ0tFRDsKKworCisjZW5kaWYgLyogI2lmbmRlZiBfTElOVVhfRVZFTlRQT0xMX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9leHQyX2ZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2V4dDJfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWYyODgyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9leHQyX2ZzLmgKQEAgLTAsMCArMSw1NTcgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9saW51eC9leHQyX2ZzLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvaW5jbHVkZS9saW51eC9taW5peF9mcy5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisjaWZuZGVmIF9MSU5VWF9FWFQyX0ZTX0gKKyNkZWZpbmUgX0xJTlVYX0VYVDJfRlNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKy8qCisgKiBUaGUgc2Vjb25kIGV4dGVuZGVkIGZpbGVzeXN0ZW0gY29uc3RhbnRzL3N0cnVjdHVyZXMKKyAqLworCisvKgorICogRGVmaW5lIEVYVDJGU19ERUJVRyB0byBwcm9kdWNlIGRlYnVnIG1lc3NhZ2VzCisgKi8KKyN1bmRlZiBFWFQyRlNfREVCVUcKKworLyoKKyAqIERlZmluZSBFWFQyX1JFU0VSVkFUSU9OIHRvIHJlc2VydmUgZGF0YSBibG9ja3MgZm9yIGV4cGFuZGluZyBmaWxlcworICovCisjZGVmaW5lIEVYVDJfREVGQVVMVF9SRVNFUlZFX0JMT0NLUyAgICAgOAorLyptYXggd2luZG93IHNpemU6IDEwMjQoZGlyZWN0IGJsb2NrcykgKyAzKFt0LGRdaW5kaXJlY3QgYmxvY2tzKSAqLworI2RlZmluZSBFWFQyX01BWF9SRVNFUlZFX0JMT0NLUyAgICAgICAgIDEwMjcKKyNkZWZpbmUgRVhUMl9SRVNFUlZFX1dJTkRPV19OT1RfQUxMT0NBVEVEIDAKKy8qCisgKiBUaGUgc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtIHZlcnNpb24KKyAqLworI2RlZmluZSBFWFQyRlNfREFURQkJIjk1LzA4LzA5IgorI2RlZmluZSBFWFQyRlNfVkVSU0lPTgkJIjAuNWIiCisKKy8qCisgKiBEZWJ1ZyBjb2RlCisgKi8KKyNpZmRlZiBFWFQyRlNfREVCVUcKKyMJZGVmaW5lIGV4dDJfZGVidWcoZiwgYS4uLikJeyBcCisJCQkJCXByaW50ayAoIkVYVDItZnMgREVCVUcgKCVzLCAlZCk6ICVzOiIsIFwKKwkJCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOyBcCisJCQkJICAJcHJpbnRrIChmLCAjIyBhKTsgXAorCQkJCQl9CisjZWxzZQorIwlkZWZpbmUgZXh0Ml9kZWJ1ZyhmLCBhLi4uKQkvKiovCisjZW5kaWYKKworLyoKKyAqIFNwZWNpYWwgaW5vZGUgbnVtYmVycworICovCisjZGVmaW5lCUVYVDJfQkFEX0lOTwkJIDEJLyogQmFkIGJsb2NrcyBpbm9kZSAqLworI2RlZmluZSBFWFQyX1JPT1RfSU5PCQkgMgkvKiBSb290IGlub2RlICovCisjZGVmaW5lIEVYVDJfQk9PVF9MT0FERVJfSU5PCSA1CS8qIEJvb3QgbG9hZGVyIGlub2RlICovCisjZGVmaW5lIEVYVDJfVU5ERUxfRElSX0lOTwkgNgkvKiBVbmRlbGV0ZSBkaXJlY3RvcnkgaW5vZGUgKi8KKworLyogRmlyc3Qgbm9uLXJlc2VydmVkIGlub2RlIGZvciBvbGQgZXh0MiBmaWxlc3lzdGVtcyAqLworI2RlZmluZSBFWFQyX0dPT0RfT0xEX0ZJUlNUX0lOTwkxMQorCisvKiBBc3N1bWUgdGhhdCB1c2VyIG1vZGUgcHJvZ3JhbXMgYXJlIHBhc3NpbmcgaW4gYW4gZXh0MmZzIHN1cGVyYmxvY2ssIG5vdAorICogYSBrZXJuZWwgc3RydWN0IHN1cGVyX2Jsb2NrLiAgVGhpcyB3aWxsIGFsbG93IHVzIHRvIGNhbGwgdGhlIGZlYXR1cmUtdGVzdAorICogbWFjcm9zIGZyb20gdXNlciBsYW5kLiAqLworI2RlZmluZSBFWFQyX1NCKHNiKQkoc2IpCisKKy8qCisgKiBNYXhpbWFsIGNvdW50IG9mIGxpbmtzIHRvIGEgZmlsZQorICovCisjZGVmaW5lIEVYVDJfTElOS19NQVgJCTMyMDAwCisKKy8qCisgKiBNYWNyby1pbnN0cnVjdGlvbnMgdXNlZCB0byBtYW5hZ2Ugc2V2ZXJhbCBibG9jayBzaXplcworICovCisjZGVmaW5lIEVYVDJfTUlOX0JMT0NLX1NJWkUJCTEwMjQKKyNkZWZpbmUJRVhUMl9NQVhfQkxPQ0tfU0laRQkJNDA5NgorI2RlZmluZSBFWFQyX01JTl9CTE9DS19MT0dfU0laRQkJICAxMAorIyBkZWZpbmUgRVhUMl9CTE9DS19TSVpFKHMpCQkoRVhUMl9NSU5fQkxPQ0tfU0laRSA8PCAocyktPnNfbG9nX2Jsb2NrX3NpemUpCisjZGVmaW5lCUVYVDJfQUREUl9QRVJfQkxPQ0socykJCShFWFQyX0JMT0NLX1NJWkUocykgLyBzaXplb2YgKF9fdTMyKSkKKyMgZGVmaW5lIEVYVDJfQkxPQ0tfU0laRV9CSVRTKHMpCSgocyktPnNfbG9nX2Jsb2NrX3NpemUgKyAxMCkKKyNkZWZpbmUgRVhUMl9JTk9ERV9TSVpFKHMpCSgoKHMpLT5zX3Jldl9sZXZlbCA9PSBFWFQyX0dPT0RfT0xEX1JFVikgPyBcCisJCQkJIEVYVDJfR09PRF9PTERfSU5PREVfU0laRSA6IFwKKwkJCQkgKHMpLT5zX2lub2RlX3NpemUpCisjZGVmaW5lIEVYVDJfRklSU1RfSU5PKHMpCSgoKHMpLT5zX3Jldl9sZXZlbCA9PSBFWFQyX0dPT0RfT0xEX1JFVikgPyBcCisJCQkJIEVYVDJfR09PRF9PTERfRklSU1RfSU5PIDogXAorCQkJCSAocyktPnNfZmlyc3RfaW5vKQorCisvKgorICogTWFjcm8taW5zdHJ1Y3Rpb25zIHVzZWQgdG8gbWFuYWdlIGZyYWdtZW50cworICovCisjZGVmaW5lIEVYVDJfTUlOX0ZSQUdfU0laRQkJMTAyNAorI2RlZmluZQlFWFQyX01BWF9GUkFHX1NJWkUJCTQwOTYKKyNkZWZpbmUgRVhUMl9NSU5fRlJBR19MT0dfU0laRQkJICAxMAorIyBkZWZpbmUgRVhUMl9GUkFHX1NJWkUocykJCShFWFQyX01JTl9GUkFHX1NJWkUgPDwgKHMpLT5zX2xvZ19mcmFnX3NpemUpCisjIGRlZmluZSBFWFQyX0ZSQUdTX1BFUl9CTE9DSyhzKQkoRVhUMl9CTE9DS19TSVpFKHMpIC8gRVhUMl9GUkFHX1NJWkUocykpCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYSBibG9ja3MgZ3JvdXAgZGVzY3JpcHRvcgorICovCitzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjCit7CisJX19sZTMyCWJnX2Jsb2NrX2JpdG1hcDsJCS8qIEJsb2NrcyBiaXRtYXAgYmxvY2sgKi8KKwlfX2xlMzIJYmdfaW5vZGVfYml0bWFwOwkJLyogSW5vZGVzIGJpdG1hcCBibG9jayAqLworCV9fbGUzMgliZ19pbm9kZV90YWJsZTsJCS8qIElub2RlcyB0YWJsZSBibG9jayAqLworCV9fbGUxNgliZ19mcmVlX2Jsb2Nrc19jb3VudDsJLyogRnJlZSBibG9ja3MgY291bnQgKi8KKwlfX2xlMTYJYmdfZnJlZV9pbm9kZXNfY291bnQ7CS8qIEZyZWUgaW5vZGVzIGNvdW50ICovCisJX19sZTE2CWJnX3VzZWRfZGlyc19jb3VudDsJLyogRGlyZWN0b3JpZXMgY291bnQgKi8KKwlfX2xlMTYJYmdfcGFkOworCV9fbGUzMgliZ19yZXNlcnZlZFszXTsKK307CisKKy8qCisgKiBNYWNyby1pbnN0cnVjdGlvbnMgdXNlZCB0byBtYW5hZ2UgZ3JvdXAgZGVzY3JpcHRvcnMKKyAqLworIyBkZWZpbmUgRVhUMl9CTE9DS1NfUEVSX0dST1VQKHMpCSgocyktPnNfYmxvY2tzX3Blcl9ncm91cCkKKyMgZGVmaW5lIEVYVDJfREVTQ19QRVJfQkxPQ0socykJCShFWFQyX0JMT0NLX1NJWkUocykgLyBzaXplb2YgKHN0cnVjdCBleHQyX2dyb3VwX2Rlc2MpKQorIyBkZWZpbmUgRVhUMl9JTk9ERVNfUEVSX0dST1VQKHMpCSgocyktPnNfaW5vZGVzX3Blcl9ncm91cCkKKworLyoKKyAqIENvbnN0YW50cyByZWxhdGl2ZSB0byB0aGUgZGF0YSBibG9ja3MKKyAqLworI2RlZmluZQlFWFQyX05ESVJfQkxPQ0tTCQkxMgorI2RlZmluZQlFWFQyX0lORF9CTE9DSwkJCUVYVDJfTkRJUl9CTE9DS1MKKyNkZWZpbmUJRVhUMl9ESU5EX0JMT0NLCQkJKEVYVDJfSU5EX0JMT0NLICsgMSkKKyNkZWZpbmUJRVhUMl9USU5EX0JMT0NLCQkJKEVYVDJfRElORF9CTE9DSyArIDEpCisjZGVmaW5lCUVYVDJfTl9CTE9DS1MJCQkoRVhUMl9USU5EX0JMT0NLICsgMSkKKworLyoKKyAqIElub2RlIGZsYWdzIChHRVRGTEFHUy9TRVRGTEFHUykKKyAqLworI2RlZmluZQlFWFQyX1NFQ1JNX0ZMCQkJRlNfU0VDUk1fRkwJLyogU2VjdXJlIGRlbGV0aW9uICovCisjZGVmaW5lCUVYVDJfVU5STV9GTAkJCUZTX1VOUk1fRkwJLyogVW5kZWxldGUgKi8KKyNkZWZpbmUJRVhUMl9DT01QUl9GTAkJCUZTX0NPTVBSX0ZMCS8qIENvbXByZXNzIGZpbGUgKi8KKyNkZWZpbmUgRVhUMl9TWU5DX0ZMCQkJRlNfU1lOQ19GTAkvKiBTeW5jaHJvbm91cyB1cGRhdGVzICovCisjZGVmaW5lIEVYVDJfSU1NVVRBQkxFX0ZMCQlGU19JTU1VVEFCTEVfRkwJLyogSW1tdXRhYmxlIGZpbGUgKi8KKyNkZWZpbmUgRVhUMl9BUFBFTkRfRkwJCQlGU19BUFBFTkRfRkwJLyogd3JpdGVzIHRvIGZpbGUgbWF5IG9ubHkgYXBwZW5kICovCisjZGVmaW5lIEVYVDJfTk9EVU1QX0ZMCQkJRlNfTk9EVU1QX0ZMCS8qIGRvIG5vdCBkdW1wIGZpbGUgKi8KKyNkZWZpbmUgRVhUMl9OT0FUSU1FX0ZMCQkJRlNfTk9BVElNRV9GTAkvKiBkbyBub3QgdXBkYXRlIGF0aW1lICovCisvKiBSZXNlcnZlZCBmb3IgY29tcHJlc3Npb24gdXNhZ2UuLi4gKi8KKyNkZWZpbmUgRVhUMl9ESVJUWV9GTAkJCUZTX0RJUlRZX0ZMCisjZGVmaW5lIEVYVDJfQ09NUFJCTEtfRkwJCUZTX0NPTVBSQkxLX0ZMCS8qIE9uZSBvciBtb3JlIGNvbXByZXNzZWQgY2x1c3RlcnMgKi8KKyNkZWZpbmUgRVhUMl9OT0NPTVBfRkwJCQlGU19OT0NPTVBfRkwJLyogRG9uJ3QgY29tcHJlc3MgKi8KKyNkZWZpbmUgRVhUMl9FQ09NUFJfRkwJCQlGU19FQ09NUFJfRkwJLyogQ29tcHJlc3Npb24gZXJyb3IgKi8KKy8qIEVuZCBjb21wcmVzc2lvbiBmbGFncyAtLS0gbWF5YmUgbm90IGFsbCB1c2VkICovCQorI2RlZmluZSBFWFQyX0JUUkVFX0ZMCQkJRlNfQlRSRUVfRkwJLyogYnRyZWUgZm9ybWF0IGRpciAqLworI2RlZmluZSBFWFQyX0lOREVYX0ZMCQkJRlNfSU5ERVhfRkwJLyogaGFzaC1pbmRleGVkIGRpcmVjdG9yeSAqLworI2RlZmluZSBFWFQyX0lNQUdJQ19GTAkJCUZTX0lNQUdJQ19GTAkvKiBBRlMgZGlyZWN0b3J5ICovCisjZGVmaW5lIEVYVDJfSk9VUk5BTF9EQVRBX0ZMCQlGU19KT1VSTkFMX0RBVEFfRkwgLyogUmVzZXJ2ZWQgZm9yIGV4dDMgKi8KKyNkZWZpbmUgRVhUMl9OT1RBSUxfRkwJCQlGU19OT1RBSUxfRkwJLyogZmlsZSB0YWlsIHNob3VsZCBub3QgYmUgbWVyZ2VkICovCisjZGVmaW5lIEVYVDJfRElSU1lOQ19GTAkJCUZTX0RJUlNZTkNfRkwJLyogZGlyc3luYyBiZWhhdmlvdXIgKGRpcmVjdG9yaWVzIG9ubHkpICovCisjZGVmaW5lIEVYVDJfVE9QRElSX0ZMCQkJRlNfVE9QRElSX0ZMCS8qIFRvcCBvZiBkaXJlY3RvcnkgaGllcmFyY2hpZXMqLworI2RlZmluZSBFWFQyX1JFU0VSVkVEX0ZMCQlGU19SRVNFUlZFRF9GTAkvKiByZXNlcnZlZCBmb3IgZXh0MiBsaWIgKi8KKworI2RlZmluZSBFWFQyX0ZMX1VTRVJfVklTSUJMRQkJRlNfRkxfVVNFUl9WSVNJQkxFCS8qIFVzZXIgdmlzaWJsZSBmbGFncyAqLworI2RlZmluZSBFWFQyX0ZMX1VTRVJfTU9ESUZJQUJMRQkJRlNfRkxfVVNFUl9NT0RJRklBQkxFCS8qIFVzZXIgbW9kaWZpYWJsZSBmbGFncyAqLworCisvKiBGbGFncyB0aGF0IHNob3VsZCBiZSBpbmhlcml0ZWQgYnkgbmV3IGlub2RlcyBmcm9tIHRoZWlyIHBhcmVudC4gKi8KKyNkZWZpbmUgRVhUMl9GTF9JTkhFUklURUQgKEVYVDJfU0VDUk1fRkwgfCBFWFQyX1VOUk1fRkwgfCBFWFQyX0NPTVBSX0ZMIHxcCisJCQkgICBFWFQyX1NZTkNfRkwgfCBFWFQyX05PRFVNUF9GTCB8XAorCQkJICAgRVhUMl9OT0FUSU1FX0ZMIHwgRVhUMl9DT01QUkJMS19GTCB8XAorCQkJICAgRVhUMl9OT0NPTVBfRkwgfCBFWFQyX0pPVVJOQUxfREFUQV9GTCB8XAorCQkJICAgRVhUMl9OT1RBSUxfRkwgfCBFWFQyX0RJUlNZTkNfRkwpCisKKy8qIEZsYWdzIHRoYXQgYXJlIGFwcHJvcHJpYXRlIGZvciByZWd1bGFyIGZpbGVzIChhbGwgYnV0IGRpci1zcGVjaWZpYyBvbmVzKS4gKi8KKyNkZWZpbmUgRVhUMl9SRUdfRkxNQVNLICh+KEVYVDJfRElSU1lOQ19GTCB8IEVYVDJfVE9QRElSX0ZMKSkKKworLyogRmxhZ3MgdGhhdCBhcmUgYXBwcm9wcmlhdGUgZm9yIG5vbi1kaXJlY3Rvcmllcy9yZWd1bGFyIGZpbGVzLiAqLworI2RlZmluZSBFWFQyX09USEVSX0ZMTUFTSyAoRVhUMl9OT0RVTVBfRkwgfCBFWFQyX05PQVRJTUVfRkwpCisKKy8qIE1hc2sgb3V0IGZsYWdzIHRoYXQgYXJlIGluYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiB0eXBlIG9mIGlub2RlLiAqLworc3RhdGljIF9faW5saW5lX18gX191MzIgZXh0Ml9tYXNrX2ZsYWdzKHVtb2RlX3QgbW9kZSwgX191MzIgZmxhZ3MpCit7CisJaWYgKFNfSVNESVIobW9kZSkpCisJCXJldHVybiBmbGFnczsKKwllbHNlIGlmIChTX0lTUkVHKG1vZGUpKQorCQlyZXR1cm4gZmxhZ3MgJiBFWFQyX1JFR19GTE1BU0s7CisJZWxzZQorCQlyZXR1cm4gZmxhZ3MgJiBFWFQyX09USEVSX0ZMTUFTSzsKK30KKworLyoKKyAqIGlvY3RsIGNvbW1hbmRzCisgKi8KKyNkZWZpbmUJRVhUMl9JT0NfR0VURkxBR1MJCUZTX0lPQ19HRVRGTEFHUworI2RlZmluZQlFWFQyX0lPQ19TRVRGTEFHUwkJRlNfSU9DX1NFVEZMQUdTCisjZGVmaW5lCUVYVDJfSU9DX0dFVFZFUlNJT04JCUZTX0lPQ19HRVRWRVJTSU9OCisjZGVmaW5lCUVYVDJfSU9DX1NFVFZFUlNJT04JCUZTX0lPQ19TRVRWRVJTSU9OCisjZGVmaW5lCUVYVDJfSU9DX0dFVFJTVlNaCQlfSU9SKCdmJywgNSwgbG9uZykKKyNkZWZpbmUJRVhUMl9JT0NfU0VUUlNWU1oJCV9JT1coJ2YnLCA2LCBsb25nKQorCisvKgorICogaW9jdGwgY29tbWFuZHMgaW4gMzIgYml0IGVtdWxhdGlvbgorICovCisjZGVmaW5lIEVYVDJfSU9DMzJfR0VURkxBR1MJCUZTX0lPQzMyX0dFVEZMQUdTCisjZGVmaW5lIEVYVDJfSU9DMzJfU0VURkxBR1MJCUZTX0lPQzMyX1NFVEZMQUdTCisjZGVmaW5lIEVYVDJfSU9DMzJfR0VUVkVSU0lPTgkJRlNfSU9DMzJfR0VUVkVSU0lPTgorI2RlZmluZSBFWFQyX0lPQzMyX1NFVFZFUlNJT04JCUZTX0lPQzMyX1NFVFZFUlNJT04KKworLyoKKyAqIFN0cnVjdHVyZSBvZiBhbiBpbm9kZSBvbiB0aGUgZGlzaworICovCitzdHJ1Y3QgZXh0Ml9pbm9kZSB7CisJX19sZTE2CWlfbW9kZTsJCS8qIEZpbGUgbW9kZSAqLworCV9fbGUxNglpX3VpZDsJCS8qIExvdyAxNiBiaXRzIG9mIE93bmVyIFVpZCAqLworCV9fbGUzMglpX3NpemU7CQkvKiBTaXplIGluIGJ5dGVzICovCisJX19sZTMyCWlfYXRpbWU7CS8qIEFjY2VzcyB0aW1lICovCisJX19sZTMyCWlfY3RpbWU7CS8qIENyZWF0aW9uIHRpbWUgKi8KKwlfX2xlMzIJaV9tdGltZTsJLyogTW9kaWZpY2F0aW9uIHRpbWUgKi8KKwlfX2xlMzIJaV9kdGltZTsJLyogRGVsZXRpb24gVGltZSAqLworCV9fbGUxNglpX2dpZDsJCS8qIExvdyAxNiBiaXRzIG9mIEdyb3VwIElkICovCisJX19sZTE2CWlfbGlua3NfY291bnQ7CS8qIExpbmtzIGNvdW50ICovCisJX19sZTMyCWlfYmxvY2tzOwkvKiBCbG9ja3MgY291bnQgKi8KKwlfX2xlMzIJaV9mbGFnczsJLyogRmlsZSBmbGFncyAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fbGUzMiAgbF9pX3Jlc2VydmVkMTsKKwkJfSBsaW51eDE7CisJCXN0cnVjdCB7CisJCQlfX2xlMzIgIGhfaV90cmFuc2xhdG9yOworCQl9IGh1cmQxOworCQlzdHJ1Y3QgeworCQkJX19sZTMyICBtX2lfcmVzZXJ2ZWQxOworCQl9IG1hc2l4MTsKKwl9IG9zZDE7CQkJCS8qIE9TIGRlcGVuZGVudCAxICovCisJX19sZTMyCWlfYmxvY2tbRVhUMl9OX0JMT0NLU107LyogUG9pbnRlcnMgdG8gYmxvY2tzICovCisJX19sZTMyCWlfZ2VuZXJhdGlvbjsJLyogRmlsZSB2ZXJzaW9uIChmb3IgTkZTKSAqLworCV9fbGUzMglpX2ZpbGVfYWNsOwkvKiBGaWxlIEFDTCAqLworCV9fbGUzMglpX2Rpcl9hY2w7CS8qIERpcmVjdG9yeSBBQ0wgKi8KKwlfX2xlMzIJaV9mYWRkcjsJLyogRnJhZ21lbnQgYWRkcmVzcyAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTgJbF9pX2ZyYWc7CS8qIEZyYWdtZW50IG51bWJlciAqLworCQkJX191OAlsX2lfZnNpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwkJCV9fdTE2CWlfcGFkMTsKKwkJCV9fbGUxNglsX2lfdWlkX2hpZ2g7CS8qIHRoZXNlIDIgZmllbGRzICAgICovCisJCQlfX2xlMTYJbF9pX2dpZF9oaWdoOwkvKiB3ZXJlIHJlc2VydmVkMlswXSAqLworCQkJX191MzIJbF9pX3Jlc2VydmVkMjsKKwkJfSBsaW51eDI7CisJCXN0cnVjdCB7CisJCQlfX3U4CWhfaV9mcmFnOwkvKiBGcmFnbWVudCBudW1iZXIgKi8KKwkJCV9fdTgJaF9pX2ZzaXplOwkvKiBGcmFnbWVudCBzaXplICovCisJCQlfX2xlMTYJaF9pX21vZGVfaGlnaDsKKwkJCV9fbGUxNgloX2lfdWlkX2hpZ2g7CisJCQlfX2xlMTYJaF9pX2dpZF9oaWdoOworCQkJX19sZTMyCWhfaV9hdXRob3I7CisJCX0gaHVyZDI7CisJCXN0cnVjdCB7CisJCQlfX3U4CW1faV9mcmFnOwkvKiBGcmFnbWVudCBudW1iZXIgKi8KKwkJCV9fdTgJbV9pX2ZzaXplOwkvKiBGcmFnbWVudCBzaXplICovCisJCQlfX3UxNgltX3BhZDE7CisJCQlfX3UzMgltX2lfcmVzZXJ2ZWQyWzJdOworCQl9IG1hc2l4MjsKKwl9IG9zZDI7CQkJCS8qIE9TIGRlcGVuZGVudCAyICovCit9OworCisjZGVmaW5lIGlfc2l6ZV9oaWdoCWlfZGlyX2FjbAorCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCBkZWZpbmVkKF9fbGludXhfXykKKyNkZWZpbmUgaV9yZXNlcnZlZDEJb3NkMS5saW51eDEubF9pX3Jlc2VydmVkMQorI2RlZmluZSBpX2ZyYWcJCW9zZDIubGludXgyLmxfaV9mcmFnCisjZGVmaW5lIGlfZnNpemUJCW9zZDIubGludXgyLmxfaV9mc2l6ZQorI2RlZmluZSBpX3VpZF9sb3cJaV91aWQKKyNkZWZpbmUgaV9naWRfbG93CWlfZ2lkCisjZGVmaW5lIGlfdWlkX2hpZ2gJb3NkMi5saW51eDIubF9pX3VpZF9oaWdoCisjZGVmaW5lIGlfZ2lkX2hpZ2gJb3NkMi5saW51eDIubF9pX2dpZF9oaWdoCisjZGVmaW5lIGlfcmVzZXJ2ZWQyCW9zZDIubGludXgyLmxfaV9yZXNlcnZlZDIKKyNlbmRpZgorCisjaWZkZWYJX19odXJkX18KKyNkZWZpbmUgaV90cmFuc2xhdG9yCW9zZDEuaHVyZDEuaF9pX3RyYW5zbGF0b3IKKyNkZWZpbmUgaV9mcmFnCQlvc2QyLmh1cmQyLmhfaV9mcmFnCisjZGVmaW5lIGlfZnNpemUJCW9zZDIuaHVyZDIuaF9pX2ZzaXplCisjZGVmaW5lIGlfdWlkX2hpZ2gJb3NkMi5odXJkMi5oX2lfdWlkX2hpZ2gKKyNkZWZpbmUgaV9naWRfaGlnaAlvc2QyLmh1cmQyLmhfaV9naWRfaGlnaAorI2RlZmluZSBpX2F1dGhvcglvc2QyLmh1cmQyLmhfaV9hdXRob3IKKyNlbmRpZgorCisjaWZkZWYJX19tYXNpeF9fCisjZGVmaW5lIGlfcmVzZXJ2ZWQxCW9zZDEubWFzaXgxLm1faV9yZXNlcnZlZDEKKyNkZWZpbmUgaV9mcmFnCQlvc2QyLm1hc2l4Mi5tX2lfZnJhZworI2RlZmluZSBpX2ZzaXplCQlvc2QyLm1hc2l4Mi5tX2lfZnNpemUKKyNkZWZpbmUgaV9yZXNlcnZlZDIJb3NkMi5tYXNpeDIubV9pX3Jlc2VydmVkMgorI2VuZGlmCisKKy8qCisgKiBGaWxlIHN5c3RlbSBzdGF0ZXMKKyAqLworI2RlZmluZQlFWFQyX1ZBTElEX0ZTCQkJMHgwMDAxCS8qIFVubW91bnRlZCBjbGVhbmx5ICovCisjZGVmaW5lCUVYVDJfRVJST1JfRlMJCQkweDAwMDIJLyogRXJyb3JzIGRldGVjdGVkICovCisKKy8qCisgKiBNb3VudCBmbGFncworICovCisjZGVmaW5lIEVYVDJfTU9VTlRfQ0hFQ0sJCTB4MDAwMDAxICAvKiBEbyBtb3VudC10aW1lIGNoZWNrcyAqLworI2RlZmluZSBFWFQyX01PVU5UX09MREFMTE9DCQkweDAwMDAwMiAgLyogRG9uJ3QgdXNlIHRoZSBuZXcgT3Jsb3YgYWxsb2NhdG9yICovCisjZGVmaW5lIEVYVDJfTU9VTlRfR1JQSUQJCTB4MDAwMDA0ICAvKiBDcmVhdGUgZmlsZXMgd2l0aCBkaXJlY3RvcnkncyBncm91cCAqLworI2RlZmluZSBFWFQyX01PVU5UX0RFQlVHCQkweDAwMDAwOCAgLyogU29tZSBkZWJ1Z2dpbmcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9FUlJPUlNfQ09OVAkJMHgwMDAwMTAgIC8qIENvbnRpbnVlIG9uIGVycm9ycyAqLworI2RlZmluZSBFWFQyX01PVU5UX0VSUk9SU19STwkJMHgwMDAwMjAgIC8qIFJlbW91bnQgZnMgcm8gb24gZXJyb3JzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfRVJST1JTX1BBTklDCQkweDAwMDA0MCAgLyogUGFuaWMgb24gZXJyb3JzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfTUlOSVhfREYJCTB4MDAwMDgwICAvKiBNaW1pY3MgdGhlIE1pbml4IHN0YXRmcyAqLworI2RlZmluZSBFWFQyX01PVU5UX05PQkgJCQkweDAwMDEwMCAgLyogTm8gYnVmZmVyX2hlYWRzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfTk9fVUlEMzIJCTB4MDAwMjAwICAvKiBEaXNhYmxlIDMyLWJpdCBVSURzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfWEFUVFJfVVNFUgkJMHgwMDQwMDAgIC8qIEV4dGVuZGVkIHVzZXIgYXR0cmlidXRlcyAqLworI2RlZmluZSBFWFQyX01PVU5UX1BPU0lYX0FDTAkJMHgwMDgwMDAgIC8qIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfWElQCQkJMHgwMTAwMDAgIC8qIEV4ZWN1dGUgaW4gcGxhY2UgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9VU1JRVU9UQQkJMHgwMjAwMDAgIC8qIHVzZXIgcXVvdGEgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9HUlBRVU9UQQkJMHgwNDAwMDAgIC8qIGdyb3VwIHF1b3RhICovCisjZGVmaW5lIEVYVDJfTU9VTlRfUkVTRVJWQVRJT04JCTB4MDgwMDAwICAvKiBQcmVhbGxvY2F0aW9uICovCisKKworI2RlZmluZSBjbGVhcl9vcHQobywgb3B0KQkJbyAmPSB+RVhUMl9NT1VOVF8jI29wdAorI2RlZmluZSBzZXRfb3B0KG8sIG9wdCkJCQlvIHw9IEVYVDJfTU9VTlRfIyNvcHQKKyNkZWZpbmUgdGVzdF9vcHQoc2IsIG9wdCkJCShFWFQyX1NCKHNiKS0+c19tb3VudF9vcHQgJiBcCisJCQkJCSBFWFQyX01PVU5UXyMjb3B0KQorLyoKKyAqIE1heGltYWwgbW91bnQgY291bnRzIGJldHdlZW4gdHdvIGZpbGVzeXN0ZW0gY2hlY2tzCisgKi8KKyNkZWZpbmUgRVhUMl9ERkxfTUFYX01OVF9DT1VOVAkJMjAJLyogQWxsb3cgMjAgbW91bnRzICovCisjZGVmaW5lIEVYVDJfREZMX0NIRUNLSU5URVJWQUwJCTAJLyogRG9uJ3QgdXNlIGludGVydmFsIGNoZWNrICovCisKKy8qCisgKiBCZWhhdmlvdXIgd2hlbiBkZXRlY3RpbmcgZXJyb3JzCisgKi8KKyNkZWZpbmUgRVhUMl9FUlJPUlNfQ09OVElOVUUJCTEJLyogQ29udGludWUgZXhlY3V0aW9uICovCisjZGVmaW5lIEVYVDJfRVJST1JTX1JPCQkJMgkvKiBSZW1vdW50IGZzIHJlYWQtb25seSAqLworI2RlZmluZSBFWFQyX0VSUk9SU19QQU5JQwkJMwkvKiBQYW5pYyAqLworI2RlZmluZSBFWFQyX0VSUk9SU19ERUZBVUxUCQlFWFQyX0VSUk9SU19DT05USU5VRQorCisvKgorICogU3RydWN0dXJlIG9mIHRoZSBzdXBlciBibG9jaworICovCitzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayB7CisJX19sZTMyCXNfaW5vZGVzX2NvdW50OwkJLyogSW5vZGVzIGNvdW50ICovCisJX19sZTMyCXNfYmxvY2tzX2NvdW50OwkJLyogQmxvY2tzIGNvdW50ICovCisJX19sZTMyCXNfcl9ibG9ja3NfY291bnQ7CS8qIFJlc2VydmVkIGJsb2NrcyBjb3VudCAqLworCV9fbGUzMglzX2ZyZWVfYmxvY2tzX2NvdW50OwkvKiBGcmVlIGJsb2NrcyBjb3VudCAqLworCV9fbGUzMglzX2ZyZWVfaW5vZGVzX2NvdW50OwkvKiBGcmVlIGlub2RlcyBjb3VudCAqLworCV9fbGUzMglzX2ZpcnN0X2RhdGFfYmxvY2s7CS8qIEZpcnN0IERhdGEgQmxvY2sgKi8KKwlfX2xlMzIJc19sb2dfYmxvY2tfc2l6ZTsJLyogQmxvY2sgc2l6ZSAqLworCV9fbGUzMglzX2xvZ19mcmFnX3NpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwlfX2xlMzIJc19ibG9ja3NfcGVyX2dyb3VwOwkvKiAjIEJsb2NrcyBwZXIgZ3JvdXAgKi8KKwlfX2xlMzIJc19mcmFnc19wZXJfZ3JvdXA7CS8qICMgRnJhZ21lbnRzIHBlciBncm91cCAqLworCV9fbGUzMglzX2lub2Rlc19wZXJfZ3JvdXA7CS8qICMgSW5vZGVzIHBlciBncm91cCAqLworCV9fbGUzMglzX210aW1lOwkJLyogTW91bnQgdGltZSAqLworCV9fbGUzMglzX3d0aW1lOwkJLyogV3JpdGUgdGltZSAqLworCV9fbGUxNglzX21udF9jb3VudDsJCS8qIE1vdW50IGNvdW50ICovCisJX19sZTE2CXNfbWF4X21udF9jb3VudDsJLyogTWF4aW1hbCBtb3VudCBjb3VudCAqLworCV9fbGUxNglzX21hZ2ljOwkJLyogTWFnaWMgc2lnbmF0dXJlICovCisJX19sZTE2CXNfc3RhdGU7CQkvKiBGaWxlIHN5c3RlbSBzdGF0ZSAqLworCV9fbGUxNglzX2Vycm9yczsJCS8qIEJlaGF2aW91ciB3aGVuIGRldGVjdGluZyBlcnJvcnMgKi8KKwlfX2xlMTYJc19taW5vcl9yZXZfbGV2ZWw7IAkvKiBtaW5vciByZXZpc2lvbiBsZXZlbCAqLworCV9fbGUzMglzX2xhc3RjaGVjazsJCS8qIHRpbWUgb2YgbGFzdCBjaGVjayAqLworCV9fbGUzMglzX2NoZWNraW50ZXJ2YWw7CS8qIG1heC4gdGltZSBiZXR3ZWVuIGNoZWNrcyAqLworCV9fbGUzMglzX2NyZWF0b3Jfb3M7CQkvKiBPUyAqLworCV9fbGUzMglzX3Jldl9sZXZlbDsJCS8qIFJldmlzaW9uIGxldmVsICovCisJX19sZTE2CXNfZGVmX3Jlc3VpZDsJCS8qIERlZmF1bHQgdWlkIGZvciByZXNlcnZlZCBibG9ja3MgKi8KKwlfX2xlMTYJc19kZWZfcmVzZ2lkOwkJLyogRGVmYXVsdCBnaWQgZm9yIHJlc2VydmVkIGJsb2NrcyAqLworCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBmb3IgRVhUMl9EWU5BTUlDX1JFViBzdXBlcmJsb2NrcyBvbmx5LgorCSAqCisJICogTm90ZTogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY29tcGF0aWJsZSBmZWF0dXJlIHNldCBhbmQKKwkgKiB0aGUgaW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0IGlzIHRoYXQgaWYgdGhlcmUgaXMgYSBiaXQgc2V0CisJICogaW4gdGhlIGluY29tcGF0aWJsZSBmZWF0dXJlIHNldCB0aGF0IHRoZSBrZXJuZWwgZG9lc24ndAorCSAqIGtub3cgYWJvdXQsIGl0IHNob3VsZCByZWZ1c2UgdG8gbW91bnQgdGhlIGZpbGVzeXN0ZW0uCisJICogCisJICogZTJmc2NrJ3MgcmVxdWlyZW1lbnRzIGFyZSBtb3JlIHN0cmljdDsgaWYgaXQgZG9lc24ndCBrbm93CisJICogYWJvdXQgYSBmZWF0dXJlIGluIGVpdGhlciB0aGUgY29tcGF0aWJsZSBvciBpbmNvbXBhdGlibGUKKwkgKiBmZWF0dXJlIHNldCwgaXQgbXVzdCBhYm9ydCBhbmQgbm90IHRyeSB0byBtZWRkbGUgd2l0aAorCSAqIHRoaW5ncyBpdCBkb2Vzbid0IHVuZGVyc3RhbmQuLi4KKwkgKi8KKwlfX2xlMzIJc19maXJzdF9pbm87IAkJLyogRmlyc3Qgbm9uLXJlc2VydmVkIGlub2RlICovCisJX19sZTE2ICAgc19pbm9kZV9zaXplOyAJCS8qIHNpemUgb2YgaW5vZGUgc3RydWN0dXJlICovCisJX19sZTE2CXNfYmxvY2tfZ3JvdXBfbnI7IAkvKiBibG9jayBncm91cCAjIG9mIHRoaXMgc3VwZXJibG9jayAqLworCV9fbGUzMglzX2ZlYXR1cmVfY29tcGF0OyAJLyogY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCV9fbGUzMglzX2ZlYXR1cmVfaW5jb21wYXQ7IAkvKiBpbmNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKwlfX2xlMzIJc19mZWF0dXJlX3JvX2NvbXBhdDsgCS8qIHJlYWRvbmx5LWNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKwlfX3U4CXNfdXVpZFsxNl07CQkvKiAxMjgtYml0IHV1aWQgZm9yIHZvbHVtZSAqLworCWNoYXIJc192b2x1bWVfbmFtZVsxNl07IAkvKiB2b2x1bWUgbmFtZSAqLworCWNoYXIJc19sYXN0X21vdW50ZWRbNjRdOyAJLyogZGlyZWN0b3J5IHdoZXJlIGxhc3QgbW91bnRlZCAqLworCV9fbGUzMglzX2FsZ29yaXRobV91c2FnZV9iaXRtYXA7IC8qIEZvciBjb21wcmVzc2lvbiAqLworCS8qCisJICogUGVyZm9ybWFuY2UgaGludHMuICBEaXJlY3RvcnkgcHJlYWxsb2NhdGlvbiBzaG91bGQgb25seQorCSAqIGhhcHBlbiBpZiB0aGUgRVhUMl9DT01QQVRfUFJFQUxMT0MgZmxhZyBpcyBvbi4KKwkgKi8KKwlfX3U4CXNfcHJlYWxsb2NfYmxvY2tzOwkvKiBOciBvZiBibG9ja3MgdG8gdHJ5IHRvIHByZWFsbG9jYXRlKi8KKwlfX3U4CXNfcHJlYWxsb2NfZGlyX2Jsb2NrczsJLyogTnIgdG8gcHJlYWxsb2NhdGUgZm9yIGRpcnMgKi8KKwlfX3UxNglzX3BhZGRpbmcxOworCS8qCisJICogSm91cm5hbGluZyBzdXBwb3J0IHZhbGlkIGlmIEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwgc2V0LgorCSAqLworCV9fdTgJc19qb3VybmFsX3V1aWRbMTZdOwkvKiB1dWlkIG9mIGpvdXJuYWwgc3VwZXJibG9jayAqLworCV9fdTMyCXNfam91cm5hbF9pbnVtOwkJLyogaW5vZGUgbnVtYmVyIG9mIGpvdXJuYWwgZmlsZSAqLworCV9fdTMyCXNfam91cm5hbF9kZXY7CQkvKiBkZXZpY2UgbnVtYmVyIG9mIGpvdXJuYWwgZmlsZSAqLworCV9fdTMyCXNfbGFzdF9vcnBoYW47CQkvKiBzdGFydCBvZiBsaXN0IG9mIGlub2RlcyB0byBkZWxldGUgKi8KKwlfX3UzMglzX2hhc2hfc2VlZFs0XTsJCS8qIEhUUkVFIGhhc2ggc2VlZCAqLworCV9fdTgJc19kZWZfaGFzaF92ZXJzaW9uOwkvKiBEZWZhdWx0IGhhc2ggdmVyc2lvbiB0byB1c2UgKi8KKwlfX3U4CXNfcmVzZXJ2ZWRfY2hhcl9wYWQ7CisJX191MTYJc19yZXNlcnZlZF93b3JkX3BhZDsKKwlfX2xlMzIJc19kZWZhdWx0X21vdW50X29wdHM7CisgCV9fbGUzMglzX2ZpcnN0X21ldGFfYmc7IAkvKiBGaXJzdCBtZXRhYmxvY2sgYmxvY2sgZ3JvdXAgKi8KKwlfX3UzMglzX3Jlc2VydmVkWzE5MF07CS8qIFBhZGRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgYmxvY2sgKi8KK307CisKKy8qCisgKiBDb2RlcyBmb3Igb3BlcmF0aW5nIHN5c3RlbXMKKyAqLworI2RlZmluZSBFWFQyX09TX0xJTlVYCQkwCisjZGVmaW5lIEVYVDJfT1NfSFVSRAkJMQorI2RlZmluZSBFWFQyX09TX01BU0lYCQkyCisjZGVmaW5lIEVYVDJfT1NfRlJFRUJTRAkJMworI2RlZmluZSBFWFQyX09TX0xJVEVTCQk0CisKKy8qCisgKiBSZXZpc2lvbiBsZXZlbHMKKyAqLworI2RlZmluZSBFWFQyX0dPT0RfT0xEX1JFVgkwCS8qIFRoZSBnb29kIG9sZCAob3JpZ2luYWwpIGZvcm1hdCAqLworI2RlZmluZSBFWFQyX0RZTkFNSUNfUkVWCTEgCS8qIFYyIGZvcm1hdCB3LyBkeW5hbWljIGlub2RlIHNpemVzICovCisKKyNkZWZpbmUgRVhUMl9DVVJSRU5UX1JFVglFWFQyX0dPT0RfT0xEX1JFVgorI2RlZmluZSBFWFQyX01BWF9TVVBQX1JFVglFWFQyX0RZTkFNSUNfUkVWCisKKyNkZWZpbmUgRVhUMl9HT09EX09MRF9JTk9ERV9TSVpFIDEyOAorCisvKgorICogRmVhdHVyZSBzZXQgZGVmaW5pdGlvbnMKKyAqLworCisjZGVmaW5lIEVYVDJfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCSggRVhUMl9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9jb21wYXQgJiBjcHVfdG9fbGUzMihtYXNrKSApCisjZGVmaW5lIEVYVDJfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCSggRVhUMl9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9yb19jb21wYXQgJiBjcHVfdG9fbGUzMihtYXNrKSApCisjZGVmaW5lIEVYVDJfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCisJKCBFWFQyX1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2luY29tcGF0ICYgY3B1X3RvX2xlMzIobWFzaykgKQorI2RlZmluZSBFWFQyX1NFVF9DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwlFWFQyX1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2NvbXBhdCB8PSBjcHVfdG9fbGUzMihtYXNrKQorI2RlZmluZSBFWFQyX1NFVF9ST19DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwlFWFQyX1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX3JvX2NvbXBhdCB8PSBjcHVfdG9fbGUzMihtYXNrKQorI2RlZmluZSBFWFQyX1NFVF9JTkNPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCUVYVDJfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfaW5jb21wYXQgfD0gY3B1X3RvX2xlMzIobWFzaykKKyNkZWZpbmUgRVhUMl9DTEVBUl9DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwlFWFQyX1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2NvbXBhdCAmPSB+Y3B1X3RvX2xlMzIobWFzaykKKyNkZWZpbmUgRVhUMl9DTEVBUl9ST19DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwlFWFQyX1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX3JvX2NvbXBhdCAmPSB+Y3B1X3RvX2xlMzIobWFzaykKKyNkZWZpbmUgRVhUMl9DTEVBUl9JTkNPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCUVYVDJfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfaW5jb21wYXQgJj0gfmNwdV90b19sZTMyKG1hc2spCisKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfUFJFQUxMT0MJMHgwMDAxCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfSU1BR0lDX0lOT0RFUwkweDAwMDIKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTAkJMHgwMDA0CisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIJCTB4MDAwOAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX1JFU0laRV9JTk8JCTB4MDAxMAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9JTkRFWAkJMHgwMDIwCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfQU5ZCQkJMHhmZmZmZmZmZgorCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSCTB4MDAwMQorI2RlZmluZSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEUJMHgwMDAyCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfQlRSRUVfRElSCTB4MDAwNAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0FOWQkJMHhmZmZmZmZmZgorCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9DT01QUkVTU0lPTgkweDAwMDEKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFCQkweDAwMDIKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIJCTB4MDAwNAorI2RlZmluZSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfSk9VUk5BTF9ERVYJMHgwMDA4CisjZGVmaW5lIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0JHCQkweDAwMTAKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0FOWQkJMHhmZmZmZmZmZgorCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfU1VQUAlFWFQyX0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9TVVBQCShFWFQyX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEV8IFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0JHKQorI2RlZmluZSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFAJKEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSfCBcCisJCQkJCSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEV8IFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfQlRSRUVfRElSKQorI2RlZmluZSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1VOU1VQUE9SVEVECX5FWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFAKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX1VOU1VQUE9SVEVECX5FWFQyX0ZFQVRVUkVfSU5DT01QQVRfU1VQUAorCisvKgorICogRGVmYXVsdCB2YWx1ZXMgZm9yIHVzZXIgYW5kL29yIGdyb3VwIHVzaW5nIHJlc2VydmVkIGJsb2NrcworICovCisjZGVmaW5lCUVYVDJfREVGX1JFU1VJRAkJMAorI2RlZmluZQlFWFQyX0RFRl9SRVNHSUQJCTAKKworLyoKKyAqIERlZmF1bHQgbW91bnQgb3B0aW9ucworICovCisjZGVmaW5lIEVYVDJfREVGTV9ERUJVRwkJMHgwMDAxCisjZGVmaW5lIEVYVDJfREVGTV9CU0RHUk9VUFMJMHgwMDAyCisjZGVmaW5lIEVYVDJfREVGTV9YQVRUUl9VU0VSCTB4MDAwNAorI2RlZmluZSBFWFQyX0RFRk1fQUNMCQkweDAwMDgKKyNkZWZpbmUgRVhUMl9ERUZNX1VJRDE2CQkweDAwMTAKKyAgICAvKiBOb3QgdXNlZCBieSBleHQyLCBidXQgcmVzZXJ2ZWQgZm9yIHVzZSBieSBleHQzICovCisjZGVmaW5lIEVYVDNfREVGTV9KTU9ERQkJMHgwMDYwIAorI2RlZmluZSBFWFQzX0RFRk1fSk1PREVfREFUQQkweDAwMjAKKyNkZWZpbmUgRVhUM19ERUZNX0pNT0RFX09SREVSRUQJMHgwMDQwCisjZGVmaW5lIEVYVDNfREVGTV9KTU9ERV9XQkFDSwkweDAwNjAKKworLyoKKyAqIFN0cnVjdHVyZSBvZiBhIGRpcmVjdG9yeSBlbnRyeQorICovCisjZGVmaW5lIEVYVDJfTkFNRV9MRU4gMjU1CisKK3N0cnVjdCBleHQyX2Rpcl9lbnRyeSB7CisJX19sZTMyCWlub2RlOwkJCS8qIElub2RlIG51bWJlciAqLworCV9fbGUxNglyZWNfbGVuOwkJLyogRGlyZWN0b3J5IGVudHJ5IGxlbmd0aCAqLworCV9fbGUxNgluYW1lX2xlbjsJCS8qIE5hbWUgbGVuZ3RoICovCisJY2hhcgluYW1lW0VYVDJfTkFNRV9MRU5dOwkvKiBGaWxlIG5hbWUgKi8KK307CisKKy8qCisgKiBUaGUgbmV3IHZlcnNpb24gb2YgdGhlIGRpcmVjdG9yeSBlbnRyeS4gIFNpbmNlIEVYVDIgc3RydWN0dXJlcyBhcmUKKyAqIHN0b3JlZCBpbiBpbnRlbCBieXRlIG9yZGVyLCBhbmQgdGhlIG5hbWVfbGVuIGZpZWxkIGNvdWxkIG5ldmVyIGJlCisgKiBiaWdnZXIgdGhhbiAyNTUgY2hhcnMsIGl0J3Mgc2FmZSB0byByZWNsYWltIHRoZSBleHRyYSBieXRlIGZvciB0aGUKKyAqIGZpbGVfdHlwZSBmaWVsZC4KKyAqLworc3RydWN0IGV4dDJfZGlyX2VudHJ5XzIgeworCV9fbGUzMglpbm9kZTsJCQkvKiBJbm9kZSBudW1iZXIgKi8KKwlfX2xlMTYJcmVjX2xlbjsJCS8qIERpcmVjdG9yeSBlbnRyeSBsZW5ndGggKi8KKwlfX3U4CW5hbWVfbGVuOwkJLyogTmFtZSBsZW5ndGggKi8KKwlfX3U4CWZpbGVfdHlwZTsKKwljaGFyCW5hbWVbRVhUMl9OQU1FX0xFTl07CS8qIEZpbGUgbmFtZSAqLworfTsKKworLyoKKyAqIEV4dDIgZGlyZWN0b3J5IGZpbGUgdHlwZXMuICBPbmx5IHRoZSBsb3cgMyBiaXRzIGFyZSB1c2VkLiAgVGhlCisgKiBvdGhlciBiaXRzIGFyZSByZXNlcnZlZCBmb3Igbm93LgorICovCitlbnVtIHsKKwlFWFQyX0ZUX1VOS05PV04JCT0gMCwKKwlFWFQyX0ZUX1JFR19GSUxFCT0gMSwKKwlFWFQyX0ZUX0RJUgkJPSAyLAorCUVYVDJfRlRfQ0hSREVWCQk9IDMsCisJRVhUMl9GVF9CTEtERVYJCT0gNCwKKwlFWFQyX0ZUX0ZJRk8JCT0gNSwKKwlFWFQyX0ZUX1NPQ0sJCT0gNiwKKwlFWFQyX0ZUX1NZTUxJTksJCT0gNywKKwlFWFQyX0ZUX01BWAorfTsKKworLyoKKyAqIEVYVDJfRElSX1BBRCBkZWZpbmVzIHRoZSBkaXJlY3RvcnkgZW50cmllcyBib3VuZGFyaWVzCisgKgorICogTk9URTogSXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQKKyAqLworI2RlZmluZSBFWFQyX0RJUl9QQUQJCSAJNAorI2RlZmluZSBFWFQyX0RJUl9ST1VORCAJCQkoRVhUMl9ESVJfUEFEIC0gMSkKKyNkZWZpbmUgRVhUMl9ESVJfUkVDX0xFTihuYW1lX2xlbikJKCgobmFtZV9sZW4pICsgOCArIEVYVDJfRElSX1JPVU5EKSAmIFwKKwkJCQkJIH5FWFQyX0RJUl9ST1VORCkKKyNkZWZpbmUgRVhUMl9NQVhfUkVDX0xFTgkJKCgxPDwxNiktMSkKKworI2VuZGlmCS8qIF9MSU5VWF9FWFQyX0ZTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmFkdmlzZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mYWR2aXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThlNzQ3MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmFkdmlzZS5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgRkFEVklTRV9IX0lOQ0xVREVECisjZGVmaW5lIEZBRFZJU0VfSF9JTkNMVURFRAorCisjZGVmaW5lIFBPU0lYX0ZBRFZfTk9STUFMCTAgLyogTm8gZnVydGhlciBzcGVjaWFsIHRyZWF0bWVudC4gICovCisjZGVmaW5lIFBPU0lYX0ZBRFZfUkFORE9NCTEgLyogRXhwZWN0IHJhbmRvbSBwYWdlIHJlZmVyZW5jZXMuICAqLworI2RlZmluZSBQT1NJWF9GQURWX1NFUVVFTlRJQUwJMiAvKiBFeHBlY3Qgc2VxdWVudGlhbCBwYWdlIHJlZmVyZW5jZXMuICAqLworI2RlZmluZSBQT1NJWF9GQURWX1dJTExORUVECTMgLyogV2lsbCBuZWVkIHRoZXNlIHBhZ2VzLiAgKi8KKworLyoKKyAqIFRoZSBhZHZpc2UgdmFsdWVzIGZvciBQT1NJWF9GQURWX0RPTlRORUVEIGFuZCBQT1NJWF9BRFZfTk9SRVVTRQorICogZm9yIHMzOTAtNjQgZGlmZmVyIGZyb20gdGhlIHZhbHVlcyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHdvcmxkLgorICovCisjaWYgZGVmaW5lZChfX3MzOTB4X18pCisjZGVmaW5lIFBPU0lYX0ZBRFZfRE9OVE5FRUQJNiAvKiBEb24ndCBuZWVkIHRoZXNlIHBhZ2VzLiAgKi8KKyNkZWZpbmUgUE9TSVhfRkFEVl9OT1JFVVNFCTcgLyogRGF0YSB3aWxsIGJlIGFjY2Vzc2VkIG9uY2UuICAqLworI2Vsc2UKKyNkZWZpbmUgUE9TSVhfRkFEVl9ET05UTkVFRAk0IC8qIERvbid0IG5lZWQgdGhlc2UgcGFnZXMuICAqLworI2RlZmluZSBQT1NJWF9GQURWX05PUkVVU0UJNSAvKiBEYXRhIHdpbGwgYmUgYWNjZXNzZWQgb25jZS4gICovCisjZW5kaWYKKworI2VuZGlmCS8qIEZBRFZJU0VfSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mYWxsb2MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTliYjRiNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmFsbG9jLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9GQUxMT0NfSF8KKyNkZWZpbmUgX0ZBTExPQ19IXworCisjZGVmaW5lIEZBTExPQ19GTF9LRUVQX1NJWkUJMHgwMSAvKiBkZWZhdWx0IGlzIGV4dGVuZCBzaXplICovCisjZGVmaW5lIEZBTExPQ19GTF9QVU5DSF9IT0xFCTB4MDIgLyogZGUtYWxsb2NhdGVzIHJhbmdlICovCisKKworI2VuZGlmIC8qIF9GQUxMT0NfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmFub3RpZnkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmFub3RpZnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzgwZTVhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mYW5vdGlmeS5oCkBAIC0wLDAgKzEsMTE2IEBACisjaWZuZGVmIF9MSU5VWF9GQU5PVElGWV9ICisjZGVmaW5lIF9MSU5VWF9GQU5PVElGWV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiB0aGUgZm9sbG93aW5nIGV2ZW50cyB0aGF0IHVzZXItc3BhY2UgY2FuIHJlZ2lzdGVyIGZvciAqLworI2RlZmluZSBGQU5fQUNDRVNTCQkweDAwMDAwMDAxCS8qIEZpbGUgd2FzIGFjY2Vzc2VkICovCisjZGVmaW5lIEZBTl9NT0RJRlkJCTB4MDAwMDAwMDIJLyogRmlsZSB3YXMgbW9kaWZpZWQgKi8KKyNkZWZpbmUgRkFOX0NMT1NFX1dSSVRFCQkweDAwMDAwMDA4CS8qIFdyaXR0YWJsZSBmaWxlIGNsb3NlZCAqLworI2RlZmluZSBGQU5fQ0xPU0VfTk9XUklURQkweDAwMDAwMDEwCS8qIFVud3JpdHRhYmxlIGZpbGUgY2xvc2VkICovCisjZGVmaW5lIEZBTl9PUEVOCQkweDAwMDAwMDIwCS8qIEZpbGUgd2FzIG9wZW5lZCAqLworCisjZGVmaW5lIEZBTl9RX09WRVJGTE9XCQkweDAwMDA0MDAwCS8qIEV2ZW50IHF1ZXVlZCBvdmVyZmxvd2VkICovCisKKyNkZWZpbmUgRkFOX09QRU5fUEVSTQkJMHgwMDAxMDAwMAkvKiBGaWxlIG9wZW4gaW4gcGVybSBjaGVjayAqLworI2RlZmluZSBGQU5fQUNDRVNTX1BFUk0JCTB4MDAwMjAwMDAJLyogRmlsZSBhY2Nlc3NlZCBpbiBwZXJtIGNoZWNrICovCisKKyNkZWZpbmUgRkFOX09ORElSCQkweDQwMDAwMDAwCS8qIGV2ZW50IG9jY3VycmVkIGFnYWluc3QgZGlyICovCisKKyNkZWZpbmUgRkFOX0VWRU5UX09OX0NISUxECTB4MDgwMDAwMDAJLyogaW50ZXJlc3RlZCBpbiBjaGlsZCBldmVudHMgKi8KKworLyogaGVscGVyIGV2ZW50cyAqLworI2RlZmluZSBGQU5fQ0xPU0UJCShGQU5fQ0xPU0VfV1JJVEUgfCBGQU5fQ0xPU0VfTk9XUklURSkgLyogY2xvc2UgKi8KKworLyogZmxhZ3MgdXNlZCBmb3IgZmFub3RpZnlfaW5pdCgpICovCisjZGVmaW5lIEZBTl9DTE9FWEVDCQkweDAwMDAwMDAxCisjZGVmaW5lIEZBTl9OT05CTE9DSwkJMHgwMDAwMDAwMgorCisvKiBUaGVzZSBhcmUgTk9UIGJpdHdpc2UgZmxhZ3MuICBCb3RoIGJpdHMgYXJlIHVzZWQgdG9ndGhlci4gICovCisjZGVmaW5lIEZBTl9DTEFTU19OT1RJRgkJMHgwMDAwMDAwMAorI2RlZmluZSBGQU5fQ0xBU1NfQ09OVEVOVAkweDAwMDAwMDA0CisjZGVmaW5lIEZBTl9DTEFTU19QUkVfQ09OVEVOVAkweDAwMDAwMDA4CisjZGVmaW5lIEZBTl9BTExfQ0xBU1NfQklUUwkoRkFOX0NMQVNTX05PVElGIHwgRkFOX0NMQVNTX0NPTlRFTlQgfCBcCisJCQkJIEZBTl9DTEFTU19QUkVfQ09OVEVOVCkKKworI2RlZmluZSBGQU5fVU5MSU1JVEVEX1FVRVVFCTB4MDAwMDAwMTAKKyNkZWZpbmUgRkFOX1VOTElNSVRFRF9NQVJLUwkweDAwMDAwMDIwCisKKyNkZWZpbmUgRkFOX0FMTF9JTklUX0ZMQUdTCShGQU5fQ0xPRVhFQyB8IEZBTl9OT05CTE9DSyB8IFwKKwkJCQkgRkFOX0FMTF9DTEFTU19CSVRTIHwgRkFOX1VOTElNSVRFRF9RVUVVRSB8XAorCQkJCSBGQU5fVU5MSU1JVEVEX01BUktTKQorCisvKiBmbGFncyB1c2VkIGZvciBmYW5vdGlmeV9tb2RpZnlfbWFyaygpICovCisjZGVmaW5lIEZBTl9NQVJLX0FERAkJMHgwMDAwMDAwMQorI2RlZmluZSBGQU5fTUFSS19SRU1PVkUJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRkFOX01BUktfRE9OVF9GT0xMT1cJMHgwMDAwMDAwNAorI2RlZmluZSBGQU5fTUFSS19PTkxZRElSCTB4MDAwMDAwMDgKKyNkZWZpbmUgRkFOX01BUktfTU9VTlQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgRkFOX01BUktfSUdOT1JFRF9NQVNLCTB4MDAwMDAwMjAKKyNkZWZpbmUgRkFOX01BUktfSUdOT1JFRF9TVVJWX01PRElGWQkweDAwMDAwMDQwCisjZGVmaW5lIEZBTl9NQVJLX0ZMVVNICQkweDAwMDAwMDgwCisKKyNkZWZpbmUgRkFOX0FMTF9NQVJLX0ZMQUdTCShGQU5fTUFSS19BREQgfFwKKwkJCQkgRkFOX01BUktfUkVNT1ZFIHxcCisJCQkJIEZBTl9NQVJLX0RPTlRfRk9MTE9XIHxcCisJCQkJIEZBTl9NQVJLX09OTFlESVIgfFwKKwkJCQkgRkFOX01BUktfTU9VTlQgfFwKKwkJCQkgRkFOX01BUktfSUdOT1JFRF9NQVNLIHxcCisJCQkJIEZBTl9NQVJLX0lHTk9SRURfU1VSVl9NT0RJRlkgfFwKKwkJCQkgRkFOX01BUktfRkxVU0gpCisKKy8qCisgKiBBbGwgb2YgdGhlIGV2ZW50cyAtIHdlIGJ1aWxkIHRoZSBsaXN0IGJ5IGhhbmQgc28gdGhhdCB3ZSBjYW4gYWRkIGZsYWdzIGluCisgKiB0aGUgZnV0dXJlIGFuZCBub3QgYnJlYWsgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gIEFwcHMgd2lsbCBnZXQgb25seSB0aGUKKyAqIGV2ZW50cyB0aGF0IHRoZXkgb3JpZ2luYWxseSB3YW50ZWQuICBCZSBzdXJlIHRvIGFkZCBuZXcgZXZlbnRzIGhlcmUhCisgKi8KKyNkZWZpbmUgRkFOX0FMTF9FVkVOVFMgKEZBTl9BQ0NFU1MgfFwKKwkJCUZBTl9NT0RJRlkgfFwKKwkJCUZBTl9DTE9TRSB8XAorCQkJRkFOX09QRU4pCisKKy8qCisgKiBBbGwgZXZlbnRzIHdoaWNoIHJlcXVpcmUgYSBwZXJtaXNzaW9uIHJlc3BvbnNlIGZyb20gdXNlcnNwYWNlCisgKi8KKyNkZWZpbmUgRkFOX0FMTF9QRVJNX0VWRU5UUyAoRkFOX09QRU5fUEVSTSB8XAorCQkJICAgICBGQU5fQUNDRVNTX1BFUk0pCisKKyNkZWZpbmUgRkFOX0FMTF9PVVRHT0lOR19FVkVOVFMJKEZBTl9BTExfRVZFTlRTIHxcCisJCQkJIEZBTl9BTExfUEVSTV9FVkVOVFMgfFwKKwkJCQkgRkFOX1FfT1ZFUkZMT1cpCisKKyNkZWZpbmUgRkFOT1RJRllfTUVUQURBVEFfVkVSU0lPTgkzCisKK3N0cnVjdCBmYW5vdGlmeV9ldmVudF9tZXRhZGF0YSB7CisJX191MzIgZXZlbnRfbGVuOworCV9fdTggdmVyczsKKwlfX3U4IHJlc2VydmVkOworCV9fdTE2IG1ldGFkYXRhX2xlbjsKKwlfX2FsaWduZWRfdTY0IG1hc2s7CisJX19zMzIgZmQ7CisJX19zMzIgcGlkOworfTsKKworc3RydWN0IGZhbm90aWZ5X3Jlc3BvbnNlIHsKKwlfX3MzMiBmZDsKKwlfX3UzMiByZXNwb25zZTsKK307CisKKy8qIExlZ2l0IHVzZXJzcGFjZSByZXNwb25zZXMgdG8gYSBfUEVSTSBldmVudCAqLworI2RlZmluZSBGQU5fQUxMT1cJMHgwMQorI2RlZmluZSBGQU5fREVOWQkweDAyCisvKiBObyBmZCBzZXQgaW4gZXZlbnQgKi8KKyNkZWZpbmUgRkFOX05PRkQJLTEKKworLyogSGVscGVyIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggZmFub3RpZnlfZXZlbnRfbWV0YWRhdGEgYnVmZmVycyAqLworI2RlZmluZSBGQU5fRVZFTlRfTUVUQURBVEFfTEVOIChzaXplb2Yoc3RydWN0IGZhbm90aWZ5X2V2ZW50X21ldGFkYXRhKSkKKworI2RlZmluZSBGQU5fRVZFTlRfTkVYVChtZXRhLCBsZW4pICgobGVuKSAtPSAobWV0YSktPmV2ZW50X2xlbiwgXAorCQkJCSAgIChzdHJ1Y3QgZmFub3RpZnlfZXZlbnRfbWV0YWRhdGEqKSgoKGNoYXIgKikobWV0YSkpICsgXAorCQkJCSAgIChtZXRhKS0+ZXZlbnRfbGVuKSkKKworI2RlZmluZSBGQU5fRVZFTlRfT0sobWV0YSwgbGVuKQkoKGxvbmcpKGxlbikgPj0gKGxvbmcpRkFOX0VWRU5UX01FVEFEQVRBX0xFTiAmJiBcCisJCQkJKGxvbmcpKG1ldGEpLT5ldmVudF9sZW4gPj0gKGxvbmcpRkFOX0VWRU5UX01FVEFEQVRBX0xFTiAmJiBcCisJCQkJKGxvbmcpKG1ldGEpLT5ldmVudF9sZW4gPD0gKGxvbmcpKGxlbikpCisKKyNlbmRpZiAvKiBfTElOVVhfRkFOT1RJRllfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mYi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMTc3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZiLmgKQEAgLTAsMCArMSwzOTQgQEAKKyNpZm5kZWYgX0xJTlVYX0ZCX0gKKyNkZWZpbmUgX0xJTlVYX0ZCX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKKy8qIERlZmluaXRpb25zIG9mIGZyYW1lIGJ1ZmZlcnMJCQkJCQkqLworCisjZGVmaW5lIEZCX01BWAkJCTMyCS8qIHN1ZmZpY2llbnQgZm9yIG5vdyAqLworCisvKiBpb2N0bHMKKyAgIDB4NDYgaXMgJ0YnCQkJCQkJCQkqLworI2RlZmluZSBGQklPR0VUX1ZTQ1JFRU5JTkZPCTB4NDYwMAorI2RlZmluZSBGQklPUFVUX1ZTQ1JFRU5JTkZPCTB4NDYwMQorI2RlZmluZSBGQklPR0VUX0ZTQ1JFRU5JTkZPCTB4NDYwMgorI2RlZmluZSBGQklPR0VUQ01BUAkJMHg0NjA0CisjZGVmaW5lIEZCSU9QVVRDTUFQCQkweDQ2MDUKKyNkZWZpbmUgRkJJT1BBTl9ESVNQTEFZCQkweDQ2MDYKKyNkZWZpbmUgRkJJT19DVVJTT1IgICAgICAgICAgICBfSU9XUignRicsIDB4MDgsIHN0cnVjdCBmYl9jdXJzb3IpCisvKiAweDQ2MDctMHg0NjBCIGFyZSBkZWZpbmVkIGJlbG93ICovCisvKiAjZGVmaW5lIEZCSU9HRVRfTU9OSVRPUlNQRUMJMHg0NjBDICovCisvKiAjZGVmaW5lIEZCSU9QVVRfTU9OSVRPUlNQRUMJMHg0NjBEICovCisvKiAjZGVmaW5lIEZCSU9TV0lUQ0hfTU9OSUJJVAkweDQ2MEUgKi8KKyNkZWZpbmUgRkJJT0dFVF9DT04yRkJNQVAJMHg0NjBGCisjZGVmaW5lIEZCSU9QVVRfQ09OMkZCTUFQCTB4NDYxMAorI2RlZmluZSBGQklPQkxBTksJCTB4NDYxMQkJLyogYXJnOiAwIG9yIHZlc2EgbGV2ZWwgKyAxICovCisjZGVmaW5lIEZCSU9HRVRfVkJMQU5LCQlfSU9SKCdGJywgMHgxMiwgc3RydWN0IGZiX3ZibGFuaykKKyNkZWZpbmUgRkJJT19BTExPQyAgICAgICAgICAgICAgMHg0NjEzCisjZGVmaW5lIEZCSU9fRlJFRSAgICAgICAgICAgICAgIDB4NDYxNAorI2RlZmluZSBGQklPR0VUX0dMWVBIICAgICAgICAgICAweDQ2MTUKKyNkZWZpbmUgRkJJT0dFVF9IV0NJTkZPICAgICAgICAgMHg0NjE2CisjZGVmaW5lIEZCSU9QVVRfTU9ERUlORk8gICAgICAgIDB4NDYxNworI2RlZmluZSBGQklPR0VUX0RJU1BJTkZPICAgICAgICAweDQ2MTgKKyNkZWZpbmUgRkJJT19XQUlURk9SVlNZTkMJX0lPVygnRicsIDB4MjAsIF9fdTMyKQorCisjZGVmaW5lIEZCX1RZUEVfUEFDS0VEX1BJWEVMUwkJMAkvKiBQYWNrZWQgUGl4ZWxzCSovCisjZGVmaW5lIEZCX1RZUEVfUExBTkVTCQkJMQkvKiBOb24gaW50ZXJsZWF2ZWQgcGxhbmVzICovCisjZGVmaW5lIEZCX1RZUEVfSU5URVJMRUFWRURfUExBTkVTCTIJLyogSW50ZXJsZWF2ZWQgcGxhbmVzCSovCisjZGVmaW5lIEZCX1RZUEVfVEVYVAkJCTMJLyogVGV4dC9hdHRyaWJ1dGVzCSovCisjZGVmaW5lIEZCX1RZUEVfVkdBX1BMQU5FUwkJNAkvKiBFR0EvVkdBIHBsYW5lcwkqLworCisjZGVmaW5lIEZCX0FVWF9URVhUX01EQQkJMAkvKiBNb25vY2hyb21lIHRleHQgKi8KKyNkZWZpbmUgRkJfQVVYX1RFWFRfQ0dBCQkxCS8qIENHQS9FR0EvVkdBIENvbG9yIHRleHQgKi8KKyNkZWZpbmUgRkJfQVVYX1RFWFRfUzNfTU1JTwkyCS8qIFMzIE1NSU8gZmFzdHRleHQgKi8KKyNkZWZpbmUgRkJfQVVYX1RFWFRfTUdBX1NURVAxNgkzCS8qIE1HQSBNaWxsZW5pdW0gSTogdGV4dCwgYXR0ciwgMTQgcmVzZXJ2ZWQgYnl0ZXMgKi8KKyNkZWZpbmUgRkJfQVVYX1RFWFRfTUdBX1NURVA4CTQJLyogb3RoZXIgTUdBczogICAgICB0ZXh0LCBhdHRyLCAgNiByZXNlcnZlZCBieXRlcyAqLworI2RlZmluZSBGQl9BVVhfVEVYVF9TVkdBX0dST1VQCTgJLyogOC0xNTogU1ZHQSB0aWxlYmxpdCBjb21wYXRpYmxlIG1vZGVzICovCisjZGVmaW5lIEZCX0FVWF9URVhUX1NWR0FfTUFTSwk3CS8qIGxvd2VyIHRocmVlIGJpdHMgc2F5cyBzdGVwICovCisjZGVmaW5lIEZCX0FVWF9URVhUX1NWR0FfU1RFUDIJOAkvKiBTVkdBIHRleHQgbW9kZTogIHRleHQsIGF0dHIgKi8KKyNkZWZpbmUgRkJfQVVYX1RFWFRfU1ZHQV9TVEVQNAk5CS8qIFNWR0EgdGV4dCBtb2RlOiAgdGV4dCwgYXR0ciwgIDIgcmVzZXJ2ZWQgYnl0ZXMgKi8KKyNkZWZpbmUgRkJfQVVYX1RFWFRfU1ZHQV9TVEVQOAkxMAkvKiBTVkdBIHRleHQgbW9kZTogIHRleHQsIGF0dHIsICA2IHJlc2VydmVkIGJ5dGVzICovCisjZGVmaW5lIEZCX0FVWF9URVhUX1NWR0FfU1RFUDE2CTExCS8qIFNWR0EgdGV4dCBtb2RlOiAgdGV4dCwgYXR0ciwgMTQgcmVzZXJ2ZWQgYnl0ZXMgKi8KKyNkZWZpbmUgRkJfQVVYX1RFWFRfU1ZHQV9MQVNUCTE1CS8qIHJlc2VydmVkIHVwIHRvIDE1ICovCisKKyNkZWZpbmUgRkJfQVVYX1ZHQV9QTEFORVNfVkdBNAkJMAkvKiAxNiBjb2xvciBwbGFuZXMgKEVHQS9WR0EpICovCisjZGVmaW5lIEZCX0FVWF9WR0FfUExBTkVTX0NGQjQJCTEJLyogQ0ZCNCBpbiBwbGFuZXMgKFZHQSkgKi8KKyNkZWZpbmUgRkJfQVVYX1ZHQV9QTEFORVNfQ0ZCOAkJMgkvKiBDRkI4IGluIHBsYW5lcyAoVkdBKSAqLworCisjZGVmaW5lIEZCX1ZJU1VBTF9NT05PMDEJCTAJLyogTW9ub2Noci4gMT1CbGFjayAwPVdoaXRlICovCisjZGVmaW5lIEZCX1ZJU1VBTF9NT05PMTAJCTEJLyogTW9ub2Noci4gMT1XaGl0ZSAwPUJsYWNrICovCisjZGVmaW5lIEZCX1ZJU1VBTF9UUlVFQ09MT1IJCTIJLyogVHJ1ZSBjb2xvcgkqLworI2RlZmluZSBGQl9WSVNVQUxfUFNFVURPQ09MT1IJCTMJLyogUHNldWRvIGNvbG9yIChsaWtlIGF0YXJpKSAqLworI2RlZmluZSBGQl9WSVNVQUxfRElSRUNUQ09MT1IJCTQJLyogRGlyZWN0IGNvbG9yICovCisjZGVmaW5lIEZCX1ZJU1VBTF9TVEFUSUNfUFNFVURPQ09MT1IJNQkvKiBQc2V1ZG8gY29sb3IgcmVhZG9ubHkgKi8KKworI2RlZmluZSBGQl9BQ0NFTF9OT05FCQkwCS8qIG5vIGhhcmR3YXJlIGFjY2VsZXJhdG9yCSovCisjZGVmaW5lIEZCX0FDQ0VMX0FUQVJJQkxJVFQJMQkvKiBBdGFyaSBCbGl0dGVyCQkqLworI2RlZmluZSBGQl9BQ0NFTF9BTUlHQUJMSVRUCTIJLyogQW1pZ2EgQmxpdHRlciAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9TM19UUklPNjQJMwkvKiBDeWJlcnZpc2lvbjY0IChTMyBUcmlvNjQpICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05DUl83N0MzMkJMVAk0CS8qIFJldGluYVozIChOQ1IgNzdDMzJCTFQpICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfUzNfVklSR0UJNQkvKiBDeWJlcnZpc2lvbjY0LzNEIChTMyBWaVJHRSkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfQVRJX01BQ0g2NEdYCTYJLyogQVRJIE1hY2ggNjRHWCBmYW1pbHkJCSovCisjZGVmaW5lIEZCX0FDQ0VMX0RFQ19UR0EJNwkvKiBERUMgMjEwMzAgVEdBCQkqLworI2RlZmluZSBGQl9BQ0NFTF9BVElfTUFDSDY0Q1QJOAkvKiBBVEkgTWFjaCA2NENUIGZhbWlseQkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfQVRJX01BQ0g2NFZUCTkJLyogQVRJIE1hY2ggNjRDVCBmYW1pbHkgVlQgY2xhc3MgKi8KKyNkZWZpbmUgRkJfQUNDRUxfQVRJX01BQ0g2NEdUCTEwCS8qIEFUSSBNYWNoIDY0Q1QgZmFtaWx5IEdUIGNsYXNzICovCisjZGVmaW5lIEZCX0FDQ0VMX1NVTl9DUkVBVE9SCTExCS8qIFN1biBDcmVhdG9yL0NyZWF0b3IzRAkqLworI2RlZmluZSBGQl9BQ0NFTF9TVU5fQ0dTSVgJMTIJLyogU3VuIGNnNgkJCSovCisjZGVmaW5lIEZCX0FDQ0VMX1NVTl9MRU8JMTMJLyogU3VuIGxlby96eAkJCSovCisjZGVmaW5lIEZCX0FDQ0VMX0lNU19UV0lOVFVSQk8JMTQJLyogSU1TIFR3aW4gVHVyYm8JCSovCisjZGVmaW5lIEZCX0FDQ0VMXzNETEFCU19QRVJNRURJQTIgMTUJLyogM0RsYWJzIFBlcm1lZGlhIDIJCSovCisjZGVmaW5lIEZCX0FDQ0VMX01BVFJPWF9NR0EyMDY0VyAxNgkvKiBNYXRyb3ggTUdBMjA2NFcgKE1pbGxlbml1bSkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfTUFUUk9YX01HQTEwNjRTRyAxNwkvKiBNYXRyb3ggTUdBMTA2NFNHIChNeXN0aXF1ZSkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfTUFUUk9YX01HQTIxNjRXIDE4CS8qIE1hdHJveCBNR0EyMTY0VyAoTWlsbGVuaXVtIElJKSAqLworI2RlZmluZSBGQl9BQ0NFTF9NQVRST1hfTUdBMjE2NFdfQUdQIDE5CS8qIE1hdHJveCBNR0EyMTY0VyAoTWlsbGVuaXVtIElJKSAqLworI2RlZmluZSBGQl9BQ0NFTF9NQVRST1hfTUdBRzEwMAkyMAkvKiBNYXRyb3ggRzEwMCAoUHJvZHVjdGl2YSBHMTAwKSAqLworI2RlZmluZSBGQl9BQ0NFTF9NQVRST1hfTUdBRzIwMAkyMQkvKiBNYXRyb3ggRzIwMCAoTXlzdCwgTWlsbCwgLi4uKSAqLworI2RlZmluZSBGQl9BQ0NFTF9TVU5fQ0cxNAkyMgkvKiBTdW4gY2dmb3VydGVlbgkJICovCisjZGVmaW5lIEZCX0FDQ0VMX1NVTl9CV1RXTwkyMwkvKiBTdW4gYnd0d28JCQkqLworI2RlZmluZSBGQl9BQ0NFTF9TVU5fQ0dUSFJFRQkyNAkvKiBTdW4gY2d0aHJlZQkJCSovCisjZGVmaW5lIEZCX0FDQ0VMX1NVTl9UQ1gJMjUJLyogU3VuIHRjeAkJCSovCisjZGVmaW5lIEZCX0FDQ0VMX01BVFJPWF9NR0FHNDAwCTI2CS8qIE1hdHJveCBHNDAwCQkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfTlYzCQkyNwkvKiBuVmlkaWEgUklWQSAxMjggICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05WNAkJMjgJLyogblZpZGlhIFJJVkEgVE5UCQkqLworI2RlZmluZSBGQl9BQ0NFTF9OVjUJCTI5CS8qIG5WaWRpYSBSSVZBIFROVDIJCSovCisjZGVmaW5lIEZCX0FDQ0VMX0NUXzY1NTV4CTMwCS8qIEMmVCA2NTU1eAkJCSovCisjZGVmaW5lIEZCX0FDQ0VMXzNERlhfQkFOU0hFRQkzMQkvKiAzRGZ4IEJhbnNoZWUJCQkqLworI2RlZmluZSBGQl9BQ0NFTF9BVElfUkFHRTEyOAkzMgkvKiBBVEkgUmFnZTEyOCBmYW1pbHkJCSovCisjZGVmaW5lIEZCX0FDQ0VMX0lHU19DWUJFUjIwMDAJMzMJLyogQ3liZXJQcm8gMjAwMAkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfSUdTX0NZQkVSMjAxMAkzNAkvKiBDeWJlclBybyAyMDEwCQkqLworI2RlZmluZSBGQl9BQ0NFTF9JR1NfQ1lCRVI1MDAwCTM1CS8qIEN5YmVyUHJvIDUwMDAJCSovCisjZGVmaW5lIEZCX0FDQ0VMX1NJU19HTEFNT1VSICAgIDM2CS8qIFNpUyAzMDAvNjMwLzU0MCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfM0RMQUJTX1BFUk1FRElBMyAzNwkvKiAzRGxhYnMgUGVybWVkaWEgMwkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfQVRJX1JBREVPTgkzOAkvKiBBVEkgUmFkZW9uIGZhbWlseQkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfSTgxMCAgICAgICAgICAgMzkgICAgICAvKiBJbnRlbCA4MTAvODE1ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1NJU19HTEFNT1VSXzIgIDQwCS8qIFNpUyAzMTUsIDY1MCwgNzQwCQkqLworI2RlZmluZSBGQl9BQ0NFTF9TSVNfWEFCUkUgICAgICA0MQkvKiBTaVMgMzMwICgiWGFicmUiKQkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfSTgzMCAgICAgICAgICAgNDIgICAgICAvKiBJbnRlbCA4MzBNLzg0NUcvODV4Lzg2NUcgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05WXzEwICAgICAgICAgIDQzICAgICAgLyogblZpZGlhIEFyY2ggMTAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9OVl8yMCAgICAgICAgICA0NCAgICAgIC8qIG5WaWRpYSBBcmNoIDIwICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfTlZfMzAgICAgICAgICAgNDUgICAgICAvKiBuVmlkaWEgQXJjaCAzMCAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05WXzQwICAgICAgICAgIDQ2ICAgICAgLyogblZpZGlhIEFyY2ggNDAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9YR0lfVk9MQVJJX1YJNDcJLyogWEdJIFZvbGFyaSBWM1hULCBWNSwgVjggICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9YR0lfVk9MQVJJX1oJNDgJLyogWEdJIFZvbGFyaSBaNyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9PTUFQMTYxMAk0OQkvKiBUSSBPTUFQMTZ4eCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1RSSURFTlRfVEdVSQk1MAkvKiBUcmlkZW50IFRHVUkJCQkqLworI2RlZmluZSBGQl9BQ0NFTF9UUklERU5UXzNESU1BR0UgNTEJLyogVHJpZGVudCAzREltYWdlCQkqLworI2RlZmluZSBGQl9BQ0NFTF9UUklERU5UX0JMQURFM0QgNTIJLyogVHJpZGVudCBCbGFkZTNECQkqLworI2RlZmluZSBGQl9BQ0NFTF9UUklERU5UX0JMQURFWFAgNTMJLyogVHJpZGVudCBCbGFkZVhQCQkqLworI2RlZmluZSBGQl9BQ0NFTF9DSVJSVVNfQUxQSU5FICAgNTMJLyogQ2lycnVzIExvZ2ljIDU0M3gvNTQ0eC81NDgwCSovCisjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjA3MCA5MAkvKiBOZW9NYWdpYyBOTTIwNzAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjA5MCA5MQkvKiBOZW9NYWdpYyBOTTIwOTAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjA5MyA5MgkvKiBOZW9NYWdpYyBOTTIwOTMgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjA5NyA5MwkvKiBOZW9NYWdpYyBOTTIwOTcgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjE2MCA5NAkvKiBOZW9NYWdpYyBOTTIxNjAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjIwMCA5NQkvKiBOZW9NYWdpYyBOTTIyMDAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjIzMCA5NgkvKiBOZW9NYWdpYyBOTTIyMzAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjM2MCA5NwkvKiBOZW9NYWdpYyBOTTIzNjAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjM4MCA5OAkvKiBOZW9NYWdpYyBOTTIzODAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1BYQTNYWAkJIDk5CS8qIFBYQTN4eAkJCSovCisKKyNkZWZpbmUgRkJfQUNDRUxfU0FWQUdFNCAgICAgICAgMHg4MAkvKiBTMyBTYXZhZ2U0ICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1NBVkFHRTNEICAgICAgIDB4ODEJLyogUzMgU2F2YWdlM0QgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9TQVZBR0UzRF9NViAgICAweDgyCS8qIFMzIFNhdmFnZTNELU1WICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfU0FWQUdFMjAwMCAgICAgMHg4MwkvKiBTMyBTYXZhZ2UyMDAwICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1NBVkFHRV9NWF9NViAgIDB4ODQJLyogUzMgU2F2YWdlL01YLU1WICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9TQVZBR0VfTVggICAgICAweDg1CS8qIFMzIFNhdmFnZS9NWCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfU0FWQUdFX0lYX01WICAgMHg4NgkvKiBTMyBTYXZhZ2UvSVgtTVYgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1NBVkFHRV9JWCAgICAgIDB4ODcJLyogUzMgU2F2YWdlL0lYICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9QUk9TQVZBR0VfUE0gICAweDg4CS8qIFMzIFByb1NhdmFnZSBQTTEzMyAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfUFJPU0FWQUdFX0tNICAgMHg4OQkvKiBTMyBQcm9TYXZhZ2UgS00xMzMgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1MzVFdJU1RFUl9QICAgIDB4OGEJLyogUzMgVHdpc3RlciAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9TM1RXSVNURVJfSyAgICAweDhiCS8qIFMzIFR3aXN0ZXJLICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfU1VQRVJTQVZBR0UgICAgMHg4YyAgICAvKiBTMyBTdXBlcnNhdmFnZSAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1BST1NBVkFHRV9ERFIgIDB4OGQJLyogUzMgUHJvU2F2YWdlIEREUiAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9QUk9TQVZBR0VfRERSSyAweDhlCS8qIFMzIFByb1NhdmFnZSBERFItSyAgICAgICAgICAgKi8KKworI2RlZmluZSBGQl9BQ0NFTF9QVVYzX1VOSUdGWAkweGEwCS8qIFBLVW5pdHktdjMgVW5pZ2Z4CQkqLworCitzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8geworCWNoYXIgaWRbMTZdOwkJCS8qIGlkZW50aWZpY2F0aW9uIHN0cmluZyBlZyAiVFQgQnVpbHRpbiIgKi8KKwl1bnNpZ25lZCBsb25nIHNtZW1fc3RhcnQ7CS8qIFN0YXJ0IG9mIGZyYW1lIGJ1ZmZlciBtZW0gKi8KKwkJCQkJLyogKHBoeXNpY2FsIGFkZHJlc3MpICovCisJX191MzIgc21lbV9sZW47CQkJLyogTGVuZ3RoIG9mIGZyYW1lIGJ1ZmZlciBtZW0gKi8KKwlfX3UzMiB0eXBlOwkJCS8qIHNlZSBGQl9UWVBFXyoJCSovCisJX191MzIgdHlwZV9hdXg7CQkJLyogSW50ZXJsZWF2ZSBmb3IgaW50ZXJsZWF2ZWQgUGxhbmVzICovCisJX191MzIgdmlzdWFsOwkJCS8qIHNlZSBGQl9WSVNVQUxfKgkJKi8gCisJX191MTYgeHBhbnN0ZXA7CQkJLyogemVybyBpZiBubyBoYXJkd2FyZSBwYW5uaW5nICAqLworCV9fdTE2IHlwYW5zdGVwOwkJCS8qIHplcm8gaWYgbm8gaGFyZHdhcmUgcGFubmluZyAgKi8KKwlfX3UxNiB5d3JhcHN0ZXA7CQkvKiB6ZXJvIGlmIG5vIGhhcmR3YXJlIHl3cmFwICAgICovCisJX191MzIgbGluZV9sZW5ndGg7CQkvKiBsZW5ndGggb2YgYSBsaW5lIGluIGJ5dGVzICAgICovCisJdW5zaWduZWQgbG9uZyBtbWlvX3N0YXJ0OwkvKiBTdGFydCBvZiBNZW1vcnkgTWFwcGVkIEkvTyAgICovCisJCQkJCS8qIChwaHlzaWNhbCBhZGRyZXNzKSAqLworCV9fdTMyIG1taW9fbGVuOwkJCS8qIExlbmd0aCBvZiBNZW1vcnkgTWFwcGVkIEkvTyAgKi8KKwlfX3UzMiBhY2NlbDsJCQkvKiBJbmRpY2F0ZSB0byBkcml2ZXIgd2hpY2gJKi8KKwkJCQkJLyogIHNwZWNpZmljIGNoaXAvY2FyZCB3ZSBoYXZlCSovCisJX191MTYgcmVzZXJ2ZWRbM107CQkvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIGNvbXBhdGliaWxpdHkgKi8KK307CisKKy8qIEludGVycHJldGF0aW9uIG9mIG9mZnNldCBmb3IgY29sb3IgZmllbGRzOiBBbGwgb2Zmc2V0cyBhcmUgZnJvbSB0aGUgcmlnaHQsCisgKiBpbnNpZGUgYSAicGl4ZWwiIHZhbHVlLCB3aGljaCBpcyBleGFjdGx5ICdiaXRzX3Blcl9waXhlbCcgd2lkZSAobWVhbnM6IHlvdQorICogY2FuIHVzZSB0aGUgb2Zmc2V0IGFzIHJpZ2h0IGFyZ3VtZW50IHRvIDw8KS4gQSBwaXhlbCBhZnRlcndhcmRzIGlzIGEgYml0CisgKiBzdHJlYW0gYW5kIGlzIHdyaXR0ZW4gdG8gdmlkZW8gbWVtb3J5IGFzIHRoYXQgdW5tb2RpZmllZC4KKyAqCisgKiBGb3IgcHNldWRvY29sb3I6IG9mZnNldCBhbmQgbGVuZ3RoIHNob3VsZCBiZSB0aGUgc2FtZSBmb3IgYWxsIGNvbG9yCisgKiBjb21wb25lbnRzLiBPZmZzZXQgc3BlY2lmaWVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0CisgKiBvZiB0aGUgcGFsbGV0dGUgaW5kZXggaW4gYSBwaXhlbCB2YWx1ZS4gTGVuZ3RoIGluZGljYXRlcyB0aGUgbnVtYmVyCisgKiBvZiBhdmFpbGFibGUgcGFsZXR0ZSBlbnRyaWVzIChpLmUuICMgb2YgZW50cmllcyA9IDEgPDwgbGVuZ3RoKS4KKyAqLworc3RydWN0IGZiX2JpdGZpZWxkIHsKKwlfX3UzMiBvZmZzZXQ7CQkJLyogYmVnaW5uaW5nIG9mIGJpdGZpZWxkCSovCisJX191MzIgbGVuZ3RoOwkJCS8qIGxlbmd0aCBvZiBiaXRmaWVsZAkJKi8KKwlfX3UzMiBtc2JfcmlnaHQ7CQkvKiAhPSAwIDogTW9zdCBzaWduaWZpY2FudCBiaXQgaXMgKi8gCisJCQkJCS8qIHJpZ2h0ICovIAorfTsKKworI2RlZmluZSBGQl9OT05TVERfSEFNCQkxCS8qIEhvbGQtQW5kLU1vZGlmeSAoSEFNKSAgICAgICAgKi8KKyNkZWZpbmUgRkJfTk9OU1REX1JFVl9QSVhfSU5fQgkyCS8qIG9yZGVyIG9mIHBpeGVscyBpbiBlYWNoIGJ5dGUgaXMgcmV2ZXJzZWQgKi8KKworI2RlZmluZSBGQl9BQ1RJVkFURV9OT1cJCTAJLyogc2V0IHZhbHVlcyBpbW1lZGlhdGVseSAob3IgdmJsKSovCisjZGVmaW5lIEZCX0FDVElWQVRFX05YVE9QRU4JMQkvKiBhY3RpdmF0ZSBvbiBuZXh0IG9wZW4JKi8KKyNkZWZpbmUgRkJfQUNUSVZBVEVfVEVTVAkyCS8qIGRvbid0IHNldCwgcm91bmQgdXAgaW1wb3NzaWJsZSAqLworI2RlZmluZSBGQl9BQ1RJVkFURV9NQVNLICAgICAgIDE1CisJCQkJCS8qIHZhbHVlcwkJCSovCisjZGVmaW5lIEZCX0FDVElWQVRFX1ZCTAkgICAgICAgMTYJLyogYWN0aXZhdGUgdmFsdWVzIG9uIG5leHQgdmJsICAqLworI2RlZmluZSBGQl9DSEFOR0VfQ01BUF9WQkwgICAgIDMyCS8qIGNoYW5nZSBjb2xvcm1hcCBvbiB2YmwJKi8KKyNkZWZpbmUgRkJfQUNUSVZBVEVfQUxMCSAgICAgICA2NAkvKiBjaGFuZ2UgYWxsIFZDcyBvbiB0aGlzIGZiCSovCisjZGVmaW5lIEZCX0FDVElWQVRFX0ZPUkNFICAgICAxMjgJLyogZm9yY2UgYXBwbHkgZXZlbiB3aGVuIG5vIGNoYW5nZSovCisjZGVmaW5lIEZCX0FDVElWQVRFX0lOVl9NT0RFICAyNTYgICAgICAgLyogaW52YWxpZGF0ZSB2aWRlb21vZGUgKi8KKworI2RlZmluZSBGQl9BQ0NFTEZfVEVYVAkJMQkvKiAoT0JTT0xFVEUpIHNlZSBmYl9pbmZvLmZsYWdzIGFuZCB2Y19tb2RlICovCisKKyNkZWZpbmUgRkJfU1lOQ19IT1JfSElHSF9BQ1QJMQkvKiBob3Jpem9udGFsIHN5bmMgaGlnaCBhY3RpdmUJKi8KKyNkZWZpbmUgRkJfU1lOQ19WRVJUX0hJR0hfQUNUCTIJLyogdmVydGljYWwgc3luYyBoaWdoIGFjdGl2ZQkqLworI2RlZmluZSBGQl9TWU5DX0VYVAkJNAkvKiBleHRlcm5hbCBzeW5jCQkqLworI2RlZmluZSBGQl9TWU5DX0NPTVBfSElHSF9BQ1QJOAkvKiBjb21wb3NpdGUgc3luYyBoaWdoIGFjdGl2ZSAgICovCisjZGVmaW5lIEZCX1NZTkNfQlJPQURDQVNUCTE2CS8qIGJyb2FkY2FzdCB2aWRlbyB0aW1pbmdzICAgICAgKi8KKwkJCQkJLyogdnRvdGFsID0gMTQ0ZC8yODhuLzU3NmkgPT4gUEFMICAqLworCQkJCQkvKiB2dG90YWwgPSAxMjFkLzI0Mm4vNDg0aSA9PiBOVFNDICovCisjZGVmaW5lIEZCX1NZTkNfT05fR1JFRU4JMzIJLyogc3luYyBvbiBncmVlbiAqLworCisjZGVmaW5lIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQgIDAJLyogbm9uIGludGVybGFjZWQgKi8KKyNkZWZpbmUgRkJfVk1PREVfSU5URVJMQUNFRAkxCS8qIGludGVybGFjZWQJKi8KKyNkZWZpbmUgRkJfVk1PREVfRE9VQkxFCQkyCS8qIGRvdWJsZSBzY2FuICovCisjZGVmaW5lIEZCX1ZNT0RFX09ERF9GTERfRklSU1QJNAkvKiBpbnRlcmxhY2VkOiB0b3AgbGluZSBmaXJzdCAqLworI2RlZmluZSBGQl9WTU9ERV9NQVNLCQkyNTUKKworI2RlZmluZSBGQl9WTU9ERV9ZV1JBUAkJMjU2CS8qIHl3cmFwIGluc3RlYWQgb2YgcGFubmluZyAgICAgKi8KKyNkZWZpbmUgRkJfVk1PREVfU01PT1RIX1hQQU4JNTEyCS8qIHNtb290aCB4cGFuIHBvc3NpYmxlIChpbnRlcm5hbGx5IHVzZWQpICovCisjZGVmaW5lIEZCX1ZNT0RFX0NPTlVQREFURQk1MTIJLyogZG9uJ3QgdXBkYXRlIHgveW9mZnNldAkqLworCisvKgorICogRGlzcGxheSByb3RhdGlvbiBzdXBwb3J0CisgKi8KKyNkZWZpbmUgRkJfUk9UQVRFX1VSICAgICAgMAorI2RlZmluZSBGQl9ST1RBVEVfQ1cgICAgICAxCisjZGVmaW5lIEZCX1JPVEFURV9VRCAgICAgIDIKKyNkZWZpbmUgRkJfUk9UQVRFX0NDVyAgICAgMworCisjZGVmaW5lIFBJQ09TMktIWihhKSAoMTAwMDAwMDAwMFVMLyhhKSkKKyNkZWZpbmUgS0haMlBJQ09TKGEpICgxMDAwMDAwMDAwVUwvKGEpKQorCitzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8geworCV9fdTMyIHhyZXM7CQkJLyogdmlzaWJsZSByZXNvbHV0aW9uCQkqLworCV9fdTMyIHlyZXM7CisJX191MzIgeHJlc192aXJ0dWFsOwkJLyogdmlydHVhbCByZXNvbHV0aW9uCQkqLworCV9fdTMyIHlyZXNfdmlydHVhbDsKKwlfX3UzMiB4b2Zmc2V0OwkJCS8qIG9mZnNldCBmcm9tIHZpcnR1YWwgdG8gdmlzaWJsZSAqLworCV9fdTMyIHlvZmZzZXQ7CQkJLyogcmVzb2x1dGlvbgkJCSovCisKKwlfX3UzMiBiaXRzX3Blcl9waXhlbDsJCS8qIGd1ZXNzIHdoYXQJCQkqLworCV9fdTMyIGdyYXlzY2FsZTsJCS8qICE9IDAgR3JheWxldmVscyBpbnN0ZWFkIG9mIGNvbG9ycyAqLworCisJc3RydWN0IGZiX2JpdGZpZWxkIHJlZDsJCS8qIGJpdGZpZWxkIGluIGZiIG1lbSBpZiB0cnVlIGNvbG9yLCAqLworCXN0cnVjdCBmYl9iaXRmaWVsZCBncmVlbjsJLyogZWxzZSBvbmx5IGxlbmd0aCBpcyBzaWduaWZpY2FudCAqLworCXN0cnVjdCBmYl9iaXRmaWVsZCBibHVlOworCXN0cnVjdCBmYl9iaXRmaWVsZCB0cmFuc3A7CS8qIHRyYW5zcGFyZW5jeQkJCSovCQorCisJX191MzIgbm9uc3RkOwkJCS8qICE9IDAgTm9uIHN0YW5kYXJkIHBpeGVsIGZvcm1hdCAqLworCisJX191MzIgYWN0aXZhdGU7CQkJLyogc2VlIEZCX0FDVElWQVRFXyoJCSovCisKKwlfX3UzMiBoZWlnaHQ7CQkJLyogaGVpZ2h0IG9mIHBpY3R1cmUgaW4gbW0gICAgKi8KKwlfX3UzMiB3aWR0aDsJCQkvKiB3aWR0aCBvZiBwaWN0dXJlIGluIG1tICAgICAqLworCisJX191MzIgYWNjZWxfZmxhZ3M7CQkvKiAoT0JTT0xFVEUpIHNlZSBmYl9pbmZvLmZsYWdzICovCisKKwkvKiBUaW1pbmc6IEFsbCB2YWx1ZXMgaW4gcGl4Y2xvY2tzLCBleGNlcHQgcGl4Y2xvY2sgKG9mIGNvdXJzZSkgKi8KKwlfX3UzMiBwaXhjbG9jazsJCQkvKiBwaXhlbCBjbG9jayBpbiBwcyAocGljbyBzZWNvbmRzKSAqLworCV9fdTMyIGxlZnRfbWFyZ2luOwkJLyogdGltZSBmcm9tIHN5bmMgdG8gcGljdHVyZQkqLworCV9fdTMyIHJpZ2h0X21hcmdpbjsJCS8qIHRpbWUgZnJvbSBwaWN0dXJlIHRvIHN5bmMJKi8KKwlfX3UzMiB1cHBlcl9tYXJnaW47CQkvKiB0aW1lIGZyb20gc3luYyB0byBwaWN0dXJlCSovCisJX191MzIgbG93ZXJfbWFyZ2luOworCV9fdTMyIGhzeW5jX2xlbjsJCS8qIGxlbmd0aCBvZiBob3Jpem9udGFsIHN5bmMJKi8KKwlfX3UzMiB2c3luY19sZW47CQkvKiBsZW5ndGggb2YgdmVydGljYWwgc3luYwkqLworCV9fdTMyIHN5bmM7CQkJLyogc2VlIEZCX1NZTkNfKgkJKi8KKwlfX3UzMiB2bW9kZTsJCQkvKiBzZWUgRkJfVk1PREVfKgkJKi8KKwlfX3UzMiByb3RhdGU7CQkJLyogYW5nbGUgd2Ugcm90YXRlIGNvdW50ZXIgY2xvY2t3aXNlICovCisJX191MzIgcmVzZXJ2ZWRbNV07CQkvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIGNvbXBhdGliaWxpdHkgKi8KK307CisKK3N0cnVjdCBmYl9jbWFwIHsKKwlfX3UzMiBzdGFydDsJCQkvKiBGaXJzdCBlbnRyeQkqLworCV9fdTMyIGxlbjsJCQkvKiBOdW1iZXIgb2YgZW50cmllcyAqLworCV9fdTE2ICpyZWQ7CQkJLyogUmVkIHZhbHVlcwkqLworCV9fdTE2ICpncmVlbjsKKwlfX3UxNiAqYmx1ZTsKKwlfX3UxNiAqdHJhbnNwOwkJCS8qIHRyYW5zcGFyZW5jeSwgY2FuIGJlIE5VTEwgKi8KK307CisKK3N0cnVjdCBmYl9jb24yZmJtYXAgeworCV9fdTMyIGNvbnNvbGU7CisJX191MzIgZnJhbWVidWZmZXI7Cit9OworCisvKiBWRVNBIEJsYW5raW5nIExldmVscyAqLworI2RlZmluZSBWRVNBX05PX0JMQU5LSU5HICAgICAgICAwCisjZGVmaW5lIFZFU0FfVlNZTkNfU1VTUEVORCAgICAgIDEKKyNkZWZpbmUgVkVTQV9IU1lOQ19TVVNQRU5EICAgICAgMgorI2RlZmluZSBWRVNBX1BPV0VSRE9XTiAgICAgICAgICAzCisKKworZW51bSB7CisJLyogc2NyZWVuOiB1bmJsYW5rZWQsIGhzeW5jOiBvbiwgIHZzeW5jOiBvbiAqLworCUZCX0JMQU5LX1VOQkxBTksgICAgICAgPSBWRVNBX05PX0JMQU5LSU5HLAorCisJLyogc2NyZWVuOiBibGFua2VkLCAgIGhzeW5jOiBvbiwgIHZzeW5jOiBvbiAqLworCUZCX0JMQU5LX05PUk1BTCAgICAgICAgPSBWRVNBX05PX0JMQU5LSU5HICsgMSwKKworCS8qIHNjcmVlbjogYmxhbmtlZCwgICBoc3luYzogb24sICB2c3luYzogb2ZmICovCisJRkJfQkxBTktfVlNZTkNfU1VTUEVORCA9IFZFU0FfVlNZTkNfU1VTUEVORCArIDEsCisKKwkvKiBzY3JlZW46IGJsYW5rZWQsICAgaHN5bmM6IG9mZiwgdnN5bmM6IG9uICovCisJRkJfQkxBTktfSFNZTkNfU1VTUEVORCA9IFZFU0FfSFNZTkNfU1VTUEVORCArIDEsCisKKwkvKiBzY3JlZW46IGJsYW5rZWQsICAgaHN5bmM6IG9mZiwgdnN5bmM6IG9mZiAqLworCUZCX0JMQU5LX1BPV0VSRE9XTiAgICAgPSBWRVNBX1BPV0VSRE9XTiArIDEKK307CisKKyNkZWZpbmUgRkJfVkJMQU5LX1ZCTEFOS0lORwkweDAwMQkvKiBjdXJyZW50bHkgaW4gYSB2ZXJ0aWNhbCBibGFuayAqLworI2RlZmluZSBGQl9WQkxBTktfSEJMQU5LSU5HCTB4MDAyCS8qIGN1cnJlbnRseSBpbiBhIGhvcml6b250YWwgYmxhbmsgKi8KKyNkZWZpbmUgRkJfVkJMQU5LX0hBVkVfVkJMQU5LCTB4MDA0CS8qIHZlcnRpY2FsIGJsYW5rcyBjYW4gYmUgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgRkJfVkJMQU5LX0hBVkVfSEJMQU5LCTB4MDA4CS8qIGhvcml6b250YWwgYmxhbmtzIGNhbiBiZSBkZXRlY3RlZCAqLworI2RlZmluZSBGQl9WQkxBTktfSEFWRV9DT1VOVAkweDAxMAkvKiBnbG9iYWwgcmV0cmFjZSBjb3VudGVyIGlzIGF2YWlsYWJsZSAqLworI2RlZmluZSBGQl9WQkxBTktfSEFWRV9WQ09VTlQJMHgwMjAJLyogdGhlIHZjb3VudCBmaWVsZCBpcyB2YWxpZCAqLworI2RlZmluZSBGQl9WQkxBTktfSEFWRV9IQ09VTlQJMHgwNDAJLyogdGhlIGhjb3VudCBmaWVsZCBpcyB2YWxpZCAqLworI2RlZmluZSBGQl9WQkxBTktfVlNZTkNJTkcJMHgwODAJLyogY3VycmVudGx5IGluIGEgdnN5bmMgKi8KKyNkZWZpbmUgRkJfVkJMQU5LX0hBVkVfVlNZTkMJMHgxMDAJLyogdmVyaWNhbCBzeW5jcyBjYW4gYmUgZGV0ZWN0ZWQgKi8KKworc3RydWN0IGZiX3ZibGFuayB7CisJX191MzIgZmxhZ3M7CQkJLyogRkJfVkJMQU5LIGZsYWdzICovCisJX191MzIgY291bnQ7CQkJLyogY291bnRlciBvZiByZXRyYWNlcyBzaW5jZSBib290ICovCisJX191MzIgdmNvdW50OwkJCS8qIGN1cnJlbnQgc2NhbmxpbmUgcG9zaXRpb24gKi8KKwlfX3UzMiBoY291bnQ7CQkJLyogY3VycmVudCBzY2FuZG90IHBvc2l0aW9uICovCisJX191MzIgcmVzZXJ2ZWRbNF07CQkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIGNvbXBhdGliaWxpdHkgKi8KK307CisKKy8qIEludGVybmFsIEhXIGFjY2VsICovCisjZGVmaW5lIFJPUF9DT1BZIDAKKyNkZWZpbmUgUk9QX1hPUiAgMQorCitzdHJ1Y3QgZmJfY29weWFyZWEgeworCV9fdTMyIGR4OworCV9fdTMyIGR5OworCV9fdTMyIHdpZHRoOworCV9fdTMyIGhlaWdodDsKKwlfX3UzMiBzeDsKKwlfX3UzMiBzeTsKK307CisKK3N0cnVjdCBmYl9maWxscmVjdCB7CisJX191MzIgZHg7CS8qIHNjcmVlbi1yZWxhdGl2ZSAqLworCV9fdTMyIGR5OworCV9fdTMyIHdpZHRoOworCV9fdTMyIGhlaWdodDsKKwlfX3UzMiBjb2xvcjsKKwlfX3UzMiByb3A7Cit9OworCitzdHJ1Y3QgZmJfaW1hZ2UgeworCV9fdTMyIGR4OwkJLyogV2hlcmUgdG8gcGxhY2UgaW1hZ2UgKi8KKwlfX3UzMiBkeTsKKwlfX3UzMiB3aWR0aDsJCS8qIFNpemUgb2YgaW1hZ2UgKi8KKwlfX3UzMiBoZWlnaHQ7CisJX191MzIgZmdfY29sb3I7CQkvKiBPbmx5IHVzZWQgd2hlbiBhIG1vbm8gYml0bWFwICovCisJX191MzIgYmdfY29sb3I7CisJX191OCAgZGVwdGg7CQkvKiBEZXB0aCBvZiB0aGUgaW1hZ2UgKi8KKwljb25zdCBjaGFyICpkYXRhOwkvKiBQb2ludGVyIHRvIGltYWdlIGRhdGEgKi8KKwlzdHJ1Y3QgZmJfY21hcCBjbWFwOwkvKiBjb2xvciBtYXAgaW5mbyAqLworfTsKKworLyoKKyAqIGhhcmR3YXJlIGN1cnNvciBjb250cm9sCisgKi8KKworI2RlZmluZSBGQl9DVVJfU0VUSU1BR0UgMHgwMQorI2RlZmluZSBGQl9DVVJfU0VUUE9TICAgMHgwMgorI2RlZmluZSBGQl9DVVJfU0VUSE9UICAgMHgwNAorI2RlZmluZSBGQl9DVVJfU0VUQ01BUCAgMHgwOAorI2RlZmluZSBGQl9DVVJfU0VUU0hBUEUgMHgxMAorI2RlZmluZSBGQl9DVVJfU0VUU0laRQkweDIwCisjZGVmaW5lIEZCX0NVUl9TRVRBTEwgICAweEZGCisKK3N0cnVjdCBmYmN1cnBvcyB7CisJX191MTYgeCwgeTsKK307CisKK3N0cnVjdCBmYl9jdXJzb3IgeworCV9fdTE2IHNldDsJCS8qIHdoYXQgdG8gc2V0ICovCisJX191MTYgZW5hYmxlOwkJLyogY3Vyc29yIG9uL29mZiAqLworCV9fdTE2IHJvcDsJCS8qIGJpdG9wIG9wZXJhdGlvbiAqLworCWNvbnN0IGNoYXIgKm1hc2s7CS8qIGN1cnNvciBtYXNrIGJpdHMgKi8KKwlzdHJ1Y3QgZmJjdXJwb3MgaG90OwkvKiBjdXJzb3IgaG90IHNwb3QgKi8KKwlzdHJ1Y3QgZmJfaW1hZ2UJaW1hZ2U7CS8qIEN1cnNvciBpbWFnZSAqLworfTsKKworI2lmZGVmIENPTkZJR19GQl9CQUNLTElHSFQKKy8qIFNldHRpbmdzIGZvciB0aGUgZ2VuZXJpYyBiYWNrbGlnaHQgY29kZSAqLworI2RlZmluZSBGQl9CQUNLTElHSFRfTEVWRUxTCTEyOAorI2RlZmluZSBGQl9CQUNLTElHSFRfTUFYCTB4RkYKKyNlbmRpZgorCisKKyNlbmRpZiAvKiBfTElOVVhfRkJfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mY250bC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mY250bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTQ0ODQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZjbnRsLmgKQEAgLTAsMCArMSw1MiBAQAorI2lmbmRlZiBfTElOVVhfRkNOVExfSAorI2RlZmluZSBfTElOVVhfRkNOVExfSAorCisjaW5jbHVkZSA8YXNtL2ZjbnRsLmg+CisKKyNkZWZpbmUgRl9TRVRMRUFTRQkoRl9MSU5VWF9TUEVDSUZJQ19CQVNFICsgMCkKKyNkZWZpbmUgRl9HRVRMRUFTRQkoRl9MSU5VWF9TUEVDSUZJQ19CQVNFICsgMSkKKworLyoKKyAqIENhbmNlbCBhIGJsb2NraW5nIHBvc2l4IGxvY2s7IGludGVybmFsIHVzZSBvbmx5IHVudGlsIHdlIGV4cG9zZSBhbgorICogYXN5bmNocm9ub3VzIGxvY2sgYXBpIHRvIHVzZXJzcGFjZToKKyAqLworI2RlZmluZSBGX0NBTkNFTExLCShGX0xJTlVYX1NQRUNJRklDX0JBU0UgKyA1KQorCisvKiBDcmVhdGUgYSBmaWxlIGRlc2NyaXB0b3Igd2l0aCBGRF9DTE9FWEVDIHNldC4gKi8KKyNkZWZpbmUgRl9EVVBGRF9DTE9FWEVDCShGX0xJTlVYX1NQRUNJRklDX0JBU0UgKyA2KQorCisvKgorICogUmVxdWVzdCBub2ZpY2F0aW9ucyBvbiBhIGRpcmVjdG9yeS4KKyAqIFNlZSBiZWxvdyBmb3IgZXZlbnRzIHRoYXQgbWF5IGJlIG5vdGlmaWVkLgorICovCisjZGVmaW5lIEZfTk9USUZZCShGX0xJTlVYX1NQRUNJRklDX0JBU0UrMikKKworLyoKKyAqIFNldCBhbmQgZ2V0IG9mIHBpcGUgcGFnZSBzaXplIGFycmF5CisgKi8KKyNkZWZpbmUgRl9TRVRQSVBFX1NaCShGX0xJTlVYX1NQRUNJRklDX0JBU0UgKyA3KQorI2RlZmluZSBGX0dFVFBJUEVfU1oJKEZfTElOVVhfU1BFQ0lGSUNfQkFTRSArIDgpCisKKy8qCisgKiBUeXBlcyBvZiBkaXJlY3Rvcnkgbm90aWZpY2F0aW9ucyB0aGF0IG1heSBiZSByZXF1ZXN0ZWQuCisgKi8KKyNkZWZpbmUgRE5fQUNDRVNTCTB4MDAwMDAwMDEJLyogRmlsZSBhY2Nlc3NlZCAqLworI2RlZmluZSBETl9NT0RJRlkJMHgwMDAwMDAwMgkvKiBGaWxlIG1vZGlmaWVkICovCisjZGVmaW5lIEROX0NSRUFURQkweDAwMDAwMDA0CS8qIEZpbGUgY3JlYXRlZCAqLworI2RlZmluZSBETl9ERUxFVEUJMHgwMDAwMDAwOAkvKiBGaWxlIHJlbW92ZWQgKi8KKyNkZWZpbmUgRE5fUkVOQU1FCTB4MDAwMDAwMTAJLyogRmlsZSByZW5hbWVkICovCisjZGVmaW5lIEROX0FUVFJJQgkweDAwMDAwMDIwCS8qIEZpbGUgY2hhbmdlZCBhdHRpYnV0ZXMgKi8KKyNkZWZpbmUgRE5fTVVMVElTSE9UCTB4ODAwMDAwMDAJLyogRG9uJ3QgcmVtb3ZlIG5vdGlmaWVyICovCisKKyNkZWZpbmUgQVRfRkRDV0QJCS0xMDAgICAgLyogU3BlY2lhbCB2YWx1ZSB1c2VkIHRvIGluZGljYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmF0IHNob3VsZCB1c2UgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JraW5nIGRpcmVjdG9yeS4gKi8KKyNkZWZpbmUgQVRfU1lNTElOS19OT0ZPTExPVwkweDEwMCAgIC8qIERvIG5vdCBmb2xsb3cgc3ltYm9saWMgbGlua3MuICAqLworI2RlZmluZSBBVF9SRU1PVkVESVIJCTB4MjAwICAgLyogUmVtb3ZlIGRpcmVjdG9yeSBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saW5raW5nIGZpbGUuICAqLworI2RlZmluZSBBVF9TWU1MSU5LX0ZPTExPVwkweDQwMCAgIC8qIEZvbGxvdyBzeW1ib2xpYyBsaW5rcy4gICovCisjZGVmaW5lIEFUX05PX0FVVE9NT1VOVAkJMHg4MDAJLyogU3VwcHJlc3MgdGVybWluYWwgYXV0b21vdW50IHRyYXZlcnNhbCAqLworI2RlZmluZSBBVF9FTVBUWV9QQVRICQkweDEwMDAJLyogQWxsb3cgZW1wdHkgcmVsYXRpdmUgcGF0aG5hbWUgKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGExYTU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mZC5oCkBAIC0wLDAgKzEsMzgyIEBACisjaWZuZGVmIF9MSU5VWF9GRF9ICisjZGVmaW5lIF9MSU5VWF9GRF9ICisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisKKy8qIE5ldyBmaWxlIGxheW91dDogTm93IHRoZSBpb2N0bCBkZWZpbml0aW9ucyBpbW1lZGlhdGVseSBmb2xsb3cgdGhlCisgKiBkZWZpbml0aW9ucyBvZiB0aGUgc3RydWN0dXJlcyB0aGF0IHRoZXkgdXNlICovCisKKy8qCisgKiBHZW9tZXRyeQorICovCitzdHJ1Y3QgZmxvcHB5X3N0cnVjdCB7CisJdW5zaWduZWQgaW50CXNpemUsCQkvKiBuciBvZiBzZWN0b3JzIHRvdGFsICovCisJCQlzZWN0LAkJLyogc2VjdG9ycyBwZXIgdHJhY2sgKi8KKwkJCWhlYWQsCQkvKiBuciBvZiBoZWFkcyAqLworCQkJdHJhY2ssCQkvKiBuciBvZiB0cmFja3MgKi8KKwkJCXN0cmV0Y2g7CS8qIGJpdCAwICE9MCBtZWFucyBkb3VibGUgdHJhY2sgc3RlcHMgKi8KKwkJCQkJLyogYml0IDEgIT0gMCBtZWFucyBzd2FwIHNpZGVzICovCisJCQkJCS8qIGJpdHMgMi4uOSBnaXZlIHRoZSBmaXJzdCBzZWN0b3IgKi8KKwkJCQkJLyogIG51bWJlciAodGhlIExTQiBpcyBmbGlwcGVkKSAqLworI2RlZmluZSBGRF9TVFJFVENIIDEKKyNkZWZpbmUgRkRfU1dBUFNJREVTIDIKKyNkZWZpbmUgRkRfWkVST0JBU0VEIDQKKyNkZWZpbmUgRkRfU0VDVEJBU0VNQVNLIDB4M0ZDCisjZGVmaW5lIEZEX01LU0VDVEJBU0UocykgKCgocykgXiAxKSA8PCAyKQorI2RlZmluZSBGRF9TRUNUQkFTRShmbG9wcHkpICgoKChmbG9wcHkpLT5zdHJldGNoICYgRkRfU0VDVEJBU0VNQVNLKSA+PiAyKSBeIDEpCisKKwl1bnNpZ25lZCBjaGFyCWdhcCwJCS8qIGdhcDEgc2l6ZSAqLworCisJCQlyYXRlLAkJLyogZGF0YSByYXRlLiB8PSAweDQwIGZvciBwZXJwZW5kaWN1bGFyICovCisjZGVmaW5lIEZEXzJNIDB4NAorI2RlZmluZSBGRF9TSVpFQ09ERU1BU0sgMHgzOAorI2RlZmluZSBGRF9TSVpFQ09ERShmbG9wcHkpICgoKCgoZmxvcHB5KS0+cmF0ZSZGRF9TSVpFQ09ERU1BU0spPj4gMykrIDIpICU4KQorI2RlZmluZSBGRF9TRUNUU0laRShmbG9wcHkpICggKGZsb3BweSktPnJhdGUgJiBGRF8yTSA/IFwKKwkJCSAgICAgNTEyIDogMTI4IDw8IEZEX1NJWkVDT0RFKGZsb3BweSkgKQorI2RlZmluZSBGRF9QRVJQIDB4NDAKKworCQkJc3BlYzEsCQkvKiBzdGVwcGluZyByYXRlLCBoZWFkIHVubG9hZCB0aW1lICovCisJCQlmbXRfZ2FwOwkvKiBnYXAyIHNpemUgKi8KKwljb25zdCBjaGFyCSogbmFtZTsgLyogdXNlZCBvbmx5IGZvciBwcmVkZWZpbmVkIGZvcm1hdHMgKi8KK307CisKKworLyogY29tbWFuZHMgbmVlZGluZyB3cml0ZSBhY2Nlc3MgaGF2ZSAweDQwIHNldCAqLworLyogY29tbWFuZHMgbmVlZGluZyBzdXBlciB1c2VyIGFjY2VzcyBoYXZlIDB4ODAgc2V0ICovCisKKyNkZWZpbmUgRkRDTFJQUk0gX0lPKDIsIDB4NDEpCisvKiBjbGVhciB1c2VyLWRlZmluZWQgcGFyYW1ldGVycyAqLworCisjZGVmaW5lIEZEU0VUUFJNIF9JT1coMiwgMHg0Miwgc3RydWN0IGZsb3BweV9zdHJ1Y3QpIAorI2RlZmluZSBGRFNFVE1FRElBUFJNIEZEU0VUUFJNCisvKiBzZXQgdXNlci1kZWZpbmVkIHBhcmFtZXRlcnMgZm9yIGN1cnJlbnQgbWVkaWEgKi8KKworI2RlZmluZSBGRERFRlBSTSBfSU9XKDIsIDB4NDMsIHN0cnVjdCBmbG9wcHlfc3RydWN0KSAKKyNkZWZpbmUgRkRHRVRQUk0gX0lPUigyLCAweDA0LCBzdHJ1Y3QgZmxvcHB5X3N0cnVjdCkKKyNkZWZpbmUgRkRERUZNRURJQVBSTSBGRERFRlBSTQorI2RlZmluZSBGREdFVE1FRElBUFJNIEZER0VUUFJNCisvKiBzZXQvZ2V0IGRpc2sgcGFyYW1ldGVycyAqLworCisKKyNkZWZpbmUJRkRNU0dPTiAgX0lPKDIsMHg0NSkKKyNkZWZpbmUJRkRNU0dPRkYgX0lPKDIsMHg0NikKKy8qIGlzc3VlL2Rvbid0IGlzc3VlIGtlcm5lbCBtZXNzYWdlcyBvbiBtZWRpYSB0eXBlIGNoYW5nZSAqLworCisKKy8qIAorICogRm9ybWF0dGluZyAob2Jzb2xldGUpCisgKi8KKyNkZWZpbmUgRkRfRklMTF9CWVRFIDB4RjYgLyogZm9ybWF0IGZpbGwgYnl0ZS4gKi8KKworc3RydWN0IGZvcm1hdF9kZXNjciB7CisJdW5zaWduZWQgaW50IGRldmljZSxoZWFkLHRyYWNrOworfTsKKworI2RlZmluZSBGREZNVEJFRyBfSU8oMiwweDQ3KQorLyogYmVnaW4gZm9ybWF0dGluZyBhIGRpc2sgKi8KKyNkZWZpbmUJRkRGTVRUUksgX0lPVygyLDB4NDgsIHN0cnVjdCBmb3JtYXRfZGVzY3IpCisvKiBmb3JtYXQgdGhlIHNwZWNpZmllZCB0cmFjayAqLworI2RlZmluZSBGREZNVEVORCBfSU8oMiwweDQ5KQorLyogZW5kIGZvcm1hdHRpbmcgYSBkaXNrICovCisKKworLyoKKyAqIEVycm9yIHRocmVzaG9sZHMKKyAqLworc3RydWN0IGZsb3BweV9tYXhfZXJyb3JzIHsKKwl1bnNpZ25lZCBpbnQKKwkgIGFib3J0LCAgICAgIC8qIG51bWJlciBvZiBlcnJvcnMgdG8gYmUgcmVhY2hlZCBiZWZvcmUgYWJvcnRpbmcgKi8KKwkgIHJlYWRfdHJhY2ssIC8qIG1heGltYWwgbnVtYmVyIG9mIGVycm9ycyBwZXJtaXR0ZWQgdG8gcmVhZCBhbgorCQkgICAgICAgKiBlbnRpcmUgdHJhY2sgYXQgb25jZSAqLworCSAgcmVzZXQsICAgICAgLyogbWF4aW1hbCBudW1iZXIgb2YgZXJyb3JzIGJlZm9yZSBhIHJlc2V0IGlzIHRyaWVkICovCisJICByZWNhbCwgICAgICAvKiBtYXhpbWFsIG51bWJlciBvZiBlcnJvcnMgYmVmb3JlIGEgcmVjYWxpYnJhdGUgaXMKKwkJICAgICAgICogdHJpZWQgKi8KKworCSAgLyoKKwkgICAqIFRocmVzaG9sZCBmb3IgcmVwb3J0aW5nIEZEQyBlcnJvcnMgdG8gdGhlIGNvbnNvbGUuCisJICAgKiBTZXR0aW5nIHRoaXMgdG8gemVybyBtYXkgZmxvb2QgeW91ciBzY3JlZW4gd2hlbiB1c2luZworCSAgICogdWx0cmEgY2hlYXAgZmxvcHBpZXMgOy0pCisJICAgKi8KKwkgIHJlcG9ydGluZzsKKworfTsKKworI2RlZmluZSBGRFNFVEVNU0dUUkVTSAlfSU8oMiwweDRhKQorLyogc2V0IGZkYyBlcnJvciByZXBvcnRpbmcgdGhyZXNob2xkICovCisKKyNkZWZpbmUgRkRGTFVTSCAgX0lPKDIsMHg0YikKKy8qIGZsdXNoIGJ1ZmZlcnMgZm9yIG1lZGlhOyBlaXRoZXIgZm9yIHZlcmlmeWluZyBtZWRpYSwgb3IgZm9yCisgKiBoYW5kbGluZyBhIG1lZGlhIGNoYW5nZSB3aXRob3V0IGNsb3NpbmcgdGhlIGZpbGUgZGVzY3JpcHRvciAqLworCisjZGVmaW5lIEZEU0VUTUFYRVJSUyBfSU9XKDIsIDB4NGMsIHN0cnVjdCBmbG9wcHlfbWF4X2Vycm9ycykKKyNkZWZpbmUgRkRHRVRNQVhFUlJTIF9JT1IoMiwgMHgwZSwgc3RydWN0IGZsb3BweV9tYXhfZXJyb3JzKQorLyogc2V0L2dldCBhYm9ydGlvbiBhbmQgcmVhZF90cmFjayB0aHJlc2hvbGQuIFNlZSBhbHNvIGZsb3BweV9kcml2ZV9wYXJhbXMKKyAqIHN0cnVjdHVyZSAqLworCisKK3R5cGVkZWYgY2hhciBmbG9wcHlfZHJpdmVfbmFtZVsxNl07CisjZGVmaW5lIEZER0VURFJWVFlQIF9JT1IoMiwgMHgwZiwgZmxvcHB5X2RyaXZlX25hbWUpCisvKiBnZXQgZHJpdmUgdHlwZTogNSAxLzQgb3IgMyAxLzIgKi8KKworCisvKgorICogRHJpdmUgcGFyYW1ldGVycyAodXNlciBtb2RpZmlhYmxlKQorICovCitzdHJ1Y3QgZmxvcHB5X2RyaXZlX3BhcmFtcyB7CisJc2lnbmVkIGNoYXIgY21vczsJCS8qIENNT1MgdHlwZSAqLworCQorCS8qIFNwZWMyIGlzIChITEQ8PDEgfCBORCksIHdoZXJlIEhMRCBpcyBoZWFkIGxvYWQgdGltZSAoMT0ybXMsIDI9NCBtcyAKKwkgKiBldGMpIGFuZCBORCBpcyBzZXQgbWVhbnMgbm8gRE1BLiBIYXJkY29kZWQgdG8gNiAoSExEPTZtcywgdXNlIERNQSkuCisJICovCisJdW5zaWduZWQgbG9uZyBtYXhfZHRyOwkJLyogU3RlcCByYXRlLCB1c2VjICovCisJdW5zaWduZWQgbG9uZyBobHQ7ICAgICAJCS8qIEhlYWQgbG9hZC9zZXR0bGUgdGltZSwgbXNlYyAqLworCXVuc2lnbmVkIGxvbmcgaHV0OyAgICAgCQkvKiBIZWFkIHVubG9hZCB0aW1lIChyZW1uYW50IG9mIAorCQkJCQkgKiA4IiBkcml2ZXMpICovCisJdW5zaWduZWQgbG9uZyBzcnQ7ICAgICAJCS8qIFN0ZXAgcmF0ZSwgdXNlYyAqLworCisJdW5zaWduZWQgbG9uZyBzcGludXA7CQkvKiB0aW1lIG5lZWRlZCBmb3Igc3BpbnVwIChleHByZXNzZWQKKwkJCQkJICogaW4gamlmZmllcykgKi8KKwl1bnNpZ25lZCBsb25nIHNwaW5kb3duOwkJLyogdGltZW91dCBuZWVkZWQgZm9yIHNwaW5kb3duICovCisJdW5zaWduZWQgY2hhciBzcGluZG93bl9vZmZzZXQ7CS8qIGRlY2lkZXMgaW4gd2hpY2ggcG9zaXRpb24gdGhlIGRpc2sKKwkJCQkJICogd2lsbCBzdG9wICovCisJdW5zaWduZWQgY2hhciBzZWxlY3RfZGVsYXk7CS8qIGRlbGF5IHRvIHdhaXQgYWZ0ZXIgc2VsZWN0ICovCisJdW5zaWduZWQgY2hhciBycHM7CQkvKiByb3RhdGlvbnMgcGVyIHNlY29uZCAqLworCXVuc2lnbmVkIGNoYXIgdHJhY2tzOwkJLyogbWF4aW11bSBudW1iZXIgb2YgdHJhY2tzICovCisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwkJLyogdGltZW91dCBmb3IgaW50ZXJydXB0IHJlcXVlc3RzICovCisJCisJdW5zaWduZWQgY2hhciBpbnRlcmxlYXZlX3NlY3Q7CS8qIGlmIHRoZXJlIGFyZSBtb3JlIHNlY3RvcnMsIHVzZSAKKwkJCQkJICogaW50ZXJsZWF2ZSAqLworCQorCXN0cnVjdCBmbG9wcHlfbWF4X2Vycm9ycyBtYXhfZXJyb3JzOworCQorCWNoYXIgZmxhZ3M7CQkJLyogdmFyaW91cyBmbGFncywgaW5jbHVkaW5nIGZ0ZF9tc2cgKi8KKy8qCisgKiBBbm5vdW5jZSBzdWNjZXNzZnVsIG1lZGlhIHR5cGUgZGV0ZWN0aW9uIGFuZCBtZWRpYSBpbmZvcm1hdGlvbiBsb3NzIGFmdGVyCisgKiBkaXNrIGNoYW5nZXMuCisgKiBBbHNvIHVzZWQgdG8gZW5hYmxlL2Rpc2FibGUgcHJpbnRpbmcgb2Ygb3ZlcnJ1biB3YXJuaW5ncy4KKyAqLworCisjZGVmaW5lIEZURF9NU0cgMHgxMAorI2RlZmluZSBGRF9CUk9LRU5fRENMIDB4MjAKKyNkZWZpbmUgRkRfREVCVUcgMHgwMgorI2RlZmluZSBGRF9TSUxFTlRfRENMX0NMRUFSIDB4NAorI2RlZmluZSBGRF9JTlZFUlRFRF9EQ0wgMHg4MCAvKiBtdXN0IGJlIDB4ODAsIGJlY2F1c2Ugb2YgaGFyZHdhcmUgCisJCQkJY29uc2lkZXJhdGlvbnMgKi8KKworCWNoYXIgcmVhZF90cmFjazsJCS8qIHVzZSByZWFkdHJhY2sgZHVyaW5nIHByb2Jpbmc/ICovCisKKy8qCisgKiBBdXRvLWRldGVjdGlvbi4gRWFjaCBkcml2ZSB0eXBlIGhhcyBlaWdodCBmb3JtYXRzIHdoaWNoIGFyZQorICogdXNlZCBpbiBzdWNjZXNzaW9uIHRvIHRyeSB0byByZWFkIHRoZSBkaXNrLiBJZiB0aGUgRkRDIGNhbm5vdCBsb2NrIG9udG8KKyAqIHRoZSBkaXNrLCB0aGUgbmV4dCBmb3JtYXQgaXMgdHJpZWQuIFRoaXMgdXNlcyB0aGUgdmFyaWFibGUgJ3Byb2JpbmcnLgorICovCisJc2hvcnQgYXV0b2RldGVjdFs4XTsJCS8qIGF1dG9kZXRlY3RlZCBmb3JtYXRzICovCisJCisJaW50IGNoZWNrZnJlcTsgLyogaG93IG9mdGVuIHNob3VsZCB0aGUgZHJpdmUgYmUgY2hlY2tlZCBmb3IgZGlzayAKKwkJCSogY2hhbmdlcyAqLworCWludCBuYXRpdmVfZm9ybWF0OyAvKiBuYXRpdmUgZm9ybWF0IG9mIHRoaXMgZHJpdmUgKi8KK307CisKK2VudW0geworCUZEX05FRURfVFdBRERMRV9CSVQsCS8qIG1vcmUgbWFnaWMgKi8KKwlGRF9WRVJJRllfQklULAkJLyogaW5xdWlyZSBmb3Igd3JpdGUgcHJvdGVjdGlvbiAqLworCUZEX0RJU0tfTkVXQ0hBTkdFX0JJVCwJLyogY2hhbmdlIGRldGVjdGVkLCBhbmQgbm8gYWN0aW9uIHVuZGVydGFrZW4geWV0CisJCQkJICogdG8gY2xlYXIgbWVkaWEgY2hhbmdlIHN0YXR1cyAqLworCUZEX1VOVVNFRF9CSVQsCisJRkRfRElTS19DSEFOR0VEX0JJVCwJLyogZGlzayBoYXMgYmVlbiBjaGFuZ2VkIHNpbmNlIGxhc3QgaS9vICovCisJRkRfRElTS19XUklUQUJMRV9CSVQJLyogZGlzayBpcyB3cml0YWJsZSAqLworfTsKKworI2RlZmluZSBGRFNFVERSVlBSTSBfSU9XKDIsIDB4OTAsIHN0cnVjdCBmbG9wcHlfZHJpdmVfcGFyYW1zKQorI2RlZmluZSBGREdFVERSVlBSTSBfSU9SKDIsIDB4MTEsIHN0cnVjdCBmbG9wcHlfZHJpdmVfcGFyYW1zKQorLyogc2V0L2dldCBkcml2ZSBwYXJhbWV0ZXJzICovCisKKworLyoKKyAqIEN1cnJlbnQgZHJpdmUgc3RhdGUgKG5vdCBkaXJlY3RseSBtb2RpZmlhYmxlIGJ5IHVzZXIsIHJlYWRvbmx5KQorICovCitzdHJ1Y3QgZmxvcHB5X2RyaXZlX3N0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKy8qIHZhbHVlcyBmb3IgdGhlc2UgZmxhZ3MgKi8KKyNkZWZpbmUgRkRfTkVFRF9UV0FERExFICgxIDw8IEZEX05FRURfVFdBRERMRV9CSVQpCisjZGVmaW5lIEZEX1ZFUklGWSAoMSA8PCBGRF9WRVJJRllfQklUKQorI2RlZmluZSBGRF9ESVNLX05FV0NIQU5HRSAoMSA8PCBGRF9ESVNLX05FV0NIQU5HRV9CSVQpCisjZGVmaW5lIEZEX0RJU0tfQ0hBTkdFRCAoMSA8PCBGRF9ESVNLX0NIQU5HRURfQklUKQorI2RlZmluZSBGRF9ESVNLX1dSSVRBQkxFICgxIDw8IEZEX0RJU0tfV1JJVEFCTEVfQklUKQorCisJdW5zaWduZWQgbG9uZyBzcGludXBfZGF0ZTsKKwl1bnNpZ25lZCBsb25nIHNlbGVjdF9kYXRlOworCXVuc2lnbmVkIGxvbmcgZmlyc3RfcmVhZF9kYXRlOworCXNob3J0IHByb2JlZF9mb3JtYXQ7CisJc2hvcnQgdHJhY2s7IC8qIGN1cnJlbnQgdHJhY2sgKi8KKwlzaG9ydCBtYXhibG9jazsgLyogaWQgb2YgaGlnaGVzdCBibG9jayByZWFkICovCisJc2hvcnQgbWF4dHJhY2s7IC8qIGlkIG9mIGhpZ2hlc3QgaGFsZiB0cmFjayByZWFkICovCisJaW50IGdlbmVyYXRpb247IC8qIGhvdyBtYW55IGRpc2tjaGFuZ2VzPyAqLworCisvKgorICogKFVzZXItcHJvdmlkZWQpIG1lZGlhIGluZm9ybWF0aW9uIGlzIF9ub3RfIGRpc2NhcmRlZCBhZnRlciBhIG1lZGlhIGNoYW5nZQorICogaWYgdGhlIGNvcnJlc3BvbmRpbmcga2VlcF9kYXRhIGZsYWcgaXMgbm9uLXplcm8uIFBvc2l0aXZlIHZhbHVlcyBhcmUKKyAqIGRlY3JlbWVudGVkIGFmdGVyIGVhY2ggcHJvYmUuCisgKi8KKwlpbnQga2VlcF9kYXRhOworCQorCS8qIFByZXZlbnQgImFsaWFzZWQiIGFjY2Vzc2VzLiAqLworCWludCBmZF9yZWY7CisJaW50IGZkX2RldmljZTsKKwl1bnNpZ25lZCBsb25nIGxhc3RfY2hlY2tlZDsgLyogd2hlbiB3YXMgdGhlIGRyaXZlIGxhc3QgY2hlY2tlZCBmb3IgYSBkaXNrIAorCQkJICAgKiBjaGFuZ2U/ICovCisJCisJY2hhciAqZG1hYnVmOworCWludCBidWZibG9ja3M7Cit9OworCisjZGVmaW5lIEZER0VURFJWU1RBVCBfSU9SKDIsIDB4MTIsIHN0cnVjdCBmbG9wcHlfZHJpdmVfc3RydWN0KQorI2RlZmluZSBGRFBPTExEUlZTVEFUIF9JT1IoMiwgMHgxMywgc3RydWN0IGZsb3BweV9kcml2ZV9zdHJ1Y3QpCisvKiBnZXQgZHJpdmUgc3RhdGU6IEdFVCByZXR1cm5zIHRoZSBjYWNoZWQgc3RhdGUsIFBPTEwgcG9sbHMgZm9yIG5ldyBzdGF0ZSAqLworCisKKy8qCisgKiByZXNldCBGREMKKyAqLworZW51bSByZXNldF9tb2RlIHsKKwlGRF9SRVNFVF9JRl9ORUVERUQsCS8qIHJlc2V0IG9ubHkgaWYgdGhlIHJlc2V0IGZsYWdzIGlzIHNldCAqLworCUZEX1JFU0VUX0lGX1JBV0NNRCwJLyogb2Jzb2xldGUgKi8KKwlGRF9SRVNFVF9BTFdBWVMJCS8qIHJlc2V0IGFsd2F5cyAqLworfTsKKyNkZWZpbmUgRkRSRVNFVCBfSU8oMiwgMHg1NCkKKworCisvKgorICogRkRDIHN0YXRlCisgKi8KK3N0cnVjdCBmbG9wcHlfZmRjX3N0YXRlIHsJCisJaW50IHNwZWMxOwkJLyogc3BlYzEgdmFsdWUgbGFzdCB1c2VkICovCisJaW50IHNwZWMyOwkJLyogc3BlYzIgdmFsdWUgbGFzdCB1c2VkICovCisJaW50IGR0cjsKKwl1bnNpZ25lZCBjaGFyIHZlcnNpb247CS8qIEZEQyB2ZXJzaW9uIGNvZGUgKi8KKwl1bnNpZ25lZCBjaGFyIGRvcjsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CS8qIGlvIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQgcmF3Y21kOjI7CisJdW5zaWduZWQgaW50IHJlc2V0OjE7CisJdW5zaWduZWQgaW50IG5lZWRfY29uZmlndXJlOjE7CisJdW5zaWduZWQgaW50IHBlcnBfbW9kZToyOworCXVuc2lnbmVkIGludCBoYXNfZmlmbzoxOworCXVuc2lnbmVkIGludCBkcml2ZXJfdmVyc2lvbjsJLyogdmVyc2lvbiBjb2RlIGZvciBmbG9wcHkgZHJpdmVyICovCisjZGVmaW5lIEZEX0RSSVZFUl9WRVJTSU9OIDB4MTAwCisvKiB1c2VyIHByb2dyYW1zIHVzaW5nIHRoZSBmbG9wcHkgQVBJIHNob3VsZCB1c2UgZmxvcHB5X2ZkY19zdGF0ZSB0bworICogZ2V0IHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZmxvcHB5IGRyaXZlciB0aGF0IHRoZXkgYXJlIHJ1bm5pbmcKKyAqIG9uLiBJZiB0aGlzIHZlcnNpb24gbnVtYmVyIGlzIGJpZ2dlciB0aGFuIHRoZSBvbmUgY29tcGlsZWQgaW50byB0aGUKKyAqIHVzZXIgcHJvZ3JhbSAodGhlIEZEX0RSSVZFUl9WRVJTSU9OIGRlZmluZSksIGl0IHNob3VsZCBiZSBwcmVwYXJlZAorICogdG8gYmlnZ2VyIHN0cnVjdHVyZXMKKyAqLworCisJdW5zaWduZWQgY2hhciB0cmFja1s0XTsKKwkvKiBQb3NpdGlvbiBvZiB0aGUgaGVhZHMgb2YgdGhlIDQgdW5pdHMgYXR0YWNoZWQgdG8gdGhpcyBGREMsCisJICogYXMgc3RvcmVkIG9uIHRoZSBGREMuIEluIHRoZSBmdXR1cmUsIHRoZSBwb3NpdGlvbiBhcyBzdG9yZWQKKwkgKiBvbiB0aGUgRkRDIG1pZ2h0IG5vdCBhZ3JlZSB3aXRoIHRoZSBhY3R1YWwgcGh5c2ljYWwKKwkgKiBwb3NpdGlvbiBvZiB0aGVzZSBkcml2ZSBoZWFkcy4gQnkgYWxsb3dpbmcgc3VjaAorCSAqIGRpc2FncmVlbWVudCwgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byByZXNldCB0aGUgRkRDIHdpdGhvdXQKKwkgKiBpbmN1cnJpbmcgdGhlIGV4cGVuc2l2ZSBjb3N0IG9mIHJlcG9zaXRpb25pbmcgYWxsIGhlYWRzLgorCSAqIFJpZ2h0IG5vdywgdGhlc2UgcG9zaXRpb25zIGFyZSBoYXJkIHdpcmVkIHRvIDAuICovCisKK307CisKKyNkZWZpbmUgRkRHRVRGRENTVEFUIF9JT1IoMiwgMHgxNSwgc3RydWN0IGZsb3BweV9mZGNfc3RhdGUpCisKKworLyoKKyAqIEFzeW5jaHJvbm91cyBXcml0ZSBlcnJvciB0cmFja2luZworICovCitzdHJ1Y3QgZmxvcHB5X3dyaXRlX2Vycm9ycyB7CisJLyogV3JpdGUgZXJyb3IgbG9nZ2luZy4KKwkgKgorCSAqIFRoZXNlIGZpZWxkcyBjYW4gYmUgY2xlYXJlZCB3aXRoIHRoZSBGRFdFUlJPUkNMUiBpb2N0bC4KKwkgKiBPbmx5IHdyaXRlcyB0aGF0IHdlcmUgYXR0ZW1wdGVkIGJ1dCBmYWlsZWQgZHVlIHRvIGEgcGh5c2ljYWwgbWVkaWEKKwkgKiBlcnJvciBhcmUgbG9nZ2VkLiAgd3JpdGUoMikgY2FsbHMgdGhhdCBmYWlsIGFuZCByZXR1cm4gYW4gZXJyb3IgY29kZQorCSAqIHRvIHRoZSB1c2VyIHByb2Nlc3MgYXJlIG5vdCBjb3VudGVkLgorCSAqLworCisJdW5zaWduZWQgaW50IHdyaXRlX2Vycm9yczsgIC8qIG51bWJlciBvZiBwaHlzaWNhbCB3cml0ZSBlcnJvcnMgCisJCQkJICAgICAqIGVuY291bnRlcmVkICovCisJCisJLyogcG9zaXRpb24gb2YgZmlyc3QgYW5kIGxhc3Qgd3JpdGUgZXJyb3JzICovCisJdW5zaWduZWQgbG9uZyBmaXJzdF9lcnJvcl9zZWN0b3I7CisJaW50ICAgICAgICAgICBmaXJzdF9lcnJvcl9nZW5lcmF0aW9uOworCXVuc2lnbmVkIGxvbmcgbGFzdF9lcnJvcl9zZWN0b3I7CisJaW50ICAgICAgICAgICBsYXN0X2Vycm9yX2dlbmVyYXRpb247CisJCisJdW5zaWduZWQgaW50IGJhZG5lc3M7IC8qIGhpZ2hlc3QgcmV0cnkgY291bnQgZm9yIGEgcmVhZCBvciB3cml0ZSAKKwkJCSAgICAgICAqIG9wZXJhdGlvbiAqLworfTsKKworI2RlZmluZSBGRFdFUlJPUkNMUiAgX0lPKDIsIDB4NTYpCisvKiBjbGVhciB3cml0ZSBlcnJvciBhbmQgYmFkbmVzcyBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBGRFdFUlJPUkdFVCAgX0lPUigyLCAweDE3LCBzdHJ1Y3QgZmxvcHB5X3dyaXRlX2Vycm9ycykKKy8qIGdldCB3cml0ZSBlcnJvciBhbmQgYmFkbmVzcyBpbmZvcm1hdGlvbiAqLworCisKKy8qCisgKiBSYXcgY29tbWFuZHMKKyAqLworLyogbmV3IGludGVyZmFjZSBmbGFnOiBub3cgd2UgY2FuIGRvIHRoZW0gaW4gYmF0Y2hlcyAqLworI2RlZmluZSBGREhBVkVCQVRDSEVEUkFXQ01ECisKK3N0cnVjdCBmbG9wcHlfcmF3X2NtZCB7CisJdW5zaWduZWQgaW50IGZsYWdzOworI2RlZmluZSBGRF9SQVdfUkVBRCAxCisjZGVmaW5lIEZEX1JBV19XUklURSAyCisjZGVmaW5lIEZEX1JBV19OT19NT1RPUiA0CisjZGVmaW5lIEZEX1JBV19ESVNLX0NIQU5HRSA0IC8qIG91dDogZGlzayBjaGFuZ2UgZmxhZyB3YXMgc2V0ICovCisjZGVmaW5lIEZEX1JBV19JTlRSIDggICAgLyogd2FpdCBmb3IgYW4gaW50ZXJydXB0ICovCisjZGVmaW5lIEZEX1JBV19TUElOIDB4MTAgLyogc3BpbiB1cCB0aGUgZGlzayBmb3IgdGhpcyBjb21tYW5kICovCisjZGVmaW5lIEZEX1JBV19OT19NT1RPUl9BRlRFUiAweDIwIC8qIHN3aXRjaCB0aGUgbW90b3Igb2ZmIGFmdGVyIGNvbW1hbmQgCisJCQkJICAgICogY29tcGxldGlvbiAqLworI2RlZmluZSBGRF9SQVdfTkVFRF9ESVNLIDB4NDAgIC8qIHRoaXMgY29tbWFuZCBuZWVkcyBhIGRpc2sgdG8gYmUgcHJlc2VudCAqLworI2RlZmluZSBGRF9SQVdfTkVFRF9TRUVLIDB4ODAgIC8qIHRoaXMgY29tbWFuZCB1c2VzIGFuIGltcGxpZWQgc2VlayAoc29mdCkgKi8KKworLyogbW9yZSAiaW4iIGZsYWdzICovCisjZGVmaW5lIEZEX1JBV19NT1JFIDB4MTAwICAvKiBtb3JlIHJlY29yZHMgZm9sbG93ICovCisjZGVmaW5lIEZEX1JBV19TVE9QX0lGX0ZBSUxVUkUgMHgyMDAgLyogc3RvcCBpZiB3ZSBlbmNvdW50ZXIgYSBmYWlsdXJlICovCisjZGVmaW5lIEZEX1JBV19TVE9QX0lGX1NVQ0NFU1MgMHg0MDAgLyogc3RvcCBpZiBjb21tYW5kIHN1Y2Nlc3NmdWwgKi8KKyNkZWZpbmUgRkRfUkFXX1NPRlRGQUlMVVJFIDB4ODAwIC8qIGNvbnNpZGVyIHRoZSByZXR1cm4gdmFsdWUgZm9yIGZhaWx1cmUKKwkJCQkgICogZGV0ZWN0aW9uIHRvbyAqLworCisvKiBtb3JlICJvdXQiIGZsYWdzICovCisjZGVmaW5lIEZEX1JBV19GQUlMVVJFIDB4MTAwMDAgLyogY29tbWFuZCBzZW50IHRvIGZkYywgZmRjIHJldHVybmVkIGVycm9yICovCisjZGVmaW5lIEZEX1JBV19IQVJERkFJTFVSRSAweDIwMDAwIC8qIGZkYyBoYWQgdG8gYmUgcmVzZXQsIG9yIHRpbWVkIG91dCAqLworCisJdm9pZCAqZGF0YTsKKwljaGFyICprZXJuZWxfZGF0YTsgLyogbG9jYXRpb24gb2YgZGF0YSBidWZmZXIgaW4gdGhlIGtlcm5lbCAqLworCXN0cnVjdCBmbG9wcHlfcmF3X2NtZCAqbmV4dDsgLyogdXNlZCBmb3IgY2hhaW5pbmcgb2YgcmF3IGNtZCdzIAorCQkJCSAgICAgICogd2l0aGluIHRoZSBrZXJuZWwgKi8KKwlsb25nIGxlbmd0aDsgLyogaW46IGxlbmd0aCBvZiBkbWEgdHJhbnNmZXIuIG91dDogcmVtYWluaW5nIGJ5dGVzICovCisJbG9uZyBwaHlzX2xlbmd0aDsgLyogcGh5c2ljYWwgbGVuZ3RoLCBpZiBkaWZmZXJlbnQgZnJvbSBkbWEgbGVuZ3RoICovCisJaW50IGJ1ZmZlcl9sZW5ndGg7IC8qIGxlbmd0aCBvZiBhbGxvY2F0ZWQgYnVmZmVyICovCisKKwl1bnNpZ25lZCBjaGFyIHJhdGU7CisJdW5zaWduZWQgY2hhciBjbWRfY291bnQ7CisJdW5zaWduZWQgY2hhciBjbWRbMTZdOworCXVuc2lnbmVkIGNoYXIgcmVwbHlfY291bnQ7CisJdW5zaWduZWQgY2hhciByZXBseVsxNl07CisJaW50IHRyYWNrOworCWludCByZXN1bHRjb2RlOworCisJaW50IHJlc2VydmVkMTsKKwlpbnQgcmVzZXJ2ZWQyOworfTsKKworI2RlZmluZSBGRFJBV0NNRCBfSU8oMiwgMHg1OCkKKy8qIHNlbmQgYSByYXcgY29tbWFuZCB0byB0aGUgZmRjLiBTdHJ1Y3R1cmUgc2l6ZSBub3QgaW5jbHVkZWQsIGJlY2F1c2Ugb2YKKyAqIGJhdGNoZXMgKi8KKworI2RlZmluZSBGRFRXQURETEUgX0lPKDIsIDB4NTkpCisvKiBmbGlja2VyIG1vdG9yLW9uIGJpdCBiZWZvcmUgcmVhZGluZyBhIHNlY3Rvci4gRXhwZXJpbWVudGFsICovCisKKworI2RlZmluZSBGREVKRUNUIF9JTygyLCAweDVhKQorLyogZWplY3QgdGhlIGRpc2sgKi8KKworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mZHJlZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mZHJlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxY2U2NDEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZkcmVnLmgKQEAgLTAsMCArMSwxMzcgQEAKKyNpZm5kZWYgX0xJTlVYX0ZEUkVHX0gKKyNkZWZpbmUgX0xJTlVYX0ZEUkVHX0gKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgc29tZSBkZWZpbmVzIGZvciB0aGUgZmxvcHB5IGRpc2sgY29udHJvbGxlci4KKyAqIFZhcmlvdXMgc291cmNlcy4gTW9zdGx5ICJJQk0gTWljcm9jb21wdXRlcnM6IEEgUHJvZ3JhbW1lcnMKKyAqIEhhbmRib29rIiwgU2FuY2hlcyBhbmQgQ2FudG9uLgorICovCisKKyNpZmRlZiBGRFBBVENIRVMKKyNkZWZpbmUgRkRfSU9QT1JUIGZkY19zdGF0ZVtmZGNdLmFkZHJlc3MKKyNlbHNlCisvKiBJdCB3b3VsZCBiZSBhIGxvdCBzYW5lciBqdXN0IHRvIGZvcmNlIGZkY19zdGF0ZVtmZGNdLmFkZHJlc3MgdG8gYWx3YXlzCisgICBiZSBzZXQgISBGSVhNRSAqLworI2RlZmluZSBGRF9JT1BPUlQgMHgzZjAKKyNlbmRpZgorCisvKiBGZCBjb250cm9sbGVyIHJlZ3MuIFMmQywgYWJvdXQgcGFnZSAzNDAgKi8KKyNkZWZpbmUgRkRfU1RBVFVTCSg0ICsgRkRfSU9QT1JUICkKKyNkZWZpbmUgRkRfREFUQQkJKDUgKyBGRF9JT1BPUlQgKQorCisvKiBEaWdpdGFsIE91dHB1dCBSZWdpc3RlciAqLworI2RlZmluZSBGRF9ET1IJCSgyICsgRkRfSU9QT1JUICkKKworLyogRGlnaXRhbCBJbnB1dCBSZWdpc3RlciAocmVhZCkgKi8KKyNkZWZpbmUgRkRfRElSCQkoNyArIEZEX0lPUE9SVCApCisKKy8qIERpc2tldHRlIENvbnRyb2wgUmVnaXN0ZXIgKHdyaXRlKSovCisjZGVmaW5lIEZEX0RDUgkJKDcgKyBGRF9JT1BPUlQgKQorCisvKiBCaXRzIG9mIG1haW4gc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIFNUQVRVU19CVVNZTUFTSwkweDBGCQkvKiBkcml2ZSBidXN5IG1hc2sgKi8KKyNkZWZpbmUgU1RBVFVTX0JVU1kJMHgxMAkJLyogRkRDIGJ1c3kgKi8KKyNkZWZpbmUgU1RBVFVTX0RNQQkweDIwCQkvKiAwLSBETUEgbW9kZSAqLworI2RlZmluZSBTVEFUVVNfRElSCTB4NDAJCS8qIDAtIGNwdS0+ZmRjICovCisjZGVmaW5lIFNUQVRVU19SRUFEWQkweDgwCQkvKiBEYXRhIHJlZyByZWFkeSAqLworCisvKiBCaXRzIG9mIEZEX1NUMCAqLworI2RlZmluZSBTVDBfRFMJCTB4MDMJCS8qIGRyaXZlIHNlbGVjdCBtYXNrICovCisjZGVmaW5lIFNUMF9IQQkJMHgwNAkJLyogSGVhZCAoQWRkcmVzcykgKi8KKyNkZWZpbmUgU1QwX05SCQkweDA4CQkvKiBOb3QgUmVhZHkgKi8KKyNkZWZpbmUgU1QwX0VDRQkJMHgxMAkJLyogRXF1aXBtZW50IGNoZWNrIGVycm9yICovCisjZGVmaW5lIFNUMF9TRQkJMHgyMAkJLyogU2VlayBlbmQgKi8KKyNkZWZpbmUgU1QwX0lOVFIJMHhDMAkJLyogSW50ZXJydXB0IGNvZGUgbWFzayAqLworCisvKiBCaXRzIG9mIEZEX1NUMSAqLworI2RlZmluZSBTVDFfTUFNCQkweDAxCQkvKiBNaXNzaW5nIEFkZHJlc3MgTWFyayAqLworI2RlZmluZSBTVDFfV1AJCTB4MDIJCS8qIFdyaXRlIFByb3RlY3QgKi8KKyNkZWZpbmUgU1QxX05ECQkweDA0CQkvKiBObyBEYXRhIC0gdW5yZWFkYWJsZSAqLworI2RlZmluZSBTVDFfT1IJCTB4MTAJCS8qIE92ZXJSdW4gKi8KKyNkZWZpbmUgU1QxX0NSQwkJMHgyMAkJLyogQ1JDIGVycm9yIGluIGRhdGEgb3IgYWRkciAqLworI2RlZmluZSBTVDFfRU9DCQkweDgwCQkvKiBFbmQgT2YgQ3lsaW5kZXIgKi8KKworLyogQml0cyBvZiBGRF9TVDIgKi8KKyNkZWZpbmUgU1QyX01BTQkJMHgwMQkJLyogTWlzc2luZyBBZGRyZXNzIE1hcmsgKGFnYWluKSAqLworI2RlZmluZSBTVDJfQkMJCTB4MDIJCS8qIEJhZCBDeWxpbmRlciAqLworI2RlZmluZSBTVDJfU05TCQkweDA0CQkvKiBTY2FuIE5vdCBTYXRpc2ZpZWQgKi8KKyNkZWZpbmUgU1QyX1NFSAkJMHgwOAkJLyogU2NhbiBFcXVhbCBIaXQgKi8KKyNkZWZpbmUgU1QyX1dDCQkweDEwCQkvKiBXcm9uZyBDeWxpbmRlciAqLworI2RlZmluZSBTVDJfQ1JDCQkweDIwCQkvKiBDUkMgZXJyb3IgaW4gZGF0YSBmaWVsZCAqLworI2RlZmluZSBTVDJfQ00JCTB4NDAJCS8qIENvbnRyb2wgTWFyayA9IGRlbGV0ZWQgKi8KKworLyogQml0cyBvZiBGRF9TVDMgKi8KKyNkZWZpbmUgU1QzX0hBCQkweDA0CQkvKiBIZWFkIChBZGRyZXNzKSAqLworI2RlZmluZSBTVDNfRFMJCTB4MDgJCS8qIGRyaXZlIGlzIGRvdWJsZS1zaWRlZCAqLworI2RlZmluZSBTVDNfVFoJCTB4MTAJCS8qIFRyYWNrIFplcm8gc2lnbmFsICgxPXRyYWNrIDApICovCisjZGVmaW5lIFNUM19SWQkJMHgyMAkJLyogZHJpdmUgaXMgcmVhZHkgKi8KKyNkZWZpbmUgU1QzX1dQCQkweDQwCQkvKiBXcml0ZSBQcm90ZWN0ICovCisjZGVmaW5lIFNUM19GVAkJMHg4MAkJLyogRHJpdmUgRmF1bHQgKi8KKworLyogVmFsdWVzIGZvciBGRF9DT01NQU5EICovCisjZGVmaW5lIEZEX1JFQ0FMSUJSQVRFCQkweDA3CS8qIG1vdmUgdG8gdHJhY2sgMCAqLworI2RlZmluZSBGRF9TRUVLCQkJMHgwRgkvKiBzZWVrIHRyYWNrICovCisjZGVmaW5lIEZEX1JFQUQJCQkweEU2CS8qIHJlYWQgd2l0aCBNVCwgTUZNLCBTS2lwIGRlbGV0ZWQgKi8KKyNkZWZpbmUgRkRfV1JJVEUJCTB4QzUJLyogd3JpdGUgd2l0aCBNVCwgTUZNICovCisjZGVmaW5lIEZEX1NFTlNFSQkJMHgwOAkvKiBTZW5zZSBJbnRlcnJ1cHQgU3RhdHVzICovCisjZGVmaW5lIEZEX1NQRUNJRlkJCTB4MDMJLyogc3BlY2lmeSBIVVQgZXRjICovCisjZGVmaW5lIEZEX0ZPUk1BVAkJMHg0RAkvKiBmb3JtYXQgb25lIHRyYWNrICovCisjZGVmaW5lIEZEX1ZFUlNJT04JCTB4MTAJLyogZ2V0IHZlcnNpb24gY29kZSAqLworI2RlZmluZSBGRF9DT05GSUdVUkUJCTB4MTMJLyogY29uZmlndXJlIEZJRk8gb3BlcmF0aW9uICovCisjZGVmaW5lIEZEX1BFUlBFTkRJQ1VMQVIJMHgxMgkvKiBwZXJwZW5kaWN1bGFyIHIvdyBtb2RlICovCisjZGVmaW5lIEZEX0dFVFNUQVRVUwkJMHgwNAkvKiByZWFkIFNUMyAqLworI2RlZmluZSBGRF9EVU1QUkVHUwkJMHgwRQkvKiBkdW1wIHRoZSBjb250ZW50cyBvZiB0aGUgZmRjIHJlZ3MgKi8KKyNkZWZpbmUgRkRfUkVBRElECQkweEVBCS8qIHByaW50cyB0aGUgaGVhZGVyIG9mIGEgc2VjdG9yICovCisjZGVmaW5lIEZEX1VOTE9DSwkJMHgxNAkvKiBGaWZvIGNvbmZpZyB1bmxvY2sgKi8KKyNkZWZpbmUgRkRfTE9DSwkJCTB4OTQJLyogRmlmbyBjb25maWcgbG9jayAqLworI2RlZmluZSBGRF9SU0VFS19PVVQJCTB4OGYJLyogc2VlayBvdXQgKGkuZS4gdG8gbG93ZXIgdHJhY2tzKSAqLworI2RlZmluZSBGRF9SU0VFS19JTgkJMHhjZgkvKiBzZWVrIGluIChpLmUuIHRvIGhpZ2hlciB0cmFja3MpICovCisKKy8qIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIG5ldyBpbiB0aGUgODIwNzguIFRoZXkgYXJlIG5vdCB1c2VkIGluIHRoZQorICogZmxvcHB5IGRyaXZlciwgZXhjZXB0IHRoZSBmaXJzdCB0aHJlZS4gVGhlc2UgY29tbWFuZHMgbWF5IGJlIHVzZWZ1bCBmb3IgYXBwcworICogd2hpY2ggdXNlIHRoZSBGRFJBV0NNRCBpbnRlcmZhY2UuIEZvciBkb2MsIGdldCB0aGUgODIwNzggc3BlYyBzaGVldHMgYXQKKyAqIGh0dHA6Ly93d3cuaW50ZWwuY29tL2Rlc2lnbi9hcmNoaXZlcy9wZXJpcGhybC9kb2NzLzI5MDQ2ODAzLmh0bSAqLworCisjZGVmaW5lIEZEX1BBUlRJRAkJMHgxOAkvKiBwYXJ0IGlkICgiZXh0ZW5kZWQiIHZlcnNpb24gY21kKSAqLworI2RlZmluZSBGRF9TQVZFCQkJMHgyZQkvKiBzYXZlIGZkYyByZWdzIGZvciBsYXRlciByZXN0b3JlICovCisjZGVmaW5lIEZEX0RSSVZFU1BFQwkJMHg4ZQkvKiBkcml2ZSBzcGVjaWZpY2F0aW9uOiBBY2Nlc3MgdG8gdGhlCisJCQkJCSAqIDIgTWJwcyBkYXRhIHRyYW5zZmVyIHJhdGUgZm9yIHRhcGUKKwkJCQkJICogZHJpdmVzICovCisKKyNkZWZpbmUgRkRfUkVTVE9SRQkJMHg0ZSAgICAvKiBsYXRlciByZXN0b3JlICovCisjZGVmaW5lIEZEX1BPV0VSRE9XTgkJMHgyNwkvKiBjb25maWd1cmUgRkRDJ3MgcG93ZXJzYXZlIGZlYXR1cmVzICovCisjZGVmaW5lIEZEX0ZPUk1BVF9OX1dSSVRFCTB4ZWYgICAgLyogZm9ybWF0IGFuZCB3cml0ZSBpbiBvbmUgZ28uICovCisjZGVmaW5lIEZEX09QVElPTgkJMHgzMwkvKiBJU08gZm9ybWF0ICh3aGljaCBpcyBhIGNsZWFuIHdheSB0bworCQkJCQkgKiBwYWNrIG1vcmUgc2VjdG9ycyBvbiBhIHRyYWNrKSAqLworCisvKiBETUEgY29tbWFuZHMgKi8KKyNkZWZpbmUgRE1BX1JFQUQJMHg0NgorI2RlZmluZSBETUFfV1JJVEUJMHg0QQorCisvKiBGREMgdmVyc2lvbiByZXR1cm4gdHlwZXMgKi8KKyNkZWZpbmUgRkRDX05PTkUJMHgwMAorI2RlZmluZSBGRENfVU5LTk9XTgkweDEwCS8qIERPIE5PVCBVU0UgVEhJUyBUWVBFIEVYQ0VQVCBJRiBJREVOVElGSUNBVElPTgorCQkJCSAgIEZBSUxTIEVBUkxZICovCisjZGVmaW5lIEZEQ184MjcyQQkweDIwCS8qIEludGVsIDgyNzJhLCBORUMgNzY1ICovCisjZGVmaW5lIEZEQ183NjVFRAkweDMwCS8qIE5vbi1JbnRlbCAxTUItY29tcGF0aWJsZSBGREMsIGNhbid0IGRldGVjdCAqLworI2RlZmluZSBGRENfODIwNzIJMHg0MAkvKiBJbnRlbCA4MjA3MjsgODI3MmEgKyBGSUZPICsgRFVNUFJFR1MgKi8KKyNkZWZpbmUgRkRDXzgyMDcyQQkweDQ1CS8qIDgyMDcyQSAob24gU3BhcmNzKSAqLworI2RlZmluZSBGRENfODIwNzdfT1JJRwkweDUxCS8qIE9yaWdpbmFsIHZlcnNpb24gb2YgODIwNzdBQSwgc2FucyBMT0NLICovCisjZGVmaW5lIEZEQ184MjA3NwkweDUyCS8qIDgyMDc3QUEtMSAqLworI2RlZmluZSBGRENfODIwNzhfVU5LTgkweDVmCS8qIFVua25vd24gODIwNzggdmFyaWFudCAqLworI2RlZmluZSBGRENfODIwNzgJMHg2MAkvKiA0NHBpbiA4MjA3OCBvciA2NHBpbiA4MjA3OFNMICovCisjZGVmaW5lIEZEQ184MjA3OF8xCTB4NjEJLyogODIwNzgtMSAoMk1icHMgZmRjKSAqLworI2RlZmluZSBGRENfUzgyMDc4QgkweDYyCS8qIFM4MjA3OEIgKGZpcnN0IHNlZW4gb24gQWRhcHRlYyBBVkEtMjgyNSBWTEIKKwkJCQkgKiBTQ1NJL0VJREUvRmxvcHB5IGNvbnRyb2xsZXIpICovCisjZGVmaW5lIEZEQ184NzMwNgkweDYzCS8qIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEMgODczMDYgKi8KKworLyoKKyAqIEJld2FyZTogdGhlIGZkYyB0eXBlIGxpc3QgaXMgcm91Z2hseSBzb3J0ZWQgYnkgaW5jcmVhc2luZyBmZWF0dXJlcy4KKyAqIFByZXNlbmNlIG9mIGZlYXR1cmVzIGlzIHRlc3RlZCBieSBjb21wYXJpbmcgdGhlIEZEQyB2ZXJzaW9uIGlkIHdpdGggdGhlCisgKiAib2xkZXN0IiB2ZXJzaW9uIHRoYXQgaGFzIHRoZSBuZWVkZWQgZmVhdHVyZS4KKyAqIElmIGR1cmluZyBGREMgZGV0ZWN0aW9uLCBhbiBvYnNjdXJlIHRlc3QgZmFpbHMgbGF0ZSBpbiB0aGUgc2VxdWVuY2UsIGRvbid0CisgKiBhc3NpZ24gRkRDX1VOS05PV04uIEVsc2UgdGhlIEZEQyB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBkdW1iIDgyNzJhLCBvciB3b3JzZS4KKyAqIFRoaXMgaXMgZXNwZWNpYWxseSB0cnVlIGlmIHRoZSB0ZXN0cyBhcmUgdW5uZWVkZWQuCisgKi8KKworI2RlZmluZSBGRF9SRVNFVF9ERUxBWSAyMAorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZpYl9ydWxlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9maWJfcnVsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWRhNjViCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9maWJfcnVsZXMuaApAQCAtMCwwICsxLDcyIEBACisjaWZuZGVmIF9fTElOVVhfRklCX1JVTEVTX0gKKyNkZWZpbmUgX19MSU5VWF9GSUJfUlVMRVNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKworLyogcnVsZSBpcyBwZXJtYW5lbnQsIGFuZCBjYW5ub3QgYmUgZGVsZXRlZCAqLworI2RlZmluZSBGSUJfUlVMRV9QRVJNQU5FTlQJMHgwMDAwMDAwMQorI2RlZmluZSBGSUJfUlVMRV9JTlZFUlQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRklCX1JVTEVfVU5SRVNPTFZFRAkweDAwMDAwMDA0CisjZGVmaW5lIEZJQl9SVUxFX0lJRl9ERVRBQ0hFRAkweDAwMDAwMDA4CisjZGVmaW5lIEZJQl9SVUxFX0RFVl9ERVRBQ0hFRAlGSUJfUlVMRV9JSUZfREVUQUNIRUQKKyNkZWZpbmUgRklCX1JVTEVfT0lGX0RFVEFDSEVECTB4MDAwMDAwMTAKKworLyogdHJ5IHRvIGZpbmQgc291cmNlIGFkZHJlc3MgaW4gcm91dGluZyBsb29rdXBzICovCisjZGVmaW5lIEZJQl9SVUxFX0ZJTkRfU0FERFIJMHgwMDAxMDAwMAorCitzdHJ1Y3QgZmliX3J1bGVfaGRyIHsKKwlfX3U4CQlmYW1pbHk7CisJX191OAkJZHN0X2xlbjsKKwlfX3U4CQlzcmNfbGVuOworCV9fdTgJCXRvczsKKworCV9fdTgJCXRhYmxlOworCV9fdTgJCXJlczE7CS8qIHJlc2VydmVkICovCisJX191OAkJcmVzMjsJLyogcmVzZXJ2ZWQgKi8KKwlfX3U4CQlhY3Rpb247CisKKwlfX3UzMgkJZmxhZ3M7Cit9OworCitlbnVtIHsKKwlGUkFfVU5TUEVDLAorCUZSQV9EU1QsCS8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlGUkFfU1JDLAkvKiBzb3VyY2UgYWRkcmVzcyAqLworCUZSQV9JSUZOQU1FLAkvKiBpbnRlcmZhY2UgbmFtZSAqLworI2RlZmluZSBGUkFfSUZOQU1FCUZSQV9JSUZOQU1FCisJRlJBX0dPVE8sCS8qIHRhcmdldCB0byBqdW1wIHRvIChGUl9BQ1RfR09UTykgKi8KKwlGUkFfVU5VU0VEMiwKKwlGUkFfUFJJT1JJVFksCS8qIHByaW9yaXR5L3ByZWZlcmVuY2UgKi8KKwlGUkFfVU5VU0VEMywKKwlGUkFfVU5VU0VENCwKKwlGUkFfVU5VU0VENSwKKwlGUkFfRldNQVJLLAkvKiBtYXJrICovCisJRlJBX0ZMT1csCS8qIGZsb3cvY2xhc3MgaWQgKi8KKwlGUkFfVU5VU0VENiwKKwlGUkFfVU5VU0VENywKKwlGUkFfVU5VU0VEOCwKKwlGUkFfVEFCTEUsCS8qIEV4dGVuZGVkIHRhYmxlIGlkICovCisJRlJBX0ZXTUFTSywJLyogbWFzayBmb3IgbmV0ZmlsdGVyIG1hcmsgKi8KKwlGUkFfT0lGTkFNRSwKKwlfX0ZSQV9NQVgKK307CisKKyNkZWZpbmUgRlJBX01BWCAoX19GUkFfTUFYIC0gMSkKKworZW51bSB7CisJRlJfQUNUX1VOU1BFQywKKwlGUl9BQ1RfVE9fVEJMLAkJLyogUGFzcyB0byBmaXhlZCB0YWJsZSAqLworCUZSX0FDVF9HT1RPLAkJLyogSnVtcCB0byBhbm90aGVyIHJ1bGUgKi8KKwlGUl9BQ1RfTk9QLAkJLyogTm8gb3BlcmF0aW9uICovCisJRlJfQUNUX1JFUzMsCisJRlJfQUNUX1JFUzQsCisJRlJfQUNUX0JMQUNLSE9MRSwJLyogRHJvcCB3aXRob3V0IG5vdGlmaWNhdGlvbiAqLworCUZSX0FDVF9VTlJFQUNIQUJMRSwJLyogRHJvcCB3aXRoIEVORVRVTlJFQUNIICovCisJRlJfQUNUX1BST0hJQklULAkvKiBEcm9wIHdpdGggRUFDQ0VTICovCisJX19GUl9BQ1RfTUFYLAorfTsKKworI2RlZmluZSBGUl9BQ1RfTUFYIChfX0ZSX0FDVF9NQVggLSAxKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmllbWFwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZpZW1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MzA3NDcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZpZW1hcC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBGU19JT0NfRklFTUFQIGlvY3RsIGluZnJhc3RydWN0dXJlLgorICoKKyAqIFNvbWUgcG9ydGlvbnMgY29weXJpZ2h0IChDKSAyMDA3IENsdXN0ZXIgRmlsZSBTeXN0ZW1zLCBJbmMKKyAqCisgKiBBdXRob3JzOiBNYXJrIEZhc2hlaCA8bWZhc2hlaEBzdXNlLmNvbT4KKyAqICAgICAgICAgIEthbHBhayBTaGFoIDxrYWxwYWsuc2hhaEBzdW4uY29tPgorICogICAgICAgICAgQW5kcmVhcyBEaWxnZXIgPGFkaWxnZXJAc3VuLmNvbT4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9GSUVNQVBfSAorI2RlZmluZSBfTElOVVhfRklFTUFQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBmaWVtYXBfZXh0ZW50IHsKKwlfX3U2NCBmZV9sb2dpY2FsOyAgLyogbG9naWNhbCBvZmZzZXQgaW4gYnl0ZXMgZm9yIHRoZSBzdGFydCBvZgorCQkJICAgICogdGhlIGV4dGVudCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgKi8KKwlfX3U2NCBmZV9waHlzaWNhbDsgLyogcGh5c2ljYWwgb2Zmc2V0IGluIGJ5dGVzIGZvciB0aGUgc3RhcnQKKwkJCSAgICAqIG9mIHRoZSBleHRlbnQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkaXNrICovCisJX191NjQgZmVfbGVuZ3RoOyAgIC8qIGxlbmd0aCBpbiBieXRlcyBmb3IgdGhpcyBleHRlbnQgKi8KKwlfX3U2NCBmZV9yZXNlcnZlZDY0WzJdOworCV9fdTMyIGZlX2ZsYWdzOyAgICAvKiBGSUVNQVBfRVhURU5UXyogZmxhZ3MgZm9yIHRoaXMgZXh0ZW50ICovCisJX191MzIgZmVfcmVzZXJ2ZWRbM107Cit9OworCitzdHJ1Y3QgZmllbWFwIHsKKwlfX3U2NCBmbV9zdGFydDsJCS8qIGxvZ2ljYWwgb2Zmc2V0IChpbmNsdXNpdmUpIGF0CisJCQkJICogd2hpY2ggdG8gc3RhcnQgbWFwcGluZyAoaW4pICovCisJX191NjQgZm1fbGVuZ3RoOwkvKiBsb2dpY2FsIGxlbmd0aCBvZiBtYXBwaW5nIHdoaWNoCisJCQkJICogdXNlcnNwYWNlIHdhbnRzIChpbikgKi8KKwlfX3UzMiBmbV9mbGFnczsJCS8qIEZJRU1BUF9GTEFHXyogZmxhZ3MgZm9yIHJlcXVlc3QgKGluL291dCkgKi8KKwlfX3UzMiBmbV9tYXBwZWRfZXh0ZW50czsvKiBudW1iZXIgb2YgZXh0ZW50cyB0aGF0IHdlcmUgbWFwcGVkIChvdXQpICovCisJX191MzIgZm1fZXh0ZW50X2NvdW50OyAgLyogc2l6ZSBvZiBmbV9leHRlbnRzIGFycmF5IChpbikgKi8KKwlfX3UzMiBmbV9yZXNlcnZlZDsKKwlzdHJ1Y3QgZmllbWFwX2V4dGVudCBmbV9leHRlbnRzWzBdOyAvKiBhcnJheSBvZiBtYXBwZWQgZXh0ZW50cyAob3V0KSAqLworfTsKKworI2RlZmluZSBGSUVNQVBfTUFYX09GRlNFVAkofjBVTEwpCisKKyNkZWZpbmUgRklFTUFQX0ZMQUdfU1lOQwkweDAwMDAwMDAxIC8qIHN5bmMgZmlsZSBkYXRhIGJlZm9yZSBtYXAgKi8KKyNkZWZpbmUgRklFTUFQX0ZMQUdfWEFUVFIJMHgwMDAwMDAwMiAvKiBtYXAgZXh0ZW5kZWQgYXR0cmlidXRlIHRyZWUgKi8KKworI2RlZmluZSBGSUVNQVBfRkxBR1NfQ09NUEFUCShGSUVNQVBfRkxBR19TWU5DIHwgRklFTUFQX0ZMQUdfWEFUVFIpCisKKyNkZWZpbmUgRklFTUFQX0VYVEVOVF9MQVNUCQkweDAwMDAwMDAxIC8qIExhc3QgZXh0ZW50IGluIGZpbGUuICovCisjZGVmaW5lIEZJRU1BUF9FWFRFTlRfVU5LTk9XTgkJMHgwMDAwMDAwMiAvKiBEYXRhIGxvY2F0aW9uIHVua25vd24uICovCisjZGVmaW5lIEZJRU1BUF9FWFRFTlRfREVMQUxMT0MJCTB4MDAwMDAwMDQgLyogTG9jYXRpb24gc3RpbGwgcGVuZGluZy4KKwkJCQkJCSAgICAqIFNldHMgRVhURU5UX1VOS05PV04uICovCisjZGVmaW5lIEZJRU1BUF9FWFRFTlRfRU5DT0RFRAkJMHgwMDAwMDAwOCAvKiBEYXRhIGNhbiBub3QgYmUgcmVhZAorCQkJCQkJICAgICogd2hpbGUgZnMgaXMgdW5tb3VudGVkICovCisjZGVmaW5lIEZJRU1BUF9FWFRFTlRfREFUQV9FTkNSWVBURUQJMHgwMDAwMDA4MCAvKiBEYXRhIGlzIGVuY3J5cHRlZCBieSBmcy4KKwkJCQkJCSAgICAqIFNldHMgRVhURU5UX05PX0JZUEFTUy4gKi8KKyNkZWZpbmUgRklFTUFQX0VYVEVOVF9OT1RfQUxJR05FRAkweDAwMDAwMTAwIC8qIEV4dGVudCBvZmZzZXRzIG1heSBub3QgYmUKKwkJCQkJCSAgICAqIGJsb2NrIGFsaWduZWQuICovCisjZGVmaW5lIEZJRU1BUF9FWFRFTlRfREFUQV9JTkxJTkUJMHgwMDAwMDIwMCAvKiBEYXRhIG1peGVkIHdpdGggbWV0YWRhdGEuCisJCQkJCQkgICAgKiBTZXRzIEVYVEVOVF9OT1RfQUxJR05FRC4qLworI2RlZmluZSBGSUVNQVBfRVhURU5UX0RBVEFfVEFJTAkJMHgwMDAwMDQwMCAvKiBNdWx0aXBsZSBmaWxlcyBpbiBibG9jay4KKwkJCQkJCSAgICAqIFNldHMgRVhURU5UX05PVF9BTElHTkVELiovCisjZGVmaW5lIEZJRU1BUF9FWFRFTlRfVU5XUklUVEVOCQkweDAwMDAwODAwIC8qIFNwYWNlIGFsbG9jYXRlZCwgYnV0CisJCQkJCQkgICAgKiBubyBkYXRhIChpLmUuIHplcm8pLiAqLworI2RlZmluZSBGSUVNQVBfRVhURU5UX01FUkdFRAkJMHgwMDAwMTAwMCAvKiBGaWxlIGRvZXMgbm90IG5hdGl2ZWx5CisJCQkJCQkgICAgKiBzdXBwb3J0IGV4dGVudHMuIFJlc3VsdAorCQkJCQkJICAgICogbWVyZ2VkIGZvciBlZmZpY2llbmN5LiAqLworI2RlZmluZSBGSUVNQVBfRVhURU5UX1NIQVJFRAkJMHgwMDAwMjAwMCAvKiBTcGFjZSBzaGFyZWQgd2l0aCBvdGhlcgorCQkJCQkJICAgICogZmlsZXMuICovCisKKyNlbmRpZiAvKiBfTElOVVhfRklFTUFQX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmlsdGVyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOWUwMjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogTGludXggU29ja2V0IEZpbHRlciBEYXRhIFN0cnVjdHVyZXMKKyAqLworCisjaWZuZGVmIF9fTElOVVhfRklMVEVSX0hfXworI2RlZmluZSBfX0xJTlVYX0ZJTFRFUl9IX18KKworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworCisvKgorICogQ3VycmVudCB2ZXJzaW9uIG9mIHRoZSBmaWx0ZXIgY29kZSBhcmNoaXRlY3R1cmUuCisgKi8KKyNkZWZpbmUgQlBGX01BSk9SX1ZFUlNJT04gMQorI2RlZmluZSBCUEZfTUlOT1JfVkVSU0lPTiAxCisKKy8qCisgKglUcnkgYW5kIGtlZXAgdGhlc2UgdmFsdWVzIGFuZCBzdHJ1Y3R1cmVzIHNpbWlsYXIgdG8gQlNELCBlc3BlY2lhbGx5CisgKgl0aGUgQlBGIGNvZGUgZGVmaW5pdGlvbnMgd2hpY2ggbmVlZCB0byBtYXRjaCBzbyB5b3UgY2FuIHNoYXJlIGZpbHRlcnMKKyAqLworIAorc3RydWN0IHNvY2tfZmlsdGVyIHsJLyogRmlsdGVyIGJsb2NrICovCisJX191MTYJY29kZTsgICAvKiBBY3R1YWwgZmlsdGVyIGNvZGUgKi8KKwlfX3U4CWp0OwkvKiBKdW1wIHRydWUgKi8KKwlfX3U4CWpmOwkvKiBKdW1wIGZhbHNlICovCisJX191MzIJazsgICAgICAvKiBHZW5lcmljIG11bHRpdXNlIGZpZWxkICovCit9OworCitzdHJ1Y3Qgc29ja19mcHJvZyB7CS8qIFJlcXVpcmVkIGZvciBTT19BVFRBQ0hfRklMVEVSLiAqLworCXVuc2lnbmVkIHNob3J0CQlsZW47CS8qIE51bWJlciBvZiBmaWx0ZXIgYmxvY2tzICovCisJc3RydWN0IHNvY2tfZmlsdGVyICpmaWx0ZXI7Cit9OworCisvKgorICogSW5zdHJ1Y3Rpb24gY2xhc3NlcworICovCisKKyNkZWZpbmUgQlBGX0NMQVNTKGNvZGUpICgoY29kZSkgJiAweDA3KQorI2RlZmluZSAgICAgICAgIEJQRl9MRCAgICAgICAgICAweDAwCisjZGVmaW5lICAgICAgICAgQlBGX0xEWCAgICAgICAgIDB4MDEKKyNkZWZpbmUgICAgICAgICBCUEZfU1QgICAgICAgICAgMHgwMgorI2RlZmluZSAgICAgICAgIEJQRl9TVFggICAgICAgICAweDAzCisjZGVmaW5lICAgICAgICAgQlBGX0FMVSAgICAgICAgIDB4MDQKKyNkZWZpbmUgICAgICAgICBCUEZfSk1QICAgICAgICAgMHgwNQorI2RlZmluZSAgICAgICAgIEJQRl9SRVQgICAgICAgICAweDA2CisjZGVmaW5lICAgICAgICAgQlBGX01JU0MgICAgICAgIDB4MDcKKworLyogbGQvbGR4IGZpZWxkcyAqLworI2RlZmluZSBCUEZfU0laRShjb2RlKSAgKChjb2RlKSAmIDB4MTgpCisjZGVmaW5lICAgICAgICAgQlBGX1cgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgICAgICAgICBCUEZfSCAgICAgICAgICAgMHgwOAorI2RlZmluZSAgICAgICAgIEJQRl9CICAgICAgICAgICAweDEwCisjZGVmaW5lIEJQRl9NT0RFKGNvZGUpICAoKGNvZGUpICYgMHhlMCkKKyNkZWZpbmUgICAgICAgICBCUEZfSU1NICAgICAgICAgMHgwMAorI2RlZmluZSAgICAgICAgIEJQRl9BQlMgICAgICAgICAweDIwCisjZGVmaW5lICAgICAgICAgQlBGX0lORCAgICAgICAgIDB4NDAKKyNkZWZpbmUgICAgICAgICBCUEZfTUVNICAgICAgICAgMHg2MAorI2RlZmluZSAgICAgICAgIEJQRl9MRU4gICAgICAgICAweDgwCisjZGVmaW5lICAgICAgICAgQlBGX01TSCAgICAgICAgIDB4YTAKKworLyogYWx1L2ptcCBmaWVsZHMgKi8KKyNkZWZpbmUgQlBGX09QKGNvZGUpICAgICgoY29kZSkgJiAweGYwKQorI2RlZmluZSAgICAgICAgIEJQRl9BREQgICAgICAgICAweDAwCisjZGVmaW5lICAgICAgICAgQlBGX1NVQiAgICAgICAgIDB4MTAKKyNkZWZpbmUgICAgICAgICBCUEZfTVVMICAgICAgICAgMHgyMAorI2RlZmluZSAgICAgICAgIEJQRl9ESVYgICAgICAgICAweDMwCisjZGVmaW5lICAgICAgICAgQlBGX09SICAgICAgICAgIDB4NDAKKyNkZWZpbmUgICAgICAgICBCUEZfQU5EICAgICAgICAgMHg1MAorI2RlZmluZSAgICAgICAgIEJQRl9MU0ggICAgICAgICAweDYwCisjZGVmaW5lICAgICAgICAgQlBGX1JTSCAgICAgICAgIDB4NzAKKyNkZWZpbmUgICAgICAgICBCUEZfTkVHICAgICAgICAgMHg4MAorI2RlZmluZSAgICAgICAgIEJQRl9KQSAgICAgICAgICAweDAwCisjZGVmaW5lICAgICAgICAgQlBGX0pFUSAgICAgICAgIDB4MTAKKyNkZWZpbmUgICAgICAgICBCUEZfSkdUICAgICAgICAgMHgyMAorI2RlZmluZSAgICAgICAgIEJQRl9KR0UgICAgICAgICAweDMwCisjZGVmaW5lICAgICAgICAgQlBGX0pTRVQgICAgICAgIDB4NDAKKyNkZWZpbmUgQlBGX1NSQyhjb2RlKSAgICgoY29kZSkgJiAweDA4KQorI2RlZmluZSAgICAgICAgIEJQRl9LICAgICAgICAgICAweDAwCisjZGVmaW5lICAgICAgICAgQlBGX1ggICAgICAgICAgIDB4MDgKKworLyogcmV0IC0gQlBGX0sgYW5kIEJQRl9YIGFsc28gYXBwbHkgKi8KKyNkZWZpbmUgQlBGX1JWQUwoY29kZSkgICgoY29kZSkgJiAweDE4KQorI2RlZmluZSAgICAgICAgIEJQRl9BICAgICAgICAgICAweDEwCisKKy8qIG1pc2MgKi8KKyNkZWZpbmUgQlBGX01JU0NPUChjb2RlKSAoKGNvZGUpICYgMHhmOCkKKyNkZWZpbmUgICAgICAgICBCUEZfVEFYICAgICAgICAgMHgwMAorI2RlZmluZSAgICAgICAgIEJQRl9UWEEgICAgICAgICAweDgwCisKKyNpZm5kZWYgQlBGX01BWElOU05TCisjZGVmaW5lIEJQRl9NQVhJTlNOUyA0MDk2CisjZW5kaWYKKworLyoKKyAqIE1hY3JvcyBmb3IgZmlsdGVyIGJsb2NrIGFycmF5IGluaXRpYWxpemVycy4KKyAqLworI2lmbmRlZiBCUEZfU1RNVAorI2RlZmluZSBCUEZfU1RNVChjb2RlLCBrKSB7ICh1bnNpZ25lZCBzaG9ydCkoY29kZSksIDAsIDAsIGsgfQorI2VuZGlmCisjaWZuZGVmIEJQRl9KVU1QCisjZGVmaW5lIEJQRl9KVU1QKGNvZGUsIGssIGp0LCBqZikgeyAodW5zaWduZWQgc2hvcnQpKGNvZGUpLCBqdCwgamYsIGsgfQorI2VuZGlmCisKKy8qCisgKiBOdW1iZXIgb2Ygc2NyYXRjaCBtZW1vcnkgd29yZHMgZm9yOiBCUEZfU1QgYW5kIEJQRl9TVFgKKyAqLworI2RlZmluZSBCUEZfTUVNV09SRFMgMTYKKworLyogUkFUSU9OQUxFLiBOZWdhdGl2ZSBvZmZzZXRzIGFyZSBpbnZhbGlkIGluIEJQRi4KKyAgIFdlIHVzZSB0aGVtIHRvIHJlZmVyZW5jZSBhbmNpbGxhcnkgZGF0YS4KKyAgIFVubGlrZSBpbnRyb2R1Y3Rpb24gbmV3IGluc3RydWN0aW9ucywgaXQgZG9lcyBub3QgYnJlYWsKKyAgIGV4aXN0aW5nIGNvbXBpbGVycy9vcHRpbWl6ZXJzLgorICovCisjZGVmaW5lIFNLRl9BRF9PRkYgICAgKC0weDEwMDApCisjZGVmaW5lIFNLRl9BRF9QUk9UT0NPTCAwCisjZGVmaW5lIFNLRl9BRF9QS1RUWVBFIAk0CisjZGVmaW5lIFNLRl9BRF9JRklOREVYIAk4CisjZGVmaW5lIFNLRl9BRF9OTEFUVFIJMTIKKyNkZWZpbmUgU0tGX0FEX05MQVRUUl9ORVNUCTE2CisjZGVmaW5lIFNLRl9BRF9NQVJLIAkyMAorI2RlZmluZSBTS0ZfQURfUVVFVUUJMjQKKyNkZWZpbmUgU0tGX0FEX0hBVFlQRQkyOAorI2RlZmluZSBTS0ZfQURfUlhIQVNICTMyCisjZGVmaW5lIFNLRl9BRF9DUFUJMzYKKyNkZWZpbmUgU0tGX0FEX01BWAk0MAorI2RlZmluZSBTS0ZfTkVUX09GRiAgICgtMHgxMDAwMDApCisjZGVmaW5lIFNLRl9MTF9PRkYgICAgKC0weDIwMDAwMCkKKworCisjZW5kaWYgLyogX19MSU5VWF9GSUxURVJfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZpcmV3aXJlLWNkZXYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmlyZXdpcmUtY2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1N2RiZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZpcmV3aXJlLWNkZXYuaApAQCAtMCwwICsxLDEwMTAgQEAKKy8qCisgKiBDaGFyIGRldmljZSBpbnRlcmZhY2UuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgIEtyaXN0aWFuIEhvZWdzYmVyZyA8a3JoQGJpdHBsYW5ldC5uZXQ+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0ZJUkVXSVJFX0NERVZfSAorI2RlZmluZSBfTElOVVhfRklSRVdJUkVfQ0RFVl9ICisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmlyZXdpcmUtY29uc3RhbnRzLmg+CisKKy8qIGF2YWlsYWJsZSBzaW5jZSBrZXJuZWwgdmVyc2lvbiAyLjYuMjIgKi8KKyNkZWZpbmUgRldfQ0RFVl9FVkVOVF9CVVNfUkVTRVQJCQkJMHgwMAorI2RlZmluZSBGV19DREVWX0VWRU5UX1JFU1BPTlNFCQkJCTB4MDEKKyNkZWZpbmUgRldfQ0RFVl9FVkVOVF9SRVFVRVNUCQkJCTB4MDIKKyNkZWZpbmUgRldfQ0RFVl9FVkVOVF9JU09fSU5URVJSVVBUCQkJMHgwMworCisvKiBhdmFpbGFibGUgc2luY2Uga2VybmVsIHZlcnNpb24gMi42LjMwICovCisjZGVmaW5lIEZXX0NERVZfRVZFTlRfSVNPX1JFU09VUkNFX0FMTE9DQVRFRAkJMHgwNAorI2RlZmluZSBGV19DREVWX0VWRU5UX0lTT19SRVNPVVJDRV9ERUFMTE9DQVRFRAkJMHgwNQorCisvKiBhdmFpbGFibGUgc2luY2Uga2VybmVsIHZlcnNpb24gMi42LjM2ICovCisjZGVmaW5lIEZXX0NERVZfRVZFTlRfUkVRVUVTVDIJCQkJMHgwNgorI2RlZmluZSBGV19DREVWX0VWRU5UX1BIWV9QQUNLRVRfU0VOVAkJCTB4MDcKKyNkZWZpbmUgRldfQ0RFVl9FVkVOVF9QSFlfUEFDS0VUX1JFQ0VJVkVECQkweDA4CisjZGVmaW5lIEZXX0NERVZfRVZFTlRfSVNPX0lOVEVSUlVQVF9NVUxUSUNIQU5ORUwJMHgwOQorCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X2V2ZW50X2NvbW1vbiAtIENvbW1vbiBwYXJ0IG9mIGFsbCBmd19jZGV2X2V2ZW50XyB0eXBlcworICogQGNsb3N1cmU6CUZvciBhcmJpdHJhcnkgdXNlIGJ5IHVzZXJzcGFjZQorICogQHR5cGU6CURpc2NyaW1pbmF0ZXMgdGhlIGZ3X2NkZXZfZXZlbnRfIHR5cGVzCisgKgorICogVGhpcyBzdHJ1Y3QgbWF5IGJlIHVzZWQgdG8gYWNjZXNzIGdlbmVyaWMgbWVtYmVycyBvZiBhbGwgZndfY2Rldl9ldmVudF8KKyAqIHR5cGVzIHJlZ2FyZGxlc3Mgb2YgdGhlIHNwZWNpZmljIHR5cGUuCisgKgorICogRGF0YSBwYXNzZWQgaW4gdGhlIEBjbG9zdXJlIGZpZWxkIGZvciBhIHJlcXVlc3Qgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgZXZlbnQuICBJdCBpcyBiaWcgZW5vdWdoIHRvIGhvbGQgYSBwb2ludGVyIG9uIGFsbCBwbGF0Zm9ybXMuCisgKiBUaGUgaW9jdGwgdXNlZCB0byBzZXQgQGNsb3N1cmUgZGVwZW5kcyBvbiB0aGUgQHR5cGUgb2YgZXZlbnQuCisgKi8KK3N0cnVjdCBmd19jZGV2X2V2ZW50X2NvbW1vbiB7CisJX191NjQgY2xvc3VyZTsKKwlfX3UzMiB0eXBlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9ldmVudF9idXNfcmVzZXQgLSBTZW50IHdoZW4gYSBidXMgcmVzZXQgb2NjdXJyZWQKKyAqIEBjbG9zdXJlOglTZWUgJmZ3X2NkZXZfZXZlbnRfY29tbW9uOyBzZXQgYnkgJUZXX0NERVZfSU9DX0dFVF9JTkZPIGlvY3RsCisgKiBAdHlwZToJU2VlICZmd19jZGV2X2V2ZW50X2NvbW1vbjsgYWx3YXlzICVGV19DREVWX0VWRU5UX0JVU19SRVNFVAorICogQG5vZGVfaWQ6ICAgICAgIE5ldyBub2RlIElEIG9mIHRoaXMgbm9kZQorICogQGxvY2FsX25vZGVfaWQ6IE5vZGUgSUQgb2YgdGhlIGxvY2FsIG5vZGUsIGkuZS4gb2YgdGhlIGNvbnRyb2xsZXIKKyAqIEBibV9ub2RlX2lkOiAgICBOb2RlIElEIG9mIHRoZSBidXMgbWFuYWdlcgorICogQGlybV9ub2RlX2lkOiAgIE5vZGUgSUQgb2YgdGhlIGlzbyByZXNvdXJjZSBtYW5hZ2VyCisgKiBAcm9vdF9ub2RlX2lkOiAgTm9kZSBJRCBvZiB0aGUgcm9vdCBub2RlCisgKiBAZ2VuZXJhdGlvbjogICAgTmV3IGJ1cyBnZW5lcmF0aW9uCisgKgorICogVGhpcyBldmVudCBpcyBzZW50IHdoZW4gdGhlIGJ1cyB0aGUgZGV2aWNlIGJlbG9uZ3MgdG8gZ29lcyB0aHJvdWdoIGEgYnVzCisgKiByZXNldC4gIEl0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuZXcgYnVzIGNvbmZpZ3VyYXRpb24sIHN1Y2ggYXMKKyAqIG5ldyBub2RlIElEIGZvciB0aGlzIGRldmljZSwgbmV3IHJvb3QgSUQsIGFuZCBvdGhlcnMuCisgKgorICogSWYgQGJtX25vZGVfaWQgaXMgMHhmZmZmIHJpZ2h0IGFmdGVyIGJ1cyByZXNldCBpdCBjYW4gYmUgcmVyZWFkIGJ5IGFuCisgKiAlRldfQ0RFVl9JT0NfR0VUX0lORk8gaW9jdGwgYWZ0ZXIgYnVzIG1hbmFnZXIgc2VsZWN0aW9uIHdhcyBmaW5pc2hlZC4KKyAqIEtlcm5lbHMgd2l0aCBBQkkgdmVyc2lvbiA8IDQgZG8gbm90IHNldCBAYm1fbm9kZV9pZC4KKyAqLworc3RydWN0IGZ3X2NkZXZfZXZlbnRfYnVzX3Jlc2V0IHsKKwlfX3U2NCBjbG9zdXJlOworCV9fdTMyIHR5cGU7CisJX191MzIgbm9kZV9pZDsKKwlfX3UzMiBsb2NhbF9ub2RlX2lkOworCV9fdTMyIGJtX25vZGVfaWQ7CisJX191MzIgaXJtX25vZGVfaWQ7CisJX191MzIgcm9vdF9ub2RlX2lkOworCV9fdTMyIGdlbmVyYXRpb247Cit9OworCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X2V2ZW50X3Jlc3BvbnNlIC0gU2VudCB3aGVuIGEgcmVzcG9uc2UgcGFja2V0IHdhcyByZWNlaXZlZAorICogQGNsb3N1cmU6CVNlZSAmZndfY2Rldl9ldmVudF9jb21tb247IHNldCBieSAlRldfQ0RFVl9JT0NfU0VORF9SRVFVRVNUCisgKgkJb3IgJUZXX0NERVZfSU9DX1NFTkRfQlJPQURDQVNUX1JFUVVFU1QKKyAqCQlvciAlRldfQ0RFVl9JT0NfU0VORF9TVFJFQU1fUEFDS0VUIGlvY3RsCisgKiBAdHlwZToJU2VlICZmd19jZGV2X2V2ZW50X2NvbW1vbjsgYWx3YXlzICVGV19DREVWX0VWRU5UX1JFU1BPTlNFCisgKiBAcmNvZGU6CVJlc3BvbnNlIGNvZGUgcmV0dXJuZWQgYnkgdGhlIHJlbW90ZSBub2RlCisgKiBAbGVuZ3RoOglEYXRhIGxlbmd0aCwgaS5lLiB0aGUgcmVzcG9uc2UncyBwYXlsb2FkIHNpemUgaW4gYnl0ZXMKKyAqIEBkYXRhOglQYXlsb2FkIGRhdGEsIGlmIGFueQorICoKKyAqIFRoaXMgZXZlbnQgaXMgc2VudCB3aGVuIHRoZSBzdGFjayByZWNlaXZlcyBhIHJlc3BvbnNlIHRvIGFuIG91dGdvaW5nIHJlcXVlc3QKKyAqIHNlbnQgYnkgJUZXX0NERVZfSU9DX1NFTkRfUkVRVUVTVCBpb2N0bC4gIFRoZSBwYXlsb2FkIGRhdGEgZm9yIHJlc3BvbnNlcworICogY2FycnlpbmcgZGF0YSAocmVhZCBhbmQgbG9jayByZXNwb25zZXMpIGZvbGxvd3MgaW1tZWRpYXRlbHkgYW5kIGNhbiBiZQorICogYWNjZXNzZWQgdGhyb3VnaCB0aGUgQGRhdGEgZmllbGQuCisgKgorICogVGhlIGV2ZW50IGlzIGFsc28gZ2VuZXJhdGVkIGFmdGVyIGNvbmNsdXNpb25zIG9mIHRyYW5zYWN0aW9ucyB0aGF0IGRvIG5vdAorICogaW52b2x2ZSByZXNwb25zZSBwYWNrZXRzLiAgVGhpcyBpbmNsdWRlcyB1bmlmaWVkIHdyaXRlIHRyYW5zYWN0aW9ucywKKyAqIGJyb2FkY2FzdCB3cml0ZSB0cmFuc2FjdGlvbnMsIGFuZCB0cmFuc21pc3Npb24gb2YgYXN5bmNocm9ub3VzIHN0cmVhbQorICogcGFja2V0cy4gIEByY29kZSBpbmRpY2F0ZXMgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHN1Y2ggdHJhbnNtaXNzaW9ucy4KKyAqLworc3RydWN0IGZ3X2NkZXZfZXZlbnRfcmVzcG9uc2UgeworCV9fdTY0IGNsb3N1cmU7CisJX191MzIgdHlwZTsKKwlfX3UzMiByY29kZTsKKwlfX3UzMiBsZW5ndGg7CisJX191MzIgZGF0YVswXTsKK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfZXZlbnRfcmVxdWVzdCAtIE9sZCB2ZXJzaW9uIG9mICZmd19jZGV2X2V2ZW50X3JlcXVlc3QyCisgKiBAdHlwZToJU2VlICZmd19jZGV2X2V2ZW50X2NvbW1vbjsgYWx3YXlzICVGV19DREVWX0VWRU5UX1JFUVVFU1QKKyAqCisgKiBUaGlzIGV2ZW50IGlzIHNlbnQgaW5zdGVhZCBvZiAmZndfY2Rldl9ldmVudF9yZXF1ZXN0MiBpZiB0aGUga2VybmVsIG9yCisgKiB0aGUgY2xpZW50IGltcGxlbWVudHMgQUJJIHZlcnNpb24gPD0gMy4gICZmd19jZGV2X2V2ZW50X3JlcXVlc3QgbGFja3MKKyAqIGVzc2VudGlhbCBpbmZvcm1hdGlvbjsgdXNlICZmd19jZGV2X2V2ZW50X3JlcXVlc3QyIGluc3RlYWQuCisgKi8KK3N0cnVjdCBmd19jZGV2X2V2ZW50X3JlcXVlc3QgeworCV9fdTY0IGNsb3N1cmU7CisJX191MzIgdHlwZTsKKwlfX3UzMiB0Y29kZTsKKwlfX3U2NCBvZmZzZXQ7CisJX191MzIgaGFuZGxlOworCV9fdTMyIGxlbmd0aDsKKwlfX3UzMiBkYXRhWzBdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9ldmVudF9yZXF1ZXN0MiAtIFNlbnQgb24gaW5jb21pbmcgcmVxdWVzdCB0byBhbiBhZGRyZXNzIHJlZ2lvbgorICogQGNsb3N1cmU6CVNlZSAmZndfY2Rldl9ldmVudF9jb21tb247IHNldCBieSAlRldfQ0RFVl9JT0NfQUxMT0NBVEUgaW9jdGwKKyAqIEB0eXBlOglTZWUgJmZ3X2NkZXZfZXZlbnRfY29tbW9uOyBhbHdheXMgJUZXX0NERVZfRVZFTlRfUkVRVUVTVDIKKyAqIEB0Y29kZToJVHJhbnNhY3Rpb24gY29kZSBvZiB0aGUgaW5jb21pbmcgcmVxdWVzdAorICogQG9mZnNldDoJVGhlIG9mZnNldCBpbnRvIHRoZSA0OC1iaXQgcGVyLW5vZGUgYWRkcmVzcyBzcGFjZQorICogQHNvdXJjZV9ub2RlX2lkOiBTZW5kZXIgbm9kZSBJRAorICogQGRlc3RpbmF0aW9uX25vZGVfaWQ6IERlc3RpbmF0aW9uIG5vZGUgSUQKKyAqIEBjYXJkOglUaGUgaW5kZXggb2YgdGhlIGNhcmQgZnJvbSB3aGljaCB0aGUgcmVxdWVzdCBjYW1lCisgKiBAZ2VuZXJhdGlvbjoJQnVzIGdlbmVyYXRpb24gaW4gd2hpY2ggdGhlIHJlcXVlc3QgaXMgdmFsaWQKKyAqIEBoYW5kbGU6CVJlZmVyZW5jZSB0byB0aGUga2VybmVsLXNpZGUgcGVuZGluZyByZXF1ZXN0CisgKiBAbGVuZ3RoOglEYXRhIGxlbmd0aCwgaS5lLiB0aGUgcmVxdWVzdCdzIHBheWxvYWQgc2l6ZSBpbiBieXRlcworICogQGRhdGE6CUluY29taW5nIGRhdGEsIGlmIGFueQorICoKKyAqIFRoaXMgZXZlbnQgaXMgc2VudCB3aGVuIHRoZSBzdGFjayByZWNlaXZlcyBhbiBpbmNvbWluZyByZXF1ZXN0IHRvIGFuIGFkZHJlc3MKKyAqIHJlZ2lvbiByZWdpc3RlcmVkIHVzaW5nIHRoZSAlRldfQ0RFVl9JT0NfQUxMT0NBVEUgaW9jdGwuICBUaGUgcmVxdWVzdCBpcworICogZ3VhcmFudGVlZCB0byBiZSBjb21wbGV0ZWx5IGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkIHJlZ2lvbi4gIFVzZXJzcGFjZSBpcworICogcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgdGhlIHJlc3BvbnNlIGJ5ICVGV19DREVWX0lPQ19TRU5EX1JFU1BPTlNFIGlvY3RsLAorICogdXNpbmcgdGhlIHNhbWUgQGhhbmRsZS4KKyAqCisgKiBUaGUgcGF5bG9hZCBkYXRhIGZvciByZXF1ZXN0cyBjYXJyeWluZyBkYXRhICh3cml0ZSBhbmQgbG9jayByZXF1ZXN0cykKKyAqIGZvbGxvd3MgaW1tZWRpYXRlbHkgYW5kIGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBAZGF0YSBmaWVsZC4KKyAqCisgKiBVbmxpa2UgJmZ3X2NkZXZfZXZlbnRfcmVxdWVzdCwgQHRjb2RlIG9mIGxvY2sgcmVxdWVzdHMgaXMgb25lIG9mIHRoZQorICogZmlyZXdpcmUtY29yZSBzcGVjaWZpYyAlVENPREVfTE9DS19NQVNLX1NXQVAuLi4lVENPREVfTE9DS19WRU5ET1JfREVQRU5ERU5ULAorICogaS5lLiBlbmNvZGVzIHRoZSBleHRlbmRlZCB0cmFuc2FjdGlvbiBjb2RlLgorICoKKyAqIEBjYXJkIG1heSBkaWZmZXIgZnJvbSAmZndfY2Rldl9nZXRfaW5mby5jYXJkIGJlY2F1c2UgcmVxdWVzdHMgYXJlIHJlY2VpdmVkCisgKiBmcm9tIGFsbCBjYXJkcyBvZiB0aGUgTGludXggaG9zdC4gIEBzb3VyY2Vfbm9kZV9pZCwgQGRlc3RpbmF0aW9uX25vZGVfaWQsIGFuZAorICogQGdlbmVyYXRpb24gcGVydGFpbiB0byB0aGF0IGNhcmQuICBEZXN0aW5hdGlvbiBub2RlIElEIGFuZCBidXMgZ2VuZXJhdGlvbiBtYXkKKyAqIHRoZXJlZm9yZSBkaWZmZXIgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBmaWVsZHMgb2YgdGhlIGxhc3QKKyAqICZmd19jZGV2X2V2ZW50X2J1c19yZXNldC4KKyAqCisgKiBAZGVzdGluYXRpb25fbm9kZV9pZCBtYXkgYWxzbyBkaWZmZXIgZnJvbSB0aGUgY3VycmVudCBub2RlIElEIGJlY2F1c2Ugb2YgYQorICogbm9uLWxvY2FsIGJ1cyBJRCBwYXJ0IG9yIGluIGNhc2Ugb2YgYSBicm9hZGNhc3Qgd3JpdGUgcmVxdWVzdC4gIE5vdGUsIGEKKyAqIGNsaWVudCBtdXN0IGNhbGwgYW4gJUZXX0NERVZfSU9DX1NFTkRfUkVTUE9OU0UgaW9jdGwgZXZlbiBpbiBjYXNlIG9mIGEKKyAqIGJyb2FkY2FzdCB3cml0ZSByZXF1ZXN0OyB0aGUga2VybmVsIHdpbGwgdGhlbiByZWxlYXNlIHRoZSBrZXJuZWwtc2lkZSBwZW5kaW5nCisgKiByZXF1ZXN0IGJ1dCB3aWxsIG5vdCBhY3R1YWxseSBzZW5kIGEgcmVzcG9uc2UgcGFja2V0LgorICoKKyAqIEluIGNhc2Ugb2YgYSB3cml0ZSByZXF1ZXN0IHRvIEZDUF9SRVFVRVNUIG9yIEZDUF9SRVNQT05TRSwgdGhlIGtlcm5lbCBhbHJlYWR5CisgKiBzZW50IGEgd3JpdGUgcmVzcG9uc2UgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHJlcXVlc3Qgd2FzIHJlY2VpdmVkOyBpbiB0aGlzCisgKiBjYXNlIHRoZSBjbGllbnQgbXVzdCBzdGlsbCBjYWxsIGFuICVGV19DREVWX0lPQ19TRU5EX1JFU1BPTlNFIGlvY3RsIHRvCisgKiByZWxlYXNlIHRoZSBrZXJuZWwtc2lkZSBwZW5kaW5nIHJlcXVlc3QsIHRob3VnaCBhbm90aGVyIHJlc3BvbnNlIHdvbid0IGJlCisgKiBzZW50LgorICoKKyAqIElmIHRoZSBjbGllbnQgc3Vic2VxdWVudGx5IG5lZWRzIHRvIGluaXRpYXRlIHJlcXVlc3RzIHRvIHRoZSBzZW5kZXIgbm9kZSBvZgorICogYW4gJmZ3X2NkZXZfZXZlbnRfcmVxdWVzdDIsIGl0IG5lZWRzIHRvIHVzZSBhIGRldmljZSBmaWxlIHdpdGggbWF0Y2hpbmcKKyAqIGNhcmQgaW5kZXgsIG5vZGUgSUQsIGFuZCBnZW5lcmF0aW9uIGZvciBvdXRib3VuZCByZXF1ZXN0cy4KKyAqLworc3RydWN0IGZ3X2NkZXZfZXZlbnRfcmVxdWVzdDIgeworCV9fdTY0IGNsb3N1cmU7CisJX191MzIgdHlwZTsKKwlfX3UzMiB0Y29kZTsKKwlfX3U2NCBvZmZzZXQ7CisJX191MzIgc291cmNlX25vZGVfaWQ7CisJX191MzIgZGVzdGluYXRpb25fbm9kZV9pZDsKKwlfX3UzMiBjYXJkOworCV9fdTMyIGdlbmVyYXRpb247CisJX191MzIgaGFuZGxlOworCV9fdTMyIGxlbmd0aDsKKwlfX3UzMiBkYXRhWzBdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9ldmVudF9pc29faW50ZXJydXB0IC0gU2VudCB3aGVuIGFuIGlzbyBwYWNrZXQgd2FzIGNvbXBsZXRlZAorICogQGNsb3N1cmU6CVNlZSAmZndfY2Rldl9ldmVudF9jb21tb247CisgKgkJc2V0IGJ5ICVGV19DREVWX0NSRUFURV9JU09fQ09OVEVYVCBpb2N0bAorICogQHR5cGU6CVNlZSAmZndfY2Rldl9ldmVudF9jb21tb247IGFsd2F5cyAlRldfQ0RFVl9FVkVOVF9JU09fSU5URVJSVVBUCisgKiBAY3ljbGU6CUN5Y2xlIGNvdW50ZXIgb2YgdGhlIGludGVycnVwdCBwYWNrZXQKKyAqIEBoZWFkZXJfbGVuZ3RoOiBUb3RhbCBsZW5ndGggb2YgZm9sbG93aW5nIGhlYWRlcnMsIGluIGJ5dGVzCisgKiBAaGVhZGVyOglTdHJpcHBlZCBoZWFkZXJzLCBpZiBhbnkKKyAqCisgKiBUaGlzIGV2ZW50IGlzIHNlbnQgd2hlbiB0aGUgY29udHJvbGxlciBoYXMgY29tcGxldGVkIGFuICZmd19jZGV2X2lzb19wYWNrZXQKKyAqIHdpdGggdGhlICVGV19DREVWX0lTT19JTlRFUlJVUFQgYml0IHNldC4KKyAqCisgKiBJc29jaHJvbm91cyB0cmFuc21pdCBldmVudHMgKGNvbnRleHQgdHlwZSAlRldfQ0RFVl9JU09fQ09OVEVYVF9UUkFOU01JVCk6CisgKgorICogSW4gdmVyc2lvbiAzIGFuZCBzb21lIGltcGxlbWVudGF0aW9ucyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEFCSSwgJmhlYWRlcl9sZW5ndGgKKyAqIGlzIGEgbXVsdGlwbGUgb2YgNCBhbmQgJmhlYWRlciBjb250YWlucyB0aW1lc3RhbXBzIG9mIGFsbCBwYWNrZXRzIHVwIHVudGlsCisgKiB0aGUgaW50ZXJydXB0IHBhY2tldC4gIFRoZSBmb3JtYXQgb2YgdGhlIHRpbWVzdGFtcHMgaXMgYXMgZGVzY3JpYmVkIGJlbG93IGZvcgorICogaXNvY2hyb25vdXMgcmVjZXB0aW9uLiAgSW4gdmVyc2lvbiAxIG9mIHRoZSBBQkksICZoZWFkZXJfbGVuZ3RoIHdhcyAwLgorICoKKyAqIElzb2Nocm9ub3VzIHJlY2VpdmUgZXZlbnRzIChjb250ZXh0IHR5cGUgJUZXX0NERVZfSVNPX0NPTlRFWFRfUkVDRUlWRSk6CisgKgorICogVGhlIGhlYWRlcnMgc3RyaXBwZWQgb2YgYWxsIHBhY2tldHMgdXAgdW50aWwgYW5kIGluY2x1ZGluZyB0aGUgaW50ZXJydXB0CisgKiBwYWNrZXQgYXJlIHJldHVybmVkIGluIHRoZSBAaGVhZGVyIGZpZWxkLiAgVGhlIGFtb3VudCBvZiBoZWFkZXIgZGF0YSBwZXIKKyAqIHBhY2tldCBpcyBhcyBzcGVjaWZpZWQgYXQgaXNvIGNvbnRleHQgY3JlYXRpb24gYnkKKyAqICZmd19jZGV2X2NyZWF0ZV9pc29fY29udGV4dC5oZWFkZXJfc2l6ZS4KKyAqCisgKiBIZW5jZSwgX2ludGVycnVwdC5oZWFkZXJfbGVuZ3RoIC8gX2NvbnRleHQuaGVhZGVyX3NpemUgaXMgdGhlIG51bWJlciBvZgorICogcGFja2V0cyByZWNlaXZlZCBpbiB0aGlzIGludGVycnVwdCBldmVudC4gIFRoZSBjbGllbnQgY2FuIG5vdyBpdGVyYXRlCisgKiB0aHJvdWdoIHRoZSBtbWFwKCknZWQgRE1BIGJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhpcyBudW1iZXIgb2YgcGFja2V0cyBhbmQKKyAqIHRvIHRoZSBidWZmZXIgc2l6ZXMgYXMgdGhlIGNsaWVudCBzcGVjaWZpZWQgaW4gJmZ3X2NkZXZfcXVldWVfaXNvLgorICoKKyAqIFNpbmNlIHZlcnNpb24gMiBvZiB0aGlzIEFCSSwgdGhlIHBvcnRpb24gZm9yIGVhY2ggcGFja2V0IGluIF9pbnRlcnJ1cHQuaGVhZGVyCisgKiBjb25zaXN0cyBvZiB0aGUgMTM5NCBpc29jaHJvbm91cyBwYWNrZXQgaGVhZGVyLCBmb2xsb3dlZCBieSBhIHRpbWVzdGFtcAorICogcXVhZGxldCBpZiAmZndfY2Rldl9jcmVhdGVfaXNvX2NvbnRleHQuaGVhZGVyX3NpemUgPiA0LCBmb2xsb3dlZCBieSBxdWFkbGV0cworICogZnJvbSB0aGUgcGFja2V0IHBheWxvYWQgaWYgJmZ3X2NkZXZfY3JlYXRlX2lzb19jb250ZXh0LmhlYWRlcl9zaXplID4gOC4KKyAqCisgKiBGb3JtYXQgb2YgMTM5NCBpc28gcGFja2V0IGhlYWRlcjogIDE2IGJpdHMgZGF0YV9sZW5ndGgsIDIgYml0cyB0YWcsIDYgYml0cworICogY2hhbm5lbCwgNCBiaXRzIHRjb2RlLCA0IGJpdHMgc3ksIGluIGJpZyBlbmRpYW4gYnl0ZSBvcmRlci4KKyAqIGRhdGFfbGVuZ3RoIGlzIHRoZSBhY3R1YWwgcmVjZWl2ZWQgc2l6ZSBvZiB0aGUgcGFja2V0IHdpdGhvdXQgdGhlIGZvdXIKKyAqIDEzOTQgaXNvIHBhY2tldCBoZWFkZXIgYnl0ZXMuCisgKgorICogRm9ybWF0IG9mIHRpbWVzdGFtcDogIDE2IGJpdHMgaW52YWxpZCwgMyBiaXRzIGN5Y2xlU2Vjb25kcywgMTMgYml0cworICogY3ljbGVDb3VudCwgaW4gYmlnIGVuZGlhbiBieXRlIG9yZGVyLgorICoKKyAqIEluIHZlcnNpb24gMSBvZiB0aGUgQUJJLCBubyB0aW1lc3RhbXAgcXVhZGxldCB3YXMgaW5zZXJ0ZWQ7IGluc3RlYWQsIHBheWxvYWQKKyAqIGRhdGEgZm9sbG93ZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIDEzOTQgaXMgaGVhZGVyIGlmIGhlYWRlcl9zaXplID4gNC4KKyAqIEJlaGF2aW91ciBvZiB2ZXIuIDEgb2YgdGhpcyBBQkkgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSBzaW5jZSBBQkkgdmVyLiAyLgorICovCitzdHJ1Y3QgZndfY2Rldl9ldmVudF9pc29faW50ZXJydXB0IHsKKwlfX3U2NCBjbG9zdXJlOworCV9fdTMyIHR5cGU7CisJX191MzIgY3ljbGU7CisJX191MzIgaGVhZGVyX2xlbmd0aDsKKwlfX3UzMiBoZWFkZXJbMF07Cit9OworCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X2V2ZW50X2lzb19pbnRlcnJ1cHRfbWMgLSBBbiBpc28gYnVmZmVyIGNodW5rIHdhcyBjb21wbGV0ZWQKKyAqIEBjbG9zdXJlOglTZWUgJmZ3X2NkZXZfZXZlbnRfY29tbW9uOworICoJCXNldCBieSAlRldfQ0RFVl9DUkVBVEVfSVNPX0NPTlRFWFQgaW9jdGwKKyAqIEB0eXBlOgklRldfQ0RFVl9FVkVOVF9JU09fSU5URVJSVVBUX01VTFRJQ0hBTk5FTAorICogQGNvbXBsZXRlZDoJT2Zmc2V0IGludG8gdGhlIHJlY2VpdmUgYnVmZmVyOyBkYXRhIGJlZm9yZSB0aGlzIG9mZnNldCBpcyB2YWxpZAorICoKKyAqIFRoaXMgZXZlbnQgaXMgc2VudCBpbiBtdWx0aWNoYW5uZWwgY29udGV4dHMgKGNvbnRleHQgdHlwZQorICogJUZXX0NERVZfSVNPX0NPTlRFWFRfUkVDRUlWRV9NVUxUSUNIQU5ORUwpIGZvciAmZndfY2Rldl9pc29fcGFja2V0IGJ1ZmZlcgorICogY2h1bmtzIHRoYXQgaGF2ZSB0aGUgJUZXX0NERVZfSVNPX0lOVEVSUlVQVCBiaXQgc2V0LiAgV2hldGhlciB0aGlzIGhhcHBlbnMKKyAqIHdoZW4gYSBwYWNrZXQgaXMgY29tcGxldGVkIGFuZC9vciB3aGVuIGEgYnVmZmVyIGNodW5rIGlzIGNvbXBsZXRlZCBkZXBlbmRzCisgKiBvbiB0aGUgaGFyZHdhcmUgaW1wbGVtZW50YXRpb24uCisgKgorICogVGhlIGJ1ZmZlciBpcyBjb250aW51b3VzbHkgZmlsbGVkIHdpdGggdGhlIGZvbGxvd2luZyBkYXRhLCBwZXIgcGFja2V0OgorICogIC0gdGhlIDEzOTQgaXNvIHBhY2tldCBoZWFkZXIgYXMgZGVzY3JpYmVkIGF0ICZmd19jZGV2X2V2ZW50X2lzb19pbnRlcnJ1cHQsCisgKiAgICBidXQgaW4gbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyLAorICogIC0gcGFja2V0IHBheWxvYWQgKGFzIG1hbnkgYnl0ZXMgYXMgc3BlY2lmaWVkIGluIHRoZSBkYXRhX2xlbmd0aCBmaWVsZCBvZgorICogICAgdGhlIDEzOTQgaXNvIHBhY2tldCBoZWFkZXIpIGluIGJpZyBlbmRpYW4gYnl0ZSBvcmRlciwKKyAqICAtIDAuLi4zIHBhZGRpbmcgYnl0ZXMgYXMgbmVlZGVkIHRvIGFsaWduIHRoZSBmb2xsb3dpbmcgdHJhaWxlciBxdWFkbGV0LAorICogIC0gdHJhaWxlciBxdWFkbGV0LCBjb250YWluaW5nIHRoZSByZWNlcHRpb24gdGltZXN0YW1wIGFzIGRlc2NyaWJlZCBhdAorICogICAgJmZ3X2NkZXZfZXZlbnRfaXNvX2ludGVycnVwdCwgYnV0IGluIGxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlci4KKyAqCisgKiBIZW5jZSB0aGUgcGVyLXBhY2tldCBzaXplIGlzIGRhdGFfbGVuZ3RoIChyb3VuZGVkIHVwIHRvIGEgbXVsdGlwbGUgb2YgNCkgKyA4LgorICogV2hlbiBwcm9jZXNzaW5nIHRoZSBkYXRhLCBzdG9wIGJlZm9yZSBhIHBhY2tldCB0aGF0IHdvdWxkIGNyb3NzIHRoZQorICogQGNvbXBsZXRlZCBvZmZzZXQuCisgKgorICogQSBwYWNrZXQgbmVhciB0aGUgZW5kIG9mIGEgYnVmZmVyIGNodW5rIHdpbGwgdHlwaWNhbGx5IHNwaWxsIG92ZXIgaW50byB0aGUKKyAqIG5leHQgcXVldWVkIGJ1ZmZlciBjaHVuay4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2xpZW50IHRvIGNoZWNrCisgKiBmb3IgdGhpcyBjb25kaXRpb24sIGFzc2VtYmxlIGEgYnJva2VuLXVwIHBhY2tldCBmcm9tIGl0cyBwYXJ0cywgYW5kIG5vdCB0bworICogcmUtcXVldWUgYW55IGJ1ZmZlciBjaHVua3MgaW4gd2hpY2ggYXMgeWV0IHVucmVhZCBwYWNrZXQgcGFydHMgcmVzaWRlLgorICovCitzdHJ1Y3QgZndfY2Rldl9ldmVudF9pc29faW50ZXJydXB0X21jIHsKKwlfX3U2NCBjbG9zdXJlOworCV9fdTMyIHR5cGU7CisJX191MzIgY29tcGxldGVkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9ldmVudF9pc29fcmVzb3VyY2UgLSBJc28gcmVzb3VyY2VzIHdlcmUgYWxsb2NhdGVkIG9yIGZyZWVkCisgKiBAY2xvc3VyZToJU2VlICZmd19jZGV2X2V2ZW50X2NvbW1vbjsKKyAqCQlzZXQgYnkgJUZXX0NERVZfSU9DXyhERSlBTExPQ0FURV9JU09fUkVTT1VSQ0UoX09OQ0UpIGlvY3RsCisgKiBAdHlwZToJJUZXX0NERVZfRVZFTlRfSVNPX1JFU09VUkNFX0FMTE9DQVRFRCBvcgorICoJCSVGV19DREVWX0VWRU5UX0lTT19SRVNPVVJDRV9ERUFMTE9DQVRFRAorICogQGhhbmRsZToJUmVmZXJlbmNlIGJ5IHdoaWNoIGFuIGFsbG9jYXRlZCByZXNvdXJjZSBjYW4gYmUgZGVhbGxvY2F0ZWQKKyAqIEBjaGFubmVsOglJc29jaHJvbm91cyBjaGFubmVsIHdoaWNoIHdhcyAoZGUpYWxsb2NhdGVkLCBpZiBhbnkKKyAqIEBiYW5kd2lkdGg6CUJhbmR3aWR0aCBhbGxvY2F0aW9uIHVuaXRzIHdoaWNoIHdlcmUgKGRlKWFsbG9jYXRlZCwgaWYgYW55CisgKgorICogQW4gJUZXX0NERVZfRVZFTlRfSVNPX1JFU09VUkNFX0FMTE9DQVRFRCBldmVudCBpcyBzZW50IGFmdGVyIGFuIGlzb2Nocm9ub3VzCisgKiByZXNvdXJjZSB3YXMgYWxsb2NhdGVkIGF0IHRoZSBJUk0uICBUaGUgY2xpZW50IGhhcyB0byBjaGVjayBAY2hhbm5lbCBhbmQKKyAqIEBiYW5kd2lkdGggZm9yIHdoZXRoZXIgdGhlIGFsbG9jYXRpb24gYWN0dWFsbHkgc3VjY2VlZGVkLgorICoKKyAqIEFuICVGV19DREVWX0VWRU5UX0lTT19SRVNPVVJDRV9ERUFMTE9DQVRFRCBldmVudCBpcyBzZW50IGFmdGVyIGFuIGlzb2Nocm9ub3VzCisgKiByZXNvdXJjZSB3YXMgZGVhbGxvY2F0ZWQgYXQgdGhlIElSTS4gIEl0IGlzIGFsc28gc2VudCB3aGVuIGF1dG9tYXRpYworICogcmVhbGxvY2F0aW9uIGFmdGVyIGEgYnVzIHJlc2V0IGZhaWxlZC4KKyAqCisgKiBAY2hhbm5lbCBpcyA8MCBpZiBubyBjaGFubmVsIHdhcyAoZGUpYWxsb2NhdGVkIG9yIGlmIHJlYWxsb2NhdGlvbiBmYWlsZWQuCisgKiBAYmFuZHdpZHRoIGlzIDAgaWYgbm8gYmFuZHdpZHRoIHdhcyAoZGUpYWxsb2NhdGVkIG9yIGlmIHJlYWxsb2NhdGlvbiBmYWlsZWQuCisgKi8KK3N0cnVjdCBmd19jZGV2X2V2ZW50X2lzb19yZXNvdXJjZSB7CisJX191NjQgY2xvc3VyZTsKKwlfX3UzMiB0eXBlOworCV9fdTMyIGhhbmRsZTsKKwlfX3MzMiBjaGFubmVsOworCV9fczMyIGJhbmR3aWR0aDsKK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfZXZlbnRfcGh5X3BhY2tldCAtIEEgUEhZIHBhY2tldCB3YXMgdHJhbnNtaXR0ZWQgb3IgcmVjZWl2ZWQKKyAqIEBjbG9zdXJlOglTZWUgJmZ3X2NkZXZfZXZlbnRfY29tbW9uOyBzZXQgYnkgJUZXX0NERVZfSU9DX1NFTkRfUEhZX1BBQ0tFVAorICoJCW9yICVGV19DREVWX0lPQ19SRUNFSVZFX1BIWV9QQUNLRVRTIGlvY3RsCisgKiBAdHlwZToJJUZXX0NERVZfRVZFTlRfUEhZX1BBQ0tFVF9TRU5UIG9yICUuLi5fUkVDRUlWRUQKKyAqIEByY29kZToJJVJDT0RFXy4uLiwgaW5kaWNhdGVzIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0cmFuc21pc3Npb24KKyAqIEBsZW5ndGg6CURhdGEgbGVuZ3RoIGluIGJ5dGVzCisgKiBAZGF0YToJSW5jb21pbmcgZGF0YQorICoKKyAqIElmIEB0eXBlIGlzICVGV19DREVWX0VWRU5UX1BIWV9QQUNLRVRfU0VOVCwgQGxlbmd0aCBpcyAwIGFuZCBAZGF0YSBlbXB0eSwKKyAqIGV4Y2VwdCBpbiBjYXNlIG9mIGEgcGluZyBwYWNrZXQ6ICBUaGVuLCBAbGVuZ3RoIGlzIDQsIGFuZCBAZGF0YVswXSBpcyB0aGUKKyAqIHBpbmcgdGltZSBpbiA0OS4xNTJNSHogY2xvY2tzIGlmIEByY29kZSBpcyAlUkNPREVfQ09NUExFVEUuCisgKgorICogSWYgQHR5cGUgaXMgJUZXX0NERVZfRVZFTlRfUEhZX1BBQ0tFVF9SRUNFSVZFRCwgQGxlbmd0aCBpcyA4IGFuZCBAZGF0YQorICogY29uc2lzdHMgb2YgdGhlIHR3byBQSFkgcGFja2V0IHF1YWRsZXRzLCBpbiBob3N0IGJ5dGUgb3JkZXIuCisgKi8KK3N0cnVjdCBmd19jZGV2X2V2ZW50X3BoeV9wYWNrZXQgeworCV9fdTY0IGNsb3N1cmU7CisJX191MzIgdHlwZTsKKwlfX3UzMiByY29kZTsKKwlfX3UzMiBsZW5ndGg7CisJX191MzIgZGF0YVswXTsKK307CisKKy8qKgorICogdW5pb24gZndfY2Rldl9ldmVudCAtIENvbnZlbmllbmNlIHVuaW9uIG9mIGZ3X2NkZXZfZXZlbnRfIHR5cGVzCisgKiBAY29tbW9uOgkJVmFsaWQgZm9yIGFsbCB0eXBlcworICogQGJ1c19yZXNldDoJCVZhbGlkIGlmIEBjb21tb24udHlwZSA9PSAlRldfQ0RFVl9FVkVOVF9CVVNfUkVTRVQKKyAqIEByZXNwb25zZToJCVZhbGlkIGlmIEBjb21tb24udHlwZSA9PSAlRldfQ0RFVl9FVkVOVF9SRVNQT05TRQorICogQHJlcXVlc3Q6CQlWYWxpZCBpZiBAY29tbW9uLnR5cGUgPT0gJUZXX0NERVZfRVZFTlRfUkVRVUVTVAorICogQHJlcXVlc3QyOgkJVmFsaWQgaWYgQGNvbW1vbi50eXBlID09ICVGV19DREVWX0VWRU5UX1JFUVVFU1QyCisgKiBAaXNvX2ludGVycnVwdDoJVmFsaWQgaWYgQGNvbW1vbi50eXBlID09ICVGV19DREVWX0VWRU5UX0lTT19JTlRFUlJVUFQKKyAqIEBpc29faW50ZXJydXB0X21jOglWYWxpZCBpZiBAY29tbW9uLnR5cGUgPT0KKyAqCQkJCSVGV19DREVWX0VWRU5UX0lTT19JTlRFUlJVUFRfTVVMVElDSEFOTkVMCisgKiBAaXNvX3Jlc291cmNlOglWYWxpZCBpZiBAY29tbW9uLnR5cGUgPT0KKyAqCQkJCSVGV19DREVWX0VWRU5UX0lTT19SRVNPVVJDRV9BTExPQ0FURUQgb3IKKyAqCQkJCSVGV19DREVWX0VWRU5UX0lTT19SRVNPVVJDRV9ERUFMTE9DQVRFRAorICogQHBoeV9wYWNrZXQ6CQlWYWxpZCBpZiBAY29tbW9uLnR5cGUgPT0KKyAqCQkJCSVGV19DREVWX0VWRU5UX1BIWV9QQUNLRVRfU0VOVCBvcgorICoJCQkJJUZXX0NERVZfRVZFTlRfUEhZX1BBQ0tFVF9SRUNFSVZFRAorICoKKyAqIENvbnZlbmllbmNlIHVuaW9uIGZvciB1c2Vyc3BhY2UgdXNlLiAgRXZlbnRzIGNvdWxkIGJlIHJlYWQoMikgaW50byBhbgorICogYXBwcm9wcmlhdGVseSBhbGlnbmVkIGNoYXIgYnVmZmVyIGFuZCB0aGVuIGNhc3QgdG8gdGhpcyB1bmlvbiBmb3IgZnVydGhlcgorICogcHJvY2Vzc2luZy4gIE5vdGUgdGhhdCBmb3IgYSByZXF1ZXN0LCByZXNwb25zZSBvciBpc29faW50ZXJydXB0IGV2ZW50LAorICogdGhlIGRhdGFbXSBvciBoZWFkZXJbXSBtYXkgbWFrZSB0aGUgc2l6ZSBvZiB0aGUgZnVsbCBldmVudCBsYXJnZXIgdGhhbgorICogc2l6ZW9mKHVuaW9uIGZ3X2NkZXZfZXZlbnQpLiAgQWxzbyBub3RlIHRoYXQgaWYgeW91IGF0dGVtcHQgdG8gcmVhZCgyKQorICogYW4gZXZlbnQgaW50byBhIGJ1ZmZlciB0aGF0IGlzIG5vdCBsYXJnZSBlbm91Z2ggZm9yIGl0LCB0aGUgZGF0YSB0aGF0IGRvZXMKKyAqIG5vdCBmaXQgd2lsbCBiZSBkaXNjYXJkZWQgc28gdGhhdCB0aGUgbmV4dCByZWFkKDIpIHdpbGwgcmV0dXJuIGEgbmV3IGV2ZW50LgorICovCit1bmlvbiBmd19jZGV2X2V2ZW50IHsKKwlzdHJ1Y3QgZndfY2Rldl9ldmVudF9jb21tb24JCWNvbW1vbjsKKwlzdHJ1Y3QgZndfY2Rldl9ldmVudF9idXNfcmVzZXQJCWJ1c19yZXNldDsKKwlzdHJ1Y3QgZndfY2Rldl9ldmVudF9yZXNwb25zZQkJcmVzcG9uc2U7CisJc3RydWN0IGZ3X2NkZXZfZXZlbnRfcmVxdWVzdAkJcmVxdWVzdDsKKwlzdHJ1Y3QgZndfY2Rldl9ldmVudF9yZXF1ZXN0MgkJcmVxdWVzdDI7CQkvKiBhZGRlZCBpbiAyLjYuMzYgKi8KKwlzdHJ1Y3QgZndfY2Rldl9ldmVudF9pc29faW50ZXJydXB0CWlzb19pbnRlcnJ1cHQ7CisJc3RydWN0IGZ3X2NkZXZfZXZlbnRfaXNvX2ludGVycnVwdF9tYwlpc29faW50ZXJydXB0X21jOwkvKiBhZGRlZCBpbiAyLjYuMzYgKi8KKwlzdHJ1Y3QgZndfY2Rldl9ldmVudF9pc29fcmVzb3VyY2UJaXNvX3Jlc291cmNlOwkJLyogYWRkZWQgaW4gMi42LjMwICovCisJc3RydWN0IGZ3X2NkZXZfZXZlbnRfcGh5X3BhY2tldAkJcGh5X3BhY2tldDsJCS8qIGFkZGVkIGluIDIuNi4zNiAqLworfTsKKworLyogYXZhaWxhYmxlIHNpbmNlIGtlcm5lbCB2ZXJzaW9uIDIuNi4yMiAqLworI2RlZmluZSBGV19DREVWX0lPQ19HRVRfSU5GTyAgICAgICAgICAgX0lPV1IoJyMnLCAweDAwLCBzdHJ1Y3QgZndfY2Rldl9nZXRfaW5mbykKKyNkZWZpbmUgRldfQ0RFVl9JT0NfU0VORF9SRVFVRVNUICAgICAgICBfSU9XKCcjJywgMHgwMSwgc3RydWN0IGZ3X2NkZXZfc2VuZF9yZXF1ZXN0KQorI2RlZmluZSBGV19DREVWX0lPQ19BTExPQ0FURSAgICAgICAgICAgX0lPV1IoJyMnLCAweDAyLCBzdHJ1Y3QgZndfY2Rldl9hbGxvY2F0ZSkKKyNkZWZpbmUgRldfQ0RFVl9JT0NfREVBTExPQ0FURSAgICAgICAgICBfSU9XKCcjJywgMHgwMywgc3RydWN0IGZ3X2NkZXZfZGVhbGxvY2F0ZSkKKyNkZWZpbmUgRldfQ0RFVl9JT0NfU0VORF9SRVNQT05TRSAgICAgICBfSU9XKCcjJywgMHgwNCwgc3RydWN0IGZ3X2NkZXZfc2VuZF9yZXNwb25zZSkKKyNkZWZpbmUgRldfQ0RFVl9JT0NfSU5JVElBVEVfQlVTX1JFU0VUICBfSU9XKCcjJywgMHgwNSwgc3RydWN0IGZ3X2NkZXZfaW5pdGlhdGVfYnVzX3Jlc2V0KQorI2RlZmluZSBGV19DREVWX0lPQ19BRERfREVTQ1JJUFRPUiAgICAgX0lPV1IoJyMnLCAweDA2LCBzdHJ1Y3QgZndfY2Rldl9hZGRfZGVzY3JpcHRvcikKKyNkZWZpbmUgRldfQ0RFVl9JT0NfUkVNT1ZFX0RFU0NSSVBUT1IgICBfSU9XKCcjJywgMHgwNywgc3RydWN0IGZ3X2NkZXZfcmVtb3ZlX2Rlc2NyaXB0b3IpCisjZGVmaW5lIEZXX0NERVZfSU9DX0NSRUFURV9JU09fQ09OVEVYVCBfSU9XUignIycsIDB4MDgsIHN0cnVjdCBmd19jZGV2X2NyZWF0ZV9pc29fY29udGV4dCkKKyNkZWZpbmUgRldfQ0RFVl9JT0NfUVVFVUVfSVNPICAgICAgICAgIF9JT1dSKCcjJywgMHgwOSwgc3RydWN0IGZ3X2NkZXZfcXVldWVfaXNvKQorI2RlZmluZSBGV19DREVWX0lPQ19TVEFSVF9JU08gICAgICAgICAgIF9JT1coJyMnLCAweDBhLCBzdHJ1Y3QgZndfY2Rldl9zdGFydF9pc28pCisjZGVmaW5lIEZXX0NERVZfSU9DX1NUT1BfSVNPICAgICAgICAgICAgX0lPVygnIycsIDB4MGIsIHN0cnVjdCBmd19jZGV2X3N0b3BfaXNvKQorCisvKiBhdmFpbGFibGUgc2luY2Uga2VybmVsIHZlcnNpb24gMi42LjI0ICovCisjZGVmaW5lIEZXX0NERVZfSU9DX0dFVF9DWUNMRV9USU1FUiAgICAgX0lPUignIycsIDB4MGMsIHN0cnVjdCBmd19jZGV2X2dldF9jeWNsZV90aW1lcikKKworLyogYXZhaWxhYmxlIHNpbmNlIGtlcm5lbCB2ZXJzaW9uIDIuNi4zMCAqLworI2RlZmluZSBGV19DREVWX0lPQ19BTExPQ0FURV9JU09fUkVTT1VSQ0UgICAgICAgX0lPV1IoJyMnLCAweDBkLCBzdHJ1Y3QgZndfY2Rldl9hbGxvY2F0ZV9pc29fcmVzb3VyY2UpCisjZGVmaW5lIEZXX0NERVZfSU9DX0RFQUxMT0NBVEVfSVNPX1JFU09VUkNFICAgICAgX0lPVygnIycsIDB4MGUsIHN0cnVjdCBmd19jZGV2X2RlYWxsb2NhdGUpCisjZGVmaW5lIEZXX0NERVZfSU9DX0FMTE9DQVRFX0lTT19SRVNPVVJDRV9PTkNFICAgX0lPVygnIycsIDB4MGYsIHN0cnVjdCBmd19jZGV2X2FsbG9jYXRlX2lzb19yZXNvdXJjZSkKKyNkZWZpbmUgRldfQ0RFVl9JT0NfREVBTExPQ0FURV9JU09fUkVTT1VSQ0VfT05DRSBfSU9XKCcjJywgMHgxMCwgc3RydWN0IGZ3X2NkZXZfYWxsb2NhdGVfaXNvX3Jlc291cmNlKQorI2RlZmluZSBGV19DREVWX0lPQ19HRVRfU1BFRUQgICAgICAgICAgICAgICAgICAgICBfSU8oJyMnLCAweDExKSAvKiByZXR1cm5zIHNwZWVkIGNvZGUgKi8KKyNkZWZpbmUgRldfQ0RFVl9JT0NfU0VORF9CUk9BRENBU1RfUkVRVUVTVCAgICAgICBfSU9XKCcjJywgMHgxMiwgc3RydWN0IGZ3X2NkZXZfc2VuZF9yZXF1ZXN0KQorI2RlZmluZSBGV19DREVWX0lPQ19TRU5EX1NUUkVBTV9QQUNLRVQgICAgICAgICAgIF9JT1coJyMnLCAweDEzLCBzdHJ1Y3QgZndfY2Rldl9zZW5kX3N0cmVhbV9wYWNrZXQpCisKKy8qIGF2YWlsYWJsZSBzaW5jZSBrZXJuZWwgdmVyc2lvbiAyLjYuMzQgKi8KKyNkZWZpbmUgRldfQ0RFVl9JT0NfR0VUX0NZQ0xFX1RJTUVSMiAgIF9JT1dSKCcjJywgMHgxNCwgc3RydWN0IGZ3X2NkZXZfZ2V0X2N5Y2xlX3RpbWVyMikKKworLyogYXZhaWxhYmxlIHNpbmNlIGtlcm5lbCB2ZXJzaW9uIDIuNi4zNiAqLworI2RlZmluZSBGV19DREVWX0lPQ19TRU5EX1BIWV9QQUNLRVQgICAgX0lPV1IoJyMnLCAweDE1LCBzdHJ1Y3QgZndfY2Rldl9zZW5kX3BoeV9wYWNrZXQpCisjZGVmaW5lIEZXX0NERVZfSU9DX1JFQ0VJVkVfUEhZX1BBQ0tFVFMgX0lPVygnIycsIDB4MTYsIHN0cnVjdCBmd19jZGV2X3JlY2VpdmVfcGh5X3BhY2tldHMpCisjZGVmaW5lIEZXX0NERVZfSU9DX1NFVF9JU09fQ0hBTk5FTFMgICAgX0lPVygnIycsIDB4MTcsIHN0cnVjdCBmd19jZGV2X3NldF9pc29fY2hhbm5lbHMpCisKKy8qCisgKiBBQkkgdmVyc2lvbiBoaXN0b3J5CisgKiAgMSAgKDIuNi4yMikgIC0gaW5pdGlhbCB2ZXJzaW9uCisgKiAgICAgKDIuNi4yNCkgIC0gYWRkZWQgJUZXX0NERVZfSU9DX0dFVF9DWUNMRV9USU1FUgorICogIDIgICgyLjYuMzApICAtIGNoYW5nZWQgJmZ3X2NkZXZfZXZlbnRfaXNvX2ludGVycnVwdC5oZWFkZXIgaWYKKyAqICAgICAgICAgICAgICAgICAmZndfY2Rldl9jcmVhdGVfaXNvX2NvbnRleHQuaGVhZGVyX3NpemUgaXMgOCBvciBtb3JlCisgKiAgICAgICAgICAgICAgIC0gYWRkZWQgJUZXX0NERVZfSU9DXypfSVNPX1JFU09VUkNFKiwKKyAqICAgICAgICAgICAgICAgICAlRldfQ0RFVl9JT0NfR0VUX1NQRUVELCAlRldfQ0RFVl9JT0NfU0VORF9CUk9BRENBU1RfUkVRVUVTVCwKKyAqICAgICAgICAgICAgICAgICAlRldfQ0RFVl9JT0NfU0VORF9TVFJFQU1fUEFDS0VUCisgKiAgICAgKDIuNi4zMikgIC0gYWRkZWQgdGltZSBzdGFtcCB0byB4bWl0ICZmd19jZGV2X2V2ZW50X2lzb19pbnRlcnJ1cHQKKyAqICAgICAoMi42LjMzKSAgLSBJUiBoYXMgYWx3YXlzIHBhY2tldC1wZXItYnVmZmVyIHNlbWFudGljcyBub3csIG5vdCBvbmUgb2YKKyAqICAgICAgICAgICAgICAgICBkdWFsLWJ1ZmZlciBvciBwYWNrZXQtcGVyLWJ1ZmZlciBkZXBlbmRpbmcgb24gaGFyZHdhcmUKKyAqICAgICAgICAgICAgICAgLSBzaGFyZWQgdXNlIGFuZCBhdXRvLXJlc3BvbnNlIGZvciBGQ1AgcmVnaXN0ZXJzCisgKiAgMyAgKDIuNi4zNCkgIC0gbWFkZSAmZndfY2Rldl9nZXRfY3ljbGVfdGltZXIgcmVsaWFibGUKKyAqICAgICAgICAgICAgICAgLSBhZGRlZCAlRldfQ0RFVl9JT0NfR0VUX0NZQ0xFX1RJTUVSMgorICogIDQgICgyLjYuMzYpICAtIGFkZGVkICVGV19DREVWX0VWRU5UX1JFUVVFU1QyLCAlRldfQ0RFVl9FVkVOVF9QSFlfUEFDS0VUXyosCisgKiAgICAgICAgICAgICAgICAgYW5kICZmd19jZGV2X2FsbG9jYXRlLnJlZ2lvbl9lbmQKKyAqICAgICAgICAgICAgICAgLSBpbXBsZW1lbnRlZCAmZndfY2Rldl9ldmVudF9idXNfcmVzZXQuYm1fbm9kZV9pZAorICogICAgICAgICAgICAgICAtIGFkZGVkICVGV19DREVWX0lPQ19TRU5EX1BIWV9QQUNLRVQsIF9SRUNFSVZFX1BIWV9QQUNLRVRTCisgKiAgICAgICAgICAgICAgIC0gYWRkZWQgJUZXX0NERVZfRVZFTlRfSVNPX0lOVEVSUlVQVF9NVUxUSUNIQU5ORUwsCisgKiAgICAgICAgICAgICAgICAgJUZXX0NERVZfSVNPX0NPTlRFWFRfUkVDRUlWRV9NVUxUSUNIQU5ORUwsIGFuZAorICogICAgICAgICAgICAgICAgICVGV19DREVWX0lPQ19TRVRfSVNPX0NIQU5ORUxTCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9nZXRfaW5mbyAtIEdlbmVyYWwgcHVycG9zZSBpbmZvcm1hdGlvbiBpb2N0bAorICogQHZlcnNpb246CVRoZSB2ZXJzaW9uIGZpZWxkIGlzIGp1c3QgYSBydW5uaW5nIHNlcmlhbCBudW1iZXIuICBCb3RoIGFuCisgKgkJaW5wdXQgcGFyYW1ldGVyIChBQkkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGUgY2xpZW50KSBhbmQKKyAqCQlvdXRwdXQgcGFyYW1ldGVyIChBQkkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGUga2VybmVsKS4KKyAqCQlBIGNsaWVudCBzaGFsbCBmaWxsIGluIHRoZSBBQkkgQHZlcnNpb24gZm9yIHdoaWNoIHRoZSBjbGllbnQKKyAqCQl3YXMgaW1wbGVtZW50ZWQuICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgZm9yd2FyZCBjb21wYXRpYmlsaXR5LgorICogQHJvbV9sZW5ndGg6CUlmIEByb20gaXMgbm9uLXplcm8sIHVwIHRvIEByb21fbGVuZ3RoIGJ5dGVzIG9mIENvbmZpZ3VyYXRpb24KKyAqCQlST00gd2lsbCBiZSBjb3BpZWQgaW50byB0aGF0IHVzZXIgc3BhY2UgYWRkcmVzcy4gIEluIGVpdGhlcgorICoJCWNhc2UsIEByb21fbGVuZ3RoIGlzIHVwZGF0ZWQgd2l0aCB0aGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUKKyAqCQlDb25maWd1cmF0aW9uIFJPTS4KKyAqIEByb206CUlmIG5vbi16ZXJvLCBhZGRyZXNzIG9mIGEgYnVmZmVyIHRvIGJlIGZpbGxlZCBieSBhIGNvcHkgb2YgdGhlCisgKgkJZGV2aWNlJ3MgQ29uZmlndXJhdGlvbiBST00KKyAqIEBidXNfcmVzZXQ6CUlmIG5vbi16ZXJvLCBhZGRyZXNzIG9mIGEgYnVmZmVyIHRvIGJlIGZpbGxlZCBieSBhCisgKgkJJnN0cnVjdCBmd19jZGV2X2V2ZW50X2J1c19yZXNldCB3aXRoIHRoZSBjdXJyZW50IHN0YXRlCisgKgkJb2YgdGhlIGJ1cy4gIFRoaXMgZG9lcyBub3QgY2F1c2UgYSBidXMgcmVzZXQgdG8gaGFwcGVuLgorICogQGJ1c19yZXNldF9jbG9zdXJlOiBWYWx1ZSBvZiAmY2xvc3VyZSBpbiB0aGlzIGFuZCBzdWJzZXF1ZW50IGJ1cyByZXNldCBldmVudHMKKyAqIEBjYXJkOglUaGUgaW5kZXggb2YgdGhlIGNhcmQgdGhpcyBkZXZpY2UgYmVsb25ncyB0bworICoKKyAqIFRoZSAlRldfQ0RFVl9JT0NfR0VUX0lORk8gaW9jdGwgaXMgdXN1YWxseSB0aGUgdmVyeSBmaXJzdCBvbmUgd2hpY2ggYSBjbGllbnQKKyAqIHBlcmZvcm1zIHJpZ2h0IGFmdGVyIGl0IG9wZW5lZCBhIC9kZXYvZncqIGZpbGUuCisgKgorICogQXMgYSBzaWRlIGVmZmVjdCwgcmVjZXB0aW9uIG9mICVGV19DREVWX0VWRU5UX0JVU19SRVNFVCBldmVudHMgdG8gYmUgcmVhZCgyKQorICogaXMgc3RhcnRlZCBieSB0aGlzIGlvY3RsLgorICovCitzdHJ1Y3QgZndfY2Rldl9nZXRfaW5mbyB7CisJX191MzIgdmVyc2lvbjsKKwlfX3UzMiByb21fbGVuZ3RoOworCV9fdTY0IHJvbTsKKwlfX3U2NCBidXNfcmVzZXQ7CisJX191NjQgYnVzX3Jlc2V0X2Nsb3N1cmU7CisJX191MzIgY2FyZDsKK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfc2VuZF9yZXF1ZXN0IC0gU2VuZCBhbiBhc3luY2hyb25vdXMgcmVxdWVzdCBwYWNrZXQKKyAqIEB0Y29kZToJVHJhbnNhY3Rpb24gY29kZSBvZiB0aGUgcmVxdWVzdAorICogQGxlbmd0aDoJTGVuZ3RoIG9mIG91dGdvaW5nIHBheWxvYWQsIGluIGJ5dGVzCisgKiBAb2Zmc2V0Ogk0OC1iaXQgb2Zmc2V0IGF0IGRlc3RpbmF0aW9uIG5vZGUKKyAqIEBjbG9zdXJlOglQYXNzZWQgYmFjayB0byB1c2Vyc3BhY2UgaW4gdGhlIHJlc3BvbnNlIGV2ZW50CisgKiBAZGF0YToJVXNlcnNwYWNlIHBvaW50ZXIgdG8gcGF5bG9hZAorICogQGdlbmVyYXRpb246CVRoZSBidXMgZ2VuZXJhdGlvbiB3aGVyZSBwYWNrZXQgaXMgdmFsaWQKKyAqCisgKiBTZW5kIGEgcmVxdWVzdCB0byB0aGUgZGV2aWNlLiAgVGhpcyBpb2N0bCBpbXBsZW1lbnRzIGFsbCBvdXRnb2luZyByZXF1ZXN0cy4KKyAqIEJvdGggcXVhZGxldCBhbmQgYmxvY2sgcmVxdWVzdCBzcGVjaWZ5IHRoZSBwYXlsb2FkIGFzIGEgcG9pbnRlciB0byB0aGUgZGF0YQorICogaW4gdGhlIEBkYXRhIGZpZWxkLiAgT25jZSB0aGUgdHJhbnNhY3Rpb24gY29tcGxldGVzLCB0aGUga2VybmVsIHdyaXRlcyBhbgorICogJmZ3X2NkZXZfZXZlbnRfcmVzcG9uc2UgZXZlbnQgYmFjay4gIFRoZSBAY2xvc3VyZSBmaWVsZCBpcyBwYXNzZWQgYmFjayB0bworICogdXNlciBzcGFjZSBpbiB0aGUgcmVzcG9uc2UgZXZlbnQuCisgKi8KK3N0cnVjdCBmd19jZGV2X3NlbmRfcmVxdWVzdCB7CisJX191MzIgdGNvZGU7CisJX191MzIgbGVuZ3RoOworCV9fdTY0IG9mZnNldDsKKwlfX3U2NCBjbG9zdXJlOworCV9fdTY0IGRhdGE7CisJX191MzIgZ2VuZXJhdGlvbjsKK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfc2VuZF9yZXNwb25zZSAtIFNlbmQgYW4gYXN5bmNocm9ub3VzIHJlc3BvbnNlIHBhY2tldAorICogQHJjb2RlOglSZXNwb25zZSBjb2RlIGFzIGRldGVybWluZWQgYnkgdGhlIHVzZXJzcGFjZSBoYW5kbGVyCisgKiBAbGVuZ3RoOglMZW5ndGggb2Ygb3V0Z29pbmcgcGF5bG9hZCwgaW4gYnl0ZXMKKyAqIEBkYXRhOglVc2Vyc3BhY2UgcG9pbnRlciB0byBwYXlsb2FkCisgKiBAaGFuZGxlOglUaGUgaGFuZGxlIGZyb20gdGhlICZmd19jZGV2X2V2ZW50X3JlcXVlc3QKKyAqCisgKiBTZW5kIGEgcmVzcG9uc2UgdG8gYW4gaW5jb21pbmcgcmVxdWVzdC4gIEJ5IHNldHRpbmcgdXAgYW4gYWRkcmVzcyByYW5nZSB1c2luZworICogdGhlICVGV19DREVWX0lPQ19BTExPQ0FURSBpb2N0bCwgdXNlcnNwYWNlIGNhbiBsaXN0ZW4gZm9yIGluY29taW5nIHJlcXVlc3RzLiAgQW4KKyAqIGluY29taW5nIHJlcXVlc3Qgd2lsbCBnZW5lcmF0ZSBhbiAlRldfQ0RFVl9FVkVOVF9SRVFVRVNULCBhbmQgdXNlcnNwYWNlIG11c3QKKyAqIHNlbmQgYSByZXBseSB1c2luZyB0aGlzIGlvY3RsLiAgVGhlIGV2ZW50IGhhcyBhIGhhbmRsZSB0byB0aGUga2VybmVsLXNpZGUKKyAqIHBlbmRpbmcgdHJhbnNhY3Rpb24sIHdoaWNoIHNob3VsZCBiZSB1c2VkIHdpdGggdGhpcyBpb2N0bC4KKyAqLworc3RydWN0IGZ3X2NkZXZfc2VuZF9yZXNwb25zZSB7CisJX191MzIgcmNvZGU7CisJX191MzIgbGVuZ3RoOworCV9fdTY0IGRhdGE7CisJX191MzIgaGFuZGxlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9hbGxvY2F0ZSAtIEFsbG9jYXRlIGEgQ1NSIGluIGFuIGFkZHJlc3MgcmFuZ2UKKyAqIEBvZmZzZXQ6CVN0YXJ0IG9mZnNldCBvZiB0aGUgYWRkcmVzcyByYW5nZQorICogQGNsb3N1cmU6CVRvIGJlIHBhc3NlZCBiYWNrIHRvIHVzZXJzcGFjZSBpbiByZXF1ZXN0IGV2ZW50cworICogQGxlbmd0aDoJTGVuZ3RoIG9mIHRoZSBDU1IsIGluIGJ5dGVzCisgKiBAaGFuZGxlOglIYW5kbGUgdG8gdGhlIGFsbG9jYXRpb24sIHdyaXR0ZW4gYnkgdGhlIGtlcm5lbAorICogQHJlZ2lvbl9lbmQ6CUZpcnN0IGFkZHJlc3MgYWJvdmUgdGhlIGFkZHJlc3MgcmFuZ2UgKGFkZGVkIGluIEFCSSB2NCwgMi42LjM2KQorICoKKyAqIEFsbG9jYXRlIGFuIGFkZHJlc3MgcmFuZ2UgaW4gdGhlIDQ4LWJpdCBhZGRyZXNzIHNwYWNlIG9uIHRoZSBsb2NhbCBub2RlCisgKiAodGhlIGNvbnRyb2xsZXIpLiAgVGhpcyBhbGxvd3MgdXNlcnNwYWNlIHRvIGxpc3RlbiBmb3IgcmVxdWVzdHMgd2l0aCBhbgorICogb2Zmc2V0IHdpdGhpbiB0aGF0IGFkZHJlc3MgcmFuZ2UuICBFdmVyeSB0aW1lIHdoZW4gdGhlIGtlcm5lbCByZWNlaXZlcyBhCisgKiByZXF1ZXN0IHdpdGhpbiB0aGUgcmFuZ2UsIGFuICZmd19jZGV2X2V2ZW50X3JlcXVlc3QyIGV2ZW50IHdpbGwgYmUgZW1pdHRlZC4KKyAqIChJZiB0aGUga2VybmVsIG9yIHRoZSBjbGllbnQgaW1wbGVtZW50cyBBQkkgdmVyc2lvbiA8PSAzLCBhbgorICogJmZ3X2NkZXZfZXZlbnRfcmVxdWVzdCB3aWxsIGJlIGdlbmVyYXRlZCBpbnN0ZWFkLikKKyAqCisgKiBUaGUgQGNsb3N1cmUgZmllbGQgaXMgcGFzc2VkIGJhY2sgdG8gdXNlcnNwYWNlIGluIHRoZXNlIHJlcXVlc3QgZXZlbnRzLgorICogVGhlIEBoYW5kbGUgZmllbGQgaXMgYW4gb3V0IHBhcmFtZXRlciwgcmV0dXJuaW5nIGEgaGFuZGxlIHRvIHRoZSBhbGxvY2F0ZWQKKyAqIHJhbmdlIHRvIGJlIHVzZWQgZm9yIGxhdGVyIGRlYWxsb2NhdGlvbiBvZiB0aGUgcmFuZ2UuCisgKgorICogVGhlIGFkZHJlc3MgcmFuZ2UgaXMgYWxsb2NhdGVkIG9uIGFsbCBsb2NhbCBub2Rlcy4gIFRoZSBhZGRyZXNzIGFsbG9jYXRpb24KKyAqIGlzIGV4Y2x1c2l2ZSBleGNlcHQgZm9yIHRoZSBGQ1AgY29tbWFuZCBhbmQgcmVzcG9uc2UgcmVnaXN0ZXJzLiAgSWYgYW4KKyAqIGV4Y2x1c2l2ZSBhZGRyZXNzIHJlZ2lvbiBpcyBhbHJlYWR5IGluIHVzZSwgdGhlIGlvY3RsIGZhaWxzIHdpdGggZXJybm8gc2V0CisgKiB0byAlRUJVU1kuCisgKgorICogSWYga2VybmVsIGFuZCBjbGllbnQgaW1wbGVtZW50IEFCSSB2ZXJzaW9uID49IDQsIHRoZSBrZXJuZWwgbG9va3MgdXAgYSBmcmVlCisgKiBzcG90IG9mIHNpemUgQGxlbmd0aCBpbnNpZGUgW0BvZmZzZXQuLkByZWdpb25fZW5kKSBhbmQsIGlmIGZvdW5kLCB3cml0ZXMKKyAqIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBuZXcgQ1NSIGJhY2sgaW4gQG9mZnNldC4gIEkuZS4gQG9mZnNldCBpcyBhbgorICogaW4gYW5kIG91dCBwYXJhbWV0ZXIuICBJZiB0aGlzIGF1dG9tYXRpYyBwbGFjZW1lbnQgb2YgYSBDU1IgaW4gYSBiaWdnZXIKKyAqIGFkZHJlc3MgcmFuZ2UgaXMgbm90IGRlc2lyZWQsIHRoZSBjbGllbnQgc2ltcGx5IG5lZWRzIHRvIHNldCBAcmVnaW9uX2VuZAorICogPSBAb2Zmc2V0ICsgQGxlbmd0aC4KKyAqCisgKiBJZiB0aGUga2VybmVsIG9yIHRoZSBjbGllbnQgaW1wbGVtZW50cyBBQkkgdmVyc2lvbiA8PSAzLCBAcmVnaW9uX2VuZCBpcworICogaWdub3JlZCBhbmQgZWZmZWN0aXZlbHkgYXNzdW1lZCB0byBiZSBAb2Zmc2V0ICsgQGxlbmd0aC4KKyAqCisgKiBAcmVnaW9uX2VuZCBpcyBvbmx5IHByZXNlbnQgaW4gYSBrZXJuZWwgaGVhZGVyID49IDIuNi4zNi4gIElmIG5lY2Vzc2FyeSwKKyAqIHRoaXMgY2FuIGZvciBleGFtcGxlIGJlIHRlc3RlZCBieSAjaWZkZWYgRldfQ0RFVl9FVkVOVF9SRVFVRVNUMi4KKyAqLworc3RydWN0IGZ3X2NkZXZfYWxsb2NhdGUgeworCV9fdTY0IG9mZnNldDsKKwlfX3U2NCBjbG9zdXJlOworCV9fdTMyIGxlbmd0aDsKKwlfX3UzMiBoYW5kbGU7CisJX191NjQgcmVnaW9uX2VuZDsJLyogYXZhaWxhYmxlIHNpbmNlIGtlcm5lbCB2ZXJzaW9uIDIuNi4zNiAqLworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9kZWFsbG9jYXRlIC0gRnJlZSBhIENTUiBhZGRyZXNzIHJhbmdlIG9yIGlzb2Nocm9ub3VzIHJlc291cmNlCisgKiBAaGFuZGxlOglIYW5kbGUgdG8gdGhlIGFkZHJlc3MgcmFuZ2Ugb3IgaXNvIHJlc291cmNlLCBhcyByZXR1cm5lZCBieSB0aGUKKyAqCQlrZXJuZWwgd2hlbiB0aGUgcmFuZ2Ugb3IgcmVzb3VyY2Ugd2FzIGFsbG9jYXRlZAorICovCitzdHJ1Y3QgZndfY2Rldl9kZWFsbG9jYXRlIHsKKwlfX3UzMiBoYW5kbGU7Cit9OworCisjZGVmaW5lIEZXX0NERVZfTE9OR19SRVNFVAkwCisjZGVmaW5lIEZXX0NERVZfU0hPUlRfUkVTRVQJMQorCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X2luaXRpYXRlX2J1c19yZXNldCAtIEluaXRpYXRlIGEgYnVzIHJlc2V0CisgKiBAdHlwZToJJUZXX0NERVZfU0hPUlRfUkVTRVQgb3IgJUZXX0NERVZfTE9OR19SRVNFVAorICoKKyAqIEluaXRpYXRlIGEgYnVzIHJlc2V0IGZvciB0aGUgYnVzIHRoaXMgZGV2aWNlIGlzIG9uLiAgVGhlIGJ1cyByZXNldCBjYW4gYmUKKyAqIGVpdGhlciB0aGUgb3JpZ2luYWwgKGxvbmcpIGJ1cyByZXNldCBvciB0aGUgYXJiaXRyYXRlZCAoc2hvcnQpIGJ1cyByZXNldAorICogaW50cm9kdWNlZCBpbiAxMzk0YS0yMDAwLgorICoKKyAqIFRoZSBpb2N0bCByZXR1cm5zIGltbWVkaWF0ZWx5LiAgQSBzdWJzZXF1ZW50ICZmd19jZGV2X2V2ZW50X2J1c19yZXNldAorICogaW5kaWNhdGVzIHdoZW4gdGhlIHJlc2V0IGFjdHVhbGx5IGhhcHBlbmVkLiAgU2luY2UgQUJJIHY0LCB0aGlzIG1heSBiZQorICogY29uc2lkZXJhYmx5IGxhdGVyIHRoYW4gdGhlIGlvY3RsIGJlY2F1c2UgdGhlIGtlcm5lbCBlbnN1cmVzIGEgZ3JhY2UgcGVyaW9kCisgKiBiZXR3ZWVuIHN1YnNlcXVlbnQgYnVzIHJlc2V0cyBhcyBwZXIgSUVFRSAxMzk0IGJ1cyBtYW5hZ2VtZW50IHNwZWNpZmljYXRpb24uCisgKi8KK3N0cnVjdCBmd19jZGV2X2luaXRpYXRlX2J1c19yZXNldCB7CisJX191MzIgdHlwZTsKK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfYWRkX2Rlc2NyaXB0b3IgLSBBZGQgY29udGVudHMgdG8gdGhlIGxvY2FsIG5vZGUncyBjb25maWcgUk9NCisgKiBAaW1tZWRpYXRlOglJZiBub24temVybywgaW1tZWRpYXRlIGtleSB0byBpbnNlcnQgYmVmb3JlIHBvaW50ZXIKKyAqIEBrZXk6CVVwcGVyIDggYml0cyBvZiByb290IGRpcmVjdG9yeSBwb2ludGVyCisgKiBAZGF0YToJVXNlcnNwYWNlIHBvaW50ZXIgdG8gY29udGVudHMgb2YgZGVzY3JpcHRvciBibG9jaworICogQGxlbmd0aDoJTGVuZ3RoIG9mIGRlc2NyaXB0b3IgYmxvY2sgZGF0YSwgaW4gcXVhZGxldHMKKyAqIEBoYW5kbGU6CUhhbmRsZSB0byB0aGUgZGVzY3JpcHRvciwgd3JpdHRlbiBieSB0aGUga2VybmVsCisgKgorICogQWRkIGEgZGVzY3JpcHRvciBibG9jayBhbmQgb3B0aW9uYWxseSBhIHByZWNlZGluZyBpbW1lZGlhdGUga2V5IHRvIHRoZSBsb2NhbAorICogbm9kZSdzIENvbmZpZ3VyYXRpb24gUk9NLgorICoKKyAqIFRoZSBAa2V5IGZpZWxkIHNwZWNpZmllcyB0aGUgdXBwZXIgOCBiaXRzIG9mIHRoZSBkZXNjcmlwdG9yIHJvb3QgZGlyZWN0b3J5CisgKiBwb2ludGVyIGFuZCB0aGUgQGRhdGEgYW5kIEBsZW5ndGggZmllbGRzIHNwZWNpZnkgdGhlIGNvbnRlbnRzLiBUaGUgQGtleQorICogc2hvdWxkIGJlIG9mIHRoZSBmb3JtIDB4WFgwMDAwMDAuIFRoZSBvZmZzZXQgcGFydCBvZiB0aGUgcm9vdCBkaXJlY3RvcnkgZW50cnkKKyAqIHdpbGwgYmUgZmlsbGVkIGluIGJ5IHRoZSBrZXJuZWwuCisgKgorICogSWYgbm90IDAsIHRoZSBAaW1tZWRpYXRlIGZpZWxkIHNwZWNpZmllcyBhbiBpbW1lZGlhdGUga2V5IHdoaWNoIHdpbGwgYmUKKyAqIGluc2VydGVkIGJlZm9yZSB0aGUgcm9vdCBkaXJlY3RvcnkgcG9pbnRlci4KKyAqCisgKiBAaW1tZWRpYXRlLCBAa2V5LCBhbmQgQGRhdGEgYXJyYXkgZWxlbWVudHMgYXJlIENQVS1lbmRpYW4gcXVhZGxldHMuCisgKgorICogSWYgc3VjY2Vzc2Z1bCwgdGhlIGtlcm5lbCBhZGRzIHRoZSBkZXNjcmlwdG9yIGFuZCB3cml0ZXMgYmFjayBhIEBoYW5kbGUgdG8KKyAqIHRoZSBrZXJuZWwtc2lkZSBvYmplY3QgdG8gYmUgdXNlZCBmb3IgbGF0ZXIgcmVtb3ZhbCBvZiB0aGUgZGVzY3JpcHRvciBibG9jaworICogYW5kIGltbWVkaWF0ZSBrZXkuICBUaGUga2VybmVsIHdpbGwgYWxzbyBnZW5lcmF0ZSBhIGJ1cyByZXNldCB0byBzaWduYWwgdGhlCisgKiBjaGFuZ2Ugb2YgdGhlIENvbmZpZ3VyYXRpb24gUk9NIHRvIG90aGVyIG5vZGVzLgorICoKKyAqIFRoaXMgaW9jdGwgYWZmZWN0cyB0aGUgQ29uZmlndXJhdGlvbiBST01zIG9mIGFsbCBsb2NhbCBub2Rlcy4KKyAqIFRoZSBpb2N0bCBvbmx5IHN1Y2NlZWRzIG9uIGRldmljZSBmaWxlcyB3aGljaCByZXByZXNlbnQgYSBsb2NhbCBub2RlLgorICovCitzdHJ1Y3QgZndfY2Rldl9hZGRfZGVzY3JpcHRvciB7CisJX191MzIgaW1tZWRpYXRlOworCV9fdTMyIGtleTsKKwlfX3U2NCBkYXRhOworCV9fdTMyIGxlbmd0aDsKKwlfX3UzMiBoYW5kbGU7Cit9OworCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X3JlbW92ZV9kZXNjcmlwdG9yIC0gUmVtb3ZlIGNvbnRlbnRzIGZyb20gdGhlIENvbmZpZ3VyYXRpb24gUk9NCisgKiBAaGFuZGxlOglIYW5kbGUgdG8gdGhlIGRlc2NyaXB0b3IsIGFzIHJldHVybmVkIGJ5IHRoZSBrZXJuZWwgd2hlbiB0aGUKKyAqCQlkZXNjcmlwdG9yIHdhcyBhZGRlZAorICoKKyAqIFJlbW92ZSBhIGRlc2NyaXB0b3IgYmxvY2sgYW5kIGFjY29tcGFueWluZyBpbW1lZGlhdGUga2V5IGZyb20gdGhlIGxvY2FsCisgKiBub2RlcycgQ29uZmlndXJhdGlvbiBST01zLiAgVGhlIGtlcm5lbCB3aWxsIGFsc28gZ2VuZXJhdGUgYSBidXMgcmVzZXQgdG8KKyAqIHNpZ25hbCB0aGUgY2hhbmdlIG9mIHRoZSBDb25maWd1cmF0aW9uIFJPTSB0byBvdGhlciBub2Rlcy4KKyAqLworc3RydWN0IGZ3X2NkZXZfcmVtb3ZlX2Rlc2NyaXB0b3IgeworCV9fdTMyIGhhbmRsZTsKK307CisKKyNkZWZpbmUgRldfQ0RFVl9JU09fQ09OVEVYVF9UUkFOU01JVAkJCTAKKyNkZWZpbmUgRldfQ0RFVl9JU09fQ09OVEVYVF9SRUNFSVZFCQkJMQorI2RlZmluZSBGV19DREVWX0lTT19DT05URVhUX1JFQ0VJVkVfTVVMVElDSEFOTkVMCTIgLyogYWRkZWQgaW4gMi42LjM2ICovCisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfY3JlYXRlX2lzb19jb250ZXh0IC0gQ3JlYXRlIGEgY29udGV4dCBmb3IgaXNvY2hyb25vdXMgSS9PCisgKiBAdHlwZToJJUZXX0NERVZfSVNPX0NPTlRFWFRfVFJBTlNNSVQgb3IgJUZXX0NERVZfSVNPX0NPTlRFWFRfUkVDRUlWRSBvcgorICoJCSVGV19DREVWX0lTT19DT05URVhUX1JFQ0VJVkVfTVVMVElDSEFOTkVMCisgKiBAaGVhZGVyX3NpemU6IEhlYWRlciBzaXplIHRvIHN0cmlwIGluIHNpbmdsZS1jaGFubmVsIHJlY2VwdGlvbgorICogQGNoYW5uZWw6CUNoYW5uZWwgdG8gYmluZCB0byBpbiBzaW5nbGUtY2hhbm5lbCByZWNlcHRpb24gb3IgdHJhbnNtaXNzaW9uCisgKiBAc3BlZWQ6CVRyYW5zbWlzc2lvbiBzcGVlZAorICogQGNsb3N1cmU6CVRvIGJlIHJldHVybmVkIGluICZmd19jZGV2X2V2ZW50X2lzb19pbnRlcnJ1cHQgb3IKKyAqCQkmZndfY2Rldl9ldmVudF9pc29faW50ZXJydXB0X211bHRpY2hhbm5lbAorICogQGhhbmRsZToJSGFuZGxlIHRvIGNvbnRleHQsIHdyaXR0ZW4gYmFjayBieSBrZXJuZWwKKyAqCisgKiBQcmlvciB0byBzZW5kaW5nIG9yIHJlY2VpdmluZyBpc29jaHJvbm91cyBJL08sIGEgY29udGV4dCBtdXN0IGJlIGNyZWF0ZWQuCisgKiBUaGUgY29udGV4dCByZWNvcmRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc21pdCBvciByZWNlaXZlIGNvbmZpZ3VyYXRpb24KKyAqIGFuZCB0eXBpY2FsbHkgbWFwcyB0byBhbiB1bmRlcmx5aW5nIGhhcmR3YXJlIHJlc291cmNlLiAgQSBjb250ZXh0IGlzIHNldCB1cAorICogZm9yIGVpdGhlciBzZW5kaW5nIG9yIHJlY2VpdmluZy4gIEl0IGlzIGJvdW5kIHRvIGEgc3BlY2lmaWMgaXNvY2hyb25vdXMKKyAqIEBjaGFubmVsLgorICoKKyAqIEluIGNhc2Ugb2YgbXVsdGljaGFubmVsIHJlY2VwdGlvbiwgQGhlYWRlcl9zaXplIGFuZCBAY2hhbm5lbCBhcmUgaWdub3JlZAorICogYW5kIHRoZSBjaGFubmVscyBhcmUgc2VsZWN0ZWQgYnkgJUZXX0NERVZfSU9DX1NFVF9JU09fQ0hBTk5FTFMuCisgKgorICogRm9yICVGV19DREVWX0lTT19DT05URVhUX1JFQ0VJVkUgY29udGV4dHMsIEBoZWFkZXJfc2l6ZSBtdXN0IGJlIGF0IGxlYXN0IDQKKyAqIGFuZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gIEl0IGlzIGlnbm9yZWQgaW4gb3RoZXIgY29udGV4dCB0eXBlcy4KKyAqCisgKiBAc3BlZWQgaXMgaWdub3JlZCBpbiByZWNlaXZlIGNvbnRleHQgdHlwZXMuCisgKgorICogSWYgYSBjb250ZXh0IHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCwgdGhlIGtlcm5lbCB3cml0ZXMgYmFjayBhIGhhbmRsZSB0byB0aGUKKyAqIGNvbnRleHQsIHdoaWNoIG11c3QgYmUgcGFzc2VkIGluIGZvciBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgb24gdGhhdCBjb250ZXh0LgorICoKKyAqIExpbWl0YXRpb25zOgorICogTm8gbW9yZSB0aGFuIG9uZSBpc28gY29udGV4dCBjYW4gYmUgY3JlYXRlZCBwZXIgZmQuCisgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGNvbnRleHRzIHRoYXQgYWxsIHVzZXJzcGFjZSBhbmQga2VybmVsc3BhY2UgZHJpdmVycyBjYW4KKyAqIGNyZWF0ZSBvbiBhIGNhcmQgYXQgYSB0aW1lIGlzIGEgaGFyZHdhcmUgbGltaXQsIHR5cGljYWxseSA0IG9yIDggY29udGV4dHMgcGVyCisgKiBkaXJlY3Rpb24sIGFuZCBvZiB0aGVtIGF0IG1vc3Qgb25lIG11bHRpY2hhbm5lbCByZWNlaXZlIGNvbnRleHQuCisgKi8KK3N0cnVjdCBmd19jZGV2X2NyZWF0ZV9pc29fY29udGV4dCB7CisJX191MzIgdHlwZTsKKwlfX3UzMiBoZWFkZXJfc2l6ZTsKKwlfX3UzMiBjaGFubmVsOworCV9fdTMyIHNwZWVkOworCV9fdTY0IGNsb3N1cmU7CisJX191MzIgaGFuZGxlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9zZXRfaXNvX2NoYW5uZWxzIC0gU2VsZWN0IGNoYW5uZWxzIGluIG11bHRpY2hhbm5lbCByZWNlcHRpb24KKyAqIEBjaGFubmVsczoJQml0bWFzayBvZiBjaGFubmVscyB0byBsaXN0ZW4gdG8KKyAqIEBoYW5kbGU6CUhhbmRsZSBvZiB0aGUgbXV0aWNoYW5uZWwgcmVjZWl2ZSBjb250ZXh0CisgKgorICogQGNoYW5uZWxzIGlzIHRoZSBiaXR3aXNlIG9yIG9mIDFVTEwgPDwgbiBmb3IgZWFjaCBjaGFubmVsIG4gdG8gbGlzdGVuIHRvLgorICoKKyAqIFRoZSBpb2N0bCBmYWlscyB3aXRoIGVycm5vICVFQlVTWSBpZiB0aGVyZSBpcyBhbHJlYWR5IGFub3RoZXIgcmVjZWl2ZSBjb250ZXh0CisgKiBvbiBhIGNoYW5uZWwgaW4gQGNoYW5uZWxzLiAgSW4gdGhhdCBjYXNlLCB0aGUgYml0bWFzayBvZiBhbGwgdW5vY2N1cGllZAorICogY2hhbm5lbHMgaXMgcmV0dXJuZWQgaW4gQGNoYW5uZWxzLgorICovCitzdHJ1Y3QgZndfY2Rldl9zZXRfaXNvX2NoYW5uZWxzIHsKKwlfX3U2NCBjaGFubmVsczsKKwlfX3UzMiBoYW5kbGU7Cit9OworCisjZGVmaW5lIEZXX0NERVZfSVNPX1BBWUxPQURfTEVOR1RIKHYpCSh2KQorI2RlZmluZSBGV19DREVWX0lTT19JTlRFUlJVUFQJCSgxIDw8IDE2KQorI2RlZmluZSBGV19DREVWX0lTT19TS0lQCQkoMSA8PCAxNykKKyNkZWZpbmUgRldfQ0RFVl9JU09fU1lOQwkJKDEgPDwgMTcpCisjZGVmaW5lIEZXX0NERVZfSVNPX1RBRyh2KQkJKCh2KSA8PCAxOCkKKyNkZWZpbmUgRldfQ0RFVl9JU09fU1kodikJCSgodikgPDwgMjApCisjZGVmaW5lIEZXX0NERVZfSVNPX0hFQURFUl9MRU5HVEgodikJKCh2KSA8PCAyNCkKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9pc29fcGFja2V0IC0gSXNvY2hyb25vdXMgcGFja2V0CisgKiBAY29udHJvbDoJQ29udGFpbnMgdGhlIGhlYWRlciBsZW5ndGggKDggdXBwZXJtb3N0IGJpdHMpLAorICoJCXRoZSBzeSBmaWVsZCAoNCBiaXRzKSwgdGhlIHRhZyBmaWVsZCAoMiBiaXRzKSwgYSBzeW5jIGZsYWcKKyAqCQlvciBhIHNraXAgZmxhZyAoMSBiaXQpLCBhbiBpbnRlcnJ1cHQgZmxhZyAoMSBiaXQpLCBhbmQgdGhlCisgKgkJcGF5bG9hZCBsZW5ndGggKDE2IGxvd2VybW9zdCBiaXRzKQorICogQGhlYWRlcjoJSGVhZGVyIGFuZCBwYXlsb2FkIGluIGNhc2Ugb2YgYSB0cmFuc21pdCBjb250ZXh0LgorICoKKyAqICZzdHJ1Y3QgZndfY2Rldl9pc29fcGFja2V0IGlzIHVzZWQgdG8gZGVzY3JpYmUgaXNvY2hyb25vdXMgcGFja2V0IHF1ZXVlcy4KKyAqIFVzZSB0aGUgRldfQ0RFVl9JU09fIG1hY3JvcyB0byBmaWxsIGluIEBjb250cm9sLgorICogVGhlIEBoZWFkZXIgYXJyYXkgaXMgZW1wdHkgaW4gY2FzZSBvZiByZWNlaXZlIGNvbnRleHRzLgorICoKKyAqIENvbnRleHQgdHlwZSAlRldfQ0RFVl9JU09fQ09OVEVYVF9UUkFOU01JVDoKKyAqCisgKiBAY29udHJvbC5IRUFERVJfTEVOR1RIIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAgSXQgc3BlY2lmaWVzIHRoZSBudW1iZXJzIG9mCisgKiBieXRlcyBpbiBAaGVhZGVyIHRoYXQgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhlIHBhY2tldCdzIHBheWxvYWQuICBUaGVzZSBieXRlcworICogYXJlIGNvcGllZCBpbnRvIHRoZSBrZXJuZWwgYW5kIHdpbGwgbm90IGJlIGFjY2Vzc2VkIGFmdGVyIHRoZSBpb2N0bCBoYXMKKyAqIHJldHVybmVkLgorICoKKyAqIFRoZSBAY29udHJvbC5TWSBhbmQgVEFHIGZpZWxkcyBhcmUgY29waWVkIHRvIHRoZSBpc28gcGFja2V0IGhlYWRlci4gIFRoZXNlCisgKiBmaWVsZHMgYXJlIHNwZWNpZmllZCBieSBJRUVFIDEzOTRhIGFuZCBJRUMgNjE4ODMtMS4KKyAqCisgKiBUaGUgQGNvbnRyb2wuU0tJUCBmbGFnIHNwZWNpZmllcyB0aGF0IG5vIHBhY2tldCBpcyB0byBiZSBzZW50IGluIGEgZnJhbWUuCisgKiBXaGVuIHVzaW5nIHRoaXMsIGFsbCBvdGhlciBmaWVsZHMgZXhjZXB0IEBjb250cm9sLklOVEVSUlVQVCBtdXN0IGJlIHplcm8uCisgKgorICogV2hlbiBhIHBhY2tldCB3aXRoIHRoZSBAY29udHJvbC5JTlRFUlJVUFQgZmxhZyBzZXQgaGFzIGJlZW4gY29tcGxldGVkLCBhbgorICogJmZ3X2NkZXZfZXZlbnRfaXNvX2ludGVycnVwdCBldmVudCB3aWxsIGJlIHNlbnQuCisgKgorICogQ29udGV4dCB0eXBlICVGV19DREVWX0lTT19DT05URVhUX1JFQ0VJVkU6CisgKgorICogQGNvbnRyb2wuSEVBREVSX0xFTkdUSCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNvbnRleHQncyBoZWFkZXJfc2l6ZS4KKyAqIElmIHRoZSBIRUFERVJfTEVOR1RIIGlzIGxhcmdlciB0aGFuIHRoZSBjb250ZXh0J3MgaGVhZGVyX3NpemUsIG11bHRpcGxlCisgKiBwYWNrZXRzIGFyZSBxdWV1ZWQgZm9yIHRoaXMgZW50cnkuCisgKgorICogVGhlIEBjb250cm9sLlNZIGFuZCBUQUcgZmllbGRzIGFyZSBpZ25vcmVkLgorICoKKyAqIElmIHRoZSBAY29udHJvbC5TWU5DIGZsYWcgaXMgc2V0LCB0aGUgY29udGV4dCBkcm9wcyBhbGwgcGFja2V0cyB1bnRpbCBhCisgKiBwYWNrZXQgd2l0aCBhIHN5IGZpZWxkIGlzIHJlY2VpdmVkIHdoaWNoIG1hdGNoZXMgJmZ3X2NkZXZfc3RhcnRfaXNvLnN5bmMuCisgKgorICogQGNvbnRyb2wuUEFZTE9BRF9MRU5HVEggZGVmaW5lcyBob3cgbWFueSBwYXlsb2FkIGJ5dGVzIGNhbiBiZSByZWNlaXZlZCBmb3IKKyAqIG9uZSBwYWNrZXQgKGluIGFkZGl0aW9uIHRvIHBheWxvYWQgcXVhZGxldHMgdGhhdCBoYXZlIGJlZW4gZGVmaW5lZCBhcyBoZWFkZXJzCisgKiBhbmQgYXJlIHN0cmlwcGVkIGFuZCByZXR1cm5lZCBpbiB0aGUgJmZ3X2NkZXZfZXZlbnRfaXNvX2ludGVycnVwdCBzdHJ1Y3R1cmUpLgorICogSWYgbW9yZSBieXRlcyBhcmUgcmVjZWl2ZWQsIHRoZSBhZGRpdGlvbmFsIGJ5dGVzIGFyZSBkcm9wcGVkLiAgSWYgbGVzcyBieXRlcworICogYXJlIHJlY2VpdmVkLCB0aGUgcmVtYWluaW5nIGJ5dGVzIGluIHRoaXMgcGFydCBvZiB0aGUgcGF5bG9hZCBidWZmZXIgd2lsbCBub3QKKyAqIGJlIHdyaXR0ZW4gdG8sIG5vdCBldmVuIGJ5IHRoZSBuZXh0IHBhY2tldC4gIEkuZS4sIHBhY2tldHMgcmVjZWl2ZWQgaW4KKyAqIGNvbnNlY3V0aXZlIGZyYW1lcyB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSBjb25zZWN1dGl2ZSBpbiBtZW1vcnkuICBJZiBhbgorICogZW50cnkgaGFzIHF1ZXVlZCBtdWx0aXBsZSBwYWNrZXRzLCB0aGUgUEFZTE9BRF9MRU5HVEggaXMgZGl2aWRlZCBlcXVhbGx5CisgKiBhbW9uZyB0aGVtLgorICoKKyAqIFdoZW4gYSBwYWNrZXQgd2l0aCB0aGUgQGNvbnRyb2wuSU5URVJSVVBUIGZsYWcgc2V0IGhhcyBiZWVuIGNvbXBsZXRlZCwgYW4KKyAqICZmd19jZGV2X2V2ZW50X2lzb19pbnRlcnJ1cHQgZXZlbnQgd2lsbCBiZSBzZW50LiAgQW4gZW50cnkgdGhhdCBoYXMgcXVldWVkCisgKiBtdWx0aXBsZSByZWNlaXZlIHBhY2tldHMgaXMgY29tcGxldGVkIHdoZW4gaXRzIGxhc3QgcGFja2V0IGlzIGNvbXBsZXRlZC4KKyAqCisgKiBDb250ZXh0IHR5cGUgJUZXX0NERVZfSVNPX0NPTlRFWFRfUkVDRUlWRV9NVUxUSUNIQU5ORUw6CisgKgorICogSGVyZSwgJmZ3X2NkZXZfaXNvX3BhY2tldCB3b3VsZCBiZSBtb3JlIGFwdGx5IG5hbWVkIF9pc29fYnVmZmVyX2NodW5rIHNpbmNlCisgKiBpdCBzcGVjaWZpZXMgYSBjaHVuayBvZiB0aGUgbW1hcCgpJ2VkIGJ1ZmZlciwgd2hpbGUgdGhlIG51bWJlciBhbmQgYWxpZ25tZW50CisgKiBvZiBwYWNrZXRzIHRvIGJlIHBsYWNlZCBpbnRvIHRoZSBidWZmZXIgY2h1bmsgaXMgbm90IGtub3duIGJlZm9yZWhhbmQuCisgKgorICogQGNvbnRyb2wuUEFZTE9BRF9MRU5HVEggaXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBjaHVuayBhbmQgc3BlY2lmaWVzIHJvb20KKyAqIGZvciBoZWFkZXIsIHBheWxvYWQsIHBhZGRpbmcsIGFuZCB0cmFpbGVyIGJ5dGVzIG9mIG9uZSBvciBtb3JlIHBhY2tldHMuCisgKiBJdCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4KKyAqCisgKiBAY29udHJvbC5IRUFERVJfTEVOR1RILCBUQUcgYW5kIFNZIGFyZSBpZ25vcmVkLiAgU1lOQyBpcyB0cmVhdGVkIGFzIGRlc2NyaWJlZAorICogZm9yIHNpbmdsZS1jaGFubmVsIHJlY2VwdGlvbi4KKyAqCisgKiBXaGVuIGEgYnVmZmVyIGNodW5rIHdpdGggdGhlIEBjb250cm9sLklOVEVSUlVQVCBmbGFnIHNldCBoYXMgYmVlbiBmaWxsZWQKKyAqIGVudGlyZWx5LCBhbiAmZndfY2Rldl9ldmVudF9pc29faW50ZXJydXB0X21jIGV2ZW50IHdpbGwgYmUgc2VudC4KKyAqLworc3RydWN0IGZ3X2NkZXZfaXNvX3BhY2tldCB7CisJX191MzIgY29udHJvbDsKKwlfX3UzMiBoZWFkZXJbMF07Cit9OworCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X3F1ZXVlX2lzbyAtIFF1ZXVlIGlzb2Nocm9ub3VzIHBhY2tldHMgZm9yIEkvTworICogQHBhY2tldHM6CVVzZXJzcGFjZSBwb2ludGVyIHRvIGFuIGFycmF5IG9mICZmd19jZGV2X2lzb19wYWNrZXQKKyAqIEBkYXRhOglQb2ludGVyIGludG8gbW1hcCgpJ2VkIHBheWxvYWQgYnVmZmVyCisgKiBAc2l6ZToJU2l6ZSBvZiB0aGUgQHBhY2tldHMgYXJyYXksIGluIGJ5dGVzCisgKiBAaGFuZGxlOglJc29jaHJvbm91cyBjb250ZXh0IGhhbmRsZQorICoKKyAqIFF1ZXVlIGEgbnVtYmVyIG9mIGlzb2Nocm9ub3VzIHBhY2tldHMgZm9yIHJlY2VwdGlvbiBvciB0cmFuc21pc3Npb24uCisgKiBUaGlzIGlvY3RsIHRha2VzIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiAmZndfY2Rldl9pc29fcGFja2V0IHN0cnVjdHMsCisgKiB3aGljaCBkZXNjcmliZSBob3cgdG8gdHJhbnNtaXQgZnJvbSBvciByZWNlaXZlIGludG8gYSBjb250aWd1b3VzIHJlZ2lvbgorICogb2YgYSBtbWFwKCknZWQgcGF5bG9hZCBidWZmZXIuICBBcyBwYXJ0IG9mIHRyYW5zbWl0IHBhY2tldCBkZXNjcmlwdG9ycywKKyAqIGEgc2VyaWVzIG9mIGhlYWRlcnMgY2FuIGJlIHN1cHBsaWVkLCB3aGljaCB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGUKKyAqIHBheWxvYWQgZHVyaW5nIERNQS4KKyAqCisgKiBUaGUga2VybmVsIG1heSBvciBtYXkgbm90IHF1ZXVlIGFsbCBwYWNrZXRzLCBidXQgd2lsbCB3cml0ZSBiYWNrIHVwZGF0ZWQKKyAqIHZhbHVlcyBvZiB0aGUgQHBhY2tldHMsIEBkYXRhIGFuZCBAc2l6ZSBmaWVsZHMsIHNvIHRoZSBpb2N0bCBjYW4gYmUKKyAqIHJlc3VibWl0dGVkIGVhc2lseS4KKyAqCisgKiBJbiBjYXNlIG9mIGEgbXVsdGljaGFubmVsIHJlY2VpdmUgY29udGV4dCwgQGRhdGEgbXVzdCBiZSBxdWFkbGV0LWFsaWduZWQKKyAqIHJlbGF0aXZlIHRvIHRoZSBidWZmZXIgc3RhcnQuCisgKi8KK3N0cnVjdCBmd19jZGV2X3F1ZXVlX2lzbyB7CisJX191NjQgcGFja2V0czsKKwlfX3U2NCBkYXRhOworCV9fdTMyIHNpemU7CisJX191MzIgaGFuZGxlOworfTsKKworI2RlZmluZSBGV19DREVWX0lTT19DT05URVhUX01BVENIX1RBRzAJCSAxCisjZGVmaW5lIEZXX0NERVZfSVNPX0NPTlRFWFRfTUFUQ0hfVEFHMQkJIDIKKyNkZWZpbmUgRldfQ0RFVl9JU09fQ09OVEVYVF9NQVRDSF9UQUcyCQkgNAorI2RlZmluZSBGV19DREVWX0lTT19DT05URVhUX01BVENIX1RBRzMJCSA4CisjZGVmaW5lIEZXX0NERVZfSVNPX0NPTlRFWFRfTUFUQ0hfQUxMX1RBR1MJMTUKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9zdGFydF9pc28gLSBTdGFydCBhbiBpc29jaHJvbm91cyB0cmFuc21pc3Npb24gb3IgcmVjZXB0aW9uCisgKiBAY3ljbGU6CUN5Y2xlIGluIHdoaWNoIHRvIHN0YXJ0IEkvTy4gIElmIEBjeWNsZSBpcyBncmVhdGVyIHRoYW4gb3IKKyAqCQllcXVhbCB0byAwLCB0aGUgSS9PIHdpbGwgc3RhcnQgb24gdGhhdCBjeWNsZS4KKyAqIEBzeW5jOglEZXRlcm1pbmVzIHRoZSB2YWx1ZSB0byB3YWl0IGZvciBmb3IgcmVjZWl2ZSBwYWNrZXRzIHRoYXQgaGF2ZQorICoJCXRoZSAlRldfQ0RFVl9JU09fU1lOQyBiaXQgc2V0CisgKiBAdGFnczoJVGFnIGZpbHRlciBiaXQgbWFzay4gIE9ubHkgdmFsaWQgZm9yIGlzb2Nocm9ub3VzIHJlY2VwdGlvbi4KKyAqCQlEZXRlcm1pbmVzIHRoZSB0YWcgdmFsdWVzIGZvciB3aGljaCBwYWNrZXRzIHdpbGwgYmUgYWNjZXB0ZWQuCisgKgkJVXNlIEZXX0NERVZfSVNPX0NPTlRFWFRfTUFUQ0hfIG1hY3JvcyB0byBzZXQgQHRhZ3MuCisgKiBAaGFuZGxlOglJc29jaHJvbm91cyBjb250ZXh0IGhhbmRsZSB3aXRoaW4gd2hpY2ggdG8gdHJhbnNtaXQgb3IgcmVjZWl2ZQorICovCitzdHJ1Y3QgZndfY2Rldl9zdGFydF9pc28geworCV9fczMyIGN5Y2xlOworCV9fdTMyIHN5bmM7CisJX191MzIgdGFnczsKKwlfX3UzMiBoYW5kbGU7Cit9OworCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X3N0b3BfaXNvIC0gU3RvcCBhbiBpc29jaHJvbm91cyB0cmFuc21pc3Npb24gb3IgcmVjZXB0aW9uCisgKiBAaGFuZGxlOglIYW5kbGUgb2YgaXNvY2hyb25vdXMgY29udGV4dCB0byBzdG9wCisgKi8KK3N0cnVjdCBmd19jZGV2X3N0b3BfaXNvIHsKKwlfX3UzMiBoYW5kbGU7Cit9OworCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X2dldF9jeWNsZV90aW1lciAtIHJlYWQgY3ljbGUgdGltZXIgcmVnaXN0ZXIKKyAqIEBsb2NhbF90aW1lOiAgIHN5c3RlbSB0aW1lLCBpbiBtaWNyb3NlY29uZHMgc2luY2UgdGhlIEVwb2NoCisgKiBAY3ljbGVfdGltZXI6ICBDeWNsZSBUaW1lIHJlZ2lzdGVyIGNvbnRlbnRzCisgKgorICogU2FtZSBhcyAlRldfQ0RFVl9JT0NfR0VUX0NZQ0xFX1RJTUVSMiwgYnV0IGZpeGVkIHRvIHVzZSAlQ0xPQ0tfUkVBTFRJTUUKKyAqIGFuZCBvbmx5IHdpdGggbWljcm9zZWNvbmRzIHJlc29sdXRpb24uCisgKgorICogSW4gdmVyc2lvbiAxIGFuZCAyIG9mIHRoZSBBQkksIHRoaXMgaW9jdGwgcmV0dXJuZWQgdW5yZWxpYWJsZSAobm9uLQorICogbW9ub3RvbmljKSBAY3ljbGVfdGltZXIgdmFsdWVzIG9uIGNlcnRhaW4gY29udHJvbGxlcnMuCisgKi8KK3N0cnVjdCBmd19jZGV2X2dldF9jeWNsZV90aW1lciB7CisJX191NjQgbG9jYWxfdGltZTsKKwlfX3UzMiBjeWNsZV90aW1lcjsKK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfZ2V0X2N5Y2xlX3RpbWVyMiAtIHJlYWQgY3ljbGUgdGltZXIgcmVnaXN0ZXIKKyAqIEB0dl9zZWM6ICAgICAgIHN5c3RlbSB0aW1lLCBzZWNvbmRzCisgKiBAdHZfbnNlYzogICAgICBzeXN0ZW0gdGltZSwgc3ViLXNlY29uZHMgcGFydCBpbiBuYW5vc2Vjb25kcworICogQGNsa19pZDogICAgICAgaW5wdXQgcGFyYW1ldGVyLCBjbG9jayBmcm9tIHdoaWNoIHRvIGdldCB0aGUgc3lzdGVtIHRpbWUKKyAqIEBjeWNsZV90aW1lcjogIEN5Y2xlIFRpbWUgcmVnaXN0ZXIgY29udGVudHMKKyAqCisgKiBUaGUgJUZXX0NERVZfSU9DX0dFVF9DWUNMRV9USU1FUjIgaW9jdGwgcmVhZHMgdGhlIGlzb2Nocm9ub3VzIGN5Y2xlIHRpbWVyCisgKiBhbmQgYWxzbyB0aGUgc3lzdGVtIGNsb2NrLiAgVGhpcyBhbGxvd3MgdG8gY29ycmVsYXRlIHJlY2VwdGlvbiB0aW1lIG9mCisgKiBpc29jaHJvbm91cyBwYWNrZXRzIHdpdGggc3lzdGVtIHRpbWUuCisgKgorICogQGNsa19pZCBsZXRzIHlvdSBjaG9vc2UgYSBjbG9jayBsaWtlIHdpdGggUE9TSVgnIGNsb2NrX2dldHRpbWUgZnVuY3Rpb24uCisgKiBTdXBwb3J0ZWQgQGNsa19pZCB2YWx1ZXMgYXJlIFBPU0lYJyAlQ0xPQ0tfUkVBTFRJTUUgYW5kICVDTE9DS19NT05PVE9OSUMKKyAqIGFuZCBMaW51eCcgJUNMT0NLX01PTk9UT05JQ19SQVcuCisgKgorICogQGN5Y2xlX3RpbWVyIGNvbnNpc3RzIG9mIDcgYml0cyBjeWNsZVNlY29uZHMsIDEzIGJpdHMgY3ljbGVDb3VudCwgYW5kCisgKiAxMiBiaXRzIGN5Y2xlT2Zmc2V0LCBpbiBob3N0IGJ5dGUgb3JkZXIuICBDZi4gdGhlIEN5Y2xlIFRpbWUgcmVnaXN0ZXIKKyAqIHBlciBJRUVFIDEzOTQgb3IgSXNvY2hyb25vdXMgQ3ljbGUgVGltZXIgcmVnaXN0ZXIgcGVyIE9IQ0ktMTM5NC4KKyAqLworc3RydWN0IGZ3X2NkZXZfZ2V0X2N5Y2xlX3RpbWVyMiB7CisJX19zNjQgdHZfc2VjOworCV9fczMyIHR2X25zZWM7CisJX19zMzIgY2xrX2lkOworCV9fdTMyIGN5Y2xlX3RpbWVyOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9hbGxvY2F0ZV9pc29fcmVzb3VyY2UgLSAoRGUpYWxsb2NhdGUgYSBjaGFubmVsIG9yIGJhbmR3aWR0aAorICogQGNsb3N1cmU6CVBhc3NlZCBiYWNrIHRvIHVzZXJzcGFjZSBpbiBjb3JyZXNwb25kaW5nIGlzbyByZXNvdXJjZSBldmVudHMKKyAqIEBjaGFubmVsczoJSXNvY2hyb25vdXMgY2hhbm5lbHMgb2Ygd2hpY2ggb25lIGlzIHRvIGJlIChkZSlhbGxvY2F0ZWQKKyAqIEBiYW5kd2lkdGg6CUlzb2Nocm9ub3VzIGJhbmR3aWR0aCB1bml0cyB0byBiZSAoZGUpYWxsb2NhdGVkCisgKiBAaGFuZGxlOglIYW5kbGUgdG8gdGhlIGFsbG9jYXRpb24sIHdyaXR0ZW4gYnkgdGhlIGtlcm5lbCAob25seSB2YWxpZCBpbgorICoJCWNhc2Ugb2YgJUZXX0NERVZfSU9DX0FMTE9DQVRFX0lTT19SRVNPVVJDRSBpb2N0bHMpCisgKgorICogVGhlICVGV19DREVWX0lPQ19BTExPQ0FURV9JU09fUkVTT1VSQ0UgaW9jdGwgaW5pdGlhdGVzIGFsbG9jYXRpb24gb2YgYW4KKyAqIGlzb2Nocm9ub3VzIGNoYW5uZWwgYW5kL29yIG9mIGlzb2Nocm9ub3VzIGJhbmR3aWR0aCBhdCB0aGUgaXNvY2hyb25vdXMKKyAqIHJlc291cmNlIG1hbmFnZXIgKElSTSkuICBPbmx5IG9uZSBvZiB0aGUgY2hhbm5lbHMgc3BlY2lmaWVkIGluIEBjaGFubmVscyBpcworICogYWxsb2NhdGVkLiAgQW4gJUZXX0NERVZfRVZFTlRfSVNPX1JFU09VUkNFX0FMTE9DQVRFRCBpcyBzZW50IGFmdGVyCisgKiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIElSTSwgaW5kaWNhdGluZyBzdWNjZXNzIG9yIGZhaWx1cmUgaW4gdGhlIGV2ZW50IGRhdGEuCisgKiBUaGUga2VybmVsIHdpbGwgYXV0b21hdGljYWxseSByZWFsbG9jYXRlIHRoZSByZXNvdXJjZXMgYWZ0ZXIgYnVzIHJlc2V0cy4KKyAqIFNob3VsZCBhIHJlYWxsb2NhdGlvbiBmYWlsLCBhbiAlRldfQ0RFVl9FVkVOVF9JU09fUkVTT1VSQ0VfREVBTExPQ0FURUQgZXZlbnQKKyAqIHdpbGwgYmUgc2VudC4gIFRoZSBrZXJuZWwgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgZGVhbGxvY2F0ZSB0aGUgcmVzb3VyY2VzCisgKiB3aGVuIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgY2xvc2VkLgorICoKKyAqIFRoZSAlRldfQ0RFVl9JT0NfREVBTExPQ0FURV9JU09fUkVTT1VSQ0UgaW9jdGwgY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUKKyAqIGRlYWxsb2NhdGlvbiBvZiByZXNvdXJjZXMgd2hpY2ggd2VyZSBhbGxvY2F0ZWQgYXMgZGVzY3JpYmVkIGFib3ZlLgorICogQW4gJUZXX0NERVZfRVZFTlRfSVNPX1JFU09VUkNFX0RFQUxMT0NBVEVEIGV2ZW50IGNvbmNsdWRlcyB0aGlzIG9wZXJhdGlvbi4KKyAqCisgKiBUaGUgJUZXX0NERVZfSU9DX0FMTE9DQVRFX0lTT19SRVNPVVJDRV9PTkNFIGlvY3RsIGlzIGEgdmFyaWFudCBvZiBhbGxvY2F0aW9uCisgKiB3aXRob3V0IGF1dG9tYXRpYyByZS0gb3IgZGVhbGxvY2F0aW9uLgorICogQW4gJUZXX0NERVZfRVZFTlRfSVNPX1JFU09VUkNFX0FMTE9DQVRFRCBldmVudCBjb25jbHVkZXMgdGhpcyBvcGVyYXRpb24sCisgKiBpbmRpY2F0aW5nIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBpbiBpdHMgZGF0YS4KKyAqCisgKiBUaGUgJUZXX0NERVZfSU9DX0RFQUxMT0NBVEVfSVNPX1JFU09VUkNFX09OQ0UgaW9jdGwgd29ya3MgbGlrZQorICogJUZXX0NERVZfSU9DX0FMTE9DQVRFX0lTT19SRVNPVVJDRV9PTkNFIGV4Y2VwdCB0aGF0IHJlc291cmNlcyBhcmUgZnJlZWQKKyAqIGluc3RlYWQgb2YgYWxsb2NhdGVkLgorICogQW4gJUZXX0NERVZfRVZFTlRfSVNPX1JFU09VUkNFX0RFQUxMT0NBVEVEIGV2ZW50IGNvbmNsdWRlcyB0aGlzIG9wZXJhdGlvbi4KKyAqCisgKiBUbyBzdW1tYXJpemUsICVGV19DREVWX0lPQ19BTExPQ0FURV9JU09fUkVTT1VSQ0UgYWxsb2NhdGVzIGlzbyByZXNvdXJjZXMKKyAqIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGZkIG9yIEBoYW5kbGUuCisgKiBJbiBjb250cmFzdCwgJUZXX0NERVZfSU9DX0FMTE9DQVRFX0lTT19SRVNPVVJDRV9PTkNFIGFsbG9jYXRlcyBpc28gcmVzb3VyY2VzCisgKiBmb3IgdGhlIGR1cmF0aW9uIG9mIGEgYnVzIGdlbmVyYXRpb24uCisgKgorICogQGNoYW5uZWxzIGlzIGEgaG9zdC1lbmRpYW4gYml0ZmllbGQgd2l0aCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0CisgKiByZXByZXNlbnRpbmcgY2hhbm5lbCAwIGFuZCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgcmVwcmVzZW50aW5nIGNoYW5uZWwgNjM6CisgKiAxVUxMIDw8IGMgZm9yIGVhY2ggY2hhbm5lbCBjIHRoYXQgaXMgYSBjYW5kaWRhdGUgZm9yIChkZSlhbGxvY2F0aW9uLgorICoKKyAqIEBiYW5kd2lkdGggaXMgZXhwcmVzc2VkIGluIGJhbmR3aWR0aCBhbGxvY2F0aW9uIHVuaXRzLCBpLmUuIHRoZSB0aW1lIHRvIHNlbmQKKyAqIG9uZSBxdWFkbGV0IG9mIGRhdGEgKHBheWxvYWQgb3IgaGVhZGVyIGRhdGEpIGF0IHNwZWVkIFMxNjAwLgorICovCitzdHJ1Y3QgZndfY2Rldl9hbGxvY2F0ZV9pc29fcmVzb3VyY2UgeworCV9fdTY0IGNsb3N1cmU7CisJX191NjQgY2hhbm5lbHM7CisJX191MzIgYmFuZHdpZHRoOworCV9fdTMyIGhhbmRsZTsKK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfc2VuZF9zdHJlYW1fcGFja2V0IC0gc2VuZCBhbiBhc3luY2hyb25vdXMgc3RyZWFtIHBhY2tldAorICogQGxlbmd0aDoJTGVuZ3RoIG9mIG91dGdvaW5nIHBheWxvYWQsIGluIGJ5dGVzCisgKiBAdGFnOglEYXRhIGZvcm1hdCB0YWcKKyAqIEBjaGFubmVsOglJc29jaHJvbm91cyBjaGFubmVsIHRvIHRyYW5zbWl0IHRvCisgKiBAc3k6CQlTeW5jaHJvbml6YXRpb24gY29kZQorICogQGNsb3N1cmU6CVBhc3NlZCBiYWNrIHRvIHVzZXJzcGFjZSBpbiB0aGUgcmVzcG9uc2UgZXZlbnQKKyAqIEBkYXRhOglVc2Vyc3BhY2UgcG9pbnRlciB0byBwYXlsb2FkCisgKiBAZ2VuZXJhdGlvbjoJVGhlIGJ1cyBnZW5lcmF0aW9uIHdoZXJlIHBhY2tldCBpcyB2YWxpZAorICogQHNwZWVkOglTcGVlZCB0byB0cmFuc21pdCBhdAorICoKKyAqIFRoZSAlRldfQ0RFVl9JT0NfU0VORF9TVFJFQU1fUEFDS0VUIGlvY3RsIHNlbmRzIGFuIGFzeW5jaHJvbm91cyBzdHJlYW0gcGFja2V0CisgKiB0byBldmVyeSBkZXZpY2Ugd2hpY2ggaXMgbGlzdGVuaW5nIHRvIHRoZSBzcGVjaWZpZWQgY2hhbm5lbC4gIFRoZSBrZXJuZWwKKyAqIHdyaXRlcyBhbiAmZndfY2Rldl9ldmVudF9yZXNwb25zZSBldmVudCB3aGljaCBpbmRpY2F0ZXMgc3VjY2VzcyBvciBmYWlsdXJlIG9mCisgKiB0aGUgdHJhbnNtaXNzaW9uLgorICovCitzdHJ1Y3QgZndfY2Rldl9zZW5kX3N0cmVhbV9wYWNrZXQgeworCV9fdTMyIGxlbmd0aDsKKwlfX3UzMiB0YWc7CisJX191MzIgY2hhbm5lbDsKKwlfX3UzMiBzeTsKKwlfX3U2NCBjbG9zdXJlOworCV9fdTY0IGRhdGE7CisJX191MzIgZ2VuZXJhdGlvbjsKKwlfX3UzMiBzcGVlZDsKK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfc2VuZF9waHlfcGFja2V0IC0gc2VuZCBhIFBIWSBwYWNrZXQKKyAqIEBjbG9zdXJlOglQYXNzZWQgYmFjayB0byB1c2Vyc3BhY2UgaW4gdGhlIFBIWS1wYWNrZXQtc2VudCBldmVudAorICogQGRhdGE6CUZpcnN0IGFuZCBzZWNvbmQgcXVhZGxldCBvZiB0aGUgUEhZIHBhY2tldAorICogQGdlbmVyYXRpb246CVRoZSBidXMgZ2VuZXJhdGlvbiB3aGVyZSBwYWNrZXQgaXMgdmFsaWQKKyAqCisgKiBUaGUgJUZXX0NERVZfSU9DX1NFTkRfUEhZX1BBQ0tFVCBpb2N0bCBzZW5kcyBhIFBIWSBwYWNrZXQgdG8gYWxsIG5vZGVzCisgKiBvbiB0aGUgc2FtZSBjYXJkIGFzIHRoaXMgZGV2aWNlLiAgQWZ0ZXIgdHJhbnNtaXNzaW9uLCBhbgorICogJUZXX0NERVZfRVZFTlRfUEhZX1BBQ0tFVF9TRU5UIGV2ZW50IGlzIGdlbmVyYXRlZC4KKyAqCisgKiBUaGUgcGF5bG9hZCBAZGF0YVtdIHNoYWxsIGJlIHNwZWNpZmllZCBpbiBob3N0IGJ5dGUgb3JkZXIuICBVc3VhbGx5LAorICogQGRhdGFbMV0gbmVlZHMgdG8gYmUgdGhlIGJpdHdpc2UgaW52ZXJzZSBvZiBAZGF0YVswXS4gIFZlcnNhUEhZIHBhY2tldHMKKyAqIGFyZSBhbiBleGNlcHRpb24gdG8gdGhpcyBydWxlLgorICoKKyAqIFRoZSBpb2N0bCBpcyBvbmx5IHBlcm1pdHRlZCBvbiBkZXZpY2UgZmlsZXMgd2hpY2ggcmVwcmVzZW50IGEgbG9jYWwgbm9kZS4KKyAqLworc3RydWN0IGZ3X2NkZXZfc2VuZF9waHlfcGFja2V0IHsKKwlfX3U2NCBjbG9zdXJlOworCV9fdTMyIGRhdGFbMl07CisJX191MzIgZ2VuZXJhdGlvbjsKK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfcmVjZWl2ZV9waHlfcGFja2V0cyAtIHN0YXJ0IHJlY2VwdGlvbiBvZiBQSFkgcGFja2V0cworICogQGNsb3N1cmU6IFBhc3NlZCBiYWNrIHRvIHVzZXJzcGFjZSBpbiBwaHkgcGFja2V0IGV2ZW50cworICoKKyAqIFRoaXMgaW9jdGwgYWN0aXZhdGVzIGlzc3Vpbmcgb2YgJUZXX0NERVZfRVZFTlRfUEhZX1BBQ0tFVF9SRUNFSVZFRCBkdWUgdG8KKyAqIGluY29taW5nIFBIWSBwYWNrZXRzIGZyb20gYW55IG5vZGUgb24gdGhlIHNhbWUgYnVzIGFzIHRoZSBkZXZpY2UuCisgKgorICogVGhlIGlvY3RsIGlzIG9ubHkgcGVybWl0dGVkIG9uIGRldmljZSBmaWxlcyB3aGljaCByZXByZXNlbnQgYSBsb2NhbCBub2RlLgorICovCitzdHJ1Y3QgZndfY2Rldl9yZWNlaXZlX3BoeV9wYWNrZXRzIHsKKwlfX3U2NCBjbG9zdXJlOworfTsKKworI2RlZmluZSBGV19DREVWX1ZFUlNJT04gMyAvKiBNZWFuaW5nbGVzcyBsZWdhY3kgbWFjcm87IGRvbid0IHVzZSBpdC4gKi8KKworI2VuZGlmIC8qIF9MSU5VWF9GSVJFV0lSRV9DREVWX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmlyZXdpcmUtY29uc3RhbnRzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZpcmV3aXJlLWNvbnN0YW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNGJiNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZpcmV3aXJlLWNvbnN0YW50cy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBJRUVFIDEzOTQgY29uc3RhbnRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA3ICBLcmlzdGlhbiBIb2Vnc2JlcmcgPGtyaEBiaXRwbGFuZXQubmV0PgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9GSVJFV0lSRV9DT05TVEFOVFNfSAorI2RlZmluZSBfTElOVVhfRklSRVdJUkVfQ09OU1RBTlRTX0gKKworI2RlZmluZSBUQ09ERV9XUklURV9RVUFETEVUX1JFUVVFU1QJMHgwCisjZGVmaW5lIFRDT0RFX1dSSVRFX0JMT0NLX1JFUVVFU1QJMHgxCisjZGVmaW5lIFRDT0RFX1dSSVRFX1JFU1BPTlNFCQkweDIKKyNkZWZpbmUgVENPREVfUkVBRF9RVUFETEVUX1JFUVVFU1QJMHg0CisjZGVmaW5lIFRDT0RFX1JFQURfQkxPQ0tfUkVRVUVTVAkweDUKKyNkZWZpbmUgVENPREVfUkVBRF9RVUFETEVUX1JFU1BPTlNFCTB4NgorI2RlZmluZSBUQ09ERV9SRUFEX0JMT0NLX1JFU1BPTlNFCTB4NworI2RlZmluZSBUQ09ERV9DWUNMRV9TVEFSVAkJMHg4CisjZGVmaW5lIFRDT0RFX0xPQ0tfUkVRVUVTVAkJMHg5CisjZGVmaW5lIFRDT0RFX1NUUkVBTV9EQVRBCQkweGEKKyNkZWZpbmUgVENPREVfTE9DS19SRVNQT05TRQkJMHhiCisKKyNkZWZpbmUgRVhUQ09ERV9NQVNLX1NXQVAJCTB4MQorI2RlZmluZSBFWFRDT0RFX0NPTVBBUkVfU1dBUAkJMHgyCisjZGVmaW5lIEVYVENPREVfRkVUQ0hfQURECQkweDMKKyNkZWZpbmUgRVhUQ09ERV9MSVRUTEVfQURECQkweDQKKyNkZWZpbmUgRVhUQ09ERV9CT1VOREVEX0FERAkJMHg1CisjZGVmaW5lIEVYVENPREVfV1JBUF9BREQJCTB4NgorI2RlZmluZSBFWFRDT0RFX1ZFTkRPUl9ERVBFTkRFTlQJMHg3CisKKy8qIExpbnV4IGZpcmV3aXJlLWNvcmUgKEp1anUpIHNwZWNpZmljIHRjb2RlcyAqLworI2RlZmluZSBUQ09ERV9MT0NLX01BU0tfU1dBUAkJKDB4MTAgfCBFWFRDT0RFX01BU0tfU1dBUCkKKyNkZWZpbmUgVENPREVfTE9DS19DT01QQVJFX1NXQVAJCSgweDEwIHwgRVhUQ09ERV9DT01QQVJFX1NXQVApCisjZGVmaW5lIFRDT0RFX0xPQ0tfRkVUQ0hfQURECQkoMHgxMCB8IEVYVENPREVfRkVUQ0hfQUREKQorI2RlZmluZSBUQ09ERV9MT0NLX0xJVFRMRV9BREQJCSgweDEwIHwgRVhUQ09ERV9MSVRUTEVfQUREKQorI2RlZmluZSBUQ09ERV9MT0NLX0JPVU5ERURfQURECQkoMHgxMCB8IEVYVENPREVfQk9VTkRFRF9BREQpCisjZGVmaW5lIFRDT0RFX0xPQ0tfV1JBUF9BREQJCSgweDEwIHwgRVhUQ09ERV9XUkFQX0FERCkKKyNkZWZpbmUgVENPREVfTE9DS19WRU5ET1JfREVQRU5ERU5UCSgweDEwIHwgRVhUQ09ERV9WRU5ET1JfREVQRU5ERU5UKQorCisjZGVmaW5lIFJDT0RFX0NPTVBMRVRFCQkJMHgwCisjZGVmaW5lIFJDT0RFX0NPTkZMSUNUX0VSUk9SCQkweDQKKyNkZWZpbmUgUkNPREVfREFUQV9FUlJPUgkJMHg1CisjZGVmaW5lIFJDT0RFX1RZUEVfRVJST1IJCTB4NgorI2RlZmluZSBSQ09ERV9BRERSRVNTX0VSUk9SCQkweDcKKworLyogTGludXggZmlyZXdpcmUtY29yZSAoSnVqdSkgc3BlY2lmaWMgcmNvZGVzICovCisjZGVmaW5lIFJDT0RFX1NFTkRfRVJST1IJCTB4MTAKKyNkZWZpbmUgUkNPREVfQ0FOQ0VMTEVECQkJMHgxMQorI2RlZmluZSBSQ09ERV9CVVNZCQkJMHgxMgorI2RlZmluZSBSQ09ERV9HRU5FUkFUSU9OCQkweDEzCisjZGVmaW5lIFJDT0RFX05PX0FDSwkJCTB4MTQKKworI2RlZmluZSBTQ09ERV8xMDAJCQkweDAKKyNkZWZpbmUgU0NPREVfMjAwCQkJMHgxCisjZGVmaW5lIFNDT0RFXzQwMAkJCTB4MgorI2RlZmluZSBTQ09ERV84MDAJCQkweDMKKyNkZWZpbmUgU0NPREVfMTYwMAkJCTB4NAorI2RlZmluZSBTQ09ERV8zMjAwCQkJMHg1CisjZGVmaW5lIFNDT0RFX0JFVEEJCQkweDMKKworI2RlZmluZSBBQ0tfQ09NUExFVEUJCQkweDEKKyNkZWZpbmUgQUNLX1BFTkRJTkcJCQkweDIKKyNkZWZpbmUgQUNLX0JVU1lfWAkJCTB4NAorI2RlZmluZSBBQ0tfQlVTWV9BCQkJMHg1CisjZGVmaW5lIEFDS19CVVNZX0IJCQkweDYKKyNkZWZpbmUgQUNLX0RBVEFfRVJST1IJCQkweGQKKyNkZWZpbmUgQUNLX1RZUEVfRVJST1IJCQkweGUKKworI2RlZmluZSBSRVRSWV8xCQkJCTB4MDAKKyNkZWZpbmUgUkVUUllfWAkJCQkweDAxCisjZGVmaW5lIFJFVFJZX0EJCQkJMHgwMgorI2RlZmluZSBSRVRSWV9CCQkJCTB4MDMKKworI2VuZGlmIC8qIF9MSU5VWF9GSVJFV0lSRV9DT05TVEFOVFNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mbGF0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZsYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzUxYmM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mbGF0LmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDAzICBEYXZpZCBNY0N1bGxvdWdoIDxkYXZpZG1Ac25hcGdlYXIuY29tPgorICogQ29weXJpZ2h0IChDKSAxOTk4ICAgICAgIEtlbm5ldGggQWxiYW5vd3NraSA8a2phaGRzQGtqYWhkcy5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFNpbHZlciBIYW1tZXIgR3JvdXAsIEx0ZC4KKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIGRlZmluaXRpb25zIGFuZCBzdHJ1Y3R1cmVzIG5lZWRlZCB0bworICogc3VwcG9ydCB1Q2xpbnV4IGZsYXQtZm9ybWF0IGV4ZWN1dGFibGVzLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0ZMQVRfSAorI2RlZmluZSBfTElOVVhfRkxBVF9ICisKKworI2RlZmluZQlGTEFUX1ZFUlNJT04JCQkweDAwMDAwMDA0TAorCisjaWZkZWYgQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVAorI2RlZmluZQlNQVhfU0hBUkVEX0xJQlMJCQkoNCkKKyNlbHNlCisjZGVmaW5lCU1BWF9TSEFSRURfTElCUwkJCSgxKQorI2VuZGlmCisKKy8qCisgKiBUbyBtYWtlIGV2ZXJ5dGhpbmcgZWFzaWVyIHRvIHBvcnQgYW5kIG1hbmFnZSBjcm9zcyBwbGF0Zm9ybQorICogZGV2ZWxvcG1lbnQsICBhbGwgZmllbGRzIGFyZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKi8KKworc3RydWN0IGZsYXRfaGRyIHsKKwljaGFyIG1hZ2ljWzRdOworCXVuc2lnbmVkIGxvbmcgcmV2OyAgICAgICAgICAvKiB2ZXJzaW9uIChhcyBhYm92ZSkgKi8KKwl1bnNpZ25lZCBsb25nIGVudHJ5OyAgICAgICAgLyogT2Zmc2V0IG9mIGZpcnN0IGV4ZWN1dGFibGUgaW5zdHJ1Y3Rpb24KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0ZXh0IHNlZ21lbnQgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZSAqLworCXVuc2lnbmVkIGxvbmcgZGF0YV9zdGFydDsgICAvKiBPZmZzZXQgb2YgZGF0YSBzZWdtZW50IGZyb20gYmVnaW5uaW5nIG9mCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgKi8KKwl1bnNpZ25lZCBsb25nIGRhdGFfZW5kOyAgICAgLyogT2Zmc2V0IG9mIGVuZCBvZiBkYXRhIHNlZ21lbnQKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZSAqLworCXVuc2lnbmVkIGxvbmcgYnNzX2VuZDsgICAgICAvKiBPZmZzZXQgb2YgZW5kIG9mIGJzcyBzZWdtZW50IGZyb20gYmVnaW5uaW5nCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGZpbGUgKi8KKworCS8qIChJdCBpcyBhc3N1bWVkIHRoYXQgZGF0YV9lbmQgdGhyb3VnaCBic3NfZW5kIGZvcm1zIHRoZSBic3Mgc2VnbWVudC4pICovCisKKwl1bnNpZ25lZCBsb25nIHN0YWNrX3NpemU7ICAgLyogU2l6ZSBvZiBzdGFjaywgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nIHJlbG9jX3N0YXJ0OyAgLyogT2Zmc2V0IG9mIHJlbG9jYXRpb24gcmVjb3JkcyBmcm9tCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2lubmluZyBvZiBmaWxlICovCisJdW5zaWduZWQgbG9uZyByZWxvY19jb3VudDsgIC8qIE51bWJlciBvZiByZWxvY2F0aW9uIHJlY29yZHMgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOyAgICAgICAKKwl1bnNpZ25lZCBsb25nIGJ1aWxkX2RhdGU7ICAgLyogV2hlbiB0aGUgcHJvZ3JhbS9saWJyYXJ5IHdhcyBidWlsdCAqLworCXVuc2lnbmVkIGxvbmcgZmlsbGVyWzVdOyAgICAvKiBSZXNlcnZlcmVkLCBzZXQgdG8gemVybyAqLworfTsKKworI2RlZmluZSBGTEFUX0ZMQUdfUkFNICAgIDB4MDAwMSAvKiBsb2FkIHByb2dyYW0gZW50aXJlbHkgaW50byBSQU0gKi8KKyNkZWZpbmUgRkxBVF9GTEFHX0dPVFBJQyAweDAwMDIgLyogcHJvZ3JhbSBpcyBQSUMgd2l0aCBHT1QgKi8KKyNkZWZpbmUgRkxBVF9GTEFHX0daSVAgICAweDAwMDQgLyogYWxsIGJ1dCB0aGUgaGVhZGVyIGlzIGNvbXByZXNzZWQgKi8KKyNkZWZpbmUgRkxBVF9GTEFHX0daREFUQSAweDAwMDggLyogb25seSBkYXRhL3JlbG9jcyBhcmUgY29tcHJlc3NlZCAoZm9yIFhJUCkgKi8KKyNkZWZpbmUgRkxBVF9GTEFHX0tUUkFDRSAweDAwMTAgLyogb3V0cHV0IHVzZWZ1bCBrZXJuZWwgdHJhY2UgZm9yIGRlYnVnZ2luZyAqLworCisKKworI2VuZGlmIC8qIF9MSU5VWF9GTEFUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWEyNWFmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mcy5oCkBAIC0wLDAgKzEsMzc3IEBACisjaWZuZGVmIF9MSU5VWF9GU19ICisjZGVmaW5lIF9MSU5VWF9GU19ICisKKy8qCisgKiBUaGlzIGZpbGUgaGFzIGRlZmluaXRpb25zIGZvciBzb21lIGltcG9ydGFudCBmaWxlIHRhYmxlCisgKiBzdHJ1Y3R1cmVzIGV0Yy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtfdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogSXQncyBzaWxseSB0byBoYXZlIE5SX09QRU4gYmlnZ2VyIHRoYW4gTlJfRklMRSwgYnV0IHlvdSBjYW4gY2hhbmdlCisgKiB0aGUgZmlsZSBsaW1pdCBhdCBydW50aW1lIGFuZCBvbmx5IHJvb3QgY2FuIGluY3JlYXNlIHRoZSBwZXItcHJvY2VzcworICogbnJfZmlsZSBybGltaXQsIHNvIGl0J3Mgc2FmZSB0byBzZXQgdXAgYSByaWRpY3Vsb3VzbHkgaGlnaCBhYnNvbHV0ZQorICogdXBwZXIgbGltaXQgb24gZmlsZXMtcGVyLXByb2Nlc3MuCisgKgorICogU29tZSBwcm9ncmFtcyAobm90YWJseSB0aG9zZSB1c2luZyBzZWxlY3QoKSkgbWF5IGhhdmUgdG8gYmUgCisgKiByZWNvbXBpbGVkIHRvIHRha2UgZnVsbCBhZHZhbnRhZ2Ugb2YgdGhlIG5ldyBsaW1pdHMuLiAgCisgKi8KKworLyogRml4ZWQgY29uc3RhbnRzIGZpcnN0OiAqLworI3VuZGVmIE5SX09QRU4KKyNkZWZpbmUgSU5SX09QRU5fQ1VSIDEwMjQJLyogSW5pdGlhbCBzZXR0aW5nIGZvciBuZmlsZSBybGltaXRzICovCisjZGVmaW5lIElOUl9PUEVOX01BWCA0MDk2CS8qIEhhcmQgbGltaXQgZm9yIG5maWxlIHJsaW1pdHMgKi8KKworI2RlZmluZSBCTE9DS19TSVpFX0JJVFMgMTAKKyNkZWZpbmUgQkxPQ0tfU0laRSAoMTw8QkxPQ0tfU0laRV9CSVRTKQorCisjZGVmaW5lIFNFRUtfU0VUCTAJLyogc2VlayByZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2YgZmlsZSAqLworI2RlZmluZSBTRUVLX0NVUgkxCS8qIHNlZWsgcmVsYXRpdmUgdG8gY3VycmVudCBmaWxlIHBvc2l0aW9uICovCisjZGVmaW5lIFNFRUtfRU5ECTIJLyogc2VlayByZWxhdGl2ZSB0byBlbmQgb2YgZmlsZSAqLworI2RlZmluZSBTRUVLX0RBVEEJMwkvKiBzZWVrIHRvIHRoZSBuZXh0IGRhdGEgKi8KKyNkZWZpbmUgU0VFS19IT0xFCTQJLyogc2VlayB0byB0aGUgbmV4dCBob2xlICovCisjZGVmaW5lIFNFRUtfTUFYCVNFRUtfSE9MRQorCitzdHJ1Y3QgZnN0cmltX3JhbmdlIHsKKwlfX3U2NCBzdGFydDsKKwlfX3U2NCBsZW47CisJX191NjQgbWlubGVuOworfTsKKworLyogQW5kIGR5bmFtaWNhbGx5LXR1bmFibGUgbGltaXRzIGFuZCBkZWZhdWx0czogKi8KK3N0cnVjdCBmaWxlc19zdGF0X3N0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBucl9maWxlczsJCS8qIHJlYWQgb25seSAqLworCXVuc2lnbmVkIGxvbmcgbnJfZnJlZV9maWxlczsJLyogcmVhZCBvbmx5ICovCisJdW5zaWduZWQgbG9uZyBtYXhfZmlsZXM7CQkvKiB0dW5hYmxlICovCit9OworCitzdHJ1Y3QgaW5vZGVzX3N0YXRfdCB7CisJaW50IG5yX2lub2RlczsKKwlpbnQgbnJfdW51c2VkOworCWludCBkdW1teVs1XTsJCS8qIHBhZGRpbmcgZm9yIHN5c2N0bCBBQkkgY29tcGF0aWJpbGl0eSAqLworfTsKKworCisjZGVmaW5lIE5SX0ZJTEUgIDgxOTIJLyogdGhpcyBjYW4gd2VsbCBiZSBsYXJnZXIgb24gYSBsYXJnZXIgc3lzdGVtICovCisKKyNkZWZpbmUgTUFZX0VYRUMJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUFZX1dSSVRFCQkweDAwMDAwMDAyCisjZGVmaW5lIE1BWV9SRUFECQkweDAwMDAwMDA0CisjZGVmaW5lIE1BWV9BUFBFTkQJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUFZX0FDQ0VTUwkJMHgwMDAwMDAxMAorI2RlZmluZSBNQVlfT1BFTgkJMHgwMDAwMDAyMAorI2RlZmluZSBNQVlfQ0hESVIJCTB4MDAwMDAwNDAKKy8qIGNhbGxlZCBmcm9tIFJDVSBtb2RlLCBkb24ndCBibG9jayAqLworI2RlZmluZSBNQVlfTk9UX0JMT0NLCQkweDAwMDAwMDgwCisKKy8qCisgKiBmbGFncyBpbiBmaWxlLmZfbW9kZS4gIE5vdGUgdGhhdCBGTU9ERV9SRUFEIGFuZCBGTU9ERV9XUklURSBtdXN0IGNvcnJlc3BvbmQKKyAqIHRvIE9fV1JPTkxZIGFuZCBPX1JEV1IgdmlhIHRoZSBzdHJhbmdlIHRyaWNrIGluIF9fZGVudHJ5X29wZW4oKQorICovCisKKy8qIGZpbGUgaXMgb3BlbiBmb3IgcmVhZGluZyAqLworI2RlZmluZSBGTU9ERV9SRUFECQkoKGZtb2RlX3QpMHgxKQorLyogZmlsZSBpcyBvcGVuIGZvciB3cml0aW5nICovCisjZGVmaW5lIEZNT0RFX1dSSVRFCQkoKGZtb2RlX3QpMHgyKQorLyogZmlsZSBpcyBzZWVrYWJsZSAqLworI2RlZmluZSBGTU9ERV9MU0VFSwkJKChmbW9kZV90KTB4NCkKKy8qIGZpbGUgY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIHByZWFkICovCisjZGVmaW5lIEZNT0RFX1BSRUFECQkoKGZtb2RlX3QpMHg4KQorLyogZmlsZSBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgcHdyaXRlICovCisjZGVmaW5lIEZNT0RFX1BXUklURQkJKChmbW9kZV90KTB4MTApCisvKiBGaWxlIGlzIG9wZW5lZCBmb3IgZXhlY3V0aW9uIHdpdGggc3lzX2V4ZWN2ZSAvIHN5c191c2VsaWIgKi8KKyNkZWZpbmUgRk1PREVfRVhFQwkJKChmbW9kZV90KTB4MjApCisvKiBGaWxlIGlzIG9wZW5lZCB3aXRoIE9fTkRFTEFZIChvbmx5IHNldCBmb3IgYmxvY2sgZGV2aWNlcykgKi8KKyNkZWZpbmUgRk1PREVfTkRFTEFZCQkoKGZtb2RlX3QpMHg0MCkKKy8qIEZpbGUgaXMgb3BlbmVkIHdpdGggT19FWENMIChvbmx5IHNldCBmb3IgYmxvY2sgZGV2aWNlcykgKi8KKyNkZWZpbmUgRk1PREVfRVhDTAkJKChmbW9kZV90KTB4ODApCisvKiBGaWxlIGlzIG9wZW5lZCB1c2luZyBvcGVuKC4uLCAzLCAuLikgYW5kIGlzIHdyaXRlYWJsZSBvbmx5IGZvciBpb2N0bHMKKyAgIChzcGVjaWFseSBoYWNrIGZvciBmbG9wcHkuYykgKi8KKyNkZWZpbmUgRk1PREVfV1JJVEVfSU9DVEwJKChmbW9kZV90KTB4MTAwKQorCisvKgorICogRG9uJ3QgdXBkYXRlIGN0aW1lIGFuZCBtdGltZS4KKyAqCisgKiBDdXJyZW50bHkgYSBzcGVjaWFsIGhhY2sgZm9yIHRoZSBYRlMgb3Blbl9ieV9oYW5kbGUgaW9jdGwsIGJ1dCB3ZSdsbAorICogaG9wZWZ1bGx5IGdyYWR1YXRlIGl0IHRvIGEgcHJvcGVyIE9fQ01USU1FIGZsYWcgc3VwcG9ydGVkIGJ5IG9wZW4oMikgc29vbi4KKyAqLworI2RlZmluZSBGTU9ERV9OT0NNVElNRQkJKChmbW9kZV90KTB4ODAwKQorCisvKiBFeHBlY3QgcmFuZG9tIGFjY2VzcyBwYXR0ZXJuICovCisjZGVmaW5lIEZNT0RFX1JBTkRPTQkJKChmbW9kZV90KTB4MTAwMCkKKworLyogRmlsZSBpcyBodWdlIChlZy4gL2Rldi9rbWVtKTogdHJlYXQgbG9mZl90IGFzIHVuc2lnbmVkICovCisjZGVmaW5lIEZNT0RFX1VOU0lHTkVEX09GRlNFVAkoKGZtb2RlX3QpMHgyMDAwKQorCisvKiBGaWxlIGlzIG9wZW5lZCB3aXRoIE9fUEFUSDsgYWxtb3N0IG5vdGhpbmcgY2FuIGJlIGRvbmUgd2l0aCBpdCAqLworI2RlZmluZSBGTU9ERV9QQVRICQkoKGZtb2RlX3QpMHg0MDAwKQorCisvKiBGaWxlIHdhcyBvcGVuZWQgYnkgZmFub3RpZnkgYW5kIHNob3VsZG4ndCBnZW5lcmF0ZSBmYW5vdGlmeSBldmVudHMgKi8KKyNkZWZpbmUgRk1PREVfTk9OT1RJRlkJCSgoZm1vZGVfdCkweDEwMDAwMDApCisKKy8qCisgKiBUaGUgYmVsb3cgYXJlIHRoZSB2YXJpb3VzIHJlYWQgYW5kIHdyaXRlIHR5cGVzIHRoYXQgd2Ugc3VwcG9ydC4gU29tZSBvZgorICogdGhlbSBpbmNsdWRlIGJlaGF2aW9yYWwgbW9kaWZpZXJzIHRoYXQgc2VuZCBpbmZvcm1hdGlvbiBkb3duIHRvIHRoZQorICogYmxvY2sgbGF5ZXIgYW5kIElPIHNjaGVkdWxlci4gVGVybWlub2xvZ3k6CisgKgorICoJVGhlIGJsb2NrIGxheWVyIHVzZXMgZGV2aWNlIHBsdWdnaW5nIHRvIGRlZmVyIElPIGEgbGl0dGxlIGJpdCwgaW4KKyAqCXRoZSBob3BlIHRoYXQgd2Ugd2lsbCBzZWUgbW9yZSBJTyB2ZXJ5IHNob3J0bHkuIFRoaXMgaW5jcmVhc2VzCisgKgljb2FsZXNjaW5nIG9mIGFkamFjZW50IElPIGFuZCB0aHVzIHJlZHVjZXMgdGhlIG51bWJlciBvZiBJT3Mgd2UKKyAqCWhhdmUgdG8gc2VuZCB0byB0aGUgZGV2aWNlLiBJdCBhbHNvIGFsbG93cyBmb3IgYmV0dGVyIHF1ZXVpbmcsCisgKglpZiB0aGUgSU8gaXNuJ3QgbWVyZ2VhYmxlLiBJZiB0aGUgY2FsbGVyIGlzIGdvaW5nIHRvIGJlIHdhaXRpbmcKKyAqCWZvciB0aGUgSU8sIHRoZW4gaGUgbXVzdCBlbnN1cmUgdGhhdCB0aGUgZGV2aWNlIGlzIHVucGx1Z2dlZCBzbworICoJdGhhdCB0aGUgSU8gaXMgZGlzcGF0Y2hlZCB0byB0aGUgZHJpdmVyLgorICoKKyAqCUFsbCBJTyBpcyBoYW5kbGVkIGFzeW5jIGluIExpbnV4LiBUaGlzIGlzIGZpbmUgZm9yIGJhY2tncm91bmQKKyAqCXdyaXRlcywgYnV0IGZvciByZWFkcyBvciB3cml0ZXMgdGhhdCBzb21lb25lIHdhaXRzIGZvciBjb21wbGV0aW9uCisgKglvbiwgd2Ugd2FudCB0byBub3RpZnkgdGhlIGJsb2NrIGxheWVyIGFuZCBJTyBzY2hlZHVsZXIgc28gdGhhdCB0aGV5CisgKglrbm93IGFib3V0IGl0LiBUaGF0IGFsbG93cyB0aGVtIHRvIG1ha2UgYmV0dGVyIHNjaGVkdWxpbmcKKyAqCWRlY2lzaW9ucy4gU28gd2hlbiB0aGUgYmVsb3cgcmVmZXJlbmNlcyAnc3luYycgYW5kICdhc3luYycsIGl0CisgKglpcyByZWZlcmVuY2luZyB0aGlzIHByaW9yaXR5IGhpbnQuCisgKgorICogV2l0aCB0aGF0IGluIG1pbmQsIHRoZSBhdmFpbGFibGUgdHlwZXMgYXJlOgorICoKKyAqIFJFQUQJCQlBIG5vcm1hbCByZWFkIG9wZXJhdGlvbi4gRGV2aWNlIHdpbGwgYmUgcGx1Z2dlZC4KKyAqIFJFQURfU1lOQwkJQSBzeW5jaHJvbm91cyByZWFkLiBEZXZpY2UgaXMgbm90IHBsdWdnZWQsIGNhbGxlciBjYW4KKyAqCQkJaW1tZWRpYXRlbHkgd2FpdCBvbiB0aGlzIHJlYWQgd2l0aG91dCBjYXJpbmcgYWJvdXQKKyAqCQkJdW5wbHVnZ2luZy4KKyAqIFJFQURBCQlVc2VkIGZvciByZWFkLWFoZWFkIG9wZXJhdGlvbnMuIExvd2VyIHByaW9yaXR5LCBhbmQgdGhlCisgKgkJCWJsb2NrIGxheWVyIGNvdWxkIChpbiB0aGVvcnkpIGNob29zZSB0byBpZ25vcmUgdGhpcworICoJCQlyZXF1ZXN0IGlmIGl0IHJ1bnMgaW50byByZXNvdXJjZSBwcm9ibGVtcy4KKyAqIFdSSVRFCQlBIG5vcm1hbCBhc3luYyB3cml0ZS4gRGV2aWNlIHdpbGwgYmUgcGx1Z2dlZC4KKyAqIFdSSVRFX1NZTkMJCVN5bmNocm9ub3VzIHdyaXRlLiBJZGVudGljYWwgdG8gV1JJVEUsIGJ1dCBwYXNzZXMgZG93bgorICoJCQl0aGUgaGludCB0aGF0IHNvbWVvbmUgd2lsbCBiZSB3YWl0aW5nIG9uIHRoaXMgSU8KKyAqCQkJc2hvcnRseS4gVGhlIHdyaXRlIGVxdWl2YWxlbnQgb2YgUkVBRF9TWU5DLgorICogV1JJVEVfT0RJUkVDVAlTcGVjaWFsIGNhc2Ugd3JpdGUgZm9yIE9fRElSRUNUIG9ubHkuCisgKiBXUklURV9GTFVTSAkJTGlrZSBXUklURV9TWU5DIGJ1dCB3aXRoIHByZWNlZGluZyBjYWNoZSBmbHVzaC4KKyAqIFdSSVRFX0ZVQQkJTGlrZSBXUklURV9TWU5DIGJ1dCBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgb24KKyAqCQkJbm9uLXZvbGF0aWxlIG1lZGlhIG9uIGNvbXBsZXRpb24uCisgKiBXUklURV9GTFVTSF9GVUEJQ29tYmluYXRpb24gb2YgV1JJVEVfRkxVU0ggYW5kIEZVQS4gVGhlIElPIGlzIHByZWNlZGVkCisgKgkJCWJ5IGEgY2FjaGUgZmx1c2ggYW5kIGRhdGEgaXMgZ3VhcmFudGVlZCB0byBiZSBvbgorICoJCQlub24tdm9sYXRpbGUgbWVkaWEgb24gY29tcGxldGlvbi4KKyAqCisgKi8KKyNkZWZpbmUgUldfTUFTSwkJCVJFUV9XUklURQorI2RlZmluZSBSV0FfTUFTSwkJUkVRX1JBSEVBRAorCisjZGVmaW5lIFJFQUQJCQkwCisjZGVmaW5lIFdSSVRFCQkJUldfTUFTSworI2RlZmluZSBSRUFEQQkJCVJXQV9NQVNLCisKKyNkZWZpbmUgUkVBRF9TWU5DCQkoUkVBRCB8IFJFUV9TWU5DKQorI2RlZmluZSBXUklURV9TWU5DCQkoV1JJVEUgfCBSRVFfU1lOQyB8IFJFUV9OT0lETEUpCisjZGVmaW5lIFdSSVRFX09ESVJFQ1QJCShXUklURSB8IFJFUV9TWU5DKQorI2RlZmluZSBXUklURV9GTFVTSAkJKFdSSVRFIHwgUkVRX1NZTkMgfCBSRVFfTk9JRExFIHwgUkVRX0ZMVVNIKQorI2RlZmluZSBXUklURV9GVUEJCShXUklURSB8IFJFUV9TWU5DIHwgUkVRX05PSURMRSB8IFJFUV9GVUEpCisjZGVmaW5lIFdSSVRFX0ZMVVNIX0ZVQQkJKFdSSVRFIHwgUkVRX1NZTkMgfCBSRVFfTk9JRExFIHwgUkVRX0ZMVVNIIHwgUkVRX0ZVQSkKKworI2RlZmluZSBTRUxfSU4JCTEKKyNkZWZpbmUgU0VMX09VVAkJMgorI2RlZmluZSBTRUxfRVgJCTQKKworLyogcHVibGljIGZsYWdzIGZvciBmaWxlX3N5c3RlbV90eXBlICovCisjZGVmaW5lIEZTX1JFUVVJUkVTX0RFViAxIAorI2RlZmluZSBGU19CSU5BUllfTU9VTlREQVRBIDIKKyNkZWZpbmUgRlNfSEFTX1NVQlRZUEUgNAorI2RlZmluZSBGU19SRVZBTF9ET1QJMTYzODQJLyogQ2hlY2sgdGhlIHBhdGhzICIuIiwgIi4uIiBmb3Igc3RhbGVuZXNzICovCisjZGVmaW5lIEZTX1JFTkFNRV9ET0VTX0RfTU9WRQkzMjc2OAkvKiBGUyB3aWxsIGhhbmRsZSBkX21vdmUoKQorCQkJCQkgKiBkdXJpbmcgcmVuYW1lKCkgaW50ZXJuYWxseS4KKwkJCQkJICovCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGZzLWluZGVwZW5kZW50IG1vdW50LWZsYWdzOiB1cCB0byAzMiBmbGFncyBhcmUgc3VwcG9ydGVkCisgKi8KKyNkZWZpbmUgTVNfUkRPTkxZCSAxCS8qIE1vdW50IHJlYWQtb25seSAqLworI2RlZmluZSBNU19OT1NVSUQJIDIJLyogSWdub3JlIHN1aWQgYW5kIHNnaWQgYml0cyAqLworI2RlZmluZSBNU19OT0RFVgkgNAkvKiBEaXNhbGxvdyBhY2Nlc3MgdG8gZGV2aWNlIHNwZWNpYWwgZmlsZXMgKi8KKyNkZWZpbmUgTVNfTk9FWEVDCSA4CS8qIERpc2FsbG93IHByb2dyYW0gZXhlY3V0aW9uICovCisjZGVmaW5lIE1TX1NZTkNIUk9OT1VTCTE2CS8qIFdyaXRlcyBhcmUgc3luY2VkIGF0IG9uY2UgKi8KKyNkZWZpbmUgTVNfUkVNT1VOVAkzMgkvKiBBbHRlciBmbGFncyBvZiBhIG1vdW50ZWQgRlMgKi8KKyNkZWZpbmUgTVNfTUFORExPQ0sJNjQJLyogQWxsb3cgbWFuZGF0b3J5IGxvY2tzIG9uIGFuIEZTICovCisjZGVmaW5lIE1TX0RJUlNZTkMJMTI4CS8qIERpcmVjdG9yeSBtb2RpZmljYXRpb25zIGFyZSBzeW5jaHJvbm91cyAqLworI2RlZmluZSBNU19OT0FUSU1FCTEwMjQJLyogRG8gbm90IHVwZGF0ZSBhY2Nlc3MgdGltZXMuICovCisjZGVmaW5lIE1TX05PRElSQVRJTUUJMjA0OAkvKiBEbyBub3QgdXBkYXRlIGRpcmVjdG9yeSBhY2Nlc3MgdGltZXMgKi8KKyNkZWZpbmUgTVNfQklORAkJNDA5NgorI2RlZmluZSBNU19NT1ZFCQk4MTkyCisjZGVmaW5lIE1TX1JFQwkJMTYzODQKKyNkZWZpbmUgTVNfVkVSQk9TRQkzMjc2OAkvKiBXYXIgaXMgcGVhY2UuIFZlcmJvc2l0eSBpcyBzaWxlbmNlLgorCQkJCSAgIE1TX1ZFUkJPU0UgaXMgZGVwcmVjYXRlZC4gKi8KKyNkZWZpbmUgTVNfU0lMRU5UCTMyNzY4CisjZGVmaW5lIE1TX1BPU0lYQUNMCSgxPDwxNikJLyogVkZTIGRvZXMgbm90IGFwcGx5IHRoZSB1bWFzayAqLworI2RlZmluZSBNU19VTkJJTkRBQkxFCSgxPDwxNykJLyogY2hhbmdlIHRvIHVuYmluZGFibGUgKi8KKyNkZWZpbmUgTVNfUFJJVkFURQkoMTw8MTgpCS8qIGNoYW5nZSB0byBwcml2YXRlICovCisjZGVmaW5lIE1TX1NMQVZFCSgxPDwxOSkJLyogY2hhbmdlIHRvIHNsYXZlICovCisjZGVmaW5lIE1TX1NIQVJFRAkoMTw8MjApCS8qIGNoYW5nZSB0byBzaGFyZWQgKi8KKyNkZWZpbmUgTVNfUkVMQVRJTUUJKDE8PDIxKQkvKiBVcGRhdGUgYXRpbWUgcmVsYXRpdmUgdG8gbXRpbWUvY3RpbWUuICovCisjZGVmaW5lIE1TX0tFUk5NT1VOVAkoMTw8MjIpIC8qIHRoaXMgaXMgYSBrZXJuX21vdW50IGNhbGwgKi8KKyNkZWZpbmUgTVNfSV9WRVJTSU9OCSgxPDwyMykgLyogVXBkYXRlIGlub2RlIElfdmVyc2lvbiBmaWVsZCAqLworI2RlZmluZSBNU19TVFJJQ1RBVElNRQkoMTw8MjQpIC8qIEFsd2F5cyBwZXJmb3JtIGF0aW1lIHVwZGF0ZXMgKi8KKyNkZWZpbmUgTVNfTk9TRUMJKDE8PDI4KQorI2RlZmluZSBNU19CT1JOCQkoMTw8MjkpCisjZGVmaW5lIE1TX0FDVElWRQkoMTw8MzApCisjZGVmaW5lIE1TX05PVVNFUgkoMTw8MzEpCisKKy8qCisgKiBTdXBlcmJsb2NrIGZsYWdzIHRoYXQgY2FuIGJlIGFsdGVyZWQgYnkgTVNfUkVNT1VOVAorICovCisjZGVmaW5lIE1TX1JNVF9NQVNLCShNU19SRE9OTFl8TVNfU1lOQ0hST05PVVN8TVNfTUFORExPQ0t8TVNfSV9WRVJTSU9OKQorCisvKgorICogT2xkIG1hZ2ljIG1vdW50IGZsYWcgYW5kIG1hc2sKKyAqLworI2RlZmluZSBNU19NR0NfVkFMIDB4QzBFRDAwMDAKKyNkZWZpbmUgTVNfTUdDX01TSyAweGZmZmYwMDAwCisKKy8qIElub2RlIGZsYWdzIC0gdGhleSBoYXZlIG5vdGhpbmcgdG8gc3VwZXJibG9jayBmbGFncyBub3cgKi8KKworI2RlZmluZSBTX1NZTkMJCTEJLyogV3JpdGVzIGFyZSBzeW5jZWQgYXQgb25jZSAqLworI2RlZmluZSBTX05PQVRJTUUJMgkvKiBEbyBub3QgdXBkYXRlIGFjY2VzcyB0aW1lcyAqLworI2RlZmluZSBTX0FQUEVORAk0CS8qIEFwcGVuZC1vbmx5IGZpbGUgKi8KKyNkZWZpbmUgU19JTU1VVEFCTEUJOAkvKiBJbW11dGFibGUgZmlsZSAqLworI2RlZmluZSBTX0RFQUQJCTE2CS8qIHJlbW92ZWQsIGJ1dCBzdGlsbCBvcGVuIGRpcmVjdG9yeSAqLworI2RlZmluZSBTX05PUVVPVEEJMzIJLyogSW5vZGUgaXMgbm90IGNvdW50ZWQgdG8gcXVvdGEgKi8KKyNkZWZpbmUgU19ESVJTWU5DCTY0CS8qIERpcmVjdG9yeSBtb2RpZmljYXRpb25zIGFyZSBzeW5jaHJvbm91cyAqLworI2RlZmluZSBTX05PQ01USU1FCTEyOAkvKiBEbyBub3QgdXBkYXRlIGZpbGUgYy9tdGltZSAqLworI2RlZmluZSBTX1NXQVBGSUxFCTI1NgkvKiBEbyBub3QgdHJ1bmNhdGU6IHN3YXBvbiBnb3QgaXRzIGJtYXBzICovCisjZGVmaW5lIFNfUFJJVkFURQk1MTIJLyogSW5vZGUgaXMgZnMtaW50ZXJuYWwgKi8KKyNkZWZpbmUgU19JTUEJCTEwMjQJLyogSW5vZGUgaGFzIGFuIGFzc29jaWF0ZWQgSU1BIHN0cnVjdCAqLworI2RlZmluZSBTX0FVVE9NT1VOVAkyMDQ4CS8qIEF1dG9tb3VudC9yZWZlcnJhbCBxdWFzaS1kaXJlY3RvcnkgKi8KKyNkZWZpbmUgU19OT1NFQwkJNDA5NgkvKiBubyBzdWlkIG9yIHhhdHRyIHNlY3VyaXR5IGF0dHJpYnV0ZXMgKi8KKworLyoKKyAqIE5vdGUgdGhhdCBub3N1aWQgZXRjIGZsYWdzIGFyZSBpbm9kZS1zcGVjaWZpYzogc2V0dGluZyBzb21lIGZpbGUtc3lzdGVtCisgKiBmbGFncyBqdXN0IG1lYW5zIGFsbCB0aGUgaW5vZGVzIGluaGVyaXQgdGhvc2UgZmxhZ3MgYnkgZGVmYXVsdC4gSXQgbWlnaHQgYmUKKyAqIHBvc3NpYmxlIHRvIG92ZXJyaWRlIGl0IHNlbGVjdGl2ZWx5IGlmIHlvdSByZWFsbHkgd2FudGVkIHRvIHdpdGggc29tZQorICogaW9jdGwoKSB0aGF0IGlzIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuCisgKgorICogRXhjZXB0aW9uOiBNU19SRE9OTFkgaXMgYWx3YXlzIGFwcGxpZWQgdG8gdGhlIGVudGlyZSBmaWxlIHN5c3RlbS4KKyAqCisgKiBVbmZvcnR1bmF0ZWx5LCBpdCBpcyBwb3NzaWJsZSB0byBjaGFuZ2UgYSBmaWxlc3lzdGVtcyBmbGFncyB3aXRoIGl0IG1vdW50ZWQKKyAqIHdpdGggZmlsZXMgaW4gdXNlLiAgVGhpcyBtZWFucyB0aGF0IGFsbCBvZiB0aGUgaW5vZGVzIHdpbGwgbm90IGhhdmUgdGhlaXIKKyAqIGlfZmxhZ3MgdXBkYXRlZC4gIEhlbmNlLCBpX2ZsYWdzIG5vIGxvbmdlciBpbmhlcml0IHRoZSBzdXBlcmJsb2NrIG1vdW50CisgKiBmbGFncywgc28gdGhlc2UgaGF2ZSB0byBiZSBjaGVja2VkIHNlcGFyYXRlbHkuIC0tIHJta0Bhcm0udWsubGludXgub3JnCisgKi8KKyNkZWZpbmUgX19JU19GTEcoaW5vZGUsZmxnKSAoKGlub2RlKS0+aV9zYi0+c19mbGFncyAmIChmbGcpKQorCisjZGVmaW5lIElTX1JET05MWShpbm9kZSkgKChpbm9kZSktPmlfc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisjZGVmaW5lIElTX1NZTkMoaW5vZGUpCQkoX19JU19GTEcoaW5vZGUsIE1TX1NZTkNIUk9OT1VTKSB8fCBcCisJCQkJCSgoaW5vZGUpLT5pX2ZsYWdzICYgU19TWU5DKSkKKyNkZWZpbmUgSVNfRElSU1lOQyhpbm9kZSkJKF9fSVNfRkxHKGlub2RlLCBNU19TWU5DSFJPTk9VU3xNU19ESVJTWU5DKSB8fCBcCisJCQkJCSgoaW5vZGUpLT5pX2ZsYWdzICYgKFNfU1lOQ3xTX0RJUlNZTkMpKSkKKyNkZWZpbmUgSVNfTUFORExPQ0soaW5vZGUpCV9fSVNfRkxHKGlub2RlLCBNU19NQU5ETE9DSykKKyNkZWZpbmUgSVNfTk9BVElNRShpbm9kZSkgICBfX0lTX0ZMRyhpbm9kZSwgTVNfUkRPTkxZfE1TX05PQVRJTUUpCisjZGVmaW5lIElTX0lfVkVSU0lPTihpbm9kZSkgICBfX0lTX0ZMRyhpbm9kZSwgTVNfSV9WRVJTSU9OKQorCisjZGVmaW5lIElTX05PUVVPVEEoaW5vZGUpCSgoaW5vZGUpLT5pX2ZsYWdzICYgU19OT1FVT1RBKQorI2RlZmluZSBJU19BUFBFTkQoaW5vZGUpCSgoaW5vZGUpLT5pX2ZsYWdzICYgU19BUFBFTkQpCisjZGVmaW5lIElTX0lNTVVUQUJMRShpbm9kZSkJKChpbm9kZSktPmlfZmxhZ3MgJiBTX0lNTVVUQUJMRSkKKyNkZWZpbmUgSVNfUE9TSVhBQ0woaW5vZGUpCV9fSVNfRkxHKGlub2RlLCBNU19QT1NJWEFDTCkKKworI2RlZmluZSBJU19ERUFERElSKGlub2RlKQkoKGlub2RlKS0+aV9mbGFncyAmIFNfREVBRCkKKyNkZWZpbmUgSVNfTk9DTVRJTUUoaW5vZGUpCSgoaW5vZGUpLT5pX2ZsYWdzICYgU19OT0NNVElNRSkKKyNkZWZpbmUgSVNfU1dBUEZJTEUoaW5vZGUpCSgoaW5vZGUpLT5pX2ZsYWdzICYgU19TV0FQRklMRSkKKyNkZWZpbmUgSVNfUFJJVkFURShpbm9kZSkJKChpbm9kZSktPmlfZmxhZ3MgJiBTX1BSSVZBVEUpCisjZGVmaW5lIElTX0lNQShpbm9kZSkJCSgoaW5vZGUpLT5pX2ZsYWdzICYgU19JTUEpCisjZGVmaW5lIElTX0FVVE9NT1VOVChpbm9kZSkJKChpbm9kZSktPmlfZmxhZ3MgJiBTX0FVVE9NT1VOVCkKKyNkZWZpbmUgSVNfTk9TRUMoaW5vZGUpCQkoKGlub2RlKS0+aV9mbGFncyAmIFNfTk9TRUMpCisKKy8qIHRoZSByZWFkLW9ubHkgc3R1ZmYgZG9lc24ndCByZWFsbHkgYmVsb25nIGhlcmUsIGJ1dCBhbnkgb3RoZXIgcGxhY2UgaXMKKyAgIHByb2JhYmx5IGFzIGJhZCBhbmQgSSBkb24ndCB3YW50IHRvIGNyZWF0ZSB5ZXQgYW5vdGhlciBpbmNsdWRlIGZpbGUuICovCisKKyNkZWZpbmUgQkxLUk9TRVQgICBfSU8oMHgxMiw5MykJLyogc2V0IGRldmljZSByZWFkLW9ubHkgKDAgPSByZWFkLXdyaXRlKSAqLworI2RlZmluZSBCTEtST0dFVCAgIF9JTygweDEyLDk0KQkvKiBnZXQgcmVhZC1vbmx5IHN0YXR1cyAoMCA9IHJlYWRfd3JpdGUpICovCisjZGVmaW5lIEJMS1JSUEFSVCAgX0lPKDB4MTIsOTUpCS8qIHJlLXJlYWQgcGFydGl0aW9uIHRhYmxlICovCisjZGVmaW5lIEJMS0dFVFNJWkUgX0lPKDB4MTIsOTYpCS8qIHJldHVybiBkZXZpY2Ugc2l6ZSAvNTEyIChsb25nICphcmcpICovCisjZGVmaW5lIEJMS0ZMU0JVRiAgX0lPKDB4MTIsOTcpCS8qIGZsdXNoIGJ1ZmZlciBjYWNoZSAqLworI2RlZmluZSBCTEtSQVNFVCAgIF9JTygweDEyLDk4KQkvKiBzZXQgcmVhZCBhaGVhZCBmb3IgYmxvY2sgZGV2aWNlICovCisjZGVmaW5lIEJMS1JBR0VUICAgX0lPKDB4MTIsOTkpCS8qIGdldCBjdXJyZW50IHJlYWQgYWhlYWQgc2V0dGluZyAqLworI2RlZmluZSBCTEtGUkFTRVQgIF9JTygweDEyLDEwMCkvKiBzZXQgZmlsZXN5c3RlbSAobW0vZmlsZW1hcC5jKSByZWFkLWFoZWFkICovCisjZGVmaW5lIEJMS0ZSQUdFVCAgX0lPKDB4MTIsMTAxKS8qIGdldCBmaWxlc3lzdGVtIChtbS9maWxlbWFwLmMpIHJlYWQtYWhlYWQgKi8KKyNkZWZpbmUgQkxLU0VDVFNFVCBfSU8oMHgxMiwxMDIpLyogc2V0IG1heCBzZWN0b3JzIHBlciByZXF1ZXN0IChsbF9yd19ibGsuYykgKi8KKyNkZWZpbmUgQkxLU0VDVEdFVCBfSU8oMHgxMiwxMDMpLyogZ2V0IG1heCBzZWN0b3JzIHBlciByZXF1ZXN0IChsbF9yd19ibGsuYykgKi8KKyNkZWZpbmUgQkxLU1NaR0VUICBfSU8oMHgxMiwxMDQpLyogZ2V0IGJsb2NrIGRldmljZSBzZWN0b3Igc2l6ZSAqLworI2lmIDAKKyNkZWZpbmUgQkxLUEcgICAgICBfSU8oMHgxMiwxMDUpLyogU2VlIGJsa3BnLmggKi8KKworLyogU29tZSBwZW9wbGUgYXJlIG1vcm9ucy4gIERvIG5vdCB1c2Ugc2l6ZW9mISAqLworCisjZGVmaW5lIEJMS0VMVkdFVCAgX0lPUigweDEyLDEwNixzaXplX3QpLyogZWxldmF0b3IgZ2V0ICovCisjZGVmaW5lIEJMS0VMVlNFVCAgX0lPVygweDEyLDEwNyxzaXplX3QpLyogZWxldmF0b3Igc2V0ICovCisvKiBUaGlzIHdhcyBoZXJlIGp1c3QgdG8gc2hvdyB0aGF0IHRoZSBudW1iZXIgaXMgdGFrZW4gLQorICAgcHJvYmFibHkgYWxsIHRoZXNlIF9JTygweDEyLCopIGlvY3RscyBzaG91bGQgYmUgbW92ZWQgdG8gYmxrcGcuaC4gKi8KKyNlbmRpZgorLyogQSBqdW1wIGhlcmU6IDEwOC0xMTEgaGF2ZSBiZWVuIHVzZWQgZm9yIHZhcmlvdXMgcHJpdmF0ZSBwdXJwb3Nlcy4gKi8KKyNkZWZpbmUgQkxLQlNaR0VUICBfSU9SKDB4MTIsMTEyLHNpemVfdCkKKyNkZWZpbmUgQkxLQlNaU0VUICBfSU9XKDB4MTIsMTEzLHNpemVfdCkKKyNkZWZpbmUgQkxLR0VUU0laRTY0IF9JT1IoMHgxMiwxMTQsc2l6ZV90KQkvKiByZXR1cm4gZGV2aWNlIHNpemUgaW4gYnl0ZXMgKHU2NCAqYXJnKSAqLworI2RlZmluZSBCTEtUUkFDRVNFVFVQIF9JT1dSKDB4MTIsMTE1LHN0cnVjdCBibGtfdXNlcl90cmFjZV9zZXR1cCkKKyNkZWZpbmUgQkxLVFJBQ0VTVEFSVCBfSU8oMHgxMiwxMTYpCisjZGVmaW5lIEJMS1RSQUNFU1RPUCBfSU8oMHgxMiwxMTcpCisjZGVmaW5lIEJMS1RSQUNFVEVBUkRPV04gX0lPKDB4MTIsMTE4KQorI2RlZmluZSBCTEtESVNDQVJEIF9JTygweDEyLDExOSkKKyNkZWZpbmUgQkxLSU9NSU4gX0lPKDB4MTIsMTIwKQorI2RlZmluZSBCTEtJT09QVCBfSU8oMHgxMiwxMjEpCisjZGVmaW5lIEJMS0FMSUdOT0ZGIF9JTygweDEyLDEyMikKKyNkZWZpbmUgQkxLUEJTWkdFVCBfSU8oMHgxMiwxMjMpCisjZGVmaW5lIEJMS0RJU0NBUkRaRVJPRVMgX0lPKDB4MTIsMTI0KQorI2RlZmluZSBCTEtTRUNESVNDQVJEIF9JTygweDEyLDEyNSkKKworI2RlZmluZSBCTUFQX0lPQ1RMIDEJCS8qIG9ic29sZXRlIC0ga2VwdCBmb3IgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBGSUJNQVAJICAgX0lPKDB4MDAsMSkJLyogYm1hcCBhY2Nlc3MgKi8KKyNkZWZpbmUgRklHRVRCU1ogICBfSU8oMHgwMCwyKQkvKiBnZXQgdGhlIGJsb2NrIHNpemUgdXNlZCBmb3IgYm1hcCAqLworI2RlZmluZSBGSUZSRUVaRQlfSU9XUignWCcsIDExOSwgaW50KQkvKiBGcmVlemUgKi8KKyNkZWZpbmUgRklUSEFXCQlfSU9XUignWCcsIDEyMCwgaW50KQkvKiBUaGF3ICovCisjZGVmaW5lIEZJVFJJTQkJX0lPV1IoJ1gnLCAxMjEsIHN0cnVjdCBmc3RyaW1fcmFuZ2UpCS8qIFRyaW0gKi8KKworI2RlZmluZQlGU19JT0NfR0VURkxBR1MJCQlfSU9SKCdmJywgMSwgbG9uZykKKyNkZWZpbmUJRlNfSU9DX1NFVEZMQUdTCQkJX0lPVygnZicsIDIsIGxvbmcpCisjZGVmaW5lCUZTX0lPQ19HRVRWRVJTSU9OCQlfSU9SKCd2JywgMSwgbG9uZykKKyNkZWZpbmUJRlNfSU9DX1NFVFZFUlNJT04JCV9JT1coJ3YnLCAyLCBsb25nKQorI2RlZmluZSBGU19JT0NfRklFTUFQCQkJX0lPV1IoJ2YnLCAxMSwgc3RydWN0IGZpZW1hcCkKKyNkZWZpbmUgRlNfSU9DMzJfR0VURkxBR1MJCV9JT1IoJ2YnLCAxLCBpbnQpCisjZGVmaW5lIEZTX0lPQzMyX1NFVEZMQUdTCQlfSU9XKCdmJywgMiwgaW50KQorI2RlZmluZSBGU19JT0MzMl9HRVRWRVJTSU9OCQlfSU9SKCd2JywgMSwgaW50KQorI2RlZmluZSBGU19JT0MzMl9TRVRWRVJTSU9OCQlfSU9XKCd2JywgMiwgaW50KQorCisvKgorICogSW5vZGUgZmxhZ3MgKEZTX0lPQ19HRVRGTEFHUyAvIEZTX0lPQ19TRVRGTEFHUykKKyAqLworI2RlZmluZQlGU19TRUNSTV9GTAkJCTB4MDAwMDAwMDEgLyogU2VjdXJlIGRlbGV0aW9uICovCisjZGVmaW5lCUZTX1VOUk1fRkwJCQkweDAwMDAwMDAyIC8qIFVuZGVsZXRlICovCisjZGVmaW5lCUZTX0NPTVBSX0ZMCQkJMHgwMDAwMDAwNCAvKiBDb21wcmVzcyBmaWxlICovCisjZGVmaW5lIEZTX1NZTkNfRkwJCQkweDAwMDAwMDA4IC8qIFN5bmNocm9ub3VzIHVwZGF0ZXMgKi8KKyNkZWZpbmUgRlNfSU1NVVRBQkxFX0ZMCQkJMHgwMDAwMDAxMCAvKiBJbW11dGFibGUgZmlsZSAqLworI2RlZmluZSBGU19BUFBFTkRfRkwJCQkweDAwMDAwMDIwIC8qIHdyaXRlcyB0byBmaWxlIG1heSBvbmx5IGFwcGVuZCAqLworI2RlZmluZSBGU19OT0RVTVBfRkwJCQkweDAwMDAwMDQwIC8qIGRvIG5vdCBkdW1wIGZpbGUgKi8KKyNkZWZpbmUgRlNfTk9BVElNRV9GTAkJCTB4MDAwMDAwODAgLyogZG8gbm90IHVwZGF0ZSBhdGltZSAqLworLyogUmVzZXJ2ZWQgZm9yIGNvbXByZXNzaW9uIHVzYWdlLi4uICovCisjZGVmaW5lIEZTX0RJUlRZX0ZMCQkJMHgwMDAwMDEwMAorI2RlZmluZSBGU19DT01QUkJMS19GTAkJCTB4MDAwMDAyMDAgLyogT25lIG9yIG1vcmUgY29tcHJlc3NlZCBjbHVzdGVycyAqLworI2RlZmluZSBGU19OT0NPTVBfRkwJCQkweDAwMDAwNDAwIC8qIERvbid0IGNvbXByZXNzICovCisjZGVmaW5lIEZTX0VDT01QUl9GTAkJCTB4MDAwMDA4MDAgLyogQ29tcHJlc3Npb24gZXJyb3IgKi8KKy8qIEVuZCBjb21wcmVzc2lvbiBmbGFncyAtLS0gbWF5YmUgbm90IGFsbCB1c2VkICovCisjZGVmaW5lIEZTX0JUUkVFX0ZMCQkJMHgwMDAwMTAwMCAvKiBidHJlZSBmb3JtYXQgZGlyICovCisjZGVmaW5lIEZTX0lOREVYX0ZMCQkJMHgwMDAwMTAwMCAvKiBoYXNoLWluZGV4ZWQgZGlyZWN0b3J5ICovCisjZGVmaW5lIEZTX0lNQUdJQ19GTAkJCTB4MDAwMDIwMDAgLyogQUZTIGRpcmVjdG9yeSAqLworI2RlZmluZSBGU19KT1VSTkFMX0RBVEFfRkwJCTB4MDAwMDQwMDAgLyogUmVzZXJ2ZWQgZm9yIGV4dDMgKi8KKyNkZWZpbmUgRlNfTk9UQUlMX0ZMCQkJMHgwMDAwODAwMCAvKiBmaWxlIHRhaWwgc2hvdWxkIG5vdCBiZSBtZXJnZWQgKi8KKyNkZWZpbmUgRlNfRElSU1lOQ19GTAkJCTB4MDAwMTAwMDAgLyogZGlyc3luYyBiZWhhdmlvdXIgKGRpcmVjdG9yaWVzIG9ubHkpICovCisjZGVmaW5lIEZTX1RPUERJUl9GTAkJCTB4MDAwMjAwMDAgLyogVG9wIG9mIGRpcmVjdG9yeSBoaWVyYXJjaGllcyovCisjZGVmaW5lIEZTX0VYVEVOVF9GTAkJCTB4MDAwODAwMDAgLyogRXh0ZW50cyAqLworI2RlZmluZSBGU19ESVJFQ1RJT19GTAkJCTB4MDAxMDAwMDAgLyogVXNlIGRpcmVjdCBpL28gKi8KKyNkZWZpbmUgRlNfTk9DT1dfRkwJCQkweDAwODAwMDAwIC8qIERvIG5vdCBjb3cgZmlsZSAqLworI2RlZmluZSBGU19SRVNFUlZFRF9GTAkJCTB4ODAwMDAwMDAgLyogcmVzZXJ2ZWQgZm9yIGV4dDIgbGliICovCisKKyNkZWZpbmUgRlNfRkxfVVNFUl9WSVNJQkxFCQkweDAwMDNERkZGIC8qIFVzZXIgdmlzaWJsZSBmbGFncyAqLworI2RlZmluZSBGU19GTF9VU0VSX01PRElGSUFCTEUJCTB4MDAwMzgwRkYgLyogVXNlciBtb2RpZmlhYmxlIGZsYWdzICovCisKKworI2RlZmluZSBTWU5DX0ZJTEVfUkFOR0VfV0FJVF9CRUZPUkUJMQorI2RlZmluZSBTWU5DX0ZJTEVfUkFOR0VfV1JJVEUJCTIKKyNkZWZpbmUgU1lOQ19GSUxFX1JBTkdFX1dBSVRfQUZURVIJNAorCisjZW5kaWYgLyogX0xJTlVYX0ZTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZnNsX2h5cGVydmlzb3IuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZnNsX2h5cGVydmlzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzgyMTU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mc2xfaHlwZXJ2aXNvci5oCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogRnJlZXNjYWxlIGh5cGVydmlzb3IgaW9jdGwgYW5kIGtlcm5lbCBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQXV0aG9yOiBUaW11ciBUYWJpIDx0aW11ckBmcmVlc2NhbGUuY29tPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgImFzIGlzIiBhbmQgYW55CisgKiBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisgKiB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlCisgKiBkaXNjbGFpbWVkLiBJbiBubyBldmVudCBzaGFsbCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBiZSBsaWFibGUgZm9yIGFueQorICogZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKyAqIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKyAqIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkIGFuZAorICogb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksIG9yIHRvcnQKKyAqIChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzCisgKiBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgdXNlZCBieSB0aGUgRnJlZXNjYWxlIGh5cGVydmlzb3IgbWFuYWdlbWVudCBkcml2ZXIuICBJdCBjYW4KKyAqIGFsc28gYmUgaW5jbHVkZWQgYnkgYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBkcml2ZXIKKyAqIHZpYSB0aGUgaW9jdGwgaW50ZXJmYWNlLgorICovCisKKyNpZm5kZWYgRlNMX0hZUEVSVklTT1JfSAorI2RlZmluZSBGU0xfSFlQRVJWSVNPUl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKioKKyAqIHN0cnVjdCBmc2xfaHZfaW9jdGxfcmVzdGFydCAtIHJlc3RhcnQgYSBwYXJ0aXRpb24KKyAqIEByZXQ6IHJldHVybiBlcnJvciBjb2RlIGZyb20gdGhlIGh5cGVydmlzb3IKKyAqIEBwYXJ0aXRpb246IHRoZSBJRCBvZiB0aGUgcGFydGl0aW9uIHRvIHJlc3RhcnQsIG9yIC0xIGZvciB0aGUKKyAqICAgICAgICAgICAgIGNhbGxpbmcgcGFydGl0aW9uCisgKgorICogVXNlZCBieSBGU0xfSFZfSU9DVExfUEFSVElUSU9OX1JFU1RBUlQKKyAqLworc3RydWN0IGZzbF9odl9pb2N0bF9yZXN0YXJ0IHsKKwlfX3UzMiByZXQ7CisJX191MzIgcGFydGl0aW9uOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZnNsX2h2X2lvY3RsX3N0YXR1cyAtIGdldCBhIHBhcnRpdGlvbidzIHN0YXR1cworICogQHJldDogcmV0dXJuIGVycm9yIGNvZGUgZnJvbSB0aGUgaHlwZXJ2aXNvcgorICogQHBhcnRpdGlvbjogdGhlIElEIG9mIHRoZSBwYXJ0aXRpb24gdG8gcXVlcnksIG9yIC0xIGZvciB0aGUKKyAqICAgICAgICAgICAgIGNhbGxpbmcgcGFydGl0aW9uCisgKiBAc3RhdHVzOiBUaGUgcmV0dXJuZWQgc3RhdHVzIG9mIHRoZSBwYXJ0aXRpb24KKyAqCisgKiBVc2VkIGJ5IEZTTF9IVl9JT0NUTF9QQVJUSVRJT05fR0VUX1NUQVRVUworICoKKyAqIFZhbHVlcyBvZiAnc3RhdHVzJzoKKyAqICAgIDAgPSBTdG9wcGVkCisgKiAgICAxID0gUnVubmluZworICogICAgMiA9IFN0YXJ0aW5nCisgKiAgICAzID0gU3RvcHBpbmcKKyAqLworc3RydWN0IGZzbF9odl9pb2N0bF9zdGF0dXMgeworCV9fdTMyIHJldDsKKwlfX3UzMiBwYXJ0aXRpb247CisJX191MzIgc3RhdHVzOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZnNsX2h2X2lvY3RsX3N0YXJ0IC0gc3RhcnQgYSBwYXJ0aXRpb24KKyAqIEByZXQ6IHJldHVybiBlcnJvciBjb2RlIGZyb20gdGhlIGh5cGVydmlzb3IKKyAqIEBwYXJ0aXRpb246IHRoZSBJRCBvZiB0aGUgcGFydGl0aW9uIHRvIGNvbnRyb2wKKyAqIEBlbnRyeV9wb2ludDogVGhlIG9mZnNldCB3aXRoaW4gdGhlIGd1ZXN0IElNQSB0byBzdGFydCBleGVjdXRpb24KKyAqIEBsb2FkOiBJZiBub24temVybywgcmVsb2FkIHRoZSBwYXJ0aXRpb24ncyBpbWFnZXMgYmVmb3JlIHN0YXJ0aW5nCisgKgorICogVXNlZCBieSBGU0xfSFZfSU9DVExfUEFSVElUSU9OX1NUQVJUCisgKi8KK3N0cnVjdCBmc2xfaHZfaW9jdGxfc3RhcnQgeworCV9fdTMyIHJldDsKKwlfX3UzMiBwYXJ0aXRpb247CisJX191MzIgZW50cnlfcG9pbnQ7CisJX191MzIgbG9hZDsKK307CisKKy8qKgorICogc3RydWN0IGZzbF9odl9pb2N0bF9zdG9wIC0gc3RvcCBhIHBhcnRpdGlvbgorICogQHJldDogcmV0dXJuIGVycm9yIGNvZGUgZnJvbSB0aGUgaHlwZXJ2aXNvcgorICogQHBhcnRpdGlvbjogdGhlIElEIG9mIHRoZSBwYXJ0aXRpb24gdG8gc3RvcCwgb3IgLTEgZm9yIHRoZSBjYWxsaW5nCisgKiAgICAgICAgICAgICBwYXJ0aXRpb24KKyAqCisgKiBVc2VkIGJ5IEZTTF9IVl9JT0NUTF9QQVJUSVRJT05fU1RPUAorICovCitzdHJ1Y3QgZnNsX2h2X2lvY3RsX3N0b3AgeworCV9fdTMyIHJldDsKKwlfX3UzMiBwYXJ0aXRpb247Cit9OworCisvKioKKyAqIHN0cnVjdCBmc2xfaHZfaW9jdGxfbWVtY3B5IC0gY29weSBtZW1vcnkgYmV0d2VlbiBwYXJ0aXRpb25zCisgKiBAcmV0OiByZXR1cm4gZXJyb3IgY29kZSBmcm9tIHRoZSBoeXBlcnZpc29yCisgKiBAc291cmNlOiB0aGUgcGFydGl0aW9uIElEIG9mIHRoZSBzb3VyY2UgcGFydGl0aW9uLCBvciAtMSBmb3IgdGhpcworICogICAgICAgICAgcGFydGl0aW9uCisgKiBAdGFyZ2V0OiB0aGUgcGFydGl0aW9uIElEIG9mIHRoZSB0YXJnZXQgcGFydGl0aW9uLCBvciAtMSBmb3IgdGhpcworICogICAgICAgICAgcGFydGl0aW9uCisgKiBAcmVzZXJ2ZWQ6IHJlc2VydmVkLCBtdXN0IGJlIHNldCB0byAwCisgKiBAbG9jYWxfYWRkcjogdXNlci1zcGFjZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgYSBidWZmZXIgaW4gdGhlIGxvY2FsCisgKiAgICAgICAgICAgICAgcGFydGl0aW9uCisgKiBAcmVtb3RlX2FkZHI6IGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBidWZmZXIgaW4gdGhlCisgKiAgICAgICAgICAgcmVtb3RlIHBhcnRpdGlvbgorICogQGNvdW50OiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuICBCb3RoIHRoZSBsb2NhbCBhbmQgcmVtb3RlCisgKiAgICAgICAgIGJ1ZmZlcnMgbXVzdCBiZSBhdCBsZWFzdCAnY291bnQnIGJ5dGVzIGxvbmcKKyAqCisgKiBVc2VkIGJ5IEZTTF9IVl9JT0NUTF9NRU1DUFkKKyAqCisgKiBUaGUgJ2xvY2FsJyBwYXJ0aXRpb24gaXMgdGhlIHBhcnRpdGlvbiB0aGF0IGNhbGxzIHRoaXMgaW9jdGwuICBUaGUKKyAqICdyZW1vdGUnIHBhcnRpdGlvbiBpcyBhIGRpZmZlcmVudCBwYXJ0aXRpb24uICBUaGUgZGF0YSBpcyBjb3BpZWQgZnJvbQorICogdGhlICdzb3VyY2UnIHBhcml0aXRpb24nIHRvIHRoZSAndGFyZ2V0JyBwYXJ0aXRpb24uCisgKgorICogVGhlIGJ1ZmZlciBpbiB0aGUgcmVtb3RlIHBhcnRpdGlvbiBtdXN0IGJlIGd1ZXN0IHBoeXNpY2FsbHkKKyAqIGNvbnRpZ3VvdXMuCisgKgorICogVGhpcyBpb2N0bCBkb2VzIG5vdCBzdXBwb3J0IGNvcHlpbmcgbWVtb3J5IGJldHdlZW4gdHdvIHJlbW90ZQorICogcGFydGl0aW9ucyBvciB3aXRoaW4gdGhlIHNhbWUgcGFydGl0aW9uLCBzbyBlaXRoZXIgJ3NvdXJjZScgb3IKKyAqICd0YXJnZXQnIChidXQgbm90IGJvdGgpIG11c3QgYmUgLTEuICBJbiBvdGhlciB3b3JkcywgZWl0aGVyCisgKgorICogICAgICBzb3VyY2UgPT0gbG9jYWwgYW5kIHRhcmdldCA9PSByZW1vdGUKKyAqIG9yCisgKiAgICAgIHNvdXJjZSA9PSByZW1vdGUgYW5kIHRhcmdldCA9PSBsb2NhbAorICovCitzdHJ1Y3QgZnNsX2h2X2lvY3RsX21lbWNweSB7CisJX191MzIgcmV0OworCV9fdTMyIHNvdXJjZTsKKwlfX3UzMiB0YXJnZXQ7CisJX191MzIgcmVzZXJ2ZWQ7CS8qIHBhZGRpbmcgdG8gZW5zdXJlIGxvY2FsX3ZhZGRyIGlzIGFsaWduZWQgKi8KKwlfX3U2NCBsb2NhbF92YWRkcjsKKwlfX3U2NCByZW1vdGVfcGFkZHI7CisJX191NjQgY291bnQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBmc2xfaHZfaW9jdGxfZG9vcmJlbGwgLSByaW5nIGEgZG9vcmJlbGwKKyAqIEByZXQ6IHJldHVybiBlcnJvciBjb2RlIGZyb20gdGhlIGh5cGVydmlzb3IKKyAqIEBkb29yYmVsbDogdGhlIGhhbmRsZSBvZiB0aGUgZG9vcmJlbGwgdG8gcmluZyBkb29yYmVsbAorICoKKyAqIFVzZWQgYnkgRlNMX0hWX0lPQ1RMX0RPT1JCRUxMCisgKi8KK3N0cnVjdCBmc2xfaHZfaW9jdGxfZG9vcmJlbGwgeworCV9fdTMyIHJldDsKKwlfX3UzMiBkb29yYmVsbDsKK307CisKKy8qKgorICogc3RydWN0IGZzbF9odl9pb2N0bF9wcm9wIC0gZ2V0L3NldCBhIGRldmljZSB0cmVlIHByb3BlcnR5CisgKiBAcmV0OiByZXR1cm4gZXJyb3IgY29kZSBmcm9tIHRoZSBoeXBlcnZpc29yCisgKiBAaGFuZGxlOiBoYW5kbGUgb2YgcGFydGl0aW9uIHdob3NlIHRyZWUgdG8gYWNjZXNzCisgKiBAcGF0aDogdmlydHVhbCBhZGRyZXNzIG9mIHBhdGggbmFtZSBvZiBub2RlIHRvIGFjY2VzcworICogQHByb3BuYW1lOiB2aXJ0dWFsIGFkZHJlc3Mgb2YgbmFtZSBvZiBwcm9wZXJ0eSB0byBhY2Nlc3MKKyAqIEBwcm9wdmFsOiB2aXJ0dWFsIGFkZHJlc3Mgb2YgcHJvcGVydHkgZGF0YSBidWZmZXIKKyAqIEBwcm9wbGVuOiBTaXplIG9mIHByb3BlcnR5IGRhdGEgYnVmZmVyCisgKiBAcmVzZXJ2ZWQ6IHJlc2VydmVkLCBtdXN0IGJlIHNldCB0byAwCisgKgorICogVXNlZCBieSBGU0xfSFZfSU9DVExfRE9PUkJFTEwKKyAqLworc3RydWN0IGZzbF9odl9pb2N0bF9wcm9wIHsKKwlfX3UzMiByZXQ7CisJX191MzIgaGFuZGxlOworCV9fdTY0IHBhdGg7CisJX191NjQgcHJvcG5hbWU7CisJX191NjQgcHJvcHZhbDsKKwlfX3UzMiBwcm9wbGVuOworCV9fdTMyIHJlc2VydmVkOwkvKiBwYWRkaW5nIHRvIGVuc3VyZSBzdHJ1Y3R1cmUgaXMgYWxpZ25lZCAqLworfTsKKworLyogVGhlIGlvY3RsIHR5cGUsIGRvY3VtZW50ZWQgaW4gaW9jdGwtbnVtYmVyLnR4dCAqLworI2RlZmluZSBGU0xfSFZfSU9DVExfVFlQRQkweEFGCisKKy8qIFJlc3RhcnQgYW5vdGhlciBwYXJ0aXRpb24gKi8KKyNkZWZpbmUgRlNMX0hWX0lPQ1RMX1BBUlRJVElPTl9SRVNUQVJUIFwKKwlfSU9XUihGU0xfSFZfSU9DVExfVFlQRSwgMSwgc3RydWN0IGZzbF9odl9pb2N0bF9yZXN0YXJ0KQorCisvKiBHZXQgYSBwYXJ0aXRpb24ncyBzdGF0dXMgKi8KKyNkZWZpbmUgRlNMX0hWX0lPQ1RMX1BBUlRJVElPTl9HRVRfU1RBVFVTIFwKKwlfSU9XUihGU0xfSFZfSU9DVExfVFlQRSwgMiwgc3RydWN0IGZzbF9odl9pb2N0bF9zdGF0dXMpCisKKy8qIEJvb3QgYW5vdGhlciBwYXJ0aXRpb24gKi8KKyNkZWZpbmUgRlNMX0hWX0lPQ1RMX1BBUlRJVElPTl9TVEFSVCBcCisJX0lPV1IoRlNMX0hWX0lPQ1RMX1RZUEUsIDMsIHN0cnVjdCBmc2xfaHZfaW9jdGxfc3RhcnQpCisKKy8qIFN0b3AgdGhpcyBvciBhbm90aGVyIHBhcnRpdGlvbiAqLworI2RlZmluZSBGU0xfSFZfSU9DVExfUEFSVElUSU9OX1NUT1AgXAorCV9JT1dSKEZTTF9IVl9JT0NUTF9UWVBFLCA0LCBzdHJ1Y3QgZnNsX2h2X2lvY3RsX3N0b3ApCisKKy8qIENvcHkgZGF0YSBmcm9tIG9uZSBwYXJ0aXRpb24gdG8gYW5vdGhlciAqLworI2RlZmluZSBGU0xfSFZfSU9DVExfTUVNQ1BZIFwKKwlfSU9XUihGU0xfSFZfSU9DVExfVFlQRSwgNSwgc3RydWN0IGZzbF9odl9pb2N0bF9tZW1jcHkpCisKKy8qIFJpbmcgYSBkb29yYmVsbCAqLworI2RlZmluZSBGU0xfSFZfSU9DVExfRE9PUkJFTEwgXAorCV9JT1dSKEZTTF9IVl9JT0NUTF9UWVBFLCA2LCBzdHJ1Y3QgZnNsX2h2X2lvY3RsX2Rvb3JiZWxsKQorCisvKiBHZXQgYSBwcm9wZXJ0eSBmcm9tIGFub3RoZXIgZ3Vlc3QncyBkZXZpY2UgdHJlZSAqLworI2RlZmluZSBGU0xfSFZfSU9DVExfR0VUUFJPUCBcCisJX0lPV1IoRlNMX0hWX0lPQ1RMX1RZUEUsIDcsIHN0cnVjdCBmc2xfaHZfaW9jdGxfcHJvcCkKKworLyogU2V0IGEgcHJvcGVydHkgaW4gYW5vdGhlciBndWVzdCdzIGRldmljZSB0cmVlICovCisjZGVmaW5lIEZTTF9IVl9JT0NUTF9TRVRQUk9QIFwKKwlfSU9XUihGU0xfSFZfSU9DVExfVFlQRSwgOCwgc3RydWN0IGZzbF9odl9pb2N0bF9wcm9wKQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mdXNlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Z1c2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjRjZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mdXNlLmgKQEAgLTAsMCArMSw2MzQgQEAKKy8qCisgICAgRlVTRTogRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgorCisgICAgVGhpcyBwcm9ncmFtIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwuCisgICAgU2VlIHRoZSBmaWxlIENPUFlJTkcuCisqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGtlcm5lbCBpbnRlcmZhY2Ugb2YgRlVTRQorICoKKyAqIFByb3RvY29sIGNoYW5nZWxvZzoKKyAqCisgKiA3Ljk6CisgKiAgLSBuZXcgZnVzZV9nZXRhdHRyX2luIGlucHV0IGFyZ3VtZW50IG9mIEdFVEFUVFIKKyAqICAtIGFkZCBsa19mbGFncyBpbiBmdXNlX2xrX2luCisgKiAgLSBhZGQgbG9ja19vd25lciBmaWVsZCB0byBmdXNlX3NldGF0dHJfaW4sIGZ1c2VfcmVhZF9pbiBhbmQgZnVzZV93cml0ZV9pbgorICogIC0gYWRkIGJsa3NpemUgZmllbGQgdG8gZnVzZV9hdHRyCisgKiAgLSBhZGQgZmlsZSBmbGFncyBmaWVsZCB0byBmdXNlX3JlYWRfaW4gYW5kIGZ1c2Vfd3JpdGVfaW4KKyAqCisgKiA3LjEwCisgKiAgLSBhZGQgbm9uc2Vla2FibGUgb3BlbiBmbGFnCisgKgorICogNy4xMQorICogIC0gYWRkIElPQ1RMIG1lc3NhZ2UKKyAqICAtIGFkZCB1bnNvbGljaXRlZCBub3RpZmljYXRpb24gc3VwcG9ydAorICogIC0gYWRkIFBPTEwgbWVzc2FnZSBhbmQgTk9USUZZX1BPTEwgbm90aWZpY2F0aW9uCisgKgorICogNy4xMgorICogIC0gYWRkIHVtYXNrIGZsYWcgdG8gaW5wdXQgYXJndW1lbnQgb2Ygb3BlbiwgbWtub2QgYW5kIG1rZGlyCisgKiAgLSBhZGQgbm90aWZpY2F0aW9uIG1lc3NhZ2VzIGZvciBpbnZhbGlkYXRpb24gb2YgaW5vZGVzIGFuZAorICogICAgZGlyZWN0b3J5IGVudHJpZXMKKyAqCisgKiA3LjEzCisgKiAgLSBtYWtlIG1heCBudW1iZXIgb2YgYmFja2dyb3VuZCByZXF1ZXN0cyBhbmQgY29uZ2VzdGlvbiB0aHJlc2hvbGQKKyAqICAgIHR1bmFibGVzCisgKgorICogNy4xNAorICogIC0gYWRkIHNwbGljZSBzdXBwb3J0IHRvIGZ1c2UgZGV2aWNlCisgKgorICogNy4xNQorICogIC0gYWRkIHN0b3JlIG5vdGlmeQorICogIC0gYWRkIHJldHJpZXZlIG5vdGlmeQorICoKKyAqIDcuMTYKKyAqICAtIGFkZCBCQVRDSF9GT1JHRVQgcmVxdWVzdAorICogIC0gRlVTRV9JT0NUTF9VTlJFU1RSSUNURUQgc2hhbGwgbm93IHJldHVybiB3aXRoIGFycmF5IG9mICdzdHJ1Y3QKKyAqICAgIGZ1c2VfaW9jdGxfaW92ZWMnIGluc3RlYWQgb2YgYW1iaWd1b3VzICdzdHJ1Y3QgaW92ZWMnCisgKiAgLSBhZGQgRlVTRV9JT0NUTF8zMkJJVCBmbGFnCisgKgorICogNy4xNworICogIC0gYWRkIEZVU0VfRkxPQ0tfTE9DS1MgYW5kIEZVU0VfUkVMRUFTRV9GTE9DS19VTkxPQ0sKKyAqLworCisjaWZuZGVmIF9MSU5VWF9GVVNFX0gKKyNkZWZpbmUgX0xJTlVYX0ZVU0VfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIFZlcnNpb24gbmVnb3RpYXRpb246CisgKgorICogQm90aCB0aGUga2VybmVsIGFuZCB1c2Vyc3BhY2Ugc2VuZCB0aGUgdmVyc2lvbiB0aGV5IHN1cHBvcnQgaW4gdGhlCisgKiBJTklUIHJlcXVlc3QgYW5kIHJlcGx5IHJlc3BlY3RpdmVseS4KKyAqCisgKiBJZiB0aGUgbWFqb3IgdmVyc2lvbnMgbWF0Y2ggdGhlbiBib3RoIHNoYWxsIHVzZSB0aGUgc21hbGxlc3QKKyAqIG9mIHRoZSB0d28gbWlub3IgdmVyc2lvbnMgZm9yIGNvbW11bmljYXRpb24uCisgKgorICogSWYgdGhlIGtlcm5lbCBzdXBwb3J0cyBhIGxhcmdlciBtYWpvciB2ZXJzaW9uLCB0aGVuIHVzZXJzcGFjZSBzaGFsbAorICogcmVwbHkgd2l0aCB0aGUgbWFqb3IgdmVyc2lvbiBpdCBzdXBwb3J0cywgaWdub3JlIHRoZSByZXN0IG9mIHRoZQorICogSU5JVCBtZXNzYWdlIGFuZCBleHBlY3QgYSBuZXcgSU5JVCBtZXNzYWdlIGZyb20gdGhlIGtlcm5lbCB3aXRoIGEKKyAqIG1hdGNoaW5nIG1ham9yIHZlcnNpb24uCisgKgorICogSWYgdGhlIGxpYnJhcnkgc3VwcG9ydHMgYSBsYXJnZXIgbWFqb3IgdmVyc2lvbiwgdGhlbiBpdCBzaGFsbCBmYWxsCisgKiBiYWNrIHRvIHRoZSBtYWpvciBwcm90b2NvbCB2ZXJzaW9uIHNlbnQgYnkgdGhlIGtlcm5lbCBmb3IKKyAqIGNvbW11bmljYXRpb24gYW5kIHJlcGx5IHdpdGggdGhhdCBtYWpvciB2ZXJzaW9uIChhbmQgYW4gYXJiaXRyYXJ5CisgKiBzdXBwb3J0ZWQgbWlub3IgdmVyc2lvbikuCisgKi8KKworLyoqIFZlcnNpb24gbnVtYmVyIG9mIHRoaXMgaW50ZXJmYWNlICovCisjZGVmaW5lIEZVU0VfS0VSTkVMX1ZFUlNJT04gNworCisvKiogTWlub3IgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgRlVTRV9LRVJORUxfTUlOT1JfVkVSU0lPTiAxNworCisvKiogVGhlIG5vZGUgSUQgb2YgdGhlIHJvb3QgaW5vZGUgKi8KKyNkZWZpbmUgRlVTRV9ST09UX0lEIDEKKworLyogTWFrZSBzdXJlIGFsbCBzdHJ1Y3R1cmVzIGFyZSBwYWRkZWQgdG8gNjRiaXQgYm91bmRhcnksIHNvIDMyYml0CisgICB1c2Vyc3BhY2Ugd29ya3MgdW5kZXIgNjRiaXQga2VybmVscyAqLworCitzdHJ1Y3QgZnVzZV9hdHRyIHsKKwlfX3U2NAlpbm87CisJX191NjQJc2l6ZTsKKwlfX3U2NAlibG9ja3M7CisJX191NjQJYXRpbWU7CisJX191NjQJbXRpbWU7CisJX191NjQJY3RpbWU7CisJX191MzIJYXRpbWVuc2VjOworCV9fdTMyCW10aW1lbnNlYzsKKwlfX3UzMgljdGltZW5zZWM7CisJX191MzIJbW9kZTsKKwlfX3UzMglubGluazsKKwlfX3UzMgl1aWQ7CisJX191MzIJZ2lkOworCV9fdTMyCXJkZXY7CisJX191MzIJYmxrc2l6ZTsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2Vfa3N0YXRmcyB7CisJX191NjQJYmxvY2tzOworCV9fdTY0CWJmcmVlOworCV9fdTY0CWJhdmFpbDsKKwlfX3U2NAlmaWxlczsKKwlfX3U2NAlmZnJlZTsKKwlfX3UzMglic2l6ZTsKKwlfX3UzMgluYW1lbGVuOworCV9fdTMyCWZyc2l6ZTsKKwlfX3UzMglwYWRkaW5nOworCV9fdTMyCXNwYXJlWzZdOworfTsKKworc3RydWN0IGZ1c2VfZmlsZV9sb2NrIHsKKwlfX3U2NAlzdGFydDsKKwlfX3U2NAllbmQ7CisJX191MzIJdHlwZTsKKwlfX3UzMglwaWQ7IC8qIHRnaWQgKi8KK307CisKKy8qKgorICogQml0bWFza3MgZm9yIGZ1c2Vfc2V0YXR0cl9pbi52YWxpZAorICovCisjZGVmaW5lIEZBVFRSX01PREUJKDEgPDwgMCkKKyNkZWZpbmUgRkFUVFJfVUlECSgxIDw8IDEpCisjZGVmaW5lIEZBVFRSX0dJRAkoMSA8PCAyKQorI2RlZmluZSBGQVRUUl9TSVpFCSgxIDw8IDMpCisjZGVmaW5lIEZBVFRSX0FUSU1FCSgxIDw8IDQpCisjZGVmaW5lIEZBVFRSX01USU1FCSgxIDw8IDUpCisjZGVmaW5lIEZBVFRSX0ZICSgxIDw8IDYpCisjZGVmaW5lIEZBVFRSX0FUSU1FX05PVwkoMSA8PCA3KQorI2RlZmluZSBGQVRUUl9NVElNRV9OT1cJKDEgPDwgOCkKKyNkZWZpbmUgRkFUVFJfTE9DS09XTkVSCSgxIDw8IDkpCisKKy8qKgorICogRmxhZ3MgcmV0dXJuZWQgYnkgdGhlIE9QRU4gcmVxdWVzdAorICoKKyAqIEZPUEVOX0RJUkVDVF9JTzogYnlwYXNzIHBhZ2UgY2FjaGUgZm9yIHRoaXMgb3BlbiBmaWxlCisgKiBGT1BFTl9LRUVQX0NBQ0hFOiBkb24ndCBpbnZhbGlkYXRlIHRoZSBkYXRhIGNhY2hlIG9uIG9wZW4KKyAqIEZPUEVOX05PTlNFRUtBQkxFOiB0aGUgZmlsZSBpcyBub3Qgc2Vla2FibGUKKyAqLworI2RlZmluZSBGT1BFTl9ESVJFQ1RfSU8JCSgxIDw8IDApCisjZGVmaW5lIEZPUEVOX0tFRVBfQ0FDSEUJKDEgPDwgMSkKKyNkZWZpbmUgRk9QRU5fTk9OU0VFS0FCTEUJKDEgPDwgMikKKworLyoqCisgKiBJTklUIHJlcXVlc3QvcmVwbHkgZmxhZ3MKKyAqCisgKiBGVVNFX1BPU0lYX0xPQ0tTOiByZW1vdGUgbG9ja2luZyBmb3IgUE9TSVggZmlsZSBsb2NrcworICogRlVTRV9FWFBPUlRfU1VQUE9SVDogZmlsZXN5c3RlbSBoYW5kbGVzIGxvb2t1cHMgb2YgIi4iIGFuZCAiLi4iCisgKiBGVVNFX0RPTlRfTUFTSzogZG9uJ3QgYXBwbHkgdW1hc2sgdG8gZmlsZSBtb2RlIG9uIGNyZWF0ZSBvcGVyYXRpb25zCisgKiBGVVNFX0ZMT0NLX0xPQ0tTOiByZW1vdGUgbG9ja2luZyBmb3IgQlNEIHN0eWxlIGZpbGUgbG9ja3MKKyAqLworI2RlZmluZSBGVVNFX0FTWU5DX1JFQUQJCSgxIDw8IDApCisjZGVmaW5lIEZVU0VfUE9TSVhfTE9DS1MJKDEgPDwgMSkKKyNkZWZpbmUgRlVTRV9GSUxFX09QUwkJKDEgPDwgMikKKyNkZWZpbmUgRlVTRV9BVE9NSUNfT19UUlVOQwkoMSA8PCAzKQorI2RlZmluZSBGVVNFX0VYUE9SVF9TVVBQT1JUCSgxIDw8IDQpCisjZGVmaW5lIEZVU0VfQklHX1dSSVRFUwkJKDEgPDwgNSkKKyNkZWZpbmUgRlVTRV9ET05UX01BU0sJCSgxIDw8IDYpCisjZGVmaW5lIEZVU0VfRkxPQ0tfTE9DS1MJKDEgPDwgMTApCisKKy8qKgorICogQ1VTRSBJTklUIHJlcXVlc3QvcmVwbHkgZmxhZ3MKKyAqCisgKiBDVVNFX1VOUkVTVFJJQ1RFRF9JT0NUTDogIHVzZSB1bnJlc3RyaWN0ZWQgaW9jdGwKKyAqLworI2RlZmluZSBDVVNFX1VOUkVTVFJJQ1RFRF9JT0NUTAkoMSA8PCAwKQorCisvKioKKyAqIFJlbGVhc2UgZmxhZ3MKKyAqLworI2RlZmluZSBGVVNFX1JFTEVBU0VfRkxVU0gJKDEgPDwgMCkKKyNkZWZpbmUgRlVTRV9SRUxFQVNFX0ZMT0NLX1VOTE9DSwkoMSA8PCAxKQorCisvKioKKyAqIEdldGF0dHIgZmxhZ3MKKyAqLworI2RlZmluZSBGVVNFX0dFVEFUVFJfRkgJCSgxIDw8IDApCisKKy8qKgorICogTG9jayBmbGFncworICovCisjZGVmaW5lIEZVU0VfTEtfRkxPQ0sJCSgxIDw8IDApCisKKy8qKgorICogV1JJVEUgZmxhZ3MKKyAqCisgKiBGVVNFX1dSSVRFX0NBQ0hFOiBkZWxheWVkIHdyaXRlIGZyb20gcGFnZSBjYWNoZSwgZmlsZSBoYW5kbGUgaXMgZ3Vlc3NlZAorICogRlVTRV9XUklURV9MT0NLT1dORVI6IGxvY2tfb3duZXIgZmllbGQgaXMgdmFsaWQKKyAqLworI2RlZmluZSBGVVNFX1dSSVRFX0NBQ0hFCSgxIDw8IDApCisjZGVmaW5lIEZVU0VfV1JJVEVfTE9DS09XTkVSCSgxIDw8IDEpCisKKy8qKgorICogUmVhZCBmbGFncworICovCisjZGVmaW5lIEZVU0VfUkVBRF9MT0NLT1dORVIJKDEgPDwgMSkKKworLyoqCisgKiBJb2N0bCBmbGFncworICoKKyAqIEZVU0VfSU9DVExfQ09NUEFUOiAzMmJpdCBjb21wYXQgaW9jdGwgb24gNjRiaXQgbWFjaGluZQorICogRlVTRV9JT0NUTF9VTlJFU1RSSUNURUQ6IG5vdCByZXN0cmljdGVkIHRvIHdlbGwtZm9ybWVkIGlvY3RscywgcmV0cnkgYWxsb3dlZAorICogRlVTRV9JT0NUTF9SRVRSWTogcmV0cnkgd2l0aCBuZXcgaW92ZWNzCisgKiBGVVNFX0lPQ1RMXzMyQklUOiAzMmJpdCBpb2N0bAorICoKKyAqIEZVU0VfSU9DVExfTUFYX0lPVjogbWF4aW11bSBvZiBpbl9pb3ZlY3MgKyBvdXRfaW92ZWNzCisgKi8KKyNkZWZpbmUgRlVTRV9JT0NUTF9DT01QQVQJKDEgPDwgMCkKKyNkZWZpbmUgRlVTRV9JT0NUTF9VTlJFU1RSSUNURUQJKDEgPDwgMSkKKyNkZWZpbmUgRlVTRV9JT0NUTF9SRVRSWQkoMSA8PCAyKQorI2RlZmluZSBGVVNFX0lPQ1RMXzMyQklUCSgxIDw8IDMpCisKKyNkZWZpbmUgRlVTRV9JT0NUTF9NQVhfSU9WCTI1NgorCisvKioKKyAqIFBvbGwgZmxhZ3MKKyAqCisgKiBGVVNFX1BPTExfU0NIRURVTEVfTk9USUZZOiByZXF1ZXN0IHBvbGwgbm90aWZ5CisgKi8KKyNkZWZpbmUgRlVTRV9QT0xMX1NDSEVEVUxFX05PVElGWSAoMSA8PCAwKQorCitlbnVtIGZ1c2Vfb3Bjb2RlIHsKKwlGVVNFX0xPT0tVUAkgICA9IDEsCisJRlVTRV9GT1JHRVQJICAgPSAyLCAgLyogbm8gcmVwbHkgKi8KKwlGVVNFX0dFVEFUVFIJICAgPSAzLAorCUZVU0VfU0VUQVRUUgkgICA9IDQsCisJRlVTRV9SRUFETElOSwkgICA9IDUsCisJRlVTRV9TWU1MSU5LCSAgID0gNiwKKwlGVVNFX01LTk9ECSAgID0gOCwKKwlGVVNFX01LRElSCSAgID0gOSwKKwlGVVNFX1VOTElOSwkgICA9IDEwLAorCUZVU0VfUk1ESVIJICAgPSAxMSwKKwlGVVNFX1JFTkFNRQkgICA9IDEyLAorCUZVU0VfTElOSwkgICA9IDEzLAorCUZVU0VfT1BFTgkgICA9IDE0LAorCUZVU0VfUkVBRAkgICA9IDE1LAorCUZVU0VfV1JJVEUJICAgPSAxNiwKKwlGVVNFX1NUQVRGUwkgICA9IDE3LAorCUZVU0VfUkVMRUFTRSAgICAgICA9IDE4LAorCUZVU0VfRlNZTkMgICAgICAgICA9IDIwLAorCUZVU0VfU0VUWEFUVFIgICAgICA9IDIxLAorCUZVU0VfR0VUWEFUVFIgICAgICA9IDIyLAorCUZVU0VfTElTVFhBVFRSICAgICA9IDIzLAorCUZVU0VfUkVNT1ZFWEFUVFIgICA9IDI0LAorCUZVU0VfRkxVU0ggICAgICAgICA9IDI1LAorCUZVU0VfSU5JVCAgICAgICAgICA9IDI2LAorCUZVU0VfT1BFTkRJUiAgICAgICA9IDI3LAorCUZVU0VfUkVBRERJUiAgICAgICA9IDI4LAorCUZVU0VfUkVMRUFTRURJUiAgICA9IDI5LAorCUZVU0VfRlNZTkNESVIgICAgICA9IDMwLAorCUZVU0VfR0VUTEsgICAgICAgICA9IDMxLAorCUZVU0VfU0VUTEsgICAgICAgICA9IDMyLAorCUZVU0VfU0VUTEtXICAgICAgICA9IDMzLAorCUZVU0VfQUNDRVNTICAgICAgICA9IDM0LAorCUZVU0VfQ1JFQVRFICAgICAgICA9IDM1LAorCUZVU0VfSU5URVJSVVBUICAgICA9IDM2LAorCUZVU0VfQk1BUCAgICAgICAgICA9IDM3LAorCUZVU0VfREVTVFJPWSAgICAgICA9IDM4LAorCUZVU0VfSU9DVEwgICAgICAgICA9IDM5LAorCUZVU0VfUE9MTCAgICAgICAgICA9IDQwLAorCUZVU0VfTk9USUZZX1JFUExZICA9IDQxLAorCUZVU0VfQkFUQ0hfRk9SR0VUICA9IDQyLAorCisJLyogQ1VTRSBzcGVjaWZpYyBvcGVyYXRpb25zICovCisJQ1VTRV9JTklUICAgICAgICAgID0gNDA5NiwKK307CisKK2VudW0gZnVzZV9ub3RpZnlfY29kZSB7CisJRlVTRV9OT1RJRllfUE9MTCAgID0gMSwKKwlGVVNFX05PVElGWV9JTlZBTF9JTk9ERSA9IDIsCisJRlVTRV9OT1RJRllfSU5WQUxfRU5UUlkgPSAzLAorCUZVU0VfTk9USUZZX1NUT1JFID0gNCwKKwlGVVNFX05PVElGWV9SRVRSSUVWRSA9IDUsCisJRlVTRV9OT1RJRllfQ09ERV9NQVgsCit9OworCisvKiBUaGUgcmVhZCBidWZmZXIgaXMgcmVxdWlyZWQgdG8gYmUgYXQgbGVhc3QgOGssIGJ1dCBtYXkgYmUgbXVjaCBsYXJnZXIgKi8KKyNkZWZpbmUgRlVTRV9NSU5fUkVBRF9CVUZGRVIgODE5MgorCisjZGVmaW5lIEZVU0VfQ09NUEFUX0VOVFJZX09VVF9TSVpFIDEyMAorCitzdHJ1Y3QgZnVzZV9lbnRyeV9vdXQgeworCV9fdTY0CW5vZGVpZDsJCS8qIElub2RlIElEICovCisJX191NjQJZ2VuZXJhdGlvbjsJLyogSW5vZGUgZ2VuZXJhdGlvbjogbm9kZWlkOmdlbiBtdXN0CisJCQkJICAgYmUgdW5pcXVlIGZvciB0aGUgZnMncyBsaWZldGltZSAqLworCV9fdTY0CWVudHJ5X3ZhbGlkOwkvKiBDYWNoZSB0aW1lb3V0IGZvciB0aGUgbmFtZSAqLworCV9fdTY0CWF0dHJfdmFsaWQ7CS8qIENhY2hlIHRpbWVvdXQgZm9yIHRoZSBhdHRyaWJ1dGVzICovCisJX191MzIJZW50cnlfdmFsaWRfbnNlYzsKKwlfX3UzMglhdHRyX3ZhbGlkX25zZWM7CisJc3RydWN0IGZ1c2VfYXR0ciBhdHRyOworfTsKKworc3RydWN0IGZ1c2VfZm9yZ2V0X2luIHsKKwlfX3U2NAlubG9va3VwOworfTsKKworc3RydWN0IGZ1c2VfZm9yZ2V0X29uZSB7CisJX191NjQJbm9kZWlkOworCV9fdTY0CW5sb29rdXA7Cit9OworCitzdHJ1Y3QgZnVzZV9iYXRjaF9mb3JnZXRfaW4geworCV9fdTMyCWNvdW50OworCV9fdTMyCWR1bW15OworfTsKKworc3RydWN0IGZ1c2VfZ2V0YXR0cl9pbiB7CisJX191MzIJZ2V0YXR0cl9mbGFnczsKKwlfX3UzMglkdW1teTsKKwlfX3U2NAlmaDsKK307CisKKyNkZWZpbmUgRlVTRV9DT01QQVRfQVRUUl9PVVRfU0laRSA5NgorCitzdHJ1Y3QgZnVzZV9hdHRyX291dCB7CisJX191NjQJYXR0cl92YWxpZDsJLyogQ2FjaGUgdGltZW91dCBmb3IgdGhlIGF0dHJpYnV0ZXMgKi8KKwlfX3UzMglhdHRyX3ZhbGlkX25zZWM7CisJX191MzIJZHVtbXk7CisJc3RydWN0IGZ1c2VfYXR0ciBhdHRyOworfTsKKworI2RlZmluZSBGVVNFX0NPTVBBVF9NS05PRF9JTl9TSVpFIDgKKworc3RydWN0IGZ1c2VfbWtub2RfaW4geworCV9fdTMyCW1vZGU7CisJX191MzIJcmRldjsKKwlfX3UzMgl1bWFzazsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2VfbWtkaXJfaW4geworCV9fdTMyCW1vZGU7CisJX191MzIJdW1hc2s7Cit9OworCitzdHJ1Y3QgZnVzZV9yZW5hbWVfaW4geworCV9fdTY0CW5ld2RpcjsKK307CisKK3N0cnVjdCBmdXNlX2xpbmtfaW4geworCV9fdTY0CW9sZG5vZGVpZDsKK307CisKK3N0cnVjdCBmdXNlX3NldGF0dHJfaW4geworCV9fdTMyCXZhbGlkOworCV9fdTMyCXBhZGRpbmc7CisJX191NjQJZmg7CisJX191NjQJc2l6ZTsKKwlfX3U2NAlsb2NrX293bmVyOworCV9fdTY0CWF0aW1lOworCV9fdTY0CW10aW1lOworCV9fdTY0CXVudXNlZDI7CisJX191MzIJYXRpbWVuc2VjOworCV9fdTMyCW10aW1lbnNlYzsKKwlfX3UzMgl1bnVzZWQzOworCV9fdTMyCW1vZGU7CisJX191MzIJdW51c2VkNDsKKwlfX3UzMgl1aWQ7CisJX191MzIJZ2lkOworCV9fdTMyCXVudXNlZDU7Cit9OworCitzdHJ1Y3QgZnVzZV9vcGVuX2luIHsKKwlfX3UzMglmbGFnczsKKwlfX3UzMgl1bnVzZWQ7Cit9OworCitzdHJ1Y3QgZnVzZV9jcmVhdGVfaW4geworCV9fdTMyCWZsYWdzOworCV9fdTMyCW1vZGU7CisJX191MzIJdW1hc2s7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX29wZW5fb3V0IHsKKwlfX3U2NAlmaDsKKwlfX3UzMglvcGVuX2ZsYWdzOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9yZWxlYXNlX2luIHsKKwlfX3U2NAlmaDsKKwlfX3UzMglmbGFnczsKKwlfX3UzMglyZWxlYXNlX2ZsYWdzOworCV9fdTY0CWxvY2tfb3duZXI7Cit9OworCitzdHJ1Y3QgZnVzZV9mbHVzaF9pbiB7CisJX191NjQJZmg7CisJX191MzIJdW51c2VkOworCV9fdTMyCXBhZGRpbmc7CisJX191NjQJbG9ja19vd25lcjsKK307CisKK3N0cnVjdCBmdXNlX3JlYWRfaW4geworCV9fdTY0CWZoOworCV9fdTY0CW9mZnNldDsKKwlfX3UzMglzaXplOworCV9fdTMyCXJlYWRfZmxhZ3M7CisJX191NjQJbG9ja19vd25lcjsKKwlfX3UzMglmbGFnczsKKwlfX3UzMglwYWRkaW5nOworfTsKKworI2RlZmluZSBGVVNFX0NPTVBBVF9XUklURV9JTl9TSVpFIDI0CisKK3N0cnVjdCBmdXNlX3dyaXRlX2luIHsKKwlfX3U2NAlmaDsKKwlfX3U2NAlvZmZzZXQ7CisJX191MzIJc2l6ZTsKKwlfX3UzMgl3cml0ZV9mbGFnczsKKwlfX3U2NAlsb2NrX293bmVyOworCV9fdTMyCWZsYWdzOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV93cml0ZV9vdXQgeworCV9fdTMyCXNpemU7CisJX191MzIJcGFkZGluZzsKK307CisKKyNkZWZpbmUgRlVTRV9DT01QQVRfU1RBVEZTX1NJWkUgNDgKKworc3RydWN0IGZ1c2Vfc3RhdGZzX291dCB7CisJc3RydWN0IGZ1c2Vfa3N0YXRmcyBzdDsKK307CisKK3N0cnVjdCBmdXNlX2ZzeW5jX2luIHsKKwlfX3U2NAlmaDsKKwlfX3UzMglmc3luY19mbGFnczsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2Vfc2V0eGF0dHJfaW4geworCV9fdTMyCXNpemU7CisJX191MzIJZmxhZ3M7Cit9OworCitzdHJ1Y3QgZnVzZV9nZXR4YXR0cl9pbiB7CisJX191MzIJc2l6ZTsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2VfZ2V0eGF0dHJfb3V0IHsKKwlfX3UzMglzaXplOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9sa19pbiB7CisJX191NjQJZmg7CisJX191NjQJb3duZXI7CisJc3RydWN0IGZ1c2VfZmlsZV9sb2NrIGxrOworCV9fdTMyCWxrX2ZsYWdzOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9sa19vdXQgeworCXN0cnVjdCBmdXNlX2ZpbGVfbG9jayBsazsKK307CisKK3N0cnVjdCBmdXNlX2FjY2Vzc19pbiB7CisJX191MzIJbWFzazsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2VfaW5pdF9pbiB7CisJX191MzIJbWFqb3I7CisJX191MzIJbWlub3I7CisJX191MzIJbWF4X3JlYWRhaGVhZDsKKwlfX3UzMglmbGFnczsKK307CisKK3N0cnVjdCBmdXNlX2luaXRfb3V0IHsKKwlfX3UzMgltYWpvcjsKKwlfX3UzMgltaW5vcjsKKwlfX3UzMgltYXhfcmVhZGFoZWFkOworCV9fdTMyCWZsYWdzOworCV9fdTE2ICAgbWF4X2JhY2tncm91bmQ7CisJX191MTYgICBjb25nZXN0aW9uX3RocmVzaG9sZDsKKwlfX3UzMgltYXhfd3JpdGU7Cit9OworCisjZGVmaW5lIENVU0VfSU5JVF9JTkZPX01BWCA0MDk2CisKK3N0cnVjdCBjdXNlX2luaXRfaW4geworCV9fdTMyCW1ham9yOworCV9fdTMyCW1pbm9yOworCV9fdTMyCXVudXNlZDsKKwlfX3UzMglmbGFnczsKK307CisKK3N0cnVjdCBjdXNlX2luaXRfb3V0IHsKKwlfX3UzMgltYWpvcjsKKwlfX3UzMgltaW5vcjsKKwlfX3UzMgl1bnVzZWQ7CisJX191MzIJZmxhZ3M7CisJX191MzIJbWF4X3JlYWQ7CisJX191MzIJbWF4X3dyaXRlOworCV9fdTMyCWRldl9tYWpvcjsJCS8qIGNoYXJkZXYgbWFqb3IgKi8KKwlfX3UzMglkZXZfbWlub3I7CQkvKiBjaGFyZGV2IG1pbm9yICovCisJX191MzIJc3BhcmVbMTBdOworfTsKKworc3RydWN0IGZ1c2VfaW50ZXJydXB0X2luIHsKKwlfX3U2NAl1bmlxdWU7Cit9OworCitzdHJ1Y3QgZnVzZV9ibWFwX2luIHsKKwlfX3U2NAlibG9jazsKKwlfX3UzMglibG9ja3NpemU7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX2JtYXBfb3V0IHsKKwlfX3U2NAlibG9jazsKK307CisKK3N0cnVjdCBmdXNlX2lvY3RsX2luIHsKKwlfX3U2NAlmaDsKKwlfX3UzMglmbGFnczsKKwlfX3UzMgljbWQ7CisJX191NjQJYXJnOworCV9fdTMyCWluX3NpemU7CisJX191MzIJb3V0X3NpemU7Cit9OworCitzdHJ1Y3QgZnVzZV9pb2N0bF9pb3ZlYyB7CisJX191NjQJYmFzZTsKKwlfX3U2NAlsZW47Cit9OworCitzdHJ1Y3QgZnVzZV9pb2N0bF9vdXQgeworCV9fczMyCXJlc3VsdDsKKwlfX3UzMglmbGFnczsKKwlfX3UzMglpbl9pb3ZzOworCV9fdTMyCW91dF9pb3ZzOworfTsKKworc3RydWN0IGZ1c2VfcG9sbF9pbiB7CisJX191NjQJZmg7CisJX191NjQJa2g7CisJX191MzIJZmxhZ3M7CisJX191MzIgICBwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2VfcG9sbF9vdXQgeworCV9fdTMyCXJldmVudHM7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX25vdGlmeV9wb2xsX3dha2V1cF9vdXQgeworCV9fdTY0CWtoOworfTsKKworc3RydWN0IGZ1c2VfaW5faGVhZGVyIHsKKwlfX3UzMglsZW47CisJX191MzIJb3Bjb2RlOworCV9fdTY0CXVuaXF1ZTsKKwlfX3U2NAlub2RlaWQ7CisJX191MzIJdWlkOworCV9fdTMyCWdpZDsKKwlfX3UzMglwaWQ7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX291dF9oZWFkZXIgeworCV9fdTMyCWxlbjsKKwlfX3MzMgllcnJvcjsKKwlfX3U2NAl1bmlxdWU7Cit9OworCitzdHJ1Y3QgZnVzZV9kaXJlbnQgeworCV9fdTY0CWlubzsKKwlfX3U2NAlvZmY7CisJX191MzIJbmFtZWxlbjsKKwlfX3UzMgl0eXBlOworCWNoYXIgbmFtZVswXTsKK307CisKKyNkZWZpbmUgRlVTRV9OQU1FX09GRlNFVCBvZmZzZXRvZihzdHJ1Y3QgZnVzZV9kaXJlbnQsIG5hbWUpCisjZGVmaW5lIEZVU0VfRElSRU5UX0FMSUdOKHgpICgoKHgpICsgc2l6ZW9mKF9fdTY0KSAtIDEpICYgfihzaXplb2YoX191NjQpIC0gMSkpCisjZGVmaW5lIEZVU0VfRElSRU5UX1NJWkUoZCkgXAorCUZVU0VfRElSRU5UX0FMSUdOKEZVU0VfTkFNRV9PRkZTRVQgKyAoZCktPm5hbWVsZW4pCisKK3N0cnVjdCBmdXNlX25vdGlmeV9pbnZhbF9pbm9kZV9vdXQgeworCV9fdTY0CWlubzsKKwlfX3M2NAlvZmY7CisJX19zNjQJbGVuOworfTsKKworc3RydWN0IGZ1c2Vfbm90aWZ5X2ludmFsX2VudHJ5X291dCB7CisJX191NjQJcGFyZW50OworCV9fdTMyCW5hbWVsZW47CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX25vdGlmeV9zdG9yZV9vdXQgeworCV9fdTY0CW5vZGVpZDsKKwlfX3U2NAlvZmZzZXQ7CisJX191MzIJc2l6ZTsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2Vfbm90aWZ5X3JldHJpZXZlX291dCB7CisJX191NjQJbm90aWZ5X3VuaXF1ZTsKKwlfX3U2NAlub2RlaWQ7CisJX191NjQJb2Zmc2V0OworCV9fdTMyCXNpemU7CisJX191MzIJcGFkZGluZzsKK307CisKKy8qIE1hdGNoZXMgdGhlIHNpemUgb2YgZnVzZV93cml0ZV9pbiAqLworc3RydWN0IGZ1c2Vfbm90aWZ5X3JldHJpZXZlX2luIHsKKwlfX3U2NAlkdW1teTE7CisJX191NjQJb2Zmc2V0OworCV9fdTMyCXNpemU7CisJX191MzIJZHVtbXkyOworCV9fdTY0CWR1bW15MzsKKwlfX3U2NAlkdW1teTQ7Cit9OworCisjZW5kaWYgLyogX0xJTlVYX0ZVU0VfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mdXRleC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMTFlOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Z1dGV4LmgKQEAgLTAsMCArMSwxNTIgQEAKKyNpZm5kZWYgX0xJTlVYX0ZVVEVYX0gKKyNkZWZpbmUgX0xJTlVYX0ZVVEVYX0gKKworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogU2Vjb25kIGFyZ3VtZW50IHRvIGZ1dGV4IHN5c2NhbGwgKi8KKworCisjZGVmaW5lIEZVVEVYX1dBSVQJCTAKKyNkZWZpbmUgRlVURVhfV0FLRQkJMQorI2RlZmluZSBGVVRFWF9GRAkJMgorI2RlZmluZSBGVVRFWF9SRVFVRVVFCQkzCisjZGVmaW5lIEZVVEVYX0NNUF9SRVFVRVVFCTQKKyNkZWZpbmUgRlVURVhfV0FLRV9PUAkJNQorI2RlZmluZSBGVVRFWF9MT0NLX1BJCQk2CisjZGVmaW5lIEZVVEVYX1VOTE9DS19QSQkJNworI2RlZmluZSBGVVRFWF9UUllMT0NLX1BJCTgKKyNkZWZpbmUgRlVURVhfV0FJVF9CSVRTRVQJOQorI2RlZmluZSBGVVRFWF9XQUtFX0JJVFNFVAkxMAorI2RlZmluZSBGVVRFWF9XQUlUX1JFUVVFVUVfUEkJMTEKKyNkZWZpbmUgRlVURVhfQ01QX1JFUVVFVUVfUEkJMTIKKworI2RlZmluZSBGVVRFWF9QUklWQVRFX0ZMQUcJMTI4CisjZGVmaW5lIEZVVEVYX0NMT0NLX1JFQUxUSU1FCTI1NgorI2RlZmluZSBGVVRFWF9DTURfTUFTSwkJfihGVVRFWF9QUklWQVRFX0ZMQUcgfCBGVVRFWF9DTE9DS19SRUFMVElNRSkKKworI2RlZmluZSBGVVRFWF9XQUlUX1BSSVZBVEUJKEZVVEVYX1dBSVQgfCBGVVRFWF9QUklWQVRFX0ZMQUcpCisjZGVmaW5lIEZVVEVYX1dBS0VfUFJJVkFURQkoRlVURVhfV0FLRSB8IEZVVEVYX1BSSVZBVEVfRkxBRykKKyNkZWZpbmUgRlVURVhfUkVRVUVVRV9QUklWQVRFCShGVVRFWF9SRVFVRVVFIHwgRlVURVhfUFJJVkFURV9GTEFHKQorI2RlZmluZSBGVVRFWF9DTVBfUkVRVUVVRV9QUklWQVRFIChGVVRFWF9DTVBfUkVRVUVVRSB8IEZVVEVYX1BSSVZBVEVfRkxBRykKKyNkZWZpbmUgRlVURVhfV0FLRV9PUF9QUklWQVRFCShGVVRFWF9XQUtFX09QIHwgRlVURVhfUFJJVkFURV9GTEFHKQorI2RlZmluZSBGVVRFWF9MT0NLX1BJX1BSSVZBVEUJKEZVVEVYX0xPQ0tfUEkgfCBGVVRFWF9QUklWQVRFX0ZMQUcpCisjZGVmaW5lIEZVVEVYX1VOTE9DS19QSV9QUklWQVRFCShGVVRFWF9VTkxPQ0tfUEkgfCBGVVRFWF9QUklWQVRFX0ZMQUcpCisjZGVmaW5lIEZVVEVYX1RSWUxPQ0tfUElfUFJJVkFURSAoRlVURVhfVFJZTE9DS19QSSB8IEZVVEVYX1BSSVZBVEVfRkxBRykKKyNkZWZpbmUgRlVURVhfV0FJVF9CSVRTRVRfUFJJVkFURQkoRlVURVhfV0FJVF9CSVRTRVQgfCBGVVRFWF9QUklWQVRFX0ZMQUcpCisjZGVmaW5lIEZVVEVYX1dBS0VfQklUU0VUX1BSSVZBVEUJKEZVVEVYX1dBS0VfQklUU0VUIHwgRlVURVhfUFJJVkFURV9GTEFHKQorI2RlZmluZSBGVVRFWF9XQUlUX1JFUVVFVUVfUElfUFJJVkFURQkoRlVURVhfV0FJVF9SRVFVRVVFX1BJIHwgXAorCQkJCQkgRlVURVhfUFJJVkFURV9GTEFHKQorI2RlZmluZSBGVVRFWF9DTVBfUkVRVUVVRV9QSV9QUklWQVRFCShGVVRFWF9DTVBfUkVRVUVVRV9QSSB8IFwKKwkJCQkJIEZVVEVYX1BSSVZBVEVfRkxBRykKKworLyoKKyAqIFN1cHBvcnQgZm9yIHJvYnVzdCBmdXRleGVzOiB0aGUga2VybmVsIGNsZWFucyB1cCBoZWxkIGZ1dGV4ZXMgYXQKKyAqIHRocmVhZCBleGl0IHRpbWUuCisgKi8KKworLyoKKyAqIFBlci1sb2NrIGxpc3QgZW50cnkgLSBlbWJlZGRlZCBpbiB1c2VyLXNwYWNlIGxvY2tzLCBzb21ld2hlcmUgY2xvc2UKKyAqIHRvIHRoZSBmdXRleCBmaWVsZC4gKE5vdGU6IHVzZXItc3BhY2UgdXNlcyBhIGRvdWJsZS1saW5rZWQgbGlzdCB0bworICogYWNoaWV2ZSBPKDEpIGxpc3QgYWRkIGFuZCByZW1vdmUsIGJ1dCB0aGUga2VybmVsIG9ubHkgbmVlZHMgdG8ga25vdworICogYWJvdXQgdGhlIGZvcndhcmQgbGluaykKKyAqCisgKiBOT1RFOiB0aGlzIHN0cnVjdHVyZSBpcyBwYXJ0IG9mIHRoZSBzeXNjYWxsIEFCSSwgYW5kIG11c3Qgbm90IGJlCisgKiBjaGFuZ2VkLgorICovCitzdHJ1Y3Qgcm9idXN0X2xpc3QgeworCXN0cnVjdCByb2J1c3RfbGlzdCAqbmV4dDsKK307CisKKy8qCisgKiBQZXItdGhyZWFkIGxpc3QgaGVhZDoKKyAqCisgKiBOT1RFOiB0aGlzIHN0cnVjdHVyZSBpcyBwYXJ0IG9mIHRoZSBzeXNjYWxsIEFCSSwgYW5kIG11c3Qgb25seSBiZQorICogY2hhbmdlZCBpZiB0aGUgY2hhbmdlIGlzIGZpcnN0IGNvbW11bmljYXRlZCB3aXRoIHRoZSBnbGliYyBmb2xrcy4KKyAqIChXaGVuIGFuIGluY29tcGF0aWJsZSBjaGFuZ2UgaXMgZG9uZSwgd2UnbGwgaW5jcmVhc2UgdGhlIHN0cnVjdHVyZQorICogIHNpemUsIHdoaWNoIGdsaWJjIHdpbGwgZGV0ZWN0KQorICovCitzdHJ1Y3Qgcm9idXN0X2xpc3RfaGVhZCB7CisJLyoKKwkgKiBUaGUgaGVhZCBvZiB0aGUgbGlzdC4gUG9pbnRzIGJhY2sgdG8gaXRzZWxmIGlmIGVtcHR5OgorCSAqLworCXN0cnVjdCByb2J1c3RfbGlzdCBsaXN0OworCisJLyoKKwkgKiBUaGlzIHJlbGF0aXZlIG9mZnNldCBpcyBzZXQgYnkgdXNlci1zcGFjZSwgaXQgZ2l2ZXMgdGhlIGtlcm5lbAorCSAqIHRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgZnV0ZXggZmllbGQgdG8gZXhhbWluZS4gVGhpcyB3YXkKKwkgKiB3ZSBrZWVwIHVzZXJzcGFjZSBmbGV4aWJsZSwgdG8gZnJlZWx5IHNoYXBlIGl0cyBkYXRhLXN0cnVjdHVyZSwKKwkgKiB3aXRob3V0IGhhcmRjb2RpbmcgYW55IHBhcnRpY3VsYXIgb2Zmc2V0IGludG8gdGhlIGtlcm5lbDoKKwkgKi8KKwlsb25nIGZ1dGV4X29mZnNldDsKKworCS8qCisJICogVGhlIGRlYXRoIG9mIHRoZSB0aHJlYWQgbWF5IHJhY2Ugd2l0aCB1c2Vyc3BhY2Ugc2V0dGluZworCSAqIHVwIGEgbG9jaydzIGxpbmtzLiBTbyB0byBoYW5kbGUgdGhpcyByYWNlLCB1c2Vyc3BhY2UgZmlyc3QKKwkgKiBzZXRzIHRoaXMgZmllbGQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIHRvLWJlLXRha2VuIGxvY2ssCisJICogdGhlbiBkb2VzIHRoZSBsb2NrIGFjcXVpcmUsIGFuZCB0aGVuIGFkZHMgaXRzZWxmIHRvIHRoZQorCSAqIGxpc3QsIGFuZCB0aGVuIGNsZWFycyB0aGlzIGZpZWxkLiBIZW5jZSB0aGUga2VybmVsIHdpbGwKKwkgKiBhbHdheXMgaGF2ZSBmdWxsIGtub3dsZWRnZSBvZiBhbGwgbG9ja3MgdGhhdCB0aGUgdGhyZWFkCisJICogX21pZ2h0XyBoYXZlIHRha2VuLiBXZSBjaGVjayB0aGUgb3duZXIgVElEIGluIGFueSBjYXNlLAorCSAqIHNvIG9ubHkgdHJ1bHkgb3duZWQgbG9ja3Mgd2lsbCBiZSBoYW5kbGVkLgorCSAqLworCXN0cnVjdCByb2J1c3RfbGlzdCAqbGlzdF9vcF9wZW5kaW5nOworfTsKKworLyoKKyAqIEFyZSB0aGVyZSBhbnkgd2FpdGVycyBmb3IgdGhpcyByb2J1c3QgZnV0ZXg6CisgKi8KKyNkZWZpbmUgRlVURVhfV0FJVEVSUwkJMHg4MDAwMDAwMAorCisvKgorICogVGhlIGtlcm5lbCBzaWduYWxzIHZpYSB0aGlzIGJpdCB0aGF0IGEgdGhyZWFkIGhvbGRpbmcgYSBmdXRleAorICogaGFzIGV4aXRlZCB3aXRob3V0IHVubG9ja2luZyB0aGUgZnV0ZXguIFRoZSBrZXJuZWwgYWxzbyBkb2VzCisgKiBhIEZVVEVYX1dBS0Ugb24gc3VjaCBmdXRleGVzLCBhZnRlciBzZXR0aW5nIHRoZSBiaXQsIHRvIHdha2UKKyAqIHVwIGFueSBwb3NzaWJsZSB3YWl0ZXJzOgorICovCisjZGVmaW5lIEZVVEVYX09XTkVSX0RJRUQJMHg0MDAwMDAwMAorCisvKgorICogVGhlIHJlc3Qgb2YgdGhlIHJvYnVzdC1mdXRleCBmaWVsZCBpcyBmb3IgdGhlIFRJRDoKKyAqLworI2RlZmluZSBGVVRFWF9USURfTUFTSwkJMHgzZmZmZmZmZgorCisvKgorICogVGhpcyBsaW1pdCBwcm90ZWN0cyBhZ2FpbnN0IGEgZGVsaWJlcmF0ZWx5IGNpcmN1bGFyIGxpc3QuCisgKiAoTm90IHdvcnRoIGludHJvZHVjaW5nIGFuIHJsaW1pdCBmb3IgaXQpCisgKi8KKyNkZWZpbmUgUk9CVVNUX0xJU1RfTElNSVQJMjA0OAorCisvKgorICogYml0c2V0IHdpdGggYWxsIGJpdHMgc2V0IGZvciB0aGUgRlVURVhfeHh4X0JJVFNFVCBPUHMgdG8gcmVxdWVzdCBhCisgKiBtYXRjaCBvZiBhbnkgYml0LgorICovCisjZGVmaW5lIEZVVEVYX0JJVFNFVF9NQVRDSF9BTlkJMHhmZmZmZmZmZgorCisKKyNkZWZpbmUgRlVURVhfT1BfU0VUCQkwCS8qICooaW50ICopVUFERFIyID0gT1BBUkc7ICovCisjZGVmaW5lIEZVVEVYX09QX0FERAkJMQkvKiAqKGludCAqKVVBRERSMiArPSBPUEFSRzsgKi8KKyNkZWZpbmUgRlVURVhfT1BfT1IJCTIJLyogKihpbnQgKilVQUREUjIgfD0gT1BBUkc7ICovCisjZGVmaW5lIEZVVEVYX09QX0FORE4JCTMJLyogKihpbnQgKilVQUREUjIgJj0gfk9QQVJHOyAqLworI2RlZmluZSBGVVRFWF9PUF9YT1IJCTQJLyogKihpbnQgKilVQUREUjIgXj0gT1BBUkc7ICovCisKKyNkZWZpbmUgRlVURVhfT1BfT1BBUkdfU0hJRlQJOAkvKiBVc2UgKDEgPDwgT1BBUkcpIGluc3RlYWQgb2YgT1BBUkcuICAqLworCisjZGVmaW5lIEZVVEVYX09QX0NNUF9FUQkJMAkvKiBpZiAob2xkdmFsID09IENNUEFSRykgd2FrZSAqLworI2RlZmluZSBGVVRFWF9PUF9DTVBfTkUJCTEJLyogaWYgKG9sZHZhbCAhPSBDTVBBUkcpIHdha2UgKi8KKyNkZWZpbmUgRlVURVhfT1BfQ01QX0xUCQkyCS8qIGlmIChvbGR2YWwgPCBDTVBBUkcpIHdha2UgKi8KKyNkZWZpbmUgRlVURVhfT1BfQ01QX0xFCQkzCS8qIGlmIChvbGR2YWwgPD0gQ01QQVJHKSB3YWtlICovCisjZGVmaW5lIEZVVEVYX09QX0NNUF9HVAkJNAkvKiBpZiAob2xkdmFsID4gQ01QQVJHKSB3YWtlICovCisjZGVmaW5lIEZVVEVYX09QX0NNUF9HRQkJNQkvKiBpZiAob2xkdmFsID49IENNUEFSRykgd2FrZSAqLworCisvKiBGVVRFWF9XQUtFX09QIHdpbGwgcGVyZm9ybSBhdG9taWNhbGx5CisgICBpbnQgb2xkdmFsID0gKihpbnQgKilVQUREUjI7CisgICAqKGludCAqKVVBRERSMiA9IG9sZHZhbCBPUCBPUEFSRzsKKyAgIGlmIChvbGR2YWwgQ01QIENNUEFSRykKKyAgICAgd2FrZSBVQUREUjI7ICAqLworCisjZGVmaW5lIEZVVEVYX09QKG9wLCBvcGFyZywgY21wLCBjbXBhcmcpIFwKKyAgKCgob3AgJiAweGYpIDw8IDI4KSB8ICgoY21wICYgMHhmKSA8PCAyNCkJCVwKKyAgIHwgKChvcGFyZyAmIDB4ZmZmKSA8PCAxMikgfCAoY21wYXJnICYgMHhmZmYpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZ2FtZXBvcnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZ2FtZXBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzMzYzRhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9nYW1lcG9ydC5oCkBAIC0wLDAgKzEsMjggQEAKKyNpZm5kZWYgX0dBTUVQT1JUX0gKKyNkZWZpbmUgX0dBTUVQT1JUX0gKKworLyoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMiBWb2p0ZWNoIFBhdmxpaworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworCisjZGVmaW5lIEdBTUVQT1JUX01PREVfRElTQUJMRUQJCTAKKyNkZWZpbmUgR0FNRVBPUlRfTU9ERV9SQVcJCTEKKyNkZWZpbmUgR0FNRVBPUlRfTU9ERV9DT09LRUQJCTIKKworI2RlZmluZSBHQU1FUE9SVF9JRF9WRU5ET1JfQU5BTE9HCTB4MDAwMQorI2RlZmluZSBHQU1FUE9SVF9JRF9WRU5ET1JfTUFEQ0FUWgkweDAwMDIKKyNkZWZpbmUgR0FNRVBPUlRfSURfVkVORE9SX0xPR0lURUNICTB4MDAwMworI2RlZmluZSBHQU1FUE9SVF9JRF9WRU5ET1JfQ1JFQVRJVkUJMHgwMDA0CisjZGVmaW5lIEdBTUVQT1JUX0lEX1ZFTkRPUl9HRU5JVVMJMHgwMDA1CisjZGVmaW5lIEdBTUVQT1JUX0lEX1ZFTkRPUl9JTlRFUkFDVAkweDAwMDYKKyNkZWZpbmUgR0FNRVBPUlRfSURfVkVORE9SX01JQ1JPU09GVAkweDAwMDcKKyNkZWZpbmUgR0FNRVBPUlRfSURfVkVORE9SX1RIUlVTVE1BU1RFUgkweDAwMDgKKyNkZWZpbmUgR0FNRVBPUlRfSURfVkVORE9SX0dSQVZJUwkweDAwMDkKKyNkZWZpbmUgR0FNRVBPUlRfSURfVkVORE9SX0dVSUxMRU1PVAkweDAwMGEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dlbl9zdGF0cy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9nZW5fc3RhdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTJjOGEwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9nZW5fc3RhdHMuaApAQCAtMCwwICsxLDY3IEBACisjaWZuZGVmIF9fTElOVVhfR0VOX1NUQVRTX0gKKyNkZWZpbmUgX19MSU5VWF9HRU5fU1RBVFNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSB7CisJVENBX1NUQVRTX1VOU1BFQywKKwlUQ0FfU1RBVFNfQkFTSUMsCisJVENBX1NUQVRTX1JBVEVfRVNULAorCVRDQV9TVEFUU19RVUVVRSwKKwlUQ0FfU1RBVFNfQVBQLAorCV9fVENBX1NUQVRTX01BWCwKK307CisjZGVmaW5lIFRDQV9TVEFUU19NQVggKF9fVENBX1NUQVRTX01BWCAtIDEpCisKKy8qKgorICogc3RydWN0IGduZXRfc3RhdHNfYmFzaWMgLSBieXRlL3BhY2tldCB0aHJvdWdocHV0IHN0YXRpc3RpY3MKKyAqIEBieXRlczogbnVtYmVyIG9mIHNlZW4gYnl0ZXMKKyAqIEBwYWNrZXRzOiBudW1iZXIgb2Ygc2VlbiBwYWNrZXRzCisgKi8KK3N0cnVjdCBnbmV0X3N0YXRzX2Jhc2ljIHsKKwlfX3U2NAlieXRlczsKKwlfX3UzMglwYWNrZXRzOworfTsKK3N0cnVjdCBnbmV0X3N0YXRzX2Jhc2ljX3BhY2tlZCB7CisJX191NjQJYnl0ZXM7CisJX191MzIJcGFja2V0czsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKioKKyAqIHN0cnVjdCBnbmV0X3N0YXRzX3JhdGVfZXN0IC0gcmF0ZSBlc3RpbWF0b3IKKyAqIEBicHM6IGN1cnJlbnQgYnl0ZSByYXRlCisgKiBAcHBzOiBjdXJyZW50IHBhY2tldCByYXRlCisgKi8KK3N0cnVjdCBnbmV0X3N0YXRzX3JhdGVfZXN0IHsKKwlfX3UzMglicHM7CisJX191MzIJcHBzOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZ25ldF9zdGF0c19xdWV1ZSAtIHF1ZXVpbmcgc3RhdGlzdGljcworICogQHFsZW46IHF1ZXVlIGxlbmd0aAorICogQGJhY2tsb2c6IGJhY2tsb2cgc2l6ZSBvZiBxdWV1ZQorICogQGRyb3BzOiBudW1iZXIgb2YgZHJvcHBlZCBwYWNrZXRzCisgKiBAcmVxdWV1ZXM6IG51bWJlciBvZiByZXF1ZXVlcworICogQG92ZXJsaW1pdHM6IG51bWJlciBvZiBlbnF1ZXVlcyBvdmVyIHRoZSBsaW1pdAorICovCitzdHJ1Y3QgZ25ldF9zdGF0c19xdWV1ZSB7CisJX191MzIJcWxlbjsKKwlfX3UzMgliYWNrbG9nOworCV9fdTMyCWRyb3BzOworCV9fdTMyCXJlcXVldWVzOworCV9fdTMyCW92ZXJsaW1pdHM7Cit9OworCisvKioKKyAqIHN0cnVjdCBnbmV0X2VzdGltYXRvciAtIHJhdGUgZXN0aW1hdG9yIGNvbmZpZ3VyYXRpb24KKyAqIEBpbnRlcnZhbDogc2FtcGxpbmcgcGVyaW9kCisgKiBAZXdtYV9sb2c6IHRoZSBsb2cgb2YgbWVhc3VyZW1lbnQgd2luZG93IHdlaWdodAorICovCitzdHJ1Y3QgZ25ldF9lc3RpbWF0b3IgeworCXNpZ25lZCBjaGFyCWludGVydmFsOworCXVuc2lnbmVkIGNoYXIJZXdtYV9sb2c7Cit9OworCisKKyNlbmRpZiAvKiBfX0xJTlVYX0dFTl9TVEFUU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dlbmVyaWNfc2VyaWFsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dlbmVyaWNfc2VyaWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY1OTZiNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZ2VuZXJpY19zZXJpYWwuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogIGdlbmVyaWNfc2VyaWFsLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4IFIuRS5Xb2xmZkBCaXRXaXphcmQubmwKKyAqCisgKiAgd3JpdHRlbiBmb3IgdGhlIFNYIHNlcmlhbCBkcml2ZXIuCisgKiAgICAgQ29udGFpbnMgdGhlIGNvZGUgdGhhdCBzaG91bGQgYmUgc2hhcmVkIG92ZXIgYWxsIHRoZSBzZXJpYWwgZHJpdmVycy4KKyAqCisgKiAgVmVyc2lvbiAwLjEgLS0gRGVjZW1iZXIsIDE5OTguCisgKi8KKworI2lmbmRlZiBHRU5FUklDX1NFUklBTF9ICisjZGVmaW5lIEdFTkVSSUNfU0VSSUFMX0gKKworCisvKiBGbGFncyAqLworLyogV2FybmluZzogc2VyaWFsLmggZGVmaW5lcyBzb21lIEFTWU5DXyBmbGFncywgdGhleSBzYXkgdGhleSBhcmUgIm9ubHkiCisgICB1c2VkIGluIHNlcmlhbC5jLCBidXQgdGhleSBhcmUgYWxzbyB1c2VkIGluIGFsbCBvdGhlciBzZXJpYWwgZHJpdmVycy4gCisgICBNYWtlIHN1cmUgdGhleSBkb24ndCBjbGFzaCB3aXRoIHRoZXNlIGhlcmUuLi4gKi8KKyNkZWZpbmUgR1NfVFhfSU5URU4gICAgICAweDAwODAwMDAwCisjZGVmaW5lIEdTX1JYX0lOVEVOICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBHU19BQ1RJVkUgICAgICAgIDB4MDAyMDAwMDAKKworCisKKyNkZWZpbmUgR1NfVFlQRV9OT1JNQUwgICAxCisKKyNkZWZpbmUgR1NfREVCVUdfRkxVU0ggICAweDAwMDAwMDAxCisjZGVmaW5lIEdTX0RFQlVHX0JUUiAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHU19ERUJVR19URVJNSU9TIDB4MDAwMDAwMDQKKyNkZWZpbmUgR1NfREVCVUdfU1RVRkYgICAweDAwMDAwMDA4CisjZGVmaW5lIEdTX0RFQlVHX0NMT1NFICAgMHgwMDAwMDAxMAorI2RlZmluZSBHU19ERUJVR19GTE9XICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgR1NfREVCVUdfV1JJVEUgICAweDAwMDAwMDQwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9nZW5ldGxpbmsuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZ2VuZXRsaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjZTdiYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZ2VuZXRsaW5rLmgKQEAgLTAsMCArMSw4NCBAQAorI2lmbmRlZiBfX0xJTlVYX0dFTkVSSUNfTkVUTElOS19ICisjZGVmaW5lIF9fTElOVVhfR0VORVJJQ19ORVRMSU5LX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorCisjZGVmaW5lIEdFTkxfTkFNU0laCTE2CS8qIGxlbmd0aCBvZiBmYW1pbHkgbmFtZSAqLworCisjZGVmaW5lIEdFTkxfTUlOX0lECU5MTVNHX01JTl9UWVBFCisjZGVmaW5lIEdFTkxfTUFYX0lECTEwMjMKKworc3RydWN0IGdlbmxtc2doZHIgeworCV9fdTgJY21kOworCV9fdTgJdmVyc2lvbjsKKwlfX3UxNglyZXNlcnZlZDsKK307CisKKyNkZWZpbmUgR0VOTF9IRFJMRU4JTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBnZW5sbXNnaGRyKSkKKworI2RlZmluZSBHRU5MX0FETUlOX1BFUk0JCTB4MDEKKyNkZWZpbmUgR0VOTF9DTURfQ0FQX0RPCQkweDAyCisjZGVmaW5lIEdFTkxfQ01EX0NBUF9EVU1QCTB4MDQKKyNkZWZpbmUgR0VOTF9DTURfQ0FQX0hBU1BPTAkweDA4CisKKy8qCisgKiBMaXN0IG9mIHJlc2VydmVkIHN0YXRpYyBnZW5lcmljIG5ldGxpbmsgaWRlbnRpZmllcnM6CisgKi8KKyNkZWZpbmUgR0VOTF9JRF9HRU5FUkFURQkwCisjZGVmaW5lIEdFTkxfSURfQ1RSTAkJTkxNU0dfTUlOX1RZUEUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb250cm9sbGVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2VudW0geworCUNUUkxfQ01EX1VOU1BFQywKKwlDVFJMX0NNRF9ORVdGQU1JTFksCisJQ1RSTF9DTURfREVMRkFNSUxZLAorCUNUUkxfQ01EX0dFVEZBTUlMWSwKKwlDVFJMX0NNRF9ORVdPUFMsCisJQ1RSTF9DTURfREVMT1BTLAorCUNUUkxfQ01EX0dFVE9QUywKKwlDVFJMX0NNRF9ORVdNQ0FTVF9HUlAsCisJQ1RSTF9DTURfREVMTUNBU1RfR1JQLAorCUNUUkxfQ01EX0dFVE1DQVNUX0dSUCwgLyogdW51c2VkICovCisJX19DVFJMX0NNRF9NQVgsCit9OworCisjZGVmaW5lIENUUkxfQ01EX01BWCAoX19DVFJMX0NNRF9NQVggLSAxKQorCitlbnVtIHsKKwlDVFJMX0FUVFJfVU5TUEVDLAorCUNUUkxfQVRUUl9GQU1JTFlfSUQsCisJQ1RSTF9BVFRSX0ZBTUlMWV9OQU1FLAorCUNUUkxfQVRUUl9WRVJTSU9OLAorCUNUUkxfQVRUUl9IRFJTSVpFLAorCUNUUkxfQVRUUl9NQVhBVFRSLAorCUNUUkxfQVRUUl9PUFMsCisJQ1RSTF9BVFRSX01DQVNUX0dST1VQUywKKwlfX0NUUkxfQVRUUl9NQVgsCit9OworCisjZGVmaW5lIENUUkxfQVRUUl9NQVggKF9fQ1RSTF9BVFRSX01BWCAtIDEpCisKK2VudW0geworCUNUUkxfQVRUUl9PUF9VTlNQRUMsCisJQ1RSTF9BVFRSX09QX0lELAorCUNUUkxfQVRUUl9PUF9GTEFHUywKKwlfX0NUUkxfQVRUUl9PUF9NQVgsCit9OworCisjZGVmaW5lIENUUkxfQVRUUl9PUF9NQVggKF9fQ1RSTF9BVFRSX09QX01BWCAtIDEpCisKK2VudW0geworCUNUUkxfQVRUUl9NQ0FTVF9HUlBfVU5TUEVDLAorCUNUUkxfQVRUUl9NQ0FTVF9HUlBfTkFNRSwKKwlDVFJMX0FUVFJfTUNBU1RfR1JQX0lELAorCV9fQ1RSTF9BVFRSX01DQVNUX0dSUF9NQVgsCit9OworCisjZGVmaW5lIENUUkxfQVRUUl9NQ0FTVF9HUlBfTUFYIChfX0NUUkxfQVRUUl9NQ0FTVF9HUlBfTUFYIC0gMSkKKworCisjZW5kaWYJLyogX19MSU5VWF9HRU5FUklDX05FVExJTktfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9nZnMyX29uZGlzay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9nZnMyX29uZGlzay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4Mzk2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dmczJfb25kaXNrLmgKQEAgLTAsMCArMSw0NDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFNpc3RpbmEgU29mdHdhcmUsIEluYy4gIDE5OTctMjAwMyBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorICovCisKKyNpZm5kZWYgX19HRlMyX09ORElTS19ET1RfSF9fCisjZGVmaW5lIF9fR0ZTMl9PTkRJU0tfRE9UX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBHRlMyX01BR0lDCQkweDAxMTYxOTcwCisjZGVmaW5lIEdGUzJfQkFTSUNfQkxPQ0sJNTEyCisjZGVmaW5lIEdGUzJfQkFTSUNfQkxPQ0tfU0hJRlQJOQorCisvKiBMb2NrIG51bWJlcnMgb2YgdGhlIExNX1RZUEVfTk9ORElTSyB0eXBlICovCisKKyNkZWZpbmUgR0ZTMl9NT1VOVF9MT0NLCQkwCisjZGVmaW5lIEdGUzJfTElWRV9MT0NLCQkxCisjZGVmaW5lIEdGUzJfVFJBTlNfTE9DSwkJMgorI2RlZmluZSBHRlMyX1JFTkFNRV9MT0NLCTMKKworLyogRm9ybWF0IG51bWJlcnMgZm9yIHZhcmlvdXMgbWV0YWRhdGEgdHlwZXMgKi8KKworI2RlZmluZSBHRlMyX0ZPUk1BVF9OT05FCTAKKyNkZWZpbmUgR0ZTMl9GT1JNQVRfU0IJCTEwMAorI2RlZmluZSBHRlMyX0ZPUk1BVF9SRwkJMjAwCisjZGVmaW5lIEdGUzJfRk9STUFUX1JCCQkzMDAKKyNkZWZpbmUgR0ZTMl9GT1JNQVRfREkJCTQwMAorI2RlZmluZSBHRlMyX0ZPUk1BVF9JTgkJNTAwCisjZGVmaW5lIEdGUzJfRk9STUFUX0xGCQk2MDAKKyNkZWZpbmUgR0ZTMl9GT1JNQVRfSkQJCTcwMAorI2RlZmluZSBHRlMyX0ZPUk1BVF9MSAkJODAwCisjZGVmaW5lIEdGUzJfRk9STUFUX0xECQk5MDAKKyNkZWZpbmUgR0ZTMl9GT1JNQVRfTEIJCTEwMDAKKyNkZWZpbmUgR0ZTMl9GT1JNQVRfRUEJCTE2MDAKKyNkZWZpbmUgR0ZTMl9GT1JNQVRfRUQJCTE3MDAKKyNkZWZpbmUgR0ZTMl9GT1JNQVRfUUMJCTE0MDAKKy8qIFRoZXNlIGFyZSBmb3JtYXQgbnVtYmVycyBmb3IgZW50aXRpZXMgY29udGFpbmVkIGluIGZpbGVzICovCisjZGVmaW5lIEdGUzJfRk9STUFUX1JJCQkxMTAwCisjZGVmaW5lIEdGUzJfRk9STUFUX0RFCQkxMjAwCisjZGVmaW5lIEdGUzJfRk9STUFUX1FVCQkxNTAwCisvKiBUaGVzZSBhcmUgcGFydCBvZiB0aGUgc3VwZXJibG9jayAqLworI2RlZmluZSBHRlMyX0ZPUk1BVF9GUwkJMTgwMQorI2RlZmluZSBHRlMyX0ZPUk1BVF9NVUxUSQkxOTAwCisKKy8qCisgKiBBbiBvbi1kaXNrIGlub2RlIG51bWJlcgorICovCisKK3N0cnVjdCBnZnMyX2ludW0geworCV9fYmU2NCBub19mb3JtYWxfaW5vOworCV9fYmU2NCBub19hZGRyOworfTsKKworLyoKKyAqIEdlbmVyaWMgbWV0YWRhdGEgaGVhZCBzdHJ1Y3R1cmUKKyAqIEV2ZXJ5IGlucGxhY2UgYnVmZmVyIGxvZ2dlZCBpbiB0aGUgam91cm5hbCBtdXN0IHN0YXJ0IHdpdGggdGhpcy4KKyAqLworCisjZGVmaW5lIEdGUzJfTUVUQVRZUEVfTk9ORQkwCisjZGVmaW5lIEdGUzJfTUVUQVRZUEVfU0IJMQorI2RlZmluZSBHRlMyX01FVEFUWVBFX1JHCTIKKyNkZWZpbmUgR0ZTMl9NRVRBVFlQRV9SQgkzCisjZGVmaW5lIEdGUzJfTUVUQVRZUEVfREkJNAorI2RlZmluZSBHRlMyX01FVEFUWVBFX0lOCTUKKyNkZWZpbmUgR0ZTMl9NRVRBVFlQRV9MRgk2CisjZGVmaW5lIEdGUzJfTUVUQVRZUEVfSkQJNworI2RlZmluZSBHRlMyX01FVEFUWVBFX0xICTgKKyNkZWZpbmUgR0ZTMl9NRVRBVFlQRV9MRAk5CisjZGVmaW5lIEdGUzJfTUVUQVRZUEVfTEIJMTIKKyNkZWZpbmUgR0ZTMl9NRVRBVFlQRV9FQQkxMAorI2RlZmluZSBHRlMyX01FVEFUWVBFX0VECTExCisjZGVmaW5lIEdGUzJfTUVUQVRZUEVfUUMJMTQKKworc3RydWN0IGdmczJfbWV0YV9oZWFkZXIgeworCV9fYmUzMiBtaF9tYWdpYzsKKwlfX2JlMzIgbWhfdHlwZTsKKwlfX2JlNjQgX19wYWQwOwkJLyogV2FzIGdlbmVyYXRpb24gbnVtYmVyIGluIGdmczEgKi8KKwlfX2JlMzIgbWhfZm9ybWF0OworCS8qIFRoaXMgdW5pb24gaXMgdG8ga2VlcCB1c2Vyc3BhY2UgaGFwcHkgKi8KKwl1bmlvbiB7CisJCV9fYmUzMiBtaF9qaWQ7CQkvKiBXYXMgaW5jYXJuYXRpb24gbnVtYmVyIGluIGdmczEgKi8KKwkJX19iZTMyIF9fcGFkMTsKKwl9OworfTsKKworLyoKKyAqIHN1cGVyLWJsb2NrIHN0cnVjdHVyZQorICoKKyAqIEl0J3MgcHJvYmFibHkgZ29vZCBpZiBTSVpFT0ZfU0IgPD0gR0ZTMl9CQVNJQ19CTE9DSyAoNTEyIGJ5dGVzKQorICoKKyAqIE9yZGVyIGlzIGltcG9ydGFudCwgbmVlZCB0byBiZSBhYmxlIHRvIHJlYWQgb2xkIHN1cGVyYmxvY2tzIHRvIGRvIG9uLWRpc2sKKyAqIHZlcnNpb24gdXBncmFkZXMuCisgKi8KKworLyogQWRkcmVzcyBvZiBzdXBlcmJsb2NrIGluIEdGUzIgYmFzaWMgYmxvY2tzICovCisjZGVmaW5lIEdGUzJfU0JfQUREUgkJMTI4CisKKy8qIFRoZSBsb2NrIG51bWJlciBmb3IgdGhlIHN1cGVyYmxvY2sgKG11c3QgYmUgemVybykgKi8KKyNkZWZpbmUgR0ZTMl9TQl9MT0NLCQkwCisKKy8qIFJlcXVpcmVtZW50OiAgR0ZTMl9MT0NLTkFNRV9MRU4gJSA4ID09IDAKKyAgIEluY2x1ZGVzOiB0aGUgZmVuY2luZyB6ZXJvIGF0IHRoZSBlbmQgKi8KKyNkZWZpbmUgR0ZTMl9MT0NLTkFNRV9MRU4JNjQKKworc3RydWN0IGdmczJfc2IgeworCXN0cnVjdCBnZnMyX21ldGFfaGVhZGVyIHNiX2hlYWRlcjsKKworCV9fYmUzMiBzYl9mc19mb3JtYXQ7CisJX19iZTMyIHNiX211bHRpaG9zdF9mb3JtYXQ7CisJX191MzIgIF9fcGFkMDsJLyogV2FzIHN1cGVyYmxvY2sgZmxhZ3MgaW4gZ2ZzMSAqLworCisJX19iZTMyIHNiX2JzaXplOworCV9fYmUzMiBzYl9ic2l6ZV9zaGlmdDsKKwlfX3UzMiBfX3BhZDE7CS8qIFdhcyBqb3VybmFsIHNlZ21lbnQgc2l6ZSBpbiBnZnMxICovCisKKwlzdHJ1Y3QgZ2ZzMl9pbnVtIHNiX21hc3Rlcl9kaXI7IC8qIFdhcyBqaW5kZXggZGlub2RlIGluIGdmczEgKi8KKwlzdHJ1Y3QgZ2ZzMl9pbnVtIF9fcGFkMjsgLyogV2FzIHJpbmRleCBkaW5vZGUgaW4gZ2ZzMSAqLworCXN0cnVjdCBnZnMyX2ludW0gc2Jfcm9vdF9kaXI7CisKKwljaGFyIHNiX2xvY2twcm90b1tHRlMyX0xPQ0tOQU1FX0xFTl07CisJY2hhciBzYl9sb2NrdGFibGVbR0ZTMl9MT0NLTkFNRV9MRU5dOworCisJc3RydWN0IGdmczJfaW51bSBfX3BhZDM7IC8qIFdhcyBxdW90YSBpbm9kZSBpbiBnZnMxICovCisJc3RydWN0IGdmczJfaW51bSBfX3BhZDQ7IC8qIFdhcyBsaWNlbmNlIGlub2RlIGluIGdmczEgKi8KKyNkZWZpbmUgR0ZTMl9IQVNfVVVJRCAxCisJX191OCBzYl91dWlkWzE2XTsgLyogVGhlIFVVSUQsIG1heWJlIDAgZm9yIGJhY2t3YXJkcyBjb21wYXQgKi8KK307CisKKy8qCisgKiByZXNvdXJjZSBpbmRleCBzdHJ1Y3R1cmUKKyAqLworCitzdHJ1Y3QgZ2ZzMl9yaW5kZXggeworCV9fYmU2NCByaV9hZGRyOwkvKiBncnAgYmxvY2sgZGlzayBhZGRyZXNzICovCisJX19iZTMyIHJpX2xlbmd0aDsJLyogbGVuZ3RoIG9mIHJncnAgaGVhZGVyIGluIGZzIGJsb2NrcyAqLworCV9fdTMyIF9fcGFkOworCisJX19iZTY0IHJpX2RhdGEwOwkvKiBmaXJzdCBkYXRhIGxvY2F0aW9uICovCisJX19iZTMyIHJpX2RhdGE7CS8qIG51bSBvZiBkYXRhIGJsb2NrcyBpbiByZ3JwICovCisKKwlfX2JlMzIgcmlfYml0Ynl0ZXM7CS8qIG51bWJlciBvZiBieXRlcyBpbiBkYXRhIGJpdG1hcHMgKi8KKworCV9fdTggcmlfcmVzZXJ2ZWRbNjRdOworfTsKKworLyoKKyAqIHJlc291cmNlIGdyb3VwIGhlYWRlciBzdHJ1Y3R1cmUKKyAqLworCisvKiBOdW1iZXIgb2YgYmxvY2tzIHBlciBieXRlIGluIHJncnAgKi8KKyNkZWZpbmUgR0ZTMl9OQkJZCQk0CisjZGVmaW5lIEdGUzJfQklUX1NJWkUJCTIKKyNkZWZpbmUgR0ZTMl9CSVRfTUFTSwkJMHgwMDAwMDAwMworCisjZGVmaW5lIEdGUzJfQkxLU1RfRlJFRQkJMAorI2RlZmluZSBHRlMyX0JMS1NUX1VTRUQJCTEKKyNkZWZpbmUgR0ZTMl9CTEtTVF9VTkxJTktFRAkyCisjZGVmaW5lIEdGUzJfQkxLU1RfRElOT0RFCTMKKworI2RlZmluZSBHRlMyX1JHRl9KT1VSTkFMCTB4MDAwMDAwMDEKKyNkZWZpbmUgR0ZTMl9SR0ZfTUVUQU9OTFkJMHgwMDAwMDAwMgorI2RlZmluZSBHRlMyX1JHRl9EQVRBT05MWQkweDAwMDAwMDA0CisjZGVmaW5lIEdGUzJfUkdGX05PQUxMT0MJMHgwMDAwMDAwOAorCitzdHJ1Y3QgZ2ZzMl9yZ3JwIHsKKwlzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlciByZ19oZWFkZXI7CisKKwlfX2JlMzIgcmdfZmxhZ3M7CisJX19iZTMyIHJnX2ZyZWU7CisJX19iZTMyIHJnX2Rpbm9kZXM7CisJX19iZTMyIF9fcGFkOworCV9fYmU2NCByZ19pZ2VuZXJhdGlvbjsKKworCV9fdTggcmdfcmVzZXJ2ZWRbODBdOyAvKiBTZXZlcmFsIGZpZWxkcyBmcm9tIGdmczEgbm93IHJlc2VydmVkICovCit9OworCisvKgorICogcXVvdGEgc3RydWN0dXJlCisgKi8KKworc3RydWN0IGdmczJfcXVvdGEgeworCV9fYmU2NCBxdV9saW1pdDsKKwlfX2JlNjQgcXVfd2FybjsKKwlfX2JlNjQgcXVfdmFsdWU7CisJX191OCBxdV9yZXNlcnZlZFs2NF07Cit9OworCisvKgorICogZGlub2RlIHN0cnVjdHVyZQorICovCisKKyNkZWZpbmUgR0ZTMl9NQVhfTUVUQV9IRUlHSFQJMTAKKyNkZWZpbmUgR0ZTMl9ESVJfTUFYX0RFUFRICTE3CisKKyNkZWZpbmUgRFQySUYoZHQpICgoKGR0KSA8PCAxMikgJiBTX0lGTVQpCisjZGVmaW5lIElGMkRUKHNpZikgKCgoc2lmKSAmIFNfSUZNVCkgPj4gMTIpCisKK2VudW0geworCWdmczJmbF9KZGF0YQkJPSAwLAorCWdmczJmbF9FeEhhc2gJCT0gMSwKKwlnZnMyZmxfVW51c2VkCQk9IDIsCisJZ2ZzMmZsX0VhSW5kaXJlY3QJPSAzLAorCWdmczJmbF9EaXJlY3RpbwkJPSA0LAorCWdmczJmbF9JbW11dGFibGUJPSA1LAorCWdmczJmbF9BcHBlbmRPbmx5CT0gNiwKKwlnZnMyZmxfTm9BdGltZQkJPSA3LAorCWdmczJmbF9TeW5jCQk9IDgsCisJZ2ZzMmZsX1N5c3RlbQkJPSA5LAorCWdmczJmbF9UcnVuY0luUHJvZwk9IDI5LAorCWdmczJmbF9Jbmhlcml0RGlyZWN0aW8JPSAzMCwKKwlnZnMyZmxfSW5oZXJpdEpkYXRhCT0gMzEsCit9OworCisvKiBEaW5vZGUgZmxhZ3MgKi8KKyNkZWZpbmUgR0ZTMl9ESUZfSkRBVEEJCQkweDAwMDAwMDAxCisjZGVmaW5lIEdGUzJfRElGX0VYSEFTSAkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgR0ZTMl9ESUZfVU5VU0VECQkJMHgwMDAwMDAwNCAgLyogb25seSBpbiBnZnMxICovCisjZGVmaW5lIEdGUzJfRElGX0VBX0lORElSRUNUCQkweDAwMDAwMDA4CisjZGVmaW5lIEdGUzJfRElGX0RJUkVDVElPCQkweDAwMDAwMDEwCisjZGVmaW5lIEdGUzJfRElGX0lNTVVUQUJMRQkJMHgwMDAwMDAyMAorI2RlZmluZSBHRlMyX0RJRl9BUFBFTkRPTkxZCQkweDAwMDAwMDQwCisjZGVmaW5lIEdGUzJfRElGX05PQVRJTUUJCTB4MDAwMDAwODAKKyNkZWZpbmUgR0ZTMl9ESUZfU1lOQwkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgR0ZTMl9ESUZfU1lTVEVNCQkJMHgwMDAwMDIwMCAvKiBOZXcgaW4gZ2ZzMiAqLworI2RlZmluZSBHRlMyX0RJRl9UUlVOQ19JTl9QUk9HCQkweDIwMDAwMDAwIC8qIE5ldyBpbiBnZnMyICovCisjZGVmaW5lIEdGUzJfRElGX0lOSEVSSVRfRElSRUNUSU8JMHg0MDAwMDAwMAorI2RlZmluZSBHRlMyX0RJRl9JTkhFUklUX0pEQVRBCQkweDgwMDAwMDAwCisKK3N0cnVjdCBnZnMyX2Rpbm9kZSB7CisJc3RydWN0IGdmczJfbWV0YV9oZWFkZXIgZGlfaGVhZGVyOworCisJc3RydWN0IGdmczJfaW51bSBkaV9udW07CisKKwlfX2JlMzIgZGlfbW9kZTsJLyogbW9kZSBvZiBmaWxlICovCisJX19iZTMyIGRpX3VpZDsJLyogb3duZXIncyB1c2VyIGlkICovCisJX19iZTMyIGRpX2dpZDsJLyogb3duZXIncyBncm91cCBpZCAqLworCV9fYmUzMiBkaV9ubGluazsJLyogbnVtYmVyIG9mIGxpbmtzIHRvIHRoaXMgZmlsZSAqLworCV9fYmU2NCBkaV9zaXplOwkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gZmlsZSAqLworCV9fYmU2NCBkaV9ibG9ja3M7CS8qIG51bWJlciBvZiBibG9ja3MgaW4gZmlsZSAqLworCV9fYmU2NCBkaV9hdGltZTsJLyogdGltZSBsYXN0IGFjY2Vzc2VkICovCisJX19iZTY0IGRpX210aW1lOwkvKiB0aW1lIGxhc3QgbW9kaWZpZWQgKi8KKwlfX2JlNjQgZGlfY3RpbWU7CS8qIHRpbWUgbGFzdCBjaGFuZ2VkICovCisJX19iZTMyIGRpX21ham9yOwkvKiBkZXZpY2UgbWFqb3IgbnVtYmVyICovCisJX19iZTMyIGRpX21pbm9yOwkvKiBkZXZpY2UgbWlub3IgbnVtYmVyICovCisKKwkvKiBUaGlzIHNlY3Rpb24gdmFyaWVzIGZyb20gZ2ZzMS4gUGFkZGluZyBhZGRlZCB0byBhbGlnbiB3aXRoCisgICAgICAgICAqIHJlbWFpbmRlciBvZiBkaW5vZGUKKwkgKi8KKwlfX2JlNjQgZGlfZ29hbF9tZXRhOwkvKiByZ3JwIHRvIGFsbG9jIGZyb20gbmV4dCAqLworCV9fYmU2NCBkaV9nb2FsX2RhdGE7CS8qIGRhdGEgYmxvY2sgZ29hbCAqLworCV9fYmU2NCBkaV9nZW5lcmF0aW9uOwkvKiBnZW5lcmF0aW9uIG51bWJlciBmb3IgTkZTICovCisKKwlfX2JlMzIgZGlfZmxhZ3M7CS8qIEdGUzJfRElGXy4uLiAqLworCV9fYmUzMiBkaV9wYXlsb2FkX2Zvcm1hdDsgIC8qIEdGUzJfRk9STUFUXy4uLiAqLworCV9fdTE2IF9fcGFkMTsJLyogV2FzIGRpdHlwZSBpbiBnZnMxICovCisJX19iZTE2IGRpX2hlaWdodDsJLyogaGVpZ2h0IG9mIG1ldGFkYXRhICovCisJX191MzIgX19wYWQyOwkvKiBVbnVzZWQgaW5jYXJuYXRpb24gbnVtYmVyIGZyb20gZ2ZzMSAqLworCisJLyogVGhlc2Ugb25seSBhcHBseSB0byBkaXJlY3RvcmllcyAgKi8KKwlfX3UxNiBfX3BhZDM7CS8qIFBhZGRpbmcgKi8KKwlfX2JlMTYgZGlfZGVwdGg7CS8qIE51bWJlciBvZiBiaXRzIGluIHRoZSB0YWJsZSAqLworCV9fYmUzMiBkaV9lbnRyaWVzOwkvKiBUaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGRpcmVjdG9yeSAqLworCisJc3RydWN0IGdmczJfaW51bSBfX3BhZDQ7IC8qIFVudXNlZCBldmVuIGluIGN1cnJlbnQgZ2ZzMSAqLworCisJX19iZTY0IGRpX2VhdHRyOwkvKiBleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2sgbnVtYmVyICovCisJX19iZTMyIGRpX2F0aW1lX25zZWM7ICAgLyogbnNlYyBwb3J0aW9uIG9mIGF0aW1lICovCisJX19iZTMyIGRpX210aW1lX25zZWM7ICAgLyogbnNlYyBwb3J0aW9uIG9mIG10aW1lICovCisJX19iZTMyIGRpX2N0aW1lX25zZWM7ICAgLyogbnNlYyBwb3J0aW9uIG9mIGN0aW1lICovCisKKwlfX3U4IGRpX3Jlc2VydmVkWzQ0XTsKK307CisKKy8qCisgKiBkaXJlY3Rvcnkgc3RydWN0dXJlIC0gbWFueSBvZiB0aGVzZSBwZXIgZGlyZWN0b3J5IGZpbGUKKyAqLworCisjZGVmaW5lIEdGUzJfRk5BTUVTSVpFCQkyNTUKKyNkZWZpbmUgR0ZTMl9ESVJFTlRfU0laRShuYW1lX2xlbikgKChzaXplb2Yoc3RydWN0IGdmczJfZGlyZW50KSArIChuYW1lX2xlbikgKyA3KSAmIH43KQorCitzdHJ1Y3QgZ2ZzMl9kaXJlbnQgeworCXN0cnVjdCBnZnMyX2ludW0gZGVfaW51bTsKKwlfX2JlMzIgZGVfaGFzaDsKKwlfX2JlMTYgZGVfcmVjX2xlbjsKKwlfX2JlMTYgZGVfbmFtZV9sZW47CisJX19iZTE2IGRlX3R5cGU7CisJX191OCBfX3BhZFsxNF07Cit9OworCisvKgorICogSGVhZGVyIG9mIGxlYWYgZGlyZWN0b3J5IG5vZGVzCisgKi8KKworc3RydWN0IGdmczJfbGVhZiB7CisJc3RydWN0IGdmczJfbWV0YV9oZWFkZXIgbGZfaGVhZGVyOworCisJX19iZTE2IGxmX2RlcHRoOwkJLyogRGVwdGggb2YgbGVhZiAqLworCV9fYmUxNiBsZl9lbnRyaWVzOwkJLyogTnVtYmVyIG9mIGRpcmVudHMgaW4gbGVhZiAqLworCV9fYmUzMiBsZl9kaXJlbnRfZm9ybWF0OwkvKiBGb3JtYXQgb2YgdGhlIGRpcmVudHMgKi8KKwlfX2JlNjQgbGZfbmV4dDsJCQkvKiBOZXh0IGxlYWYsIGlmIG92ZXJmbG93ICovCisKKwlfX3U4IGxmX3Jlc2VydmVkWzY0XTsKK307CisKKy8qCisgKiBFeHRlbmRlZCBhdHRyaWJ1dGUgaGVhZGVyIGZvcm1hdAorICoKKyAqIFRoaXMgd29ya3MgaW4gYSBzaW1pbGFyIHdheSB0byBkaXJlbnRzLiBUaGVyZSBpcyBhIGZpeGVkIHNpemUgaGVhZGVyCisgKiBmb2xsb3dlZCBieSBhIHZhcmlhYmxlIGxlbmd0aCBzZWN0aW9uIG1hZGUgdXAgb2YgdGhlIG5hbWUgYW5kIHRoZQorICogYXNzb2NpYXRlZCBkYXRhLiBJbiB0aGUgY2FzZSBvZiBhICJzdHVmZmVkIiBlbnRyeSwgdGhlIHZhbHVlIGlzCisgKiBfX2lubGluZV9fIGRpcmVjdGx5IGFmdGVyIHRoZSBuYW1lLCB0aGUgZWFfbnVtX3B0cnMgZW50cnkgd2lsbCBiZQorICogemVybyBpbiB0aGF0IGNhc2UuIEZvciBub24tInN0dWZmZWQiIGVudHJpZXMsIHRoZXJlIHdpbGwgYmUKKyAqIGEgc2V0IG9mIHBvaW50ZXJzIChhbGlnbmVkIHRvIDggYnl0ZSBib3VuZGFyeSkgdG8gdGhlIGJsb2NrKHMpCisgKiBjb250YWluaW5nIHRoZSB2YWx1ZS4KKyAqCisgKiBUaGUgYmxvY2tzIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBhbmQgdGhlIGJsb2NrcyBjb250YWluaW5nIHRoZQorICogZXh0ZW5kZWQgYXR0cmlidXRlIGhlYWRlcnMgdGhlbXNlbHZlcyBhbGwgc3RhcnQgd2l0aCB0aGUgY29tbW9uCisgKiBtZXRhZGF0YSBoZWFkZXIuIEVhY2ggaW5vZGUsIGlmIGl0IGhhcyBleHRlbmRlZCBhdHRyaWJ1dGVzLCB3aWxsCisgKiBoYXZlIGVpdGhlciBhIHNpbmdsZSBibG9jayBjb250YWluaW5nIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgaGVhZGVycworICogb3IgYSBzaW5nbGUgaW5kaXJlY3QgYmxvY2sgcG9pbnRpbmcgdG8gYmxvY2tzIGNvbnRhaW5pbmcgdGhlCisgKiBleHRlbmRlZCBhdHRyaWJ1cmUgaGVhZGVycy4KKyAqCisgKiBUaGUgbWF4aW1pbSBzaXplIG9mIHRoZSBkYXRhIHBhcnQgb2YgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGlzIDY0aworICogc28gdGhlIG51bWJlciBvZiBibG9ja3MgcmVxdWlyZWQgZGVwZW5kcyB1cG9uIGJsb2NrIHNpemUuIFNpbmNlIHRoZQorICogYmxvY2sgc2l6ZSBhbHNvIGRldGVybWluZXMgdGhlIG51bWJlciBvZiBwb2ludGVycyBpbiBhbiBpbmRpcmVjdAorICogYmxvY2ssIGl0cyBhIGZhaXJseSBjb21wbGljYXRlZCBjYWxjdWxhdGlvbiB0byB3b3JrIG91dCB0aGUgbWF4aW11bQorICogbnVtYmVyIG9mIGJsb2NrcyB0aGF0IGFuIGlub2RlIG1heSBoYXZlIHJlbGF0aW5nIHRvIGV4dGVuZGVkIGF0dHJpYnV0ZXMuCisgKgorICovCisKKyNkZWZpbmUgR0ZTMl9FQV9NQVhfTkFNRV9MRU4JMjU1CisjZGVmaW5lIEdGUzJfRUFfTUFYX0RBVEFfTEVOCTY1NTM2CisKKyNkZWZpbmUgR0ZTMl9FQVRZUEVfVU5VU0VECTAKKyNkZWZpbmUgR0ZTMl9FQVRZUEVfVVNSCQkxCisjZGVmaW5lIEdGUzJfRUFUWVBFX1NZUwkJMgorI2RlZmluZSBHRlMyX0VBVFlQRV9TRUNVUklUWQkzCisKKyNkZWZpbmUgR0ZTMl9FQVRZUEVfTEFTVAkzCisjZGVmaW5lIEdGUzJfRUFUWVBFX1ZBTElEKHgpCSgoeCkgPD0gR0ZTMl9FQVRZUEVfTEFTVCkKKworI2RlZmluZSBHRlMyX0VBRkxBR19MQVNUCTB4MDEJLyogbGFzdCBlYSBpbiBibG9jayAqLworCitzdHJ1Y3QgZ2ZzMl9lYV9oZWFkZXIgeworCV9fYmUzMiBlYV9yZWNfbGVuOworCV9fYmUzMiBlYV9kYXRhX2xlbjsKKwlfX3U4IGVhX25hbWVfbGVuOwkvKiBubyBOVUxMIHBvaW50ZXIgYWZ0ZXIgdGhlIHN0cmluZyAqLworCV9fdTggZWFfdHlwZTsJCS8qIEdGUzJfRUFUWVBFXy4uLiAqLworCV9fdTggZWFfZmxhZ3M7CQkvKiBHRlMyX0VBRkxBR18uLi4gKi8KKwlfX3U4IGVhX251bV9wdHJzOworCV9fdTMyIF9fcGFkOworfTsKKworLyoKKyAqIExvZyBoZWFkZXIgc3RydWN0dXJlCisgKi8KKworI2RlZmluZSBHRlMyX0xPR19IRUFEX1VOTU9VTlQJMHgwMDAwMDAwMQkvKiBsb2cgaXMgY2xlYW4gKi8KKworc3RydWN0IGdmczJfbG9nX2hlYWRlciB7CisJc3RydWN0IGdmczJfbWV0YV9oZWFkZXIgbGhfaGVhZGVyOworCisJX19iZTY0IGxoX3NlcXVlbmNlOwkvKiBTZXF1ZW5jZSBudW1iZXIgb2YgdGhpcyB0cmFuc2FjdGlvbiAqLworCV9fYmUzMiBsaF9mbGFnczsJLyogR0ZTMl9MT0dfSEVBRF8uLi4gKi8KKwlfX2JlMzIgbGhfdGFpbDsJCS8qIEJsb2NrIG51bWJlciBvZiBsb2cgdGFpbCAqLworCV9fYmUzMiBsaF9ibGtubzsKKwlfX2JlMzIgbGhfaGFzaDsKK307CisKKy8qCisgKiBMb2cgdHlwZSBkZXNjcmlwdG9yCisgKi8KKworI2RlZmluZSBHRlMyX0xPR19ERVNDX01FVEFEQVRBCTMwMAorLyogbGRfZGF0YTEgaXMgdGhlIG51bWJlciBvZiBtZXRhZGF0YSBibG9ja3MgaW4gdGhlIGRlc2NyaXB0b3IuCisgICBsZF9kYXRhMiBpcyB1bnVzZWQuICovCisKKyNkZWZpbmUgR0ZTMl9MT0dfREVTQ19SRVZPS0UJMzAxCisvKiBsZF9kYXRhMSBpcyB0aGUgbnVtYmVyIG9mIHJldm9rZSBibG9ja3MgaW4gdGhlIGRlc2NyaXB0b3IuCisgICBsZF9kYXRhMiBpcyB1bnVzZWQuICovCisKKyNkZWZpbmUgR0ZTMl9MT0dfREVTQ19KREFUQQkzMDIKKy8qIGxkX2RhdGExIGlzIHRoZSBudW1iZXIgb2YgZGF0YSBibG9ja3MgaW4gdGhlIGRlc2NyaXB0b3IuCisgICBsZF9kYXRhMiBpcyB1bnVzZWQuICovCisKK3N0cnVjdCBnZnMyX2xvZ19kZXNjcmlwdG9yIHsKKwlzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlciBsZF9oZWFkZXI7CisKKwlfX2JlMzIgbGRfdHlwZTsJCS8qIEdGUzJfTE9HX0RFU0NfLi4uICovCisJX19iZTMyIGxkX2xlbmd0aDsJLyogTnVtYmVyIG9mIGJ1ZmZlcnMgaW4gdGhpcyBjaHVuayAqLworCV9fYmUzMiBsZF9kYXRhMTsJLyogZGVzY3JpcHRvci1zcGVjaWZpYyBmaWVsZCAqLworCV9fYmUzMiBsZF9kYXRhMjsJLyogZGVzY3JpcHRvci1zcGVjaWZpYyBmaWVsZCAqLworCisJX191OCBsZF9yZXNlcnZlZFszMl07Cit9OworCisvKgorICogSW51bSBSYW5nZQorICogRGVzY3JpYmUgYSByYW5nZSBvZiBmb3JtYWwgaW5vZGUgbnVtYmVycyBhbGxvY2F0ZWQgdG8KKyAqIG9uZSBtYWNoaW5lIHRvIGFzc2lnbiB0byBpbm9kZXMuCisgKi8KKworI2RlZmluZSBHRlMyX0lOVU1fUVVBTlRVTQkxMDQ4NTc2CisKK3N0cnVjdCBnZnMyX2ludW1fcmFuZ2UgeworCV9fYmU2NCBpcl9zdGFydDsKKwlfX2JlNjQgaXJfbGVuZ3RoOworfTsKKworLyoKKyAqIFN0YXRmcyBjaGFuZ2UKKyAqIERlc2NyaWJlcyBhbiBjaGFuZ2UgdG8gdGhlIHBvb2wgb2YgZnJlZSBhbmQgYWxsb2NhdGVkCisgKiBibG9ja3MuCisgKi8KKworc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZSB7CisJX19iZTY0IHNjX3RvdGFsOworCV9fYmU2NCBzY19mcmVlOworCV9fYmU2NCBzY19kaW5vZGVzOworfTsKKworLyoKKyAqIFF1b3RhIGNoYW5nZQorICogRGVzY3JpYmVzIGFuIGFsbG9jYXRpb24gY2hhbmdlIGZvciBhIHBhcnRpY3VsYXIKKyAqIHVzZXIgb3IgZ3JvdXAuCisgKi8KKworI2RlZmluZSBHRlMyX1FDRl9VU0VSCQkweDAwMDAwMDAxCisKK3N0cnVjdCBnZnMyX3F1b3RhX2NoYW5nZSB7CisJX19iZTY0IHFjX2NoYW5nZTsKKwlfX2JlMzIgcWNfZmxhZ3M7CS8qIEdGUzJfUUNGXy4uLiAqLworCV9fYmUzMiBxY19pZDsKK307CisKK3N0cnVjdCBnZnMyX3F1b3RhX2x2YiB7CisgICAgICAgIF9fYmUzMiBxYl9tYWdpYzsKKyAgICAgICAgX191MzIgX19wYWQ7CisgICAgICAgIF9fYmU2NCBxYl9saW1pdDsgICAgICAvKiBIYXJkIGxpbWl0IG9mICMgYmxvY2tzIHRvIGFsbG9jICovCisgICAgICAgIF9fYmU2NCBxYl93YXJuOyAgICAgICAvKiBXYXJuIHVzZXIgd2hlbiBhbGxvYyBpcyBhYm92ZSB0aGlzICMgKi8KKyAgICAgICAgX19iZTY0IHFiX3ZhbHVlOyAgICAgICAvKiBDdXJyZW50ICMgYmxvY2tzIGFsbG9jYXRlZCAqLworfTsKKworI2VuZGlmIC8qIF9fR0ZTMl9PTkRJU0tfRE9UX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9naWdhc2V0X2Rldi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9naWdhc2V0X2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OGJhODIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dpZ2FzZXRfZGV2LmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIGludGVyZmFjZSB0byB1c2VyIHNwYWNlIGZvciB0aGUgZ2lnYXNldCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgYnkgSGFuc2pvZXJnIExpcHAgPGhqbGlwcEB3ZWIuZGU+CisgKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBHSUdBU0VUX0lOVEVSRkFDRV9ICisjZGVmaW5lIEdJR0FTRVRfSU5URVJGQUNFX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKy8qIFRoZSBtYWdpYyBJT0NUTCB2YWx1ZSBmb3IgdGhpcyBpbnRlcmZhY2UuICovCisjZGVmaW5lIEdJR0FTRVRfSU9DVEwgMHg0NworCisvKiBlbmFibGUvZGlzYWJsZSBkZXZpY2UgY29udHJvbCB2aWEgY2hhcmFjdGVyIGRldmljZSAobG9jayBvdXQgSVNETiBzdWJzeXMpICovCisjZGVmaW5lIEdJR0FTRVRfUkVESVIgICAgX0lPV1IoR0lHQVNFVF9JT0NUTCwgMCwgaW50KQorCisvKiBlbmFibGUgYWRhcHRlciBjb25maWd1cmF0aW9uIG1vZGUgKE0xMHggb25seSkgKi8KKyNkZWZpbmUgR0lHQVNFVF9DT05GSUcgICBfSU9XUihHSUdBU0VUX0lPQ1RMLCAxLCBpbnQpCisKKy8qIHNldCBicmVhayBjaGFyYWN0ZXJzIChNMTA1IG9ubHkpICovCisjZGVmaW5lIEdJR0FTRVRfQlJLQ0hBUlMgX0lPVyhHSUdBU0VUX0lPQ1RMLCAyLCB1bnNpZ25lZCBjaGFyWzZdKQorCisvKiBnZXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBzZWxlY3RlZCBieSBhcmdbMF0gKi8KKyNkZWZpbmUgR0lHQVNFVF9WRVJTSU9OICBfSU9XUihHSUdBU0VUX0lPQ1RMLCAzLCB1bnNpZ25lZFs0XSkKKy8qIHZhbHVlcyBmb3IgR0lHQVNFVF9WRVJTSU9OIGFyZ1swXSAqLworI2RlZmluZSBHSUdWRVJfRFJJVkVSIDAJCS8qIGdldCBkcml2ZXIgdmVyc2lvbiAqLworI2RlZmluZSBHSUdWRVJfQ09NUEFUIDEJCS8qIGdldCBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB2ZXJzaW9uICovCisjZGVmaW5lIEdJR1ZFUl9GV0JBU0UgMgkJLyogZ2V0IGJhc2Ugc3RhdGlvbiBmaXJtd2FyZSB2ZXJzaW9uICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oZGxjLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hkbGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWU0ODRkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oZGxjLmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIEdlbmVyaWMgSERMQyBzdXBwb3J0IHJvdXRpbmVzIGZvciBMaW51eAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IEtyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fSERMQ19ICisjZGVmaW5lIF9fSERMQ19ICisKKworI2RlZmluZSBIRExDX01BWF9NVFUgMTUwMAkvKiBFdGhlcm5ldCAxNTAwIGJ5dGVzICovCisjaWYgMAorI2RlZmluZSBIRExDX01BWF9NUlUgKEhETENfTUFYX01UVSArIDEwICsgMTQgKyA0KSAvKiBmb3IgRVRIK1ZMQU4gb3ZlciBGUiAqLworI2Vsc2UKKyNkZWZpbmUgSERMQ19NQVhfTVJVIDE2MDAgLyogYXMgcmVxdWlyZWQgZm9yIEZSIG5ldHdvcmsgKi8KKyNlbmRpZgorCisKKyNlbmRpZiAvKiBfX0hETENfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oZGxjL2lvY3RsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hkbGMvaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODM5NzIzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oZGxjL2lvY3RsLmgKQEAgLTAsMCArMSw4MSBAQAorI2lmbmRlZiBfX0hETENfSU9DVExfSF9fCisjZGVmaW5lIF9fSERMQ19JT0NUTF9IX18KKworCisjZGVmaW5lIEdFTkVSSUNfSERMQ19WRVJTSU9OIDQJLyogRm9yIHN5bmNocm9uaXphdGlvbiB3aXRoIHNldGhkbGMgdXRpbGl0eSAqLworCisjZGVmaW5lIENMT0NLX0RFRkFVTFQgICAwCS8qIERlZmF1bHQgc2V0dGluZyAqLworI2RlZmluZSBDTE9DS19FWFQJMQkvKiBFeHRlcm5hbCBUWCBhbmQgUlggY2xvY2sgLSBEVEUgKi8KKyNkZWZpbmUgQ0xPQ0tfSU5UCTIJLyogSW50ZXJuYWwgVFggYW5kIFJYIGNsb2NrIC0gRENFICovCisjZGVmaW5lIENMT0NLX1RYSU5UCTMJLyogSW50ZXJuYWwgVFggYW5kIGV4dGVybmFsIFJYIGNsb2NrICovCisjZGVmaW5lIENMT0NLX1RYRlJPTVJYCTQJLyogVFggY2xvY2sgZGVyaXZlZCBmcm9tIGV4dGVybmFsIFJYIGNsb2NrICovCisKKworI2RlZmluZSBFTkNPRElOR19ERUZBVUxUCTAgLyogRGVmYXVsdCBzZXR0aW5nICovCisjZGVmaW5lIEVOQ09ESU5HX05SWgkJMQorI2RlZmluZSBFTkNPRElOR19OUlpJCQkyCisjZGVmaW5lIEVOQ09ESU5HX0ZNX01BUksJMworI2RlZmluZSBFTkNPRElOR19GTV9TUEFDRQk0CisjZGVmaW5lIEVOQ09ESU5HX01BTkNIRVNURVIJNQorCisKKyNkZWZpbmUgUEFSSVRZX0RFRkFVTFQJCTAgLyogRGVmYXVsdCBzZXR0aW5nICovCisjZGVmaW5lIFBBUklUWV9OT05FCQkxIC8qIE5vIHBhcml0eSAqLworI2RlZmluZSBQQVJJVFlfQ1JDMTZfUFIwCTIgLyogQ1JDMTYsIGluaXRpYWwgdmFsdWUgMHgwMDAwICovCisjZGVmaW5lIFBBUklUWV9DUkMxNl9QUjEJMyAvKiBDUkMxNiwgaW5pdGlhbCB2YWx1ZSAweEZGRkYgKi8KKyNkZWZpbmUgUEFSSVRZX0NSQzE2X1BSMF9DQ0lUVAk0IC8qIENSQzE2LCBpbml0aWFsIDB4MDAwMCwgSVRVLVQgdmVyc2lvbiAqLworI2RlZmluZSBQQVJJVFlfQ1JDMTZfUFIxX0NDSVRUCTUgLyogQ1JDMTYsIGluaXRpYWwgMHhGRkZGLCBJVFUtVCB2ZXJzaW9uICovCisjZGVmaW5lIFBBUklUWV9DUkMzMl9QUjBfQ0NJVFQJNiAvKiBDUkMzMiwgaW5pdGlhbCB2YWx1ZSAweDAwMDAwMDAwICovCisjZGVmaW5lIFBBUklUWV9DUkMzMl9QUjFfQ0NJVFQJNyAvKiBDUkMzMiwgaW5pdGlhbCB2YWx1ZSAweEZGRkZGRkZGICovCisKKyNkZWZpbmUgTE1JX0RFRkFVTFQJCTAgLyogRGVmYXVsdCBzZXR0aW5nICovCisjZGVmaW5lIExNSV9OT05FCQkxIC8qIE5vIExNSSwgYWxsIFBWQ3MgYXJlIHN0YXRpYyAqLworI2RlZmluZSBMTUlfQU5TSQkJMiAvKiBBTlNJIEFubmV4IEQgKi8KKyNkZWZpbmUgTE1JX0NDSVRUCQkzIC8qIElUVS1UIEFubmV4IEEgKi8KKyNkZWZpbmUgTE1JX0NJU0NPCQk0IC8qIFRoZSAib3JpZ2luYWwiIExNSSwgYWthIEdhbmcgb2YgRm91ciAqLworCit0eXBlZGVmIHN0cnVjdCB7IAorCXVuc2lnbmVkIGludCBjbG9ja19yYXRlOyAvKiBiaXRzIHBlciBzZWNvbmQgKi8KKwl1bnNpZ25lZCBpbnQgY2xvY2tfdHlwZTsgLyogaW50ZXJuYWwsIGV4dGVybmFsLCBUWC1pbnRlcm5hbCBldGMuICovCisJdW5zaWduZWQgc2hvcnQgbG9vcGJhY2s7Cit9IHN5bmNfc2VyaWFsX3NldHRpbmdzOyAgICAgICAgICAvKiBWLjM1LCBWLjI0LCBYLjIxICovCisKK3R5cGVkZWYgc3RydWN0IHsgCisJdW5zaWduZWQgaW50IGNsb2NrX3JhdGU7IC8qIGJpdHMgcGVyIHNlY29uZCAqLworCXVuc2lnbmVkIGludCBjbG9ja190eXBlOyAvKiBpbnRlcm5hbCwgZXh0ZXJuYWwsIFRYLWludGVybmFsIGV0Yy4gKi8KKwl1bnNpZ25lZCBzaG9ydCBsb29wYmFjazsKKwl1bnNpZ25lZCBpbnQgc2xvdF9tYXA7Cit9IHRlMV9zZXR0aW5nczsgICAgICAgICAgICAgICAgICAvKiBUMSwgRTEgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IGVuY29kaW5nOworCXVuc2lnbmVkIHNob3J0IHBhcml0eTsKK30gcmF3X2hkbGNfcHJvdG87CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgdDM5MTsKKwl1bnNpZ25lZCBpbnQgdDM5MjsKKwl1bnNpZ25lZCBpbnQgbjM5MTsKKwl1bnNpZ25lZCBpbnQgbjM5MjsKKwl1bnNpZ25lZCBpbnQgbjM5MzsKKwl1bnNpZ25lZCBzaG9ydCBsbWk7CisJdW5zaWduZWQgc2hvcnQgZGNlOyAvKiAxIGZvciBEQ0UgKG5ldHdvcmsgc2lkZSkgb3BlcmF0aW9uICovCit9IGZyX3Byb3RvOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGRsY2k7Cit9IGZyX3Byb3RvX3B2YzsgICAgICAgICAgLyogZm9yIGNyZWF0aW5nL2RlbGV0aW5nIEZSIFBWQ3MgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBkbGNpOworCWNoYXIgbWFzdGVyW0lGTkFNU0laXTsJLyogTmFtZSBvZiBtYXN0ZXIgRlJBRCBkZXZpY2UgKi8KK31mcl9wcm90b19wdmNfaW5mbzsJCS8qIGZvciByZXR1cm5pbmcgUFZDIGluZm9ybWF0aW9uIG9ubHkgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCBpbnRlcnZhbDsKKyAgICB1bnNpZ25lZCBpbnQgdGltZW91dDsKK30gY2lzY29fcHJvdG87CisKKy8qIFBQUCBkb2Vzbid0IG5lZWQgYW55IGluZm8gbm93IC0gc3VwcGx5IGxlbmd0aCA9IDAgdG8gaW9jdGwgKi8KKworI2VuZGlmIC8qIF9fSERMQ19JT0NUTF9IX18gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaGRsY2Rydi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oZGxjZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIyZDk2NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaGRsY2Rydi5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogaGRsY2Rydi5oICAtLSBIRExDIHBhY2tldCByYWRpbyBuZXR3b3JrIGRyaXZlci4KKyAqIFRoZSBMaW51eCBzb3VuZGNhcmQgZHJpdmVyIGZvciAxMjAwIGJhdWQgYW5kIDk2MDAgYmF1ZCBwYWNrZXQgcmFkaW8KKyAqIChDKSAxOTk2LTE5OTggYnkgVGhvbWFzIFNhaWxlciwgSEI5Sk5YL0FFNFdBCisgKi8KKworI2lmbmRlZiBfSERMQ0RSVl9ICisjZGVmaW5lIF9IRExDRFJWX0gKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBzdHJ1Y3RzIGZvciB0aGUgSU9DVEwgY29tbWFuZHMKKyAqLworCitzdHJ1Y3QgaGRsY2Rydl9wYXJhbXMgeworCWludCBpb2Jhc2U7CisJaW50IGlycTsKKwlpbnQgZG1hOworCWludCBkbWEyOworCWludCBzZXJpb2Jhc2U7CisJaW50IHBhcmlvYmFzZTsKKwlpbnQgbWlkaWlvYmFzZTsKK307CQorCitzdHJ1Y3QgaGRsY2Rydl9jaGFubmVsX3BhcmFtcyB7CisJaW50IHR4X2RlbGF5OyAgLyogdGhlIHRyYW5zbWl0dGVyIGtleXVwIGRlbGF5IGluIDEwbXMgdW5pdHMgKi8KKwlpbnQgdHhfdGFpbDsgICAvKiB0aGUgdHJhbnNtaXR0ZXIga2V5b2ZmIGRlbGF5IGluIDEwbXMgdW5pdHMgKi8KKwlpbnQgc2xvdHRpbWU7ICAvKiB0aGUgc2xvdHRpbWUgaW4gMTBtczsgdXN1YWxseSAxMCA9IDEwMG1zICovCisJaW50IHBwZXJzaXN0OyAgLyogdGhlIHAtcGVyc2lzdGVuY2UgMC4uMjU1ICovCisJaW50IGZ1bGxkdXA7ICAgLyogc29tZSBkcml2ZXIgZG8gbm90IHN1cHBvcnQgZnVsbCBkdXBsZXgsIHNldHRpbmcgKi8KKwkgICAgICAgICAgICAgICAvKiB0aGlzIGp1c3QgbWFrZXMgdGhlbSBzZW5kIGV2ZW4gaWYgRENEIGlzIG9uICovCit9OwkKKworc3RydWN0IGhkbGNkcnZfb2xkX2NoYW5uZWxfc3RhdGUgeworICAJaW50IHB0dDsKKyAgCWludCBkY2Q7CisgIAlpbnQgcHR0X2tleWVkOworfTsKKworc3RydWN0IGhkbGNkcnZfY2hhbm5lbF9zdGF0ZSB7CisgCWludCBwdHQ7CisgCWludCBkY2Q7CisgCWludCBwdHRfa2V5ZWQ7CisgCXVuc2lnbmVkIGxvbmcgdHhfcGFja2V0czsKKyAJdW5zaWduZWQgbG9uZyB0eF9lcnJvcnM7CisgCXVuc2lnbmVkIGxvbmcgcnhfcGFja2V0czsKKyAJdW5zaWduZWQgbG9uZyByeF9lcnJvcnM7Cit9OworCitzdHJ1Y3QgaGRsY2Rydl9pb2N0bCB7CisJaW50IGNtZDsKKwl1bmlvbiB7CisJCXN0cnVjdCBoZGxjZHJ2X3BhcmFtcyBtcDsKKwkJc3RydWN0IGhkbGNkcnZfY2hhbm5lbF9wYXJhbXMgY3A7CisJCXN0cnVjdCBoZGxjZHJ2X2NoYW5uZWxfc3RhdGUgY3M7CisJCXN0cnVjdCBoZGxjZHJ2X29sZF9jaGFubmVsX3N0YXRlIG9jczsKKwkJdW5zaWduZWQgaW50IGNhbGlicmF0ZTsKKwkJdW5zaWduZWQgY2hhciBiaXRzOworCQljaGFyIG1vZGVuYW1lWzEyOF07CisJCWNoYXIgZHJpdmVybmFtZVszMl07CisJfSBkYXRhOworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGlvY3RsIHZhbHVlcworICovCisjZGVmaW5lIEhETENEUlZDVExfR0VUTU9ERU1QQVIgICAgICAgMAorI2RlZmluZSBIRExDRFJWQ1RMX1NFVE1PREVNUEFSICAgICAgIDEKKyNkZWZpbmUgSERMQ0RSVkNUTF9NT0RFTVBBUk1BU0sgICAgICAyICAvKiBub3QgaGFuZGxlZCBieSBoZGxjZHJ2ICovCisjZGVmaW5lIEhETENEUlZDVExfR0VUQ0hBTk5FTFBBUiAgICAxMAorI2RlZmluZSBIRExDRFJWQ1RMX1NFVENIQU5ORUxQQVIgICAgMTEKKyNkZWZpbmUgSERMQ0RSVkNUTF9PTERHRVRTVEFUICAgICAgIDIwCisjZGVmaW5lIEhETENEUlZDVExfQ0FMSUJSQVRFICAgICAgICAyMQorI2RlZmluZSBIRExDRFJWQ1RMX0dFVFNUQVQgICAgICAgICAgMjIKKworLyoKKyAqIHRoZXNlIGFyZSBtYWlubHkgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcworICovCisjZGVmaW5lIEhETENEUlZDVExfR0VUU0FNUExFUyAgICAgICAzMAorI2RlZmluZSBIRExDRFJWQ1RMX0dFVEJJVFMgICAgICAgICAgMzEKKworLyoKKyAqIG5vdCBoYW5kbGVkIGJ5IGhkbGNkcnYsIGJ1dCBieSBpdHMgZGVwZW5kaW5nIGRyaXZlcnMKKyAqLworI2RlZmluZSBIRExDRFJWQ1RMX0dFVE1PREUgICAgICAgICAgNDAKKyNkZWZpbmUgSERMQ0RSVkNUTF9TRVRNT0RFICAgICAgICAgIDQxCisjZGVmaW5lIEhETENEUlZDVExfTU9ERUxJU1QgICAgICAgICA0MgorI2RlZmluZSBIRExDRFJWQ1RMX0RSSVZFUk5BTUUgICAgICAgNDMKKworLyoKKyAqIG1hc2sgb2YgbmVlZGVkIG1vZGVtIHBhcmFtZXRlcnMsIHJldHVybmVkIGJ5IEhETENEUlZDVExfTU9ERU1QQVJNQVNLCisgKi8KKyNkZWZpbmUgSERMQ0RSVl9QQVJNQVNLX0lPQkFTRSAgICAgICgxPDwwKQorI2RlZmluZSBIRExDRFJWX1BBUk1BU0tfSVJRICAgICAgICAgKDE8PDEpCisjZGVmaW5lIEhETENEUlZfUEFSTUFTS19ETUEgICAgICAgICAoMTw8MikKKyNkZWZpbmUgSERMQ0RSVl9QQVJNQVNLX0RNQTIgICAgICAgICgxPDwzKQorI2RlZmluZSBIRExDRFJWX1BBUk1BU0tfU0VSSU9CQVNFICAgKDE8PDQpCisjZGVmaW5lIEhETENEUlZfUEFSTUFTS19QQVJJT0JBU0UgICAoMTw8NSkKKyNkZWZpbmUgSERMQ0RSVl9QQVJNQVNLX01JRElJT0JBU0UgICgxPDw2KQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNlbmRpZiAvKiBfSERMQ0RSVl9IICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hkcmVnLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hkcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0MTczZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaGRyZWcuaApAQCAtMCwwICsxLDY0MiBAQAorI2lmbmRlZiBfTElOVVhfSERSRUdfSAorI2RlZmluZSBfTElOVVhfSERSRUdfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIENvbW1hbmQgSGVhZGVyIHNpemVzIGZvciBJT0NUTCBjb21tYW5kcworICovCisKKyNkZWZpbmUgSERJT19EUklWRV9DTURfSERSX1NJWkUJCSg0ICogc2l6ZW9mKF9fdTgpKQorI2RlZmluZSBIRElPX0RSSVZFX0hPQl9IRFJfU0laRQkJKDggKiBzaXplb2YoX191OCkpCisjZGVmaW5lIEhESU9fRFJJVkVfVEFTS19IRFJfU0laRQkoOCAqIHNpemVvZihfX3U4KSkKKworI2RlZmluZSBJREVfRFJJVkVfVEFTS19OT19EQVRBCQkwCisjZGVmaW5lIElERV9EUklWRV9UQVNLX0lOVkFMSUQJCS0xCisjZGVmaW5lIElERV9EUklWRV9UQVNLX1NFVF9YRkVSCQkxCisjZGVmaW5lIElERV9EUklWRV9UQVNLX0lOCQkyCisjZGVmaW5lIElERV9EUklWRV9UQVNLX09VVAkJMworI2RlZmluZSBJREVfRFJJVkVfVEFTS19SQVdfV1JJVEUJNAorCisvKgorICogRGVmaW5lIHN0YW5kYXJkIHRhc2tmaWxlIGluL291dCByZWdpc3RlcgorICovCisjZGVmaW5lIElERV9UQVNLRklMRV9TVERfSU5fRkxBR1MJMHhGRQorI2RlZmluZSBJREVfSE9CX1NURF9JTl9GTEFHUwkJMHgzQworI2RlZmluZSBJREVfVEFTS0ZJTEVfU1REX09VVF9GTEFHUwkweEZFCisjZGVmaW5lIElERV9IT0JfU1REX09VVF9GTEFHUwkJMHgzQworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdGFza19pb3JlZ190OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHNhdGFfaW9yZWdfdDsKKwordHlwZWRlZiB1bmlvbiBpZGVfcmVnX3ZhbGlkX3MgeworCXVuc2lnbmVkIGFsbAkJCQk6IDE2OworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGRhdGEJCQk6IDE7CisJCXVuc2lnbmVkIGVycm9yX2ZlYXR1cmUJCTogMTsKKwkJdW5zaWduZWQgc2VjdG9yCQkJOiAxOworCQl1bnNpZ25lZCBuc2VjdG9yCQk6IDE7CisJCXVuc2lnbmVkIGxjeWwJCQk6IDE7CisJCXVuc2lnbmVkIGhjeWwJCQk6IDE7CisJCXVuc2lnbmVkIHNlbGVjdAkJCTogMTsKKwkJdW5zaWduZWQgc3RhdHVzX2NvbW1hbmQJCTogMTsKKworCQl1bnNpZ25lZCBkYXRhX2hvYgkJOiAxOworCQl1bnNpZ25lZCBlcnJvcl9mZWF0dXJlX2hvYgk6IDE7CisJCXVuc2lnbmVkIHNlY3Rvcl9ob2IJCTogMTsKKwkJdW5zaWduZWQgbnNlY3Rvcl9ob2IJCTogMTsKKwkJdW5zaWduZWQgbGN5bF9ob2IJCTogMTsKKwkJdW5zaWduZWQgaGN5bF9ob2IJCTogMTsKKwkJdW5zaWduZWQgc2VsZWN0X2hvYgkJOiAxOworCQl1bnNpZ25lZCBjb250cm9sX2hvYgkJOiAxOworCX0gYjsKK30gaWRlX3JlZ192YWxpZF90OworCit0eXBlZGVmIHN0cnVjdCBpZGVfdGFza19yZXF1ZXN0X3MgeworCV9fdTgJCWlvX3BvcnRzWzhdOworCV9fdTgJCWhvYl9wb3J0c1s4XTsgLyogYnl0ZXMgNiBhbmQgNyBhcmUgdW51c2VkICovCisJaWRlX3JlZ192YWxpZF90CW91dF9mbGFnczsKKwlpZGVfcmVnX3ZhbGlkX3QJaW5fZmxhZ3M7CisJaW50CQlkYXRhX3BoYXNlOworCWludAkJcmVxX2NtZDsKKwl1bnNpZ25lZCBsb25nCW91dF9zaXplOworCXVuc2lnbmVkIGxvbmcJaW5fc2l6ZTsKK30gaWRlX3Rhc2tfcmVxdWVzdF90OworCit0eXBlZGVmIHN0cnVjdCBpZGVfaW9jdGxfcmVxdWVzdF9zIHsKKwlpZGVfdGFza19yZXF1ZXN0X3QJKnRhc2tfcmVxdWVzdDsKKwl1bnNpZ25lZCBjaGFyCQkqb3V0X2J1ZmZlcjsKKwl1bnNpZ25lZCBjaGFyCQkqaW5fYnVmZmVyOworfSBpZGVfaW9jdGxfcmVxdWVzdF90OworCitzdHJ1Y3QgaGRfZHJpdmVfY21kX2hkciB7CisJX191OCBjb21tYW5kOworCV9fdTggc2VjdG9yX251bWJlcjsKKwlfX3U4IGZlYXR1cmU7CisJX191OCBzZWN0b3JfY291bnQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBoZF9kcml2ZV90YXNrX2hkciB7CisJX191OCBkYXRhOworCV9fdTggZmVhdHVyZTsKKwlfX3U4IHNlY3Rvcl9jb3VudDsKKwlfX3U4IHNlY3Rvcl9udW1iZXI7CisJX191OCBsb3dfY3lsaW5kZXI7CisJX191OCBoaWdoX2N5bGluZGVyOworCV9fdTggZGV2aWNlX2hlYWQ7CisJX191OCBjb21tYW5kOworfSB0YXNrX3N0cnVjdF90OworCit0eXBlZGVmIHN0cnVjdCBoZF9kcml2ZV9ob2JfaGRyIHsKKwlfX3U4IGRhdGE7CisJX191OCBmZWF0dXJlOworCV9fdTggc2VjdG9yX2NvdW50OworCV9fdTggc2VjdG9yX251bWJlcjsKKwlfX3U4IGxvd19jeWxpbmRlcjsKKwlfX3U4IGhpZ2hfY3lsaW5kZXI7CisJX191OCBkZXZpY2VfaGVhZDsKKwlfX3U4IGNvbnRyb2w7Cit9IGhvYl9zdHJ1Y3RfdDsKKworI2RlZmluZSBUQVNLRklMRV9OT19EQVRBCQkweDAwMDAKKworI2RlZmluZSBUQVNLRklMRV9JTgkJCTB4MDAwMQorI2RlZmluZSBUQVNLRklMRV9NVUxUSV9JTgkJMHgwMDAyCisKKyNkZWZpbmUgVEFTS0ZJTEVfT1VUCQkJMHgwMDA0CisjZGVmaW5lIFRBU0tGSUxFX01VTFRJX09VVAkJMHgwMDA4CisjZGVmaW5lIFRBU0tGSUxFX0lOX09VVAkJCTB4MDAxMAorCisjZGVmaW5lIFRBU0tGSUxFX0lOX0RNQQkJCTB4MDAyMAorI2RlZmluZSBUQVNLRklMRV9PVVRfRE1BCQkweDAwNDAKKyNkZWZpbmUgVEFTS0ZJTEVfSU5fRE1BUQkJMHgwMDgwCisjZGVmaW5lIFRBU0tGSUxFX09VVF9ETUFRCQkweDAxMDAKKworI2RlZmluZSBUQVNLRklMRV9QX0lOCQkJMHgwMjAwCisjZGVmaW5lIFRBU0tGSUxFX1BfT1VUCQkJMHgwNDAwCisjZGVmaW5lIFRBU0tGSUxFX1BfSU5fRE1BCQkweDA4MDAKKyNkZWZpbmUgVEFTS0ZJTEVfUF9PVVRfRE1BCQkweDEwMDAKKyNkZWZpbmUgVEFTS0ZJTEVfUF9JTl9ETUFRCQkweDIwMDAKKyNkZWZpbmUgVEFTS0ZJTEVfUF9PVVRfRE1BUQkJMHg0MDAwCisjZGVmaW5lIFRBU0tGSUxFXzQ4CQkJMHg4MDAwCisjZGVmaW5lIFRBU0tGSUxFX0lOVkFMSUQJCTB4N2ZmZgorCisvKiBBVEEvQVRBUEkgQ29tbWFuZHMgcHJlIFQxMyBTcGVjICovCisjZGVmaW5lIFdJTl9OT1AJCQkJMHgwMAorLyoKKyAqCTB4MDEtPjB4MDIgUmVzZXJ2ZWQKKyAqLworI2RlZmluZSBDRkFfUkVRX0VYVF9FUlJPUl9DT0RFCQkweDAzIC8qIENGQSBSZXF1ZXN0IEV4dGVuZGVkIEVycm9yIENvZGUgKi8KKy8qCisgKgkweDA0LT4weDA3IFJlc2VydmVkCisgKi8KKyNkZWZpbmUgV0lOX1NSU1QJCQkweDA4IC8qIEFUQVBJIHNvZnQgcmVzZXQgY29tbWFuZCAqLworI2RlZmluZSBXSU5fREVWSUNFX1JFU0VUCQkweDA4CisvKgorICoJMHgwOS0+MHgwRiBSZXNlcnZlZAorICovCisjZGVmaW5lIFdJTl9SRUNBTAkJCTB4MTAKKyNkZWZpbmUgV0lOX1JFU1RPUkUJCQlXSU5fUkVDQUwKKy8qCisgKgkweDEwLT4weDFGIFJlc2VydmVkCisgKi8KKyNkZWZpbmUgV0lOX1JFQUQJCQkweDIwIC8qIDI4LUJpdCAqLworI2RlZmluZSBXSU5fUkVBRF9PTkNFCQkJMHgyMSAvKiAyOC1CaXQgd2l0aG91dCByZXRyaWVzICovCisjZGVmaW5lIFdJTl9SRUFEX0xPTkcJCQkweDIyIC8qIDI4LUJpdCAqLworI2RlZmluZSBXSU5fUkVBRF9MT05HX09OQ0UJCTB4MjMgLyogMjgtQml0IHdpdGhvdXQgcmV0cmllcyAqLworI2RlZmluZSBXSU5fUkVBRF9FWFQJCQkweDI0IC8qIDQ4LUJpdCAqLworI2RlZmluZSBXSU5fUkVBRERNQV9FWFQJCQkweDI1IC8qIDQ4LUJpdCAqLworI2RlZmluZSBXSU5fUkVBRERNQV9RVUVVRURfRVhUCQkweDI2IC8qIDQ4LUJpdCAqLworI2RlZmluZSBXSU5fUkVBRF9OQVRJVkVfTUFYX0VYVAkJMHgyNyAvKiA0OC1CaXQgKi8KKy8qCisgKgkweDI4CisgKi8KKyNkZWZpbmUgV0lOX01VTFRSRUFEX0VYVAkJMHgyOSAvKiA0OC1CaXQgKi8KKy8qCisgKgkweDJBLT4weDJGIFJlc2VydmVkCisgKi8KKyNkZWZpbmUgV0lOX1dSSVRFCQkJMHgzMCAvKiAyOC1CaXQgKi8KKyNkZWZpbmUgV0lOX1dSSVRFX09OQ0UJCQkweDMxIC8qIDI4LUJpdCB3aXRob3V0IHJldHJpZXMgKi8KKyNkZWZpbmUgV0lOX1dSSVRFX0xPTkcJCQkweDMyIC8qIDI4LUJpdCAqLworI2RlZmluZSBXSU5fV1JJVEVfTE9OR19PTkNFCQkweDMzIC8qIDI4LUJpdCB3aXRob3V0IHJldHJpZXMgKi8KKyNkZWZpbmUgV0lOX1dSSVRFX0VYVAkJCTB4MzQgLyogNDgtQml0ICovCisjZGVmaW5lIFdJTl9XUklURURNQV9FWFQJCTB4MzUgLyogNDgtQml0ICovCisjZGVmaW5lIFdJTl9XUklURURNQV9RVUVVRURfRVhUCQkweDM2IC8qIDQ4LUJpdCAqLworI2RlZmluZSBXSU5fU0VUX01BWF9FWFQJCQkweDM3IC8qIDQ4LUJpdCAqLworI2RlZmluZSBDRkFfV1JJVEVfU0VDVF9XT19FUkFTRQkJMHgzOCAvKiBDRkEgV3JpdGUgU2VjdG9ycyB3aXRob3V0IGVyYXNlICovCisjZGVmaW5lIFdJTl9NVUxUV1JJVEVfRVhUCQkweDM5IC8qIDQ4LUJpdCAqLworLyoKKyAqCTB4M0EtPjB4M0IgUmVzZXJ2ZWQKKyAqLworI2RlZmluZSBXSU5fV1JJVEVfVkVSSUZZCQkweDNDIC8qIDI4LUJpdCAqLworLyoKKyAqCTB4M0QtPjB4M0YgUmVzZXJ2ZWQKKyAqLworI2RlZmluZSBXSU5fVkVSSUZZCQkJMHg0MCAvKiAyOC1CaXQgLSBSZWFkIFZlcmlmeSBTZWN0b3JzICovCisjZGVmaW5lIFdJTl9WRVJJRllfT05DRQkJCTB4NDEgLyogMjgtQml0IC0gd2l0aG91dCByZXRyaWVzICovCisjZGVmaW5lIFdJTl9WRVJJRllfRVhUCQkJMHg0MiAvKiA0OC1CaXQgKi8KKy8qCisgKgkweDQzLT4weDRGIFJlc2VydmVkCisgKi8KKyNkZWZpbmUgV0lOX0ZPUk1BVAkJCTB4NTAKKy8qCisgKgkweDUxLT4weDVGIFJlc2VydmVkCisgKi8KKyNkZWZpbmUgV0lOX0lOSVQJCQkweDYwCisvKgorICoJMHg2MS0+MHg1RiBSZXNlcnZlZAorICovCisjZGVmaW5lIFdJTl9TRUVLCQkJMHg3MCAvKiAweDcwLTB4N0YgUmVzZXJ2ZWQgKi8KKworI2RlZmluZSBDRkFfVFJBTlNMQVRFX1NFQ1RPUgkJMHg4NyAvKiBDRkEgVHJhbnNsYXRlIFNlY3RvciAqLworI2RlZmluZSBXSU5fRElBR05PU0UJCQkweDkwCisjZGVmaW5lIFdJTl9TUEVDSUZZCQkJMHg5MSAvKiBzZXQgZHJpdmUgZ2VvbWV0cnkgdHJhbnNsYXRpb24gKi8KKyNkZWZpbmUgV0lOX0RPV05MT0FEX01JQ1JPQ09ERQkJMHg5MgorI2RlZmluZSBXSU5fU1RBTkRCWU5PVzIJCQkweDk0CisjZGVmaW5lIFdJTl9TVEFOREJZMgkJCTB4OTYKKyNkZWZpbmUgV0lOX1NFVElETEUyCQkJMHg5NworI2RlZmluZSBXSU5fQ0hFQ0tQT1dFUk1PREUyCQkweDk4CisjZGVmaW5lIFdJTl9TTEVFUE5PVzIJCQkweDk5CisvKgorICoJMHg5QSBWRU5ET1IKKyAqLworI2RlZmluZSBXSU5fUEFDS0VUQ01ECQkJMHhBMCAvKiBTZW5kIGEgcGFja2V0IGNvbW1hbmQuICovCisjZGVmaW5lIFdJTl9QSURFTlRJRlkJCQkweEExIC8qIGlkZW50aWZ5IEFUQVBJIGRldmljZQkqLworI2RlZmluZSBXSU5fUVVFVUVEX1NFUlZJQ0UJCTB4QTIKKyNkZWZpbmUgV0lOX1NNQVJUCQkJMHhCMCAvKiBzZWxmLW1vbml0b3JpbmcgYW5kIHJlcG9ydGluZyAqLworI2RlZmluZSBDRkFfRVJBU0VfU0VDVE9SUwkJMHhDMAorI2RlZmluZSBXSU5fTVVMVFJFQUQJCQkweEM0IC8qIHJlYWQgc2VjdG9ycyB1c2luZyBtdWx0aXBsZSBtb2RlKi8KKyNkZWZpbmUgV0lOX01VTFRXUklURQkJCTB4QzUgLyogd3JpdGUgc2VjdG9ycyB1c2luZyBtdWx0aXBsZSBtb2RlICovCisjZGVmaW5lIFdJTl9TRVRNVUxUCQkJMHhDNiAvKiBlbmFibGUvZGlzYWJsZSBtdWx0aXBsZSBtb2RlICovCisjZGVmaW5lIFdJTl9SRUFERE1BX1FVRVVFRAkJMHhDNyAvKiByZWFkIHNlY3RvcnMgdXNpbmcgUXVldWVkIERNQSB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgV0lOX1JFQURETUEJCQkweEM4IC8qIHJlYWQgc2VjdG9ycyB1c2luZyBETUEgdHJhbnNmZXJzICovCisjZGVmaW5lIFdJTl9SRUFERE1BX09OQ0UJCTB4QzkgLyogMjgtQml0IC0gd2l0aG91dCByZXRyaWVzICovCisjZGVmaW5lIFdJTl9XUklURURNQQkJCTB4Q0EgLyogd3JpdGUgc2VjdG9ycyB1c2luZyBETUEgdHJhbnNmZXJzICovCisjZGVmaW5lIFdJTl9XUklURURNQV9PTkNFCQkweENCIC8qIDI4LUJpdCAtIHdpdGhvdXQgcmV0cmllcyAqLworI2RlZmluZSBXSU5fV1JJVEVETUFfUVVFVUVECQkweENDIC8qIHdyaXRlIHNlY3RvcnMgdXNpbmcgUXVldWVkIERNQSB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgQ0ZBX1dSSVRFX01VTFRJX1dPX0VSQVNFCTB4Q0QgLyogQ0ZBIFdyaXRlIG11bHRpcGxlIHdpdGhvdXQgZXJhc2UgKi8KKyNkZWZpbmUgV0lOX0dFVE1FRElBU1RBVFVTCQkweERBCisjZGVmaW5lIFdJTl9BQ0tNRURJQUNIQU5HRQkJMHhEQiAvKiBBVEEtMSwgQVRBLTIgdmVuZG9yICovCisjZGVmaW5lIFdJTl9QT1NUQk9PVAkJCTB4REMKKyNkZWZpbmUgV0lOX1BSRUJPT1QgCQkJMHhERAorI2RlZmluZSBXSU5fRE9PUkxPQ0sJCQkweERFIC8qIGxvY2sgZG9vciBvbiByZW1vdmFibGUgZHJpdmVzICovCisjZGVmaW5lIFdJTl9ET09SVU5MT0NLCQkJMHhERiAvKiB1bmxvY2sgZG9vciBvbiByZW1vdmFibGUgZHJpdmVzICovCisjZGVmaW5lIFdJTl9TVEFOREJZTk9XMQkJCTB4RTAKKyNkZWZpbmUgV0lOX0lETEVJTU1FRElBVEUJCTB4RTEgLyogZm9yY2UgZHJpdmUgdG8gYmVjb21lICJyZWFkeSIgKi8KKyNkZWZpbmUgV0lOX1NUQU5EQlkJCQkweEUyIC8qIFNldCBkZXZpY2UgaW4gU3RhbmRieSBNb2RlICovCisjZGVmaW5lIFdJTl9TRVRJRExFMQkJCTB4RTMKKyNkZWZpbmUgV0lOX1JFQURfQlVGRkVSCQkJMHhFNCAvKiBmb3JjZSByZWFkIG9ubHkgMSBzZWN0b3IgKi8KKyNkZWZpbmUgV0lOX0NIRUNLUE9XRVJNT0RFMQkJMHhFNQorI2RlZmluZSBXSU5fU0xFRVBOT1cxCQkJMHhFNgorI2RlZmluZSBXSU5fRkxVU0hfQ0FDSEUJCQkweEU3CisjZGVmaW5lIFdJTl9XUklURV9CVUZGRVIJCTB4RTggLyogZm9yY2Ugd3JpdGUgb25seSAxIHNlY3RvciAqLworI2RlZmluZSBXSU5fV1JJVEVfU0FNRQkJCTB4RTkgLyogcmVhZCBhdGEtMiB0byB1c2UgKi8KKwkvKiBTRVRfRkVBVFVSRVMgMHgyMiBvciAweEREICovCisjZGVmaW5lIFdJTl9GTFVTSF9DQUNIRV9FWFQJCTB4RUEgLyogNDgtQml0ICovCisjZGVmaW5lIFdJTl9JREVOVElGWQkJCTB4RUMgLyogYXNrIGRyaXZlIHRvIGlkZW50aWZ5IGl0c2VsZgkqLworI2RlZmluZSBXSU5fTUVESUFFSkVDVAkJCTB4RUQKKyNkZWZpbmUgV0lOX0lERU5USUZZX0RNQQkJMHhFRSAvKiBzYW1lIGFzIFdJTl9JREVOVElGWSwgYnV0IERNQSAqLworI2RlZmluZSBXSU5fU0VURkVBVFVSRVMJCQkweEVGIC8qIHNldCBzcGVjaWFsIGRyaXZlIGZlYXR1cmVzICovCisjZGVmaW5lIEVYQUJZVEVfRU5BQkxFX05FU1QJCTB4RjAKKyNkZWZpbmUgV0lOX1NFQ1VSSVRZX1NFVF9QQVNTCQkweEYxCisjZGVmaW5lIFdJTl9TRUNVUklUWV9VTkxPQ0sJCTB4RjIKKyNkZWZpbmUgV0lOX1NFQ1VSSVRZX0VSQVNFX1BSRVBBUkUJMHhGMworI2RlZmluZSBXSU5fU0VDVVJJVFlfRVJBU0VfVU5JVAkJMHhGNAorI2RlZmluZSBXSU5fU0VDVVJJVFlfRlJFRVpFX0xPQ0sJMHhGNQorI2RlZmluZSBXSU5fU0VDVVJJVFlfRElTQUJMRQkJMHhGNgorI2RlZmluZSBXSU5fUkVBRF9OQVRJVkVfTUFYCQkweEY4IC8qIHJldHVybiB0aGUgbmF0aXZlIG1heGltdW0gYWRkcmVzcyAqLworI2RlZmluZSBXSU5fU0VUX01BWAkJCTB4RjkKKyNkZWZpbmUgRElTQUJMRV9TRUFHQVRFCQkJMHhGQgorCisvKiBXSU5fU01BUlQgc3ViLWNvbW1hbmRzICovCisKKyNkZWZpbmUgU01BUlRfUkVBRF9WQUxVRVMJCTB4RDAKKyNkZWZpbmUgU01BUlRfUkVBRF9USFJFU0hPTERTCQkweEQxCisjZGVmaW5lIFNNQVJUX0FVVE9TQVZFCQkJMHhEMgorI2RlZmluZSBTTUFSVF9TQVZFCQkJMHhEMworI2RlZmluZSBTTUFSVF9JTU1FRElBVEVfT0ZGTElORQkJMHhENAorI2RlZmluZSBTTUFSVF9SRUFEX0xPR19TRUNUT1IJCTB4RDUKKyNkZWZpbmUgU01BUlRfV1JJVEVfTE9HX1NFQ1RPUgkJMHhENgorI2RlZmluZSBTTUFSVF9XUklURV9USFJFU0hPTERTCQkweEQ3CisjZGVmaW5lIFNNQVJUX0VOQUJMRQkJCTB4RDgKKyNkZWZpbmUgU01BUlRfRElTQUJMRQkJCTB4RDkKKyNkZWZpbmUgU01BUlRfU1RBVFVTCQkJMHhEQQorI2RlZmluZSBTTUFSVF9BVVRPX09GRkxJTkUJCTB4REIKKworLyogUGFzc3dvcmQgdXNlZCBpbiBURjQgJiBURjUgZXhlY3V0aW5nIFNNQVJUIGNvbW1hbmRzICovCisKKyNkZWZpbmUgU01BUlRfTENZTF9QQVNTCQkJMHg0RgorI2RlZmluZSBTTUFSVF9IQ1lMX1BBU1MJCQkweEMyCisKKy8qIFdJTl9TRVRGRUFUVVJFUyBzdWItY29tbWFuZHMgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRU5fOEJJVAkweDAxCS8qIEVuYWJsZSA4LUJpdCBUcmFuc2ZlcnMgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRU5fV0NBQ0hFCTB4MDIJLyogRW5hYmxlIHdyaXRlIGNhY2hlICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0RJU19ERUZFQ1QJMHgwNAkvKiBEaXNhYmxlIERlZmVjdCBNYW5hZ2VtZW50ICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0VOX0FQTQkweDA1CS8qIEVuYWJsZSBhZHZhbmNlZCBwb3dlciBtYW5hZ2VtZW50ICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0VOX1NBTUVfUgkweDIyCS8qIGZvciBhIHJlZ2lvbiBBVEEtMSAqLworI2RlZmluZSBTRVRGRUFUVVJFU19ESVNfTVNOCTB4MzEJLyogRGlzYWJsZSBNZWRpYSBTdGF0dXMgTm90aWZpY2F0aW9uICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0RJU19SRVRSWQkweDMzCS8qIERpc2FibGUgUmV0cnkgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRU5fQUFNCTB4NDIJLyogRW5hYmxlIEF1dG9tYXRpYyBBY291c3RpYyBNYW5hZ2VtZW50ICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX1JXX0xPTkcJMHg0NAkvKiBTZXQgTGVuZ3RoIG9mIFZTIGJ5dGVzICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX1NFVF9DQUNIRQkweDU0CS8qIFNldCBDYWNoZSBzZWdtZW50cyB0byBTQyBSZWcuIFZhbCAqLworI2RlZmluZSBTRVRGRUFUVVJFU19ESVNfUkxBCTB4NTUJLyogRGlzYWJsZSByZWFkIGxvb2stYWhlYWQgZmVhdHVyZSAqLworI2RlZmluZSBTRVRGRUFUVVJFU19FTl9SSQkweDVECS8qIEVuYWJsZSByZWxlYXNlIGludGVycnVwdCAqLworI2RlZmluZSBTRVRGRUFUVVJFU19FTl9TSQkweDVFCS8qIEVuYWJsZSBTRVJWSUNFIGludGVycnVwdCAqLworI2RlZmluZSBTRVRGRUFUVVJFU19ESVNfUlBPRAkweDY2CS8qIERpc2FibGUgcmV2ZXJ0aW5nIHRvIHBvd2VyIG9uIGRlZmF1bHRzICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0RJU19FQ0MJMHg3NwkvKiBEaXNhYmxlIEVDQyBieXRlIGNvdW50ICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0RJU184QklUCTB4ODEJLyogRGlzYWJsZSA4LUJpdCBUcmFuc2ZlcnMgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRElTX1dDQUNIRQkweDgyCS8qIERpc2FibGUgd3JpdGUgY2FjaGUgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRU5fREVGRUNUCTB4ODQJLyogRW5hYmxlIERlZmVjdCBNYW5hZ2VtZW50ICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0RJU19BUE0JMHg4NQkvKiBEaXNhYmxlIGFkdmFuY2VkIHBvd2VyIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRU5fRUNDCTB4ODgJLyogRW5hYmxlIEVDQyBieXRlIGNvdW50ICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0VOX01TTgkweDk1CS8qIEVuYWJsZSBNZWRpYSBTdGF0dXMgTm90aWZpY2F0aW9uICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0VOX1JFVFJZCTB4OTkJLyogRW5hYmxlIFJldHJ5ICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0VOX1JMQQkweEFBCS8qIEVuYWJsZSByZWFkIGxvb2stYWhlYWQgZmVhdHVyZSAqLworI2RlZmluZSBTRVRGRUFUVVJFU19QUkVGRVRDSAkweEFCCS8qIFNldHMgZHJpdmUgcHJlZmV0Y2ggdmFsdWUgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRU5fUkVTVAkweEFDCS8qIEFUQS0xICovCisjZGVmaW5lIFNFVEZFQVRVUkVTXzRCX1JXX0xPTkcJMHhCQgkvKiBTZXQgTGVuZ3RoIG9mIDQgYnl0ZXMgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRElTX0FBTQkweEMyCS8qIERpc2FibGUgQXV0b21hdGljIEFjb3VzdGljIE1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRU5fUlBPRAkweENDCS8qIEVuYWJsZSByZXZlcnRpbmcgdG8gcG93ZXIgb24gZGVmYXVsdHMgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRElTX1JJCTB4REQJLyogRGlzYWJsZSByZWxlYXNlIGludGVycnVwdCBBVEFQSSAqLworI2RlZmluZSBTRVRGRUFUVVJFU19FTl9TQU1FX00JMHhERAkvKiBmb3IgYSBlbnRpcmUgZGV2aWNlIEFUQS0xICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0RJU19TSQkweERFCS8qIERpc2FibGUgU0VSVklDRSBpbnRlcnJ1cHQgQVRBUEkgKi8KKworLyogV0lOX1NFQ1VSSVRZIHN1Yi1jb21tYW5kcyAqLworCisjZGVmaW5lIFNFQ1VSSVRZX1NFVF9QQVNTV09SRAkJMHhCQQorI2RlZmluZSBTRUNVUklUWV9VTkxPQ0sJCQkweEJCCisjZGVmaW5lIFNFQ1VSSVRZX0VSQVNFX1BSRVBBUkUJCTB4QkMKKyNkZWZpbmUgU0VDVVJJVFlfRVJBU0VfVU5JVAkJMHhCRAorI2RlZmluZSBTRUNVUklUWV9GUkVFWkVfTE9DSwkJMHhCRQorI2RlZmluZSBTRUNVUklUWV9ESVNBQkxFX1BBU1NXT1JECTB4QkYKKworc3RydWN0IGhkX2dlb21ldHJ5IHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaGVhZHM7CisgICAgICB1bnNpZ25lZCBjaGFyIHNlY3RvcnM7CisgICAgICB1bnNpZ25lZCBzaG9ydCBjeWxpbmRlcnM7CisgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0OworfTsKKworLyogaGQvaWRlIGN0bCdzIHRoYXQgcGFzcyAoYXJnKSBwdHJzIHRvIHVzZXIgc3BhY2UgYXJlIG51bWJlcmVkIDB4MDMwbi8weDAzMW4gKi8KKyNkZWZpbmUgSERJT19HRVRHRU8JCTB4MDMwMQkvKiBnZXQgZGV2aWNlIGdlb21ldHJ5ICovCisjZGVmaW5lIEhESU9fR0VUX1VOTUFTS0lOVFIJMHgwMzAyCS8qIGdldCBjdXJyZW50IHVubWFzayBzZXR0aW5nICovCisjZGVmaW5lIEhESU9fR0VUX01VTFRDT1VOVAkweDAzMDQJLyogZ2V0IGN1cnJlbnQgSURFIGJsb2NrbW9kZSBzZXR0aW5nICovCisjZGVmaW5lIEhESU9fR0VUX1FETUEJCTB4MDMwNQkvKiBnZXQgdXNlLXFkbWEgZmxhZyAqLworCisjZGVmaW5lIEhESU9fU0VUX1hGRVIJCTB4MDMwNiAgLyogc2V0IHRyYW5zZmVyIHJhdGUgdmlhIHByb2MgKi8KKworI2RlZmluZSBIRElPX09CU09MRVRFX0lERU5USVRZCTB4MDMwNwkvKiBPQlNPTEVURSwgRE8gTk9UIFVTRTogcmV0dXJucyAxNDIgYnl0ZXMgKi8KKyNkZWZpbmUgSERJT19HRVRfS0VFUFNFVFRJTkdTCTB4MDMwOAkvKiBnZXQga2VlcC1zZXR0aW5ncy1vbi1yZXNldCBmbGFnICovCisjZGVmaW5lIEhESU9fR0VUXzMyQklUCQkweDAzMDkJLyogZ2V0IGN1cnJlbnQgaW9fMzJiaXQgc2V0dGluZyAqLworI2RlZmluZSBIRElPX0dFVF9OT1dFUlIJCTB4MDMwYQkvKiBnZXQgaWdub3JlLXdyaXRlLWVycm9yIGZsYWcgKi8KKyNkZWZpbmUgSERJT19HRVRfRE1BCQkweDAzMGIJLyogZ2V0IHVzZS1kbWEgZmxhZyAqLworI2RlZmluZSBIRElPX0dFVF9OSUNFCQkweDAzMGMJLyogZ2V0IG5pY2UgZmxhZ3MgKi8KKyNkZWZpbmUgSERJT19HRVRfSURFTlRJVFkJMHgwMzBkCS8qIGdldCBJREUgaWRlbnRpZmljYXRpb24gaW5mbyAqLworI2RlZmluZSBIRElPX0dFVF9XQ0FDSEUJCTB4MDMwZQkvKiBnZXQgd3JpdGUgY2FjaGUgbW9kZSBvbnxvZmYgKi8KKyNkZWZpbmUgSERJT19HRVRfQUNPVVNUSUMJMHgwMzBmCS8qIGdldCBhY291c3RpYyB2YWx1ZSAqLworI2RlZmluZQlIRElPX0dFVF9BRERSRVNTCTB4MDMxMAkvKiAqLworCisjZGVmaW5lIEhESU9fR0VUX0JVU1NUQVRFCTB4MDMxYQkvKiBnZXQgdGhlIGJ1cyBzdGF0ZSBvZiB0aGUgaHdpZiAqLworI2RlZmluZSBIRElPX1RSSVNUQVRFX0hXSUYJMHgwMzFiCS8qIGV4ZWN1dGUgYSBjaGFubmVsIHRyaXN0YXRlICovCisjZGVmaW5lIEhESU9fRFJJVkVfUkVTRVQJMHgwMzFjCS8qIGV4ZWN1dGUgYSBkZXZpY2UgcmVzZXQgKi8KKyNkZWZpbmUgSERJT19EUklWRV9UQVNLRklMRQkweDAzMWQJLyogZXhlY3V0ZSByYXcgdGFza2ZpbGUgKi8KKyNkZWZpbmUgSERJT19EUklWRV9UQVNLCQkweDAzMWUJLyogZXhlY3V0ZSB0YXNrIGFuZCBzcGVjaWFsIGRyaXZlIGNvbW1hbmQgKi8KKyNkZWZpbmUgSERJT19EUklWRV9DTUQJCTB4MDMxZgkvKiBleGVjdXRlIGEgc3BlY2lhbCBkcml2ZSBjb21tYW5kICovCisjZGVmaW5lIEhESU9fRFJJVkVfQ01EX0FFQglIRElPX0RSSVZFX1RBU0sKKworLyogaGQvaWRlIGN0bCdzIHRoYXQgcGFzcyAoYXJnKSBub24tcHRyIHZhbHVlcyBhcmUgbnVtYmVyZWQgMHgwMzJuLzB4MDMzbiAqLworI2RlZmluZSBIRElPX1NFVF9NVUxUQ09VTlQJMHgwMzIxCS8qIGNoYW5nZSBJREUgYmxvY2ttb2RlICovCisjZGVmaW5lIEhESU9fU0VUX1VOTUFTS0lOVFIJMHgwMzIyCS8qIHBlcm1pdCBvdGhlciBpcnFzIGR1cmluZyBJL08gKi8KKyNkZWZpbmUgSERJT19TRVRfS0VFUFNFVFRJTkdTCTB4MDMyMwkvKiBrZWVwIGlvY3RsIHNldHRpbmdzIG9uIHJlc2V0ICovCisjZGVmaW5lIEhESU9fU0VUXzMyQklUCQkweDAzMjQJLyogY2hhbmdlIGlvXzMyYml0IGZsYWdzICovCisjZGVmaW5lIEhESU9fU0VUX05PV0VSUgkJMHgwMzI1CS8qIGNoYW5nZSBpZ25vcmUtd3JpdGUtZXJyb3IgZmxhZyAqLworI2RlZmluZSBIRElPX1NFVF9ETUEJCTB4MDMyNgkvKiBjaGFuZ2UgdXNlLWRtYSBmbGFnICovCisjZGVmaW5lIEhESU9fU0VUX1BJT19NT0RFCTB4MDMyNwkvKiByZWNvbmZpZyBpbnRlcmZhY2UgdG8gbmV3IHNwZWVkICovCisjZGVmaW5lIEhESU9fU0NBTl9IV0lGCQkweDAzMjgJLyogcmVnaXN0ZXIgYW5kIChyZSlzY2FuIGludGVyZmFjZSAqLworI2RlZmluZSBIRElPX1VOUkVHSVNURVJfSFdJRgkweDAzMmEgIC8qIHVucmVnaXN0ZXIgaW50ZXJmYWNlICovCisjZGVmaW5lIEhESU9fU0VUX05JQ0UJCTB4MDMyOQkvKiBzZXQgbmljZSBmbGFncyAqLworI2RlZmluZSBIRElPX1NFVF9XQ0FDSEUJCTB4MDMyYgkvKiBjaGFuZ2Ugd3JpdGUgY2FjaGUgZW5hYmxlLWRpc2FibGUgKi8KKyNkZWZpbmUgSERJT19TRVRfQUNPVVNUSUMJMHgwMzJjCS8qIGNoYW5nZSBhY291c3RpYyBiZWhhdmlvciAqLworI2RlZmluZSBIRElPX1NFVF9CVVNTVEFURQkweDAzMmQJLyogc2V0IHRoZSBidXMgc3RhdGUgb2YgdGhlIGh3aWYgKi8KKyNkZWZpbmUgSERJT19TRVRfUURNQQkJMHgwMzJlCS8qIGNoYW5nZSB1c2UtcWRtYSBmbGFnICovCisjZGVmaW5lIEhESU9fU0VUX0FERFJFU1MJMHgwMzJmCS8qIGNoYW5nZSBsYmEgYWRkcmVzc2luZyBtb2RlcyAqLworCisvKiBidXMgc3RhdGVzICovCitlbnVtIHsKKwlCVVNTVEFURV9PRkYgPSAwLAorCUJVU1NUQVRFX09OLAorCUJVU1NUQVRFX1RSSVNUQVRFCit9OworCisvKiBoZC9pZGUgY3RsJ3MgdGhhdCBwYXNzIChhcmcpIHB0cnMgdG8gdXNlciBzcGFjZSBhcmUgbnVtYmVyZWQgMHgwMzNuLzB4MDMzbiAqLworLyogMHgzMzAgaXMgcmVzZXJ2ZWQgLSB1c2VkIHRvIGJlIEhESU9fR0VUR0VPX0JJRyAqLworLyogMHgzMzEgaXMgcmVzZXJ2ZWQgLSB1c2VkIHRvIGJlIEhESU9fR0VUR0VPX0JJR19SQVcgKi8KKy8qIDB4MzM4IGlzIHJlc2VydmVkIC0gdXNlZCB0byBiZSBIRElPX1NFVF9JREVfU0NTSSAqLworLyogMHgzMzkgaXMgcmVzZXJ2ZWQgLSB1c2VkIHRvIGJlIEhESU9fU0VUX1NDU0lfSURFICovCisKKyNkZWZpbmUgX19ORVdfSERfRFJJVkVfSUQKKworLyoKKyAqIFN0cnVjdHVyZSByZXR1cm5lZCBieSBIRElPX0dFVF9JREVOVElUWSwgYXMgcGVyIEFOU0kgTkNJVFMgQVRBNiByZXYuMWIgc3BlYy4KKyAqCisgKiBJZiB5b3UgY2hhbmdlIHNvbWV0aGluZyBoZXJlLCBwbGVhc2UgcmVtZW1iZXIgdG8gdXBkYXRlIGZpeF9kcml2ZWlkKCkgaW4KKyAqIGlkZS9wcm9iZS5jLgorICovCitzdHJ1Y3QgaGRfZHJpdmVpZCB7CisJdW5zaWduZWQgc2hvcnQJY29uZmlnOwkJLyogbG90cyBvZiBvYnNvbGV0ZSBiaXQgZmxhZ3MgKi8KKwl1bnNpZ25lZCBzaG9ydAljeWxzOwkJLyogT2Jzb2xldGUsICJwaHlzaWNhbCIgY3lscyAqLworCXVuc2lnbmVkIHNob3J0CXJlc2VydmVkMjsJLyogcmVzZXJ2ZWQgKHdvcmQgMikgKi8KKwl1bnNpZ25lZCBzaG9ydAloZWFkczsJCS8qIE9ic29sZXRlLCAicGh5c2ljYWwiIGhlYWRzICovCisJdW5zaWduZWQgc2hvcnQJdHJhY2tfYnl0ZXM7CS8qIHVuZm9ybWF0dGVkIGJ5dGVzIHBlciB0cmFjayAqLworCXVuc2lnbmVkIHNob3J0CXNlY3Rvcl9ieXRlczsJLyogdW5mb3JtYXR0ZWQgYnl0ZXMgcGVyIHNlY3RvciAqLworCXVuc2lnbmVkIHNob3J0CXNlY3RvcnM7CS8qIE9ic29sZXRlLCAicGh5c2ljYWwiIHNlY3RvcnMgcGVyIHRyYWNrICovCisJdW5zaWduZWQgc2hvcnQJdmVuZG9yMDsJLyogdmVuZG9yIHVuaXF1ZSAqLworCXVuc2lnbmVkIHNob3J0CXZlbmRvcjE7CS8qIHZlbmRvciB1bmlxdWUgKi8KKwl1bnNpZ25lZCBzaG9ydAl2ZW5kb3IyOwkvKiBSZXRpcmVkIHZlbmRvciB1bmlxdWUgKi8KKwl1bnNpZ25lZCBjaGFyCXNlcmlhbF9ub1syMF07CS8qIDAgPSBub3Rfc3BlY2lmaWVkICovCisJdW5zaWduZWQgc2hvcnQJYnVmX3R5cGU7CS8qIFJldGlyZWQgKi8KKwl1bnNpZ25lZCBzaG9ydAlidWZfc2l6ZTsJLyogUmV0aXJlZCwgNTEyIGJ5dGUgaW5jcmVtZW50cworCQkJCQkgKiAwID0gbm90X3NwZWNpZmllZAorCQkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydAllY2NfYnl0ZXM7CS8qIGZvciByL3cgbG9uZyBjbWRzOyAwID0gbm90X3NwZWNpZmllZCAqLworCXVuc2lnbmVkIGNoYXIJZndfcmV2WzhdOwkvKiAwID0gbm90X3NwZWNpZmllZCAqLworCXVuc2lnbmVkIGNoYXIJbW9kZWxbNDBdOwkvKiAwID0gbm90X3NwZWNpZmllZCAqLworCXVuc2lnbmVkIGNoYXIJbWF4X211bHRzZWN0OwkvKiAwPW5vdF9pbXBsZW1lbnRlZCAqLworCXVuc2lnbmVkIGNoYXIJdmVuZG9yMzsJLyogdmVuZG9yIHVuaXF1ZSAqLworCXVuc2lnbmVkIHNob3J0CWR3b3JkX2lvOwkvKiAwPW5vdF9pbXBsZW1lbnRlZDsgMT1pbXBsZW1lbnRlZCAqLworCXVuc2lnbmVkIGNoYXIJdmVuZG9yNDsJLyogdmVuZG9yIHVuaXF1ZSAqLworCXVuc2lnbmVkIGNoYXIJY2FwYWJpbGl0eTsJLyogKHVwcGVyIGJ5dGUgb2Ygd29yZCA0OSkKKwkJCQkJICogIDM6CUlPUkRZc3VwCisJCQkJCSAqICAyOglJT1JEWXN3CisJCQkJCSAqICAxOglMQkEKKwkJCQkJICogIDA6CURNQQorCQkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydAlyZXNlcnZlZDUwOwkvKiByZXNlcnZlZCAod29yZCA1MCkgKi8KKwl1bnNpZ25lZCBjaGFyCXZlbmRvcjU7CS8qIE9ic29sZXRlLCB2ZW5kb3IgdW5pcXVlICovCisJdW5zaWduZWQgY2hhcgl0UElPOwkJLyogT2Jzb2xldGUsIDA9c2xvdywgMT1tZWRpdW0sIDI9ZmFzdCAqLworCXVuc2lnbmVkIGNoYXIJdmVuZG9yNjsJLyogT2Jzb2xldGUsIHZlbmRvciB1bmlxdWUgKi8KKwl1bnNpZ25lZCBjaGFyCXRETUE7CQkvKiBPYnNvbGV0ZSwgMD1zbG93LCAxPW1lZGl1bSwgMj1mYXN0ICovCisJdW5zaWduZWQgc2hvcnQJZmllbGRfdmFsaWQ7CS8qICh3b3JkIDUzKQorCQkJCQkgKiAgMjoJdWx0cmFfb2sJd29yZCAgODgKKwkJCQkJICogIDE6CWVpZGVfb2sJCXdvcmRzIDY0LTcwCisJCQkJCSAqICAwOgljdXJfb2sJCXdvcmRzIDU0LTU4CisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0CWN1cl9jeWxzOwkvKiBPYnNvbGV0ZSwgbG9naWNhbCBjeWxpbmRlcnMgKi8KKwl1bnNpZ25lZCBzaG9ydAljdXJfaGVhZHM7CS8qIE9ic29sZXRlLCBsIGhlYWRzICovCisJdW5zaWduZWQgc2hvcnQJY3VyX3NlY3RvcnM7CS8qIE9ic29sZXRlLCBsIHNlY3RvcnMgcGVyIHRyYWNrICovCisJdW5zaWduZWQgc2hvcnQJY3VyX2NhcGFjaXR5MDsJLyogT2Jzb2xldGUsIGwgdG90YWwgc2VjdG9ycyBvbiBkcml2ZSAqLworCXVuc2lnbmVkIHNob3J0CWN1cl9jYXBhY2l0eTE7CS8qIE9ic29sZXRlLCAoMiB3b3JkcywgbWlzYWxpZ25lZCBpbnQpICAgICAqLworCXVuc2lnbmVkIGNoYXIJbXVsdHNlY3Q7CS8qIGN1cnJlbnQgbXVsdGlwbGUgc2VjdG9yIGNvdW50ICovCisJdW5zaWduZWQgY2hhcgltdWx0c2VjdF92YWxpZDsJLyogd2hlbiAoYml0MD09MSkgbXVsdHNlY3QgaXMgb2sgKi8KKwl1bnNpZ25lZCBpbnQJbGJhX2NhcGFjaXR5OwkvKiBPYnNvbGV0ZSwgdG90YWwgbnVtYmVyIG9mIHNlY3RvcnMgKi8KKwl1bnNpZ25lZCBzaG9ydAlkbWFfMXdvcmQ7CS8qIE9ic29sZXRlLCBzaW5nbGUtd29yZCBkbWEgaW5mbyAqLworCXVuc2lnbmVkIHNob3J0CWRtYV9td29yZDsJLyogbXVsdGlwbGUtd29yZCBkbWEgaW5mbyAqLworCXVuc2lnbmVkIHNob3J0ICBlaWRlX3Bpb19tb2RlczsgLyogYml0cyAwOm1vZGUzIDE6bW9kZTQgKi8KKwl1bnNpZ25lZCBzaG9ydCAgZWlkZV9kbWFfbWluOwkvKiBtaW4gbXdvcmQgZG1hIGN5Y2xlIHRpbWUgKG5zKSAqLworCXVuc2lnbmVkIHNob3J0ICBlaWRlX2RtYV90aW1lOwkvKiByZWNvbW1lbmRlZCBtd29yZCBkbWEgY3ljbGUgdGltZSAobnMpICovCisJdW5zaWduZWQgc2hvcnQgIGVpZGVfcGlvOyAgICAgICAvKiBtaW4gY3ljbGUgdGltZSAobnMpLCBubyBJT1JEWSAgKi8KKwl1bnNpZ25lZCBzaG9ydCAgZWlkZV9waW9faW9yZHk7IC8qIG1pbiBjeWNsZSB0aW1lIChucyksIHdpdGggSU9SRFkgKi8KKwl1bnNpZ25lZCBzaG9ydAl3b3JkczY5XzcwWzJdOwkvKiByZXNlcnZlZCB3b3JkcyA2OS03MAorCQkJCQkgKiBmdXR1cmUgY29tbWFuZCBvdmVybGFwIGFuZCBxdWV1aW5nCisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0CXdvcmRzNzFfNzRbNF07CS8qIHJlc2VydmVkIHdvcmRzIDcxLTc0CisJCQkJCSAqIGZvciBJREVOVElGWSBQQUNLRVQgREVWSUNFIGNvbW1hbmQKKwkJCQkJICovCisJdW5zaWduZWQgc2hvcnQgIHF1ZXVlX2RlcHRoOwkvKiAod29yZCA3NSkKKwkJCQkJICogMTU6NQlyZXNlcnZlZAorCQkJCQkgKiAgNDowCU1heGltdW0gcXVldWUgZGVwdGggLTEKKwkJCQkJICovCisJdW5zaWduZWQgc2hvcnQgIHdvcmRzNzZfNzlbNF07CS8qIHJlc2VydmVkIHdvcmRzIDc2LTc5ICovCisJdW5zaWduZWQgc2hvcnQgIG1ham9yX3Jldl9udW07CS8qICh3b3JkIDgwKSAqLworCXVuc2lnbmVkIHNob3J0ICBtaW5vcl9yZXZfbnVtOwkvKiAod29yZCA4MSkgKi8KKwl1bnNpZ25lZCBzaG9ydCAgY29tbWFuZF9zZXRfMTsJLyogKHdvcmQgODIpIHN1cHBvcnRlZAorCQkJCQkgKiAxNToJT2Jzb2xldGUKKwkJCQkJICogMTQ6CU5PUCBjb21tYW5kCisJCQkJCSAqIDEzOglSRUFEX0JVRkZFUgorCQkJCQkgKiAxMjoJV1JJVEVfQlVGRkVSCisJCQkJCSAqIDExOglPYnNvbGV0ZQorCQkJCQkgKiAxMDoJSG9zdCBQcm90ZWN0ZWQgQXJlYQorCQkJCQkgKiAgOToJREVWSUNFIFJlc2V0CisJCQkJCSAqICA4OglTRVJWSUNFIEludGVycnVwdAorCQkJCQkgKiAgNzoJUmVsZWFzZSBJbnRlcnJ1cHQKKwkJCQkJICogIDY6CWxvb2stYWhlYWQKKwkJCQkJICogIDU6CXdyaXRlIGNhY2hlCisJCQkJCSAqICA0OglQQUNLRVQgQ29tbWFuZAorCQkJCQkgKiAgMzoJUG93ZXIgTWFuYWdlbWVudCBGZWF0dXJlIFNldAorCQkJCQkgKiAgMjoJUmVtb3ZhYmxlIEZlYXR1cmUgU2V0CisJCQkJCSAqICAxOglTZWN1cml0eSBGZWF0dXJlIFNldAorCQkJCQkgKiAgMDoJU01BUlQgRmVhdHVyZSBTZXQKKwkJCQkJICovCisJdW5zaWduZWQgc2hvcnQgIGNvbW1hbmRfc2V0XzI7CS8qICh3b3JkIDgzKQorCQkJCQkgKiAxNToJU2hhbGwgYmUgWkVSTworCQkJCQkgKiAxNDoJU2hhbGwgYmUgT05FCisJCQkJCSAqIDEzOglGTFVTSCBDQUNIRSBFWFQKKwkJCQkJICogMTI6CUZMVVNIIENBQ0hFCisJCQkJCSAqIDExOglEZXZpY2UgQ29uZmlndXJhdGlvbiBPdmVybGF5CisJCQkJCSAqIDEwOgk0OC1iaXQgQWRkcmVzcyBGZWF0dXJlIFNldAorCQkJCQkgKiAgOToJQXV0b21hdGljIEFjb3VzdGljIE1hbmFnZW1lbnQKKwkJCQkJICogIDg6CVNFVCBNQVggc2VjdXJpdHkKKwkJCQkJICogIDc6CXJlc2VydmVkIDE0MDdEVCBQQVJUSUVTCisJCQkJCSAqICA2OglTZXRGIHN1Yi1jb21tYW5kIFBvd2VyLVVwCisJCQkJCSAqICA1OglQb3dlci1VcCBpbiBTdGFuZGJ5IEZlYXR1cmUgU2V0CisJCQkJCSAqICA0OglSZW1vdmFibGUgTWVkaWEgTm90aWZpY2F0aW9uCisJCQkJCSAqICAzOglBUE0gRmVhdHVyZSBTZXQKKwkJCQkJICogIDI6CUNGQSBGZWF0dXJlIFNldAorCQkJCQkgKiAgMToJUkVBRC9XUklURSBETUEgUVVFVUVECisJCQkJCSAqICAwOglEb3dubG9hZCBNaWNyb0NvZGUKKwkJCQkJICovCisJdW5zaWduZWQgc2hvcnQgIGNmc3NlOwkJLyogKHdvcmQgODQpCisJCQkJCSAqIGNtZCBzZXQtZmVhdHVyZSBzdXBwb3J0ZWQgZXh0ZW5zaW9ucworCQkJCQkgKiAxNToJU2hhbGwgYmUgWkVSTworCQkJCQkgKiAxNDoJU2hhbGwgYmUgT05FCisJCQkJCSAqIDEzOjYJcmVzZXJ2ZWQKKwkJCQkJICogIDU6CUdlbmVyYWwgUHVycG9zZSBMb2dnaW5nCisJCQkJCSAqICA0OglTdHJlYW1pbmcgRmVhdHVyZSBTZXQKKwkJCQkJICogIDM6CU1lZGlhIENhcmQgUGFzcyBUaHJvdWdoCisJCQkJCSAqICAyOglNZWRpYSBTZXJpYWwgTnVtYmVyIFZhbGlkCisJCQkJCSAqICAxOglTTUFSVCBzZWx0LXRlc3Qgc3VwcG9ydGVkCisJCQkJCSAqICAwOglTTUFSVCBlcnJvciBsb2dnaW5nCisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0ICBjZnNfZW5hYmxlXzE7CS8qICh3b3JkIDg1KQorCQkJCQkgKiBjb21tYW5kIHNldC1mZWF0dXJlIGVuYWJsZWQKKwkJCQkJICogMTU6CU9ic29sZXRlCisJCQkJCSAqIDE0OglOT1AgY29tbWFuZAorCQkJCQkgKiAxMzoJUkVBRF9CVUZGRVIKKwkJCQkJICogMTI6CVdSSVRFX0JVRkZFUgorCQkJCQkgKiAxMToJT2Jzb2xldGUKKwkJCQkJICogMTA6CUhvc3QgUHJvdGVjdGVkIEFyZWEKKwkJCQkJICogIDk6CURFVklDRSBSZXNldAorCQkJCQkgKiAgODoJU0VSVklDRSBJbnRlcnJ1cHQKKwkJCQkJICogIDc6CVJlbGVhc2UgSW50ZXJydXB0CisJCQkJCSAqICA2Oglsb29rLWFoZWFkCisJCQkJCSAqICA1Ogl3cml0ZSBjYWNoZQorCQkJCQkgKiAgNDoJUEFDS0VUIENvbW1hbmQKKwkJCQkJICogIDM6CVBvd2VyIE1hbmFnZW1lbnQgRmVhdHVyZSBTZXQKKwkJCQkJICogIDI6CVJlbW92YWJsZSBGZWF0dXJlIFNldAorCQkJCQkgKiAgMToJU2VjdXJpdHkgRmVhdHVyZSBTZXQKKwkJCQkJICogIDA6CVNNQVJUIEZlYXR1cmUgU2V0CisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0ICBjZnNfZW5hYmxlXzI7CS8qICh3b3JkIDg2KQorCQkJCQkgKiBjb21tYW5kIHNldC1mZWF0dXJlIGVuYWJsZWQKKwkJCQkJICogMTU6CVNoYWxsIGJlIFpFUk8KKwkJCQkJICogMTQ6CVNoYWxsIGJlIE9ORQorCQkJCQkgKiAxMzoJRkxVU0ggQ0FDSEUgRVhUCisJCQkJCSAqIDEyOglGTFVTSCBDQUNIRQorCQkJCQkgKiAxMToJRGV2aWNlIENvbmZpZ3VyYXRpb24gT3ZlcmxheQorCQkJCQkgKiAxMDoJNDgtYml0IEFkZHJlc3MgRmVhdHVyZSBTZXQKKwkJCQkJICogIDk6CUF1dG9tYXRpYyBBY291c3RpYyBNYW5hZ2VtZW50CisJCQkJCSAqICA4OglTRVQgTUFYIHNlY3VyaXR5CisJCQkJCSAqICA3OglyZXNlcnZlZCAxNDA3RFQgUEFSVElFUworCQkJCQkgKiAgNjoJU2V0RiBzdWItY29tbWFuZCBQb3dlci1VcAorCQkJCQkgKiAgNToJUG93ZXItVXAgaW4gU3RhbmRieSBGZWF0dXJlIFNldAorCQkJCQkgKiAgNDoJUmVtb3ZhYmxlIE1lZGlhIE5vdGlmaWNhdGlvbgorCQkJCQkgKiAgMzoJQVBNIEZlYXR1cmUgU2V0CisJCQkJCSAqICAyOglDRkEgRmVhdHVyZSBTZXQKKwkJCQkJICogIDE6CVJFQUQvV1JJVEUgRE1BIFFVRVVFRAorCQkJCQkgKiAgMDoJRG93bmxvYWQgTWljcm9Db2RlCisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0ICBjc2ZfZGVmYXVsdDsJLyogKHdvcmQgODcpCisJCQkJCSAqIGNvbW1hbmQgc2V0LWZlYXR1cmUgZGVmYXVsdAorCQkJCQkgKiAxNToJU2hhbGwgYmUgWkVSTworCQkJCQkgKiAxNDoJU2hhbGwgYmUgT05FCisJCQkJCSAqIDEzOjYJcmVzZXJ2ZWQKKwkJCQkJICogIDU6CUdlbmVyYWwgUHVycG9zZSBMb2dnaW5nIGVuYWJsZWQKKwkJCQkJICogIDQ6CVZhbGlkIENPTkZJR1VSRSBTVFJFQU0gZXhlY3V0ZWQKKwkJCQkJICogIDM6CU1lZGlhIENhcmQgUGFzcyBUaHJvdWdoIGVuYWJsZWQKKwkJCQkJICogIDI6CU1lZGlhIFNlcmlhbCBOdW1iZXIgVmFsaWQKKwkJCQkJICogIDE6CVNNQVJUIHNlbHQtdGVzdCBzdXBwb3J0ZWQKKwkJCQkJICogIDA6CVNNQVJUIGVycm9yIGxvZ2dpbmcKKwkJCQkJICovCisJdW5zaWduZWQgc2hvcnQgIGRtYV91bHRyYTsJLyogKHdvcmQgODgpICovCisJdW5zaWduZWQgc2hvcnQJdHJzZXVjOwkJLyogdGltZSByZXF1aXJlZCBmb3Igc2VjdXJpdHkgZXJhc2UgKi8KKwl1bnNpZ25lZCBzaG9ydAl0cnNFdWM7CQkvKiB0aW1lIHJlcXVpcmVkIGZvciBlbmhhbmNlZCBlcmFzZSAqLworCXVuc2lnbmVkIHNob3J0CUN1ckFQTXZhbHVlczsJLyogY3VycmVudCBBUE0gdmFsdWVzICovCisJdW5zaWduZWQgc2hvcnQJbXByYzsJCS8qIG1hc3RlciBwYXNzd29yZCByZXZpc2lvbiBjb2RlICovCisJdW5zaWduZWQgc2hvcnQJaHdfY29uZmlnOwkvKiBoYXJkd2FyZSBjb25maWcgKHdvcmQgOTMpCisJCQkJCSAqIDE1OglTaGFsbCBiZSBaRVJPCisJCQkJCSAqIDE0OglTaGFsbCBiZSBPTkUKKwkJCQkJICogMTM6CisJCQkJCSAqIDEyOgorCQkJCQkgKiAxMToKKwkJCQkJICogMTA6CisJCQkJCSAqICA5OgorCQkJCQkgKiAgODoKKwkJCQkJICogIDc6CisJCQkJCSAqICA2OgorCQkJCQkgKiAgNToKKwkJCQkJICogIDQ6CisJCQkJCSAqICAzOgorCQkJCQkgKiAgMjoKKwkJCQkJICogIDE6CisJCQkJCSAqICAwOglTaGFsbCBiZSBPTkUKKwkJCQkJICovCisJdW5zaWduZWQgc2hvcnQJYWNvdXN0aWM7CS8qICh3b3JkIDk0KQorCQkJCQkgKiAxNTo4CVZlbmRvcidzIHJlY29tbWVuZGVkIHZhbHVlCisJCQkJCSAqICA3OjAJY3VycmVudCB2YWx1ZQorCQkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydAltc3JxczsJCS8qIG1pbiBzdHJlYW0gcmVxdWVzdCBzaXplICovCisJdW5zaWduZWQgc2hvcnQJc3hmZXJ0OwkJLyogc3RyZWFtIHRyYW5zZmVyIHRpbWUgKi8KKwl1bnNpZ25lZCBzaG9ydAlzYWw7CQkvKiBzdHJlYW0gYWNjZXNzIGxhdGVuY3kgKi8KKwl1bnNpZ25lZCBpbnQJc3BnOwkJLyogc3RyZWFtIHBlcmZvcm1hbmNlIGdyYW51bGFyaXR5ICovCisJdW5zaWduZWQgbG9uZyBsb25nIGxiYV9jYXBhY2l0eV8yOy8qIDQ4LWJpdCB0b3RhbCBudW1iZXIgb2Ygc2VjdG9ycyAqLworCXVuc2lnbmVkIHNob3J0CXdvcmRzMTA0XzEyNVsyMl07LyogcmVzZXJ2ZWQgd29yZHMgMTA0LTEyNSAqLworCXVuc2lnbmVkIHNob3J0CWxhc3RfbHVuOwkvKiAod29yZCAxMjYpICovCisJdW5zaWduZWQgc2hvcnQJd29yZDEyNzsJLyogKHdvcmQgMTI3KSBGZWF0dXJlIFNldAorCQkJCQkgKiBSZW1vdmFibGUgTWVkaWEgTm90aWZpY2F0aW9uCisJCQkJCSAqIDE1OjIJcmVzZXJ2ZWQKKwkJCQkJICogIDE6MAkwMCA9IG5vdCBzdXBwb3J0ZWQKKwkJCQkJICoJMDEgPSBzdXBwb3J0ZWQKKwkJCQkJICoJMTAgPSByZXNlcnZlZAorCQkJCQkgKgkxMSA9IHJlc2VydmVkCisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0CWRsZjsJCS8qICh3b3JkIDEyOCkKKwkJCQkJICogZGV2aWNlIGxvY2sgZnVuY3Rpb24KKwkJCQkJICogMTU6OQlyZXNlcnZlZAorCQkJCQkgKiAgOAlzZWN1cml0eSBsZXZlbCAxOm1heCAwOmhpZ2gKKwkJCQkJICogIDc6NglyZXNlcnZlZAorCQkJCQkgKiAgNQllbmhhbmNlZCBlcmFzZQorCQkJCQkgKiAgNAlleHBpcmUKKwkJCQkJICogIDMJZnJvemVuCisJCQkJCSAqICAyCWxvY2tlZAorCQkJCQkgKiAgMQllbi9kaXNhYmxlZAorCQkJCQkgKiAgMAljYXBhYmlsaXR5CisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0ICBjc2ZvOwkJLyogICh3b3JkIDEyOSkKKwkJCQkJICogY3VycmVudCBzZXQgZmVhdHVyZXMgb3B0aW9ucworCQkJCQkgKiAxNTo0CXJlc2VydmVkCisJCQkJCSAqICAzOglhdXRvIHJlYXNzaWduCisJCQkJCSAqICAyOglyZXZlcnRpbmcKKwkJCQkJICogIDE6CXJlYWQtbG9vay1haGVhZAorCQkJCQkgKiAgMDoJd3JpdGUgY2FjaGUKKwkJCQkJICovCisJdW5zaWduZWQgc2hvcnQJd29yZHMxMzBfMTU1WzI2XTsvKiByZXNlcnZlZCB2ZW5kb3Igd29yZHMgMTMwLTE1NSAqLworCXVuc2lnbmVkIHNob3J0CXdvcmQxNTY7CS8qIHJlc2VydmVkIHZlbmRvciB3b3JkIDE1NiAqLworCXVuc2lnbmVkIHNob3J0CXdvcmRzMTU3XzE1OVszXTsvKiByZXNlcnZlZCB2ZW5kb3Igd29yZHMgMTU3LTE1OSAqLworCXVuc2lnbmVkIHNob3J0CWNmYV9wb3dlcjsJLyogKHdvcmQgMTYwKSBDRkEgUG93ZXIgTW9kZQorCQkJCQkgKiAxNSB3b3JkIDE2MCBzdXBwb3J0ZWQKKwkJCQkJICogMTQgcmVzZXJ2ZWQKKwkJCQkJICogMTMKKwkJCQkJICogMTIKKwkJCQkJICogMTE6MAorCQkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydAl3b3JkczE2MV8xNzVbMTVdOy8qIFJlc2VydmVkIGZvciBDRkEgKi8KKwl1bnNpZ25lZCBzaG9ydAl3b3JkczE3Nl8yMDVbMzBdOy8qIEN1cnJlbnQgTWVkaWEgU2VyaWFsIE51bWJlciAqLworCXVuc2lnbmVkIHNob3J0CXdvcmRzMjA2XzI1NFs0OV07LyogcmVzZXJ2ZWQgd29yZHMgMjA2LTI1NCAqLworCXVuc2lnbmVkIHNob3J0CWludGVncml0eV93b3JkOwkvKiAod29yZCAyNTUpCisJCQkJCSAqIDE1OjggQ2hlY2tzdW0KKwkJCQkJICogIDc6MCBTaWduYXR1cmUKKwkJCQkJICovCit9OworCisvKgorICogSURFICJuaWNlIiBmbGFncy4gVGhlc2UgYXJlIHVzZWQgb24gYSBwZXIgZHJpdmUgYmFzaXMgdG8gZGV0ZXJtaW5lCisgKiB3aGVuIHRvIGJlIG5pY2UgYW5kIGdpdmUgbW9yZSBiYW5kd2lkdGggdG8gdGhlIG90aGVyIGRldmljZXMgd2hpY2gKKyAqIHNoYXJlIHRoZSBzYW1lIElERSBidXMuCisgKi8KKyNkZWZpbmUgSURFX05JQ0VfRFNDX09WRVJMQVAJKDApCS8qIHBlciB0aGUgRFNDIG92ZXJsYXAgcHJvdG9jb2wgKi8KKyNkZWZpbmUgSURFX05JQ0VfQVRBUElfT1ZFUkxBUAkoMSkJLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KKyNkZWZpbmUgSURFX05JQ0VfMQkJKDMpCS8qIHdoZW4gcHJvYmFibHkgd29uJ3QgYWZmZWN0IHVzIG11Y2ggKi8KKyNkZWZpbmUgSURFX05JQ0VfMAkJKDIpCS8qIHdoZW4gc3VyZSB0aGF0IGl0IHdvbid0IGFmZmVjdCB1cyAqLworI2RlZmluZSBJREVfTklDRV8yCQkoNCkJLyogd2hlbiB3ZSBrbm93IGl0J3Mgb24gb3VyIGV4cGVuc2UgKi8KKworI2VuZGlmCS8qIF9MSU5VWF9IRFJFR19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hpZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTJjZWZkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oaWQuaApAQCAtMCwwICsxLDY3IEBACisjaWZuZGVmIF9fSElEX0gKKyNkZWZpbmUgX19ISURfSAorCisvKgorICogIENvcHlyaWdodCAoYykgMTk5OSBBbmRyZWFzIEdhbAorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFZvanRlY2ggUGF2bGlrCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgSmlyaSBLb3NpbmEKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBTaG91bGQgeW91IG5lZWQgdG8gY29udGFjdCBtZSwgdGhlIGF1dGhvciwgeW91IGNhbiBkbyBzbyBlaXRoZXIgYnkKKyAqIGUtbWFpbCAtIG1haWwgeW91ciBtZXNzYWdlIHRvIDx2b2p0ZWNoQHVjdy5jej4sIG9yIGJ5IHBhcGVyIG1haWw6CisgKiBWb2p0ZWNoIFBhdmxpaywgU2ltdW5rb3ZhIDE1OTQsIFByYWd1ZSA4LCAxODIgMDAgQ3plY2ggUmVwdWJsaWMKKyAqLworCisvKgorICogVVNCIEhJRCAoSHVtYW4gSW50ZXJmYWNlIERldmljZSkgaW50ZXJmYWNlIGNsYXNzIGNvZGUKKyAqLworCisjZGVmaW5lIFVTQl9JTlRFUkZBQ0VfQ0xBU1NfSElECQkzCisKKy8qCisgKiBVU0IgSElEIGludGVyZmFjZSBzdWJjbGFzcyBhbmQgcHJvdG9jb2wgY29kZXMKKyAqLworCisjZGVmaW5lIFVTQl9JTlRFUkZBQ0VfU1VCQ0xBU1NfQk9PVAkxCisjZGVmaW5lIFVTQl9JTlRFUkZBQ0VfUFJPVE9DT0xfS0VZQk9BUkQJMQorI2RlZmluZSBVU0JfSU5URVJGQUNFX1BST1RPQ09MX01PVVNFCTIKKworLyoKKyAqIEhJRCBjbGFzcyByZXF1ZXN0cworICovCisKKyNkZWZpbmUgSElEX1JFUV9HRVRfUkVQT1JUCQkweDAxCisjZGVmaW5lIEhJRF9SRVFfR0VUX0lETEUJCTB4MDIKKyNkZWZpbmUgSElEX1JFUV9HRVRfUFJPVE9DT0wJCTB4MDMKKyNkZWZpbmUgSElEX1JFUV9TRVRfUkVQT1JUCQkweDA5CisjZGVmaW5lIEhJRF9SRVFfU0VUX0lETEUJCTB4MEEKKyNkZWZpbmUgSElEX1JFUV9TRVRfUFJPVE9DT0wJCTB4MEIKKworLyoKKyAqIEhJRCBjbGFzcyBkZXNjcmlwdG9yIHR5cGVzCisgKi8KKworI2RlZmluZSBISURfRFRfSElECQkJKFVTQl9UWVBFX0NMQVNTIHwgMHgwMSkKKyNkZWZpbmUgSElEX0RUX1JFUE9SVAkJCShVU0JfVFlQRV9DTEFTUyB8IDB4MDIpCisjZGVmaW5lIEhJRF9EVF9QSFlTSUNBTAkJCShVU0JfVFlQRV9DTEFTUyB8IDB4MDMpCisKKyNkZWZpbmUgSElEX01BWF9ERVNDUklQVE9SX1NJWkUJCTQwOTYKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oaWRkZXYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaGlkZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRiMzZjMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaGlkZGV2LmgKQEAgLTAsMCArMSwyMTIgQEAKKyNpZm5kZWYgX0hJRERFVl9ICisjZGVmaW5lIF9ISURERVZfSAorCisvKgorICogIENvcHlyaWdodCAoYykgMTk5OS0yMDAwIFZvanRlY2ggUGF2bGlrCisgKgorICogIFNwb25zb3JlZCBieSBTdVNFCisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKiAKKyAqIFNob3VsZCB5b3UgbmVlZCB0byBjb250YWN0IG1lLCB0aGUgYXV0aG9yLCB5b3UgY2FuIGRvIHNvIGVpdGhlciBieQorICogZS1tYWlsIC0gbWFpbCB5b3VyIG1lc3NhZ2UgdG8gPHZvanRlY2hAc3VzZS5jej4sIG9yIGJ5IHBhcGVyIG1haWw6CisgKiBWb2p0ZWNoIFBhdmxpaywgVWNpdGVsc2thIDE1NzYsIFByYWd1ZSA4LCAxODIgMDAgQ3plY2ggUmVwdWJsaWMKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIFRoZSBldmVudCBzdHJ1Y3R1cmUgaXRzZWxmCisgKi8KKworc3RydWN0IGhpZGRldl9ldmVudCB7CisJdW5zaWduZWQgaGlkOworCXNpZ25lZCBpbnQgdmFsdWU7Cit9OworCitzdHJ1Y3QgaGlkZGV2X2RldmluZm8geworCV9fdTMyIGJ1c3R5cGU7CisJX191MzIgYnVzbnVtOworCV9fdTMyIGRldm51bTsKKwlfX3UzMiBpZm51bTsKKwlfX3MxNiB2ZW5kb3I7CisJX19zMTYgcHJvZHVjdDsKKwlfX3MxNiB2ZXJzaW9uOworCV9fdTMyIG51bV9hcHBsaWNhdGlvbnM7Cit9OworCitzdHJ1Y3QgaGlkZGV2X2NvbGxlY3Rpb25faW5mbyB7CisJX191MzIgaW5kZXg7CisJX191MzIgdHlwZTsKKwlfX3UzMiB1c2FnZTsKKwlfX3UzMiBsZXZlbDsKK307CisKKyNkZWZpbmUgSElEX1NUUklOR19TSVpFIDI1Ngorc3RydWN0IGhpZGRldl9zdHJpbmdfZGVzY3JpcHRvciB7CisJX19zMzIgaW5kZXg7CisJY2hhciB2YWx1ZVtISURfU1RSSU5HX1NJWkVdOworfTsKKworc3RydWN0IGhpZGRldl9yZXBvcnRfaW5mbyB7CisJX191MzIgcmVwb3J0X3R5cGU7CisJX191MzIgcmVwb3J0X2lkOworCV9fdTMyIG51bV9maWVsZHM7Cit9OworCisvKiBUbyBkbyBhIEdVU0FHRS9TVVNBR0UsIGZpbGwgaW4gYXQgbGVhc3QgdXNhZ2VfY29kZSwgIHJlcG9ydF90eXBlIGFuZCAKKyAqIHJlcG9ydF9pZC4gIFNldCByZXBvcnRfaWQgdG8gUkVQT1JUX0lEX1VOS05PV04gaWYgdGhlIHJlc3Qgb2YgdGhlIGZpZWxkcyAKKyAqIGFyZSB1bmtub3duLiAgT3RoZXJ3aXNlIHVzZSBhIHVzYWdlX3JlZiBzdHJ1Y3QgZmlsbGVkIGluIGZyb20gYSBwcmV2aW91cyAKKyAqIHN1Y2Nlc3NmdWwgR1VTQUdFIGNhbGwgdG8gc2F2ZSB0aW1lLiAgVG8gYWN0dWFsbHkgc2VuZCBhIHZhbHVlIHRvIHRoZQorICogZGV2aWNlLCBwZXJmb3JtIGEgU1VTQUdFIGZpcnN0LCBmb2xsb3dlZCBieSBhIFNSRVBPUlQuICBBbiBJTklUUkVQT1JUIG9yIGEKKyAqIEdSRVBPUlQgaXNuJ3QgbmVjZXNzYXJ5IGZvciBhIEdVU0FHRSB0byByZXR1cm4gdmFsaWQgZGF0YS4KKyAqLworI2RlZmluZSBISURfUkVQT1JUX0lEX1VOS05PV04gMHhmZmZmZmZmZgorI2RlZmluZSBISURfUkVQT1JUX0lEX0ZJUlNUICAgMHgwMDAwMDEwMAorI2RlZmluZSBISURfUkVQT1JUX0lEX05FWFQgICAgMHgwMDAwMDIwMAorI2RlZmluZSBISURfUkVQT1JUX0lEX01BU0sgICAgMHgwMDAwMDBmZgorI2RlZmluZSBISURfUkVQT1JUX0lEX01BWCAgICAgMHgwMDAwMDBmZgorCisjZGVmaW5lIEhJRF9SRVBPUlRfVFlQRV9JTlBVVAkxCisjZGVmaW5lIEhJRF9SRVBPUlRfVFlQRV9PVVRQVVQJMgorI2RlZmluZSBISURfUkVQT1JUX1RZUEVfRkVBVFVSRQkzCisjZGVmaW5lIEhJRF9SRVBPUlRfVFlQRV9NSU4gICAgIDEKKyNkZWZpbmUgSElEX1JFUE9SVF9UWVBFX01BWCAgICAgMworCitzdHJ1Y3QgaGlkZGV2X2ZpZWxkX2luZm8geworCV9fdTMyIHJlcG9ydF90eXBlOworCV9fdTMyIHJlcG9ydF9pZDsKKwlfX3UzMiBmaWVsZF9pbmRleDsKKwlfX3UzMiBtYXh1c2FnZTsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBwaHlzaWNhbDsJCS8qIHBoeXNpY2FsIHVzYWdlIGZvciB0aGlzIGZpZWxkICovCisJX191MzIgbG9naWNhbDsJCS8qIGxvZ2ljYWwgdXNhZ2UgZm9yIHRoaXMgZmllbGQgKi8KKwlfX3UzMiBhcHBsaWNhdGlvbjsJCS8qIGFwcGxpY2F0aW9uIHVzYWdlIGZvciB0aGlzIGZpZWxkICovCisJX19zMzIgbG9naWNhbF9taW5pbXVtOworCV9fczMyIGxvZ2ljYWxfbWF4aW11bTsKKwlfX3MzMiBwaHlzaWNhbF9taW5pbXVtOworCV9fczMyIHBoeXNpY2FsX21heGltdW07CisJX191MzIgdW5pdF9leHBvbmVudDsKKwlfX3UzMiB1bml0OworfTsKKworLyogRmlsbCBpbiByZXBvcnRfdHlwZSwgcmVwb3J0X2lkIGFuZCBmaWVsZF9pbmRleCB0byBnZXQgdGhlIGluZm9ybWF0aW9uIG9uIGEKKyAqIGZpZWxkLgorICovCisjZGVmaW5lIEhJRF9GSUVMRF9DT05TVEFOVAkJMHgwMDEKKyNkZWZpbmUgSElEX0ZJRUxEX1ZBUklBQkxFCQkweDAwMgorI2RlZmluZSBISURfRklFTERfUkVMQVRJVkUJCTB4MDA0CisjZGVmaW5lIEhJRF9GSUVMRF9XUkFQCQkJMHgwMDgJCisjZGVmaW5lIEhJRF9GSUVMRF9OT05MSU5FQVIJCTB4MDEwCisjZGVmaW5lIEhJRF9GSUVMRF9OT19QUkVGRVJSRUQJCTB4MDIwCisjZGVmaW5lIEhJRF9GSUVMRF9OVUxMX1NUQVRFCQkweDA0MAorI2RlZmluZSBISURfRklFTERfVk9MQVRJTEUJCTB4MDgwCisjZGVmaW5lIEhJRF9GSUVMRF9CVUZGRVJFRF9CWVRFCQkweDEwMAorCitzdHJ1Y3QgaGlkZGV2X3VzYWdlX3JlZiB7CisJX191MzIgcmVwb3J0X3R5cGU7CisJX191MzIgcmVwb3J0X2lkOworCV9fdTMyIGZpZWxkX2luZGV4OworCV9fdTMyIHVzYWdlX2luZGV4OworCV9fdTMyIHVzYWdlX2NvZGU7CisJX19zMzIgdmFsdWU7Cit9OworCisvKiBoaWRkZXZfdXNhZ2VfcmVmX211bHRpIGlzIHVzZWQgZm9yIHNlbmRpbmcgbXVsdGlwbGUgYnl0ZXMgdG8gYSBjb250cm9sLgorICogSXQgcmVhbGx5IG1hbmlmZXN0cyBpdHNlbGYgYXMgc2V0dGluZyB0aGUgdmFsdWUgb2YgY29uc2VjdXRpdmUgdXNhZ2VzICovCisjZGVmaW5lIEhJRF9NQVhfTVVMVElfVVNBR0VTIDEwMjQKK3N0cnVjdCBoaWRkZXZfdXNhZ2VfcmVmX211bHRpIHsKKwlzdHJ1Y3QgaGlkZGV2X3VzYWdlX3JlZiB1cmVmOworCV9fdTMyIG51bV92YWx1ZXM7CisJX19zMzIgdmFsdWVzW0hJRF9NQVhfTVVMVElfVVNBR0VTXTsKK307CisKKy8qIEZJRUxEX0lOREVYX05PTkUgaXMgcmV0dXJuZWQgaW4gcmVhZCgpIGRhdGEgZnJvbSB0aGUga2VybmVsIHdoZW4gZmxhZ3MKKyAqIGlzIHNldCB0byAoSElEREVWX0ZMQUdfVVJFRiB8IEhJRERFVl9GTEFHX1JFUE9SVCkgYW5kIGEgbmV3IHJlcG9ydCBoYXMKKyAqIGJlZW4gc2VudCBieSB0aGUgZGV2aWNlIAorICovCisjZGVmaW5lIEhJRF9GSUVMRF9JTkRFWF9OT05FIDB4ZmZmZmZmZmYKKworLyoKKyAqIFByb3RvY29sIHZlcnNpb24uCisgKi8KKworI2RlZmluZSBISURfVkVSU0lPTgkJMHgwMTAwMDQKKworLyoKKyAqIElPQ1RMcyAoMHgwMCAtIDB4N2YpCisgKi8KKworI2RlZmluZSBISURJT0NHVkVSU0lPTgkJX0lPUignSCcsIDB4MDEsIGludCkKKyNkZWZpbmUgSElESU9DQVBQTElDQVRJT04JX0lPKCdIJywgMHgwMikKKyNkZWZpbmUgSElESU9DR0RFVklORk8JCV9JT1IoJ0gnLCAweDAzLCBzdHJ1Y3QgaGlkZGV2X2RldmluZm8pCisjZGVmaW5lIEhJRElPQ0dTVFJJTkcJCV9JT1IoJ0gnLCAweDA0LCBzdHJ1Y3QgaGlkZGV2X3N0cmluZ19kZXNjcmlwdG9yKQorI2RlZmluZSBISURJT0NJTklUUkVQT1JUCV9JTygnSCcsIDB4MDUpCisjZGVmaW5lIEhJRElPQ0dOQU1FKGxlbikJX0lPQyhfSU9DX1JFQUQsICdIJywgMHgwNiwgbGVuKQorI2RlZmluZSBISURJT0NHUkVQT1JUCQlfSU9XKCdIJywgMHgwNywgc3RydWN0IGhpZGRldl9yZXBvcnRfaW5mbykKKyNkZWZpbmUgSElESU9DU1JFUE9SVAkJX0lPVygnSCcsIDB4MDgsIHN0cnVjdCBoaWRkZXZfcmVwb3J0X2luZm8pCisjZGVmaW5lIEhJRElPQ0dSRVBPUlRJTkZPCV9JT1dSKCdIJywgMHgwOSwgc3RydWN0IGhpZGRldl9yZXBvcnRfaW5mbykKKyNkZWZpbmUgSElESU9DR0ZJRUxESU5GTwlfSU9XUignSCcsIDB4MEEsIHN0cnVjdCBoaWRkZXZfZmllbGRfaW5mbykKKyNkZWZpbmUgSElESU9DR1VTQUdFCQlfSU9XUignSCcsIDB4MEIsIHN0cnVjdCBoaWRkZXZfdXNhZ2VfcmVmKQorI2RlZmluZSBISURJT0NTVVNBR0UJCV9JT1coJ0gnLCAweDBDLCBzdHJ1Y3QgaGlkZGV2X3VzYWdlX3JlZikKKyNkZWZpbmUgSElESU9DR1VDT0RFCQlfSU9XUignSCcsIDB4MEQsIHN0cnVjdCBoaWRkZXZfdXNhZ2VfcmVmKQorI2RlZmluZSBISURJT0NHRkxBRwkJX0lPUignSCcsIDB4MEUsIGludCkKKyNkZWZpbmUgSElESU9DU0ZMQUcJCV9JT1coJ0gnLCAweDBGLCBpbnQpCisjZGVmaW5lIEhJRElPQ0dDT0xMRUNUSU9OSU5ERVgJX0lPVygnSCcsIDB4MTAsIHN0cnVjdCBoaWRkZXZfdXNhZ2VfcmVmKQorI2RlZmluZSBISURJT0NHQ09MTEVDVElPTklORk8JX0lPV1IoJ0gnLCAweDExLCBzdHJ1Y3QgaGlkZGV2X2NvbGxlY3Rpb25faW5mbykKKyNkZWZpbmUgSElESU9DR1BIWVMobGVuKQlfSU9DKF9JT0NfUkVBRCwgJ0gnLCAweDEyLCBsZW4pCisKKy8qIEZvciB3cml0aW5nL3JlYWRpbmcgdG8gbXVsdGlwbGUvY29uc2VjdXRpdmUgdXNhZ2VzICovCisjZGVmaW5lIEhJRElPQ0dVU0FHRVMJCV9JT1dSKCdIJywgMHgxMywgc3RydWN0IGhpZGRldl91c2FnZV9yZWZfbXVsdGkpCisjZGVmaW5lIEhJRElPQ1NVU0FHRVMJCV9JT1coJ0gnLCAweDE0LCBzdHJ1Y3QgaGlkZGV2X3VzYWdlX3JlZl9tdWx0aSkKKworLyogCisgKiBGbGFncyB0byBiZSB1c2VkIGluIEhJRElPQ1NGTEFHCisgKi8KKyNkZWZpbmUgSElEREVWX0ZMQUdfVVJFRgkweDEKKyNkZWZpbmUgSElEREVWX0ZMQUdfUkVQT1JUCTB4MgorI2RlZmluZSBISURERVZfRkxBR1MJCTB4MworCisvKiBUbyB0cmF2ZXJzZSB0aGUgaW5wdXQgcmVwb3J0IGRlc2NyaXB0b3IgaW5mbyBmb3IgYSBISUQgZGV2aWNlLCBwZXJmb3JtIHRoZSAKKyAqIGZvbGxvd2luZzoKKyAqCisgKiByaW5mby5yZXBvcnRfdHlwZSA9IEhJRF9SRVBPUlRfVFlQRV9JTlBVVDsKKyAqIHJpbmZvLnJlcG9ydF9pZCA9IEhJRF9SRVBPUlRfSURfRklSU1Q7CisgKiByZXQgPSBpb2N0bChmZCwgSElESU9DR1JFUE9SVElORk8sICZyaW5mbyk7CisgKgorICogd2hpbGUgKHJldCA+PSAwKSB7CisgKiAJZm9yIChpID0gMDsgaSA8IHJpbmZvLm51bV9maWVsZHM7IGkrKykgeworICogCQlmaW5mby5yZXBvcnRfdHlwZSA9IHJpbmZvLnJlcG9ydF90eXBlOworICogCQlmaW5mby5yZXBvcnRfaWQgPSByaW5mby5yZXBvcnRfaWQ7CisgKiAJCWZpbmZvLmZpZWxkX2luZGV4ID0gaTsKKyAqIAkJaW9jdGwoZmQsIEhJRElPQ0dGSUVMRElORk8sICZmaW5mbyk7CisgKiAJCWZvciAoaiA9IDA7IGogPCBmaW5mby5tYXh1c2FnZTsgaisrKSB7CisgKiAJCQl1cmVmLnJlcG9ydF90eXBlID0gcmluZm8ucmVwb3J0X3R5cGU7CisgKiAJCQl1cmVmLnJlcG9ydF9pZCA9IHJpbmZvLnJlcG9ydF9pZDsKKyAqIAkJCXVyZWYuZmllbGRfaW5kZXggPSBpOworICogCQkJdXJlZi51c2FnZV9pbmRleCA9IGo7CisgKiAJCQlpb2N0bChmZCwgSElESU9DR1VDT0RFLCAmdXJlZik7CisgKiAJCQlpb2N0bChmZCwgSElESU9DR1VTQUdFLCAmdXJlZik7CisgKiAJCX0KKyAqIAl9CisgKiAJcmluZm8ucmVwb3J0X2lkIHw9IEhJRF9SRVBPUlRfSURfTkVYVDsKKyAqIAlyZXQgPSBpb2N0bChmZCwgSElESU9DR1JFUE9SVElORk8sICZyaW5mbyk7CisgKiB9CisgKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaGlkcmF3LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hpZHJhdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMTZiMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hpZHJhdy5oCkBAIC0wLDAgKzEsNTAgQEAKKyNpZm5kZWYgX0hJRFJBV19ICisjZGVmaW5lIF9ISURSQVdfSAorCisvKgorICogIENvcHlyaWdodCAoYykgMjAwNyBKaXJpIEtvc2luYQorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgaGlkcmF3X3JlcG9ydF9kZXNjcmlwdG9yIHsKKwlfX3UzMiBzaXplOworCV9fdTggdmFsdWVbSElEX01BWF9ERVNDUklQVE9SX1NJWkVdOworfTsKKworc3RydWN0IGhpZHJhd19kZXZpbmZvIHsKKwlfX3UzMiBidXN0eXBlOworCV9fczE2IHZlbmRvcjsKKwlfX3MxNiBwcm9kdWN0OworfTsKKworLyogaW9jdGwgaW50ZXJmYWNlICovCisjZGVmaW5lIEhJRElPQ0dSREVTQ1NJWkUJX0lPUignSCcsIDB4MDEsIGludCkKKyNkZWZpbmUgSElESU9DR1JERVNDCQlfSU9SKCdIJywgMHgwMiwgc3RydWN0IGhpZHJhd19yZXBvcnRfZGVzY3JpcHRvcikKKyNkZWZpbmUgSElESU9DR1JBV0lORk8JCV9JT1IoJ0gnLCAweDAzLCBzdHJ1Y3QgaGlkcmF3X2RldmluZm8pCisjZGVmaW5lIEhJRElPQ0dSQVdOQU1FKGxlbikgICAgIF9JT0MoX0lPQ19SRUFELCAnSCcsIDB4MDQsIGxlbikKKyNkZWZpbmUgSElESU9DR1JBV1BIWVMobGVuKSAgICAgX0lPQyhfSU9DX1JFQUQsICdIJywgMHgwNSwgbGVuKQorLyogVGhlIGZpcnN0IGJ5dGUgb2YgU0ZFQVRVUkUgYW5kIEdGRUFUVVJFIGlzIHRoZSByZXBvcnQgbnVtYmVyICovCisjZGVmaW5lIEhJRElPQ1NGRUFUVVJFKGxlbikgICAgX0lPQyhfSU9DX1dSSVRFfF9JT0NfUkVBRCwgJ0gnLCAweDA2LCBsZW4pCisjZGVmaW5lIEhJRElPQ0dGRUFUVVJFKGxlbikgICAgX0lPQyhfSU9DX1dSSVRFfF9JT0NfUkVBRCwgJ0gnLCAweDA3LCBsZW4pCisKKyNkZWZpbmUgSElEUkFXX0ZJUlNUX01JTk9SIDAKKyNkZWZpbmUgSElEUkFXX01BWF9ERVZJQ0VTIDY0CisvKiBudW1iZXIgb2YgcmVwb3J0cyB0byBidWZmZXIgKi8KKyNkZWZpbmUgSElEUkFXX0JVRkZFUl9TSVpFIDY0CisKKworLyoga2VybmVsLW9ubHkgQVBJIGRlY2xhcmF0aW9ucyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaHBldC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ocGV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyYjhmZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaHBldC5oCkBAIC0wLDAgKzEsMjUgQEAKKyNpZm5kZWYJX19IUEVUX18KKyNkZWZpbmUJX19IUEVUX18gMQorCisKKworCitzdHJ1Y3QgaHBldF9pbmZvIHsKKwl1bnNpZ25lZCBsb25nIGhpX2lyZXFmcmVxOwkvKiBIeiAqLworCXVuc2lnbmVkIGxvbmcgaGlfZmxhZ3M7CS8qIGluZm9ybWF0aW9uICovCisJdW5zaWduZWQgc2hvcnQgaGlfaHBldDsKKwl1bnNpZ25lZCBzaG9ydCBoaV90aW1lcjsKK307CisKKyNkZWZpbmUgSFBFVF9JTkZPX1BFUklPRElDCTB4MDAxMAkvKiBwZXJpb2RpYy1jYXBhYmxlIGNvbXBhcmF0b3IgKi8KKworI2RlZmluZQlIUEVUX0lFX09OCV9JTygnaCcsIDB4MDEpCS8qIGludGVycnVwdCBvbiAqLworI2RlZmluZQlIUEVUX0lFX09GRglfSU8oJ2gnLCAweDAyKQkvKiBpbnRlcnJ1cHQgb2ZmICovCisjZGVmaW5lCUhQRVRfSU5GTwlfSU9SKCdoJywgMHgwMywgc3RydWN0IGhwZXRfaW5mbykKKyNkZWZpbmUJSFBFVF9FUEkJX0lPKCdoJywgMHgwNCkJLyogZW5hYmxlIHBlcmlvZGljICovCisjZGVmaW5lCUhQRVRfRFBJCV9JTygnaCcsIDB4MDUpCS8qIGRpc2FibGUgcGVyaW9kaWMgKi8KKyNkZWZpbmUJSFBFVF9JUlFGUkVRCV9JT1coJ2gnLCAweDYsIHVuc2lnbmVkIGxvbmcpCS8qIElSUUZSRVEgdXNlYyAqLworCisjZGVmaW5lIE1BWF9IUEVUX1RCUwk4CQkvKiBtYXhpbXVtIGhwZXQgdGltZXIgYmxvY2tzICovCisKKyNlbmRpZgkJCQkvKiAhX19IUEVUX18gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaHlzZG5faWYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaHlzZG5faWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDIzNmFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oeXNkbl9pZi5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qICRJZDogaHlzZG5faWYuaCx2IDEuMS44LjMgMjAwMS8wOS8yMyAyMjoyNTowNSBrYWkgRXhwICQKKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEhZU0ROIGNhcmRzCisgKiBpb2N0bCBkZWZpbml0aW9ucyBzaGFyZWQgYnkgaHluZXRtZ3IgYW5kIGRyaXZlci4KKyAqCisgKiBBdXRob3IgICAgV2VybmVyIENvcm5lbGl1cyAod2VybmVyQHRpdHJvLmRlKSBmb3IgSHlwZXJjb3BlIEdtYkgKKyAqIENvcHlyaWdodCAxOTk5IGJ5IFdlcm5lciBDb3JuZWxpdXMgKHdlcm5lckB0aXRyby5kZSkKKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqLworCisvKioqKioqKioqKioqKioqKi8KKy8qIGVycm9yIHZhbHVlcyAqLworLyoqKioqKioqKioqKioqKiovCisjZGVmaW5lIEVSUl9OT05FICAgICAgICAgICAgIDAgLyogbm8gZXJyb3Igb2NjdXJyZWQgKi8KKyNkZWZpbmUgRVJSX0FMUkVBRFlfQk9PVCAgMTAwMCAvKiB3ZSBhcmUgYWxyZWFkeSBib290aW5nICovCisjZGVmaW5lIEVQT0ZfQkFEX01BR0lDICAgIDEwMDEgLyogYmFkIG1hZ2ljIGluIFBPRiBoZWFkZXIgKi8KKyNkZWZpbmUgRVJSX0JPQVJEX0RQUkFNICAgMTAwMiAvKiBib2FyZCBEUFJBTSBmYWlsZWQgKi8KKyNkZWZpbmUgRVBPRl9JTlRFUk5BTCAgICAgMTAwMyAvKiBpbnRlcm5hbCBQT0YgaGFuZGxlciBlcnJvciAqLworI2RlZmluZSBFUE9GX0JBRF9JTUdfU0laRSAxMDA0IC8qIFBPRiBib290IGltYWdlIHNpemUgaW52YWxpZCAqLworI2RlZmluZSBFUlJfQk9PVElNR19GQUlMICAxMDA1IC8qIDEuIHN0YWdlIGJvb3QgaW1hZ2UgZGlkIG5vdCBzdGFydCAqLworI2RlZmluZSBFUlJfQk9PVFNFUV9GQUlMICAxMDA2IC8qIDIuIHN0YWdlIGJvb3Qgc2VxIGhhbmRzaGFrZSB0aW1lb3V0ICovCisjZGVmaW5lIEVSUl9QT0ZfVElNRU9VVCAgIDEwMDcgLyogdGltZW91dCB3YWl0aW5nIGZvciBjYXJkIHBvZiByZWFkeSAqLworI2RlZmluZSBFUlJfTk9UX0JPT1RFRCAgICAxMDA4IC8qIG9wZXJhdGlvbiBvbmx5IGFsbG93ZWQgd2hlbiBib290ZWQgKi8KKyNkZWZpbmUgRVJSX0NPTkZfTE9ORyAgICAgMTAwOSAvKiBjb25mIGxpbmUgaXMgdG9vIGxvbmcgKi8gCisjZGVmaW5lIEVSUl9JTlZfQ0hBTiAgICAgIDEwMTAgLyogaW52YWxpZCBjaGFubmVsIG51bWJlciAqLyAKKyNkZWZpbmUgRVJSX0FTWU5DX1RJTUUgICAgMTAxMSAvKiB0aW1lb3V0IHNlbmRpbmcgYXN5bmMgZGF0YSAqLyAKKworCisKKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pMmMtZGV2LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2kyYy1kZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzFkNDc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pMmMtZGV2LmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAgICBpMmMtZGV2LmggLSBpMmMtYnVzIGRyaXZlciwgY2hhciBkZXZpY2UgaW50ZXJmYWNlCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTUtOTcgU2ltb24gRy4gVm9nbAorICAgIENvcHlyaWdodCAoQykgMTk5OC05OSBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpZm5kZWYgX0xJTlVYX0kyQ19ERVZfSAorI2RlZmluZSBfTElOVVhfSTJDX0RFVl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisKKy8qIC9kZXYvaTJjLVggaW9jdGwgY29tbWFuZHMuICBUaGUgaW9jdGwncyBwYXJhbWV0ZXIgaXMgYWx3YXlzIGFuCisgKiB1bnNpZ25lZCBsb25nLCBleGNlcHQgZm9yOgorICoJLSBJMkNfRlVOQ1MsIHRha2VzIHBvaW50ZXIgdG8gYW4gdW5zaWduZWQgbG9uZworICoJLSBJMkNfUkRXUiwgdGFrZXMgcG9pbnRlciB0byBzdHJ1Y3QgaTJjX3Jkd3JfaW9jdGxfZGF0YQorICoJLSBJMkNfU01CVVMsIHRha2VzIHBvaW50ZXIgdG8gc3RydWN0IGkyY19zbWJ1c19pb2N0bF9kYXRhCisgKi8KKyNkZWZpbmUgSTJDX1JFVFJJRVMJMHgwNzAxCS8qIG51bWJlciBvZiB0aW1lcyBhIGRldmljZSBhZGRyZXNzIHNob3VsZAorCQkJCSAgIGJlIHBvbGxlZCB3aGVuIG5vdCBhY2tub3dsZWRnaW5nICovCisjZGVmaW5lIEkyQ19USU1FT1VUCTB4MDcwMgkvKiBzZXQgdGltZW91dCBpbiB1bml0cyBvZiAxMCBtcyAqLworCisvKiBOT1RFOiBTbGF2ZSBhZGRyZXNzIGlzIDcgb3IgMTAgYml0cywgYnV0IDEwLWJpdCBhZGRyZXNzZXMKKyAqIGFyZSBOT1Qgc3VwcG9ydGVkISAoZHVlIHRvIGNvZGUgYnJva2VubmVzcykKKyAqLworI2RlZmluZSBJMkNfU0xBVkUJMHgwNzAzCS8qIFVzZSB0aGlzIHNsYXZlIGFkZHJlc3MgKi8KKyNkZWZpbmUgSTJDX1NMQVZFX0ZPUkNFCTB4MDcwNgkvKiBVc2UgdGhpcyBzbGF2ZSBhZGRyZXNzLCBldmVuIGlmIGl0CisJCQkJICAgaXMgYWxyZWFkeSBpbiB1c2UgYnkgYSBkcml2ZXIhICovCisjZGVmaW5lIEkyQ19URU5CSVQJMHgwNzA0CS8qIDAgZm9yIDcgYml0IGFkZHJzLCAhPSAwIGZvciAxMCBiaXQgKi8KKworI2RlZmluZSBJMkNfRlVOQ1MJMHgwNzA1CS8qIEdldCB0aGUgYWRhcHRlciBmdW5jdGlvbmFsaXR5IG1hc2sgKi8KKworI2RlZmluZSBJMkNfUkRXUgkweDA3MDcJLyogQ29tYmluZWQgUi9XIHRyYW5zZmVyIChvbmUgU1RPUCBvbmx5KSAqLworCisjZGVmaW5lIEkyQ19QRUMJCTB4MDcwOAkvKiAhPSAwIHRvIHVzZSBQRUMgd2l0aCBTTUJ1cyAqLworI2RlZmluZSBJMkNfU01CVVMJMHgwNzIwCS8qIFNNQnVzIHRyYW5zZmVyICovCisKKworLyogVGhpcyBpcyB0aGUgc3RydWN0dXJlIGFzIHVzZWQgaW4gdGhlIEkyQ19TTUJVUyBpb2N0bCBjYWxsICovCitzdHJ1Y3QgaTJjX3NtYnVzX2lvY3RsX2RhdGEgeworCV9fdTggcmVhZF93cml0ZTsKKwlfX3U4IGNvbW1hbmQ7CisJX191MzIgc2l6ZTsKKwl1bmlvbiBpMmNfc21idXNfZGF0YSAqZGF0YTsKK307CisKKy8qIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBhcyB1c2VkIGluIHRoZSBJMkNfUkRXUiBpb2N0bCBjYWxsICovCitzdHJ1Y3QgaTJjX3Jkd3JfaW9jdGxfZGF0YSB7CisJc3RydWN0IGkyY19tc2cgKm1zZ3M7CS8qIHBvaW50ZXJzIHRvIGkyY19tc2dzICovCisJX191MzIgbm1zZ3M7CQkJLyogbnVtYmVyIG9mIGkyY19tc2dzICovCit9OworCisjZGVmaW5lICBJMkNfUkRSV19JT0NUTF9NQVhfTVNHUwk0MgorCisKKyNlbmRpZiAvKiBfTElOVVhfSTJDX0RFVl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2kyYy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pMmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzIwNGUwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pMmMuaApAQCAtMCwwICsxLDE0OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoJCQkJCQkJCQkgICAgICovCisvKiBpMmMuaCAtIGRlZmluaXRpb25zIGZvciB0aGUgaTJjLWJ1cyBpbnRlcmZhY2UJCQkgICAgICovCisvKgkJCQkJCQkJCSAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgU2ltb24gRy4gVm9nbAorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCQkgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFdpdGggc29tZSBjaGFuZ2VzIGZyb20gS3nDtnN0aSBNw6Rsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4gYW5kCisgICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+ICovCisKKyNpZm5kZWYgX0xJTlVYX0kyQ19ICisjZGVmaW5lIF9MSU5VWF9JMkNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoqCisgKiBzdHJ1Y3QgaTJjX21zZyAtIGFuIEkyQyB0cmFuc2FjdGlvbiBzZWdtZW50IGJlZ2lubmluZyB3aXRoIFNUQVJUCisgKiBAYWRkcjogU2xhdmUgYWRkcmVzcywgZWl0aGVyIHNldmVuIG9yIHRlbiBiaXRzLiAgV2hlbiB0aGlzIGlzIGEgdGVuCisgKgliaXQgYWRkcmVzcywgSTJDX01fVEVOIG11c3QgYmUgc2V0IGluIEBmbGFncyBhbmQgdGhlIGFkYXB0ZXIKKyAqCW11c3Qgc3VwcG9ydCBJMkNfRlVOQ18xMEJJVF9BRERSLgorICogQGZsYWdzOiBJMkNfTV9SRCBpcyBoYW5kbGVkIGJ5IGFsbCBhZGFwdGVycy4gIE5vIG90aGVyIGZsYWdzIG1heSBiZQorICoJcHJvdmlkZWQgdW5sZXNzIHRoZSBhZGFwdGVyIGV4cG9ydGVkIHRoZSByZWxldmFudCBJMkNfRlVOQ18qCisgKglmbGFncyB0aHJvdWdoIGkyY19jaGVja19mdW5jdGlvbmFsaXR5KCkuCisgKiBAbGVuOiBOdW1iZXIgb2YgZGF0YSBieXRlcyBpbiBAYnVmIGJlaW5nIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIHRoZQorICoJSTJDIHNsYXZlIGFkZHJlc3MuICBGb3IgcmVhZCB0cmFuc2FjdGlvbnMgd2hlcmUgSTJDX01fUkVDVl9MRU4KKyAqCWlzIHNldCwgdGhlIGNhbGxlciBndWFyYW50ZWVzIHRoYXQgdGhpcyBidWZmZXIgY2FuIGhvbGQgdXAgdG8KKyAqCTMyIGJ5dGVzIGluIGFkZGl0aW9uIHRvIHRoZSBpbml0aWFsIGxlbmd0aCBieXRlIHNlbnQgYnkgdGhlCisgKglzbGF2ZSAocGx1cywgaWYgdXNlZCwgdGhlIFNNQnVzIFBFQyk7IGFuZCB0aGlzIHZhbHVlIHdpbGwgYmUKKyAqCWluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgYmxvY2sgZGF0YSBieXRlcyByZWNlaXZlZC4KKyAqIEBidWY6IFRoZSBidWZmZXIgaW50byB3aGljaCBkYXRhIGlzIHJlYWQsIG9yIGZyb20gd2hpY2ggaXQncyB3cml0dGVuLgorICoKKyAqIEFuIGkyY19tc2cgaXMgdGhlIGxvdyBsZXZlbCByZXByZXNlbnRhdGlvbiBvZiBvbmUgc2VnbWVudCBvZiBhbiBJMkMKKyAqIHRyYW5zYWN0aW9uLiAgSXQgaXMgdmlzaWJsZSB0byBkcml2ZXJzIGluIHRoZSBAaTJjX3RyYW5zZmVyKCkgcHJvY2VkdXJlLAorICogdG8gdXNlcnNwYWNlIGZyb20gaTJjLWRldiwgYW5kIHRvIEkyQyBhZGFwdGVyIGRyaXZlcnMgdGhyb3VnaCB0aGUKKyAqIEBpMmNfYWRhcHRlci5AbWFzdGVyX3hmZXIoKSBtZXRob2QuCisgKgorICogRXhjZXB0IHdoZW4gSTJDICJwcm90b2NvbCBtYW5nbGluZyIgaXMgdXNlZCwgYWxsIEkyQyBhZGFwdGVycyBpbXBsZW1lbnQKKyAqIHRoZSBzdGFuZGFyZCBydWxlcyBmb3IgSTJDIHRyYW5zYWN0aW9ucy4gIEVhY2ggdHJhbnNhY3Rpb24gYmVnaW5zIHdpdGggYQorICogU1RBUlQuICBUaGF0IGlzIGZvbGxvd2VkIGJ5IHRoZSBzbGF2ZSBhZGRyZXNzLCBhbmQgYSBiaXQgZW5jb2RpbmcgcmVhZAorICogdmVyc3VzIHdyaXRlLiAgVGhlbiBmb2xsb3cgYWxsIHRoZSBkYXRhIGJ5dGVzLCBwb3NzaWJseSBpbmNsdWRpbmcgYSBieXRlCisgKiB3aXRoIFNNQnVzIFBFQy4gIFRoZSB0cmFuc2ZlciB0ZXJtaW5hdGVzIHdpdGggYSBOQUssIG9yIHdoZW4gYWxsIHRob3NlCisgKiBieXRlcyBoYXZlIGJlZW4gdHJhbnNmZXJyZWQgYW5kIEFDS2VkLiAgSWYgdGhpcyBpcyB0aGUgbGFzdCBtZXNzYWdlIGluIGEKKyAqIGdyb3VwLCBpdCBpcyBmb2xsb3dlZCBieSBhIFNUT1AuICBPdGhlcndpc2UgaXQgaXMgZm9sbG93ZWQgYnkgdGhlIG5leHQKKyAqIEBpMmNfbXNnIHRyYW5zYWN0aW9uIHNlZ21lbnQsIGJlZ2lubmluZyB3aXRoIGEgKHJlcGVhdGVkKSBTVEFSVC4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB3aGVuIHRoZSBhZGFwdGVyIHN1cHBvcnRzIEkyQ19GVU5DX1BST1RPQ09MX01BTkdMSU5HIHRoZW4KKyAqIHBhc3NpbmcgY2VydGFpbiBAZmxhZ3MgbWF5IGhhdmUgY2hhbmdlZCB0aG9zZSBzdGFuZGFyZCBwcm90b2NvbCBiZWhhdmlvcnMuCisgKiBUaG9zZSBmbGFncyBhcmUgb25seSBmb3IgdXNlIHdpdGggYnJva2VuL25vbmNvbmZvcm1pbmcgc2xhdmVzLCBhbmQgd2l0aAorICogYWRhcHRlcnMgd2hpY2ggYXJlIGtub3duIHRvIHN1cHBvcnQgdGhlIHNwZWNpZmljIG1hbmdsaW5nIG9wdGlvbnMgdGhleQorICogbmVlZCAob25lIG9yIG1vcmUgb2YgSUdOT1JFX05BSywgTk9fUkRfQUNLLCBOT1NUQVJULCBhbmQgUkVWX0RJUl9BRERSKS4KKyAqLworc3RydWN0IGkyY19tc2cgeworCV9fdTE2IGFkZHI7CS8qIHNsYXZlIGFkZHJlc3MJCQkqLworCV9fdTE2IGZsYWdzOworI2RlZmluZSBJMkNfTV9URU4JCTB4MDAxMAkvKiB0aGlzIGlzIGEgdGVuIGJpdCBjaGlwIGFkZHJlc3MgKi8KKyNkZWZpbmUgSTJDX01fUkQJCTB4MDAwMQkvKiByZWFkIGRhdGEsIGZyb20gc2xhdmUgdG8gbWFzdGVyICovCisjZGVmaW5lIEkyQ19NX05PU1RBUlQJCTB4NDAwMAkvKiBpZiBJMkNfRlVOQ19QUk9UT0NPTF9NQU5HTElORyAqLworI2RlZmluZSBJMkNfTV9SRVZfRElSX0FERFIJMHgyMDAwCS8qIGlmIEkyQ19GVU5DX1BST1RPQ09MX01BTkdMSU5HICovCisjZGVmaW5lIEkyQ19NX0lHTk9SRV9OQUsJMHgxMDAwCS8qIGlmIEkyQ19GVU5DX1BST1RPQ09MX01BTkdMSU5HICovCisjZGVmaW5lIEkyQ19NX05PX1JEX0FDSwkJMHgwODAwCS8qIGlmIEkyQ19GVU5DX1BST1RPQ09MX01BTkdMSU5HICovCisjZGVmaW5lIEkyQ19NX1JFQ1ZfTEVOCQkweDA0MDAJLyogbGVuZ3RoIHdpbGwgYmUgZmlyc3QgcmVjZWl2ZWQgYnl0ZSAqLworCV9fdTE2IGxlbjsJCS8qIG1zZyBsZW5ndGgJCQkJKi8KKwlfX3U4ICpidWY7CQkvKiBwb2ludGVyIHRvIG1zZyBkYXRhCQkJKi8KK307CisKKy8qIFRvIGRldGVybWluZSB3aGF0IGZ1bmN0aW9uYWxpdHkgaXMgcHJlc2VudCAqLworCisjZGVmaW5lIEkyQ19GVU5DX0kyQwkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgSTJDX0ZVTkNfMTBCSVRfQUREUgkJMHgwMDAwMDAwMgorI2RlZmluZSBJMkNfRlVOQ19QUk9UT0NPTF9NQU5HTElORwkweDAwMDAwMDA0IC8qIEkyQ19NX05PU1RBUlQgZXRjLiAqLworI2RlZmluZSBJMkNfRlVOQ19TTUJVU19QRUMJCTB4MDAwMDAwMDgKKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfQkxPQ0tfUFJPQ19DQUxMCTB4MDAwMDgwMDAgLyogU01CdXMgMi4wICovCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1FVSUNLCQkweDAwMDEwMDAwCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfQllURQkweDAwMDIwMDAwCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEUJMHgwMDA0MDAwMAorI2RlZmluZSBJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEVfREFUQQkweDAwMDgwMDAwCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEVfREFUQQkweDAwMTAwMDAwCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfV09SRF9EQVRBCTB4MDAyMDAwMDAKKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV1JJVEVfV09SRF9EQVRBCTB4MDA0MDAwMDAKKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUFJPQ19DQUxMCTB4MDA4MDAwMDAKKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUkVBRF9CTE9DS19EQVRBCTB4MDEwMDAwMDAKKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQkxPQ0tfREFUQSAweDAyMDAwMDAwCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfSTJDX0JMT0NLCTB4MDQwMDAwMDAgLyogSTJDLWxpa2UgYmxvY2sgeGZlciAgKi8KKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV1JJVEVfSTJDX0JMT0NLCTB4MDgwMDAwMDAgLyogdy8gMS1ieXRlIHJlZy4gYWRkci4gKi8KKworI2RlZmluZSBJMkNfRlVOQ19TTUJVU19CWVRFCQkoSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFIHwgXAorCQkJCQkgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURSkKKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBCShJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEVfREFUQSB8IFwKKwkJCQkJIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEVfREFUQSkKKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBCShJMkNfRlVOQ19TTUJVU19SRUFEX1dPUkRfREFUQSB8IFwKKwkJCQkJIEkyQ19GVU5DX1NNQlVTX1dSSVRFX1dPUkRfREFUQSkKKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfQkxPQ0tfREFUQQkoSTJDX0ZVTkNfU01CVVNfUkVBRF9CTE9DS19EQVRBIHwgXAorCQkJCQkgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQkxPQ0tfREFUQSkKKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfSTJDX0JMT0NLCShJMkNfRlVOQ19TTUJVU19SRUFEX0kyQ19CTE9DSyB8IFwKKwkJCQkJIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0kyQ19CTE9DSykKKworI2RlZmluZSBJMkNfRlVOQ19TTUJVU19FTVVMCQkoSTJDX0ZVTkNfU01CVVNfUVVJQ0sgfCBcCisJCQkJCSBJMkNfRlVOQ19TTUJVU19CWVRFIHwgXAorCQkJCQkgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwgXAorCQkJCQkgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBIHwgXAorCQkJCQkgSTJDX0ZVTkNfU01CVVNfUFJPQ19DQUxMIHwgXAorCQkJCQkgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQkxPQ0tfREFUQSB8IFwKKwkJCQkJIEkyQ19GVU5DX1NNQlVTX0kyQ19CTE9DSyB8IFwKKwkJCQkJIEkyQ19GVU5DX1NNQlVTX1BFQykKKworLyoKKyAqIERhdGEgZm9yIFNNQnVzIE1lc3NhZ2VzCisgKi8KKyNkZWZpbmUgSTJDX1NNQlVTX0JMT0NLX01BWAkzMgkvKiBBcyBzcGVjaWZpZWQgaW4gU01CdXMgc3RhbmRhcmQgKi8KK3VuaW9uIGkyY19zbWJ1c19kYXRhIHsKKwlfX3U4IGJ5dGU7CisJX191MTYgd29yZDsKKwlfX3U4IGJsb2NrW0kyQ19TTUJVU19CTE9DS19NQVggKyAyXTsgLyogYmxvY2tbMF0gaXMgdXNlZCBmb3IgbGVuZ3RoICovCisJCQkgICAgICAgLyogYW5kIG9uZSBtb3JlIGZvciB1c2VyLXNwYWNlIGNvbXBhdGliaWxpdHkgKi8KK307CisKKy8qIGkyY19zbWJ1c194ZmVyIHJlYWQgb3Igd3JpdGUgbWFya2VycyAqLworI2RlZmluZSBJMkNfU01CVVNfUkVBRAkxCisjZGVmaW5lIEkyQ19TTUJVU19XUklURQkwCisKKy8qIFNNQnVzIHRyYW5zYWN0aW9uIHR5cGVzIChzaXplIHBhcmFtZXRlciBpbiB0aGUgYWJvdmUgZnVuY3Rpb25zKQorICAgTm90ZTogdGhlc2Ugbm8gbG9uZ2VyIGNvcnJlc3BvbmQgdG8gdGhlIChhcmJpdHJhcnkpIFBJSVg0IGludGVybmFsIGNvZGVzISAqLworI2RlZmluZSBJMkNfU01CVVNfUVVJQ0sJCSAgICAwCisjZGVmaW5lIEkyQ19TTUJVU19CWVRFCQkgICAgMQorI2RlZmluZSBJMkNfU01CVVNfQllURV9EQVRBCSAgICAyCisjZGVmaW5lIEkyQ19TTUJVU19XT1JEX0RBVEEJICAgIDMKKyNkZWZpbmUgSTJDX1NNQlVTX1BST0NfQ0FMTAkgICAgNAorI2RlZmluZSBJMkNfU01CVVNfQkxPQ0tfREFUQQkgICAgNQorI2RlZmluZSBJMkNfU01CVVNfSTJDX0JMT0NLX0JST0tFTiAgNgorI2RlZmluZSBJMkNfU01CVVNfQkxPQ0tfUFJPQ19DQUxMICAgNwkJLyogU01CdXMgMi4wICovCisjZGVmaW5lIEkyQ19TTUJVU19JMkNfQkxPQ0tfREFUQSAgICA4CisKKyNlbmRpZiAvKiBfTElOVVhfSTJDX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaTJvLWRldi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pMm8tZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM1ODBiNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaTJvLWRldi5oCkBAIC0wLDAgKzEsNDIxIEBACisvKgorICogSTJPIHVzZXIgc3BhY2UgYWNjZXNzaWJsZSBzdHJ1Y3R1cmVzL0FQSXMKKyAqCisgKiAoYykgQ29weXJpZ2h0IDE5OTksIDIwMDAgUmVkIEhhdCBTb2Z0d2FyZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIEkyTyBBUElzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byBib3RoCisgKiB0aGUga2VybmVsIGFuZCB1c2VyIGxldmVsIGFwcGxpY2F0aW9ucy4gIEtlcm5lbCBzcGVjaWZpYyBzdHJ1Y3R1cmVzCisgKiBhcmUgZGVmaW5lZCBpbiBpMm9fb3NtLiBPU01zIHNob3VsZCBpbmNsdWRlIF9vbmx5XyBpMm9fb3NtLmggd2hpY2gKKyAqIGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgdGhpcyBmaWxlLgorICoKKyAqLworCisjaWZuZGVmIF9JMk9fREVWX0gKKyNkZWZpbmUgX0kyT19ERVZfSAorCisvKiBIb3cgbWFueSBjb250cm9sbGVycyBhcmUgd2UgYWxsb3dpbmcgKi8KKyNkZWZpbmUgTUFYX0kyT19DT05UUk9MTEVSUwkzMgorCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogSTJPIENvbnRyb2wgSU9DVExzIGFuZCBzdHJ1Y3R1cmVzCisgKi8KKyNkZWZpbmUgSTJPX01BR0lDX05VTUJFUgknaScKKyNkZWZpbmUgSTJPR0VUSU9QUwkJX0lPUihJMk9fTUFHSUNfTlVNQkVSLDAsX191OFtNQVhfSTJPX0NPTlRST0xMRVJTXSkKKyNkZWZpbmUgSTJPSFJUR0VUCQlfSU9XUihJMk9fTUFHSUNfTlVNQkVSLDEsc3RydWN0IGkyb19jbWRfaHJ0bGN0KQorI2RlZmluZSBJMk9MQ1RHRVQJCV9JT1dSKEkyT19NQUdJQ19OVU1CRVIsMixzdHJ1Y3QgaTJvX2NtZF9ocnRsY3QpCisjZGVmaW5lIEkyT1BBUk1TRVQJCV9JT1dSKEkyT19NQUdJQ19OVU1CRVIsMyxzdHJ1Y3QgaTJvX2NtZF9wc2V0Z2V0KQorI2RlZmluZSBJMk9QQVJNR0VUCQlfSU9XUihJMk9fTUFHSUNfTlVNQkVSLDQsc3RydWN0IGkyb19jbWRfcHNldGdldCkKKyNkZWZpbmUgSTJPU1dETCAJCV9JT1dSKEkyT19NQUdJQ19OVU1CRVIsNSxzdHJ1Y3QgaTJvX3N3X3hmZXIpCisjZGVmaW5lIEkyT1NXVUwgCQlfSU9XUihJMk9fTUFHSUNfTlVNQkVSLDYsc3RydWN0IGkyb19zd194ZmVyKQorI2RlZmluZSBJMk9TV0RFTAkJX0lPV1IoSTJPX01BR0lDX05VTUJFUiw3LHN0cnVjdCBpMm9fc3dfeGZlcikKKyNkZWZpbmUgSTJPVkFMSURBVEUJCV9JT1IoSTJPX01BR0lDX05VTUJFUiw4LF9fdTMyKQorI2RlZmluZSBJMk9IVE1MIAkJX0lPV1IoSTJPX01BR0lDX05VTUJFUiw5LHN0cnVjdCBpMm9faHRtbCkKKyNkZWZpbmUgSTJPRVZUUkVHCQlfSU9XKEkyT19NQUdJQ19OVU1CRVIsMTAsc3RydWN0IGkyb19ldnRfaWQpCisjZGVmaW5lIEkyT0VWVEdFVAkJX0lPUihJMk9fTUFHSUNfTlVNQkVSLDExLHN0cnVjdCBpMm9fZXZ0X2luZm8pCisjZGVmaW5lIEkyT1BBU1NUSFJVCQlfSU9SKEkyT19NQUdJQ19OVU1CRVIsMTIsc3RydWN0IGkyb19jbWRfcGFzc3RocnUpCisjZGVmaW5lIEkyT1BBU1NUSFJVMzIJCV9JT1IoSTJPX01BR0lDX05VTUJFUiwxMixzdHJ1Y3QgaTJvX2NtZF9wYXNzdGhydTMyKQorCitzdHJ1Y3QgaTJvX2NtZF9wYXNzdGhydTMyIHsKKwl1bnNpZ25lZCBpbnQgaW9wOwkvKiBJT1AgdW5pdCBudW1iZXIgKi8KKwlfX3UzMiBtc2c7CQkvKiBtZXNzYWdlICovCit9OworCitzdHJ1Y3QgaTJvX2NtZF9wYXNzdGhydSB7CisJdW5zaWduZWQgaW50IGlvcDsJLyogSU9QIHVuaXQgbnVtYmVyICovCisJdm9pZCAqbXNnOwkvKiBtZXNzYWdlICovCit9OworCitzdHJ1Y3QgaTJvX2NtZF9ocnRsY3QgeworCXVuc2lnbmVkIGludCBpb3A7CS8qIElPUCB1bml0IG51bWJlciAqLworCXZvaWQgKnJlc2J1ZjsJLyogQnVmZmVyIGZvciByZXN1bHQgKi8KKwl1bnNpZ25lZCBpbnQgKnJlc2xlbjsJLyogQnVmZmVyIGxlbmd0aCBpbiBieXRlcyAqLworfTsKKworc3RydWN0IGkyb19jbWRfcHNldGdldCB7CisJdW5zaWduZWQgaW50IGlvcDsJLyogSU9QIHVuaXQgbnVtYmVyICovCisJdW5zaWduZWQgaW50IHRpZDsJLyogVGFyZ2V0IGRldmljZSBUSUQgKi8KKwl2b2lkICpvcGJ1ZjsJLyogT3BlcmF0aW9uIExpc3QgYnVmZmVyICovCisJdW5zaWduZWQgaW50IG9wbGVuOwkvKiBPcGVyYXRpb24gTGlzdCBidWZmZXIgbGVuZ3RoIGluIGJ5dGVzICovCisJdm9pZCAqcmVzYnVmOwkvKiBSZXN1bHQgTGlzdCBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgKnJlc2xlbjsJLyogUmVzdWx0IExpc3QgYnVmZmVyIGxlbmd0aCBpbiBieXRlcyAqLworfTsKKworc3RydWN0IGkyb19zd194ZmVyIHsKKwl1bnNpZ25lZCBpbnQgaW9wOwkvKiBJT1AgdW5pdCBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaGFyIGZsYWdzOwkvKiBGbGFncyBmaWVsZCAqLworCXVuc2lnbmVkIGNoYXIgc3dfdHlwZTsJLyogU29mdHdhcmUgdHlwZSAqLworCXVuc2lnbmVkIGludCBzd19pZDsJLyogU29mdHdhcmUgSUQgKi8KKwl2b2lkICpidWY7CS8qIFBvaW50ZXIgdG8gc29mdHdhcmUgYnVmZmVyICovCisJdW5zaWduZWQgaW50ICpzd2xlbjsJLyogTGVuZ3RoIG9mIHNvZnR3YXJlIGRhdGEgKi8KKwl1bnNpZ25lZCBpbnQgKm1heGZyYWc7CS8qIE1heGltdW0gZnJhZ21lbnQgY291bnQgKi8KKwl1bnNpZ25lZCBpbnQgKmN1cmZyYWc7CS8qIEN1cnJlbnQgZnJhZ21lbnQgY291bnQgKi8KK307CisKK3N0cnVjdCBpMm9faHRtbCB7CisJdW5zaWduZWQgaW50IGlvcDsJLyogSU9QIHVuaXQgbnVtYmVyICovCisJdW5zaWduZWQgaW50IHRpZDsJLyogVGFyZ2V0IGRldmljZSBJRCAqLworCXVuc2lnbmVkIGludCBwYWdlOwkvKiBIVE1MIHBhZ2UgKi8KKwl2b2lkICpyZXNidWY7CS8qIEJ1ZmZlciBmb3IgcmVwbHkgSFRNTCBwYWdlICovCisJdW5zaWduZWQgaW50ICpyZXNsZW47CS8qIExlbmd0aCBpbiBieXRlcyBvZiByZXBseSBidWZmZXIgKi8KKwl2b2lkICpxYnVmOwkvKiBQb2ludGVyIHRvIEhUVFAgcXVlcnkgc3RyaW5nICovCisJdW5zaWduZWQgaW50IHFsZW47CS8qIExlbmd0aCBpbiBieXRlcyBvZiBxdWVyeSBzdHJpbmcgYnVmZmVyICovCit9OworCisjZGVmaW5lIEkyT19FVlRfUV9MRU4gMzIKKworc3RydWN0IGkyb19ldnRfaWQgeworCXVuc2lnbmVkIGludCBpb3A7CisJdW5zaWduZWQgaW50IHRpZDsKKwl1bnNpZ25lZCBpbnQgZXZ0X21hc2s7Cit9OworCisvKiBFdmVudCBkYXRhIHNpemUgPSBmcmFtZSBzaXplIC0gbWVzc2FnZSBoZWFkZXIgKyBldnQgaW5kaWNhdG9yICovCisjZGVmaW5lIEkyT19FVlRfREFUQV9TSVpFIDg4CisKK3N0cnVjdCBpMm9fZXZ0X2luZm8geworCXN0cnVjdCBpMm9fZXZ0X2lkIGlkOworCXVuc2lnbmVkIGNoYXIgZXZ0X2RhdGFbSTJPX0VWVF9EQVRBX1NJWkVdOworCXVuc2lnbmVkIGludCBkYXRhX3NpemU7Cit9OworCitzdHJ1Y3QgaTJvX2V2dF9nZXQgeworCXN0cnVjdCBpMm9fZXZ0X2luZm8gaW5mbzsKKwlpbnQgcGVuZGluZzsKKwlpbnQgbG9zdDsKK307CisKK3R5cGVkZWYgc3RydWN0IGkyb19zZ19pb19oZHIgeworCXVuc2lnbmVkIGludCBmbGFnczsJLyogc2VlIEkyT19EUFRfU0dfSU9fRkxBR1MgKi8KK30gaTJvX3NnX2lvX2hkcl90OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEhSVCByZWxhdGVkIGNvbnN0YW50cyBhbmQgc3RydWN0dXJlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBJMk9fQlVTX0xPQ0FMCTAKKyNkZWZpbmUgSTJPX0JVU19JU0EJMQorI2RlZmluZSBJMk9fQlVTX0VJU0EJMgorI2RlZmluZSBJMk9fQlVTX01DQQkzCisjZGVmaW5lIEkyT19CVVNfUENJCTQKKyNkZWZpbmUgSTJPX0JVU19QQ01DSUEJNQorI2RlZmluZSBJMk9fQlVTX05VQlVTCTYKKyNkZWZpbmUgSTJPX0JVU19DQVJEQlVTIDcKKyNkZWZpbmUgSTJPX0JVU19VTktOT1dOIDB4ODAKKwordHlwZWRlZiBzdHJ1Y3QgX2kyb19wY2lfYnVzIHsKKwlfX3U4IFBjaUZ1bmN0aW9uTnVtYmVyOworCV9fdTggUGNpRGV2aWNlTnVtYmVyOworCV9fdTggUGNpQnVzTnVtYmVyOworCV9fdTggcmVzZXJ2ZWQ7CisJX191MTYgUGNpVmVuZG9ySUQ7CisJX191MTYgUGNpRGV2aWNlSUQ7Cit9IGkyb19wY2lfYnVzOworCit0eXBlZGVmIHN0cnVjdCBfaTJvX2xvY2FsX2J1cyB7CisJX191MTYgTGJCYXNlSU9Qb3J0OworCV9fdTE2IHJlc2VydmVkOworCV9fdTMyIExiQmFzZU1lbW9yeUFkZHJlc3M7Cit9IGkyb19sb2NhbF9idXM7CisKK3R5cGVkZWYgc3RydWN0IF9pMm9faXNhX2J1cyB7CisJX191MTYgSXNhQmFzZUlPUG9ydDsKKwlfX3U4IENTTjsKKwlfX3U4IHJlc2VydmVkOworCV9fdTMyIElzYUJhc2VNZW1vcnlBZGRyZXNzOworfSBpMm9faXNhX2J1czsKKwordHlwZWRlZiBzdHJ1Y3QgX2kyb19laXNhX2J1c19pbmZvIHsKKwlfX3UxNiBFaXNhQmFzZUlPUG9ydDsKKwlfX3U4IHJlc2VydmVkOworCV9fdTggRWlzYVNsb3ROdW1iZXI7CisJX191MzIgRWlzYUJhc2VNZW1vcnlBZGRyZXNzOworfSBpMm9fZWlzYV9idXM7CisKK3R5cGVkZWYgc3RydWN0IF9pMm9fbWNhX2J1cyB7CisJX191MTYgTWNhQmFzZUlPUG9ydDsKKwlfX3U4IHJlc2VydmVkOworCV9fdTggTWNhU2xvdE51bWJlcjsKKwlfX3UzMiBNY2FCYXNlTWVtb3J5QWRkcmVzczsKK30gaTJvX21jYV9idXM7CisKK3R5cGVkZWYgc3RydWN0IF9pMm9fb3RoZXJfYnVzIHsKKwlfX3UxNiBCYXNlSU9Qb3J0OworCV9fdTE2IHJlc2VydmVkOworCV9fdTMyIEJhc2VNZW1vcnlBZGRyZXNzOworfSBpMm9fb3RoZXJfYnVzOworCit0eXBlZGVmIHN0cnVjdCBfaTJvX2hydF9lbnRyeSB7CisJX191MzIgYWRhcHRlcl9pZDsKKwlfX3UzMiBwYXJlbnRfdGlkOjEyOworCV9fdTMyIHN0YXRlOjQ7CisJX191MzIgYnVzX251bTo4OworCV9fdTMyIGJ1c190eXBlOjg7CisJdW5pb24geworCQlpMm9fcGNpX2J1cyBwY2lfYnVzOworCQlpMm9fbG9jYWxfYnVzIGxvY2FsX2J1czsKKwkJaTJvX2lzYV9idXMgaXNhX2J1czsKKwkJaTJvX2Vpc2FfYnVzIGVpc2FfYnVzOworCQlpMm9fbWNhX2J1cyBtY2FfYnVzOworCQlpMm9fb3RoZXJfYnVzIG90aGVyX2J1czsKKwl9IGJ1czsKK30gaTJvX2hydF9lbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3QgX2kyb19ocnQgeworCV9fdTE2IG51bV9lbnRyaWVzOworCV9fdTggZW50cnlfbGVuOworCV9fdTggaHJ0X3ZlcnNpb247CisJX191MzIgY2hhbmdlX2luZDsKKwlpMm9faHJ0X2VudHJ5IGhydF9lbnRyeVsxXTsKK30gaTJvX2hydDsKKwordHlwZWRlZiBzdHJ1Y3QgX2kyb19sY3RfZW50cnkgeworCV9fdTMyIGVudHJ5X3NpemU6MTY7CisJX191MzIgdGlkOjEyOworCV9fdTMyIHJlc2VydmVkOjQ7CisJX191MzIgY2hhbmdlX2luZDsKKwlfX3UzMiBkZXZpY2VfZmxhZ3M7CisJX191MzIgY2xhc3NfaWQ6MTI7CisJX191MzIgdmVyc2lvbjo0OworCV9fdTMyIHZlbmRvcl9pZDoxNjsKKwlfX3UzMiBzdWJfY2xhc3M7CisJX191MzIgdXNlcl90aWQ6MTI7CisJX191MzIgcGFyZW50X3RpZDoxMjsKKwlfX3UzMiBiaW9zX2luZm86ODsKKwlfX3U4IGlkZW50aXR5X3RhZ1s4XTsKKwlfX3UzMiBldmVudF9jYXBhYmlsaXRpZXM7Cit9IGkyb19sY3RfZW50cnk7CisKK3R5cGVkZWYgc3RydWN0IF9pMm9fbGN0IHsKKwlfX3UzMiB0YWJsZV9zaXplOjE2OworCV9fdTMyIGJvb3RfdGlkOjEyOworCV9fdTMyIGxjdF92ZXI6NDsKKwlfX3UzMiBpb3BfZmxhZ3M7CisJX191MzIgY2hhbmdlX2luZDsKKwlpMm9fbGN0X2VudHJ5IGxjdF9lbnRyeVsxXTsKK30gaTJvX2xjdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2kyb19zdGF0dXNfYmxvY2sgeworCV9fdTE2IG9yZ19pZDsKKwlfX3UxNiByZXNlcnZlZDsKKwlfX3UxNiBpb3BfaWQ6MTI7CisJX191MTYgcmVzZXJ2ZWQxOjQ7CisJX191MTYgaG9zdF91bml0X2lkOworCV9fdTE2IHNlZ21lbnRfbnVtYmVyOjEyOworCV9fdTE2IGkyb192ZXJzaW9uOjQ7CisJX191OCBpb3Bfc3RhdGU7CisJX191OCBtc2dfdHlwZTsKKwlfX3UxNiBpbmJvdW5kX2ZyYW1lX3NpemU7CisJX191OCBpbml0X2NvZGU7CisJX191OCByZXNlcnZlZDI7CisJX191MzIgbWF4X2luYm91bmRfZnJhbWVzOworCV9fdTMyIGN1cl9pbmJvdW5kX2ZyYW1lczsKKwlfX3UzMiBtYXhfb3V0Ym91bmRfZnJhbWVzOworCWNoYXIgcHJvZHVjdF9pZFsyNF07CisJX191MzIgZXhwZWN0ZWRfbGN0X3NpemU7CisJX191MzIgaW9wX2NhcGFiaWxpdGllczsKKwlfX3UzMiBkZXNpcmVkX21lbV9zaXplOworCV9fdTMyIGN1cnJlbnRfbWVtX3NpemU7CisJX191MzIgY3VycmVudF9tZW1fYmFzZTsKKwlfX3UzMiBkZXNpcmVkX2lvX3NpemU7CisJX191MzIgY3VycmVudF9pb19zaXplOworCV9fdTMyIGN1cnJlbnRfaW9fYmFzZTsKKwlfX3UzMiByZXNlcnZlZDM6MjQ7CisJX191MzIgY21kX3N0YXR1czo4OworfSBpMm9fc3RhdHVzX2Jsb2NrOworCisvKiBFdmVudCBpbmRpY2F0b3IgbWFzayBmbGFncyAqLworI2RlZmluZSBJMk9fRVZUX0lORF9TVEFURV9DSEFOR0UJCTB4ODAwMDAwMDAKKyNkZWZpbmUgSTJPX0VWVF9JTkRfR0VORVJBTF9XQVJOSU5HCQkweDQwMDAwMDAwCisjZGVmaW5lIEkyT19FVlRfSU5EX0NPTkZJR1VSQVRJT05fRkxBRwkJMHgyMDAwMDAwMAorI2RlZmluZSBJMk9fRVZUX0lORF9MT0NLX1JFTEVBU0UJCTB4MTAwMDAwMDAKKyNkZWZpbmUgSTJPX0VWVF9JTkRfQ0FQQUJJTElUWV9DSEFOR0UJCTB4MDgwMDAwMDAKKyNkZWZpbmUgSTJPX0VWVF9JTkRfREVWSUNFX1JFU0VUCQkweDA0MDAwMDAwCisjZGVmaW5lIEkyT19FVlRfSU5EX0VWVF9NQVNLX01PRElGSUVECQkweDAyMDAwMDAwCisjZGVmaW5lIEkyT19FVlRfSU5EX0ZJRUxEX01PRElGSUVECQkweDAxMDAwMDAwCisjZGVmaW5lIEkyT19FVlRfSU5EX1ZFTkRPUl9FVlQJCQkweDAwODAwMDAwCisjZGVmaW5lIEkyT19FVlRfSU5EX0RFVklDRV9TVEFURQkJMHgwMDQwMDAwMAorCisvKiBFeGVjdXRpdmUgZXZlbnQgaW5kaWNpdG9ycyAqLworI2RlZmluZSBJMk9fRVZUX0lORF9FWEVDX1JFU09VUkNFX0xJTUlUUwkweDAwMDAwMDAxCisjZGVmaW5lIEkyT19FVlRfSU5EX0VYRUNfQ09OTkVDVElPTl9GQUlMCTB4MDAwMDAwMDIKKyNkZWZpbmUgSTJPX0VWVF9JTkRfRVhFQ19BREFQVEVSX0ZBVUxUCQkweDAwMDAwMDA0CisjZGVmaW5lIEkyT19FVlRfSU5EX0VYRUNfUE9XRVJfRkFJTAkJMHgwMDAwMDAwOAorI2RlZmluZSBJMk9fRVZUX0lORF9FWEVDX1JFU0VUX1BFTkRJTkcJCTB4MDAwMDAwMTAKKyNkZWZpbmUgSTJPX0VWVF9JTkRfRVhFQ19SRVNFVF9JTU1JTkVOVCAJMHgwMDAwMDAyMAorI2RlZmluZSBJMk9fRVZUX0lORF9FWEVDX0hXX0ZBSUwJCTB4MDAwMDAwNDAKKyNkZWZpbmUgSTJPX0VWVF9JTkRfRVhFQ19YQ1RfQ0hBTkdFCQkweDAwMDAwMDgwCisjZGVmaW5lIEkyT19FVlRfSU5EX0VYRUNfTkVXX0xDVF9FTlRSWQkJMHgwMDAwMDEwMAorI2RlZmluZSBJMk9fRVZUX0lORF9FWEVDX01PRElGSUVEX0xDVAkJMHgwMDAwMDIwMAorI2RlZmluZSBJMk9fRVZUX0lORF9FWEVDX0RETV9BVkFJTEFCSUxJVFkJMHgwMDAwMDQwMAorCisvKiBSYW5kb20gQmxvY2sgU3RvcmFnZSBFdmVudCBJbmRpY2F0b3JzICovCisjZGVmaW5lIEkyT19FVlRfSU5EX0JTQV9WT0xVTUVfTE9BRAkJMHgwMDAwMDAwMQorI2RlZmluZSBJMk9fRVZUX0lORF9CU0FfVk9MVU1FX1VOTE9BRAkJMHgwMDAwMDAwMgorI2RlZmluZSBJMk9fRVZUX0lORF9CU0FfVk9MVU1FX1VOTE9BRF9SRVEJMHgwMDAwMDAwNAorI2RlZmluZSBJMk9fRVZUX0lORF9CU0FfQ0FQQUNJVFlfQ0hBTkdFIAkweDAwMDAwMDA4CisjZGVmaW5lIEkyT19FVlRfSU5EX0JTQV9TQ1NJX1NNQVJUCQkweDAwMDAwMDEwCisKKy8qIEV2ZW50IGRhdGEgZm9yIGdlbmVyaWMgZXZlbnRzICovCisjZGVmaW5lIEkyT19FVlRfU1RBVEVfQ0hBTkdFX05PUk1BTAkJMHgwMAorI2RlZmluZSBJMk9fRVZUX1NUQVRFX0NIQU5HRV9TVVNQRU5ERUQJCTB4MDEKKyNkZWZpbmUgSTJPX0VWVF9TVEFURV9DSEFOR0VfUkVTVEFSVAkJMHgwMgorI2RlZmluZSBJMk9fRVZUX1NUQVRFX0NIQU5HRV9OQV9SRUNPVkVSIAkweDAzCisjZGVmaW5lIEkyT19FVlRfU1RBVEVfQ0hBTkdFX05BX05PX1JFQ09WRVIJMHgwNAorI2RlZmluZSBJMk9fRVZUX1NUQVRFX0NIQU5HRV9RVUlFU0NFX1JFUVVFU1QJMHgwNQorI2RlZmluZSBJMk9fRVZUX1NUQVRFX0NIQU5HRV9GQUlMRUQJCTB4MTAKKyNkZWZpbmUgSTJPX0VWVF9TVEFURV9DSEFOR0VfRkFVTFRFRAkJMHgxMQorCisjZGVmaW5lIEkyT19FVlRfR0VOX1dBUk5JTkdfTk9STUFMCQkweDAwCisjZGVmaW5lIEkyT19FVlRfR0VOX1dBUk5JTkdfRVJST1JfVEhSRVNIT0xECTB4MDEKKyNkZWZpbmUgSTJPX0VWVF9HRU5fV0FSTklOR19NRURJQV9GQVVMVCAJMHgwMgorCisjZGVmaW5lIEkyT19FVlRfQ0FQQUJJTElUWV9PVEhFUgkJMHgwMQorI2RlZmluZSBJMk9fRVZUX0NBUEFCSUxJVFlfQ0hBTkdFRAkJMHgwMgorCisjZGVmaW5lIEkyT19FVlRfU0VOU09SX1NUQVRFX0NIQU5HRUQJCTB4MDEKKworLyoKKyAqCUkyTyBjbGFzc2VzIC8gc3ViY2xhc3NlcworICovCisKKy8qICBDbGFzcyBJRCBhbmQgQ29kZSBBc3NpZ25tZW50cworICogIChMQ1QuQ2xhc3NJRC5WZXJzaW9uIGZpZWxkKQorICovCisjZGVmaW5lIEkyT19DTEFTU19WRVJTSU9OXzEwCQkJMHgwMAorI2RlZmluZSBJMk9fQ0xBU1NfVkVSU0lPTl8xMQkJCTB4MDEKKworLyogIENsYXNzIGNvZGUgbmFtZXMKKyAqICAoZnJvbSB2MS41IFRhYmxlIDYtMSBDbGFzcyBDb2RlIEFzc2lnbm1lbnRzLikKKyAqLworCisjZGVmaW5lIEkyT19DTEFTU19FWEVDVVRJVkUJCQkweDAwMAorI2RlZmluZSBJMk9fQ0xBU1NfRERNCQkJCTB4MDAxCisjZGVmaW5lIEkyT19DTEFTU19SQU5ET01fQkxPQ0tfU1RPUkFHRQkJMHgwMTAKKyNkZWZpbmUgSTJPX0NMQVNTX1NFUVVFTlRJQUxfU1RPUkFHRQkJMHgwMTEKKyNkZWZpbmUgSTJPX0NMQVNTX0xBTgkJCQkweDAyMAorI2RlZmluZSBJMk9fQ0xBU1NfV0FOCQkJCTB4MDMwCisjZGVmaW5lIEkyT19DTEFTU19GSUJSRV9DSEFOTkVMX1BPUlQJCTB4MDQwCisjZGVmaW5lIEkyT19DTEFTU19GSUJSRV9DSEFOTkVMX1BFUklQSEVSQUwJMHgwNDEKKyNkZWZpbmUgSTJPX0NMQVNTX1NDU0lfUEVSSVBIRVJBTAkJMHgwNTEKKyNkZWZpbmUgSTJPX0NMQVNTX0FURV9QT1JUCQkJMHgwNjAKKyNkZWZpbmUgSTJPX0NMQVNTX0FURV9QRVJJUEhFUkFMCQkweDA2MQorI2RlZmluZSBJMk9fQ0xBU1NfRkxPUFBZX0NPTlRST0xMRVIJCTB4MDcwCisjZGVmaW5lIEkyT19DTEFTU19GTE9QUFlfREVWSUNFIAkJMHgwNzEKKyNkZWZpbmUgSTJPX0NMQVNTX0JVU19BREFQVEVSCQkJMHgwODAKKyNkZWZpbmUgSTJPX0NMQVNTX1BFRVJfVFJBTlNQT1JUX0FHRU5UCQkweDA5MAorI2RlZmluZSBJMk9fQ0xBU1NfUEVFUl9UUkFOU1BPUlQJCTB4MDkxCisjZGVmaW5lCUkyT19DTEFTU19FTkQJCQkJMHhmZmYKKworLyoKKyAqICBSZXN0IG9mIDB4MDkyIC0gMHgwOWYgcmVzZXJ2ZWQgZm9yIHBlZXItdG8tcGVlciBjbGFzc2VzCisgKi8KKworI2RlZmluZSBJMk9fQ0xBU1NfTUFUQ0hfQU5ZQ0xBU1MJCTB4ZmZmZmZmZmYKKworLyoKKyAqICBTdWJjbGFzc2VzCisgKi8KKworI2RlZmluZSBJMk9fU1VCQ0xBU1NfaTk2MAkJCTB4MDAxCisjZGVmaW5lIEkyT19TVUJDTEFTU19IRE0JCQkweDAyMAorI2RlZmluZSBJMk9fU1VCQ0xBU1NfSVNNCQkJMHgwMjEKKworLyogT3BlcmF0aW9uIGZ1bmN0aW9ucyAqLworCisjZGVmaW5lIEkyT19QQVJBTVNfRklFTERfR0VUCQkJMHgwMDAxCisjZGVmaW5lIEkyT19QQVJBTVNfTElTVF9HRVQJCQkweDAwMDIKKyNkZWZpbmUgSTJPX1BBUkFNU19NT1JFX0dFVAkJCTB4MDAwMworI2RlZmluZSBJMk9fUEFSQU1TX1NJWkVfR0VUCQkJMHgwMDA0CisjZGVmaW5lIEkyT19QQVJBTVNfVEFCTEVfR0VUCQkJMHgwMDA1CisjZGVmaW5lIEkyT19QQVJBTVNfRklFTERfU0VUCQkJMHgwMDA2CisjZGVmaW5lIEkyT19QQVJBTVNfTElTVF9TRVQJCQkweDAwMDcKKyNkZWZpbmUgSTJPX1BBUkFNU19ST1dfQURECQkJMHgwMDA4CisjZGVmaW5lIEkyT19QQVJBTVNfUk9XX0RFTEVURQkJCTB4MDAwOQorI2RlZmluZSBJMk9fUEFSQU1TX1RBQkxFX0NMRUFSCQkJMHgwMDBBCisKKy8qCisgKiBJMk8gc2VyaWFsIG51bWJlciBjb252ZW50aW9ucyAvIGZvcm1hdHMKKyAqIChjaXJjYSB2MS41KQorICovCisKKyNkZWZpbmUgSTJPX1NORk9STUFUX1VOS05PV04JCQkwCisjZGVmaW5lIEkyT19TTkZPUk1BVF9CSU5BUlkJCQkxCisjZGVmaW5lIEkyT19TTkZPUk1BVF9BU0NJSQkJCTIKKyNkZWZpbmUgSTJPX1NORk9STUFUX1VOSUNPREUJCQkzCisjZGVmaW5lIEkyT19TTkZPUk1BVF9MQU40OF9NQUMJCQk0CisjZGVmaW5lIEkyT19TTkZPUk1BVF9XQU4JCQk1CisKKy8qCisgKiBQbHVzIG5ldyBpbiB2Mi4wIChZZWxsb3dzdG9uZSBwZGYgZG9jKQorICovCisKKyNkZWZpbmUgSTJPX1NORk9STUFUX0xBTjY0X01BQwkJCTYKKyNkZWZpbmUgSTJPX1NORk9STUFUX0RETQkJCTcKKyNkZWZpbmUgSTJPX1NORk9STUFUX0lFRUVfUkVHNjQgCQk4CisjZGVmaW5lIEkyT19TTkZPUk1BVF9JRUVFX1JFRzEyOAkJOQorI2RlZmluZSBJMk9fU05GT1JNQVRfVU5LTk9XTjIJCQkweGZmCisKKy8qCisgKglJMk8gR2V0IFN0YXR1cyBTdGF0ZSB2YWx1ZXMKKyAqLworCisjZGVmaW5lIEFEQVBURVJfU1RBVEVfSU5JVElBTElaSU5HCQkweDAxCisjZGVmaW5lIEFEQVBURVJfU1RBVEVfUkVTRVQJCQkweDAyCisjZGVmaW5lIEFEQVBURVJfU1RBVEVfSE9MRAkJCTB4MDQKKyNkZWZpbmUgQURBUFRFUl9TVEFURV9SRUFEWQkJCTB4MDUKKyNkZWZpbmUgQURBUFRFUl9TVEFURV9PUEVSQVRJT05BTAkJMHgwOAorI2RlZmluZSBBREFQVEVSX1NUQVRFX0ZBSUxFRAkJCTB4MTAKKyNkZWZpbmUgQURBUFRFUl9TVEFURV9GQVVMVEVECQkJMHgxMQorCisvKgorICoJU29mdHdhcmUgbW9kdWxlIHR5cGVzCisgKi8KKyNkZWZpbmUgSTJPX1NPRlRXQVJFX01PRFVMRV9JUlRPUwkJMHgxMQorI2RlZmluZSBJMk9fU09GVFdBUkVfTU9EVUxFX0lPUF9QUklWQVRFCQkweDIyCisjZGVmaW5lIEkyT19TT0ZUV0FSRV9NT0RVTEVfSU9QX0NPTkZJRwkJMHgyMworCisvKgorICoJVmVuZG9ycworICovCisjZGVmaW5lIEkyT19WRU5ET1JfRFBUCQkJCTB4MDAxYgorCisvKgorICogRFBUIC8gQWRhcHRlYyBzcGVjaWZpYyB2YWx1ZXMgZm9yIGkyb19zZ19pb19oZHIgZmxhZ3MuCisgKi8KKyNkZWZpbmUgSTJPX0RQVF9TR19GTEFHX0lOVEVSUFJFVAkJMHgwMDAxMDAwMAorI2RlZmluZSBJMk9fRFBUX1NHX0ZMQUdfUEhZU0lDQUwJCTB4MDAwMjAwMDAKKworI2RlZmluZSBJMk9fRFBUX0ZMQVNIX0ZSQUdfU0laRQkJCTB4MTAwMDAKKyNkZWZpbmUgSTJPX0RQVF9GTEFTSF9SRUFECQkJMHgwMTAxCisjZGVmaW5lIEkyT19EUFRfRkxBU0hfV1JJVEUJCQkweDAxMDIKKworI2VuZGlmCQkJCS8qIF9JMk9fREVWX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaThrLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2k4ay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNDViYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2k4ay5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBpOGsuaCAtLSBMaW51eCBkcml2ZXIgZm9yIGFjY2Vzc2luZyB0aGUgU01NIEJJT1Mgb24gRGVsbCBsYXB0b3BzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxICBNYXNzaW1vIERhbCBab3R0byA8ZHpAZGViaWFuLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfTElOVVhfSThLX0gKKyNkZWZpbmUgX0xJTlVYX0k4S19ICisKKyNkZWZpbmUgSThLX1BST0MJCSIvcHJvYy9pOGsiCisjZGVmaW5lIEk4S19QUk9DX0ZNVAkJIjEuMCIKKworI2RlZmluZSBJOEtfQklPU19WRVJTSU9OCV9JT1IgKCdpJywgMHg4MCwgaW50KQkvKiBicm9rZW46IG1lYW50IDQgYnl0ZXMgKi8KKyNkZWZpbmUgSThLX01BQ0hJTkVfSUQJCV9JT1IgKCdpJywgMHg4MSwgaW50KQkvKiBicm9rZW46IG1lYW50IDE2IGJ5dGVzICovCisjZGVmaW5lIEk4S19QT1dFUl9TVEFUVVMJX0lPUiAoJ2knLCAweDgyLCBzaXplX3QpCisjZGVmaW5lIEk4S19GTl9TVEFUVVMJCV9JT1IgKCdpJywgMHg4Mywgc2l6ZV90KQorI2RlZmluZSBJOEtfR0VUX1RFTVAJCV9JT1IgKCdpJywgMHg4NCwgc2l6ZV90KQorI2RlZmluZSBJOEtfR0VUX1NQRUVECQlfSU9XUignaScsIDB4ODUsIHNpemVfdCkKKyNkZWZpbmUgSThLX0dFVF9GQU4JCV9JT1dSKCdpJywgMHg4Niwgc2l6ZV90KQorI2RlZmluZSBJOEtfU0VUX0ZBTgkJX0lPV1IoJ2knLCAweDg3LCBzaXplX3QpCisKKyNkZWZpbmUgSThLX0ZBTl9MRUZUCQkxCisjZGVmaW5lIEk4S19GQU5fUklHSFQJCTAKKyNkZWZpbmUgSThLX0ZBTl9PRkYJCTAKKyNkZWZpbmUgSThLX0ZBTl9MT1cJCTEKKyNkZWZpbmUgSThLX0ZBTl9ISUdICQkyCisjZGVmaW5lIEk4S19GQU5fTUFYCQlJOEtfRkFOX0hJR0gKKworI2RlZmluZSBJOEtfVk9MX1VQCQkxCisjZGVmaW5lIEk4S19WT0xfRE9XTgkJMgorI2RlZmluZSBJOEtfVk9MX01VVEUJCTQKKworI2RlZmluZSBJOEtfQUMJCQkxCisjZGVmaW5lIEk4S19CQVRURVJZCQkwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pY21wLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ljbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWVkYWI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pY21wLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlEZWZpbml0aW9ucyBmb3IgdGhlIElDTVAgcHJvdG9jb2wuCisgKgorICogVmVyc2lvbjoJQCgjKWljbXAuaAkxLjAuMwkwNC8yOC85MworICoKKyAqIEF1dGhvcjoJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0xJTlVYX0lDTVBfSAorI2RlZmluZQlfTElOVVhfSUNNUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIElDTVBfRUNIT1JFUExZCQkwCS8qIEVjaG8gUmVwbHkJCQkqLworI2RlZmluZSBJQ01QX0RFU1RfVU5SRUFDSAkzCS8qIERlc3RpbmF0aW9uIFVucmVhY2hhYmxlCSovCisjZGVmaW5lIElDTVBfU09VUkNFX1FVRU5DSAk0CS8qIFNvdXJjZSBRdWVuY2gJCSovCisjZGVmaW5lIElDTVBfUkVESVJFQ1QJCTUJLyogUmVkaXJlY3QgKGNoYW5nZSByb3V0ZSkJKi8KKyNkZWZpbmUgSUNNUF9FQ0hPCQk4CS8qIEVjaG8gUmVxdWVzdAkJCSovCisjZGVmaW5lIElDTVBfVElNRV9FWENFRURFRAkxMQkvKiBUaW1lIEV4Y2VlZGVkCQkqLworI2RlZmluZSBJQ01QX1BBUkFNRVRFUlBST0IJMTIJLyogUGFyYW1ldGVyIFByb2JsZW0JCSovCisjZGVmaW5lIElDTVBfVElNRVNUQU1QCQkxMwkvKiBUaW1lc3RhbXAgUmVxdWVzdAkJKi8KKyNkZWZpbmUgSUNNUF9USU1FU1RBTVBSRVBMWQkxNAkvKiBUaW1lc3RhbXAgUmVwbHkJCSovCisjZGVmaW5lIElDTVBfSU5GT19SRVFVRVNUCTE1CS8qIEluZm9ybWF0aW9uIFJlcXVlc3QJCSovCisjZGVmaW5lIElDTVBfSU5GT19SRVBMWQkJMTYJLyogSW5mb3JtYXRpb24gUmVwbHkJCSovCisjZGVmaW5lIElDTVBfQUREUkVTUwkJMTcJLyogQWRkcmVzcyBNYXNrIFJlcXVlc3QJCSovCisjZGVmaW5lIElDTVBfQUREUkVTU1JFUExZCTE4CS8qIEFkZHJlc3MgTWFzayBSZXBseQkJKi8KKyNkZWZpbmUgTlJfSUNNUF9UWVBFUwkJMTgKKworCisvKiBDb2RlcyBmb3IgVU5SRUFDSC4gKi8KKyNkZWZpbmUgSUNNUF9ORVRfVU5SRUFDSAkwCS8qIE5ldHdvcmsgVW5yZWFjaGFibGUJCSovCisjZGVmaW5lIElDTVBfSE9TVF9VTlJFQUNICTEJLyogSG9zdCBVbnJlYWNoYWJsZQkJKi8KKyNkZWZpbmUgSUNNUF9QUk9UX1VOUkVBQ0gJMgkvKiBQcm90b2NvbCBVbnJlYWNoYWJsZQkJKi8KKyNkZWZpbmUgSUNNUF9QT1JUX1VOUkVBQ0gJMwkvKiBQb3J0IFVucmVhY2hhYmxlCQkqLworI2RlZmluZSBJQ01QX0ZSQUdfTkVFREVECTQJLyogRnJhZ21lbnRhdGlvbiBOZWVkZWQvREYgc2V0CSovCisjZGVmaW5lIElDTVBfU1JfRkFJTEVECQk1CS8qIFNvdXJjZSBSb3V0ZSBmYWlsZWQJCSovCisjZGVmaW5lIElDTVBfTkVUX1VOS05PV04JNgorI2RlZmluZSBJQ01QX0hPU1RfVU5LTk9XTgk3CisjZGVmaW5lIElDTVBfSE9TVF9JU09MQVRFRAk4CisjZGVmaW5lIElDTVBfTkVUX0FOTwkJOQorI2RlZmluZSBJQ01QX0hPU1RfQU5PCQkxMAorI2RlZmluZSBJQ01QX05FVF9VTlJfVE9TCTExCisjZGVmaW5lIElDTVBfSE9TVF9VTlJfVE9TCTEyCisjZGVmaW5lIElDTVBfUEtUX0ZJTFRFUkVECTEzCS8qIFBhY2tldCBmaWx0ZXJlZCAqLworI2RlZmluZSBJQ01QX1BSRUNfVklPTEFUSU9OCTE0CS8qIFByZWNlZGVuY2UgdmlvbGF0aW9uICovCisjZGVmaW5lIElDTVBfUFJFQ19DVVRPRkYJMTUJLyogUHJlY2VkZW5jZSBjdXQgb2ZmICovCisjZGVmaW5lIE5SX0lDTVBfVU5SRUFDSAkJMTUJLyogaW5zdGVhZCBvZiBoYXJkY29kaW5nIGltbWVkaWF0ZSB2YWx1ZSAqLworCisvKiBDb2RlcyBmb3IgUkVESVJFQ1QuICovCisjZGVmaW5lIElDTVBfUkVESVJfTkVUCQkwCS8qIFJlZGlyZWN0IE5ldAkJCSovCisjZGVmaW5lIElDTVBfUkVESVJfSE9TVAkJMQkvKiBSZWRpcmVjdCBIb3N0CQkqLworI2RlZmluZSBJQ01QX1JFRElSX05FVFRPUwkyCS8qIFJlZGlyZWN0IE5ldCBmb3IgVE9TCQkqLworI2RlZmluZSBJQ01QX1JFRElSX0hPU1RUT1MJMwkvKiBSZWRpcmVjdCBIb3N0IGZvciBUT1MJKi8KKworLyogQ29kZXMgZm9yIFRJTUVfRVhDRUVERUQuICovCisjZGVmaW5lIElDTVBfRVhDX1RUTAkJMAkvKiBUVEwgY291bnQgZXhjZWVkZWQJCSovCisjZGVmaW5lIElDTVBfRVhDX0ZSQUdUSU1FCTEJLyogRnJhZ21lbnQgUmVhc3MgdGltZSBleGNlZWRlZAkqLworCisKK3N0cnVjdCBpY21waGRyIHsKKyAgX191OAkJdHlwZTsKKyAgX191OAkJY29kZTsKKyAgX19zdW0xNgljaGVja3N1bTsKKyAgdW5pb24geworCXN0cnVjdCB7CisJCV9fYmUxNglpZDsKKwkJX19iZTE2CXNlcXVlbmNlOworCX0gZWNobzsKKwlfX2JlMzIJZ2F0ZXdheTsKKwlzdHJ1Y3QgeworCQlfX2JlMTYJX191bnVzZWQ7CisJCV9fYmUxNgltdHU7CisJfSBmcmFnOworICB9IHVuOworfTsKKworCisvKgorICoJY29uc3RhbnRzIGZvciAoc2V0fGdldClzb2Nrb3B0CisgKi8KKworI2RlZmluZSBJQ01QX0ZJTFRFUgkJCTEKKworc3RydWN0IGljbXBfZmlsdGVyIHsKKwlfX3UzMgkJZGF0YTsKK307CisKKworI2VuZGlmCS8qIF9MSU5VWF9JQ01QX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWNtcHY2LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ljbXB2Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOTNkZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ljbXB2Ni5oCkBAIC0wLDAgKzEsMTY0IEBACisjaWZuZGVmIF9MSU5VWF9JQ01QVjZfSAorI2RlZmluZSBfTElOVVhfSUNNUFY2X0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCitzdHJ1Y3QgaWNtcDZoZHIgeworCisJX191OAkJaWNtcDZfdHlwZTsKKwlfX3U4CQlpY21wNl9jb2RlOworCV9fc3VtMTYJCWljbXA2X2Nrc3VtOworCisKKwl1bmlvbiB7CisJCV9fYmUzMgkJCXVuX2RhdGEzMlsxXTsKKwkJX19iZTE2CQkJdW5fZGF0YTE2WzJdOworCQlfX3U4CQkJdW5fZGF0YThbNF07CisKKwkJc3RydWN0IGljbXB2Nl9lY2hvIHsKKwkJCV9fYmUxNgkJaWRlbnRpZmllcjsKKwkJCV9fYmUxNgkJc2VxdWVuY2U7CisJCX0gdV9lY2hvOworCisgICAgICAgICAgICAgICAgc3RydWN0IGljbXB2Nl9uZF9hZHZ0IHsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fdTMyCQlyZXNlcnZlZDo1LAorICAgICAgICAgICAgICAgICAgICAgICAgCQlvdmVycmlkZToxLAorICAgICAgICAgICAgICAgICAgICAgICAgCQlzb2xpY2l0ZWQ6MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIAkJcm91dGVyOjEsCisJCQkJCXJlc2VydmVkMjoyNDsKKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorICAgICAgICAgICAgICAgICAgICAgICAgX191MzIJCXJvdXRlcjoxLAorCQkJCQlzb2xpY2l0ZWQ6MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIAkJb3ZlcnJpZGU6MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIAkJcmVzZXJ2ZWQ6Mjk7CisjZWxzZQorI2Vycm9yCSJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCQkJCQkJCisgICAgICAgICAgICAgICAgfSB1X25kX2FkdnQ7CisKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgaWNtcHY2X25kX3JhIHsKKwkJCV9fdTgJCWhvcF9saW1pdDsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwkJCV9fdTgJCXJlc2VydmVkOjMsCisJCQkJCXJvdXRlcl9wcmVmOjIsCisJCQkJCWhvbWVfYWdlbnQ6MSwKKwkJCQkJb3RoZXI6MSwKKwkJCQkJbWFuYWdlZDoxOworCisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwkJCV9fdTgJCW1hbmFnZWQ6MSwKKwkJCQkJb3RoZXI6MSwKKwkJCQkJaG9tZV9hZ2VudDoxLAorCQkJCQlyb3V0ZXJfcHJlZjoyLAorCQkJCQlyZXNlcnZlZDozOworI2Vsc2UKKyNlcnJvcgkiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorCQkJX19iZTE2CQlydF9saWZldGltZTsKKyAgICAgICAgICAgICAgICB9IHVfbmRfcmE7CisKKwl9IGljbXA2X2RhdGF1bjsKKworI2RlZmluZSBpY21wNl9pZGVudGlmaWVyCWljbXA2X2RhdGF1bi51X2VjaG8uaWRlbnRpZmllcgorI2RlZmluZSBpY21wNl9zZXF1ZW5jZQkJaWNtcDZfZGF0YXVuLnVfZWNoby5zZXF1ZW5jZQorI2RlZmluZSBpY21wNl9wb2ludGVyCQlpY21wNl9kYXRhdW4udW5fZGF0YTMyWzBdCisjZGVmaW5lIGljbXA2X210dQkJaWNtcDZfZGF0YXVuLnVuX2RhdGEzMlswXQorI2RlZmluZSBpY21wNl91bnVzZWQJCWljbXA2X2RhdGF1bi51bl9kYXRhMzJbMF0KKyNkZWZpbmUgaWNtcDZfbWF4ZGVsYXkJCWljbXA2X2RhdGF1bi51bl9kYXRhMTZbMF0KKyNkZWZpbmUgaWNtcDZfcm91dGVyCQlpY21wNl9kYXRhdW4udV9uZF9hZHZ0LnJvdXRlcgorI2RlZmluZSBpY21wNl9zb2xpY2l0ZWQJCWljbXA2X2RhdGF1bi51X25kX2FkdnQuc29saWNpdGVkCisjZGVmaW5lIGljbXA2X292ZXJyaWRlCQlpY21wNl9kYXRhdW4udV9uZF9hZHZ0Lm92ZXJyaWRlCisjZGVmaW5lIGljbXA2X25kaXNjcmVzZXJ2ZWQJaWNtcDZfZGF0YXVuLnVfbmRfYWR2dC5yZXNlcnZlZAorI2RlZmluZSBpY21wNl9ob3BfbGltaXQJCWljbXA2X2RhdGF1bi51X25kX3JhLmhvcF9saW1pdAorI2RlZmluZSBpY21wNl9hZGRyY29uZl9tYW5hZ2VkCWljbXA2X2RhdGF1bi51X25kX3JhLm1hbmFnZWQKKyNkZWZpbmUgaWNtcDZfYWRkcmNvbmZfb3RoZXIJaWNtcDZfZGF0YXVuLnVfbmRfcmEub3RoZXIKKyNkZWZpbmUgaWNtcDZfcnRfbGlmZXRpbWUJaWNtcDZfZGF0YXVuLnVfbmRfcmEucnRfbGlmZXRpbWUKKyNkZWZpbmUgaWNtcDZfcm91dGVyX3ByZWYJaWNtcDZfZGF0YXVuLnVfbmRfcmEucm91dGVyX3ByZWYKK307CisKKworI2RlZmluZSBJQ01QVjZfUk9VVEVSX1BSRUZfTE9XCQkweDMKKyNkZWZpbmUgSUNNUFY2X1JPVVRFUl9QUkVGX01FRElVTQkweDAKKyNkZWZpbmUgSUNNUFY2X1JPVVRFUl9QUkVGX0hJR0gJCTB4MQorI2RlZmluZSBJQ01QVjZfUk9VVEVSX1BSRUZfSU5WQUxJRAkweDIKKworI2RlZmluZSBJQ01QVjZfREVTVF9VTlJFQUNICQkxCisjZGVmaW5lIElDTVBWNl9QS1RfVE9PQklHCQkyCisjZGVmaW5lIElDTVBWNl9USU1FX0VYQ0VFRAkJMworI2RlZmluZSBJQ01QVjZfUEFSQU1QUk9CCQk0CisKKyNkZWZpbmUgSUNNUFY2X0lORk9NU0dfTUFTSwkJMHg4MAorCisjZGVmaW5lIElDTVBWNl9FQ0hPX1JFUVVFU1QJCTEyOAorI2RlZmluZSBJQ01QVjZfRUNIT19SRVBMWQkJMTI5CisjZGVmaW5lIElDTVBWNl9NR01fUVVFUlkJCTEzMAorI2RlZmluZSBJQ01QVjZfTUdNX1JFUE9SVCAgICAgICAJMTMxCisjZGVmaW5lIElDTVBWNl9NR01fUkVEVUNUSU9OICAgIAkxMzIKKworI2RlZmluZSBJQ01QVjZfTklfUVVFUlkJCQkxMzkKKyNkZWZpbmUgSUNNUFY2X05JX1JFUExZCQkJMTQwCisKKyNkZWZpbmUgSUNNUFY2X01MRDJfUkVQT1JUCQkxNDMKKworI2RlZmluZSBJQ01QVjZfREhBQURfUkVRVUVTVAkJMTQ0CisjZGVmaW5lIElDTVBWNl9ESEFBRF9SRVBMWQkJMTQ1CisjZGVmaW5lIElDTVBWNl9NT0JJTEVfUFJFRklYX1NPTAkxNDYKKyNkZWZpbmUgSUNNUFY2X01PQklMRV9QUkVGSVhfQURWCTE0NworCisvKgorICoJQ29kZXMgZm9yIERlc3RpbmF0aW9uIFVucmVhY2hhYmxlCisgKi8KKyNkZWZpbmUgSUNNUFY2X05PUk9VVEUJCQkwCisjZGVmaW5lIElDTVBWNl9BRE1fUFJPSElCSVRFRAkJMQorI2RlZmluZSBJQ01QVjZfTk9UX05FSUdIQk9VUgkJMgorI2RlZmluZSBJQ01QVjZfQUREUl9VTlJFQUNICQkzCisjZGVmaW5lIElDTVBWNl9QT1JUX1VOUkVBQ0gJCTQKKworLyoKKyAqCUNvZGVzIGZvciBUaW1lIEV4Y2VlZGVkCisgKi8KKyNkZWZpbmUgSUNNUFY2X0VYQ19IT1BMSU1JVAkJMAorI2RlZmluZSBJQ01QVjZfRVhDX0ZSQUdUSU1FCQkxCisKKy8qCisgKglDb2RlcyBmb3IgUGFyYW1ldGVyIFByb2JsZW0KKyAqLworI2RlZmluZSBJQ01QVjZfSERSX0ZJRUxECQkwCisjZGVmaW5lIElDTVBWNl9VTktfTkVYVEhEUgkJMQorI2RlZmluZSBJQ01QVjZfVU5LX09QVElPTgkJMgorCisvKgorICoJY29uc3RhbnRzIGZvciAoc2V0fGdldClzb2Nrb3B0CisgKi8KKworI2RlZmluZSBJQ01QVjZfRklMVEVSCQkJMQorCisvKgorICoJSUNNUFY2IGZpbHRlcgorICovCisKKyNkZWZpbmUgSUNNUFY2X0ZJTFRFUl9CTE9DSwkJMQorI2RlZmluZSBJQ01QVjZfRklMVEVSX1BBU1MJCTIKKyNkZWZpbmUgSUNNUFY2X0ZJTFRFUl9CTE9DS09USEVSUwkzCisjZGVmaW5lIElDTVBWNl9GSUxURVJfUEFTU09OTFkJCTQKKworc3RydWN0IGljbXA2X2ZpbHRlciB7CisJX191MzIJCWRhdGFbOF07Cit9OworCisvKgorICoJRGVmaW5pdGlvbnMgZm9yIE1MRHYyCisgKi8KKyNkZWZpbmUgTUxEMl9NT0RFX0lTX0lOQ0xVREUJMQorI2RlZmluZSBNTEQyX01PREVfSVNfRVhDTFVERQkyCisjZGVmaW5lIE1MRDJfQ0hBTkdFX1RPX0lOQ0xVREUJMworI2RlZmluZSBNTEQyX0NIQU5HRV9UT19FWENMVURFCTQKKyNkZWZpbmUgTUxEMl9BTExPV19ORVdfU09VUkNFUwk1CisjZGVmaW5lIE1MRDJfQkxPQ0tfT0xEX1NPVVJDRVMJNgorCisjZGVmaW5lIE1MRDJfQUxMX01DUl9JTklUIHsgeyB7IDB4ZmYsMHgwMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB4MTYgfSB9IH0KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWMxZGRhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZi5oCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCUdsb2JhbCBkZWZpbml0aW9ucyBmb3IgdGhlIElORVQgaW50ZXJmYWNlIG1vZHVsZS4KKyAqCisgKiBWZXJzaW9uOglAKCMpaWYuaAkxLjAuMgkwNC8xOC85MworICoKKyAqIEF1dGhvcnM6CU9yaWdpbmFsIHRha2VuIGZyb20gQmVya2VsZXkgVU5JWCA0LjMsIChjKSBVQ0IgMTk4Mi0xOTg4CisgKgkJUm9zcyBCaXJvCisgKgkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0xJTlVYX0lGX0gKKyNkZWZpbmUgX0xJTlVYX0lGX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CQkvKiBmb3IgIl9fa2VybmVsX2NhZGRyX3QiIGV0IGFsCSovCisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CQkvKiBmb3IgInN0cnVjdCBzb2NrYWRkciIgZXQgYWwJKi8KKwkJLyogZm9yICJfX3VzZXIiIGV0IGFsICAgICAgICAgICAqLworCisjZGVmaW5lCUlGTkFNU0laCTE2CisjZGVmaW5lCUlGQUxJQVNaCTI1NgorI2luY2x1ZGUgPGxpbnV4L2hkbGMvaW9jdGwuaD4KKworLyogU3RhbmRhcmQgaW50ZXJmYWNlIGZsYWdzIChuZXRkZXZpY2UtPmZsYWdzKS4gKi8KKyNkZWZpbmUJSUZGX1VQCQkweDEJCS8qIGludGVyZmFjZSBpcyB1cAkJKi8KKyNkZWZpbmUJSUZGX0JST0FEQ0FTVAkweDIJCS8qIGJyb2FkY2FzdCBhZGRyZXNzIHZhbGlkCSovCisjZGVmaW5lCUlGRl9ERUJVRwkweDQJCS8qIHR1cm4gb24gZGVidWdnaW5nCQkqLworI2RlZmluZQlJRkZfTE9PUEJBQ0sJMHg4CQkvKiBpcyBhIGxvb3BiYWNrIG5ldAkJKi8KKyNkZWZpbmUJSUZGX1BPSU5UT1BPSU5UCTB4MTAJCS8qIGludGVyZmFjZSBpcyBoYXMgcC1wIGxpbmsJKi8KKyNkZWZpbmUJSUZGX05PVFJBSUxFUlMJMHgyMAkJLyogYXZvaWQgdXNlIG9mIHRyYWlsZXJzCSovCisjZGVmaW5lCUlGRl9SVU5OSU5HCTB4NDAJCS8qIGludGVyZmFjZSBSRkMyODYzIE9QRVJfVVAJKi8KKyNkZWZpbmUJSUZGX05PQVJQCTB4ODAJCS8qIG5vIEFSUCBwcm90b2NvbAkJKi8KKyNkZWZpbmUJSUZGX1BST01JU0MJMHgxMDAJCS8qIHJlY2VpdmUgYWxsIHBhY2tldHMJCSovCisjZGVmaW5lCUlGRl9BTExNVUxUSQkweDIwMAkJLyogcmVjZWl2ZSBhbGwgbXVsdGljYXN0IHBhY2tldHMqLworCisjZGVmaW5lIElGRl9NQVNURVIJMHg0MDAJCS8qIG1hc3RlciBvZiBhIGxvYWQgYmFsYW5jZXIgCSovCisjZGVmaW5lIElGRl9TTEFWRQkweDgwMAkJLyogc2xhdmUgb2YgYSBsb2FkIGJhbGFuY2VyCSovCisKKyNkZWZpbmUgSUZGX01VTFRJQ0FTVAkweDEwMDAJCS8qIFN1cHBvcnRzIG11bHRpY2FzdAkJKi8KKworI2RlZmluZSBJRkZfUE9SVFNFTAkweDIwMDAgICAgICAgICAgLyogY2FuIHNldCBtZWRpYSB0eXBlCQkqLworI2RlZmluZSBJRkZfQVVUT01FRElBCTB4NDAwMAkJLyogYXV0byBtZWRpYSBzZWxlY3QgYWN0aXZlCSovCisjZGVmaW5lIElGRl9EWU5BTUlDCTB4ODAwMAkJLyogZGlhbHVwIGRldmljZSB3aXRoIGNoYW5naW5nIGFkZHJlc3NlcyovCisKKyNkZWZpbmUgSUZGX0xPV0VSX1VQCTB4MTAwMDAJCS8qIGRyaXZlciBzaWduYWxzIEwxIHVwCQkqLworI2RlZmluZSBJRkZfRE9STUFOVAkweDIwMDAwCQkvKiBkcml2ZXIgc2lnbmFscyBkb3JtYW50CSovCisKKyNkZWZpbmUgSUZGX0VDSE8JMHg0MDAwMAkJLyogZWNobyBzZW50IHBhY2tldHMJCSovCisKKyNkZWZpbmUgSUZGX1ZPTEFUSUxFCShJRkZfTE9PUEJBQ0t8SUZGX1BPSU5UT1BPSU5UfElGRl9CUk9BRENBU1R8SUZGX0VDSE98XAorCQlJRkZfTUFTVEVSfElGRl9TTEFWRXxJRkZfUlVOTklOR3xJRkZfTE9XRVJfVVB8SUZGX0RPUk1BTlQpCisKKy8qIFByaXZhdGUgKGZyb20gdXNlcikgaW50ZXJmYWNlIGZsYWdzIChuZXRkZXZpY2UtPnByaXZfZmxhZ3MpLiAqLworI2RlZmluZSBJRkZfODAyXzFRX1ZMQU4gMHgxICAgICAgICAgICAgIC8qIDgwMi4xUSBWTEFOIGRldmljZS4gICAgICAgICAgKi8KKyNkZWZpbmUgSUZGX0VCUklER0UJMHgyCQkvKiBFdGhlcm5ldCBicmlkZ2luZyBkZXZpY2UuCSovCisjZGVmaW5lIElGRl9TTEFWRV9JTkFDVElWRQkweDQJLyogYm9uZGluZyBzbGF2ZSBub3QgdGhlIGN1cnIuIGFjdGl2ZSAqLworI2RlZmluZSBJRkZfTUFTVEVSXzgwMjNBRAkweDgJLyogYm9uZGluZyBtYXN0ZXIsIDgwMi4zYWQuIAkqLworI2RlZmluZSBJRkZfTUFTVEVSX0FMQgkweDEwCQkvKiBib25kaW5nIG1hc3RlciwgYmFsYW5jZS1hbGIuCSovCisjZGVmaW5lIElGRl9CT05ESU5HCTB4MjAJCS8qIGJvbmRpbmcgbWFzdGVyIG9yIHNsYXZlCSovCisjZGVmaW5lIElGRl9TTEFWRV9ORUVEQVJQIDB4NDAJCS8qIG5lZWQgQVJQcyBmb3IgdmFsaWRhdGlvbgkqLworI2RlZmluZSBJRkZfSVNBVEFQCTB4ODAJCS8qIElTQVRBUCBpbnRlcmZhY2UgKFJGQzQyMTQpCSovCisjZGVmaW5lIElGRl9NQVNURVJfQVJQTU9OIDB4MTAwCQkvKiBib25kaW5nIG1hc3RlciwgQVJQIG1vbiBpbiB1c2UgKi8KKyNkZWZpbmUgSUZGX1dBTl9IRExDCTB4MjAwCQkvKiBXQU4gSERMQyBkZXZpY2UJCSovCisjZGVmaW5lIElGRl9YTUlUX0RTVF9SRUxFQVNFIDB4NDAwCS8qIGRldl9oYXJkX3N0YXJ0X3htaXQoKSBpcyBhbGxvd2VkIHRvCisJCQkJCSAqIHJlbGVhc2Ugc2tiLT5kc3QKKwkJCQkJICovCisjZGVmaW5lIElGRl9ET05UX0JSSURHRSAweDgwMAkJLyogZGlzYWxsb3cgYnJpZGdpbmcgdGhpcyBldGhlciBkZXYgKi8KKyNkZWZpbmUgSUZGX0RJU0FCTEVfTkVUUE9MTAkweDEwMDAJLyogZGlzYWJsZSBuZXRwb2xsIGF0IHJ1bi10aW1lICovCisjZGVmaW5lIElGRl9NQUNWTEFOX1BPUlQJMHgyMDAwCS8qIGRldmljZSB1c2VkIGFzIG1hY3ZsYW4gcG9ydCAqLworI2RlZmluZSBJRkZfQlJJREdFX1BPUlQJMHg0MDAwCQkvKiBkZXZpY2UgdXNlZCBhcyBicmlkZ2UgcG9ydCAqLworI2RlZmluZSBJRkZfT1ZTX0RBVEFQQVRICTB4ODAwMAkvKiBkZXZpY2UgdXNlZCBhcyBPcGVuIHZTd2l0Y2gKKwkJCQkJICogZGF0YXBhdGggcG9ydCAqLworI2RlZmluZSBJRkZfVFhfU0tCX1NIQVJJTkcJMHgxMDAwMAkvKiBUaGUgaW50ZXJmYWNlIHN1cHBvcnRzIHNoYXJpbmcKKwkJCQkJICogc2ticyBvbiB0cmFuc21pdCAqLworI2RlZmluZSBJRkZfVU5JQ0FTVF9GTFQJMHgyMDAwMAkJLyogU3VwcG9ydHMgdW5pY2FzdCBmaWx0ZXJpbmcJKi8KKworI2RlZmluZSBJRl9HRVRfSUZBQ0UJMHgwMDAxCQkvKiBmb3IgcXVlcnlpbmcgb25seSAqLworI2RlZmluZSBJRl9HRVRfUFJPVE8JMHgwMDAyCisKKy8qIEZvciBkZWZpbml0aW9ucyBzZWUgaGRsYy5oICovCisjZGVmaW5lIElGX0lGQUNFX1YzNQkweDEwMDAJCS8qIFYuMzUgc2VyaWFsIGludGVyZmFjZQkqLworI2RlZmluZSBJRl9JRkFDRV9WMjQJMHgxMDAxCQkvKiBWLjI0IHNlcmlhbCBpbnRlcmZhY2UJKi8KKyNkZWZpbmUgSUZfSUZBQ0VfWDIxCTB4MTAwMgkJLyogWC4yMSBzZXJpYWwgaW50ZXJmYWNlCSovCisjZGVmaW5lIElGX0lGQUNFX1QxCTB4MTAwMwkJLyogVDEgdGVsY28gc2VyaWFsIGludGVyZmFjZQkqLworI2RlZmluZSBJRl9JRkFDRV9FMQkweDEwMDQJCS8qIEUxIHRlbGNvIHNlcmlhbCBpbnRlcmZhY2UJKi8KKyNkZWZpbmUgSUZfSUZBQ0VfU1lOQ19TRVJJQUwgMHgxMDA1CS8qIGNhbid0IGJlIHNldCBieSBzb2Z0d2FyZQkqLworI2RlZmluZSBJRl9JRkFDRV9YMjFEICAgMHgxMDA2ICAgICAgICAgIC8qIFguMjEgRHVhbCBDbG9ja2luZyAoRmFyU2l0ZSkgKi8KKworLyogRm9yIGRlZmluaXRpb25zIHNlZSBoZGxjLmggKi8KKyNkZWZpbmUgSUZfUFJPVE9fSERMQwkweDIwMDAJCS8qIHJhdyBIRExDIHByb3RvY29sCQkqLworI2RlZmluZSBJRl9QUk9UT19QUFAJMHgyMDAxCQkvKiBQUFAgcHJvdG9jb2wJCQkqLworI2RlZmluZSBJRl9QUk9UT19DSVNDTwkweDIwMDIJCS8qIENpc2NvIEhETEMgcHJvdG9jb2wJCSovCisjZGVmaW5lIElGX1BST1RPX0ZSCTB4MjAwMwkJLyogRnJhbWUgUmVsYXkgcHJvdG9jb2wJCSovCisjZGVmaW5lIElGX1BST1RPX0ZSX0FERF9QVkMgMHgyMDA0CS8qICAgIENyZWF0ZSBGUiBQVkMJCSovCisjZGVmaW5lIElGX1BST1RPX0ZSX0RFTF9QVkMgMHgyMDA1CS8qICAgIERlbGV0ZSBGUiBQVkMJCSovCisjZGVmaW5lIElGX1BST1RPX1gyNQkweDIwMDYJCS8qIFguMjUJCQkJKi8KKyNkZWZpbmUgSUZfUFJPVE9fSERMQ19FVEggMHgyMDA3CS8qIHJhdyBIRExDLCBFdGhlcm5ldCBlbXVsYXRpb24JKi8KKyNkZWZpbmUgSUZfUFJPVE9fRlJfQUREX0VUSF9QVkMgMHgyMDA4CS8qICBDcmVhdGUgRlIgRXRoZXJuZXQtYnJpZGdlZCBQVkMgKi8KKyNkZWZpbmUgSUZfUFJPVE9fRlJfREVMX0VUSF9QVkMgMHgyMDA5CS8qICBEZWxldGUgRlIgRXRoZXJuZXQtYnJpZGdlZCBQVkMgKi8KKyNkZWZpbmUgSUZfUFJPVE9fRlJfUFZDCTB4MjAwQQkJLyogZm9yIHJlYWRpbmcgUFZDIHN0YXR1cwkqLworI2RlZmluZSBJRl9QUk9UT19GUl9FVEhfUFZDIDB4MjAwQgorI2RlZmluZSBJRl9QUk9UT19SQVcgICAgMHgyMDBDICAgICAgICAgIC8qIFJBVyBTb2NrZXQgICAgICAgICAgICAgICAgICAgKi8KKworLyogUkZDIDI4NjMgb3BlcmF0aW9uYWwgc3RhdHVzICovCitlbnVtIHsKKwlJRl9PUEVSX1VOS05PV04sCisJSUZfT1BFUl9OT1RQUkVTRU5ULAorCUlGX09QRVJfRE9XTiwKKwlJRl9PUEVSX0xPV0VSTEFZRVJET1dOLAorCUlGX09QRVJfVEVTVElORywKKwlJRl9PUEVSX0RPUk1BTlQsCisJSUZfT1BFUl9VUCwKK307CisKKy8qIGxpbmsgbW9kZXMgKi8KK2VudW0geworCUlGX0xJTktfTU9ERV9ERUZBVUxULAorCUlGX0xJTktfTU9ERV9ET1JNQU5ULAkvKiBsaW1pdCB1cHdhcmQgdHJhbnNpdGlvbiB0byBkb3JtYW50ICovCit9OworCisvKgorICoJRGV2aWNlIG1hcHBpbmcgc3RydWN0dXJlLiBJJ2QganVzdCBnb25lIG9mZiBhbmQgZGVzaWduZWQgYSAKKyAqCWJlYXV0aWZ1bCBzY2hlbWUgdXNpbmcgb25seSBsb2FkYWJsZSBtb2R1bGVzIHdpdGggYXJndW1lbnRzCisgKglmb3IgZHJpdmVyIG9wdGlvbnMgYW5kIGFsb25nIGNvbWUgdGhlIFBDTUNJQSBwZW9wbGUgOCkKKyAqCisgKglBaCB3ZWxsLiBUaGUgZ2V0KCkgc2lkZSBvZiB0aGlzIGlzIGdvb2QgZm9yIFdEU0VUVVAsIGFuZCBpdCdsbAorICoJYmUgaGFuZHkgZm9yIGRlYnVnZ2luZyB0aGluZ3MuIFRoZSBzZXQgc2lkZSBpcyBmaW5lIGZvciBub3cgYW5kCisgKgliZWluZyB2ZXJ5IHNtYWxsIG1pZ2h0IGJlIHdvcnRoIGtlZXBpbmcgZm9yIGNsZWFuIGNvbmZpZ3VyYXRpb24uCisgKi8KKworc3RydWN0IGlmbWFwIHsKKwl1bnNpZ25lZCBsb25nIG1lbV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIG1lbV9lbmQ7CisJdW5zaWduZWQgc2hvcnQgYmFzZV9hZGRyOyAKKwl1bnNpZ25lZCBjaGFyIGlycTsKKwl1bnNpZ25lZCBjaGFyIGRtYTsKKwl1bnNpZ25lZCBjaGFyIHBvcnQ7CisJLyogMyBieXRlcyBzcGFyZSAqLworfTsKKworc3RydWN0IGlmX3NldHRpbmdzIHsKKwl1bnNpZ25lZCBpbnQgdHlwZTsJLyogVHlwZSBvZiBwaHlzaWNhbCBkZXZpY2Ugb3IgcHJvdG9jb2wgKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsJLyogU2l6ZSBvZiB0aGUgZGF0YSBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlciAqLworCXVuaW9uIHsKKwkJLyoge2F0bS9ldGgvZHNsfV9zZXR0aW5ncyBhbnlvbmUgPyAqLworCQlyYXdfaGRsY19wcm90bwkJKnJhd19oZGxjOworCQljaXNjb19wcm90bwkJKmNpc2NvOworCQlmcl9wcm90bwkJKmZyOworCQlmcl9wcm90b19wdmMJCSpmcl9wdmM7CisJCWZyX3Byb3RvX3B2Y19pbmZvCSpmcl9wdmNfaW5mbzsKKworCQkvKiBpbnRlcmZhY2Ugc2V0dGluZ3MgKi8KKwkJc3luY19zZXJpYWxfc2V0dGluZ3MJKnN5bmM7CisJCXRlMV9zZXR0aW5ncwkJKnRlMTsKKwl9IGlmc19pZnN1OworfTsKKworLyoKKyAqIEludGVyZmFjZSByZXF1ZXN0IHN0cnVjdHVyZSB1c2VkIGZvciBzb2NrZXQKKyAqIGlvY3RsJ3MuICBBbGwgaW50ZXJmYWNlIGlvY3RsJ3MgbXVzdCBoYXZlIHBhcmFtZXRlcgorICogZGVmaW5pdGlvbnMgd2hpY2ggYmVnaW4gd2l0aCBpZnJfbmFtZS4gIFRoZQorICogcmVtYWluZGVyIG1heSBiZSBpbnRlcmZhY2Ugc3BlY2lmaWMuCisgKi8KKworc3RydWN0IGlmcmVxIHsKKyNkZWZpbmUgSUZIV0FERFJMRU4JNgorCXVuaW9uCisJeworCQljaGFyCWlmcm5fbmFtZVtJRk5BTVNJWl07CQkvKiBpZiBuYW1lLCBlLmcuICJlbjAiICovCisJfSBpZnJfaWZybjsKKwkKKwl1bmlvbiB7CisJCXN0cnVjdAlzb2NrYWRkciBpZnJ1X2FkZHI7CisJCXN0cnVjdAlzb2NrYWRkciBpZnJ1X2RzdGFkZHI7CisJCXN0cnVjdAlzb2NrYWRkciBpZnJ1X2Jyb2FkYWRkcjsKKwkJc3RydWN0CXNvY2thZGRyIGlmcnVfbmV0bWFzazsKKwkJc3RydWN0ICBzb2NrYWRkciBpZnJ1X2h3YWRkcjsKKwkJc2hvcnQJaWZydV9mbGFnczsKKwkJaW50CWlmcnVfaXZhbHVlOworCQlpbnQJaWZydV9tdHU7CisJCXN0cnVjdCAgaWZtYXAgaWZydV9tYXA7CisJCWNoYXIJaWZydV9zbGF2ZVtJRk5BTVNJWl07CS8qIEp1c3QgZml0cyB0aGUgc2l6ZSAqLworCQljaGFyCWlmcnVfbmV3bmFtZVtJRk5BTVNJWl07CisJCXZvaWQgKglpZnJ1X2RhdGE7CisJCXN0cnVjdAlpZl9zZXR0aW5ncyBpZnJ1X3NldHRpbmdzOworCX0gaWZyX2lmcnU7Cit9OworCisjZGVmaW5lIGlmcl9uYW1lCWlmcl9pZnJuLmlmcm5fbmFtZQkvKiBpbnRlcmZhY2UgbmFtZSAJKi8KKyNkZWZpbmUgaWZyX2h3YWRkcglpZnJfaWZydS5pZnJ1X2h3YWRkcgkvKiBNQUMgYWRkcmVzcyAJCSovCisjZGVmaW5lCWlmcl9hZGRyCWlmcl9pZnJ1LmlmcnVfYWRkcgkvKiBhZGRyZXNzCQkqLworI2RlZmluZQlpZnJfZHN0YWRkcglpZnJfaWZydS5pZnJ1X2RzdGFkZHIJLyogb3RoZXIgZW5kIG9mIHAtcCBsbmsJKi8KKyNkZWZpbmUJaWZyX2Jyb2FkYWRkcglpZnJfaWZydS5pZnJ1X2Jyb2FkYWRkcgkvKiBicm9hZGNhc3QgYWRkcmVzcwkqLworI2RlZmluZQlpZnJfbmV0bWFzawlpZnJfaWZydS5pZnJ1X25ldG1hc2sJLyogaW50ZXJmYWNlIG5ldCBtYXNrCSovCisjZGVmaW5lCWlmcl9mbGFncwlpZnJfaWZydS5pZnJ1X2ZsYWdzCS8qIGZsYWdzCQkqLworI2RlZmluZQlpZnJfbWV0cmljCWlmcl9pZnJ1LmlmcnVfaXZhbHVlCS8qIG1ldHJpYwkJKi8KKyNkZWZpbmUJaWZyX210dQkJaWZyX2lmcnUuaWZydV9tdHUJLyogbXR1CQkJKi8KKyNkZWZpbmUgaWZyX21hcAkJaWZyX2lmcnUuaWZydV9tYXAJLyogZGV2aWNlIG1hcAkJKi8KKyNkZWZpbmUgaWZyX3NsYXZlCWlmcl9pZnJ1LmlmcnVfc2xhdmUJLyogc2xhdmUgZGV2aWNlCQkqLworI2RlZmluZQlpZnJfZGF0YQlpZnJfaWZydS5pZnJ1X2RhdGEJLyogZm9yIHVzZSBieSBpbnRlcmZhY2UJKi8KKyNkZWZpbmUgaWZyX2lmaW5kZXgJaWZyX2lmcnUuaWZydV9pdmFsdWUJLyogaW50ZXJmYWNlIGluZGV4CSovCisjZGVmaW5lIGlmcl9iYW5kd2lkdGgJaWZyX2lmcnUuaWZydV9pdmFsdWUgICAgLyogbGluayBiYW5kd2lkdGgJKi8KKyNkZWZpbmUgaWZyX3FsZW4JaWZyX2lmcnUuaWZydV9pdmFsdWUJLyogUXVldWUgbGVuZ3RoIAkqLworI2RlZmluZSBpZnJfbmV3bmFtZQlpZnJfaWZydS5pZnJ1X25ld25hbWUJLyogTmV3IG5hbWUJCSovCisjZGVmaW5lIGlmcl9zZXR0aW5ncwlpZnJfaWZydS5pZnJ1X3NldHRpbmdzCS8qIERldmljZS9wcm90byBzZXR0aW5ncyovCisKKy8qCisgKiBTdHJ1Y3R1cmUgdXNlZCBpbiBTSU9DR0lGQ09ORiByZXF1ZXN0LgorICogVXNlZCB0byByZXRyaWV2ZSBpbnRlcmZhY2UgY29uZmlndXJhdGlvbgorICogZm9yIG1hY2hpbmUgKHVzZWZ1bCBmb3IgcHJvZ3JhbXMgd2hpY2gKKyAqIG11c3Qga25vdyBhbGwgbmV0d29ya3MgYWNjZXNzaWJsZSkuCisgKi8KKworc3RydWN0IGlmY29uZiAgeworCWludAlpZmNfbGVuOwkJCS8qIHNpemUgb2YgYnVmZmVyCSovCisJdW5pb24geworCQljaGFyICppZmN1X2J1ZjsKKwkJc3RydWN0IGlmcmVxICppZmN1X3JlcTsKKwl9IGlmY19pZmN1OworfTsKKyNkZWZpbmUJaWZjX2J1ZglpZmNfaWZjdS5pZmN1X2J1ZgkJLyogYnVmZmVyIGFkZHJlc3MJKi8KKyNkZWZpbmUJaWZjX3JlcQlpZmNfaWZjdS5pZmN1X3JlcQkJLyogYXJyYXkgb2Ygc3RydWN0dXJlcwkqLworCisjZW5kaWYgLyogX0xJTlVYX0lGX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfYWRkci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9hZGRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThiMzlmNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfYWRkci5oCkBAIC0wLDAgKzEsNTkgQEAKKyNpZm5kZWYgX19MSU5VWF9JRl9BRERSX0gKKyNkZWZpbmUgX19MSU5VWF9JRl9BRERSX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorCitzdHJ1Y3QgaWZhZGRybXNnIHsKKwlfX3U4CQlpZmFfZmFtaWx5OworCV9fdTgJCWlmYV9wcmVmaXhsZW47CS8qIFRoZSBwcmVmaXggbGVuZ3RoCQkqLworCV9fdTgJCWlmYV9mbGFnczsJLyogRmxhZ3MJCQkqLworCV9fdTgJCWlmYV9zY29wZTsJLyogQWRkcmVzcyBzY29wZQkJKi8KKwlfX3UzMgkJaWZhX2luZGV4OwkvKiBMaW5rIGluZGV4CQkJKi8KK307CisKKy8qCisgKiBJbXBvcnRhbnQgY29tbWVudDoKKyAqIElGQV9BRERSRVNTIGlzIHByZWZpeCBhZGRyZXNzLCByYXRoZXIgdGhhbiBsb2NhbCBpbnRlcmZhY2UgYWRkcmVzcy4KKyAqIEl0IG1ha2VzIG5vIGRpZmZlcmVuY2UgZm9yIG5vcm1hbGx5IGNvbmZpZ3VyZWQgYnJvYWRjYXN0IGludGVyZmFjZXMsCisgKiBidXQgZm9yIHBvaW50LXRvLXBvaW50IElGQV9BRERSRVNTIGlzIERFU1RJTkFUSU9OIGFkZHJlc3MsCisgKiBsb2NhbCBhZGRyZXNzIGlzIHN1cHBsaWVkIGluIElGQV9MT0NBTCBhdHRyaWJ1dGUuCisgKi8KK2VudW0geworCUlGQV9VTlNQRUMsCisJSUZBX0FERFJFU1MsCisJSUZBX0xPQ0FMLAorCUlGQV9MQUJFTCwKKwlJRkFfQlJPQURDQVNULAorCUlGQV9BTllDQVNULAorCUlGQV9DQUNIRUlORk8sCisJSUZBX01VTFRJQ0FTVCwKKwlfX0lGQV9NQVgsCit9OworCisjZGVmaW5lIElGQV9NQVggKF9fSUZBX01BWCAtIDEpCisKKy8qIGlmYV9mbGFncyAqLworI2RlZmluZSBJRkFfRl9TRUNPTkRBUlkJCTB4MDEKKyNkZWZpbmUgSUZBX0ZfVEVNUE9SQVJZCQlJRkFfRl9TRUNPTkRBUlkKKworI2RlZmluZQlJRkFfRl9OT0RBRAkJMHgwMgorI2RlZmluZSBJRkFfRl9PUFRJTUlTVElDCTB4MDQKKyNkZWZpbmUgSUZBX0ZfREFERkFJTEVECQkweDA4CisjZGVmaW5lCUlGQV9GX0hPTUVBRERSRVNTCTB4MTAKKyNkZWZpbmUgSUZBX0ZfREVQUkVDQVRFRAkweDIwCisjZGVmaW5lIElGQV9GX1RFTlRBVElWRQkJMHg0MAorI2RlZmluZSBJRkFfRl9QRVJNQU5FTlQJCTB4ODAKKworc3RydWN0IGlmYV9jYWNoZWluZm8geworCV9fdTMyCWlmYV9wcmVmZXJlZDsKKwlfX3UzMglpZmFfdmFsaWQ7CisJX191MzIJY3N0YW1wOyAvKiBjcmVhdGVkIHRpbWVzdGFtcCwgaHVuZHJlZHRocyBvZiBzZWNvbmRzICovCisJX191MzIJdHN0YW1wOyAvKiB1cGRhdGVkIHRpbWVzdGFtcCwgaHVuZHJlZHRocyBvZiBzZWNvbmRzICovCit9OworCisvKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgdXNlcnNwYWNlICovCisjZGVmaW5lIElGQV9SVEEocikgICgoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopKHIpKSArIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgaWZhZGRybXNnKSkpKQorI2RlZmluZSBJRkFfUEFZTE9BRChuKSBOTE1TR19QQVlMT0FEKG4sc2l6ZW9mKHN0cnVjdCBpZmFkZHJtc2cpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfYWRkcmxhYmVsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2FkZHJsYWJlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTgwYzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2FkZHJsYWJlbC5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBpZl9hZGRybGFiZWwuaCAtIG5ldGxpbmsgaW50ZXJmYWNlIGZvciBhZGRyZXNzIGxhYmVscworICoKKyAqIENvcHlyaWdodCAoQykyMDA3IFVTQUdJL1dJREUgUHJvamVjdCwgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogQXV0aG9yczoKKyAqCVlPU0hJRlVKSSBIaWRlYWtpIEAgVVNBR0kvV0lERSA8eW9zaGZ1amlAbGludXgtaXB2Ni5vcmc+CisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0lGX0FERFJMQUJFTF9ICisjZGVmaW5lIF9fTElOVVhfSUZfQUREUkxBQkVMX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBpZmFkZHJsYmxtc2cgeworCV9fdTgJCWlmYWxfZmFtaWx5OwkJLyogQWRkcmVzcyBmYW1pbHkgKi8KKwlfX3U4CQlfX2lmYWxfcmVzZXJ2ZWQ7CS8qIFJlc2VydmVkICovCisJX191OAkJaWZhbF9wcmVmaXhsZW47CQkvKiBQcmVmaXggbGVuZ3RoICovCisJX191OAkJaWZhbF9mbGFnczsJCS8qIEZsYWdzICovCisJX191MzIJCWlmYWxfaW5kZXg7CQkvKiBMaW5rIGluZGV4ICovCisJX191MzIJCWlmYWxfc2VxOwkJLyogc2VxdWVuY2UgbnVtYmVyICovCit9OworCitlbnVtIHsKKwlJRkFMX0FERFJFU1MgPSAxLAorCUlGQUxfTEFCRUwgPSAyLAorCV9fSUZBTF9NQVgKK307CisKKyNkZWZpbmUgSUZBTF9NQVgJKF9fSUZBTF9NQVggLSAxKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfYWxnLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2FsZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOWFjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2FsZy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBpZl9hbGc6IFVzZXItc3BhY2UgYWxnb3JpdGhtIGludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfSUZfQUxHX0gKKyNkZWZpbmUgX0xJTlVYX0lGX0FMR19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3Qgc29ja2FkZHJfYWxnIHsKKwlfX3UxNglzYWxnX2ZhbWlseTsKKwlfX3U4CXNhbGdfdHlwZVsxNF07CisJX191MzIJc2FsZ19mZWF0OworCV9fdTMyCXNhbGdfbWFzazsKKwlfX3U4CXNhbGdfbmFtZVs2NF07Cit9OworCitzdHJ1Y3QgYWZfYWxnX2l2IHsKKwlfX3UzMglpdmxlbjsKKwlfX3U4CWl2WzBdOworfTsKKworLyogU29ja2V0IG9wdGlvbnMgKi8KKyNkZWZpbmUgQUxHX1NFVF9LRVkJCQkxCisjZGVmaW5lIEFMR19TRVRfSVYJCQkyCisjZGVmaW5lIEFMR19TRVRfT1AJCQkzCisKKy8qIE9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgQUxHX09QX0RFQ1JZUFQJCQkwCisjZGVmaW5lIEFMR19PUF9FTkNSWVBUCQkJMQorCisjZW5kaWYJLyogX0xJTlVYX0lGX0FMR19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2FyY25ldC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9hcmNuZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmUzNGJkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9hcmNuZXQuaApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIElORVQgICAgICAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqICAgICAgICAgICAgICBvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqICAgICAgICAgICAgICBpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKiAgICAgICAgICAgICAgR2xvYmFsIGRlZmluaXRpb25zIGZvciB0aGUgQVJDbmV0IGludGVyZmFjZS4KKyAqCisgKiBBdXRob3JzOiAgICAgRGF2aWQgV29vZGhvdXNlIGFuZCBBdmVyeSBQZW5uYXJ1bgorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0lGX0FSQ05FVF9ICisjZGVmaW5lIF9MSU5VWF9JRl9BUkNORVRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorCisKKy8qCisgKiAgICBUaGVzZSBhcmUgdGhlIGRlZmluZWQgQVJDbmV0IFByb3RvY29sIElEJ3MuCisgKi8KKworLyogQ0FQIG1vZGUgKi8KKy8qIE5vIG1hY3JvIGJ1dCB1c2VzIDEtOCAqLworCisvKiBSRkMxMjAxIFByb3RvY29sIElEJ3MgKi8KKyNkZWZpbmUgQVJDX1BfSVAJCTIxMgkvKiAweEQ0ICovCisjZGVmaW5lIEFSQ19QX0lQVjYJCTE5NgkvKiAweEM0OiBSRkMyNDk3ICovCisjZGVmaW5lIEFSQ19QX0FSUAkJMjEzCS8qIDB4RDUgKi8KKyNkZWZpbmUgQVJDX1BfUkFSUAkJMjE0CS8qIDB4RDYgKi8KKyNkZWZpbmUgQVJDX1BfSVBYCQkyNTAJLyogMHhGQSAqLworI2RlZmluZSBBUkNfUF9OT1ZFTExfRUMJCTIzNgkvKiAweEVDICovCisKKy8qIE9sZCBSRkMxMDUxIFByb3RvY29sIElEJ3MgKi8KKyNkZWZpbmUgQVJDX1BfSVBfUkZDMTA1MQkyNDAJLyogMHhGMCAqLworI2RlZmluZSBBUkNfUF9BUlBfUkZDMTA1MQkyNDEJLyogMHhGMSAqLworCisvKiBNUyBMYW5NYW4vV2ZXZyAiTkRJUyIgZW5jYXBzdWxhdGlvbiAqLworI2RlZmluZSBBUkNfUF9FVEhFUgkJMjMyCS8qIDB4RTggKi8KKworLyogVW5zdXBwb3J0ZWQvaW5kaXJlY3RseSBzdXBwb3J0ZWQgcHJvdG9jb2xzICovCisjZGVmaW5lIEFSQ19QX0RBVEFQT0lOVF9CT09UCTAJLyogdmVyeSBvbGQgRGF0YXBvaW50IGVxdWlwbWVudCAqLworI2RlZmluZSBBUkNfUF9EQVRBUE9JTlRfTU9VTlQJMQorI2RlZmluZSBBUkNfUF9QT1dFUkxBTl9CRUFDT04JOAkvKiBQcm9iYWJseSBBVEEtTmV0YmlvcyByZWxhdGVkICovCisjZGVmaW5lIEFSQ19QX1BPV0VSTEFOX0JFQUNPTjIJMjQzCS8qIDB4RjMgKi8KKyNkZWZpbmUgQVJDX1BfTEFOU09GVAkJMjUxCS8qIDB4RkIgLSB3aGF0IGlzIHRoaXM/ICovCisjZGVmaW5lIEFSQ19QX0FUQUxLCQkweERECisKKy8qIEhhcmR3YXJlIGFkZHJlc3MgbGVuZ3RoICovCisjZGVmaW5lIEFSQ05FVF9BTEVOCTEKKworLyoKKyAqIFRoZSBSRkMxMjAxLXNwZWNpZmljIGNvbXBvbmVudHMgb2YgYW4gYXJjbmV0IHBhY2tldCBoZWFkZXIuCisgKi8KK3N0cnVjdCBhcmNfcmZjMTIwMSB7CisgICAgX191OCAgcHJvdG87CQkvKiBwcm90b2NvbCBJRCBmaWVsZCAtIHZhcmllcwkJKi8KKyAgICBfX3U4ICBzcGxpdF9mbGFnOwkvKiBmb3IgdXNlIHdpdGggc3BsaXQgcGFja2V0cwkJKi8KKyAgICBfX2JlMTYgICBzZXF1ZW5jZTsJCS8qIHNlcXVlbmNlIG51bWJlcgkJCSovCisgICAgX191OCAgcGF5bG9hZFswXTsJLyogc3BhY2UgcmVtYWluaW5nIGluIHBhY2tldCAoNTA0IGJ5dGVzKSovCit9OworI2RlZmluZSBSRkMxMjAxX0hEUl9TSVpFIDQKKworCisvKgorICogVGhlIFJGQzEwNTEtc3BlY2lmaWMgY29tcG9uZW50cy4KKyAqLworc3RydWN0IGFyY19yZmMxMDUxIHsKKyAgICBfX3U4IHByb3RvOwkJLyogQVJDX1BfUkZDMTA1MV9BUlAvUkZDMTA1MV9JUAkqLworICAgIF9fdTggcGF5bG9hZFswXTsJCS8qIDUwNyBieXRlcwkJCSovCit9OworI2RlZmluZSBSRkMxMDUxX0hEUl9TSVpFIDEKKworCisvKgorICogVGhlIGV0aGVybmV0LWVuY2FwLXNwZWNpZmljIGNvbXBvbmVudHMuICBXZSBoYXZlIGEgcmVhbCBldGhlcm5ldCBoZWFkZXIKKyAqIGFuZCBzb21lIGRhdGEuCisgKi8KK3N0cnVjdCBhcmNfZXRoX2VuY2FwIHsKKyAgICBfX3U4IHByb3RvOwkJLyogQWx3YXlzIEFSQ19QX0VUSEVSCQkJKi8KKyAgICBzdHJ1Y3QgZXRoaGRyIGV0aDsJCS8qIHN0YW5kYXJkIGV0aGVybmV0IGhlYWRlciAoeXVjayEpCSovCisgICAgX191OCBwYXlsb2FkWzBdOwkJLyogNDkzIGJ5dGVzCQkJCSovCit9OworI2RlZmluZSBFVEhfRU5DQVBfSERSX1NJWkUgMTQKKworCitzdHJ1Y3QgYXJjX2NhcCB7CisJX191OCBwcm90bzsKKwlfX3U4IGNvb2tpZVtzaXplb2YoaW50KV07ICAgLyogQWN0dWFsbHkgTk9UIHNlbnQgb3ZlciB0aGUgbmV0d29yayAqLworCXVuaW9uIHsKKwkJX191OCBhY2s7CisJCV9fdTggcmF3WzBdOwkJLyogNTA3IGJ5dGVzICovCisJfSBtZXM7Cit9OworCisvKgorICogVGhlIGRhdGEgbmVlZGVkIGJ5IHRoZSBhY3R1YWwgYXJjbmV0IGhhcmR3YXJlLgorICoKKyAqIE5vdywgaW4gdGhlIHJlYWwgYXJjbmV0IGhhcmR3YXJlLCB0aGUgdGhpcmQgYW5kIGZvdXJ0aCBieXRlcyBhcmUgdGhlCisgKiAnb2Zmc2V0JyBzcGVjaWZpY2F0aW9uIGluc3RlYWQgb2YgdGhlIGxlbmd0aCwgYW5kIHRoZSBzb2Z0IGRhdGEgaXMgYXQKKyAqIHRoZSBfZW5kXyBvZiB0aGUgNTEyLWJ5dGUgYnVmZmVyLiAgV2UgaGlkZSB0aGlzIGNvbXBsZXhpdHkgaW5zaWRlIHRoZQorICogZHJpdmVyLgorICovCitzdHJ1Y3QgYXJjX2hhcmR3YXJlIHsKKyAgICBfX3U4ICBzb3VyY2UsCQkvKiBzb3VyY2UgQVJDbmV0IC0gZmlsbGVkIGluIGF1dG9tYWdpY2FsbHkgKi8KKyAgICAgICAgICAgICBkZXN0LAkJLyogZGVzdGluYXRpb24gQVJDbmV0IC0gMCBmb3IgYnJvYWRjYXN0ICAgICovCisgICAgCSAgICAgb2Zmc2V0WzJdOwkJLyogb2Zmc2V0IGJ5dGVzIChzb21lIHdlaXJkIHNlbWFudGljcykgICAgICovCit9OworI2RlZmluZSBBUkNfSERSX1NJWkUgNAorCisvKgorICogVGhpcyBpcyBhbiBBUkNuZXQgZnJhbWUgaGVhZGVyLCBhcyBzZWVuIGJ5IHRoZSBrZXJuZWwgKGFuZCB1c2Vyc3BhY2UsCisgKiB3aGVuIHlvdSBkbyBhIHJhdyBwYWNrZXQgY2FwdHVyZSkuCisgKi8KK3N0cnVjdCBhcmNoZHIgeworICAgIC8qIGhhcmR3YXJlIHJlcXVpcmVtZW50cyAqLworICAgIHN0cnVjdCBhcmNfaGFyZHdhcmUgaGFyZDsKKyAgICAgCisgICAgLyogYXJjbmV0IGVuY2Fwc3VsYXRpb24tc3BlY2lmaWMgYml0cyAqLworICAgIHVuaW9uIHsKKwlzdHJ1Y3QgYXJjX3JmYzEyMDEgICByZmMxMjAxOworCXN0cnVjdCBhcmNfcmZjMTA1MSAgIHJmYzEwNTE7CisJc3RydWN0IGFyY19ldGhfZW5jYXAgZXRoX2VuY2FwOworCXN0cnVjdCBhcmNfY2FwICAgICAgIGNhcDsKKwlfX3U4IHJhd1swXTsJCS8qIDUwOCBieXRlcwkJCQkqLworICAgIH0gc29mdDsKK307CisKKyNlbmRpZgkJCQkvKiBfTElOVVhfSUZfQVJDTkVUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfYXJwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2FycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOWZjNWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2FycC5oCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCUdsb2JhbCBkZWZpbml0aW9ucyBmb3IgdGhlIEFSUCAoUkZDIDgyNikgcHJvdG9jb2wuCisgKgorICogVmVyc2lvbjoJQCgjKWlmX2FycC5oCTEuMC4xCTA0LzE2LzkzCisgKgorICogQXV0aG9yczoJT3JpZ2luYWwgdGFrZW4gZnJvbSBCZXJrZWxleSBVTklYIDQuMywgKGMpIFVDQiAxOTg2LTE5ODgKKyAqCQlQb3J0aW9ucyB0YWtlbiBmcm9tIHRoZSBLQTlRL05PUyAodjIuMDBtIFBBMEdSSSkgc291cmNlLgorICoJCVJvc3MgQmlybworICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoJCUZsb3JpYW4gTGEgUm9jaGUsCisgKgkJSm9uYXRoYW4gTGF5ZXMgPGxheWVzQGxvcmFuLmNvbT4KKyAqCQlBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4gQVJQSFJEX0hXWDI1CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0xJTlVYX0lGX0FSUF9ICisjZGVmaW5lIF9MSU5VWF9JRl9BUlBfSAorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisKKy8qIEFSUCBwcm90b2NvbCBIQVJEV0FSRSBpZGVudGlmaWVycy4gKi8KKyNkZWZpbmUgQVJQSFJEX05FVFJPTQkwCQkvKiBmcm9tIEtBOVE6IE5FVC9ST00gcHNldWRvCSovCisjZGVmaW5lIEFSUEhSRF9FVEhFUiAJMQkJLyogRXRoZXJuZXQgMTBNYnBzCQkqLworI2RlZmluZQlBUlBIUkRfRUVUSEVSCTIJCS8qIEV4cGVyaW1lbnRhbCBFdGhlcm5ldAkqLworI2RlZmluZQlBUlBIUkRfQVgyNQkzCQkvKiBBWC4yNSBMZXZlbCAyCQkqLworI2RlZmluZQlBUlBIUkRfUFJPTkVUCTQJCS8qIFBST25ldCB0b2tlbiByaW5nCQkqLworI2RlZmluZQlBUlBIUkRfQ0hBT1MJNQkJLyogQ2hhb3NuZXQJCQkqLworI2RlZmluZQlBUlBIUkRfSUVFRTgwMgk2CQkvKiBJRUVFIDgwMi4yIEV0aGVybmV0L1RSL1RCCSovCisjZGVmaW5lCUFSUEhSRF9BUkNORVQJNwkJLyogQVJDbmV0CQkJKi8KKyNkZWZpbmUJQVJQSFJEX0FQUExFVExLCTgJCS8qIEFQUExFdGFsawkJCSovCisjZGVmaW5lIEFSUEhSRF9ETENJCTE1CQkvKiBGcmFtZSBSZWxheSBETENJCQkqLworI2RlZmluZSBBUlBIUkRfQVRNCTE5CQkvKiBBVE0gCQkJCSovCisjZGVmaW5lIEFSUEhSRF9NRVRSSUNPTQkyMwkJLyogTWV0cmljb20gU1RSSVAgKG5ldyBJQU5BIGlkKQkqLworI2RlZmluZQlBUlBIUkRfSUVFRTEzOTQJMjQJCS8qIElFRUUgMTM5NCBJUHY0IC0gUkZDIDI3MzQJKi8KKyNkZWZpbmUgQVJQSFJEX0VVSTY0CTI3CQkvKiBFVUktNjQgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFSUEhSRF9JTkZJTklCQU5EIDMyCQkvKiBJbmZpbmlCYW5kCQkJKi8KKworLyogRHVtbXkgdHlwZXMgZm9yIG5vbiBBUlAgaGFyZHdhcmUgKi8KKyNkZWZpbmUgQVJQSFJEX1NMSVAJMjU2CisjZGVmaW5lIEFSUEhSRF9DU0xJUAkyNTcKKyNkZWZpbmUgQVJQSFJEX1NMSVA2CTI1OAorI2RlZmluZSBBUlBIUkRfQ1NMSVA2CTI1OQorI2RlZmluZSBBUlBIUkRfUlNSVkQJMjYwCQkvKiBOb3Rpb25hbCBLSVNTIHR5cGUgCQkqLworI2RlZmluZSBBUlBIUkRfQURBUFQJMjY0CisjZGVmaW5lIEFSUEhSRF9ST1NFCTI3MAorI2RlZmluZSBBUlBIUkRfWDI1CTI3MQkJLyogQ0NJVFQgWC4yNQkJCSovCisjZGVmaW5lIEFSUEhSRF9IV1gyNQkyNzIJCS8qIEJvYXJkcyB3aXRoIFguMjUgaW4gZmlybXdhcmUJKi8KKyNkZWZpbmUgQVJQSFJEX0NBTgkyODAJCS8qIENvbnRyb2xsZXIgQXJlYSBOZXR3b3JrICAgICAgKi8KKyNkZWZpbmUgQVJQSFJEX1BQUAk1MTIKKyNkZWZpbmUgQVJQSFJEX0NJU0NPCTUxMwkJLyogQ2lzY28gSERMQwkgCQkqLworI2RlZmluZSBBUlBIUkRfSERMQwlBUlBIUkRfQ0lTQ08KKyNkZWZpbmUgQVJQSFJEX0xBUEIJNTE2CQkvKiBMQVBCCQkJCSovCisjZGVmaW5lIEFSUEhSRF9ERENNUCAgICA1MTcJCS8qIERpZ2l0YWwncyBERENNUCBwcm90b2NvbCAgICAgKi8KKyNkZWZpbmUgQVJQSFJEX1JBV0hETEMJNTE4CQkvKiBSYXcgSERMQwkJCSovCisKKyNkZWZpbmUgQVJQSFJEX1RVTk5FTAk3NjgJCS8qIElQSVAgdHVubmVsCQkJKi8KKyNkZWZpbmUgQVJQSFJEX1RVTk5FTDYJNzY5CQkvKiBJUDZJUDYgdHVubmVsICAgICAgIAkJKi8KKyNkZWZpbmUgQVJQSFJEX0ZSQUQJNzcwICAgICAgICAgICAgIC8qIEZyYW1lIFJlbGF5IEFjY2VzcyBEZXZpY2UgICAgKi8KKyNkZWZpbmUgQVJQSFJEX1NLSVAJNzcxCQkvKiBTS0lQIHZpZgkJCSovCisjZGVmaW5lIEFSUEhSRF9MT09QQkFDSwk3NzIJCS8qIExvb3BiYWNrIGRldmljZQkJKi8KKyNkZWZpbmUgQVJQSFJEX0xPQ0FMVExLIDc3MwkJLyogTG9jYWx0YWxrIGRldmljZQkJKi8KKyNkZWZpbmUgQVJQSFJEX0ZEREkJNzc0CQkvKiBGaWJlciBEaXN0cmlidXRlZCBEYXRhIEludGVyZmFjZSAqLworI2RlZmluZSBBUlBIUkRfQklGICAgICAgNzc1ICAgICAgICAgICAgIC8qIEFQMTAwMCBCSUYgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQVJQSFJEX1NJVAk3NzYJCS8qIHNpdDAgZGV2aWNlIC0gSVB2Ni1pbi1JUHY0CSovCisjZGVmaW5lIEFSUEhSRF9JUEREUAk3NzcJCS8qIElQIG92ZXIgRERQIHR1bm5lbGxlcgkqLworI2RlZmluZSBBUlBIUkRfSVBHUkUJNzc4CQkvKiBHUkUgb3ZlciBJUAkJCSovCisjZGVmaW5lIEFSUEhSRF9QSU1SRUcJNzc5CQkvKiBQSU1TTSByZWdpc3RlciBpbnRlcmZhY2UJKi8KKyNkZWZpbmUgQVJQSFJEX0hJUFBJCTc4MAkJLyogSGlnaCBQZXJmb3JtYW5jZSBQYXJhbGxlbCBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgQVJQSFJEX0FTSAk3ODEJCS8qIE5leHVzIDY0TWJwcyBBc2gJCSovCisjZGVmaW5lIEFSUEhSRF9FQ09ORVQJNzgyCQkvKiBBY29ybiBFY29uZXQJCQkqLworI2RlZmluZSBBUlBIUkRfSVJEQSAJNzgzCQkvKiBMaW51eC1JckRBCQkJKi8KKy8qIEFSUCB3b3JrcyBkaWZmZXJlbnRseSBvbiBkaWZmZXJlbnQgRkMgbWVkaWEgLi4gc28gICovCisjZGVmaW5lIEFSUEhSRF9GQ1BQCTc4NAkJLyogUG9pbnQgdG8gcG9pbnQgZmlicmVjaGFubmVsCSovCisjZGVmaW5lIEFSUEhSRF9GQ0FMCTc4NQkJLyogRmlicmVjaGFubmVsIGFyYml0cmF0ZWQgbG9vcCAqLworI2RlZmluZSBBUlBIUkRfRkNQTAk3ODYJCS8qIEZpYnJlY2hhbm5lbCBwdWJsaWMgbG9vcAkqLworI2RlZmluZSBBUlBIUkRfRkNGQUJSSUMJNzg3CQkvKiBGaWJyZWNoYW5uZWwgZmFicmljCQkqLworCS8qIDc4Ny0+Nzk5IHJlc2VydmVkIGZvciBmaWJyZWNoYW5uZWwgbWVkaWEgdHlwZXMgKi8KKyNkZWZpbmUgQVJQSFJEX0lFRUU4MDJfVFIgODAwCQkvKiBNYWdpYyB0eXBlIGlkZW50IGZvciBUUgkqLworI2RlZmluZSBBUlBIUkRfSUVFRTgwMjExIDgwMQkJLyogSUVFRSA4MDIuMTEJCQkqLworI2RlZmluZSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNIDgwMgkvKiBJRUVFIDgwMi4xMSArIFByaXNtMiBoZWFkZXIgICovCisjZGVmaW5lIEFSUEhSRF9JRUVFODAyMTFfUkFESU9UQVAgODAzCS8qIElFRUUgODAyLjExICsgcmFkaW90YXAgaGVhZGVyICovCisjZGVmaW5lIEFSUEhSRF9JRUVFODAyMTU0CSAgODA0CisKKyNkZWZpbmUgQVJQSFJEX1BIT05FVAk4MjAJCS8qIFBob05ldCBtZWRpYSB0eXBlCQkqLworI2RlZmluZSBBUlBIUkRfUEhPTkVUX1BJUEUgODIxCQkvKiBQaG9OZXQgcGlwZSBoZWFkZXIJCSovCisjZGVmaW5lIEFSUEhSRF9DQUlGCTgyMgkJLyogQ0FJRiBtZWRpYSB0eXBlCQkqLworCisjZGVmaW5lIEFSUEhSRF9WT0lECSAgMHhGRkZGCS8qIFZvaWQgdHlwZSwgbm90aGluZyBpcyBrbm93biAqLworI2RlZmluZSBBUlBIUkRfTk9ORQkgIDB4RkZGRQkvKiB6ZXJvIGhlYWRlciBsZW5ndGggKi8KKworLyogQVJQIHByb3RvY29sIG9wY29kZXMuICovCisjZGVmaW5lCUFSUE9QX1JFUVVFU1QJMQkJLyogQVJQIHJlcXVlc3QJCQkqLworI2RlZmluZQlBUlBPUF9SRVBMWQkyCQkvKiBBUlAgcmVwbHkJCQkqLworI2RlZmluZQlBUlBPUF9SUkVRVUVTVAkzCQkvKiBSQVJQIHJlcXVlc3QJCQkqLworI2RlZmluZQlBUlBPUF9SUkVQTFkJNAkJLyogUkFSUCByZXBseQkJCSovCisjZGVmaW5lCUFSUE9QX0luUkVRVUVTVAk4CQkvKiBJbkFSUCByZXF1ZXN0CQkqLworI2RlZmluZQlBUlBPUF9JblJFUExZCTkJCS8qIEluQVJQIHJlcGx5CQkJKi8KKyNkZWZpbmUJQVJQT1BfTkFLCTEwCQkvKiAoQVRNKUFSUCBOQUsJCQkqLworCisKKy8qIEFSUCBpb2N0bCByZXF1ZXN0LiAqLworc3RydWN0IGFycHJlcSB7CisgIHN0cnVjdCBzb2NrYWRkcglhcnBfcGE7CQkvKiBwcm90b2NvbCBhZGRyZXNzCQkqLworICBzdHJ1Y3Qgc29ja2FkZHIJYXJwX2hhOwkJLyogaGFyZHdhcmUgYWRkcmVzcwkJKi8KKyAgaW50CQkJYXJwX2ZsYWdzOwkvKiBmbGFncwkJCSovCisgIHN0cnVjdCBzb2NrYWRkciAgICAgICBhcnBfbmV0bWFzazsgICAgLyogbmV0bWFzayAob25seSBmb3IgcHJveHkgYXJwcykgKi8KKyAgY2hhcgkJCWFycF9kZXZbMTZdOworfTsKKworc3RydWN0IGFycHJlcV9vbGQgeworICBzdHJ1Y3Qgc29ja2FkZHIJYXJwX3BhOwkJLyogcHJvdG9jb2wgYWRkcmVzcwkJKi8KKyAgc3RydWN0IHNvY2thZGRyCWFycF9oYTsJCS8qIGhhcmR3YXJlIGFkZHJlc3MJCSovCisgIGludAkJCWFycF9mbGFnczsJLyogZmxhZ3MJCQkqLworICBzdHJ1Y3Qgc29ja2FkZHIgICAgICAgYXJwX25ldG1hc2s7ICAgIC8qIG5ldG1hc2sgKG9ubHkgZm9yIHByb3h5IGFycHMpICovCit9OworCisvKiBBUlAgRmxhZyB2YWx1ZXMuICovCisjZGVmaW5lIEFURl9DT00JCTB4MDIJCS8qIGNvbXBsZXRlZCBlbnRyeSAoaGEgdmFsaWQpCSovCisjZGVmaW5lCUFURl9QRVJNCTB4MDQJCS8qIHBlcm1hbmVudCBlbnRyeQkJKi8KKyNkZWZpbmUJQVRGX1BVQkwJMHgwOAkJLyogcHVibGlzaCBlbnRyeQkJKi8KKyNkZWZpbmUJQVRGX1VTRVRSQUlMRVJTCTB4MTAJCS8qIGhhcyByZXF1ZXN0ZWQgdHJhaWxlcnMJKi8KKyNkZWZpbmUgQVRGX05FVE1BU0sgICAgIDB4MjAgICAgICAgICAgICAvKiB3YW50IHRvIHVzZSBhIG5ldG1hc2sgKG9ubHkKKwkJCQkJICAgZm9yIHByb3h5IGVudHJpZXMpICovCisjZGVmaW5lIEFURl9ET05UUFVCCTB4NDAJCS8qIGRvbid0IGFuc3dlciB0aGlzIGFkZHJlc3NlcwkqLworCisvKgorICoJVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiBldGhlcm5ldCBhcnAgaGVhZGVyLgorICovCisKK3N0cnVjdCBhcnBoZHIgeworCV9fYmUxNgkJYXJfaHJkOwkJLyogZm9ybWF0IG9mIGhhcmR3YXJlIGFkZHJlc3MJKi8KKwlfX2JlMTYJCWFyX3BybzsJCS8qIGZvcm1hdCBvZiBwcm90b2NvbCBhZGRyZXNzCSovCisJdW5zaWduZWQgY2hhcglhcl9obG47CQkvKiBsZW5ndGggb2YgaGFyZHdhcmUgYWRkcmVzcwkqLworCXVuc2lnbmVkIGNoYXIJYXJfcGxuOwkJLyogbGVuZ3RoIG9mIHByb3RvY29sIGFkZHJlc3MJKi8KKwlfX2JlMTYJCWFyX29wOwkJLyogQVJQIG9wY29kZSAoY29tbWFuZCkJCSovCisKKyNpZiAwCisJIC8qCisJICAqCSBFdGhlcm5ldCBsb29rcyBsaWtlIHRoaXMgOiBUaGlzIGJpdCBpcyB2YXJpYWJsZSBzaXplZCBob3dldmVyLi4uCisJICAqLworCXVuc2lnbmVkIGNoYXIJCWFyX3NoYVtFVEhfQUxFTl07CS8qIHNlbmRlciBoYXJkd2FyZSBhZGRyZXNzCSovCisJdW5zaWduZWQgY2hhcgkJYXJfc2lwWzRdOwkJLyogc2VuZGVyIElQIGFkZHJlc3MJCSovCisJdW5zaWduZWQgY2hhcgkJYXJfdGhhW0VUSF9BTEVOXTsJLyogdGFyZ2V0IGhhcmR3YXJlIGFkZHJlc3MJKi8KKwl1bnNpZ25lZCBjaGFyCQlhcl90aXBbNF07CQkvKiB0YXJnZXQgSVAgYWRkcmVzcwkJKi8KKyNlbmRpZgorCit9OworCisKKyNlbmRpZgkvKiBfTElOVVhfSUZfQVJQX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfYm9uZGluZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9ib25kaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3ZWRkYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfYm9uZGluZy5oCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQm9uZCBzZXZlcmFsIGV0aGVybmV0IGludGVyZmFjZXMgaW50byBhIENpc2NvLCBydW5uaW5nICdFdGhlcmNoYW5uZWwnLgorICoKKyAqCisgKiBQb3J0aW9ucyBhcmUgKGMpIENvcHlyaWdodCAxOTk1IFNpbW9uICJHdXJ1IEFsZXBoLU51bGwiIEphbmVzCisgKiBOQ006IE5ldHdvcmsgYW5kIENvbW11bmljYXRpb25zIE1hbmFnZW1lbnQsIEluYy4KKyAqCisgKiBCVVQsIEknbSB0aGUgb25lIHdobyBtb2RpZmllZCBpdCBmb3IgZXRoZXJuZXQsIHNvOgorICogKGMpIENvcHlyaWdodCAxOTk5LCBUaG9tYXMgRGF2aXMsIHRhZGF2aXNAbGJsLmdvdgorICoKKyAqCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqCW9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIDIwMDMvMDMvMTggLSBBbWlyIE5vYW0gPGFtaXIubm9hbSBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBBZGRlZCBzdXBwb3J0IGZvciBnZXR0aW5nIHNsYXZlJ3Mgc3BlZWQgYW5kIGR1cGxleCB2aWEgZXRodG9vbC4KKyAqCSAgTmVlZGVkIGZvciA4MDIuM2FkIGFuZCBvdGhlciBmdXR1cmUgbW9kZXMuCisgKgorICogMjAwMy8wMy8xOCAtIFRzaXBweSBNZW5kZWxzb24gPHRzaXBweS5tZW5kZWxzb24gYXQgaW50ZWwgZG90IGNvbT4gYW5kCisgKgkJU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKgktIEVuYWJsZSBzdXBwb3J0IG9mIG1vZGVzIHRoYXQgbmVlZCB0byB1c2UgdGhlIHVuaXF1ZSBtYWMgYWRkcmVzcyBvZgorICoJICBlYWNoIHNsYXZlLgorICoKKyAqIDIwMDMvMDMvMTggLSBUc2lwcHkgTWVuZGVsc29uIDx0c2lwcHkubWVuZGVsc29uIGF0IGludGVsIGRvdCBjb20+IGFuZAorICoJCUFtaXIgTm9hbSA8YW1pci5ub2FtIGF0IGludGVsIGRvdCBjb20+CisgKgktIE1vdmVkIGRyaXZlcidzIHByaXZhdGUgZGF0YSB0eXBlcyB0byBib25kaW5nLmgKKyAqCisgKiAyMDAzLzAzLzE4IC0gQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4sCisgKgkJVHNpcHB5IE1lbmRlbHNvbiA8dHNpcHB5Lm1lbmRlbHNvbiBhdCBpbnRlbCBkb3QgY29tPiBhbmQKKyAqCQlTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQWRkZWQgc3VwcG9ydCBmb3IgSUVFRSA4MDIuM2FkIER5bmFtaWMgbGluayBhZ2dyZWdhdGlvbiBtb2RlLgorICoKKyAqIDIwMDMvMDUvMDEgLSBBbWlyIE5vYW0gPGFtaXIubm9hbSBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBBZGRlZCBBQkkgdmVyc2lvbiBjb250cm9sIHRvIHJlc3RvcmUgY29tcGF0aWJpbGl0eSBiZXR3ZWVuCisgKgkgIG5ldy9vbGQgaWZlbnNsYXZlIGFuZCBuZXcvb2xkIGJvbmRpbmcuCisgKgorICogMjAwMy8xMi8wMSAtIFNobXVsaWsgSGVuIDxzaG11bGlrLmhlbiBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBDb2RlIGNsZWFudXAgYW5kIHN0eWxlIGNoYW5nZXMKKyAqCisgKiAyMDA1LzA1LzA1IC0gSmFzb24gR2FibGVyIDxqeWdhYmxlciBhdCBsYmwgZG90IGdvdj4KKyAqICAgICAgLSBhZGRlZCBkZWZpbml0aW9ucyBmb3IgdmFyaW91cyBYT1IgaGFzaGluZyBwb2xpY2llcworICovCisKKyNpZm5kZWYgX0xJTlVYX0lGX0JPTkRJTkdfSAorI2RlZmluZSBfTElOVVhfSUZfQk9ORElOR19ICisKKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKworLyogdXNlcmxhbmQgLSBrZXJuZWwgQUJJIHZlcnNpb24gKDIwMDMvMDUvMDgpICovCisjZGVmaW5lIEJPTkRfQUJJX1ZFUlNJT04gMgorCisvKgorICogV2UgY2FuIHJlbW92ZSB0aGVzZSBpb2N0bCBkZWZpbml0aW9ucyBpbiAyLjUuICBQZW9wbGUgc2hvdWxkIHVzZSB0aGUKKyAqIFNJT0MqKiogdmVyc2lvbnMgb2YgdGhlbSBpbnN0ZWFkCisgKi8KKyNkZWZpbmUgQk9ORF9FTlNMQVZFX09MRAkJKFNJT0NERVZQUklWQVRFKQorI2RlZmluZSBCT05EX1JFTEVBU0VfT0xECQkoU0lPQ0RFVlBSSVZBVEUgKyAxKQorI2RlZmluZSBCT05EX1NFVEhXQUREUl9PTEQJCShTSU9DREVWUFJJVkFURSArIDIpCisjZGVmaW5lIEJPTkRfU0xBVkVfSU5GT19RVUVSWV9PTEQJKFNJT0NERVZQUklWQVRFICsgMTEpCisjZGVmaW5lIEJPTkRfSU5GT19RVUVSWV9PTEQJCShTSU9DREVWUFJJVkFURSArIDEyKQorI2RlZmluZSBCT05EX0NIQU5HRV9BQ1RJVkVfT0xECQkoU0lPQ0RFVlBSSVZBVEUgKyAxMykKKworI2RlZmluZSBCT05EX0NIRUNLX01JSV9TVEFUVVMJKFNJT0NHTUlJUEhZKQorCisjZGVmaW5lIEJPTkRfTU9ERV9ST1VORFJPQklOCTAKKyNkZWZpbmUgQk9ORF9NT0RFX0FDVElWRUJBQ0tVUAkxCisjZGVmaW5lIEJPTkRfTU9ERV9YT1IJCTIKKyNkZWZpbmUgQk9ORF9NT0RFX0JST0FEQ0FTVAkzCisjZGVmaW5lIEJPTkRfTU9ERV84MDIzQUQgICAgICAgIDQKKyNkZWZpbmUgQk9ORF9NT0RFX1RMQiAgICAgICAgICAgNQorI2RlZmluZSBCT05EX01PREVfQUxCCQk2IC8qIFRMQiArIFJMQiAocmVjZWl2ZSBsb2FkIGJhbGFuY2luZykgKi8KKworLyogZWFjaCBzbGF2ZSdzIGxpbmsgaGFzIDQgc3RhdGVzICovCisjZGVmaW5lIEJPTkRfTElOS19VUCAgICAwICAgICAgICAgICAvKiBsaW5rIGlzIHVwIGFuZCBydW5uaW5nICovCisjZGVmaW5lIEJPTkRfTElOS19GQUlMICAxICAgICAgICAgICAvKiBsaW5rIGhhcyBqdXN0IGdvbmUgZG93biAqLworI2RlZmluZSBCT05EX0xJTktfRE9XTiAgMiAgICAgICAgICAgLyogbGluayBoYXMgYmVlbiBkb3duIGZvciB0b28gbG9uZyB0aW1lICovCisjZGVmaW5lIEJPTkRfTElOS19CQUNLICAzICAgICAgICAgICAvKiBsaW5rIGlzIGdvaW5nIGJhY2sgKi8KKworLyogZWFjaCBzbGF2ZSBoYXMgc2V2ZXJhbCBzdGF0ZXMgKi8KKyNkZWZpbmUgQk9ORF9TVEFURV9BQ1RJVkUgICAgICAgMCAgIC8qIGxpbmsgaXMgYWN0aXZlICovCisjZGVmaW5lIEJPTkRfU1RBVEVfQkFDS1VQICAgICAgIDEgICAvKiBsaW5rIGlzIGJhY2t1cCAqLworCisjZGVmaW5lIEJPTkRfREVGQVVMVF9NQVhfQk9ORFMgIDEgICAvKiBEZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIGRldmljZXMgdG8gc3VwcG9ydCAqLworCisjZGVmaW5lIEJPTkRfREVGQVVMVF9UWF9RVUVVRVMgMTYgICAvKiBEZWZhdWx0IG51bWJlciBvZiB0eCBxdWV1ZXMgcGVyIGRldmljZSAqLworCisjZGVmaW5lIEJPTkRfREVGQVVMVF9SRVNFTkRfSUdNUAkxIC8qIERlZmF1bHQgbnVtYmVyIG9mIElHTVAgbWVtYmVyc2hpcCByZXBvcnRzICovCisKKy8qIGhhc2hpbmcgdHlwZXMgKi8KKyNkZWZpbmUgQk9ORF9YTUlUX1BPTElDWV9MQVlFUjIJCTAgLyogbGF5ZXIgMiAoTUFDIG9ubHkpLCBkZWZhdWx0ICovCisjZGVmaW5lIEJPTkRfWE1JVF9QT0xJQ1lfTEFZRVIzNAkxIC8qIGxheWVyIDMrNCAoSVAgXiAoVENQIHx8IFVEUCkpICovCisjZGVmaW5lIEJPTkRfWE1JVF9QT0xJQ1lfTEFZRVIyMwkyIC8qIGxheWVyIDIrMyAoSVAgXiBNQUMpICovCisKK3R5cGVkZWYgc3RydWN0IGlmYm9uZCB7CisJX19zMzIgYm9uZF9tb2RlOworCV9fczMyIG51bV9zbGF2ZXM7CisJX19zMzIgbWlpbW9uOworfSBpZmJvbmQ7CisKK3R5cGVkZWYgc3RydWN0IGlmc2xhdmUgeworCV9fczMyIHNsYXZlX2lkOyAvKiBVc2VkIGFzIGFuIElOIHBhcmFtIHRvIHRoZSBCT05EX1NMQVZFX0lORk9fUVVFUlkgaW9jdGwgKi8KKwljaGFyIHNsYXZlX25hbWVbSUZOQU1TSVpdOworCV9fczggbGluazsKKwlfX3M4IHN0YXRlOworCV9fdTMyICBsaW5rX2ZhaWx1cmVfY291bnQ7Cit9IGlmc2xhdmU7CisKK3N0cnVjdCBhZF9pbmZvIHsKKwlfX3UxNiBhZ2dyZWdhdG9yX2lkOworCV9fdTE2IHBvcnRzOworCV9fdTE2IGFjdG9yX2tleTsKKwlfX3UxNiBwYXJ0bmVyX2tleTsKKwlfX3U4IHBhcnRuZXJfc3lzdGVtW0VUSF9BTEVOXTsKK307CisKKyNlbmRpZiAvKiBfTElOVVhfSUZfQk9ORElOR19IICovCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgdmVyc2lvbi1jb250cm9sOiB0CisgKiAga2VwdC1uZXctdmVyc2lvbnM6IDUKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5MTFiNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKglMaW51eCBldGhlcm5ldCBicmlkZ2UKKyAqCisgKglBdXRob3JzOgorICoJTGVubmVydCBCdXl0ZW5oZWsJCTxidXl0ZW5oQGdudS5vcmc+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9JRl9CUklER0VfSAorI2RlZmluZSBfTElOVVhfSUZfQlJJREdFX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgU1lTRlNfQlJJREdFX0FUVFIJImJyaWRnZSIKKyNkZWZpbmUgU1lTRlNfQlJJREdFX0ZEQgkiYnJmb3J3YXJkIgorI2RlZmluZSBTWVNGU19CUklER0VfUE9SVF9TVUJESVIgImJyaWYiCisjZGVmaW5lIFNZU0ZTX0JSSURHRV9QT1JUX0FUVFIJImJycG9ydCIKKyNkZWZpbmUgU1lTRlNfQlJJREdFX1BPUlRfTElOSwkiYnJpZGdlIgorCisjZGVmaW5lIEJSQ1RMX1ZFUlNJT04gMQorCisjZGVmaW5lIEJSQ1RMX0dFVF9WRVJTSU9OIDAKKyNkZWZpbmUgQlJDVExfR0VUX0JSSURHRVMgMQorI2RlZmluZSBCUkNUTF9BRERfQlJJREdFIDIKKyNkZWZpbmUgQlJDVExfREVMX0JSSURHRSAzCisjZGVmaW5lIEJSQ1RMX0FERF9JRiA0CisjZGVmaW5lIEJSQ1RMX0RFTF9JRiA1CisjZGVmaW5lIEJSQ1RMX0dFVF9CUklER0VfSU5GTyA2CisjZGVmaW5lIEJSQ1RMX0dFVF9QT1JUX0xJU1QgNworI2RlZmluZSBCUkNUTF9TRVRfQlJJREdFX0ZPUldBUkRfREVMQVkgOAorI2RlZmluZSBCUkNUTF9TRVRfQlJJREdFX0hFTExPX1RJTUUgOQorI2RlZmluZSBCUkNUTF9TRVRfQlJJREdFX01BWF9BR0UgMTAKKyNkZWZpbmUgQlJDVExfU0VUX0FHRUlOR19USU1FIDExCisjZGVmaW5lIEJSQ1RMX1NFVF9HQ19JTlRFUlZBTCAxMgorI2RlZmluZSBCUkNUTF9HRVRfUE9SVF9JTkZPIDEzCisjZGVmaW5lIEJSQ1RMX1NFVF9CUklER0VfU1RQX1NUQVRFIDE0CisjZGVmaW5lIEJSQ1RMX1NFVF9CUklER0VfUFJJT1JJVFkgMTUKKyNkZWZpbmUgQlJDVExfU0VUX1BPUlRfUFJJT1JJVFkgMTYKKyNkZWZpbmUgQlJDVExfU0VUX1BBVEhfQ09TVCAxNworI2RlZmluZSBCUkNUTF9HRVRfRkRCX0VOVFJJRVMgMTgKKworI2RlZmluZSBCUl9TVEFURV9ESVNBQkxFRCAwCisjZGVmaW5lIEJSX1NUQVRFX0xJU1RFTklORyAxCisjZGVmaW5lIEJSX1NUQVRFX0xFQVJOSU5HIDIKKyNkZWZpbmUgQlJfU1RBVEVfRk9SV0FSRElORyAzCisjZGVmaW5lIEJSX1NUQVRFX0JMT0NLSU5HIDQKKworc3RydWN0IF9fYnJpZGdlX2luZm8geworCV9fdTY0IGRlc2lnbmF0ZWRfcm9vdDsKKwlfX3U2NCBicmlkZ2VfaWQ7CisJX191MzIgcm9vdF9wYXRoX2Nvc3Q7CisJX191MzIgbWF4X2FnZTsKKwlfX3UzMiBoZWxsb190aW1lOworCV9fdTMyIGZvcndhcmRfZGVsYXk7CisJX191MzIgYnJpZGdlX21heF9hZ2U7CisJX191MzIgYnJpZGdlX2hlbGxvX3RpbWU7CisJX191MzIgYnJpZGdlX2ZvcndhcmRfZGVsYXk7CisJX191OCB0b3BvbG9neV9jaGFuZ2U7CisJX191OCB0b3BvbG9neV9jaGFuZ2VfZGV0ZWN0ZWQ7CisJX191OCByb290X3BvcnQ7CisJX191OCBzdHBfZW5hYmxlZDsKKwlfX3UzMiBhZ2VpbmdfdGltZTsKKwlfX3UzMiBnY19pbnRlcnZhbDsKKwlfX3UzMiBoZWxsb190aW1lcl92YWx1ZTsKKwlfX3UzMiB0Y25fdGltZXJfdmFsdWU7CisJX191MzIgdG9wb2xvZ3lfY2hhbmdlX3RpbWVyX3ZhbHVlOworCV9fdTMyIGdjX3RpbWVyX3ZhbHVlOworfTsKKworc3RydWN0IF9fcG9ydF9pbmZvIHsKKwlfX3U2NCBkZXNpZ25hdGVkX3Jvb3Q7CisJX191NjQgZGVzaWduYXRlZF9icmlkZ2U7CisJX191MTYgcG9ydF9pZDsKKwlfX3UxNiBkZXNpZ25hdGVkX3BvcnQ7CisJX191MzIgcGF0aF9jb3N0OworCV9fdTMyIGRlc2lnbmF0ZWRfY29zdDsKKwlfX3U4IHN0YXRlOworCV9fdTggdG9wX2NoYW5nZV9hY2s7CisJX191OCBjb25maWdfcGVuZGluZzsKKwlfX3U4IHVudXNlZDA7CisJX191MzIgbWVzc2FnZV9hZ2VfdGltZXJfdmFsdWU7CisJX191MzIgZm9yd2FyZF9kZWxheV90aW1lcl92YWx1ZTsKKwlfX3UzMiBob2xkX3RpbWVyX3ZhbHVlOworfTsKKworc3RydWN0IF9fZmRiX2VudHJ5IHsKKwlfX3U4IG1hY19hZGRyWzZdOworCV9fdTggcG9ydF9ubzsKKwlfX3U4IGlzX2xvY2FsOworCV9fdTMyIGFnZWluZ190aW1lcl92YWx1ZTsKKwlfX3U4IHBvcnRfaGk7CisJX191OCBwYWQwOworCV9fdTE2IHVudXNlZDsKK307CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2NhYmxlbW9kZW0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfY2FibGVtb2RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYTEwMDcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2NhYmxlbW9kZW0uaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9MSU5VWF9DQUJMRU1PREVNX0hfCisjZGVmaW5lIF9MSU5VWF9DQUJMRU1PREVNX0hfCisvKgorICoJCUF1dGhvcjogRnJhbmNvIFZlbnR1cmkgPGZ2ZW50dXJpQG1lZGlhb25lLm5ldD4KKyAqCQlDb3B5cmlnaHQgMTk5OCBGcmFuY28gVmVudHVyaQorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKKyAqCQlhbmQvb3IgIG1vZGlmeSBpdCB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwKKyAqCQlQdWJsaWMgIExpY2Vuc2UgYXMgIHB1Ymxpc2hlZCAgYnkgIHRoZSAgRnJlZSAgU29mdHdhcmUKKyAqCQlGb3VuZGF0aW9uOyAgZWl0aGVyICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAoYXQKKyAqCQl5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyogc29tZSB1c2VmdWwgZGVmaW5lcyBmb3Igc2IxMDAwLmMgZSBjbWNvbmZpZy5jIC0gZnYgKi8KKyNkZWZpbmUgU0lPQ0dDTVNUQVRTCQlTSU9DREVWUFJJVkFURSswCS8qIGdldCBjYWJsZSBtb2RlbSBzdGF0cyAqLworI2RlZmluZSBTSU9DR0NNRklSTVdBUkUJCVNJT0NERVZQUklWQVRFKzEJLyogZ2V0IGNtIGZpcm13YXJlIHZlcnNpb24gKi8KKyNkZWZpbmUgU0lPQ0dDTUZSRVFVRU5DWQlTSU9DREVWUFJJVkFURSsyCS8qIGdldCBjYWJsZSBtb2RlbSBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgU0lPQ1NDTUZSRVFVRU5DWQlTSU9DREVWUFJJVkFURSszCS8qIHNldCBjYWJsZSBtb2RlbSBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgU0lPQ0dDTVBJRFMJCQlTSU9DREVWUFJJVkFURSs0CS8qIGdldCBjYWJsZSBtb2RlbSBQSURzICovCisjZGVmaW5lIFNJT0NTQ01QSURTCQkJU0lPQ0RFVlBSSVZBVEUrNQkvKiBzZXQgY2FibGUgbW9kZW0gUElEcyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfZWMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDdlZGUxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9lYy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qIERlZmluaXRpb25zIGZvciBFY29uZXQgc29ja2V0cy4gKi8KKworI2lmbmRlZiBfX0xJTlVYX0lGX0VDCisjZGVmaW5lIF9fTElOVVhfSUZfRUMKKworLyogVXNlciB2aXNpYmxlIHN0dWZmLiBHbGliYyBwcm92aWRlcyBpdHMgb3duIGJ1dCBsaWJjNSBmb2xrIHdpbGwgdXNlIHRoZXNlICovCisKK3N0cnVjdCBlY19hZGRyIHsKKyAgdW5zaWduZWQgY2hhciBzdGF0aW9uOwkJLyogU3RhdGlvbiBudW1iZXIuICAqLworICB1bnNpZ25lZCBjaGFyIG5ldDsJCQkvKiBOZXR3b3JrIG51bWJlci4gICovCit9OworCitzdHJ1Y3Qgc29ja2FkZHJfZWMgeworICB1bnNpZ25lZCBzaG9ydCBzZWNfZmFtaWx5OworICB1bnNpZ25lZCBjaGFyIHBvcnQ7CQkJLyogUG9ydCBudW1iZXIuICAqLworICB1bnNpZ25lZCBjaGFyIGNiOwkJCS8qIENvbnRyb2wvZmxhZyBieXRlLiAgKi8KKyAgdW5zaWduZWQgY2hhciB0eXBlOwkJCS8qIFR5cGUgb2YgbWVzc2FnZS4gICovCisgIHN0cnVjdCBlY19hZGRyIGFkZHI7CisgIHVuc2lnbmVkIGxvbmcgY29va2llOworfTsKKworI2RlZmluZSBFQ1RZUEVfUEFDS0VUX1JFQ0VJVkVECQkwCS8qIFBhY2tldCByZWNlaXZlZCAqLworI2RlZmluZSBFQ1RZUEVfVFJBTlNNSVRfU1RBVFVTCQkweDEwCS8qIFRyYW5zbWl0IGNvbXBsZXRlZCwgCisJCQkJCQkgICBsb3cgbmliYmxlIGhvbGRzIHN0YXR1cyAqLworCisjZGVmaW5lIEVDVFlQRV9UUkFOU01JVF9PSwkJMQorI2RlZmluZSBFQ1RZUEVfVFJBTlNNSVRfTk9UX0xJU1RFTklORwkyCisjZGVmaW5lIEVDVFlQRV9UUkFOU01JVF9ORVRfRVJST1IJMworI2RlZmluZSBFQ1RZUEVfVFJBTlNNSVRfTk9fQ0xPQ0sJNAorI2RlZmluZSBFQ1RZUEVfVFJBTlNNSVRfTElORV9KQU1NRUQJNQorI2RlZmluZSBFQ1RZUEVfVFJBTlNNSVRfTk9UX1BSRVNFTlQJNgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9lcWwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfZXFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiOTRlYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfZXFsLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIEVxdWFsaXplciBMb2FkLWJhbGFuY2VyIGZvciBzZXJpYWwgbmV0d29yayBpbnRlcmZhY2VzLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMTk5NSBTaW1vbiAiR3VydSBBbGVwaC1OdWxsIiBKYW5lcworICogTkNNOiBOZXR3b3JrIGFuZCBDb21tdW5pY2F0aW9ucyBNYW5hZ2VtZW50LCBJbmMuCisgKgorICoKKyAqCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKiAKKyAqIFRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgc2ltb25AbmNtLmNvbSwgb3IgQy9PCisgKiAgICBOQ00KKyAqICAgIEF0dG46IFNpbW9uIEphbmVzCisgKiAgICA2ODAzIFdoaXR0aWVyIEF2ZQorICogICAgTWNMZWFuIFZBIDIyMTAxCisgKiAgICBQaG9uZTogMS03MDMtODQ3LTAwNDAgZXh0IDEwMworICovCisKKyNpZm5kZWYgX0xJTlVYX0lGX0VRTF9ICisjZGVmaW5lIF9MSU5VWF9JRl9FUUxfSAorCisjZGVmaW5lIEVRTF9ERUZBVUxUX1NMQVZFX1BSSU9SSVRZIDI4ODAwCisjZGVmaW5lIEVRTF9ERUZBVUxUX01BWF9TTEFWRVMgICAgIDQKKyNkZWZpbmUgRVFMX0RFRkFVTFRfTVRVICAgICAgICAgICAgNTc2CisjZGVmaW5lIEVRTF9ERUZBVUxUX1JFU0NIRURfSVZBTCAgIDEwMAorCisjZGVmaW5lIEVRTF9FTlNMQVZFICAgICAoU0lPQ0RFVlBSSVZBVEUpCisjZGVmaW5lIEVRTF9FTUFOQ0lQQVRFICAoU0lPQ0RFVlBSSVZBVEUgKyAxKQorCisjZGVmaW5lIEVRTF9HRVRTTEFWRUNGRyAoU0lPQ0RFVlBSSVZBVEUgKyAyKQorI2RlZmluZSBFUUxfU0VUU0xBVkVDRkcgKFNJT0NERVZQUklWQVRFICsgMykKKworI2RlZmluZSBFUUxfR0VUTUFTVFJDRkcgKFNJT0NERVZQUklWQVRFICsgNCkKKyNkZWZpbmUgRVFMX1NFVE1BU1RSQ0ZHIChTSU9DREVWUFJJVkFURSArIDUpCisKKwordHlwZWRlZiBzdHJ1Y3QgbWFzdGVyX2NvbmZpZyB7CisJY2hhcgltYXN0ZXJfbmFtZVsxNl07CisJaW50CW1heF9zbGF2ZXM7CisJaW50CW1pbl9zbGF2ZXM7Cit9IG1hc3Rlcl9jb25maWdfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc2xhdmVfY29uZmlnIHsKKwljaGFyCXNsYXZlX25hbWVbMTZdOworCWxvbmcJcHJpb3JpdHk7Cit9IHNsYXZlX2NvbmZpZ190OworCit0eXBlZGVmIHN0cnVjdCBzbGF2aW5nX3JlcXVlc3QgeworCWNoYXIJc2xhdmVfbmFtZVsxNl07CisJbG9uZwlwcmlvcml0eTsKK30gc2xhdmluZ19yZXF1ZXN0X3Q7CisKKworI2VuZGlmIC8qIF9MSU5VWF9FUUxfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9ldGhlci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9ldGhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MDE1YmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2V0aGVyLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJR2xvYmFsIGRlZmluaXRpb25zIGZvciB0aGUgRXRoZXJuZXQgSUVFRSA4MDIuMyBpbnRlcmZhY2UuCisgKgorICogVmVyc2lvbjoJQCgjKWlmX2V0aGVyLmgJMS4wLjFhCTAyLzA4Lzk0CisgKgorICogQXV0aG9yOglGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCQlEb25hbGQgQmVja2VyLCA8YmVja2VyQHN1cGVyLm9yZz4KKyAqCQlBbGFuIENveCwgPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KKyAqCQlTdGV2ZSBXaGl0ZWhvdXNlLCA8Z3c3cnJtQGVlc2hhY2szLnN3YW4uYWMudWs+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfSUZfRVRIRVJfSAorI2RlZmluZSBfTElOVVhfSUZfRVRIRVJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqCUlFRUUgODAyLjMgRXRoZXJuZXQgbWFnaWMgY29uc3RhbnRzLiAgVGhlIGZyYW1lIHNpemVzIG9taXQgdGhlIHByZWFtYmxlCisgKglhbmQgRkNTL0NSQyAoZnJhbWUgY2hlY2sgc2VxdWVuY2UpLgorICovCisKKyNkZWZpbmUgRVRIX0FMRU4JNgkJLyogT2N0ZXRzIGluIG9uZSBldGhlcm5ldCBhZGRyCSAqLworI2RlZmluZSBFVEhfSExFTgkxNAkJLyogVG90YWwgb2N0ZXRzIGluIGhlYWRlci4JICovCisjZGVmaW5lIEVUSF9aTEVOCTYwCQkvKiBNaW4uIG9jdGV0cyBpbiBmcmFtZSBzYW5zIEZDUyAqLworI2RlZmluZSBFVEhfREFUQV9MRU4JMTUwMAkJLyogTWF4LiBvY3RldHMgaW4gcGF5bG9hZAkgKi8KKyNkZWZpbmUgRVRIX0ZSQU1FX0xFTgkxNTE0CQkvKiBNYXguIG9jdGV0cyBpbiBmcmFtZSBzYW5zIEZDUyAqLworI2RlZmluZSBFVEhfRkNTX0xFTgk0CQkvKiBPY3RldHMgaW4gdGhlIEZDUwkJICovCisKKy8qCisgKglUaGVzZSBhcmUgdGhlIGRlZmluZWQgRXRoZXJuZXQgUHJvdG9jb2wgSUQncy4KKyAqLworCisjZGVmaW5lIEVUSF9QX0xPT1AJMHgwMDYwCQkvKiBFdGhlcm5ldCBMb29wYmFjayBwYWNrZXQJKi8KKyNkZWZpbmUgRVRIX1BfUFVQCTB4MDIwMAkJLyogWGVyb3ggUFVQIHBhY2tldAkJKi8KKyNkZWZpbmUgRVRIX1BfUFVQQVQJMHgwMjAxCQkvKiBYZXJveCBQVVAgQWRkciBUcmFucyBwYWNrZXQJKi8KKyNkZWZpbmUgRVRIX1BfSVAJMHgwODAwCQkvKiBJbnRlcm5ldCBQcm90b2NvbCBwYWNrZXQJKi8KKyNkZWZpbmUgRVRIX1BfWDI1CTB4MDgwNQkJLyogQ0NJVFQgWC4yNQkJCSovCisjZGVmaW5lIEVUSF9QX0FSUAkweDA4MDYJCS8qIEFkZHJlc3MgUmVzb2x1dGlvbiBwYWNrZXQJKi8KKyNkZWZpbmUJRVRIX1BfQlBRCTB4MDhGRgkJLyogRzhCUFEgQVguMjUgRXRoZXJuZXQgUGFja2V0CVsgTk9UIEFOIE9GRklDSUFMTFkgUkVHSVNURVJFRCBJRCBdICovCisjZGVmaW5lIEVUSF9QX0lFRUVQVVAJMHgwYTAwCQkvKiBYZXJveCBJRUVFODAyLjMgUFVQIHBhY2tldCAqLworI2RlZmluZSBFVEhfUF9JRUVFUFVQQVQJMHgwYTAxCQkvKiBYZXJveCBJRUVFODAyLjMgUFVQIEFkZHIgVHJhbnMgcGFja2V0ICovCisjZGVmaW5lIEVUSF9QX0RFQyAgICAgICAweDYwMDAgICAgICAgICAgLyogREVDIEFzc2lnbmVkIHByb3RvICAgICAgICAgICAqLworI2RlZmluZSBFVEhfUF9ETkFfREwgICAgMHg2MDAxICAgICAgICAgIC8qIERFQyBETkEgRHVtcC9Mb2FkICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVRIX1BfRE5BX1JDICAgIDB4NjAwMiAgICAgICAgICAvKiBERUMgRE5BIFJlbW90ZSBDb25zb2xlICAgICAgICovCisjZGVmaW5lIEVUSF9QX0ROQV9SVCAgICAweDYwMDMgICAgICAgICAgLyogREVDIEROQSBSb3V0aW5nICAgICAgICAgICAgICAqLworI2RlZmluZSBFVEhfUF9MQVQgICAgICAgMHg2MDA0ICAgICAgICAgIC8qIERFQyBMQVQgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVRIX1BfRElBRyAgICAgIDB4NjAwNSAgICAgICAgICAvKiBERUMgRGlhZ25vc3RpY3MgICAgICAgICAgICAgICovCisjZGVmaW5lIEVUSF9QX0NVU1QgICAgICAweDYwMDYgICAgICAgICAgLyogREVDIEN1c3RvbWVyIHVzZSAgICAgICAgICAgICAqLworI2RlZmluZSBFVEhfUF9TQ0EgICAgICAgMHg2MDA3ICAgICAgICAgIC8qIERFQyBTeXN0ZW1zIENvbW1zIEFyY2ggICAgICAgKi8KKyNkZWZpbmUgRVRIX1BfVEVCCTB4NjU1OAkJLyogVHJhbnMgRXRoZXIgQnJpZGdpbmcJCSovCisjZGVmaW5lIEVUSF9QX1JBUlAgICAgICAweDgwMzUJCS8qIFJldmVyc2UgQWRkciBSZXMgcGFja2V0CSovCisjZGVmaW5lIEVUSF9QX0FUQUxLCTB4ODA5QgkJLyogQXBwbGV0YWxrIEREUAkJKi8KKyNkZWZpbmUgRVRIX1BfQUFSUAkweDgwRjMJCS8qIEFwcGxldGFsayBBQVJQCQkqLworI2RlZmluZSBFVEhfUF84MDIxUQkweDgxMDAgICAgICAgICAgLyogODAyLjFRIFZMQU4gRXh0ZW5kZWQgSGVhZGVyICAqLworI2RlZmluZSBFVEhfUF9JUFgJMHg4MTM3CQkvKiBJUFggb3ZlciBESVgJCQkqLworI2RlZmluZSBFVEhfUF9JUFY2CTB4ODZERAkJLyogSVB2NiBvdmVyIGJsdWVib29rCQkqLworI2RlZmluZSBFVEhfUF9QQVVTRQkweDg4MDgJCS8qIElFRUUgUGF1c2UgZnJhbWVzLiBTZWUgODAyLjMgMzFCICovCisjZGVmaW5lIEVUSF9QX1NMT1cJMHg4ODA5CQkvKiBTbG93IFByb3RvY29sLiBTZWUgODAyLjNhZCA0M0IgKi8KKyNkZWZpbmUgRVRIX1BfV0NDUAkweDg4M0UJCS8qIFdlYi1jYWNoZSBjb29yZGluYXRpb24gcHJvdG9jb2wKKwkJCQkJICogZGVmaW5lZCBpbiBkcmFmdC13aWxzb24td3JlYy13Y2NwLXYyLTAwLnR4dCAqLworI2RlZmluZSBFVEhfUF9QUFBfRElTQwkweDg4NjMJCS8qIFBQUG9FIGRpc2NvdmVyeSBtZXNzYWdlcyAgICAgKi8KKyNkZWZpbmUgRVRIX1BfUFBQX1NFUwkweDg4NjQJCS8qIFBQUG9FIHNlc3Npb24gbWVzc2FnZXMJKi8KKyNkZWZpbmUgRVRIX1BfTVBMU19VQwkweDg4NDcJCS8qIE1QTFMgVW5pY2FzdCB0cmFmZmljCQkqLworI2RlZmluZSBFVEhfUF9NUExTX01DCTB4ODg0OAkJLyogTVBMUyBNdWx0aWNhc3QgdHJhZmZpYwkqLworI2RlZmluZSBFVEhfUF9BVE1NUE9BCTB4ODg0YwkJLyogTXVsdGlQcm90b2NvbCBPdmVyIEFUTQkqLworI2RlZmluZSBFVEhfUF9MSU5LX0NUTAkweDg4NmMJCS8qIEhQTkEsIHdsYW4gbGluayBsb2NhbCB0dW5uZWwgKi8KKyNkZWZpbmUgRVRIX1BfQVRNRkFURQkweDg4ODQJCS8qIEZyYW1lLWJhc2VkIEFUTSBUcmFuc3BvcnQKKwkJCQkJICogb3ZlciBFdGhlcm5ldAorCQkJCQkgKi8KKyNkZWZpbmUgRVRIX1BfUEFFCTB4ODg4RQkJLyogUG9ydCBBY2Nlc3MgRW50aXR5IChJRUVFIDgwMi4xWCkgKi8KKyNkZWZpbmUgRVRIX1BfQU9FCTB4ODhBMgkJLyogQVRBIG92ZXIgRXRoZXJuZXQJCSovCisjZGVmaW5lIEVUSF9QXzgwMjFBRAkweDg4QTggICAgICAgICAgLyogODAyLjFhZCBTZXJ2aWNlIFZMQU4JCSovCisjZGVmaW5lIEVUSF9QX1RJUEMJMHg4OENBCQkvKiBUSVBDIAkJCSovCisjZGVmaW5lIEVUSF9QXzgwMjFBSAkweDg4RTcgICAgICAgICAgLyogODAyLjFhaCBCYWNrYm9uZSBTZXJ2aWNlIFRhZyAqLworI2RlZmluZSBFVEhfUF8xNTg4CTB4ODhGNwkJLyogSUVFRSAxNTg4IFRpbWVzeW5jICovCisjZGVmaW5lIEVUSF9QX0ZDT0UJMHg4OTA2CQkvKiBGaWJyZSBDaGFubmVsIG92ZXIgRXRoZXJuZXQgICovCisjZGVmaW5lIEVUSF9QX1RETFMJMHg4OTBEICAgICAgICAgIC8qIFRETFMgKi8KKyNkZWZpbmUgRVRIX1BfRklQCTB4ODkxNAkJLyogRkNvRSBJbml0aWFsaXphdGlvbiBQcm90b2NvbCAqLworI2RlZmluZSBFVEhfUF9RSU5RMQkweDkxMDAJCS8qIGRlcHJlY2F0ZWQgUWluUSBWTEFOIFsgTk9UIEFOIE9GRklDSUFMTFkgUkVHSVNURVJFRCBJRCBdICovCisjZGVmaW5lIEVUSF9QX1FJTlEyCTB4OTIwMAkJLyogZGVwcmVjYXRlZCBRaW5RIFZMQU4gWyBOT1QgQU4gT0ZGSUNJQUxMWSBSRUdJU1RFUkVEIElEIF0gKi8KKyNkZWZpbmUgRVRIX1BfUUlOUTMJMHg5MzAwCQkvKiBkZXByZWNhdGVkIFFpblEgVkxBTiBbIE5PVCBBTiBPRkZJQ0lBTExZIFJFR0lTVEVSRUQgSUQgXSAqLworI2RlZmluZSBFVEhfUF9FRFNBCTB4REFEQQkJLyogRXRoZXJ0eXBlIERTQSBbIE5PVCBBTiBPRkZJQ0lBTExZIFJFR0lTVEVSRUQgSUQgXSAqLworI2RlZmluZSBFVEhfUF9BRl9JVUNWICAgMHhGQkZCCQkvKiBJQk0gYWZfaXVjdiBbIE5PVCBBTiBPRkZJQ0lBTExZIFJFR0lTVEVSRUQgSUQgXSAqLworCisvKgorICoJTm9uIERJWCB0eXBlcy4gV29uJ3QgY2xhc2ggZm9yIDE1MDAgdHlwZXMuCisgKi8KKworI2RlZmluZSBFVEhfUF84MDJfMwkweDAwMDEJCS8qIER1bW15IHR5cGUgZm9yIDgwMi4zIGZyYW1lcyAgKi8KKyNkZWZpbmUgRVRIX1BfQVgyNQkweDAwMDIJCS8qIER1bW15IHByb3RvY29sIGlkIGZvciBBWC4yNSAgKi8KKyNkZWZpbmUgRVRIX1BfQUxMCTB4MDAwMwkJLyogRXZlcnkgcGFja2V0IChiZSBjYXJlZnVsISEhKSAqLworI2RlZmluZSBFVEhfUF84MDJfMgkweDAwMDQJCS8qIDgwMi4yIGZyYW1lcyAJCSovCisjZGVmaW5lIEVUSF9QX1NOQVAJMHgwMDA1CQkvKiBJbnRlcm5hbCBvbmx5CQkqLworI2RlZmluZSBFVEhfUF9ERENNUCAgICAgMHgwMDA2ICAgICAgICAgIC8qIERFQyBERENNUDogSW50ZXJuYWwgb25seSAgICAgKi8KKyNkZWZpbmUgRVRIX1BfV0FOX1BQUCAgIDB4MDAwNyAgICAgICAgICAvKiBEdW1teSB0eXBlIGZvciBXQU4gUFBQIGZyYW1lcyovCisjZGVmaW5lIEVUSF9QX1BQUF9NUCAgICAweDAwMDggICAgICAgICAgLyogRHVtbXkgdHlwZSBmb3IgUFBQIE1QIGZyYW1lcyAqLworI2RlZmluZSBFVEhfUF9MT0NBTFRBTEsgMHgwMDA5CQkvKiBMb2NhbHRhbGsgcHNldWRvIHR5cGUgCSovCisjZGVmaW5lIEVUSF9QX0NBTgkweDAwMEMJCS8qIENvbnRyb2xsZXIgQXJlYSBOZXR3b3JrICAgICAgKi8KKyNkZWZpbmUgRVRIX1BfUFBQVEFMSwkweDAwMTAJCS8qIER1bW15IHR5cGUgZm9yIEF0YWxrIG92ZXIgUFBQKi8KKyNkZWZpbmUgRVRIX1BfVFJfODAyXzIJMHgwMDExCQkvKiA4MDIuMiBmcmFtZXMgCQkqLworI2RlZmluZSBFVEhfUF9NT0JJVEVYCTB4MDAxNQkJLyogTW9iaXRleCAoa2F6QGNhZmUubmV0KQkqLworI2RlZmluZSBFVEhfUF9DT05UUk9MCTB4MDAxNgkJLyogQ2FyZCBzcGVjaWZpYyBjb250cm9sIGZyYW1lcyAqLworI2RlZmluZSBFVEhfUF9JUkRBCTB4MDAxNwkJLyogTGludXgtSXJEQQkJCSovCisjZGVmaW5lIEVUSF9QX0VDT05FVAkweDAwMTgJCS8qIEFjb3JuIEVjb25ldAkJCSovCisjZGVmaW5lIEVUSF9QX0hETEMJMHgwMDE5CQkvKiBIRExDIGZyYW1lcwkJCSovCisjZGVmaW5lIEVUSF9QX0FSQ05FVAkweDAwMUEJCS8qIDFBIGZvciBBcmNOZXQgOi0pICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVRIX1BfRFNBCTB4MDAxQgkJLyogRGlzdHJpYnV0ZWQgU3dpdGNoIEFyY2guCSovCisjZGVmaW5lIEVUSF9QX1RSQUlMRVIJMHgwMDFDCQkvKiBUcmFpbGVyIHN3aXRjaCB0YWdnaW5nCSovCisjZGVmaW5lIEVUSF9QX1BIT05FVAkweDAwRjUJCS8qIE5va2lhIFBob25ldCBmcmFtZXMgICAgICAgICAgKi8KKyNkZWZpbmUgRVRIX1BfSUVFRTgwMjE1NCAweDAwRjYJCS8qIElFRUU4MDIuMTUuNCBmcmFtZQkJKi8KKyNkZWZpbmUgRVRIX1BfQ0FJRgkweDAwRjcJCS8qIFNULUVyaWNzc29uIENBSUYgcHJvdG9jb2wJKi8KKworLyoKKyAqCVRoaXMgaXMgYW4gRXRoZXJuZXQgZnJhbWUgaGVhZGVyLgorICovCisKK3N0cnVjdCBldGhoZHIgeworCXVuc2lnbmVkIGNoYXIJaF9kZXN0W0VUSF9BTEVOXTsJLyogZGVzdGluYXRpb24gZXRoIGFkZHIJKi8KKwl1bnNpZ25lZCBjaGFyCWhfc291cmNlW0VUSF9BTEVOXTsJLyogc291cmNlIGV0aGVyIGFkZHIJKi8KKwlfX2JlMTYJCWhfcHJvdG87CQkvKiBwYWNrZXQgdHlwZSBJRCBmaWVsZAkqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCisjZW5kaWYJLyogX0xJTlVYX0lGX0VUSEVSX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfZmMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfZmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWQ3ZjFiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9mYy5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJR2xvYmFsIGRlZmluaXRpb25zIGZvciBGaWJyZSBDaGFubmVsLgorICoKKyAqIFZlcnNpb246CUAoIylpZl9mYy5oCTAuMAkxMS8yMC85OAorICoKKyAqIEF1dGhvcjoJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgkJRG9uYWxkIEJlY2tlciwgPGJlY2tlckBzdXBlci5vcmc+CisgKiAgICBQZXRlciBEZSBTY2hyaWp2ZXIsIDxzdHVkMTFAY2M0Lmt1bGV1dmVuLmFjLmJlPgorICoJICBWaW5lZXQgQWJyYWhhbSwgPHZtYUBpb2wudW5oLmVkdT4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfSUZfRkNfSAorI2RlZmluZSBfTElOVVhfSUZfRkNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBGQ19BTEVOCTYJCS8qIE9jdGV0cyBpbiBvbmUgZXRoZXJuZXQgYWRkcgkgKi8KKyNkZWZpbmUgRkNfSExFTiAgIChzaXplb2Yoc3RydWN0IGZjaF9oZHIpK3NpemVvZihzdHJ1Y3QgZmNsbGMpKQorI2RlZmluZSBGQ19JRF9MRU4gMwkJLyogT2N0ZXRzIGluIGEgRmlicmUgQ2hhbm5lbCBBZGRyZXNzICovCisKKy8qIExMQyBhbmQgU05BUCBjb25zdGFudHMgKi8KKyNkZWZpbmUgRVhURU5ERURfU0FQIDB4QUEKKyNkZWZpbmUgVUlfQ01EICAgICAgIDB4MDMKKworLyogVGhpcyBpcyBOT1QgdGhlIEZpYnJlIENoYW5uZWwgZnJhbWUgaGVhZGVyLiBUaGUgRkMgZnJhbWUgaGVhZGVyIGlzCisgKiAgY29uc3RydWN0ZWQgaW4gdGhlIGRyaXZlciBhcyB0aGUgVGFjaHlvbiBuZWVkcyBjZXJ0YWluIGZpZWxkcyBpbgorICogIGNlcnRhaW5zIHBvc2l0aW9ucy4gU28sIGl0IGNhbid0IGJlIGdlbmVyYWxpemVkIGhlcmUuKi8KKworc3RydWN0IGZjaF9oZHIgeworCV9fdTggIGRhZGRyW0ZDX0FMRU5dOwkJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworCV9fdTggIHNhZGRyW0ZDX0FMRU5dOwkJLyogc291cmNlIGFkZHJlc3MgKi8KK307CisKKy8qIFRoaXMgaXMgYSBGaWJyZSBDaGFubmVsIExMQyBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBmY2xsYyB7CisJX191OCAgZHNhcDsJCQkvKiBkZXN0aW5hdGlvbiBTQVAgKi8KKwlfX3U4ICBzc2FwOwkJCS8qIHNvdXJjZSBTQVAgKi8KKwlfX3U4ICBsbGM7CQkJLyogTExDIGNvbnRyb2wgZmllbGQgKi8KKwlfX3U4ICBwcm90aWRbM107CQkvKiBwcm90b2NvbCBpZCAqLworCV9fYmUxNiBldGhlcnR5cGU7CQkvKiBldGhlciB0eXBlIGZpZWxkICovCit9OworCisjZW5kaWYJLyogX0xJTlVYX0lGX0ZDX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfZmRkaS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9mZGRpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyODQ0MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfZmRkaS5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJR2xvYmFsIGRlZmluaXRpb25zIGZvciB0aGUgQU5TSSBGRERJIGludGVyZmFjZS4KKyAqCisgKiBWZXJzaW9uOglAKCMpaWZfZmRkaS5oCTEuMC4yCVNlcCAyOSAyMDA0CisgKgorICogQXV0aG9yOglMYXdyZW5jZSBWLiBTdGVmYW5pLCA8c3RlZmFuaUBsa2cuZGVjLmNvbT4KKyAqCisgKgkJaWZfZmRkaS5oIGlzIGJhc2VkIG9uIHByZXZpb3VzIGlmX2V0aGVyLmggYW5kIGlmX3RyLmggd29yayBieQorICoJCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCQkJRG9uYWxkIEJlY2tlciwgPGJlY2tlckBzdXBlci5vcmc+CisgKgkJCUFsYW4gQ294LCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgorICoJCQlTdGV2ZSBXaGl0ZWhvdXNlLCA8Z3c3cnJtQGVlc2hhY2szLnN3YW4uYWMudWs+CisgKgkJCVBldGVyIERlIFNjaHJpanZlciwgPHN0dWQxMUBjYzQua3VsZXV2ZW4uYWMuYmU+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0xJTlVYX0lGX0ZERElfSAorI2RlZmluZSBfTElOVVhfSUZfRkRESV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogIERlZmluZSBtYXggYW5kIG1pbiBsZWdhbCBzaXplcy4gIFRoZSBmcmFtZSBzaXplcyBkbyBub3QgaW5jbHVkZQorICogIDQgYnl0ZSBGQ1MvQ1JDIChmcmFtZSBjaGVjayBzZXF1ZW5jZSkuCisgKi8KKyNkZWZpbmUgRkRESV9LX0FMRU4JCQk2CQkvKiBPY3RldHMgaW4gb25lIEZEREkgYWRkcmVzcyAqLworI2RlZmluZSBGRERJX0tfODAyMl9ITEVOCTE2CQkvKiBUb3RhbCBvY3RldHMgaW4gODAyLjIgaGVhZGVyICovCisjZGVmaW5lIEZERElfS19TTkFQX0hMRU4JMjEJCS8qIFRvdGFsIG9jdGV0cyBpbiA4MDIuMiBTTkFQIGhlYWRlciAqLworI2RlZmluZSBGRERJX0tfODAyMl9aTEVOCTE2CQkvKiBNaW4gb2N0ZXRzIGluIDgwMi4yIGZyYW1lIHNhbnMgRkNTICovCisjZGVmaW5lIEZERElfS19TTkFQX1pMRU4JMjEJCS8qIE1pbiBvY3RldHMgaW4gODAyLjIgU05BUCBmcmFtZSBzYW5zIEZDUyAqLworI2RlZmluZSBGRERJX0tfODAyMl9ETEVOCTQ0NzUJLyogTWF4IG9jdGV0cyBpbiA4MDIuMiBwYXlsb2FkICovCisjZGVmaW5lIEZERElfS19TTkFQX0RMRU4JNDQ3MAkvKiBNYXggb2N0ZXRzIGluIDgwMi4yIFNOQVAgcGF5bG9hZCAqLworI2RlZmluZSBGRERJX0tfTExDX1pMRU4JCTEzCQkvKiBNaW4gb2N0ZXRzIGluIExMQyBmcmFtZSBzYW5zIEZDUyAqLworI2RlZmluZSBGRERJX0tfTExDX0xFTgkJNDQ5MQkvKiBNYXggb2N0ZXRzIGluIExMQyBmcmFtZSBzYW5zIEZDUyAqLworCisvKiBEZWZpbmUgRkRESSBGcmFtZSBDb250cm9sIChGQykgQnl0ZSB2YWx1ZXMgKi8KKyNkZWZpbmUgRkRESV9GQ19LX1ZPSUQJCQkJCTB4MDAJCisjZGVmaW5lIEZERElfRkNfS19OT05fUkVTVFJJQ1RFRF9UT0tFTgkweDgwCQorI2RlZmluZSBGRERJX0ZDX0tfUkVTVFJJQ1RFRF9UT0tFTgkJMHhDMAkKKyNkZWZpbmUgRkRESV9GQ19LX1NNVF9NSU4JCQkJMHg0MQorI2RlZmluZSBGRERJX0ZDX0tfU01UX01BWAkJICAgCQkweDRGCisjZGVmaW5lIEZERElfRkNfS19NQUNfTUlOCQkJCTB4QzEKKyNkZWZpbmUgRkRESV9GQ19LX01BQ19NQVgJCSAgCQkweENGCQorI2RlZmluZSBGRERJX0ZDX0tfQVNZTkNfTExDX01JTgkJCTB4NTAKKyNkZWZpbmUgRkRESV9GQ19LX0FTWU5DX0xMQ19ERUYJCQkweDU0CisjZGVmaW5lIEZERElfRkNfS19BU1lOQ19MTENfTUFYCQkJMHg1RgorI2RlZmluZSBGRERJX0ZDX0tfU1lOQ19MTENfTUlOCQkJMHhEMAorI2RlZmluZSBGRERJX0ZDX0tfU1lOQ19MTENfTUFYCQkJMHhENworI2RlZmluZSBGRERJX0ZDX0tfSU1QTEVNRU5UT1JfTUlOCQkweDYwCisjZGVmaW5lIEZERElfRkNfS19JTVBMRU1FTlRPUl9NQVggIAkJMHg2RgorI2RlZmluZSBGRERJX0ZDX0tfUkVTRVJWRURfTUlOCQkJMHg3MAorI2RlZmluZSBGRERJX0ZDX0tfUkVTRVJWRURfTUFYCQkJMHg3RgorCisvKiBEZWZpbmUgTExDIGFuZCBTTkFQIGNvbnN0YW50cyAqLworI2RlZmluZSBGRERJX0VYVEVOREVEX1NBUAkweEFBCisjZGVmaW5lIEZERElfVUlfQ01ECQkJMHgwMworCisvKiBEZWZpbmUgODAyLjIgVHlwZSAxIGhlYWRlciAqLworc3RydWN0IGZkZGlfODAyMl8xX2hkciB7CisJX191OAlkc2FwOwkJCQkJLyogZGVzdGluYXRpb24gc2VydmljZSBhY2Nlc3MgcG9pbnQgKi8KKwlfX3U4CXNzYXA7CQkJCQkvKiBzb3VyY2Ugc2VydmljZSBhY2Nlc3MgcG9pbnQgKi8KKwlfX3U4CWN0cmw7CQkJCQkvKiBjb250cm9sIGJ5dGUgIzEgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIERlZmluZSA4MDIuMiBUeXBlIDIgaGVhZGVyICovCitzdHJ1Y3QgZmRkaV84MDIyXzJfaGRyIHsKKwlfX3U4CWRzYXA7CQkJCQkvKiBkZXN0aW5hdGlvbiBzZXJ2aWNlIGFjY2VzcyBwb2ludCAqLworCV9fdTgJc3NhcDsJCQkJCS8qIHNvdXJjZSBzZXJ2aWNlIGFjY2VzcyBwb2ludCAqLworCV9fdTgJY3RybF8xOwkJCQkJLyogY29udHJvbCBieXRlICMxICovCisJX191OAljdHJsXzI7CQkJCQkvKiBjb250cm9sIGJ5dGUgIzIgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIERlZmluZSA4MDIuMiBTTkFQIGhlYWRlciAqLworI2RlZmluZSBGRERJX0tfT1VJX0xFTgkzCitzdHJ1Y3QgZmRkaV9zbmFwX2hkciB7CisJX191OAlkc2FwOwkJCQkJLyogYWx3YXlzIDB4QUEgKi8KKwlfX3U4CXNzYXA7CQkJCQkvKiBhbHdheXMgMHhBQSAqLworCV9fdTgJY3RybDsJCQkJCS8qIGFsd2F5cyAweDAzICovCisJX191OAlvdWlbRkRESV9LX09VSV9MRU5dOwkvKiBvcmdhbml6YXRpb25hbCB1bml2ZXJzYWwgaWQgKi8KKwlfX2JlMTYJZXRoZXJ0eXBlOwkJCQkvKiBwYWNrZXQgdHlwZSBJRCBmaWVsZCAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogRGVmaW5lIEZEREkgTExDIGZyYW1lIGhlYWRlciAqLworc3RydWN0IGZkZGloZHIgeworCV9fdTgJZmM7CQkJCQkJLyogZnJhbWUgY29udHJvbCAqLworCV9fdTgJZGFkZHJbRkRESV9LX0FMRU5dOwkJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworCV9fdTgJc2FkZHJbRkRESV9LX0FMRU5dOwkJLyogc291cmNlIGFkZHJlc3MgKi8KKwl1bmlvbgorCQl7CisJCXN0cnVjdCBmZGRpXzgwMjJfMV9oZHIJCWxsY184MDIyXzE7CisJCXN0cnVjdCBmZGRpXzgwMjJfMl9oZHIJCWxsY184MDIyXzI7CisJCXN0cnVjdCBmZGRpX3NuYXBfaGRyCQlsbGNfc25hcDsKKwkJfSBoZHI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKyNlbmRpZgkvKiBfTElOVVhfSUZfRkRESV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2ZyYWQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfZnJhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMDk5ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2ZyYWQuaApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIERMQ0kvRlJBRAlEZWZpbml0aW9ucyBmb3IgRnJhbWUgUmVsYXkgQWNjZXNzIERldmljZXMuICBETENJIGRldmljZXMgYXJlCisgKgkJY3JlYXRlZCBmb3IgZWFjaCBETENJIGFzc29jaWF0ZWQgd2l0aCBhIEZSQUQuICBUaGUgRlJBRCBkcml2ZXIKKyAqCQlpcyBub3QgdHJ1bHkgYSBuZXR3b3JrIGRldmljZSwgYnV0IHRoZSBsb3dlciBsZXZlbCBkZXZpY2UKKyAqCQloYW5kbGVyLiAgVGhpcyBhbGxvd3Mgb3RoZXIgRlJBRCBtYW51ZmFjdHVyZXJzIHRvIHVzZSB0aGUgRExDSQorICoJCWNvZGUsIGluY2x1ZGluZyBpdHMgUkZDMTQ5MCBlbmNhcHN1bGF0aW9uIGFsb25nc2lkZSB0aGUgY3VycmVudAorICoJCWltcGxlbWVudGF0aW9uIGZvciB0aGUgU2FuZ29tYSBjYXJkcy4KKyAqCisgKiBWZXJzaW9uOglAKCMpaWZfaWZyYWQuaAkwLjE1CTMxIE1hciA5NgorICoKKyAqIEF1dGhvcjoJTWlrZSBNY0xhZ2FuIDxtaWtlLm1jbGFnYW5AbGludXgub3JnPgorICoKKyAqIENoYW5nZXM6CisgKgkJMC4xNQlNaWtlIE1jTGFnYW4JY2hhbmdlZCBzdHJ1Y3R1cmUgZGVmcyAocGFja2VkKQorICoJCQkJCXJlLWFycmFuZ2VkIGZsYWdzCisgKgkJCQkJYWRkZWQgRExDSV9SRVQgdmFycworICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0ZSQURfSF8KKyNkZWZpbmUgX0ZSQURfSF8KKworI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisKKy8qIFN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIERMQ0kgZGV2aWNlIGRyaXZlciAqLworCitzdHJ1Y3QgZGxjaV9hZGQKK3sKKyAgIGNoYXIgIGRldm5hbWVbSUZOQU1TSVpdOworICAgc2hvcnQgZGxjaTsKK307CisKKyNkZWZpbmUgRExDSV9HRVRfQ09ORgkoU0lPQ0RFVlBSSVZBVEUgKyAyKQorI2RlZmluZSBETENJX1NFVF9DT05GCShTSU9DREVWUFJJVkFURSArIDMpCisKKy8qIAorICogVGhlc2UgYXJlIHJlbGF0ZWQgdG8gdGhlIFNhbmdvbWEgU0RMQSBhbmQgc2hvdWxkIHJlbWFpbiBpbiBvcmRlci4gCisgKiBDb2RlIHdpdGhpbiB0aGUgU0RMQSBtb2R1bGUgaXMgYmFzZWQgb24gdGhlIHNwZWNpZmljcyBvZiB0aGlzIAorICogc3RydWN0dXJlLiAgQ2hhbmdlIGF0IHlvdXIgb3duIHBlcmlsLgorICovCitzdHJ1Y3QgZGxjaV9jb25mIHsKKyAgIHNob3J0IGZsYWdzOworICAgc2hvcnQgQ0lSX2Z3ZDsKKyAgIHNob3J0IEJjX2Z3ZDsKKyAgIHNob3J0IEJlX2Z3ZDsKKyAgIHNob3J0IENJUl9id2Q7CisgICBzaG9ydCBCY19id2Q7CisgICBzaG9ydCBCZV9id2Q7IAorCisvKiB0aGVzZSBhcmUgcGFydCBvZiB0aGUgc3RhdHVzIHJlYWQgKi8KKyAgIHNob3J0IFRjX2Z3ZDsKKyAgIHNob3J0IFRjX2J3ZDsKKyAgIHNob3J0IFRmX21heDsKKyAgIHNob3J0IFRiX21heDsKKworLyogYWRkIGFueSBuZXcgZmllbGRzIGhlcmUgYWJvdmUgaXMgYSBtaXJyb3Igb2Ygc2RsYV9kbGNpX2NvbmYgKi8KK307CisKKyNkZWZpbmUgRExDSV9HRVRfU0xBVkUJKFNJT0NERVZQUklWQVRFICsgNCkKKworLyogY29uZmlndXJhdGlvbiBmbGFncyBmb3IgRExDSSAqLworI2RlZmluZSBETENJX0lHTk9SRV9DSVJfT1VUCTB4MDAwMQorI2RlZmluZSBETENJX0FDQ09VTlRfQ0lSX0lOCTB4MDAwMgorI2RlZmluZSBETENJX0JVRkZFUl9JRgkJMHgwMDA4CisKKyNkZWZpbmUgRExDSV9WQUxJRF9GTEFHUwkweDAwMEIKKworLyogZGVmaW5lcyBmb3IgdGhlIGFjdHVhbCBGcmFtZSBSZWxheSBoYXJkd2FyZSAqLworI2RlZmluZSBGUkFEX0dFVF9DT05GCShTSU9DREVWUFJJVkFURSkKKyNkZWZpbmUgRlJBRF9TRVRfQ09ORgkoU0lPQ0RFVlBSSVZBVEUgKyAxKQorCisjZGVmaW5lIEZSQURfTEFTVF9JT0NUTAlGUkFEX1NFVF9DT05GCisKKy8qCisgKiBCYXNlZCBvbiB0aGUgc2V0dXAgZm9yIHRoZSBTYW5nb21hIFNETEEuICBJZiBjaGFuZ2VzIGFyZSAKKyAqIG5lY2Vzc2FyeSB0byB0aGlzIHN0cnVjdHVyZSwgYSByb3V0aW5lIHdpbGwgbmVlZCB0byBiZSAKKyAqIGFkZGVkIHRvIHRoYXQgbW9kdWxlIHRvIGNvcHkgZmllbGRzLgorICovCitzdHJ1Y3QgZnJhZF9jb25mIAoreworICAgc2hvcnQgc3RhdGlvbjsKKyAgIHNob3J0IGZsYWdzOworICAgc2hvcnQga2JhdWQ7CisgICBzaG9ydCBjbG9ja2luZzsKKyAgIHNob3J0IG10dTsKKyAgIHNob3J0IFQzOTE7CisgICBzaG9ydCBUMzkyOworICAgc2hvcnQgTjM5MTsKKyAgIHNob3J0IE4zOTI7CisgICBzaG9ydCBOMzkzOworICAgc2hvcnQgQ0lSX2Z3ZDsKKyAgIHNob3J0IEJjX2Z3ZDsKKyAgIHNob3J0IEJlX2Z3ZDsKKyAgIHNob3J0IENJUl9id2Q7CisgICBzaG9ydCBCY19id2Q7CisgICBzaG9ydCBCZV9id2Q7CisKKy8qIEFkZCBuZXcgZmllbGRzIGhlcmUsIGFib3ZlIGlzIGEgbWlycm9yIG9mIHRoZSBzZGxhX2NvbmYgKi8KKworfTsKKworI2RlZmluZSBGUkFEX1NUQVRJT05fQ1BFCTB4MDAwMAorI2RlZmluZSBGUkFEX1NUQVRJT05fTk9ERQkweDAwMDEKKworI2RlZmluZSBGUkFEX1RYX0lHTk9SRV9DSVIJMHgwMDAxCisjZGVmaW5lIEZSQURfUlhfQUNDT1VOVF9DSVIJMHgwMDAyCisjZGVmaW5lIEZSQURfRFJPUF9BQk9SVEVECTB4MDAwNAorI2RlZmluZSBGUkFEX0JVRkZFUklGCQkweDAwMDgKKyNkZWZpbmUgRlJBRF9TVEFUUwkJMHgwMDEwCisjZGVmaW5lIEZSQURfTUNJCQkweDAxMDAKKyNkZWZpbmUgRlJBRF9BVVRPRExDSQkJMHg4MDAwCisjZGVmaW5lIEZSQURfVkFMSURfRkxBR1MJMHg4MTFGCisKKyNkZWZpbmUgRlJBRF9DTE9DS19JTlQJCTB4MDAwMQorI2RlZmluZSBGUkFEX0NMT0NLX0VYVAkJMHgwMDAwCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2hpcHBpLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2hpcHBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjMDQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfaGlwcGkuaApAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlHbG9iYWwgZGVmaW5pdGlvbnMgZm9yIHRoZSBISVBQSSBpbnRlcmZhY2UuCisgKgorICogVmVyc2lvbjoJQCgjKWlmX2hpcHBpLmgJMS4wLjAJMDUvMjYvOTcKKyAqCisgKiBBdXRob3I6CUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoJCURvbmFsZCBCZWNrZXIsIDxiZWNrZXJAc3VwZXIub3JnPgorICoJCUFsYW4gQ294LCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgorICoJCVN0ZXZlIFdoaXRlaG91c2UsIDxndzdycm1AZWVzaGFjazMuc3dhbi5hYy51az4KKyAqCQlKZXMgU29yZW5zZW4sIDxKZXMuU29yZW5zZW5AY2Vybi5jaD4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworIAorI2lmbmRlZiBfTElOVVhfSUZfSElQUElfSAorI2RlZmluZSBfTElOVVhfSUZfSElQUElfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKy8qCisgKglISVBQSSBtYWdpYyBjb25zdGFudHMuCisgKi8KKworI2RlZmluZSBISVBQSV9BTEVOCTYJCS8qIEJ5dGVzIGluIG9uZSBISVBQSSBody1hZGRyCSAgICovCisjZGVmaW5lIEhJUFBJX0hMRU4Jc2l6ZW9mKHN0cnVjdCBoaXBwaV9oZHIpCisjZGVmaW5lIEhJUFBJX1pMRU4JMAkJLyogTWluLiBieXRlcyBpbiBmcmFtZSB3aXRob3V0IEZDUyAqLworI2RlZmluZSBISVBQSV9EQVRBX0xFTgk2NTI4MAkJLyogTWF4LiBieXRlcyBpbiBwYXlsb2FkCSAgICovCisjZGVmaW5lIEhJUFBJX0ZSQU1FX0xFTgkoSElQUElfREFUQV9MRU4gKyBISVBQSV9ITEVOKQorCQkJCQkvKiBNYXguIGJ5dGVzIGluIGZyYW1lIHdpdGhvdXQgRkNTICovCisKKy8qCisgKiBEZWZpbmUgTExDIGFuZCBTTkFQIGNvbnN0YW50cy4KKyAqLworI2RlZmluZSBISVBQSV9FWFRFTkRFRF9TQVAJMHhBQQorI2RlZmluZSBISVBQSV9VSV9DTUQJCTB4MDMKKworCisvKgorICoJRG8gd2UgbmVlZCB0byBsaXN0IHNvbWUgc29ydCBvZiBJRCdzIGhlcmU/CisgKi8KKworLyoKKyAqCUhJUFBJIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBkYXRhLiAKKyAqLworIAorc3RydWN0IGhpcG5ldF9zdGF0aXN0aWNzIHsKKwlpbnQJcnhfcGFja2V0czsJCS8qIHRvdGFsIHBhY2tldHMgcmVjZWl2ZWQJKi8KKwlpbnQJdHhfcGFja2V0czsJCS8qIHRvdGFsIHBhY2tldHMgdHJhbnNtaXR0ZWQJKi8KKwlpbnQJcnhfZXJyb3JzOwkJLyogYmFkIHBhY2tldHMgcmVjZWl2ZWQJCSovCisJaW50CXR4X2Vycm9yczsJCS8qIHBhY2tldCB0cmFuc21pdCBwcm9ibGVtcwkqLworCWludAlyeF9kcm9wcGVkOwkJLyogbm8gc3BhY2UgaW4gbGludXggYnVmZmVycwkqLworCWludAl0eF9kcm9wcGVkOwkJLyogbm8gc3BhY2UgYXZhaWxhYmxlIGluIGxpbnV4CSovCisKKwkvKiBkZXRhaWxlZCByeF9lcnJvcnM6ICovCisJaW50CXJ4X2xlbmd0aF9lcnJvcnM7CisJaW50CXJ4X292ZXJfZXJyb3JzOwkJLyogcmVjZWl2ZXIgcmluZyBidWZmIG92ZXJmbG93CSovCisJaW50CXJ4X2NyY19lcnJvcnM7CQkvKiByZWN2ZWQgcGt0IHdpdGggY3JjIGVycm9yCSovCisJaW50CXJ4X2ZyYW1lX2Vycm9yczsJLyogcmVjdidkIGZyYW1lIGFsaWdubWVudCBlcnJvciAqLworCWludAlyeF9maWZvX2Vycm9yczsJCS8qIHJlY3YnciBmaWZvIG92ZXJydW4JCSovCisJaW50CXJ4X21pc3NlZF9lcnJvcnM7CS8qIHJlY2VpdmVyIG1pc3NlZCBwYWNrZXQJKi8KKworCS8qIGRldGFpbGVkIHR4X2Vycm9ycyAqLworCWludAl0eF9hYm9ydGVkX2Vycm9yczsKKwlpbnQJdHhfY2Fycmllcl9lcnJvcnM7CisJaW50CXR4X2ZpZm9fZXJyb3JzOworCWludAl0eF9oZWFydGJlYXRfZXJyb3JzOworCWludAl0eF93aW5kb3dfZXJyb3JzOworfTsKKworCitzdHJ1Y3QgaGlwcGlfZnBfaGRyIHsKKyNpZiAwCisJX191OAkJdWxwOwkJCQkvKiBtdXN0IGNvbnRhaW4gNCAqLworI2lmIGRlZmluZWQgKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4CQlkMV9kYXRhX3ByZXNlbnQ6MTsJCS8qIG11c3QgYmUgMSAqLworCV9fdTgJCXN0YXJ0X2QyX2J1cnN0X2JvdW5kYXJ5OjE7CS8qIG11c3QgYmUgemVybyAqLworCV9fdTgJCXJlc2VydmVkOjY7CQkJLyogbXVzdCBiZSB6ZXJvICovCisjaWYgMAorCV9fdTE2CQlyZXNlcnZlZDE6NTsKKwlfX3UxNgkJZDFfYXJlYV9zaXplOjg7CQkJLyogbXVzdCBiZSAzICovCisJX191MTYJCWQyX29mZnNldDozOwkJCS8qIG11c3QgYmUgemVybyAqLworI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4CQlyZXNlcnZlZDo2OwkJCS8qIG11c3QgYmUgemVybyAqLworCV9fdTgJIAlzdGFydF9kMl9idXJzdF9ib3VuZGFyeToxOwkvKiBtdXN0IGJlIHplcm8gKi8KKwlfX3U4CQlkMV9kYXRhX3ByZXNlbnQ6MTsJCS8qIG11c3QgYmUgMSAqLworI2lmIDAKKwlfX3UxNgkJZDJfb2Zmc2V0OjM7CQkJLyogbXVzdCBiZSB6ZXJvICovCisJX191MTYJCWQxX2FyZWFfc2l6ZTo4OwkJCS8qIG11c3QgYmUgMyAqLworCV9fdTE2CQlyZXNlcnZlZDE6NTsJCQkvKiBtdXN0IGJlIHplcm8gKi8KKyNlbmRpZgorI2Vsc2UKKyNlcnJvcgkiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorI2Vsc2UKKwlfX2JlMzIJCWZpeGVkOworI2VuZGlmCisJX19iZTMyCQlkMl9zaXplOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGhpcHBpX2xlX2hkciB7CisjaWYgZGVmaW5lZCAoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTgJCWZjOjM7CisJX191OAkJZG91YmxlX3dpZGU6MTsKKwlfX3U4CQltZXNzYWdlX3R5cGU6NDsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTgJCW1lc3NhZ2VfdHlwZTo0OworCV9fdTgJCWRvdWJsZV93aWRlOjE7CisJX191OAkJZmM6MzsKKyNlbmRpZgorCV9fdTgJCWRlc3Rfc3dpdGNoX2FkZHJbM107CisjaWYgZGVmaW5lZCAoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTgJCWRlc3RfYWRkcl90eXBlOjQsCisJCQlzcmNfYWRkcl90eXBlOjQ7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4CQlzcmNfYWRkcl90eXBlOjQsCisJCQlkZXN0X2FkZHJfdHlwZTo0OworI2VuZGlmCisJX191OAkJc3JjX3N3aXRjaF9hZGRyWzNdOworCV9fdTE2CQlyZXNlcnZlZDsKKwlfX3U4CQlkYWRkcltISVBQSV9BTEVOXTsKKwlfX3UxNgkJbG9jYWxseV9hZG1pbmlzdGVyZWQ7CisJX191OAkJc2FkZHJbSElQUElfQUxFTl07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIEhJUFBJX09VSV9MRU4JMworLyoKKyAqIExvb2tzIGxpa2UgdGhlIGRzYXAgYW5kIHNzYXAgZmllbGRzIGhhdmUgYmVlbiBzd2FwcGVkIGJ5IG1pc3Rha2UgaW4KKyAqIFJGQyAyMDY3ICJJUCBvdmVyIEhJUFBJIi4KKyAqLworc3RydWN0IGhpcHBpX3NuYXBfaGRyIHsKKwlfX3U4CWRzYXA7CQkJLyogYWx3YXlzIDB4QUEgKi8KKwlfX3U4CXNzYXA7CQkJLyogYWx3YXlzIDB4QUEgKi8KKwlfX3U4CWN0cmw7CQkJLyogYWx3YXlzIDB4MDMgKi8KKwlfX3U4CW91aVtISVBQSV9PVUlfTEVOXTsJLyogb3JnYW5pemF0aW9uYWwgdW5pdmVyc2FsIGlkICh6ZXJvKSovCisJX19iZTE2CWV0aGVydHlwZTsJCS8qIHBhY2tldCB0eXBlIElEIGZpZWxkICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaGlwcGlfaGRyIHsKKwlzdHJ1Y3QgaGlwcGlfZnBfaGRyCWZwOworCXN0cnVjdCBoaXBwaV9sZV9oZHIJbGU7CisJc3RydWN0IGhpcHBpX3NuYXBfaGRyCXNuYXA7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZW5kaWYJLyogX0xJTlVYX0lGX0hJUFBJX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfaW5maW5pYmFuZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9pbmZpbmliYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q5NTg0NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfaW5maW5pYmFuZC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBhdAorICogPGh0dHA6Ly93d3cuZnNmLm9yZy9jb3B5bGVmdC9ncGwuaHRtbD4sIG9yIHRoZSBPcGVuSUIub3JnIEJTRAorICogbGljZW5zZSwgYXZhaWxhYmxlIGluIHRoZSBMSUNFTlNFLlRYVCBmaWxlIGFjY29tcGFueWluZyB0aGlzCisgKiBzb2Z0d2FyZS4gIFRoZXNlIGRldGFpbHMgYXJlIGFsc28gYXZhaWxhYmxlIGF0CisgKiA8aHR0cDovL3d3dy5vcGVuZmFicmljcy5vcmcvc29mdHdhcmVfbGljZW5zZS5odG0+LgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICRJZCQKKyAqLworCisjaWZuZGVmIF9MSU5VWF9JRl9JTkZJTklCQU5EX0gKKyNkZWZpbmUgX0xJTlVYX0lGX0lORklOSUJBTkRfSAorCisjZGVmaW5lIElORklOSUJBTkRfQUxFTgkJMjAJLyogT2N0ZXRzIGluIElQb0lCIEhXIGFkZHIJKi8KKworI2VuZGlmIC8qIF9MSU5VWF9JRl9JTkZJTklCQU5EX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfbGluay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9saW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNiYzA0YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfbGluay5oCkBAIC0wLDAgKzEsMzc5IEBACisjaWZuZGVmIF9MSU5VWF9JRl9MSU5LX0gKKyNkZWZpbmUgX0xJTlVYX0lGX0xJTktfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKKy8qIFRoaXMgc3RydWN0IHNob3VsZCBiZSBpbiBzeW5jIHdpdGggc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICovCitzdHJ1Y3QgcnRubF9saW5rX3N0YXRzIHsKKwlfX3UzMglyeF9wYWNrZXRzOwkJLyogdG90YWwgcGFja2V0cyByZWNlaXZlZAkqLworCV9fdTMyCXR4X3BhY2tldHM7CQkvKiB0b3RhbCBwYWNrZXRzIHRyYW5zbWl0dGVkCSovCisJX191MzIJcnhfYnl0ZXM7CQkvKiB0b3RhbCBieXRlcyByZWNlaXZlZCAJKi8KKwlfX3UzMgl0eF9ieXRlczsJCS8qIHRvdGFsIGJ5dGVzIHRyYW5zbWl0dGVkCSovCisJX191MzIJcnhfZXJyb3JzOwkJLyogYmFkIHBhY2tldHMgcmVjZWl2ZWQJCSovCisJX191MzIJdHhfZXJyb3JzOwkJLyogcGFja2V0IHRyYW5zbWl0IHByb2JsZW1zCSovCisJX191MzIJcnhfZHJvcHBlZDsJCS8qIG5vIHNwYWNlIGluIGxpbnV4IGJ1ZmZlcnMJKi8KKwlfX3UzMgl0eF9kcm9wcGVkOwkJLyogbm8gc3BhY2UgYXZhaWxhYmxlIGluIGxpbnV4CSovCisJX191MzIJbXVsdGljYXN0OwkJLyogbXVsdGljYXN0IHBhY2tldHMgcmVjZWl2ZWQJKi8KKwlfX3UzMgljb2xsaXNpb25zOworCisJLyogZGV0YWlsZWQgcnhfZXJyb3JzOiAqLworCV9fdTMyCXJ4X2xlbmd0aF9lcnJvcnM7CisJX191MzIJcnhfb3Zlcl9lcnJvcnM7CQkvKiByZWNlaXZlciByaW5nIGJ1ZmYgb3ZlcmZsb3cJKi8KKwlfX3UzMglyeF9jcmNfZXJyb3JzOwkJLyogcmVjdmVkIHBrdCB3aXRoIGNyYyBlcnJvcgkqLworCV9fdTMyCXJ4X2ZyYW1lX2Vycm9yczsJLyogcmVjdidkIGZyYW1lIGFsaWdubWVudCBlcnJvciAqLworCV9fdTMyCXJ4X2ZpZm9fZXJyb3JzOwkJLyogcmVjdidyIGZpZm8gb3ZlcnJ1bgkJKi8KKwlfX3UzMglyeF9taXNzZWRfZXJyb3JzOwkvKiByZWNlaXZlciBtaXNzZWQgcGFja2V0CSovCisKKwkvKiBkZXRhaWxlZCB0eF9lcnJvcnMgKi8KKwlfX3UzMgl0eF9hYm9ydGVkX2Vycm9yczsKKwlfX3UzMgl0eF9jYXJyaWVyX2Vycm9yczsKKwlfX3UzMgl0eF9maWZvX2Vycm9yczsKKwlfX3UzMgl0eF9oZWFydGJlYXRfZXJyb3JzOworCV9fdTMyCXR4X3dpbmRvd19lcnJvcnM7CisKKwkvKiBmb3IgY3NsaXAgZXRjICovCisJX191MzIJcnhfY29tcHJlc3NlZDsKKwlfX3UzMgl0eF9jb21wcmVzc2VkOworfTsKKworLyogVGhlIG1haW4gZGV2aWNlIHN0YXRpc3RpY3Mgc3RydWN0dXJlICovCitzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgeworCV9fdTY0CXJ4X3BhY2tldHM7CQkvKiB0b3RhbCBwYWNrZXRzIHJlY2VpdmVkCSovCisJX191NjQJdHhfcGFja2V0czsJCS8qIHRvdGFsIHBhY2tldHMgdHJhbnNtaXR0ZWQJKi8KKwlfX3U2NAlyeF9ieXRlczsJCS8qIHRvdGFsIGJ5dGVzIHJlY2VpdmVkIAkqLworCV9fdTY0CXR4X2J5dGVzOwkJLyogdG90YWwgYnl0ZXMgdHJhbnNtaXR0ZWQJKi8KKwlfX3U2NAlyeF9lcnJvcnM7CQkvKiBiYWQgcGFja2V0cyByZWNlaXZlZAkJKi8KKwlfX3U2NAl0eF9lcnJvcnM7CQkvKiBwYWNrZXQgdHJhbnNtaXQgcHJvYmxlbXMJKi8KKwlfX3U2NAlyeF9kcm9wcGVkOwkJLyogbm8gc3BhY2UgaW4gbGludXggYnVmZmVycwkqLworCV9fdTY0CXR4X2Ryb3BwZWQ7CQkvKiBubyBzcGFjZSBhdmFpbGFibGUgaW4gbGludXgJKi8KKwlfX3U2NAltdWx0aWNhc3Q7CQkvKiBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZAkqLworCV9fdTY0CWNvbGxpc2lvbnM7CisKKwkvKiBkZXRhaWxlZCByeF9lcnJvcnM6ICovCisJX191NjQJcnhfbGVuZ3RoX2Vycm9yczsKKwlfX3U2NAlyeF9vdmVyX2Vycm9yczsJCS8qIHJlY2VpdmVyIHJpbmcgYnVmZiBvdmVyZmxvdwkqLworCV9fdTY0CXJ4X2NyY19lcnJvcnM7CQkvKiByZWN2ZWQgcGt0IHdpdGggY3JjIGVycm9yCSovCisJX191NjQJcnhfZnJhbWVfZXJyb3JzOwkvKiByZWN2J2QgZnJhbWUgYWxpZ25tZW50IGVycm9yICovCisJX191NjQJcnhfZmlmb19lcnJvcnM7CQkvKiByZWN2J3IgZmlmbyBvdmVycnVuCQkqLworCV9fdTY0CXJ4X21pc3NlZF9lcnJvcnM7CS8qIHJlY2VpdmVyIG1pc3NlZCBwYWNrZXQJKi8KKworCS8qIGRldGFpbGVkIHR4X2Vycm9ycyAqLworCV9fdTY0CXR4X2Fib3J0ZWRfZXJyb3JzOworCV9fdTY0CXR4X2NhcnJpZXJfZXJyb3JzOworCV9fdTY0CXR4X2ZpZm9fZXJyb3JzOworCV9fdTY0CXR4X2hlYXJ0YmVhdF9lcnJvcnM7CisJX191NjQJdHhfd2luZG93X2Vycm9yczsKKworCS8qIGZvciBjc2xpcCBldGMgKi8KKwlfX3U2NAlyeF9jb21wcmVzc2VkOworCV9fdTY0CXR4X2NvbXByZXNzZWQ7Cit9OworCisvKiBUaGUgc3RydWN0IHNob3VsZCBiZSBpbiBzeW5jIHdpdGggc3RydWN0IGlmbWFwICovCitzdHJ1Y3QgcnRubF9saW5rX2lmbWFwIHsKKwlfX3U2NAltZW1fc3RhcnQ7CisJX191NjQJbWVtX2VuZDsKKwlfX3U2NAliYXNlX2FkZHI7CisJX191MTYJaXJxOworCV9fdTgJZG1hOworCV9fdTgJcG9ydDsKK307CisKKy8qCisgKiBJRkxBX0FGX1NQRUMKKyAqICAgQ29udGFpbnMgbmVzdGVkIGF0dHJpYnV0ZXMgZm9yIGFkZHJlc3MgZmFtaWx5IHNwZWNpZmljIGF0dHJpYnV0ZXMuCisgKiAgIEVhY2ggYWRkcmVzcyBmYW1pbHkgbWF5IGNyZWF0ZSBhIGF0dHJpYnV0ZSB3aXRoIHRoZSBhZGRyZXNzIGZhbWlseQorICogICBudW1iZXIgYXMgdHlwZSBhbmQgY3JlYXRlIGl0cyBvd24gYXR0cmlidXRlIHN0cnVjdHVyZSBpbiBpdC4KKyAqCisgKiAgIEV4YW1wbGU6CisgKiAgIFtJRkxBX0FGX1NQRUNdID0geworICogICAgICAgW0FGX0lORVRdID0geworICogICAgICAgICAgIFtJRkxBX0lORVRfQ09ORl0gPSAuLi4sCisgKiAgICAgICB9LAorICogICAgICAgW0FGX0lORVQ2XSA9IHsKKyAqICAgICAgICAgICBbSUZMQV9JTkVUNl9GTEFHU10gPSAuLi4sCisgKiAgICAgICAgICAgW0lGTEFfSU5FVDZfQ09ORl0gPSAuLi4sCisgKiAgICAgICB9CisgKiAgIH0KKyAqLworCitlbnVtIHsKKwlJRkxBX1VOU1BFQywKKwlJRkxBX0FERFJFU1MsCisJSUZMQV9CUk9BRENBU1QsCisJSUZMQV9JRk5BTUUsCisJSUZMQV9NVFUsCisJSUZMQV9MSU5LLAorCUlGTEFfUURJU0MsCisJSUZMQV9TVEFUUywKKwlJRkxBX0NPU1QsCisjZGVmaW5lIElGTEFfQ09TVCBJRkxBX0NPU1QKKwlJRkxBX1BSSU9SSVRZLAorI2RlZmluZSBJRkxBX1BSSU9SSVRZIElGTEFfUFJJT1JJVFkKKwlJRkxBX01BU1RFUiwKKyNkZWZpbmUgSUZMQV9NQVNURVIgSUZMQV9NQVNURVIKKwlJRkxBX1dJUkVMRVNTLAkJLyogV2lyZWxlc3MgRXh0ZW5zaW9uIGV2ZW50IC0gc2VlIHdpcmVsZXNzLmggKi8KKyNkZWZpbmUgSUZMQV9XSVJFTEVTUyBJRkxBX1dJUkVMRVNTCisJSUZMQV9QUk9USU5GTywJCS8qIFByb3RvY29sIHNwZWNpZmljIGluZm9ybWF0aW9uIGZvciBhIGxpbmsgKi8KKyNkZWZpbmUgSUZMQV9QUk9USU5GTyBJRkxBX1BST1RJTkZPCisJSUZMQV9UWFFMRU4sCisjZGVmaW5lIElGTEFfVFhRTEVOIElGTEFfVFhRTEVOCisJSUZMQV9NQVAsCisjZGVmaW5lIElGTEFfTUFQIElGTEFfTUFQCisJSUZMQV9XRUlHSFQsCisjZGVmaW5lIElGTEFfV0VJR0hUIElGTEFfV0VJR0hUCisJSUZMQV9PUEVSU1RBVEUsCisJSUZMQV9MSU5LTU9ERSwKKwlJRkxBX0xJTktJTkZPLAorI2RlZmluZSBJRkxBX0xJTktJTkZPIElGTEFfTElOS0lORk8KKwlJRkxBX05FVF9OU19QSUQsCisJSUZMQV9JRkFMSUFTLAorCUlGTEFfTlVNX1ZGLAkJLyogTnVtYmVyIG9mIFZGcyBpZiBkZXZpY2UgaXMgU1ItSU9WIFBGICovCisJSUZMQV9WRklORk9fTElTVCwKKwlJRkxBX1NUQVRTNjQsCisJSUZMQV9WRl9QT1JUUywKKwlJRkxBX1BPUlRfU0VMRiwKKwlJRkxBX0FGX1NQRUMsCisJSUZMQV9HUk9VUCwJCS8qIEdyb3VwIHRoZSBkZXZpY2UgYmVsb25ncyB0byAqLworCUlGTEFfTkVUX05TX0ZELAorCV9fSUZMQV9NQVgKK307CisKKworI2RlZmluZSBJRkxBX01BWCAoX19JRkxBX01BWCAtIDEpCisKKy8qIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciB1c2Vyc3BhY2UgKi8KKyNkZWZpbmUgSUZMQV9SVEEocikgICgoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopKHIpKSArIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSkpKQorI2RlZmluZSBJRkxBX1BBWUxPQUQobikgTkxNU0dfUEFZTE9BRChuLHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSkKKworZW51bSB7CisJSUZMQV9JTkVUX1VOU1BFQywKKwlJRkxBX0lORVRfQ09ORiwKKwlfX0lGTEFfSU5FVF9NQVgsCit9OworCisjZGVmaW5lIElGTEFfSU5FVF9NQVggKF9fSUZMQV9JTkVUX01BWCAtIDEpCisKKy8qIGlmaV9mbGFncy4KKworICAgSUZGXyogZmxhZ3MuCisKKyAgIFRoZSBvbmx5IGNoYW5nZSBpczoKKyAgIElGRl9MT09QQkFDSywgSUZGX0JST0FEQ0FTVCBhbmQgSUZGX1BPSU5UT1BPSU5UIGFyZQorICAgbW9yZSBub3QgY2hhbmdlYWJsZSBieSB1c2VyLiBUaGV5IGRlc2NyaWJlIGxpbmsgbWVkaWEKKyAgIGNoYXJhY3RlcmlzdGljcyBhbmQgc2V0IGJ5IGRldmljZSBkcml2ZXIuCisKKyAgIENvbW1lbnRzOgorICAgLSBDb21iaW5hdGlvbiBJRkZfQlJPQURDQVNUfElGRl9QT0lOVE9QT0lOVCBpcyBpbnZhbGlkCisgICAtIElmIG5laXRoZXIgb2YgdGhlc2UgdGhyZWUgZmxhZ3MgYXJlIHNldDsKKyAgICAgdGhlIGludGVyZmFjZSBpcyBOQk1BLgorCisgICAtIElGRl9NVUxUSUNBU1QgZG9lcyBub3QgbWVhbiBhbnl0aGluZyBzcGVjaWFsOgorICAgbXVsdGljYXN0cyBjYW4gYmUgdXNlZCBvbiBhbGwgbm90LU5CTUEgbGlua3MuCisgICBJRkZfTVVMVElDQVNUIG1lYW5zIHRoYXQgdGhpcyBtZWRpYSB1c2VzIHNwZWNpYWwgZW5jYXBzdWxhdGlvbgorICAgZm9yIG11bHRpY2FzdCBmcmFtZXMuIEFwcGFyZW50bHksIGFsbCBJRkZfUE9JTlRPUE9JTlQgYW5kCisgICBJRkZfQlJPQURDQVNUIGRldmljZXMgYXJlIGFibGUgdG8gdXNlIG11bHRpY2FzdHMgdG9vLgorICovCisKKy8qIElGTEFfTElOSy4KKyAgIEZvciB1c3VhbCBkZXZpY2VzIGl0IGlzIGVxdWFsIGlmaV9pbmRleC4KKyAgIElmIGl0IGlzIGEgInZpcnR1YWwgaW50ZXJmYWNlIiAoZi5lLiB0dW5uZWwpLCBpZmlfbGluaworICAgY2FuIHBvaW50IHRvIHJlYWwgcGh5c2ljYWwgaW50ZXJmYWNlIChmLmUuIGZvciBiYW5kd2lkdGggY2FsY3VsYXRpb25zKSwKKyAgIG9yIG1heWJlIDAsIHdoYXQgbWVhbnMsIHRoYXQgcmVhbCBtZWRpYSBpcyB1bmtub3duICh1c3VhbAorICAgZm9yIElQSVAgdHVubmVscywgd2hlbiByb3V0ZSB0byBlbmRwb2ludCBpcyBhbGxvd2VkIHRvIGNoYW5nZSkKKyAqLworCisvKiBTdWJ0eXBlIGF0dHJpYnV0ZXMgZm9yIElGTEFfUFJPVElORk8gKi8KK2VudW0geworCUlGTEFfSU5FVDZfVU5TUEVDLAorCUlGTEFfSU5FVDZfRkxBR1MsCS8qIGxpbmsgZmxhZ3MJCQkqLworCUlGTEFfSU5FVDZfQ09ORiwJLyogc3lzY3RsIHBhcmFtZXRlcnMJCSovCisJSUZMQV9JTkVUNl9TVEFUUywJLyogc3RhdGlzdGljcwkJCSovCisJSUZMQV9JTkVUNl9NQ0FTVCwJLyogTUMgdGhpbmdzLiBXaGF0IG9mIHRoZW0/CSovCisJSUZMQV9JTkVUNl9DQUNIRUlORk8sCS8qIHRpbWUgdmFsdWVzIGFuZCBtYXggcmVhc20gc2l6ZSAqLworCUlGTEFfSU5FVDZfSUNNUDZTVEFUUywJLyogc3RhdGlzdGljcyAoaWNtcHY2KQkJKi8KKwlfX0lGTEFfSU5FVDZfTUFYCit9OworCisjZGVmaW5lIElGTEFfSU5FVDZfTUFYCShfX0lGTEFfSU5FVDZfTUFYIC0gMSkKKworc3RydWN0IGlmbGFfY2FjaGVpbmZvIHsKKwlfX3UzMgltYXhfcmVhc21fbGVuOworCV9fdTMyCXRzdGFtcDsJCS8qIGlwdjZJbnRlcmZhY2VUYWJsZSB1cGRhdGVkIHRpbWVzdGFtcCAqLworCV9fdTMyCXJlYWNoYWJsZV90aW1lOworCV9fdTMyCXJldHJhbnNfdGltZTsKK307CisKK2VudW0geworCUlGTEFfSU5GT19VTlNQRUMsCisJSUZMQV9JTkZPX0tJTkQsCisJSUZMQV9JTkZPX0RBVEEsCisJSUZMQV9JTkZPX1hTVEFUUywKKwlfX0lGTEFfSU5GT19NQVgsCit9OworCisjZGVmaW5lIElGTEFfSU5GT19NQVgJKF9fSUZMQV9JTkZPX01BWCAtIDEpCisKKy8qIFZMQU4gc2VjdGlvbiAqLworCitlbnVtIHsKKwlJRkxBX1ZMQU5fVU5TUEVDLAorCUlGTEFfVkxBTl9JRCwKKwlJRkxBX1ZMQU5fRkxBR1MsCisJSUZMQV9WTEFOX0VHUkVTU19RT1MsCisJSUZMQV9WTEFOX0lOR1JFU1NfUU9TLAorCV9fSUZMQV9WTEFOX01BWCwKK307CisKKyNkZWZpbmUgSUZMQV9WTEFOX01BWAkoX19JRkxBX1ZMQU5fTUFYIC0gMSkKKworc3RydWN0IGlmbGFfdmxhbl9mbGFncyB7CisJX191MzIJZmxhZ3M7CisJX191MzIJbWFzazsKK307CisKK2VudW0geworCUlGTEFfVkxBTl9RT1NfVU5TUEVDLAorCUlGTEFfVkxBTl9RT1NfTUFQUElORywKKwlfX0lGTEFfVkxBTl9RT1NfTUFYCit9OworCisjZGVmaW5lIElGTEFfVkxBTl9RT1NfTUFYCShfX0lGTEFfVkxBTl9RT1NfTUFYIC0gMSkKKworc3RydWN0IGlmbGFfdmxhbl9xb3NfbWFwcGluZyB7CisJX191MzIgZnJvbTsKKwlfX3UzMiB0bzsKK307CisKKy8qIE1BQ1ZMQU4gc2VjdGlvbiAqLworZW51bSB7CisJSUZMQV9NQUNWTEFOX1VOU1BFQywKKwlJRkxBX01BQ1ZMQU5fTU9ERSwKKwlfX0lGTEFfTUFDVkxBTl9NQVgsCit9OworCisjZGVmaW5lIElGTEFfTUFDVkxBTl9NQVggKF9fSUZMQV9NQUNWTEFOX01BWCAtIDEpCisKK2VudW0gbWFjdmxhbl9tb2RlIHsKKwlNQUNWTEFOX01PREVfUFJJVkFURSA9IDEsIC8qIGRvbid0IHRhbGsgdG8gb3RoZXIgbWFjdmxhbnMgKi8KKwlNQUNWTEFOX01PREVfVkVQQSAgICA9IDIsIC8qIHRhbGsgdG8gb3RoZXIgcG9ydHMgdGhyb3VnaCBleHQgYnJpZGdlICovCisJTUFDVkxBTl9NT0RFX0JSSURHRSAgPSA0LCAvKiB0YWxrIHRvIGJyaWRnZSBwb3J0cyBkaXJlY3RseSAqLworCU1BQ1ZMQU5fTU9ERV9QQVNTVEhSVSA9IDgsLyogdGFrZSBvdmVyIHRoZSB1bmRlcmx5aW5nIGRldmljZSAqLworfTsKKworLyogU1ItSU9WIHZpcnR1YWwgZnVuY3Rpb24gbWFuYWdlbWVudCBzZWN0aW9uICovCisKK2VudW0geworCUlGTEFfVkZfSU5GT19VTlNQRUMsCisJSUZMQV9WRl9JTkZPLAorCV9fSUZMQV9WRl9JTkZPX01BWCwKK307CisKKyNkZWZpbmUgSUZMQV9WRl9JTkZPX01BWCAoX19JRkxBX1ZGX0lORk9fTUFYIC0gMSkKKworZW51bSB7CisJSUZMQV9WRl9VTlNQRUMsCisJSUZMQV9WRl9NQUMsCQkvKiBIYXJkd2FyZSBxdWV1ZSBzcGVjaWZpYyBhdHRyaWJ1dGVzICovCisJSUZMQV9WRl9WTEFOLAorCUlGTEFfVkZfVFhfUkFURSwJLyogVFggQmFuZHdpZHRoIEFsbG9jYXRpb24gKi8KKwlJRkxBX1ZGX1NQT09GQ0hLLAkvKiBTcG9vZiBDaGVja2luZyBvbi9vZmYgc3dpdGNoICovCisJX19JRkxBX1ZGX01BWCwKK307CisKKyNkZWZpbmUgSUZMQV9WRl9NQVggKF9fSUZMQV9WRl9NQVggLSAxKQorCitzdHJ1Y3QgaWZsYV92Zl9tYWMgeworCV9fdTMyIHZmOworCV9fdTggbWFjWzMyXTsgLyogTUFYX0FERFJfTEVOICovCit9OworCitzdHJ1Y3QgaWZsYV92Zl92bGFuIHsKKwlfX3UzMiB2ZjsKKwlfX3UzMiB2bGFuOyAvKiAwIC0gNDA5NSwgMCBkaXNhYmxlcyBWTEFOIGZpbHRlciAqLworCV9fdTMyIHFvczsKK307CisKK3N0cnVjdCBpZmxhX3ZmX3R4X3JhdGUgeworCV9fdTMyIHZmOworCV9fdTMyIHJhdGU7IC8qIE1heCBUWCBiYW5kd2lkdGggaW4gTWJwcywgMCBkaXNhYmxlcyB0aHJvdHRsaW5nICovCit9OworCitzdHJ1Y3QgaWZsYV92Zl9zcG9vZmNoayB7CisJX191MzIgdmY7CisJX191MzIgc2V0dGluZzsKK307CisKKy8qIFZGIHBvcnRzIG1hbmFnZW1lbnQgc2VjdGlvbgorICoKKyAqCU5lc3RlZCBsYXlvdXQgb2Ygc2V0L2dldCBtc2cgaXM6CisgKgorICoJCVtJRkxBX05VTV9WRl0KKyAqCQlbSUZMQV9WRl9QT1JUU10KKyAqCQkJW0lGTEFfVkZfUE9SVF0KKyAqCQkJCVtJRkxBX1BPUlRfKl0sIC4uLgorICoJCQlbSUZMQV9WRl9QT1JUXQorICoJCQkJW0lGTEFfUE9SVF8qXSwgLi4uCisgKgkJCS4uLgorICoJCVtJRkxBX1BPUlRfU0VMRl0KKyAqCQkJW0lGTEFfUE9SVF8qXSwgLi4uCisgKi8KKworZW51bSB7CisJSUZMQV9WRl9QT1JUX1VOU1BFQywKKwlJRkxBX1ZGX1BPUlQsCQkJLyogbmVzdCAqLworCV9fSUZMQV9WRl9QT1JUX01BWCwKK307CisKKyNkZWZpbmUgSUZMQV9WRl9QT1JUX01BWCAoX19JRkxBX1ZGX1BPUlRfTUFYIC0gMSkKKworZW51bSB7CisJSUZMQV9QT1JUX1VOU1BFQywKKwlJRkxBX1BPUlRfVkYsCQkJLyogX191MzIgKi8KKwlJRkxBX1BPUlRfUFJPRklMRSwJCS8qIHN0cmluZyAqLworCUlGTEFfUE9SVF9WU0lfVFlQRSwJCS8qIDgwMi4xUWJnIChwcmUtKXN0YW5kYXJkIFZEUCAqLworCUlGTEFfUE9SVF9JTlNUQU5DRV9VVUlELAkvKiBiaW5hcnkgVVVJRCAqLworCUlGTEFfUE9SVF9IT1NUX1VVSUQsCQkvKiBiaW5hcnkgVVVJRCAqLworCUlGTEFfUE9SVF9SRVFVRVNULAkJLyogX191OCAqLworCUlGTEFfUE9SVF9SRVNQT05TRSwJCS8qIF9fdTE2LCBvdXRwdXQgb25seSAqLworCV9fSUZMQV9QT1JUX01BWCwKK307CisKKyNkZWZpbmUgSUZMQV9QT1JUX01BWCAoX19JRkxBX1BPUlRfTUFYIC0gMSkKKworI2RlZmluZSBQT1JUX1BST0ZJTEVfTUFYCTQwCisjZGVmaW5lIFBPUlRfVVVJRF9NQVgJCTE2CisjZGVmaW5lIFBPUlRfU0VMRl9WRgkJLTEKKworZW51bSB7CisJUE9SVF9SRVFVRVNUX1BSRUFTU09DSUFURSA9IDAsCisJUE9SVF9SRVFVRVNUX1BSRUFTU09DSUFURV9SUiwKKwlQT1JUX1JFUVVFU1RfQVNTT0NJQVRFLAorCVBPUlRfUkVRVUVTVF9ESVNBU1NPQ0lBVEUsCit9OworCitlbnVtIHsKKwlQT1JUX1ZEUF9SRVNQT05TRV9TVUNDRVNTID0gMCwKKwlQT1JUX1ZEUF9SRVNQT05TRV9JTlZBTElEX0ZPUk1BVCwKKwlQT1JUX1ZEUF9SRVNQT05TRV9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTLAorCVBPUlRfVkRQX1JFU1BPTlNFX1VOVVNFRF9WVElELAorCVBPUlRfVkRQX1JFU1BPTlNFX1ZUSURfVklPTEFUSU9OLAorCVBPUlRfVkRQX1JFU1BPTlNFX1ZUSURfVkVSU0lPTl9WSU9BTFRJT04sCisJUE9SVF9WRFBfUkVTUE9OU0VfT1VUX09GX1NZTkMsCisJLyogMHgwOC0weEZGIHJlc2VydmVkIGZvciBmdXR1cmUgVkRQIHVzZSAqLworCVBPUlRfUFJPRklMRV9SRVNQT05TRV9TVUNDRVNTID0gMHgxMDAsCisJUE9SVF9QUk9GSUxFX1JFU1BPTlNFX0lOUFJPR1JFU1MsCisJUE9SVF9QUk9GSUxFX1JFU1BPTlNFX0lOVkFMSUQsCisJUE9SVF9QUk9GSUxFX1JFU1BPTlNFX0JBRFNUQVRFLAorCVBPUlRfUFJPRklMRV9SRVNQT05TRV9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTLAorCVBPUlRfUFJPRklMRV9SRVNQT05TRV9FUlJPUiwKK307CisKK3N0cnVjdCBpZmxhX3BvcnRfdnNpIHsKKwlfX3U4IHZzaV9tZ3JfaWQ7CisJX191OCB2c2lfdHlwZV9pZFszXTsKKwlfX3U4IHZzaV90eXBlX3ZlcnNpb247CisJX191OCBwYWRbM107Cit9OworCisjZW5kaWYgLyogX0xJTlVYX0lGX0xJTktfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9sdGFsay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9sdGFsay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzNlMzAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2x0YWxrLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9fTElOVVhfTFRBTEtfSAorI2RlZmluZSBfX0xJTlVYX0xUQUxLX0gKKworI2RlZmluZSBMVEFMS19ITEVOCQkxCisjZGVmaW5lIExUQUxLX01UVQkJNjAwCisjZGVmaW5lIExUQUxLX0FMRU4JCTEKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfcGFja2V0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNzk5MjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oCkBAIC0wLDAgKzEsMjcyIEBACisjaWZuZGVmIF9fTElOVVhfSUZfUEFDS0VUX0gKKyNkZWZpbmUgX19MSU5VWF9JRl9QQUNLRVRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IHNvY2thZGRyX3BrdCB7CisJdW5zaWduZWQgc2hvcnQgc3BrdF9mYW1pbHk7CisJdW5zaWduZWQgY2hhciBzcGt0X2RldmljZVsxNF07CisJX19iZTE2IHNwa3RfcHJvdG9jb2w7Cit9OworCitzdHJ1Y3Qgc29ja2FkZHJfbGwgeworCXVuc2lnbmVkIHNob3J0CXNsbF9mYW1pbHk7CisJX19iZTE2CQlzbGxfcHJvdG9jb2w7CisJaW50CQlzbGxfaWZpbmRleDsKKwl1bnNpZ25lZCBzaG9ydAlzbGxfaGF0eXBlOworCXVuc2lnbmVkIGNoYXIJc2xsX3BrdHR5cGU7CisJdW5zaWduZWQgY2hhcglzbGxfaGFsZW47CisJdW5zaWduZWQgY2hhcglzbGxfYWRkcls4XTsKK307CisKKy8qIFBhY2tldCB0eXBlcyAqLworCisjZGVmaW5lIFBBQ0tFVF9IT1NUCQkwCQkvKiBUbyB1cwkJKi8KKyNkZWZpbmUgUEFDS0VUX0JST0FEQ0FTVAkxCQkvKiBUbyBhbGwJCSovCisjZGVmaW5lIFBBQ0tFVF9NVUxUSUNBU1QJMgkJLyogVG8gZ3JvdXAJCSovCisjZGVmaW5lIFBBQ0tFVF9PVEhFUkhPU1QJMwkJLyogVG8gc29tZW9uZSBlbHNlIAkqLworI2RlZmluZSBQQUNLRVRfT1VUR09JTkcJCTQJCS8qIE91dGdvaW5nIG9mIGFueSB0eXBlICovCisvKiBUaGVzZSBvbmVzIGFyZSBpbnZpc2libGUgYnkgdXNlciBsZXZlbCAqLworI2RlZmluZSBQQUNLRVRfTE9PUEJBQ0sJCTUJCS8qIE1DL0JSRCBmcmFtZSBsb29wZWQgYmFjayAqLworI2RlZmluZSBQQUNLRVRfRkFTVFJPVVRFCTYJCS8qIEZhc3Ryb3V0ZWQgZnJhbWUJKi8KKworLyogUGFja2V0IHNvY2tldCBvcHRpb25zICovCisKKyNkZWZpbmUgUEFDS0VUX0FERF9NRU1CRVJTSElQCQkxCisjZGVmaW5lIFBBQ0tFVF9EUk9QX01FTUJFUlNISVAJCTIKKyNkZWZpbmUgUEFDS0VUX1JFQ1ZfT1VUUFVUCQkzCisvKiBWYWx1ZSA0IGlzIHN0aWxsIHVzZWQgYnkgb2Jzb2xldGUgdHVyYm8tcGFja2V0LiAqLworI2RlZmluZSBQQUNLRVRfUlhfUklORwkJCTUKKyNkZWZpbmUgUEFDS0VUX1NUQVRJU1RJQ1MJCTYKKyNkZWZpbmUgUEFDS0VUX0NPUFlfVEhSRVNICQk3CisjZGVmaW5lIFBBQ0tFVF9BVVhEQVRBCQkJOAorI2RlZmluZSBQQUNLRVRfT1JJR0RFVgkJCTkKKyNkZWZpbmUgUEFDS0VUX1ZFUlNJT04JCQkxMAorI2RlZmluZSBQQUNLRVRfSERSTEVOCQkJMTEKKyNkZWZpbmUgUEFDS0VUX1JFU0VSVkUJCQkxMgorI2RlZmluZSBQQUNLRVRfVFhfUklORwkJCTEzCisjZGVmaW5lIFBBQ0tFVF9MT1NTCQkJMTQKKyNkZWZpbmUgUEFDS0VUX1ZORVRfSERSCQkJMTUKKyNkZWZpbmUgUEFDS0VUX1RYX1RJTUVTVEFNUAkJMTYKKyNkZWZpbmUgUEFDS0VUX1RJTUVTVEFNUAkJMTcKKyNkZWZpbmUgUEFDS0VUX0ZBTk9VVAkJCTE4CisKKyNkZWZpbmUgUEFDS0VUX0ZBTk9VVF9IQVNICQkwCisjZGVmaW5lIFBBQ0tFVF9GQU5PVVRfTEIJCTEKKyNkZWZpbmUgUEFDS0VUX0ZBTk9VVF9DUFUJCTIKKyNkZWZpbmUgUEFDS0VUX0ZBTk9VVF9GTEFHX0RFRlJBRwkweDgwMDAKKworc3RydWN0IHRwYWNrZXRfc3RhdHMgeworCXVuc2lnbmVkIGludAl0cF9wYWNrZXRzOworCXVuc2lnbmVkIGludAl0cF9kcm9wczsKK307CisKK3N0cnVjdCB0cGFja2V0X3N0YXRzX3YzIHsKKwl1bnNpZ25lZCBpbnQJdHBfcGFja2V0czsKKwl1bnNpZ25lZCBpbnQJdHBfZHJvcHM7CisJdW5zaWduZWQgaW50CXRwX2ZyZWV6ZV9xX2NudDsKK307CisKK3VuaW9uIHRwYWNrZXRfc3RhdHNfdSB7CisJc3RydWN0IHRwYWNrZXRfc3RhdHMgc3RhdHMxOworCXN0cnVjdCB0cGFja2V0X3N0YXRzX3YzIHN0YXRzMzsKK307CisKK3N0cnVjdCB0cGFja2V0X2F1eGRhdGEgeworCV9fdTMyCQl0cF9zdGF0dXM7CisJX191MzIJCXRwX2xlbjsKKwlfX3UzMgkJdHBfc25hcGxlbjsKKwlfX3UxNgkJdHBfbWFjOworCV9fdTE2CQl0cF9uZXQ7CisJX191MTYJCXRwX3ZsYW5fdGNpOworCV9fdTE2CQl0cF9wYWRkaW5nOworfTsKKworLyogUnggcmluZyAtIGhlYWRlciBzdGF0dXMgKi8KKyNkZWZpbmUgVFBfU1RBVFVTX0tFUk5FTAkweDAKKyNkZWZpbmUgVFBfU1RBVFVTX1VTRVIJCTB4MQorI2RlZmluZSBUUF9TVEFUVVNfQ09QWQkJMHgyCisjZGVmaW5lIFRQX1NUQVRVU19MT1NJTkcJMHg0CisjZGVmaW5lIFRQX1NUQVRVU19DU1VNTk9UUkVBRFkJMHg4CisjZGVmaW5lIFRQX1NUQVRVU19WTEFOX1ZBTElEICAgMHgxMCAvKiBhdXhkYXRhIGhhcyB2YWxpZCB0cF92bGFuX3RjaSAqLworI2RlZmluZSBUUF9TVEFUVVNfQkxLX1RNTwkweDIwCisKKy8qIFR4IHJpbmcgLSBoZWFkZXIgc3RhdHVzICovCisjZGVmaW5lIFRQX1NUQVRVU19BVkFJTEFCTEUJMHgwCisjZGVmaW5lIFRQX1NUQVRVU19TRU5EX1JFUVVFU1QJMHgxCisjZGVmaW5lIFRQX1NUQVRVU19TRU5ESU5HCTB4MgorI2RlZmluZSBUUF9TVEFUVVNfV1JPTkdfRk9STUFUCTB4NAorCisvKiBSeCByaW5nIC0gZmVhdHVyZSByZXF1ZXN0IGJpdHMgKi8KKyNkZWZpbmUgVFBfRlRfUkVRX0ZJTExfUlhIQVNICTB4MQorCitzdHJ1Y3QgdHBhY2tldF9oZHIgeworCXVuc2lnbmVkIGxvbmcJdHBfc3RhdHVzOworCXVuc2lnbmVkIGludAl0cF9sZW47CisJdW5zaWduZWQgaW50CXRwX3NuYXBsZW47CisJdW5zaWduZWQgc2hvcnQJdHBfbWFjOworCXVuc2lnbmVkIHNob3J0CXRwX25ldDsKKwl1bnNpZ25lZCBpbnQJdHBfc2VjOworCXVuc2lnbmVkIGludAl0cF91c2VjOworfTsKKworI2RlZmluZSBUUEFDS0VUX0FMSUdOTUVOVAkxNgorI2RlZmluZSBUUEFDS0VUX0FMSUdOKHgpCSgoKHgpK1RQQUNLRVRfQUxJR05NRU5ULTEpJn4oVFBBQ0tFVF9BTElHTk1FTlQtMSkpCisjZGVmaW5lIFRQQUNLRVRfSERSTEVOCQkoVFBBQ0tFVF9BTElHTihzaXplb2Yoc3RydWN0IHRwYWNrZXRfaGRyKSkgKyBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2xsKSkKKworc3RydWN0IHRwYWNrZXQyX2hkciB7CisJX191MzIJCXRwX3N0YXR1czsKKwlfX3UzMgkJdHBfbGVuOworCV9fdTMyCQl0cF9zbmFwbGVuOworCV9fdTE2CQl0cF9tYWM7CisJX191MTYJCXRwX25ldDsKKwlfX3UzMgkJdHBfc2VjOworCV9fdTMyCQl0cF9uc2VjOworCV9fdTE2CQl0cF92bGFuX3RjaTsKKwlfX3UxNgkJdHBfcGFkZGluZzsKK307CisKK3N0cnVjdCB0cGFja2V0X2hkcl92YXJpYW50MSB7CisJX191MzIJdHBfcnhoYXNoOworCV9fdTMyCXRwX3ZsYW5fdGNpOworfTsKKworc3RydWN0IHRwYWNrZXQzX2hkciB7CisJX191MzIJCXRwX25leHRfb2Zmc2V0OworCV9fdTMyCQl0cF9zZWM7CisJX191MzIJCXRwX25zZWM7CisJX191MzIJCXRwX3NuYXBsZW47CisJX191MzIJCXRwX2xlbjsKKwlfX3UzMgkJdHBfc3RhdHVzOworCV9fdTE2CQl0cF9tYWM7CisJX191MTYJCXRwX25ldDsKKwkvKiBwa3RfaGRyIHZhcmlhbnRzICovCisJdW5pb24geworCQlzdHJ1Y3QgdHBhY2tldF9oZHJfdmFyaWFudDEgaHYxOworCX07Cit9OworCitzdHJ1Y3QgdHBhY2tldF9iZF90cyB7CisJdW5zaWduZWQgaW50IHRzX3NlYzsKKwl1bmlvbiB7CisJCXVuc2lnbmVkIGludCB0c191c2VjOworCQl1bnNpZ25lZCBpbnQgdHNfbnNlYzsKKwl9OworfTsKKworc3RydWN0IHRwYWNrZXRfaGRyX3YxIHsKKwlfX3UzMglibG9ja19zdGF0dXM7CisJX191MzIJbnVtX3BrdHM7CisJX191MzIJb2Zmc2V0X3RvX2ZpcnN0X3BrdDsKKworCS8qIE51bWJlciBvZiB2YWxpZCBieXRlcyAoaW5jbHVkaW5nIHBhZGRpbmcpCisJICogYmxrX2xlbiA8PSB0cF9ibG9ja19zaXplCisJICovCisJX191MzIJYmxrX2xlbjsKKworCS8qCisJICogUXVpdGUgYSBmZXcgdXNlcyBvZiBzZXF1ZW5jZSBudW1iZXI6CisJICogMS4gTWFrZSBzdXJlIGNhY2hlIGZsdXNoIGV0YyB3b3JrZWQuCisJICogICAgV2VsbCwgb25lIGNhbiBhcmd1ZSAtIHdoeSBub3QgdXNlIHRoZSBpbmNyZWFzaW5nIHRzIGJlbG93PworCSAqICAgIEJ1dCBsb29rIGF0IDIuIGJlbG93IGZpcnN0LgorCSAqIDIuIFdoZW4geW91IHBhc3MgYXJvdW5kIGJsb2NrcyB0byBvdGhlciB1c2VyIHNwYWNlIGRlY29kZXJzLAorCSAqICAgIHlvdSBjYW4gc2VlIHdoaWNoIGJsa1tzXSBpc1thcmVdIG91dHN0YW5kaW5nIGV0Yy4KKwkgKiAzLiBWYWxpZGF0ZSBrZXJuZWwgY29kZS4KKwkgKi8KKwlfX2FsaWduZWRfdTY0CXNlcV9udW07CisKKwkvKgorCSAqIHRzX2xhc3RfcGt0OgorCSAqCisJICogQ2FzZSAxLglCbG9jayBoYXMgJ04nKE4gPj0xKSBwYWNrZXRzIGFuZCBUTU8nZCh0aW1lZCBvdXQpCisJICoJCXRzX2xhc3RfcGt0ID09ICd0aW1lLXN0YW1wIG9mIGxhc3QgcGFja2V0JyBhbmQgTk9UIHRoZQorCSAqCQl0aW1lIHdoZW4gdGhlIHRpbWVyIGZpcmVkIGFuZCB0aGUgYmxvY2sgd2FzIGNsb3NlZC4KKwkgKgkJQnkgcHJvdmlkaW5nIHRoZSB0cyBvZiB0aGUgbGFzdCBwYWNrZXQgd2UgY2FuIGFic29sdXRlbHkKKwkgKgkJZ3VhcmFudGVlIHRoYXQgdGltZS1zdGFtcCB3aXNlLCB0aGUgZmlyc3QgcGFja2V0IGluIHRoZQorCSAqCQluZXh0IGJsb2NrIHdpbGwgbmV2ZXIgcHJlY2VkZSB0aGUgbGFzdCBwYWNrZXQgb2YgdGhlCisJICoJCXByZXZpb3VzIGJsb2NrLgorCSAqIENhc2UgMi4JQmxvY2sgaGFzIHplcm8gcGFja2V0cyBhbmQgVE1PJ2QKKwkgKgkJdHNfbGFzdF9wa3QgPSB0aW1lIHdoZW4gdGhlIHRpbWVyIGZpcmVkIGFuZCB0aGUgYmxvY2sKKwkgKgkJd2FzIGNsb3NlZC4KKwkgKiBDYXNlIDMuCUJsb2NrIGhhcyAnTicgcGFja2V0cyBhbmQgTk8gVE1PLgorCSAqCQl0c19sYXN0X3BrdCA9IHRpbWUtc3RhbXAgb2YgdGhlIGxhc3QgcGt0IGluIHRoZSBibG9jay4KKwkgKgorCSAqIHRzX2ZpcnN0X3BrdDoKKwkgKgkJSXMgYWx3YXlzIHRoZSB0aW1lLXN0YW1wIHdoZW4gdGhlIGJsb2NrIHdhcyBvcGVuZWQuCisJICoJCUNhc2UgYSkJWkVSTyBwYWNrZXRzCisJICoJCQlObyBwYWNrZXRzIHRvIGRlYWwgd2l0aCBidXQgYXRsZWFzdCB5b3Uga25vdyB0aGUKKwkgKgkJCXRpbWUtaW50ZXJ2YWwgb2YgdGhpcyBibG9jay4KKwkgKgkJQ2FzZSBiKSBOb24temVybyBwYWNrZXRzCisJICoJCQlVc2UgdGhlIHRzIG9mIHRoZSBmaXJzdCBwYWNrZXQgaW4gdGhlIGJsb2NrLgorCSAqCisJICovCisJc3RydWN0IHRwYWNrZXRfYmRfdHMJdHNfZmlyc3RfcGt0LCB0c19sYXN0X3BrdDsKK307CisKK3VuaW9uIHRwYWNrZXRfYmRfaGVhZGVyX3UgeworCXN0cnVjdCB0cGFja2V0X2hkcl92MSBiaDE7Cit9OworCitzdHJ1Y3QgdHBhY2tldF9ibG9ja19kZXNjIHsKKwlfX3UzMiB2ZXJzaW9uOworCV9fdTMyIG9mZnNldF90b19wcml2OworCXVuaW9uIHRwYWNrZXRfYmRfaGVhZGVyX3UgaGRyOworfTsKKworI2RlZmluZSBUUEFDS0VUMl9IRFJMRU4JCShUUEFDS0VUX0FMSUdOKHNpemVvZihzdHJ1Y3QgdHBhY2tldDJfaGRyKSkgKyBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2xsKSkKKyNkZWZpbmUgVFBBQ0tFVDNfSERSTEVOCQkoVFBBQ0tFVF9BTElHTihzaXplb2Yoc3RydWN0IHRwYWNrZXQzX2hkcikpICsgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9sbCkpCisKK2VudW0gdHBhY2tldF92ZXJzaW9ucyB7CisJVFBBQ0tFVF9WMSwKKwlUUEFDS0VUX1YyLAorCVRQQUNLRVRfVjMKK307CisKKy8qCisgICBGcmFtZSBzdHJ1Y3R1cmU6CisKKyAgIC0gU3RhcnQuIEZyYW1lIG11c3QgYmUgYWxpZ25lZCB0byBUUEFDS0VUX0FMSUdOTUVOVD0xNgorICAgLSBzdHJ1Y3QgdHBhY2tldF9oZHIKKyAgIC0gcGFkIHRvIFRQQUNLRVRfQUxJR05NRU5UPTE2CisgICAtIHN0cnVjdCBzb2NrYWRkcl9sbAorICAgLSBHYXAsIGNob3NlbiBzbyB0aGF0IHBhY2tldCBkYXRhIChTdGFydCt0cF9uZXQpIGFsaWduZXMgdG8gVFBBQ0tFVF9BTElHTk1FTlQ9MTYKKyAgIC0gU3RhcnQrdHBfbWFjOiBbIE9wdGlvbmFsIE1BQyBoZWFkZXIgXQorICAgLSBTdGFydCt0cF9uZXQ6IFBhY2tldCBkYXRhLCBhbGlnbmVkIHRvIFRQQUNLRVRfQUxJR05NRU5UPTE2LgorICAgLSBQYWQgdG8gYWxpZ24gdG8gVFBBQ0tFVF9BTElHTk1FTlQ9MTYKKyAqLworCitzdHJ1Y3QgdHBhY2tldF9yZXEgeworCXVuc2lnbmVkIGludAl0cF9ibG9ja19zaXplOwkvKiBNaW5pbWFsIHNpemUgb2YgY29udGlndW91cyBibG9jayAqLworCXVuc2lnbmVkIGludAl0cF9ibG9ja19ucjsJLyogTnVtYmVyIG9mIGJsb2NrcyAqLworCXVuc2lnbmVkIGludAl0cF9mcmFtZV9zaXplOwkvKiBTaXplIG9mIGZyYW1lICovCisJdW5zaWduZWQgaW50CXRwX2ZyYW1lX25yOwkvKiBUb3RhbCBudW1iZXIgb2YgZnJhbWVzICovCit9OworCitzdHJ1Y3QgdHBhY2tldF9yZXEzIHsKKwl1bnNpZ25lZCBpbnQJdHBfYmxvY2tfc2l6ZTsJLyogTWluaW1hbCBzaXplIG9mIGNvbnRpZ3VvdXMgYmxvY2sgKi8KKwl1bnNpZ25lZCBpbnQJdHBfYmxvY2tfbnI7CS8qIE51bWJlciBvZiBibG9ja3MgKi8KKwl1bnNpZ25lZCBpbnQJdHBfZnJhbWVfc2l6ZTsJLyogU2l6ZSBvZiBmcmFtZSAqLworCXVuc2lnbmVkIGludAl0cF9mcmFtZV9ucjsJLyogVG90YWwgbnVtYmVyIG9mIGZyYW1lcyAqLworCXVuc2lnbmVkIGludAl0cF9yZXRpcmVfYmxrX3RvdjsgLyogdGltZW91dCBpbiBtc2VjcyAqLworCXVuc2lnbmVkIGludAl0cF9zaXplb2ZfcHJpdjsgLyogb2Zmc2V0IHRvIHByaXZhdGUgZGF0YSBhcmVhICovCisJdW5zaWduZWQgaW50CXRwX2ZlYXR1cmVfcmVxX3dvcmQ7Cit9OworCit1bmlvbiB0cGFja2V0X3JlcV91IHsKKwlzdHJ1Y3QgdHBhY2tldF9yZXEJcmVxOworCXN0cnVjdCB0cGFja2V0X3JlcTMJcmVxMzsKK307CisKK3N0cnVjdCBwYWNrZXRfbXJlcSB7CisJaW50CQltcl9pZmluZGV4OworCXVuc2lnbmVkIHNob3J0CW1yX3R5cGU7CisJdW5zaWduZWQgc2hvcnQJbXJfYWxlbjsKKwl1bnNpZ25lZCBjaGFyCW1yX2FkZHJlc3NbOF07Cit9OworCisjZGVmaW5lIFBBQ0tFVF9NUl9NVUxUSUNBU1QJMAorI2RlZmluZSBQQUNLRVRfTVJfUFJPTUlTQwkxCisjZGVmaW5lIFBBQ0tFVF9NUl9BTExNVUxUSQkyCisjZGVmaW5lIFBBQ0tFVF9NUl9VTklDQVNUCTMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3Bob25ldC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9waG9uZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmIwZDRhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9waG9uZXQuaApAQCAtMCwwICsxLDE2IEBACisvKgorICogRmlsZTogaWZfcGhvbmV0LmgKKyAqCisgKiBQaG9uZXQgaW50ZXJmYWNlIGtlcm5lbCBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqLworI2lmbmRlZiBMSU5VWF9JRl9QSE9ORVRfSAorI2RlZmluZSBMSU5VWF9JRl9QSE9ORVRfSAorCisjZGVmaW5lIFBIT05FVF9NSU5fTVRVCQk2CS8qIHBuX2xlbmd0aCA9IDAgKi8KKyNkZWZpbmUgUEhPTkVUX01BWF9NVFUJCTY1NTQxCS8qIHBuX2xlbmd0aCA9IDB4ZmZmZiAqLworI2RlZmluZSBQSE9ORVRfREVWX01UVQkJUEhPTkVUX01BWF9NVFUKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfcGxpcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9wbGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI5OGM3ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfcGxpcC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKglORVQzCVBMSVAgdHVuaW5nIGZhY2lsaXRpZXMgZm9yIHRoZSBuZXcgTmlpYmUgUExJUC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworIAorI2lmbmRlZiBfTElOVVhfSUZfUExJUF9ICisjZGVmaW5lIF9MSU5VWF9JRl9QTElQX0gKKworI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKworI2RlZmluZQlTSU9DREVWUExJUAlTSU9DREVWUFJJVkFURQorCitzdHJ1Y3QgcGxpcGNvbmYgeworCXVuc2lnbmVkIHNob3J0IHBjbWQ7CisJdW5zaWduZWQgbG9uZyAgbmliYmxlOworCXVuc2lnbmVkIGxvbmcgIHRyaWdnZXI7Cit9OworCisjZGVmaW5lIFBMSVBfR0VUX1RJTUVPVVQJMHgxCisjZGVmaW5lIFBMSVBfU0VUX1RJTUVPVVQJMHgyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9wcHAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfcHBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI4OGYyNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfcHBwLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBpZl9wcHAuaCAtIFBvaW50LXRvLVBvaW50IFByb3RvY29sIGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk4OSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKKyAqIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCisgKiBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCisgKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCisgKiBieSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4gIFRoZSBuYW1lIG9mIHRoZQorICogVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqLworCisvKgorICogID09RklMRVZFUlNJT04gMjAwNTA4MTI9PQorICoKKyAqICBOT1RFIFRPIE1BSU5UQUlORVJTOgorICogICAgIElmIHlvdSBtb2RpZnkgdGhpcyBmaWxlIGF0IGFsbCwgcGxlYXNlIHNldCB0aGUgYWJvdmUgZGF0ZS4KKyAqICAgICBpZl9wcHAuaCBpcyBzaGlwcGVkIHdpdGggYSBQUFAgZGlzdHJpYnV0aW9uIGFzIHdlbGwgYXMgd2l0aCB0aGUga2VybmVsOworICogICAgIGlmIGV2ZXJ5b25lIGluY3JlYXNlcyB0aGUgRklMRVZFUlNJT04gbnVtYmVyIGFib3ZlLCB0aGVuIHNjcmlwdHMKKyAqICAgICBjYW4gZG8gdGhlIHJpZ2h0IHRoaW5nIHdoZW4gZGVjaWRpbmcgd2hldGhlciB0byBpbnN0YWxsIGEgbmV3IGlmX3BwcC5oCisgKiAgICAgZmlsZS4gIERvbid0IGNoYW5nZSB0aGUgZm9ybWF0IG9mIHRoYXQgbGluZSBvdGhlcndpc2UsIHNvIHRoZQorICogICAgIGluc3RhbGxhdGlvbiBzY3JpcHQgY2FuIHJlY29nbml6ZSBpdC4KKyAqLworCisjaWZuZGVmIF9JRl9QUFBfSF8KKyNkZWZpbmUgX0lGX1BQUF9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworCisvKgorICogUGFja2V0IHNpemVzCisgKi8KKworI2RlZmluZQlQUFBfTVRVCQkxNTAwCS8qIERlZmF1bHQgTVRVIChzaXplIG9mIEluZm8gZmllbGQpICovCisjZGVmaW5lIFBQUF9NQVhNUlUJNjUwMDAJLyogTGFyZ2VzdCBNUlUgd2UgYWxsb3cgKi8KKyNkZWZpbmUgUFJPVE9fSVBYCTB4MDAyYgkvKiBwcm90b2NvbCBudW1iZXJzICovCisjZGVmaW5lIFBST1RPX0ROQV9SVCAgICAweDAwMjcgIC8qIEROQSBSb3V0aW5nICovCisKKworLyoKKyAqIEJpdCBkZWZpbml0aW9ucyBmb3IgZmxhZ3MuCisgKi8KKworI2RlZmluZSBTQ19DT01QX1BST1QJMHgwMDAwMDAwMQkvKiBwcm90b2NvbCBjb21wcmVzc2lvbiAob3V0cHV0KSAqLworI2RlZmluZSBTQ19DT01QX0FDCTB4MDAwMDAwMDIJLyogaGVhZGVyIGNvbXByZXNzaW9uIChvdXRwdXQpICovCisjZGVmaW5lCVNDX0NPTVBfVENQCTB4MDAwMDAwMDQJLyogVENQIChWSikgY29tcHJlc3Npb24gKG91dHB1dCkgKi8KKyNkZWZpbmUgU0NfTk9fVENQX0NDSUQJMHgwMDAwMDAwOAkvKiBkaXNhYmxlIFZKIGNvbm5lY3Rpb24taWQgY29tcC4gKi8KKyNkZWZpbmUgU0NfUkVKX0NPTVBfQUMJMHgwMDAwMDAxMAkvKiByZWplY3QgYWRycy9jdHJsIGNvbXAuIG9uIGlucHV0ICovCisjZGVmaW5lIFNDX1JFSl9DT01QX1RDUAkweDAwMDAwMDIwCS8qIHJlamVjdCBUQ1AgKFZKKSBjb21wLiBvbiBpbnB1dCAqLworI2RlZmluZSBTQ19DQ1BfT1BFTgkweDAwMDAwMDQwCS8qIExvb2sgYXQgQ0NQIHBhY2tldHMgKi8KKyNkZWZpbmUgU0NfQ0NQX1VQCTB4MDAwMDAwODAJLyogTWF5IHNlbmQvcmVjdiBjb21wcmVzc2VkIHBhY2tldHMgKi8KKyNkZWZpbmUgU0NfRU5BQkxFX0lQCTB4MDAwMDAxMDAJLyogSVAgcGFja2V0cyBtYXkgYmUgZXhjaGFuZ2VkICovCisjZGVmaW5lIFNDX0xPT1BfVFJBRkZJQwkweDAwMDAwMjAwCS8qIHNlbmQgdHJhZmZpYyB0byBwcHBkICovCisjZGVmaW5lIFNDX01VTFRJTElOSwkweDAwMDAwNDAwCS8qIGRvIG11bHRpbGluayBlbmNhcHN1bGF0aW9uICovCisjZGVmaW5lIFNDX01QX1NIT1JUU0VRCTB4MDAwMDA4MDAJLyogdXNlIHNob3J0IE1QIHNlcXVlbmNlIG51bWJlcnMgKi8KKyNkZWZpbmUgU0NfQ09NUF9SVU4JMHgwMDAwMTAwMAkvKiBjb21wcmVzc29yIGhhcyBiZWVuIGluaXRlZCAqLworI2RlZmluZSBTQ19ERUNPTVBfUlVOCTB4MDAwMDIwMDAJLyogZGVjb21wcmVzc29yIGhhcyBiZWVuIGluaXRlZCAqLworI2RlZmluZSBTQ19NUF9YU0hPUlRTRVEJMHgwMDAwNDAwMAkvKiB0cmFuc21pdCBzaG9ydCBNUCBzZXEgbnVtYmVycyAqLworI2RlZmluZSBTQ19ERUJVRwkweDAwMDEwMDAwCS8qIGVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyAqLworI2RlZmluZSBTQ19MT0dfSU5QS1QJMHgwMDAyMDAwMAkvKiBsb2cgY29udGVudHMgb2YgZ29vZCBwa3RzIHJlY3ZkICovCisjZGVmaW5lIFNDX0xPR19PVVRQS1QJMHgwMDA0MDAwMAkvKiBsb2cgY29udGVudHMgb2YgcGt0cyBzZW50ICovCisjZGVmaW5lIFNDX0xPR19SQVdJTgkweDAwMDgwMDAwCS8qIGxvZyBhbGwgY2hhcnMgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgU0NfTE9HX0ZMVVNICTB4MDAxMDAwMDAJLyogbG9nIGFsbCBjaGFycyBmbHVzaGVkICovCisjZGVmaW5lCVNDX1NZTkMJCTB4MDAyMDAwMDAJLyogc3luY2hyb25vdXMgc2VyaWFsIG1vZGUgKi8KKyNkZWZpbmUJU0NfTVVTVF9DT01QICAgIDB4MDA0MDAwMDAJLyogbm8gdW5jb21wcmVzc2VkIHBhY2tldHMgbWF5IGJlIHNlbnQgb3IgcmVjZWl2ZWQgKi8KKyNkZWZpbmUJU0NfTUFTSwkJMHgwZjYwMGZmZgkvKiBiaXRzIHRoYXQgdXNlciBjYW4gY2hhbmdlICovCisKKy8qIHN0YXRlIGJpdHMgKi8KKyNkZWZpbmUgU0NfWE1JVF9CVVNZCTB4MTAwMDAwMDAJLyogKHVzZWQgYnkgaXNkbl9wcHA/KSAqLworI2RlZmluZSBTQ19SQ1ZfT0REUAkweDA4MDAwMDAwCS8qIGhhdmUgcmN2ZCBjaGFyIHdpdGggb2RkIHBhcml0eSAqLworI2RlZmluZSBTQ19SQ1ZfRVZOUAkweDA0MDAwMDAwCS8qIGhhdmUgcmN2ZCBjaGFyIHdpdGggZXZlbiBwYXJpdHkgKi8KKyNkZWZpbmUgU0NfUkNWX0I3XzEJMHgwMjAwMDAwMAkvKiBoYXZlIHJjdmQgY2hhciB3aXRoIGJpdCA3ID0gMSAqLworI2RlZmluZSBTQ19SQ1ZfQjdfMAkweDAxMDAwMDAwCS8qIGhhdmUgcmN2ZCBjaGFyIHdpdGggYml0IDcgPSAwICovCisjZGVmaW5lIFNDX0RDX0ZFUlJPUgkweDAwODAwMDAwCS8qIGZhdGFsIGRlY29tcCBlcnJvciBkZXRlY3RlZCAqLworI2RlZmluZSBTQ19EQ19FUlJPUgkweDAwNDAwMDAwCS8qIG5vbi1mYXRhbCBkZWNvbXAgZXJyb3IgZGV0ZWN0ZWQgKi8KKworLyoKKyAqIElvY3RsIGRlZmluaXRpb25zLgorICovCisKK3N0cnVjdCBucGlvY3RsIHsKKwlpbnQJCXByb3RvY29sOwkvKiBQUFAgcHJvdG9jb2wsIGUuZy4gUFBQX0lQICovCisJZW51bSBOUG1vZGUJbW9kZTsKK307CisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIGEgQ0NQIGNvbmZpZ3VyYXRpb24gb3B0aW9uLCBmb3IgUFBQSU9DU0NPTVBSRVNTICovCitzdHJ1Y3QgcHBwX29wdGlvbl9kYXRhIHsKKwlfX3U4CSpwdHI7CisJX191MzIJbGVuZ3RoOworCWludAl0cmFuc21pdDsKK307CisKK3N0cnVjdCBpZnBwcHN0YXRzcmVxIHsKKwlzdHJ1Y3QgaWZyZXEJIGI7CisJc3RydWN0IHBwcF9zdGF0cyBzdGF0czsJCQkvKiBzdGF0aXN0aWMgaW5mb3JtYXRpb24gKi8KK307CisKK3N0cnVjdCBpZnBwcGNzdGF0c3JlcSB7CisJc3RydWN0IGlmcmVxCSAgICAgIGI7CisJc3RydWN0IHBwcF9jb21wX3N0YXRzIHN0YXRzOworfTsKKworLyogRm9yIFBQUElPQ0dMMlRQU1RBVFMgKi8KK3N0cnVjdCBwcHBvbDJ0cF9pb2Nfc3RhdHMgeworCV9fdTE2CQl0dW5uZWxfaWQ7CS8qIHJlZHVuZGFudCAqLworCV9fdTE2CQlzZXNzaW9uX2lkOwkvKiBpZiB6ZXJvLCBnZXQgdHVubmVsIHN0YXRzICovCisJX191MzIJCXVzaW5nX2lwc2VjOjE7CS8qIHZhbGlkIG9ubHkgZm9yIHNlc3Npb25faWQgPT0gMCAqLworCV9fYWxpZ25lZF91NjQJdHhfcGFja2V0czsKKwlfX2FsaWduZWRfdTY0CXR4X2J5dGVzOworCV9fYWxpZ25lZF91NjQJdHhfZXJyb3JzOworCV9fYWxpZ25lZF91NjQJcnhfcGFja2V0czsKKwlfX2FsaWduZWRfdTY0CXJ4X2J5dGVzOworCV9fYWxpZ25lZF91NjQJcnhfc2VxX2Rpc2NhcmRzOworCV9fYWxpZ25lZF91NjQJcnhfb29zX3BhY2tldHM7CisJX19hbGlnbmVkX3U2NAlyeF9lcnJvcnM7Cit9OworCisjZGVmaW5lIGlmcl9fbmFtZSAgICAgICBiLmlmcl9pZnJuLmlmcm5fbmFtZQorI2RlZmluZSBzdGF0c19wdHIgICAgICAgYi5pZnJfaWZydS5pZnJ1X2RhdGEKKworLyoKKyAqIElvY3RsIGRlZmluaXRpb25zLgorICovCisKKyNkZWZpbmUJUFBQSU9DR0ZMQUdTCV9JT1IoJ3QnLCA5MCwgaW50KQkvKiBnZXQgY29uZmlndXJhdGlvbiBmbGFncyAqLworI2RlZmluZQlQUFBJT0NTRkxBR1MJX0lPVygndCcsIDg5LCBpbnQpCS8qIHNldCBjb25maWd1cmF0aW9uIGZsYWdzICovCisjZGVmaW5lCVBQUElPQ0dBU1lOQ01BUAlfSU9SKCd0JywgODgsIGludCkJLyogZ2V0IGFzeW5jIG1hcCAqLworI2RlZmluZQlQUFBJT0NTQVNZTkNNQVAJX0lPVygndCcsIDg3LCBpbnQpCS8qIHNldCBhc3luYyBtYXAgKi8KKyNkZWZpbmUJUFBQSU9DR1VOSVQJX0lPUigndCcsIDg2LCBpbnQpCS8qIGdldCBwcHAgdW5pdCBudW1iZXIgKi8KKyNkZWZpbmUJUFBQSU9DR1JBU1lOQ01BUCBfSU9SKCd0JywgODUsIGludCkJLyogZ2V0IHJlY2VpdmUgYXN5bmMgbWFwICovCisjZGVmaW5lCVBQUElPQ1NSQVNZTkNNQVAgX0lPVygndCcsIDg0LCBpbnQpCS8qIHNldCByZWNlaXZlIGFzeW5jIG1hcCAqLworI2RlZmluZQlQUFBJT0NHTVJVCV9JT1IoJ3QnLCA4MywgaW50KQkvKiBnZXQgbWF4IHJlY2VpdmUgdW5pdCAqLworI2RlZmluZQlQUFBJT0NTTVJVCV9JT1coJ3QnLCA4MiwgaW50KQkvKiBzZXQgbWF4IHJlY2VpdmUgdW5pdCAqLworI2RlZmluZQlQUFBJT0NTTUFYQ0lECV9JT1coJ3QnLCA4MSwgaW50KQkvKiBzZXQgVkogbWF4IHNsb3QgSUQgKi8KKyNkZWZpbmUgUFBQSU9DR1hBU1lOQ01BUCBfSU9SKCd0JywgODAsIGV4dF9hY2NtKSAvKiBnZXQgZXh0ZW5kZWQgQUNDTSAqLworI2RlZmluZSBQUFBJT0NTWEFTWU5DTUFQIF9JT1coJ3QnLCA3OSwgZXh0X2FjY20pIC8qIHNldCBleHRlbmRlZCBBQ0NNICovCisjZGVmaW5lIFBQUElPQ1hGRVJVTklUCV9JTygndCcsIDc4KQkJLyogdHJhbnNmZXIgUFBQIHVuaXQgKi8KKyNkZWZpbmUgUFBQSU9DU0NPTVBSRVNTCV9JT1coJ3QnLCA3Nywgc3RydWN0IHBwcF9vcHRpb25fZGF0YSkKKyNkZWZpbmUgUFBQSU9DR05QTU9ERQlfSU9XUigndCcsIDc2LCBzdHJ1Y3QgbnBpb2N0bCkgLyogZ2V0IE5QIG1vZGUgKi8KKyNkZWZpbmUgUFBQSU9DU05QTU9ERQlfSU9XKCd0JywgNzUsIHN0cnVjdCBucGlvY3RsKSAgLyogc2V0IE5QIG1vZGUgKi8KKyNkZWZpbmUgUFBQSU9DU1BBU1MJX0lPVygndCcsIDcxLCBzdHJ1Y3Qgc29ja19mcHJvZykgLyogc2V0IHBhc3MgZmlsdGVyICovCisjZGVmaW5lIFBQUElPQ1NBQ1RJVkUJX0lPVygndCcsIDcwLCBzdHJ1Y3Qgc29ja19mcHJvZykgLyogc2V0IGFjdGl2ZSBmaWx0ICovCisjZGVmaW5lIFBQUElPQ0dERUJVRwlfSU9SKCd0JywgNjUsIGludCkJLyogUmVhZCBkZWJ1ZyBsZXZlbCAqLworI2RlZmluZSBQUFBJT0NTREVCVUcJX0lPVygndCcsIDY0LCBpbnQpCS8qIFNldCBkZWJ1ZyBsZXZlbCAqLworI2RlZmluZSBQUFBJT0NHSURMRQlfSU9SKCd0JywgNjMsIHN0cnVjdCBwcHBfaWRsZSkgLyogZ2V0IGlkbGUgdGltZSAqLworI2RlZmluZSBQUFBJT0NORVdVTklUCV9JT1dSKCd0JywgNjIsIGludCkJLyogY3JlYXRlIG5ldyBwcHAgdW5pdCAqLworI2RlZmluZSBQUFBJT0NBVFRBQ0gJX0lPVygndCcsIDYxLCBpbnQpCS8qIGF0dGFjaCB0byBwcHAgdW5pdCAqLworI2RlZmluZSBQUFBJT0NERVRBQ0gJX0lPVygndCcsIDYwLCBpbnQpCS8qIGRldGFjaCBmcm9tIHBwcCB1bml0L2NoYW4gKi8KKyNkZWZpbmUgUFBQSU9DU01SUlUJX0lPVygndCcsIDU5LCBpbnQpCS8qIHNldCBtdWx0aWxpbmsgTVJVICovCisjZGVmaW5lIFBQUElPQ0NPTk5FQ1QJX0lPVygndCcsIDU4LCBpbnQpCS8qIGNvbm5lY3QgY2hhbm5lbCB0byB1bml0ICovCisjZGVmaW5lIFBQUElPQ0RJU0NPTk4JX0lPKCd0JywgNTcpCQkvKiBkaXNjb25uZWN0IGNoYW5uZWwgKi8KKyNkZWZpbmUgUFBQSU9DQVRUQ0hBTglfSU9XKCd0JywgNTYsIGludCkJLyogYXR0YWNoIHRvIHBwcCBjaGFubmVsICovCisjZGVmaW5lIFBQUElPQ0dDSEFOCV9JT1IoJ3QnLCA1NSwgaW50KQkvKiBnZXQgcHBwIGNoYW5uZWwgbnVtYmVyICovCisjZGVmaW5lIFBQUElPQ0dMMlRQU1RBVFMgX0lPUigndCcsIDU0LCBzdHJ1Y3QgcHBwb2wydHBfaW9jX3N0YXRzKQorCisjZGVmaW5lIFNJT0NHUFBQU1RBVFMgICAoU0lPQ0RFVlBSSVZBVEUgKyAwKQorI2RlZmluZSBTSU9DR1BQUFZFUiAgICAgKFNJT0NERVZQUklWQVRFICsgMSkJLyogTkVWRVIgY2hhbmdlIHRoaXMhISAqLworI2RlZmluZSBTSU9DR1BQUENTVEFUUyAgKFNJT0NERVZQUklWQVRFICsgMikKKworI2lmICFkZWZpbmVkKGlmcl9tdHUpCisjZGVmaW5lIGlmcl9tdHUJaWZyX2lmcnUuaWZydV9tZXRyaWMKKyNlbmRpZgorCisjZW5kaWYgLyogX0lGX1BQUF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9wcHBvbDJ0cC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9wcHBvbDJ0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZmI5ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3BwcG9sMnRwLmgKQEAgLTAsMCArMSw3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGludXggUFBQIG92ZXIgTDJUUCAoUFBQb0wyVFApIFNvY2tldCBJbXBsZW1lbnRhdGlvbiAoUkZDIDI2NjEpCisgKgorICogVGhpcyBmaWxlIHN1cHBsaWVzIGRlZmluaXRpb25zIHJlcXVpcmVkIGJ5IHRoZSBQUFAgb3ZlciBMMlRQIGRyaXZlcgorICogKGwydHBfcHBwLmMpLiAgQWxsIHZlcnNpb24gaW5mb3JtYXRpb24gd3J0IHRoaXMgZmlsZSBpcyBsb2NhdGVkIGluIGwydHBfcHBwLmMKKyAqCisgKiBMaWNlbnNlOgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX19MSU5VWF9JRl9QUFBPTDJUUF9ICisjZGVmaW5lIF9fTElOVVhfSUZfUFBQT0wyVFBfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworCisvKiBTdHJ1Y3R1cmUgdXNlZCB0byBjb25uZWN0KCkgdGhlIHNvY2tldCB0byBhIHBhcnRpY3VsYXIgdHVubmVsIFVEUAorICogc29ja2V0LgorICovCitzdHJ1Y3QgcHBwb2wydHBfYWRkciB7CisJX19rZXJuZWxfcGlkX3QJcGlkOwkJLyogcGlkIHRoYXQgb3ducyB0aGUgZmQuCisJCQkJCSAqIDAgPT4gY3VycmVudCAqLworCWludAlmZDsJCQkvKiBGRCBvZiBVRFAgc29ja2V0IHRvIHVzZSAqLworCisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CS8qIElQIGFkZHJlc3MgYW5kIHBvcnQgdG8gc2VuZCB0byAqLworCisJX191MTYgc190dW5uZWwsIHNfc2Vzc2lvbjsJLyogRm9yIG1hdGNoaW5nIGluY29taW5nIHBhY2tldHMgKi8KKwlfX3UxNiBkX3R1bm5lbCwgZF9zZXNzaW9uOwkvKiBGb3Igc2VuZGluZyBvdXRnb2luZyBwYWNrZXRzICovCit9OworCisvKiBUaGUgTDJUUHYzIHByb3RvY29sIGNoYW5nZXMgdHVubmVsIGFuZCBzZXNzaW9uIGlkcyBmcm9tIDE2IHRvIDMyCisgKiBiaXRzLiBTbyB3ZSBuZWVkIGEgZGlmZmVyZW50IHNvY2thZGRyIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IHBwcG9sMnRwdjNfYWRkciB7CisJX19rZXJuZWxfcGlkX3QJcGlkOwkJLyogcGlkIHRoYXQgb3ducyB0aGUgZmQuCisJCQkJCSAqIDAgPT4gY3VycmVudCAqLworCWludAlmZDsJCQkvKiBGRCBvZiBVRFAgb3IgSVAgc29ja2V0IHRvIHVzZSAqLworCisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CS8qIElQIGFkZHJlc3MgYW5kIHBvcnQgdG8gc2VuZCB0byAqLworCisJX191MzIgc190dW5uZWwsIHNfc2Vzc2lvbjsJLyogRm9yIG1hdGNoaW5nIGluY29taW5nIHBhY2tldHMgKi8KKwlfX3UzMiBkX3R1bm5lbCwgZF9zZXNzaW9uOwkvKiBGb3Igc2VuZGluZyBvdXRnb2luZyBwYWNrZXRzICovCit9OworCisvKiBTb2NrZXQgb3B0aW9uczoKKyAqIERFQlVHCS0gYml0bWFzayBvZiBkZWJ1ZyBtZXNzYWdlIGNhdGVnb3JpZXMKKyAqIFNFTkRTRVEJLSAwID0+IGRvbid0IHNlbmQgcGFja2V0cyB3aXRoIHNlcXVlbmNlIG51bWJlcnMKKyAqCQkgIDEgPT4gc2VuZCBwYWNrZXRzIHdpdGggc2VxdWVuY2UgbnVtYmVycworICogUkVDVlNFUQktIDAgPT4gcmVjZWl2ZSBwYWNrZXQgc2VxdWVuY2UgbnVtYmVycyBhcmUgb3B0aW9uYWwKKyAqCQkgIDEgPT4gZHJvcCByZWNlaXZlIHBhY2tldHMgd2l0aG91dCBzZXF1ZW5jZSBudW1iZXJzCisgKiBMTlNNT0RFCS0gMCA9PiBhY3QgYXMgTEFDLgorICoJCSAgMSA9PiBhY3QgYXMgTE5TLgorICogUkVPUkRFUlRPCS0gcmVvcmRlciB0aW1lb3V0IChpbiBtaWxsaXNlY3MpLiBJZiAwLCBkb24ndCB0cnkgdG8gcmVvcmRlci4KKyAqLworZW51bSB7CisJUFBQT0wyVFBfU09fREVCVUcJPSAxLAorCVBQUE9MMlRQX1NPX1JFQ1ZTRVEJPSAyLAorCVBQUE9MMlRQX1NPX1NFTkRTRVEJPSAzLAorCVBQUE9MMlRQX1NPX0xOU01PREUJPSA0LAorCVBQUE9MMlRQX1NPX1JFT1JERVJUTwk9IDUsCit9OworCisvKiBEZWJ1ZyBtZXNzYWdlIGNhdGVnb3JpZXMgZm9yIHRoZSBERUJVRyBzb2NrZXQgb3B0aW9uICovCitlbnVtIHsKKwlQUFBPTDJUUF9NU0dfREVCVUcJPSAoMSA8PCAwKSwJLyogdmVyYm9zZSBkZWJ1ZyAoaWYKKwkJCQkJCSAqIGNvbXBpbGVkIGluKSAqLworCVBQUE9MMlRQX01TR19DT05UUk9MCT0gKDEgPDwgMSksCS8qIHVzZXJzcGFjZSAtIGtlcm5lbAorCQkJCQkJICogaW50ZXJmYWNlICovCisJUFBQT0wyVFBfTVNHX1NFUQk9ICgxIDw8IDIpLAkvKiBzZXF1ZW5jZSBudW1iZXJzICovCisJUFBQT0wyVFBfTVNHX0RBVEEJPSAoMSA8PCAzKSwJLyogZGF0YSBwYWNrZXRzICovCit9OworCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3BwcG94LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3BwcG94LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBjYzI5YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfcHBwb3guaApAQCAtMCwwICsxLDE0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGludXggUFBQIG92ZXIgWCAtIEdlbmVyaWMgUFBQIHRyYW5zcG9ydCBsYXllciBzb2NrZXRzCisgKiBMaW51eCBQUFAgb3ZlciBFdGhlcm5ldCAoUFBQb0UpIFNvY2tldCBJbXBsZW1lbnRhdGlvbiAoUkZDIDI1MTYpIAorICoKKyAqIFRoaXMgZmlsZSBzdXBwbGllcyBkZWZpbml0aW9ucyByZXF1aXJlZCBieSB0aGUgUFBQIG92ZXIgRXRoZXJuZXQgZHJpdmVyCisgKiAocHBwb3guYykuICBBbGwgdmVyc2lvbiBpbmZvcm1hdGlvbiB3cnQgdGhpcyBmaWxlIGlzIGxvY2F0ZWQgaW4gcHBwb3guYworICoKKyAqIExpY2Vuc2U6CisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0lGX1BQUE9YX0gKKyNkZWZpbmUgX19MSU5VWF9JRl9QUFBPWF9ICisKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wcHBvbDJ0cC5oPgorCisvKiBGb3IgdXNlci1zcGFjZSBwcm9ncmFtcyB0byBwaWNrIHVwIHRoZXNlIGRlZmluaXRpb25zCisgKiB3aGljaCB0aGV5IHdvdWxkbid0IGdldCBvdGhlcndpc2Ugd2l0aG91dCBkZWZpbmluZyBfX0tFUk5FTF9fCisgKi8KKyNpZm5kZWYgQUZfUFBQT1gKKyNkZWZpbmUgQUZfUFBQT1gJMjQKKyNkZWZpbmUgUEZfUFBQT1gJQUZfUFBQT1gKKyNlbmRpZiAvKiAhKEFGX1BQUE9YKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogUFBQb0UgYWRkcmVzc2luZyBkZWZpbml0aW9uIAorICovIAordHlwZWRlZiBfX2JlMTYgc2lkX3Q7CitzdHJ1Y3QgcHBwb2VfYWRkciB7CisJc2lkX3QgICAgICAgICBzaWQ7ICAgICAgICAgICAgICAgICAgICAvKiBTZXNzaW9uIGlkZW50aWZpZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHJlbW90ZVtFVEhfQUxFTl07ICAgICAgIC8qIFJlbW90ZSBhZGRyZXNzICovCisJY2hhciAgICAgICAgICBkZXZbSUZOQU1TSVpdOyAgICAgICAgICAvKiBMb2NhbCBkZXZpY2UgdG8gdXNlICovCit9OyAKKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBQUFRQIGFkZHJlc3NpbmcgZGVmaW5pdGlvbgorICovCitzdHJ1Y3QgcHB0cF9hZGRyIHsKKwlfX2JlMTYJCWNhbGxfaWQ7CisJc3RydWN0IGluX2FkZHIJc2luX2FkZHI7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcm90b2NvbHMgc3VwcG9ydGVkIGJ5IEFGX1BQUE9YCisgKi8KKyNkZWZpbmUgUFhfUFJPVE9fT0UgICAgMCAvKiBDdXJyZW50bHkganVzdCBQUFBvRSAqLworI2RlZmluZSBQWF9QUk9UT19PTDJUUCAxIC8qIE5vdyBMMlRQIGFsc28gKi8KKyNkZWZpbmUgUFhfUFJPVE9fUFBUUCAgMgorI2RlZmluZSBQWF9NQVhfUFJPVE8gICAzCisKK3N0cnVjdCBzb2NrYWRkcl9wcHBveCB7CisJX19rZXJuZWxfc2FfZmFtaWx5X3Qgc2FfZmFtaWx5OyAgICAgICAvKiBhZGRyZXNzIGZhbWlseSwgQUZfUFBQT1ggKi8KKwl1bnNpZ25lZCBpbnQgICAgc2FfcHJvdG9jb2w7ICAgICAgICAgIC8qIHByb3RvY29sIGlkZW50aWZpZXIgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBwcHBvZV9hZGRyICBwcHBvZTsKKwkJc3RydWN0IHBwdHBfYWRkciAgIHBwdHA7CisJfSBzYV9hZGRyOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogVGhlIHVzZSBvZiB0aGUgYWJvdmUgdW5pb24gaXNuJ3QgdmlhYmxlIGJlY2F1c2UgdGhlIHNpemUgb2YgdGhpcworICogc3RydWN0IG11c3Qgc3RheSBmaXhlZCBvdmVyIHRpbWUgLS0gYXBwbGljYXRpb25zIHVzZSBzaXplb2Yoc3RydWN0CisgKiBzb2NrYWRkcl9wcHBveCkgdG8gZmlsbCBpdC4gV2UgdXNlIGEgcHJvdG9jb2wgc3BlY2lmaWMgc29ja2FkZHIKKyAqIHR5cGUgaW5zdGVhZC4KKyAqLworc3RydWN0IHNvY2thZGRyX3BwcG9sMnRwIHsKKwlfX2tlcm5lbF9zYV9mYW1pbHlfdCBzYV9mYW1pbHk7IC8qIGFkZHJlc3MgZmFtaWx5LCBBRl9QUFBPWCAqLworCXVuc2lnbmVkIGludCAgICBzYV9wcm90b2NvbDsgICAgLyogcHJvdG9jb2wgaWRlbnRpZmllciAqLworCXN0cnVjdCBwcHBvbDJ0cF9hZGRyIHBwcG9sMnRwOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogVGhlIEwyVFB2MyBwcm90b2NvbCBjaGFuZ2VzIHR1bm5lbCBhbmQgc2Vzc2lvbiBpZHMgZnJvbSAxNiB0byAzMgorICogYml0cy4gU28gd2UgbmVlZCBhIGRpZmZlcmVudCBzb2NrYWRkciBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBzb2NrYWRkcl9wcHBvbDJ0cHYzIHsKKwlfX2tlcm5lbF9zYV9mYW1pbHlfdCBzYV9mYW1pbHk7IC8qIGFkZHJlc3MgZmFtaWx5LCBBRl9QUFBPWCAqLworCXVuc2lnbmVkIGludCAgICBzYV9wcm90b2NvbDsgICAgLyogcHJvdG9jb2wgaWRlbnRpZmllciAqLworCXN0cnVjdCBwcHBvbDJ0cHYzX2FkZHIgcHBwb2wydHA7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogaW9jdGwgaW50ZXJmYWNlIGZvciBkZWZpbmluZyBmb3J3YXJkaW5nIG9mIGNvbm5lY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFBQUE9FSU9DU0ZXRAlfSU9XKDB4QjEgLDAsIHNpemVfdCkKKyNkZWZpbmUgUFBQT0VJT0NERldECV9JTygweEIxICwxKQorLyojZGVmaW5lIFBQUE9FSU9DR0ZXRAlfSU9XUigweEIxLDIsIHNpemVfdCkqLworCisvKiBDb2RlcyB0byBpZGVudGlmeSBtZXNzYWdlIHR5cGVzICovCisjZGVmaW5lIFBBRElfQ09ERQkweDA5CisjZGVmaW5lIFBBRE9fQ09ERQkweDA3CisjZGVmaW5lIFBBRFJfQ09ERQkweDE5CisjZGVmaW5lIFBBRFNfQ09ERQkweDY1CisjZGVmaW5lIFBBRFRfQ09ERQkweGE3CitzdHJ1Y3QgcHBwb2VfdGFnIHsKKwlfX2JlMTYgdGFnX3R5cGU7CisJX19iZTE2IHRhZ19sZW47CisJY2hhciB0YWdfZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBUYWcgaWRlbnRpZmllcnMgKi8KKyNkZWZpbmUgUFRUX0VPTAkJX19jcHVfdG9fYmUxNigweDAwMDApCisjZGVmaW5lIFBUVF9TUlZfTkFNRQlfX2NwdV90b19iZTE2KDB4MDEwMSkKKyNkZWZpbmUgUFRUX0FDX05BTUUJX19jcHVfdG9fYmUxNigweDAxMDIpCisjZGVmaW5lIFBUVF9IT1NUX1VOSVEJX19jcHVfdG9fYmUxNigweDAxMDMpCisjZGVmaW5lIFBUVF9BQ19DT09LSUUJX19jcHVfdG9fYmUxNigweDAxMDQpCisjZGVmaW5lIFBUVF9WRU5ET1IgCV9fY3B1X3RvX2JlMTYoMHgwMTA1KQorI2RlZmluZSBQVFRfUkVMQVlfU0lECV9fY3B1X3RvX2JlMTYoMHgwMTEwKQorI2RlZmluZSBQVFRfU1JWX0VSUiAgICAgX19jcHVfdG9fYmUxNigweDAyMDEpCisjZGVmaW5lIFBUVF9TWVNfRVJSICAJX19jcHVfdG9fYmUxNigweDAyMDIpCisjZGVmaW5lIFBUVF9HRU5fRVJSICAJX19jcHVfdG9fYmUxNigweDAyMDMpCisKK3N0cnVjdCBwcHBvZV9oZHIgeworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggdmVyIDogNDsKKwlfX3U4IHR5cGUgOiA0OworI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OCB0eXBlIDogNDsKKwlfX3U4IHZlciA6IDQ7CisjZWxzZQorI2Vycm9yCSJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisJX191OCBjb2RlOworCV9fYmUxNiBzaWQ7CisJX19iZTE2IGxlbmd0aDsKKwlzdHJ1Y3QgcHBwb2VfdGFnIHRhZ1swXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIExlbmd0aCBvZiBlbnRpcmUgUFBQb0UgKyBQUFAgaGVhZGVyICovCisjZGVmaW5lIFBQUE9FX1NFU19ITEVOCTgKKworCisjZW5kaWYgLyogIShfX0xJTlVYX0lGX1BQUE9YX0gpICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3NsaXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfc2xpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYjRlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3NsaXAuaApAQCAtMCwwICsxLDMwIEBACisvKgorICoJU3dhbnNlYSBVbml2ZXJzaXR5IENvbXB1dGVyIFNvY2lldHkJTkVUMworICoJCisgKglUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGNvbnN0YW50cyBvZiBzcGVjaWFsIHVzZSB3aXRoIHRoZSBTTElQL0NTTElQLworICoJS0lTUyBUTkMgZHJpdmVyLgorICovCisgCisjaWZuZGVmIF9fTElOVVhfU0xJUF9ICisjZGVmaW5lIF9fTElOVVhfU0xJUF9ICisKKyNkZWZpbmUJCVNMX01PREVfU0xJUAkJMAorI2RlZmluZQkJU0xfTU9ERV9DU0xJUAkJMQorI2RlZmluZSAJU0xfTU9ERV9LSVNTCQk0CisKKyNkZWZpbmUJCVNMX09QVF9TSVhCSVQJCTIKKyNkZWZpbmUJCVNMX09QVF9BREFQVElWRQkJOAorCisvKgorICoJVlNWID0gaW9jdGwgZm9yIGtlZXBhbGl2ZSAmIG91dGZpbGwgaW4gU0xJUCBkcml2ZXIgCisgKi8KKyAKKyNkZWZpbmUgU0lPQ1NLRUVQQUxJVkUJKFNJT0NERVZQUklWQVRFKQkJLyogU2V0IGtlZXBhbGl2ZSB0aW1lb3V0IGluIHNlYyAqLworI2RlZmluZSBTSU9DR0tFRVBBTElWRQkoU0lPQ0RFVlBSSVZBVEUrMSkJCS8qIEdldCBrZWVwYWxpdmUgdGltZW91dCAqLworI2RlZmluZSBTSU9DU09VVEZJTEwJKFNJT0NERVZQUklWQVRFKzIpCQkvKiBTZXQgb3V0ZmlsbCB0aW1lb3V0ICovCisjZGVmaW5lCVNJT0NHT1VURklMTAkoU0lPQ0RFVlBSSVZBVEUrMykJCS8qIEdldCBvdXRmaWxsIHRpbWVvdXQgKi8KKyNkZWZpbmUgU0lPQ1NMRUFTRQkoU0lPQ0RFVlBSSVZBVEUrNCkJCS8qIFNldCAibGVhc2VkIiBsaW5lIHR5cGUgKi8KKyNkZWZpbmUJU0lPQ0dMRUFTRQkoU0lPQ0RFVlBSSVZBVEUrNSkJCS8qIEdldCBsaW5lIHR5cGUgKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfc3RyaXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfc3RyaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTI2YTYyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9zdHJpcC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBpZl9zdHJpcC5oIC0tCisgKgorICogICAgICBEZWZpbml0aW9ucyBmb3IgdGhlIFNUUklQIGludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAxOTk2IFRoZSBCb2FyZCBvZiBUcnVzdGVlcyBvZiBUaGUgTGVsYW5kIFN0YW5mb3JkCisgKiBKdW5pb3IgVW5pdmVyc2l0eS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0CisgKiBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLiAgU3RhbmZvcmQgVW5pdmVyc2l0eQorICogbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzCisgKiBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfU1RSSVBfSAorI2RlZmluZSBfX0xJTlVYX1NUUklQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBfX3U4IGNbNl07Cit9IE1ldHJpY29tQWRkcmVzczsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3RyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0YmM5NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfdHIuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCUdsb2JhbCBkZWZpbml0aW9ucyBmb3IgdGhlIFRva2VuLVJpbmcgSUVFRSA4MDIuNSBpbnRlcmZhY2UuCisgKgorICogVmVyc2lvbjoJQCgjKWlmX3RyLmgJMC4wCTA3LzExLzk0CisgKgorICogQXV0aG9yOglGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCQlEb25hbGQgQmVja2VyLCA8YmVja2VyQHN1cGVyLm9yZz4KKyAqCQlQZXRlciBEZSBTY2hyaWp2ZXIsIDxzdHVkMTFAY2M0Lmt1bGV1dmVuLmFjLmJlPgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9MSU5VWF9JRl9UUl9ICisjZGVmaW5lIF9MSU5VWF9JRl9UUl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4JLyogRm9yIF9fYmUxNiAqLworCisvKiBJRUVFIDgwMi41IFRva2VuLVJpbmcgbWFnaWMgY29uc3RhbnRzLiAgVGhlIGZyYW1lIHNpemVzIG9taXQgdGhlIHByZWFtYmxlCisgICBhbmQgRkNTL0NSQyAoZnJhbWUgY2hlY2sgc2VxdWVuY2UpLiAqLworI2RlZmluZSBUUl9BTEVOCQk2CQkvKiBPY3RldHMgaW4gb25lIHRva2VuLXJpbmcgYWRkciAqLworI2RlZmluZSBUUl9ITEVOIAkoc2l6ZW9mKHN0cnVjdCB0cmhfaGRyKStzaXplb2Yoc3RydWN0IHRybGxjKSkKKyNkZWZpbmUgQUMJCTB4MTAKKyNkZWZpbmUgTExDX0ZSQU1FIAkweDQwCisKKy8qIExMQyBhbmQgU05BUCBjb25zdGFudHMgKi8KKyNkZWZpbmUgRVhURU5ERURfU0FQIAkweEFBCisjZGVmaW5lIFVJX0NNRCAgICAgICAJMHgwMworCisvKiBUaGlzIGlzIGFuIFRva2VuLVJpbmcgZnJhbWUgaGVhZGVyLiAqLworc3RydWN0IHRyaF9oZHIgeworCV9fdTggIGFjOwkJCS8qIGFjY2VzcyBjb250cm9sIGZpZWxkICovCisJX191OCAgZmM7CQkJLyogZnJhbWUgY29udHJvbCBmaWVsZCAqLworCV9fdTggIGRhZGRyW1RSX0FMRU5dOwkJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworCV9fdTggIHNhZGRyW1RSX0FMRU5dOwkJLyogc291cmNlIGFkZHJlc3MgKi8KKwlfX2JlMTYgcmNmOwkJCS8qIHJvdXRlIGNvbnRyb2wgZmllbGQgKi8KKwlfX2JlMTYgcnNlZ1s4XTsJCQkvKiByb3V0aW5nIHJlZ2lzdGVycyAqLworfTsKKworCisvKiBUaGlzIGlzIGFuIFRva2VuLVJpbmcgTExDIHN0cnVjdHVyZSAqLworc3RydWN0IHRybGxjIHsKKwlfX3U4ICBkc2FwOwkJCS8qIGRlc3RpbmF0aW9uIFNBUCAqLworCV9fdTggIHNzYXA7CQkJLyogc291cmNlIFNBUCAqLworCV9fdTggIGxsYzsJCQkvKiBMTEMgY29udHJvbCBmaWVsZCAqLworCV9fdTggIHByb3RpZFszXTsJCS8qIHByb3RvY29sIGlkICovCisJX19iZTE2IGV0aGVydHlwZTsJCS8qIGV0aGVyIHR5cGUgZmllbGQgKi8KK307CisKKy8qIFRva2VuLVJpbmcgc3RhdGlzdGljcyBjb2xsZWN0aW9uIGRhdGEuICovCitzdHJ1Y3QgdHJfc3RhdGlzdGljcyB7CisJdW5zaWduZWQgbG9uZyByeF9wYWNrZXRzOyAgICAgICAvKiB0b3RhbCBwYWNrZXRzIHJlY2VpdmVkCSovCisJdW5zaWduZWQgbG9uZyB0eF9wYWNrZXRzOwkvKiB0b3RhbCBwYWNrZXRzIHRyYW5zbWl0dGVkCSovCisJdW5zaWduZWQgbG9uZyByeF9ieXRlczsJCS8qIHRvdGFsIGJ5dGVzIHJlY2VpdmVkICAgCSovCisJdW5zaWduZWQgbG9uZyB0eF9ieXRlczsJCS8qIHRvdGFsIGJ5dGVzIHRyYW5zbWl0dGVkCSovCisJdW5zaWduZWQgbG9uZyByeF9lcnJvcnM7CS8qIGJhZCBwYWNrZXRzIHJlY2VpdmVkCQkqLworCXVuc2lnbmVkIGxvbmcgdHhfZXJyb3JzOwkvKiBwYWNrZXQgdHJhbnNtaXQgcHJvYmxlbXMJKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2Ryb3BwZWQ7CS8qIG5vIHNwYWNlIGluIGxpbnV4IGJ1ZmZlcnMJKi8KKwl1bnNpZ25lZCBsb25nIHR4X2Ryb3BwZWQ7CS8qIG5vIHNwYWNlIGF2YWlsYWJsZSBpbiBsaW51eAkqLworCXVuc2lnbmVkIGxvbmcgbXVsdGljYXN0OwkvKiBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZAkqLworCXVuc2lnbmVkIGxvbmcgdHJhbnNtaXRfY29sbGlzaW9uOworCisJLyogZGV0YWlsZWQgVG9rZW4tUmluZyBlcnJvcnMuIFNlZSBJQk0gVG9rZW4tUmluZyBOZXR3b3JrCisJICAgQXJjaGl0ZWN0dXJlIGZvciBtb3JlIGluZm8gKi8KKworCXVuc2lnbmVkIGxvbmcgbGluZV9lcnJvcnM7CisJdW5zaWduZWQgbG9uZyBpbnRlcm5hbF9lcnJvcnM7CisJdW5zaWduZWQgbG9uZyBidXJzdF9lcnJvcnM7CisJdW5zaWduZWQgbG9uZyBBX0NfZXJyb3JzOworCXVuc2lnbmVkIGxvbmcgYWJvcnRfZGVsaW1pdGVyczsKKwl1bnNpZ25lZCBsb25nIGxvc3RfZnJhbWVzOworCXVuc2lnbmVkIGxvbmcgcmVjdl9jb25nZXN0X2NvdW50OworCXVuc2lnbmVkIGxvbmcgZnJhbWVfY29waWVkX2Vycm9yczsKKwl1bnNpZ25lZCBsb25nIGZyZXF1ZW5jeV9lcnJvcnM7CisJdW5zaWduZWQgbG9uZyB0b2tlbl9lcnJvcnM7CisJdW5zaWduZWQgbG9uZyBkdW1teTE7Cit9OworCisvKiBzb3VyY2Ugcm91dGluZyBzdHVmZiAqLworI2RlZmluZSBUUl9SSUkgCQkJMHg4MAorI2RlZmluZSBUUl9SQ0ZfRElSX0JJVCAJCTB4ODAKKyNkZWZpbmUgVFJfUkNGX0xFTl9NQVNLIAkweDFmMDAKKyNkZWZpbmUgVFJfUkNGX0JST0FEQ0FTVCAJMHg4MDAwCS8qIGFsbC1yb3V0ZXMgYnJvYWRjYXN0ICovCisjZGVmaW5lIFRSX1JDRl9MSU1JVEVEX0JST0FEQ0FTVCAweEMwMDAJLyogc2luZ2xlLXJvdXRlIGJyb2FkY2FzdCAqLworI2RlZmluZSBUUl9SQ0ZfRlJBTUUySyAJCTB4MjAKKyNkZWZpbmUgVFJfUkNGX0JST0FEQ0FTVF9NQVNLIAkweEMwMDAKKyNkZWZpbmUgVFJfTUFYUklGTEVOIAkJMTgKKworI2VuZGlmCS8qIF9MSU5VWF9JRl9UUl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3R1bi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl90dW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDU0YzFhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl90dW4uaApAQCAtMCwwICsxLDk0IEBACisvKgorICogIFVuaXZlcnNhbCBUVU4vVEFQIGRldmljZSBkcml2ZXIuCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDAgTWF4aW0gS3Jhc255YW5za3kgPG1heF9ta0B5YWhvby5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fSUZfVFVOX0gKKyNkZWZpbmUgX19JRl9UVU5fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgorCisvKiBSZWFkIHF1ZXVlIHNpemUgKi8KKyNkZWZpbmUgVFVOX1JFQURRX1NJWkUJNTAwCisKKy8qIFRVTiBkZXZpY2UgZmxhZ3MgKi8KKyNkZWZpbmUgVFVOX1RVTl9ERVYgCTB4MDAwMQkKKyNkZWZpbmUgVFVOX1RBUF9ERVYJMHgwMDAyCisjZGVmaW5lIFRVTl9UWVBFX01BU0sgICAweDAwMGYKKworI2RlZmluZSBUVU5fRkFTWU5DCTB4MDAxMAorI2RlZmluZSBUVU5fTk9DSEVDS1NVTQkweDAwMjAKKyNkZWZpbmUgVFVOX05PX1BJCTB4MDA0MAorI2RlZmluZSBUVU5fT05FX1FVRVVFCTB4MDA4MAorI2RlZmluZSBUVU5fUEVSU0lTVCAJMHgwMTAwCQorI2RlZmluZSBUVU5fVk5FVF9IRFIgCTB4MDIwMAorCisvKiBJb2N0bCBkZWZpbmVzICovCisjZGVmaW5lIFRVTlNFVE5PQ1NVTSAgX0lPVygnVCcsIDIwMCwgaW50KSAKKyNkZWZpbmUgVFVOU0VUREVCVUcgICBfSU9XKCdUJywgMjAxLCBpbnQpIAorI2RlZmluZSBUVU5TRVRJRkYgICAgIF9JT1coJ1QnLCAyMDIsIGludCkgCisjZGVmaW5lIFRVTlNFVFBFUlNJU1QgX0lPVygnVCcsIDIwMywgaW50KSAKKyNkZWZpbmUgVFVOU0VUT1dORVIgICBfSU9XKCdUJywgMjA0LCBpbnQpCisjZGVmaW5lIFRVTlNFVExJTksgICAgX0lPVygnVCcsIDIwNSwgaW50KQorI2RlZmluZSBUVU5TRVRHUk9VUCAgIF9JT1coJ1QnLCAyMDYsIGludCkKKyNkZWZpbmUgVFVOR0VURkVBVFVSRVMgX0lPUignVCcsIDIwNywgdW5zaWduZWQgaW50KQorI2RlZmluZSBUVU5TRVRPRkZMT0FEICBfSU9XKCdUJywgMjA4LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIFRVTlNFVFRYRklMVEVSIF9JT1coJ1QnLCAyMDksIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgVFVOR0VUSUZGICAgICAgX0lPUignVCcsIDIxMCwgdW5zaWduZWQgaW50KQorI2RlZmluZSBUVU5HRVRTTkRCVUYgICBfSU9SKCdUJywgMjExLCBpbnQpCisjZGVmaW5lIFRVTlNFVFNOREJVRiAgIF9JT1coJ1QnLCAyMTIsIGludCkKKyNkZWZpbmUgVFVOQVRUQUNIRklMVEVSIF9JT1coJ1QnLCAyMTMsIHN0cnVjdCBzb2NrX2Zwcm9nKQorI2RlZmluZSBUVU5ERVRBQ0hGSUxURVIgX0lPVygnVCcsIDIxNCwgc3RydWN0IHNvY2tfZnByb2cpCisjZGVmaW5lIFRVTkdFVFZORVRIRFJTWiBfSU9SKCdUJywgMjE1LCBpbnQpCisjZGVmaW5lIFRVTlNFVFZORVRIRFJTWiBfSU9XKCdUJywgMjE2LCBpbnQpCisKKy8qIFRVTlNFVElGRiBpZnIgZmxhZ3MgKi8KKyNkZWZpbmUgSUZGX1RVTgkJMHgwMDAxCisjZGVmaW5lIElGRl9UQVAJCTB4MDAwMgorI2RlZmluZSBJRkZfTk9fUEkJMHgxMDAwCisjZGVmaW5lIElGRl9PTkVfUVVFVUUJMHgyMDAwCisjZGVmaW5lIElGRl9WTkVUX0hEUgkweDQwMDAKKyNkZWZpbmUgSUZGX1RVTl9FWENMCTB4ODAwMAorCisvKiBGZWF0dXJlcyBmb3IgR1NPIChUVU5TRVRPRkZMT0FEKS4gKi8KKyNkZWZpbmUgVFVOX0ZfQ1NVTQkweDAxCS8qIFlvdSBjYW4gaGFuZCBtZSB1bmNoZWNrc3VtbWVkIHBhY2tldHMuICovCisjZGVmaW5lIFRVTl9GX1RTTzQJMHgwMgkvKiBJIGNhbiBoYW5kbGUgVFNPIGZvciBJUHY0IHBhY2tldHMgKi8KKyNkZWZpbmUgVFVOX0ZfVFNPNgkweDA0CS8qIEkgY2FuIGhhbmRsZSBUU08gZm9yIElQdjYgcGFja2V0cyAqLworI2RlZmluZSBUVU5fRl9UU09fRUNOCTB4MDgJLyogSSBjYW4gaGFuZGxlIFRTTyB3aXRoIEVDTiBiaXRzLiAqLworI2RlZmluZSBUVU5fRl9VRk8JMHgxMAkvKiBJIGNhbiBoYW5kbGUgVUZPIHBhY2tldHMgKi8KKworLyogUHJvdG9jb2wgaW5mbyBwcmVwZW5kZWQgdG8gdGhlIHBhY2tldHMgKHdoZW4gSUZGX05PX1BJIGlzIG5vdCBzZXQpICovCisjZGVmaW5lIFRVTl9QS1RfU1RSSVAJMHgwMDAxCitzdHJ1Y3QgdHVuX3BpIHsKKwlfX3UxNiAgZmxhZ3M7CisJX19iZTE2IHByb3RvOworfTsKKworLyoKKyAqIEZpbHRlciBzcGVjICh1c2VkIGZvciBTRVRYWEZJTFRFUiBpb2N0bHMpCisgKiBUaGlzIHN0dWZmIGlzIGFwcGxpY2FibGUgb25seSB0byB0aGUgVEFQIChFdGhlcm5ldCkgZGV2aWNlcy4KKyAqIElmIHRoZSBjb3VudCBpcyB6ZXJvIHRoZSBmaWx0ZXIgaXMgZGlzYWJsZWQgYW5kIHRoZSBkcml2ZXIgYWNjZXB0cworICogYWxsIHBhY2tldHMgKHByb21pc2MgbW9kZSkuCisgKiBJZiB0aGUgZmlsdGVyIGlzIGVuYWJsZWQgaW4gb3JkZXIgdG8gYWNjZXB0IGJyb2FkY2FzdCBwYWNrZXRzCisgKiBicm9hZGNhc3QgYWRkciBtdXN0IGJlIGV4cGxpY2l0bHkgaW5jbHVkZWQgaW4gdGhlIGFkZHIgbGlzdC4KKyAqLworI2RlZmluZSBUVU5fRkxUX0FMTE1VTFRJIDB4MDAwMSAvKiBBY2NlcHQgYWxsIG11bHRpY2FzdCBwYWNrZXRzICovCitzdHJ1Y3QgdHVuX2ZpbHRlciB7CisJX191MTYgIGZsYWdzOyAvKiBUVU5fRkxUXyBmbGFncyBzZWUgYWJvdmUgKi8KKwlfX3UxNiAgY291bnQ7IC8qIE51bWJlciBvZiBhZGRyZXNzZXMgKi8KKwlfX3U4ICAgYWRkclswXVtFVEhfQUxFTl07Cit9OworCisjZW5kaWYgLyogX19JRl9UVU5fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl90dW5uZWwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfdHVubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4MTliOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfdHVubmVsLmgKQEAgLTAsMCArMSw3OSBAQAorI2lmbmRlZiBfSUZfVFVOTkVMX0hfCisjZGVmaW5lIF9JRl9UVU5ORUxfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisKKyNkZWZpbmUgU0lPQ0dFVFRVTk5FTCAgIChTSU9DREVWUFJJVkFURSArIDApCisjZGVmaW5lIFNJT0NBRERUVU5ORUwgICAoU0lPQ0RFVlBSSVZBVEUgKyAxKQorI2RlZmluZSBTSU9DREVMVFVOTkVMICAgKFNJT0NERVZQUklWQVRFICsgMikKKyNkZWZpbmUgU0lPQ0NIR1RVTk5FTCAgIChTSU9DREVWUFJJVkFURSArIDMpCisjZGVmaW5lIFNJT0NHRVRQUkwgICAgICAoU0lPQ0RFVlBSSVZBVEUgKyA0KQorI2RlZmluZSBTSU9DQUREUFJMICAgICAgKFNJT0NERVZQUklWQVRFICsgNSkKKyNkZWZpbmUgU0lPQ0RFTFBSTCAgICAgIChTSU9DREVWUFJJVkFURSArIDYpCisjZGVmaW5lIFNJT0NDSEdQUkwgICAgICAoU0lPQ0RFVlBSSVZBVEUgKyA3KQorI2RlZmluZSBTSU9DR0VUNlJEICAgICAgKFNJT0NERVZQUklWQVRFICsgOCkKKyNkZWZpbmUgU0lPQ0FERDZSRCAgICAgIChTSU9DREVWUFJJVkFURSArIDkpCisjZGVmaW5lIFNJT0NERUw2UkQgICAgICAoU0lPQ0RFVlBSSVZBVEUgKyAxMCkKKyNkZWZpbmUgU0lPQ0NIRzZSRCAgICAgIChTSU9DREVWUFJJVkFURSArIDExKQorCisjZGVmaW5lIEdSRV9DU1VNCV9fY3B1X3RvX2JlMTYoMHg4MDAwKQorI2RlZmluZSBHUkVfUk9VVElORwlfX2NwdV90b19iZTE2KDB4NDAwMCkKKyNkZWZpbmUgR1JFX0tFWQkJX19jcHVfdG9fYmUxNigweDIwMDApCisjZGVmaW5lIEdSRV9TRVEJCV9fY3B1X3RvX2JlMTYoMHgxMDAwKQorI2RlZmluZSBHUkVfU1RSSUNUCV9fY3B1X3RvX2JlMTYoMHgwODAwKQorI2RlZmluZSBHUkVfUkVDCQlfX2NwdV90b19iZTE2KDB4MDcwMCkKKyNkZWZpbmUgR1JFX0ZMQUdTCV9fY3B1X3RvX2JlMTYoMHgwMEY4KQorI2RlZmluZSBHUkVfVkVSU0lPTglfX2NwdV90b19iZTE2KDB4MDAwNykKKworc3RydWN0IGlwX3R1bm5lbF9wYXJtIHsKKwljaGFyCQkJbmFtZVtJRk5BTVNJWl07CisJaW50CQkJbGluazsKKwlfX2JlMTYJCQlpX2ZsYWdzOworCV9fYmUxNgkJCW9fZmxhZ3M7CisJX19iZTMyCQkJaV9rZXk7CisJX19iZTMyCQkJb19rZXk7CisJc3RydWN0IGlwaGRyCQlpcGg7Cit9OworCisvKiBTSVQtbW9kZSBpX2ZsYWdzICovCisjZGVmaW5lCVNJVF9JU0FUQVAJMHgwMDAxCisKK3N0cnVjdCBpcF90dW5uZWxfcHJsIHsKKwlfX2JlMzIJCQlhZGRyOworCV9fdTE2CQkJZmxhZ3M7CisJX191MTYJCQlfX3Jlc2VydmVkOworCV9fdTMyCQkJZGF0YWxlbjsKKwlfX3UzMgkJCV9fcmVzZXJ2ZWQyOworCS8qIGRhdGEgZm9sbG93cyAqLworfTsKKworLyogUFJMIGZsYWdzICovCisjZGVmaW5lCVBSTF9ERUZBVUxUCQkweDAwMDEKKworc3RydWN0IGlwX3R1bm5lbF82cmQgeworCXN0cnVjdCBpbjZfYWRkcgkJcHJlZml4OworCV9fYmUzMgkJCXJlbGF5X3ByZWZpeDsKKwlfX3UxNgkJCXByZWZpeGxlbjsKKwlfX3UxNgkJCXJlbGF5X3ByZWZpeGxlbjsKK307CisKK2VudW0geworCUlGTEFfR1JFX1VOU1BFQywKKwlJRkxBX0dSRV9MSU5LLAorCUlGTEFfR1JFX0lGTEFHUywKKwlJRkxBX0dSRV9PRkxBR1MsCisJSUZMQV9HUkVfSUtFWSwKKwlJRkxBX0dSRV9PS0VZLAorCUlGTEFfR1JFX0xPQ0FMLAorCUlGTEFfR1JFX1JFTU9URSwKKwlJRkxBX0dSRV9UVEwsCisJSUZMQV9HUkVfVE9TLAorCUlGTEFfR1JFX1BNVFVESVNDLAorCV9fSUZMQV9HUkVfTUFYLAorfTsKKworI2RlZmluZSBJRkxBX0dSRV9NQVgJKF9fSUZMQV9HUkVfTUFYIC0gMSkKKworI2VuZGlmIC8qIF9JRl9UVU5ORUxfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI5YjM1NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBWTEFOCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiA4MDIuMVEgVkxBTiB0YWdnaW5nLgorICoKKyAqIEF1dGhvcnM6CUJlbiBHcmVlYXIgPGdyZWVhcmJAY2FuZGVsYXRlY2guY29tPgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9JRl9WTEFOX0hfCisjZGVmaW5lIF9MSU5VWF9JRl9WTEFOX0hfCisKKworLyogVkxBTiBJT0NUTHMgYXJlIGZvdW5kIGluIHNvY2tpb3MuaCAqLworCisvKiBQYXNzZWQgaW4gdmxhbl9pb2N0bF9hcmdzIHN0cnVjdHVyZSB0byBkZXRlcm1pbmUgYmVoYXZpb3VyLiAqLworZW51bSB2bGFuX2lvY3RsX2NtZHMgeworCUFERF9WTEFOX0NNRCwKKwlERUxfVkxBTl9DTUQsCisJU0VUX1ZMQU5fSU5HUkVTU19QUklPUklUWV9DTUQsCisJU0VUX1ZMQU5fRUdSRVNTX1BSSU9SSVRZX0NNRCwKKwlHRVRfVkxBTl9JTkdSRVNTX1BSSU9SSVRZX0NNRCwKKwlHRVRfVkxBTl9FR1JFU1NfUFJJT1JJVFlfQ01ELAorCVNFVF9WTEFOX05BTUVfVFlQRV9DTUQsCisJU0VUX1ZMQU5fRkxBR19DTUQsCisJR0VUX1ZMQU5fUkVBTERFVl9OQU1FX0NNRCwgLyogSWYgdGhpcyB3b3JrcywgeW91IGtub3cgaXQncyBhIFZMQU4gZGV2aWNlLCBidHcgKi8KKwlHRVRfVkxBTl9WSURfQ01EIC8qIEdldCB0aGUgVklEIG9mIHRoaXMgVkxBTiAoc3BlY2lmaWVkIGJ5IG5hbWUpICovCit9OworCitlbnVtIHZsYW5fZmxhZ3MgeworCVZMQU5fRkxBR19SRU9SREVSX0hEUgk9IDB4MSwKKwlWTEFOX0ZMQUdfR1ZSUAkJPSAweDIsCisJVkxBTl9GTEFHX0xPT1NFX0JJTkRJTkcJPSAweDQsCit9OworCitlbnVtIHZsYW5fbmFtZV90eXBlcyB7CisJVkxBTl9OQU1FX1RZUEVfUExVU19WSUQsIC8qIE5hbWUgd2lsbCBsb29rIGxpa2U6ICB2bGFuMDAwNSAqLworCVZMQU5fTkFNRV9UWVBFX1JBV19QTFVTX1ZJRCwgLyogbmFtZSB3aWxsIGxvb2sgbGlrZTogIGV0aDEuMDAwNSAqLworCVZMQU5fTkFNRV9UWVBFX1BMVVNfVklEX05PX1BBRCwgLyogTmFtZSB3aWxsIGxvb2sgbGlrZTogIHZsYW41ICovCisJVkxBTl9OQU1FX1RZUEVfUkFXX1BMVVNfVklEX05PX1BBRCwgLyogTmFtZSB3aWxsIGxvb2sgbGlrZTogIGV0aDAuNSAqLworCVZMQU5fTkFNRV9UWVBFX0hJR0hFU1QKK307CisKK3N0cnVjdCB2bGFuX2lvY3RsX2FyZ3MgeworCWludCBjbWQ7IC8qIFNob3VsZCBiZSBvbmUgb2YgdGhlIHZsYW5faW9jdGxfY21kcyBlbnVtIGFib3ZlLiAqLworCWNoYXIgZGV2aWNlMVsyNF07CisKKyAgICAgICAgdW5pb24geworCQljaGFyIGRldmljZTJbMjRdOworCQlpbnQgVklEOworCQl1bnNpZ25lZCBpbnQgc2tiX3ByaW9yaXR5OworCQl1bnNpZ25lZCBpbnQgbmFtZV90eXBlOworCQl1bnNpZ25lZCBpbnQgYmluZF90eXBlOworCQl1bnNpZ25lZCBpbnQgZmxhZzsgLyogTWF0Y2hlcyB2bGFuX2Rldl9pbmZvIGZsYWdzICovCisgICAgICAgIH0gdTsKKworCXNob3J0IHZsYW5fcW9zOyAgIAorfTsKKworI2VuZGlmIC8qICEoX0xJTlVYX0lGX1ZMQU5fSF8pICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3gyNS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl94MjUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTc3NjVmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl94MjUuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogIExpbnV4IFguMjUgcGFja2V0IHRvIGRldmljZSBpbnRlcmZhY2UKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0lGX1gyNV9ICisjZGVmaW5lIF9JRl9YMjVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3gyNS1pZmFjZS50eHQgKi8KKyNkZWZpbmUgWDI1X0lGQUNFX0RBVEEJCTB4MDAKKyNkZWZpbmUgWDI1X0lGQUNFX0NPTk5FQ1QJMHgwMQorI2RlZmluZSBYMjVfSUZBQ0VfRElTQ09OTkVDVAkweDAyCisjZGVmaW5lIFgyNV9JRkFDRV9QQVJBTVMJMHgwMworCisjZW5kaWYgLyogX0lGX1gyNV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lnbXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWdtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MmJhODYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lnbXAuaApAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqCUxpbnV4IE5FVDM6CUludGVybmV0IEdyb3VwIE1hbmFnZW1lbnQgUHJvdG9jb2wgIFtJR01QXQorICoKKyAqCUF1dGhvcnM6CisgKgkJQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KKyAqCisgKglFeHRlbmRlZCB0byB0YWxrIHRoZSBCU0QgZXh0ZW5kZWQgSUdNUCBwcm90b2NvbCBvZiBtcm91dGVkIDMuNgorICoKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0lHTVBfSAorI2RlZmluZSBfTElOVVhfSUdNUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworLyoKKyAqCUlHTVAgcHJvdG9jb2wgc3RydWN0dXJlcworICovCisKKy8qCisgKglIZWFkZXIgaW4gb24gY2FibGUgZm9ybWF0CisgKi8KKworc3RydWN0IGlnbXBoZHIgeworCV9fdTggdHlwZTsKKwlfX3U4IGNvZGU7CQkvKiBGb3IgbmV3ZXIgSUdNUCAqLworCV9fc3VtMTYgY3N1bTsKKwlfX2JlMzIgZ3JvdXA7Cit9OworCisvKiBWMyBncm91cCByZWNvcmQgdHlwZXMgW2dyZWNfdHlwZV0gKi8KKyNkZWZpbmUgSUdNUFYzX01PREVfSVNfSU5DTFVERQkJMQorI2RlZmluZSBJR01QVjNfTU9ERV9JU19FWENMVURFCQkyCisjZGVmaW5lIElHTVBWM19DSEFOR0VfVE9fSU5DTFVERQkzCisjZGVmaW5lIElHTVBWM19DSEFOR0VfVE9fRVhDTFVERQk0CisjZGVmaW5lIElHTVBWM19BTExPV19ORVdfU09VUkNFUwk1CisjZGVmaW5lIElHTVBWM19CTE9DS19PTERfU09VUkNFUwk2CisKK3N0cnVjdCBpZ21wdjNfZ3JlYyB7CisJX191OAlncmVjX3R5cGU7CisJX191OAlncmVjX2F1eHdvcmRzOworCV9fYmUxNglncmVjX25zcmNzOworCV9fYmUzMglncmVjX21jYTsKKwlfX2JlMzIJZ3JlY19zcmNbMF07Cit9OworCitzdHJ1Y3QgaWdtcHYzX3JlcG9ydCB7CisJX191OCB0eXBlOworCV9fdTggcmVzdjE7CisJX19iZTE2IGNzdW07CisJX19iZTE2IHJlc3YyOworCV9fYmUxNiBuZ3JlYzsKKwlzdHJ1Y3QgaWdtcHYzX2dyZWMgZ3JlY1swXTsKK307CisKK3N0cnVjdCBpZ21wdjNfcXVlcnkgeworCV9fdTggdHlwZTsKKwlfX3U4IGNvZGU7CisJX19iZTE2IGNzdW07CisJX19iZTMyIGdyb3VwOworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggcXJ2OjMsCisJICAgICBzdXBwcmVzczoxLAorCSAgICAgcmVzdjo0OworI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OCByZXN2OjQsCisJICAgICBzdXBwcmVzczoxLAorCSAgICAgcXJ2OjM7CisjZWxzZQorI2Vycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisJX191OCBxcWljOworCV9fYmUxNiBuc3JjczsKKwlfX2JlMzIgc3Jjc1swXTsKK307CisKKyNkZWZpbmUgSUdNUF9IT1NUX01FTUJFUlNISVBfUVVFUlkJMHgxMQkvKiBGcm9tIFJGQzExMTIgKi8KKyNkZWZpbmUgSUdNUF9IT1NUX01FTUJFUlNISVBfUkVQT1JUCTB4MTIJLyogRGl0dG8gKi8KKyNkZWZpbmUgSUdNUF9EVk1SUAkJCTB4MTMJLyogRFZNUlAgcm91dGluZyAqLworI2RlZmluZSBJR01QX1BJTQkJCTB4MTQJLyogUElNIHJvdXRpbmcgKi8KKyNkZWZpbmUgSUdNUF9UUkFDRQkJCTB4MTUKKyNkZWZpbmUgSUdNUFYyX0hPU1RfTUVNQkVSU0hJUF9SRVBPUlQJMHgxNgkvKiBWMiB2ZXJzaW9uIG9mIDB4MTIgKi8KKyNkZWZpbmUgSUdNUF9IT1NUX0xFQVZFX01FU1NBR0UgCTB4MTcKKyNkZWZpbmUgSUdNUFYzX0hPU1RfTUVNQkVSU0hJUF9SRVBPUlQJMHgyMgkvKiBWMyB2ZXJzaW9uIG9mIDB4MTIgKi8KKworI2RlZmluZSBJR01QX01UUkFDRV9SRVNQCQkweDFlCisjZGVmaW5lIElHTVBfTVRSQUNFCQkJMHgxZgorCisKKy8qCisgKglVc2UgdGhlIEJTRCBuYW1lcyBmb3IgdGhlc2UgZm9yIGNvbXBhdGliaWxpdHkKKyAqLworCisjZGVmaW5lIElHTVBfREVMQVlJTkdfTUVNQkVSCQkweDAxCisjZGVmaW5lIElHTVBfSURMRV9NRU1CRVIJCTB4MDIKKyNkZWZpbmUgSUdNUF9MQVpZX01FTUJFUgkJMHgwMworI2RlZmluZSBJR01QX1NMRUVQSU5HX01FTUJFUgkJMHgwNAorI2RlZmluZSBJR01QX0FXQUtFTklOR19NRU1CRVIJCTB4MDUKKworI2RlZmluZSBJR01QX01JTkxFTgkJCTgKKworI2RlZmluZSBJR01QX01BWF9IT1NUX1JFUE9SVF9ERUxBWQkxMAkvKiBtYXggZGVsYXkgZm9yIHJlc3BvbnNlIHRvICovCisJCQkJCQkvKiBxdWVyeSAoaW4gc2Vjb25kcykJKi8KKworI2RlZmluZSBJR01QX1RJTUVSX1NDQUxFCQkxMAkvKiBkZW5vdGVzIHRoYXQgdGhlIGlnbXBoZHItPnRpbWVyIGZpZWxkICovCisJCQkJCQkvKiBzcGVjaWZpZXMgdGltZSBpbiAxMHRoIG9mIHNlY29uZHMJICovCisKKyNkZWZpbmUgSUdNUF9BR0VfVEhSRVNIT0xECQk0MDAJLyogSWYgdGhpcyBob3N0IGRvbid0IGhlYXIgYW55IElHTVAgVjEJKi8KKwkJCQkJCS8qIG1lc3NhZ2UgaW4gdGhpcyBwZXJpb2Qgb2YgdGltZSwJKi8KKwkJCQkJCS8qIHJldmVydCB0byBJR01QIHYyIHJvdXRlci4JCSovCisKKyNkZWZpbmUgSUdNUF9BTExfSE9TVFMJCWh0b25sKDB4RTAwMDAwMDFMKQorI2RlZmluZSBJR01QX0FMTF9ST1VURVIgCWh0b25sKDB4RTAwMDAwMDJMKQorI2RlZmluZSBJR01QVjNfQUxMX01DUgkgCWh0b25sKDB4RTAwMDAwMTZMKQorI2RlZmluZSBJR01QX0xPQ0FMX0dST1VQCWh0b25sKDB4RTAwMDAwMDBMKQorI2RlZmluZSBJR01QX0xPQ0FMX0dST1VQX01BU0sJaHRvbmwoMHhGRkZGRkYwMEwpCisKKy8qCisgKiBzdHJ1Y3QgZm9yIGtlZXBpbmcgdGhlIG11bHRpY2FzdCBsaXN0IGluCisgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2luLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhZWZkMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaW4uaApAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlEZWZpbml0aW9ucyBvZiB0aGUgSW50ZXJuZXQgUHJvdG9jb2wuCisgKgorICogVmVyc2lvbjoJQCgjKWluLmgJMS4wLjEJMDQvMjEvOTMKKyAqCisgKiBBdXRob3JzOglPcmlnaW5hbCB0YWtlbiBmcm9tIHRoZSBHTlUgUHJvamVjdCA8bmV0aW5ldC9pbi5oPiBmaWxlLgorICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9MSU5VWF9JTl9ICisjZGVmaW5lIF9MSU5VWF9JTl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorCisvKiBTdGFuZGFyZCB3ZWxsLWRlZmluZWQgSVAgcHJvdG9jb2xzLiAgKi8KK2VudW0geworICBJUFBST1RPX0lQID0gMCwJCS8qIER1bW15IHByb3RvY29sIGZvciBUQ1AJCSovCisgIElQUFJPVE9fSUNNUCA9IDEsCQkvKiBJbnRlcm5ldCBDb250cm9sIE1lc3NhZ2UgUHJvdG9jb2wJKi8KKyAgSVBQUk9UT19JR01QID0gMiwJCS8qIEludGVybmV0IEdyb3VwIE1hbmFnZW1lbnQgUHJvdG9jb2wJKi8KKyAgSVBQUk9UT19JUElQID0gNCwJCS8qIElQSVAgdHVubmVscyAob2xkZXIgS0E5USB0dW5uZWxzIHVzZSA5NCkgKi8KKyAgSVBQUk9UT19UQ1AgPSA2LAkJLyogVHJhbnNtaXNzaW9uIENvbnRyb2wgUHJvdG9jb2wJKi8KKyAgSVBQUk9UT19FR1AgPSA4LAkJLyogRXh0ZXJpb3IgR2F0ZXdheSBQcm90b2NvbAkJKi8KKyAgSVBQUk9UT19QVVAgPSAxMiwJCS8qIFBVUCBwcm90b2NvbAkJCQkqLworICBJUFBST1RPX1VEUCA9IDE3LAkJLyogVXNlciBEYXRhZ3JhbSBQcm90b2NvbAkJKi8KKyAgSVBQUk9UT19JRFAgPSAyMiwJCS8qIFhOUyBJRFAgcHJvdG9jb2wJCQkqLworICBJUFBST1RPX0RDQ1AgPSAzMywJCS8qIERhdGFncmFtIENvbmdlc3Rpb24gQ29udHJvbCBQcm90b2NvbCAqLworICBJUFBST1RPX1JTVlAgPSA0NiwJCS8qIFJTVlAgcHJvdG9jb2wJCQkqLworICBJUFBST1RPX0dSRSA9IDQ3LAkJLyogQ2lzY28gR1JFIHR1bm5lbHMgKHJmYyAxNzAxLDE3MDIpCSovCisKKyAgSVBQUk9UT19JUFY2CSA9IDQxLAkJLyogSVB2Ni1pbi1JUHY0IHR1bm5lbGxpbmcJCSovCisKKyAgSVBQUk9UT19FU1AgPSA1MCwgICAgICAgICAgICAvKiBFbmNhcHN1bGF0aW9uIFNlY3VyaXR5IFBheWxvYWQgcHJvdG9jb2wgKi8KKyAgSVBQUk9UT19BSCA9IDUxLCAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBIZWFkZXIgcHJvdG9jb2wgICAgICAgKi8KKyAgSVBQUk9UT19CRUVUUEggPSA5NCwJICAgICAgIC8qIElQIG9wdGlvbiBwc2V1ZG8gaGVhZGVyIGZvciBCRUVUICovCisgIElQUFJPVE9fUElNICAgID0gMTAzLAkJLyogUHJvdG9jb2wgSW5kZXBlbmRlbnQgTXVsdGljYXN0CSovCisKKyAgSVBQUk9UT19DT01QICAgPSAxMDgsICAgICAgICAgICAgICAgIC8qIENvbXByZXNzaW9uIEhlYWRlciBwcm90b2NvbCAqLworICBJUFBST1RPX1NDVFAgICA9IDEzMiwJCS8qIFN0cmVhbSBDb250cm9sIFRyYW5zcG9ydCBQcm90b2NvbAkqLworICBJUFBST1RPX1VEUExJVEUgPSAxMzYsCS8qIFVEUC1MaXRlIChSRkMgMzgyOCkJCQkqLworCisgIElQUFJPVE9fUkFXCSA9IDI1NSwJCS8qIFJhdyBJUCBwYWNrZXRzCQkJKi8KKyAgSVBQUk9UT19NQVgKK307CisKKworLyogSW50ZXJuZXQgYWRkcmVzcy4gKi8KK3N0cnVjdCBpbl9hZGRyIHsKKwlfX2JlMzIJc19hZGRyOworfTsKKworI2RlZmluZSBJUF9UT1MJCTEKKyNkZWZpbmUgSVBfVFRMCQkyCisjZGVmaW5lIElQX0hEUklOQ0wJMworI2RlZmluZSBJUF9PUFRJT05TCTQKKyNkZWZpbmUgSVBfUk9VVEVSX0FMRVJUCTUKKyNkZWZpbmUgSVBfUkVDVk9QVFMJNgorI2RlZmluZSBJUF9SRVRPUFRTCTcKKyNkZWZpbmUgSVBfUEtUSU5GTwk4CisjZGVmaW5lIElQX1BLVE9QVElPTlMJOQorI2RlZmluZSBJUF9NVFVfRElTQ09WRVIJMTAKKyNkZWZpbmUgSVBfUkVDVkVSUgkxMQorI2RlZmluZSBJUF9SRUNWVFRMCTEyCisjZGVmaW5lCUlQX1JFQ1ZUT1MJMTMKKyNkZWZpbmUgSVBfTVRVCQkxNAorI2RlZmluZSBJUF9GUkVFQklORAkxNQorI2RlZmluZSBJUF9JUFNFQ19QT0xJQ1kJMTYKKyNkZWZpbmUgSVBfWEZSTV9QT0xJQ1kJMTcKKyNkZWZpbmUgSVBfUEFTU1NFQwkxOAorI2RlZmluZSBJUF9UUkFOU1BBUkVOVAkxOQorCisvKiBCU0QgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBJUF9SRUNWUkVUT1BUUwlJUF9SRVRPUFRTCisKKy8qIFRQcm94eSBvcmlnaW5hbCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgSVBfT1JJR0RTVEFERFIgICAgICAgMjAKKyNkZWZpbmUgSVBfUkVDVk9SSUdEU1RBRERSICAgSVBfT1JJR0RTVEFERFIKKworI2RlZmluZSBJUF9NSU5UVEwgICAgICAgMjEKKyNkZWZpbmUgSVBfTk9ERUZSQUcgICAgIDIyCisKKy8qIElQX01UVV9ESVNDT1ZFUiB2YWx1ZXMgKi8KKyNkZWZpbmUgSVBfUE1UVURJU0NfRE9OVAkJMAkvKiBOZXZlciBzZW5kIERGIGZyYW1lcyAqLworI2RlZmluZSBJUF9QTVRVRElTQ19XQU5UCQkxCS8qIFVzZSBwZXIgcm91dGUgaGludHMJKi8KKyNkZWZpbmUgSVBfUE1UVURJU0NfRE8JCQkyCS8qIEFsd2F5cyBERgkJKi8KKyNkZWZpbmUgSVBfUE1UVURJU0NfUFJPQkUJCTMgICAgICAgLyogSWdub3JlIGRzdCBwbXR1ICAgICAgKi8KKworI2RlZmluZSBJUF9NVUxUSUNBU1RfSUYJCQkzMgorI2RlZmluZSBJUF9NVUxUSUNBU1RfVFRMIAkJMzMKKyNkZWZpbmUgSVBfTVVMVElDQVNUX0xPT1AgCQkzNAorI2RlZmluZSBJUF9BRERfTUVNQkVSU0hJUAkJMzUKKyNkZWZpbmUgSVBfRFJPUF9NRU1CRVJTSElQCQkzNgorI2RlZmluZSBJUF9VTkJMT0NLX1NPVVJDRQkJMzcKKyNkZWZpbmUgSVBfQkxPQ0tfU09VUkNFCQkJMzgKKyNkZWZpbmUgSVBfQUREX1NPVVJDRV9NRU1CRVJTSElQCTM5CisjZGVmaW5lIElQX0RST1BfU09VUkNFX01FTUJFUlNISVAJNDAKKyNkZWZpbmUgSVBfTVNGSUxURVIJCQk0MQorI2RlZmluZSBNQ0FTVF9KT0lOX0dST1VQCQk0MgorI2RlZmluZSBNQ0FTVF9CTE9DS19TT1VSQ0UJCTQzCisjZGVmaW5lIE1DQVNUX1VOQkxPQ0tfU09VUkNFCQk0NAorI2RlZmluZSBNQ0FTVF9MRUFWRV9HUk9VUAkJNDUKKyNkZWZpbmUgTUNBU1RfSk9JTl9TT1VSQ0VfR1JPVVAJCTQ2CisjZGVmaW5lIE1DQVNUX0xFQVZFX1NPVVJDRV9HUk9VUAk0NworI2RlZmluZSBNQ0FTVF9NU0ZJTFRFUgkJCTQ4CisjZGVmaW5lIElQX01VTFRJQ0FTVF9BTEwJCTQ5CisKKyNkZWZpbmUgTUNBU1RfRVhDTFVERQkwCisjZGVmaW5lIE1DQVNUX0lOQ0xVREUJMQorCisvKiBUaGVzZSBuZWVkIHRvIGFwcGVhciBzb21ld2hlcmUgYXJvdW5kIGhlcmUgKi8KKyNkZWZpbmUgSVBfREVGQVVMVF9NVUxUSUNBU1RfVFRMICAgICAgICAxCisjZGVmaW5lIElQX0RFRkFVTFRfTVVMVElDQVNUX0xPT1AgICAgICAgMQorCisvKiBSZXF1ZXN0IHN0cnVjdCBmb3IgbXVsdGljYXN0IHNvY2tldCBvcHMgKi8KKworc3RydWN0IGlwX21yZXEgIHsKKwlzdHJ1Y3QgaW5fYWRkciBpbXJfbXVsdGlhZGRyOwkvKiBJUCBtdWx0aWNhc3QgYWRkcmVzcyBvZiBncm91cCAqLworCXN0cnVjdCBpbl9hZGRyIGltcl9pbnRlcmZhY2U7CS8qIGxvY2FsIElQIGFkZHJlc3Mgb2YgaW50ZXJmYWNlICovCit9OworCitzdHJ1Y3QgaXBfbXJlcW4geworCXN0cnVjdCBpbl9hZGRyCWltcl9tdWx0aWFkZHI7CQkvKiBJUCBtdWx0aWNhc3QgYWRkcmVzcyBvZiBncm91cCAqLworCXN0cnVjdCBpbl9hZGRyCWltcl9hZGRyZXNzOwkJLyogbG9jYWwgSVAgYWRkcmVzcyBvZiBpbnRlcmZhY2UgKi8KKwlpbnQJCWltcl9pZmluZGV4OwkJLyogSW50ZXJmYWNlIGluZGV4ICovCit9OworCitzdHJ1Y3QgaXBfbXJlcV9zb3VyY2UgeworCV9fYmUzMgkJaW1yX211bHRpYWRkcjsKKwlfX2JlMzIJCWltcl9pbnRlcmZhY2U7CisJX19iZTMyCQlpbXJfc291cmNlYWRkcjsKK307CisKK3N0cnVjdCBpcF9tc2ZpbHRlciB7CisJX19iZTMyCQlpbXNmX211bHRpYWRkcjsKKwlfX2JlMzIJCWltc2ZfaW50ZXJmYWNlOworCV9fdTMyCQlpbXNmX2Ztb2RlOworCV9fdTMyCQlpbXNmX251bXNyYzsKKwlfX2JlMzIJCWltc2Zfc2xpc3RbMV07Cit9OworCisjZGVmaW5lIElQX01TRklMVEVSX1NJWkUobnVtc3JjKSBcCisJKHNpemVvZihzdHJ1Y3QgaXBfbXNmaWx0ZXIpIC0gc2l6ZW9mKF9fdTMyKSBcCisJKyAobnVtc3JjKSAqIHNpemVvZihfX3UzMikpCisKK3N0cnVjdCBncm91cF9yZXEgeworCV9fdTMyCQkJCSBncl9pbnRlcmZhY2U7CS8qIGludGVyZmFjZSBpbmRleCAqLworCXN0cnVjdCBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlIGdyX2dyb3VwOwkvKiBncm91cCBhZGRyZXNzICovCit9OworCitzdHJ1Y3QgZ3JvdXBfc291cmNlX3JlcSB7CisJX191MzIJCQkJIGdzcl9pbnRlcmZhY2U7CS8qIGludGVyZmFjZSBpbmRleCAqLworCXN0cnVjdCBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlIGdzcl9ncm91cDsJLyogZ3JvdXAgYWRkcmVzcyAqLworCXN0cnVjdCBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlIGdzcl9zb3VyY2U7CS8qIHNvdXJjZSBhZGRyZXNzICovCit9OworCitzdHJ1Y3QgZ3JvdXBfZmlsdGVyIHsKKwlfX3UzMgkJCQkgZ2ZfaW50ZXJmYWNlOwkvKiBpbnRlcmZhY2UgaW5kZXggKi8KKwlzdHJ1Y3QgX19rZXJuZWxfc29ja2FkZHJfc3RvcmFnZSBnZl9ncm91cDsJLyogbXVsdGljYXN0IGFkZHJlc3MgKi8KKwlfX3UzMgkJCQkgZ2ZfZm1vZGU7CS8qIGZpbHRlciBtb2RlICovCisJX191MzIJCQkJIGdmX251bXNyYzsJLyogbnVtYmVyIG9mIHNvdXJjZXMgKi8KKwlzdHJ1Y3QgX19rZXJuZWxfc29ja2FkZHJfc3RvcmFnZSBnZl9zbGlzdFsxXTsJLyogaW50ZXJmYWNlIGluZGV4ICovCit9OworCisjZGVmaW5lIEdST1VQX0ZJTFRFUl9TSVpFKG51bXNyYykgXAorCShzaXplb2Yoc3RydWN0IGdyb3VwX2ZpbHRlcikgLSBzaXplb2Yoc3RydWN0IF9fa2VybmVsX3NvY2thZGRyX3N0b3JhZ2UpIFwKKwkrIChudW1zcmMpICogc2l6ZW9mKHN0cnVjdCBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlKSkKKworc3RydWN0IGluX3BrdGluZm8geworCWludAkJaXBpX2lmaW5kZXg7CisJc3RydWN0IGluX2FkZHIJaXBpX3NwZWNfZHN0OworCXN0cnVjdCBpbl9hZGRyCWlwaV9hZGRyOworfTsKKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgYW4gSW50ZXJuZXQgKElQKSBzb2NrZXQgYWRkcmVzcy4gKi8KKyNkZWZpbmUgX19TT0NLX1NJWkVfXwkxNgkJLyogc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikJKi8KK3N0cnVjdCBzb2NrYWRkcl9pbiB7CisgIF9fa2VybmVsX3NhX2ZhbWlseV90CXNpbl9mYW1pbHk7CS8qIEFkZHJlc3MgZmFtaWx5CQkqLworICBfX2JlMTYJCXNpbl9wb3J0OwkvKiBQb3J0IG51bWJlcgkJCSovCisgIHN0cnVjdCBpbl9hZGRyCXNpbl9hZGRyOwkvKiBJbnRlcm5ldCBhZGRyZXNzCQkqLworCisgIC8qIFBhZCB0byBzaXplIG9mIGBzdHJ1Y3Qgc29ja2FkZHInLiAqLworICB1bnNpZ25lZCBjaGFyCQlfX3BhZFtfX1NPQ0tfU0laRV9fIC0gc2l6ZW9mKHNob3J0IGludCkgLQorCQkJc2l6ZW9mKHVuc2lnbmVkIHNob3J0IGludCkgLSBzaXplb2Yoc3RydWN0IGluX2FkZHIpXTsKK307CisjZGVmaW5lIHNpbl96ZXJvCV9fcGFkCQkvKiBmb3IgQlNEIFVOSVggY29tcC4gLUZ2SwkqLworCisKKy8qCisgKiBEZWZpbml0aW9ucyBvZiB0aGUgYml0cyBpbiBhbiBJbnRlcm5ldCBhZGRyZXNzIGludGVnZXIuCisgKiBPbiBzdWJuZXRzLCBob3N0IGFuZCBuZXR3b3JrIHBhcnRzIGFyZSBmb3VuZCBhY2NvcmRpbmcKKyAqIHRvIHRoZSBzdWJuZXQgbWFzaywgbm90IHRoZXNlIG1hc2tzLgorICovCisjZGVmaW5lCUlOX0NMQVNTQShhKQkJKCgoKGxvbmcgaW50KSAoYSkpICYgMHg4MDAwMDAwMCkgPT0gMCkKKyNkZWZpbmUJSU5fQ0xBU1NBX05FVAkJMHhmZjAwMDAwMAorI2RlZmluZQlJTl9DTEFTU0FfTlNISUZUCTI0CisjZGVmaW5lCUlOX0NMQVNTQV9IT1NUCQkoMHhmZmZmZmZmZiAmIH5JTl9DTEFTU0FfTkVUKQorI2RlZmluZQlJTl9DTEFTU0FfTUFYCQkxMjgKKworI2RlZmluZQlJTl9DTEFTU0IoYSkJCSgoKChsb25nIGludCkgKGEpKSAmIDB4YzAwMDAwMDApID09IDB4ODAwMDAwMDApCisjZGVmaW5lCUlOX0NMQVNTQl9ORVQJCTB4ZmZmZjAwMDAKKyNkZWZpbmUJSU5fQ0xBU1NCX05TSElGVAkxNgorI2RlZmluZQlJTl9DTEFTU0JfSE9TVAkJKDB4ZmZmZmZmZmYgJiB+SU5fQ0xBU1NCX05FVCkKKyNkZWZpbmUJSU5fQ0xBU1NCX01BWAkJNjU1MzYKKworI2RlZmluZQlJTl9DTEFTU0MoYSkJCSgoKChsb25nIGludCkgKGEpKSAmIDB4ZTAwMDAwMDApID09IDB4YzAwMDAwMDApCisjZGVmaW5lCUlOX0NMQVNTQ19ORVQJCTB4ZmZmZmZmMDAKKyNkZWZpbmUJSU5fQ0xBU1NDX05TSElGVAk4CisjZGVmaW5lCUlOX0NMQVNTQ19IT1NUCQkoMHhmZmZmZmZmZiAmIH5JTl9DTEFTU0NfTkVUKQorCisjZGVmaW5lCUlOX0NMQVNTRChhKQkJKCgoKGxvbmcgaW50KSAoYSkpICYgMHhmMDAwMDAwMCkgPT0gMHhlMDAwMDAwMCkKKyNkZWZpbmUJSU5fTVVMVElDQVNUKGEpCQlJTl9DTEFTU0QoYSkKKyNkZWZpbmUgSU5fTVVMVElDQVNUX05FVAkweEYwMDAwMDAwCisKKyNkZWZpbmUJSU5fRVhQRVJJTUVOVEFMKGEpCSgoKChsb25nIGludCkgKGEpKSAmIDB4ZjAwMDAwMDApID09IDB4ZjAwMDAwMDApCisjZGVmaW5lCUlOX0JBRENMQVNTKGEpCQlJTl9FWFBFUklNRU5UQUwoKGEpKQorCisvKiBBZGRyZXNzIHRvIGFjY2VwdCBhbnkgaW5jb21pbmcgbWVzc2FnZXMuICovCisjZGVmaW5lCUlOQUREUl9BTlkJCSgodW5zaWduZWQgbG9uZyBpbnQpIDB4MDAwMDAwMDApCisKKy8qIEFkZHJlc3MgdG8gc2VuZCB0byBhbGwgaG9zdHMuICovCisjZGVmaW5lCUlOQUREUl9CUk9BRENBU1QJKCh1bnNpZ25lZCBsb25nIGludCkgMHhmZmZmZmZmZikKKworLyogQWRkcmVzcyBpbmRpY2F0aW5nIGFuIGVycm9yIHJldHVybi4gKi8KKyNkZWZpbmUJSU5BRERSX05PTkUJCSgodW5zaWduZWQgbG9uZyBpbnQpIDB4ZmZmZmZmZmYpCisKKy8qIE5ldHdvcmsgbnVtYmVyIGZvciBsb2NhbCBob3N0IGxvb3BiYWNrLiAqLworI2RlZmluZQlJTl9MT09QQkFDS05FVAkJMTI3CisKKy8qIEFkZHJlc3MgdG8gbG9vcGJhY2sgaW4gc29mdHdhcmUgdG8gbG9jYWwgaG9zdC4gICovCisjZGVmaW5lCUlOQUREUl9MT09QQkFDSwkJMHg3ZjAwMDAwMQkvKiAxMjcuMC4wLjEgICAqLworI2RlZmluZQlJTl9MT09QQkFDSyhhKQkJKCgoKGxvbmcgaW50KSAoYSkpICYgMHhmZjAwMDAwMCkgPT0gMHg3ZjAwMDAwMCkKKworLyogRGVmaW5lcyBmb3IgTXVsdGljYXN0IElOQUREUiAqLworI2RlZmluZSBJTkFERFJfVU5TUEVDX0dST1VQICAgCTB4ZTAwMDAwMDBVCS8qIDIyNC4wLjAuMCAgICovCisjZGVmaW5lIElOQUREUl9BTExIT1NUU19HUk9VUCAJMHhlMDAwMDAwMVUJLyogMjI0LjAuMC4xICAgKi8KKyNkZWZpbmUgSU5BRERSX0FMTFJUUlNfR1JPVVAgICAgMHhlMDAwMDAwMlUJLyogMjI0LjAuMC4yICovCisjZGVmaW5lIElOQUREUl9NQVhfTE9DQUxfR1JPVVAgIDB4ZTAwMDAwZmZVCS8qIDIyNC4wLjAuMjU1ICovCisKKworLyogPGFzbS9ieXRlb3JkZXIuaD4gY29udGFpbnMgdGhlIGh0b25sIHR5cGUgc3R1ZmYuLiAqLworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4gCisKKworI2VuZGlmCS8qIF9MSU5VWF9JTl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2luNi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pbjYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWIyMjJkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pbjYuaApAQCAtMCwwICsxLDI3OCBAQAorLyoKKyAqCVR5cGVzIGFuZCBkZWZpbml0aW9ucyBmb3IgQUZfSU5FVDYgCisgKglMaW51eCBJTkVUNiBpbXBsZW1lbnRhdGlvbiAKKyAqCisgKglBdXRob3JzOgorICoJUGVkcm8gUm9xdWUJCTxyb3F1ZUBkaS5mYy51bC5wdD4JCisgKgorICoJU291cmNlczoKKyAqCUlQdjYgUHJvZ3JhbSBJbnRlcmZhY2VzIGZvciBCU0QgU3lzdGVtcworICogICAgICA8ZHJhZnQtaWV0Zi1pcG5nd2ctYnNkLWFwaS0wNS50eHQ+CisgKgorICoJQWR2YW5jZWQgU29ja2V0cyBBUEkgZm9yIElQdjYKKyAqCTxkcmFmdC1zdGV2ZW5zLWFkdmFuY2VkLWFwaS0wMC50eHQ+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9JTjZfSAorI2RlZmluZSBfTElOVVhfSU42X0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKglJUHY2IGFkZHJlc3Mgc3RydWN0dXJlCisgKi8KKworc3RydWN0IGluNl9hZGRyIHsKKwl1bmlvbiB7CisJCV9fdTgJCXU2X2FkZHI4WzE2XTsKKwkJX19iZTE2CQl1Nl9hZGRyMTZbOF07CisJCV9fYmUzMgkJdTZfYWRkcjMyWzRdOworCX0gaW42X3U7CisjZGVmaW5lIHM2X2FkZHIJCQlpbjZfdS51Nl9hZGRyOAorI2RlZmluZSBzNl9hZGRyMTYJCWluNl91LnU2X2FkZHIxNgorI2RlZmluZSBzNl9hZGRyMzIJCWluNl91LnU2X2FkZHIzMgorfTsKKworLyogSVB2NiBXaWxkY2FyZCBBZGRyZXNzICg6OikgYW5kIExvb3BiYWNrIEFkZHJlc3MgKDo6MSkgZGVmaW5lZCBpbiBSRkMyNTUzCisgKiBOT1RFOiBCZSBhd2FyZSB0aGUgSU42QUREUl8qIGNvbnN0YW50cyBhbmQgaW42YWRkcl8qIGV4dGVybmFscyBhcmUgZGVmaW5lZAorICogaW4gbmV0d29yayBieXRlIG9yZGVyLCBub3QgaW4gaG9zdCBieXRlIG9yZGVyIGFzIGFyZSB0aGUgSVB2NCBlcXVpdmFsZW50cworICovCisKK3N0cnVjdCBzb2NrYWRkcl9pbjYgeworCXVuc2lnbmVkIHNob3J0IGludAlzaW42X2ZhbWlseTsgICAgLyogQUZfSU5FVDYgKi8KKwlfX2JlMTYJCQlzaW42X3BvcnQ7ICAgICAgLyogVHJhbnNwb3J0IGxheWVyIHBvcnQgIyAqLworCV9fYmUzMgkJCXNpbjZfZmxvd2luZm87ICAvKiBJUHY2IGZsb3cgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgaW42X2FkZHIJCXNpbjZfYWRkcjsgICAgICAvKiBJUHY2IGFkZHJlc3MgKi8KKwlfX3UzMgkJCXNpbjZfc2NvcGVfaWQ7ICAvKiBzY29wZSBpZCAobmV3IGluIFJGQzI1NTMpICovCit9OworCitzdHJ1Y3QgaXB2Nl9tcmVxIHsKKwkvKiBJUHY2IG11bHRpY2FzdCBhZGRyZXNzIG9mIGdyb3VwICovCisJc3RydWN0IGluNl9hZGRyIGlwdjZtcl9tdWx0aWFkZHI7CisKKwkvKiBsb2NhbCBJUHY2IGFkZHJlc3Mgb2YgaW50ZXJmYWNlICovCisJaW50CQlpcHY2bXJfaWZpbmRleDsKK307CisKKyNkZWZpbmUgaXB2Nm1yX2FjYWRkcglpcHY2bXJfbXVsdGlhZGRyCisKK3N0cnVjdCBpbjZfZmxvd2xhYmVsX3JlcSB7CisJc3RydWN0IGluNl9hZGRyCWZscl9kc3Q7CisJX19iZTMyCWZscl9sYWJlbDsKKwlfX3U4CWZscl9hY3Rpb247CisJX191OAlmbHJfc2hhcmU7CisJX191MTYJZmxyX2ZsYWdzOworCV9fdTE2IAlmbHJfZXhwaXJlczsKKwlfX3UxNglmbHJfbGluZ2VyOworCV9fdTMyCV9fZmxyX3BhZDsKKwkvKiBPcHRpb25zIGluIGZvcm1hdCBvZiBJUFY2X1BLVE9QVElPTlMgKi8KK307CisKKyNkZWZpbmUgSVBWNl9GTF9BX0dFVAkwCisjZGVmaW5lIElQVjZfRkxfQV9QVVQJMQorI2RlZmluZSBJUFY2X0ZMX0FfUkVORVcJMgorCisjZGVmaW5lIElQVjZfRkxfRl9DUkVBVEUJMQorI2RlZmluZSBJUFY2X0ZMX0ZfRVhDTAkJMgorCisjZGVmaW5lIElQVjZfRkxfU19OT05FCQkwCisjZGVmaW5lIElQVjZfRkxfU19FWENMCQkxCisjZGVmaW5lIElQVjZfRkxfU19QUk9DRVNTCTIKKyNkZWZpbmUgSVBWNl9GTF9TX1VTRVIJCTMKKyNkZWZpbmUgSVBWNl9GTF9TX0FOWQkJMjU1CisKKworLyoKKyAqCUJpdG1hc2sgY29uc3RhbnQgZGVjbGFyYXRpb25zIHRvIGhlbHAgYXBwbGljYXRpb25zIHNlbGVjdCBvdXQgdGhlIAorICoJZmxvdyBsYWJlbCBhbmQgcHJpb3JpdHkgZmllbGRzLgorICoKKyAqCU5vdGUgdGhhdCB0aGlzIGFyZSBpbiBob3N0IGJ5dGUgb3JkZXIgd2hpbGUgdGhlIGZsb3dpbmZvIGZpZWxkIG9mCisgKglzb2NrYWRkcl9pbjYgaXMgaW4gbmV0d29yayBieXRlIG9yZGVyLgorICovCisKKyNkZWZpbmUgSVBWNl9GTE9XSU5GT19GTE9XTEFCRUwJCTB4MDAwZmZmZmYKKyNkZWZpbmUgSVBWNl9GTE9XSU5GT19QUklPUklUWQkJMHgwZmYwMDAwMAorCisvKiBUaGVzZSBkZWZpbml0aW9ucyBhcmUgb2Jzb2xldGUgKi8KKyNkZWZpbmUgSVBWNl9QUklPUklUWV9VTkNIQVJBQ1RFUklaRUQJMHgwMDAwCisjZGVmaW5lIElQVjZfUFJJT1JJVFlfRklMTEVSCQkweDAxMDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV9VTkFUVEVOREVECTB4MDIwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZX1JFU0VSVkVEMQkJMHgwMzAwCisjZGVmaW5lIElQVjZfUFJJT1JJVFlfQlVMSwkJMHgwNDAwCisjZGVmaW5lIElQVjZfUFJJT1JJVFlfUkVTRVJWRUQyCQkweDA1MDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV9JTlRFUkFDVElWRQkweDA2MDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV9DT05UUk9MCQkweDA3MDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV84CQkJMHgwODAwCisjZGVmaW5lIElQVjZfUFJJT1JJVFlfOQkJCTB4MDkwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZXzEwCQkweDBhMDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV8xMQkJMHgwYjAwCisjZGVmaW5lIElQVjZfUFJJT1JJVFlfMTIJCTB4MGMwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZXzEzCQkweDBkMDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV8xNAkJMHgwZTAwCisjZGVmaW5lIElQVjZfUFJJT1JJVFlfMTUJCTB4MGYwMAorCisvKgorICoJSVBWNiBleHRlbnNpb24gaGVhZGVycworICovCisjZGVmaW5lIElQUFJPVE9fSE9QT1BUUwkJMAkvKiBJUHY2IGhvcC1ieS1ob3Agb3B0aW9ucwkqLworI2RlZmluZSBJUFBST1RPX1JPVVRJTkcJCTQzCS8qIElQdjYgcm91dGluZyBoZWFkZXIJCSovCisjZGVmaW5lIElQUFJPVE9fRlJBR01FTlQJNDQJLyogSVB2NiBmcmFnbWVudGF0aW9uIGhlYWRlcgkqLworI2RlZmluZSBJUFBST1RPX0lDTVBWNgkJNTgJLyogSUNNUHY2CQkJKi8KKyNkZWZpbmUgSVBQUk9UT19OT05FCQk1OQkvKiBJUHY2IG5vIG5leHQgaGVhZGVyCQkqLworI2RlZmluZSBJUFBST1RPX0RTVE9QVFMJCTYwCS8qIElQdjYgZGVzdGluYXRpb24gb3B0aW9ucwkqLworI2RlZmluZSBJUFBST1RPX01ICQkxMzUJLyogSVB2NiBtb2JpbGl0eSBoZWFkZXIJCSovCisKKy8qCisgKglJUHY2IFRMViBvcHRpb25zLgorICovCisjZGVmaW5lIElQVjZfVExWX1BBRDAJCTAKKyNkZWZpbmUgSVBWNl9UTFZfUEFETgkJMQorI2RlZmluZSBJUFY2X1RMVl9ST1VURVJBTEVSVAk1CisjZGVmaW5lIElQVjZfVExWX0pVTUJPCQkxOTQKKyNkZWZpbmUgSVBWNl9UTFZfSEFPCQkyMDEJLyogaG9tZSBhZGRyZXNzIG9wdGlvbiAqLworCisvKgorICoJSVBWNiBzb2NrZXQgb3B0aW9ucworICovCisKKyNkZWZpbmUgSVBWNl9BRERSRk9STQkJMQorI2RlZmluZSBJUFY2XzIyOTJQS1RJTkZPCTIKKyNkZWZpbmUgSVBWNl8yMjkySE9QT1BUUwkzCisjZGVmaW5lIElQVjZfMjI5MkRTVE9QVFMJNAorI2RlZmluZSBJUFY2XzIyOTJSVEhEUgkJNQorI2RlZmluZSBJUFY2XzIyOTJQS1RPUFRJT05TCTYKKyNkZWZpbmUgSVBWNl9DSEVDS1NVTQkJNworI2RlZmluZSBJUFY2XzIyOTJIT1BMSU1JVAk4CisjZGVmaW5lIElQVjZfTkVYVEhPUAkJOQorI2RlZmluZSBJUFY2X0FVVEhIRFIJCTEwCS8qIG9ic29sZXRlICovCisjZGVmaW5lIElQVjZfRkxPV0lORk8JCTExCisKKyNkZWZpbmUgSVBWNl9VTklDQVNUX0hPUFMJMTYKKyNkZWZpbmUgSVBWNl9NVUxUSUNBU1RfSUYJMTcKKyNkZWZpbmUgSVBWNl9NVUxUSUNBU1RfSE9QUwkxOAorI2RlZmluZSBJUFY2X01VTFRJQ0FTVF9MT09QCTE5CisjZGVmaW5lIElQVjZfQUREX01FTUJFUlNISVAJMjAKKyNkZWZpbmUgSVBWNl9EUk9QX01FTUJFUlNISVAJMjEKKyNkZWZpbmUgSVBWNl9ST1VURVJfQUxFUlQJMjIKKyNkZWZpbmUgSVBWNl9NVFVfRElTQ09WRVIJMjMKKyNkZWZpbmUgSVBWNl9NVFUJCTI0CisjZGVmaW5lIElQVjZfUkVDVkVSUgkJMjUKKyNkZWZpbmUgSVBWNl9WNk9OTFkJCTI2CisjZGVmaW5lIElQVjZfSk9JTl9BTllDQVNUCTI3CisjZGVmaW5lIElQVjZfTEVBVkVfQU5ZQ0FTVAkyOAorCisvKiBJUFY2X01UVV9ESVNDT1ZFUiB2YWx1ZXMgKi8KKyNkZWZpbmUgSVBWNl9QTVRVRElTQ19ET05UCQkwCisjZGVmaW5lIElQVjZfUE1UVURJU0NfV0FOVAkJMQorI2RlZmluZSBJUFY2X1BNVFVESVNDX0RPCQkyCisjZGVmaW5lIElQVjZfUE1UVURJU0NfUFJPQkUJCTMKKworLyogRmxvd2xhYmVsICovCisjZGVmaW5lIElQVjZfRkxPV0xBQkVMX01HUgkzMgorI2RlZmluZSBJUFY2X0ZMT1dJTkZPX1NFTkQJMzMKKworI2RlZmluZSBJUFY2X0lQU0VDX1BPTElDWQkzNAorI2RlZmluZSBJUFY2X1hGUk1fUE9MSUNZCTM1CisKKy8qCisgKiBNdWx0aWNhc3Q6CisgKiBGb2xsb3dpbmcgc29ja2V0IG9wdGlvbnMgYXJlIHNoYXJlZCBiZXR3ZWVuIElQdjQgYW5kIElQdjYuCisgKgorICogTUNBU1RfSk9JTl9HUk9VUAkJNDIKKyAqIE1DQVNUX0JMT0NLX1NPVVJDRQkJNDMKKyAqIE1DQVNUX1VOQkxPQ0tfU09VUkNFCQk0NAorICogTUNBU1RfTEVBVkVfR1JPVVAJCTQ1CisgKiBNQ0FTVF9KT0lOX1NPVVJDRV9HUk9VUAk0NgorICogTUNBU1RfTEVBVkVfU09VUkNFX0dST1VQCTQ3CisgKiBNQ0FTVF9NU0ZJTFRFUgkJNDgKKyAqLworCisvKgorICogQWR2YW5jZWQgQVBJIChSRkMzNTQyKSAoMSkKKyAqCisgKiBOb3RlOiBJUFY2X1JFQ1ZSVEhEUkRTVE9QVFMgZG9lcyBub3QgZXhpc3QuIHNlZSBuZXQvaXB2Ni9kYXRhZ3JhbS5jLgorICovCisKKyNkZWZpbmUgSVBWNl9SRUNWUEtUSU5GTwk0OQorI2RlZmluZSBJUFY2X1BLVElORk8JCTUwCisjZGVmaW5lIElQVjZfUkVDVkhPUExJTUlUCTUxCisjZGVmaW5lIElQVjZfSE9QTElNSVQJCTUyCisjZGVmaW5lIElQVjZfUkVDVkhPUE9QVFMJNTMKKyNkZWZpbmUgSVBWNl9IT1BPUFRTCQk1NAorI2RlZmluZSBJUFY2X1JUSERSRFNUT1BUUwk1NQorI2RlZmluZSBJUFY2X1JFQ1ZSVEhEUgkJNTYKKyNkZWZpbmUgSVBWNl9SVEhEUgkJNTcKKyNkZWZpbmUgSVBWNl9SRUNWRFNUT1BUUwk1OAorI2RlZmluZSBJUFY2X0RTVE9QVFMJCTU5CisjZGVmaW5lIElQVjZfUkVDVlBBVEhNVFUJNjAKKyNkZWZpbmUgSVBWNl9QQVRITVRVCQk2MQorI2RlZmluZSBJUFY2X0RPTlRGUkFHCQk2MgorI2lmIDAJLyogbm90IHlldCAqLworI2RlZmluZSBJUFY2X1VTRV9NSU5fTVRVCTYzCisjZW5kaWYKKworLyoKKyAqIE5ldGZpbHRlciAoMSkKKyAqCisgKiBGb2xsb3dpbmcgc29ja2V0IG9wdGlvbnMgYXJlIHVzZWQgaW4gaXA2X3RhYmxlczsKKyAqIHNlZSBpbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaC4KKyAqCisgKiBJUDZUX1NPX1NFVF9SRVBMQUNFIC8gSVA2VF9TT19HRVRfSU5GTwkJNjQKKyAqIElQNlRfU09fU0VUX0FERF9DT1VOVEVSUyAvIElQNlRfU09fR0VUX0VOVFJJRVMJNjUKKyAqLworCisvKgorICogQWR2YW5jZWQgQVBJIChSRkMzNTQyKSAoMikKKyAqLworI2RlZmluZSBJUFY2X1JFQ1ZUQ0xBU1MJCTY2CisjZGVmaW5lIElQVjZfVENMQVNTCQk2NworCisvKgorICogTmV0ZmlsdGVyICgyKQorICoKKyAqIEZvbGxvd2luZyBzb2NrZXQgb3B0aW9ucyBhcmUgdXNlZCBpbiBpcDZfdGFibGVzOworICogc2VlIGluY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oLgorICoKKyAqIElQNlRfU09fR0VUX1JFVklTSU9OX01BVENICTY4CisgKiBJUDZUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQJNjkKKyAqLworCisvKiBSRkM1MDE0OiBTb3VyY2UgYWRkcmVzcyBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgSVBWNl9BRERSX1BSRUZFUkVOQ0VTCTcyCisKKyNkZWZpbmUgSVBWNl9QUkVGRVJfU1JDX1RNUAkJMHgwMDAxCisjZGVmaW5lIElQVjZfUFJFRkVSX1NSQ19QVUJMSUMJCTB4MDAwMgorI2RlZmluZSBJUFY2X1BSRUZFUl9TUkNfUFVCVE1QX0RFRkFVTFQJMHgwMTAwCisjZGVmaW5lIElQVjZfUFJFRkVSX1NSQ19DT0EJCTB4MDAwNAorI2RlZmluZSBJUFY2X1BSRUZFUl9TUkNfSE9NRQkJMHgwNDAwCisjZGVmaW5lIElQVjZfUFJFRkVSX1NSQ19DR0EJCTB4MDAwOAorI2RlZmluZSBJUFY2X1BSRUZFUl9TUkNfTk9OQ0dBCQkweDA4MDAKKworLyogUkZDNTA4MjogR2VuZXJhbGl6ZWQgVHRsIFNlY3VyaXR5IE1lY2hhbmlzbSAqLworI2RlZmluZSBJUFY2X01JTkhPUENPVU5UCQk3MworCisjZGVmaW5lIElQVjZfT1JJR0RTVEFERFIgICAgICAgIDc0CisjZGVmaW5lIElQVjZfUkVDVk9SSUdEU1RBRERSICAgIElQVjZfT1JJR0RTVEFERFIKKyNkZWZpbmUgSVBWNl9UUkFOU1BBUkVOVCAgICAgICAgNzUKKworLyoKKyAqIE11bHRpY2FzdCBSb3V0aW5nOgorICogc2VlIGluY2x1ZGUvbGludXgvbXJvdXRlNi5oLgorICoKKyAqIE1SVDZfSU5JVAkJCTIwMAorICogTVJUNl9ET05FCQkJMjAxCisgKiBNUlQ2X0FERF9NSUYJCQkyMDIKKyAqIE1SVDZfREVMX01JRgkJCTIwMworICogTVJUNl9BRERfTUZDCQkJMjA0CisgKiBNUlQ2X0RFTF9NRkMJCQkyMDUKKyAqIE1SVDZfVkVSU0lPTgkJCTIwNgorICogTVJUNl9BU1NFUlQJCQkyMDcKKyAqIE1SVDZfUElNCQkJMjA4CisgKiAocmVzZXJ2ZWQpCQkJMjA5CisgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pbl9yb3V0ZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pbl9yb3V0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjFiOGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2luX3JvdXRlLmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBfTElOVVhfSU5fUk9VVEVfSAorI2RlZmluZSBfTElOVVhfSU5fUk9VVEVfSAorCisvKiBJUHY0IHJvdXRpbmcgY2FjaGUgZmxhZ3MgKi8KKworI2RlZmluZSBSVENGX0RFQUQJUlROSF9GX0RFQUQKKyNkZWZpbmUgUlRDRl9PTkxJTksJUlROSF9GX09OTElOSworCisvKiBPYnNvbGV0ZSBmbGFnLiBBYm91dCB0byBiZSBkZWxldGVkICovCisjZGVmaW5lIFJUQ0ZfTk9QTVRVRElTQyBSVE1fRl9OT1BNVFVESVNDCisKKyNkZWZpbmUgUlRDRl9OT1RJRlkJMHgwMDAxMDAwMAorI2RlZmluZSBSVENGX0RJUkVDVERTVAkweDAwMDIwMDAwIC8qIHVudXNlZCAqLworI2RlZmluZSBSVENGX1JFRElSRUNURUQJMHgwMDA0MDAwMAorI2RlZmluZSBSVENGX1RQUk9YWQkweDAwMDgwMDAwIC8qIHVudXNlZCAqLworCisjZGVmaW5lIFJUQ0ZfRkFTVAkweDAwMjAwMDAwIC8qIHVudXNlZCAqLworI2RlZmluZSBSVENGX01BU1EJMHgwMDQwMDAwMCAvKiB1bnVzZWQgKi8KKyNkZWZpbmUgUlRDRl9TTkFUCTB4MDA4MDAwMDAgLyogdW51c2VkICovCisjZGVmaW5lIFJUQ0ZfRE9SRURJUkVDVCAweDAxMDAwMDAwCisjZGVmaW5lIFJUQ0ZfRElSRUNUU1JDCTB4MDQwMDAwMDAKKyNkZWZpbmUgUlRDRl9ETkFUCTB4MDgwMDAwMDAKKyNkZWZpbmUgUlRDRl9CUk9BRENBU1QJMHgxMDAwMDAwMAorI2RlZmluZSBSVENGX01VTFRJQ0FTVAkweDIwMDAwMDAwCisjZGVmaW5lIFJUQ0ZfUkVKRUNUCTB4NDAwMDAwMDAgLyogdW51c2VkICovCisjZGVmaW5lIFJUQ0ZfTE9DQUwJMHg4MDAwMDAwMAorCisjZGVmaW5lIFJUQ0ZfTkFUCShSVENGX0ROQVR8UlRDRl9TTkFUKQorCisjZGVmaW5lIFJUX1RPUyh0b3MpCSgodG9zKSZJUFRPU19UT1NfTUFTSykKKworI2VuZGlmIC8qIF9MSU5VWF9JTl9ST1VURV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2luZXRfZGlhZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pbmV0X2RpYWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTZmMWZjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pbmV0X2RpYWcuaApAQCAtMCwwICsxLDEyNiBAQAorI2lmbmRlZiBfSU5FVF9ESUFHX0hfCisjZGVmaW5lIF9JTkVUX0RJQUdfSF8gMQorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogSnVzdCBzb21lIHJhbmRvbSBudW1iZXIgKi8KKyNkZWZpbmUgVENQRElBR19HRVRTT0NLIDE4CisjZGVmaW5lIERDQ1BESUFHX0dFVFNPQ0sgMTkKKworI2RlZmluZSBJTkVUX0RJQUdfR0VUU09DS19NQVggMjQKKworLyogU29ja2V0IGlkZW50aXR5ICovCitzdHJ1Y3QgaW5ldF9kaWFnX3NvY2tpZCB7CisJX19iZTE2CWlkaWFnX3Nwb3J0OworCV9fYmUxNglpZGlhZ19kcG9ydDsKKwlfX2JlMzIJaWRpYWdfc3JjWzRdOworCV9fYmUzMglpZGlhZ19kc3RbNF07CisJX191MzIJaWRpYWdfaWY7CisJX191MzIJaWRpYWdfY29va2llWzJdOworI2RlZmluZSBJTkVUX0RJQUdfTk9DT09LSUUgKH4wVSkKK307CisKKy8qIFJlcXVlc3Qgc3RydWN0dXJlICovCisKK3N0cnVjdCBpbmV0X2RpYWdfcmVxIHsKKwlfX3U4CWlkaWFnX2ZhbWlseTsJCS8qIEZhbWlseSBvZiBhZGRyZXNzZXMuICovCisJX191OAlpZGlhZ19zcmNfbGVuOworCV9fdTgJaWRpYWdfZHN0X2xlbjsKKwlfX3U4CWlkaWFnX2V4dDsJCS8qIFF1ZXJ5IGV4dGVuZGVkIGluZm9ybWF0aW9uICovCisKKwlzdHJ1Y3QgaW5ldF9kaWFnX3NvY2tpZCBpZDsKKworCV9fdTMyCWlkaWFnX3N0YXRlczsJCS8qIFN0YXRlcyB0byBkdW1wICovCisJX191MzIJaWRpYWdfZGJzOwkJLyogVGFibGVzIHRvIGR1bXAgKE5JKSAqLworfTsKKworZW51bSB7CisJSU5FVF9ESUFHX1JFUV9OT05FLAorCUlORVRfRElBR19SRVFfQllURUNPREUsCit9OworCisjZGVmaW5lIElORVRfRElBR19SRVFfTUFYIElORVRfRElBR19SRVFfQllURUNPREUKKworLyogQnl0ZWNvZGUgaXMgc2VxdWVuY2Ugb2YgNCBieXRlIGNvbW1hbmRzIGZvbGxvd2VkIGJ5IHZhcmlhYmxlIGFyZ3VtZW50cy4KKyAqIEFsbCB0aGUgY29tbWFuZHMgaWRlbnRpZmllZCBieSAiY29kZSIgYXJlIGNvbmRpdGlvbmFsIGp1bXBzIGZvcndhcmQ6CisgKiB0byBvZmZzZXQgY2MrInllcyIgb3IgdG8gb2Zmc2V0IGNjKyJubyIuICJ5ZXMiIGlzIHN1cHBvc2VkIHRvIGJlCisgKiBsZW5ndGggb2YgdGhlIGNvbW1hbmQgYW5kIGl0cyBhcmd1bWVudHMuCisgKi8KKyAKK3N0cnVjdCBpbmV0X2RpYWdfYmNfb3AgeworCXVuc2lnbmVkIGNoYXIJY29kZTsKKwl1bnNpZ25lZCBjaGFyCXllczsKKwl1bnNpZ25lZCBzaG9ydAlubzsKK307CisKK2VudW0geworCUlORVRfRElBR19CQ19OT1AsCisJSU5FVF9ESUFHX0JDX0pNUCwKKwlJTkVUX0RJQUdfQkNfU19HRSwKKwlJTkVUX0RJQUdfQkNfU19MRSwKKwlJTkVUX0RJQUdfQkNfRF9HRSwKKwlJTkVUX0RJQUdfQkNfRF9MRSwKKwlJTkVUX0RJQUdfQkNfQVVUTywKKwlJTkVUX0RJQUdfQkNfU19DT05ELAorCUlORVRfRElBR19CQ19EX0NPTkQsCit9OworCitzdHJ1Y3QgaW5ldF9kaWFnX2hvc3Rjb25kIHsKKwlfX3U4CWZhbWlseTsKKwlfX3U4CXByZWZpeF9sZW47CisJaW50CXBvcnQ7CisJX19iZTMyCWFkZHJbMF07Cit9OworCisvKiBCYXNlIGluZm8gc3RydWN0dXJlLiBJdCBjb250YWlucyBzb2NrZXQgaWRlbnRpdHkgKGFkZHJzL3BvcnRzL2Nvb2tpZSkKKyAqIGFuZCwgYWxhcywgdGhlIGluZm9ybWF0aW9uIHNob3duIGJ5IG5ldHN0YXQuICovCitzdHJ1Y3QgaW5ldF9kaWFnX21zZyB7CisJX191OAlpZGlhZ19mYW1pbHk7CisJX191OAlpZGlhZ19zdGF0ZTsKKwlfX3U4CWlkaWFnX3RpbWVyOworCV9fdTgJaWRpYWdfcmV0cmFuczsKKworCXN0cnVjdCBpbmV0X2RpYWdfc29ja2lkIGlkOworCisJX191MzIJaWRpYWdfZXhwaXJlczsKKwlfX3UzMglpZGlhZ19ycXVldWU7CisJX191MzIJaWRpYWdfd3F1ZXVlOworCV9fdTMyCWlkaWFnX3VpZDsKKwlfX3UzMglpZGlhZ19pbm9kZTsKK307CisKKy8qIEV4dGVuc2lvbnMgKi8KKworZW51bSB7CisJSU5FVF9ESUFHX05PTkUsCisJSU5FVF9ESUFHX01FTUlORk8sCisJSU5FVF9ESUFHX0lORk8sCisJSU5FVF9ESUFHX1ZFR0FTSU5GTywKKwlJTkVUX0RJQUdfQ09ORywKKwlJTkVUX0RJQUdfVE9TLAorCUlORVRfRElBR19UQ0xBU1MsCit9OworCisjZGVmaW5lIElORVRfRElBR19NQVggSU5FVF9ESUFHX1RDTEFTUworCisKKy8qIElORVRfRElBR19NRU0gKi8KKworc3RydWN0IGluZXRfZGlhZ19tZW1pbmZvIHsKKwlfX3UzMglpZGlhZ19ybWVtOworCV9fdTMyCWlkaWFnX3dtZW07CisJX191MzIJaWRpYWdfZm1lbTsKKwlfX3UzMglpZGlhZ190bWVtOworfTsKKworLyogSU5FVF9ESUFHX1ZFR0FTSU5GTyAqLworCitzdHJ1Y3QgdGNwdmVnYXNfaW5mbyB7CisJX191MzIJdGNwdl9lbmFibGVkOworCV9fdTMyCXRjcHZfcnR0Y250OworCV9fdTMyCXRjcHZfcnR0OworCV9fdTMyCXRjcHZfbWlucnR0OworfTsKKworCisjZW5kaWYgLyogX0lORVRfRElBR19IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pbm90aWZ5LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lub3RpZnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDNiZmEyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pbm90aWZ5LmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIElub2RlIGJhc2VkIGRpcmVjdG9yeSBub3RpZmljYXRpb24gZm9yIExpbnV4CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEpvaG4gTWNDdXRjaGFuCisgKi8KKworI2lmbmRlZiBfTElOVVhfSU5PVElGWV9ICisjZGVmaW5lIF9MSU5VWF9JTk9USUZZX0gKKworLyogRm9yIE9fQ0xPRVhFQyBhbmQgT19OT05CTE9DSyAqLworI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIHN0cnVjdCBpbm90aWZ5X2V2ZW50IC0gc3RydWN0dXJlIHJlYWQgZnJvbSB0aGUgaW5vdGlmeSBkZXZpY2UgZm9yIGVhY2ggZXZlbnQKKyAqCisgKiBXaGVuIHlvdSBhcmUgd2F0Y2hpbmcgYSBkaXJlY3RvcnksIHlvdSB3aWxsIHJlY2VpdmUgdGhlIGZpbGVuYW1lIGZvciBldmVudHMKKyAqIHN1Y2ggYXMgSU5fQ1JFQVRFLCBJTl9ERUxFVEUsIElOX09QRU4sIElOX0NMT1NFLCAuLi4sIHJlbGF0aXZlIHRvIHRoZSB3ZC4KKyAqLworc3RydWN0IGlub3RpZnlfZXZlbnQgeworCV9fczMyCQl3ZDsJCS8qIHdhdGNoIGRlc2NyaXB0b3IgKi8KKwlfX3UzMgkJbWFzazsJCS8qIHdhdGNoIG1hc2sgKi8KKwlfX3UzMgkJY29va2llOwkJLyogY29va2llIHRvIHN5bmNocm9uaXplIHR3byBldmVudHMgKi8KKwlfX3UzMgkJbGVuOwkJLyogbGVuZ3RoIChpbmNsdWRpbmcgbnVsbHMpIG9mIG5hbWUgKi8KKwljaGFyCQluYW1lWzBdOwkvKiBzdHViIGZvciBwb3NzaWJsZSBuYW1lICovCit9OworCisvKiB0aGUgZm9sbG93aW5nIGFyZSBsZWdhbCwgaW1wbGVtZW50ZWQgZXZlbnRzIHRoYXQgdXNlci1zcGFjZSBjYW4gd2F0Y2ggZm9yICovCisjZGVmaW5lIElOX0FDQ0VTUwkJMHgwMDAwMDAwMQkvKiBGaWxlIHdhcyBhY2Nlc3NlZCAqLworI2RlZmluZSBJTl9NT0RJRlkJCTB4MDAwMDAwMDIJLyogRmlsZSB3YXMgbW9kaWZpZWQgKi8KKyNkZWZpbmUgSU5fQVRUUklCCQkweDAwMDAwMDA0CS8qIE1ldGFkYXRhIGNoYW5nZWQgKi8KKyNkZWZpbmUgSU5fQ0xPU0VfV1JJVEUJCTB4MDAwMDAwMDgJLyogV3JpdHRhYmxlIGZpbGUgd2FzIGNsb3NlZCAqLworI2RlZmluZSBJTl9DTE9TRV9OT1dSSVRFCTB4MDAwMDAwMTAJLyogVW53cml0dGFibGUgZmlsZSBjbG9zZWQgKi8KKyNkZWZpbmUgSU5fT1BFTgkJCTB4MDAwMDAwMjAJLyogRmlsZSB3YXMgb3BlbmVkICovCisjZGVmaW5lIElOX01PVkVEX0ZST00JCTB4MDAwMDAwNDAJLyogRmlsZSB3YXMgbW92ZWQgZnJvbSBYICovCisjZGVmaW5lIElOX01PVkVEX1RPCQkweDAwMDAwMDgwCS8qIEZpbGUgd2FzIG1vdmVkIHRvIFkgKi8KKyNkZWZpbmUgSU5fQ1JFQVRFCQkweDAwMDAwMTAwCS8qIFN1YmZpbGUgd2FzIGNyZWF0ZWQgKi8KKyNkZWZpbmUgSU5fREVMRVRFCQkweDAwMDAwMjAwCS8qIFN1YmZpbGUgd2FzIGRlbGV0ZWQgKi8KKyNkZWZpbmUgSU5fREVMRVRFX1NFTEYJCTB4MDAwMDA0MDAJLyogU2VsZiB3YXMgZGVsZXRlZCAqLworI2RlZmluZSBJTl9NT1ZFX1NFTEYJCTB4MDAwMDA4MDAJLyogU2VsZiB3YXMgbW92ZWQgKi8KKworLyogdGhlIGZvbGxvd2luZyBhcmUgbGVnYWwgZXZlbnRzLiAgdGhleSBhcmUgc2VudCBhcyBuZWVkZWQgdG8gYW55IHdhdGNoICovCisjZGVmaW5lIElOX1VOTU9VTlQJCTB4MDAwMDIwMDAJLyogQmFja2luZyBmcyB3YXMgdW5tb3VudGVkICovCisjZGVmaW5lIElOX1FfT1ZFUkZMT1cJCTB4MDAwMDQwMDAJLyogRXZlbnQgcXVldWVkIG92ZXJmbG93ZWQgKi8KKyNkZWZpbmUgSU5fSUdOT1JFRAkJMHgwMDAwODAwMAkvKiBGaWxlIHdhcyBpZ25vcmVkICovCisKKy8qIGhlbHBlciBldmVudHMgKi8KKyNkZWZpbmUgSU5fQ0xPU0UJCShJTl9DTE9TRV9XUklURSB8IElOX0NMT1NFX05PV1JJVEUpIC8qIGNsb3NlICovCisjZGVmaW5lIElOX01PVkUJCQkoSU5fTU9WRURfRlJPTSB8IElOX01PVkVEX1RPKSAvKiBtb3ZlcyAqLworCisvKiBzcGVjaWFsIGZsYWdzICovCisjZGVmaW5lIElOX09OTFlESVIJCTB4MDEwMDAwMDAJLyogb25seSB3YXRjaCB0aGUgcGF0aCBpZiBpdCBpcyBhIGRpcmVjdG9yeSAqLworI2RlZmluZSBJTl9ET05UX0ZPTExPVwkJMHgwMjAwMDAwMAkvKiBkb24ndCBmb2xsb3cgYSBzeW0gbGluayAqLworI2RlZmluZSBJTl9FWENMX1VOTElOSwkJMHgwNDAwMDAwMAkvKiBleGNsdWRlIGV2ZW50cyBvbiB1bmxpbmtlZCBvYmplY3RzICovCisjZGVmaW5lIElOX01BU0tfQURECQkweDIwMDAwMDAwCS8qIGFkZCB0byB0aGUgbWFzayBvZiBhbiBhbHJlYWR5IGV4aXN0aW5nIHdhdGNoICovCisjZGVmaW5lIElOX0lTRElSCQkweDQwMDAwMDAwCS8qIGV2ZW50IG9jY3VycmVkIGFnYWluc3QgZGlyICovCisjZGVmaW5lIElOX09ORVNIT1QJCTB4ODAwMDAwMDAJLyogb25seSBzZW5kIGV2ZW50IG9uY2UgKi8KKworLyoKKyAqIEFsbCBvZiB0aGUgZXZlbnRzIC0gd2UgYnVpbGQgdGhlIGxpc3QgYnkgaGFuZCBzbyB0aGF0IHdlIGNhbiBhZGQgZmxhZ3MgaW4KKyAqIHRoZSBmdXR1cmUgYW5kIG5vdCBicmVhayBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgQXBwcyB3aWxsIGdldCBvbmx5IHRoZQorICogZXZlbnRzIHRoYXQgdGhleSBvcmlnaW5hbGx5IHdhbnRlZC4gIEJlIHN1cmUgdG8gYWRkIG5ldyBldmVudHMgaGVyZSEKKyAqLworI2RlZmluZSBJTl9BTExfRVZFTlRTCShJTl9BQ0NFU1MgfCBJTl9NT0RJRlkgfCBJTl9BVFRSSUIgfCBJTl9DTE9TRV9XUklURSB8IFwKKwkJCSBJTl9DTE9TRV9OT1dSSVRFIHwgSU5fT1BFTiB8IElOX01PVkVEX0ZST00gfCBcCisJCQkgSU5fTU9WRURfVE8gfCBJTl9ERUxFVEUgfCBJTl9DUkVBVEUgfCBJTl9ERUxFVEVfU0VMRiB8IFwKKwkJCSBJTl9NT1ZFX1NFTEYpCisKKy8qIEZsYWdzIGZvciBzeXNfaW5vdGlmeV9pbml0MS4gICovCisjZGVmaW5lIElOX0NMT0VYRUMgT19DTE9FWEVDCisjZGVmaW5lIElOX05PTkJMT0NLIE9fTk9OQkxPQ0sKKworCisjZW5kaWYJLyogX0xJTlVYX0lOT1RJRllfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pbnB1dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pbnB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MjNiNjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lucHV0LmgKQEAgLTAsMCArMSwxMTIwIEBACisjaWZuZGVmIF9JTlBVVF9ICisjZGVmaW5lIF9JTlBVVF9ICisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMiBWb2p0ZWNoIFBhdmxpaworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIFRoZSBldmVudCBzdHJ1Y3R1cmUgaXRzZWxmCisgKi8KKworc3RydWN0IGlucHV0X2V2ZW50IHsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lOworCV9fdTE2IHR5cGU7CisJX191MTYgY29kZTsKKwlfX3MzMiB2YWx1ZTsKK307CisKKy8qCisgKiBQcm90b2NvbCB2ZXJzaW9uLgorICovCisKKyNkZWZpbmUgRVZfVkVSU0lPTgkJMHgwMTAwMDEKKworLyoKKyAqIElPQ1RMcyAoMHgwMCAtIDB4N2YpCisgKi8KKworc3RydWN0IGlucHV0X2lkIHsKKwlfX3UxNiBidXN0eXBlOworCV9fdTE2IHZlbmRvcjsKKwlfX3UxNiBwcm9kdWN0OworCV9fdTE2IHZlcnNpb247Cit9OworCisvKioKKyAqIHN0cnVjdCBpbnB1dF9hYnNpbmZvIC0gdXNlZCBieSBFVklPQ0dBQlMvRVZJT0NTQUJTIGlvY3RscworICogQHZhbHVlOiBsYXRlc3QgcmVwb3J0ZWQgdmFsdWUgZm9yIHRoZSBheGlzLgorICogQG1pbmltdW06IHNwZWNpZmllcyBtaW5pbXVtIHZhbHVlIGZvciB0aGUgYXhpcy4KKyAqIEBtYXhpbXVtOiBzcGVjaWZpZXMgbWF4aW11bSB2YWx1ZSBmb3IgdGhlIGF4aXMuCisgKiBAZnV6ejogc3BlY2lmaWVzIGZ1enogdmFsdWUgdGhhdCBpcyB1c2VkIHRvIGZpbHRlciBub2lzZSBmcm9tCisgKgl0aGUgZXZlbnQgc3RyZWFtLgorICogQGZsYXQ6IHZhbHVlcyB0aGF0IGFyZSB3aXRoaW4gdGhpcyB2YWx1ZSB3aWxsIGJlIGRpc2NhcmRlZCBieQorICoJam95ZGV2IGludGVyZmFjZSBhbmQgcmVwb3J0ZWQgYXMgMCBpbnN0ZWFkLgorICogQHJlc29sdXRpb246IHNwZWNpZmllcyByZXNvbHV0aW9uIGZvciB0aGUgdmFsdWVzIHJlcG9ydGVkIGZvcgorICoJdGhlIGF4aXMuCisgKgorICogTm90ZSB0aGF0IGlucHV0IGNvcmUgZG9lcyBub3QgY2xhbXAgcmVwb3J0ZWQgdmFsdWVzIHRvIHRoZQorICogW21pbmltdW0sIG1heGltdW1dIGxpbWl0cywgc3VjaCB0YXNrIGlzIGxlZnQgdG8gdXNlcnNwYWNlLgorICoKKyAqIFJlc29sdXRpb24gZm9yIG1haW4gYXhlcyAoQUJTX1gsIEFCU19ZLCBBQlNfWikgaXMgcmVwb3J0ZWQgaW4KKyAqIHVuaXRzIHBlciBtaWxsaW1ldGVyICh1bml0cy9tbSksIHJlc29sdXRpb24gZm9yIHJvdGF0aW9uYWwgYXhlcworICogKEFCU19SWCwgQUJTX1JZLCBBQlNfUlopIGlzIHJlcG9ydGVkIGluIHVuaXRzIHBlciByYWRpYW4uCisgKi8KK3N0cnVjdCBpbnB1dF9hYnNpbmZvIHsKKwlfX3MzMiB2YWx1ZTsKKwlfX3MzMiBtaW5pbXVtOworCV9fczMyIG1heGltdW07CisJX19zMzIgZnV6ejsKKwlfX3MzMiBmbGF0OworCV9fczMyIHJlc29sdXRpb247Cit9OworCisvKioKKyAqIHN0cnVjdCBpbnB1dF9rZXltYXBfZW50cnkgLSB1c2VkIGJ5IEVWSU9DR0tFWUNPREUvRVZJT0NTS0VZQ09ERSBpb2N0bHMKKyAqIEBzY2FuY29kZTogc2NhbmNvZGUgcmVwcmVzZW50ZWQgaW4gbWFjaGluZS1lbmRpYW4gZm9ybS4KKyAqIEBsZW46IGxlbmd0aCBvZiB0aGUgc2NhbmNvZGUgdGhhdCByZXNpZGVzIGluIEBzY2FuY29kZSBidWZmZXIuCisgKiBAaW5kZXg6IGluZGV4IGluIHRoZSBrZXltYXAsIG1heSBiZSB1c2VkIGluc3RlYWQgb2Ygc2NhbmNvZGUKKyAqIEBmbGFnczogYWxsb3dzIHRvIHNwZWNpZnkgaG93IGtlcm5lbCBzaG91bGQgaGFuZGxlIHRoZSByZXF1ZXN0LiBGb3IKKyAqCWV4YW1wbGUsIHNldHRpbmcgSU5QVVRfS0VZTUFQX0JZX0lOREVYIGZsYWcgaW5kaWNhdGVzIHRoYXQga2VybmVsCisgKglzaG91bGQgcGVyZm9ybSBsb29rdXAgaW4ga2V5bWFwIGJ5IEBpbmRleCBpbnN0ZWFkIG9mIEBzY2FuY29kZQorICogQGtleWNvZGU6IGtleSBjb2RlIGFzc2lnbmVkIHRvIHRoaXMgc2NhbmNvZGUKKyAqCisgKiBUaGUgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmV0cmlldmUgYW5kIG1vZGlmeSBrZXltYXAgZGF0YS4gVXNlcnMgaGF2ZQorICogb3B0aW9uIG9mIHBlcmZvcm1pbmcgbG9va3VwIGVpdGhlciBieSBAc2NhbmNvZGUgaXRzZWxmIG9yIGJ5IEBpbmRleAorICogaW4ga2V5bWFwIGVudHJ5LiBFVklPQ0dLRVlDT0RFIHdpbGwgYWxzbyByZXR1cm4gc2NhbmNvZGUgb3IgaW5kZXgKKyAqIChkZXBlbmRpbmcgb24gd2hpY2ggZWxlbWVudCB3YXMgdXNlZCB0byBwZXJmb3JtIGxvb2t1cCkuCisgKi8KK3N0cnVjdCBpbnB1dF9rZXltYXBfZW50cnkgeworI2RlZmluZSBJTlBVVF9LRVlNQVBfQllfSU5ERVgJKDEgPDwgMCkKKwlfX3U4ICBmbGFnczsKKwlfX3U4ICBsZW47CisJX191MTYgaW5kZXg7CisJX191MzIga2V5Y29kZTsKKwlfX3U4ICBzY2FuY29kZVszMl07Cit9OworCisjZGVmaW5lIEVWSU9DR1ZFUlNJT04JCV9JT1IoJ0UnLCAweDAxLCBpbnQpCQkJLyogZ2V0IGRyaXZlciB2ZXJzaW9uICovCisjZGVmaW5lIEVWSU9DR0lECQlfSU9SKCdFJywgMHgwMiwgc3RydWN0IGlucHV0X2lkKQkvKiBnZXQgZGV2aWNlIElEICovCisjZGVmaW5lIEVWSU9DR1JFUAkJX0lPUignRScsIDB4MDMsIHVuc2lnbmVkIGludFsyXSkJLyogZ2V0IHJlcGVhdCBzZXR0aW5ncyAqLworI2RlZmluZSBFVklPQ1NSRVAJCV9JT1coJ0UnLCAweDAzLCB1bnNpZ25lZCBpbnRbMl0pCS8qIHNldCByZXBlYXQgc2V0dGluZ3MgKi8KKworI2RlZmluZSBFVklPQ0dLRVlDT0RFCQlfSU9SKCdFJywgMHgwNCwgdW5zaWduZWQgaW50WzJdKSAgICAgICAgLyogZ2V0IGtleWNvZGUgKi8KKyNkZWZpbmUgRVZJT0NHS0VZQ09ERV9WMglfSU9SKCdFJywgMHgwNCwgc3RydWN0IGlucHV0X2tleW1hcF9lbnRyeSkKKyNkZWZpbmUgRVZJT0NTS0VZQ09ERQkJX0lPVygnRScsIDB4MDQsIHVuc2lnbmVkIGludFsyXSkgICAgICAgIC8qIHNldCBrZXljb2RlICovCisjZGVmaW5lIEVWSU9DU0tFWUNPREVfVjIJX0lPVygnRScsIDB4MDQsIHN0cnVjdCBpbnB1dF9rZXltYXBfZW50cnkpCisKKyNkZWZpbmUgRVZJT0NHTkFNRShsZW4pCQlfSU9DKF9JT0NfUkVBRCwgJ0UnLCAweDA2LCBsZW4pCQkvKiBnZXQgZGV2aWNlIG5hbWUgKi8KKyNkZWZpbmUgRVZJT0NHUEhZUyhsZW4pCQlfSU9DKF9JT0NfUkVBRCwgJ0UnLCAweDA3LCBsZW4pCQkvKiBnZXQgcGh5c2ljYWwgbG9jYXRpb24gKi8KKyNkZWZpbmUgRVZJT0NHVU5JUShsZW4pCQlfSU9DKF9JT0NfUkVBRCwgJ0UnLCAweDA4LCBsZW4pCQkvKiBnZXQgdW5pcXVlIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgRVZJT0NHUFJPUChsZW4pCQlfSU9DKF9JT0NfUkVBRCwgJ0UnLCAweDA5LCBsZW4pCQkvKiBnZXQgZGV2aWNlIHByb3BlcnRpZXMgKi8KKworI2RlZmluZSBFVklPQ0dLRVkobGVuKQkJX0lPQyhfSU9DX1JFQUQsICdFJywgMHgxOCwgbGVuKQkJLyogZ2V0IGdsb2JhbCBrZXkgc3RhdGUgKi8KKyNkZWZpbmUgRVZJT0NHTEVEKGxlbikJCV9JT0MoX0lPQ19SRUFELCAnRScsIDB4MTksIGxlbikJCS8qIGdldCBhbGwgTEVEcyAqLworI2RlZmluZSBFVklPQ0dTTkQobGVuKQkJX0lPQyhfSU9DX1JFQUQsICdFJywgMHgxYSwgbGVuKQkJLyogZ2V0IGFsbCBzb3VuZHMgc3RhdHVzICovCisjZGVmaW5lIEVWSU9DR1NXKGxlbikJCV9JT0MoX0lPQ19SRUFELCAnRScsIDB4MWIsIGxlbikJCS8qIGdldCBhbGwgc3dpdGNoIHN0YXRlcyAqLworCisjZGVmaW5lIEVWSU9DR0JJVChldixsZW4pCV9JT0MoX0lPQ19SRUFELCAnRScsIDB4MjAgKyAoZXYpLCBsZW4pCS8qIGdldCBldmVudCBiaXRzICovCisjZGVmaW5lIEVWSU9DR0FCUyhhYnMpCQlfSU9SKCdFJywgMHg0MCArIChhYnMpLCBzdHJ1Y3QgaW5wdXRfYWJzaW5mbykJLyogZ2V0IGFicyB2YWx1ZS9saW1pdHMgKi8KKyNkZWZpbmUgRVZJT0NTQUJTKGFicykJCV9JT1coJ0UnLCAweGMwICsgKGFicyksIHN0cnVjdCBpbnB1dF9hYnNpbmZvKQkvKiBzZXQgYWJzIHZhbHVlL2xpbWl0cyAqLworCisjZGVmaW5lIEVWSU9DU0ZGCQlfSU9DKF9JT0NfV1JJVEUsICdFJywgMHg4MCwgc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3QpKQkvKiBzZW5kIGEgZm9yY2UgZWZmZWN0IHRvIGEgZm9yY2UgZmVlZGJhY2sgZGV2aWNlICovCisjZGVmaW5lIEVWSU9DUk1GRgkJX0lPVygnRScsIDB4ODEsIGludCkJCQkvKiBFcmFzZSBhIGZvcmNlIGVmZmVjdCAqLworI2RlZmluZSBFVklPQ0dFRkZFQ1RTCQlfSU9SKCdFJywgMHg4NCwgaW50KQkJCS8qIFJlcG9ydCBudW1iZXIgb2YgZWZmZWN0cyBwbGF5YWJsZSBhdCB0aGUgc2FtZSB0aW1lICovCisKKyNkZWZpbmUgRVZJT0NHUkFCCQlfSU9XKCdFJywgMHg5MCwgaW50KQkJCS8qIEdyYWIvUmVsZWFzZSBkZXZpY2UgKi8KKworLyoKKyAqIERldmljZSBwcm9wZXJ0aWVzIGFuZCBxdWlya3MKKyAqLworCisjZGVmaW5lIElOUFVUX1BST1BfUE9JTlRFUgkJMHgwMAkvKiBuZWVkcyBhIHBvaW50ZXIgKi8KKyNkZWZpbmUgSU5QVVRfUFJPUF9ESVJFQ1QJCTB4MDEJLyogZGlyZWN0IGlucHV0IGRldmljZXMgKi8KKyNkZWZpbmUgSU5QVVRfUFJPUF9CVVRUT05QQUQJCTB4MDIJLyogaGFzIGJ1dHRvbihzKSB1bmRlciBwYWQgKi8KKyNkZWZpbmUgSU5QVVRfUFJPUF9TRU1JX01UCQkweDAzCS8qIHRvdWNoIHJlY3RhbmdsZSBvbmx5ICovCisKKyNkZWZpbmUgSU5QVVRfUFJPUF9NQVgJCQkweDFmCisjZGVmaW5lIElOUFVUX1BST1BfQ05UCQkJKElOUFVUX1BST1BfTUFYICsgMSkKKworLyoKKyAqIEV2ZW50IHR5cGVzCisgKi8KKworI2RlZmluZSBFVl9TWU4JCQkweDAwCisjZGVmaW5lIEVWX0tFWQkJCTB4MDEKKyNkZWZpbmUgRVZfUkVMCQkJMHgwMgorI2RlZmluZSBFVl9BQlMJCQkweDAzCisjZGVmaW5lIEVWX01TQwkJCTB4MDQKKyNkZWZpbmUgRVZfU1cJCQkweDA1CisjZGVmaW5lIEVWX0xFRAkJCTB4MTEKKyNkZWZpbmUgRVZfU05ECQkJMHgxMgorI2RlZmluZSBFVl9SRVAJCQkweDE0CisjZGVmaW5lIEVWX0ZGCQkJMHgxNQorI2RlZmluZSBFVl9QV1IJCQkweDE2CisjZGVmaW5lIEVWX0ZGX1NUQVRVUwkJMHgxNworI2RlZmluZSBFVl9NQVgJCQkweDFmCisjZGVmaW5lIEVWX0NOVAkJCShFVl9NQVgrMSkKKworLyoKKyAqIFN5bmNocm9uaXphdGlvbiBldmVudHMuCisgKi8KKworI2RlZmluZSBTWU5fUkVQT1JUCQkwCisjZGVmaW5lIFNZTl9DT05GSUcJCTEKKyNkZWZpbmUgU1lOX01UX1JFUE9SVAkJMgorI2RlZmluZSBTWU5fRFJPUFBFRAkJMworCisvKgorICogS2V5cyBhbmQgYnV0dG9ucworICoKKyAqIE1vc3Qgb2YgdGhlIGtleXMvYnV0dG9ucyBhcmUgbW9kZWxlZCBhZnRlciBVU0IgSFVUIDEuMTIKKyAqIChzZWUgaHR0cDovL3d3dy51c2Iub3JnL2RldmVsb3BlcnMvaGlkcGFnZSkuCisgKiBBYmJyZXZpYXRpb25zIGluIHRoZSBjb21tZW50czoKKyAqIEFDIC0gQXBwbGljYXRpb24gQ29udHJvbAorICogQUwgLSBBcHBsaWNhdGlvbiBMYXVuY2ggQnV0dG9uCisgKiBTQyAtIFN5c3RlbSBDb250cm9sCisgKi8KKworI2RlZmluZSBLRVlfUkVTRVJWRUQJCTAKKyNkZWZpbmUgS0VZX0VTQwkJCTEKKyNkZWZpbmUgS0VZXzEJCQkyCisjZGVmaW5lIEtFWV8yCQkJMworI2RlZmluZSBLRVlfMwkJCTQKKyNkZWZpbmUgS0VZXzQJCQk1CisjZGVmaW5lIEtFWV81CQkJNgorI2RlZmluZSBLRVlfNgkJCTcKKyNkZWZpbmUgS0VZXzcJCQk4CisjZGVmaW5lIEtFWV84CQkJOQorI2RlZmluZSBLRVlfOQkJCTEwCisjZGVmaW5lIEtFWV8wCQkJMTEKKyNkZWZpbmUgS0VZX01JTlVTCQkxMgorI2RlZmluZSBLRVlfRVFVQUwJCTEzCisjZGVmaW5lIEtFWV9CQUNLU1BBQ0UJCTE0CisjZGVmaW5lIEtFWV9UQUIJCQkxNQorI2RlZmluZSBLRVlfUQkJCTE2CisjZGVmaW5lIEtFWV9XCQkJMTcKKyNkZWZpbmUgS0VZX0UJCQkxOAorI2RlZmluZSBLRVlfUgkJCTE5CisjZGVmaW5lIEtFWV9UCQkJMjAKKyNkZWZpbmUgS0VZX1kJCQkyMQorI2RlZmluZSBLRVlfVQkJCTIyCisjZGVmaW5lIEtFWV9JCQkJMjMKKyNkZWZpbmUgS0VZX08JCQkyNAorI2RlZmluZSBLRVlfUAkJCTI1CisjZGVmaW5lIEtFWV9MRUZUQlJBQ0UJCTI2CisjZGVmaW5lIEtFWV9SSUdIVEJSQUNFCQkyNworI2RlZmluZSBLRVlfRU5URVIJCTI4CisjZGVmaW5lIEtFWV9MRUZUQ1RSTAkJMjkKKyNkZWZpbmUgS0VZX0EJCQkzMAorI2RlZmluZSBLRVlfUwkJCTMxCisjZGVmaW5lIEtFWV9ECQkJMzIKKyNkZWZpbmUgS0VZX0YJCQkzMworI2RlZmluZSBLRVlfRwkJCTM0CisjZGVmaW5lIEtFWV9ICQkJMzUKKyNkZWZpbmUgS0VZX0oJCQkzNgorI2RlZmluZSBLRVlfSwkJCTM3CisjZGVmaW5lIEtFWV9MCQkJMzgKKyNkZWZpbmUgS0VZX1NFTUlDT0xPTgkJMzkKKyNkZWZpbmUgS0VZX0FQT1NUUk9QSEUJCTQwCisjZGVmaW5lIEtFWV9HUkFWRQkJNDEKKyNkZWZpbmUgS0VZX0xFRlRTSElGVAkJNDIKKyNkZWZpbmUgS0VZX0JBQ0tTTEFTSAkJNDMKKyNkZWZpbmUgS0VZX1oJCQk0NAorI2RlZmluZSBLRVlfWAkJCTQ1CisjZGVmaW5lIEtFWV9DCQkJNDYKKyNkZWZpbmUgS0VZX1YJCQk0NworI2RlZmluZSBLRVlfQgkJCTQ4CisjZGVmaW5lIEtFWV9OCQkJNDkKKyNkZWZpbmUgS0VZX00JCQk1MAorI2RlZmluZSBLRVlfQ09NTUEJCTUxCisjZGVmaW5lIEtFWV9ET1QJCQk1MgorI2RlZmluZSBLRVlfU0xBU0gJCTUzCisjZGVmaW5lIEtFWV9SSUdIVFNISUZUCQk1NAorI2RlZmluZSBLRVlfS1BBU1RFUklTSwkJNTUKKyNkZWZpbmUgS0VZX0xFRlRBTFQJCTU2CisjZGVmaW5lIEtFWV9TUEFDRQkJNTcKKyNkZWZpbmUgS0VZX0NBUFNMT0NLCQk1OAorI2RlZmluZSBLRVlfRjEJCQk1OQorI2RlZmluZSBLRVlfRjIJCQk2MAorI2RlZmluZSBLRVlfRjMJCQk2MQorI2RlZmluZSBLRVlfRjQJCQk2MgorI2RlZmluZSBLRVlfRjUJCQk2MworI2RlZmluZSBLRVlfRjYJCQk2NAorI2RlZmluZSBLRVlfRjcJCQk2NQorI2RlZmluZSBLRVlfRjgJCQk2NgorI2RlZmluZSBLRVlfRjkJCQk2NworI2RlZmluZSBLRVlfRjEwCQkJNjgKKyNkZWZpbmUgS0VZX05VTUxPQ0sJCTY5CisjZGVmaW5lIEtFWV9TQ1JPTExMT0NLCQk3MAorI2RlZmluZSBLRVlfS1A3CQkJNzEKKyNkZWZpbmUgS0VZX0tQOAkJCTcyCisjZGVmaW5lIEtFWV9LUDkJCQk3MworI2RlZmluZSBLRVlfS1BNSU5VUwkJNzQKKyNkZWZpbmUgS0VZX0tQNAkJCTc1CisjZGVmaW5lIEtFWV9LUDUJCQk3NgorI2RlZmluZSBLRVlfS1A2CQkJNzcKKyNkZWZpbmUgS0VZX0tQUExVUwkJNzgKKyNkZWZpbmUgS0VZX0tQMQkJCTc5CisjZGVmaW5lIEtFWV9LUDIJCQk4MAorI2RlZmluZSBLRVlfS1AzCQkJODEKKyNkZWZpbmUgS0VZX0tQMAkJCTgyCisjZGVmaW5lIEtFWV9LUERPVAkJODMKKworI2RlZmluZSBLRVlfWkVOS0FLVUhBTktBS1UJODUKKyNkZWZpbmUgS0VZXzEwMk5ECQk4NgorI2RlZmluZSBLRVlfRjExCQkJODcKKyNkZWZpbmUgS0VZX0YxMgkJCTg4CisjZGVmaW5lIEtFWV9STwkJCTg5CisjZGVmaW5lIEtFWV9LQVRBS0FOQQkJOTAKKyNkZWZpbmUgS0VZX0hJUkFHQU5BCQk5MQorI2RlZmluZSBLRVlfSEVOS0FOCQk5MgorI2RlZmluZSBLRVlfS0FUQUtBTkFISVJBR0FOQQk5MworI2RlZmluZSBLRVlfTVVIRU5LQU4JCTk0CisjZGVmaW5lIEtFWV9LUEpQQ09NTUEJCTk1CisjZGVmaW5lIEtFWV9LUEVOVEVSCQk5NgorI2RlZmluZSBLRVlfUklHSFRDVFJMCQk5NworI2RlZmluZSBLRVlfS1BTTEFTSAkJOTgKKyNkZWZpbmUgS0VZX1NZU1JRCQk5OQorI2RlZmluZSBLRVlfUklHSFRBTFQJCTEwMAorI2RlZmluZSBLRVlfTElORUZFRUQJCTEwMQorI2RlZmluZSBLRVlfSE9NRQkJMTAyCisjZGVmaW5lIEtFWV9VUAkJCTEwMworI2RlZmluZSBLRVlfUEFHRVVQCQkxMDQKKyNkZWZpbmUgS0VZX0xFRlQJCTEwNQorI2RlZmluZSBLRVlfUklHSFQJCTEwNgorI2RlZmluZSBLRVlfRU5ECQkJMTA3CisjZGVmaW5lIEtFWV9ET1dOCQkxMDgKKyNkZWZpbmUgS0VZX1BBR0VET1dOCQkxMDkKKyNkZWZpbmUgS0VZX0lOU0VSVAkJMTEwCisjZGVmaW5lIEtFWV9ERUxFVEUJCTExMQorI2RlZmluZSBLRVlfTUFDUk8JCTExMgorI2RlZmluZSBLRVlfTVVURQkJMTEzCisjZGVmaW5lIEtFWV9WT0xVTUVET1dOCQkxMTQKKyNkZWZpbmUgS0VZX1ZPTFVNRVVQCQkxMTUKKyNkZWZpbmUgS0VZX1BPV0VSCQkxMTYJLyogU0MgU3lzdGVtIFBvd2VyIERvd24gKi8KKyNkZWZpbmUgS0VZX0tQRVFVQUwJCTExNworI2RlZmluZSBLRVlfS1BQTFVTTUlOVVMJCTExOAorI2RlZmluZSBLRVlfUEFVU0UJCTExOQorI2RlZmluZSBLRVlfU0NBTEUJCTEyMAkvKiBBTCBDb21waXogU2NhbGUgKEV4cG9zZSkgKi8KKworI2RlZmluZSBLRVlfS1BDT01NQQkJMTIxCisjZGVmaW5lIEtFWV9IQU5HRVVMCQkxMjIKKyNkZWZpbmUgS0VZX0hBTkdVRUwJCUtFWV9IQU5HRVVMCisjZGVmaW5lIEtFWV9IQU5KQQkJMTIzCisjZGVmaW5lIEtFWV9ZRU4JCQkxMjQKKyNkZWZpbmUgS0VZX0xFRlRNRVRBCQkxMjUKKyNkZWZpbmUgS0VZX1JJR0hUTUVUQQkJMTI2CisjZGVmaW5lIEtFWV9DT01QT1NFCQkxMjcKKworI2RlZmluZSBLRVlfU1RPUAkJMTI4CS8qIEFDIFN0b3AgKi8KKyNkZWZpbmUgS0VZX0FHQUlOCQkxMjkKKyNkZWZpbmUgS0VZX1BST1BTCQkxMzAJLyogQUMgUHJvcGVydGllcyAqLworI2RlZmluZSBLRVlfVU5ETwkJMTMxCS8qIEFDIFVuZG8gKi8KKyNkZWZpbmUgS0VZX0ZST05UCQkxMzIKKyNkZWZpbmUgS0VZX0NPUFkJCTEzMwkvKiBBQyBDb3B5ICovCisjZGVmaW5lIEtFWV9PUEVOCQkxMzQJLyogQUMgT3BlbiAqLworI2RlZmluZSBLRVlfUEFTVEUJCTEzNQkvKiBBQyBQYXN0ZSAqLworI2RlZmluZSBLRVlfRklORAkJMTM2CS8qIEFDIFNlYXJjaCAqLworI2RlZmluZSBLRVlfQ1VUCQkJMTM3CS8qIEFDIEN1dCAqLworI2RlZmluZSBLRVlfSEVMUAkJMTM4CS8qIEFMIEludGVncmF0ZWQgSGVscCBDZW50ZXIgKi8KKyNkZWZpbmUgS0VZX01FTlUJCTEzOQkvKiBNZW51IChzaG93IG1lbnUpICovCisjZGVmaW5lIEtFWV9DQUxDCQkxNDAJLyogQUwgQ2FsY3VsYXRvciAqLworI2RlZmluZSBLRVlfU0VUVVAJCTE0MQorI2RlZmluZSBLRVlfU0xFRVAJCTE0MgkvKiBTQyBTeXN0ZW0gU2xlZXAgKi8KKyNkZWZpbmUgS0VZX1dBS0VVUAkJMTQzCS8qIFN5c3RlbSBXYWtlIFVwICovCisjZGVmaW5lIEtFWV9GSUxFCQkxNDQJLyogQUwgTG9jYWwgTWFjaGluZSBCcm93c2VyICovCisjZGVmaW5lIEtFWV9TRU5ERklMRQkJMTQ1CisjZGVmaW5lIEtFWV9ERUxFVEVGSUxFCQkxNDYKKyNkZWZpbmUgS0VZX1hGRVIJCTE0NworI2RlZmluZSBLRVlfUFJPRzEJCTE0OAorI2RlZmluZSBLRVlfUFJPRzIJCTE0OQorI2RlZmluZSBLRVlfV1dXCQkJMTUwCS8qIEFMIEludGVybmV0IEJyb3dzZXIgKi8KKyNkZWZpbmUgS0VZX01TRE9TCQkxNTEKKyNkZWZpbmUgS0VZX0NPRkZFRQkJMTUyCS8qIEFMIFRlcm1pbmFsIExvY2svU2NyZWVuc2F2ZXIgKi8KKyNkZWZpbmUgS0VZX1NDUkVFTkxPQ0sJCUtFWV9DT0ZGRUUKKyNkZWZpbmUgS0VZX0RJUkVDVElPTgkJMTUzCisjZGVmaW5lIEtFWV9DWUNMRVdJTkRPV1MJMTU0CisjZGVmaW5lIEtFWV9NQUlMCQkxNTUKKyNkZWZpbmUgS0VZX0JPT0tNQVJLUwkJMTU2CS8qIEFDIEJvb2ttYXJrcyAqLworI2RlZmluZSBLRVlfQ09NUFVURVIJCTE1NworI2RlZmluZSBLRVlfQkFDSwkJMTU4CS8qIEFDIEJhY2sgKi8KKyNkZWZpbmUgS0VZX0ZPUldBUkQJCTE1OQkvKiBBQyBGb3J3YXJkICovCisjZGVmaW5lIEtFWV9DTE9TRUNECQkxNjAKKyNkZWZpbmUgS0VZX0VKRUNUQ0QJCTE2MQorI2RlZmluZSBLRVlfRUpFQ1RDTE9TRUNECTE2MgorI2RlZmluZSBLRVlfTkVYVFNPTkcJCTE2MworI2RlZmluZSBLRVlfUExBWVBBVVNFCQkxNjQKKyNkZWZpbmUgS0VZX1BSRVZJT1VTU09ORwkxNjUKKyNkZWZpbmUgS0VZX1NUT1BDRAkJMTY2CisjZGVmaW5lIEtFWV9SRUNPUkQJCTE2NworI2RlZmluZSBLRVlfUkVXSU5ECQkxNjgKKyNkZWZpbmUgS0VZX1BIT05FCQkxNjkJLyogTWVkaWEgU2VsZWN0IFRlbGVwaG9uZSAqLworI2RlZmluZSBLRVlfSVNPCQkJMTcwCisjZGVmaW5lIEtFWV9DT05GSUcJCTE3MQkvKiBBTCBDb25zdW1lciBDb250cm9sIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgS0VZX0hPTUVQQUdFCQkxNzIJLyogQUMgSG9tZSAqLworI2RlZmluZSBLRVlfUkVGUkVTSAkJMTczCS8qIEFDIFJlZnJlc2ggKi8KKyNkZWZpbmUgS0VZX0VYSVQJCTE3NAkvKiBBQyBFeGl0ICovCisjZGVmaW5lIEtFWV9NT1ZFCQkxNzUKKyNkZWZpbmUgS0VZX0VESVQJCTE3NgorI2RlZmluZSBLRVlfU0NST0xMVVAJCTE3NworI2RlZmluZSBLRVlfU0NST0xMRE9XTgkJMTc4CisjZGVmaW5lIEtFWV9LUExFRlRQQVJFTgkJMTc5CisjZGVmaW5lIEtFWV9LUFJJR0hUUEFSRU4JMTgwCisjZGVmaW5lIEtFWV9ORVcJCQkxODEJLyogQUMgTmV3ICovCisjZGVmaW5lIEtFWV9SRURPCQkxODIJLyogQUMgUmVkby9SZXBlYXQgKi8KKworI2RlZmluZSBLRVlfRjEzCQkJMTgzCisjZGVmaW5lIEtFWV9GMTQJCQkxODQKKyNkZWZpbmUgS0VZX0YxNQkJCTE4NQorI2RlZmluZSBLRVlfRjE2CQkJMTg2CisjZGVmaW5lIEtFWV9GMTcJCQkxODcKKyNkZWZpbmUgS0VZX0YxOAkJCTE4OAorI2RlZmluZSBLRVlfRjE5CQkJMTg5CisjZGVmaW5lIEtFWV9GMjAJCQkxOTAKKyNkZWZpbmUgS0VZX0YyMQkJCTE5MQorI2RlZmluZSBLRVlfRjIyCQkJMTkyCisjZGVmaW5lIEtFWV9GMjMJCQkxOTMKKyNkZWZpbmUgS0VZX0YyNAkJCTE5NAorCisjZGVmaW5lIEtFWV9QTEFZQ0QJCTIwMAorI2RlZmluZSBLRVlfUEFVU0VDRAkJMjAxCisjZGVmaW5lIEtFWV9QUk9HMwkJMjAyCisjZGVmaW5lIEtFWV9QUk9HNAkJMjAzCisjZGVmaW5lIEtFWV9EQVNIQk9BUkQJCTIwNAkvKiBBTCBEYXNoYm9hcmQgKi8KKyNkZWZpbmUgS0VZX1NVU1BFTkQJCTIwNQorI2RlZmluZSBLRVlfQ0xPU0UJCTIwNgkvKiBBQyBDbG9zZSAqLworI2RlZmluZSBLRVlfUExBWQkJMjA3CisjZGVmaW5lIEtFWV9GQVNURk9SV0FSRAkJMjA4CisjZGVmaW5lIEtFWV9CQVNTQk9PU1QJCTIwOQorI2RlZmluZSBLRVlfUFJJTlQJCTIxMAkvKiBBQyBQcmludCAqLworI2RlZmluZSBLRVlfSFAJCQkyMTEKKyNkZWZpbmUgS0VZX0NBTUVSQQkJMjEyCisjZGVmaW5lIEtFWV9TT1VORAkJMjEzCisjZGVmaW5lIEtFWV9RVUVTVElPTgkJMjE0CisjZGVmaW5lIEtFWV9FTUFJTAkJMjE1CisjZGVmaW5lIEtFWV9DSEFUCQkyMTYKKyNkZWZpbmUgS0VZX1NFQVJDSAkJMjE3CisjZGVmaW5lIEtFWV9DT05ORUNUCQkyMTgKKyNkZWZpbmUgS0VZX0ZJTkFOQ0UJCTIxOQkvKiBBTCBDaGVja2Jvb2svRmluYW5jZSAqLworI2RlZmluZSBLRVlfU1BPUlQJCTIyMAorI2RlZmluZSBLRVlfU0hPUAkJMjIxCisjZGVmaW5lIEtFWV9BTFRFUkFTRQkJMjIyCisjZGVmaW5lIEtFWV9DQU5DRUwJCTIyMwkvKiBBQyBDYW5jZWwgKi8KKyNkZWZpbmUgS0VZX0JSSUdIVE5FU1NET1dOCTIyNAorI2RlZmluZSBLRVlfQlJJR0hUTkVTU1VQCTIyNQorI2RlZmluZSBLRVlfTUVESUEJCTIyNgorCisjZGVmaW5lIEtFWV9TV0lUQ0hWSURFT01PREUJMjI3CS8qIEN5Y2xlIGJldHdlZW4gYXZhaWxhYmxlIHZpZGVvCisJCQkJCSAgIG91dHB1dHMgKE1vbml0b3IvTENEL1RWLW91dC9ldGMpICovCisjZGVmaW5lIEtFWV9LQkRJTExVTVRPR0dMRQkyMjgKKyNkZWZpbmUgS0VZX0tCRElMTFVNRE9XTgkyMjkKKyNkZWZpbmUgS0VZX0tCRElMTFVNVVAJCTIzMAorCisjZGVmaW5lIEtFWV9TRU5ECQkyMzEJLyogQUMgU2VuZCAqLworI2RlZmluZSBLRVlfUkVQTFkJCTIzMgkvKiBBQyBSZXBseSAqLworI2RlZmluZSBLRVlfRk9SV0FSRE1BSUwJCTIzMwkvKiBBQyBGb3J3YXJkIE1zZyAqLworI2RlZmluZSBLRVlfU0FWRQkJMjM0CS8qIEFDIFNhdmUgKi8KKyNkZWZpbmUgS0VZX0RPQ1VNRU5UUwkJMjM1CisKKyNkZWZpbmUgS0VZX0JBVFRFUlkJCTIzNgorCisjZGVmaW5lIEtFWV9CTFVFVE9PVEgJCTIzNworI2RlZmluZSBLRVlfV0xBTgkJMjM4CisjZGVmaW5lIEtFWV9VV0IJCQkyMzkKKworI2RlZmluZSBLRVlfVU5LTk9XTgkJMjQwCisKKyNkZWZpbmUgS0VZX1ZJREVPX05FWFQJCTI0MQkvKiBkcml2ZSBuZXh0IHZpZGVvIHNvdXJjZSAqLworI2RlZmluZSBLRVlfVklERU9fUFJFVgkJMjQyCS8qIGRyaXZlIHByZXZpb3VzIHZpZGVvIHNvdXJjZSAqLworI2RlZmluZSBLRVlfQlJJR0hUTkVTU19DWUNMRQkyNDMJLyogYnJpZ2h0bmVzcyB1cCwgYWZ0ZXIgbWF4IGlzIG1pbiAqLworI2RlZmluZSBLRVlfQlJJR0hUTkVTU19aRVJPCTI0NAkvKiBicmlnaHRuZXNzIG9mZiwgdXNlIGFtYmllbnQgKi8KKyNkZWZpbmUgS0VZX0RJU1BMQVlfT0ZGCQkyNDUJLyogZGlzcGxheSBkZXZpY2UgdG8gb2ZmIHN0YXRlICovCisKKyNkZWZpbmUgS0VZX1dJTUFYCQkyNDYKKyNkZWZpbmUgS0VZX1JGS0lMTAkJMjQ3CS8qIEtleSB0aGF0IGNvbnRyb2xzIGFsbCByYWRpb3MgKi8KKworI2RlZmluZSBLRVlfTUlDTVVURQkJMjQ4CS8qIE11dGUgLyB1bm11dGUgdGhlIG1pY3JvcGhvbmUgKi8KKworLyogQ29kZSAyNTUgaXMgcmVzZXJ2ZWQgZm9yIHNwZWNpYWwgbmVlZHMgb2YgQVQga2V5Ym9hcmQgZHJpdmVyICovCisKKyNkZWZpbmUgQlROX01JU0MJCTB4MTAwCisjZGVmaW5lIEJUTl8wCQkJMHgxMDAKKyNkZWZpbmUgQlROXzEJCQkweDEwMQorI2RlZmluZSBCVE5fMgkJCTB4MTAyCisjZGVmaW5lIEJUTl8zCQkJMHgxMDMKKyNkZWZpbmUgQlROXzQJCQkweDEwNAorI2RlZmluZSBCVE5fNQkJCTB4MTA1CisjZGVmaW5lIEJUTl82CQkJMHgxMDYKKyNkZWZpbmUgQlROXzcJCQkweDEwNworI2RlZmluZSBCVE5fOAkJCTB4MTA4CisjZGVmaW5lIEJUTl85CQkJMHgxMDkKKworI2RlZmluZSBCVE5fTU9VU0UJCTB4MTEwCisjZGVmaW5lIEJUTl9MRUZUCQkweDExMAorI2RlZmluZSBCVE5fUklHSFQJCTB4MTExCisjZGVmaW5lIEJUTl9NSURETEUJCTB4MTEyCisjZGVmaW5lIEJUTl9TSURFCQkweDExMworI2RlZmluZSBCVE5fRVhUUkEJCTB4MTE0CisjZGVmaW5lIEJUTl9GT1JXQVJECQkweDExNQorI2RlZmluZSBCVE5fQkFDSwkJMHgxMTYKKyNkZWZpbmUgQlROX1RBU0sJCTB4MTE3CisKKyNkZWZpbmUgQlROX0pPWVNUSUNLCQkweDEyMAorI2RlZmluZSBCVE5fVFJJR0dFUgkJMHgxMjAKKyNkZWZpbmUgQlROX1RIVU1CCQkweDEyMQorI2RlZmluZSBCVE5fVEhVTUIyCQkweDEyMgorI2RlZmluZSBCVE5fVE9QCQkJMHgxMjMKKyNkZWZpbmUgQlROX1RPUDIJCTB4MTI0CisjZGVmaW5lIEJUTl9QSU5LSUUJCTB4MTI1CisjZGVmaW5lIEJUTl9CQVNFCQkweDEyNgorI2RlZmluZSBCVE5fQkFTRTIJCTB4MTI3CisjZGVmaW5lIEJUTl9CQVNFMwkJMHgxMjgKKyNkZWZpbmUgQlROX0JBU0U0CQkweDEyOQorI2RlZmluZSBCVE5fQkFTRTUJCTB4MTJhCisjZGVmaW5lIEJUTl9CQVNFNgkJMHgxMmIKKyNkZWZpbmUgQlROX0RFQUQJCTB4MTJmCisKKyNkZWZpbmUgQlROX0dBTUVQQUQJCTB4MTMwCisjZGVmaW5lIEJUTl9BCQkJMHgxMzAKKyNkZWZpbmUgQlROX0IJCQkweDEzMQorI2RlZmluZSBCVE5fQwkJCTB4MTMyCisjZGVmaW5lIEJUTl9YCQkJMHgxMzMKKyNkZWZpbmUgQlROX1kJCQkweDEzNAorI2RlZmluZSBCVE5fWgkJCTB4MTM1CisjZGVmaW5lIEJUTl9UTAkJCTB4MTM2CisjZGVmaW5lIEJUTl9UUgkJCTB4MTM3CisjZGVmaW5lIEJUTl9UTDIJCQkweDEzOAorI2RlZmluZSBCVE5fVFIyCQkJMHgxMzkKKyNkZWZpbmUgQlROX1NFTEVDVAkJMHgxM2EKKyNkZWZpbmUgQlROX1NUQVJUCQkweDEzYgorI2RlZmluZSBCVE5fTU9ERQkJMHgxM2MKKyNkZWZpbmUgQlROX1RIVU1CTAkJMHgxM2QKKyNkZWZpbmUgQlROX1RIVU1CUgkJMHgxM2UKKworI2RlZmluZSBCVE5fRElHSQkJMHgxNDAKKyNkZWZpbmUgQlROX1RPT0xfUEVOCQkweDE0MAorI2RlZmluZSBCVE5fVE9PTF9SVUJCRVIJCTB4MTQxCisjZGVmaW5lIEJUTl9UT09MX0JSVVNICQkweDE0MgorI2RlZmluZSBCVE5fVE9PTF9QRU5DSUwJCTB4MTQzCisjZGVmaW5lIEJUTl9UT09MX0FJUkJSVVNICTB4MTQ0CisjZGVmaW5lIEJUTl9UT09MX0ZJTkdFUgkJMHgxNDUKKyNkZWZpbmUgQlROX1RPT0xfTU9VU0UJCTB4MTQ2CisjZGVmaW5lIEJUTl9UT09MX0xFTlMJCTB4MTQ3CisjZGVmaW5lIEJUTl9UT09MX1FVSU5UVEFQCTB4MTQ4CS8qIEZpdmUgZmluZ2VycyBvbiB0cmFja3BhZCAqLworI2RlZmluZSBCVE5fVE9VQ0gJCTB4MTRhCisjZGVmaW5lIEJUTl9TVFlMVVMJCTB4MTRiCisjZGVmaW5lIEJUTl9TVFlMVVMyCQkweDE0YworI2RlZmluZSBCVE5fVE9PTF9ET1VCTEVUQVAJMHgxNGQKKyNkZWZpbmUgQlROX1RPT0xfVFJJUExFVEFQCTB4MTRlCisjZGVmaW5lIEJUTl9UT09MX1FVQURUQVAJMHgxNGYJLyogRm91ciBmaW5nZXJzIG9uIHRyYWNrcGFkICovCisKKyNkZWZpbmUgQlROX1dIRUVMCQkweDE1MAorI2RlZmluZSBCVE5fR0VBUl9ET1dOCQkweDE1MAorI2RlZmluZSBCVE5fR0VBUl9VUAkJMHgxNTEKKworI2RlZmluZSBLRVlfT0sJCQkweDE2MAorI2RlZmluZSBLRVlfU0VMRUNUCQkweDE2MQorI2RlZmluZSBLRVlfR09UTwkJMHgxNjIKKyNkZWZpbmUgS0VZX0NMRUFSCQkweDE2MworI2RlZmluZSBLRVlfUE9XRVIyCQkweDE2NAorI2RlZmluZSBLRVlfT1BUSU9OCQkweDE2NQorI2RlZmluZSBLRVlfSU5GTwkJMHgxNjYJLyogQUwgT0VNIEZlYXR1cmVzL1RpcHMvVHV0b3JpYWwgKi8KKyNkZWZpbmUgS0VZX1RJTUUJCTB4MTY3CisjZGVmaW5lIEtFWV9WRU5ET1IJCTB4MTY4CisjZGVmaW5lIEtFWV9BUkNISVZFCQkweDE2OQorI2RlZmluZSBLRVlfUFJPR1JBTQkJMHgxNmEJLyogTWVkaWEgU2VsZWN0IFByb2dyYW0gR3VpZGUgKi8KKyNkZWZpbmUgS0VZX0NIQU5ORUwJCTB4MTZiCisjZGVmaW5lIEtFWV9GQVZPUklURVMJCTB4MTZjCisjZGVmaW5lIEtFWV9FUEcJCQkweDE2ZAorI2RlZmluZSBLRVlfUFZSCQkJMHgxNmUJLyogTWVkaWEgU2VsZWN0IEhvbWUgKi8KKyNkZWZpbmUgS0VZX01IUAkJCTB4MTZmCisjZGVmaW5lIEtFWV9MQU5HVUFHRQkJMHgxNzAKKyNkZWZpbmUgS0VZX1RJVExFCQkweDE3MQorI2RlZmluZSBLRVlfU1VCVElUTEUJCTB4MTcyCisjZGVmaW5lIEtFWV9BTkdMRQkJMHgxNzMKKyNkZWZpbmUgS0VZX1pPT00JCTB4MTc0CisjZGVmaW5lIEtFWV9NT0RFCQkweDE3NQorI2RlZmluZSBLRVlfS0VZQk9BUkQJCTB4MTc2CisjZGVmaW5lIEtFWV9TQ1JFRU4JCTB4MTc3CisjZGVmaW5lIEtFWV9QQwkJCTB4MTc4CS8qIE1lZGlhIFNlbGVjdCBDb21wdXRlciAqLworI2RlZmluZSBLRVlfVFYJCQkweDE3OQkvKiBNZWRpYSBTZWxlY3QgVFYgKi8KKyNkZWZpbmUgS0VZX1RWMgkJCTB4MTdhCS8qIE1lZGlhIFNlbGVjdCBDYWJsZSAqLworI2RlZmluZSBLRVlfVkNSCQkJMHgxN2IJLyogTWVkaWEgU2VsZWN0IFZDUiAqLworI2RlZmluZSBLRVlfVkNSMgkJMHgxN2MJLyogVkNSIFBsdXMgKi8KKyNkZWZpbmUgS0VZX1NBVAkJCTB4MTdkCS8qIE1lZGlhIFNlbGVjdCBTYXRlbGxpdGUgKi8KKyNkZWZpbmUgS0VZX1NBVDIJCTB4MTdlCisjZGVmaW5lIEtFWV9DRAkJCTB4MTdmCS8qIE1lZGlhIFNlbGVjdCBDRCAqLworI2RlZmluZSBLRVlfVEFQRQkJMHgxODAJLyogTWVkaWEgU2VsZWN0IFRhcGUgKi8KKyNkZWZpbmUgS0VZX1JBRElPCQkweDE4MQorI2RlZmluZSBLRVlfVFVORVIJCTB4MTgyCS8qIE1lZGlhIFNlbGVjdCBUdW5lciAqLworI2RlZmluZSBLRVlfUExBWUVSCQkweDE4MworI2RlZmluZSBLRVlfVEVYVAkJMHgxODQKKyNkZWZpbmUgS0VZX0RWRAkJCTB4MTg1CS8qIE1lZGlhIFNlbGVjdCBEVkQgKi8KKyNkZWZpbmUgS0VZX0FVWAkJCTB4MTg2CisjZGVmaW5lIEtFWV9NUDMJCQkweDE4NworI2RlZmluZSBLRVlfQVVESU8JCTB4MTg4CS8qIEFMIEF1ZGlvIEJyb3dzZXIgKi8KKyNkZWZpbmUgS0VZX1ZJREVPCQkweDE4OQkvKiBBTCBNb3ZpZSBCcm93c2VyICovCisjZGVmaW5lIEtFWV9ESVJFQ1RPUlkJCTB4MThhCisjZGVmaW5lIEtFWV9MSVNUCQkweDE4YgorI2RlZmluZSBLRVlfTUVNTwkJMHgxOGMJLyogTWVkaWEgU2VsZWN0IE1lc3NhZ2VzICovCisjZGVmaW5lIEtFWV9DQUxFTkRBUgkJMHgxOGQKKyNkZWZpbmUgS0VZX1JFRAkJCTB4MThlCisjZGVmaW5lIEtFWV9HUkVFTgkJMHgxOGYKKyNkZWZpbmUgS0VZX1lFTExPVwkJMHgxOTAKKyNkZWZpbmUgS0VZX0JMVUUJCTB4MTkxCisjZGVmaW5lIEtFWV9DSEFOTkVMVVAJCTB4MTkyCS8qIENoYW5uZWwgSW5jcmVtZW50ICovCisjZGVmaW5lIEtFWV9DSEFOTkVMRE9XTgkJMHgxOTMJLyogQ2hhbm5lbCBEZWNyZW1lbnQgKi8KKyNkZWZpbmUgS0VZX0ZJUlNUCQkweDE5NAorI2RlZmluZSBLRVlfTEFTVAkJMHgxOTUJLyogUmVjYWxsIExhc3QgKi8KKyNkZWZpbmUgS0VZX0FCCQkJMHgxOTYKKyNkZWZpbmUgS0VZX05FWFQJCTB4MTk3CisjZGVmaW5lIEtFWV9SRVNUQVJUCQkweDE5OAorI2RlZmluZSBLRVlfU0xPVwkJMHgxOTkKKyNkZWZpbmUgS0VZX1NIVUZGTEUJCTB4MTlhCisjZGVmaW5lIEtFWV9CUkVBSwkJMHgxOWIKKyNkZWZpbmUgS0VZX1BSRVZJT1VTCQkweDE5YworI2RlZmluZSBLRVlfRElHSVRTCQkweDE5ZAorI2RlZmluZSBLRVlfVEVFTgkJMHgxOWUKKyNkZWZpbmUgS0VZX1RXRU4JCTB4MTlmCisjZGVmaW5lIEtFWV9WSURFT1BIT05FCQkweDFhMAkvKiBNZWRpYSBTZWxlY3QgVmlkZW8gUGhvbmUgKi8KKyNkZWZpbmUgS0VZX0dBTUVTCQkweDFhMQkvKiBNZWRpYSBTZWxlY3QgR2FtZXMgKi8KKyNkZWZpbmUgS0VZX1pPT01JTgkJMHgxYTIJLyogQUMgWm9vbSBJbiAqLworI2RlZmluZSBLRVlfWk9PTU9VVAkJMHgxYTMJLyogQUMgWm9vbSBPdXQgKi8KKyNkZWZpbmUgS0VZX1pPT01SRVNFVAkJMHgxYTQJLyogQUMgWm9vbSAqLworI2RlZmluZSBLRVlfV09SRFBST0NFU1NPUgkweDFhNQkvKiBBTCBXb3JkIFByb2Nlc3NvciAqLworI2RlZmluZSBLRVlfRURJVE9SCQkweDFhNgkvKiBBTCBUZXh0IEVkaXRvciAqLworI2RlZmluZSBLRVlfU1BSRUFEU0hFRVQJCTB4MWE3CS8qIEFMIFNwcmVhZHNoZWV0ICovCisjZGVmaW5lIEtFWV9HUkFQSElDU0VESVRPUgkweDFhOAkvKiBBTCBHcmFwaGljcyBFZGl0b3IgKi8KKyNkZWZpbmUgS0VZX1BSRVNFTlRBVElPTgkweDFhOQkvKiBBTCBQcmVzZW50YXRpb24gQXBwICovCisjZGVmaW5lIEtFWV9EQVRBQkFTRQkJMHgxYWEJLyogQUwgRGF0YWJhc2UgQXBwICovCisjZGVmaW5lIEtFWV9ORVdTCQkweDFhYgkvKiBBTCBOZXdzcmVhZGVyICovCisjZGVmaW5lIEtFWV9WT0lDRU1BSUwJCTB4MWFjCS8qIEFMIFZvaWNlbWFpbCAqLworI2RlZmluZSBLRVlfQUREUkVTU0JPT0sJCTB4MWFkCS8qIEFMIENvbnRhY3RzL0FkZHJlc3MgQm9vayAqLworI2RlZmluZSBLRVlfTUVTU0VOR0VSCQkweDFhZQkvKiBBTCBJbnN0YW50IE1lc3NhZ2luZyAqLworI2RlZmluZSBLRVlfRElTUExBWVRPR0dMRQkweDFhZgkvKiBUdXJuIGRpc3BsYXkgKExDRCkgb24gYW5kIG9mZiAqLworI2RlZmluZSBLRVlfU1BFTExDSEVDSwkJMHgxYjAgICAvKiBBTCBTcGVsbCBDaGVjayAqLworI2RlZmluZSBLRVlfTE9HT0ZGCQkweDFiMSAgIC8qIEFMIExvZ29mZiAqLworCisjZGVmaW5lIEtFWV9ET0xMQVIJCTB4MWIyCisjZGVmaW5lIEtFWV9FVVJPCQkweDFiMworCisjZGVmaW5lIEtFWV9GUkFNRUJBQ0sJCTB4MWI0CS8qIENvbnN1bWVyIC0gdHJhbnNwb3J0IGNvbnRyb2xzICovCisjZGVmaW5lIEtFWV9GUkFNRUZPUldBUkQJMHgxYjUKKyNkZWZpbmUgS0VZX0NPTlRFWFRfTUVOVQkweDFiNgkvKiBHZW5EZXNjIC0gc3lzdGVtIGNvbnRleHQgbWVudSAqLworI2RlZmluZSBLRVlfTUVESUFfUkVQRUFUCTB4MWI3CS8qIENvbnN1bWVyIC0gdHJhbnNwb3J0IGNvbnRyb2wgKi8KKyNkZWZpbmUgS0VZXzEwQ0hBTk5FTFNVUAkweDFiOAkvKiAxMCBjaGFubmVscyB1cCAoMTArKSAqLworI2RlZmluZSBLRVlfMTBDSEFOTkVMU0RPV04JMHgxYjkJLyogMTAgY2hhbm5lbHMgZG93biAoMTAtKSAqLworI2RlZmluZSBLRVlfSU1BR0VTCQkweDFiYQkvKiBBTCBJbWFnZSBCcm93c2VyICovCisKKyNkZWZpbmUgS0VZX0RFTF9FT0wJCTB4MWMwCisjZGVmaW5lIEtFWV9ERUxfRU9TCQkweDFjMQorI2RlZmluZSBLRVlfSU5TX0xJTkUJCTB4MWMyCisjZGVmaW5lIEtFWV9ERUxfTElORQkJMHgxYzMKKworI2RlZmluZSBLRVlfRk4JCQkweDFkMAorI2RlZmluZSBLRVlfRk5fRVNDCQkweDFkMQorI2RlZmluZSBLRVlfRk5fRjEJCTB4MWQyCisjZGVmaW5lIEtFWV9GTl9GMgkJMHgxZDMKKyNkZWZpbmUgS0VZX0ZOX0YzCQkweDFkNAorI2RlZmluZSBLRVlfRk5fRjQJCTB4MWQ1CisjZGVmaW5lIEtFWV9GTl9GNQkJMHgxZDYKKyNkZWZpbmUgS0VZX0ZOX0Y2CQkweDFkNworI2RlZmluZSBLRVlfRk5fRjcJCTB4MWQ4CisjZGVmaW5lIEtFWV9GTl9GOAkJMHgxZDkKKyNkZWZpbmUgS0VZX0ZOX0Y5CQkweDFkYQorI2RlZmluZSBLRVlfRk5fRjEwCQkweDFkYgorI2RlZmluZSBLRVlfRk5fRjExCQkweDFkYworI2RlZmluZSBLRVlfRk5fRjEyCQkweDFkZAorI2RlZmluZSBLRVlfRk5fMQkJMHgxZGUKKyNkZWZpbmUgS0VZX0ZOXzIJCTB4MWRmCisjZGVmaW5lIEtFWV9GTl9ECQkweDFlMAorI2RlZmluZSBLRVlfRk5fRQkJMHgxZTEKKyNkZWZpbmUgS0VZX0ZOX0YJCTB4MWUyCisjZGVmaW5lIEtFWV9GTl9TCQkweDFlMworI2RlZmluZSBLRVlfRk5fQgkJMHgxZTQKKworI2RlZmluZSBLRVlfQlJMX0RPVDEJCTB4MWYxCisjZGVmaW5lIEtFWV9CUkxfRE9UMgkJMHgxZjIKKyNkZWZpbmUgS0VZX0JSTF9ET1QzCQkweDFmMworI2RlZmluZSBLRVlfQlJMX0RPVDQJCTB4MWY0CisjZGVmaW5lIEtFWV9CUkxfRE9UNQkJMHgxZjUKKyNkZWZpbmUgS0VZX0JSTF9ET1Q2CQkweDFmNgorI2RlZmluZSBLRVlfQlJMX0RPVDcJCTB4MWY3CisjZGVmaW5lIEtFWV9CUkxfRE9UOAkJMHgxZjgKKyNkZWZpbmUgS0VZX0JSTF9ET1Q5CQkweDFmOQorI2RlZmluZSBLRVlfQlJMX0RPVDEwCQkweDFmYQorCisjZGVmaW5lIEtFWV9OVU1FUklDXzAJCTB4MjAwCS8qIHVzZWQgYnkgcGhvbmVzLCByZW1vdGUgY29udHJvbHMsICovCisjZGVmaW5lIEtFWV9OVU1FUklDXzEJCTB4MjAxCS8qIGFuZCBvdGhlciBrZXlwYWRzICovCisjZGVmaW5lIEtFWV9OVU1FUklDXzIJCTB4MjAyCisjZGVmaW5lIEtFWV9OVU1FUklDXzMJCTB4MjAzCisjZGVmaW5lIEtFWV9OVU1FUklDXzQJCTB4MjA0CisjZGVmaW5lIEtFWV9OVU1FUklDXzUJCTB4MjA1CisjZGVmaW5lIEtFWV9OVU1FUklDXzYJCTB4MjA2CisjZGVmaW5lIEtFWV9OVU1FUklDXzcJCTB4MjA3CisjZGVmaW5lIEtFWV9OVU1FUklDXzgJCTB4MjA4CisjZGVmaW5lIEtFWV9OVU1FUklDXzkJCTB4MjA5CisjZGVmaW5lIEtFWV9OVU1FUklDX1NUQVIJMHgyMGEKKyNkZWZpbmUgS0VZX05VTUVSSUNfUE9VTkQJMHgyMGIKKworI2RlZmluZSBLRVlfQ0FNRVJBX0ZPQ1VTCTB4MjEwCisjZGVmaW5lIEtFWV9XUFNfQlVUVE9OCQkweDIxMQkvKiBXaUZpIFByb3RlY3RlZCBTZXR1cCBrZXkgKi8KKworI2RlZmluZSBLRVlfVE9VQ0hQQURfVE9HR0xFCTB4MjEyCS8qIFJlcXVlc3Qgc3dpdGNoIHRvdWNocGFkIG9uIG9yIG9mZiAqLworI2RlZmluZSBLRVlfVE9VQ0hQQURfT04JCTB4MjEzCisjZGVmaW5lIEtFWV9UT1VDSFBBRF9PRkYJMHgyMTQKKworI2RlZmluZSBLRVlfQ0FNRVJBX1pPT01JTgkweDIxNQorI2RlZmluZSBLRVlfQ0FNRVJBX1pPT01PVVQJMHgyMTYKKyNkZWZpbmUgS0VZX0NBTUVSQV9VUAkJMHgyMTcKKyNkZWZpbmUgS0VZX0NBTUVSQV9ET1dOCQkweDIxOAorI2RlZmluZSBLRVlfQ0FNRVJBX0xFRlQJCTB4MjE5CisjZGVmaW5lIEtFWV9DQU1FUkFfUklHSFQJMHgyMWEKKworI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWQkJMHgyYzAKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkxCQkweDJjMAorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTIJCTB4MmMxCisjZGVmaW5lIEJUTl9UUklHR0VSX0hBUFBZMwkJMHgyYzIKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFk0CQkweDJjMworI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTUJCTB4MmM0CisjZGVmaW5lIEJUTl9UUklHR0VSX0hBUFBZNgkJMHgyYzUKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFk3CQkweDJjNgorI2RlZmluZSBCVE5fVFJJR0dFUl9IQVBQWTgJCTB4MmM3CisjZGVmaW5lIEJUTl9UUklHR0VSX0hBUFBZOQkJMHgyYzgKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkxMAkJMHgyYzkKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkxMQkJMHgyY2EKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkxMgkJMHgyY2IKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkxMwkJMHgyY2MKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkxNAkJMHgyY2QKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkxNQkJMHgyY2UKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkxNgkJMHgyY2YKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkxNwkJMHgyZDAKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkxOAkJMHgyZDEKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkxOQkJMHgyZDIKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkyMAkJMHgyZDMKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkyMQkJMHgyZDQKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkyMgkJMHgyZDUKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkyMwkJMHgyZDYKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkyNAkJMHgyZDcKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkyNQkJMHgyZDgKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkyNgkJMHgyZDkKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkyNwkJMHgyZGEKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkyOAkJMHgyZGIKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkyOQkJMHgyZGMKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkzMAkJMHgyZGQKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkzMQkJMHgyZGUKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkzMgkJMHgyZGYKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkzMwkJMHgyZTAKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkzNAkJMHgyZTEKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkzNQkJMHgyZTIKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkzNgkJMHgyZTMKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkzNwkJMHgyZTQKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkzOAkJMHgyZTUKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFkzOQkJMHgyZTYKKyNkZWZpbmUgQlROX1RSSUdHRVJfSEFQUFk0MAkJMHgyZTcKKworLyogV2UgYXZvaWQgbG93IGNvbW1vbiBrZXlzIGluIG1vZHVsZSBhbGlhc2VzIHNvIHRoZXkgZG9uJ3QgZ2V0IGh1Z2UuICovCisjZGVmaW5lIEtFWV9NSU5fSU5URVJFU1RJTkcJS0VZX01VVEUKKyNkZWZpbmUgS0VZX01BWAkJCTB4MmZmCisjZGVmaW5lIEtFWV9DTlQJCQkoS0VZX01BWCsxKQorCisvKgorICogUmVsYXRpdmUgYXhlcworICovCisKKyNkZWZpbmUgUkVMX1gJCQkweDAwCisjZGVmaW5lIFJFTF9ZCQkJMHgwMQorI2RlZmluZSBSRUxfWgkJCTB4MDIKKyNkZWZpbmUgUkVMX1JYCQkJMHgwMworI2RlZmluZSBSRUxfUlkJCQkweDA0CisjZGVmaW5lIFJFTF9SWgkJCTB4MDUKKyNkZWZpbmUgUkVMX0hXSEVFTAkJMHgwNgorI2RlZmluZSBSRUxfRElBTAkJMHgwNworI2RlZmluZSBSRUxfV0hFRUwJCTB4MDgKKyNkZWZpbmUgUkVMX01JU0MJCTB4MDkKKyNkZWZpbmUgUkVMX01BWAkJCTB4MGYKKyNkZWZpbmUgUkVMX0NOVAkJCShSRUxfTUFYKzEpCisKKy8qCisgKiBBYnNvbHV0ZSBheGVzCisgKi8KKworI2RlZmluZSBBQlNfWAkJCTB4MDAKKyNkZWZpbmUgQUJTX1kJCQkweDAxCisjZGVmaW5lIEFCU19aCQkJMHgwMgorI2RlZmluZSBBQlNfUlgJCQkweDAzCisjZGVmaW5lIEFCU19SWQkJCTB4MDQKKyNkZWZpbmUgQUJTX1JaCQkJMHgwNQorI2RlZmluZSBBQlNfVEhST1RUTEUJCTB4MDYKKyNkZWZpbmUgQUJTX1JVRERFUgkJMHgwNworI2RlZmluZSBBQlNfV0hFRUwJCTB4MDgKKyNkZWZpbmUgQUJTX0dBUwkJCTB4MDkKKyNkZWZpbmUgQUJTX0JSQUtFCQkweDBhCisjZGVmaW5lIEFCU19IQVQwWAkJMHgxMAorI2RlZmluZSBBQlNfSEFUMFkJCTB4MTEKKyNkZWZpbmUgQUJTX0hBVDFYCQkweDEyCisjZGVmaW5lIEFCU19IQVQxWQkJMHgxMworI2RlZmluZSBBQlNfSEFUMlgJCTB4MTQKKyNkZWZpbmUgQUJTX0hBVDJZCQkweDE1CisjZGVmaW5lIEFCU19IQVQzWAkJMHgxNgorI2RlZmluZSBBQlNfSEFUM1kJCTB4MTcKKyNkZWZpbmUgQUJTX1BSRVNTVVJFCQkweDE4CisjZGVmaW5lIEFCU19ESVNUQU5DRQkJMHgxOQorI2RlZmluZSBBQlNfVElMVF9YCQkweDFhCisjZGVmaW5lIEFCU19USUxUX1kJCTB4MWIKKyNkZWZpbmUgQUJTX1RPT0xfV0lEVEgJCTB4MWMKKworI2RlZmluZSBBQlNfVk9MVU1FCQkweDIwCisKKyNkZWZpbmUgQUJTX01JU0MJCTB4MjgKKworI2RlZmluZSBBQlNfTVRfU0xPVAkJMHgyZgkvKiBNVCBzbG90IGJlaW5nIG1vZGlmaWVkICovCisjZGVmaW5lIEFCU19NVF9UT1VDSF9NQUpPUgkweDMwCS8qIE1ham9yIGF4aXMgb2YgdG91Y2hpbmcgZWxsaXBzZSAqLworI2RlZmluZSBBQlNfTVRfVE9VQ0hfTUlOT1IJMHgzMQkvKiBNaW5vciBheGlzIChvbWl0IGlmIGNpcmN1bGFyKSAqLworI2RlZmluZSBBQlNfTVRfV0lEVEhfTUFKT1IJMHgzMgkvKiBNYWpvciBheGlzIG9mIGFwcHJvYWNoaW5nIGVsbGlwc2UgKi8KKyNkZWZpbmUgQUJTX01UX1dJRFRIX01JTk9SCTB4MzMJLyogTWlub3IgYXhpcyAob21pdCBpZiBjaXJjdWxhcikgKi8KKyNkZWZpbmUgQUJTX01UX09SSUVOVEFUSU9OCTB4MzQJLyogRWxsaXBzZSBvcmllbnRhdGlvbiAqLworI2RlZmluZSBBQlNfTVRfUE9TSVRJT05fWAkweDM1CS8qIENlbnRlciBYIGVsbGlwc2UgcG9zaXRpb24gKi8KKyNkZWZpbmUgQUJTX01UX1BPU0lUSU9OX1kJMHgzNgkvKiBDZW50ZXIgWSBlbGxpcHNlIHBvc2l0aW9uICovCisjZGVmaW5lIEFCU19NVF9UT09MX1RZUEUJMHgzNwkvKiBUeXBlIG9mIHRvdWNoaW5nIGRldmljZSAqLworI2RlZmluZSBBQlNfTVRfQkxPQl9JRAkJMHgzOAkvKiBHcm91cCBhIHNldCBvZiBwYWNrZXRzIGFzIGEgYmxvYiAqLworI2RlZmluZSBBQlNfTVRfVFJBQ0tJTkdfSUQJMHgzOQkvKiBVbmlxdWUgSUQgb2YgaW5pdGlhdGVkIGNvbnRhY3QgKi8KKyNkZWZpbmUgQUJTX01UX1BSRVNTVVJFCQkweDNhCS8qIFByZXNzdXJlIG9uIGNvbnRhY3QgYXJlYSAqLworI2RlZmluZSBBQlNfTVRfRElTVEFOQ0UJCTB4M2IJLyogQ29udGFjdCBob3ZlciBkaXN0YW5jZSAqLworCisKKyNkZWZpbmUgQUJTX01BWAkJCTB4M2YKKyNkZWZpbmUgQUJTX0NOVAkJCShBQlNfTUFYKzEpCisKKy8qCisgKiBTd2l0Y2ggZXZlbnRzCisgKi8KKworI2RlZmluZSBTV19MSUQJCQkweDAwICAvKiBzZXQgPSBsaWQgc2h1dCAqLworI2RlZmluZSBTV19UQUJMRVRfTU9ERQkJMHgwMSAgLyogc2V0ID0gdGFibGV0IG1vZGUgKi8KKyNkZWZpbmUgU1dfSEVBRFBIT05FX0lOU0VSVAkweDAyICAvKiBzZXQgPSBpbnNlcnRlZCAqLworI2RlZmluZSBTV19SRktJTExfQUxMCQkweDAzICAvKiByZmtpbGwgbWFzdGVyIHN3aXRjaCwgdHlwZSAiYW55IgorCQkJCQkgc2V0ID0gcmFkaW8gZW5hYmxlZCAqLworI2RlZmluZSBTV19SQURJTwkJU1dfUkZLSUxMX0FMTAkvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFNXX01JQ1JPUEhPTkVfSU5TRVJUCTB4MDQgIC8qIHNldCA9IGluc2VydGVkICovCisjZGVmaW5lIFNXX0RPQ0sJCQkweDA1ICAvKiBzZXQgPSBwbHVnZ2VkIGludG8gZG9jayAqLworI2RlZmluZSBTV19MSU5FT1VUX0lOU0VSVAkweDA2ICAvKiBzZXQgPSBpbnNlcnRlZCAqLworI2RlZmluZSBTV19KQUNLX1BIWVNJQ0FMX0lOU0VSVCAweDA3ICAvKiBzZXQgPSBtZWNoYW5pY2FsIHN3aXRjaCBzZXQgKi8KKyNkZWZpbmUgU1dfVklERU9PVVRfSU5TRVJUCTB4MDggIC8qIHNldCA9IGluc2VydGVkICovCisjZGVmaW5lIFNXX0NBTUVSQV9MRU5TX0NPVkVSCTB4MDkgIC8qIHNldCA9IGxlbnMgY292ZXJlZCAqLworI2RlZmluZSBTV19LRVlQQURfU0xJREUJCTB4MGEgIC8qIHNldCA9IGtleXBhZCBzbGlkZSBvdXQgKi8KKyNkZWZpbmUgU1dfRlJPTlRfUFJPWElNSVRZCTB4MGIgIC8qIHNldCA9IGZyb250IHByb3hpbWl0eSBzZW5zb3IgYWN0aXZlICovCisjZGVmaW5lIFNXX1JPVEFURV9MT0NLCQkweDBjICAvKiBzZXQgPSByb3RhdGUgbG9ja2VkL2Rpc2FibGVkICovCisjZGVmaW5lIFNXX0xJTkVJTl9JTlNFUlQJMHgwZCAgLyogc2V0ID0gaW5zZXJ0ZWQgKi8KKyNkZWZpbmUgU1dfTUFYCQkJMHgwZgorI2RlZmluZSBTV19DTlQJCQkoU1dfTUFYKzEpCisKKy8qCisgKiBNaXNjIGV2ZW50cworICovCisKKyNkZWZpbmUgTVNDX1NFUklBTAkJMHgwMAorI2RlZmluZSBNU0NfUFVMU0VMRUQJCTB4MDEKKyNkZWZpbmUgTVNDX0dFU1RVUkUJCTB4MDIKKyNkZWZpbmUgTVNDX1JBVwkJCTB4MDMKKyNkZWZpbmUgTVNDX1NDQU4JCTB4MDQKKyNkZWZpbmUgTVNDX01BWAkJCTB4MDcKKyNkZWZpbmUgTVNDX0NOVAkJCShNU0NfTUFYKzEpCisKKy8qCisgKiBMRURzCisgKi8KKworI2RlZmluZSBMRURfTlVNTAkJMHgwMAorI2RlZmluZSBMRURfQ0FQU0wJCTB4MDEKKyNkZWZpbmUgTEVEX1NDUk9MTEwJCTB4MDIKKyNkZWZpbmUgTEVEX0NPTVBPU0UJCTB4MDMKKyNkZWZpbmUgTEVEX0tBTkEJCTB4MDQKKyNkZWZpbmUgTEVEX1NMRUVQCQkweDA1CisjZGVmaW5lIExFRF9TVVNQRU5ECQkweDA2CisjZGVmaW5lIExFRF9NVVRFCQkweDA3CisjZGVmaW5lIExFRF9NSVNDCQkweDA4CisjZGVmaW5lIExFRF9NQUlMCQkweDA5CisjZGVmaW5lIExFRF9DSEFSR0lORwkJMHgwYQorI2RlZmluZSBMRURfTUFYCQkJMHgwZgorI2RlZmluZSBMRURfQ05UCQkJKExFRF9NQVgrMSkKKworLyoKKyAqIEF1dG9yZXBlYXQgdmFsdWVzCisgKi8KKworI2RlZmluZSBSRVBfREVMQVkJCTB4MDAKKyNkZWZpbmUgUkVQX1BFUklPRAkJMHgwMQorI2RlZmluZSBSRVBfTUFYCQkJMHgwMQorI2RlZmluZSBSRVBfQ05UCQkJKFJFUF9NQVgrMSkKKworLyoKKyAqIFNvdW5kcworICovCisKKyNkZWZpbmUgU05EX0NMSUNLCQkweDAwCisjZGVmaW5lIFNORF9CRUxMCQkweDAxCisjZGVmaW5lIFNORF9UT05FCQkweDAyCisjZGVmaW5lIFNORF9NQVgJCQkweDA3CisjZGVmaW5lIFNORF9DTlQJCQkoU05EX01BWCsxKQorCisvKgorICogSURzLgorICovCisKKyNkZWZpbmUgSURfQlVTCQkJMAorI2RlZmluZSBJRF9WRU5ET1IJCTEKKyNkZWZpbmUgSURfUFJPRFVDVAkJMgorI2RlZmluZSBJRF9WRVJTSU9OCQkzCisKKyNkZWZpbmUgQlVTX1BDSQkJCTB4MDEKKyNkZWZpbmUgQlVTX0lTQVBOUAkJMHgwMgorI2RlZmluZSBCVVNfVVNCCQkJMHgwMworI2RlZmluZSBCVVNfSElMCQkJMHgwNAorI2RlZmluZSBCVVNfQkxVRVRPT1RICQkweDA1CisjZGVmaW5lIEJVU19WSVJUVUFMCQkweDA2CisKKyNkZWZpbmUgQlVTX0lTQQkJCTB4MTAKKyNkZWZpbmUgQlVTX0k4MDQyCQkweDExCisjZGVmaW5lIEJVU19YVEtCRAkJMHgxMgorI2RlZmluZSBCVVNfUlMyMzIJCTB4MTMKKyNkZWZpbmUgQlVTX0dBTUVQT1JUCQkweDE0CisjZGVmaW5lIEJVU19QQVJQT1JUCQkweDE1CisjZGVmaW5lIEJVU19BTUlHQQkJMHgxNgorI2RlZmluZSBCVVNfQURCCQkJMHgxNworI2RlZmluZSBCVVNfSTJDCQkJMHgxOAorI2RlZmluZSBCVVNfSE9TVAkJMHgxOQorI2RlZmluZSBCVVNfR1NDCQkJMHgxQQorI2RlZmluZSBCVVNfQVRBUkkJCTB4MUIKKyNkZWZpbmUgQlVTX1NQSQkJCTB4MUMKKworLyoKKyAqIE1UX1RPT0wgdHlwZXMKKyAqLworI2RlZmluZSBNVF9UT09MX0ZJTkdFUgkJMAorI2RlZmluZSBNVF9UT09MX1BFTgkJMQorI2RlZmluZSBNVF9UT09MX01BWAkJMQorCisvKgorICogVmFsdWVzIGRlc2NyaWJpbmcgdGhlIHN0YXR1cyBvZiBhIGZvcmNlLWZlZWRiYWNrIGVmZmVjdAorICovCisjZGVmaW5lIEZGX1NUQVRVU19TVE9QUEVECTB4MDAKKyNkZWZpbmUgRkZfU1RBVFVTX1BMQVlJTkcJMHgwMQorI2RlZmluZSBGRl9TVEFUVVNfTUFYCQkweDAxCisKKy8qCisgKiBTdHJ1Y3R1cmVzIHVzZWQgaW4gaW9jdGxzIHRvIHVwbG9hZCBlZmZlY3RzIHRvIGEgZGV2aWNlCisgKiBUaGV5IGFyZSBwaWVjZXMgb2YgYSBiaWdnZXIgc3RydWN0dXJlIChjYWxsZWQgZmZfZWZmZWN0KQorICovCisKKy8qCisgKiBBbGwgZHVyYXRpb24gdmFsdWVzIGFyZSBleHByZXNzZWQgaW4gbXMuIFZhbHVlcyBhYm92ZSAzMjc2NyBtcyAoMHg3ZmZmKQorICogc2hvdWxkIG5vdCBiZSB1c2VkIGFuZCBoYXZlIHVuc3BlY2lmaWVkIHJlc3VsdHMuCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgZmZfcmVwbGF5IC0gZGVmaW5lcyBzY2hlZHVsaW5nIG9mIHRoZSBmb3JjZS1mZWVkYmFjayBlZmZlY3QKKyAqIEBsZW5ndGg6IGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QKKyAqIEBkZWxheTogZGVsYXkgYmVmb3JlIGVmZmVjdCBzaG91bGQgc3RhcnQgcGxheWluZworICovCitzdHJ1Y3QgZmZfcmVwbGF5IHsKKwlfX3UxNiBsZW5ndGg7CisJX191MTYgZGVsYXk7Cit9OworCisvKioKKyAqIHN0cnVjdCBmZl90cmlnZ2VyIC0gZGVmaW5lcyB3aGF0IHRyaWdnZXJzIHRoZSBmb3JjZS1mZWVkYmFjayBlZmZlY3QKKyAqIEBidXR0b246IG51bWJlciBvZiB0aGUgYnV0dG9uIHRyaWdnZXJpbmcgdGhlIGVmZmVjdAorICogQGludGVydmFsOiBjb250cm9scyBob3cgc29vbiB0aGUgZWZmZWN0IGNhbiBiZSByZS10cmlnZ2VyZWQKKyAqLworc3RydWN0IGZmX3RyaWdnZXIgeworCV9fdTE2IGJ1dHRvbjsKKwlfX3UxNiBpbnRlcnZhbDsKK307CisKKy8qKgorICogc3RydWN0IGZmX2VudmVsb3BlIC0gZ2VuZXJpYyBmb3JjZS1mZWVkYmFjayBlZmZlY3QgZW52ZWxvcGUKKyAqIEBhdHRhY2tfbGVuZ3RoOiBkdXJhdGlvbiBvZiB0aGUgYXR0YWNrIChtcykKKyAqIEBhdHRhY2tfbGV2ZWw6IGxldmVsIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGF0dGFjaworICogQGZhZGVfbGVuZ3RoOiBkdXJhdGlvbiBvZiBmYWRlIChtcykKKyAqIEBmYWRlX2xldmVsOiBsZXZlbCBhdCB0aGUgZW5kIG9mIGZhZGUKKyAqCisgKiBUaGUgQGF0dGFja19sZXZlbCBhbmQgQGZhZGVfbGV2ZWwgYXJlIGFic29sdXRlIHZhbHVlczsgd2hlbiBhcHBseWluZworICogZW52ZWxvcGUgZm9yY2UtZmVlZGJhY2sgY29yZSB3aWxsIGNvbnZlcnQgdG8gcG9zaXRpdmUvbmVnYXRpdmUKKyAqIHZhbHVlIGJhc2VkIG9uIHBvbGFyaXR5IG9mIHRoZSBkZWZhdWx0IGxldmVsIG9mIHRoZSBlZmZlY3QuCisgKiBWYWxpZCByYW5nZSBmb3IgdGhlIGF0dGFjayBhbmQgZmFkZSBsZXZlbHMgaXMgMHgwMDAwIC0gMHg3ZmZmCisgKi8KK3N0cnVjdCBmZl9lbnZlbG9wZSB7CisJX191MTYgYXR0YWNrX2xlbmd0aDsKKwlfX3UxNiBhdHRhY2tfbGV2ZWw7CisJX191MTYgZmFkZV9sZW5ndGg7CisJX191MTYgZmFkZV9sZXZlbDsKK307CisKKy8qKgorICogc3RydWN0IGZmX2NvbnN0YW50X2VmZmVjdCAtIGRlZmluZXMgcGFyYW1ldGVycyBvZiBhIGNvbnN0YW50IGZvcmNlLWZlZWRiYWNrIGVmZmVjdAorICogQGxldmVsOiBzdHJlbmd0aCBvZiB0aGUgZWZmZWN0OyBtYXkgYmUgbmVnYXRpdmUKKyAqIEBlbnZlbG9wZTogZW52ZWxvcGUgZGF0YQorICovCitzdHJ1Y3QgZmZfY29uc3RhbnRfZWZmZWN0IHsKKwlfX3MxNiBsZXZlbDsKKwlzdHJ1Y3QgZmZfZW52ZWxvcGUgZW52ZWxvcGU7Cit9OworCisvKioKKyAqIHN0cnVjdCBmZl9yYW1wX2VmZmVjdCAtIGRlZmluZXMgcGFyYW1ldGVycyBvZiBhIHJhbXAgZm9yY2UtZmVlZGJhY2sgZWZmZWN0CisgKiBAc3RhcnRfbGV2ZWw6IGJlZ2lubmluZyBzdHJlbmd0aCBvZiB0aGUgZWZmZWN0OyBtYXkgYmUgbmVnYXRpdmUKKyAqIEBlbmRfbGV2ZWw6IGZpbmFsIHN0cmVuZ3RoIG9mIHRoZSBlZmZlY3Q7IG1heSBiZSBuZWdhdGl2ZQorICogQGVudmVsb3BlOiBlbnZlbG9wZSBkYXRhCisgKi8KK3N0cnVjdCBmZl9yYW1wX2VmZmVjdCB7CisJX19zMTYgc3RhcnRfbGV2ZWw7CisJX19zMTYgZW5kX2xldmVsOworCXN0cnVjdCBmZl9lbnZlbG9wZSBlbnZlbG9wZTsKK307CisKKy8qKgorICogc3RydWN0IGZmX2NvbmRpdGlvbl9lZmZlY3QgLSBkZWZpbmVzIGEgc3ByaW5nIG9yIGZyaWN0aW9uIGZvcmNlLWZlZWRiYWNrIGVmZmVjdAorICogQHJpZ2h0X3NhdHVyYXRpb246IG1heGltdW0gbGV2ZWwgd2hlbiBqb3lzdGljayBtb3ZlZCBhbGwgd2F5IHRvIHRoZSByaWdodAorICogQGxlZnRfc2F0dXJhdGlvbjogc2FtZSBmb3IgdGhlIGxlZnQgc2lkZQorICogQHJpZ2h0X2NvZWZmOiBjb250cm9scyBob3cgZmFzdCB0aGUgZm9yY2UgZ3Jvd3Mgd2hlbiB0aGUgam95c3RpY2sgbW92ZXMKKyAqCXRvIHRoZSByaWdodAorICogQGxlZnRfY29lZmY6IHNhbWUgZm9yIHRoZSBsZWZ0IHNpZGUKKyAqIEBkZWFkYmFuZDogc2l6ZSBvZiB0aGUgZGVhZCB6b25lLCB3aGVyZSBubyBmb3JjZSBpcyBwcm9kdWNlZAorICogQGNlbnRlcjogcG9zaXRpb24gb2YgdGhlIGRlYWQgem9uZQorICovCitzdHJ1Y3QgZmZfY29uZGl0aW9uX2VmZmVjdCB7CisJX191MTYgcmlnaHRfc2F0dXJhdGlvbjsKKwlfX3UxNiBsZWZ0X3NhdHVyYXRpb247CisKKwlfX3MxNiByaWdodF9jb2VmZjsKKwlfX3MxNiBsZWZ0X2NvZWZmOworCisJX191MTYgZGVhZGJhbmQ7CisJX19zMTYgY2VudGVyOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZmZfcGVyaW9kaWNfZWZmZWN0IC0gZGVmaW5lcyBwYXJhbWV0ZXJzIG9mIGEgcGVyaW9kaWMgZm9yY2UtZmVlZGJhY2sgZWZmZWN0CisgKiBAd2F2ZWZvcm06IGtpbmQgb2YgdGhlIGVmZmVjdCAod2F2ZSkKKyAqIEBwZXJpb2Q6IHBlcmlvZCBvZiB0aGUgd2F2ZSAobXMpCisgKiBAbWFnbml0dWRlOiBwZWFrIHZhbHVlCisgKiBAb2Zmc2V0OiBtZWFuIHZhbHVlIG9mIHRoZSB3YXZlIChyb3VnaGx5KQorICogQHBoYXNlOiAnaG9yaXpvbnRhbCcgc2hpZnQKKyAqIEBlbnZlbG9wZTogZW52ZWxvcGUgZGF0YQorICogQGN1c3RvbV9sZW46IG51bWJlciBvZiBzYW1wbGVzIChGRl9DVVNUT00gb25seSkKKyAqIEBjdXN0b21fZGF0YTogYnVmZmVyIG9mIHNhbXBsZXMgKEZGX0NVU1RPTSBvbmx5KQorICoKKyAqIEtub3duIHdhdmVmb3JtcyAtIEZGX1NRVUFSRSwgRkZfVFJJQU5HTEUsIEZGX1NJTkUsIEZGX1NBV19VUCwKKyAqIEZGX1NBV19ET1dOLCBGRl9DVVNUT00uIFRoZSBleGFjdCBzeW50YXggRkZfQ1VTVE9NIGlzIHVuZGVmaW5lZAorICogZm9yIHRoZSB0aW1lIGJlaW5nIGFzIG5vIGRyaXZlciBzdXBwb3J0cyBpdCB5ZXQuCisgKgorICogTm90ZTogdGhlIGRhdGEgcG9pbnRlZCBieSBjdXN0b21fZGF0YSBpcyBjb3BpZWQgYnkgdGhlIGRyaXZlci4KKyAqIFlvdSBjYW4gdGhlcmVmb3JlIGRpc3Bvc2Ugb2YgdGhlIG1lbW9yeSBhZnRlciB0aGUgdXBsb2FkL3VwZGF0ZS4KKyAqLworc3RydWN0IGZmX3BlcmlvZGljX2VmZmVjdCB7CisJX191MTYgd2F2ZWZvcm07CisJX191MTYgcGVyaW9kOworCV9fczE2IG1hZ25pdHVkZTsKKwlfX3MxNiBvZmZzZXQ7CisJX191MTYgcGhhc2U7CisKKwlzdHJ1Y3QgZmZfZW52ZWxvcGUgZW52ZWxvcGU7CisKKwlfX3UzMiBjdXN0b21fbGVuOworCV9fczE2ICpjdXN0b21fZGF0YTsKK307CisKKy8qKgorICogc3RydWN0IGZmX3J1bWJsZV9lZmZlY3QgLSBkZWZpbmVzIHBhcmFtZXRlcnMgb2YgYSBwZXJpb2RpYyBmb3JjZS1mZWVkYmFjayBlZmZlY3QKKyAqIEBzdHJvbmdfbWFnbml0dWRlOiBtYWduaXR1ZGUgb2YgdGhlIGhlYXZ5IG1vdG9yCisgKiBAd2Vha19tYWduaXR1ZGU6IG1hZ25pdHVkZSBvZiB0aGUgbGlnaHQgb25lCisgKgorICogU29tZSBydW1ibGUgcGFkcyBoYXZlIHR3byBtb3RvcnMgb2YgZGlmZmVyZW50IHdlaWdodC4gU3Ryb25nX21hZ25pdHVkZQorICogcmVwcmVzZW50cyB0aGUgbWFnbml0dWRlIG9mIHRoZSB2aWJyYXRpb24gZ2VuZXJhdGVkIGJ5IHRoZSBoZWF2eSBvbmUuCisgKi8KK3N0cnVjdCBmZl9ydW1ibGVfZWZmZWN0IHsKKwlfX3UxNiBzdHJvbmdfbWFnbml0dWRlOworCV9fdTE2IHdlYWtfbWFnbml0dWRlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZmZfZWZmZWN0IC0gZGVmaW5lcyBmb3JjZSBmZWVkYmFjayBlZmZlY3QKKyAqIEB0eXBlOiB0eXBlIG9mIHRoZSBlZmZlY3QgKEZGX0NPTlNUQU5ULCBGRl9QRVJJT0RJQywgRkZfUkFNUCwgRkZfU1BSSU5HLAorICoJRkZfRlJJQ1RJT04sIEZGX0RBTVBFUiwgRkZfUlVNQkxFLCBGRl9JTkVSVElBLCBvciBGRl9DVVNUT00pCisgKiBAaWQ6IGFuIHVuaXF1ZSBpZCBhc3NpZ25lZCB0byBhbiBlZmZlY3QKKyAqIEBkaXJlY3Rpb246IGRpcmVjdGlvbiBvZiB0aGUgZWZmZWN0CisgKiBAdHJpZ2dlcjogdHJpZ2dlciBjb25kaXRpb25zIChzdHJ1Y3QgZmZfdHJpZ2dlcikKKyAqIEByZXBsYXk6IHNjaGVkdWxpbmcgb2YgdGhlIGVmZmVjdCAoc3RydWN0IGZmX3JlcGxheSkKKyAqIEB1OiBlZmZlY3Qtc3BlY2lmaWMgc3RydWN0dXJlIChvbmUgb2YgZmZfY29uc3RhbnRfZWZmZWN0LCBmZl9yYW1wX2VmZmVjdCwKKyAqCWZmX3BlcmlvZGljX2VmZmVjdCwgZmZfY29uZGl0aW9uX2VmZmVjdCwgZmZfcnVtYmxlX2VmZmVjdCkgZnVydGhlcgorICoJZGVmaW5pbmcgZWZmZWN0IHBhcmFtZXRlcnMKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBzZW50IHRocm91Z2ggaW9jdGwgZnJvbSB0aGUgYXBwbGljYXRpb24gdG8gdGhlIGRyaXZlci4KKyAqIFRvIGNyZWF0ZSBhIG5ldyBlZmZlY3QgYXBwbGljYXRpb24gc2hvdWxkIHNldCBpdHMgQGlkIHRvIC0xOyB0aGUga2VybmVsCisgKiB3aWxsIHJldHVybiBhc3NpZ25lZCBAaWQgd2hpY2ggY2FuIGxhdGVyIGJlIHVzZWQgdG8gdXBkYXRlIG9yIGRlbGV0ZQorICogdGhpcyBlZmZlY3QuCisgKgorICogRGlyZWN0aW9uIG9mIHRoZSBlZmZlY3QgaXMgZW5jb2RlZCBhcyBmb2xsb3dzOgorICoJMCBkZWcgLT4gMHgwMDAwIChkb3duKQorICoJOTAgZGVnIC0+IDB4NDAwMCAobGVmdCkKKyAqCTE4MCBkZWcgLT4gMHg4MDAwICh1cCkKKyAqCTI3MCBkZWcgLT4gMHhDMDAwIChyaWdodCkKKyAqLworc3RydWN0IGZmX2VmZmVjdCB7CisJX191MTYgdHlwZTsKKwlfX3MxNiBpZDsKKwlfX3UxNiBkaXJlY3Rpb247CisJc3RydWN0IGZmX3RyaWdnZXIgdHJpZ2dlcjsKKwlzdHJ1Y3QgZmZfcmVwbGF5IHJlcGxheTsKKworCXVuaW9uIHsKKwkJc3RydWN0IGZmX2NvbnN0YW50X2VmZmVjdCBjb25zdGFudDsKKwkJc3RydWN0IGZmX3JhbXBfZWZmZWN0IHJhbXA7CisJCXN0cnVjdCBmZl9wZXJpb2RpY19lZmZlY3QgcGVyaW9kaWM7CisJCXN0cnVjdCBmZl9jb25kaXRpb25fZWZmZWN0IGNvbmRpdGlvblsyXTsgLyogT25lIGZvciBlYWNoIGF4aXMgKi8KKwkJc3RydWN0IGZmX3J1bWJsZV9lZmZlY3QgcnVtYmxlOworCX0gdTsKK307CisKKy8qCisgKiBGb3JjZSBmZWVkYmFjayBlZmZlY3QgdHlwZXMKKyAqLworCisjZGVmaW5lIEZGX1JVTUJMRQkweDUwCisjZGVmaW5lIEZGX1BFUklPRElDCTB4NTEKKyNkZWZpbmUgRkZfQ09OU1RBTlQJMHg1MgorI2RlZmluZSBGRl9TUFJJTkcJMHg1MworI2RlZmluZSBGRl9GUklDVElPTgkweDU0CisjZGVmaW5lIEZGX0RBTVBFUgkweDU1CisjZGVmaW5lIEZGX0lORVJUSUEJMHg1NgorI2RlZmluZSBGRl9SQU1QCQkweDU3CisKKyNkZWZpbmUgRkZfRUZGRUNUX01JTglGRl9SVU1CTEUKKyNkZWZpbmUgRkZfRUZGRUNUX01BWAlGRl9SQU1QCisKKy8qCisgKiBGb3JjZSBmZWVkYmFjayBwZXJpb2RpYyBlZmZlY3QgdHlwZXMKKyAqLworCisjZGVmaW5lIEZGX1NRVUFSRQkweDU4CisjZGVmaW5lIEZGX1RSSUFOR0xFCTB4NTkKKyNkZWZpbmUgRkZfU0lORQkJMHg1YQorI2RlZmluZSBGRl9TQVdfVVAJMHg1YgorI2RlZmluZSBGRl9TQVdfRE9XTgkweDVjCisjZGVmaW5lIEZGX0NVU1RPTQkweDVkCisKKyNkZWZpbmUgRkZfV0FWRUZPUk1fTUlOCUZGX1NRVUFSRQorI2RlZmluZSBGRl9XQVZFRk9STV9NQVgJRkZfQ1VTVE9NCisKKy8qCisgKiBTZXQgZmYgZGV2aWNlIHByb3BlcnRpZXMKKyAqLworCisjZGVmaW5lIEZGX0dBSU4JCTB4NjAKKyNkZWZpbmUgRkZfQVVUT0NFTlRFUgkweDYxCisKKyNkZWZpbmUgRkZfTUFYCQkweDdmCisjZGVmaW5lIEZGX0NOVAkJKEZGX01BWCsxKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaW9jdGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTkxZWIzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pb2N0bC5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfTElOVVhfSU9DVExfSAorI2RlZmluZSBfTElOVVhfSU9DVExfSAorCisjaW5jbHVkZSA8YXNtL2lvY3RsLmg+CisKKyNlbmRpZiAvKiBfTElOVVhfSU9DVExfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmNDcyYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXAuaApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlEZWZpbml0aW9ucyBmb3IgdGhlIElQIHByb3RvY29sLgorICoKKyAqIFZlcnNpb246CUAoIylpcC5oCTEuMC4yCTA0LzI4LzkzCisgKgorICogQXV0aG9yczoJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0xJTlVYX0lQX0gKKyNkZWZpbmUgX0xJTlVYX0lQX0gKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2RlZmluZSBJUFRPU19UT1NfTUFTSwkJMHgxRQorI2RlZmluZSBJUFRPU19UT1ModG9zKQkJKCh0b3MpJklQVE9TX1RPU19NQVNLKQorI2RlZmluZQlJUFRPU19MT1dERUxBWQkJMHgxMAorI2RlZmluZQlJUFRPU19USFJPVUdIUFVUCTB4MDgKKyNkZWZpbmUJSVBUT1NfUkVMSUFCSUxJVFkJMHgwNAorI2RlZmluZQlJUFRPU19NSU5DT1NUCQkweDAyCisKKyNkZWZpbmUgSVBUT1NfUFJFQ19NQVNLCQkweEUwCisjZGVmaW5lIElQVE9TX1BSRUModG9zKQkJKCh0b3MpJklQVE9TX1BSRUNfTUFTSykKKyNkZWZpbmUgSVBUT1NfUFJFQ19ORVRDT05UUk9MICAgICAgICAgICAweGUwCisjZGVmaW5lIElQVE9TX1BSRUNfSU5URVJORVRDT05UUk9MICAgICAgMHhjMAorI2RlZmluZSBJUFRPU19QUkVDX0NSSVRJQ19FQ1AgICAgICAgICAgIDB4YTAKKyNkZWZpbmUgSVBUT1NfUFJFQ19GTEFTSE9WRVJSSURFICAgICAgICAweDgwCisjZGVmaW5lIElQVE9TX1BSRUNfRkxBU0ggICAgICAgICAgICAgICAgMHg2MAorI2RlZmluZSBJUFRPU19QUkVDX0lNTUVESUFURSAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgSVBUT1NfUFJFQ19QUklPUklUWSAgICAgICAgICAgICAweDIwCisjZGVmaW5lIElQVE9TX1BSRUNfUk9VVElORSAgICAgICAgICAgICAgMHgwMAorCisKKy8qIElQIG9wdGlvbnMgKi8KKyNkZWZpbmUgSVBPUFRfQ09QWQkJMHg4MAorI2RlZmluZSBJUE9QVF9DTEFTU19NQVNLCTB4NjAKKyNkZWZpbmUgSVBPUFRfTlVNQkVSX01BU0sJMHgxZgorCisjZGVmaW5lCUlQT1BUX0NPUElFRChvKQkJKChvKSZJUE9QVF9DT1BZKQorI2RlZmluZQlJUE9QVF9DTEFTUyhvKQkJKChvKSZJUE9QVF9DTEFTU19NQVNLKQorI2RlZmluZQlJUE9QVF9OVU1CRVIobykJCSgobykmSVBPUFRfTlVNQkVSX01BU0spCisKKyNkZWZpbmUJSVBPUFRfQ09OVFJPTAkJMHgwMAorI2RlZmluZQlJUE9QVF9SRVNFUlZFRDEJCTB4MjAKKyNkZWZpbmUJSVBPUFRfTUVBU1VSRU1FTlQJMHg0MAorI2RlZmluZQlJUE9QVF9SRVNFUlZFRDIJCTB4NjAKKworI2RlZmluZSBJUE9QVF9FTkQJKDAgfElQT1BUX0NPTlRST0wpCisjZGVmaW5lIElQT1BUX05PT1AJKDEgfElQT1BUX0NPTlRST0wpCisjZGVmaW5lIElQT1BUX1NFQwkoMiB8SVBPUFRfQ09OVFJPTHxJUE9QVF9DT1BZKQorI2RlZmluZSBJUE9QVF9MU1JSCSgzIHxJUE9QVF9DT05UUk9MfElQT1BUX0NPUFkpCisjZGVmaW5lIElQT1BUX1RJTUVTVEFNUAkoNCB8SVBPUFRfTUVBU1VSRU1FTlQpCisjZGVmaW5lIElQT1BUX0NJUFNPCSg2IHxJUE9QVF9DT05UUk9MfElQT1BUX0NPUFkpCisjZGVmaW5lIElQT1BUX1JSCSg3IHxJUE9QVF9DT05UUk9MKQorI2RlZmluZSBJUE9QVF9TSUQJKDggfElQT1BUX0NPTlRST0x8SVBPUFRfQ09QWSkKKyNkZWZpbmUgSVBPUFRfU1NSUgkoOSB8SVBPUFRfQ09OVFJPTHxJUE9QVF9DT1BZKQorI2RlZmluZSBJUE9QVF9SQQkoMjB8SVBPUFRfQ09OVFJPTHxJUE9QVF9DT1BZKQorCisjZGVmaW5lIElQVkVSU0lPTgk0CisjZGVmaW5lIE1BWFRUTAkJMjU1CisjZGVmaW5lIElQREVGVFRMCTY0CisKKyNkZWZpbmUgSVBPUFRfT1BUVkFMIDAKKyNkZWZpbmUgSVBPUFRfT0xFTiAgIDEKKyNkZWZpbmUgSVBPUFRfT0ZGU0VUIDIKKyNkZWZpbmUgSVBPUFRfTUlOT0ZGIDQKKyNkZWZpbmUgTUFYX0lQT1BUTEVOIDQwCisjZGVmaW5lIElQT1BUX05PUCBJUE9QVF9OT09QCisjZGVmaW5lIElQT1BUX0VPTCBJUE9QVF9FTkQKKyNkZWZpbmUgSVBPUFRfVFMgIElQT1BUX1RJTUVTVEFNUAorCisjZGVmaW5lCUlQT1BUX1RTX1RTT05MWQkJMAkJLyogdGltZXN0YW1wcyBvbmx5ICovCisjZGVmaW5lCUlQT1BUX1RTX1RTQU5EQUREUgkxCQkvKiB0aW1lc3RhbXBzIGFuZCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUJSVBPUFRfVFNfUFJFU1BFQwkzCQkvKiBzcGVjaWZpZWQgbW9kdWxlcyBvbmx5ICovCisKKyNkZWZpbmUgSVBWNF9CRUVUX1BITUFYTEVOIDgKKworc3RydWN0IGlwaGRyIHsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4CWlobDo0LAorCQl2ZXJzaW9uOjQ7CisjZWxpZiBkZWZpbmVkIChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OAl2ZXJzaW9uOjQsCisgIAkJaWhsOjQ7CisjZWxzZQorI2Vycm9yCSJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisJX191OAl0b3M7CisJX19iZTE2CXRvdF9sZW47CisJX19iZTE2CWlkOworCV9fYmUxNglmcmFnX29mZjsKKwlfX3U4CXR0bDsKKwlfX3U4CXByb3RvY29sOworCV9fc3VtMTYJY2hlY2s7CisJX19iZTMyCXNhZGRyOworCV9fYmUzMglkYWRkcjsKKwkvKlRoZSBvcHRpb25zIHN0YXJ0IGhlcmUuICovCit9OworCisKK3N0cnVjdCBpcF9hdXRoX2hkciB7CisJX191OCAgbmV4dGhkcjsKKwlfX3U4ICBoZHJsZW47CQkvKiBUaGlzIG9uZSBpcyBtZWFzdXJlZCBpbiAzMiBiaXQgdW5pdHMhICovCisJX19iZTE2IHJlc2VydmVkOworCV9fYmUzMiBzcGk7CisJX19iZTMyIHNlcV9ubzsJCS8qIFNlcXVlbmNlIG51bWJlciAqLworCV9fdTggIGF1dGhfZGF0YVswXTsJLyogVmFyaWFibGUgbGVuIGJ1dCA+PTQuIE1pbmQgdGhlIDY0IGJpdCBhbGlnbm1lbnQhICovCit9OworCitzdHJ1Y3QgaXBfZXNwX2hkciB7CisJX19iZTMyIHNwaTsKKwlfX2JlMzIgc2VxX25vOwkJLyogU2VxdWVuY2UgbnVtYmVyICovCisJX191OCAgZW5jX2RhdGFbMF07CS8qIFZhcmlhYmxlIGxlbiBidXQgPj04LiBNaW5kIHRoZSA2NCBiaXQgYWxpZ25tZW50ISAqLworfTsKKworc3RydWN0IGlwX2NvbXBfaGRyIHsKKwlfX3U4IG5leHRoZHI7CisJX191OCBmbGFnczsKKwlfX2JlMTYgY3BpOworfTsKKworc3RydWN0IGlwX2JlZXRfcGhkciB7CisJX191OCBuZXh0aGRyOworCV9fdTggaGRybGVuOworCV9fdTggcGFkbGVuOworCV9fdTggcmVzZXJ2ZWQ7Cit9OworCisjZW5kaWYJLyogX0xJTlVYX0lQX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXA2X3R1bm5lbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcDZfdHVubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyMmIwMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXA2X3R1bm5lbC5oCkBAIC0wLDAgKzEsMzQgQEAKKyNpZm5kZWYgX0lQNl9UVU5ORUxfSAorI2RlZmluZSBfSVA2X1RVTk5FTF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIElQVjZfVExWX1ROTF9FTkNBUF9MSU1JVCA0CisjZGVmaW5lIElQVjZfREVGQVVMVF9UTkxfRU5DQVBfTElNSVQgNAorCisvKiBkb24ndCBhZGQgZW5jYXBzdWxhdGlvbiBsaW1pdCBpZiBvbmUgaXNuJ3QgcHJlc2VudCBpbiBpbm5lciBwYWNrZXQgKi8KKyNkZWZpbmUgSVA2X1ROTF9GX0lHTl9FTkNBUF9MSU1JVCAweDEKKy8qIGNvcHkgdGhlIHRyYWZmaWMgY2xhc3MgZmllbGQgZnJvbSB0aGUgaW5uZXIgcGFja2V0ICovCisjZGVmaW5lIElQNl9UTkxfRl9VU0VfT1JJR19UQ0xBU1MgMHgyCisvKiBjb3B5IHRoZSBmbG93bGFiZWwgZnJvbSB0aGUgaW5uZXIgcGFja2V0ICovCisjZGVmaW5lIElQNl9UTkxfRl9VU0VfT1JJR19GTE9XTEFCRUwgMHg0CisvKiBiZWluZyB1c2VkIGZvciBNb2JpbGUgSVB2NiAqLworI2RlZmluZSBJUDZfVE5MX0ZfTUlQNl9ERVYgMHg4CisvKiBjb3B5IERTQ1AgZnJvbSB0aGUgb3V0ZXIgcGFja2V0ICovCisjZGVmaW5lIElQNl9UTkxfRl9SQ1ZfRFNDUF9DT1BZIDB4MTAKKy8qIGNvcHkgZndtYXJrIGZyb20gaW5uZXIgcGFja2V0ICovCisjZGVmaW5lIElQNl9UTkxfRl9VU0VfT1JJR19GV01BUksgMHgyMAorCitzdHJ1Y3QgaXA2X3RubF9wYXJtIHsKKwljaGFyIG5hbWVbSUZOQU1TSVpdOwkvKiBuYW1lIG9mIHR1bm5lbCBkZXZpY2UgKi8KKwlpbnQgbGluazsJCS8qIGlmaW5kZXggb2YgdW5kZXJseWluZyBMMiBpbnRlcmZhY2UgKi8KKwlfX3U4IHByb3RvOwkJLyogdHVubmVsIHByb3RvY29sICovCisJX191OCBlbmNhcF9saW1pdDsJLyogZW5jYXBzdWxhdGlvbiBsaW1pdCBmb3IgdHVubmVsICovCisJX191OCBob3BfbGltaXQ7CQkvKiBob3AgbGltaXQgZm9yIHR1bm5lbCAqLworCV9fYmUzMiBmbG93aW5mbzsJLyogdHJhZmZpYyBjbGFzcyBhbmQgZmxvd2xhYmVsIGZvciB0dW5uZWwgKi8KKwlfX3UzMiBmbGFnczsJCS8qIHR1bm5lbCBmbGFncyAqLworCXN0cnVjdCBpbjZfYWRkciBsYWRkcjsJLyogbG9jYWwgdHVubmVsIGVuZC1wb2ludCBhZGRyZXNzICovCisJc3RydWN0IGluNl9hZGRyIHJhZGRyOwkvKiByZW1vdGUgdHVubmVsIGVuZC1wb2ludCBhZGRyZXNzICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXBfdnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXBfdnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGViMzgzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcF92cy5oCkBAIC0wLDAgKzEsNDI5IEBACisvKgorICogICAgICBJUCBWaXJ0dWFsIFNlcnZlcgorICogICAgICBkYXRhIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb25hbGl0eSBkZWZpbml0aW9ucworICovCisKKyNpZm5kZWYgX0lQX1ZTX0gKKyNkZWZpbmUgX0lQX1ZTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CS8qIEZvciBfX2JlWFggdHlwZXMgaW4gdXNlcmxhbmQgKi8KKworI2RlZmluZSBJUF9WU19WRVJTSU9OX0NPREUJMHgwMTAyMDEKKyNkZWZpbmUgTlZFUlNJT04odmVyc2lvbikJCQlcCisJKHZlcnNpb24gPj4gMTYpICYgMHhGRiwJCQlcCisJKHZlcnNpb24gPj4gOCkgJiAweEZGLAkJCVwKKwl2ZXJzaW9uICYgMHhGRgorCisvKgorICogICAgICBWaXJ0dWFsIFNlcnZpY2UgRmxhZ3MKKyAqLworI2RlZmluZSBJUF9WU19TVkNfRl9QRVJTSVNURU5UCTB4MDAwMQkJLyogcGVyc2lzdGVudCBwb3J0ICovCisjZGVmaW5lIElQX1ZTX1NWQ19GX0hBU0hFRAkweDAwMDIJCS8qIGhhc2hlZCBlbnRyeSAqLworI2RlZmluZSBJUF9WU19TVkNfRl9PTkVQQUNLRVQJMHgwMDA0CQkvKiBvbmUtcGFja2V0IHNjaGVkdWxpbmcgKi8KKworLyoKKyAqICAgICAgRGVzdGluYXRpb24gU2VydmVyIEZsYWdzCisgKi8KKyNkZWZpbmUgSVBfVlNfREVTVF9GX0FWQUlMQUJMRQkweDAwMDEJCS8qIHNlcnZlciBpcyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgSVBfVlNfREVTVF9GX09WRVJMT0FECTB4MDAwMgkJLyogc2VydmVyIGlzIG92ZXJsb2FkZWQgKi8KKworLyoKKyAqICAgICAgSVBWUyBzeW5jIGRhZW1vbiBzdGF0ZXMKKyAqLworI2RlZmluZSBJUF9WU19TVEFURV9OT05FCTB4MDAwMAkJLyogZGFlbW9uIGlzIHN0b3BwZWQgKi8KKyNkZWZpbmUgSVBfVlNfU1RBVEVfTUFTVEVSCTB4MDAwMQkJLyogc3RhcnRlZCBhcyBtYXN0ZXIgKi8KKyNkZWZpbmUgSVBfVlNfU1RBVEVfQkFDS1VQCTB4MDAwMgkJLyogc3RhcnRlZCBhcyBiYWNrdXAgKi8KKworLyoKKyAqICAgICAgSVBWUyBzb2NrZXQgb3B0aW9ucworICovCisjZGVmaW5lIElQX1ZTX0JBU0VfQ1RMCQkoNjQrMTAyNCs2NCkJCS8qIGJhc2UgKi8KKworI2RlZmluZSBJUF9WU19TT19TRVRfTk9ORQlJUF9WU19CQVNFX0NUTAkJLyoganVzdCBwZWVrICovCisjZGVmaW5lIElQX1ZTX1NPX1NFVF9JTlNFUlQJKElQX1ZTX0JBU0VfQ1RMKzEpCisjZGVmaW5lIElQX1ZTX1NPX1NFVF9BREQJKElQX1ZTX0JBU0VfQ1RMKzIpCisjZGVmaW5lIElQX1ZTX1NPX1NFVF9FRElUCShJUF9WU19CQVNFX0NUTCszKQorI2RlZmluZSBJUF9WU19TT19TRVRfREVMCShJUF9WU19CQVNFX0NUTCs0KQorI2RlZmluZSBJUF9WU19TT19TRVRfRkxVU0gJKElQX1ZTX0JBU0VfQ1RMKzUpCisjZGVmaW5lIElQX1ZTX1NPX1NFVF9MSVNUCShJUF9WU19CQVNFX0NUTCs2KQorI2RlZmluZSBJUF9WU19TT19TRVRfQUREREVTVAkoSVBfVlNfQkFTRV9DVEwrNykKKyNkZWZpbmUgSVBfVlNfU09fU0VUX0RFTERFU1QJKElQX1ZTX0JBU0VfQ1RMKzgpCisjZGVmaW5lIElQX1ZTX1NPX1NFVF9FRElUREVTVAkoSVBfVlNfQkFTRV9DVEwrOSkKKyNkZWZpbmUgSVBfVlNfU09fU0VUX1RJTUVPVVQJKElQX1ZTX0JBU0VfQ1RMKzEwKQorI2RlZmluZSBJUF9WU19TT19TRVRfU1RBUlREQUVNT04gKElQX1ZTX0JBU0VfQ1RMKzExKQorI2RlZmluZSBJUF9WU19TT19TRVRfU1RPUERBRU1PTiAoSVBfVlNfQkFTRV9DVEwrMTIpCisjZGVmaW5lIElQX1ZTX1NPX1NFVF9SRVNUT1JFICAgIChJUF9WU19CQVNFX0NUTCsxMykKKyNkZWZpbmUgSVBfVlNfU09fU0VUX1NBVkUgICAgICAgKElQX1ZTX0JBU0VfQ1RMKzE0KQorI2RlZmluZSBJUF9WU19TT19TRVRfWkVSTwkoSVBfVlNfQkFTRV9DVEwrMTUpCisjZGVmaW5lIElQX1ZTX1NPX1NFVF9NQVgJSVBfVlNfU09fU0VUX1pFUk8KKworI2RlZmluZSBJUF9WU19TT19HRVRfVkVSU0lPTglJUF9WU19CQVNFX0NUTAorI2RlZmluZSBJUF9WU19TT19HRVRfSU5GTwkoSVBfVlNfQkFTRV9DVEwrMSkKKyNkZWZpbmUgSVBfVlNfU09fR0VUX1NFUlZJQ0VTCShJUF9WU19CQVNFX0NUTCsyKQorI2RlZmluZSBJUF9WU19TT19HRVRfU0VSVklDRQkoSVBfVlNfQkFTRV9DVEwrMykKKyNkZWZpbmUgSVBfVlNfU09fR0VUX0RFU1RTCShJUF9WU19CQVNFX0NUTCs0KQorI2RlZmluZSBJUF9WU19TT19HRVRfREVTVAkoSVBfVlNfQkFTRV9DVEwrNSkJLyogbm90IHVzZWQgbm93ICovCisjZGVmaW5lIElQX1ZTX1NPX0dFVF9USU1FT1VUCShJUF9WU19CQVNFX0NUTCs2KQorI2RlZmluZSBJUF9WU19TT19HRVRfREFFTU9OCShJUF9WU19CQVNFX0NUTCs3KQorI2RlZmluZSBJUF9WU19TT19HRVRfTUFYCUlQX1ZTX1NPX0dFVF9EQUVNT04KKworCisvKgorICogICAgICBJUFZTIENvbm5lY3Rpb24gRmxhZ3MKKyAqICAgICAgT25seSBmbGFncyAwLi4xNSBhcmUgc2VudCB0byBiYWNrdXAgc2VydmVyCisgKi8KKyNkZWZpbmUgSVBfVlNfQ09OTl9GX0ZXRF9NQVNLCTB4MDAwNwkJLyogbWFzayBmb3IgdGhlIGZ3ZCBtZXRob2RzICovCisjZGVmaW5lIElQX1ZTX0NPTk5fRl9NQVNRCTB4MDAwMAkJLyogbWFzcXVlcmFkaW5nL05BVCAqLworI2RlZmluZSBJUF9WU19DT05OX0ZfTE9DQUxOT0RFCTB4MDAwMQkJLyogbG9jYWwgbm9kZSAqLworI2RlZmluZSBJUF9WU19DT05OX0ZfVFVOTkVMCTB4MDAwMgkJLyogdHVubmVsaW5nICovCisjZGVmaW5lIElQX1ZTX0NPTk5fRl9EUk9VVEUJMHgwMDAzCQkvKiBkaXJlY3Qgcm91dGluZyAqLworI2RlZmluZSBJUF9WU19DT05OX0ZfQllQQVNTCTB4MDAwNAkJLyogY2FjaGUgYnlwYXNzICovCisjZGVmaW5lIElQX1ZTX0NPTk5fRl9TWU5DCTB4MDAyMAkJLyogZW50cnkgY3JlYXRlZCBieSBzeW5jICovCisjZGVmaW5lIElQX1ZTX0NPTk5fRl9IQVNIRUQJMHgwMDQwCQkvKiBoYXNoZWQgZW50cnkgKi8KKyNkZWZpbmUgSVBfVlNfQ09OTl9GX05PT1VUUFVUCTB4MDA4MAkJLyogbm8gb3V0cHV0IHBhY2tldHMgKi8KKyNkZWZpbmUgSVBfVlNfQ09OTl9GX0lOQUNUSVZFCTB4MDEwMAkJLyogbm90IGVzdGFibGlzaGVkICovCisjZGVmaW5lIElQX1ZTX0NPTk5fRl9PVVRfU0VRCTB4MDIwMAkJLyogbXVzdCBkbyBvdXRwdXQgc2VxIGFkanVzdCAqLworI2RlZmluZSBJUF9WU19DT05OX0ZfSU5fU0VRCTB4MDQwMAkJLyogbXVzdCBkbyBpbnB1dCBzZXEgYWRqdXN0ICovCisjZGVmaW5lIElQX1ZTX0NPTk5fRl9TRVFfTUFTSwkweDA2MDAJCS8qIGluL291dCBzZXF1ZW5jZSBtYXNrICovCisjZGVmaW5lIElQX1ZTX0NPTk5fRl9OT19DUE9SVAkweDA4MDAJCS8qIG5vIGNsaWVudCBwb3J0IHNldCB5ZXQgKi8KKyNkZWZpbmUgSVBfVlNfQ09OTl9GX1RFTVBMQVRFCTB4MTAwMAkJLyogdGVtcGxhdGUsIG5vdCBjb25uZWN0aW9uICovCisjZGVmaW5lIElQX1ZTX0NPTk5fRl9PTkVfUEFDS0VUCTB4MjAwMAkJLyogZm9yd2FyZCBvbmx5IG9uZSBwYWNrZXQgKi8KKworI2RlZmluZSBJUF9WU19DT05OX0ZfQkFDS1VQX01BU0sgKElQX1ZTX0NPTk5fRl9GV0RfTUFTSyB8IFwKKwkJCQkgIElQX1ZTX0NPTk5fRl9OT09VVFBVVCB8IFwKKwkJCQkgIElQX1ZTX0NPTk5fRl9JTkFDVElWRSB8IFwKKwkJCQkgIElQX1ZTX0NPTk5fRl9TRVFfTUFTSyB8IFwKKwkJCQkgIElQX1ZTX0NPTk5fRl9OT19DUE9SVCB8IFwKKwkJCQkgIElQX1ZTX0NPTk5fRl9URU1QTEFURSBcCisJCQkJICkKKworLyogRmxhZ3MgdGhhdCBhcmUgbm90IHNlbnQgdG8gYmFja3VwIHNlcnZlciBzdGFydCBmcm9tIGJpdCAxNiAqLworI2RlZmluZSBJUF9WU19DT05OX0ZfTkZDVAkoMSA8PCAxNikJLyogdXNlIG5ldGZpbHRlciBjb25udHJhY2sgKi8KKworLyogQ29ubmVjdGlvbiBmbGFncyBmcm9tIGRlc3RpbmF0aW9uIHRoYXQgY2FuIGJlIGNoYW5nZWQgYnkgdXNlciBzcGFjZSAqLworI2RlZmluZSBJUF9WU19DT05OX0ZfREVTVF9NQVNLIChJUF9WU19DT05OX0ZfRldEX01BU0sgfCBcCisJCQkJSVBfVlNfQ09OTl9GX09ORV9QQUNLRVQgfCBcCisJCQkJSVBfVlNfQ09OTl9GX05GQ1QgfCBcCisJCQkJMCkKKworI2RlZmluZSBJUF9WU19TQ0hFRE5BTUVfTUFYTEVOCTE2CisjZGVmaW5lIElQX1ZTX1BFTkFNRV9NQVhMRU4JMTYKKyNkZWZpbmUgSVBfVlNfSUZOQU1FX01BWExFTgkxNgorCisjZGVmaW5lIElQX1ZTX1BFREFUQV9NQVhMRU4gICAgIDI1NQorCisvKgorICoJVGhlIHN0cnVjdCBpcF92c19zZXJ2aWNlX3VzZXIgYW5kIHN0cnVjdCBpcF92c19kZXN0X3VzZXIgYXJlCisgKgl1c2VkIHRvIHNldCBJUFZTIHJ1bGVzIHRocm91Z2ggc2V0c29ja29wdC4KKyAqLworc3RydWN0IGlwX3ZzX3NlcnZpY2VfdXNlciB7CisJLyogdmlydHVhbCBzZXJ2aWNlIGFkZHJlc3NlcyAqLworCV9fdTE2CQlwcm90b2NvbDsKKwlfX2JlMzIJCQlhZGRyOwkJLyogdmlydHVhbCBpcCBhZGRyZXNzICovCisJX19iZTE2CQkJcG9ydDsKKwlfX3UzMgkJZndtYXJrOwkJLyogZmlyd2FsbCBtYXJrIG9mIHNlcnZpY2UgKi8KKworCS8qIHZpcnR1YWwgc2VydmljZSBvcHRpb25zICovCisJY2hhcgkJCXNjaGVkX25hbWVbSVBfVlNfU0NIRUROQU1FX01BWExFTl07CisJdW5zaWduZWQJCWZsYWdzOwkJLyogdmlydHVhbCBzZXJ2aWNlIGZsYWdzICovCisJdW5zaWduZWQJCXRpbWVvdXQ7CS8qIHBlcnNpc3RlbnQgdGltZW91dCBpbiBzZWMgKi8KKwlfX2JlMzIJCQluZXRtYXNrOwkvKiBwZXJzaXN0ZW50IG5ldG1hc2sgKi8KK307CisKKworc3RydWN0IGlwX3ZzX2Rlc3RfdXNlciB7CisJLyogZGVzdGluYXRpb24gc2VydmVyIGFkZHJlc3MgKi8KKwlfX2JlMzIJCQlhZGRyOworCV9fYmUxNgkJCXBvcnQ7CisKKwkvKiByZWFsIHNlcnZlciBvcHRpb25zICovCisJdW5zaWduZWQJCWNvbm5fZmxhZ3M7CS8qIGNvbm5lY3Rpb24gZmxhZ3MgKi8KKwlpbnQJCQl3ZWlnaHQ7CQkvKiBkZXN0aW5hdGlvbiB3ZWlnaHQgKi8KKworCS8qIHRocmVzaG9sZHMgZm9yIGFjdGl2ZSBjb25uZWN0aW9ucyAqLworCV9fdTMyCQl1X3RocmVzaG9sZDsJLyogdXBwZXIgdGhyZXNob2xkICovCisJX191MzIJCWxfdGhyZXNob2xkOwkvKiBsb3dlciB0aHJlc2hvbGQgKi8KK307CisKKworLyoKKyAqCUlQVlMgc3RhdGlzdGljcyBvYmplY3QgKGZvciB1c2VyIHNwYWNlKQorICovCitzdHJ1Y3QgaXBfdnNfc3RhdHNfdXNlciB7CisJX191MzIgICAgICAgICAgICAgICAgICAgY29ubnM7ICAgICAgICAgIC8qIGNvbm5lY3Rpb25zIHNjaGVkdWxlZCAqLworCV9fdTMyICAgICAgICAgICAgICAgICAgIGlucGt0czsgICAgICAgICAvKiBpbmNvbWluZyBwYWNrZXRzICovCisJX191MzIgICAgICAgICAgICAgICAgICAgb3V0cGt0czsgICAgICAgIC8qIG91dGdvaW5nIHBhY2tldHMgKi8KKwlfX3U2NCAgICAgICAgICAgICAgICAgICBpbmJ5dGVzOyAgICAgICAgLyogaW5jb21pbmcgYnl0ZXMgKi8KKwlfX3U2NCAgICAgICAgICAgICAgICAgICBvdXRieXRlczsgICAgICAgLyogb3V0Z29pbmcgYnl0ZXMgKi8KKworCV9fdTMyCQkJY3BzOwkJLyogY3VycmVudCBjb25uZWN0aW9uIHJhdGUgKi8KKwlfX3UzMgkJCWlucHBzOwkJLyogY3VycmVudCBpbiBwYWNrZXQgcmF0ZSAqLworCV9fdTMyCQkJb3V0cHBzOwkJLyogY3VycmVudCBvdXQgcGFja2V0IHJhdGUgKi8KKwlfX3UzMgkJCWluYnBzOwkJLyogY3VycmVudCBpbiBieXRlIHJhdGUgKi8KKwlfX3UzMgkJCW91dGJwczsJCS8qIGN1cnJlbnQgb3V0IGJ5dGUgcmF0ZSAqLworfTsKKworCisvKiBUaGUgYXJndW1lbnQgdG8gSVBfVlNfU09fR0VUX0lORk8gKi8KK3N0cnVjdCBpcF92c19nZXRpbmZvIHsKKwkvKiB2ZXJzaW9uIG51bWJlciAqLworCXVuc2lnbmVkIGludAkJdmVyc2lvbjsKKworCS8qIHNpemUgb2YgY29ubmVjdGlvbiBoYXNoIHRhYmxlICovCisJdW5zaWduZWQgaW50CQlzaXplOworCisJLyogbnVtYmVyIG9mIHZpcnR1YWwgc2VydmljZXMgKi8KKwl1bnNpZ25lZCBpbnQJCW51bV9zZXJ2aWNlczsKK307CisKKworLyogVGhlIGFyZ3VtZW50IHRvIElQX1ZTX1NPX0dFVF9TRVJWSUNFICovCitzdHJ1Y3QgaXBfdnNfc2VydmljZV9lbnRyeSB7CisJLyogd2hpY2ggc2VydmljZTogdXNlciBmaWxscyBpbiB0aGVzZSAqLworCV9fdTE2CQlwcm90b2NvbDsKKwlfX2JlMzIJCQlhZGRyOwkJLyogdmlydHVhbCBhZGRyZXNzICovCisJX19iZTE2CQkJcG9ydDsKKwlfX3UzMgkJZndtYXJrOwkJLyogZmlyd2FsbCBtYXJrIG9mIHNlcnZpY2UgKi8KKworCS8qIHNlcnZpY2Ugb3B0aW9ucyAqLworCWNoYXIJCQlzY2hlZF9uYW1lW0lQX1ZTX1NDSEVETkFNRV9NQVhMRU5dOworCXVuc2lnbmVkCQlmbGFnczsgICAgICAgICAgLyogdmlydHVhbCBzZXJ2aWNlIGZsYWdzICovCisJdW5zaWduZWQJCXRpbWVvdXQ7CS8qIHBlcnNpc3RlbnQgdGltZW91dCAqLworCV9fYmUzMgkJCW5ldG1hc2s7CS8qIHBlcnNpc3RlbnQgbmV0bWFzayAqLworCisJLyogbnVtYmVyIG9mIHJlYWwgc2VydmVycyAqLworCXVuc2lnbmVkIGludAkJbnVtX2Rlc3RzOworCisJLyogc3RhdGlzdGljcyAqLworCXN0cnVjdCBpcF92c19zdGF0c191c2VyIHN0YXRzOworfTsKKworCitzdHJ1Y3QgaXBfdnNfZGVzdF9lbnRyeSB7CisJX19iZTMyCQkJYWRkcjsJCS8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlfX2JlMTYJCQlwb3J0OworCXVuc2lnbmVkCQljb25uX2ZsYWdzOwkvKiBjb25uZWN0aW9uIGZsYWdzICovCisJaW50CQkJd2VpZ2h0OwkJLyogZGVzdGluYXRpb24gd2VpZ2h0ICovCisKKwlfX3UzMgkJdV90aHJlc2hvbGQ7CS8qIHVwcGVyIHRocmVzaG9sZCAqLworCV9fdTMyCQlsX3RocmVzaG9sZDsJLyogbG93ZXIgdGhyZXNob2xkICovCisKKwlfX3UzMgkJYWN0aXZlY29ubnM7CS8qIGFjdGl2ZSBjb25uZWN0aW9ucyAqLworCV9fdTMyCQlpbmFjdGNvbm5zOwkvKiBpbmFjdGl2ZSBjb25uZWN0aW9ucyAqLworCV9fdTMyCQlwZXJzaXN0Y29ubnM7CS8qIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgKi8KKworCS8qIHN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgaXBfdnNfc3RhdHNfdXNlciBzdGF0czsKK307CisKKworLyogVGhlIGFyZ3VtZW50IHRvIElQX1ZTX1NPX0dFVF9ERVNUUyAqLworc3RydWN0IGlwX3ZzX2dldF9kZXN0cyB7CisJLyogd2hpY2ggc2VydmljZTogdXNlciBmaWxscyBpbiB0aGVzZSAqLworCV9fdTE2CQlwcm90b2NvbDsKKwlfX2JlMzIJCQlhZGRyOwkJLyogdmlydHVhbCBhZGRyZXNzICovCisJX19iZTE2CQkJcG9ydDsKKwlfX3UzMgkJZndtYXJrOwkJLyogZmlyd2FsbCBtYXJrIG9mIHNlcnZpY2UgKi8KKworCS8qIG51bWJlciBvZiByZWFsIHNlcnZlcnMgKi8KKwl1bnNpZ25lZCBpbnQJCW51bV9kZXN0czsKKworCS8qIHRoZSByZWFsIHNlcnZlcnMgKi8KKwlzdHJ1Y3QgaXBfdnNfZGVzdF9lbnRyeQllbnRyeXRhYmxlWzBdOworfTsKKworCisvKiBUaGUgYXJndW1lbnQgdG8gSVBfVlNfU09fR0VUX1NFUlZJQ0VTICovCitzdHJ1Y3QgaXBfdnNfZ2V0X3NlcnZpY2VzIHsKKwkvKiBudW1iZXIgb2YgdmlydHVhbCBzZXJ2aWNlcyAqLworCXVuc2lnbmVkIGludAkJbnVtX3NlcnZpY2VzOworCisJLyogc2VydmljZSB0YWJsZSAqLworCXN0cnVjdCBpcF92c19zZXJ2aWNlX2VudHJ5IGVudHJ5dGFibGVbMF07Cit9OworCisKKy8qIFRoZSBhcmd1bWVudCB0byBJUF9WU19TT19HRVRfVElNRU9VVCAqLworc3RydWN0IGlwX3ZzX3RpbWVvdXRfdXNlciB7CisJaW50CQkJdGNwX3RpbWVvdXQ7CisJaW50CQkJdGNwX2Zpbl90aW1lb3V0OworCWludAkJCXVkcF90aW1lb3V0OworfTsKKworCisvKiBUaGUgYXJndW1lbnQgdG8gSVBfVlNfU09fR0VUX0RBRU1PTiAqLworc3RydWN0IGlwX3ZzX2RhZW1vbl91c2VyIHsKKwkvKiBzeW5jIGRhZW1vbiBzdGF0ZSAobWFzdGVyL2JhY2t1cCkgKi8KKwlpbnQJCQlzdGF0ZTsKKworCS8qIG11bHRpY2FzdCBpbnRlcmZhY2UgbmFtZSAqLworCWNoYXIJCQltY2FzdF9pZm5bSVBfVlNfSUZOQU1FX01BWExFTl07CisKKwkvKiBTeW5jSUQgd2UgYmVsb25nIHRvICovCisJaW50CQkJc3luY2lkOworfTsKKworLyoKKyAqCisgKiBJUFZTIEdlbmVyaWMgTmV0bGluayBpbnRlcmZhY2UgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworLyogR2VuZXJpYyBOZXRsaW5rIGZhbWlseSBpbmZvICovCisKKyNkZWZpbmUgSVBWU19HRU5MX05BTUUJCSJJUFZTIgorI2RlZmluZSBJUFZTX0dFTkxfVkVSU0lPTgkweDEKKworc3RydWN0IGlwX3ZzX2ZsYWdzIHsKKwlfX2JlMzIgZmxhZ3M7CisJX19iZTMyIG1hc2s7Cit9OworCisvKiBHZW5lcmljIE5ldGxpbmsgY29tbWFuZCBhdHRyaWJ1dGVzICovCitlbnVtIHsKKwlJUFZTX0NNRF9VTlNQRUMgPSAwLAorCisJSVBWU19DTURfTkVXX1NFUlZJQ0UsCQkvKiBhZGQgc2VydmljZSAqLworCUlQVlNfQ01EX1NFVF9TRVJWSUNFLAkJLyogbW9kaWZ5IHNlcnZpY2UgKi8KKwlJUFZTX0NNRF9ERUxfU0VSVklDRSwJCS8qIGRlbGV0ZSBzZXJ2aWNlICovCisJSVBWU19DTURfR0VUX1NFUlZJQ0UsCQkvKiBnZXQgc2VydmljZSBpbmZvICovCisKKwlJUFZTX0NNRF9ORVdfREVTVCwJCS8qIGFkZCBkZXN0aW5hdGlvbiAqLworCUlQVlNfQ01EX1NFVF9ERVNULAkJLyogbW9kaWZ5IGRlc3RpbmF0aW9uICovCisJSVBWU19DTURfREVMX0RFU1QsCQkvKiBkZWxldGUgZGVzdGluYXRpb24gKi8KKwlJUFZTX0NNRF9HRVRfREVTVCwJCS8qIGdldCBkZXN0aW5hdGlvbiBpbmZvICovCisKKwlJUFZTX0NNRF9ORVdfREFFTU9OLAkJLyogc3RhcnQgc3luYyBkYWVtb24gKi8KKwlJUFZTX0NNRF9ERUxfREFFTU9OLAkJLyogc3RvcCBzeW5jIGRhZW1vbiAqLworCUlQVlNfQ01EX0dFVF9EQUVNT04sCQkvKiBnZXQgc3luYyBkYWVtb24gc3RhdHVzICovCisKKwlJUFZTX0NNRF9TRVRfQ09ORklHLAkJLyogc2V0IGNvbmZpZyBzZXR0aW5ncyAqLworCUlQVlNfQ01EX0dFVF9DT05GSUcsCQkvKiBnZXQgY29uZmlnIHNldHRpbmdzICovCisKKwlJUFZTX0NNRF9TRVRfSU5GTywJCS8qIG9ubHkgdXNlZCBpbiBHRVRfSU5GTyByZXBseSAqLworCUlQVlNfQ01EX0dFVF9JTkZPLAkJLyogZ2V0IGdlbmVyYWwgSVBWUyBpbmZvICovCisKKwlJUFZTX0NNRF9aRVJPLAkJCS8qIHplcm8gYWxsIGNvdW50ZXJzIGFuZCBzdGF0cyAqLworCUlQVlNfQ01EX0ZMVVNILAkJCS8qIGZsdXNoIHNlcnZpY2VzIGFuZCBkZXN0cyAqLworCisJX19JUFZTX0NNRF9NQVgsCit9OworCisjZGVmaW5lIElQVlNfQ01EX01BWCAoX19JUFZTX0NNRF9NQVggLSAxKQorCisvKiBBdHRyaWJ1dGVzIHVzZWQgaW4gdGhlIGZpcnN0IGxldmVsIG9mIGNvbW1hbmRzICovCitlbnVtIHsKKwlJUFZTX0NNRF9BVFRSX1VOU1BFQyA9IDAsCisJSVBWU19DTURfQVRUUl9TRVJWSUNFLAkJLyogbmVzdGVkIHNlcnZpY2UgYXR0cmlidXRlICovCisJSVBWU19DTURfQVRUUl9ERVNULAkJLyogbmVzdGVkIGRlc3RpbmF0aW9uIGF0dHJpYnV0ZSAqLworCUlQVlNfQ01EX0FUVFJfREFFTU9OLAkJLyogbmVzdGVkIHN5bmMgZGFlbW9uIGF0dHJpYnV0ZSAqLworCUlQVlNfQ01EX0FUVFJfVElNRU9VVF9UQ1AsCS8qIFRDUCBjb25uZWN0aW9uIHRpbWVvdXQgKi8KKwlJUFZTX0NNRF9BVFRSX1RJTUVPVVRfVENQX0ZJTiwJLyogVENQIEZJTiB3YWl0IHRpbWVvdXQgKi8KKwlJUFZTX0NNRF9BVFRSX1RJTUVPVVRfVURQLAkvKiBVRFAgdGltZW91dCAqLworCV9fSVBWU19DTURfQVRUUl9NQVgsCit9OworCisjZGVmaW5lIElQVlNfQ01EX0FUVFJfTUFYIChfX0lQVlNfU1ZDX0FUVFJfTUFYIC0gMSkKKworLyoKKyAqIEF0dHJpYnV0ZXMgdXNlZCB0byBkZXNjcmliZSBhIHNlcnZpY2UKKyAqCisgKiBVc2VkIGluc2lkZSBuZXN0ZWQgYXR0cmlidXRlIElQVlNfQ01EX0FUVFJfU0VSVklDRQorICovCitlbnVtIHsKKwlJUFZTX1NWQ19BVFRSX1VOU1BFQyA9IDAsCisJSVBWU19TVkNfQVRUUl9BRiwJCS8qIGFkZHJlc3MgZmFtaWx5ICovCisJSVBWU19TVkNfQVRUUl9QUk9UT0NPTCwJCS8qIHZpcnR1YWwgc2VydmljZSBwcm90b2NvbCAqLworCUlQVlNfU1ZDX0FUVFJfQUREUiwJCS8qIHZpcnR1YWwgc2VydmljZSBhZGRyZXNzICovCisJSVBWU19TVkNfQVRUUl9QT1JULAkJLyogdmlydHVhbCBzZXJ2aWNlIHBvcnQgKi8KKwlJUFZTX1NWQ19BVFRSX0ZXTUFSSywJCS8qIGZpcmV3YWxsIG1hcmsgb2Ygc2VydmljZSAqLworCisJSVBWU19TVkNfQVRUUl9TQ0hFRF9OQU1FLAkvKiBuYW1lIG9mIHNjaGVkdWxlciAqLworCUlQVlNfU1ZDX0FUVFJfRkxBR1MsCQkvKiB2aXJ0dWFsIHNlcnZpY2UgZmxhZ3MgKi8KKwlJUFZTX1NWQ19BVFRSX1RJTUVPVVQsCQkvKiBwZXJzaXN0ZW50IHRpbWVvdXQgKi8KKwlJUFZTX1NWQ19BVFRSX05FVE1BU0ssCQkvKiBwZXJzaXN0ZW50IG5ldG1hc2sgKi8KKworCUlQVlNfU1ZDX0FUVFJfU1RBVFMsCQkvKiBuZXN0ZWQgYXR0cmlidXRlIGZvciBzZXJ2aWNlIHN0YXRzICovCisKKwlJUFZTX1NWQ19BVFRSX1BFX05BTUUsCQkvKiBuYW1lIG9mIGN0IHJldHJpZXZlciAqLworCisJX19JUFZTX1NWQ19BVFRSX01BWCwKK307CisKKyNkZWZpbmUgSVBWU19TVkNfQVRUUl9NQVggKF9fSVBWU19TVkNfQVRUUl9NQVggLSAxKQorCisvKgorICogQXR0cmlidXRlcyB1c2VkIHRvIGRlc2NyaWJlIGEgZGVzdGluYXRpb24gKHJlYWwgc2VydmVyKQorICoKKyAqIFVzZWQgaW5zaWRlIG5lc3RlZCBhdHRyaWJ1dGUgSVBWU19DTURfQVRUUl9ERVNUCisgKi8KK2VudW0geworCUlQVlNfREVTVF9BVFRSX1VOU1BFQyA9IDAsCisJSVBWU19ERVNUX0FUVFJfQUREUiwJCS8qIHJlYWwgc2VydmVyIGFkZHJlc3MgKi8KKwlJUFZTX0RFU1RfQVRUUl9QT1JULAkJLyogcmVhbCBzZXJ2ZXIgcG9ydCAqLworCisJSVBWU19ERVNUX0FUVFJfRldEX01FVEhPRCwJLyogZm9yd2FyZGluZyBtZXRob2QgKi8KKwlJUFZTX0RFU1RfQVRUUl9XRUlHSFQsCQkvKiBkZXN0aW5hdGlvbiB3ZWlnaHQgKi8KKworCUlQVlNfREVTVF9BVFRSX1VfVEhSRVNILAkvKiB1cHBlciB0aHJlc2hvbGQgKi8KKwlJUFZTX0RFU1RfQVRUUl9MX1RIUkVTSCwJLyogbG93ZXIgdGhyZXNob2xkICovCisKKwlJUFZTX0RFU1RfQVRUUl9BQ1RJVkVfQ09OTlMsCS8qIGFjdGl2ZSBjb25uZWN0aW9ucyAqLworCUlQVlNfREVTVF9BVFRSX0lOQUNUX0NPTk5TLAkvKiBpbmFjdGl2ZSBjb25uZWN0aW9ucyAqLworCUlQVlNfREVTVF9BVFRSX1BFUlNJU1RfQ09OTlMsCS8qIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgKi8KKworCUlQVlNfREVTVF9BVFRSX1NUQVRTLAkJLyogbmVzdGVkIGF0dHJpYnV0ZSBmb3IgZGVzdCBzdGF0cyAqLworCV9fSVBWU19ERVNUX0FUVFJfTUFYLAorfTsKKworI2RlZmluZSBJUFZTX0RFU1RfQVRUUl9NQVggKF9fSVBWU19ERVNUX0FUVFJfTUFYIC0gMSkKKworLyoKKyAqIEF0dHJpYnV0ZXMgZGVzY3JpYmluZyBhIHN5bmMgZGFlbW9uCisgKgorICogVXNlZCBpbnNpZGUgbmVzdGVkIGF0dHJpYnV0ZSBJUFZTX0NNRF9BVFRSX0RBRU1PTgorICovCitlbnVtIHsKKwlJUFZTX0RBRU1PTl9BVFRSX1VOU1BFQyA9IDAsCisJSVBWU19EQUVNT05fQVRUUl9TVEFURSwJCS8qIHN5bmMgZGFlbW9uIHN0YXRlIChtYXN0ZXIvYmFja3VwKSAqLworCUlQVlNfREFFTU9OX0FUVFJfTUNBU1RfSUZOLAkvKiBtdWx0aWNhc3QgaW50ZXJmYWNlIG5hbWUgKi8KKwlJUFZTX0RBRU1PTl9BVFRSX1NZTkNfSUQsCS8qIFN5bmNJRCB3ZSBiZWxvbmcgdG8gKi8KKwlfX0lQVlNfREFFTU9OX0FUVFJfTUFYLAorfTsKKworI2RlZmluZSBJUFZTX0RBRU1PTl9BVFRSX01BWCAoX19JUFZTX0RBRU1PTl9BVFRSX01BWCAtIDEpCisKKy8qCisgKiBBdHRyaWJ1dGVzIHVzZWQgdG8gZGVzY3JpYmUgc2VydmljZSBvciBkZXN0aW5hdGlvbiBlbnRyeSBzdGF0aXN0aWNzCisgKgorICogVXNlZCBpbnNpZGUgbmVzdGVkIGF0dHJpYnV0ZXMgSVBWU19TVkNfQVRUUl9TVEFUUyBhbmQgSVBWU19ERVNUX0FUVFJfU1RBVFMKKyAqLworZW51bSB7CisJSVBWU19TVEFUU19BVFRSX1VOU1BFQyA9IDAsCisJSVBWU19TVEFUU19BVFRSX0NPTk5TLAkJLyogY29ubmVjdGlvbnMgc2NoZWR1bGVkICovCisJSVBWU19TVEFUU19BVFRSX0lOUEtUUywJCS8qIGluY29taW5nIHBhY2tldHMgKi8KKwlJUFZTX1NUQVRTX0FUVFJfT1VUUEtUUywJLyogb3V0Z29pbmcgcGFja2V0cyAqLworCUlQVlNfU1RBVFNfQVRUUl9JTkJZVEVTLAkvKiBpbmNvbWluZyBieXRlcyAqLworCUlQVlNfU1RBVFNfQVRUUl9PVVRCWVRFUywJLyogb3V0Z29pbmcgYnl0ZXMgKi8KKworCUlQVlNfU1RBVFNfQVRUUl9DUFMsCQkvKiBjdXJyZW50IGNvbm5lY3Rpb24gcmF0ZSAqLworCUlQVlNfU1RBVFNfQVRUUl9JTlBQUywJCS8qIGN1cnJlbnQgaW4gcGFja2V0IHJhdGUgKi8KKwlJUFZTX1NUQVRTX0FUVFJfT1VUUFBTLAkJLyogY3VycmVudCBvdXQgcGFja2V0IHJhdGUgKi8KKwlJUFZTX1NUQVRTX0FUVFJfSU5CUFMsCQkvKiBjdXJyZW50IGluIGJ5dGUgcmF0ZSAqLworCUlQVlNfU1RBVFNfQVRUUl9PVVRCUFMsCQkvKiBjdXJyZW50IG91dCBieXRlIHJhdGUgKi8KKwlfX0lQVlNfU1RBVFNfQVRUUl9NQVgsCit9OworCisjZGVmaW5lIElQVlNfU1RBVFNfQVRUUl9NQVggKF9fSVBWU19TVEFUU19BVFRSX01BWCAtIDEpCisKKy8qIEF0dHJpYnV0ZXMgdXNlZCBpbiByZXNwb25zZSB0byBJUFZTX0NNRF9HRVRfSU5GTyBjb21tYW5kICovCitlbnVtIHsKKwlJUFZTX0lORk9fQVRUUl9VTlNQRUMgPSAwLAorCUlQVlNfSU5GT19BVFRSX1ZFUlNJT04sCQkvKiBJUFZTIHZlcnNpb24gbnVtYmVyICovCisJSVBWU19JTkZPX0FUVFJfQ09OTl9UQUJfU0laRSwJLyogc2l6ZSBvZiBjb25uZWN0aW9uIGhhc2ggdGFibGUgKi8KKwlfX0lQVlNfSU5GT19BVFRSX01BWCwKK307CisKKyNkZWZpbmUgSVBWU19JTkZPX0FUVFJfTUFYIChfX0lQVlNfSU5GT19BVFRSX01BWCAtIDEpCisKKyNlbmRpZgkvKiBfSVBfVlNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcGMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhNTNhMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXBjLmgKQEAgLTAsMCArMSw4MSBAQAorI2lmbmRlZiBfTElOVVhfSVBDX0gKKyNkZWZpbmUgX0xJTlVYX0lQQ19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIElQQ19QUklWQVRFICgoX19rZXJuZWxfa2V5X3QpIDApICAKKworLyogT2Jzb2xldGUsIHVzZWQgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgYW5kIGxpYmM1IGNvbXBpbGVzICovCitzdHJ1Y3QgaXBjX3Blcm0KK3sKKwlfX2tlcm5lbF9rZXlfdAlrZXk7CisJX19rZXJuZWxfdWlkX3QJdWlkOworCV9fa2VybmVsX2dpZF90CWdpZDsKKwlfX2tlcm5lbF91aWRfdAljdWlkOworCV9fa2VybmVsX2dpZF90CWNnaWQ7CisJX19rZXJuZWxfbW9kZV90CW1vZGU7IAorCXVuc2lnbmVkIHNob3J0CXNlcTsKK307CisKKy8qIEluY2x1ZGUgdGhlIGRlZmluaXRpb24gb2YgaXBjNjRfcGVybSAqLworI2luY2x1ZGUgPGFzbS9pcGNidWYuaD4KKworLyogcmVzb3VyY2UgZ2V0IHJlcXVlc3QgZmxhZ3MgKi8KKyNkZWZpbmUgSVBDX0NSRUFUICAwMDAwMTAwMCAgIC8qIGNyZWF0ZSBpZiBrZXkgaXMgbm9uZXhpc3RlbnQgKi8KKyNkZWZpbmUgSVBDX0VYQ0wgICAwMDAwMjAwMCAgIC8qIGZhaWwgaWYga2V5IGV4aXN0cyAqLworI2RlZmluZSBJUENfTk9XQUlUIDAwMDA0MDAwICAgLyogcmV0dXJuIGVycm9yIG9uIHdhaXQgKi8KKworLyogdGhlc2UgZmllbGRzIGFyZSB1c2VkIGJ5IHRoZSBESVBDIHBhY2thZ2Ugc28gdGhlIGtlcm5lbCBhcyBzdGFuZGFyZAorICAgc2hvdWxkIGF2b2lkIHVzaW5nIHRoZW0gaWYgcG9zc2libGUgKi8KKyAgIAorI2RlZmluZSBJUENfRElQQyAwMDAxMDAwMCAgLyogbWFrZSBpdCBkaXN0cmlidXRlZCAqLworI2RlZmluZSBJUENfT1dOICAwMDAyMDAwMCAgLyogdGhpcyBtYWNoaW5lIGlzIHRoZSBESVBDIG93bmVyICovCisKKy8qIAorICogQ29udHJvbCBjb21tYW5kcyB1c2VkIHdpdGggc2VtY3RsLCBtc2djdGwgYW5kIHNobWN0bCAKKyAqIHNlZSBhbHNvIHNwZWNpZmljIGNvbW1hbmRzIGluIHNlbS5oLCBtc2cuaCBhbmQgc2htLmgKKyAqLworI2RlZmluZSBJUENfUk1JRCAwICAgICAvKiByZW1vdmUgcmVzb3VyY2UgKi8KKyNkZWZpbmUgSVBDX1NFVCAgMSAgICAgLyogc2V0IGlwY19wZXJtIG9wdGlvbnMgKi8KKyNkZWZpbmUgSVBDX1NUQVQgMiAgICAgLyogZ2V0IGlwY19wZXJtIG9wdGlvbnMgKi8KKyNkZWZpbmUgSVBDX0lORk8gMyAgICAgLyogc2VlIGlwY3MgKi8KKworLyoKKyAqIFZlcnNpb24gZmxhZ3MgZm9yIHNlbWN0bCwgbXNnY3RsLCBhbmQgc2htY3RsIGNvbW1hbmRzCisgKiBUaGVzZSBhcmUgcGFzc2VkIGFzIGJpdGZsYWdzIG9yLWVkIHdpdGggdGhlIGFjdHVhbCBjb21tYW5kCisgKi8KKyNkZWZpbmUgSVBDX09MRCAwCS8qIE9sZCB2ZXJzaW9uIChubyAzMi1iaXQgVUlEIHN1cHBvcnQgb24gbWFueQorCQkJICAgYXJjaGl0ZWN0dXJlcykgKi8KKyNkZWZpbmUgSVBDXzY0ICAweDAxMDAgIC8qIE5ldyB2ZXJzaW9uIChzdXBwb3J0IDMyLWJpdCBVSURzLCBiaWdnZXIKKwkJCSAgIG1lc3NhZ2Ugc2l6ZXMsIGV0Yy4gKi8KKworLyoKKyAqIFRoZXNlIGFyZSB1c2VkIHRvIHdyYXAgc3lzdGVtIGNhbGxzLgorICoKKyAqIFNlZSBhcmNoaXRlY3R1cmUgY29kZSBmb3IgdWdseSBkZXRhaWxzLi4KKyAqLworc3RydWN0IGlwY19rbHVkZ2UgeworCXN0cnVjdCBtc2didWYgKm1zZ3A7CisJbG9uZyBtc2d0eXA7Cit9OworCisjZGVmaW5lIFNFTU9QCQkgMQorI2RlZmluZSBTRU1HRVQJCSAyCisjZGVmaW5lIFNFTUNUTAkJIDMKKyNkZWZpbmUgU0VNVElNRURPUAkgNAorI2RlZmluZSBNU0dTTkQJCTExCisjZGVmaW5lIE1TR1JDVgkJMTIKKyNkZWZpbmUgTVNHR0VUCQkxMworI2RlZmluZSBNU0dDVEwJCTE0CisjZGVmaW5lIFNITUFUCQkyMQorI2RlZmluZSBTSE1EVAkJMjIKKyNkZWZpbmUgU0hNR0VUCQkyMworI2RlZmluZSBTSE1DVEwJCTI0CisKKy8qIFVzZWQgYnkgdGhlIERJUEMgcGFja2FnZSwgdHJ5IGFuZCBhdm9pZCByZXVzaW5nIGl0ICovCisjZGVmaW5lIERJUEMgICAgICAgICAgICAyNQorCisjZGVmaW5lIElQQ0NBTEwodmVyc2lvbixvcCkJKCh2ZXJzaW9uKTw8MTYgfCAob3ApKQorCisKKyNlbmRpZiAvKiBfTElOVVhfSVBDX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXBtaS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcG1pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmZTVlNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXBtaS5oCkBAIC0wLDAgKzEsNDU2IEBACisvKgorICogaXBtaS5oCisgKgorICogTW9udGFWaXN0YSBJUE1JIGludGVyZmFjZQorICoKKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogICAgICAgICBDb3JleSBNaW55YXJkIDxtaW55YXJkQG12aXN0YS5jb20+CisgKiAgICAgICAgIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogQ29weXJpZ2h0IDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgKiAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0lQTUlfSAorI2RlZmluZSBfX0xJTlVYX0lQTUlfSAorCisjaW5jbHVkZSA8bGludXgvaXBtaV9tc2dkZWZzLmg+CisKKworLyoKKyAqIFRoaXMgZmlsZSBkZXNjcmliZXMgYW4gaW50ZXJmYWNlIHRvIGFuIElQTUkgZHJpdmVyLiAgWW91IGhhdmUgdG8KKyAqIGhhdmUgYSBmYWlybHkgZ29vZCB1bmRlcnN0YW5kaW5nIG9mIElQTUkgdG8gdXNlIHRoaXMsIHNvIGdvIHJlYWQKKyAqIHRoZSBzcGVjcyBmaXJzdCBiZWZvcmUgYWN0dWFsbHkgdHJ5aW5nIHRvIGRvIGFueXRoaW5nLgorICoKKyAqIFdpdGggdGhhdCBzYWlkLCB0aGlzIGRyaXZlciBwcm92aWRlcyBhIG11bHRpLXVzZXIgaW50ZXJmYWNlIHRvIHRoZQorICogSVBNSSBkcml2ZXIsIGFuZCBpdCBhbGxvd3MgbXVsdGlwbGUgSVBNSSBwaHlzaWNhbCBpbnRlcmZhY2VzIGJlbG93CisgKiB0aGUgZHJpdmVyLiAgVGhlIHBoeXNpY2FsIGludGVyZmFjZXMgYmluZCBhcyBhIGxvd2VyIGxheWVyIG9uIHRoZQorICogZHJpdmVyLiAgVGhleSBhcHBlYXIgYXMgaW50ZXJmYWNlcyB0byB0aGUgYXBwbGljYXRpb24gdXNpbmcgdGhpcworICogaW50ZXJmYWNlLgorICoKKyAqIE11bHRpLXVzZXIgbWVhbnMgdGhhdCBtdWx0aXBsZSBhcHBsaWNhdGlvbnMgbWF5IHVzZSB0aGUgZHJpdmVyLAorICogc2VuZCBjb21tYW5kcywgcmVjZWl2ZSByZXNwb25zZXMsIGV0Yy4gIFRoZSBkcml2ZXIga2VlcHMgdHJhY2sgb2YKKyAqIGNvbW1hbmRzIHRoZSB1c2VyIHNlbmRzIGFuZCB0cmFja3MgdGhlIHJlc3BvbnNlcy4gIFRoZSByZXNwb25zZXMKKyAqIHdpbGwgZ28gYmFjayB0byB0aGUgYXBwbGljYXRpb24gdGhhdCBzZW5kIHRoZSBjb21tYW5kLiAgSWYgdGhlCisgKiByZXNwb25zZSBkb2Vzbid0IGNvbWUgYmFjayBpbiB0aW1lLCB0aGUgZHJpdmVyIHdpbGwgcmV0dXJuIGEKKyAqIHRpbWVvdXQgZXJyb3IgcmVzcG9uc2UgdG8gdGhlIGFwcGxpY2F0aW9uLiAgQXN5bmNocm9ub3VzIGV2ZW50cworICogZnJvbSB0aGUgQk1DIGV2ZW50IHF1ZXVlIHdpbGwgZ28gdG8gYWxsIHVzZXJzIGJvdW5kIHRvIHRoZSBkcml2ZXIuCisgKiBUaGUgaW5jb21pbmcgZXZlbnQgcXVldWUgaW4gdGhlIEJNQyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZmx1c2hlZAorICogaWYgaXQgYmVjb21lcyBmdWxsIGFuZCBpdCBpcyBxdWVyaWVkIG9uY2UgYSBzZWNvbmQgdG8gc2VlIGlmCisgKiBhbnl0aGluZyBpcyBpbiBpdC4gIEluY29taW5nIGNvbW1hbmRzIHRvIHRoZSBkcml2ZXIgd2lsbCBnZXQKKyAqIGRlbGl2ZXJlZCBhcyBjb21tYW5kcy4KKyAqCisgKiBUaGlzIGRyaXZlciBwcm92aWRlcyB0d28gbWFpbiBpbnRlcmZhY2VzOiBvbmUgZm9yIGluLWtlcm5lbAorICogYXBwbGljYXRpb25zIGFuZCBhbm90aGVyIGZvciB1c2VybGFuZCBhcHBsaWNhdGlvbnMuICBUaGUKKyAqIGNhcGFiaWxpdGllcyBhcmUgYmFzaWNhbGx5IHRoZSBzYW1lIGZvciBib3RoIGludGVyZmFjZSwgYWx0aG91Z2gKKyAqIHRoZSBpbnRlcmZhY2VzIGFyZSBzb21ld2hhdCBkaWZmZXJlbnQuICBUaGUgc3R1ZmYgaW4gdGhlCisgKiAjaWZkZWYgX19LRVJORUxfXyBiZWxvdyBpcyB0aGUgaW4ta2VybmVsIGludGVyZmFjZS4gIFRoZSB1c2VybGFuZAorICogaW50ZXJmYWNlIGlzIGRlZmluZWQgbGF0ZXIgaW4gdGhlIGZpbGUuICAqLworCisKKworLyoKKyAqIFRoaXMgaXMgYW4gb3ZlcmxheSBmb3IgYWxsIHRoZSBhZGRyZXNzIHR5cGVzLCBzbyBpdCdzIGVhc3kgdG8KKyAqIGRldGVybWluZSB0aGUgYWN0dWFsIGFkZHJlc3MgdHlwZS4gIFRoaXMgaXMga2luZCBvZiBsaWtlIGFkZHJlc3NlcworICogd29yayBmb3Igc29ja2V0cy4KKyAqLworI2RlZmluZSBJUE1JX01BWF9BRERSX1NJWkUgMzIKK3N0cnVjdCBpcG1pX2FkZHIgeworCSAvKiBUcnkgdG8gdGFrZSB0aGVzZSBmcm9tIHRoZSAiQ2hhbm5lbCBNZWRpdW0gVHlwZSIgdGFibGUKKwkgICAgaW4gc2VjdGlvbiA2LjUgb2YgdGhlIElQTUkgMS41IG1hbnVhbC4gKi8KKwlpbnQgICBhZGRyX3R5cGU7CisJc2hvcnQgY2hhbm5lbDsKKwljaGFyICBkYXRhW0lQTUlfTUFYX0FERFJfU0laRV07Cit9OworCisvKgorICogV2hlbiB0aGUgYWRkcmVzcyBpcyBub3QgdXNlZCwgdGhlIHR5cGUgd2lsbCBiZSBzZXQgdG8gdGhpcyB2YWx1ZS4KKyAqIFRoZSBjaGFubmVsIGlzIHRoZSBCTUMncyBjaGFubmVsIG51bWJlciBmb3IgdGhlIGNoYW5uZWwgKHVzdWFsbHkKKyAqIDApLCBvciBJUE1DX0JNQ19DSEFOTkVMIGlmIGNvbW11bmljYXRpbmcgZGlyZWN0bHkgd2l0aCB0aGUgQk1DLgorICovCisjZGVmaW5lIElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEUJMHgwYworc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyIHsKKwlpbnQgICAgICAgICAgIGFkZHJfdHlwZTsKKwlzaG9ydCAgICAgICAgIGNoYW5uZWw7CisJdW5zaWduZWQgY2hhciBsdW47Cit9OworCisvKiBBbiBJUE1CIEFkZHJlc3MuICovCisjZGVmaW5lIElQTUlfSVBNQl9BRERSX1RZUEUJCTB4MDEKKy8qIFVzZWQgZm9yIGJyb2FkY2FzdCBnZXQgZGV2aWNlIGlkIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDE3Ljkgb2YgdGhlCisgICBJUE1JIDEuNSBtYW51YWwuICovCisjZGVmaW5lIElQTUlfSVBNQl9CUk9BRENBU1RfQUREUl9UWVBFCTB4NDEKK3N0cnVjdCBpcG1pX2lwbWJfYWRkciB7CisJaW50ICAgICAgICAgICBhZGRyX3R5cGU7CisJc2hvcnQgICAgICAgICBjaGFubmVsOworCXVuc2lnbmVkIGNoYXIgc2xhdmVfYWRkcjsKKwl1bnNpZ25lZCBjaGFyIGx1bjsKK307CisKKy8qCisgKiBBIExBTiBBZGRyZXNzLiAgVGhpcyBpcyBhbiBhZGRyZXNzIHRvL2Zyb20gYSBMQU4gaW50ZXJmYWNlIGJyaWRnZWQKKyAqIGJ5IHRoZSBCTUMsIG5vdCBhbiBhZGRyZXNzIGFjdHVhbGx5IG91dCBvbiB0aGUgTEFOLgorICoKKyAqIEEgY29uc2Npb3VzIGRlY2lzaW9uIHdhcyBtYWRlIGhlcmUgdG8gZGV2aWF0ZSBzbGlnaHRseSBmcm9tIHRoZSBJUE1JCisgKiBzcGVjLiAgV2UgZG8gbm90IHVzZSBycVNXSUQgYW5kIHJzU1dJRCBsaWtlIGl0IHNob3dzIGluIHRoZQorICogbWVzc2FnZS4gIEluc3RlYWQsIHdlIHVzZSByZW1vdGVfU1dJRCBhbmQgbG9jYWxfU1dJRC4gIFRoaXMgbWVhbnMKKyAqIHRoYXQgYW55IG1lc3NhZ2UgKGEgcmVxdWVzdCBvciByZXNwb25zZSkgZnJvbSBhbm90aGVyIGRldmljZSB3aWxsCisgKiBhbHdheXMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGFkZHJlc3MuICBJZiB5b3UgZGlkbid0IGRvIHRoaXMsCisgKiByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzIGZyb20gdGhlIHNhbWUgZGV2aWNlIHdvdWxkIGhhdmUgZGlmZmVyZW50CisgKiBhZGRyZXNzZXMsIGFuZCB0aGF0J3Mgbm90IHRvbyBjb29sLgorICoKKyAqIEluIHRoaXMgYWRkcmVzcywgdGhlIHJlbW90ZV9TV0lEIGlzIGFsd2F5cyB0aGUgU1dJRCB0aGUgcmVtb3RlCisgKiBtZXNzYWdlIGNhbWUgZnJvbSwgb3IgdGhlIFNXSUQgd2UgYXJlIHNlbmRpbmcgdGhlIG1lc3NhZ2UgdG8uCisgKiBsb2NhbF9TV0lEIGlzIGFsd2F5cyBvdXIgU1dJRC4gIE5vdGUgdGhhdCBoYXZpbmcgb3VyIFNXSUQgaW4gdGhlCisgKiBtZXNzYWdlIGlzIGEgbGl0dGxlIHdlaXJkLCBidXQgdGhpcyBpcyByZXF1aXJlZC4KKyAqLworI2RlZmluZSBJUE1JX0xBTl9BRERSX1RZUEUJCTB4MDQKK3N0cnVjdCBpcG1pX2xhbl9hZGRyIHsKKwlpbnQgICAgICAgICAgIGFkZHJfdHlwZTsKKwlzaG9ydCAgICAgICAgIGNoYW5uZWw7CisJdW5zaWduZWQgY2hhciBwcml2aWxlZ2U7CisJdW5zaWduZWQgY2hhciBzZXNzaW9uX2hhbmRsZTsKKwl1bnNpZ25lZCBjaGFyIHJlbW90ZV9TV0lEOworCXVuc2lnbmVkIGNoYXIgbG9jYWxfU1dJRDsKKwl1bnNpZ25lZCBjaGFyIGx1bjsKK307CisKKworLyoKKyAqIENoYW5uZWwgZm9yIHRhbGtpbmcgZGlyZWN0bHkgd2l0aCB0aGUgQk1DLiAgV2hlbiB1c2luZyB0aGlzCisgKiBjaGFubmVsLCBUaGlzIGlzIGZvciB0aGUgc3lzdGVtIGludGVyZmFjZSBhZGRyZXNzIHR5cGUgb25seS4gIEZJWE1FCisgKiAtIGlzIHRoaXMgcmlnaHQsIG9yIHNob3VsZCB3ZSB1c2UgLTE/CisgKi8KKyNkZWZpbmUgSVBNSV9CTUNfQ0hBTk5FTCAgMHhmCisjZGVmaW5lIElQTUlfTlVNX0NIQU5ORUxTIDB4MTAKKworLyoKKyAqIFVzZWQgdG8gc2lnbmlmeSBhbiAiYWxsIGNoYW5uZWwiIGJpdG1hc2suICBUaGlzIGlzIG1vcmUgdGhhbiB0aGUKKyAqIGFjdHVhbCBudW1iZXIgb2YgY2hhbm5lbHMgYmVjYXVzZSB0aGlzIGlzIHVzZWQgaW4gdXNlcmxhbmQgYW5kCisgKiB3aWxsIGNvdmVyIHVzIGlmIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaXMgZXh0ZW5kZWQuCisgKi8KKyNkZWZpbmUgSVBNSV9DSEFOX0FMTCAgICAgKH4wKQorCisKKy8qCisgKiBBIHJhdyBJUE1JIG1lc3NhZ2Ugd2l0aG91dCBhbnkgYWRkcmVzc2luZy4gIFRoaXMgY292ZXJzIGJvdGgKKyAqIGNvbW1hbmRzIGFuZCByZXNwb25zZXMuICBUaGUgY29tcGxldGlvbiBjb2RlIGlzIGFsd2F5cyB0aGUgZmlyc3QKKyAqIGJ5dGUgb2YgZGF0YSBpbiB0aGUgcmVzcG9uc2UgKGFzIHRoZSBzcGVjIHNob3dzIHRoZSBtZXNzYWdlcyBsYWlkCisgKiBvdXQpLgorICovCitzdHJ1Y3QgaXBtaV9tc2cgeworCXVuc2lnbmVkIGNoYXIgIG5ldGZuOworCXVuc2lnbmVkIGNoYXIgIGNtZDsKKwl1bnNpZ25lZCBzaG9ydCBkYXRhX2xlbjsKKwl1bnNpZ25lZCBjaGFyICAqZGF0YTsKK307CisKK3N0cnVjdCBrZXJuZWxfaXBtaV9tc2cgeworCXVuc2lnbmVkIGNoYXIgIG5ldGZuOworCXVuc2lnbmVkIGNoYXIgIGNtZDsKKwl1bnNpZ25lZCBzaG9ydCBkYXRhX2xlbjsKKwl1bnNpZ25lZCBjaGFyICAqZGF0YTsKK307CisKKy8qCisgKiBWYXJpb3VzIGRlZmluZXMgdGhhdCBhcmUgdXNlZnVsIGZvciBJUE1JIGFwcGxpY2F0aW9ucy4KKyAqLworI2RlZmluZSBJUE1JX0lOVkFMSURfQ01EX0NPTVBMRVRJT05fQ09ERQkweEMxCisjZGVmaW5lIElQTUlfVElNRU9VVF9DT01QTEVUSU9OX0NPREUJCTB4QzMKKyNkZWZpbmUgSVBNSV9VTktOT1dOX0VSUl9DT01QTEVUSU9OX0NPREUJMHhmZgorCisKKy8qCisgKiBSZWNlaXZlIHR5cGVzIGZvciBtZXNzYWdlcyBjb21pbmcgZnJvbSB0aGUgcmVjZWl2ZSBpbnRlcmZhY2UuICBUaGlzCisgKiBpcyB1c2VkIGZvciB0aGUgcmVjZWl2ZSBpbi1rZXJuZWwgaW50ZXJmYWNlIGFuZCBpbiB0aGUgcmVjZWl2ZQorICogSU9DVEwuCisgKgorICogVGhlICJJUE1JX1JFU1BPTlNFX1JFU1BOT1NFX1RZUEUiIGlzIGEgbGl0dGxlIHN0cmFuZ2Ugc291bmRpbmcsIGJ1dAorICogaXQgYWxsb3dzIHlvdSB0byBnZXQgdGhlIG1lc3NhZ2UgcmVzdWx0cyB3aGVuIHlvdSBzZW5kIGEgcmVzcG9uc2UKKyAqIG1lc3NhZ2UuCisgKi8KKyNkZWZpbmUgSVBNSV9SRVNQT05TRV9SRUNWX1RZUEUJCTEgLyogQSByZXNwb25zZSB0byBhIGNvbW1hbmQgKi8KKyNkZWZpbmUgSVBNSV9BU1lOQ19FVkVOVF9SRUNWX1RZUEUJMiAvKiBTb21ldGhpbmcgZnJvbSB0aGUgZXZlbnQgcXVldWUgKi8KKyNkZWZpbmUgSVBNSV9DTURfUkVDVl9UWVBFCQkzIC8qIEEgY29tbWFuZCBmcm9tIHNvbWV3aGVyZSBlbHNlICovCisjZGVmaW5lIElQTUlfUkVTUE9OU0VfUkVTUE9OU0VfVFlQRQk0IC8qIFRoZSByZXNwb25zZSBmb3IKKwkJCQkJICAgICAgYSBzZW50IHJlc3BvbnNlLCBnaXZpbmcgYW55CisJCQkJCSAgICAgIGVycm9yIHN0YXR1cyBmb3Igc2VuZGluZyB0aGUKKwkJCQkJICAgICAgcmVzcG9uc2UuICBXaGVuIHlvdSBzZW5kIGEKKwkJCQkJICAgICAgcmVzcG9uc2UgbWVzc2FnZSwgdGhpcyB3aWxsCisJCQkJCSAgICAgIGJlIHJldHVybmVkLiAqLworI2RlZmluZSBJUE1JX09FTV9SRUNWX1RZUEUJCTUgLyogVGhlIHJlc3BvbnNlIGZvciBPRU0gQ2hhbm5lbHMgKi8KKworLyogTm90ZSB0aGF0IGFzeW5jIGV2ZW50cyBhbmQgcmVjZWl2ZWQgY29tbWFuZHMgZG8gbm90IGhhdmUgYSBjb21wbGV0aW9uCisgICBjb2RlIGFzIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBpbmNvbWluZyBkYXRhLCB1bmxpa2UgYSByZXNwb25zZS4gKi8KKworCisvKgorICogTW9kZXMgZm9yIGlwbWlfc2V0X21haW50X21vZGUoKSBhbmQgdGhlIHVzZXJsYW5kIElPQ1RMLiAgVGhlIEFVVE8KKyAqIHNldHRpbmcgaXMgdGhlIGRlZmF1bHQgYW5kIG1lYW5zIGl0IHdpbGwgYmUgc2V0IG9uIGNlcnRhaW4KKyAqIGNvbW1hbmRzLiAgSGFyZCBzZXR0aW5nIGl0IG9uIGFuZCBvZmYgd2lsbCBvdmVycmlkZSBhdXRvbWF0aWMKKyAqIG9wZXJhdGlvbi4KKyAqLworI2RlZmluZSBJUE1JX01BSU5URU5BTkNFX01PREVfQVVUTwkwCisjZGVmaW5lIElQTUlfTUFJTlRFTkFOQ0VfTU9ERV9PRkYJMQorI2RlZmluZSBJUE1JX01BSU5URU5BTkNFX01PREVfT04JMgorCisKKworLyoKKyAqIFRoZSB1c2VybGFuZCBpbnRlcmZhY2UKKyAqLworCisvKgorICogVGhlIHVzZXJsYW5kIGludGVyZmFjZSBmb3IgdGhlIElQTUkgZHJpdmVyIGlzIGEgc3RhbmRhcmQgY2hhcmFjdGVyCisgKiBkZXZpY2UsIHdpdGggZWFjaCBpbnN0YW5jZSBvZiBhbiBpbnRlcmZhY2UgcmVnaXN0ZXJlZCBhcyBhIG1pbm9yCisgKiBudW1iZXIgdW5kZXIgdGhlIG1ham9yIGNoYXJhY3RlciBkZXZpY2UuCisgKgorICogVGhlIHJlYWQgYW5kIHdyaXRlIGNhbGxzIGRvIG5vdCB3b3JrLCB0byBnZXQgbWVzc2FnZXMgaW4gYW5kIG91dAorICogcmVxdWlyZXMgaW9jdGwgY2FsbHMgYmVjYXVzZSBvZiB0aGUgY29tcGxleGl0eSBvZiB0aGUgZGF0YS4gIHNlbGVjdAorICogYW5kIHBvbGwgZG8gd29yaywgc28geW91IGNhbiB3YWl0IGZvciBpbnB1dCB1c2luZyB0aGUgZmlsZQorICogZGVzY3JpcHRvciwgeW91IGp1c3QgY2FuIHVzZSByZWFkIHRvIGdldCBpdC4KKyAqCisgKiBJbiBnZW5lcmFsLCB5b3Ugc2VuZCBhIGNvbW1hbmQgZG93biB0byB0aGUgaW50ZXJmYWNlIGFuZCByZWNlaXZlCisgKiByZXNwb25zZXMgYmFjay4gIFlvdSBjYW4gdXNlIHRoZSBtc2dpZCB2YWx1ZSB0byBjb3JyZWxhdGUgY29tbWFuZHMKKyAqIGFuZCByZXNwb25zZXMsIHRoZSBkcml2ZXIgd2lsbCB0YWtlIGNhcmUgb2YgZmlndXJpbmcgb3V0IHdoaWNoCisgKiBpbmNvbWluZyBtZXNzYWdlcyBhcmUgZm9yIHdoaWNoIGNvbW1hbmQgYW5kIGZpbmQgdGhlIHByb3BlciBtc2dpZAorICogdmFsdWUgdG8gcmVwb3J0LiAgWW91IHdpbGwgb25seSByZWNlaXZlIHJlcG9uc2VzIGZvciBjb21tYW5kcyB5b3UKKyAqIHNlbmQuICBBc3luY2hyb25vdXMgZXZlbnRzLCBob3dldmVyLCBnbyB0byBhbGwgb3BlbiB1c2Vycywgc28geW91CisgKiBtdXN0IGJlIHJlYWR5IHRvIGhhbmRsZSB0aGVzZSAob3IgaWdub3JlIHRoZW0gaWYgeW91IGRvbid0IGNhcmUpLgorICoKKyAqIFRoZSBhZGRyZXNzIHR5cGUgZGVwZW5kcyB1cG9uIHRoZSBjaGFubmVsIHR5cGUuICBXaGVuIHRhbGtpbmcKKyAqIGRpcmVjdGx5IHRvIHRoZSBCTUMgKElQTUNfQk1DX0NIQU5ORUwpLCB0aGUgYWRkcmVzcyBpcyBpZ25vcmVkCisgKiAoSVBNSV9VTlVTRURfQUREUl9UWVBFKS4gIFdoZW4gdGFsa2luZyB0byBhbiBJUE1CIGNoYW5uZWwsIHlvdSBtdXN0CisgKiBzdXBwbHkgYSB2YWxpZCBJUE1CIGFkZHJlc3Mgd2l0aCB0aGUgYWRkcl90eXBlIHNldCBwcm9wZXJseS4KKyAqCisgKiBXaGVuIHRhbGtpbmcgdG8gbm9ybWFsIGNoYW5uZWxzLCB0aGUgZHJpdmVyIHRha2VzIGNhcmUgb2YgdGhlCisgKiBkZXRhaWxzIG9mIGZvcm1hdHRpbmcgYW5kIHNlbmRpbmcgbWVzc2FnZXMgb24gdGhhdCBjaGFubmVsLiAgWW91IGRvCisgKiBub3QsIGZvciBpbnN0YW5jZSwgaGF2ZSB0byBmb3JtYXQgYSBzZW5kIGNvbW1hbmQsIHlvdSBqdXN0IHNlbmQKKyAqIHdoYXRldmVyIGNvbW1hbmQgeW91IHdhbnQgdG8gdGhlIGNoYW5uZWwsIHRoZSBkcml2ZXIgd2lsbCBjcmVhdGUKKyAqIHRoZSBzZW5kIGNvbW1hbmQsIGF1dG9tYXRpY2FsbHkgaXNzdWUgcmVjZWl2ZSBjb21tYW5kIGFuZCBnZXQgZXZlbgorICogY29tbWFuZHMsIGFuZCBwYXNzIHRob3NlIHVwIHRvIHRoZSBwcm9wZXIgdXNlci4KKyAqLworCisKKy8qIFRoZSBtYWdpYyBJT0NUTCB2YWx1ZSBmb3IgdGhpcyBpbnRlcmZhY2UuICovCisjZGVmaW5lIElQTUlfSU9DX01BR0lDICdpJworCisKKy8qIE1lc3NhZ2VzIHNlbnQgdG8gdGhlIGludGVyZmFjZSBhcmUgdGhpcyBmb3JtYXQuICovCitzdHJ1Y3QgaXBtaV9yZXEgeworCXVuc2lnbmVkIGNoYXIgKmFkZHI7IC8qIEFkZHJlc3MgdG8gc2VuZCB0aGUgbWVzc2FnZSB0by4gKi8KKwl1bnNpZ25lZCBpbnQgIGFkZHJfbGVuOworCisJbG9uZyAgICBtc2dpZDsgLyogVGhlIHNlcXVlbmNlIG51bWJlciBmb3IgdGhlIG1lc3NhZ2UuICBUaGlzCisJCQkgIGV4YWN0IHZhbHVlIHdpbGwgYmUgcmVwb3J0ZWQgYmFjayBpbiB0aGUKKwkJCSAgcmVzcG9uc2UgdG8gdGhpcyByZXF1ZXN0IGlmIGl0IGlzIGEgY29tbWFuZC4KKwkJCSAgSWYgaXQgaXMgYSByZXNwb25zZSwgdGhpcyB3aWxsIGJlIHVzZWQgYXMKKwkJCSAgdGhlIHNlcXVlbmNlIHZhbHVlIGZvciB0aGUgcmVzcG9uc2UuICAqLworCisJc3RydWN0IGlwbWlfbXNnIG1zZzsKK307CisvKgorICogU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIGludGVyZmFjZXMuICBlcnJvciB2YWx1ZXMgYXJlOgorICogICAtIEVGQVVMVCAtIGFuIGFkZHJlc3Mgc3VwcGxpZWQgd2FzIGludmFsaWQuCisgKiAgIC0gRUlOVkFMIC0gVGhlIGFkZHJlc3Mgc3VwcGxpZWQgd2FzIG5vdCB2YWxpZCwgb3IgdGhlIGNvbW1hbmQKKyAqICAgICAgICAgICAgICB3YXMgbm90IGFsbG93ZWQuCisgKiAgIC0gRU1TR1NJWkUgLSBUaGUgbWVzc2FnZSB0byB3YXMgdG9vIGxhcmdlLgorICogICAtIEVOT01FTSAtIEJ1ZmZlcnMgY291bGQgbm90IGJlIGFsbG9jYXRlZCBmb3IgdGhlIGNvbW1hbmQuCisgKi8KKyNkZWZpbmUgSVBNSUNUTF9TRU5EX0NPTU1BTkQJCV9JT1IoSVBNSV9JT0NfTUFHSUMsIDEzLAlcCisJCQkJCSAgICAgc3RydWN0IGlwbWlfcmVxKQorCisvKiBNZXNzYWdlcyBzZW50IHRvIHRoZSBpbnRlcmZhY2Ugd2l0aCB0aW1pbmcgcGFyYW1ldGVycyBhcmUgdGhpcworICAgZm9ybWF0LiAqLworc3RydWN0IGlwbWlfcmVxX3NldHRpbWUgeworCXN0cnVjdCBpcG1pX3JlcSByZXE7CisKKwkvKiBTZWUgaXBtaV9yZXF1ZXN0X3NldHRpbWUoKSBhYm92ZSBmb3IgZGV0YWlscyBvbiB0aGVzZQorCSAgIHZhbHVlcy4gKi8KKwlpbnQgICAgICAgICAgcmV0cmllczsKKwl1bnNpZ25lZCBpbnQgcmV0cnlfdGltZV9tczsKK307CisvKgorICogU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIGludGVyZmFjZXMgd2l0aCB0aW1pbmcgcGFyYW1ldGVycy4gIGVycm9yIHZhbHVlcworICogYXJlOgorICogICAtIEVGQVVMVCAtIGFuIGFkZHJlc3Mgc3VwcGxpZWQgd2FzIGludmFsaWQuCisgKiAgIC0gRUlOVkFMIC0gVGhlIGFkZHJlc3Mgc3VwcGxpZWQgd2FzIG5vdCB2YWxpZCwgb3IgdGhlIGNvbW1hbmQKKyAqICAgICAgICAgICAgICB3YXMgbm90IGFsbG93ZWQuCisgKiAgIC0gRU1TR1NJWkUgLSBUaGUgbWVzc2FnZSB0byB3YXMgdG9vIGxhcmdlLgorICogICAtIEVOT01FTSAtIEJ1ZmZlcnMgY291bGQgbm90IGJlIGFsbG9jYXRlZCBmb3IgdGhlIGNvbW1hbmQuCisgKi8KKyNkZWZpbmUgSVBNSUNUTF9TRU5EX0NPTU1BTkRfU0VUVElNRQlfSU9SKElQTUlfSU9DX01BR0lDLCAyMSwJXAorCQkJCQkgICAgIHN0cnVjdCBpcG1pX3JlcV9zZXR0aW1lKQorCisvKiBNZXNzYWdlcyByZWNlaXZlZCBmcm9tIHRoZSBpbnRlcmZhY2UgYXJlIHRoaXMgZm9ybWF0LiAqLworc3RydWN0IGlwbWlfcmVjdiB7CisJaW50ICAgICByZWN2X3R5cGU7IC8qIElzIHRoaXMgYSBjb21tYW5kLCByZXNwb25zZSBvciBhbgorCQkJICAgICAgYXN5bmNyb25vdXMgZXZlbnQuICovCisKKwl1bnNpZ25lZCBjaGFyICphZGRyOyAgICAvKiBBZGRyZXNzIHRoZSBtZXNzYWdlIHdhcyBmcm9tIGlzIHB1dAorCQkJCSAgIGhlcmUuICBUaGUgY2FsbGVyIG11c3Qgc3VwcGx5IHRoZQorCQkJCSAgIG1lbW9yeS4gKi8KKwl1bnNpZ25lZCBpbnQgIGFkZHJfbGVuOyAvKiBUaGUgc2l6ZSBvZiB0aGUgYWRkcmVzcyBidWZmZXIuCisJCQkJICAgVGhlIGNhbGxlciBzdXBwbGllcyB0aGUgZnVsbCBidWZmZXIKKwkJCQkgICBsZW5ndGgsIHRoaXMgdmFsdWUgaXMgdXBkYXRlZCB0bworCQkJCSAgIHRoZSBhY3R1YWwgbWVzc2FnZSBsZW5ndGggd2hlbiB0aGUKKwkJCQkgICBtZXNzYWdlIGlzIHJlY2VpdmVkLiAqLworCisJbG9uZyAgICBtc2dpZDsgLyogVGhlIHNlcXVlbmNlIG51bWJlciBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QKKwkJCSAgaWYgdGhpcyBpcyBhIHJlc3BvbnNlLiAgSWYgdGhpcyBpcyBhIGNvbW1hbmQsCisJCQkgIHRoaXMgd2lsbCBiZSB0aGUgc2VxdWVuY2UgbnVtYmVyIGZyb20gdGhlCisJCQkgIGNvbW1hbmQuICovCisKKwlzdHJ1Y3QgaXBtaV9tc2cgbXNnOyAvKiBUaGUgZGF0YSBmaWVsZCBtdXN0IHBvaW50IHRvIGEgYnVmZmVyLgorCQkJCVRoZSBkYXRhX3NpemUgZmllbGQgbXVzdCBiZSBzZXQgdG8gdGhlCisJCQkJc2l6ZSBvZiB0aGUgbWVzc2FnZSBidWZmZXIuICBUaGUKKwkJCQljYWxsZXIgc3VwcGxpZXMgdGhlIGZ1bGwgYnVmZmVyCisJCQkJbGVuZ3RoLCB0aGlzIHZhbHVlIGlzIHVwZGF0ZWQgdG8gdGhlCisJCQkJYWN0dWFsIG1lc3NhZ2UgbGVuZ3RoIHdoZW4gdGhlIG1lc3NhZ2UKKwkJCQlpcyByZWNlaXZlZC4gKi8KK307CisKKy8qCisgKiBSZWNlaXZlIGEgbWVzc2FnZS4gIGVycm9yIHZhbHVlczoKKyAqICAtIEVBR0FJTiAtIG5vIG1lc3NhZ2VzIGluIHRoZSBxdWV1ZS4KKyAqICAtIEVGQVVMVCAtIGFuIGFkZHJlc3Mgc3VwcGxpZWQgd2FzIGludmFsaWQuCisgKiAgLSBFSU5WQUwgLSBUaGUgYWRkcmVzcyBzdXBwbGllZCB3YXMgbm90IHZhbGlkLgorICogIC0gRU1TR1NJWkUgLSBUaGUgbWVzc2FnZSB0byB3YXMgdG9vIGxhcmdlIHRvIGZpdCBpbnRvIHRoZSBtZXNzYWdlIGJ1ZmZlciwKKyAqICAgICAgICAgICAgICAgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBsZWZ0IGluIHRoZSBidWZmZXIuICovCisjZGVmaW5lIElQTUlDVExfUkVDRUlWRV9NU0cJCV9JT1dSKElQTUlfSU9DX01BR0lDLCAxMiwJXAorCQkJCQkgICAgICBzdHJ1Y3QgaXBtaV9yZWN2KQorCisvKgorICogTGlrZSBSRUNFSVZFX01TRywgYnV0IGlmIHRoZSBtZXNzYWdlIHdvbid0IGZpdCBpbiB0aGUgYnVmZmVyLCBpdAorICogd2lsbCB0cnVuY2F0ZSB0aGUgY29udGVudHMgaW5zdGVhZCBvZiBsZWF2aW5nIHRoZSBkYXRhIGluIHRoZQorICogYnVmZmVyLgorICovCisjZGVmaW5lIElQTUlDVExfUkVDRUlWRV9NU0dfVFJVTkMJX0lPV1IoSVBNSV9JT0NfTUFHSUMsIDExLAlcCisJCQkJCSAgICAgIHN0cnVjdCBpcG1pX3JlY3YpCisKKy8qIFJlZ2lzdGVyIHRvIGdldCBjb21tYW5kcyBmcm9tIG90aGVyIGVudGl0aWVzIG9uIHRoaXMgaW50ZXJmYWNlLiAqLworc3RydWN0IGlwbWlfY21kc3BlYyB7CisJdW5zaWduZWQgY2hhciBuZXRmbjsKKwl1bnNpZ25lZCBjaGFyIGNtZDsKK307CisKKy8qCisgKiBSZWdpc3RlciB0byByZWNlaXZlIGEgc3BlY2lmaWMgY29tbWFuZC4gIGVycm9yIHZhbHVlczoKKyAqICAgLSBFRkFVTFQgLSBhbiBhZGRyZXNzIHN1cHBsaWVkIHdhcyBpbnZhbGlkLgorICogICAtIEVCVVNZIC0gVGhlIG5ldGZuL2NtZCBzdXBwbGllZCB3YXMgYWxyZWFkeSBpbiB1c2UuCisgKiAgIC0gRU5PTUVNIC0gY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGVudHJ5LgorICovCisjZGVmaW5lIElQTUlDVExfUkVHSVNURVJfRk9SX0NNRAlfSU9SKElQTUlfSU9DX01BR0lDLCAxNCwJXAorCQkJCQkgICAgIHN0cnVjdCBpcG1pX2NtZHNwZWMpCisvKgorICogVW5yZWdpc3RlciBhIHJlZ3NpdGVyZWQgY29tbWFuZC4gIGVycm9yIHZhbHVlczoKKyAqICAtIEVGQVVMVCAtIGFuIGFkZHJlc3Mgc3VwcGxpZWQgd2FzIGludmFsaWQuCisgKiAgLSBFTk9FTlQgLSBUaGUgbmV0Zm4vY21kIHdhcyBub3QgZm91bmQgcmVnaXN0ZXJlZCBmb3IgdGhpcyB1c2VyLgorICovCisjZGVmaW5lIElQTUlDVExfVU5SRUdJU1RFUl9GT1JfQ01ECV9JT1IoSVBNSV9JT0NfTUFHSUMsIDE1LAlcCisJCQkJCSAgICAgc3RydWN0IGlwbWlfY21kc3BlYykKKworLyoKKyAqIFJlZ2lzdGVyIHRvIGdldCBjb21tYW5kcyBmcm9tIG90aGVyIGVudGl0aWVzIG9uIHNwZWNpZmljIGNoYW5uZWxzLgorICogVGhpcyB3YXksIHlvdSBjYW4gb25seSBsaXN0ZW4gb24gc3BlY2lmaWMgY2hhbm5lbHMsIG9yIGhhdmUgbWVzc2FnZXMKKyAqIGZyb20gc29tZSBjaGFubmVscyBnbyB0byBvbmUgcGxhY2UgYW5kIG90aGVyIGNoYW5uZWxzIHRvIHNvbWVwbGFjZQorICogZWxzZS4gIFRoZSBjaGFucyBmaWVsZCBpcyBhIGJpdG1hc2ssICgxIDw8IGNoYW5uZWwpIGZvciBlYWNoIGNoYW5uZWwuCisgKiBJdCBtYXkgYmUgSVBNSV9DSEFOX0FMTCBmb3IgYWxsIGNoYW5uZWxzLgorICovCitzdHJ1Y3QgaXBtaV9jbWRzcGVjX2NoYW5zIHsKKwl1bnNpZ25lZCBpbnQgbmV0Zm47CisJdW5zaWduZWQgaW50IGNtZDsKKwl1bnNpZ25lZCBpbnQgY2hhbnM7Cit9OworCisvKgorICogUmVnaXN0ZXIgdG8gcmVjZWl2ZSBhIHNwZWNpZmljIGNvbW1hbmQgb24gc3BlY2lmaWMgY2hhbm5lbHMuICBlcnJvciB2YWx1ZXM6CisgKiAgIC0gRUZBVUxUIC0gYW4gYWRkcmVzcyBzdXBwbGllZCB3YXMgaW52YWxpZC4KKyAqICAgLSBFQlVTWSAtIE9uZSBvZiB0aGUgbmV0Zm4vY21kL2NoYW5zIHN1cHBsaWVkIHdhcyBhbHJlYWR5IGluIHVzZS4KKyAqICAgLSBFTk9NRU0gLSBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZW50cnkuCisgKi8KKyNkZWZpbmUgSVBNSUNUTF9SRUdJU1RFUl9GT1JfQ01EX0NIQU5TCV9JT1IoSVBNSV9JT0NfTUFHSUMsIDI4LAlcCisJCQkJCSAgICAgc3RydWN0IGlwbWlfY21kc3BlY19jaGFucykKKy8qCisgKiBVbnJlZ2lzdGVyIHNvbWUgbmV0Zm4vY21kL2NoYW5zLiAgZXJyb3IgdmFsdWVzOgorICogIC0gRUZBVUxUIC0gYW4gYWRkcmVzcyBzdXBwbGllZCB3YXMgaW52YWxpZC4KKyAqICAtIEVOT0VOVCAtIE5vbmUgb2YgdGhlIG5ldGZuL2NtZC9jaGFucyB3ZXJlIGZvdW5kIHJlZ2lzdGVyZWQgZm9yIHRoaXMgdXNlci4KKyAqLworI2RlZmluZSBJUE1JQ1RMX1VOUkVHSVNURVJfRk9SX0NNRF9DSEFOUyBfSU9SKElQTUlfSU9DX01BR0lDLCAyOSwJXAorCQkJCQkgICAgIHN0cnVjdCBpcG1pX2NtZHNwZWNfY2hhbnMpCisKKy8qCisgKiBTZXQgd2hldGhlciB0aGlzIGludGVyZmFjZSByZWNlaXZlcyBldmVudHMuICBOb3RlIHRoYXQgdGhlIGZpcnN0CisgKiB1c2VyIHJlZ2lzdGVyZWQgZm9yIGV2ZW50cyB3aWxsIGdldCBhbGwgcGVuZGluZyBldmVudHMgZm9yIHRoZQorICogaW50ZXJmYWNlLiAgZXJyb3IgdmFsdWVzOgorICogIC0gRUZBVUxUIC0gYW4gYWRkcmVzcyBzdXBwbGllZCB3YXMgaW52YWxpZC4KKyAqLworI2RlZmluZSBJUE1JQ1RMX1NFVF9HRVRTX0VWRU5UU19DTUQJX0lPUihJUE1JX0lPQ19NQUdJQywgMTYsIGludCkKKworLyoKKyAqIFNldCBhbmQgZ2V0IHRoZSBzbGF2ZSBhZGRyZXNzIGFuZCBMVU4gdGhhdCB3ZSB3aWxsIHVzZSBmb3Igb3VyCisgKiBzb3VyY2UgbWVzc2FnZXMuICBOb3RlIHRoYXQgdGhpcyBhZmZlY3RzIHRoZSBpbnRlcmZhY2UsIG5vdCBqdXN0CisgKiB0aGlzIHVzZXIsIHNvIGl0IHdpbGwgYWZmZWN0IGFsbCB1c2VycyBvZiB0aGlzIGludGVyZmFjZS4gIFRoaXMgaXMKKyAqIHNvIHNvbWUgaW5pdGlhbGl6YXRpb24gY29kZSBjYW4gY29tZSBpbiBhbmQgZG8gdGhlIE9FTS1zcGVjaWZpYworICogdGhpbmdzIGl0IHRha2VzIHRvIGRldGVybWluZSB5b3VyIGFkZHJlc3MgKGlmIG5vdCB0aGUgQk1DKSBhbmQgc2V0CisgKiBpdCBmb3IgZXZlcnlvbmUgZWxzZS4gIFlvdSBzaG91bGQgcHJvYmFibHkgbGVhdmUgdGhlIExVTiBhbG9uZS4KKyAqLworc3RydWN0IGlwbWlfY2hhbm5lbF9sdW5fYWRkcmVzc19zZXQgeworCXVuc2lnbmVkIHNob3J0IGNoYW5uZWw7CisJdW5zaWduZWQgY2hhciAgdmFsdWU7Cit9OworI2RlZmluZSBJUE1JQ1RMX1NFVF9NWV9DSEFOTkVMX0FERFJFU1NfQ01EIFwKKwlfSU9SKElQTUlfSU9DX01BR0lDLCAyNCwgc3RydWN0IGlwbWlfY2hhbm5lbF9sdW5fYWRkcmVzc19zZXQpCisjZGVmaW5lIElQTUlDVExfR0VUX01ZX0NIQU5ORUxfQUREUkVTU19DTUQgXAorCV9JT1IoSVBNSV9JT0NfTUFHSUMsIDI1LCBzdHJ1Y3QgaXBtaV9jaGFubmVsX2x1bl9hZGRyZXNzX3NldCkKKyNkZWZpbmUgSVBNSUNUTF9TRVRfTVlfQ0hBTk5FTF9MVU5fQ01EIFwKKwlfSU9SKElQTUlfSU9DX01BR0lDLCAyNiwgc3RydWN0IGlwbWlfY2hhbm5lbF9sdW5fYWRkcmVzc19zZXQpCisjZGVmaW5lIElQTUlDVExfR0VUX01ZX0NIQU5ORUxfTFVOX0NNRCBcCisJX0lPUihJUE1JX0lPQ19NQUdJQywgMjcsIHN0cnVjdCBpcG1pX2NoYW5uZWxfbHVuX2FkZHJlc3Nfc2V0KQorLyogTGVnYWN5IGludGVyZmFjZXMsIHRoZXNlIG9ubHkgc2V0IElQTUIgMC4gKi8KKyNkZWZpbmUgSVBNSUNUTF9TRVRfTVlfQUREUkVTU19DTUQJX0lPUihJUE1JX0lPQ19NQUdJQywgMTcsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgSVBNSUNUTF9HRVRfTVlfQUREUkVTU19DTUQJX0lPUihJUE1JX0lPQ19NQUdJQywgMTgsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgSVBNSUNUTF9TRVRfTVlfTFVOX0NNRAkJX0lPUihJUE1JX0lPQ19NQUdJQywgMTksIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgSVBNSUNUTF9HRVRfTVlfTFVOX0NNRAkJX0lPUihJUE1JX0lPQ19NQUdJQywgMjAsIHVuc2lnbmVkIGludCkKKworLyoKKyAqIEdldC9zZXQgdGhlIGRlZmF1bHQgdGltaW5nIHZhbHVlcyBmb3IgYW4gaW50ZXJmYWNlLiAgWW91IHNob3VsZG4ndAorICogZ2VuZXJhbGx5IG1lc3Mgd2l0aCB0aGVzZS4KKyAqLworc3RydWN0IGlwbWlfdGltaW5nX3Bhcm1zIHsKKwlpbnQgICAgICAgICAgcmV0cmllczsKKwl1bnNpZ25lZCBpbnQgcmV0cnlfdGltZV9tczsKK307CisjZGVmaW5lIElQTUlDVExfU0VUX1RJTUlOR19QQVJNU19DTUQJX0lPUihJUE1JX0lPQ19NQUdJQywgMjIsIFwKKwkJCQkJICAgICBzdHJ1Y3QgaXBtaV90aW1pbmdfcGFybXMpCisjZGVmaW5lIElQTUlDVExfR0VUX1RJTUlOR19QQVJNU19DTUQJX0lPUihJUE1JX0lPQ19NQUdJQywgMjMsIFwKKwkJCQkJICAgICBzdHJ1Y3QgaXBtaV90aW1pbmdfcGFybXMpCisKKy8qCisgKiBTZXQgdGhlIG1haW50ZW5hbmNlIG1vZGUuICBTZWUgaXBtaV9zZXRfbWFpbnRlbmFuY2VfbW9kZSgpIGFib3ZlCisgKiBmb3IgYSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoaXMgZG9lcy4KKyAqLworI2RlZmluZSBJUE1JQ1RMX0dFVF9NQUlOVEVOQU5DRV9NT0RFX0NNRAlfSU9SKElQTUlfSU9DX01BR0lDLCAzMCwgaW50KQorI2RlZmluZSBJUE1JQ1RMX1NFVF9NQUlOVEVOQU5DRV9NT0RFX0NNRAlfSU9XKElQTUlfSU9DX01BR0lDLCAzMSwgaW50KQorCisjZW5kaWYgLyogX19MSU5VWF9JUE1JX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXBtaV9tc2dkZWZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lwbWlfbXNnZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOTdlNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lwbWlfbXNnZGVmcy5oCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogaXBtaV9zbWkuaAorICoKKyAqIE1vbnRhVmlzdGEgSVBNSSBzeXN0ZW0gbWFuYWdlbWVudCBpbnRlcmZhY2UKKyAqCisgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqICAgICAgICAgQ29yZXkgTWlueWFyZCA8bWlueWFyZEBtdmlzdGEuY29tPgorICogICAgICAgICBzb3VyY2VAbXZpc3RhLmNvbQorICoKKyAqIENvcHlyaWdodCAyMDAyIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgKiAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisgKiAgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorICogIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqICBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9JUE1JX01TR0RFRlNfSAorI2RlZmluZSBfX0xJTlVYX0lQTUlfTVNHREVGU19ICisKKy8qIFZhcmlvdXMgZGVmaW5pdGlvbnMgZm9yIElQTUkgbWVzc2FnZXMgdXNlZCBieSBhbG1vc3QgZXZlcnl0aGluZyBpbgorICAgdGhlIElQTUkgc3RhY2suICovCisKKy8qIE5ldEZOcyBhbmQgY29tbWFuZHMgdXNlZCBpbnNpZGUgdGhlIElQTUkgc3RhY2suICovCisKKyNkZWZpbmUgSVBNSV9ORVRGTl9TRU5TT1JfRVZFTlRfUkVRVUVTVAkJMHgwNAorI2RlZmluZSBJUE1JX05FVEZOX1NFTlNPUl9FVkVOVF9SRVNQT05TRQkweDA1CisjZGVmaW5lIElQTUlfR0VUX0VWRU5UX1JFQ0VJVkVSX0NNRAkweDAxCisKKyNkZWZpbmUgSVBNSV9ORVRGTl9BUFBfUkVRVUVTVAkJCTB4MDYKKyNkZWZpbmUgSVBNSV9ORVRGTl9BUFBfUkVTUE9OU0UJCQkweDA3CisjZGVmaW5lIElQTUlfR0VUX0RFVklDRV9JRF9DTUQJCTB4MDEKKyNkZWZpbmUgSVBNSV9DT0xEX1JFU0VUX0NNRAkJMHgwMgorI2RlZmluZSBJUE1JX1dBUk1fUkVTRVRfQ01ECQkweDAzCisjZGVmaW5lIElQTUlfQ0xFQVJfTVNHX0ZMQUdTX0NNRAkweDMwCisjZGVmaW5lIElQTUlfR0VUX0RFVklDRV9HVUlEX0NNRAkweDA4CisjZGVmaW5lIElQTUlfR0VUX01TR19GTEFHU19DTUQJCTB4MzEKKyNkZWZpbmUgSVBNSV9TRU5EX01TR19DTUQJCTB4MzQKKyNkZWZpbmUgSVBNSV9HRVRfTVNHX0NNRAkJMHgzMworI2RlZmluZSBJUE1JX1NFVF9CTUNfR0xPQkFMX0VOQUJMRVNfQ01ECTB4MmUKKyNkZWZpbmUgSVBNSV9HRVRfQk1DX0dMT0JBTF9FTkFCTEVTX0NNRAkweDJmCisjZGVmaW5lIElQTUlfUkVBRF9FVkVOVF9NU0dfQlVGRkVSX0NNRAkweDM1CisjZGVmaW5lIElQTUlfR0VUX0NIQU5ORUxfSU5GT19DTUQJMHg0MgorCisvKiBCaXQgZm9yIEJNQyBnbG9iYWwgZW5hYmxlcy4gKi8KKyNkZWZpbmUgSVBNSV9CTUNfUkNWX01TR19JTlRSICAgICAweDAxCisjZGVmaW5lIElQTUlfQk1DX0VWVF9NU0dfSU5UUiAgICAgMHgwMgorI2RlZmluZSBJUE1JX0JNQ19FVlRfTVNHX0JVRkYgICAgIDB4MDQKKyNkZWZpbmUgSVBNSV9CTUNfU1lTX0xPRyAgICAgICAgICAweDA4CisKKyNkZWZpbmUgSVBNSV9ORVRGTl9TVE9SQUdFX1JFUVVFU1QJCTB4MGEKKyNkZWZpbmUgSVBNSV9ORVRGTl9TVE9SQUdFX1JFU1BPTlNFCQkweDBiCisjZGVmaW5lIElQTUlfQUREX1NFTF9FTlRSWV9DTUQJCTB4NDQKKworI2RlZmluZSBJUE1JX05FVEZOX0ZJUk1XQVJFX1JFUVVFU1QJCTB4MDgKKyNkZWZpbmUgSVBNSV9ORVRGTl9GSVJNV0FSRV9SRVNQT05TRQkJMHgwOQorCisvKiBUaGUgZGVmYXVsdCBzbGF2ZSBhZGRyZXNzICovCisjZGVmaW5lIElQTUlfQk1DX1NMQVZFX0FERFIJMHgyMAorCisvKiBUaGUgQlQgaW50ZXJmYWNlIG9uIGhpZ2gtZW5kIEhQIHN5c3RlbXMgc3VwcG9ydHMgdXAgdG8gMjU1IGJ5dGVzIGluCisgKiBvbmUgdHJhbnNmZXIuICBJdHMgInZpcnR1YWwiIEJNQyBzdXBwb3J0cyBzb21lIGNvbW1hbmRzIHRoYXQgYXJlIGxvbmdlcgorICogdGhhbiAxMjggYnl0ZXMuICBVc2UgdGhlIGZ1bGwgMjU2LCBwbHVzIE5ldEZuL0xVTiwgQ21kLCBjQ29kZSwgcGx1cworICogc29tZSBvdmVyaGVhZDsgaXQncyBub3Qgd29ydGggdGhlIGVmZm9ydCB0byBkeW5hbWljYWxseSBzaXplIHRoaXMgYmFzZWQKKyAqIG9uIHRoZSByZXN1bHRzIG9mIHRoZSAiR2V0IEJUIENhcGFiaWxpdGllcyIgY29tbWFuZC4gKi8KKyNkZWZpbmUgSVBNSV9NQVhfTVNHX0xFTkdUSAkyNzIJLyogbXVsdGlwbGUgb2YgMTYgKi8KKworI2RlZmluZSBJUE1JX0NDX05PX0VSUk9SCQkweDAwCisjZGVmaW5lIElQTUlfTk9ERV9CVVNZX0VSUgkJMHhjMAorI2RlZmluZSBJUE1JX0lOVkFMSURfQ09NTUFORF9FUlIJMHhjMQorI2RlZmluZSBJUE1JX1RJTUVPVVRfRVJSCQkweGMzCisjZGVmaW5lIElQTUlfRVJSX01TR19UUlVOQ0FURUQJCTB4YzYKKyNkZWZpbmUgSVBNSV9SRVFfTEVOX0lOVkFMSURfRVJSCTB4YzcKKyNkZWZpbmUgSVBNSV9SRVFfTEVOX0VYQ0VFREVEX0VSUgkweGM4CisjZGVmaW5lIElQTUlfTk9UX0lOX01ZX1NUQVRFX0VSUgkweGQ1CS8qIElQTUkgMi4wICovCisjZGVmaW5lIElQTUlfTE9TVF9BUkJJVFJBVElPTl9FUlIJMHg4MQorI2RlZmluZSBJUE1JX0JVU19FUlIJCQkweDgyCisjZGVmaW5lIElQTUlfTkFLX09OX1dSSVRFX0VSUgkJMHg4MworI2RlZmluZSBJUE1JX0VSUl9VTlNQRUNJRklFRAkJMHhmZgorCisjZGVmaW5lIElQTUlfQ0hBTk5FTF9QUk9UT0NPTF9JUE1CCTEKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX1BST1RPQ09MX0lDTUIJMgorI2RlZmluZSBJUE1JX0NIQU5ORUxfUFJPVE9DT0xfU01CVVMJNAorI2RlZmluZSBJUE1JX0NIQU5ORUxfUFJPVE9DT0xfS0NTCTUKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX1BST1RPQ09MX1NNSUMJNgorI2RlZmluZSBJUE1JX0NIQU5ORUxfUFJPVE9DT0xfQlQxMAk3CisjZGVmaW5lIElQTUlfQ0hBTk5FTF9QUk9UT0NPTF9CVDE1CTgKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX1BST1RPQ09MX1RNT0RFCTkKKworI2RlZmluZSBJUE1JX0NIQU5ORUxfTUVESVVNX0lQTUIJMQorI2RlZmluZSBJUE1JX0NIQU5ORUxfTUVESVVNX0lDTUIxMAkyCisjZGVmaW5lIElQTUlfQ0hBTk5FTF9NRURJVU1fSUNNQjA5CTMKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX01FRElVTV84MDIzTEFOCTQKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX01FRElVTV9BU1lOQwk1CisjZGVmaW5lIElQTUlfQ0hBTk5FTF9NRURJVU1fT1RIRVJfTEFOCTYKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX01FRElVTV9QQ0lfU01CVVMJNworI2RlZmluZSBJUE1JX0NIQU5ORUxfTUVESVVNX1NNQlVTMQk4CisjZGVmaW5lIElQTUlfQ0hBTk5FTF9NRURJVU1fU01CVVMyCTkKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX01FRElVTV9VU0IxCTEwCisjZGVmaW5lIElQTUlfQ0hBTk5FTF9NRURJVU1fVVNCMgkxMQorI2RlZmluZSBJUE1JX0NIQU5ORUxfTUVESVVNX1NZU0lOVEYJMTIKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX01FRElVTV9PRU1fTUlOCTB4NjAKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX01FRElVTV9PRU1fTUFYCTB4N2YKKworI2VuZGlmIC8qIF9fTElOVVhfSVBNSV9NU0dERUZTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXBzZWMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXBzZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTdhNjMwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcHNlYy5oCkBAIC0wLDAgKzEsNDcgQEAKKyNpZm5kZWYgX0xJTlVYX0lQU0VDX0gKKyNkZWZpbmUgX0xJTlVYX0lQU0VDX0gKKworLyogVGhlIGRlZmluaXRpb25zLCByZXF1aXJlZCB0byB0YWxrIHRvIEtBTUUgcmFjb29uIElLRS4gKi8KKworI2luY2x1ZGUgPGxpbnV4L3Bma2V5djIuaD4KKworI2RlZmluZSBJUFNFQ19QT1JUX0FOWQkJMAorI2RlZmluZSBJUFNFQ19VTFBST1RPX0FOWQkyNTUKKyNkZWZpbmUgSVBTRUNfUFJPVE9fQU5ZCQkyNTUKKworZW51bSB7CisJSVBTRUNfTU9ERV9BTlkJCT0gMCwJLyogV2UgZG8gbm90IHN1cHBvcnQgdGhpcyBmb3IgU0EgKi8KKwlJUFNFQ19NT0RFX1RSQU5TUE9SVAk9IDEsCisJSVBTRUNfTU9ERV9UVU5ORUwJPSAyLAorCUlQU0VDX01PREVfQkVFVCAgICAgICAgID0gMworfTsKKworZW51bSB7CisJSVBTRUNfRElSX0FOWQkJPSAwLAorCUlQU0VDX0RJUl9JTkJPVU5ECT0gMSwKKwlJUFNFQ19ESVJfT1VUQk9VTkQJPSAyLAorCUlQU0VDX0RJUl9GV0QJCT0gMywJLyogSXQgaXMgb3VyIG93biAqLworCUlQU0VDX0RJUl9NQVgJCT0gNCwKKwlJUFNFQ19ESVJfSU5WQUxJRAk9IDUKK307CisKK2VudW0geworCUlQU0VDX1BPTElDWV9ESVNDQVJECT0gMCwKKwlJUFNFQ19QT0xJQ1lfTk9ORQk9IDEsCisJSVBTRUNfUE9MSUNZX0lQU0VDCT0gMiwKKwlJUFNFQ19QT0xJQ1lfRU5UUlVTVAk9IDMsCisJSVBTRUNfUE9MSUNZX0JZUEFTUwk9IDQKK307CisKK2VudW0geworCUlQU0VDX0xFVkVMX0RFRkFVTFQJPSAwLAorCUlQU0VDX0xFVkVMX1VTRQkJPSAxLAorCUlQU0VDX0xFVkVMX1JFUVVJUkUJPSAyLAorCUlQU0VDX0xFVkVMX1VOSVFVRQk9IDMKK307CisKKyNkZWZpbmUgSVBTRUNfTUFOVUFMX1JFUUlEX01BWAkweDNmZmYKKworI2RlZmluZSBJUFNFQ19SRVBMQVlXU0laRSAgMzIKKworI2VuZGlmCS8qIF9MSU5VWF9JUFNFQ19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lwdjYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXB2Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkODQyY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lwdjYuaApAQCAtMCwwICsxLDE2NCBAQAorI2lmbmRlZiBfSVBWNl9ICisjZGVmaW5lIF9JUFY2X0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKiBUaGUgbGF0ZXN0IGRyYWZ0cyBkZWNsYXJlZCBpbmNyZWFzZSBpbiBtaW5pbWFsIG10dSB1cCB0byAxMjgwLiAqLworCisjZGVmaW5lIElQVjZfTUlOX01UVQkxMjgwCisKKy8qCisgKglBZHZhbmNlZCBBUEkKKyAqCXNvdXJjZSBpbnRlcmZhY2UvYWRkcmVzcyBzZWxlY3Rpb24sIHNvdXJjZSByb3V0aW5nLCBldGMuLi4KKyAqCSp1bmRlciBjb25zdHJ1Y3Rpb24qCisgKi8KKworCitzdHJ1Y3QgaW42X3BrdGluZm8geworCXN0cnVjdCBpbjZfYWRkcglpcGk2X2FkZHI7CisJaW50CQlpcGk2X2lmaW5kZXg7Cit9OworCitzdHJ1Y3QgaXA2X210dWluZm8geworCXN0cnVjdCBzb2NrYWRkcl9pbjYJaXA2bV9hZGRyOworCV9fdTMyCQkJaXA2bV9tdHU7Cit9OworCitzdHJ1Y3QgaW42X2lmcmVxIHsKKwlzdHJ1Y3QgaW42X2FkZHIJaWZyNl9hZGRyOworCV9fdTMyCQlpZnI2X3ByZWZpeGxlbjsKKwlpbnQJCWlmcjZfaWZpbmRleDsgCit9OworCisjZGVmaW5lIElQVjZfU1JDUlRfU1RSSUNUCTB4MDEJLyogRGVwcmVjYXRlZDsgd2lsbCBiZSByZW1vdmVkICovCisjZGVmaW5lIElQVjZfU1JDUlRfVFlQRV8wCTAJLyogRGVwcmVjYXRlZDsgd2lsbCBiZSByZW1vdmVkICovCisjZGVmaW5lIElQVjZfU1JDUlRfVFlQRV8yCTIJLyogSVB2NiB0eXBlIDIgUm91dGluZyBIZWFkZXIJKi8KKworLyoKKyAqCXJvdXRpbmcgaGVhZGVyCisgKi8KK3N0cnVjdCBpcHY2X3J0X2hkciB7CisJX191OAkJbmV4dGhkcjsKKwlfX3U4CQloZHJsZW47CisJX191OAkJdHlwZTsKKwlfX3U4CQlzZWdtZW50c19sZWZ0OworCisJLyoKKwkgKgl0eXBlIHNwZWNpZmljIGRhdGEKKwkgKgl2YXJpYWJsZSBsZW5ndGggZmllbGQKKwkgKi8KK307CisKKworc3RydWN0IGlwdjZfb3B0X2hkciB7CisJX191OCAJCW5leHRoZHI7CisJX191OCAJCWhkcmxlbjsKKwkvKiAKKwkgKiBUTFYgZW5jb2RlZCBvcHRpb24gZGF0YSBmb2xsb3dzLgorCSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsJLyogcmVxdWlyZWQgZm9yIHNvbWUgYXJjaHMgKi8KKworI2RlZmluZSBpcHY2X2Rlc3RvcHRfaGRyIGlwdjZfb3B0X2hkcgorI2RlZmluZSBpcHY2X2hvcG9wdF9oZHIgIGlwdjZfb3B0X2hkcgorCisKKy8qCisgKglyb3V0aW5nIGhlYWRlciB0eXBlIDAgKHVzZWQgaW4gY21zZ2hkciBzdHJ1Y3QpCisgKi8KKworc3RydWN0IHJ0MF9oZHIgeworCXN0cnVjdCBpcHY2X3J0X2hkcglydF9oZHI7CisJX191MzIJCQlyZXNlcnZlZDsKKwlzdHJ1Y3QgaW42X2FkZHIJCWFkZHJbMF07CisKKyNkZWZpbmUgcnQwX3R5cGUJCXJ0X2hkci50eXBlCit9OworCisvKgorICoJcm91dGluZyBoZWFkZXIgdHlwZSAyCisgKi8KKworc3RydWN0IHJ0Ml9oZHIgeworCXN0cnVjdCBpcHY2X3J0X2hkcglydF9oZHI7CisJX191MzIJCQlyZXNlcnZlZDsKKwlzdHJ1Y3QgaW42X2FkZHIJCWFkZHI7CisKKyNkZWZpbmUgcnQyX3R5cGUJCXJ0X2hkci50eXBlCit9OworCisvKgorICoJaG9tZSBhZGRyZXNzIG9wdGlvbiBpbiBkZXN0aW5hdGlvbiBvcHRpb25zIGhlYWRlcgorICovCisKK3N0cnVjdCBpcHY2X2Rlc3RvcHRfaGFvIHsKKwlfX3U4CQkJdHlwZTsKKwlfX3U4CQkJbGVuZ3RoOworCXN0cnVjdCBpbjZfYWRkcgkJYWRkcjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qCisgKglJUHY2IGZpeGVkIGhlYWRlcgorICoKKyAqCUJFV0FSRSwgaXQgaXMgaW5jb3JyZWN0LiBUaGUgZmlyc3QgNCBiaXRzIG9mIGZsb3dfbGJsCisgKglhcmUgZ2x1ZWQgdG8gcHJpb3JpdHkgbm93LCBmb3JtaW5nICJjbGFzcyIuCisgKi8KKworc3RydWN0IGlwdjZoZHIgeworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTgJCQlwcmlvcml0eTo0LAorCQkJCXZlcnNpb246NDsKKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTgJCQl2ZXJzaW9uOjQsCisJCQkJcHJpb3JpdHk6NDsKKyNlbHNlCisjZXJyb3IJIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCisjZW5kaWYKKwlfX3U4CQkJZmxvd19sYmxbM107CisKKwlfX2JlMTYJCQlwYXlsb2FkX2xlbjsKKwlfX3U4CQkJbmV4dGhkcjsKKwlfX3U4CQkJaG9wX2xpbWl0OworCisJc3RydWN0CWluNl9hZGRyCXNhZGRyOworCXN0cnVjdAlpbjZfYWRkcglkYWRkcjsKK307CisKKworLyogaW5kZXggdmFsdWVzIGZvciB0aGUgdmFyaWFibGVzIGluIGlwdjZfZGV2Y29uZiAqLworZW51bSB7CisJREVWQ09ORl9GT1JXQVJESU5HID0gMCwKKwlERVZDT05GX0hPUExJTUlULAorCURFVkNPTkZfTVRVNiwKKwlERVZDT05GX0FDQ0VQVF9SQSwKKwlERVZDT05GX0FDQ0VQVF9SRURJUkVDVFMsCisJREVWQ09ORl9BVVRPQ09ORiwKKwlERVZDT05GX0RBRF9UUkFOU01JVFMsCisJREVWQ09ORl9SVFJfU09MSUNJVFMsCisJREVWQ09ORl9SVFJfU09MSUNJVF9JTlRFUlZBTCwKKwlERVZDT05GX1JUUl9TT0xJQ0lUX0RFTEFZLAorCURFVkNPTkZfVVNFX1RFTVBBRERSLAorCURFVkNPTkZfVEVNUF9WQUxJRF9MRlQsCisJREVWQ09ORl9URU1QX1BSRUZFUkVEX0xGVCwKKwlERVZDT05GX1JFR0VOX01BWF9SRVRSWSwKKwlERVZDT05GX01BWF9ERVNZTkNfRkFDVE9SLAorCURFVkNPTkZfTUFYX0FERFJFU1NFUywKKwlERVZDT05GX0ZPUkNFX01MRF9WRVJTSU9OLAorCURFVkNPTkZfQUNDRVBUX1JBX0RFRlJUUiwKKwlERVZDT05GX0FDQ0VQVF9SQV9QSU5GTywKKwlERVZDT05GX0FDQ0VQVF9SQV9SVFJfUFJFRiwKKwlERVZDT05GX1JUUl9QUk9CRV9JTlRFUlZBTCwKKwlERVZDT05GX0FDQ0VQVF9SQV9SVF9JTkZPX01BWF9QTEVOLAorCURFVkNPTkZfUFJPWFlfTkRQLAorCURFVkNPTkZfT1BUSU1JU1RJQ19EQUQsCisJREVWQ09ORl9BQ0NFUFRfU09VUkNFX1JPVVRFLAorCURFVkNPTkZfTUNfRk9SV0FSRElORywKKwlERVZDT05GX0RJU0FCTEVfSVBWNiwKKwlERVZDT05GX0FDQ0VQVF9EQUQsCisJREVWQ09ORl9GT1JDRV9UTExBTywKKwlERVZDT05GX01BWAorfTsKKworCisjZW5kaWYgLyogX0lQVjZfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcHY2X3JvdXRlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lwdjZfcm91dGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWE2ZDFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcHY2X3JvdXRlLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqCUxpbnV4IElORVQ2IGltcGxlbWVudGF0aW9uIAorICoKKyAqCUF1dGhvcnM6CisgKglQZWRybyBSb3F1ZQkJPHJvcXVlQGRpLmZjLnVsLnB0PgkKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0lQVjZfUk9VVEVfSAorI2RlZmluZSBfTElOVVhfSVBWNl9ST1VURV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFJURl9ERUZBVUxUCTB4MDAwMTAwMDAJLyogZGVmYXVsdCAtIGxlYXJuZWQgdmlhIE5ECSovCisjZGVmaW5lIFJURl9BTExPTkxJTksJMHgwMDAyMDAwMAkvKiAoZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkKQorCQkJCQkgICBmYWxsYmFjaywgbm8gcm91dGVycyBvbiBsaW5rICovCisjZGVmaW5lIFJURl9BRERSQ09ORgkweDAwMDQwMDAwCS8qIGFkZHJjb25mIHJvdXRlIC0gUkEJCSovCisjZGVmaW5lIFJURl9QUkVGSVhfUlQJMHgwMDA4MDAwMAkvKiBBIHByZWZpeCBvbmx5IHJvdXRlIC0gUkEJKi8KKyNkZWZpbmUgUlRGX0FOWUNBU1QJMHgwMDEwMDAwMAkvKiBBbnljYXN0CQkJKi8KKworI2RlZmluZSBSVEZfTk9ORVhUSE9QCTB4MDAyMDAwMDAJLyogcm91dGUgd2l0aCBubyBuZXh0aG9wCSovCisjZGVmaW5lIFJURl9FWFBJUkVTCTB4MDA0MDAwMDAKKworI2RlZmluZSBSVEZfUk9VVEVJTkZPCTB4MDA4MDAwMDAJLyogcm91dGUgaW5mb3JtYXRpb24gLSBSQQkqLworCisjZGVmaW5lIFJURl9DQUNIRQkweDAxMDAwMDAwCS8qIGNhY2hlIGVudHJ5CQkJKi8KKyNkZWZpbmUgUlRGX0ZMT1cJMHgwMjAwMDAwMAkvKiBmbG93IHNpZ25pZmljYW50IHJvdXRlCSovCisjZGVmaW5lIFJURl9QT0xJQ1kJMHgwNDAwMDAwMAkvKiBwb2xpY3kgcm91dGUJCQkqLworCisjZGVmaW5lIFJURl9QUkVGKHByZWYpCSgocHJlZikgPDwgMjcpCisjZGVmaW5lIFJURl9QUkVGX01BU0sJMHgxODAwMDAwMAorCisjZGVmaW5lIFJURl9MT0NBTAkweDgwMDAwMDAwCisKKworc3RydWN0IGluNl9ydG1zZyB7CisJc3RydWN0IGluNl9hZGRyCQlydG1zZ19kc3Q7CisJc3RydWN0IGluNl9hZGRyCQlydG1zZ19zcmM7CisJc3RydWN0IGluNl9hZGRyCQlydG1zZ19nYXRld2F5OworCV9fdTMyCQkJcnRtc2dfdHlwZTsKKwlfX3UxNgkJCXJ0bXNnX2RzdF9sZW47CisJX191MTYJCQlydG1zZ19zcmNfbGVuOworCV9fdTMyCQkJcnRtc2dfbWV0cmljOworCXVuc2lnbmVkIGxvbmcJCXJ0bXNnX2luZm87CisgICAgICAgIF9fdTMyCQkJcnRtc2dfZmxhZ3M7CisJaW50CQkJcnRtc2dfaWZpbmRleDsKK307CisKKyNkZWZpbmUgUlRNU0dfTkVXREVWSUNFCQkweDExCisjZGVmaW5lIFJUTVNHX0RFTERFVklDRQkJMHgxMgorI2RlZmluZSBSVE1TR19ORVdST1VURQkJMHgyMQorI2RlZmluZSBSVE1TR19ERUxST1VURQkJMHgyMgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXB4LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lweC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNDgwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lweC5oCkBAIC0wLDAgKzEsNzUgQEAKKyNpZm5kZWYgX0lQWF9IXworI2RlZmluZSBfSVBYX0hfCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjZGVmaW5lIElQWF9OT0RFX0xFTgk2CisjZGVmaW5lIElQWF9NVFUJCTU3NgorCitzdHJ1Y3Qgc29ja2FkZHJfaXB4IHsKKwlfX2tlcm5lbF9zYV9mYW1pbHlfdCBzaXB4X2ZhbWlseTsKKwlfX2JlMTYJCXNpcHhfcG9ydDsKKwlfX2JlMzIJCXNpcHhfbmV0d29yazsKKwl1bnNpZ25lZCBjaGFyIAlzaXB4X25vZGVbSVBYX05PREVfTEVOXTsKKwlfX3U4CQlzaXB4X3R5cGU7CisJdW5zaWduZWQgY2hhcglzaXB4X3plcm87CS8qIDE2IGJ5dGUgZmlsbCAqLworfTsKKworLyoKKyAqIFNvIHdlIGNhbiBmaXQgdGhlIGV4dHJhIGluZm8gZm9yIFNJT0NTSUZBRERSIGludG8gdGhlIGFkZHJlc3MgbmljZWx5CisgKi8KKyNkZWZpbmUgc2lweF9zcGVjaWFsCXNpcHhfcG9ydAorI2RlZmluZSBzaXB4X2FjdGlvbglzaXB4X3plcm8KKyNkZWZpbmUgSVBYX0RMVElURgkwCisjZGVmaW5lIElQWF9DUlRJVEYJMQorCitzdHJ1Y3QgaXB4X3JvdXRlX2RlZmluaXRpb24geworCV9fYmUzMiAgICAgICAgaXB4X25ldHdvcms7CisJX19iZTMyICAgICAgICBpcHhfcm91dGVyX25ldHdvcms7CisJdW5zaWduZWQgY2hhciBpcHhfcm91dGVyX25vZGVbSVBYX05PREVfTEVOXTsKK307CisKK3N0cnVjdCBpcHhfaW50ZXJmYWNlX2RlZmluaXRpb24geworCV9fYmUzMiAgICAgICAgaXB4X25ldHdvcms7CisJdW5zaWduZWQgY2hhciBpcHhfZGV2aWNlWzE2XTsKKwl1bnNpZ25lZCBjaGFyIGlweF9kbGlua190eXBlOworI2RlZmluZSBJUFhfRlJBTUVfTk9ORQkJMAorI2RlZmluZSBJUFhfRlJBTUVfU05BUAkJMQorI2RlZmluZSBJUFhfRlJBTUVfODAyMgkJMgorI2RlZmluZSBJUFhfRlJBTUVfRVRIRVJJSQkzCisjZGVmaW5lIElQWF9GUkFNRV84MDIzCQk0CisjZGVmaW5lIElQWF9GUkFNRV9UUl84MDIyICAgICAgIDUgLyogb2Jzb2xldGUgKi8KKwl1bnNpZ25lZCBjaGFyIGlweF9zcGVjaWFsOworI2RlZmluZSBJUFhfU1BFQ0lBTF9OT05FCTAKKyNkZWZpbmUgSVBYX1BSSU1BUlkJCTEKKyNkZWZpbmUgSVBYX0lOVEVSTkFMCQkyCisJdW5zaWduZWQgY2hhciBpcHhfbm9kZVtJUFhfTk9ERV9MRU5dOworfTsKKwkKK3N0cnVjdCBpcHhfY29uZmlnX2RhdGEgeworCXVuc2lnbmVkIGNoYXIJaXB4Y2ZnX2F1dG9fc2VsZWN0X3ByaW1hcnk7CisJdW5zaWduZWQgY2hhcglpcHhjZmdfYXV0b19jcmVhdGVfaW50ZXJmYWNlczsKK307CisKKy8qCisgKiBPTEQgUm91dGUgRGVmaW5pdGlvbiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyAqLworCitzdHJ1Y3QgaXB4X3JvdXRlX2RlZiB7CisJX19iZTMyCQlpcHhfbmV0d29yazsKKwlfX2JlMzIJCWlweF9yb3V0ZXJfbmV0d29yazsKKyNkZWZpbmUgSVBYX1JPVVRFX05PX1JPVVRFUgkwCisJdW5zaWduZWQgY2hhcglpcHhfcm91dGVyX25vZGVbSVBYX05PREVfTEVOXTsKKwl1bnNpZ25lZCBjaGFyCWlweF9kZXZpY2VbMTZdOworCXVuc2lnbmVkIHNob3J0CWlweF9mbGFnczsKKyNkZWZpbmUgSVBYX1JUX1NOQVAJCTgKKyNkZWZpbmUgSVBYX1JUXzgwMjIJCTQKKyNkZWZpbmUgSVBYX1JUX0JMVUVCT09LCQkyCisjZGVmaW5lIElQWF9SVF9ST1VURUQJCTEKK307CisKKyNkZWZpbmUgU0lPQ0FJUFhJVEZDUlQJCShTSU9DUFJPVE9QUklWQVRFKQorI2RlZmluZSBTSU9DQUlQWFBSSVNMVAkJKFNJT0NQUk9UT1BSSVZBVEUgKyAxKQorI2RlZmluZSBTSU9DSVBYQ0ZHREFUQQkJKFNJT0NQUk9UT1BSSVZBVEUgKyAyKQorI2RlZmluZSBTSU9DSVBYTkNQQ09OTgkJKFNJT0NQUk9UT1BSSVZBVEUgKyAzKQorI2VuZGlmIC8qIF9JUFhfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXJkYS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcmRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxNGMzMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXJkYS5oCkBAIC0wLDAgKzEsMjUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGlyZGEuaAorICogVmVyc2lvbjogICAgICAgCisgKiBEZXNjcmlwdGlvbjogICAKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIE1vbiBNYXIgIDggMTQ6MDY6MTIgMTk5OQorICogTW9kaWZpZWQgYXQ6ICAgU2F0IERlYyAyNSAxNjowNjo0MiAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc8O4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEtFUk5FTF9JUkRBX0gKKyNkZWZpbmUgS0VSTkVMX0lSREFfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKworLyogTm90ZSB0aGF0IHRoaXMgZmlsZSBpcyBzaGFyZWQgd2l0aCB1c2VyIHNwYWNlLiAqLworCisvKiBIaW50IGJpdCBwb3NpdGlvbnMgZm9yIGZpcnN0IGhpbnQgYnl0ZSAqLworI2RlZmluZSBISU5UX1BOUCAgICAgICAgIDB4MDEKKyNkZWZpbmUgSElOVF9QREEgICAgICAgICAweDAyCisjZGVmaW5lIEhJTlRfQ09NUFVURVIgICAgMHgwNAorI2RlZmluZSBISU5UX1BSSU5URVIgICAgIDB4MDgKKyNkZWZpbmUgSElOVF9NT0RFTSAgICAgICAweDEwCisjZGVmaW5lIEhJTlRfRkFYICAgICAgICAgMHgyMAorI2RlZmluZSBISU5UX0xBTiAgICAgICAgIDB4NDAKKyNkZWZpbmUgSElOVF9FWFRFTlNJT04gICAweDgwCisKKy8qIEhpbnQgYml0IHBvc2l0aW9ucyBmb3Igc2Vjb25kIGhpbnQgYnl0ZSAoZmlyc3QgZXh0ZW5zaW9uIGJ5dGUpICovCisjZGVmaW5lIEhJTlRfVEVMRVBIT05ZICAgMHgwMQorI2RlZmluZSBISU5UX0ZJTEVfU0VSVkVSIDB4MDIKKyNkZWZpbmUgSElOVF9DT01NICAgICAgICAweDA0CisjZGVmaW5lIEhJTlRfTUVTU0FHRSAgICAgMHgwOAorI2RlZmluZSBISU5UX0hUVFAgICAgICAgIDB4MTAKKyNkZWZpbmUgSElOVF9PQkVYICAgICAgICAweDIwCisKKy8qIElyTE1QIGNoYXJhY3RlciBjb2RlIHZhbHVlcyAqLworI2RlZmluZSBDU19BU0NJSSAgICAgICAgIDB4MDAKKyNkZWZpbmUJQ1NfSVNPXzg4NTlfMSAgICAweDAxCisjZGVmaW5lCUNTX0lTT184ODU5XzIgICAgMHgwMgorI2RlZmluZQlDU19JU09fODg1OV8zICAgIDB4MDMKKyNkZWZpbmUJQ1NfSVNPXzg4NTlfNCAgICAweDA0CisjZGVmaW5lCUNTX0lTT184ODU5XzUgICAgMHgwNQorI2RlZmluZQlDU19JU09fODg1OV82ICAgIDB4MDYKKyNkZWZpbmUJQ1NfSVNPXzg4NTlfNyAgICAweDA3CisjZGVmaW5lCUNTX0lTT184ODU5XzggICAgMHgwOAorI2RlZmluZQlDU19JU09fODg1OV85ICAgIDB4MDkKKyNkZWZpbmUgQ1NfVU5JQ09ERSAgICAgICAweGZmCisKKy8qIFRoZXNlIGFyZSB0aGUgY3VycmVudGx5IGtub3duIGRvbmdsZXMgKi8KK3R5cGVkZWYgZW51bSB7CisJSVJEQV9URUtSQU1fRE9OR0xFICAgICAgID0gMCwKKwlJUkRBX0VTSV9ET05HTEUgICAgICAgICAgPSAxLAorCUlSREFfQUNUSVNZU19ET05HTEUgICAgICA9IDIsCisJSVJEQV9BQ1RJU1lTX1BMVVNfRE9OR0xFID0gMywKKwlJUkRBX0dJUkJJTF9ET05HTEUgICAgICAgPSA0LAorCUlSREFfTElURUxJTktfRE9OR0xFICAgICA9IDUsCisJSVJEQV9BSVJQT1JUX0RPTkdMRSAgICAgID0gNiwKKwlJUkRBX09MRF9CRUxLSU5fRE9OR0xFICAgPSA3LAorCUlSREFfRVA3MjExX0lSICAgICAgICAgICA9IDgsCisJSVJEQV9NQ1AyMTIwX0RPTkdMRSAgICAgID0gOSwKKwlJUkRBX0FDVDIwMExfRE9OR0xFICAgICAgPSAxMCwKKwlJUkRBX01BNjAwX0RPTkdMRSAgICAgICAgPSAxMSwKKwlJUkRBX1RPSU0zMjMyX0RPTkdMRSAgICAgPSAxMiwKKwlJUkRBX0VQNzIxMV9ET05HTEUgICAgICAgPSAxMywKK30gSVJEQV9ET05HTEU7CisKKy8qIFByb3RvY29sIHR5cGVzIHRvIGJlIHVzZWQgZm9yIFNPQ0tfREdSQU0gKi8KK2VudW0geworCUlSREFQUk9UT19VTklUREFUQSA9IDAsCisJSVJEQVBST1RPX1VMVFJBICAgID0gMSwKKwlJUkRBUFJPVE9fTUFYCit9OworCisjZGVmaW5lIFNPTF9JUkxNUCAgICAgIDI2NiAvKiBTYW1lIGFzIFNPTF9JUkRBIGZvciBub3cgKi8KKyNkZWZpbmUgU09MX0lSVFRQICAgICAgMjY2IC8qIFNhbWUgYXMgU09MX0lSREEgZm9yIG5vdyAqLworCisjZGVmaW5lIElSTE1QX0VOVU1ERVZJQ0VTICAgICAgICAxCS8qIFJldHVybiBkaXNjb3ZlcnkgbG9nICovCisjZGVmaW5lIElSTE1QX0lBU19TRVQgICAgICAgICAgICAyCS8qIFNldCBhbiBhdHRyaWJ1dGUgaW4gbG9jYWwgSUFTICovCisjZGVmaW5lIElSTE1QX0lBU19RVUVSWSAgICAgICAgICAzCS8qIFF1ZXJ5IHJlbW90ZSBJQVMgZm9yIGF0dHJpYnV0ZSAqLworI2RlZmluZSBJUkxNUF9ISU5UU19TRVQgICAgICAgICAgNAkvKiBTZXQgaGludCBiaXRzIGFkdmVydGlzZWQgKi8KKyNkZWZpbmUgSVJMTVBfUU9TX1NFVCAgICAgICAgICAgIDUKKyNkZWZpbmUgSVJMTVBfUU9TX0dFVCAgICAgICAgICAgIDYKKyNkZWZpbmUgSVJMTVBfTUFYX1NEVV9TSVpFICAgICAgIDcKKyNkZWZpbmUgSVJMTVBfSUFTX0dFVCAgICAgICAgICAgIDgJLyogR2V0IGFuIGF0dHJpYnV0ZSBmcm9tIGxvY2FsIElBUyAqLworI2RlZmluZSBJUkxNUF9JQVNfREVMCQkgOQkvKiBSZW1vdmUgYXR0cmlidXRlIGZyb20gbG9jYWwgSUFTICovCisjZGVmaW5lIElSTE1QX0hJTlRfTUFTS19TRVQJMTAJLyogU2V0IGRpc2NvdmVyeSBmaWx0ZXIgKi8KKyNkZWZpbmUgSVJMTVBfV0FJVERFVklDRQkxMQkvKiBXYWl0IGZvciBhIG5ldyBkaXNjb3ZlcnkgKi8KKworI2RlZmluZSBJUlRUUF9NQVhfU0RVX1NJWkUgSVJMTVBfTUFYX1NEVV9TSVpFIC8qIENvbXBhdGliaWxpdHkgKi8KKworI2RlZmluZSBJQVNfTUFYX1NUUklORyAgICAgICAgIDI1NgkvKiBTZWUgSXJMTVAgMS4xLCA0LjMuMy4yICovCisjZGVmaW5lIElBU19NQVhfT0NURVRfU1RSSU5HICAxMDI0CS8qIFNlZSBJckxNUCAxLjEsIDQuMy4zLjIgKi8KKyNkZWZpbmUgSUFTX01BWF9DTEFTU05BTUUgICAgICAgNjAJLyogU2VlIElyTE1QIDEuMSwgNC4zLjEgKi8KKyNkZWZpbmUgSUFTX01BWF9BVFRSSUJOQU1FICAgICAgNjAJLyogU2VlIElyTE1QIDEuMSwgNC4zLjMuMSAqLworI2RlZmluZSBJQVNfTUFYX0FUVFJJQk5VTUJFUiAgIDI1NgkvKiBTZWUgSXJMTVAgMS4xLCA0LjMuMy4xICovCisvKiBGb3IgdXNlciBzcGFjZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IC0gbWF5IGJlIGZpeGVkIGluIGtlcm5lbCAyLjUuWAorICogTm90ZSA6IG5lZWQgNjArMSAoJ1wwJyksIG1ha2UgaXQgNjQgZm9yIGFsaWduZW1lbnQgLSBKZWFuIElJICovCisjZGVmaW5lIElBU19FWFBPUlRfQ0xBU1NOQU1FICAgICAgIDY0CisjZGVmaW5lIElBU19FWFBPUlRfQVRUUklCTkFNRSAgICAgMjU2CisKKy8qIEF0dHJpYnV0ZSB0eXBlIG5lZWRlZCBmb3Igc3RydWN0IGlyZGFfaWFzX3NldCAqLworI2RlZmluZSBJQVNfTUlTU0lORyAwCisjZGVmaW5lIElBU19JTlRFR0VSIDEKKyNkZWZpbmUgSUFTX09DVF9TRVEgMgorI2RlZmluZSBJQVNfU1RSSU5HICAzCisKKyNkZWZpbmUgTFNBUF9BTlkgICAgICAgICAgICAgIDB4ZmYKKworc3RydWN0IHNvY2thZGRyX2lyZGEgeworCV9fa2VybmVsX3NhX2ZhbWlseV90IHNpcl9mYW1pbHk7IC8qIEFGX0lSREEgKi8KKwlfX3U4ICAgICAgICBzaXJfbHNhcF9zZWw7IC8qIExTQVAgc2VsZWN0b3IgKi8KKwlfX3UzMiAgICAgICBzaXJfYWRkcjsgICAgIC8qIERldmljZSBhZGRyZXNzICovCisJY2hhciAgICAgICAgc2lyX25hbWVbMjVdOyAvKiBVc3VhbGx5IDxzZXJ2aWNlPjpJckRBOlRpbnlUUCAqLworfTsKKworc3RydWN0IGlyZGFfZGV2aWNlX2luZm8geworCV9fdTMyICAgICAgIHNhZGRyOyAgICAvKiBBZGRyZXNzIG9mIGxvY2FsIGludGVyZmFjZSAqLworCV9fdTMyICAgICAgIGRhZGRyOyAgICAvKiBBZGRyZXNzIG9mIHJlbW90ZSBkZXZpY2UgKi8KKwljaGFyICAgICAgICBpbmZvWzIyXTsgLyogRGVzY3JpcHRpb24gKi8KKwlfX3U4ICAgICAgICBjaGFyc2V0OyAgLyogQ2hhcnNldCB1c2VkIGZvciBkZXNjcmlwdGlvbiAqLworCV9fdTggICAgICAgIGhpbnRzWzJdOyAvKiBIaW50IGJpdHMgKi8KK307CisKK3N0cnVjdCBpcmRhX2RldmljZV9saXN0IHsKKyAgICAgICBfX3UzMiBsZW47CisgICAgICAgc3RydWN0IGlyZGFfZGV2aWNlX2luZm8gZGV2WzFdOworfTsKKworc3RydWN0IGlyZGFfaWFzX3NldCB7CisJY2hhciBpcmRhX2NsYXNzX25hbWVbSUFTX0VYUE9SVF9DTEFTU05BTUVdOworCWNoYXIgaXJkYV9hdHRyaWJfbmFtZVtJQVNfRVhQT1JUX0FUVFJJQk5BTUVdOworCXVuc2lnbmVkIGludCBpcmRhX2F0dHJpYl90eXBlOworCXVuaW9uIHsKKwkJdW5zaWduZWQgaW50IGlyZGFfYXR0cmliX2ludDsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIHNob3J0IGxlbjsKKwkJCV9fdTggb2N0ZXRfc2VxW0lBU19NQVhfT0NURVRfU1RSSU5HXTsKKwkJfSBpcmRhX2F0dHJpYl9vY3RldF9zZXE7CisJCXN0cnVjdCB7CisJCQlfX3U4IGxlbjsKKwkJCV9fdTggY2hhcnNldDsKKwkJCV9fdTggc3RyaW5nW0lBU19NQVhfU1RSSU5HXTsKKwkJfSBpcmRhX2F0dHJpYl9zdHJpbmc7CisJfSBhdHRyaWJ1dGU7CisJX191MzIgICAgICAgZGFkZHI7ICAgIC8qIEFkZHJlc3Mgb2YgZGV2aWNlIChmb3Igc29tZSBxdWVyaWVzIG9ubHkpICovCit9OworCisvKiBTb21lIHByaXZhdGUgSU9DVEwncyAobWF4IDE2KSAqLworI2RlZmluZSBTSU9DU0RPTkdMRSAgICAoU0lPQ0RFVlBSSVZBVEUgKyAwKQorI2RlZmluZSBTSU9DR0RPTkdMRSAgICAoU0lPQ0RFVlBSSVZBVEUgKyAxKQorI2RlZmluZSBTSU9DU0JBTkRXSURUSCAoU0lPQ0RFVlBSSVZBVEUgKyAyKQorI2RlZmluZSBTSU9DU01FRElBQlVTWSAoU0lPQ0RFVlBSSVZBVEUgKyAzKQorI2RlZmluZSBTSU9DR01FRElBQlVTWSAoU0lPQ0RFVlBSSVZBVEUgKyA0KQorI2RlZmluZSBTSU9DR1JFQ0VJVklORyAoU0lPQ0RFVlBSSVZBVEUgKyA1KQorI2RlZmluZSBTSU9DU01PREUgICAgICAoU0lPQ0RFVlBSSVZBVEUgKyA2KQorI2RlZmluZSBTSU9DR01PREUgICAgICAoU0lPQ0RFVlBSSVZBVEUgKyA3KQorI2RlZmluZSBTSU9DU0RUUlJUUyAgICAoU0lPQ0RFVlBSSVZBVEUgKyA4KQorI2RlZmluZSBTSU9DR1FPUyAgICAgICAoU0lPQ0RFVlBSSVZBVEUgKyA5KQorCisvKiBObyByZWFzb24gdG8gaW5jbHVkZSA8bGludXgvaWYuaD4ganVzdCBiZWNhdXNlIG9mIHRoaXMgb25lIDstKSAqLworI2RlZmluZSBJUk5BTVNJWiAxNiAKKworLyogSXJEQSBxdWFsaXR5IG9mIHNlcnZpY2UgaW5mb3JtYXRpb24gKG11c3Qgbm90IGV4Y2VlZCAxNiBieXRlcykgKi8KK3N0cnVjdCBpZl9pcmRhX3FvcyB7CisJdW5zaWduZWQgbG9uZyAgYmF1ZHJhdGU7CisJdW5zaWduZWQgc2hvcnQgZGF0YV9zaXplOworCXVuc2lnbmVkIHNob3J0IHdpbmRvd19zaXplOworCXVuc2lnbmVkIHNob3J0IG1pbl90dXJuX3RpbWU7CisJdW5zaWduZWQgc2hvcnQgbWF4X3R1cm5fdGltZTsKKwl1bnNpZ25lZCBjaGFyICBhZGRfYm9mczsKKwl1bnNpZ25lZCBjaGFyICBsaW5rX2Rpc2M7Cit9OworCisvKiBGb3Igc2V0dGluZyBSVFMgYW5kIERUUiBsaW5lcyBvZiBhIGRvbmdsZSAqLworc3RydWN0IGlmX2lyZGFfbGluZSB7CisJX191OCBkdHI7CisJX191OCBydHM7Cit9OworCisvKiBJckRBIGludGVyZmFjZSBjb25maWd1cmF0aW9uIChkYXRhIHBhcnQgbXVzdCBub3QgZXhjZWVkIDE2IGJ5dGVzKSAqLworc3RydWN0IGlmX2lyZGFfcmVxIHsKKwl1bmlvbiB7CisJCWNoYXIgaWZybl9uYW1lW0lSTkFNU0laXTsgIC8qIGlmIG5hbWUsIGUuZy4gImlyZGEwIiAqLworCX0gaWZyX2lmcm47CisJCisJLyogRGF0YSBwYXJ0ICovCisJdW5pb24geworCQlzdHJ1Y3QgaWZfaXJkYV9saW5lIGlmcnVfbGluZTsKKwkJc3RydWN0IGlmX2lyZGFfcW9zICBpZnJ1X3FvczsKKwkJdW5zaWduZWQgc2hvcnQgICAgICBpZnJ1X2ZsYWdzOworCQl1bnNpZ25lZCBpbnQgICAgICAgIGlmcnVfcmVjZWl2aW5nOworCQl1bnNpZ25lZCBpbnQgICAgICAgIGlmcnVfbW9kZTsKKwkJdW5zaWduZWQgaW50ICAgICAgICBpZnJ1X2RvbmdsZTsKKwl9IGlmcl9pZnJ1OworfTsKKworI2RlZmluZSBpZnJfYmF1ZHJhdGUgIGlmcl9pZnJ1LmlmcnVfcW9zLmJhdWRyYXRlCisjZGVmaW5lIGlmcl9yZWNlaXZpbmcgaWZyX2lmcnUuaWZydV9yZWNlaXZpbmcgCisjZGVmaW5lIGlmcl9kb25nbGUgICAgaWZyX2lmcnUuaWZydV9kb25nbGUKKyNkZWZpbmUgaWZyX21vZGUgICAgICBpZnJfaWZydS5pZnJ1X21vZGUKKyNkZWZpbmUgaWZyX2R0ciAgICAgICBpZnJfaWZydS5pZnJ1X2xpbmUuZHRyCisjZGVmaW5lIGlmcl9ydHMgICAgICAgaWZyX2lmcnUuaWZydV9saW5lLnJ0cworCisKKy8qIElyREEgbmV0bGluayBkZWZpbml0aW9ucyAqLworI2RlZmluZSBJUkRBX05MX05BTUUgImlyZGEiCisjZGVmaW5lIElSREFfTkxfVkVSU0lPTiAxCisKK2VudW0gaXJkYV9ubF9jb21tYW5kcyB7CisJSVJEQV9OTF9DTURfVU5TUEVDLAorCUlSREFfTkxfQ01EX1NFVF9NT0RFLAorCUlSREFfTkxfQ01EX0dFVF9NT0RFLAorCisJX19JUkRBX05MX0NNRF9BRlRFUl9MQVNUCit9OworI2RlZmluZSBJUkRBX05MX0NNRF9NQVggKF9fSVJEQV9OTF9DTURfQUZURVJfTEFTVCAtIDEpCisKK2VudW0gbmw4MDIxMV9hdHRycyB7CisJSVJEQV9OTF9BVFRSX1VOU1BFQywKKwlJUkRBX05MX0FUVFJfSUZOQU1FLAorCUlSREFfTkxfQVRUUl9NT0RFLAorCisJX19JUkRBX05MX0FUVFJfQUZURVJfTEFTVAorfTsKKyNkZWZpbmUgSVJEQV9OTF9BVFRSX01BWCAoX19JUkRBX05MX0FUVFJfQUZURVJfTEFTVCAtIDEpCisKKy8qIElyREEgbW9kZXMgKi8KKyNkZWZpbmUgSVJEQV9NT0RFX1BSSU1BUlkgICAweDEKKyNkZWZpbmUgSVJEQV9NT0RFX1NFQ09OREFSWSAweDIKKyNkZWZpbmUgSVJEQV9NT0RFX01PTklUT1IgICAweDQKKworI2VuZGlmIC8qIEtFUk5FTF9JUkRBX0ggKi8KKworCisKKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcnFuci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcnFuci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZmI2M2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lycW5yLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9MSU5VWF9JUlFOUl9ICisjZGVmaW5lIF9MSU5VWF9JUlFOUl9ICisKKy8qCisgKiBHZW5lcmljIGlycV9kZXNjIGl0ZXJhdG9yczoKKyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXNkbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pc2RuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3MmIwYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXNkbi5oCkBAIC0wLDAgKzEsMTQyIEBACisvKiAkSWQ6IGlzZG4uaCx2IDEuMTI1LjIuMyAyMDA0LzAyLzEwIDAxOjA3OjE0IGtlaWwgRXhwICQKKyAqCisgKiBNYWluIGhlYWRlciBmb3IgdGhlIExpbnV4IElTRE4gc3Vic3lzdGVtIChsaW5rbGV2ZWwpLgorICoKKyAqIENvcHlyaWdodCAxOTk0LDk1LDk2IGJ5IEZyaXR6IEVsZmVydCAoZnJpdHpAaXNkbjRsaW51eC5kZSkKKyAqIENvcHlyaWdodCAxOTk1LDk2ICAgIGJ5IFRoaW5raW5nIE9iamVjdHMgU29mdHdhcmUgR21iSCBXdWVyemJ1cmcKKyAqIENvcHlyaWdodCAxOTk1LDk2ICAgIGJ5IE1pY2hhZWwgSGlwcCAoTWljaGFlbC5IaXBwQHN0dWRlbnQudW5pLXR1ZWJpbmdlbi5kZSkKKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0lTRE5fSF9fCisjZGVmaW5lIF9fSVNETl9IX18KKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNkZWZpbmUgSVNETl9NQVhfRFJJVkVSUyAgICAzMgorI2RlZmluZSBJU0ROX01BWF9DSEFOTkVMUyAgIDY0CisKKy8qIE5ldyBpb2N0bC1jb2RlcyAqLworI2RlZmluZSBJSU9DTkVUQUlGICBfSU8oJ0knLDEpCisjZGVmaW5lIElJT0NORVRESUYgIF9JTygnSScsMikKKyNkZWZpbmUgSUlPQ05FVFNDRiAgX0lPKCdJJywzKQorI2RlZmluZSBJSU9DTkVUR0NGICBfSU8oJ0knLDQpCisjZGVmaW5lIElJT0NORVRBTk0gIF9JTygnSScsNSkKKyNkZWZpbmUgSUlPQ05FVEROTSAgX0lPKCdJJyw2KQorI2RlZmluZSBJSU9DTkVUR05NICBfSU8oJ0knLDcpCisjZGVmaW5lIElJT0NHRVRTRVQgIF9JTygnSScsOCkgLyogbm8gbG9uZ2VyIHN1cHBvcnRlZCAqLworI2RlZmluZSBJSU9DU0VUU0VUICBfSU8oJ0knLDkpIC8qIG5vIGxvbmdlciBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgSUlPQ1NFVFZFUiAgX0lPKCdJJywxMCkKKyNkZWZpbmUgSUlPQ05FVEhVUCAgX0lPKCdJJywxMSkKKyNkZWZpbmUgSUlPQ1NFVEdTVCAgX0lPKCdJJywxMikKKyNkZWZpbmUgSUlPQ1NFVEJSSiAgX0lPKCdJJywxMykKKyNkZWZpbmUgSUlPQ1NJR1BSRiAgX0lPKCdJJywxNCkKKyNkZWZpbmUgSUlPQ0dFVFBSRiAgX0lPKCdJJywxNSkKKyNkZWZpbmUgSUlPQ1NFVFBSRiAgX0lPKCdJJywxNikKKyNkZWZpbmUgSUlPQ0dFVE1BUCAgX0lPKCdJJywxNykKKyNkZWZpbmUgSUlPQ1NFVE1BUCAgX0lPKCdJJywxOCkKKyNkZWZpbmUgSUlPQ05FVEFTTCAgX0lPKCdJJywxOSkKKyNkZWZpbmUgSUlPQ05FVERJTCAgX0lPKCdJJywyMCkKKyNkZWZpbmUgSUlPQ0dFVENQUyAgX0lPKCdJJywyMSkKKyNkZWZpbmUgSUlPQ0dFVERWUiAgX0lPKCdJJywyMikKKyNkZWZpbmUgSUlPQ05FVExDUiAgX0lPKCdJJywyMykgLyogZHdhYmMgaW9jdGwgZm9yIExDUiBmcm9tIGlzZG5sb2cgKi8KKyNkZWZpbmUgSUlPQ05FVERXUlNFVCAgX0lPKCdJJywyNCkgLyogZHdhYmMgaW9jdGwgdG8gcmVzZXQgYWJjLXZhbHVlcyB0byBkZWZhdWx0IG9uIGEgbmV0LWludGVyZmFjZSAqLworCisjZGVmaW5lIElJT0NORVRBTE4gIF9JTygnSScsMzIpCisjZGVmaW5lIElJT0NORVRETE4gIF9JTygnSScsMzMpCisKKyNkZWZpbmUgSUlPQ05FVEdQTiAgX0lPKCdJJywzNCkKKworI2RlZmluZSBJSU9DREJHVkFSICBfSU8oJ0knLDEyNykKKworI2RlZmluZSBJSU9DRFJWQ1RMICBfSU8oJ0knLDEyOCkKKworLyogY2lzY28gaGRsY2sgZGV2aWNlIHByaXZhdGUgaW9jdGxzICovCisjZGVmaW5lIFNJT0NHS0VFUFBFUklPRAkoU0lPQ0RFVlBSSVZBVEUgKyAwKQorI2RlZmluZSBTSU9DU0tFRVBQRVJJT0QJKFNJT0NERVZQUklWQVRFICsgMSkKKyNkZWZpbmUgU0lPQ0dERUJTRVJJTlQJKFNJT0NERVZQUklWQVRFICsgMikKKyNkZWZpbmUgU0lPQ1NERUJTRVJJTlQJKFNJT0NERVZQUklWQVRFICsgMykKKworLyogUGFja2V0IGVuY2Fwc3VsYXRpb25zIGZvciBuZXQtaW50ZXJmYWNlcyAqLworI2RlZmluZSBJU0ROX05FVF9FTkNBUF9FVEhFUiAgICAgIDAKKyNkZWZpbmUgSVNETl9ORVRfRU5DQVBfUkFXSVAgICAgICAxCisjZGVmaW5lIElTRE5fTkVUX0VOQ0FQX0lQVFlQICAgICAgMgorI2RlZmluZSBJU0ROX05FVF9FTkNBUF9DSVNDT0hETEMgIDMgLyogV2l0aG91dCBTTEFSUCBhbmQga2VlcGFsaXZlICovCisjZGVmaW5lIElTRE5fTkVUX0VOQ0FQX1NZTkNQUFAgICAgNAorI2RlZmluZSBJU0ROX05FVF9FTkNBUF9VSUhETEMgICAgIDUKKyNkZWZpbmUgSVNETl9ORVRfRU5DQVBfQ0lTQ09IRExDSyA2IC8qIFdpdGggU0xBUlAgYW5kIGtlZXBhbGl2ZSAgICAqLworI2RlZmluZSBJU0ROX05FVF9FTkNBUF9YMjVJRkFDRSAgIDcgLyogRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3gyNS1pZmFjZS50eHQgKi8KKyNkZWZpbmUgSVNETl9ORVRfRU5DQVBfTUFYX0VOQ0FQICBJU0ROX05FVF9FTkNBUF9YMjVJRkFDRQorCisvKiBGYWNpbGl0eSB3aGljaCBjdXJyZW50bHkgdXNlcyBhbiBJU0ROLWNoYW5uZWwgKi8KKyNkZWZpbmUgSVNETl9VU0FHRV9OT05FICAgICAgIDAKKyNkZWZpbmUgSVNETl9VU0FHRV9SQVcgICAgICAgIDEKKyNkZWZpbmUgSVNETl9VU0FHRV9NT0RFTSAgICAgIDIKKyNkZWZpbmUgSVNETl9VU0FHRV9ORVQgICAgICAgIDMKKyNkZWZpbmUgSVNETl9VU0FHRV9WT0lDRSAgICAgIDQKKyNkZWZpbmUgSVNETl9VU0FHRV9GQVggICAgICAgIDUKKyNkZWZpbmUgSVNETl9VU0FHRV9NQVNLICAgICAgIDcgLyogTWFzayB0byBnZXQgcGxhaW4gdXNhZ2UgKi8KKyNkZWZpbmUgSVNETl9VU0FHRV9ESVNBQkxFRCAgMzIgLyogVGhpcyBiaXQgaXMgc2V0LCBpZiBjaGFubmVsIGlzIGRpc2FibGVkICovCisjZGVmaW5lIElTRE5fVVNBR0VfRVhDTFVTSVZFIDY0IC8qIFRoaXMgYml0IGlzIHNldCwgaWYgY2hhbm5lbCBpcyBleGNsdXNpdmUgKi8KKyNkZWZpbmUgSVNETl9VU0FHRV9PVVRHT0lORyAxMjggLyogVGhpcyBiaXQgaXMgc2V0LCBpZiBjaGFubmVsIGlzIG91dGdvaW5nICAqLworCisjZGVmaW5lIElTRE5fTU9ERU1fTlVNUkVHICAgIDI0ICAgICAgICAvKiBOdW1iZXIgb2YgTW9kZW0tUmVnaXN0ZXJzICAgICAgICAqLworI2RlZmluZSBJU0ROX0xNU05MRU4gICAgICAgICAyNTUgLyogTGVuZ3RoIG9mIHR0eSdzIExpc3Rlbi1NU04gc3RyaW5nICovCisjZGVmaW5lIElTRE5fQ01TR0xFTgkgICAgIDUwCSAvKiBMZW5ndGggb2YgQ09OTkVDVC1NZXNzYWdlIHRvIGFkZCBmb3IgTW9kZW0gKi8KKworI2RlZmluZSBJU0ROX01TTkxFTiAgICAgICAgICAzMgorI2RlZmluZSBORVRfRFYgMHgwNiAgLyogRGF0YSB2ZXJzaW9uIGZvciBpc2RuX25ldF9pb2N0bF9jZmcgICAqLworI2RlZmluZSBUVFlfRFYgMHgwNiAgLyogRGF0YSB2ZXJzaW9uIGZvciBpcHJvZmQgZXRjLiAgICAgICAgICAqLworCisjZGVmaW5lIElORl9EViAweDAxICAvKiBEYXRhIHZlcnNpb24gZm9yIC9kZXYvaXNkbmluZm8gICAgICAgICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY2hhciBkcnZpZFsyNV07CisgIHVuc2lnbmVkIGxvbmcgYXJnOworfSBpc2RuX2lvY3RsX3N0cnVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyIG5hbWVbMTBdOworICBjaGFyIHBob25lW0lTRE5fTVNOTEVOXTsKKyAgaW50ICBvdXRnb2luZzsKK30gaXNkbl9uZXRfaW9jdGxfcGhvbmU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY2hhciBuYW1lWzEwXTsgICAgIC8qIE5hbWUgb2YgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgKi8KKyAgY2hhciBtYXN0ZXJbMTBdOyAgIC8qIE5hbWUgb2YgTWFzdGVyIGZvciBCdW5kbGluZyAgICAgICAgICAgKi8KKyAgY2hhciBzbGF2ZVsxMF07ICAgIC8qIE5hbWUgb2YgU2xhdmUgZm9yIEJ1bmRsaW5nICAgICAgICAgICAgKi8KKyAgY2hhciBlYXpbMjU2XTsgICAgIC8qIEVBWi9NU04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgY2hhciBkcnZpZFsyNV07ICAgIC8qIERyaXZlcklkIGZvciBCaW5kaW5ncyAgICAgICAgICAgICAgICAgKi8KKyAgaW50ICBvbmh0aW1lOyAgICAgIC8qIEhhbmd1cC1UaW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50ICBjaGFyZ2U7ICAgICAgIC8qIENoYXJnZS1Vbml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50ICBsMl9wcm90bzsgICAgIC8qIExheWVyLTIgcHJvdG9jb2wgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50ICBsM19wcm90bzsgICAgIC8qIExheWVyLTMgcHJvdG9jb2wgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50ICBwX2VuY2FwOyAgICAgIC8qIEVuY2Fwc3VsYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50ICBleGNsdXNpdmU7ICAgIC8qIENoYW5uZWwsIGlmIGJvdW5kIGV4Y2x1c2l2ZSAgICAgICAgICAgKi8KKyAgaW50ICBkaWFsbWF4OyAgICAgIC8qIERpYWwgUmV0cnktQ291bnRlciAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50ICBzbGF2ZWRlbGF5OyAgIC8qIERlbGF5IHVudGlsIHNsYXZlIHN0YXJ0cyB1cCAgICAgICAgICAgKi8KKyAgaW50ICBjYmRlbGF5OyAgICAgIC8qIERlbGF5IGJlZm9yZSBDYWxsYmFjayAgICAgICAgICAgICAgICAgKi8KKyAgaW50ICBjaGFyZ2VodXA7ICAgIC8qIEZsYWc6IENoYXJnZS1IYW5ndXAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50ICBpaHVwOyAgICAgICAgIC8qIEZsYWc6IEhhbmd1cC1UaW1lb3V0IG9uIGluY29taW5nIGxpbmUgKi8KKyAgaW50ICBzZWN1cmU7ICAgICAgIC8qIEZsYWc6IFNlY3VyZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50ICBjYWxsYmFjazsgICAgIC8qIEZsYWc6IENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50ICBjYmh1cDsgICAgICAgIC8qIEZsYWc6IFJlamVjdCBDYWxsIGJlZm9yZSBDYWxsYmFjayAgICAgKi8KKyAgaW50ICBwcHBiaW5kOyAgICAgIC8qIGlwcHAgZGV2aWNlIGZvciBiaW5kaW5ncyAgICAgICAgICAgICAgKi8KKyAgaW50ICBjaGFyZ2VpbnQ7ICAgIC8qIFVzZSBmaXhlZCBjaGFyZ2UgaW50ZXJ2YWwgbGVuZ3RoICAgICAgKi8KKyAgaW50ICB0cmlnZ2VyY3BzOyAgIC8qIEJvZ29DUFMgbmVlZGVkIGZvciB0cmlnZ2VyaW5nIHNsYXZlICAgKi8KKyAgaW50ICBkaWFsdGltZW91dDsgIC8qIERpYWwtVGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50ICBkaWFsd2FpdDsgICAgIC8qIFRpbWUgdG8gd2FpdCBhZnRlciBmYWlsZWQgZGlhbCAgICAgICAgKi8KKyAgaW50ICBkaWFsbW9kZTsgICAgIC8qIEZsYWc6IG9mZiAvIG9uIC8gYXV0byAgICAgICAgICAgICAgICAgKi8KK30gaXNkbl9uZXRfaW9jdGxfY2ZnOworCisjZGVmaW5lIElTRE5fTkVUX0RJQUxNT0RFX01BU0sgIDB4QzAgICAgLyogYml0cyBmb3Igc3RhdHVzICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTRE5fTkVUX0RNX09GRgkgICAgICAgIDB4MDAgICAgLyogdGhpcyBpbnRlcmZhY2UgaXMgc3RvcHBlZCAgICAgICovCisjZGVmaW5lIElTRE5fTkVUX0RNX01BTlVBTAkweDQwICAgIC8qIHRoaXMgaW50ZXJmYWNlIGlzIG9uIChtYW51YWwpICAqLworI2RlZmluZSBJU0ROX05FVF9ETV9BVVRPCTB4ODAgICAgLyogdGhpcyBpbnRlcmZhY2UgaXMgYXV0b2RpYWwgICAgICovCisjZGVmaW5lIElTRE5fTkVUX0RJQUxNT0RFKHgpICgoJih4KSktPmZsYWdzICYgSVNETl9ORVRfRElBTE1PREVfTUFTSykKKworCisjZW5kaWYgLyogX19JU0ROX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pc2RuL2NhcGljbWQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXNkbi9jYXBpY21kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU4NjM1ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXNkbi9jYXBpY21kLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qICRJZDogY2FwaWNtZC5oLHYgMS4yLjYuMiAyMDAxLzA5LzIzIDIyOjI0OjMzIGthaSBFeHAgJAorICogCisgKiBDQVBJIDIuMCBJbnRlcmZhY2UgZm9yIExpbnV4CisgKiAKKyAqIENvcHlyaWdodCAxOTk3IGJ5IENhcnN0ZW4gUGFldGggPGNhbGxlQGNhbGxlLmRlPgorICogCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqLworCisjaWZuZGVmIF9fQ0FQSUNNRF9IX18KKyNkZWZpbmUgX19DQVBJQ01EX0hfXworCisjZGVmaW5lIENBUElfTVNHX0JBU0VMRU4JCTgKKyNkZWZpbmUgQ0FQSV9EQVRBX0IzX1JFUV9MRU4JCShDQVBJX01TR19CQVNFTEVOKzQrNCsyKzIrMikKKyNkZWZpbmUgQ0FQSV9EQVRBX0IzX1JFU1BfTEVOCQkoQ0FQSV9NU0dfQkFTRUxFTis0KzIpCisKKy8qLS0tLS0gQ0FQSSBjb21tYW5kcyAtLS0tLSovCisjZGVmaW5lIENBUElfQUxFUlQJCSAgICAweDAxCisjZGVmaW5lIENBUElfQ09OTkVDVAkJICAgIDB4MDIKKyNkZWZpbmUgQ0FQSV9DT05ORUNUX0FDVElWRQkgICAgMHgwMworI2RlZmluZSBDQVBJX0NPTk5FQ1RfQjNfQUNUSVZFCSAgICAweDgzCisjZGVmaW5lIENBUElfQ09OTkVDVF9CMyAJICAgIDB4ODIKKyNkZWZpbmUgQ0FQSV9DT05ORUNUX0IzX1Q5MF9BQ1RJVkUgIDB4ODgKKyNkZWZpbmUgQ0FQSV9EQVRBX0IzCQkgICAgMHg4NgorI2RlZmluZSBDQVBJX0RJU0NPTk5FQ1RfQjMJICAgIDB4ODQKKyNkZWZpbmUgQ0FQSV9ESVNDT05ORUNUIAkgICAgMHgwNAorI2RlZmluZSBDQVBJX0ZBQ0lMSVRZCQkgICAgMHg4MAorI2RlZmluZSBDQVBJX0lORk8JCSAgICAweDA4CisjZGVmaW5lIENBUElfTElTVEVOCQkgICAgMHgwNQorI2RlZmluZSBDQVBJX01BTlVGQUNUVVJFUgkgICAgMHhmZgorI2RlZmluZSBDQVBJX1JFU0VUX0IzCQkgICAgMHg4NworI2RlZmluZSBDQVBJX1NFTEVDVF9CX1BST1RPQ09MCSAgICAweDQxCisKKy8qLS0tLS0gQ0FQSSBzdWJjb21tYW5kcyAtLS0tLSovCisKKyNkZWZpbmUgQ0FQSV9SRVEgICAgMHg4MAorI2RlZmluZSBDQVBJX0NPTkYgICAweDgxCisjZGVmaW5lIENBUElfSU5EICAgIDB4ODIKKyNkZWZpbmUgQ0FQSV9SRVNQICAgMHg4MworCisvKi0tLS0tIENBUEkgY29tYmluZWQgY29tbWFuZHMgLS0tLS0qLworCisjZGVmaW5lIENBUElDTUQoY21kLHN1YmNtZCkJKCgoY21kKTw8OCl8KHN1YmNtZCkpCisKKyNkZWZpbmUgQ0FQSV9ESVNDT05ORUNUX1JFUQkJQ0FQSUNNRChDQVBJX0RJU0NPTk5FQ1QsQ0FQSV9SRVEpCisjZGVmaW5lIENBUElfRElTQ09OTkVDVF9DT05GCQlDQVBJQ01EKENBUElfRElTQ09OTkVDVCxDQVBJX0NPTkYpCisjZGVmaW5lIENBUElfRElTQ09OTkVDVF9JTkQJCUNBUElDTUQoQ0FQSV9ESVNDT05ORUNULENBUElfSU5EKQorI2RlZmluZSBDQVBJX0RJU0NPTk5FQ1RfUkVTUAkJQ0FQSUNNRChDQVBJX0RJU0NPTk5FQ1QsQ0FQSV9SRVNQKQorCisjZGVmaW5lIENBUElfQUxFUlRfUkVRCQkJQ0FQSUNNRChDQVBJX0FMRVJULENBUElfUkVRKQorI2RlZmluZSBDQVBJX0FMRVJUX0NPTkYJCQlDQVBJQ01EKENBUElfQUxFUlQsQ0FQSV9DT05GKQorCisjZGVmaW5lIENBUElfQ09OTkVDVF9SRVEJCUNBUElDTUQoQ0FQSV9DT05ORUNULENBUElfUkVRKQorI2RlZmluZSBDQVBJX0NPTk5FQ1RfQ09ORgkJQ0FQSUNNRChDQVBJX0NPTk5FQ1QsQ0FQSV9DT05GKQorI2RlZmluZSBDQVBJX0NPTk5FQ1RfSU5ECQlDQVBJQ01EKENBUElfQ09OTkVDVCxDQVBJX0lORCkKKyNkZWZpbmUgQ0FQSV9DT05ORUNUX1JFU1AJCUNBUElDTUQoQ0FQSV9DT05ORUNULENBUElfUkVTUCkKKworI2RlZmluZSBDQVBJX0NPTk5FQ1RfQUNUSVZFX1JFUQkJQ0FQSUNNRChDQVBJX0NPTk5FQ1RfQUNUSVZFLENBUElfUkVRKQorI2RlZmluZSBDQVBJX0NPTk5FQ1RfQUNUSVZFX0NPTkYJQ0FQSUNNRChDQVBJX0NPTk5FQ1RfQUNUSVZFLENBUElfQ09ORikKKyNkZWZpbmUgQ0FQSV9DT05ORUNUX0FDVElWRV9JTkQJCUNBUElDTUQoQ0FQSV9DT05ORUNUX0FDVElWRSxDQVBJX0lORCkKKyNkZWZpbmUgQ0FQSV9DT05ORUNUX0FDVElWRV9SRVNQCUNBUElDTUQoQ0FQSV9DT05ORUNUX0FDVElWRSxDQVBJX1JFU1ApCisKKyNkZWZpbmUgQ0FQSV9TRUxFQ1RfQl9QUk9UT0NPTF9SRVEJQ0FQSUNNRChDQVBJX1NFTEVDVF9CX1BST1RPQ09MLENBUElfUkVRKQorI2RlZmluZSBDQVBJX1NFTEVDVF9CX1BST1RPQ09MX0NPTkYJQ0FQSUNNRChDQVBJX1NFTEVDVF9CX1BST1RPQ09MLENBUElfQ09ORikKKworI2RlZmluZSBDQVBJX0NPTk5FQ1RfQjNfQUNUSVZFX1JFUQlDQVBJQ01EKENBUElfQ09OTkVDVF9CM19BQ1RJVkUsQ0FQSV9SRVEpCisjZGVmaW5lIENBUElfQ09OTkVDVF9CM19BQ1RJVkVfQ09ORglDQVBJQ01EKENBUElfQ09OTkVDVF9CM19BQ1RJVkUsQ0FQSV9DT05GKQorI2RlZmluZSBDQVBJX0NPTk5FQ1RfQjNfQUNUSVZFX0lORAlDQVBJQ01EKENBUElfQ09OTkVDVF9CM19BQ1RJVkUsQ0FQSV9JTkQpCisjZGVmaW5lIENBUElfQ09OTkVDVF9CM19BQ1RJVkVfUkVTUAlDQVBJQ01EKENBUElfQ09OTkVDVF9CM19BQ1RJVkUsQ0FQSV9SRVNQKQorCisjZGVmaW5lIENBUElfQ09OTkVDVF9CM19SRVEJCUNBUElDTUQoQ0FQSV9DT05ORUNUX0IzLENBUElfUkVRKQorI2RlZmluZSBDQVBJX0NPTk5FQ1RfQjNfQ09ORgkJQ0FQSUNNRChDQVBJX0NPTk5FQ1RfQjMsQ0FQSV9DT05GKQorI2RlZmluZSBDQVBJX0NPTk5FQ1RfQjNfSU5ECQlDQVBJQ01EKENBUElfQ09OTkVDVF9CMyxDQVBJX0lORCkKKyNkZWZpbmUgQ0FQSV9DT05ORUNUX0IzX1JFU1AJCUNBUElDTUQoQ0FQSV9DT05ORUNUX0IzLENBUElfUkVTUCkKKworCisjZGVmaW5lIENBUElfQ09OTkVDVF9CM19UOTBfQUNUSVZFX0lORAlDQVBJQ01EKENBUElfQ09OTkVDVF9CM19UOTBfQUNUSVZFLENBUElfSU5EKQorI2RlZmluZSBDQVBJX0NPTk5FQ1RfQjNfVDkwX0FDVElWRV9SRVNQCUNBUElDTUQoQ0FQSV9DT05ORUNUX0IzX1Q5MF9BQ1RJVkUsQ0FQSV9SRVNQKQorCisjZGVmaW5lIENBUElfREFUQV9CM19SRVEJCUNBUElDTUQoQ0FQSV9EQVRBX0IzLENBUElfUkVRKQorI2RlZmluZSBDQVBJX0RBVEFfQjNfQ09ORgkJQ0FQSUNNRChDQVBJX0RBVEFfQjMsQ0FQSV9DT05GKQorI2RlZmluZSBDQVBJX0RBVEFfQjNfSU5ECQlDQVBJQ01EKENBUElfREFUQV9CMyxDQVBJX0lORCkKKyNkZWZpbmUgQ0FQSV9EQVRBX0IzX1JFU1AJCUNBUElDTUQoQ0FQSV9EQVRBX0IzLENBUElfUkVTUCkKKworI2RlZmluZSBDQVBJX0RJU0NPTk5FQ1RfQjNfUkVRCQlDQVBJQ01EKENBUElfRElTQ09OTkVDVF9CMyxDQVBJX1JFUSkKKyNkZWZpbmUgQ0FQSV9ESVNDT05ORUNUX0IzX0NPTkYJCUNBUElDTUQoQ0FQSV9ESVNDT05ORUNUX0IzLENBUElfQ09ORikKKyNkZWZpbmUgQ0FQSV9ESVNDT05ORUNUX0IzX0lORAkJQ0FQSUNNRChDQVBJX0RJU0NPTk5FQ1RfQjMsQ0FQSV9JTkQpCisjZGVmaW5lIENBUElfRElTQ09OTkVDVF9CM19SRVNQCQlDQVBJQ01EKENBUElfRElTQ09OTkVDVF9CMyxDQVBJX1JFU1ApCisKKyNkZWZpbmUgQ0FQSV9SRVNFVF9CM19SRVEJCUNBUElDTUQoQ0FQSV9SRVNFVF9CMyxDQVBJX1JFUSkKKyNkZWZpbmUgQ0FQSV9SRVNFVF9CM19DT05GCQlDQVBJQ01EKENBUElfUkVTRVRfQjMsQ0FQSV9DT05GKQorI2RlZmluZSBDQVBJX1JFU0VUX0IzX0lORAkJQ0FQSUNNRChDQVBJX1JFU0VUX0IzLENBUElfSU5EKQorI2RlZmluZSBDQVBJX1JFU0VUX0IzX1JFU1AJCUNBUElDTUQoQ0FQSV9SRVNFVF9CMyxDQVBJX1JFU1ApCisKKyNkZWZpbmUgQ0FQSV9MSVNURU5fUkVRCQkJQ0FQSUNNRChDQVBJX0xJU1RFTixDQVBJX1JFUSkKKyNkZWZpbmUgQ0FQSV9MSVNURU5fQ09ORgkJQ0FQSUNNRChDQVBJX0xJU1RFTixDQVBJX0NPTkYpCisKKyNkZWZpbmUgQ0FQSV9NQU5VRkFDVFVSRVJfUkVRCQlDQVBJQ01EKENBUElfTUFOVUZBQ1RVUkVSLENBUElfUkVRKQorI2RlZmluZSBDQVBJX01BTlVGQUNUVVJFUl9DT05GCQlDQVBJQ01EKENBUElfTUFOVUZBQ1RVUkVSLENBUElfQ09ORikKKyNkZWZpbmUgQ0FQSV9NQU5VRkFDVFVSRVJfSU5ECQlDQVBJQ01EKENBUElfTUFOVUZBQ1RVUkVSLENBUElfSU5EKQorI2RlZmluZSBDQVBJX01BTlVGQUNUVVJFUl9SRVNQCQlDQVBJQ01EKENBUElfTUFOVUZBQ1RVUkVSLENBUElfUkVTUCkKKworI2RlZmluZSBDQVBJX0ZBQ0lMSVRZX1JFUQkJQ0FQSUNNRChDQVBJX0ZBQ0lMSVRZLENBUElfUkVRKQorI2RlZmluZSBDQVBJX0ZBQ0lMSVRZX0NPTkYJCUNBUElDTUQoQ0FQSV9GQUNJTElUWSxDQVBJX0NPTkYpCisjZGVmaW5lIENBUElfRkFDSUxJVFlfSU5ECQlDQVBJQ01EKENBUElfRkFDSUxJVFksQ0FQSV9JTkQpCisjZGVmaW5lIENBUElfRkFDSUxJVFlfUkVTUAkJQ0FQSUNNRChDQVBJX0ZBQ0lMSVRZLENBUElfUkVTUCkKKworI2RlZmluZSBDQVBJX0lORk9fUkVRCQkJQ0FQSUNNRChDQVBJX0lORk8sQ0FQSV9SRVEpCisjZGVmaW5lIENBUElfSU5GT19DT05GCQkJQ0FQSUNNRChDQVBJX0lORk8sQ0FQSV9DT05GKQorI2RlZmluZSBDQVBJX0lORk9fSU5ECQkJQ0FQSUNNRChDQVBJX0lORk8sQ0FQSV9JTkQpCisjZGVmaW5lIENBUElfSU5GT19SRVNQCQkJQ0FQSUNNRChDQVBJX0lORk8sQ0FQSV9SRVNQKQorCisjZW5kaWYJCQkJLyogX19DQVBJQ01EX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pc2RuX2RpdmVydGlmLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lzZG5fZGl2ZXJ0aWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGZmN2U3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pc2RuX2RpdmVydGlmLmgKQEAgLTAsMCArMSwyNiBAQAorLyogJElkOiBpc2RuX2RpdmVydGlmLmgsdiAxLjQuNi4xIDIwMDEvMDkvMjMgMjI6MjU6MDUga2FpIEV4cCAkCisgKgorICogSGVhZGVyIGZvciB0aGUgZGl2ZXJzaW9uIHN1cHBsZW1lbnRhcnkgaW50ZXJmYWNlIGZvciBpNGwuCisgKgorICogQXV0aG9yICAgIFdlcm5lciBDb3JuZWxpdXMgKHdlcm5lckB0aXRyby5kZSkKKyAqIENvcHlyaWdodCBieSBXZXJuZXIgQ29ybmVsaXVzICh3ZXJuZXJAdGl0cm8uZGUpCisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBtYWdpYyB2YWx1ZSBpcyBhbHNvIHVzZWQgdG8gY29udHJvbCB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIERJVkVSVF9JRl9NQUdJQyAweDI1ODczNDAxCisjZGVmaW5lIERJVkVSVF9DTURfUkVHICAweDAwICAvKiByZWdpc3RlciBjb21tYW5kICovCisjZGVmaW5lIERJVkVSVF9DTURfUkVMICAweDAxICAvKiByZWxlYXNlIGNvbW1hbmQgKi8KKyNkZWZpbmUgRElWRVJUX05PX0VSUiAgIDB4MDAgIC8qIHJldHVybiB2YWx1ZSBubyBlcnJvciAqLworI2RlZmluZSBESVZFUlRfQ01EX0VSUiAgMHgwMSAgLyogaW52YWxpZCBjbWQgKi8KKyNkZWZpbmUgRElWRVJUX1ZFUl9FUlIgIDB4MDIgIC8qIG1hZ2ljL3ZlcnNpb24gaW52YWxpZCAqLworI2RlZmluZSBESVZFUlRfUkVHX0VSUiAgMHgwMyAgLyogbW9kdWxlIGFscmVhZHkgcmVnaXN0ZXJlZCAqLworI2RlZmluZSBESVZFUlRfUkVMX0VSUiAgMHgwNCAgLyogbW9kdWxlIG5vdCByZWdpc3RlcmVkICovCisjZGVmaW5lIERJVkVSVF9SRUdfTkFNRSBpc2RuX3JlZ2lzdGVyX2RpdmVydAorCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lzZG5fcHBwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lzZG5fcHBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFiYjAxNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXNkbl9wcHAuaApAQCAtMCwwICsxLDY3IEBACisvKiBMaW51eCBJU0ROIHN1YnN5c3RlbSwgc3luYyBQUFAsIGludGVyZmFjZSB0byBpcHBwZAorICoKKyAqIENvcHlyaWdodCAxOTk0LTE5OTkgIGJ5IEZyaXR6IEVsZmVydCAoZnJpdHpAaXNkbjRsaW51eC5kZSkKKyAqIENvcHlyaWdodCAxOTk1LDk2ICAgIFRoaW5raW5nIE9iamVjdHMgU29mdHdhcmUgR21iSCBXdWVyemJ1cmcKKyAqIENvcHlyaWdodCAxOTk1LDk2ICAgIGJ5IE1pY2hhZWwgSGlwcCAoTWljaGFlbC5IaXBwQHN0dWRlbnQudW5pLXR1ZWJpbmdlbi5kZSkKKyAqIENvcHlyaWdodCAyMDAwLTIwMDIgIGJ5IEthaSBHZXJtYXNjaGV3c2tpIChrYWlAZ2VybWFzY2hld3NraS5uYW1lKQorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICovCisKKyNpZm5kZWYgX0xJTlVYX0lTRE5fUFBQX0gKKyNkZWZpbmUgX0xJTlVYX0lTRE5fUFBQX0gKKworI2RlZmluZSBDQUxMVFlQRV9JTkNPTUlORyAweDEKKyNkZWZpbmUgQ0FMTFRZUEVfT1VUR09JTkcgMHgyCisjZGVmaW5lIENBTExUWVBFX0NBTExCQUNLIDB4NAorCisjZGVmaW5lIElQUFBfVkVSU0lPTiAgICAiMi4yLjAiCisKK3N0cnVjdCBwcHBjYWxsaW5mbworeworICBpbnQgY2FsbHR5cGU7CisgIHVuc2lnbmVkIGNoYXIgbG9jYWxfbnVtWzY0XTsKKyAgdW5zaWduZWQgY2hhciByZW1vdGVfbnVtWzY0XTsKKyAgaW50IGNoYXJnZV91bml0czsKK307CisKKyNkZWZpbmUgUFBQSU9DR0NBTExJTkZPIF9JT1dSKCd0JywxMjgsc3RydWN0IHBwcGNhbGxpbmZvKQorI2RlZmluZSBQUFBJT0NCVU5ETEUgICBfSU9XKCd0JywxMjksaW50KQorI2RlZmluZSBQUFBJT0NHTVBGTEFHUyBfSU9SKCd0JywxMzAsaW50KQorI2RlZmluZSBQUFBJT0NTTVBGTEFHUyBfSU9XKCd0JywxMzEsaW50KQorI2RlZmluZSBQUFBJT0NTTVBNVFUgICBfSU9XKCd0JywxMzIsaW50KQorI2RlZmluZSBQUFBJT0NTTVBNUlUgICBfSU9XKCd0JywxMzMsaW50KQorI2RlZmluZSBQUFBJT0NHQ09NUFJFU1NPUlMgX0lPUigndCcsMTM0LHVuc2lnbmVkIGxvbmcgWzhdKQorI2RlZmluZSBQUFBJT0NTQ09NUFJFU1NPUiBfSU9XKCd0JywxMzUsaW50KQorI2RlZmluZSBQUFBJT0NHSUZOQU1FICAgICAgX0lPUigndCcsMTM2LCBjaGFyIFtJRk5BTVNJWl0gKQorCisKKyNkZWZpbmUgU0NfTVBfUFJPVCAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFNDX1JFSl9NUF9QUk9UICAgMHgwMDAwMDQwMAorI2RlZmluZSBTQ19PVVRfU0hPUlRfU0VRIDB4MDAwMDA4MDAKKyNkZWZpbmUgU0NfSU5fU0hPUlRfU0VRICAweDAwMDA0MDAwCisKKyNkZWZpbmUgU0NfREVDT01QX09OCQkweDAxCisjZGVmaW5lIFNDX0NPTVBfT04JCTB4MDIKKyNkZWZpbmUgU0NfREVDT01QX0RJU0NBUkQJMHgwNAorI2RlZmluZSBTQ19DT01QX0RJU0NBUkQJCTB4MDgKKyNkZWZpbmUgU0NfTElOS19ERUNPTVBfT04JMHgxMAorI2RlZmluZSBTQ19MSU5LX0NPTVBfT04JCTB4MjAKKyNkZWZpbmUgU0NfTElOS19ERUNPTVBfRElTQ0FSRAkweDQwCisjZGVmaW5lIFNDX0xJTktfQ09NUF9ESVNDQVJECTB4ODAKKworI2RlZmluZSBJU0ROX1BQUF9DT01QX01BWF9PUFRJT05TIDE2CisKKyNkZWZpbmUgSVBQUF9DT01QX0ZMQUdfWE1JVCAweDEKKyNkZWZpbmUgSVBQUF9DT01QX0ZMQUdfTElOSyAweDIKKworc3RydWN0IGlzZG5fcHBwX2NvbXBfZGF0YSB7CisgIGludCBudW07CisgIHVuc2lnbmVkIGNoYXIgb3B0aW9uc1tJU0ROX1BQUF9DT01QX01BWF9PUFRJT05TXTsKKyAgaW50IG9wdGxlbjsKKyAgaW50IGZsYWdzOworfTsKKworI2VuZGlmIC8qIF9MSU5VWF9JU0ROX1BQUF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lzZG5pZi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pc2RuaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGIxYjBiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pc2RuaWYuaApAQCAtMCwwICsxLDU2IEBACisvKiAkSWQ6IGlzZG5pZi5oLHYgMS40My4yLjIgMjAwNC8wMS8xMiAyMzowODozNSBrZWlsIEV4cCAkCisgKgorICogTGludXggSVNETiBzdWJzeXN0ZW0KKyAqIERlZmluaXRpb24gb2YgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBzdWJzeXN0ZW0gYW5kIGl0cyBsb3ctbGV2ZWwgZHJpdmVycy4KKyAqCisgKiBDb3B5cmlnaHQgMTk5NCw5NSw5NiBieSBGcml0eiBFbGZlcnQgKGZyaXR6QGlzZG40bGludXguZGUpCisgKiBDb3B5cmlnaHQgMTk5NSw5NiAgICBUaGlua2luZyBPYmplY3RzIFNvZnR3YXJlIEdtYkggV3VlcnpidXJnCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICovCisKKyNpZm5kZWYgX19JU0ROSUZfSF9fCisjZGVmaW5lIF9fSVNETklGX0hfXworCisKKy8qCisgKiBWYWx1ZXMgZm9yIGdlbmVyYWwgcHJvdG9jb2wtc2VsZWN0aW9uCisgKi8KKyNkZWZpbmUgSVNETl9QVFlQRV9VTktOT1dOICAgMCAgIC8qIFByb3RvY29sIHVuZGVmaW5lZCAgICovCisjZGVmaW5lIElTRE5fUFRZUEVfMVRSNiAgICAgIDEgICAvKiBnZXJtYW4gMVRSNi1wcm90b2NvbCAqLworI2RlZmluZSBJU0ROX1BUWVBFX0VVUk8gICAgICAyICAgLyogRURTUzEtcHJvdG9jb2wgICAgICAgKi8KKyNkZWZpbmUgSVNETl9QVFlQRV9MRUFTRUQgICAgMyAgIC8qIGZvciBsZWFzZWQgbGluZXMgICAgICovCisjZGVmaW5lIElTRE5fUFRZUEVfTkkxICAgICAgIDQgICAvKiBVUyBOSS0xIHByb3RvY29sICAgICAqLworI2RlZmluZSBJU0ROX1BUWVBFX01BWCAgICAgICA3ICAgLyogTWF4LiA4IFByb3RvY29scyAgICAgKi8KKworLyoKKyAqIFZhbHVlcyBmb3IgTGF5ZXItMi1wcm90b2NvbC1zZWxlY3Rpb24KKyAqLworI2RlZmluZSBJU0ROX1BST1RPX0wyX1g3NUkgICAwICAgLyogWDc1L0xBUEIgd2l0aCBJLUZyYW1lcyAgICAgICAgICAgICovCisjZGVmaW5lIElTRE5fUFJPVE9fTDJfWDc1VUkgIDEgICAvKiBYNzUvTEFQQiB3aXRoIFVJLUZyYW1lcyAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNETl9QUk9UT19MMl9YNzVCVUkgMiAgIC8qIFg3NS9MQVBCIHdpdGggVUktRnJhbWVzICAgICAgICAgICAqLworI2RlZmluZSBJU0ROX1BST1RPX0wyX0hETEMgICAzICAgLyogSERMQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTRE5fUFJPVE9fTDJfVFJBTlMgIDQgICAvKiBUcmFuc3BhcmVudCAoVm9pY2UpICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNETl9QUk9UT19MMl9YMjVEVEUgNSAgIC8qIFgyNS9MQVBCIERURSBtb2RlICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJU0ROX1BST1RPX0wyX1gyNURDRSA2ICAgLyogWDI1L0xBUEIgRENFIG1vZGUgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTRE5fUFJPVE9fTDJfVjExMDk2IDcgICAvKiBWLjExMCBiaXRyYXRlIGFkYXB0aW9uIDk2MDAgQmF1ZCAgKi8KKyNkZWZpbmUgSVNETl9QUk9UT19MMl9WMTEwMTkgOCAgIC8qIFYuMTEwIGJpdHJhdGUgYWRhcHRpb24gMTkyMDAgQmF1ZCAqLworI2RlZmluZSBJU0ROX1BST1RPX0wyX1YxMTAzOCA5ICAgLyogVi4xMTAgYml0cmF0ZSBhZGFwdGlvbiAzODQwMCBCYXVkICovCisjZGVmaW5lIElTRE5fUFJPVE9fTDJfTU9ERU0gIDEwICAvKiBBbmFsb2cgTW9kZW0gb24gQm9hcmQgKi8KKyNkZWZpbmUgSVNETl9QUk9UT19MMl9GQVggICAgMTEgIC8qIEZheCBHcm91cCAyLzMgICAgICAgICAqLworI2RlZmluZSBJU0ROX1BST1RPX0wyX0hETENfNTZLIDEyICAgLyogSERMQyA1NmsgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTRE5fUFJPVE9fTDJfTUFYICAgIDE1ICAvKiBNYXguIDE2IFByb3RvY29scyAgICAgICAgICAgICAgICAgKi8KKworLyoKKyAqIFZhbHVlcyBmb3IgTGF5ZXItMy1wcm90b2NvbC1zZWxlY3Rpb24KKyAqLworI2RlZmluZSBJU0ROX1BST1RPX0wzX1RSQU5TCTAJLyogVHJhbnNwYXJlbnQgKi8KKyNkZWZpbmUgSVNETl9QUk9UT19MM19UUkFOU0RTUAkxCS8qIFRyYW5zcGFyZW50IHdpdGggRFNQICovCisjZGVmaW5lIElTRE5fUFJPVE9fTDNfRkNMQVNTMgkyCS8qIEZheCBHcm91cCAyLzMgQ0xBU1MgMiAqLworI2RlZmluZSBJU0ROX1BST1RPX0wzX0ZDTEFTUzEJMwkvKiBGYXggR3JvdXAgMi8zIENMQVNTIDEgKi8KKyNkZWZpbmUgSVNETl9QUk9UT19MM19NQVgJNwkvKiBNYXguIDggUHJvdG9jb2xzICovCisKKworI2VuZGlmIC8qIF9fSVNETklGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pc29fZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXNvX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY4OGFjNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXNvX2ZzLmgKQEAgLTAsMCArMSwxNjUgQEAKKyNpZm5kZWYgX0lTT0ZTX0ZTX0gKKyNkZWZpbmUgX0lTT0ZTX0ZTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KKworLyoKKyAqIFRoZSBpc29mcyBmaWxlc3lzdGVtIGNvbnN0YW50cy9zdHJ1Y3R1cmVzCisgKi8KKworLyogVGhpcyBwYXJ0IGJvcnJvd2VkIGZyb20gdGhlIGJzZDM4NiBpc29mcyAqLworI2RlZmluZSBJU09EQ0woZnJvbSwgdG8pICh0byAtIGZyb20gKyAxKQorCitzdHJ1Y3QgaXNvX3ZvbHVtZV9kZXNjcmlwdG9yIHsKKwljaGFyIHR5cGVbSVNPRENMKDEsMSldOyAvKiA3MTEgKi8KKwljaGFyIGlkW0lTT0RDTCgyLDYpXTsKKwljaGFyIHZlcnNpb25bSVNPRENMKDcsNyldOworCWNoYXIgZGF0YVtJU09EQ0woOCwyMDQ4KV07Cit9OworCisvKiB2b2x1bWUgZGVzY3JpcHRvciB0eXBlcyAqLworI2RlZmluZSBJU09fVkRfUFJJTUFSWSAxCisjZGVmaW5lIElTT19WRF9TVVBQTEVNRU5UQVJZIDIKKyNkZWZpbmUgSVNPX1ZEX0VORCAyNTUKKworI2RlZmluZSBJU09fU1RBTkRBUkRfSUQgIkNEMDAxIgorCitzdHJ1Y3QgaXNvX3ByaW1hcnlfZGVzY3JpcHRvciB7CisJY2hhciB0eXBlCQkJW0lTT0RDTCAoICAxLCAgIDEpXTsgLyogNzExICovCisJY2hhciBpZAkJCQlbSVNPRENMICggIDIsICAgNildOworCWNoYXIgdmVyc2lvbgkJCVtJU09EQ0wgKCAgNywgICA3KV07IC8qIDcxMSAqLworCWNoYXIgdW51c2VkMQkJCVtJU09EQ0wgKCAgOCwgICA4KV07CisJY2hhciBzeXN0ZW1faWQJCQlbSVNPRENMICggIDksICA0MCldOyAvKiBhY2hhcnMgKi8KKwljaGFyIHZvbHVtZV9pZAkJCVtJU09EQ0wgKCA0MSwgIDcyKV07IC8qIGRjaGFycyAqLworCWNoYXIgdW51c2VkMgkJCVtJU09EQ0wgKCA3MywgIDgwKV07CisJY2hhciB2b2x1bWVfc3BhY2Vfc2l6ZQkJW0lTT0RDTCAoIDgxLCAgODgpXTsgLyogNzMzICovCisJY2hhciB1bnVzZWQzCQkJW0lTT0RDTCAoIDg5LCAxMjApXTsKKwljaGFyIHZvbHVtZV9zZXRfc2l6ZQkJW0lTT0RDTCAoMTIxLCAxMjQpXTsgLyogNzIzICovCisJY2hhciB2b2x1bWVfc2VxdWVuY2VfbnVtYmVyCVtJU09EQ0wgKDEyNSwgMTI4KV07IC8qIDcyMyAqLworCWNoYXIgbG9naWNhbF9ibG9ja19zaXplCQlbSVNPRENMICgxMjksIDEzMildOyAvKiA3MjMgKi8KKwljaGFyIHBhdGhfdGFibGVfc2l6ZQkJW0lTT0RDTCAoMTMzLCAxNDApXTsgLyogNzMzICovCisJY2hhciB0eXBlX2xfcGF0aF90YWJsZQkJW0lTT0RDTCAoMTQxLCAxNDQpXTsgLyogNzMxICovCisJY2hhciBvcHRfdHlwZV9sX3BhdGhfdGFibGUJW0lTT0RDTCAoMTQ1LCAxNDgpXTsgLyogNzMxICovCisJY2hhciB0eXBlX21fcGF0aF90YWJsZQkJW0lTT0RDTCAoMTQ5LCAxNTIpXTsgLyogNzMyICovCisJY2hhciBvcHRfdHlwZV9tX3BhdGhfdGFibGUJW0lTT0RDTCAoMTUzLCAxNTYpXTsgLyogNzMyICovCisJY2hhciByb290X2RpcmVjdG9yeV9yZWNvcmQJW0lTT0RDTCAoMTU3LCAxOTApXTsgLyogOS4xICovCisJY2hhciB2b2x1bWVfc2V0X2lkCQlbSVNPRENMICgxOTEsIDMxOCldOyAvKiBkY2hhcnMgKi8KKwljaGFyIHB1Ymxpc2hlcl9pZAkJW0lTT0RDTCAoMzE5LCA0NDYpXTsgLyogYWNoYXJzICovCisJY2hhciBwcmVwYXJlcl9pZAkJW0lTT0RDTCAoNDQ3LCA1NzQpXTsgLyogYWNoYXJzICovCisJY2hhciBhcHBsaWNhdGlvbl9pZAkJW0lTT0RDTCAoNTc1LCA3MDIpXTsgLyogYWNoYXJzICovCisJY2hhciBjb3B5cmlnaHRfZmlsZV9pZAkJW0lTT0RDTCAoNzAzLCA3MzkpXTsgLyogNy41IGRjaGFycyAqLworCWNoYXIgYWJzdHJhY3RfZmlsZV9pZAkJW0lTT0RDTCAoNzQwLCA3NzYpXTsgLyogNy41IGRjaGFycyAqLworCWNoYXIgYmlibGlvZ3JhcGhpY19maWxlX2lkCVtJU09EQ0wgKDc3NywgODEzKV07IC8qIDcuNSBkY2hhcnMgKi8KKwljaGFyIGNyZWF0aW9uX2RhdGUJCVtJU09EQ0wgKDgxNCwgODMwKV07IC8qIDguNC4yNi4xICovCisJY2hhciBtb2RpZmljYXRpb25fZGF0ZQkJW0lTT0RDTCAoODMxLCA4NDcpXTsgLyogOC40LjI2LjEgKi8KKwljaGFyIGV4cGlyYXRpb25fZGF0ZQkJW0lTT0RDTCAoODQ4LCA4NjQpXTsgLyogOC40LjI2LjEgKi8KKwljaGFyIGVmZmVjdGl2ZV9kYXRlCQlbSVNPRENMICg4NjUsIDg4MSldOyAvKiA4LjQuMjYuMSAqLworCWNoYXIgZmlsZV9zdHJ1Y3R1cmVfdmVyc2lvbglbSVNPRENMICg4ODIsIDg4MildOyAvKiA3MTEgKi8KKwljaGFyIHVudXNlZDQJCQlbSVNPRENMICg4ODMsIDg4MyldOworCWNoYXIgYXBwbGljYXRpb25fZGF0YQkJW0lTT0RDTCAoODg0LCAxMzk1KV07CisJY2hhciB1bnVzZWQ1CQkJW0lTT0RDTCAoMTM5NiwgMjA0OCldOworfTsKKworLyogQWxtb3N0IHRoZSBzYW1lIGFzIHRoZSBwcmltYXJ5IGRlc2NyaXB0b3IgYnV0IHR3byBmaWVsZHMgYXJlIHNwZWNpZmllZCAqLworc3RydWN0IGlzb19zdXBwbGVtZW50YXJ5X2Rlc2NyaXB0b3IgeworCWNoYXIgdHlwZQkJCVtJU09EQ0wgKCAgMSwgICAxKV07IC8qIDcxMSAqLworCWNoYXIgaWQJCQkJW0lTT0RDTCAoICAyLCAgIDYpXTsKKwljaGFyIHZlcnNpb24JCQlbSVNPRENMICggIDcsICAgNyldOyAvKiA3MTEgKi8KKwljaGFyIGZsYWdzCQkJW0lTT0RDTCAoICA4LCAgIDgpXTsgLyogODUzICovCisJY2hhciBzeXN0ZW1faWQJCQlbSVNPRENMICggIDksICA0MCldOyAvKiBhY2hhcnMgKi8KKwljaGFyIHZvbHVtZV9pZAkJCVtJU09EQ0wgKCA0MSwgIDcyKV07IC8qIGRjaGFycyAqLworCWNoYXIgdW51c2VkMgkJCVtJU09EQ0wgKCA3MywgIDgwKV07CisJY2hhciB2b2x1bWVfc3BhY2Vfc2l6ZQkJW0lTT0RDTCAoIDgxLCAgODgpXTsgLyogNzMzICovCisJY2hhciBlc2NhcGUJCQlbSVNPRENMICggODksIDEyMCldOyAvKiA4NTYgKi8KKwljaGFyIHZvbHVtZV9zZXRfc2l6ZQkJW0lTT0RDTCAoMTIxLCAxMjQpXTsgLyogNzIzICovCisJY2hhciB2b2x1bWVfc2VxdWVuY2VfbnVtYmVyCVtJU09EQ0wgKDEyNSwgMTI4KV07IC8qIDcyMyAqLworCWNoYXIgbG9naWNhbF9ibG9ja19zaXplCQlbSVNPRENMICgxMjksIDEzMildOyAvKiA3MjMgKi8KKwljaGFyIHBhdGhfdGFibGVfc2l6ZQkJW0lTT0RDTCAoMTMzLCAxNDApXTsgLyogNzMzICovCisJY2hhciB0eXBlX2xfcGF0aF90YWJsZQkJW0lTT0RDTCAoMTQxLCAxNDQpXTsgLyogNzMxICovCisJY2hhciBvcHRfdHlwZV9sX3BhdGhfdGFibGUJW0lTT0RDTCAoMTQ1LCAxNDgpXTsgLyogNzMxICovCisJY2hhciB0eXBlX21fcGF0aF90YWJsZQkJW0lTT0RDTCAoMTQ5LCAxNTIpXTsgLyogNzMyICovCisJY2hhciBvcHRfdHlwZV9tX3BhdGhfdGFibGUJW0lTT0RDTCAoMTUzLCAxNTYpXTsgLyogNzMyICovCisJY2hhciByb290X2RpcmVjdG9yeV9yZWNvcmQJW0lTT0RDTCAoMTU3LCAxOTApXTsgLyogOS4xICovCisJY2hhciB2b2x1bWVfc2V0X2lkCQlbSVNPRENMICgxOTEsIDMxOCldOyAvKiBkY2hhcnMgKi8KKwljaGFyIHB1Ymxpc2hlcl9pZAkJW0lTT0RDTCAoMzE5LCA0NDYpXTsgLyogYWNoYXJzICovCisJY2hhciBwcmVwYXJlcl9pZAkJW0lTT0RDTCAoNDQ3LCA1NzQpXTsgLyogYWNoYXJzICovCisJY2hhciBhcHBsaWNhdGlvbl9pZAkJW0lTT0RDTCAoNTc1LCA3MDIpXTsgLyogYWNoYXJzICovCisJY2hhciBjb3B5cmlnaHRfZmlsZV9pZAkJW0lTT0RDTCAoNzAzLCA3MzkpXTsgLyogNy41IGRjaGFycyAqLworCWNoYXIgYWJzdHJhY3RfZmlsZV9pZAkJW0lTT0RDTCAoNzQwLCA3NzYpXTsgLyogNy41IGRjaGFycyAqLworCWNoYXIgYmlibGlvZ3JhcGhpY19maWxlX2lkCVtJU09EQ0wgKDc3NywgODEzKV07IC8qIDcuNSBkY2hhcnMgKi8KKwljaGFyIGNyZWF0aW9uX2RhdGUJCVtJU09EQ0wgKDgxNCwgODMwKV07IC8qIDguNC4yNi4xICovCisJY2hhciBtb2RpZmljYXRpb25fZGF0ZQkJW0lTT0RDTCAoODMxLCA4NDcpXTsgLyogOC40LjI2LjEgKi8KKwljaGFyIGV4cGlyYXRpb25fZGF0ZQkJW0lTT0RDTCAoODQ4LCA4NjQpXTsgLyogOC40LjI2LjEgKi8KKwljaGFyIGVmZmVjdGl2ZV9kYXRlCQlbSVNPRENMICg4NjUsIDg4MSldOyAvKiA4LjQuMjYuMSAqLworCWNoYXIgZmlsZV9zdHJ1Y3R1cmVfdmVyc2lvbglbSVNPRENMICg4ODIsIDg4MildOyAvKiA3MTEgKi8KKwljaGFyIHVudXNlZDQJCQlbSVNPRENMICg4ODMsIDg4MyldOworCWNoYXIgYXBwbGljYXRpb25fZGF0YQkJW0lTT0RDTCAoODg0LCAxMzk1KV07CisJY2hhciB1bnVzZWQ1CQkJW0lTT0RDTCAoMTM5NiwgMjA0OCldOworfTsKKworCisjZGVmaW5lIEhTX1NUQU5EQVJEX0lEICJDRFJPTSIKKworc3RydWN0ICBoc192b2x1bWVfZGVzY3JpcHRvciB7CisJY2hhciBmb28JCQlbSVNPRENMICggIDEsICAgOCldOyAvKiA3MzMgKi8KKwljaGFyIHR5cGUJCQlbSVNPRENMICggIDksICAgOSldOyAvKiA3MTEgKi8KKwljaGFyIGlkCQkJCVtJU09EQ0wgKCAxMCwgIDE0KV07CisJY2hhciB2ZXJzaW9uCQkJW0lTT0RDTCAoIDE1LCAgMTUpXTsgLyogNzExICovCisJY2hhciBkYXRhW0lTT0RDTCgxNiwyMDQ4KV07Cit9OworCisKK3N0cnVjdCBoc19wcmltYXJ5X2Rlc2NyaXB0b3IgeworCWNoYXIgZm9vCQkJW0lTT0RDTCAoICAxLCAgIDgpXTsgLyogNzMzICovCisJY2hhciB0eXBlCQkJW0lTT0RDTCAoICA5LCAgIDkpXTsgLyogNzExICovCisJY2hhciBpZAkJCQlbSVNPRENMICggMTAsICAxNCldOworCWNoYXIgdmVyc2lvbgkJCVtJU09EQ0wgKCAxNSwgIDE1KV07IC8qIDcxMSAqLworCWNoYXIgdW51c2VkMQkJCVtJU09EQ0wgKCAxNiwgIDE2KV07IC8qIDcxMSAqLworCWNoYXIgc3lzdGVtX2lkCQkJW0lTT0RDTCAoIDE3LCAgNDgpXTsgLyogYWNoYXJzICovCisJY2hhciB2b2x1bWVfaWQJCQlbSVNPRENMICggNDksICA4MCldOyAvKiBkY2hhcnMgKi8KKwljaGFyIHVudXNlZDIJCQlbSVNPRENMICggODEsICA4OCldOyAvKiA3MzMgKi8KKwljaGFyIHZvbHVtZV9zcGFjZV9zaXplCQlbSVNPRENMICggODksICA5NildOyAvKiA3MzMgKi8KKwljaGFyIHVudXNlZDMJCQlbSVNPRENMICggOTcsIDEyOCldOyAvKiA3MzMgKi8KKwljaGFyIHZvbHVtZV9zZXRfc2l6ZQkJW0lTT0RDTCAoMTI5LCAxMzIpXTsgLyogNzIzICovCisJY2hhciB2b2x1bWVfc2VxdWVuY2VfbnVtYmVyCVtJU09EQ0wgKDEzMywgMTM2KV07IC8qIDcyMyAqLworCWNoYXIgbG9naWNhbF9ibG9ja19zaXplCQlbSVNPRENMICgxMzcsIDE0MCldOyAvKiA3MjMgKi8KKwljaGFyIHBhdGhfdGFibGVfc2l6ZQkJW0lTT0RDTCAoMTQxLCAxNDgpXTsgLyogNzMzICovCisJY2hhciB0eXBlX2xfcGF0aF90YWJsZQkJW0lTT0RDTCAoMTQ5LCAxNTIpXTsgLyogNzMxICovCisJY2hhciB1bnVzZWQ0CQkJW0lTT0RDTCAoMTUzLCAxODApXTsgLyogNzMzICovCisJY2hhciByb290X2RpcmVjdG9yeV9yZWNvcmQJW0lTT0RDTCAoMTgxLCAyMTQpXTsgLyogOS4xICovCit9OworCisvKiBXZSB1c2UgdGhpcyB0byBoZWxwIHVzIGxvb2sgdXAgdGhlIHBhcmVudCBpbm9kZSBudW1iZXJzLiAqLworCitzdHJ1Y3QgaXNvX3BhdGhfdGFibGV7CisJdW5zaWduZWQgY2hhciAgbmFtZV9sZW5bMl07CS8qIDcyMSAqLworCWNoYXIgZXh0ZW50WzRdOwkJLyogNzMxICovCisJY2hhciAgcGFyZW50WzJdOwkvKiA3MjEgKi8KKwljaGFyIG5hbWVbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBoaWdoIHNpZXJyYSBpcyBpZGVudGljYWwgdG8gaXNvLCBleGNlcHQgdGhhdCB0aGUgZGF0ZSBpcyBvbmx5IDYgYnl0ZXMsIGFuZAorICAgdGhlcmUgaXMgYW4gZXh0cmEgcmVzZXJ2ZWQgYnl0ZSBhZnRlciB0aGUgZmxhZ3MgKi8KKworc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkIHsKKwljaGFyIGxlbmd0aAkJCVtJU09EQ0wgKDEsIDEpXTsgLyogNzExICovCisJY2hhciBleHRfYXR0cl9sZW5ndGgJCVtJU09EQ0wgKDIsIDIpXTsgLyogNzExICovCisJY2hhciBleHRlbnQJCQlbSVNPRENMICgzLCAxMCldOyAvKiA3MzMgKi8KKwljaGFyIHNpemUJCQlbSVNPRENMICgxMSwgMTgpXTsgLyogNzMzICovCisJY2hhciBkYXRlCQkJW0lTT0RDTCAoMTksIDI1KV07IC8qIDcgYnkgNzExICovCisJY2hhciBmbGFncwkJCVtJU09EQ0wgKDI2LCAyNildOworCWNoYXIgZmlsZV91bml0X3NpemUJCVtJU09EQ0wgKDI3LCAyNyldOyAvKiA3MTEgKi8KKwljaGFyIGludGVybGVhdmUJCQlbSVNPRENMICgyOCwgMjgpXTsgLyogNzExICovCisJY2hhciB2b2x1bWVfc2VxdWVuY2VfbnVtYmVyCVtJU09EQ0wgKDI5LCAzMildOyAvKiA3MjMgKi8KKwl1bnNpZ25lZCBjaGFyIG5hbWVfbGVuCQlbSVNPRENMICgzMywgMzMpXTsgLyogNzExICovCisJY2hhciBuYW1lCQkJWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBJU09GU19CTE9DS19CSVRTIDExCisjZGVmaW5lIElTT0ZTX0JMT0NLX1NJWkUgMjA0OAorCisjZGVmaW5lIElTT0ZTX0JVRkZFUl9TSVpFKElOT0RFKSAoKElOT0RFKS0+aV9zYi0+c19ibG9ja3NpemUpCisjZGVmaW5lIElTT0ZTX0JVRkZFUl9CSVRTKElOT0RFKSAoKElOT0RFKS0+aV9zYi0+c19ibG9ja3NpemVfYml0cykKKworI2VuZGlmIC8qIF9JU09GU19GU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2l2dHYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXZ0di5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmM2NlODUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2l2dHYuaApAQCAtMCwwICsxLDY5IEBACisvKgorICAgIFB1YmxpYyBpdnR2IEFQSSBoZWFkZXIKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCAgS2V2aW4gVGhheWVyIDxudWZhbl93ZmsgYXQgeWFob28uY29tPgorICAgIENvcHlyaWdodCAoQykgMjAwNC0yMDA3ICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9fTElOVVhfSVZUVl9IX18KKyNkZWZpbmUgX19MSU5VWF9JVlRWX0hfXworCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorCisvKiBpdnR2IGtub3dzIHNldmVyYWwgZGlzdGluY3Qgb3V0cHV0IG1vZGVzOiBNUEVHIHN0cmVhbWluZywKKyAgIFlVViBzdHJlYW1pbmcsIFlVViB1cGRhdGVzIHRocm91Z2ggdXNlciBETUEgYW5kIHRoZSBwYXNzdGhyb3VnaAorICAgbW9kZS4KKworICAgSW4gb3JkZXIgdG8gY2xlYXJseSB0ZWxsIHRoZSBkcml2ZXIgdGhhdCB3ZSBhcmUgaW4gdXNlciBETUEKKyAgIFlVViBtb2RlIHlvdSBuZWVkIHRvIGNhbGwgSVZUVl9JT0NfRE1BX0ZSQU1FIHdpdGggeV9zb3VyY2UgPT0gTlVMTAorICAgZmlyc3QgKGFsdGhyb3VnaCBpZiB5b3UgZG9uJ3QgdGhlbiB0aGUgZmlyc3QgdGltZQorICAgRE1BX0ZSQU1FIGlzIGNhbGxlZCB0aGUgbW9kZSBzd2l0Y2ggaXMgZG9uZSBhdXRvbWF0aWNhbGx5KS4KKworICAgV2hlbiB5b3UgY2xvc2UgdGhlIGZpbGUgaGFuZGxlIHRoZSB1c2VyIERNQSBtb2RlIGlzIGV4aXRlZCBhZ2Fpbi4KKworICAgV2hpbGUgaW4gb25lIG1vZGUsIHlvdSBjYW5ub3QgdXNlIGFub3RoZXIgbW9kZSAoRUJVU1kgaXMgcmV0dXJuZWQpLgorCisgICBBbGwgdGhpcyBtZWFucyB0aGF0IGlmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgWVVWIGludGVybGFjaW5nCisgICBmb3IgdGhlIHVzZXIgRE1BIFlVViBtb2RlIHlvdSBmaXJzdCBuZWVkIHRvIGRvIGNhbGwgSVZUVl9JT0NfRE1BX0ZSQU1FCisgICB3aXRoIHlfc291cmNlID09IE5VTEwgYmVmb3JlIHlvdSBjYW4gc2V0IHRoZSBjb3JyZWN0IGZvcm1hdCB1c2luZworICAgVklESU9DX1NfRk1ULgorCisgICBFdmVudHVhbGx5IGFsbCB0aGlzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIGEgcHJvcGVyIFY0TDIgQVBJLAorICAgYnV0IGZvciBub3cgd2UgaGF2ZSB0byBkbyBpdCB0aGlzIHdheS4gKi8KKworc3RydWN0IGl2dHZfZG1hX2ZyYW1lIHsKKwllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZTsgLyogVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgKi8KKwlfX3UzMiBwaXhlbGZvcm1hdDsJIC8qIDAgPT0gc2FtZSBhcyBkZXN0aW5hdGlvbiAqLworCXZvaWQgKnlfc291cmNlOyAgIC8qIGlmIE5VTEwgYW5kIHR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQsCisJCQkJICAgIHRoZW4ganVzdCBzd2l0Y2ggdG8gdXNlciBETUEgWVVWIG91dHB1dCBtb2RlICovCisJdm9pZCAqdXZfc291cmNlOyAgLyogVW51c2VkIGZvciBSR0IgcGl4ZWxmb3JtYXRzICovCisJc3RydWN0IHY0bDJfcmVjdCBzcmM7CisJc3RydWN0IHY0bDJfcmVjdCBkc3Q7CisJX191MzIgc3JjX3dpZHRoOworCV9fdTMyIHNyY19oZWlnaHQ7Cit9OworCisjZGVmaW5lIElWVFZfSU9DX0RNQV9GUkFNRSAgX0lPVyAoJ1YnLCBCQVNFX1ZJRElPQ19QUklWQVRFKzAsIHN0cnVjdCBpdnR2X2RtYV9mcmFtZSkKKworLyogRGVwcmVjYXRlZCBkZWZpbmVzOiBhcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGUgZGVmaW5lcyBmcm9tIHZpZGVvZGV2Mi5oICovCisjZGVmaW5lIElWVFZfU0xJQ0VEX1RZUEVfVEVMRVRFWFRfQiAgICAgVjRMMl9NUEVHX1ZCSV9JVlRWX1RFTEVURVhUX0IKKyNkZWZpbmUgSVZUVl9TTElDRURfVFlQRV9DQVBUSU9OXzUyNSAgICBWNEwyX01QRUdfVkJJX0lWVFZfQ0FQVElPTl81MjUKKyNkZWZpbmUgSVZUVl9TTElDRURfVFlQRV9XU1NfNjI1ICAgICAgICBWNEwyX01QRUdfVkJJX0lWVFZfV1NTXzYyNQorI2RlZmluZSBJVlRWX1NMSUNFRF9UWVBFX1ZQUyAgICAgICAgICAgIFY0TDJfTVBFR19WQklfSVZUVl9WUFMKKworI2VuZGlmIC8qIF9MSU5VWF9JVlRWX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXZ0dmZiLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2l2dHZmYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZWFmNGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2l2dHZmYi5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgICAgT24gU2NyZWVuIERpc3BsYXkgY3gyMzQxNSBGcmFtZWJ1ZmZlciBkcml2ZXIKKworICAgIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyAgSWFuIEFybXN0cm9uZyA8aWFuQGlhcm1zdC5kZW1vbi5jby51az4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9fTElOVVhfSVZUVkZCX0hfXworI2RlZmluZSBfX0xJTlVYX0lWVFZGQl9IX18KKworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogRnJhbWVidWZmZXIgZXh0ZXJuYWwgQVBJICovCisKK3N0cnVjdCBpdnR2ZmJfZG1hX2ZyYW1lIHsKKwl2b2lkICpzb3VyY2U7CisJdW5zaWduZWQgbG9uZyBkZXN0X29mZnNldDsKKwlpbnQgY291bnQ7Cit9OworCisjZGVmaW5lIElWVFZGQl9JT0NfRE1BX0ZSQU1FIAlfSU9XKCdWJywgQkFTRV9WSURJT0NfUFJJVkFURSswLCBzdHJ1Y3QgaXZ0dmZiX2RtYV9mcmFtZSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2l4anVzZXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXhqdXNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiODI5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2l4anVzZXIuaApAQCAtMCwwICsxLDcyMCBAQAorI2lmbmRlZiBfX0xJTlVYX0lYSlVTRVJfSAorI2RlZmluZSBfX0xJTlVYX0lYSlVTRVJfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgaXhqdXNlci5oCisgKgorICogRGV2aWNlIERyaXZlciBmb3IgUXVpY2tuZXQgVGVjaG5vbG9naWVzLCBJbmMuJ3MgVGVsZXBob255IGNhcmRzCisgKiBpbmNsdWRpbmcgdGhlIEludGVybmV0IFBob25lSkFDSywgSW50ZXJuZXQgUGhvbmVKQUNLIExpdGUsCisgKiBJbnRlcm5ldCBQaG9uZUpBQ0sgUENJLCBJbnRlcm5ldCBMaW5lSkFDSywgSW50ZXJuZXQgUGhvbmVDQVJEIGFuZAorICogU21hcnRDQUJMRQorICoKKyAqICAgIChjKSBDb3B5cmlnaHQgMTk5OS0yMDAxICBRdWlja25ldCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcjogICAgICAgICAgRWQgT2tlcnNvbiwgPGVva2Vyc29uQHF1aWNrbmV0Lm5ldD4KKyAqICAgIAorICogQ29udHJpYnV0b3JzOiAgICBHcmVnIEhlcmxlaW4sIDxnaGVybGVpbkBxdWlja25ldC5uZXQ+CisgKiAgICAgICAgICAgICAgICAgIERhdmlkIFcuIEVyaGFydCwgPGRlcmhhcnRAcXVpY2tuZXQubmV0PgorICogICAgICAgICAgICAgICAgICBKb2huIFNlbGxlcnMsIDxqc2VsbGVyc0BxdWlja25ldC5uZXQ+CisgKiAgICAgICAgICAgICAgICAgIE1pa2UgUHJlc3RvbiwgPG1wcmVzdG9uQHF1aWNrbmV0Lm5ldD4KKyAqCisgKiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBoYXJkd2FyZSByZWxhdGVkIHRvIHRoaXMgZHJpdmVyIGNhbiBiZSBmb3VuZAorICogYXQgb3VyIHdlYnNpdGU6ICAgIGh0dHA6Ly93d3cucXVpY2tuZXQubmV0CisgKgorICogRml4ZXM6CisgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgUVVJQ0tORVQgVEVDSE5PTE9HSUVTLCBJTkMuIEJFIExJQUJMRSBUTyBBTlkgUEFSVFkgRk9SCisgKiBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBBTkQgSVRTIERPQ1VNRU5UQVRJT04sIEVWRU4gSUYgUVVJQ0tORVQKKyAqIFRFQ0hOT0xPR0lFUywgSU5DLkhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFFVSUNLTkVUIFRFQ0hOT0xPR0lFUywgSU5DLiBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCisgKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgU09GVFdBUkUgUFJPVklERUQgSEVSRVVOREVSIElTCisgKiBPTiBBTiAiQVMgSVMiIEJBU0lTLCBBTkQgUVVJQ0tORVQgVEVDSE5PTE9HSUVTLCBJTkMuIEhBUyBOTyBPQkxJR0FUSU9OIAorICogVE8gUFJPVklERSBNQUlOVEVOQU5DRSwgU1VQUE9SVCwgVVBEQVRFUywgRU5IQU5DRU1FTlRTLCBPUiBNT0RJRklDQVRJT05TLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3RlbGVwaG9ueS5oPgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogSU9DVEwncyB1c2VkIGZvciB0aGUgUXVpY2tuZXQgVGVsZXBob255IENhcmRzCisqCisqIElmIHlvdSB1c2UgdGhlIElYSkNUTF9URVNUUkFNIGNvbW1hbmQsIHRoZSBjYXJkIG11c3QgYmUgcG93ZXIgY3ljbGVkIHRvCisqIHJlc2V0IHRoZSBTUkFNIHZhbHVlcyBiZWZvcmUgZnVydGhlciB1c2UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSVhKQ1RMX0RTUF9SRVNFVCAJCV9JTyAgKCdxJywgMHhDMCkKKworI2RlZmluZSBJWEpDVExfUklORyAgICAgICAgICAgICAgICAgICAgIFBIT05FX1JJTkcKKyNkZWZpbmUgSVhKQ1RMX0hPT0tTVEFURSAgICAgICAgICAgICAgICBQSE9ORV9IT09LU1RBVEUKKyNkZWZpbmUgSVhKQ1RMX01BWFJJTkdTCQkJUEhPTkVfTUFYUklOR1MKKyNkZWZpbmUgSVhKQ1RMX1JJTkdfQ0FERU5DRQkJUEhPTkVfUklOR19DQURFTkNFCisjZGVmaW5lIElYSkNUTF9SSU5HX1NUQVJUCQlQSE9ORV9SSU5HX1NUQVJUCisjZGVmaW5lIElYSkNUTF9SSU5HX1NUT1AJCVBIT05FX1JJTkdfU1RPUAorCisjZGVmaW5lIElYSkNUTF9DQVJEVFlQRQkJCV9JT1IgKCdxJywgMHhDMSwgaW50KQorI2RlZmluZSBJWEpDVExfU0VSSUFMCQkJX0lPUiAoJ3EnLCAweEMyLCBpbnQpCisjZGVmaW5lIElYSkNUTF9EU1BfVFlQRSAgICAgICAgICAgICAgICAgX0lPUiAoJ3EnLCAweEMzLCBpbnQpCisjZGVmaW5lIElYSkNUTF9EU1BfVkVSU0lPTiAgICAgICAgICAgICAgX0lPUiAoJ3EnLCAweEM0LCBpbnQpCisjZGVmaW5lIElYSkNUTF9WRVJTSU9OICAgICAgICAgICAgICAJX0lPUiAoJ3EnLCAweERBLCBjaGFyICopCisjZGVmaW5lIElYSkNUTF9EU1BfSURMRQkJCV9JTyAgKCdxJywgMHhDNSkKKyNkZWZpbmUgSVhKQ1RMX1RFU1RSQU0JCQlfSU8gICgncScsIDB4QzYpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogVGhpcyBncm91cCBvZiBJT0NUTHMgZGVhbCB3aXRoIHRoZSByZWNvcmQgc2V0dGluZ3Mgb2YgdGhlIERTUAorKgorKiBUaGUgSVhKQ1RMX1JFQ19ERVBUSCBjb21tYW5kIHNldHMgdGhlIGludGVybmFsIGJ1ZmZlciBkZXB0aCBvZiB0aGUgRFNQLgorKiBTZXR0aW5nIGEgbG93ZXIgZGVwdGggcmVkdWNlcyBsYXRlbmN5LCBidXQgaW5jcmVhc2VzIHRoZSBkZW1hbmQgb2YgdGhlCisqIGFwcGxpY2F0aW9uIHRvIHNlcnZpY2UgdGhlIGRyaXZlciB3aXRob3V0IGZyYW1lIGxvc3MuICBUaGUgRFNQIGhhcyA0ODAKKyogYnl0ZXMgb2YgcGh5c2ljYWwgYnVmZmVyIG1lbW9yeSBmb3IgdGhlIHJlY29yZCBjaGFubmVsIHNvIHRoZSB0cnVlCisqIG1heGltdW0gbGltaXQgaXMgZGV0ZXJtaW5lZCBieSBob3cgbWFueSBmcmFtZXMgd2lsbCBmaXQgaW4gdGhlIGJ1ZmZlci4KKyoKKyogMSB1bmNvbXByZXNzZWQgKDQ4MCBieXRlKSAxNi1iaXQgbGluZWFyIGZyYW1lLgorKiAyIHVuY29tcHJlc3NlZCAoMjQwIGJ5dGUpIDgtYml0IEEtbGF3L211LWxhdyBmcmFtZXMuCisqIDE1IFRydWVTcGVlY2ggOC41IGZyYW1lcy4KKyogMjAgVHJ1ZVNwZWVjaCA2LjMsNS4zLDQuOCBvciA0LjEgZnJhbWVzLgorKgorKiBUaGUgZGVmYXVsdCBpbiB0aGUgZHJpdmVyIGlzIGN1cnJlbnRseSBzZXQgdG8gMiBmcmFtZXMuCisqCisqIFRoZSBJWEpDVExfUkVDX1ZPTFVNRSBhbmQgSVhKQ1RMX1BMQVlfVk9MVU1FIGNvbW1hbmRzIGJvdGggdXNlIGEgUTgKKyogbnVtYmVyIGFzIGEgcGFyYW1ldGVyLCAweDEwMCBzY2FsZXMgdGhlIHNpZ25hbCBieSAxLjAsIDB4MjAwIHNjYWxlcyB0aGUKKyogc2lnbmFsIGJ5IDIuMCwgMHg4MCBzY2FsZXMgdGhlIHNpZ25hbCBieSAwLjUuICBObyBwcm90ZWN0aW9uIGlzIGdpdmVuCisqIGFnYWluc3Qgb3Zlci1zY2FsaW5nLCBpZiB0aGUgbXVsdGlwbGljYXRpb24gZmFjdG9yIHRpbWVzIHRoZSBpbnB1dAorKiBzaWduYWwgZXhjZWVkcyAxNiBiaXRzLCBvdmVyZmxvdyBkaXN0b3J0aW9uIHdpbGwgb2NjdXIuICBUaGUgZGVmYXVsdAorKiBzZXR0aW5nIGlzIDB4MTAwICgxLjApLgorKgorKiBUaGUgSVhKQ1RMX1JFQ19MRVZFTCByZXR1cm5zIHRoZSBhdmVyYWdlIHNpZ25hbCBsZXZlbCAobm90IHIubS5zLikgb24KKyogdGhlIG1vc3QgcmVjZW50bHkgcmVjb3JkZWQgZnJhbWUgYXMgYSAxNiBiaXQgdmFsdWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSVhKQ1RMX1JFQ19DT0RFQyAgICAgICAgICAgICAgICBQSE9ORV9SRUNfQ09ERUMKKyNkZWZpbmUgSVhKQ1RMX1JFQ19TVEFSVCAgICAgICAgICAgICAgICBQSE9ORV9SRUNfU1RBUlQKKyNkZWZpbmUgSVhKQ1RMX1JFQ19TVE9QICAgICAgICAgICAgICAgICBQSE9ORV9SRUNfU1RPUAorI2RlZmluZSBJWEpDVExfUkVDX0RFUFRICQlQSE9ORV9SRUNfREVQVEgKKyNkZWZpbmUgSVhKQ1RMX0ZSQU1FCQkJUEhPTkVfRlJBTUUKKyNkZWZpbmUgSVhKQ1RMX1JFQ19WT0xVTUUJCVBIT05FX1JFQ19WT0xVTUUKKyNkZWZpbmUgSVhKQ1RMX1JFQ19MRVZFTAkJUEhPTkVfUkVDX0xFVkVMCisKK3R5cGVkZWYgZW51bSB7CisJZjMwMF82NDAgPSA0LCBmMzAwXzUwMCwgZjExMDAsIGYzNTAsIGY0MDAsIGY0ODAsIGY0NDAsIGY2MjAsIGYyMF81MCwKKwlmMTMzXzIwMCwgZjMwMCwgZjMwMF80MjAsIGYzMzAsIGYzMDBfNDI1LCBmMzMwXzQ0MCwgZjM0MCwgZjM1MF80MDAsCisJZjM1MF80NDAsIGYzNTBfNDUwLCBmMzYwLCBmMzgwXzQyMCwgZjM5MiwgZjQwMF80MjUsIGY0MDBfNDQwLCBmNDAwXzQ1MCwKKwlmNDIwLCBmNDI1LCBmNDI1XzQ1MCwgZjQyNV80NzUsIGY0MzUsIGY0NDBfNDUwLCBmNDQwXzQ4MCwgZjQ0NSwgZjQ1MCwKKwlmNDUyLCBmNDc1LCBmNDgwXzYyMCwgZjQ5NCwgZjUwMCwgZjUyMCwgZjUyMywgZjUyNSwgZjU0MF82NjAsIGY1ODcsCisJZjU5MCwgZjYwMCwgZjY2MCwgZjcwMCwgZjc0MCwgZjc1MCwgZjc1MF8xNDUwLCBmNzcwLCBmODAwLCBmODE2LCBmODUwLAorCWY4NTdfMTY0NSwgZjkwMCwgZjkwMF8xMzAwLCBmOTM1XzEyMTUsIGY5NDFfMTQ3NywgZjk0MiwgZjk1MCwgZjk1MF8xNDAwLAorCWY5NzUsIGYxMDAwLCBmMTAyMCwgZjEwNTAsIGYxMTAwXzE3NTAsIGYxMTQwLCBmMTIwMCwgZjEyMDksIGYxMzMwLCBmMTMzNiwKKwlsZjEzNjYsIGYxMzgwLCBmMTQwMCwgZjE0NzcsIGYxNjAwLCBmMTYzM18xNjM4LCBmMTgwMCwgZjE4NjAKK30gSVhKX0ZJTFRFUl9GUkVROworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGZpbHRlcjsKKwlJWEpfRklMVEVSX0ZSRVEgZnJlcTsKKwljaGFyIGVuYWJsZTsKK30gSVhKX0ZJTFRFUjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIgZW5hYmxlOworCWNoYXIgZW5fZmlsdGVyOworCXVuc2lnbmVkIGludCBmaWx0ZXI7CisJdW5zaWduZWQgaW50IG9uMTsKKwl1bnNpZ25lZCBpbnQgb2ZmMTsKKwl1bnNpZ25lZCBpbnQgb24yOworCXVuc2lnbmVkIGludCBvZmYyOworCXVuc2lnbmVkIGludCBvbjM7CisJdW5zaWduZWQgaW50IG9mZjM7Cit9IElYSl9GSUxURVJfQ0FERU5DRTsKKworI2RlZmluZSBJWEpDVExfU0VUX0ZJTFRFUgkJX0lPVyAoJ3EnLCAweEM3LCBJWEpfRklMVEVSICopCisjZGVmaW5lIElYSkNUTF9TRVRfRklMVEVSX1JBVwkJX0lPVyAoJ3EnLCAweERELCBJWEpfRklMVEVSX1JBVyAqKQorI2RlZmluZSBJWEpDVExfR0VUX0ZJTFRFUl9ISVNUCQlfSU9XICgncScsIDB4QzgsIGludCkKKyNkZWZpbmUgSVhKQ1RMX0ZJTFRFUl9DQURFTkNFCQlfSU9XICgncScsIDB4RDYsIElYSl9GSUxURVJfQ0FERU5DRSAqKQorI2RlZmluZSBJWEpDVExfUExBWV9DSUQJCQlfSU8gICgncScsIDB4RDcpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFRoaXMgSU9DVEwgYWxsb3dzIHlvdSB0byByZWFzc2lnbiB2YWx1ZXMgaW4gdGhlIHRvbmUgaW5kZXggdGFibGUuICBUaGUKKyogdG9uZSB0YWJsZSBoYXMgMzIgZW50cmllcyAoMCAtIDMxKSwgYnV0IHRoZSBkcml2ZXIgb25seSBhbGxvd3MgZW50cmllcworKiAxMyAtIDI3IHRvIGJlIG1vZGlmaWVkLCBlbnRyeSAwIGlzIHJlc2VydmVkIGZvciBzaWxlbmNlIGFuZCAxIC0gMTIgYXJlCisqIHRoZSBzdGFuZGFyZCBEVE1GIGRpZ2l0cyBhbmQgMjggLSAzMSBhcmUgdGhlIERUTUYgdG9uZXMgZm9yIEEsIEIsIEMgJiBELgorKiBUaGUgcG9zaXRpb25zIHVzZWQgaW50ZXJuYWxseSBmb3IgQ2FsbCBQcm9ncmVzcyBUb25lcyBhcmUgYXMgZm9sbG93czoKKyogICAgRGlhbCBUb25lICAgLSAyNQorKiAgICBSaW5nIEJhY2sgICAtIDI2CisqICAgIEJ1c3kgU2lnbmFsIC0gMjcKKyoKKyogVGhlIGZyZXEgdmFsdWVzIGFyZSBjYWxjdWxhdGVkIGFzOgorKiBmcmVxID0gY29zKDIgKiBQSSAqIGZyZXF1ZW5jeSAvIDgwMDApCisqCisqIFRoZSBtb3N0IGNvbW1vbmx5IG5lZWRlZCB2YWx1ZXMgYXJlIGFscmVhZHkgY2FsY3VsYXRlZCBhbmQgbGlzdGVkIGluIHRoZQorKiBlbnVtIElYSl9UT05FX0ZSRVEuICBFYWNoIHRvbmUgaW5kZXggY2FuIGhhdmUgdHdvIGZyZXF1ZW5jaWVzIHdpdGgKKyogZGlmZmVyZW50IGdhaW5zLCBpZiB5b3UgYXJlIG9ubHkgdXNpbmcgYSBzaW5nbGUgZnJlcXVlbmN5IHNldCB0aGUgdW51c2VkCisqIG9uZSB0byAwLgorKgorKiBUaGUgZ2FpbiB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIDE1IGluZGljYXRpbmcgKzZkQiB0byAtMjRkQiBpbiAyZEIKKyogaW5jcmVtZW50cy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBlbnVtIHsKKwloejIwID0gMHg3ZmZhLAorCWh6NTAgPSAweDdmZTUsCisJaHoxMzMgPSAweDdmNGMsCisJaHoyMDAgPSAweDdlNmIsCisJaHoyNjEgPSAweDdkNTAsCQkvKiAuNjMgQzEgICovCisJaHoyNzcgPSAweDdjZmEsCQkvKiAuMTggQ1MxICovCisJaHoyOTMgPSAweDdjOWYsCQkvKiAuNjYgRDEgICovCisJaHozMDAgPSAweDdjNzUsCisJaHozMTEgPSAweDdjMzIsCQkvKiAuMTMgRFMxICovCisJaHozMjkgPSAweDdiYmYsCQkvKiAuNjMgRTEgICovCisJaHozMzAgPSAweDdiYjgsCisJaHozNDAgPSAweDdiNzUsCisJaHozNDkgPSAweDdiMzcsCQkvKiAuMjMgRjEgICovCisJaHozNTAgPSAweDdiMzAsCisJaHozNjAgPSAweDdhZTksCisJaHozNjkgPSAweDdhYTgsCQkvKiAuOTkgRlMxICovCisJaHozODAgPSAweDdhNTYsCisJaHozOTIgPSAweDc5ZmEsCQkvKiAuMDAgRzEgICovCisJaHo0MDAgPSAweDc5YmIsCisJaHo0MTUgPSAweDc5NDEsCQkvKiAuMzAgR1MxICovCisJaHo0MjAgPSAweDc5MTgsCisJaHo0MjUgPSAweDc4ZWUsCisJaHo0MzUgPSAweDc4OTksCisJaHo0NDAgPSAweDc4NmQsCQkvKiAuMDAgQTEgICovCisJaHo0NDUgPSAweDc4NDIsCisJaHo0NTAgPSAweDc4MTUsCisJaHo0NTIgPSAweDc4MDMsCisJaHo0NjYgPSAweDc3ODQsCQkvKiAuMTYgQVMxICovCisJaHo0NzUgPSAweDc3MzEsCisJaHo0ODAgPSAweDc3MDEsCisJaHo0OTMgPSAweDc2ODUsCQkvKiAuODggQjEgICovCisJaHo0OTQgPSAweDc2N2IsCisJaHo1MDAgPSAweDc2NDAsCisJaHo1MjAgPSAweDc1NzgsCisJaHo1MjMgPSAweDc1NTksCQkvKiAuMjUgQzIgICovCisJaHo1MjUgPSAweDc1NDQsCisJaHo1NDAgPSAweDc0YTcsCisJaHo1NTQgPSAweDc0MTEsCQkvKiAuMzcgQ1MyICovCisJaHo1ODcgPSAweDcyYTEsCQkvKiAuMzMgRDIgICovCisJaHo1OTAgPSAweDcyN2YsCisJaHo2MDAgPSAweDcyMGIsCisJaHo2MjAgPSAweDcxMWUsCisJaHo2MjIgPSAweDcxMDYsCQkvKiAuMjUgRFMyICovCisJaHo2NTkgPSAweDZmM2IsCQkvKiAuMjYgRTIgICovCisJaHo2NjAgPSAweDZmMmUsCisJaHo2OTggPSAweDZkM2QsCQkvKiAuNDYgRjIgICovCisJaHo3MDAgPSAweDZkMjIsCisJaHo3MzkgPSAweDZiMDksCQkvKiAuOTkgRlMyICovCisJaHo3NDAgPSAweDZhZmEsCisJaHo3NTAgPSAweDZhNmMsCisJaHo3NzAgPSAweDY5NGIsCisJaHo3ODMgPSAweDY4OGIsCQkvKiAuOTkgRzIgICovCisJaHo4MDAgPSAweDY3OGQsCisJaHo4MTYgPSAweDY2OTgsCisJaHo4MzAgPSAweDY1YmYsCQkvKiAuNjEgR1MyICovCisJaHo4NTAgPSAweDY0ODQsCisJaHo4NTcgPSAweDY0MTQsCisJaHo4ODAgPSAweDYyOWYsCQkvKiAuMDAgQTIgICovCisJaHo5MDAgPSAweDYxNTQsCisJaHo5MzIgPSAweDVmMzUsCQkvKiAuMzMgQVMyICovCisJaHo5MzUgPSAweDVmMDEsCisJaHo5NDEgPSAweDVlOWEsCisJaHo5NDIgPSAweDVlODgsCisJaHo5NTAgPSAweDVkZmQsCisJaHo5NzUgPSAweDVjNDQsCisJaHoxMDAwID0gMHg1YTgxLAorCWh6MTAyMCA9IDB4NTkxMiwKKwloejEwNTAgPSAweDU2ZTIsCisJaHoxMTAwID0gMHg1MzIwLAorCWh6MTE0MCA9IDB4NTAwNywKKwloejEyMDAgPSAweDRiM2IsCisJaHoxMjA5ID0gMHg0YTgwLAorCWh6MTIxNSA9IDB4NGEwMiwKKwloejEyNTAgPSAweDQ3MWMsCisJaHoxMzAwID0gMHg0MmUwLAorCWh6MTMzMCA9IDB4NDA0OSwKKwloejEzMzYgPSAweDNmYzQsCisJaHoxMzY2ID0gMHgzZDIyLAorCWh6MTM4MCA9IDB4M2JlNCwKKwloejE0MDAgPSAweDNhMWIsCisJaHoxNDUwID0gMHgzNTk2LAorCWh6MTQ3NyA9IDB4MzMxYywKKwloejE1MDAgPSAweDMwZmIsCisJaHoxNjAwID0gMHgyNzhkLAorCWh6MTYzMyA9IDB4MjQ2MiwKKwloejE2MzggPSAweDIzZTcsCisJaHoxNjQ1ID0gMHgyMzNhLAorCWh6MTc1MCA9IDB4MThmOCwKKwloejE4MDAgPSAweDE0MDUsCisJaHoxODYwID0gMHhlMGIsCisJaHoyMTAwID0gMHhmNWY2LAorCWh6MjEzMCA9IDB4ZjJmNSwKKwloejI0NTAgPSAweGQzYjMsCisJaHoyNzUwID0gMHhiOGU0Cit9IElYSl9GUkVROworCit0eXBlZGVmIGVudW0geworCUMxID0gaHoyNjEsCisJQ1MxID0gaHoyNzcsCisJRDEgPSBoejI5MywKKwlEUzEgPSBoejMxMSwKKwlFMSA9IGh6MzI5LAorCUYxID0gaHozNDksCisJRlMxID0gaHozNjksCisJRzEgPSBoejM5MiwKKwlHUzEgPSBoejQxNSwKKwlBMSA9IGh6NDQwLAorCUFTMSA9IGh6NDY2LAorCUIxID0gaHo0OTMsCisJQzIgPSBoejUyMywKKwlDUzIgPSBoejU1NCwKKwlEMiA9IGh6NTg3LAorCURTMiA9IGh6NjIyLAorCUUyID0gaHo2NTksCisJRjIgPSBoejY5OCwKKwlGUzIgPSBoejczOSwKKwlHMiA9IGh6NzgzLAorCUdTMiA9IGh6ODMwLAorCUEyID0gaHo4ODAsCisJQVMyID0gaHo5MzIsCit9IElYSl9OT1RFOworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHRvbmVfaW5kZXg7CisJaW50IGZyZXEwOworCWludCBnYWluMDsKKwlpbnQgZnJlcTE7CisJaW50IGdhaW4xOworfSBJWEpfVE9ORTsKKworI2RlZmluZSBJWEpDVExfSU5JVF9UT05FCQlfSU9XICgncScsIDB4QzksIElYSl9UT05FICopCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogVGhlIElYSkNUTF9UT05FX0NBREVOQ0UgaW9jdGwgZGVmaW5lcyB0b25lIHNlcXVlbmNlcyB1c2VkIGZvciB2YXJpb3VzCisqIENhbGwgUHJvZ3Jlc3MgVG9uZXMgKENQVCkuICBUaGlzIGlzIGFjY29tcGxpc2hlZCBieSBzZXR0aW5nIHVwIGFuIGFycmF5IG9mCisqIElYSl9DQURFTkNFX0VMRU1FTlQgc3RydWN0dXJlcyB0aGF0IHNlcXVlbnRpYWxseSBkZWZpbmUgdGhlIHN0YXRlcyBvZgorKiB0aGUgdG9uZSBzZXF1ZW5jZS4gIFRoZSB0b25lX29uX3RpbWUgYW5kIHRvbmVfb2ZmIHRpbWUgYXJlIGluCisqIDI1MCBtaWNyb3NlY29uZCBpbnRlcnZhbHMuICBBIHBvaW50ZXIgdG8gdGhpcyBhcnJheSBpcyBwYXNzZWQgdG8gdGhlCisqIGRyaXZlciBhcyB0aGUgY2UgZWxlbWVudCBvZiBhbiBJWEpfQ0FERU5DRSBzdHJ1Y3R1cmUuICBUaGUgZWxlbWVudHNfdXNlZAorKiBtdXN0IGJlIHNldCB0byB0aGUgbnVtYmVyIG9mIElYSl9DQURFTkNFX0VMRU1FTlRTIGluIHRoZSBhcnJheS4gIFRoZQorKiB0ZXJtaW5hdGlvbiB2YXJpYWJsZSBkZWZpbmVzIHdoYXQgdG8gZG8gYXQgdGhlIGVuZCBvZiBhIGNhZGVuY2UsIHRoZQorKiBvcHRpb25zIGFyZSB0byBwbGF5IHRoZSBjYWRlbmNlIG9uY2UgYW5kIHN0b3AsIHRvIHJlcGVhdCB0aGUgbGFzdAorKiBlbGVtZW50IG9mIHRoZSBjYWRlbmNlIGluZGVmaW5pdGVseSwgb3IgdG8gcmVwZWF0IHRoZSBlbnRpcmUgY2FkZW5jZQorKiBpbmRlZmluaXRlbHkuICBUaGUgY2UgdmFyaWFibGUgaXMgYSBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBJWEpfVE9ORQorKiBzdHJ1Y3R1cmVzLiAgSWYgdGhlIGZyZXEwIHZhcmlhYmxlIGlzIG5vbi16ZXJvLCB0aGUgdG9uZSB0YWJsZSBjb250ZW50cworKiBmb3IgdGhlIHRvbmVfaW5kZXggYXJlIHVwZGF0ZWQgdG8gdGhlIGZyZXF1ZW5jaWVzIGFuZCBnYWlucyBkZWZpbmVkLiAgSXQKKyogc2hvdWxkIGJlIG5vdGVkIHRoYXQgRFRNRiB0b25lcyBjYW5ub3QgYmUgcmVhc3NpZ25lZCwgc28gaWYgRFRNRiB0b25lCisqIHRhYmxlIGluZGV4ZXMgYXJlIHVzZWQgaW4gYSBjYWRlbmNlIHRoZSBmcmVxdWVuY3kgYW5kIGdhaW4gdmFyaWFibGVzIHdpbGwKKyogYmUgaWdub3JlZC4KKyoKKyogSWYgdGhlIGFycmF5IGVsZW1lbnRzIGNvbnRhaW4gZnJlcXVlbmN5IHBhcmFtZXRlcnMgdGhlIGRyaXZlciB3aWxsCisqIGluaXRpYWxpemUgdGhlIG5lZWRlZCB0b25lIHRhYmxlIGVsZW1lbnRzIGFuZCBiZWdpbiBwbGF5aW5nIHRoZSB0b25lLAorKiB0aGVyZSBpcyBubyBwcmVzZXQgbGltaXQgb24gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY2FkZW5jZS4gIElmCisqIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZnJlcXVlbmN5IHVzZWQgaW4gdGhlIGNhZGVuY2UsIHNlcXVlbnRpYWwgZWxlbWVudHMKKyogb2YgZGlmZmVyZW50IGZyZXF1ZW5jaWVzIE1VU1QgdXNlIGRpZmZlcmVudCB0b25lIHRhYmxlIGluZGV4ZXMuICBPbmx5IG9uZQorKiBjYWRlbmNlIGNhbiBiZSBwbGF5ZWQgYXQgYSB0aW1lLiAgSXQgaXMgcG9zc2libGUgdG8gYnVpbGQgY29tcGxleAorKiBjYWRlbmNlcyB3aXRoIG11bHRpcGxlIGZyZXF1ZW5jaWVzIHVzaW5nIDIgdG9uZSB0YWJsZSBpbmRleGVzIGJ5CisqIGFsdGVybmF0aW5nIGJldHdlZW4gdGhlbS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBpbmRleDsKKwlpbnQgdG9uZV9vbl90aW1lOworCWludCB0b25lX29mZl90aW1lOworCWludCBmcmVxMDsKKwlpbnQgZ2FpbjA7CisJaW50IGZyZXExOworCWludCBnYWluMTsKK30gSVhKX0NBREVOQ0VfRUxFTUVOVDsKKwordHlwZWRlZiBlbnVtIHsKKwlQTEFZX09OQ0UsCisJUkVQRUFUX0xBU1RfRUxFTUVOVCwKKwlSRVBFQVRfQUxMCit9IElYSl9DQURFTkNFX1RFUk07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgZWxlbWVudHNfdXNlZDsKKwlJWEpfQ0FERU5DRV9URVJNIHRlcm1pbmF0aW9uOworCUlYSl9DQURFTkNFX0VMRU1FTlQgKmNlOworfSBJWEpfQ0FERU5DRTsKKworI2RlZmluZSBJWEpDVExfVE9ORV9DQURFTkNFCQlfSU9XICgncScsIDB4Q0EsIElYSl9DQURFTkNFICopCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFRoaXMgZ3JvdXAgb2YgSU9DVExzIGRlYWwgd2l0aCB0aGUgcGxheWJhY2sgc2V0dGluZ3Mgb2YgdGhlIERTUAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElYSkNUTF9QTEFZX0NPREVDICAgICAgICAgICAgICAgUEhPTkVfUExBWV9DT0RFQworI2RlZmluZSBJWEpDVExfUExBWV9TVEFSVCAgICAgICAgICAgICAgIFBIT05FX1BMQVlfU1RBUlQKKyNkZWZpbmUgSVhKQ1RMX1BMQVlfU1RPUCAgICAgICAgICAgICAgICBQSE9ORV9QTEFZX1NUT1AKKyNkZWZpbmUgSVhKQ1RMX1BMQVlfREVQVEgJCVBIT05FX1BMQVlfREVQVEgKKyNkZWZpbmUgSVhKQ1RMX1BMQVlfVk9MVU1FCQlQSE9ORV9QTEFZX1ZPTFVNRQorI2RlZmluZSBJWEpDVExfUExBWV9MRVZFTAkJUEhPTkVfUExBWV9MRVZFTAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFRoaXMgZ3JvdXAgb2YgSU9DVExzIGRlYWwgd2l0aCB0aGUgQWNvdXN0aWMgRWNobyBDYW5jZWxsYXRpb24gc2V0dGluZ3MKKyogb2YgdGhlIERTUAorKgorKiBJc3N1aW5nIHRoZSBJWEpDVExfQUVDX1NUQVJUIGNvbW1hbmQgd2l0aCBhIHZhbHVlIG9mIEFFQ19PRkYgaGFzIHRoZQorKiBzYW1lIGVmZmVjdCBhcyBJWEpDVExfQUVDX1NUT1AuICBUaGlzIGlzIHRvIHNpbXBsaWZ5IHNsaWRlciBiYXIKKyogY29udHJvbHMuICBJWEpDVExfQUVDX0dFVF9MRVZFTCByZXR1cm5zIHRoZSBjdXJyZW50IHNldHRpbmcgb2YgdGhlIEFFQy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSVhKQ1RMX0FFQ19TVEFSVAkJX0lPVyAoJ3EnLCAweENCLCBpbnQpCisjZGVmaW5lIElYSkNUTF9BRUNfU1RPUAkJCV9JTyAgKCdxJywgMHhDQykKKyNkZWZpbmUgSVhKQ1RMX0FFQ19HRVRfTEVWRUwJCV9JTyAgKCdxJywgMHhDRCkKKworI2RlZmluZSBBRUNfT0ZGICAgMAorI2RlZmluZSBBRUNfTE9XICAgMQorI2RlZmluZSBBRUNfTUVEICAgMgorI2RlZmluZSBBRUNfSElHSCAgMworI2RlZmluZSBBRUNfQVVUTyAgNAorI2RlZmluZSBBRUNfQUdDICAgNQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBDYWxsIFByb2dyZXNzIFRvbmVzLCBEVE1GLCBldGMuCisqIElYSkNUTF9EVE1GX09PQiBkZXRlcm1pbmVzIGlmIERUTUYgc2lnbmFsaW5nIGlzIHNlbnQgYXMgT3V0LU9mLUJhbmQKKyogb25seS4gIElmIHlvdSBwYXNzIGEgMSwgRFRNRiBpcyBzdXBwcmVzc2VkIGZyb20gdGhlIGF1ZGlvIHN0cmVhbS4KKyogVG9uZSBvbiBhbmQgb2ZmIHRpbWVzIGFyZSBpbiAyNTAgbWljcm9zZWNvbmQgaW50ZXJ2YWxzIHNvCisqIGlvY3RsKGl4ajEsIElYSkNUTF9TRVRfVE9ORV9PTl9USU1FLCAzNjApOworKiB3aWxsIHNldCB0aGUgdG9uZSBvbiB0aW1lIG9mIGJvYXJkIGl4ajEgdG8gMzYwICogMjUwdXMgPSA5MG1zCisqIHRoZSBkZWZhdWx0IHZhbHVlcyBvZiB0b25lIG9uIGFuZCBvZmYgdGltZXMgaXMgODQwIG9yIDIxMG1zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSVhKQ1RMX0RUTUZfUkVBRFkJCVBIT05FX0RUTUZfUkVBRFkKKyNkZWZpbmUgSVhKQ1RMX0dFVF9EVE1GICAgICAgICAgICAgICAgICBQSE9ORV9HRVRfRFRNRgorI2RlZmluZSBJWEpDVExfR0VUX0RUTUZfQVNDSUkgICAgICAgICAgIFBIT05FX0dFVF9EVE1GX0FTQ0lJCisjZGVmaW5lIElYSkNUTF9EVE1GX09PQgkJCVBIT05FX0RUTUZfT09CCisjZGVmaW5lIElYSkNUTF9FWENFUFRJT04JCVBIT05FX0VYQ0VQVElPTgorI2RlZmluZSBJWEpDVExfUExBWV9UT05FCQlQSE9ORV9QTEFZX1RPTkUKKyNkZWZpbmUgSVhKQ1RMX1NFVF9UT05FX09OX1RJTUUJCVBIT05FX1NFVF9UT05FX09OX1RJTUUKKyNkZWZpbmUgSVhKQ1RMX1NFVF9UT05FX09GRl9USU1FCVBIT05FX1NFVF9UT05FX09GRl9USU1FCisjZGVmaW5lIElYSkNUTF9HRVRfVE9ORV9PTl9USU1FCQlQSE9ORV9HRVRfVE9ORV9PTl9USU1FCisjZGVmaW5lIElYSkNUTF9HRVRfVE9ORV9PRkZfVElNRQlQSE9ORV9HRVRfVE9ORV9PRkZfVElNRQorI2RlZmluZSBJWEpDVExfR0VUX1RPTkVfU1RBVEUJCVBIT05FX0dFVF9UT05FX1NUQVRFCisjZGVmaW5lIElYSkNUTF9CVVNZCQkJUEhPTkVfQlVTWQorI2RlZmluZSBJWEpDVExfUklOR0JBQ0sJCQlQSE9ORV9SSU5HQkFDSworI2RlZmluZSBJWEpDVExfRElBTFRPTkUJCQlQSE9ORV9ESUFMVE9ORQorI2RlZmluZSBJWEpDVExfQ1BUX1NUT1AJCQlQSE9ORV9DUFRfU1RPUAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIExpbmVKQUNLIHNwZWNpZmljIElPQ1RMcworKgorKiBUaGUgbHNiIDQgYml0cyBvZiB0aGUgTEVEIGFyZ3VtZW50IHJlcHJlc2VudCB0aGUgc3RhdGUgb2YgZWFjaCBvZiB0aGUgNAorKiBMRUQncyBvbiB0aGUgTGluZUpBQ0sKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJWEpDVExfU0VUX0xFRAkJCV9JT1cgKCdxJywgMHhDRSwgaW50KQorI2RlZmluZSBJWEpDVExfTUlYRVIJCQlfSU9XICgncScsIDB4Q0YsIGludCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAKKyogVGhlIG1hc3RlciB2b2x1bWUgY29udHJvbHMgdXNlIGF0dGVudWF0aW9uIHdpdGggMzIgbGV2ZWxzIGZyb20gMCB0byAtNjJkQgorKiB3aXRoIHN0ZXBzIG9mIDJkQiBlYWNoLCB0aGUgZGVmaW5lcyBzaG91bGQgYmUgT1InZWQgdG9nZXRoZXIgdGhlbiBzZW50CisqIGFzIHRoZSBwYXJhbWV0ZXIgdG8gdGhlIG1peGVyIGNvbW1hbmQgdG8gY2hhbmdlIHRoZSBtaXhlciBzZXR0aW5ncy4KKyogCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1JWEVSX01BU1RFUl9MCQkweDAwMDAKKyNkZWZpbmUgTUlYRVJfTUFTVEVSX1IJCTB4MDEwMAorI2RlZmluZSBBVFQwMERCCQkJMHgwMAorI2RlZmluZSBBVFQwMkRCCQkJMHgwMQorI2RlZmluZSBBVFQwNERCCQkJMHgwMgorI2RlZmluZSBBVFQwNkRCCQkJMHgwMworI2RlZmluZSBBVFQwOERCCQkJMHgwNAorI2RlZmluZSBBVFQxMERCCQkJMHgwNQorI2RlZmluZSBBVFQxMkRCCQkJMHgwNgorI2RlZmluZSBBVFQxNERCCQkJMHgwNworI2RlZmluZSBBVFQxNkRCCQkJMHgwOAorI2RlZmluZSBBVFQxOERCCQkJMHgwOQorI2RlZmluZSBBVFQyMERCCQkJMHgwQQorI2RlZmluZSBBVFQyMkRCCQkJMHgwQgorI2RlZmluZSBBVFQyNERCCQkJMHgwQworI2RlZmluZSBBVFQyNkRCCQkJMHgwRAorI2RlZmluZSBBVFQyOERCCQkJMHgwRQorI2RlZmluZSBBVFQzMERCCQkJMHgwRgorI2RlZmluZSBBVFQzMkRCCQkJMHgxMAorI2RlZmluZSBBVFQzNERCCQkJMHgxMQorI2RlZmluZSBBVFQzNkRCCQkJMHgxMgorI2RlZmluZSBBVFQzOERCCQkJMHgxMworI2RlZmluZSBBVFQ0MERCCQkJMHgxNAorI2RlZmluZSBBVFQ0MkRCCQkJMHgxNQorI2RlZmluZSBBVFQ0NERCCQkJMHgxNgorI2RlZmluZSBBVFQ0NkRCCQkJMHgxNworI2RlZmluZSBBVFQ0OERCCQkJMHgxOAorI2RlZmluZSBBVFQ1MERCCQkJMHgxOQorI2RlZmluZSBBVFQ1MkRCCQkJMHgxQQorI2RlZmluZSBBVFQ1NERCCQkJMHgxQgorI2RlZmluZSBBVFQ1NkRCCQkJMHgxQworI2RlZmluZSBBVFQ1OERCCQkJMHgxRAorI2RlZmluZSBBVFQ2MERCCQkJMHgxRQorI2RlZmluZSBBVFQ2MkRCCQkJMHgxRgorI2RlZmluZSBNQVNURVJfTVVURQkJMHg4MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIAorKiBUaGUgaW5wdXQgdm9sdW1lIGNvbnRyb2xzIHVzZSBnYWluIHdpdGggMzIgbGV2ZWxzIGZyb20gKzEyZEIgdG8gLTUwZEIKKyogd2l0aCBzdGVwcyBvZiAyZEIgZWFjaCwgdGhlIGRlZmluZXMgc2hvdWxkIGJlIE9SJ2VkIHRvZ2V0aGVyIHRoZW4gc2VudAorKiBhcyB0aGUgcGFyYW1ldGVyIHRvIHRoZSBtaXhlciBjb21tYW5kIHRvIGNoYW5nZSB0aGUgbWl4ZXIgc2V0dGluZ3MuCisqIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBNSVhFUl9QT1JUX0NEX0wJCTB4MDYwMAorI2RlZmluZSBNSVhFUl9QT1JUX0NEX1IJCTB4MDcwMAorI2RlZmluZSBNSVhFUl9QT1JUX0xJTkVfSU5fTAkweDA4MDAKKyNkZWZpbmUgTUlYRVJfUE9SVF9MSU5FX0lOX1IJMHgwOTAwCisjZGVmaW5lIE1JWEVSX1BPUlRfUE9UU19SRUMJMHgwQzAwCisjZGVmaW5lIE1JWEVSX1BPUlRfTUlDCQkweDBFMDAKKworI2RlZmluZSBHQUlOMTJEQgkJMHgwMAorI2RlZmluZSBHQUlOMTBEQgkJMHgwMQorI2RlZmluZSBHQUlOMDhEQgkJMHgwMgorI2RlZmluZSBHQUlOMDZEQgkJMHgwMworI2RlZmluZSBHQUlOMDREQgkJMHgwNAorI2RlZmluZSBHQUlOMDJEQgkJMHgwNQorI2RlZmluZSBHQUlOMDBEQgkJMHgwNgorI2RlZmluZSBHQUlOXzAyREIJCTB4MDcKKyNkZWZpbmUgR0FJTl8wNERCCQkweDA4CisjZGVmaW5lIEdBSU5fMDZEQgkJMHgwOQorI2RlZmluZSBHQUlOXzA4REIJCTB4MEEKKyNkZWZpbmUgR0FJTl8xMERCCQkweDBCCisjZGVmaW5lIEdBSU5fMTJEQgkJMHgwQworI2RlZmluZSBHQUlOXzE0REIJCTB4MEQKKyNkZWZpbmUgR0FJTl8xNkRCCQkweDBFCisjZGVmaW5lIEdBSU5fMThEQgkJMHgwRgorI2RlZmluZSBHQUlOXzIwREIJCTB4MTAKKyNkZWZpbmUgR0FJTl8yMkRCCQkweDExCisjZGVmaW5lIEdBSU5fMjREQgkJMHgxMgorI2RlZmluZSBHQUlOXzI2REIJCTB4MTMKKyNkZWZpbmUgR0FJTl8yOERCCQkweDE0CisjZGVmaW5lIEdBSU5fMzBEQgkJMHgxNQorI2RlZmluZSBHQUlOXzMyREIJCTB4MTYKKyNkZWZpbmUgR0FJTl8zNERCCQkweDE3CisjZGVmaW5lIEdBSU5fMzZEQgkJMHgxOAorI2RlZmluZSBHQUlOXzM4REIJCTB4MTkKKyNkZWZpbmUgR0FJTl80MERCCQkweDFBCisjZGVmaW5lIEdBSU5fNDJEQgkJMHgxQgorI2RlZmluZSBHQUlOXzQ0REIJCTB4MUMKKyNkZWZpbmUgR0FJTl80NkRCCQkweDFECisjZGVmaW5lIEdBSU5fNDhEQgkJMHgxRQorI2RlZmluZSBHQUlOXzUwREIJCTB4MUYKKyNkZWZpbmUgSU5QVVRfTVVURQkJMHg4MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIAorKiBUaGUgUE9UUyB2b2x1bWUgY29udHJvbCB1c2UgYXR0ZW51YXRpb24gd2l0aCA4IGxldmVscyBmcm9tIDBkQiB0byAtMjhkQgorKiB3aXRoIHN0ZXBzIG9mIDRkQiBlYWNoLCB0aGUgZGVmaW5lcyBzaG91bGQgYmUgT1InZWQgdG9nZXRoZXIgdGhlbiBzZW50CisqIGFzIHRoZSBwYXJhbWV0ZXIgdG8gdGhlIG1peGVyIGNvbW1hbmQgdG8gY2hhbmdlIHRoZSBtaXhlciBzZXR0aW5ncy4KKyogCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1JWEVSX1BPUlRfUE9UU19QTEFZCTB4MEYwMAorCisjZGVmaW5lIFBPVFNfQVRUXzAwREIJCTB4MDAKKyNkZWZpbmUgUE9UU19BVFRfMDREQgkJMHgwMQorI2RlZmluZSBQT1RTX0FUVF8wOERCCQkweDAyCisjZGVmaW5lIFBPVFNfQVRUXzEyREIJCTB4MDMKKyNkZWZpbmUgUE9UU19BVFRfMTZEQgkJMHgwNAorI2RlZmluZSBQT1RTX0FUVF8yMERCCQkweDA1CisjZGVmaW5lIFBPVFNfQVRUXzI0REIJCTB4MDYKKyNkZWZpbmUgUE9UU19BVFRfMjhEQgkJMHgwNworI2RlZmluZSBQT1RTX01VVEUJCTB4ODAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAKKyogVGhlIERBQSBjb250cm9scyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBQU1ROIHBvcnQuICBUaGUgZHJpdmVyIGxvYWRzIHRoZQorKiBVUyBjb2VmZmljaWVudHMgYnkgZGVmYXVsdCwgc28gaWYgeW91IGxpdmUgaW4gYSBkaWZmZXJlbnQgY291bnRyeSB5b3UKKyogbmVlZCB0byBsb2FkIHRoZSBzZXQgZm9yIHlvdXIgY291bnRyaWVzIHBob25lIHN5c3RlbS4KKyogCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElYSkNUTF9EQUFfQ09FRkZfU0VUCQlfSU9XICgncScsIDB4RDAsIGludCkKKworI2RlZmluZSBEQUFfVVMgCQkxCS8qUElUQSA4a0h6ICovCisjZGVmaW5lIERBQV9VSyAJCTIJLypJU0FSMzQgOGtIeiAqLworI2RlZmluZSBEQUFfRlJBTkNFIAkzCS8qICovCisjZGVmaW5lIERBQV9HRVJNQU5ZCTQKKyNkZWZpbmUgREFBX0FVU1RSQUxJQQk1CisjZGVmaW5lIERBQV9KQVBBTgk2CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogCisqIFVzZSBJWEpDVExfUE9SVCB0byBzZXQgb3IgcXVlcnkgdGhlIHBvcnQgdGhlIGNhcmQgaXMgc2V0IHRvLiAgSWYgdGhlCisqIGFyZ3VtZW50IGlzIHNldCB0byBQT1JUX1FVRVJZLCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBpb2N0bCB3aWxsCisqIGluZGljYXRlIHdoaWNoIHBvcnQgaXMgY3VycmVudGx5IGluIHVzZSwgb3RoZXJ3aXNlIGl0IHdpbGwgY2hhbmdlIHRoZQorKiBwb3J0LgorKiAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSVhKQ1RMX1BPUlQJCQlfSU9XICgncScsIDB4RDEsIGludCkKKworI2RlZmluZSBQT1JUX1FVRVJZCTAKKyNkZWZpbmUgUE9SVF9QT1RTCTEKKyNkZWZpbmUgUE9SVF9QU1ROCTIKKyNkZWZpbmUgUE9SVF9TUEVBS0VSCTMKKyNkZWZpbmUgUE9SVF9IQU5EU0VUCTQKKworI2RlZmluZSBJWEpDVExfUFNUTl9TRVRfU1RBVEUJCVBIT05FX1BTVE5fU0VUX1NUQVRFCisjZGVmaW5lIElYSkNUTF9QU1ROX0dFVF9TVEFURQkJUEhPTkVfUFNUTl9HRVRfU1RBVEUKKworI2RlZmluZSBQU1ROX09OX0hPT0sJMAorI2RlZmluZSBQU1ROX1JJTkdJTkcJMQorI2RlZmluZSBQU1ROX09GRl9IT09LCTIKKyNkZWZpbmUgUFNUTl9QVUxTRV9ESUFMCTMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAKKyogVGhlIERBQSBBbmFsb2cgR0FJTiBzZXRzIDIgcGFyYW1ldGVycyBhdCBvbmUgdGltZSwgdGhlIHJlY2VpdmUgZ2FpbiAoQUdSUiksIAorKiBhbmQgdGhlIHRyYW5zbWl0IGdhaW4gKEFHWCkuICBPUiB0b2dldGhlciB0aGUgY29tcG9uZW50cyBhbmQgcGFzcyB0aGVtCisqIGFzIHRoZSBwYXJhbWV0ZXIgdG8gSVhKQ1RMX0RBQV9BR0FJTi4gIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgYm90aCBhdCAwZEIuCisqIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBJWEpDVExfREFBX0FHQUlOCQlfSU9XICgncScsIDB4RDIsIGludCkKKworI2RlZmluZSBBR1JSMDBEQgkweDAwCS8qIEFuYWxvZyBnYWluIGluIHJlY2VpdmUgZGlyZWN0aW9uIDBkQiAqLworI2RlZmluZSBBR1JSM181REIJMHgxMAkvKiBBbmFsb2cgZ2FpbiBpbiByZWNlaXZlIGRpcmVjdGlvbiAzLjVkQiAqLworI2RlZmluZSBBR1JSMDZEQgkweDMwCS8qIEFuYWxvZyBnYWluIGluIHJlY2VpdmUgZGlyZWN0aW9uIDZkQiAqLworCisjZGVmaW5lIEFHWDAwREIJCTB4MDAJLyogQW5hbG9nIGdhaW4gaW4gdHJhbnNtaXQgZGlyZWN0aW9uIDBkQiAqLworI2RlZmluZSBBR1hfNkRCCQkweDA0CS8qIEFuYWxvZyBnYWluIGluIHRyYW5zbWl0IGRpcmVjdGlvbiAtNmRCICovCisjZGVmaW5lIEFHWDNfNURCCTB4MDgJLyogQW5hbG9nIGdhaW4gaW4gdHJhbnNtaXQgZGlyZWN0aW9uIDMuNWRCICovCisjZGVmaW5lIEFHWF8yXzVCCTB4MEMJLyogQW5hbG9nIGdhaW4gaW4gdHJhbnNtaXQgZGlyZWN0aW9uIC0yLjVkQiAqLworCisjZGVmaW5lIElYSkNUTF9QU1ROX0xJTkVURVNUCQlfSU8gICgncScsIDB4RDMpCisKKyNkZWZpbmUgSVhKQ1RMX0NJRAkJCV9JT1IgKCdxJywgMHhENCwgUEhPTkVfQ0lEICopCisjZGVmaW5lIElYSkNUTF9WTVdJCQkJX0lPUiAoJ3EnLCAweEQ4LCBpbnQpCisjZGVmaW5lIElYSkNUTF9DSURDVwkJCV9JT1cgKCdxJywgMHhEOSwgUEhPTkVfQ0lEICopCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIAorKiBUaGUgd2luayBkdXJhdGlvbiBpcyB0dW5hYmxlIHdpdGggdGhpcyBpb2N0bC4gIFRoZSBkZWZhdWx0IHdpbmsgZHVyYXRpb24gIAorKiBpcyAzMjBtcy4gIFlvdSBkbyBub3QgbmVlZCB0byB1c2UgdGhpcyBpb2N0bCBpZiB5b3UgZG8gbm90IHJlcXVpcmUgYQorKiBkaWZmZXJlbnQgd2luayBkdXJhdGlvbi4KKyogCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElYSkNUTF9XSU5LX0RVUkFUSU9OCQlQSE9ORV9XSU5LX0RVUkFUSU9OCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogCisqIFRoaXMgaW9jdGwgd2lsbCBjb25uZWN0IHRoZSBQT1RTIHBvcnQgdG8gdGhlIFBTVE4gcG9ydCBvbiB0aGUgTGluZUpBQ0sKKyogSW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yayBwcm9wZXJseSB0aGUgcG9ydCBzZWxlY3Rpb24gc2hvdWxkIGJlIHNldCB0bworKiB0aGUgUFNUTiBwb3J0IHdpdGggSVhKQ1RMX1BPUlQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIGlvY3RsLiAgVGhpcyB3aWxsCisqIGVuYWJsZSBjb25mZXJlbmNlIGNhbGxzIGJldHdlZW4gUFNUTiBjYWxsZXJzIGFuZCBuZXR3b3JrIGNhbGxlcnMuCisqIFBhc3NpbmcgYSAxIHRvIHRoaXMgaW9jdGwgZW5hYmxlcyB0aGUgUE9UUzwtPlBTVE4gY29ubmVjdGlvbiB3aGlsZQorKiBwYXNzaW5nIGEgMCB0dXJucyBpdCBiYWNrIG9mZi4KKyogCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElYSkNUTF9QT1RTX1BTVE4JCV9JT1cgKCdxJywgMHhENSwgaW50KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIElPQ1RMcyBhZGRlZCBieSByZXF1ZXN0LgorKgorKiBJWEpDVExfSFogc2V0cyB0aGUgdmFsdWUgeW91ciBMaW51eCBrZXJuZWwgdXNlcyBmb3IgSFogYXMgZGVmaW5lZCBpbgorKiAgICAgICAgICAgL3Vzci9pbmNsdWRlL2FzbS9wYXJhbS5oLCB0aGlzIGRldGVybWluZXMgdGhlIGZ1bmRhbWVudGFsCisqICAgICAgICAgICBmcmVxdWVuY3kgb2YgdGhlIGNsb2NrIHRpY2tzIG9uIHlvdXIgTGludXggc3lzdGVtLiAgVGhlIGtlcm5lbAorKiAgICAgICAgICAgbXVzdCBiZSByZWJ1aWx0IGlmIHlvdSBjaGFuZ2UgdGhpcyB2YWx1ZSwgYWxzbyBhbGwgbW9kdWxlcyB5b3UKKyogICAgICAgICAgIHVzZSAoZXhjZXB0IHRoaXMgb25lKSBtdXN0IGJlIHJlY29tcGlsZWQuICBUaGUgZGVmYXVsdCB2YWx1ZQorKiAgICAgICAgICAgaXMgMTAwLCBhbmQgeW91IG9ubHkgbmVlZCB0byB1c2UgdGhpcyBJT0NUTCBpZiB5b3UgdXNlIHNvbWUKKyogICAgICAgICAgIG90aGVyIHZhbHVlLgorKgorKgorKiBJWEpDVExfUkFURSBzZXRzIHRoZSBudW1iZXIgb2YgdGltZXMgcGVyIHNlY29uZCB0aGF0IHRoZSBkcml2ZXIgcG9sbHMKKyogICAgICAgICAgICAgdGhlIERTUC4gIFRoaXMgdmFsdWUgY2Fubm90IGJlIGxhcmdlciB0aGFuIEhaLiAgQnkKKyogICAgICAgICAgICAgaW5jcmVhc2luZyBib3RoIG9mIHRoZXNlIHZhbHVlcywgeW91IG1heSBiZSBhYmxlIHRvIHJlZHVjZQorKiAgICAgICAgICAgICBsYXRlbmN5IGJlY2F1c2UgdGhlIG1heCBoYW5nIHRpbWUgdGhhdCBjYW4gZXhpc3QgYmV0d2VlbiB0aGUKKyogICAgICAgICAgICAgZHJpdmVyIGFuZCB0aGUgRFNQIHdpbGwgYmUgcmVkdWNlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJWEpDVExfSFogICAgICAgICAgICAgICAgICAgICAgIF9JT1cgKCdxJywgMHhFMCwgaW50KQorI2RlZmluZSBJWEpDVExfUkFURSAgICAgICAgICAgICAgICAgICAgIF9JT1cgKCdxJywgMHhFMSwgaW50KQorI2RlZmluZSBJWEpDVExfRlJBTUVTX1JFQUQJCV9JT1IgKCdxJywgMHhFMiwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgSVhKQ1RMX0ZSQU1FU19XUklUVEVOCQlfSU9SICgncScsIDB4RTMsIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIElYSkNUTF9SRUFEX1dBSVQJCV9JT1IgKCdxJywgMHhFNCwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgSVhKQ1RMX1dSSVRFX1dBSVQJCV9JT1IgKCdxJywgMHhFNSwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgSVhKQ1RMX0RSWUJVRkZFUl9SRUFECQlfSU9SICgncScsIDB4RTYsIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIElYSkNUTF9EUllCVUZGRVJfQ0xFQVIJCV9JTyAgKCdxJywgMHhFNykKKyNkZWZpbmUgSVhKQ1RMX0RUTUZfUFJFU0NBTEUJCV9JT1cgKCdxJywgMHhFOCwgaW50KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFRoaXMgaW9jdGwgYWxsb3dzIHRoZSB1c2VyIGFwcGxpY2F0aW9uIHRvIGNvbnRyb2wgd2hhdCBldmVudHMgdGhlIGRyaXZlcgorKiB3aWxsIHNlbmQgc2lnbmFscyBmb3IsIGFuZCB3aGF0IHNpZ25hbHMgaXQgd2lsbCBzZW5kIGZvciB3aGljaCBldmVudC4KKyogQnkgZGVmYXVsdCwgaWYgc2lnbmFsaW5nIGlzIGVuYWJsZWQsIGFsbCBldmVudHMgd2lsbCBzZW5kIFNJR0lPIHdoZW4KKyogdGhleSBvY2N1ci4gIFRvIGRpc2FibGUgc2lnbmFscyBmb3IgYW4gZXZlbnQgc2V0IHRoZSBzaWduYWwgdG8gMC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgZW51bSB7CisJU0lHX0RUTUZfUkVBRFksCisJU0lHX0hPT0tTVEFURSwKKwlTSUdfRkxBU0gsCisJU0lHX1BTVE5fUklORywKKwlTSUdfQ0FMTEVSX0lELAorCVNJR19QU1ROX1dJTkssCisJU0lHX0YwLCBTSUdfRjEsIFNJR19GMiwgU0lHX0YzLAorCVNJR19GQzAsIFNJR19GQzEsIFNJR19GQzIsIFNJR19GQzMsCisJU0lHX1JFQURfUkVBRFkgPSAzMywKKwlTSUdfV1JJVEVfUkVBRFkgPSAzNAorfSBJWEpfU0lHRVZFTlQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgZXZlbnQ7CisJaW50IHNpZ25hbDsKK30gSVhKX1NJR0RFRjsKKworI2RlZmluZSBJWEpDVExfU0lHQ1RMCQkJX0lPVyAoJ3EnLCAweEU5LCBJWEpfU0lHREVGICopCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogVGhlc2UgaW9jdGxzIGFsbG93IHRoZSB1c2VyIGFwcGxpY2F0aW9uIHRvIGNoYW5nZSB0aGUgZ2FpbiBpbiB0aGUgCisqIFNtYXJ0IENhYmxlIG9mIHRoZSBJbnRlcm5ldCBQaG9uZSBDYXJkLiAgU2VuZGluZyAtMSBhcyBhIHZhbHVlIHdpbGwgY2F1c2UKKyogcmV0dXJuIHZhbHVlIHRvIGJlIHRoZSBjdXJyZW50IHNldHRpbmcuICBWYWxpZCB2YWx1ZXMgdG8gc2V0IGFyZSAweDAwIC0gMHgxRgorKgorKiAxMTExMSA9ICsxMiBkQgorKiAxMDExMSA9ICAgMCBkQgorKiAwMDAwMCA9IC0zNC41IGRCCisqCisqIElYSkNUTF9TQ19SWEcgc2V0cyB0aGUgUmVjZWl2ZSBnYWluCisqIElYSkNUTF9TQ19UWEcgc2V0cyB0aGUgVHJhbnNtaXQgZ2FpbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBJWEpDVExfU0NfUlhHCQkJX0lPVyAoJ3EnLCAweEVBLCBpbnQpCisjZGVmaW5lIElYSkNUTF9TQ19UWEcJCQlfSU9XICgncScsIDB4RUIsIGludCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBUaGUgaW50ZXJjb20gSU9DVEwncyBzaG9ydCB0aGUgb3V0cHV0IGZyb20gb25lIGNhcmQgdG8gdGhlIGlucHV0IG9mIHRoZQorKiBvdGhlciBhbmQgdmljZSB2ZXJzYSAoYWN0dWFsbHkgZG9uZSBpbiB0aGUgRFNQIHJlYWQgZnVuY3Rpb24pLiAgSXQgaXMgb25seQorKiBuZWNlc3NhcnkgdG8gZXhlY3V0ZSB0aGUgSU9DVEwgb24gb25lIGNhcmQsIGJ1dCBpdCBpcyBuZWNlc3NhcnkgdG8gaGF2ZQorKiBib3RoIGRldmljZXMgb3BlbiB0byBiZSBhYmxlIHRvIGRldGVjdCBob29rIHN3aXRjaCBjaGFuZ2VzLiAgVGhlIHJlY29yZAorKiBjb2RlYyBhbmQgcmF0ZSBvZiBlYWNoIGNhcmQgbXVzdCBtYXRjaCB0aGUgcGxheWJhY2sgY29kZWMgYW5kIHJhdGUgb2YKKyogdGhlIG90aGVyIGNhcmQgZm9yIHRoaXMgdG8gd29yayBwcm9wZXJseS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJWEpDVExfSU5URVJDT01fU1RBUlQgCQlfSU9XICgncScsIDB4RkQsIGludCkKKyNkZWZpbmUgSVhKQ1RMX0lOVEVSQ09NX1NUT1AgIAkJX0lPVyAoJ3EnLCAweEZFLCBpbnQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBuZXcgc3RydWN0dXJlIGZvciBhY2Nlc3NpbmcgcmF3IGZpbHRlciBpbmZvcm1hdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgZmlsdGVyOworCWNoYXIgZW5hYmxlOworCXVuc2lnbmVkIGludCBjb2VmZlsxOV07Cit9IElYSl9GSUxURVJfUkFXOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvamZmczIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvamZmczIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMThiNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9qZmZzMi5oCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwMS0yMDA3IFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCDCqSAyMDA0LTIwMTAgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICoKKyAqIENyZWF0ZWQgYnkgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICoKKyAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhlCisgKiBqZmZzMiBkaXJlY3RvcnkuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0pGRlMyX0hfXworI2RlZmluZSBfX0xJTlVYX0pGRlMyX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorCisvKiBZb3UgbXVzdCBpbmNsdWRlIHNvbWV0aGluZyB3aGljaCBkZWZpbmVzIHRoZSBDOTkgdWludFhYX3QgdHlwZXMuIAorICAgV2UgZG9uJ3QgZG8gaXQgZnJvbSBoZXJlIGJlY2F1c2UgdGhpcyBmaWxlIGlzIHVzZWQgaW4gdG9vIG1hbnkKKyAgIGRpZmZlcmVudCBlbnZpcm9ubWVudHMuICovCisKKy8qIFZhbHVlcyB3ZSBtYXkgZXhwZWN0IHRvIGZpbmQgaW4gdGhlICdtYWdpYycgZmllbGQgKi8KKyNkZWZpbmUgSkZGUzJfT0xEX01BR0lDX0JJVE1BU0sgMHgxOTg0CisjZGVmaW5lIEpGRlMyX01BR0lDX0JJVE1BU0sgMHgxOTg1CisjZGVmaW5lIEtTQU1USUJfQ0lHQU1fMlNGRkogMHg4NTE5IC8qIEZvciBkZXRlY3Rpbmcgd3JvbmctZW5kaWFuIGZzICovCisjZGVmaW5lIEpGRlMyX0VNUFRZX0JJVE1BU0sgMHhmZmZmCisjZGVmaW5lIEpGRlMyX0RJUlRZX0JJVE1BU0sgMHgwMDAwCisKKy8qIFN1bW1hcnkgbm9kZSBNQUdJQyBtYXJrZXIgKi8KKyNkZWZpbmUgSkZGUzJfU1VNX01BR0lDCTB4MDI4NTE4ODUKKworLyogV2Ugb25seSBhbGxvdyBhIHNpbmdsZSBjaGFyIGZvciBsZW5ndGgsIGFuZCAweEZGIGlzIGVtcHR5IGZsYXNoIHNvCisgICB3ZSBkb24ndCB3YW50IGl0IGNvbmZ1c2VkIHdpdGggYSByZWFsIGxlbmd0aC4gSGVuY2UgbWF4IDI1NC4KKyovCisjZGVmaW5lIEpGRlMyX01BWF9OQU1FX0xFTiAyNTQKKworLyogSG93IHNtYWxsIGNhbiB3ZSBzZW5zaWJseSB3cml0ZSBub2Rlcz8gKi8KKyNkZWZpbmUgSkZGUzJfTUlOX0RBVEFfTEVOIDEyOAorCisjZGVmaW5lIEpGRlMyX0NPTVBSX05PTkUJMHgwMAorI2RlZmluZSBKRkZTMl9DT01QUl9aRVJPCTB4MDEKKyNkZWZpbmUgSkZGUzJfQ09NUFJfUlRJTUUJMHgwMgorI2RlZmluZSBKRkZTMl9DT01QUl9SVUJJTk1JUFMJMHgwMworI2RlZmluZSBKRkZTMl9DT01QUl9DT1BZCTB4MDQKKyNkZWZpbmUgSkZGUzJfQ09NUFJfRFlOUlVCSU4JMHgwNQorI2RlZmluZSBKRkZTMl9DT01QUl9aTElCCTB4MDYKKyNkZWZpbmUgSkZGUzJfQ09NUFJfTFpPCQkweDA3CisvKiBDb21wYXRpYmlsaXR5IGZsYWdzLiAqLworI2RlZmluZSBKRkZTMl9DT01QQVRfTUFTSyAweGMwMDAgICAgICAvKiBXaGF0IGRvIHRvIGlmIGFuIHVua25vd24gbm9kZXR5cGUgaXMgZm91bmQgKi8KKyNkZWZpbmUgSkZGUzJfTk9ERV9BQ0NVUkFURSAweDIwMDAKKy8qIElOQ09NUEFUOiBGYWlsIHRvIG1vdW50IHRoZSBmaWxlc3lzdGVtICovCisjZGVmaW5lIEpGRlMyX0ZFQVRVUkVfSU5DT01QQVQgMHhjMDAwCisvKiBST0NPTVBBVDogTW91bnQgcmVhZC1vbmx5ICovCisjZGVmaW5lIEpGRlMyX0ZFQVRVUkVfUk9DT01QQVQgMHg4MDAwCisvKiBSV0NPTVBBVF9DT1BZOiBNb3VudCByZWFkL3dyaXRlLCBhbmQgY29weSB0aGUgbm9kZSB3aGVuIGl0J3MgR0MnZCAqLworI2RlZmluZSBKRkZTMl9GRUFUVVJFX1JXQ09NUEFUX0NPUFkgMHg0MDAwCisvKiBSV0NPTVBBVF9ERUxFVEU6IE1vdW50IHJlYWQvd3JpdGUsIGFuZCBkZWxldGUgdGhlIG5vZGUgd2hlbiBpdCdzIEdDJ2QgKi8KKyNkZWZpbmUgSkZGUzJfRkVBVFVSRV9SV0NPTVBBVF9ERUxFVEUgMHgwMDAwCisKKyNkZWZpbmUgSkZGUzJfTk9ERVRZUEVfRElSRU5UIChKRkZTMl9GRUFUVVJFX0lOQ09NUEFUIHwgSkZGUzJfTk9ERV9BQ0NVUkFURSB8IDEpCisjZGVmaW5lIEpGRlMyX05PREVUWVBFX0lOT0RFIChKRkZTMl9GRUFUVVJFX0lOQ09NUEFUIHwgSkZGUzJfTk9ERV9BQ0NVUkFURSB8IDIpCisjZGVmaW5lIEpGRlMyX05PREVUWVBFX0NMRUFOTUFSS0VSIChKRkZTMl9GRUFUVVJFX1JXQ09NUEFUX0RFTEVURSB8IEpGRlMyX05PREVfQUNDVVJBVEUgfCAzKQorI2RlZmluZSBKRkZTMl9OT0RFVFlQRV9QQURESU5HIChKRkZTMl9GRUFUVVJFX1JXQ09NUEFUX0RFTEVURSB8IEpGRlMyX05PREVfQUNDVVJBVEUgfCA0KQorCisjZGVmaW5lIEpGRlMyX05PREVUWVBFX1NVTU1BUlkgKEpGRlMyX0ZFQVRVUkVfUldDT01QQVRfREVMRVRFIHwgSkZGUzJfTk9ERV9BQ0NVUkFURSB8IDYpCisKKyNkZWZpbmUgSkZGUzJfTk9ERVRZUEVfWEFUVFIgKEpGRlMyX0ZFQVRVUkVfSU5DT01QQVQgfCBKRkZTMl9OT0RFX0FDQ1VSQVRFIHwgOCkKKyNkZWZpbmUgSkZGUzJfTk9ERVRZUEVfWFJFRiAoSkZGUzJfRkVBVFVSRV9JTkNPTVBBVCB8IEpGRlMyX05PREVfQUNDVVJBVEUgfCA5KQorCisvKiBYQVRUUiBSZWxhdGVkICovCisjZGVmaW5lIEpGRlMyX1hQUkVGSVhfVVNFUgkJMQkvKiBmb3IgInVzZXIuIiAqLworI2RlZmluZSBKRkZTMl9YUFJFRklYX1NFQ1VSSVRZCQkyCS8qIGZvciAic2VjdXJpdHkuIiAqLworI2RlZmluZSBKRkZTMl9YUFJFRklYX0FDTF9BQ0NFU1MJMwkvKiBmb3IgInN5c3RlbS5wb3NpeF9hY2xfYWNjZXNzIiAqLworI2RlZmluZSBKRkZTMl9YUFJFRklYX0FDTF9ERUZBVUxUCTQJLyogZm9yICJzeXN0ZW0ucG9zaXhfYWNsX2RlZmF1bHQiICovCisjZGVmaW5lIEpGRlMyX1hQUkVGSVhfVFJVU1RFRAkJNQkvKiBmb3IgInRydXN0ZWQuKiIgKi8KKworI2RlZmluZSBKRkZTMl9BQ0xfVkVSU0lPTgkJMHgwMDAxCisKKy8vIE1heWJlIGxhdGVyLi4uCisvLyNkZWZpbmUgSkZGUzJfTk9ERVRZUEVfQ0hFQ0tQT0lOVCAoSkZGUzJfRkVBVFVSRV9SV0NPTVBBVF9ERUxFVEUgfCBKRkZTMl9OT0RFX0FDQ1VSQVRFIHwgMykKKy8vI2RlZmluZSBKRkZTMl9OT0RFVFlQRV9PUFRJT05TIChKRkZTMl9GRUFUVVJFX1JXQ09NUEFUX0NPUFkgfCBKRkZTMl9OT0RFX0FDQ1VSQVRFIHwgNCkKKworCisjZGVmaW5lIEpGRlMyX0lOT19GTEFHX1BSRVJFQUQJICAxCS8qIERvIHJlYWRfaW5vZGUoKSBmb3IgdGhpcyBvbmUgYXQKKwkJCQkJICAgbW91bnQgdGltZSwgZG9uJ3Qgd2FpdCBmb3IgaXQgdG8KKwkJCQkJICAgaGFwcGVuIGxhdGVyICovCisjZGVmaW5lIEpGRlMyX0lOT19GTEFHX1VTRVJDT01QUiAgMgkvKiBVc2VyIGhhcyByZXF1ZXN0ZWQgYSBzcGVjaWZpYworCQkJCQkgICBjb21wcmVzc2lvbiB0eXBlICovCisKKworLyogVGhlc2UgY2FuIGdvIG9uY2Ugd2UndmUgbWFkZSBzdXJlIHdlJ3ZlIGNhdWdodCBhbGwgdXNlcyB3aXRob3V0CisgICBieXRlc3dhcHBpbmcgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fdTMyIHYzMjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgamludDMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX3UzMiBtOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBqbW9kZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisJX191MTYgdjE2OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBqaW50MTZfdDsKKworc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZQoreworCS8qIEFsbCBzdGFydCBsaWtlIHRoaXMgKi8KKwlqaW50MTZfdCBtYWdpYzsKKwlqaW50MTZfdCBub2RldHlwZTsKKwlqaW50MzJfdCB0b3RsZW47IC8qIFNvIHdlIGNhbiBza2lwIG92ZXIgbm9kZXMgd2UgZG9uJ3QgZ3JvayAqLworCWppbnQzMl90IGhkcl9jcmM7Cit9OworCitzdHJ1Y3QgamZmczJfcmF3X2RpcmVudAoreworCWppbnQxNl90IG1hZ2ljOworCWppbnQxNl90IG5vZGV0eXBlOwkvKiA9PSBKRkZTMl9OT0RFVFlQRV9ESVJFTlQgKi8KKwlqaW50MzJfdCB0b3RsZW47CisJamludDMyX3QgaGRyX2NyYzsKKwlqaW50MzJfdCBwaW5vOworCWppbnQzMl90IHZlcnNpb247CisJamludDMyX3QgaW5vOyAvKiA9PSB6ZXJvIGZvciB1bmxpbmsgKi8KKwlqaW50MzJfdCBtY3RpbWU7CisJX191OCBuc2l6ZTsKKwlfX3U4IHR5cGU7CisJX191OCB1bnVzZWRbMl07CisJamludDMyX3Qgbm9kZV9jcmM7CisJamludDMyX3QgbmFtZV9jcmM7CisJX191OCBuYW1lWzBdOworfTsKKworLyogVGhlIEpGRlMyIHJhdyBpbm9kZSBzdHJ1Y3R1cmU6IFVzZWQgZm9yIHN0b3JhZ2Ugb24gcGh5c2ljYWwgbWVkaWEuICAqLworLyogVGhlIHVpZCwgZ2lkLCBhdGltZSwgbXRpbWUgYW5kIGN0aW1lIG1lbWJlcnMgY291bGQgYmUgbG9uZ2VyLCBidXQKKyAgIGFyZSBsZWZ0IGxpa2UgdGhpcyBmb3Igc3BhY2UgZWZmaWNpZW5jeS4gSWYgYW5kIHdoZW4gcGVvcGxlIGRlY2lkZQorICAgdGhleSByZWFsbHkgbmVlZCB0aGVtIGV4dGVuZGVkLCBpdCdzIHNpbXBsZSBlbm91Z2ggdG8gYWRkIHN1cHBvcnQgZm9yCisgICBhIG5ldyB0eXBlIG9mIHJhdyBub2RlLgorKi8KK3N0cnVjdCBqZmZzMl9yYXdfaW5vZGUKK3sKKwlqaW50MTZfdCBtYWdpYzsgICAgICAvKiBBIGNvbnN0YW50IG1hZ2ljIG51bWJlci4gICovCisJamludDE2X3Qgbm9kZXR5cGU7ICAgLyogPT0gSkZGUzJfTk9ERVRZUEVfSU5PREUgKi8KKwlqaW50MzJfdCB0b3RsZW47ICAgICAvKiBUb3RhbCBsZW5ndGggb2YgdGhpcyBub2RlIChpbmMgZGF0YSwgZXRjLikgKi8KKwlqaW50MzJfdCBoZHJfY3JjOworCWppbnQzMl90IGlubzsgICAgICAgIC8qIElub2RlIG51bWJlci4gICovCisJamludDMyX3QgdmVyc2lvbjsgICAgLyogVmVyc2lvbiBudW1iZXIuICAqLworCWptb2RlX3QgbW9kZTsgICAgICAgLyogVGhlIGZpbGUncyB0eXBlIG9yIG1vZGUuICAqLworCWppbnQxNl90IHVpZDsgICAgICAgIC8qIFRoZSBmaWxlJ3Mgb3duZXIuICAqLworCWppbnQxNl90IGdpZDsgICAgICAgIC8qIFRoZSBmaWxlJ3MgZ3JvdXAuICAqLworCWppbnQzMl90IGlzaXplOyAgICAgIC8qIFRvdGFsIHJlc3VsdGFudCBzaXplIG9mIHRoaXMgaW5vZGUgKHVzZWQgZm9yIHRydW5jYXRpb25zKSAgKi8KKwlqaW50MzJfdCBhdGltZTsgICAgICAvKiBMYXN0IGFjY2VzcyB0aW1lLiAgKi8KKwlqaW50MzJfdCBtdGltZTsgICAgICAvKiBMYXN0IG1vZGlmaWNhdGlvbiB0aW1lLiAgKi8KKwlqaW50MzJfdCBjdGltZTsgICAgICAvKiBDaGFuZ2UgdGltZS4gICovCisJamludDMyX3Qgb2Zmc2V0OyAgICAgLyogV2hlcmUgdG8gYmVnaW4gdG8gd3JpdGUuICAqLworCWppbnQzMl90IGNzaXplOyAgICAgIC8qIChDb21wcmVzc2VkKSBkYXRhIHNpemUgKi8KKwlqaW50MzJfdCBkc2l6ZTsJICAgICAvKiBTaXplIG9mIHRoZSBub2RlJ3MgZGF0YS4gKGFmdGVyIGRlY29tcHJlc3Npb24pICovCisJX191OCBjb21wcjsgICAgICAgLyogQ29tcHJlc3Npb24gYWxnb3JpdGhtIHVzZWQgKi8KKwlfX3U4IHVzZXJjb21wcjsgICAvKiBDb21wcmVzc2lvbiBhbGdvcml0aG0gcmVxdWVzdGVkIGJ5IHRoZSB1c2VyICovCisJamludDE2X3QgZmxhZ3M7CSAgICAgLyogU2VlIEpGRlMyX0lOT19GTEFHXyogKi8KKwlqaW50MzJfdCBkYXRhX2NyYzsgICAvKiBDUkMgZm9yIHRoZSAoY29tcHJlc3NlZCkgZGF0YS4gICovCisJamludDMyX3Qgbm9kZV9jcmM7ICAgLyogQ1JDIGZvciB0aGUgcmF3IGlub2RlIChleGNsdWRpbmcgZGF0YSkgICovCisJX191OCBkYXRhWzBdOworfTsKKworc3RydWN0IGpmZnMyX3Jhd194YXR0ciB7CisJamludDE2X3QgbWFnaWM7CisJamludDE2X3Qgbm9kZXR5cGU7CS8qID0gSkZGUzJfTk9ERVRZUEVfWEFUVFIgKi8KKwlqaW50MzJfdCB0b3RsZW47CisJamludDMyX3QgaGRyX2NyYzsKKwlqaW50MzJfdCB4aWQ7CQkvKiBYQVRUUiBpZGVudGlmaWVyIG51bWJlciAqLworCWppbnQzMl90IHZlcnNpb247CisJX191OCB4cHJlZml4OworCV9fdTggbmFtZV9sZW47CisJamludDE2X3QgdmFsdWVfbGVuOworCWppbnQzMl90IGRhdGFfY3JjOworCWppbnQzMl90IG5vZGVfY3JjOworCV9fdTggZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBqZmZzMl9yYXdfeHJlZgoreworCWppbnQxNl90IG1hZ2ljOworCWppbnQxNl90IG5vZGV0eXBlOwkvKiA9IEpGRlMyX05PREVUWVBFX1hSRUYgKi8KKwlqaW50MzJfdCB0b3RsZW47CisJamludDMyX3QgaGRyX2NyYzsKKwlqaW50MzJfdCBpbm87CQkvKiBpbm9kZSBudW1iZXIgKi8KKwlqaW50MzJfdCB4aWQ7CQkvKiBYQVRUUiBpZGVudGlmaWVyIG51bWJlciAqLworCWppbnQzMl90IHhzZXFubzsJLyogeHJlZiBzZXF1ZW50aWFsIG51bWJlciAqLworCWppbnQzMl90IG5vZGVfY3JjOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGpmZnMyX3Jhd19zdW1tYXJ5Cit7CisJamludDE2X3QgbWFnaWM7CisJamludDE2X3Qgbm9kZXR5cGU7IAkvKiA9IEpGRlMyX05PREVUWVBFX1NVTU1BUlkgKi8KKwlqaW50MzJfdCB0b3RsZW47CisJamludDMyX3QgaGRyX2NyYzsKKwlqaW50MzJfdCBzdW1fbnVtOwkvKiBudW1iZXIgb2Ygc3VtIGVudHJpZXMqLworCWppbnQzMl90IGNsbl9ta3I7CS8qIGNsZWFuIG1hcmtlciBzaXplLCAwID0gbm8gY2xlYW5tYXJrZXIgKi8KKwlqaW50MzJfdCBwYWRkZWQ7CS8qIHN1bSBvZiB0aGUgc2l6ZSBvZiBwYWRkaW5nIG5vZGVzICovCisJamludDMyX3Qgc3VtX2NyYzsJLyogc3VtbWFyeSBpbmZvcm1hdGlvbiBjcmMgKi8KKwlqaW50MzJfdCBub2RlX2NyYzsgCS8qIG5vZGUgY3JjICovCisJamludDMyX3Qgc3VtWzBdOyAJLyogaW5vZGUgc3VtbWFyeSBpbmZvICovCit9OworCit1bmlvbiBqZmZzMl9ub2RlX3VuaW9uCit7CisJc3RydWN0IGpmZnMyX3Jhd19pbm9kZSBpOworCXN0cnVjdCBqZmZzMl9yYXdfZGlyZW50IGQ7CisJc3RydWN0IGpmZnMyX3Jhd194YXR0ciB4OworCXN0cnVjdCBqZmZzMl9yYXdfeHJlZiByOworCXN0cnVjdCBqZmZzMl9yYXdfc3VtbWFyeSBzOworCXN0cnVjdCBqZmZzMl91bmtub3duX25vZGUgdTsKK307CisKKy8qIERhdGEgcGF5bG9hZCBmb3IgZGV2aWNlIG5vZGVzLiAqLwordW5pb24gamZmczJfZGV2aWNlX25vZGUgeworCWppbnQxNl90IG9sZF9pZDsKKwlqaW50MzJfdCBuZXdfaWQ7Cit9OworCisjZW5kaWYgLyogX19MSU5VWF9KRkZTMl9IX18gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvam95c3RpY2suaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvam95c3RpY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTM2NjFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9qb3lzdGljay5oCkBAIC0wLDAgKzEsMTM2IEBACisjaWZuZGVmIF9MSU5VWF9KT1lTVElDS19ICisjZGVmaW5lIF9MSU5VWF9KT1lTVElDS19ICisKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDAgVm9qdGVjaCBQYXZsaWsKKyAqCisgKiAgU3BvbnNvcmVkIGJ5IFN1U0UKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqIAorICogU2hvdWxkIHlvdSBuZWVkIHRvIGNvbnRhY3QgbWUsIHRoZSBhdXRob3IsIHlvdSBjYW4gZG8gc28gZWl0aGVyIGJ5CisgKiBlLW1haWwgLSBtYWlsIHlvdXIgbWVzc2FnZSB0byA8dm9qdGVjaEBzdXNlLmN6Piwgb3IgYnkgcGFwZXIgbWFpbDoKKyAqIFZvanRlY2ggUGF2bGlrLCBVY2l0ZWxza2EgMTU3NiwgUHJhZ3VlIDgsIDE4MiAwMCBDemVjaCBSZXB1YmxpYworICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisKKy8qCisgKiBWZXJzaW9uCisgKi8KKworI2RlZmluZSBKU19WRVJTSU9OCQkweDAyMDEwMAorCisvKgorICogVHlwZXMgYW5kIGNvbnN0YW50cyBmb3IgcmVhZGluZyBmcm9tIC9kZXYvanMKKyAqLworCisjZGVmaW5lIEpTX0VWRU5UX0JVVFRPTgkJMHgwMQkvKiBidXR0b24gcHJlc3NlZC9yZWxlYXNlZCAqLworI2RlZmluZSBKU19FVkVOVF9BWElTCQkweDAyCS8qIGpveXN0aWNrIG1vdmVkICovCisjZGVmaW5lIEpTX0VWRU5UX0lOSVQJCTB4ODAJLyogaW5pdGlhbCBzdGF0ZSBvZiBkZXZpY2UgKi8KKworc3RydWN0IGpzX2V2ZW50IHsKKwlfX3UzMiB0aW1lOwkvKiBldmVudCB0aW1lc3RhbXAgaW4gbWlsbGlzZWNvbmRzICovCisJX19zMTYgdmFsdWU7CS8qIHZhbHVlICovCisJX191OCB0eXBlOwkvKiBldmVudCB0eXBlICovCisJX191OCBudW1iZXI7CS8qIGF4aXMvYnV0dG9uIG51bWJlciAqLworfTsKKworLyoKKyAqIElPQ1RMIGNvbW1hbmRzIGZvciBqb3lzdGljayBkcml2ZXIKKyAqLworCisjZGVmaW5lIEpTSU9DR1ZFUlNJT04JCV9JT1IoJ2onLCAweDAxLCBfX3UzMikJCQkJLyogZ2V0IGRyaXZlciB2ZXJzaW9uICovCisKKyNkZWZpbmUgSlNJT0NHQVhFUwkJX0lPUignaicsIDB4MTEsIF9fdTgpCQkJCS8qIGdldCBudW1iZXIgb2YgYXhlcyAqLworI2RlZmluZSBKU0lPQ0dCVVRUT05TCQlfSU9SKCdqJywgMHgxMiwgX191OCkJCQkJLyogZ2V0IG51bWJlciBvZiBidXR0b25zICovCisjZGVmaW5lIEpTSU9DR05BTUUobGVuKQkJX0lPQyhfSU9DX1JFQUQsICdqJywgMHgxMywgbGVuKQkJCS8qIGdldCBpZGVudGlmaWVyIHN0cmluZyAqLworCisjZGVmaW5lIEpTSU9DU0NPUlIJCV9JT1coJ2onLCAweDIxLCBzdHJ1Y3QganNfY29ycikJCQkvKiBzZXQgY29ycmVjdGlvbiB2YWx1ZXMgKi8KKyNkZWZpbmUgSlNJT0NHQ09SUgkJX0lPUignaicsIDB4MjIsIHN0cnVjdCBqc19jb3JyKQkJCS8qIGdldCBjb3JyZWN0aW9uIHZhbHVlcyAqLworCisjZGVmaW5lIEpTSU9DU0FYTUFQCQlfSU9XKCdqJywgMHgzMSwgX191OFtBQlNfQ05UXSkJCQkvKiBzZXQgYXhpcyBtYXBwaW5nICovCisjZGVmaW5lIEpTSU9DR0FYTUFQCQlfSU9SKCdqJywgMHgzMiwgX191OFtBQlNfQ05UXSkJCQkvKiBnZXQgYXhpcyBtYXBwaW5nICovCisjZGVmaW5lIEpTSU9DU0JUTk1BUAkJX0lPVygnaicsIDB4MzMsIF9fdTE2W0tFWV9NQVggLSBCVE5fTUlTQyArIDFdKQkvKiBzZXQgYnV0dG9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgSlNJT0NHQlROTUFQCQlfSU9SKCdqJywgMHgzNCwgX191MTZbS0VZX01BWCAtIEJUTl9NSVNDICsgMV0pCS8qIGdldCBidXR0b24gbWFwcGluZyAqLworCisvKgorICogVHlwZXMgYW5kIGNvbnN0YW50cyBmb3IgZ2V0L3NldCBjb3JyZWN0aW9uCisgKi8KKworI2RlZmluZSBKU19DT1JSX05PTkUJCTB4MDAJLyogcmV0dXJucyByYXcgdmFsdWVzICovCisjZGVmaW5lIEpTX0NPUlJfQlJPS0VOCQkweDAxCS8qIGJyb2tlbiBsaW5lICovCisKK3N0cnVjdCBqc19jb3JyIHsKKwlfX3MzMiBjb2VmWzhdOworCV9fczE2IHByZWM7CisJX191MTYgdHlwZTsKK307CisKKy8qCisgKiB2MC54IGNvbXBhdGliaWxpdHkgZGVmaW5pdGlvbnMKKyAqLworCisjZGVmaW5lIEpTX1JFVFVSTgkJc2l6ZW9mKHN0cnVjdCBKU19EQVRBX1RZUEUpCisjZGVmaW5lIEpTX1RSVUUJCQkxCisjZGVmaW5lIEpTX0ZBTFNFCQkwCisjZGVmaW5lIEpTX1hfMAkJCTB4MDEKKyNkZWZpbmUgSlNfWV8wCQkJMHgwMgorI2RlZmluZSBKU19YXzEJCQkweDA0CisjZGVmaW5lIEpTX1lfMQkJCTB4MDgKKyNkZWZpbmUgSlNfTUFYCQkJMgorCisjZGVmaW5lIEpTX0RFRl9USU1FT1VUCQkweDEzMDAKKyNkZWZpbmUgSlNfREVGX0NPUlIJCTAKKyNkZWZpbmUgSlNfREVGX1RJTUVMSU1JVAkxMEwKKworI2RlZmluZSBKU19TRVRfQ0FMCQkxCisjZGVmaW5lIEpTX0dFVF9DQUwJCTIKKyNkZWZpbmUgSlNfU0VUX1RJTUVPVVQJCTMKKyNkZWZpbmUgSlNfR0VUX1RJTUVPVVQJCTQKKyNkZWZpbmUgSlNfU0VUX1RJTUVMSU1JVAk1CisjZGVmaW5lIEpTX0dFVF9USU1FTElNSVQJNgorI2RlZmluZSBKU19HRVRfQUxMCQk3CisjZGVmaW5lIEpTX1NFVF9BTEwJCTgKKworc3RydWN0IEpTX0RBVEFfVFlQRSB7CisJX19zMzIgYnV0dG9uczsKKwlfX3MzMiB4OworCV9fczMyIHk7Cit9OworCitzdHJ1Y3QgSlNfREFUQV9TQVZFX1RZUEVfMzIgeworCV9fczMyIEpTX1RJTUVPVVQ7CisJX19zMzIgQlVTWTsKKwlfX3MzMiBKU19FWFBJUkVUSU1FOworCV9fczMyIEpTX1RJTUVMSU1JVDsKKwlzdHJ1Y3QgSlNfREFUQV9UWVBFIEpTX1NBVkU7CisJc3RydWN0IEpTX0RBVEFfVFlQRSBKU19DT1JSOworfTsKKworc3RydWN0IEpTX0RBVEFfU0FWRV9UWVBFXzY0IHsKKwlfX3MzMiBKU19USU1FT1VUOworCV9fczMyIEJVU1k7CisJX19zNjQgSlNfRVhQSVJFVElNRTsKKwlfX3M2NCBKU19USU1FTElNSVQ7CisJc3RydWN0IEpTX0RBVEFfVFlQRSBKU19TQVZFOworCXN0cnVjdCBKU19EQVRBX1RZUEUgSlNfQ09SUjsKK307CisKKworI2VuZGlmIC8qIF9MSU5VWF9KT1lTVElDS19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmViM2NlOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2QuaApAQCAtMCwwICsxLDE4NCBAQAorI2lmbmRlZiBfTElOVVhfS0RfSAorI2RlZmluZSBfTElOVVhfS0RfSAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKworLyogMHg0QiBpcyAnSycsIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIHRlcm1pb3MgYW5kIHZ0ICovCisKKyNkZWZpbmUgR0lPX0ZPTlQJMHg0QjYwCS8qIGdldHMgZm9udCBpbiBleHBhbmRlZCBmb3JtICovCisjZGVmaW5lIFBJT19GT05UCTB4NEI2MQkvKiB1c2UgZm9udCBpbiBleHBhbmRlZCBmb3JtICovCisKKyNkZWZpbmUgR0lPX0ZPTlRYCTB4NEI2QgkvKiBnZXQgZm9udCB1c2luZyBzdHJ1Y3QgY29uc29sZWZvbnRkZXNjICovCisjZGVmaW5lIFBJT19GT05UWAkweDRCNkMJLyogc2V0IGZvbnQgdXNpbmcgc3RydWN0IGNvbnNvbGVmb250ZGVzYyAqLworc3RydWN0IGNvbnNvbGVmb250ZGVzYyB7CisJdW5zaWduZWQgc2hvcnQgY2hhcmNvdW50OwkvKiBjaGFyYWN0ZXJzIGluIGZvbnQgKDI1NiBvciA1MTIpICovCisJdW5zaWduZWQgc2hvcnQgY2hhcmhlaWdodDsJLyogc2NhbiBsaW5lcyBwZXIgY2hhcmFjdGVyICgxLTMyKSAqLworCWNoYXIgKmNoYXJkYXRhOwkJLyogZm9udCBkYXRhIGluIGV4cGFuZGVkIGZvcm0gKi8KK307CisKKyNkZWZpbmUgUElPX0ZPTlRSRVNFVCAgIDB4NEI2RAkvKiByZXNldCB0byBkZWZhdWx0IGZvbnQgKi8KKworI2RlZmluZSBHSU9fQ01BUAkweDRCNzAJLyogZ2V0cyBjb2xvdXIgcGFsZXR0ZSBvbiBWR0ErICovCisjZGVmaW5lIFBJT19DTUFQCTB4NEI3MQkvKiBzZXRzIGNvbG91ciBwYWxldHRlIG9uIFZHQSsgKi8KKworI2RlZmluZSBLSU9DU09VTkQJMHg0QjJGCS8qIHN0YXJ0IHNvdW5kIGdlbmVyYXRpb24gKDAgZm9yIG9mZikgKi8KKyNkZWZpbmUgS0RNS1RPTkUJMHg0QjMwCS8qIGdlbmVyYXRlIHRvbmUgKi8KKworI2RlZmluZSBLREdFVExFRAkweDRCMzEJLyogcmV0dXJuIGN1cnJlbnQgbGVkIHN0YXRlICovCisjZGVmaW5lIEtEU0VUTEVECTB4NEIzMgkvKiBzZXQgbGVkIHN0YXRlIFtsaWdodHMsIG5vdCBmbGFnc10gKi8KKyNkZWZpbmUgCUxFRF9TQ1IJCTB4MDEJLyogc2Nyb2xsIGxvY2sgbGVkICovCisjZGVmaW5lIAlMRURfTlVNCQkweDAyCS8qIG51bSBsb2NrIGxlZCAqLworI2RlZmluZSAJTEVEX0NBUAkJMHgwNAkvKiBjYXBzIGxvY2sgbGVkICovCisKKyNkZWZpbmUgS0RHS0JUWVBFCTB4NEIzMwkvKiBnZXQga2V5Ym9hcmQgdHlwZSAqLworI2RlZmluZSAJS0JfODQJCTB4MDEKKyNkZWZpbmUgCUtCXzEwMQkJMHgwMiAJLyogdGhpcyBpcyB3aGF0IHdlIGFsd2F5cyBhbnN3ZXIgKi8KKyNkZWZpbmUgCUtCX09USEVSCTB4MDMKKworI2RlZmluZSBLREFERElPCQkweDRCMzQJLyogYWRkIGkvbyBwb3J0IGFzIHZhbGlkICovCisjZGVmaW5lIEtEREVMSU8JCTB4NEIzNQkvKiBkZWwgaS9vIHBvcnQgYXMgdmFsaWQgKi8KKyNkZWZpbmUgS0RFTkFCSU8JMHg0QjM2CS8qIGVuYWJsZSBpL28gdG8gdmlkZW8gYm9hcmQgKi8KKyNkZWZpbmUgS0RESVNBQklPCTB4NEIzNwkvKiBkaXNhYmxlIGkvbyB0byB2aWRlbyBib2FyZCAqLworCisjZGVmaW5lIEtEU0VUTU9ERQkweDRCM0EJLyogc2V0IHRleHQvZ3JhcGhpY3MgbW9kZSAqLworI2RlZmluZQkJS0RfVEVYVAkJMHgwMAorI2RlZmluZQkJS0RfR1JBUEhJQ1MJMHgwMQorI2RlZmluZQkJS0RfVEVYVDAJMHgwMgkvKiBvYnNvbGV0ZSAqLworI2RlZmluZQkJS0RfVEVYVDEJMHgwMwkvKiBvYnNvbGV0ZSAqLworI2RlZmluZQkJS0RfVFJBTlNQQVJFTlQJMHgwNAorI2RlZmluZSBLREdFVE1PREUJMHg0QjNCCS8qIGdldCBjdXJyZW50IG1vZGUgKi8KKworI2RlZmluZSBLRE1BUERJU1AJMHg0QjNDCS8qIG1hcCBkaXNwbGF5IGludG8gYWRkcmVzcyBzcGFjZSAqLworI2RlZmluZSBLRFVOTUFQRElTUAkweDRCM0QJLyogdW5tYXAgZGlzcGxheSBmcm9tIGFkZHJlc3Mgc3BhY2UgKi8KKwordHlwZWRlZiBjaGFyIHNjcm5tYXBfdDsKKyNkZWZpbmUJCUVfVEFCU1oJCTI1NgorI2RlZmluZSBHSU9fU0NSTk1BUAkweDRCNDAJLyogZ2V0IHNjcmVlbiBtYXBwaW5nIGZyb20ga2VybmVsICovCisjZGVmaW5lIFBJT19TQ1JOTUFQCTB4NEI0MQkvKiBwdXQgc2NyZWVuIG1hcHBpbmcgdGFibGUgaW4ga2VybmVsICovCisjZGVmaW5lIEdJT19VTklTQ1JOTUFQICAweDRCNjkJLyogZ2V0IGZ1bGwgVW5pY29kZSBzY3JlZW4gbWFwcGluZyAqLworI2RlZmluZSBQSU9fVU5JU0NSTk1BUCAgMHg0QjZBICAvKiBzZXQgZnVsbCBVbmljb2RlIHNjcmVlbiBtYXBwaW5nICovCisKKyNkZWZpbmUgR0lPX1VOSU1BUAkweDRCNjYJLyogZ2V0IHVuaWNvZGUtdG8tZm9udCBtYXBwaW5nIGZyb20ga2VybmVsICovCitzdHJ1Y3QgdW5pcGFpciB7CisJdW5zaWduZWQgc2hvcnQgdW5pY29kZTsKKwl1bnNpZ25lZCBzaG9ydCBmb250cG9zOworfTsKK3N0cnVjdCB1bmltYXBkZXNjIHsKKwl1bnNpZ25lZCBzaG9ydCBlbnRyeV9jdDsKKwlzdHJ1Y3QgdW5pcGFpciAqZW50cmllczsKK307CisjZGVmaW5lIFBJT19VTklNQVAJMHg0QjY3CS8qIHB1dCB1bmljb2RlLXRvLWZvbnQgbWFwcGluZyBpbiBrZXJuZWwgKi8KKyNkZWZpbmUgUElPX1VOSU1BUENMUgkweDRCNjgJLyogY2xlYXIgdGFibGUsIHBvc3NpYmx5IGFkdmlzZSBoYXNoIGFsZ29yaXRobSAqLworc3RydWN0IHVuaW1hcGluaXQgeworCXVuc2lnbmVkIHNob3J0IGFkdmlzZWRfaGFzaHNpemU7ICAvKiAwIGlmIG5vIG9waW5pb24gKi8KKwl1bnNpZ25lZCBzaG9ydCBhZHZpc2VkX2hhc2hzdGVwOyAgLyogMCBpZiBubyBvcGluaW9uICovCisJdW5zaWduZWQgc2hvcnQgYWR2aXNlZF9oYXNobGV2ZWw7IC8qIDAgaWYgbm8gb3BpbmlvbiAqLworfTsKKworI2RlZmluZSBVTklfRElSRUNUX0JBU0UgMHhGMDAwCS8qIHN0YXJ0IG9mIERpcmVjdCBGb250IFJlZ2lvbiAqLworI2RlZmluZSBVTklfRElSRUNUX01BU0sgMHgwMUZGCS8qIERpcmVjdCBGb250IFJlZ2lvbiBiaXRtYXNrICovCisKKyNkZWZpbmUJCUtfUkFXCQkweDAwCisjZGVmaW5lCQlLX1hMQVRFCQkweDAxCisjZGVmaW5lCQlLX01FRElVTVJBVwkweDAyCisjZGVmaW5lCQlLX1VOSUNPREUJMHgwMworI2RlZmluZQkJS19PRkYJCTB4MDQKKyNkZWZpbmUgS0RHS0JNT0RFCTB4NEI0NAkvKiBnZXRzIGN1cnJlbnQga2V5Ym9hcmQgbW9kZSAqLworI2RlZmluZSBLRFNLQk1PREUJMHg0QjQ1CS8qIHNldHMgY3VycmVudCBrZXlib2FyZCBtb2RlICovCisKKyNkZWZpbmUJCUtfTUVUQUJJVAkweDAzCisjZGVmaW5lCQlLX0VTQ1BSRUZJWAkweDA0CisjZGVmaW5lIEtER0tCTUVUQQkweDRCNjIJLyogZ2V0cyBtZXRhIGtleSBoYW5kbGluZyBtb2RlICovCisjZGVmaW5lIEtEU0tCTUVUQQkweDRCNjMJLyogc2V0cyBtZXRhIGtleSBoYW5kbGluZyBtb2RlICovCisKKyNkZWZpbmUJCUtfU0NST0xMTE9DSwkweDAxCisjZGVmaW5lCQlLX05VTUxPQ0sJMHgwMgorI2RlZmluZQkJS19DQVBTTE9DSwkweDA0CisjZGVmaW5lCUtER0tCTEVECTB4NEI2NAkvKiBnZXQgbGVkIGZsYWdzIChub3QgbGlnaHRzKSAqLworI2RlZmluZQlLRFNLQkxFRAkweDRCNjUJLyogc2V0IGxlZCBmbGFncyAobm90IGxpZ2h0cykgKi8KKworc3RydWN0IGtiZW50cnkgeworCXVuc2lnbmVkIGNoYXIga2JfdGFibGU7CisJdW5zaWduZWQgY2hhciBrYl9pbmRleDsKKwl1bnNpZ25lZCBzaG9ydCBrYl92YWx1ZTsKK307CisjZGVmaW5lCQlLX05PUk1UQUIJMHgwMAorI2RlZmluZQkJS19TSElGVFRBQgkweDAxCisjZGVmaW5lCQlLX0FMVFRBQgkweDAyCisjZGVmaW5lCQlLX0FMVFNISUZUVEFCCTB4MDMKKworI2RlZmluZSBLREdLQkVOVAkweDRCNDYJLyogZ2V0cyBvbmUgZW50cnkgaW4gdHJhbnNsYXRpb24gdGFibGUgKi8KKyNkZWZpbmUgS0RTS0JFTlQJMHg0QjQ3CS8qIHNldHMgb25lIGVudHJ5IGluIHRyYW5zbGF0aW9uIHRhYmxlICovCisKK3N0cnVjdCBrYnNlbnRyeSB7CisJdW5zaWduZWQgY2hhciBrYl9mdW5jOworCXVuc2lnbmVkIGNoYXIga2Jfc3RyaW5nWzUxMl07Cit9OworI2RlZmluZSBLREdLQlNFTlQJMHg0QjQ4CS8qIGdldHMgb25lIGZ1bmN0aW9uIGtleSBzdHJpbmcgZW50cnkgKi8KKyNkZWZpbmUgS0RTS0JTRU5UCTB4NEI0OQkvKiBzZXRzIG9uZSBmdW5jdGlvbiBrZXkgc3RyaW5nIGVudHJ5ICovCisKK3N0cnVjdCBrYmRpYWNyIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBkaWFjciwgYmFzZSwgcmVzdWx0OworfTsKK3N0cnVjdCBrYmRpYWNycyB7CisgICAgICAgIHVuc2lnbmVkIGludCBrYl9jbnQ7ICAgIC8qIG51bWJlciBvZiBlbnRyaWVzIGluIGZvbGxvd2luZyBhcnJheSAqLworCXN0cnVjdCBrYmRpYWNyIGtiZGlhY3JbMjU2XTsgICAgLyogTUFYX0RJQUNSIGZyb20ga2V5Ym9hcmQuaCAqLworfTsKKyNkZWZpbmUgS0RHS0JESUFDUiAgICAgIDB4NEI0QSAgLyogcmVhZCBrZXJuZWwgYWNjZW50IHRhYmxlICovCisjZGVmaW5lIEtEU0tCRElBQ1IgICAgICAweDRCNEIgIC8qIHdyaXRlIGtlcm5lbCBhY2NlbnQgdGFibGUgKi8KKworc3RydWN0IGtiZGlhY3J1YyB7CisJdW5zaWduZWQgaW50IGRpYWNyLCBiYXNlLCByZXN1bHQ7Cit9Oworc3RydWN0IGtiZGlhY3JzdWMgeworICAgICAgICB1bnNpZ25lZCBpbnQga2JfY250OyAgICAvKiBudW1iZXIgb2YgZW50cmllcyBpbiBmb2xsb3dpbmcgYXJyYXkgKi8KKwlzdHJ1Y3Qga2JkaWFjcnVjIGtiZGlhY3J1Y1syNTZdOyAgICAvKiBNQVhfRElBQ1IgZnJvbSBrZXlib2FyZC5oICovCit9OworI2RlZmluZSBLREdLQkRJQUNSVUMgICAgMHg0QkZBICAvKiByZWFkIGtlcm5lbCBhY2NlbnQgdGFibGUgLSBVQ1MgKi8KKyNkZWZpbmUgS0RTS0JESUFDUlVDICAgIDB4NEJGQiAgLyogd3JpdGUga2VybmVsIGFjY2VudCB0YWJsZSAtIFVDUyAqLworCitzdHJ1Y3Qga2JrZXljb2RlIHsKKwl1bnNpZ25lZCBpbnQgc2NhbmNvZGUsIGtleWNvZGU7Cit9OworI2RlZmluZSBLREdFVEtFWUNPREUJMHg0QjRDCS8qIHJlYWQga2VybmVsIGtleWNvZGUgdGFibGUgZW50cnkgKi8KKyNkZWZpbmUgS0RTRVRLRVlDT0RFCTB4NEI0RAkvKiB3cml0ZSBrZXJuZWwga2V5Y29kZSB0YWJsZSBlbnRyeSAqLworCisjZGVmaW5lIEtEU0lHQUNDRVBUCTB4NEI0RQkvKiBhY2NlcHQga2JkIGdlbmVyYXRlZCBzaWduYWxzICovCisKK3N0cnVjdCBrYmRfcmVwZWF0IHsKKwlpbnQgZGVsYXk7CS8qIGluIG1zZWM7IDw9IDA6IGRvbid0IGNoYW5nZSAqLworCWludCBwZXJpb2Q7CS8qIGluIG1zZWM7IDw9IDA6IGRvbid0IGNoYW5nZSAqLworCQkJLyogZWFybGllciB0aGlzIGZpZWxkIHdhcyBtaXNuYW1lZCAicmF0ZSIgKi8KK307CisKKyNkZWZpbmUgS0RLQkRSRVAgICAgICAgIDB4NEI1MiAgLyogc2V0IGtleWJvYXJkIGRlbGF5L3JlcGVhdCByYXRlOworCQkJCSAqIGFjdHVhbGx5IHVzZWQgdmFsdWVzIGFyZSByZXR1cm5lZCAqLworCisjZGVmaW5lIEtERk9OVE9QCTB4NEI3MgkvKiBmb250IG9wZXJhdGlvbnMgKi8KKworc3RydWN0IGNvbnNvbGVfZm9udF9vcCB7CisJdW5zaWduZWQgaW50IG9wOwkvKiBvcGVyYXRpb24gY29kZSBLRF9GT05UX09QXyogKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CS8qIEtEX0ZPTlRfRkxBR18qICovCisJdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQ7CS8qIGZvbnQgc2l6ZSAqLworCXVuc2lnbmVkIGludCBjaGFyY291bnQ7CisJdW5zaWduZWQgY2hhciAqZGF0YTsJLyogZm9udCBkYXRhIHdpdGggaGVpZ2h0IGZpeGVkIHRvIDMyICovCit9OworCitzdHJ1Y3QgY29uc29sZV9mb250IHsKKwl1bnNpZ25lZCBpbnQgd2lkdGgsIGhlaWdodDsJLyogZm9udCBzaXplICovCisJdW5zaWduZWQgaW50IGNoYXJjb3VudDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOwkvKiBmb250IGRhdGEgd2l0aCBoZWlnaHQgZml4ZWQgdG8gMzIgKi8KK307CisKKyNkZWZpbmUgS0RfRk9OVF9PUF9TRVQJCTAJLyogU2V0IGZvbnQgKi8KKyNkZWZpbmUgS0RfRk9OVF9PUF9HRVQJCTEJLyogR2V0IGZvbnQgKi8KKyNkZWZpbmUgS0RfRk9OVF9PUF9TRVRfREVGQVVMVAkyCS8qIFNldCBmb250IHRvIGRlZmF1bHQsIGRhdGEgcG9pbnRzIHRvIG5hbWUgLyBOVUxMICovCisjZGVmaW5lIEtEX0ZPTlRfT1BfQ09QWQkJMwkvKiBDb3B5IGZyb20gYW5vdGhlciBjb25zb2xlICovCisKKyNkZWZpbmUgS0RfRk9OVF9GTEFHX0RPTlRfUkVDQUxDIAkxCS8qIERvbid0IHJlY2FsY3VsYXRlIGh3IGNoYXJjZWxsIHNpemUgW2NvbXBhdF0gKi8KKworLyogbm90ZTogMHg0QjAwLTB4NEI0RSBhbGwgaGF2ZSBoYWQgYSB2YWx1ZSBhdCBzb21lIHRpbWU7CisgICBkb24ndCByZXVzZSBmb3IgdGhlIHRpbWUgYmVpbmcgKi8KKy8qIG5vdGU6IDB4NEI2MC0weDRCNkQsIDB4NEI3MC0weDRCNzIgdXNlZCBhYm92ZSAqLworCisjZW5kaWYgLyogX0xJTlVYX0tEX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2Rldl90LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tkZXZfdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNTU1MWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tkZXZfdC5oCkBAIC0wLDAgKzEsMTEgQEAKKyNpZm5kZWYgX0xJTlVYX0tERVZfVF9ICisjZGVmaW5lIF9MSU5VWF9LREVWX1RfSAorCisvKgorU29tZSBwcm9ncmFtcyB3YW50IHRoZWlyIGRlZmluaXRpb25zIG9mIE1BSk9SIGFuZCBNSU5PUiBhbmQgTUtERVYKK2Zyb20gdGhlIGtlcm5lbCBzb3VyY2VzLiBUaGVzZSBtdXN0IGJlIHRoZSBleHRlcm5hbGx5IHZpc2libGUgb25lcy4KKyovCisjZGVmaW5lIE1BSk9SKGRldikJKChkZXYpPj44KQorI2RlZmluZSBNSU5PUihkZXYpCSgoZGV2KSAmIDB4ZmYpCisjZGVmaW5lIE1LREVWKG1hLG1pKQkoKG1hKTw8OCB8IChtaSkpCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2VybmVsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YzU5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCkBAIC0wLDAgKzEsMjkgQEAKKyNpZm5kZWYgX0xJTlVYX0tFUk5FTF9ICisjZGVmaW5lIF9MSU5VWF9LRVJORUxfSAorCisvKgorICogJ2tlcm5lbC5oJyBjb250YWlucyBzb21lIG9mdGVuLXVzZWQgZnVuY3Rpb24gcHJvdG90eXBlcyBldGMKKyAqLworI2RlZmluZSBfX0FMSUdOX0tFUk5FTCh4LCBhKQkJX19BTElHTl9LRVJORUxfTUFTSyh4LCAodHlwZW9mKHgpKShhKSAtIDEpCisjZGVmaW5lIF9fQUxJR05fS0VSTkVMX01BU0soeCwgbWFzaykJKCgoeCkgKyAobWFzaykpICYgfihtYXNrKSkKKworCisjZGVmaW5lIFNJX0xPQURfU0hJRlQJMTYKK3N0cnVjdCBzeXNpbmZvIHsKKwlsb25nIHVwdGltZTsJCQkvKiBTZWNvbmRzIHNpbmNlIGJvb3QgKi8KKwl1bnNpZ25lZCBsb25nIGxvYWRzWzNdOwkJLyogMSwgNSwgYW5kIDE1IG1pbnV0ZSBsb2FkIGF2ZXJhZ2VzICovCisJdW5zaWduZWQgbG9uZyB0b3RhbHJhbTsJCS8qIFRvdGFsIHVzYWJsZSBtYWluIG1lbW9yeSBzaXplICovCisJdW5zaWduZWQgbG9uZyBmcmVlcmFtOwkJLyogQXZhaWxhYmxlIG1lbW9yeSBzaXplICovCisJdW5zaWduZWQgbG9uZyBzaGFyZWRyYW07CS8qIEFtb3VudCBvZiBzaGFyZWQgbWVtb3J5ICovCisJdW5zaWduZWQgbG9uZyBidWZmZXJyYW07CS8qIE1lbW9yeSB1c2VkIGJ5IGJ1ZmZlcnMgKi8KKwl1bnNpZ25lZCBsb25nIHRvdGFsc3dhcDsJLyogVG90YWwgc3dhcCBzcGFjZSBzaXplICovCisJdW5zaWduZWQgbG9uZyBmcmVlc3dhcDsJCS8qIHN3YXAgc3BhY2Ugc3RpbGwgYXZhaWxhYmxlICovCisJdW5zaWduZWQgc2hvcnQgcHJvY3M7CQkvKiBOdW1iZXIgb2YgY3VycmVudCBwcm9jZXNzZXMgKi8KKwl1bnNpZ25lZCBzaG9ydCBwYWQ7CQkvKiBleHBsaWNpdCBwYWRkaW5nIGZvciBtNjhrICovCisJdW5zaWduZWQgbG9uZyB0b3RhbGhpZ2g7CS8qIFRvdGFsIGhpZ2ggbWVtb3J5IHNpemUgKi8KKwl1bnNpZ25lZCBsb25nIGZyZWVoaWdoOwkJLyogQXZhaWxhYmxlIGhpZ2ggbWVtb3J5IHNpemUgKi8KKwl1bnNpZ25lZCBpbnQgbWVtX3VuaXQ7CQkvKiBNZW1vcnkgdW5pdCBzaXplIGluIGJ5dGVzICovCisJY2hhciBfZlsyMC0yKnNpemVvZihsb25nKS1zaXplb2YoaW50KV07CS8qIFBhZGRpbmc6IGxpYmM1IHVzZXMgdGhpcy4uICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2VybmVsY2FwaS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9rZXJuZWxjYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmNmI0MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2VybmVsY2FwaS5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiAkSWQ6IGtlcm5lbGNhcGkuaCx2IDEuOC42LjIgMjAwMS8wMi8wNyAxMTozMTozMSBrYWkgRXhwICQKKyAqIAorICogS2VybmVsIENBUEkgMi4wIEludGVyZmFjZSBmb3IgTGludXgKKyAqIAorICogKGMpIENvcHlyaWdodCAxOTk3IGJ5IENhcnN0ZW4gUGFldGggKGNhbGxlQGNhbGxlLmluLWJlcmxpbi5kZSkKKyAqIAorICovCisKKyNpZm5kZWYgX19LRVJORUxDQVBJX0hfXworI2RlZmluZSBfX0tFUk5FTENBUElfSF9fCisKKyNkZWZpbmUgQ0FQSV9NQVhBUFBMCTI0MAkvKiBtYXhpbXVtIG51bWJlciBvZiBhcHBsaWNhdGlvbnMgICovCisjZGVmaW5lIENBUElfTUFYQ09OVFIJMzIJLyogbWF4aW11bSBudW1iZXIgb2YgY29udHJvbGxlciAgICAqLworI2RlZmluZSBDQVBJX01BWERBVEFXSU5ET1cJOAorCisKK3R5cGVkZWYgc3RydWN0IGtjYXBpX2ZsYWdkZWYgeworCWludCBjb250cjsKKwlpbnQgZmxhZzsKK30ga2NhcGlfZmxhZ2RlZjsKKwordHlwZWRlZiBzdHJ1Y3Qga2NhcGlfY2FyZGRlZiB7CisJY2hhcgkJZHJpdmVyWzMyXTsKKwl1bnNpZ25lZCBpbnQJcG9ydDsKKwl1bnNpZ25lZAlpcnE7CisJdW5zaWduZWQgaW50CW1lbWJhc2U7CisJaW50CQljYXJkbnI7Cit9IGtjYXBpX2NhcmRkZWY7CisKKy8qIG5ldyBpb2N0bHMgPj0gMTAgKi8KKyNkZWZpbmUgS0NBUElfQ01EX1RSQUNFCQkxMAorI2RlZmluZSBLQ0FQSV9DTURfQUREQ0FSRAkxMQkvKiBPQlNPTEVURSAqLworCisvKiAKKyAqIGZsYWcgPiAyID0+IHRyYWNlIGFsc28gZGF0YQorICogZmxhZyAmIDEgPT4gc2hvdyB0cmFjZQorICovCisjZGVmaW5lIEtDQVBJX1RSQUNFX09GRgkJCTAKKyNkZWZpbmUgS0NBUElfVFJBQ0VfU0hPUlRfTk9fREFUQQkxCisjZGVmaW5lIEtDQVBJX1RSQUNFX0ZVTExfTk9fREFUQQkyCisjZGVmaW5lIEtDQVBJX1RSQUNFX1NIT1JUCQkzCisjZGVmaW5lIEtDQVBJX1RSQUNFX0ZVTEwJCTQKKworCisKKyNlbmRpZgkJCQkvKiBfX0tFUk5FTENBUElfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tleWJvYXJkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tleWJvYXJkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmMzE2YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2V5Ym9hcmQuaApAQCAtMCwwICsxLDQ0MyBAQAorI2lmbmRlZiBfX0xJTlVYX0tFWUJPQVJEX0gKKyNkZWZpbmUgX19MSU5VWF9LRVlCT0FSRF9ICisKKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNkZWZpbmUgS0dfU0hJRlQJMAorI2RlZmluZSBLR19DVFJMCQkyCisjZGVmaW5lIEtHX0FMVAkJMworI2RlZmluZSBLR19BTFRHUgkxCisjZGVmaW5lIEtHX1NISUZUTAk0CisjZGVmaW5lIEtHX0tBTkFTSElGVAk0CisjZGVmaW5lIEtHX1NISUZUUgk1CisjZGVmaW5lIEtHX0NUUkxMCTYKKyNkZWZpbmUgS0dfQ1RSTFIJNworI2RlZmluZSBLR19DQVBTU0hJRlQJOAorCisjZGVmaW5lIE5SX1NISUZUCTkKKworI2RlZmluZSBOUl9LRVlTCQkyNTYKKyNkZWZpbmUgTUFYX05SX0tFWU1BUFMJMjU2CisvKiBUaGlzIG1lYW5zIDEyOEtiIGlmIGFsbCBrZXltYXBzIGFyZSBhbGxvY2F0ZWQuIE9ubHkgdGhlIHN1cGVydXNlcgorCW1heSBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGtleW1hcHMgYmV5b25kIE1BWF9OUl9PRl9VU0VSX0tFWU1BUFMuICovCisjZGVmaW5lIE1BWF9OUl9PRl9VU0VSX0tFWU1BUFMgMjU2IAkvKiBzaG91bGQgYmUgYXQgbGVhc3QgNyAqLworCisKKyNkZWZpbmUgTUFYX05SX0ZVTkMJMjU2CS8qIG1heCBuciBvZiBzdHJpbmdzIGFzc2lnbmVkIHRvIGtleXMgKi8KKworI2RlZmluZSBLVF9MQVRJTgkwCS8qIHdlIGRlcGVuZCBvbiB0aGlzIGJlaW5nIHplcm8gKi8KKyNkZWZpbmUgS1RfTEVUVEVSCTExCS8qIHN5bWJvbCB0aGF0IGNhbiBiZSBhY3RlZCB1cG9uIGJ5IENhcHNMb2NrICovCisjZGVmaW5lIEtUX0ZOCQkxCisjZGVmaW5lIEtUX1NQRUMJCTIKKyNkZWZpbmUgS1RfUEFECQkzCisjZGVmaW5lIEtUX0RFQUQJCTQKKyNkZWZpbmUgS1RfQ09OUwkJNQorI2RlZmluZSBLVF9DVVIJCTYKKyNkZWZpbmUgS1RfU0hJRlQJNworI2RlZmluZSBLVF9NRVRBCQk4CisjZGVmaW5lIEtUX0FTQ0lJCTkKKyNkZWZpbmUgS1RfTE9DSwkJMTAKKyNkZWZpbmUgS1RfU0xPQ0sJMTIKKyNkZWZpbmUgS1RfREVBRDIJMTMKKyNkZWZpbmUgS1RfQlJMCQkxNAorCisjZGVmaW5lIEsodCx2KQkJKCgodCk8PDgpfCh2KSkKKyNkZWZpbmUgS1RZUCh4KQkJKCh4KSA+PiA4KQorI2RlZmluZSBLVkFMKHgpCQkoKHgpICYgMHhmZikKKworI2RlZmluZSBLX0YxCQlLKEtUX0ZOLDApCisjZGVmaW5lIEtfRjIJCUsoS1RfRk4sMSkKKyNkZWZpbmUgS19GMwkJSyhLVF9GTiwyKQorI2RlZmluZSBLX0Y0CQlLKEtUX0ZOLDMpCisjZGVmaW5lIEtfRjUJCUsoS1RfRk4sNCkKKyNkZWZpbmUgS19GNgkJSyhLVF9GTiw1KQorI2RlZmluZSBLX0Y3CQlLKEtUX0ZOLDYpCisjZGVmaW5lIEtfRjgJCUsoS1RfRk4sNykKKyNkZWZpbmUgS19GOQkJSyhLVF9GTiw4KQorI2RlZmluZSBLX0YxMAkJSyhLVF9GTiw5KQorI2RlZmluZSBLX0YxMQkJSyhLVF9GTiwxMCkKKyNkZWZpbmUgS19GMTIJCUsoS1RfRk4sMTEpCisjZGVmaW5lIEtfRjEzCQlLKEtUX0ZOLDEyKQorI2RlZmluZSBLX0YxNAkJSyhLVF9GTiwxMykKKyNkZWZpbmUgS19GMTUJCUsoS1RfRk4sMTQpCisjZGVmaW5lIEtfRjE2CQlLKEtUX0ZOLDE1KQorI2RlZmluZSBLX0YxNwkJSyhLVF9GTiwxNikKKyNkZWZpbmUgS19GMTgJCUsoS1RfRk4sMTcpCisjZGVmaW5lIEtfRjE5CQlLKEtUX0ZOLDE4KQorI2RlZmluZSBLX0YyMAkJSyhLVF9GTiwxOSkKKyNkZWZpbmUgS19GSU5ECQlLKEtUX0ZOLDIwKQorI2RlZmluZSBLX0lOU0VSVAlLKEtUX0ZOLDIxKQorI2RlZmluZSBLX1JFTU9WRQlLKEtUX0ZOLDIyKQorI2RlZmluZSBLX1NFTEVDVAlLKEtUX0ZOLDIzKQorI2RlZmluZSBLX1BHVVAJCUsoS1RfRk4sMjQpIC8qIFBHVVAgaXMgYSBzeW5vbnltIGZvciBQUklPUiAqLworI2RlZmluZSBLX1BHRE4JCUsoS1RfRk4sMjUpIC8qIFBHRE4gaXMgYSBzeW5vbnltIGZvciBORVhUICovCisjZGVmaW5lIEtfTUFDUk8JIAlLKEtUX0ZOLDI2KQorI2RlZmluZSBLX0hFTFAJCUsoS1RfRk4sMjcpCisjZGVmaW5lIEtfRE8JCUsoS1RfRk4sMjgpCisjZGVmaW5lIEtfUEFVU0UJIAlLKEtUX0ZOLDI5KQorI2RlZmluZSBLX0YyMQkJSyhLVF9GTiwzMCkKKyNkZWZpbmUgS19GMjIJCUsoS1RfRk4sMzEpCisjZGVmaW5lIEtfRjIzCQlLKEtUX0ZOLDMyKQorI2RlZmluZSBLX0YyNAkJSyhLVF9GTiwzMykKKyNkZWZpbmUgS19GMjUJCUsoS1RfRk4sMzQpCisjZGVmaW5lIEtfRjI2CQlLKEtUX0ZOLDM1KQorI2RlZmluZSBLX0YyNwkJSyhLVF9GTiwzNikKKyNkZWZpbmUgS19GMjgJCUsoS1RfRk4sMzcpCisjZGVmaW5lIEtfRjI5CQlLKEtUX0ZOLDM4KQorI2RlZmluZSBLX0YzMAkJSyhLVF9GTiwzOSkKKyNkZWZpbmUgS19GMzEJCUsoS1RfRk4sNDApCisjZGVmaW5lIEtfRjMyCQlLKEtUX0ZOLDQxKQorI2RlZmluZSBLX0YzMwkJSyhLVF9GTiw0MikKKyNkZWZpbmUgS19GMzQJCUsoS1RfRk4sNDMpCisjZGVmaW5lIEtfRjM1CQlLKEtUX0ZOLDQ0KQorI2RlZmluZSBLX0YzNgkJSyhLVF9GTiw0NSkKKyNkZWZpbmUgS19GMzcJCUsoS1RfRk4sNDYpCisjZGVmaW5lIEtfRjM4CQlLKEtUX0ZOLDQ3KQorI2RlZmluZSBLX0YzOQkJSyhLVF9GTiw0OCkKKyNkZWZpbmUgS19GNDAJCUsoS1RfRk4sNDkpCisjZGVmaW5lIEtfRjQxCQlLKEtUX0ZOLDUwKQorI2RlZmluZSBLX0Y0MgkJSyhLVF9GTiw1MSkKKyNkZWZpbmUgS19GNDMJCUsoS1RfRk4sNTIpCisjZGVmaW5lIEtfRjQ0CQlLKEtUX0ZOLDUzKQorI2RlZmluZSBLX0Y0NQkJSyhLVF9GTiw1NCkKKyNkZWZpbmUgS19GNDYJCUsoS1RfRk4sNTUpCisjZGVmaW5lIEtfRjQ3CQlLKEtUX0ZOLDU2KQorI2RlZmluZSBLX0Y0OAkJSyhLVF9GTiw1NykKKyNkZWZpbmUgS19GNDkJCUsoS1RfRk4sNTgpCisjZGVmaW5lIEtfRjUwCQlLKEtUX0ZOLDU5KQorI2RlZmluZSBLX0Y1MQkJSyhLVF9GTiw2MCkKKyNkZWZpbmUgS19GNTIJCUsoS1RfRk4sNjEpCisjZGVmaW5lIEtfRjUzCQlLKEtUX0ZOLDYyKQorI2RlZmluZSBLX0Y1NAkJSyhLVF9GTiw2MykKKyNkZWZpbmUgS19GNTUJCUsoS1RfRk4sNjQpCisjZGVmaW5lIEtfRjU2CQlLKEtUX0ZOLDY1KQorI2RlZmluZSBLX0Y1NwkJSyhLVF9GTiw2NikKKyNkZWZpbmUgS19GNTgJCUsoS1RfRk4sNjcpCisjZGVmaW5lIEtfRjU5CQlLKEtUX0ZOLDY4KQorI2RlZmluZSBLX0Y2MAkJSyhLVF9GTiw2OSkKKyNkZWZpbmUgS19GNjEJCUsoS1RfRk4sNzApCisjZGVmaW5lIEtfRjYyCQlLKEtUX0ZOLDcxKQorI2RlZmluZSBLX0Y2MwkJSyhLVF9GTiw3MikKKyNkZWZpbmUgS19GNjQJCUsoS1RfRk4sNzMpCisjZGVmaW5lIEtfRjY1CQlLKEtUX0ZOLDc0KQorI2RlZmluZSBLX0Y2NgkJSyhLVF9GTiw3NSkKKyNkZWZpbmUgS19GNjcJCUsoS1RfRk4sNzYpCisjZGVmaW5lIEtfRjY4CQlLKEtUX0ZOLDc3KQorI2RlZmluZSBLX0Y2OQkJSyhLVF9GTiw3OCkKKyNkZWZpbmUgS19GNzAJCUsoS1RfRk4sNzkpCisjZGVmaW5lIEtfRjcxCQlLKEtUX0ZOLDgwKQorI2RlZmluZSBLX0Y3MgkJSyhLVF9GTiw4MSkKKyNkZWZpbmUgS19GNzMJCUsoS1RfRk4sODIpCisjZGVmaW5lIEtfRjc0CQlLKEtUX0ZOLDgzKQorI2RlZmluZSBLX0Y3NQkJSyhLVF9GTiw4NCkKKyNkZWZpbmUgS19GNzYJCUsoS1RfRk4sODUpCisjZGVmaW5lIEtfRjc3CQlLKEtUX0ZOLDg2KQorI2RlZmluZSBLX0Y3OAkJSyhLVF9GTiw4NykKKyNkZWZpbmUgS19GNzkJCUsoS1RfRk4sODgpCisjZGVmaW5lIEtfRjgwCQlLKEtUX0ZOLDg5KQorI2RlZmluZSBLX0Y4MQkJSyhLVF9GTiw5MCkKKyNkZWZpbmUgS19GODIJCUsoS1RfRk4sOTEpCisjZGVmaW5lIEtfRjgzCQlLKEtUX0ZOLDkyKQorI2RlZmluZSBLX0Y4NAkJSyhLVF9GTiw5MykKKyNkZWZpbmUgS19GODUJCUsoS1RfRk4sOTQpCisjZGVmaW5lIEtfRjg2CQlLKEtUX0ZOLDk1KQorI2RlZmluZSBLX0Y4NwkJSyhLVF9GTiw5NikKKyNkZWZpbmUgS19GODgJCUsoS1RfRk4sOTcpCisjZGVmaW5lIEtfRjg5CQlLKEtUX0ZOLDk4KQorI2RlZmluZSBLX0Y5MAkJSyhLVF9GTiw5OSkKKyNkZWZpbmUgS19GOTEJCUsoS1RfRk4sMTAwKQorI2RlZmluZSBLX0Y5MgkJSyhLVF9GTiwxMDEpCisjZGVmaW5lIEtfRjkzCQlLKEtUX0ZOLDEwMikKKyNkZWZpbmUgS19GOTQJCUsoS1RfRk4sMTAzKQorI2RlZmluZSBLX0Y5NQkJSyhLVF9GTiwxMDQpCisjZGVmaW5lIEtfRjk2CQlLKEtUX0ZOLDEwNSkKKyNkZWZpbmUgS19GOTcJCUsoS1RfRk4sMTA2KQorI2RlZmluZSBLX0Y5OAkJSyhLVF9GTiwxMDcpCisjZGVmaW5lIEtfRjk5CQlLKEtUX0ZOLDEwOCkKKyNkZWZpbmUgS19GMTAwCQlLKEtUX0ZOLDEwOSkKKyNkZWZpbmUgS19GMTAxCQlLKEtUX0ZOLDExMCkKKyNkZWZpbmUgS19GMTAyCQlLKEtUX0ZOLDExMSkKKyNkZWZpbmUgS19GMTAzCQlLKEtUX0ZOLDExMikKKyNkZWZpbmUgS19GMTA0CQlLKEtUX0ZOLDExMykKKyNkZWZpbmUgS19GMTA1CQlLKEtUX0ZOLDExNCkKKyNkZWZpbmUgS19GMTA2CQlLKEtUX0ZOLDExNSkKKyNkZWZpbmUgS19GMTA3CQlLKEtUX0ZOLDExNikKKyNkZWZpbmUgS19GMTA4CQlLKEtUX0ZOLDExNykKKyNkZWZpbmUgS19GMTA5CQlLKEtUX0ZOLDExOCkKKyNkZWZpbmUgS19GMTEwCQlLKEtUX0ZOLDExOSkKKyNkZWZpbmUgS19GMTExCQlLKEtUX0ZOLDEyMCkKKyNkZWZpbmUgS19GMTEyCQlLKEtUX0ZOLDEyMSkKKyNkZWZpbmUgS19GMTEzCQlLKEtUX0ZOLDEyMikKKyNkZWZpbmUgS19GMTE0CQlLKEtUX0ZOLDEyMykKKyNkZWZpbmUgS19GMTE1CQlLKEtUX0ZOLDEyNCkKKyNkZWZpbmUgS19GMTE2CQlLKEtUX0ZOLDEyNSkKKyNkZWZpbmUgS19GMTE3CQlLKEtUX0ZOLDEyNikKKyNkZWZpbmUgS19GMTE4CQlLKEtUX0ZOLDEyNykKKyNkZWZpbmUgS19GMTE5CQlLKEtUX0ZOLDEyOCkKKyNkZWZpbmUgS19GMTIwCQlLKEtUX0ZOLDEyOSkKKyNkZWZpbmUgS19GMTIxCQlLKEtUX0ZOLDEzMCkKKyNkZWZpbmUgS19GMTIyCQlLKEtUX0ZOLDEzMSkKKyNkZWZpbmUgS19GMTIzCQlLKEtUX0ZOLDEzMikKKyNkZWZpbmUgS19GMTI0CQlLKEtUX0ZOLDEzMykKKyNkZWZpbmUgS19GMTI1CQlLKEtUX0ZOLDEzNCkKKyNkZWZpbmUgS19GMTI2CQlLKEtUX0ZOLDEzNSkKKyNkZWZpbmUgS19GMTI3CQlLKEtUX0ZOLDEzNikKKyNkZWZpbmUgS19GMTI4CQlLKEtUX0ZOLDEzNykKKyNkZWZpbmUgS19GMTI5CQlLKEtUX0ZOLDEzOCkKKyNkZWZpbmUgS19GMTMwCQlLKEtUX0ZOLDEzOSkKKyNkZWZpbmUgS19GMTMxCQlLKEtUX0ZOLDE0MCkKKyNkZWZpbmUgS19GMTMyCQlLKEtUX0ZOLDE0MSkKKyNkZWZpbmUgS19GMTMzCQlLKEtUX0ZOLDE0MikKKyNkZWZpbmUgS19GMTM0CQlLKEtUX0ZOLDE0MykKKyNkZWZpbmUgS19GMTM1CQlLKEtUX0ZOLDE0NCkKKyNkZWZpbmUgS19GMTM2CQlLKEtUX0ZOLDE0NSkKKyNkZWZpbmUgS19GMTM3CQlLKEtUX0ZOLDE0NikKKyNkZWZpbmUgS19GMTM4CQlLKEtUX0ZOLDE0NykKKyNkZWZpbmUgS19GMTM5CQlLKEtUX0ZOLDE0OCkKKyNkZWZpbmUgS19GMTQwCQlLKEtUX0ZOLDE0OSkKKyNkZWZpbmUgS19GMTQxCQlLKEtUX0ZOLDE1MCkKKyNkZWZpbmUgS19GMTQyCQlLKEtUX0ZOLDE1MSkKKyNkZWZpbmUgS19GMTQzCQlLKEtUX0ZOLDE1MikKKyNkZWZpbmUgS19GMTQ0CQlLKEtUX0ZOLDE1MykKKyNkZWZpbmUgS19GMTQ1CQlLKEtUX0ZOLDE1NCkKKyNkZWZpbmUgS19GMTQ2CQlLKEtUX0ZOLDE1NSkKKyNkZWZpbmUgS19GMTQ3CQlLKEtUX0ZOLDE1NikKKyNkZWZpbmUgS19GMTQ4CQlLKEtUX0ZOLDE1NykKKyNkZWZpbmUgS19GMTQ5CQlLKEtUX0ZOLDE1OCkKKyNkZWZpbmUgS19GMTUwCQlLKEtUX0ZOLDE1OSkKKyNkZWZpbmUgS19GMTUxCQlLKEtUX0ZOLDE2MCkKKyNkZWZpbmUgS19GMTUyCQlLKEtUX0ZOLDE2MSkKKyNkZWZpbmUgS19GMTUzCQlLKEtUX0ZOLDE2MikKKyNkZWZpbmUgS19GMTU0CQlLKEtUX0ZOLDE2MykKKyNkZWZpbmUgS19GMTU1CQlLKEtUX0ZOLDE2NCkKKyNkZWZpbmUgS19GMTU2CQlLKEtUX0ZOLDE2NSkKKyNkZWZpbmUgS19GMTU3CQlLKEtUX0ZOLDE2NikKKyNkZWZpbmUgS19GMTU4CQlLKEtUX0ZOLDE2NykKKyNkZWZpbmUgS19GMTU5CQlLKEtUX0ZOLDE2OCkKKyNkZWZpbmUgS19GMTYwCQlLKEtUX0ZOLDE2OSkKKyNkZWZpbmUgS19GMTYxCQlLKEtUX0ZOLDE3MCkKKyNkZWZpbmUgS19GMTYyCQlLKEtUX0ZOLDE3MSkKKyNkZWZpbmUgS19GMTYzCQlLKEtUX0ZOLDE3MikKKyNkZWZpbmUgS19GMTY0CQlLKEtUX0ZOLDE3MykKKyNkZWZpbmUgS19GMTY1CQlLKEtUX0ZOLDE3NCkKKyNkZWZpbmUgS19GMTY2CQlLKEtUX0ZOLDE3NSkKKyNkZWZpbmUgS19GMTY3CQlLKEtUX0ZOLDE3NikKKyNkZWZpbmUgS19GMTY4CQlLKEtUX0ZOLDE3NykKKyNkZWZpbmUgS19GMTY5CQlLKEtUX0ZOLDE3OCkKKyNkZWZpbmUgS19GMTcwCQlLKEtUX0ZOLDE3OSkKKyNkZWZpbmUgS19GMTcxCQlLKEtUX0ZOLDE4MCkKKyNkZWZpbmUgS19GMTcyCQlLKEtUX0ZOLDE4MSkKKyNkZWZpbmUgS19GMTczCQlLKEtUX0ZOLDE4MikKKyNkZWZpbmUgS19GMTc0CQlLKEtUX0ZOLDE4MykKKyNkZWZpbmUgS19GMTc1CQlLKEtUX0ZOLDE4NCkKKyNkZWZpbmUgS19GMTc2CQlLKEtUX0ZOLDE4NSkKKyNkZWZpbmUgS19GMTc3CQlLKEtUX0ZOLDE4NikKKyNkZWZpbmUgS19GMTc4CQlLKEtUX0ZOLDE4NykKKyNkZWZpbmUgS19GMTc5CQlLKEtUX0ZOLDE4OCkKKyNkZWZpbmUgS19GMTgwCQlLKEtUX0ZOLDE4OSkKKyNkZWZpbmUgS19GMTgxCQlLKEtUX0ZOLDE5MCkKKyNkZWZpbmUgS19GMTgyCQlLKEtUX0ZOLDE5MSkKKyNkZWZpbmUgS19GMTgzCQlLKEtUX0ZOLDE5MikKKyNkZWZpbmUgS19GMTg0CQlLKEtUX0ZOLDE5MykKKyNkZWZpbmUgS19GMTg1CQlLKEtUX0ZOLDE5NCkKKyNkZWZpbmUgS19GMTg2CQlLKEtUX0ZOLDE5NSkKKyNkZWZpbmUgS19GMTg3CQlLKEtUX0ZOLDE5NikKKyNkZWZpbmUgS19GMTg4CQlLKEtUX0ZOLDE5NykKKyNkZWZpbmUgS19GMTg5CQlLKEtUX0ZOLDE5OCkKKyNkZWZpbmUgS19GMTkwCQlLKEtUX0ZOLDE5OSkKKyNkZWZpbmUgS19GMTkxCQlLKEtUX0ZOLDIwMCkKKyNkZWZpbmUgS19GMTkyCQlLKEtUX0ZOLDIwMSkKKyNkZWZpbmUgS19GMTkzCQlLKEtUX0ZOLDIwMikKKyNkZWZpbmUgS19GMTk0CQlLKEtUX0ZOLDIwMykKKyNkZWZpbmUgS19GMTk1CQlLKEtUX0ZOLDIwNCkKKyNkZWZpbmUgS19GMTk2CQlLKEtUX0ZOLDIwNSkKKyNkZWZpbmUgS19GMTk3CQlLKEtUX0ZOLDIwNikKKyNkZWZpbmUgS19GMTk4CQlLKEtUX0ZOLDIwNykKKyNkZWZpbmUgS19GMTk5CQlLKEtUX0ZOLDIwOCkKKyNkZWZpbmUgS19GMjAwCQlLKEtUX0ZOLDIwOSkKKyNkZWZpbmUgS19GMjAxCQlLKEtUX0ZOLDIxMCkKKyNkZWZpbmUgS19GMjAyCQlLKEtUX0ZOLDIxMSkKKyNkZWZpbmUgS19GMjAzCQlLKEtUX0ZOLDIxMikKKyNkZWZpbmUgS19GMjA0CQlLKEtUX0ZOLDIxMykKKyNkZWZpbmUgS19GMjA1CQlLKEtUX0ZOLDIxNCkKKyNkZWZpbmUgS19GMjA2CQlLKEtUX0ZOLDIxNSkKKyNkZWZpbmUgS19GMjA3CQlLKEtUX0ZOLDIxNikKKyNkZWZpbmUgS19GMjA4CQlLKEtUX0ZOLDIxNykKKyNkZWZpbmUgS19GMjA5CQlLKEtUX0ZOLDIxOCkKKyNkZWZpbmUgS19GMjEwCQlLKEtUX0ZOLDIxOSkKKyNkZWZpbmUgS19GMjExCQlLKEtUX0ZOLDIyMCkKKyNkZWZpbmUgS19GMjEyCQlLKEtUX0ZOLDIyMSkKKyNkZWZpbmUgS19GMjEzCQlLKEtUX0ZOLDIyMikKKyNkZWZpbmUgS19GMjE0CQlLKEtUX0ZOLDIyMykKKyNkZWZpbmUgS19GMjE1CQlLKEtUX0ZOLDIyNCkKKyNkZWZpbmUgS19GMjE2CQlLKEtUX0ZOLDIyNSkKKyNkZWZpbmUgS19GMjE3CQlLKEtUX0ZOLDIyNikKKyNkZWZpbmUgS19GMjE4CQlLKEtUX0ZOLDIyNykKKyNkZWZpbmUgS19GMjE5CQlLKEtUX0ZOLDIyOCkKKyNkZWZpbmUgS19GMjIwCQlLKEtUX0ZOLDIyOSkKKyNkZWZpbmUgS19GMjIxCQlLKEtUX0ZOLDIzMCkKKyNkZWZpbmUgS19GMjIyCQlLKEtUX0ZOLDIzMSkKKyNkZWZpbmUgS19GMjIzCQlLKEtUX0ZOLDIzMikKKyNkZWZpbmUgS19GMjI0CQlLKEtUX0ZOLDIzMykKKyNkZWZpbmUgS19GMjI1CQlLKEtUX0ZOLDIzNCkKKyNkZWZpbmUgS19GMjI2CQlLKEtUX0ZOLDIzNSkKKyNkZWZpbmUgS19GMjI3CQlLKEtUX0ZOLDIzNikKKyNkZWZpbmUgS19GMjI4CQlLKEtUX0ZOLDIzNykKKyNkZWZpbmUgS19GMjI5CQlLKEtUX0ZOLDIzOCkKKyNkZWZpbmUgS19GMjMwCQlLKEtUX0ZOLDIzOSkKKyNkZWZpbmUgS19GMjMxCQlLKEtUX0ZOLDI0MCkKKyNkZWZpbmUgS19GMjMyCQlLKEtUX0ZOLDI0MSkKKyNkZWZpbmUgS19GMjMzCQlLKEtUX0ZOLDI0MikKKyNkZWZpbmUgS19GMjM0CQlLKEtUX0ZOLDI0MykKKyNkZWZpbmUgS19GMjM1CQlLKEtUX0ZOLDI0NCkKKyNkZWZpbmUgS19GMjM2CQlLKEtUX0ZOLDI0NSkKKyNkZWZpbmUgS19GMjM3CQlLKEtUX0ZOLDI0NikKKyNkZWZpbmUgS19GMjM4CQlLKEtUX0ZOLDI0NykKKyNkZWZpbmUgS19GMjM5CQlLKEtUX0ZOLDI0OCkKKyNkZWZpbmUgS19GMjQwCQlLKEtUX0ZOLDI0OSkKKyNkZWZpbmUgS19GMjQxCQlLKEtUX0ZOLDI1MCkKKyNkZWZpbmUgS19GMjQyCQlLKEtUX0ZOLDI1MSkKKyNkZWZpbmUgS19GMjQzCQlLKEtUX0ZOLDI1MikKKyNkZWZpbmUgS19GMjQ0CQlLKEtUX0ZOLDI1MykKKyNkZWZpbmUgS19GMjQ1CQlLKEtUX0ZOLDI1NCkKKyNkZWZpbmUgS19VTkRPCQlLKEtUX0ZOLDI1NSkKKworCisjZGVmaW5lIEtfSE9MRQkJSyhLVF9TUEVDLDApCisjZGVmaW5lIEtfRU5URVIJCUsoS1RfU1BFQywxKQorI2RlZmluZSBLX1NIX1JFR1MJSyhLVF9TUEVDLDIpCisjZGVmaW5lIEtfU0hfTUVNCUsoS1RfU1BFQywzKQorI2RlZmluZSBLX1NIX1NUQVQJSyhLVF9TUEVDLDQpCisjZGVmaW5lIEtfQlJFQUsJCUsoS1RfU1BFQyw1KQorI2RlZmluZSBLX0NPTlMJCUsoS1RfU1BFQyw2KQorI2RlZmluZSBLX0NBUFMJCUsoS1RfU1BFQyw3KQorI2RlZmluZSBLX05VTQkJSyhLVF9TUEVDLDgpCisjZGVmaW5lIEtfSE9MRAkJSyhLVF9TUEVDLDkpCisjZGVmaW5lIEtfU0NST0xMRk9SVwlLKEtUX1NQRUMsMTApCisjZGVmaW5lIEtfU0NST0xMQkFDSwlLKEtUX1NQRUMsMTEpCisjZGVmaW5lIEtfQk9PVAkJSyhLVF9TUEVDLDEyKQorI2RlZmluZSBLX0NBUFNPTglLKEtUX1NQRUMsMTMpCisjZGVmaW5lIEtfQ09NUE9TRQlLKEtUX1NQRUMsMTQpCisjZGVmaW5lIEtfU0FLCQlLKEtUX1NQRUMsMTUpCisjZGVmaW5lIEtfREVDUkNPTlNPTEUJSyhLVF9TUEVDLDE2KQorI2RlZmluZSBLX0lOQ1JDT05TT0xFCUsoS1RfU1BFQywxNykKKyNkZWZpbmUgS19TUEFXTkNPTlNPTEUJSyhLVF9TUEVDLDE4KQorI2RlZmluZSBLX0JBUkVOVU1MT0NLCUsoS1RfU1BFQywxOSkKKworI2RlZmluZSBLX0FMTE9DQVRFRAlLKEtUX1NQRUMsMTI2KSAvKiBkeW5hbWljYWxseSBhbGxvY2F0ZWQga2V5bWFwICovCisjZGVmaW5lIEtfTk9TVUNITUFQCUsoS1RfU1BFQywxMjcpIC8qIHJldHVybmVkIGJ5IEtER0tCRU5UICovCisKKyNkZWZpbmUgS19QMAkJSyhLVF9QQUQsMCkKKyNkZWZpbmUgS19QMQkJSyhLVF9QQUQsMSkKKyNkZWZpbmUgS19QMgkJSyhLVF9QQUQsMikKKyNkZWZpbmUgS19QMwkJSyhLVF9QQUQsMykKKyNkZWZpbmUgS19QNAkJSyhLVF9QQUQsNCkKKyNkZWZpbmUgS19QNQkJSyhLVF9QQUQsNSkKKyNkZWZpbmUgS19QNgkJSyhLVF9QQUQsNikKKyNkZWZpbmUgS19QNwkJSyhLVF9QQUQsNykKKyNkZWZpbmUgS19QOAkJSyhLVF9QQUQsOCkKKyNkZWZpbmUgS19QOQkJSyhLVF9QQUQsOSkKKyNkZWZpbmUgS19QUExVUwkJSyhLVF9QQUQsMTApCS8qIGtleS1wYWQgcGx1cyAqLworI2RlZmluZSBLX1BNSU5VUwlLKEtUX1BBRCwxMSkJLyoga2V5LXBhZCBtaW51cyAqLworI2RlZmluZSBLX1BTVEFSCQlLKEtUX1BBRCwxMikJLyoga2V5LXBhZCBhc3RlcmlzayAoc3RhcikgKi8KKyNkZWZpbmUgS19QU0xBU0gJSyhLVF9QQUQsMTMpCS8qIGtleS1wYWQgc2xhc2ggKi8KKyNkZWZpbmUgS19QRU5URVIJSyhLVF9QQUQsMTQpCS8qIGtleS1wYWQgZW50ZXIgKi8KKyNkZWZpbmUgS19QQ09NTUEJSyhLVF9QQUQsMTUpCS8qIGtleS1wYWQgY29tbWE6IGtsdWRnZS4uLiAqLworI2RlZmluZSBLX1BET1QJCUsoS1RfUEFELDE2KQkvKiBrZXktcGFkIGRvdCAocGVyaW9kKToga2x1ZGdlLi4uICovCisjZGVmaW5lIEtfUFBMVVNNSU5VUwlLKEtUX1BBRCwxNykJLyoga2V5LXBhZCBwbHVzL21pbnVzICovCisjZGVmaW5lIEtfUFBBUkVOTAlLKEtUX1BBRCwxOCkJLyoga2V5LXBhZCBsZWZ0IHBhcmVudGhlc2lzICovCisjZGVmaW5lIEtfUFBBUkVOUglLKEtUX1BBRCwxOSkJLyoga2V5LXBhZCByaWdodCBwYXJlbnRoZXNpcyAqLworCisjZGVmaW5lIE5SX1BBRAkJMjAKKworI2RlZmluZSBLX0RHUkFWRQlLKEtUX0RFQUQsMCkKKyNkZWZpbmUgS19EQUNVVEUJSyhLVF9ERUFELDEpCisjZGVmaW5lIEtfRENJUkNNCUsoS1RfREVBRCwyKQorI2RlZmluZSBLX0RUSUxERQlLKEtUX0RFQUQsMykKKyNkZWZpbmUgS19ERElFUkUJSyhLVF9ERUFELDQpCisjZGVmaW5lIEtfRENFRElMCUsoS1RfREVBRCw1KQorCisjZGVmaW5lIE5SX0RFQUQJCTYKKworI2RlZmluZSBLX0RPV04JCUsoS1RfQ1VSLDApCisjZGVmaW5lIEtfTEVGVAkJSyhLVF9DVVIsMSkKKyNkZWZpbmUgS19SSUdIVAkJSyhLVF9DVVIsMikKKyNkZWZpbmUgS19VUAkJSyhLVF9DVVIsMykKKworI2RlZmluZSBLX1NISUZUCQlLKEtUX1NISUZULEtHX1NISUZUKQorI2RlZmluZSBLX0NUUkwJCUsoS1RfU0hJRlQsS0dfQ1RSTCkKKyNkZWZpbmUgS19BTFQJCUsoS1RfU0hJRlQsS0dfQUxUKQorI2RlZmluZSBLX0FMVEdSCQlLKEtUX1NISUZULEtHX0FMVEdSKQorI2RlZmluZSBLX1NISUZUTAlLKEtUX1NISUZULEtHX1NISUZUTCkKKyNkZWZpbmUgS19TSElGVFIJSyhLVF9TSElGVCxLR19TSElGVFIpCisjZGVmaW5lIEtfQ1RSTEwJIAlLKEtUX1NISUZULEtHX0NUUkxMKQorI2RlZmluZSBLX0NUUkxSCSAJSyhLVF9TSElGVCxLR19DVFJMUikKKyNkZWZpbmUgS19DQVBTU0hJRlQJSyhLVF9TSElGVCxLR19DQVBTU0hJRlQpCisKKyNkZWZpbmUgS19BU0MwCQlLKEtUX0FTQ0lJLDApCisjZGVmaW5lIEtfQVNDMQkJSyhLVF9BU0NJSSwxKQorI2RlZmluZSBLX0FTQzIJCUsoS1RfQVNDSUksMikKKyNkZWZpbmUgS19BU0MzCQlLKEtUX0FTQ0lJLDMpCisjZGVmaW5lIEtfQVNDNAkJSyhLVF9BU0NJSSw0KQorI2RlZmluZSBLX0FTQzUJCUsoS1RfQVNDSUksNSkKKyNkZWZpbmUgS19BU0M2CQlLKEtUX0FTQ0lJLDYpCisjZGVmaW5lIEtfQVNDNwkJSyhLVF9BU0NJSSw3KQorI2RlZmluZSBLX0FTQzgJCUsoS1RfQVNDSUksOCkKKyNkZWZpbmUgS19BU0M5CQlLKEtUX0FTQ0lJLDkpCisjZGVmaW5lIEtfSEVYMAkJSyhLVF9BU0NJSSwxMCkKKyNkZWZpbmUgS19IRVgxCQlLKEtUX0FTQ0lJLDExKQorI2RlZmluZSBLX0hFWDIJCUsoS1RfQVNDSUksMTIpCisjZGVmaW5lIEtfSEVYMwkJSyhLVF9BU0NJSSwxMykKKyNkZWZpbmUgS19IRVg0CQlLKEtUX0FTQ0lJLDE0KQorI2RlZmluZSBLX0hFWDUJCUsoS1RfQVNDSUksMTUpCisjZGVmaW5lIEtfSEVYNgkJSyhLVF9BU0NJSSwxNikKKyNkZWZpbmUgS19IRVg3CQlLKEtUX0FTQ0lJLDE3KQorI2RlZmluZSBLX0hFWDgJCUsoS1RfQVNDSUksMTgpCisjZGVmaW5lIEtfSEVYOQkJSyhLVF9BU0NJSSwxOSkKKyNkZWZpbmUgS19IRVhhCQlLKEtUX0FTQ0lJLDIwKQorI2RlZmluZSBLX0hFWGIJCUsoS1RfQVNDSUksMjEpCisjZGVmaW5lIEtfSEVYYwkJSyhLVF9BU0NJSSwyMikKKyNkZWZpbmUgS19IRVhkCQlLKEtUX0FTQ0lJLDIzKQorI2RlZmluZSBLX0hFWGUJCUsoS1RfQVNDSUksMjQpCisjZGVmaW5lIEtfSEVYZgkJSyhLVF9BU0NJSSwyNSkKKworI2RlZmluZSBOUl9BU0NJSQkyNgorCisjZGVmaW5lIEtfU0hJRlRMT0NLCUsoS1RfTE9DSyxLR19TSElGVCkKKyNkZWZpbmUgS19DVFJMTE9DSwlLKEtUX0xPQ0ssS0dfQ1RSTCkKKyNkZWZpbmUgS19BTFRMT0NLCUsoS1RfTE9DSyxLR19BTFQpCisjZGVmaW5lIEtfQUxUR1JMT0NLCUsoS1RfTE9DSyxLR19BTFRHUikKKyNkZWZpbmUgS19TSElGVExMT0NLCUsoS1RfTE9DSyxLR19TSElGVEwpCisjZGVmaW5lIEtfU0hJRlRSTE9DSwlLKEtUX0xPQ0ssS0dfU0hJRlRSKQorI2RlZmluZSBLX0NUUkxMTE9DSwlLKEtUX0xPQ0ssS0dfQ1RSTEwpCisjZGVmaW5lIEtfQ1RSTFJMT0NLCUsoS1RfTE9DSyxLR19DVFJMUikKKyNkZWZpbmUgS19DQVBTU0hJRlRMT0NLCUsoS1RfTE9DSyxLR19DQVBTU0hJRlQpCisKKyNkZWZpbmUgS19TSElGVF9TTE9DSwlLKEtUX1NMT0NLLEtHX1NISUZUKQorI2RlZmluZSBLX0NUUkxfU0xPQ0sJSyhLVF9TTE9DSyxLR19DVFJMKQorI2RlZmluZSBLX0FMVF9TTE9DSwlLKEtUX1NMT0NLLEtHX0FMVCkKKyNkZWZpbmUgS19BTFRHUl9TTE9DSwlLKEtUX1NMT0NLLEtHX0FMVEdSKQorI2RlZmluZSBLX1NISUZUTF9TTE9DSwlLKEtUX1NMT0NLLEtHX1NISUZUTCkKKyNkZWZpbmUgS19TSElGVFJfU0xPQ0sJSyhLVF9TTE9DSyxLR19TSElGVFIpCisjZGVmaW5lIEtfQ1RSTExfU0xPQ0sJSyhLVF9TTE9DSyxLR19DVFJMTCkKKyNkZWZpbmUgS19DVFJMUl9TTE9DSwlLKEtUX1NMT0NLLEtHX0NUUkxSKQorI2RlZmluZSBLX0NBUFNTSElGVF9TTE9DSwlLKEtUX1NMT0NLLEtHX0NBUFNTSElGVCkKKworI2RlZmluZSBOUl9MT0NLCQk5CisKKyNkZWZpbmUgS19CUkxfQkxBTksgICAgIEsoS1RfQlJMLCAwKQorI2RlZmluZSBLX0JSTF9ET1QxICAgICAgSyhLVF9CUkwsIDEpCisjZGVmaW5lIEtfQlJMX0RPVDIgICAgICBLKEtUX0JSTCwgMikKKyNkZWZpbmUgS19CUkxfRE9UMyAgICAgIEsoS1RfQlJMLCAzKQorI2RlZmluZSBLX0JSTF9ET1Q0ICAgICAgSyhLVF9CUkwsIDQpCisjZGVmaW5lIEtfQlJMX0RPVDUgICAgICBLKEtUX0JSTCwgNSkKKyNkZWZpbmUgS19CUkxfRE9UNiAgICAgIEsoS1RfQlJMLCA2KQorI2RlZmluZSBLX0JSTF9ET1Q3ICAgICAgSyhLVF9CUkwsIDcpCisjZGVmaW5lIEtfQlJMX0RPVDggICAgICBLKEtUX0JSTCwgOCkKKyNkZWZpbmUgS19CUkxfRE9UOSAgICAgIEsoS1RfQlJMLCA5KQorI2RlZmluZSBLX0JSTF9ET1QxMCAgICAgSyhLVF9CUkwsIDEwKQorCisjZGVmaW5lIE5SX0JSTAkJMTEKKworI2RlZmluZSBNQVhfRElBQ1IJMjU2CisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2V5Y3RsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tleWN0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMGI4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tleWN0bC5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIGtleWN0bC5oOiBrZXljdGwgY29tbWFuZCBJRHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDggUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfS0VZQ1RMX0gKKyNkZWZpbmUgX0xJTlVYX0tFWUNUTF9ICisKKy8qIHNwZWNpYWwgcHJvY2VzcyBrZXlyaW5nIHNob3J0Y3V0IElEcyAqLworI2RlZmluZSBLRVlfU1BFQ19USFJFQURfS0VZUklORwkJLTEJLyogLSBrZXkgSUQgZm9yIHRocmVhZC1zcGVjaWZpYyBrZXlyaW5nICovCisjZGVmaW5lIEtFWV9TUEVDX1BST0NFU1NfS0VZUklORwktMgkvKiAtIGtleSBJRCBmb3IgcHJvY2Vzcy1zcGVjaWZpYyBrZXlyaW5nICovCisjZGVmaW5lIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORwktMwkvKiAtIGtleSBJRCBmb3Igc2Vzc2lvbi1zcGVjaWZpYyBrZXlyaW5nICovCisjZGVmaW5lIEtFWV9TUEVDX1VTRVJfS0VZUklORwkJLTQJLyogLSBrZXkgSUQgZm9yIFVJRC1zcGVjaWZpYyBrZXlyaW5nICovCisjZGVmaW5lIEtFWV9TUEVDX1VTRVJfU0VTU0lPTl9LRVlSSU5HCS01CS8qIC0ga2V5IElEIGZvciBVSUQtc2Vzc2lvbiBrZXlyaW5nICovCisjZGVmaW5lIEtFWV9TUEVDX0dST1VQX0tFWVJJTkcJCS02CS8qIC0ga2V5IElEIGZvciBHSUQtc3BlY2lmaWMga2V5cmluZyAqLworI2RlZmluZSBLRVlfU1BFQ19SRVFLRVlfQVVUSF9LRVkJLTcJLyogLSBrZXkgSUQgZm9yIGFzc3VtZWQgcmVxdWVzdF9rZXkgYXV0aCBrZXkgKi8KKyNkZWZpbmUgS0VZX1NQRUNfUkVRVUVTVE9SX0tFWVJJTkcJLTgJLyogLSBrZXkgSUQgZm9yIHJlcXVlc3Rfa2V5KCkgZGVzdCBrZXlyaW5nICovCisKKy8qIHJlcXVlc3Qta2V5IGRlZmF1bHQga2V5cmluZ3MgKi8KKyNkZWZpbmUgS0VZX1JFUUtFWV9ERUZMX05PX0NIQU5HRQkJLTEKKyNkZWZpbmUgS0VZX1JFUUtFWV9ERUZMX0RFRkFVTFQJCQkwCisjZGVmaW5lIEtFWV9SRVFLRVlfREVGTF9USFJFQURfS0VZUklORwkJMQorI2RlZmluZSBLRVlfUkVRS0VZX0RFRkxfUFJPQ0VTU19LRVlSSU5HCQkyCisjZGVmaW5lIEtFWV9SRVFLRVlfREVGTF9TRVNTSU9OX0tFWVJJTkcJCTMKKyNkZWZpbmUgS0VZX1JFUUtFWV9ERUZMX1VTRVJfS0VZUklORwkJNAorI2RlZmluZSBLRVlfUkVRS0VZX0RFRkxfVVNFUl9TRVNTSU9OX0tFWVJJTkcJNQorI2RlZmluZSBLRVlfUkVRS0VZX0RFRkxfR1JPVVBfS0VZUklORwkJNgorI2RlZmluZSBLRVlfUkVRS0VZX0RFRkxfUkVRVUVTVE9SX0tFWVJJTkcJNworCisvKiBrZXljdGwgY29tbWFuZHMgKi8KKyNkZWZpbmUgS0VZQ1RMX0dFVF9LRVlSSU5HX0lECQkwCS8qIGFzayBmb3IgYSBrZXlyaW5nJ3MgSUQgKi8KKyNkZWZpbmUgS0VZQ1RMX0pPSU5fU0VTU0lPTl9LRVlSSU5HCTEJLyogam9pbiBvciBzdGFydCBuYW1lZCBzZXNzaW9uIGtleXJpbmcgKi8KKyNkZWZpbmUgS0VZQ1RMX1VQREFURQkJCTIJLyogdXBkYXRlIGEga2V5ICovCisjZGVmaW5lIEtFWUNUTF9SRVZPS0UJCQkzCS8qIHJldm9rZSBhIGtleSAqLworI2RlZmluZSBLRVlDVExfQ0hPV04JCQk0CS8qIHNldCBvd25lcnNoaXAgb2YgYSBrZXkgKi8KKyNkZWZpbmUgS0VZQ1RMX1NFVFBFUk0JCQk1CS8qIHNldCBwZXJtcyBvbiBhIGtleSAqLworI2RlZmluZSBLRVlDVExfREVTQ1JJQkUJCQk2CS8qIGRlc2NyaWJlIGEga2V5ICovCisjZGVmaW5lIEtFWUNUTF9DTEVBUgkJCTcJLyogY2xlYXIgY29udGVudHMgb2YgYSBrZXlyaW5nICovCisjZGVmaW5lIEtFWUNUTF9MSU5LCQkJOAkvKiBsaW5rIGEga2V5IGludG8gYSBrZXlyaW5nICovCisjZGVmaW5lIEtFWUNUTF9VTkxJTksJCQk5CS8qIHVubGluayBhIGtleSBmcm9tIGEga2V5cmluZyAqLworI2RlZmluZSBLRVlDVExfU0VBUkNICQkJMTAJLyogc2VhcmNoIGZvciBhIGtleSBpbiBhIGtleXJpbmcgKi8KKyNkZWZpbmUgS0VZQ1RMX1JFQUQJCQkxMQkvKiByZWFkIGEga2V5IG9yIGtleXJpbmcncyBjb250ZW50cyAqLworI2RlZmluZSBLRVlDVExfSU5TVEFOVElBVEUJCTEyCS8qIGluc3RhbnRpYXRlIGEgcGFydGlhbGx5IGNvbnN0cnVjdGVkIGtleSAqLworI2RlZmluZSBLRVlDVExfTkVHQVRFCQkJMTMJLyogbmVnYXRlIGEgcGFydGlhbGx5IGNvbnN0cnVjdGVkIGtleSAqLworI2RlZmluZSBLRVlDVExfU0VUX1JFUUtFWV9LRVlSSU5HCTE0CS8qIHNldCBkZWZhdWx0IHJlcXVlc3Qta2V5IGtleXJpbmcgKi8KKyNkZWZpbmUgS0VZQ1RMX1NFVF9USU1FT1VUCQkxNQkvKiBzZXQga2V5IHRpbWVvdXQgKi8KKyNkZWZpbmUgS0VZQ1RMX0FTU1VNRV9BVVRIT1JJVFkJCTE2CS8qIGFzc3VtZSByZXF1ZXN0X2tleSgpIGF1dGhvcmlzYXRpb24gKi8KKyNkZWZpbmUgS0VZQ1RMX0dFVF9TRUNVUklUWQkJMTcJLyogZ2V0IGtleSBzZWN1cml0eSBsYWJlbCAqLworI2RlZmluZSBLRVlDVExfU0VTU0lPTl9UT19QQVJFTlQJMTgJLyogYXBwbHkgc2Vzc2lvbiBrZXlyaW5nIHRvIHBhcmVudCBwcm9jZXNzICovCisjZGVmaW5lIEtFWUNUTF9SRUpFQ1QJCQkxOQkvKiByZWplY3QgYSBwYXJ0aWFsbHkgY29uc3RydWN0ZWQga2V5ICovCisjZGVmaW5lIEtFWUNUTF9JTlNUQU5USUFURV9JT1YJCTIwCS8qIGluc3RhbnRpYXRlIGEgcGFydGlhbGx5IGNvbnN0cnVjdGVkIGtleSAqLworCisjZW5kaWYgLyogIF9MSU5VWF9LRVlDVExfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9rdm0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva3ZtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM2YWQ5YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva3ZtLmgKQEAgLTAsMCArMSw4MTUgQEAKKyNpZm5kZWYgX19MSU5VWF9LVk1fSAorI2RlZmluZSBfX0xJTlVYX0tWTV9ICisKKy8qCisgKiBVc2Vyc3BhY2UgaW50ZXJmYWNlIGZvciAvZGV2L2t2bSAtIGtlcm5lbCBiYXNlZCB2aXJ0dWFsIG1hY2hpbmUKKyAqCisgKiBOb3RlOiB5b3UgbXVzdCB1cGRhdGUgS1ZNX0FQSV9WRVJTSU9OIGlmIHlvdSBjaGFuZ2UgdGhpcyBpbnRlcmZhY2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGFzbS9rdm0uaD4KKworI2RlZmluZSBLVk1fQVBJX1ZFUlNJT04gMTIKKworLyogKioqIERlcHJlY2F0ZWQgaW50ZXJmYWNlcyAqKiogKi8KKworI2RlZmluZSBLVk1fVFJDX1NISUZUICAgICAgICAgICAxNgorCisjZGVmaW5lIEtWTV9UUkNfRU5UUllFWElUICAgICAgICgxIDw8IEtWTV9UUkNfU0hJRlQpCisjZGVmaW5lIEtWTV9UUkNfSEFORExFUiAgICAgICAgICgxIDw8IChLVk1fVFJDX1NISUZUICsgMSkpCisKKyNkZWZpbmUgS1ZNX1RSQ19WTUVOVFJZICAgICAgICAgKEtWTV9UUkNfRU5UUllFWElUICsgMHgwMSkKKyNkZWZpbmUgS1ZNX1RSQ19WTUVYSVQgICAgICAgICAgKEtWTV9UUkNfRU5UUllFWElUICsgMHgwMikKKyNkZWZpbmUgS1ZNX1RSQ19QQUdFX0ZBVUxUICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MDEpCisKKyNkZWZpbmUgS1ZNX1RSQ19IRUFEX1NJWkUgICAgICAgMTIKKyNkZWZpbmUgS1ZNX1RSQ19DWUNMRV9TSVpFICAgICAgOAorI2RlZmluZSBLVk1fVFJDX0VYVFJBX01BWCAgICAgICA3CisKKyNkZWZpbmUgS1ZNX1RSQ19JTkpfVklSUSAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDAyKQorI2RlZmluZSBLVk1fVFJDX1JFREVMSVZFUl9FVlQgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MDMpCisjZGVmaW5lIEtWTV9UUkNfUEVORF9JTlRSICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgwNCkKKyNkZWZpbmUgS1ZNX1RSQ19JT19SRUFEICAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDA1KQorI2RlZmluZSBLVk1fVFJDX0lPX1dSSVRFICAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MDYpCisjZGVmaW5lIEtWTV9UUkNfQ1JfUkVBRCAgICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgwNykKKyNkZWZpbmUgS1ZNX1RSQ19DUl9XUklURSAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDA4KQorI2RlZmluZSBLVk1fVFJDX0RSX1JFQUQgICAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MDkpCisjZGVmaW5lIEtWTV9UUkNfRFJfV1JJVEUgICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgwQSkKKyNkZWZpbmUgS1ZNX1RSQ19NU1JfUkVBRCAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDBCKQorI2RlZmluZSBLVk1fVFJDX01TUl9XUklURSAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MEMpCisjZGVmaW5lIEtWTV9UUkNfQ1BVSUQgICAgICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgwRCkKKyNkZWZpbmUgS1ZNX1RSQ19JTlRSICAgICAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDBFKQorI2RlZmluZSBLVk1fVFJDX05NSSAgICAgICAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MEYpCisjZGVmaW5lIEtWTV9UUkNfVk1NQ0FMTCAgICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgxMCkKKyNkZWZpbmUgS1ZNX1RSQ19ITFQgICAgICAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDExKQorI2RlZmluZSBLVk1fVFJDX0NMVFMgICAgICAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MTIpCisjZGVmaW5lIEtWTV9UUkNfTE1TVyAgICAgICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgxMykKKyNkZWZpbmUgS1ZNX1RSQ19BUElDX0FDQ0VTUyAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDE0KQorI2RlZmluZSBLVk1fVFJDX1REUF9GQVVMVCAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MTUpCisjZGVmaW5lIEtWTV9UUkNfR1RMQl9XUklURSAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgxNikKKyNkZWZpbmUgS1ZNX1RSQ19TVExCX1dSSVRFICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDE3KQorI2RlZmluZSBLVk1fVFJDX1NUTEJfSU5WQUwgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MTgpCisjZGVmaW5lIEtWTV9UUkNfUFBDX0lOU1RSICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgxOSkKKworc3RydWN0IGt2bV91c2VyX3RyYWNlX3NldHVwIHsKKwlfX3UzMiBidWZfc2l6ZTsKKwlfX3UzMiBidWZfbnI7Cit9OworCisjZGVmaW5lIF9fS1ZNX0RFUFJFQ0FURURfTUFJTl9XXzB4MDYgXAorCV9JT1coS1ZNSU8sIDB4MDYsIHN0cnVjdCBrdm1fdXNlcl90cmFjZV9zZXR1cCkKKyNkZWZpbmUgX19LVk1fREVQUkVDQVRFRF9NQUlOXzB4MDcgX0lPKEtWTUlPLCAweDA3KQorI2RlZmluZSBfX0tWTV9ERVBSRUNBVEVEX01BSU5fMHgwOCBfSU8oS1ZNSU8sIDB4MDgpCisKKyNkZWZpbmUgX19LVk1fREVQUkVDQVRFRF9WTV9SXzB4NzAgX0lPUihLVk1JTywgMHg3MCwgc3RydWN0IGt2bV9hc3NpZ25lZF9pcnEpCisKK3N0cnVjdCBrdm1fYnJlYWtwb2ludCB7CisJX191MzIgZW5hYmxlZDsKKwlfX3UzMiBwYWRkaW5nOworCV9fdTY0IGFkZHJlc3M7Cit9OworCitzdHJ1Y3Qga3ZtX2RlYnVnX2d1ZXN0IHsKKwlfX3UzMiBlbmFibGVkOworCV9fdTMyIHBhZDsKKwlzdHJ1Y3Qga3ZtX2JyZWFrcG9pbnQgYnJlYWtwb2ludHNbNF07CisJX191MzIgc2luZ2xlc3RlcDsKK307CisKKyNkZWZpbmUgX19LVk1fREVQUkVDQVRFRF9WQ1BVX1dfMHg4NyBfSU9XKEtWTUlPLCAweDg3LCBzdHJ1Y3Qga3ZtX2RlYnVnX2d1ZXN0KQorCisvKiAqKiogRW5kIG9mIGRlcHJlY2F0ZWQgaW50ZXJmYWNlcyAqKiogKi8KKworCisvKiBmb3IgS1ZNX0NSRUFURV9NRU1PUllfUkVHSU9OICovCitzdHJ1Y3Qga3ZtX21lbW9yeV9yZWdpb24geworCV9fdTMyIHNsb3Q7CisJX191MzIgZmxhZ3M7CisJX191NjQgZ3Vlc3RfcGh5c19hZGRyOworCV9fdTY0IG1lbW9yeV9zaXplOyAvKiBieXRlcyAqLworfTsKKworLyogZm9yIEtWTV9TRVRfVVNFUl9NRU1PUllfUkVHSU9OICovCitzdHJ1Y3Qga3ZtX3VzZXJzcGFjZV9tZW1vcnlfcmVnaW9uIHsKKwlfX3UzMiBzbG90OworCV9fdTMyIGZsYWdzOworCV9fdTY0IGd1ZXN0X3BoeXNfYWRkcjsKKwlfX3U2NCBtZW1vcnlfc2l6ZTsgLyogYnl0ZXMgKi8KKwlfX3U2NCB1c2Vyc3BhY2VfYWRkcjsgLyogc3RhcnQgb2YgdGhlIHVzZXJzcGFjZSBhbGxvY2F0ZWQgbWVtb3J5ICovCit9OworCisvKiBmb3Iga3ZtX21lbW9yeV9yZWdpb246OmZsYWdzICovCisjZGVmaW5lIEtWTV9NRU1fTE9HX0RJUlRZX1BBR0VTICAxVUwKKyNkZWZpbmUgS1ZNX01FTVNMT1RfSU5WQUxJRCAgICAgICgxVUwgPDwgMSkKKworLyogZm9yIEtWTV9JUlFfTElORSAqLworc3RydWN0IGt2bV9pcnFfbGV2ZWwgeworCS8qCisJICogQUNQSSBnc2kgbm90aW9uIG9mIGlycS4KKwkgKiBGb3IgSUEtNjQgKEFQSUMgbW9kZWwpIElPQVBJQzA6IGlycSAwLTIzOyBJT0FQSUMxOiBpcnEgMjQtNDcuLgorCSAqIEZvciBYODYgKHN0YW5kYXJkIEFUIG1vZGUpIFBJQzAvMTogaXJxIDAtMTUuIElPQVBJQzA6IDAtMjMuLgorCSAqLworCXVuaW9uIHsKKwkJX191MzIgaXJxOworCQlfX3MzMiBzdGF0dXM7CisJfTsKKwlfX3UzMiBsZXZlbDsKK307CisKKworc3RydWN0IGt2bV9pcnFjaGlwIHsKKwlfX3UzMiBjaGlwX2lkOworCV9fdTMyIHBhZDsKKyAgICAgICAgdW5pb24geworCQljaGFyIGR1bW15WzUxMl07ICAvKiByZXNlcnZpbmcgc3BhY2UgKi8KKyNpZmRlZiBfX0tWTV9IQVZFX1BJVAorCQlzdHJ1Y3Qga3ZtX3BpY19zdGF0ZSBwaWM7CisjZW5kaWYKKyNpZmRlZiBfX0tWTV9IQVZFX0lPQVBJQworCQlzdHJ1Y3Qga3ZtX2lvYXBpY19zdGF0ZSBpb2FwaWM7CisjZW5kaWYKKwl9IGNoaXA7Cit9OworCisvKiBmb3IgS1ZNX0NSRUFURV9QSVQyICovCitzdHJ1Y3Qga3ZtX3BpdF9jb25maWcgeworCV9fdTMyIGZsYWdzOworCV9fdTMyIHBhZFsxNV07Cit9OworCisjZGVmaW5lIEtWTV9QSVRfU1BFQUtFUl9EVU1NWSAgICAgMQorCisjZGVmaW5lIEtWTV9FWElUX1VOS05PV04gICAgICAgICAgMAorI2RlZmluZSBLVk1fRVhJVF9FWENFUFRJT04gICAgICAgIDEKKyNkZWZpbmUgS1ZNX0VYSVRfSU8gICAgICAgICAgICAgICAyCisjZGVmaW5lIEtWTV9FWElUX0hZUEVSQ0FMTCAgICAgICAgMworI2RlZmluZSBLVk1fRVhJVF9ERUJVRyAgICAgICAgICAgIDQKKyNkZWZpbmUgS1ZNX0VYSVRfSExUICAgICAgICAgICAgICA1CisjZGVmaW5lIEtWTV9FWElUX01NSU8gICAgICAgICAgICAgNgorI2RlZmluZSBLVk1fRVhJVF9JUlFfV0lORE9XX09QRU4gIDcKKyNkZWZpbmUgS1ZNX0VYSVRfU0hVVERPV04gICAgICAgICA4CisjZGVmaW5lIEtWTV9FWElUX0ZBSUxfRU5UUlkgICAgICAgOQorI2RlZmluZSBLVk1fRVhJVF9JTlRSICAgICAgICAgICAgIDEwCisjZGVmaW5lIEtWTV9FWElUX1NFVF9UUFIgICAgICAgICAgMTEKKyNkZWZpbmUgS1ZNX0VYSVRfVFBSX0FDQ0VTUyAgICAgICAxMgorI2RlZmluZSBLVk1fRVhJVF9TMzkwX1NJRUlDICAgICAgIDEzCisjZGVmaW5lIEtWTV9FWElUX1MzOTBfUkVTRVQgICAgICAgMTQKKyNkZWZpbmUgS1ZNX0VYSVRfRENSICAgICAgICAgICAgICAxNQorI2RlZmluZSBLVk1fRVhJVF9OTUkgICAgICAgICAgICAgIDE2CisjZGVmaW5lIEtWTV9FWElUX0lOVEVSTkFMX0VSUk9SICAgMTcKKyNkZWZpbmUgS1ZNX0VYSVRfT1NJICAgICAgICAgICAgICAxOAorI2RlZmluZSBLVk1fRVhJVF9QQVBSX0hDQUxMCSAgMTkKKworLyogRm9yIEtWTV9FWElUX0lOVEVSTkFMX0VSUk9SICovCisjZGVmaW5lIEtWTV9JTlRFUk5BTF9FUlJPUl9FTVVMQVRJT04gMQorI2RlZmluZSBLVk1fSU5URVJOQUxfRVJST1JfU0lNVUxfRVggMgorCisvKiBmb3IgS1ZNX1JVTiwgcmV0dXJuZWQgYnkgbW1hcCh2Y3B1X2ZkLCBvZmZzZXQ9MCkgKi8KK3N0cnVjdCBrdm1fcnVuIHsKKwkvKiBpbiAqLworCV9fdTggcmVxdWVzdF9pbnRlcnJ1cHRfd2luZG93OworCV9fdTggcGFkZGluZzFbN107CisKKwkvKiBvdXQgKi8KKwlfX3UzMiBleGl0X3JlYXNvbjsKKwlfX3U4IHJlYWR5X2Zvcl9pbnRlcnJ1cHRfaW5qZWN0aW9uOworCV9fdTggaWZfZmxhZzsKKwlfX3U4IHBhZGRpbmcyWzJdOworCisJLyogaW4gKHByZV9rdm1fcnVuKSwgb3V0IChwb3N0X2t2bV9ydW4pICovCisJX191NjQgY3I4OworCV9fdTY0IGFwaWNfYmFzZTsKKworI2lmZGVmIF9fS1ZNX1MzOTAKKwkvKiB0aGUgcHJvY2Vzc29yIHN0YXR1cyB3b3JkIGZvciBzMzkwICovCisJX191NjQgcHN3X21hc2s7IC8qIHBzdyB1cHBlciBoYWxmICovCisJX191NjQgcHN3X2FkZHI7IC8qIHBzdyBsb3dlciBoYWxmICovCisjZW5kaWYKKwl1bmlvbiB7CisJCS8qIEtWTV9FWElUX1VOS05PV04gKi8KKwkJc3RydWN0IHsKKwkJCV9fdTY0IGhhcmR3YXJlX2V4aXRfcmVhc29uOworCQl9IGh3OworCQkvKiBLVk1fRVhJVF9GQUlMX0VOVFJZICovCisJCXN0cnVjdCB7CisJCQlfX3U2NCBoYXJkd2FyZV9lbnRyeV9mYWlsdXJlX3JlYXNvbjsKKwkJfSBmYWlsX2VudHJ5OworCQkvKiBLVk1fRVhJVF9FWENFUFRJT04gKi8KKwkJc3RydWN0IHsKKwkJCV9fdTMyIGV4Y2VwdGlvbjsKKwkJCV9fdTMyIGVycm9yX2NvZGU7CisJCX0gZXg7CisJCS8qIEtWTV9FWElUX0lPICovCisJCXN0cnVjdCB7CisjZGVmaW5lIEtWTV9FWElUX0lPX0lOICAwCisjZGVmaW5lIEtWTV9FWElUX0lPX09VVCAxCisJCQlfX3U4IGRpcmVjdGlvbjsKKwkJCV9fdTggc2l6ZTsgLyogYnl0ZXMgKi8KKwkJCV9fdTE2IHBvcnQ7CisJCQlfX3UzMiBjb3VudDsKKwkJCV9fdTY0IGRhdGFfb2Zmc2V0OyAvKiByZWxhdGl2ZSB0byBrdm1fcnVuIHN0YXJ0ICovCisJCX0gaW87CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3Qga3ZtX2RlYnVnX2V4aXRfYXJjaCBhcmNoOworCQl9IGRlYnVnOworCQkvKiBLVk1fRVhJVF9NTUlPICovCisJCXN0cnVjdCB7CisJCQlfX3U2NCBwaHlzX2FkZHI7CisJCQlfX3U4ICBkYXRhWzhdOworCQkJX191MzIgbGVuOworCQkJX191OCAgaXNfd3JpdGU7CisJCX0gbW1pbzsKKwkJLyogS1ZNX0VYSVRfSFlQRVJDQUxMICovCisJCXN0cnVjdCB7CisJCQlfX3U2NCBucjsKKwkJCV9fdTY0IGFyZ3NbNl07CisJCQlfX3U2NCByZXQ7CisJCQlfX3UzMiBsb25nbW9kZTsKKwkJCV9fdTMyIHBhZDsKKwkJfSBoeXBlcmNhbGw7CisJCS8qIEtWTV9FWElUX1RQUl9BQ0NFU1MgKi8KKwkJc3RydWN0IHsKKwkJCV9fdTY0IHJpcDsKKwkJCV9fdTMyIGlzX3dyaXRlOworCQkJX191MzIgcGFkOworCQl9IHRwcl9hY2Nlc3M7CisJCS8qIEtWTV9FWElUX1MzOTBfU0lFSUMgKi8KKwkJc3RydWN0IHsKKwkJCV9fdTggaWNwdGNvZGU7CisJCQlfX3UxNiBpcGE7CisJCQlfX3UzMiBpcGI7CisJCX0gczM5MF9zaWVpYzsKKwkJLyogS1ZNX0VYSVRfUzM5MF9SRVNFVCAqLworI2RlZmluZSBLVk1fUzM5MF9SRVNFVF9QT1IgICAgICAgMQorI2RlZmluZSBLVk1fUzM5MF9SRVNFVF9DTEVBUiAgICAgMgorI2RlZmluZSBLVk1fUzM5MF9SRVNFVF9TVUJTWVNURU0gNAorI2RlZmluZSBLVk1fUzM5MF9SRVNFVF9DUFVfSU5JVCAgOAorI2RlZmluZSBLVk1fUzM5MF9SRVNFVF9JUEwgICAgICAgMTYKKwkJX191NjQgczM5MF9yZXNldF9mbGFnczsKKwkJLyogS1ZNX0VYSVRfRENSICovCisJCXN0cnVjdCB7CisJCQlfX3UzMiBkY3JuOworCQkJX191MzIgZGF0YTsKKwkJCV9fdTggIGlzX3dyaXRlOworCQl9IGRjcjsKKwkJc3RydWN0IHsKKwkJCV9fdTMyIHN1YmVycm9yOworCQkJLyogQXZhaWxhYmxlIHdpdGggS1ZNX0NBUF9JTlRFUk5BTF9FUlJPUl9EQVRBOiAqLworCQkJX191MzIgbmRhdGE7CisJCQlfX3U2NCBkYXRhWzE2XTsKKwkJfSBpbnRlcm5hbDsKKwkJLyogS1ZNX0VYSVRfT1NJICovCisJCXN0cnVjdCB7CisJCQlfX3U2NCBncHJzWzMyXTsKKwkJfSBvc2k7CisJCXN0cnVjdCB7CisJCQlfX3U2NCBucjsKKwkJCV9fdTY0IHJldDsKKwkJCV9fdTY0IGFyZ3NbOV07CisJCX0gcGFwcl9oY2FsbDsKKwkJLyogRml4IHRoZSBzaXplIG9mIHRoZSB1bmlvbi4gKi8KKwkJY2hhciBwYWRkaW5nWzI1Nl07CisJfTsKK307CisKKy8qIGZvciBLVk1fUkVHSVNURVJfQ09BTEVTQ0VEX01NSU8gLyBLVk1fVU5SRUdJU1RFUl9DT0FMRVNDRURfTU1JTyAqLworCitzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvX3pvbmUgeworCV9fdTY0IGFkZHI7CisJX191MzIgc2l6ZTsKKwlfX3UzMiBwYWQ7Cit9OworCitzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvIHsKKwlfX3U2NCBwaHlzX2FkZHI7CisJX191MzIgbGVuOworCV9fdTMyIHBhZDsKKwlfX3U4ICBkYXRhWzhdOworfTsKKworc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pb19yaW5nIHsKKwlfX3UzMiBmaXJzdCwgbGFzdDsKKwlzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvIGNvYWxlc2NlZF9tbWlvWzBdOworfTsKKworI2RlZmluZSBLVk1fQ09BTEVTQ0VEX01NSU9fTUFYIFwKKwkoKFBBR0VfU0laRSAtIHNpemVvZihzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvX3JpbmcpKSAvIFwKKwkgc2l6ZW9mKHN0cnVjdCBrdm1fY29hbGVzY2VkX21taW8pKQorCisvKiBmb3IgS1ZNX1RSQU5TTEFURSAqLworc3RydWN0IGt2bV90cmFuc2xhdGlvbiB7CisJLyogaW4gKi8KKwlfX3U2NCBsaW5lYXJfYWRkcmVzczsKKworCS8qIG91dCAqLworCV9fdTY0IHBoeXNpY2FsX2FkZHJlc3M7CisJX191OCAgdmFsaWQ7CisJX191OCAgd3JpdGVhYmxlOworCV9fdTggIHVzZXJtb2RlOworCV9fdTggIHBhZFs1XTsKK307CisKKy8qIGZvciBLVk1fSU5URVJSVVBUICovCitzdHJ1Y3Qga3ZtX2ludGVycnVwdCB7CisJLyogaW4gKi8KKwlfX3UzMiBpcnE7Cit9OworCisvKiBmb3IgS1ZNX0dFVF9ESVJUWV9MT0cgKi8KK3N0cnVjdCBrdm1fZGlydHlfbG9nIHsKKwlfX3UzMiBzbG90OworCV9fdTMyIHBhZGRpbmcxOworCXVuaW9uIHsKKwkJdm9pZCAqZGlydHlfYml0bWFwOyAvKiBvbmUgYml0IHBlciBwYWdlICovCisJCV9fdTY0IHBhZGRpbmcyOworCX07Cit9OworCisvKiBmb3IgS1ZNX1NFVF9TSUdOQUxfTUFTSyAqLworc3RydWN0IGt2bV9zaWduYWxfbWFzayB7CisJX191MzIgbGVuOworCV9fdTggIHNpZ3NldFswXTsKK307CisKKy8qIGZvciBLVk1fVFBSX0FDQ0VTU19SRVBPUlRJTkcgKi8KK3N0cnVjdCBrdm1fdHByX2FjY2Vzc19jdGwgeworCV9fdTMyIGVuYWJsZWQ7CisJX191MzIgZmxhZ3M7CisJX191MzIgcmVzZXJ2ZWRbOF07Cit9OworCisvKiBmb3IgS1ZNX1NFVF9WQVBJQ19BRERSICovCitzdHJ1Y3Qga3ZtX3ZhcGljX2FkZHIgeworCV9fdTY0IHZhcGljX2FkZHI7Cit9OworCisvKiBmb3IgS1ZNX1NFVF9NUFNUQVRFICovCisKKyNkZWZpbmUgS1ZNX01QX1NUQVRFX1JVTk5BQkxFICAgICAgICAgIDAKKyNkZWZpbmUgS1ZNX01QX1NUQVRFX1VOSU5JVElBTElaRUQgICAgIDEKKyNkZWZpbmUgS1ZNX01QX1NUQVRFX0lOSVRfUkVDRUlWRUQgICAgIDIKKyNkZWZpbmUgS1ZNX01QX1NUQVRFX0hBTFRFRCAgICAgICAgICAgIDMKKyNkZWZpbmUgS1ZNX01QX1NUQVRFX1NJUElfUkVDRUlWRUQgICAgIDQKKworc3RydWN0IGt2bV9tcF9zdGF0ZSB7CisJX191MzIgbXBfc3RhdGU7Cit9OworCitzdHJ1Y3Qga3ZtX3MzOTBfcHN3IHsKKwlfX3U2NCBtYXNrOworCV9fdTY0IGFkZHI7Cit9OworCisvKiB2YWxpZCB2YWx1ZXMgZm9yIHR5cGUgaW4ga3ZtX3MzOTBfaW50ZXJydXB0ICovCisjZGVmaW5lIEtWTV9TMzkwX1NJR1BfU1RPUAkJMHhmZmZlMDAwMHUKKyNkZWZpbmUgS1ZNX1MzOTBfUFJPR1JBTV9JTlQJCTB4ZmZmZTAwMDF1CisjZGVmaW5lIEtWTV9TMzkwX1NJR1BfU0VUX1BSRUZJWAkweGZmZmUwMDAydQorI2RlZmluZSBLVk1fUzM5MF9SRVNUQVJUCQkweGZmZmUwMDAzdQorI2RlZmluZSBLVk1fUzM5MF9JTlRfVklSVElPCQkweGZmZmYyNjAzdQorI2RlZmluZSBLVk1fUzM5MF9JTlRfU0VSVklDRQkJMHhmZmZmMjQwMXUKKyNkZWZpbmUgS1ZNX1MzOTBfSU5UX0VNRVJHRU5DWQkJMHhmZmZmMTIwMXUKKyNkZWZpbmUgS1ZNX1MzOTBfSU5UX0VYVEVSTkFMX0NBTEwJMHhmZmZmMTIwMnUKKworc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdCB7CisJX191MzIgdHlwZTsKKwlfX3UzMiBwYXJtOworCV9fdTY0IHBhcm02NDsKK307CisKKy8qIGZvciBLVk1fU0VUX0dVRVNUX0RFQlVHICovCisKKyNkZWZpbmUgS1ZNX0dVRVNUREJHX0VOQUJMRQkJMHgwMDAwMDAwMQorI2RlZmluZSBLVk1fR1VFU1REQkdfU0lOR0xFU1RFUAkJMHgwMDAwMDAwMgorCitzdHJ1Y3Qga3ZtX2d1ZXN0X2RlYnVnIHsKKwlfX3UzMiBjb250cm9sOworCV9fdTMyIHBhZDsKKwlzdHJ1Y3Qga3ZtX2d1ZXN0X2RlYnVnX2FyY2ggYXJjaDsKK307CisKK2VudW0geworCWt2bV9pb2V2ZW50ZmRfZmxhZ19ucl9kYXRhbWF0Y2gsCisJa3ZtX2lvZXZlbnRmZF9mbGFnX25yX3BpbywKKwlrdm1faW9ldmVudGZkX2ZsYWdfbnJfZGVhc3NpZ24sCisJa3ZtX2lvZXZlbnRmZF9mbGFnX25yX21heCwKK307CisKKyNkZWZpbmUgS1ZNX0lPRVZFTlRGRF9GTEFHX0RBVEFNQVRDSCAoMSA8PCBrdm1faW9ldmVudGZkX2ZsYWdfbnJfZGF0YW1hdGNoKQorI2RlZmluZSBLVk1fSU9FVkVOVEZEX0ZMQUdfUElPICAgICAgICgxIDw8IGt2bV9pb2V2ZW50ZmRfZmxhZ19ucl9waW8pCisjZGVmaW5lIEtWTV9JT0VWRU5URkRfRkxBR19ERUFTU0lHTiAgKDEgPDwga3ZtX2lvZXZlbnRmZF9mbGFnX25yX2RlYXNzaWduKQorCisjZGVmaW5lIEtWTV9JT0VWRU5URkRfVkFMSURfRkxBR19NQVNLICAoKDEgPDwga3ZtX2lvZXZlbnRmZF9mbGFnX25yX21heCkgLSAxKQorCitzdHJ1Y3Qga3ZtX2lvZXZlbnRmZCB7CisJX191NjQgZGF0YW1hdGNoOworCV9fdTY0IGFkZHI7ICAgICAgICAvKiBsZWdhbCBwaW8vbW1pbyBhZGRyZXNzICovCisJX191MzIgbGVuOyAgICAgICAgIC8qIDEsIDIsIDQsIG9yIDggYnl0ZXMgICAgKi8KKwlfX3MzMiBmZDsKKwlfX3UzMiBmbGFnczsKKwlfX3U4ICBwYWRbMzZdOworfTsKKworLyogZm9yIEtWTV9FTkFCTEVfQ0FQICovCitzdHJ1Y3Qga3ZtX2VuYWJsZV9jYXAgeworCS8qIGluICovCisJX191MzIgY2FwOworCV9fdTMyIGZsYWdzOworCV9fdTY0IGFyZ3NbNF07CisJX191OCAgcGFkWzY0XTsKK307CisKKy8qIGZvciBLVk1fUFBDX0dFVF9QVklORk8gKi8KK3N0cnVjdCBrdm1fcHBjX3B2aW5mbyB7CisJLyogb3V0ICovCisJX191MzIgZmxhZ3M7CisJX191MzIgaGNhbGxbNF07CisJX191OCAgcGFkWzEwOF07Cit9OworCisjZGVmaW5lIEtWTUlPIDB4QUUKKworLyoKKyAqIGlvY3RscyBmb3IgL2Rldi9rdm0gZmRzOgorICovCisjZGVmaW5lIEtWTV9HRVRfQVBJX1ZFUlNJT04gICAgICAgX0lPKEtWTUlPLCAgIDB4MDApCisjZGVmaW5lIEtWTV9DUkVBVEVfVk0gICAgICAgICAgICAgX0lPKEtWTUlPLCAgIDB4MDEpIC8qIHJldHVybnMgYSBWTSBmZCAqLworI2RlZmluZSBLVk1fR0VUX01TUl9JTkRFWF9MSVNUICAgIF9JT1dSKEtWTUlPLCAweDAyLCBzdHJ1Y3Qga3ZtX21zcl9saXN0KQorCisjZGVmaW5lIEtWTV9TMzkwX0VOQUJMRV9TSUUgICAgICAgX0lPKEtWTUlPLCAgIDB4MDYpCisvKgorICogQ2hlY2sgaWYgYSBrdm0gZXh0ZW5zaW9uIGlzIGF2YWlsYWJsZS4gIEFyZ3VtZW50IGlzIGV4dGVuc2lvbiBudW1iZXIsCisgKiByZXR1cm4gaXMgMSAoeWVzKSBvciAwIChubywgc29ycnkpLgorICovCisjZGVmaW5lIEtWTV9DSEVDS19FWFRFTlNJT04gICAgICAgX0lPKEtWTUlPLCAgIDB4MDMpCisvKgorICogR2V0IHNpemUgZm9yIG1tYXAodmNwdV9mZCkKKyAqLworI2RlZmluZSBLVk1fR0VUX1ZDUFVfTU1BUF9TSVpFICAgIF9JTyhLVk1JTywgICAweDA0KSAvKiBpbiBieXRlcyAqLworI2RlZmluZSBLVk1fR0VUX1NVUFBPUlRFRF9DUFVJRCAgIF9JT1dSKEtWTUlPLCAweDA1LCBzdHJ1Y3Qga3ZtX2NwdWlkMikKKyNkZWZpbmUgS1ZNX1RSQUNFX0VOQUJMRSAgICAgICAgICBfX0tWTV9ERVBSRUNBVEVEX01BSU5fV18weDA2CisjZGVmaW5lIEtWTV9UUkFDRV9QQVVTRSAgICAgICAgICAgX19LVk1fREVQUkVDQVRFRF9NQUlOXzB4MDcKKyNkZWZpbmUgS1ZNX1RSQUNFX0RJU0FCTEUgICAgICAgICBfX0tWTV9ERVBSRUNBVEVEX01BSU5fMHgwOAorCisvKgorICogRXh0ZW5zaW9uIGNhcGFiaWxpdHkgbGlzdC4KKyAqLworI2RlZmluZSBLVk1fQ0FQX0lSUUNISVAJICAwCisjZGVmaW5lIEtWTV9DQVBfSExUCSAgMQorI2RlZmluZSBLVk1fQ0FQX01NVV9TSEFET1dfQ0FDSEVfQ09OVFJPTCAyCisjZGVmaW5lIEtWTV9DQVBfVVNFUl9NRU1PUlkgMworI2RlZmluZSBLVk1fQ0FQX1NFVF9UU1NfQUREUiA0CisjZGVmaW5lIEtWTV9DQVBfVkFQSUMgNgorI2RlZmluZSBLVk1fQ0FQX0VYVF9DUFVJRCA3CisjZGVmaW5lIEtWTV9DQVBfQ0xPQ0tTT1VSQ0UgOAorI2RlZmluZSBLVk1fQ0FQX05SX1ZDUFVTIDkgICAgICAgLyogcmV0dXJucyByZWNvbW1lbmRlZCBtYXggdmNwdXMgcGVyIHZtICovCisjZGVmaW5lIEtWTV9DQVBfTlJfTUVNU0xPVFMgMTAgICAvKiByZXR1cm5zIG1heCBtZW1vcnkgc2xvdHMgcGVyIHZtICovCisjZGVmaW5lIEtWTV9DQVBfUElUIDExCisjZGVmaW5lIEtWTV9DQVBfTk9QX0lPX0RFTEFZIDEyCisjZGVmaW5lIEtWTV9DQVBfUFZfTU1VIDEzCisjZGVmaW5lIEtWTV9DQVBfTVBfU1RBVEUgMTQKKyNkZWZpbmUgS1ZNX0NBUF9DT0FMRVNDRURfTU1JTyAxNQorI2RlZmluZSBLVk1fQ0FQX1NZTkNfTU1VIDE2ICAvKiBDaGFuZ2VzIHRvIGhvc3QgbW1hcCBhcmUgcmVmbGVjdGVkIGluIGd1ZXN0ICovCisjaWZkZWYgX19LVk1fSEFWRV9ERVZJQ0VfQVNTSUdOTUVOVAorI2RlZmluZSBLVk1fQ0FQX0RFVklDRV9BU1NJR05NRU5UIDE3CisjZW5kaWYKKyNkZWZpbmUgS1ZNX0NBUF9JT01NVSAxOAorI2lmZGVmIF9fS1ZNX0hBVkVfTVNJCisjZGVmaW5lIEtWTV9DQVBfREVWSUNFX01TSSAyMAorI2VuZGlmCisvKiBCdWcgaW4gS1ZNX1NFVF9VU0VSX01FTU9SWV9SRUdJT04gZml4ZWQ6ICovCisjZGVmaW5lIEtWTV9DQVBfREVTVFJPWV9NRU1PUllfUkVHSU9OX1dPUktTIDIxCisjaWZkZWYgX19LVk1fSEFWRV9VU0VSX05NSQorI2RlZmluZSBLVk1fQ0FQX1VTRVJfTk1JIDIyCisjZW5kaWYKKyNpZmRlZiBfX0tWTV9IQVZFX0dVRVNUX0RFQlVHCisjZGVmaW5lIEtWTV9DQVBfU0VUX0dVRVNUX0RFQlVHIDIzCisjZW5kaWYKKyNpZmRlZiBfX0tWTV9IQVZFX1BJVAorI2RlZmluZSBLVk1fQ0FQX1JFSU5KRUNUX0NPTlRST0wgMjQKKyNlbmRpZgorI2lmZGVmIF9fS1ZNX0hBVkVfSU9BUElDCisjZGVmaW5lIEtWTV9DQVBfSVJRX1JPVVRJTkcgMjUKKyNlbmRpZgorI2RlZmluZSBLVk1fQ0FQX0lSUV9JTkpFQ1RfU1RBVFVTIDI2CisjaWZkZWYgX19LVk1fSEFWRV9ERVZJQ0VfQVNTSUdOTUVOVAorI2RlZmluZSBLVk1fQ0FQX0RFVklDRV9ERUFTU0lHTk1FTlQgMjcKKyNlbmRpZgorI2lmZGVmIF9fS1ZNX0hBVkVfTVNJWAorI2RlZmluZSBLVk1fQ0FQX0RFVklDRV9NU0lYIDI4CisjZW5kaWYKKyNkZWZpbmUgS1ZNX0NBUF9BU1NJR05fREVWX0lSUSAyOQorLyogQW5vdGhlciBidWcgaW4gS1ZNX1NFVF9VU0VSX01FTU9SWV9SRUdJT04gZml4ZWQ6ICovCisjZGVmaW5lIEtWTV9DQVBfSk9JTl9NRU1PUllfUkVHSU9OU19XT1JLUyAzMAorI2lmZGVmIF9fS1ZNX0hBVkVfTUNFCisjZGVmaW5lIEtWTV9DQVBfTUNFIDMxCisjZW5kaWYKKyNkZWZpbmUgS1ZNX0NBUF9JUlFGRCAzMgorI2lmZGVmIF9fS1ZNX0hBVkVfUElUCisjZGVmaW5lIEtWTV9DQVBfUElUMiAzMworI2VuZGlmCisjZGVmaW5lIEtWTV9DQVBfU0VUX0JPT1RfQ1BVX0lEIDM0CisjaWZkZWYgX19LVk1fSEFWRV9QSVRfU1RBVEUyCisjZGVmaW5lIEtWTV9DQVBfUElUX1NUQVRFMiAzNQorI2VuZGlmCisjZGVmaW5lIEtWTV9DQVBfSU9FVkVOVEZEIDM2CisjZGVmaW5lIEtWTV9DQVBfU0VUX0lERU5USVRZX01BUF9BRERSIDM3CisjaWZkZWYgX19LVk1fSEFWRV9YRU5fSFZNCisjZGVmaW5lIEtWTV9DQVBfWEVOX0hWTSAzOAorI2VuZGlmCisjZGVmaW5lIEtWTV9DQVBfQURKVVNUX0NMT0NLIDM5CisjZGVmaW5lIEtWTV9DQVBfSU5URVJOQUxfRVJST1JfREFUQSA0MAorI2lmZGVmIF9fS1ZNX0hBVkVfVkNQVV9FVkVOVFMKKyNkZWZpbmUgS1ZNX0NBUF9WQ1BVX0VWRU5UUyA0MQorI2VuZGlmCisjZGVmaW5lIEtWTV9DQVBfUzM5MF9QU1cgNDIKKyNkZWZpbmUgS1ZNX0NBUF9QUENfU0VHU1RBVEUgNDMKKyNkZWZpbmUgS1ZNX0NBUF9IWVBFUlYgNDQKKyNkZWZpbmUgS1ZNX0NBUF9IWVBFUlZfVkFQSUMgNDUKKyNkZWZpbmUgS1ZNX0NBUF9IWVBFUlZfU1BJTiA0NgorI2RlZmluZSBLVk1fQ0FQX1BDSV9TRUdNRU5UIDQ3CisjZGVmaW5lIEtWTV9DQVBfUFBDX1BBSVJFRF9TSU5HTEVTIDQ4CisjZGVmaW5lIEtWTV9DQVBfSU5UUl9TSEFET1cgNDkKKyNpZmRlZiBfX0tWTV9IQVZFX0RFQlVHUkVHUworI2RlZmluZSBLVk1fQ0FQX0RFQlVHUkVHUyA1MAorI2VuZGlmCisjZGVmaW5lIEtWTV9DQVBfWDg2X1JPQlVTVF9TSU5HTEVTVEVQIDUxCisjZGVmaW5lIEtWTV9DQVBfUFBDX09TSSA1MgorI2RlZmluZSBLVk1fQ0FQX1BQQ19VTlNFVF9JUlEgNTMKKyNkZWZpbmUgS1ZNX0NBUF9FTkFCTEVfQ0FQIDU0CisjaWZkZWYgX19LVk1fSEFWRV9YU0FWRQorI2RlZmluZSBLVk1fQ0FQX1hTQVZFIDU1CisjZW5kaWYKKyNpZmRlZiBfX0tWTV9IQVZFX1hDUlMKKyNkZWZpbmUgS1ZNX0NBUF9YQ1JTIDU2CisjZW5kaWYKKyNkZWZpbmUgS1ZNX0NBUF9QUENfR0VUX1BWSU5GTyA1NworI2RlZmluZSBLVk1fQ0FQX1BQQ19JUlFfTEVWRUwgNTgKKyNkZWZpbmUgS1ZNX0NBUF9BU1lOQ19QRiA1OQorI2RlZmluZSBLVk1fQ0FQX1RTQ19DT05UUk9MIDYwCisjZGVmaW5lIEtWTV9DQVBfR0VUX1RTQ19LSFogNjEKKyNkZWZpbmUgS1ZNX0NBUF9QUENfQk9PS0VfU1JFR1MgNjIKKyNkZWZpbmUgS1ZNX0NBUF9TUEFQUl9UQ0UgNjMKKyNkZWZpbmUgS1ZNX0NBUF9QUENfU01UIDY0CisjZGVmaW5lIEtWTV9DQVBfUFBDX1JNQQk2NQorI2RlZmluZSBLVk1fQ0FQX01BWF9WQ1BVUyA2NiAgICAgICAvKiByZXR1cm5zIG1heCB2Y3B1cyBwZXIgdm0gKi8KKyNkZWZpbmUgS1ZNX0NBUF9QUENfUEFQUiA2OAorI2RlZmluZSBLVk1fQ0FQX1MzOTBfR01BUCA3MQorI2RlZmluZSBLVk1fQ0FQX1RTQ19ERUFETElORV9USU1FUiA3MgorCisjaWZkZWYgS1ZNX0NBUF9JUlFfUk9VVElORworCitzdHJ1Y3Qga3ZtX2lycV9yb3V0aW5nX2lycWNoaXAgeworCV9fdTMyIGlycWNoaXA7CisJX191MzIgcGluOworfTsKKworc3RydWN0IGt2bV9pcnFfcm91dGluZ19tc2kgeworCV9fdTMyIGFkZHJlc3NfbG87CisJX191MzIgYWRkcmVzc19oaTsKKwlfX3UzMiBkYXRhOworCV9fdTMyIHBhZDsKK307CisKKy8qIGdzaSByb3V0aW5nIGVudHJ5IHR5cGVzICovCisjZGVmaW5lIEtWTV9JUlFfUk9VVElOR19JUlFDSElQIDEKKyNkZWZpbmUgS1ZNX0lSUV9ST1VUSU5HX01TSSAyCisKK3N0cnVjdCBrdm1faXJxX3JvdXRpbmdfZW50cnkgeworCV9fdTMyIGdzaTsKKwlfX3UzMiB0eXBlOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHBhZDsKKwl1bmlvbiB7CisJCXN0cnVjdCBrdm1faXJxX3JvdXRpbmdfaXJxY2hpcCBpcnFjaGlwOworCQlzdHJ1Y3Qga3ZtX2lycV9yb3V0aW5nX21zaSBtc2k7CisJCV9fdTMyIHBhZFs4XTsKKwl9IHU7Cit9OworCitzdHJ1Y3Qga3ZtX2lycV9yb3V0aW5nIHsKKwlfX3UzMiBucjsKKwlfX3UzMiBmbGFnczsKKwlzdHJ1Y3Qga3ZtX2lycV9yb3V0aW5nX2VudHJ5IGVudHJpZXNbMF07Cit9OworCisjZW5kaWYKKworI2lmZGVmIEtWTV9DQVBfTUNFCisvKiB4ODYgTUNFICovCitzdHJ1Y3Qga3ZtX3g4Nl9tY2UgeworCV9fdTY0IHN0YXR1czsKKwlfX3U2NCBhZGRyOworCV9fdTY0IG1pc2M7CisJX191NjQgbWNnX3N0YXR1czsKKwlfX3U4IGJhbms7CisJX191OCBwYWQxWzddOworCV9fdTY0IHBhZDJbM107Cit9OworI2VuZGlmCisKKyNpZmRlZiBLVk1fQ0FQX1hFTl9IVk0KK3N0cnVjdCBrdm1feGVuX2h2bV9jb25maWcgeworCV9fdTMyIGZsYWdzOworCV9fdTMyIG1zcjsKKwlfX3U2NCBibG9iX2FkZHJfMzI7CisJX191NjQgYmxvYl9hZGRyXzY0OworCV9fdTggYmxvYl9zaXplXzMyOworCV9fdTggYmxvYl9zaXplXzY0OworCV9fdTggcGFkMlszMF07Cit9OworI2VuZGlmCisKKyNkZWZpbmUgS1ZNX0lSUUZEX0ZMQUdfREVBU1NJR04gKDEgPDwgMCkKKworc3RydWN0IGt2bV9pcnFmZCB7CisJX191MzIgZmQ7CisJX191MzIgZ3NpOworCV9fdTMyIGZsYWdzOworCV9fdTggIHBhZFsyMF07Cit9OworCitzdHJ1Y3Qga3ZtX2Nsb2NrX2RhdGEgeworCV9fdTY0IGNsb2NrOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHBhZFs5XTsKK307CisKKy8qCisgKiBpb2N0bHMgZm9yIFZNIGZkcworICovCisjZGVmaW5lIEtWTV9TRVRfTUVNT1JZX1JFR0lPTiAgICAgX0lPVyhLVk1JTywgIDB4NDAsIHN0cnVjdCBrdm1fbWVtb3J5X3JlZ2lvbikKKy8qCisgKiBLVk1fQ1JFQVRFX1ZDUFUgcmVjZWl2ZXMgYXMgYSBwYXJhbWV0ZXIgdGhlIHZjcHUgc2xvdCwgYW5kIHJldHVybnMKKyAqIGEgdmNwdSBmZC4KKyAqLworI2RlZmluZSBLVk1fQ1JFQVRFX1ZDUFUgICAgICAgICAgIF9JTyhLVk1JTywgICAweDQxKQorI2RlZmluZSBLVk1fR0VUX0RJUlRZX0xPRyAgICAgICAgIF9JT1coS1ZNSU8sICAweDQyLCBzdHJ1Y3Qga3ZtX2RpcnR5X2xvZykKKy8qIEtWTV9TRVRfTUVNT1JZX0FMSUFTIGlzIG9ic29sZXRlOiAqLworI2RlZmluZSBLVk1fU0VUX01FTU9SWV9BTElBUyAgICAgIF9JT1coS1ZNSU8sICAweDQzLCBzdHJ1Y3Qga3ZtX21lbW9yeV9hbGlhcykKKyNkZWZpbmUgS1ZNX1NFVF9OUl9NTVVfUEFHRVMgICAgICBfSU8oS1ZNSU8sICAgMHg0NCkKKyNkZWZpbmUgS1ZNX0dFVF9OUl9NTVVfUEFHRVMgICAgICBfSU8oS1ZNSU8sICAgMHg0NSkKKyNkZWZpbmUgS1ZNX1NFVF9VU0VSX01FTU9SWV9SRUdJT04gX0lPVyhLVk1JTywgMHg0NiwgXAorCQkJCQlzdHJ1Y3Qga3ZtX3VzZXJzcGFjZV9tZW1vcnlfcmVnaW9uKQorI2RlZmluZSBLVk1fU0VUX1RTU19BRERSICAgICAgICAgIF9JTyhLVk1JTywgICAweDQ3KQorI2RlZmluZSBLVk1fU0VUX0lERU5USVRZX01BUF9BRERSIF9JT1coS1ZNSU8sICAweDQ4LCBfX3U2NCkKKy8qIERldmljZSBtb2RlbCBJT0MgKi8KKyNkZWZpbmUgS1ZNX0NSRUFURV9JUlFDSElQICAgICAgICBfSU8oS1ZNSU8sICAgMHg2MCkKKyNkZWZpbmUgS1ZNX0lSUV9MSU5FICAgICAgICAgICAgICBfSU9XKEtWTUlPLCAgMHg2MSwgc3RydWN0IGt2bV9pcnFfbGV2ZWwpCisjZGVmaW5lIEtWTV9HRVRfSVJRQ0hJUCAgICAgICAgICAgX0lPV1IoS1ZNSU8sIDB4NjIsIHN0cnVjdCBrdm1faXJxY2hpcCkKKyNkZWZpbmUgS1ZNX1NFVF9JUlFDSElQICAgICAgICAgICBfSU9SKEtWTUlPLCAgMHg2Mywgc3RydWN0IGt2bV9pcnFjaGlwKQorI2RlZmluZSBLVk1fQ1JFQVRFX1BJVCAgICAgICAgICAgIF9JTyhLVk1JTywgICAweDY0KQorI2RlZmluZSBLVk1fR0VUX1BJVCAgICAgICAgICAgICAgIF9JT1dSKEtWTUlPLCAweDY1LCBzdHJ1Y3Qga3ZtX3BpdF9zdGF0ZSkKKyNkZWZpbmUgS1ZNX1NFVF9QSVQgICAgICAgICAgICAgICBfSU9SKEtWTUlPLCAgMHg2Niwgc3RydWN0IGt2bV9waXRfc3RhdGUpCisjZGVmaW5lIEtWTV9JUlFfTElORV9TVEFUVVMgICAgICAgX0lPV1IoS1ZNSU8sIDB4NjcsIHN0cnVjdCBrdm1faXJxX2xldmVsKQorI2RlZmluZSBLVk1fUkVHSVNURVJfQ09BTEVTQ0VEX01NSU8gXAorCQkJX0lPVyhLVk1JTywgIDB4NjcsIHN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fem9uZSkKKyNkZWZpbmUgS1ZNX1VOUkVHSVNURVJfQ09BTEVTQ0VEX01NSU8gXAorCQkJX0lPVyhLVk1JTywgIDB4NjgsIHN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fem9uZSkKKyNkZWZpbmUgS1ZNX0FTU0lHTl9QQ0lfREVWSUNFICAgICBfSU9SKEtWTUlPLCAgMHg2OSwgXAorCQkJCSAgICAgICBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX3BjaV9kZXYpCisjZGVmaW5lIEtWTV9TRVRfR1NJX1JPVVRJTkcgICAgICAgX0lPVyhLVk1JTywgIDB4NmEsIHN0cnVjdCBrdm1faXJxX3JvdXRpbmcpCisvKiBkZXByZWNhdGVkLCByZXBsYWNlZCBieSBLVk1fQVNTSUdOX0RFVl9JUlEgKi8KKyNkZWZpbmUgS1ZNX0FTU0lHTl9JUlEgICAgICAgICAgICBfX0tWTV9ERVBSRUNBVEVEX1ZNX1JfMHg3MAorI2RlZmluZSBLVk1fQVNTSUdOX0RFVl9JUlEgICAgICAgIF9JT1coS1ZNSU8sICAweDcwLCBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2lycSkKKyNkZWZpbmUgS1ZNX1JFSU5KRUNUX0NPTlRST0wgICAgICBfSU8oS1ZNSU8sICAgMHg3MSkKKyNkZWZpbmUgS1ZNX0RFQVNTSUdOX1BDSV9ERVZJQ0UgICBfSU9XKEtWTUlPLCAgMHg3MiwgXAorCQkJCSAgICAgICBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX3BjaV9kZXYpCisjZGVmaW5lIEtWTV9BU1NJR05fU0VUX01TSVhfTlIgICAgX0lPVyhLVk1JTywgIDB4NzMsIFwKKwkJCQkgICAgICAgc3RydWN0IGt2bV9hc3NpZ25lZF9tc2l4X25yKQorI2RlZmluZSBLVk1fQVNTSUdOX1NFVF9NU0lYX0VOVFJZIF9JT1coS1ZNSU8sICAweDc0LCBcCisJCQkJICAgICAgIHN0cnVjdCBrdm1fYXNzaWduZWRfbXNpeF9lbnRyeSkKKyNkZWZpbmUgS1ZNX0RFQVNTSUdOX0RFVl9JUlEgICAgICBfSU9XKEtWTUlPLCAgMHg3NSwgc3RydWN0IGt2bV9hc3NpZ25lZF9pcnEpCisjZGVmaW5lIEtWTV9JUlFGRCAgICAgICAgICAgICAgICAgX0lPVyhLVk1JTywgIDB4NzYsIHN0cnVjdCBrdm1faXJxZmQpCisjZGVmaW5lIEtWTV9DUkVBVEVfUElUMgkJICBfSU9XKEtWTUlPLCAgMHg3Nywgc3RydWN0IGt2bV9waXRfY29uZmlnKQorI2RlZmluZSBLVk1fU0VUX0JPT1RfQ1BVX0lEICAgICAgIF9JTyhLVk1JTywgICAweDc4KQorI2RlZmluZSBLVk1fSU9FVkVOVEZEICAgICAgICAgICAgIF9JT1coS1ZNSU8sICAweDc5LCBzdHJ1Y3Qga3ZtX2lvZXZlbnRmZCkKKyNkZWZpbmUgS1ZNX1hFTl9IVk1fQ09ORklHICAgICAgICBfSU9XKEtWTUlPLCAgMHg3YSwgc3RydWN0IGt2bV94ZW5faHZtX2NvbmZpZykKKyNkZWZpbmUgS1ZNX1NFVF9DTE9DSyAgICAgICAgICAgICBfSU9XKEtWTUlPLCAgMHg3Yiwgc3RydWN0IGt2bV9jbG9ja19kYXRhKQorI2RlZmluZSBLVk1fR0VUX0NMT0NLICAgICAgICAgICAgIF9JT1IoS1ZNSU8sICAweDdjLCBzdHJ1Y3Qga3ZtX2Nsb2NrX2RhdGEpCisvKiBBdmFpbGFibGUgd2l0aCBLVk1fQ0FQX1BJVF9TVEFURTIgKi8KKyNkZWZpbmUgS1ZNX0dFVF9QSVQyICAgICAgICAgICAgICBfSU9SKEtWTUlPLCAgMHg5Ziwgc3RydWN0IGt2bV9waXRfc3RhdGUyKQorI2RlZmluZSBLVk1fU0VUX1BJVDIgICAgICAgICAgICAgIF9JT1coS1ZNSU8sICAweGEwLCBzdHJ1Y3Qga3ZtX3BpdF9zdGF0ZTIpCisvKiBBdmFpbGFibGUgd2l0aCBLVk1fQ0FQX1BQQ19HRVRfUFZJTkZPICovCisjZGVmaW5lIEtWTV9QUENfR0VUX1BWSU5GTwkgIF9JT1coS1ZNSU8sICAweGExLCBzdHJ1Y3Qga3ZtX3BwY19wdmluZm8pCisvKiBBdmFpbGFibGUgd2l0aCBLVk1fQ0FQX1RTQ19DT05UUk9MICovCisjZGVmaW5lIEtWTV9TRVRfVFNDX0tIWiAgICAgICAgICAgX0lPKEtWTUlPLCAgMHhhMikKKyNkZWZpbmUgS1ZNX0dFVF9UU0NfS0haICAgICAgICAgICBfSU8oS1ZNSU8sICAweGEzKQorCisvKgorICogaW9jdGxzIGZvciB2Y3B1IGZkcworICovCisjZGVmaW5lIEtWTV9SVU4gICAgICAgICAgICAgICAgICAgX0lPKEtWTUlPLCAgIDB4ODApCisjZGVmaW5lIEtWTV9HRVRfUkVHUyAgICAgICAgICAgICAgX0lPUihLVk1JTywgIDB4ODEsIHN0cnVjdCBrdm1fcmVncykKKyNkZWZpbmUgS1ZNX1NFVF9SRUdTICAgICAgICAgICAgICBfSU9XKEtWTUlPLCAgMHg4Miwgc3RydWN0IGt2bV9yZWdzKQorI2RlZmluZSBLVk1fR0VUX1NSRUdTICAgICAgICAgICAgIF9JT1IoS1ZNSU8sICAweDgzLCBzdHJ1Y3Qga3ZtX3NyZWdzKQorI2RlZmluZSBLVk1fU0VUX1NSRUdTICAgICAgICAgICAgIF9JT1coS1ZNSU8sICAweDg0LCBzdHJ1Y3Qga3ZtX3NyZWdzKQorI2RlZmluZSBLVk1fVFJBTlNMQVRFICAgICAgICAgICAgIF9JT1dSKEtWTUlPLCAweDg1LCBzdHJ1Y3Qga3ZtX3RyYW5zbGF0aW9uKQorI2RlZmluZSBLVk1fSU5URVJSVVBUICAgICAgICAgICAgIF9JT1coS1ZNSU8sICAweDg2LCBzdHJ1Y3Qga3ZtX2ludGVycnVwdCkKKy8qIEtWTV9ERUJVR19HVUVTVCBpcyBubyBsb25nZXIgc3VwcG9ydGVkLCB1c2UgS1ZNX1NFVF9HVUVTVF9ERUJVRyBpbnN0ZWFkICovCisjZGVmaW5lIEtWTV9ERUJVR19HVUVTVCAgICAgICAgICAgX19LVk1fREVQUkVDQVRFRF9WQ1BVX1dfMHg4NworI2RlZmluZSBLVk1fR0VUX01TUlMgICAgICAgICAgICAgIF9JT1dSKEtWTUlPLCAweDg4LCBzdHJ1Y3Qga3ZtX21zcnMpCisjZGVmaW5lIEtWTV9TRVRfTVNSUyAgICAgICAgICAgICAgX0lPVyhLVk1JTywgIDB4ODksIHN0cnVjdCBrdm1fbXNycykKKyNkZWZpbmUgS1ZNX1NFVF9DUFVJRCAgICAgICAgICAgICBfSU9XKEtWTUlPLCAgMHg4YSwgc3RydWN0IGt2bV9jcHVpZCkKKyNkZWZpbmUgS1ZNX1NFVF9TSUdOQUxfTUFTSyAgICAgICBfSU9XKEtWTUlPLCAgMHg4Yiwgc3RydWN0IGt2bV9zaWduYWxfbWFzaykKKyNkZWZpbmUgS1ZNX0dFVF9GUFUgICAgICAgICAgICAgICBfSU9SKEtWTUlPLCAgMHg4Yywgc3RydWN0IGt2bV9mcHUpCisjZGVmaW5lIEtWTV9TRVRfRlBVICAgICAgICAgICAgICAgX0lPVyhLVk1JTywgIDB4OGQsIHN0cnVjdCBrdm1fZnB1KQorI2RlZmluZSBLVk1fR0VUX0xBUElDICAgICAgICAgICAgIF9JT1IoS1ZNSU8sICAweDhlLCBzdHJ1Y3Qga3ZtX2xhcGljX3N0YXRlKQorI2RlZmluZSBLVk1fU0VUX0xBUElDICAgICAgICAgICAgIF9JT1coS1ZNSU8sICAweDhmLCBzdHJ1Y3Qga3ZtX2xhcGljX3N0YXRlKQorI2RlZmluZSBLVk1fU0VUX0NQVUlEMiAgICAgICAgICAgIF9JT1coS1ZNSU8sICAweDkwLCBzdHJ1Y3Qga3ZtX2NwdWlkMikKKyNkZWZpbmUgS1ZNX0dFVF9DUFVJRDIgICAgICAgICAgICBfSU9XUihLVk1JTywgMHg5MSwgc3RydWN0IGt2bV9jcHVpZDIpCisvKiBBdmFpbGFibGUgd2l0aCBLVk1fQ0FQX1ZBUElDICovCisjZGVmaW5lIEtWTV9UUFJfQUNDRVNTX1JFUE9SVElORyAgX0lPV1IoS1ZNSU8sIDB4OTIsIHN0cnVjdCBrdm1fdHByX2FjY2Vzc19jdGwpCisvKiBBdmFpbGFibGUgd2l0aCBLVk1fQ0FQX1ZBUElDICovCisjZGVmaW5lIEtWTV9TRVRfVkFQSUNfQUREUiAgICAgICAgX0lPVyhLVk1JTywgIDB4OTMsIHN0cnVjdCBrdm1fdmFwaWNfYWRkcikKKy8qIHZhbGlkIGZvciB2aXJ0dWFsIG1hY2hpbmUgKGZvciBmbG9hdGluZyBpbnRlcnJ1cHQpX2FuZF8gdmNwdSAqLworI2RlZmluZSBLVk1fUzM5MF9JTlRFUlJVUFQgICAgICAgIF9JT1coS1ZNSU8sICAweDk0LCBzdHJ1Y3Qga3ZtX3MzOTBfaW50ZXJydXB0KQorLyogc3RvcmUgc3RhdHVzIGZvciBzMzkwICovCisjZGVmaW5lIEtWTV9TMzkwX1NUT1JFX1NUQVRVU19OT0FERFIgICAgKC0xdWwpCisjZGVmaW5lIEtWTV9TMzkwX1NUT1JFX1NUQVRVU19QUkVGSVhFRCAgKC0ydWwpCisjZGVmaW5lIEtWTV9TMzkwX1NUT1JFX1NUQVRVUwkgIF9JT1coS1ZNSU8sICAweDk1LCB1bnNpZ25lZCBsb25nKQorLyogaW5pdGlhbCBpcGwgcHN3IGZvciBzMzkwICovCisjZGVmaW5lIEtWTV9TMzkwX1NFVF9JTklUSUFMX1BTVyAgX0lPVyhLVk1JTywgIDB4OTYsIHN0cnVjdCBrdm1fczM5MF9wc3cpCisvKiBpbml0aWFsIHJlc2V0IGZvciBzMzkwICovCisjZGVmaW5lIEtWTV9TMzkwX0lOSVRJQUxfUkVTRVQgICAgX0lPKEtWTUlPLCAgIDB4OTcpCisjZGVmaW5lIEtWTV9HRVRfTVBfU1RBVEUgICAgICAgICAgX0lPUihLVk1JTywgIDB4OTgsIHN0cnVjdCBrdm1fbXBfc3RhdGUpCisjZGVmaW5lIEtWTV9TRVRfTVBfU1RBVEUgICAgICAgICAgX0lPVyhLVk1JTywgIDB4OTksIHN0cnVjdCBrdm1fbXBfc3RhdGUpCisvKiBBdmFpbGFibGUgd2l0aCBLVk1fQ0FQX05NSSAqLworI2RlZmluZSBLVk1fTk1JICAgICAgICAgICAgICAgICAgIF9JTyhLVk1JTywgICAweDlhKQorLyogQXZhaWxhYmxlIHdpdGggS1ZNX0NBUF9TRVRfR1VFU1RfREVCVUcgKi8KKyNkZWZpbmUgS1ZNX1NFVF9HVUVTVF9ERUJVRyAgICAgICBfSU9XKEtWTUlPLCAgMHg5Yiwgc3RydWN0IGt2bV9ndWVzdF9kZWJ1ZykKKy8qIE1DRSBmb3IgeDg2ICovCisjZGVmaW5lIEtWTV9YODZfU0VUVVBfTUNFICAgICAgICAgX0lPVyhLVk1JTywgIDB4OWMsIF9fdTY0KQorI2RlZmluZSBLVk1fWDg2X0dFVF9NQ0VfQ0FQX1NVUFBPUlRFRCBfSU9SKEtWTUlPLCAgMHg5ZCwgX191NjQpCisjZGVmaW5lIEtWTV9YODZfU0VUX01DRSAgICAgICAgICAgX0lPVyhLVk1JTywgIDB4OWUsIHN0cnVjdCBrdm1feDg2X21jZSkKKy8qIElBNjQgc3RhY2sgYWNjZXNzICovCisjZGVmaW5lIEtWTV9JQTY0X1ZDUFVfR0VUX1NUQUNLICAgX0lPUihLVk1JTywgIDB4OWEsIHZvaWQgKikKKyNkZWZpbmUgS1ZNX0lBNjRfVkNQVV9TRVRfU1RBQ0sgICBfSU9XKEtWTUlPLCAgMHg5Yiwgdm9pZCAqKQorLyogQXZhaWxhYmxlIHdpdGggS1ZNX0NBUF9WQ1BVX0VWRU5UUyAqLworI2RlZmluZSBLVk1fR0VUX1ZDUFVfRVZFTlRTICAgICAgIF9JT1IoS1ZNSU8sICAweDlmLCBzdHJ1Y3Qga3ZtX3ZjcHVfZXZlbnRzKQorI2RlZmluZSBLVk1fU0VUX1ZDUFVfRVZFTlRTICAgICAgIF9JT1coS1ZNSU8sICAweGEwLCBzdHJ1Y3Qga3ZtX3ZjcHVfZXZlbnRzKQorLyogQXZhaWxhYmxlIHdpdGggS1ZNX0NBUF9ERUJVR1JFR1MgKi8KKyNkZWZpbmUgS1ZNX0dFVF9ERUJVR1JFR1MgICAgICAgICBfSU9SKEtWTUlPLCAgMHhhMSwgc3RydWN0IGt2bV9kZWJ1Z3JlZ3MpCisjZGVmaW5lIEtWTV9TRVRfREVCVUdSRUdTICAgICAgICAgX0lPVyhLVk1JTywgIDB4YTIsIHN0cnVjdCBrdm1fZGVidWdyZWdzKQorI2RlZmluZSBLVk1fRU5BQkxFX0NBUCAgICAgICAgICAgIF9JT1coS1ZNSU8sICAweGEzLCBzdHJ1Y3Qga3ZtX2VuYWJsZV9jYXApCisvKiBBdmFpbGFibGUgd2l0aCBLVk1fQ0FQX1hTQVZFICovCisjZGVmaW5lIEtWTV9HRVRfWFNBVkUJCSAgX0lPUihLVk1JTywgIDB4YTQsIHN0cnVjdCBrdm1feHNhdmUpCisjZGVmaW5lIEtWTV9TRVRfWFNBVkUJCSAgX0lPVyhLVk1JTywgIDB4YTUsIHN0cnVjdCBrdm1feHNhdmUpCisvKiBBdmFpbGFibGUgd2l0aCBLVk1fQ0FQX1hDUlMgKi8KKyNkZWZpbmUgS1ZNX0dFVF9YQ1JTCQkgIF9JT1IoS1ZNSU8sICAweGE2LCBzdHJ1Y3Qga3ZtX3hjcnMpCisjZGVmaW5lIEtWTV9TRVRfWENSUwkJICBfSU9XKEtWTUlPLCAgMHhhNywgc3RydWN0IGt2bV94Y3JzKQorI2RlZmluZSBLVk1fQ1JFQVRFX1NQQVBSX1RDRQkgIF9JT1coS1ZNSU8sICAweGE4LCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9zcGFwcl90Y2UpCisvKiBBdmFpbGFibGUgd2l0aCBLVk1fQ0FQX1JNQSAqLworI2RlZmluZSBLVk1fQUxMT0NBVEVfUk1BCSAgX0lPUihLVk1JTywgIDB4YTksIHN0cnVjdCBrdm1fYWxsb2NhdGVfcm1hKQorCisjZGVmaW5lIEtWTV9ERVZfQVNTSUdOX0VOQUJMRV9JT01NVQkoMSA8PCAwKQorCitzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX3BjaV9kZXYgeworCV9fdTMyIGFzc2lnbmVkX2Rldl9pZDsKKwlfX3UzMiBidXNucjsKKwlfX3UzMiBkZXZmbjsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBzZWducjsKKwl1bmlvbiB7CisJCV9fdTMyIHJlc2VydmVkWzExXTsKKwl9OworfTsKKworI2RlZmluZSBLVk1fREVWX0lSUV9IT1NUX0lOVFggICAgKDEgPDwgMCkKKyNkZWZpbmUgS1ZNX0RFVl9JUlFfSE9TVF9NU0kgICAgICgxIDw8IDEpCisjZGVmaW5lIEtWTV9ERVZfSVJRX0hPU1RfTVNJWCAgICAoMSA8PCAyKQorCisjZGVmaW5lIEtWTV9ERVZfSVJRX0dVRVNUX0lOVFggICAoMSA8PCA4KQorI2RlZmluZSBLVk1fREVWX0lSUV9HVUVTVF9NU0kgICAgKDEgPDwgOSkKKyNkZWZpbmUgS1ZNX0RFVl9JUlFfR1VFU1RfTVNJWCAgICgxIDw8IDEwKQorCisjZGVmaW5lIEtWTV9ERVZfSVJRX0hPU1RfTUFTSwkgMHgwMGZmCisjZGVmaW5lIEtWTV9ERVZfSVJRX0dVRVNUX01BU0sgICAweGZmMDAKKworc3RydWN0IGt2bV9hc3NpZ25lZF9pcnEgeworCV9fdTMyIGFzc2lnbmVkX2Rldl9pZDsKKwlfX3UzMiBob3N0X2lycTsgLyogaWdub3JlZCAobGVnYWN5IGZpZWxkKSAqLworCV9fdTMyIGd1ZXN0X2lycTsKKwlfX3UzMiBmbGFnczsKKwl1bmlvbiB7CisJCV9fdTMyIHJlc2VydmVkWzEyXTsKKwl9OworfTsKKworc3RydWN0IGt2bV9hc3NpZ25lZF9tc2l4X25yIHsKKwlfX3UzMiBhc3NpZ25lZF9kZXZfaWQ7CisJX191MTYgZW50cnlfbnI7CisJX191MTYgcGFkZGluZzsKK307CisKKyNkZWZpbmUgS1ZNX01BWF9NU0lYX1BFUl9ERVYJCTI1Ngorc3RydWN0IGt2bV9hc3NpZ25lZF9tc2l4X2VudHJ5IHsKKwlfX3UzMiBhc3NpZ25lZF9kZXZfaWQ7CisJX191MzIgZ3NpOworCV9fdTE2IGVudHJ5OyAvKiBUaGUgaW5kZXggb2YgZW50cnkgaW4gdGhlIE1TSS1YIHRhYmxlICovCisJX191MTYgcGFkZGluZ1szXTsKK307CisKKyNlbmRpZiAvKiBfX0xJTlVYX0tWTV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2t2bV9wYXJhLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2t2bV9wYXJhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxNWUyNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva3ZtX3BhcmEuaApAQCAtMCwwICsxLDI5IEBACisjaWZuZGVmIF9fTElOVVhfS1ZNX1BBUkFfSAorI2RlZmluZSBfX0xJTlVYX0tWTV9QQVJBX0gKKworLyoKKyAqIFRoaXMgaGVhZGVyIGZpbGUgcHJvdmlkZXMgYSBtZXRob2QgZm9yIG1ha2luZyBhIGh5cGVyY2FsbCB0byB0aGUgaG9zdAorICogQXJjaGl0ZWN0dXJlcyBzaG91bGQgZGVmaW5lOgorICogLSBrdm1faHlwZXJjYWxsMCwga3ZtX2h5cGVyY2FsbDEuLi4KKyAqIC0ga3ZtX2FyY2hfcGFyYV9mZWF0dXJlcworICogLSBrdm1fcGFyYV9hdmFpbGFibGUKKyAqLworCisvKiBSZXR1cm4gdmFsdWVzIGZvciBoeXBlcmNhbGxzICovCisjZGVmaW5lIEtWTV9FTk9TWVMJCTEwMDAKKyNkZWZpbmUgS1ZNX0VGQVVMVAkJRUZBVUxUCisjZGVmaW5lIEtWTV9FMkJJRwkJRTJCSUcKKyNkZWZpbmUgS1ZNX0VQRVJNCQlFUEVSTQorCisjZGVmaW5lIEtWTV9IQ19WQVBJQ19QT0xMX0lSUQkJMQorI2RlZmluZSBLVk1fSENfTU1VX09QCQkJMgorI2RlZmluZSBLVk1fSENfRkVBVFVSRVMJCQkzCisjZGVmaW5lIEtWTV9IQ19QUENfTUFQX01BR0lDX1BBR0UJNAorCisvKgorICogaHlwZXJjYWxscyB1c2UgYXJjaGl0ZWN0dXJlIHNwZWNpZmljCisgKi8KKyNpbmNsdWRlIDxhc20va3ZtX3BhcmEuaD4KKworI2VuZGlmIC8qIF9fTElOVVhfS1ZNX1BBUkFfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2wydHAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbDJ0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYTc0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2wydHAuaApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIEwyVFAtb3Zlci1JUCBzb2NrZXQgZm9yIEwyVFB2My4KKyAqCisgKiBBdXRob3I6IEphbWVzIENoYXBtYW4gPGpjaGFwbWFuQGthdGFsaXguY29tPgorICovCisKKyNpZm5kZWYgX0xJTlVYX0wyVFBfSF8KKyNkZWZpbmUgX0xJTlVYX0wyVFBfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjZGVmaW5lIElQUFJPVE9fTDJUUAkJMTE1CisKKy8qKgorICogc3RydWN0IHNvY2thZGRyX2wydHBpcCAtIHRoZSBzb2NrYWRkciBzdHJ1Y3R1cmUgZm9yIEwyVFAtb3Zlci1JUCBzb2NrZXRzCisgKiBAbDJ0cF9mYW1pbHk6ICBhZGRyZXNzIGZhbWlseSBudW1iZXIgQUZfTDJUUElQLgorICogQGwydHBfYWRkcjogICAgcHJvdG9jb2wgc3BlY2lmaWMgYWRkcmVzcyBpbmZvcm1hdGlvbgorICogQGwydHBfY29ubl9pZDogY29ubmVjdGlvbiBpZCBvZiB0dW5uZWwKKyAqLworI2RlZmluZSBfX1NPQ0tfU0laRV9fCTE2CQkvKiBzaXplb2Yoc3RydWN0IHNvY2thZGRyKQkqLworc3RydWN0IHNvY2thZGRyX2wydHBpcCB7CisJLyogVGhlIGZpcnN0IGZpZWxkcyBtdXN0IG1hdGNoIHN0cnVjdCBzb2NrYWRkcl9pbiAqLworCV9fa2VybmVsX3NhX2ZhbWlseV90IGwydHBfZmFtaWx5OyAvKiBBRl9JTkVUICovCisJX19iZTE2CQlsMnRwX3VudXNlZDsJLyogSU5FVCBwb3J0IG51bWJlciAodW51c2VkKSAqLworCXN0cnVjdCBpbl9hZGRyCWwydHBfYWRkcjsJLyogSW50ZXJuZXQgYWRkcmVzcyAqLworCisJX191MzIJCWwydHBfY29ubl9pZDsJLyogQ29ubmVjdGlvbiBJRCBvZiB0dW5uZWwgKi8KKworCS8qIFBhZCB0byBzaXplIG9mIGBzdHJ1Y3Qgc29ja2FkZHInLiAqLworCXVuc2lnbmVkIGNoYXIJX19wYWRbc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgLQorCQkJICAgICAgc2l6ZW9mKF9fa2VybmVsX3NhX2ZhbWlseV90KSAtCisJCQkgICAgICBzaXplb2YoX19iZTE2KSAtIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikgLQorCQkJICAgICAgc2l6ZW9mKF9fdTMyKV07Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBORVRMSU5LX0dFTkVSSUMgbmV0bGluayBmYW1pbHkuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb21tYW5kcy4KKyAqIFZhbGlkIFRMVnMgb2YgZWFjaCBjb21tYW5kIGFyZTotCisgKiBUVU5ORUxfQ1JFQVRFCS0gQ09OTl9JRCwgcHdfdHlwZSwgbmV0bnMsIGlmbmFtZSwgaXBpbmZvLCB1ZHBpbmZvLCB1ZHBjc3VtLCB2bGFuaWQKKyAqIFRVTk5FTF9ERUxFVEUJLSBDT05OX0lECisgKiBUVU5ORUxfTU9ESUZZCS0gQ09OTl9JRCwgdWRwY3N1bQorICogVFVOTkVMX0dFVFNUQVRTCS0gQ09OTl9JRCwgKHN0YXRzKQorICogVFVOTkVMX0dFVAkJLSBDT05OX0lELCAoLi4uKQorICogU0VTU0lPTl9DUkVBVEUJLSBTRVNTSU9OX0lELCBQV19UWVBFLCBvZmZzZXQsIGRhdGFfc2VxLCBjb29raWUsIHBlZXJfY29va2llLCBvZmZzZXQsIGwyc3BlYworICogU0VTU0lPTl9ERUxFVEUJLSBTRVNTSU9OX0lECisgKiBTRVNTSU9OX01PRElGWQktIFNFU1NJT05fSUQsIGRhdGFfc2VxCisgKiBTRVNTSU9OX0dFVAkJLSBTRVNTSU9OX0lELCAoLi4uKQorICogU0VTU0lPTl9HRVRTVEFUUwktIFNFU1NJT05fSUQsIChzdGF0cykKKyAqCisgKi8KK2VudW0geworCUwyVFBfQ01EX05PT1AsCisJTDJUUF9DTURfVFVOTkVMX0NSRUFURSwKKwlMMlRQX0NNRF9UVU5ORUxfREVMRVRFLAorCUwyVFBfQ01EX1RVTk5FTF9NT0RJRlksCisJTDJUUF9DTURfVFVOTkVMX0dFVCwKKwlMMlRQX0NNRF9TRVNTSU9OX0NSRUFURSwKKwlMMlRQX0NNRF9TRVNTSU9OX0RFTEVURSwKKwlMMlRQX0NNRF9TRVNTSU9OX01PRElGWSwKKwlMMlRQX0NNRF9TRVNTSU9OX0dFVCwKKwlfX0wyVFBfQ01EX01BWCwKK307CisKKyNkZWZpbmUgTDJUUF9DTURfTUFYCQkJKF9fTDJUUF9DTURfTUFYIC0gMSkKKworLyoKKyAqIEFUVFIgdHlwZXMgZGVmaW5lZCBmb3IgTDJUUAorICovCitlbnVtIHsKKwlMMlRQX0FUVFJfTk9ORSwJCQkvKiBubyBkYXRhICovCisJTDJUUF9BVFRSX1BXX1RZUEUsCQkvKiB1MTYsIGVudW0gbDJ0cF9wd3R5cGUgKi8KKwlMMlRQX0FUVFJfRU5DQVBfVFlQRSwJCS8qIHUxNiwgZW51bSBsMnRwX2VuY2FwX3R5cGUgKi8KKwlMMlRQX0FUVFJfT0ZGU0VULAkJLyogdTE2ICovCisJTDJUUF9BVFRSX0RBVEFfU0VRLAkJLyogdTE2ICovCisJTDJUUF9BVFRSX0wyU1BFQ19UWVBFLAkJLyogdTgsIGVudW0gbDJ0cF9sMnNwZWNfdHlwZSAqLworCUwyVFBfQVRUUl9MMlNQRUNfTEVOLAkJLyogdTgsIGVudW0gbDJ0cF9sMnNwZWNfdHlwZSAqLworCUwyVFBfQVRUUl9QUk9UT19WRVJTSU9OLAkvKiB1OCAqLworCUwyVFBfQVRUUl9JRk5BTUUsCQkvKiBzdHJpbmcgKi8KKwlMMlRQX0FUVFJfQ09OTl9JRCwJCS8qIHUzMiAqLworCUwyVFBfQVRUUl9QRUVSX0NPTk5fSUQsCQkvKiB1MzIgKi8KKwlMMlRQX0FUVFJfU0VTU0lPTl9JRCwJCS8qIHUzMiAqLworCUwyVFBfQVRUUl9QRUVSX1NFU1NJT05fSUQsCS8qIHUzMiAqLworCUwyVFBfQVRUUl9VRFBfQ1NVTSwJCS8qIHU4ICovCisJTDJUUF9BVFRSX1ZMQU5fSUQsCQkvKiB1MTYgKi8KKwlMMlRQX0FUVFJfQ09PS0lFLAkJLyogMCwgNCBvciA4IGJ5dGVzICovCisJTDJUUF9BVFRSX1BFRVJfQ09PS0lFLAkJLyogMCwgNCBvciA4IGJ5dGVzICovCisJTDJUUF9BVFRSX0RFQlVHLAkJLyogdTMyICovCisJTDJUUF9BVFRSX1JFQ1ZfU0VRLAkJLyogdTggKi8KKwlMMlRQX0FUVFJfU0VORF9TRVEsCQkvKiB1OCAqLworCUwyVFBfQVRUUl9MTlNfTU9ERSwJCS8qIHU4ICovCisJTDJUUF9BVFRSX1VTSU5HX0lQU0VDLAkJLyogdTggKi8KKwlMMlRQX0FUVFJfUkVDVl9USU1FT1VULAkJLyogbXNlYyAqLworCUwyVFBfQVRUUl9GRCwJCQkvKiBpbnQgKi8KKwlMMlRQX0FUVFJfSVBfU0FERFIsCQkvKiB1MzIgKi8KKwlMMlRQX0FUVFJfSVBfREFERFIsCQkvKiB1MzIgKi8KKwlMMlRQX0FUVFJfVURQX1NQT1JULAkJLyogdTE2ICovCisJTDJUUF9BVFRSX1VEUF9EUE9SVCwJCS8qIHUxNiAqLworCUwyVFBfQVRUUl9NVFUsCQkJLyogdTE2ICovCisJTDJUUF9BVFRSX01SVSwJCQkvKiB1MTYgKi8KKwlMMlRQX0FUVFJfU1RBVFMsCQkvKiBuZXN0ZWQgKi8KKwlfX0wyVFBfQVRUUl9NQVgsCit9OworCisjZGVmaW5lIEwyVFBfQVRUUl9NQVgJCQkoX19MMlRQX0FUVFJfTUFYIC0gMSkKKworLyogTmVzdGVkIGluIEwyVFBfQVRUUl9TVEFUUyAqLworZW51bSB7CisJTDJUUF9BVFRSX1NUQVRTX05PTkUsCQkvKiBubyBkYXRhICovCisJTDJUUF9BVFRSX1RYX1BBQ0tFVFMsCQkvKiB1NjQgKi8KKwlMMlRQX0FUVFJfVFhfQllURVMsCQkvKiB1NjQgKi8KKwlMMlRQX0FUVFJfVFhfRVJST1JTLAkJLyogdTY0ICovCisJTDJUUF9BVFRSX1JYX1BBQ0tFVFMsCQkvKiB1NjQgKi8KKwlMMlRQX0FUVFJfUlhfQllURVMsCQkvKiB1NjQgKi8KKwlMMlRQX0FUVFJfUlhfU0VRX0RJU0NBUkRTLAkvKiB1NjQgKi8KKwlMMlRQX0FUVFJfUlhfT09TX1BBQ0tFVFMsCS8qIHU2NCAqLworCUwyVFBfQVRUUl9SWF9FUlJPUlMsCQkvKiB1NjQgKi8KKwlfX0wyVFBfQVRUUl9TVEFUU19NQVgsCit9OworCisjZGVmaW5lIEwyVFBfQVRUUl9TVEFUU19NQVgJCShfX0wyVFBfQVRUUl9TVEFUU19NQVggLSAxKQorCitlbnVtIGwydHBfcHd0eXBlIHsKKwlMMlRQX1BXVFlQRV9OT05FID0gMHgwMDAwLAorCUwyVFBfUFdUWVBFX0VUSF9WTEFOID0gMHgwMDA0LAorCUwyVFBfUFdUWVBFX0VUSCA9IDB4MDAwNSwKKwlMMlRQX1BXVFlQRV9QUFAgPSAweDAwMDcsCisJTDJUUF9QV1RZUEVfUFBQX0FDID0gMHgwMDA4LAorCUwyVFBfUFdUWVBFX0lQID0gMHgwMDBiLAorCV9fTDJUUF9QV1RZUEVfTUFYCit9OworCitlbnVtIGwydHBfbDJzcGVjX3R5cGUgeworCUwyVFBfTDJTUEVDVFlQRV9OT05FLAorCUwyVFBfTDJTUEVDVFlQRV9ERUZBVUxULAorfTsKKworZW51bSBsMnRwX2VuY2FwX3R5cGUgeworCUwyVFBfRU5DQVBUWVBFX1VEUCwKKwlMMlRQX0VOQ0FQVFlQRV9JUCwKK307CisKK2VudW0gbDJ0cF9zZXFtb2RlIHsKKwlMMlRQX1NFUV9OT05FID0gMCwKKwlMMlRQX1NFUV9JUCA9IDEsCisJTDJUUF9TRVFfQUxMID0gMiwKK307CisKKy8qCisgKiBORVRMSU5LX0dFTkVSSUMgcmVsYXRlZCBpbmZvCisgKi8KKyNkZWZpbmUgTDJUUF9HRU5MX05BTUUJCSJsMnRwIgorI2RlZmluZSBMMlRQX0dFTkxfVkVSU0lPTgkweDEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2xpbWl0cy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9saW1pdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDBmOTQxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9saW1pdHMuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9MSU5VWF9MSU1JVFNfSAorI2RlZmluZSBfTElOVVhfTElNSVRTX0gKKworI2RlZmluZSBOUl9PUEVOCSAgICAgICAgMTAyNAorCisjZGVmaW5lIE5HUk9VUFNfTUFYICAgIDY1NTM2CS8qIHN1cHBsZW1lbnRhbCBncm91cCBJRHMgYXJlIGF2YWlsYWJsZSAqLworI2RlZmluZSBBUkdfTUFYICAgICAgIDEzMTA3MgkvKiAjIGJ5dGVzIG9mIGFyZ3MgKyBlbnZpcm9uIGZvciBleGVjKCkgKi8KKyNkZWZpbmUgTElOS19NQVggICAgICAgICAxMjcJLyogIyBsaW5rcyBhIGZpbGUgbWF5IGhhdmUgKi8KKyNkZWZpbmUgTUFYX0NBTk9OICAgICAgICAyNTUJLyogc2l6ZSBvZiB0aGUgY2Fub25pY2FsIGlucHV0IHF1ZXVlICovCisjZGVmaW5lIE1BWF9JTlBVVCAgICAgICAgMjU1CS8qIHNpemUgb2YgdGhlIHR5cGUtYWhlYWQgYnVmZmVyICovCisjZGVmaW5lIE5BTUVfTUFYICAgICAgICAgMjU1CS8qICMgY2hhcnMgaW4gYSBmaWxlIG5hbWUgKi8KKyNkZWZpbmUgUEFUSF9NQVggICAgICAgIDQwOTYJLyogIyBjaGFycyBpbiBhIHBhdGggbmFtZSBpbmNsdWRpbmcgbnVsICovCisjZGVmaW5lIFBJUEVfQlVGICAgICAgICA0MDk2CS8qICMgYnl0ZXMgaW4gYXRvbWljIHdyaXRlIHRvIGEgcGlwZSAqLworI2RlZmluZSBYQVRUUl9OQU1FX01BWCAgIDI1NQkvKiAjIGNoYXJzIGluIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBuYW1lICovCisjZGVmaW5lIFhBVFRSX1NJWkVfTUFYIDY1NTM2CS8qIHNpemUgb2YgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIHZhbHVlICg2NGspICovCisjZGVmaW5lIFhBVFRSX0xJU1RfTUFYIDY1NTM2CS8qIHNpemUgb2YgZXh0ZW5kZWQgYXR0cmlidXRlIG5hbWVsaXN0ICg2NGspICovCisKKyNkZWZpbmUgUlRTSUdfTUFYCSAgMzIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2xsYy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9sbGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWE2M2ZlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9sbGMuaApAQCAtMCwwICsxLDg0IEBACisjaWZuZGVmIF9fTElOVVhfTExDX0gKKyNkZWZpbmUgX19MSU5VWF9MTENfSAorLyoKKyAqIElFRUUgODAyLjIgVXNlciBJbnRlcmZhY2UgU0FQcyBmb3IgTGludXgsIGRhdGEgc3RydWN0dXJlcyBhbmQgaW5kaWNhdG9ycy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgYnkgSmF5IFNjaHVsaXN0IDxqc2NobHN0QHNhbWJhLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gY2FuIGJlIHJlZGlzdHJpYnV0ZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgb3IgaW1wbGllZCB3YXJyYW50eQorICogb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLgorICoKKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisKKyNkZWZpbmUgX19MTENfU09DS19TSVpFX18gMTYJLyogc2l6ZW9mKHNvY2thZGRyX2xsYyksIHdvcmQgYWxpZ24uICovCitzdHJ1Y3Qgc29ja2FkZHJfbGxjIHsKKwlfX2tlcm5lbF9zYV9mYW1pbHlfdCBzbGxjX2ZhbWlseTsgLyogQUZfTExDICovCisJX19rZXJuZWxfc2FfZmFtaWx5X3Qgc2xsY19hcnBocmQ7IC8qIEFSUEhSRF9FVEhFUiAqLworCXVuc2lnbmVkIGNoYXIgICBzbGxjX3Rlc3Q7CisJdW5zaWduZWQgY2hhciAgIHNsbGNfeGlkOworCXVuc2lnbmVkIGNoYXIJc2xsY191YTsJLyogVUEgZGF0YSwgb25seSBmb3IgU09DS19TVFJFQU0uICovCisJdW5zaWduZWQgY2hhciAgIHNsbGNfc2FwOworCXVuc2lnbmVkIGNoYXIgICBzbGxjX21hY1tJRkhXQUREUkxFTl07CisJdW5zaWduZWQgY2hhciAgIF9fcGFkW19fTExDX1NPQ0tfU0laRV9fIC0KKwkJCSAgICAgIHNpemVvZihfX2tlcm5lbF9zYV9mYW1pbHlfdCkgKiAyIC0KKwkJCSAgICAgIHNpemVvZih1bnNpZ25lZCBjaGFyKSAqIDQgLSBJRkhXQUREUkxFTl07Cit9OworCisvKiBzb2Nrb3B0IGRlZmluaXRpb25zLiAqLworZW51bSBsbGNfc29ja29wdHMgeworCUxMQ19PUFRfVU5LTk9XTiA9IDAsCisJTExDX09QVF9SRVRSWSwJCS8qIG1heCByZXRyYW5zIGF0dGVtcHRzLiAqLworCUxMQ19PUFRfU0laRSwJCS8qIG1heCBQRFUgc2l6ZSAob2N0ZXRzKS4gKi8KKwlMTENfT1BUX0FDS19UTVJfRVhQLAkvKiBhY2sgZXhwaXJlIHRpbWUgKHNlY3MpLiAqLworCUxMQ19PUFRfUF9UTVJfRVhQLAkvKiBwZiBjeWNsZSBleHBpcmUgdGltZSAoc2VjcykuICovCisJTExDX09QVF9SRUpfVE1SX0VYUCwJLyogcmVqIHNlbnQgZXhwaXJlIHRpbWUgKHNlY3MpLiAqLworCUxMQ19PUFRfQlVTWV9UTVJfRVhQLAkvKiBidXN5IHN0YXRlIGV4cGlyZSB0aW1lIChzZWNzKS4gKi8KKwlMTENfT1BUX1RYX1dJTiwJCS8qIHR4IHdpbmRvdyBzaXplLiAqLworCUxMQ19PUFRfUlhfV0lOLAkJLyogcnggd2luZG93IHNpemUuICovCisJTExDX09QVF9QS1RJTkZPLAkvKiBhbmNpbGxhcnkgcGFja2V0IGluZm9ybWF0aW9uLiAqLworCUxMQ19PUFRfTUFYCit9OworCisjZGVmaW5lIExMQ19PUFRfTUFYX1JFVFJZCSAxMDAKKyNkZWZpbmUgTExDX09QVF9NQVhfU0laRQk0MTk2CisjZGVmaW5lIExMQ19PUFRfTUFYX1dJTgkJIDEyNworI2RlZmluZSBMTENfT1BUX01BWF9BQ0tfVE1SX0VYUAkgIDYwCisjZGVmaW5lIExMQ19PUFRfTUFYX1BfVE1SX0VYUAkgIDYwCisjZGVmaW5lIExMQ19PUFRfTUFYX1JFSl9UTVJfRVhQCSAgNjAKKyNkZWZpbmUgTExDX09QVF9NQVhfQlVTWV9UTVJfRVhQICA2MAorCisvKiBMTEMgU0FQIHR5cGVzLiAqLworI2RlZmluZSBMTENfU0FQX05VTEwJMHgwMAkJLyogTlVMTCBTQVAuIAkJCSovCisjZGVmaW5lIExMQ19TQVBfTExDCTB4MDIJCS8qIExMQyBTdWJsYXllciBNYW5hZ2VtZW50LiAJKi8KKyNkZWZpbmUgTExDX1NBUF9TTkEJMHgwNAkJLyogU05BIFBhdGggQ29udHJvbC4gCQkqLworI2RlZmluZSBMTENfU0FQX1BOTQkweDBFCQkvKiBQcm93YXkgTmV0d29yayBNYW5hZ2VtZW50LgkqLwkKKyNkZWZpbmUgTExDX1NBUF9JUAkweDA2CQkvKiBUQ1AvSVAuIAkJCSovCisjZGVmaW5lIExMQ19TQVBfQlNQQU4JMHg0MgkJLyogQnJpZGdlIFNwYW5uaW5nIFRyZWUgUHJvdG8JKi8KKyNkZWZpbmUgTExDX1NBUF9NTVMJMHg0RQkJLyogTWFudWZhY3R1cmluZyBNZXNzYWdlIFNydi4JKi8KKyNkZWZpbmUgTExDX1NBUF84MjA4CTB4N0UJCS8qIElTTyA4MjA4CQkJKi8KKyNkZWZpbmUgTExDX1NBUF8zQ09NCTB4ODAJCS8qIDNDT00uIAkJCSovCisjZGVmaW5lIExMQ19TQVBfUFJPCTB4OEUJCS8qIFByb3dheSBBY3RpdmUgU3RhdGlvbiBMaXN0CSovCisjZGVmaW5lIExMQ19TQVBfU05BUAkweEFBCQkvKiBTTkFQLiAJCQkqLworI2RlZmluZSBMTENfU0FQX0JBTllBTgkweEJDCQkvKiBCYW55YW4uIAkJCSovCisjZGVmaW5lIExMQ19TQVBfSVBYCTB4RTAJCS8qIElQWC9TUFguIAkJCSovCisjZGVmaW5lIExMQ19TQVBfTkVUQkVVSQkweEYwCQkvKiBOZXRCRVVJLiAJCQkqLworI2RlZmluZSBMTENfU0FQX0xBTk1HUgkweEY0CQkvKiBMYW5NYW5hZ2VyLiAJCQkqLworI2RlZmluZSBMTENfU0FQX0lNUEwJMHhGOAkJLyogSU1QTAkJCQkqLworI2RlZmluZSBMTENfU0FQX0RJU0MJMHhGQwkJLyogRGlzY292ZXJ5CQkJKi8KKyNkZWZpbmUgTExDX1NBUF9PU0kJMHhGRQkJLyogT1NJIE5ldHdvcmsgTGF5ZXJzLiAJCSovCisjZGVmaW5lIExMQ19TQVBfTEFSCTB4REMJCS8qIExBTiBBZGRyZXNzIFJlc29sdXRpb24gCSovCisjZGVmaW5lIExMQ19TQVBfUk0JMHhENAkJLyogUmVzb3VyY2UgTWFuYWdlbWVudCAJCSovCisjZGVmaW5lIExMQ19TQVBfR0xPQkFMCTB4RkYJCS8qIEdsb2JhbCBTQVAuIAkJCSovCisKK3N0cnVjdCBsbGNfcGt0aW5mbyB7CisJaW50IGxwaV9pZmluZGV4OworCXVuc2lnbmVkIGNoYXIgbHBpX3NhcDsKKwl1bnNpZ25lZCBjaGFyIGxwaV9tYWNbSUZIV0FERFJMRU5dOworfTsKKworI2VuZGlmIC8qIF9fTElOVVhfTExDX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbG9vcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9sb29wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM4N2U5MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbG9vcC5oCkBAIC0wLDAgKzEsOTQgQEAKKyNpZm5kZWYgX0xJTlVYX0xPT1BfSAorI2RlZmluZSBfTElOVVhfTE9PUF9ICisKKy8qCisgKiBpbmNsdWRlL2xpbnV4L2xvb3AuaAorICoKKyAqIFdyaXR0ZW4gYnkgVGhlb2RvcmUgVHMnbywgMy8yOS85My4KKyAqCisgKiBDb3B5cmlnaHQgMTk5MyBieSBUaGVvZG9yZSBUcydvLiAgUmVkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlIGlzCisgKiBwZXJtaXR0ZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9fTkFNRV9TSVpFCTY0CisjZGVmaW5lIExPX0tFWV9TSVpFCTMyCisKKworLyoKKyAqIExvb3AgZmxhZ3MKKyAqLworZW51bSB7CisJTE9fRkxBR1NfUkVBRF9PTkxZCT0gMSwKKwlMT19GTEFHU19BVVRPQ0xFQVIJPSA0LAorCUxPX0ZMQUdTX1BBUlRTQ0FOCT0gOCwKK307CisKKyNpbmNsdWRlIDxhc20vcG9zaXhfdHlwZXMuaD4JLyogZm9yIF9fa2VybmVsX29sZF9kZXZfdCAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CS8qIGZvciBfX3U2NCAqLworCisvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB2ZXJzaW9uICovCitzdHJ1Y3QgbG9vcF9pbmZvIHsKKwlpbnQJCSAgIGxvX251bWJlcjsJCS8qIGlvY3RsIHIvbyAqLworCV9fa2VybmVsX29sZF9kZXZfdCBsb19kZXZpY2U7IAkJLyogaW9jdGwgci9vICovCisJdW5zaWduZWQgbG9uZwkgICBsb19pbm9kZTsgCQkvKiBpb2N0bCByL28gKi8KKwlfX2tlcm5lbF9vbGRfZGV2X3QgbG9fcmRldmljZTsgCQkvKiBpb2N0bCByL28gKi8KKwlpbnQJCSAgIGxvX29mZnNldDsKKwlpbnQJCSAgIGxvX2VuY3J5cHRfdHlwZTsKKwlpbnQJCSAgIGxvX2VuY3J5cHRfa2V5X3NpemU7IAkvKiBpb2N0bCB3L28gKi8KKwlpbnQJCSAgIGxvX2ZsYWdzOwkJCS8qIGlvY3RsIHIvbyAqLworCWNoYXIJCSAgIGxvX25hbWVbTE9fTkFNRV9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyCSAgIGxvX2VuY3J5cHRfa2V5W0xPX0tFWV9TSVpFXTsgLyogaW9jdGwgdy9vICovCisJdW5zaWduZWQgbG9uZwkgICBsb19pbml0WzJdOworCWNoYXIJCSAgIHJlc2VydmVkWzRdOworfTsKKworc3RydWN0IGxvb3BfaW5mbzY0IHsKKwlfX3U2NAkJICAgbG9fZGV2aWNlOwkJCS8qIGlvY3RsIHIvbyAqLworCV9fdTY0CQkgICBsb19pbm9kZTsJCQkvKiBpb2N0bCByL28gKi8KKwlfX3U2NAkJICAgbG9fcmRldmljZTsJCQkvKiBpb2N0bCByL28gKi8KKwlfX3U2NAkJICAgbG9fb2Zmc2V0OworCV9fdTY0CQkgICBsb19zaXplbGltaXQ7LyogYnl0ZXMsIDAgPT0gbWF4IGF2YWlsYWJsZSAqLworCV9fdTMyCQkgICBsb19udW1iZXI7CQkJLyogaW9jdGwgci9vICovCisJX191MzIJCSAgIGxvX2VuY3J5cHRfdHlwZTsKKwlfX3UzMgkJICAgbG9fZW5jcnlwdF9rZXlfc2l6ZTsJCS8qIGlvY3RsIHcvbyAqLworCV9fdTMyCQkgICBsb19mbGFnczsJCQkvKiBpb2N0bCByL28gKi8KKwlfX3U4CQkgICBsb19maWxlX25hbWVbTE9fTkFNRV9TSVpFXTsKKwlfX3U4CQkgICBsb19jcnlwdF9uYW1lW0xPX05BTUVfU0laRV07CisJX191OAkJICAgbG9fZW5jcnlwdF9rZXlbTE9fS0VZX1NJWkVdOyAvKiBpb2N0bCB3L28gKi8KKwlfX3U2NAkJICAgbG9faW5pdFsyXTsKK307CisKKy8qCisgKiBMb29wIGZpbHRlciB0eXBlcworICovCisKKyNkZWZpbmUgTE9fQ1JZUFRfTk9ORQkJMAorI2RlZmluZSBMT19DUllQVF9YT1IJCTEKKyNkZWZpbmUgTE9fQ1JZUFRfREVTCQkyCisjZGVmaW5lIExPX0NSWVBUX0ZJU0gyCQkzICAgIC8qIFR3b2Zpc2ggZW5jcnlwdGlvbiAqLworI2RlZmluZSBMT19DUllQVF9CTE9XCQk0CisjZGVmaW5lIExPX0NSWVBUX0NBU1QxMjgJNQorI2RlZmluZSBMT19DUllQVF9JREVBCQk2CisjZGVmaW5lIExPX0NSWVBUX0RVTU1ZCQk5CisjZGVmaW5lIExPX0NSWVBUX1NLSVBKQUNLCTEwCisjZGVmaW5lIExPX0NSWVBUX0NSWVBUT0FQSQkxOAorI2RlZmluZSBNQVhfTE9fQ1JZUFQJCTIwCisKKy8qCisgKiBJT0NUTCBjb21tYW5kcyAtLS0gd2Ugd2lsbCBjb21tYW5kZWVyIDB4NEMgKCdMJykKKyAqLworCisjZGVmaW5lIExPT1BfU0VUX0ZECQkweDRDMDAKKyNkZWZpbmUgTE9PUF9DTFJfRkQJCTB4NEMwMQorI2RlZmluZSBMT09QX1NFVF9TVEFUVVMJCTB4NEMwMgorI2RlZmluZSBMT09QX0dFVF9TVEFUVVMJCTB4NEMwMworI2RlZmluZSBMT09QX1NFVF9TVEFUVVM2NAkweDRDMDQKKyNkZWZpbmUgTE9PUF9HRVRfU1RBVFVTNjQJMHg0QzA1CisjZGVmaW5lIExPT1BfQ0hBTkdFX0ZECQkweDRDMDYKKyNkZWZpbmUgTE9PUF9TRVRfQ0FQQUNJVFkJMHg0QzA3CisKKy8qIC9kZXYvbG9vcC1jb250cm9sIGludGVyZmFjZSAqLworI2RlZmluZSBMT09QX0NUTF9BREQJCTB4NEM4MAorI2RlZmluZSBMT09QX0NUTF9SRU1PVkUJCTB4NEM4MQorI2RlZmluZSBMT09QX0NUTF9HRVRfRlJFRQkweDRDODIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9scC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9scC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YjFhNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2xwLmgKQEAgLTAsMCArMSwxMDAgQEAKKyNpZm5kZWYgX0xJTlVYX0xQX0gKKyNkZWZpbmUgX0xJTlVYX0xQX0gKKworLyoKKyAqIHVzci9pbmNsdWRlL2xpbnV4L2xwLmggYy4xOTkxLTE5OTIgSmFtZXMgV2llZ2FuZAorICogbWFueSBtb2RpZmljYXRpb25zIGNvcHlyaWdodCAoQykgMTk5MiBNaWNoYWVsIEsuIEpvaG5zb24KKyAqIEludGVycnVwdCBzdXBwb3J0IGFkZGVkIDE5OTMgTmlnZWwgR2FtYmxlCisgKiBSZW1vdmVkIDgyNTUgc3RhdHVzIGRlZmluZXMgZnJvbSBpbnNpZGUgX19LRVJORUxfXyBNYXJjZWxvIFRvc2F0dGkgCisgKi8KKworLyoKKyAqIFBlciBQT1NJWCBndWlkZWxpbmVzLCB0aGlzIG1vZHVsZSByZXNlcnZlcyB0aGUgTFAgYW5kIGxwIHByZWZpeGVzCisgKiBUaGVzZSBhcmUgdGhlIGxwX3RhYmxlW21pbm9yXS5mbGFncyBmbGFncy4uLgorICovCisjZGVmaW5lIExQX0VYSVNUIDB4MDAwMQorI2RlZmluZSBMUF9TRUxFQyAweDAwMDIKKyNkZWZpbmUgTFBfQlVTWQkgMHgwMDA0CisjZGVmaW5lIExQX0JVU1lfQklUX1BPUyAyCisjZGVmaW5lIExQX09GRkwJIDB4MDAwOAorI2RlZmluZSBMUF9OT1BBICAweDAwMTAKKyNkZWZpbmUgTFBfRVJSICAgMHgwMDIwCisjZGVmaW5lIExQX0FCT1JUIDB4MDA0MAorI2RlZmluZSBMUF9DQVJFRlVMIDB4MDA4MCAvKiBvYnNvbGV0ZWQgLWFyY2EgKi8KKyNkZWZpbmUgTFBfQUJPUlRPUEVOIDB4MDEwMAorCisjZGVmaW5lIExQX1RSVVNUX0lSUV8gIDB4MDIwMCAvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBMUF9OT19SRVZFUlNFICAweDA0MDAgLyogTm8gcmV2ZXJzZSBtb2RlIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgTFBfREFUQV9BVkFJTCAgMHgwODAwIC8qIERhdGEgaXMgYXZhaWxhYmxlLiAqLworCisvKiAKKyAqIGJpdCBkZWZpbmVzIGZvciA4MjU1IHN0YXR1cyBwb3J0CisgKiBiYXNlICsgMQorICogYWNjZXNzZWQgd2l0aCBMUF9TKG1pbm9yKSwgd2hpY2ggZ2V0cyB0aGUgYnl0ZS4uLgorICovCisjZGVmaW5lIExQX1BCVVNZCTB4ODAgIC8qIGludmVydGVkIGlucHV0LCBhY3RpdmUgaGlnaCAqLworI2RlZmluZSBMUF9QQUNLCQkweDQwICAvKiB1bmNoYW5nZWQgaW5wdXQsIGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgTFBfUE9VVFBBCTB4MjAgIC8qIHVuY2hhbmdlZCBpbnB1dCwgYWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUgTFBfUFNFTEVDRAkweDEwICAvKiB1bmNoYW5nZWQgaW5wdXQsIGFjdGl2ZSBoaWdoICovCisjZGVmaW5lIExQX1BFUlJPUlAJMHgwOCAgLyogdW5jaGFuZ2VkIGlucHV0LCBhY3RpdmUgbG93ICovCisKKy8qIHRpbWVvdXQgZm9yIGVhY2ggY2hhcmFjdGVyLiAgVGhpcyBpcyByZWxhdGl2ZSB0byBidXMgY3ljbGVzIC0tIGl0CisgKiBpcyB0aGUgY291bnQgaW4gYSBidXN5IGxvb3AuICBUSElTIElTIFRIRSBWQUxVRSBUTyBDSEFOR0UgaWYgeW91CisgKiBoYXZlIGV4dHJlbWVseSBzbG93IHByaW50aW5nLCBvciBpZiB0aGUgbWFjaGluZSBzZWVtcyB0byBzbG93IGRvd24KKyAqIGEgbG90IHdoZW4geW91IHByaW50LiAgSWYgeW91IGhhdmUgc2xvdyBwcmludGluZywgaW5jcmVhc2UgdGhpcworICogbnVtYmVyIGFuZCByZWNvbXBpbGUsIGFuZCBpZiB5b3VyIHN5c3RlbSBnZXRzIGJvZ2dlZCBkb3duLCBkZWNyZWFzZQorICogdGhpcyBudW1iZXIuICBUaGlzIGNhbiBiZSBjaGFuZ2VkIHdpdGggdGhlIHR1bmVscCg4KSBjb21tYW5kIGFzIHdlbGwuCisgKi8KKworI2RlZmluZSBMUF9JTklUX0NIQVIgMTAwMAorCisvKiBUaGUgcGFyYWxsZWwgcG9ydCBzcGVjcyBhcHBhcmVudGx5IHNheSB0aGF0IHRoZXJlIG5lZWRzIHRvIGJlCisgKiBhIC41dXNlYyB3YWl0IGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHN0cm9iZS4KKyAqLworCisjZGVmaW5lIExQX0lOSVRfV0FJVCAxCisKKy8qIFRoaXMgaXMgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIGRyaXZlciB3YWl0cyBmb3IgdGhlIHByaW50ZXIgdG8KKyAqIGNhdGNoIHVwIHdoZW4gdGhlIHByaW50ZXIncyBidWZmZXIgYXBwZWFycyB0byBiZSBmaWxsZWQuICBJZiB5b3UKKyAqIHdhbnQgdG8gdHVuZSB0aGlzIGFuZCBoYXZlIGEgZmFzdCBwcmludGVyIChpLmUuIEhQSUlJUCksIGRlY3JlYXNlCisgKiB0aGlzIG51bWJlciwgYW5kIGlmIHlvdSBoYXZlIGEgc2xvdyBwcmludGVyLCBpbmNyZWFzZSB0aGlzIG51bWJlci4KKyAqIFRoaXMgaXMgaW4gaHVuZHJlZHRocyBvZiBhIHNlY29uZCwgdGhlIGRlZmF1bHQgMiBiZWluZyAuMDUgc2Vjb25kLgorICogT3IgdXNlIHRoZSB0dW5lbHAoOCkgY29tbWFuZCwgd2hpY2ggaXMgZXNwZWNpYWxseSBuaWNlIGlmIHlvdSB3YW50CisgKiBjaGFuZ2UgYmFjayBhbmQgZm9ydGggYmV0d2VlbiBjaGFyYWN0ZXIgYW5kIGdyYXBoaWNzIHByaW50aW5nLCB3aGljaAorICogYXJlIHdpbGRseSBkaWZmZXJlbnQuLi4KKyAqLworCisjZGVmaW5lIExQX0lOSVRfVElNRSAyCisKKy8qIElPQ1RMIG51bWJlcnMgKi8KKyNkZWZpbmUgTFBDSEFSICAgMHgwNjAxICAvKiBjb3JyZXNwb25kcyB0byBMUF9JTklUX0NIQVIgKi8KKyNkZWZpbmUgTFBUSU1FICAgMHgwNjAyICAvKiBjb3JyZXNwb25kcyB0byBMUF9JTklUX1RJTUUgKi8KKyNkZWZpbmUgTFBBQk9SVCAgMHgwNjA0ICAvKiBjYWxsIHdpdGggVFJVRSBhcmcgdG8gYWJvcnQgb24gZXJyb3IsCisJCQkgICAgRkFMU0UgdG8gcmV0cnkuICBEZWZhdWx0IGlzIHJldHJ5LiAgKi8KKyNkZWZpbmUgTFBTRVRJUlEgMHgwNjA1ICAvKiBjYWxsIHdpdGggbmV3IElSUSBudW1iZXIsCisJCQkgICAgb3IgMCBmb3IgcG9sbGluZyAobm8gSVJRKSAqLworI2RlZmluZSBMUEdFVElSUSAweDA2MDYgIC8qIGdldCB0aGUgY3VycmVudCBJUlEgbnVtYmVyICovCisjZGVmaW5lIExQV0FJVCAgIDB4MDYwOCAgLyogY29ycmVzcG9uZHMgdG8gTFBfSU5JVF9XQUlUICovCisvKiBOT1RFOiBMUENBUkVGVUwgaXMgb2Jzb2xldGVkIGFuZCBpdCcgcyBhbHdheXMgdGhlIGRlZmF1bHQgcmlnaHQgbm93IC1hcmNhICovCisjZGVmaW5lIExQQ0FSRUZVTCAgIDB4MDYwOSAgLyogY2FsbCB3aXRoIFRSVUUgYXJnIHRvIHJlcXVpcmUgb3V0LW9mLXBhcGVyLCBvZmYtCisJCQkgICAgbGluZSwgYW5kIGVycm9yIGluZGljYXRvcnMgZ29vZCBvbiBhbGwgd3JpdGVzLAorCQkJICAgIEZBTFNFIHRvIGlnbm9yZSB0aGVtLiAgRGVmYXVsdCBpcyBpZ25vcmUuICovCisjZGVmaW5lIExQQUJPUlRPUEVOIDB4MDYwYSAgLyogY2FsbCB3aXRoIFRSVUUgYXJnIHRvIGFib3J0IG9wZW4oKSBvbiBlcnJvciwKKwkJCSAgICBGQUxTRSB0byBpZ25vcmUgZXJyb3IuICBEZWZhdWx0IGlzIGlnbm9yZS4gICovCisjZGVmaW5lIExQR0VUU1RBVFVTIDB4MDYwYiAgLyogcmV0dXJuIExQX1MobWlub3IpICovCisjZGVmaW5lIExQUkVTRVQgICAgIDB4MDYwYyAgLyogcmVzZXQgcHJpbnRlciAqLworI2lmZGVmIExQX1NUQVRTCisjZGVmaW5lIExQR0VUU1RBVFMgIDB4MDYwZCAgLyogZ2V0IHN0YXRpc3RpY3MgKHN0cnVjdCBscF9zdGF0cykgKi8KKyNlbmRpZgorI2RlZmluZSBMUEdFVEZMQUdTICAweDA2MGUgIC8qIGdldCBzdGF0dXMgZmxhZ3MgKi8KKyNkZWZpbmUgTFBTRVRUSU1FT1VUIDB4MDYwZiAvKiBzZXQgcGFycG9ydCB0aW1lb3V0ICovCisKKy8qIHRpbWVvdXQgZm9yIHByaW50aydpbmcgYSB0aW1lb3V0LCBpbiBqaWZmaWVzICgxMDB0aHMgb2YgYSBzZWNvbmQpLgorICAgVGhpcyBpcyBhbHNvIHVzZWQgZm9yIHJlLWNoZWNraW5nIGVycm9yIGNvbmRpdGlvbnMgaWYgTFBfQUJPUlQgaXMKKyAgIG5vdCBzZXQuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yLiAqLworCisjZGVmaW5lIExQX1RJTUVPVVRfSU5URVJSVVBUCSg2MCAqIEhaKQorI2RlZmluZSBMUF9USU1FT1VUX1BPTExFRAkoMTAgKiBIWikKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWFnaWMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWFnaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDRiZWFiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tYWdpYy5oCkBAIC0wLDAgKzEsNjUgQEAKKyNpZm5kZWYgX19MSU5VWF9NQUdJQ19IX18KKyNkZWZpbmUgX19MSU5VWF9NQUdJQ19IX18KKworI2RlZmluZSBBREZTX1NVUEVSX01BR0lDCTB4YWRmNQorI2RlZmluZSBBRkZTX1NVUEVSX01BR0lDCTB4YWRmZgorI2RlZmluZSBBRlNfU1VQRVJfTUFHSUMgICAgICAgICAgICAgICAgMHg1MzQ2NDE0RgorI2RlZmluZSBBVVRPRlNfU1VQRVJfTUFHSUMJMHgwMTg3CisjZGVmaW5lIENPREFfU1VQRVJfTUFHSUMJMHg3Mzc1NzI0NQorI2RlZmluZSBDUkFNRlNfTUFHSUMJCTB4MjhjZDNkNDUJLyogc29tZSByYW5kb20gbnVtYmVyICovCisjZGVmaW5lIENSQU1GU19NQUdJQ19XRU5ECTB4NDUzZGNkMjgJLyogbWFnaWMgbnVtYmVyIHdpdGggdGhlIHdyb25nIGVuZGlhbmVzcyAqLworI2RlZmluZSBERUJVR0ZTX01BR0lDICAgICAgICAgIDB4NjQ2MjY3MjAKKyNkZWZpbmUgU1lTRlNfTUFHSUMJCTB4NjI2NTY1NzIKKyNkZWZpbmUgU0VDVVJJVFlGU19NQUdJQwkweDczNjM2NjczCisjZGVmaW5lIFNFTElOVVhfTUFHSUMJCTB4Zjk3Y2ZmOGMKKyNkZWZpbmUgUkFNRlNfTUFHSUMJCTB4ODU4NDU4ZjYJLyogc29tZSByYW5kb20gbnVtYmVyICovCisjZGVmaW5lIFRNUEZTX01BR0lDCQkweDAxMDIxOTk0CisjZGVmaW5lIEhVR0VUTEJGU19NQUdJQyAJMHg5NTg0NThmNgkvKiBzb21lIHJhbmRvbSBudW1iZXIgKi8KKyNkZWZpbmUgU1FVQVNIRlNfTUFHSUMJCTB4NzM3MTczNjgKKyNkZWZpbmUgRUNSWVBURlNfU1VQRVJfTUFHSUMJMHhmMTVmCisjZGVmaW5lIEVGU19TVVBFUl9NQUdJQwkJMHg0MTRBNTMKKyNkZWZpbmUgRVhUMl9TVVBFUl9NQUdJQwkweEVGNTMKKyNkZWZpbmUgRVhUM19TVVBFUl9NQUdJQwkweEVGNTMKKyNkZWZpbmUgWEVORlNfU1VQRVJfTUFHSUMJMHhhYmJhMTk3NAorI2RlZmluZSBFWFQ0X1NVUEVSX01BR0lDCTB4RUY1MworI2RlZmluZSBCVFJGU19TVVBFUl9NQUdJQwkweDkxMjM2ODNFCisjZGVmaW5lIE5JTEZTX1NVUEVSX01BR0lDCTB4MzQzNAorI2RlZmluZSBIUEZTX1NVUEVSX01BR0lDCTB4Zjk5NWU4NDkKKyNkZWZpbmUgSVNPRlNfU1VQRVJfTUFHSUMJMHg5NjYwCisjZGVmaW5lIEpGRlMyX1NVUEVSX01BR0lDCTB4NzJiNgorI2RlZmluZSBBTk9OX0lOT0RFX0ZTX01BR0lDCTB4MDkwNDE5MzQKKyNkZWZpbmUgUFNUT1JFRlNfTUFHSUMJCTB4NjE2NTY3NkMKKworI2RlZmluZSBNSU5JWF9TVVBFUl9NQUdJQwkweDEzN0YJCS8qIG1pbml4IHYxIGZzLCAxNCBjaGFyIG5hbWVzICovCisjZGVmaW5lIE1JTklYX1NVUEVSX01BR0lDMgkweDEzOEYJCS8qIG1pbml4IHYxIGZzLCAzMCBjaGFyIG5hbWVzICovCisjZGVmaW5lIE1JTklYMl9TVVBFUl9NQUdJQwkweDI0NjgJCS8qIG1pbml4IHYyIGZzLCAxNCBjaGFyIG5hbWVzICovCisjZGVmaW5lIE1JTklYMl9TVVBFUl9NQUdJQzIJMHgyNDc4CQkvKiBtaW5peCB2MiBmcywgMzAgY2hhciBuYW1lcyAqLworI2RlZmluZSBNSU5JWDNfU1VQRVJfTUFHSUMJMHg0ZDVhCQkvKiBtaW5peCB2MyBmcywgNjAgY2hhciBuYW1lcyAqLworCisjZGVmaW5lIE1TRE9TX1NVUEVSX01BR0lDCTB4NGQ0NAkJLyogTUQgKi8KKyNkZWZpbmUgTkNQX1NVUEVSX01BR0lDCQkweDU2NGMJCS8qIEd1ZXNzLCB3aGF0IDB4NTY0YyBpcyA6LSkgKi8KKyNkZWZpbmUgTkZTX1NVUEVSX01BR0lDCQkweDY5NjkKKyNkZWZpbmUgT1BFTlBST01fU1VQRVJfTUFHSUMJMHg5ZmExCisjZGVmaW5lIFBST0NfU1VQRVJfTUFHSUMJMHg5ZmEwCisjZGVmaW5lIFFOWDRfU1VQRVJfTUFHSUMJMHgwMDJmCQkvKiBxbng0IGZzIGRldGVjdGlvbiAqLworCisjZGVmaW5lIFJFSVNFUkZTX1NVUEVSX01BR0lDCTB4NTI2NTQ5NzMJLyogdXNlZCBieSBnY2MgKi8KKwkJCQkJLyogdXNlZCBieSBmaWxlIHN5c3RlbSB1dGlsaXRpZXMgdGhhdAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vayBhdCB0aGUgc3VwZXJibG9jaywgZXRjLiAgKi8KKyNkZWZpbmUgUkVJU0VSRlNfU1VQRVJfTUFHSUNfU1RSSU5HCSJSZUlzRXJGcyIKKyNkZWZpbmUgUkVJU0VSMkZTX1NVUEVSX01BR0lDX1NUUklORwkiUmVJc0VyMkZzIgorI2RlZmluZSBSRUlTRVIyRlNfSlJfU1VQRVJfTUFHSUNfU1RSSU5HCSJSZUlzRXIzRnMiCisKKyNkZWZpbmUgU01CX1NVUEVSX01BR0lDCQkweDUxN0IKKyNkZWZpbmUgVVNCREVWSUNFX1NVUEVSX01BR0lDCTB4OWZhMgorI2RlZmluZSBDR1JPVVBfU1VQRVJfTUFHSUMJMHgyN2UwZWIKKworI2RlZmluZSBGVVRFWEZTX1NVUEVSX01BR0lDCTB4QkFEMURFQQorCisjZGVmaW5lIFNUQUNLX0VORF9NQUdJQwkJMHg1N0FDNkU5RAorCisjZGVmaW5lIERFVlBUU19TVVBFUl9NQUdJQwkweDFjZDEKKyNkZWZpbmUgU09DS0ZTX01BR0lDCQkweDUzNEY0MzRCCisjZGVmaW5lIFY5RlNfTUFHSUMJCTB4MDEwMjE5OTcKKworI2VuZGlmIC8qIF9fTElOVVhfTUFHSUNfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21ham9yLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21ham9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE4Y2E5OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWFqb3IuaApAQCAtMCwwICsxLDE3NyBAQAorI2lmbmRlZiBfTElOVVhfTUFKT1JfSAorI2RlZmluZSBfTElOVVhfTUFKT1JfSAorCisvKgorICogVGhpcyBmaWxlIGhhcyBkZWZpbml0aW9ucyBmb3IgbWFqb3IgZGV2aWNlIG51bWJlcnMuCisgKiBGb3IgdGhlIGRldmljZSBudW1iZXIgYXNzaWdubWVudHMsIHNlZSBEb2N1bWVudGF0aW9uL2RldmljZXMudHh0LgorICovCisKKyNkZWZpbmUgVU5OQU1FRF9NQUpPUgkJMAorI2RlZmluZSBNRU1fTUFKT1IJCTEKKyNkZWZpbmUgUkFNRElTS19NQUpPUgkJMQorI2RlZmluZSBGTE9QUFlfTUFKT1IJCTIKKyNkZWZpbmUgUFRZX01BU1RFUl9NQUpPUgkyCisjZGVmaW5lIElERTBfTUFKT1IJCTMKKyNkZWZpbmUgSERfTUFKT1IJCUlERTBfTUFKT1IKKyNkZWZpbmUgUFRZX1NMQVZFX01BSk9SCQkzCisjZGVmaW5lIFRUWV9NQUpPUgkJNAorI2RlZmluZSBUVFlBVVhfTUFKT1IJCTUKKyNkZWZpbmUgTFBfTUFKT1IJCTYKKyNkZWZpbmUgVkNTX01BSk9SCQk3CisjZGVmaW5lIExPT1BfTUFKT1IJCTcKKyNkZWZpbmUgU0NTSV9ESVNLMF9NQUpPUgk4CisjZGVmaW5lIFNDU0lfVEFQRV9NQUpPUgkJOQorI2RlZmluZSBNRF9NQUpPUgkJOQorI2RlZmluZSBNSVNDX01BSk9SCQkxMAorI2RlZmluZSBTQ1NJX0NEUk9NX01BSk9SCTExCisjZGVmaW5lIE1VWF9NQUpPUgkJMTEJLyogUEEtUklTQyBvbmx5ICovCisjZGVmaW5lIFhUX0RJU0tfTUFKT1IJCTEzCisjZGVmaW5lIElOUFVUX01BSk9SCQkxMworI2RlZmluZSBTT1VORF9NQUpPUgkJMTQKKyNkZWZpbmUgQ0RVMzFBX0NEUk9NX01BSk9SCTE1CisjZGVmaW5lIEpPWVNUSUNLX01BSk9SCQkxNQorI2RlZmluZSBHT0xEU1RBUl9DRFJPTV9NQUpPUgkxNgorI2RlZmluZSBPUFRJQ1NfQ0RST01fTUFKT1IJMTcKKyNkZWZpbmUgU0FOWU9fQ0RST01fTUFKT1IJMTgKKyNkZWZpbmUgQ1lDTEFERVNfTUFKT1IJCTE5CisjZGVmaW5lIENZQ0xBREVTQVVYX01BSk9SCTIwCisjZGVmaW5lIE1JVFNVTUlfWF9DRFJPTV9NQUpPUgkyMAorI2RlZmluZSBNRk1fQUNPUk5fTUFKT1IJCTIxCS8qIEFSTSBMaW51eCAvZGV2L21mbSAqLworI2RlZmluZSBTQ1NJX0dFTkVSSUNfTUFKT1IJMjEKKyNkZWZpbmUgSURFMV9NQUpPUgkJMjIKKyNkZWZpbmUgRElHSUNVX01BSk9SCQkyMgorI2RlZmluZSBESUdJX01BSk9SCQkyMworI2RlZmluZSBNSVRTVU1JX0NEUk9NX01BSk9SCTIzCisjZGVmaW5lIENEVTUzNV9DRFJPTV9NQUpPUgkyNAorI2RlZmluZSBTVExfU0VSSUFMTUFKT1IJCTI0CisjZGVmaW5lIE1BVFNVU0hJVEFfQ0RST01fTUFKT1IJMjUKKyNkZWZpbmUgU1RMX0NBTExPVVRNQUpPUgkyNQorI2RlZmluZSBNQVRTVVNISVRBX0NEUk9NMl9NQUpPUgkyNgorI2RlZmluZSBRSUMxMTdfVEFQRV9NQUpPUgkyNworI2RlZmluZSBNQVRTVVNISVRBX0NEUk9NM19NQUpPUgkyNworI2RlZmluZSBNQVRTVVNISVRBX0NEUk9NNF9NQUpPUgkyOAorI2RlZmluZSBTVExfU0lPTUVNTUFKT1IJCTI4CisjZGVmaW5lIEFDU0lfTUFKT1IJCTI4CisjZGVmaW5lIEFaVEVDSF9DRFJPTV9NQUpPUgkyOQorI2RlZmluZSBGQl9NQUpPUgkJMjkgICAvKiAvZGV2L2ZiKiBmcmFtZWJ1ZmZlcnMgKi8KKyNkZWZpbmUgQ00yMDZfQ0RST01fTUFKT1IJMzIKKyNkZWZpbmUgSURFMl9NQUpPUgkJMzMKKyNkZWZpbmUgSURFM19NQUpPUgkJMzQKKyNkZWZpbmUgWjg1MzBfTUFKT1IJCTM0CisjZGVmaW5lIFhQUkFNX01BSk9SCQkzNSAgIC8qIEV4cGFuZGVkIHN0b3JhZ2Ugb24gUy8zOTA6ICJzbG93IHJhbSIqLworI2RlZmluZSBORVRMSU5LX01BSk9SCQkzNgorI2RlZmluZSBQUzJFU0RJX01BSk9SCQkzNgorI2RlZmluZSBJREVUQVBFX01BSk9SCQkzNworI2RlZmluZSBaMlJBTV9NQUpPUgkJMzcKKyNkZWZpbmUgQVBCTE9DS19NQUpPUgkJMzggICAvKiBBUDEwMDAgQmxvY2sgZGV2aWNlICovCisjZGVmaW5lIEREVl9NQUpPUgkJMzkgICAvKiBBUDEwMDAgRERWIGJsb2NrIGRldmljZSAqLworI2RlZmluZSBOQkRfTUFKT1IJCTQzICAgLyogTmV0d29yayBibG9jayBkZXZpY2UJKi8KKyNkZWZpbmUgUklTQ09NOF9OT1JNQUxfTUFKT1IJNDgKKyNkZWZpbmUgREFDOTYwX01BSk9SCQk0OCAgIC8qIDQ4Li41NSAqLworI2RlZmluZSBSSVNDT004X0NBTExPVVRfTUFKT1IJNDkKKyNkZWZpbmUgTUtJU1NfTUFKT1IJCTU1CisjZGVmaW5lIERTUDU2S19NQUpPUgkJNTUgICAvKiBEU1A1NjAwMSBwcm9jZXNzb3IgZGV2aWNlICovCisKKyNkZWZpbmUgSURFNF9NQUpPUgkJNTYKKyNkZWZpbmUgSURFNV9NQUpPUgkJNTcKKworI2RlZmluZSBTQ1NJX0RJU0sxX01BSk9SCTY1CisjZGVmaW5lIFNDU0lfRElTSzJfTUFKT1IJNjYKKyNkZWZpbmUgU0NTSV9ESVNLM19NQUpPUgk2NworI2RlZmluZSBTQ1NJX0RJU0s0X01BSk9SCTY4CisjZGVmaW5lIFNDU0lfRElTSzVfTUFKT1IJNjkKKyNkZWZpbmUgU0NTSV9ESVNLNl9NQUpPUgk3MAorI2RlZmluZSBTQ1NJX0RJU0s3X01BSk9SCTcxCisKKyNkZWZpbmUgQ09NUEFRX1NNQVJUMl9NQUpPUgk3MgorI2RlZmluZSBDT01QQVFfU01BUlQyX01BSk9SMQk3MworI2RlZmluZSBDT01QQVFfU01BUlQyX01BSk9SMgk3NAorI2RlZmluZSBDT01QQVFfU01BUlQyX01BSk9SMwk3NQorI2RlZmluZSBDT01QQVFfU01BUlQyX01BSk9SNAk3NgorI2RlZmluZSBDT01QQVFfU01BUlQyX01BSk9SNQk3NworI2RlZmluZSBDT01QQVFfU01BUlQyX01BSk9SNgk3OAorI2RlZmluZSBDT01QQVFfU01BUlQyX01BSk9SNwk3OQorCisjZGVmaW5lIFNQRUNJQUxJWF9OT1JNQUxfTUFKT1IJNzUKKyNkZWZpbmUgU1BFQ0lBTElYX0NBTExPVVRfTUFKT1IJNzYKKworI2RlZmluZSBBVVJPUkFfTUFKT1IJCTc5CisKKyNkZWZpbmUgSTJPX01BSk9SCQk4MAkvKiA4MC0+ODcgKi8KKworI2RlZmluZSBTSE1JUV9NQUpPUgkJODUgICAvKiBMaW51eC9taXBzLCBTR0kgL2Rldi9zaG1pcSAqLworI2RlZmluZSBTQ1NJX0NIQU5HRVJfTUFKT1IgICAgICA4NgorCisjZGVmaW5lIElERTZfTUFKT1IJCTg4CisjZGVmaW5lIElERTdfTUFKT1IJCTg5CisjZGVmaW5lIElERThfTUFKT1IJCTkwCisjZGVmaW5lIElERTlfTUFKT1IJCTkxCisKKyNkZWZpbmUgREFTRF9NQUpPUgkJOTQKKworI2RlZmluZSBNRElTS19NQUpPUgkJOTUKKworI2RlZmluZSBVQkRfTUFKT1IJCTk4CisKKyNkZWZpbmUgUFBfTUFKT1IJCTk5CisjZGVmaW5lIEpTRkRfTUFKT1IJCTk5CisKKyNkZWZpbmUgUEhPTkVfTUFKT1IJCTEwMAorCisjZGVmaW5lIENPTVBBUV9DSVNTX01BSk9SCTEwNAorI2RlZmluZSBDT01QQVFfQ0lTU19NQUpPUjEJMTA1CisjZGVmaW5lIENPTVBBUV9DSVNTX01BSk9SMiAgICAgIDEwNgorI2RlZmluZSBDT01QQVFfQ0lTU19NQUpPUjMgICAgICAxMDcKKyNkZWZpbmUgQ09NUEFRX0NJU1NfTUFKT1I0ICAgICAgMTA4CisjZGVmaW5lIENPTVBBUV9DSVNTX01BSk9SNSAgICAgIDEwOQorI2RlZmluZSBDT01QQVFfQ0lTU19NQUpPUjYgICAgICAxMTAKKyNkZWZpbmUgQ09NUEFRX0NJU1NfTUFKT1I3ICAgICAgMTExCisKKyNkZWZpbmUgVklPREFTRF9NQUpPUgkJMTEyCisjZGVmaW5lIFZJT0NEX01BSk9SCQkxMTMKKworI2RlZmluZSBBVEFSQUlEX01BSk9SCQkxMTQKKworI2RlZmluZSBTQ1NJX0RJU0s4X01BSk9SCTEyOAorI2RlZmluZSBTQ1NJX0RJU0s5X01BSk9SCTEyOQorI2RlZmluZSBTQ1NJX0RJU0sxMF9NQUpPUgkxMzAKKyNkZWZpbmUgU0NTSV9ESVNLMTFfTUFKT1IJMTMxCisjZGVmaW5lIFNDU0lfRElTSzEyX01BSk9SCTEzMgorI2RlZmluZSBTQ1NJX0RJU0sxM19NQUpPUgkxMzMKKyNkZWZpbmUgU0NTSV9ESVNLMTRfTUFKT1IJMTM0CisjZGVmaW5lIFNDU0lfRElTSzE1X01BSk9SCTEzNQorCisjZGVmaW5lIFVOSVg5OF9QVFlfTUFTVEVSX01BSk9SCTEyOAorI2RlZmluZSBVTklYOThfUFRZX01BSk9SX0NPVU5UCTgKKyNkZWZpbmUgVU5JWDk4X1BUWV9TTEFWRV9NQUpPUgkoVU5JWDk4X1BUWV9NQVNURVJfTUFKT1IrVU5JWDk4X1BUWV9NQUpPUl9DT1VOVCkKKworI2RlZmluZSBEUkJEX01BSk9SCQkxNDcKKyNkZWZpbmUgUlRGX01BSk9SCQkxNTAKKyNkZWZpbmUgUkFXX01BSk9SCQkxNjIKKworI2RlZmluZSBVU0JfQUNNX01BSk9SCQkxNjYKKyNkZWZpbmUgVVNCX0FDTV9BVVhfTUFKT1IJMTY3CisjZGVmaW5lIFVTQl9DSEFSX01BSk9SCQkxODAKKworI2RlZmluZSBNTUNfQkxPQ0tfTUFKT1IJCTE3OQorCisjZGVmaW5lIFZYVk1fTUFKT1IJCTE5OQkvKiBWRVJJVEFTIHZvbHVtZSBpL28gZHJpdmVyICAgICovCisjZGVmaW5lIFZYU1BFQ19NQUpPUgkJMjAwCS8qIFZFUklUQVMgdm9sdW1lIGNvbmZpZyBkcml2ZXIgKi8KKyNkZWZpbmUgVlhETVBfTUFKT1IJCTIwMQkvKiBWRVJJVEFTIHZvbHVtZSBtdWx0aXBhdGggZHJpdmVyICovCisKKyNkZWZpbmUgWEVOVkJEX01BSk9SCQkyMDIJLyogWGVuIHZpcnR1YWwgYmxvY2sgZGV2aWNlICovCisKKyNkZWZpbmUgTVNSX01BSk9SCQkyMDIKKyNkZWZpbmUgQ1BVSURfTUFKT1IJCTIwMworCisjZGVmaW5lIE9TU1RfTUFKT1IJCTIwNgkvKiBPblN0cmVhbS1TQ3gwIFNDU0kgdGFwZSAqLworCisjZGVmaW5lIElCTV9UVFkzMjcwX01BSk9SCTIyNworI2RlZmluZSBJQk1fRlMzMjcwX01BSk9SCTIyOAorCisjZGVmaW5lIFZJT1RBUEVfTUFKT1IJCTIzMAorCisjZGVmaW5lIEJMT0NLX0VYVF9NQUpPUgkJMjU5CisjZGVmaW5lIFNDU0lfT1NEX01BSk9SCQkyNjAJLyogb3Blbi1vc2QncyBPU0Qgc2NzaSBkZXZpY2UgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21hcF90b183c2VnbWVudC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tYXBfdG9fN3NlZ21lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmQ2MmE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tYXBfdG9fN3NlZ21lbnQuaApAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBIZW5rIFZlcmdvbmV0IDxIZW5rLlZlcmdvbmV0QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgTUFQX1RPXzdTRUdNRU5UX0gKKyNkZWZpbmUgTUFQX1RPXzdTRUdNRU5UX0gKKworLyogVGhpcyBmaWxlIHByb3ZpZGVzIHRyYW5zbGF0aW9uIHByaW1pdGl2ZXMgYW5kIHRhYmxlcyBmb3IgdGhlIGNvbnZlcnNpb24KKyAqIG9mIChBU0NJSSkgY2hhcmFjdGVycyB0byBhIDctc2VnbWVudHMgbm90YXRpb24uCisgKgorICogVGhlIDcgc2VnbWVudCdzIHdpa2lwZWRpYSBub3RhdGlvbiBiZWxvdyBpcyB1c2VkIGFzIHN0YW5kYXJkLgorICogU2VlOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NldmVuX3NlZ21lbnRfZGlzcGxheQorICoKKyAqIE5vdGF0aW9uOgkrLWEtKworICoJCWYgICBiCisgKgkJKy1nLSsKKyAqCQllICAgYworICoJCSstZC0rCisgKgorICogVXNhZ2U6CisgKgorICogICBSZWdpc3RlciBhIG1hcCB2YXJpYWJsZSwgYW5kIGZpbGwgaXQgd2l0aCBhIGNoYXJhY3RlciBzZXQ6CisgKglzdGF0aWMgU0VHN19ERUZBVUxUX01BUChtYXBfc2VnNyk7CisgKgorICoKKyAqICAgVGhlbiB1c2UgZm9yIGNvbnZlcnNpb246CisgKglzZWc3ID0gbWFwX3RvX3NlZzcoJm1hcF9zZWc3LCBzb21lX2NoYXIpOworICoJLi4uCisgKgorICogSW4gZGV2aWNlIGRyaXZlcnMgaXQgaXMgcmVjb21tZW5kZWQsIGlmIHJlcXVpcmVkLCB0byBtYWtlIHRoZSBjaGFyIG1hcAorICogYWNjZXNzaWJsZSB2aWEgdGhlIHN5c2ZzIGludGVyZmFjZSB1c2luZyB0aGUgZm9sbG93aW5nIHNjaGVtZToKKyAqCisgKiBzdGF0aWMgc3NpemVfdCBzaG93X21hcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgeworICoJbWVtY3B5KGJ1ZiwgJm1hcF9zZWc3LCBzaXplb2YobWFwX3NlZzcpKTsKKyAqCXJldHVybiBzaXplb2YobWFwX3NlZzcpOworICogfQorICogc3RhdGljIHNzaXplX3Qgc3RvcmVfbWFwKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY250KSB7CisgKglpZihjbnQgIT0gc2l6ZW9mKG1hcF9zZWc3KSkKKyAqCQlyZXR1cm4gLUVJTlZBTDsKKyAqCW1lbWNweSgmbWFwX3NlZzcsIGJ1ZiwgY250KTsKKyAqCXJldHVybiBjbnQ7CisgKiB9CisgKiBzdGF0aWMgREVWSUNFX0FUVFIobWFwX3NlZzcsIFBFUk1TX1JXLCBzaG93X21hcCwgc3RvcmVfbWFwKTsKKyAqCisgKiBIaXN0b3J5OgorICogMjAwNS0wNS0zMQlSRkMgbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZworICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworCisjZGVmaW5lIEJJVF9TRUc3X0EJCTAKKyNkZWZpbmUgQklUX1NFRzdfQgkJMQorI2RlZmluZSBCSVRfU0VHN19DCQkyCisjZGVmaW5lIEJJVF9TRUc3X0QJCTMKKyNkZWZpbmUgQklUX1NFRzdfRQkJNAorI2RlZmluZSBCSVRfU0VHN19GCQk1CisjZGVmaW5lIEJJVF9TRUc3X0cJCTYKKyNkZWZpbmUgQklUX1NFRzdfUkVTRVJWRUQJNworCitzdHJ1Y3Qgc2VnN19jb252ZXJzaW9uX21hcCB7CisJdW5zaWduZWQgY2hhcgl0YWJsZVsxMjhdOworfTsKKworc3RhdGljIF9faW5saW5lX18gaW50IG1hcF90b19zZWc3KHN0cnVjdCBzZWc3X2NvbnZlcnNpb25fbWFwICptYXAsIGludCBjKQoreworCXJldHVybiBjID49IDAgJiYgYyA8IHNpemVvZihtYXAtPnRhYmxlKSA/IG1hcC0+dGFibGVbY10gOiAtRUlOVkFMOworfQorCisjZGVmaW5lIFNFRzdfQ09OVkVSU0lPTl9NQVAoX25hbWUsIF9tYXApCVwKKwlzdHJ1Y3Qgc2VnN19jb252ZXJzaW9uX21hcCBfbmFtZSA9IHsgLnRhYmxlID0geyBfbWFwIH0gfQorCisvKgorICogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGEgZmFjaWxpdHkgdGhhdCBhbGxvd3MgdXNlciBzcGFjZSB0byByZWRlZmluZQorICogY3VzdG9tIGNoYXJhY3RlciBzZXRzIGZvciBMQ0QgZGV2aWNlcy4gUGxlYXNlIHVzZSBhIHN5c2ZzIGludGVyZmFjZQorICogYXMgZGVzY3JpYmVkIGFib3ZlLgorICovCisjZGVmaW5lIE1BUF9UT19TRUc3X1NZU0ZTX0ZJTEUJIm1hcF9zZWc3IgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQVNDSUkgY29udmVyc2lvbiB0YWJsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBfU0VHNyhsLGEsYixjLGQsZSxmLGcpCVwKKyAgICAgICgJYTw8QklUX1NFRzdfQSB8CWI8PEJJVF9TRUc3X0IgfAljPDxCSVRfU0VHN19DIHwJZDw8QklUX1NFRzdfRCB8CVwKKwllPDxCSVRfU0VHN19FIHwJZjw8QklUX1NFRzdfRiB8CWc8PEJJVF9TRUc3X0cgKQorCisjZGVmaW5lIF9NQVBfMF8zMl9BU0NJSV9TRUc3X05PTl9QUklOVEFCTEUJXAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCisjZGVmaW5lIF9NQVBfMzNfNDdfQVNDSUlfU0VHN19TWU1CT0wJCVwKKyBfU0VHNygnIScsMCwwLDAsMCwxLDEsMCksIF9TRUc3KCciJywwLDEsMCwwLDAsMSwwKSwgX1NFRzcoJyMnLDAsMSwxLDAsMSwxLDApLFwKKyBfU0VHNygnJCcsMSwwLDEsMSwwLDEsMSksIF9TRUc3KCclJywwLDAsMSwwLDAsMSwwKSwgX1NFRzcoJyYnLDEsMCwxLDEsMSwxLDEpLFwKKyBfU0VHNygnXCcnLDAsMCwwLDAsMCwxLDApLF9TRUc3KCcoJywxLDAsMCwxLDEsMSwwKSwgX1NFRzcoJyknLDEsMSwxLDEsMCwwLDApLFwKKyBfU0VHNygnKicsMCwxLDEsMCwxLDEsMSksIF9TRUc3KCcrJywwLDEsMSwwLDAsMCwxKSwgX1NFRzcoJywnLDAsMCwwLDAsMSwwLDApLFwKKyBfU0VHNygnLScsMCwwLDAsMCwwLDAsMSksIF9TRUc3KCcuJywwLDAsMCwwLDEsMCwwKSwgX1NFRzcoJy8nLDAsMSwwLDAsMSwwLDEpLAorCisjZGVmaW5lIF9NQVBfNDhfNTdfQVNDSUlfU0VHN19OVU1FUklDCQlcCisgX1NFRzcoJzAnLDEsMSwxLDEsMSwxLDApLCBfU0VHNygnMScsMCwxLDEsMCwwLDAsMCksIF9TRUc3KCcyJywxLDEsMCwxLDEsMCwxKSxcCisgX1NFRzcoJzMnLDEsMSwxLDEsMCwwLDEpLCBfU0VHNygnNCcsMCwxLDEsMCwwLDEsMSksIF9TRUc3KCc1JywxLDAsMSwxLDAsMSwxKSxcCisgX1NFRzcoJzYnLDEsMCwxLDEsMSwxLDEpLCBfU0VHNygnNycsMSwxLDEsMCwwLDAsMCksIF9TRUc3KCc4JywxLDEsMSwxLDEsMSwxKSxcCisgX1NFRzcoJzknLDEsMSwxLDEsMCwxLDEpLAorCisjZGVmaW5lIF9NQVBfNThfNjRfQVNDSUlfU0VHN19TWU1CT0wJCVwKKyBfU0VHNygnOicsMCwwLDAsMSwwLDAsMSksIF9TRUc3KCc7JywwLDAsMCwxLDAsMCwxKSwgX1NFRzcoJzwnLDEsMCwwLDAsMCwxLDEpLFwKKyBfU0VHNygnPScsMCwwLDAsMSwwLDAsMSksIF9TRUc3KCc+JywxLDEsMCwwLDAsMCwxKSwgX1NFRzcoJz8nLDEsMSwxLDAsMCwxLDApLFwKKyBfU0VHNygnQCcsMSwxLDAsMSwxLDEsMSksCisKKyNkZWZpbmUgX01BUF82NV85MF9BU0NJSV9TRUc3X0FMUEhBX1VQUFIJXAorIF9TRUc3KCdBJywxLDEsMSwwLDEsMSwxKSwgX1NFRzcoJ0InLDEsMSwxLDEsMSwxLDEpLCBfU0VHNygnQycsMSwwLDAsMSwxLDEsMCksXAorIF9TRUc3KCdEJywxLDEsMSwxLDEsMSwwKSwgX1NFRzcoJ0UnLDEsMCwwLDEsMSwxLDEpLCBfU0VHNygnRicsMSwwLDAsMCwxLDEsMSksXAorIF9TRUc3KCdHJywxLDEsMSwxLDAsMSwxKSwgX1NFRzcoJ0gnLDAsMSwxLDAsMSwxLDEpLCBfU0VHNygnSScsMCwxLDEsMCwwLDAsMCksXAorIF9TRUc3KCdKJywwLDEsMSwxLDAsMCwwKSwgX1NFRzcoJ0snLDAsMSwxLDAsMSwxLDEpLCBfU0VHNygnTCcsMCwwLDAsMSwxLDEsMCksXAorIF9TRUc3KCdNJywxLDEsMSwwLDEsMSwwKSwgX1NFRzcoJ04nLDEsMSwxLDAsMSwxLDApLCBfU0VHNygnTycsMSwxLDEsMSwxLDEsMCksXAorIF9TRUc3KCdQJywxLDEsMCwwLDEsMSwxKSwgX1NFRzcoJ1EnLDEsMSwxLDEsMSwxLDApLCBfU0VHNygnUicsMSwxLDEsMCwxLDEsMSksXAorIF9TRUc3KCdTJywxLDAsMSwxLDAsMSwxKSwgX1NFRzcoJ1QnLDAsMCwwLDEsMSwxLDEpLCBfU0VHNygnVScsMCwxLDEsMSwxLDEsMCksXAorIF9TRUc3KCdWJywwLDEsMSwxLDEsMSwwKSwgX1NFRzcoJ1cnLDAsMSwxLDEsMSwxLDEpLCBfU0VHNygnWCcsMCwxLDEsMCwxLDEsMSksXAorIF9TRUc3KCdZJywwLDEsMSwwLDAsMSwxKSwgX1NFRzcoJ1onLDEsMSwwLDEsMSwwLDEpLAorCisjZGVmaW5lIF9NQVBfOTFfOTZfQVNDSUlfU0VHN19TWU1CT0wJCVwKKyBfU0VHNygnWycsMSwwLDAsMSwxLDEsMCksIF9TRUc3KCdcXCcsMCwwLDEsMCwwLDEsMSksX1NFRzcoJ10nLDEsMSwxLDEsMCwwLDApLFwKKyBfU0VHNygnXicsMSwxLDAsMCwwLDEsMCksIF9TRUc3KCdfJywwLDAsMCwxLDAsMCwwKSwgX1NFRzcoJ2AnLDAsMSwwLDAsMCwwLDApLAorCisjZGVmaW5lIF9NQVBfOTdfMTIyX0FTQ0lJX1NFRzdfQUxQSEFfTE9XRVIJXAorIF9TRUc3KCdBJywxLDEsMSwwLDEsMSwxKSwgX1NFRzcoJ2InLDAsMCwxLDEsMSwxLDEpLCBfU0VHNygnYycsMCwwLDAsMSwxLDAsMSksXAorIF9TRUc3KCdkJywwLDEsMSwxLDEsMCwxKSwgX1NFRzcoJ0UnLDEsMCwwLDEsMSwxLDEpLCBfU0VHNygnRicsMSwwLDAsMCwxLDEsMSksXAorIF9TRUc3KCdHJywxLDEsMSwxLDAsMSwxKSwgX1NFRzcoJ2gnLDAsMCwxLDAsMSwxLDEpLCBfU0VHNygnaScsMCwwLDEsMCwwLDAsMCksXAorIF9TRUc3KCdqJywwLDAsMSwxLDAsMCwwKSwgX1NFRzcoJ2snLDAsMCwxLDAsMSwxLDEpLCBfU0VHNygnTCcsMCwwLDAsMSwxLDEsMCksXAorIF9TRUc3KCdNJywxLDEsMSwwLDEsMSwwKSwgX1NFRzcoJ24nLDAsMCwxLDAsMSwwLDEpLCBfU0VHNygnbycsMCwwLDEsMSwxLDAsMSksXAorIF9TRUc3KCdQJywxLDEsMCwwLDEsMSwxKSwgX1NFRzcoJ3EnLDEsMSwxLDAsMCwxLDEpLCBfU0VHNygncicsMCwwLDAsMCwxLDAsMSksXAorIF9TRUc3KCdTJywxLDAsMSwxLDAsMSwxKSwgX1NFRzcoJ1QnLDAsMCwwLDEsMSwxLDEpLCBfU0VHNygndScsMCwwLDEsMSwxLDAsMCksXAorIF9TRUc3KCd2JywwLDAsMSwxLDEsMCwwKSwgX1NFRzcoJ1cnLDAsMSwxLDEsMSwxLDEpLCBfU0VHNygnWCcsMCwxLDEsMCwxLDEsMSksXAorIF9TRUc3KCd5JywwLDEsMSwxLDAsMSwxKSwgX1NFRzcoJ1onLDEsMSwwLDEsMSwwLDEpLAorCisjZGVmaW5lIF9NQVBfMTIzXzEyNl9BU0NJSV9TRUc3X1NZTUJPTAkJXAorIF9TRUc3KCd7JywxLDAsMCwxLDEsMSwwKSwgX1NFRzcoJ3wnLDAsMCwwLDAsMSwxLDApLCBfU0VHNygnfScsMSwxLDEsMSwwLDAsMCksXAorIF9TRUc3KCd+JywxLDAsMCwwLDAsMCwwKSwKKworLyogTWFwcyAqLworCisvKiBUaGlzIHNldCB0cmllcyB0byBtYXAgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlIHZpc2libGUgY2hhcmFjdGVyaXN0aWNzCisgKiBvZiB0aGUgQVNDSUkgc3ltYm9sLCBsb3dlcmNhc2UgYW5kIHVwcGVyY2FzZSBsZXR0ZXJzIG1heSBkaWZmZXIgaW4KKyAqIHByZXNlbnRhdGlvbiBvbiB0aGUgZGlzcGxheS4KKyAqLworI2RlZmluZSBNQVBfQVNDSUk3U0VHX0FMUEhBTlVNCQkJXAorCV9NQVBfMF8zMl9BU0NJSV9TRUc3X05PTl9QUklOVEFCTEUJXAorCV9NQVBfMzNfNDdfQVNDSUlfU0VHN19TWU1CT0wJCVwKKwlfTUFQXzQ4XzU3X0FTQ0lJX1NFRzdfTlVNRVJJQwkJXAorCV9NQVBfNThfNjRfQVNDSUlfU0VHN19TWU1CT0wJCVwKKwlfTUFQXzY1XzkwX0FTQ0lJX1NFRzdfQUxQSEFfVVBQUglcCisJX01BUF85MV85Nl9BU0NJSV9TRUc3X1NZTUJPTAkJXAorCV9NQVBfOTdfMTIyX0FTQ0lJX1NFRzdfQUxQSEFfTE9XRVIJXAorCV9NQVBfMTIzXzEyNl9BU0NJSV9TRUc3X1NZTUJPTAorCisvKiBUaGlzIHNldCB0cmllcyB0byBtYXAgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlIHN5bWJvbGljIGNoYXJhY3RlcmlzdGljcworICogb2YgdGhlIEFTQ0lJIGNoYXJhY3RlciBmb3IgbWF4aW11bSBkaXNjcmltaW5hdGlvbi4KKyAqIEZvciBub3cgdGhpcyBtZWFucyBhbGwgYWxwaGEgY2hhcnMgYXJlIGluIGxvd2VyIGNhc2UgcmVwcmVzZW50YXRpb25zLgorICogKFRoaXMgZm9yIGV4YW1wbGUgZmFjaWxpdGF0ZXMgdGhlIHVzZSBvZiBoZXggbnVtYmVycyB3aXRoIHVwcGVyY2FzZSBpbnB1dC4pCisgKi8KKyNkZWZpbmUgTUFQX0FTQ0lJN1NFR19BTFBIQU5VTV9MQwkJCVwKKwlfTUFQXzBfMzJfQVNDSUlfU0VHN19OT05fUFJJTlRBQkxFCVwKKwlfTUFQXzMzXzQ3X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCisJX01BUF80OF81N19BU0NJSV9TRUc3X05VTUVSSUMJCVwKKwlfTUFQXzU4XzY0X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCisJX01BUF85N18xMjJfQVNDSUlfU0VHN19BTFBIQV9MT1dFUglcCisJX01BUF85MV85Nl9BU0NJSV9TRUc3X1NZTUJPTAkJXAorCV9NQVBfOTdfMTIyX0FTQ0lJX1NFRzdfQUxQSEFfTE9XRVIJXAorCV9NQVBfMTIzXzEyNl9BU0NJSV9TRUc3X1NZTUJPTAorCisjZGVmaW5lIFNFRzdfREVGQVVMVF9NQVAoX25hbWUpCQlcCisJU0VHN19DT05WRVJTSU9OX01BUChfbmFtZSxNQVBfQVNDSUk3U0VHX0FMUEhBTlVNKQorCisjZW5kaWYJLyogTUFQX1RPXzdTRUdNRU5UX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tYXRyb3hmYi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tYXRyb3hmYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjJhODkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21hdHJveGZiLmgKQEAgLTAsMCArMSw0MiBAQAorI2lmbmRlZiBfX0xJTlVYX01BVFJPWEZCX0hfXworI2RlZmluZSBfX0xJTlVYX01BVFJPWEZCX0hfXworCisjaW5jbHVkZSA8YXNtL2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCitzdHJ1Y3QgbWF0cm94aW9jX291dHB1dF9tb2RlIHsKKwlfX3UzMglvdXRwdXQ7CQkvKiB3aGljaCBvdXRwdXQgKi8KKyNkZWZpbmUgTUFUUk9YRkJfT1VUUFVUX1BSSU1BUlkJCTB4MDAwMAorI2RlZmluZSBNQVRST1hGQl9PVVRQVVRfU0VDT05EQVJZCTB4MDAwMQorI2RlZmluZSBNQVRST1hGQl9PVVRQVVRfREZQCQkweDAwMDIKKwlfX3UzMgltb2RlOwkJLyogd2hpY2ggbW9kZSAqLworI2RlZmluZSBNQVRST1hGQl9PVVRQVVRfTU9ERV9QQUwJMHgwMDAxCisjZGVmaW5lIE1BVFJPWEZCX09VVFBVVF9NT0RFX05UU0MJMHgwMDAyCisjZGVmaW5lIE1BVFJPWEZCX09VVFBVVF9NT0RFX01PTklUT1IJMHgwMDgwCit9OworI2RlZmluZSBNQVRST1hGQl9TRVRfT1VUUFVUX01PREUJX0lPVygnbicsMHhGQSxzaXplX3QpCisjZGVmaW5lIE1BVFJPWEZCX0dFVF9PVVRQVVRfTU9ERQlfSU9XUignbicsMHhGQSxzaXplX3QpCisKKy8qIGJpdGZpZWxkICovCisjZGVmaW5lIE1BVFJPWEZCX09VVFBVVF9DT05OX1BSSU1BUlkJKDEgPDwgTUFUUk9YRkJfT1VUUFVUX1BSSU1BUlkpCisjZGVmaW5lIE1BVFJPWEZCX09VVFBVVF9DT05OX1NFQ09OREFSWQkoMSA8PCBNQVRST1hGQl9PVVRQVVRfU0VDT05EQVJZKQorI2RlZmluZSBNQVRST1hGQl9PVVRQVVRfQ09OTl9ERlAJKDEgPDwgTUFUUk9YRkJfT1VUUFVUX0RGUCkKKy8qIGNvbm5lY3QgdGhlc2Ugb3V0cHV0cyB0byB0aGlzIGZyYW1lYnVmZmVyICovCisjZGVmaW5lIE1BVFJPWEZCX1NFVF9PVVRQVVRfQ09OTkVDVElPTglfSU9XKCduJywweEY4LHNpemVfdCkKKy8qIHdoaWNoIG91dHB1dHMgYXJlIGNvbm5lY3RlZCB0byB0aGlzIGZyYW1lYnVmZmVyICovCisjZGVmaW5lIE1BVFJPWEZCX0dFVF9PVVRQVVRfQ09OTkVDVElPTglfSU9SKCduJywweEY4LHNpemVfdCkKKy8qIHdoaWNoIG91dHB1dHMgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBmcmFtZWJ1ZmZlciAqLworI2RlZmluZSBNQVRST1hGQl9HRVRfQVZBSUxBQkxFX09VVFBVVFMJX0lPUignbicsMHhGOSxzaXplX3QpCisvKiB3aGljaCBvdXRwdXRzIGV4aXN0IG9uIHRoaXMgZnJhbWVidWZmZXIgKi8KKyNkZWZpbmUgTUFUUk9YRkJfR0VUX0FMTF9PVVRQVVRTCV9JT1IoJ24nLDB4RkIsc2l6ZV90KQorCitlbnVtIG1hdHJveGZiX2N0cmxfaWQgeworICBNQVRST1hGQl9DSURfVEVTVE9VVAkgPSBWNEwyX0NJRF9QUklWQVRFX0JBU0UsCisgIE1BVFJPWEZCX0NJRF9ERUZMSUNLRVIsCisgIE1BVFJPWEZCX0NJRF9MQVNUCit9OworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tZWRpYS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tZWRpYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMGU3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21lZGlhLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBNdWx0aW1lZGlhIGRldmljZSBBUEkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBDb250YWN0czogTGF1cmVudCBQaW5jaGFydCA8bGF1cmVudC5waW5jaGFydEBpZGVhc29uYm9hcmQuY29tPgorICoJICAgICBTYWthcmkgQWlsdXMgPHNha2FyaS5haWx1c0Bpa2kuZmk+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX19MSU5VWF9NRURJQV9ICisjZGVmaW5lIF9fTElOVVhfTUVESUFfSAorCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2RlZmluZSBNRURJQV9BUElfVkVSU0lPTglLRVJORUxfVkVSU0lPTigwLCAxLCAwKQorCitzdHJ1Y3QgbWVkaWFfZGV2aWNlX2luZm8geworCWNoYXIgZHJpdmVyWzE2XTsKKwljaGFyIG1vZGVsWzMyXTsKKwljaGFyIHNlcmlhbFs0MF07CisJY2hhciBidXNfaW5mb1szMl07CisJX191MzIgbWVkaWFfdmVyc2lvbjsKKwlfX3UzMiBod19yZXZpc2lvbjsKKwlfX3UzMiBkcml2ZXJfdmVyc2lvbjsKKwlfX3UzMiByZXNlcnZlZFszMV07Cit9OworCisjZGVmaW5lIE1FRElBX0VOVF9JRF9GTEFHX05FWFQJCSgxIDw8IDMxKQorCisjZGVmaW5lIE1FRElBX0VOVF9UWVBFX1NISUZUCQkxNgorI2RlZmluZSBNRURJQV9FTlRfVFlQRV9NQVNLCQkweDAwZmYwMDAwCisjZGVmaW5lIE1FRElBX0VOVF9TVUJUWVBFX01BU0sJCTB4MDAwMGZmZmYKKworI2RlZmluZSBNRURJQV9FTlRfVF9ERVZOT0RFCQkoMSA8PCBNRURJQV9FTlRfVFlQRV9TSElGVCkKKyNkZWZpbmUgTUVESUFfRU5UX1RfREVWTk9ERV9WNEwJCShNRURJQV9FTlRfVF9ERVZOT0RFICsgMSkKKyNkZWZpbmUgTUVESUFfRU5UX1RfREVWTk9ERV9GQgkJKE1FRElBX0VOVF9UX0RFVk5PREUgKyAyKQorI2RlZmluZSBNRURJQV9FTlRfVF9ERVZOT0RFX0FMU0EJKE1FRElBX0VOVF9UX0RFVk5PREUgKyAzKQorI2RlZmluZSBNRURJQV9FTlRfVF9ERVZOT0RFX0RWQgkJKE1FRElBX0VOVF9UX0RFVk5PREUgKyA0KQorCisjZGVmaW5lIE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWCQkoMiA8PCBNRURJQV9FTlRfVFlQRV9TSElGVCkKKyNkZWZpbmUgTUVESUFfRU5UX1RfVjRMMl9TVUJERVZfU0VOU09SCShNRURJQV9FTlRfVF9WNEwyX1NVQkRFViArIDEpCisjZGVmaW5lIE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWX0ZMQVNICShNRURJQV9FTlRfVF9WNEwyX1NVQkRFViArIDIpCisjZGVmaW5lIE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWX0xFTlMJKE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWICsgMykKKworI2RlZmluZSBNRURJQV9FTlRfRkxfREVGQVVMVAkJKDEgPDwgMCkKKworc3RydWN0IG1lZGlhX2VudGl0eV9kZXNjIHsKKwlfX3UzMiBpZDsKKwljaGFyIG5hbWVbMzJdOworCV9fdTMyIHR5cGU7CisJX191MzIgcmV2aXNpb247CisJX191MzIgZmxhZ3M7CisJX191MzIgZ3JvdXBfaWQ7CisJX191MTYgcGFkczsKKwlfX3UxNiBsaW5rczsKKworCV9fdTMyIHJlc2VydmVkWzRdOworCisJdW5pb24geworCQkvKiBOb2RlIHNwZWNpZmljYXRpb25zICovCisJCXN0cnVjdCB7CisJCQlfX3UzMiBtYWpvcjsKKwkJCV9fdTMyIG1pbm9yOworCQl9IHY0bDsKKwkJc3RydWN0IHsKKwkJCV9fdTMyIG1ham9yOworCQkJX191MzIgbWlub3I7CisJCX0gZmI7CisJCXN0cnVjdCB7CisJCQlfX3UzMiBjYXJkOworCQkJX191MzIgZGV2aWNlOworCQkJX191MzIgc3ViZGV2aWNlOworCQl9IGFsc2E7CisJCWludCBkdmI7CisKKwkJLyogU3ViLWRldmljZSBzcGVjaWZpY2F0aW9ucyAqLworCQkvKiBOb3RoaW5nIG5lZWRlZCB5ZXQgKi8KKwkJX191OCByYXdbMTg0XTsKKwl9OworfTsKKworI2RlZmluZSBNRURJQV9QQURfRkxfU0lOSwkJKDEgPDwgMCkKKyNkZWZpbmUgTUVESUFfUEFEX0ZMX1NPVVJDRQkJKDEgPDwgMSkKKworc3RydWN0IG1lZGlhX3BhZF9kZXNjIHsKKwlfX3UzMiBlbnRpdHk7CQkvKiBlbnRpdHkgSUQgKi8KKwlfX3UxNiBpbmRleDsJCS8qIHBhZCBpbmRleCAqLworCV9fdTMyIGZsYWdzOwkJLyogcGFkIGZsYWdzICovCisJX191MzIgcmVzZXJ2ZWRbMl07Cit9OworCisjZGVmaW5lIE1FRElBX0xOS19GTF9FTkFCTEVECQkoMSA8PCAwKQorI2RlZmluZSBNRURJQV9MTktfRkxfSU1NVVRBQkxFCQkoMSA8PCAxKQorI2RlZmluZSBNRURJQV9MTktfRkxfRFlOQU1JQwkJKDEgPDwgMikKKworc3RydWN0IG1lZGlhX2xpbmtfZGVzYyB7CisJc3RydWN0IG1lZGlhX3BhZF9kZXNjIHNvdXJjZTsKKwlzdHJ1Y3QgbWVkaWFfcGFkX2Rlc2Mgc2luazsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiByZXNlcnZlZFsyXTsKK307CisKK3N0cnVjdCBtZWRpYV9saW5rc19lbnVtIHsKKwlfX3UzMiBlbnRpdHk7CisJLyogU2hvdWxkIGhhdmUgZW5vdWdoIHJvb20gZm9yIHBhZHMgZWxlbWVudHMgKi8KKwlzdHJ1Y3QgbWVkaWFfcGFkX2Rlc2MgKnBhZHM7CisJLyogU2hvdWxkIGhhdmUgZW5vdWdoIHJvb20gZm9yIGxpbmtzIGVsZW1lbnRzICovCisJc3RydWN0IG1lZGlhX2xpbmtfZGVzYyAqbGlua3M7CisJX191MzIgcmVzZXJ2ZWRbNF07Cit9OworCisjZGVmaW5lIE1FRElBX0lPQ19ERVZJQ0VfSU5GTwkJX0lPV1IoJ3wnLCAweDAwLCBzdHJ1Y3QgbWVkaWFfZGV2aWNlX2luZm8pCisjZGVmaW5lIE1FRElBX0lPQ19FTlVNX0VOVElUSUVTCQlfSU9XUignfCcsIDB4MDEsIHN0cnVjdCBtZWRpYV9lbnRpdHlfZGVzYykKKyNkZWZpbmUgTUVESUFfSU9DX0VOVU1fTElOS1MJCV9JT1dSKCd8JywgMHgwMiwgc3RydWN0IG1lZGlhX2xpbmtzX2VudW0pCisjZGVmaW5lIE1FRElBX0lPQ19TRVRVUF9MSU5LCQlfSU9XUignfCcsIDB4MDMsIHN0cnVjdCBtZWRpYV9saW5rX2Rlc2MpCisKKyNlbmRpZiAvKiBfX0xJTlVYX01FRElBX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMzc1N2EKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCkBAIC0wLDAgKzEsNjQgQEAKKyNpZm5kZWYgX0xJTlVYX01FTVBPTElDWV9ICisjZGVmaW5lIF9MSU5VWF9NRU1QT0xJQ1lfSCAxCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisvKgorICogTlVNQSBtZW1vcnkgcG9saWNpZXMgZm9yIExpbnV4LgorICogQ29weXJpZ2h0IDIwMDMsMjAwNCBBbmRpIEtsZWVuIFN1U0UgTGFicworICovCisKKy8qCisgKiBCb3RoIHRoZSBNUE9MXyogbWVtcG9saWN5IG1vZGUgYW5kIHRoZSBNUE9MX0ZfKiBvcHRpb25hbCBtb2RlIGZsYWdzIGFyZQorICogcGFzc2VkIGJ5IHRoZSB1c2VyIHRvIGVpdGhlciBzZXRfbWVtcG9saWN5KCkgb3IgbWJpbmQoKSBpbiBhbiAnaW50JyBhY3R1YWwuCisgKiBUaGUgTVBPTF9NT0RFX0ZMQUdTIG1hY3JvIGRldGVybWluZXMgdGhlIGxlZ2FsIHNldCBvZiBvcHRpb25hbCBtb2RlIGZsYWdzLgorICovCisKKy8qIFBvbGljaWVzICovCitlbnVtIHsKKwlNUE9MX0RFRkFVTFQsCisJTVBPTF9QUkVGRVJSRUQsCisJTVBPTF9CSU5ELAorCU1QT0xfSU5URVJMRUFWRSwKKwlNUE9MX01BWCwJLyogYWx3YXlzIGxhc3QgbWVtYmVyIG9mIGVudW0gKi8KK307CisKK2VudW0gbXBvbF9yZWJpbmRfc3RlcCB7CisJTVBPTF9SRUJJTkRfT05DRSwJLyogZG8gcmViaW5kIHdvcmsgYXQgb25jZShub3QgYnkgdHdvIHN0ZXApICovCisJTVBPTF9SRUJJTkRfU1RFUDEsCS8qIGZpcnN0IHN0ZXAoc2V0IGFsbCB0aGUgbmV3bHkgbm9kZXMpICovCisJTVBPTF9SRUJJTkRfU1RFUDIsCS8qIHNlY29uZCBzdGVwKGNsZWFuIGFsbCB0aGUgZGlzYWxsb3dlZCBub2RlcykqLworCU1QT0xfUkVCSU5EX05TVEVQLAorfTsKKworLyogRmxhZ3MgZm9yIHNldF9tZW1wb2xpY3kgKi8KKyNkZWZpbmUgTVBPTF9GX1NUQVRJQ19OT0RFUwkoMSA8PCAxNSkKKyNkZWZpbmUgTVBPTF9GX1JFTEFUSVZFX05PREVTCSgxIDw8IDE0KQorCisvKgorICogTVBPTF9NT0RFX0ZMQUdTIGlzIHRoZSB1bmlvbiBvZiBhbGwgcG9zc2libGUgb3B0aW9uYWwgbW9kZSBmbGFncyBwYXNzZWQgdG8KKyAqIGVpdGhlciBzZXRfbWVtcG9saWN5KCkgb3IgbWJpbmQoKS4KKyAqLworI2RlZmluZSBNUE9MX01PREVfRkxBR1MJKE1QT0xfRl9TVEFUSUNfTk9ERVMgfCBNUE9MX0ZfUkVMQVRJVkVfTk9ERVMpCisKKy8qIEZsYWdzIGZvciBnZXRfbWVtcG9saWN5ICovCisjZGVmaW5lIE1QT0xfRl9OT0RFCSgxPDwwKQkvKiByZXR1cm4gbmV4dCBJTCBtb2RlIGluc3RlYWQgb2Ygbm9kZSBtYXNrICovCisjZGVmaW5lIE1QT0xfRl9BRERSCSgxPDwxKQkvKiBsb29rIHVwIHZtYSB1c2luZyBhZGRyZXNzICovCisjZGVmaW5lIE1QT0xfRl9NRU1TX0FMTE9XRUQgKDE8PDIpIC8qIHJldHVybiBhbGxvd2VkIG1lbW9yaWVzICovCisKKy8qIEZsYWdzIGZvciBtYmluZCAqLworI2RlZmluZSBNUE9MX01GX1NUUklDVAkoMTw8MCkJLyogVmVyaWZ5IGV4aXN0aW5nIHBhZ2VzIGluIHRoZSBtYXBwaW5nICovCisjZGVmaW5lIE1QT0xfTUZfTU9WRQkoMTw8MSkJLyogTW92ZSBwYWdlcyBvd25lZCBieSB0aGlzIHByb2Nlc3MgdG8gY29uZm9ybSB0byBtYXBwaW5nICovCisjZGVmaW5lIE1QT0xfTUZfTU9WRV9BTEwgKDE8PDIpCS8qIE1vdmUgZXZlcnkgcGFnZSB0byBjb25mb3JtIHRvIG1hcHBpbmcgKi8KKyNkZWZpbmUgTVBPTF9NRl9JTlRFUk5BTCAoMTw8MykJLyogSW50ZXJuYWwgZmxhZ3Mgc3RhcnQgaGVyZSAqLworCisvKgorICogSW50ZXJuYWwgZmxhZ3MgdGhhdCBzaGFyZSB0aGUgc3RydWN0IG1lbXBvbGljeSBmbGFncyB3b3JkIHdpdGgKKyAqICJtb2RlIGZsYWdzIi4gIFRoZXNlIGZsYWdzIGFyZSBhbGxvY2F0ZWQgZnJvbSBiaXQgMCB1cCwgYXMgdGhleQorICogYXJlIG5ldmVyIE9SJ2VkIGludG8gdGhlIG1vZGUgaW4gbWVtcG9saWN5IEFQSSBhcmd1bWVudHMuCisgKi8KKyNkZWZpbmUgTVBPTF9GX1NIQVJFRCAgKDEgPDwgMCkJLyogaWRlbnRpZnkgc2hhcmVkIHBvbGljaWVzICovCisjZGVmaW5lIE1QT0xfRl9MT0NBTCAgICgxIDw8IDEpCS8qIHByZWZlcnJlZCBsb2NhbCBhbGxvY2F0aW9uICovCisjZGVmaW5lIE1QT0xfRl9SRUJJTkRJTkcgKDEgPDwgMikJLyogaWRlbnRpZnkgcG9saWNpZXMgaW4gcmViaW5kaW5nICovCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21leWUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWV5ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZDQ5OTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21leWUuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogTW90aW9uIEV5ZSB2aWRlbzRsaW51eCBkcml2ZXIgZm9yIFNvbnkgVmFpbyBQaWN0dXJlQm9vaworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFN0ZWxpYW4gUG9wIDxzdGVsaWFuQHBvcGllcy5uZXQ+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgQWxjw7R2ZSA8d3d3LmFsY292ZS5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIEFuZHJldyBUcmlkZ2VsbCA8dHJpZGdlQHZhbGludXguY29tPgorICoKKyAqIEVhcmxpZXIgd29yayBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIFBhdWwgYFJ1c3R5JyBSdXNzZWxsIGFuZCBQYXVsIE1hY2tlcnJhcy4KKyAqCisgKiBTb21lIHBhcnRzIGJvcnJvd2VkIGZyb20gdmFyaW91cyB2aWRlbzRsaW51eCBkcml2ZXJzLCBlc3BlY2lhbGx5CisgKiBidHR2LWRyaXZlci5jIGFuZCB6b3Jhbi5jLCBzZWUgb3JpZ2luYWwgZmlsZXMgZm9yIGNyZWRpdHMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUVZRV9IXworI2RlZmluZSBfTUVZRV9IXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFByaXZhdGUgQVBJIGZvciBoYW5kbGluZyBtanBlZyBjYXB0dXJlIC8gcGxheWJhY2suICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBtZXllX3BhcmFtcyB7CisJdW5zaWduZWQgY2hhciBzdWJzYW1wbGU7CisJdW5zaWduZWQgY2hhciBxdWFsaXR5OworCXVuc2lnbmVkIGNoYXIgc2hhcnBuZXNzOworCXVuc2lnbmVkIGNoYXIgYWdjOworCXVuc2lnbmVkIGNoYXIgcGljdHVyZTsKKwl1bnNpZ25lZCBjaGFyIGZyYW1lcmF0ZTsKK307CisKKy8qIHF1ZXJ5IHRoZSBleHRlbmRlZCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIE1FWUVJT0NfR19QQVJBTVMJX0lPUiAoJ3YnLCBCQVNFX1ZJRElPQ19QUklWQVRFKzAsIHN0cnVjdCBtZXllX3BhcmFtcykKKy8qIHNldCB0aGUgZXh0ZW5kZWQgcGFyYW1ldGVycyAqLworI2RlZmluZSBNRVlFSU9DX1NfUEFSQU1TCV9JT1cgKCd2JywgQkFTRV9WSURJT0NfUFJJVkFURSsxLCBzdHJ1Y3QgbWV5ZV9wYXJhbXMpCisvKiBxdWV1ZSBhIGJ1ZmZlciBmb3IgbWpwZWcgY2FwdHVyZSAqLworI2RlZmluZSBNRVlFSU9DX1FCVUZfQ0FQVAlfSU9XICgndicsIEJBU0VfVklESU9DX1BSSVZBVEUrMiwgaW50KQorLyogc3luYyBhIHByZXZpb3VzbHkgcXVldWVkIG1qcGVnIGJ1ZmZlciAqLworI2RlZmluZSBNRVlFSU9DX1NZTkMJCV9JT1dSKCd2JywgQkFTRV9WSURJT0NfUFJJVkFURSszLCBpbnQpCisvKiBnZXQgYSBzdGlsbCB1bmNvbXByZXNzZWQgc25hcHNob3QgKi8KKyNkZWZpbmUgTUVZRUlPQ19TVElMTENBUFQJX0lPICAoJ3YnLCBCQVNFX1ZJRElPQ19QUklWQVRFKzQpCisvKiBnZXQgYSBqcGVnIGNvbXByZXNzZWQgc25hcHNob3QgKi8KKyNkZWZpbmUgTUVZRUlPQ19TVElMTEpDQVBUCV9JT1IgKCd2JywgQkFTRV9WSURJT0NfUFJJVkFURSs1LCBpbnQpCisKKy8qIFY0TDIgcHJpdmF0ZSBjb250cm9scyAqLworI2RlZmluZSBWNEwyX0NJRF9BR0MJCVY0TDJfQ0lEX1BSSVZBVEVfQkFTRQorI2RlZmluZSBWNEwyX0NJRF9NRVlFX1NIQVJQTkVTUwkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMSkKKyNkZWZpbmUgVjRMMl9DSURfUElDVFVSRQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMikKKyNkZWZpbmUgVjRMMl9DSURfSlBFR1FVQUwJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDMpCisjZGVmaW5lIFY0TDJfQ0lEX0ZSQU1FUkFURQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21paS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9taWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWY1NTNhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9taWkuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIGxpbnV4L21paS5oOiBkZWZpbml0aW9ucyBmb3IgTUlJLWNvbXBhdGlibGUgdHJhbnNjZWl2ZXJzCisgKiBPcmlnaW5hbGx5IGRyaXZlcnMvbmV0L3N1bmhtZS5oLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSwgMjAwMSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01JSV9IX18KKyNkZWZpbmUgX19MSU5VWF9NSUlfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBHZW5lcmljIE1JSSByZWdpc3RlcnMuICovCisjZGVmaW5lIE1JSV9CTUNSCQkweDAwCS8qIEJhc2ljIG1vZGUgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBNSUlfQk1TUgkJMHgwMQkvKiBCYXNpYyBtb2RlIHN0YXR1cyByZWdpc3RlciAgKi8KKyNkZWZpbmUgTUlJX1BIWVNJRDEJCTB4MDIJLyogUEhZUyBJRCAxICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9QSFlTSUQyCQkweDAzCS8qIFBIWVMgSUQgMiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNSUlfQURWRVJUSVNFCQkweDA0CS8qIEFkdmVydGlzZW1lbnQgY29udHJvbCByZWcgICAqLworI2RlZmluZSBNSUlfTFBBCQkJMHgwNQkvKiBMaW5rIHBhcnRuZXIgYWJpbGl0eSByZWcgICAgKi8KKyNkZWZpbmUgTUlJX0VYUEFOU0lPTgkJMHgwNgkvKiBFeHBhbnNpb24gcmVnaXN0ZXIgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX0NUUkwxMDAwCQkweDA5CS8qIDEwMDBCQVNFLVQgY29udHJvbCAgICAgICAgICAqLworI2RlZmluZSBNSUlfU1RBVDEwMDAJCTB4MGEJLyogMTAwMEJBU0UtVCBzdGF0dXMgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9FU1RBVFVTCQkweDBmCS8qIEV4dGVuZGVkIFN0YXR1cyAgICAgICAgICAgICAqLworI2RlZmluZSBNSUlfRENPVU5URVIJCTB4MTIJLyogRGlzY29ubmVjdCBjb3VudGVyICAgICAgICAgICovCisjZGVmaW5lIE1JSV9GQ1NDT1VOVEVSCQkweDEzCS8qIEZhbHNlIGNhcnJpZXIgY291bnRlciAgICAgICAqLworI2RlZmluZSBNSUlfTldBWVRFU1QJCTB4MTQJLyogTi13YXkgYXV0by1uZWcgdGVzdCByZWcgICAgICovCisjZGVmaW5lIE1JSV9SRVJSQ09VTlRFUgkJMHgxNQkvKiBSZWNlaXZlIGVycm9yIGNvdW50ZXIgICAgICAgKi8KKyNkZWZpbmUgTUlJX1NSRVZJU0lPTgkJMHgxNgkvKiBTaWxpY29uIHJldmlzaW9uICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX1JFU1YxCQkweDE3CS8qIFJlc2VydmVkLi4uICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNSUlfTEJSRVJST1IJCTB4MTgJLyogTHBiYWNrLCByeCwgYnlwYXNzIGVycm9yICAgICovCisjZGVmaW5lIE1JSV9QSFlBRERSCQkweDE5CS8qIFBIWSBhZGRyZXNzICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNSUlfUkVTVjIJCTB4MWEJLyogUmVzZXJ2ZWQuLi4gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9UUElTVEFUVVMJCTB4MWIJLyogVFBJIHN0YXR1cyBmb3IgMTBtYnBzICAgICAgICovCisjZGVmaW5lIE1JSV9OQ09ORklHCQkweDFjCS8qIE5ldHdvcmsgaW50ZXJmYWNlIGNvbmZpZyAgICAqLworCisvKiBCYXNpYyBtb2RlIGNvbnRyb2wgcmVnaXN0ZXIuICovCisjZGVmaW5lIEJNQ1JfUkVTVgkJMHgwMDNmCS8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUNSX1NQRUVEMTAwMAkJMHgwMDQwCS8qIE1TQiBvZiBTcGVlZCAoMTAwMCkgICAgICAgICAqLworI2RlZmluZSBCTUNSX0NUU1QJCTB4MDA4MAkvKiBDb2xsaXNpb24gdGVzdCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1DUl9GVUxMRFBMWAkJMHgwMTAwCS8qIEZ1bGwgZHVwbGV4ICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUNSX0FOUkVTVEFSVAkJMHgwMjAwCS8qIEF1dG8gbmVnb3RpYXRpb24gcmVzdGFydCAgICAqLworI2RlZmluZSBCTUNSX0lTT0xBVEUJCTB4MDQwMAkvKiBJc29sYXRlIGRhdGEgcGF0aHMgZnJvbSBNSUkgKi8KKyNkZWZpbmUgQk1DUl9QRE9XTgkJMHgwODAwCS8qIEVuYWJsZSBsb3cgcG93ZXIgc3RhdGUgICAgICAqLworI2RlZmluZSBCTUNSX0FORU5BQkxFCQkweDEwMDAJLyogRW5hYmxlIGF1dG8gbmVnb3RpYXRpb24gICAgICovCisjZGVmaW5lIEJNQ1JfU1BFRUQxMDAJCTB4MjAwMAkvKiBTZWxlY3QgMTAwTWJwcyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1DUl9MT09QQkFDSwkJMHg0MDAwCS8qIFRYRCBsb29wYmFjayBiaXRzICAgICAgICAgICAqLworI2RlZmluZSBCTUNSX1JFU0VUCQkweDgwMDAJLyogUmVzZXQgdG8gZGVmYXVsdCBzdGF0ZSAgICAgICovCisKKy8qIEJhc2ljIG1vZGUgc3RhdHVzIHJlZ2lzdGVyLiAqLworI2RlZmluZSBCTVNSX0VSQ0FQCQkweDAwMDEJLyogRXh0LXJlZyBjYXBhYmlsaXR5ICAgICAgICAgICovCisjZGVmaW5lIEJNU1JfSkNECQkweDAwMDIJLyogSmFiYmVyIGRldGVjdGVkICAgICAgICAgICAgICovCisjZGVmaW5lIEJNU1JfTFNUQVRVUwkJMHgwMDA0CS8qIExpbmsgc3RhdHVzICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTVNSX0FORUdDQVBBQkxFCTB4MDAwOAkvKiBBYmxlIHRvIGRvIGF1dG8tbmVnb3RpYXRpb24gKi8KKyNkZWZpbmUgQk1TUl9SRkFVTFQJCTB4MDAxMAkvKiBSZW1vdGUgZmF1bHQgZGV0ZWN0ZWQgICAgICAgKi8KKyNkZWZpbmUgQk1TUl9BTkVHQ09NUExFVEUJMHgwMDIwCS8qIEF1dG8tbmVnb3RpYXRpb24gY29tcGxldGUgICAqLworI2RlZmluZSBCTVNSX1JFU1YJCTB4MDBjMAkvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1TUl9FU1RBVEVOCQkweDAxMDAJLyogRXh0ZW5kZWQgU3RhdHVzIGluIFIxNSAgICAgICovCisjZGVmaW5lIEJNU1JfMTAwSEFMRjIJCTB4MDIwMAkvKiBDYW4gZG8gMTAwQkFTRS1UMiBIRFggICAgICAgKi8KKyNkZWZpbmUgQk1TUl8xMDBGVUxMMgkJMHgwNDAwCS8qIENhbiBkbyAxMDBCQVNFLVQyIEZEWCAgICAgICAqLworI2RlZmluZSBCTVNSXzEwSEFMRgkJMHgwODAwCS8qIENhbiBkbyAxMG1icHMsIGhhbGYtZHVwbGV4ICAqLworI2RlZmluZSBCTVNSXzEwRlVMTAkJMHgxMDAwCS8qIENhbiBkbyAxMG1icHMsIGZ1bGwtZHVwbGV4ICAqLworI2RlZmluZSBCTVNSXzEwMEhBTEYJCTB4MjAwMAkvKiBDYW4gZG8gMTAwbWJwcywgaGFsZi1kdXBsZXggKi8KKyNkZWZpbmUgQk1TUl8xMDBGVUxMCQkweDQwMDAJLyogQ2FuIGRvIDEwMG1icHMsIGZ1bGwtZHVwbGV4ICovCisjZGVmaW5lIEJNU1JfMTAwQkFTRTQJCTB4ODAwMAkvKiBDYW4gZG8gMTAwbWJwcywgNGsgcGFja2V0cyAgKi8KKworLyogQWR2ZXJ0aXNlbWVudCBjb250cm9sIHJlZ2lzdGVyLiAqLworI2RlZmluZSBBRFZFUlRJU0VfU0xDVAkJMHgwMDFmCS8qIFNlbGVjdG9yIGJpdHMgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRFZFUlRJU0VfQ1NNQQkJMHgwMDAxCS8qIE9ubHkgc2VsZWN0b3Igc3VwcG9ydGVkICAgICAqLworI2RlZmluZSBBRFZFUlRJU0VfMTBIQUxGCTB4MDAyMAkvKiBUcnkgZm9yIDEwbWJwcyBoYWxmLWR1cGxleCAgKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMDBYRlVMTAkweDAwMjAJLyogVHJ5IGZvciAxMDAwQkFTRS1YIGZ1bGwtZHVwbGV4ICovCisjZGVmaW5lIEFEVkVSVElTRV8xMEZVTEwJMHgwMDQwCS8qIFRyeSBmb3IgMTBtYnBzIGZ1bGwtZHVwbGV4ICAqLworI2RlZmluZSBBRFZFUlRJU0VfMTAwMFhIQUxGCTB4MDA0MAkvKiBUcnkgZm9yIDEwMDBCQVNFLVggaGFsZi1kdXBsZXggKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMEhBTEYJMHgwMDgwCS8qIFRyeSBmb3IgMTAwbWJwcyBoYWxmLWR1cGxleCAqLworI2RlZmluZSBBRFZFUlRJU0VfMTAwMFhQQVVTRQkweDAwODAJLyogVHJ5IGZvciAxMDAwQkFTRS1YIHBhdXNlICAgICovCisjZGVmaW5lIEFEVkVSVElTRV8xMDBGVUxMCTB4MDEwMAkvKiBUcnkgZm9yIDEwMG1icHMgZnVsbC1kdXBsZXggKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMDBYUFNFX0FTWU0JMHgwMTAwCS8qIFRyeSBmb3IgMTAwMEJBU0UtWCBhc3ltIHBhdXNlICovCisjZGVmaW5lIEFEVkVSVElTRV8xMDBCQVNFNAkweDAyMDAJLyogVHJ5IGZvciAxMDBtYnBzIDRrIHBhY2tldHMgICovCisjZGVmaW5lIEFEVkVSVElTRV9QQVVTRV9DQVAJMHgwNDAwCS8qIFRyeSBmb3IgcGF1c2UgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRFZFUlRJU0VfUEFVU0VfQVNZTQkweDA4MDAJLyogVHJ5IGZvciBhc3ltZXRyaWMgcGF1c2UgICAgICovCisjZGVmaW5lIEFEVkVSVElTRV9SRVNWCQkweDEwMDAJLyogVW51c2VkLi4uICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEVkVSVElTRV9SRkFVTFQJMHgyMDAwCS8qIFNheSB3ZSBjYW4gZGV0ZWN0IGZhdWx0cyAgICAqLworI2RlZmluZSBBRFZFUlRJU0VfTFBBQ0sJCTB4NDAwMAkvKiBBY2sgbGluayBwYXJ0bmVycyByZXNwb25zZSAgKi8KKyNkZWZpbmUgQURWRVJUSVNFX05QQUdFCQkweDgwMDAJLyogTmV4dCBwYWdlIGJpdCAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQURWRVJUSVNFX0ZVTEwJCShBRFZFUlRJU0VfMTAwRlVMTCB8IEFEVkVSVElTRV8xMEZVTEwgfCBcCisJCQkJICBBRFZFUlRJU0VfQ1NNQSkKKyNkZWZpbmUgQURWRVJUSVNFX0FMTAkJKEFEVkVSVElTRV8xMEhBTEYgfCBBRFZFUlRJU0VfMTBGVUxMIHwgXAorCQkJCSAgQURWRVJUSVNFXzEwMEhBTEYgfCBBRFZFUlRJU0VfMTAwRlVMTCkKKworLyogTGluayBwYXJ0bmVyIGFiaWxpdHkgcmVnaXN0ZXIuICovCisjZGVmaW5lIExQQV9TTENUCQkweDAwMWYJLyogU2FtZSBhcyBhZHZlcnRpc2Ugc2VsZWN0b3IgICovCisjZGVmaW5lIExQQV8xMEhBTEYJCTB4MDAyMAkvKiBDYW4gZG8gMTBtYnBzIGhhbGYtZHVwbGV4ICAgKi8KKyNkZWZpbmUgTFBBXzEwMDBYRlVMTAkJMHgwMDIwCS8qIENhbiBkbyAxMDAwQkFTRS1YIGZ1bGwtZHVwbGV4ICovCisjZGVmaW5lIExQQV8xMEZVTEwJCTB4MDA0MAkvKiBDYW4gZG8gMTBtYnBzIGZ1bGwtZHVwbGV4ICAgKi8KKyNkZWZpbmUgTFBBXzEwMDBYSEFMRgkJMHgwMDQwCS8qIENhbiBkbyAxMDAwQkFTRS1YIGhhbGYtZHVwbGV4ICovCisjZGVmaW5lIExQQV8xMDBIQUxGCQkweDAwODAJLyogQ2FuIGRvIDEwMG1icHMgaGFsZi1kdXBsZXggICovCisjZGVmaW5lIExQQV8xMDAwWFBBVVNFCQkweDAwODAJLyogQ2FuIGRvIDEwMDBCQVNFLVggcGF1c2UgICAgICovCisjZGVmaW5lIExQQV8xMDBGVUxMCQkweDAxMDAJLyogQ2FuIGRvIDEwMG1icHMgZnVsbC1kdXBsZXggICovCisjZGVmaW5lIExQQV8xMDAwWFBBVVNFX0FTWU0JMHgwMTAwCS8qIENhbiBkbyAxMDAwQkFTRS1YIHBhdXNlIGFzeW0qLworI2RlZmluZSBMUEFfMTAwQkFTRTQJCTB4MDIwMAkvKiBDYW4gZG8gMTAwbWJwcyA0ayBwYWNrZXRzICAgKi8KKyNkZWZpbmUgTFBBX1BBVVNFX0NBUAkJMHgwNDAwCS8qIENhbiBwYXVzZSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMUEFfUEFVU0VfQVNZTQkJMHgwODAwCS8qIENhbiBwYXVzZSBhc3ltZXRyaWNhbGx5ICAgICAqLworI2RlZmluZSBMUEFfUkVTVgkJMHgxMDAwCS8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMUEFfUkZBVUxUCQkweDIwMDAJLyogTGluayBwYXJ0bmVyIGZhdWx0ZWQgICAgICAgICovCisjZGVmaW5lIExQQV9MUEFDSwkJMHg0MDAwCS8qIExpbmsgcGFydG5lciBhY2tlZCB1cyAgICAgICAqLworI2RlZmluZSBMUEFfTlBBR0UJCTB4ODAwMAkvKiBOZXh0IHBhZ2UgYml0ICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBMUEFfRFVQTEVYCQkoTFBBXzEwRlVMTCB8IExQQV8xMDBGVUxMKQorI2RlZmluZSBMUEFfMTAwCQkJKExQQV8xMDBGVUxMIHwgTFBBXzEwMEhBTEYgfCBMUEFfMTAwQkFTRTQpCisKKy8qIEV4cGFuc2lvbiByZWdpc3RlciBmb3IgYXV0by1uZWdvdGlhdGlvbi4gKi8KKyNkZWZpbmUgRVhQQU5TSU9OX05XQVkJCTB4MDAwMQkvKiBDYW4gZG8gTi13YXkgYXV0by1uZWdvICAgICAgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX0xDV1AJCTB4MDAwMgkvKiBHb3QgbmV3IFJYIHBhZ2UgY29kZSB3b3JkICAgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX0VOQUJMRU5QQUdFCTB4MDAwNAkvKiBUaGlzIGVuYWJsZXMgbnBhZ2Ugd29yZHMgICAgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX05QQ0FQQUJMRQkweDAwMDgJLyogTGluayBwYXJ0bmVyIHN1cHBvcnRzIG5wYWdlICovCisjZGVmaW5lIEVYUEFOU0lPTl9NRkFVTFRTCTB4MDAxMAkvKiBNdWx0aXBsZSBmYXVsdHMgZGV0ZWN0ZWQgICAgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX1JFU1YJCTB4ZmZlMAkvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBFU1RBVFVTXzEwMDBfVEZVTEwJMHgyMDAwCS8qIENhbiBkbyAxMDAwQlQgRnVsbCAgICAgICAgICAqLworI2RlZmluZSBFU1RBVFVTXzEwMDBfVEhBTEYJMHgxMDAwCS8qIENhbiBkbyAxMDAwQlQgSGFsZiAgICAgICAgICAqLworCisvKiBOLXdheSB0ZXN0IHJlZ2lzdGVyLiAqLworI2RlZmluZSBOV0FZVEVTVF9SRVNWMQkJMHgwMGZmCS8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBOV0FZVEVTVF9MT09QQkFDSwkweDAxMDAJLyogRW5hYmxlIGxvb3BiYWNrIGZvciBOLXdheSAgICovCisjZGVmaW5lIE5XQVlURVNUX1JFU1YyCQkweGZlMDAJLyogVW51c2VkLi4uICAgICAgICAgICAgICAgICAgICovCisKKy8qIDEwMDBCQVNFLVQgQ29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBBRFZFUlRJU0VfMTAwMEZVTEwJMHgwMjAwICAvKiBBZHZlcnRpc2UgMTAwMEJBU0UtVCBmdWxsIGR1cGxleCAqLworI2RlZmluZSBBRFZFUlRJU0VfMTAwMEhBTEYJMHgwMTAwICAvKiBBZHZlcnRpc2UgMTAwMEJBU0UtVCBoYWxmIGR1cGxleCAqLworI2RlZmluZSBDVEwxMDAwX0FTX01BU1RFUgkweDA4MDAKKyNkZWZpbmUgQ1RMMTAwMF9FTkFCTEVfTUFTVEVSCTB4MTAwMAorCisvKiAxMDAwQkFTRS1UIFN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBMUEFfMTAwMExPQ0FMUlhPSwkweDIwMDAJLyogTGluayBwYXJ0bmVyIGxvY2FsIHJlY2VpdmVyIHN0YXR1cyAqLworI2RlZmluZSBMUEFfMTAwMFJFTVJYT0sJCTB4MTAwMAkvKiBMaW5rIHBhcnRuZXIgcmVtb3RlIHJlY2VpdmVyIHN0YXR1cyAqLworI2RlZmluZSBMUEFfMTAwMEZVTEwJCTB4MDgwMAkvKiBMaW5rIHBhcnRuZXIgMTAwMEJBU0UtVCBmdWxsIGR1cGxleCAqLworI2RlZmluZSBMUEFfMTAwMEhBTEYJCTB4MDQwMAkvKiBMaW5rIHBhcnRuZXIgMTAwMEJBU0UtVCBoYWxmIGR1cGxleCAqLworCisvKiBGbG93IGNvbnRyb2wgZmxhZ3MgKi8KKyNkZWZpbmUgRkxPV19DVFJMX1RYCQkweDAxCisjZGVmaW5lIEZMT1dfQ1RSTF9SWAkJMHgwMgorCisvKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGluIGFsbCBTSU9DeE1JSXh4eCBpb2N0bCBjYWxscyAqLworc3RydWN0IG1paV9pb2N0bF9kYXRhIHsKKwlfX3UxNgkJcGh5X2lkOworCV9fdTE2CQlyZWdfbnVtOworCV9fdTE2CQl2YWxfaW47CisJX191MTYJCXZhbF9vdXQ7Cit9OworCisjZW5kaWYgLyogX19MSU5VWF9NSUlfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21pbml4X2ZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21pbml4X2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNmZTA5ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWluaXhfZnMuaApAQCAtMCwwICsxLDEwNiBAQAorI2lmbmRlZiBfTElOVVhfTUlOSVhfRlNfSAorI2RlZmluZSBfTElOVVhfTUlOSVhfRlNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorCisvKgorICogVGhlIG1pbml4IGZpbGVzeXN0ZW0gY29uc3RhbnRzL3N0cnVjdHVyZXMKKyAqLworCisvKgorICogVGhhbmtzIHRvIEtlZXMgSiBCb3QgZm9yIHNlbmRpbmcgbWUgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBuZXcKKyAqIG1pbml4IGZpbGVzeXN0ZW0gKGFrYSBWMikgd2l0aCBiaWdnZXIgaW5vZGVzIGFuZCAzMi1iaXQgYmxvY2sKKyAqIHBvaW50ZXJzLgorICovCisKKyNkZWZpbmUgTUlOSVhfUk9PVF9JTk8gMQorCisvKiBOb3QgdGhlIHNhbWUgYXMgdGhlIGJvZ3VzIExJTktfTUFYIGluIDxsaW51eC9saW1pdHMuaD4uIE9oIHdlbGwuICovCisjZGVmaW5lIE1JTklYX0xJTktfTUFYCTI1MAorI2RlZmluZSBNSU5JWDJfTElOS19NQVgJNjU1MzAKKworI2RlZmluZSBNSU5JWF9JX01BUF9TTE9UUwk4CisjZGVmaW5lIE1JTklYX1pfTUFQX1NMT1RTCTY0CisjZGVmaW5lIE1JTklYX1ZBTElEX0ZTCQkweDAwMDEJCS8qIENsZWFuIGZzLiAqLworI2RlZmluZSBNSU5JWF9FUlJPUl9GUwkJMHgwMDAyCQkvKiBmcyBoYXMgZXJyb3JzLiAqLworCisjZGVmaW5lIE1JTklYX0lOT0RFU19QRVJfQkxPQ0sgKChCTE9DS19TSVpFKS8oc2l6ZW9mIChzdHJ1Y3QgbWluaXhfaW5vZGUpKSkKKworLyoKKyAqIFRoaXMgaXMgdGhlIG9yaWdpbmFsIG1pbml4IGlub2RlIGxheW91dCBvbiBkaXNrLgorICogTm90ZSB0aGUgOC1iaXQgZ2lkIGFuZCBhdGltZSBhbmQgY3RpbWUuCisgKi8KK3N0cnVjdCBtaW5peF9pbm9kZSB7CisJX191MTYgaV9tb2RlOworCV9fdTE2IGlfdWlkOworCV9fdTMyIGlfc2l6ZTsKKwlfX3UzMiBpX3RpbWU7CisJX191OCAgaV9naWQ7CisJX191OCAgaV9ubGlua3M7CisJX191MTYgaV96b25lWzldOworfTsKKworLyoKKyAqIFRoZSBuZXcgbWluaXggaW5vZGUgaGFzIGFsbCB0aGUgdGltZSBlbnRyaWVzLCBhcyB3ZWxsIGFzCisgKiBsb25nIGJsb2NrIG51bWJlcnMgYW5kIGEgdGhpcmQgaW5kaXJlY3QgYmxvY2sgKDcrMSsxKzEKKyAqIGluc3RlYWQgb2YgNysxKzEpLiBBbHNvLCBzb21lIHByZXZpb3VzbHkgOC1iaXQgdmFsdWVzIGFyZQorICogbm93IDE2LWJpdC4gVGhlIGlub2RlIGlzIG5vdyA2NCBieXRlcyBpbnN0ZWFkIG9mIDMyLgorICovCitzdHJ1Y3QgbWluaXgyX2lub2RlIHsKKwlfX3UxNiBpX21vZGU7CisJX191MTYgaV9ubGlua3M7CisJX191MTYgaV91aWQ7CisJX191MTYgaV9naWQ7CisJX191MzIgaV9zaXplOworCV9fdTMyIGlfYXRpbWU7CisJX191MzIgaV9tdGltZTsKKwlfX3UzMiBpX2N0aW1lOworCV9fdTMyIGlfem9uZVsxMF07Cit9OworCisvKgorICogbWluaXggc3VwZXItYmxvY2sgZGF0YSBvbiBkaXNrCisgKi8KK3N0cnVjdCBtaW5peF9zdXBlcl9ibG9jayB7CisJX191MTYgc19uaW5vZGVzOworCV9fdTE2IHNfbnpvbmVzOworCV9fdTE2IHNfaW1hcF9ibG9ja3M7CisJX191MTYgc196bWFwX2Jsb2NrczsKKwlfX3UxNiBzX2ZpcnN0ZGF0YXpvbmU7CisJX191MTYgc19sb2dfem9uZV9zaXplOworCV9fdTMyIHNfbWF4X3NpemU7CisJX191MTYgc19tYWdpYzsKKwlfX3UxNiBzX3N0YXRlOworCV9fdTMyIHNfem9uZXM7Cit9OworCisvKgorICogVjMgbWluaXggc3VwZXItYmxvY2sgZGF0YSBvbiBkaXNrCisgKi8KK3N0cnVjdCBtaW5peDNfc3VwZXJfYmxvY2sgeworCV9fdTMyIHNfbmlub2RlczsKKwlfX3UxNiBzX3BhZDA7CisJX191MTYgc19pbWFwX2Jsb2NrczsKKwlfX3UxNiBzX3ptYXBfYmxvY2tzOworCV9fdTE2IHNfZmlyc3RkYXRhem9uZTsKKwlfX3UxNiBzX2xvZ196b25lX3NpemU7CisJX191MTYgc19wYWQxOworCV9fdTMyIHNfbWF4X3NpemU7CisJX191MzIgc196b25lczsKKwlfX3UxNiBzX21hZ2ljOworCV9fdTE2IHNfcGFkMjsKKwlfX3UxNiBzX2Jsb2Nrc2l6ZTsKKwlfX3U4ICBzX2Rpc2tfdmVyc2lvbjsKK307CisKK3N0cnVjdCBtaW5peF9kaXJfZW50cnkgeworCV9fdTE2IGlub2RlOworCWNoYXIgbmFtZVswXTsKK307CisKK3N0cnVjdCBtaW5peDNfZGlyX2VudHJ5IHsKKwlfX3UzMiBpbm9kZTsKKwljaGFyIG5hbWVbMF07Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21tYW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YjMwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21tYW4uaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9MSU5VWF9NTUFOX0gKKyNkZWZpbmUgX0xJTlVYX01NQU5fSAorCisjaW5jbHVkZSA8YXNtL21tYW4uaD4KKworI2RlZmluZSBNUkVNQVBfTUFZTU9WRQkxCisjZGVmaW5lIE1SRU1BUF9GSVhFRAkyCisKKyNkZWZpbmUgT1ZFUkNPTU1JVF9HVUVTUwkJMAorI2RlZmluZSBPVkVSQ09NTUlUX0FMV0FZUwkJMQorI2RlZmluZSBPVkVSQ09NTUlUX05FVkVSCQkyCisKKyNlbmRpZiAvKiBfTElOVVhfTU1BTl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21tYy9pb2N0bC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tbWMvaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmE1YmM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tbWMvaW9jdGwuaApAQCAtMCwwICsxLDU0IEBACisjaWZuZGVmIExJTlVYX01NQ19JT0NUTF9ICisjZGVmaW5lIExJTlVYX01NQ19JT0NUTF9ICitzdHJ1Y3QgbW1jX2lvY19jbWQgeworCS8qIEltcGxpZXMgZGlyZWN0aW9uIG9mIGRhdGEuICB0cnVlID0gd3JpdGUsIGZhbHNlID0gcmVhZCAqLworCWludCB3cml0ZV9mbGFnOworCisJLyogQXBwbGljYXRpb24tc3BlY2lmaWMgY29tbWFuZC4gIHRydWUgPSBwcmVjZWRlIHdpdGggQ01ENTUgKi8KKwlpbnQgaXNfYWNtZDsKKworCV9fdTMyIG9wY29kZTsKKwlfX3UzMiBhcmc7CisJX191MzIgcmVzcG9uc2VbNF07ICAvKiBDTUQgcmVzcG9uc2UgKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IGJsa3N6OworCXVuc2lnbmVkIGludCBibG9ja3M7CisKKwkvKgorCSAqIFNsZWVwIGF0IGxlYXN0IHBvc3RzbGVlcF9taW5fdXMgdXNlY29uZHMsIGFuZCBhdCBtb3N0CisJICogcG9zdHNsZWVwX21heF91cyB1c2Vjb25kcyAqYWZ0ZXIqIGlzc3VpbmcgY29tbWFuZC4gIE5lZWRlZCBmb3IKKwkgKiBzb21lIHJlYWQgY29tbWFuZHMgZm9yIHdoaWNoIGNhcmRzIGhhdmUgbm8gb3RoZXIgd2F5IG9mIGluZGljYXRpbmcKKwkgKiB0aGV5J3JlIHJlYWR5IGZvciB0aGUgbmV4dCBjb21tYW5kIChpLmUuIHRoZXJlIGlzIG5vIGVxdWl2YWxlbnQgb2YKKwkgKiBhICJidXN5IiBpbmRpY2F0b3IgZm9yIHJlYWQgb3BlcmF0aW9ucykuCisJICovCisJdW5zaWduZWQgaW50IHBvc3RzbGVlcF9taW5fdXM7CisJdW5zaWduZWQgaW50IHBvc3RzbGVlcF9tYXhfdXM7CisKKwkvKgorCSAqIE92ZXJyaWRlIGRyaXZlci1jb21wdXRlZCB0aW1lb3V0cy4gIE5vdGUgdGhlIGRpZmZlcmVuY2UgaW4gdW5pdHMhCisJICovCisJdW5zaWduZWQgaW50IGRhdGFfdGltZW91dF9uczsKKwl1bnNpZ25lZCBpbnQgY21kX3RpbWVvdXRfbXM7CisKKwkvKgorCSAqIEZvciA2NC1iaXQgbWFjaGluZXMsIHRoZSBuZXh0IG1lbWJlciwgYGBfX3U2NCBkYXRhX3B0cmBgLCB3YW50cyB0bworCSAqIGJlIDgtYnl0ZSBhbGlnbmVkLiAgTWFrZSBzdXJlIHRoaXMgc3RydWN0IGlzIHRoZSBzYW1lIHNpemUgd2hlbgorCSAqIGJ1aWx0IGZvciAzMi1iaXQuCisJICovCisJX191MzIgX19wYWQ7CisKKwkvKiBEQVQgYnVmZmVyICovCisJX191NjQgZGF0YV9wdHI7Cit9OworI2RlZmluZSBtbWNfaW9jX2NtZF9zZXRfZGF0YShpYywgcHRyKSBpYy5kYXRhX3B0ciA9IChfX3U2NCkodW5zaWduZWQgbG9uZykgcHRyCisKKyNkZWZpbmUgTU1DX0lPQ19DTUQgX0lPV1IoTU1DX0JMT0NLX01BSk9SLCAwLCBzdHJ1Y3QgbW1jX2lvY19jbWQpCisKKy8qCisgKiBTaW5jZSB0aGlzIGlvY3RsIGlzIG9ubHkgbWVhbnQgdG8gZW5oYW5jZSAoYW5kIG5vdCByZXBsYWNlKSBub3JtYWwgYWNjZXNzCisgKiB0byB0aGUgbW1jIGJ1cyBkZXZpY2UsIGFuIHVwcGVyIGRhdGEgdHJhbnNmZXIgbGltaXQgb2YgTU1DX0lPQ19NQVhfQllURVMKKyAqIGlzIGVuZm9yY2VkIHBlciBpb2N0bCBjYWxsLiAgRm9yIGxhcmdlciBkYXRhIHRyYW5zZmVycywgdXNlIHRoZSBub3JtYWwKKyAqIGJsb2NrIGRldmljZSBvcGVyYXRpb25zLgorICovCisjZGVmaW5lIE1NQ19JT0NfTUFYX0JZVEVTICAoNTEyTCAqIDI1NikKKyNlbmRpZiAvKiBMSU5VWF9NTUNfSU9DVExfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tbXRpbWVyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21tdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODRjYWJmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tbXRpbWVyLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIEludGVsIE11bHRpbWVkaWEgVGltZXIgZGV2aWNlIGludGVyZmFjZQorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIHNob3VsZCBkZWZpbmUgYW4gaW50ZXJmYWNlIGNvbXBhdGlibGUgd2l0aCB0aGUgSUEtUEMgTXVsdGltZWRpYQorICogVGltZXJzIERyYWZ0IFNwZWNpZmljYXRpb24gKHJldi4gMC45NykgZnJvbSBJbnRlbC4gIE5vdGUgdGhhdCBzb21lCisgKiBoYXJkd2FyZSBtYXkgbm90IGJlIGFibGUgdG8gc2FmZWx5IGV4cG9ydCBpdHMgcmVnaXN0ZXJzIHRvIHVzZXJzcGFjZSwKKyAqIHNvIHRoZSBpb2N0bCBpbnRlcmZhY2Ugc2hvdWxkIHN1cHBvcnQgYWxsIG5lY2Vzc2FyeSBmdW5jdGlvbmFsaXR5LgorICoKKyAqIDExLzAxLzAxIC0gamJhcm5lcyAtIGluaXRpYWwgcmV2aXNpb24KKyAqIDkvMTAvMDQgLSBDaHJpc3RvcGggTGFtZXRlciAtIHJlbW92ZSBpbnRlcnJ1cHQgc3VwcG9ydAorICogOS8xNy8wNCAtIGpiYXJuZXMgLSByZW1vdmUgdGVzdCBwcm9ncmFtLCBtb3ZlIHNvbWUgI2RlZmluZXMgdG8gdGhlIGRyaXZlcgorICovCisKKyNpZm5kZWYgX0xJTlVYX01NVElNRVJfSAorI2RlZmluZSBfTElOVVhfTU1USU1FUl9ICisKKy8qCisgKiBCcmVha2Rvd24gb2YgdGhlIGlvY3RsJ3MgYXZhaWxhYmxlLiAgQW4gJ29wdGlvbmFsJyBuZXh0IHRvIHRoZSBjb21tYW5kCisgKiBpbmRpY2F0ZXMgdGhhdCBzdXBwb3J0aW5nIHRoaXMgY29tbWFuZCBpcyBvcHRpb25hbCwgd2hpbGUgJ3JlcXVpcmVkJworICogY29tbWFuZHMgbXVzdCBiZSBpbXBsZW1lbnRlZCBpZiBjb25mb3JtYW5jZSBpcyBkZXNpcmVkLgorICoKKyAqIE1NVElNRVJfR0VUT0ZGU0VUIC0gb3B0aW9uYWwKKyAqICAgU2hvdWxkIHJldHVybiB0aGUgb2Zmc2V0IChyZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHBhZ2Ugd2hlcmUgdGhlCisgKiAgIHJlZ2lzdGVycyBhcmUgbWFwcGVkKSBmb3IgdGhlIGNvdW50ZXIgaW4gcXVlc3Rpb24uCisgKgorICogTU1USU1FUl9HRVRSRVMgLSByZXF1aXJlZAorICogICBUaGUgcmVzb2x1dGlvbiBvZiB0aGUgY2xvY2sgaW4gZmVtdG8gKDEwXi0xNSkgc2Vjb25kcworICoKKyAqIE1NVElNRVJfR0VURlJFUSAtIHJlcXVpcmVkCisgKiAgIEZyZXF1ZW5jeSBvZiB0aGUgY2xvY2sgaW4gSHoKKyAqCisgKiBNTVRJTUVSX0dFVEJJVFMgLSByZXF1aXJlZAorICogICBOdW1iZXIgb2YgYml0cyBpbiB0aGUgY2xvY2sncyBjb3VudGVyCisgKgorICogTU1USU1FUl9NTUFQQVZBSUwgLSByZXF1aXJlZAorICogICBSZXR1cm5zIG5vbnplcm8gaWYgdGhlIHJlZ2lzdGVycyBjYW4gYmUgbW1hcCdkIGludG8gdXNlcnNwYWNlLCAwIG90aGVyd2lzZQorICoKKyAqIE1NVElNRVJfR0VUQ09VTlRFUiAtIHJlcXVpcmVkCisgKiAgIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIGNvdW50ZXIKKyAqLworI2RlZmluZSBNTVRJTUVSX0lPQ1RMX0JBU0UgJ20nCisKKyNkZWZpbmUgTU1USU1FUl9HRVRPRkZTRVQgX0lPKE1NVElNRVJfSU9DVExfQkFTRSwgMCkKKyNkZWZpbmUgTU1USU1FUl9HRVRSRVMgX0lPUihNTVRJTUVSX0lPQ1RMX0JBU0UsIDEsIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIE1NVElNRVJfR0VURlJFUSBfSU9SKE1NVElNRVJfSU9DVExfQkFTRSwgMiwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgTU1USU1FUl9HRVRCSVRTIF9JTyhNTVRJTUVSX0lPQ1RMX0JBU0UsIDQpCisjZGVmaW5lIE1NVElNRVJfTU1BUEFWQUlMIF9JTyhNTVRJTUVSX0lPQ1RMX0JBU0UsIDYpCisjZGVmaW5lIE1NVElNRVJfR0VUQ09VTlRFUiBfSU9SKE1NVElNRVJfSU9DVExfQkFTRSwgOSwgdW5zaWduZWQgbG9uZykKKworI2VuZGlmIC8qIF9MSU5VWF9NTVRJTUVSX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbXF1ZXVlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNWE3OTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21xdWV1ZS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMyBLcnp5c3p0b2YgQmVuZWR5Y3phayAmIE1pY2hhbCBXcm9uc2tpCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEl0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9MSU5VWF9NUVVFVUVfSAorI2RlZmluZSBfTElOVVhfTVFVRVVFX0gKKworI2RlZmluZSBNUV9QUklPX01BWCAJMzI3NjgKKy8qIHBlci11aWQgbGltaXQgb2Yga2VybmVsIG1lbW9yeSB1c2VkIGJ5IG1xdWV1ZSwgaW4gYnl0ZXMgKi8KKyNkZWZpbmUgTVFfQllURVNfTUFYCTgxOTIwMAorCitzdHJ1Y3QgbXFfYXR0ciB7CisJbG9uZwltcV9mbGFnczsJLyogbWVzc2FnZSBxdWV1ZSBmbGFncwkJCSovCisJbG9uZwltcV9tYXhtc2c7CS8qIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzCQkqLworCWxvbmcJbXFfbXNnc2l6ZTsJLyogbWF4aW11bSBtZXNzYWdlIHNpemUJCQkqLworCWxvbmcJbXFfY3VybXNnczsJLyogbnVtYmVyIG9mIG1lc3NhZ2VzIGN1cnJlbnRseSBxdWV1ZWQJKi8KKwlsb25nCV9fcmVzZXJ2ZWRbNF07CS8qIGlnbm9yZWQgZm9yIGlucHV0LCB6ZXJvZWQgZm9yIG91dHB1dCAqLworfTsKKworLyoKKyAqIFNJR0VWX1RIUkVBRCBpbXBsZW1lbnRhdGlvbjoKKyAqIFNJR0VWX1RIUkVBRCBtdXN0IGJlIGltcGxlbWVudGVkIGluIHVzZXIgc3BhY2UuIElmIFNJR0VWX1RIUkVBRCBpcyBwYXNzZWQKKyAqIHRvIG1xX25vdGlmeSwgdGhlbgorICogLSBzaWdldl9zaWdubyBtdXN0IGJlIHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYW4gQUZfTkVUTElOSyBzb2NrZXQuIEl0J3Mgbm90CisgKiAgIG5lY2Vzc2FyeSB0aGF0IHRoZSBzb2NrZXQgaXMgYm91bmQuCisgKiAtIHNpZ2V2X3ZhbHVlLnNpdmFsX3B0ciBtdXN0IHBvaW50IHRvIGEgY29va2llIHRoYXQgaXMgTk9USUZZX0NPT0tJRV9MRU4KKyAqICAgYnl0ZXMgbG9uZy4KKyAqIElmIHRoZSBub3RpZmljYXRpb24gaXMgdHJpZ2dlcmVkLCB0aGVuIHRoZSBjb29raWUgaXMgc2VudCB0byB0aGUgbmV0bGluaworICogc29ja2V0LiBUaGUgbGFzdCBieXRlIG9mIHRoZSBjb29raWUgaXMgcmVwbGFjZWQgd2l0aCB0aGUgTk9USUZZXz8/IGNvZGVzOgorICogTk9USUZZX1dPS0VOVVAgaWYgdGhlIG5vdGlmaWNhdGlvbiBnb3QgdHJpZ2dlcmVkLCBOT1RJRllfUkVNT1ZFRCBpZiBpdCB3YXMKKyAqIHJlbW92ZWQsIGVpdGhlciBkdWUgdG8gYSBjbG9zZSgpIG9uIHRoZSBtZXNzYWdlIHF1ZXVlIGZkIG9yIGR1ZSB0byBhCisgKiBtcV9ub3RpZnkoKSB0aGF0IHJlbW92ZWQgdGhlIG5vdGlmaWNhdGlvbi4KKyAqLworI2RlZmluZSBOT1RJRllfTk9ORQkwCisjZGVmaW5lIE5PVElGWV9XT0tFTlVQCTEKKyNkZWZpbmUgTk9USUZZX1JFTU9WRUQJMgorCisjZGVmaW5lIE5PVElGWV9DT09LSUVfTEVOCTMyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tcm91dGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbXJvdXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZiNDEyNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbXJvdXRlLmgKQEAgLTAsMCArMSwxNDMgQEAKKyNpZm5kZWYgX19MSU5VWF9NUk9VVEVfSAorI2RlZmluZSBfX0xJTlVYX01ST1VURV9ICisKKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqCUJhc2VkIG9uIHRoZSBNUk9VVElORyAzLjUgZGVmaW5lcyBwcmltYXJpbHkgdG8ga2VlcAorICoJc291cmNlIGNvbXBhdGliaWxpdHkgd2l0aCBCU0QuCisgKgorICoJU2VlIHRoZSBtcm91dGVkIGNvZGUgZm9yIHRoZSBvcmlnaW5hbCBoaXN0b3J5LgorICoKKyAqICAgICAgUHJvdG9jb2wgSW5kZXBlbmRlbnQgTXVsdGljYXN0IChQSU0pIGRhdGEgc3RydWN0dXJlcyBpbmNsdWRlZAorICogICAgICBDYXJsb3MgUGljb3RvIChjYXBAZGkuZmMudWwucHQpCisgKgorICovCisKKyNkZWZpbmUgTVJUX0JBU0UJMjAwCisjZGVmaW5lIE1SVF9JTklUCShNUlRfQkFTRSkJLyogQWN0aXZhdGUgdGhlIGtlcm5lbCBtcm91dGUgY29kZSAJKi8KKyNkZWZpbmUgTVJUX0RPTkUJKE1SVF9CQVNFKzEpCS8qIFNodXRkb3duIHRoZSBrZXJuZWwgbXJvdXRlCQkqLworI2RlZmluZSBNUlRfQUREX1ZJRgkoTVJUX0JBU0UrMikJLyogQWRkIGEgdmlydHVhbCBpbnRlcmZhY2UJCSovCisjZGVmaW5lIE1SVF9ERUxfVklGCShNUlRfQkFTRSszKQkvKiBEZWxldGUgYSB2aXJ0dWFsIGludGVyZmFjZQkJKi8KKyNkZWZpbmUgTVJUX0FERF9NRkMJKE1SVF9CQVNFKzQpCS8qIEFkZCBhIG11bHRpY2FzdCBmb3J3YXJkaW5nIGVudHJ5CSovCisjZGVmaW5lIE1SVF9ERUxfTUZDCShNUlRfQkFTRSs1KQkvKiBEZWxldGUgYSBtdWx0aWNhc3QgZm9yd2FyZGluZyBlbnRyeQkqLworI2RlZmluZSBNUlRfVkVSU0lPTgkoTVJUX0JBU0UrNikJLyogR2V0IHRoZSBrZXJuZWwgbXVsdGljYXN0IHZlcnNpb24JKi8KKyNkZWZpbmUgTVJUX0FTU0VSVAkoTVJUX0JBU0UrNykJLyogQWN0aXZhdGUgUElNIGFzc2VydCBtb2RlCQkqLworI2RlZmluZSBNUlRfUElNCQkoTVJUX0JBU0UrOCkJLyogZW5hYmxlIFBJTSBjb2RlCQkJKi8KKyNkZWZpbmUgTVJUX1RBQkxFCShNUlRfQkFTRSs5KQkvKiBTcGVjaWZ5IG1yb3V0ZSB0YWJsZSBJRAkJKi8KKworI2RlZmluZSBTSU9DR0VUVklGQ05UCVNJT0NQUk9UT1BSSVZBVEUJLyogSVAgcHJvdG9jb2wgcHJpdmF0ZXMgKi8KKyNkZWZpbmUgU0lPQ0dFVFNHQ05UCShTSU9DUFJPVE9QUklWQVRFKzEpCisjZGVmaW5lIFNJT0NHRVRSUEYJKFNJT0NQUk9UT1BSSVZBVEUrMikKKworI2RlZmluZSBNQVhWSUZTCQkzMgkKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB2aWZiaXRtYXBfdDsJLyogVXNlciBtb2RlIGNvZGUgZGVwZW5kcyBvbiB0aGlzIGxvdCAqLwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB2aWZpX3Q7CisjZGVmaW5lIEFMTF9WSUZTCSgodmlmaV90KSgtMSkpCisKKy8qCisgKglTYW1lIGlkZWEgYXMgc2VsZWN0CisgKi8KKyAKKyNkZWZpbmUgVklGTV9TRVQobixtKQkoKG0pfD0oMTw8KG4pKSkKKyNkZWZpbmUgVklGTV9DTFIobixtKQkoKG0pJj1+KDE8PChuKSkpCisjZGVmaW5lIFZJRk1fSVNTRVQobixtKQkoKG0pJigxPDwobikpKQorI2RlZmluZSBWSUZNX0NMUkFMTChtKQkoKG0pPTApCisjZGVmaW5lIFZJRk1fQ09QWShtZnJvbSxtdG8pCSgobXRvKT0obWZyb20pKQorI2RlZmluZSBWSUZNX1NBTUUobTEsbTIpCSgobTEpPT0obTIpKQorCisvKgorICoJUGFzc2VkIGJ5IG1yb3V0ZWQgZm9yIGFuIE1SVF9BRERfVklGIC0gYWdhaW4gd2UgdXNlIHRoZQorICoJbXJvdXRlZCAzLjYgc3RydWN0dXJlcyBmb3IgY29tcGF0aWJpbGl0eQorICovCisgCitzdHJ1Y3QgdmlmY3RsIHsKKwl2aWZpX3QJdmlmY192aWZpOwkJLyogSW5kZXggb2YgVklGICovCisJdW5zaWduZWQgY2hhciB2aWZjX2ZsYWdzOwkvKiBWSUZGXyBmbGFncyAqLworCXVuc2lnbmVkIGNoYXIgdmlmY190aHJlc2hvbGQ7CS8qIHR0bCBsaW1pdCAqLworCXVuc2lnbmVkIGludCB2aWZjX3JhdGVfbGltaXQ7CS8qIFJhdGUgbGltaXRlciB2YWx1ZXMgKE5JKSAqLworCXVuaW9uIHsKKwkJc3RydWN0IGluX2FkZHIgdmlmY19sY2xfYWRkcjsgICAgIC8qIExvY2FsIGludGVyZmFjZSBhZGRyZXNzICovCisJCWludCAgICAgICAgICAgIHZpZmNfbGNsX2lmaW5kZXg7ICAvKiBMb2NhbCBpbnRlcmZhY2UgaW5kZXggICAqLworCX07CisJc3RydWN0IGluX2FkZHIgdmlmY19ybXRfYWRkcjsJLyogSVBJUCB0dW5uZWwgYWRkciAqLworfTsKKworI2RlZmluZSBWSUZGX1RVTk5FTAkJMHgxCS8qIElQSVAgdHVubmVsICovCisjZGVmaW5lIFZJRkZfU1JDUlQJCTB4MgkvKiBOSSAqLworI2RlZmluZSBWSUZGX1JFR0lTVEVSCQkweDQJLyogcmVnaXN0ZXIgdmlmCSovCisjZGVmaW5lIFZJRkZfVVNFX0lGSU5ERVgJMHg4CS8qIHVzZSB2aWZjX2xjbF9pZmluZGV4IGluc3RlYWQgb2YKKwkJCQkJICAgdmlmY19sY2xfYWRkciB0byBmaW5kIGFuIGludGVyZmFjZSAqLworCisvKgorICoJQ2FjaGUgbWFuaXB1bGF0aW9uIHN0cnVjdHVyZXMgZm9yIG1yb3V0ZWQgYW5kIFBJTWQKKyAqLworIAorc3RydWN0IG1mY2N0bCB7CisJc3RydWN0IGluX2FkZHIgbWZjY19vcmlnaW47CQkvKiBPcmlnaW4gb2YgbWNhc3QJKi8KKwlzdHJ1Y3QgaW5fYWRkciBtZmNjX21jYXN0Z3JwOwkJLyogR3JvdXAgaW4gcXVlc3Rpb24JKi8KKwl2aWZpX3QJbWZjY19wYXJlbnQ7CQkJLyogV2hlcmUgaXQgYXJyaXZlZAkqLworCXVuc2lnbmVkIGNoYXIgbWZjY190dGxzW01BWFZJRlNdOwkvKiBXaGVyZSBpdCBpcyBnb2luZwkqLworCXVuc2lnbmVkIGludCBtZmNjX3BrdF9jbnQ7CQkvKiBwa3QgY291bnQgZm9yIHNyYy1ncnAgKi8KKwl1bnNpZ25lZCBpbnQgbWZjY19ieXRlX2NudDsKKwl1bnNpZ25lZCBpbnQgbWZjY193cm9uZ19pZjsKKwlpbnQJICAgICBtZmNjX2V4cGlyZTsKK307CisKKy8qIAorICoJR3JvdXAgY291bnQgcmV0cmlldmFsIGZvciBtcm91dGVkCisgKi8KKyAKK3N0cnVjdCBzaW9jX3NnX3JlcSB7CisJc3RydWN0IGluX2FkZHIgc3JjOworCXN0cnVjdCBpbl9hZGRyIGdycDsKKwl1bnNpZ25lZCBsb25nIHBrdGNudDsKKwl1bnNpZ25lZCBsb25nIGJ5dGVjbnQ7CisJdW5zaWduZWQgbG9uZyB3cm9uZ19pZjsKK307CisKKy8qCisgKglUbyBnZXQgdmlmIHBhY2tldCBjb3VudHMKKyAqLworCitzdHJ1Y3Qgc2lvY192aWZfcmVxIHsKKwl2aWZpX3QJdmlmaTsJCS8qIFdoaWNoIGlmYWNlICovCisJdW5zaWduZWQgbG9uZyBpY291bnQ7CS8qIEluIHBhY2tldHMgKi8KKwl1bnNpZ25lZCBsb25nIG9jb3VudDsJLyogT3V0IHBhY2tldHMgKi8KKwl1bnNpZ25lZCBsb25nIGlieXRlczsJLyogSW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nIG9ieXRlczsJLyogT3V0IGJ5dGVzICovCit9OworCisvKgorICoJVGhpcyBpcyB0aGUgZm9ybWF0IHRoZSBtcm91dGUgZGFlbW9uIGV4cGVjdHMgdG8gc2VlIElHTVAgY29udHJvbAorICoJZGF0YS4gTWFnaWNhbGx5IGhhcHBlbnMgdG8gYmUgbGlrZSBhbiBJUCBwYWNrZXQgYXMgcGVyIHRoZSBvcmlnaW5hbAorICovCisgCitzdHJ1Y3QgaWdtcG1zZyB7CisJX191MzIgdW51c2VkMSx1bnVzZWQyOworCXVuc2lnbmVkIGNoYXIgaW1fbXNndHlwZTsJCS8qIFdoYXQgaXMgdGhpcyAqLworCXVuc2lnbmVkIGNoYXIgaW1fbWJ6OwkJCS8qIE11c3QgYmUgemVybyAqLworCXVuc2lnbmVkIGNoYXIgaW1fdmlmOwkJCS8qIEludGVyZmFjZSAodGhpcyBvdWdodCB0byBiZSBhIHZpZmlfdCEpICovCisJdW5zaWduZWQgY2hhciB1bnVzZWQzOworCXN0cnVjdCBpbl9hZGRyIGltX3NyYyxpbV9kc3Q7Cit9OworCisvKgorICoJVGhhdCdzIGFsbCB1c2VybW9kZSBmb2xrcworICovCisKKworCisjZGVmaW5lIE1GQ19BU1NFUlRfVEhSRVNIICgzKkhaKQkJLyogTWF4aW1hbCBmcmVxLiBvZiBhc3NlcnRzICovCisKKy8qCisgKglQc2V1ZG8gbWVzc2FnZXMgdXNlZCBieSBtcm91dGVkCisgKi8KKworI2RlZmluZSBJR01QTVNHX05PQ0FDSEUJCTEJCS8qIEtlcm4gY2FjaGUgZmlsbCByZXF1ZXN0IHRvIG1yb3V0ZWQgKi8KKyNkZWZpbmUgSUdNUE1TR19XUk9OR1ZJRgkyCQkvKiBGb3IgUElNIGFzc2VydCBwcm9jZXNzaW5nICh1bnVzZWQpICovCisjZGVmaW5lIElHTVBNU0dfV0hPTEVQS1QJMwkJLyogRm9yIFBJTSBSZWdpc3RlciBwcm9jZXNzaW5nICovCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21yb3V0ZTYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbXJvdXRlNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOTE1YTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21yb3V0ZTYuaApAQCAtMCwwICsxLDEzNSBAQAorI2lmbmRlZiBfX0xJTlVYX01ST1VURTZfSAorI2RlZmluZSBfX0xJTlVYX01ST1VURTZfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisKKy8qCisgKglCYXNlZCBvbiB0aGUgTVJPVVRJTkcgMy41IGRlZmluZXMgcHJpbWFyaWx5IHRvIGtlZXAKKyAqCXNvdXJjZSBjb21wYXRpYmlsaXR5IHdpdGggQlNELgorICoKKyAqCVNlZSB0aGUgcGltNnNkIGNvZGUgZm9yIHRoZSBvcmlnaW5hbCBoaXN0b3J5LgorICoKKyAqICAgICAgUHJvdG9jb2wgSW5kZXBlbmRlbnQgTXVsdGljYXN0IChQSU0pIGRhdGEgc3RydWN0dXJlcyBpbmNsdWRlZAorICogICAgICBDYXJsb3MgUGljb3RvIChjYXBAZGkuZmMudWwucHQpCisgKgorICovCisKKyNkZWZpbmUgTVJUNl9CQVNFCTIwMAorI2RlZmluZSBNUlQ2X0lOSVQJKE1SVDZfQkFTRSkJLyogQWN0aXZhdGUgdGhlIGtlcm5lbCBtcm91dGUgY29kZSAJKi8KKyNkZWZpbmUgTVJUNl9ET05FCShNUlQ2X0JBU0UrMSkJLyogU2h1dGRvd24gdGhlIGtlcm5lbCBtcm91dGUJCSovCisjZGVmaW5lIE1SVDZfQUREX01JRgkoTVJUNl9CQVNFKzIpCS8qIEFkZCBhIHZpcnR1YWwgaW50ZXJmYWNlCQkqLworI2RlZmluZSBNUlQ2X0RFTF9NSUYJKE1SVDZfQkFTRSszKQkvKiBEZWxldGUgYSB2aXJ0dWFsIGludGVyZmFjZQkJKi8KKyNkZWZpbmUgTVJUNl9BRERfTUZDCShNUlQ2X0JBU0UrNCkJLyogQWRkIGEgbXVsdGljYXN0IGZvcndhcmRpbmcgZW50cnkJKi8KKyNkZWZpbmUgTVJUNl9ERUxfTUZDCShNUlQ2X0JBU0UrNSkJLyogRGVsZXRlIGEgbXVsdGljYXN0IGZvcndhcmRpbmcgZW50cnkJKi8KKyNkZWZpbmUgTVJUNl9WRVJTSU9OCShNUlQ2X0JBU0UrNikJLyogR2V0IHRoZSBrZXJuZWwgbXVsdGljYXN0IHZlcnNpb24JKi8KKyNkZWZpbmUgTVJUNl9BU1NFUlQJKE1SVDZfQkFTRSs3KQkvKiBBY3RpdmF0ZSBQSU0gYXNzZXJ0IG1vZGUJCSovCisjZGVmaW5lIE1SVDZfUElNCShNUlQ2X0JBU0UrOCkJLyogZW5hYmxlIFBJTSBjb2RlCQkJKi8KKyNkZWZpbmUgTVJUNl9UQUJMRQkoTVJUNl9CQVNFKzkpCS8qIFNwZWNpZnkgbXJvdXRlIHRhYmxlIElECQkqLworCisjZGVmaW5lIFNJT0NHRVRNSUZDTlRfSU42CVNJT0NQUk9UT1BSSVZBVEUJLyogSVAgcHJvdG9jb2wgcHJpdmF0ZXMgKi8KKyNkZWZpbmUgU0lPQ0dFVFNHQ05UX0lONgkoU0lPQ1BST1RPUFJJVkFURSsxKQorI2RlZmluZSBTSU9DR0VUUlBGCShTSU9DUFJPVE9QUklWQVRFKzIpCisKKyNkZWZpbmUgTUFYTUlGUwkJMzIKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBtaWZiaXRtYXBfdDsJLyogVXNlciBtb2RlIGNvZGUgZGVwZW5kcyBvbiB0aGlzIGxvdCAqLwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBtaWZpX3Q7CisjZGVmaW5lIEFMTF9NSUZTCSgobWlmaV90KSgtMSkpCisKKyNpZm5kZWYgSUZfU0VUU0laRQorI2RlZmluZSBJRl9TRVRTSVpFCTI1NgorI2VuZGlmCisKK3R5cGVkZWYJX191MzIJCWlmX21hc2s7CisjZGVmaW5lIE5JRkJJVFMgKHNpemVvZihpZl9tYXNrKSAqIDgpICAgICAgICAvKiBiaXRzIHBlciBtYXNrICovCisKKyNpZiAhZGVmaW5lZChfX0tFUk5FTF9fKSAmJiAhZGVmaW5lZChESVZfUk9VTkRfVVApCisjZGVmaW5lCURJVl9ST1VORF9VUCh4LHkpCSgoKHgpICsgKCh5KSAtIDEpKSAvICh5KSkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBpZl9zZXQgeworCWlmX21hc2sgaWZzX2JpdHNbRElWX1JPVU5EX1VQKElGX1NFVFNJWkUsIE5JRkJJVFMpXTsKK30gaWZfc2V0OworCisjZGVmaW5lIElGX1NFVChuLCBwKSAgICAoKHApLT5pZnNfYml0c1sobikvTklGQklUU10gfD0gKDEgPDwgKChuKSAlIE5JRkJJVFMpKSkKKyNkZWZpbmUgSUZfQ0xSKG4sIHApICAgICgocCktPmlmc19iaXRzWyhuKS9OSUZCSVRTXSAmPSB+KDEgPDwgKChuKSAlIE5JRkJJVFMpKSkKKyNkZWZpbmUgSUZfSVNTRVQobiwgcCkgICgocCktPmlmc19iaXRzWyhuKS9OSUZCSVRTXSAmICgxIDw8ICgobikgJSBOSUZCSVRTKSkpCisjZGVmaW5lIElGX0NPUFkoZiwgdCkgICBiY29weShmLCB0LCBzaXplb2YoKihmKSkpCisjZGVmaW5lIElGX1pFUk8ocCkgICAgICBiemVybyhwLCBzaXplb2YoKihwKSkpCisKKy8qCisgKglQYXNzZWQgYnkgbXJvdXRlZCBmb3IgYW4gTVJUX0FERF9NSUYgLSBhZ2FpbiB3ZSB1c2UgdGhlCisgKgltcm91dGVkIDMuNiBzdHJ1Y3R1cmVzIGZvciBjb21wYXRpYmlsaXR5CisgKi8KKworc3RydWN0IG1pZjZjdGwgeworCW1pZmlfdAltaWY2Y19taWZpOwkJLyogSW5kZXggb2YgTUlGICovCisJdW5zaWduZWQgY2hhciBtaWY2Y19mbGFnczsJLyogTUlGRl8gZmxhZ3MgKi8KKwl1bnNpZ25lZCBjaGFyIHZpZmNfdGhyZXNob2xkOwkvKiB0dGwgbGltaXQgKi8KKwlfX3UxNgkgbWlmNmNfcGlmaTsJCS8qIHRoZSBpbmRleCBvZiB0aGUgcGh5c2ljYWwgSUYgKi8KKwl1bnNpZ25lZCBpbnQgdmlmY19yYXRlX2xpbWl0OwkvKiBSYXRlIGxpbWl0ZXIgdmFsdWVzIChOSSkgKi8KK307CisKKyNkZWZpbmUgTUlGRl9SRUdJU1RFUgkweDEJLyogcmVnaXN0ZXIgdmlmCSovCisKKy8qCisgKglDYWNoZSBtYW5pcHVsYXRpb24gc3RydWN0dXJlcyBmb3IgbXJvdXRlZCBhbmQgUElNZAorICovCisKK3N0cnVjdCBtZjZjY3RsIHsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IG1mNmNjX29yaWdpbjsJCS8qIE9yaWdpbiBvZiBtY2FzdAkqLworCXN0cnVjdCBzb2NrYWRkcl9pbjYgbWY2Y2NfbWNhc3RncnA7CQkvKiBHcm91cCBpbiBxdWVzdGlvbgkqLworCW1pZmlfdAltZjZjY19wYXJlbnQ7CQkJLyogV2hlcmUgaXQgYXJyaXZlZAkqLworCXN0cnVjdCBpZl9zZXQgbWY2Y2NfaWZzZXQ7CQkvKiBXaGVyZSBpdCBpcyBnb2luZyAqLworfTsKKworLyoKKyAqCUdyb3VwIGNvdW50IHJldHJpZXZhbCBmb3IgcGltNnNkCisgKi8KKworc3RydWN0IHNpb2Nfc2dfcmVxNiB7CisJc3RydWN0IHNvY2thZGRyX2luNiBzcmM7CisJc3RydWN0IHNvY2thZGRyX2luNiBncnA7CisJdW5zaWduZWQgbG9uZyBwa3RjbnQ7CisJdW5zaWduZWQgbG9uZyBieXRlY250OworCXVuc2lnbmVkIGxvbmcgd3JvbmdfaWY7Cit9OworCisvKgorICoJVG8gZ2V0IHZpZiBwYWNrZXQgY291bnRzCisgKi8KKworc3RydWN0IHNpb2NfbWlmX3JlcTYgeworCW1pZmlfdAltaWZpOwkJLyogV2hpY2ggaWZhY2UgKi8KKwl1bnNpZ25lZCBsb25nIGljb3VudDsJLyogSW4gcGFja2V0cyAqLworCXVuc2lnbmVkIGxvbmcgb2NvdW50OwkvKiBPdXQgcGFja2V0cyAqLworCXVuc2lnbmVkIGxvbmcgaWJ5dGVzOwkvKiBJbiBieXRlcyAqLworCXVuc2lnbmVkIGxvbmcgb2J5dGVzOwkvKiBPdXQgYnl0ZXMgKi8KK307CisKKy8qCisgKglUaGF0J3MgYWxsIHVzZXJtb2RlIGZvbGtzCisgKi8KKworCisKKy8qCisgKiBTdHJ1Y3R1cmUgdXNlZCB0byBjb21tdW5pY2F0ZSBmcm9tIGtlcm5lbCB0byBtdWx0aWNhc3Qgcm91dGVyLgorICogV2UnbGwgb3ZlcmxheSB0aGUgc3RydWN0dXJlIG9udG8gYW4gTUxEIGhlYWRlciAobm90IGFuIElQdjYgaGVkZXIgbGlrZSBpZ21wbXNne30KKyAqIHVzZWQgZm9yIElQdjQgaW1wbGVtZW50YXRpb24pLiBUaGlzIGlzIGJlY2F1c2UgdGhpcyBzdHJ1Y3R1cmUgd2lsbCBiZSBwYXNzZWQgdmlhIGFuCisgKiBJUHY2IHJhdyBzb2NrZXQsIG9uIHdoaWNoIGFuIGFwcGxpY2F0aW9uIHdpbGwgb25seSByZWNlaXZlciB0aGUgcGF5bG9hZCBpLmUgdGhlIGRhdGEgYWZ0ZXIKKyAqIHRoZSBJUHY2IGhlYWRlciBhbmQgYWxsIHRoZSBleHRlbnNpb24gaGVhZGVycy4gKFNlZSBzZWN0aW9uIDMgb2YgUkZDIDM1NDIpCisgKi8KKworc3RydWN0IG1ydDZtc2cgeworI2RlZmluZSBNUlQ2TVNHX05PQ0FDSEUJCTEKKyNkZWZpbmUgTVJUNk1TR19XUk9OR01JRgkyCisjZGVmaW5lIE1SVDZNU0dfV0hPTEVQS1QJMwkJLyogdXNlZCBmb3IgdXNlIGxldmVsIGVuY2FwICovCisJX191OAkJaW02X21iejsJCS8qIG11c3QgYmUgemVybwkJICAgKi8KKwlfX3U4CQlpbTZfbXNndHlwZTsJCS8qIHdoYXQgdHlwZSBvZiBtZXNzYWdlICAgICovCisJX191MTYJCWltNl9taWY7CQkvKiBtaWYgcmVjJ2Qgb24JCSAgICovCisJX191MzIJCWltNl9wYWQ7CQkvKiBwYWRkaW5nIGZvciA2NCBiaXQgYXJjaCAqLworCXN0cnVjdCBpbjZfYWRkcglpbTZfc3JjLCBpbTZfZHN0OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21zZG9zX2ZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21zZG9zX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2NTg0MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbXNkb3NfZnMuaApAQCAtMCwwICsxLDE2NiBAQAorI2lmbmRlZiBfTElOVVhfTVNET1NfRlNfSAorI2RlZmluZSBfTElOVVhfTVNET1NfRlNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworLyoKKyAqIFRoZSBNUy1ET1MgZmlsZXN5c3RlbSBjb25zdGFudHMvc3RydWN0dXJlcworICovCisKKyNkZWZpbmUgU0VDVE9SX1NJWkUJNTEyCQkvKiBzZWN0b3Igc2l6ZSAoYnl0ZXMpICovCisjZGVmaW5lIFNFQ1RPUl9CSVRTCTkJCS8qIGxvZzIoU0VDVE9SX1NJWkUpICovCisjZGVmaW5lIE1TRE9TX0RQQgkoTVNET1NfRFBTKQkvKiBkaXIgZW50cmllcyBwZXIgYmxvY2sgKi8KKyNkZWZpbmUgTVNET1NfRFBCX0JJVFMJNAkJLyogbG9nMihNU0RPU19EUEIpICovCisjZGVmaW5lIE1TRE9TX0RQUwkoU0VDVE9SX1NJWkUgLyBzaXplb2Yoc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSkpCisjZGVmaW5lIE1TRE9TX0RQU19CSVRTCTQJCS8qIGxvZzIoTVNET1NfRFBTKSAqLworI2RlZmluZSBNU0RPU19MT05HTkFNRQkyNTYJCS8qIG1heGltdW0gbmFtZSBsZW5ndGggKi8KKyNkZWZpbmUgQ0ZfTEVfVyh2KQlsZTE2X3RvX2NwdSh2KQorI2RlZmluZSBDRl9MRV9MKHYpCWxlMzJfdG9fY3B1KHYpCisjZGVmaW5lIENUX0xFX1codikJY3B1X3RvX2xlMTYodikKKyNkZWZpbmUgQ1RfTEVfTCh2KQljcHVfdG9fbGUzMih2KQorCisKKyNkZWZpbmUgTVNET1NfUk9PVF9JTk8JMQkvKiA9PSBNSU5JWF9ST09UX0lOTyAqLworI2RlZmluZSBNU0RPU19ESVJfQklUUwk1CS8qIGxvZzIoc2l6ZW9mKHN0cnVjdCBtc2Rvc19kaXJfZW50cnkpKSAqLworCisvKiBkaXJlY3RvcnkgbGltaXQgKi8KKyNkZWZpbmUgRkFUX01BWF9ESVJfRU5UUklFUwkoNjU1MzYpCisjZGVmaW5lIEZBVF9NQVhfRElSX1NJWkUJKEZBVF9NQVhfRElSX0VOVFJJRVMgPDwgTVNET1NfRElSX0JJVFMpCisKKyNkZWZpbmUgQVRUUl9OT05FCTAJLyogbm8gYXR0cmlidXRlIGJpdHMgKi8KKyNkZWZpbmUgQVRUUl9STwkJMQkvKiByZWFkLW9ubHkgKi8KKyNkZWZpbmUgQVRUUl9ISURERU4JMgkvKiBoaWRkZW4gKi8KKyNkZWZpbmUgQVRUUl9TWVMJNAkvKiBzeXN0ZW0gKi8KKyNkZWZpbmUgQVRUUl9WT0xVTUUJOAkvKiB2b2x1bWUgbGFiZWwgKi8KKyNkZWZpbmUgQVRUUl9ESVIJMTYJLyogZGlyZWN0b3J5ICovCisjZGVmaW5lIEFUVFJfQVJDSAkzMgkvKiBhcmNoaXZlZCAqLworCisvKiBhdHRyaWJ1dGUgYml0cyB0aGF0IGFyZSBjb3BpZWQgImFzIGlzIiAqLworI2RlZmluZSBBVFRSX1VOVVNFRAkoQVRUUl9WT0xVTUUgfCBBVFRSX0FSQ0ggfCBBVFRSX1NZUyB8IEFUVFJfSElEREVOKQorLyogYml0cyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBXaW5kb3dzIDk1L1dpbmRvd3MgTlQgZXh0ZW5kZWQgRkFUICovCisjZGVmaW5lIEFUVFJfRVhUCShBVFRSX1JPIHwgQVRUUl9ISURERU4gfCBBVFRSX1NZUyB8IEFUVFJfVk9MVU1FKQorCisjZGVmaW5lIENBU0VfTE9XRVJfQkFTRQk4CS8qIGJhc2UgaXMgbG93ZXIgY2FzZSAqLworI2RlZmluZSBDQVNFX0xPV0VSX0VYVAkxNgkvKiBleHRlbnNpb24gaXMgbG93ZXIgY2FzZSAqLworCisjZGVmaW5lIERFTEVURURfRkxBRwkweGU1CS8qIG1hcmtzIGZpbGUgYXMgZGVsZXRlZCB3aGVuIGluIG5hbWVbMF0gKi8KKyNkZWZpbmUgSVNfRlJFRShuKQkoISoobikgfHwgKihuKSA9PSBERUxFVEVEX0ZMQUcpCisKKyNkZWZpbmUgRkFUX0xGTl9MRU4JMjU1CS8qIG1heGltdW0gbG9uZyBuYW1lIGxlbmd0aCAqLworI2RlZmluZSBNU0RPU19OQU1FCTExCS8qIG1heGltdW0gbmFtZSBsZW5ndGggKi8KKyNkZWZpbmUgTVNET1NfU0xPVFMJMjEJLyogbWF4ICMgb2Ygc2xvdHMgZm9yIHNob3J0IGFuZCBsb25nIG5hbWVzICovCisjZGVmaW5lIE1TRE9TX0RPVAkiLiAgICAgICAgICAiCS8qICIuIiwgcGFkZGVkIHRvIE1TRE9TX05BTUUgY2hhcnMgKi8KKyNkZWZpbmUgTVNET1NfRE9URE9UCSIuLiAgICAgICAgICIJLyogIi4uIiwgcGFkZGVkIHRvIE1TRE9TX05BTUUgY2hhcnMgKi8KKworI2RlZmluZSBGQVRfRklSU1RfRU5UKHMsIHgpCSgoTVNET1NfU0IocyktPmZhdF9iaXRzID09IDMyID8gMHgwRkZGRkYwMCA6IFwKKwlNU0RPU19TQihzKS0+ZmF0X2JpdHMgPT0gMTYgPyAweEZGMDAgOiAweEYwMCkgfCAoeCkpCisKKy8qIHN0YXJ0IG9mIGRhdGEgY2x1c3RlcidzIGVudHJ5IChudW1iZXIgb2YgcmVzZXJ2ZWQgY2x1c3RlcnMpICovCisjZGVmaW5lIEZBVF9TVEFSVF9FTlQJMgorCisvKiBtYXhpbXVtIG51bWJlciBvZiBjbHVzdGVycyAqLworI2RlZmluZSBNQVhfRkFUMTIJMHhGRjQKKyNkZWZpbmUgTUFYX0ZBVDE2CTB4RkZGNAorI2RlZmluZSBNQVhfRkFUMzIJMHgwRkZGRkZGNgorI2RlZmluZSBNQVhfRkFUKHMpCShNU0RPU19TQihzKS0+ZmF0X2JpdHMgPT0gMzIgPyBNQVhfRkFUMzIgOiBcCisJTVNET1NfU0IocyktPmZhdF9iaXRzID09IDE2ID8gTUFYX0ZBVDE2IDogTUFYX0ZBVDEyKQorCisvKiBiYWQgY2x1c3RlciBtYXJrICovCisjZGVmaW5lIEJBRF9GQVQxMgkweEZGNworI2RlZmluZSBCQURfRkFUMTYJMHhGRkY3CisjZGVmaW5lIEJBRF9GQVQzMgkweDBGRkZGRkY3CisKKy8qIHN0YW5kYXJkIEVPRiAqLworI2RlZmluZSBFT0ZfRkFUMTIJMHhGRkYKKyNkZWZpbmUgRU9GX0ZBVDE2CTB4RkZGRgorI2RlZmluZSBFT0ZfRkFUMzIJMHgwRkZGRkZGRgorCisjZGVmaW5lIEZBVF9FTlRfRlJFRQkoMCkKKyNkZWZpbmUgRkFUX0VOVF9CQUQJKEJBRF9GQVQzMikKKyNkZWZpbmUgRkFUX0VOVF9FT0YJKEVPRl9GQVQzMikKKworI2RlZmluZSBGQVRfRlNJTkZPX1NJRzEJMHg0MTYxNTI1MgorI2RlZmluZSBGQVRfRlNJTkZPX1NJRzIJMHg2MTQxNzI3MgorI2RlZmluZSBJU19GU0lORk8oeCkJKGxlMzJfdG9fY3B1KCh4KS0+c2lnbmF0dXJlMSkgPT0gRkFUX0ZTSU5GT19TSUcxIFwKKwkJCSAmJiBsZTMyX3RvX2NwdSgoeCktPnNpZ25hdHVyZTIpID09IEZBVF9GU0lORk9fU0lHMikKKworc3RydWN0IF9fZmF0X2RpcmVudCB7CisJbG9uZwkJZF9pbm87CisJX19rZXJuZWxfb2ZmX3QJZF9vZmY7CisJdW5zaWduZWQgc2hvcnQJZF9yZWNsZW47CisJY2hhcgkJZF9uYW1lWzI1Nl07IC8qIFdlIG11c3Qgbm90IGluY2x1ZGUgbGltaXRzLmghICovCit9OworCisvKgorICogaW9jdGwgY29tbWFuZHMKKyAqLworI2RlZmluZSBWRkFUX0lPQ1RMX1JFQURESVJfQk9USAkJX0lPUigncicsIDEsIHN0cnVjdCBfX2ZhdF9kaXJlbnRbMl0pCisjZGVmaW5lIFZGQVRfSU9DVExfUkVBRERJUl9TSE9SVAlfSU9SKCdyJywgMiwgc3RydWN0IF9fZmF0X2RpcmVudFsyXSkKKy8qIDxsaW51eC92aWRlb3RleHQuaD4gaGFzIHVzZWQgMHg3MiAoJ3InKSBpbiBjb2xsaXNpb24sIHNvIHNraXAgYSBmZXcgKi8KKyNkZWZpbmUgRkFUX0lPQ1RMX0dFVF9BVFRSSUJVVEVTCV9JT1IoJ3InLCAweDEwLCBfX3UzMikKKyNkZWZpbmUgRkFUX0lPQ1RMX1NFVF9BVFRSSUJVVEVTCV9JT1coJ3InLCAweDExLCBfX3UzMikKKworc3RydWN0IGZhdF9ib290X3NlY3RvciB7CisJX191OAlpZ25vcmVkWzNdOwkvKiBCb290IHN0cmFwIHNob3J0IG9yIG5lYXIganVtcCAqLworCV9fdTgJc3lzdGVtX2lkWzhdOwkvKiBOYW1lIC0gY2FuIGJlIHVzZWQgdG8gc3BlY2lhbCBjYXNlCisJCQkJICAgcGFydGl0aW9uIG1hbmFnZXIgdm9sdW1lcyAqLworCV9fdTgJc2VjdG9yX3NpemVbMl07CS8qIGJ5dGVzIHBlciBsb2dpY2FsIHNlY3RvciAqLworCV9fdTgJc2VjX3Blcl9jbHVzOwkvKiBzZWN0b3JzL2NsdXN0ZXIgKi8KKwlfX2xlMTYJcmVzZXJ2ZWQ7CS8qIHJlc2VydmVkIHNlY3RvcnMgKi8KKwlfX3U4CWZhdHM7CQkvKiBudW1iZXIgb2YgRkFUcyAqLworCV9fdTgJZGlyX2VudHJpZXNbMl07CS8qIHJvb3QgZGlyZWN0b3J5IGVudHJpZXMgKi8KKwlfX3U4CXNlY3RvcnNbMl07CS8qIG51bWJlciBvZiBzZWN0b3JzICovCisJX191OAltZWRpYTsJCS8qIG1lZGlhIGNvZGUgKi8KKwlfX2xlMTYJZmF0X2xlbmd0aDsJLyogc2VjdG9ycy9GQVQgKi8KKwlfX2xlMTYJc2Vjc190cmFjazsJLyogc2VjdG9ycyBwZXIgdHJhY2sgKi8KKwlfX2xlMTYJaGVhZHM7CQkvKiBudW1iZXIgb2YgaGVhZHMgKi8KKwlfX2xlMzIJaGlkZGVuOwkJLyogaGlkZGVuIHNlY3RvcnMgKHVudXNlZCkgKi8KKwlfX2xlMzIJdG90YWxfc2VjdDsJLyogbnVtYmVyIG9mIHNlY3RvcnMgKGlmIHNlY3RvcnMgPT0gMCkgKi8KKworCS8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBvbmx5IHVzZWQgYnkgRkFUMzIgKi8KKwlfX2xlMzIJZmF0MzJfbGVuZ3RoOwkvKiBzZWN0b3JzL0ZBVCAqLworCV9fbGUxNglmbGFnczsJCS8qIGJpdCA4OiBmYXQgbWlycm9yaW5nLCBsb3cgNDogYWN0aXZlIGZhdCAqLworCV9fdTgJdmVyc2lvblsyXTsJLyogbWFqb3IsIG1pbm9yIGZpbGVzeXN0ZW0gdmVyc2lvbiAqLworCV9fbGUzMglyb290X2NsdXN0ZXI7CS8qIGZpcnN0IGNsdXN0ZXIgaW4gcm9vdCBkaXJlY3RvcnkgKi8KKwlfX2xlMTYJaW5mb19zZWN0b3I7CS8qIGZpbGVzeXN0ZW0gaW5mbyBzZWN0b3IgKi8KKwlfX2xlMTYJYmFja3VwX2Jvb3Q7CS8qIGJhY2t1cCBib290IHNlY3RvciAqLworCV9fbGUxNglyZXNlcnZlZDJbNl07CS8qIFVudXNlZCAqLworfTsKKworc3RydWN0IGZhdF9ib290X2ZzaW5mbyB7CisJX19sZTMyICAgc2lnbmF0dXJlMTsJLyogMHg0MTYxNTI1MkwgKi8KKwlfX2xlMzIgICByZXNlcnZlZDFbMTIwXTsJLyogTm90aGluZyBhcyBmYXIgYXMgSSBjYW4gdGVsbCAqLworCV9fbGUzMiAgIHNpZ25hdHVyZTI7CS8qIDB4NjE0MTcyNzJMICovCisJX19sZTMyICAgZnJlZV9jbHVzdGVyczsJLyogRnJlZSBjbHVzdGVyIGNvdW50LiAgLTEgaWYgdW5rbm93biAqLworCV9fbGUzMiAgIG5leHRfY2x1c3RlcjsJLyogTW9zdCByZWNlbnRseSBhbGxvY2F0ZWQgY2x1c3RlciAqLworCV9fbGUzMiAgIHJlc2VydmVkMls0XTsKK307CisKK3N0cnVjdCBtc2Rvc19kaXJfZW50cnkgeworCV9fdTgJbmFtZVtNU0RPU19OQU1FXTsvKiBuYW1lIGFuZCBleHRlbnNpb24gKi8KKwlfX3U4CWF0dHI7CQkvKiBhdHRyaWJ1dGUgYml0cyAqLworCV9fdTggICAgbGNhc2U7CQkvKiBDYXNlIGZvciBiYXNlIGFuZCBleHRlbnNpb24gKi8KKwlfX3U4CWN0aW1lX2NzOwkvKiBDcmVhdGlvbiB0aW1lLCBjZW50aXNlY29uZHMgKDAtMTk5KSAqLworCV9fbGUxNgljdGltZTsJCS8qIENyZWF0aW9uIHRpbWUgKi8KKwlfX2xlMTYJY2RhdGU7CQkvKiBDcmVhdGlvbiBkYXRlICovCisJX19sZTE2CWFkYXRlOwkJLyogTGFzdCBhY2Nlc3MgZGF0ZSAqLworCV9fbGUxNglzdGFydGhpOwkvKiBIaWdoIDE2IGJpdHMgb2YgY2x1c3RlciBpbiBGQVQzMiAqLworCV9fbGUxNgl0aW1lLGRhdGUsc3RhcnQ7LyogdGltZSwgZGF0ZSBhbmQgZmlyc3QgY2x1c3RlciAqLworCV9fbGUzMglzaXplOwkJLyogZmlsZSBzaXplIChpbiBieXRlcykgKi8KK307CisKKy8qIFVwIHRvIDEzIGNoYXJhY3RlcnMgb2YgdGhlIG5hbWUgKi8KK3N0cnVjdCBtc2Rvc19kaXJfc2xvdCB7CisJX191OCAgICBpZDsJCS8qIHNlcXVlbmNlIG51bWJlciBmb3Igc2xvdCAqLworCV9fdTggICAgbmFtZTBfNFsxMF07CS8qIGZpcnN0IDUgY2hhcmFjdGVycyBpbiBuYW1lICovCisJX191OCAgICBhdHRyOwkJLyogYXR0cmlidXRlIGJ5dGUgKi8KKwlfX3U4ICAgIHJlc2VydmVkOwkvKiBhbHdheXMgMCAqLworCV9fdTggICAgYWxpYXNfY2hlY2tzdW07CS8qIGNoZWNrc3VtIGZvciA4LjMgYWxpYXMgKi8KKwlfX3U4ICAgIG5hbWU1XzEwWzEyXTsJLyogNiBtb3JlIGNoYXJhY3RlcnMgaW4gbmFtZSAqLworCV9fbGUxNiAgIHN0YXJ0OwkJLyogc3RhcnRpbmcgY2x1c3RlciBudW1iZXIsIDAgaW4gbG9uZyBzbG90cyAqLworCV9fdTggICAgbmFtZTExXzEyWzRdOwkvKiBsYXN0IDIgY2hhcmFjdGVycyBpbiBuYW1lICovCit9OworCisjZW5kaWYgLyogIV9MSU5VWF9NU0RPU19GU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21zZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tc2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWY4ZTMwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tc2cuaApAQCAtMCwwICsxLDc1IEBACisjaWZuZGVmIF9MSU5VWF9NU0dfSAorI2RlZmluZSBfTElOVVhfTVNHX0gKKworI2luY2x1ZGUgPGxpbnV4L2lwYy5oPgorCisvKiBpcGNzIGN0bCBjb21tYW5kcyAqLworI2RlZmluZSBNU0dfU1RBVCAxMQorI2RlZmluZSBNU0dfSU5GTyAxMgorCisvKiBtc2dyY3Ygb3B0aW9ucyAqLworI2RlZmluZSBNU0dfTk9FUlJPUiAgICAgMDEwMDAwICAvKiBubyBlcnJvciBpZiBtZXNzYWdlIGlzIHRvbyBiaWcgKi8KKyNkZWZpbmUgTVNHX0VYQ0VQVCAgICAgIDAyMDAwMCAgLyogcmVjdiBhbnkgbXNnIGV4Y2VwdCBvZiBzcGVjaWZpZWQgdHlwZS4qLworCisvKiBPYnNvbGV0ZSwgdXNlZCBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBhbmQgbGliYzUgY29tcGlsZXMgKi8KK3N0cnVjdCBtc3FpZF9kcyB7CisJc3RydWN0IGlwY19wZXJtIG1zZ19wZXJtOworCXN0cnVjdCBtc2cgKm1zZ19maXJzdDsJCS8qIGZpcnN0IG1lc3NhZ2Ugb24gcXVldWUsdW51c2VkICAqLworCXN0cnVjdCBtc2cgKm1zZ19sYXN0OwkJLyogbGFzdCBtZXNzYWdlIGluIHF1ZXVlLHVudXNlZCAqLworCV9fa2VybmVsX3RpbWVfdCBtc2dfc3RpbWU7CS8qIGxhc3QgbXNnc25kIHRpbWUgKi8KKwlfX2tlcm5lbF90aW1lX3QgbXNnX3J0aW1lOwkvKiBsYXN0IG1zZ3JjdiB0aW1lICovCisJX19rZXJuZWxfdGltZV90IG1zZ19jdGltZTsJLyogbGFzdCBjaGFuZ2UgdGltZSAqLworCXVuc2lnbmVkIGxvbmcgIG1zZ19sY2J5dGVzOwkvKiBSZXVzZSBqdW5rIGZpZWxkcyBmb3IgMzIgYml0ICovCisJdW5zaWduZWQgbG9uZyAgbXNnX2xxYnl0ZXM7CS8qIGRpdHRvICovCisJdW5zaWduZWQgc2hvcnQgbXNnX2NieXRlczsJLyogY3VycmVudCBudW1iZXIgb2YgYnl0ZXMgb24gcXVldWUgKi8KKwl1bnNpZ25lZCBzaG9ydCBtc2dfcW51bTsJLyogbnVtYmVyIG9mIG1lc3NhZ2VzIGluIHF1ZXVlICovCisJdW5zaWduZWQgc2hvcnQgbXNnX3FieXRlczsJLyogbWF4IG51bWJlciBvZiBieXRlcyBvbiBxdWV1ZSAqLworCV9fa2VybmVsX2lwY19waWRfdCBtc2dfbHNwaWQ7CS8qIHBpZCBvZiBsYXN0IG1zZ3NuZCAqLworCV9fa2VybmVsX2lwY19waWRfdCBtc2dfbHJwaWQ7CS8qIGxhc3QgcmVjZWl2ZSBwaWQgKi8KK307CisKKy8qIEluY2x1ZGUgdGhlIGRlZmluaXRpb24gb2YgbXNxaWQ2NF9kcyAqLworI2luY2x1ZGUgPGFzbS9tc2didWYuaD4KKworLyogbWVzc2FnZSBidWZmZXIgZm9yIG1zZ3NuZCBhbmQgbXNncmN2IGNhbGxzICovCitzdHJ1Y3QgbXNnYnVmIHsKKwlsb25nIG10eXBlOyAgICAgICAgIC8qIHR5cGUgb2YgbWVzc2FnZSAqLworCWNoYXIgbXRleHRbMV07ICAgICAgLyogbWVzc2FnZSB0ZXh0ICovCit9OworCisvKiBidWZmZXIgZm9yIG1zZ2N0bCBjYWxscyBJUENfSU5GTywgTVNHX0lORk8gKi8KK3N0cnVjdCBtc2dpbmZvIHsKKwlpbnQgbXNncG9vbDsKKwlpbnQgbXNnbWFwOyAKKwlpbnQgbXNnbWF4OyAKKwlpbnQgbXNnbW5iOyAKKwlpbnQgbXNnbW5pOyAKKwlpbnQgbXNnc3N6OyAKKwlpbnQgbXNndHFsOyAKKwl1bnNpZ25lZCBzaG9ydCAgbXNnc2VnOyAKK307CisKKy8qCisgKiBTY2FsaW5nIGZhY3RvciB0byBjb21wdXRlIG1zZ21uaToKKyAqIHRoZSBtZW1vcnkgZGVkaWNhdGVkIHRvIG1zZyBxdWV1ZXMgKG1zZ21uaSAqIG1zZ21uYikgc2hvdWxkIG9jY3VweQorICogYXQgbW9zdCAxL01TR19NRU1fU0NBTEUgb2YgdGhlIGxvd21lbSAoc2VlIHRoZSBmb3JtdWxhIGluIGlwYy9tc2cuYyk6CisgKiB1cCB0byA4TUIgICAgICAgOiBtc2dtbmkgPSAxNiAoTVNHTU5JKQorICogNCBHQiAgICAgICAgICAgIDogbXNnbW5pID0gOEsKKyAqIG1vcmUgdGhhbiAxNiBHQiA6IG1zZ21uaSA9IDMySyAoSVBDTU5JKQorICovCisjZGVmaW5lIE1TR19NRU1fU0NBTEUgMzIKKworI2RlZmluZSBNU0dNTkkgICAgMTYgICAvKiA8PSBJUENNTkkgKi8gICAgIC8qIG1heCAjIG9mIG1zZyBxdWV1ZSBpZGVudGlmaWVycyAqLworI2RlZmluZSBNU0dNQVggIDgxOTIgICAvKiA8PSBJTlRfTUFYICovICAgLyogbWF4IHNpemUgb2YgbWVzc2FnZSAoYnl0ZXMpICovCisjZGVmaW5lIE1TR01OQiAxNjM4NCAgIC8qIDw9IElOVF9NQVggKi8gICAvKiBkZWZhdWx0IG1heCBzaXplIG9mIGEgbWVzc2FnZSBxdWV1ZSAqLworCisvKiB1bnVzZWQgKi8KKyNkZWZpbmUgTVNHUE9PTCAoTVNHTU5JICogTVNHTU5CIC8gMTAyNCkgLyogc2l6ZSBpbiBrYnl0ZXMgb2YgbWVzc2FnZSBwb29sICovCisjZGVmaW5lIE1TR1RRTCAgTVNHTU5CICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN5c3RlbSBtZXNzYWdlIGhlYWRlcnMgKi8KKyNkZWZpbmUgTVNHTUFQICBNU0dNTkIgICAgICAgICAgICAvKiBudW1iZXIgb2YgZW50cmllcyBpbiBtZXNzYWdlIG1hcCAqLworI2RlZmluZSBNU0dTU1ogIDE2ICAgICAgICAgICAgICAgIC8qIG1lc3NhZ2Ugc2VnbWVudCBzaXplICovCisjZGVmaW5lIF9fTVNHU0VHICgoTVNHUE9PTCAqIDEwMjQpIC8gTVNHU1NaKSAvKiBtYXggbm8uIG9mIHNlZ21lbnRzICovCisjZGVmaW5lIE1TR1NFRyAoX19NU0dTRUcgPD0gMHhmZmZmID8gX19NU0dTRUcgOiAweGZmZmYpCisKKworI2VuZGlmIC8qIF9MSU5VWF9NU0dfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tdGlvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L210aW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjgyNTc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tdGlvLmgKQEAgLTAsMCArMSwyMDcgQEAKKy8qIAorICogbGludXgvbXRpby5oIGhlYWRlciBmaWxlIGZvciBMaW51eC4gV3JpdHRlbiBieSBILiBCZXJnbWFuCisgKgorICogTW9kaWZpZWQgZm9yIHNwZWNpYWwgaW9jdGxzIHByb3ZpZGVkIGJ5IHpmdGFwZSBpbiBTZXB0ZW1iZXIgMTk5NworICogYnkgQy4tSi4gSGVpbmUuCisgKi8KKworI2lmbmRlZiBfTElOVVhfTVRJT19ICisjZGVmaW5lIF9MSU5VWF9NVElPX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworLyoKKyAqIFN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zIGZvciBtYWcgdGFwZSBpbyBjb250cm9sIGNvbW1hbmRzCisgKi8KKworLyogc3RydWN0dXJlIGZvciBNVElPQ1RPUCAtIG1hZyB0YXBlIG9wIGNvbW1hbmQgKi8KK3N0cnVjdAltdG9wIHsKKwlzaG9ydAltdF9vcDsJCS8qIG9wZXJhdGlvbnMgZGVmaW5lZCBiZWxvdyAqLworCWludAltdF9jb3VudDsJLyogaG93IG1hbnkgb2YgdGhlbSAqLworfTsKKworLyogTWFnbmV0aWMgVGFwZSBvcGVyYXRpb25zIFtOb3QgYWxsIG9wZXJhdGlvbnMgc3VwcG9ydGVkIGJ5IGFsbCBkcml2ZXJzXTogKi8KKyNkZWZpbmUgTVRSRVNFVCAwCS8qICtyZXNldCBkcml2ZSBpbiBjYXNlIG9mIHByb2JsZW1zICovCisjZGVmaW5lIE1URlNGCTEJLyogZm9yd2FyZCBzcGFjZSBvdmVyIEZpbGVNYXJrLAorCQkJICogcG9zaXRpb24gYXQgZmlyc3QgcmVjb3JkIG9mIG5leHQgZmlsZSAKKwkJCSAqLworI2RlZmluZSBNVEJTRgkyCS8qIGJhY2t3YXJkIHNwYWNlIEZpbGVNYXJrIChwb3NpdGlvbiBiZWZvcmUgRk0pICovCisjZGVmaW5lIE1URlNSCTMJLyogZm9yd2FyZCBzcGFjZSByZWNvcmQgKi8KKyNkZWZpbmUgTVRCU1IJNAkvKiBiYWNrd2FyZCBzcGFjZSByZWNvcmQgKi8KKyNkZWZpbmUgTVRXRU9GCTUJLyogd3JpdGUgYW4gZW5kLW9mLWZpbGUgcmVjb3JkIChtYXJrKSAqLworI2RlZmluZSBNVFJFVwk2CS8qIHJld2luZCAqLworI2RlZmluZSBNVE9GRkwJNwkvKiByZXdpbmQgYW5kIHB1dCB0aGUgZHJpdmUgb2ZmbGluZSAoZWplY3Q/KSAqLworI2RlZmluZSBNVE5PUAk4CS8qIG5vIG9wLCBzZXQgc3RhdHVzIG9ubHkgKHJlYWQgd2l0aCBNVElPQ0dFVCkgKi8KKyNkZWZpbmUgTVRSRVRFTiA5CS8qIHJldGVuc2lvbiB0YXBlICovCisjZGVmaW5lIE1UQlNGTQkxMAkvKiArYmFja3dhcmQgc3BhY2UgRmlsZU1hcmssIHBvc2l0aW9uIGF0IEZNICovCisjZGVmaW5lIE1URlNGTSAgMTEJLyogK2ZvcndhcmQgc3BhY2UgRmlsZU1hcmssIHBvc2l0aW9uIGF0IEZNICovCisjZGVmaW5lIE1URU9NCTEyCS8qIGdvdG8gZW5kIG9mIHJlY29yZGVkIG1lZGlhIChmb3IgYXBwZW5kaW5nIGZpbGVzKS4KKwkJCSAqIE1URU9NIHBvc2l0aW9ucyBhZnRlciB0aGUgbGFzdCBGTSwgcmVhZHkgZm9yCisJCQkgKiBhcHBlbmRpbmcgYW5vdGhlciBmaWxlLgorCQkJICovCisjZGVmaW5lIE1URVJBU0UgMTMJLyogZXJhc2UgdGFwZSAtLSBiZSBjYXJlZnVsISAqLworCisjZGVmaW5lIE1UUkFTMSAgMTQJLyogcnVuIHNlbGYgdGVzdCAxIChub25kZXN0cnVjdGl2ZSkgKi8KKyNkZWZpbmUgTVRSQVMyCTE1CS8qIHJ1biBzZWxmIHRlc3QgMiAoZGVzdHJ1Y3RpdmUpICovCisjZGVmaW5lIE1UUkFTMyAgMTYJLyogcmVzZXJ2ZWQgZm9yIHNlbGYgdGVzdCAzICovCisKKyNkZWZpbmUgTVRTRVRCTEsgMjAJLyogc2V0IGJsb2NrIGxlbmd0aCAoU0NTSSkgKi8KKyNkZWZpbmUgTVRTRVRERU5TSVRZIDIxCS8qIHNldCB0YXBlIGRlbnNpdHkgKFNDU0kpICovCisjZGVmaW5lIE1UU0VFSwkyMgkvKiBzZWVrIHRvIGJsb2NrIChUYW5kYmVyZywgZXRjLikgKi8KKyNkZWZpbmUgTVRURUxMCTIzCS8qIHRlbGwgYmxvY2sgKFRhbmRiZXJnLCBldGMuKSAqLworI2RlZmluZSBNVFNFVERSVkJVRkZFUiAyNCAvKiBzZXQgdGhlIGRyaXZlIGJ1ZmZlcmluZyBhY2NvcmRpbmcgdG8gU0NTSS0yICovCisJCQkvKiBvcmRpbmFyeSBidWZmZXJlZCBvcGVyYXRpb24gd2l0aCBjb2RlIDEgKi8KKyNkZWZpbmUgTVRGU1MJMjUJLyogc3BhY2UgZm9yd2FyZCBvdmVyIHNldG1hcmtzICovCisjZGVmaW5lIE1UQlNTCTI2CS8qIHNwYWNlIGJhY2t3YXJkIG92ZXIgc2V0bWFya3MgKi8KKyNkZWZpbmUgTVRXU00JMjcJLyogd3JpdGUgc2V0bWFya3MgKi8KKworI2RlZmluZSBNVExPQ0sgIDI4CS8qIGxvY2sgdGhlIGRyaXZlIGRvb3IgKi8KKyNkZWZpbmUgTVRVTkxPQ0sgMjkJLyogdW5sb2NrIHRoZSBkcml2ZSBkb29yICovCisjZGVmaW5lIE1UTE9BRCAgMzAJLyogZXhlY3V0ZSB0aGUgU0NTSSBsb2FkIGNvbW1hbmQgKi8KKyNkZWZpbmUgTVRVTkxPQUQgMzEJLyogZXhlY3V0ZSB0aGUgU0NTSSB1bmxvYWQgY29tbWFuZCAqLworI2RlZmluZSBNVENPTVBSRVNTSU9OIDMyLyogY29udHJvbCBjb21wcmVzc2lvbiB3aXRoIFNDU0kgbW9kZSBwYWdlIDE1ICovCisjZGVmaW5lIE1UU0VUUEFSVCAzMwkvKiBDaGFuZ2UgdGhlIGFjdGl2ZSB0YXBlIHBhcnRpdGlvbiAqLworI2RlZmluZSBNVE1LUEFSVCAgMzQJLyogRm9ybWF0IHRoZSB0YXBlIHdpdGggb25lIG9yIHR3byBwYXJ0aXRpb25zICovCisjZGVmaW5lIE1UV0VPRkkJMzUJLyogd3JpdGUgYW4gZW5kLW9mLWZpbGUgcmVjb3JkIChtYXJrKSBpbiBpbW1lZGlhdGUgbW9kZSAqLworCisvKiBzdHJ1Y3R1cmUgZm9yIE1USU9DR0VUIC0gbWFnIHRhcGUgZ2V0IHN0YXR1cyBjb21tYW5kICovCisKK3N0cnVjdAltdGdldCB7CisJbG9uZwltdF90eXBlOwkvKiB0eXBlIG9mIG1hZ3RhcGUgZGV2aWNlICovCisJbG9uZwltdF9yZXNpZDsJLyogcmVzaWR1YWwgY291bnQ6IChub3Qgc3VyZSkKKwkJCQkgKgludW1iZXIgb2YgYnl0ZXMgaWdub3JlZCwgb3IKKwkJCQkgKgludW1iZXIgb2YgZmlsZXMgbm90IHNraXBwZWQsIG9yCisJCQkJICoJbnVtYmVyIG9mIHJlY29yZHMgbm90IHNraXBwZWQuCisJCQkJICovCisJLyogdGhlIGZvbGxvd2luZyByZWdpc3RlcnMgYXJlIGRldmljZSBkZXBlbmRlbnQgKi8KKwlsb25nCW10X2RzcmVnOwkvKiBzdGF0dXMgcmVnaXN0ZXIgKi8KKwlsb25nCW10X2dzdGF0OwkvKiBnZW5lcmljIChkZXZpY2UgaW5kZXBlbmRlbnQpIHN0YXR1cyAqLworCWxvbmcJbXRfZXJyZWc7CS8qIGVycm9yIHJlZ2lzdGVyICovCisJLyogVGhlIG5leHQgdHdvIGZpZWxkcyBhcmUgbm90IGFsd2F5cyB1c2VkICovCisJX19rZXJuZWxfZGFkZHJfdCBtdF9maWxlbm87CS8qIG51bWJlciBvZiBjdXJyZW50IGZpbGUgb24gdGFwZSAqLworCV9fa2VybmVsX2RhZGRyX3QgbXRfYmxrbm87CS8qIGN1cnJlbnQgYmxvY2sgbnVtYmVyICovCit9OworCisKKworLyoKKyAqIENvbnN0YW50cyBmb3IgbXRfdHlwZS4gTm90IGFsbCBvZiB0aGVzZSBhcmUgc3VwcG9ydGVkLAorICogYW5kIHRoZXNlIGFyZSBub3QgYWxsIG9mIHRoZSBvbmVzIHRoYXQgYXJlIHN1cHBvcnRlZC4KKyAqLworI2RlZmluZSBNVF9JU1VOS05PV04JCTB4MDEKKyNkZWZpbmUgTVRfSVNRSUMwMgkJMHgwMgkvKiBHZW5lcmljIFFJQy0wMiB0YXBlIHN0cmVhbWVyICovCisjZGVmaW5lIE1UX0lTV1Q1MTUwCQkweDAzCS8qIFdhbmd0ZWsgNTE1MEVRLCBRSUMtMTUwLCBRSUMtMDIgKi8KKyNkZWZpbmUgTVRfSVNBUkNISVZFXzU5NDVMMgkweDA0CS8qIEFyY2hpdmUgNTk0NUwtMiwgUUlDLTI0LCBRSUMtMDI/ICovCisjZGVmaW5lIE1UX0lTQ01TSjUwMAkJMHgwNQkvKiBDTVMgSnVtYm8gNTAwIChRSUMtMDI/KSAqLworI2RlZmluZSBNVF9JU1REQzM2MTAJCTB4MDYJLyogVGFuZGJlcmcgNjMxMCwgUUlDLTI0ICovCisjZGVmaW5lIE1UX0lTQVJDSElWRV9WUDYwSQkweDA3CS8qIEFyY2hpdmUgVlA2MGksIFFJQy0wMiAqLworI2RlZmluZSBNVF9JU0FSQ0hJVkVfMjE1MEwJMHgwOAkvKiBBcmNoaXZlIFZpcGVyIDIxNTBMICovCisjZGVmaW5lIE1UX0lTQVJDSElWRV8yMDYwTAkweDA5CS8qIEFyY2hpdmUgVmlwZXIgMjA2MEwgKi8KKyNkZWZpbmUgTVRfSVNBUkNISVZFU0M0OTkJMHgwQQkvKiBBcmNoaXZlIFNDLTQ5OSBRSUMtMzYgY29udHJvbGxlciAqLworI2RlZmluZSBNVF9JU1FJQzAyX0FMTF9GRUFUVVJFUwkweDBGCS8qIEdlbmVyaWMgUUlDLTAyIHdpdGggYWxsIGZlYXR1cmVzICovCisjZGVmaW5lIE1UX0lTV1Q1MDk5RUVOMjQJMHgxMQkvKiBXYW5ndGVrIDUwOTktZWVuMjQsIDYwTUIsIFFJQy0yNCAqLworI2RlZmluZSBNVF9JU1RFQUNfTVQyU1QJCTB4MTIJLyogVGVhYyBNVC0yU1QgMTU1bWIgZHJpdmUsIFRlYWMgREMtMSBjYXJkIChXYW5ndGVrIHR5cGUpICovCisjZGVmaW5lIE1UX0lTRVZFUkVYX0ZUNDBBCTB4MzIJLyogRXZlcmV4IEZUNDBBIChRSUMtNDApICovCisjZGVmaW5lIE1UX0lTRERTMQkJMHg1MQkvKiBERFMgZGV2aWNlIHdpdGhvdXQgcGFydGl0aW9ucyAqLworI2RlZmluZSBNVF9JU0REUzIJCTB4NTIJLyogRERTIGRldmljZSB3aXRoIHBhcnRpdGlvbnMgKi8KKyNkZWZpbmUgTVRfSVNPTlNUUkVBTV9TQyAgICAgICAgMHg2MSAgIC8qIE9uU3RyZWFtIFNDU0kgdGFwZSBkcml2ZXMgKFNDLXgwKQorCQkJCQkgIGFuZCBTQ1NJIGVtdWxhdGVkIChESSwgRFAsIFVTQikgKi8KKyNkZWZpbmUgTVRfSVNTQ1NJMQkJMHg3MQkvKiBHZW5lcmljIEFOU0kgU0NTSS0xIHRhcGUgdW5pdCAqLworI2RlZmluZSBNVF9JU1NDU0kyCQkweDcyCS8qIEdlbmVyaWMgQU5TSSBTQ1NJLTIgdGFwZSB1bml0ICovCisKKy8qIFFJQy00MC84MC8zMDEwLzMwMjAgZnRhcGUgc3VwcG9ydGVkIGRyaXZlcy4KKyAqIDIwYml0IHZlbmRvciBJRCArIDB4ODAwMDAwIChzZWUgZnRhcGUtdmVuZG9ycy5oKQorICovCisjZGVmaW5lIE1UX0lTRlRBUEVfVU5LTk9XTgkweDgwMDAwMCAvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBNVF9JU0ZUQVBFX0ZMQUcJMHg4MDAwMDAKKworCisvKiBzdHJ1Y3R1cmUgZm9yIE1USU9DUE9TIC0gbWFnIHRhcGUgZ2V0IHBvc2l0aW9uIGNvbW1hbmQgKi8KKworc3RydWN0CW10cG9zIHsKKwlsb25nIAltdF9ibGtubzsJLyogY3VycmVudCBibG9jayBudW1iZXIgKi8KK307CisKKworLyogbWFnIHRhcGUgaW8gY29udHJvbCBjb21tYW5kcyAqLworI2RlZmluZQlNVElPQ1RPUAlfSU9XKCdtJywgMSwgc3RydWN0IG10b3ApCS8qIGRvIGEgbWFnIHRhcGUgb3AgKi8KKyNkZWZpbmUJTVRJT0NHRVQJX0lPUignbScsIDIsIHN0cnVjdCBtdGdldCkJLyogZ2V0IHRhcGUgc3RhdHVzICovCisjZGVmaW5lCU1USU9DUE9TCV9JT1IoJ20nLCAzLCBzdHJ1Y3QgbXRwb3MpCS8qIGdldCB0YXBlIHBvc2l0aW9uICovCisKKworLyogR2VuZXJpYyBNYWcgVGFwZSAoZGV2aWNlIGluZGVwZW5kZW50KSBzdGF0dXMgbWFjcm9zIGZvciBleGFtaW5pbmcKKyAqIG10X2dzdGF0IC0tIEhQLVVYIGNvbXBhdGlibGUuCisgKiBUaGVyZSBpcyByb29tIGZvciBtb3JlIGdlbmVyaWMgc3RhdHVzIGJpdHMgaGVyZSwgYnV0IEkgZG9uJ3QKKyAqIGtub3cgd2hpY2ggb2YgdGhlbSBhcmUgcmVzZXJ2ZWQuIEF0IGxlYXN0IHRocmVlIG9yIHNvIHNob3VsZAorICogYmUgYWRkZWQgdG8gbWFrZSB0aGlzIHJlYWxseSB1c2VmdWwuCisgKi8KKyNkZWZpbmUgR01UX0VPRih4KSAgICAgICAgICAgICAgKCh4KSAmIDB4ODAwMDAwMDApCisjZGVmaW5lIEdNVF9CT1QoeCkgICAgICAgICAgICAgICgoeCkgJiAweDQwMDAwMDAwKQorI2RlZmluZSBHTVRfRU9UKHgpICAgICAgICAgICAgICAoKHgpICYgMHgyMDAwMDAwMCkKKyNkZWZpbmUgR01UX1NNKHgpICAgICAgICAgICAgICAgKCh4KSAmIDB4MTAwMDAwMDApICAvKiBERFMgc2V0bWFyayAqLworI2RlZmluZSBHTVRfRU9EKHgpICAgICAgICAgICAgICAoKHgpICYgMHgwODAwMDAwMCkgIC8qIEREUyBFT0QgKi8KKyNkZWZpbmUgR01UX1dSX1BST1QoeCkgICAgICAgICAgKCh4KSAmIDB4MDQwMDAwMDApCisvKiAjZGVmaW5lIEdNVF8gPyAJCSgoeCkgJiAweDAyMDAwMDAwKSAqLworI2RlZmluZSBHTVRfT05MSU5FKHgpICAgICAgICAgICAoKHgpICYgMHgwMTAwMDAwMCkKKyNkZWZpbmUgR01UX0RfNjI1MCh4KSAgICAgICAgICAgKCh4KSAmIDB4MDA4MDAwMDApCisjZGVmaW5lIEdNVF9EXzE2MDAoeCkgICAgICAgICAgICgoeCkgJiAweDAwNDAwMDAwKQorI2RlZmluZSBHTVRfRF84MDAoeCkgICAgICAgICAgICAoKHgpICYgMHgwMDIwMDAwMCkKKy8qICNkZWZpbmUgR01UXyA/IAkJKCh4KSAmIDB4MDAxMDAwMDApICovCisvKiAjZGVmaW5lIEdNVF8gPyAJCSgoeCkgJiAweDAwMDgwMDAwKSAqLworI2RlZmluZSBHTVRfRFJfT1BFTih4KSAgICAgICAgICAoKHgpICYgMHgwMDA0MDAwMCkgIC8qIGRvb3Igb3BlbiAobm8gdGFwZSkgKi8KKy8qICNkZWZpbmUgR01UXyA/IAkJKCh4KSAmIDB4MDAwMjAwMDApICovCisjZGVmaW5lIEdNVF9JTV9SRVBfRU4oeCkgICAgICAgICgoeCkgJiAweDAwMDEwMDAwKSAgLyogaW1tZWRpYXRlIHJlcG9ydCBtb2RlICovCisjZGVmaW5lIEdNVF9DTE4oeCkgICAgICAgICAgICAgICgoeCkgJiAweDAwMDA4MDAwKSAgLyogY2xlYW5pbmcgcmVxdWVzdGVkICovCisvKiAxNSBnZW5lcmljIHN0YXR1cyBiaXRzIHVudXNlZCAqLworCisKKy8qIFNDU0ktdGFwZSBzcGVjaWZpYyBkZWZpbml0aW9ucyAqLworLyogQml0ZmllbGQgc2hpZnRzIGluIHRoZSBzdGF0dXMgICovCisjZGVmaW5lIE1UX1NUX0JMS1NJWkVfU0hJRlQJMAorI2RlZmluZSBNVF9TVF9CTEtTSVpFX01BU0sJMHhmZmZmZmYKKyNkZWZpbmUgTVRfU1RfREVOU0lUWV9TSElGVAkyNAorI2RlZmluZSBNVF9TVF9ERU5TSVRZX01BU0sJMHhmZjAwMDAwMAorCisjZGVmaW5lIE1UX1NUX1NPRlRFUlJfU0hJRlQJMAorI2RlZmluZSBNVF9TVF9TT0ZURVJSX01BU0sJMHhmZmZmCisKKy8qIEJpdGZpZWxkcyBmb3IgdGhlIE1UU0VURFJWQlVGRkVSIGlvY3RsICovCisjZGVmaW5lIE1UX1NUX09QVElPTlMJCTB4ZjAwMDAwMDAKKyNkZWZpbmUgTVRfU1RfQk9PTEVBTlMJCTB4MTAwMDAwMDAKKyNkZWZpbmUgTVRfU1RfU0VUQk9PTEVBTlMJMHgzMDAwMDAwMAorI2RlZmluZSBNVF9TVF9DTEVBUkJPT0xFQU5TCTB4NDAwMDAwMDAKKyNkZWZpbmUgTVRfU1RfV1JJVEVfVEhSRVNIT0xECTB4MjAwMDAwMDAKKyNkZWZpbmUgTVRfU1RfREVGX0JMS1NJWkUJMHg1MDAwMDAwMAorI2RlZmluZSBNVF9TVF9ERUZfT1BUSU9OUwkweDYwMDAwMDAwCisjZGVmaW5lIE1UX1NUX1RJTUVPVVRTCQkweDcwMDAwMDAwCisjZGVmaW5lIE1UX1NUX1NFVF9USU1FT1VUCShNVF9TVF9USU1FT1VUUyB8IDB4MDAwMDAwKQorI2RlZmluZSBNVF9TVF9TRVRfTE9OR19USU1FT1VUCShNVF9TVF9USU1FT1VUUyB8IDB4MTAwMDAwKQorI2RlZmluZSBNVF9TVF9TRVRfQ0xOCQkweDgwMDAwMDAwCisKKyNkZWZpbmUgTVRfU1RfQlVGRkVSX1dSSVRFUwkweDEKKyNkZWZpbmUgTVRfU1RfQVNZTkNfV1JJVEVTCTB4MgorI2RlZmluZSBNVF9TVF9SRUFEX0FIRUFECTB4NAorI2RlZmluZSBNVF9TVF9ERUJVR0dJTkcJCTB4OAorI2RlZmluZSBNVF9TVF9UV09fRk0JCTB4MTAKKyNkZWZpbmUgTVRfU1RfRkFTVF9NVEVPTQkweDIwCisjZGVmaW5lIE1UX1NUX0FVVE9fTE9DSwkJMHg0MAorI2RlZmluZSBNVF9TVF9ERUZfV1JJVEVTCTB4ODAKKyNkZWZpbmUgTVRfU1RfQ0FOX0JTUgkJMHgxMDAKKyNkZWZpbmUgTVRfU1RfTk9fQkxLTElNUwkweDIwMAorI2RlZmluZSBNVF9TVF9DQU5fUEFSVElUSU9OUyAgICAweDQwMAorI2RlZmluZSBNVF9TVF9TQ1NJMkxPR0lDQUwgICAgICAweDgwMAorI2RlZmluZSBNVF9TVF9TWVNWICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgTVRfU1RfTk9XQUlUICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIE1UX1NUX1NJTEkJCTB4NDAwMAorCisvKiBUaGUgbW9kZSBwYXJhbWV0ZXJzIHRvIGJlIGNvbnRyb2xsZWQuIFBhcmFtZXRlciBjaG9zZW4gd2l0aCBiaXRzIDIwLTI4ICovCisjZGVmaW5lIE1UX1NUX0NMRUFSX0RFRkFVTFQJMHhmZmZmZgorI2RlZmluZSBNVF9TVF9ERUZfREVOU0lUWQkoTVRfU1RfREVGX09QVElPTlMgfCAweDEwMDAwMCkKKyNkZWZpbmUgTVRfU1RfREVGX0NPTVBSRVNTSU9OCShNVF9TVF9ERUZfT1BUSU9OUyB8IDB4MjAwMDAwKQorI2RlZmluZSBNVF9TVF9ERUZfRFJWQlVGRkVSCShNVF9TVF9ERUZfT1BUSU9OUyB8IDB4MzAwMDAwKQorCisvKiBUaGUgb2Zmc2V0IGZvciB0aGUgYXJndW1lbnRzIGZvciB0aGUgc3BlY2lhbCBIUCBjaGFuZ2VyIGxvYWQgY29tbWFuZC4gKi8KKyNkZWZpbmUgTVRfU1RfSFBMT0FERVJfT0ZGU0VUIDEwMDAwCisKKyNlbmRpZiAvKiBfTElOVVhfTVRJT19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25fcjM5NjQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbl9yMzk2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYjU0NTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25fcjM5NjQuaApAQCAtMCwwICsxLDk4IEBACisvKiByMzk2NCBsaW5lZGlzY2lwbGluZSBmb3IgbGludXgKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IGJ5CisgKiBQaGlsaXBzIEF1dG9tYXRpb24gUHJvamVjdHMKKyAqIEthc3NlbCAoR2VybWFueSkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIEF1dGhvcjoKKyAqIEwuIEhhYWcKKyAqCisgKiAkTG9nOiByMzk2NC5oLHYgJAorICogUmV2aXNpb24gMS40ICAyMDA1LzEyLzIxIDE5OjU0OjI0ICBLdXJ0IEh1d2lnIDxrdXJ0IGh1d2lnIGRlPgorICogRml4ZWQgSFogdXNhZ2Ugb24gMi42IGtlcm5lbHMKKyAqIFJlbW92ZWQgdW5uZWNlc3NhcnkgaW5jbHVkZQorICoKKyAqIFJldmlzaW9uIDEuMyAgMjAwMS8wMy8xOCAxMzowMjoyNCAgZHdtdzIKKyAqIEZpeCB0aW1lciB1c2FnZSwgdXNlIHNwaW5sb2NrcyBwcm9wZXJseS4KKyAqCisgKiBSZXZpc2lvbiAxLjIgIDIwMDEvMDMvMTggMTI6NTM6MTUgIGR3bXcyCisgKiBNZXJnZSBjaGFuZ2VzIGluIDIuNC4yCisgKgorICogUmV2aXNpb24gMS4xLjEuMSAgMTk5OC8xMC8xMyAxNjo0MzoxNCAgZHdtdzIKKyAqIFRoaXMnbGwgc2NyZXcgdGhlIHZlcnNpb24gY29udHJvbAorICoKKyAqIFJldmlzaW9uIDEuNiAgMTk5OC8wOS8zMCAwMDo0MDozOCAgZHdtdzIKKyAqIFVwZGF0ZWQgdG8gdXNlIGtlcm5lbCdzIE5fUjM5NjQgaWYgYXZhaWxhYmxlCisgKgorICogUmV2aXNpb24gMS40ICAxOTk4LzA0LzAyIDIwOjI5OjQ0ICBsaGFhZworICogc2VsZWN0LCBibG9ja2luZywgLi4uCisgKgorICogUmV2aXNpb24gMS4zICAxOTk4LzAyLzEyIDE4OjU4OjQzICByb290CisgKiBmaXhlZCBzb21lIG1lbW9yeSBsZWFrcworICogY2FsY3VsYXRpb24gb2YgY2hlY2tzdW0gY2hhcmFjdGVycworICoKKyAqIFJldmlzaW9uIDEuMiAgMTk5OC8wMi8wNyAxMzowMzoxNyAgcm9vdAorICogaW9jdGwgcmVhZF90ZWxlZ3JhbQorICoKKyAqIFJldmlzaW9uIDEuMSAgMTk5OC8wMi8wNiAxOToxOTo0MyAgcm9vdAorICogSW5pdGlhbCByZXZpc2lvbgorICoKKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX05fUjM5NjRfSF9fCisjZGVmaW5lIF9fTElOVVhfTl9SMzk2NF9IX18KKworLyogbGluZSBkaXNjaXBsaW5lcyBmb3IgcjM5NjQgcHJvdG9jb2wgKi8KKworCisvKgorICogSW9jdGwtY29tbWFuZHMKKyAqLworCisjZGVmaW5lIFIzOTY0X0VOQUJMRV9TSUdOQUxTICAgICAgMHg1MzAxCisjZGVmaW5lIFIzOTY0X1NFVFBSSU9SSVRZICAgICAgICAgMHg1MzAyCisjZGVmaW5lIFIzOTY0X1VTRV9CQ0MgICAgICAgICAgICAgMHg1MzAzCisjZGVmaW5lIFIzOTY0X1JFQURfVEVMRUdSQU0gICAgICAgMHg1MzA0CisKKy8qIE9wdGlvbnMgZm9yIFIzOTY0X1NFVFBSSU9SSVRZICovCisjZGVmaW5lIFIzOTY0X01BU1RFUiAgIDAKKyNkZWZpbmUgUjM5NjRfU0xBVkUgICAgMQorCisvKiBPcHRpb25zIGZvciBSMzk2NF9FTkFCTEVfU0lHTkFMUyAqLworI2RlZmluZSBSMzk2NF9TSUdfQUNLICAgMHgwMDAxCisjZGVmaW5lIFIzOTY0X1NJR19EQVRBICAweDAwMDIKKyNkZWZpbmUgUjM5NjRfU0lHX0FMTCAgIDB4MDAwZgorI2RlZmluZSBSMzk2NF9TSUdfTk9ORSAgMHgwMDAwCisjZGVmaW5lIFIzOTY0X1VTRV9TSUdJTyAweDEwMDAKKworLyoKKyAqIHIzOTY0IG9wZXJhdGlvbiBzdGF0ZXM6CisgKi8KKworLyogdHlwZXMgZm9yIG1zZ19pZDogKi8KK2VudW0ge1IzOTY0X01TR19BQ0s9MSwgUjM5NjRfTVNHX0RBVEEgfTsKKworI2RlZmluZSBSMzk2NF9NQVhfTVNHX0NPVU5UIDMyCisKKy8qIGVycm9yIGNvZGVzIGZvciBjbGllbnQgbWVzc2FnZXMgKi8KKyNkZWZpbmUgUjM5NjRfT0sgMCAgICAgICAgLyogbm8gZXJyb3IuICovCisjZGVmaW5lIFIzOTY0X1RYX0ZBSUwgLTEgIC8qIHRyYW5zbWlzc2lvbiBlcnJvciwgYmxvY2sgTk9UIHNlbnQgKi8KKyNkZWZpbmUgUjM5NjRfT1ZFUkZMT1cgLTIgLyogbXNnIHF1ZXVlIG92ZXJmbG93ICovCisKKy8qIHRoZSBjbGllbnQgZ2V0cyB0aGlzIHN0cnVjdCB3aGVuIGNhbGxpbmcgcmVhZChmZCwuLi4pOiAqLworc3RydWN0IHIzOTY0X2NsaWVudF9tZXNzYWdlIHsKKwkgIGludCAgICAgbXNnX2lkOworCSAgaW50ICAgICBhcmc7CisJICBpbnQgICAgIGVycm9yX2NvZGU7Cit9OworCisjZGVmaW5lIFIzOTY0X01UVSAgICAgIDI1NgorCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25iZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uYmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGQyOTg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uYmQuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogMTk5OSBDb3B5cmlnaHQgKEMpIFBhdmVsIE1hY2hlaywgcGF2ZWxAdWN3LmN6LiBUaGlzIGNvZGUgaXMgR1BMLgorICogMTk5OS8xMS8wNCBDb3B5cmlnaHQgKEMpIDE5OTkgVk13YXJlLCBJbmMuIChSZWdpcyAiSFBSZWciIER1Y2hlc25lKQorICogICAgICAgICAgICBNYWRlIG5iZF9lbmRfcmVxdWVzdCgpIHVzZSB0aGUgaW9fcmVxdWVzdF9sb2NrCisgKiAyMDAxIENvcHlyaWdodCAoQykgU3RldmVuIFdoaXRlaG91c2UKKyAqICAgICAgICAgICAgTmV3IG5iZF9lbmRfcmVxdWVzdCgpIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbmV3IGxpbnV4IGJsb2NrCisgKiAgICAgICAgICAgIGxheWVyIGNvZGUuCisgKiAyMDAzLzA2LzI0IExvdWlzIEQuIExhbmdob2x0eiA8bGRsQGFyb3MubmV0PgorICogICAgICAgICAgICBSZW1vdmVkIHVubmVlZGVkIGJsa3NpemVfYml0cyBmaWVsZCBmcm9tIG5iZF9kZXZpY2Ugc3RydWN0LgorICogICAgICAgICAgICBDbGVhbnVwIFBBUkFOT0lBIHVzYWdlICYgY29kZS4KKyAqIDIwMDQvMDIvMTkgUGF1bCBDbGVtZW50cworICogICAgICAgICAgICBSZW1vdmVkIFBBUkFOT0lBLCBwbHVzIHZhcmlvdXMgY2xlYW51cCBhbmQgY29tbWVudHMKKyAqLworCisjaWZuZGVmIExJTlVYX05CRF9ICisjZGVmaW5lIExJTlVYX05CRF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIE5CRF9TRVRfU09DSwlfSU8oIDB4YWIsIDAgKQorI2RlZmluZSBOQkRfU0VUX0JMS1NJWkUJX0lPKCAweGFiLCAxICkKKyNkZWZpbmUgTkJEX1NFVF9TSVpFCV9JTyggMHhhYiwgMiApCisjZGVmaW5lIE5CRF9ET19JVAlfSU8oIDB4YWIsIDMgKQorI2RlZmluZSBOQkRfQ0xFQVJfU09DSwlfSU8oIDB4YWIsIDQgKQorI2RlZmluZSBOQkRfQ0xFQVJfUVVFCV9JTyggMHhhYiwgNSApCisjZGVmaW5lIE5CRF9QUklOVF9ERUJVRwlfSU8oIDB4YWIsIDYgKQorI2RlZmluZSBOQkRfU0VUX1NJWkVfQkxPQ0tTCV9JTyggMHhhYiwgNyApCisjZGVmaW5lIE5CRF9ESVNDT05ORUNUICBfSU8oIDB4YWIsIDggKQorI2RlZmluZSBOQkRfU0VUX1RJTUVPVVQgX0lPKCAweGFiLCA5ICkKKworZW51bSB7CisJTkJEX0NNRF9SRUFEID0gMCwKKwlOQkRfQ01EX1dSSVRFID0gMSwKKwlOQkRfQ01EX0RJU0MgPSAyCit9OworCisjZGVmaW5lIG5iZF9jbWQocmVxKSAoKHJlcSktPmNtZFswXSkKKworLyogdXNlcnNwYWNlIGRvZXNuJ3QgbmVlZCB0aGUgbmJkX2RldmljZSBzdHJ1Y3R1cmUgKi8KKworLyogVGhlc2UgYXJlIHNlbnQgb3ZlciB0aGUgbmV0d29yayBpbiB0aGUgcmVxdWVzdC9yZXBseSBtYWdpYyBmaWVsZHMgKi8KKworI2RlZmluZSBOQkRfUkVRVUVTVF9NQUdJQyAweDI1NjA5NTEzCisjZGVmaW5lIE5CRF9SRVBMWV9NQUdJQyAweDY3NDQ2Njk4CisvKiBEbyAqbm90KiB1c2UgbWFnaWNzOiAweDEyNTYwOTUzIDB4OTY3NDQ2NjguICovCisKKy8qCisgKiBUaGlzIGlzIHRoZSBwYWNrZXQgdXNlZCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGNsaWVudCBhbmQKKyAqIHNlcnZlci4gQWxsIGRhdGEgYXJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqLworc3RydWN0IG5iZF9yZXF1ZXN0IHsKKwlfX2JlMzIgbWFnaWM7CisJX19iZTMyIHR5cGU7CS8qID09IFJFQUQgfHwgPT0gV1JJVEUgCSovCisJY2hhciBoYW5kbGVbOF07CisJX19iZTY0IGZyb207CisJX19iZTMyIGxlbjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qCisgKiBUaGlzIGlzIHRoZSByZXBseSBwYWNrZXQgdGhhdCBuYmQtc2VydmVyIHNlbmRzIGJhY2sgdG8gdGhlIGNsaWVudCBhZnRlcgorICogaXQgaGFzIGNvbXBsZXRlZCBhbiBJL08gcmVxdWVzdCAob3IgYW4gZXJyb3Igb2NjdXJzKS4KKyAqLworc3RydWN0IG5iZF9yZXBseSB7CisJX19iZTMyIG1hZ2ljOworCV9fYmUzMiBlcnJvcjsJCS8qIDAgPSBvaywgZWxzZSBlcnJvcgkqLworCWNoYXIgaGFuZGxlWzhdOwkJLyogaGFuZGxlIHlvdSBnb3QgZnJvbSByZXF1ZXN0CSovCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25jcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uY3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDgyYWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uY3AuaApAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqICBuY3AuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUgYnkgVm9sa2VyIExlbmRlY2tlCisgKiAgTW9kaWZpZWQgZm9yIHNwYXJjIGJ5IEouRi4gQ2hhZGltYQorICogIE1vZGlmaWVkIGZvciBfX2NvbnN0YW50X250b2ggYnkgRnJhbmsgQS4gVm9yc3RlbmJvc2NoCisgKgorICovCisKKyNpZm5kZWYgX0xJTlVYX05DUF9ICisjZGVmaW5lIF9MSU5VWF9OQ1BfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBOQ1BfUFRZUEUgICAgICAgICAgICAgICAgKDB4MTEpCisjZGVmaW5lIE5DUF9QT1JUICAgICAgICAgICAgICAgICAoMHgwNDUxKQorCisjZGVmaW5lIE5DUF9BTExPQ19TTE9UX1JFUVVFU1QgICAoMHgxMTExKQorI2RlZmluZSBOQ1BfUkVRVUVTVCAgICAgICAgICAgICAgKDB4MjIyMikKKyNkZWZpbmUgTkNQX0RFQUxMT0NfU0xPVF9SRVFVRVNUICgweDU1NTUpCisKK3N0cnVjdCBuY3BfcmVxdWVzdF9oZWFkZXIgeworCV9fdTE2IHR5cGU7CisJX191OCBzZXF1ZW5jZTsKKwlfX3U4IGNvbm5fbG93OworCV9fdTggdGFzazsKKwlfX3U4IGNvbm5faGlnaDsKKwlfX3U4IGZ1bmN0aW9uOworCV9fdTggZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgTkNQX1JFUExZICAgICAgICAgICAgICAgICgweDMzMzMpCisjZGVmaW5lIE5DUF9XQVRDSERPRwkJICgweDNFM0UpCisjZGVmaW5lIE5DUF9QT1NJVElWRV9BQ0sgICAgICAgICAoMHg5OTk5KQorCitzdHJ1Y3QgbmNwX3JlcGx5X2hlYWRlciB7CisJX191MTYgdHlwZTsKKwlfX3U4IHNlcXVlbmNlOworCV9fdTggY29ubl9sb3c7CisJX191OCB0YXNrOworCV9fdTggY29ubl9oaWdoOworCV9fdTggY29tcGxldGlvbl9jb2RlOworCV9fdTggY29ubmVjdGlvbl9zdGF0ZTsKKwlfX3U4IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIE5DUF9WT0xOQU1FX0xFTiAoMTYpCisjZGVmaW5lIE5DUF9OVU1CRVJfT0ZfVk9MVU1FUyAoMjU2KQorc3RydWN0IG5jcF92b2x1bWVfaW5mbyB7CisJX191MzIgdG90YWxfYmxvY2tzOworCV9fdTMyIGZyZWVfYmxvY2tzOworCV9fdTMyIHB1cmdlYWJsZV9ibG9ja3M7CisJX191MzIgbm90X3lldF9wdXJnZWFibGVfYmxvY2tzOworCV9fdTMyIHRvdGFsX2Rpcl9lbnRyaWVzOworCV9fdTMyIGF2YWlsYWJsZV9kaXJfZW50cmllczsKKwlfX3U4IHNlY3RvcnNfcGVyX2Jsb2NrOworCWNoYXIgdm9sdW1lX25hbWVbTkNQX1ZPTE5BTUVfTEVOICsgMV07Cit9OworCisjZGVmaW5lIEFSX1JFQUQgICAgICAoY3B1X3RvX2xlMTYoMSkpCisjZGVmaW5lIEFSX1dSSVRFICAgICAoY3B1X3RvX2xlMTYoMikpCisjZGVmaW5lIEFSX0VYQ0xVU0lWRSAoY3B1X3RvX2xlMTYoMHgyMCkpCisKKyNkZWZpbmUgTkNQX0ZJTEVfSURfTEVOIDYKKworLyogRGVmaW5lcyBmb3IgTmFtZSBTcGFjZXMgKi8KKyNkZWZpbmUgTldfTlNfRE9TICAgICAwCisjZGVmaW5lIE5XX05TX01BQyAgICAgMQorI2RlZmluZSBOV19OU19ORlMgICAgIDIKKyNkZWZpbmUgTldfTlNfRlRBTSAgICAzCisjZGVmaW5lIE5XX05TX09TMiAgICAgNAorCisvKiAgRGVmaW5lcyBmb3IgUmV0dXJuSW5mb3JtYXRpb25NYXNrICovCisjZGVmaW5lIFJJTV9OQU1FCSAgICAgIChjcHVfdG9fbGUzMigxKSkKKyNkZWZpbmUgUklNX1NQQUNFX0FMTE9DQVRFRCAgIChjcHVfdG9fbGUzMigyKSkKKyNkZWZpbmUgUklNX0FUVFJJQlVURVMJICAgICAgKGNwdV90b19sZTMyKDQpKQorI2RlZmluZSBSSU1fREFUQV9TSVpFCSAgICAgIChjcHVfdG9fbGUzMig4KSkKKyNkZWZpbmUgUklNX1RPVEFMX1NJWkUJICAgICAgKGNwdV90b19sZTMyKDB4MTApKQorI2RlZmluZSBSSU1fRVhUX0FUVFJfSU5GTyAgICAgKGNwdV90b19sZTMyKDB4MjApKQorI2RlZmluZSBSSU1fQVJDSElWRQkgICAgICAoY3B1X3RvX2xlMzIoMHg0MCkpCisjZGVmaW5lIFJJTV9NT0RJRlkJICAgICAgKGNwdV90b19sZTMyKDB4ODApKQorI2RlZmluZSBSSU1fQ1JFQVRJT04JICAgICAgKGNwdV90b19sZTMyKDB4MTAwKSkKKyNkZWZpbmUgUklNX09XTklOR19OQU1FU1BBQ0UgIChjcHVfdG9fbGUzMigweDIwMCkpCisjZGVmaW5lIFJJTV9ESVJFQ1RPUlkJICAgICAgKGNwdV90b19sZTMyKDB4NDAwKSkKKyNkZWZpbmUgUklNX1JJR0hUUwkgICAgICAoY3B1X3RvX2xlMzIoMHg4MDApKQorI2RlZmluZSBSSU1fQUxMIAkgICAgICAoY3B1X3RvX2xlMzIoMHhGRkYpKQorI2RlZmluZSBSSU1fQ09NUFJFU1NFRF9JTkZPICAgKGNwdV90b19sZTMyKDB4ODAwMDAwMDApKQorCisvKiBEZWZpbmVzIGZvciBOU0luZm9CaXRNYXNrICovCisjZGVmaW5lIE5TSUJNX05GU19OQU1FCQkweDAwMDEKKyNkZWZpbmUgTlNJQk1fTkZTX01PREUJCTB4MDAwMgorI2RlZmluZSBOU0lCTV9ORlNfR0lECQkweDAwMDQKKyNkZWZpbmUgTlNJQk1fTkZTX05MSU5LUwkweDAwMDgKKyNkZWZpbmUgTlNJQk1fTkZTX1JERVYJCTB4MDAxMAorI2RlZmluZSBOU0lCTV9ORlNfTElOSwkJMHgwMDIwCisjZGVmaW5lIE5TSUJNX05GU19DUkVBVEVECTB4MDA0MAorI2RlZmluZSBOU0lCTV9ORlNfVUlECQkweDAwODAKKyNkZWZpbmUgTlNJQk1fTkZTX0FDU0ZMQUcJMHgwMTAwCisjZGVmaW5lIE5TSUJNX05GU19NWUZMQUcJMHgwMjAwCisKKy8qIG9wZW4vY3JlYXRlIG1vZGVzICovCisjZGVmaW5lIE9DX01PREVfT1BFTgkgIDB4MDEKKyNkZWZpbmUgT0NfTU9ERV9UUlVOQ0FURSAgMHgwMgorI2RlZmluZSBPQ19NT0RFX1JFUExBQ0UgICAweDAyCisjZGVmaW5lIE9DX01PREVfQ1JFQVRFCSAgMHgwOAorCisvKiBvcGVuL2NyZWF0ZSByZXN1bHRzICovCisjZGVmaW5lIE9DX0FDVElPTl9OT05FCSAgIDB4MDAKKyNkZWZpbmUgT0NfQUNUSU9OX09QRU4JICAgMHgwMQorI2RlZmluZSBPQ19BQ1RJT05fQ1JFQVRFICAgMHgwMgorI2RlZmluZSBPQ19BQ1RJT05fVFJVTkNBVEUgMHgwNAorI2RlZmluZSBPQ19BQ1RJT05fUkVQTEFDRSAgMHgwNAorCisvKiBhY2Nlc3MgcmlnaHRzIGF0dHJpYnV0ZXMgKi8KKyNpZm5kZWYgQVJfUkVBRF9PTkxZCisjZGVmaW5lIEFSX1JFQURfT05MWQkgICAweDAwMDEKKyNkZWZpbmUgQVJfV1JJVEVfT05MWQkgICAweDAwMDIKKyNkZWZpbmUgQVJfREVOWV9SRUFECSAgIDB4MDAwNAorI2RlZmluZSBBUl9ERU5ZX1dSSVRFCSAgIDB4MDAwOAorI2RlZmluZSBBUl9DT01QQVRJQklMSVRZICAgMHgwMDEwCisjZGVmaW5lIEFSX1dSSVRFX1RIUk9VR0ggICAweDAwNDAKKyNkZWZpbmUgQVJfT1BFTl9DT01QUkVTU0VEIDB4MDEwMAorI2VuZGlmCisKK3N0cnVjdCBud19uZnNfaW5mbyB7CisJX191MzIgbW9kZTsKKwlfX3UzMiByZGV2OworfTsKKworc3RydWN0IG53X2luZm9fc3RydWN0IHsKKwlfX3UzMiBzcGFjZUFsbG9jOworCV9fbGUzMiBhdHRyaWJ1dGVzOworCV9fdTE2IGZsYWdzOworCV9fbGUzMiBkYXRhU3RyZWFtU2l6ZTsKKwlfX2xlMzIgdG90YWxTdHJlYW1TaXplOworCV9fdTE2IG51bWJlck9mU3RyZWFtczsKKwlfX2xlMTYgY3JlYXRpb25UaW1lOworCV9fbGUxNiBjcmVhdGlvbkRhdGU7CisJX191MzIgY3JlYXRvcklEOworCV9fbGUxNiBtb2RpZnlUaW1lOworCV9fbGUxNiBtb2RpZnlEYXRlOworCV9fdTMyIG1vZGlmaWVySUQ7CisJX19sZTE2IGxhc3RBY2Nlc3NEYXRlOworCV9fdTE2IGFyY2hpdmVUaW1lOworCV9fdTE2IGFyY2hpdmVEYXRlOworCV9fdTMyIGFyY2hpdmVySUQ7CisJX191MTYgaW5oZXJpdGVkUmlnaHRzTWFzazsKKwlfX2xlMzIgZGlyRW50TnVtOworCV9fbGUzMiBEb3NEaXJOdW07CisJX191MzIgdm9sTnVtYmVyOworCV9fdTMyIEVBRGF0YVNpemU7CisJX191MzIgRUFLZXlDb3VudDsKKwlfX3UzMiBFQUtleVNpemU7CisJX191MzIgTlNDcmVhdG9yOworCV9fdTggbmFtZUxlbjsKKwlfX3U4IGVudHJ5TmFtZVsyNTZdOworCS8qIGxpYm5jcCBtYXkgZGVwZW5kIG9uIHRoZXJlIGJlaW5nIG5vdGhpbmcgYWZ0ZXIgZW50cnlOYW1lICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBtb2RpZnkgbWFzayAtIHVzZSB3aXRoIE1PRElGWV9ET1NfSU5GTyBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgRE1fQVRUUklCVVRFUwkJICAoY3B1X3RvX2xlMzIoMHgwMikpCisjZGVmaW5lIERNX0NSRUFURV9EQVRFCQkgIChjcHVfdG9fbGUzMigweDA0KSkKKyNkZWZpbmUgRE1fQ1JFQVRFX1RJTUUJCSAgKGNwdV90b19sZTMyKDB4MDgpKQorI2RlZmluZSBETV9DUkVBVE9SX0lECQkgIChjcHVfdG9fbGUzMigweDEwKSkKKyNkZWZpbmUgRE1fQVJDSElWRV9EQVRFIAkgIChjcHVfdG9fbGUzMigweDIwKSkKKyNkZWZpbmUgRE1fQVJDSElWRV9USU1FIAkgIChjcHVfdG9fbGUzMigweDQwKSkKKyNkZWZpbmUgRE1fQVJDSElWRVJfSUQJCSAgKGNwdV90b19sZTMyKDB4ODApKQorI2RlZmluZSBETV9NT0RJRllfREFURQkJICAoY3B1X3RvX2xlMzIoMHgwMTAwKSkKKyNkZWZpbmUgRE1fTU9ESUZZX1RJTUUJCSAgKGNwdV90b19sZTMyKDB4MDIwMCkpCisjZGVmaW5lIERNX01PRElGSUVSX0lECQkgIChjcHVfdG9fbGUzMigweDA0MDApKQorI2RlZmluZSBETV9MQVNUX0FDQ0VTU19EQVRFCSAgKGNwdV90b19sZTMyKDB4MDgwMCkpCisjZGVmaW5lIERNX0lOSEVSSVRFRF9SSUdIVFNfTUFTSyAgKGNwdV90b19sZTMyKDB4MTAwMCkpCisjZGVmaW5lIERNX01BWElNVU1fU1BBQ0UJICAoY3B1X3RvX2xlMzIoMHgyMDAwKSkKKworc3RydWN0IG53X21vZGlmeV9kb3NfaW5mbyB7CisJX19sZTMyIGF0dHJpYnV0ZXM7CisJX19sZTE2IGNyZWF0aW9uRGF0ZTsKKwlfX2xlMTYgY3JlYXRpb25UaW1lOworCV9fdTMyIGNyZWF0b3JJRDsKKwlfX2xlMTYgbW9kaWZ5RGF0ZTsKKwlfX2xlMTYgbW9kaWZ5VGltZTsKKwlfX3UzMiBtb2RpZmllcklEOworCV9fdTE2IGFyY2hpdmVEYXRlOworCV9fdTE2IGFyY2hpdmVUaW1lOworCV9fdTMyIGFyY2hpdmVySUQ7CisJX19sZTE2IGxhc3RBY2Nlc3NEYXRlOworCV9fdTE2IGluaGVyaXRhbmNlR3JhbnRNYXNrOworCV9fdTE2IGluaGVyaXRhbmNlUmV2b2tlTWFzazsKKwlfX3UzMiBtYXhpbXVtU3BhY2U7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgbndfc2VhcmNoX3NlcXVlbmNlIHsKKwlfX3U4IHZvbE51bWJlcjsKKwlfX3UzMiBkaXJCYXNlOworCV9fdTMyIHNlcXVlbmNlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2VuZGlmCQkJCS8qIF9MSU5VWF9OQ1BfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uY3BfZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmNwX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4NDQ2OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmNwX2ZzLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiAgbmNwX2ZzLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IGJ5IFZvbGtlciBMZW5kZWNrZQorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9OQ1BfRlNfSAorI2RlZmluZSBfTElOVVhfTkNQX0ZTX0gKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pcHguaD4KKyNpbmNsdWRlIDxsaW51eC9uY3Bfbm8uaD4KKworLyoKKyAqIGlvY3RsIGNvbW1hbmRzCisgKi8KKworc3RydWN0IG5jcF9pb2N0bF9yZXF1ZXN0IHsKKwl1bnNpZ25lZCBpbnQgZnVuY3Rpb247CisJdW5zaWduZWQgaW50IHNpemU7CisJY2hhciAqZGF0YTsKK307CisKK3N0cnVjdCBuY3BfZnNfaW5mbyB7CisJaW50IHZlcnNpb247CisJc3RydWN0IHNvY2thZGRyX2lweCBhZGRyOworCV9fa2VybmVsX3VpZF90IG1vdW50ZWRfdWlkOworCWludCBjb25uZWN0aW9uOwkJLyogQ29ubmVjdGlvbiBudW1iZXIgdGhlIHNlcnZlciBhc3NpZ25lZCB1cyAqLworCWludCBidWZmZXJfc2l6ZTsJLyogVGhlIG5lZ290aWF0ZWQgYnVmZmVyIHNpemUsIHRvIGJlCisJCQkJICAgdXNlZCBmb3IgcmVhZC93cml0ZSByZXF1ZXN0cyEgKi8KKworCWludCB2b2x1bWVfbnVtYmVyOworCV9fbGUzMiBkaXJlY3RvcnlfaWQ7Cit9OworCitzdHJ1Y3QgbmNwX2ZzX2luZm9fdjIgeworCWludCB2ZXJzaW9uOworCXVuc2lnbmVkIGxvbmcgbW91bnRlZF91aWQ7CisJdW5zaWduZWQgaW50IGNvbm5lY3Rpb247CisJdW5zaWduZWQgaW50IGJ1ZmZlcl9zaXplOworCisJdW5zaWduZWQgaW50IHZvbHVtZV9udW1iZXI7CisJX19sZTMyIGRpcmVjdG9yeV9pZDsKKworCV9fdTMyIGR1bW15MTsKKwlfX3UzMiBkdW1teTI7CisJX191MzIgZHVtbXkzOworfTsKKworc3RydWN0IG5jcF9zaWduX2luaXQKK3sKKwljaGFyIHNpZ25fcm9vdFs4XTsKKwljaGFyIHNpZ25fbGFzdFsxNl07Cit9OworCitzdHJ1Y3QgbmNwX2xvY2tfaW9jdGwKK3sKKyNkZWZpbmUgTkNQX0xPQ0tfTE9HCTAKKyNkZWZpbmUgTkNQX0xPQ0tfU0gJMQorI2RlZmluZSBOQ1BfTE9DS19FWAkyCisjZGVmaW5lIE5DUF9MT0NLX0NMRUFSCTI1NgorCWludAkJY21kOworCWludAkJb3JpZ2luOworCXVuc2lnbmVkIGludAlvZmZzZXQ7CisJdW5zaWduZWQgaW50CWxlbmd0aDsKKyNkZWZpbmUgTkNQX0xPQ0tfREVGQVVMVF9USU1FT1VUCTE4CisjZGVmaW5lIE5DUF9MT0NLX01BWF9USU1FT1VUCQkxODAKKwlpbnQJCXRpbWVvdXQ7Cit9OworCitzdHJ1Y3QgbmNwX3NldHJvb3RfaW9jdGwKK3sKKwlpbnQJCXZvbE51bWJlcjsKKwlpbnQJCW5hbWVzcGFjZTsKKwlfX2xlMzIJCWRpckVudE51bTsKK307CisKK3N0cnVjdCBuY3Bfb2JqZWN0bmFtZV9pb2N0bAoreworI2RlZmluZSBOQ1BfQVVUSF9OT05FCTB4MDAKKyNkZWZpbmUgTkNQX0FVVEhfQklORAkweDMxCisjZGVmaW5lIE5DUF9BVVRIX05EUwkweDMyCisJaW50CQlhdXRoX3R5cGU7CisJc2l6ZV90CQlvYmplY3RfbmFtZV9sZW47CisJdm9pZCAqCW9iamVjdF9uYW1lOwkvKiBhIHVzZXJzcGFjZSBkYXRhLCBpbiBtb3N0IGNhc2VzIHVzZXIgbmFtZSAqLworfTsKKworc3RydWN0IG5jcF9wcml2YXRlZGF0YV9pb2N0bAoreworCXNpemVfdAkJbGVuOworCXZvaWQgKglkYXRhOwkJLyogfjEwMDAgZm9yIE5EUyAqLworfTsKKworLyogTkxTIGNoYXJzZXRzIGJ5IGlvY3RsICovCisjZGVmaW5lIE5DUF9JT0NTTkFNRV9MRU4gMjAKK3N0cnVjdCBuY3BfbmxzX2lvY3RsCit7CisJdW5zaWduZWQgY2hhciBjb2RlcGFnZVtOQ1BfSU9DU05BTUVfTEVOKzFdOworCXVuc2lnbmVkIGNoYXIgaW9jaGFyc2V0W05DUF9JT0NTTkFNRV9MRU4rMV07Cit9OworCisjZGVmaW5lCU5DUF9JT0NfTkNQUkVRVUVTVAkJX0lPUignbicsIDEsIHN0cnVjdCBuY3BfaW9jdGxfcmVxdWVzdCkKKyNkZWZpbmUJTkNQX0lPQ19HRVRNT1VOVFVJRAkJX0lPVygnbicsIDIsIF9fa2VybmVsX29sZF91aWRfdCkKKyNkZWZpbmUgTkNQX0lPQ19HRVRNT1VOVFVJRDIJCV9JT1coJ24nLCAyLCB1bnNpZ25lZCBsb25nKQorCisjZGVmaW5lIE5DUF9JT0NfQ09OTl9MT0dHRURfSU4gICAgICAgICAgX0lPKCduJywgMykKKworI2RlZmluZSBOQ1BfR0VUX0ZTX0lORk9fVkVSU0lPTiAgICAoMSkKKyNkZWZpbmUgTkNQX0lPQ19HRVRfRlNfSU5GTyAgICAgICAgICAgICBfSU9XUignbicsIDQsIHN0cnVjdCBuY3BfZnNfaW5mbykKKyNkZWZpbmUgTkNQX0dFVF9GU19JTkZPX1ZFUlNJT05fVjIgKDIpCisjZGVmaW5lIE5DUF9JT0NfR0VUX0ZTX0lORk9fVjIJCV9JT1dSKCduJywgNCwgc3RydWN0IG5jcF9mc19pbmZvX3YyKQorCisjZGVmaW5lIE5DUF9JT0NfU0lHTl9JTklUCQlfSU9SKCduJywgNSwgc3RydWN0IG5jcF9zaWduX2luaXQpCisjZGVmaW5lIE5DUF9JT0NfU0lHTl9XQU5URUQJCV9JT1IoJ24nLCA2LCBpbnQpCisjZGVmaW5lIE5DUF9JT0NfU0VUX1NJR05fV0FOVEVECQlfSU9XKCduJywgNiwgaW50KQorCisjZGVmaW5lIE5DUF9JT0NfTE9DS1VOTE9DSwkJX0lPUignbicsIDcsIHN0cnVjdCBuY3BfbG9ja19pb2N0bCkKKworI2RlZmluZSBOQ1BfSU9DX0dFVFJPT1QJCQlfSU9XKCduJywgOCwgc3RydWN0IG5jcF9zZXRyb290X2lvY3RsKQorI2RlZmluZSBOQ1BfSU9DX1NFVFJPT1QJCQlfSU9SKCduJywgOCwgc3RydWN0IG5jcF9zZXRyb290X2lvY3RsKQorCisjZGVmaW5lIE5DUF9JT0NfR0VUT0JKRUNUTkFNRQkJX0lPV1IoJ24nLCA5LCBzdHJ1Y3QgbmNwX29iamVjdG5hbWVfaW9jdGwpCisjZGVmaW5lIE5DUF9JT0NfU0VUT0JKRUNUTkFNRQkJX0lPUignbicsIDksIHN0cnVjdCBuY3Bfb2JqZWN0bmFtZV9pb2N0bCkKKyNkZWZpbmUgTkNQX0lPQ19HRVRQUklWQVRFREFUQQkJX0lPV1IoJ24nLCAxMCwgc3RydWN0IG5jcF9wcml2YXRlZGF0YV9pb2N0bCkKKyNkZWZpbmUgTkNQX0lPQ19TRVRQUklWQVRFREFUQQkJX0lPUignbicsIDEwLCBzdHJ1Y3QgbmNwX3ByaXZhdGVkYXRhX2lvY3RsKQorCisjZGVmaW5lIE5DUF9JT0NfR0VUQ0hBUlNFVFMJCV9JT1dSKCduJywgMTEsIHN0cnVjdCBuY3BfbmxzX2lvY3RsKQorI2RlZmluZSBOQ1BfSU9DX1NFVENIQVJTRVRTCQlfSU9SKCduJywgMTEsIHN0cnVjdCBuY3BfbmxzX2lvY3RsKQorCisjZGVmaW5lIE5DUF9JT0NfR0VUREVOVFJZVFRMCQlfSU9XKCduJywgMTIsIF9fdTMyKQorI2RlZmluZSBOQ1BfSU9DX1NFVERFTlRSWVRUTAkJX0lPUignbicsIDEyLCBfX3UzMikKKworLyoKKyAqIFRoZSBwYWNrZXQgc2l6ZSB0byBhbGxvY2F0ZS4gT25lIHBhZ2Ugc2hvdWxkIGJlIGVub3VnaC4KKyAqLworI2RlZmluZSBOQ1BfUEFDS0VUX1NJWkUgNDA3MAorCisjZGVmaW5lIE5DUF9NQVhQQVRITEVOIDI1NQorI2RlZmluZSBOQ1BfTUFYTkFNRUxFTiAxNAorCisjZW5kaWYJCQkJLyogX0xJTlVYX05DUF9GU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25jcF9tb3VudC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uY3BfbW91bnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmNiZWEyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uY3BfbW91bnQuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogIG5jcF9tb3VudC5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBieSBWb2xrZXIgTGVuZGVja2UKKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfTkNQX01PVU5UX0gKKyNkZWZpbmUgX0xJTlVYX05DUF9NT1VOVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25jcC5oPgorCisjZGVmaW5lIE5DUF9NT1VOVF9WRVJTSU9OIDMJLyogQmluYXJ5ICovCisKKy8qIFZhbHVlcyBmb3IgZmxhZ3MgKi8KKyNkZWZpbmUgTkNQX01PVU5UX1NPRlQJCTB4MDAwMQorI2RlZmluZSBOQ1BfTU9VTlRfSU5UUgkJMHgwMDAyCisjZGVmaW5lIE5DUF9NT1VOVF9TVFJPTkcJMHgwMDA0CS8qIGVuYWJsZSBkZWxldGUvcmVuYW1lIG9mIHIvbyBmaWxlcyAqLworI2RlZmluZSBOQ1BfTU9VTlRfTk9fT1MyCTB4MDAwOAkvKiBkbyBub3QgdXNlIE9TLzIgKExPTkcpIG5hbWVzcGFjZSAqLworI2RlZmluZSBOQ1BfTU9VTlRfTk9fTkZTCTB4MDAxMAkvKiBkbyBub3QgdXNlIE5GUyBuYW1lc3BhY2UgKi8KKyNkZWZpbmUgTkNQX01PVU5UX0VYVFJBUwkweDAwMjAKKyNkZWZpbmUgTkNQX01PVU5UX1NZTUxJTktTCTB4MDA0MAkvKiBlbmFibGUgc3ltbGlua3MgKi8KKyNkZWZpbmUgTkNQX01PVU5UX05GU19FWFRSQVMJMHgwMDgwCS8qIEVuYWJsZSB1c2Ugb2YgTkZTIE5TIG1ldGEtaW5mbyAqLworCitzdHJ1Y3QgbmNwX21vdW50X2RhdGEgeworCWludCB2ZXJzaW9uOworCXVuc2lnbmVkIGludCBuY3BfZmQ7CS8qIFRoZSBzb2NrZXQgdG8gdGhlIG5jcCBwb3J0ICovCisJX19rZXJuZWxfdWlkX3QgbW91bnRlZF91aWQ7CS8qIFdobyBtYXkgdW1vdW50KCkgdGhpcyBmaWxlc3lzdGVtPyAqLworCV9fa2VybmVsX3BpZF90IHdkb2dfcGlkOwkJLyogV2hvIGNhcmVzIGZvciBvdXIgd2F0Y2hkb2cgcGFja2V0cz8gKi8KKworCXVuc2lnbmVkIGNoYXIgbW91bnRlZF92b2xbTkNQX1ZPTE5BTUVfTEVOICsgMV07CisJdW5zaWduZWQgaW50IHRpbWVfb3V0OwkvKiBIb3cgbG9uZyBzaG91bGQgSSB3YWl0IGFmdGVyCisJCQkJICAgc2VuZGluZyBhIE5DUCByZXF1ZXN0PyAqLworCXVuc2lnbmVkIGludCByZXRyeV9jb3VudDsJLyogQW5kIGhvdyBvZnRlbiBzaG91bGQgSSByZXRyeT8gKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisKKwlfX2tlcm5lbF91aWRfdCB1aWQ7CisJX19rZXJuZWxfZ2lkX3QgZ2lkOworCV9fa2VybmVsX21vZGVfdCBmaWxlX21vZGU7CisJX19rZXJuZWxfbW9kZV90IGRpcl9tb2RlOworfTsKKworI2RlZmluZSBOQ1BfTU9VTlRfVkVSU0lPTl9WNAkoNCkJLyogQmluYXJ5IG9yIHRleHQgKi8KKworc3RydWN0IG5jcF9tb3VudF9kYXRhX3Y0IHsKKwlpbnQgdmVyc2lvbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBOQ1BfTU9VTlRfKiBmbGFncyAqLworCS8qIE1JUFMgdXNlcyBsb25nIF9fa2VybmVsX3VpZF90LCBidXQuLi4gKi8KKwkvKiB3ZSBuZWV2ZXIgcGFzcyAtMSwgc28gaXQgaXMgc2FmZSAqLworCXVuc2lnbmVkIGxvbmcgbW91bnRlZF91aWQ7CS8qIFdobyBtYXkgdW1vdW50KCkgdGhpcyBmaWxlc3lzdGVtPyAqLworCS8qIE1JUFMgdXNlcyBsb25nIF9fa2VybmVsX3BpZF90ICovCisJbG9uZyB3ZG9nX3BpZDsJCS8qIFdobyBjYXJlcyBmb3Igb3VyIHdhdGNoZG9nIHBhY2tldHM/ICovCisKKwl1bnNpZ25lZCBpbnQgbmNwX2ZkOwkvKiBUaGUgc29ja2V0IHRvIHRoZSBuY3AgcG9ydCAqLworCXVuc2lnbmVkIGludCB0aW1lX291dDsJLyogSG93IGxvbmcgc2hvdWxkIEkgd2FpdCBhZnRlcgorCQkJCSAgIHNlbmRpbmcgYSBOQ1AgcmVxdWVzdD8gKi8KKwl1bnNpZ25lZCBpbnQgcmV0cnlfY291bnQ7CS8qIEFuZCBob3cgb2Z0ZW4gc2hvdWxkIEkgcmV0cnk/ICovCisKKwkvKiBNSVBTIHVzZXMgbG9uZyBfX2tlcm5lbF91aWRfdC4uLiAqLworCS8qIHdlIG5ldmVyIHBhc3MgLTEsIHNvIGl0IGlzIHNhZmUgKi8KKwl1bnNpZ25lZCBsb25nIHVpZDsKKwl1bnNpZ25lZCBsb25nIGdpZDsKKwkvKiBNSVBTIHVzZXMgdW5zaWduZWQgbG9uZyBfX2tlcm5lbF9tb2RlX3QgKi8KKwl1bnNpZ25lZCBsb25nIGZpbGVfbW9kZTsKKwl1bnNpZ25lZCBsb25nIGRpcl9tb2RlOworfTsKKworI2RlZmluZSBOQ1BfTU9VTlRfVkVSU0lPTl9WNQkoNSkJLyogVGV4dCBvbmx5ICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uY3Bfbm8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmNwX25vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkYWE0OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmNwX25vLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfTkNQX05PCisjZGVmaW5lIF9OQ1BfTk8KKworLyogdGhlc2UgZGVmaW5lIHRoZSBhdHRyaWJ1dGUgYnl0ZSBhcyBzZWVuIGJ5IE5DUCAqLworI2RlZmluZSBhUk9OTFkJCQkoX19jcHVfdG9fbGUzMigxKSkKKyNkZWZpbmUgYUhJRERFTgkJCShfX2NwdV90b19sZTMyKDIpKQorI2RlZmluZSBhU1lTVEVNCQkJKF9fY3B1X3RvX2xlMzIoNCkpCisjZGVmaW5lIGFFWEVDVVRFCQkoX19jcHVfdG9fbGUzMig4KSkKKyNkZWZpbmUgYURJUgkJCShfX2NwdV90b19sZTMyKDB4MTApKQorI2RlZmluZSBhQVJDSAkJCShfX2NwdV90b19sZTMyKDB4MjApKQorI2RlZmluZSBhU0hBUkVECQkJKF9fY3B1X3RvX2xlMzIoMHg4MCkpCisjZGVmaW5lIGFET05UU1VCQUxMT0NBVEUJKF9fY3B1X3RvX2xlMzIoMUw8PDExKSkKKyNkZWZpbmUgYVRSQU5TQUNUSU9OQUwJCShfX2NwdV90b19sZTMyKDFMPDwxMikpCisjZGVmaW5lIGFQVVJHRQkJCShfX2NwdV90b19sZTMyKDFMPDwxNikpCisjZGVmaW5lIGFSRU5BTUVJTkhJQklUCQkoX19jcHVfdG9fbGUzMigxTDw8MTcpKQorI2RlZmluZSBhREVMRVRFSU5ISUJJVAkJKF9fY3B1X3RvX2xlMzIoMUw8PDE4KSkKKyNkZWZpbmUgYURPTlRDT01QUkVTUwkJKF9fY3B1X3RvX2xlMzIoMUw8PDI3KSkKKworI2VuZGlmIC8qIF9OQ1BfTk8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmVpZ2hib3VyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25laWdoYm91ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MDAzYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25laWdoYm91ci5oCkBAIC0wLDAgKzEsMTU1IEBACisjaWZuZGVmIF9fTElOVVhfTkVJR0hCT1VSX0gKKyNkZWZpbmUgX19MSU5VWF9ORUlHSEJPVVJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKK3N0cnVjdCBuZG1zZyB7CisJX191OAkJbmRtX2ZhbWlseTsKKwlfX3U4CQluZG1fcGFkMTsKKwlfX3UxNgkJbmRtX3BhZDI7CisJX19zMzIJCW5kbV9pZmluZGV4OworCV9fdTE2CQluZG1fc3RhdGU7CisJX191OAkJbmRtX2ZsYWdzOworCV9fdTgJCW5kbV90eXBlOworfTsKKworZW51bSB7CisJTkRBX1VOU1BFQywKKwlOREFfRFNULAorCU5EQV9MTEFERFIsCisJTkRBX0NBQ0hFSU5GTywKKwlOREFfUFJPQkVTLAorCV9fTkRBX01BWAorfTsKKworI2RlZmluZSBOREFfTUFYIChfX05EQV9NQVggLSAxKQorCisvKgorICoJTmVpZ2hib3IgQ2FjaGUgRW50cnkgRmxhZ3MKKyAqLworCisjZGVmaW5lIE5URl9VU0UJCTB4MDEKKyNkZWZpbmUgTlRGX1BST1hZCTB4MDgJLyogPT0gQVRGX1BVQkwgKi8KKyNkZWZpbmUgTlRGX1JPVVRFUgkweDgwCisKKy8qCisgKglOZWlnaGJvciBDYWNoZSBFbnRyeSBTdGF0ZXMuCisgKi8KKworI2RlZmluZSBOVURfSU5DT01QTEVURQkweDAxCisjZGVmaW5lIE5VRF9SRUFDSEFCTEUJMHgwMgorI2RlZmluZSBOVURfU1RBTEUJMHgwNAorI2RlZmluZSBOVURfREVMQVkJMHgwOAorI2RlZmluZSBOVURfUFJPQkUJMHgxMAorI2RlZmluZSBOVURfRkFJTEVECTB4MjAKKworLyogRHVtbXkgc3RhdGVzICovCisjZGVmaW5lIE5VRF9OT0FSUAkweDQwCisjZGVmaW5lIE5VRF9QRVJNQU5FTlQJMHg4MAorI2RlZmluZSBOVURfTk9ORQkweDAwCisKKy8qIE5VRF9OT0FSUCAmIE5VRF9QRVJNQU5FTlQgYXJlIHBzZXVkb3N0YXRlcywgdGhleSBuZXZlciBjaGFuZ2UKKyAgIGFuZCBtYWtlIG5vIGFkZHJlc3MgcmVzb2x1dGlvbiBvciBOVUQuCisgICBOVURfUEVSTUFORU5UIGlzIGFsc28gY2Fubm90IGJlIGRlbGV0ZWQgYnkgZ2FyYmFnZSBjb2xsZWN0b3JzLgorICovCisKK3N0cnVjdCBuZGFfY2FjaGVpbmZvIHsKKwlfX3UzMgkJbmRtX2NvbmZpcm1lZDsKKwlfX3UzMgkJbmRtX3VzZWQ7CisJX191MzIJCW5kbV91cGRhdGVkOworCV9fdTMyCQluZG1fcmVmY250OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJTmVpZ2hib3VyIHRhYmxlcyBzcGVjaWZpYyBtZXNzYWdlcy4KKyAqCisgKiBUbyByZXRyaWV2ZSB0aGUgbmVpZ2hib3VyIHRhYmxlcyBzZW5kIFJUTV9HRVRORUlHSFRCTCB3aXRoIHRoZQorICogTkxNX0ZfRFVNUCBmbGFnIHNldC4gRXZlcnkgbmVpZ2hib3VyIHRhYmxlIGNvbmZpZ3VyYXRpb24gaXMKKyAqIHNwcmVhZCBvdmVyIG11bHRpcGxlIG1lc3NhZ2VzIHRvIGF2b2lkIHJ1bm5pbmcgaW50byBtZXNzYWdlCisgKiBzaXplIGxpbWl0cyBvbiBzeXN0ZW1zIHdpdGggbWFueSBpbnRlcmZhY2VzLiBUaGUgZmlyc3QgbWVzc2FnZQorICogaW4gdGhlIHNlcXVlbmNlIHRyYW5zcG9ydHMgYWxsIG5vdCBkZXZpY2Ugc3BlY2lmaWMgZGF0YSBzdWNoIGFzCisgKiBzdGF0aXN0aWNzLCBjb25maWd1cmF0aW9uLCBhbmQgdGhlIGRlZmF1bHQgcGFyYW1ldGVyIHNldC4KKyAqIFRoaXMgbWVzc2FnZSBpcyBmb2xsb3dlZCBieSAwLi5uIG1lc3NhZ2VzIGNhcnJ5aW5nIGRldmljZQorICogc3BlY2lmaWMgcGFyYW1ldGVyIHNldHMuCisgKiBBbHRob3VnaCB0aGUgb3JkZXJpbmcgc2hvdWxkIGJlIHN1ZmZpY2llbnQsIE5EVEFfTkFNRSBjYW4gYmUKKyAqIHVzZWQgdG8gaWRlbnRpZnkgc2VxdWVuY2VzLiBUaGUgaW5pdGlhbCBtZXNzYWdlIGNhbiBiZSBpZGVudGlmaWVkCisgKiBieSBjaGVja2luZyBmb3IgTkRUQV9DT05GSUcuIFRoZSBkZXZpY2Ugc3BlY2lmaWMgbWVzc2FnZXMgZG8KKyAqIG5vdCBjb250YWluIHRoaXMgVExWIGJ1dCBoYXZlIE5EVFBBX0lGSU5ERVggc2V0IHRvIHRoZQorICogY29ycmVzcG9uZGluZyBpbnRlcmZhY2UgaW5kZXguCisgKgorICogVG8gY2hhbmdlIG5laWdoYm91ciB0YWJsZSBhdHRyaWJ1dGVzLCBzZW5kIFJUTV9TRVRORUlHSFRCTAorICogd2l0aCBORFRBX05BTUUgc2V0LiBDaGFuZ2VhYmxlIGF0dHJpYnV0ZSBpbmNsdWRlIE5EVEFfVEhSRVNIWzEtM10sCisgKiBORFRBX0dDX0lOVEVSVkFMLCBhbmQgYWxsIFRMVnMgaW4gTkRUQV9QQVJNUyB1bmxlc3MgbWFya2VkCisgKiBvdGhlcndpc2UuIERldmljZSBzcGVjaWZpYyBwYXJhbWV0ZXIgc2V0cyBjYW4gYmUgY2hhbmdlZCBieQorICogc2V0dGluZyBORFRQQV9JRklOREVYIHRvIHRoZSBpbnRlcmZhY2UgaW5kZXggb2YgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGRldmljZS4KKyAqKioqLworCitzdHJ1Y3QgbmR0X3N0YXRzIHsKKwlfX3U2NAkJbmR0c19hbGxvY3M7CisJX191NjQJCW5kdHNfZGVzdHJveXM7CisJX191NjQJCW5kdHNfaGFzaF9ncm93czsKKwlfX3U2NAkJbmR0c19yZXNfZmFpbGVkOworCV9fdTY0CQluZHRzX2xvb2t1cHM7CisJX191NjQJCW5kdHNfaGl0czsKKwlfX3U2NAkJbmR0c19yY3ZfcHJvYmVzX21jYXN0OworCV9fdTY0CQluZHRzX3Jjdl9wcm9iZXNfdWNhc3Q7CisJX191NjQJCW5kdHNfcGVyaW9kaWNfZ2NfcnVuczsKKwlfX3U2NAkJbmR0c19mb3JjZWRfZ2NfcnVuczsKK307CisKK2VudW0geworCU5EVFBBX1VOU1BFQywKKwlORFRQQV9JRklOREVYLAkJCS8qIHUzMiwgdW5jaGFuZ2VhYmxlICovCisJTkRUUEFfUkVGQ05ULAkJCS8qIHUzMiwgcmVhZC1vbmx5ICovCisJTkRUUEFfUkVBQ0hBQkxFX1RJTUUsCQkvKiB1NjQsIHJlYWQtb25seSwgbXNlY3MgKi8KKwlORFRQQV9CQVNFX1JFQUNIQUJMRV9USU1FLAkvKiB1NjQsIG1zZWNzICovCisJTkRUUEFfUkVUUkFOU19USU1FLAkJLyogdTY0LCBtc2VjcyAqLworCU5EVFBBX0dDX1NUQUxFVElNRSwJCS8qIHU2NCwgbXNlY3MgKi8KKwlORFRQQV9ERUxBWV9QUk9CRV9USU1FLAkJLyogdTY0LCBtc2VjcyAqLworCU5EVFBBX1FVRVVFX0xFTiwJCS8qIHUzMiAqLworCU5EVFBBX0FQUF9QUk9CRVMsCQkvKiB1MzIgKi8KKwlORFRQQV9VQ0FTVF9QUk9CRVMsCQkvKiB1MzIgKi8KKwlORFRQQV9NQ0FTVF9QUk9CRVMsCQkvKiB1MzIgKi8KKwlORFRQQV9BTllDQVNUX0RFTEFZLAkJLyogdTY0LCBtc2VjcyAqLworCU5EVFBBX1BST1hZX0RFTEFZLAkJLyogdTY0LCBtc2VjcyAqLworCU5EVFBBX1BST1hZX1FMRU4sCQkvKiB1MzIgKi8KKwlORFRQQV9MT0NLVElNRSwJCQkvKiB1NjQsIG1zZWNzICovCisJX19ORFRQQV9NQVgKK307CisjZGVmaW5lIE5EVFBBX01BWCAoX19ORFRQQV9NQVggLSAxKQorCitzdHJ1Y3QgbmR0bXNnIHsKKwlfX3U4CQluZHRtX2ZhbWlseTsKKwlfX3U4CQluZHRtX3BhZDE7CisJX191MTYJCW5kdG1fcGFkMjsKK307CisKK3N0cnVjdCBuZHRfY29uZmlnIHsKKwlfX3UxNgkJbmR0Y19rZXlfbGVuOworCV9fdTE2CQluZHRjX2VudHJ5X3NpemU7CisJX191MzIJCW5kdGNfZW50cmllczsKKwlfX3UzMgkJbmR0Y19sYXN0X2ZsdXNoOwkvKiBkZWx0YSB0byBub3cgaW4gbXNlY3MgKi8KKwlfX3UzMgkJbmR0Y19sYXN0X3JhbmQ7CQkvKiBkZWx0YSB0byBub3cgaW4gbXNlY3MgKi8KKwlfX3UzMgkJbmR0Y19oYXNoX3JuZDsKKwlfX3UzMgkJbmR0Y19oYXNoX21hc2s7CisJX191MzIJCW5kdGNfaGFzaF9jaGFpbl9nYzsKKwlfX3UzMgkJbmR0Y19wcm94eV9xbGVuOworfTsKKworZW51bSB7CisJTkRUQV9VTlNQRUMsCisJTkRUQV9OQU1FLAkJCS8qIGNoYXIgKiwgdW5jaGFuZ2VhYmxlICovCisJTkRUQV9USFJFU0gxLAkJCS8qIHUzMiAqLworCU5EVEFfVEhSRVNIMiwJCQkvKiB1MzIgKi8KKwlORFRBX1RIUkVTSDMsCQkJLyogdTMyICovCisJTkRUQV9DT05GSUcsCQkJLyogc3RydWN0IG5kdF9jb25maWcsIHJlYWQtb25seSAqLworCU5EVEFfUEFSTVMsCQkJLyogbmVzdGVkIFRMViBORFRQQV8qICovCisJTkRUQV9TVEFUUywJCQkvKiBzdHJ1Y3QgbmR0X3N0YXRzLCByZWFkLW9ubHkgKi8KKwlORFRBX0dDX0lOVEVSVkFMLAkJLyogdTY0LCBtc2VjcyAqLworCV9fTkRUQV9NQVgKK307CisjZGVmaW5lIE5EVEFfTUFYIChfX05EVEFfTUFYIC0gMSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTc3NTYxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXQuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU09DS0VUIG5ldHdvcmsgYWNjZXNzIHByb3RvY29sLgorICoJCVRoaXMgaXMgdGhlIG1hc3RlciBoZWFkZXIgZmlsZSBmb3IgdGhlIExpbnV4IE5FVCBsYXllciwKKyAqCQlvciwgaW4gcGxhaW4gRW5nbGlzaDogdGhlIG5ldHdvcmtpbmcgaGFuZGxpbmcgcGFydCBvZiB0aGUKKyAqCQlrZXJuZWwuCisgKgorICogVmVyc2lvbjoJQCgjKW5ldC5oCTEuMC4zCTA1LzI1LzkzCisgKgorICogQXV0aG9yczoJT3Jlc3QgWmJvcm93c2tpLCA8b2J6QEtvZGFrLkNPTT4KKyAqCQlSb3NzIEJpcm8KKyAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfTkVUX0gKKyNkZWZpbmUgX0xJTlVYX05FVF9ICisKKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxhc20vc29ja2V0Lmg+CisKKyNkZWZpbmUgTlBST1RPCQlBRl9NQVgKKworI2RlZmluZSBTWVNfU09DS0VUCTEJCS8qIHN5c19zb2NrZXQoMikJCSovCisjZGVmaW5lIFNZU19CSU5ECTIJCS8qIHN5c19iaW5kKDIpCQkJKi8KKyNkZWZpbmUgU1lTX0NPTk5FQ1QJMwkJLyogc3lzX2Nvbm5lY3QoMikJCSovCisjZGVmaW5lIFNZU19MSVNURU4JNAkJLyogc3lzX2xpc3RlbigyKQkJKi8KKyNkZWZpbmUgU1lTX0FDQ0VQVAk1CQkvKiBzeXNfYWNjZXB0KDIpCQkqLworI2RlZmluZSBTWVNfR0VUU09DS05BTUUJNgkJLyogc3lzX2dldHNvY2tuYW1lKDIpCQkqLworI2RlZmluZSBTWVNfR0VUUEVFUk5BTUUJNwkJLyogc3lzX2dldHBlZXJuYW1lKDIpCQkqLworI2RlZmluZSBTWVNfU09DS0VUUEFJUgk4CQkvKiBzeXNfc29ja2V0cGFpcigyKQkJKi8KKyNkZWZpbmUgU1lTX1NFTkQJOQkJLyogc3lzX3NlbmQoMikJCQkqLworI2RlZmluZSBTWVNfUkVDVgkxMAkJLyogc3lzX3JlY3YoMikJCQkqLworI2RlZmluZSBTWVNfU0VORFRPCTExCQkvKiBzeXNfc2VuZHRvKDIpCQkqLworI2RlZmluZSBTWVNfUkVDVkZST00JMTIJCS8qIHN5c19yZWN2ZnJvbSgyKQkJKi8KKyNkZWZpbmUgU1lTX1NIVVRET1dOCTEzCQkvKiBzeXNfc2h1dGRvd24oMikJCSovCisjZGVmaW5lIFNZU19TRVRTT0NLT1BUCTE0CQkvKiBzeXNfc2V0c29ja29wdCgyKQkJKi8KKyNkZWZpbmUgU1lTX0dFVFNPQ0tPUFQJMTUJCS8qIHN5c19nZXRzb2Nrb3B0KDIpCQkqLworI2RlZmluZSBTWVNfU0VORE1TRwkxNgkJLyogc3lzX3NlbmRtc2coMikJCSovCisjZGVmaW5lIFNZU19SRUNWTVNHCTE3CQkvKiBzeXNfcmVjdm1zZygyKQkJKi8KKyNkZWZpbmUgU1lTX0FDQ0VQVDQJMTgJCS8qIHN5c19hY2NlcHQ0KDIpCQkqLworI2RlZmluZSBTWVNfUkVDVk1NU0cJMTkJCS8qIHN5c19yZWN2bW1zZygyKQkJKi8KKyNkZWZpbmUgU1lTX1NFTkRNTVNHCTIwCQkvKiBzeXNfc2VuZG1tc2coMikJCSovCisKK3R5cGVkZWYgZW51bSB7CisJU1NfRlJFRSA9IDAsCQkJLyogbm90IGFsbG9jYXRlZAkJKi8KKwlTU19VTkNPTk5FQ1RFRCwJCQkvKiB1bmNvbm5lY3RlZCB0byBhbnkgc29ja2V0CSovCisJU1NfQ09OTkVDVElORywJCQkvKiBpbiBwcm9jZXNzIG9mIGNvbm5lY3RpbmcJKi8KKwlTU19DT05ORUNURUQsCQkJLyogY29ubmVjdGVkIHRvIHNvY2tldAkJKi8KKwlTU19ESVNDT05ORUNUSU5HCQkvKiBpbiBwcm9jZXNzIG9mIGRpc2Nvbm5lY3RpbmcJKi8KK30gc29ja2V0X3N0YXRlOworCisjZGVmaW5lIF9fU09fQUNDRVBUQ09OCSgxIDw8IDE2KQkvKiBwZXJmb3JtZWQgYSBsaXN0ZW4JCSovCisKKyNlbmRpZgkvKiBfTElOVVhfTkVUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0X2Ryb3Btb24uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0X2Ryb3Btb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTczOTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRfZHJvcG1vbi5oCkBAIC0wLDAgKzEsNjQgQEAKKyNpZm5kZWYgX19ORVRfRFJPUE1PTl9ICisjZGVmaW5lIF9fTkVUX0RST1BNT05fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKK3N0cnVjdCBuZXRfZG1fZHJvcF9wb2ludCB7CisJX191OCBwY1s4XTsKKwlfX3UzMiBjb3VudDsKK307CisKKyNkZWZpbmUgaXNfZHJvcF9wb2ludF9odyh4KSBkbyB7XAorCWludCBfX19faSwgX19fX2o7XAorCWZvciAoX19fX2kgPSAwOyBfX19faSA8IDg7IGkgX19fX2krKylcCisJCV9fX19qIHw9IHhbX19fX2ldO1wKKwlfX19fajtcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE5FVF9ETV9DRkdfVkVSU0lPTiAgMAorI2RlZmluZSBORVRfRE1fQ0ZHX0FMRVJUX0NPVU5UICAxCisjZGVmaW5lIE5FVF9ETV9DRkdfQUxFUlRfREVMQVkgMgorI2RlZmluZSBORVRfRE1fQ0ZHX01BWCAzCisKK3N0cnVjdCBuZXRfZG1fY29uZmlnX2VudHJ5IHsKKwlfX3UzMiB0eXBlOworCV9fdTY0IGRhdGEgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworfTsKKworc3RydWN0IG5ldF9kbV9jb25maWdfbXNnIHsKKwlfX3UzMiBlbnRyaWVzOworCXN0cnVjdCBuZXRfZG1fY29uZmlnX2VudHJ5IG9wdGlvbnNbMF07Cit9OworCitzdHJ1Y3QgbmV0X2RtX2FsZXJ0X21zZyB7CisJX191MzIgZW50cmllczsKKwlzdHJ1Y3QgbmV0X2RtX2Ryb3BfcG9pbnQgcG9pbnRzWzBdOworfTsKKworc3RydWN0IG5ldF9kbV91c2VyX21zZyB7CisJdW5pb24geworCQlzdHJ1Y3QgbmV0X2RtX2NvbmZpZ19tc2cgdXNlcjsKKwkJc3RydWN0IG5ldF9kbV9hbGVydF9tc2cgYWxlcnQ7CisJfSB1OworfTsKKworCisvKiBUaGVzZSBhcmUgdGhlIG5ldGxpbmsgbWVzc2FnZSB0eXBlcyBmb3IgdGhpcyBwcm90b2NvbCAqLworCitlbnVtIHsKKwlORVRfRE1fQ01EX1VOU1BFQyA9IDAsCisJTkVUX0RNX0NNRF9BTEVSVCwKKwlORVRfRE1fQ01EX0NPTkZJRywKKwlORVRfRE1fQ01EX1NUQVJULAorCU5FVF9ETV9DTURfU1RPUCwKKwlfTkVUX0RNX0NNRF9NQVgsCit9OworCisjZGVmaW5lIE5FVF9ETV9DTURfTUFYIChfTkVUX0RNX0NNRF9NQVggLSAxKQorCisvKgorICogT3VyIGdyb3VwIGlkZW50aWZpZXJzCisgKi8KKyNkZWZpbmUgTkVUX0RNX0dSUF9BTEVSVCAxCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0X3RzdGFtcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRfdHN0YW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1ZGYxMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0X3RzdGFtcC5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogVXNlcnNwYWNlIEFQSSBmb3IgaGFyZHdhcmUgdGltZSBzdGFtcGluZyBvZiBuZXR3b3JrIHBhY2tldHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBQYXRyaWNrIE9obHkgPHBhdHJpY2sub2hseUBpbnRlbC5jb20+CisgKgorICovCisKKyNpZm5kZWYgX05FVF9USU1FU1RBTVBJTkdfSAorI2RlZmluZSBfTkVUX1RJTUVTVEFNUElOR19ICisKKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4gICAvKiBmb3IgU09fVElNRVNUQU1QSU5HICovCisKKy8qIFNPX1RJTUVTVEFNUElORyBnZXRzIGFuIGludGVnZXIgYml0IGZpZWxkIGNvbXByaXNlZCBvZiB0aGVzZSB2YWx1ZXMgKi8KK2VudW0geworCVNPRl9USU1FU1RBTVBJTkdfVFhfSEFSRFdBUkUgPSAoMTw8MCksCisJU09GX1RJTUVTVEFNUElOR19UWF9TT0ZUV0FSRSA9ICgxPDwxKSwKKwlTT0ZfVElNRVNUQU1QSU5HX1JYX0hBUkRXQVJFID0gKDE8PDIpLAorCVNPRl9USU1FU1RBTVBJTkdfUlhfU09GVFdBUkUgPSAoMTw8MyksCisJU09GX1RJTUVTVEFNUElOR19TT0ZUV0FSRSA9ICgxPDw0KSwKKwlTT0ZfVElNRVNUQU1QSU5HX1NZU19IQVJEV0FSRSA9ICgxPDw1KSwKKwlTT0ZfVElNRVNUQU1QSU5HX1JBV19IQVJEV0FSRSA9ICgxPDw2KSwKKwlTT0ZfVElNRVNUQU1QSU5HX01BU0sgPQorCShTT0ZfVElNRVNUQU1QSU5HX1JBV19IQVJEV0FSRSAtIDEpIHwKKwlTT0ZfVElNRVNUQU1QSU5HX1JBV19IQVJEV0FSRQorfTsKKworLyoqCisgKiBzdHJ1Y3QgaHd0c3RhbXBfY29uZmlnIC0gJVNJT0NTSFdUU1RBTVAgcGFyYW1ldGVyCisgKgorICogQGZsYWdzOglubyBmbGFncyBkZWZpbmVkIHJpZ2h0IG5vdywgbXVzdCBiZSB6ZXJvCisgKiBAdHhfdHlwZToJb25lIG9mIEhXVFNUQU1QX1RYXyoKKyAqIEByeF90eXBlOglvbmUgb2Ygb25lIG9mIEhXVFNUQU1QX0ZJTFRFUl8qCisgKgorICogJVNJT0NTSFdUU1RBTVAgZXhwZWN0cyBhICZzdHJ1Y3QgaWZyZXEgd2l0aCBhIGlmcl9kYXRhIHBvaW50ZXIgdG8KKyAqIHRoaXMgc3RydWN0dXJlLiBkZXZfaWZzaW9jKCkgaW4gdGhlIGtlcm5lbCB0YWtlcyBjYXJlIG9mIHRoZQorICogdHJhbnNsYXRpb24gYmV0d2VlbiAzMiBiaXQgdXNlcnNwYWNlIGFuZCA2NCBiaXQga2VybmVsLiBUaGUKKyAqIHN0cnVjdHVyZSBpcyBpbnRlbnRpb25hbGx5IGNob3NlbiBzbyB0aGF0IGl0IGhhcyB0aGUgc2FtZSBsYXlvdXQgb24KKyAqIDMyIGFuZCA2NCBiaXQgc3lzdGVtcywgZG9uJ3QgYnJlYWsgdGhpcyEKKyAqLworc3RydWN0IGh3dHN0YW1wX2NvbmZpZyB7CisJaW50IGZsYWdzOworCWludCB0eF90eXBlOworCWludCByeF9maWx0ZXI7Cit9OworCisvKiBwb3NzaWJsZSB2YWx1ZXMgZm9yIGh3dHN0YW1wX2NvbmZpZy0+dHhfdHlwZSAqLworZW51bSBod3RzdGFtcF90eF90eXBlcyB7CisJLyoKKwkgKiBObyBvdXRnb2luZyBwYWNrZXQgd2lsbCBuZWVkIGhhcmR3YXJlIHRpbWUgc3RhbXBpbmc7CisJICogc2hvdWxkIGEgcGFja2V0IGFycml2ZSB3aGljaCBhc2tzIGZvciBpdCwgbm8gaGFyZHdhcmUKKwkgKiB0aW1lIHN0YW1waW5nIHdpbGwgYmUgZG9uZS4KKwkgKi8KKwlIV1RTVEFNUF9UWF9PRkYsCisKKwkvKgorCSAqIEVuYWJsZXMgaGFyZHdhcmUgdGltZSBzdGFtcGluZyBmb3Igb3V0Z29pbmcgcGFja2V0czsKKwkgKiB0aGUgc2VuZGVyIG9mIHRoZSBwYWNrZXQgZGVjaWRlcyB3aGljaCBhcmUgdG8gYmUKKwkgKiB0aW1lIHN0YW1wZWQgYnkgc2V0dGluZyAlU09GX1RJTUVTVEFNUElOR19UWF9TT0ZUV0FSRQorCSAqIGJlZm9yZSBzZW5kaW5nIHRoZSBwYWNrZXQuCisJICovCisJSFdUU1RBTVBfVFhfT04sCisKKwkvKgorCSAqIEVuYWJsZXMgdGltZSBzdGFtcGluZyBmb3Igb3V0Z29pbmcgcGFja2V0cyBqdXN0IGFzCisJICogSFdUU1RBTVBfVFhfT04gZG9lcywgYnV0IGFsc28gZW5hYmxlcyB0aW1lIHN0YW1wIGluc2VydGlvbgorCSAqIGRpcmVjdGx5IGludG8gU3luYyBwYWNrZXRzLiBJbiB0aGlzIGNhc2UsIHRyYW5zbWl0dGVkIFN5bmMKKwkgKiBwYWNrZXRzIHdpbGwgbm90IHJlY2VpdmVkIGEgdGltZSBzdGFtcCB2aWEgdGhlIHNvY2tldCBlcnJvcgorCSAqIHF1ZXVlLgorCSAqLworCUhXVFNUQU1QX1RYX09ORVNURVBfU1lOQywKK307CisKKy8qIHBvc3NpYmxlIHZhbHVlcyBmb3IgaHd0c3RhbXBfY29uZmlnLT5yeF9maWx0ZXIgKi8KK2VudW0gaHd0c3RhbXBfcnhfZmlsdGVycyB7CisJLyogdGltZSBzdGFtcCBubyBpbmNvbWluZyBwYWNrZXQgYXQgYWxsICovCisJSFdUU1RBTVBfRklMVEVSX05PTkUsCisKKwkvKiB0aW1lIHN0YW1wIGFueSBpbmNvbWluZyBwYWNrZXQgKi8KKwlIV1RTVEFNUF9GSUxURVJfQUxMLAorCisJLyogcmV0dXJuIHZhbHVlOiB0aW1lIHN0YW1wIGFsbCBwYWNrZXRzIHJlcXVlc3RlZCBwbHVzIHNvbWUgb3RoZXJzICovCisJSFdUU1RBTVBfRklMVEVSX1NPTUUsCisKKwkvKiBQVFAgdjEsIFVEUCwgYW55IGtpbmQgb2YgZXZlbnQgcGFja2V0ICovCisJSFdUU1RBTVBfRklMVEVSX1BUUF9WMV9MNF9FVkVOVCwKKwkvKiBQVFAgdjEsIFVEUCwgU3luYyBwYWNrZXQgKi8KKwlIV1RTVEFNUF9GSUxURVJfUFRQX1YxX0w0X1NZTkMsCisJLyogUFRQIHYxLCBVRFAsIERlbGF5X3JlcSBwYWNrZXQgKi8KKwlIV1RTVEFNUF9GSUxURVJfUFRQX1YxX0w0X0RFTEFZX1JFUSwKKwkvKiBQVFAgdjIsIFVEUCwgYW55IGtpbmQgb2YgZXZlbnQgcGFja2V0ICovCisJSFdUU1RBTVBfRklMVEVSX1BUUF9WMl9MNF9FVkVOVCwKKwkvKiBQVFAgdjIsIFVEUCwgU3luYyBwYWNrZXQgKi8KKwlIV1RTVEFNUF9GSUxURVJfUFRQX1YyX0w0X1NZTkMsCisJLyogUFRQIHYyLCBVRFAsIERlbGF5X3JlcSBwYWNrZXQgKi8KKwlIV1RTVEFNUF9GSUxURVJfUFRQX1YyX0w0X0RFTEFZX1JFUSwKKworCS8qIDgwMi5BUzEsIEV0aGVybmV0LCBhbnkga2luZCBvZiBldmVudCBwYWNrZXQgKi8KKwlIV1RTVEFNUF9GSUxURVJfUFRQX1YyX0wyX0VWRU5ULAorCS8qIDgwMi5BUzEsIEV0aGVybmV0LCBTeW5jIHBhY2tldCAqLworCUhXVFNUQU1QX0ZJTFRFUl9QVFBfVjJfTDJfU1lOQywKKwkvKiA4MDIuQVMxLCBFdGhlcm5ldCwgRGVsYXlfcmVxIHBhY2tldCAqLworCUhXVFNUQU1QX0ZJTFRFUl9QVFBfVjJfTDJfREVMQVlfUkVRLAorCisJLyogUFRQIHYyLzgwMi5BUzEsIGFueSBsYXllciwgYW55IGtpbmQgb2YgZXZlbnQgcGFja2V0ICovCisJSFdUU1RBTVBfRklMVEVSX1BUUF9WMl9FVkVOVCwKKwkvKiBQVFAgdjIvODAyLkFTMSwgYW55IGxheWVyLCBTeW5jIHBhY2tldCAqLworCUhXVFNUQU1QX0ZJTFRFUl9QVFBfVjJfU1lOQywKKwkvKiBQVFAgdjIvODAyLkFTMSwgYW55IGxheWVyLCBEZWxheV9yZXEgcGFja2V0ICovCisJSFdUU1RBTVBfRklMVEVSX1BUUF9WMl9ERUxBWV9SRVEsCit9OworCisjZW5kaWYgLyogX05FVF9USU1FU1RBTVBJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMxMGUwMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlEZWZpbml0aW9ucyBmb3IgdGhlIEludGVyZmFjZXMgaGFuZGxlci4KKyAqCisgKiBWZXJzaW9uOglAKCMpZGV2LmgJMS4wLjEwCTA4LzEyLzkzCisgKgorICogQXV0aG9yczoJUm9zcyBCaXJvCisgKgkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgkJQ29yZXkgTWlueWFyZCA8d2YtcmNoIW1pbnlhcmRAcmVsYXkuRVUubmV0PgorICoJCURvbmFsZCBKLiBCZWNrZXIsIDxiZWNrZXJAY2VzZGlzLmdzZmMubmFzYS5nb3Y+CisgKgkJQWxhbiBDb3gsIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CisgKgkJQmpvcm4gRWt3YWxsLiA8Ymowcm5AYmxveC5zZT4KKyAqICAgICAgICAgICAgICBQZWtrYSBSaWlrb25lbiA8cHJpaWtvbmVAcG9zZWlkb24ucHNwdC5maT4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgkJTW92ZWQgdG8gL3Vzci9pbmNsdWRlL2xpbnV4IGZvciBORVQzCisgKi8KKyNpZm5kZWYgX0xJTlVYX05FVERFVklDRV9ICisjZGVmaW5lIF9MSU5VWF9ORVRERVZJQ0VfSAorCisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3BhY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2xpbmsuaD4KKworCisjZGVmaW5lIE1BWF9BRERSX0xFTgkzMgkJLyogTGFyZ2VzdCBoYXJkd2FyZSBhZGRyZXNzIGxlbmd0aCAqLworCisvKiBJbml0aWFsIG5ldCBkZXZpY2UgZ3JvdXAuIEFsbCBkZXZpY2VzIGJlbG9uZyB0byBncm91cCAwIGJ5IGRlZmF1bHQuICovCisjZGVmaW5lIElOSVRfTkVUREVWX0dST1VQCTAKKworCisKKy8qIE1lZGlhIHNlbGVjdGlvbiBvcHRpb25zLiAqLworZW51bSB7CisgICAgICAgIElGX1BPUlRfVU5LTk9XTiA9IDAsCisgICAgICAgIElGX1BPUlRfMTBCQVNFMiwKKyAgICAgICAgSUZfUE9SVF8xMEJBU0VULAorICAgICAgICBJRl9QT1JUX0FVSSwKKyAgICAgICAgSUZfUE9SVF8xMDBCQVNFVCwKKyAgICAgICAgSUZfUE9SVF8xMDBCQVNFVFgsCisgICAgICAgIElGX1BPUlRfMTAwQkFTRUZYCit9OworCisKKyNlbmRpZgkvKiBfTElOVVhfTkVUREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NzcxMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci5oCkBAIC0wLDAgKzEsNjkgQEAKKyNpZm5kZWYgX19MSU5VWF9ORVRGSUxURVJfSAorI2RlZmluZSBfX0xJTlVYX05FVEZJTFRFUl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisKKy8qIFJlc3BvbnNlcyBmcm9tIGhvb2sgZnVuY3Rpb25zLiAqLworI2RlZmluZSBORl9EUk9QIDAKKyNkZWZpbmUgTkZfQUNDRVBUIDEKKyNkZWZpbmUgTkZfU1RPTEVOIDIKKyNkZWZpbmUgTkZfUVVFVUUgMworI2RlZmluZSBORl9SRVBFQVQgNAorI2RlZmluZSBORl9TVE9QIDUKKyNkZWZpbmUgTkZfTUFYX1ZFUkRJQ1QgTkZfU1RPUAorCisvKiB3ZSBvdmVybG9hZCB0aGUgaGlnaGVyIGJpdHMgZm9yIGVuY29kaW5nIGF1eGlsaWFyeSBkYXRhIHN1Y2ggYXMgdGhlIHF1ZXVlCisgKiBudW1iZXIgb3IgZXJybm8gdmFsdWVzLiBOb3QgbmljZSwgYnV0IGJldHRlciB0aGFuIGFkZGl0aW9uYWwgZnVuY3Rpb24KKyAqIGFyZ3VtZW50cy4gKi8KKyNkZWZpbmUgTkZfVkVSRElDVF9NQVNLIDB4MDAwMDAwZmYKKworLyogZXh0cmEgdmVyZGljdCBmbGFncyBoYXZlIG1hc2sgMHgwMDAwZmYwMCAqLworI2RlZmluZSBORl9WRVJESUNUX0ZMQUdfUVVFVUVfQllQQVNTCTB4MDAwMDgwMDAKKworLyogcXVldWUgbnVtYmVyIChORl9RVUVVRSkgb3IgZXJybm8gKE5GX0RST1ApICovCisjZGVmaW5lIE5GX1ZFUkRJQ1RfUU1BU0sgMHhmZmZmMDAwMAorI2RlZmluZSBORl9WRVJESUNUX1FCSVRTIDE2CisKKyNkZWZpbmUgTkZfUVVFVUVfTlIoeCkgKCgoKHgpIDw8IDE2KSAmIE5GX1ZFUkRJQ1RfUU1BU0spIHwgTkZfUVVFVUUpCisKKyNkZWZpbmUgTkZfRFJPUF9FUlIoeCkgKCgoLXgpIDw8IDE2KSB8IE5GX0RST1ApCisKKy8qIG9ubHkgZm9yIHVzZXJzcGFjZSBjb21wYXRpYmlsaXR5ICovCisvKiBHZW5lcmljIGNhY2hlIHJlc3BvbnNlcyBmcm9tIGhvb2sgZnVuY3Rpb25zLgorICAgPD0gMHgyMDAwIGlzIHVzZWQgZm9yIHByb3RvY29sLWZsYWdzLiAqLworI2RlZmluZSBORkNfVU5LTk9XTiAweDQwMDAKKyNkZWZpbmUgTkZDX0FMVEVSRUQgMHg4MDAwCisKKy8qIE5GX1ZFUkRJQ1RfQklUUyBzaG91bGQgYmUgOCBub3csIGJ1dCB1c2Vyc3BhY2UgbWlnaHQgYnJlYWsgaWYgdGhpcyBjaGFuZ2VzICovCisjZGVmaW5lIE5GX1ZFUkRJQ1RfQklUUyAxNgorCitlbnVtIG5mX2luZXRfaG9va3MgeworCU5GX0lORVRfUFJFX1JPVVRJTkcsCisJTkZfSU5FVF9MT0NBTF9JTiwKKwlORl9JTkVUX0ZPUldBUkQsCisJTkZfSU5FVF9MT0NBTF9PVVQsCisJTkZfSU5FVF9QT1NUX1JPVVRJTkcsCisJTkZfSU5FVF9OVU1IT09LUworfTsKKworZW51bSB7CisJTkZQUk9UT19VTlNQRUMgPSAgMCwKKwlORlBST1RPX0lQVjQgICA9ICAyLAorCU5GUFJPVE9fQVJQICAgID0gIDMsCisJTkZQUk9UT19CUklER0UgPSAgNywKKwlORlBST1RPX0lQVjYgICA9IDEwLAorCU5GUFJPVE9fREVDTkVUID0gMTIsCisJTkZQUk9UT19OVU1QUk9UTywKK307CisKK3VuaW9uIG5mX2luZXRfYWRkciB7CisJX191MzIJCWFsbFs0XTsKKwlfX2JlMzIJCWlwOworCV9fYmUzMgkJaXA2WzRdOworCXN0cnVjdCBpbl9hZGRyCWluOworCXN0cnVjdCBpbjZfYWRkcglpbjY7Cit9OworCisjZW5kaWYgLypfX0xJTlVYX05FVEZJTFRFUl9IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlYjJkNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldC5oCkBAIC0wLDAgKzEsMTcyIEBACisjaWZuZGVmIF9JUF9TRVRfSAorI2RlZmluZSBfSVBfU0VUX0gKKworLyogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgSm9ha2ltIEF4ZWxzc29uIDxnb3plbUBsaW51eC5udT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIFBhdHJpY2sgU2NoYWFmIDxib2ZAYm9mLmRlPgorICogICAgICAgICAgICAgICAgICAgICAgICAgTWFydGluIEpvc2Vmc3NvbiA8Z2FuZGFsZkB3bHVnLndlc3Riby5zZT4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDExIEpvenNlZiBLYWRsZWNzaWsgPGthZGxlY0BibGFja2hvbGUua2ZraS5odT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKy8qIFRoZSBwcm90b2NvbCB2ZXJzaW9uICovCisjZGVmaW5lIElQU0VUX1BST1RPQ09MCQk2CisKKy8qIFRoZSBtYXggbGVuZ3RoIG9mIHN0cmluZ3MgaW5jbHVkaW5nIE5VTDogc2V0IGFuZCB0eXBlIGlkZW50aWZpZXJzICovCisjZGVmaW5lIElQU0VUX01BWE5BTUVMRU4JMzIKKworLyogTWVzc2FnZSB0eXBlcyBhbmQgY29tbWFuZHMgKi8KK2VudW0gaXBzZXRfY21kIHsKKwlJUFNFVF9DTURfTk9ORSwKKwlJUFNFVF9DTURfUFJPVE9DT0wsCS8qIDE6IFJldHVybiBwcm90b2NvbCB2ZXJzaW9uICovCisJSVBTRVRfQ01EX0NSRUFURSwJLyogMjogQ3JlYXRlIGEgbmV3IChlbXB0eSkgc2V0ICovCisJSVBTRVRfQ01EX0RFU1RST1ksCS8qIDM6IERlc3Ryb3kgYSAoZW1wdHkpIHNldCAqLworCUlQU0VUX0NNRF9GTFVTSCwJLyogNDogUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIGEgc2V0ICovCisJSVBTRVRfQ01EX1JFTkFNRSwJLyogNTogUmVuYW1lIGEgc2V0ICovCisJSVBTRVRfQ01EX1NXQVAsCQkvKiA2OiBTd2FwIHR3byBzZXRzICovCisJSVBTRVRfQ01EX0xJU1QsCQkvKiA3OiBMaXN0IHNldHMgKi8KKwlJUFNFVF9DTURfU0FWRSwJCS8qIDg6IFNhdmUgc2V0cyAqLworCUlQU0VUX0NNRF9BREQsCQkvKiA5OiBBZGQgYW4gZWxlbWVudCB0byBhIHNldCAqLworCUlQU0VUX0NNRF9ERUwsCQkvKiAxMDogRGVsZXRlIGFuIGVsZW1lbnQgZnJvbSBhIHNldCAqLworCUlQU0VUX0NNRF9URVNULAkJLyogMTE6IFRlc3QgYW4gZWxlbWVudCBpbiBhIHNldCAqLworCUlQU0VUX0NNRF9IRUFERVIsCS8qIDEyOiBHZXQgc2V0IGhlYWRlciBkYXRhIG9ubHkgKi8KKwlJUFNFVF9DTURfVFlQRSwJCS8qIDEzOiBHZXQgc2V0IHR5cGUgKi8KKwlJUFNFVF9NU0dfTUFYLAkJLyogTmV0bGluayBtZXNzYWdlIGNvbW1hbmRzICovCisKKwkvKiBDb21tYW5kcyBpbiB1c2Vyc3BhY2U6ICovCisJSVBTRVRfQ01EX1JFU1RPUkUgPSBJUFNFVF9NU0dfTUFYLCAvKiAxNDogRW50ZXIgcmVzdG9yZSBtb2RlICovCisJSVBTRVRfQ01EX0hFTFAsCQkvKiAxNTogR2V0IGhlbHAgKi8KKwlJUFNFVF9DTURfVkVSU0lPTiwJLyogMTY6IEdldCBwcm9ncmFtIHZlcnNpb24gKi8KKwlJUFNFVF9DTURfUVVJVCwJCS8qIDE3OiBRdWl0IGZyb20gaW50ZXJhY3RpdmUgbW9kZSAqLworCisJSVBTRVRfQ01EX01BWCwKKworCUlQU0VUX0NNRF9DT01NSVQgPSBJUFNFVF9DTURfTUFYLCAvKiAxODogQ29tbWl0IGJ1ZmZlcmVkIGNvbW1hbmRzICovCit9OworCisvKiBBdHRyaWJ1dGVzIGF0IGNvbW1hbmQgbGV2ZWwgKi8KK2VudW0geworCUlQU0VUX0FUVFJfVU5TUEVDLAorCUlQU0VUX0FUVFJfUFJPVE9DT0wsCS8qIDE6IFByb3RvY29sIHZlcnNpb24gKi8KKwlJUFNFVF9BVFRSX1NFVE5BTUUsCS8qIDI6IE5hbWUgb2YgdGhlIHNldCAqLworCUlQU0VUX0FUVFJfVFlQRU5BTUUsCS8qIDM6IFR5cGVuYW1lICovCisJSVBTRVRfQVRUUl9TRVROQU1FMiA9IElQU0VUX0FUVFJfVFlQRU5BTUUsIC8qIFNldG5hbWUgYXQgcmVuYW1lL3N3YXAgKi8KKwlJUFNFVF9BVFRSX1JFVklTSU9OLAkvKiA0OiBTZXR0eXBlIHJldmlzaW9uICovCisJSVBTRVRfQVRUUl9GQU1JTFksCS8qIDU6IFNldHR5cGUgZmFtaWx5ICovCisJSVBTRVRfQVRUUl9GTEFHUywJLyogNjogRmxhZ3MgYXQgY29tbWFuZCBsZXZlbCAqLworCUlQU0VUX0FUVFJfREFUQSwJLyogNzogTmVzdGVkIGF0dHJpYnV0ZXMgKi8KKwlJUFNFVF9BVFRSX0FEVCwJCS8qIDg6IE11bHRpcGxlIGRhdGEgY29udGFpbmVycyAqLworCUlQU0VUX0FUVFJfTElORU5PLAkvKiA5OiBSZXN0b3JlIGxpbmVubyAqLworCUlQU0VUX0FUVFJfUFJPVE9DT0xfTUlOLCAvKiAxMDogTWluaW1hbCBzdXBwb3J0ZWQgdmVyc2lvbiBudW1iZXIgKi8KKwlJUFNFVF9BVFRSX1JFVklTSU9OX01JTgk9IElQU0VUX0FUVFJfUFJPVE9DT0xfTUlOLCAvKiB0eXBlIHJldiBtaW4gKi8KKwlfX0lQU0VUX0FUVFJfQ01EX01BWCwKK307CisjZGVmaW5lIElQU0VUX0FUVFJfQ01EX01BWAkoX19JUFNFVF9BVFRSX0NNRF9NQVggLSAxKQorCisvKiBDQURUIHNwZWNpZmljIGF0dHJpYnV0ZXMgKi8KK2VudW0geworCUlQU0VUX0FUVFJfSVAgPSBJUFNFVF9BVFRSX1VOU1BFQyArIDEsCisJSVBTRVRfQVRUUl9JUF9GUk9NID0gSVBTRVRfQVRUUl9JUCwKKwlJUFNFVF9BVFRSX0lQX1RPLAkvKiAyICovCisJSVBTRVRfQVRUUl9DSURSLAkvKiAzICovCisJSVBTRVRfQVRUUl9QT1JULAkvKiA0ICovCisJSVBTRVRfQVRUUl9QT1JUX0ZST00gPSBJUFNFVF9BVFRSX1BPUlQsCisJSVBTRVRfQVRUUl9QT1JUX1RPLAkvKiA1ICovCisJSVBTRVRfQVRUUl9USU1FT1VULAkvKiA2ICovCisJSVBTRVRfQVRUUl9QUk9UTywJLyogNyAqLworCUlQU0VUX0FUVFJfQ0FEVF9GTEFHUywJLyogOCAqLworCUlQU0VUX0FUVFJfQ0FEVF9MSU5FTk8gPSBJUFNFVF9BVFRSX0xJTkVOTywJLyogOSAqLworCS8qIFJlc2VydmUgZW1wdHkgc2xvdHMgKi8KKwlJUFNFVF9BVFRSX0NBRFRfTUFYID0gMTYsCisJLyogQ3JlYXRlLW9ubHkgc3BlY2lmaWMgYXR0cmlidXRlcyAqLworCUlQU0VUX0FUVFJfR0MsCisJSVBTRVRfQVRUUl9IQVNIU0laRSwKKwlJUFNFVF9BVFRSX01BWEVMRU0sCisJSVBTRVRfQVRUUl9ORVRNQVNLLAorCUlQU0VUX0FUVFJfUFJPQkVTLAorCUlQU0VUX0FUVFJfUkVTSVpFLAorCUlQU0VUX0FUVFJfU0laRSwKKwkvKiBLZXJuZWwtb25seSAqLworCUlQU0VUX0FUVFJfRUxFTUVOVFMsCisJSVBTRVRfQVRUUl9SRUZFUkVOQ0VTLAorCUlQU0VUX0FUVFJfTUVNU0laRSwKKworCV9fSVBTRVRfQVRUUl9DUkVBVEVfTUFYLAorfTsKKyNkZWZpbmUgSVBTRVRfQVRUUl9DUkVBVEVfTUFYCShfX0lQU0VUX0FUVFJfQ1JFQVRFX01BWCAtIDEpCisKKy8qIEFEVCBzcGVjaWZpYyBhdHRyaWJ1dGVzICovCitlbnVtIHsKKwlJUFNFVF9BVFRSX0VUSEVSID0gSVBTRVRfQVRUUl9DQURUX01BWCArIDEsCisJSVBTRVRfQVRUUl9OQU1FLAorCUlQU0VUX0FUVFJfTkFNRVJFRiwKKwlJUFNFVF9BVFRSX0lQMiwKKwlJUFNFVF9BVFRSX0NJRFIyLAorCUlQU0VUX0FUVFJfSVAyX1RPLAorCUlQU0VUX0FUVFJfSUZBQ0UsCisJX19JUFNFVF9BVFRSX0FEVF9NQVgsCit9OworI2RlZmluZSBJUFNFVF9BVFRSX0FEVF9NQVgJKF9fSVBTRVRfQVRUUl9BRFRfTUFYIC0gMSkKKworLyogSVAgc3BlY2lmaWMgYXR0cmlidXRlcyAqLworZW51bSB7CisJSVBTRVRfQVRUUl9JUEFERFJfSVBWNCA9IElQU0VUX0FUVFJfVU5TUEVDICsgMSwKKwlJUFNFVF9BVFRSX0lQQUREUl9JUFY2LAorCV9fSVBTRVRfQVRUUl9JUEFERFJfTUFYLAorfTsKKyNkZWZpbmUgSVBTRVRfQVRUUl9JUEFERFJfTUFYCShfX0lQU0VUX0FUVFJfSVBBRERSX01BWCAtIDEpCisKKy8qIEVycm9yIGNvZGVzICovCitlbnVtIGlwc2V0X2Vycm5vIHsKKwlJUFNFVF9FUlJfUFJJVkFURSA9IDQwOTYsCisJSVBTRVRfRVJSX1BST1RPQ09MLAorCUlQU0VUX0VSUl9GSU5EX1RZUEUsCisJSVBTRVRfRVJSX01BWF9TRVRTLAorCUlQU0VUX0VSUl9CVVNZLAorCUlQU0VUX0VSUl9FWElTVF9TRVROQU1FMiwKKwlJUFNFVF9FUlJfVFlQRV9NSVNNQVRDSCwKKwlJUFNFVF9FUlJfRVhJU1QsCisJSVBTRVRfRVJSX0lOVkFMSURfQ0lEUiwKKwlJUFNFVF9FUlJfSU5WQUxJRF9ORVRNQVNLLAorCUlQU0VUX0VSUl9JTlZBTElEX0ZBTUlMWSwKKwlJUFNFVF9FUlJfVElNRU9VVCwKKwlJUFNFVF9FUlJfUkVGRVJFTkNFRCwKKwlJUFNFVF9FUlJfSVBBRERSX0lQVjQsCisJSVBTRVRfRVJSX0lQQUREUl9JUFY2LAorCisJLyogVHlwZSBzcGVjaWZpYyBlcnJvciBjb2RlcyAqLworCUlQU0VUX0VSUl9UWVBFX1NQRUNJRklDID0gNDM1MiwKK307CisKKy8qIEZsYWdzIGF0IGNvbW1hbmQgbGV2ZWwgKi8KK2VudW0gaXBzZXRfY21kX2ZsYWdzIHsKKwlJUFNFVF9GTEFHX0JJVF9FWElTVAk9IDAsCisJSVBTRVRfRkxBR19FWElTVAk9ICgxIDw8IElQU0VUX0ZMQUdfQklUX0VYSVNUKSwKKwlJUFNFVF9GTEFHX0JJVF9MSVNUX1NFVE5BTUUgPSAxLAorCUlQU0VUX0ZMQUdfTElTVF9TRVROQU1FCT0gKDEgPDwgSVBTRVRfRkxBR19CSVRfTElTVF9TRVROQU1FKSwKKwlJUFNFVF9GTEFHX0JJVF9MSVNUX0hFQURFUiA9IDIsCisJSVBTRVRfRkxBR19MSVNUX0hFQURFUgk9ICgxIDw8IElQU0VUX0ZMQUdfQklUX0xJU1RfSEVBREVSKSwKK307CisKKy8qIEZsYWdzIGF0IENBRFQgYXR0cmlidXRlIGxldmVsICovCitlbnVtIGlwc2V0X2NhZHRfZmxhZ3MgeworCUlQU0VUX0ZMQUdfQklUX0JFRk9SRQk9IDAsCisJSVBTRVRfRkxBR19CRUZPUkUJPSAoMSA8PCBJUFNFVF9GTEFHX0JJVF9CRUZPUkUpLAorCUlQU0VUX0ZMQUdfQklUX1BIWVNERVYJPSAxLAorCUlQU0VUX0ZMQUdfUEhZU0RFVgk9ICgxIDw8IElQU0VUX0ZMQUdfQklUX1BIWVNERVYpLAorfTsKKworLyogQ29tbWFuZHMgd2l0aCBzZXR0eXBlLXNwZWNpZmljIGF0dHJpYnV0ZXMgKi8KK2VudW0gaXBzZXRfYWR0IHsKKwlJUFNFVF9BREQsCisJSVBTRVRfREVMLAorCUlQU0VUX1RFU1QsCisJSVBTRVRfQURUX01BWCwKKwlJUFNFVF9DUkVBVEUgPSBJUFNFVF9BRFRfTUFYLAorCUlQU0VUX0NBRFRfTUFYLAorfTsKKworCisjZW5kaWYgLypfSVBfU0VUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9iaXRtYXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9iaXRtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjFhMjhlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2JpdG1hcC5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgX19JUF9TRVRfQklUTUFQX0gKKyNkZWZpbmUgX19JUF9TRVRfQklUTUFQX0gKKworLyogQml0bWFwIHR5cGUgc3BlY2lmaWMgZXJyb3IgY29kZXMgKi8KK2VudW0geworCS8qIFRoZSBlbGVtZW50IGlzIG91dCBvZiB0aGUgcmFuZ2Ugb2YgdGhlIHNldCAqLworCUlQU0VUX0VSUl9CSVRNQVBfUkFOR0UgPSBJUFNFVF9FUlJfVFlQRV9TUEVDSUZJQywKKwkvKiBUaGUgcmFuZ2UgZXhjZWVkcyB0aGUgc2l6ZSBsaW1pdCBvZiB0aGUgc2V0IHR5cGUgKi8KKwlJUFNFVF9FUlJfQklUTUFQX1JBTkdFX1NJWkUsCit9OworCisKKyNlbmRpZiAvKiBfX0lQX1NFVF9CSVRNQVBfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2guaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhYzZjZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfX0lQX1NFVF9IQVNIX0gKKyNkZWZpbmUgX19JUF9TRVRfSEFTSF9ICisKKy8qIEhhc2ggdHlwZSBzcGVjaWZpYyBlcnJvciBjb2RlcyAqLworZW51bSB7CisJLyogSGFzaCBpcyBmdWxsICovCisJSVBTRVRfRVJSX0hBU0hfRlVMTCA9IElQU0VUX0VSUl9UWVBFX1NQRUNJRklDLAorCS8qIE51bGwtdmFsdWVkIGVsZW1lbnQgKi8KKwlJUFNFVF9FUlJfSEFTSF9FTEVNLAorCS8qIEludmFsaWQgcHJvdG9jb2wgKi8KKwlJUFNFVF9FUlJfSU5WQUxJRF9QUk9UTywKKwkvKiBQcm90b2NvbCBtaXNzaW5nIGJ1dCBtdXN0IGJlIHNwZWNpZmllZCAqLworCUlQU0VUX0VSUl9NSVNTSU5HX1BST1RPLAorCS8qIFJhbmdlIG5vdCBzdXBwb3J0ZWQgKi8KKwlJUFNFVF9FUlJfSEFTSF9SQU5HRV9VTlNVUFBPUlRFRCwKKwkvKiBJbnZhbGlkIHJhbmdlICovCisJSVBTRVRfRVJSX0hBU0hfUkFOR0UsCit9OworCisKKyNlbmRpZiAvKiBfX0lQX1NFVF9IQVNIX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9saXN0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXRfbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZTYxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXRfbGlzdC5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX19JUF9TRVRfTElTVF9ICisjZGVmaW5lIF9fSVBfU0VUX0xJU1RfSAorCisvKiBMaXN0IHR5cGUgc3BlY2lmaWMgZXJyb3IgY29kZXMgKi8KK2VudW0geworCS8qIFNldCBuYW1lIHRvIGJlIGFkZGVkL2RlbGV0ZWQvdGVzdGVkIGRvZXMgbm90IGV4aXN0LiAqLworCUlQU0VUX0VSUl9OQU1FID0gSVBTRVRfRVJSX1RZUEVfU1BFQ0lGSUMsCisJLyogbGlzdDpzZXQgdHlwZSBpcyBub3QgcGVybWl0dGVkIHRvIGFkZCAqLworCUlQU0VUX0VSUl9MT09QLAorCS8qIE1pc3NpbmcgcmVmZXJlbmNlIHNldCAqLworCUlQU0VUX0VSUl9CRUZPUkUsCisJLyogUmVmZXJlbmNlIHNldCBkb2VzIG5vdCBleGlzdCAqLworCUlQU0VUX0VSUl9OQU1FUkVGLAorCS8qIFNldCBpcyBmdWxsICovCisJSVBTRVRfRVJSX0xJU1RfRlVMTCwKKwkvKiBSZWZlcmVuY2Ugc2V0IGlzIG5vdCBhZGRlZCB0byB0aGUgc2V0ICovCisJSVBTRVRfRVJSX1JFRl9FWElTVCwKK307CisKKworI2VuZGlmIC8qIF9fSVBfU0VUX0xJU1RfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YWE1MmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmgKQEAgLTAsMCArMSwxMTMgQEAKKyNpZm5kZWYgX05GX0NPTk5UUkFDS19DT01NT05fSAorI2RlZmluZSBfTkZfQ09OTlRSQUNLX0NPTU1PTl9ICisvKiBDb25uZWN0aW9uIHN0YXRlIHRyYWNraW5nIGZvciBuZXRmaWx0ZXIuICBUaGlzIGlzIHNlcGFyYXRlZCBmcm9tLAorICAgYnV0IHJlcXVpcmVkIGJ5LCB0aGUgTkFUIGxheWVyOyBpdCBjYW4gYWxzbyBiZSB1c2VkIGJ5IGFuIGlwdGFibGVzCisgICBleHRlbnNpb24uICovCitlbnVtIGlwX2Nvbm50cmFja19pbmZvIHsKKwkvKiBQYXJ0IG9mIGFuIGVzdGFibGlzaGVkIGNvbm5lY3Rpb24gKGVpdGhlciBkaXJlY3Rpb24pLiAqLworCUlQX0NUX0VTVEFCTElTSEVELAorCisJLyogTGlrZSBORVcsIGJ1dCByZWxhdGVkIHRvIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24sIG9yIElDTVAgZXJyb3IKKwkgICAoaW4gZWl0aGVyIGRpcmVjdGlvbikuICovCisJSVBfQ1RfUkVMQVRFRCwKKworCS8qIFN0YXJ0ZWQgYSBuZXcgY29ubmVjdGlvbiB0byB0cmFjayAob25seQorICAgICAgICAgICBJUF9DVF9ESVJfT1JJR0lOQUwpOyBtYXkgYmUgYSByZXRyYW5zbWlzc2lvbi4gKi8KKwlJUF9DVF9ORVcsCisKKwkvKiA+PSB0aGlzIGluZGljYXRlcyByZXBseSBkaXJlY3Rpb24gKi8KKwlJUF9DVF9JU19SRVBMWSwKKworCUlQX0NUX0VTVEFCTElTSEVEX1JFUExZID0gSVBfQ1RfRVNUQUJMSVNIRUQgKyBJUF9DVF9JU19SRVBMWSwKKwlJUF9DVF9SRUxBVEVEX1JFUExZID0gSVBfQ1RfUkVMQVRFRCArIElQX0NUX0lTX1JFUExZLAorCUlQX0NUX05FV19SRVBMWSA9IElQX0NUX05FVyArIElQX0NUX0lTX1JFUExZLAkKKwkvKiBOdW1iZXIgb2YgZGlzdGluY3QgSVBfQ1QgdHlwZXMgKG5vIE5FVyBpbiByZXBseSBkaXJuKS4gKi8KKwlJUF9DVF9OVU1CRVIgPSBJUF9DVF9JU19SRVBMWSAqIDIgLSAxCit9OworCisvKiBCaXRzZXQgcmVwcmVzZW50aW5nIHN0YXR1cyBvZiBjb25uZWN0aW9uLiAqLworZW51bSBpcF9jb25udHJhY2tfc3RhdHVzIHsKKwkvKiBJdCdzIGFuIGV4cGVjdGVkIGNvbm5lY3Rpb246IGJpdCAwIHNldC4gIFRoaXMgYml0IG5ldmVyIGNoYW5nZWQgKi8KKwlJUFNfRVhQRUNURURfQklUID0gMCwKKwlJUFNfRVhQRUNURUQgPSAoMSA8PCBJUFNfRVhQRUNURURfQklUKSwKKworCS8qIFdlJ3ZlIHNlZW4gcGFja2V0cyBib3RoIHdheXM6IGJpdCAxIHNldC4gIENhbiBiZSBzZXQsIG5vdCB1bnNldC4gKi8KKwlJUFNfU0VFTl9SRVBMWV9CSVQgPSAxLAorCUlQU19TRUVOX1JFUExZID0gKDEgPDwgSVBTX1NFRU5fUkVQTFlfQklUKSwKKworCS8qIENvbm50cmFjayBzaG91bGQgbmV2ZXIgYmUgZWFybHktZXhwaXJlZC4gKi8KKwlJUFNfQVNTVVJFRF9CSVQgPSAyLAorCUlQU19BU1NVUkVEID0gKDEgPDwgSVBTX0FTU1VSRURfQklUKSwKKworCS8qIENvbm5lY3Rpb24gaXMgY29uZmlybWVkOiBvcmlnaW5hdGluZyBwYWNrZXQgaGFzIGxlZnQgYm94ICovCisJSVBTX0NPTkZJUk1FRF9CSVQgPSAzLAorCUlQU19DT05GSVJNRUQgPSAoMSA8PCBJUFNfQ09ORklSTUVEX0JJVCksCisKKwkvKiBDb25uZWN0aW9uIG5lZWRzIHNyYyBuYXQgaW4gb3JpZyBkaXIuICBUaGlzIGJpdCBuZXZlciBjaGFuZ2VkLiAqLworCUlQU19TUkNfTkFUX0JJVCA9IDQsCisJSVBTX1NSQ19OQVQgPSAoMSA8PCBJUFNfU1JDX05BVF9CSVQpLAorCisJLyogQ29ubmVjdGlvbiBuZWVkcyBkc3QgbmF0IGluIG9yaWcgZGlyLiAgVGhpcyBiaXQgbmV2ZXIgY2hhbmdlZC4gKi8KKwlJUFNfRFNUX05BVF9CSVQgPSA1LAorCUlQU19EU1RfTkFUID0gKDEgPDwgSVBTX0RTVF9OQVRfQklUKSwKKworCS8qIEJvdGggdG9nZXRoZXIuICovCisJSVBTX05BVF9NQVNLID0gKElQU19EU1RfTkFUIHwgSVBTX1NSQ19OQVQpLAorCisJLyogQ29ubmVjdGlvbiBuZWVkcyBUQ1Agc2VxdWVuY2UgYWRqdXN0ZWQuICovCisJSVBTX1NFUV9BREpVU1RfQklUID0gNiwKKwlJUFNfU0VRX0FESlVTVCA9ICgxIDw8IElQU19TRVFfQURKVVNUX0JJVCksCisKKwkvKiBOQVQgaW5pdGlhbGl6YXRpb24gYml0cy4gKi8KKwlJUFNfU1JDX05BVF9ET05FX0JJVCA9IDcsCisJSVBTX1NSQ19OQVRfRE9ORSA9ICgxIDw8IElQU19TUkNfTkFUX0RPTkVfQklUKSwKKworCUlQU19EU1RfTkFUX0RPTkVfQklUID0gOCwKKwlJUFNfRFNUX05BVF9ET05FID0gKDEgPDwgSVBTX0RTVF9OQVRfRE9ORV9CSVQpLAorCisJLyogQm90aCB0b2dldGhlciAqLworCUlQU19OQVRfRE9ORV9NQVNLID0gKElQU19EU1RfTkFUX0RPTkUgfCBJUFNfU1JDX05BVF9ET05FKSwKKworCS8qIENvbm5lY3Rpb24gaXMgZHlpbmcgKHJlbW92ZWQgZnJvbSBsaXN0cyksIGNhbiBub3QgYmUgdW5zZXQuICovCisJSVBTX0RZSU5HX0JJVCA9IDksCisJSVBTX0RZSU5HID0gKDEgPDwgSVBTX0RZSU5HX0JJVCksCisKKwkvKiBDb25uZWN0aW9uIGhhcyBmaXhlZCB0aW1lb3V0LiAqLworCUlQU19GSVhFRF9USU1FT1VUX0JJVCA9IDEwLAorCUlQU19GSVhFRF9USU1FT1VUID0gKDEgPDwgSVBTX0ZJWEVEX1RJTUVPVVRfQklUKSwKKworCS8qIENvbm50cmFjayBpcyBhIHRlbXBsYXRlICovCisJSVBTX1RFTVBMQVRFX0JJVCA9IDExLAorCUlQU19URU1QTEFURSA9ICgxIDw8IElQU19URU1QTEFURV9CSVQpLAorCisJLyogQ29ubnRyYWNrIGlzIGEgZmFrZSB1bnRyYWNrZWQgZW50cnkgKi8KKwlJUFNfVU5UUkFDS0VEX0JJVCA9IDEyLAorCUlQU19VTlRSQUNLRUQgPSAoMSA8PCBJUFNfVU5UUkFDS0VEX0JJVCksCit9OworCisvKiBDb25uZWN0aW9uIHRyYWNraW5nIGV2ZW50IHR5cGVzICovCitlbnVtIGlwX2Nvbm50cmFja19ldmVudHMgeworCUlQQ1RfTkVXLAkJLyogbmV3IGNvbm50cmFjayAqLworCUlQQ1RfUkVMQVRFRCwJCS8qIHJlbGF0ZWQgY29ubnRyYWNrICovCisJSVBDVF9ERVNUUk9ZLAkJLyogZGVzdHJveWVkIGNvbm50cmFjayAqLworCUlQQ1RfUkVQTFksCQkvKiBjb25uZWN0aW9uIGhhcyBzZWVuIHR3by13YXkgdHJhZmZpYyAqLworCUlQQ1RfQVNTVVJFRCwJCS8qIGNvbm5lY3Rpb24gc3RhdHVzIGhhcyBjaGFuZ2VkIHRvIGFzc3VyZWQgKi8KKwlJUENUX1BST1RPSU5GTywJCS8qIHByb3RvY29sIGluZm9ybWF0aW9uIGhhcyBjaGFuZ2VkICovCisJSVBDVF9IRUxQRVIsCQkvKiBuZXcgaGVscGVyIGhhcyBiZWVuIHNldCAqLworCUlQQ1RfTUFSSywJCS8qIG5ldyBtYXJrIGhhcyBiZWVuIHNldCAqLworCUlQQ1RfTkFUU0VRQURKLAkJLyogTkFUIGlzIGRvaW5nIHNlcXVlbmNlIGFkanVzdG1lbnQgKi8KKwlJUENUX1NFQ01BUkssCQkvKiBuZXcgc2VjdXJpdHkgbWFyayBoYXMgYmVlbiBzZXQgKi8KK307CisKK2VudW0gaXBfY29ubnRyYWNrX2V4cGVjdF9ldmVudHMgeworCUlQRVhQX05FVywJCS8qIG5ldyBleHBlY3RhdGlvbiAqLworCUlQRVhQX0RFU1RST1ksCQkvKiBkZXN0cm95ZWQgZXhwZWN0YXRpb24gKi8KK307CisKKy8qIGV4cGVjdGF0aW9uIGZsYWdzICovCisjZGVmaW5lIE5GX0NUX0VYUEVDVF9QRVJNQU5FTlQJCTB4MQorI2RlZmluZSBORl9DVF9FWFBFQ1RfSU5BQ1RJVkUJCTB4MgorI2RlZmluZSBORl9DVF9FWFBFQ1RfVVNFUlNQQUNFCQkweDQKKworCisjZW5kaWYgLyogX05GX0NPTk5UUkFDS19DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMjJmYWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBfTkZfQ09OTlRSQUNLX0ZUUF9ICisjZGVmaW5lIF9ORl9DT05OVFJBQ0tfRlRQX0gKKy8qIEZUUCB0cmFja2luZy4gKi8KKworLyogVGhpcyBlbnVtIGlzIGV4cG9zZWQgdG8gdXNlcnNwYWNlICovCitlbnVtIG5mX2N0X2Z0cF90eXBlIHsKKwkvKiBQT1JUIGNvbW1hbmQgZnJvbSBjbGllbnQgKi8KKwlORl9DVF9GVFBfUE9SVCwKKwkvKiBQQVNWIHJlc3BvbnNlIGZyb20gc2VydmVyICovCisJTkZfQ1RfRlRQX1BBU1YsCisJLyogRVBSVCBjb21tYW5kIGZyb20gY2xpZW50ICovCisJTkZfQ1RfRlRQX0VQUlQsCisJLyogRVBTViByZXNwb25zZSBmcm9tIHNlcnZlciAqLworCU5GX0NUX0ZUUF9FUFNWLAorfTsKKworCisjZW5kaWYgLyogX05GX0NPTk5UUkFDS19GVFBfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NjdHAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zY3RwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VlZWZlNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zY3RwLmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBfTkZfQ09OTlRSQUNLX1NDVFBfSAorI2RlZmluZSBfTkZfQ09OTlRSQUNLX1NDVFBfSAorLyogU0NUUCB0cmFja2luZy4gKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGVfY29tbW9uLmg+CisKK2VudW0gc2N0cF9jb25udHJhY2sgeworCVNDVFBfQ09OTlRSQUNLX05PTkUsCisJU0NUUF9DT05OVFJBQ0tfQ0xPU0VELAorCVNDVFBfQ09OTlRSQUNLX0NPT0tJRV9XQUlULAorCVNDVFBfQ09OTlRSQUNLX0NPT0tJRV9FQ0hPRUQsCisJU0NUUF9DT05OVFJBQ0tfRVNUQUJMSVNIRUQsCisJU0NUUF9DT05OVFJBQ0tfU0hVVERPV05fU0VOVCwKKwlTQ1RQX0NPTk5UUkFDS19TSFVURE9XTl9SRUNELAorCVNDVFBfQ09OTlRSQUNLX1NIVVRET1dOX0FDS19TRU5ULAorCVNDVFBfQ09OTlRSQUNLX01BWAorfTsKKworc3RydWN0IGlwX2N0X3NjdHAgeworCWVudW0gc2N0cF9jb25udHJhY2sgc3RhdGU7CisKKwlfX2JlMzIgdnRhZ1tJUF9DVF9ESVJfTUFYXTsKK307CisKKyNlbmRpZiAvKiBfTkZfQ09OTlRSQUNLX1NDVFBfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3RjcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3RjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOTFhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdGNwLmgKQEAgLTAsMCArMSw0OCBAQAorI2lmbmRlZiBfTkZfQ09OTlRSQUNLX1RDUF9ICisjZGVmaW5lIF9ORl9DT05OVFJBQ0tfVENQX0gKKy8qIFRDUCB0cmFja2luZy4gKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIFRoaXMgaXMgZXhwb3NlZCB0byB1c2Vyc3BhY2UgKGN0bmV0bGluaykgKi8KK2VudW0gdGNwX2Nvbm50cmFjayB7CisJVENQX0NPTk5UUkFDS19OT05FLAorCVRDUF9DT05OVFJBQ0tfU1lOX1NFTlQsCisJVENQX0NPTk5UUkFDS19TWU5fUkVDViwKKwlUQ1BfQ09OTlRSQUNLX0VTVEFCTElTSEVELAorCVRDUF9DT05OVFJBQ0tfRklOX1dBSVQsCisJVENQX0NPTk5UUkFDS19DTE9TRV9XQUlULAorCVRDUF9DT05OVFJBQ0tfTEFTVF9BQ0ssCisJVENQX0NPTk5UUkFDS19USU1FX1dBSVQsCisJVENQX0NPTk5UUkFDS19DTE9TRSwKKwlUQ1BfQ09OTlRSQUNLX0xJU1RFTiwJLyogb2Jzb2xldGUgKi8KKyNkZWZpbmUgVENQX0NPTk5UUkFDS19TWU5fU0VOVDIJVENQX0NPTk5UUkFDS19MSVNURU4KKwlUQ1BfQ09OTlRSQUNLX01BWCwKKwlUQ1BfQ09OTlRSQUNLX0lHTk9SRQorfTsKKworLyogV2luZG93IHNjYWxpbmcgaXMgYWR2ZXJ0aXNlZCBieSB0aGUgc2VuZGVyICovCisjZGVmaW5lIElQX0NUX1RDUF9GTEFHX1dJTkRPV19TQ0FMRQkJMHgwMQorCisvKiBTQUNLIGlzIHBlcm1pdHRlZCBieSB0aGUgc2VuZGVyICovCisjZGVmaW5lIElQX0NUX1RDUF9GTEFHX1NBQ0tfUEVSTQkJMHgwMgorCisvKiBUaGlzIHNlbmRlciBzZW50IEZJTiBmaXJzdCAqLworI2RlZmluZSBJUF9DVF9UQ1BfRkxBR19DTE9TRV9JTklUCQkweDA0CisKKy8qIEJlIGxpYmVyYWwgaW4gd2luZG93IGNoZWNraW5nICovCisjZGVmaW5lIElQX0NUX1RDUF9GTEFHX0JFX0xJQkVSQUwJCTB4MDgKKworLyogSGFzIHVuYWNrbm93bGVkZ2VkIGRhdGEgKi8KKyNkZWZpbmUgSVBfQ1RfVENQX0ZMQUdfREFUQV9VTkFDS05PV0xFREdFRAkweDEwCisKKy8qIFRoZSBmaWVsZCB0ZF9tYXhhY2sgaGFzIGJlZW4gc2V0ICovCisjZGVmaW5lIElQX0NUX1RDUF9GTEFHX01BWEFDS19TRVQJCTB4MjAKKworc3RydWN0IG5mX2N0X3RjcF9mbGFncyB7CisJX191OCBmbGFnczsKKwlfX3U4IG1hc2s7Cit9OworCisKKyNlbmRpZiAvKiBfTkZfQ09OTlRSQUNLX1RDUF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGVfY29tbW9uLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGVfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVhMjJiMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZV9jb21tb24uaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9ORl9DT05OVFJBQ0tfVFVQTEVfQ09NTU9OX0gKKyNkZWZpbmUgX05GX0NPTk5UUkFDS19UVVBMRV9DT01NT05fSAorCitlbnVtIGlwX2Nvbm50cmFja19kaXIgeworCUlQX0NUX0RJUl9PUklHSU5BTCwKKwlJUF9DVF9ESVJfUkVQTFksCisJSVBfQ1RfRElSX01BWAorfTsKKworI2RlZmluZSBDVElORk8yRElSKGN0aW5mbykgKChjdGluZm8pID49IElQX0NUX0lTX1JFUExZID8gSVBfQ1RfRElSX1JFUExZIDogSVBfQ1RfRElSX09SSUdJTkFMKQorCisjZW5kaWYgLyogX05GX0NPTk5UUkFDS19UVVBMRV9DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzk5ZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBfTkZORVRMSU5LX0gKKyNkZWZpbmUgX05GTkVUTElOS19ICisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2NvbXBhdC5oPgorCitlbnVtIG5mbmV0bGlua19ncm91cHMgeworCU5GTkxHUlBfTk9ORSwKKyNkZWZpbmUgTkZOTEdSUF9OT05FCQkJTkZOTEdSUF9OT05FCisJTkZOTEdSUF9DT05OVFJBQ0tfTkVXLAorI2RlZmluZSBORk5MR1JQX0NPTk5UUkFDS19ORVcJCU5GTkxHUlBfQ09OTlRSQUNLX05FVworCU5GTkxHUlBfQ09OTlRSQUNLX1VQREFURSwKKyNkZWZpbmUgTkZOTEdSUF9DT05OVFJBQ0tfVVBEQVRFCU5GTkxHUlBfQ09OTlRSQUNLX1VQREFURQorCU5GTkxHUlBfQ09OTlRSQUNLX0RFU1RST1ksCisjZGVmaW5lIE5GTkxHUlBfQ09OTlRSQUNLX0RFU1RST1kJTkZOTEdSUF9DT05OVFJBQ0tfREVTVFJPWQorCU5GTkxHUlBfQ09OTlRSQUNLX0VYUF9ORVcsCisjZGVmaW5lCU5GTkxHUlBfQ09OTlRSQUNLX0VYUF9ORVcJTkZOTEdSUF9DT05OVFJBQ0tfRVhQX05FVworCU5GTkxHUlBfQ09OTlRSQUNLX0VYUF9VUERBVEUsCisjZGVmaW5lIE5GTkxHUlBfQ09OTlRSQUNLX0VYUF9VUERBVEUJTkZOTEdSUF9DT05OVFJBQ0tfRVhQX1VQREFURQorCU5GTkxHUlBfQ09OTlRSQUNLX0VYUF9ERVNUUk9ZLAorI2RlZmluZSBORk5MR1JQX0NPTk5UUkFDS19FWFBfREVTVFJPWQlORk5MR1JQX0NPTk5UUkFDS19FWFBfREVTVFJPWQorCV9fTkZOTEdSUF9NQVgsCit9OworI2RlZmluZSBORk5MR1JQX01BWAkoX19ORk5MR1JQX01BWCAtIDEpCisKKy8qIEdlbmVyYWwgZm9ybSBvZiBhZGRyZXNzIGZhbWlseSBkZXBlbmRlbnQgbWVzc2FnZS4KKyAqLworc3RydWN0IG5mZ2VubXNnIHsKKwlfX3U4ICBuZmdlbl9mYW1pbHk7CQkvKiBBRl94eHggKi8KKwlfX3U4ICB2ZXJzaW9uOwkJLyogbmZuZXRsaW5rIHZlcnNpb24gKi8KKwlfX2JlMTYgICAgcmVzX2lkOwkJLyogcmVzb3VyY2UgaWQgKi8KK307CisKKyNkZWZpbmUgTkZORVRMSU5LX1YwCTAKKworLyogbmV0ZmlsdGVyIG5ldGxpbmsgbWVzc2FnZSB0eXBlcyBhcmUgc3BsaXQgaW4gdHdvIHBpZWNlczoKKyAqIDggYml0IHN1YnN5c3RlbSwgOGJpdCBvcGVyYXRpb24uCisgKi8KKworI2RlZmluZSBORk5MX1NVQlNZU19JRCh4KQkoKHggJiAweGZmMDApID4+IDgpCisjZGVmaW5lIE5GTkxfTVNHX1RZUEUoeCkJKHggJiAweDAwZmYpCisKKy8qIE5vIGVudW0gaGVyZSwgb3RoZXJ3aXNlIF9fc3RyaW5naWZ5KCkgdHJpY2sgb2YgTU9EVUxFX0FMSUFTX05GTkxfU1VCU1lTKCkKKyAqIHdvbid0IHdvcmsgYW55bW9yZSAqLworI2RlZmluZSBORk5MX1NVQlNZU19OT05FIAkJMAorI2RlZmluZSBORk5MX1NVQlNZU19DVE5FVExJTksJCTEKKyNkZWZpbmUgTkZOTF9TVUJTWVNfQ1RORVRMSU5LX0VYUAkyCisjZGVmaW5lIE5GTkxfU1VCU1lTX1FVRVVFCQkzCisjZGVmaW5lIE5GTkxfU1VCU1lTX1VMT0cJCTQKKyNkZWZpbmUgTkZOTF9TVUJTWVNfT1NGCQkJNQorI2RlZmluZSBORk5MX1NVQlNZU19JUFNFVAkJNgorI2RlZmluZSBORk5MX1NVQlNZU19DT1VOVAkJNworCisjZW5kaWYJLyogX05GTkVUTElOS19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfY29tcGF0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRiOWU1NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb21wYXQuaApAQCAtMCwwICsxLDYxIEBACisjaWZuZGVmIF9ORk5FVExJTktfQ09NUEFUX0gKKyNkZWZpbmUgX05GTkVUTElOS19DT01QQVRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogT2xkIG5mbmV0bGluayBtYWNyb3MgZm9yIHVzZXJzcGFjZSAqLworCisvKiBuZm5ldGxpbmsgZ3JvdXBzOiBVcCB0byAzMiBtYXhpbXVtICovCisjZGVmaW5lIE5GX05FVExJTktfQ09OTlRSQUNLX05FVyAJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTkZfTkVUTElOS19DT05OVFJBQ0tfVVBEQVRFCQkweDAwMDAwMDAyCisjZGVmaW5lIE5GX05FVExJTktfQ09OTlRSQUNLX0RFU1RST1kJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTkZfTkVUTElOS19DT05OVFJBQ0tfRVhQX05FVwkJMHgwMDAwMDAwOAorI2RlZmluZSBORl9ORVRMSU5LX0NPTk5UUkFDS19FWFBfVVBEQVRFCQkweDAwMDAwMDEwCisjZGVmaW5lIE5GX05FVExJTktfQ09OTlRSQUNLX0VYUF9ERVNUUk9ZCTB4MDAwMDAwMjAKKworLyogR2VuZXJpYyBzdHJ1Y3R1cmUgZm9yIGVuY2Fwc3VsYXRpb24gb3B0aW9uYWwgbmV0ZmlsdGVyIGluZm9ybWF0aW9uLgorICogSXQgaXMgcmVtaW5pc2NlbnQgb2Ygc29ja2FkZHIsIGJ1dCB3aXRoIHNhX2ZhbWlseSByZXBsYWNlZAorICogd2l0aCBhdHRyaWJ1dGUgdHlwZS4KKyAqICEgVGhpcyBzaG91bGQgc29tZWRheSBiZSBwdXQgc29tZXdoZXJlIGdlbmVyaWMgYXMgbm93IHJ0bmV0bGluayBhbmQKKyAqICEgbmZuZXRsaW5rIHVzZSB0aGUgc2FtZSBhdHRyaWJ1dGVzIG1ldGhvZHMuIC0gSi4gU2NodWxpc3QuCisgKi8KKworc3RydWN0IG5mYXR0ciB7CisJX191MTYgbmZhX2xlbjsKKwlfX3UxNiBuZmFfdHlwZTsJLyogd2UgdXNlIDE1IGJpdHMgZm9yIHRoZSB0eXBlLCBhbmQgdGhlIGhpZ2hlc3QKKwkJCQkgKiBiaXQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgcGF5bG9hZCBpcyBuZXN0ZWQgKi8KK307CisKKy8qIEZJWE1FOiBBcGFydCBmcm9tIE5GTkxfTkZBX05FU1RFRCBzaGFtZWxlc3NseSBjb3B5IGFuZCBwYXN0ZWQgZnJvbQorICogcnRuZXRsaW5rLmgsIGl0J3MgdGltZSB0byBwdXQgdGhpcyBpbiBhIGdlbmVyaWMgZmlsZSAqLworCisjZGVmaW5lIE5GTkxfTkZBX05FU1QJMHg4MDAwCisjZGVmaW5lIE5GQV9UWVBFKGF0dHIpIAkoKGF0dHIpLT5uZmFfdHlwZSAmIDB4N2ZmZikKKworI2RlZmluZSBORkFfQUxJR05UTyAgICAgNAorI2RlZmluZSBORkFfQUxJR04obGVuKQkoKChsZW4pICsgTkZBX0FMSUdOVE8gLSAxKSAmIH4oTkZBX0FMSUdOVE8gLSAxKSkKKyNkZWZpbmUgTkZBX09LKG5mYSxsZW4pCSgobGVuKSA+IDAgJiYgKG5mYSktPm5mYV9sZW4gPj0gc2l6ZW9mKHN0cnVjdCBuZmF0dHIpIFwKKwkmJiAobmZhKS0+bmZhX2xlbiA8PSAobGVuKSkKKyNkZWZpbmUgTkZBX05FWFQobmZhLGF0dHJsZW4pCSgoYXR0cmxlbikgLT0gTkZBX0FMSUdOKChuZmEpLT5uZmFfbGVuKSwgXAorCShzdHJ1Y3QgbmZhdHRyICopKCgoY2hhciAqKShuZmEpKSArIE5GQV9BTElHTigobmZhKS0+bmZhX2xlbikpKQorI2RlZmluZSBORkFfTEVOR1RIKGxlbikJKE5GQV9BTElHTihzaXplb2Yoc3RydWN0IG5mYXR0cikpICsgKGxlbikpCisjZGVmaW5lIE5GQV9TUEFDRShsZW4pCU5GQV9BTElHTihORkFfTEVOR1RIKGxlbikpCisjZGVmaW5lIE5GQV9EQVRBKG5mYSkgICAoKHZvaWQgKikoKChjaGFyICopKG5mYSkpICsgTkZBX0xFTkdUSCgwKSkpCisjZGVmaW5lIE5GQV9QQVlMT0FEKG5mYSkgKChpbnQpKChuZmEpLT5uZmFfbGVuKSAtIE5GQV9MRU5HVEgoMCkpCisjZGVmaW5lIE5GQV9ORVNUKHNrYiwgdHlwZSkgXAorKHsJc3RydWN0IG5mYXR0ciAqX19zdGFydCA9IChzdHJ1Y3QgbmZhdHRyICopc2tiX3RhaWxfcG9pbnRlcihza2IpOyBcCisJTkZBX1BVVChza2IsIChORk5MX05GQV9ORVNUIHwgdHlwZSksIDAsIE5VTEwpOyBcCisJX19zdGFydDsgIH0pCisjZGVmaW5lIE5GQV9ORVNUX0VORChza2IsIHN0YXJ0KSBcCisoeyAgICAgIChzdGFydCktPm5mYV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSAodW5zaWduZWQgY2hhciAqKShzdGFydCk7IFwKKyAgICAgICAgKHNrYiktPmxlbjsgfSkKKyNkZWZpbmUgTkZBX05FU1RfQ0FOQ0VMKHNrYiwgc3RhcnQpIFwKKyh7ICAgICAgaWYgKHN0YXJ0KSBcCisgICAgICAgICAgICAgICAgc2tiX3RyaW0oc2tiLCAodW5zaWduZWQgY2hhciAqKSAoc3RhcnQpIC0gKHNrYiktPmRhdGEpOyBcCisgICAgICAgIC0xOyB9KQorCisjZGVmaW5lIE5GTV9ORkEobikgICAgICAoKHN0cnVjdCBuZmF0dHIgKikoKChjaGFyICopKG4pKSBcCisgICAgICAgICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZmdlbm1zZykpKSkKKyNkZWZpbmUgTkZNX1BBWUxPQUQobikgIE5MTVNHX1BBWUxPQUQobiwgc2l6ZW9mKHN0cnVjdCBuZmdlbm1zZykpCisKKyNlbmRpZiAvKiBfTkZORVRMSU5LX0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfY29ubnRyYWNrLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfY29ubnRyYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViZjFhZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaApAQCAtMCwwICsxLDE5MyBAQAorI2lmbmRlZiBfSVBDT05OVFJBQ0tfTkVUTElOS19ICisjZGVmaW5lIF9JUENPTk5UUkFDS19ORVRMSU5LX0gKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmg+CisKK2VudW0gY250bF9tc2dfdHlwZXMgeworCUlQQ1ROTF9NU0dfQ1RfTkVXLAorCUlQQ1ROTF9NU0dfQ1RfR0VULAorCUlQQ1ROTF9NU0dfQ1RfREVMRVRFLAorCUlQQ1ROTF9NU0dfQ1RfR0VUX0NUUlpFUk8sCisKKwlJUENUTkxfTVNHX01BWAorfTsKKworZW51bSBjdG5sX2V4cF9tc2dfdHlwZXMgeworCUlQQ1ROTF9NU0dfRVhQX05FVywKKwlJUENUTkxfTVNHX0VYUF9HRVQsCisJSVBDVE5MX01TR19FWFBfREVMRVRFLAorCisJSVBDVE5MX01TR19FWFBfTUFYCit9OworCisKK2VudW0gY3RhdHRyX3R5cGUgeworCUNUQV9VTlNQRUMsCisJQ1RBX1RVUExFX09SSUcsCisJQ1RBX1RVUExFX1JFUExZLAorCUNUQV9TVEFUVVMsCisJQ1RBX1BST1RPSU5GTywKKwlDVEFfSEVMUCwKKwlDVEFfTkFUX1NSQywKKyNkZWZpbmUgQ1RBX05BVAlDVEFfTkFUX1NSQwkvKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLworCUNUQV9USU1FT1VULAorCUNUQV9NQVJLLAorCUNUQV9DT1VOVEVSU19PUklHLAorCUNUQV9DT1VOVEVSU19SRVBMWSwKKwlDVEFfVVNFLAorCUNUQV9JRCwKKwlDVEFfTkFUX0RTVCwKKwlDVEFfVFVQTEVfTUFTVEVSLAorCUNUQV9OQVRfU0VRX0FESl9PUklHLAorCUNUQV9OQVRfU0VRX0FESl9SRVBMWSwKKwlDVEFfU0VDTUFSSywJCS8qIG9ic29sZXRlICovCisJQ1RBX1pPTkUsCisJQ1RBX1NFQ0NUWCwKKwlDVEFfVElNRVNUQU1QLAorCV9fQ1RBX01BWAorfTsKKyNkZWZpbmUgQ1RBX01BWCAoX19DVEFfTUFYIC0gMSkKKworZW51bSBjdGF0dHJfdHVwbGUgeworCUNUQV9UVVBMRV9VTlNQRUMsCisJQ1RBX1RVUExFX0lQLAorCUNUQV9UVVBMRV9QUk9UTywKKwlfX0NUQV9UVVBMRV9NQVgKK307CisjZGVmaW5lIENUQV9UVVBMRV9NQVggKF9fQ1RBX1RVUExFX01BWCAtIDEpCisKK2VudW0gY3RhdHRyX2lwIHsKKwlDVEFfSVBfVU5TUEVDLAorCUNUQV9JUF9WNF9TUkMsCisJQ1RBX0lQX1Y0X0RTVCwKKwlDVEFfSVBfVjZfU1JDLAorCUNUQV9JUF9WNl9EU1QsCisJX19DVEFfSVBfTUFYCit9OworI2RlZmluZSBDVEFfSVBfTUFYIChfX0NUQV9JUF9NQVggLSAxKQorCitlbnVtIGN0YXR0cl9sNHByb3RvIHsKKwlDVEFfUFJPVE9fVU5TUEVDLAorCUNUQV9QUk9UT19OVU0sCisJQ1RBX1BST1RPX1NSQ19QT1JULAorCUNUQV9QUk9UT19EU1RfUE9SVCwKKwlDVEFfUFJPVE9fSUNNUF9JRCwKKwlDVEFfUFJPVE9fSUNNUF9UWVBFLAorCUNUQV9QUk9UT19JQ01QX0NPREUsCisJQ1RBX1BST1RPX0lDTVBWNl9JRCwKKwlDVEFfUFJPVE9fSUNNUFY2X1RZUEUsCisJQ1RBX1BST1RPX0lDTVBWNl9DT0RFLAorCV9fQ1RBX1BST1RPX01BWAorfTsKKyNkZWZpbmUgQ1RBX1BST1RPX01BWCAoX19DVEFfUFJPVE9fTUFYIC0gMSkKKworZW51bSBjdGF0dHJfcHJvdG9pbmZvIHsKKwlDVEFfUFJPVE9JTkZPX1VOU1BFQywKKwlDVEFfUFJPVE9JTkZPX1RDUCwKKwlDVEFfUFJPVE9JTkZPX0RDQ1AsCisJQ1RBX1BST1RPSU5GT19TQ1RQLAorCV9fQ1RBX1BST1RPSU5GT19NQVgKK307CisjZGVmaW5lIENUQV9QUk9UT0lORk9fTUFYIChfX0NUQV9QUk9UT0lORk9fTUFYIC0gMSkKKworZW51bSBjdGF0dHJfcHJvdG9pbmZvX3RjcCB7CisJQ1RBX1BST1RPSU5GT19UQ1BfVU5TUEVDLAorCUNUQV9QUk9UT0lORk9fVENQX1NUQVRFLAorCUNUQV9QUk9UT0lORk9fVENQX1dTQ0FMRV9PUklHSU5BTCwKKwlDVEFfUFJPVE9JTkZPX1RDUF9XU0NBTEVfUkVQTFksCisJQ1RBX1BST1RPSU5GT19UQ1BfRkxBR1NfT1JJR0lOQUwsCisJQ1RBX1BST1RPSU5GT19UQ1BfRkxBR1NfUkVQTFksCisJX19DVEFfUFJPVE9JTkZPX1RDUF9NQVgKK307CisjZGVmaW5lIENUQV9QUk9UT0lORk9fVENQX01BWCAoX19DVEFfUFJPVE9JTkZPX1RDUF9NQVggLSAxKQorCitlbnVtIGN0YXR0cl9wcm90b2luZm9fZGNjcCB7CisJQ1RBX1BST1RPSU5GT19EQ0NQX1VOU1BFQywKKwlDVEFfUFJPVE9JTkZPX0RDQ1BfU1RBVEUsCisJQ1RBX1BST1RPSU5GT19EQ0NQX1JPTEUsCisJQ1RBX1BST1RPSU5GT19EQ0NQX0hBTkRTSEFLRV9TRVEsCisJX19DVEFfUFJPVE9JTkZPX0RDQ1BfTUFYLAorfTsKKyNkZWZpbmUgQ1RBX1BST1RPSU5GT19EQ0NQX01BWCAoX19DVEFfUFJPVE9JTkZPX0RDQ1BfTUFYIC0gMSkKKworZW51bSBjdGF0dHJfcHJvdG9pbmZvX3NjdHAgeworCUNUQV9QUk9UT0lORk9fU0NUUF9VTlNQRUMsCisJQ1RBX1BST1RPSU5GT19TQ1RQX1NUQVRFLAorCUNUQV9QUk9UT0lORk9fU0NUUF9WVEFHX09SSUdJTkFMLAorCUNUQV9QUk9UT0lORk9fU0NUUF9WVEFHX1JFUExZLAorCV9fQ1RBX1BST1RPSU5GT19TQ1RQX01BWAorfTsKKyNkZWZpbmUgQ1RBX1BST1RPSU5GT19TQ1RQX01BWCAoX19DVEFfUFJPVE9JTkZPX1NDVFBfTUFYIC0gMSkKKworZW51bSBjdGF0dHJfY291bnRlcnMgeworCUNUQV9DT1VOVEVSU19VTlNQRUMsCisJQ1RBX0NPVU5URVJTX1BBQ0tFVFMsCQkvKiA2NGJpdCBjb3VudGVycyAqLworCUNUQV9DT1VOVEVSU19CWVRFUywJCS8qIDY0Yml0IGNvdW50ZXJzICovCisJQ1RBX0NPVU5URVJTMzJfUEFDS0VUUywJCS8qIG9sZCAzMmJpdCBjb3VudGVycywgdW51c2VkICovCisJQ1RBX0NPVU5URVJTMzJfQllURVMsCQkvKiBvbGQgMzJiaXQgY291bnRlcnMsIHVudXNlZCAqLworCV9fQ1RBX0NPVU5URVJTX01BWAorfTsKKyNkZWZpbmUgQ1RBX0NPVU5URVJTX01BWCAoX19DVEFfQ09VTlRFUlNfTUFYIC0gMSkKKworZW51bSBjdGF0dHJfdHN0YW1wIHsKKwlDVEFfVElNRVNUQU1QX1VOU1BFQywKKwlDVEFfVElNRVNUQU1QX1NUQVJULAorCUNUQV9USU1FU1RBTVBfU1RPUCwKKwlfX0NUQV9USU1FU1RBTVBfTUFYCit9OworI2RlZmluZSBDVEFfVElNRVNUQU1QX01BWCAoX19DVEFfVElNRVNUQU1QX01BWCAtIDEpCisKK2VudW0gY3RhdHRyX25hdCB7CisJQ1RBX05BVF9VTlNQRUMsCisJQ1RBX05BVF9NSU5JUCwKKwlDVEFfTkFUX01BWElQLAorCUNUQV9OQVRfUFJPVE8sCisJX19DVEFfTkFUX01BWAorfTsKKyNkZWZpbmUgQ1RBX05BVF9NQVggKF9fQ1RBX05BVF9NQVggLSAxKQorCitlbnVtIGN0YXR0cl9wcm90b25hdCB7CisJQ1RBX1BST1RPTkFUX1VOU1BFQywKKwlDVEFfUFJPVE9OQVRfUE9SVF9NSU4sCisJQ1RBX1BST1RPTkFUX1BPUlRfTUFYLAorCV9fQ1RBX1BST1RPTkFUX01BWAorfTsKKyNkZWZpbmUgQ1RBX1BST1RPTkFUX01BWCAoX19DVEFfUFJPVE9OQVRfTUFYIC0gMSkKKworZW51bSBjdGF0dHJfbmF0c2VxIHsKKwlDVEFfTkFUX1NFUV9VTlNQRUMsCisJQ1RBX05BVF9TRVFfQ09SUkVDVElPTl9QT1MsCisJQ1RBX05BVF9TRVFfT0ZGU0VUX0JFRk9SRSwKKwlDVEFfTkFUX1NFUV9PRkZTRVRfQUZURVIsCisJX19DVEFfTkFUX1NFUV9NQVgKK307CisjZGVmaW5lIENUQV9OQVRfU0VRX01BWCAoX19DVEFfTkFUX1NFUV9NQVggLSAxKQorCitlbnVtIGN0YXR0cl9leHBlY3QgeworCUNUQV9FWFBFQ1RfVU5TUEVDLAorCUNUQV9FWFBFQ1RfTUFTVEVSLAorCUNUQV9FWFBFQ1RfVFVQTEUsCisJQ1RBX0VYUEVDVF9NQVNLLAorCUNUQV9FWFBFQ1RfVElNRU9VVCwKKwlDVEFfRVhQRUNUX0lELAorCUNUQV9FWFBFQ1RfSEVMUF9OQU1FLAorCUNUQV9FWFBFQ1RfWk9ORSwKKwlDVEFfRVhQRUNUX0ZMQUdTLAorCV9fQ1RBX0VYUEVDVF9NQVgKK307CisjZGVmaW5lIENUQV9FWFBFQ1RfTUFYIChfX0NUQV9FWFBFQ1RfTUFYIC0gMSkKKworZW51bSBjdGF0dHJfaGVscCB7CisJQ1RBX0hFTFBfVU5TUEVDLAorCUNUQV9IRUxQX05BTUUsCisJX19DVEFfSEVMUF9NQVgKK307CisjZGVmaW5lIENUQV9IRUxQX01BWCAoX19DVEFfSEVMUF9NQVggLSAxKQorCitlbnVtIGN0YXR0cl9zZWNjdHggeworCUNUQV9TRUNDVFhfVU5TUEVDLAorCUNUQV9TRUNDVFhfTkFNRSwKKwlfX0NUQV9TRUNDVFhfTUFYCit9OworI2RlZmluZSBDVEFfU0VDQ1RYX01BWCAoX19DVEFfU0VDQ1RYX01BWCAtIDEpCisKKyNlbmRpZiAvKiBfSVBDT05OVFJBQ0tfTkVUTElOS19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBjMmM5NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuaApAQCAtMCwwICsxLDk3IEBACisjaWZuZGVmIF9ORk5FVExJTktfTE9HX0gKKyNkZWZpbmUgX05GTkVUTElOS19MT0dfSAorCisvKiBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBuZXRsaW5rIG1lc3NhZ2VzIChpLmUuICdwcm90b2NvbCBwYWNrZXRzJyksCisgKiBhbmQgbm90IGFueSBraW5kIG9mIGZ1bmN0aW9uIGRlZmluaXRpb25zLiAgSXQgaXMgc2hhcmVkIGJldHdlZW4ga2VybmVsIGFuZAorICogdXNlcnNwYWNlLiAgRG9uJ3QgcHV0IGtlcm5lbCBzcGVjaWZpYyBzdHVmZiBpbiBoZXJlICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmsuaD4KKworZW51bSBuZnVsbmxfbXNnX3R5cGVzIHsKKwlORlVMTkxfTVNHX1BBQ0tFVCwJCS8qIHBhY2tldCBmcm9tIGtlcm5lbCB0byB1c2Vyc3BhY2UgKi8KKwlORlVMTkxfTVNHX0NPTkZJRywJCS8qIGNvbm5lY3QgdG8gYSBwYXJ0aWN1bGFyIHF1ZXVlICovCisKKwlORlVMTkxfTVNHX01BWAorfTsKKworc3RydWN0IG5mdWxubF9tc2dfcGFja2V0X2hkciB7CisJX19iZTE2CQlod19wcm90b2NvbDsJLyogaHcgcHJvdG9jb2wgKG5ldHdvcmsgb3JkZXIpICovCisJX191OAlob29rOwkJLyogbmV0ZmlsdGVyIGhvb2sgKi8KKwlfX3U4CV9wYWQ7Cit9OworCitzdHJ1Y3QgbmZ1bG5sX21zZ19wYWNrZXRfaHcgeworCV9fYmUxNgkJaHdfYWRkcmxlbjsKKwlfX3UxNglfcGFkOworCV9fdTgJaHdfYWRkcls4XTsKK307CisKK3N0cnVjdCBuZnVsbmxfbXNnX3BhY2tldF90aW1lc3RhbXAgeworCV9fYWxpZ25lZF9iZTY0CXNlYzsKKwlfX2FsaWduZWRfYmU2NAl1c2VjOworfTsKKworZW51bSBuZnVsbmxfYXR0cl90eXBlIHsKKwlORlVMQV9VTlNQRUMsCisJTkZVTEFfUEFDS0VUX0hEUiwKKwlORlVMQV9NQVJLLAkJCS8qIF9fdTMyIG5mbWFyayAqLworCU5GVUxBX1RJTUVTVEFNUCwJCS8qIG5mdWxubF9tc2dfcGFja2V0X3RpbWVzdGFtcCAqLworCU5GVUxBX0lGSU5ERVhfSU5ERVYsCQkvKiBfX3UzMiBpZmluZGV4ICovCisJTkZVTEFfSUZJTkRFWF9PVVRERVYsCQkvKiBfX3UzMiBpZmluZGV4ICovCisJTkZVTEFfSUZJTkRFWF9QSFlTSU5ERVYsCS8qIF9fdTMyIGlmaW5kZXggKi8KKwlORlVMQV9JRklOREVYX1BIWVNPVVRERVYsCS8qIF9fdTMyIGlmaW5kZXggKi8KKwlORlVMQV9IV0FERFIsCQkJLyogbmZ1bG5sX21zZ19wYWNrZXRfaHcgKi8KKwlORlVMQV9QQVlMT0FELAkJCS8qIG9wYXF1ZSBkYXRhIHBheWxvYWQgKi8KKwlORlVMQV9QUkVGSVgsCQkJLyogc3RyaW5nIHByZWZpeCAqLworCU5GVUxBX1VJRCwJCQkvKiB1c2VyIGlkIG9mIHNvY2tldCAqLworCU5GVUxBX1NFUSwJCQkvKiBpbnN0YW5jZS1sb2NhbCBzZXF1ZW5jZSBudW1iZXIgKi8KKwlORlVMQV9TRVFfR0xPQkFMLAkJLyogZ2xvYmFsIHNlcXVlbmNlIG51bWJlciAqLworCU5GVUxBX0dJRCwJCQkvKiBncm91cCBpZCBvZiBzb2NrZXQgKi8KKwlORlVMQV9IV1RZUEUsCQkJLyogaGFyZHdhcmUgdHlwZSAqLworCU5GVUxBX0hXSEVBREVSLAkJCS8qIGhhcmR3YXJlIGhlYWRlciAqLworCU5GVUxBX0hXTEVOLAkJCS8qIGhhcmR3YXJlIGhlYWRlciBsZW5ndGggKi8KKworCV9fTkZVTEFfTUFYCit9OworI2RlZmluZSBORlVMQV9NQVggKF9fTkZVTEFfTUFYIC0gMSkKKworZW51bSBuZnVsbmxfbXNnX2NvbmZpZ19jbWRzIHsKKwlORlVMTkxfQ0ZHX0NNRF9OT05FLAorCU5GVUxOTF9DRkdfQ01EX0JJTkQsCisJTkZVTE5MX0NGR19DTURfVU5CSU5ELAorCU5GVUxOTF9DRkdfQ01EX1BGX0JJTkQsCisJTkZVTE5MX0NGR19DTURfUEZfVU5CSU5ELAorfTsKKworc3RydWN0IG5mdWxubF9tc2dfY29uZmlnX2NtZCB7CisJX191OAljb21tYW5kOwkvKiBuZnVsbmxfbXNnX2NvbmZpZ19jbWRzICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG5mdWxubF9tc2dfY29uZmlnX21vZGUgeworCV9fYmUzMgkJY29weV9yYW5nZTsKKwlfX3U4CWNvcHlfbW9kZTsKKwlfX3U4CV9wYWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworZW51bSBuZnVsbmxfYXR0cl9jb25maWcgeworCU5GVUxBX0NGR19VTlNQRUMsCisJTkZVTEFfQ0ZHX0NNRCwJCQkvKiBuZnVsbmxfbXNnX2NvbmZpZ19jbWQgKi8KKwlORlVMQV9DRkdfTU9ERSwJCQkvKiBuZnVsbmxfbXNnX2NvbmZpZ19tb2RlICovCisJTkZVTEFfQ0ZHX05MQlVGU0laLAkJLyogX191MzIgYnVmZmVyIHNpemUgKi8KKwlORlVMQV9DRkdfVElNRU9VVCwJCS8qIF9fdTMyIGluIDEvMTAwIHMgKi8KKwlORlVMQV9DRkdfUVRIUkVTSCwJCS8qIF9fdTMyICovCisJTkZVTEFfQ0ZHX0ZMQUdTLAkJLyogX191MTYgKi8KKwlfX05GVUxBX0NGR19NQVgKK307CisjZGVmaW5lIE5GVUxBX0NGR19NQVggKF9fTkZVTEFfQ0ZHX01BWCAtMSkKKworI2RlZmluZSBORlVMTkxfQ09QWV9OT05FCTB4MDAKKyNkZWZpbmUgTkZVTE5MX0NPUFlfTUVUQQkweDAxCisjZGVmaW5lIE5GVUxOTF9DT1BZX1BBQ0tFVAkweDAyCisvKiAweGZmIGlzIHJlc2VydmVkLCBkb24ndCB1c2UgaXQgZm9yIG5ldyBjb3B5IG1vZGVzLiAqLworCisjZGVmaW5lIE5GVUxOTF9DRkdfRl9TRVEJMHgwMDAxCisjZGVmaW5lIE5GVUxOTF9DRkdfRl9TRVFfR0xPQkFMCTB4MDAwMgorCisjZW5kaWYgLyogX05GTkVUTElOS19MT0dfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGIzMmU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmgKQEAgLTAsMCArMSw5MSBAQAorI2lmbmRlZiBfTkZORVRMSU5LX1FVRVVFX0gKKyNkZWZpbmUgX05GTkVUTElOS19RVUVVRV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmsuaD4KKworZW51bSBuZnFubF9tc2dfdHlwZXMgeworCU5GUU5MX01TR19QQUNLRVQsCQkvKiBwYWNrZXQgZnJvbSBrZXJuZWwgdG8gdXNlcnNwYWNlICovCisJTkZRTkxfTVNHX1ZFUkRJQ1QsCQkvKiB2ZXJkaWN0IGZyb20gdXNlcnNwYWNlIHRvIGtlcm5lbCAqLworCU5GUU5MX01TR19DT05GSUcsCQkvKiBjb25uZWN0IHRvIGEgcGFydGljdWxhciBxdWV1ZSAqLworCU5GUU5MX01TR19WRVJESUNUX0JBVENILAkvKiBiYXRjaHYgZnJvbSB1c2Vyc3BhY2UgdG8ga2VybmVsICovCisKKwlORlFOTF9NU0dfTUFYCit9OworCitzdHJ1Y3QgbmZxbmxfbXNnX3BhY2tldF9oZHIgeworCV9fYmUzMgkJcGFja2V0X2lkOwkvKiB1bmlxdWUgSUQgb2YgcGFja2V0IGluIHF1ZXVlICovCisJX19iZTE2CQlod19wcm90b2NvbDsJLyogaHcgcHJvdG9jb2wgKG5ldHdvcmsgb3JkZXIpICovCisJX191OAlob29rOwkJLyogbmV0ZmlsdGVyIGhvb2sgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbmZxbmxfbXNnX3BhY2tldF9odyB7CisJX19iZTE2CQlod19hZGRybGVuOworCV9fdTE2CV9wYWQ7CisJX191OAlod19hZGRyWzhdOworfTsKKworc3RydWN0IG5mcW5sX21zZ19wYWNrZXRfdGltZXN0YW1wIHsKKwlfX2FsaWduZWRfYmU2NAlzZWM7CisJX19hbGlnbmVkX2JlNjQJdXNlYzsKK307CisKK2VudW0gbmZxbmxfYXR0cl90eXBlIHsKKwlORlFBX1VOU1BFQywKKwlORlFBX1BBQ0tFVF9IRFIsCisJTkZRQV9WRVJESUNUX0hEUiwJCS8qIG5mcW5sX21zZ192ZXJkaWN0X2hyZCAqLworCU5GUUFfTUFSSywJCQkvKiBfX3UzMiBuZm1hcmsgKi8KKwlORlFBX1RJTUVTVEFNUCwJCQkvKiBuZnFubF9tc2dfcGFja2V0X3RpbWVzdGFtcCAqLworCU5GUUFfSUZJTkRFWF9JTkRFViwJCS8qIF9fdTMyIGlmaW5kZXggKi8KKwlORlFBX0lGSU5ERVhfT1VUREVWLAkJLyogX191MzIgaWZpbmRleCAqLworCU5GUUFfSUZJTkRFWF9QSFlTSU5ERVYsCQkvKiBfX3UzMiBpZmluZGV4ICovCisJTkZRQV9JRklOREVYX1BIWVNPVVRERVYsCS8qIF9fdTMyIGlmaW5kZXggKi8KKwlORlFBX0hXQUREUiwJCQkvKiBuZnFubF9tc2dfcGFja2V0X2h3ICovCisJTkZRQV9QQVlMT0FELAkJCS8qIG9wYXF1ZSBkYXRhIHBheWxvYWQgKi8KKworCV9fTkZRQV9NQVgKK307CisjZGVmaW5lIE5GUUFfTUFYIChfX05GUUFfTUFYIC0gMSkKKworc3RydWN0IG5mcW5sX21zZ192ZXJkaWN0X2hkciB7CisJX19iZTMyIHZlcmRpY3Q7CisJX19iZTMyIGlkOworfTsKKworCitlbnVtIG5mcW5sX21zZ19jb25maWdfY21kcyB7CisJTkZRTkxfQ0ZHX0NNRF9OT05FLAorCU5GUU5MX0NGR19DTURfQklORCwKKwlORlFOTF9DRkdfQ01EX1VOQklORCwKKwlORlFOTF9DRkdfQ01EX1BGX0JJTkQsCisJTkZRTkxfQ0ZHX0NNRF9QRl9VTkJJTkQsCit9OworCitzdHJ1Y3QgbmZxbmxfbXNnX2NvbmZpZ19jbWQgeworCV9fdTgJY29tbWFuZDsJLyogbmZxbmxfbXNnX2NvbmZpZ19jbWRzICovCisJX191OAlfcGFkOworCV9fYmUxNgkJcGY7CQkvKiBBRl94eHggZm9yIFBGX1tVTl1CSU5EICovCit9OworCitlbnVtIG5mcW5sX2NvbmZpZ19tb2RlIHsKKwlORlFOTF9DT1BZX05PTkUsCisJTkZRTkxfQ09QWV9NRVRBLAorCU5GUU5MX0NPUFlfUEFDS0VULAorfTsKKworc3RydWN0IG5mcW5sX21zZ19jb25maWdfcGFyYW1zIHsKKwlfX2JlMzIJCWNvcHlfcmFuZ2U7CisJX191OAljb3B5X21vZGU7CS8qIGVudW0gbmZxbmxfY29uZmlnX21vZGUgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKK2VudW0gbmZxbmxfYXR0cl9jb25maWcgeworCU5GUUFfQ0ZHX1VOU1BFQywKKwlORlFBX0NGR19DTUQsCQkJLyogbmZxbmxfbXNnX2NvbmZpZ19jbWQgKi8KKwlORlFBX0NGR19QQVJBTVMsCQkvKiBuZnFubF9tc2dfY29uZmlnX3BhcmFtcyAqLworCU5GUUFfQ0ZHX1FVRVVFX01BWExFTiwJCS8qIF9fdTMyICovCisJX19ORlFBX0NGR19NQVgKK307CisjZGVmaW5lIE5GUUFfQ0ZHX01BWCAoX19ORlFBX0NGR19NQVgtMSkKKworI2VuZGlmIC8qIF9ORk5FVExJTktfUVVFVUVfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEyMDk3MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmgKQEAgLTAsMCArMSwxODUgQEAKKyNpZm5kZWYgX1hfVEFCTEVTX0gKKyNkZWZpbmUgX1hfVEFCTEVTX0gKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFhUX0ZVTkNUSU9OX01BWE5BTUVMRU4gMzAKKyNkZWZpbmUgWFRfRVhURU5TSU9OX01BWE5BTUVMRU4gMjkKKyNkZWZpbmUgWFRfVEFCTEVfTUFYTkFNRUxFTiAzMgorCitzdHJ1Y3QgeHRfZW50cnlfbWF0Y2ggeworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTE2IG1hdGNoX3NpemU7CisKKwkJCS8qIFVzZWQgYnkgdXNlcnNwYWNlICovCisJCQljaGFyIG5hbWVbWFRfRVhURU5TSU9OX01BWE5BTUVMRU5dOworCQkJX191OCByZXZpc2lvbjsKKwkJfSB1c2VyOworCQlzdHJ1Y3QgeworCQkJX191MTYgbWF0Y2hfc2l6ZTsKKworCQkJLyogVXNlZCBpbnNpZGUgdGhlIGtlcm5lbCAqLworCQkJc3RydWN0IHh0X21hdGNoICptYXRjaDsKKwkJfSBrZXJuZWw7CisKKwkJLyogVG90YWwgbGVuZ3RoICovCisJCV9fdTE2IG1hdGNoX3NpemU7CisJfSB1OworCisJdW5zaWduZWQgY2hhciBkYXRhWzBdOworfTsKKworc3RydWN0IHh0X2VudHJ5X3RhcmdldCB7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191MTYgdGFyZ2V0X3NpemU7CisKKwkJCS8qIFVzZWQgYnkgdXNlcnNwYWNlICovCisJCQljaGFyIG5hbWVbWFRfRVhURU5TSU9OX01BWE5BTUVMRU5dOworCQkJX191OCByZXZpc2lvbjsKKwkJfSB1c2VyOworCQlzdHJ1Y3QgeworCQkJX191MTYgdGFyZ2V0X3NpemU7CisKKwkJCS8qIFVzZWQgaW5zaWRlIHRoZSBrZXJuZWwgKi8KKwkJCXN0cnVjdCB4dF90YXJnZXQgKnRhcmdldDsKKwkJfSBrZXJuZWw7CisKKwkJLyogVG90YWwgbGVuZ3RoICovCisJCV9fdTE2IHRhcmdldF9zaXplOworCX0gdTsKKworCXVuc2lnbmVkIGNoYXIgZGF0YVswXTsKK307CisKKyNkZWZpbmUgWFRfVEFSR0VUX0lOSVQoX19uYW1lLCBfX3NpemUpCQkJCQkgICAgICAgXAorewkJCQkJCQkJCSAgICAgICBcCisJLnRhcmdldC51LnVzZXIgPSB7CQkJCQkJICAgICAgIFwKKwkJLnRhcmdldF9zaXplCT0gWFRfQUxJR04oX19zaXplKSwJCQkgICAgICAgXAorCQkubmFtZQkJPSBfX25hbWUsCQkJCSAgICAgICBcCisJfSwJCQkJCQkJCSAgICAgICBcCit9CisKK3N0cnVjdCB4dF9zdGFuZGFyZF90YXJnZXQgeworCXN0cnVjdCB4dF9lbnRyeV90YXJnZXQgdGFyZ2V0OworCWludCB2ZXJkaWN0OworfTsKKworc3RydWN0IHh0X2Vycm9yX3RhcmdldCB7CisJc3RydWN0IHh0X2VudHJ5X3RhcmdldCB0YXJnZXQ7CisJY2hhciBlcnJvcm5hbWVbWFRfRlVOQ1RJT05fTUFYTkFNRUxFTl07Cit9OworCisvKiBUaGUgYXJndW1lbnQgdG8gSVBUX1NPX0dFVF9SRVZJU0lPTl8qLiAgUmV0dXJucyBoaWdoZXN0IHJldmlzaW9uCisgKiBrZXJuZWwgc3VwcG9ydHMsIGlmID49IHJldmlzaW9uLiAqLworc3RydWN0IHh0X2dldF9yZXZpc2lvbiB7CisJY2hhciBuYW1lW1hUX0VYVEVOU0lPTl9NQVhOQU1FTEVOXTsKKwlfX3U4IHJldmlzaW9uOworfTsKKworLyogQ09OVElOVUUgdmVyZGljdCBmb3IgdGFyZ2V0cyAqLworI2RlZmluZSBYVF9DT05USU5VRSAweEZGRkZGRkZGCisKKy8qIEZvciBzdGFuZGFyZCB0YXJnZXQgKi8KKyNkZWZpbmUgWFRfUkVUVVJOICgtTkZfUkVQRUFUIC0gMSkKKworLyogdGhpcyBpcyBhIGR1bW15IHN0cnVjdHVyZSB0byBmaW5kIG91dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IGZvciBhIHN0cnVjdAorICogY29udGFpbmluZyBhbGwgdGhlIGZ1bmRhbWVudGFsIGRhdGEgdHlwZXMgdGhhdCBhcmUgdXNlZCBpbiBpcHRfZW50cnksCisgKiBpcDZ0X2VudHJ5IGFuZCBhcnB0X2VudHJ5LiAgVGhpcyBzdWNrcywgYW5kIGl0IGlzIGEgaGFjay4gIEl0IHdpbGwgYmUgbXkKKyAqIHBlcnNvbmFsIHBsZWFzdXJlIHRvIHJlbW92ZSBpdCAtSFcKKyAqLworc3RydWN0IF94dF9hbGlnbiB7CisJX191OCB1ODsKKwlfX3UxNiB1MTY7CisJX191MzIgdTMyOworCV9fdTY0IHU2NDsKK307CisKKyNkZWZpbmUgWFRfQUxJR04ocykgX19BTElHTl9LRVJORUwoKHMpLCBfX2FsaWdub2ZfXyhzdHJ1Y3QgX3h0X2FsaWduKSkKKworLyogU3RhbmRhcmQgcmV0dXJuIHZlcmRpY3QsIG9yIGRvIGp1bXAuICovCisjZGVmaW5lIFhUX1NUQU5EQVJEX1RBUkdFVCAiIgorLyogRXJyb3IgdmVyZGljdC4gKi8KKyNkZWZpbmUgWFRfRVJST1JfVEFSR0VUICJFUlJPUiIKKworI2RlZmluZSBTRVRfQ09VTlRFUihjLGIscCkgZG8geyAoYykuYmNudCA9IChiKTsgKGMpLnBjbnQgPSAocCk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgQUREX0NPVU5URVIoYyxiLHApIGRvIHsgKGMpLmJjbnQgKz0gKGIpOyAoYykucGNudCArPSAocCk7IH0gd2hpbGUoMCkKKworc3RydWN0IHh0X2NvdW50ZXJzIHsKKwlfX3U2NCBwY250LCBiY250OwkJCS8qIFBhY2tldCBhbmQgYnl0ZSBjb3VudGVycyAqLworfTsKKworLyogVGhlIGFyZ3VtZW50IHRvIElQVF9TT19BRERfQ09VTlRFUlMuICovCitzdHJ1Y3QgeHRfY291bnRlcnNfaW5mbyB7CisJLyogV2hpY2ggdGFibGUuICovCisJY2hhciBuYW1lW1hUX1RBQkxFX01BWE5BTUVMRU5dOworCisJdW5zaWduZWQgaW50IG51bV9jb3VudGVyczsKKworCS8qIFRoZSBjb3VudGVycyAoYWN0dWFsbHkgYG51bWJlcicgb2YgdGhlc2UpLiAqLworCXN0cnVjdCB4dF9jb3VudGVycyBjb3VudGVyc1swXTsKK307CisKKyNkZWZpbmUgWFRfSU5WX1BST1RPCQkweDQwCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgUFJPVE8uICovCisKKy8qIGZuIHJldHVybnMgMCB0byBjb250aW51ZSBpdGVyYXRpb24gKi8KKyNkZWZpbmUgWFRfTUFUQ0hfSVRFUkFURSh0eXBlLCBlLCBmbiwgYXJncy4uLikJCQlcCisoewkJCQkJCQkJXAorCXVuc2lnbmVkIGludCBfX2k7CQkJCQlcCisJaW50IF9fcmV0ID0gMDsJCQkJCQlcCisJc3RydWN0IHh0X2VudHJ5X21hdGNoICpfX207CQkJCVwKKwkJCQkJCQkJXAorCWZvciAoX19pID0gc2l6ZW9mKHR5cGUpOwkJCQlcCisJICAgICBfX2kgPCAoZSktPnRhcmdldF9vZmZzZXQ7CQkJCVwKKwkgICAgIF9faSArPSBfX20tPnUubWF0Y2hfc2l6ZSkgewkJCVwKKwkJX19tID0gKHZvaWQgKillICsgX19pOwkJCQlcCisJCQkJCQkJCVwKKwkJX19yZXQgPSBmbihfX20gLCAjIyBhcmdzKTsJCQlcCisJCWlmIChfX3JldCAhPSAwKQkJCQkJXAorCQkJYnJlYWs7CQkJCQlcCisJfQkJCQkJCQlcCisJX19yZXQ7CQkJCQkJCVwKK30pCisKKy8qIGZuIHJldHVybnMgMCB0byBjb250aW51ZSBpdGVyYXRpb24gKi8KKyNkZWZpbmUgWFRfRU5UUllfSVRFUkFURV9DT05USU5VRSh0eXBlLCBlbnRyaWVzLCBzaXplLCBuLCBmbiwgYXJncy4uLikgXAorKHsJCQkJCQkJCVwKKwl1bnNpZ25lZCBpbnQgX19pLCBfX247CQkJCQlcCisJaW50IF9fcmV0ID0gMDsJCQkJCQlcCisJdHlwZSAqX19lbnRyeTsJCQkJCQlcCisJCQkJCQkJCVwKKwlmb3IgKF9faSA9IDAsIF9fbiA9IDA7IF9faSA8IChzaXplKTsJCQlcCisJICAgICBfX2kgKz0gX19lbnRyeS0+bmV4dF9vZmZzZXQsIF9fbisrKSB7IAkJXAorCQlfX2VudHJ5ID0gKHZvaWQgKikoZW50cmllcykgKyBfX2k7CQlcCisJCWlmIChfX24gPCBuKQkJCQkJXAorCQkJY29udGludWU7CQkJCVwKKwkJCQkJCQkJXAorCQlfX3JldCA9IGZuKF9fZW50cnkgLCAjIyBhcmdzKTsJCQlcCisJCWlmIChfX3JldCAhPSAwKQkJCQkJXAorCQkJYnJlYWs7CQkJCQlcCisJfQkJCQkJCQlcCisJX19yZXQ7CQkJCQkJCVwKK30pCisKKy8qIGZuIHJldHVybnMgMCB0byBjb250aW51ZSBpdGVyYXRpb24gKi8KKyNkZWZpbmUgWFRfRU5UUllfSVRFUkFURSh0eXBlLCBlbnRyaWVzLCBzaXplLCBmbiwgYXJncy4uLikgXAorCVhUX0VOVFJZX0lURVJBVEVfQ09OVElOVUUodHlwZSwgZW50cmllcywgc2l6ZSwgMCwgZm4sIGFyZ3MpCisKKworLyogcG9zIGlzIG5vcm1hbGx5IGEgc3RydWN0IGlwdF9lbnRyeS9pcDZ0X2VudHJ5L2V0Yy4gKi8KKyNkZWZpbmUgeHRfZW50cnlfZm9yZWFjaChwb3MsIGVoZWFkLCBlc2l6ZSkgXAorCWZvciAoKHBvcykgPSAodHlwZW9mKHBvcykpKGVoZWFkKTsgXAorCSAgICAgKHBvcykgPCAodHlwZW9mKHBvcykpKChjaGFyICopKGVoZWFkKSArIChlc2l6ZSkpOyBcCisJICAgICAocG9zKSA9ICh0eXBlb2YocG9zKSkoKGNoYXIgKikocG9zKSArIChwb3MpLT5uZXh0X29mZnNldCkpCisKKy8qIGNhbiBvbmx5IGJlIHh0X2VudHJ5X21hdGNoLCBzbyBubyB1c2Ugb2YgdHlwZW9mIGhlcmUgKi8KKyNkZWZpbmUgeHRfZW1hdGNoX2ZvcmVhY2gocG9zLCBlbnRyeSkgXAorCWZvciAoKHBvcykgPSAoc3RydWN0IHh0X2VudHJ5X21hdGNoICopZW50cnktPmVsZW1zOyBcCisJICAgICAocG9zKSA8IChzdHJ1Y3QgeHRfZW50cnlfbWF0Y2ggKikoKGNoYXIgKikoZW50cnkpICsgXAorCSAgICAgICAgICAgICAoZW50cnkpLT50YXJnZXRfb2Zmc2V0KTsgXAorCSAgICAgKHBvcykgPSAoc3RydWN0IHh0X2VudHJ5X21hdGNoICopKChjaGFyICopKHBvcykgKyBcCisJICAgICAgICAgICAgIChwb3MpLT51Lm1hdGNoX3NpemUpKQorCisKKyNlbmRpZiAvKiBfWF9UQUJMRVNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfQVVESVQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0FVRElULmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg3NTFkMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0FVRElULmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIEhlYWRlciBmaWxlIGZvciBpcHRhYmxlcyB4dF9BVURJVCB0YXJnZXQKKyAqCisgKiAoQykgMjAxMC0yMDExIFRob21hcyBHcmFmIDx0Z3JhZkByZWRoYXQuY29tPgorICogKEMpIDIwMTAtMjAxMSBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9YVF9BVURJVF9UQVJHRVRfSAorI2RlZmluZSBfWFRfQVVESVRfVEFSR0VUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2VudW0geworCVhUX0FVRElUX1RZUEVfQUNDRVBUID0gMCwKKwlYVF9BVURJVF9UWVBFX0RST1AsCisJWFRfQVVESVRfVFlQRV9SRUpFQ1QsCisJX19YVF9BVURJVF9UWVBFX01BWCwKK307CisKKyNkZWZpbmUgWFRfQVVESVRfVFlQRV9NQVggKF9fWFRfQVVESVRfVFlQRV9NQVggLSAxKQorCitzdHJ1Y3QgeHRfYXVkaXRfaW5mbyB7CisJX191OCB0eXBlOyAvKiBYVF9BVURJVF9UWVBFXyogKi8KK307CisKKyNlbmRpZiAvKiBfWFRfQVVESVRfVEFSR0VUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NIRUNLU1VNLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DSEVDS1NVTS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMmU0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DSEVDS1NVTS5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qIEhlYWRlciBmaWxlIGZvciBpcHRhYmxlcyBpcHRfQ0hFQ0tTVU0gdGFyZ2V0CisgKgorICogKEMpIDIwMDIgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDEwIFJlZCBIYXQgSW5jCisgKiBBdXRob3I6IE1pY2hhZWwgUy4gVHNpcmtpbiA8bXN0QHJlZGhhdC5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciBHTlUgR1BMIHYyLCAxOTkxCisqLworI2lmbmRlZiBfWFRfQ0hFQ0tTVU1fVEFSR0VUX0gKKyNkZWZpbmUgX1hUX0NIRUNLU1VNX1RBUkdFVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFhUX0NIRUNLU1VNX09QX0ZJTEwJMHgwMQkvKiBmaWxsIGluIGNoZWNrc3VtIGluIElQIGhlYWRlciAqLworCitzdHJ1Y3QgeHRfQ0hFQ0tTVU1faW5mbyB7CisJX191OCBvcGVyYXRpb247CS8qIGJpdHNldCBvZiBvcGVyYXRpb25zICovCit9OworCisjZW5kaWYgLyogX1hUX0NIRUNLU1VNX1RBUkdFVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DTEFTU0lGWS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfQ0xBU1NJRlkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODEzYmYxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfQ0xBU1NJRlkuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9YVF9DTEFTU0lGWV9ICisjZGVmaW5lIF9YVF9DTEFTU0lGWV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgeHRfY2xhc3NpZnlfdGFyZ2V0X2luZm8geworCV9fdTMyIHByaW9yaXR5OworfTsKKworI2VuZGlmIC8qX1hUX0NMQVNTSUZZX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DT05OTUFSSy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMmU0OGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DT05OTUFSSy5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfWFRfQ09OTk1BUktfSF90YXJnZXQKKyNkZWZpbmUgX1hUX0NPTk5NQVJLX0hfdGFyZ2V0CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuaD4KKworI2VuZGlmIC8qX1hUX0NPTk5NQVJLX0hfdGFyZ2V0Ki8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NPTk5TRUNNQVJLLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DT05OU0VDTUFSSy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NzNmZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DT05OU0VDTUFSSy5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX1hUX0NPTk5TRUNNQVJLX0hfdGFyZ2V0CisjZGVmaW5lIF9YVF9DT05OU0VDTUFSS19IX3RhcmdldAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSB7CisJQ09OTlNFQ01BUktfU0FWRSA9IDEsCisJQ09OTlNFQ01BUktfUkVTVE9SRSwKK307CisKK3N0cnVjdCB4dF9jb25uc2VjbWFya190YXJnZXRfaW5mbyB7CisJX191OCBtb2RlOworfTsKKworI2VuZGlmIC8qX1hUX0NPTk5TRUNNQVJLX0hfdGFyZ2V0ICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DVC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfQ1QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTZlNzY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfQ1QuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9YVF9DVF9ICisjZGVmaW5lIF9YVF9DVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFhUX0NUX05PVFJBQ0sJMHgxCisKK3N0cnVjdCB4dF9jdF90YXJnZXRfaW5mbyB7CisJX191MTYgZmxhZ3M7CisJX191MTYgem9uZTsKKwlfX3UzMiBjdF9ldmVudHM7CisJX191MzIgZXhwX2V2ZW50czsKKwljaGFyIGhlbHBlclsxNl07CisKKwkvKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGtlcm5lbCAqLworCXN0cnVjdCBuZl9jb25uCSpjdCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7Cit9OworCisjZW5kaWYgLyogX1hUX0NUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0RTQ1AuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0RTQ1AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDhlMGIzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfRFNDUC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIHhfdGFibGVzIG1vZHVsZSBmb3Igc2V0dGluZyB0aGUgSVB2NC9JUHY2IERTQ1AgZmllbGQKKyAqCisgKiAoQykgMjAwMiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogYmFzZWQgb24gaXB0X0ZUT1MuYyAoQykgMjAwMCBieSBNYXR0aGV3IEcuIE1hcnNoIDxtZ21AcGFrdHJvbml4LmNvbT4KKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgR05VIEdQTCB2MiwgMTk5MQorICoKKyAqIFNlZSBSRkMyNDc0IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBEU0NQIGZpZWxkIHdpdGhpbiB0aGUgSVAgSGVhZGVyLgorICoKKyAqIHh0X0RTQ1AuaCx2IDEuNyAyMDAyLzAzLzE0IDEyOjAzOjEzIGxhZm9yZ2UgRXhwCisqLworI2lmbmRlZiBfWFRfRFNDUF9UQVJHRVRfSAorI2RlZmluZSBfWFRfRFNDUF9UQVJHRVRfSAorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9kc2NwLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogdGFyZ2V0IGluZm8gKi8KK3N0cnVjdCB4dF9EU0NQX2luZm8geworCV9fdTggZHNjcDsKK307CisKK3N0cnVjdCB4dF90b3NfdGFyZ2V0X2luZm8geworCV9fdTggdG9zX3ZhbHVlOworCV9fdTggdG9zX21hc2s7Cit9OworCisjZW5kaWYgLyogX1hUX0RTQ1BfVEFSR0VUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0lETEVUSU1FUi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfSURMRVRJTUVSLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA4YWU5MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0lETEVUSU1FUi5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBsaW51eC9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9JRExFVElNRVIuaAorICoKKyAqIEhlYWRlciBmaWxlIGZvciBYdGFibGVzIHRpbWVyIHRhcmdldCBtb2R1bGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDEwIE5va2lhIENvcnBvcmF0aW9uCisgKiBXcml0dGVuIGJ5IFRpbW8gVGVyYXMgPGV4dC10aW1vLnRlcmFzQG5va2lhLmNvbT4KKyAqCisgKiBDb252ZXJ0ZWQgdG8geF90YWJsZXMgYW5kIGZvcndhcmQtcG9ydGVkIHRvIDIuNi4zNAorICogYnkgTHVjaWFubyBDb2VsaG8gPGx1Y2lhbm8uY29lbGhvQG5va2lhLmNvbT4KKyAqCisgKiBDb250YWN0OiBMdWNpYW5vIENvZWxobyA8bHVjaWFuby5jb2VsaG9Abm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9YVF9JRExFVElNRVJfSAorI2RlZmluZSBfWFRfSURMRVRJTUVSX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgTUFYX0lETEVUSU1FUl9MQUJFTF9TSVpFIDI4CisKK3N0cnVjdCBpZGxldGltZXJfdGdfaW5mbyB7CisJX191MzIgdGltZW91dDsKKworCWNoYXIgbGFiZWxbTUFYX0lETEVUSU1FUl9MQUJFTF9TSVpFXTsKKworCS8qIGZvciBrZXJuZWwgbW9kdWxlIGludGVybmFsIHVzZSBvbmx5ICovCisJc3RydWN0IGlkbGV0aW1lcl90ZyAqdGltZXIgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9MRUQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0xFRC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NTA5ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9MRUQuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIF9YVF9MRURfSAorI2RlZmluZSBfWFRfTEVEX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCB4dF9sZWRfaW5mbyB7CisJY2hhciBpZFsyN107ICAgICAgICAvKiBVbmlxdWUgSUQgZm9yIHRoaXMgdHJpZ2dlciBpbiB0aGUgTEVEIGNsYXNzICovCisJX191OCBhbHdheXNfYmxpbms7ICAvKiBCbGluayBldmVuIGlmIHRoZSBMRUQgaXMgYWxyZWFkeSBvbiAqLworCV9fdTMyIGRlbGF5OyAgICAgICAgLyogRGVsYXkgdW50aWwgTEVEIGlzIHN3aXRjaGVkIG9mZiBhZnRlciB0cmlnZ2VyICovCisKKwkvKiBLZXJuZWwgZGF0YSB1c2VkIGluIHRoZSBtb2R1bGUgKi8KKwl2b2lkICppbnRlcm5hbF9kYXRhIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKK307CisKKyNlbmRpZiAvKiBfWFRfTEVEX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X01BUksuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X01BUksuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWM0NTZkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfTUFSSy5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfWFRfTUFSS19IX3RhcmdldAorI2RlZmluZSBfWFRfTUFSS19IX3RhcmdldAorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X21hcmsuaD4KKworI2VuZGlmIC8qX1hUX01BUktfSF90YXJnZXQgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GTE9HLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9ORkxPRy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YjU4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9ORkxPRy5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX1hUX05GTE9HX1RBUkdFVAorI2RlZmluZSBfWFRfTkZMT0dfVEFSR0VUCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFhUX05GTE9HX0RFRkFVTFRfR1JPVVAJCTB4MQorI2RlZmluZSBYVF9ORkxPR19ERUZBVUxUX1RIUkVTSE9MRAkwCisKKyNkZWZpbmUgWFRfTkZMT0dfTUFTSwkJCTB4MAorCitzdHJ1Y3QgeHRfbmZsb2dfaW5mbyB7CisJX191MzIJbGVuOworCV9fdTE2CWdyb3VwOworCV9fdTE2CXRocmVzaG9sZDsKKwlfX3UxNglmbGFnczsKKwlfX3UxNglwYWQ7CisJY2hhcgkJcHJlZml4WzY0XTsKK307CisKKyNlbmRpZiAvKiBfWFRfTkZMT0dfVEFSR0VUICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9ORlFVRVVFLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9ORlFVRVVFLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVhZmRiYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GUVVFVUUuaApAQCAtMCwwICsxLDI5IEBACisvKiBpcHRhYmxlcyBtb2R1bGUgZm9yIHVzaW5nIE5GUVVFVUUgbWVjaGFuaXNtCisgKgorICogKEMpIDIwMDUgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciBHTlUgR1BMIHYyLCAxOTkxCisgKiAKKyovCisjaWZuZGVmIF9YVF9ORlFfVEFSR0VUX0gKKyNkZWZpbmUgX1hUX05GUV9UQVJHRVRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogdGFyZ2V0IGluZm8gKi8KK3N0cnVjdCB4dF9ORlFfaW5mbyB7CisJX191MTYgcXVldWVudW07Cit9OworCitzdHJ1Y3QgeHRfTkZRX2luZm9fdjEgeworCV9fdTE2IHF1ZXVlbnVtOworCV9fdTE2IHF1ZXVlc190b3RhbDsKK307CisKK3N0cnVjdCB4dF9ORlFfaW5mb192MiB7CisJX191MTYgcXVldWVudW07CisJX191MTYgcXVldWVzX3RvdGFsOworCV9fdTE2IGJ5cGFzczsKK307CisKKyNlbmRpZiAvKiBfWFRfTkZRX1RBUkdFVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9SQVRFRVNULmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9SQVRFRVNULmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwNWUyMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X1JBVEVFU1QuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIF9YVF9SQVRFRVNUX1RBUkdFVF9ICisjZGVmaW5lIF9YVF9SQVRFRVNUX1RBUkdFVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgeHRfcmF0ZWVzdF90YXJnZXRfaW5mbyB7CisJY2hhcgkJCW5hbWVbSUZOQU1TSVpdOworCV9fczgJCQlpbnRlcnZhbDsKKwlfX3U4CQlld21hX2xvZzsKKworCS8qIFVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsICovCisJc3RydWN0IHh0X3JhdGVlc3QJKmVzdCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7Cit9OworCisjZW5kaWYgLyogX1hUX1JBVEVFU1RfVEFSR0VUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X1NFQ01BUksuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X1NFQ01BUksuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODkwOTJiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfU0VDTUFSSy5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX1hUX1NFQ01BUktfSF90YXJnZXQKKyNkZWZpbmUgX1hUX1NFQ01BUktfSF90YXJnZXQKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBUaGlzIGlzIGludGVuZGVkIGZvciB1c2UgYnkgdmFyaW91cyBzZWN1cml0eSBzdWJzeXN0ZW1zIChidXQgbm90CisgKiBhdCB0aGUgc2FtZSB0aW1lKS4KKyAqCisgKiAnbW9kZScgcmVmZXJzIHRvIHRoZSBzcGVjaWZpYyBzZWN1cml0eSBzdWJzeXN0ZW0gd2hpY2ggdGhlCisgKiBwYWNrZXRzIGFyZSBiZWluZyBtYXJrZWQgZm9yLgorICovCisjZGVmaW5lIFNFQ01BUktfTU9ERV9TRUwJMHgwMQkJLyogU0VMaW51eCAqLworI2RlZmluZSBTRUNNQVJLX1NFQ0NUWF9NQVgJMjU2CisKK3N0cnVjdCB4dF9zZWNtYXJrX3RhcmdldF9pbmZvIHsKKwlfX3U4IG1vZGU7CisJX191MzIgc2VjaWQ7CisJY2hhciBzZWNjdHhbU0VDTUFSS19TRUNDVFhfTUFYXTsKK307CisKKyNlbmRpZiAvKl9YVF9TRUNNQVJLX0hfdGFyZ2V0ICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9UQ1BNU1MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X1RDUE1TUy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNjk2MGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9UQ1BNU1MuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9YVF9UQ1BNU1NfSAorI2RlZmluZSBfWFRfVENQTVNTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCB4dF90Y3Btc3NfaW5mbyB7CisJX191MTYgbXNzOworfTsKKworI2RlZmluZSBYVF9UQ1BNU1NfQ0xBTVBfUE1UVSAweGZmZmYKKworI2VuZGlmIC8qIF9YVF9UQ1BNU1NfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfVENQT1BUU1RSSVAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X1RDUE9QVFNUUklQLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE1NzMxOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X1RDUE9QVFNUUklQLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBfWFRfVENQT1BUU1RSSVBfSAorI2RlZmluZSBfWFRfVENQT1BUU1RSSVBfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSB0Y3BvcHRzdHJpcF9zZXRfYml0KGJtYXAsIGlkeCkgXAorCShibWFwWyhpZHgpID4+IDVdIHw9IDFVIDw8IChpZHggJiAzMSkpCisjZGVmaW5lIHRjcG9wdHN0cmlwX3Rlc3RfYml0KGJtYXAsIGlkeCkgXAorCSgoKDFVIDw8IChpZHggJiAzMSkpICYgYm1hcFsoaWR4KSA+PiA1XSkgIT0gMCkKKworc3RydWN0IHh0X3RjcG9wdHN0cmlwX3RhcmdldF9pbmZvIHsKKwlfX3UzMiBzdHJpcF9ibWFwWzhdOworfTsKKworI2VuZGlmIC8qIF9YVF9UQ1BPUFRTVFJJUF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9URUUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X1RFRS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMjFkNWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9URUUuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9YVF9URUVfVEFSR0VUX0gKKyNkZWZpbmUgX1hUX1RFRV9UQVJHRVRfSAorCitzdHJ1Y3QgeHRfdGVlX3RnaW5mbyB7CisJdW5pb24gbmZfaW5ldF9hZGRyIGd3OworCWNoYXIgb2lmWzE2XTsKKworCS8qIHVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsICovCisJc3RydWN0IHh0X3RlZV9wcml2ICpwcml2IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKK307CisKKyNlbmRpZiAvKiBfWFRfVEVFX1RBUkdFVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9UUFJPWFkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X1RQUk9YWS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMjA0M2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9UUFJPWFkuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIF9YVF9UUFJPWFlfSAorI2RlZmluZSBfWFRfVFBST1hZX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIFRQUk9YWSB0YXJnZXQgaXMgY2FwYWJsZSBvZiBtYXJraW5nIHRoZSBwYWNrZXQgdG8gcGVyZm9ybQorICogcmVkaXJlY3Rpb24uIFdlIGNhbiBnZXQgcmlkIG9mIHRoYXQgd2hlbmV2ZXIgd2UgZ2V0IHN1cHBvcnQgZm9yCisgKiBtdXRsaXBsZSB0YXJnZXRzIGluIHRoZSBzYW1lIHJ1bGUuICovCitzdHJ1Y3QgeHRfdHByb3h5X3RhcmdldF9pbmZvIHsKKwlfX3UzMiBtYXJrX21hc2s7CisJX191MzIgbWFya192YWx1ZTsKKwlfX2JlMzIgbGFkZHI7CisJX19iZTE2IGxwb3J0OworfTsKKworc3RydWN0IHh0X3Rwcm94eV90YXJnZXRfaW5mb192MSB7CisJX191MzIgbWFya19tYXNrOworCV9fdTMyIG1hcmtfdmFsdWU7CisJdW5pb24gbmZfaW5ldF9hZGRyIGxhZGRyOworCV9fYmUxNiBscG9ydDsKK307CisKKyNlbmRpZiAvKiBfWFRfVFBST1hZX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2FkZHJ0eXBlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9hZGRydHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNTZiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9hZGRydHlwZS5oCkBAIC0wLDAgKzEsNDQgQEAKKyNpZm5kZWYgX1hUX0FERFJUWVBFX0gKKyNkZWZpbmUgX1hUX0FERFJUWVBFX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2VudW0geworCVhUX0FERFJUWVBFX0lOVkVSVF9TT1VSQ0UJPSAweDAwMDEsCisJWFRfQUREUlRZUEVfSU5WRVJUX0RFU1QJCT0gMHgwMDAyLAorCVhUX0FERFJUWVBFX0xJTUlUX0lGQUNFX0lOCT0gMHgwMDA0LAorCVhUX0FERFJUWVBFX0xJTUlUX0lGQUNFX09VVAk9IDB4MDAwOCwKK307CisKKworLyogcnRuX3R5cGUgZW51bSB2YWx1ZXMgZnJvbSBydG5ldGxpbmsuaCwgYnV0IHNoaWZ0ZWQgKi8KK2VudW0geworCVhUX0FERFJUWVBFX1VOU1BFQyA9IDEgPDwgMCwKKwlYVF9BRERSVFlQRV9VTklDQVNUID0gMSA8PCAxLAkvKiAxIDw8IFJUTl9VTklDQVNUICovCisJWFRfQUREUlRZUEVfTE9DQUwgID0gMSA8PCAyLAkvKiAxIDw8IFJUTl9MT0NBTCwgZXRjICovCisJWFRfQUREUlRZUEVfQlJPQURDQVNUID0gMSA8PCAzLAorCVhUX0FERFJUWVBFX0FOWUNBU1QgPSAxIDw8IDQsCisJWFRfQUREUlRZUEVfTVVMVElDQVNUID0gMSA8PCA1LAorCVhUX0FERFJUWVBFX0JMQUNLSE9MRSA9IDEgPDwgNiwKKwlYVF9BRERSVFlQRV9VTlJFQUNIQUJMRSA9IDEgPDwgNywKKwlYVF9BRERSVFlQRV9QUk9ISUJJVCA9IDEgPDwgOCwKKwlYVF9BRERSVFlQRV9USFJPVyA9IDEgPDwgOSwKKwlYVF9BRERSVFlQRV9OQVQgPSAxIDw8IDEwLAorCVhUX0FERFJUWVBFX1hSRVNPTFZFID0gMSA8PCAxMSwKK307CisKK3N0cnVjdCB4dF9hZGRydHlwZV9pbmZvX3YxIHsKKwlfX3UxNglzb3VyY2U7CQkvKiBzb3VyY2UtdHlwZSBtYXNrICovCisJX191MTYJZGVzdDsJCS8qIGRlc3QtdHlwZSBtYXNrICovCisJX191MzIJZmxhZ3M7Cit9OworCisvKiByZXZpc2lvbiAwICovCitzdHJ1Y3QgeHRfYWRkcnR5cGVfaW5mbyB7CisJX191MTYJc291cmNlOwkJLyogc291cmNlLXR5cGUgbWFzayAqLworCV9fdTE2CWRlc3Q7CQkvKiBkZXN0LXR5cGUgbWFzayAqLworCV9fdTMyCWludmVydF9zb3VyY2U7CisJX191MzIJaW52ZXJ0X2Rlc3Q7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2NsdXN0ZXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2NsdXN0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjg4M2M4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY2x1c3Rlci5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX1hUX0NMVVNURVJfTUFUQ0hfSAorI2RlZmluZSBfWFRfQ0xVU1RFUl9NQVRDSF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHh0X2NsdXN0ZXJfZmxhZ3MgeworCVhUX0NMVVNURVJfRl9JTlYJPSAoMSA8PCAwKQorfTsKKworc3RydWN0IHh0X2NsdXN0ZXJfbWF0Y2hfaW5mbyB7CisJX191MzIgdG90YWxfbm9kZXM7CisJX191MzIgbm9kZV9tYXNrOworCV9fdTMyIGhhc2hfc2VlZDsKKwlfX3UzMiBmbGFnczsKK307CisKKyNkZWZpbmUgWFRfQ0xVU1RFUl9OT0RFU19NQVgJMzIKKworI2VuZGlmIC8qIF9YVF9DTFVTVEVSX01BVENIX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2NvbW1lbnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2NvbW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWE1ZTc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29tbWVudC5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX1hUX0NPTU1FTlRfSAorI2RlZmluZSBfWFRfQ09NTUVOVF9ICisKKyNkZWZpbmUgWFRfTUFYX0NPTU1FTlRfTEVOIDI1NgorCitzdHJ1Y3QgeHRfY29tbWVudF9pbmZvIHsKKwljaGFyIGNvbW1lbnRbWFRfTUFYX0NPTU1FTlRfTEVOXTsKK307CisKKyNlbmRpZiAvKiBYVF9DT01NRU5UX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2Nvbm5ieXRlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkNmMxNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2Nvbm5ieXRlcy5oCkBAIC0wLDAgKzEsMjYgQEAKKyNpZm5kZWYgX1hUX0NPTk5CWVRFU19ICisjZGVmaW5lIF9YVF9DT05OQllURVNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSB4dF9jb25uYnl0ZXNfd2hhdCB7CisJWFRfQ09OTkJZVEVTX1BLVFMsCisJWFRfQ09OTkJZVEVTX0JZVEVTLAorCVhUX0NPTk5CWVRFU19BVkdQS1QsCit9OworCitlbnVtIHh0X2Nvbm5ieXRlc19kaXJlY3Rpb24geworCVhUX0NPTk5CWVRFU19ESVJfT1JJR0lOQUwsCisJWFRfQ09OTkJZVEVTX0RJUl9SRVBMWSwKKwlYVF9DT05OQllURVNfRElSX0JPVEgsCit9OworCitzdHJ1Y3QgeHRfY29ubmJ5dGVzX2luZm8geworCXN0cnVjdCB7CisJCV9fYWxpZ25lZF91NjQgZnJvbTsJLyogY291bnQgdG8gYmUgbWF0Y2hlZCAqLworCQlfX2FsaWduZWRfdTY0IHRvOwkvKiBjb3VudCB0byBiZSBtYXRjaGVkICovCisJfSBjb3VudDsKKwlfX3U4IHdoYXQ7CQkvKiBpcHRfY29ubmJ5dGVzX3doYXQgKi8KKwlfX3U4IGRpcmVjdGlvbjsJLyogaXB0X2Nvbm5ieXRlc19kaXJlY3Rpb24gKi8KK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2Nvbm5saW1pdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubmxpbWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBjMTgyNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2Nvbm5saW1pdC5oCkBAIC0wLDAgKzEsMzUgQEAKKyNpZm5kZWYgX1hUX0NPTk5MSU1JVF9ICisjZGVmaW5lIF9YVF9DT05OTElNSVRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKworc3RydWN0IHh0X2Nvbm5saW1pdF9kYXRhOworCitlbnVtIHsKKwlYVF9DT05OTElNSVRfSU5WRVJUID0gMSA8PCAwLAorCVhUX0NPTk5MSU1JVF9EQUREUiAgPSAxIDw8IDEsCit9OworCitzdHJ1Y3QgeHRfY29ubmxpbWl0X2luZm8geworCXVuaW9uIHsKKwkJdW5pb24gbmZfaW5ldF9hZGRyIG1hc2s7CisJCXVuaW9uIHsKKwkJCV9fYmUzMiB2NF9tYXNrOworCQkJX19iZTMyIHY2X21hc2tbNF07CisJCX07CisJfTsKKwl1bnNpZ25lZCBpbnQgbGltaXQ7CisJdW5pb24geworCQkvKiByZXZpc2lvbiAwICovCisJCXVuc2lnbmVkIGludCBpbnZlcnNlOworCisJCS8qIHJldmlzaW9uIDEgKi8KKwkJX191MzIgZmxhZ3M7CisJfTsKKworCS8qIFVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsICovCisJc3RydWN0IHh0X2Nvbm5saW1pdF9kYXRhICpkYXRhIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKK307CisKKyNlbmRpZiAvKiBfWFRfQ09OTkxJTUlUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2Nvbm5tYXJrLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25ubWFyay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYzE3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25ubWFyay5oCkBAIC0wLDAgKzEsMzEgQEAKKyNpZm5kZWYgX1hUX0NPTk5NQVJLX0gKKyNkZWZpbmUgX1hUX0NPTk5NQVJLX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIENvcHlyaWdodCAoQykgMjAwMiwyMDA0IE1BUkEgU3lzdGVtcyBBQiA8aHR0cDovL3d3dy5tYXJhc3lzdGVtcy5jb20+CisgKiBieSBIZW5yaWsgTm9yZHN0cm9tIDxobm9AbWFyYXN5c3RlbXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworZW51bSB7CisJWFRfQ09OTk1BUktfU0VUID0gMCwKKwlYVF9DT05OTUFSS19TQVZFLAorCVhUX0NPTk5NQVJLX1JFU1RPUkUKK307CisKK3N0cnVjdCB4dF9jb25ubWFya190Z2luZm8xIHsKKwlfX3UzMiBjdG1hcmssIGN0bWFzaywgbmZtYXNrOworCV9fdTggbW9kZTsKK307CisKK3N0cnVjdCB4dF9jb25ubWFya19tdGluZm8xIHsKKwlfX3UzMiBtYXJrLCBtYXNrOworCV9fdTggaW52ZXJ0OworfTsKKworI2VuZGlmIC8qX1hUX0NPTk5NQVJLX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubnRyYWNrLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25udHJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2MwNDFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubnRyYWNrLmgKQEAgLTAsMCArMSw3NyBAQAorLyogSGVhZGVyIGZpbGUgZm9yIGtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggY29ubmVjdGlvbiB0cmFja2luZyBpbmZvcm1hdGlvbi4KKyAqIEdQTCAoQykgMjAwMSAgTWFyYyBCb3VjaGVyIChtYXJjQG1ic2kuY2EpLgorICovCisKKyNpZm5kZWYgX1hUX0NPTk5UUkFDS19ICisjZGVmaW5lIF9YVF9DT05OVFJBQ0tfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlX2NvbW1vbi5oPgorCisjZGVmaW5lIFhUX0NPTk5UUkFDS19TVEFURV9CSVQoY3RpbmZvKSAoMSA8PCAoKGN0aW5mbyklSVBfQ1RfSVNfUkVQTFkrMSkpCisjZGVmaW5lIFhUX0NPTk5UUkFDS19TVEFURV9JTlZBTElEICgxIDw8IDApCisKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1NUQVRFX1NOQVQgKDEgPDwgKElQX0NUX05VTUJFUiArIDEpKQorI2RlZmluZSBYVF9DT05OVFJBQ0tfU1RBVEVfRE5BVCAoMSA8PCAoSVBfQ1RfTlVNQkVSICsgMikpCisjZGVmaW5lIFhUX0NPTk5UUkFDS19TVEFURV9VTlRSQUNLRUQgKDEgPDwgKElQX0NUX05VTUJFUiArIDMpKQorCisvKiBmbGFncywgaW52ZmxhZ3M6ICovCitlbnVtIHsKKwlYVF9DT05OVFJBQ0tfU1RBVEUgICAgICAgID0gMSA8PCAwLAorCVhUX0NPTk5UUkFDS19QUk9UTyAgICAgICAgPSAxIDw8IDEsCisJWFRfQ09OTlRSQUNLX09SSUdTUkMgICAgICA9IDEgPDwgMiwKKwlYVF9DT05OVFJBQ0tfT1JJR0RTVCAgICAgID0gMSA8PCAzLAorCVhUX0NPTk5UUkFDS19SRVBMU1JDICAgICAgPSAxIDw8IDQsCisJWFRfQ09OTlRSQUNLX1JFUExEU1QgICAgICA9IDEgPDwgNSwKKwlYVF9DT05OVFJBQ0tfU1RBVFVTICAgICAgID0gMSA8PCA2LAorCVhUX0NPTk5UUkFDS19FWFBJUkVTICAgICAgPSAxIDw8IDcsCisJWFRfQ09OTlRSQUNLX09SSUdTUkNfUE9SVCA9IDEgPDwgOCwKKwlYVF9DT05OVFJBQ0tfT1JJR0RTVF9QT1JUID0gMSA8PCA5LAorCVhUX0NPTk5UUkFDS19SRVBMU1JDX1BPUlQgPSAxIDw8IDEwLAorCVhUX0NPTk5UUkFDS19SRVBMRFNUX1BPUlQgPSAxIDw8IDExLAorCVhUX0NPTk5UUkFDS19ESVJFQ1RJT04gICAgPSAxIDw8IDEyLAorfTsKKworc3RydWN0IHh0X2Nvbm50cmFja19tdGluZm8xIHsKKwl1bmlvbiBuZl9pbmV0X2FkZHIgb3JpZ3NyY19hZGRyLCBvcmlnc3JjX21hc2s7CisJdW5pb24gbmZfaW5ldF9hZGRyIG9yaWdkc3RfYWRkciwgb3JpZ2RzdF9tYXNrOworCXVuaW9uIG5mX2luZXRfYWRkciByZXBsc3JjX2FkZHIsIHJlcGxzcmNfbWFzazsKKwl1bmlvbiBuZl9pbmV0X2FkZHIgcmVwbGRzdF9hZGRyLCByZXBsZHN0X21hc2s7CisJX191MzIgZXhwaXJlc19taW4sIGV4cGlyZXNfbWF4OworCV9fdTE2IGw0cHJvdG87CisJX19iZTE2IG9yaWdzcmNfcG9ydCwgb3JpZ2RzdF9wb3J0OworCV9fYmUxNiByZXBsc3JjX3BvcnQsIHJlcGxkc3RfcG9ydDsKKwlfX3UxNiBtYXRjaF9mbGFncywgaW52ZXJ0X2ZsYWdzOworCV9fdTggc3RhdGVfbWFzaywgc3RhdHVzX21hc2s7Cit9OworCitzdHJ1Y3QgeHRfY29ubnRyYWNrX210aW5mbzIgeworCXVuaW9uIG5mX2luZXRfYWRkciBvcmlnc3JjX2FkZHIsIG9yaWdzcmNfbWFzazsKKwl1bmlvbiBuZl9pbmV0X2FkZHIgb3JpZ2RzdF9hZGRyLCBvcmlnZHN0X21hc2s7CisJdW5pb24gbmZfaW5ldF9hZGRyIHJlcGxzcmNfYWRkciwgcmVwbHNyY19tYXNrOworCXVuaW9uIG5mX2luZXRfYWRkciByZXBsZHN0X2FkZHIsIHJlcGxkc3RfbWFzazsKKwlfX3UzMiBleHBpcmVzX21pbiwgZXhwaXJlc19tYXg7CisJX191MTYgbDRwcm90bzsKKwlfX2JlMTYgb3JpZ3NyY19wb3J0LCBvcmlnZHN0X3BvcnQ7CisJX19iZTE2IHJlcGxzcmNfcG9ydCwgcmVwbGRzdF9wb3J0OworCV9fdTE2IG1hdGNoX2ZsYWdzLCBpbnZlcnRfZmxhZ3M7CisJX191MTYgc3RhdGVfbWFzaywgc3RhdHVzX21hc2s7Cit9OworCitzdHJ1Y3QgeHRfY29ubnRyYWNrX210aW5mbzMgeworCXVuaW9uIG5mX2luZXRfYWRkciBvcmlnc3JjX2FkZHIsIG9yaWdzcmNfbWFzazsKKwl1bmlvbiBuZl9pbmV0X2FkZHIgb3JpZ2RzdF9hZGRyLCBvcmlnZHN0X21hc2s7CisJdW5pb24gbmZfaW5ldF9hZGRyIHJlcGxzcmNfYWRkciwgcmVwbHNyY19tYXNrOworCXVuaW9uIG5mX2luZXRfYWRkciByZXBsZHN0X2FkZHIsIHJlcGxkc3RfbWFzazsKKwlfX3UzMiBleHBpcmVzX21pbiwgZXhwaXJlc19tYXg7CisJX191MTYgbDRwcm90bzsKKwlfX3UxNiBvcmlnc3JjX3BvcnQsIG9yaWdkc3RfcG9ydDsKKwlfX3UxNiByZXBsc3JjX3BvcnQsIHJlcGxkc3RfcG9ydDsKKwlfX3UxNiBtYXRjaF9mbGFncywgaW52ZXJ0X2ZsYWdzOworCV9fdTE2IHN0YXRlX21hc2ssIHN0YXR1c19tYXNrOworCV9fdTE2IG9yaWdzcmNfcG9ydF9oaWdoLCBvcmlnZHN0X3BvcnRfaGlnaDsKKwlfX3UxNiByZXBsc3JjX3BvcnRfaGlnaCwgcmVwbGRzdF9wb3J0X2hpZ2g7Cit9OworCisjZW5kaWYgLypfWFRfQ09OTlRSQUNLX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY3B1LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2M3ZjExCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY3B1LmgKQEAgLTAsMCArMSwxMSBAQAorI2lmbmRlZiBfWFRfQ1BVX0gKKyNkZWZpbmUgX1hUX0NQVV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgeHRfY3B1X2luZm8geworCV9fdTMyCWNwdTsKKwlfX3UzMglpbnZlcnQ7Cit9OworCisjZW5kaWYgLypfWFRfQ1BVX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfZGNjcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfZGNjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NzllMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9kY2NwLmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBfWFRfRENDUF9IXworI2RlZmluZSBfWFRfRENDUF9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBYVF9EQ0NQX1NSQ19QT1JUUwkgICAgICAgIDB4MDEKKyNkZWZpbmUgWFRfRENDUF9ERVNUX1BPUlRTCSAgICAgICAgMHgwMgorI2RlZmluZSBYVF9EQ0NQX1RZUEUJCQkweDA0CisjZGVmaW5lIFhUX0RDQ1BfT1BUSU9OCQkJMHgwOAorCisjZGVmaW5lIFhUX0RDQ1BfVkFMSURfRkxBR1MJCTB4MGYKKworc3RydWN0IHh0X2RjY3BfaW5mbyB7CisJX191MTYgZHB0c1syXTsgIC8qIE1pbiwgTWF4ICovCisJX191MTYgc3B0c1syXTsgIC8qIE1pbiwgTWF4ICovCisKKwlfX3UxNiBmbGFnczsKKwlfX3UxNiBpbnZmbGFnczsKKworCV9fdTE2IHR5cGVtYXNrOworCV9fdTggb3B0aW9uOworfTsKKworI2VuZGlmIC8qIF9YVF9EQ0NQX0hfICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2Rldmdyb3VwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9kZXZncm91cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYWJkZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9kZXZncm91cC5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX1hUX0RFVkdST1VQX0gKKyNkZWZpbmUgX1hUX0RFVkdST1VQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2VudW0geHRfZGV2Z3JvdXBfZmxhZ3MgeworCVhUX0RFVkdST1VQX01BVENIX1NSQwk9IDB4MSwKKwlYVF9ERVZHUk9VUF9JTlZFUlRfU1JDCT0gMHgyLAorCVhUX0RFVkdST1VQX01BVENIX0RTVAk9IDB4NCwKKwlYVF9ERVZHUk9VUF9JTlZFUlRfRFNUCT0gMHg4LAorfTsKKworc3RydWN0IHh0X2Rldmdyb3VwX2luZm8geworCV9fdTMyCWZsYWdzOworCV9fdTMyCXNyY19ncm91cDsKKwlfX3UzMglzcmNfbWFzazsKKwlfX3UzMglkc3RfZ3JvdXA7CisJX191MzIJZHN0X21hc2s7Cit9OworCisjZW5kaWYgLyogX1hUX0RFVkdST1VQX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2RzY3AuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2RzY3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWY4OTMyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfZHNjcC5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qIHhfdGFibGVzIG1vZHVsZSBmb3IgbWF0Y2hpbmcgdGhlIElQdjQvSVB2NiBEU0NQIGZpZWxkCisgKgorICogKEMpIDIwMDIgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgR05VIEdQTCB2MiwgMTk5MQorICoKKyAqIFNlZSBSRkMyNDc0IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBEU0NQIGZpZWxkIHdpdGhpbiB0aGUgSVAgSGVhZGVyLgorICoKKyAqIHh0X2RzY3AuaCx2IDEuMyAyMDAyLzA4LzA1IDE5OjAwOjIxIGxhZm9yZ2UgRXhwCisqLworI2lmbmRlZiBfWFRfRFNDUF9ICisjZGVmaW5lIF9YVF9EU0NQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgWFRfRFNDUF9NQVNLCTB4ZmMJLyogMTExMTExMDAgKi8KKyNkZWZpbmUgWFRfRFNDUF9TSElGVAkyCisjZGVmaW5lIFhUX0RTQ1BfTUFYCTB4M2YJLyogMDAxMTExMTEgKi8KKworLyogbWF0Y2ggaW5mbyAqLworc3RydWN0IHh0X2RzY3BfaW5mbyB7CisJX191OCBkc2NwOworCV9fdTggaW52ZXJ0OworfTsKKworc3RydWN0IHh0X3Rvc19tYXRjaF9pbmZvIHsKKwlfX3U4IHRvc19tYXNrOworCV9fdTggdG9zX3ZhbHVlOworCV9fdTggaW52ZXJ0OworfTsKKworI2VuZGlmIC8qIF9YVF9EU0NQX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2VzcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfZXNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2ODgyNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2VzcC5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX1hUX0VTUF9ICisjZGVmaW5lIF9YVF9FU1BfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IHh0X2VzcCB7CisJX191MzIgc3Bpc1syXTsJLyogU2VjdXJpdHkgUGFyYW1ldGVyIEluZGV4ICovCisJX191OCAgaW52ZmxhZ3M7CS8qIEludmVyc2UgZmxhZ3MgKi8KK307CisKKy8qIFZhbHVlcyBmb3IgImludmZsYWdzIiBmaWVsZCBpbiBzdHJ1Y3QgeHRfZXNwLiAqLworI2RlZmluZSBYVF9FU1BfSU5WX1NQSQkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2Ygc3BpLiAqLworI2RlZmluZSBYVF9FU1BfSU5WX01BU0sJMHgwMQkvKiBBbGwgcG9zc2libGUgZmxhZ3MuICovCisKKyNlbmRpZiAvKl9YVF9FU1BfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9oYXNobGltaXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOTI1YjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9oYXNobGltaXQuaApAQCAtMCwwICsxLDY4IEBACisjaWZuZGVmIF9YVF9IQVNITElNSVRfSAorI2RlZmluZSBfWFRfSEFTSExJTUlUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIHRpbWluZ3MgYXJlIGluIG1pbGxpc2Vjb25kcy4gKi8KKyNkZWZpbmUgWFRfSEFTSExJTUlUX1NDQUxFIDEwMDAwCisvKiAxLzEwLDAwMCBzZWMgcGVyaW9kID0+IG1heCBvZiAxMCwwMDAvc2VjLiAgTWluIHJhdGUgaXMgdGhlbiA0Mjk0OTAKKyAgIHNlY29uZHMsIG9yIG9uZSBldmVyeSA1OSBob3Vycy4gKi8KKworLyogZGV0YWlscyBvZiB0aGlzIHN0cnVjdHVyZSBoaWRkZW4gYnkgdGhlIGltcGxlbWVudGF0aW9uICovCitzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZTsKKworZW51bSB7CisJWFRfSEFTSExJTUlUX0hBU0hfRElQID0gMSA8PCAwLAorCVhUX0hBU0hMSU1JVF9IQVNIX0RQVCA9IDEgPDwgMSwKKwlYVF9IQVNITElNSVRfSEFTSF9TSVAgPSAxIDw8IDIsCisJWFRfSEFTSExJTUlUX0hBU0hfU1BUID0gMSA8PCAzLAorCVhUX0hBU0hMSU1JVF9JTlZFUlQgICA9IDEgPDwgNCwKK307CisKK3N0cnVjdCBoYXNobGltaXRfY2ZnIHsKKwlfX3UzMiBtb2RlOwkgIC8qIGJpdG1hc2sgb2YgWFRfSEFTSExJTUlUX0hBU0hfKiAqLworCV9fdTMyIGF2ZzsgICAgLyogQXZlcmFnZSBzZWNzIGJldHdlZW4gcGFja2V0cyAqIHNjYWxlICovCisJX191MzIgYnVyc3Q7ICAvKiBQZXJpb2QgbXVsdGlwbGllciBmb3IgdXBwZXIgbGltaXQuICovCisKKwkvKiB1c2VyIHNwZWNpZmllZCAqLworCV9fdTMyIHNpemU7CQkvKiBob3cgbWFueSBidWNrZXRzICovCisJX191MzIgbWF4OwkJLyogbWF4IG51bWJlciBvZiBlbnRyaWVzICovCisJX191MzIgZ2NfaW50ZXJ2YWw7CS8qIGdjIGludGVydmFsICovCisJX191MzIgZXhwaXJlOwkvKiB3aGVuIGRvIGVudHJpZXMgZXhwaXJlPyAqLworfTsKKworc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvIHsKKwljaGFyIG5hbWUgW0lGTkFNU0laXTsJCS8qIG5hbWUgKi8KKwlzdHJ1Y3QgaGFzaGxpbWl0X2NmZyBjZmc7CisKKwkvKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGtlcm5lbCAqLworCXN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpoaW5mbzsKKwl1bmlvbiB7CisJCXZvaWQgKnB0cjsKKwkJc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvICptYXN0ZXI7CisJfSB1OworfTsKKworc3RydWN0IGhhc2hsaW1pdF9jZmcxIHsKKwlfX3UzMiBtb2RlOwkgIC8qIGJpdG1hc2sgb2YgWFRfSEFTSExJTUlUX0hBU0hfKiAqLworCV9fdTMyIGF2ZzsgICAgLyogQXZlcmFnZSBzZWNzIGJldHdlZW4gcGFja2V0cyAqIHNjYWxlICovCisJX191MzIgYnVyc3Q7ICAvKiBQZXJpb2QgbXVsdGlwbGllciBmb3IgdXBwZXIgbGltaXQuICovCisKKwkvKiB1c2VyIHNwZWNpZmllZCAqLworCV9fdTMyIHNpemU7CQkvKiBob3cgbWFueSBidWNrZXRzICovCisJX191MzIgbWF4OwkJLyogbWF4IG51bWJlciBvZiBlbnRyaWVzICovCisJX191MzIgZ2NfaW50ZXJ2YWw7CS8qIGdjIGludGVydmFsICovCisJX191MzIgZXhwaXJlOwkvKiB3aGVuIGRvIGVudHJpZXMgZXhwaXJlPyAqLworCisJX191OCBzcmNtYXNrLCBkc3RtYXNrOworfTsKKworc3RydWN0IHh0X2hhc2hsaW1pdF9tdGluZm8xIHsKKwljaGFyIG5hbWVbSUZOQU1TSVpdOworCXN0cnVjdCBoYXNobGltaXRfY2ZnMSBjZmc7CisKKwkvKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGtlcm5lbCAqLworCXN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpoaW5mbyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7Cit9OworCisjZW5kaWYgLypfWFRfSEFTSExJTUlUX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfaGVscGVyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9oZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjQyNzYzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfaGVscGVyLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9YVF9IRUxQRVJfSAorI2RlZmluZSBfWFRfSEVMUEVSX0gKKworc3RydWN0IHh0X2hlbHBlcl9pbmZvIHsKKwlpbnQgaW52ZXJ0OworCWNoYXIgbmFtZVszMF07Cit9OworI2VuZGlmIC8qIF9YVF9IRUxQRVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfaXByYW5nZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfaXByYW5nZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZmQ3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9pcHJhbmdlLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfTElOVVhfTkVURklMVEVSX1hUX0lQUkFOR0VfSAorI2RlZmluZSBfTElOVVhfTkVURklMVEVSX1hUX0lQUkFOR0VfSCAxCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorCitlbnVtIHsKKwlJUFJBTkdFX1NSQyAgICAgPSAxIDw8IDAsCS8qIG1hdGNoIHNvdXJjZSBJUCBhZGRyZXNzICovCisJSVBSQU5HRV9EU1QgICAgID0gMSA8PCAxLAkvKiBtYXRjaCBkZXN0aW5hdGlvbiBJUCBhZGRyZXNzICovCisJSVBSQU5HRV9TUkNfSU5WID0gMSA8PCA0LAkvKiBuZWdhdGUgdGhlIGNvbmRpdGlvbiAqLworCUlQUkFOR0VfRFNUX0lOViA9IDEgPDwgNSwJLyogLSItICovCit9OworCitzdHJ1Y3QgeHRfaXByYW5nZV9tdGluZm8geworCXVuaW9uIG5mX2luZXRfYWRkciBzcmNfbWluLCBzcmNfbWF4OworCXVuaW9uIG5mX2luZXRfYWRkciBkc3RfbWluLCBkc3RfbWF4OworCV9fdTggZmxhZ3M7Cit9OworCisjZW5kaWYgLyogX0xJTlVYX05FVEZJTFRFUl9YVF9JUFJBTkdFX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2lwdnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2lwdnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmYzNGFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfaXB2cy5oCkBAIC0wLDAgKzEsMjkgQEAKKyNpZm5kZWYgX1hUX0lQVlNfSAorI2RlZmluZSBfWFRfSVBWU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHsKKwlYVF9JUFZTX0lQVlNfUFJPUEVSVFkgPQkxIDw8IDAsIC8qIGFsbCBvdGhlciBvcHRpb25zIGltcGx5IHRoaXMgb25lICovCisJWFRfSVBWU19QUk9UTyA9CQkxIDw8IDEsCisJWFRfSVBWU19WQUREUiA9CQkxIDw8IDIsCisJWFRfSVBWU19WUE9SVCA9CQkxIDw8IDMsCisJWFRfSVBWU19ESVIgPQkJMSA8PCA0LAorCVhUX0lQVlNfTUVUSE9EID0JMSA8PCA1LAorCVhUX0lQVlNfVlBPUlRDVEwgPQkxIDw8IDYsCisJWFRfSVBWU19NQVNLID0JCSgxIDw8IDcpIC0gMSwKKwlYVF9JUFZTX09OQ0VfTUFTSyA9CVhUX0lQVlNfTUFTSyAmIH5YVF9JUFZTX0lQVlNfUFJPUEVSVFkKK307CisKK3N0cnVjdCB4dF9pcHZzX210aW5mbyB7CisJdW5pb24gbmZfaW5ldF9hZGRyCXZhZGRyLCB2bWFzazsKKwlfX2JlMTYJCQl2cG9ydDsKKwlfX3U4CQkJbDRwcm90bzsKKwlfX3U4CQkJZndkX21ldGhvZDsKKwlfX2JlMTYJCQl2cG9ydGN0bDsKKworCV9fdTgJCQlpbnZlcnQ7CisJX191OAkJCWJpdG1hc2s7Cit9OworCisjZW5kaWYgLyogX1hUX0lQVlNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9sZW5ndGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODJlZDdjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmgKQEAgLTAsMCArMSwxMSBAQAorI2lmbmRlZiBfWFRfTEVOR1RIX0gKKyNkZWZpbmUgX1hUX0xFTkdUSF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgeHRfbGVuZ3RoX2luZm8geworICAgIF9fdTE2CW1pbiwgbWF4OworICAgIF9fdTgJaW52ZXJ0OworfTsKKworI2VuZGlmIC8qX1hUX0xFTkdUSF9IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2xpbWl0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9saW1pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNDdmYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9saW1pdC5oCkBAIC0wLDAgKzEsMjQgQEAKKyNpZm5kZWYgX1hUX1JBVEVfSAorI2RlZmluZSBfWFRfUkFURV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiB0aW1pbmdzIGFyZSBpbiBtaWxsaXNlY29uZHMuICovCisjZGVmaW5lIFhUX0xJTUlUX1NDQUxFIDEwMDAwCisKK3N0cnVjdCB4dF9saW1pdF9wcml2OworCisvKiAxLzEwLDAwMCBzZWMgcGVyaW9kID0+IG1heCBvZiAxMCwwMDAvc2VjLiAgTWluIHJhdGUgaXMgdGhlbiA0Mjk0OTAKKyAgIHNlY29uZHMsIG9yIG9uZSBldmVyeSA1OSBob3Vycy4gKi8KK3N0cnVjdCB4dF9yYXRlaW5mbyB7CisJX191MzIgYXZnOyAgICAvKiBBdmVyYWdlIHNlY3MgYmV0d2VlbiBwYWNrZXRzICogc2NhbGUgKi8KKwlfX3UzMiBidXJzdDsgIC8qIFBlcmlvZCBtdWx0aXBsaWVyIGZvciB1cHBlciBsaW1pdC4gKi8KKworCS8qIFVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsICovCisJdW5zaWduZWQgbG9uZyBwcmV2OyAvKiBtb3ZlZCB0byB4dF9saW1pdF9wcml2ICovCisJX191MzIgY3JlZGl0OyAvKiBtb3ZlZCB0byB4dF9saW1pdF9wcml2ICovCisJX191MzIgY3JlZGl0X2NhcCwgY29zdDsKKworCXN0cnVjdCB4dF9saW1pdF9wcml2ICptYXN0ZXI7Cit9OworI2VuZGlmIC8qX1hUX1JBVEVfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tYWMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X21hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OTJjZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tYWMuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX1hUX01BQ19ICisjZGVmaW5lIF9YVF9NQUNfSAorCitzdHJ1Y3QgeHRfbWFjX2luZm8geworICAgIHVuc2lnbmVkIGNoYXIgc3JjYWRkcltFVEhfQUxFTl07CisgICAgaW50IGludmVydDsKK307CisjZW5kaWYgLypfWFRfTUFDX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbWFyay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbWFyay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYWRjNDAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tYXJrLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBfWFRfTUFSS19ICisjZGVmaW5lIF9YVF9NQVJLX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCB4dF9tYXJrX3RnaW5mbzIgeworCV9fdTMyIG1hcmssIG1hc2s7Cit9OworCitzdHJ1Y3QgeHRfbWFya19tdGluZm8xIHsKKwlfX3UzMiBtYXJrLCBtYXNrOworCV9fdTggaW52ZXJ0OworfTsKKworI2VuZGlmIC8qX1hUX01BUktfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tdWx0aXBvcnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X211bHRpcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViN2U3MmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tdWx0aXBvcnQuaApAQCAtMCwwICsxLDI5IEBACisjaWZuZGVmIF9YVF9NVUxUSVBPUlRfSAorI2RlZmluZSBfWFRfTVVMVElQT1JUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2VudW0geHRfbXVsdGlwb3J0X2ZsYWdzIHsKKwlYVF9NVUxUSVBPUlRfU09VUkNFLAorCVhUX01VTFRJUE9SVF9ERVNUSU5BVElPTiwKKwlYVF9NVUxUSVBPUlRfRUlUSEVSCit9OworCisjZGVmaW5lIFhUX01VTFRJX1BPUlRTCTE1CisKKy8qIE11c3QgZml0IGluc2lkZSB1bmlvbiB4dF9tYXRjaGluZm86IDE2IGJ5dGVzICovCitzdHJ1Y3QgeHRfbXVsdGlwb3J0IHsKKwlfX3U4IGZsYWdzOwkJCQkvKiBUeXBlIG9mIGNvbXBhcmlzb24gKi8KKwlfX3U4IGNvdW50OwkJCQkvKiBOdW1iZXIgb2YgcG9ydHMgKi8KKwlfX3UxNiBwb3J0c1tYVF9NVUxUSV9QT1JUU107CS8qIFBvcnRzICovCit9OworCitzdHJ1Y3QgeHRfbXVsdGlwb3J0X3YxIHsKKwlfX3U4IGZsYWdzOwkJCQkvKiBUeXBlIG9mIGNvbXBhcmlzb24gKi8KKwlfX3U4IGNvdW50OwkJCQkvKiBOdW1iZXIgb2YgcG9ydHMgKi8KKwlfX3UxNiBwb3J0c1tYVF9NVUxUSV9QT1JUU107CS8qIFBvcnRzICovCisJX191OCBwZmxhZ3NbWFRfTVVMVElfUE9SVFNdOwkvKiBQb3J0IGZsYWdzICovCisJX191OCBpbnZlcnQ7CQkJLyogSW52ZXJ0IGZsYWcgKi8KK307CisKKyNlbmRpZiAvKl9YVF9NVUxUSVBPUlRfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9vc2YuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X29zZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YWZhNDkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9vc2YuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMysgRXZnZW5peSBQb2x5YWtvdiA8am9obnBvbEAya2EubXh0LnJ1PgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX1hUX09TRl9ICisjZGVmaW5lIF9YVF9PU0ZfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBNQVhHRU5SRUxFTgkJMzIKKworI2RlZmluZSBYVF9PU0ZfR0VOUkUJCSgxPDwwKQorI2RlZmluZQlYVF9PU0ZfVFRMCQkoMTw8MSkKKyNkZWZpbmUgWFRfT1NGX0xPRwkJKDE8PDIpCisjZGVmaW5lIFhUX09TRl9JTlZFUlQJCSgxPDwzKQorCisjZGVmaW5lIFhUX09TRl9MT0dMRVZFTF9BTEwJMAkvKiBsb2cgYWxsIG1hdGNoZWQgZmluZ2VycHJpbnRzICovCisjZGVmaW5lIFhUX09TRl9MT0dMRVZFTF9GSVJTVAkxCS8qIGxvZyBvbmx5IHRoZSBmaXJzdCBtYXRjZWQgZmluZ2VycHJpbnQgKi8KKyNkZWZpbmUgWFRfT1NGX0xPR0xFVkVMX0FMTF9LTk9XTgkyIC8qIGRvIG5vdCBsb2cgdW5rbm93biBwYWNrZXRzICovCisKKyNkZWZpbmUgWFRfT1NGX1RUTF9UUlVFCQkwCS8qIFRydWUgaXAgYW5kIGZpbmdlcnByaW50IFRUTCBjb21wYXJpc29uICovCisjZGVmaW5lIFhUX09TRl9UVExfTEVTUwkJMQkvKiBDaGVjayBpZiBpcCBUVEwgaXMgbGVzcyB0aGFuIGZpbmdlcnByaW50IG9uZSAqLworI2RlZmluZSBYVF9PU0ZfVFRMX05PQ0hFQ0sJMgkvKiBEbyBub3QgY29tcGFyZSBpcCBhbmQgZmluZ2VycHJpbnQgVFRMIGF0IGFsbCAqLworCitzdHJ1Y3QgeHRfb3NmX2luZm8geworCWNoYXIJCQlnZW5yZVtNQVhHRU5SRUxFTl07CisJX191MzIJCQlsZW47CisJX191MzIJCQlmbGFnczsKKwlfX3UzMgkJCWxvZ2xldmVsOworCV9fdTMyCQkJdHRsOworfTsKKworLyoKKyAqIFdpbGRjYXJkIE1TUyAoa2luZCBvZikuCisgKiBJdCBpcyB1c2VkIHRvIGltcGxlbWVudCBhIHN0YXRlIG1hY2hpbmUgZm9yIHRoZSBkaWZmZXJlbnQgd2lsZGNhcmQgdmFsdWVzCisgKiBvZiB0aGUgTVNTIGFuZCB3aW5kb3cgc2l6ZXMuCisgKi8KK3N0cnVjdCB4dF9vc2Zfd2MgeworCV9fdTMyCQkJd2M7CisJX191MzIJCQl2YWw7Cit9OworCisvKgorICogVGhpcyBzdHJ1Y3QgcmVwcmVzZW50cyBJQU5BIG9wdGlvbnMKKyAqIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvdGNwLXBhcmFtZXRlcnMKKyAqLworc3RydWN0IHh0X29zZl9vcHQgeworCV9fdTE2CQkJa2luZCwgbGVuZ3RoOworCXN0cnVjdCB4dF9vc2Zfd2MJd2M7Cit9OworCitzdHJ1Y3QgeHRfb3NmX3VzZXJfZmluZ2VyIHsKKwlzdHJ1Y3QgeHRfb3NmX3djCXdzczsKKworCV9fdTgJCQl0dGwsIGRmOworCV9fdTE2CQkJc3MsIG1zczsKKwlfX3UxNgkJCW9wdF9udW07CisKKwljaGFyCQkJZ2VucmVbTUFYR0VOUkVMRU5dOworCWNoYXIJCQl2ZXJzaW9uW01BWEdFTlJFTEVOXTsKKwljaGFyCQkJc3VidHlwZVtNQVhHRU5SRUxFTl07CisKKwkvKiBNQVhfSVBPUFRMRU4gaXMgbWF4aW11bSBpZiBhbGwgb3B0aW9ucyBhcmUgTk9QcyBvciBFT0xzICovCisJc3RydWN0IHh0X29zZl9vcHQJb3B0W01BWF9JUE9QVExFTl07Cit9OworCitzdHJ1Y3QgeHRfb3NmX25sbXNnIHsKKwlzdHJ1Y3QgeHRfb3NmX3VzZXJfZmluZ2VyCWY7CisJc3RydWN0IGlwaGRyCQlpcDsKKwlzdHJ1Y3QgdGNwaGRyCQl0Y3A7Cit9OworCisvKiBEZWZpbmVzIGZvciBJQU5BIG9wdGlvbiBraW5kcyAqLworCitlbnVtIGlhbmFfb3B0aW9ucyB7CisJT1NGT1BUX0VPTCA9IDAsCQkvKiBFbmQgb2Ygb3B0aW9ucyAqLworCU9TRk9QVF9OT1AsIAkJLyogTk9QICovCisJT1NGT1BUX01TUywgCQkvKiBNYXhpbXVtIHNlZ21lbnQgc2l6ZSAqLworCU9TRk9QVF9XU08sIAkJLyogV2luZG93IHNjYWxlIG9wdGlvbiAqLworCU9TRk9QVF9TQUNLUCwJCS8qIFNBQ0sgcGVybWl0dGVkICovCisJT1NGT1BUX1NBQ0ssCQkvKiBTQUNLICovCisJT1NGT1BUX0VDSE8sCisJT1NGT1BUX0VDSE9SRVBMWSwKKwlPU0ZPUFRfVFMsCQkvKiBUaW1lc3RhbXAgb3B0aW9uICovCisJT1NGT1BUX1BPQ1AsCQkvKiBQYXJ0aWFsIE9yZGVyIENvbm5lY3Rpb24gUGVybWl0dGVkICovCisJT1NGT1BUX1BPU1AsCQkvKiBQYXJ0aWFsIE9yZGVyIFNlcnZpY2UgUHJvZmlsZSAqLworCisJLyogT3RoZXJzIGFyZSBub3QgdXNlZCBpbiB0aGUgY3VycmVudCBPU0YgKi8KKwlPU0ZPUFRfRU1QVFkgPSAyNTUsCit9OworCisvKgorICogSW5pdGlhbCB3aW5kb3cgc2l6ZSBvcHRpb24gc3RhdGUgbWFjaGluZTogbXVsdGlwbGUgb2YgbXNzLCBtdHUgb3IKKyAqIHBsYWluIG51bWVyaWMgdmFsdWUuIENhbiBhbHNvIGJlIG1hZGUgYXMgcGxhaW4gbnVtZXJpYyB2YWx1ZSB3aGljaAorICogaXMgbm90IGEgbXVsdGlwbGUgb2Ygc3BlY2lmaWVkIHZhbHVlLgorICovCitlbnVtIHh0X29zZl93aW5kb3dfc2l6ZV9vcHRpb25zIHsKKwlPU0ZfV1NTX1BMQUlOCT0gMCwKKwlPU0ZfV1NTX01TUywKKwlPU0ZfV1NTX01UVSwKKwlPU0ZfV1NTX01PRFVMTywKKwlPU0ZfV1NTX01BWCwKK307CisKKy8qCisgKiBBZGQvcmVtb3ZlIGZpbmdlcnByaW50IGZyb20gdGhlIGtlcm5lbC4KKyAqLworZW51bSB4dF9vc2ZfbXNnX3R5cGVzIHsKKwlPU0ZfTVNHX0FERCwKKwlPU0ZfTVNHX1JFTU9WRSwKKwlPU0ZfTVNHX01BWCwKK307CisKK2VudW0geHRfb3NmX2F0dHJfdHlwZSB7CisJT1NGX0FUVFJfVU5TUEVDLAorCU9TRl9BVFRSX0ZJTkdFUiwKKwlPU0ZfQVRUUl9NQVgsCit9OworCisjZW5kaWYJCQkJLyogX1hUX09TRl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9vd25lci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfb3duZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDgxNzYxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfb3duZXIuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9YVF9PV05FUl9NQVRDSF9ICisjZGVmaW5lIF9YVF9PV05FUl9NQVRDSF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHsKKwlYVF9PV05FUl9VSUQgICAgPSAxIDw8IDAsCisJWFRfT1dORVJfR0lEICAgID0gMSA8PCAxLAorCVhUX09XTkVSX1NPQ0tFVCA9IDEgPDwgMiwKK307CisKK3N0cnVjdCB4dF9vd25lcl9tYXRjaF9pbmZvIHsKKwlfX3UzMiB1aWRfbWluLCB1aWRfbWF4OworCV9fdTMyIGdpZF9taW4sIGdpZF9tYXg7CisJX191OCBtYXRjaCwgaW52ZXJ0OworfTsKKworI2VuZGlmIC8qIF9YVF9PV05FUl9NQVRDSF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9waHlzZGV2LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9waHlzZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1MzY2MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIF9YVF9QSFlTREVWX0gKKyNkZWZpbmUgX1hUX1BIWVNERVZfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworCisjZGVmaW5lIFhUX1BIWVNERVZfT1BfSU4JCTB4MDEKKyNkZWZpbmUgWFRfUEhZU0RFVl9PUF9PVVQJCTB4MDIKKyNkZWZpbmUgWFRfUEhZU0RFVl9PUF9CUklER0VECQkweDA0CisjZGVmaW5lIFhUX1BIWVNERVZfT1BfSVNJTgkJMHgwOAorI2RlZmluZSBYVF9QSFlTREVWX09QX0lTT1VUCQkweDEwCisjZGVmaW5lIFhUX1BIWVNERVZfT1BfTUFTSwkJKDB4MjAgLSAxKQorCitzdHJ1Y3QgeHRfcGh5c2Rldl9pbmZvIHsKKwljaGFyIHBoeXNpbmRldltJRk5BTVNJWl07CisJY2hhciBpbl9tYXNrW0lGTkFNU0laXTsKKwljaGFyIHBoeXNvdXRkZXZbSUZOQU1TSVpdOworCWNoYXIgb3V0X21hc2tbSUZOQU1TSVpdOworCV9fdTggaW52ZXJ0OworCV9fdTggYml0bWFzazsKK307CisKKyNlbmRpZiAvKl9YVF9QSFlTREVWX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNjVjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9wa3R0eXBlLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9YVF9QS1RUWVBFX0gKKyNkZWZpbmUgX1hUX1BLVFRZUEVfSAorCitzdHJ1Y3QgeHRfcGt0dHlwZV9pbmZvIHsKKwlpbnQJcGt0dHlwZTsKKwlpbnQJaW52ZXJ0OworfTsKKyNlbmRpZiAvKl9YVF9QS1RUWVBFX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcG9saWN5LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9wb2xpY3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjQ2ZWFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcG9saWN5LmgKQEAgLTAsMCArMSw1OCBAQAorI2lmbmRlZiBfWFRfUE9MSUNZX0gKKyNkZWZpbmUgX1hUX1BPTElDWV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFhUX1BPTElDWV9NQVhfRUxFTQk0CisKK2VudW0geHRfcG9saWN5X2ZsYWdzIHsKKwlYVF9QT0xJQ1lfTUFUQ0hfSU4JPSAweDEsCisJWFRfUE9MSUNZX01BVENIX09VVAk9IDB4MiwKKwlYVF9QT0xJQ1lfTUFUQ0hfTk9ORQk9IDB4NCwKKwlYVF9QT0xJQ1lfTUFUQ0hfU1RSSUNUCT0gMHg4LAorfTsKKworZW51bSB4dF9wb2xpY3lfbW9kZXMgeworCVhUX1BPTElDWV9NT0RFX1RSQU5TUE9SVCwKKwlYVF9QT0xJQ1lfTU9ERV9UVU5ORUwKK307CisKK3N0cnVjdCB4dF9wb2xpY3lfc3BlYyB7CisJX191OAlzYWRkcjoxLAorCQkJZGFkZHI6MSwKKwkJCXByb3RvOjEsCisJCQltb2RlOjEsCisJCQlzcGk6MSwKKwkJCXJlcWlkOjE7Cit9OworCit1bmlvbiB4dF9wb2xpY3lfYWRkciB7CisJc3RydWN0IGluX2FkZHIJYTQ7CisJc3RydWN0IGluNl9hZGRyCWE2OworfTsKKworc3RydWN0IHh0X3BvbGljeV9lbGVtIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1bmlvbiB4dF9wb2xpY3lfYWRkciBzYWRkcjsKKwkJCXVuaW9uIHh0X3BvbGljeV9hZGRyIHNtYXNrOworCQkJdW5pb24geHRfcG9saWN5X2FkZHIgZGFkZHI7CisJCQl1bmlvbiB4dF9wb2xpY3lfYWRkciBkbWFzazsKKwkJfTsKKwl9OworCV9fYmUzMgkJCXNwaTsKKwlfX3UzMgkJcmVxaWQ7CisJX191OAkJcHJvdG87CisJX191OAkJbW9kZTsKKworCXN0cnVjdCB4dF9wb2xpY3lfc3BlYwltYXRjaDsKKwlzdHJ1Y3QgeHRfcG9saWN5X3NwZWMJaW52ZXJ0OworfTsKKworc3RydWN0IHh0X3BvbGljeV9pbmZvIHsKKwlzdHJ1Y3QgeHRfcG9saWN5X2VsZW0gcG9sW1hUX1BPTElDWV9NQVhfRUxFTV07CisJX191MTYgZmxhZ3M7CisJX191MTYgbGVuOworfTsKKworI2VuZGlmIC8qIF9YVF9QT0xJQ1lfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcXVvdGEuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3F1b3RhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxNDcyMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3F1b3RhLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfWFRfUVVPVEFfSAorI2RlZmluZSBfWFRfUVVPVEFfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSB4dF9xdW90YV9mbGFncyB7CisJWFRfUVVPVEFfSU5WRVJUCQk9IDB4MSwKK307CisjZGVmaW5lIFhUX1FVT1RBX01BU0sJCTB4MQorCitzdHJ1Y3QgeHRfcXVvdGFfcHJpdjsKKworc3RydWN0IHh0X3F1b3RhX2luZm8geworCV9fdTMyIGZsYWdzOworCV9fdTMyIHBhZDsKKwlfX2FsaWduZWRfdTY0IHF1b3RhOworCisJLyogVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBrZXJuZWwgKi8KKwlzdHJ1Y3QgeHRfcXVvdGFfcHJpdgkqbWFzdGVyOworfTsKKworI2VuZGlmIC8qIF9YVF9RVU9UQV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9yYXRlZXN0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9yYXRlZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwYTYxOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3JhdGVlc3QuaApAQCAtMCwwICsxLDM3IEBACisjaWZuZGVmIF9YVF9SQVRFRVNUX01BVENIX0gKKyNkZWZpbmUgX1hUX1JBVEVFU1RfTUFUQ0hfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSB4dF9yYXRlZXN0X21hdGNoX2ZsYWdzIHsKKwlYVF9SQVRFRVNUX01BVENIX0lOVkVSVAk9IDE8PDAsCisJWFRfUkFURUVTVF9NQVRDSF9BQlMJPSAxPDwxLAorCVhUX1JBVEVFU1RfTUFUQ0hfUkVMCT0gMTw8MiwKKwlYVF9SQVRFRVNUX01BVENIX0RFTFRBCT0gMTw8MywKKwlYVF9SQVRFRVNUX01BVENIX0JQUwk9IDE8PDQsCisJWFRfUkFURUVTVF9NQVRDSF9QUFMJPSAxPDw1LAorfTsKKworZW51bSB4dF9yYXRlZXN0X21hdGNoX21vZGUgeworCVhUX1JBVEVFU1RfTUFUQ0hfTk9ORSwKKwlYVF9SQVRFRVNUX01BVENIX0VRLAorCVhUX1JBVEVFU1RfTUFUQ0hfTFQsCisJWFRfUkFURUVTVF9NQVRDSF9HVCwKK307CisKK3N0cnVjdCB4dF9yYXRlZXN0X21hdGNoX2luZm8geworCWNoYXIJCQluYW1lMVtJRk5BTVNJWl07CisJY2hhcgkJCW5hbWUyW0lGTkFNU0laXTsKKwlfX3UxNgkJZmxhZ3M7CisJX191MTYJCW1vZGU7CisJX191MzIJCWJwczE7CisJX191MzIJCXBwczE7CisJX191MzIJCWJwczI7CisJX191MzIJCXBwczI7CisKKwkvKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGtlcm5lbCAqLworCXN0cnVjdCB4dF9yYXRlZXN0CSplc3QxIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwlzdHJ1Y3QgeHRfcmF0ZWVzdAkqZXN0MiBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7Cit9OworCisjZW5kaWYgLyogX1hUX1JBVEVFU1RfTUFUQ0hfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcmVhbG0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3JlYWxtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRhODJlZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3JlYWxtLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfWFRfUkVBTE1fSAorI2RlZmluZSBfWFRfUkVBTE1fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IHh0X3JlYWxtX2luZm8geworCV9fdTMyIGlkOworCV9fdTMyIG1hc2s7CisJX191OCBpbnZlcnQ7Cit9OworCisjZW5kaWYgLyogX1hUX1JFQUxNX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3JlY2VudC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcmVjZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzMThlMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3JlY2VudC5oCkBAIC0wLDAgKzEsMzUgQEAKKyNpZm5kZWYgX0xJTlVYX05FVEZJTFRFUl9YVF9SRUNFTlRfSAorI2RlZmluZSBfTElOVVhfTkVURklMVEVSX1hUX1JFQ0VOVF9IIDEKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2VudW0geworCVhUX1JFQ0VOVF9DSEVDSyAgICA9IDEgPDwgMCwKKwlYVF9SRUNFTlRfU0VUICAgICAgPSAxIDw8IDEsCisJWFRfUkVDRU5UX1VQREFURSAgID0gMSA8PCAyLAorCVhUX1JFQ0VOVF9SRU1PVkUgICA9IDEgPDwgMywKKwlYVF9SRUNFTlRfVFRMICAgICAgPSAxIDw8IDQsCisJWFRfUkVDRU5UX1JFQVAgICAgID0gMSA8PCA1LAorCisJWFRfUkVDRU5UX1NPVVJDRSAgID0gMCwKKwlYVF9SRUNFTlRfREVTVCAgICAgPSAxLAorCisJWFRfUkVDRU5UX05BTUVfTEVOID0gMjAwLAorfTsKKworLyogT25seSBhbGxvd2VkIHdpdGggLS1yY2hlY2sgYW5kIC0tdXBkYXRlICovCisjZGVmaW5lIFhUX1JFQ0VOVF9NT0RJRklFUlMgKFhUX1JFQ0VOVF9UVEx8WFRfUkVDRU5UX1JFQVApCisKKyNkZWZpbmUgWFRfUkVDRU5UX1ZBTElEX0ZMQUdTIChYVF9SRUNFTlRfQ0hFQ0t8WFRfUkVDRU5UX1NFVHxYVF9SRUNFTlRfVVBEQVRFfFwKKwkJCSAgICAgICBYVF9SRUNFTlRfUkVNT1ZFfFhUX1JFQ0VOVF9UVEx8WFRfUkVDRU5UX1JFQVApCisKK3N0cnVjdCB4dF9yZWNlbnRfbXRpbmZvIHsKKwlfX3UzMiBzZWNvbmRzOworCV9fdTMyIGhpdF9jb3VudDsKKwlfX3U4IGNoZWNrX3NldDsKKwlfX3U4IGludmVydDsKKwljaGFyIG5hbWVbWFRfUkVDRU5UX05BTUVfTEVOXTsKKwlfX3U4IHNpZGU7Cit9OworCisjZW5kaWYgLyogX0xJTlVYX05FVEZJTFRFUl9YVF9SRUNFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc2N0cC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc2N0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MDFlNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zY3RwLmgKQEAgLTAsMCArMSw5MiBAQAorI2lmbmRlZiBfWFRfU0NUUF9IXworI2RlZmluZSBfWFRfU0NUUF9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBYVF9TQ1RQX1NSQ19QT1JUUwkgICAgICAgIDB4MDEKKyNkZWZpbmUgWFRfU0NUUF9ERVNUX1BPUlRTCSAgICAgICAgMHgwMgorI2RlZmluZSBYVF9TQ1RQX0NIVU5LX1RZUEVTCQkweDA0CisKKyNkZWZpbmUgWFRfU0NUUF9WQUxJRF9GTEFHUwkJMHgwNworCitzdHJ1Y3QgeHRfc2N0cF9mbGFnX2luZm8geworCV9fdTggY2h1bmt0eXBlOworCV9fdTggZmxhZzsKKwlfX3U4IGZsYWdfbWFzazsKK307CisKKyNkZWZpbmUgWFRfTlVNX1NDVFBfRkxBR1MJNAorCitzdHJ1Y3QgeHRfc2N0cF9pbmZvIHsKKwlfX3UxNiBkcHRzWzJdOyAgLyogTWluLCBNYXggKi8KKwlfX3UxNiBzcHRzWzJdOyAgLyogTWluLCBNYXggKi8KKworCV9fdTMyIGNodW5rbWFwWzI1NiAvIHNpemVvZiAoX191MzIpXTsgIC8qIEJpdCBtYXNrIG9mIGNodW5rcyB0byBiZSBtYXRjaGVkIGFjY29yZGluZyB0byBSRkMgMjk2MCAqLworCisjZGVmaW5lIFNDVFBfQ0hVTktfTUFUQ0hfQU5ZICAgMHgwMSAgLyogTWF0Y2ggaWYgYW55IG9mIHRoZSBjaHVuayB0eXBlcyBhcmUgcHJlc2VudCAqLworI2RlZmluZSBTQ1RQX0NIVU5LX01BVENIX0FMTCAgIDB4MDIgIC8qIE1hdGNoIGlmIGFsbCBvZiB0aGUgY2h1bmsgdHlwZXMgYXJlIHByZXNlbnQgKi8KKyNkZWZpbmUgU0NUUF9DSFVOS19NQVRDSF9PTkxZICAweDA0ICAvKiBNYXRjaCBpZiB0aGVzZSBhcmUgdGhlIG9ubHkgY2h1bmsgdHlwZXMgcHJlc2VudCAqLworCisJX191MzIgY2h1bmtfbWF0Y2hfdHlwZTsKKwlzdHJ1Y3QgeHRfc2N0cF9mbGFnX2luZm8gZmxhZ19pbmZvW1hUX05VTV9TQ1RQX0ZMQUdTXTsKKwlpbnQgZmxhZ19jb3VudDsKKworCV9fdTMyIGZsYWdzOworCV9fdTMyIGludmZsYWdzOworfTsKKworI2RlZmluZSBieXRlcyh0eXBlKSAoc2l6ZW9mKHR5cGUpICogOCkKKworI2RlZmluZSBTQ1RQX0NIVU5LTUFQX1NFVChjaHVua21hcCwgdHlwZSkgCQlcCisJZG8geyAJCQkJCQlcCisJCShjaHVua21hcClbdHlwZSAvIGJ5dGVzKF9fdTMyKV0gfD0gCVwKKwkJCTEgPDwgKHR5cGUgJSBieXRlcyhfX3UzMikpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBTQ1RQX0NIVU5LTUFQX0NMRUFSKGNodW5rbWFwLCB0eXBlKQkJIAlcCisJZG8gewkJCQkJCQlcCisJCShjaHVua21hcClbdHlwZSAvIGJ5dGVzKF9fdTMyKV0gJj0gCQlcCisJCQl+KDEgPDwgKHR5cGUgJSBieXRlcyhfX3UzMikpKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9JU19TRVQoY2h1bmttYXAsIHR5cGUpIAkJCVwKKyh7CQkJCQkJCQlcCisJKChjaHVua21hcClbdHlwZSAvIGJ5dGVzIChfX3UzMildICYgCQlcCisJCSgxIDw8ICh0eXBlICUgYnl0ZXMgKF9fdTMyKSkpKSA/IDE6IDA7CVwKK30pCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9SRVNFVChjaHVua21hcCkgXAorCW1lbXNldCgoY2h1bmttYXApLCAwLCBzaXplb2YoY2h1bmttYXApKQorCisjZGVmaW5lIFNDVFBfQ0hVTktNQVBfU0VUX0FMTChjaHVua21hcCkgXAorCW1lbXNldCgoY2h1bmttYXApLCB+MFUsIHNpemVvZihjaHVua21hcCkpCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9DT1BZKGRlc3RtYXAsIHNyY21hcCkgXAorCW1lbWNweSgoZGVzdG1hcCksIChzcmNtYXApLCBzaXplb2Yoc3JjbWFwKSkKKworI2RlZmluZSBTQ1RQX0NIVU5LTUFQX0lTX0NMRUFSKGNodW5rbWFwKSBcCisJX19zY3RwX2NodW5rbWFwX2lzX2NsZWFyKChjaHVua21hcCksIEFSUkFZX1NJWkUoY2h1bmttYXApKQorc3RhdGljIF9faW5saW5lX18gYm9vbAorX19zY3RwX2NodW5rbWFwX2lzX2NsZWFyKGNvbnN0IF9fdTMyICpjaHVua21hcCwgdW5zaWduZWQgaW50IG4pCit7CisJdW5zaWduZWQgaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG47ICsraSkKKwkJaWYgKGNodW5rbWFwW2ldKQorCQkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorCisjZGVmaW5lIFNDVFBfQ0hVTktNQVBfSVNfQUxMX1NFVChjaHVua21hcCkgXAorCV9fc2N0cF9jaHVua21hcF9pc19hbGxfc2V0KChjaHVua21hcCksIEFSUkFZX1NJWkUoY2h1bmttYXApKQorc3RhdGljIF9faW5saW5lX18gYm9vbAorX19zY3RwX2NodW5rbWFwX2lzX2FsbF9zZXQoY29uc3QgX191MzIgKmNodW5rbWFwLCB1bnNpZ25lZCBpbnQgbikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQorCQlpZiAoY2h1bmttYXBbaV0gIT0gfjBVKQorCQkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorCisjZW5kaWYgLyogX1hUX1NDVFBfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc2V0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDQwNWFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc2V0LmgKQEAgLTAsMCArMSw2NSBAQAorI2lmbmRlZiBfWFRfU0VUX0gKKyNkZWZpbmUgX1hUX1NFVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXQuaD4KKworLyogUmV2aXNpb24gMCBpbnRlcmZhY2U6IGJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aCBuZXRmaWx0ZXIvaXB0YWJsZXMgKi8KKworLyoKKyAqIE9wdGlvbiBmbGFncyBmb3Iga2VybmVsIG9wZXJhdGlvbnMgKHh0X3NldF9pbmZvX3YwKQorICovCisjZGVmaW5lIElQU0VUX1NSQwkJMHgwMQkvKiBTb3VyY2UgbWF0Y2gvYWRkICovCisjZGVmaW5lIElQU0VUX0RTVAkJMHgwMgkvKiBEZXN0aW5hdGlvbiBtYXRjaC9hZGQgKi8KKyNkZWZpbmUgSVBTRVRfTUFUQ0hfSU5WCQkweDA0CS8qIEludmVyc2UgbWF0Y2hpbmcgKi8KKworc3RydWN0IHh0X3NldF9pbmZvX3YwIHsKKwlpcF9zZXRfaWRfdCBpbmRleDsKKwl1bmlvbiB7CisJCV9fdTMyIGZsYWdzW0lQU0VUX0RJTV9NQVggKyAxXTsKKwkJc3RydWN0IHsKKwkJCV9fdTMyIF9fZmxhZ3NbSVBTRVRfRElNX01BWF07CisJCQlfX3U4IGRpbTsKKwkJCV9fdTggZmxhZ3M7CisJCX0gY29tcGF0OworCX0gdTsKK307CisKKy8qIG1hdGNoIGFuZCB0YXJnZXQgaW5mb3MgKi8KK3N0cnVjdCB4dF9zZXRfaW5mb19tYXRjaF92MCB7CisJc3RydWN0IHh0X3NldF9pbmZvX3YwIG1hdGNoX3NldDsKK307CisKK3N0cnVjdCB4dF9zZXRfaW5mb190YXJnZXRfdjAgeworCXN0cnVjdCB4dF9zZXRfaW5mb192MCBhZGRfc2V0OworCXN0cnVjdCB4dF9zZXRfaW5mb192MCBkZWxfc2V0OworfTsKKworLyogUmV2aXNpb24gMSAgbWF0Y2ggYW5kIHRhcmdldCAqLworCitzdHJ1Y3QgeHRfc2V0X2luZm8geworCWlwX3NldF9pZF90IGluZGV4OworCV9fdTggZGltOworCV9fdTggZmxhZ3M7Cit9OworCisvKiBtYXRjaCBhbmQgdGFyZ2V0IGluZm9zICovCitzdHJ1Y3QgeHRfc2V0X2luZm9fbWF0Y2hfdjEgeworCXN0cnVjdCB4dF9zZXRfaW5mbyBtYXRjaF9zZXQ7Cit9OworCitzdHJ1Y3QgeHRfc2V0X2luZm9fdGFyZ2V0X3YxIHsKKwlzdHJ1Y3QgeHRfc2V0X2luZm8gYWRkX3NldDsKKwlzdHJ1Y3QgeHRfc2V0X2luZm8gZGVsX3NldDsKK307CisKKy8qIFJldmlzaW9uIDIgdGFyZ2V0ICovCisKK3N0cnVjdCB4dF9zZXRfaW5mb190YXJnZXRfdjIgeworCXN0cnVjdCB4dF9zZXRfaW5mbyBhZGRfc2V0OworCXN0cnVjdCB4dF9zZXRfaW5mbyBkZWxfc2V0OworCXUzMiBmbGFnczsKKwl1MzIgdGltZW91dDsKK307CisKKyNlbmRpZiAvKl9YVF9TRVRfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zb2NrZXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZDcyMTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zb2NrZXQuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIF9YVF9TT0NLRVRfSAorI2RlZmluZSBfWFRfU09DS0VUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2VudW0geworCVhUX1NPQ0tFVF9UUkFOU1BBUkVOVCA9IDEgPDwgMCwKK307CisKK3N0cnVjdCB4dF9zb2NrZXRfbXRpbmZvMSB7CisJX191OCBmbGFnczsKK307CisKKyNlbmRpZiAvKiBfWFRfU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3N0YXRlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMzJkZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zdGF0ZS5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX1hUX1NUQVRFX0gKKyNkZWZpbmUgX1hUX1NUQVRFX0gKKworI2RlZmluZSBYVF9TVEFURV9CSVQoY3RpbmZvKSAoMSA8PCAoKGN0aW5mbyklSVBfQ1RfSVNfUkVQTFkrMSkpCisjZGVmaW5lIFhUX1NUQVRFX0lOVkFMSUQgKDEgPDwgMCkKKworI2RlZmluZSBYVF9TVEFURV9VTlRSQUNLRUQgKDEgPDwgKElQX0NUX05VTUJFUiArIDEpKQorCitzdHJ1Y3QgeHRfc3RhdGVfaW5mbyB7CisJdW5zaWduZWQgaW50IHN0YXRlbWFzazsKK307CisjZW5kaWYgLypfWFRfU1RBVEVfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zdGF0aXN0aWMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3N0YXRpc3RpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOTgzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zdGF0aXN0aWMuaApAQCAtMCwwICsxLDM2IEBACisjaWZuZGVmIF9YVF9TVEFUSVNUSUNfSAorI2RlZmluZSBfWFRfU1RBVElTVElDX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2VudW0geHRfc3RhdGlzdGljX21vZGUgeworCVhUX1NUQVRJU1RJQ19NT0RFX1JBTkRPTSwKKwlYVF9TVEFUSVNUSUNfTU9ERV9OVEgsCisJX19YVF9TVEFUSVNUSUNfTU9ERV9NQVgKK307CisjZGVmaW5lIFhUX1NUQVRJU1RJQ19NT0RFX01BWCAoX19YVF9TVEFUSVNUSUNfTU9ERV9NQVggLSAxKQorCitlbnVtIHh0X3N0YXRpc3RpY19mbGFncyB7CisJWFRfU1RBVElTVElDX0lOVkVSVAkJPSAweDEsCit9OworI2RlZmluZSBYVF9TVEFUSVNUSUNfTUFTSwkJMHgxCisKK3N0cnVjdCB4dF9zdGF0aXN0aWNfcHJpdjsKKworc3RydWN0IHh0X3N0YXRpc3RpY19pbmZvIHsKKwlfX3UxNgkJCW1vZGU7CisJX191MTYJCQlmbGFnczsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3UzMglwcm9iYWJpbGl0eTsKKwkJfSByYW5kb207CisJCXN0cnVjdCB7CisJCQlfX3UzMglldmVyeTsKKwkJCV9fdTMyCXBhY2tldDsKKwkJCV9fdTMyCWNvdW50OyAvKiB1bnVzZWQgKi8KKwkJfSBudGg7CisJfSB1OworCXN0cnVjdCB4dF9zdGF0aXN0aWNfcHJpdiAqbWFzdGVyIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKK307CisKKyNlbmRpZiAvKiBfWFRfU1RBVElTVElDX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3N0cmluZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM1MzQ3YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3N0cmluZy5oCkBAIC0wLDAgKzEsMzQgQEAKKyNpZm5kZWYgX1hUX1NUUklOR19ICisjZGVmaW5lIF9YVF9TVFJJTkdfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBYVF9TVFJJTkdfTUFYX1BBVFRFUk5fU0laRSAxMjgKKyNkZWZpbmUgWFRfU1RSSU5HX01BWF9BTEdPX05BTUVfU0laRSAxNgorCitlbnVtIHsKKwlYVF9TVFJJTkdfRkxBR19JTlZFUlQJCT0gMHgwMSwKKwlYVF9TVFJJTkdfRkxBR19JR05PUkVDQVNFCT0gMHgwMgorfTsKKworc3RydWN0IHh0X3N0cmluZ19pbmZvIHsKKwlfX3UxNiBmcm9tX29mZnNldDsKKwlfX3UxNiB0b19vZmZzZXQ7CisJY2hhcgkgIGFsZ29bWFRfU1RSSU5HX01BWF9BTEdPX05BTUVfU0laRV07CisJY2hhciAJICBwYXR0ZXJuW1hUX1NUUklOR19NQVhfUEFUVEVSTl9TSVpFXTsKKwlfX3U4ICBwYXRsZW47CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191OCAgaW52ZXJ0OworCQl9IHYwOworCisJCXN0cnVjdCB7CisJCQlfX3U4ICBmbGFnczsKKwkJfSB2MTsKKwl9IHU7CisKKwkvKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGtlcm5lbCAqLworCXN0cnVjdCB0c19jb25maWcgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpICpjb25maWc7Cit9OworCisjZW5kaWYgLypfWFRfU1RSSU5HX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfdGNwbXNzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF90Y3Btc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmFjNTZiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfdGNwbXNzLmgKQEAgLTAsMCArMSwxMSBAQAorI2lmbmRlZiBfWFRfVENQTVNTX01BVENIX0gKKyNkZWZpbmUgX1hUX1RDUE1TU19NQVRDSF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgeHRfdGNwbXNzX21hdGNoX2luZm8geworICAgIF9fdTE2IG1zc19taW4sIG1zc19tYXg7CisgICAgX191OCBpbnZlcnQ7Cit9OworCisjZW5kaWYgLypfWFRfVENQTVNTX01BVENIX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfdGNwdWRwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF90Y3B1ZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGFhN2IzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfdGNwdWRwLmgKQEAgLTAsMCArMSwzNiBAQAorI2lmbmRlZiBfWFRfVENQVURQX0gKKyNkZWZpbmUgX1hUX1RDUFVEUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBUQ1AgbWF0Y2hpbmcgc3R1ZmYgKi8KK3N0cnVjdCB4dF90Y3AgeworCV9fdTE2IHNwdHNbMl07CQkJLyogU291cmNlIHBvcnQgcmFuZ2UuICovCisJX191MTYgZHB0c1syXTsJCQkvKiBEZXN0aW5hdGlvbiBwb3J0IHJhbmdlLiAqLworCV9fdTggb3B0aW9uOwkJCS8qIFRDUCBPcHRpb24gaWZmIG5vbi16ZXJvKi8KKwlfX3U4IGZsZ19tYXNrOwkJCS8qIFRDUCBmbGFncyBtYXNrIGJ5dGUgKi8KKwlfX3U4IGZsZ19jbXA7CQkJLyogVENQIGZsYWdzIGNvbXBhcmUgYnl0ZSAqLworCV9fdTggaW52ZmxhZ3M7CQkJLyogSW52ZXJzZSBmbGFncyAqLworfTsKKworLyogVmFsdWVzIGZvciAiaW52IiBmaWVsZCBpbiBzdHJ1Y3QgaXB0X3RjcC4gKi8KKyNkZWZpbmUgWFRfVENQX0lOVl9TUkNQVAkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2Ygc291cmNlIHBvcnRzLiAqLworI2RlZmluZSBYVF9UQ1BfSU5WX0RTVFBUCTB4MDIJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBkZXN0IHBvcnRzLiAqLworI2RlZmluZSBYVF9UQ1BfSU5WX0ZMQUdTCTB4MDQJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBUQ1AgZmxhZ3MuICovCisjZGVmaW5lIFhUX1RDUF9JTlZfT1BUSU9OCTB4MDgJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBvcHRpb24gdGVzdC4gKi8KKyNkZWZpbmUgWFRfVENQX0lOVl9NQVNLCQkweDBGCS8qIEFsbCBwb3NzaWJsZSBmbGFncy4gKi8KKworLyogVURQIG1hdGNoaW5nIHN0dWZmICovCitzdHJ1Y3QgeHRfdWRwIHsKKwlfX3UxNiBzcHRzWzJdOwkJCS8qIFNvdXJjZSBwb3J0IHJhbmdlLiAqLworCV9fdTE2IGRwdHNbMl07CQkJLyogRGVzdGluYXRpb24gcG9ydCByYW5nZS4gKi8KKwlfX3U4IGludmZsYWdzOwkJCS8qIEludmVyc2UgZmxhZ3MgKi8KK307CisKKy8qIFZhbHVlcyBmb3IgImludmZsYWdzIiBmaWVsZCBpbiBzdHJ1Y3QgaXB0X3VkcC4gKi8KKyNkZWZpbmUgWFRfVURQX0lOVl9TUkNQVAkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2Ygc291cmNlIHBvcnRzLiAqLworI2RlZmluZSBYVF9VRFBfSU5WX0RTVFBUCTB4MDIJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBkZXN0IHBvcnRzLiAqLworI2RlZmluZSBYVF9VRFBfSU5WX01BU0sJMHgwMwkvKiBBbGwgcG9zc2libGUgZmxhZ3MuICovCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF90aW1lLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF90aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MzN2ZhYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3RpbWUuaApAQCAtMCwwICsxLDI3IEBACisjaWZuZGVmIF9YVF9USU1FX0gKKyNkZWZpbmUgX1hUX1RJTUVfSCAxCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgeHRfdGltZV9pbmZvIHsKKwlfX3UzMiBkYXRlX3N0YXJ0OworCV9fdTMyIGRhdGVfc3RvcDsKKwlfX3UzMiBkYXl0aW1lX3N0YXJ0OworCV9fdTMyIGRheXRpbWVfc3RvcDsKKwlfX3UzMiBtb250aGRheXNfbWF0Y2g7CisJX191OCB3ZWVrZGF5c19tYXRjaDsKKwlfX3U4IGZsYWdzOworfTsKKworZW51bSB7CisJLyogTWF0Y2ggYWdhaW5zdCBsb2NhbCB0aW1lIChpbnN0ZWFkIG9mIFVUQykgKi8KKwlYVF9USU1FX0xPQ0FMX1RaID0gMSA8PCAwLAorCisJLyogU2hvcnRjdXRzICovCisJWFRfVElNRV9BTExfTU9OVEhEQVlTID0gMHhGRkZGRkZGRSwKKwlYVF9USU1FX0FMTF9XRUVLREFZUyAgPSAweEZFLAorCVhUX1RJTUVfTUlOX0RBWVRJTUUgICA9IDAsCisJWFRfVElNRV9NQVhfREFZVElNRSAgID0gMjQgKiA2MCAqIDYwIC0gMSwKK307CisKKyNlbmRpZiAvKiBfWFRfVElNRV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF91MzIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3UzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZDFiZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF91MzIuaApAQCAtMCwwICsxLDQyIEBACisjaWZuZGVmIF9YVF9VMzJfSAorI2RlZmluZSBfWFRfVTMyX0ggMQorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSB4dF91MzJfb3BzIHsKKwlYVF9VMzJfQU5ELAorCVhUX1UzMl9MRUZUU0gsCisJWFRfVTMyX1JJR0hUU0gsCisJWFRfVTMyX0FULAorfTsKKworc3RydWN0IHh0X3UzMl9sb2NhdGlvbl9lbGVtZW50IHsKKwlfX3UzMiBudW1iZXI7CisJX191OCBuZXh0b3A7Cit9OworCitzdHJ1Y3QgeHRfdTMyX3ZhbHVlX2VsZW1lbnQgeworCV9fdTMyIG1pbjsKKwlfX3UzMiBtYXg7Cit9OworCisvKgorICogQW55IHdheSB0byBhbGxvdyBmb3IgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBlbGVtZW50cz8KKyAqIEZvciBub3csIEkgc2V0dGxlIHdpdGggYSBsaW1pdCBvZiAxMCBlYWNoLgorICovCisjZGVmaW5lIFhUX1UzMl9NQVhTSVpFIDEwCisKK3N0cnVjdCB4dF91MzJfdGVzdCB7CisJc3RydWN0IHh0X3UzMl9sb2NhdGlvbl9lbGVtZW50IGxvY2F0aW9uW1hUX1UzMl9NQVhTSVpFKzFdOworCXN0cnVjdCB4dF91MzJfdmFsdWVfZWxlbWVudCB2YWx1ZVtYVF9VMzJfTUFYU0laRSsxXTsKKwlfX3U4IG5udW1zOworCV9fdTggbnZhbHVlczsKK307CisKK3N0cnVjdCB4dF91MzIgeworCXN0cnVjdCB4dF91MzJfdGVzdCB0ZXN0c1tYVF9VMzJfTUFYU0laRSsxXTsKKwlfX3U4IG50ZXN0czsKKwlfX3U4IGludmVydDsKK307CisKKyNlbmRpZiAvKiBfWFRfVTMyX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2FycC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYXJwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiYzZkZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2FycC5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX19MSU5VWF9BUlBfTkVURklMVEVSX0gKKyNkZWZpbmUgX19MSU5VWF9BUlBfTkVURklMVEVSX0gKKworLyogQVJQLXNwZWNpZmljIGRlZmluZXMgZm9yIG5ldGZpbHRlci4KKyAqIChDKTIwMDIgUnVzdHkgUnVzc2VsbCBJQk0gLS0gVGhpcyBjb2RlIGlzIEdQTC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisKKy8qIFRoZXJlIGlzIG5vIFBGX0FSUC4gKi8KKyNkZWZpbmUgTkZfQVJQCQkwCisKKy8qIEFSUCBIb29rcyAqLworI2RlZmluZSBORl9BUlBfSU4JMAorI2RlZmluZSBORl9BUlBfT1VUCTEKKyNkZWZpbmUgTkZfQVJQX0ZPUldBUkQJMgorI2RlZmluZSBORl9BUlBfTlVNSE9PS1MJMworCisjZW5kaWYgLyogX19MSU5VWF9BUlBfTkVURklMVEVSX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2FycC9hcnBfdGFibGVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9hcnAvYXJwX3RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMWVjNjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9hcnAvYXJwX3RhYmxlcy5oCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogCUZvcm1hdCBvZiBhbiBBUlAgZmlyZXdhbGwgZGVzY3JpcHRvcgorICoKKyAqIAlzcmMsIHRndCwgc3JjX21hc2ssIHRndF9tYXNrLCBhcnBvcCwgYXJwb3BfbWFzayBhcmUgYWx3YXlzIHN0b3JlZCBpbgorICoJbmV0d29yayBieXRlIG9yZGVyLgorICogCWZsYWdzIGFyZSBzdG9yZWQgaW4gaG9zdCBieXRlIG9yZGVyIChvZiBjb3Vyc2UpLgorICovCisKKyNpZm5kZWYgX0FSUFRBQkxFU19ICisjZGVmaW5lIF9BUlBUQUJMRVNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9hcnAuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorCisjZGVmaW5lIEFSUFRfRlVOQ1RJT05fTUFYTkFNRUxFTiBYVF9GVU5DVElPTl9NQVhOQU1FTEVOCisjZGVmaW5lIEFSUFRfVEFCTEVfTUFYTkFNRUxFTiBYVF9UQUJMRV9NQVhOQU1FTEVOCisjZGVmaW5lIGFycHRfZW50cnlfdGFyZ2V0IHh0X2VudHJ5X3RhcmdldAorI2RlZmluZSBhcnB0X3N0YW5kYXJkX3RhcmdldCB4dF9zdGFuZGFyZF90YXJnZXQKKyNkZWZpbmUgYXJwdF9lcnJvcl90YXJnZXQgeHRfZXJyb3JfdGFyZ2V0CisjZGVmaW5lIEFSUFRfQ09OVElOVUUgWFRfQ09OVElOVUUKKyNkZWZpbmUgQVJQVF9SRVRVUk4gWFRfUkVUVVJOCisjZGVmaW5lIGFycHRfY291bnRlcnNfaW5mbyB4dF9jb3VudGVyc19pbmZvCisjZGVmaW5lIGFycHRfY291bnRlcnMgeHRfY291bnRlcnMKKyNkZWZpbmUgQVJQVF9TVEFOREFSRF9UQVJHRVQgWFRfU1RBTkRBUkRfVEFSR0VUCisjZGVmaW5lIEFSUFRfRVJST1JfVEFSR0VUIFhUX0VSUk9SX1RBUkdFVAorI2RlZmluZSBBUlBUX0VOVFJZX0lURVJBVEUoZW50cmllcywgc2l6ZSwgZm4sIGFyZ3MuLi4pIFwKKwlYVF9FTlRSWV9JVEVSQVRFKHN0cnVjdCBhcnB0X2VudHJ5LCBlbnRyaWVzLCBzaXplLCBmbiwgIyMgYXJncykKKworI2RlZmluZSBBUlBUX0RFVl9BRERSX0xFTl9NQVggMTYKKworc3RydWN0IGFycHRfZGV2YWRkcl9pbmZvIHsKKwljaGFyIGFkZHJbQVJQVF9ERVZfQUREUl9MRU5fTUFYXTsKKwljaGFyIG1hc2tbQVJQVF9ERVZfQUREUl9MRU5fTUFYXTsKK307CisKKy8qIFllcywgVmlyZ2luaWEsIHlvdSBoYXZlIHRvIHplcm8gdGhlIHBhZGRpbmcuICovCitzdHJ1Y3QgYXJwdF9hcnAgeworCS8qIFNvdXJjZSBhbmQgdGFyZ2V0IElQIGFkZHIgKi8KKwlzdHJ1Y3QgaW5fYWRkciBzcmMsIHRndDsKKwkvKiBNYXNrIGZvciBzcmMgYW5kIHRhcmdldCBJUCBhZGRyICovCisJc3RydWN0IGluX2FkZHIgc21zaywgdG1zazsKKworCS8qIERldmljZSBodyBhZGRyZXNzIGxlbmd0aCwgc3JjK3RhcmdldCBkZXZpY2UgYWRkcmVzc2VzICovCisJX191OCBhcmhsbiwgYXJobG5fbWFzazsKKwlzdHJ1Y3QgYXJwdF9kZXZhZGRyX2luZm8gc3JjX2RldmFkZHI7CisJc3RydWN0IGFycHRfZGV2YWRkcl9pbmZvIHRndF9kZXZhZGRyOworCisJLyogQVJQIG9wZXJhdGlvbiBjb2RlLiAqLworCV9fYmUxNiBhcnBvcCwgYXJwb3BfbWFzazsKKworCS8qIEFSUCBoYXJkd2FyZSBhZGRyZXNzIGFuZCBwcm90b2NvbCBhZGRyZXNzIGZvcm1hdC4gKi8KKwlfX2JlMTYgYXJocmQsIGFyaHJkX21hc2s7CisJX19iZTE2IGFycHJvLCBhcnByb19tYXNrOworCisJLyogVGhlIHByb3RvY29sIGFkZHJlc3MgbGVuZ3RoIGlzIG9ubHkgYWNjZXB0ZWQgaWYgaXQgaXMgNAorCSAqIHNvIHRoZXJlIGlzIG5vIHVzZSBpbiBvZmZlcmluZyBhIHdheSB0byBkbyBmaWx0ZXJpbmcgb24gaXQuCisJICovCisKKwljaGFyIGluaWZhY2VbSUZOQU1TSVpdLCBvdXRpZmFjZVtJRk5BTVNJWl07CisJdW5zaWduZWQgY2hhciBpbmlmYWNlX21hc2tbSUZOQU1TSVpdLCBvdXRpZmFjZV9tYXNrW0lGTkFNU0laXTsKKworCS8qIEZsYWdzIHdvcmQgKi8KKwlfX3U4IGZsYWdzOworCS8qIEludmVyc2UgZmxhZ3MgKi8KKwlfX3UxNiBpbnZmbGFnczsKK307CisKKy8qIFZhbHVlcyBmb3IgImZsYWciIGZpZWxkIGluIHN0cnVjdCBhcnB0X2lwIChnZW5lcmFsIGFycCBzdHJ1Y3R1cmUpLgorICogTm8gZmxhZ3MgZGVmaW5lZCB5ZXQuCisgKi8KKyNkZWZpbmUgQVJQVF9GX01BU0sJCTB4MDAJLyogQWxsIHBvc3NpYmxlIGZsYWcgYml0cyBtYXNrLiAqLworCisvKiBWYWx1ZXMgZm9yICJpbnYiIGZpZWxkIGluIHN0cnVjdCBhcnB0X2FycC4gKi8KKyNkZWZpbmUgQVJQVF9JTlZfVklBX0lOCQkweDAwMDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBJTiBJRkFDRS4gKi8KKyNkZWZpbmUgQVJQVF9JTlZfVklBX09VVAkweDAwMDIJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBPVVQgSUZBQ0UgKi8KKyNkZWZpbmUgQVJQVF9JTlZfU1JDSVAJCTB4MDAwNAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIFNSQyBJUC4gKi8KKyNkZWZpbmUgQVJQVF9JTlZfVEdUSVAJCTB4MDAwOAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIFRHVCBJUC4gKi8KKyNkZWZpbmUgQVJQVF9JTlZfU1JDREVWQUREUgkweDAwMTAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBTUkMgREVWIEFERFIuICovCisjZGVmaW5lIEFSUFRfSU5WX1RHVERFVkFERFIJMHgwMDIwCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgVEdUIERFViBBRERSLiAqLworI2RlZmluZSBBUlBUX0lOVl9BUlBPUAkJMHgwMDQwCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgQVJQIE9QLiAqLworI2RlZmluZSBBUlBUX0lOVl9BUlBIUkQJCTB4MDA4MAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIEFSUCBIUkQuICovCisjZGVmaW5lIEFSUFRfSU5WX0FSUFBSTwkJMHgwMTAwCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgQVJQIFBSTy4gKi8KKyNkZWZpbmUgQVJQVF9JTlZfQVJQSExOCQkweDAyMDAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBBUlAgSExOLiAqLworI2RlZmluZSBBUlBUX0lOVl9NQVNLCQkweDAzRkYJLyogQWxsIHBvc3NpYmxlIGZsYWcgYml0cyBtYXNrLiAqLworCisvKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGVhY2ggb2YgdGhlIGZpcmV3YWxsIHJ1bGVzLiAgQ29uc2lzdHMgb2YgMworICAgcGFydHMgd2hpY2ggYXJlIDEpIGdlbmVyYWwgQVJQIGhlYWRlciBzdHVmZiAyKSBtYXRjaCBzcGVjaWZpYworICAgc3R1ZmYgMykgdGhlIHRhcmdldCB0byBwZXJmb3JtIGlmIHRoZSBydWxlIG1hdGNoZXMgKi8KK3N0cnVjdCBhcnB0X2VudHJ5Cit7CisJc3RydWN0IGFycHRfYXJwIGFycDsKKworCS8qIFNpemUgb2YgYXJwdF9lbnRyeSArIG1hdGNoZXMgKi8KKwlfX3UxNiB0YXJnZXRfb2Zmc2V0OworCS8qIFNpemUgb2YgYXJwdF9lbnRyeSArIG1hdGNoZXMgKyB0YXJnZXQgKi8KKwlfX3UxNiBuZXh0X29mZnNldDsKKworCS8qIEJhY2sgcG9pbnRlciAqLworCXVuc2lnbmVkIGludCBjb21lZnJvbTsKKworCS8qIFBhY2tldCBhbmQgYnl0ZSBjb3VudGVycy4gKi8KKwlzdHJ1Y3QgeHRfY291bnRlcnMgY291bnRlcnM7CisKKwkvKiBUaGUgbWF0Y2hlcyAoaWYgYW55KSwgdGhlbiB0aGUgdGFyZ2V0LiAqLworCXVuc2lnbmVkIGNoYXIgZWxlbXNbMF07Cit9OworCisvKgorICogTmV3IElQIGZpcmV3YWxsIG9wdGlvbnMgZm9yIFtnc11ldHNvY2tvcHQgYXQgdGhlIFJBVyBJUCBsZXZlbC4KKyAqIFVubGlrZSBCU0QgTGludXggaW5oZXJpdHMgSVAgb3B0aW9ucyBzbyB5b3UgZG9uJ3QgaGF2ZSB0byB1c2UgYSByYXcKKyAqIHNvY2tldCBmb3IgdGhpcy4gSW5zdGVhZCB3ZSBjaGVjayByaWdodHMgaW4gdGhlIGNhbGxzLgorICoKKyAqIEFUVEVOVElPTjogY2hlY2sgbGludXgvaW4uaCBiZWZvcmUgYWRkaW5nIG5ldyBudW1iZXIgaGVyZS4KKyAqLworI2RlZmluZSBBUlBUX0JBU0VfQ1RMCQk5NgorCisjZGVmaW5lIEFSUFRfU09fU0VUX1JFUExBQ0UJCShBUlBUX0JBU0VfQ1RMKQorI2RlZmluZSBBUlBUX1NPX1NFVF9BRERfQ09VTlRFUlMJKEFSUFRfQkFTRV9DVEwgKyAxKQorI2RlZmluZSBBUlBUX1NPX1NFVF9NQVgJCQlBUlBUX1NPX1NFVF9BRERfQ09VTlRFUlMKKworI2RlZmluZSBBUlBUX1NPX0dFVF9JTkZPCQkoQVJQVF9CQVNFX0NUTCkKKyNkZWZpbmUgQVJQVF9TT19HRVRfRU5UUklFUwkJKEFSUFRfQkFTRV9DVEwgKyAxKQorLyogI2RlZmluZSBBUlBUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAkoQVBSVF9CQVNFX0NUTCArIDIpICovCisjZGVmaW5lIEFSUFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAkoQVJQVF9CQVNFX0NUTCArIDMpCisjZGVmaW5lIEFSUFRfU09fR0VUX01BWAkJCShBUlBUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQpCisKKy8qIFRoZSBhcmd1bWVudCB0byBBUlBUX1NPX0dFVF9JTkZPICovCitzdHJ1Y3QgYXJwdF9nZXRpbmZvIHsKKwkvKiBXaGljaCB0YWJsZTogY2FsbGVyIGZpbGxzIHRoaXMgaW4uICovCisJY2hhciBuYW1lW1hUX1RBQkxFX01BWE5BTUVMRU5dOworCisJLyogS2VybmVsIGZpbGxzIHRoZXNlIGluLiAqLworCS8qIFdoaWNoIGhvb2sgZW50cnkgcG9pbnRzIGFyZSB2YWxpZDogYml0bWFzayAqLworCXVuc2lnbmVkIGludCB2YWxpZF9ob29rczsKKworCS8qIEhvb2sgZW50cnkgcG9pbnRzOiBvbmUgcGVyIG5ldGZpbHRlciBob29rLiAqLworCXVuc2lnbmVkIGludCBob29rX2VudHJ5W05GX0FSUF9OVU1IT09LU107CisKKwkvKiBVbmRlcmZsb3cgcG9pbnRzLiAqLworCXVuc2lnbmVkIGludCB1bmRlcmZsb3dbTkZfQVJQX05VTUhPT0tTXTsKKworCS8qIE51bWJlciBvZiBlbnRyaWVzICovCisJdW5zaWduZWQgaW50IG51bV9lbnRyaWVzOworCisJLyogU2l6ZSBvZiBlbnRyaWVzLiAqLworCXVuc2lnbmVkIGludCBzaXplOworfTsKKworLyogVGhlIGFyZ3VtZW50IHRvIEFSUFRfU09fU0VUX1JFUExBQ0UuICovCitzdHJ1Y3QgYXJwdF9yZXBsYWNlIHsKKwkvKiBXaGljaCB0YWJsZS4gKi8KKwljaGFyIG5hbWVbWFRfVEFCTEVfTUFYTkFNRUxFTl07CisKKwkvKiBXaGljaCBob29rIGVudHJ5IHBvaW50cyBhcmUgdmFsaWQ6IGJpdG1hc2suICBZb3UgY2FuJ3QKKyAgICAgICAgICAgY2hhbmdlIHRoaXMuICovCisJdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOworCisJLyogTnVtYmVyIG9mIGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2VudHJpZXM7CisKKwkvKiBUb3RhbCBzaXplIG9mIG5ldyBlbnRyaWVzICovCisJdW5zaWduZWQgaW50IHNpemU7CisKKwkvKiBIb29rIGVudHJ5IHBvaW50cy4gKi8KKwl1bnNpZ25lZCBpbnQgaG9va19lbnRyeVtORl9BUlBfTlVNSE9PS1NdOworCisJLyogVW5kZXJmbG93IHBvaW50cy4gKi8KKwl1bnNpZ25lZCBpbnQgdW5kZXJmbG93W05GX0FSUF9OVU1IT09LU107CisKKwkvKiBJbmZvcm1hdGlvbiBhYm91dCBvbGQgZW50cmllczogKi8KKwkvKiBOdW1iZXIgb2YgY291bnRlcnMgKG11c3QgYmUgZXF1YWwgdG8gY3VycmVudCBudW1iZXIgb2YgZW50cmllcykuICovCisJdW5zaWduZWQgaW50IG51bV9jb3VudGVyczsKKwkvKiBUaGUgb2xkIGVudHJpZXMnIGNvdW50ZXJzLiAqLworCXN0cnVjdCB4dF9jb3VudGVycyAqY291bnRlcnM7CisKKwkvKiBUaGUgZW50cmllcyAoaGFuZyBvZmYgZW5kOiBub3QgcmVhbGx5IGFuIGFycmF5KS4gKi8KKwlzdHJ1Y3QgYXJwdF9lbnRyeSBlbnRyaWVzWzBdOworfTsKKworLyogVGhlIGFyZ3VtZW50IHRvIEFSUFRfU09fR0VUX0VOVFJJRVMuICovCitzdHJ1Y3QgYXJwdF9nZXRfZW50cmllcyB7CisJLyogV2hpY2ggdGFibGU6IHVzZXIgZmlsbHMgdGhpcyBpbi4gKi8KKwljaGFyIG5hbWVbWFRfVEFCTEVfTUFYTkFNRUxFTl07CisKKwkvKiBVc2VyIGZpbGxzIHRoaXMgaW46IHRvdGFsIGVudHJ5IHNpemUuICovCisJdW5zaWduZWQgaW50IHNpemU7CisKKwkvKiBUaGUgZW50cmllcy4gKi8KKwlzdHJ1Y3QgYXJwdF9lbnRyeSBlbnRyeXRhYmxlWzBdOworfTsKKworLyogSGVscGVyIGZ1bmN0aW9ucyAqLworc3RhdGljIF9faW5saW5lX18gc3RydWN0IHh0X2VudHJ5X3RhcmdldCAqYXJwdF9nZXRfdGFyZ2V0KHN0cnVjdCBhcnB0X2VudHJ5ICplKQoreworCXJldHVybiAodm9pZCAqKWUgKyBlLT50YXJnZXRfb2Zmc2V0OworfQorCisvKgorICoJTWFpbiBmaXJld2FsbCBjaGFpbnMgZGVmaW5pdGlvbnMgYW5kIGdsb2JhbCB2YXIncyBkZWZpbml0aW9ucy4KKyAqLworI2VuZGlmIC8qIF9BUlBUQUJMRVNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYXJwL2FycHRfbWFuZ2xlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9hcnAvYXJwdF9tYW5nbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTBmNTAyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYXJwL2FycHRfbWFuZ2xlLmgKQEAgLTAsMCArMSwyNiBAQAorI2lmbmRlZiBfQVJQVF9NQU5HTEVfSAorI2RlZmluZSBfQVJQVF9NQU5HTEVfSAorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9hcnAvYXJwX3RhYmxlcy5oPgorCisjZGVmaW5lIEFSUFRfTUFOR0xFX0FERFJfTEVOX01BWCBzaXplb2Yoc3RydWN0IGluX2FkZHIpCitzdHJ1Y3QgYXJwdF9tYW5nbGUKK3sKKwljaGFyIHNyY19kZXZhZGRyW0FSUFRfREVWX0FERFJfTEVOX01BWF07CisJY2hhciB0Z3RfZGV2YWRkcltBUlBUX0RFVl9BRERSX0xFTl9NQVhdOworCXVuaW9uIHsKKwkJc3RydWN0IGluX2FkZHIgc3JjX2lwOworCX0gdV9zOworCXVuaW9uIHsKKwkJc3RydWN0IGluX2FkZHIgdGd0X2lwOworCX0gdV90OworCXVfaW50OF90IGZsYWdzOworCWludCB0YXJnZXQ7Cit9OworCisjZGVmaW5lIEFSUFRfTUFOR0xFX1NERVYgMHgwMQorI2RlZmluZSBBUlBUX01BTkdMRV9UREVWIDB4MDIKKyNkZWZpbmUgQVJQVF9NQU5HTEVfU0lQIDB4MDQKKyNkZWZpbmUgQVJQVF9NQU5HTEVfVElQIDB4MDgKKyNkZWZpbmUgQVJQVF9NQU5HTEVfTUFTSyAweDBmCisKKyNlbmRpZiAvKiBfQVJQVF9NQU5HTEVfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDk0ZWNjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlLmgKQEAgLTAsMCArMSwyNyBAQAorI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9ORVRGSUxURVJfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9ORVRGSUxURVJfSAorCisvKiBicmlkZ2Utc3BlY2lmaWMgZGVmaW5lcyBmb3IgbmV0ZmlsdGVyLiAKKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcHBwb3guaD4KKworLyogQnJpZGdlIEhvb2tzICovCisvKiBBZnRlciBwcm9taXNjIGRyb3BzLCBjaGVja3N1bSBjaGVja3MuICovCisjZGVmaW5lIE5GX0JSX1BSRV9ST1VUSU5HCTAKKy8qIElmIHRoZSBwYWNrZXQgaXMgZGVzdGluZWQgZm9yIHRoaXMgYm94LiAqLworI2RlZmluZSBORl9CUl9MT0NBTF9JTgkJMQorLyogSWYgdGhlIHBhY2tldCBpcyBkZXN0aW5lZCBmb3IgYW5vdGhlciBpbnRlcmZhY2UuICovCisjZGVmaW5lIE5GX0JSX0ZPUldBUkQJCTIKKy8qIFBhY2tldHMgY29taW5nIGZyb20gYSBsb2NhbCBwcm9jZXNzLiAqLworI2RlZmluZSBORl9CUl9MT0NBTF9PVVQJCTMKKy8qIFBhY2tldHMgYWJvdXQgdG8gaGl0IHRoZSB3aXJlLiAqLworI2RlZmluZSBORl9CUl9QT1NUX1JPVVRJTkcJNAorLyogTm90IHJlYWxseSBhIGhvb2ssIGJ1dCB1c2VkIGZvciB0aGUgZWJ0YWJsZXMgYnJvdXRlIHRhYmxlICovCisjZGVmaW5lIE5GX0JSX0JST1VUSU5HCQk1CisjZGVmaW5lIE5GX0JSX05VTUhPT0tTCQk2CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF84MDJfMy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF84MDJfMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2Njg3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0XzgwMl8zLmgKQEAgLTAsMCArMSw2MiBAQAorI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FQlRfODAyXzNfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfODAyXzNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBFQlRfODAyXzNfU0FQIDB4MDEKKyNkZWZpbmUgRUJUXzgwMl8zX1RZUEUgMHgwMgorCisjZGVmaW5lIEVCVF84MDJfM19NQVRDSCAiODAyXzMiCisKKy8qCisgKiBJZiBmcmFtZSBoYXMgRFNBUC9TU0FQIHZhbHVlIDB4YWEgeW91IG11c3QgY2hlY2sgdGhlIFNOQVAgdHlwZQorICogdG8gZGlzY292ZXIgd2hhdCBraW5kIG9mIHBhY2tldCB3ZSdyZSBjYXJyeWluZy4gCisgKi8KKyNkZWZpbmUgQ0hFQ0tfVFlQRSAweGFhCisKKy8qCisgKiBDb250cm9sIGZpZWxkIG1heSBiZSBvbmUgb3IgdHdvIGJ5dGVzLiAgSWYgdGhlIGZpcnN0IGJ5dGUgaGFzCisgKiB0aGUgdmFsdWUgMHgwMyB0aGVuIHRoZSBlbnRpcmUgbGVuZ3RoIGlzIG9uZSBieXRlLCBvdGhlcndpc2UgaXQgaXMgdHdvLgorICogT25lIGJ5dGUgY29udHJvbHMgYXJlIHVzZWQgaW4gVW5udW1iZXJlZCBJbmZvcm1hdGlvbiBmcmFtZXMuCisgKiBUd28gYnl0ZSBjb250cm9scyBhcmUgdXNlZCBpbiBOdW1iZXJlZCBJbmZvcm1hdGlvbiBmcmFtZXMuCisgKi8KKyNkZWZpbmUgSVNfVUkgMHgwMworCisjZGVmaW5lIEVCVF84MDJfM19NQVNLIChFQlRfODAyXzNfU0FQIHwgRUJUXzgwMl8zX1RZUEUgfCBFQlRfODAyXzMpCisKKy8qIHVpIGhhcyBvbmUgYnl0ZSBjdHJsLCBuaSBoYXMgdHdvICovCitzdHJ1Y3QgaGRyX3VpIHsKKwlfX3U4IGRzYXA7CisJX191OCBzc2FwOworCV9fdTggY3RybDsKKwlfX3U4IG9yaWdbM107CisJX19iZTE2IHR5cGU7Cit9OworCitzdHJ1Y3QgaGRyX25pIHsKKwlfX3U4IGRzYXA7CisJX191OCBzc2FwOworCV9fYmUxNiBjdHJsOworCV9fdTggIG9yaWdbM107CisJX19iZTE2IHR5cGU7Cit9OworCitzdHJ1Y3QgZWJ0XzgwMl8zX2hkciB7CisJX191OCAgZGFkZHJbNl07CisJX191OCAgc2FkZHJbNl07CisJX19iZTE2IGxlbjsKKwl1bmlvbiB7CisJCXN0cnVjdCBoZHJfdWkgdWk7CisJCXN0cnVjdCBoZHJfbmkgbmk7CisJfSBsbGM7Cit9OworCisKK3N0cnVjdCBlYnRfODAyXzNfaW5mbyB7CisJX191OCAgc2FwOworCV9fYmUxNiB0eXBlOworCV9fdTggIGJpdG1hc2s7CisJX191OCAgaW52ZmxhZ3M7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYW1vbmcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYW1vbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDRlM2FkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hbW9uZy5oCkBAIC0wLDAgKzEsNjQgQEAKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUJUX0FNT05HX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUJUX0FNT05HX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgRUJUX0FNT05HX0RTVCAweDAxCisjZGVmaW5lIEVCVF9BTU9OR19TUkMgMHgwMgorCisvKiBHcnplZ29yeiBCb3Jvd2lhayA8Z3J6ZXNAZ251LnVuaXYuZ2RhLnBsPiAyMDAzCisgKiAKKyAqIFdyaXRlLW9uY2UtcmVhZC1tYW55IGhhc2ggdGFibGUsIHVzZWQgZm9yIGNoZWNraW5nIGlmIGEgZ2l2ZW4KKyAqIE1BQyBhZGRyZXNzIGJlbG9uZ3MgdG8gYSBzZXQgb3Igbm90IGFuZCBwb3NzaWJseSBmb3IgY2hlY2tpbmcKKyAqIGlmIGl0IGlzIHJlbGF0ZWQgd2l0aCBhIGdpdmVuIElQdjQgYWRkcmVzcy4KKyAqCisgKiBUaGUgaGFzaCB2YWx1ZSBvZiBhbiBhZGRyZXNzIGlzIGl0cyBsYXN0IGJ5dGUuCisgKiAKKyAqIEluIHJlYWwtd29ybGQgZXRoZXJuZXQgYWRkcmVzc2VzLCB2YWx1ZXMgb2YgdGhlIGxhc3QgYnl0ZSBhcmUKKyAqIGV2ZW5seSBkaXN0cmlidXRlZCBhbmQgdGhlcmUgaXMgbm8gbmVlZCB0byBjb25zaWRlciBvdGhlciBieXRlcy4KKyAqIEl0IHdvdWxkIG9ubHkgc2xvdyB0aGUgcm91dGluZXMgZG93bi4KKyAqCisgKiBGb3IgTUFDIGFkZHJlc3MgY29tcGFyaXNvbiBzcGVlZHVwIHJlYXNvbnMsIHdlIGludHJvZHVjZSBhIHRyaWNrLgorICogTUFDIGFkZHJlc3MgaXMgbWFwcGVkIG9udG8gYW4gYXJyYXkgb2YgdHdvIDMyLWJpdCBpbnRlZ2Vycy4KKyAqIFRoaXMgcGFpciBvZiBpbnRlZ2VycyBpcyBjb21wYXJlZCB3aXRoIE1BQyBhZGRyZXNzZXMgaW4gdGhlCisgKiBoYXNoIHRhYmxlLCB3aGljaCBhcmUgc3RvcmVkIGFsc28gaW4gZm9ybSBvZiBwYWlycyBvZiBpbnRlZ2VycworICogKGluIGBjbXAnIGFycmF5KS4gVGhpcyBpcyBxdWljayBhcyBpdCByZXF1aXJlcyBvbmx5IHR3byBlbGVtZW50YXJ5CisgKiBudW1iZXIgY29tcGFyaXNvbnMgaW4gd29yc3QgY2FzZS4gRnVydGhlciwgd2UgdGFrZSBhZHZhbnRhZ2Ugb2YKKyAqIGZhY3QgdGhhdCBlbnRyb3B5IG9mIDMgbGFzdCBieXRlcyBvZiBhZGRyZXNzIGlzIGxhcmdlciB0aGFuIGVudHJvcHkKKyAqIG9mIDMgZmlyc3QgYnl0ZXMuIFNvIGZpcnN0IHdlIGNvbXBhcmUgNCBsYXN0IGJ5dGVzIG9mIGFkZHJlc3NlcyBhbmQKKyAqIGlmIHRoZXkgYXJlIHRoZSBzYW1lIHdlIGNvbXBhcmUgMiBmaXJzdC4KKyAqCisgKiBZZXMsIGl0IGlzIGEgbWVtb3J5IG92ZXJoZWFkLCBidXQgaW4gMjAwMyBBRCwgd2hvIGNhcmVzPworICovCisKK3N0cnVjdCBlYnRfbWFjX3dvcm1oYXNoX3R1cGxlIHsKKwlfX3UzMiBjbXBbMl07CisJX19iZTMyIGlwOworfTsKKworc3RydWN0IGVidF9tYWNfd29ybWhhc2ggeworCWludCB0YWJsZVsyNTddOworCWludCBwb29sc2l6ZTsKKwlzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaF90dXBsZSBwb29sWzBdOworfTsKKworI2RlZmluZSBlYnRfbWFjX3dvcm1oYXNoX3NpemUoeCkgKCh4KSA/IHNpemVvZihzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaCkgXAorCQkrICh4KS0+cG9vbHNpemUgKiBzaXplb2Yoc3RydWN0IGVidF9tYWNfd29ybWhhc2hfdHVwbGUpIDogMCkKKworc3RydWN0IGVidF9hbW9uZ19pbmZvIHsKKwlpbnQgd2hfZHN0X29mczsKKwlpbnQgd2hfc3JjX29mczsKKwlpbnQgYml0bWFzazsKK307CisKKyNkZWZpbmUgRUJUX0FNT05HX0RTVF9ORUcgMHgxCisjZGVmaW5lIEVCVF9BTU9OR19TUkNfTkVHIDB4MgorCisjZGVmaW5lIGVidF9hbW9uZ193aF9kc3QoeCkgKCh4KS0+d2hfZHN0X29mcyA/IFwKKwkoc3RydWN0IGVidF9tYWNfd29ybWhhc2gqKSgoY2hhciopKHgpICsgKHgpLT53aF9kc3Rfb2ZzKSA6IE5VTEwpCisjZGVmaW5lIGVidF9hbW9uZ193aF9zcmMoeCkgKCh4KS0+d2hfc3JjX29mcyA/IFwKKwkoc3RydWN0IGVidF9tYWNfd29ybWhhc2gqKSgoY2hhciopKHgpICsgKHgpLT53aF9zcmNfb2ZzKSA6IE5VTEwpCisKKyNkZWZpbmUgRUJUX0FNT05HX01BVENIICJhbW9uZyIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2FycC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hcnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjJmM2U0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hcnAuaApAQCAtMCwwICsxLDM2IEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9BUlBfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfQVJQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgRUJUX0FSUF9PUENPREUgMHgwMQorI2RlZmluZSBFQlRfQVJQX0hUWVBFIDB4MDIKKyNkZWZpbmUgRUJUX0FSUF9QVFlQRSAweDA0CisjZGVmaW5lIEVCVF9BUlBfU1JDX0lQIDB4MDgKKyNkZWZpbmUgRUJUX0FSUF9EU1RfSVAgMHgxMAorI2RlZmluZSBFQlRfQVJQX1NSQ19NQUMgMHgyMAorI2RlZmluZSBFQlRfQVJQX0RTVF9NQUMgMHg0MAorI2RlZmluZSBFQlRfQVJQX0dSQVQgMHg4MAorI2RlZmluZSBFQlRfQVJQX01BU0sgKEVCVF9BUlBfT1BDT0RFIHwgRUJUX0FSUF9IVFlQRSB8IEVCVF9BUlBfUFRZUEUgfCBcCisgICBFQlRfQVJQX1NSQ19JUCB8IEVCVF9BUlBfRFNUX0lQIHwgRUJUX0FSUF9TUkNfTUFDIHwgRUJUX0FSUF9EU1RfTUFDIHwgXAorICAgRUJUX0FSUF9HUkFUKQorI2RlZmluZSBFQlRfQVJQX01BVENIICJhcnAiCisKK3N0cnVjdCBlYnRfYXJwX2luZm8KK3sKKwlfX2JlMTYgaHR5cGU7CisJX19iZTE2IHB0eXBlOworCV9fYmUxNiBvcGNvZGU7CisJX19iZTMyIHNhZGRyOworCV9fYmUzMiBzbXNrOworCV9fYmUzMiBkYWRkcjsKKwlfX2JlMzIgZG1zazsKKwl1bnNpZ25lZCBjaGFyIHNtYWRkcltFVEhfQUxFTl07CisJdW5zaWduZWQgY2hhciBzbW1za1tFVEhfQUxFTl07CisJdW5zaWduZWQgY2hhciBkbWFkZHJbRVRIX0FMRU5dOworCXVuc2lnbmVkIGNoYXIgZG1tc2tbRVRIX0FMRU5dOworCV9fdTggIGJpdG1hc2s7CisJX191OCAgaW52ZmxhZ3M7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYXJwcmVwbHkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYXJwcmVwbHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTc3ODk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hcnByZXBseS5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUJUX0FSUFJFUExZX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUJUX0FSUFJFUExZX0gKKworc3RydWN0IGVidF9hcnByZXBseV9pbmZvIHsKKwl1bnNpZ25lZCBjaGFyIG1hY1tFVEhfQUxFTl07CisJaW50IHRhcmdldDsKK307CisjZGVmaW5lIEVCVF9BUlBSRVBMWV9UQVJHRVQgImFycHJlcGx5IgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfaXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGJiYzQxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9pcC5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiAgZWJ0X2lwCisgKgorICoJQXV0aG9yczoKKyAqCUJhcnQgRGUgU2NodXltZXIgPGJhcnQuZGUuc2NodXltZXJAcGFuZG9yYS5iZT4KKyAqCisgKiAgQXByaWwsIDIwMDIKKyAqCisgKiAgQ2hhbmdlczoKKyAqICAgIGFkZGVkIGlwLXNwb3J0IGFuZCBpcC1kcG9ydAorICogICAgSW5ub21pbmF0ZSBTZWN1cml0eSBUZWNobm9sb2dpZXMgQUcgPG1ob3BmQGlubm9taW5hdGUuY29tPgorICogICAgU2VwdGVtYmVyLCAyMDAyCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FQlRfSVBfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfSVBfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBFQlRfSVBfU09VUkNFIDB4MDEKKyNkZWZpbmUgRUJUX0lQX0RFU1QgMHgwMgorI2RlZmluZSBFQlRfSVBfVE9TIDB4MDQKKyNkZWZpbmUgRUJUX0lQX1BST1RPIDB4MDgKKyNkZWZpbmUgRUJUX0lQX1NQT1JUIDB4MTAKKyNkZWZpbmUgRUJUX0lQX0RQT1JUIDB4MjAKKyNkZWZpbmUgRUJUX0lQX01BU0sgKEVCVF9JUF9TT1VSQ0UgfCBFQlRfSVBfREVTVCB8IEVCVF9JUF9UT1MgfCBFQlRfSVBfUFJPVE8gfFwKKyBFQlRfSVBfU1BPUlQgfCBFQlRfSVBfRFBPUlQgKQorI2RlZmluZSBFQlRfSVBfTUFUQ0ggImlwIgorCisvKiB0aGUgc2FtZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHRoZSBpbnZmbGFncyAqLworc3RydWN0IGVidF9pcF9pbmZvIHsKKwlfX2JlMzIgc2FkZHI7CisJX19iZTMyIGRhZGRyOworCV9fYmUzMiBzbXNrOworCV9fYmUzMiBkbXNrOworCV9fdTggIHRvczsKKwlfX3U4ICBwcm90b2NvbDsKKwlfX3U4ICBiaXRtYXNrOworCV9fdTggIGludmZsYWdzOworCV9fdTE2IHNwb3J0WzJdOworCV9fdTE2IGRwb3J0WzJdOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2lwNi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9pcDYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmI4ODk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9pcDYuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogIGVidF9pcDYKKyAqCisgKglBdXRob3JzOgorICogS3VvLUxhbmcgVHNlbmcgPGt1by1sYW5nLnRzZW5nQGludGVsLmNvbT4KKyAqIE1hbm9oYXIgQ2FzdGVsaW5vIDxtYW5vaGFyLnIuY2FzdGVsaW5vQGludGVsLmNvbT4KKyAqCisgKiAgSmFuIDExLCAyMDA4CisgKgorICovCisKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUJUX0lQNl9ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VCVF9JUDZfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBFQlRfSVA2X1NPVVJDRSAweDAxCisjZGVmaW5lIEVCVF9JUDZfREVTVCAweDAyCisjZGVmaW5lIEVCVF9JUDZfVENMQVNTIDB4MDQKKyNkZWZpbmUgRUJUX0lQNl9QUk9UTyAweDA4CisjZGVmaW5lIEVCVF9JUDZfU1BPUlQgMHgxMAorI2RlZmluZSBFQlRfSVA2X0RQT1JUIDB4MjAKKyNkZWZpbmUgRUJUX0lQNl9JQ01QNiAweDQwCisKKyNkZWZpbmUgRUJUX0lQNl9NQVNLIChFQlRfSVA2X1NPVVJDRSB8IEVCVF9JUDZfREVTVCB8IEVCVF9JUDZfVENMQVNTIHxcCisJCSAgICAgIEVCVF9JUDZfUFJPVE8gfCBFQlRfSVA2X1NQT1JUIHwgRUJUX0lQNl9EUE9SVCB8IFwKKwkJICAgICAgRUJUX0lQNl9JQ01QNikKKyNkZWZpbmUgRUJUX0lQNl9NQVRDSCAiaXA2IgorCisvKiB0aGUgc2FtZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHRoZSBpbnZmbGFncyAqLworc3RydWN0IGVidF9pcDZfaW5mbyB7CisJc3RydWN0IGluNl9hZGRyIHNhZGRyOworCXN0cnVjdCBpbjZfYWRkciBkYWRkcjsKKwlzdHJ1Y3QgaW42X2FkZHIgc21zazsKKwlzdHJ1Y3QgaW42X2FkZHIgZG1zazsKKwlfX3U4ICB0Y2xhc3M7CisJX191OCAgcHJvdG9jb2w7CisJX191OCAgYml0bWFzazsKKwlfX3U4ICBpbnZmbGFnczsKKwl1bmlvbiB7CisJCV9fdTE2IHNwb3J0WzJdOworCQlfX3U4IGljbXB2Nl90eXBlWzJdOworCX07CisJdW5pb24geworCQlfX3UxNiBkcG9ydFsyXTsKKwkJX191OCBpY21wdjZfY29kZVsyXTsKKwl9OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2xpbWl0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2xpbWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZkODBiMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbGltaXQuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9MSU1JVF9ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VCVF9MSU1JVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEVCVF9MSU1JVF9NQVRDSCAibGltaXQiCisKKy8qIHRpbWluZ3MgYXJlIGluIG1pbGxpc2Vjb25kcy4gKi8KKyNkZWZpbmUgRUJUX0xJTUlUX1NDQUxFIDEwMDAwCisKKy8qIDEvMTAsMDAwIHNlYyBwZXJpb2QgPT4gbWF4IG9mIDEwLDAwMC9zZWMuICBNaW4gcmF0ZSBpcyB0aGVuIDQyOTQ5MAorICAgc2Vjb25kcywgb3Igb25lIGV2ZXJ5IDU5IGhvdXJzLiAqLworCitzdHJ1Y3QgZWJ0X2xpbWl0X2luZm8geworCV9fdTMyIGF2ZzsgICAgLyogQXZlcmFnZSBzZWNzIGJldHdlZW4gcGFja2V0cyAqIHNjYWxlICovCisJX191MzIgYnVyc3Q7ICAvKiBQZXJpb2QgbXVsdGlwbGllciBmb3IgdXBwZXIgbGltaXQuICovCisKKwkvKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGtlcm5lbCAqLworCXVuc2lnbmVkIGxvbmcgcHJldjsKKwlfX3UzMiBjcmVkaXQ7CisJX191MzIgY3JlZGl0X2NhcCwgY29zdDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9sb2cuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3ZjFkMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbG9nLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FQlRfTE9HX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUJUX0xPR19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEVCVF9MT0dfSVAgMHgwMSAvKiBpZiB0aGUgZnJhbWUgaXMgbWFkZSBieSBpcCwgbG9nIHRoZSBpcCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBFQlRfTE9HX0FSUCAweDAyCisjZGVmaW5lIEVCVF9MT0dfTkZMT0cgMHgwNAorI2RlZmluZSBFQlRfTE9HX0lQNiAweDA4CisjZGVmaW5lIEVCVF9MT0dfTUFTSyAoRUJUX0xPR19JUCB8IEVCVF9MT0dfQVJQIHwgRUJUX0xPR19JUDYpCisjZGVmaW5lIEVCVF9MT0dfUFJFRklYX1NJWkUgMzAKKyNkZWZpbmUgRUJUX0xPR19XQVRDSEVSICJsb2ciCisKK3N0cnVjdCBlYnRfbG9nX2luZm8geworCV9fdTggbG9nbGV2ZWw7CisJX191OCBwcmVmaXhbRUJUX0xPR19QUkVGSVhfU0laRV07CisJX191MzIgYml0bWFzazsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9tYXJrX20uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbWFya19tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEwZjllNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbWFya19tLmgKQEAgLTAsMCArMSwxNiBAQAorI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FQlRfTUFSS19NX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUJUX01BUktfTV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEVCVF9NQVJLX0FORCAweDAxCisjZGVmaW5lIEVCVF9NQVJLX09SIDB4MDIKKyNkZWZpbmUgRUJUX01BUktfTUFTSyAoRUJUX01BUktfQU5EIHwgRUJUX01BUktfT1IpCitzdHJ1Y3QgZWJ0X21hcmtfbV9pbmZvIHsKKwl1bnNpZ25lZCBsb25nIG1hcmssIG1hc2s7CisJX191OCBpbnZlcnQ7CisJX191OCBiaXRtYXNrOworfTsKKyNkZWZpbmUgRUJUX01BUktfTUFUQ0ggIm1hcmtfbSIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X21hcmtfdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9tYXJrX3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDVhMjY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9tYXJrX3QuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9NQVJLX1RfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfTUFSS19UX0gKKworLyogVGhlIHRhcmdldCBtZW1iZXIgaXMgcmV1c2VkIGZvciBhZGRpbmcgbmV3IGFjdGlvbnMsIHRoZQorICogdmFsdWUgb2YgdGhlIHJlYWwgdGFyZ2V0IGlzIC0xIHRvIC1OVU1fU1RBTkRBUkRfVEFSR0VUUy4KKyAqIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgNCBsc2IgKDIgd291bGQgYmUgZW5vdWdoLAorICogYnV0IGxldCdzIHBsYXkgaXQgc2FmZSkgYXJlIGtlcHQgdG8gZGVzaWduYXRlIHRoaXMgdGFyZ2V0LgorICogVGhlIHJlbWFpbmluZyBiaXRzIGRlc2lnbmF0ZSB0aGUgYWN0aW9uLiBCeSBtYWtpbmcgdGhlIHNldAorICogYWN0aW9uIDB4ZmZmZmZmZjAsIHRoZSByZXN1bHQgd2lsbCBsb29rIG9rIGZvciBvbGRlcgorICogdmVyc2lvbnMuIFtTZXB0ZW1iZXIgMjAwNl0gKi8KKyNkZWZpbmUgTUFSS19TRVRfVkFMVUUgKDB4ZmZmZmZmZjApCisjZGVmaW5lIE1BUktfT1JfVkFMVUUgICgweGZmZmZmZmUwKQorI2RlZmluZSBNQVJLX0FORF9WQUxVRSAoMHhmZmZmZmZkMCkKKyNkZWZpbmUgTUFSS19YT1JfVkFMVUUgKDB4ZmZmZmZmYzApCisKK3N0cnVjdCBlYnRfbWFya190X2luZm8geworCXVuc2lnbmVkIGxvbmcgbWFyazsKKwkvKiBFQlRfQUNDRVBULCBFQlRfRFJPUCwgRUJUX0NPTlRJTlVFIG9yIEVCVF9SRVRVUk4gKi8KKwlpbnQgdGFyZ2V0OworfTsKKyNkZWZpbmUgRUJUX01BUktfVEFSR0VUICJtYXJrIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbmF0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X25hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNzRlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X25hdC5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUJUX05BVF9ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VCVF9OQVRfSAorCisjZGVmaW5lIE5BVF9BUlBfQklUICAoMHgwMDAwMDAxMCkKK3N0cnVjdCBlYnRfbmF0X2luZm8geworCXVuc2lnbmVkIGNoYXIgbWFjW0VUSF9BTEVOXTsKKwkvKiBFQlRfQUNDRVBULCBFQlRfRFJPUCwgRUJUX0NPTlRJTlVFIG9yIEVCVF9SRVRVUk4gKi8KKwlpbnQgdGFyZ2V0OworfTsKKyNkZWZpbmUgRUJUX1NOQVRfVEFSR0VUICJzbmF0IgorI2RlZmluZSBFQlRfRE5BVF9UQVJHRVQgImRuYXQiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9uZmxvZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9uZmxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmODI5ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X25mbG9nLmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FQlRfTkZMT0dfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfTkZMT0dfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBFQlRfTkZMT0dfTUFTSyAweDAKKworI2RlZmluZSBFQlRfTkZMT0dfUFJFRklYX1NJWkUgNjQKKyNkZWZpbmUgRUJUX05GTE9HX1dBVENIRVIgIm5mbG9nIgorCisjZGVmaW5lIEVCVF9ORkxPR19ERUZBVUxUX0dST1VQCQkweDEKKyNkZWZpbmUgRUJUX05GTE9HX0RFRkFVTFRfVEhSRVNIT0xECTEKKworc3RydWN0IGVidF9uZmxvZ19pbmZvIHsKKwlfX3UzMiBsZW47CisJX191MTYgZ3JvdXA7CisJX191MTYgdGhyZXNob2xkOworCV9fdTE2IGZsYWdzOworCV9fdTE2IHBhZDsKKwljaGFyIHByZWZpeFtFQlRfTkZMT0dfUFJFRklYX1NJWkVdOworfTsKKworI2VuZGlmCQkJCS8qIF9fTElOVVhfQlJJREdFX0VCVF9ORkxPR19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3BrdHR5cGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfcGt0dHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNDFiYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3BrdHR5cGUuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9QS1RUWVBFX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUJUX1BLVFRZUEVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGVidF9wa3R0eXBlX2luZm8geworCV9fdTggcGt0X3R5cGU7CisJX191OCBpbnZlcnQ7Cit9OworI2RlZmluZSBFQlRfUEtUVFlQRV9NQVRDSCAicGt0dHlwZSIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3JlZGlyZWN0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3JlZGlyZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ5NjIyYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfcmVkaXJlY3QuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9SRURJUkVDVF9ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VCVF9SRURJUkVDVF9ICisKK3N0cnVjdCBlYnRfcmVkaXJlY3RfaW5mbyB7CisJLyogRUJUX0FDQ0VQVCwgRUJUX0RST1AsIEVCVF9DT05USU5VRSBvciBFQlRfUkVUVVJOICovCisJaW50IHRhcmdldDsKK307CisjZGVmaW5lIEVCVF9SRURJUkVDVF9UQVJHRVQgInJlZGlyZWN0IgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfc3RwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3N0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMjViOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3N0cC5oCkBAIC0wLDAgKzEsNDYgQEAKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUJUX1NUUF9ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VCVF9TVFBfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBFQlRfU1RQX1RZUEUJCTB4MDAwMQorCisjZGVmaW5lIEVCVF9TVFBfRkxBR1MJCTB4MDAwMgorI2RlZmluZSBFQlRfU1RQX1JPT1RQUklPCTB4MDAwNAorI2RlZmluZSBFQlRfU1RQX1JPT1RBRERSCTB4MDAwOAorI2RlZmluZSBFQlRfU1RQX1JPT1RDT1NUCTB4MDAxMAorI2RlZmluZSBFQlRfU1RQX1NFTkRFUlBSSU8JMHgwMDIwCisjZGVmaW5lIEVCVF9TVFBfU0VOREVSQUREUgkweDAwNDAKKyNkZWZpbmUgRUJUX1NUUF9QT1JUCQkweDAwODAKKyNkZWZpbmUgRUJUX1NUUF9NU0dBR0UJCTB4MDEwMAorI2RlZmluZSBFQlRfU1RQX01BWEFHRQkJMHgwMjAwCisjZGVmaW5lIEVCVF9TVFBfSEVMTE9USU1FCTB4MDQwMAorI2RlZmluZSBFQlRfU1RQX0ZXREQJCTB4MDgwMAorCisjZGVmaW5lIEVCVF9TVFBfTUFTSwkJMHgwZmZmCisjZGVmaW5lIEVCVF9TVFBfQ09ORklHX01BU0sJMHgwZmZlCisKKyNkZWZpbmUgRUJUX1NUUF9NQVRDSCAic3RwIgorCitzdHJ1Y3QgZWJ0X3N0cF9jb25maWdfaW5mbyB7CisJX191OCBmbGFnczsKKwlfX3UxNiByb290X3ByaW9sLCByb290X3ByaW91OworCWNoYXIgcm9vdF9hZGRyWzZdLCByb290X2FkZHJtc2tbNl07CisJX191MzIgcm9vdF9jb3N0bCwgcm9vdF9jb3N0dTsKKwlfX3UxNiBzZW5kZXJfcHJpb2wsIHNlbmRlcl9wcmlvdTsKKwljaGFyIHNlbmRlcl9hZGRyWzZdLCBzZW5kZXJfYWRkcm1za1s2XTsKKwlfX3UxNiBwb3J0bCwgcG9ydHU7CisJX191MTYgbXNnX2FnZWwsIG1zZ19hZ2V1OworCV9fdTE2IG1heF9hZ2VsLCBtYXhfYWdldTsKKwlfX3UxNiBoZWxsb190aW1lbCwgaGVsbG9fdGltZXU7CisJX191MTYgZm9yd2FyZF9kZWxheWwsIGZvcndhcmRfZGVsYXl1OworfTsKKworc3RydWN0IGVidF9zdHBfaW5mbyB7CisJX191OCB0eXBlOworCXN0cnVjdCBlYnRfc3RwX2NvbmZpZ19pbmZvIGNvbmZpZzsKKwlfX3UxNiBiaXRtYXNrOworCV9fdTE2IGludmZsYWdzOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3Vsb2cuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfdWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YTZiZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3Vsb2cuaApAQCAtMCwwICsxLDM4IEBACisjaWZuZGVmIF9FQlRfVUxPR19ICisjZGVmaW5lIF9FQlRfVUxPR19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEVCVF9VTE9HX0RFRkFVTFRfTkxHUk9VUCAwCisjZGVmaW5lIEVCVF9VTE9HX0RFRkFVTFRfUVRIUkVTSE9MRCAxCisjZGVmaW5lIEVCVF9VTE9HX01BWE5MR1JPVVBTIDMyIC8qIGhhcmRjb2RlZCBuZXRsaW5rIG1heCAqLworI2RlZmluZSBFQlRfVUxPR19QUkVGSVhfTEVOIDMyCisjZGVmaW5lIEVCVF9VTE9HX01BWF9RTEVOIDUwCisjZGVmaW5lIEVCVF9VTE9HX1dBVENIRVIgInVsb2ciCisjZGVmaW5lIEVCVF9VTE9HX1ZFUlNJT04gMQorCitzdHJ1Y3QgZWJ0X3Vsb2dfaW5mbyB7CisJX191MzIgbmxncm91cDsKKwl1bnNpZ25lZCBpbnQgY3ByYW5nZTsKKwl1bnNpZ25lZCBpbnQgcXRocmVzaG9sZDsKKwljaGFyIHByZWZpeFtFQlRfVUxPR19QUkVGSVhfTEVOXTsKK307CisKK3R5cGVkZWYgc3RydWN0IGVidF91bG9nX3BhY2tldF9tc2cgeworCWludCB2ZXJzaW9uOworCWNoYXIgaW5kZXZbSUZOQU1TSVpdOworCWNoYXIgb3V0ZGV2W0lGTkFNU0laXTsKKwljaGFyIHBoeXNpbmRldltJRk5BTVNJWl07CisJY2hhciBwaHlzb3V0ZGV2W0lGTkFNU0laXTsKKwljaGFyIHByZWZpeFtFQlRfVUxPR19QUkVGSVhfTEVOXTsKKwlzdHJ1Y3QgdGltZXZhbCBzdGFtcDsKKwl1bnNpZ25lZCBsb25nIG1hcms7CisJdW5zaWduZWQgaW50IGhvb2s7CisJc2l6ZV90IGRhdGFfbGVuOworCS8qIFRoZSBjb21wbGV0ZSBwYWNrZXQsIGluY2x1ZGluZyBFdGhlcm5ldCBoZWFkZXIgYW5kIHBlcmhhcHMKKwkgKiB0aGUgVkxBTiBoZWFkZXIgaXMgYXBwZW5kZWQgKi8KKwl1bnNpZ25lZCBjaGFyIGRhdGFbMF0gX19hdHRyaWJ1dGVfXworCSAgICAgICAgICAgICAgICAgICAgICAoKGFsaWduZWQgKF9fYWxpZ25vZl9fKHN0cnVjdCBlYnRfdWxvZ19pbmZvKSkpKTsKK30gZWJ0X3Vsb2dfcGFja2V0X21zZ190OworCisjZW5kaWYgLyogX0VCVF9VTE9HX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfdmxhbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF92bGFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3ZDFkNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfdmxhbi5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUJUX1ZMQU5fSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfVkxBTl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEVCVF9WTEFOX0lECTB4MDEKKyNkZWZpbmUgRUJUX1ZMQU5fUFJJTwkweDAyCisjZGVmaW5lIEVCVF9WTEFOX0VOQ0FQCTB4MDQKKyNkZWZpbmUgRUJUX1ZMQU5fTUFTSyAoRUJUX1ZMQU5fSUQgfCBFQlRfVkxBTl9QUklPIHwgRUJUX1ZMQU5fRU5DQVApCisjZGVmaW5lIEVCVF9WTEFOX01BVENIICJ2bGFuIgorCitzdHJ1Y3QgZWJ0X3ZsYW5faW5mbyB7CisJX191MTYgaWQ7CQkvKiBWTEFOIElEIHsxLTQwOTV9ICovCisJX191OCBwcmlvOwkJLyogVkxBTiBVc2VyIFByaW9yaXR5IHswLTd9ICovCisJX19iZTE2IGVuY2FwOwkJLyogVkxBTiBFbmNhcHN1bGF0ZWQgZnJhbWUgY29kZSB7MC02NTUzNX0gKi8KKwlfX3U4IGJpdG1hc2s7CQkvKiBBcmdzIGJpdG1hc2sgYml0IDE9MSAtIElEIGFyZywKKwkJCQkgICBiaXQgMj0xIFVzZXItUHJpb3JpdHkgYXJnLCBiaXQgMz0xIGVuY2FwKi8KKwlfX3U4IGludmZsYWdzOwkJLyogSW52ZXJzZSBiaXRtYXNrICBiaXQgMT0xIC0gaW52ZXJzZWQgSUQgYXJnLCAKKwkJCQkgICBiaXQgMj0xIC0gaW52ZXJzZWQgUGlyb3JpdHkgYXJnICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhNjQ0NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oCkBAIC0wLDAgKzEsMjY4IEBACisvKgorICogIGVidGFibGVzCisgKgorICoJQXV0aG9yczoKKyAqCUJhcnQgRGUgU2NodXltZXIJCTxiZHNjaHV5bUBwYW5kb3JhLmJlPgorICoKKyAqICBlYnRhYmxlcy5jLHYgMi4wLCBBcHJpbCwgMjAwMgorICoKKyAqICBUaGlzIGNvZGUgaXMgc3RvbmdseSBpbnNwaXJlZCBvbiB0aGUgaXB0YWJsZXMgY29kZSB3aGljaCBpcworICogIENvcHlyaWdodCAoQykgMTk5OSBQYXVsIGBSdXN0eScgUnVzc2VsbCAmIE1pY2hhZWwgSi4gTmV1bGluZworICovCisKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUZGX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUZGX0gKKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorCisjZGVmaW5lIEVCVF9UQUJMRV9NQVhOQU1FTEVOIDMyCisjZGVmaW5lIEVCVF9DSEFJTl9NQVhOQU1FTEVOIEVCVF9UQUJMRV9NQVhOQU1FTEVOCisjZGVmaW5lIEVCVF9GVU5DVElPTl9NQVhOQU1FTEVOIEVCVF9UQUJMRV9NQVhOQU1FTEVOCisKKy8qIHZlcmRpY3RzID4wIGFyZSAiYnJhbmNoZXMiICovCisjZGVmaW5lIEVCVF9BQ0NFUFQgICAtMQorI2RlZmluZSBFQlRfRFJPUCAgICAgLTIKKyNkZWZpbmUgRUJUX0NPTlRJTlVFIC0zCisjZGVmaW5lIEVCVF9SRVRVUk4gICAtNAorI2RlZmluZSBOVU1fU1RBTkRBUkRfVEFSR0VUUyAgIDQKKy8qIGVidGFibGVzIHRhcmdldCBtb2R1bGVzIHN0b3JlIHRoZSB2ZXJkaWN0IGluc2lkZSBhbiBpbnQuIFdlIGNhbgorICogcmVjbGFpbSBhIHBhcnQgb2YgdGhpcyBpbnQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmxlIGV4dGVuc2lvbnMuCisgKiBUaGUgNCBsc2IgYXJlIG1vcmUgdGhhbiBlbm91Z2ggdG8gc3RvcmUgdGhlIHZlcmRpY3QuICovCisjZGVmaW5lIEVCVF9WRVJESUNUX0JJVFMgMHgwMDAwMDAwRgorCitzdHJ1Y3QgeHRfbWF0Y2g7CitzdHJ1Y3QgeHRfdGFyZ2V0OworCitzdHJ1Y3QgZWJ0X2NvdW50ZXIgeworCXVpbnQ2NF90IHBjbnQ7CisJdWludDY0X3QgYmNudDsKK307CisKK3N0cnVjdCBlYnRfcmVwbGFjZSB7CisJY2hhciBuYW1lW0VCVF9UQUJMRV9NQVhOQU1FTEVOXTsKKwl1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3M7CisJLyogbnIgb2YgcnVsZXMgaW4gdGhlIHRhYmxlICovCisJdW5zaWduZWQgaW50IG5lbnRyaWVzOworCS8qIHRvdGFsIHNpemUgb2YgdGhlIGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQgZW50cmllc19zaXplOworCS8qIHN0YXJ0IG9mIHRoZSBjaGFpbnMgKi8KKwlzdHJ1Y3QgZWJ0X2VudHJpZXMgKmhvb2tfZW50cnlbTkZfQlJfTlVNSE9PS1NdOworCS8qIG5yIG9mIGNvdW50ZXJzIHVzZXJzcGFjZSBleHBlY3RzIGJhY2sgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzOworCS8qIHdoZXJlIHRoZSBrZXJuZWwgd2lsbCBwdXQgdGhlIG9sZCBjb3VudGVycyAqLworCXN0cnVjdCBlYnRfY291bnRlciAqY291bnRlcnM7CisJY2hhciAqZW50cmllczsKK307CisKK3N0cnVjdCBlYnRfcmVwbGFjZV9rZXJuZWwgeworCWNoYXIgbmFtZVtFQlRfVEFCTEVfTUFYTkFNRUxFTl07CisJdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOworCS8qIG5yIG9mIHJ1bGVzIGluIHRoZSB0YWJsZSAqLworCXVuc2lnbmVkIGludCBuZW50cmllczsKKwkvKiB0b3RhbCBzaXplIG9mIHRoZSBlbnRyaWVzICovCisJdW5zaWduZWQgaW50IGVudHJpZXNfc2l6ZTsKKwkvKiBzdGFydCBvZiB0aGUgY2hhaW5zICovCisJc3RydWN0IGVidF9lbnRyaWVzICpob29rX2VudHJ5W05GX0JSX05VTUhPT0tTXTsKKwkvKiBuciBvZiBjb3VudGVycyB1c2Vyc3BhY2UgZXhwZWN0cyBiYWNrICovCisJdW5zaWduZWQgaW50IG51bV9jb3VudGVyczsKKwkvKiB3aGVyZSB0aGUga2VybmVsIHdpbGwgcHV0IHRoZSBvbGQgY291bnRlcnMgKi8KKwlzdHJ1Y3QgZWJ0X2NvdW50ZXIgKmNvdW50ZXJzOworCWNoYXIgKmVudHJpZXM7Cit9OworCitzdHJ1Y3QgZWJ0X2VudHJpZXMgeworCS8qIHRoaXMgZmllbGQgaXMgYWx3YXlzIHNldCB0byB6ZXJvCisJICogU2VlIEVCVF9FTlRSWV9PUl9FTlRSSUVTLgorCSAqIE11c3QgYmUgc2FtZSBzaXplIGFzIGVidF9lbnRyeS5iaXRtYXNrICovCisJdW5zaWduZWQgaW50IGRpc3Rpbmd1aXNoZXI7CisJLyogdGhlIGNoYWluIG5hbWUgKi8KKwljaGFyIG5hbWVbRUJUX0NIQUlOX01BWE5BTUVMRU5dOworCS8qIGNvdW50ZXIgb2Zmc2V0IGZvciB0aGlzIGNoYWluICovCisJdW5zaWduZWQgaW50IGNvdW50ZXJfb2Zmc2V0OworCS8qIG9uZSBzdGFuZGFyZCAoYWNjZXB0LCBkcm9wLCByZXR1cm4pIHBlciBob29rICovCisJaW50IHBvbGljeTsKKwkvKiBuci4gb2YgZW50cmllcyAqLworCXVuc2lnbmVkIGludCBuZW50cmllczsKKwkvKiBlbnRyeSBsaXN0ICovCisJY2hhciBkYXRhWzBdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChfX2FsaWdub2ZfXyhzdHJ1Y3QgZWJ0X3JlcGxhY2UpKSkpOworfTsKKworLyogdXNlZCBmb3IgdGhlIGJpdG1hc2sgb2Ygc3RydWN0IGVidF9lbnRyeSAqLworCisvKiBUaGlzIGlzIGEgaGFjayB0byBtYWtlIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGFuIGVidF9lbnRyeSBzdHJ1Y3QgYW5kIGFuCisgKiBlYnRfZW50cmllcyBzdHJ1Y3Qgd2hlbiB0cmF2ZXJzaW5nIHRoZSBlbnRyaWVzIGZyb20gc3RhcnQgdG8gZW5kLgorICogVXNpbmcgdGhpcyBzaW1wbGlmaWVzIHRoZSBjb2RlIGEgbG90LCB3aGlsZSBzdGlsbCBiZWluZyBhYmxlIHRvIHVzZQorICogZWJ0X2VudHJpZXMuCisgKiBDb250cmFyeSwgaXB0YWJsZXMgZG9lc24ndCB1c2Ugc29tZXRoaW5nIGxpa2UgZWJ0X2VudHJpZXMgYW5kIHRoZXJlZm9yZSB1c2VzCisgKiBkaWZmZXJlbnQgdGVjaG5pcXVlcyBmb3IgbmFtaW5nIHRoZSBwb2xpY3kgYW5kIHN1Y2guIFNvLCBpcHRhYmxlcyBkb2Vzbid0CisgKiBuZWVkIGEgaGFjayBsaWtlIHRoaXMuCisgKi8KKyNkZWZpbmUgRUJUX0VOVFJZX09SX0VOVFJJRVMgMHgwMQorLyogdGhlc2UgYXJlIHRoZSBub3JtYWwgbWFza3MgKi8KKyNkZWZpbmUgRUJUX05PUFJPVE8gMHgwMgorI2RlZmluZSBFQlRfODAyXzMgMHgwNAorI2RlZmluZSBFQlRfU09VUkNFTUFDIDB4MDgKKyNkZWZpbmUgRUJUX0RFU1RNQUMgMHgxMAorI2RlZmluZSBFQlRfRl9NQVNLIChFQlRfTk9QUk9UTyB8IEVCVF84MDJfMyB8IEVCVF9TT1VSQ0VNQUMgfCBFQlRfREVTVE1BQyBcCisgICB8IEVCVF9FTlRSWV9PUl9FTlRSSUVTKQorCisjZGVmaW5lIEVCVF9JUFJPVE8gMHgwMQorI2RlZmluZSBFQlRfSUlOIDB4MDIKKyNkZWZpbmUgRUJUX0lPVVQgMHgwNAorI2RlZmluZSBFQlRfSVNPVVJDRSAweDgKKyNkZWZpbmUgRUJUX0lERVNUIDB4MTAKKyNkZWZpbmUgRUJUX0lMT0dJQ0FMSU4gMHgyMAorI2RlZmluZSBFQlRfSUxPR0lDQUxPVVQgMHg0MAorI2RlZmluZSBFQlRfSU5WX01BU0sgKEVCVF9JUFJPVE8gfCBFQlRfSUlOIHwgRUJUX0lPVVQgfCBFQlRfSUxPR0lDQUxJTiBcCisgICB8IEVCVF9JTE9HSUNBTE9VVCB8IEVCVF9JU09VUkNFIHwgRUJUX0lERVNUKQorCitzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoIHsKKwl1bmlvbiB7CisJCWNoYXIgbmFtZVtFQlRfRlVOQ1RJT05fTUFYTkFNRUxFTl07CisJCXN0cnVjdCB4dF9tYXRjaCAqbWF0Y2g7CisJfSB1OworCS8qIHNpemUgb2YgZGF0YSAqLworCXVuc2lnbmVkIGludCBtYXRjaF9zaXplOworCXVuc2lnbmVkIGNoYXIgZGF0YVswXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoX19hbGlnbm9mX18oc3RydWN0IGVidF9yZXBsYWNlKSkpKTsKK307CisKK3N0cnVjdCBlYnRfZW50cnlfd2F0Y2hlciB7CisJdW5pb24geworCQljaGFyIG5hbWVbRUJUX0ZVTkNUSU9OX01BWE5BTUVMRU5dOworCQlzdHJ1Y3QgeHRfdGFyZ2V0ICp3YXRjaGVyOworCX0gdTsKKwkvKiBzaXplIG9mIGRhdGEgKi8KKwl1bnNpZ25lZCBpbnQgd2F0Y2hlcl9zaXplOworCXVuc2lnbmVkIGNoYXIgZGF0YVswXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoX19hbGlnbm9mX18oc3RydWN0IGVidF9yZXBsYWNlKSkpKTsKK307CisKK3N0cnVjdCBlYnRfZW50cnlfdGFyZ2V0IHsKKwl1bmlvbiB7CisJCWNoYXIgbmFtZVtFQlRfRlVOQ1RJT05fTUFYTkFNRUxFTl07CisJCXN0cnVjdCB4dF90YXJnZXQgKnRhcmdldDsKKwl9IHU7CisJLyogc2l6ZSBvZiBkYXRhICovCisJdW5zaWduZWQgaW50IHRhcmdldF9zaXplOworCXVuc2lnbmVkIGNoYXIgZGF0YVswXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoX19hbGlnbm9mX18oc3RydWN0IGVidF9yZXBsYWNlKSkpKTsKK307CisKKyNkZWZpbmUgRUJUX1NUQU5EQVJEX1RBUkdFVCAic3RhbmRhcmQiCitzdHJ1Y3QgZWJ0X3N0YW5kYXJkX3RhcmdldCB7CisJc3RydWN0IGVidF9lbnRyeV90YXJnZXQgdGFyZ2V0OworCWludCB2ZXJkaWN0OworfTsKKworLyogb25lIGVudHJ5ICovCitzdHJ1Y3QgZWJ0X2VudHJ5IHsKKwkvKiB0aGlzIG5lZWRzIHRvIGJlIHRoZSBmaXJzdCBmaWVsZCAqLworCXVuc2lnbmVkIGludCBiaXRtYXNrOworCXVuc2lnbmVkIGludCBpbnZmbGFnczsKKwlfX2JlMTYgZXRocHJvdG87CisJLyogdGhlIHBoeXNpY2FsIGluLWRldiAqLworCWNoYXIgaW5bSUZOQU1TSVpdOworCS8qIHRoZSBsb2dpY2FsIGluLWRldiAqLworCWNoYXIgbG9naWNhbF9pbltJRk5BTVNJWl07CisJLyogdGhlIHBoeXNpY2FsIG91dC1kZXYgKi8KKwljaGFyIG91dFtJRk5BTVNJWl07CisJLyogdGhlIGxvZ2ljYWwgb3V0LWRldiAqLworCWNoYXIgbG9naWNhbF9vdXRbSUZOQU1TSVpdOworCXVuc2lnbmVkIGNoYXIgc291cmNlbWFjW0VUSF9BTEVOXTsKKwl1bnNpZ25lZCBjaGFyIHNvdXJjZW1za1tFVEhfQUxFTl07CisJdW5zaWduZWQgY2hhciBkZXN0bWFjW0VUSF9BTEVOXTsKKwl1bnNpZ25lZCBjaGFyIGRlc3Rtc2tbRVRIX0FMRU5dOworCS8qIHNpemVvZiBlYnRfZW50cnkgKyBtYXRjaGVzICovCisJdW5zaWduZWQgaW50IHdhdGNoZXJzX29mZnNldDsKKwkvKiBzaXplb2YgZWJ0X2VudHJ5ICsgbWF0Y2hlcyArIHdhdGNoZXJzICovCisJdW5zaWduZWQgaW50IHRhcmdldF9vZmZzZXQ7CisJLyogc2l6ZW9mIGVidF9lbnRyeSArIG1hdGNoZXMgKyB3YXRjaGVycyArIHRhcmdldCAqLworCXVuc2lnbmVkIGludCBuZXh0X29mZnNldDsKKwl1bnNpZ25lZCBjaGFyIGVsZW1zWzBdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChfX2FsaWdub2ZfXyhzdHJ1Y3QgZWJ0X3JlcGxhY2UpKSkpOworfTsKKworLyoge2csc31ldHNvY2tvcHQgbnVtYmVycyAqLworI2RlZmluZSBFQlRfQkFTRV9DVEwgICAgICAgICAgICAxMjgKKworI2RlZmluZSBFQlRfU09fU0VUX0VOVFJJRVMgICAgICAoRUJUX0JBU0VfQ1RMKQorI2RlZmluZSBFQlRfU09fU0VUX0NPVU5URVJTICAgICAoRUJUX1NPX1NFVF9FTlRSSUVTKzEpCisjZGVmaW5lIEVCVF9TT19TRVRfTUFYICAgICAgICAgIChFQlRfU09fU0VUX0NPVU5URVJTKzEpCisKKyNkZWZpbmUgRUJUX1NPX0dFVF9JTkZPICAgICAgICAgKEVCVF9CQVNFX0NUTCkKKyNkZWZpbmUgRUJUX1NPX0dFVF9FTlRSSUVTICAgICAgKEVCVF9TT19HRVRfSU5GTysxKQorI2RlZmluZSBFQlRfU09fR0VUX0lOSVRfSU5GTyAgICAoRUJUX1NPX0dFVF9FTlRSSUVTKzEpCisjZGVmaW5lIEVCVF9TT19HRVRfSU5JVF9FTlRSSUVTIChFQlRfU09fR0VUX0lOSVRfSU5GTysxKQorI2RlZmluZSBFQlRfU09fR0VUX01BWCAgICAgICAgICAoRUJUX1NPX0dFVF9JTklUX0VOVFJJRVMrMSkKKworCisvKiBibGF0ZW50bHkgc3RvbGVuIGZyb20gaXBfdGFibGVzLmgKKyAqIGZuIHJldHVybnMgMCB0byBjb250aW51ZSBpdGVyYXRpb24gKi8KKyNkZWZpbmUgRUJUX01BVENIX0lURVJBVEUoZSwgZm4sIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgIFwKKyh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl1bnNpZ25lZCBpbnQgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWludCBfX3JldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqX19tYXRjaDsgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWZvciAoX19pID0gc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnkpOyAgICAgICAgICAgICAgICBcCisJICAgICBfX2kgPCAoZSktPndhdGNoZXJzX29mZnNldDsgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIF9faSArPSBfX21hdGNoLT5tYXRjaF9zaXplICsgICAgICAgICAgICAgICAgICAgXAorCSAgICAgc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnlfbWF0Y2gpKSB7ICAgICAgICAgICAgICBcCisJCV9fbWF0Y2ggPSAodm9pZCAqKShlKSArIF9faTsgICAgICAgICAgICAgICAgXAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJX19yZXQgPSBmbihfX21hdGNoICwgIyMgYXJncyk7ICAgICAgICAgICAgICBcCisJCWlmIChfX3JldCAhPSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKF9fcmV0ID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKF9faSAhPSAoZSktPndhdGNoZXJzX29mZnNldCkgICAgICAgICAgICBcCisJCQlfX3JldCA9IC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworI2RlZmluZSBFQlRfV0FUQ0hFUl9JVEVSQVRFKGUsIGZuLCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgXAorKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXVuc2lnbmVkIGludCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaW50IF9fcmV0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIgKl9fd2F0Y2hlcjsgICAgICAgICAgICAgICAgXAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZm9yIChfX2kgPSBlLT53YXRjaGVyc19vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIF9faSA8IChlKS0+dGFyZ2V0X29mZnNldDsgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgX19pICs9IF9fd2F0Y2hlci0+d2F0Y2hlcl9zaXplICsgICAgICAgICAgICAgICBcCisJICAgICBzaXplb2Yoc3RydWN0IGVidF9lbnRyeV93YXRjaGVyKSkgeyAgICAgICAgICAgIFwKKwkJX193YXRjaGVyID0gKHZvaWQgKikoZSkgKyBfX2k7ICAgICAgICAgICAgICBcCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlfX3JldCA9IGZuKF9fd2F0Y2hlciAsICMjIGFyZ3MpOyAgICAgICAgICAgIFwKKwkJaWYgKF9fcmV0ICE9IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoX19yZXQgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoX19pICE9IChlKS0+dGFyZ2V0X29mZnNldCkgICAgICAgICAgICAgIFwKKwkJCV9fcmV0ID0gLUVJTlZBTDsgICAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9fcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorCisjZGVmaW5lIEVCVF9FTlRSWV9JVEVSQVRFKGVudHJpZXMsIHNpemUsIGZuLCBhcmdzLi4uKSAgICAgICBcCisoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJdW5zaWduZWQgaW50IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpbnQgX19yZXQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBlYnRfZW50cnkgKl9fZW50cnk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlmb3IgKF9faSA9IDA7IF9faSA8IChzaXplKTspIHsgICAgICAgICAgICAgICAgICAgICAgXAorCQlfX2VudHJ5ID0gKHZvaWQgKikoZW50cmllcykgKyBfX2k7ICAgICAgICAgIFwKKwkJX19yZXQgPSBmbihfX2VudHJ5ICwgIyMgYXJncyk7ICAgICAgICAgICAgICBcCisJCWlmIChfX3JldCAhPSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoX19lbnRyeS0+Yml0bWFzayAhPSAwKSAgICAgICAgICAgICAgICAgIFwKKwkJCV9faSArPSBfX2VudHJ5LT5uZXh0X29mZnNldDsgICAgICAgIFwKKwkJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlfX2kgKz0gc2l6ZW9mKHN0cnVjdCBlYnRfZW50cmllcyk7ICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoX19yZXQgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoX19pICE9IChzaXplKSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCV9fcmV0ID0gLUVJTlZBTDsgICAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9fcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2RlY25ldC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfZGVjbmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFlODBhOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2RlY25ldC5oCkBAIC0wLDAgKzEsNzUgQEAKKyNpZm5kZWYgX19MSU5VWF9ERUNORVRfTkVURklMVEVSX0gKKyNkZWZpbmUgX19MSU5VWF9ERUNORVRfTkVURklMVEVSX0gKKworLyogREVDbmV0LXNwZWNpZmljIGRlZmluZXMgZm9yIG5ldGZpbHRlci4gCisgKiBUaGlzIGZpbGUgKEMpIFN0ZXZlIFdoaXRlaG91c2UgMTk5OSBkZXJpdmVkIGZyb20gdGhlCisgKiBpcHY0IG5ldGZpbHRlciBoZWFkZXIgZmlsZSB3aGljaCBpcworICogKEMpMTk5OCBSdXN0eSBSdXNzZWxsIC0tIFRoaXMgY29kZSBpcyBHUEwuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorCisvKiBvbmx5IGZvciB1c2Vyc3BhY2UgY29tcGF0aWJpbGl0eSAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+IC8qIGZvciBJTlRfTUlOLCBJTlRfTUFYICovCisKKy8qIElQIENhY2hlIGJpdHMuICovCisvKiBTcmMgSVAgYWRkcmVzcy4gKi8KKyNkZWZpbmUgTkZDX0ROX1NSQwkJMHgwMDAxCisvKiBEZXN0IElQIGFkZHJlc3MuICovCisjZGVmaW5lIE5GQ19ETl9EU1QJCTB4MDAwMgorLyogSW5wdXQgZGV2aWNlLiAqLworI2RlZmluZSBORkNfRE5fSUZfSU4JCTB4MDAwNAorLyogT3V0cHV0IGRldmljZS4gKi8KKyNkZWZpbmUgTkZDX0ROX0lGX09VVAkJMHgwMDA4CisKKy8qIERFQ25ldCBIb29rcyAqLworLyogQWZ0ZXIgcHJvbWlzYyBkcm9wcywgY2hlY2tzdW0gY2hlY2tzLiAqLworI2RlZmluZSBORl9ETl9QUkVfUk9VVElORwkwCisvKiBJZiB0aGUgcGFja2V0IGlzIGRlc3RpbmVkIGZvciB0aGlzIGJveC4gKi8KKyNkZWZpbmUgTkZfRE5fTE9DQUxfSU4JCTEKKy8qIElmIHRoZSBwYWNrZXQgaXMgZGVzdGluZWQgZm9yIGFub3RoZXIgaW50ZXJmYWNlLiAqLworI2RlZmluZSBORl9ETl9GT1JXQVJECQkyCisvKiBQYWNrZXRzIGNvbWluZyBmcm9tIGEgbG9jYWwgcHJvY2Vzcy4gKi8KKyNkZWZpbmUgTkZfRE5fTE9DQUxfT1VUCQkzCisvKiBQYWNrZXRzIGFib3V0IHRvIGhpdCB0aGUgd2lyZS4gKi8KKyNkZWZpbmUgTkZfRE5fUE9TVF9ST1VUSU5HCTQKKy8qIElucHV0IEhlbGxvIFBhY2tldHMgKi8KKyNkZWZpbmUgTkZfRE5fSEVMTE8JCTUKKy8qIElucHV0IFJvdXRpbmcgUGFja2V0cyAqLworI2RlZmluZSBORl9ETl9ST1VURQkJNgorI2RlZmluZSBORl9ETl9OVU1IT09LUwkJNworCitlbnVtIG5mX2RuX2hvb2tfcHJpb3JpdGllcyB7CisJTkZfRE5fUFJJX0ZJUlNUID0gSU5UX01JTiwKKwlORl9ETl9QUklfQ09OTlRSQUNLID0gLTIwMCwKKwlORl9ETl9QUklfTUFOR0xFID0gLTE1MCwKKwlORl9ETl9QUklfTkFUX0RTVCA9IC0xMDAsCisJTkZfRE5fUFJJX0ZJTFRFUiA9IDAsCisJTkZfRE5fUFJJX05BVF9TUkMgPSAxMDAsCisJTkZfRE5fUFJJX0ROUlRNU0cgPSAyMDAsCisJTkZfRE5fUFJJX0xBU1QgPSBJTlRfTUFYLAorfTsKKworc3RydWN0IG5mX2RuX3J0bXNnIHsKKwlpbnQgbmZkbl9pZmluZGV4OworfTsKKworI2RlZmluZSBORkROX1JUTVNHKHIpICgodW5zaWduZWQgY2hhciAqKShyKSArIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmZfZG5fcnRtc2cpKSkKKworLyogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHVzZXJzcGFjZSAqLworI2RlZmluZSBETlJNR19MMV9HUk9VUCAweDAxCisjZGVmaW5lIEROUk1HX0wyX0dST1VQIDB4MDIKKworZW51bSB7CisJRE5STkdfTkxHUlBfTk9ORSwKKyNkZWZpbmUgRE5STkdfTkxHUlBfTk9ORQlETlJOR19OTEdSUF9OT05FCisJRE5STkdfTkxHUlBfTDEsCisjZGVmaW5lIEROUk5HX05MR1JQX0wxCQlETlJOR19OTEdSUF9MMQorCUROUk5HX05MR1JQX0wyLAorI2RlZmluZSBETlJOR19OTEdSUF9MMgkJRE5STkdfTkxHUlBfTDIKKwlfX0ROUk5HX05MR1JQX01BWAorfTsKKyNkZWZpbmUgRE5STkdfTkxHUlBfTUFYCShfX0ROUk5HX05MR1JQX01BWCAtIDEpCisKKyNlbmRpZiAvKl9fTElOVVhfREVDTkVUX05FVEZJTFRFUl9IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDkwMzA5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC5oCkBAIC0wLDAgKzEsNzggQEAKKyNpZm5kZWYgX19MSU5VWF9JUF9ORVRGSUxURVJfSAorI2RlZmluZSBfX0xJTlVYX0lQX05FVEZJTFRFUl9ICisKKy8qIElQdjQtc3BlY2lmaWMgZGVmaW5lcyBmb3IgbmV0ZmlsdGVyLiAKKyAqIChDKTE5OTggUnVzdHkgUnVzc2VsbCAtLSBUaGlzIGNvZGUgaXMgR1BMLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKworLyogb25seSBmb3IgdXNlcnNwYWNlIGNvbXBhdGliaWxpdHkgKi8KKworI2luY2x1ZGUgPGxpbWl0cy5oPiAvKiBmb3IgSU5UX01JTiwgSU5UX01BWCAqLworCisvKiBJUCBDYWNoZSBiaXRzLiAqLworLyogU3JjIElQIGFkZHJlc3MuICovCisjZGVmaW5lIE5GQ19JUF9TUkMJCTB4MDAwMQorLyogRGVzdCBJUCBhZGRyZXNzLiAqLworI2RlZmluZSBORkNfSVBfRFNUCQkweDAwMDIKKy8qIElucHV0IGRldmljZS4gKi8KKyNkZWZpbmUgTkZDX0lQX0lGX0lOCQkweDAwMDQKKy8qIE91dHB1dCBkZXZpY2UuICovCisjZGVmaW5lIE5GQ19JUF9JRl9PVVQJCTB4MDAwOAorLyogVE9TLiAqLworI2RlZmluZSBORkNfSVBfVE9TCQkweDAwMTAKKy8qIFByb3RvY29sLiAqLworI2RlZmluZSBORkNfSVBfUFJPVE8JCTB4MDAyMAorLyogSVAgb3B0aW9ucy4gKi8KKyNkZWZpbmUgTkZDX0lQX09QVElPTlMJCTB4MDA0MAorLyogRnJhZyAmIGZsYWdzLiAqLworI2RlZmluZSBORkNfSVBfRlJBRwkJMHgwMDgwCisKKy8qIFBlci1wcm90b2NvbCBpbmZvcm1hdGlvbjogb25seSBtYXR0ZXJzIGlmIHByb3RvIG1hdGNoLiAqLworLyogVENQIGZsYWdzLiAqLworI2RlZmluZSBORkNfSVBfVENQRkxBR1MJCTB4MDEwMAorLyogU291cmNlIHBvcnQuICovCisjZGVmaW5lIE5GQ19JUF9TUkNfUFQJCTB4MDIwMAorLyogRGVzdCBwb3J0LiAqLworI2RlZmluZSBORkNfSVBfRFNUX1BUCQkweDA0MDAKKy8qIFNvbWV0aGluZyBlbHNlIGFib3V0IHRoZSBwcm90byAqLworI2RlZmluZSBORkNfSVBfUFJPVE9fVU5LTk9XTgkweDIwMDAKKworLyogSVAgSG9va3MgKi8KKy8qIEFmdGVyIHByb21pc2MgZHJvcHMsIGNoZWNrc3VtIGNoZWNrcy4gKi8KKyNkZWZpbmUgTkZfSVBfUFJFX1JPVVRJTkcJMAorLyogSWYgdGhlIHBhY2tldCBpcyBkZXN0aW5lZCBmb3IgdGhpcyBib3guICovCisjZGVmaW5lIE5GX0lQX0xPQ0FMX0lOCQkxCisvKiBJZiB0aGUgcGFja2V0IGlzIGRlc3RpbmVkIGZvciBhbm90aGVyIGludGVyZmFjZS4gKi8KKyNkZWZpbmUgTkZfSVBfRk9SV0FSRAkJMgorLyogUGFja2V0cyBjb21pbmcgZnJvbSBhIGxvY2FsIHByb2Nlc3MuICovCisjZGVmaW5lIE5GX0lQX0xPQ0FMX09VVAkJMworLyogUGFja2V0cyBhYm91dCB0byBoaXQgdGhlIHdpcmUuICovCisjZGVmaW5lIE5GX0lQX1BPU1RfUk9VVElORwk0CisjZGVmaW5lIE5GX0lQX05VTUhPT0tTCQk1CisKK2VudW0gbmZfaXBfaG9va19wcmlvcml0aWVzIHsKKwlORl9JUF9QUklfRklSU1QgPSBJTlRfTUlOLAorCU5GX0lQX1BSSV9DT05OVFJBQ0tfREVGUkFHID0gLTQwMCwKKwlORl9JUF9QUklfUkFXID0gLTMwMCwKKwlORl9JUF9QUklfU0VMSU5VWF9GSVJTVCA9IC0yMjUsCisJTkZfSVBfUFJJX0NPTk5UUkFDSyA9IC0yMDAsCisJTkZfSVBfUFJJX01BTkdMRSA9IC0xNTAsCisJTkZfSVBfUFJJX05BVF9EU1QgPSAtMTAwLAorCU5GX0lQX1BSSV9GSUxURVIgPSAwLAorCU5GX0lQX1BSSV9TRUNVUklUWSA9IDUwLAorCU5GX0lQX1BSSV9OQVRfU1JDID0gMTAwLAorCU5GX0lQX1BSSV9TRUxJTlVYX0xBU1QgPSAyMjUsCisJTkZfSVBfUFJJX0NPTk5UUkFDS19DT05GSVJNID0gSU5UX01BWCwKKwlORl9JUF9QUklfTEFTVCA9IElOVF9NQVgsCit9OworCisvKiBBcmd1bWVudHMgZm9yIHNldHNvY2tvcHQgU09MX0lQOiAqLworLyogMi4wIGZpcmV3YWxsaW5nIHdlbnQgZnJvbSA2NCB0aHJvdWdoIDcxIChhbmQgKzI1NiwgKzUxMiwgZXRjKS4gKi8KKy8qIDIuMiBmaXJld2FsbGluZyAoKyBtYXNxKSB3ZW50IGZyb20gNjQgdGhyb3VnaCA3NiAqLworLyogMi40IGZpcmV3YWxsaW5nIHdlbnQgNjQgdGhyb3VnaCA2Ny4gKi8KKyNkZWZpbmUgU09fT1JJR0lOQUxfRFNUIDgwCisKKworI2VuZGlmIC8qX19MSU5VWF9JUF9ORVRGSUxURVJfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3F1ZXVlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3F1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUyMjliMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfcXVldWUuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogVGhpcyBpcyBhIG1vZHVsZSB3aGljaCBpcyB1c2VkIGZvciBxdWV1ZWluZyBJUHY0IHBhY2tldHMgYW5kCisgKiBjb21tdW5pY2F0aW5nIHdpdGggdXNlcnNwYWNlIHZpYSBuZXRsaW5rLgorICoKKyAqIChDKSAyMDAwIEphbWVzIE1vcnJpcywgdGhpcyBjb2RlIGlzIEdQTC4KKyAqLworI2lmbmRlZiBfSVBfUVVFVUVfSAorI2RlZmluZSBfSVBfUVVFVUVfSAorCisjaW5jbHVkZSA8bmV0L2lmLmg+CisKKy8qIE1lc3NhZ2VzIHNlbnQgZnJvbSBrZXJuZWwgKi8KK3R5cGVkZWYgc3RydWN0IGlwcV9wYWNrZXRfbXNnIHsKKwl1bnNpZ25lZCBsb25nIHBhY2tldF9pZDsJLyogSUQgb2YgcXVldWVkIHBhY2tldCAqLworCXVuc2lnbmVkIGxvbmcgbWFyazsJCS8qIE5ldGZpbHRlciBtYXJrIHZhbHVlICovCisJbG9uZyB0aW1lc3RhbXBfc2VjOwkJLyogUGFja2V0IGFycml2YWwgdGltZSAoc2Vjb25kcykgKi8KKwlsb25nIHRpbWVzdGFtcF91c2VjOwkJLyogUGFja2V0IGFycnZpYWwgdGltZSAoK3VzZWNvbmRzKSAqLworCXVuc2lnbmVkIGludCBob29rOwkJLyogTmV0ZmlsdGVyIGhvb2sgd2Ugcm9kZSBpbiBvbiAqLworCWNoYXIgaW5kZXZfbmFtZVtJRk5BTVNJWl07CS8qIE5hbWUgb2YgaW5jb21pbmcgaW50ZXJmYWNlICovCisJY2hhciBvdXRkZXZfbmFtZVtJRk5BTVNJWl07CS8qIE5hbWUgb2Ygb3V0Z29pbmcgaW50ZXJmYWNlICovCisJX19iZTE2IGh3X3Byb3RvY29sOwkJLyogSGFyZHdhcmUgcHJvdG9jb2wgKG5ldHdvcmsgb3JkZXIpICovCisJdW5zaWduZWQgc2hvcnQgaHdfdHlwZTsJCS8qIEhhcmR3YXJlIHR5cGUgKi8KKwl1bnNpZ25lZCBjaGFyIGh3X2FkZHJsZW47CS8qIEhhcmR3YXJlIGFkZHJlc3MgbGVuZ3RoICovCisJdW5zaWduZWQgY2hhciBod19hZGRyWzhdOwkvKiBIYXJkd2FyZSBhZGRyZXNzICovCisJc2l6ZV90IGRhdGFfbGVuOwkJLyogTGVuZ3RoIG9mIHBhY2tldCBkYXRhICovCisJdW5zaWduZWQgY2hhciBwYXlsb2FkWzBdOwkvKiBPcHRpb25hbCBwYWNrZXQgZGF0YSAqLworfSBpcHFfcGFja2V0X21zZ190OworCisvKiBNZXNzYWdlcyBzZW50IGZyb20gdXNlcnNwYWNlICovCit0eXBlZGVmIHN0cnVjdCBpcHFfbW9kZV9tc2cgeworCXVuc2lnbmVkIGNoYXIgdmFsdWU7CQkvKiBSZXF1ZXN0ZWQgbW9kZSAqLworCXNpemVfdCByYW5nZTsJCQkvKiBPcHRpb25hbCByYW5nZSBvZiBwYWNrZXQgcmVxdWVzdGVkICovCit9IGlwcV9tb2RlX21zZ190OworCit0eXBlZGVmIHN0cnVjdCBpcHFfdmVyZGljdF9tc2cgeworCXVuc2lnbmVkIGludCB2YWx1ZTsJCS8qIFZlcmRpY3QgdG8gaGFuZCB0byBuZXRmaWx0ZXIgKi8KKwl1bnNpZ25lZCBsb25nIGlkOwkJLyogUGFja2V0IElEIGZvciB0aGlzIHZlcmRpY3QgKi8KKwlzaXplX3QgZGF0YV9sZW47CQkvKiBMZW5ndGggb2YgcmVwbGFjZW1lbnQgZGF0YSAqLworCXVuc2lnbmVkIGNoYXIgcGF5bG9hZFswXTsJLyogT3B0aW9uYWwgcmVwbGFjZW1lbnQgcGFja2V0ICovCit9IGlwcV92ZXJkaWN0X21zZ190OworCit0eXBlZGVmIHN0cnVjdCBpcHFfcGVlcl9tc2cgeworCXVuaW9uIHsKKwkJaXBxX3ZlcmRpY3RfbXNnX3QgdmVyZGljdDsKKwkJaXBxX21vZGVfbXNnX3QgbW9kZTsKKwl9IG1zZzsKK30gaXBxX3BlZXJfbXNnX3Q7CisKKy8qIFBhY2tldCBkZWxpdmVyeSBtb2RlcyAqLworZW51bSB7CisJSVBRX0NPUFlfTk9ORSwJCS8qIEluaXRpYWwgbW9kZSwgcGFja2V0cyBhcmUgZHJvcHBlZCAqLworCUlQUV9DT1BZX01FVEEsCQkvKiBDb3B5IG1ldGFkYXRhICovCisJSVBRX0NPUFlfUEFDS0VUCQkvKiBDb3B5IG1ldGFkYXRhICsgcGFja2V0IChyYW5nZSkgKi8KK307CisjZGVmaW5lIElQUV9DT1BZX01BWCBJUFFfQ09QWV9QQUNLRVQKKworLyogVHlwZXMgb2YgbWVzc2FnZXMgKi8KKyNkZWZpbmUgSVBRTV9CQVNFCTB4MTAJLyogc3RhbmRhcmQgbmV0bGluayBtZXNzYWdlcyBiZWxvdyB0aGlzICovCisjZGVmaW5lIElQUU1fTU9ERQkoSVBRTV9CQVNFICsgMSkJCS8qIE1vZGUgcmVxdWVzdCBmcm9tIHBlZXIgKi8KKyNkZWZpbmUgSVBRTV9WRVJESUNUCShJUFFNX0JBU0UgKyAyKQkJLyogVmVyZGljdCBmcm9tIHBlZXIgKi8gCisjZGVmaW5lIElQUU1fUEFDS0VUCShJUFFNX0JBU0UgKyAzKQkJLyogUGFja2V0IGZyb20ga2VybmVsICovCisjZGVmaW5lIElQUU1fTUFYCShJUFFNX0JBU0UgKyA0KQorCisjZW5kaWYgLypfSVBfUVVFVUVfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODU0MmI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaApAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqIDI1LUp1bC0xOTk4IE1ham9yIGNoYW5nZXMgdG8gYWxsb3cgZm9yIGlwIGNoYWluIHRhYmxlCisgKgorICogMy1KYW4tMjAwMCBOYW1lZCB0YWJsZXMgdG8gYWxsb3cgcGFja2V0IHNlbGVjdGlvbiBmb3IgZGlmZmVyZW50IHVzZXMuCisgKi8KKworLyoKKyAqIAlGb3JtYXQgb2YgYW4gSVAgZmlyZXdhbGwgZGVzY3JpcHRvcgorICoKKyAqIAlzcmMsIGRzdCwgc3JjX21hc2ssIGRzdF9tYXNrIGFyZSBhbHdheXMgc3RvcmVkIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqIAlmbGFncyBhcmUgc3RvcmVkIGluIGhvc3QgYnl0ZSBvcmRlciAob2YgY291cnNlKS4KKyAqIAlQb3J0IG51bWJlcnMgYXJlIHN0b3JlZCBpbiBIT1NUIGJ5dGUgb3JkZXIuCisgKi8KKworI2lmbmRlZiBfSVBUQUJMRVNfSAorI2RlZmluZSBfSVBUQUJMRVNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKworI2RlZmluZSBJUFRfRlVOQ1RJT05fTUFYTkFNRUxFTiBYVF9GVU5DVElPTl9NQVhOQU1FTEVOCisjZGVmaW5lIElQVF9UQUJMRV9NQVhOQU1FTEVOIFhUX1RBQkxFX01BWE5BTUVMRU4KKyNkZWZpbmUgaXB0X21hdGNoIHh0X21hdGNoCisjZGVmaW5lIGlwdF90YXJnZXQgeHRfdGFyZ2V0CisjZGVmaW5lIGlwdF90YWJsZSB4dF90YWJsZQorI2RlZmluZSBpcHRfZ2V0X3JldmlzaW9uIHh0X2dldF9yZXZpc2lvbgorI2RlZmluZSBpcHRfZW50cnlfbWF0Y2ggeHRfZW50cnlfbWF0Y2gKKyNkZWZpbmUgaXB0X2VudHJ5X3RhcmdldCB4dF9lbnRyeV90YXJnZXQKKyNkZWZpbmUgaXB0X3N0YW5kYXJkX3RhcmdldCB4dF9zdGFuZGFyZF90YXJnZXQKKyNkZWZpbmUgaXB0X2Vycm9yX3RhcmdldCB4dF9lcnJvcl90YXJnZXQKKyNkZWZpbmUgaXB0X2NvdW50ZXJzIHh0X2NvdW50ZXJzCisjZGVmaW5lIElQVF9DT05USU5VRSBYVF9DT05USU5VRQorI2RlZmluZSBJUFRfUkVUVVJOIFhUX1JFVFVSTgorCisvKiBUaGlzIGdyb3VwIGlzIG9sZGVyIHRoYW4gb2xkIChpcHRhYmxlcyA8IHYxLjQuMC1yYzF+ODkpICovCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3RjcHVkcC5oPgorI2RlZmluZSBpcHRfdWRwIHh0X3VkcAorI2RlZmluZSBpcHRfdGNwIHh0X3RjcAorI2RlZmluZSBJUFRfVENQX0lOVl9TUkNQVAlYVF9UQ1BfSU5WX1NSQ1BUCisjZGVmaW5lIElQVF9UQ1BfSU5WX0RTVFBUCVhUX1RDUF9JTlZfRFNUUFQKKyNkZWZpbmUgSVBUX1RDUF9JTlZfRkxBR1MJWFRfVENQX0lOVl9GTEFHUworI2RlZmluZSBJUFRfVENQX0lOVl9PUFRJT04JWFRfVENQX0lOVl9PUFRJT04KKyNkZWZpbmUgSVBUX1RDUF9JTlZfTUFTSwlYVF9UQ1BfSU5WX01BU0sKKyNkZWZpbmUgSVBUX1VEUF9JTlZfU1JDUFQJWFRfVURQX0lOVl9TUkNQVAorI2RlZmluZSBJUFRfVURQX0lOVl9EU1RQVAlYVF9VRFBfSU5WX0RTVFBUCisjZGVmaW5lIElQVF9VRFBfSU5WX01BU0sJWFRfVURQX0lOVl9NQVNLCisKKy8qIFRoZSBhcmd1bWVudCB0byBJUFRfU09fQUREX0NPVU5URVJTLiAqLworI2RlZmluZSBpcHRfY291bnRlcnNfaW5mbyB4dF9jb3VudGVyc19pbmZvCisvKiBTdGFuZGFyZCByZXR1cm4gdmVyZGljdCwgb3IgZG8ganVtcC4gKi8KKyNkZWZpbmUgSVBUX1NUQU5EQVJEX1RBUkdFVCBYVF9TVEFOREFSRF9UQVJHRVQKKy8qIEVycm9yIHZlcmRpY3QuICovCisjZGVmaW5lIElQVF9FUlJPUl9UQVJHRVQgWFRfRVJST1JfVEFSR0VUCisKKy8qIGZuIHJldHVybnMgMCB0byBjb250aW51ZSBpdGVyYXRpb24gKi8KKyNkZWZpbmUgSVBUX01BVENIX0lURVJBVEUoZSwgZm4sIGFyZ3MuLi4pIFwKKwlYVF9NQVRDSF9JVEVSQVRFKHN0cnVjdCBpcHRfZW50cnksIGUsIGZuLCAjIyBhcmdzKQorCisvKiBmbiByZXR1cm5zIDAgdG8gY29udGludWUgaXRlcmF0aW9uICovCisjZGVmaW5lIElQVF9FTlRSWV9JVEVSQVRFKGVudHJpZXMsIHNpemUsIGZuLCBhcmdzLi4uKSBcCisJWFRfRU5UUllfSVRFUkFURShzdHJ1Y3QgaXB0X2VudHJ5LCBlbnRyaWVzLCBzaXplLCBmbiwgIyMgYXJncykKKworLyogWWVzLCBWaXJnaW5pYSwgeW91IGhhdmUgdG8gemVybyB0aGUgcGFkZGluZy4gKi8KK3N0cnVjdCBpcHRfaXAgeworCS8qIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gSVAgYWRkciAqLworCXN0cnVjdCBpbl9hZGRyIHNyYywgZHN0OworCS8qIE1hc2sgZm9yIHNyYyBhbmQgZGVzdCBJUCBhZGRyICovCisJc3RydWN0IGluX2FkZHIgc21zaywgZG1zazsKKwljaGFyIGluaWZhY2VbSUZOQU1TSVpdLCBvdXRpZmFjZVtJRk5BTVNJWl07CisJdW5zaWduZWQgY2hhciBpbmlmYWNlX21hc2tbSUZOQU1TSVpdLCBvdXRpZmFjZV9tYXNrW0lGTkFNU0laXTsKKworCS8qIFByb3RvY29sLCAwID0gQU5ZICovCisJX191MTYgcHJvdG87CisKKwkvKiBGbGFncyB3b3JkICovCisJX191OCBmbGFnczsKKwkvKiBJbnZlcnNlIGZsYWdzICovCisJX191OCBpbnZmbGFnczsKK307CisKKy8qIFZhbHVlcyBmb3IgImZsYWciIGZpZWxkIGluIHN0cnVjdCBpcHRfaXAgKGdlbmVyYWwgaXAgc3RydWN0dXJlKS4gKi8KKyNkZWZpbmUgSVBUX0ZfRlJBRwkJMHgwMQkvKiBTZXQgaWYgcnVsZSBpcyBhIGZyYWdtZW50IHJ1bGUgKi8KKyNkZWZpbmUgSVBUX0ZfR09UTwkJMHgwMgkvKiBTZXQgaWYganVtcCBpcyBhIGdvdG8gKi8KKyNkZWZpbmUgSVBUX0ZfTUFTSwkJMHgwMwkvKiBBbGwgcG9zc2libGUgZmxhZyBiaXRzIG1hc2suICovCisKKy8qIFZhbHVlcyBmb3IgImludiIgZmllbGQgaW4gc3RydWN0IGlwdF9pcC4gKi8KKyNkZWZpbmUgSVBUX0lOVl9WSUFfSU4JCTB4MDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBJTiBJRkFDRS4gKi8KKyNkZWZpbmUgSVBUX0lOVl9WSUFfT1VUCQkweDAyCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgT1VUIElGQUNFICovCisjZGVmaW5lIElQVF9JTlZfVE9TCQkweDA0CS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgVE9TLiAqLworI2RlZmluZSBJUFRfSU5WX1NSQ0lQCQkweDA4CS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgU1JDIElQLiAqLworI2RlZmluZSBJUFRfSU5WX0RTVElQCQkweDEwCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgRFNUIE9QLiAqLworI2RlZmluZSBJUFRfSU5WX0ZSQUcJCTB4MjAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBGUkFHLiAqLworI2RlZmluZSBJUFRfSU5WX1BST1RPCQlYVF9JTlZfUFJPVE8KKyNkZWZpbmUgSVBUX0lOVl9NQVNLCQkweDdGCS8qIEFsbCBwb3NzaWJsZSBmbGFnIGJpdHMgbWFzay4gKi8KKworLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBlYWNoIG9mIHRoZSBmaXJld2FsbCBydWxlcy4gIENvbnNpc3RzIG9mIDMKKyAgIHBhcnRzIHdoaWNoIGFyZSAxKSBnZW5lcmFsIElQIGhlYWRlciBzdHVmZiAyKSBtYXRjaCBzcGVjaWZpYworICAgc3R1ZmYgMykgdGhlIHRhcmdldCB0byBwZXJmb3JtIGlmIHRoZSBydWxlIG1hdGNoZXMgKi8KK3N0cnVjdCBpcHRfZW50cnkgeworCXN0cnVjdCBpcHRfaXAgaXA7CisKKwkvKiBNYXJrIHdpdGggZmllbGRzIHRoYXQgd2UgY2FyZSBhYm91dC4gKi8KKwl1bnNpZ25lZCBpbnQgbmZjYWNoZTsKKworCS8qIFNpemUgb2YgaXB0X2VudHJ5ICsgbWF0Y2hlcyAqLworCV9fdTE2IHRhcmdldF9vZmZzZXQ7CisJLyogU2l6ZSBvZiBpcHRfZW50cnkgKyBtYXRjaGVzICsgdGFyZ2V0ICovCisJX191MTYgbmV4dF9vZmZzZXQ7CisKKwkvKiBCYWNrIHBvaW50ZXIgKi8KKwl1bnNpZ25lZCBpbnQgY29tZWZyb207CisKKwkvKiBQYWNrZXQgYW5kIGJ5dGUgY291bnRlcnMuICovCisJc3RydWN0IHh0X2NvdW50ZXJzIGNvdW50ZXJzOworCisJLyogVGhlIG1hdGNoZXMgKGlmIGFueSksIHRoZW4gdGhlIHRhcmdldC4gKi8KKwl1bnNpZ25lZCBjaGFyIGVsZW1zWzBdOworfTsKKworLyoKKyAqIE5ldyBJUCBmaXJld2FsbCBvcHRpb25zIGZvciBbZ3NdZXRzb2Nrb3B0IGF0IHRoZSBSQVcgSVAgbGV2ZWwuCisgKiBVbmxpa2UgQlNEIExpbnV4IGluaGVyaXRzIElQIG9wdGlvbnMgc28geW91IGRvbid0IGhhdmUgdG8gdXNlIGEgcmF3CisgKiBzb2NrZXQgZm9yIHRoaXMuIEluc3RlYWQgd2UgY2hlY2sgcmlnaHRzIGluIHRoZSBjYWxscy4KKyAqCisgKiBBVFRFTlRJT046IGNoZWNrIGxpbnV4L2luLmggYmVmb3JlIGFkZGluZyBuZXcgbnVtYmVyIGhlcmUuCisgKi8KKyNkZWZpbmUgSVBUX0JBU0VfQ1RMCQk2NAorCisjZGVmaW5lIElQVF9TT19TRVRfUkVQTEFDRQkoSVBUX0JBU0VfQ1RMKQorI2RlZmluZSBJUFRfU09fU0VUX0FERF9DT1VOVEVSUwkoSVBUX0JBU0VfQ1RMICsgMSkKKyNkZWZpbmUgSVBUX1NPX1NFVF9NQVgJCUlQVF9TT19TRVRfQUREX0NPVU5URVJTCisKKyNkZWZpbmUgSVBUX1NPX0dFVF9JTkZPCQkJKElQVF9CQVNFX0NUTCkKKyNkZWZpbmUgSVBUX1NPX0dFVF9FTlRSSUVTCQkoSVBUX0JBU0VfQ1RMICsgMSkKKyNkZWZpbmUgSVBUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAkoSVBUX0JBU0VfQ1RMICsgMikKKyNkZWZpbmUgSVBUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQJKElQVF9CQVNFX0NUTCArIDMpCisjZGVmaW5lIElQVF9TT19HRVRfTUFYCQkJSVBUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQKKworLyogSUNNUCBtYXRjaGluZyBzdHVmZiAqLworc3RydWN0IGlwdF9pY21wIHsKKwlfX3U4IHR5cGU7CQkJCS8qIHR5cGUgdG8gbWF0Y2ggKi8KKwlfX3U4IGNvZGVbMl07CQkJCS8qIHJhbmdlIG9mIGNvZGUgKi8KKwlfX3U4IGludmZsYWdzOwkJCQkvKiBJbnZlcnNlIGZsYWdzICovCit9OworCisvKiBWYWx1ZXMgZm9yICJpbnYiIGZpZWxkIGZvciBzdHJ1Y3QgaXB0X2ljbXAuICovCisjZGVmaW5lIElQVF9JQ01QX0lOVgkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgdHlwZS9jb2RlIHRlc3QgKi8KKworLyogVGhlIGFyZ3VtZW50IHRvIElQVF9TT19HRVRfSU5GTyAqLworc3RydWN0IGlwdF9nZXRpbmZvIHsKKwkvKiBXaGljaCB0YWJsZTogY2FsbGVyIGZpbGxzIHRoaXMgaW4uICovCisJY2hhciBuYW1lW1hUX1RBQkxFX01BWE5BTUVMRU5dOworCisJLyogS2VybmVsIGZpbGxzIHRoZXNlIGluLiAqLworCS8qIFdoaWNoIGhvb2sgZW50cnkgcG9pbnRzIGFyZSB2YWxpZDogYml0bWFzayAqLworCXVuc2lnbmVkIGludCB2YWxpZF9ob29rczsKKworCS8qIEhvb2sgZW50cnkgcG9pbnRzOiBvbmUgcGVyIG5ldGZpbHRlciBob29rLiAqLworCXVuc2lnbmVkIGludCBob29rX2VudHJ5W05GX0lORVRfTlVNSE9PS1NdOworCisJLyogVW5kZXJmbG93IHBvaW50cy4gKi8KKwl1bnNpZ25lZCBpbnQgdW5kZXJmbG93W05GX0lORVRfTlVNSE9PS1NdOworCisJLyogTnVtYmVyIG9mIGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2VudHJpZXM7CisKKwkvKiBTaXplIG9mIGVudHJpZXMuICovCisJdW5zaWduZWQgaW50IHNpemU7Cit9OworCisvKiBUaGUgYXJndW1lbnQgdG8gSVBUX1NPX1NFVF9SRVBMQUNFLiAqLworc3RydWN0IGlwdF9yZXBsYWNlIHsKKwkvKiBXaGljaCB0YWJsZS4gKi8KKwljaGFyIG5hbWVbWFRfVEFCTEVfTUFYTkFNRUxFTl07CisKKwkvKiBXaGljaCBob29rIGVudHJ5IHBvaW50cyBhcmUgdmFsaWQ6IGJpdG1hc2suICBZb3UgY2FuJ3QKKyAgICAgICAgICAgY2hhbmdlIHRoaXMuICovCisJdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOworCisJLyogTnVtYmVyIG9mIGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2VudHJpZXM7CisKKwkvKiBUb3RhbCBzaXplIG9mIG5ldyBlbnRyaWVzICovCisJdW5zaWduZWQgaW50IHNpemU7CisKKwkvKiBIb29rIGVudHJ5IHBvaW50cy4gKi8KKwl1bnNpZ25lZCBpbnQgaG9va19lbnRyeVtORl9JTkVUX05VTUhPT0tTXTsKKworCS8qIFVuZGVyZmxvdyBwb2ludHMuICovCisJdW5zaWduZWQgaW50IHVuZGVyZmxvd1tORl9JTkVUX05VTUhPT0tTXTsKKworCS8qIEluZm9ybWF0aW9uIGFib3V0IG9sZCBlbnRyaWVzOiAqLworCS8qIE51bWJlciBvZiBjb3VudGVycyAobXVzdCBiZSBlcXVhbCB0byBjdXJyZW50IG51bWJlciBvZiBlbnRyaWVzKS4gKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzOworCS8qIFRoZSBvbGQgZW50cmllcycgY291bnRlcnMuICovCisJc3RydWN0IHh0X2NvdW50ZXJzICpjb3VudGVyczsKKworCS8qIFRoZSBlbnRyaWVzIChoYW5nIG9mZiBlbmQ6IG5vdCByZWFsbHkgYW4gYXJyYXkpLiAqLworCXN0cnVjdCBpcHRfZW50cnkgZW50cmllc1swXTsKK307CisKKy8qIFRoZSBhcmd1bWVudCB0byBJUFRfU09fR0VUX0VOVFJJRVMuICovCitzdHJ1Y3QgaXB0X2dldF9lbnRyaWVzIHsKKwkvKiBXaGljaCB0YWJsZTogdXNlciBmaWxscyB0aGlzIGluLiAqLworCWNoYXIgbmFtZVtYVF9UQUJMRV9NQVhOQU1FTEVOXTsKKworCS8qIFVzZXIgZmlsbHMgdGhpcyBpbjogdG90YWwgZW50cnkgc2l6ZS4gKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCS8qIFRoZSBlbnRyaWVzLiAqLworCXN0cnVjdCBpcHRfZW50cnkgZW50cnl0YWJsZVswXTsKK307CisKKy8qIEhlbHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCB4dF9lbnRyeV90YXJnZXQgKgoraXB0X2dldF90YXJnZXQoc3RydWN0IGlwdF9lbnRyeSAqZSkKK3sKKwlyZXR1cm4gKHZvaWQgKillICsgZS0+dGFyZ2V0X29mZnNldDsKK30KKworLyoKKyAqCU1haW4gZmlyZXdhbGwgY2hhaW5zIGRlZmluaXRpb25zIGFuZCBnbG9iYWwgdmFyJ3MgZGVmaW5pdGlvbnMuCisgKi8KKyNlbmRpZiAvKiBfSVBUQUJMRVNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ0xVU1RFUklQLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9DTFVTVEVSSVAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmEyMDRjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ0xVU1RFUklQLmgKQEAgLTAsMCArMSwzNiBAQAorI2lmbmRlZiBfSVBUX0NMVVNURVJJUF9IX3RhcmdldAorI2RlZmluZSBfSVBUX0NMVVNURVJJUF9IX3RhcmdldAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSBjbHVzdGVyaXBfaGFzaG1vZGUgeworICAgIENMVVNURVJJUF9IQVNITU9ERV9TSVAgPSAwLAorICAgIENMVVNURVJJUF9IQVNITU9ERV9TSVBfU1BULAorICAgIENMVVNURVJJUF9IQVNITU9ERV9TSVBfU1BUX0RQVCwKK307CisKKyNkZWZpbmUgQ0xVU1RFUklQX0hBU0hNT0RFX01BWCBDTFVTVEVSSVBfSEFTSE1PREVfU0lQX1NQVF9EUFQKKworI2RlZmluZSBDTFVTVEVSSVBfTUFYX05PREVTIDE2CisKKyNkZWZpbmUgQ0xVU1RFUklQX0ZMQUdfTkVXIDB4MDAwMDAwMDEKKworc3RydWN0IGNsdXN0ZXJpcF9jb25maWc7CisKK3N0cnVjdCBpcHRfY2x1c3RlcmlwX3RndF9pbmZvIHsKKworCV9fdTMyIGZsYWdzOworCisJLyogb25seSByZWxldmFudCBmb3IgbmV3IG9uZXMgKi8KKwlfX3U4IGNsdXN0ZXJtYWNbNl07CisJX191MTYgbnVtX3RvdGFsX25vZGVzOworCV9fdTE2IG51bV9sb2NhbF9ub2RlczsKKwlfX3UxNiBsb2NhbF9ub2Rlc1tDTFVTVEVSSVBfTUFYX05PREVTXTsKKwlfX3UzMiBoYXNoX21vZGU7CisJX191MzIgaGFzaF9pbml0dmFsOworCisJLyogVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBrZXJuZWwgKi8KKwlzdHJ1Y3QgY2x1c3RlcmlwX2NvbmZpZyAqY29uZmlnOworfTsKKworI2VuZGlmIC8qX0lQVF9DTFVTVEVSSVBfSF90YXJnZXQqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfRUNOLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9FQ04uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjg4ZDUzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfRUNOLmgKQEAgLTAsMCArMSwzMyBAQAorLyogSGVhZGVyIGZpbGUgZm9yIGlwdGFibGVzIGlwdF9FQ04gdGFyZ2V0CisgKgorICogKEMpIDIwMDIgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIEdOVSBHUEwgdjIsIDE5OTEKKyAqIAorICogaXB0X0VDTi5oLHYgMS4zIDIwMDIvMDUvMjkgMTI6MTc6NDAgbGFmb3JnZSBFeHAKKyovCisjaWZuZGVmIF9JUFRfRUNOX1RBUkdFVF9ICisjZGVmaW5lIF9JUFRfRUNOX1RBUkdFVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9EU0NQLmg+CisKKyNkZWZpbmUgSVBUX0VDTl9JUF9NQVNLCSh+WFRfRFNDUF9NQVNLKQorCisjZGVmaW5lIElQVF9FQ05fT1BfU0VUX0lQCTB4MDEJLyogc2V0IEVDTiBiaXRzIG9mIElQdjQgaGVhZGVyICovCisjZGVmaW5lIElQVF9FQ05fT1BfU0VUX0VDRQkweDEwCS8qIHNldCBFQ0UgYml0IG9mIFRDUCBoZWFkZXIgKi8KKyNkZWZpbmUgSVBUX0VDTl9PUF9TRVRfQ1dSCTB4MjAJLyogc2V0IENXUiBiaXQgb2YgVENQIGhlYWRlciAqLworCisjZGVmaW5lIElQVF9FQ05fT1BfTUFTSwkJMHhjZQorCitzdHJ1Y3QgaXB0X0VDTl9pbmZvIHsKKwlfX3U4IG9wZXJhdGlvbjsJLyogYml0c2V0IG9mIG9wZXJhdGlvbnMgKi8KKwlfX3U4IGlwX2VjdDsJLyogRUNUIGNvZGVwb2ludCBvZiBJUHY0IGhlYWRlciwgcHJlLXNoaWZ0ZWQgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3U4IGVjZToxLCBjd3I6MTsgLyogVENQIEVDVCBiaXRzICovCisJCX0gdGNwOworCX0gcHJvdG87Cit9OworCisjZW5kaWYgLyogX0lQVF9FQ05fVEFSR0VUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0xPRy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTE9HLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkYmFkZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0xPRy5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0lQVF9MT0dfSAorI2RlZmluZSBfSVBUX0xPR19ICisKKy8qIG1ha2Ugc3VyZSBub3QgdG8gY2hhbmdlIHRoaXMgd2l0aG91dCBjaGFuZ2luZyBuZXRmaWx0ZXIuaDpORl9MT0dfKiAoISkgKi8KKyNkZWZpbmUgSVBUX0xPR19UQ1BTRVEJCTB4MDEJLyogTG9nIFRDUCBzZXF1ZW5jZSBudW1iZXJzICovCisjZGVmaW5lIElQVF9MT0dfVENQT1BUCQkweDAyCS8qIExvZyBUQ1Agb3B0aW9ucyAqLworI2RlZmluZSBJUFRfTE9HX0lQT1BUCQkweDA0CS8qIExvZyBJUCBvcHRpb25zICovCisjZGVmaW5lIElQVF9MT0dfVUlECQkweDA4CS8qIExvZyBVSUQgb3duaW5nIGxvY2FsIHNvY2tldCAqLworI2RlZmluZSBJUFRfTE9HX05GTE9HCQkweDEwCS8qIFVuc3VwcG9ydGVkLCBkb24ndCByZXVzZSAqLworI2RlZmluZSBJUFRfTE9HX01BQ0RFQ09ERQkweDIwCS8qIERlY29kZSBNQUMgaGVhZGVyICovCisjZGVmaW5lIElQVF9MT0dfTUFTSwkJMHgyZgorCitzdHJ1Y3QgaXB0X2xvZ19pbmZvIHsKKwl1bnNpZ25lZCBjaGFyIGxldmVsOworCXVuc2lnbmVkIGNoYXIgbG9nZmxhZ3M7CisJY2hhciBwcmVmaXhbMzBdOworfTsKKworI2VuZGlmIC8qX0lQVF9MT0dfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9SRUpFQ1QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1JFSkVDVC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOTNhMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9SRUpFQ1QuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9JUFRfUkVKRUNUX0gKKyNkZWZpbmUgX0lQVF9SRUpFQ1RfSAorCitlbnVtIGlwdF9yZWplY3Rfd2l0aCB7CisJSVBUX0lDTVBfTkVUX1VOUkVBQ0hBQkxFLAorCUlQVF9JQ01QX0hPU1RfVU5SRUFDSEFCTEUsCisJSVBUX0lDTVBfUFJPVF9VTlJFQUNIQUJMRSwKKwlJUFRfSUNNUF9QT1JUX1VOUkVBQ0hBQkxFLAorCUlQVF9JQ01QX0VDSE9SRVBMWSwKKwlJUFRfSUNNUF9ORVRfUFJPSElCSVRFRCwKKwlJUFRfSUNNUF9IT1NUX1BST0hJQklURUQsCisJSVBUX1RDUF9SRVNFVCwKKwlJUFRfSUNNUF9BRE1JTl9QUk9ISUJJVEVECit9OworCitzdHJ1Y3QgaXB0X3JlamVjdF9pbmZvIHsKKwllbnVtIGlwdF9yZWplY3Rfd2l0aCB3aXRoOyAgICAgIC8qIHJlamVjdCB0eXBlICovCit9OworCisjZW5kaWYgLypfSVBUX1JFSkVDVF9IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1NBTUUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1NBTUUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmNhNzgyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfU0FNRS5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX0lQVF9TQU1FX0gKKyNkZWZpbmUgX0lQVF9TQU1FX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgSVBUX1NBTUVfTUFYX1JBTkdFCTEwCisKKyNkZWZpbmUgSVBUX1NBTUVfTk9EU1QJCTB4MDEKKworc3RydWN0IGlwdF9zYW1lX2luZm8geworCXVuc2lnbmVkIGNoYXIgaW5mbzsKKwlfX3UzMiByYW5nZXNpemU7CisJX191MzIgaXBudW07CisJX191MzIgKmlwYXJyYXk7CisKKwkvKiBoYW5ncyBvZmYgZW5kLiAqLworCXN0cnVjdCBuZl9uYXRfcmFuZ2UgcmFuZ2VbSVBUX1NBTUVfTUFYX1JBTkdFXTsKK307CisKKyNlbmRpZiAvKl9JUFRfU0FNRV9IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1RUTC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfVFRMLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhYzE2OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1RUTC5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qIFRUTCBtb2RpZmljYXRpb24gbW9kdWxlIGZvciBJUCB0YWJsZXMKKyAqIChDKSAyMDAwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPiAqLworCisjaWZuZGVmIF9JUFRfVFRMX0gKKyNkZWZpbmUgX0lQVF9UVExfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSB7CisJSVBUX1RUTF9TRVQgPSAwLAorCUlQVF9UVExfSU5DLAorCUlQVF9UVExfREVDCit9OworCisjZGVmaW5lIElQVF9UVExfTUFYTU9ERQlJUFRfVFRMX0RFQworCitzdHJ1Y3QgaXB0X1RUTF9pbmZvIHsKKwlfX3U4CW1vZGU7CisJX191OAl0dGw7Cit9OworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfVUxPRy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfVUxPRy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxN2FhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9VTE9HLmgKQEAgLTAsMCArMSw0OSBAQAorLyogSGVhZGVyIGZpbGUgZm9yIElQIHRhYmxlcyB1c2Vyc3BhY2UgbG9nZ2luZywgVmVyc2lvbiAxLjgKKyAqCisgKiAoQykgMjAwMC0yMDAyIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAKKyAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHTlUgR1BMICovCisKKyNpZm5kZWYgX0lQVF9VTE9HX0gKKyNkZWZpbmUgX0lQVF9VTE9HX0gKKworI2lmbmRlZiBORVRMSU5LX05GTE9HCisjZGVmaW5lIE5FVExJTktfTkZMT0cgCTUKKyNlbmRpZgorCisjZGVmaW5lIFVMT0dfREVGQVVMVF9OTEdST1VQCTEKKyNkZWZpbmUgVUxPR19ERUZBVUxUX1FUSFJFU0hPTEQJMQorCisjZGVmaW5lIFVMT0dfTUFDX0xFTgk4MAorI2RlZmluZSBVTE9HX1BSRUZJWF9MRU4JMzIKKworI2RlZmluZSBVTE9HX01BWF9RTEVOCTUwCisvKiBXaHkgNTA/IFdlbGwuLi4gdGhlcmUgaXMgYSBsaW1pdCBpbXBvc2VkIGJ5IHRoZSBzbGFiIGNhY2hlIDEzMTAwMAorICogYnl0ZXMuIFNvIHRoZSBtdWx0aXBhcnQgbmV0bGluay1tZXNzYWdlIGhhcyB0byBiZSA8IDEzMTAwMCBieXRlcy4KKyAqIEFzc3VtaW5nIGEgc3RhbmRhcmQgZXRoZXJuZXQtbXR1IG9mIDE1MDAsIHdlIGNvdWxkIGRlZmluZSB0aGlzIHVwCisgKiB0byA4MC4uLiBidXQgZXZlbiA1MCBzZWVtcyB0byBiZSBiaWcgZW5vdWdoLiAqLworCisvKiBwcml2YXRlIGRhdGEgc3RydWN0dXJlIGZvciBlYWNoIHJ1bGUgd2l0aCBhIFVMT0cgdGFyZ2V0ICovCitzdHJ1Y3QgaXB0X3Vsb2dfaW5mbyB7CisJdW5zaWduZWQgaW50IG5sX2dyb3VwOworCXNpemVfdCBjb3B5X3JhbmdlOworCXNpemVfdCBxdGhyZXNob2xkOworCWNoYXIgcHJlZml4W1VMT0dfUFJFRklYX0xFTl07Cit9OworCisvKiBGb3JtYXQgb2YgdGhlIFVMT0cgcGFja2V0cyBwYXNzZWQgdGhyb3VnaCBuZXRsaW5rICovCit0eXBlZGVmIHN0cnVjdCB1bG9nX3BhY2tldF9tc2cgeworCXVuc2lnbmVkIGxvbmcgbWFyazsKKwlsb25nIHRpbWVzdGFtcF9zZWM7CisJbG9uZyB0aW1lc3RhbXBfdXNlYzsKKwl1bnNpZ25lZCBpbnQgaG9vazsKKwljaGFyIGluZGV2X25hbWVbSUZOQU1TSVpdOworCWNoYXIgb3V0ZGV2X25hbWVbSUZOQU1TSVpdOworCXNpemVfdCBkYXRhX2xlbjsKKwljaGFyIHByZWZpeFtVTE9HX1BSRUZJWF9MRU5dOworCXVuc2lnbmVkIGNoYXIgbWFjX2xlbjsKKwl1bnNpZ25lZCBjaGFyIG1hY1tVTE9HX01BQ19MRU5dOworCXVuc2lnbmVkIGNoYXIgcGF5bG9hZFswXTsKK30gdWxvZ19wYWNrZXRfbXNnX3Q7CisKKyNlbmRpZiAvKl9JUFRfVUxPR19IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2FkZHJ0eXBlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9hZGRydHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYTQyMjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9hZGRydHlwZS5oCkBAIC0wLDAgKzEsMjcgQEAKKyNpZm5kZWYgX0lQVF9BRERSVFlQRV9ICisjZGVmaW5lIF9JUFRfQUREUlRZUEVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSB7CisJSVBUX0FERFJUWVBFX0lOVkVSVF9TT1VSQ0UJPSAweDAwMDEsCisJSVBUX0FERFJUWVBFX0lOVkVSVF9ERVNUCT0gMHgwMDAyLAorCUlQVF9BRERSVFlQRV9MSU1JVF9JRkFDRV9JTgk9IDB4MDAwNCwKKwlJUFRfQUREUlRZUEVfTElNSVRfSUZBQ0VfT1VUCT0gMHgwMDA4LAorfTsKKworc3RydWN0IGlwdF9hZGRydHlwZV9pbmZvX3YxIHsKKwlfX3UxNglzb3VyY2U7CQkvKiBzb3VyY2UtdHlwZSBtYXNrICovCisJX191MTYJZGVzdDsJCS8qIGRlc3QtdHlwZSBtYXNrICovCisJX191MzIJZmxhZ3M7Cit9OworCisvKiByZXZpc2lvbiAwICovCitzdHJ1Y3QgaXB0X2FkZHJ0eXBlX2luZm8geworCV9fdTE2CXNvdXJjZTsJCS8qIHNvdXJjZS10eXBlIG1hc2sgKi8KKwlfX3UxNglkZXN0OwkJLyogZGVzdC10eXBlIG1hc2sgKi8KKwlfX3UzMglpbnZlcnRfc291cmNlOworCV9fdTMyCWludmVydF9kZXN0OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9haC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfYWguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTAyYmIwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfYWguaApAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIF9JUFRfQUhfSAorI2RlZmluZSBfSVBUX0FIX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBpcHRfYWggeworCV9fdTMyIHNwaXNbMl07CQkJLyogU2VjdXJpdHkgUGFyYW1ldGVyIEluZGV4ICovCisJX191OCAgaW52ZmxhZ3M7CQkJLyogSW52ZXJzZSBmbGFncyAqLworfTsKKworCisKKy8qIFZhbHVlcyBmb3IgImludmZsYWdzIiBmaWVsZCBpbiBzdHJ1Y3QgaXB0X2FoLiAqLworI2RlZmluZSBJUFRfQUhfSU5WX1NQSQkJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIHNwaS4gKi8KKyNkZWZpbmUgSVBUX0FIX0lOVl9NQVNLCTB4MDEJLyogQWxsIHBvc3NpYmxlIGZsYWdzLiAqLworCisjZW5kaWYgLypfSVBUX0FIX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfZWNuLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9lY24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJmOTVmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfZWNuLmgKQEAgLTAsMCArMSwzNSBAQAorLyogaXB0YWJsZXMgbW9kdWxlIGZvciBtYXRjaGluZyB0aGUgRUNOIGhlYWRlciBpbiBJUHY0IGFuZCBUQ1AgaGVhZGVyCisgKgorICogKEMpIDIwMDIgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIEdOVSBHUEwgdjIsIDE5OTEKKyAqIAorICogaXB0X2Vjbi5oLHYgMS40IDIwMDIvMDgvMDUgMTk6Mzk6MDAgbGFmb3JnZSBFeHAKKyovCisjaWZuZGVmIF9JUFRfRUNOX0gKKyNkZWZpbmUgX0lQVF9FQ05fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfZHNjcC5oPgorCisjZGVmaW5lIElQVF9FQ05fSVBfTUFTSwkoflhUX0RTQ1BfTUFTSykKKworI2RlZmluZSBJUFRfRUNOX09QX01BVENIX0lQCTB4MDEKKyNkZWZpbmUgSVBUX0VDTl9PUF9NQVRDSF9FQ0UJMHgxMAorI2RlZmluZSBJUFRfRUNOX09QX01BVENIX0NXUgkweDIwCisKKyNkZWZpbmUgSVBUX0VDTl9PUF9NQVRDSF9NQVNLCTB4Y2UKKworLyogbWF0Y2ggaW5mbyAqLworc3RydWN0IGlwdF9lY25faW5mbyB7CisJX191OCBvcGVyYXRpb247CisJX191OCBpbnZlcnQ7CisJX191OCBpcF9lY3Q7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191OCBlY3Q7CisJCX0gdGNwOworCX0gcHJvdG87Cit9OworCisjZW5kaWYgLyogX0lQVF9FQ05fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcmVhbG0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3JlYWxtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM5OTZlYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3JlYWxtLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9JUFRfUkVBTE1fSAorI2RlZmluZSBfSVBUX1JFQUxNX0gKKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9yZWFsbS5oPgorI2RlZmluZSBpcHRfcmVhbG1faW5mbyB4dF9yZWFsbV9pbmZvCisKKyNlbmRpZiAvKiBfSVBUX1JFQUxNX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3R0bC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfdHRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdiZWU0NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3R0bC5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qIElQIHRhYmxlcyBtb2R1bGUgZm9yIG1hdGNoaW5nIHRoZSB2YWx1ZSBvZiB0aGUgVFRMCisgKiAoQykgMjAwMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPiAqLworCisjaWZuZGVmIF9JUFRfVFRMX0gKKyNkZWZpbmUgX0lQVF9UVExfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSB7CisJSVBUX1RUTF9FUSA9IDAsCQkvKiBlcXVhbHMgKi8KKwlJUFRfVFRMX05FLAkJLyogbm90IGVxdWFscyAqLworCUlQVF9UVExfTFQsCQkvKiBsZXNzIHRoYW4gKi8KKwlJUFRfVFRMX0dULAkJLyogZ3JlYXRlciB0aGFuICovCit9OworCisKK3N0cnVjdCBpcHRfdHRsX2luZm8geworCV9fdTgJbW9kZTsKKwlfX3U4CXR0bDsKK307CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L25mX25hdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9uZl9uYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTg2MWQwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9uZl9uYXQuaApAQCAtMCwwICsxLDU4IEBACisjaWZuZGVmIF9MSU5VWF9ORl9OQVRfSAorI2RlZmluZSBfTElOVVhfTkZfTkFUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgSVBfTkFUX1JBTkdFX01BUF9JUFMgMQorI2RlZmluZSBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEIDIKKyNkZWZpbmUgSVBfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSA0CisjZGVmaW5lIElQX05BVF9SQU5HRV9QRVJTSVNURU5UIDgKKworLyogVGhlIHByb3RvY29sLXNwZWNpZmljIG1hbmlwdWxhYmxlIHBhcnRzIG9mIHRoZSB0dXBsZS4gKi8KK3VuaW9uIG5mX2Nvbm50cmFja19tYW5fcHJvdG8geworCS8qIEFkZCBvdGhlciBwcm90b2NvbHMgaGVyZS4gKi8KKwlfX2JlMTYgYWxsOworCisJc3RydWN0IHsKKwkJX19iZTE2IHBvcnQ7CisJfSB0Y3A7CisJc3RydWN0IHsKKwkJX19iZTE2IHBvcnQ7CisJfSB1ZHA7CisJc3RydWN0IHsKKwkJX19iZTE2IGlkOworCX0gaWNtcDsKKwlzdHJ1Y3QgeworCQlfX2JlMTYgcG9ydDsKKwl9IGRjY3A7CisJc3RydWN0IHsKKwkJX19iZTE2IHBvcnQ7CisJfSBzY3RwOworCXN0cnVjdCB7CisJCV9fYmUxNiBrZXk7CS8qIEdSRSBrZXkgaXMgMzJiaXQsIFBQdFAgb25seSB1c2VzIDE2Yml0ICovCisJfSBncmU7Cit9OworCisvKiBTaW5nbGUgcmFuZ2Ugc3BlY2lmaWNhdGlvbi4gKi8KK3N0cnVjdCBuZl9uYXRfcmFuZ2UgeworCS8qIFNldCB0byBPUiBvZiBmbGFncyBhYm92ZS4gKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisKKwkvKiBJbmNsdXNpdmU6IG5ldHdvcmsgb3JkZXIuICovCisJX19iZTMyIG1pbl9pcCwgbWF4X2lwOworCisJLyogSW5jbHVzaXZlOiBuZXR3b3JrIG9yZGVyICovCisJdW5pb24gbmZfY29ubnRyYWNrX21hbl9wcm90byBtaW4sIG1heDsKK307CisKKy8qIEZvciBiYWNrd2FyZHMgY29tcGF0OiBkb24ndCB1c2UgaW4gbW9kZXJuIGNvZGUuICovCitzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCB7CisJdW5zaWduZWQgaW50IHJhbmdlc2l6ZTsgLyogTXVzdCBiZSAxLiAqLworCisJLyogaGFuZ3Mgb2ZmIGVuZC4gKi8KKwlzdHJ1Y3QgbmZfbmF0X3JhbmdlIHJhbmdlWzFdOworfTsKKworI2RlZmluZSBuZl9uYXRfbXVsdGlfcmFuZ2UgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGViZGEyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni5oCkBAIC0wLDAgKzEsNzYgQEAKKyNpZm5kZWYgX19MSU5VWF9JUDZfTkVURklMVEVSX0gKKyNkZWZpbmUgX19MSU5VWF9JUDZfTkVURklMVEVSX0gKKworLyogSVB2Ni1zcGVjaWZpYyBkZWZpbmVzIGZvciBuZXRmaWx0ZXIuIAorICogKEMpMTk5OCBSdXN0eSBSdXNzZWxsIC0tIFRoaXMgY29kZSBpcyBHUEwuCisgKiAoQykxOTk5IERhdmlkIEplZmZlcnkKKyAqICAgdGhpcyBoZWFkZXIgd2FzIGJsYXRhbnRseSByaXBwZWQgZnJvbSBuZXRmaWx0ZXJfaXB2NC5oIAorICogICBpdCdzIGFtYXppbmcgd2hhdCBhZGRpbmcgYSBidW5jaCBvZiA2cyBjYW4gZG8gPTheKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKworLyogb25seSBmb3IgdXNlcnNwYWNlIGNvbXBhdGliaWxpdHkgKi8KKworI2luY2x1ZGUgPGxpbWl0cy5oPiAvKiBmb3IgSU5UX01JTiwgSU5UX01BWCAqLworCisvKiBJUCBDYWNoZSBiaXRzLiAqLworLyogU3JjIElQIGFkZHJlc3MuICovCisjZGVmaW5lIE5GQ19JUDZfU1JDICAgICAgICAgICAgICAweDAwMDEKKy8qIERlc3QgSVAgYWRkcmVzcy4gKi8KKyNkZWZpbmUgTkZDX0lQNl9EU1QgICAgICAgICAgICAgIDB4MDAwMgorLyogSW5wdXQgZGV2aWNlLiAqLworI2RlZmluZSBORkNfSVA2X0lGX0lOICAgICAgICAgICAgMHgwMDA0CisvKiBPdXRwdXQgZGV2aWNlLiAqLworI2RlZmluZSBORkNfSVA2X0lGX09VVCAgICAgICAgICAgMHgwMDA4CisvKiBUT1MuICovCisjZGVmaW5lIE5GQ19JUDZfVE9TICAgICAgICAgICAgICAweDAwMTAKKy8qIFByb3RvY29sLiAqLworI2RlZmluZSBORkNfSVA2X1BST1RPICAgICAgICAgICAgMHgwMDIwCisvKiBJUCBvcHRpb25zLiAqLworI2RlZmluZSBORkNfSVA2X09QVElPTlMgICAgICAgICAgMHgwMDQwCisvKiBGcmFnICYgZmxhZ3MuICovCisjZGVmaW5lIE5GQ19JUDZfRlJBRyAgICAgICAgICAgICAweDAwODAKKworCisvKiBQZXItcHJvdG9jb2wgaW5mb3JtYXRpb246IG9ubHkgbWF0dGVycyBpZiBwcm90byBtYXRjaC4gKi8KKy8qIFRDUCBmbGFncy4gKi8KKyNkZWZpbmUgTkZDX0lQNl9UQ1BGTEFHUyAgICAgICAgIDB4MDEwMAorLyogU291cmNlIHBvcnQuICovCisjZGVmaW5lIE5GQ19JUDZfU1JDX1BUICAgICAgICAgICAweDAyMDAKKy8qIERlc3QgcG9ydC4gKi8KKyNkZWZpbmUgTkZDX0lQNl9EU1RfUFQgICAgICAgICAgIDB4MDQwMAorLyogU29tZXRoaW5nIGVsc2UgYWJvdXQgdGhlIHByb3RvICovCisjZGVmaW5lIE5GQ19JUDZfUFJPVE9fVU5LTk9XTiAgICAweDIwMDAKKworLyogSVA2IEhvb2tzICovCisvKiBBZnRlciBwcm9taXNjIGRyb3BzLCBjaGVja3N1bSBjaGVja3MuICovCisjZGVmaW5lIE5GX0lQNl9QUkVfUk9VVElORwkwCisvKiBJZiB0aGUgcGFja2V0IGlzIGRlc3RpbmVkIGZvciB0aGlzIGJveC4gKi8KKyNkZWZpbmUgTkZfSVA2X0xPQ0FMX0lOCQkxCisvKiBJZiB0aGUgcGFja2V0IGlzIGRlc3RpbmVkIGZvciBhbm90aGVyIGludGVyZmFjZS4gKi8KKyNkZWZpbmUgTkZfSVA2X0ZPUldBUkQJCTIKKy8qIFBhY2tldHMgY29taW5nIGZyb20gYSBsb2NhbCBwcm9jZXNzLiAqLworI2RlZmluZSBORl9JUDZfTE9DQUxfT1VUCQkzCisvKiBQYWNrZXRzIGFib3V0IHRvIGhpdCB0aGUgd2lyZS4gKi8KKyNkZWZpbmUgTkZfSVA2X1BPU1RfUk9VVElORwk0CisjZGVmaW5lIE5GX0lQNl9OVU1IT09LUwkJNQorCisKK2VudW0gbmZfaXA2X2hvb2tfcHJpb3JpdGllcyB7CisJTkZfSVA2X1BSSV9GSVJTVCA9IElOVF9NSU4sCisJTkZfSVA2X1BSSV9DT05OVFJBQ0tfREVGUkFHID0gLTQwMCwKKwlORl9JUDZfUFJJX1JBVyA9IC0zMDAsCisJTkZfSVA2X1BSSV9TRUxJTlVYX0ZJUlNUID0gLTIyNSwKKwlORl9JUDZfUFJJX0NPTk5UUkFDSyA9IC0yMDAsCisJTkZfSVA2X1BSSV9NQU5HTEUgPSAtMTUwLAorCU5GX0lQNl9QUklfTkFUX0RTVCA9IC0xMDAsCisJTkZfSVA2X1BSSV9GSUxURVIgPSAwLAorCU5GX0lQNl9QUklfU0VDVVJJVFkgPSA1MCwKKwlORl9JUDZfUFJJX05BVF9TUkMgPSAxMDAsCisJTkZfSVA2X1BSSV9TRUxJTlVYX0xBU1QgPSAyMjUsCisJTkZfSVA2X1BSSV9MQVNUID0gSU5UX01BWCwKK307CisKKworI2VuZGlmIC8qX19MSU5VWF9JUDZfTkVURklMVEVSX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDMyZGQxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmgKQEAgLTAsMCArMSwyNjUgQEAKKy8qCisgKiAyNS1KdWwtMTk5OCBNYWpvciBjaGFuZ2VzIHRvIGFsbG93IGZvciBpcCBjaGFpbiB0YWJsZQorICoKKyAqIDMtSmFuLTIwMDAgTmFtZWQgdGFibGVzIHRvIGFsbG93IHBhY2tldCBzZWxlY3Rpb24gZm9yIGRpZmZlcmVudCB1c2VzLgorICovCisKKy8qCisgKiAJRm9ybWF0IG9mIGFuIElQNiBmaXJld2FsbCBkZXNjcmlwdG9yCisgKgorICogCXNyYywgZHN0LCBzcmNfbWFzaywgZHN0X21hc2sgYXJlIGFsd2F5cyBzdG9yZWQgaW4gbmV0d29yayBieXRlIG9yZGVyLgorICogCWZsYWdzIGFyZSBzdG9yZWQgaW4gaG9zdCBieXRlIG9yZGVyIChvZiBjb3Vyc2UpLgorICogCVBvcnQgbnVtYmVycyBhcmUgc3RvcmVkIGluIEhPU1QgYnl0ZSBvcmRlci4KKyAqLworCisjaWZuZGVmIF9JUDZfVEFCTEVTX0gKKyNkZWZpbmUgX0lQNl9UQUJMRVNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKworI2RlZmluZSBJUDZUX0ZVTkNUSU9OX01BWE5BTUVMRU4gWFRfRlVOQ1RJT05fTUFYTkFNRUxFTgorI2RlZmluZSBJUDZUX1RBQkxFX01BWE5BTUVMRU4gWFRfVEFCTEVfTUFYTkFNRUxFTgorI2RlZmluZSBpcDZ0X21hdGNoIHh0X21hdGNoCisjZGVmaW5lIGlwNnRfdGFyZ2V0IHh0X3RhcmdldAorI2RlZmluZSBpcDZ0X3RhYmxlIHh0X3RhYmxlCisjZGVmaW5lIGlwNnRfZ2V0X3JldmlzaW9uIHh0X2dldF9yZXZpc2lvbgorI2RlZmluZSBpcDZ0X2VudHJ5X21hdGNoIHh0X2VudHJ5X21hdGNoCisjZGVmaW5lIGlwNnRfZW50cnlfdGFyZ2V0IHh0X2VudHJ5X3RhcmdldAorI2RlZmluZSBpcDZ0X3N0YW5kYXJkX3RhcmdldCB4dF9zdGFuZGFyZF90YXJnZXQKKyNkZWZpbmUgaXA2dF9lcnJvcl90YXJnZXQgeHRfZXJyb3JfdGFyZ2V0CisjZGVmaW5lIGlwNnRfY291bnRlcnMgeHRfY291bnRlcnMKKyNkZWZpbmUgSVA2VF9DT05USU5VRSBYVF9DT05USU5VRQorI2RlZmluZSBJUDZUX1JFVFVSTiBYVF9SRVRVUk4KKworLyogUHJlLWlwdGFibGVzLTEuNC4wICovCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3RjcHVkcC5oPgorI2RlZmluZSBpcDZ0X3RjcCB4dF90Y3AKKyNkZWZpbmUgaXA2dF91ZHAgeHRfdWRwCisjZGVmaW5lIElQNlRfVENQX0lOVl9TUkNQVAlYVF9UQ1BfSU5WX1NSQ1BUCisjZGVmaW5lIElQNlRfVENQX0lOVl9EU1RQVAlYVF9UQ1BfSU5WX0RTVFBUCisjZGVmaW5lIElQNlRfVENQX0lOVl9GTEFHUwlYVF9UQ1BfSU5WX0ZMQUdTCisjZGVmaW5lIElQNlRfVENQX0lOVl9PUFRJT04JWFRfVENQX0lOVl9PUFRJT04KKyNkZWZpbmUgSVA2VF9UQ1BfSU5WX01BU0sJWFRfVENQX0lOVl9NQVNLCisjZGVmaW5lIElQNlRfVURQX0lOVl9TUkNQVAlYVF9VRFBfSU5WX1NSQ1BUCisjZGVmaW5lIElQNlRfVURQX0lOVl9EU1RQVAlYVF9VRFBfSU5WX0RTVFBUCisjZGVmaW5lIElQNlRfVURQX0lOVl9NQVNLCVhUX1VEUF9JTlZfTUFTSworCisjZGVmaW5lIGlwNnRfY291bnRlcnNfaW5mbyB4dF9jb3VudGVyc19pbmZvCisjZGVmaW5lIElQNlRfU1RBTkRBUkRfVEFSR0VUIFhUX1NUQU5EQVJEX1RBUkdFVAorI2RlZmluZSBJUDZUX0VSUk9SX1RBUkdFVCBYVF9FUlJPUl9UQVJHRVQKKyNkZWZpbmUgSVA2VF9NQVRDSF9JVEVSQVRFKGUsIGZuLCBhcmdzLi4uKSBcCisJWFRfTUFUQ0hfSVRFUkFURShzdHJ1Y3QgaXA2dF9lbnRyeSwgZSwgZm4sICMjIGFyZ3MpCisjZGVmaW5lIElQNlRfRU5UUllfSVRFUkFURShlbnRyaWVzLCBzaXplLCBmbiwgYXJncy4uLikgXAorCVhUX0VOVFJZX0lURVJBVEUoc3RydWN0IGlwNnRfZW50cnksIGVudHJpZXMsIHNpemUsIGZuLCAjIyBhcmdzKQorCisvKiBZZXMsIFZpcmdpbmlhLCB5b3UgaGF2ZSB0byB6ZXJvIHRoZSBwYWRkaW5nLiAqLworc3RydWN0IGlwNnRfaXA2IHsKKwkvKiBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIElQNiBhZGRyICovCisJc3RydWN0IGluNl9hZGRyIHNyYywgZHN0OwkJCisJLyogTWFzayBmb3Igc3JjIGFuZCBkZXN0IElQNiBhZGRyICovCisJc3RydWN0IGluNl9hZGRyIHNtc2ssIGRtc2s7CisJY2hhciBpbmlmYWNlW0lGTkFNU0laXSwgb3V0aWZhY2VbSUZOQU1TSVpdOworCXVuc2lnbmVkIGNoYXIgaW5pZmFjZV9tYXNrW0lGTkFNU0laXSwgb3V0aWZhY2VfbWFza1tJRk5BTVNJWl07CisKKwkvKiBVcHBlciBwcm90b2NvbCBudW1iZXIKKwkgKiAtIFRoZSBhbGxvd2VkIHZhbHVlIGlzIDAgKGFueSkgb3IgcHJvdG9jb2wgbnVtYmVyIG9mIGxhc3QgcGFyc2FibGUKKwkgKiAgIGhlYWRlciwgd2hpY2ggaXMgNTAgKEVTUCksIDU5IChObyBOZXh0IEhlYWRlciksIDEzNSAoTUgpLCBvcgorCSAqICAgdGhlIG5vbiBJUHY2IGV4dGVuc2lvbiBoZWFkZXJzLgorCSAqIC0gVGhlIHByb3RvY29sIG51bWJlcnMgb2YgSVB2NiBleHRlbnNpb24gaGVhZGVycyBleGNlcHQgb2YgRVNQIGFuZAorCSAqICAgTUggZG8gbm90IG1hdGNoIGFueSBwYWNrZXRzLgorCSAqIC0gWW91IGFsc28gbmVlZCB0byBzZXQgSVA2VF9GTEFHU19QUk9UTyB0byAiZmxhZ3MiIHRvIGNoZWNrIHByb3RvY29sLgorCSAqLworCV9fdTE2IHByb3RvOworCS8qIFRPUyB0byBtYXRjaCBpZmYgZmxhZ3MgJiBJUDZUX0ZfVE9TICovCisJX191OCB0b3M7CisKKwkvKiBGbGFncyB3b3JkICovCisJX191OCBmbGFnczsKKwkvKiBJbnZlcnNlIGZsYWdzICovCisJX191OCBpbnZmbGFnczsKK307CisKKy8qIFZhbHVlcyBmb3IgImZsYWciIGZpZWxkIGluIHN0cnVjdCBpcDZ0X2lwNiAoZ2VuZXJhbCBpcDYgc3RydWN0dXJlKS4gKi8KKyNkZWZpbmUgSVA2VF9GX1BST1RPCQkweDAxCS8qIFNldCBpZiBydWxlIGNhcmVzIGFib3V0IHVwcGVyIAorCQkJCQkgICBwcm90b2NvbHMgKi8KKyNkZWZpbmUgSVA2VF9GX1RPUwkJMHgwMgkvKiBNYXRjaCB0aGUgVE9TLiAqLworI2RlZmluZSBJUDZUX0ZfR09UTwkJMHgwNAkvKiBTZXQgaWYganVtcCBpcyBhIGdvdG8gKi8KKyNkZWZpbmUgSVA2VF9GX01BU0sJCTB4MDcJLyogQWxsIHBvc3NpYmxlIGZsYWcgYml0cyBtYXNrLiAqLworCisvKiBWYWx1ZXMgZm9yICJpbnYiIGZpZWxkIGluIHN0cnVjdCBpcDZ0X2lwNi4gKi8KKyNkZWZpbmUgSVA2VF9JTlZfVklBX0lOCQkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgSU4gSUZBQ0UuICovCisjZGVmaW5lIElQNlRfSU5WX1ZJQV9PVVQJCTB4MDIJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBPVVQgSUZBQ0UgKi8KKyNkZWZpbmUgSVA2VF9JTlZfVE9TCQkweDA0CS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgVE9TLiAqLworI2RlZmluZSBJUDZUX0lOVl9TUkNJUAkJMHgwOAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIFNSQyBJUC4gKi8KKyNkZWZpbmUgSVA2VF9JTlZfRFNUSVAJCTB4MTAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBEU1QgT1AuICovCisjZGVmaW5lIElQNlRfSU5WX0ZSQUcJCTB4MjAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBGUkFHLiAqLworI2RlZmluZSBJUDZUX0lOVl9QUk9UTwkJWFRfSU5WX1BST1RPCisjZGVmaW5lIElQNlRfSU5WX01BU0sJCTB4N0YJLyogQWxsIHBvc3NpYmxlIGZsYWcgYml0cyBtYXNrLiAqLworCisvKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGVhY2ggb2YgdGhlIGZpcmV3YWxsIHJ1bGVzLiAgQ29uc2lzdHMgb2YgMworICAgcGFydHMgd2hpY2ggYXJlIDEpIGdlbmVyYWwgSVAgaGVhZGVyIHN0dWZmIDIpIG1hdGNoIHNwZWNpZmljCisgICBzdHVmZiAzKSB0aGUgdGFyZ2V0IHRvIHBlcmZvcm0gaWYgdGhlIHJ1bGUgbWF0Y2hlcyAqLworc3RydWN0IGlwNnRfZW50cnkgeworCXN0cnVjdCBpcDZ0X2lwNiBpcHY2OworCisJLyogTWFyayB3aXRoIGZpZWxkcyB0aGF0IHdlIGNhcmUgYWJvdXQuICovCisJdW5zaWduZWQgaW50IG5mY2FjaGU7CisKKwkvKiBTaXplIG9mIGlwdF9lbnRyeSArIG1hdGNoZXMgKi8KKwlfX3UxNiB0YXJnZXRfb2Zmc2V0OworCS8qIFNpemUgb2YgaXB0X2VudHJ5ICsgbWF0Y2hlcyArIHRhcmdldCAqLworCV9fdTE2IG5leHRfb2Zmc2V0OworCisJLyogQmFjayBwb2ludGVyICovCisJdW5zaWduZWQgaW50IGNvbWVmcm9tOworCisJLyogUGFja2V0IGFuZCBieXRlIGNvdW50ZXJzLiAqLworCXN0cnVjdCB4dF9jb3VudGVycyBjb3VudGVyczsKKworCS8qIFRoZSBtYXRjaGVzIChpZiBhbnkpLCB0aGVuIHRoZSB0YXJnZXQuICovCisJdW5zaWduZWQgY2hhciBlbGVtc1swXTsKK307CisKKy8qIFN0YW5kYXJkIGVudHJ5ICovCitzdHJ1Y3QgaXA2dF9zdGFuZGFyZCB7CisJc3RydWN0IGlwNnRfZW50cnkgZW50cnk7CisJc3RydWN0IHh0X3N0YW5kYXJkX3RhcmdldCB0YXJnZXQ7Cit9OworCitzdHJ1Y3QgaXA2dF9lcnJvciB7CisJc3RydWN0IGlwNnRfZW50cnkgZW50cnk7CisJc3RydWN0IHh0X2Vycm9yX3RhcmdldCB0YXJnZXQ7Cit9OworCisjZGVmaW5lIElQNlRfRU5UUllfSU5JVChfX3NpemUpCQkJCQkJICAgICAgIFwKK3sJCQkJCQkJCQkgICAgICAgXAorCS50YXJnZXRfb2Zmc2V0CT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X2VudHJ5KSwJCQkgICAgICAgXAorCS5uZXh0X29mZnNldAk9IChfX3NpemUpLAkJCQkJICAgICAgIFwKK30KKworI2RlZmluZSBJUDZUX1NUQU5EQVJEX0lOSVQoX192ZXJkaWN0KQkJCQkJICAgICAgIFwKK3sJCQkJCQkJCQkgICAgICAgXAorCS5lbnRyeQkJPSBJUDZUX0VOVFJZX0lOSVQoc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSksICAgICAgIFwKKwkudGFyZ2V0CQk9IFhUX1RBUkdFVF9JTklUKFhUX1NUQU5EQVJEX1RBUkdFVCwJCSAgICAgICBcCisJCQkJCSBzaXplb2Yoc3RydWN0IHh0X3N0YW5kYXJkX3RhcmdldCkpLCAgIFwKKwkudGFyZ2V0LnZlcmRpY3QJPSAtKF9fdmVyZGljdCkgLSAxLAkJCQkgICAgICAgXAorfQorCisjZGVmaW5lIElQNlRfRVJST1JfSU5JVAkJCQkJCQkgICAgICAgXAorewkJCQkJCQkJCSAgICAgICBcCisJLmVudHJ5CQk9IElQNlRfRU5UUllfSU5JVChzaXplb2Yoc3RydWN0IGlwNnRfZXJyb3IpKSwJICAgICAgIFwKKwkudGFyZ2V0CQk9IFhUX1RBUkdFVF9JTklUKFhUX0VSUk9SX1RBUkdFVCwJCSAgICAgICBcCisJCQkJCSBzaXplb2Yoc3RydWN0IHh0X2Vycm9yX3RhcmdldCkpLCAgICAgIFwKKwkudGFyZ2V0LmVycm9ybmFtZSA9ICJFUlJPUiIsCQkJCQkgICAgICAgXAorfQorCisvKgorICogTmV3IElQIGZpcmV3YWxsIG9wdGlvbnMgZm9yIFtnc11ldHNvY2tvcHQgYXQgdGhlIFJBVyBJUCBsZXZlbC4KKyAqIFVubGlrZSBCU0QgTGludXggaW5oZXJpdHMgSVAgb3B0aW9ucyBzbyB5b3UgZG9uJ3QgaGF2ZSB0byB1c2UKKyAqIGEgcmF3IHNvY2tldCBmb3IgdGhpcy4gSW5zdGVhZCB3ZSBjaGVjayByaWdodHMgaW4gdGhlIGNhbGxzLgorICoKKyAqIEFUVEVOVElPTjogY2hlY2sgbGludXgvaW42LmggYmVmb3JlIGFkZGluZyBuZXcgbnVtYmVyIGhlcmUuCisgKi8KKyNkZWZpbmUgSVA2VF9CQVNFX0NUTAkJCTY0CisKKyNkZWZpbmUgSVA2VF9TT19TRVRfUkVQTEFDRQkJKElQNlRfQkFTRV9DVEwpCisjZGVmaW5lIElQNlRfU09fU0VUX0FERF9DT1VOVEVSUwkoSVA2VF9CQVNFX0NUTCArIDEpCisjZGVmaW5lIElQNlRfU09fU0VUX01BWAkJCUlQNlRfU09fU0VUX0FERF9DT1VOVEVSUworCisjZGVmaW5lIElQNlRfU09fR0VUX0lORk8JCShJUDZUX0JBU0VfQ1RMKQorI2RlZmluZSBJUDZUX1NPX0dFVF9FTlRSSUVTCQkoSVA2VF9CQVNFX0NUTCArIDEpCisjZGVmaW5lIElQNlRfU09fR0VUX1JFVklTSU9OX01BVENICShJUDZUX0JBU0VfQ1RMICsgNCkKKyNkZWZpbmUgSVA2VF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCShJUDZUX0JBU0VfQ1RMICsgNSkKKyNkZWZpbmUgSVA2VF9TT19HRVRfTUFYCQkJSVA2VF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCisKKy8qIElDTVAgbWF0Y2hpbmcgc3R1ZmYgKi8KK3N0cnVjdCBpcDZ0X2ljbXAgeworCV9fdTggdHlwZTsJCQkJLyogdHlwZSB0byBtYXRjaCAqLworCV9fdTggY29kZVsyXTsJCQkJLyogcmFuZ2Ugb2YgY29kZSAqLworCV9fdTggaW52ZmxhZ3M7CQkJCS8qIEludmVyc2UgZmxhZ3MgKi8KK307CisKKy8qIFZhbHVlcyBmb3IgImludiIgZmllbGQgZm9yIHN0cnVjdCBpcHRfaWNtcC4gKi8KKyNkZWZpbmUgSVA2VF9JQ01QX0lOVgkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgdHlwZS9jb2RlIHRlc3QgKi8KKworLyogVGhlIGFyZ3VtZW50IHRvIElQNlRfU09fR0VUX0lORk8gKi8KK3N0cnVjdCBpcDZ0X2dldGluZm8geworCS8qIFdoaWNoIHRhYmxlOiBjYWxsZXIgZmlsbHMgdGhpcyBpbi4gKi8KKwljaGFyIG5hbWVbWFRfVEFCTEVfTUFYTkFNRUxFTl07CisKKwkvKiBLZXJuZWwgZmlsbHMgdGhlc2UgaW4uICovCisJLyogV2hpY2ggaG9vayBlbnRyeSBwb2ludHMgYXJlIHZhbGlkOiBiaXRtYXNrICovCisJdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOworCisJLyogSG9vayBlbnRyeSBwb2ludHM6IG9uZSBwZXIgbmV0ZmlsdGVyIGhvb2suICovCisJdW5zaWduZWQgaW50IGhvb2tfZW50cnlbTkZfSU5FVF9OVU1IT09LU107CisKKwkvKiBVbmRlcmZsb3cgcG9pbnRzLiAqLworCXVuc2lnbmVkIGludCB1bmRlcmZsb3dbTkZfSU5FVF9OVU1IT09LU107CisKKwkvKiBOdW1iZXIgb2YgZW50cmllcyAqLworCXVuc2lnbmVkIGludCBudW1fZW50cmllczsKKworCS8qIFNpemUgb2YgZW50cmllcy4gKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsKK307CisKKy8qIFRoZSBhcmd1bWVudCB0byBJUDZUX1NPX1NFVF9SRVBMQUNFLiAqLworc3RydWN0IGlwNnRfcmVwbGFjZSB7CisJLyogV2hpY2ggdGFibGUuICovCisJY2hhciBuYW1lW1hUX1RBQkxFX01BWE5BTUVMRU5dOworCisJLyogV2hpY2ggaG9vayBlbnRyeSBwb2ludHMgYXJlIHZhbGlkOiBiaXRtYXNrLiAgWW91IGNhbid0CisgICAgICAgICAgIGNoYW5nZSB0aGlzLiAqLworCXVuc2lnbmVkIGludCB2YWxpZF9ob29rczsKKworCS8qIE51bWJlciBvZiBlbnRyaWVzICovCisJdW5zaWduZWQgaW50IG51bV9lbnRyaWVzOworCisJLyogVG90YWwgc2l6ZSBvZiBuZXcgZW50cmllcyAqLworCXVuc2lnbmVkIGludCBzaXplOworCisJLyogSG9vayBlbnRyeSBwb2ludHMuICovCisJdW5zaWduZWQgaW50IGhvb2tfZW50cnlbTkZfSU5FVF9OVU1IT09LU107CisKKwkvKiBVbmRlcmZsb3cgcG9pbnRzLiAqLworCXVuc2lnbmVkIGludCB1bmRlcmZsb3dbTkZfSU5FVF9OVU1IT09LU107CisKKwkvKiBJbmZvcm1hdGlvbiBhYm91dCBvbGQgZW50cmllczogKi8KKwkvKiBOdW1iZXIgb2YgY291bnRlcnMgKG11c3QgYmUgZXF1YWwgdG8gY3VycmVudCBudW1iZXIgb2YgZW50cmllcykuICovCisJdW5zaWduZWQgaW50IG51bV9jb3VudGVyczsKKwkvKiBUaGUgb2xkIGVudHJpZXMnIGNvdW50ZXJzLiAqLworCXN0cnVjdCB4dF9jb3VudGVycyAqY291bnRlcnM7CisKKwkvKiBUaGUgZW50cmllcyAoaGFuZyBvZmYgZW5kOiBub3QgcmVhbGx5IGFuIGFycmF5KS4gKi8KKwlzdHJ1Y3QgaXA2dF9lbnRyeSBlbnRyaWVzWzBdOworfTsKKworLyogVGhlIGFyZ3VtZW50IHRvIElQNlRfU09fR0VUX0VOVFJJRVMuICovCitzdHJ1Y3QgaXA2dF9nZXRfZW50cmllcyB7CisJLyogV2hpY2ggdGFibGU6IHVzZXIgZmlsbHMgdGhpcyBpbi4gKi8KKwljaGFyIG5hbWVbWFRfVEFCTEVfTUFYTkFNRUxFTl07CisKKwkvKiBVc2VyIGZpbGxzIHRoaXMgaW46IHRvdGFsIGVudHJ5IHNpemUuICovCisJdW5zaWduZWQgaW50IHNpemU7CisKKwkvKiBUaGUgZW50cmllcy4gKi8KKwlzdHJ1Y3QgaXA2dF9lbnRyeSBlbnRyeXRhYmxlWzBdOworfTsKKworLyogSGVscGVyIGZ1bmN0aW9ucyAqLworc3RhdGljIF9faW5saW5lX18gc3RydWN0IHh0X2VudHJ5X3RhcmdldCAqCitpcDZ0X2dldF90YXJnZXQoc3RydWN0IGlwNnRfZW50cnkgKmUpCit7CisJcmV0dXJuICh2b2lkICopZSArIGUtPnRhcmdldF9vZmZzZXQ7Cit9CisKKy8qCisgKglNYWluIGZpcmV3YWxsIGNoYWlucyBkZWZpbml0aW9ucyBhbmQgZ2xvYmFsIHZhcidzIGRlZmluaXRpb25zLgorICovCisKKyNlbmRpZiAvKiBfSVA2X1RBQkxFU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfSEwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9ITC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZDhlYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfSEwuaApAQCAtMCwwICsxLDI0IEBACisvKiBIb3AgTGltaXQgbW9kaWZpY2F0aW9uIG1vZHVsZSBmb3IgaXA2dGFibGVzCisgKiBNYWNpZWogU29sdHlzaWFrIDxzb2x0QGRucy50b3hpY2ZpbG1zLnR2PgorICogQmFzZWQgb24gSFcncyBUVEwgbW9kdWxlICovCisKKyNpZm5kZWYgX0lQNlRfSExfSAorI2RlZmluZSBfSVA2VF9ITF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHsKKwlJUDZUX0hMX1NFVCA9IDAsCisJSVA2VF9ITF9JTkMsCisJSVA2VF9ITF9ERUMKK307CisKKyNkZWZpbmUgSVA2VF9ITF9NQVhNT0RFCUlQNlRfSExfREVDCisKK3N0cnVjdCBpcDZ0X0hMX2luZm8geworCV9fdTgJbW9kZTsKKwlfX3U4CWhvcF9saW1pdDsKK307CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfTE9HLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfTE9HLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkNTU3OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9MT0cuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9JUDZUX0xPR19ICisjZGVmaW5lIF9JUDZUX0xPR19ICisKKy8qIG1ha2Ugc3VyZSBub3QgdG8gY2hhbmdlIHRoaXMgd2l0aG91dCBjaGFuZ2luZyBuZXRmaWx0ZXIuaDpORl9MT0dfKiAoISkgKi8KKyNkZWZpbmUgSVA2VF9MT0dfVENQU0VRCQkweDAxCS8qIExvZyBUQ1Agc2VxdWVuY2UgbnVtYmVycyAqLworI2RlZmluZSBJUDZUX0xPR19UQ1BPUFQJCTB4MDIJLyogTG9nIFRDUCBvcHRpb25zICovCisjZGVmaW5lIElQNlRfTE9HX0lQT1BUCQkweDA0CS8qIExvZyBJUCBvcHRpb25zICovCisjZGVmaW5lIElQNlRfTE9HX1VJRAkJMHgwOAkvKiBMb2cgVUlEIG93bmluZyBsb2NhbCBzb2NrZXQgKi8KKyNkZWZpbmUgSVA2VF9MT0dfTkZMT0cJCTB4MTAJLyogVW5zdXBwb3J0ZWQsIGRvbid0IHVzZSAqLworI2RlZmluZSBJUDZUX0xPR19NQUNERUNPREUJMHgyMAkvKiBEZWNvZGUgTUFDIGhlYWRlciAqLworI2RlZmluZSBJUDZUX0xPR19NQVNLCQkweDJmCisKK3N0cnVjdCBpcDZ0X2xvZ19pbmZvIHsKKwl1bnNpZ25lZCBjaGFyIGxldmVsOworCXVuc2lnbmVkIGNoYXIgbG9nZmxhZ3M7CisJY2hhciBwcmVmaXhbMzBdOworfTsKKworI2VuZGlmIC8qX0lQVF9MT0dfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfUkVKRUNULmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfUkVKRUNULmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA1ZWQ2MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9SRUpFQ1QuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9JUDZUX1JFSkVDVF9ICisjZGVmaW5lIF9JUDZUX1JFSkVDVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIGlwNnRfcmVqZWN0X3dpdGggeworCUlQNlRfSUNNUDZfTk9fUk9VVEUsCisJSVA2VF9JQ01QNl9BRE1fUFJPSElCSVRFRCwKKwlJUDZUX0lDTVA2X05PVF9ORUlHSEJPVVIsCisJSVA2VF9JQ01QNl9BRERSX1VOUkVBQ0gsCisJSVA2VF9JQ01QNl9QT1JUX1VOUkVBQ0gsCisJSVA2VF9JQ01QNl9FQ0hPUkVQTFksCisJSVA2VF9UQ1BfUkVTRVQKK307CisKK3N0cnVjdCBpcDZ0X3JlamVjdF9pbmZvIHsKKwlfX3UzMgl3aXRoOwkvKiByZWplY3QgdHlwZSAqLworfTsKKworI2VuZGlmIC8qX0lQNlRfUkVKRUNUX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2FoLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfYWguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGEyYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2FoLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfSVA2VF9BSF9ICisjZGVmaW5lIF9JUDZUX0FIX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBpcDZ0X2FoIHsKKwlfX3UzMiBzcGlzWzJdOwkJCS8qIFNlY3VyaXR5IFBhcmFtZXRlciBJbmRleCAqLworCV9fdTMyIGhkcmxlbjsJCQkvKiBIZWFkZXIgTGVuZ3RoICovCisJX191OCAgaGRycmVzOwkJCS8qIFRlc3Qgb2YgdGhlIFJlc2VydmVkIEZpbGVkICovCisJX191OCAgaW52ZmxhZ3M7CQkJLyogSW52ZXJzZSBmbGFncyAqLworfTsKKworI2RlZmluZSBJUDZUX0FIX1NQSSAweDAxCisjZGVmaW5lIElQNlRfQUhfTEVOIDB4MDIKKyNkZWZpbmUgSVA2VF9BSF9SRVMgMHgwNAorCisvKiBWYWx1ZXMgZm9yICJpbnZmbGFncyIgZmllbGQgaW4gc3RydWN0IGlwNnRfYWguICovCisjZGVmaW5lIElQNlRfQUhfSU5WX1NQSQkJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIHNwaS4gKi8KKyNkZWZpbmUgSVA2VF9BSF9JTlZfTEVOCQkweDAyCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgbGVuZ3RoLiAqLworI2RlZmluZSBJUDZUX0FIX0lOVl9NQVNLCTB4MDMJLyogQWxsIHBvc3NpYmxlIGZsYWdzLiAqLworCisjZW5kaWYgLypfSVA2VF9BSF9IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9mcmFnLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfZnJhZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0N2Y2MWIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfZnJhZy5oCkBAIC0wLDAgKzEsMjUgQEAKKyNpZm5kZWYgX0lQNlRfRlJBR19ICisjZGVmaW5lIF9JUDZUX0ZSQUdfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGlwNnRfZnJhZyB7CisJX191MzIgaWRzWzJdOwkJCS8qIFNlY3VyaXR5IFBhcmFtZXRlciBJbmRleCAqLworCV9fdTMyIGhkcmxlbjsJCQkvKiBIZWFkZXIgTGVuZ3RoICovCisJX191OCAgZmxhZ3M7CQkJLyogICovCisJX191OCAgaW52ZmxhZ3M7CQkJLyogSW52ZXJzZSBmbGFncyAqLworfTsKKworI2RlZmluZSBJUDZUX0ZSQUdfSURTIAkJMHgwMQorI2RlZmluZSBJUDZUX0ZSQUdfTEVOIAkJMHgwMgorI2RlZmluZSBJUDZUX0ZSQUdfUkVTIAkJMHgwNAorI2RlZmluZSBJUDZUX0ZSQUdfRlNUIAkJMHgwOAorI2RlZmluZSBJUDZUX0ZSQUdfTUYgIAkJMHgxMAorI2RlZmluZSBJUDZUX0ZSQUdfTk1GICAJCTB4MjAKKworLyogVmFsdWVzIGZvciAiaW52ZmxhZ3MiIGZpZWxkIGluIHN0cnVjdCBpcDZ0X2ZyYWcuICovCisjZGVmaW5lIElQNlRfRlJBR19JTlZfSURTCTB4MDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBpZHMuICovCisjZGVmaW5lIElQNlRfRlJBR19JTlZfTEVOCTB4MDIJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBsZW5ndGguICovCisjZGVmaW5lIElQNlRfRlJBR19JTlZfTUFTSwkweDAzCS8qIEFsbCBwb3NzaWJsZSBmbGFncy4gKi8KKworI2VuZGlmIC8qX0lQNlRfRlJBR19IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9obC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2hsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3NmRiYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9obC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qIGlwNnRhYmxlcyBtb2R1bGUgZm9yIG1hdGNoaW5nIHRoZSBIb3AgTGltaXQgdmFsdWUKKyAqIE1hY2llaiBTb2x0eXNpYWsgPHNvbHRAZG5zLnRveGljZmlsbXMudHY+CisgKiBCYXNlZCBvbiBIVydzIHR0bCBtb2R1bGUgKi8KKworI2lmbmRlZiBfSVA2VF9ITF9ICisjZGVmaW5lIF9JUDZUX0hMX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2VudW0geworCUlQNlRfSExfRVEgPSAwLAkJLyogZXF1YWxzICovCisJSVA2VF9ITF9ORSwJCS8qIG5vdCBlcXVhbHMgKi8KKwlJUDZUX0hMX0xULAkJLyogbGVzcyB0aGFuICovCisJSVA2VF9ITF9HVCwJCS8qIGdyZWF0ZXIgdGhhbiAqLworfTsKKworCitzdHJ1Y3QgaXA2dF9obF9pbmZvIHsKKwlfX3U4CW1vZGU7CisJX191OAlob3BfbGltaXQ7Cit9OworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2lwdjZoZWFkZXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9pcHY2aGVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhZTNhMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9pcHY2aGVhZGVyLmgKQEAgLTAsMCArMSwyOCBAQAorLyogaXB2NmhlYWRlciBtYXRjaCAtIG1hdGNoZXMgSVB2NiBwYWNrZXRzIGJhc2VkCitvbiB3aGV0aGVyIHRoZXkgY29udGFpbiBjZXJ0YWluIGhlYWRlcnMgKi8KKworLyogT3JpZ2luYWwgaWRlYTogQnJhZCBDaGFwbWFuIAorICogUmV3cml0dGVuIGJ5OiBBbmRyYXMgS2lzLVN6YWJvIDxraXN6YUBzY2guYm1lLmh1PiAqLworCisKKyNpZm5kZWYgX19JUFY2SEVBREVSX0gKKyNkZWZpbmUgX19JUFY2SEVBREVSX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBpcDZ0X2lwdjZoZWFkZXJfaW5mbyB7CisJX191OCBtYXRjaGZsYWdzOworCV9fdTggaW52ZmxhZ3M7CisJX191OCBtb2RlZmxhZzsKK307CisKKyNkZWZpbmUgTUFTS19IT1BPUFRTICAgIDEyOAorI2RlZmluZSBNQVNLX0RTVE9QVFMgICAgNjQKKyNkZWZpbmUgTUFTS19ST1VUSU5HICAgIDMyCisjZGVmaW5lIE1BU0tfRlJBR01FTlQgICAxNgorI2RlZmluZSBNQVNLX0FIICAgICAgICAgOAorI2RlZmluZSBNQVNLX0VTUCAgICAgICAgNAorI2RlZmluZSBNQVNLX05PTkUgICAgICAgMgorI2RlZmluZSBNQVNLX1BST1RPICAgICAgMQorCisjZW5kaWYgLyogX19JUFY2SEVBREVSX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9taC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21oLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc3MjlhNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9taC5oCkBAIC0wLDAgKzEsMTYgQEAKKyNpZm5kZWYgX0lQNlRfTUhfSAorI2RlZmluZSBfSVA2VF9NSF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBNSCBtYXRjaGluZyBzdHVmZiAqLworc3RydWN0IGlwNnRfbWggeworCV9fdTggdHlwZXNbMl07CS8qIE1IIHR5cGUgcmFuZ2UgKi8KKwlfX3U4IGludmZsYWdzOwkvKiBJbnZlcnNlIGZsYWdzICovCit9OworCisvKiBWYWx1ZXMgZm9yICJpbnZmbGFncyIgZmllbGQgaW4gc3RydWN0IGlwNnRfbWguICovCisjZGVmaW5lIElQNlRfTUhfSU5WX1RZUEUJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIHR5cGUuICovCisjZGVmaW5lIElQNlRfTUhfSU5WX01BU0sJMHgwMQkvKiBBbGwgcG9zc2libGUgZmxhZ3MuICovCisKKyNlbmRpZiAvKl9JUDZUX01IX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X29wdHMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9vcHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdkNDE5YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9vcHRzLmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBfSVA2VF9PUFRTX0gKKyNkZWZpbmUgX0lQNlRfT1BUU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIElQNlRfT1BUU19PUFRTTlIgMTYKKworc3RydWN0IGlwNnRfb3B0cyB7CisJX191MzIgaGRybGVuOwkJCS8qIEhlYWRlciBMZW5ndGggKi8KKwlfX3U4IGZsYWdzOwkJCQkvKiAgKi8KKwlfX3U4IGludmZsYWdzOwkJCS8qIEludmVyc2UgZmxhZ3MgKi8KKwlfX3UxNiBvcHRzW0lQNlRfT1BUU19PUFRTTlJdOwkvKiBvcHRzICovCisJX191OCBvcHRzbnI7CQkJLyogTnIgb2YgT1B0cyAqLworfTsKKworI2RlZmluZSBJUDZUX09QVFNfTEVOIAkJMHgwMQorI2RlZmluZSBJUDZUX09QVFNfT1BUUyAJCTB4MDIKKyNkZWZpbmUgSVA2VF9PUFRTX05TVFJJQ1QJMHgwNAorCisvKiBWYWx1ZXMgZm9yICJpbnZmbGFncyIgZmllbGQgaW4gc3RydWN0IGlwNnRfcnQuICovCisjZGVmaW5lIElQNlRfT1BUU19JTlZfTEVOCTB4MDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBsZW5ndGguICovCisjZGVmaW5lIElQNlRfT1BUU19JTlZfTUFTSwkweDAxCS8qIEFsbCBwb3NzaWJsZSBmbGFncy4gKi8KKworI2VuZGlmIC8qX0lQNlRfT1BUU19IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9ydC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwNWE1ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9ydC5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgX0lQNlRfUlRfSAorI2RlZmluZSBfSVA2VF9SVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorLyojaW5jbHVkZSA8bGludXgvaW42Lmg+Ki8KKworI2RlZmluZSBJUDZUX1JUX0hPUFMgMTYKKworc3RydWN0IGlwNnRfcnQgeworCV9fdTMyIHJ0X3R5cGU7CQkJLyogUm91dGluZyBUeXBlICovCisJX191MzIgc2Vnc2xlZnRbMl07CQkJLyogU2VnbWVudHMgTGVmdCAqLworCV9fdTMyIGhkcmxlbjsJCQkvKiBIZWFkZXIgTGVuZ3RoICovCisJX191OCAgZmxhZ3M7CQkJLyogICovCisJX191OCAgaW52ZmxhZ3M7CQkJLyogSW52ZXJzZSBmbGFncyAqLworCXN0cnVjdCBpbjZfYWRkciBhZGRyc1tJUDZUX1JUX0hPUFNdOwkvKiBIb3BzICovCisJX191OCBhZGRybnI7CQkJLyogTnIgb2YgQWRkcmVzc2VzICovCit9OworCisjZGVmaW5lIElQNlRfUlRfVFlQIAkJMHgwMQorI2RlZmluZSBJUDZUX1JUX1NHUyAJCTB4MDIKKyNkZWZpbmUgSVA2VF9SVF9MRU4gCQkweDA0CisjZGVmaW5lIElQNlRfUlRfUkVTIAkJMHgwOAorI2RlZmluZSBJUDZUX1JUX0ZTVF9NQVNLCTB4MzAKKyNkZWZpbmUgSVA2VF9SVF9GU1QgCQkweDEwCisjZGVmaW5lIElQNlRfUlRfRlNUX05TVFJJQ1QJMHgyMAorCisvKiBWYWx1ZXMgZm9yICJpbnZmbGFncyIgZmllbGQgaW4gc3RydWN0IGlwNnRfcnQuICovCisjZGVmaW5lIElQNlRfUlRfSU5WX1RZUAkJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIHR5cGUuICovCisjZGVmaW5lIElQNlRfUlRfSU5WX1NHUwkJMHgwMgkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIFNlZ21lbnRzLiAqLworI2RlZmluZSBJUDZUX1JUX0lOVl9MRU4JCTB4MDQJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBsZW5ndGguICovCisjZGVmaW5lIElQNlRfUlRfSU5WX01BU0sJMHgwNwkvKiBBbGwgcG9zc2libGUgZmxhZ3MuICovCisKKyNlbmRpZiAvKl9JUDZUX1JUX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRsaW5rLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjI1N2ZjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKQEAgLTAsMCArMSwxNTEgQEAKKyNpZm5kZWYgX19MSU5VWF9ORVRMSU5LX0gKKyNkZWZpbmUgX19MSU5VWF9ORVRMSU5LX0gKKworI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPiAvKiBmb3IgX19rZXJuZWxfc2FfZmFtaWx5X3QgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIE5FVExJTktfUk9VVEUJCTAJLyogUm91dGluZy9kZXZpY2UgaG9vawkJCQkqLworI2RlZmluZSBORVRMSU5LX1VOVVNFRAkJMQkvKiBVbnVzZWQgbnVtYmVyCQkJCSovCisjZGVmaW5lIE5FVExJTktfVVNFUlNPQ0sJMgkvKiBSZXNlcnZlZCBmb3IgdXNlciBtb2RlIHNvY2tldCBwcm90b2NvbHMgCSovCisjZGVmaW5lIE5FVExJTktfRklSRVdBTEwJMwkvKiBGaXJld2FsbGluZyBob29rCQkJCSovCisjZGVmaW5lIE5FVExJTktfSU5FVF9ESUFHCTQJLyogSU5FVCBzb2NrZXQgbW9uaXRvcmluZwkJCSovCisjZGVmaW5lIE5FVExJTktfTkZMT0cJCTUJLyogbmV0ZmlsdGVyL2lwdGFibGVzIFVMT0cgKi8KKyNkZWZpbmUgTkVUTElOS19YRlJNCQk2CS8qIGlwc2VjICovCisjZGVmaW5lIE5FVExJTktfU0VMSU5VWAkJNwkvKiBTRUxpbnV4IGV2ZW50IG5vdGlmaWNhdGlvbnMgKi8KKyNkZWZpbmUgTkVUTElOS19JU0NTSQkJOAkvKiBPcGVuLWlTQ1NJICovCisjZGVmaW5lIE5FVExJTktfQVVESVQJCTkJLyogYXVkaXRpbmcgKi8KKyNkZWZpbmUgTkVUTElOS19GSUJfTE9PS1VQCTEwCQorI2RlZmluZSBORVRMSU5LX0NPTk5FQ1RPUgkxMQorI2RlZmluZSBORVRMSU5LX05FVEZJTFRFUgkxMgkvKiBuZXRmaWx0ZXIgc3Vic3lzdGVtICovCisjZGVmaW5lIE5FVExJTktfSVA2X0ZXCQkxMworI2RlZmluZSBORVRMSU5LX0ROUlRNU0cJCTE0CS8qIERFQ25ldCByb3V0aW5nIG1lc3NhZ2VzICovCisjZGVmaW5lIE5FVExJTktfS09CSkVDVF9VRVZFTlQJMTUJLyogS2VybmVsIG1lc3NhZ2VzIHRvIHVzZXJzcGFjZSAqLworI2RlZmluZSBORVRMSU5LX0dFTkVSSUMJCTE2CisvKiBsZWF2ZSByb29tIGZvciBORVRMSU5LX0RNIChETSBFdmVudHMpICovCisjZGVmaW5lIE5FVExJTktfU0NTSVRSQU5TUE9SVAkxOAkvKiBTQ1NJIFRyYW5zcG9ydHMgKi8KKyNkZWZpbmUgTkVUTElOS19FQ1JZUFRGUwkxOQorI2RlZmluZSBORVRMSU5LX1JETUEJCTIwCisjZGVmaW5lIE5FVExJTktfQ1JZUFRPCQkyMQkvKiBDcnlwdG8gbGF5ZXIgKi8KKworI2RlZmluZSBNQVhfTElOS1MgMzIJCQorCitzdHJ1Y3Qgc29ja2FkZHJfbmwgeworCV9fa2VybmVsX3NhX2ZhbWlseV90CW5sX2ZhbWlseTsJLyogQUZfTkVUTElOSwkqLworCXVuc2lnbmVkIHNob3J0CW5sX3BhZDsJCS8qIHplcm8JCSovCisJX191MzIJCW5sX3BpZDsJCS8qIHBvcnQgSUQJKi8KKyAgICAgICAJX191MzIJCW5sX2dyb3VwczsJLyogbXVsdGljYXN0IGdyb3VwcyBtYXNrICovCit9OworCitzdHJ1Y3Qgbmxtc2doZHIgeworCV9fdTMyCQlubG1zZ19sZW47CS8qIExlbmd0aCBvZiBtZXNzYWdlIGluY2x1ZGluZyBoZWFkZXIgKi8KKwlfX3UxNgkJbmxtc2dfdHlwZTsJLyogTWVzc2FnZSBjb250ZW50ICovCisJX191MTYJCW5sbXNnX2ZsYWdzOwkvKiBBZGRpdGlvbmFsIGZsYWdzICovCisJX191MzIJCW5sbXNnX3NlcTsJLyogU2VxdWVuY2UgbnVtYmVyICovCisJX191MzIJCW5sbXNnX3BpZDsJLyogU2VuZGluZyBwcm9jZXNzIHBvcnQgSUQgKi8KK307CisKKy8qIEZsYWdzIHZhbHVlcyAqLworCisjZGVmaW5lIE5MTV9GX1JFUVVFU1QJCTEJLyogSXQgaXMgcmVxdWVzdCBtZXNzYWdlLiAJKi8KKyNkZWZpbmUgTkxNX0ZfTVVMVEkJCTIJLyogTXVsdGlwYXJ0IG1lc3NhZ2UsIHRlcm1pbmF0ZWQgYnkgTkxNU0dfRE9ORSAqLworI2RlZmluZSBOTE1fRl9BQ0sJCTQJLyogUmVwbHkgd2l0aCBhY2ssIHdpdGggemVybyBvciBlcnJvciBjb2RlICovCisjZGVmaW5lIE5MTV9GX0VDSE8JCTgJLyogRWNobyB0aGlzIHJlcXVlc3QgCQkqLworI2RlZmluZSBOTE1fRl9EVU1QX0lOVFIJCTE2CS8qIER1bXAgd2FzIGluY29uc2lzdGVudCBkdWUgdG8gc2VxdWVuY2UgY2hhbmdlICovCisKKy8qIE1vZGlmaWVycyB0byBHRVQgcmVxdWVzdCAqLworI2RlZmluZSBOTE1fRl9ST09UCTB4MTAwCS8qIHNwZWNpZnkgdHJlZQlyb290CSovCisjZGVmaW5lIE5MTV9GX01BVENICTB4MjAwCS8qIHJldHVybiBhbGwgbWF0Y2hpbmcJKi8KKyNkZWZpbmUgTkxNX0ZfQVRPTUlDCTB4NDAwCS8qIGF0b21pYyBHRVQJCSovCisjZGVmaW5lIE5MTV9GX0RVTVAJKE5MTV9GX1JPT1R8TkxNX0ZfTUFUQ0gpCisKKy8qIE1vZGlmaWVycyB0byBORVcgcmVxdWVzdCAqLworI2RlZmluZSBOTE1fRl9SRVBMQUNFCTB4MTAwCS8qIE92ZXJyaWRlIGV4aXN0aW5nCQkqLworI2RlZmluZSBOTE1fRl9FWENMCTB4MjAwCS8qIERvIG5vdCB0b3VjaCwgaWYgaXQgZXhpc3RzCSovCisjZGVmaW5lIE5MTV9GX0NSRUFURQkweDQwMAkvKiBDcmVhdGUsIGlmIGl0IGRvZXMgbm90IGV4aXN0CSovCisjZGVmaW5lIE5MTV9GX0FQUEVORAkweDgwMAkvKiBBZGQgdG8gZW5kIG9mIGxpc3QJCSovCisKKy8qCisgICA0LjRCU0QgQURECQlOTE1fRl9DUkVBVEV8TkxNX0ZfRVhDTAorICAgNC40QlNEIENIQU5HRQlOTE1fRl9SRVBMQUNFCisKKyAgIFRydWUgQ0hBTkdFCQlOTE1fRl9DUkVBVEV8TkxNX0ZfUkVQTEFDRQorICAgQXBwZW5kCQlOTE1fRl9DUkVBVEUKKyAgIENoZWNrCQlOTE1fRl9FWENMCisgKi8KKworI2RlZmluZSBOTE1TR19BTElHTlRPCTRVCisjZGVmaW5lIE5MTVNHX0FMSUdOKGxlbikgKCAoKGxlbikrTkxNU0dfQUxJR05UTy0xKSAmIH4oTkxNU0dfQUxJR05UTy0xKSApCisjZGVmaW5lIE5MTVNHX0hEUkxFTgkgKChpbnQpIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3Qgbmxtc2doZHIpKSkKKyNkZWZpbmUgTkxNU0dfTEVOR1RIKGxlbikgKChsZW4pK05MTVNHX0FMSUdOKE5MTVNHX0hEUkxFTikpCisjZGVmaW5lIE5MTVNHX1NQQUNFKGxlbikgTkxNU0dfQUxJR04oTkxNU0dfTEVOR1RIKGxlbikpCisjZGVmaW5lIE5MTVNHX0RBVEEobmxoKSAgKCh2b2lkKikoKChjaGFyKilubGgpICsgTkxNU0dfTEVOR1RIKDApKSkKKyNkZWZpbmUgTkxNU0dfTkVYVChubGgsbGVuKQkgKChsZW4pIC09IE5MTVNHX0FMSUdOKChubGgpLT5ubG1zZ19sZW4pLCBcCisJCQkJICAoc3RydWN0IG5sbXNnaGRyKikoKChjaGFyKikobmxoKSkgKyBOTE1TR19BTElHTigobmxoKS0+bmxtc2dfbGVuKSkpCisjZGVmaW5lIE5MTVNHX09LKG5saCxsZW4pICgobGVuKSA+PSAoaW50KXNpemVvZihzdHJ1Y3Qgbmxtc2doZHIpICYmIFwKKwkJCSAgIChubGgpLT5ubG1zZ19sZW4gPj0gc2l6ZW9mKHN0cnVjdCBubG1zZ2hkcikgJiYgXAorCQkJICAgKG5saCktPm5sbXNnX2xlbiA8PSAobGVuKSkKKyNkZWZpbmUgTkxNU0dfUEFZTE9BRChubGgsbGVuKSAoKG5saCktPm5sbXNnX2xlbiAtIE5MTVNHX1NQQUNFKChsZW4pKSkKKworI2RlZmluZSBOTE1TR19OT09QCQkweDEJLyogTm90aGluZy4JCSovCisjZGVmaW5lIE5MTVNHX0VSUk9SCQkweDIJLyogRXJyb3IJCSovCisjZGVmaW5lIE5MTVNHX0RPTkUJCTB4MwkvKiBFbmQgb2YgYSBkdW1wCSovCisjZGVmaW5lIE5MTVNHX09WRVJSVU4JCTB4NAkvKiBEYXRhIGxvc3QJCSovCisKKyNkZWZpbmUgTkxNU0dfTUlOX1RZUEUJCTB4MTAJLyogPCAweDEwOiByZXNlcnZlZCBjb250cm9sIG1lc3NhZ2VzICovCisKK3N0cnVjdCBubG1zZ2VyciB7CisJaW50CQllcnJvcjsKKwlzdHJ1Y3Qgbmxtc2doZHIgbXNnOworfTsKKworI2RlZmluZSBORVRMSU5LX0FERF9NRU1CRVJTSElQCTEKKyNkZWZpbmUgTkVUTElOS19EUk9QX01FTUJFUlNISVAJMgorI2RlZmluZSBORVRMSU5LX1BLVElORk8JCTMKKyNkZWZpbmUgTkVUTElOS19CUk9BRENBU1RfRVJST1IJNAorI2RlZmluZSBORVRMSU5LX05PX0VOT0JVRlMJNQorCitzdHJ1Y3QgbmxfcGt0aW5mbyB7CisJX191MzIJZ3JvdXA7Cit9OworCisjZGVmaW5lIE5FVF9NQUpPUiAzNgkJLyogTWFqb3IgMzYgaXMgcmVzZXJ2ZWQgZm9yIG5ldHdvcmtpbmcgCQkJCQkJKi8KKworZW51bSB7CisJTkVUTElOS19VTkNPTk5FQ1RFRCA9IDAsCisJTkVUTElOS19DT05ORUNURUQsCit9OworCisvKgorICogIDwtLS0tLS0tIE5MQV9IRFJMRU4gLS0tLS0tPiA8LS0gTkxBX0FMSUdOKHBheWxvYWQpLS0+CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0gLSAtKy0gLSAtIC0gLSAtIC0gLSAtIC0rLSAtIC0rCisgKiB8ICAgICAgICBIZWFkZXIgICAgICAgfCBQYWQgfCAgICAgUGF5bG9hZCAgICAgICB8IFBhZCB8CisgKiB8ICAgKHN0cnVjdCBubGF0dHIpICAgfCBpbmcgfCAgICAgICAgICAgICAgICAgICB8IGluZyB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0gLSAtKy0gLSAtIC0gLSAtIC0gLSAtIC0rLSAtIC0rCisgKiAgPC0tLS0tLS0tLS0tLS0tIG5sYXR0ci0+bmxhX2xlbiAtLS0tLS0tLS0tLS0tLT4KKyAqLworCitzdHJ1Y3QgbmxhdHRyIHsKKwlfX3UxNiAgICAgICAgICAgbmxhX2xlbjsKKwlfX3UxNiAgICAgICAgICAgbmxhX3R5cGU7Cit9OworCisvKgorICogbmxhX3R5cGUgKDE2IGJpdHMpCisgKiArLS0tKy0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogfCBOIHwgTyB8IEF0dHJpYnV0ZSBUeXBlICAgICAgICAgICAgICAgIHwKKyAqICstLS0rLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiBOIDo9IENhcnJpZXMgbmVzdGVkIGF0dHJpYnV0ZXMKKyAqIE8gOj0gUGF5bG9hZCBzdG9yZWQgaW4gbmV0d29yayBieXRlIG9yZGVyCisgKgorICogTm90ZTogVGhlIE4gYW5kIE8gZmxhZyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorICovCisjZGVmaW5lIE5MQV9GX05FU1RFRAkJKDEgPDwgMTUpCisjZGVmaW5lIE5MQV9GX05FVF9CWVRFT1JERVIJKDEgPDwgMTQpCisjZGVmaW5lIE5MQV9UWVBFX01BU0sJCX4oTkxBX0ZfTkVTVEVEIHwgTkxBX0ZfTkVUX0JZVEVPUkRFUikKKworI2RlZmluZSBOTEFfQUxJR05UTwkJNAorI2RlZmluZSBOTEFfQUxJR04obGVuKQkJKCgobGVuKSArIE5MQV9BTElHTlRPIC0gMSkgJiB+KE5MQV9BTElHTlRPIC0gMSkpCisjZGVmaW5lIE5MQV9IRFJMRU4JCSgoaW50KSBOTEFfQUxJR04oc2l6ZW9mKHN0cnVjdCBubGF0dHIpKSkKKworCisjZW5kaWYJLyogX19MSU5VWF9ORVRMSU5LX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0cm9tLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldHJvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNzMxM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldHJvbS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHB1YmxpYyBlbGVtZW50cyBvZiB0aGUgTGludXgga2VybmVsIE5FVC9ST00gaW1wbGVtZW50YXRpb24uCisgKiBGb3Iga2VybmVsIEFYLjI1IHNlZSB0aGUgZmlsZSBheDI1LmguIFRoaXMgZmlsZSByZXF1aXJlcyBheDI1LmggZm9yIHRoZQorICogZGVmaW5pdGlvbiBvZiB0aGUgYXgyNV9hZGRyZXNzIHN0cnVjdHVyZS4KKyAqLworCisjaWZuZGVmCU5FVFJPTV9LRVJORUxfSAorI2RlZmluZQlORVRST01fS0VSTkVMX0gKKworI2luY2x1ZGUgPGxpbnV4L2F4MjUuaD4KKworI2RlZmluZSBORVRST01fTVRVCTIzNgorCisjZGVmaW5lIE5FVFJPTV9UMQkxCisjZGVmaW5lIE5FVFJPTV9UMgkyCisjZGVmaW5lIE5FVFJPTV9OMgkzCisjZGVmaW5lCU5FVFJPTV9UNAk2CisjZGVmaW5lCU5FVFJPTV9JRExFCTcKKworI2RlZmluZQlTSU9DTlJERUNPQlMJCShTSU9DUFJPVE9QUklWQVRFKzIpCisKK3N0cnVjdCBucl9yb3V0ZV9zdHJ1Y3QgeworI2RlZmluZQlORVRST01fTkVJR0gJMAorI2RlZmluZQlORVRST01fTk9ERQkxCisJaW50CQl0eXBlOworCWF4MjVfYWRkcmVzcwljYWxsc2lnbjsKKwljaGFyCQlkZXZpY2VbMTZdOworCXVuc2lnbmVkIGludAlxdWFsaXR5OworCWNoYXIJCW1uZW1vbmljWzddOworCWF4MjVfYWRkcmVzcwluZWlnaGJvdXI7CisJdW5zaWduZWQgaW50CW9ic19jb3VudDsKKwl1bnNpZ25lZCBpbnQJbmRpZ2lzOworCWF4MjVfYWRkcmVzcwlkaWdpcGVhdGVyc1tBWDI1X01BWF9ESUdJU107Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MDViNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mcy5oCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogTkZTIHByb3RvY29sIGRlZmluaXRpb25zCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvbnN0YW50cyBtb3N0bHkgZm9yIFZlcnNpb24gMiBvZiB0aGUgcHJvdG9jb2wsCisgKiBidXQgYWxzbyBoYXMgYSBjb3VwbGUgb2YgTkZTdjMgYml0cyBpbiAobm90YWJseSB0aGUgZXJyb3IgY29kZXMpLgorICovCisjaWZuZGVmIF9MSU5VWF9ORlNfSAorI2RlZmluZSBfTElOVVhfTkZTX0gKKworI2RlZmluZSBORlNfUFJPR1JBTQkxMDAwMDMKKyNkZWZpbmUgTkZTX1BPUlQJMjA0OQorI2RlZmluZSBORlNfTUFYREFUQQk4MTkyCisjZGVmaW5lIE5GU19NQVhQQVRITEVOCTEwMjQKKyNkZWZpbmUgTkZTX01BWE5BTUxFTgkyNTUKKyNkZWZpbmUgTkZTX01BWEdST1VQUwkxNgorI2RlZmluZSBORlNfRkhTSVpFCTMyCisjZGVmaW5lIE5GU19DT09LSUVTSVpFCTQKKyNkZWZpbmUgTkZTX0ZJRk9fREVWCSgtMSkKKyNkZWZpbmUgTkZTTU9ERV9GTVQJMDE3MDAwMAorI2RlZmluZSBORlNNT0RFX0RJUgkwMDQwMDAwCisjZGVmaW5lIE5GU01PREVfQ0hSCTAwMjAwMDAKKyNkZWZpbmUgTkZTTU9ERV9CTEsJMDA2MDAwMAorI2RlZmluZSBORlNNT0RFX1JFRwkwMTAwMDAwCisjZGVmaW5lIE5GU01PREVfTE5LCTAxMjAwMDAKKyNkZWZpbmUgTkZTTU9ERV9TT0NLCTAxNDAwMDAKKyNkZWZpbmUgTkZTTU9ERV9GSUZPCTAwMTAwMDAKKworI2RlZmluZSBORlNfTU5UX1BST0dSQU0JCTEwMDAwNQorI2RlZmluZSBORlNfTU5UX1ZFUlNJT04JCTEKKyNkZWZpbmUgTkZTX01OVDNfVkVSU0lPTgkzCisKKyNkZWZpbmUgTkZTX1BJUEVfRElSTkFNRSAiL25mcyIKKworLyoKKyAqIE5GUyBzdGF0cy4gVGhlIGdvb2QgdGhpbmcgd2l0aCB0aGVzZSB2YWx1ZXMgaXMgdGhhdCBORlN2MyBlcnJvcnMgYXJlCisgKiBhIHN1cGVyc2V0IG9mIE5GU3YyIGVycm9ycyAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIE5GU0VSUl9XRkxVU0ggd2hpY2gKKyAqIG5vLW9uZSB1c2VzIGFueXdheSksIHNvIHdlIGNhbiBoYXBwaWx5IG1peCBjb2RlIGFzIGxvbmcgYXMgd2UgbWFrZSBzdXJlCisgKiBubyBORlN2MyBlcnJvcnMgYXJlIHJldHVybmVkIHRvIE5GU3YyIGNsaWVudHMuCisgKiBFcnJvciBjb2RlcyB0aGF0IGhhdmUgYSBgLS0nIGluIHRoZSB2MiBjb2x1bW4gYXJlIG5vdCBwYXJ0IG9mIHRoZQorICogc3RhbmRhcmQsIGJ1dCBzZWVtIHRvIGJlIHdpZGVseSB1c2VkIG5ldmVydGhlbGVzcy4KKyAqLworIGVudW0gbmZzX3N0YXQgeworCU5GU19PSyA9IDAsCQkJLyogdjIgdjMgdjQgKi8KKwlORlNFUlJfUEVSTSA9IDEsCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9OT0VOVCA9IDIsCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9JTyA9IDUsCQkJLyogdjIgdjMgdjQgKi8KKwlORlNFUlJfTlhJTyA9IDYsCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9FQUdBSU4gPSAxMSwJCS8qIHYyIHYzICovCisJTkZTRVJSX0FDQ0VTID0gMTMsCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9FWElTVCA9IDE3LAkJLyogdjIgdjMgdjQgKi8KKwlORlNFUlJfWERFViA9IDE4LAkJLyogICAgdjMgdjQgKi8KKwlORlNFUlJfTk9ERVYgPSAxOSwJCS8qIHYyIHYzIHY0ICovCisJTkZTRVJSX05PVERJUiA9IDIwLAkJLyogdjIgdjMgdjQgKi8KKwlORlNFUlJfSVNESVIgPSAyMSwJCS8qIHYyIHYzIHY0ICovCisJTkZTRVJSX0lOVkFMID0gMjIsCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9GQklHID0gMjcsCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9OT1NQQyA9IDI4LAkJLyogdjIgdjMgdjQgKi8KKwlORlNFUlJfUk9GUyA9IDMwLAkJLyogdjIgdjMgdjQgKi8KKwlORlNFUlJfTUxJTksgPSAzMSwJCS8qICAgIHYzIHY0ICovCisJTkZTRVJSX09QTk9UU1VQUCA9IDQ1LAkJLyogdjIgdjMgKi8KKwlORlNFUlJfTkFNRVRPT0xPTkcgPSA2MywJLyogdjIgdjMgdjQgKi8KKwlORlNFUlJfTk9URU1QVFkgPSA2NiwJCS8qIHYyIHYzIHY0ICovCisJTkZTRVJSX0RRVU9UID0gNjksCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9TVEFMRSA9IDcwLAkJLyogdjIgdjMgdjQgKi8KKwlORlNFUlJfUkVNT1RFID0gNzEsCQkvKiB2MiB2MyAqLworCU5GU0VSUl9XRkxVU0ggPSA5OSwJCS8qIHYyICAgICovCisJTkZTRVJSX0JBREhBTkRMRSA9IDEwMDAxLAkvKiAgICB2MyB2NCAqLworCU5GU0VSUl9OT1RfU1lOQyA9IDEwMDAyLAkvKiAgICB2MyAqLworCU5GU0VSUl9CQURfQ09PS0lFID0gMTAwMDMsCS8qICAgIHYzIHY0ICovCisJTkZTRVJSX05PVFNVUFAgPSAxMDAwNCwJCS8qICAgIHYzIHY0ICovCisJTkZTRVJSX1RPT1NNQUxMID0gMTAwMDUsCS8qICAgIHYzIHY0ICovCisJTkZTRVJSX1NFUlZFUkZBVUxUID0gMTAwMDYsCS8qICAgIHYzIHY0ICovCisJTkZTRVJSX0JBRFRZUEUgPSAxMDAwNywJCS8qICAgIHYzIHY0ICovCisJTkZTRVJSX0pVS0VCT1ggPSAxMDAwOCwJCS8qICAgIHYzIHY0ICovCisJTkZTRVJSX1NBTUUgPSAxMDAwOSwJCS8qICAgICAgIHY0ICovCisJTkZTRVJSX0RFTklFRCA9IDEwMDEwLAkJLyogICAgICAgdjQgKi8KKwlORlNFUlJfRVhQSVJFRCA9IDEwMDExLAkJLyogICAgICAgdjQgKi8KKwlORlNFUlJfTE9DS0VEID0gMTAwMTIsCQkvKiAgICAgICB2NCAqLworCU5GU0VSUl9HUkFDRSA9IDEwMDEzLAkJLyogICAgICAgdjQgKi8KKwlORlNFUlJfRkhFWFBJUkVEID0gMTAwMTQsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX1NIQVJFX0RFTklFRCA9IDEwMDE1LAkvKiAgICAgICB2NCAqLworCU5GU0VSUl9XUk9OR1NFQyA9IDEwMDE2LAkvKiAgICAgICB2NCAqLworCU5GU0VSUl9DTElEX0lOVVNFID0gMTAwMTcsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX1JFU09VUkNFID0gMTAwMTgsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX01PVkVEID0gMTAwMTksCQkvKiAgICAgICB2NCAqLworCU5GU0VSUl9OT0ZJTEVIQU5ETEUgPSAxMDAyMCwJLyogICAgICAgdjQgKi8KKwlORlNFUlJfTUlOT1JfVkVSU19NSVNNQVRDSCA9IDEwMDIxLCAgIC8qIHY0ICovCisJTkZTRVJSX1NUQUxFX0NMSUVOVElEID0gMTAwMjIsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX1NUQUxFX1NUQVRFSUQgPSAxMDAyMywgICAvKiAgICAgICB2NCAqLworCU5GU0VSUl9PTERfU1RBVEVJRCA9IDEwMDI0LCAgICAgLyogICAgICAgdjQgKi8KKwlORlNFUlJfQkFEX1NUQVRFSUQgPSAxMDAyNSwgICAgIC8qICAgICAgIHY0ICovICAKKwlORlNFUlJfQkFEX1NFUUlEID0gMTAwMjYsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX05PVF9TQU1FID0gMTAwMjcsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX0xPQ0tfUkFOR0UgPSAxMDAyOCwJLyogICAgICAgdjQgKi8KKwlORlNFUlJfU1lNTElOSyA9IDEwMDI5LAkJLyogICAgICAgdjQgKi8KKwlORlNFUlJfUkVTVE9SRUZIID0gMTAwMzAsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX0xFQVNFX01PVkVEID0gMTAwMzEsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX0FUVFJOT1RTVVBQID0gMTAwMzIsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX05PX0dSQUNFID0gMTAwMzMsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX1JFQ0xBSU1fQkFEID0gMTAwMzQsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX1JFQ0xBSU1fQ09ORkxJQ1QgPSAxMDAzNSwvKiAgICAgICB2NCAqLworCU5GU0VSUl9CQURfWERSID0gMTAwMzYsCQkvKiAgICAgICB2NCAqLworCU5GU0VSUl9MT0NLU19IRUxEID0gMTAwMzcsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX09QRU5NT0RFID0gMTAwMzgsICAgICAgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX0JBRE9XTkVSID0gMTAwMzksICAgICAgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX0JBRENIQVIgPSAxMDA0MCwgICAgICAgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX0JBRE5BTUUgPSAxMDA0MSwgICAgICAgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX0JBRF9SQU5HRSA9IDEwMDQyLCAgICAgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX0xPQ0tfTk9UU1VQUCA9IDEwMDQzLCAgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX09QX0lMTEVHQUwgPSAxMDA0NCwgICAgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX0RFQURMT0NLID0gMTAwNDUsICAgICAgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX0ZJTEVfT1BFTiA9IDEwMDQ2LCAgICAgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX0FETUlOX1JFVk9LRUQgPSAxMDA0NywgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX0NCX1BBVEhfRE9XTiA9IDEwMDQ4LCAgIC8qICAgICAgIHY0ICovCit9OworCisvKiBORlN2MiBmaWxlIHR5cGVzIC0gYmV3YXJlLCB0aGVzZSBhcmUgbm90IHRoZSBzYW1lIGluIE5GU3YzICovCisKK2VudW0gbmZzX2Z0eXBlIHsKKwlORk5PTiA9IDAsCisJTkZSRUcgPSAxLAorCU5GRElSID0gMiwKKwlORkJMSyA9IDMsCisJTkZDSFIgPSA0LAorCU5GTE5LID0gNSwKKwlORlNPQ0sgPSA2LAorCU5GQkFEID0gNywKKwlORkZJRk8gPSA4Cit9OworCisjZW5kaWYgLyogX0xJTlVYX05GU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mczIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZTI0YjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mczIuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogTkZTIHByb3RvY29sIGRlZmluaXRpb25zCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvbnN0YW50cyBmb3IgVmVyc2lvbiAyIG9mIHRoZSBwcm90b2NvbC4KKyAqLworI2lmbmRlZiBfTElOVVhfTkZTMl9ICisjZGVmaW5lIF9MSU5VWF9ORlMyX0gKKworI2RlZmluZSBORlMyX1BPUlQJMjA0OQorI2RlZmluZSBORlMyX01BWERBVEEJODE5MgorI2RlZmluZSBORlMyX01BWFBBVEhMRU4JMTAyNAorI2RlZmluZSBORlMyX01BWE5BTUxFTgkyNTUKKyNkZWZpbmUgTkZTMl9NQVhHUk9VUFMJMTYKKyNkZWZpbmUgTkZTMl9GSFNJWkUJMzIKKyNkZWZpbmUgTkZTMl9DT09LSUVTSVpFCTQKKyNkZWZpbmUgTkZTMl9GSUZPX0RFVgkoLTEpCisjZGVmaW5lIE5GUzJNT0RFX0ZNVAkwMTcwMDAwCisjZGVmaW5lIE5GUzJNT0RFX0RJUgkwMDQwMDAwCisjZGVmaW5lIE5GUzJNT0RFX0NIUgkwMDIwMDAwCisjZGVmaW5lIE5GUzJNT0RFX0JMSwkwMDYwMDAwCisjZGVmaW5lIE5GUzJNT0RFX1JFRwkwMTAwMDAwCisjZGVmaW5lIE5GUzJNT0RFX0xOSwkwMTIwMDAwCisjZGVmaW5lIE5GUzJNT0RFX1NPQ0sJMDE0MDAwMAorI2RlZmluZSBORlMyTU9ERV9GSUZPCTAwMTAwMDAKKworCisvKiBORlN2MiBmaWxlIHR5cGVzIC0gYmV3YXJlLCB0aGVzZSBhcmUgbm90IHRoZSBzYW1lIGluIE5GU3YzICovCitlbnVtIG5mczJfZnR5cGUgeworCU5GMk5PTiA9IDAsCisJTkYyUkVHID0gMSwKKwlORjJESVIgPSAyLAorCU5GMkJMSyA9IDMsCisJTkYyQ0hSID0gNCwKKwlORjJMTksgPSA1LAorCU5GMlNPQ0sgPSA2LAorCU5GMkJBRCA9IDcsCisJTkYyRklGTyA9IDgKK307CisKK3N0cnVjdCBuZnMyX2ZoIHsKKwljaGFyCQkJZGF0YVtORlMyX0ZIU0laRV07Cit9OworCisvKgorICogUHJvY2VkdXJlIG51bWJlcnMgZm9yIE5GU3YyCisgKi8KKyNkZWZpbmUgTkZTMl9WRVJTSU9OCQkyCisjZGVmaW5lIE5GU1BST0NfTlVMTAkJMAorI2RlZmluZSBORlNQUk9DX0dFVEFUVFIJCTEKKyNkZWZpbmUgTkZTUFJPQ19TRVRBVFRSCQkyCisjZGVmaW5lIE5GU1BST0NfUk9PVAkJMworI2RlZmluZSBORlNQUk9DX0xPT0tVUAkJNAorI2RlZmluZSBORlNQUk9DX1JFQURMSU5LCTUKKyNkZWZpbmUgTkZTUFJPQ19SRUFECQk2CisjZGVmaW5lIE5GU1BST0NfV1JJVEVDQUNIRQk3CisjZGVmaW5lIE5GU1BST0NfV1JJVEUJCTgKKyNkZWZpbmUgTkZTUFJPQ19DUkVBVEUJCTkKKyNkZWZpbmUgTkZTUFJPQ19SRU1PVkUJCTEwCisjZGVmaW5lIE5GU1BST0NfUkVOQU1FCQkxMQorI2RlZmluZSBORlNQUk9DX0xJTksJCTEyCisjZGVmaW5lIE5GU1BST0NfU1lNTElOSwkJMTMKKyNkZWZpbmUgTkZTUFJPQ19NS0RJUgkJMTQKKyNkZWZpbmUgTkZTUFJPQ19STURJUgkJMTUKKyNkZWZpbmUgTkZTUFJPQ19SRUFERElSCQkxNgorI2RlZmluZSBORlNQUk9DX1NUQVRGUwkJMTcKKworI2VuZGlmIC8qIF9MSU5VWF9ORlMyX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzMy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnMzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjZmU0MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzMy5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBORlN2MyBwcm90b2NvbCBkZWZpbml0aW9ucworICovCisjaWZuZGVmIF9MSU5VWF9ORlMzX0gKKyNkZWZpbmUgX0xJTlVYX05GUzNfSAorCisjZGVmaW5lIE5GUzNfUE9SVAkJMjA0OQorI2RlZmluZSBORlMzX01BWERBVEEJCTMyNzY4CisjZGVmaW5lIE5GUzNfTUFYUEFUSExFTgkJUEFUSF9NQVgKKyNkZWZpbmUgTkZTM19NQVhOQU1MRU4JCU5BTUVfTUFYCisjZGVmaW5lIE5GUzNfTUFYR1JPVVBTCQkxNgorI2RlZmluZSBORlMzX0ZIU0laRQkJNjQKKyNkZWZpbmUgTkZTM19DT09LSUVTSVpFCQk0CisjZGVmaW5lIE5GUzNfQ1JFQVRFVkVSRlNJWkUJOAorI2RlZmluZSBORlMzX0NPT0tJRVZFUkZTSVpFCTgKKyNkZWZpbmUgTkZTM19XUklURVZFUkZTSVpFCTgKKyNkZWZpbmUgTkZTM19GSUZPX0RFVgkJKC0xKQorI2RlZmluZSBORlMzTU9ERV9GTVQJCTAxNzAwMDAKKyNkZWZpbmUgTkZTM01PREVfRElSCQkwMDQwMDAwCisjZGVmaW5lIE5GUzNNT0RFX0NIUgkJMDAyMDAwMAorI2RlZmluZSBORlMzTU9ERV9CTEsJCTAwNjAwMDAKKyNkZWZpbmUgTkZTM01PREVfUkVHCQkwMTAwMDAwCisjZGVmaW5lIE5GUzNNT0RFX0xOSwkJMDEyMDAwMAorI2RlZmluZSBORlMzTU9ERV9TT0NLCQkwMTQwMDAwCisjZGVmaW5lIE5GUzNNT0RFX0ZJRk8JCTAwMTAwMDAKKworLyogRmxhZ3MgZm9yIGFjY2VzcygpIGNhbGwgKi8KKyNkZWZpbmUgTkZTM19BQ0NFU1NfUkVBRAkweDAwMDEKKyNkZWZpbmUgTkZTM19BQ0NFU1NfTE9PS1VQCTB4MDAwMgorI2RlZmluZSBORlMzX0FDQ0VTU19NT0RJRlkJMHgwMDA0CisjZGVmaW5lIE5GUzNfQUNDRVNTX0VYVEVORAkweDAwMDgKKyNkZWZpbmUgTkZTM19BQ0NFU1NfREVMRVRFCTB4MDAxMAorI2RlZmluZSBORlMzX0FDQ0VTU19FWEVDVVRFCTB4MDAyMAorI2RlZmluZSBORlMzX0FDQ0VTU19GVUxMCTB4MDAzZgorCisvKiBGbGFncyBmb3IgY3JlYXRlIG1vZGUgKi8KK2VudW0gbmZzM19jcmVhdGVtb2RlIHsKKwlORlMzX0NSRUFURV9VTkNIRUNLRUQgPSAwLAorCU5GUzNfQ1JFQVRFX0dVQVJERUQgPSAxLAorCU5GUzNfQ1JFQVRFX0VYQ0xVU0lWRSA9IDIKK307CisKKy8qIE5GU3YzIGZpbGUgc3lzdGVtIHByb3BlcnRpZXMgKi8KKyNkZWZpbmUgTkZTM19GU0ZfTElOSwkJMHgwMDAxCisjZGVmaW5lIE5GUzNfRlNGX1NZTUxJTksJMHgwMDAyCisjZGVmaW5lIE5GUzNfRlNGX0hPTU9HRU5FT1VTCTB4MDAwOAorI2RlZmluZSBORlMzX0ZTRl9DQU5TRVRUSU1FCTB4MDAxMAorLyogU29tZSBzaG9ydGhhbmRzLiBTZWUgZnMvbmZzZC9uZnMzcHJvYy5jICovCisjZGVmaW5lIE5GUzNfRlNGX0RFRkFVTFQJMHgwMDFCCisjZGVmaW5lIE5GUzNfRlNGX0JJTExZQk9ZCTB4MDAxOAorI2RlZmluZSBORlMzX0ZTRl9SRUFET05MWQkweDAwMDgKKworZW51bSBuZnMzX2Z0eXBlIHsKKwlORjNOT04gID0gMCwKKwlORjNSRUcgID0gMSwKKwlORjNESVIgID0gMiwKKwlORjNCTEsgID0gMywKKwlORjNDSFIgID0gNCwKKwlORjNMTksgID0gNSwKKwlORjNTT0NLID0gNiwKKwlORjNGSUZPID0gNywJLyogY2hhbmdlZCBmcm9tIE5GU3YyICh3YXMgOCkgKi8KKwlORjNCQUQgID0gOAorfTsKKworc3RydWN0IG5mczNfZmggeworCXVuc2lnbmVkIHNob3J0IHNpemU7CisJdW5zaWduZWQgY2hhciAgZGF0YVtORlMzX0ZIU0laRV07Cit9OworCisjZGVmaW5lIE5GUzNfVkVSU0lPTgkJMworI2RlZmluZSBORlMzUFJPQ19OVUxMCQkwCisjZGVmaW5lIE5GUzNQUk9DX0dFVEFUVFIJMQorI2RlZmluZSBORlMzUFJPQ19TRVRBVFRSCTIKKyNkZWZpbmUgTkZTM1BST0NfTE9PS1VQCQkzCisjZGVmaW5lIE5GUzNQUk9DX0FDQ0VTUwkJNAorI2RlZmluZSBORlMzUFJPQ19SRUFETElOSwk1CisjZGVmaW5lIE5GUzNQUk9DX1JFQUQJCTYKKyNkZWZpbmUgTkZTM1BST0NfV1JJVEUJCTcKKyNkZWZpbmUgTkZTM1BST0NfQ1JFQVRFCQk4CisjZGVmaW5lIE5GUzNQUk9DX01LRElSCQk5CisjZGVmaW5lIE5GUzNQUk9DX1NZTUxJTksJMTAKKyNkZWZpbmUgTkZTM1BST0NfTUtOT0QJCTExCisjZGVmaW5lIE5GUzNQUk9DX1JFTU9WRQkJMTIKKyNkZWZpbmUgTkZTM1BST0NfUk1ESVIJCTEzCisjZGVmaW5lIE5GUzNQUk9DX1JFTkFNRQkJMTQKKyNkZWZpbmUgTkZTM1BST0NfTElOSwkJMTUKKyNkZWZpbmUgTkZTM1BST0NfUkVBRERJUgkxNgorI2RlZmluZSBORlMzUFJPQ19SRUFERElSUExVUwkxNworI2RlZmluZSBORlMzUFJPQ19GU1NUQVQJCTE4CisjZGVmaW5lIE5GUzNQUk9DX0ZTSU5GTwkJMTkKKyNkZWZpbmUgTkZTM1BST0NfUEFUSENPTkYJMjAKKyNkZWZpbmUgTkZTM1BST0NfQ09NTUlUCQkyMQorCisjZGVmaW5lIE5GU19NTlQzX1ZFUlNJT04JMworIAorCisjZW5kaWYgLyogX0xJTlVYX05GUzNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnM0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mczQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2Q4ZGI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnM0LmgKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiAgaW5jbHVkZS9saW51eC9uZnM0LmgKKyAqCisgKiAgTkZTdjQgcHJvdG9jb2wgZGVmaW5pdGlvbnMuCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBLZW5kcmljayBTbWl0aCA8a21zbWl0aEB1bWljaC5lZHU+CisgKiAgQW5keSBBZGFtc29uICAgPGFuZHJvc0B1bWljaC5lZHU+CisgKi8KKworI2lmbmRlZiBfTElOVVhfTkZTNF9ICisjZGVmaW5lIF9MSU5VWF9ORlM0X0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgTkZTNF9CSVRNQVBfU0laRQkyCisjZGVmaW5lIE5GUzRfVkVSSUZJRVJfU0laRQk4CisjZGVmaW5lIE5GUzRfU1RBVEVJRF9TRVFJRF9TSVpFIDQKKyNkZWZpbmUgTkZTNF9TVEFURUlEX09USEVSX1NJWkUgMTIKKyNkZWZpbmUgTkZTNF9TVEFURUlEX1NJWkUJKE5GUzRfU1RBVEVJRF9TRVFJRF9TSVpFICsgTkZTNF9TVEFURUlEX09USEVSX1NJWkUpCisjZGVmaW5lIE5GUzRfRkhTSVpFCQkxMjgKKyNkZWZpbmUgTkZTNF9NQVhQQVRITEVOCQlQQVRIX01BWAorI2RlZmluZSBORlM0X01BWE5BTUxFTgkJTkFNRV9NQVgKKyNkZWZpbmUgTkZTNF9PUEFRVUVfTElNSVQJMTAyNAorI2RlZmluZSBORlM0X01BWF9TRVNTSU9OSURfTEVOCTE2CisKKyNkZWZpbmUgTkZTNF9BQ0NFU1NfUkVBRCAgICAgICAgMHgwMDAxCisjZGVmaW5lIE5GUzRfQUNDRVNTX0xPT0tVUCAgICAgIDB4MDAwMgorI2RlZmluZSBORlM0X0FDQ0VTU19NT0RJRlkgICAgICAweDAwMDQKKyNkZWZpbmUgTkZTNF9BQ0NFU1NfRVhURU5EICAgICAgMHgwMDA4CisjZGVmaW5lIE5GUzRfQUNDRVNTX0RFTEVURSAgICAgIDB4MDAxMAorI2RlZmluZSBORlM0X0FDQ0VTU19FWEVDVVRFICAgICAweDAwMjAKKworI2RlZmluZSBORlM0X0ZIX1BFUlNJU1RFTlQJCTB4MDAwMAorI2RlZmluZSBORlM0X0ZIX05PRVhQSVJFX1dJVEhfT1BFTgkweDAwMDEKKyNkZWZpbmUgTkZTNF9GSF9WT0xBVElMRV9BTlkJCTB4MDAwMgorI2RlZmluZSBORlM0X0ZIX1ZPTF9NSUdSQVRJT04JCTB4MDAwNAorI2RlZmluZSBORlM0X0ZIX1ZPTF9SRU5BTUUJCTB4MDAwOAorCisjZGVmaW5lIE5GUzRfT1BFTl9SRVNVTFRfQ09ORklSTSAweDAwMDIKKyNkZWZpbmUgTkZTNF9PUEVOX1JFU1VMVF9MT0NLVFlQRV9QT1NJWCAweDAwMDQKKworI2RlZmluZSBORlM0X1NIQVJFX0FDQ0VTU19NQVNLCTB4MDAwRgorI2RlZmluZSBORlM0X1NIQVJFX0FDQ0VTU19SRUFECTB4MDAwMQorI2RlZmluZSBORlM0X1NIQVJFX0FDQ0VTU19XUklURQkweDAwMDIKKyNkZWZpbmUgTkZTNF9TSEFSRV9BQ0NFU1NfQk9USAkweDAwMDMKKyNkZWZpbmUgTkZTNF9TSEFSRV9ERU5ZX1JFQUQJMHgwMDAxCisjZGVmaW5lIE5GUzRfU0hBUkVfREVOWV9XUklURQkweDAwMDIKKyNkZWZpbmUgTkZTNF9TSEFSRV9ERU5ZX0JPVEgJMHgwMDAzCisKKy8qIG5mczQxICovCisjZGVmaW5lIE5GUzRfU0hBUkVfV0FOVF9NQVNLCQkweEZGMDAKKyNkZWZpbmUgTkZTNF9TSEFSRV9XQU5UX05PX1BSRUZFUkVOQ0UJMHgwMDAwCisjZGVmaW5lIE5GUzRfU0hBUkVfV0FOVF9SRUFEX0RFTEVHCTB4MDEwMAorI2RlZmluZSBORlM0X1NIQVJFX1dBTlRfV1JJVEVfREVMRUcJMHgwMjAwCisjZGVmaW5lIE5GUzRfU0hBUkVfV0FOVF9BTllfREVMRUcJMHgwMzAwCisjZGVmaW5lIE5GUzRfU0hBUkVfV0FOVF9OT19ERUxFRwkweDA0MDAKKyNkZWZpbmUgTkZTNF9TSEFSRV9XQU5UX0NBTkNFTAkJMHgwNTAwCisKKyNkZWZpbmUgTkZTNF9TSEFSRV9XSEVOX01BU0sJCTB4RjAwMDAKKyNkZWZpbmUgTkZTNF9TSEFSRV9TSUdOQUxfREVMRUdfV0hFTl9SRVNSQ19BVkFJTAkweDEwMDAwCisjZGVmaW5lIE5GUzRfU0hBUkVfUFVTSF9ERUxFR19XSEVOX1VOQ09OVEVOREVECQkweDIwMDAwCisKKyNkZWZpbmUgTkZTNF9DREZDNF9GT1JFCTB4MQorI2RlZmluZSBORlM0X0NERkM0X0JBQ0sgMHgyCisjZGVmaW5lIE5GUzRfQ0RGQzRfQk9USCAweDMKKyNkZWZpbmUgTkZTNF9DREZDNF9GT1JFX09SX0JPVEggMHgzCisjZGVmaW5lIE5GUzRfQ0RGQzRfQkFDS19PUl9CT1RIIDB4NworCisjZGVmaW5lIE5GUzRfU0VUX1RPX1NFUlZFUl9USU1FCTAKKyNkZWZpbmUgTkZTNF9TRVRfVE9fQ0xJRU5UX1RJTUUJMQorCisjZGVmaW5lIE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFIDAKKyNkZWZpbmUgTkZTNF9BQ0VfQUNDRVNTX0RFTklFRF9BQ0VfVFlQRSAgMQorI2RlZmluZSBORlM0X0FDRV9TWVNURU1fQVVESVRfQUNFX1RZUEUgICAyCisjZGVmaW5lIE5GUzRfQUNFX1NZU1RFTV9BTEFSTV9BQ0VfVFlQRSAgIDMKKworI2RlZmluZSBBQ0w0X1NVUFBPUlRfQUxMT1dfQUNMIDB4MDEKKyNkZWZpbmUgQUNMNF9TVVBQT1JUX0RFTllfQUNMICAweDAyCisjZGVmaW5lIEFDTDRfU1VQUE9SVF9BVURJVF9BQ0wgMHgwNAorI2RlZmluZSBBQ0w0X1NVUFBPUlRfQUxBUk1fQUNMIDB4MDgKKworI2RlZmluZSBORlM0X0FDRV9GSUxFX0lOSEVSSVRfQUNFICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTkZTNF9BQ0VfRElSRUNUT1JZX0lOSEVSSVRfQUNFICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE5GUzRfQUNFX05PX1BST1BBR0FURV9JTkhFUklUX0FDRSAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBORlM0X0FDRV9JTkhFUklUX09OTFlfQUNFICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgTkZTNF9BQ0VfU1VDQ0VTU0ZVTF9BQ0NFU1NfQUNFX0ZMQUcgICAweDAwMDAwMDEwCisjZGVmaW5lIE5GUzRfQUNFX0ZBSUxFRF9BQ0NFU1NfQUNFX0ZMQUcgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBORlM0X0FDRV9JREVOVElGSUVSX0dST1VQICAgICAgICAgICAgIDB4MDAwMDAwNDAKKworI2RlZmluZSBORlM0X0FDRV9SRUFEX0RBVEEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTkZTNF9BQ0VfTElTVF9ESVJFQ1RPUlkgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIE5GUzRfQUNFX1dSSVRFX0RBVEEgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBORlM0X0FDRV9BRERfRklMRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgTkZTNF9BQ0VfQVBQRU5EX0RBVEEgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIE5GUzRfQUNFX0FERF9TVUJESVJFQ1RPUlkgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBORlM0X0FDRV9SRUFEX05BTUVEX0FUVFJTICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgTkZTNF9BQ0VfV1JJVEVfTkFNRURfQVRUUlMgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIE5GUzRfQUNFX0VYRUNVVEUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBORlM0X0FDRV9ERUxFVEVfQ0hJTEQgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgTkZTNF9BQ0VfUkVBRF9BVFRSSUJVVEVTICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIE5GUzRfQUNFX1dSSVRFX0FUVFJJQlVURVMgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBORlM0X0FDRV9ERUxFVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgTkZTNF9BQ0VfUkVBRF9BQ0wgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIE5GUzRfQUNFX1dSSVRFX0FDTCAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBORlM0X0FDRV9XUklURV9PV05FUiAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgTkZTNF9BQ0VfU1lOQ0hST05JWkUgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIE5GUzRfQUNFX0dFTkVSSUNfUkVBRCAgICAgICAgICAgICAgICAgMHgwMDEyMDA4MQorI2RlZmluZSBORlM0X0FDRV9HRU5FUklDX1dSSVRFICAgICAgICAgICAgICAgIDB4MDAxNjAxMDYKKyNkZWZpbmUgTkZTNF9BQ0VfR0VORVJJQ19FWEVDVVRFICAgICAgICAgICAgICAweDAwMTIwMEEwCisjZGVmaW5lIE5GUzRfQUNFX01BU0tfQUxMICAgICAgICAgICAgICAgICAgICAgMHgwMDFGMDFGRgorCisjZGVmaW5lIEVYQ0hHSUQ0X0ZMQUdfU1VQUF9NT1ZFRF9SRUZFUgkJMHgwMDAwMDAwMQorI2RlZmluZSBFWENIR0lENF9GTEFHX1NVUFBfTU9WRURfTUlHUgkJMHgwMDAwMDAwMgorI2RlZmluZSBFWENIR0lENF9GTEFHX0JJTkRfUFJJTkNfU1RBVEVJRAkweDAwMDAwMTAwCisKKyNkZWZpbmUgRVhDSEdJRDRfRkxBR19VU0VfTk9OX1BORlMJCTB4MDAwMTAwMDAKKyNkZWZpbmUgRVhDSEdJRDRfRkxBR19VU0VfUE5GU19NRFMJCTB4MDAwMjAwMDAKKyNkZWZpbmUgRVhDSEdJRDRfRkxBR19VU0VfUE5GU19EUwkJMHgwMDA0MDAwMAorI2RlZmluZSBFWENIR0lENF9GTEFHX01BU0tfUE5GUwkJCTB4MDAwNzAwMDAKKworI2RlZmluZSBFWENIR0lENF9GTEFHX1VQRF9DT05GSVJNRURfUkVDX0EJMHg0MDAwMDAwMAorI2RlZmluZSBFWENIR0lENF9GTEFHX0NPTkZJUk1FRF9SCQkweDgwMDAwMDAwCisvKgorICogU2luY2UgdGhlIHZhbGlkaXR5IG9mIHRoZXNlIGJpdHMgZGVwZW5kcyBvbiB3aGV0aGVyCisgKiB0aGV5J3JlIHNldCBpbiB0aGUgYXJndW1lbnQgb3IgcmVzcG9uc2UsIGhhdmUgc2VwYXJhdGUKKyAqIGludmFsaWQgZmxhZyBtYXNrcyBmb3IgYXJnIChfQSkgYW5kIHJlc3AgKF9SKS4KKyAqLworI2RlZmluZSBFWENIR0lENF9GTEFHX01BU0tfQQkJCTB4NDAwNzAxMDMKKyNkZWZpbmUgRVhDSEdJRDRfRkxBR19NQVNLX1IJCQkweDgwMDcwMTAzCisKKyNkZWZpbmUgU0VRNF9TVEFUVVNfQ0JfUEFUSF9ET1dOCQkweDAwMDAwMDAxCisjZGVmaW5lIFNFUTRfU1RBVFVTX0NCX0dTU19DT05URVhUU19FWFBJUklORwkweDAwMDAwMDAyCisjZGVmaW5lIFNFUTRfU1RBVFVTX0NCX0dTU19DT05URVhUU19FWFBJUkVECTB4MDAwMDAwMDQKKyNkZWZpbmUgU0VRNF9TVEFUVVNfRVhQSVJFRF9BTExfU1RBVEVfUkVWT0tFRAkweDAwMDAwMDA4CisjZGVmaW5lIFNFUTRfU1RBVFVTX0VYUElSRURfU09NRV9TVEFURV9SRVZPS0VECTB4MDAwMDAwMTAKKyNkZWZpbmUgU0VRNF9TVEFUVVNfQURNSU5fU1RBVEVfUkVWT0tFRAkJMHgwMDAwMDAyMAorI2RlZmluZSBTRVE0X1NUQVRVU19SRUNBTExBQkxFX1NUQVRFX1JFVk9LRUQJMHgwMDAwMDA0MAorI2RlZmluZSBTRVE0X1NUQVRVU19MRUFTRV9NT1ZFRAkJCTB4MDAwMDAwODAKKyNkZWZpbmUgU0VRNF9TVEFUVVNfUkVTVEFSVF9SRUNMQUlNX05FRURFRAkweDAwMDAwMTAwCisjZGVmaW5lIFNFUTRfU1RBVFVTX0NCX1BBVEhfRE9XTl9TRVNTSU9OCTB4MDAwMDAyMDAKKyNkZWZpbmUgU0VRNF9TVEFUVVNfQkFDS0NIQU5ORUxfRkFVTFQJCTB4MDAwMDA0MDAKKworI2RlZmluZSBORlM0X1NFQ0lORk9fU1RZTEU0X0NVUlJFTlRfRkgJMAorI2RlZmluZSBORlM0X1NFQ0lORk9fU1RZTEU0X1BBUkVOVAkxCisKKyNkZWZpbmUgTkZTNF9NQVhfVUlOVDY0CSh+KHU2NCkwKQorCisvKiBBbiBORlM0IHNlc3Npb25zIHNlcnZlciBtdXN0IHN1cHBvcnQgYXQgbGVhc3QgTkZTNF9NQVhfT1BTIG9wZXJhdGlvbnMuCisgKiBJZiBhIGNvbXBvdW5kIHJlcXVpcmVzIG1vcmUgb3BlcmF0aW9ucywgYWRqdXN0IE5GUzRfTUFYX09QUyBhY2NvcmRpbmdseS4KKyAqLworI2RlZmluZSBORlM0X01BWF9PUFMgICA4CisKKy8qIE91ciBORlM0IGNsaWVudCBiYWNrIGNoYW5uZWwgc2VydmVyIG9ubHkgd2FudHMgdGhlIGNiX3NlcXVlbmUgYW5kIHRoZQorICogYWN0dWFsIG9wZXJhdGlvbiBwZXIgY29tcG91bmQKKyAqLworI2RlZmluZSBORlM0X01BWF9CQUNLX0NIQU5ORUxfT1BTIDIKKworZW51bSBuZnM0X2FjbF93aG90eXBlIHsKKwlORlM0X0FDTF9XSE9fTkFNRUQgPSAwLAorCU5GUzRfQUNMX1dIT19PV05FUiwKKwlORlM0X0FDTF9XSE9fR1JPVVAsCisJTkZTNF9BQ0xfV0hPX0VWRVJZT05FLAorfTsKKworI2VuZGlmCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnM0X21vdW50LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mczRfbW91bnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGZmMzJkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnM0X21vdW50LmgKQEAgLTAsMCArMSw3MSBAQAorI2lmbmRlZiBfTElOVVhfTkZTNF9NT1VOVF9ICisjZGVmaW5lIF9MSU5VWF9ORlM0X01PVU5UX0gKKworLyoKKyAqICBsaW51eC9pbmNsdWRlL2xpbnV4L25mczRfbW91bnQuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgIFRyb25kIE15a2xlYnVzdAorICoKKyAqICBzdHJ1Y3R1cmUgcGFzc2VkIGZyb20gdXNlci1zcGFjZSB0byBrZXJuZWwtc3BhY2UgZHVyaW5nIGFuIG5mc3Y0IG1vdW50CisgKi8KKworLyoKKyAqIFdBUk5JTkchICBEbyBub3QgZGVsZXRlIG9yIGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlc2UgZmllbGRzLiAgSWYKKyAqIGEgbmV3IGZpZWxkIGlzIHJlcXVpcmVkIHRoZW4gYWRkIGl0IHRvIHRoZSBlbmQuICBUaGUgdmVyc2lvbiBmaWVsZAorICogdHJhY2tzIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudC4gIFRoaXMgd2lsbCBlbnN1cmUgc29tZSBtZWFzdXJlIG9mCisgKiBtb3VudC10by1rZXJuZWwgdmVyc2lvbiBjb21wYXRpYmlsaXR5LiAgU29tZSBvZiB0aGVzZSBhcmVuJ3QgdXNlZCB5ZXQKKyAqIGJ1dCBoZXJlIHRoZXkgYXJlIGFueXdheS4KKyAqLworI2RlZmluZSBORlM0X01PVU5UX1ZFUlNJT04JMQorCitzdHJ1Y3QgbmZzX3N0cmluZyB7CisJdW5zaWduZWQgaW50IGxlbjsKKwljb25zdCBjaGFyICogZGF0YTsKK307CisKK3N0cnVjdCBuZnM0X21vdW50X2RhdGEgeworCWludCB2ZXJzaW9uOwkJCQkvKiAxICovCisJaW50IGZsYWdzOwkJCQkvKiAxICovCisJaW50IHJzaXplOwkJCQkvKiAxICovCisJaW50IHdzaXplOwkJCQkvKiAxICovCisJaW50IHRpbWVvOwkJCQkvKiAxICovCisJaW50IHJldHJhbnM7CQkJCS8qIDEgKi8KKwlpbnQgYWNyZWdtaW47CQkJCS8qIDEgKi8KKwlpbnQgYWNyZWdtYXg7CQkJCS8qIDEgKi8KKwlpbnQgYWNkaXJtaW47CQkJCS8qIDEgKi8KKwlpbnQgYWNkaXJtYXg7CQkJCS8qIDEgKi8KKworCS8qIHNlZSB0aGUgZGVmaW5pdGlvbiBvZiAnc3RydWN0IGNsaWVudGFkZHI0JyBpbiBSRkMzMDEwICovCisJc3RydWN0IG5mc19zdHJpbmcgY2xpZW50X2FkZHI7CQkvKiAxICovCisKKwkvKiBNb3VudCBwYXRoICovCisJc3RydWN0IG5mc19zdHJpbmcgbW50X3BhdGg7CQkvKiAxICovCisKKwkvKiBTZXJ2ZXIgZGV0YWlscyAqLworCXN0cnVjdCBuZnNfc3RyaW5nIGhvc3RuYW1lOwkJLyogMSAqLworCS8qIFNlcnZlciBJUCBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IGhvc3RfYWRkcmxlbjsJCS8qIDEgKi8KKwlzdHJ1Y3Qgc29ja2FkZHIgKiBob3N0X2FkZHI7CS8qIDEgKi8KKworCS8qIFRyYW5zcG9ydCBwcm90b2NvbCB0byB1c2UgKi8KKwlpbnQgcHJvdG87CQkJCS8qIDEgKi8KKworCS8qIFBzZXVkby1mbGF2b3VycyB0byB1c2UgZm9yIGF1dGhlbnRpY2F0aW9uLiBTZWUgUkZDMjYyMyAqLworCWludCBhdXRoX2ZsYXZvdXJsZW47CQkJLyogMSAqLworCWludCAqYXV0aF9mbGF2b3VyczsJCS8qIDEgKi8KK307CisKKy8qIGJpdHMgaW4gdGhlIGZsYWdzIGZpZWxkICovCisvKiBOb3RlOiB0aGUgZmllbGRzIHRoYXQgY29ycmVzcG9uZCB0byBleGlzdGluZyBORlN2Mi92MyBtb3VudCBvcHRpb25zCisgKiAJIHNob3VsZCBtaXJyb3IgdGhlIHZhbHVlcyBmcm9tIGluY2x1ZGUvbGludXgvbmZzX21vdW50LmgKKyAqLworCisjZGVmaW5lIE5GUzRfTU9VTlRfU09GVAkJMHgwMDAxCS8qIDEgKi8KKyNkZWZpbmUgTkZTNF9NT1VOVF9JTlRSCQkweDAwMDIJLyogMSAqLworI2RlZmluZSBORlM0X01PVU5UX05PQ1RPCTB4MDAxMAkvKiAxICovCisjZGVmaW5lIE5GUzRfTU9VTlRfTk9BQwkJMHgwMDIwCS8qIDEgKi8KKyNkZWZpbmUgTkZTNF9NT1VOVF9TVFJJQ1RMT0NLCTB4MTAwMAkvKiAxICovCisjZGVmaW5lIE5GUzRfTU9VTlRfVU5TSEFSRUQJMHg4MDAwCS8qIDEgKi8KKyNkZWZpbmUgTkZTNF9NT1VOVF9GTEFHTUFTSwkweDkwMzMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc19mcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmJmNTY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNfZnMuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvbGludXgvbmZzX2ZzLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkyICBSaWNrIFNsYWRrZXkKKyAqCisgKiAgT1Mtc3BlY2lmaWMgbmZzIGZpbGVzeXN0ZW0gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucworICovCisKKyNpZm5kZWYgX0xJTlVYX05GU19GU19ICisjZGVmaW5lIF9MSU5VWF9ORlNfRlNfSAorCisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KKworLyogRGVmYXVsdCB0aW1lb3V0IHZhbHVlcyAqLworI2RlZmluZSBORlNfREVGX1VEUF9USU1FTwkoMTEpCisjZGVmaW5lIE5GU19ERUZfVURQX1JFVFJBTlMJKDMpCisjZGVmaW5lIE5GU19ERUZfVENQX1RJTUVPCSg2MDApCisjZGVmaW5lIE5GU19ERUZfVENQX1JFVFJBTlMJKDIpCisKKyNkZWZpbmUgTkZTX01BWF9VRFBfVElNRU9VVAkoNjAqSFopCisjZGVmaW5lIE5GU19NQVhfVENQX1RJTUVPVVQJKDYwMCpIWikKKworI2RlZmluZSBORlNfREVGX0FDUkVHTUlOCSgzKQorI2RlZmluZSBORlNfREVGX0FDUkVHTUFYCSg2MCkKKyNkZWZpbmUgTkZTX0RFRl9BQ0RJUk1JTgkoMzApCisjZGVmaW5lIE5GU19ERUZfQUNESVJNQVgJKDYwKQorCisvKgorICogV2hlbiBmbHVzaGluZyBhIGNsdXN0ZXIgb2YgZGlydHkgcGFnZXMsIHRoZXJlIGNhbiBiZSBkaWZmZXJlbnQKKyAqIHN0cmF0ZWdpZXM6CisgKi8KKyNkZWZpbmUgRkxVU0hfU1lOQwkJMQkvKiBmaWxlIGJlaW5nIHN5bmNlZCwgb3IgY29udGVudGlvbiAqLworI2RlZmluZSBGTFVTSF9TVEFCTEUJCTQJLyogY29tbWl0IHRvIHN0YWJsZSBzdG9yYWdlICovCisjZGVmaW5lIEZMVVNIX0xPV1BSSQkJOAkvKiBsb3cgcHJpb3JpdHkgYmFja2dyb3VuZCBmbHVzaCAqLworI2RlZmluZSBGTFVTSF9ISUdIUFJJCQkxNgkvKiBoaWdoIHByaW9yaXR5IG1lbW9yeSByZWNsYWltIGZsdXNoICovCisjZGVmaW5lIEZMVVNIX0NPTkRfU1RBQkxFCTMyCS8qIGNvbmRpdGlvbmFsIHN0YWJsZSB3cml0ZSAtIG9ubHkgc3RhYmxlCisJCQkJCSAqIGlmIGV2ZXJ5dGhpbmcgZml0cyBpbiBvbmUgUlBDICovCisKKworLyoKKyAqIE5GUyBkZWJ1ZyBmbGFncworICovCisjZGVmaW5lIE5GU0RCR19WRlMJCTB4MDAwMQorI2RlZmluZSBORlNEQkdfRElSQ0FDSEUJCTB4MDAwMgorI2RlZmluZSBORlNEQkdfTE9PS1VQQ0FDSEUJMHgwMDA0CisjZGVmaW5lIE5GU0RCR19QQUdFQ0FDSEUJMHgwMDA4CisjZGVmaW5lIE5GU0RCR19QUk9DCQkweDAwMTAKKyNkZWZpbmUgTkZTREJHX1hEUgkJMHgwMDIwCisjZGVmaW5lIE5GU0RCR19GSUxFCQkweDAwNDAKKyNkZWZpbmUgTkZTREJHX1JPT1QJCTB4MDA4MAorI2RlZmluZSBORlNEQkdfQ0FMTEJBQ0sJCTB4MDEwMAorI2RlZmluZSBORlNEQkdfQ0xJRU5UCQkweDAyMDAKKyNkZWZpbmUgTkZTREJHX01PVU5UCQkweDA0MDAKKyNkZWZpbmUgTkZTREJHX0ZTQ0FDSEUJCTB4MDgwMAorI2RlZmluZSBORlNEQkdfUE5GUwkJMHgxMDAwCisjZGVmaW5lIE5GU0RCR19QTkZTX0xECQkweDIwMDAKKyNkZWZpbmUgTkZTREJHX0FMTAkJMHhGRkZGCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc19pZG1hcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNfaWRtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWY4NDNjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNfaWRtYXAuaApAQCAtMCwwICsxLDY1IEBACisvKgorICogaW5jbHVkZS9saW51eC9uZnNfaWRtYXAuaAorICoKKyAqICBVSUQgYW5kIEdJRCB0byBuYW1lIG1hcHBpbmcgZm9yIGNsaWVudHMuCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBNYXJpdXMgQWFtb2R0IEVyaWtzZW4gPG1hcml1c0B1bWljaC5lZHU+CisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBORlNfSURNQVBfSAorI2RlZmluZSBORlNfSURNQVBfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogWFhYIGZyb20gYml0cy91dG1wLmggICovCisjZGVmaW5lIElETUFQX05BTUVTWiAgMTI4CisKKyNkZWZpbmUgSURNQVBfVFlQRV9VU0VSICAwCisjZGVmaW5lIElETUFQX1RZUEVfR1JPVVAgMQorCisjZGVmaW5lIElETUFQX0NPTlZfSURUT05BTUUgMAorI2RlZmluZSBJRE1BUF9DT05WX05BTUVUT0lEIDEKKworI2RlZmluZSBJRE1BUF9TVEFUVVNfSU5WQUxJRE1TRyAweDAxCisjZGVmaW5lIElETUFQX1NUQVRVU19BR0FJTiAgICAgIDB4MDIKKyNkZWZpbmUgSURNQVBfU1RBVFVTX0xPT0tVUEZBSUwgMHgwNAorI2RlZmluZSBJRE1BUF9TVEFUVVNfU1VDQ0VTUyAgICAweDA4CisKK3N0cnVjdCBpZG1hcF9tc2cgeworCV9fdTggIGltX3R5cGU7CisJX191OCAgaW1fY29udjsKKwljaGFyICBpbV9uYW1lW0lETUFQX05BTUVTWl07CisJX191MzIgaW1faWQ7CisJX191OCAgaW1fc3RhdHVzOworfTsKKworCisjZW5kaWYgLyogTkZTX0lETUFQX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzX21vdW50LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc19tb3VudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NmJkZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc19tb3VudC5oCkBAIC0wLDAgKzEsNzcgQEAKKyNpZm5kZWYgX0xJTlVYX05GU19NT1VOVF9ICisjZGVmaW5lIF9MSU5VWF9ORlNfTU9VTlRfSAorCisvKgorICogIGxpbnV4L2luY2x1ZGUvbGludXgvbmZzX21vdW50LmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkyICBSaWNrIFNsYWRrZXkKKyAqCisgKiAgc3RydWN0dXJlIHBhc3NlZCBmcm9tIHVzZXItc3BhY2UgdG8ga2VybmVsLXNwYWNlIGR1cmluZyBhbiBuZnMgbW91bnQKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvbmZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzMi5oPgorI2luY2x1ZGUgPGxpbnV4L25mczMuaD4KKworLyoKKyAqIFdBUk5JTkchICBEbyBub3QgZGVsZXRlIG9yIGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlc2UgZmllbGRzLiAgSWYKKyAqIGEgbmV3IGZpZWxkIGlzIHJlcXVpcmVkIHRoZW4gYWRkIGl0IHRvIHRoZSBlbmQuICBUaGUgdmVyc2lvbiBmaWVsZAorICogdHJhY2tzIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudC4gIFRoaXMgd2lsbCBlbnN1cmUgc29tZSBtZWFzdXJlIG9mCisgKiBtb3VudC10by1rZXJuZWwgdmVyc2lvbiBjb21wYXRpYmlsaXR5LiAgU29tZSBvZiB0aGVzZSBhcmVuJ3QgdXNlZCB5ZXQKKyAqIGJ1dCBoZXJlIHRoZXkgYXJlIGFueXdheS4KKyAqLworI2RlZmluZSBORlNfTU9VTlRfVkVSU0lPTgk2CisjZGVmaW5lIE5GU19NQVhfQ09OVEVYVF9MRU4JMjU2CisKK3N0cnVjdCBuZnNfbW91bnRfZGF0YSB7CisJaW50CQl2ZXJzaW9uOwkJLyogMSAqLworCWludAkJZmQ7CQkJLyogMSAqLworCXN0cnVjdCBuZnMyX2ZoCW9sZF9yb290OwkJLyogMSAqLworCWludAkJZmxhZ3M7CQkJLyogMSAqLworCWludAkJcnNpemU7CQkJLyogMSAqLworCWludAkJd3NpemU7CQkJLyogMSAqLworCWludAkJdGltZW87CQkJLyogMSAqLworCWludAkJcmV0cmFuczsJCS8qIDEgKi8KKwlpbnQJCWFjcmVnbWluOwkJLyogMSAqLworCWludAkJYWNyZWdtYXg7CQkvKiAxICovCisJaW50CQlhY2Rpcm1pbjsJCS8qIDEgKi8KKwlpbnQJCWFjZGlybWF4OwkJLyogMSAqLworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwkJLyogMSAqLworCWNoYXIJCWhvc3RuYW1lW05GU19NQVhOQU1MRU4gKyAxXTsJCS8qIDEgKi8KKwlpbnQJCW5hbWxlbjsJCQkvKiAyICovCisJdW5zaWduZWQgaW50CWJzaXplOwkJCS8qIDMgKi8KKwlzdHJ1Y3QgbmZzM19maAlyb290OwkJCS8qIDQgKi8KKwlpbnQJCXBzZXVkb2ZsYXZvcjsJCS8qIDUgKi8KKwljaGFyCQljb250ZXh0W05GU19NQVhfQ09OVEVYVF9MRU4gKyAxXTsJLyogNiAqLworfTsKKworLyogYml0cyBpbiB0aGUgZmxhZ3MgZmllbGQgdmlzaWJsZSB0byB1c2VyIHNwYWNlICovCisKKyNkZWZpbmUgTkZTX01PVU5UX1NPRlQJCTB4MDAwMQkvKiAxICovCisjZGVmaW5lIE5GU19NT1VOVF9JTlRSCQkweDAwMDIJLyogMSAqLyAvKiBub3cgdW51c2VkLCBidXQgQUJJICovCisjZGVmaW5lIE5GU19NT1VOVF9TRUNVUkUJMHgwMDA0CS8qIDEgKi8KKyNkZWZpbmUgTkZTX01PVU5UX1BPU0lYCQkweDAwMDgJLyogMSAqLworI2RlZmluZSBORlNfTU9VTlRfTk9DVE8JCTB4MDAxMAkvKiAxICovCisjZGVmaW5lIE5GU19NT1VOVF9OT0FDCQkweDAwMjAJLyogMSAqLworI2RlZmluZSBORlNfTU9VTlRfVENQCQkweDAwNDAJLyogMiAqLworI2RlZmluZSBORlNfTU9VTlRfVkVSMwkJMHgwMDgwCS8qIDMgKi8KKyNkZWZpbmUgTkZTX01PVU5UX0tFUkJFUk9TCTB4MDEwMAkvKiAzICovCisjZGVmaW5lIE5GU19NT1VOVF9OT05MTQkJMHgwMjAwCS8qIDMgKi8KKyNkZWZpbmUgTkZTX01PVU5UX0JST0tFTl9TVUlECTB4MDQwMAkvKiA0ICovCisjZGVmaW5lIE5GU19NT1VOVF9OT0FDTAkJMHgwODAwCS8qIDQgKi8KKyNkZWZpbmUgTkZTX01PVU5UX1NUUklDVExPQ0sJMHgxMDAwCS8qIHJlc2VydmVkIGZvciBORlN2NCAqLworI2RlZmluZSBORlNfTU9VTlRfU0VDRkxBVk9VUgkweDIwMDAJLyogNSAqLworI2RlZmluZSBORlNfTU9VTlRfTk9SRElSUExVUwkweDQwMDAJLyogNSAqLworI2RlZmluZSBORlNfTU9VTlRfVU5TSEFSRUQJMHg4MDAwCS8qIDUgKi8KKyNkZWZpbmUgTkZTX01PVU5UX0ZMQUdNQVNLCTB4RkZGRgorCisvKiBUaGUgZm9sbG93aW5nIGFyZSBmb3IgaW50ZXJuYWwgdXNlIG9ubHkgKi8KKyNkZWZpbmUgTkZTX01PVU5UX0xPT0tVUF9DQUNIRV9OT05FRwkweDEwMDAwCisjZGVmaW5lIE5GU19NT1VOVF9MT09LVVBfQ0FDSEVfTk9ORQkweDIwMDAwCisjZGVmaW5lIE5GU19NT1VOVF9OT1JFU1ZQT1JUCQkweDQwMDAwCisjZGVmaW5lIE5GU19NT1VOVF9MRUdBQ1lfSU5URVJGQUNFCTB4ODAwMDAKKworI2RlZmluZSBORlNfTU9VTlRfTE9DQUxfRkxPQ0sJMHgxMDAwMDAKKyNkZWZpbmUgTkZTX01PVU5UX0xPQ0FMX0ZDTlRMCTB4MjAwMDAwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNhY2wuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzYWNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1ZTE5ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzYWNsLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIEZpbGU6IGxpbnV4L25mc2FjbC5oCisgKgorICogKEMpIDIwMDMgQW5kcmVhcyBHcnVlbmJhY2hlciA8YWdydWVuQHN1c2UuZGU+CisgKi8KKyNpZm5kZWYgX19MSU5VWF9ORlNBQ0xfSAorI2RlZmluZSBfX0xJTlVYX05GU0FDTF9ICisKKyNkZWZpbmUgTkZTX0FDTF9QUk9HUkFNCTEwMDIyNworCisjZGVmaW5lIEFDTFBST0MyX0dFVEFDTAkJMQorI2RlZmluZSBBQ0xQUk9DMl9TRVRBQ0wJCTIKKyNkZWZpbmUgQUNMUFJPQzJfR0VUQVRUUgkzCisjZGVmaW5lIEFDTFBST0MyX0FDQ0VTUwkJNAorCisjZGVmaW5lIEFDTFBST0MzX0dFVEFDTAkJMQorI2RlZmluZSBBQ0xQUk9DM19TRVRBQ0wJCTIKKworCisvKiBGbGFncyBmb3IgdGhlIGdldGFjbC9zZXRhY2wgbW9kZSAqLworI2RlZmluZSBORlNfQUNMCQkJMHgwMDAxCisjZGVmaW5lIE5GU19BQ0xDTlQJCTB4MDAwMgorI2RlZmluZSBORlNfREZBQ0wJCTB4MDAwNAorI2RlZmluZSBORlNfREZBQ0xDTlQJCTB4MDAwOAorCisvKiBGbGFnIGZvciBEZWZhdWx0IEFDTCBlbnRyaWVzICovCisjZGVmaW5lIE5GU19BQ0xfREVGQVVMVAkJMHgxMDAwCisKKyNlbmRpZiAgLyogX19MSU5VWF9ORlNBQ0xfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNkL2RlYnVnLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc2QvZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDU4YzEyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNkL2RlYnVnLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIGxpbnV4L2luY2x1ZGUvbGludXgvbmZzZC9kZWJ1Zy5oCisgKgorICogRGVidWdnaW5nLXJlbGF0ZWQgc3R1ZmYgZm9yIG5mc2QKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2lmbmRlZiBMSU5VWF9ORlNEX0RFQlVHX0gKKyNkZWZpbmUgTElOVVhfTkZTRF9ERUJVR19ICisKKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZGVidWcuaD4KKworLyoKKyAqIEVuYWJsZSBkZWJ1Z2dpbmcgZm9yIG5mc2QuCisgKiBSZXF1aXJlcyBSUENfREVCVUcuCisgKi8KKyNpZmRlZiBSUENfREVCVUcKKyMgZGVmaW5lIE5GU0RfREVCVUcJCTEKKyNlbmRpZgorCisvKgorICoga25mc2QgZGVidWcgZmxhZ3MKKyAqLworI2RlZmluZSBORlNEREJHX1NPQ0sJCTB4MDAwMQorI2RlZmluZSBORlNEREJHX0ZICQkweDAwMDIKKyNkZWZpbmUgTkZTRERCR19FWFBPUlQJCTB4MDAwNAorI2RlZmluZSBORlNEREJHX1NWQwkJMHgwMDA4CisjZGVmaW5lIE5GU0REQkdfUFJPQwkJMHgwMDEwCisjZGVmaW5lIE5GU0REQkdfRklMRU9QCQkweDAwMjAKKyNkZWZpbmUgTkZTRERCR19BVVRICQkweDAwNDAKKyNkZWZpbmUgTkZTRERCR19SRVBDQUNIRQkweDAwODAKKyNkZWZpbmUgTkZTRERCR19YRFIJCTB4MDEwMAorI2RlZmluZSBORlNEREJHX0xPQ0tECQkweDAyMDAKKyNkZWZpbmUgTkZTRERCR19BTEwJCTB4N0ZGRgorI2RlZmluZSBORlNEREJHX05PQ0hBTkdFCTB4RkZGRgorCisKKworI2VuZGlmIC8qIExJTlVYX05GU0RfREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNkL2V4cG9ydC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNkL2V4cG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMjAxNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc2QvZXhwb3J0LmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIGluY2x1ZGUvbGludXgvbmZzZC9leHBvcnQuaAorICogCisgKiBQdWJsaWMgZGVjbGFyYXRpb25zIGZvciBORlMgZXhwb3J0cy4gVGhlIGRlZmluaXRpb25zIGZvciB0aGUKKyAqIHN5c2NhbGwgaW50ZXJmYWNlIGFyZSBpbiBuZnNjdGwuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpZm5kZWYgTkZTRF9FWFBPUlRfSAorI2RlZmluZSBORlNEX0VYUE9SVF9ICisKKyMgaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIEltcG9ydGFudCBsaW1pdHMgZm9yIHRoZSBleHBvcnRzIHN0dWZmLgorICovCisjZGVmaW5lIE5GU0NMTlRfSURNQVgJCTEwMjQKKyNkZWZpbmUgTkZTQ0xOVF9BRERSTUFYCQkxNgorI2RlZmluZSBORlNDTE5UX0tFWU1BWAkJMzIKKworLyoKKyAqIEV4cG9ydCBmbGFncy4KKyAqLworI2RlZmluZSBORlNFWFBfUkVBRE9OTFkJCTB4MDAwMQorI2RlZmluZSBORlNFWFBfSU5TRUNVUkVfUE9SVAkweDAwMDIKKyNkZWZpbmUgTkZTRVhQX1JPT1RTUVVBU0gJMHgwMDA0CisjZGVmaW5lIE5GU0VYUF9BTExTUVVBU0gJMHgwMDA4CisjZGVmaW5lIE5GU0VYUF9BU1lOQwkJMHgwMDEwCisjZGVmaW5lIE5GU0VYUF9HQVRIRVJFRF9XUklURVMJMHgwMDIwCisvKiA0MCA4MCAxMDAgY3VycmVudGx5IHVudXNlZCAqLworI2RlZmluZSBORlNFWFBfTk9ISURFCQkweDAyMDAKKyNkZWZpbmUgTkZTRVhQX05PU1VCVFJFRUNIRUNLCTB4MDQwMAorI2RlZmluZQlORlNFWFBfTk9BVVRITkxNCTB4MDgwMAkJLyogRG9uJ3QgYXV0aGVudGljYXRlIE5MTSByZXF1ZXN0cyAtIGp1c3QgdHJ1c3QgKi8KKyNkZWZpbmUgTkZTRVhQX01TTkZTCQkweDEwMDAJLyogZG8gc2lsbHkgdGhpbmdzIHRoYXQgTVMgY2xpZW50cyBleHBlY3Q7IG5vIGxvbmdlciBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgTkZTRVhQX0ZTSUQJCTB4MjAwMAorI2RlZmluZQlORlNFWFBfQ1JPU1NNT1VOVAkweDQwMDAKKyNkZWZpbmUJTkZTRVhQX05PQUNMCQkweDgwMDAJLyogcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIEFDTCByZWxhdGVkIHVzZSAqLworLyoKKyAqIFRoZSBORlNFWFBfVjRST09UIGZsYWcgY2F1c2VzIHRoZSBrZXJuZWwgdG8gZ2l2ZSBhY2Nlc3Mgb25seSB0byBORlN2NAorICogY2xpZW50cywgYW5kIG9ubHkgdG8gdGhlIHNpbmdsZSBkaXJlY3RvcnkgdGhhdCBpcyB0aGUgcm9vdCBvZiB0aGUKKyAqIGV4cG9ydDsgZnVydGhlciBsb29rdXAgYW5kIHJlYWRkaXIgb3BlcmF0aW9ucyBhcmUgdHJlYXRlZCBhcyBpZiBldmVyeQorICogc3ViZGlyZWN0b3J5IHdhcyBhIG1vdW50cG9pbnQsIGFuZCBpZ25vcmVkIGlmIHRoZXkgYXJlIG5vdCB0aGVtc2VsdmVzCisgKiBleHBvcnRlZC4gIFRoaXMgaXMgdXNlZCBieSBuZnNkIGFuZCBtb3VudGQgdG8gY29uc3RydWN0IHRoZSBORlN2NAorICogcHNldWRvZmlsZXN5c3RlbSwgd2hpY2ggcHJvdmlkZXMgYWNjZXNzIG9ubHkgdG8gcGF0aHMgbGVhZGluZyB0byBlYWNoCisgKiBleHBvcnRlZCBmaWxlc3lzdGVtLgorICovCisjZGVmaW5lCU5GU0VYUF9WNFJPT1QJCTB4MTAwMDAKKy8qIEFsbCBmbGFncyB0aGF0IHdlIGNsYWltIHRvIHN1cHBvcnQuICAoTm90ZSB3ZSBkb24ndCBzdXBwb3J0IE5PQUNMLikgKi8KKyNkZWZpbmUgTkZTRVhQX0FMTEZMQUdTCQkweDE3RTNGCisKKy8qIFRoZSBmbGFncyB0aGF0IG1heSB2YXJ5IGRlcGVuZGluZyBvbiBzZWN1cml0eSBmbGF2b3I6ICovCisjZGVmaW5lIE5GU0VYUF9TRUNJTkZPX0ZMQUdTCShORlNFWFBfUkVBRE9OTFkgfCBORlNFWFBfUk9PVFNRVUFTSCBcCisJCQkJCXwgTkZTRVhQX0FMTFNRVUFTSCBcCisJCQkJCXwgTkZTRVhQX0lOU0VDVVJFX1BPUlQpCisKKworI2VuZGlmIC8qIE5GU0RfRVhQT1JUX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNkL25mc2ZoLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZmguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2Y4MGU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNkL25mc2ZoLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBpbmNsdWRlL2xpbnV4L25mc2QvbmZzZmguaAorICoKKyAqIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIGxheW91dCBvZiB0aGUgZmlsZSBoYW5kbGVzIGFzIHBhc3NlZAorICogb3ZlciB0aGUgd2lyZS4KKyAqCisgKiBFYXJsaWVyIHZlcnNpb25zIG9mIGtuZnNkIHVzZWQgdG8gc2lnbiBmaWxlIGhhbmRsZXMgdXNpbmcga2V5ZWQgTUQ1CisgKiBvciBTSEEuIEkndmUgcmVtb3ZlZCB0aGlzIGNvZGUsIGJlY2F1c2UgaXQgZG9lc24ndCBnaXZlIHlvdSBtb3JlCisgKiBzZWN1cml0eSB0aGFuIGJsb2NraW5nIGV4dGVybmFsIGFjY2VzcyB0byBwb3J0IDIwNDkgb24geW91ciBmaXJld2FsbC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2lmbmRlZiBfTElOVVhfTkZTRF9GSF9ICisjZGVmaW5lIF9MSU5VWF9ORlNEX0ZIX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzMi5oPgorI2luY2x1ZGUgPGxpbnV4L25mczMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnM0Lmg+CisKKy8qCisgKiBUaGlzIGlzIHRoZSBvbGQgImRlbnRyeSBzdHlsZSIgTGludXggTkZTdjIgZmlsZSBoYW5kbGUuCisgKgorICogVGhlIHhpbm8gYW5kIHhkZXYgZmllbGRzIGFyZSBjdXJyZW50bHkgdXNlZCB0byB0cmFuc3BvcnQgdGhlCisgKiBpbm8vZGV2IG9mIHRoZSBleHBvcnRlZCBpbm9kZS4KKyAqLworc3RydWN0IG5mc19maGJhc2Vfb2xkIHsKKwlfX3UzMgkJZmJfZGNvb2tpZTsJLyogZGVudHJ5IGNvb2tpZSAtIGFsd2F5cyAweGZlZWJiYWNhICovCisJX191MzIJCWZiX2lubzsJCS8qIG91ciBpbm9kZSBudW1iZXIgKi8KKwlfX3UzMgkJZmJfZGlyaW5vOwkvKiBkaXIgaW5vZGUgbnVtYmVyLCAwIGZvciBkaXJlY3RvcmllcyAqLworCV9fdTMyCQlmYl9kZXY7CQkvKiBvdXIgZGV2aWNlICovCisJX191MzIJCWZiX3hkZXY7CisJX191MzIJCWZiX3hpbm87CisJX191MzIJCWZiX2dlbmVyYXRpb247Cit9OworCisvKgorICogVGhpcyBpcyB0aGUgbmV3IGZsZXhpYmxlLCBleHRlbnNpYmxlIHN0eWxlIE5GU3YyL3YzIGZpbGUgaGFuZGxlLgorICogYnkgTmVpbCBCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PiAtIE1hcmNoIDIwMDAKKyAqCisgKiBUaGUgZmlsZSBoYW5kbGUgc3RhcnRzIHdpdGggYSBzZXF1ZW5jZSBvZiBmb3VyLWJ5dGUgd29yZHMuCisgKiBUaGUgZmlyc3Qgd29yZCBjb250YWlucyBhIHZlcnNpb24gbnVtYmVyICgxKSBhbmQgdGhyZWUgZGVzY3JpcHRvciBieXRlcworICogdGhhdCB0ZWxsIGhvdyB0aGUgcmVtYWluaW5nIDMgdmFyaWFibGUgbGVuZ3RoIGZpZWxkcyBzaG91bGQgYmUgaGFuZGxlZC4KKyAqIFRoZXNlIHRocmVlIGJ5dGVzIGFyZSBhdXRoX3R5cGUsIGZzaWRfdHlwZSBhbmQgZmlsZWlkX3R5cGUuCisgKgorICogQWxsIGZvdXItYnl0ZSB2YWx1ZXMgYXJlIGluIGhvc3QtYnl0ZS1vcmRlci4KKyAqCisgKiBUaGUgYXV0aF90eXBlIGZpZWxkIHNwZWNpZmllcyBob3cgdGhlIGZpbGVoYW5kbGUgY2FuIGJlIGF1dGhlbnRpY2F0ZWQKKyAqIFRoaXMgbWlnaHQgYWxsb3cgYSBmaWxlIHRvIGJlIGNvbmZpcm1lZCB0byBiZSBpbiBhIHdyaXRhYmxlIHBhcnQgb2YgYQorICogZmlsZXRyZWUgd2l0aG91dCBjaGVja2luZyB0aGUgcGF0aCBmcm9tIGl0IHVwIHRvIHRoZSByb290LgorICogQ3VycmVudCB2YWx1ZXM6CisgKiAgICAgMCAgLSBObyBhdXRoZW50aWNhdGlvbi4gIGZiX2F1dGggaXMgMCBieXRlcyBsb25nCisgKiBQb3NzaWJsZSBmdXR1cmUgdmFsdWVzOgorICogICAgIDEgIC0gNCBieXRlcyB0YWtlbiBmcm9tIE1ENSBoYXNoIG9mIHRoZSByZW1haW5lciBvZiB0aGUgZmlsZSBoYW5kbGUKKyAqICAgICAgICAgIHByZWZpeGVkIGJ5IGEgc2VjcmV0IGFuZCB3aXRoIHRoZSBpbXBvcnRhbnQgZXhwb3J0IGZsYWdzLgorICoKKyAqIFRoZSBmc2lkX3R5cGUgaWRlbnRpZmllcyBob3cgdGhlIGZpbGVzeXN0ZW0gKG9yIGV4cG9ydCBwb2ludCkgaXMKKyAqICAgIGVuY29kZWQuCisgKiAgQ3VycmVudCB2YWx1ZXM6CisgKiAgICAgMCAgLSA0IGJ5dGUgZGV2aWNlIGlkIChtcy0yLWJ5dGVzIG1ham9yLCBscy0yLWJ5dGVzIG1pbm9yKSwgNGJ5dGUgaW5vZGUgbnVtYmVyCisgKiAgICAgICAgTk9URTogd2UgY2Fubm90IHVzZSB0aGUga2Rldl90IGRldmljZSBpZCB2YWx1ZSwgYmVjYXVzZSBrZGV2X3QuaAorICogICAgICAgICAgICAgIHNheXMgd2UgbXVzdG4ndC4gIFdlIG11c3QgYnJlYWsgaXQgdXAgYW5kIHJlYXNzZW1ibGUuCisgKiAgICAgMSAgLSA0IGJ5dGUgdXNlciBzcGVjaWZpZWQgaWRlbnRpZmllcgorICogICAgIDIgIC0gNCBieXRlIG1ham9yLCA0IGJ5dGUgbWlub3IsIDQgYnl0ZSBpbm9kZSBudW1iZXIgLSBERVBSRUNBVEVECisgKiAgICAgMyAgLSA0IGJ5dGUgZGV2aWNlIGlkLCBlbmNvZGVkIGZvciB1c2VyLXNwYWNlLCA0IGJ5dGUgaW5vZGUgbnVtYmVyCisgKiAgICAgNCAgLSA0IGJ5dGUgaW5vZGUgbnVtYmVyIGFuZCA0IGJ5dGUgdXVpZAorICogICAgIDUgIC0gOCBieXRlIHV1aWQKKyAqICAgICA2ICAtIDE2IGJ5dGUgdXVpZAorICogICAgIDcgIC0gOCBieXRlIGlub2RlIG51bWJlciBhbmQgMTYgYnl0ZSB1dWlkCisgKgorICogVGhlIGZpbGVpZF90eXBlIGlkZW50aWZpZWQgaG93IHRoZSBmaWxlIHdpdGhpbiB0aGUgZmlsZXN5c3RlbSBpcyBlbmNvZGVkLgorICogVGhpcyBpcyAod2lsbCBiZSkgcGFzc2VkIHRvLCBhbmQgc2V0IGJ5LCB0aGUgdW5kZXJseWluZyBmaWxlc3lzdGVtIGlmIGl0IHN1cHBvcnRzCisgKiBmaWxlaGFuZGxlIG9wZXJhdGlvbnMuICBUaGUgZmlsZXN5c3RlbSBtdXN0IG5vdCB1c2UgdGhlIHZhbHVlICcwJyBvciAnMHhmZicgYW5kIG1heQorICogb25seSB1c2UgdGhlIHZhbHVlcyAxIGFuZCAyIGFzIGRlZmluZWQgYmVsb3c6CisgKiAgQ3VycmVudCB2YWx1ZXM6CisgKiAgICAwICAgLSBUaGUgcm9vdCwgb3IgZXhwb3J0IHBvaW50LCBvZiB0aGUgZmlsZXN5c3RlbS4gIGZiX2ZpbGVpZCBpcyAwIGJ5dGVzLgorICogICAgMSAgIC0gMzJiaXQgaW5vZGUgbnVtYmVyLCAzMiBiaXQgZ2VuZXJhdGlvbiBudW1iZXIuCisgKiAgICAyICAgLSAzMmJpdCBpbm9kZSBudW1iZXIsIDMyIGJpdCBnZW5lcmF0aW9uIG51bWJlciwgMzIgYml0IHBhcmVudCBkaXJlY3RvcnkgaW5vZGUgbnVtYmVyLgorICoKKyAqLworc3RydWN0IG5mc19maGJhc2VfbmV3IHsKKwlfX3U4CQlmYl92ZXJzaW9uOwkvKiA9PSAxLCBldmVuID0+IG5mc19maGJhc2Vfb2xkICovCisJX191OAkJZmJfYXV0aF90eXBlOworCV9fdTgJCWZiX2ZzaWRfdHlwZTsKKwlfX3U4CQlmYl9maWxlaWRfdHlwZTsKKwlfX3UzMgkJZmJfYXV0aFsxXTsKKy8qCV9fdTMyCQlmYl9mc2lkWzBdOyBmbG9hdGluZyAqLworLyoJX191MzIJCWZiX2ZpbGVpZFswXTsgZmxvYXRpbmcgKi8KK307CisKK3N0cnVjdCBrbmZzZF9maCB7CisJdW5zaWduZWQgaW50CWZoX3NpemU7CS8qIHNpZ25pZmljYW50IGZvciBORlN2My4KKwkJCQkJICogUG9pbnRzIHRvIHRoZSBjdXJyZW50IHNpemUgd2hpbGUgYnVpbGRpbmcKKwkJCQkJICogYSBuZXcgZmlsZSBoYW5kbGUKKwkJCQkJICovCisJdW5pb24geworCQlzdHJ1Y3QgbmZzX2ZoYmFzZV9vbGQJZmhfb2xkOworCQlfX3UzMgkJCWZoX3BhZFtORlM0X0ZIU0laRS80XTsKKwkJc3RydWN0IG5mc19maGJhc2VfbmV3CWZoX25ldzsKKwl9IGZoX2Jhc2U7Cit9OworCisjZGVmaW5lIG9maF9kY29va2llCQlmaF9iYXNlLmZoX29sZC5mYl9kY29va2llCisjZGVmaW5lIG9maF9pbm8JCQlmaF9iYXNlLmZoX29sZC5mYl9pbm8KKyNkZWZpbmUgb2ZoX2RpcmlubwkJZmhfYmFzZS5maF9vbGQuZmJfZGlyaW5vCisjZGVmaW5lIG9maF9kZXYJCQlmaF9iYXNlLmZoX29sZC5mYl9kZXYKKyNkZWZpbmUgb2ZoX3hkZXYJCWZoX2Jhc2UuZmhfb2xkLmZiX3hkZXYKKyNkZWZpbmUgb2ZoX3hpbm8JCWZoX2Jhc2UuZmhfb2xkLmZiX3hpbm8KKyNkZWZpbmUgb2ZoX2dlbmVyYXRpb24JCWZoX2Jhc2UuZmhfb2xkLmZiX2dlbmVyYXRpb24KKworI2RlZmluZQlmaF92ZXJzaW9uCQlmaF9iYXNlLmZoX25ldy5mYl92ZXJzaW9uCisjZGVmaW5lCWZoX2ZzaWRfdHlwZQkJZmhfYmFzZS5maF9uZXcuZmJfZnNpZF90eXBlCisjZGVmaW5lCWZoX2F1dGhfdHlwZQkJZmhfYmFzZS5maF9uZXcuZmJfYXV0aF90eXBlCisjZGVmaW5lCWZoX2ZpbGVpZF90eXBlCQlmaF9iYXNlLmZoX25ldy5mYl9maWxlaWRfdHlwZQorI2RlZmluZQlmaF9hdXRoCQkJZmhfYmFzZS5maF9uZXcuZmJfYXV0aAorI2RlZmluZQlmaF9mc2lkCQkJZmhfYmFzZS5maF9uZXcuZmJfYXV0aAorCisKKworI2VuZGlmIC8qIF9MSU5VWF9ORlNEX0ZIX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzZC9zdGF0cy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcwMjRlOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzZC9zdGF0cy5oCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBsaW51eC9pbmNsdWRlL2xpbnV4L25mc2Qvc3RhdHMuaAorICoKKyAqIFN0YXRpc3RpY3MgZm9yIE5GUyBzZXJ2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpZm5kZWYgTElOVVhfTkZTRF9TVEFUU19ICisjZGVmaW5lIExJTlVYX05GU0RfU1RBVFNfSAorCisjaW5jbHVkZSA8bGludXgvbmZzNC5oPgorCisvKiB0aHJlYWQgdXNhZ2Ugd3JhcHMgdmVyeSBtaWxsaW9uIHNlY29uZHMgKGFwcHJveCBvbmUgZm9ydG5pZ2h0KSAqLworI2RlZmluZQlORlNEX1VTQUdFX1dSQVAJKEhaKjEwMDAwMDApCisKKyNlbmRpZiAvKiBMSU5VWF9ORlNEX1NUQVRTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmw4MDIxMS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ubDgwMjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA0OWJmNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmw4MDIxMS5oCkBAIC0wLDAgKzEsMjY1MyBAQAorI2lmbmRlZiBfX0xJTlVYX05MODAyMTFfSAorI2RlZmluZSBfX0xJTlVYX05MODAyMTFfSAorLyoKKyAqIDgwMi4xMSBuZXRsaW5rIGludGVyZmFjZSBwdWJsaWMgaGVhZGVyCisgKgorICogQ29weXJpZ2h0IDIwMDYtMjAxMCBKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgorICogQ29weXJpZ2h0IDIwMDggTWljaGFlbCBXdSA8ZmxhbWluZ2ljZUBzb3VybWlsay5uZXQ+CisgKiBDb3B5cmlnaHQgMjAwOCBMdWlzIENhcmxvcyBDb2JvIDxsdWlzY2FAY296eWJpdC5jb20+CisgKiBDb3B5cmlnaHQgMjAwOCBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgorICogQ29weXJpZ2h0IDIwMDgsIDIwMDkgTHVpcyBSLiBSb2RyaWd1ZXogPGxyb2RyaWd1ZXpAYXRoZXJvcy5jb20+CisgKiBDb3B5cmlnaHQgMjAwOCBKb3VuaSBNYWxpbmVuIDxqb3VuaS5tYWxpbmVuQGF0aGVyb3MuY29tPgorICogQ29weXJpZ2h0IDIwMDggQ29saW4gTWNDYWJlIDxjb2xpbkBjb3p5Yml0LmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qKgorICogRE9DOiBTdGF0aW9uIGhhbmRsaW5nCisgKgorICogU3RhdGlvbnMgYXJlIGFkZGVkIHBlciBpbnRlcmZhY2UsIGJ1dCBhIHNwZWNpYWwgY2FzZSBleGlzdHMgd2l0aCBWTEFOCisgKiBpbnRlcmZhY2VzLiBXaGVuIGEgc3RhdGlvbiBpcyBib3VuZCB0byBhbiBBUCBpbnRlcmZhY2UsIGl0IG1heSBiZSBtb3ZlZAorICogaW50byBhIFZMQU4gaWRlbnRpZmllZCBieSBhIFZMQU4gaW50ZXJmYWNlIGluZGV4ICglTkw4MDIxMV9BVFRSX1NUQV9WTEFOKS4KKyAqIFRoZSBzdGF0aW9uIGlzIHN0aWxsIGFzc3VtZWQgdG8gYmVsb25nIHRvIHRoZSBBUCBpbnRlcmZhY2UgaXQgd2FzIGFkZGVkCisgKiB0by4KKyAqCisgKiBUT0RPOiBuZWVkIG1vcmUgaW5mbz8KKyAqLworCisvKioKKyAqIERPQzogRnJhbWUgdHJhbnNtaXNzaW9uL3JlZ2lzdHJhdGlvbiBzdXBwb3J0CisgKgorICogRnJhbWUgdHJhbnNtaXNzaW9uIGFuZCByZWdpc3RyYXRpb24gc3VwcG9ydCBleGlzdHMgdG8gYWxsb3cgdXNlcnNwYWNlCisgKiBtYW5hZ2VtZW50IGVudGl0aWVzIHN1Y2ggYXMgd3BhX3N1cHBsaWNhbnQgcmVhY3QgdG8gbWFuYWdlbWVudCBmcmFtZXMKKyAqIHRoYXQgYXJlIG5vdCBiZWluZyBoYW5kbGVkIGJ5IHRoZSBrZXJuZWwuIFRoaXMgaW5jbHVkZXMsIGZvciBleGFtcGxlLAorICogY2VydGFpbiBjbGFzc2VzIG9mIGFjdGlvbiBmcmFtZXMgdGhhdCBjYW5ub3QgYmUgaGFuZGxlZCBpbiB0aGUga2VybmVsCisgKiBmb3IgdmFyaW91cyByZWFzb25zLgorICoKKyAqIEZyYW1lIHJlZ2lzdHJhdGlvbiBpcyBkb25lIG9uIGEgcGVyLWludGVyZmFjZSBiYXNpcyBhbmQgcmVnaXN0cmF0aW9ucworICogY2Fubm90IGJlIHJlbW92ZWQgb3RoZXIgdGhhbiBieSBjbG9zaW5nIHRoZSBzb2NrZXQuIEl0IGlzIHBvc3NpYmxlIHRvCisgKiBzcGVjaWZ5IGEgcmVnaXN0cmF0aW9uIGZpbHRlciB0byByZWdpc3RlciwgZm9yIGV4YW1wbGUsIG9ubHkgZm9yIGEKKyAqIGNlcnRhaW4gdHlwZSBvZiBhY3Rpb24gZnJhbWUuIEluIHBhcnRpY3VsYXIgd2l0aCBhY3Rpb24gZnJhbWVzLCB0aG9zZQorICogdGhhdCB1c2Vyc3BhY2UgcmVnaXN0ZXJzIGZvciB3aWxsIG5vdCBiZSByZXR1cm5lZCBhcyB1bmhhbmRsZWQgYnkgdGhlCisgKiBkcml2ZXIsIHNvIHRoYXQgdGhlIHJlZ2lzdGVyZWQgYXBwbGljYXRpb24gaGFzIHRvIHRha2UgcmVzcG9uc2liaWxpdHkKKyAqIGZvciBkb2luZyB0aGF0LgorICoKKyAqIFRoZSB0eXBlIG9mIGZyYW1lIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQgZm9yIGlzIGFsc28gZGVwZW5kZW50IG9uIHRoZQorICogZHJpdmVyIGFuZCBpbnRlcmZhY2UgdHlwZS4gVGhlIGZyYW1lIHR5cGVzIGFyZSBhZHZlcnRpc2VkIGluIHdpcGh5CisgKiBhdHRyaWJ1dGVzIHNvIGFwcGxpY2F0aW9ucyBrbm93IHdoYXQgdG8gZXhwZWN0LgorICoKKyAqIE5PVEU6IFdoZW4gYW4gaW50ZXJmYWNlIGNoYW5nZXMgdHlwZSB3aGlsZSByZWdpc3RyYXRpb25zIGFyZSBhY3RpdmUsCisgKiAgICAgICB0aGVzZSByZWdpc3RyYXRpb25zIGFyZSBpZ25vcmVkIHVudGlsIHRoZSBpbnRlcmZhY2UgdHlwZSBpcworICogICAgICAgY2hhbmdlZCBhZ2Fpbi4gVGhpcyBtZWFucyB0aGF0IGNoYW5naW5nIHRoZSBpbnRlcmZhY2UgdHlwZSBjYW4KKyAqICAgICAgIGxlYWQgdG8gYSBzaXR1YXRpb24gdGhhdCBjb3VsZG4ndCBvdGhlcndpc2UgYmUgcHJvZHVjZWQsIGJ1dAorICogICAgICAgYW55IHN1Y2ggcmVnaXN0cmF0aW9ucyB3aWxsIGJlIGRvcm1hbnQgaW4gdGhlIHNlbnNlIHRoYXQgdGhleQorICogICAgICAgd2lsbCBub3QgYmUgc2VydmljZWQsIGkuZS4gdGhleSB3aWxsIG5vdCByZWNlaXZlIGFueSBmcmFtZXMuCisgKgorICogRnJhbWUgdHJhbnNtaXNzaW9uIGFsbG93cyB1c2Vyc3BhY2UgdG8gc2VuZCBmb3IgZXhhbXBsZSB0aGUgcmVxdWlyZWQKKyAqIHJlc3BvbnNlcyB0byBhY3Rpb24gZnJhbWVzLiBJdCBpcyBzdWJqZWN0IHRvIHNvbWUgc2FuaXR5IGNoZWNraW5nLAorICogYnV0IG1hbnkgZnJhbWVzIGNhbiBiZSB0cmFuc21pdHRlZC4gV2hlbiBhIGZyYW1lIHdhcyB0cmFuc21pdHRlZCwgaXRzCisgKiBzdGF0dXMgaXMgaW5kaWNhdGVkIHRvIHRoZSBzZW5kaW5nIHNvY2tldC4KKyAqCisgKiBGb3IgbW9yZSB0ZWNobmljYWwgZGV0YWlscywgc2VlIHRoZSBjb3JyZXNwb25kaW5nIGNvbW1hbmQgZGVzY3JpcHRpb25zCisgKiBiZWxvdy4KKyAqLworCisvKioKKyAqIERPQzogVmlydHVhbCBpbnRlcmZhY2UgLyBjb25jdXJyZW5jeSBjYXBhYmlsaXRpZXMKKyAqCisgKiBTb21lIGRldmljZXMgYXJlIGFibGUgdG8gb3BlcmF0ZSB3aXRoIHZpcnR1YWwgTUFDcywgdGhleSBjYW4gaGF2ZQorICogbW9yZSB0aGFuIG9uZSB2aXJ0dWFsIGludGVyZmFjZS4gVGhlIGNhcGFiaWxpdHkgaGFuZGxpbmcgZm9yIHRoaXMKKyAqIGlzIGEgYml0IGNvbXBsZXggdGhvdWdoLCBhcyB0aGVyZSBtYXkgYmUgYSBudW1iZXIgb2YgcmVzdHJpY3Rpb25zCisgKiBvbiB0aGUgdHlwZXMgb2YgY29uY3VycmVuY3kgdGhhdCBhcmUgc3VwcG9ydGVkLgorICoKKyAqIFRvIHN0YXJ0IHdpdGgsIGVhY2ggZGV2aWNlIHN1cHBvcnRzIHRoZSBpbnRlcmZhY2UgdHlwZXMgbGlzdGVkIGluCisgKiB0aGUgJU5MODAyMTFfQVRUUl9TVVBQT1JURURfSUZUWVBFUyBhdHRyaWJ1dGUsIGJ1dCBieSBsaXN0aW5nIHRoZQorICogdHlwZXMgdGhlcmUgbm8gY29uY3VycmVuY3kgaXMgaW1wbGllZC4KKyAqCisgKiBPbmNlIGNvbmN1cnJlbmN5IGlzIGRlc2lyZWQsIG1vcmUgYXR0cmlidXRlcyBtdXN0IGJlIG9ic2VydmVkOgorICogVG8gc3RhcnQgd2l0aCwgc2luY2Ugc29tZSBpbnRlcmZhY2UgdHlwZXMgYXJlIHB1cmVseSBtYW5hZ2VkIGluCisgKiBzb2Z0d2FyZSwgbGlrZSB0aGUgQVAtVkxBTiB0eXBlIGluIG1hYzgwMjExIGZvciBleGFtcGxlLCB0aGVyZSdzCisgKiBhbiBhZGRpdGlvbmFsIGxpc3Qgb2YgdGhlc2UsIHRoZXkgY2FuIGJlIGFkZGVkIGF0IGFueSB0aW1lIGFuZAorICogYXJlIG9ubHkgcmVzdHJpY3RlZCBieSBzb21lIHNlbWFudGljIHJlc3RyaWN0aW9ucyAoZS5nLiBBUC1WTEFOCisgKiBjYW5ub3QgYmUgYWRkZWQgd2l0aG91dCBhIGNvcnJlc3BvbmRpbmcgQVAgaW50ZXJmYWNlKS4gVGhpcyBsaXN0CisgKiBpcyBleHBvcnRlZCBpbiB0aGUgJU5MODAyMTFfQVRUUl9TT0ZUV0FSRV9JRlRZUEVTIGF0dHJpYnV0ZS4KKyAqCisgKiBGdXJ0aGVyLCB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgY29tYmluYXRpb25zIGlzIGV4cG9ydGVkLiBUaGlzIGlzCisgKiBpbiB0aGUgJU5MODAyMTFfQVRUUl9JTlRFUkZBQ0VfQ09NQklOQVRJT05TIGF0dHJpYnV0ZS4gQmFzaWNhbGx5LAorICogaXQgZXhwb3J0cyBhIGxpc3Qgb2YgImdyb3VwcyIsIGFuZCBhdCBhbnkgcG9pbnQgaW4gdGltZSB0aGUKKyAqIGludGVyZmFjZXMgdGhhdCBhcmUgY3VycmVudGx5IGFjdGl2ZSBtdXN0IGZhbGwgaW50byBhbnkgb25lIG9mCisgKiB0aGUgYWR2ZXJ0aXNlZCBncm91cHMuIFdpdGhpbiBlYWNoIGdyb3VwLCB0aGVyZSBhcmUgcmVzdHJpY3Rpb25zCisgKiBvbiB0aGUgbnVtYmVyIG9mIGludGVyZmFjZXMgb2YgZGlmZmVyZW50IHR5cGVzIHRoYXQgYXJlIHN1cHBvcnRlZAorICogYW5kIGFsc28gdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgY2hhbm5lbHMsIGFsb25nIHdpdGggcG90ZW50aWFsbHkKKyAqIHNvbWUgb3RoZXIgcmVzdHJpY3Rpb25zLiBTZWUgJmVudW0gbmw4MDIxMV9pZl9jb21iaW5hdGlvbl9hdHRycy4KKyAqCisgKiBBbGwgdG9nZXRoZXIsIHRoZXNlIGF0dHJpYnV0ZXMgZGVmaW5lIHRoZSBjb25jdXJyZW5jeSBvZiB2aXJ0dWFsCisgKiBpbnRlcmZhY2VzIHRoYXQgYSBnaXZlbiBkZXZpY2Ugc3VwcG9ydHMuCisgKi8KKworLyoqCisgKiBlbnVtIG5sODAyMTFfY29tbWFuZHMgLSBzdXBwb3J0ZWQgbmw4MDIxMSBjb21tYW5kcworICoKKyAqIEBOTDgwMjExX0NNRF9VTlNQRUM6IHVuc3BlY2lmaWVkIGNvbW1hbmQgdG8gY2F0Y2ggZXJyb3JzCisgKgorICogQE5MODAyMTFfQ01EX0dFVF9XSVBIWTogcmVxdWVzdCBpbmZvcm1hdGlvbiBhYm91dCBhIHdpcGh5IG9yIGR1bXAgcmVxdWVzdAorICoJdG8gZ2V0IGEgbGlzdCBvZiBhbGwgcHJlc2VudCB3aXBoeXMuCisgKiBATkw4MDIxMV9DTURfU0VUX1dJUEhZOiBzZXQgd2lwaHkgcGFyYW1ldGVycywgbmVlZHMgJU5MODAyMTFfQVRUUl9XSVBIWSBvcgorICoJJU5MODAyMTFfQVRUUl9JRklOREVYOyBjYW4gYmUgdXNlZCB0byBzZXQgJU5MODAyMTFfQVRUUl9XSVBIWV9OQU1FLAorICoJJU5MODAyMTFfQVRUUl9XSVBIWV9UWFFfUEFSQU1TLCAlTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEsCisgKgklTkw4MDIxMV9BVFRSX1dJUEhZX0NIQU5ORUxfVFlQRSwgJU5MODAyMTFfQVRUUl9XSVBIWV9SRVRSWV9TSE9SVCwKKyAqCSVOTDgwMjExX0FUVFJfV0lQSFlfUkVUUllfTE9ORywgJU5MODAyMTFfQVRUUl9XSVBIWV9GUkFHX1RIUkVTSE9MRCwKKyAqCWFuZC9vciAlTkw4MDIxMV9BVFRSX1dJUEhZX1JUU19USFJFU0hPTEQuCisgKglIb3dldmVyLCBmb3Igc2V0dGluZyB0aGUgY2hhbm5lbCwgc2VlICVOTDgwMjExX0NNRF9TRVRfQ0hBTk5FTAorICoJaW5zdGVhZCwgdGhlIHN1cHBvcnQgaGVyZSBpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBvbmx5LgorICogQE5MODAyMTFfQ01EX05FV19XSVBIWTogTmV3bHkgY3JlYXRlZCB3aXBoeSwgcmVzcG9uc2UgdG8gZ2V0IHJlcXVlc3QKKyAqCW9yIHJlbmFtZSBub3RpZmljYXRpb24uIEhhcyBhdHRyaWJ1dGVzICVOTDgwMjExX0FUVFJfV0lQSFkgYW5kCisgKgklTkw4MDIxMV9BVFRSX1dJUEhZX05BTUUuCisgKiBATkw4MDIxMV9DTURfREVMX1dJUEhZOiBXaXBoeSBkZWxldGVkLiBIYXMgYXR0cmlidXRlcworICoJJU5MODAyMTFfQVRUUl9XSVBIWSBhbmQgJU5MODAyMTFfQVRUUl9XSVBIWV9OQU1FLgorICoKKyAqIEBOTDgwMjExX0NNRF9HRVRfSU5URVJGQUNFOiBSZXF1ZXN0IGFuIGludGVyZmFjZSdzIGNvbmZpZ3VyYXRpb247CisgKgllaXRoZXIgYSBkdW1wIHJlcXVlc3Qgb24gYSAlTkw4MDIxMV9BVFRSX1dJUEhZIG9yIGEgc3BlY2lmaWMgZ2V0CisgKglvbiBhbiAlTkw4MDIxMV9BVFRSX0lGSU5ERVggaXMgc3VwcG9ydGVkLgorICogQE5MODAyMTFfQ01EX1NFVF9JTlRFUkZBQ0U6IFNldCB0eXBlIG9mIGEgdmlydHVhbCBpbnRlcmZhY2UsIHJlcXVpcmVzCisgKgklTkw4MDIxMV9BVFRSX0lGSU5ERVggYW5kICVOTDgwMjExX0FUVFJfSUZUWVBFLgorICogQE5MODAyMTFfQ01EX05FV19JTlRFUkZBQ0U6IE5ld2x5IGNyZWF0ZWQgdmlydHVhbCBpbnRlcmZhY2Ugb3IgcmVzcG9uc2UKKyAqCXRvICVOTDgwMjExX0NNRF9HRVRfSU5URVJGQUNFLiBIYXMgJU5MODAyMTFfQVRUUl9JRklOREVYLAorICoJJU5MODAyMTFfQVRUUl9XSVBIWSBhbmQgJU5MODAyMTFfQVRUUl9JRlRZUEUgYXR0cmlidXRlcy4gQ2FuIGFsc28KKyAqCWJlIHNlbnQgZnJvbSB1c2Vyc3BhY2UgdG8gcmVxdWVzdCBjcmVhdGlvbiBvZiBhIG5ldyB2aXJ0dWFsIGludGVyZmFjZSwKKyAqCXRoZW4gcmVxdWlyZXMgYXR0cmlidXRlcyAlTkw4MDIxMV9BVFRSX1dJUEhZLCAlTkw4MDIxMV9BVFRSX0lGVFlQRSBhbmQKKyAqCSVOTDgwMjExX0FUVFJfSUZOQU1FLgorICogQE5MODAyMTFfQ01EX0RFTF9JTlRFUkZBQ0U6IFZpcnR1YWwgaW50ZXJmYWNlIHdhcyBkZWxldGVkLCBoYXMgYXR0cmlidXRlcworICoJJU5MODAyMTFfQVRUUl9JRklOREVYIGFuZCAlTkw4MDIxMV9BVFRSX1dJUEhZLiBDYW4gYWxzbyBiZSBzZW50IGZyb20KKyAqCXVzZXJzcGFjZSB0byByZXF1ZXN0IGRlbGV0aW9uIG9mIGEgdmlydHVhbCBpbnRlcmZhY2UsIHRoZW4gcmVxdWlyZXMKKyAqCWF0dHJpYnV0ZSAlTkw4MDIxMV9BVFRSX0lGSU5ERVguCisgKgorICogQE5MODAyMTFfQ01EX0dFVF9LRVk6IEdldCBzZXF1ZW5jZSBjb3VudGVyIGluZm9ybWF0aW9uIGZvciBhIGtleSBzcGVjaWZpZWQKKyAqCWJ5ICVOTDgwMjExX0FUVFJfS0VZX0lEWCBhbmQvb3IgJU5MODAyMTFfQVRUUl9NQUMuCisgKiBATkw4MDIxMV9DTURfU0VUX0tFWTogU2V0IGtleSBhdHRyaWJ1dGVzICVOTDgwMjExX0FUVFJfS0VZX0RFRkFVTFQsCisgKgklTkw4MDIxMV9BVFRSX0tFWV9ERUZBVUxUX01HTVQsIG9yICVOTDgwMjExX0FUVFJfS0VZX1RIUkVTSE9MRC4KKyAqIEBOTDgwMjExX0NNRF9ORVdfS0VZOiBhZGQgYSBrZXkgd2l0aCBnaXZlbiAlTkw4MDIxMV9BVFRSX0tFWV9EQVRBLAorICoJJU5MODAyMTFfQVRUUl9LRVlfSURYLCAlTkw4MDIxMV9BVFRSX01BQywgJU5MODAyMTFfQVRUUl9LRVlfQ0lQSEVSLAorICoJYW5kICVOTDgwMjExX0FUVFJfS0VZX1NFUSBhdHRyaWJ1dGVzLgorICogQE5MODAyMTFfQ01EX0RFTF9LRVk6IGRlbGV0ZSBhIGtleSBpZGVudGlmaWVkIGJ5ICVOTDgwMjExX0FUVFJfS0VZX0lEWAorICoJb3IgJU5MODAyMTFfQVRUUl9NQUMuCisgKgorICogQE5MODAyMTFfQ01EX0dFVF9CRUFDT046IHJldHJpZXZlIGJlYWNvbiBpbmZvcm1hdGlvbiAocmV0dXJuZWQgaW4gYQorICoJJU5MODAyMjJfQ01EX05FV19CRUFDT04gbWVzc2FnZSkKKyAqIEBOTDgwMjExX0NNRF9TRVRfQkVBQ09OOiBzZXQgdGhlIGJlYWNvbiBvbiBhbiBhY2Nlc3MgcG9pbnQgaW50ZXJmYWNlCisgKgl1c2luZyB0aGUgJU5MODAyMTFfQVRUUl9CRUFDT05fSU5URVJWQUwsICVOTDgwMjExX0FUVFJfRFRJTV9QRVJJT0QsCisgKgklTkw4MDIxMV9BVFRSX0JFQUNPTl9IRUFEIGFuZCAlTkw4MDIxMV9BVFRSX0JFQUNPTl9UQUlMIGF0dHJpYnV0ZXMuCisgKglGb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgcHJvdmlkZWQgZm9yIGRyaXZlcnMgdGhhdCBnZW5lcmF0ZSBmdWxsIEJlYWNvbgorICoJYW5kIFByb2JlIFJlc3BvbnNlIGZyYW1lcyBpbnRlcm5hbGx5OiAlTkw4MDIxMV9BVFRSX1NTSUQsCisgKgklTkw4MDIxMV9BVFRSX0hJRERFTl9TU0lELCAlTkw4MDIxMV9BVFRSX0NJUEhFUlNfUEFJUldJU0UsCisgKgklTkw4MDIxMV9BVFRSX0NJUEhFUl9HUk9VUCwgJU5MODAyMTFfQVRUUl9XUEFfVkVSU0lPTlMsCisgKgklTkw4MDIxMV9BVFRSX0FLTV9TVUlURVMsICVOTDgwMjExX0FUVFJfUFJJVkFDWSwKKyAqCSVOTDgwMjExX0FUVFJfQVVUSF9UWVBFLCAlTkw4MDIxMV9BVFRSX0lFLCAlTkw4MDIxMV9BVFRSX0lFX1BST0JFX1JFU1AsCisgKgklTkw4MDIxMV9BVFRSX0lFX0FTU09DX1JFU1AuCisgKiBATkw4MDIxMV9DTURfTkVXX0JFQUNPTjogYWRkIGEgbmV3IGJlYWNvbiB0byBhbiBhY2Nlc3MgcG9pbnQgaW50ZXJmYWNlLAorICoJcGFyYW1ldGVycyBhcmUgbGlrZSBmb3IgJU5MODAyMTFfQ01EX1NFVF9CRUFDT04uCisgKiBATkw4MDIxMV9DTURfREVMX0JFQUNPTjogcmVtb3ZlIHRoZSBiZWFjb24sIHN0b3Agc2VuZGluZyBpdAorICoKKyAqIEBOTDgwMjExX0NNRF9HRVRfU1RBVElPTjogR2V0IHN0YXRpb24gYXR0cmlidXRlcyBmb3Igc3RhdGlvbiBpZGVudGlmaWVkIGJ5CisgKgklTkw4MDIxMV9BVFRSX01BQyBvbiB0aGUgaW50ZXJmYWNlIGlkZW50aWZpZWQgYnkgJU5MODAyMTFfQVRUUl9JRklOREVYLgorICogQE5MODAyMTFfQ01EX1NFVF9TVEFUSU9OOiBTZXQgc3RhdGlvbiBhdHRyaWJ1dGVzIGZvciBzdGF0aW9uIGlkZW50aWZpZWQgYnkKKyAqCSVOTDgwMjExX0FUVFJfTUFDIG9uIHRoZSBpbnRlcmZhY2UgaWRlbnRpZmllZCBieSAlTkw4MDIxMV9BVFRSX0lGSU5ERVguCisgKiBATkw4MDIxMV9DTURfTkVXX1NUQVRJT046IEFkZCBhIHN0YXRpb24gd2l0aCBnaXZlbiBhdHRyaWJ1dGVzIHRvIHRoZQorICoJdGhlIGludGVyZmFjZSBpZGVudGlmaWVkIGJ5ICVOTDgwMjExX0FUVFJfSUZJTkRFWC4KKyAqIEBOTDgwMjExX0NNRF9ERUxfU1RBVElPTjogUmVtb3ZlIGEgc3RhdGlvbiBpZGVudGlmaWVkIGJ5ICVOTDgwMjExX0FUVFJfTUFDCisgKglvciwgaWYgbm8gTUFDIGFkZHJlc3MgZ2l2ZW4sIGFsbCBzdGF0aW9ucywgb24gdGhlIGludGVyZmFjZSBpZGVudGlmaWVkCisgKglieSAlTkw4MDIxMV9BVFRSX0lGSU5ERVguCisgKgorICogQE5MODAyMTFfQ01EX0dFVF9NUEFUSDogR2V0IG1lc2ggcGF0aCBhdHRyaWJ1dGVzIGZvciBtZXNoIHBhdGggdG8KKyAqIAlkZXN0aW5hdGlvbiAlTkw4MDIxMV9BVFRSX01BQyBvbiB0aGUgaW50ZXJmYWNlIGlkZW50aWZpZWQgYnkKKyAqIAklTkw4MDIxMV9BVFRSX0lGSU5ERVguCisgKiBATkw4MDIxMV9DTURfU0VUX01QQVRIOiAgU2V0IG1lc2ggcGF0aCBhdHRyaWJ1dGVzIGZvciBtZXNoIHBhdGggdG8KKyAqIAlkZXN0aW5hdGlvbiAlTkw4MDIxMV9BVFRSX01BQyBvbiB0aGUgaW50ZXJmYWNlIGlkZW50aWZpZWQgYnkKKyAqIAklTkw4MDIxMV9BVFRSX0lGSU5ERVguCisgKiBATkw4MDIxMV9DTURfTkVXX01QQVRIOiBDcmVhdGUgYSBuZXcgbWVzaCBwYXRoIGZvciB0aGUgZGVzdGluYXRpb24gZ2l2ZW4gYnkKKyAqCSVOTDgwMjExX0FUVFJfTUFDIHZpYSAlTkw4MDIxMV9BVFRSX01QQVRIX05FWFRfSE9QLgorICogQE5MODAyMTFfQ01EX0RFTF9NUEFUSDogRGVsZXRlIGEgbWVzaCBwYXRoIHRvIHRoZSBkZXN0aW5hdGlvbiBnaXZlbiBieQorICoJJU5MODAyMTFfQVRUUl9NQUMuCisgKiBATkw4MDIxMV9DTURfTkVXX1BBVEg6IEFkZCBhIG1lc2ggcGF0aCB3aXRoIGdpdmVuIGF0dHJpYnV0ZXMgdG8gdGhlCisgKgl0aGUgaW50ZXJmYWNlIGlkZW50aWZpZWQgYnkgJU5MODAyMTFfQVRUUl9JRklOREVYLgorICogQE5MODAyMTFfQ01EX0RFTF9QQVRIOiBSZW1vdmUgYSBtZXNoIHBhdGggaWRlbnRpZmllZCBieSAlTkw4MDIxMV9BVFRSX01BQworICoJb3IsIGlmIG5vIE1BQyBhZGRyZXNzIGdpdmVuLCBhbGwgbWVzaCBwYXRocywgb24gdGhlIGludGVyZmFjZSBpZGVudGlmaWVkCisgKglieSAlTkw4MDIxMV9BVFRSX0lGSU5ERVguCisgKiBATkw4MDIxMV9DTURfU0VUX0JTUzogU2V0IEJTUyBhdHRyaWJ1dGVzIGZvciBCU1MgaWRlbnRpZmllZCBieQorICoJJU5MODAyMTFfQVRUUl9JRklOREVYLgorICoKKyAqIEBOTDgwMjExX0NNRF9HRVRfUkVHOiBhc2sgdGhlIHdpcmVsZXNzIGNvcmUgdG8gc2VuZCB1cyBpdHMgY3VycmVudGx5IHNldAorICogCXJlZ3VsYXRvcnkgZG9tYWluLgorICogQE5MODAyMTFfQ01EX1NFVF9SRUc6IFNldCBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluLiBDUkRBIHNlbmRzIHRoaXMgY29tbWFuZAorICoJYWZ0ZXIgYmVpbmcgcXVlcmllZCBieSB0aGUga2VybmVsLiBDUkRBIHJlcGxpZXMgYnkgc2VuZGluZyBhIHJlZ3VsYXRvcnkKKyAqCWRvbWFpbiBzdHJ1Y3R1cmUgd2hpY2ggY29uc2lzdHMgb2YgJU5MODAyMTFfQVRUUl9SRUdfQUxQSEEgc2V0IHRvIG91cgorICoJY3VycmVudCBhbHBoYTIgaWYgaXQgZm91bmQgYSBtYXRjaC4gSXQgYWxzbyBwcm92aWRlcworICogCU5MODAyMTFfQVRUUl9SRUdfUlVMRV9GTEFHUywgYW5kIGEgc2V0IG9mIHJlZ3VsYXRvcnkgcnVsZXMuIEVhY2gKKyAqIAlyZWd1bGF0b3J5IHJ1bGUgaXMgYSBuZXN0ZWQgc2V0IG9mIGF0dHJpYnV0ZXMgIGdpdmVuIGJ5CisgKiAJJU5MODAyMTFfQVRUUl9SRUdfUlVMRV9GUkVRX1tTVEFSVHxFTkRdIGFuZAorICogCSVOTDgwMjExX0FUVFJfRlJFUV9SQU5HRV9NQVhfQlcgd2l0aCBhbiBhdHRhY2hlZCBwb3dlciBydWxlIGdpdmVuIGJ5CisgKiAJJU5MODAyMTFfQVRUUl9SRUdfUlVMRV9QT1dFUl9NQVhfQU5UX0dBSU4gYW5kCisgKiAJJU5MODAyMTFfQVRUUl9SRUdfUlVMRV9QT1dFUl9NQVhfRUlSUC4KKyAqIEBOTDgwMjExX0NNRF9SRVFfU0VUX1JFRzogYXNrIHRoZSB3aXJlbGVzcyBjb3JlIHRvIHNldCB0aGUgcmVndWxhdG9yeSBkb21haW4KKyAqIAl0byB0aGUgc3BlY2lmaWVkIElTTy9JRUMgMzE2Ni0xIGFscGhhMiBjb3VudHJ5IGNvZGUuIFRoZSBjb3JlIHdpbGwKKyAqIAlzdG9yZSB0aGlzIGFzIGEgdmFsaWQgcmVxdWVzdCBhbmQgdGhlbiBxdWVyeSB1c2Vyc3BhY2UgZm9yIGl0LgorICoKKyAqIEBOTDgwMjExX0NNRF9HRVRfTUVTSF9DT05GSUc6IEdldCBtZXNoIG5ldHdvcmtpbmcgcHJvcGVydGllcyBmb3IgdGhlCisgKglpbnRlcmZhY2UgaWRlbnRpZmllZCBieSAlTkw4MDIxMV9BVFRSX0lGSU5ERVgKKyAqCisgKiBATkw4MDIxMV9DTURfU0VUX01FU0hfQ09ORklHOiBTZXQgbWVzaCBuZXR3b3JraW5nIHByb3BlcnRpZXMgZm9yIHRoZQorICogICAgICBpbnRlcmZhY2UgaWRlbnRpZmllZCBieSAlTkw4MDIxMV9BVFRSX0lGSU5ERVgKKyAqCisgKiBATkw4MDIxMV9DTURfU0VUX01HTVRfRVhUUkFfSUU6IFNldCBleHRyYSBJRXMgZm9yIG1hbmFnZW1lbnQgZnJhbWVzLiBUaGUKKyAqCWludGVyZmFjZSBpcyBpZGVudGlmaWVkIHdpdGggJU5MODAyMTFfQVRUUl9JRklOREVYIGFuZCB0aGUgbWFuYWdlbWVudAorICoJZnJhbWUgc3VidHlwZSB3aXRoICVOTDgwMjExX0FUVFJfTUdNVF9TVUJUWVBFLiBUaGUgZXh0cmEgSUUgZGF0YSB0byBiZQorICoJYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIG1hbmFnZW1lbnQgZnJhbWUgaXMgc3BlY2lmaWVkIHdpdGgKKyAqCSVOTDgwMjExX0FUVFJfSUUuIElmIHRoZSBjb21tYW5kIHN1Y2NlZWRzLCB0aGUgcmVxdWVzdGVkIGRhdGEgd2lsbCBiZQorICoJYWRkZWQgdG8gYWxsIHNwZWNpZmllZCBtYW5hZ2VtZW50IGZyYW1lcyBnZW5lcmF0ZWQgYnkKKyAqCWtlcm5lbC9maXJtd2FyZS9kcml2ZXIuCisgKglOb3RlOiBUaGlzIGNvbW1hbmQgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgaXQgaXMgb25seSByZXNlcnZlZCBhdCB0aGlzCisgKglwb2ludCB0byBhdm9pZCByZS11c2luZyBleGlzdGluZyBjb21tYW5kIG51bWJlci4gVGhlIGZ1bmN0aW9uYWxpdHkgdGhpcworICoJY29tbWFuZCB3YXMgcGxhbm5lZCBmb3IgaGFzIGJlZW4gcHJvdmlkZWQgd2l0aCBjbGVhbmVyIGRlc2lnbiB3aXRoIHRoZQorICoJb3B0aW9uIHRvIHNwZWNpZnkgYWRkaXRpb25hbCBJRXMgaW4gTkw4MDIxMV9DTURfVFJJR0dFUl9TQ0FOLAorICoJTkw4MDIxMV9DTURfQVVUSEVOVElDQVRFLCBOTDgwMjExX0NNRF9BU1NPQ0lBVEUsCisgKglOTDgwMjExX0NNRF9ERUFVVEhFTlRJQ0FURSwgYW5kIE5MODAyMTFfQ01EX0RJU0FTU09DSUFURS4KKyAqCisgKiBATkw4MDIxMV9DTURfR0VUX1NDQU46IGdldCBzY2FuIHJlc3VsdHMKKyAqIEBOTDgwMjExX0NNRF9UUklHR0VSX1NDQU46IHRyaWdnZXIgYSBuZXcgc2NhbiB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzCisgKgklTkw4MDIxMV9BVFRSX1RYX05PX0NDS19SQVRFIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8gc2VuZCB0aGUKKyAqCXByb2JlIHJlcXVlc3RzIGF0IENDSyByYXRlIG9yIG5vdC4KKyAqIEBOTDgwMjExX0NNRF9ORVdfU0NBTl9SRVNVTFRTOiBzY2FuIG5vdGlmaWNhdGlvbiAoYXMgYSByZXBseSB0bworICoJTkw4MDIxMV9DTURfR0VUX1NDQU4gYW5kIG9uIHRoZSAic2NhbiIgbXVsdGljYXN0IGdyb3VwKQorICogQE5MODAyMTFfQ01EX1NDQU5fQUJPUlRFRDogc2NhbiB3YXMgYWJvcnRlZCwgZm9yIHVuc3BlY2lmaWVkIHJlYXNvbnMsCisgKglwYXJ0aWFsIHNjYW4gcmVzdWx0cyBtYXkgYmUgYXZhaWxhYmxlCisgKgorICogQE5MODAyMTFfQ01EX1NUQVJUX1NDSEVEX1NDQU46IHN0YXJ0IGEgc2NoZWR1bGVkIHNjYW4gYXQgY2VydGFpbgorICoJaW50ZXJ2YWxzLCBhcyBzcGVjaWZpZWQgYnkgJU5MODAyMTFfQVRUUl9TQ0hFRF9TQ0FOX0lOVEVSVkFMLgorICoJTGlrZSB3aXRoIG5vcm1hbCBzY2FucywgaWYgU1NJRHMgKCVOTDgwMjExX0FUVFJfU0NBTl9TU0lEUykKKyAqCWFyZSBwYXNzZWQsIHRoZXkgYXJlIHVzZWQgaW4gdGhlIHByb2JlIHJlcXVlc3RzLiAgRm9yCisgKglicm9hZGNhc3QsIGEgYnJvYWRjYXN0IFNTSUQgbXVzdCBiZSBwYXNzZWQgKGllLiBhbiBlbXB0eQorICoJc3RyaW5nKS4gIElmIG5vIFNTSUQgaXMgcGFzc2VkLCBubyBwcm9iZSByZXF1ZXN0cyBhcmUgc2VudCBhbmQKKyAqCWEgcGFzc2l2ZSBzY2FuIGlzIHBlcmZvcm1lZC4gICVOTDgwMjExX0FUVFJfU0NBTl9GUkVRVUVOQ0lFUywKKyAqCWlmIHBhc3NlZCwgZGVmaW5lIHdoaWNoIGNoYW5uZWxzIHNob3VsZCBiZSBzY2FubmVkOyBpZiBub3QKKyAqCXBhc3NlZCwgYWxsIGNoYW5uZWxzIGFsbG93ZWQgZm9yIHRoZSBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluCisgKglhcmUgdXNlZC4gIEV4dHJhIElFcyBjYW4gYWxzbyBiZSBwYXNzZWQgZnJvbSB0aGUgdXNlcnNwYWNlIGJ5CisgKgl1c2luZyB0aGUgJU5MODAyMTFfQVRUUl9JRSBhdHRyaWJ1dGUuCisgKiBATkw4MDIxMV9DTURfU1RPUF9TQ0hFRF9TQ0FOOiBzdG9wIGEgc2NoZWR1bGVkIHNjYW4uICBSZXR1cm5zIC1FTk9FTlQKKyAqCWlmIHNjaGVkdWxlZCBzY2FuIGlzIG5vdCBydW5uaW5nLgorICogQE5MODAyMTFfQ01EX1NDSEVEX1NDQU5fUkVTVUxUUzogaW5kaWNhdGVzIHRoYXQgdGhlcmUgYXJlIHNjaGVkdWxlZCBzY2FuCisgKglyZXN1bHRzIGF2YWlsYWJsZS4KKyAqIEBOTDgwMjExX0NNRF9TQ0hFRF9TQ0FOX1NUT1BQRUQ6IGluZGljYXRlcyB0aGF0IHRoZSBzY2hlZHVsZWQgc2NhbiBoYXMKKyAqCXN0b3BwZWQuICBUaGUgZHJpdmVyIG1heSBpc3N1ZSB0aGlzIGV2ZW50IGF0IGFueSB0aW1lIGR1cmluZyBhCisgKglzY2hlZHVsZWQgc2Nhbi4gIE9uZSByZWFzb24gZm9yIHN0b3BwaW5nIHRoZSBzY2FuIGlzIGlmIHRoZSBoYXJkd2FyZQorICoJZG9lcyBub3Qgc3VwcG9ydCBzdGFydGluZyBhbiBhc3NvY2lhdGlvbiBvciBhIG5vcm1hbCBzY2FuIHdoaWxlIHJ1bm5pbmcKKyAqCWEgc2NoZWR1bGVkIHNjYW4uICBUaGlzIGV2ZW50IGlzIGFsc28gc2VudCB3aGVuIHRoZQorICoJJU5MODAyMTFfQ01EX1NUT1BfU0NIRURfU0NBTiBjb21tYW5kIGlzIHJlY2VpdmVkIG9yIHdoZW4gdGhlIGludGVyZmFjZQorICoJaXMgYnJvdWdodCBkb3duIHdoaWxlIGEgc2NoZWR1bGVkIHNjYW4gd2FzIHJ1bm5pbmcuCisgKgorICogQE5MODAyMTFfQ01EX0dFVF9TVVJWRVk6IGdldCBzdXJ2ZXkgcmVzdWxzLCBlLmcuIGNoYW5uZWwgb2NjdXBhdGlvbgorICogICAgICBvciBub2lzZSBsZXZlbAorICogQE5MODAyMTFfQ01EX05FV19TVVJWRVlfUkVTVUxUUzogc3VydmV5IGRhdGEgbm90aWZpY2F0aW9uIChhcyBhIHJlcGx5IHRvCisgKglOTDgwMjExX0NNRF9HRVRfU1VSVkVZIGFuZCBvbiB0aGUgInNjYW4iIG11bHRpY2FzdCBncm91cCkKKyAqCisgKiBATkw4MDIxMV9DTURfUkVHX0NIQU5HRTogaW5kaWNhdGVzIHRvIHVzZXJzcGFjZSB0aGUgcmVndWxhdG9yeSBkb21haW4KKyAqIAloYXMgYmVlbiBjaGFuZ2VkIGFuZCBwcm92aWRlcyBkZXRhaWxzIG9mIHRoZSByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiAJdGhhdCBjYXVzZWQgdGhlIGNoYW5nZSBzdWNoIGFzIHdobyBpbml0aWF0ZWQgdGhlIHJlZ3VsYXRvcnkgcmVxdWVzdAorICogCSglTkw4MDIxMV9BVFRSX1JFR19JTklUSUFUT1IpLCB0aGUgd2lwaHlfaWR4CisgKiAJKCVOTDgwMjExX0FUVFJfUkVHX0FMUEhBMikgb24gd2hpY2ggdGhlIHJlcXVlc3Qgd2FzIG1hZGUgZnJvbSBpZgorICogCXRoZSBpbml0aWF0b3Igd2FzICVOTDgwMjExX1JFR0RPTV9TRVRfQllfQ09VTlRSWV9JRSBvcgorICogCSVOTDgwMjExX1JFR0RPTV9TRVRfQllfRFJJVkVSLCB0aGUgdHlwZSBvZiByZWd1bGF0b3J5IGRvbWFpbgorICogCXNldCAoJU5MODAyMTFfQVRUUl9SRUdfVFlQRSksIGlmIHRoZSB0eXBlIG9mIHJlZ3VsYXRvcnkgZG9tYWluIGlzCisgKiAJJU5MODAyMTFfUkVHX1RZUEVfQ09VTlRSWSB0aGUgYWxwaGEyIHRvIHdoaWNoIHdlIGhhdmUgbW92ZWQgb24KKyAqIAl0byAoJU5MODAyMTFfQVRUUl9SRUdfQUxQSEEyKS4KKyAqIEBOTDgwMjExX0NNRF9SRUdfQkVBQ09OX0hJTlQ6IGluZGljYXRlcyB0byB1c2Vyc3BhY2UgdGhhdCBhbiBBUCBiZWFjb24KKyAqIAloYXMgYmVlbiBmb3VuZCB3aGlsZSB3b3JsZCByb2FtaW5nIHRodXMgZW5hYmxpbmcgYWN0aXZlIHNjYW4gb3IKKyAqIAlhbnkgbW9kZSBvZiBvcGVyYXRpb24gdGhhdCBpbml0aWF0ZXMgVFggKGJlYWNvbnMpIG9uIGEgY2hhbm5lbAorICogCXdoZXJlIHdlIHdvdWxkIG5vdCBoYXZlIGJlZW4gYWJsZSB0byBkbyBlaXRoZXIgYmVmb3JlLiBBcyBhbiBleGFtcGxlCisgKiAJaWYgeW91IGFyZSB3b3JsZCByb2FtaW5nIChyZWd1bGF0b3J5IGRvbWFpbiBzZXQgdG8gd29ybGQgb3IgaWYgeW91cgorICogCWRyaXZlciBpcyB1c2luZyBhIGN1c3RvbSB3b3JsZCByb2FtaW5nIHJlZ3VsYXRvcnkgZG9tYWluKSBhbmQgd2hpbGUKKyAqIAlkb2luZyBhIHBhc3NpdmUgc2NhbiBvbiB0aGUgNSBHSHogYmFuZCB5b3UgZmluZCBhbiBBUCB0aGVyZSAoaWYgbm90CisgKiAJb24gYSBERlMgY2hhbm5lbCkgeW91IHdpbGwgbm93IGJlIGFibGUgdG8gYWN0aXZlbHkgc2NhbiBmb3IgdGhhdCBBUAorICogCW9yIHVzZSBBUCBtb2RlIG9uIHlvdXIgY2FyZCBvbiB0aGF0IHNhbWUgY2hhbm5lbC4gTm90ZSB0aGF0IHRoaXMgd2lsbAorICogCW5ldmVyIGJlIHVzZWQgZm9yIGNoYW5uZWxzIDEtMTEgb24gdGhlIDIgR0h6IGJhbmQgYXMgdGhleSBhcmUgYWx3YXlzCisgKiAJZW5hYmxlZCB3b3JsZCB3aWRlLiBUaGlzIGJlYWNvbiBoaW50IGlzIG9ubHkgc2VudCBpZiB5b3VyIGRldmljZSBoYWQKKyAqIAllaXRoZXIgZGlzYWJsZWQgYWN0aXZlIHNjYW5uaW5nIG9yIGJlYWNvbmluZyBvbiBhIGNoYW5uZWwuIFdlIHNlbmQgdG8KKyAqIAl1c2Vyc3BhY2UgdGhlIHdpcGh5IG9uIHdoaWNoIHdlIHJlbW92ZWQgYSByZXN0cmljdGlvbiBmcm9tCisgKiAJKCVOTDgwMjExX0FUVFJfV0lQSFkpIGFuZCB0aGUgY2hhbm5lbCBvbiB3aGljaCB0aGlzIG9jY3VycmVkCisgKiAJYmVmb3JlICglTkw4MDIxMV9BVFRSX0ZSRVFfQkVGT1JFKSBhbmQgYWZ0ZXIgKCVOTDgwMjExX0FUVFJfRlJFUV9BRlRFUikKKyAqIAl0aGUgYmVhY29uIGhpbnQgd2FzIHByb2Nlc3NlZC4KKyAqCisgKiBATkw4MDIxMV9DTURfQVVUSEVOVElDQVRFOiBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGFuZCBub3RpZmljYXRpb24uCisgKglUaGlzIGNvbW1hbmQgaXMgdXNlZCBib3RoIGFzIGEgY29tbWFuZCAocmVxdWVzdCB0byBhdXRoZW50aWNhdGUpIGFuZAorICoJYXMgYW4gZXZlbnQgb24gdGhlICJtbG1lIiBtdWx0aWNhc3QgZ3JvdXAgaW5kaWNhdGluZyBjb21wbGV0aW9uIG9mIHRoZQorICoJYXV0aGVudGljYXRpb24gcHJvY2Vzcy4KKyAqCVdoZW4gdXNlZCBhcyBhIGNvbW1hbmQsICVOTDgwMjExX0FUVFJfSUZJTkRFWCBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZQorICoJaW50ZXJmYWNlLiAlTkw4MDIxMV9BVFRSX01BQyBpcyB1c2VkIHRvIHNwZWNpZnkgUGVlclNUQUFkZHJlc3MgKGFuZAorICoJQlNTSUQgaW4gY2FzZSBvZiBzdGF0aW9uIG1vZGUpLiAlTkw4MDIxMV9BVFRSX1NTSUQgaXMgdXNlZCB0byBzcGVjaWZ5CisgKgl0aGUgU1NJRCAobWFpbmx5IGZvciBhc3NvY2lhdGlvbiwgYnV0IGlzIGluY2x1ZGVkIGluIGF1dGhlbnRpY2F0aW9uCisgKglyZXF1ZXN0LCB0b28sIHRvIGhlbHAgQlNTIHNlbGVjdGlvbi4gJU5MODAyMTFfQVRUUl9XSVBIWV9GUkVRIGlzIHVzZWQKKyAqCXRvIHNwZWNpZnkgdGhlIGZyZXF1ZW5jZSBvZiB0aGUgY2hhbm5lbCBpbiBNSHouICVOTDgwMjExX0FUVFJfQVVUSF9UWVBFCisgKglpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUuICVOTDgwMjExX0FUVFJfSUUgaXMgdXNlZCB0bworICoJZGVmaW5lIElFcyAoVmVuZG9yU3BlY2lmaWNJbmZvLCBidXQgYWxzbyBpbmNsdWRpbmcgUlNOIElFIGFuZCBGVCBJRXMpCisgKgl0byBiZSBhZGRlZCB0byB0aGUgZnJhbWUuCisgKglXaGVuIHVzZWQgYXMgYW4gZXZlbnQsIHRoaXMgcmVwb3J0cyByZWNlcHRpb24gb2YgYW4gQXV0aGVudGljYXRpb24KKyAqCWZyYW1lIGluIHN0YXRpb24gYW5kIElCU1MgbW9kZXMgd2hlbiB0aGUgbG9jYWwgTUxNRSBwcm9jZXNzZWQgdGhlCisgKglmcmFtZSwgaS5lLiwgaXQgd2FzIGZvciB0aGUgbG9jYWwgU1RBIGFuZCB3YXMgcmVjZWl2ZWQgaW4gY29ycmVjdAorICoJc3RhdGUuIFRoaXMgaXMgc2ltaWxhciB0byBNTE1FLUFVVEhFTlRJQ0FURS5jb25maXJtIHByaW1pdGl2ZSBpbiB0aGUKKyAqCU1MTUUgU0FQIGludGVyZmFjZSAoa2VybmVsIHByb3ZpZGluZyBNTE1FLCB1c2Vyc3BhY2UgU01FKS4gVGhlCisgKglpbmNsdWRlZCAlTkw4MDIxMV9BVFRSX0ZSQU1FIGF0dHJpYnV0ZSBjb250YWlucyB0aGUgbWFuYWdlbWVudCBmcmFtZQorICoJKGluY2x1ZGluZyBib3RoIHRoZSBoZWFkZXIgYW5kIGZyYW1lIGJvZHksIGJ1dCBub3QgRkNTKS4gVGhpcyBldmVudCBpcworICoJYWxzbyB1c2VkIHRvIGluZGljYXRlIGlmIHRoZSBhdXRoZW50aWNhdGlvbiBhdHRlbXB0IHRpbWVkIG91dC4gSW4gdGhhdAorICoJY2FzZSB0aGUgJU5MODAyMTFfQVRUUl9GUkFNRSBhdHRyaWJ1dGUgaXMgcmVwbGFjZWQgd2l0aCBhCisgKgklTkw4MDIxMV9BVFRSX1RJTUVEX09VVCBmbGFnIChhbmQgJU5MODAyMTFfQVRUUl9NQUMgdG8gaW5kaWNhdGUgd2hpY2gKKyAqCXBlbmRpbmcgYXV0aGVudGljYXRpb24gdGltZWQgb3V0KS4KKyAqIEBOTDgwMjExX0NNRF9BU1NPQ0lBVEU6IGFzc29jaWF0aW9uIHJlcXVlc3QgYW5kIG5vdGlmaWNhdGlvbjsgbGlrZQorICoJTkw4MDIxMV9DTURfQVVUSEVOVElDQVRFIGJ1dCBmb3IgQXNzb2NpYXRpb24gYW5kIFJlYXNzb2NpYXRpb24KKyAqCShzaW1pbGFyIHRvIE1MTUUtQVNTT0NJQVRFLnJlcXVlc3QsIE1MTUUtUkVBU1NPQ0lBVEUucmVxdWVzdCwKKyAqCU1MTUUtQVNTT0NJQVRFLmNvbmZpcm0gb3IgTUxNRS1SRUFTU09DSUFURS5jb25maXJtIHByaW1pdGl2ZXMpLgorICogQE5MODAyMTFfQ01EX0RFQVVUSEVOVElDQVRFOiBkZWF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgYW5kIG5vdGlmaWNhdGlvbjsgbGlrZQorICoJTkw4MDIxMV9DTURfQVVUSEVOVElDQVRFIGJ1dCBmb3IgRGVhdXRoZW50aWNhdGlvbiBmcmFtZXMgKHNpbWlsYXIgdG8KKyAqCU1MTUUtREVBVVRIRU5USUNBVElPTi5yZXF1ZXN0IGFuZCBNTE1FLURFQVVUSEVOVElDQVRFLmluZGljYXRpb24KKyAqCXByaW1pdGl2ZXMpLgorICogQE5MODAyMTFfQ01EX0RJU0FTU09DSUFURTogZGlzYXNzb2NpYXRpb24gcmVxdWVzdCBhbmQgbm90aWZpY2F0aW9uOyBsaWtlCisgKglOTDgwMjExX0NNRF9BVVRIRU5USUNBVEUgYnV0IGZvciBEaXNhc3NvY2lhdGlvbiBmcmFtZXMgKHNpbWlsYXIgdG8KKyAqCU1MTUUtRElTQVNTT0NJQVRFLnJlcXVlc3QgYW5kIE1MTUUtRElTQVNTT0NJQVRFLmluZGljYXRpb24gcHJpbWl0aXZlcykuCisgKgorICogQE5MODAyMTFfQ01EX01JQ0hBRUxfTUlDX0ZBSUxVUkU6IG5vdGlmaWNhdGlvbiBvZiBhIGxvY2FsbHkgZGV0ZWN0ZWQgTWljaGFlbAorICoJTUlDIChwYXJ0IG9mIFRLSVApIGZhaWx1cmU7IHNlbnQgb24gdGhlICJtbG1lIiBtdWx0aWNhc3QgZ3JvdXA7IHRoZQorICoJZXZlbnQgaW5jbHVkZXMgJU5MODAyMTFfQVRUUl9NQUMgdG8gZGVzY3JpYmUgdGhlIHNvdXJjZSBNQUMgYWRkcmVzcyBvZgorICoJdGhlIGZyYW1lIHdpdGggaW52YWxpZCBNSUMsICVOTDgwMjExX0FUVFJfS0VZX1RZUEUgdG8gc2hvdyB0aGUga2V5CisgKgl0eXBlLCAlTkw4MDIxMV9BVFRSX0tFWV9JRFggdG8gaW5kaWNhdGUgdGhlIGtleSBpZGVudGlmaWVyLCBhbmQKKyAqCSVOTDgwMjExX0FUVFJfS0VZX1NFUSB0byBpbmRpY2F0ZSB0aGUgVFNDIHZhbHVlIG9mIHRoZSBmcmFtZTsgdGhpcworICoJZXZlbnQgbWF0Y2hlcyB3aXRoIE1MTUUtTUlDSEFFTE1JQ0ZBSUxVUkUuaW5kaWNhdGlvbigpIHByaW1pdGl2ZQorICoKKyAqIEBOTDgwMjExX0NNRF9KT0lOX0lCU1M6IEpvaW4gYSBuZXcgSUJTUyAtLSBnaXZlbiBhdCBsZWFzdCBhbiBTU0lEIGFuZCBhCisgKglGUkVRIGF0dHJpYnV0ZSAoZm9yIHRoZSBpbml0aWFsIGZyZXF1ZW5jeSBpZiBubyBwZWVyIGNhbiBiZSBmb3VuZCkKKyAqCWFuZCBvcHRpb25hbGx5IGEgTUFDIChhcyBCU1NJRCkgYW5kIEZSRVFfRklYRUQgYXR0cmlidXRlIGlmIHRob3NlCisgKglzaG91bGQgYmUgZml4ZWQgcmF0aGVyIHRoYW4gYXV0b21hdGljYWxseSBkZXRlcm1pbmVkLiBDYW4gb25seSBiZQorICoJZXhlY3V0ZWQgb24gYSBuZXR3b3JrIGludGVyZmFjZSB0aGF0IGlzIFVQLCBhbmQgZml4ZWQgQlNTSUQvRlJFUQorICoJbWF5IGJlIHJlamVjdGVkLiBBbm90aGVyIG9wdGlvbmFsIHBhcmFtZXRlciBpcyB0aGUgYmVhY29uIGludGVydmFsLAorICoJZ2l2ZW4gaW4gdGhlICVOTDgwMjExX0FUVFJfQkVBQ09OX0lOVEVSVkFMIGF0dHJpYnV0ZSwgd2hpY2ggaWYgbm90CisgKglnaXZlbiBkZWZhdWx0cyB0byAxMDAgVFUgKDEwMi40bXMpLgorICogQE5MODAyMTFfQ01EX0xFQVZFX0lCU1M6IExlYXZlIHRoZSBJQlNTIC0tIG5vIHNwZWNpYWwgYXJndW1lbnRzLCB0aGUgSUJTUyBpcworICoJZGV0ZXJtaW5lZCBieSB0aGUgbmV0d29yayBpbnRlcmZhY2UuCisgKgorICogQE5MODAyMTFfQ01EX1RFU1RNT0RFOiB0ZXN0bW9kZSBjb21tYW5kLCB0YWtlcyBhIHdpcGh5IChvciBpZmluZGV4KSBhdHRyaWJ1dGUKKyAqCXRvIGlkZW50aWZ5IHRoZSBkZXZpY2UsIGFuZCB0aGUgVEVTVERBVEEgYmxvYiBhdHRyaWJ1dGUgdG8gcGFzcyB0aHJvdWdoCisgKgl0byB0aGUgZHJpdmVyLgorICoKKyAqIEBOTDgwMjExX0NNRF9DT05ORUNUOiBjb25uZWN0aW9uIHJlcXVlc3QgYW5kIG5vdGlmaWNhdGlvbjsgdGhpcyBjb21tYW5kCisgKglyZXF1ZXN0cyB0byBjb25uZWN0IHRvIGEgc3BlY2lmaWVkIG5ldHdvcmsgYnV0IHdpdGhvdXQgc2VwYXJhdGluZworICoJYXV0aCBhbmQgYXNzb2Mgc3RlcHMuIEZvciB0aGlzLCB5b3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBTU0lEIGluIGEKKyAqCSVOTDgwMjExX0FUVFJfU1NJRCBhdHRyaWJ1dGUsIGFuZCBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBhc3NvY2lhdGlvbgorICoJSUVzIGluICVOTDgwMjExX0FUVFJfSUUsICVOTDgwMjExX0FUVFJfQVVUSF9UWVBFLCAlTkw4MDIxMV9BVFRSX01BQywKKyAqCSVOTDgwMjExX0FUVFJfV0lQSFlfRlJFUSwgJU5MODAyMTFfQVRUUl9DT05UUk9MX1BPUlQsCisgKgklTkw4MDIxMV9BVFRSX0NPTlRST0xfUE9SVF9FVEhFUlRZUEUgYW5kCisgKgklTkw4MDIxMV9BVFRSX0NPTlRST0xfUE9SVF9OT19FTkNSWVBULgorICoJSXQgaXMgYWxzbyBzZW50IGFzIGFuIGV2ZW50LCB3aXRoIHRoZSBCU1NJRCBhbmQgcmVzcG9uc2UgSUVzIHdoZW4gdGhlCisgKgljb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIG9yIGZhaWxlZCB0byBiZSBlc3RhYmxpc2hlZC4gVGhpcyBjYW4gYmUKKyAqCWRldGVybWluZWQgYnkgdGhlIFNUQVRVU19DT0RFIGF0dHJpYnV0ZS4KKyAqIEBOTDgwMjExX0NNRF9ST0FNOiByZXF1ZXN0IHRoYXQgdGhlIGNhcmQgcm9hbSAoY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZCksCisgKglzZW50IGFzIGFuIGV2ZW50IHdoZW4gdGhlIGNhcmQvZHJpdmVyIHJvYW1lZCBieSBpdHNlbGYuCisgKiBATkw4MDIxMV9DTURfRElTQ09OTkVDVDogZHJvcCBhIGdpdmVuIGNvbm5lY3Rpb247IGFsc28gdXNlZCB0byBub3RpZnkKKyAqCXVzZXJzcGFjZSB0aGF0IGEgY29ubmVjdGlvbiB3YXMgZHJvcHBlZCBieSB0aGUgQVAgb3IgZHVlIHRvIG90aGVyCisgKglyZWFzb25zLCBmb3IgdGhpcyB0aGUgJU5MODAyMTFfQVRUUl9ESVNDT05ORUNURURfQllfQVAgYW5kCisgKgklTkw4MDIxMV9BVFRSX1JFQVNPTl9DT0RFIGF0dHJpYnV0ZXMgYXJlIHVzZWQuCisgKgorICogQE5MODAyMTFfQ01EX1NFVF9XSVBIWV9ORVROUzogU2V0IGEgd2lwaHkncyBuZXRucy4gTm90ZSB0aGF0IGFsbCBkZXZpY2VzCisgKglhc3NvY2lhdGVkIHdpdGggdGhpcyB3aXBoeSBtdXN0IGJlIGRvd24gYW5kIHdpbGwgZm9sbG93LgorICoKKyAqIEBOTDgwMjExX0NNRF9SRU1BSU5fT05fQ0hBTk5FTDogUmVxdWVzdCB0byByZW1haW4gYXdha2Ugb24gdGhlIHNwZWNpZmllZAorICoJY2hhbm5lbCBmb3IgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZS4gVGhpcyBjYW4gYmUgdXNlZCB0byBkbworICoJb2ZmLWNoYW5uZWwgb3BlcmF0aW9ucyBsaWtlIHRyYW5zbWl0IGEgUHVibGljIEFjdGlvbiBmcmFtZSBhbmQgd2FpdCBmb3IKKyAqCWEgcmVzcG9uc2Ugd2hpbGUgYmVpbmcgYXNzb2NpYXRlZCB0byBhbiBBUCBvbiBhbm90aGVyIGNoYW5uZWwuCisgKgklTkw4MDIxMV9BVFRSX0lGSU5ERVggaXMgdXNlZCB0byBzcGVjaWZ5IHdoaWNoIGludGVyZmFjZSAoYW5kIHRodXMKKyAqCXJhZGlvKSBpcyB1c2VkLiAlTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZQorICoJZnJlcXVlbmN5IGZvciB0aGUgb3BlcmF0aW9uIGFuZCAlTkw4MDIxMV9BVFRSX1dJUEhZX0NIQU5ORUxfVFlQRSBtYXkgYmUKKyAqCW9wdGlvbmFsbHkgdXNlZCB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgY2hhbm5lbCBwYXJhbWV0ZXJzLgorICoJJU5MODAyMTFfQVRUUl9EVVJBVElPTiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcworICoJdG8gcmVtYWluIG9uIHRoZSBjaGFubmVsLiBUaGlzIGNvbW1hbmQgaXMgYWxzbyB1c2VkIGFzIGFuIGV2ZW50IHRvCisgKglub3RpZnkgd2hlbiB0aGUgcmVxdWVzdGVkIGR1cmF0aW9uIHN0YXJ0cyAoaXQgbWF5IHRha2UgYSB3aGlsZSBmb3IgdGhlCisgKglkcml2ZXIgdG8gc2NoZWR1bGUgdGhpcyB0aW1lIGR1ZSB0byBvdGhlciBjb25jdXJyZW50IG5lZWRzIGZvciB0aGUKKyAqCXJhZGlvKS4KKyAqCVdoZW4gY2FsbGVkLCB0aGlzIG9wZXJhdGlvbiByZXR1cm5zIGEgY29va2llICglTkw4MDIxMV9BVFRSX0NPT0tJRSkKKyAqCXRoYXQgd2lsbCBiZSBpbmNsdWRlZCB3aXRoIGFueSBldmVudHMgcGVydGFpbmluZyB0byB0aGlzIHJlcXVlc3Q7CisgKgl0aGUgY29va2llIGlzIGFsc28gdXNlZCB0byBjYW5jZWwgdGhlIHJlcXVlc3QuCisgKiBATkw4MDIxMV9DTURfQ0FOQ0VMX1JFTUFJTl9PTl9DSEFOTkVMOiBUaGlzIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gY2FuY2VsIGEKKyAqCXBlbmRpbmcgcmVtYWluLW9uLWNoYW5uZWwgZHVyYXRpb24gaWYgdGhlIGRlc2lyZWQgb3BlcmF0aW9uIGhhcyBiZWVuCisgKgljb21wbGV0ZWQgcHJpb3IgdG8gZXhwaXJhdGlvbiBvZiB0aGUgb3JpZ2luYWxseSByZXF1ZXN0ZWQgZHVyYXRpb24uCisgKgklTkw4MDIxMV9BVFRSX1dJUEhZIG9yICVOTDgwMjExX0FUVFJfSUZJTkRFWCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCisgKglyYWRpby4gVGhlICVOTDgwMjExX0FUVFJfQ09PS0lFIGF0dHJpYnV0ZSBtdXN0IGJlIGdpdmVuIGFzIHdlbGwgdG8KKyAqCXVuaXF1ZWx5IGlkZW50aWZ5IHRoZSByZXF1ZXN0LgorICoJVGhpcyBjb21tYW5kIGlzIGFsc28gdXNlZCBhcyBhbiBldmVudCB0byBub3RpZnkgd2hlbiBhIHJlcXVlc3RlZAorICoJcmVtYWluLW9uLWNoYW5uZWwgZHVyYXRpb24gaGFzIGV4cGlyZWQuCisgKgorICogQE5MODAyMTFfQ01EX1NFVF9UWF9CSVRSQVRFX01BU0s6IFNldCB0aGUgbWFzayBvZiByYXRlcyB0byBiZSB1c2VkIGluIFRYCisgKglyYXRlIHNlbGVjdGlvbi4gJU5MODAyMTFfQVRUUl9JRklOREVYIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgaW50ZXJmYWNlCisgKglhbmQgQE5MODAyMTFfQVRUUl9UWF9SQVRFUyB0aGUgc2V0IG9mIGFsbG93ZWQgcmF0ZXMuCisgKgorICogQE5MODAyMTFfQ01EX1JFR0lTVEVSX0ZSQU1FOiBSZWdpc3RlciBmb3IgcmVjZWl2aW5nIGNlcnRhaW4gbWdtdCBmcmFtZXMKKyAqCSh2aWEgQE5MODAyMTFfQ01EX0ZSQU1FKSBmb3IgcHJvY2Vzc2luZyBpbiB1c2Vyc3BhY2UuIFRoaXMgY29tbWFuZAorICoJcmVxdWlyZXMgYW4gaW50ZXJmYWNlIGluZGV4LCBhIGZyYW1lIHR5cGUgYXR0cmlidXRlIChvcHRpb25hbCBmb3IKKyAqCWJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcmVhc29ucywgaWYgbm90IGdpdmVuIGFzc3VtZXMgYWN0aW9uIGZyYW1lcykKKyAqCWFuZCBhIG1hdGNoIGF0dHJpYnV0ZSBjb250YWluaW5nIHRoZSBmaXJzdCBmZXcgYnl0ZXMgb2YgdGhlIGZyYW1lCisgKgl0aGF0IHNob3VsZCBtYXRjaCwgZS5nLiBhIHNpbmdsZSBieXRlIGZvciBvbmx5IGEgY2F0ZWdvcnkgbWF0Y2ggb3IKKyAqCWZvdXIgYnl0ZXMgZm9yIHZlbmRvciBmcmFtZXMgaW5jbHVkaW5nIHRoZSBPVUkuIFRoZSByZWdpc3RyYXRpb24KKyAqCWNhbm5vdCBiZSBkcm9wcGVkLCBidXQgaXMgcmVtb3ZlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIG5ldGxpbmsKKyAqCXNvY2tldCBpcyBjbG9zZWQuIE11bHRpcGxlIHJlZ2lzdHJhdGlvbnMgY2FuIGJlIG1hZGUuCisgKiBATkw4MDIxMV9DTURfUkVHSVNURVJfQUNUSU9OOiBBbGlhcyBmb3IgQE5MODAyMTFfQ01EX1JFR0lTVEVSX0ZSQU1FIGZvcgorICoJYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICogQE5MODAyMTFfQ01EX0ZSQU1FOiBNYW5hZ2VtZW50IGZyYW1lIFRYIHJlcXVlc3QgYW5kIFJYIG5vdGlmaWNhdGlvbi4gVGhpcworICoJY29tbWFuZCBpcyB1c2VkIGJvdGggYXMgYSByZXF1ZXN0IHRvIHRyYW5zbWl0IGEgbWFuYWdlbWVudCBmcmFtZSBhbmQKKyAqCWFzIGFuIGV2ZW50IGluZGljYXRpbmcgcmVjZXB0aW9uIG9mIGEgZnJhbWUgdGhhdCB3YXMgbm90IHByb2Nlc3NlZCBpbgorICoJa2VybmVsIGNvZGUsIGJ1dCBpcyBmb3IgdXMgKGkuZS4sIHdoaWNoIG1heSBuZWVkIHRvIGJlIHByb2Nlc3NlZCBpbiBhCisgKgl1c2VyIHNwYWNlIGFwcGxpY2F0aW9uKS4gJU5MODAyMTFfQVRUUl9GUkFNRSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCisgKglmcmFtZSBjb250ZW50cyAoaW5jbHVkaW5nIGhlYWRlcikuICVOTDgwMjExX0FUVFJfV0lQSFlfRlJFUSAoYW5kCisgKglvcHRpb25hbGx5ICVOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFKSBpcyB1c2VkIHRvIGluZGljYXRlIG9uCisgKgl3aGljaCBjaGFubmVsIHRoZSBmcmFtZSBpcyB0byBiZSB0cmFuc21pdHRlZCBvciB3YXMgcmVjZWl2ZWQuIElmIHRoaXMKKyAqCWNoYW5uZWwgaXMgbm90IHRoZSBjdXJyZW50IGNoYW5uZWwgKHJlbWFpbi1vbi1jaGFubmVsIG9yIHRoZQorICoJb3BlcmF0aW9uYWwgY2hhbm5lbCkgdGhlIGRldmljZSB3aWxsIHN3aXRjaCB0byB0aGUgZ2l2ZW4gY2hhbm5lbCBhbmQKKyAqCXRyYW5zbWl0IHRoZSBmcmFtZSwgb3B0aW9uYWxseSB3YWl0aW5nIGZvciBhIHJlc3BvbnNlIGZvciB0aGUgdGltZQorICoJc3BlY2lmaWVkIHVzaW5nICVOTDgwMjExX0FUVFJfRFVSQVRJT04uIFdoZW4gY2FsbGVkLCB0aGlzIG9wZXJhdGlvbgorICoJcmV0dXJucyBhIGNvb2tpZSAoJU5MODAyMTFfQVRUUl9DT09LSUUpIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCB3aXRoIHRoZQorICoJVFggc3RhdHVzIGV2ZW50IHBlcnRhaW5pbmcgdG8gdGhlIFRYIHJlcXVlc3QuCisgKgklTkw4MDIxMV9BVFRSX1RYX05PX0NDS19SQVRFIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8gc2VuZCB0aGUKKyAqCW1hbmFnZW1lbnQgZnJhbWVzIGF0IENDSyByYXRlIG9yIG5vdCBpbiAyR0h6IGJhbmQuCisgKiBATkw4MDIxMV9DTURfRlJBTUVfV0FJVF9DQU5DRUw6IFdoZW4gYW4gb2ZmLWNoYW5uZWwgVFggd2FzIHJlcXVlc3RlZCwgdGhpcworICoJY29tbWFuZCBtYXkgYmUgdXNlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNvb2tpZSB0byBjYW5jZWwgdGhlIHdhaXQKKyAqCXRpbWUgaWYgaXQgaXMga25vd24gdGhhdCBpdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LgorICogQE5MODAyMTFfQ01EX0FDVElPTjogQWxpYXMgZm9yIEBOTDgwMjExX0NNRF9GUkFNRSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyAqIEBOTDgwMjExX0NNRF9GUkFNRV9UWF9TVEFUVVM6IFJlcG9ydCBUWCBzdGF0dXMgb2YgYSBtYW5hZ2VtZW50IGZyYW1lCisgKgl0cmFuc21pdHRlZCB3aXRoICVOTDgwMjExX0NNRF9GUkFNRS4gJU5MODAyMTFfQVRUUl9DT09LSUUgaWRlbnRpZmllcworICoJdGhlIFRYIGNvbW1hbmQgYW5kICVOTDgwMjExX0FUVFJfRlJBTUUgaW5jbHVkZXMgdGhlIGNvbnRlbnRzIG9mIHRoZQorICoJZnJhbWUuICVOTDgwMjExX0FUVFJfQUNLIGZsYWcgaXMgaW5jbHVkZWQgaWYgdGhlIHJlY2lwaWVudCBhY2tub3dsZWRnZWQKKyAqCXRoZSBmcmFtZS4KKyAqIEBOTDgwMjExX0NNRF9BQ1RJT05fVFhfU1RBVFVTOiBBbGlhcyBmb3IgQE5MODAyMTFfQ01EX0ZSQU1FX1RYX1NUQVRVUyBmb3IKKyAqCWJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgKiBATkw4MDIxMV9DTURfU0VUX0NRTTogQ29ubmVjdGlvbiBxdWFsaXR5IG1vbml0b3IgY29uZmlndXJhdGlvbi4gVGhpcyBjb21tYW5kCisgKglpcyB1c2VkIHRvIGNvbmZpZ3VyZSBjb25uZWN0aW9uIHF1YWxpdHkgbW9uaXRvcmluZyBub3RpZmljYXRpb24gdHJpZ2dlcgorICoJbGV2ZWxzLgorICogQE5MODAyMTFfQ01EX05PVElGWV9DUU06IENvbm5lY3Rpb24gcXVhbGl0eSBtb25pdG9yIG5vdGlmaWNhdGlvbi4gVGhpcworICoJY29tbWFuZCBpcyB1c2VkIGFzIGFuIGV2ZW50IHRvIGluZGljYXRlIHRoZSB0aGF0IGEgdHJpZ2dlciBsZXZlbCB3YXMKKyAqCXJlYWNoZWQuCisgKiBATkw4MDIxMV9DTURfU0VUX0NIQU5ORUw6IFNldCB0aGUgY2hhbm5lbCAodXNpbmcgJU5MODAyMTFfQVRUUl9XSVBIWV9GUkVRCisgKglhbmQgJU5MODAyMTFfQVRUUl9XSVBIWV9DSEFOTkVMX1RZUEUpIHRoZSBnaXZlbiBpbnRlcmZhY2UgKGlkZW50aWZlZAorICoJYnkgJU5MODAyMTFfQVRUUl9JRklOREVYKSBzaGFsbCBvcGVyYXRlIG9uLgorICoJSW4gY2FzZSBtdWx0aXBsZSBjaGFubmVscyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UsIHRoZSBtZWNoYW5pc20KKyAqCXdpdGggd2hpY2ggaXQgc3dpdGNoZXMgY2hhbm5lbHMgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KKyAqCVdoZW4gYSBtb25pdG9yIGludGVyZmFjZSBpcyBnaXZlbiwgaXQgY2FuIG9ubHkgc3dpdGNoIGNoYW5uZWwgd2hpbGUKKyAqCW5vIG90aGVyIGludGVyZmFjZXMgYXJlIG9wZXJhdGluZyB0byBhdm9pZCBkaXN0dXJiaW5nIHRoZSBvcGVyYXRpb24KKyAqCW9mIGFueSBvdGhlciBpbnRlcmZhY2VzLCBhbmQgb3RoZXIgaW50ZXJmYWNlcyB3aWxsIGFnYWluIHRha2UKKyAqCXByZWNlZGVuY2Ugd2hlbiB0aGV5IGFyZSB1c2VkLgorICoKKyAqIEBOTDgwMjExX0NNRF9TRVRfV0RTX1BFRVI6IFNldCB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIHBlZXIgb24gYSBXRFMgaW50ZXJmYWNlLgorICoKKyAqIEBOTDgwMjExX0NNRF9KT0lOX01FU0g6IEpvaW4gYSBtZXNoLiBUaGUgbWVzaCBJRCBtdXN0IGJlIGdpdmVuLCBhbmQgaW5pdGlhbAorICoJbWVzaCBjb25maWcgcGFyYW1ldGVycyBtYXkgYmUgZ2l2ZW4uCisgKiBATkw4MDIxMV9DTURfTEVBVkVfTUVTSDogTGVhdmUgdGhlIG1lc2ggbmV0d29yayAtLSBubyBzcGVjaWFsIGFyZ3VtZW50cywgdGhlCisgKgluZXR3b3JrIGlzIGRldGVybWluZWQgYnkgdGhlIG5ldHdvcmsgaW50ZXJmYWNlLgorICoKKyAqIEBOTDgwMjExX0NNRF9VTlBST1RfREVBVVRIRU5USUNBVEU6IFVucHJvdGVjdGVkIGRlYXV0aGVudGljYXRpb24gZnJhbWUKKyAqCW5vdGlmaWNhdGlvbi4gVGhpcyBldmVudCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgYW4gdW5wcm90ZWN0ZWQKKyAqCWRlYXV0aGVudGljYXRpb24gZnJhbWUgd2FzIGRyb3BwZWQgd2hlbiBNRlAgaXMgaW4gdXNlLgorICogQE5MODAyMTFfQ01EX1VOUFJPVF9ESVNBU1NPQ0lBVEU6IFVucHJvdGVjdGVkIGRpc2Fzc29jaWF0aW9uIGZyYW1lCisgKglub3RpZmljYXRpb24uIFRoaXMgZXZlbnQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGFuIHVucHJvdGVjdGVkCisgKglkaXNhc3NvY2lhdGlvbiBmcmFtZSB3YXMgZHJvcHBlZCB3aGVuIE1GUCBpcyBpbiB1c2UuCisgKgorICogQE5MODAyMTFfQ01EX05FV19QRUVSX0NBTkRJREFURTogTm90aWZpY2F0aW9uIG9uIHRoZSByZWNlcHRpb24gb2YgYQorICogICAgICBiZWFjb24gb3IgcHJvYmUgcmVzcG9uc2UgZnJvbSBhIGNvbXBhdGlibGUgbWVzaCBwZWVyLiAgVGhpcyBpcyBvbmx5CisgKiAgICAgIHNlbnQgd2hpbGUgbm8gc3RhdGlvbiBpbmZvcm1hdGlvbiAoc3RhX2luZm8pIGV4aXN0cyBmb3IgdGhlIG5ldyBwZWVyCisgKiAgICAgIGNhbmRpZGF0ZSBhbmQgd2hlbiBATkw4MDIxMV9NRVNIX1NFVFVQX1VTRVJTUEFDRV9BVVRIIGlzIHNldC4gIE9uCisgKiAgICAgIHJlY2VwdGlvbiBvZiB0aGlzIG5vdGlmaWNhdGlvbiwgdXNlcnNwYWNlIG1heSBkZWNpZGUgdG8gY3JlYXRlIGEgbmV3CisgKiAgICAgIHN0YXRpb24gKEBOTDgwMjExX0NNRF9ORVdfU1RBVElPTikuICBUbyBzdG9wIHRoaXMgbm90aWZpY2F0aW9uIGZyb20KKyAqICAgICAgcmVvY2N1cnJpbmcsIHRoZSB1c2Vyc3BhY2UgYXV0aGVudGljYXRpb24gZGFlbW9uIG1heSB3YW50IHRvIGNyZWF0ZSB0aGUKKyAqICAgICAgbmV3IHN0YXRpb24gd2l0aCB0aGUgQVVUSEVOVElDQVRFRCBmbGFnIHVuc2V0IGFuZCBtYXliZSBjaGFuZ2UgaXQgbGF0ZXIKKyAqICAgICAgZGVwZW5kaW5nIG9uIHRoZSBhdXRoZW50aWNhdGlvbiByZXN1bHQuCisgKgorICogQE5MODAyMTFfQ01EX0dFVF9XT1dMQU46IGdldCBXYWtlLW9uLVdpcmVsZXNzLUxBTiAoV29XTEFOKSBzZXR0aW5ncy4KKyAqIEBOTDgwMjExX0NNRF9TRVRfV09XTEFOOiBzZXQgV2FrZS1vbi1XaXJlbGVzcy1MQU4gKFdvV0xBTikgc2V0dGluZ3MuCisgKglTaW5jZSB3aXJlbGVzcyBpcyBtb3JlIGNvbXBsZXggdGhhbiB3aXJlZCBldGhlcm5ldCwgaXQgc3VwcG9ydHMKKyAqCXZhcmlvdXMgdHJpZ2dlcnMuIFRoZXNlIHRyaWdnZXJzIGNhbiBiZSBjb25maWd1cmVkIHRocm91Z2ggdGhpcworICoJY29tbWFuZCB3aXRoIHRoZSAlTkw4MDIxMV9BVFRSX1dPV0xBTl9UUklHR0VSUyBhdHRyaWJ1dGUuIEZvcgorICoJbW9yZSBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uLCBzZWUKKyAqCWh0dHA6Ly93aXJlbGVzcy5rZXJuZWwub3JnL2VuL3VzZXJzL0RvY3VtZW50YXRpb24vV29XTEFOLgorICoKKyAqIEBOTDgwMjExX0NNRF9TRVRfUkVLRVlfT0ZGTE9BRDogVGhpcyBjb21tYW5kIGlzIHVzZWQgZ2l2ZSB0aGUgZHJpdmVyCisgKgl0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciBzdXBwb3J0aW5nIEdUSyByZWtleSBvZmZsb2FkLiBUaGlzCisgKglmZWF0dXJlIGlzIHR5cGljYWxseSB1c2VkIGR1cmluZyBXb1dMQU4uIFRoZSBjb25maWd1cmF0aW9uIGRhdGEKKyAqCWlzIGNvbnRhaW5lZCBpbiAlTkw4MDIxMV9BVFRSX1JFS0VZX0RBVEEgKHdoaWNoIGlzIG5lc3RlZCBhbmQKKyAqCWNvbnRhaW5zIHRoZSBkYXRhIGluIHN1Yi1hdHRyaWJ1dGVzKS4gQWZ0ZXIgcmVrZXlpbmcgaGFwcGVuZWQsCisgKgl0aGlzIGNvbW1hbmQgbWF5IGFsc28gYmUgc2VudCBieSB0aGUgZHJpdmVyIGFzIGFuIE1MTUUgZXZlbnQgdG8KKyAqCWluZm9ybSB1c2Vyc3BhY2Ugb2YgdGhlIG5ldyByZXBsYXkgY291bnRlci4KKyAqCisgKiBATkw4MDIxMV9DTURfUE1LU0FfQ0FORElEQVRFOiBUaGlzIGlzIHVzZWQgYXMgYW4gZXZlbnQgdG8gaW5mb3JtIHVzZXJzcGFjZQorICoJb2YgUE1LU0EgY2FjaGluZyBkYW5kaWRhdGVzLgorICoKKyAqIEBOTDgwMjExX0NNRF9URExTX09QRVI6IFBlcmZvcm0gYSBoaWdoLWxldmVsIFRETFMgY29tbWFuZCAoZS5nLiBsaW5rIHNldHVwKS4KKyAqIEBOTDgwMjExX0NNRF9URExTX01HTVQ6IFNlbmQgYSBURExTIG1hbmFnZW1lbnQgZnJhbWUuCisgKgorICogQE5MODAyMTFfQ01EX01BWDogaGlnaGVzdCB1c2VkIGNvbW1hbmQgbnVtYmVyCisgKiBAX19OTDgwMjExX0NNRF9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqLworZW51bSBubDgwMjExX2NvbW1hbmRzIHsKKy8qIGRvbid0IGNoYW5nZSB0aGUgb3JkZXIgb3IgYWRkIGFueXRoaW5nIGJldHdlZW4sIHRoaXMgaXMgQUJJISAqLworCU5MODAyMTFfQ01EX1VOU1BFQywKKworCU5MODAyMTFfQ01EX0dFVF9XSVBIWSwJCS8qIGNhbiBkdW1wICovCisJTkw4MDIxMV9DTURfU0VUX1dJUEhZLAorCU5MODAyMTFfQ01EX05FV19XSVBIWSwKKwlOTDgwMjExX0NNRF9ERUxfV0lQSFksCisKKwlOTDgwMjExX0NNRF9HRVRfSU5URVJGQUNFLAkvKiBjYW4gZHVtcCAqLworCU5MODAyMTFfQ01EX1NFVF9JTlRFUkZBQ0UsCisJTkw4MDIxMV9DTURfTkVXX0lOVEVSRkFDRSwKKwlOTDgwMjExX0NNRF9ERUxfSU5URVJGQUNFLAorCisJTkw4MDIxMV9DTURfR0VUX0tFWSwKKwlOTDgwMjExX0NNRF9TRVRfS0VZLAorCU5MODAyMTFfQ01EX05FV19LRVksCisJTkw4MDIxMV9DTURfREVMX0tFWSwKKworCU5MODAyMTFfQ01EX0dFVF9CRUFDT04sCisJTkw4MDIxMV9DTURfU0VUX0JFQUNPTiwKKwlOTDgwMjExX0NNRF9ORVdfQkVBQ09OLAorCU5MODAyMTFfQ01EX0RFTF9CRUFDT04sCisKKwlOTDgwMjExX0NNRF9HRVRfU1RBVElPTiwKKwlOTDgwMjExX0NNRF9TRVRfU1RBVElPTiwKKwlOTDgwMjExX0NNRF9ORVdfU1RBVElPTiwKKwlOTDgwMjExX0NNRF9ERUxfU1RBVElPTiwKKworCU5MODAyMTFfQ01EX0dFVF9NUEFUSCwKKwlOTDgwMjExX0NNRF9TRVRfTVBBVEgsCisJTkw4MDIxMV9DTURfTkVXX01QQVRILAorCU5MODAyMTFfQ01EX0RFTF9NUEFUSCwKKworCU5MODAyMTFfQ01EX1NFVF9CU1MsCisKKwlOTDgwMjExX0NNRF9TRVRfUkVHLAorCU5MODAyMTFfQ01EX1JFUV9TRVRfUkVHLAorCisJTkw4MDIxMV9DTURfR0VUX01FU0hfQ09ORklHLAorCU5MODAyMTFfQ01EX1NFVF9NRVNIX0NPTkZJRywKKworCU5MODAyMTFfQ01EX1NFVF9NR01UX0VYVFJBX0lFIC8qIHJlc2VydmVkOyBub3QgdXNlZCAqLywKKworCU5MODAyMTFfQ01EX0dFVF9SRUcsCisKKwlOTDgwMjExX0NNRF9HRVRfU0NBTiwKKwlOTDgwMjExX0NNRF9UUklHR0VSX1NDQU4sCisJTkw4MDIxMV9DTURfTkVXX1NDQU5fUkVTVUxUUywKKwlOTDgwMjExX0NNRF9TQ0FOX0FCT1JURUQsCisKKwlOTDgwMjExX0NNRF9SRUdfQ0hBTkdFLAorCisJTkw4MDIxMV9DTURfQVVUSEVOVElDQVRFLAorCU5MODAyMTFfQ01EX0FTU09DSUFURSwKKwlOTDgwMjExX0NNRF9ERUFVVEhFTlRJQ0FURSwKKwlOTDgwMjExX0NNRF9ESVNBU1NPQ0lBVEUsCisKKwlOTDgwMjExX0NNRF9NSUNIQUVMX01JQ19GQUlMVVJFLAorCisJTkw4MDIxMV9DTURfUkVHX0JFQUNPTl9ISU5ULAorCisJTkw4MDIxMV9DTURfSk9JTl9JQlNTLAorCU5MODAyMTFfQ01EX0xFQVZFX0lCU1MsCisKKwlOTDgwMjExX0NNRF9URVNUTU9ERSwKKworCU5MODAyMTFfQ01EX0NPTk5FQ1QsCisJTkw4MDIxMV9DTURfUk9BTSwKKwlOTDgwMjExX0NNRF9ESVNDT05ORUNULAorCisJTkw4MDIxMV9DTURfU0VUX1dJUEhZX05FVE5TLAorCisJTkw4MDIxMV9DTURfR0VUX1NVUlZFWSwKKwlOTDgwMjExX0NNRF9ORVdfU1VSVkVZX1JFU1VMVFMsCisKKwlOTDgwMjExX0NNRF9TRVRfUE1LU0EsCisJTkw4MDIxMV9DTURfREVMX1BNS1NBLAorCU5MODAyMTFfQ01EX0ZMVVNIX1BNS1NBLAorCisJTkw4MDIxMV9DTURfUkVNQUlOX09OX0NIQU5ORUwsCisJTkw4MDIxMV9DTURfQ0FOQ0VMX1JFTUFJTl9PTl9DSEFOTkVMLAorCisJTkw4MDIxMV9DTURfU0VUX1RYX0JJVFJBVEVfTUFTSywKKworCU5MODAyMTFfQ01EX1JFR0lTVEVSX0ZSQU1FLAorCU5MODAyMTFfQ01EX1JFR0lTVEVSX0FDVElPTiA9IE5MODAyMTFfQ01EX1JFR0lTVEVSX0ZSQU1FLAorCU5MODAyMTFfQ01EX0ZSQU1FLAorCU5MODAyMTFfQ01EX0FDVElPTiA9IE5MODAyMTFfQ01EX0ZSQU1FLAorCU5MODAyMTFfQ01EX0ZSQU1FX1RYX1NUQVRVUywKKwlOTDgwMjExX0NNRF9BQ1RJT05fVFhfU1RBVFVTID0gTkw4MDIxMV9DTURfRlJBTUVfVFhfU1RBVFVTLAorCisJTkw4MDIxMV9DTURfU0VUX1BPV0VSX1NBVkUsCisJTkw4MDIxMV9DTURfR0VUX1BPV0VSX1NBVkUsCisKKwlOTDgwMjExX0NNRF9TRVRfQ1FNLAorCU5MODAyMTFfQ01EX05PVElGWV9DUU0sCisKKwlOTDgwMjExX0NNRF9TRVRfQ0hBTk5FTCwKKwlOTDgwMjExX0NNRF9TRVRfV0RTX1BFRVIsCisKKwlOTDgwMjExX0NNRF9GUkFNRV9XQUlUX0NBTkNFTCwKKworCU5MODAyMTFfQ01EX0pPSU5fTUVTSCwKKwlOTDgwMjExX0NNRF9MRUFWRV9NRVNILAorCisJTkw4MDIxMV9DTURfVU5QUk9UX0RFQVVUSEVOVElDQVRFLAorCU5MODAyMTFfQ01EX1VOUFJPVF9ESVNBU1NPQ0lBVEUsCisKKwlOTDgwMjExX0NNRF9ORVdfUEVFUl9DQU5ESURBVEUsCisKKwlOTDgwMjExX0NNRF9HRVRfV09XTEFOLAorCU5MODAyMTFfQ01EX1NFVF9XT1dMQU4sCisKKwlOTDgwMjExX0NNRF9TVEFSVF9TQ0hFRF9TQ0FOLAorCU5MODAyMTFfQ01EX1NUT1BfU0NIRURfU0NBTiwKKwlOTDgwMjExX0NNRF9TQ0hFRF9TQ0FOX1JFU1VMVFMsCisJTkw4MDIxMV9DTURfU0NIRURfU0NBTl9TVE9QUEVELAorCisJTkw4MDIxMV9DTURfU0VUX1JFS0VZX09GRkxPQUQsCisKKwlOTDgwMjExX0NNRF9QTUtTQV9DQU5ESURBVEUsCisKKwlOTDgwMjExX0NNRF9URExTX09QRVIsCisJTkw4MDIxMV9DTURfVERMU19NR01ULAorCisJLyogYWRkIG5ldyBjb21tYW5kcyBhYm92ZSBoZXJlICovCisKKwkvKiB1c2VkIHRvIGRlZmluZSBOTDgwMjExX0NNRF9NQVggYmVsb3cgKi8KKwlfX05MODAyMTFfQ01EX0FGVEVSX0xBU1QsCisJTkw4MDIxMV9DTURfTUFYID0gX19OTDgwMjExX0NNRF9BRlRFUl9MQVNUIC0gMQorfTsKKworLyoKKyAqIEFsbG93IHVzZXIgc3BhY2UgcHJvZ3JhbXMgdG8gdXNlICNpZmRlZiBvbiBuZXcgY29tbWFuZHMgYnkgZGVmaW5pbmcgdGhlbQorICogaGVyZQorICovCisjZGVmaW5lIE5MODAyMTFfQ01EX1NFVF9CU1MgTkw4MDIxMV9DTURfU0VUX0JTUworI2RlZmluZSBOTDgwMjExX0NNRF9TRVRfTUdNVF9FWFRSQV9JRSBOTDgwMjExX0NNRF9TRVRfTUdNVF9FWFRSQV9JRQorI2RlZmluZSBOTDgwMjExX0NNRF9SRUdfQ0hBTkdFIE5MODAyMTFfQ01EX1JFR19DSEFOR0UKKyNkZWZpbmUgTkw4MDIxMV9DTURfQVVUSEVOVElDQVRFIE5MODAyMTFfQ01EX0FVVEhFTlRJQ0FURQorI2RlZmluZSBOTDgwMjExX0NNRF9BU1NPQ0lBVEUgTkw4MDIxMV9DTURfQVNTT0NJQVRFCisjZGVmaW5lIE5MODAyMTFfQ01EX0RFQVVUSEVOVElDQVRFIE5MODAyMTFfQ01EX0RFQVVUSEVOVElDQVRFCisjZGVmaW5lIE5MODAyMTFfQ01EX0RJU0FTU09DSUFURSBOTDgwMjExX0NNRF9ESVNBU1NPQ0lBVEUKKyNkZWZpbmUgTkw4MDIxMV9DTURfUkVHX0JFQUNPTl9ISU5UIE5MODAyMTFfQ01EX1JFR19CRUFDT05fSElOVAorCisvKiBzb3VyY2UtbGV2ZWwgQVBJIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgTkw4MDIxMV9DTURfR0VUX01FU0hfUEFSQU1TIE5MODAyMTFfQ01EX0dFVF9NRVNIX0NPTkZJRworI2RlZmluZSBOTDgwMjExX0NNRF9TRVRfTUVTSF9QQVJBTVMgTkw4MDIxMV9DTURfU0VUX01FU0hfQ09ORklHCisjZGVmaW5lIE5MODAyMTFfTUVTSF9TRVRVUF9WRU5ET1JfUEFUSF9TRUxfSUUgTkw4MDIxMV9NRVNIX1NFVFVQX0lFCisKKy8qKgorICogZW51bSBubDgwMjExX2F0dHJzIC0gbmw4MDIxMSBuZXRsaW5rIGF0dHJpYnV0ZXMKKyAqCisgKiBATkw4MDIxMV9BVFRSX1VOU1BFQzogdW5zcGVjaWZpZWQgYXR0cmlidXRlIHRvIGNhdGNoIGVycm9ycworICoKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFk6IGluZGV4IG9mIHdpcGh5IHRvIG9wZXJhdGUgb24sIGNmLgorICoJL3N5cy9jbGFzcy9pZWVlODAyMTEvPHBoeW5hbWU+L2luZGV4CisgKiBATkw4MDIxMV9BVFRSX1dJUEhZX05BTUU6IHdpcGh5IG5hbWUgKHVzZWQgZm9yIHJlbmFtaW5nKQorICogQE5MODAyMTFfQVRUUl9XSVBIWV9UWFFfUEFSQU1TOiBhIG5lc3RlZCBhcnJheSBvZiBUWCBxdWV1ZSBwYXJhbWV0ZXJzCisgKiBATkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVE6IGZyZXF1ZW5jeSBvZiB0aGUgc2VsZWN0ZWQgY2hhbm5lbCBpbiBNSHoKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFOiBpbmNsdWRlZCB3aXRoIE5MODAyMTFfQVRUUl9XSVBIWV9GUkVRCisgKglpZiBIVDIwIG9yIEhUNDAgYXJlIGFsbG93ZWQgKGkuZS4sIDgwMi4xMW4gZGlzYWJsZWQgaWYgbm90IGluY2x1ZGVkKToKKyAqCU5MODAyMTFfQ0hBTl9OT19IVCA9IEhUIG5vdCBhbGxvd2VkIChpLmUuLCBzYW1lIGFzIG5vdCBpbmNsdWRpbmcKKyAqCQl0aGlzIGF0dHJpYnV0ZSkKKyAqCU5MODAyMTFfQ0hBTl9IVDIwID0gSFQyMCBvbmx5CisgKglOTDgwMjExX0NIQU5fSFQ0ME1JTlVTID0gc2Vjb25kYXJ5IGNoYW5uZWwgaXMgYmVsb3cgdGhlIHByaW1hcnkgY2hhbm5lbAorICoJTkw4MDIxMV9DSEFOX0hUNDBQTFVTID0gc2Vjb25kYXJ5IGNoYW5uZWwgaXMgYWJvdmUgdGhlIHByaW1hcnkgY2hhbm5lbAorICogQE5MODAyMTFfQVRUUl9XSVBIWV9SRVRSWV9TSE9SVDogVFggcmV0cnkgbGltaXQgZm9yIGZyYW1lcyB3aG9zZSBsZW5ndGggaXMKKyAqCWxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgUlRTIHRocmVzaG9sZDsgYWxsb3dlZCByYW5nZTogMS4uMjU1OworICoJZG90MTFTaG9ydFJldHJ5TGltaXQ7IHU4CisgKiBATkw4MDIxMV9BVFRSX1dJUEhZX1JFVFJZX0xPTkc6IFRYIHJldHJ5IGxpbWl0IGZvciBmcmFtZXMgd2hvc2UgbGVuZ3RoIGlzCisgKglncmVhdGVyIHRoYW4gdGhlIFJUUyB0aHJlc2hvbGQ7IGFsbG93ZWQgcmFuZ2U6IDEuLjI1NTsKKyAqCWRvdDExU2hvcnRMb25nTGltaXQ7IHU4CisgKiBATkw4MDIxMV9BVFRSX1dJUEhZX0ZSQUdfVEhSRVNIT0xEOiBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCwgaS5lLiwgbWF4aW11bQorICoJbGVuZ3RoIGluIG9jdGV0cyBmb3IgZnJhbWVzOyBhbGxvd2VkIHJhbmdlOiAyNTYuLjgwMDAsIGRpc2FibGUKKyAqCWZyYWdtZW50YXRpb24gd2l0aCAodTMyKS0xOyBkb3QxMUZyYWdtZW50YXRpb25UaHJlc2hvbGQ7IHUzMgorICogQE5MODAyMTFfQVRUUl9XSVBIWV9SVFNfVEhSRVNIT0xEOiBSVFMgdGhyZXNob2xkIChUWCBmcmFtZXMgd2l0aCBsZW5ndGgKKyAqCWxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIHRoaXMgdXNlIFJUUy9DVFMgaGFuZHNoYWtlKTsgYWxsb3dlZCByYW5nZToKKyAqCTAuLjY1NTM2LCBkaXNhYmxlIHdpdGggKHUzMiktMTsgZG90MTFSVFNUaHJlc2hvbGQ7IHUzMgorICogQE5MODAyMTFfQVRUUl9XSVBIWV9DT1ZFUkFHRV9DTEFTUzogQ292ZXJhZ2UgQ2xhc3MgYXMgZGVmaW5lZCBieSBJRUVFIDgwMi4xMQorICoJc2VjdGlvbiA3LjMuMi45OyBkb3QxMUNvdmVyYWdlQ2xhc3M7IHU4CisgKgorICogQE5MODAyMTFfQVRUUl9JRklOREVYOiBuZXR3b3JrIGludGVyZmFjZSBpbmRleCBvZiB0aGUgZGV2aWNlIHRvIG9wZXJhdGUgb24KKyAqIEBOTDgwMjExX0FUVFJfSUZOQU1FOiBuZXR3b3JrIGludGVyZmFjZSBuYW1lCisgKiBATkw4MDIxMV9BVFRSX0lGVFlQRTogdHlwZSBvZiB2aXJ0dWFsIGludGVyZmFjZSwgc2VlICZlbnVtIG5sODAyMTFfaWZ0eXBlCisgKgorICogQE5MODAyMTFfQVRUUl9NQUM6IE1BQyBhZGRyZXNzICh2YXJpb3VzIHVzZXMpCisgKgorICogQE5MODAyMTFfQVRUUl9LRVlfREFUQTogKHRlbXBvcmFsKSBrZXkgZGF0YTsgZm9yIFRLSVAgdGhpcyBjb25zaXN0cyBvZgorICoJMTYgYnl0ZXMgZW5jcnlwdGlvbiBrZXkgZm9sbG93ZWQgYnkgOCBieXRlcyBlYWNoIGZvciBUWCBhbmQgUlggTUlDCisgKglrZXlzCisgKiBATkw4MDIxMV9BVFRSX0tFWV9JRFg6IGtleSBJRCAodTgsIDAtMykKKyAqIEBOTDgwMjExX0FUVFJfS0VZX0NJUEhFUjoga2V5IGNpcGhlciBzdWl0ZSAodTMyLCBhcyBkZWZpbmVkIGJ5IElFRUUgODAyLjExCisgKglzZWN0aW9uIDcuMy4yLjI1LjEsIGUuZy4gMHgwMDBGQUMwNCkKKyAqIEBOTDgwMjExX0FUVFJfS0VZX1NFUTogdHJhbnNtaXQga2V5IHNlcXVlbmNlIG51bWJlciAoSVYvUE4pIGZvciBUS0lQIGFuZAorICoJQ0NNUCBrZXlzLCBlYWNoIHNpeCBieXRlcyBpbiBsaXR0bGUgZW5kaWFuCisgKgorICogQE5MODAyMTFfQVRUUl9CRUFDT05fSU5URVJWQUw6IGJlYWNvbiBpbnRlcnZhbCBpbiBUVQorICogQE5MODAyMTFfQVRUUl9EVElNX1BFUklPRDogRFRJTSBwZXJpb2QgZm9yIGJlYWNvbmluZworICogQE5MODAyMTFfQVRUUl9CRUFDT05fSEVBRDogcG9ydGlvbiBvZiB0aGUgYmVhY29uIGJlZm9yZSB0aGUgVElNIElFCisgKiBATkw4MDIxMV9BVFRSX0JFQUNPTl9UQUlMOiBwb3J0aW9uIG9mIHRoZSBiZWFjb24gYWZ0ZXIgdGhlIFRJTSBJRQorICoKKyAqIEBOTDgwMjExX0FUVFJfU1RBX0FJRDogQXNzb2NpYXRpb24gSUQgZm9yIHRoZSBzdGF0aW9uICh1MTYpCisgKiBATkw4MDIxMV9BVFRSX1NUQV9GTEFHUzogZmxhZ3MsIG5lc3RlZCBlbGVtZW50IHdpdGggTkxBX0ZMQUcgYXR0cmlidXRlcyBvZgorICoJJmVudW0gbmw4MDIxMV9zdGFfZmxhZ3MgKGRlcHJlY2F0ZWQsIHVzZSAlTkw4MDIxMV9BVFRSX1NUQV9GTEFHUzIpCisgKiBATkw4MDIxMV9BVFRSX1NUQV9MSVNURU5fSU5URVJWQUw6IGxpc3RlbiBpbnRlcnZhbCBhcyBkZWZpbmVkIGJ5CisgKglJRUVFIDgwMi4xMSA3LjMuMS42ICh1MTYpLgorICogQE5MODAyMTFfQVRUUl9TVEFfU1VQUE9SVEVEX1JBVEVTOiBzdXBwb3J0ZWQgcmF0ZXMsIGFycmF5IG9mIHN1cHBvcnRlZAorICoJcmF0ZXMgYXMgZGVmaW5lZCBieSBJRUVFIDgwMi4xMSA3LjMuMi4yIGJ1dCB3aXRob3V0IHRoZSBsZW5ndGgKKyAqCXJlc3RyaWN0aW9uIChhdCBtb3N0ICVOTDgwMjExX01BWF9TVVBQX1JBVEVTKS4KKyAqIEBOTDgwMjExX0FUVFJfU1RBX1ZMQU46IGludGVyZmFjZSBpbmRleCBvZiBWTEFOIGludGVyZmFjZSB0byBtb3ZlIHN0YXRpb24KKyAqCXRvLCBvciB0aGUgQVAgaW50ZXJmYWNlIHRoZSBzdGF0aW9uIHdhcyBvcmlnaW5hbGx5IGFkZGVkIHRvIHRvLgorICogQE5MODAyMTFfQVRUUl9TVEFfSU5GTzogaW5mb3JtYXRpb24gYWJvdXQgYSBzdGF0aW9uLCBwYXJ0IG9mIHN0YXRpb24gaW5mbworICoJZ2l2ZW4gZm9yICVOTDgwMjExX0NNRF9HRVRfU1RBVElPTiwgbmVzdGVkIGF0dHJpYnV0ZSBjb250YWluaW5nCisgKglpbmZvIGFzIHBvc3NpYmxlLCBzZWUgJmVudW0gbmw4MDIxMV9zdGFfaW5mby4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1dJUEhZX0JBTkRTOiBJbmZvcm1hdGlvbiBhYm91dCBhbiBvcGVyYXRpbmcgYmFuZHMsCisgKgljb25zaXN0aW5nIG9mIGEgbmVzdGVkIGFycmF5LgorICoKKyAqIEBOTDgwMjExX0FUVFJfTUVTSF9JRDogbWVzaCBpZCAoMS0zMiBieXRlcykuCisgKiBATkw4MDIxMV9BVFRSX1NUQV9QTElOS19BQ1RJT046IGFjdGlvbiB0byBwZXJmb3JtIG9uIHRoZSBtZXNoIHBlZXIgbGluay4KKyAqIEBOTDgwMjExX0FUVFJfTVBBVEhfTkVYVF9IT1A6IE1BQyBhZGRyZXNzIG9mIHRoZSBuZXh0IGhvcCBmb3IgYSBtZXNoIHBhdGguCisgKiBATkw4MDIxMV9BVFRSX01QQVRIX0lORk86IGluZm9ybWF0aW9uIGFib3V0IGEgbWVzaF9wYXRoLCBwYXJ0IG9mIG1lc2ggcGF0aAorICogCWluZm8gZ2l2ZW4gZm9yICVOTDgwMjExX0NNRF9HRVRfTVBBVEgsIG5lc3RlZCBhdHRyaWJ1dGUgZGVzY3JpYmVkIGF0CisgKgkmZW51bSBubDgwMjExX21wYXRoX2luZm8uCisgKgorICogQE5MODAyMTFfQVRUUl9NTlRSX0ZMQUdTOiBmbGFncywgbmVzdGVkIGVsZW1lbnQgd2l0aCBOTEFfRkxBRyBhdHRyaWJ1dGVzIG9mCisgKiAgICAgICZlbnVtIG5sODAyMTFfbW50cl9mbGFncy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1JFR19BTFBIQTI6IGFuIElTTy0zMTY2LWFscGhhMiBjb3VudHJ5IGNvZGUgZm9yIHdoaWNoIHRoZQorICogCWN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4gc2hvdWxkIGJlIHNldCB0byBvciBpcyBhbHJlYWR5IHNldCB0by4KKyAqIAlGb3IgZXhhbXBsZSwgJ0NSJywgZm9yIENvc3RhIFJpY2EuIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgYnkgdGhlIGtlcm5lbAorICogCXRvIHF1ZXJ5IHRoZSBDUkRBIHRvIHJldHJpZXZlIG9uZSByZWd1bGF0b3J5IGRvbWFpbi4gVGhpcyBhdHRyaWJ1dGUgY2FuCisgKiAJYWxzbyBiZSB1c2VkIGJ5IHVzZXJzcGFjZSB0byBxdWVyeSB0aGUga2VybmVsIGZvciB0aGUgY3VycmVudGx5IHNldAorICogCXJlZ3VsYXRvcnkgZG9tYWluLiBXZSBjaG9zZSBhbiBhbHBoYTIgYXMgdGhhdCBpcyBhbHNvIHVzZWQgYnkgdGhlCisgKiAJSUVFRS04MDIuMTFkIGNvdW50cnkgaW5mb3JtYXRpb24gZWxlbWVudCB0byBpZGVudGlmeSBhIGNvdW50cnkuCisgKiAJVXNlcnMgY2FuIGFsc28gc2ltcGx5IGFzayB0aGUgd2lyZWxlc3MgY29yZSB0byBzZXQgcmVndWxhdG9yeSBkb21haW4KKyAqIAl0byBhIHNwZWNpZmljIGFscGhhMi4KKyAqIEBOTDgwMjExX0FUVFJfUkVHX1JVTEVTOiBhIG5lc3RlZCBhcnJheSBvZiByZWd1bGF0b3J5IGRvbWFpbiByZWd1bGF0b3J5CisgKglydWxlcy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0JTU19DVFNfUFJPVDogd2hldGhlciBDVFMgcHJvdGVjdGlvbiBpcyBlbmFibGVkICh1OCwgMCBvciAxKQorICogQE5MODAyMTFfQVRUUl9CU1NfU0hPUlRfUFJFQU1CTEU6IHdoZXRoZXIgc2hvcnQgcHJlYW1ibGUgaXMgZW5hYmxlZAorICoJKHU4LCAwIG9yIDEpCisgKiBATkw4MDIxMV9BVFRSX0JTU19TSE9SVF9TTE9UX1RJTUU6IHdoZXRoZXIgc2hvcnQgc2xvdCB0aW1lIGVuYWJsZWQKKyAqCSh1OCwgMCBvciAxKQorICogQE5MODAyMTFfQVRUUl9CU1NfQkFTSUNfUkFURVM6IGJhc2ljIHJhdGVzLCBhcnJheSBvZiBiYXNpYworICoJcmF0ZXMgaW4gZm9ybWF0IGRlZmluZWQgYnkgSUVFRSA4MDIuMTEgNy4zLjIuMiBidXQgd2l0aG91dCB0aGUgbGVuZ3RoCisgKglyZXN0cmljdGlvbiAoYXQgbW9zdCAlTkw4MDIxMV9NQVhfU1VQUF9SQVRFUykuCisgKgorICogQE5MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZOiBIVCBDYXBhYmlsaXR5IGluZm9ybWF0aW9uIGVsZW1lbnQgKGZyb20KKyAqCWFzc29jaWF0aW9uIHJlcXVlc3Qgd2hlbiB1c2VkIHdpdGggTkw4MDIxMV9DTURfTkVXX1NUQVRJT04pCisgKgorICogQE5MODAyMTFfQVRUUl9TVVBQT1JURURfSUZUWVBFUzogbmVzdGVkIGF0dHJpYnV0ZSBjb250YWluaW5nIGFsbAorICoJc3VwcG9ydGVkIGludGVyZmFjZSB0eXBlcywgZWFjaCBhIGZsYWcgYXR0cmlidXRlIHdpdGggdGhlIG51bWJlcgorICoJb2YgdGhlIGludGVyZmFjZSBtb2RlLgorICoKKyAqIEBOTDgwMjExX0FUVFJfTUdNVF9TVUJUWVBFOiBNYW5hZ2VtZW50IGZyYW1lIHN1YnR5cGUgZm9yCisgKgklTkw4MDIxMV9DTURfU0VUX01HTVRfRVhUUkFfSUUuCisgKgorICogQE5MODAyMTFfQVRUUl9JRTogSW5mb3JtYXRpb24gZWxlbWVudChzKSBkYXRhICh1c2VkLCBlLmcuLCB3aXRoCisgKgklTkw4MDIxMV9DTURfU0VUX01HTVRfRVhUUkFfSUUpLgorICoKKyAqIEBOTDgwMjExX0FUVFJfTUFYX05VTV9TQ0FOX1NTSURTOiBudW1iZXIgb2YgU1NJRHMgeW91IGNhbiBzY2FuIHdpdGgKKyAqCWEgc2luZ2xlIHNjYW4gcmVxdWVzdCwgYSB3aXBoeSBhdHRyaWJ1dGUuCisgKiBATkw4MDIxMV9BVFRSX01BWF9OVU1fU0NIRURfU0NBTl9TU0lEUzogbnVtYmVyIG9mIFNTSURzIHlvdSBjYW4KKyAqCXNjYW4gd2l0aCBhIHNpbmdsZSBzY2hlZHVsZWQgc2NhbiByZXF1ZXN0LCBhIHdpcGh5IGF0dHJpYnV0ZS4KKyAqIEBOTDgwMjExX0FUVFJfTUFYX1NDQU5fSUVfTEVOOiBtYXhpbXVtIGxlbmd0aCBvZiBpbmZvcm1hdGlvbiBlbGVtZW50cworICoJdGhhdCBjYW4gYmUgYWRkZWQgdG8gYSBzY2FuIHJlcXVlc3QKKyAqIEBOTDgwMjExX0FUVFJfTUFYX1NDSEVEX1NDQU5fSUVfTEVOOiBtYXhpbXVtIGxlbmd0aCBvZiBpbmZvcm1hdGlvbgorICoJZWxlbWVudHMgdGhhdCBjYW4gYmUgYWRkZWQgdG8gYSBzY2hlZHVsZWQgc2NhbiByZXF1ZXN0CisgKiBATkw4MDIxMV9BVFRSX01BWF9NQVRDSF9TRVRTOiBtYXhpbXVtIG51bWJlciBvZiBzZXRzIHRoYXQgY2FuIGJlCisgKgl1c2VkIHdpdGggQE5MODAyMTFfQVRUUl9TQ0hFRF9TQ0FOX01BVENILCBhIHdpcGh5IGF0dHJpYnV0ZS4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1NDQU5fRlJFUVVFTkNJRVM6IG5lc3RlZCBhdHRyaWJ1dGUgd2l0aCBmcmVxdWVuY2llcyAoaW4gTUh6KQorICogQE5MODAyMTFfQVRUUl9TQ0FOX1NTSURTOiBuZXN0ZWQgYXR0cmlidXRlIHdpdGggU1NJRHMsIGxlYXZlIG91dCBmb3IgcGFzc2l2ZQorICoJc2Nhbm5pbmcgYW5kIGluY2x1ZGUgYSB6ZXJvLWxlbmd0aCBTU0lEICh3aWxkY2FyZCkgZm9yIHdpbGRjYXJkIHNjYW4KKyAqIEBOTDgwMjExX0FUVFJfQlNTOiBzY2FuIHJlc3VsdCBCU1MKKyAqCisgKiBATkw4MDIxMV9BVFRSX1JFR19JTklUSUFUT1I6IGluZGljYXRlcyB3aG8gcmVxdWVzdGVkIHRoZSByZWd1bGF0b3J5IGRvbWFpbgorICogCWN1cnJlbnRseSBpbiBlZmZlY3QuIFRoaXMgY291bGQgYmUgYW55IG9mIHRoZSAlTkw4MDIxMV9SRUdET01fU0VUX0JZXyoKKyAqIEBOTDgwMjExX0FUVFJfUkVHX1RZUEU6IGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgcmVndWxhdG9yeSBkb21haW4gY3VycmVudGx5CisgKiAJc2V0LiBUaGlzIGNhbiBiZSBvbmUgb2YgdGhlIG5sODAyMTFfcmVnX3R5cGUgKCVOTDgwMjExX1JFR0RPTV9UWVBFXyopCisgKgorICogQE5MODAyMTFfQVRUUl9TVVBQT1JURURfQ09NTUFORFM6IHdpcGh5IGF0dHJpYnV0ZSB0aGF0IHNwZWNpZmllcworICoJYW4gYXJyYXkgb2YgY29tbWFuZCBudW1iZXJzIChpLmUuIGEgbWFwcGluZyBpbmRleCB0byBjb21tYW5kIG51bWJlcikKKyAqCXRoYXQgdGhlIGRyaXZlciBmb3IgdGhlIGdpdmVuIHdpcGh5IHN1cHBvcnRzLgorICoKKyAqIEBOTDgwMjExX0FUVFJfRlJBTUU6IGZyYW1lIGRhdGEgKGJpbmFyeSBhdHRyaWJ1dGUpLCBpbmNsdWRpbmcgZnJhbWUgaGVhZGVyCisgKglhbmQgYm9keSwgYnV0IG5vdCBGQ1M7IHVzZWQsIGUuZy4sIHdpdGggTkw4MDIxMV9DTURfQVVUSEVOVElDQVRFIGFuZAorICoJTkw4MDIxMV9DTURfQVNTT0NJQVRFIGV2ZW50cworICogQE5MODAyMTFfQVRUUl9TU0lEOiBTU0lEIChiaW5hcnkgYXR0cmlidXRlLCAwLi4zMiBvY3RldHMpCisgKiBATkw4MDIxMV9BVFRSX0FVVEhfVFlQRTogQXV0aGVudGljYXRpb25UeXBlLCBzZWUgJmVudW0gbmw4MDIxMV9hdXRoX3R5cGUsCisgKglyZXByZXNlbnRlZCBhcyBhIHUzMgorICogQE5MODAyMTFfQVRUUl9SRUFTT05fQ09ERTogUmVhc29uQ29kZSBmb3IgJU5MODAyMTFfQ01EX0RFQVVUSEVOVElDQVRFIGFuZAorICoJJU5MODAyMTFfQ01EX0RJU0FTU09DSUFURSwgdTE2CisgKgorICogQE5MODAyMTFfQVRUUl9LRVlfVFlQRTogS2V5IFR5cGUsIHNlZSAmZW51bSBubDgwMjExX2tleV90eXBlLCByZXByZXNlbnRlZCBhcworICoJYSB1MzIKKyAqCisgKiBATkw4MDIxMV9BVFRSX0ZSRVFfQkVGT1JFOiBBIGNoYW5uZWwgd2hpY2ggaGFzIHN1ZmZlcmVkIGEgcmVndWxhdG9yeSBjaGFuZ2UKKyAqIAlkdWUgdG8gY29uc2lkZXJhdGlvbnMgZnJvbSBhIGJlYWNvbiBoaW50LiBUaGlzIGF0dHJpYnV0ZSByZWZsZWN0cworICogCXRoZSBzdGF0ZSBvZiB0aGUgY2hhbm5lbCBfYmVmb3JlXyB0aGUgYmVhY29uIGhpbnQgcHJvY2Vzc2luZy4gVGhpcworICogCWF0dHJpYnV0ZXMgY29uc2lzdHMgb2YgYSBuZXN0ZWQgYXR0cmlidXRlIGNvbnRhaW5pbmcKKyAqIAlOTDgwMjExX0ZSRVFVRU5DWV9BVFRSXyoKKyAqIEBOTDgwMjExX0FUVFJfRlJFUV9BRlRFUjogQSBjaGFubmVsIHdoaWNoIGhhcyBzdWZmZXJlZCBhIHJlZ3VsYXRvcnkgY2hhbmdlCisgKiAJZHVlIHRvIGNvbnNpZGVyYXRpb25zIGZyb20gYSBiZWFjb24gaGludC4gVGhpcyBhdHRyaWJ1dGUgcmVmbGVjdHMKKyAqIAl0aGUgc3RhdGUgb2YgdGhlIGNoYW5uZWwgX2FmdGVyXyB0aGUgYmVhY29uIGhpbnQgcHJvY2Vzc2luZy4gVGhpcworICogCWF0dHJpYnV0ZXMgY29uc2lzdHMgb2YgYSBuZXN0ZWQgYXR0cmlidXRlIGNvbnRhaW5pbmcKKyAqIAlOTDgwMjExX0ZSRVFVRU5DWV9BVFRSXyoKKyAqCisgKiBATkw4MDIxMV9BVFRSX0NJUEhFUl9TVUlURVM6IGEgc2V0IG9mIHUzMiB2YWx1ZXMgaW5kaWNhdGluZyB0aGUgc3VwcG9ydGVkCisgKgljaXBoZXIgc3VpdGVzCisgKgorICogQE5MODAyMTFfQVRUUl9GUkVRX0ZJWEVEOiBhIGZsYWcgaW5kaWNhdGluZyB0aGUgSUJTUyBzaG91bGQgbm90IHRyeSB0byBsb29rCisgKglmb3Igb3RoZXIgbmV0d29ya3Mgb24gZGlmZmVyZW50IGNoYW5uZWxzCisgKgorICogQE5MODAyMTFfQVRUUl9USU1FRF9PVVQ6IGEgZmxhZyBpbmRpY2F0aW5nIHRoYW4gYW4gb3BlcmF0aW9uIHRpbWVkIG91dDsgdGhpcworICoJaXMgdXNlZCwgZS5nLiwgd2l0aCAlTkw4MDIxMV9DTURfQVVUSEVOVElDQVRFIGV2ZW50CisgKgorICogQE5MODAyMTFfQVRUUl9VU0VfTUZQOiBXaGV0aGVyIG1hbmFnZW1lbnQgZnJhbWUgcHJvdGVjdGlvbiAoSUVFRSA4MDIuMTF3KSBpcworICoJdXNlZCBmb3IgdGhlIGFzc29jaWF0aW9uICgmZW51bSBubDgwMjExX21mcCwgcmVwcmVzZW50ZWQgYXMgYSB1MzIpOworICoJdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQKKyAqCXdpdGggJU5MODAyMTFfQ01EX0FTU09DSUFURSByZXF1ZXN0CisgKgorICogQE5MODAyMTFfQVRUUl9TVEFfRkxBR1MyOiBBdHRyaWJ1dGUgY29udGFpbmluZyBhCisgKgkmc3RydWN0IG5sODAyMTFfc3RhX2ZsYWdfdXBkYXRlLgorICoKKyAqIEBOTDgwMjExX0FUVFJfQ09OVFJPTF9QT1JUOiBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHVzZXIgc3BhY2UgY29udHJvbHMKKyAqCUlFRUUgODAyLjFYIHBvcnQsIGkuZS4sIHNldHMvY2xlYXJzICVOTDgwMjExX1NUQV9GTEFHX0FVVEhPUklaRUQsIGluCisgKglzdGF0aW9uIG1vZGUuIElmIHRoZSBmbGFnIGlzIGluY2x1ZGVkIGluICVOTDgwMjExX0NNRF9BU1NPQ0lBVEUKKyAqCXJlcXVlc3QsIHRoZSBkcml2ZXIgd2lsbCBhc3N1bWUgdGhhdCB0aGUgcG9ydCBpcyB1bmF1dGhvcml6ZWQgdW50aWwKKyAqCWF1dGhvcml6ZWQgYnkgdXNlciBzcGFjZS4gT3RoZXJ3aXNlLCBwb3J0IGlzIG1hcmtlZCBhdXRob3JpemVkIGJ5CisgKglkZWZhdWx0IGluIHN0YXRpb24gbW9kZS4KKyAqIEBOTDgwMjExX0FUVFJfQ09OVFJPTF9QT1JUX0VUSEVSVFlQRTogQSAxNi1iaXQgdmFsdWUgaW5kaWNhdGluZyB0aGUKKyAqCWV0aGVydHlwZSB0aGF0IHdpbGwgYmUgdXNlZCBmb3Iga2V5IG5lZ290aWF0aW9uLiBJdCBjYW4gYmUKKyAqCXNwZWNpZmllZCB3aXRoIHRoZSBhc3NvY2lhdGUgYW5kIGNvbm5lY3QgY29tbWFuZHMuIElmIGl0IGlzIG5vdAorICoJc3BlY2lmaWVkLCB0aGUgdmFsdWUgZGVmYXVsdHMgdG8gMHg4ODhFIChQQUUsIDgwMi4xWCkuIFRoaXMKKyAqCWF0dHJpYnV0ZSBpcyBhbHNvIHVzZWQgYXMgYSBmbGFnIGluIHRoZSB3aXBoeSBpbmZvcm1hdGlvbiB0bworICoJaW5kaWNhdGUgdGhhdCBwcm90b2NvbHMgb3RoZXIgdGhhbiBQQUUgYXJlIHN1cHBvcnRlZC4KKyAqIEBOTDgwMjExX0FUVFJfQ09OVFJPTF9QT1JUX05PX0VOQ1JZUFQ6IFdoZW4gaW5jbHVkZWQgYWxvbmcgd2l0aAorICoJJU5MODAyMTFfQVRUUl9DT05UUk9MX1BPUlRfRVRIRVJUWVBFLCBpbmRpY2F0ZXMgdGhhdCB0aGUgY3VzdG9tCisgKglldGhlcnR5cGUgZnJhbWVzIHVzZWQgZm9yIGtleSBuZWdvdGlhdGlvbiBtdXN0IG5vdCBiZSBlbmNyeXB0ZWQuCisgKgorICogQE5MODAyMTFfQVRUUl9URVNUREFUQTogVGVzdG1vZGUgZGF0YSBibG9iLCBwYXNzZWQgdGhyb3VnaCB0byB0aGUgZHJpdmVyLgorICoJV2UgcmVjb21tZW5kIHVzaW5nIG5lc3RlZCwgZHJpdmVyLXNwZWNpZmljIGF0dHJpYnV0ZXMgd2l0aGluIHRoaXMuCisgKgorICogQE5MODAyMTFfQVRUUl9ESVNDT05ORUNURURfQllfQVA6IEEgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIERJU0NPTk5FQ1QKKyAqCWV2ZW50IHdhcyBkdWUgdG8gdGhlIEFQIGRpc2Nvbm5lY3RpbmcgdGhlIHN0YXRpb24sIGFuZCBub3QgZHVlIHRvCisgKglhIGxvY2FsIGRpc2Nvbm5lY3QgcmVxdWVzdC4KKyAqIEBOTDgwMjExX0FUVFJfU1RBVFVTX0NPREU6IFN0YXR1c0NvZGUgZm9yIHRoZSAlTkw4MDIxMV9DTURfQ09OTkVDVAorICoJZXZlbnQgKHUxNikKKyAqIEBOTDgwMjExX0FUVFJfUFJJVkFDWTogRmxhZyBhdHRyaWJ1dGUsIHVzZWQgd2l0aCBjb25uZWN0KCksIGluZGljYXRpbmcKKyAqCXRoYXQgcHJvdGVjdGVkIEFQcyBzaG91bGQgYmUgdXNlZC4gVGhpcyBpcyBhbHNvIHVzZWQgd2l0aCBORVdfQkVBQ09OIHRvCisgKglpbmRpY2F0ZSB0aGF0IHRoZSBCU1MgaXMgdG8gdXNlIHByb3RlY3Rpb24uCisgKgorICogQE5MODAyMTFfQVRUUl9DSVBIRVJTX1BBSVJXSVNFOiBVc2VkIHdpdGggQ09OTkVDVCwgQVNTT0NJQVRFLCBhbmQgTkVXX0JFQUNPTgorICoJdG8gaW5kaWNhdGUgd2hpY2ggdW5pY2FzdCBrZXkgY2lwaGVycyB3aWxsIGJlIHVzZWQgd2l0aCB0aGUgY29ubmVjdGlvbgorICoJKGFuIGFycmF5IG9mIHUzMikuCisgKiBATkw4MDIxMV9BVFRSX0NJUEhFUl9HUk9VUDogVXNlZCB3aXRoIENPTk5FQ1QsIEFTU09DSUFURSwgYW5kIE5FV19CRUFDT04gdG8KKyAqCWluZGljYXRlIHdoaWNoIGdyb3VwIGtleSBjaXBoZXIgd2lsbCBiZSB1c2VkIHdpdGggdGhlIGNvbm5lY3Rpb24gKGEKKyAqCXUzMikuCisgKiBATkw4MDIxMV9BVFRSX1dQQV9WRVJTSU9OUzogVXNlZCB3aXRoIENPTk5FQ1QsIEFTU09DSUFURSwgYW5kIE5FV19CRUFDT04gdG8KKyAqCWluZGljYXRlIHdoaWNoIFdQQSB2ZXJzaW9uKHMpIHRoZSBBUCB3ZSB3YW50IHRvIGFzc29jaWF0ZSB3aXRoIGlzIHVzaW5nCisgKgkoYSB1MzIgd2l0aCBmbGFncyBmcm9tICZlbnVtIG5sODAyMTFfd3BhX3ZlcnNpb25zKS4KKyAqIEBOTDgwMjExX0FUVFJfQUtNX1NVSVRFUzogVXNlZCB3aXRoIENPTk5FQ1QsIEFTU09DSUFURSwgYW5kIE5FV19CRUFDT04gdG8KKyAqCWluZGljYXRlIHdoaWNoIGtleSBtYW5hZ2VtZW50IGFsZ29yaXRobShzKSB0byB1c2UgKGFuIGFycmF5IG9mIHUzMikuCisgKgorICogQE5MODAyMTFfQVRUUl9SRVFfSUU6IChSZSlhc3NvY2lhdGlvbiByZXF1ZXN0IGluZm9ybWF0aW9uIGVsZW1lbnRzIGFzCisgKglzZW50IG91dCBieSB0aGUgY2FyZCwgZm9yIFJPQU0gYW5kIHN1Y2Nlc3NmdWwgQ09OTkVDVCBldmVudHMuCisgKiBATkw4MDIxMV9BVFRSX1JFU1BfSUU6IChSZSlhc3NvY2lhdGlvbiByZXNwb25zZSBpbmZvcm1hdGlvbiBlbGVtZW50cyBhcworICoJc2VudCBieSBwZWVyLCBmb3IgUk9BTSBhbmQgc3VjY2Vzc2Z1bCBDT05ORUNUIGV2ZW50cy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1BSRVZfQlNTSUQ6IHByZXZpb3VzIEJTU0lELCB0byBiZSB1c2VkIGJ5IGluIEFTU09DSUFURQorICoJY29tbWFuZHMgdG8gc3BlY2lmeSB1c2luZyBhIHJlYXNzb2NpYXRlIGZyYW1lCisgKgorICogQE5MODAyMTFfQVRUUl9LRVk6IGtleSBpbmZvcm1hdGlvbiBpbiBhIG5lc3RlZCBhdHRyaWJ1dGUgd2l0aAorICoJJU5MODAyMTFfS0VZXyogc3ViLWF0dHJpYnV0ZXMKKyAqIEBOTDgwMjExX0FUVFJfS0VZUzogYXJyYXkgb2Yga2V5cyBmb3Igc3RhdGljIFdFUCBrZXlzIGZvciBjb25uZWN0KCkKKyAqCWFuZCBqb2luX2lic3MoKSwga2V5IGluZm9ybWF0aW9uIGlzIGluIGEgbmVzdGVkIGF0dHJpYnV0ZSBlYWNoCisgKgl3aXRoICVOTDgwMjExX0tFWV8qIHN1Yi1hdHRyaWJ1dGVzCisgKgorICogQE5MODAyMTFfQVRUUl9QSUQ6IFByb2Nlc3MgSUQgb2YgYSBuZXR3b3JrIG5hbWVzcGFjZS4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0dFTkVSQVRJT046IFVzZWQgdG8gaW5kaWNhdGUgY29uc2lzdGVudCBzbmFwc2hvdHMgZm9yCisgKglkdW1wcy4gVGhpcyBudW1iZXIgaW5jcmVhc2VzIHdoZW5ldmVyIHRoZSBvYmplY3QgbGlzdCBiZWluZworICoJZHVtcGVkIGNoYW5nZXMsIGFuZCBhcyBzdWNoIHVzZXJzcGFjZSBjYW4gdmVyaWZ5IHRoYXQgaXQgaGFzCisgKglvYnRhaW5lZCBhIGNvbXBsZXRlIGFuZCBjb25zaXN0ZW50IHNuYXBzaG90IGJ5IHZlcmlmeWluZyB0aGF0CisgKglhbGwgZHVtcCBtZXNzYWdlcyBjb250YWluIHRoZSBzYW1lIGdlbmVyYXRpb24gbnVtYmVyLiBJZiBpdAorICoJY2hhbmdlZCB0aGVuIHRoZSBsaXN0IGNoYW5nZWQgYW5kIHRoZSBkdW1wIHNob3VsZCBiZSByZXBlYXRlZAorICoJY29tcGxldGVseSBmcm9tIHNjcmF0Y2guCisgKgorICogQE5MODAyMTFfQVRUUl80QUREUjogVXNlIDQtYWRkcmVzcyBmcmFtZXMgb24gYSB2aXJ0dWFsIGludGVyZmFjZQorICoKKyAqIEBOTDgwMjExX0FUVFJfU1VSVkVZX0lORk86IHN1cnZleSBpbmZvcm1hdGlvbiBhYm91dCBhIGNoYW5uZWwsIHBhcnQgb2YKKyAqICAgICAgdGhlIHN1cnZleSByZXNwb25zZSBmb3IgJU5MODAyMTFfQ01EX0dFVF9TVVJWRVksIG5lc3RlZCBhdHRyaWJ1dGUKKyAqICAgICAgY29udGFpbmluZyBpbmZvIGFzIHBvc3NpYmxlLCBzZWUgJmVudW0gc3VydmV5X2luZm8uCisgKgorICogQE5MODAyMTFfQVRUUl9QTUtJRDogUE1LIG1hdGVyaWFsIGZvciBQTUtTQSBjYWNoaW5nLgorICogQE5MODAyMTFfQVRUUl9NQVhfTlVNX1BNS0lEUzogbWF4aW11bSBudW1iZXIgb2YgUE1LSURzIGEgZmlybXdhcmUgY2FuCisgKgljYWNoZSwgYSB3aXBoeSBhdHRyaWJ1dGUuCisgKgorICogQE5MODAyMTFfQVRUUl9EVVJBVElPTjogRHVyYXRpb24gb2YgYW4gb3BlcmF0aW9uIGluIG1pbGxpc2Vjb25kcywgdTMyLgorICogQE5MODAyMTFfQVRUUl9NQVhfUkVNQUlOX09OX0NIQU5ORUxfRFVSQVRJT046IERldmljZSBhdHRyaWJ1dGUgdGhhdAorICoJc3BlY2lmaWVzIHRoZSBtYXhpbXVtIGR1cmF0aW9uIHRoYXQgY2FuIGJlIHJlcXVlc3RlZCB3aXRoIHRoZQorICoJcmVtYWluLW9uLWNoYW5uZWwgb3BlcmF0aW9uLCBpbiBtaWxsaXNlY29uZHMsIHUzMi4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0NPT0tJRTogR2VuZXJpYyA2NC1iaXQgY29va2llIHRvIGlkZW50aWZ5IG9iamVjdHMuCisgKgorICogQE5MODAyMTFfQVRUUl9UWF9SQVRFUzogTmVzdGVkIHNldCBvZiBhdHRyaWJ1dGVzCisgKgkoZW51bSBubDgwMjExX3R4X3JhdGVfYXR0cmlidXRlcykgZGVzY3JpYmluZyBUWCByYXRlcyBwZXIgYmFuZC4gVGhlCisgKgllbnVtIG5sODAyMTFfYmFuZCB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBpbmRleCAobmxhX3R5cGUoKSBvZiB0aGUgbmVzdGVkCisgKglkYXRhLiBJZiBhIGJhbmQgaXMgbm90IGluY2x1ZGVkLCBpdCB3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gYWxsb3cgYWxsCisgKglyYXRlcyBiYXNlZCBvbiBuZWdvdGlhdGVkIHN1cHBvcnRlZCByYXRlcyBpbmZvcm1hdGlvbi4gVGhpcyBhdHRyaWJ1dGUKKyAqCWlzIHVzZWQgd2l0aCAlTkw4MDIxMV9DTURfU0VUX1RYX0JJVFJBVEVfTUFTSy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0ZSQU1FX01BVENIOiBBIGJpbmFyeSBhdHRyaWJ1dGUgd2hpY2ggdHlwaWNhbGx5IG11c3QgY29udGFpbgorICoJYXQgbGVhc3Qgb25lIGJ5dGUsIGN1cnJlbnRseSB1c2VkIHdpdGggQE5MODAyMTFfQ01EX1JFR0lTVEVSX0ZSQU1FLgorICogQE5MODAyMTFfQVRUUl9GUkFNRV9UWVBFOiBBIHUxNiBpbmRpY2F0aW5nIHRoZSBmcmFtZSB0eXBlL3N1YnR5cGUgZm9yIHRoZQorICoJQE5MODAyMTFfQ01EX1JFR0lTVEVSX0ZSQU1FIGNvbW1hbmQuCisgKiBATkw4MDIxMV9BVFRSX1RYX0ZSQU1FX1RZUEVTOiB3aXBoeSBjYXBhYmlsaXR5IGF0dHJpYnV0ZSwgd2hpY2ggaXMgYQorICoJbmVzdGVkIGF0dHJpYnV0ZSBvZiAlTkw4MDIxMV9BVFRSX0ZSQU1FX1RZUEUgYXR0cmlidXRlcywgY29udGFpbmluZworICoJaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggZnJhbWUgdHlwZXMgY2FuIGJlIHRyYW5zbWl0dGVkIHdpdGgKKyAqCSVOTDgwMjExX0NNRF9GUkFNRS4KKyAqIEBOTDgwMjExX0FUVFJfUlhfRlJBTUVfVFlQRVM6IHdpcGh5IGNhcGFiaWxpdHkgYXR0cmlidXRlLCB3aGljaCBpcyBhCisgKgluZXN0ZWQgYXR0cmlidXRlIG9mICVOTDgwMjExX0FUVFJfRlJBTUVfVFlQRSBhdHRyaWJ1dGVzLCBjb250YWluaW5nCisgKglpbmZvcm1hdGlvbiBhYm91dCB3aGljaCBmcmFtZSB0eXBlcyBjYW4gYmUgcmVnaXN0ZXJlZCBmb3IgUlguCisgKgorICogQE5MODAyMTFfQVRUUl9BQ0s6IEZsYWcgYXR0cmlidXRlIGluZGljYXRpbmcgdGhhdCB0aGUgZnJhbWUgd2FzCisgKglhY2tub3dsZWRnZWQgYnkgdGhlIHJlY2lwaWVudC4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0NRTTogY29ubmVjdGlvbiBxdWFsaXR5IG1vbml0b3IgY29uZmlndXJhdGlvbiBpbiBhCisgKgluZXN0ZWQgYXR0cmlidXRlIHdpdGggJU5MODAyMTFfQVRUUl9DUU1fKiBzdWItYXR0cmlidXRlcy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0xPQ0FMX1NUQVRFX0NIQU5HRTogRmxhZyBhdHRyaWJ1dGUgdG8gaW5kaWNhdGUgdGhhdCBhIGNvbW1hbmQKKyAqCWlzIHJlcXVlc3RpbmcgYSBsb2NhbCBhdXRoZW50aWNhdGlvbi9hc3NvY2lhdGlvbiBzdGF0ZSBjaGFuZ2Ugd2l0aG91dAorICoJaW52b2tpbmcgYWN0dWFsIG1hbmFnZW1lbnQgZnJhbWUgZXhjaGFuZ2UuIFRoaXMgY2FuIGJlIHVzZWQgd2l0aAorICoJTkw4MDIxMV9DTURfQVVUSEVOVElDQVRFLCBOTDgwMjExX0NNRF9ERUFVVEhFTlRJQ0FURSwKKyAqCU5MODAyMTFfQ01EX0RJU0FTU09DSUFURS4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0FQX0lTT0xBVEU6IChBUCBtb2RlKSBEbyBub3QgZm9yd2FyZCB0cmFmZmljIGJldHdlZW4gc3RhdGlvbnMKKyAqCWNvbm5lY3RlZCB0byB0aGlzIEJTUy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1dJUEhZX1RYX1BPV0VSX1NFVFRJTkc6IFRyYW5zbWl0IHBvd2VyIHNldHRpbmcgdHlwZS4gU2VlCisgKiAgICAgICZlbnVtIG5sODAyMTFfdHhfcG93ZXJfc2V0dGluZyBmb3IgcG9zc2libGUgdmFsdWVzLgorICogQE5MODAyMTFfQVRUUl9XSVBIWV9UWF9QT1dFUl9MRVZFTDogVHJhbnNtaXQgcG93ZXIgbGV2ZWwgaW4gc2lnbmVkIG1CbSB1bml0cy4KKyAqICAgICAgVGhpcyBpcyB1c2VkIGluIGFzc29jaWF0aW9uIHdpdGggQE5MODAyMTFfQVRUUl9XSVBIWV9UWF9QT1dFUl9TRVRUSU5HCisgKiAgICAgIGZvciBub24tYXV0b21hdGljIHNldHRpbmdzLgorICoKKyAqIEBOTDgwMjExX0FUVFJfU1VQUE9SVF9JQlNTX1JTTjogVGhlIGRldmljZSBzdXBwb3J0cyBJQlNTIFJTTiwgd2hpY2ggbW9zdGx5CisgKgltZWFucyBzdXBwb3J0IGZvciBwZXItc3RhdGlvbiBHVEtzLgorICoKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFlfQU5URU5OQV9UWDogQml0bWFwIG9mIGFsbG93ZWQgYW50ZW5uYXMgZm9yIHRyYW5zbWl0dGluZy4KKyAqCVRoaXMgY2FuIGJlIHVzZWQgdG8gbWFzayBvdXQgYW50ZW5uYXMgd2hpY2ggYXJlIG5vdCBhdHRhY2hlZCBvciBzaG91bGQKKyAqCW5vdCBiZSB1c2VkIGZvciB0cmFuc21pdHRpbmcuIElmIGFuIGFudGVubmEgaXMgbm90IHNlbGVjdGVkIGluIHRoaXMKKyAqCWJpdG1hcCB0aGUgaGFyZHdhcmUgaXMgbm90IGFsbG93ZWQgdG8gdHJhbnNtaXQgb24gdGhpcyBhbnRlbm5hLgorICoKKyAqCUVhY2ggYml0IHJlcHJlc2VudHMgb25lIGFudGVubmEsIHN0YXJ0aW5nIHdpdGggYW50ZW5uYSAxIGF0IHRoZSBmaXJzdAorICoJYml0LiBEZXBlbmRpbmcgb24gd2hpY2ggYW50ZW5uYXMgYXJlIHNlbGVjdGVkIGluIHRoZSBiaXRtYXAsIDgwMi4xMW4KKyAqCWRyaXZlcnMgY2FuIGRlcml2ZSB3aGljaCBjaGFpbm1hc2tzIHRvIHVzZSAoaWYgYWxsIGFudGVubmFzIGJlbG9uZ2luZyB0bworICoJYSBwYXJ0aWN1bGFyIGNoYWluIGFyZSBkaXNhYmxlZCB0aGlzIGNoYWluIHNob3VsZCBiZSBkaXNhYmxlZCkgYW5kIGlmCisgKglhIGNoYWluIGhhcyBkaXZlcnNpdHkgYW50ZW5uYXMgd2V0aGVyIGRpdmVyc2l0eSBzaG91bGQgYmUgdXNlZCBvciBub3QuCisgKglIVCBjYXBhYmlsaXRpZXMgKFNUQkMsIFRYIEJlYW1mb3JtaW5nLCBBbnRlbm5hIHNlbGVjdGlvbikgY2FuIGJlCisgKglkZXJpdmVkIGZyb20gdGhlIGF2YWlsYWJsZSBjaGFpbnMgYWZ0ZXIgYXBwbHlpbmcgdGhlIGFudGVubmEgbWFzay4KKyAqCU5vbi04MDIuMTFuIGRyaXZlcnMgY2FuIGRlcml2ZSB3ZXRoZXIgdG8gdXNlIGRpdmVyc2l0eSBvciBub3QuCisgKglEcml2ZXJzIG1heSByZWplY3QgY29uZmlndXJhdGlvbnMgb3IgUlgvVFggbWFzayBjb21iaW5hdGlvbnMgdGhleSBjYW5ub3QKKyAqCXN1cHBvcnQgYnkgcmV0dXJuaW5nIC1FSU5WQUwuCisgKgorICogQE5MODAyMTFfQVRUUl9XSVBIWV9BTlRFTk5BX1JYOiBCaXRtYXAgb2YgYWxsb3dlZCBhbnRlbm5hcyBmb3IgcmVjZWl2aW5nLgorICoJVGhpcyBjYW4gYmUgdXNlZCB0byBtYXNrIG91dCBhbnRlbm5hcyB3aGljaCBhcmUgbm90IGF0dGFjaGVkIG9yIHNob3VsZAorICoJbm90IGJlIHVzZWQgZm9yIHJlY2VpdmluZy4gSWYgYW4gYW50ZW5uYSBpcyBub3Qgc2VsZWN0ZWQgaW4gdGhpcyBiaXRtYXAKKyAqCXRoZSBoYXJkd2FyZSBzaG91bGQgbm90IGJlIGNvbmZpZ3VyZWQgdG8gcmVjZWl2ZSBvbiB0aGlzIGFudGVubmEuCisgKglGb3IgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIHNlZSBATkw4MDIxMV9BVFRSX1dJUEhZX0FOVEVOTkFfVFguCisgKgorICogQE5MODAyMTFfQVRUUl9XSVBIWV9BTlRFTk5BX0FWQUlMX1RYOiBCaXRtYXAgb2YgYW50ZW5uYXMgd2hpY2ggYXJlIGF2YWlsYWJsZQorICoJZm9yIGNvbmZpZ3VyYXRpb24gYXMgVFggYW50ZW5uYXMgdmlhIHRoZSBhYm92ZSBwYXJhbWV0ZXJzLgorICoKKyAqIEBOTDgwMjExX0FUVFJfV0lQSFlfQU5URU5OQV9BVkFJTF9SWDogQml0bWFwIG9mIGFudGVubmFzIHdoaWNoIGFyZSBhdmFpbGFibGUKKyAqCWZvciBjb25maWd1cmF0aW9uIGFzIFJYIGFudGVubmFzIHZpYSB0aGUgYWJvdmUgcGFyYW1ldGVycy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX01DQVNUX1JBVEU6IE11bHRpY2FzdCB0eCByYXRlIChpbiAxMDAga2JwcykgZm9yIElCU1MKKyAqCisgKiBATkw4MDIxMV9BVFRSX09GRkNIQU5ORUxfVFhfT0s6IEZvciBtYW5hZ2VtZW50IGZyYW1lIFRYLCB0aGUgZnJhbWUgbWF5IGJlCisgKgl0cmFuc21pdHRlZCBvbiBhbm90aGVyIGNoYW5uZWwgd2hlbiB0aGUgY2hhbm5lbCBnaXZlbiBkb2Vzbid0IG1hdGNoCisgKgl0aGUgY3VycmVudCBjaGFubmVsLiBJZiB0aGUgY3VycmVudCBjaGFubmVsIGRvZXNuJ3QgbWF0Y2ggYW5kIHRoaXMKKyAqCWZsYWcgaXNuJ3Qgc2V0LCB0aGUgZnJhbWUgd2lsbCBiZSByZWplY3RlZC4gVGhpcyBpcyBhbHNvIHVzZWQgYXMgYW4KKyAqCW5sODAyMTEgY2FwYWJpbGl0eSBmbGFnLgorICoKKyAqIEBOTDgwMjExX0FUVFJfQlNTX0hUT1BNT0RFOiBIVCBvcGVyYXRpb24gbW9kZSAodTE2KQorICoKKyAqIEBOTDgwMjExX0FUVFJfS0VZX0RFRkFVTFRfVFlQRVM6IEEgbmVzdGVkIGF0dHJpYnV0ZSBjb250YWluaW5nIGZsYWdzCisgKglhdHRyaWJ1dGVzLCBzcGVjaWZ5aW5nIHdoYXQgYSBrZXkgc2hvdWxkIGJlIHNldCBhcyBkZWZhdWx0IGFzLgorICoJU2VlICZlbnVtIG5sODAyMTFfa2V5X2RlZmF1bHRfdHlwZXMuCisgKgorICogQE5MODAyMTFfQVRUUl9NRVNIX1NFVFVQOiBPcHRpb25hbCBtZXNoIHNldHVwIHBhcmFtZXRlcnMuICBUaGVzZSBjYW5ub3QgYmUKKyAqCWNoYW5nZWQgb25jZSB0aGUgbWVzaCBpcyBhY3RpdmUuCisgKiBATkw4MDIxMV9BVFRSX01FU0hfQ09ORklHOiBNZXNoIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycywgYSBuZXN0ZWQgYXR0cmlidXRlCisgKgljb250YWluaW5nIGF0dHJpYnV0ZXMgZnJvbSAmZW51bSBubDgwMjExX21lc2hjb25mX3BhcmFtcy4KKyAqIEBOTDgwMjExX0FUVFJfU1VQUE9SVF9NRVNIX0FVVEg6IEN1cnJlbnRseSwgdGhpcyBtZWFucyB0aGUgdW5kZXJseWluZyBkcml2ZXIKKyAqCWFsbG93cyBhdXRoIGZyYW1lcyBpbiBhIG1lc2ggdG8gYmUgcGFzc2VkIHRvIHVzZXJzcGFjZSBmb3IgcHJvY2Vzc2luZyB2aWEKKyAqCXRoZSBATkw4MDIxMV9NRVNIX1NFVFVQX1VTRVJTUEFDRV9BVVRIIGZsYWcuCisgKiBATkw4MDIxMV9BVFRSX1NUQV9QTElOS19TVEFURTogVGhlIHN0YXRlIG9mIGEgbWVzaCBwZWVyIGxpbmsgYXMKKyAqCWRlZmluZWQgaW4gJmVudW0gbmw4MDIxMV9wbGlua19zdGF0ZS4gVXNlZCB3aGVuIHVzZXJzcGFjZSBpcworICoJZHJpdmluZyB0aGUgcGVlciBsaW5rIG1hbmFnZW1lbnQgc3RhdGUgbWFjaGluZS4KKyAqCUBOTDgwMjExX01FU0hfU0VUVVBfVVNFUlNQQUNFX0FNUEUgbXVzdCBiZSBlbmFibGVkLgorICoKKyAqIEBOTDgwMjExX0FUVFJfV09XTEFOX1RSSUdHRVJTX1NVUFBPUlRFRDogaW5kaWNhdGVzLCBhcyBwYXJ0IG9mIHRoZSB3aXBoeQorICoJY2FwYWJpbGl0aWVzLCB0aGUgc3VwcG9ydGVkIFdvV0xBTiB0cmlnZ2VycworICogQE5MODAyMTFfQVRUUl9XT1dMQU5fVFJJR0dFUlM6IHVzZWQgYnkgJU5MODAyMTFfQ01EX1NFVF9XT1dMQU4gdG8KKyAqCWluZGljYXRlIHdoaWNoIFdvVyB0cmlnZ2VycyBzaG91bGQgYmUgZW5hYmxlZC4gVGhpcyBpcyBhbHNvCisgKgl1c2VkIGJ5ICVOTDgwMjExX0NNRF9HRVRfV09XTEFOIHRvIGdldCB0aGUgY3VycmVudGx5IGVuYWJsZWQgV29XTEFOCisgKgl0cmlnZ2Vycy4KKworICogQE5MODAyMTFfQVRUUl9TQ0hFRF9TQ0FOX0lOVEVSVkFMOiBJbnRlcnZhbCBiZXR3ZWVuIHNjaGVkdWxlZCBzY2FuCisgKgljeWNsZXMsIGluIG1zZWNzLgorCisgKiBATkw4MDIxMV9BVFRSX1NDSEVEX1NDQU5fTUFUQ0g6IE5lc3RlZCBhdHRyaWJ1dGUgd2l0aCBvbmUgb3IgbW9yZQorICoJc2V0cyBvZiBhdHRyaWJ1dGVzIHRvIG1hdGNoIGR1cmluZyBzY2hlZHVsZWQgc2NhbnMuICBPbmx5IEJTU3MKKyAqCXRoYXQgbWF0Y2ggYW55IG9mIHRoZSBzZXRzIHdpbGwgYmUgcmVwb3J0ZWQuICBUaGVzZSBhcmUKKyAqCXBhc3MtdGhydSBmaWx0ZXIgcnVsZXMuCisgKglGb3IgYSBtYXRjaCB0byBzdWNjZWVkLCB0aGUgQlNTIG11c3QgbWF0Y2ggYWxsIGF0dHJpYnV0ZXMgb2YgYQorICoJc2V0LiAgU2luY2Ugbm90IGV2ZXJ5IGhhcmR3YXJlIHN1cHBvcnRzIG1hdGNoaW5nIGFsbCB0eXBlcyBvZgorICoJYXR0cmlidXRlcywgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIHJlcG9ydGVkIEJTU3MgYXJlCisgKglmdWxseSBjb21wbHlpbmcgd2l0aCB0aGUgbWF0Y2ggc2V0cyBhbmQgdXNlcnNwYWNlIG5lZWRzIHRvIGJlCisgKglhYmxlIHRvIGlnbm9yZSB0aGVtIGJ5IGl0c2VsZi4KKyAqCVRodXMsIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBzb21ld2hhdCBoYXJkd2FyZS1kZXBlbmRlbnQsIGJ1dAorICoJdGhpcyBpcyBvbmx5IGFuIG9wdGltaXphdGlvbiBhbmQgdGhlIHVzZXJzcGFjZSBhcHBsaWNhdGlvbgorICoJbmVlZHMgdG8gaGFuZGxlIGFsbCB0aGUgbm9uLWZpbHRlcmVkIHJlc3VsdHMgYW55d2F5LgorICoJSWYgdGhlIG1hdGNoIGF0dHJpYnV0ZXMgZG9uJ3QgbWFrZSBzZW5zZSB3aGVuIGNvbWJpbmVkIHdpdGgKKyAqCXRoZSB2YWx1ZXMgcGFzc2VkIGluIEBOTDgwMjExX0FUVFJfU0NBTl9TU0lEUyAoZWcuIGlmIGFuIFNTSUQKKyAqCWlzIGluY2x1ZGVkIGluIHRoZSBwcm9iZSByZXF1ZXN0LCBidXQgdGhlIG1hdGNoIGF0dHJpYnV0ZXMKKyAqCXdpbGwgbmV2ZXIgbGV0IGl0IGdvIHRocm91Z2gpLCAtRUlOVkFMIG1heSBiZSByZXR1cm5lZC4KKyAqCUlmIG9tbWl0ZWQsIG5vIGZpbHRlcmluZyBpcyBkb25lLgorICoKKyAqIEBOTDgwMjExX0FUVFJfSU5URVJGQUNFX0NPTUJJTkFUSU9OUzogTmVzdGVkIGF0dHJpYnV0ZSBsaXN0aW5nIHRoZSBzdXBwb3J0ZWQKKyAqCWludGVyZmFjZSBjb21iaW5hdGlvbnMuIEluIGVhY2ggbmVzdGVkIGl0ZW0sIGl0IGNvbnRhaW5zIGF0dHJpYnV0ZXMKKyAqCWRlZmluZWQgaW4gJmVudW0gbmw4MDIxMV9pZl9jb21iaW5hdGlvbl9hdHRycy4KKyAqIEBOTDgwMjExX0FUVFJfU09GVFdBUkVfSUZUWVBFUzogTmVzdGVkIGF0dHJpYnV0ZSAoanVzdCBsaWtlCisgKgklTkw4MDIxMV9BVFRSX1NVUFBPUlRFRF9JRlRZUEVTKSBjb250YWluaW5nIHRoZSBpbnRlcmZhY2UgdHlwZXMgdGhhdAorICoJYXJlIG1hbmFnZWQgaW4gc29mdHdhcmU6IGludGVyZmFjZXMgb2YgdGhlc2UgdHlwZXMgYXJlbid0IHN1YmplY3QgdG8KKyAqCWFueSByZXN0cmljdGlvbnMgaW4gdGhlaXIgbnVtYmVyIG9yIGNvbWJpbmF0aW9ucy4KKyAqCisgKiBAJU5MODAyMTFfQVRUUl9SRUtFWV9EQVRBOiBuZXN0ZWQgYXR0cmlidXRlIGNvbnRhaW5pbmcgdGhlIGluZm9ybWF0aW9uCisgKgluZWNlc3NhcnkgZm9yIEdUSyByZWtleWluZyBpbiB0aGUgZGV2aWNlLCBzZWUgJmVudW0gbmw4MDIxMV9yZWtleV9kYXRhLgorICoKKyAqIEBOTDgwMjExX0FUVFJfU0NBTl9TVVBQX1JBVEVTOiByYXRlcyBwZXIgdG8gYmUgYWR2ZXJ0aXNlZCBhcyBzdXBwb3J0ZWQgaW4gc2NhbiwKKyAqCW5lc3RlZCBhcnJheSBhdHRyaWJ1dGUgY29udGFpbmluZyBhbiBlbnRyeSBmb3IgZWFjaCBiYW5kLCB3aXRoIHRoZSBlbnRyeQorICoJYmVpbmcgYSBsaXN0IG9mIHN1cHBvcnRlZCByYXRlcyBhcyBkZWZpbmVkIGJ5IElFRUUgODAyLjExIDcuMy4yLjIgYnV0CisgKgl3aXRob3V0IHRoZSBsZW5ndGggcmVzdHJpY3Rpb24gKGF0IG1vc3QgJU5MODAyMTFfTUFYX1NVUFBfUkFURVMpLgorICoKKyAqIEBOTDgwMjExX0FUVFJfSElEREVOX1NTSUQ6IGluZGljYXRlcyB3aGV0aGVyIFNTSUQgaXMgdG8gYmUgaGlkZGVuIGZyb20gQmVhY29uCisgKglhbmQgUHJvYmUgUmVzcG9uc2UgKHdoZW4gcmVzcG9uc2UgdG8gd2lsZGNhcmQgUHJvYmUgUmVxdWVzdCk7IHNlZQorICoJJmVudW0gbmw4MDIxMV9oaWRkZW5fc3NpZCwgcmVwcmVzZW50ZWQgYXMgYSB1MzIKKyAqCisgKiBATkw4MDIxMV9BVFRSX0lFX1BST0JFX1JFU1A6IEluZm9ybWF0aW9uIGVsZW1lbnQocykgZm9yIFByb2JlIFJlc3BvbnNlIGZyYW1lLgorICoJVGhpcyBpcyB1c2VkIHdpdGggJU5MODAyMTFfQ01EX05FV19CRUFDT04gYW5kICVOTDgwMjExX0NNRF9TRVRfQkVBQ09OIHRvCisgKglwcm92aWRlIGV4dHJhIElFcyAoZS5nLiwgV1BTL1AyUCBJRSkgaW50byBQcm9iZSBSZXNwb25zZSBmcmFtZXMgd2hlbiB0aGUKKyAqCWRyaXZlciAob3IgZmlybXdhcmUpIHJlcGxpZXMgdG8gUHJvYmUgUmVxdWVzdCBmcmFtZXMuCisgKiBATkw4MDIxMV9BVFRSX0lFX0FTU09DX1JFU1A6IEluZm9ybWF0aW9uIGVsZW1lbnQocykgZm9yIChSZSlBc3NvY2lhdGlvbgorICoJUmVzcG9uc2UgZnJhbWVzLiBUaGlzIGlzIHVzZWQgd2l0aCAlTkw4MDIxMV9DTURfTkVXX0JFQUNPTiBhbmQKKyAqCSVOTDgwMjExX0NNRF9TRVRfQkVBQ09OIHRvIHByb3ZpZGUgZXh0cmEgSUVzIChlLmcuLCBXUFMvUDJQIElFKSBpbnRvCisgKgkoUmUpQXNzb2NpYXRpb24gUmVzcG9uc2UgZnJhbWVzIHdoZW4gdGhlIGRyaXZlciAob3IgZmlybXdhcmUpIHJlcGxpZXMgdG8KKyAqCShSZSlBc3NvY2lhdGlvbiBSZXF1ZXN0IGZyYW1lcy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1NUQV9XTUU6IE5lc3RlZCBhdHRyaWJ1dGUgY29udGFpbmluZyB0aGUgd21lIGNvbmZpZ3VyYXRpb24KKyAqCW9mIHRoZSBzdGF0aW9uLCBzZWUgJmVudW0gbmw4MDIxMV9zdGFfd21lX2F0dHIuCisgKiBATkw4MDIxMV9BVFRSX1NVUFBPUlRfQVBfVUFQU0Q6IHRoZSBkZXZpY2Ugc3VwcG9ydHMgdWFwc2Qgd2hlbiB3b3JraW5nCisgKglhcyBBUC4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1JPQU1fU1VQUE9SVDogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpcm13YXJlIGlzIGNhcGFibGUgb2YKKyAqCXJvYW1pbmcgdG8gYW5vdGhlciBBUCBpbiB0aGUgc2FtZSBFU1MgaWYgdGhlIHNpZ25hbCBsZXZlciBpcyBsb3cuCisgKgorICogQE5MODAyMTFfQVRUUl9QTUtTQV9DQU5ESURBVEU6IE5lc3RlZCBhdHRyaWJ1dGUgY29udGFpbmluZyB0aGUgUE1LU0EgY2FjaGluZworICoJY2FuZGlkYXRlIGluZm9ybWF0aW9uLCBzZWUgJmVudW0gbmw4MDIxMV9wbWtzYV9jYW5kaWRhdGVfYXR0ci4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1RYX05PX0NDS19SQVRFOiBJbmRpY2F0ZXMgd2hldGhlciB0byB1c2UgQ0NLIHJhdGUgb3Igbm90CisgKglmb3IgbWFuYWdlbWVudCBmcmFtZXMgdHJhbnNtaXNzaW9uLiBJbiBvcmRlciB0byBhdm9pZCBwMnAgcHJvYmUvYWN0aW9uCisgKglmcmFtZXMgYXJlIGJlaW5nIHRyYW5zbWl0dGVkIGF0IENDSyByYXRlIGluIDJHSHogYmFuZCwgdGhlIHVzZXIgc3BhY2UKKyAqCWFwcGxpY2F0aW9ucyB1c2UgdGhpcyBhdHRyaWJ1dGUuCisgKglUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHdpdGggJU5MODAyMTFfQ01EX1RSSUdHRVJfU0NBTiBhbmQKKyAqCSVOTDgwMjExX0NNRF9GUkFNRSBjb21tYW5kcy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1RETFNfQUNUSU9OOiBMb3cgbGV2ZWwgVERMUyBhY3Rpb24gY29kZSAoZS5nLiBsaW5rIHNldHVwCisgKglyZXF1ZXN0LCBsaW5rIHNldHVwIGNvbmZpcm0sIGxpbmsgdGVhcmRvd24sIGV0Yy4pLiBWYWx1ZXMgYXJlCisgKglkZXNjcmliZWQgaW4gdGhlIFRETFMgKDgwMi4xMXopIHNwZWNpZmljYXRpb24uCisgKiBATkw4MDIxMV9BVFRSX1RETFNfRElBTE9HX1RPS0VOOiBOb24temVybyB0b2tlbiBmb3IgdW5pcXVlbHkgaWRlbnRpZnlpbmcgYQorICoJVERMUyBjb252ZXJzYXRpb24gYmV0d2VlbiB0d28gZGV2aWNlcy4KKyAqIEBOTDgwMjExX0FUVFJfVERMU19PUEVSQVRJT046IEhpZ2ggbGV2ZWwgVERMUyBvcGVyYXRpb247IHNlZQorICoJJmVudW0gbmw4MDIxMV90ZGxzX29wZXJhdGlvbiwgcmVwcmVzZW50ZWQgYXMgYSB1OC4KKyAqIEBOTDgwMjExX0FUVFJfVERMU19TVVBQT1JUOiBBIGZsYWcgaW5kaWNhdGluZyB0aGUgZGV2aWNlIGNhbiBvcGVyYXRlCisgKglhcyBhIFRETFMgcGVlciBzdGEuCisgKiBATkw4MDIxMV9BVFRSX1RETFNfRVhURVJOQUxfU0VUVVA6IFRoZSBURExTIGRpc2NvdmVyeS9zZXR1cCBhbmQgdGVhcmRvd24KKyAqCXByb2NlZHVyZXMgc2hvdWxkIGJlIHBlcmZvcm1lZCBieSBzZW5kaW5nIFRETFMgcGFja2V0cyB2aWEKKyAqCSVOTDgwMjExX0NNRF9URExTX01HTVQuIE90aGVyd2lzZSAlTkw4MDIxMV9DTURfVERMU19PUEVSIHNob3VsZCBiZQorICoJdXNlZCBmb3IgYXNraW5nIHRoZSBkcml2ZXIgdG8gcGVyZm9ybSBhIFRETFMgb3BlcmF0aW9uLgorICoKKyAqIEBOTDgwMjExX0FUVFJfTUFYOiBoaWdoZXN0IGF0dHJpYnV0ZSBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKKyAqIEBfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqLworZW51bSBubDgwMjExX2F0dHJzIHsKKy8qIGRvbid0IGNoYW5nZSB0aGUgb3JkZXIgb3IgYWRkIGFueXRoaW5nIGJldHdlZW4sIHRoaXMgaXMgQUJJISAqLworCU5MODAyMTFfQVRUUl9VTlNQRUMsCisKKwlOTDgwMjExX0FUVFJfV0lQSFksCisJTkw4MDIxMV9BVFRSX1dJUEhZX05BTUUsCisKKwlOTDgwMjExX0FUVFJfSUZJTkRFWCwKKwlOTDgwMjExX0FUVFJfSUZOQU1FLAorCU5MODAyMTFfQVRUUl9JRlRZUEUsCisKKwlOTDgwMjExX0FUVFJfTUFDLAorCisJTkw4MDIxMV9BVFRSX0tFWV9EQVRBLAorCU5MODAyMTFfQVRUUl9LRVlfSURYLAorCU5MODAyMTFfQVRUUl9LRVlfQ0lQSEVSLAorCU5MODAyMTFfQVRUUl9LRVlfU0VRLAorCU5MODAyMTFfQVRUUl9LRVlfREVGQVVMVCwKKworCU5MODAyMTFfQVRUUl9CRUFDT05fSU5URVJWQUwsCisJTkw4MDIxMV9BVFRSX0RUSU1fUEVSSU9ELAorCU5MODAyMTFfQVRUUl9CRUFDT05fSEVBRCwKKwlOTDgwMjExX0FUVFJfQkVBQ09OX1RBSUwsCisKKwlOTDgwMjExX0FUVFJfU1RBX0FJRCwKKwlOTDgwMjExX0FUVFJfU1RBX0ZMQUdTLAorCU5MODAyMTFfQVRUUl9TVEFfTElTVEVOX0lOVEVSVkFMLAorCU5MODAyMTFfQVRUUl9TVEFfU1VQUE9SVEVEX1JBVEVTLAorCU5MODAyMTFfQVRUUl9TVEFfVkxBTiwKKwlOTDgwMjExX0FUVFJfU1RBX0lORk8sCisKKwlOTDgwMjExX0FUVFJfV0lQSFlfQkFORFMsCisKKwlOTDgwMjExX0FUVFJfTU5UUl9GTEFHUywKKworCU5MODAyMTFfQVRUUl9NRVNIX0lELAorCU5MODAyMTFfQVRUUl9TVEFfUExJTktfQUNUSU9OLAorCU5MODAyMTFfQVRUUl9NUEFUSF9ORVhUX0hPUCwKKwlOTDgwMjExX0FUVFJfTVBBVEhfSU5GTywKKworCU5MODAyMTFfQVRUUl9CU1NfQ1RTX1BST1QsCisJTkw4MDIxMV9BVFRSX0JTU19TSE9SVF9QUkVBTUJMRSwKKwlOTDgwMjExX0FUVFJfQlNTX1NIT1JUX1NMT1RfVElNRSwKKworCU5MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZLAorCisJTkw4MDIxMV9BVFRSX1NVUFBPUlRFRF9JRlRZUEVTLAorCisJTkw4MDIxMV9BVFRSX1JFR19BTFBIQTIsCisJTkw4MDIxMV9BVFRSX1JFR19SVUxFUywKKworCU5MODAyMTFfQVRUUl9NRVNIX0NPTkZJRywKKworCU5MODAyMTFfQVRUUl9CU1NfQkFTSUNfUkFURVMsCisKKwlOTDgwMjExX0FUVFJfV0lQSFlfVFhRX1BBUkFNUywKKwlOTDgwMjExX0FUVFJfV0lQSFlfRlJFUSwKKwlOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFLAorCisJTkw4MDIxMV9BVFRSX0tFWV9ERUZBVUxUX01HTVQsCisKKwlOTDgwMjExX0FUVFJfTUdNVF9TVUJUWVBFLAorCU5MODAyMTFfQVRUUl9JRSwKKworCU5MODAyMTFfQVRUUl9NQVhfTlVNX1NDQU5fU1NJRFMsCisKKwlOTDgwMjExX0FUVFJfU0NBTl9GUkVRVUVOQ0lFUywKKwlOTDgwMjExX0FUVFJfU0NBTl9TU0lEUywKKwlOTDgwMjExX0FUVFJfR0VORVJBVElPTiwgLyogcmVwbGFjZXMgb2xkIFNDQU5fR0VORVJBVElPTiAqLworCU5MODAyMTFfQVRUUl9CU1MsCisKKwlOTDgwMjExX0FUVFJfUkVHX0lOSVRJQVRPUiwKKwlOTDgwMjExX0FUVFJfUkVHX1RZUEUsCisKKwlOTDgwMjExX0FUVFJfU1VQUE9SVEVEX0NPTU1BTkRTLAorCisJTkw4MDIxMV9BVFRSX0ZSQU1FLAorCU5MODAyMTFfQVRUUl9TU0lELAorCU5MODAyMTFfQVRUUl9BVVRIX1RZUEUsCisJTkw4MDIxMV9BVFRSX1JFQVNPTl9DT0RFLAorCisJTkw4MDIxMV9BVFRSX0tFWV9UWVBFLAorCisJTkw4MDIxMV9BVFRSX01BWF9TQ0FOX0lFX0xFTiwKKwlOTDgwMjExX0FUVFJfQ0lQSEVSX1NVSVRFUywKKworCU5MODAyMTFfQVRUUl9GUkVRX0JFRk9SRSwKKwlOTDgwMjExX0FUVFJfRlJFUV9BRlRFUiwKKworCU5MODAyMTFfQVRUUl9GUkVRX0ZJWEVELAorCisKKwlOTDgwMjExX0FUVFJfV0lQSFlfUkVUUllfU0hPUlQsCisJTkw4MDIxMV9BVFRSX1dJUEhZX1JFVFJZX0xPTkcsCisJTkw4MDIxMV9BVFRSX1dJUEhZX0ZSQUdfVEhSRVNIT0xELAorCU5MODAyMTFfQVRUUl9XSVBIWV9SVFNfVEhSRVNIT0xELAorCisJTkw4MDIxMV9BVFRSX1RJTUVEX09VVCwKKworCU5MODAyMTFfQVRUUl9VU0VfTUZQLAorCisJTkw4MDIxMV9BVFRSX1NUQV9GTEFHUzIsCisKKwlOTDgwMjExX0FUVFJfQ09OVFJPTF9QT1JULAorCisJTkw4MDIxMV9BVFRSX1RFU1REQVRBLAorCisJTkw4MDIxMV9BVFRSX1BSSVZBQ1ksCisKKwlOTDgwMjExX0FUVFJfRElTQ09OTkVDVEVEX0JZX0FQLAorCU5MODAyMTFfQVRUUl9TVEFUVVNfQ09ERSwKKworCU5MODAyMTFfQVRUUl9DSVBIRVJfU1VJVEVTX1BBSVJXSVNFLAorCU5MODAyMTFfQVRUUl9DSVBIRVJfU1VJVEVfR1JPVVAsCisJTkw4MDIxMV9BVFRSX1dQQV9WRVJTSU9OUywKKwlOTDgwMjExX0FUVFJfQUtNX1NVSVRFUywKKworCU5MODAyMTFfQVRUUl9SRVFfSUUsCisJTkw4MDIxMV9BVFRSX1JFU1BfSUUsCisKKwlOTDgwMjExX0FUVFJfUFJFVl9CU1NJRCwKKworCU5MODAyMTFfQVRUUl9LRVksCisJTkw4MDIxMV9BVFRSX0tFWVMsCisKKwlOTDgwMjExX0FUVFJfUElELAorCisJTkw4MDIxMV9BVFRSXzRBRERSLAorCisJTkw4MDIxMV9BVFRSX1NVUlZFWV9JTkZPLAorCisJTkw4MDIxMV9BVFRSX1BNS0lELAorCU5MODAyMTFfQVRUUl9NQVhfTlVNX1BNS0lEUywKKworCU5MODAyMTFfQVRUUl9EVVJBVElPTiwKKworCU5MODAyMTFfQVRUUl9DT09LSUUsCisKKwlOTDgwMjExX0FUVFJfV0lQSFlfQ09WRVJBR0VfQ0xBU1MsCisKKwlOTDgwMjExX0FUVFJfVFhfUkFURVMsCisKKwlOTDgwMjExX0FUVFJfRlJBTUVfTUFUQ0gsCisKKwlOTDgwMjExX0FUVFJfQUNLLAorCisJTkw4MDIxMV9BVFRSX1BTX1NUQVRFLAorCisJTkw4MDIxMV9BVFRSX0NRTSwKKworCU5MODAyMTFfQVRUUl9MT0NBTF9TVEFURV9DSEFOR0UsCisKKwlOTDgwMjExX0FUVFJfQVBfSVNPTEFURSwKKworCU5MODAyMTFfQVRUUl9XSVBIWV9UWF9QT1dFUl9TRVRUSU5HLAorCU5MODAyMTFfQVRUUl9XSVBIWV9UWF9QT1dFUl9MRVZFTCwKKworCU5MODAyMTFfQVRUUl9UWF9GUkFNRV9UWVBFUywKKwlOTDgwMjExX0FUVFJfUlhfRlJBTUVfVFlQRVMsCisJTkw4MDIxMV9BVFRSX0ZSQU1FX1RZUEUsCisKKwlOTDgwMjExX0FUVFJfQ09OVFJPTF9QT1JUX0VUSEVSVFlQRSwKKwlOTDgwMjExX0FUVFJfQ09OVFJPTF9QT1JUX05PX0VOQ1JZUFQsCisKKwlOTDgwMjExX0FUVFJfU1VQUE9SVF9JQlNTX1JTTiwKKworCU5MODAyMTFfQVRUUl9XSVBIWV9BTlRFTk5BX1RYLAorCU5MODAyMTFfQVRUUl9XSVBIWV9BTlRFTk5BX1JYLAorCisJTkw4MDIxMV9BVFRSX01DQVNUX1JBVEUsCisKKwlOTDgwMjExX0FUVFJfT0ZGQ0hBTk5FTF9UWF9PSywKKworCU5MODAyMTFfQVRUUl9CU1NfSFRfT1BNT0RFLAorCisJTkw4MDIxMV9BVFRSX0tFWV9ERUZBVUxUX1RZUEVTLAorCisJTkw4MDIxMV9BVFRSX01BWF9SRU1BSU5fT05fQ0hBTk5FTF9EVVJBVElPTiwKKworCU5MODAyMTFfQVRUUl9NRVNIX1NFVFVQLAorCisJTkw4MDIxMV9BVFRSX1dJUEhZX0FOVEVOTkFfQVZBSUxfVFgsCisJTkw4MDIxMV9BVFRSX1dJUEhZX0FOVEVOTkFfQVZBSUxfUlgsCisKKwlOTDgwMjExX0FUVFJfU1VQUE9SVF9NRVNIX0FVVEgsCisJTkw4MDIxMV9BVFRSX1NUQV9QTElOS19TVEFURSwKKworCU5MODAyMTFfQVRUUl9XT1dMQU5fVFJJR0dFUlMsCisJTkw4MDIxMV9BVFRSX1dPV0xBTl9UUklHR0VSU19TVVBQT1JURUQsCisKKwlOTDgwMjExX0FUVFJfU0NIRURfU0NBTl9JTlRFUlZBTCwKKworCU5MODAyMTFfQVRUUl9JTlRFUkZBQ0VfQ09NQklOQVRJT05TLAorCU5MODAyMTFfQVRUUl9TT0ZUV0FSRV9JRlRZUEVTLAorCisJTkw4MDIxMV9BVFRSX1JFS0VZX0RBVEEsCisKKwlOTDgwMjExX0FUVFJfTUFYX05VTV9TQ0hFRF9TQ0FOX1NTSURTLAorCU5MODAyMTFfQVRUUl9NQVhfU0NIRURfU0NBTl9JRV9MRU4sCisKKwlOTDgwMjExX0FUVFJfU0NBTl9TVVBQX1JBVEVTLAorCisJTkw4MDIxMV9BVFRSX0hJRERFTl9TU0lELAorCisJTkw4MDIxMV9BVFRSX0lFX1BST0JFX1JFU1AsCisJTkw4MDIxMV9BVFRSX0lFX0FTU09DX1JFU1AsCisKKwlOTDgwMjExX0FUVFJfU1RBX1dNRSwKKwlOTDgwMjExX0FUVFJfU1VQUE9SVF9BUF9VQVBTRCwKKworCU5MODAyMTFfQVRUUl9ST0FNX1NVUFBPUlQsCisKKwlOTDgwMjExX0FUVFJfU0NIRURfU0NBTl9NQVRDSCwKKwlOTDgwMjExX0FUVFJfTUFYX01BVENIX1NFVFMsCisKKwlOTDgwMjExX0FUVFJfUE1LU0FfQ0FORElEQVRFLAorCisJTkw4MDIxMV9BVFRSX1RYX05PX0NDS19SQVRFLAorCisJTkw4MDIxMV9BVFRSX1RETFNfQUNUSU9OLAorCU5MODAyMTFfQVRUUl9URExTX0RJQUxPR19UT0tFTiwKKwlOTDgwMjExX0FUVFJfVERMU19PUEVSQVRJT04sCisJTkw4MDIxMV9BVFRSX1RETFNfU1VQUE9SVCwKKwlOTDgwMjExX0FUVFJfVERMU19FWFRFUk5BTF9TRVRVUCwKKworCS8qIGFkZCBhdHRyaWJ1dGVzIGhlcmUsIHVwZGF0ZSB0aGUgcG9saWN5IGluIG5sODAyMTEuYyAqLworCisJX19OTDgwMjExX0FUVFJfQUZURVJfTEFTVCwKKwlOTDgwMjExX0FUVFJfTUFYID0gX19OTDgwMjExX0FUVFJfQUZURVJfTEFTVCAtIDEKK307CisKKy8qIHNvdXJjZS1sZXZlbCBBUEkgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBOTDgwMjExX0FUVFJfU0NBTl9HRU5FUkFUSU9OIE5MODAyMTFfQVRUUl9HRU5FUkFUSU9OCisjZGVmaW5lCU5MODAyMTFfQVRUUl9NRVNIX1BBUkFNUyBOTDgwMjExX0FUVFJfTUVTSF9DT05GSUcKKworLyoKKyAqIEFsbG93IHVzZXIgc3BhY2UgcHJvZ3JhbXMgdG8gdXNlICNpZmRlZiBvbiBuZXcgYXR0cmlidXRlcyBieSBkZWZpbmluZyB0aGVtCisgKiBoZXJlCisgKi8KKyNkZWZpbmUgTkw4MDIxMV9DTURfQ09OTkVDVCBOTDgwMjExX0NNRF9DT05ORUNUCisjZGVmaW5lIE5MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZIE5MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZCisjZGVmaW5lIE5MODAyMTFfQVRUUl9CU1NfQkFTSUNfUkFURVMgTkw4MDIxMV9BVFRSX0JTU19CQVNJQ19SQVRFUworI2RlZmluZSBOTDgwMjExX0FUVFJfV0lQSFlfVFhRX1BBUkFNUyBOTDgwMjExX0FUVFJfV0lQSFlfVFhRX1BBUkFNUworI2RlZmluZSBOTDgwMjExX0FUVFJfV0lQSFlfRlJFUSBOTDgwMjExX0FUVFJfV0lQSFlfRlJFUQorI2RlZmluZSBOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFIE5MODAyMTFfQVRUUl9XSVBIWV9DSEFOTkVMX1RZUEUKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX01HTVRfU1VCVFlQRSBOTDgwMjExX0FUVFJfTUdNVF9TVUJUWVBFCisjZGVmaW5lIE5MODAyMTFfQVRUUl9JRSBOTDgwMjExX0FUVFJfSUUKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX1JFR19JTklUSUFUT1IgTkw4MDIxMV9BVFRSX1JFR19JTklUSUFUT1IKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX1JFR19UWVBFIE5MODAyMTFfQVRUUl9SRUdfVFlQRQorI2RlZmluZSBOTDgwMjExX0FUVFJfRlJBTUUgTkw4MDIxMV9BVFRSX0ZSQU1FCisjZGVmaW5lIE5MODAyMTFfQVRUUl9TU0lEIE5MODAyMTFfQVRUUl9TU0lECisjZGVmaW5lIE5MODAyMTFfQVRUUl9BVVRIX1RZUEUgTkw4MDIxMV9BVFRSX0FVVEhfVFlQRQorI2RlZmluZSBOTDgwMjExX0FUVFJfUkVBU09OX0NPREUgTkw4MDIxMV9BVFRSX1JFQVNPTl9DT0RFCisjZGVmaW5lIE5MODAyMTFfQVRUUl9DSVBIRVJfU1VJVEVTX1BBSVJXSVNFIE5MODAyMTFfQVRUUl9DSVBIRVJfU1VJVEVTX1BBSVJXSVNFCisjZGVmaW5lIE5MODAyMTFfQVRUUl9DSVBIRVJfU1VJVEVfR1JPVVAgTkw4MDIxMV9BVFRSX0NJUEhFUl9TVUlURV9HUk9VUAorI2RlZmluZSBOTDgwMjExX0FUVFJfV1BBX1ZFUlNJT05TIE5MODAyMTFfQVRUUl9XUEFfVkVSU0lPTlMKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX0FLTV9TVUlURVMgTkw4MDIxMV9BVFRSX0FLTV9TVUlURVMKKyNkZWZpbmUgTkw4MDIxMV9BVFRSX0tFWSBOTDgwMjExX0FUVFJfS0VZCisjZGVmaW5lIE5MODAyMTFfQVRUUl9LRVlTIE5MODAyMTFfQVRUUl9LRVlTCisKKyNkZWZpbmUgTkw4MDIxMV9NQVhfU1VQUF9SQVRFUwkJCTMyCisjZGVmaW5lIE5MODAyMTFfTUFYX1NVUFBfUkVHX1JVTEVTCQkzMgorI2RlZmluZSBOTDgwMjExX1RLSVBfREFUQV9PRkZTRVRfRU5DUl9LRVkJMAorI2RlZmluZSBOTDgwMjExX1RLSVBfREFUQV9PRkZTRVRfVFhfTUlDX0tFWQkxNgorI2RlZmluZSBOTDgwMjExX1RLSVBfREFUQV9PRkZTRVRfUlhfTUlDX0tFWQkyNAorI2RlZmluZSBOTDgwMjExX0hUX0NBUEFCSUxJVFlfTEVOCQkyNgorCisjZGVmaW5lIE5MODAyMTFfTUFYX05SX0NJUEhFUl9TVUlURVMJCTUKKyNkZWZpbmUgTkw4MDIxMV9NQVhfTlJfQUtNX1NVSVRFUwkJMgorCisvKioKKyAqIGVudW0gbmw4MDIxMV9pZnR5cGUgLSAodmlydHVhbCkgaW50ZXJmYWNlIHR5cGVzCisgKgorICogQE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEOiB1bnNwZWNpZmllZCB0eXBlLCBkcml2ZXIgZGVjaWRlcworICogQE5MODAyMTFfSUZUWVBFX0FESE9DOiBpbmRlcGVuZGVudCBCU1MgbWVtYmVyCisgKiBATkw4MDIxMV9JRlRZUEVfU1RBVElPTjogbWFuYWdlZCBCU1MgbWVtYmVyCisgKiBATkw4MDIxMV9JRlRZUEVfQVA6IGFjY2VzcyBwb2ludAorICogQE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46IFZMQU4gaW50ZXJmYWNlIGZvciBhY2Nlc3MgcG9pbnRzOyBWTEFOIGludGVyZmFjZXMKKyAqCWFyZSBhIGJpdCBzcGVjaWFsIGluIHRoYXQgdGhleSBtdXN0IGFsd2F5cyBiZSB0aWVkIHRvIGEgcHJlLWV4aXN0aW5nCisgKglBUCB0eXBlIGludGVyZmFjZS4KKyAqIEBOTDgwMjExX0lGVFlQRV9XRFM6IHdpcmVsZXNzIGRpc3RyaWJ1dGlvbiBpbnRlcmZhY2UKKyAqIEBOTDgwMjExX0lGVFlQRV9NT05JVE9SOiBtb25pdG9yIGludGVyZmFjZSByZWNlaXZpbmcgYWxsIGZyYW1lcworICogQE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQ6IG1lc2ggcG9pbnQKKyAqIEBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UOiBQMlAgY2xpZW50CisgKiBATkw4MDIxMV9JRlRZUEVfUDJQX0dPOiBQMlAgZ3JvdXAgb3duZXIKKyAqIEBOTDgwMjExX0lGVFlQRV9NQVg6IGhpZ2hlc3QgaW50ZXJmYWNlIHR5cGUgbnVtYmVyIGN1cnJlbnRseSBkZWZpbmVkCisgKiBATlVNX05MODAyMTFfSUZUWVBFUzogbnVtYmVyIG9mIGRlZmluZWQgaW50ZXJmYWNlIHR5cGVzCisgKgorICogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHdpdGggdGhlICVOTDgwMjExX0FUVFJfSUZUWVBFCisgKiB0byBzZXQgdGhlIHR5cGUgb2YgYW4gaW50ZXJmYWNlLgorICoKKyAqLworZW51bSBubDgwMjExX2lmdHlwZSB7CisJTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQsCisJTkw4MDIxMV9JRlRZUEVfQURIT0MsCisJTkw4MDIxMV9JRlRZUEVfU1RBVElPTiwKKwlOTDgwMjExX0lGVFlQRV9BUCwKKwlOTDgwMjExX0lGVFlQRV9BUF9WTEFOLAorCU5MODAyMTFfSUZUWVBFX1dEUywKKwlOTDgwMjExX0lGVFlQRV9NT05JVE9SLAorCU5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQsCisJTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCwKKwlOTDgwMjExX0lGVFlQRV9QMlBfR08sCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlOVU1fTkw4MDIxMV9JRlRZUEVTLAorCU5MODAyMTFfSUZUWVBFX01BWCA9IE5VTV9OTDgwMjExX0lGVFlQRVMgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9zdGFfZmxhZ3MgLSBzdGF0aW9uIGZsYWdzCisgKgorICogU3RhdGlvbiBmbGFncy4gV2hlbiBhIHN0YXRpb24gaXMgYWRkZWQgdG8gYW4gQVAgaW50ZXJmYWNlLCBpdCBpcworICogYXNzdW1lZCB0byBiZSBhbHJlYWR5IGFzc29jaWF0ZWQgKGFuZCBoZW5jZSBhdXRoZW50aWNhdGVkLikKKyAqCisgKiBAX19OTDgwMjExX1NUQV9GTEFHX0lOVkFMSUQ6IGF0dHJpYnV0ZSBudW1iZXIgMCBpcyByZXNlcnZlZAorICogQE5MODAyMTFfU1RBX0ZMQUdfQVVUSE9SSVpFRDogc3RhdGlvbiBpcyBhdXRob3JpemVkICg4MDIuMVgpCisgKiBATkw4MDIxMV9TVEFfRkxBR19TSE9SVF9QUkVBTUJMRTogc3RhdGlvbiBpcyBjYXBhYmxlIG9mIHJlY2VpdmluZyBmcmFtZXMKKyAqCXdpdGggc2hvcnQgYmFya2VyIHByZWFtYmxlCisgKiBATkw4MDIxMV9TVEFfRkxBR19XTUU6IHN0YXRpb24gaXMgV01FL1FvUyBjYXBhYmxlCisgKiBATkw4MDIxMV9TVEFfRkxBR19NRlA6IHN0YXRpb24gdXNlcyBtYW5hZ2VtZW50IGZyYW1lIHByb3RlY3Rpb24KKyAqIEBOTDgwMjExX1NUQV9GTEFHX0FVVEhFTlRJQ0FURUQ6IHN0YXRpb24gaXMgYXV0aGVudGljYXRlZAorICogQE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSOiBzdGF0aW9uIGlzIGEgVERMUyBwZWVyCisgKiBATkw4MDIxMV9TVEFfRkxBR19NQVg6IGhpZ2hlc3Qgc3RhdGlvbiBmbGFnIG51bWJlciBjdXJyZW50bHkgZGVmaW5lZAorICogQF9fTkw4MDIxMV9TVEFfRkxBR19BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqLworZW51bSBubDgwMjExX3N0YV9mbGFncyB7CisJX19OTDgwMjExX1NUQV9GTEFHX0lOVkFMSUQsCisJTkw4MDIxMV9TVEFfRkxBR19BVVRIT1JJWkVELAorCU5MODAyMTFfU1RBX0ZMQUdfU0hPUlRfUFJFQU1CTEUsCisJTkw4MDIxMV9TVEFfRkxBR19XTUUsCisJTkw4MDIxMV9TVEFfRkxBR19NRlAsCisJTkw4MDIxMV9TVEFfRkxBR19BVVRIRU5USUNBVEVELAorCU5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSLAorCisJLyoga2VlcCBsYXN0ICovCisJX19OTDgwMjExX1NUQV9GTEFHX0FGVEVSX0xBU1QsCisJTkw4MDIxMV9TVEFfRkxBR19NQVggPSBfX05MODAyMTFfU1RBX0ZMQUdfQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogc3RydWN0IG5sODAyMTFfc3RhX2ZsYWdfdXBkYXRlIC0gc3RhdGlvbiBmbGFncyBtYXNrL3NldAorICogQG1hc2s6IG1hc2sgb2Ygc3RhdGlvbiBmbGFncyB0byBzZXQKKyAqIEBzZXQ6IHdoaWNoIHZhbHVlcyB0byBzZXQgdGhlbSB0bworICoKKyAqIEJvdGggbWFzayBhbmQgc2V0IGNvbnRhaW4gYml0cyBhcyBwZXIgJmVudW0gbmw4MDIxMV9zdGFfZmxhZ3MuCisgKi8KK3N0cnVjdCBubDgwMjExX3N0YV9mbGFnX3VwZGF0ZSB7CisJX191MzIgbWFzazsKKwlfX3UzMiBzZXQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKioKKyAqIGVudW0gbmw4MDIxMV9yYXRlX2luZm8gLSBiaXRyYXRlIGluZm9ybWF0aW9uCisgKgorICogVGhlc2UgYXR0cmlidXRlIHR5cGVzIGFyZSB1c2VkIHdpdGggJU5MODAyMTFfU1RBX0lORk9fVFhSQVRFCisgKiB3aGVuIGdldHRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJpdHJhdGUgb2YgYSBzdGF0aW9uLgorICoKKyAqIEBfX05MODAyMTFfUkFURV9JTkZPX0lOVkFMSUQ6IGF0dHJpYnV0ZSBudW1iZXIgMCBpcyByZXNlcnZlZAorICogQE5MODAyMTFfUkFURV9JTkZPX0JJVFJBVEU6IHRvdGFsIGJpdHJhdGUgKHUxNiwgMTAwa2JpdC9zKQorICogQE5MODAyMTFfUkFURV9JTkZPX01DUzogbWNzIGluZGV4IGZvciA4MDIuMTFuICh1OCkKKyAqIEBOTDgwMjExX1JBVEVfSU5GT180MF9NSFpfV0lEVEg6IDQwIE1oeiBkdWFsY2hhbm5lbCBiaXRyYXRlCisgKiBATkw4MDIxMV9SQVRFX0lORk9fU0hPUlRfR0k6IDQwMG5zIGd1YXJkIGludGVydmFsCisgKiBATkw4MDIxMV9SQVRFX0lORk9fTUFYOiBoaWdoZXN0IHJhdGVfaW5mbyBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKKyAqIEBfX05MODAyMTFfUkFURV9JTkZPX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQorICovCitlbnVtIG5sODAyMTFfcmF0ZV9pbmZvIHsKKwlfX05MODAyMTFfUkFURV9JTkZPX0lOVkFMSUQsCisJTkw4MDIxMV9SQVRFX0lORk9fQklUUkFURSwKKwlOTDgwMjExX1JBVEVfSU5GT19NQ1MsCisJTkw4MDIxMV9SQVRFX0lORk9fNDBfTUhaX1dJRFRILAorCU5MODAyMTFfUkFURV9JTkZPX1NIT1JUX0dJLAorCisJLyoga2VlcCBsYXN0ICovCisJX19OTDgwMjExX1JBVEVfSU5GT19BRlRFUl9MQVNULAorCU5MODAyMTFfUkFURV9JTkZPX01BWCA9IF9fTkw4MDIxMV9SQVRFX0lORk9fQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX3N0YV9ic3NfcGFyYW0gLSBCU1MgaW5mb3JtYXRpb24gY29sbGVjdGVkIGJ5IFNUQQorICoKKyAqIFRoZXNlIGF0dHJpYnV0ZSB0eXBlcyBhcmUgdXNlZCB3aXRoICVOTDgwMjExX1NUQV9JTkZPX0JTU19QQVJBTQorICogd2hlbiBnZXR0aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiaXRyYXRlIG9mIGEgc3RhdGlvbi4KKyAqCisgKiBAX19OTDgwMjExX1NUQV9CU1NfUEFSQU1fSU5WQUxJRDogYXR0cmlidXRlIG51bWJlciAwIGlzIHJlc2VydmVkCisgKiBATkw4MDIxMV9TVEFfQlNTX1BBUkFNX0NUU19QUk9UOiB3aGV0aGVyIENUUyBwcm90ZWN0aW9uIGlzIGVuYWJsZWQgKGZsYWcpCisgKiBATkw4MDIxMV9TVEFfQlNTX1BBUkFNX1NIT1JUX1BSRUFNQkxFOiAgd2hldGhlciBzaG9ydCBwcmVhbWJsZSBpcyBlbmFibGVkCisgKgkoZmxhZykKKyAqIEBOTDgwMjExX1NUQV9CU1NfUEFSQU1fU0hPUlRfU0xPVF9USU1FOiAgd2hldGhlciBzaG9ydCBzbG90IHRpbWUgaXMgZW5hYmxlZAorICoJKGZsYWcpCisgKiBATkw4MDIxMV9TVEFfQlNTX1BBUkFNX0RUSU1fUEVSSU9EOiBEVElNIHBlcmlvZCBmb3IgYmVhY29uaW5nICh1OCkKKyAqIEBOTDgwMjExX1NUQV9CU1NfUEFSQU1fQkVBQ09OX0lOVEVSVkFMOiBCZWFjb24gaW50ZXJ2YWwgKHUxNikKKyAqIEBOTDgwMjExX1NUQV9CU1NfUEFSQU1fTUFYOiBoaWdoZXN0IHN0YV9ic3NfcGFyYW0gbnVtYmVyIGN1cnJlbnRseSBkZWZpbmVkCisgKiBAX19OTDgwMjExX1NUQV9CU1NfUEFSQU1fQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCisgKi8KK2VudW0gbmw4MDIxMV9zdGFfYnNzX3BhcmFtIHsKKwlfX05MODAyMTFfU1RBX0JTU19QQVJBTV9JTlZBTElELAorCU5MODAyMTFfU1RBX0JTU19QQVJBTV9DVFNfUFJPVCwKKwlOTDgwMjExX1NUQV9CU1NfUEFSQU1fU0hPUlRfUFJFQU1CTEUsCisJTkw4MDIxMV9TVEFfQlNTX1BBUkFNX1NIT1JUX1NMT1RfVElNRSwKKwlOTDgwMjExX1NUQV9CU1NfUEFSQU1fRFRJTV9QRVJJT0QsCisJTkw4MDIxMV9TVEFfQlNTX1BBUkFNX0JFQUNPTl9JTlRFUlZBTCwKKworCS8qIGtlZXAgbGFzdCAqLworCV9fTkw4MDIxMV9TVEFfQlNTX1BBUkFNX0FGVEVSX0xBU1QsCisJTkw4MDIxMV9TVEFfQlNTX1BBUkFNX01BWCA9IF9fTkw4MDIxMV9TVEFfQlNTX1BBUkFNX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9zdGFfaW5mbyAtIHN0YXRpb24gaW5mb3JtYXRpb24KKyAqCisgKiBUaGVzZSBhdHRyaWJ1dGUgdHlwZXMgYXJlIHVzZWQgd2l0aCAlTkw4MDIxMV9BVFRSX1NUQV9JTkZPCisgKiB3aGVuIGdldHRpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBzdGF0aW9uLgorICoKKyAqIEBfX05MODAyMTFfU1RBX0lORk9fSU5WQUxJRDogYXR0cmlidXRlIG51bWJlciAwIGlzIHJlc2VydmVkCisgKiBATkw4MDIxMV9TVEFfSU5GT19JTkFDVElWRV9USU1FOiB0aW1lIHNpbmNlIGxhc3QgYWN0aXZpdHkgKHUzMiwgbXNlY3MpCisgKiBATkw4MDIxMV9TVEFfSU5GT19SWF9CWVRFUzogdG90YWwgcmVjZWl2ZWQgYnl0ZXMgKHUzMiwgZnJvbSB0aGlzIHN0YXRpb24pCisgKiBATkw4MDIxMV9TVEFfSU5GT19UWF9CWVRFUzogdG90YWwgdHJhbnNtaXR0ZWQgYnl0ZXMgKHUzMiwgdG8gdGhpcyBzdGF0aW9uKQorICogQE5MODAyMTFfU1RBX0lORk9fU0lHTkFMOiBzaWduYWwgc3RyZW5ndGggb2YgbGFzdCByZWNlaXZlZCBQUERVICh1OCwgZEJtKQorICogQE5MODAyMTFfU1RBX0lORk9fVFhfQklUUkFURTogY3VycmVudCB1bmljYXN0IHR4IHJhdGUsIG5lc3RlZCBhdHRyaWJ1dGUKKyAqIAljb250YWluaW5nIGluZm8gYXMgcG9zc2libGUsIHNlZSAmZW51bSBubDgwMjExX3JhdGVfaW5mbworICogQE5MODAyMTFfU1RBX0lORk9fUlhfUEFDS0VUUzogdG90YWwgcmVjZWl2ZWQgcGFja2V0ICh1MzIsIGZyb20gdGhpcyBzdGF0aW9uKQorICogQE5MODAyMTFfU1RBX0lORk9fVFhfUEFDS0VUUzogdG90YWwgdHJhbnNtaXR0ZWQgcGFja2V0cyAodTMyLCB0byB0aGlzCisgKglzdGF0aW9uKQorICogQE5MODAyMTFfU1RBX0lORk9fVFhfUkVUUklFUzogdG90YWwgcmV0cmllcyAodTMyLCB0byB0aGlzIHN0YXRpb24pCisgKiBATkw4MDIxMV9TVEFfSU5GT19UWF9GQUlMRUQ6IHRvdGFsIGZhaWxlZCBwYWNrZXRzICh1MzIsIHRvIHRoaXMgc3RhdGlvbikKKyAqIEBOTDgwMjExX1NUQV9JTkZPX1NJR05BTF9BVkc6IHNpZ25hbCBzdHJlbmd0aCBhdmVyYWdlICh1OCwgZEJtKQorICogQE5MODAyMTFfU1RBX0lORk9fTExJRDogdGhlIHN0YXRpb24ncyBtZXNoIExMSUQKKyAqIEBOTDgwMjExX1NUQV9JTkZPX1BMSUQ6IHRoZSBzdGF0aW9uJ3MgbWVzaCBQTElECisgKiBATkw4MDIxMV9TVEFfSU5GT19QTElOS19TVEFURTogcGVlciBsaW5rIHN0YXRlIGZvciB0aGUgc3RhdGlvbgorICoJKHNlZSAlZW51bSBubDgwMjExX3BsaW5rX3N0YXRlKQorICogQE5MODAyMTFfU1RBX0lORk9fUlhfQklUUkFURTogbGFzdCB1bmljYXN0IGRhdGEgZnJhbWUgcnggcmF0ZSwgbmVzdGVkCisgKglhdHRyaWJ1dGUsIGxpa2UgTkw4MDIxMV9TVEFfSU5GT19UWF9CSVRSQVRFLgorICogQE5MODAyMTFfU1RBX0lORk9fQlNTX1BBUkFNOiBjdXJyZW50IHN0YXRpb24ncyB2aWV3IG9mIEJTUywgbmVzdGVkIGF0dHJpYnV0ZQorICogICAgIGNvbnRhaW5pbmcgaW5mbyBhcyBwb3NzaWJsZSwgc2VlICZlbnVtIG5sODAyMTFfc3RhX2Jzc19wYXJhbQorICogQE5MODAyMTFfU1RBX0lORk9fQ09OTkVDVEVEX1RJTUU6IHRpbWUgc2luY2UgdGhlIHN0YXRpb24gaXMgbGFzdCBjb25uZWN0ZWQKKyAqIEBOTDgwMjExX1NUQV9JTkZPX1NUQV9GTEFHUzogQ29udGFpbnMgYSBzdHJ1Y3Qgbmw4MDIxMV9zdGFfZmxhZ191cGRhdGUuCisgKiBAX19OTDgwMjExX1NUQV9JTkZPX0FGVEVSX0xBU1Q6IGludGVybmFsCisgKiBATkw4MDIxMV9TVEFfSU5GT19NQVg6IGhpZ2hlc3QgcG9zc2libGUgc3RhdGlvbiBpbmZvIGF0dHJpYnV0ZQorICovCitlbnVtIG5sODAyMTFfc3RhX2luZm8geworCV9fTkw4MDIxMV9TVEFfSU5GT19JTlZBTElELAorCU5MODAyMTFfU1RBX0lORk9fSU5BQ1RJVkVfVElNRSwKKwlOTDgwMjExX1NUQV9JTkZPX1JYX0JZVEVTLAorCU5MODAyMTFfU1RBX0lORk9fVFhfQllURVMsCisJTkw4MDIxMV9TVEFfSU5GT19MTElELAorCU5MODAyMTFfU1RBX0lORk9fUExJRCwKKwlOTDgwMjExX1NUQV9JTkZPX1BMSU5LX1NUQVRFLAorCU5MODAyMTFfU1RBX0lORk9fU0lHTkFMLAorCU5MODAyMTFfU1RBX0lORk9fVFhfQklUUkFURSwKKwlOTDgwMjExX1NUQV9JTkZPX1JYX1BBQ0tFVFMsCisJTkw4MDIxMV9TVEFfSU5GT19UWF9QQUNLRVRTLAorCU5MODAyMTFfU1RBX0lORk9fVFhfUkVUUklFUywKKwlOTDgwMjExX1NUQV9JTkZPX1RYX0ZBSUxFRCwKKwlOTDgwMjExX1NUQV9JTkZPX1NJR05BTF9BVkcsCisJTkw4MDIxMV9TVEFfSU5GT19SWF9CSVRSQVRFLAorCU5MODAyMTFfU1RBX0lORk9fQlNTX1BBUkFNLAorCU5MODAyMTFfU1RBX0lORk9fQ09OTkVDVEVEX1RJTUUsCisJTkw4MDIxMV9TVEFfSU5GT19TVEFfRkxBR1MsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlfX05MODAyMTFfU1RBX0lORk9fQUZURVJfTEFTVCwKKwlOTDgwMjExX1NUQV9JTkZPX01BWCA9IF9fTkw4MDIxMV9TVEFfSU5GT19BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfbXBhdGhfZmxhZ3MgLSBubDgwMjExIG1lc2ggcGF0aCBmbGFncworICoKKyAqIEBOTDgwMjExX01QQVRIX0ZMQUdfQUNUSVZFOiB0aGUgbWVzaCBwYXRoIGlzIGFjdGl2ZQorICogQE5MODAyMTFfTVBBVEhfRkxBR19SRVNPTFZJTkc6IHRoZSBtZXNoIHBhdGggZGlzY292ZXJ5IHByb2Nlc3MgaXMgcnVubmluZworICogQE5MODAyMTFfTVBBVEhfRkxBR19TTl9WQUxJRDogdGhlIG1lc2ggcGF0aCBjb250YWlucyBhIHZhbGlkIFNOCisgKiBATkw4MDIxMV9NUEFUSF9GTEFHX0ZJWEVEOiB0aGUgbWVzaCBwYXRoIGhhcyBiZWVuIG1hbnVhbGx5IHNldAorICogQE5MODAyMTFfTVBBVEhfRkxBR19SRVNPTFZFRDogdGhlIG1lc2ggcGF0aCBkaXNjb3ZlcnkgcHJvY2VzcyBzdWNjZWVkZWQKKyAqLworZW51bSBubDgwMjExX21wYXRoX2ZsYWdzIHsKKwlOTDgwMjExX01QQVRIX0ZMQUdfQUNUSVZFID0JMTw8MCwKKwlOTDgwMjExX01QQVRIX0ZMQUdfUkVTT0xWSU5HID0JMTw8MSwKKwlOTDgwMjExX01QQVRIX0ZMQUdfU05fVkFMSUQgPQkxPDwyLAorCU5MODAyMTFfTVBBVEhfRkxBR19GSVhFRCA9CTE8PDMsCisJTkw4MDIxMV9NUEFUSF9GTEFHX1JFU09MVkVEID0JMTw8NCwKK307CisKKy8qKgorICogZW51bSBubDgwMjExX21wYXRoX2luZm8gLSBtZXNoIHBhdGggaW5mb3JtYXRpb24KKyAqCisgKiBUaGVzZSBhdHRyaWJ1dGUgdHlwZXMgYXJlIHVzZWQgd2l0aCAlTkw4MDIxMV9BVFRSX01QQVRIX0lORk8gd2hlbiBnZXR0aW5nCisgKiBpbmZvcm1hdGlvbiBhYm91dCBhIG1lc2ggcGF0aC4KKyAqCisgKiBAX19OTDgwMjExX01QQVRIX0lORk9fSU5WQUxJRDogYXR0cmlidXRlIG51bWJlciAwIGlzIHJlc2VydmVkCisgKiBATkw4MDIxMV9NUEFUSF9JTkZPX0ZSQU1FX1FMRU46IG51bWJlciBvZiBxdWV1ZWQgZnJhbWVzIGZvciB0aGlzIGRlc3RpbmF0aW9uCisgKiBATkw4MDIxMV9NUEFUSF9JTkZPX1NOOiBkZXN0aW5hdGlvbiBzZXF1ZW5jZSBudW1iZXIKKyAqIEBOTDgwMjExX01QQVRIX0lORk9fTUVUUklDOiBtZXRyaWMgKGNvc3QpIG9mIHRoaXMgbWVzaCBwYXRoCisgKiBATkw4MDIxMV9NUEFUSF9JTkZPX0VYUFRJTUU6IGV4cGlyYXRpb24gdGltZSBmb3IgdGhlIHBhdGgsIGluIG1zZWMgZnJvbSBub3cKKyAqIEBOTDgwMjExX01QQVRIX0lORk9fRkxBR1M6IG1lc2ggcGF0aCBmbGFncywgZW51bWVyYXRlZCBpbgorICogCSZlbnVtIG5sODAyMTFfbXBhdGhfZmxhZ3M7CisgKiBATkw4MDIxMV9NUEFUSF9JTkZPX0RJU0NPVkVSWV9USU1FT1VUOiB0b3RhbCBwYXRoIGRpc2NvdmVyeSB0aW1lb3V0LCBpbiBtc2VjCisgKiBATkw4MDIxMV9NUEFUSF9JTkZPX0RJU0NPVkVSWV9SRVRSSUVTOiBtZXNoIHBhdGggZGlzY292ZXJ5IHJldHJpZXMKKyAqIEBOTDgwMjExX01QQVRIX0lORk9fTUFYOiBoaWdoZXN0IG1lc2ggcGF0aCBpbmZvcm1hdGlvbiBhdHRyaWJ1dGUgbnVtYmVyCisgKgljdXJyZW50bHkgZGVmaW5kCisgKiBAX19OTDgwMjExX01QQVRIX0lORk9fQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCisgKi8KK2VudW0gbmw4MDIxMV9tcGF0aF9pbmZvIHsKKwlfX05MODAyMTFfTVBBVEhfSU5GT19JTlZBTElELAorCU5MODAyMTFfTVBBVEhfSU5GT19GUkFNRV9RTEVOLAorCU5MODAyMTFfTVBBVEhfSU5GT19TTiwKKwlOTDgwMjExX01QQVRIX0lORk9fTUVUUklDLAorCU5MODAyMTFfTVBBVEhfSU5GT19FWFBUSU1FLAorCU5MODAyMTFfTVBBVEhfSU5GT19GTEFHUywKKwlOTDgwMjExX01QQVRIX0lORk9fRElTQ09WRVJZX1RJTUVPVVQsCisJTkw4MDIxMV9NUEFUSF9JTkZPX0RJU0NPVkVSWV9SRVRSSUVTLAorCisJLyoga2VlcCBsYXN0ICovCisJX19OTDgwMjExX01QQVRIX0lORk9fQUZURVJfTEFTVCwKKwlOTDgwMjExX01QQVRIX0lORk9fTUFYID0gX19OTDgwMjExX01QQVRIX0lORk9fQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX2JhbmRfYXR0ciAtIGJhbmQgYXR0cmlidXRlcworICogQF9fTkw4MDIxMV9CQU5EX0FUVFJfSU5WQUxJRDogYXR0cmlidXRlIG51bWJlciAwIGlzIHJlc2VydmVkCisgKiBATkw4MDIxMV9CQU5EX0FUVFJfRlJFUVM6IHN1cHBvcnRlZCBmcmVxdWVuY2llcyBpbiB0aGlzIGJhbmQsCisgKglhbiBhcnJheSBvZiBuZXN0ZWQgZnJlcXVlbmN5IGF0dHJpYnV0ZXMKKyAqIEBOTDgwMjExX0JBTkRfQVRUUl9SQVRFUzogc3VwcG9ydGVkIGJpdHJhdGVzIGluIHRoaXMgYmFuZCwKKyAqCWFuIGFycmF5IG9mIG5lc3RlZCBiaXRyYXRlIGF0dHJpYnV0ZXMKKyAqIEBOTDgwMjExX0JBTkRfQVRUUl9IVF9NQ1NfU0VUOiAxNi1ieXRlIGF0dHJpYnV0ZSBjb250YWluaW5nIHRoZSBNQ1Mgc2V0IGFzCisgKglkZWZpbmVkIGluIDgwMi4xMW4KKyAqIEBOTDgwMjExX0JBTkRfQVRUUl9IVF9DQVBBOiBIVCBjYXBhYmlsaXRpZXMsIGFzIGluIHRoZSBIVCBpbmZvcm1hdGlvbiBJRQorICogQE5MODAyMTFfQkFORF9BVFRSX0hUX0FNUERVX0ZBQ1RPUjogQS1NUERVIGZhY3RvciwgYXMgaW4gMTFuCisgKiBATkw4MDIxMV9CQU5EX0FUVFJfSFRfQU1QRFVfREVOU0lUWTogQS1NUERVIGRlbnNpdHksIGFzIGluIDExbgorICogQE5MODAyMTFfQkFORF9BVFRSX01BWDogaGlnaGVzdCBiYW5kIGF0dHJpYnV0ZSBjdXJyZW50bHkgZGVmaW5lZAorICogQF9fTkw4MDIxMV9CQU5EX0FUVFJfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCisgKi8KK2VudW0gbmw4MDIxMV9iYW5kX2F0dHIgeworCV9fTkw4MDIxMV9CQU5EX0FUVFJfSU5WQUxJRCwKKwlOTDgwMjExX0JBTkRfQVRUUl9GUkVRUywKKwlOTDgwMjExX0JBTkRfQVRUUl9SQVRFUywKKworCU5MODAyMTFfQkFORF9BVFRSX0hUX01DU19TRVQsCisJTkw4MDIxMV9CQU5EX0FUVFJfSFRfQ0FQQSwKKwlOTDgwMjExX0JBTkRfQVRUUl9IVF9BTVBEVV9GQUNUT1IsCisJTkw4MDIxMV9CQU5EX0FUVFJfSFRfQU1QRFVfREVOU0lUWSwKKworCS8qIGtlZXAgbGFzdCAqLworCV9fTkw4MDIxMV9CQU5EX0FUVFJfQUZURVJfTEFTVCwKKwlOTDgwMjExX0JBTkRfQVRUUl9NQVggPSBfX05MODAyMTFfQkFORF9BVFRSX0FGVEVSX0xBU1QgLSAxCit9OworCisjZGVmaW5lIE5MODAyMTFfQkFORF9BVFRSX0hUX0NBUEEgTkw4MDIxMV9CQU5EX0FUVFJfSFRfQ0FQQQorCisvKioKKyAqIGVudW0gbmw4MDIxMV9mcmVxdWVuY3lfYXR0ciAtIGZyZXF1ZW5jeSBhdHRyaWJ1dGVzCisgKiBAX19OTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0lOVkFMSUQ6IGF0dHJpYnV0ZSBudW1iZXIgMCBpcyByZXNlcnZlZAorICogQE5MODAyMTFfRlJFUVVFTkNZX0FUVFJfRlJFUTogRnJlcXVlbmN5IGluIE1IegorICogQE5MODAyMTFfRlJFUVVFTkNZX0FUVFJfRElTQUJMRUQ6IENoYW5uZWwgaXMgZGlzYWJsZWQgaW4gY3VycmVudAorICoJcmVndWxhdG9yeSBkb21haW4uCisgKiBATkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9QQVNTSVZFX1NDQU46IE9ubHkgcGFzc2l2ZSBzY2FubmluZyBpcworICoJcGVybWl0dGVkIG9uIHRoaXMgY2hhbm5lbCBpbiBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluLgorICogQE5MODAyMTFfRlJFUVVFTkNZX0FUVFJfTk9fSUJTUzogSUJTUyBuZXR3b3JrcyBhcmUgbm90IHBlcm1pdHRlZAorICoJb24gdGhpcyBjaGFubmVsIGluIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4uCisgKiBATkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9SQURBUjogUmFkYXIgZGV0ZWN0aW9uIGlzIG1hbmRhdG9yeQorICoJb24gdGhpcyBjaGFubmVsIGluIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4uCisgKiBATkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9NQVhfVFhfUE9XRVI6IE1heGltdW0gdHJhbnNtaXNzaW9uIHBvd2VyIGluIG1CbQorICoJKDEwMCAqIGRCbSkuCisgKiBATkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9NQVg6IGhpZ2hlc3QgZnJlcXVlbmN5IGF0dHJpYnV0ZSBudW1iZXIKKyAqCWN1cnJlbnRseSBkZWZpbmVkCisgKiBAX19OTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQorICovCitlbnVtIG5sODAyMTFfZnJlcXVlbmN5X2F0dHIgeworCV9fTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9JTlZBTElELAorCU5MODAyMTFfRlJFUVVFTkNZX0FUVFJfRlJFUSwKKwlOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0RJU0FCTEVELAorCU5MODAyMTFfRlJFUVVFTkNZX0FUVFJfUEFTU0lWRV9TQ0FOLAorCU5MODAyMTFfRlJFUVVFTkNZX0FUVFJfTk9fSUJTUywKKwlOTDgwMjExX0ZSRVFVRU5DWV9BVFRSX1JBREFSLAorCU5MODAyMTFfRlJFUVVFTkNZX0FUVFJfTUFYX1RYX1BPV0VSLAorCisJLyoga2VlcCBsYXN0ICovCisJX19OTDgwMjExX0ZSRVFVRU5DWV9BVFRSX0FGVEVSX0xBU1QsCisJTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9NQVggPSBfX05MODAyMTFfRlJFUVVFTkNZX0FUVFJfQUZURVJfTEFTVCAtIDEKK307CisKKyNkZWZpbmUgTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9NQVhfVFhfUE9XRVIgTkw4MDIxMV9GUkVRVUVOQ1lfQVRUUl9NQVhfVFhfUE9XRVIKKworLyoqCisgKiBlbnVtIG5sODAyMTFfYml0cmF0ZV9hdHRyIC0gYml0cmF0ZSBhdHRyaWJ1dGVzCisgKiBAX19OTDgwMjExX0JJVFJBVEVfQVRUUl9JTlZBTElEOiBhdHRyaWJ1dGUgbnVtYmVyIDAgaXMgcmVzZXJ2ZWQKKyAqIEBOTDgwMjExX0JJVFJBVEVfQVRUUl9SQVRFOiBCaXRyYXRlIGluIHVuaXRzIG9mIDEwMCBrYnBzCisgKiBATkw4MDIxMV9CSVRSQVRFX0FUVFJfMkdIWl9TSE9SVFBSRUFNQkxFOiBTaG9ydCBwcmVhbWJsZSBzdXBwb3J0ZWQKKyAqCWluIDIuNCBHSHogYmFuZC4KKyAqIEBOTDgwMjExX0JJVFJBVEVfQVRUUl9NQVg6IGhpZ2hlc3QgYml0cmF0ZSBhdHRyaWJ1dGUgbnVtYmVyCisgKgljdXJyZW50bHkgZGVmaW5lZAorICogQF9fTkw4MDIxMV9CSVRSQVRFX0FUVFJfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCisgKi8KK2VudW0gbmw4MDIxMV9iaXRyYXRlX2F0dHIgeworCV9fTkw4MDIxMV9CSVRSQVRFX0FUVFJfSU5WQUxJRCwKKwlOTDgwMjExX0JJVFJBVEVfQVRUUl9SQVRFLAorCU5MODAyMTFfQklUUkFURV9BVFRSXzJHSFpfU0hPUlRQUkVBTUJMRSwKKworCS8qIGtlZXAgbGFzdCAqLworCV9fTkw4MDIxMV9CSVRSQVRFX0FUVFJfQUZURVJfTEFTVCwKKwlOTDgwMjExX0JJVFJBVEVfQVRUUl9NQVggPSBfX05MODAyMTFfQklUUkFURV9BVFRSX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9pbml0aWF0b3IgLSBJbmRpY2F0ZXMgdGhlIGluaXRpYXRvciBvZiBhIHJlZyBkb21haW4gcmVxdWVzdAorICogQE5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1JFOiBDb3JlIHF1ZXJpZWQgQ1JEQSBmb3IgYSBkeW5hbWljIHdvcmxkCisgKiAJcmVndWxhdG9yeSBkb21haW4uCisgKiBATkw4MDIxMV9SRUdET01fU0VUX0JZX1VTRVI6IFVzZXIgYXNrZWQgdGhlIHdpcmVsZXNzIGNvcmUgdG8gc2V0IHRoZQorICogCXJlZ3VsYXRvcnkgZG9tYWluLgorICogQE5MODAyMTFfUkVHRE9NX1NFVF9CWV9EUklWRVI6IGEgd2lyZWxlc3MgZHJpdmVycyBoYXMgaGludGVkIHRvIHRoZQorICogCXdpcmVsZXNzIGNvcmUgaXQgdGhpbmtzIGl0cyBrbm93cyB0aGUgcmVndWxhdG9yeSBkb21haW4gd2Ugc2hvdWxkIGJlIGluLgorICogQE5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1VOVFJZX0lFOiB0aGUgd2lyZWxlc3MgY29yZSBoYXMgcmVjZWl2ZWQgYW4KKyAqIAk4MDIuMTEgY291bnRyeSBpbmZvcm1hdGlvbiBlbGVtZW50IHdpdGggcmVndWxhdG9yeSBpbmZvcm1hdGlvbiBpdAorICogCXRoaW5rcyB3ZSBzaG91bGQgY29uc2lkZXIuIGNmZzgwMjExIG9ubHkgcHJvY2Vzc2VzIHRoZSBjb3VudHJ5CisgKgljb2RlIGZyb20gdGhlIElFLCBhbmQgcmVsaWVzIG9uIHRoZSByZWd1bGF0b3J5IGRvbWFpbiBpbmZvcm1hdGlvbgorICoJc3RydWN0dXJlIHBhc3NlZCBieSB1c2Vyc3BhY2UgKENSREEpIGZyb20gb3VyIHdpcmVsZXNzLXJlZ2RiLgorICoJSWYgYSBjaGFubmVsIGlzIGVuYWJsZWQgYnV0IHRoZSBjb3VudHJ5IGNvZGUgaW5kaWNhdGVzIGl0IHNob3VsZAorICoJYmUgZGlzYWJsZWQgd2UgZGlzYWJsZSB0aGUgY2hhbm5lbCBhbmQgcmUtZW5hYmxlIGl0IHVwb24gZGlzYXNzb2NpYXRpb24uCisgKi8KK2VudW0gbmw4MDIxMV9yZWdfaW5pdGlhdG9yIHsKKwlOTDgwMjExX1JFR0RPTV9TRVRfQllfQ09SRSwKKwlOTDgwMjExX1JFR0RPTV9TRVRfQllfVVNFUiwKKwlOTDgwMjExX1JFR0RPTV9TRVRfQllfRFJJVkVSLAorCU5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1VOVFJZX0lFLAorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfcmVnX3R5cGUgLSBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgcmVndWxhdG9yeSBkb21haW4KKyAqIEBOTDgwMjExX1JFR0RPTV9UWVBFX0NPVU5UUlk6IHRoZSByZWd1bGF0b3J5IGRvbWFpbiBzZXQgaXMgb25lIHRoYXQgcGVydGFpbnMKKyAqCXRvIGEgc3BlY2lmaWMgY291bnRyeS4gV2hlbiB0aGlzIGlzIHNldCB5b3UgY2FuIGNvdW50IG9uIHRoZQorICoJSVNPIC8gSUVDIDMxNjYgYWxwaGEyIGNvdW50cnkgY29kZSBiZWluZyB2YWxpZC4KKyAqIEBOTDgwMjExX1JFR0RPTV9UWVBFX1dPUkxEOiB0aGUgcmVndWxhdG9yeSBzZXQgZG9tYWluIGlzIHRoZSB3b3JsZCByZWd1bGF0b3J5CisgKiAJZG9tYWluLgorICogQE5MODAyMTFfUkVHRE9NX1RZUEVfQ1VTVE9NX1dPUkxEOiB0aGUgcmVndWxhdG9yeSBkb21haW4gc2V0IGlzIGEgY3VzdG9tCisgKiAJZHJpdmVyIHNwZWNpZmljIHdvcmxkIHJlZ3VsYXRvcnkgZG9tYWluLiBUaGVzZSBkbyBub3QgYXBwbHkgc3lzdGVtLXdpZGUKKyAqIAlhbmQgYXJlIG9ubHkgYXBwbGljYWJsZSB0byB0aGUgaW5kaXZpZHVhbCBkZXZpY2VzIHdoaWNoIGhhdmUgcmVxdWVzdGVkCisgKiAJdGhlbSB0byBiZSBhcHBsaWVkLgorICogQE5MODAyMTFfUkVHRE9NX1RZUEVfSU5URVJTRUNUSU9OOiB0aGUgcmVndWxhdG9yeSBkb21haW4gc2V0IGlzIHRoZSBwcm9kdWN0CisgKglvZiBhbiBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0d28gcmVndWxhdG9yeSBkb21haW5zIC0tIHRoZSBwcmV2aW91c2x5CisgKglzZXQgcmVndWxhdG9yeSBkb21haW4gb24gdGhlIHN5c3RlbSBhbmQgdGhlIGxhc3QgYWNjZXB0ZWQgcmVndWxhdG9yeQorICoJZG9tYWluIHJlcXVlc3QgdG8gYmUgcHJvY2Vzc2VkLgorICovCitlbnVtIG5sODAyMTFfcmVnX3R5cGUgeworCU5MODAyMTFfUkVHRE9NX1RZUEVfQ09VTlRSWSwKKwlOTDgwMjExX1JFR0RPTV9UWVBFX1dPUkxELAorCU5MODAyMTFfUkVHRE9NX1RZUEVfQ1VTVE9NX1dPUkxELAorCU5MODAyMTFfUkVHRE9NX1RZUEVfSU5URVJTRUNUSU9OLAorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfcmVnX3J1bGVfYXR0ciAtIHJlZ3VsYXRvcnkgcnVsZSBhdHRyaWJ1dGVzCisgKiBAX19OTDgwMjExX1JFR19SVUxFX0FUVFJfSU5WQUxJRDogYXR0cmlidXRlIG51bWJlciAwIGlzIHJlc2VydmVkCisgKiBATkw4MDIxMV9BVFRSX1JFR19SVUxFX0ZMQUdTOiBhIHNldCBvZiBmbGFncyB3aGljaCBzcGVjaWZ5IGFkZGl0aW9uYWwKKyAqIAljb25zaWRlcmF0aW9ucyBmb3IgYSBnaXZlbiBmcmVxdWVuY3kgcmFuZ2UuIFRoZXNlIGFyZSB0aGUKKyAqIAkmZW51bSBubDgwMjExX3JlZ19ydWxlX2ZsYWdzLgorICogQE5MODAyMTFfQVRUUl9GUkVRX1JBTkdFX1NUQVJUOiBzdGFydGluZyBmcmVxdWVuY3J5IGZvciB0aGUgcmVndWxhdG9yeQorICogCXJ1bGUgaW4gS0h6LiBUaGlzIGlzIG5vdCBhIGNlbnRlciBvZiBmcmVxdWVuY3kgYnV0IGFuIGFjdHVhbCByZWd1bGF0b3J5CisgKiAJYmFuZCBlZGdlLgorICogQE5MODAyMTFfQVRUUl9GUkVRX1JBTkdFX0VORDogZW5kaW5nIGZyZXF1ZW5jeSBmb3IgdGhlIHJlZ3VsYXRvcnkgcnVsZQorICogCWluIEtIei4gVGhpcyBpcyBub3QgYSBjZW50ZXIgYSBmcmVxdWVuY3kgYnV0IGFuIGFjdHVhbCByZWd1bGF0b3J5CisgKiAJYmFuZCBlZGdlLgorICogQE5MODAyMTFfQVRUUl9GUkVRX1JBTkdFX01BWF9CVzogbWF4aW11bSBhbGxvd2VkIGJhbmR3aWR0aCBmb3IgdGhpcworICogCWZyZXF1ZW5jeSByYW5nZSwgaW4gS0h6LgorICogQE5MODAyMTFfQVRUUl9QT1dFUl9SVUxFX01BWF9BTlRfR0FJTjogdGhlIG1heGltdW0gYWxsb3dlZCBhbnRlbm5hIGdhaW4KKyAqIAlmb3IgYSBnaXZlbiBmcmVxdWVuY3kgcmFuZ2UuIFRoZSB2YWx1ZSBpcyBpbiBtQmkgKDEwMCAqIGRCaSkuCisgKiAJSWYgeW91IGRvbid0IGhhdmUgb25lIHRoZW4gZG9uJ3Qgc2VuZCB0aGlzLgorICogQE5MODAyMTFfQVRUUl9QT1dFUl9SVUxFX01BWF9FSVJQOiB0aGUgbWF4aW11bSBhbGxvd2VkIEVJUlAgZm9yCisgKiAJYSBnaXZlbiBmcmVxdWVuY3kgcmFuZ2UuIFRoZSB2YWx1ZSBpcyBpbiBtQm0gKDEwMCAqIGRCbSkuCisgKiBATkw4MDIxMV9SRUdfUlVMRV9BVFRSX01BWDogaGlnaGVzdCByZWd1bGF0b3J5IHJ1bGUgYXR0cmlidXRlIG51bWJlcgorICoJY3VycmVudGx5IGRlZmluZWQKKyAqIEBfX05MODAyMTFfUkVHX1JVTEVfQVRUUl9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqLworZW51bSBubDgwMjExX3JlZ19ydWxlX2F0dHIgeworCV9fTkw4MDIxMV9SRUdfUlVMRV9BVFRSX0lOVkFMSUQsCisJTkw4MDIxMV9BVFRSX1JFR19SVUxFX0ZMQUdTLAorCisJTkw4MDIxMV9BVFRSX0ZSRVFfUkFOR0VfU1RBUlQsCisJTkw4MDIxMV9BVFRSX0ZSRVFfUkFOR0VfRU5ELAorCU5MODAyMTFfQVRUUl9GUkVRX1JBTkdFX01BWF9CVywKKworCU5MODAyMTFfQVRUUl9QT1dFUl9SVUxFX01BWF9BTlRfR0FJTiwKKwlOTDgwMjExX0FUVFJfUE9XRVJfUlVMRV9NQVhfRUlSUCwKKworCS8qIGtlZXAgbGFzdCAqLworCV9fTkw4MDIxMV9SRUdfUlVMRV9BVFRSX0FGVEVSX0xBU1QsCisJTkw4MDIxMV9SRUdfUlVMRV9BVFRSX01BWCA9IF9fTkw4MDIxMV9SRUdfUlVMRV9BVFRSX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9zY2hlZF9zY2FuX21hdGNoX2F0dHIgLSBzY2hlZHVsZWQgc2NhbiBtYXRjaCBhdHRyaWJ1dGVzCisgKiBAX19OTDgwMjExX1NDSEVEX1NDQU5fTUFUQ0hfQVRUUl9JTlZBTElEOiBhdHRyaWJ1dGUgbnVtYmVyIDAgaXMgcmVzZXJ2ZWQKKyAqIEBOTDgwMjExX1NDSEVEX1NDQU5fTUFUQ0hfQVRUUl9TU0lEOiBTU0lEIHRvIGJlIHVzZWQgZm9yIG1hdGNoaW5nLAorICogb25seSByZXBvcnQgQlNTIHdpdGggbWF0Y2hpbmcgU1NJRC4KKyAqIEBOTDgwMjExX1NDSEVEX1NDQU5fTUFUQ0hfQVRUUl9NQVg6IGhpZ2hlc3Qgc2NoZWR1bGVkIHNjYW4gZmlsdGVyCisgKglhdHRyaWJ1dGUgbnVtYmVyIGN1cnJlbnRseSBkZWZpbmVkCisgKiBAX19OTDgwMjExX1NDSEVEX1NDQU5fTUFUQ0hfQVRUUl9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqLworZW51bSBubDgwMjExX3NjaGVkX3NjYW5fbWF0Y2hfYXR0ciB7CisJX19OTDgwMjExX1NDSEVEX1NDQU5fTUFUQ0hfQVRUUl9JTlZBTElELAorCisJTkw4MDIxMV9BVFRSX1NDSEVEX1NDQU5fTUFUQ0hfU1NJRCwKKworCS8qIGtlZXAgbGFzdCAqLworCV9fTkw4MDIxMV9TQ0hFRF9TQ0FOX01BVENIX0FUVFJfQUZURVJfTEFTVCwKKwlOTDgwMjExX1NDSEVEX1NDQU5fTUFUQ0hfQVRUUl9NQVggPQorCQlfX05MODAyMTFfU0NIRURfU0NBTl9NQVRDSF9BVFRSX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9yZWdfcnVsZV9mbGFncyAtIHJlZ3VsYXRvcnkgcnVsZSBmbGFncworICoKKyAqIEBOTDgwMjExX1JSRl9OT19PRkRNOiBPRkRNIG1vZHVsYXRpb24gbm90IGFsbG93ZWQKKyAqIEBOTDgwMjExX1JSRl9OT19DQ0s6IENDSyBtb2R1bGF0aW9uIG5vdCBhbGxvd2VkCisgKiBATkw4MDIxMV9SUkZfTk9fSU5ET09SOiBpbmRvb3Igb3BlcmF0aW9uIG5vdCBhbGxvd2VkCisgKiBATkw4MDIxMV9SUkZfTk9fT1VURE9PUjogb3V0ZG9vciBvcGVyYXRpb24gbm90IGFsbG93ZWQKKyAqIEBOTDgwMjExX1JSRl9ERlM6IERGUyBzdXBwb3J0IGlzIHJlcXVpcmVkIHRvIGJlIHVzZWQKKyAqIEBOTDgwMjExX1JSRl9QVFBfT05MWTogdGhpcyBpcyBvbmx5IGZvciBQb2ludCBUbyBQb2ludCBsaW5rcworICogQE5MODAyMTFfUlJGX1BUTVBfT05MWTogdGhpcyBpcyBvbmx5IGZvciBQb2ludCBUbyBNdWx0aSBQb2ludCBsaW5rcworICogQE5MODAyMTFfUlJGX1BBU1NJVkVfU0NBTjogcGFzc2l2ZSBzY2FuIGlzIHJlcXVpcmVkCisgKiBATkw4MDIxMV9SUkZfTk9fSUJTUzogbm8gSUJTUyBpcyBhbGxvd2VkCisgKi8KK2VudW0gbmw4MDIxMV9yZWdfcnVsZV9mbGFncyB7CisJTkw4MDIxMV9SUkZfTk9fT0ZETQkJPSAxPDwwLAorCU5MODAyMTFfUlJGX05PX0NDSwkJPSAxPDwxLAorCU5MODAyMTFfUlJGX05PX0lORE9PUgkJPSAxPDwyLAorCU5MODAyMTFfUlJGX05PX09VVERPT1IJCT0gMTw8MywKKwlOTDgwMjExX1JSRl9ERlMJCQk9IDE8PDQsCisJTkw4MDIxMV9SUkZfUFRQX09OTFkJCT0gMTw8NSwKKwlOTDgwMjExX1JSRl9QVE1QX09OTFkJCT0gMTw8NiwKKwlOTDgwMjExX1JSRl9QQVNTSVZFX1NDQU4JPSAxPDw3LAorCU5MODAyMTFfUlJGX05PX0lCU1MJCT0gMTw8OCwKK307CisKKy8qKgorICogZW51bSBubDgwMjExX3N1cnZleV9pbmZvIC0gc3VydmV5IGluZm9ybWF0aW9uCisgKgorICogVGhlc2UgYXR0cmlidXRlIHR5cGVzIGFyZSB1c2VkIHdpdGggJU5MODAyMTFfQVRUUl9TVVJWRVlfSU5GTworICogd2hlbiBnZXR0aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgc3VydmV5LgorICoKKyAqIEBfX05MODAyMTFfU1VSVkVZX0lORk9fSU5WQUxJRDogYXR0cmlidXRlIG51bWJlciAwIGlzIHJlc2VydmVkCisgKiBATkw4MDIxMV9TVVJWRVlfSU5GT19GUkVRVUVOQ1k6IGNlbnRlciBmcmVxdWVuY3kgb2YgY2hhbm5lbAorICogQE5MODAyMTFfU1VSVkVZX0lORk9fTk9JU0U6IG5vaXNlIGxldmVsIG9mIGNoYW5uZWwgKHU4LCBkQm0pCisgKiBATkw4MDIxMV9TVVJWRVlfSU5GT19JTl9VU0U6IGNoYW5uZWwgaXMgY3VycmVudGx5IGJlaW5nIHVzZWQKKyAqIEBOTDgwMjExX1NVUlZFWV9JTkZPX0NIQU5ORUxfVElNRTogYW1vdW50IG9mIHRpbWUgKGluIG1zKSB0aGF0IHRoZSByYWRpbworICoJc3BlbnQgb24gdGhpcyBjaGFubmVsCisgKiBATkw4MDIxMV9TVVJWRVlfSU5GT19DSEFOTkVMX1RJTUVfQlVTWTogYW1vdW50IG9mIHRoZSB0aW1lIHRoZSBwcmltYXJ5CisgKgljaGFubmVsIHdhcyBzZW5zZWQgYnVzeSAoZWl0aGVyIGR1ZSB0byBhY3Rpdml0eSBvciBlbmVyZ3kgZGV0ZWN0KQorICogQE5MODAyMTFfU1VSVkVZX0lORk9fQ0hBTk5FTF9USU1FX0VYVF9CVVNZOiBhbW91bnQgb2YgdGltZSB0aGUgZXh0ZW5zaW9uCisgKgljaGFubmVsIHdhcyBzZW5zZWQgYnVzeQorICogQE5MODAyMTFfU1VSVkVZX0lORk9fQ0hBTk5FTF9USU1FX1JYOiBhbW91bnQgb2YgdGltZSB0aGUgcmFkaW8gc3BlbnQKKyAqCXJlY2VpdmluZyBkYXRhCisgKiBATkw4MDIxMV9TVVJWRVlfSU5GT19DSEFOTkVMX1RJTUVfVFg6IGFtb3VudCBvZiB0aW1lIHRoZSByYWRpbyBzcGVudAorICoJdHJhbnNtaXR0aW5nIGRhdGEKKyAqIEBOTDgwMjExX1NVUlZFWV9JTkZPX01BWDogaGlnaGVzdCBzdXJ2ZXkgaW5mbyBhdHRyaWJ1dGUgbnVtYmVyCisgKgljdXJyZW50bHkgZGVmaW5lZAorICogQF9fTkw4MDIxMV9TVVJWRVlfSU5GT19BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqLworZW51bSBubDgwMjExX3N1cnZleV9pbmZvIHsKKwlfX05MODAyMTFfU1VSVkVZX0lORk9fSU5WQUxJRCwKKwlOTDgwMjExX1NVUlZFWV9JTkZPX0ZSRVFVRU5DWSwKKwlOTDgwMjExX1NVUlZFWV9JTkZPX05PSVNFLAorCU5MODAyMTFfU1VSVkVZX0lORk9fSU5fVVNFLAorCU5MODAyMTFfU1VSVkVZX0lORk9fQ0hBTk5FTF9USU1FLAorCU5MODAyMTFfU1VSVkVZX0lORk9fQ0hBTk5FTF9USU1FX0JVU1ksCisJTkw4MDIxMV9TVVJWRVlfSU5GT19DSEFOTkVMX1RJTUVfRVhUX0JVU1ksCisJTkw4MDIxMV9TVVJWRVlfSU5GT19DSEFOTkVMX1RJTUVfUlgsCisJTkw4MDIxMV9TVVJWRVlfSU5GT19DSEFOTkVMX1RJTUVfVFgsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlfX05MODAyMTFfU1VSVkVZX0lORk9fQUZURVJfTEFTVCwKKwlOTDgwMjExX1NVUlZFWV9JTkZPX01BWCA9IF9fTkw4MDIxMV9TVVJWRVlfSU5GT19BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfbW50cl9mbGFncyAtIG1vbml0b3IgY29uZmlndXJhdGlvbiBmbGFncworICoKKyAqIE1vbml0b3IgY29uZmlndXJhdGlvbiBmbGFncy4KKyAqCisgKiBAX19OTDgwMjExX01OVFJfRkxBR19JTlZBTElEOiByZXNlcnZlZAorICoKKyAqIEBOTDgwMjExX01OVFJfRkxBR19GQ1NGQUlMOiBwYXNzIGZyYW1lcyB3aXRoIGJhZCBGQ1MKKyAqIEBOTDgwMjExX01OVFJfRkxBR19QTENQRkFJTDogcGFzcyBmcmFtZXMgd2l0aCBiYWQgUExDUAorICogQE5MODAyMTFfTU5UUl9GTEFHX0NPTlRST0w6IHBhc3MgY29udHJvbCBmcmFtZXMKKyAqIEBOTDgwMjExX01OVFJfRkxBR19PVEhFUl9CU1M6IGRpc2FibGUgQlNTSUQgZmlsdGVyaW5nCisgKiBATkw4MDIxMV9NTlRSX0ZMQUdfQ09PS19GUkFNRVM6IHJlcG9ydCBmcmFtZXMgYWZ0ZXIgcHJvY2Vzc2luZy4KKyAqCW92ZXJyaWRlcyBhbGwgb3RoZXIgZmxhZ3MuCisgKgorICogQF9fTkw4MDIxMV9NTlRSX0ZMQUdfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCisgKiBATkw4MDIxMV9NTlRSX0ZMQUdfTUFYOiBoaWdoZXN0IHBvc3NpYmxlIG1vbml0b3IgZmxhZworICovCitlbnVtIG5sODAyMTFfbW50cl9mbGFncyB7CisJX19OTDgwMjExX01OVFJfRkxBR19JTlZBTElELAorCU5MODAyMTFfTU5UUl9GTEFHX0ZDU0ZBSUwsCisJTkw4MDIxMV9NTlRSX0ZMQUdfUExDUEZBSUwsCisJTkw4MDIxMV9NTlRSX0ZMQUdfQ09OVFJPTCwKKwlOTDgwMjExX01OVFJfRkxBR19PVEhFUl9CU1MsCisJTkw4MDIxMV9NTlRSX0ZMQUdfQ09PS19GUkFNRVMsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlfX05MODAyMTFfTU5UUl9GTEFHX0FGVEVSX0xBU1QsCisJTkw4MDIxMV9NTlRSX0ZMQUdfTUFYID0gX19OTDgwMjExX01OVFJfRkxBR19BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfbWVzaGNvbmZfcGFyYW1zIC0gbWVzaCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAqCisgKiBNZXNoIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4gVGhlc2UgY2FuIGJlIGNoYW5nZWQgd2hpbGUgdGhlIG1lc2ggaXMKKyAqIGFjdGl2ZS4KKyAqCisgKiBAX19OTDgwMjExX01FU0hDT05GX0lOVkFMSUQ6IGludGVybmFsIHVzZQorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX1JFVFJZX1RJTUVPVVQ6IHNwZWNpZmllcyB0aGUgaW5pdGlhbCByZXRyeSB0aW1lb3V0IGluCisgKiBtaWxsaXNlY29uZCB1bml0cywgdXNlZCBieSB0aGUgUGVlciBMaW5rIE9wZW4gbWVzc2FnZQorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX0NPTkZJUk1fVElNRU9VVDogc3BlY2lmaWVzIHRoZSBpbml0aWFsIGNvbmZpcm0gdGltZW91dCwgaW4KKyAqIG1pbGxpc2Vjb25kIHVuaXRzLCB1c2VkIGJ5IHRoZSBwZWVyIGxpbmsgbWFuYWdlbWVudCB0byBjbG9zZSBhIHBlZXIgbGluaworICoKKyAqIEBOTDgwMjExX01FU0hDT05GX0hPTERJTkdfVElNRU9VVDogc3BlY2lmaWVzIHRoZSBob2xkaW5nIHRpbWVvdXQsIGluCisgKiBtaWxsaXNlY29uZCB1bml0cworICoKKyAqIEBOTDgwMjExX01FU0hDT05GX01BWF9QRUVSX0xJTktTOiBtYXhpbXVtIG51bWJlciBvZiBwZWVyIGxpbmtzIGFsbG93ZWQKKyAqIG9uIHRoaXMgbWVzaCBpbnRlcmZhY2UKKyAqCisgKiBATkw4MDIxMV9NRVNIQ09ORl9NQVhfUkVUUklFUzogc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwZWVyIGxpbmsKKyAqIG9wZW4gcmV0cmllcyB0aGF0IGNhbiBiZSBzZW50IHRvIGVzdGFibGlzaCBhIG5ldyBwZWVyIGxpbmsgaW5zdGFuY2UgaW4gYQorICogbWVzaAorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX1RUTDogc3BlY2lmaWVzIHRoZSB2YWx1ZSBvZiBUVEwgZmllbGQgc2V0IGF0IGEgc291cmNlIG1lc2gKKyAqIHBvaW50LgorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX0FVVE9fT1BFTl9QTElOS1M6IHdoZXRoZXIgd2Ugc2hvdWxkIGF1dG9tYXRpY2FsbHkKKyAqIG9wZW4gcGVlciBsaW5rcyB3aGVuIHdlIGRldGVjdCBjb21wYXRpYmxlIG1lc2ggcGVlcnMuCisgKgorICogQE5MODAyMTFfTUVTSENPTkZfSFdNUF9NQVhfUFJFUV9SRVRSSUVTOiB0aGUgbnVtYmVyIG9mIGFjdGlvbiBmcmFtZXMKKyAqIGNvbnRhaW5pbmcgYSBQUkVRIHRoYXQgYW4gTVAgY2FuIHNlbmQgdG8gYSBwYXJ0aWN1bGFyIGRlc3RpbmF0aW9uIChwYXRoCisgKiB0YXJnZXQpCisgKgorICogQE5MODAyMTFfTUVTSENPTkZfUEFUSF9SRUZSRVNIX1RJTUU6IGhvdyBmcmVxdWVudGx5IHRvIHJlZnJlc2ggbWVzaCBwYXRocworICogKGluIG1pbGxpc2Vjb25kcykKKyAqCisgKiBATkw4MDIxMV9NRVNIQ09ORl9NSU5fRElTQ09WRVJZX1RJTUVPVVQ6IG1pbmltdW0gbGVuZ3RoIG9mIHRpbWUgdG8gd2FpdAorICogdW50aWwgZ2l2aW5nIHVwIG9uIGEgcGF0aCBkaXNjb3ZlcnkgKGluIG1pbGxpc2Vjb25kcykKKyAqCisgKiBATkw4MDIxMV9NRVNIQ09ORl9IV01QX0FDVElWRV9QQVRIX1RJTUVPVVQ6IFRoZSB0aW1lIChpbiBUVXMpIGZvciB3aGljaCBtZXNoCisgKiBwb2ludHMgcmVjZWl2aW5nIGEgUFJFUSBzaGFsbCBjb25zaWRlciB0aGUgZm9yd2FyZGluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZQorICogcm9vdCB0byBiZSB2YWxpZC4gKFRVID0gdGltZSB1bml0KQorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX0hXTVBfUFJFUV9NSU5fSU5URVJWQUw6IFRoZSBtaW5pbXVtIGludGVydmFsIG9mIHRpbWUgKGluCisgKiBUVXMpIGR1cmluZyB3aGljaCBhbiBNUCBjYW4gc2VuZCBvbmx5IG9uZSBhY3Rpb24gZnJhbWUgY29udGFpbmluZyBhIFBSRVEKKyAqIHJlZmVyZW5jZSBlbGVtZW50CisgKgorICogQE5MODAyMTFfTUVTSENPTkZfSFdNUF9ORVRfRElBTV9UUlZTX1RJTUU6IFRoZSBpbnRlcnZhbCBvZiB0aW1lIChpbiBUVXMpCisgKiB0aGF0IGl0IHRha2VzIGZvciBhbiBIV01QIGluZm9ybWF0aW9uIGVsZW1lbnQgdG8gcHJvcGFnYXRlIGFjcm9zcyB0aGUgbWVzaAorICoKKyAqIEBOTDgwMjExX01FU0hDT05GX0hXTVBfUk9PVE1PREU6IHdoZXRoZXIgcm9vdCBtb2RlIGlzIGVuYWJsZWQgb3Igbm90CisgKgorICogQE5MODAyMTFfTUVTSENPTkZfRUxFTUVOVF9UVEw6IHNwZWNpZmllcyB0aGUgdmFsdWUgb2YgVFRMIGZpZWxkIHNldCBhdCBhCisgKiBzb3VyY2UgbWVzaCBwb2ludCBmb3IgcGF0aCBzZWxlY3Rpb24gZWxlbWVudHMuCisgKgorICogQE5MODAyMTFfTUVTSENPTkZfSFdNUF9SQU5OX0lOVEVSVkFMOiAgVGhlIGludGVydmFsIG9mIHRpbWUgKGluIFRVcykgYmV0d2VlbgorICogcm9vdCBhbm5vdW5jZW1lbnRzIGFyZSB0cmFuc21pdHRlZC4KKyAqCisgKiBATkw4MDIxMV9NRVNIQ09ORl9HQVRFX0FOTk9VTkNFTUVOVFM6IEFkdmVydGlzZSB0aGF0IHRoaXMgbWVzaCBzdGF0aW9uIGhhcworICogYWNjZXNzIHRvIGEgYnJvYWRlciBuZXR3b3JrIGJleW9uZCB0aGUgTUJTUy4gIFRoaXMgaXMgZG9uZSB2aWEgUm9vdAorICogQW5ub3VuY2VtZW50IGZyYW1lcy4KKyAqCisgKiBATkw4MDIxMV9NRVNIQ09ORl9BVFRSX01BWDogaGlnaGVzdCBwb3NzaWJsZSBtZXNoIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlCisgKgorICogQF9fTkw4MDIxMV9NRVNIQ09ORl9BVFRSX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQorICovCitlbnVtIG5sODAyMTFfbWVzaGNvbmZfcGFyYW1zIHsKKwlfX05MODAyMTFfTUVTSENPTkZfSU5WQUxJRCwKKwlOTDgwMjExX01FU0hDT05GX1JFVFJZX1RJTUVPVVQsCisJTkw4MDIxMV9NRVNIQ09ORl9DT05GSVJNX1RJTUVPVVQsCisJTkw4MDIxMV9NRVNIQ09ORl9IT0xESU5HX1RJTUVPVVQsCisJTkw4MDIxMV9NRVNIQ09ORl9NQVhfUEVFUl9MSU5LUywKKwlOTDgwMjExX01FU0hDT05GX01BWF9SRVRSSUVTLAorCU5MODAyMTFfTUVTSENPTkZfVFRMLAorCU5MODAyMTFfTUVTSENPTkZfQVVUT19PUEVOX1BMSU5LUywKKwlOTDgwMjExX01FU0hDT05GX0hXTVBfTUFYX1BSRVFfUkVUUklFUywKKwlOTDgwMjExX01FU0hDT05GX1BBVEhfUkVGUkVTSF9USU1FLAorCU5MODAyMTFfTUVTSENPTkZfTUlOX0RJU0NPVkVSWV9USU1FT1VULAorCU5MODAyMTFfTUVTSENPTkZfSFdNUF9BQ1RJVkVfUEFUSF9USU1FT1VULAorCU5MODAyMTFfTUVTSENPTkZfSFdNUF9QUkVRX01JTl9JTlRFUlZBTCwKKwlOTDgwMjExX01FU0hDT05GX0hXTVBfTkVUX0RJQU1fVFJWU19USU1FLAorCU5MODAyMTFfTUVTSENPTkZfSFdNUF9ST09UTU9ERSwKKwlOTDgwMjExX01FU0hDT05GX0VMRU1FTlRfVFRMLAorCU5MODAyMTFfTUVTSENPTkZfSFdNUF9SQU5OX0lOVEVSVkFMLAorCU5MODAyMTFfTUVTSENPTkZfR0FURV9BTk5PVU5DRU1FTlRTLAorCisJLyoga2VlcCBsYXN0ICovCisJX19OTDgwMjExX01FU0hDT05GX0FUVFJfQUZURVJfTEFTVCwKKwlOTDgwMjExX01FU0hDT05GX0FUVFJfTUFYID0gX19OTDgwMjExX01FU0hDT05GX0FUVFJfQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX21lc2hfc2V0dXBfcGFyYW1zIC0gbWVzaCBzZXR1cCBwYXJhbWV0ZXJzCisgKgorICogTWVzaCBzZXR1cCBwYXJhbWV0ZXJzLiAgVGhlc2UgYXJlIHVzZWQgdG8gc3RhcnQvam9pbiBhIG1lc2ggYW5kIGNhbm5vdCBiZQorICogY2hhbmdlZCB3aGlsZSB0aGUgbWVzaCBpcyBhY3RpdmUuCisgKgorICogQF9fTkw4MDIxMV9NRVNIX1NFVFVQX0lOVkFMSUQ6IEludGVybmFsIHVzZQorICoKKyAqIEBOTDgwMjExX01FU0hfU0VUVVBfRU5BQkxFX1ZFTkRPUl9QQVRIX1NFTDogRW5hYmxlIHRoaXMgb3B0aW9uIHRvIHVzZSBhCisgKiB2ZW5kb3Igc3BlY2lmaWMgcGF0aCBzZWxlY3Rpb24gYWxnb3JpdGhtIG9yIGRpc2FibGUgaXQgdG8gdXNlIHRoZSBkZWZhdWx0CisgKiBIV01QLgorICoKKyAqIEBOTDgwMjExX01FU0hfU0VUVVBfRU5BQkxFX1ZFTkRPUl9NRVRSSUM6IEVuYWJsZSB0aGlzIG9wdGlvbiB0byB1c2UgYQorICogdmVuZG9yIHNwZWNpZmljIHBhdGggbWV0cmljIG9yIGRpc2FibGUgaXQgdG8gdXNlIHRoZSBkZWZhdWx0IEFpcnRpbWUKKyAqIG1ldHJpYy4KKyAqCisgKiBATkw4MDIxMV9NRVNIX1NFVFVQX0lFOiBJbmZvcm1hdGlvbiBlbGVtZW50cyBmb3IgdGhpcyBtZXNoLCBmb3IgaW5zdGFuY2UsIGEKKyAqIHJvYnVzdCBzZWN1cml0eSBuZXR3b3JrIGllLCBvciBhIHZlbmRvciBzcGVjaWZpYyBpbmZvcm1hdGlvbiBlbGVtZW50IHRoYXQKKyAqIHZlbmRvcnMgd2lsbCB1c2UgdG8gaWRlbnRpZnkgdGhlIHBhdGggc2VsZWN0aW9uIG1ldGhvZHMgYW5kIG1ldHJpY3MgaW4gdXNlLgorICoKKyAqIEBOTDgwMjExX01FU0hfU0VUVVBfVVNFUlNQQUNFX0FVVEg6IEVuYWJsZSB0aGlzIG9wdGlvbiBpZiBhbiBhdXRoZW50aWNhdGlvbgorICogZGFlbW9uIHdpbGwgYmUgYXV0aGVudGljYXRpbmcgbWVzaCBjYW5kaWRhdGVzLgorICoKKyAqIEBOTDgwMjExX01FU0hfU0VUVVBfVVNFUlNQQUNFX0FNUEU6IEVuYWJsZSB0aGlzIG9wdGlvbiBpZiBhbiBhdXRoZW50aWNhdGlvbgorICogZGFlbW9uIHdpbGwgYmUgc2VjdXJpbmcgcGVlciBsaW5rIGZyYW1lcy4gIEFNUEUgaXMgYSBzZWN1cmVkIHZlcnNpb24gb2YgTWVzaAorICogUGVlcmluZyBNYW5hZ2VtZW50IChNUE0pIGFuZCBpcyBpbXBsZW1lbnRlZCB3aXRoIHRoZSBhc3Npc3RhbmNlIG9mIGEKKyAqIHVzZXJzcGFjZSBkYWVtb24uICBXaGVuIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSBrZXJuZWwgd2lsbCBzZW5kIHBlZXIKKyAqIG1hbmFnZW1lbnQgZnJhbWVzIHRvIGEgdXNlcnNwYWNlIGRhZW1vbiB0aGF0IHdpbGwgaW1wbGVtZW50IEFNUEUKKyAqIGZ1bmN0aW9uYWxpdHkgKHNlY3VyaXR5IGNhcGFiaWxpdGllcyBzZWxlY3Rpb24sIGtleSBjb25maXJtYXRpb24sIGFuZCBrZXkKKyAqIG1hbmFnZW1lbnQpLiAgV2hlbiB0aGUgZmxhZyBpcyB1bnNldCAoZGVmYXVsdCksIHRoZSBrZXJuZWwgY2FuIGF1dG9ub21vdXNseQorICogY29tcGxldGUgKHVuc2VjdXJlZCkgbWVzaCBwZWVyaW5nIHdpdGhvdXQgdGhlIG5lZWQgb2YgYSB1c2Vyc3BhY2UgZGFlbW9uLgorICoKKyAqIEBOTDgwMjExX01FU0hfU0VUVVBfQVRUUl9NQVg6IGhpZ2hlc3QgcG9zc2libGUgbWVzaCBzZXR1cCBhdHRyaWJ1dGUgbnVtYmVyCisgKiBAX19OTDgwMjExX01FU0hfU0VUVVBfQVRUUl9BRlRFUl9MQVNUOiBJbnRlcm5hbCB1c2UKKyAqLworZW51bSBubDgwMjExX21lc2hfc2V0dXBfcGFyYW1zIHsKKwlfX05MODAyMTFfTUVTSF9TRVRVUF9JTlZBTElELAorCU5MODAyMTFfTUVTSF9TRVRVUF9FTkFCTEVfVkVORE9SX1BBVEhfU0VMLAorCU5MODAyMTFfTUVTSF9TRVRVUF9FTkFCTEVfVkVORE9SX01FVFJJQywKKwlOTDgwMjExX01FU0hfU0VUVVBfSUUsCisJTkw4MDIxMV9NRVNIX1NFVFVQX1VTRVJTUEFDRV9BVVRILAorCU5MODAyMTFfTUVTSF9TRVRVUF9VU0VSU1BBQ0VfQU1QRSwKKworCS8qIGtlZXAgbGFzdCAqLworCV9fTkw4MDIxMV9NRVNIX1NFVFVQX0FUVFJfQUZURVJfTEFTVCwKKwlOTDgwMjExX01FU0hfU0VUVVBfQVRUUl9NQVggPSBfX05MODAyMTFfTUVTSF9TRVRVUF9BVFRSX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV90eHFfYXR0ciAtIFRYIHF1ZXVlIHBhcmFtZXRlciBhdHRyaWJ1dGVzCisgKiBAX19OTDgwMjExX1RYUV9BVFRSX0lOVkFMSUQ6IEF0dHJpYnV0ZSBudW1iZXIgMCBpcyByZXNlcnZlZAorICogQE5MODAyMTFfVFhRX0FUVFJfUVVFVUU6IFRYIHF1ZXVlIGlkZW50aWZpZXIgKE5MODAyMTFfVFhRX1FfKikKKyAqIEBOTDgwMjExX1RYUV9BVFRSX1RYT1A6IE1heGltdW0gYnVyc3QgdGltZSBpbiB1bml0cyBvZiAzMiB1c2VjcywgMCBtZWFuaW5nCisgKglkaXNhYmxlZAorICogQE5MODAyMTFfVFhRX0FUVFJfQ1dNSU46IE1pbmltdW0gY29udGVudGlvbiB3aW5kb3cgW2EgdmFsdWUgb2YgdGhlIGZvcm0KKyAqCTJebi0xIGluIHRoZSByYW5nZSAxLi4zMjc2N10KKyAqIEBOTDgwMjExX1RYUV9BVFRSX0NXTUFYOiBNYXhpbXVtIGNvbnRlbnRpb24gd2luZG93IFthIHZhbHVlIG9mIHRoZSBmb3JtCisgKgkyXm4tMSBpbiB0aGUgcmFuZ2UgMS4uMzI3NjddCisgKiBATkw4MDIxMV9UWFFfQVRUUl9BSUZTOiBBcmJpdHJhdGlvbiBpbnRlcmZyYW1lIHNwYWNlIFswLi4yNTVdCisgKiBAX19OTDgwMjExX1RYUV9BVFRSX0FGVEVSX0xBU1Q6IEludGVybmFsCisgKiBATkw4MDIxMV9UWFFfQVRUUl9NQVg6IE1heGltdW0gVFhRIGF0dHJpYnV0ZSBudW1iZXIKKyAqLworZW51bSBubDgwMjExX3R4cV9hdHRyIHsKKwlfX05MODAyMTFfVFhRX0FUVFJfSU5WQUxJRCwKKwlOTDgwMjExX1RYUV9BVFRSX1FVRVVFLAorCU5MODAyMTFfVFhRX0FUVFJfVFhPUCwKKwlOTDgwMjExX1RYUV9BVFRSX0NXTUlOLAorCU5MODAyMTFfVFhRX0FUVFJfQ1dNQVgsCisJTkw4MDIxMV9UWFFfQVRUUl9BSUZTLAorCisJLyoga2VlcCBsYXN0ICovCisJX19OTDgwMjExX1RYUV9BVFRSX0FGVEVSX0xBU1QsCisJTkw4MDIxMV9UWFFfQVRUUl9NQVggPSBfX05MODAyMTFfVFhRX0FUVFJfQUZURVJfTEFTVCAtIDEKK307CisKK2VudW0gbmw4MDIxMV90eHFfcSB7CisJTkw4MDIxMV9UWFFfUV9WTywKKwlOTDgwMjExX1RYUV9RX1ZJLAorCU5MODAyMTFfVFhRX1FfQkUsCisJTkw4MDIxMV9UWFFfUV9CSworfTsKKworZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSB7CisJTkw4MDIxMV9DSEFOX05PX0hULAorCU5MODAyMTFfQ0hBTl9IVDIwLAorCU5MODAyMTFfQ0hBTl9IVDQwTUlOVVMsCisJTkw4MDIxMV9DSEFOX0hUNDBQTFVTCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9ic3MgLSBuZXRsaW5rIGF0dHJpYnV0ZXMgZm9yIGEgQlNTCisgKgorICogQF9fTkw4MDIxMV9CU1NfSU5WQUxJRDogaW52YWxpZAorICogQE5MODAyMTFfQlNTX0JTU0lEOiBCU1NJRCBvZiB0aGUgQlNTICg2IG9jdGV0cykKKyAqIEBOTDgwMjExX0JTU19GUkVRVUVOQ1k6IGZyZXF1ZW5jeSBpbiBNSHogKHUzMikKKyAqIEBOTDgwMjExX0JTU19UU0Y6IFRTRiBvZiB0aGUgcmVjZWl2ZWQgcHJvYmUgcmVzcG9uc2UvYmVhY29uICh1NjQpCisgKiBATkw4MDIxMV9CU1NfQkVBQ09OX0lOVEVSVkFMOiBiZWFjb24gaW50ZXJ2YWwgb2YgdGhlIChJKUJTUyAodTE2KQorICogQE5MODAyMTFfQlNTX0NBUEFCSUxJVFk6IGNhcGFiaWxpdHkgZmllbGQgKENQVSBvcmRlciwgdTE2KQorICogQE5MODAyMTFfQlNTX0lORk9STUFUSU9OX0VMRU1FTlRTOiBiaW5hcnkgYXR0cmlidXRlIGNvbnRhaW5pbmcgdGhlCisgKglyYXcgaW5mb3JtYXRpb24gZWxlbWVudHMgZnJvbSB0aGUgcHJvYmUgcmVzcG9uc2UvYmVhY29uIChiaW4pOworICoJaWYgdGhlICVOTDgwMjExX0JTU19CRUFDT05fSUVTIGF0dHJpYnV0ZSBpcyBwcmVzZW50LCB0aGUgSUVzIGhlcmUgYXJlCisgKglmcm9tIGEgUHJvYmUgUmVzcG9uc2UgZnJhbWU7IG90aGVyd2lzZSB0aGV5IGFyZSBmcm9tIGEgQmVhY29uIGZyYW1lLgorICoJSG93ZXZlciwgaWYgdGhlIGRyaXZlciBkb2VzIG5vdCBpbmRpY2F0ZSB0aGUgc291cmNlIG9mIHRoZSBJRXMsIHRoZXNlCisgKglJRXMgbWF5IGJlIGZyb20gZWl0aGVyIGZyYW1lIHN1YnR5cGUuCisgKiBATkw4MDIxMV9CU1NfU0lHTkFMX01CTTogc2lnbmFsIHN0cmVuZ3RoIG9mIHByb2JlIHJlc3BvbnNlL2JlYWNvbgorICoJaW4gbUJtICgxMDAgKiBkQm0pIChzMzIpCisgKiBATkw4MDIxMV9CU1NfU0lHTkFMX1VOU1BFQzogc2lnbmFsIHN0cmVuZ3RoIG9mIHRoZSBwcm9iZSByZXNwb25zZS9iZWFjb24KKyAqCWluIHVuc3BlY2lmaWVkIHVuaXRzLCBzY2FsZWQgdG8gMC4uMTAwICh1OCkKKyAqIEBOTDgwMjExX0JTU19TVEFUVVM6IHN0YXR1cywgaWYgdGhpcyBCU1MgaXMgInVzZWQiCisgKiBATkw4MDIxMV9CU1NfU0VFTl9NU19BR086IGFnZSBvZiB0aGlzIEJTUyBlbnRyeSBpbiBtcworICogQE5MODAyMTFfQlNTX0JFQUNPTl9JRVM6IGJpbmFyeSBhdHRyaWJ1dGUgY29udGFpbmluZyB0aGUgcmF3IGluZm9ybWF0aW9uCisgKgllbGVtZW50cyBmcm9tIGEgQmVhY29uIGZyYW1lIChiaW4pOyBub3QgcHJlc2VudCBpZiBubyBCZWFjb24gZnJhbWUgaGFzCisgKgl5ZXQgYmVlbiByZWNlaXZlZAorICogQF9fTkw4MDIxMV9CU1NfQUZURVJfTEFTVDogaW50ZXJuYWwKKyAqIEBOTDgwMjExX0JTU19NQVg6IGhpZ2hlc3QgQlNTIGF0dHJpYnV0ZQorICovCitlbnVtIG5sODAyMTFfYnNzIHsKKwlfX05MODAyMTFfQlNTX0lOVkFMSUQsCisJTkw4MDIxMV9CU1NfQlNTSUQsCisJTkw4MDIxMV9CU1NfRlJFUVVFTkNZLAorCU5MODAyMTFfQlNTX1RTRiwKKwlOTDgwMjExX0JTU19CRUFDT05fSU5URVJWQUwsCisJTkw4MDIxMV9CU1NfQ0FQQUJJTElUWSwKKwlOTDgwMjExX0JTU19JTkZPUk1BVElPTl9FTEVNRU5UUywKKwlOTDgwMjExX0JTU19TSUdOQUxfTUJNLAorCU5MODAyMTFfQlNTX1NJR05BTF9VTlNQRUMsCisJTkw4MDIxMV9CU1NfU1RBVFVTLAorCU5MODAyMTFfQlNTX1NFRU5fTVNfQUdPLAorCU5MODAyMTFfQlNTX0JFQUNPTl9JRVMsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlfX05MODAyMTFfQlNTX0FGVEVSX0xBU1QsCisJTkw4MDIxMV9CU1NfTUFYID0gX19OTDgwMjExX0JTU19BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfYnNzX3N0YXR1cyAtIEJTUyAic3RhdHVzIgorICogQE5MODAyMTFfQlNTX1NUQVRVU19BVVRIRU5USUNBVEVEOiBBdXRoZW50aWNhdGVkIHdpdGggdGhpcyBCU1MuCisgKiBATkw4MDIxMV9CU1NfU1RBVFVTX0FTU09DSUFURUQ6IEFzc29jaWF0ZWQgd2l0aCB0aGlzIEJTUy4KKyAqIEBOTDgwMjExX0JTU19TVEFUVVNfSUJTU19KT0lORUQ6IEpvaW5lZCB0byB0aGlzIElCU1MuCisgKgorICogVGhlIEJTUyBzdGF0dXMgaXMgYSBCU1MgYXR0cmlidXRlIGluIHNjYW4gZHVtcHMsIHdoaWNoCisgKiBpbmRpY2F0ZXMgdGhlIHN0YXR1cyB0aGUgaW50ZXJmYWNlIGhhcyB3cnQuIHRoaXMgQlNTLgorICovCitlbnVtIG5sODAyMTFfYnNzX3N0YXR1cyB7CisJTkw4MDIxMV9CU1NfU1RBVFVTX0FVVEhFTlRJQ0FURUQsCisJTkw4MDIxMV9CU1NfU1RBVFVTX0FTU09DSUFURUQsCisJTkw4MDIxMV9CU1NfU1RBVFVTX0lCU1NfSk9JTkVELAorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfYXV0aF90eXBlIC0gQXV0aGVudGljYXRpb25UeXBlCisgKgorICogQE5MODAyMTFfQVVUSFRZUEVfT1BFTl9TWVNURU06IE9wZW4gU3lzdGVtIGF1dGhlbnRpY2F0aW9uCisgKiBATkw4MDIxMV9BVVRIVFlQRV9TSEFSRURfS0VZOiBTaGFyZWQgS2V5IGF1dGhlbnRpY2F0aW9uIChXRVAgb25seSkKKyAqIEBOTDgwMjExX0FVVEhUWVBFX0ZUOiBGYXN0IEJTUyBUcmFuc2l0aW9uIChJRUVFIDgwMi4xMXIpCisgKiBATkw4MDIxMV9BVVRIVFlQRV9ORVRXT1JLX0VBUDogTmV0d29yayBFQVAgKHNvbWUgQ2lzY28gQVBzIGFuZCBtYWlubHkgTEVBUCkKKyAqIEBfX05MODAyMTFfQVVUSFRZUEVfTlVNOiBpbnRlcm5hbAorICogQE5MODAyMTFfQVVUSFRZUEVfTUFYOiBtYXhpbXVtIHZhbGlkIGF1dGggYWxnb3JpdGhtCisgKiBATkw4MDIxMV9BVVRIVFlQRV9BVVRPTUFUSUM6IGRldGVybWluZSBhdXRvbWF0aWNhbGx5IChpZiBuZWNlc3NhcnkgYnkKKyAqCXRyeWluZyBtdWx0aXBsZSB0aW1lcyk7IHRoaXMgaXMgaW52YWxpZCBpbiBuZXRsaW5rIC0tIGxlYXZlIG91dAorICoJdGhlIGF0dHJpYnV0ZSBmb3IgdGhpcyBvbiBDT05ORUNUIGNvbW1hbmRzLgorICovCitlbnVtIG5sODAyMTFfYXV0aF90eXBlIHsKKwlOTDgwMjExX0FVVEhUWVBFX09QRU5fU1lTVEVNLAorCU5MODAyMTFfQVVUSFRZUEVfU0hBUkVEX0tFWSwKKwlOTDgwMjExX0FVVEhUWVBFX0ZULAorCU5MODAyMTFfQVVUSFRZUEVfTkVUV09SS19FQVAsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlfX05MODAyMTFfQVVUSFRZUEVfTlVNLAorCU5MODAyMTFfQVVUSFRZUEVfTUFYID0gX19OTDgwMjExX0FVVEhUWVBFX05VTSAtIDEsCisJTkw4MDIxMV9BVVRIVFlQRV9BVVRPTUFUSUMKK307CisKKy8qKgorICogZW51bSBubDgwMjExX2tleV90eXBlIC0gS2V5IFR5cGUKKyAqIEBOTDgwMjExX0tFWVRZUEVfR1JPVVA6IEdyb3VwIChicm9hZGNhc3QvbXVsdGljYXN0KSBrZXkKKyAqIEBOTDgwMjExX0tFWVRZUEVfUEFJUldJU0U6IFBhaXJ3aXNlICh1bmljYXN0L2luZGl2aWR1YWwpIGtleQorICogQE5MODAyMTFfS0VZVFlQRV9QRUVSS0VZOiBQZWVyS2V5IChETFMpCisgKiBATlVNX05MODAyMTFfS0VZVFlQRVM6IG51bWJlciBvZiBkZWZpbmVkIGtleSB0eXBlcworICovCitlbnVtIG5sODAyMTFfa2V5X3R5cGUgeworCU5MODAyMTFfS0VZVFlQRV9HUk9VUCwKKwlOTDgwMjExX0tFWVRZUEVfUEFJUldJU0UsCisJTkw4MDIxMV9LRVlUWVBFX1BFRVJLRVksCisKKwlOVU1fTkw4MDIxMV9LRVlUWVBFUworfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfbWZwIC0gTWFuYWdlbWVudCBmcmFtZSBwcm90ZWN0aW9uIHN0YXRlCisgKiBATkw4MDIxMV9NRlBfTk86IE1hbmFnZW1lbnQgZnJhbWUgcHJvdGVjdGlvbiBub3QgdXNlZAorICogQE5MODAyMTFfTUZQX1JFUVVJUkVEOiBNYW5hZ2VtZW50IGZyYW1lIHByb3RlY3Rpb24gcmVxdWlyZWQKKyAqLworZW51bSBubDgwMjExX21mcCB7CisJTkw4MDIxMV9NRlBfTk8sCisJTkw4MDIxMV9NRlBfUkVRVUlSRUQsCit9OworCitlbnVtIG5sODAyMTFfd3BhX3ZlcnNpb25zIHsKKwlOTDgwMjExX1dQQV9WRVJTSU9OXzEgPSAxIDw8IDAsCisJTkw4MDIxMV9XUEFfVkVSU0lPTl8yID0gMSA8PCAxLAorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfa2V5X2RlZmF1bHRfdHlwZXMgLSBrZXkgZGVmYXVsdCB0eXBlcworICogQF9fTkw4MDIxMV9LRVlfREVGQVVMVF9UWVBFX0lOVkFMSUQ6IGludmFsaWQKKyAqIEBOTDgwMjExX0tFWV9ERUZBVUxUX1RZUEVfVU5JQ0FTVDoga2V5IHNob3VsZCBiZSB1c2VkIGFzIGRlZmF1bHQKKyAqCXVuaWNhc3Qga2V5CisgKiBATkw4MDIxMV9LRVlfREVGQVVMVF9UWVBFX01VTFRJQ0FTVDoga2V5IHNob3VsZCBiZSB1c2VkIGFzIGRlZmF1bHQKKyAqCW11bHRpY2FzdCBrZXkKKyAqIEBOVU1fTkw4MDIxMV9LRVlfREVGQVVMVF9UWVBFUzogbnVtYmVyIG9mIGRlZmF1bHQgdHlwZXMKKyAqLworZW51bSBubDgwMjExX2tleV9kZWZhdWx0X3R5cGVzIHsKKwlfX05MODAyMTFfS0VZX0RFRkFVTFRfVFlQRV9JTlZBTElELAorCU5MODAyMTFfS0VZX0RFRkFVTFRfVFlQRV9VTklDQVNULAorCU5MODAyMTFfS0VZX0RFRkFVTFRfVFlQRV9NVUxUSUNBU1QsCisKKwlOVU1fTkw4MDIxMV9LRVlfREVGQVVMVF9UWVBFUworfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfa2V5X2F0dHJpYnV0ZXMgLSBrZXkgYXR0cmlidXRlcworICogQF9fTkw4MDIxMV9LRVlfSU5WQUxJRDogaW52YWxpZAorICogQE5MODAyMTFfS0VZX0RBVEE6ICh0ZW1wb3JhbCkga2V5IGRhdGE7IGZvciBUS0lQIHRoaXMgY29uc2lzdHMgb2YKKyAqCTE2IGJ5dGVzIGVuY3J5cHRpb24ga2V5IGZvbGxvd2VkIGJ5IDggYnl0ZXMgZWFjaCBmb3IgVFggYW5kIFJYIE1JQworICoJa2V5cworICogQE5MODAyMTFfS0VZX0lEWDoga2V5IElEICh1OCwgMC0zKQorICogQE5MODAyMTFfS0VZX0NJUEhFUjoga2V5IGNpcGhlciBzdWl0ZSAodTMyLCBhcyBkZWZpbmVkIGJ5IElFRUUgODAyLjExCisgKglzZWN0aW9uIDcuMy4yLjI1LjEsIGUuZy4gMHgwMDBGQUMwNCkKKyAqIEBOTDgwMjExX0tFWV9TRVE6IHRyYW5zbWl0IGtleSBzZXF1ZW5jZSBudW1iZXIgKElWL1BOKSBmb3IgVEtJUCBhbmQKKyAqCUNDTVAga2V5cywgZWFjaCBzaXggYnl0ZXMgaW4gbGl0dGxlIGVuZGlhbgorICogQE5MODAyMTFfS0VZX0RFRkFVTFQ6IGZsYWcgaW5kaWNhdGluZyBkZWZhdWx0IGtleQorICogQE5MODAyMTFfS0VZX0RFRkFVTFRfTUdNVDogZmxhZyBpbmRpY2F0aW5nIGRlZmF1bHQgbWFuYWdlbWVudCBrZXkKKyAqIEBOTDgwMjExX0tFWV9UWVBFOiB0aGUga2V5IHR5cGUgZnJvbSBlbnVtIG5sODAyMTFfa2V5X3R5cGUsIGlmIG5vdAorICoJc3BlY2lmaWVkIHRoZSBkZWZhdWx0IGRlcGVuZHMgb24gd2hldGhlciBhIE1BQyBhZGRyZXNzIHdhcworICoJZ2l2ZW4gd2l0aCB0aGUgY29tbWFuZCB1c2luZyB0aGUga2V5IG9yIG5vdCAodTMyKQorICogQE5MODAyMTFfS0VZX0RFRkFVTFRfVFlQRVM6IEEgbmVzdGVkIGF0dHJpYnV0ZSBjb250YWluaW5nIGZsYWdzCisgKglhdHRyaWJ1dGVzLCBzcGVjaWZ5aW5nIHdoYXQgYSBrZXkgc2hvdWxkIGJlIHNldCBhcyBkZWZhdWx0IGFzLgorICoJU2VlICZlbnVtIG5sODAyMTFfa2V5X2RlZmF1bHRfdHlwZXMuCisgKiBAX19OTDgwMjExX0tFWV9BRlRFUl9MQVNUOiBpbnRlcm5hbAorICogQE5MODAyMTFfS0VZX01BWDogaGlnaGVzdCBrZXkgYXR0cmlidXRlCisgKi8KK2VudW0gbmw4MDIxMV9rZXlfYXR0cmlidXRlcyB7CisJX19OTDgwMjExX0tFWV9JTlZBTElELAorCU5MODAyMTFfS0VZX0RBVEEsCisJTkw4MDIxMV9LRVlfSURYLAorCU5MODAyMTFfS0VZX0NJUEhFUiwKKwlOTDgwMjExX0tFWV9TRVEsCisJTkw4MDIxMV9LRVlfREVGQVVMVCwKKwlOTDgwMjExX0tFWV9ERUZBVUxUX01HTVQsCisJTkw4MDIxMV9LRVlfVFlQRSwKKwlOTDgwMjExX0tFWV9ERUZBVUxUX1RZUEVTLAorCisJLyoga2VlcCBsYXN0ICovCisJX19OTDgwMjExX0tFWV9BRlRFUl9MQVNULAorCU5MODAyMTFfS0VZX01BWCA9IF9fTkw4MDIxMV9LRVlfQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX3R4X3JhdGVfYXR0cmlidXRlcyAtIFRYIHJhdGUgc2V0IGF0dHJpYnV0ZXMKKyAqIEBfX05MODAyMTFfVFhSQVRFX0lOVkFMSUQ6IGludmFsaWQKKyAqIEBOTDgwMjExX1RYUkFURV9MRUdBQ1k6IExlZ2FjeSAobm9uLU1DUykgcmF0ZXMgYWxsb3dlZCBmb3IgVFggcmF0ZSBzZWxlY3Rpb24KKyAqCWluIGFuIGFycmF5IG9mIHJhdGVzIGFzIGRlZmluZWQgaW4gSUVFRSA4MDIuMTEgNy4zLjIuMiAodTggdmFsdWVzIHdpdGgKKyAqCTEgPSA1MDAga2JwcykgYnV0IHdpdGhvdXQgdGhlIElFIGxlbmd0aCByZXN0cmljdGlvbiAoYXQgbW9zdAorICoJJU5MODAyMTFfTUFYX1NVUFBfUkFURVMgaW4gYSBzaW5nbGUgYXJyYXkpLgorICogQF9fTkw4MDIxMV9UWFJBVEVfQUZURVJfTEFTVDogaW50ZXJuYWwKKyAqIEBOTDgwMjExX1RYUkFURV9NQVg6IGhpZ2hlc3QgVFggcmF0ZSBhdHRyaWJ1dGUKKyAqLworZW51bSBubDgwMjExX3R4X3JhdGVfYXR0cmlidXRlcyB7CisJX19OTDgwMjExX1RYUkFURV9JTlZBTElELAorCU5MODAyMTFfVFhSQVRFX0xFR0FDWSwKKworCS8qIGtlZXAgbGFzdCAqLworCV9fTkw4MDIxMV9UWFJBVEVfQUZURVJfTEFTVCwKKwlOTDgwMjExX1RYUkFURV9NQVggPSBfX05MODAyMTFfVFhSQVRFX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9iYW5kIC0gRnJlcXVlbmN5IGJhbmQKKyAqIEBOTDgwMjExX0JBTkRfMkdIWjogMi40IEdIeiBJU00gYmFuZAorICogQE5MODAyMTFfQkFORF81R0haOiBhcm91bmQgNSBHSHogYmFuZCAoNC45IC0gNS43IEdIeikKKyAqLworZW51bSBubDgwMjExX2JhbmQgeworCU5MODAyMTFfQkFORF8yR0haLAorCU5MODAyMTFfQkFORF81R0haLAorfTsKKworZW51bSBubDgwMjExX3BzX3N0YXRlIHsKKwlOTDgwMjExX1BTX0RJU0FCTEVELAorCU5MODAyMTFfUFNfRU5BQkxFRCwKK307CisKKy8qKgorICogZW51bSBubDgwMjExX2F0dHJfY3FtIC0gY29ubmVjdGlvbiBxdWFsaXR5IG1vbml0b3IgYXR0cmlidXRlcworICogQF9fTkw4MDIxMV9BVFRSX0NRTV9JTlZBTElEOiBpbnZhbGlkCisgKiBATkw4MDIxMV9BVFRSX0NRTV9SU1NJX1RIT0xEOiBSU1NJIHRocmVzaG9sZCBpbiBkQm0uIFRoaXMgdmFsdWUgc3BlY2lmaWVzCisgKgl0aGUgdGhyZXNob2xkIGZvciB0aGUgUlNTSSBsZXZlbCBhdCB3aGljaCBhbiBldmVudCB3aWxsIGJlIHNlbnQuIFplcm8KKyAqCXRvIGRpc2FibGUuCisgKiBATkw4MDIxMV9BVFRSX0NRTV9SU1NJX0hZU1Q6IFJTU0kgaHlzdGVyZXNpcyBpbiBkQm0uIFRoaXMgdmFsdWUgc3BlY2lmaWVzCisgKgl0aGUgbWluaW11bSBhbW91bnQgdGhlIFJTU0kgbGV2ZWwgbXVzdCBjaGFuZ2UgYWZ0ZXIgYW4gZXZlbnQgYmVmb3JlIGEKKyAqCW5ldyBldmVudCBtYXkgYmUgaXNzdWVkICh0byByZWR1Y2UgZWZmZWN0cyBvZiBSU1NJIG9zY2lsbGF0aW9uKS4KKyAqIEBOTDgwMjExX0FUVFJfQ1FNX1JTU0lfVEhSRVNIT0xEX0VWRU5UOiBSU1NJIHRocmVzaG9sZCBldmVudAorICogQE5MODAyMTFfQVRUUl9DUU1fUEtUX0xPU1NfRVZFTlQ6IGEgdTMyIHZhbHVlIGluZGljYXRpbmcgdGhhdCB0aGlzIG1hbnkKKyAqCWNvbnNlY3V0aXZlIHBhY2tldHMgd2VyZSBub3QgYWNrbm93bGVkZ2VkIGJ5IHRoZSBwZWVyCisgKiBAX19OTDgwMjExX0FUVFJfQ1FNX0FGVEVSX0xBU1Q6IGludGVybmFsCisgKiBATkw4MDIxMV9BVFRSX0NRTV9NQVg6IGhpZ2hlc3Qga2V5IGF0dHJpYnV0ZQorICovCitlbnVtIG5sODAyMTFfYXR0cl9jcW0geworCV9fTkw4MDIxMV9BVFRSX0NRTV9JTlZBTElELAorCU5MODAyMTFfQVRUUl9DUU1fUlNTSV9USE9MRCwKKwlOTDgwMjExX0FUVFJfQ1FNX1JTU0lfSFlTVCwKKwlOTDgwMjExX0FUVFJfQ1FNX1JTU0lfVEhSRVNIT0xEX0VWRU5ULAorCU5MODAyMTFfQVRUUl9DUU1fUEtUX0xPU1NfRVZFTlQsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlfX05MODAyMTFfQVRUUl9DUU1fQUZURVJfTEFTVCwKKwlOTDgwMjExX0FUVFJfQ1FNX01BWCA9IF9fTkw4MDIxMV9BVFRSX0NRTV9BRlRFUl9MQVNUIC0gMQorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfY3FtX3Jzc2lfdGhyZXNob2xkX2V2ZW50IC0gUlNTSSB0aHJlc2hvbGQgZXZlbnQKKyAqIEBOTDgwMjExX0NRTV9SU1NJX1RIUkVTSE9MRF9FVkVOVF9MT1c6IFRoZSBSU1NJIGxldmVsIGlzIGxvd2VyIHRoYW4gdGhlCisgKiAgICAgIGNvbmZpZ3VyZWQgdGhyZXNob2xkCisgKiBATkw4MDIxMV9DUU1fUlNTSV9USFJFU0hPTERfRVZFTlRfSElHSDogVGhlIFJTU0kgaXMgaGlnaGVyIHRoYW4gdGhlCisgKiAgICAgIGNvbmZpZ3VyZWQgdGhyZXNob2xkCisgKi8KK2VudW0gbmw4MDIxMV9jcW1fcnNzaV90aHJlc2hvbGRfZXZlbnQgeworCU5MODAyMTFfQ1FNX1JTU0lfVEhSRVNIT0xEX0VWRU5UX0xPVywKKwlOTDgwMjExX0NRTV9SU1NJX1RIUkVTSE9MRF9FVkVOVF9ISUdILAorfTsKKworCisvKioKKyAqIGVudW0gbmw4MDIxMV90eF9wb3dlcl9zZXR0aW5nIC0gVFggcG93ZXIgYWRqdXN0bWVudAorICogQE5MODAyMTFfVFhfUE9XRVJfQVVUT01BVElDOiBhdXRvbWF0aWNhbGx5IGRldGVybWluZSB0cmFuc21pdCBwb3dlcgorICogQE5MODAyMTFfVFhfUE9XRVJfTElNSVRFRDogbGltaXQgVFggcG93ZXIgYnkgdGhlIG1CbSBwYXJhbWV0ZXIKKyAqIEBOTDgwMjExX1RYX1BPV0VSX0ZJWEVEOiBmaXggVFggcG93ZXIgdG8gdGhlIG1CbSBwYXJhbWV0ZXIKKyAqLworZW51bSBubDgwMjExX3R4X3Bvd2VyX3NldHRpbmcgeworCU5MODAyMTFfVFhfUE9XRVJfQVVUT01BVElDLAorCU5MODAyMTFfVFhfUE9XRVJfTElNSVRFRCwKKwlOTDgwMjExX1RYX1BPV0VSX0ZJWEVELAorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfd293bGFuX3BhY2tldF9wYXR0ZXJuX2F0dHIgLSBXb1dMQU4gcGFja2V0IHBhdHRlcm4gYXR0cmlidXRlCisgKiBAX19OTDgwMjExX1dPV0xBTl9QS1RQQVRfSU5WQUxJRDogaW52YWxpZCBudW1iZXIgZm9yIG5lc3RlZCBhdHRyaWJ1dGUKKyAqIEBOTDgwMjExX1dPV0xBTl9QS1RQQVRfUEFUVEVSTjogdGhlIHBhdHRlcm4sIHZhbHVlcyB3aGVyZSB0aGUgbWFzayBoYXMKKyAqCWEgemVybyBiaXQgYXJlIGlnbm9yZWQKKyAqIEBOTDgwMjExX1dPV0xBTl9QS1RQQVRfTUFTSzogcGF0dGVybiBtYXNrLCBtdXN0IGJlIGxvbmcgZW5vdWdoIHRvIGhhdmUKKyAqCWEgYml0IGZvciBlYWNoIGJ5dGUgaW4gdGhlIHBhdHRlcm4uIFRoZSBsb3dlc3Qtb3JkZXIgYml0IGNvcnJlc3BvbmRzCisgKgl0byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgcGF0dGVybiwgYnV0IHRoZSBieXRlcyBvZiB0aGUgcGF0dGVybiBhcmUKKyAqCWluIGEgbGl0dGxlLWVuZGlhbi1saWtlIGZvcm1hdCwgaS5lLiB0aGUgOXRoIGJ5dGUgb2YgdGhlIHBhdHRlcm4KKyAqCWNvcnJlc3BvbmRzIHRvIHRoZSBsb3dlc3Qtb3JkZXIgYml0IGluIHRoZSBzZWNvbmQgYnl0ZSBvZiB0aGUgbWFzay4KKyAqCUZvciBleGFtcGxlOiBUaGUgbWF0Y2ggMDA6eHg6MDA6MDA6eHg6MDA6MDA6MDA6MDA6eHg6eHg6eHggKHdoZXJlCisgKgl4eCBpbmRpY2F0ZXMgImRvbid0IGNhcmUiKSB3b3VsZCBiZSByZXByZXNlbnRlZCBieSBhIHBhdHRlcm4gb2YKKyAqCXR3ZWx2ZSB6ZXJvIGJ5dGVzLCBhbmQgYSBtYXNrIG9mICIweGVkLDB4MDciLgorICoJTm90ZSB0aGF0IHRoZSBwYXR0ZXJuIG1hdGNoaW5nIGlzIGRvbmUgYXMgdGhvdWdoIGZyYW1lcyB3ZXJlIG5vdAorICoJODAyLjExIGZyYW1lcyBidXQgODAyLjMgZnJhbWVzLCBpLmUuIHRoZSBmcmFtZSBpcyBmdWxseSB1bnBhY2tlZAorICoJZmlyc3QgKGluY2x1ZGluZyBTTkFQIGhlYWRlciB1bnBhY2tpbmcpIGFuZCB0aGVuIG1hdGNoZWQuCisgKiBATlVNX05MODAyMTFfV09XTEFOX1BLVFBBVDogbnVtYmVyIG9mIGF0dHJpYnV0ZXMKKyAqIEBNQVhfTkw4MDIxMV9XT1dMQU5fUEtUUEFUOiBtYXggYXR0cmlidXRlIG51bWJlcgorICovCitlbnVtIG5sODAyMTFfd293bGFuX3BhY2tldF9wYXR0ZXJuX2F0dHIgeworCV9fTkw4MDIxMV9XT1dMQU5fUEtUUEFUX0lOVkFMSUQsCisJTkw4MDIxMV9XT1dMQU5fUEtUUEFUX01BU0ssCisJTkw4MDIxMV9XT1dMQU5fUEtUUEFUX1BBVFRFUk4sCisKKwlOVU1fTkw4MDIxMV9XT1dMQU5fUEtUUEFULAorCU1BWF9OTDgwMjExX1dPV0xBTl9QS1RQQVQgPSBOVU1fTkw4MDIxMV9XT1dMQU5fUEtUUEFUIC0gMSwKK307CisKKy8qKgorICogc3RydWN0IG5sODAyMTFfd293bGFuX3BhdHRlcm5fc3VwcG9ydCAtIHBhdHRlcm4gc3VwcG9ydCBpbmZvcm1hdGlvbgorICogQG1heF9wYXR0ZXJuczogbWF4aW11bSBudW1iZXIgb2YgcGF0dGVybnMgc3VwcG9ydGVkCisgKiBAbWluX3BhdHRlcm5fbGVuOiBtaW5pbXVtIGxlbmd0aCBvZiBlYWNoIHBhdHRlcm4KKyAqIEBtYXhfcGF0dGVybl9sZW46IG1heGltdW0gbGVuZ3RoIG9mIGVhY2ggcGF0dGVybgorICoKKyAqIFRoaXMgc3RydWN0IGlzIGNhcnJpZWQgaW4gJU5MODAyMTFfV09XTEFOX1RSSUdfUEtUX1BBVFRFUk4gd2hlbgorICogdGhhdCBpcyBwYXJ0IG9mICVOTDgwMjExX0FUVFJfV09XTEFOX1RSSUdHRVJTX1NVUFBPUlRFRCBpbiB0aGUKKyAqIGNhcGFiaWxpdHkgaW5mb3JtYXRpb24gZ2l2ZW4gYnkgdGhlIGtlcm5lbCB0byB1c2Vyc3BhY2UuCisgKi8KK3N0cnVjdCBubDgwMjExX3dvd2xhbl9wYXR0ZXJuX3N1cHBvcnQgeworCV9fdTMyIG1heF9wYXR0ZXJuczsKKwlfX3UzMiBtaW5fcGF0dGVybl9sZW47CisJX191MzIgbWF4X3BhdHRlcm5fbGVuOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfd293bGFuX3RyaWdnZXJzIC0gV29XTEFOIHRyaWdnZXIgZGVmaW5pdGlvbnMKKyAqIEBfX05MODAyMTFfV09XTEFOX1RSSUdfSU5WQUxJRDogaW52YWxpZCBudW1iZXIgZm9yIG5lc3RlZCBhdHRyaWJ1dGVzCisgKiBATkw4MDIxMV9XT1dMQU5fVFJJR19BTlk6IHdha2UgdXAgb24gYW55IGFjdGl2aXR5LCBkbyBub3QgcmVhbGx5IHB1dAorICoJdGhlIGNoaXAgaW50byBhIHNwZWNpYWwgc3RhdGUgLS0gd29ya3MgYmVzdCB3aXRoIGNoaXBzIHRoYXQgaGF2ZQorICoJc3VwcG9ydCBmb3IgbG93LXBvd2VyIG9wZXJhdGlvbiBhbHJlYWR5IChmbGFnKQorICogQE5MODAyMTFfV09XTEFOX1RSSUdfRElTQ09OTkVDVDogd2FrZSB1cCBvbiBkaXNjb25uZWN0LCB0aGUgd2F5IGRpc2Nvbm5lY3QKKyAqCWlzIGRldGVjdGVkIGlzIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIChmbGFnKQorICogQE5MODAyMTFfV09XTEFOX1RSSUdfTUFHSUNfUEtUOiB3YWtlIHVwIG9uIG1hZ2ljIHBhY2tldCAoNnggMHhmZiwgZm9sbG93ZWQKKyAqCWJ5IDE2IHJlcGV0aXRpb25zIG9mIE1BQyBhZGRyLCBhbnl3aGVyZSBpbiBwYXlsb2FkKSAoZmxhZykKKyAqIEBOTDgwMjExX1dPV0xBTl9UUklHX1BLVF9QQVRURVJOOiB3YWtlIHVwIG9uIHRoZSBzcGVjaWZpZWQgcGFja2V0IHBhdHRlcm5zCisgKgl3aGljaCBhcmUgcGFzc2VkIGluIGFuIGFycmF5IG9mIG5lc3RlZCBhdHRyaWJ1dGVzLCBlYWNoIG5lc3RlZCBhdHRyaWJ1dGUKKyAqCWRlZmluaW5nIGEgd2l0aCBhdHRyaWJ1dGVzIGZyb20gJnN0cnVjdCBubDgwMjExX3dvd2xhbl90cmlnX3BrdF9wYXR0ZXJuLgorICoJRWFjaCBwYXR0ZXJuIGRlZmluZXMgYSB3YWtldXAgcGFja2V0LiBUaGUgbWF0Y2hpbmcgaXMgZG9uZSBvbiB0aGUgTVNEVSwKKyAqCWkuZS4gYXMgdGhvdWdoIHRoZSBwYWNrZXQgd2FzIGFuIDgwMi4zIHBhY2tldCwgc28gdGhlIHBhdHRlcm4gbWF0Y2hpbmcKKyAqCWlzIGRvbmUgYWZ0ZXIgdGhlIHBhY2tldCBpcyBjb252ZXJ0ZWQgdG8gdGhlIE1TRFUuCisgKgorICoJSW4gJU5MODAyMTFfQVRUUl9XT1dMQU5fVFJJR0dFUlNfU1VQUE9SVEVELCBpdCBpcyBhIGJpbmFyeSBhdHRyaWJ1dGUKKyAqCWNhcnJ5aW5nIGEgJnN0cnVjdCBubDgwMjExX3dvd2xhbl9wYXR0ZXJuX3N1cHBvcnQuCisgKiBATkw4MDIxMV9XT1dMQU5fVFJJR19HVEtfUkVLRVlfU1VQUE9SVEVEOiBOb3QgYSByZWFsIHRyaWdnZXIsIGFuZCBjYW5ub3QgYmUKKyAqCXVzZWQgd2hlbiBzZXR0aW5nLCB1c2VkIG9ubHkgdG8gaW5kaWNhdGUgdGhhdCBHVEsgcmVrZXlpbmcgaXMgc3VwcG9ydGVkCisgKglieSB0aGUgZGV2aWNlIChmbGFnKQorICogQE5MODAyMTFfV09XTEFOX1RSSUdfR1RLX1JFS0VZX0ZBSUxVUkU6IHdha2UgdXAgb24gR1RLIHJla2V5IGZhaWx1cmUgKGlmCisgKglkb25lIGJ5IHRoZSBkZXZpY2UpIChmbGFnKQorICogQE5MODAyMTFfV09XTEFOX1RSSUdfRUFQX0lERU5UX1JFUVVFU1Q6IHdha2UgdXAgb24gRUFQIElkZW50aXR5IFJlcXVlc3QKKyAqCXBhY2tldCAoZmxhZykKKyAqIEBOTDgwMjExX1dPV0xBTl9UUklHXzRXQVlfSEFORFNIQUtFOiB3YWtlIHVwIG9uIDQtd2F5IGhhbmRzaGFrZSAoZmxhZykKKyAqIEBOTDgwMjExX1dPV0xBTl9UUklHX1JGS0lMTF9SRUxFQVNFOiB3YWtlIHVwIHdoZW4gcmZraWxsIGlzIHJlbGVhc2VkCisgKgkob24gZGV2aWNlcyB0aGF0IGhhdmUgcmZraWxsIGluIHRoZSBkZXZpY2UpIChmbGFnKQorICogQE5VTV9OTDgwMjExX1dPV0xBTl9UUklHOiBudW1iZXIgb2Ygd2FrZSBvbiB3aXJlbGVzcyB0cmlnZ2VycworICogQE1BWF9OTDgwMjExX1dPV0xBTl9UUklHOiBoaWdoZXN0IHdvd2xhbiB0cmlnZ2VyIGF0dHJpYnV0ZSBudW1iZXIKKyAqLworZW51bSBubDgwMjExX3dvd2xhbl90cmlnZ2VycyB7CisJX19OTDgwMjExX1dPV0xBTl9UUklHX0lOVkFMSUQsCisJTkw4MDIxMV9XT1dMQU5fVFJJR19BTlksCisJTkw4MDIxMV9XT1dMQU5fVFJJR19ESVNDT05ORUNULAorCU5MODAyMTFfV09XTEFOX1RSSUdfTUFHSUNfUEtULAorCU5MODAyMTFfV09XTEFOX1RSSUdfUEtUX1BBVFRFUk4sCisJTkw4MDIxMV9XT1dMQU5fVFJJR19HVEtfUkVLRVlfU1VQUE9SVEVELAorCU5MODAyMTFfV09XTEFOX1RSSUdfR1RLX1JFS0VZX0ZBSUxVUkUsCisJTkw4MDIxMV9XT1dMQU5fVFJJR19FQVBfSURFTlRfUkVRVUVTVCwKKwlOTDgwMjExX1dPV0xBTl9UUklHXzRXQVlfSEFORFNIQUtFLAorCU5MODAyMTFfV09XTEFOX1RSSUdfUkZLSUxMX1JFTEVBU0UsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlOVU1fTkw4MDIxMV9XT1dMQU5fVFJJRywKKwlNQVhfTkw4MDIxMV9XT1dMQU5fVFJJRyA9IE5VTV9OTDgwMjExX1dPV0xBTl9UUklHIC0gMQorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfaWZhY2VfbGltaXRfYXR0cnMgLSBsaW1pdCBhdHRyaWJ1dGVzCisgKiBATkw4MDIxMV9JRkFDRV9MSU1JVF9VTlNQRUM6IChyZXNlcnZlZCkKKyAqIEBOTDgwMjExX0lGQUNFX0xJTUlUX01BWDogbWF4aW11bSBudW1iZXIgb2YgaW50ZXJmYWNlcyB0aGF0CisgKgljYW4gYmUgY2hvc2VuIGZyb20gdGhpcyBzZXQgb2YgaW50ZXJmYWNlIHR5cGVzICh1MzIpCisgKiBATkw4MDIxMV9JRkFDRV9MSU1JVF9UWVBFUzogbmVzdGVkIGF0dHJpYnV0ZSBjb250YWluaW5nIGEKKyAqCWZsYWcgYXR0cmlidXRlIGZvciBlYWNoIGludGVyZmFjZSB0eXBlIGluIHRoaXMgc2V0CisgKiBATlVNX05MODAyMTFfSUZBQ0VfTElNSVQ6IG51bWJlciBvZiBhdHRyaWJ1dGVzCisgKiBATUFYX05MODAyMTFfSUZBQ0VfTElNSVQ6IGhpZ2hlc3QgYXR0cmlidXRlIG51bWJlcgorICovCitlbnVtIG5sODAyMTFfaWZhY2VfbGltaXRfYXR0cnMgeworCU5MODAyMTFfSUZBQ0VfTElNSVRfVU5TUEVDLAorCU5MODAyMTFfSUZBQ0VfTElNSVRfTUFYLAorCU5MODAyMTFfSUZBQ0VfTElNSVRfVFlQRVMsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlOVU1fTkw4MDIxMV9JRkFDRV9MSU1JVCwKKwlNQVhfTkw4MDIxMV9JRkFDRV9MSU1JVCA9IE5VTV9OTDgwMjExX0lGQUNFX0xJTUlUIC0gMQorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfaWZfY29tYmluYXRpb25fYXR0cnMgLS0gaW50ZXJmYWNlIGNvbWJpbmF0aW9uIGF0dHJpYnV0ZXMKKyAqCisgKiBATkw4MDIxMV9JRkFDRV9DT01CX1VOU1BFQzogKHJlc2VydmVkKQorICogQE5MODAyMTFfSUZBQ0VfQ09NQl9MSU1JVFM6IE5lc3RlZCBhdHRyaWJ1dGVzIGNvbnRhaW5pbmcgdGhlIGxpbWl0cworICoJZm9yIGdpdmVuIGludGVyZmFjZSB0eXBlcywgc2VlICZlbnVtIG5sODAyMTFfaWZhY2VfbGltaXRfYXR0cnMuCisgKiBATkw4MDIxMV9JRkFDRV9DT01CX01BWE5VTTogdTMyIGF0dHJpYnV0ZSBnaXZpbmcgdGhlIHRvdGFsIG51bWJlciBvZgorICoJaW50ZXJmYWNlcyB0aGF0IGNhbiBiZSBjcmVhdGVkIGluIHRoaXMgZ3JvdXAuIFRoaXMgbnVtYmVyIGRvZXNuJ3QKKyAqCWFwcGx5IHRvIGludGVyZmFjZXMgcHVyZWx5IG1hbmFnZWQgaW4gc29mdHdhcmUsIHdoaWNoIGFyZSBsaXN0ZWQKKyAqCWluIGEgc2VwYXJhdGUgYXR0cmlidXRlICVOTDgwMjExX0FUVFJfSU5URVJGQUNFU19TT0ZUV0FSRS4KKyAqIEBOTDgwMjExX0lGQUNFX0NPTUJfU1RBX0FQX0JJX01BVENIOiBmbGFnIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nIHRoYXQKKyAqCWJlYWNvbiBpbnRlcnZhbHMgd2l0aGluIHRoaXMgZ3JvdXAgbXVzdCBiZSBhbGwgdGhlIHNhbWUgZXZlbiBmb3IKKyAqCWluZnJhc3RydWN0dXJlIGFuZCBBUC9HTyBjb21iaW5hdGlvbnMsIGkuZS4gdGhlIEdPKHMpIG11c3QgYWRvcHQKKyAqCXRoZSBpbmZyYXN0cnVjdHVyZSBuZXR3b3JrJ3MgYmVhY29uIGludGVydmFsLgorICogQE5MODAyMTFfSUZBQ0VfQ09NQl9OVU1fQ0hBTk5FTFM6IHUzMiBhdHRyaWJ1dGUgc3BlY2lmeWluZyBob3cgbWFueQorICoJZGlmZmVyZW50IGNoYW5uZWxzIG1heSBiZSB1c2VkIHdpdGhpbiB0aGlzIGdyb3VwLgorICogQE5VTV9OTDgwMjExX0lGQUNFX0NPTUI6IG51bWJlciBvZiBhdHRyaWJ1dGVzCisgKiBATUFYX05MODAyMTFfSUZBQ0VfQ09NQjogaGlnaGVzdCBhdHRyaWJ1dGUgbnVtYmVyCisgKgorICogRXhhbXBsZXM6CisgKglsaW1pdHMgPSBbICN7U1RBfSA8PSAxLCAje0FQfSA8PSAxIF0sIG1hdGNoaW5nIEJJLCBjaGFubmVscyA9IDEsIG1heCA9IDIKKyAqCT0+IGFsbG93cyBhbiBBUCBhbmQgYSBTVEEgdGhhdCBtdXN0IG1hdGNoIEJJcworICoKKyAqCW51bWJlcnMgPSBbICN7QVAsIFAyUC1HT30gPD0gOCBdLCBjaGFubmVscyA9IDEsIG1heCA9IDgKKyAqCT0+IGFsbG93cyA4IG9mIEFQL0dPCisgKgorICoJbnVtYmVycyA9IFsgI3tTVEF9IDw9IDIgXSwgY2hhbm5lbHMgPSAyLCBtYXggPSAyCisgKgk9PiBhbGxvd3MgdHdvIFNUQXMgb24gZGlmZmVyZW50IGNoYW5uZWxzCisgKgorICoJbnVtYmVycyA9IFsgI3tTVEF9IDw9IDEsICN7UDJQLWNsaWVudCxQMlAtR099IDw9IDMgXSwgbWF4ID0gNAorICoJPT4gYWxsb3dzIGEgU1RBIHBsdXMgdGhyZWUgUDJQIGludGVyZmFjZXMKKyAqCisgKiBUaGUgbGlzdCBvZiB0aGVzZSBmb3VyIHBvc3NpYmxpdGllcyBjb3VsZCBjb21wbGV0ZWx5IGJlIGNvbnRhaW5lZAorICogd2l0aGluIHRoZSAlTkw4MDIxMV9BVFRSX0lOVEVSRkFDRV9DT01CSU5BVElPTlMgYXR0cmlidXRlIHRvIGluZGljYXRlCisgKiB0aGF0IGFueSBvZiB0aGVzZSBncm91cHMgbXVzdCBtYXRjaC4KKyAqCisgKiAiQ29tYmluYXRpb25zIiBvZiBqdXN0IGEgc2luZ2xlIGludGVyZmFjZSB3aWxsIG5vdCBiZSBsaXN0ZWQgaGVyZSwKKyAqIGEgc2luZ2xlIGludGVyZmFjZSBvZiBhbnkgdmFsaWQgaW50ZXJmYWNlIHR5cGUgaXMgYXNzdW1lZCB0byBhbHdheXMKKyAqIGJlIHBvc3NpYmxlIGJ5IGl0c2VsZi4gVGhpcyBtZWFucyB0aGF0IGltcGxpY2l0bHksIGZvciBlYWNoIHZhbGlkCisgKiBpbnRlcmZhY2UgdHlwZSwgdGhlIGZvbGxvd2luZyBncm91cCBhbHdheXMgZXhpc3RzOgorICoJbnVtYmVycyA9IFsgI3s8dHlwZT59IDw9IDEgXSwgY2hhbm5lbHMgPSAxLCBtYXggPSAxCisgKi8KK2VudW0gbmw4MDIxMV9pZl9jb21iaW5hdGlvbl9hdHRycyB7CisJTkw4MDIxMV9JRkFDRV9DT01CX1VOU1BFQywKKwlOTDgwMjExX0lGQUNFX0NPTUJfTElNSVRTLAorCU5MODAyMTFfSUZBQ0VfQ09NQl9NQVhOVU0sCisJTkw4MDIxMV9JRkFDRV9DT01CX1NUQV9BUF9CSV9NQVRDSCwKKwlOTDgwMjExX0lGQUNFX0NPTUJfTlVNX0NIQU5ORUxTLAorCisJLyoga2VlcCBsYXN0ICovCisJTlVNX05MODAyMTFfSUZBQ0VfQ09NQiwKKwlNQVhfTkw4MDIxMV9JRkFDRV9DT01CID0gTlVNX05MODAyMTFfSUZBQ0VfQ09NQiAtIDEKK307CisKKworLyoqCisgKiBlbnVtIG5sODAyMTFfcGxpbmtfc3RhdGUgLSBzdGF0ZSBvZiBhIG1lc2ggcGVlciBsaW5rIGZpbml0ZSBzdGF0ZSBtYWNoaW5lCisgKgorICogQE5MODAyMTFfUExJTktfTElTVEVOOiBpbml0aWFsIHN0YXRlLCBjb25zaWRlcmVkIHRoZSBpbXBsaWNpdAorICoJc3RhdGUgb2Ygbm9uIGV4aXN0YW50IG1lc2ggcGVlciBsaW5rcworICogQE5MODAyMTFfUExJTktfT1BOX1NOVDogbWVzaCBwbGluayBvcGVuIGZyYW1lIGhhcyBiZWVuIHNlbnQgdG8KKyAqCXRoaXMgbWVzaCBwZWVyCisgKiBATkw4MDIxMV9QTElOS19PUE5fUkNWRDogbWVzaCBwbGluayBvcGVuIGZyYW1lIGhhcyBiZWVuIHJlY2VpdmVkCisgKglmcm9tIHRoaXMgbWVzaCBwZWVyCisgKiBATkw4MDIxMV9QTElOS19DTkZfUkNWRDogbWVzaCBwbGluayBjb25maXJtIGZyYW1lIGhhcyBiZWVuCisgKglyZWNlaXZlZCBmcm9tIHRoaXMgbWVzaCBwZWVyCisgKiBATkw4MDIxMV9QTElOS19FU1RBQjogbWVzaCBwZWVyIGxpbmsgaXMgZXN0YWJsaXNoZWQKKyAqIEBOTDgwMjExX1BMSU5LX0hPTERJTkc6IG1lc2ggcGVlciBsaW5rIGlzIGJlaW5nIGNsb3NlZCBvciBjYW5jZWxsZWQKKyAqIEBOTDgwMjExX1BMSU5LX0JMT0NLRUQ6IGFsbCBmcmFtZXMgdHJhbnNtaXR0ZWQgZnJvbSB0aGlzIG1lc2gKKyAqCXBsaW5rIGFyZSBkaXNjYXJkZWQKKyAqIEBOVU1fTkw4MDIxMV9QTElOS19TVEFURVM6IG51bWJlciBvZiBwZWVyIGxpbmsgc3RhdGVzCisgKiBATUFYX05MODAyMTFfUExJTktfU1RBVEVTOiBoaWdoZXN0IG51bWVyaWNhbCB2YWx1ZSBvZiBwbGluayBzdGF0ZXMKKyAqLworZW51bSBubDgwMjExX3BsaW5rX3N0YXRlIHsKKwlOTDgwMjExX1BMSU5LX0xJU1RFTiwKKwlOTDgwMjExX1BMSU5LX09QTl9TTlQsCisJTkw4MDIxMV9QTElOS19PUE5fUkNWRCwKKwlOTDgwMjExX1BMSU5LX0NORl9SQ1ZELAorCU5MODAyMTFfUExJTktfRVNUQUIsCisJTkw4MDIxMV9QTElOS19IT0xESU5HLAorCU5MODAyMTFfUExJTktfQkxPQ0tFRCwKKworCS8qIGtlZXAgbGFzdCAqLworCU5VTV9OTDgwMjExX1BMSU5LX1NUQVRFUywKKwlNQVhfTkw4MDIxMV9QTElOS19TVEFURVMgPSBOVU1fTkw4MDIxMV9QTElOS19TVEFURVMgLSAxCit9OworCisjZGVmaW5lIE5MODAyMTFfS0NLX0xFTgkJCTE2CisjZGVmaW5lIE5MODAyMTFfS0VLX0xFTgkJCTE2CisjZGVmaW5lIE5MODAyMTFfUkVQTEFZX0NUUl9MRU4JCTgKKworLyoqCisgKiBlbnVtIG5sODAyMTFfcmVrZXlfZGF0YSAtIGF0dHJpYnV0ZXMgZm9yIEdUSyByZWtleSBvZmZsb2FkCisgKiBAX19OTDgwMjExX1JFS0VZX0RBVEFfSU5WQUxJRDogaW52YWxpZCBudW1iZXIgZm9yIG5lc3RlZCBhdHRyaWJ1dGVzCisgKiBATkw4MDIxMV9SRUtFWV9EQVRBX0tFSzoga2V5IGVuY3J5cHRpb24ga2V5IChiaW5hcnkpCisgKiBATkw4MDIxMV9SRUtFWV9EQVRBX0tDSzoga2V5IGNvbmZpcm1hdGlvbiBrZXkgKGJpbmFyeSkKKyAqIEBOTDgwMjExX1JFS0VZX0RBVEFfUkVQTEFZX0NUUjogcmVwbGF5IGNvdW50ZXIgKGJpbmFyeSkKKyAqIEBOVU1fTkw4MDIxMV9SRUtFWV9EQVRBOiBudW1iZXIgb2YgcmVrZXkgYXR0cmlidXRlcyAoaW50ZXJuYWwpCisgKiBATUFYX05MODAyMTFfUkVLRVlfREFUQTogaGlnaGVzdCByZWtleSBhdHRyaWJ1dGUgKGludGVybmFsKQorICovCitlbnVtIG5sODAyMTFfcmVrZXlfZGF0YSB7CisJX19OTDgwMjExX1JFS0VZX0RBVEFfSU5WQUxJRCwKKwlOTDgwMjExX1JFS0VZX0RBVEFfS0VLLAorCU5MODAyMTFfUkVLRVlfREFUQV9LQ0ssCisJTkw4MDIxMV9SRUtFWV9EQVRBX1JFUExBWV9DVFIsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlOVU1fTkw4MDIxMV9SRUtFWV9EQVRBLAorCU1BWF9OTDgwMjExX1JFS0VZX0RBVEEgPSBOVU1fTkw4MDIxMV9SRUtFWV9EQVRBIC0gMQorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfaGlkZGVuX3NzaWQgLSB2YWx1ZXMgZm9yICVOTDgwMjExX0FUVFJfSElEREVOX1NTSUQKKyAqIEBOTDgwMjExX0hJRERFTl9TU0lEX05PVF9JTl9VU0U6IGRvIG5vdCBoaWRlIFNTSUQgKGkuZS4sIGJyb2FkY2FzdCBpdCBpbgorICoJQmVhY29uIGZyYW1lcykKKyAqIEBOTDgwMjExX0hJRERFTl9TU0lEX1pFUk9fTEVOOiBoaWRlIFNTSUQgYnkgdXNpbmcgemVyby1sZW5ndGggU1NJRCBlbGVtZW50CisgKglpbiBCZWFjb24gZnJhbWVzCisgKiBATkw4MDIxMV9ISURERU5fU1NJRF9aRVJPX0NPTlRFTlRTOiBoaWRlIFNTSUQgYnkgdXNpbmcgY29ycmVjdCBsZW5ndGggb2YgU1NJRAorICoJZWxlbWVudCBpbiBCZWFjb24gZnJhbWVzIGJ1dCB6ZXJvIG91dCBlYWNoIGJ5dGUgaW4gdGhlIFNTSUQKKyAqLworZW51bSBubDgwMjExX2hpZGRlbl9zc2lkIHsKKwlOTDgwMjExX0hJRERFTl9TU0lEX05PVF9JTl9VU0UsCisJTkw4MDIxMV9ISURERU5fU1NJRF9aRVJPX0xFTiwKKwlOTDgwMjExX0hJRERFTl9TU0lEX1pFUk9fQ09OVEVOVFMKK307CisKKy8qKgorICogZW51bSBubDgwMjExX3N0YV93bWVfYXR0ciAtIHN0YXRpb24gV01FIGF0dHJpYnV0ZXMKKyAqIEBfX05MODAyMTFfU1RBX1dNRV9JTlZBTElEOiBpbnZhbGlkIG51bWJlciBmb3IgbmVzdGVkIGF0dHJpYnV0ZQorICogQE5MODAyMTFfU1RBX1dNRV9VQVBTRF9RVUVVRVM6IGJpdG1hcCBvZiB1YXBzZCBxdWV1ZXMuIHRoZSBmb3JtYXQKKyAqCWlzIHRoZSBzYW1lIGFzIHRoZSBBQyBiaXRtYXAgaW4gdGhlIFFvUyBpbmZvIGZpZWxkLgorICogQE5MODAyMTFfU1RBX1dNRV9NQVhfU1A6IG1heCBzZXJ2aWNlIHBlcmlvZC4gdGhlIGZvcm1hdCBpcyB0aGUgc2FtZQorICoJYXMgdGhlIE1BWF9TUCBmaWVsZCBpbiB0aGUgUW9TIGluZm8gZmllbGQgKGJ1dCBhbHJlYWR5IHNoaWZ0ZWQgZG93bikuCisgKiBAX19OTDgwMjExX1NUQV9XTUVfQUZURVJfTEFTVDogaW50ZXJuYWwKKyAqIEBOTDgwMjExX1NUQV9XTUVfTUFYOiBoaWdoZXN0IHN0YXRpb24gV01FIGF0dHJpYnV0ZQorICovCitlbnVtIG5sODAyMTFfc3RhX3dtZV9hdHRyIHsKKwlfX05MODAyMTFfU1RBX1dNRV9JTlZBTElELAorCU5MODAyMTFfU1RBX1dNRV9VQVBTRF9RVUVVRVMsCisJTkw4MDIxMV9TVEFfV01FX01BWF9TUCwKKworCS8qIGtlZXAgbGFzdCAqLworCV9fTkw4MDIxMV9TVEFfV01FX0FGVEVSX0xBU1QsCisJTkw4MDIxMV9TVEFfV01FX01BWCA9IF9fTkw4MDIxMV9TVEFfV01FX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9wbWtzYV9jYW5kaWRhdGVfYXR0ciAtIGF0dHJpYnV0ZXMgZm9yIFBNS1NBIGNhY2hpbmcgY2FuZGlkYXRlcworICogQF9fTkw4MDIxMV9QTUtTQV9DQU5ESURBVEVfSU5WQUxJRDogaW52YWxpZCBudW1iZXIgZm9yIG5lc3RlZCBhdHRyaWJ1dGVzCisgKiBATkw4MDIxMV9QTUtTQV9DQU5ESURBVEVfSU5ERVg6IGNhbmRpZGF0ZSBpbmRleCAodTMyOyB0aGUgc21hbGxlciwgdGhlIGhpZ2hlcgorICoJcHJpb3JpdHkpCisgKiBATkw4MDIxMV9QTUtTQV9DQU5ESURBVEVfQlNTSUQ6IGNhbmRpZGF0ZSBCU1NJRCAoNiBvY3RldHMpCisgKiBATkw4MDIxMV9QTUtTQV9DQU5ESURBVEVfUFJFQVVUSDogUlNOIHByZS1hdXRoZW50aWNhdGlvbiBzdXBwb3J0ZWQgKGZsYWcpCisgKiBATlVNX05MODAyMTFfUE1LU0FfQ0FORElEQVRFOiBudW1iZXIgb2YgUE1LU0EgY2FjaGluZyBjYW5kaWRhdGUgYXR0cmlidXRlcworICoJKGludGVybmFsKQorICogQE1BWF9OTDgwMjExX1BNS1NBX0NBTkRJREFURTogaGlnaGVzdCBQTUtTQSBjYWNoaW5nIGNhbmRpZGF0ZSBhdHRyaWJ1dGUKKyAqCShpbnRlcm5hbCkKKyAqLworZW51bSBubDgwMjExX3Bta3NhX2NhbmRpZGF0ZV9hdHRyIHsKKwlfX05MODAyMTFfUE1LU0FfQ0FORElEQVRFX0lOVkFMSUQsCisJTkw4MDIxMV9QTUtTQV9DQU5ESURBVEVfSU5ERVgsCisJTkw4MDIxMV9QTUtTQV9DQU5ESURBVEVfQlNTSUQsCisJTkw4MDIxMV9QTUtTQV9DQU5ESURBVEVfUFJFQVVUSCwKKworCS8qIGtlZXAgbGFzdCAqLworCU5VTV9OTDgwMjExX1BNS1NBX0NBTkRJREFURSwKKwlNQVhfTkw4MDIxMV9QTUtTQV9DQU5ESURBVEUgPSBOVU1fTkw4MDIxMV9QTUtTQV9DQU5ESURBVEUgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV90ZGxzX29wZXJhdGlvbiAtIHZhbHVlcyBmb3IgJU5MODAyMTFfQVRUUl9URExTX09QRVJBVElPTgorICogQE5MODAyMTFfVERMU19ESVNDT1ZFUllfUkVROiBTZW5kIGEgVERMUyBkaXNjb3ZlcnkgcmVxdWVzdAorICogQE5MODAyMTFfVERMU19TRVRVUDogU2V0dXAgVERMUyBsaW5rCisgKiBATkw4MDIxMV9URExTX1RFQVJET1dOOiBUZWFyZG93biBhIFRETFMgbGluayB3aGljaCBpcyBhbHJlYWR5IGVzdGFibGlzaGVkCisgKiBATkw4MDIxMV9URExTX0VOQUJMRV9MSU5LOiBFbmFibGUgVERMUyBsaW5rCisgKiBATkw4MDIxMV9URExTX0RJU0FCTEVfTElOSzogRGlzYWJsZSBURExTIGxpbmsKKyAqLworZW51bSBubDgwMjExX3RkbHNfb3BlcmF0aW9uIHsKKwlOTDgwMjExX1RETFNfRElTQ09WRVJZX1JFUSwKKwlOTDgwMjExX1RETFNfU0VUVVAsCisJTkw4MDIxMV9URExTX1RFQVJET1dOLAorCU5MODAyMTFfVERMU19FTkFCTEVfTElOSywKKwlOTDgwMjExX1RETFNfRElTQUJMRV9MSU5LLAorfTsKKworI2VuZGlmIC8qIF9fTElOVVhfTkw4MDIxMV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L251YnVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L251YnVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiMDNlNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbnVidXMuaApAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAgbnVidXMuaDogdmFyaW91cyBkZWZpbml0aW9ucyBhbmQgcHJvdG90eXBlcyBmb3IgTnVCdXMgZHJpdmVycyB0byB1c2UuCisKKyAgT3JpZ2luYWxseSB3cml0dGVuIGJ5IEFsYW4gQ294LgorCisgIEhhY2tlZCB0byBkZWF0aCBieSBDLiBTY290dCBBbmFuaWFuIGFuZCBEYXZpZCBIdWdnaW5zLURhaW5lcy4KKyAgCisgIFNvbWUgb2YgdGhlIGNvbnN0YW50cyBpbiBoZXJlIGFyZSBmcm9tIHRoZSBjb3JyZXNwb25kaW5nCisgIE5ldEJTRC9PcGVuQlNEIGhlYWRlciBmaWxlLCBieSBBbGxlbiBCcmlnZ3MuICBXZSBmaWd1cmVkIG91dCB0aGUKKyAgcmVzdCBvZiB0aGVtIG9uIG91ciBvd24uICovCisKKyNpZm5kZWYgTElOVVhfTlVCVVNfSAorI2RlZmluZSBMSU5VWF9OVUJVU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIG51YnVzX2NhdGVnb3J5IHsKKwlOVUJVU19DQVRfQk9BUkQgICAgICAgICAgPSAweDAwMDEsCisJTlVCVVNfQ0FUX0RJU1BMQVkgICAgICAgID0gMHgwMDAzLAorCU5VQlVTX0NBVF9ORVRXT1JLICAgICAgICA9IDB4MDAwNCwKKwlOVUJVU19DQVRfQ09NTVVOSUNBVElPTlMgPSAweDAwMDYsCisJTlVCVVNfQ0FUX0ZPTlQgICAgICAgICAgID0gMHgwMDA5LAorCU5VQlVTX0NBVF9DUFUgICAgICAgICAgICA9IDB4MDAwQSwKKwkvKiBGb3IgbGFjayBvZiBhIGJldHRlciBuYW1lICovCisJTlVCVVNfQ0FUX0RVT0RPQ0sgICAgICAgID0gMHgwMDIwCit9OworCitlbnVtIG51YnVzX3R5cGVfbmV0d29yayB7CisJTlVCVVNfVFlQRV9FVEhFUk5FVCAgICAgID0gMHgwMDAxLAorCU5VQlVTX1RZUEVfUlMyMzIgICAgICAgICA9IDB4MDAwMgorfTsKKworZW51bSBudWJ1c190eXBlX2Rpc3BsYXkgeworCU5VQlVTX1RZUEVfVklERU8gICAgICAgICA9IDB4MDAwMQorfTsKKworZW51bSBudWJ1c190eXBlX2NwdSB7CisJTlVCVVNfVFlQRV82ODAyMCAgICAgICAgID0gMHgwMDAzLAorCU5VQlVTX1RZUEVfNjgwMzAgICAgICAgICA9IDB4MDAwNCwKKwlOVUJVU19UWVBFXzY4MDQwICAgICAgICAgPSAweDAwMDUKK307CisKKy8qIEtub3duIDxDYXQsVHlwZSxTVyxIVz4gdHVwbGVzOiAoYWNjb3JkaW5nIHRvIFRhdHRsZVRlY2ggYW5kIFNsb3RzKQorICogIDY4MDMwIG1vdGhlcmJvYXJkczogPDEwLDQsMCwyND4KKyAqICA2ODA0MCBtb3RoZXJib2FyZHM6IDwxMCw1LDAsMjQ+CisgKiAgRHVvRG9jayBQbHVzOiA8MzIsMSwxLDI+CisgKgorICogIFRvYnkgRnJhbWUgQnVmZmVyIGNhcmQ6IDwzLDEsMSwxPgorICogIFJCViBidWlsdC1pbiB2aWRlbyAoSUljaSk6IDwzLDEsMSwyND4KKyAqICBWYWxreXJpZSBidWlsdC1pbiB2aWRlbyAoUTYzMCk6IDwzLDEsMSw0Nj4KKyAqICBNYWNpbnRvc2ggRGlzcGxheSBDYXJkOiA8MywxLDEsMjU+CisgKiAgU29ub3JhIGJ1aWx0LWluIHZpZGVvIChQNDYwKTogPDMsMSwxLDM0PgorICogIEpldCBmcmFtZWJ1ZmZlciAoRHVvRG9jayBQbHVzKTogPDMsMSwxLDQxPgorICoKKyAqICBTT05JQyBjb21tLXNsb3Qvb24tYm9hcmQgYW5kIER1b0RvY2sgRXRoZXJuZXQ6IDw0LDEsMSwyNzI+CisgKiAgU09OSUMgTEMtUERTIEV0aGVybmV0IChEYXluYSwgYnV0IGxpa2UgQXBwbGUgMTYtYml0LCBzb3J0IG9mKTogPDQsMSwxLDI3MT4KKyAqICBBcHBsZSBTT05JQyBMQy1QRFMgRXRoZXJuZXQgKCJBcHBsZSBFdGhlcm5ldCBMQyBUd2lzdGVkLVBhaXIgQ2FyZCIpOiA8NCwxLDAsMjgxPgorICogIFNvbmljIFN5c3RlbXMgRXRoZXJuZXQgQS1TZXJpZXMgQ2FyZDogPDQsMSwyNjgsMjU2PgorICogIEFzYW50ZSBNYWNDb24gTnVCdXMtQTogPDQsMSwyNjAsMjU2PiAoYWxwaGEtMS4wLDEuMSByZXZpc2lvbikKKyAqICAgUk9NIG9uIHRoZSBhYm92ZSBjYXJkOiA8MiwxLDAsMD4KKyAqICBDYWJsZXRyb24gZXRoZXJuZXQgY2FyZDogPDQsMSwxLDI2NT4KKyAqICBGYXJhbGxvbiBldGhlcm5ldCBjYXJkOiA8NCwxLDI2OCwyNTY+IChpZGVudGljYWwgdG8gU29uaWMgU3lzdGVtcyBjYXJkKQorICogIEtpbmV0aWNzIEV0aGVyUG9ydCBJSU46IDw0LDEsMjU5LDI2Mj4KKyAqICBBUEkgRW5naW5lZXJpbmcgRXRoZXJSdW5fTENhIFBEUyBlbmV0IGNhcmQ6IDw0LDEsMjgyLDI1Nj4KKyAqCisgKiAgQWRkIHlvdXIgZGV2aWNlcyB0byB0aGUgbGlzdCEgIFlvdSBjYW4gb2J0YWluIHRoZSAiU2xvdHMiIHV0aWxpdHkKKyAqICBmcm9tIEFwcGxlJ3MgRlRQIHNpdGUgYXQ6CisgKiAgZnRwOi8vZGV2LmFwcGxlLmNvbS9kZXZ3b3JsZC9Ub29sX0NoZXN0L0RldmljZXNfLV9IYXJkd2FyZS9OdUJ1c19TbG90X01hbmFnZXIvCisgKgorICogIEFsdGVybmF0ZWx5LCBUYXR0bGVUZWNoIGNhbiBiZSBmb3VuZCBhdCBhbnkgSW5mby1NYWMgbWlycm9yIHNpdGUuICAKKyAqICBvciBmcm9tIGl0cyBkaXN0cmlidXRpb24gc2l0ZTogZnRwOi8vZnRwLmRlY2lzbWtyLmNvbS9kbXMKKyAqLworCisvKiBEclNXOiBVbmlxdWVseSBpZGVudGlmaWVzIHRoZSBzb2Z0d2FyZSBpbnRlcmZhY2UgdG8gYSBib2FyZC4gIFRoaXMKKyAgIGlzIHVzdWFsbHkgdGhlIG9uZSB5b3Ugd2FudCB0byBsb29rIGF0IHdoZW4gd3JpdGluZyBhIGRyaXZlci4gIEl0J3MKKyAgIG5vdCBhcyB1c2VmdWwgYXMgeW91IHRoaW5rLCB0aG91Z2gsIGJlY2F1c2UgYXMgd2Ugc2hvdWxkIGtub3cgYnkKKyAgIG5vdyAoZHVoKSwgIkFwcGxlIENvbXBhdGlibGUiIGNhbiBtZWFuIGEgbG90IG9mIHRoaW5ncy4uLiAqLworCisvKiBBZGQga25vd24gRHJTVyB2YWx1ZXMgaGVyZSAqLworZW51bSBudWJ1c19kcnN3IHsKKwkvKiBOVUJVU19DQVRfRElTUExBWSAqLworCU5VQlVTX0RSU1dfQVBQTEUgICAgICAgID0gMHgwMDAxLAorCU5VQlVTX0RSU1dfQVBQTEVfSElSRVMgID0gMHgwMDEzLCAvKiBNYWNJSSBIaVJlcyBjYXJkIGRyaXZlciAqLworCQorCS8qIE5VQlVTX0NBVF9ORVRXT1JLICovCisJTlVCVVNfRFJTV18zQ09NICAgICAgICAgPSAweDAwMDAsCisJTlVCVVNfRFJTV19DQUJMRVRST04gICAgPSAweDAwMDEsCisJTlVCVVNfRFJTV19TT05JQ19MQyAgICAgPSAweDAwMDEsCisJTlVCVVNfRFJTV19LSU5FVElDUyAgICAgPSAweDAxMDMsCisJTlVCVVNfRFJTV19BU0FOVEUgICAgICAgPSAweDAxMDQsCisJTlVCVVNfRFJTV19URUNIV09SS1MgICAgPSAweDAxMDksCisJTlVCVVNfRFJTV19EQVlOQSAgICAgICAgPSAweDAxMGIsCisJTlVCVVNfRFJTV19GQVJBTExPTiAgICAgPSAweDAxMGMsCisJTlVCVVNfRFJTV19BUFBMRV9TTiAgICAgPSAweDAxMGYsCisJTlVCVVNfRFJTV19EQVlOQTIgICAgICAgPSAweDAxMTUsCisJTlVCVVNfRFJTV19GT0NVUyAgICAgICAgPSAweDAxMWEsCisJTlVCVVNfRFJTV19BU0FOVEVfQ1MgICAgPSAweDAxMWQsIC8qIHVzZSBhc2FudGUgU01DOTE5NCBkcml2ZXIgKi8KKwlOVUJVU19EUlNXX0RBWU5BX0xDICAgICA9IDB4MDExZSwKKworCS8qIE5VQlVTX0NBVF9DUFUgKi8KKwlOVUJVU19EUlNXX05PTkUgICAgICAgICA9IDB4MDAwMCwKK307CisKKy8qIERySFc6IFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGhhcmR3YXJlIGludGVyZmFjZSB0byBhIGJvYXJkIChvciBhdAorICAgbGVhc3QsIGl0IHNob3VsZC4uLiAgc29tZSB2aWRlbyBjYXJkcyBhcmUga25vd24gdG8gaW5jb3JyZWN0bHkKKyAgIGlkZW50aWZ5IHRoZW1zZWx2ZXMgYXMgVG9ieSBjYXJkcykgKi8KKworLyogQWRkIGtub3duIERySFcgdmFsdWVzIGhlcmUgKi8KK2VudW0gbnVidXNfZHJodyB7CisJLyogTlVCVVNfQ0FUX0RJU1BMQVkgKi8KKwlOVUJVU19EUkhXX0FQUExFX1RGQiAgICAgID0gMHgwMDAxLCAvKiBUb2J5IGZyYW1lIGJ1ZmZlciBjYXJkICovCisJTlVCVVNfRFJIV19BUFBMRV9XVkMgICAgICA9IDB4MDAwNiwgLyogQXBwbGUgV29ya3N0YXRpb24gVmlkZW8gQ2FyZCAqLworCU5VQlVTX0RSSFdfU0lHTUFfQ0xSTUFYICAgPSAweDAwMDcsIC8qIFNpZ21hIERlc2lnbiBDb2xvck1heCAqLworCU5VQlVTX0RSSFdfQVBQTEVfU0UzMCAgICAgPSAweDAwMDksIC8qIEFwcGxlIFNFLzMwIHZpZGVvICovCisJTlVCVVNfRFJIV19BUFBMRV9IUlZDICAgICA9IDB4MDAxMywgLyogTWFjIElJIEhpZ2gtUmVzIFZpZGVvIENhcmQgKi8KKwlOVUJVU19EUkhXX0FQUExFX1BWQyAgICAgID0gMHgwMDE3LCAvKiBNYWMgSUkgUG9ydHJhaXQgVmlkZW8gQ2FyZCAqLworCU5VQlVTX0RSSFdfQVBQTEVfUkJWMSAgICAgPSAweDAwMTgsIC8qIElJY2kgUkJWIHZpZGVvICovCisJTlVCVVNfRFJIV19BUFBMRV9NREMgICAgICA9IDB4MDAxOSwgLyogTWFjaW50b3NoIERpc3BsYXkgQ2FyZCAqLworCU5VQlVTX0RSSFdfQVBQTEVfU09OT1JBICAgPSAweDAwMjIsIC8qIFNvbm9yYSBidWlsdC1pbiB2aWRlbyAqLworCU5VQlVTX0RSSFdfQVBQTEVfMjRBQyAgICAgPSAweDAwMmIsIC8qIE1hYyAyNEFDIFZpZGVvIENhcmQgKi8KKwlOVUJVU19EUkhXX0FQUExFX1ZBTEtZUklFID0gMHgwMDJlLAorCU5VQlVTX0RSSFdfQVBQTEVfSkVUICAgICAgPSAweDAwMjksIC8qIEpldCBmcmFtZWJ1ZmZlciAoRHVvRG9jaykgKi8KKwlOVUJVU19EUkhXX1NNQUNfR0ZYICAgICAgID0gMHgwMTA1LCAvKiBTdXBlck1hYyBHRlggKi8KKwlOVUJVU19EUkhXX1JBU1RFUl9DQjI2NCAgID0gMHgwMTNCLCAvKiBSYXN0ZXJPcHMgQ29sb3JCb2FyZCAyNjQgKi8KKwlOVUJVU19EUkhXX01JQ1JPTl9YQ0VFRCAgID0gMHgwMTQ2LCAvKiBNaWNyb24gRXhjZWVkIGNvbG9yICovCisJTlVCVVNfRFJIV19SRElVU19HU0MgICAgICA9IDB4MDE1MywgLyogUmFkaXVzIEdTL0MgKi8KKwlOVUJVU19EUkhXX1NNQUNfU1BFQzggICAgID0gMHgwMTdCLCAvKiBTdXBlck1hYyBTcGVjdHJ1bS84ICovCisJTlVCVVNfRFJIV19TTUFDX1NQRUMyNCAgICA9IDB4MDE3QywgLyogU3VwZXJNYWMgU3BlY3RydW0vMjQgKi8KKwlOVUJVU19EUkhXX1JBU1RFUl9DQjM2NCAgID0gMHgwMjZGLCAvKiBSYXN0ZXJPcHMgQ29sb3JCb2FyZCAzNjQgKi8KKwlOVUJVU19EUkhXX1JESVVTX0RDR1ggICAgID0gMHgwMjdDLCAvKiBSYWRpdXMgRGlyZWN0Q29sb3IvR1ggKi8KKwlOVUJVU19EUkhXX1JESVVTX1BDOCAgICAgID0gMHgwMjkxLCAvKiBSYWRpdXMgUHJlY2lzaW9uQ29sb3IgOCAqLworCU5VQlVTX0RSSFdfTEFQSVNfUENTOCAgICAgPSAweDAyOTIsIC8qIExhcGlzIFByb0NvbG9yU2VydmVyIDggKi8KKwlOVUJVU19EUkhXX1JBU1RFUl8yNFhMSSAgID0gMHgwMkEwLCAvKiBSYXN0ZXJPcHMgOC8yNCBYTGkgKi8KKwlOVUJVU19EUkhXX1JBU1RFUl9QQlBHVCAgID0gMHgwMkE1LCAvKiBSYXN0ZXJPcHMgUGFpbnRCb2FyZCBQcmlzbSBHVCAqLworCU5VQlVTX0RSSFdfRU1BQ0hfRlNYICAgICAgPSAweDAyQUUsIC8qIEUtTWFjaGluZXMgRnV0dXJhIFNYICovCisJTlVCVVNfRFJIV19SQVNURVJfMjRYTFRWICA9IDB4MDJCNywgLyogUmFzdGVyT3BzIDI0WExUViAqLworCU5VQlVTX0RSSFdfU01BQ19USFVORDI0ICAgPSAweDAyQ0IsIC8qIFN1cGVyTWFjIFRodW5kZXIvMjQgKi8KKwlOVUJVU19EUkhXX1NNQUNfVEhVTkRMR0hUID0gMHgwM0Q5LCAvKiBTdXBlck1hYyBUaHVuZGVyTGlnaHQgKi8KKwlOVUJVU19EUkhXX1JESVVTX1BDMjRYUCAgID0gMHgwNDA2LCAvKiBSYWRpdXMgUHJlY2lzaW9uQ29sb3IgMjRYcCAqLworCU5VQlVTX0RSSFdfUkRJVVNfUEMyNFggICAgPSAweDA0MEEsIC8qIFJhZGl1cyBQcmVjaXNpb25Db2xvciAyNFggKi8KKwlOVUJVU19EUkhXX1JESVVTX1BDOFhKICAgID0gMHgwNDBCLCAvKiBSYWRpdXMgUHJlY2lzaW9uQ29sb3IgOFhKICovCisJCisJLyogTlVCVVNfQ0FUX05FVFdPUksgKi8KKwlOVUJVU19EUkhXX0lOVEVSTEFOICAgICAgID0gMHgwMTAwLAorCU5VQlVTX0RSSFdfU01DOTE5NCAgICAgICAgPSAweDAxMDEsCisJTlVCVVNfRFJIV19LSU5FVElDUyAgICAgICA9IDB4MDEwNiwKKwlOVUJVU19EUkhXX0NBQkxFVFJPTiAgICAgID0gMHgwMTA5LAorCU5VQlVTX0RSSFdfQVNBTlRFX0xDICAgICAgPSAweDAxMGYsCisJTlVCVVNfRFJIV19TT05JQyAgICAgICAgICA9IDB4MDExMCwKKwlOVUJVU19EUkhXX1RFQ0hXT1JLUyAgICAgID0gMHgwMTEyLAorCU5VQlVTX0RSSFdfQVBQTEVfU09OSUNfTkIgPSAweDAxMTgsCisJTlVCVVNfRFJIV19BUFBMRV9TT05JQ19MQyA9IDB4MDExOSwKKwlOVUJVU19EUkhXX0ZPQ1VTICAgICAgICAgID0gMHgwMTFjLAorCU5VQlVTX0RSSFdfU09OTkVUICAgICAgICAgPSAweDAxMWQsCit9OworCisvKiBSZXNvdXJjZSBJRHM6IFRoZXNlIGFyZSB0aGUgaWRlbnRpZmllcnMgZm9yIHRoZSB2YXJpb3VzIHdlaXJkIGFuZAorICAgd29uZGVyZnVsIHRpZGJpdHMgb2YgaW5mb3JtYXRpb24gdGhhdCBtYXkgb3IgbWF5IG5vdCByZXNpZGUgaW4gdGhlCisgICBOdUJ1cyBST00gZGlyZWN0b3J5LiAqLworZW51bSBudWJ1c19yZXNfaWQgeworCU5VQlVTX1JFU0lEX1RZUEUgICAgICAgICA9IDB4MDAwMSwKKwlOVUJVU19SRVNJRF9OQU1FICAgICAgICAgPSAweDAwMDIsCisJTlVCVVNfUkVTSURfSUNPTiAgICAgICAgID0gMHgwMDAzLAorCU5VQlVTX1JFU0lEX0RSVlJESVIgICAgICA9IDB4MDAwNCwKKwlOVUJVU19SRVNJRF9MT0FEUkVDICAgICAgPSAweDAwMDUsCisJTlVCVVNfUkVTSURfQk9PVFJFQyAgICAgID0gMHgwMDA2LAorCU5VQlVTX1JFU0lEX0ZMQUdTICAgICAgICA9IDB4MDAwNywKKwlOVUJVU19SRVNJRF9IV0RFVklEICAgICAgPSAweDAwMDgsCisJTlVCVVNfUkVTSURfTUlOT1JfQkFTRU9TID0gMHgwMDBhLAorCU5VQlVTX1JFU0lEX01JTk9SX0xFTkdUSCA9IDB4MDAwYiwKKwlOVUJVU19SRVNJRF9NQUpPUl9CQVNFT1MgPSAweDAwMGMsCisJTlVCVVNfUkVTSURfTUFKT1JfTEVOR1RIID0gMHgwMDBkLAorCU5VQlVTX1JFU0lEX0NJQ04gICAgICAgICA9IDB4MDAwZiwKKwlOVUJVU19SRVNJRF9JQ0w4ICAgICAgICAgPSAweDAwMTAsCisJTlVCVVNfUkVTSURfSUNMNCAgICAgICAgID0gMHgwMDExLAorfTsKKworLyogQ2F0ZWdvcnktc3BlY2lmaWMgcmVzb3VyY2VzLiAqLworZW51bSBudWJ1c19ib2FyZF9yZXNfaWQgeworCU5VQlVTX1JFU0lEX0JPQVJESUQgICAgICA9IDB4MDAyMCwKKwlOVUJVU19SRVNJRF9QUkFNSU5JVERBVEEgPSAweDAwMjEsCisJTlVCVVNfUkVTSURfUFJJTUFSWUlOSVQgID0gMHgwMDIyLAorCU5VQlVTX1JFU0lEX1RJTUVPVVRDT05TVCA9IDB4MDAyMywKKwlOVUJVU19SRVNJRF9WRU5ET1JJTkZPICAgPSAweDAwMjQsCisJTlVCVVNfUkVTSURfQk9BUkRGTEFHUyAgID0gMHgwMDI1LAorCU5VQlVTX1JFU0lEX1NFQ09ORElOSVQgICA9IDB4MDAyNiwKKworCS8qIE5vdCBzdXJlIHdoeSBBcHBsZSBwdXQgdGhlc2UgbmV4dCB0d28gaW4gaGVyZSAqLworCU5VQlVTX1JFU0lEX1ZJRE5BTUVTICAgICA9IDB4MDA0MSwKKwlOVUJVU19SRVNJRF9WSURNT0RFUyAgICAgPSAweDAwN2UKK307CisKKy8qIEZpZWxkcyB3aXRoaW4gdGhlIHZlbmRvciBpbmZvIGRpcmVjdG9yeSAqLworZW51bSBudWJ1c192ZW5kb3JfcmVzX2lkIHsKKwlOVUJVU19SRVNJRF9WRU5EX0lEICAgICA9IDB4MDAwMSwKKwlOVUJVU19SRVNJRF9WRU5EX1NFUklBTCA9IDB4MDAwMiwKKwlOVUJVU19SRVNJRF9WRU5EX1JFViAgICA9IDB4MDAwMywKKwlOVUJVU19SRVNJRF9WRU5EX1BBUlQgICA9IDB4MDAwNCwKKwlOVUJVU19SRVNJRF9WRU5EX0RBVEUgICA9IDB4MDAwNQorfTsKKworZW51bSBudWJ1c19uZXRfcmVzX2lkIHsKKwlOVUJVU19SRVNJRF9NQUNfQUREUkVTUyAgPSAweDAwODAKK307CisKK2VudW0gbnVidXNfY3B1X3Jlc19pZCB7CisJTlVCVVNfUkVTSURfTUVNSU5GTyAgICAgID0gMHgwMDgxLAorCU5VQlVTX1JFU0lEX1JPTUlORk8gICAgICA9IDB4MDA4MgorfTsKKworZW51bSBudWJ1c19kaXNwbGF5X3Jlc19pZCB7CisJTlVCVVNfUkVTSURfR0FNTUFESVIgICAgPSAweDAwNDAsCisJTlVCVVNfUkVTSURfRklSU1RNT0RFICAgPSAweDAwODAsCisJTlVCVVNfUkVTSURfU0VDT05ETU9ERSAgPSAweDAwODEsCisJTlVCVVNfUkVTSURfVEhJUkRNT0RFICAgPSAweDAwODIsCisJTlVCVVNfUkVTSURfRk9VUlRITU9ERSAgPSAweDAwODMsCisJTlVCVVNfUkVTSURfRklGVEhNT0RFICAgPSAweDAwODQsCisJTlVCVVNfUkVTSURfU0lYVEhNT0RFICAgPSAweDAwODUKK307CisKK3N0cnVjdCBudWJ1c19kaXIKK3sKKwl1bnNpZ25lZCBjaGFyICpiYXNlOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwlpbnQgZG9uZTsKKwlpbnQgbWFzazsKK307CisKK3N0cnVjdCBudWJ1c19kaXJlbnQKK3sKKwl1bnNpZ25lZCBjaGFyICpiYXNlOworCXVuc2lnbmVkIGNoYXIgdHlwZTsKKwlfX3UzMiBkYXRhOwkvKiBBY3R1YWxseSAyNGJpdHMgdXNlZCAqLworCWludCBtYXNrOworfTsKKworCisvKiBXZSdkIGxpa2UgdG8gZ2V0IHJpZCBvZiB0aGlzIGV2ZW50dWFsbHkuICBPbmx5IGRheW5hcG9ydC5jIHVzZXMgaXQgbm93LiAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCAqbnVidXNfc2xvdF9hZGRyKGludCBzbG90KQoreworCXJldHVybiAodm9pZCAqKSgweEYwMDAwMDAwfChzbG90PDwyNCkpOworfQorCisjZW5kaWYgLyogTElOVVhfTlVCVVNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9udnJhbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9udnJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYWExMGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L252cmFtLmgKQEAgLTAsMCArMSwxNiBAQAorI2lmbmRlZiBfTElOVVhfTlZSQU1fSAorI2RlZmluZSBfTElOVVhfTlZSQU1fSAorCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworLyogL2Rldi9udnJhbSBpb2N0bHMgKi8KKyNkZWZpbmUgTlZSQU1fSU5JVAlfSU8oJ3AnLCAweDQwKSAvKiBpbml0aWFsaXplIE5WUkFNIGFuZCBzZXQgY2hlY2tzdW0gKi8KKyNkZWZpbmUgTlZSQU1fU0VUQ0tTCV9JTygncCcsIDB4NDEpIC8qIHJlY2FsY3VsYXRlIGNoZWNrc3VtICovCisKKy8qIGZvciBhbGwgY3VycmVudCBzeXN0ZW1zLCB0aGlzIGlzIHdoZXJlIE5WUkFNIHN0YXJ0cyAqLworI2RlZmluZSBOVlJBTV9GSVJTVF9CWVRFICAgIDE0CisvKiBhbGwgdGhlc2UgZnVuY3Rpb25zIGV4cGVjdCBhbiBOVlJBTSBvZmZzZXQsIG5vdCBhbiBhYnNvbHV0ZSAqLworI2RlZmluZSBOVlJBTV9PRkZTRVQoeCkgICAoKHgpLU5WUkFNX0ZJUlNUX0JZVEUpCisKKworI2VuZGlmICAvKiBfTElOVVhfTlZSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9vbWFwM2lzcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9vbWFwM2lzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZTkxMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L29tYXAzaXNwLmgKQEAgLTAsMCArMSw2NDQgQEAKKy8qCisgKiBvbWFwM2lzcC5oCisgKgorICogVEkgT01BUDMgSVNQIC0gVXNlci1zcGFjZSBBUEkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwOSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIENvbnRhY3RzOiBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20+CisgKgkgICAgIFNha2FyaSBBaWx1cyA8c2FrYXJpLmFpbHVzQGlraS5maT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBPTUFQM19JU1BfVVNFUl9ICisjZGVmaW5lIE9NQVAzX0lTUF9VU0VSX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBQcml2YXRlIElPQ1RMcworICoKKyAqIFZJRElPQ19PTUFQM0lTUF9DQ0RDX0NGRzogU2V0IENDREMgY29uZmlndXJhdGlvbgorICogVklESU9DX09NQVAzSVNQX1BSVl9DRkc6IFNldCBwcmV2aWV3IGVuZ2luZSBjb25maWd1cmF0aW9uCisgKiBWSURJT0NfT01BUDNJU1BfQUVXQl9DRkc6IFNldCBBRVdCIG1vZHVsZSBjb25maWd1cmF0aW9uCisgKiBWSURJT0NfT01BUDNJU1BfSElTVF9DRkc6IFNldCBoaXN0b2dyYW0gbW9kdWxlIGNvbmZpZ3VyYXRpb24KKyAqIFZJRElPQ19PTUFQM0lTUF9BRl9DRkc6IFNldCBhdXRvLWZvY3VzIG1vZHVsZSBjb25maWd1cmF0aW9uCisgKiBWSURJT0NfT01BUDNJU1BfU1RBVF9SRVE6IFJlYWQgc3RhdGlzdGljcyAoQUVXQi9BRi9oaXN0b2dyYW0pIGRhdGEKKyAqIFZJRElPQ19PTUFQM0lTUF9TVEFUX0VOOiBFbmFibGUvZGlzYWJsZSBhIHN0YXRpc3RpY3MgbW9kdWxlCisgKi8KKworI2RlZmluZSBWSURJT0NfT01BUDNJU1BfQ0NEQ19DRkcgXAorCV9JT1dSKCdWJywgQkFTRV9WSURJT0NfUFJJVkFURSArIDEsIHN0cnVjdCBvbWFwM2lzcF9jY2RjX3VwZGF0ZV9jb25maWcpCisjZGVmaW5lIFZJRElPQ19PTUFQM0lTUF9QUlZfQ0ZHIFwKKwlfSU9XUignVicsIEJBU0VfVklESU9DX1BSSVZBVEUgKyAyLCBzdHJ1Y3Qgb21hcDNpc3BfcHJldl91cGRhdGVfY29uZmlnKQorI2RlZmluZSBWSURJT0NfT01BUDNJU1BfQUVXQl9DRkcgXAorCV9JT1dSKCdWJywgQkFTRV9WSURJT0NfUFJJVkFURSArIDMsIHN0cnVjdCBvbWFwM2lzcF9oM2FfYWV3Yl9jb25maWcpCisjZGVmaW5lIFZJRElPQ19PTUFQM0lTUF9ISVNUX0NGRyBcCisJX0lPV1IoJ1YnLCBCQVNFX1ZJRElPQ19QUklWQVRFICsgNCwgc3RydWN0IG9tYXAzaXNwX2hpc3RfY29uZmlnKQorI2RlZmluZSBWSURJT0NfT01BUDNJU1BfQUZfQ0ZHIFwKKwlfSU9XUignVicsIEJBU0VfVklESU9DX1BSSVZBVEUgKyA1LCBzdHJ1Y3Qgb21hcDNpc3BfaDNhX2FmX2NvbmZpZykKKyNkZWZpbmUgVklESU9DX09NQVAzSVNQX1NUQVRfUkVRIFwKKwlfSU9XUignVicsIEJBU0VfVklESU9DX1BSSVZBVEUgKyA2LCBzdHJ1Y3Qgb21hcDNpc3Bfc3RhdF9kYXRhKQorI2RlZmluZSBWSURJT0NfT01BUDNJU1BfU1RBVF9FTiBcCisJX0lPV1IoJ1YnLCBCQVNFX1ZJRElPQ19QUklWQVRFICsgNywgdW5zaWduZWQgbG9uZykKKworLyoKKyAqIEV2ZW50cworICoKKyAqIFY0TDJfRVZFTlRfT01BUDNJU1BfQUVXQjogQUVXQiBzdGF0aXN0aWNzIGRhdGEgcmVhZHkKKyAqIFY0TDJfRVZFTlRfT01BUDNJU1BfQUY6IEFGIHN0YXRpc3RpY3MgZGF0YSByZWFkeQorICogVjRMMl9FVkVOVF9PTUFQM0lTUF9ISVNUOiBIaXN0b2dyYW0gc3RhdGlzdGljcyBkYXRhIHJlYWR5CisgKi8KKworI2RlZmluZSBWNEwyX0VWRU5UX09NQVAzSVNQX0NMQVNTCShWNEwyX0VWRU5UX1BSSVZBVEVfU1RBUlQgfCAweDEwMCkKKyNkZWZpbmUgVjRMMl9FVkVOVF9PTUFQM0lTUF9BRVdCCShWNEwyX0VWRU5UX09NQVAzSVNQX0NMQVNTIHwgMHgxKQorI2RlZmluZSBWNEwyX0VWRU5UX09NQVAzSVNQX0FGCQkoVjRMMl9FVkVOVF9PTUFQM0lTUF9DTEFTUyB8IDB4MikKKyNkZWZpbmUgVjRMMl9FVkVOVF9PTUFQM0lTUF9ISVNUCShWNEwyX0VWRU5UX09NQVAzSVNQX0NMQVNTIHwgMHgzKQorCitzdHJ1Y3Qgb21hcDNpc3Bfc3RhdF9ldmVudF9zdGF0dXMgeworCV9fdTMyIGZyYW1lX251bWJlcjsKKwlfX3UxNiBjb25maWdfY291bnRlcjsKKwlfX3U4IGJ1Zl9lcnI7Cit9OworCisvKiBBRS9BV0IgcmVsYXRlZCBzdHJ1Y3R1cmVzIGFuZCBmbGFncyovCisKKy8qIEgzQSBSYW5nZSBDb25zdGFudHMgKi8KKyNkZWZpbmUgT01BUDNJU1BfQUVXQl9NQVhfU0FUVVJBVElPTl9MSU0JMTAyMworI2RlZmluZSBPTUFQM0lTUF9BRVdCX01JTl9XSU5fSAkJCTIKKyNkZWZpbmUgT01BUDNJU1BfQUVXQl9NQVhfV0lOX0gJCQkyNTYKKyNkZWZpbmUgT01BUDNJU1BfQUVXQl9NSU5fV0lOX1cJCQk2CisjZGVmaW5lIE9NQVAzSVNQX0FFV0JfTUFYX1dJTl9XCQkJMjU2CisjZGVmaW5lIE9NQVAzSVNQX0FFV0JfTUlOX1dJTlZDCQkJMQorI2RlZmluZSBPTUFQM0lTUF9BRVdCX01JTl9XSU5IQwkJCTEKKyNkZWZpbmUgT01BUDNJU1BfQUVXQl9NQVhfV0lOVkMJCQkxMjgKKyNkZWZpbmUgT01BUDNJU1BfQUVXQl9NQVhfV0lOSEMJCQkzNgorI2RlZmluZSBPTUFQM0lTUF9BRVdCX01BWF9XSU5TVEFSVAkJNDA5NQorI2RlZmluZSBPTUFQM0lTUF9BRVdCX01JTl9TVUJfSU5DCQkyCisjZGVmaW5lIE9NQVAzSVNQX0FFV0JfTUFYX1NVQl9JTkMJCTMyCisjZGVmaW5lIE9NQVAzSVNQX0FFV0JfTUFYX0JVRl9TSVpFCQk4MzYwMAorCisjZGVmaW5lIE9NQVAzSVNQX0FGX0lJUlNIX01JTgkJCTAKKyNkZWZpbmUgT01BUDNJU1BfQUZfSUlSU0hfTUFYCQkJNDA5NQorI2RlZmluZSBPTUFQM0lTUF9BRl9QQVhFTF9IT1JJWk9OVEFMX0NPVU5UX01JTgkxCisjZGVmaW5lIE9NQVAzSVNQX0FGX1BBWEVMX0hPUklaT05UQUxfQ09VTlRfTUFYCTM2CisjZGVmaW5lIE9NQVAzSVNQX0FGX1BBWEVMX1ZFUlRJQ0FMX0NPVU5UX01JTgkxCisjZGVmaW5lIE9NQVAzSVNQX0FGX1BBWEVMX1ZFUlRJQ0FMX0NPVU5UX01BWAkxMjgKKyNkZWZpbmUgT01BUDNJU1BfQUZfUEFYRUxfSU5DUkVNRU5UX01JTgkJMgorI2RlZmluZSBPTUFQM0lTUF9BRl9QQVhFTF9JTkNSRU1FTlRfTUFYCQkzMgorI2RlZmluZSBPTUFQM0lTUF9BRl9QQVhFTF9IRUlHSFRfTUlOCQkyCisjZGVmaW5lIE9NQVAzSVNQX0FGX1BBWEVMX0hFSUdIVF9NQVgJCTI1NgorI2RlZmluZSBPTUFQM0lTUF9BRl9QQVhFTF9XSURUSF9NSU4JCTE2CisjZGVmaW5lIE9NQVAzSVNQX0FGX1BBWEVMX1dJRFRIX01BWAkJMjU2CisjZGVmaW5lIE9NQVAzSVNQX0FGX1BBWEVMX0haU1RBUlRfTUlOCQkxCisjZGVmaW5lIE9NQVAzSVNQX0FGX1BBWEVMX0haU1RBUlRfTUFYCQk0MDk1CisjZGVmaW5lIE9NQVAzSVNQX0FGX1BBWEVMX1ZUU1RBUlRfTUlOCQkwCisjZGVmaW5lIE9NQVAzSVNQX0FGX1BBWEVMX1ZUU1RBUlRfTUFYCQk0MDk1CisjZGVmaW5lIE9NQVAzSVNQX0FGX1RIUkVTSE9MRF9NQVgJCTI1NQorI2RlZmluZSBPTUFQM0lTUF9BRl9DT0VGX01BWAkJCTQwOTUKKyNkZWZpbmUgT01BUDNJU1BfQUZfUEFYRUxfU0laRQkJCTQ4CisjZGVmaW5lIE9NQVAzSVNQX0FGX01BWF9CVUZfU0laRQkJMjIxMTg0CisKKy8qKgorICogc3RydWN0IG9tYXAzaXNwX2gzYV9hZXdiX2NvbmZpZyAtIEFFIEFXQiBjb25maWd1cmF0aW9uIHJlc2V0IHZhbHVlcworICogc2F0dXJhdGlvbl9saW1pdDogU2F0dXJhdGlvbiBsaW1pdC4KKyAqIEB3aW5faGVpZ2h0OiBXaW5kb3cgSGVpZ2h0LiBSYW5nZSAyIC0gMjU2LCBldmVuIHZhbHVlcyBvbmx5LgorICogQHdpbl93aWR0aDogV2luZG93IFdpZHRoLiBSYW5nZSA2IC0gMjU2LCBldmVuIHZhbHVlcyBvbmx5LgorICogQHZlcl93aW5fY291bnQ6IFZlcnRpY2FsIFdpbmRvdyBDb3VudC4gUmFuZ2UgMSAtIDEyOC4KKyAqIEBob3Jfd2luX2NvdW50OiBIb3Jpem9udGFsIFdpbmRvdyBDb3VudC4gUmFuZ2UgMSAtIDM2LgorICogQHZlcl93aW5fc3RhcnQ6IFZlcnRpY2FsIFdpbmRvdyBTdGFydC4gUmFuZ2UgMCAtIDQwOTUuCisgKiBAaG9yX3dpbl9zdGFydDogSG9yaXpvbnRhbCBXaW5kb3cgU3RhcnQuIFJhbmdlIDAgLSA0MDk1LgorICogQGJsa192ZXJfd2luX3N0YXJ0OiBCbGFjayBWZXJ0aWNhbCBXaW5kb3dzIFN0YXJ0LiBSYW5nZSAwIC0gNDA5NS4KKyAqIEBibGtfd2luX2hlaWdodDogQmxhY2sgV2luZG93IEhlaWdodC4gUmFuZ2UgMiAtIDI1NiwgZXZlbiB2YWx1ZXMgb25seS4KKyAqIEBzdWJzYW1wbGVfdmVyX2luYzogU3Vic2FtcGxlIFZlcnRpY2FsIHBvaW50cyBpbmNyZW1lbnQgUmFuZ2UgMiAtIDMyLCBldmVuCisgKiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBvbmx5LgorICogQHN1YnNhbXBsZV9ob3JfaW5jOiBTdWJzYW1wbGUgSG9yaXpvbnRhbCBwb2ludHMgaW5jcmVtZW50IFJhbmdlIDIgLSAzMiwgZXZlbgorICogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgb25seS4KKyAqIEBhbGF3X2VuYWJsZTogQUVXIEFMQVcgRU4gZmxhZy4KKyAqLworc3RydWN0IG9tYXAzaXNwX2gzYV9hZXdiX2NvbmZpZyB7CisJLyoKKwkgKiBDb21tb24gZmllbGRzLgorCSAqIFRoZXkgc2hvdWxkIGJlIHRoZSBmaXJzdCBvbmVzIGFuZCBtdXN0IGJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIGluCisJICogaXNwc3RhdF9nZW5lcmljX2NvbmZpZyBzdHJ1Y3QuCisJICovCisJX191MzIgYnVmX3NpemU7CisJX191MTYgY29uZmlnX2NvdW50ZXI7CisKKwkvKiBQcml2YXRlIGZpZWxkcyAqLworCV9fdTE2IHNhdHVyYXRpb25fbGltaXQ7CisJX191MTYgd2luX2hlaWdodDsKKwlfX3UxNiB3aW5fd2lkdGg7CisJX191MTYgdmVyX3dpbl9jb3VudDsKKwlfX3UxNiBob3Jfd2luX2NvdW50OworCV9fdTE2IHZlcl93aW5fc3RhcnQ7CisJX191MTYgaG9yX3dpbl9zdGFydDsKKwlfX3UxNiBibGtfdmVyX3dpbl9zdGFydDsKKwlfX3UxNiBibGtfd2luX2hlaWdodDsKKwlfX3UxNiBzdWJzYW1wbGVfdmVyX2luYzsKKwlfX3UxNiBzdWJzYW1wbGVfaG9yX2luYzsKKwlfX3U4IGFsYXdfZW5hYmxlOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgb21hcDNpc3Bfc3RhdF9kYXRhIC0gU3RhdGlzdGljIGRhdGEgc2VudCB0byBvciByZWNlaXZlZCBmcm9tIHVzZXIKKyAqIEB0czogVGltZXN0YW1wIG9mIHJldHVybmVkIGZyYW1lc3RhdHMuCisgKiBAYnVmOiBQb2ludGVyIHRvIHBhc3MgdG8gdXNlci4KKyAqIEBmcmFtZV9udW1iZXI6IEZyYW1lIG51bWJlciBvZiByZXF1ZXN0ZWQgc3RhdHMuCisgKiBAY3VyX2ZyYW1lOiBDdXJyZW50IGZyYW1lIG51bWJlciBiZWluZyBwcm9jZXNzZWQuCisgKiBAY29uZmlnX2NvdW50ZXI6IE51bWJlciBvZiB0aGUgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEuCisgKi8KK3N0cnVjdCBvbWFwM2lzcF9zdGF0X2RhdGEgeworCXN0cnVjdCB0aW1ldmFsIHRzOworCXZvaWQgKmJ1ZjsKKwlfX3UzMiBidWZfc2l6ZTsKKwlfX3UxNiBmcmFtZV9udW1iZXI7CisJX191MTYgY3VyX2ZyYW1lOworCV9fdTE2IGNvbmZpZ19jb3VudGVyOworfTsKKworCisvKiBIaXN0b2dyYW0gcmVsYXRlZCBzdHJ1Y3RzICovCisKKy8qIEZsYWdzIGZvciBudW1iZXIgb2YgYmlucyAqLworI2RlZmluZSBPTUFQM0lTUF9ISVNUX0JJTlNfMzIJCTAKKyNkZWZpbmUgT01BUDNJU1BfSElTVF9CSU5TXzY0CQkxCisjZGVmaW5lIE9NQVAzSVNQX0hJU1RfQklOU18xMjgJCTIKKyNkZWZpbmUgT01BUDNJU1BfSElTVF9CSU5TXzI1NgkJMworCisvKiBOdW1iZXIgb2YgYmlucyAqIDQgY29sb3JzICogNC1ieXRlcyB3b3JkICovCisjZGVmaW5lIE9NQVAzSVNQX0hJU1RfTUVNX1NJWkVfQklOUyhuKQkoKDEgPDwgKChuKSs1KSkqNCo0KQorCisjZGVmaW5lIE9NQVAzSVNQX0hJU1RfTUVNX1NJWkUJCTEwMjQKKyNkZWZpbmUgT01BUDNJU1BfSElTVF9NSU5fUkVHSU9OUwkxCisjZGVmaW5lIE9NQVAzSVNQX0hJU1RfTUFYX1JFR0lPTlMJNAorI2RlZmluZSBPTUFQM0lTUF9ISVNUX01BWF9XQl9HQUlOCTI1NQorI2RlZmluZSBPTUFQM0lTUF9ISVNUX01JTl9XQl9HQUlOCTAKKyNkZWZpbmUgT01BUDNJU1BfSElTVF9NQVhfQklUX1dJRFRICTE0CisjZGVmaW5lIE9NQVAzSVNQX0hJU1RfTUlOX0JJVF9XSURUSAk4CisjZGVmaW5lIE9NQVAzSVNQX0hJU1RfTUFYX1dHCQk0CisjZGVmaW5lIE9NQVAzSVNQX0hJU1RfTUFYX0JVRl9TSVpFCTQwOTYKKworLyogU291cmNlICovCisjZGVmaW5lIE9NQVAzSVNQX0hJU1RfU09VUkNFX0NDREMJMAorI2RlZmluZSBPTUFQM0lTUF9ISVNUX1NPVVJDRV9NRU0JMQorCisvKiBDRkEgcGF0dGVybiAqLworI2RlZmluZSBPTUFQM0lTUF9ISVNUX0NGQV9CQVlFUgkJMAorI2RlZmluZSBPTUFQM0lTUF9ISVNUX0NGQV9GT1ZFT05YMwkxCisKK3N0cnVjdCBvbWFwM2lzcF9oaXN0X3JlZ2lvbiB7CisJX191MTYgaF9zdGFydDsKKwlfX3UxNiBoX2VuZDsKKwlfX3UxNiB2X3N0YXJ0OworCV9fdTE2IHZfZW5kOworfTsKKworc3RydWN0IG9tYXAzaXNwX2hpc3RfY29uZmlnIHsKKwkvKgorCSAqIENvbW1vbiBmaWVsZHMuCisJICogVGhleSBzaG91bGQgYmUgdGhlIGZpcnN0IG9uZXMgYW5kIG11c3QgYmUgaW4gdGhlIHNhbWUgb3JkZXIgYXMgaW4KKwkgKiBpc3BzdGF0X2dlbmVyaWNfY29uZmlnIHN0cnVjdC4KKwkgKi8KKwlfX3UzMiBidWZfc2l6ZTsKKwlfX3UxNiBjb25maWdfY291bnRlcjsKKworCV9fdTggbnVtX2FjY19mcmFtZXM7CS8qIE51bSBvZiBpbWFnZSBmcmFtZXMgdG8gYmUgcHJvY2Vzc2VkIGFuZAorCQkJCSAgIGFjY3VtdWxhdGVkIGZvciBlYWNoIGhpc3RvZ3JhbSBmcmFtZSAqLworCV9fdTE2IGhpc3RfYmluczsJLyogbnVtYmVyIG9mIGJpbnM6IDMyLCA2NCwgMTI4LCBvciAyNTYgKi8KKwlfX3U4IGNmYTsJCS8qIEJBWUVSIG9yIEZPVkVPTiBYMyAqLworCV9fdTggd2dbT01BUDNJU1BfSElTVF9NQVhfV0ddOwkvKiBXaGl0ZSBCYWxhbmNlIEdhaW4gKi8KKwlfX3U4IG51bV9yZWdpb25zOwkvKiBudW1iZXIgb2YgcmVnaW9ucyB0byBiZSBjb25maWd1cmVkICovCisJc3RydWN0IG9tYXAzaXNwX2hpc3RfcmVnaW9uIHJlZ2lvbltPTUFQM0lTUF9ISVNUX01BWF9SRUdJT05TXTsKK307CisKKy8qIEF1dG8gRm9jdXMgcmVsYXRlZCBzdHJ1Y3RzICovCisKKyNkZWZpbmUgT01BUDNJU1BfQUZfTlVNX0NPRUYJCTExCisKK2VudW0gb21hcDNpc3BfaDNhX2FmX2Z2bW9kZSB7CisJT01BUDNJU1BfQUZfTU9ERV9TVU1NRUQgPSAwLAorCU9NQVAzSVNQX0FGX01PREVfUEVBSyA9IDEKK307CisKKy8qIFJlZCwgR3JlZW4sIGFuZCBibHVlIHBpeGVsIGxvY2F0aW9uIGluIHRoZSBBRiB3aW5kb3dzICovCitlbnVtIG9tYXAzaXNwX2gzYV9hZl9yZ2Jwb3MgeworCU9NQVAzSVNQX0FGX0dSX0dCX0JBWUVSID0gMCwJLyogR1IgYW5kIEdCIGFzIEJheWVyIHBhdHRlcm4gKi8KKwlPTUFQM0lTUF9BRl9SR19HQl9CQVlFUiA9IDEsCS8qIFJHIGFuZCBHQiBhcyBCYXllciBwYXR0ZXJuICovCisJT01BUDNJU1BfQUZfR1JfQkdfQkFZRVIgPSAyLAkvKiBHUiBhbmQgQkcgYXMgQmF5ZXIgcGF0dGVybiAqLworCU9NQVAzSVNQX0FGX1JHX0JHX0JBWUVSID0gMywJLyogUkcgYW5kIEJHIGFzIEJheWVyIHBhdHRlcm4gKi8KKwlPTUFQM0lTUF9BRl9HR19SQl9DVVNUT00gPSA0LAkvKiBHRyBhbmQgUkIgYXMgY3VzdG9tIHBhdHRlcm4gKi8KKwlPTUFQM0lTUF9BRl9SQl9HR19DVVNUT00gPSA1CS8qIFJCIGFuZCBHRyBhcyBjdXN0b20gcGF0dGVybiAqLworfTsKKworLyogQ29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgSG9yaXpvbnRhbCBNZWRpYW4gRmlsdGVyICovCitzdHJ1Y3Qgb21hcDNpc3BfaDNhX2FmX2htZiB7CisJX191OCBlbmFibGU7CS8qIFN0YXR1cyBvZiBIb3Jpem9udGFsIE1lZGlhbiBGaWx0ZXIgKi8KKwlfX3U4IHRocmVzaG9sZDsJLyogVGhyZXNob2xkIFZhbHVlIGZvciBIb3Jpem9udGFsIE1lZGlhbiBGaWx0ZXIgKi8KK307CisKKy8qIENvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIElJUiBGaWx0ZXJzICovCitzdHJ1Y3Qgb21hcDNpc3BfaDNhX2FmX2lpciB7CisJX191MTYgaF9zdGFydDsJCQkvKiBJSVIgaG9yaXpvbnRhbCBzdGFydCAqLworCV9fdTE2IGNvZWZmX3NldDBbT01BUDNJU1BfQUZfTlVNX0NPRUZdOwkvKiBGaWx0ZXIgY29lZmZpY2llbnQsIHNldCAwICovCisJX191MTYgY29lZmZfc2V0MVtPTUFQM0lTUF9BRl9OVU1fQ09FRl07CS8qIEZpbHRlciBjb2VmZmljaWVudCwgc2V0IDEgKi8KK307CisKKy8qIENvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIFBheGVscyBTdHJ1Y3R1cmUgaW4gQUYgRW5naW5lICovCitzdHJ1Y3Qgb21hcDNpc3BfaDNhX2FmX3BheGVsIHsKKwlfX3UxNiBoX3N0YXJ0OwkvKiBIb3Jpem9udGFsIFN0YXJ0IFBvc2l0aW9uICovCisJX191MTYgdl9zdGFydDsJLyogVmVydGljYWwgU3RhcnQgUG9zaXRpb24gKi8KKwlfX3U4IHdpZHRoOwkvKiBXaWR0aCBvZiB0aGUgUGF4ZWwgKi8KKwlfX3U4IGhlaWdodDsJLyogSGVpZ2h0IG9mIHRoZSBQYXhlbCAqLworCV9fdTggaF9jbnQ7CS8qIEhvcml6b250YWwgQ291bnQgKi8KKwlfX3U4IHZfY250OwkvKiB2ZXJ0aWNhbCBDb3VudCAqLworCV9fdTggbGluZV9pbmM7CS8qIExpbmUgSW5jcmVtZW50ICovCit9OworCisvKiBDb250YWlucyB0aGUgcGFyYW1ldGVycyByZXF1aXJlZCBmb3IgaGFyZHdhcmUgc2V0IHVwIG9mIEFGIEVuZ2luZSAqLworc3RydWN0IG9tYXAzaXNwX2gzYV9hZl9jb25maWcgeworCS8qCisJICogQ29tbW9uIGZpZWxkcy4KKwkgKiBUaGV5IHNob3VsZCBiZSB0aGUgZmlyc3Qgb25lcyBhbmQgbXVzdCBiZSBpbiB0aGUgc2FtZSBvcmRlciBhcyBpbgorCSAqIGlzcHN0YXRfZ2VuZXJpY19jb25maWcgc3RydWN0LgorCSAqLworCV9fdTMyIGJ1Zl9zaXplOworCV9fdTE2IGNvbmZpZ19jb3VudGVyOworCisJc3RydWN0IG9tYXAzaXNwX2gzYV9hZl9obWYgaG1mOwkJLyogSE1GIGNvbmZpZ3VyYXRpb25zICovCisJc3RydWN0IG9tYXAzaXNwX2gzYV9hZl9paXIgaWlyOwkJLyogSUlSIGZpbHRlciBjb25maWd1cmF0aW9ucyAqLworCXN0cnVjdCBvbWFwM2lzcF9oM2FfYWZfcGF4ZWwgcGF4ZWw7CS8qIFBheGVsIHBhcmFtZXRlcnMgKi8KKwllbnVtIG9tYXAzaXNwX2gzYV9hZl9yZ2Jwb3MgcmdiX3BvczsJLyogUkdCIFBvc2l0aW9ucyAqLworCWVudW0gb21hcDNpc3BfaDNhX2FmX2Z2bW9kZSBmdm1vZGU7CS8qIEFjY3VtdWxhdG9yIG1vZGUgKi8KKwlfX3U4IGFsYXdfZW5hYmxlOwkJCS8qIEFGIEFMQVcgc3RhdHVzICovCit9OworCisvKiBJU1AgQ0NEQyBzdHJ1Y3RzICovCisKKy8qIEFic3RyYWN0aW9uIGxheWVyIENDREMgY29uZmlndXJhdGlvbnMgKi8KKyNkZWZpbmUgT01BUDNJU1BfQ0NEQ19BTEFXCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQM0lTUF9DQ0RDX0xQRgkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDNJU1BfQ0NEQ19CTENMQU1QCQkoMSA8PCAyKQorI2RlZmluZSBPTUFQM0lTUF9DQ0RDX0JDT01QCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQM0lTUF9DQ0RDX0ZQQwkJKDEgPDwgNCkKKyNkZWZpbmUgT01BUDNJU1BfQ0NEQ19DVUxMCQkoMSA8PCA1KQorI2RlZmluZSBPTUFQM0lTUF9DQ0RDX0NPTkZJR19MU0MJKDEgPDwgNykKKyNkZWZpbmUgT01BUDNJU1BfQ0NEQ19UQkxfTFNDCQkoMSA8PCA4KQorCisjZGVmaW5lIE9NQVAzSVNQX1JHQl9NQVgJCTMKKworLyogRW51bWVyYXRpb24gY29uc3RhbnRzIGZvciBBbGF3IGlucHV0IHdpZHRoICovCitlbnVtIG9tYXAzaXNwX2FsYXdfaXB3aWR0aCB7CisJT01BUDNJU1BfQUxBV19CSVQxMl8zID0gMHgzLAorCU9NQVAzSVNQX0FMQVdfQklUMTFfMiA9IDB4NCwKKwlPTUFQM0lTUF9BTEFXX0JJVDEwXzEgPSAweDUsCisJT01BUDNJU1BfQUxBV19CSVQ5XzAgPSAweDYKK307CisKKy8qKgorICogc3RydWN0IG9tYXAzaXNwX2NjZGNfbHNjX2NvbmZpZyAtIExTQyBjb25maWd1cmF0aW9uCisgKiBAb2Zmc2V0OiBUYWJsZSBPZmZzZXQgb2YgdGhlIGdhaW4gdGFibGUuCisgKiBAZ2Fpbl9tb2RlX246IFZlcnRpY2FsIGRpbWVuc2lvbiBvZiBhIHBheGVsIGluIExTQyBjb25maWd1cmF0aW9uLgorICogQGdhaW5fbW9kZV9tOiBIb3Jpem9udGFsIGRpbWVuc2lvbiBvZiBhIHBheGVsIGluIExTQyBjb25maWd1cmF0aW9uLgorICogQGdhaW5fZm9ybWF0OiBHYWluIHRhYmxlIGZvcm1hdC4KKyAqIEBmbXRzcGg6IFN0YXJ0IHBpeGVsIGhvcml6b250YWwgZnJvbSBzdGFydCBvZiB0aGUgSFMgc3luYyBwdWxzZS4KKyAqIEBmbXRsbmg6IE51bWJlciBvZiBwaXhlbHMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24gdG8gdXNlIGZvciB0aGUgZGF0YQorICogICAgICAgICAgcmVmb3JtYXR0ZXIuCisgKiBAZm10c2x2OiBTdGFydCBsaW5lIGZyb20gc3RhcnQgb2YgVlMgc3luYyBwdWxzZSBmb3IgdGhlIGRhdGEgcmVmb3JtYXR0ZXIuCisgKiBAZm10bG52OiBOdW1iZXIgb2YgbGluZXMgaW4gdmVydGljYWwgZGlyZWN0aW9uIGZvciB0aGUgZGF0YSByZWZvcm1hdHRlci4KKyAqIEBpbml0aWFsX3g6IFggcG9zaXRpb24sIGluIHBpeGVscywgb2YgdGhlIGZpcnN0IGFjdGl2ZSBwaXhlbCBpbiByZWZlcmVuY2UKKyAqICAgICAgICAgICAgIHRvIHRoZSBmaXJzdCBhY3RpdmUgcGF4ZWwuIE11c3QgYmUgYW4gZXZlbiBudW1iZXIuCisgKiBAaW5pdGlhbF95OiBZIHBvc2l0aW9uLCBpbiBwaXhlbHMsIG9mIHRoZSBmaXJzdCBhY3RpdmUgcGl4ZWwgaW4gcmVmZXJlbmNlCisgKiAgICAgICAgICAgICB0byB0aGUgZmlyc3QgYWN0aXZlIHBheGVsLiBNdXN0IGJlIGFuIGV2ZW4gbnVtYmVyLgorICogQHNpemU6IFNpemUgb2YgTFNDIGdhaW4gdGFibGUuIEZpbGxlZCB3aGVuIGxvYWRlZCBmcm9tIHVzZXJzcGFjZS4KKyAqLworc3RydWN0IG9tYXAzaXNwX2NjZGNfbHNjX2NvbmZpZyB7CisJX191MTYgb2Zmc2V0OworCV9fdTggZ2Fpbl9tb2RlX247CisJX191OCBnYWluX21vZGVfbTsKKwlfX3U4IGdhaW5fZm9ybWF0OworCV9fdTE2IGZtdHNwaDsKKwlfX3UxNiBmbXRsbmg7CisJX191MTYgZm10c2x2OworCV9fdTE2IGZtdGxudjsKKwlfX3U4IGluaXRpYWxfeDsKKwlfX3U4IGluaXRpYWxfeTsKKwlfX3UzMiBzaXplOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgb21hcDNpc3BfY2NkY19iY2xhbXAgLSBPcHRpY2FsICYgRGlnaXRhbCBibGFjayBjbGFtcCBzdWJ0cmFjdAorICogQG9iZ2FpbjogT3B0aWNhbCBibGFjayBhdmVyYWdlIGdhaW4uCisgKiBAb2JzdHBpeGVsOiBTdGFydCBQaXhlbCB3LnIudC4gSFMgcHVsc2UgaW4gT3B0aWNhbCBibGFjayBzYW1wbGUuCisgKiBAb2JsaW5lczogT3B0aWNhbCBCbGFjayBTYW1wbGUgbGluZXMuCisgKiBAb2JsZW46IE9wdGljYWwgQmxhY2sgU2FtcGxlIExlbmd0aC4KKyAqIEBkY3N1YnZhbDogRGlnaXRhbCBCbGFjayBDbGFtcCBzdWJ0cmFjdCB2YWx1ZS4KKyAqLworc3RydWN0IG9tYXAzaXNwX2NjZGNfYmNsYW1wIHsKKwlfX3U4IG9iZ2FpbjsKKwlfX3U4IG9ic3RwaXhlbDsKKwlfX3U4IG9ibGluZXM7CisJX191OCBvYmxlbjsKKwlfX3UxNiBkY3N1YnZhbDsKK307CisKKy8qKgorICogc3RydWN0IG9tYXAzaXNwX2NjZGNfZnBjIC0gRmF1bHR5IFBpeGVscyBDb3JyZWN0aW9uCisgKiBAZnBudW06IE51bWJlciBvZiBmYXVsdHkgcGl4ZWxzIHRvIGJlIGNvcnJlY3RlZCBpbiB0aGUgZnJhbWUuCisgKiBAZnBjYWRkcjogTWVtb3J5IGFkZHJlc3Mgb2YgdGhlIEZQQyBUYWJsZQorICovCitzdHJ1Y3Qgb21hcDNpc3BfY2NkY19mcGMgeworCV9fdTE2IGZwbnVtOworCV9fdTMyIGZwY2FkZHI7Cit9OworCisvKioKKyAqIHN0cnVjdCBvbWFwM2lzcF9jY2RjX2JsY29tcCAtIEJsYWNrIExldmVsIENvbXBlbnNhdGlvbiBwYXJhbWV0ZXJzCisgKiBAYl9tZzogQi9NZyBwaXhlbHMuIDIncyBjb21wbGVtZW50LiAtMTI4IHRvICsxMjcuCisgKiBAZ2JfZzogR2IvRyBwaXhlbHMuIDIncyBjb21wbGVtZW50LiAtMTI4IHRvICsxMjcuCisgKiBAZ3JfY3k6IEdyL0N5IHBpeGVscy4gMidzIGNvbXBsZW1lbnQuIC0xMjggdG8gKzEyNy4KKyAqIEByX3llOiBSL1llIHBpeGVscy4gMidzIGNvbXBsZW1lbnQuIC0xMjggdG8gKzEyNy4KKyAqLworc3RydWN0IG9tYXAzaXNwX2NjZGNfYmxjb21wIHsKKwlfX3U4IGJfbWc7CisJX191OCBnYl9nOworCV9fdTggZ3JfY3k7CisJX191OCByX3llOworfTsKKworLyoqCisgKiBvbWFwM2lzcF9jY2RjX2N1bGxpbmcgLSBDdWxsaW5nIHBhcmFtZXRlcnMKKyAqIEB2X3BhdHRlcm46IFZlcnRpY2FsIGN1bGxpbmcgcGF0dGVybi4KKyAqIEBoX29kZDogSG9yaXpvbnRhbCBDdWxsaW5nIHBhdHRlcm4gZm9yIG9kZCBsaW5lcy4KKyAqIEBoX2V2ZW46IEhvcml6b250YWwgQ3VsbGluZyBwYXR0ZXJuIGZvciBldmVuIGxpbmVzLgorICovCitzdHJ1Y3Qgb21hcDNpc3BfY2NkY19jdWxsaW5nIHsKKwlfX3U4IHZfcGF0dGVybjsKKwlfX3UxNiBoX29kZDsKKwlfX3UxNiBoX2V2ZW47Cit9OworCisvKioKKyAqIG9tYXAzaXNwX2NjZGNfdXBkYXRlX2NvbmZpZyAtIENDREMgY29uZmlndXJhdGlvbgorICogQHVwZGF0ZTogU3BlY2lmaWVzIHdoaWNoIENDREMgcmVnaXN0ZXJzIHNob3VsZCBiZSB1cGRhdGVkLgorICogQGZsYWc6IFNwZWNpZmllcyB3aGljaCBDQ0RDIGZ1bmN0aW9ucyBzaG91bGQgYmUgZW5hYmxlZC4KKyAqIEBhbGF3aXA6IEVuYWJsZS9EaXNhYmxlIEEtTGF3IGNvbXByZXNzaW9uLgorICogQGJjbGFtcDogQmxhY2sgY2xhbXAgY29udHJvbCByZWdpc3Rlci4KKyAqIEBibGNvbXA6IEJsYWNrIGxldmVsIGNvbXBlbnNhdGlvbiB2YWx1ZSBmb3IgUkdyR2JCIFBpeGVscy4gMidzIGNvbXBsZW1lbnQuCisgKiBAZnBjOiBOdW1iZXIgb2YgZmF1bHR5IHBpeGVscyBjb3JyZWN0ZWQgaW4gdGhlIGZyYW1lLCBhZGRyZXNzIG9mIEZQQyB0YWJsZS4KKyAqIEBjdWxsOiBDdWxsIGNvbnRyb2wgcmVnaXN0ZXIuCisgKiBAbHNjOiBQb2ludGVyIHRvIExTQyBnYWluIHRhYmxlLgorICovCitzdHJ1Y3Qgb21hcDNpc3BfY2NkY191cGRhdGVfY29uZmlnIHsKKwlfX3UxNiB1cGRhdGU7CisJX191MTYgZmxhZzsKKwllbnVtIG9tYXAzaXNwX2FsYXdfaXB3aWR0aCBhbGF3aXA7CisJc3RydWN0IG9tYXAzaXNwX2NjZGNfYmNsYW1wICpiY2xhbXA7CisJc3RydWN0IG9tYXAzaXNwX2NjZGNfYmxjb21wICpibGNvbXA7CisJc3RydWN0IG9tYXAzaXNwX2NjZGNfZnBjICpmcGM7CisJc3RydWN0IG9tYXAzaXNwX2NjZGNfbHNjX2NvbmZpZyAqbHNjX2NmZzsKKwlzdHJ1Y3Qgb21hcDNpc3BfY2NkY19jdWxsaW5nICpjdWxsOworCV9fdTggKmxzYzsKK307CisKKy8qIFByZXZpZXcgY29uZmlndXJhdGlvbnMgKi8KKyNkZWZpbmUgT01BUDNJU1BfUFJFVl9MVU1BRU5ICQkoMSA8PCAwKQorI2RlZmluZSBPTUFQM0lTUF9QUkVWX0lOVkFMQVcJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVAzSVNQX1BSRVZfSFJaX01FRAkJKDEgPDwgMikKKyNkZWZpbmUgT01BUDNJU1BfUFJFVl9DRkEJCSgxIDw8IDMpCisjZGVmaW5lIE9NQVAzSVNQX1BSRVZfQ0hST01BX1NVUFAJKDEgPDwgNCkKKyNkZWZpbmUgT01BUDNJU1BfUFJFVl9XQgkJKDEgPDwgNSkKKyNkZWZpbmUgT01BUDNJU1BfUFJFVl9CTEtBREoJCSgxIDw8IDYpCisjZGVmaW5lIE9NQVAzSVNQX1BSRVZfUkdCMlJHQgkJKDEgPDwgNykKKyNkZWZpbmUgT01BUDNJU1BfUFJFVl9DT0xPUl9DT05WCSgxIDw8IDgpCisjZGVmaW5lIE9NQVAzSVNQX1BSRVZfWUNfTElNSVQJCSgxIDw8IDkpCisjZGVmaW5lIE9NQVAzSVNQX1BSRVZfREVGRUNUX0NPUgkoMSA8PCAxMCkKKyNkZWZpbmUgT01BUDNJU1BfUFJFVl9HQU1NQUJZUEFTUwkoMSA8PCAxMSkKKyNkZWZpbmUgT01BUDNJU1BfUFJFVl9EUktfRlJNX0NBUFRVUkUJKDEgPDwgMTIpCisjZGVmaW5lIE9NQVAzSVNQX1BSRVZfRFJLX0ZSTV9TVUJUUkFDVAkoMSA8PCAxMykKKyNkZWZpbmUgT01BUDNJU1BfUFJFVl9MRU5TX1NIQURJTkcJKDEgPDwgMTQpCisjZGVmaW5lIE9NQVAzSVNQX1BSRVZfTkYJCSgxIDw8IDE1KQorI2RlZmluZSBPTUFQM0lTUF9QUkVWX0dBTU1BCQkoMSA8PCAxNikKKworI2RlZmluZSBPTUFQM0lTUF9QUkVWX05GX1RCTF9TSVpFCTY0CisjZGVmaW5lIE9NQVAzSVNQX1BSRVZfQ0ZBX1RCTF9TSVpFCTU3NgorI2RlZmluZSBPTUFQM0lTUF9QUkVWX0dBTU1BX1RCTF9TSVpFCTEwMjQKKyNkZWZpbmUgT01BUDNJU1BfUFJFVl9ZRU5IX1RCTF9TSVpFCTEyOAorCisjZGVmaW5lIE9NQVAzSVNQX1BSRVZfREVURUNUX0NPUlJFQ1RfQ0hBTk5FTFMJNAorCisvKioKKyAqIHN0cnVjdCBvbWFwM2lzcF9wcmV2X2htZWQgLSBIb3Jpem9udGFsIE1lZGlhbiBGaWx0ZXIKKyAqIEBvZGRkaXN0OiBEaXN0YW5jZSBiZXR3ZWVuIGNvbnNlY3V0aXZlIHBpeGVscyBvZiBzYW1lIGNvbG9yIGluIHRoZSBvZGQgbGluZS4KKyAqIEBldmVuZGlzdDogRGlzdGFuY2UgYmV0d2VlbiBjb25zZWN1dGl2ZSBwaXhlbHMgb2Ygc2FtZSBjb2xvciBpbiB0aGUgZXZlbgorICogICAgICAgICAgICBsaW5lLgorICogQHRocmVzOiBIb3Jpem9udGFsIG1lZGlhbiBmaWx0ZXIgdGhyZXNob2xkLgorICovCitzdHJ1Y3Qgb21hcDNpc3BfcHJldl9obWVkIHsKKwlfX3U4IG9kZGRpc3Q7CisJX191OCBldmVuZGlzdDsKKwlfX3U4IHRocmVzOworfTsKKworLyoKKyAqIEVudW1lcmF0aW9uIGZvciBDRkEgRm9ybWF0cyBzdXBwb3J0ZWQgYnkgcHJldmlldworICovCitlbnVtIG9tYXAzaXNwX2NmYV9mbXQgeworCU9NQVAzSVNQX0NGQUZNVF9CQVlFUiwKKwlPTUFQM0lTUF9DRkFGTVRfU09OWVZHQSwKKwlPTUFQM0lTUF9DRkFGTVRfUkdCRk9WRU9OLAorCU9NQVAzSVNQX0NGQUZNVF9ETlNQTCwKKwlPTUFQM0lTUF9DRkFGTVRfSE9ORVlDT01CLAorCU9NQVAzSVNQX0NGQUZNVF9SUkdHQkJGT1ZFT04KK307CisKKy8qKgorICogc3RydWN0IG9tYXAzaXNwX3ByZXZfY2ZhIC0gQ0ZBIEludGVycG9sYXRpb24KKyAqIEBmb3JtYXQ6IENGQSBGb3JtYXQgRW51bSB2YWx1ZSBzdXBwb3J0ZWQgYnkgcHJldmlldy4KKyAqIEBncmFkdGhyc192ZXJ0OiBDRkEgR3JhZGllbnQgVGhyZXNob2xkIC0gVmVydGljYWwuCisgKiBAZ3JhZHRocnNfaG9yejogQ0ZBIEdyYWRpZW50IFRocmVzaG9sZCAtIEhvcml6b250YWwuCisgKiBAdGFibGU6IFBvaW50ZXIgdG8gdGhlIENGQSB0YWJsZS4KKyAqLworc3RydWN0IG9tYXAzaXNwX3ByZXZfY2ZhIHsKKwllbnVtIG9tYXAzaXNwX2NmYV9mbXQgZm9ybWF0OworCV9fdTggZ3JhZHRocnNfdmVydDsKKwlfX3U4IGdyYWR0aHJzX2hvcno7CisJX191MzIgdGFibGVbT01BUDNJU1BfUFJFVl9DRkFfVEJMX1NJWkVdOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgb21hcDNpc3BfcHJldl9jc3VwIC0gQ2hyb21pbmFuY2UgU3VwcHJlc3Npb24KKyAqIEBnYWluOiBHYWluLgorICogQHRocmVzOiBUaHJlc2hvbGQuCisgKiBAaHlwZl9lbjogRmxhZyB0byBlbmFibGUvZGlzYWJsZSB0aGUgSGlnaCBQYXNzIEZpbHRlci4KKyAqLworc3RydWN0IG9tYXAzaXNwX3ByZXZfY3N1cCB7CisJX191OCBnYWluOworCV9fdTggdGhyZXM7CisJX191OCBoeXBmX2VuOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgb21hcDNpc3BfcHJldl93YmFsIC0gV2hpdGUgQmFsYW5jZQorICogQGRnYWluOiBEaWdpdGFsIGdhaW4gKFUxMFE4KS4KKyAqIEBjb2VmMzogV2hpdGUgYmFsYW5jZSBnYWluIC0gQ09FRiAzIChVOFE1KS4KKyAqIEBjb2VmMjogV2hpdGUgYmFsYW5jZSBnYWluIC0gQ09FRiAyIChVOFE1KS4KKyAqIEBjb2VmMTogV2hpdGUgYmFsYW5jZSBnYWluIC0gQ09FRiAxIChVOFE1KS4KKyAqIEBjb2VmMDogV2hpdGUgYmFsYW5jZSBnYWluIC0gQ09FRiAwIChVOFE1KS4KKyAqLworc3RydWN0IG9tYXAzaXNwX3ByZXZfd2JhbCB7CisJX191MTYgZGdhaW47CisJX191OCBjb2VmMzsKKwlfX3U4IGNvZWYyOworCV9fdTggY29lZjE7CisJX191OCBjb2VmMDsKK307CisKKy8qKgorICogc3RydWN0IG9tYXAzaXNwX3ByZXZfYmxrYWRqIC0gQmxhY2sgTGV2ZWwgQWRqdXN0bWVudAorICogQHJlZDogQmxhY2sgbGV2ZWwgb2Zmc2V0IGFkanVzdG1lbnQgZm9yIFJlZCBpbiAyJ3MgY29tcGxlbWVudCBmb3JtYXQKKyAqIEBncmVlbjogQmxhY2sgbGV2ZWwgb2Zmc2V0IGFkanVzdG1lbnQgZm9yIEdyZWVuIGluIDIncyBjb21wbGVtZW50IGZvcm1hdAorICogQGJsdWU6IEJsYWNrIGxldmVsIG9mZnNldCBhZGp1c3RtZW50IGZvciBCbHVlIGluIDIncyBjb21wbGVtZW50IGZvcm1hdAorICovCitzdHJ1Y3Qgb21hcDNpc3BfcHJldl9ibGthZGogeworCS8qQmxhY2sgbGV2ZWwgb2Zmc2V0IGFkanVzdG1lbnQgZm9yIFJlZCBpbiAyJ3MgY29tcGxlbWVudCBmb3JtYXQgKi8KKwlfX3U4IHJlZDsKKwkvKkJsYWNrIGxldmVsIG9mZnNldCBhZGp1c3RtZW50IGZvciBHcmVlbiBpbiAyJ3MgY29tcGxlbWVudCBmb3JtYXQgKi8KKwlfX3U4IGdyZWVuOworCS8qIEJsYWNrIGxldmVsIG9mZnNldCBhZGp1c3RtZW50IGZvciBCbHVlIGluIDIncyBjb21wbGVtZW50IGZvcm1hdCAqLworCV9fdTggYmx1ZTsKK307CisKKy8qKgorICogc3RydWN0IG9tYXAzaXNwX3ByZXZfcmdidG9yZ2IgLSBSR0IgdG8gUkdCIEJsZW5kaW5nCisgKiBAbWF0cml4OiBCbGVuZGluZyB2YWx1ZXMoUzEyUTggZm9ybWF0KQorICogICAgICAgICAgICAgIFtSUl0gW0dSXSBbQlJdCisgKiAgICAgICAgICAgICAgW1JHXSBbR0ddIFtCR10KKyAqICAgICAgICAgICAgICBbUkJdIFtHQl0gW0JCXQorICogQG9mZnNldDogQmxlbmRpbmcgb2Zmc2V0IHZhbHVlIGZvciBSLEcsQiBpbiAyJ3MgY29tcGxlbWVudCBpbnRlZ2VyIGZvcm1hdC4KKyAqLworc3RydWN0IG9tYXAzaXNwX3ByZXZfcmdidG9yZ2IgeworCV9fdTE2IG1hdHJpeFtPTUFQM0lTUF9SR0JfTUFYXVtPTUFQM0lTUF9SR0JfTUFYXTsKKwlfX3UxNiBvZmZzZXRbT01BUDNJU1BfUkdCX01BWF07Cit9OworCisvKioKKyAqIHN0cnVjdCBvbWFwM2lzcF9wcmV2X2NzYyAtIENvbG9yIFNwYWNlIENvbnZlcnNpb24gZnJvbSBSR0ItWUNiWUNyCisgKiBAbWF0cml4OiBDb2xvciBzcGFjZSBjb252ZXJzaW9uIGNvZWZmaWNpZW50cyhTMTBROCkKKyAqICAgICAgICAgICAgICBbQ1NDUlldICBbQ1NDR1ldICBbQ1NDQlldCisgKiAgICAgICAgICAgICAgW0NTQ1JDQl0gW0NTQ0dDQl0gW0NTQ0JDQl0KKyAqICAgICAgICAgICAgICBbQ1NDUkNSXSBbQ1NDR0NSXSBbQ1NDQkNSXQorICogQG9mZnNldDogQ1NDIG9mZnNldCB2YWx1ZXMgZm9yIFkgb2Zmc2V0LCBDQiBvZmZzZXQgYW5kIENSIG9mZnNldCByZXNwZWN0aXZlbHkKKyAqLworc3RydWN0IG9tYXAzaXNwX3ByZXZfY3NjIHsKKwlfX3UxNiBtYXRyaXhbT01BUDNJU1BfUkdCX01BWF1bT01BUDNJU1BfUkdCX01BWF07CisJX19zMTYgb2Zmc2V0W09NQVAzSVNQX1JHQl9NQVhdOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgb21hcDNpc3BfcHJldl95Y2xpbWl0IC0gWSwgQyBWYWx1ZSBMaW1pdAorICogQG1pbkM6IE1pbmltdW0gQyB2YWx1ZQorICogQG1heEM6IE1heGltdW0gQyB2YWx1ZQorICogQG1pblk6IE1pbmltdW0gWSB2YWx1ZQorICogQG1heFk6IE1heGltdW0gWSB2YWx1ZQorICovCitzdHJ1Y3Qgb21hcDNpc3BfcHJldl95Y2xpbWl0IHsKKwlfX3U4IG1pbkM7CisJX191OCBtYXhDOworCV9fdTggbWluWTsKKwlfX3U4IG1heFk7Cit9OworCisvKioKKyAqIHN0cnVjdCBvbWFwM2lzcF9wcmV2X2Rjb3IgLSBEZWZlY3QgY29ycmVjdGlvbgorICogQGNvdXBsZXRfbW9kZV9lbjogRmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgY291cGxldCBkYyBDb3JyZWN0aW9uIGluIE5GCisgKiBAZGV0ZWN0X2NvcnJlY3Q6IFRocmVzaG9sZHMgZm9yIGNvcnJlY3Rpb24gYml0IDA6MTAgZGV0ZWN0IDE2OjI1IGNvcnJlY3QKKyAqLworc3RydWN0IG9tYXAzaXNwX3ByZXZfZGNvciB7CisJX191OCBjb3VwbGV0X21vZGVfZW47CisJX191MzIgZGV0ZWN0X2NvcnJlY3RbT01BUDNJU1BfUFJFVl9ERVRFQ1RfQ09SUkVDVF9DSEFOTkVMU107Cit9OworCisvKioKKyAqIHN0cnVjdCBvbWFwM2lzcF9wcmV2X25mIC0gTm9pc2UgRmlsdGVyCisgKiBAc3ByZWFkOiBTcHJlYWQgdmFsdWUgdG8gYmUgdXNlZCBpbiBOb2lzZSBGaWx0ZXIKKyAqIEB0YWJsZTogUG9pbnRlciB0byB0aGUgTm9pc2UgRmlsdGVyIHRhYmxlCisgKi8KK3N0cnVjdCBvbWFwM2lzcF9wcmV2X25mIHsKKwlfX3U4IHNwcmVhZDsKKwlfX3UzMiB0YWJsZVtPTUFQM0lTUF9QUkVWX05GX1RCTF9TSVpFXTsKK307CisKKy8qKgorICogc3RydWN0IG9tYXAzaXNwX3ByZXZfZ3RhYmxlcyAtIEdhbW1hIGNvcnJlY3Rpb24gdGFibGVzCisgKiBAcmVkOiBBcnJheSBmb3IgcmVkIGdhbW1hIHRhYmxlLgorICogQGdyZWVuOiBBcnJheSBmb3IgZ3JlZW4gZ2FtbWEgdGFibGUuCisgKiBAYmx1ZTogQXJyYXkgZm9yIGJsdWUgZ2FtbWEgdGFibGUuCisgKi8KK3N0cnVjdCBvbWFwM2lzcF9wcmV2X2d0YWJsZXMgeworCV9fdTMyIHJlZFtPTUFQM0lTUF9QUkVWX0dBTU1BX1RCTF9TSVpFXTsKKwlfX3UzMiBncmVlbltPTUFQM0lTUF9QUkVWX0dBTU1BX1RCTF9TSVpFXTsKKwlfX3UzMiBibHVlW09NQVAzSVNQX1BSRVZfR0FNTUFfVEJMX1NJWkVdOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgb21hcDNpc3BfcHJldl9sdW1hIC0gTHVtYSBlbmhhbmNlbWVudAorICogQHRhYmxlOiBBcnJheSBmb3IgbHVtYSBlbmhhbmNlbWVudCB0YWJsZS4KKyAqLworc3RydWN0IG9tYXAzaXNwX3ByZXZfbHVtYSB7CisJX191MzIgdGFibGVbT01BUDNJU1BfUFJFVl9ZRU5IX1RCTF9TSVpFXTsKK307CisKKy8qKgorICogc3RydWN0IG9tYXAzaXNwX3ByZXZfdXBkYXRlX2NvbmZpZyAtIFByZXZpZXcgZW5naW5lIGNvbmZpZ3VyYXRpb24gKHVzZXIpCisgKiBAdXBkYXRlOiBTcGVjaWZpZXMgd2hpY2ggSVNQIFByZXZpZXcgcmVnaXN0ZXJzIHNob3VsZCBiZSB1cGRhdGVkLgorICogQGZsYWc6IFNwZWNpZmllcyB3aGljaCBJU1AgUHJldmlldyBmdW5jdGlvbnMgc2hvdWxkIGJlIGVuYWJsZWQuCisgKiBAc2hhZGluZ19zaGlmdDogM2JpdCB2YWx1ZSBvZiBzaGlmdCB1c2VkIGluIHNoYWRpbmcgY29tcGVuc2F0aW9uLgorICogQGx1bWE6IFBvaW50ZXIgdG8gbHVtYSBlbmhhbmNlbWVudCBzdHJ1Y3R1cmUuCisgKiBAaG1lZDogUG9pbnRlciB0byBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgb2RkIGFuZCBldmVuIGRpc3RhbmNlLgorICogICAgICAgIGJldHdlZW4gdGhlIHBpeGVscyBpbiB0aGUgaW1hZ2UgYWxvbmcgd2l0aCB0aGUgZmlsdGVyIHRocmVzaG9sZC4KKyAqIEBjZmE6IFBvaW50ZXIgdG8gc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIENGQSBpbnRlcnBvbGF0aW9uIHRhYmxlLCBDRkEuCisgKiAgICAgICBmb3JtYXQgaW4gdGhlIGltYWdlLCB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBncmFkaWVudCB0aHJlc2hvbGQuCisgKiBAY3N1cDogUG9pbnRlciB0byBTdHJ1Y3R1cmUgZm9yIENocm9taW5hbmNlIFN1cHByZXNzaW9uIGNvZWZmaWNpZW50cy4KKyAqIEB3YmFsOiBQb2ludGVyIHRvIHN0cnVjdHVyZSBmb3IgV2hpdGUgQmFsYW5jZS4KKyAqIEBibGthZGo6IFBvaW50ZXIgdG8gc3RydWN0dXJlIGZvciBCbGFjayBBZGp1c3RtZW50LgorICogQHJnYjJyZ2I6IFBvaW50ZXIgdG8gc3RydWN0dXJlIGZvciBSR0IgdG8gUkdCIEJsZW5kaW5nLgorICogQGNzYzogUG9pbnRlciB0byBzdHJ1Y3R1cmUgZm9yIENvbG9yIFNwYWNlIENvbnZlcnNpb24gZnJvbSBSR0ItWUNiWUNyLgorICogQHljbGltaXQ6IFBvaW50ZXIgdG8gc3RydWN0dXJlIGZvciBZLCBDIFZhbHVlIExpbWl0LgorICogQGRjb3I6IFBvaW50ZXIgdG8gc3RydWN0dXJlIGZvciBkZWZlY3QgY29ycmVjdGlvbi4KKyAqIEBuZjogUG9pbnRlciB0byBzdHJ1Y3R1cmUgZm9yIE5vaXNlIEZpbHRlcgorICogQGdhbW1hOiBQb2ludGVyIHRvIGdhbW1hIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IG9tYXAzaXNwX3ByZXZfdXBkYXRlX2NvbmZpZyB7CisJX191MzIgdXBkYXRlOworCV9fdTMyIGZsYWc7CisJX191MzIgc2hhZGluZ19zaGlmdDsKKwlzdHJ1Y3Qgb21hcDNpc3BfcHJldl9sdW1hICpsdW1hOworCXN0cnVjdCBvbWFwM2lzcF9wcmV2X2htZWQgKmhtZWQ7CisJc3RydWN0IG9tYXAzaXNwX3ByZXZfY2ZhICpjZmE7CisJc3RydWN0IG9tYXAzaXNwX3ByZXZfY3N1cCAqY3N1cDsKKwlzdHJ1Y3Qgb21hcDNpc3BfcHJldl93YmFsICp3YmFsOworCXN0cnVjdCBvbWFwM2lzcF9wcmV2X2Jsa2FkaiAqYmxrYWRqOworCXN0cnVjdCBvbWFwM2lzcF9wcmV2X3JnYnRvcmdiICpyZ2IycmdiOworCXN0cnVjdCBvbWFwM2lzcF9wcmV2X2NzYyAqY3NjOworCXN0cnVjdCBvbWFwM2lzcF9wcmV2X3ljbGltaXQgKnljbGltaXQ7CisJc3RydWN0IG9tYXAzaXNwX3ByZXZfZGNvciAqZGNvcjsKKwlzdHJ1Y3Qgb21hcDNpc3BfcHJldl9uZiAqbmY7CisJc3RydWN0IG9tYXAzaXNwX3ByZXZfZ3RhYmxlcyAqZ2FtbWE7Cit9OworCisjZW5kaWYJLyogT01BUDNfSVNQX1VTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9vbWFwZmIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvb21hcGZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzZDU4OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvb21hcGZiLmgKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiBGaWxlOiBpbmNsdWRlL2xpbnV4L29tYXBmYi5oCisgKgorICogRnJhbWVidWZmZXIgZHJpdmVyIGZvciBUSSBPTUFQIGJvYXJkcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX09NQVBGQl9IX18KKyNkZWZpbmUgX19MSU5VWF9PTUFQRkJfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogSU9DVEwgY29tbWFuZHMuICovCisKKyNkZWZpbmUgT01BUF9JT1cobnVtLCBkdHlwZSkJX0lPVygnTycsIG51bSwgZHR5cGUpCisjZGVmaW5lIE9NQVBfSU9SKG51bSwgZHR5cGUpCV9JT1IoJ08nLCBudW0sIGR0eXBlKQorI2RlZmluZSBPTUFQX0lPV1IobnVtLCBkdHlwZSkJX0lPV1IoJ08nLCBudW0sIGR0eXBlKQorI2RlZmluZSBPTUFQX0lPKG51bSkJCV9JTygnTycsIG51bSkKKworI2RlZmluZSBPTUFQRkJfTUlSUk9SCQlPTUFQX0lPVygzMSwgaW50KQorI2RlZmluZSBPTUFQRkJfU1lOQ19HRlgJCU9NQVBfSU8oMzcpCisjZGVmaW5lIE9NQVBGQl9WU1lOQwkJT01BUF9JTygzOCkKKyNkZWZpbmUgT01BUEZCX1NFVF9VUERBVEVfTU9ERQlPTUFQX0lPVyg0MCwgaW50KQorI2RlZmluZSBPTUFQRkJfR0VUX0NBUFMJCU9NQVBfSU9SKDQyLCBzdHJ1Y3Qgb21hcGZiX2NhcHMpCisjZGVmaW5lIE9NQVBGQl9HRVRfVVBEQVRFX01PREUJT01BUF9JT1coNDMsIGludCkKKyNkZWZpbmUgT01BUEZCX0xDRF9URVNUCQlPTUFQX0lPVyg0NSwgaW50KQorI2RlZmluZSBPTUFQRkJfQ1RSTF9URVNUCU9NQVBfSU9XKDQ2LCBpbnQpCisjZGVmaW5lIE9NQVBGQl9VUERBVEVfV0lORE9XX09MRCBPTUFQX0lPVyg0Nywgc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93X29sZCkKKyNkZWZpbmUgT01BUEZCX1NFVF9DT0xPUl9LRVkJT01BUF9JT1coNTAsIHN0cnVjdCBvbWFwZmJfY29sb3Jfa2V5KQorI2RlZmluZSBPTUFQRkJfR0VUX0NPTE9SX0tFWQlPTUFQX0lPVyg1MSwgc3RydWN0IG9tYXBmYl9jb2xvcl9rZXkpCisjZGVmaW5lIE9NQVBGQl9TRVRVUF9QTEFORQlPTUFQX0lPVyg1Miwgc3RydWN0IG9tYXBmYl9wbGFuZV9pbmZvKQorI2RlZmluZSBPTUFQRkJfUVVFUllfUExBTkUJT01BUF9JT1coNTMsIHN0cnVjdCBvbWFwZmJfcGxhbmVfaW5mbykKKyNkZWZpbmUgT01BUEZCX1VQREFURV9XSU5ET1cJT01BUF9JT1coNTQsIHN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdykKKyNkZWZpbmUgT01BUEZCX1NFVFVQX01FTQlPTUFQX0lPVyg1NSwgc3RydWN0IG9tYXBmYl9tZW1faW5mbykKKyNkZWZpbmUgT01BUEZCX1FVRVJZX01FTQlPTUFQX0lPVyg1Niwgc3RydWN0IG9tYXBmYl9tZW1faW5mbykKKyNkZWZpbmUgT01BUEZCX1dBSVRGT1JWU1lOQwlPTUFQX0lPKDU3KQorI2RlZmluZSBPTUFQRkJfTUVNT1JZX1JFQUQJT01BUF9JT1IoNTgsIHN0cnVjdCBvbWFwZmJfbWVtb3J5X3JlYWQpCisjZGVmaW5lIE9NQVBGQl9HRVRfT1ZFUkxBWV9DT0xPUk1PREUgT01BUF9JT1IoNTksIHN0cnVjdCBvbWFwZmJfb3ZsX2NvbG9ybW9kZSkKKyNkZWZpbmUgT01BUEZCX1dBSVRGT1JHTwlPTUFQX0lPKDYwKQorI2RlZmluZSBPTUFQRkJfR0VUX1ZSQU1fSU5GTwlPTUFQX0lPUig2MSwgc3RydWN0IG9tYXBmYl92cmFtX2luZm8pCisjZGVmaW5lIE9NQVBGQl9TRVRfVEVBUlNZTkMJT01BUF9JT1coNjIsIHN0cnVjdCBvbWFwZmJfdGVhcnN5bmNfaW5mbykKKyNkZWZpbmUgT01BUEZCX0dFVF9ESVNQTEFZX0lORk8JT01BUF9JT1IoNjMsIHN0cnVjdCBvbWFwZmJfZGlzcGxheV9pbmZvKQorCisjZGVmaW5lIE9NQVBGQl9DQVBTX0dFTkVSSUNfTUFTSwkweDAwMDAwZmZmCisjZGVmaW5lIE9NQVBGQl9DQVBTX0xDRENfTUFTSwkJMHgwMGZmZjAwMAorI2RlZmluZSBPTUFQRkJfQ0FQU19QQU5FTF9NQVNLCQkweGZmMDAwMDAwCisKKyNkZWZpbmUgT01BUEZCX0NBUFNfTUFOVUFMX1VQREFURQkweDAwMDAxMDAwCisjZGVmaW5lIE9NQVBGQl9DQVBTX1RFQVJTWU5DCQkweDAwMDAyMDAwCisjZGVmaW5lIE9NQVBGQl9DQVBTX1BMQU5FX1JFTE9DQVRFX01FTQkweDAwMDA0MDAwCisjZGVmaW5lIE9NQVBGQl9DQVBTX1BMQU5FX1NDQUxFCQkweDAwMDA4MDAwCisjZGVmaW5lIE9NQVBGQl9DQVBTX1dJTkRPV19QSVhFTF9ET1VCTEUJMHgwMDAxMDAwMAorI2RlZmluZSBPTUFQRkJfQ0FQU19XSU5ET1dfU0NBTEUJMHgwMDAyMDAwMAorI2RlZmluZSBPTUFQRkJfQ0FQU19XSU5ET1dfT1ZFUkxBWQkweDAwMDQwMDAwCisjZGVmaW5lIE9NQVBGQl9DQVBTX1dJTkRPV19ST1RBVEUJMHgwMDA4MDAwMAorI2RlZmluZSBPTUFQRkJfQ0FQU19TRVRfQkFDS0xJR0hUCTB4MDEwMDAwMDAKKworLyogVmFsdWVzIGZyb20gRFNQIG11c3QgbWFwIHRvIGxvd2VyIDE2LWJpdHMgKi8KKyNkZWZpbmUgT01BUEZCX0ZPUk1BVF9NQVNLCQkweDAwZmYKKyNkZWZpbmUgT01BUEZCX0ZPUk1BVF9GTEFHX0RPVUJMRQkweDAxMDAKKyNkZWZpbmUgT01BUEZCX0ZPUk1BVF9GTEFHX1RFQVJTWU5DCTB4MDIwMAorI2RlZmluZSBPTUFQRkJfRk9STUFUX0ZMQUdfRk9SQ0VfVlNZTkMJMHgwNDAwCisjZGVmaW5lIE9NQVBGQl9GT1JNQVRfRkxBR19FTkFCTEVfT1ZFUkxBWQkweDA4MDAKKyNkZWZpbmUgT01BUEZCX0ZPUk1BVF9GTEFHX0RJU0FCTEVfT1ZFUkxBWQkweDEwMDAKKworI2RlZmluZSBPTUFQRkJfTUVNVFlQRV9TRFJBTQkJMAorI2RlZmluZSBPTUFQRkJfTUVNVFlQRV9TUkFNCQkxCisjZGVmaW5lIE9NQVBGQl9NRU1UWVBFX01BWAkJMQorCisjZGVmaW5lIE9NQVBGQl9NRU1fSURYX0VOQUJMRUQJMHg4MAorI2RlZmluZSBPTUFQRkJfTUVNX0lEWF9NQVNLCTB4N2YKKworZW51bSBvbWFwZmJfY29sb3JfZm9ybWF0IHsKKwlPTUFQRkJfQ09MT1JfUkdCNTY1ID0gMCwKKwlPTUFQRkJfQ09MT1JfWVVWNDIyLAorCU9NQVBGQl9DT0xPUl9ZVVY0MjAsCisJT01BUEZCX0NPTE9SX0NMVVRfOEJQUCwKKwlPTUFQRkJfQ09MT1JfQ0xVVF80QlBQLAorCU9NQVBGQl9DT0xPUl9DTFVUXzJCUFAsCisJT01BUEZCX0NPTE9SX0NMVVRfMUJQUCwKKwlPTUFQRkJfQ09MT1JfUkdCNDQ0LAorCU9NQVBGQl9DT0xPUl9ZVVk0MjIsCisKKwlPTUFQRkJfQ09MT1JfQVJHQjE2LAorCU9NQVBGQl9DT0xPUl9SR0IyNFUsCS8qIFJHQjI0LCAzMi1iaXQgY29udGFpbmVyICovCisJT01BUEZCX0NPTE9SX1JHQjI0UCwJLyogUkdCMjQsIDI0LWJpdCBjb250YWluZXIgKi8KKwlPTUFQRkJfQ09MT1JfQVJHQjMyLAorCU9NQVBGQl9DT0xPUl9SR0JBMzIsCisJT01BUEZCX0NPTE9SX1JHQlgzMiwKK307CisKK3N0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyB7CisJX191MzIgeCwgeTsKKwlfX3UzMiB3aWR0aCwgaGVpZ2h0OworCV9fdTMyIGZvcm1hdDsKKwlfX3UzMiBvdXRfeCwgb3V0X3k7CisJX191MzIgb3V0X3dpZHRoLCBvdXRfaGVpZ2h0OworCV9fdTMyIHJlc2VydmVkWzhdOworfTsKKworc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93X29sZCB7CisJX191MzIgeCwgeTsKKwlfX3UzMiB3aWR0aCwgaGVpZ2h0OworCV9fdTMyIGZvcm1hdDsKK307CisKK2VudW0gb21hcGZiX3BsYW5lIHsKKwlPTUFQRkJfUExBTkVfR0ZYID0gMCwKKwlPTUFQRkJfUExBTkVfVklEMSwKKwlPTUFQRkJfUExBTkVfVklEMiwKK307CisKK2VudW0gb21hcGZiX2NoYW5uZWxfb3V0IHsKKwlPTUFQRkJfQ0hBTk5FTF9PVVRfTENEID0gMCwKKwlPTUFQRkJfQ0hBTk5FTF9PVVRfRElHSVQsCit9OworCitzdHJ1Y3Qgb21hcGZiX3BsYW5lX2luZm8geworCV9fdTMyIHBvc194OworCV9fdTMyIHBvc195OworCV9fdTggIGVuYWJsZWQ7CisJX191OCAgY2hhbm5lbF9vdXQ7CisJX191OCAgbWlycm9yOworCV9fdTggIG1lbV9pZHg7CisJX191MzIgb3V0X3dpZHRoOworCV9fdTMyIG91dF9oZWlnaHQ7CisJX191MzIgcmVzZXJ2ZWQyWzEyXTsKK307CisKK3N0cnVjdCBvbWFwZmJfbWVtX2luZm8geworCV9fdTMyIHNpemU7CisJX191OCAgdHlwZTsKKwlfX3U4ICByZXNlcnZlZFszXTsKK307CisKK3N0cnVjdCBvbWFwZmJfY2FwcyB7CisJX191MzIgY3RybDsKKwlfX3UzMiBwbGFuZV9jb2xvcjsKKwlfX3UzMiB3bmRfY29sb3I7Cit9OworCitlbnVtIG9tYXBmYl9jb2xvcl9rZXlfdHlwZSB7CisJT01BUEZCX0NPTE9SX0tFWV9ESVNBQkxFRCA9IDAsCisJT01BUEZCX0NPTE9SX0tFWV9HRlhfRFNULAorCU9NQVBGQl9DT0xPUl9LRVlfVklEX1NSQywKK307CisKK3N0cnVjdCBvbWFwZmJfY29sb3Jfa2V5IHsKKwlfX3U4ICBjaGFubmVsX291dDsKKwlfX3UzMiBiYWNrZ3JvdW5kOworCV9fdTMyIHRyYW5zX2tleTsKKwlfX3U4ICBrZXlfdHlwZTsKK307CisKK2VudW0gb21hcGZiX3VwZGF0ZV9tb2RlIHsKKwlPTUFQRkJfVVBEQVRFX0RJU0FCTEVEID0gMCwKKwlPTUFQRkJfQVVUT19VUERBVEUsCisJT01BUEZCX01BTlVBTF9VUERBVEUKK307CisKK3N0cnVjdCBvbWFwZmJfbWVtb3J5X3JlYWQgeworCV9fdTE2IHg7CisJX191MTYgeTsKKwlfX3UxNiB3OworCV9fdTE2IGg7CisJc2l6ZV90IGJ1ZmZlcl9zaXplOworCXZvaWQgKmJ1ZmZlcjsKK307CisKK3N0cnVjdCBvbWFwZmJfb3ZsX2NvbG9ybW9kZSB7CisJX191OCBvdmVybGF5X2lkeDsKKwlfX3U4IG1vZGVfaWR4OworCV9fdTMyIGJpdHNfcGVyX3BpeGVsOworCV9fdTMyIG5vbnN0ZDsKKwlzdHJ1Y3QgZmJfYml0ZmllbGQgcmVkOworCXN0cnVjdCBmYl9iaXRmaWVsZCBncmVlbjsKKwlzdHJ1Y3QgZmJfYml0ZmllbGQgYmx1ZTsKKwlzdHJ1Y3QgZmJfYml0ZmllbGQgdHJhbnNwOworfTsKKworc3RydWN0IG9tYXBmYl92cmFtX2luZm8geworCV9fdTMyIHRvdGFsOworCV9fdTMyIGZyZWU7CisJX191MzIgbGFyZ2VzdF9mcmVlX2Jsb2NrOworCV9fdTMyIHJlc2VydmVkWzVdOworfTsKKworc3RydWN0IG9tYXBmYl90ZWFyc3luY19pbmZvIHsKKwlfX3U4IGVuYWJsZWQ7CisJX191OCByZXNlcnZlZDFbM107CisJX191MTYgbGluZTsKKwlfX3UxNiByZXNlcnZlZDI7Cit9OworCitzdHJ1Y3Qgb21hcGZiX2Rpc3BsYXlfaW5mbyB7CisJX191MTYgeHJlczsKKwlfX3UxNiB5cmVzOworCV9fdTMyIHdpZHRoOwkvKiBwaHlzIHdpZHRoIG9mIHRoZSBkaXNwbGF5IGluIG1pY3JvbWV0ZXJzICovCisJX191MzIgaGVpZ2h0OwkvKiBwaHlzIGhlaWdodCBvZiB0aGUgZGlzcGxheSBpbiBtaWNyb21ldGVycyAqLworCV9fdTMyIHJlc2VydmVkWzVdOworfTsKKworCisjZW5kaWYgLyogX19PTUFQRkJfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9vb20uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvb29tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE2ZGRkMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvb29tLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfX0lOQ0xVREVfTElOVVhfT09NX0gKKyNkZWZpbmUgX19JTkNMVURFX0xJTlVYX09PTV9ICisKKy8qCisgKiAvcHJvYy88cGlkPi9vb21fYWRqIGlzIGRlcHJlY2F0ZWQsIHNlZQorICogRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0LgorICoKKyAqIC9wcm9jLzxwaWQ+L29vbV9hZGogc2V0IHRvIC0xNyBwcm90ZWN0cyBmcm9tIHRoZSBvb20ta2lsbGVyCisgKi8KKyNkZWZpbmUgT09NX0RJU0FCTEUgKC0xNykKKy8qIGluY2x1c2l2ZSAqLworI2RlZmluZSBPT01fQURKVVNUX01JTiAoLTE2KQorI2RlZmluZSBPT01fQURKVVNUX01BWCAxNQorCisvKgorICogL3Byb2MvPHBpZD4vb29tX3Njb3JlX2FkaiBzZXQgdG8gT09NX1NDT1JFX0FESl9NSU4gZGlzYWJsZXMgb29tIGtpbGxpbmcgZm9yCisgKiBwaWQuCisgKi8KKyNkZWZpbmUgT09NX1NDT1JFX0FESl9NSU4JKC0xMDAwKQorI2RlZmluZSBPT01fU0NPUkVfQURKX01BWAkxMDAwCisKKyNlbmRpZiAvKiBfSU5DTFVERV9MSU5VWF9PT01fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wYXJhbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MmU5MmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BhcmFtLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIF9MSU5VWF9QQVJBTV9ICisjZGVmaW5lIF9MSU5VWF9QQVJBTV9ICisKKyNpbmNsdWRlIDxhc20vcGFyYW0uaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BhcnBvcnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGFycG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZDQ0NDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BhcnBvcnQuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogQW55IHBhcnQgb2YgdGhpcyBwcm9ncmFtIG1heSBiZSB1c2VkIGluIGRvY3VtZW50cyBsaWNlbnNlZCB1bmRlcgorICogdGhlIEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSwgVmVyc2lvbiAxLjEgb3IgYW55IGxhdGVyIHZlcnNpb24KKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1BBUlBPUlRfSF8KKyNkZWZpbmUgX1BBUlBPUlRfSF8KKworLyogU3RhcnQgb2ZmIHdpdGggdXNlci12aXNpYmxlIGNvbnN0YW50cyAqLworCisvKiBNYXhpbXVtIG9mIDE2IHBvcnRzIHBlciBtYWNoaW5lICovCisjZGVmaW5lIFBBUlBPUlRfTUFYICAxNgorCisvKiBNYWdpYyBudW1iZXJzICovCisjZGVmaW5lIFBBUlBPUlRfSVJRX05PTkUgIC0xCisjZGVmaW5lIFBBUlBPUlRfRE1BX05PTkUgIC0xCisjZGVmaW5lIFBBUlBPUlRfSVJRX0FVVE8gIC0yCisjZGVmaW5lIFBBUlBPUlRfRE1BX0FVVE8gIC0yCisjZGVmaW5lIFBBUlBPUlRfRE1BX05PRklGTyAtMworI2RlZmluZSBQQVJQT1JUX0RJU0FCTEUgICAtMgorI2RlZmluZSBQQVJQT1JUX0lSUV9QUk9CRU9OTFkgLTMKKyNkZWZpbmUgUEFSUE9SVF9JT0hJX0FVVE8gLTEKKworI2RlZmluZSBQQVJQT1JUX0NPTlRST0xfU1RST0JFICAgIDB4MQorI2RlZmluZSBQQVJQT1JUX0NPTlRST0xfQVVUT0ZEICAgIDB4MgorI2RlZmluZSBQQVJQT1JUX0NPTlRST0xfSU5JVCAgICAgIDB4NAorI2RlZmluZSBQQVJQT1JUX0NPTlRST0xfU0VMRUNUICAgIDB4OAorCisjZGVmaW5lIFBBUlBPUlRfU1RBVFVTX0VSUk9SICAgICAgMHg4CisjZGVmaW5lIFBBUlBPUlRfU1RBVFVTX1NFTEVDVCAgICAgMHgxMAorI2RlZmluZSBQQVJQT1JUX1NUQVRVU19QQVBFUk9VVCAgIDB4MjAKKyNkZWZpbmUgUEFSUE9SVF9TVEFUVVNfQUNLICAgICAgICAweDQwCisjZGVmaW5lIFBBUlBPUlRfU1RBVFVTX0JVU1kgICAgICAgMHg4MAorCisvKiBUeXBlIGNsYXNzZXMgZm9yIFBsdWctYW5kLVBsYXkgcHJvYmUuICAqLwordHlwZWRlZiBlbnVtIHsKKwlQQVJQT1JUX0NMQVNTX0xFR0FDWSA9IDAsICAgICAgIC8qIE5vbi1JRUVFMTI4NCBkZXZpY2UgKi8KKwlQQVJQT1JUX0NMQVNTX1BSSU5URVIsCisJUEFSUE9SVF9DTEFTU19NT0RFTSwKKwlQQVJQT1JUX0NMQVNTX05FVCwKKwlQQVJQT1JUX0NMQVNTX0hEQywgICAgICAgICAgICAgIC8qIEhhcmQgZGlzayBjb250cm9sbGVyICovCisJUEFSUE9SVF9DTEFTU19QQ01DSUEsCisJUEFSUE9SVF9DTEFTU19NRURJQSwgICAgICAgICAgICAvKiBNdWx0aW1lZGlhIGRldmljZSAqLworCVBBUlBPUlRfQ0xBU1NfRkRDLCAgICAgICAgICAgICAgLyogRmxvcHB5IGRpc2sgY29udHJvbGxlciAqLworCVBBUlBPUlRfQ0xBU1NfUE9SVFMsCisJUEFSUE9SVF9DTEFTU19TQ0FOTkVSLAorCVBBUlBPUlRfQ0xBU1NfRElHQ0FNLAorCVBBUlBPUlRfQ0xBU1NfT1RIRVIsICAgICAgICAgICAgLyogQW55dGhpbmcgZWxzZSAqLworCVBBUlBPUlRfQ0xBU1NfVU5TUEVDLCAgICAgICAgICAgLyogTm8gQ0xTIGZpZWxkIGluIElEICovCisJUEFSUE9SVF9DTEFTU19TQ1NJQURBUFRFUgorfSBwYXJwb3J0X2RldmljZV9jbGFzczsKKworLyogVGhlICJtb2RlcyIgZW50cnkgaW4gcGFycG9ydCBpcyBhIGJpdCBmaWVsZCByZXByZXNlbnRpbmcgdGhlCisgICBjYXBhYmlsaXRpZXMgb2YgdGhlIGhhcmR3YXJlLiAqLworI2RlZmluZSBQQVJQT1JUX01PREVfUENTUFAJKDE8PDApIC8qIElCTSBQQyByZWdpc3RlcnMgYXZhaWxhYmxlLiAqLworI2RlZmluZSBQQVJQT1JUX01PREVfVFJJU1RBVEUJKDE8PDEpIC8qIENhbiB0cmlzdGF0ZS4gKi8KKyNkZWZpbmUgUEFSUE9SVF9NT0RFX0VQUAkoMTw8MikgLyogSGFyZHdhcmUgRVBQLiAqLworI2RlZmluZSBQQVJQT1JUX01PREVfRUNQCSgxPDwzKSAvKiBIYXJkd2FyZSBFQ1AuICovCisjZGVmaW5lIFBBUlBPUlRfTU9ERV9DT01QQVQJKDE8PDQpIC8qIEhhcmR3YXJlICdwcmludGVyIHByb3RvY29sJy4gKi8KKyNkZWZpbmUgUEFSUE9SVF9NT0RFX0RNQQkoMTw8NSkgLyogSGFyZHdhcmUgY2FuIERNQS4gKi8KKyNkZWZpbmUgUEFSUE9SVF9NT0RFX1NBRkVJTklOVAkoMTw8NikgLyogU1BQIHJlZ2lzdGVycyBhY2Nlc3NpYmxlIGluIElSUS4gKi8KKworLyogSUVFRTEyODQgbW9kZXM6IAorICAgTmliYmxlIG1vZGUsIGJ5dGUgbW9kZSwgRUNQLCBFQ1BSTEUgYW5kIEVQUCBhcmUgdGhlaXIgb3duCisgICAnZXh0ZW5zaWJpbGl0eSByZXF1ZXN0JyB2YWx1ZXMuICBPdGhlcnMgYXJlIHNwZWNpYWwuCisgICAnUmVhbCcgRUNQIG1vZGVzIG11c3QgaGF2ZSB0aGUgSUVFRTEyODRfTU9ERV9FQ1AgYml0IHNldC4gICovCisjZGVmaW5lIElFRUUxMjg0X01PREVfTklCQkxFICAgICAgICAgICAgIDAKKyNkZWZpbmUgSUVFRTEyODRfTU9ERV9CWVRFICAgICAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTEyODRfTU9ERV9DT01QQVQgICAgICAgICAgICAoMTw8OCkKKyNkZWZpbmUgSUVFRTEyODRfTU9ERV9CRUNQICAgICAgICAgICAgICAoMTw8OSkgLyogQm91bmRlZCBFQ1AgbW9kZSAqLworI2RlZmluZSBJRUVFMTI4NF9NT0RFX0VDUCAgICAgICAgICAgICAgICgxPDw0KQorI2RlZmluZSBJRUVFMTI4NF9NT0RFX0VDUFJMRSAgICAgICAgICAgIChJRUVFMTI4NF9NT0RFX0VDUCB8ICgxPDw1KSkKKyNkZWZpbmUgSUVFRTEyODRfTU9ERV9FQ1BTV0UgICAgICAgICAgICAoMTw8MTApIC8qIFNvZnR3YXJlLWVtdWxhdGVkICovCisjZGVmaW5lIElFRUUxMjg0X01PREVfRVBQICAgICAgICAgICAgICAgKDE8PDYpCisjZGVmaW5lIElFRUUxMjg0X01PREVfRVBQU0wgICAgICAgICAgICAgKDE8PDExKSAvKiBFUFAgMS43ICovCisjZGVmaW5lIElFRUUxMjg0X01PREVfRVBQU1dFICAgICAgICAgICAgKDE8PDEyKSAvKiBTb2Z0d2FyZS1lbXVsYXRlZCAqLworI2RlZmluZSBJRUVFMTI4NF9ERVZJQ0VJRCAgICAgICAgICAgICAgICgxPDwyKSAgLyogVGhpcyBpcyBhIGZsYWcgKi8KKyNkZWZpbmUgSUVFRTEyODRfRVhUX0xJTksgICAgICAgICAgICAgICAoMTw8MTQpIC8qIFRoaXMgZmxhZyBjYXVzZXMgdGhlCisJCQkJCQkgKiBleHRlbnNpYmlsaXR5IGxpbmsgdG8KKwkJCQkJCSAqIGJlIHJlcXVlc3RlZCwgdXNpbmcKKwkJCQkJCSAqIGJpdHMgMC02LiAqLworCisvKiBGb3IgdGhlIGJlbmVmaXQgb2YgcGFycG9ydF9yZWFkL3dyaXRlLCB5b3UgY2FuIHVzZSB0aGVzZSB3aXRoCisgKiBwYXJwb3J0X25lZ290aWF0ZSB0byB1c2UgYWRkcmVzcyBvcGVyYXRpb25zLiAgVGhleSBoYXZlIG5vIGVmZmVjdAorICogb3RoZXIgdGhhbiB0byBtYWtlIHBhcnBvcnRfcmVhZC93cml0ZSB1c2UgYWRkcmVzcyB0cmFuc2ZlcnMuICovCisjZGVmaW5lIElFRUUxMjg0X0FERFIJCQkoMTw8MTMpCS8qIFRoaXMgaXMgYSBmbGFnICovCisjZGVmaW5lIElFRUUxMjg0X0RBVEEJCQkgMAkvKiBTbyBpcyB0aGlzICovCisKKy8qIEZsYWdzIGZvciBibG9jayB0cmFuc2ZlciBvcGVyYXRpb25zLiAqLworI2RlZmluZSBQQVJQT1JUX0VQUF9GQVNUCQkoMTw8MCkgLyogVW5yZWxpYWJsZSBjb3VudHMuICovCisjZGVmaW5lIFBBUlBPUlRfVzkxMjg0UElDCQkoMTw8MSkgLyogaGF2ZSBhIFdhcnA5IHc5MTI4NHBpYyBpbiB0aGUgZGV2aWNlICovCisKKy8qIFRoZSByZXN0IGlzIGZvciB0aGUga2VybmVsIG9ubHkgKi8KKyNlbmRpZiAvKiBfUEFSUE9SVF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wYXRjaGtleS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wYXRjaGtleS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzODEwZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BhdGNoa2V5LmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIDxsaW51eC9wYXRjaGtleS5oPiAtLSBkZWZpbml0aW9uIG9mIF9QQVRDSEtFWSBtYWNybworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBTdHVhcnQgQnJhZHkKKyAqCisgKiBUaGlzIGV4aXN0cyBiZWNhdXNlIGF3ZV92b2ljZS5oIGRlZmluZWQgaXRzIG93biBfUEFUQ0hLRVkgYW5kIGl0IHdhc24ndAorICogY2xlYXIgd2hldGhlciByZW1vdmluZyB0aGlzIHdvdWxkIGJyZWFrIGFueXRoaW5nIGluIHVzZXJzcGFjZS4KKyAqCisgKiBEbyBub3QgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkuICBQbGVhc2UgdXNlIDxzeXMvc291bmRjYXJkLmg+IGluc3RlYWQuCisgKiBGb3Iga2VybmVsIGNvZGUsIHVzZSA8bGludXgvc291bmRjYXJkLmg+CisgKi8KKworI2lmbmRlZiBfTElOVVhfUEFUQ0hLRVlfSF9JTkRJUkVDVAorI2Vycm9yICJwYXRjaGtleS5oIGluY2x1ZGVkIGRpcmVjdGx5IgorI2VuZGlmCisKKyNpZm5kZWYgX0xJTlVYX1BBVENIS0VZX0gKKyNkZWZpbmUgX0xJTlVYX1BBVENIS0VZX0gKKworLyogRW5kaWFuIG1hY3Jvcy4gKi8KKyMgIGluY2x1ZGUgPGVuZGlhbi5oPgorCisjaWYgICBkZWZpbmVkKF9fQllURV9PUkRFUikKKyMgIGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyMgICAgZGVmaW5lIF9QQVRDSEtFWShpZCkgKDB4ZmQwMHxpZCkKKyMgIGVsaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorIyAgICBkZWZpbmUgX1BBVENIS0VZKGlkKSAoKGlkPDw4KXwweDAwZmQpCisjICBlbHNlCisjICAgIGVycm9yICJjb3VsZCBub3QgZGV0ZXJtaW5lIGJ5dGUgb3JkZXIiCisjICBlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBfTElOVVhfUEFUQ0hLRVlfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wY2kuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTViYjVjNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGNpLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqCXBjaS5oCisgKgorICoJUENJIGRlZmluZXMgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqCUNvcHlyaWdodCAxOTk0LCBEcmV3IEVja2hhcmR0CisgKglDb3B5cmlnaHQgMTk5Ny0tMTk5OSBNYXJ0aW4gTWFyZXMgPG1qQHVjdy5jej4KKyAqCisgKglGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgdGhlIGZvbGxvd2luZyBtYW51YWxzIChsb29rIGF0CisgKglodHRwOi8vd3d3LnBjaXNpZy5jb20vIGZvciBob3cgdG8gZ2V0IHRoZW0pOgorICoKKyAqCVBDSSBCSU9TIFNwZWNpZmljYXRpb24KKyAqCVBDSSBMb2NhbCBCdXMgU3BlY2lmaWNhdGlvbgorICoJUENJIHRvIFBDSSBCcmlkZ2UgU3BlY2lmaWNhdGlvbgorICoJUENJIFN5c3RlbSBEZXNpZ24gR3VpZGUKKyAqLworCisjaWZuZGVmIExJTlVYX1BDSV9ICisjZGVmaW5lIExJTlVYX1BDSV9ICisKKyNpbmNsdWRlIDxsaW51eC9wY2lfcmVncy5oPgkvKiBUaGUgcGNpIHJlZ2lzdGVyIGRlZmluZXMgKi8KKworLyoKKyAqIFRoZSBQQ0kgaW50ZXJmYWNlIHRyZWF0cyBtdWx0aS1mdW5jdGlvbiBkZXZpY2VzIGFzIGluZGVwZW5kZW50CisgKiBkZXZpY2VzLiAgVGhlIHNsb3QvZnVuY3Rpb24gYWRkcmVzcyBvZiBlYWNoIGRldmljZSBpcyBlbmNvZGVkCisgKiBpbiBhIHNpbmdsZSBieXRlIGFzIGZvbGxvd3M6CisgKgorICoJNzozID0gc2xvdAorICoJMjowID0gZnVuY3Rpb24KKyAqLworI2RlZmluZSBQQ0lfREVWRk4oc2xvdCwgZnVuYykJKCgoKHNsb3QpICYgMHgxZikgPDwgMykgfCAoKGZ1bmMpICYgMHgwNykpCisjZGVmaW5lIFBDSV9TTE9UKGRldmZuKQkJKCgoZGV2Zm4pID4+IDMpICYgMHgxZikKKyNkZWZpbmUgUENJX0ZVTkMoZGV2Zm4pCQkoKGRldmZuKSAmIDB4MDcpCisKKy8qIElvY3RscyBmb3IgL3Byb2MvYnVzL3BjaS9YL1kgbm9kZXMuICovCisjZGVmaW5lIFBDSUlPQ19CQVNFCQkoJ1AnIDw8IDI0IHwgJ0MnIDw8IDE2IHwgJ0knIDw8IDgpCisjZGVmaW5lIFBDSUlPQ19DT05UUk9MTEVSCShQQ0lJT0NfQkFTRSB8IDB4MDApCS8qIEdldCBjb250cm9sbGVyIGZvciBQQ0kgZGV2aWNlLiAqLworI2RlZmluZSBQQ0lJT0NfTU1BUF9JU19JTwkoUENJSU9DX0JBU0UgfCAweDAxKQkvKiBTZXQgbW1hcCBzdGF0ZSB0byBJL08gc3BhY2UuICovCisjZGVmaW5lIFBDSUlPQ19NTUFQX0lTX01FTQkoUENJSU9DX0JBU0UgfCAweDAyKQkvKiBTZXQgbW1hcCBzdGF0ZSB0byBNRU0gc3BhY2UuICovCisjZGVmaW5lIFBDSUlPQ19XUklURV9DT01CSU5FCShQQ0lJT0NfQkFTRSB8IDB4MDMpCS8qIEVuYWJsZS9kaXNhYmxlIHdyaXRlLWNvbWJpbmluZy4gKi8KKworI2VuZGlmIC8qIExJTlVYX1BDSV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExYzQxMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaApAQCAtMCwwICsxLDczNSBAQAorLyoKKyAqCXBjaV9yZWdzLmgKKyAqCisgKglQQ0kgc3RhbmRhcmQgZGVmaW5lcworICoJQ29weXJpZ2h0IDE5OTQsIERyZXcgRWNraGFyZHQKKyAqCUNvcHlyaWdodCAxOTk3LS0xOTk5IE1hcnRpbiBNYXJlcyA8bWpAdWN3LmN6PgorICoKKyAqCUZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgY29uc3VsdCB0aGUgZm9sbG93aW5nIG1hbnVhbHMgKGxvb2sgYXQKKyAqCWh0dHA6Ly93d3cucGNpc2lnLmNvbS8gZm9yIGhvdyB0byBnZXQgdGhlbSk6CisgKgorICoJUENJIEJJT1MgU3BlY2lmaWNhdGlvbgorICoJUENJIExvY2FsIEJ1cyBTcGVjaWZpY2F0aW9uCisgKglQQ0kgdG8gUENJIEJyaWRnZSBTcGVjaWZpY2F0aW9uCisgKglQQ0kgU3lzdGVtIERlc2lnbiBHdWlkZQorICoKKyAqIAlGb3IgaHlwZXJ0cmFuc3BvcnQgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0IHRoZSBmb2xsb3dpbmcgbWFudWFscworICogCWZyb20gaHR0cDovL3d3dy5oeXBlcnRyYW5zcG9ydC5vcmcKKyAqCisgKglUaGUgSHlwZXJ0cmFuc3BvcnQgSS9PIExpbmsgU3BlY2lmaWNhdGlvbgorICovCisKKyNpZm5kZWYgTElOVVhfUENJX1JFR1NfSAorI2RlZmluZSBMSU5VWF9QQ0lfUkVHU19ICisKKy8qCisgKiBVbmRlciBQQ0ksIGVhY2ggZGV2aWNlIGhhcyAyNTYgYnl0ZXMgb2YgY29uZmlndXJhdGlvbiBhZGRyZXNzIHNwYWNlLAorICogb2Ygd2hpY2ggdGhlIGZpcnN0IDY0IGJ5dGVzIGFyZSBzdGFuZGFyZGl6ZWQgYXMgZm9sbG93czoKKyAqLworI2RlZmluZSBQQ0lfVkVORE9SX0lECQkweDAwCS8qIDE2IGJpdHMgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRAkJMHgwMgkvKiAxNiBiaXRzICovCisjZGVmaW5lIFBDSV9DT01NQU5ECQkweDA0CS8qIDE2IGJpdHMgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX0lPCQkweDEJLyogRW5hYmxlIHJlc3BvbnNlIGluIEkvTyBzcGFjZSAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfTUVNT1JZCTB4MgkvKiBFbmFibGUgcmVzcG9uc2UgaW4gTWVtb3J5IHNwYWNlICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9NQVNURVIJMHg0CS8qIEVuYWJsZSBidXMgbWFzdGVyaW5nICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9TUEVDSUFMCTB4OAkvKiBFbmFibGUgcmVzcG9uc2UgdG8gc3BlY2lhbCBjeWNsZXMgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX0lOVkFMSURBVEUJMHgxMAkvKiBVc2UgbWVtb3J5IHdyaXRlIGFuZCBpbnZhbGlkYXRlICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9WR0FfUEFMRVRURSAweDIwCS8qIEVuYWJsZSBwYWxldHRlIHNub29waW5nICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9QQVJJVFkJMHg0MAkvKiBFbmFibGUgcGFyaXR5IGNoZWNraW5nICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9XQUlUIAkweDgwCS8qIEVuYWJsZSBhZGRyZXNzL2RhdGEgc3RlcHBpbmcgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX1NFUlIJMHgxMDAJLyogRW5hYmxlIFNFUlIgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX0ZBU1RfQkFDSwkweDIwMAkvKiBFbmFibGUgYmFjay10by1iYWNrIHdyaXRlcyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFIDB4NDAwIC8qIElOVHggRW11bGF0aW9uIERpc2FibGUgKi8KKworI2RlZmluZSBQQ0lfU1RBVFVTCQkweDA2CS8qIDE2IGJpdHMgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfSU5URVJSVVBUCTB4MDgJLyogSW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSAgUENJX1NUQVRVU19DQVBfTElTVAkweDEwCS8qIFN1cHBvcnQgQ2FwYWJpbGl0eSBMaXN0ICovCisjZGVmaW5lICBQQ0lfU1RBVFVTXzY2TUhaCTB4MjAJLyogU3VwcG9ydCA2NiBNaHogUENJIDIuMSBidXMgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfVURGCQkweDQwCS8qIFN1cHBvcnQgVXNlciBEZWZpbmFibGUgRmVhdHVyZXMgW29ic29sZXRlXSAqLworI2RlZmluZSAgUENJX1NUQVRVU19GQVNUX0JBQ0sJMHg4MAkvKiBBY2NlcHQgZmFzdC1iYWNrIHRvIGJhY2sgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfUEFSSVRZCTB4MTAwCS8qIERldGVjdGVkIHBhcml0eSBlcnJvciAqLworI2RlZmluZSAgUENJX1NUQVRVU19ERVZTRUxfTUFTSwkweDYwMAkvKiBERVZTRUwgdGltaW5nICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX0RFVlNFTF9GQVNUCQkweDAwMAorI2RlZmluZSAgUENJX1NUQVRVU19ERVZTRUxfTUVESVVNCTB4MjAwCisjZGVmaW5lICBQQ0lfU1RBVFVTX0RFVlNFTF9TTE9XCQkweDQwMAorI2RlZmluZSAgUENJX1NUQVRVU19TSUdfVEFSR0VUX0FCT1JUCTB4ODAwIC8qIFNldCBvbiB0YXJnZXQgYWJvcnQgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfUkVDX1RBUkdFVF9BQk9SVAkweDEwMDAgLyogTWFzdGVyIGFjayBvZiAiICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX1JFQ19NQVNURVJfQUJPUlQJMHgyMDAwIC8qIFNldCBvbiBtYXN0ZXIgYWJvcnQgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfU0lHX1NZU1RFTV9FUlJPUgkweDQwMDAgLyogU2V0IHdoZW4gd2UgZHJpdmUgU0VSUiAqLworI2RlZmluZSAgUENJX1NUQVRVU19ERVRFQ1RFRF9QQVJJVFkJMHg4MDAwIC8qIFNldCBvbiBwYXJpdHkgZXJyb3IgKi8KKworI2RlZmluZSBQQ0lfQ0xBU1NfUkVWSVNJT04JMHgwOAkvKiBIaWdoIDI0IGJpdHMgYXJlIGNsYXNzLCBsb3cgOCByZXZpc2lvbiAqLworI2RlZmluZSBQQ0lfUkVWSVNJT05fSUQJCTB4MDgJLyogUmV2aXNpb24gSUQgKi8KKyNkZWZpbmUgUENJX0NMQVNTX1BST0cJCTB4MDkJLyogUmVnLiBMZXZlbCBQcm9ncmFtbWluZyBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgUENJX0NMQVNTX0RFVklDRQkweDBhCS8qIERldmljZSBjbGFzcyAqLworCisjZGVmaW5lIFBDSV9DQUNIRV9MSU5FX1NJWkUJMHgwYwkvKiA4IGJpdHMgKi8KKyNkZWZpbmUgUENJX0xBVEVOQ1lfVElNRVIJMHgwZAkvKiA4IGJpdHMgKi8KKyNkZWZpbmUgUENJX0hFQURFUl9UWVBFCQkweDBlCS8qIDggYml0cyAqLworI2RlZmluZSAgUENJX0hFQURFUl9UWVBFX05PUk1BTAkJMAorI2RlZmluZSAgUENJX0hFQURFUl9UWVBFX0JSSURHRQkJMQorI2RlZmluZSAgUENJX0hFQURFUl9UWVBFX0NBUkRCVVMJMgorCisjZGVmaW5lIFBDSV9CSVNUCQkweDBmCS8qIDggYml0cyAqLworI2RlZmluZSAgUENJX0JJU1RfQ09ERV9NQVNLCTB4MGYJLyogUmV0dXJuIHJlc3VsdCAqLworI2RlZmluZSAgUENJX0JJU1RfU1RBUlQJCTB4NDAJLyogMSB0byBzdGFydCBCSVNULCAyIHNlY3Mgb3IgbGVzcyAqLworI2RlZmluZSAgUENJX0JJU1RfQ0FQQUJMRQkweDgwCS8qIDEgaWYgQklTVCBjYXBhYmxlICovCisKKy8qCisgKiBCYXNlIGFkZHJlc3NlcyBzcGVjaWZ5IGxvY2F0aW9ucyBpbiBtZW1vcnkgb3IgSS9PIHNwYWNlLgorICogRGVjb2RlZCBzaXplIGNhbiBiZSBkZXRlcm1pbmVkIGJ5IHdyaXRpbmcgYSB2YWx1ZSBvZgorICogMHhmZmZmZmZmZiB0byB0aGUgcmVnaXN0ZXIsIGFuZCByZWFkaW5nIGl0IGJhY2suICBPbmx5CisgKiAxIGJpdHMgYXJlIGRlY29kZWQuCisgKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18wCTB4MTAJLyogMzIgYml0cyAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzEJMHgxNAkvKiAzMiBiaXRzIFtodHlwZSAwLDEgb25seV0gKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18yCTB4MTgJLyogMzIgYml0cyBbaHR5cGUgMCBvbmx5XSAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzMJMHgxYwkvKiAzMiBiaXRzICovCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfNAkweDIwCS8qIDMyIGJpdHMgKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU181CTB4MjQJLyogMzIgYml0cyAqLworI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19TUEFDRQkJMHgwMQkvKiAwID0gbWVtb3J5LCAxID0gSS9PICovCisjZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPCTB4MDEKKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfTUVNT1JZCTB4MDAKKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfTUFTSwkweDA2CisjZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzMyCTB4MDAJLyogMzIgYml0IGFkZHJlc3MgKi8KKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfMU0JMHgwMgkvKiBCZWxvdyAxTSBbb2Jzb2xldGVdICovCisjZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0CTB4MDQJLyogNjQgYml0IGFkZHJlc3MgKi8KKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1BSRUZFVENICTB4MDgJLyogcHJlZmV0Y2hhYmxlPyAqLworI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSwkofjB4MGZVTCkKKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSwkofjB4MDNVTCkKKy8qIGJpdCAxIGlzIHJlc2VydmVkIGlmIGFkZHJlc3Nfc3BhY2UgPSAxICovCisKKy8qIEhlYWRlciB0eXBlIDAgKG5vcm1hbCBkZXZpY2VzKSAqLworI2RlZmluZSBQQ0lfQ0FSREJVU19DSVMJCTB4MjgKKyNkZWZpbmUgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQJMHgyYworI2RlZmluZSBQQ0lfU1VCU1lTVEVNX0lECTB4MmUKKyNkZWZpbmUgUENJX1JPTV9BRERSRVNTCQkweDMwCS8qIEJpdHMgMzEuLjExIGFyZSBhZGRyZXNzLCAxMC4uMSByZXNlcnZlZCAqLworI2RlZmluZSAgUENJX1JPTV9BRERSRVNTX0VOQUJMRQkweDAxCisjZGVmaW5lIFBDSV9ST01fQUREUkVTU19NQVNLCSh+MHg3ZmZVTCkKKworI2RlZmluZSBQQ0lfQ0FQQUJJTElUWV9MSVNUCTB4MzQJLyogT2Zmc2V0IG9mIGZpcnN0IGNhcGFiaWxpdHkgbGlzdCBlbnRyeSAqLworCisvKiAweDM1LTB4M2IgYXJlIHJlc2VydmVkICovCisjZGVmaW5lIFBDSV9JTlRFUlJVUFRfTElORQkweDNjCS8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfSU5URVJSVVBUX1BJTgkweDNkCS8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfTUlOX0dOVAkJMHgzZQkvKiA4IGJpdHMgKi8KKyNkZWZpbmUgUENJX01BWF9MQVQJCTB4M2YJLyogOCBiaXRzICovCisKKy8qIEhlYWRlciB0eXBlIDEgKFBDSS10by1QQ0kgYnJpZGdlcykgKi8KKyNkZWZpbmUgUENJX1BSSU1BUllfQlVTCQkweDE4CS8qIFByaW1hcnkgYnVzIG51bWJlciAqLworI2RlZmluZSBQQ0lfU0VDT05EQVJZX0JVUwkweDE5CS8qIFNlY29uZGFyeSBidXMgbnVtYmVyICovCisjZGVmaW5lIFBDSV9TVUJPUkRJTkFURV9CVVMJMHgxYQkvKiBIaWdoZXN0IGJ1cyBudW1iZXIgYmVoaW5kIHRoZSBicmlkZ2UgKi8KKyNkZWZpbmUgUENJX1NFQ19MQVRFTkNZX1RJTUVSCTB4MWIJLyogTGF0ZW5jeSB0aW1lciBmb3Igc2Vjb25kYXJ5IGludGVyZmFjZSAqLworI2RlZmluZSBQQ0lfSU9fQkFTRQkJMHgxYwkvKiBJL08gcmFuZ2UgYmVoaW5kIHRoZSBicmlkZ2UgKi8KKyNkZWZpbmUgUENJX0lPX0xJTUlUCQkweDFkCisjZGVmaW5lICBQQ0lfSU9fUkFOR0VfVFlQRV9NQVNLCTB4MGZVTAkvKiBJL08gYnJpZGdpbmcgdHlwZSAqLworI2RlZmluZSAgUENJX0lPX1JBTkdFX1RZUEVfMTYJMHgwMAorI2RlZmluZSAgUENJX0lPX1JBTkdFX1RZUEVfMzIJMHgwMQorI2RlZmluZSAgUENJX0lPX1JBTkdFX01BU0sJKH4weDBmVUwpCisjZGVmaW5lIFBDSV9TRUNfU1RBVFVTCQkweDFlCS8qIFNlY29uZGFyeSBzdGF0dXMgcmVnaXN0ZXIsIG9ubHkgYml0IDE0IHVzZWQgKi8KKyNkZWZpbmUgUENJX01FTU9SWV9CQVNFCQkweDIwCS8qIE1lbW9yeSByYW5nZSBiZWhpbmQgKi8KKyNkZWZpbmUgUENJX01FTU9SWV9MSU1JVAkweDIyCisjZGVmaW5lICBQQ0lfTUVNT1JZX1JBTkdFX1RZUEVfTUFTSyAweDBmVUwKKyNkZWZpbmUgIFBDSV9NRU1PUllfUkFOR0VfTUFTSwkofjB4MGZVTCkKKyNkZWZpbmUgUENJX1BSRUZfTUVNT1JZX0JBU0UJMHgyNAkvKiBQcmVmZXRjaGFibGUgbWVtb3J5IHJhbmdlIGJlaGluZCAqLworI2RlZmluZSBQQ0lfUFJFRl9NRU1PUllfTElNSVQJMHgyNgorI2RlZmluZSAgUENJX1BSRUZfUkFOR0VfVFlQRV9NQVNLIDB4MGZVTAorI2RlZmluZSAgUENJX1BSRUZfUkFOR0VfVFlQRV8zMgkweDAwCisjZGVmaW5lICBQQ0lfUFJFRl9SQU5HRV9UWVBFXzY0CTB4MDEKKyNkZWZpbmUgIFBDSV9QUkVGX1JBTkdFX01BU0sJKH4weDBmVUwpCisjZGVmaW5lIFBDSV9QUkVGX0JBU0VfVVBQRVIzMgkweDI4CS8qIFVwcGVyIGhhbGYgb2YgcHJlZmV0Y2hhYmxlIG1lbW9yeSByYW5nZSAqLworI2RlZmluZSBQQ0lfUFJFRl9MSU1JVF9VUFBFUjMyCTB4MmMKKyNkZWZpbmUgUENJX0lPX0JBU0VfVVBQRVIxNgkweDMwCS8qIFVwcGVyIGhhbGYgb2YgSS9PIGFkZHJlc3NlcyAqLworI2RlZmluZSBQQ0lfSU9fTElNSVRfVVBQRVIxNgkweDMyCisvKiAweDM0IHNhbWUgYXMgZm9yIGh0eXBlIDAgKi8KKy8qIDB4MzUtMHgzYiBpcyByZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfUk9NX0FERFJFU1MxCTB4MzgJLyogU2FtZSBhcyBQQ0lfUk9NX0FERFJFU1MsIGJ1dCBmb3IgaHR5cGUgMSAqLworLyogMHgzYy0weDNkIGFyZSBzYW1lIGFzIGZvciBodHlwZSAwICovCisjZGVmaW5lIFBDSV9CUklER0VfQ09OVFJPTAkweDNlCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9QQVJJVFkJMHgwMQkvKiBFbmFibGUgcGFyaXR5IGRldGVjdGlvbiBvbiBzZWNvbmRhcnkgaW50ZXJmYWNlICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9TRVJSCTB4MDIJLyogVGhlIHNhbWUgZm9yIFNFUlIgZm9yd2FyZGluZyAqLworI2RlZmluZSAgUENJX0JSSURHRV9DVExfSVNBCTB4MDQJLyogRW5hYmxlIElTQSBtb2RlICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9WR0EJMHgwOAkvKiBGb3J3YXJkIFZHQSBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX01BU1RFUl9BQk9SVAkweDIwICAvKiBSZXBvcnQgbWFzdGVyIGFib3J0cyAqLworI2RlZmluZSAgUENJX0JSSURHRV9DVExfQlVTX1JFU0VUCTB4NDAJLyogU2Vjb25kYXJ5IGJ1cyByZXNldCAqLworI2RlZmluZSAgUENJX0JSSURHRV9DVExfRkFTVF9CQUNLCTB4ODAJLyogRmFzdCBCYWNrMkJhY2sgZW5hYmxlZCBvbiBzZWNvbmRhcnkgaW50ZXJmYWNlICovCisKKy8qIEhlYWRlciB0eXBlIDIgKENhcmRCdXMgYnJpZGdlcykgKi8KKyNkZWZpbmUgUENJX0NCX0NBUEFCSUxJVFlfTElTVAkweDE0CisvKiAweDE1IHJlc2VydmVkICovCisjZGVmaW5lIFBDSV9DQl9TRUNfU1RBVFVTCTB4MTYJLyogU2Vjb25kYXJ5IHN0YXR1cyAqLworI2RlZmluZSBQQ0lfQ0JfUFJJTUFSWV9CVVMJMHgxOAkvKiBQQ0kgYnVzIG51bWJlciAqLworI2RlZmluZSBQQ0lfQ0JfQ0FSRF9CVVMJCTB4MTkJLyogQ2FyZEJ1cyBidXMgbnVtYmVyICovCisjZGVmaW5lIFBDSV9DQl9TVUJPUkRJTkFURV9CVVMJMHgxYQkvKiBTdWJvcmRpbmF0ZSBidXMgbnVtYmVyICovCisjZGVmaW5lIFBDSV9DQl9MQVRFTkNZX1RJTUVSCTB4MWIJLyogQ2FyZEJ1cyBsYXRlbmN5IHRpbWVyICovCisjZGVmaW5lIFBDSV9DQl9NRU1PUllfQkFTRV8wCTB4MWMKKyNkZWZpbmUgUENJX0NCX01FTU9SWV9MSU1JVF8wCTB4MjAKKyNkZWZpbmUgUENJX0NCX01FTU9SWV9CQVNFXzEJMHgyNAorI2RlZmluZSBQQ0lfQ0JfTUVNT1JZX0xJTUlUXzEJMHgyOAorI2RlZmluZSBQQ0lfQ0JfSU9fQkFTRV8wCTB4MmMKKyNkZWZpbmUgUENJX0NCX0lPX0JBU0VfMF9ISQkweDJlCisjZGVmaW5lIFBDSV9DQl9JT19MSU1JVF8wCTB4MzAKKyNkZWZpbmUgUENJX0NCX0lPX0xJTUlUXzBfSEkJMHgzMgorI2RlZmluZSBQQ0lfQ0JfSU9fQkFTRV8xCTB4MzQKKyNkZWZpbmUgUENJX0NCX0lPX0JBU0VfMV9ISQkweDM2CisjZGVmaW5lIFBDSV9DQl9JT19MSU1JVF8xCTB4MzgKKyNkZWZpbmUgUENJX0NCX0lPX0xJTUlUXzFfSEkJMHgzYQorI2RlZmluZSAgUENJX0NCX0lPX1JBTkdFX01BU0sJKH4weDAzVUwpCisvKiAweDNjLTB4M2QgYXJlIHNhbWUgYXMgZm9yIGh0eXBlIDAgKi8KKyNkZWZpbmUgUENJX0NCX0JSSURHRV9DT05UUk9MCTB4M2UKKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX1BBUklUWQkweDAxCS8qIFNpbWlsYXIgdG8gc3RhbmRhcmQgYnJpZGdlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX1NFUlIJCTB4MDIKKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX0lTQQkJMHgwNAorI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfVkdBCQkweDA4CisjZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9NQVNURVJfQUJPUlQJMHgyMAorI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfQ0JfUkVTRVQJMHg0MAkvKiBDYXJkQnVzIHJlc2V0ICovCisjZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF8xNkJJVF9JTlQJMHg4MAkvKiBFbmFibGUgaW50ZXJydXB0IGZvciAxNi1iaXQgY2FyZHMgKi8KKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX1BSRUZFVENIX01FTTAgMHgxMDAJLyogUHJlZmV0Y2ggZW5hYmxlIGZvciBib3RoIG1lbW9yeSByZWdpb25zICovCisjZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9QUkVGRVRDSF9NRU0xIDB4MjAwCisjZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9QT1NUX1dSSVRFUwkweDQwMAorI2RlZmluZSBQQ0lfQ0JfU1VCU1lTVEVNX1ZFTkRPUl9JRAkweDQwCisjZGVmaW5lIFBDSV9DQl9TVUJTWVNURU1fSUQJCTB4NDIKKyNkZWZpbmUgUENJX0NCX0xFR0FDWV9NT0RFX0JBU0UJCTB4NDQJLyogMTYtYml0IFBDIENhcmQgbGVnYWN5IG1vZGUgYmFzZSBhZGRyZXNzIChFeENhKSAqLworLyogMHg0OC0weDdmIHJlc2VydmVkICovCisKKy8qIENhcGFiaWxpdHkgbGlzdHMgKi8KKworI2RlZmluZSBQQ0lfQ0FQX0xJU1RfSUQJCTAJLyogQ2FwYWJpbGl0eSBJRCAqLworI2RlZmluZSAgUENJX0NBUF9JRF9QTQkJMHgwMQkvKiBQb3dlciBNYW5hZ2VtZW50ICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX0FHUAkJMHgwMgkvKiBBY2NlbGVyYXRlZCBHcmFwaGljcyBQb3J0ICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX1ZQRAkJMHgwMwkvKiBWaXRhbCBQcm9kdWN0IERhdGEgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfU0xPVElECTB4MDQJLyogU2xvdCBJZGVudGlmaWNhdGlvbiAqLworI2RlZmluZSAgUENJX0NBUF9JRF9NU0kJCTB4MDUJLyogTWVzc2FnZSBTaWduYWxsZWQgSW50ZXJydXB0cyAqLworI2RlZmluZSAgUENJX0NBUF9JRF9DSFNXUAkweDA2CS8qIENvbXBhY3RQQ0kgSG90U3dhcCAqLworI2RlZmluZSAgUENJX0NBUF9JRF9QQ0lYCTB4MDcJLyogUENJLVggKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfSFQJCTB4MDgJLyogSHlwZXJUcmFuc3BvcnQgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfVk5EUgkweDA5CS8qIFZlbmRvciBzcGVjaWZpYyAqLworI2RlZmluZSAgUENJX0NBUF9JRF9EQkcJCTB4MEEJLyogRGVidWcgcG9ydCAqLworI2RlZmluZSAgUENJX0NBUF9JRF9DQ1JDCTB4MEIJLyogQ29tcGFjdFBDSSBDZW50cmFsIFJlc291cmNlIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfU0hQQyAJMHgwQwkvKiBQQ0kgU3RhbmRhcmQgSG90LVBsdWcgQ29udHJvbGxlciAqLworI2RlZmluZSAgUENJX0NBUF9JRF9TU1ZJRAkweDBECS8qIEJyaWRnZSBzdWJzeXN0ZW0gdmVuZG9yL2RldmljZSBJRCAqLworI2RlZmluZSAgUENJX0NBUF9JRF9BR1AzCTB4MEUJLyogQUdQIFRhcmdldCBQQ0ktUENJIGJyaWRnZSAqLworI2RlZmluZSAgUENJX0NBUF9JRF9FWFAgCTB4MTAJLyogUENJIEV4cHJlc3MgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfTVNJWAkweDExCS8qIE1TSS1YICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX0FGCQkweDEzCS8qIFBDSSBBZHZhbmNlZCBGZWF0dXJlcyAqLworI2RlZmluZSBQQ0lfQ0FQX0xJU1RfTkVYVAkxCS8qIE5leHQgY2FwYWJpbGl0eSBpbiB0aGUgbGlzdCAqLworI2RlZmluZSBQQ0lfQ0FQX0ZMQUdTCQkyCS8qIENhcGFiaWxpdHkgZGVmaW5lZCBmbGFncyAoMTYgYml0cykgKi8KKyNkZWZpbmUgUENJX0NBUF9TSVpFT0YJCTQKKworLyogUG93ZXIgTWFuYWdlbWVudCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBQQ0lfUE1fUE1DCQkyCS8qIFBNIENhcGFiaWxpdGllcyBSZWdpc3RlciAqLworI2RlZmluZSAgUENJX1BNX0NBUF9WRVJfTUFTSwkweDAwMDcJLyogVmVyc2lvbiAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfQ0xPQ0sJMHgwMDA4CS8qIFBNRSBjbG9jayByZXF1aXJlZCAqLworI2RlZmluZSAgUENJX1BNX0NBUF9SRVNFUlZFRCAgICAweDAwMTAgIC8qIFJlc2VydmVkIGZpZWxkICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX0RTSQkJMHgwMDIwCS8qIERldmljZSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiAqLworI2RlZmluZSAgUENJX1BNX0NBUF9BVVhfUE9XRVIJMHgwMUMwCS8qIEF1eGlsaWFyeSBwb3dlciBzdXBwb3J0IG1hc2sgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfRDEJCTB4MDIwMAkvKiBEMSBwb3dlciBzdGF0ZSBzdXBwb3J0ICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX0QyCQkweDA0MDAJLyogRDIgcG93ZXIgc3RhdGUgc3VwcG9ydCAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUUJCTB4MDgwMAkvKiBQTUUgcGluIHN1cHBvcnRlZCAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfTUFTSwkweEY4MDAJLyogUE1FIE1hc2sgb2YgYWxsIHN1cHBvcnRlZCBzdGF0ZXMgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QwCTB4MDgwMAkvKiBQTUUjIGZyb20gRDAgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QxCTB4MTAwMAkvKiBQTUUjIGZyb20gRDEgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QyCTB4MjAwMAkvKiBQTUUjIGZyb20gRDIgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QzCTB4NDAwMAkvKiBQTUUjIGZyb20gRDMgKGhvdCkgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QzY29sZAkweDgwMDAJLyogUE1FIyBmcm9tIEQzIChjb2xkKSAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfU0hJRlQJMTEJLyogU3RhcnQgb2YgdGhlIFBNRSBNYXNrIGluIFBNQyAqLworI2RlZmluZSBQQ0lfUE1fQ1RSTAkJNAkvKiBQTSBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9QTV9DVFJMX1NUQVRFX01BU0sJMHgwMDAzCS8qIEN1cnJlbnQgcG93ZXIgc3RhdGUgKEQwIHRvIEQzKSAqLworI2RlZmluZSAgUENJX1BNX0NUUkxfTk9fU09GVF9SRVNFVAkweDAwMDgJLyogTm8gcmVzZXQgZm9yIEQzaG90LT5EMCAqLworI2RlZmluZSAgUENJX1BNX0NUUkxfUE1FX0VOQUJMRQkweDAxMDAJLyogUE1FIHBpbiBlbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9QTV9DVFJMX0RBVEFfU0VMX01BU0sJMHgxZTAwCS8qIERhdGEgc2VsZWN0ICg/PykgKi8KKyNkZWZpbmUgIFBDSV9QTV9DVFJMX0RBVEFfU0NBTEVfTUFTSwkweDYwMDAJLyogRGF0YSBzY2FsZSAoPz8pICovCisjZGVmaW5lICBQQ0lfUE1fQ1RSTF9QTUVfU1RBVFVTCTB4ODAwMAkvKiBQTUUgcGluIHN0YXR1cyAqLworI2RlZmluZSBQQ0lfUE1fUFBCX0VYVEVOU0lPTlMJNgkvKiBQUEIgc3VwcG9ydCBleHRlbnNpb25zICg/PykgKi8KKyNkZWZpbmUgIFBDSV9QTV9QUEJfQjJfQjMJMHg0MAkvKiBTdG9wIGNsb2NrIHdoZW4gaW4gRDNob3QgKD8/KSAqLworI2RlZmluZSAgUENJX1BNX0JQQ0NfRU5BQkxFCTB4ODAJLyogQnVzIHBvd2VyL2Nsb2NrIGNvbnRyb2wgZW5hYmxlICg/PykgKi8KKyNkZWZpbmUgUENJX1BNX0RBVEFfUkVHSVNURVIJNwkvKiAoPz8pICovCisjZGVmaW5lIFBDSV9QTV9TSVpFT0YJCTgKKworLyogQUdQIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIFBDSV9BR1BfVkVSU0lPTgkJMgkvKiBCQ0QgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgUENJX0FHUF9SRlUJCTMJLyogUmVzdCBvZiBjYXBhYmlsaXR5IGZsYWdzICovCisjZGVmaW5lIFBDSV9BR1BfU1RBVFVTCQk0CS8qIFN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfUlFfTUFTSwkweGZmMDAwMDAwCS8qIE1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIC0gMSAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfU0JBCTB4MDIwMAkvKiBTaWRlYmFuZCBhZGRyZXNzaW5nIHN1cHBvcnRlZCAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfNjRCSVQJMHgwMDIwCS8qIDY0LWJpdCBhZGRyZXNzaW5nIHN1cHBvcnRlZCAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfRlcJMHgwMDEwCS8qIEZXIHRyYW5zZmVycyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTX1JBVEU0CTB4MDAwNAkvKiA0eCB0cmFuc2ZlciByYXRlIHN1cHBvcnRlZCAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfUkFURTIJMHgwMDAyCS8qIDJ4IHRyYW5zZmVyIHJhdGUgc3VwcG9ydGVkICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19SQVRFMQkweDAwMDEJLyogMXggdHJhbnNmZXIgcmF0ZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgUENJX0FHUF9DT01NQU5ECQk4CS8qIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF9SUV9NQVNLIDB4ZmYwMDAwMDAgIC8qIE1hc3RlcjogTWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF9TQkEJMHgwMjAwCS8qIFNpZGViYW5kIGFkZHJlc3NpbmcgZW5hYmxlZCAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX0FHUAkweDAxMDAJLyogQWxsb3cgcHJvY2Vzc2luZyBvZiBBR1AgdHJhbnNhY3Rpb25zICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfNjRCSVQJMHgwMDIwIAkvKiBBbGxvdyBwcm9jZXNzaW5nIG9mIDY0LWJpdCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF9GVwkweDAwMTAgCS8qIEZvcmNlIEZXIHRyYW5zZmVycyAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX1JBVEU0CTB4MDAwNAkvKiBVc2UgNHggcmF0ZSAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX1JBVEUyCTB4MDAwMgkvKiBVc2UgMnggcmF0ZSAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX1JBVEUxCTB4MDAwMQkvKiBVc2UgMXggcmF0ZSAqLworI2RlZmluZSBQQ0lfQUdQX1NJWkVPRgkJMTIKKworLyogVml0YWwgUHJvZHVjdCBEYXRhICovCisKKyNkZWZpbmUgUENJX1ZQRF9BRERSCQkyCS8qIEFkZHJlc3MgdG8gYWNjZXNzICgxNSBiaXRzISkgKi8KKyNkZWZpbmUgIFBDSV9WUERfQUREUl9NQVNLCTB4N2ZmZgkvKiBBZGRyZXNzIG1hc2sgKi8KKyNkZWZpbmUgIFBDSV9WUERfQUREUl9GCQkweDgwMDAJLyogV3JpdGUgMCwgMSBpbmRpY2F0ZXMgY29tcGxldGlvbiAqLworI2RlZmluZSBQQ0lfVlBEX0RBVEEJCTQJLyogMzItYml0cyBvZiBkYXRhIHJldHVybmVkIGhlcmUgKi8KKworLyogU2xvdCBJZGVudGlmaWNhdGlvbiAqLworCisjZGVmaW5lIFBDSV9TSURfRVNSCQkyCS8qIEV4cGFuc2lvbiBTbG90IFJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfU0lEX0VTUl9OU0xPVFMJMHgxZgkvKiBOdW1iZXIgb2YgZXhwYW5zaW9uIHNsb3RzIGF2YWlsYWJsZSAqLworI2RlZmluZSAgUENJX1NJRF9FU1JfRklDCTB4MjAJLyogRmlyc3QgSW4gQ2hhc3NpcyBGbGFnICovCisjZGVmaW5lIFBDSV9TSURfQ0hBU1NJU19OUgkzCS8qIENoYXNzaXMgTnVtYmVyICovCisKKy8qIE1lc3NhZ2UgU2lnbmFsbGVkIEludGVycnVwdHMgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgUENJX01TSV9GTEFHUwkJMgkvKiBWYXJpb3VzIGZsYWdzICovCisjZGVmaW5lICBQQ0lfTVNJX0ZMQUdTXzY0QklUCTB4ODAJLyogNjQtYml0IGFkZHJlc3NlcyBhbGxvd2VkICovCisjZGVmaW5lICBQQ0lfTVNJX0ZMQUdTX1FTSVpFCTB4NzAJLyogTWVzc2FnZSBxdWV1ZSBzaXplIGNvbmZpZ3VyZWQgKi8KKyNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfUU1BU0sJMHgwZQkvKiBNYXhpbXVtIHF1ZXVlIHNpemUgYXZhaWxhYmxlICovCisjZGVmaW5lICBQQ0lfTVNJX0ZMQUdTX0VOQUJMRQkweDAxCS8qIE1TSSBmZWF0dXJlIGVuYWJsZWQgKi8KKyNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfTUFTS0JJVAkweDEwMAkvKiA2NC1iaXQgbWFzayBiaXRzIGFsbG93ZWQgKi8KKyNkZWZpbmUgUENJX01TSV9SRlUJCTMJLyogUmVzdCBvZiBjYXBhYmlsaXR5IGZsYWdzICovCisjZGVmaW5lIFBDSV9NU0lfQUREUkVTU19MTwk0CS8qIExvd2VyIDMyIGJpdHMgKi8KKyNkZWZpbmUgUENJX01TSV9BRERSRVNTX0hJCTgJLyogVXBwZXIgMzIgYml0cyAoaWYgUENJX01TSV9GTEFHU182NEJJVCBzZXQpICovCisjZGVmaW5lIFBDSV9NU0lfREFUQV8zMgkJOAkvKiAxNiBiaXRzIG9mIGRhdGEgZm9yIDMyLWJpdCBkZXZpY2VzICovCisjZGVmaW5lIFBDSV9NU0lfTUFTS18zMgkJMTIJLyogTWFzayBiaXRzIHJlZ2lzdGVyIGZvciAzMi1iaXQgZGV2aWNlcyAqLworI2RlZmluZSBQQ0lfTVNJX0RBVEFfNjQJCTEyCS8qIDE2IGJpdHMgb2YgZGF0YSBmb3IgNjQtYml0IGRldmljZXMgKi8KKyNkZWZpbmUgUENJX01TSV9NQVNLXzY0CQkxNgkvKiBNYXNrIGJpdHMgcmVnaXN0ZXIgZm9yIDY0LWJpdCBkZXZpY2VzICovCisKKy8qIE1TSS1YIHJlZ2lzdGVycyAqLworI2RlZmluZSBQQ0lfTVNJWF9GTEFHUwkJMgorI2RlZmluZSAgUENJX01TSVhfRkxBR1NfUVNJWkUJMHg3RkYKKyNkZWZpbmUgIFBDSV9NU0lYX0ZMQUdTX0VOQUJMRQkoMSA8PCAxNSkKKyNkZWZpbmUgIFBDSV9NU0lYX0ZMQUdTX01BU0tBTEwJKDEgPDwgMTQpCisjZGVmaW5lIFBDSV9NU0lYX1RBQkxFCQk0CisjZGVmaW5lIFBDSV9NU0lYX1BCQQkJOAorI2RlZmluZSAgUENJX01TSVhfRkxBR1NfQklSTUFTSwkoNyA8PCAwKQorCisvKiBNU0ktWCBlbnRyeSdzIGZvcm1hdCAqLworI2RlZmluZSBQQ0lfTVNJWF9FTlRSWV9TSVpFCQkxNgorI2RlZmluZSAgUENJX01TSVhfRU5UUllfTE9XRVJfQUREUgkwCisjZGVmaW5lICBQQ0lfTVNJWF9FTlRSWV9VUFBFUl9BRERSCTQKKyNkZWZpbmUgIFBDSV9NU0lYX0VOVFJZX0RBVEEJCTgKKyNkZWZpbmUgIFBDSV9NU0lYX0VOVFJZX1ZFQ1RPUl9DVFJMCTEyCisjZGVmaW5lICAgUENJX01TSVhfRU5UUllfQ1RSTF9NQVNLQklUCTEKKworLyogQ29tcGFjdFBDSSBIb3Rzd2FwIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgUENJX0NIU1dQX0NTUgkJMgkvKiBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9DSFNXUF9ESEEJCTB4MDEJLyogRGV2aWNlIEhpZGluZyBBcm0gKi8KKyNkZWZpbmUgIFBDSV9DSFNXUF9FSU0JCTB4MDIJLyogRU5VTSMgU2lnbmFsIE1hc2sgKi8KKyNkZWZpbmUgIFBDSV9DSFNXUF9QSUUJCTB4MDQJLyogUGVuZGluZyBJbnNlcnQgb3IgRXh0cmFjdCAqLworI2RlZmluZSAgUENJX0NIU1dQX0xPTwkJMHgwOAkvKiBMRUQgT24gLyBPZmYgKi8KKyNkZWZpbmUgIFBDSV9DSFNXUF9QSQkJMHgzMAkvKiBQcm9ncmFtbWluZyBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgIFBDSV9DSFNXUF9FWFQJCTB4NDAJLyogRU5VTSMgc3RhdHVzIC0gZXh0cmFjdGlvbiAqLworI2RlZmluZSAgUENJX0NIU1dQX0lOUwkJMHg4MAkvKiBFTlVNIyBzdGF0dXMgLSBpbnNlcnRpb24gKi8KKworLyogUENJIEFkdmFuY2VkIEZlYXR1cmUgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgUENJX0FGX0xFTkdUSAkJMgorI2RlZmluZSBQQ0lfQUZfQ0FQCQkzCisjZGVmaW5lICBQQ0lfQUZfQ0FQX1RQCQkweDAxCisjZGVmaW5lICBQQ0lfQUZfQ0FQX0ZMUgkJMHgwMgorI2RlZmluZSBQQ0lfQUZfQ1RSTAkJNAorI2RlZmluZSAgUENJX0FGX0NUUkxfRkxSCTB4MDEKKyNkZWZpbmUgUENJX0FGX1NUQVRVUwkJNQorI2RlZmluZSAgUENJX0FGX1NUQVRVU19UUAkweDAxCisKKy8qIFBDSS1YIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIFBDSV9YX0NNRAkJMgkvKiBNb2RlcyAmIEZlYXR1cmVzICovCisjZGVmaW5lICBQQ0lfWF9DTURfRFBFUlJfRQkweDAwMDEJLyogRGF0YSBQYXJpdHkgRXJyb3IgUmVjb3ZlcnkgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfWF9DTURfRVJPCQkweDAwMDIJLyogRW5hYmxlIFJlbGF4ZWQgT3JkZXJpbmcgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9SRUFEXzUxMgkweDAwMDAJLyogNTEyIGJ5dGUgbWF4aW11bSByZWFkIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9SRUFEXzFLCTB4MDAwNAkvKiAxS2J5dGUgbWF4aW11bSByZWFkIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9SRUFEXzJLCTB4MDAwOAkvKiAyS2J5dGUgbWF4aW11bSByZWFkIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9SRUFEXzRLCTB4MDAwYwkvKiA0S2J5dGUgbWF4aW11bSByZWFkIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9NQVhfUkVBRAkweDAwMGMJLyogTWF4IE1lbW9yeSBSZWFkIEJ5dGUgQ291bnQgKi8KKwkJCQkvKiBNYXggIyBvZiBvdXRzdGFuZGluZyBzcGxpdCB0cmFuc2FjdGlvbnMgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9TUExJVF8xCTB4MDAwMAkvKiBNYXggMSAqLworI2RlZmluZSAgUENJX1hfQ01EX1NQTElUXzIJMHgwMDEwCS8qIE1heCAyICovCisjZGVmaW5lICBQQ0lfWF9DTURfU1BMSVRfMwkweDAwMjAJLyogTWF4IDMgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9TUExJVF80CTB4MDAzMAkvKiBNYXggNCAqLworI2RlZmluZSAgUENJX1hfQ01EX1NQTElUXzgJMHgwMDQwCS8qIE1heCA4ICovCisjZGVmaW5lICBQQ0lfWF9DTURfU1BMSVRfMTIJMHgwMDUwCS8qIE1heCAxMiAqLworI2RlZmluZSAgUENJX1hfQ01EX1NQTElUXzE2CTB4MDA2MAkvKiBNYXggMTYgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9TUExJVF8zMgkweDAwNzAJLyogTWF4IDMyICovCisjZGVmaW5lICBQQ0lfWF9DTURfTUFYX1NQTElUCTB4MDA3MAkvKiBNYXggT3V0c3RhbmRpbmcgU3BsaXQgVHJhbnNhY3Rpb25zICovCisjZGVmaW5lICBQQ0lfWF9DTURfVkVSU0lPTih4KSAJKCgoeCkgPj4gMTIpICYgMykgLyogVmVyc2lvbiAqLworI2RlZmluZSBQQ0lfWF9TVEFUVVMJCTQJLyogUENJLVggY2FwYWJpbGl0aWVzICovCisjZGVmaW5lICBQQ0lfWF9TVEFUVVNfREVWRk4JMHgwMDAwMDBmZgkvKiBBIGNvcHkgb2YgZGV2Zm4gKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU19CVVMJMHgwMDAwZmYwMAkvKiBBIGNvcHkgb2YgYnVzIG5yICovCisjZGVmaW5lICBQQ0lfWF9TVEFUVVNfNjRCSVQJMHgwMDAxMDAwMAkvKiA2NC1iaXQgZGV2aWNlICovCisjZGVmaW5lICBQQ0lfWF9TVEFUVVNfMTMzTUhaCTB4MDAwMjAwMDAJLyogMTMzIE1IeiBjYXBhYmxlICovCisjZGVmaW5lICBQQ0lfWF9TVEFUVVNfU1BMX0RJU0MJMHgwMDA0MDAwMAkvKiBTcGxpdCBDb21wbGV0aW9uIERpc2NhcmRlZCAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTX1VOWF9TUEwJMHgwMDA4MDAwMAkvKiBVbmV4cGVjdGVkIFNwbGl0IENvbXBsZXRpb24gKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU19DT01QTEVYCTB4MDAxMDAwMDAJLyogRGV2aWNlIENvbXBsZXhpdHkgKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU19NQVhfUkVBRAkweDAwNjAwMDAwCS8qIERlc2lnbmVkIE1heCBNZW1vcnkgUmVhZCBDb3VudCAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTX01BWF9TUExJVAkweDAzODAwMDAwCS8qIERlc2lnbmVkIE1heCBPdXRzdGFuZGluZyBTcGxpdCBUcmFuc2FjdGlvbnMgKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU19NQVhfQ1VNCTB4MWMwMDAwMDAJLyogRGVzaWduZWQgTWF4IEN1bXVsYXRpdmUgUmVhZCBTaXplICovCisjZGVmaW5lICBQQ0lfWF9TVEFUVVNfU1BMX0VSUgkweDIwMDAwMDAwCS8qIFJjdmQgU3BsaXQgQ29tcGxldGlvbiBFcnJvciBNc2cgKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU18yNjZNSFoJMHg0MDAwMDAwMAkvKiAyNjYgTUh6IGNhcGFibGUgKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU181MzNNSFoJMHg4MDAwMDAwMAkvKiA1MzMgTUh6IGNhcGFibGUgKi8KKworLyogUENJIEJyaWRnZSBTdWJzeXN0ZW0gSUQgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgUENJX1NTVklEX1ZFTkRPUl9JRCAgICAgNAkvKiBQQ0ktQnJpZGdlIHN1YnN5c3RlbSB2ZW5kb3IgaWQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX1NTVklEX0RFVklDRV9JRCAgICAgNgkvKiBQQ0ktQnJpZGdlIHN1YnN5c3RlbSBkZXZpY2UgaWQgcmVnaXN0ZXIgKi8KKworLyogUENJIEV4cHJlc3MgY2FwYWJpbGl0eSByZWdpc3RlcnMgKi8KKworI2RlZmluZSBQQ0lfRVhQX0ZMQUdTCQkyCS8qIENhcGFiaWxpdGllcyByZWdpc3RlciAqLworI2RlZmluZSBQQ0lfRVhQX0ZMQUdTX1ZFUlMJMHgwMDBmCS8qIENhcGFiaWxpdHkgdmVyc2lvbiAqLworI2RlZmluZSBQQ0lfRVhQX0ZMQUdTX1RZUEUJMHgwMGYwCS8qIERldmljZS9Qb3J0IHR5cGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfVFlQRV9FTkRQT0lOVAkweDAJLyogRXhwcmVzcyBFbmRwb2ludCAqLworI2RlZmluZSAgUENJX0VYUF9UWVBFX0xFR19FTkQJMHgxCS8qIExlZ2FjeSBFbmRwb2ludCAqLworI2RlZmluZSAgUENJX0VYUF9UWVBFX1JPT1RfUE9SVCAweDQJLyogUm9vdCBQb3J0ICovCisjZGVmaW5lICBQQ0lfRVhQX1RZUEVfVVBTVFJFQU0JMHg1CS8qIFVwc3RyZWFtIFBvcnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfVFlQRV9ET1dOU1RSRUFNIDB4NgkvKiBEb3duc3RyZWFtIFBvcnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfVFlQRV9QQ0lfQlJJREdFIDB4NwkvKiBQQ0kvUENJLVggQnJpZGdlICovCisjZGVmaW5lICBQQ0lfRVhQX1RZUEVfUkNfRU5ECTB4OQkvKiBSb290IENvbXBsZXggSW50ZWdyYXRlZCBFbmRwb2ludCAqLworI2RlZmluZSAgUENJX0VYUF9UWVBFX1JDX0VDCTB4YQkvKiBSb290IENvbXBsZXggRXZlbnQgQ29sbGVjdG9yICovCisjZGVmaW5lIFBDSV9FWFBfRkxBR1NfU0xPVAkweDAxMDAJLyogU2xvdCBpbXBsZW1lbnRlZCAqLworI2RlZmluZSBQQ0lfRVhQX0ZMQUdTX0lSUQkweDNlMDAJLyogSW50ZXJydXB0IG1lc3NhZ2UgbnVtYmVyICovCisjZGVmaW5lIFBDSV9FWFBfREVWQ0FQCQk0CS8qIERldmljZSBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX1BBWUxPQUQJMHgwNwkvKiBNYXhfUGF5bG9hZF9TaXplICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9QSEFOVE9NCTB4MTgJLyogUGhhbnRvbSBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX0VYVF9UQUcJMHgyMAkvKiBFeHRlbmRlZCB0YWdzICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9MMFMJMHgxYzAJLyogTDBzIEFjY2VwdGFibGUgTGF0ZW5jeSAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfTDEJMHhlMDAJLyogTDEgQWNjZXB0YWJsZSBMYXRlbmN5ICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9BVE5fQlVUCTB4MTAwMAkvKiBBdHRlbnRpb24gQnV0dG9uIFByZXNlbnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX0FUTl9JTkQJMHgyMDAwCS8qIEF0dGVudGlvbiBJbmRpY2F0b3IgUHJlc2VudCAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfUFdSX0lORAkweDQwMDAJLyogUG93ZXIgSW5kaWNhdG9yIFByZXNlbnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX1JCRVIJMHg4MDAwCS8qIFJvbGUtQmFzZWQgRXJyb3IgUmVwb3J0aW5nICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9QV1JfVkFMCTB4M2ZjMDAwMCAvKiBTbG90IFBvd2VyIExpbWl0IFZhbHVlICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9QV1JfU0NMCTB4YzAwMDAwMCAvKiBTbG90IFBvd2VyIExpbWl0IFNjYWxlICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9GTFIgICAgIDB4MTAwMDAwMDAgLyogRnVuY3Rpb24gTGV2ZWwgUmVzZXQgKi8KKyNkZWZpbmUgUENJX0VYUF9ERVZDVEwJCTgJLyogRGV2aWNlIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX0NFUkUJMHgwMDAxCS8qIENvcnJlY3RhYmxlIEVycm9yIFJlcG9ydGluZyBFbi4gKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX05GRVJFCTB4MDAwMgkvKiBOb24tRmF0YWwgRXJyb3IgUmVwb3J0aW5nIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfRkVSRQkweDAwMDQJLyogRmF0YWwgRXJyb3IgUmVwb3J0aW5nIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfVVJSRQkweDAwMDgJLyogVW5zdXBwb3J0ZWQgUmVxdWVzdCBSZXBvcnRpbmcgRW4uICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9SRUxBWF9FTiAweDAwMTAgLyogRW5hYmxlIHJlbGF4ZWQgb3JkZXJpbmcgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX1BBWUxPQUQJMHgwMGUwCS8qIE1heF9QYXlsb2FkX1NpemUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX0VYVF9UQUcJMHgwMTAwCS8qIEV4dGVuZGVkIFRhZyBGaWVsZCBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX1BIQU5UT00JMHgwMjAwCS8qIFBoYW50b20gRnVuY3Rpb25zIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfQVVYX1BNRQkweDA0MDAJLyogQXV4aWxpYXJ5IFBvd2VyIFBNIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfTk9TTk9PUF9FTiAweDA4MDAgIC8qIEVuYWJsZSBObyBTbm9vcCAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfUkVBRFJRCTB4NzAwMAkvKiBNYXhfUmVhZF9SZXF1ZXN0X1NpemUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX0JDUl9GTFIgMHg4MDAwICAvKiBCcmlkZ2UgQ29uZmlndXJhdGlvbiBSZXRyeSAvIEZMUiAqLworI2RlZmluZSBQQ0lfRVhQX0RFVlNUQQkJMTAJLyogRGV2aWNlIFN0YXR1cyAqLworI2RlZmluZSAgUENJX0VYUF9ERVZTVEFfQ0VECTB4MDEJLyogQ29ycmVjdGFibGUgRXJyb3IgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWU1RBX05GRUQJMHgwMgkvKiBOb24tRmF0YWwgRXJyb3IgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWU1RBX0ZFRAkweDA0CS8qIEZhdGFsIEVycm9yIERldGVjdGVkICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVlNUQV9VUkQJMHgwOAkvKiBVbnN1cHBvcnRlZCBSZXF1ZXN0IERldGVjdGVkICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVlNUQV9BVVhQRAkweDEwCS8qIEFVWCBQb3dlciBEZXRlY3RlZCAqLworI2RlZmluZSAgUENJX0VYUF9ERVZTVEFfVFJQTkQJMHgyMAkvKiBUcmFuc2FjdGlvbnMgUGVuZGluZyAqLworI2RlZmluZSBQQ0lfRVhQX0xOS0NBUAkJMTIJLyogTGluayBDYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX1NMUwkweDAwMDAwMDBmIC8qIFN1cHBvcnRlZCBMaW5rIFNwZWVkcyAqLworI2RlZmluZSAgUENJX0VYUF9MTktDQVBfTUxXCTB4MDAwMDAzZjAgLyogTWF4aW11bSBMaW5rIFdpZHRoICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NBUF9BU1BNUwkweDAwMDAwYzAwIC8qIEFTUE0gU3VwcG9ydCAqLworI2RlZmluZSAgUENJX0VYUF9MTktDQVBfTDBTRUwJMHgwMDAwNzAwMCAvKiBMMHMgRXhpdCBMYXRlbmN5ICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NBUF9MMUVMCTB4MDAwMzgwMDAgLyogTDEgRXhpdCBMYXRlbmN5ICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NBUF9DTEtQTQkweDAwMDQwMDAwIC8qIEwxIENsb2NrIFBvd2VyIE1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX1NERVJDCTB4MDAwODAwMDAgLyogU3VycHJpc2UgRG93biBFcnJvciBSZXBvcnRpbmcgQ2FwYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9MTktDQVBfRExMTEFSQwkweDAwMTAwMDAwIC8qIERhdGEgTGluayBMYXllciBMaW5rIEFjdGl2ZSBSZXBvcnRpbmcgQ2FwYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9MTktDQVBfTEJOQwkweDAwMjAwMDAwIC8qIExpbmsgQmFuZHdpZHRoIE5vdGlmaWNhdGlvbiBDYXBhYmlsaXR5ICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NBUF9QTgkweGZmMDAwMDAwIC8qIFBvcnQgTnVtYmVyICovCisjZGVmaW5lIFBDSV9FWFBfTE5LQ1RMCQkxNgkvKiBMaW5rIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0FTUE1DCTB4MDAwMwkvKiBBU1BNIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX1JDQgkweDAwMDgJLyogUmVhZCBDb21wbGV0aW9uIEJvdW5kYXJ5ICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NUTF9MRAkweDAwMTAJLyogTGluayBEaXNhYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NUTF9STAkweDAwMjAJLyogUmV0cmFpbiBMaW5rICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NUTF9DQ0MJMHgwMDQwCS8qIENvbW1vbiBDbG9jayBDb25maWd1cmF0aW9uICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NUTF9FUwkweDAwODAJLyogRXh0ZW5kZWQgU3luY2ggKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0NMS1JFUV9FTiAweDEwMAkvKiBFbmFibGUgY2xrcmVxICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NUTF9IQVdECTB4MDIwMAkvKiBIYXJkd2FyZSBBdXRvbm9tb3VzIFdpZHRoIERpc2FibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0xCTUlFCTB4MDQwMAkvKiBMaW5rIEJhbmR3aWR0aCBNYW5hZ2VtZW50IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0xBQklFCTB4MDgwMAkvKiBMbmsgQXV0b25vbW91cyBCYW5kd2lkdGggSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBQQ0lfRVhQX0xOS1NUQQkJMTgJLyogTGluayBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LU1RBX0NMUwkweDAwMGYJLyogQ3VycmVudCBMaW5rIFNwZWVkICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS1NUQV9DTFNfMl81R0IgMHgwMQkvKiBDdXJyZW50IExpbmsgU3BlZWQgMi41R1QvcyAqLworI2RlZmluZSAgUENJX0VYUF9MTktTVEFfQ0xTXzVfMEdCIDB4MDIJLyogQ3VycmVudCBMaW5rIFNwZWVkIDUuMEdUL3MgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LU1RBX05MVwkweDAzZjAJLyogTm9nb3RpYXRlZCBMaW5rIFdpZHRoICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS1NUQV9OTFdfU0hJRlQgNAkvKiBzdGFydCBvZiBOTFcgbWFzayBpbiBsaW5rIHN0YXR1cyAqLworI2RlZmluZSAgUENJX0VYUF9MTktTVEFfTFQJMHgwODAwCS8qIExpbmsgVHJhaW5pbmcgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LU1RBX1NMQwkweDEwMDAJLyogU2xvdCBDbG9jayBDb25maWd1cmF0aW9uICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS1NUQV9ETExMQQkweDIwMDAJLyogRGF0YSBMaW5rIExheWVyIExpbmsgQWN0aXZlICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS1NUQV9MQk1TCTB4NDAwMAkvKiBMaW5rIEJhbmR3aWR0aCBNYW5hZ2VtZW50IFN0YXR1cyAqLworI2RlZmluZSAgUENJX0VYUF9MTktTVEFfTEFCUwkweDgwMDAJLyogTGluayBBdXRvbm9tb3VzIEJhbmR3aWR0aCBTdGF0dXMgKi8KKyNkZWZpbmUgUENJX0VYUF9TTFRDQVAJCTIwCS8qIFNsb3QgQ2FwYWJpbGl0aWVzICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENBUF9BQlAJMHgwMDAwMDAwMSAvKiBBdHRlbnRpb24gQnV0dG9uIFByZXNlbnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ0FQX1BDUAkweDAwMDAwMDAyIC8qIFBvd2VyIENvbnRyb2xsZXIgUHJlc2VudCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDQVBfTVJMU1AJMHgwMDAwMDAwNCAvKiBNUkwgU2Vuc29yIFByZXNlbnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ0FQX0FJUAkweDAwMDAwMDA4IC8qIEF0dGVudGlvbiBJbmRpY2F0b3IgUHJlc2VudCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDQVBfUElQCTB4MDAwMDAwMTAgLyogUG93ZXIgSW5kaWNhdG9yIFByZXNlbnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ0FQX0hQUwkweDAwMDAwMDIwIC8qIEhvdC1QbHVnIFN1cnByaXNlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENBUF9IUEMJMHgwMDAwMDA0MCAvKiBIb3QtUGx1ZyBDYXBhYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENBUF9TUExWCTB4MDAwMDdmODAgLyogU2xvdCBQb3dlciBMaW1pdCBWYWx1ZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDQVBfU1BMUwkweDAwMDE4MDAwIC8qIFNsb3QgUG93ZXIgTGltaXQgU2NhbGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ0FQX0VJUAkweDAwMDIwMDAwIC8qIEVsZWN0cm9tZWNoYW5pY2FsIEludGVybG9jayBQcmVzZW50ICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENBUF9OQ0NTCTB4MDAwNDAwMDAgLyogTm8gQ29tbWFuZCBDb21wbGV0ZWQgU3VwcG9ydCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDQVBfUFNOCTB4ZmZmODAwMDAgLyogUGh5c2ljYWwgU2xvdCBOdW1iZXIgKi8KKyNkZWZpbmUgUENJX0VYUF9TTFRDVEwJCTI0CS8qIFNsb3QgQ29udHJvbCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfQUJQRQkweDAwMDEJLyogQXR0ZW50aW9uIEJ1dHRvbiBQcmVzc2VkIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfUEZERQkweDAwMDIJLyogUG93ZXIgRmF1bHQgRGV0ZWN0ZWQgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENUTF9NUkxTQ0UJMHgwMDA0CS8qIE1STCBTZW5zb3IgQ2hhbmdlZCBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ1RMX1BEQ0UJMHgwMDA4CS8qIFByZXNlbmNlIERldGVjdCBDaGFuZ2VkIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfQ0NJRQkweDAwMTAJLyogQ29tbWFuZCBDb21wbGV0ZWQgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfSFBJRQkweDAwMjAJLyogSG90LVBsdWcgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfQUlDCTB4MDBjMAkvKiBBdHRlbnRpb24gSW5kaWNhdG9yIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ1RMX1BJQwkweDAzMDAJLyogUG93ZXIgSW5kaWNhdG9yIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ1RMX1BDQwkweDA0MDAJLyogUG93ZXIgQ29udHJvbGxlciBDb250cm9sICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENUTF9FSUMJMHgwODAwCS8qIEVsZWN0cm9tZWNoYW5pY2FsIEludGVybG9jayBDb250cm9sICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENUTF9ETExTQ0UJMHgxMDAwCS8qIERhdGEgTGluayBMYXllciBTdGF0ZSBDaGFuZ2VkIEVuYWJsZSAqLworI2RlZmluZSBQQ0lfRVhQX1NMVFNUQQkJMjYJLyogU2xvdCBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUU1RBX0FCUAkweDAwMDEJLyogQXR0ZW50aW9uIEJ1dHRvbiBQcmVzc2VkICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVFNUQV9QRkQJMHgwMDAyCS8qIFBvd2VyIEZhdWx0IERldGVjdGVkICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVFNUQV9NUkxTQwkweDAwMDQJLyogTVJMIFNlbnNvciBDaGFuZ2VkICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVFNUQV9QREMJMHgwMDA4CS8qIFByZXNlbmNlIERldGVjdCBDaGFuZ2VkICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVFNUQV9DQwkweDAwMTAJLyogQ29tbWFuZCBDb21wbGV0ZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUU1RBX01STFNTCTB4MDAyMAkvKiBNUkwgU2Vuc29yIFN0YXRlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVFNUQV9QRFMJMHgwMDQwCS8qIFByZXNlbmNlIERldGVjdCBTdGF0ZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRTVEFfRUlTCTB4MDA4MAkvKiBFbGVjdHJvbWVjaGFuaWNhbCBJbnRlcmxvY2sgU3RhdHVzICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVFNUQV9ETExTQwkweDAxMDAJLyogRGF0YSBMaW5rIExheWVyIFN0YXRlIENoYW5nZWQgKi8KKyNkZWZpbmUgUENJX0VYUF9SVENUTAkJMjgJLyogUm9vdCBDb250cm9sICovCisjZGVmaW5lICBQQ0lfRVhQX1JUQ1RMX1NFQ0VFCTB4MDEJLyogU3lzdGVtIEVycm9yIG9uIENvcnJlY3RhYmxlIEVycm9yICovCisjZGVmaW5lICBQQ0lfRVhQX1JUQ1RMX1NFTkZFRQkweDAyCS8qIFN5c3RlbSBFcnJvciBvbiBOb24tRmF0YWwgRXJyb3IgKi8KKyNkZWZpbmUgIFBDSV9FWFBfUlRDVExfU0VGRUUJMHgwNAkvKiBTeXN0ZW0gRXJyb3Igb24gRmF0YWwgRXJyb3IgKi8KKyNkZWZpbmUgIFBDSV9FWFBfUlRDVExfUE1FSUUJMHgwOAkvKiBQTUUgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9SVENUTF9DUlNTVkUJMHgxMAkvKiBDUlMgU29mdHdhcmUgVmlzaWJpbGl0eSBFbmFibGUgKi8KKyNkZWZpbmUgUENJX0VYUF9SVENBUAkJMzAJLyogUm9vdCBDYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgUENJX0VYUF9SVFNUQQkJMzIJLyogUm9vdCBTdGF0dXMgKi8KKyNkZWZpbmUgUENJX0VYUF9SVFNUQV9QTUUJMHgxMDAwMCAvKiBQTUUgc3RhdHVzICovCisjZGVmaW5lIFBDSV9FWFBfUlRTVEFfUEVORElORwkweDIwMDAwIC8qIFBNRSBwZW5kaW5nICovCisjZGVmaW5lIFBDSV9FWFBfREVWQ0FQMgkJMzYJLyogRGV2aWNlIENhcGFiaWxpdGllcyAyICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUDJfQVJJCTB4MjAJLyogQWx0ZXJuYXRpdmUgUm91dGluZy1JRCAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDQVAyX0xUUgkweDgwMAkvKiBMYXRlbmN5IHRvbGVyYW5jZSByZXBvcnRpbmcgKi8KKyNkZWZpbmUgIFBDSV9FWFBfT0JGRl9NQVNLCTB4YzAwMDAgLyogT0JGRiBzdXBwb3J0IG1lY2hhbmlzbSAqLworI2RlZmluZSAgUENJX0VYUF9PQkZGX01TRwkweDQwMDAwIC8qIE5ldyBtZXNzYWdlIHNpZ25hbGluZyAqLworI2RlZmluZSAgUENJX0VYUF9PQkZGX1dBS0UJMHg4MDAwMCAvKiBSZS11c2UgV0FLRSMgZm9yIE9CRkYgKi8KKyNkZWZpbmUgUENJX0VYUF9ERVZDVEwyCQk0MAkvKiBEZXZpY2UgQ29udHJvbCAyICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNUTDJfQVJJCTB4MjAJLyogQWx0ZXJuYXRpdmUgUm91dGluZy1JRCAqLworI2RlZmluZSAgUENJX0VYUF9JRE9fUkVRX0VOCTB4MTAwCS8qIElELWJhc2VkIG9yZGVyaW5nIHJlcXVlc3QgZW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX0lET19DTVBfRU4JMHgyMDAJLyogSUQtYmFzZWQgb3JkZXJpbmcgY29tcGxldGlvbiBlbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTFRSX0VOCQkweDQwMAkvKiBMYXRlbmN5IHRvbGVyYW5jZSByZXBvcnRpbmcgKi8KKyNkZWZpbmUgIFBDSV9FWFBfT0JGRl9NU0dBX0VOCTB4MjAwMAkvKiBPQkZGIGVuYWJsZSB3aXRoIE1lc3NhZ2UgdHlwZSBBICovCisjZGVmaW5lICBQQ0lfRVhQX09CRkZfTVNHQl9FTgkweDQwMDAJLyogT0JGRiBlbmFibGUgd2l0aCBNZXNzYWdlIHR5cGUgQiAqLworI2RlZmluZSAgUENJX0VYUF9PQkZGX1dBS0VfRU4JMHg2MDAwCS8qIE9CRkYgdXNpbmcgV0FLRSMgc2lnbmFsaW5nICovCisjZGVmaW5lIFBDSV9FWFBfTE5LQ1RMMgkJNDgJLyogTGluayBDb250cm9sIDIgKi8KKyNkZWZpbmUgUENJX0VYUF9TTFRDVEwyCQk1NgkvKiBTbG90IENvbnRyb2wgMiAqLworCisvKiBFeHRlbmRlZCBDYXBhYmlsaXRpZXMgKFBDSS1YIDIuMCBhbmQgRXhwcmVzcykgKi8KKyNkZWZpbmUgUENJX0VYVF9DQVBfSUQoaGVhZGVyKQkJKGhlYWRlciAmIDB4MDAwMGZmZmYpCisjZGVmaW5lIFBDSV9FWFRfQ0FQX1ZFUihoZWFkZXIpCQkoKGhlYWRlciA+PiAxNikgJiAweGYpCisjZGVmaW5lIFBDSV9FWFRfQ0FQX05FWFQoaGVhZGVyKQkoKGhlYWRlciA+PiAyMCkgJiAweGZmYykKKworI2RlZmluZSBQQ0lfRVhUX0NBUF9JRF9FUlIJMQorI2RlZmluZSBQQ0lfRVhUX0NBUF9JRF9WQwkyCisjZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX0RTTgkzCisjZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX1BXUgk0CisjZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX1ZORFIJMTEKKyNkZWZpbmUgUENJX0VYVF9DQVBfSURfQUNTCTEzCisjZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX0FSSQkxNAorI2RlZmluZSBQQ0lfRVhUX0NBUF9JRF9BVFMJMTUKKyNkZWZpbmUgUENJX0VYVF9DQVBfSURfU1JJT1YJMTYKKyNkZWZpbmUgUENJX0VYVF9DQVBfSURfTFRSCTI0CisKKy8qIEFkdmFuY2VkIEVycm9yIFJlcG9ydGluZyAqLworI2RlZmluZSBQQ0lfRVJSX1VOQ09SX1NUQVRVUwk0CS8qIFVuY29ycmVjdGFibGUgRXJyb3IgU3RhdHVzICovCisjZGVmaW5lICBQQ0lfRVJSX1VOQ19UUkFJTgkweDAwMDAwMDAxCS8qIFRyYWluaW5nICovCisjZGVmaW5lICBQQ0lfRVJSX1VOQ19ETFAJMHgwMDAwMDAxMAkvKiBEYXRhIExpbmsgUHJvdG9jb2wgKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX1BPSVNPTl9UTFAJMHgwMDAwMTAwMAkvKiBQb2lzb25lZCBUTFAgKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX0ZDUAkweDAwMDAyMDAwCS8qIEZsb3cgQ29udHJvbCBQcm90b2NvbCAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfQ09NUF9USU1FCTB4MDAwMDQwMDAJLyogQ29tcGxldGlvbiBUaW1lb3V0ICovCisjZGVmaW5lICBQQ0lfRVJSX1VOQ19DT01QX0FCT1JUCTB4MDAwMDgwMDAJLyogQ29tcGxldGVyIEFib3J0ICovCisjZGVmaW5lICBQQ0lfRVJSX1VOQ19VTlhfQ09NUAkweDAwMDEwMDAwCS8qIFVuZXhwZWN0ZWQgQ29tcGxldGlvbiAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfUlhfT1ZFUgkweDAwMDIwMDAwCS8qIFJlY2VpdmVyIE92ZXJmbG93ICovCisjZGVmaW5lICBQQ0lfRVJSX1VOQ19NQUxGX1RMUAkweDAwMDQwMDAwCS8qIE1hbGZvcm1lZCBUTFAgKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX0VDUkMJMHgwMDA4MDAwMAkvKiBFQ1JDIEVycm9yIFN0YXR1cyAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfVU5TVVAJMHgwMDEwMDAwMAkvKiBVbnN1cHBvcnRlZCBSZXF1ZXN0ICovCisjZGVmaW5lIFBDSV9FUlJfVU5DT1JfTUFTSwk4CS8qIFVuY29ycmVjdGFibGUgRXJyb3IgTWFzayAqLworCS8qIFNhbWUgYml0cyBhcyBhYm92ZSAqLworI2RlZmluZSBQQ0lfRVJSX1VOQ09SX1NFVkVSCTEyCS8qIFVuY29ycmVjdGFibGUgRXJyb3IgU2V2ZXJpdHkgKi8KKwkvKiBTYW1lIGJpdHMgYXMgYWJvdmUgKi8KKyNkZWZpbmUgUENJX0VSUl9DT1JfU1RBVFVTCTE2CS8qIENvcnJlY3RhYmxlIEVycm9yIFN0YXR1cyAqLworI2RlZmluZSAgUENJX0VSUl9DT1JfUkNWUgkweDAwMDAwMDAxCS8qIFJlY2VpdmVyIEVycm9yIFN0YXR1cyAqLworI2RlZmluZSAgUENJX0VSUl9DT1JfQkFEX1RMUAkweDAwMDAwMDQwCS8qIEJhZCBUTFAgU3RhdHVzICovCisjZGVmaW5lICBQQ0lfRVJSX0NPUl9CQURfRExMUAkweDAwMDAwMDgwCS8qIEJhZCBETExQIFN0YXR1cyAqLworI2RlZmluZSAgUENJX0VSUl9DT1JfUkVQX1JPTEwJMHgwMDAwMDEwMAkvKiBSRVBMQVlfTlVNIFJvbGxvdmVyICovCisjZGVmaW5lICBQQ0lfRVJSX0NPUl9SRVBfVElNRVIJMHgwMDAwMTAwMAkvKiBSZXBsYXkgVGltZXIgVGltZW91dCAqLworI2RlZmluZSBQQ0lfRVJSX0NPUl9NQVNLCTIwCS8qIENvcnJlY3RhYmxlIEVycm9yIE1hc2sgKi8KKwkvKiBTYW1lIGJpdHMgYXMgYWJvdmUgKi8KKyNkZWZpbmUgUENJX0VSUl9DQVAJCTI0CS8qIEFkdmFuY2VkIEVycm9yIENhcGFiaWxpdGllcyAqLworI2RlZmluZSAgUENJX0VSUl9DQVBfRkVQKHgpCSgoeCkgJiAzMSkJLyogRmlyc3QgRXJyb3IgUG9pbnRlciAqLworI2RlZmluZSAgUENJX0VSUl9DQVBfRUNSQ19HRU5DCTB4MDAwMDAwMjAJLyogRUNSQyBHZW5lcmF0aW9uIENhcGFibGUgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ0FQX0VDUkNfR0VORQkweDAwMDAwMDQwCS8qIEVDUkMgR2VuZXJhdGlvbiBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ0FQX0VDUkNfQ0hLQwkweDAwMDAwMDgwCS8qIEVDUkMgQ2hlY2sgQ2FwYWJsZSAqLworI2RlZmluZSAgUENJX0VSUl9DQVBfRUNSQ19DSEtFCTB4MDAwMDAxMDAJLyogRUNSQyBDaGVjayBFbmFibGUgKi8KKyNkZWZpbmUgUENJX0VSUl9IRUFERVJfTE9HCTI4CS8qIEhlYWRlciBMb2cgUmVnaXN0ZXIgKDE2IGJ5dGVzKSAqLworI2RlZmluZSBQQ0lfRVJSX1JPT1RfQ09NTUFORAk0NAkvKiBSb290IEVycm9yIENvbW1hbmQgKi8KKy8qIENvcnJlY3RhYmxlIEVyciBSZXBvcnRpbmcgRW5hYmxlICovCisjZGVmaW5lIFBDSV9FUlJfUk9PVF9DTURfQ09SX0VOCQkweDAwMDAwMDAxCisvKiBOb24tZmF0YWwgRXJyIFJlcG9ydGluZyBFbmFibGUgKi8KKyNkZWZpbmUgUENJX0VSUl9ST09UX0NNRF9OT05GQVRBTF9FTgkweDAwMDAwMDAyCisvKiBGYXRhbCBFcnIgUmVwb3J0aW5nIEVuYWJsZSAqLworI2RlZmluZSBQQ0lfRVJSX1JPT1RfQ01EX0ZBVEFMX0VOCTB4MDAwMDAwMDQKKyNkZWZpbmUgUENJX0VSUl9ST09UX1NUQVRVUwk0OAorI2RlZmluZSBQQ0lfRVJSX1JPT1RfQ09SX1JDVgkJMHgwMDAwMDAwMQkvKiBFUlJfQ09SIFJlY2VpdmVkICovCisvKiBNdWx0aSBFUlJfQ09SIFJlY2VpdmVkICovCisjZGVmaW5lIFBDSV9FUlJfUk9PVF9NVUxUSV9DT1JfUkNWCTB4MDAwMDAwMDIKKy8qIEVSUl9GQVRBTC9OT05GQVRBTCBSZWNldmllZCAqLworI2RlZmluZSBQQ0lfRVJSX1JPT1RfVU5DT1JfUkNWCQkweDAwMDAwMDA0CisvKiBNdWx0aSBFUlJfRkFUQUwvTk9ORkFUQUwgUmVjZXZpZWQgKi8KKyNkZWZpbmUgUENJX0VSUl9ST09UX01VTFRJX1VOQ09SX1JDVgkweDAwMDAwMDA4CisjZGVmaW5lIFBDSV9FUlJfUk9PVF9GSVJTVF9GQVRBTAkweDAwMDAwMDEwCS8qIEZpcnN0IEZhdGFsICovCisjZGVmaW5lIFBDSV9FUlJfUk9PVF9OT05GQVRBTF9SQ1YJMHgwMDAwMDAyMAkvKiBOb24tRmF0YWwgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgUENJX0VSUl9ST09UX0ZBVEFMX1JDVgkJMHgwMDAwMDA0MAkvKiBGYXRhbCBSZWNlaXZlZCAqLworI2RlZmluZSBQQ0lfRVJSX1JPT1RfRVJSX1NSQwk1MgkvKiBFcnJvciBTb3VyY2UgSWRlbnRpZmljYXRpb24gKi8KKworLyogVmlydHVhbCBDaGFubmVsICovCisjZGVmaW5lIFBDSV9WQ19QT1JUX1JFRzEJNAorI2RlZmluZSBQQ0lfVkNfUE9SVF9SRUcyCTgKKyNkZWZpbmUgUENJX1ZDX1BPUlRfQ1RSTAkxMgorI2RlZmluZSBQQ0lfVkNfUE9SVF9TVEFUVVMJMTQKKyNkZWZpbmUgUENJX1ZDX1JFU19DQVAJCTE2CisjZGVmaW5lIFBDSV9WQ19SRVNfQ1RSTAkJMjAKKyNkZWZpbmUgUENJX1ZDX1JFU19TVEFUVVMJMjYKKworLyogUG93ZXIgQnVkZ2V0aW5nICovCisjZGVmaW5lIFBDSV9QV1JfRFNSCQk0CS8qIERhdGEgU2VsZWN0IFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9QV1JfREFUQQkJOAkvKiBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfUFdSX0RBVEFfQkFTRSh4KQkoKHgpICYgMHhmZikJICAgIC8qIEJhc2UgUG93ZXIgKi8KKyNkZWZpbmUgIFBDSV9QV1JfREFUQV9TQ0FMRSh4KQkoKCh4KSA+PiA4KSAmIDMpICAgIC8qIERhdGEgU2NhbGUgKi8KKyNkZWZpbmUgIFBDSV9QV1JfREFUQV9QTV9TVUIoeCkJKCgoeCkgPj4gMTApICYgNykgICAvKiBQTSBTdWIgU3RhdGUgKi8KKyNkZWZpbmUgIFBDSV9QV1JfREFUQV9QTV9TVEFURSh4KSAoKCh4KSA+PiAxMykgJiAzKSAvKiBQTSBTdGF0ZSAqLworI2RlZmluZSAgUENJX1BXUl9EQVRBX1RZUEUoeCkJKCgoeCkgPj4gMTUpICYgNykgICAvKiBUeXBlICovCisjZGVmaW5lICBQQ0lfUFdSX0RBVEFfUkFJTCh4KQkoKCh4KSA+PiAxOCkgJiA3KSAgIC8qIFBvd2VyIFJhaWwgKi8KKyNkZWZpbmUgUENJX1BXUl9DQVAJCTEyCS8qIENhcGFiaWxpdHkgKi8KKyNkZWZpbmUgIFBDSV9QV1JfQ0FQX0JVREdFVCh4KQkoKHgpICYgMSkJLyogSW5jbHVkZWQgaW4gc3lzdGVtIGJ1ZGdldCAqLworCisvKgorICogSHlwZXJ0cmFuc3BvcnQgc3ViIGNhcGFiaWxpdHkgdHlwZXMKKyAqCisgKiBVbmZvcnR1bmF0ZWx5IHRoZXJlIGFyZSBib3RoIDMgYml0IGFuZCA1IGJpdCBjYXBhYmlsaXR5IHR5cGVzIGRlZmluZWQKKyAqIGluIHRoZSBIVCBzcGVjLCBjYXRlcmluZyBmb3IgdGhhdCBpcyBhIGxpdHRsZSBtZXNzeS4gWW91IHByb2JhYmx5IGRvbid0CisgKiB3YW50IHRvIHVzZSB0aGVzZSBkaXJlY3RseSwganVzdCB1c2UgcGNpX2ZpbmRfaHRfY2FwYWJpbGl0eSgpIGFuZCBpdAorICogd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIHlvdS4KKyAqLworI2RlZmluZSBIVF8zQklUX0NBUF9NQVNLCTB4RTAKKyNkZWZpbmUgSFRfQ0FQVFlQRV9TTEFWRQkweDAwCS8qIFNsYXZlL1ByaW1hcnkgbGluayBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIEhUX0NBUFRZUEVfSE9TVAkJMHgyMAkvKiBIb3N0L1NlY29uZGFyeSBsaW5rIGNvbmZpZ3VyYXRpb24gKi8KKworI2RlZmluZSBIVF81QklUX0NBUF9NQVNLCTB4RjgKKyNkZWZpbmUgSFRfQ0FQVFlQRV9JUlEJCTB4ODAJLyogSVJRIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgSFRfQ0FQVFlQRV9SRU1BUFBJTkdfNDAJMHhBMAkvKiA0MCBiaXQgYWRkcmVzcyByZW1hcHBpbmcgKi8KKyNkZWZpbmUgSFRfQ0FQVFlQRV9SRU1BUFBJTkdfNjQgMHhBMgkvKiA2NCBiaXQgYWRkcmVzcyByZW1hcHBpbmcgKi8KKyNkZWZpbmUgSFRfQ0FQVFlQRV9VTklUSURfQ0xVTVAJMHg5MAkvKiBVbml0IElEIGNsdW1waW5nICovCisjZGVmaW5lIEhUX0NBUFRZUEVfRVhUQ09ORgkweDk4CS8qIEV4dGVuZGVkIENvbmZpZ3VyYXRpb24gU3BhY2UgQWNjZXNzICovCisjZGVmaW5lIEhUX0NBUFRZUEVfTVNJX01BUFBJTkcJMHhBOAkvKiBNU0kgTWFwcGluZyBDYXBhYmlsaXR5ICovCisjZGVmaW5lICBIVF9NU0lfRkxBR1MJCTB4MDIJCS8qIE9mZnNldCB0byBmbGFncyAqLworI2RlZmluZSAgSFRfTVNJX0ZMQUdTX0VOQUJMRQkweDEJCS8qIE1hcHBpbmcgZW5hYmxlICovCisjZGVmaW5lICBIVF9NU0lfRkxBR1NfRklYRUQJMHgyCQkvKiBGaXhlZCBtYXBwaW5nIG9ubHkgKi8KKyNkZWZpbmUgIEhUX01TSV9GSVhFRF9BRERSCTB4MDAwMDAwMDBGRUUwMDAwMFVMTAkvKiBGaXhlZCBhZGRyICovCisjZGVmaW5lICBIVF9NU0lfQUREUl9MTwkJMHgwNAkJLyogT2Zmc2V0IHRvIGxvdyBhZGRyIGJpdHMgKi8KKyNkZWZpbmUgIEhUX01TSV9BRERSX0xPX01BU0sJMHhGRkYwMDAwMAkvKiBMb3cgYWRkcmVzcyBiaXQgbWFzayAqLworI2RlZmluZSAgSFRfTVNJX0FERFJfSEkJCTB4MDgJCS8qIE9mZnNldCB0byBoaWdoIGFkZHIgYml0cyAqLworI2RlZmluZSBIVF9DQVBUWVBFX0RJUkVDVF9ST1VURQkweEIwCS8qIERpcmVjdCByb3V0aW5nIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgSFRfQ0FQVFlQRV9WQ1NFVAkweEI4CS8qIFZpcnR1YWwgQ2hhbm5lbCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIEhUX0NBUFRZUEVfRVJST1JfUkVUUlkJMHhDMAkvKiBSZXRyeSBvbiBlcnJvciBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIEhUX0NBUFRZUEVfR0VOMwkJMHhEMAkvKiBHZW5lcmF0aW9uIDMgaHlwZXJ0cmFuc3BvcnQgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBIVF9DQVBUWVBFX1BNCQkweEUwCS8qIEh5cGVydHJhbnNwb3J0IHBvd2VybWFuYWdlbWVudCBjb25maWd1cmF0aW9uICovCisKKy8qIEFsdGVybmF0aXZlIFJvdXRpbmctSUQgSW50ZXJwcmV0YXRpb24gKi8KKyNkZWZpbmUgUENJX0FSSV9DQVAJCTB4MDQJLyogQVJJIENhcGFiaWxpdHkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9BUklfQ0FQX01GVkMJMHgwMDAxCS8qIE1GVkMgRnVuY3Rpb24gR3JvdXBzIENhcGFiaWxpdHkgKi8KKyNkZWZpbmUgIFBDSV9BUklfQ0FQX0FDUwkweDAwMDIJLyogQUNTIEZ1bmN0aW9uIEdyb3VwcyBDYXBhYmlsaXR5ICovCisjZGVmaW5lICBQQ0lfQVJJX0NBUF9ORk4oeCkJKCgoeCkgPj4gOCkgJiAweGZmKSAvKiBOZXh0IEZ1bmN0aW9uIE51bWJlciAqLworI2RlZmluZSBQQ0lfQVJJX0NUUkwJCTB4MDYJLyogQVJJIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9BUklfQ1RSTF9NRlZDCTB4MDAwMQkvKiBNRlZDIEZ1bmN0aW9uIEdyb3VwcyBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9BUklfQ1RSTF9BQ1MJMHgwMDAyCS8qIEFDUyBGdW5jdGlvbiBHcm91cHMgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfQVJJX0NUUkxfRkcoeCkJKCgoeCkgPj4gNCkgJiA3KSAvKiBGdW5jdGlvbiBHcm91cCAqLworCisvKiBBZGRyZXNzIFRyYW5zbGF0aW9uIFNlcnZpY2UgKi8KKyNkZWZpbmUgUENJX0FUU19DQVAJCTB4MDQJLyogQVRTIENhcGFiaWxpdHkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9BVFNfQ0FQX1FERVAoeCkJKCh4KSAmIDB4MWYpCS8qIEludmFsaWRhdGUgUXVldWUgRGVwdGggKi8KKyNkZWZpbmUgIFBDSV9BVFNfTUFYX1FERVAJMzIJLyogTWF4IEludmFsaWRhdGUgUXVldWUgRGVwdGggKi8KKyNkZWZpbmUgUENJX0FUU19DVFJMCQkweDA2CS8qIEFUUyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfQVRTX0NUUkxfRU5BQkxFCTB4ODAwMAkvKiBBVFMgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfQVRTX0NUUkxfU1RVKHgpCSgoeCkgJiAweDFmKQkvKiBTbWFsbGVzdCBUcmFuc2xhdGlvbiBVbml0ICovCisjZGVmaW5lICBQQ0lfQVRTX01JTl9TVFUJMTIJLyogc2hpZnQgb2YgbWluaW11bSBTVFUgYmxvY2sgKi8KKworLyogUGFnZSBSZXF1ZXN0IEludGVyZmFjZSAqLworI2RlZmluZSBQQ0lfUFJJX0NBUAkJMHgxMyAgICAvKiBQUkkgY2FwYWJpbGl0eSBJRCAqLworI2RlZmluZSBQQ0lfUFJJX0NPTlRST0xfT0ZGCTB4MDQJLyogT2Zmc2V0IG9mIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX1BSSV9TVEFUVVNfT0ZGCTB4MDYJLyogT2Zmc2V0IG9mIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBQQ0lfUFJJX0VOQUJMRQkJMHgwMDAxCS8qIEVuYWJsZSBtYXNrICovCisjZGVmaW5lIFBDSV9QUklfUkVTRVQJCTB4MDAwMgkvKiBSZXNldCBiaXQgbWFzayAqLworI2RlZmluZSBQQ0lfUFJJX1NUQVRVU19SRgkweDAwMDEgIC8qIFJlcXVlc3QgRmFpbHVyZSAqLworI2RlZmluZSBQQ0lfUFJJX1NUQVRVU19VUFJHSQkweDAwMDIgIC8qIFVuZXhwZWN0ZWQgUFJHIGluZGV4ICovCisjZGVmaW5lIFBDSV9QUklfU1RBVFVTX1NUT1BQRUQJMHgwMTAwICAvKiBQUkkgU3RvcHBlZCAqLworI2RlZmluZSBQQ0lfUFJJX01BWF9SRVFfT0ZGCTB4MDgJLyogQ2FwIG9mZnNldCBmb3IgbWF4IHJlcXMgc3VwcG9ydGVkICovCisjZGVmaW5lIFBDSV9QUklfQUxMT0NfUkVRX09GRgkweDBjCS8qIENhcCBvZmZzZXQgZm9yIG1heCByZXFzIGFsbG93ZWQgKi8KKworLyogUEFTSUQgY2FwYWJpbGl0eSAqLworI2RlZmluZSBQQ0lfUEFTSURfQ0FQCQkweDFiICAgIC8qIFBBU0lEIGNhcGFiaWxpdHkgSUQgKi8KKyNkZWZpbmUgUENJX1BBU0lEX0NBUF9PRkYJMHgwNCAgICAvKiBQQVNJRCBmZWF0dXJlIHJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9QQVNJRF9DT05UUk9MX09GRiAgIDB4MDYgICAgLyogUEFTSUQgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBQQ0lfUEFTSURfRU5BQkxFCTB4MDEJLyogRW5hYmxlL1N1cHBvcnRlZCBiaXQgKi8KKyNkZWZpbmUgUENJX1BBU0lEX0VYRUMJCTB4MDIJLyogRXhlYyBwZXJtaXNzaW9ucyBFbmFibGUvU3VwcG9ydGVkICovCisjZGVmaW5lIFBDSV9QQVNJRF9QUklWCQkweDA0CS8qIFByaXZpbGVkZ2UgTW9kZSBFbmFibGUvU3VwcG9ydCAqLworCisvKiBTaW5nbGUgUm9vdCBJL08gVmlydHVhbGl6YXRpb24gKi8KKyNkZWZpbmUgUENJX1NSSU9WX0NBUAkJMHgwNAkvKiBTUi1JT1YgQ2FwYWJpbGl0aWVzICovCisjZGVmaW5lICBQQ0lfU1JJT1ZfQ0FQX1ZGTQkweDAxCS8qIFZGIE1pZ3JhdGlvbiBDYXBhYmxlICovCisjZGVmaW5lICBQQ0lfU1JJT1ZfQ0FQX0lOVFIoeCkJKCh4KSA+PiAyMSkgLyogSW50ZXJydXB0IE1lc3NhZ2UgTnVtYmVyICovCisjZGVmaW5lIFBDSV9TUklPVl9DVFJMCQkweDA4CS8qIFNSLUlPViBDb250cm9sICovCisjZGVmaW5lICBQQ0lfU1JJT1ZfQ1RSTF9WRkUJMHgwMQkvKiBWRiBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9TUklPVl9DVFJMX1ZGTQkweDAyCS8qIFZGIE1pZ3JhdGlvbiBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9TUklPVl9DVFJMX0lOVFIJMHgwNAkvKiBWRiBNaWdyYXRpb24gSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgUENJX1NSSU9WX0NUUkxfTVNFCTB4MDgJLyogVkYgTWVtb3J5IFNwYWNlIEVuYWJsZSAqLworI2RlZmluZSAgUENJX1NSSU9WX0NUUkxfQVJJCTB4MTAJLyogQVJJIENhcGFibGUgSGllcmFyY2h5ICovCisjZGVmaW5lIFBDSV9TUklPVl9TVEFUVVMJMHgwYQkvKiBTUi1JT1YgU3RhdHVzICovCisjZGVmaW5lICBQQ0lfU1JJT1ZfU1RBVFVTX1ZGTQkweDAxCS8qIFZGIE1pZ3JhdGlvbiBTdGF0dXMgKi8KKyNkZWZpbmUgUENJX1NSSU9WX0lOSVRJQUxfVkYJMHgwYwkvKiBJbml0aWFsIFZGcyAqLworI2RlZmluZSBQQ0lfU1JJT1ZfVE9UQUxfVkYJMHgwZQkvKiBUb3RhbCBWRnMgKi8KKyNkZWZpbmUgUENJX1NSSU9WX05VTV9WRgkweDEwCS8qIE51bWJlciBvZiBWRnMgKi8KKyNkZWZpbmUgUENJX1NSSU9WX0ZVTkNfTElOSwkweDEyCS8qIEZ1bmN0aW9uIERlcGVuZGVuY3kgTGluayAqLworI2RlZmluZSBQQ0lfU1JJT1ZfVkZfT0ZGU0VUCTB4MTQJLyogRmlyc3QgVkYgT2Zmc2V0ICovCisjZGVmaW5lIFBDSV9TUklPVl9WRl9TVFJJREUJMHgxNgkvKiBGb2xsb3dpbmcgVkYgU3RyaWRlICovCisjZGVmaW5lIFBDSV9TUklPVl9WRl9ESUQJMHgxYQkvKiBWRiBEZXZpY2UgSUQgKi8KKyNkZWZpbmUgUENJX1NSSU9WX1NVUF9QR1NJWkUJMHgxYwkvKiBTdXBwb3J0ZWQgUGFnZSBTaXplcyAqLworI2RlZmluZSBQQ0lfU1JJT1ZfU1lTX1BHU0laRQkweDIwCS8qIFN5c3RlbSBQYWdlIFNpemUgKi8KKyNkZWZpbmUgUENJX1NSSU9WX0JBUgkJMHgyNAkvKiBWRiBCQVIwICovCisjZGVmaW5lICBQQ0lfU1JJT1ZfTlVNX0JBUlMJNgkvKiBOdW1iZXIgb2YgVkYgQkFScyAqLworI2RlZmluZSBQQ0lfU1JJT1ZfVkZNCQkweDNjCS8qIFZGIE1pZ3JhdGlvbiBTdGF0ZSBBcnJheSBPZmZzZXQqLworI2RlZmluZSAgUENJX1NSSU9WX1ZGTV9CSVIoeCkJKCh4KSAmIDcpCS8qIFN0YXRlIEJJUiAqLworI2RlZmluZSAgUENJX1NSSU9WX1ZGTV9PRkZTRVQoeCkgKCh4KSAmIH43KQkvKiBTdGF0ZSBPZmZzZXQgKi8KKyNkZWZpbmUgIFBDSV9TUklPVl9WRk1fVUEJMHgwCS8qIEluYWN0aXZlLlVuYXZhaWxhYmxlICovCisjZGVmaW5lICBQQ0lfU1JJT1ZfVkZNX01JCTB4MQkvKiBEb3JtYW50Lk1pZ3JhdGVJbiAqLworI2RlZmluZSAgUENJX1NSSU9WX1ZGTV9NTwkweDIJLyogQWN0aXZlLk1pZ3JhdGVPdXQgKi8KKyNkZWZpbmUgIFBDSV9TUklPVl9WRk1fQVYJMHgzCS8qIEFjdGl2ZS5BdmFpbGFibGUgKi8KKworI2RlZmluZSBQQ0lfTFRSX01BWF9TTk9PUF9MQVQJMHg0CisjZGVmaW5lIFBDSV9MVFJfTUFYX05PU05PT1BfTEFUCTB4NgorI2RlZmluZSAgUENJX0xUUl9WQUxVRV9NQVNLCTB4MDAwMDAzZmYKKyNkZWZpbmUgIFBDSV9MVFJfU0NBTEVfTUFTSwkweDAwMDAxYzAwCisjZGVmaW5lICBQQ0lfTFRSX1NDQUxFX1NISUZUCTEwCisKKy8qIEFjY2VzcyBDb250cm9sIFNlcnZpY2UgKi8KKyNkZWZpbmUgUENJX0FDU19DQVAJCTB4MDQJLyogQUNTIENhcGFiaWxpdHkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9BQ1NfU1YJCTB4MDEJLyogU291cmNlIFZhbGlkYXRpb24gKi8KKyNkZWZpbmUgIFBDSV9BQ1NfVEIJCTB4MDIJLyogVHJhbnNsYXRpb24gQmxvY2tpbmcgKi8KKyNkZWZpbmUgIFBDSV9BQ1NfUlIJCTB4MDQJLyogUDJQIFJlcXVlc3QgUmVkaXJlY3QgKi8KKyNkZWZpbmUgIFBDSV9BQ1NfQ1IJCTB4MDgJLyogUDJQIENvbXBsZXRpb24gUmVkaXJlY3QgKi8KKyNkZWZpbmUgIFBDSV9BQ1NfVUYJCTB4MTAJLyogVXBzdHJlYW0gRm9yd2FyZGluZyAqLworI2RlZmluZSAgUENJX0FDU19FQwkJMHgyMAkvKiBQMlAgRWdyZXNzIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9BQ1NfRFQJCTB4NDAJLyogRGlyZWN0IFRyYW5zbGF0ZWQgUDJQICovCisjZGVmaW5lIFBDSV9BQ1NfQ1RSTAkJMHgwNgkvKiBBQ1MgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBQQ0lfQUNTX0VHUkVTU19DVExfVgkweDA4CS8qIEFDUyBFZ3Jlc3MgQ29udHJvbCBWZWN0b3IgKi8KKworI2VuZGlmIC8qIExJTlVYX1BDSV9SRUdTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5YjY1YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oCkBAIC0wLDAgKzEsNDgxIEBACisvKgorICogUGVyZm9ybWFuY2UgZXZlbnRzOgorICoKKyAqICAgIENvcHlyaWdodCAoQykgMjAwOC0yMDA5LCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqICAgIENvcHlyaWdodCAoQykgMjAwOC0yMDExLCBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgorICogICAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEsIFJlZCBIYXQsIEluYy4sIFBldGVyIFppamxzdHJhCisgKgorICogRGF0YSB0eXBlIGRlZmluaXRpb25zLCBkZWNsYXJhdGlvbnMsIHByb3RvdHlwZXMuCisgKgorICogICAgU3RhcnRlZCBieTogVGhvbWFzIEdsZWl4bmVyIGFuZCBJbmdvIE1vbG5hcgorICoKKyAqIEZvciBsaWNlbmNpbmcgZGV0YWlscyBzZWUga2VybmVsLWJhc2UvQ09QWUlORworICovCisjaWZuZGVmIF9MSU5VWF9QRVJGX0VWRU5UX0gKKyNkZWZpbmUgX0xJTlVYX1BFUkZfRVZFTlRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworLyoKKyAqIFVzZXItc3BhY2UgQUJJIGJpdHM6CisgKi8KKworLyoKKyAqIGF0dHIudHlwZQorICovCitlbnVtIHBlcmZfdHlwZV9pZCB7CisJUEVSRl9UWVBFX0hBUkRXQVJFCQkJPSAwLAorCVBFUkZfVFlQRV9TT0ZUV0FSRQkJCT0gMSwKKwlQRVJGX1RZUEVfVFJBQ0VQT0lOVAkJCT0gMiwKKwlQRVJGX1RZUEVfSFdfQ0FDSEUJCQk9IDMsCisJUEVSRl9UWVBFX1JBVwkJCQk9IDQsCisJUEVSRl9UWVBFX0JSRUFLUE9JTlQJCQk9IDUsCisKKwlQRVJGX1RZUEVfTUFYLAkJCQkvKiBub24tQUJJICovCit9OworCisvKgorICogR2VuZXJhbGl6ZWQgcGVyZm9ybWFuY2UgZXZlbnQgZXZlbnRfaWQgdHlwZXMsIHVzZWQgYnkgdGhlCisgKiBhdHRyLmV2ZW50X2lkIHBhcmFtZXRlciBvZiB0aGUgc3lzX3BlcmZfZXZlbnRfb3BlbigpCisgKiBzeXNjYWxsOgorICovCitlbnVtIHBlcmZfaHdfaWQgeworCS8qCisJICogQ29tbW9uIGhhcmR3YXJlIGV2ZW50cywgZ2VuZXJhbGl6ZWQgYnkgdGhlIGtlcm5lbDoKKwkgKi8KKwlQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVMJCT0gMCwKKwlQRVJGX0NPVU5UX0hXX0lOU1RSVUNUSU9OUwkJPSAxLAorCVBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFUwkJPSAyLAorCVBFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTCQk9IDMsCisJUEVSRl9DT1VOVF9IV19CUkFOQ0hfSU5TVFJVQ1RJT05TCT0gNCwKKwlQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVMJCT0gNSwKKwlQRVJGX0NPVU5UX0hXX0JVU19DWUNMRVMJCT0gNiwKKwlQRVJGX0NPVU5UX0hXX1NUQUxMRURfQ1lDTEVTX0ZST05URU5ECT0gNywKKwlQRVJGX0NPVU5UX0hXX1NUQUxMRURfQ1lDTEVTX0JBQ0tFTkQJPSA4LAorCisJUEVSRl9DT1VOVF9IV19NQVgsCQkJLyogbm9uLUFCSSAqLworfTsKKworLyoKKyAqIEdlbmVyYWxpemVkIGhhcmR3YXJlIGNhY2hlIGV2ZW50czoKKyAqCisgKiAgICAgICB7IEwxLUQsIEwxLUksIExMQywgSVRMQiwgRFRMQiwgQlBVLCBOT0RFIH0geAorICogICAgICAgeyByZWFkLCB3cml0ZSwgcHJlZmV0Y2ggfSB4CisgKiAgICAgICB7IGFjY2Vzc2VzLCBtaXNzZXMgfQorICovCitlbnVtIHBlcmZfaHdfY2FjaGVfaWQgeworCVBFUkZfQ09VTlRfSFdfQ0FDSEVfTDFECQkJPSAwLAorCVBFUkZfQ09VTlRfSFdfQ0FDSEVfTDFJCQkJPSAxLAorCVBFUkZfQ09VTlRfSFdfQ0FDSEVfTEwJCQk9IDIsCisJUEVSRl9DT1VOVF9IV19DQUNIRV9EVExCCQk9IDMsCisJUEVSRl9DT1VOVF9IV19DQUNIRV9JVExCCQk9IDQsCisJUEVSRl9DT1VOVF9IV19DQUNIRV9CUFUJCQk9IDUsCisJUEVSRl9DT1VOVF9IV19DQUNIRV9OT0RFCQk9IDYsCisKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX01BWCwJCS8qIG5vbi1BQkkgKi8KK307CisKK2VudW0gcGVyZl9od19jYWNoZV9vcF9pZCB7CisJUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9SRUFECQk9IDAsCisJUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9XUklURQkJPSAxLAorCVBFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfUFJFRkVUQ0gJCT0gMiwKKworCVBFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfTUFYLAkJLyogbm9uLUFCSSAqLworfTsKKworZW51bSBwZXJmX2h3X2NhY2hlX29wX3Jlc3VsdF9pZCB7CisJUEVSRl9DT1VOVF9IV19DQUNIRV9SRVNVTFRfQUNDRVNTCT0gMCwKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NSVNTCQk9IDEsCisKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVgsCQkvKiBub24tQUJJICovCit9OworCisvKgorICogU3BlY2lhbCAic29mdHdhcmUiIGV2ZW50cyBwcm92aWRlZCBieSB0aGUga2VybmVsLCBldmVuIGlmIHRoZSBoYXJkd2FyZQorICogZG9lcyBub3Qgc3VwcG9ydCBwZXJmb3JtYW5jZSBldmVudHMuIFRoZXNlIGV2ZW50cyBtZWFzdXJlIHZhcmlvdXMKKyAqIHBoeXNpY2FsIGFuZCBzdyBldmVudHMgb2YgdGhlIGtlcm5lbCAoYW5kIGFsbG93IHRoZSBwcm9maWxpbmcgb2YgdGhlbSBhcworICogd2VsbCk6CisgKi8KK2VudW0gcGVyZl9zd19pZHMgeworCVBFUkZfQ09VTlRfU1dfQ1BVX0NMT0NLCQkJPSAwLAorCVBFUkZfQ09VTlRfU1dfVEFTS19DTE9DSwkJPSAxLAorCVBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFMJCT0gMiwKKwlQRVJGX0NPVU5UX1NXX0NPTlRFWFRfU1dJVENIRVMJCT0gMywKKwlQRVJGX0NPVU5UX1NXX0NQVV9NSUdSQVRJT05TCQk9IDQsCisJUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUU19NSU4JCT0gNSwKKwlQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01BSgkJPSA2LAorCVBFUkZfQ09VTlRfU1dfQUxJR05NRU5UX0ZBVUxUUwkJPSA3LAorCVBFUkZfQ09VTlRfU1dfRU1VTEFUSU9OX0ZBVUxUUwkJPSA4LAorCisJUEVSRl9DT1VOVF9TV19NQVgsCQkJLyogbm9uLUFCSSAqLworfTsKKworLyoKKyAqIEJpdHMgdGhhdCBjYW4gYmUgc2V0IGluIGF0dHIuc2FtcGxlX3R5cGUgdG8gcmVxdWVzdCBpbmZvcm1hdGlvbgorICogaW4gdGhlIG92ZXJmbG93IHBhY2tldHMuCisgKi8KK2VudW0gcGVyZl9ldmVudF9zYW1wbGVfZm9ybWF0IHsKKwlQRVJGX1NBTVBMRV9JUAkJCQk9IDFVIDw8IDAsCisJUEVSRl9TQU1QTEVfVElECQkJCT0gMVUgPDwgMSwKKwlQRVJGX1NBTVBMRV9USU1FCQkJPSAxVSA8PCAyLAorCVBFUkZfU0FNUExFX0FERFIJCQk9IDFVIDw8IDMsCisJUEVSRl9TQU1QTEVfUkVBRAkJCT0gMVUgPDwgNCwKKwlQRVJGX1NBTVBMRV9DQUxMQ0hBSU4JCQk9IDFVIDw8IDUsCisJUEVSRl9TQU1QTEVfSUQJCQkJPSAxVSA8PCA2LAorCVBFUkZfU0FNUExFX0NQVQkJCQk9IDFVIDw8IDcsCisJUEVSRl9TQU1QTEVfUEVSSU9ECQkJPSAxVSA8PCA4LAorCVBFUkZfU0FNUExFX1NUUkVBTV9JRAkJCT0gMVUgPDwgOSwKKwlQRVJGX1NBTVBMRV9SQVcJCQkJPSAxVSA8PCAxMCwKKworCVBFUkZfU0FNUExFX01BWCA9IDFVIDw8IDExLAkJLyogbm9uLUFCSSAqLworfTsKKworLyoKKyAqIFRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgcmV0dXJuZWQgYnkgcmVhZCgpIG9uIGEgcGVyZiBldmVudCBmZCwKKyAqIGFzIHNwZWNpZmllZCBieSBhdHRyLnJlYWRfZm9ybWF0OgorICoKKyAqIHN0cnVjdCByZWFkX2Zvcm1hdCB7CisgKgl7IHU2NAkJdmFsdWU7CisgKgkgIHsgdTY0CQl0aW1lX2VuYWJsZWQ7IH0gJiYgUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9FTkFCTEVECisgKgkgIHsgdTY0CQl0aW1lX3J1bm5pbmc7IH0gJiYgUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9SVU5OSU5HCisgKgkgIHsgdTY0CQlpZDsgICAgICAgICAgIH0gJiYgUEVSRl9GT1JNQVRfSUQKKyAqCX0gJiYgIVBFUkZfRk9STUFUX0dST1VQCisgKgorICoJeyB1NjQJCW5yOworICoJICB7IHU2NAkJdGltZV9lbmFibGVkOyB9ICYmIFBFUkZfRk9STUFUX1RPVEFMX1RJTUVfRU5BQkxFRAorICoJICB7IHU2NAkJdGltZV9ydW5uaW5nOyB9ICYmIFBFUkZfRk9STUFUX1RPVEFMX1RJTUVfUlVOTklORworICoJICB7IHU2NAkJdmFsdWU7CisgKgkgICAgeyB1NjQJaWQ7ICAgICAgICAgICB9ICYmIFBFUkZfRk9STUFUX0lECisgKgkgIH0JCWNudHJbbnJdOworICoJfSAmJiBQRVJGX0ZPUk1BVF9HUk9VUAorICogfTsKKyAqLworZW51bSBwZXJmX2V2ZW50X3JlYWRfZm9ybWF0IHsKKwlQRVJGX0ZPUk1BVF9UT1RBTF9USU1FX0VOQUJMRUQJCT0gMVUgPDwgMCwKKwlQRVJGX0ZPUk1BVF9UT1RBTF9USU1FX1JVTk5JTkcJCT0gMVUgPDwgMSwKKwlQRVJGX0ZPUk1BVF9JRAkJCQk9IDFVIDw8IDIsCisJUEVSRl9GT1JNQVRfR1JPVVAJCQk9IDFVIDw8IDMsCisKKwlQRVJGX0ZPUk1BVF9NQVggPSAxVSA8PCA0LAkJLyogbm9uLUFCSSAqLworfTsKKworI2RlZmluZSBQRVJGX0FUVFJfU0laRV9WRVIwCTY0CS8qIHNpemVvZiBmaXJzdCBwdWJsaXNoZWQgc3RydWN0ICovCisKKy8qCisgKiBIYXJkd2FyZSBldmVudF9pZCB0byBtb25pdG9yIHZpYSBhIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgZXZlbnQ6CisgKi8KK3N0cnVjdCBwZXJmX2V2ZW50X2F0dHIgeworCisJLyoKKwkgKiBNYWpvciB0eXBlOiBoYXJkd2FyZS9zb2Z0d2FyZS90cmFjZXBvaW50L2V0Yy4KKwkgKi8KKwlfX3UzMgkJCXR5cGU7CisKKwkvKgorCSAqIFNpemUgb2YgdGhlIGF0dHIgc3RydWN0dXJlLCBmb3IgZndkL2J3ZCBjb21wYXQuCisJICovCisJX191MzIJCQlzaXplOworCisJLyoKKwkgKiBUeXBlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisJICovCisJX191NjQJCQljb25maWc7CisKKwl1bmlvbiB7CisJCV9fdTY0CQlzYW1wbGVfcGVyaW9kOworCQlfX3U2NAkJc2FtcGxlX2ZyZXE7CisJfTsKKworCV9fdTY0CQkJc2FtcGxlX3R5cGU7CisJX191NjQJCQlyZWFkX2Zvcm1hdDsKKworCV9fdTY0CQkJZGlzYWJsZWQgICAgICAgOiAgMSwgLyogb2ZmIGJ5IGRlZmF1bHQgICAgICAgICovCisJCQkJaW5oZXJpdAkgICAgICAgOiAgMSwgLyogY2hpbGRyZW4gaW5oZXJpdCBpdCAgICovCisJCQkJcGlubmVkCSAgICAgICA6ICAxLCAvKiBtdXN0IGFsd2F5cyBiZSBvbiBQTVUgKi8KKwkJCQlleGNsdXNpdmUgICAgICA6ICAxLCAvKiBvbmx5IGdyb3VwIG9uIFBNVSAgICAgKi8KKwkJCQlleGNsdWRlX3VzZXIgICA6ICAxLCAvKiBkb24ndCBjb3VudCB1c2VyICAgICAgKi8KKwkJCQlleGNsdWRlX2tlcm5lbCA6ICAxLCAvKiBkaXR0byBrZXJuZWwgICAgICAgICAgKi8KKwkJCQlleGNsdWRlX2h2ICAgICA6ICAxLCAvKiBkaXR0byBoeXBlcnZpc29yICAgICAgKi8KKwkJCQlleGNsdWRlX2lkbGUgICA6ICAxLCAvKiBkb24ndCBjb3VudCB3aGVuIGlkbGUgKi8KKwkJCQltbWFwICAgICAgICAgICA6ICAxLCAvKiBpbmNsdWRlIG1tYXAgZGF0YSAgICAgKi8KKwkJCQljb21tCSAgICAgICA6ICAxLCAvKiBpbmNsdWRlIGNvbW0gZGF0YSAgICAgKi8KKwkJCQlmcmVxICAgICAgICAgICA6ICAxLCAvKiB1c2UgZnJlcSwgbm90IHBlcmlvZCAgKi8KKwkJCQlpbmhlcml0X3N0YXQgICA6ICAxLCAvKiBwZXIgdGFzayBjb3VudHMgICAgICAgKi8KKwkJCQllbmFibGVfb25fZXhlYyA6ICAxLCAvKiBuZXh0IGV4ZWMgZW5hYmxlcyAgICAgKi8KKwkJCQl0YXNrICAgICAgICAgICA6ICAxLCAvKiB0cmFjZSBmb3JrL2V4aXQgICAgICAgKi8KKwkJCQl3YXRlcm1hcmsgICAgICA6ICAxLCAvKiB3YWtldXBfd2F0ZXJtYXJrICAgICAgKi8KKwkJCQkvKgorCQkJCSAqIHByZWNpc2VfaXA6CisJCQkJICoKKwkJCQkgKiAgMCAtIFNBTVBMRV9JUCBjYW4gaGF2ZSBhcmJpdHJhcnkgc2tpZAorCQkJCSAqICAxIC0gU0FNUExFX0lQIG11c3QgaGF2ZSBjb25zdGFudCBza2lkCisJCQkJICogIDIgLSBTQU1QTEVfSVAgcmVxdWVzdGVkIHRvIGhhdmUgMCBza2lkCisJCQkJICogIDMgLSBTQU1QTEVfSVAgbXVzdCBoYXZlIDAgc2tpZAorCQkJCSAqCisJCQkJICogIFNlZSBhbHNvIFBFUkZfUkVDT1JEX01JU0NfRVhBQ1RfSVAKKwkJCQkgKi8KKwkJCQlwcmVjaXNlX2lwICAgICA6ICAyLCAvKiBza2lkIGNvbnN0cmFpbnQgICAgICAgKi8KKwkJCQltbWFwX2RhdGEgICAgICA6ICAxLCAvKiBub24tZXhlYyBtbWFwIGRhdGEgICAgKi8KKwkJCQlzYW1wbGVfaWRfYWxsICA6ICAxLCAvKiBzYW1wbGVfdHlwZSBhbGwgZXZlbnRzICovCisKKwkJCQlleGNsdWRlX2hvc3QgICA6ICAxLCAvKiBkb24ndCBjb3VudCBpbiBob3N0ICAgKi8KKwkJCQlleGNsdWRlX2d1ZXN0ICA6ICAxLCAvKiBkb24ndCBjb3VudCBpbiBndWVzdCAgKi8KKworCQkJCV9fcmVzZXJ2ZWRfMSAgIDogNDM7CisKKwl1bmlvbiB7CisJCV9fdTMyCQl3YWtldXBfZXZlbnRzOwkgIC8qIHdha2V1cCBldmVyeSBuIGV2ZW50cyAqLworCQlfX3UzMgkJd2FrZXVwX3dhdGVybWFyazsgLyogYnl0ZXMgYmVmb3JlIHdha2V1cCAgICovCisJfTsKKworCV9fdTMyCQkJYnBfdHlwZTsKKwl1bmlvbiB7CisJCV9fdTY0CQlicF9hZGRyOworCQlfX3U2NAkJY29uZmlnMTsgLyogZXh0ZW5zaW9uIG9mIGNvbmZpZyAqLworCX07CisJdW5pb24geworCQlfX3U2NAkJYnBfbGVuOworCQlfX3U2NAkJY29uZmlnMjsgLyogZXh0ZW5zaW9uIG9mIGNvbmZpZzEgKi8KKwl9OworfTsKKworLyoKKyAqIElvY3RscyB0aGF0IGNhbiBiZSBkb25lIG9uIGEgcGVyZiBldmVudCBmZDoKKyAqLworI2RlZmluZSBQRVJGX0VWRU5UX0lPQ19FTkFCTEUJCV9JTyAoJyQnLCAwKQorI2RlZmluZSBQRVJGX0VWRU5UX0lPQ19ESVNBQkxFCQlfSU8gKCckJywgMSkKKyNkZWZpbmUgUEVSRl9FVkVOVF9JT0NfUkVGUkVTSAkJX0lPICgnJCcsIDIpCisjZGVmaW5lIFBFUkZfRVZFTlRfSU9DX1JFU0VUCQlfSU8gKCckJywgMykKKyNkZWZpbmUgUEVSRl9FVkVOVF9JT0NfUEVSSU9ECQlfSU9XKCckJywgNCwgX191NjQpCisjZGVmaW5lIFBFUkZfRVZFTlRfSU9DX1NFVF9PVVRQVVQJX0lPICgnJCcsIDUpCisjZGVmaW5lIFBFUkZfRVZFTlRfSU9DX1NFVF9GSUxURVIJX0lPVygnJCcsIDYsIGNoYXIgKikKKworZW51bSBwZXJmX2V2ZW50X2lvY19mbGFncyB7CisJUEVSRl9JT0NfRkxBR19HUk9VUAkJPSAxVSA8PCAwLAorfTsKKworLyoKKyAqIFN0cnVjdHVyZSBvZiB0aGUgcGFnZSB0aGF0IGNhbiBiZSBtYXBwZWQgdmlhIG1tYXAKKyAqLworc3RydWN0IHBlcmZfZXZlbnRfbW1hcF9wYWdlIHsKKwlfX3UzMgl2ZXJzaW9uOwkJLyogdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKwlfX3UzMgljb21wYXRfdmVyc2lvbjsJCS8qIGxvd2VzdCB2ZXJzaW9uIHRoaXMgaXMgY29tcGF0IHdpdGggKi8KKworCS8qCisJICogQml0cyBuZWVkZWQgdG8gcmVhZCB0aGUgaHcgZXZlbnRzIGluIHVzZXItc3BhY2UuCisJICoKKwkgKiAgIHUzMiBzZXE7CisJICogICBzNjQgY291bnQ7CisJICoKKwkgKiAgIGRvIHsKKwkgKiAgICAgc2VxID0gcGMtPmxvY2s7CisJICoKKwkgKiAgICAgYmFycmllcigpCisJICogICAgIGlmIChwYy0+aW5kZXgpIHsKKwkgKiAgICAgICBjb3VudCA9IHBtY19yZWFkKHBjLT5pbmRleCAtIDEpOworCSAqICAgICAgIGNvdW50ICs9IHBjLT5vZmZzZXQ7CisJICogICAgIH0gZWxzZQorCSAqICAgICAgIGdvdG8gcmVndWxhcl9yZWFkOworCSAqCisJICogICAgIGJhcnJpZXIoKTsKKwkgKiAgIH0gd2hpbGUgKHBjLT5sb2NrICE9IHNlcSk7CisJICoKKwkgKiBOT1RFOiBmb3Igb2J2aW91cyByZWFzb24gdGhpcyBvbmx5IHdvcmtzIG9uIHNlbGYtbW9uaXRvcmluZworCSAqICAgICAgIHByb2Nlc3Nlcy4KKwkgKi8KKwlfX3UzMglsb2NrOwkJCS8qIHNlcWxvY2sgZm9yIHN5bmNocm9uaXphdGlvbiAqLworCV9fdTMyCWluZGV4OwkJCS8qIGhhcmR3YXJlIGV2ZW50IGlkZW50aWZpZXIgKi8KKwlfX3M2NAlvZmZzZXQ7CQkJLyogYWRkIHRvIGhhcmR3YXJlIGV2ZW50IHZhbHVlICovCisJX191NjQJdGltZV9lbmFibGVkOwkJLyogdGltZSBldmVudCBhY3RpdmUgKi8KKwlfX3U2NAl0aW1lX3J1bm5pbmc7CQkvKiB0aW1lIGV2ZW50IG9uIGNwdSAqLworCisJCS8qCisJCSAqIEhvbGUgZm9yIGV4dGVuc2lvbiBvZiB0aGUgc2VsZiBtb25pdG9yIGNhcGFiaWxpdGllcworCQkgKi8KKworCV9fdTY0CV9fcmVzZXJ2ZWRbMTIzXTsJLyogYWxpZ24gdG8gMWsgKi8KKworCS8qCisJICogQ29udHJvbCBkYXRhIGZvciB0aGUgbW1hcCgpIGRhdGEgYnVmZmVyLgorCSAqCisJICogVXNlci1zcGFjZSByZWFkaW5nIHRoZSBAZGF0YV9oZWFkIHZhbHVlIHNob3VsZCBpc3N1ZSBhbiBybWIoKSwgb24KKwkgKiBTTVAgY2FwYWJsZSBwbGF0Zm9ybXMsIGFmdGVyIHJlYWRpbmcgdGhpcyB2YWx1ZSAtLSBzZWUKKwkgKiBwZXJmX2V2ZW50X3dha2V1cCgpLgorCSAqCisJICogV2hlbiB0aGUgbWFwcGluZyBpcyBQUk9UX1dSSVRFIHRoZSBAZGF0YV90YWlsIHZhbHVlIHNob3VsZCBiZQorCSAqIHdyaXR0ZW4gYnkgdXNlcnNwYWNlIHRvIHJlZmxlY3QgdGhlIGxhc3QgcmVhZCBkYXRhLiBJbiB0aGlzIGNhc2UKKwkgKiB0aGUga2VybmVsIHdpbGwgbm90IG92ZXItd3JpdGUgdW5yZWFkIGRhdGEuCisJICovCisJX191NjQgICBkYXRhX2hlYWQ7CQkvKiBoZWFkIGluIHRoZSBkYXRhIHNlY3Rpb24gKi8KKwlfX3U2NAlkYXRhX3RhaWw7CQkvKiB1c2VyLXNwYWNlIHdyaXR0ZW4gdGFpbCAqLworfTsKKworI2RlZmluZSBQRVJGX1JFQ09SRF9NSVNDX0NQVU1PREVfTUFTSwkJKDcgPDwgMCkKKyNkZWZpbmUgUEVSRl9SRUNPUkRfTUlTQ19DUFVNT0RFX1VOS05PV04JKDAgPDwgMCkKKyNkZWZpbmUgUEVSRl9SRUNPUkRfTUlTQ19LRVJORUwJCQkoMSA8PCAwKQorI2RlZmluZSBQRVJGX1JFQ09SRF9NSVNDX1VTRVIJCQkoMiA8PCAwKQorI2RlZmluZSBQRVJGX1JFQ09SRF9NSVNDX0hZUEVSVklTT1IJCSgzIDw8IDApCisjZGVmaW5lIFBFUkZfUkVDT1JEX01JU0NfR1VFU1RfS0VSTkVMCQkoNCA8PCAwKQorI2RlZmluZSBQRVJGX1JFQ09SRF9NSVNDX0dVRVNUX1VTRVIJCSg1IDw8IDApCisKKy8qCisgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgY29udGVudCBvZiBQRVJGX1NBTVBMRV9JUCBwb2ludHMgdG8KKyAqIHRoZSBhY3R1YWwgaW5zdHJ1Y3Rpb24gdGhhdCB0cmlnZ2VyZWQgdGhlIGV2ZW50LiBTZWUgYWxzbworICogcGVyZl9ldmVudF9hdHRyOjpwcmVjaXNlX2lwLgorICovCisjZGVmaW5lIFBFUkZfUkVDT1JEX01JU0NfRVhBQ1RfSVAJCSgxIDw8IDE0KQorLyoKKyAqIFJlc2VydmUgdGhlIGxhc3QgYml0IHRvIGluZGljYXRlIHNvbWUgZXh0ZW5kZWQgbWlzYyBmaWVsZAorICovCisjZGVmaW5lIFBFUkZfUkVDT1JEX01JU0NfRVhUX1JFU0VSVkVECQkoMSA8PCAxNSkKKworc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyIHsKKwlfX3UzMgl0eXBlOworCV9fdTE2CW1pc2M7CisJX191MTYJc2l6ZTsKK307CisKK2VudW0gcGVyZl9ldmVudF90eXBlIHsKKworCS8qCisJICogSWYgcGVyZl9ldmVudF9hdHRyLnNhbXBsZV9pZF9hbGwgaXMgc2V0IHRoZW4gYWxsIGV2ZW50IHR5cGVzIHdpbGwKKwkgKiBoYXZlIHRoZSBzYW1wbGVfdHlwZSBzZWxlY3RlZCBmaWVsZHMgcmVsYXRlZCB0byB3aGVyZS93aGVuCisJICogKGlkZW50aXR5KSBhbiBldmVudCB0b29rIHBsYWNlIChUSUQsIFRJTUUsIElELCBDUFUsIFNUUkVBTV9JRCkKKwkgKiBkZXNjcmliZWQgaW4gUEVSRl9SRUNPUkRfU0FNUExFIGJlbG93LCBpdCB3aWxsIGJlIHN0YXNoZWQganVzdCBhZnRlcgorCSAqIHRoZSBwZXJmX2V2ZW50X2hlYWRlciBhbmQgdGhlIGZpZWxkcyBhbHJlYWR5IHByZXNlbnQgZm9yIHRoZSBleGlzdGluZworCSAqIGZpZWxkcywgaS5lLiBhdCB0aGUgZW5kIG9mIHRoZSBwYXlsb2FkLiBUaGF0IHdheSBhIG5ld2VyIHBlcmYuZGF0YQorCSAqIGZpbGUgd2lsbCBiZSBzdXBwb3J0ZWQgYnkgb2xkZXIgcGVyZiB0b29scywgd2l0aCB0aGVzZSBuZXcgb3B0aW9uYWwKKwkgKiBmaWVsZHMgYmVpbmcgaWdub3JlZC4KKwkgKgorCSAqIFRoZSBNTUFQIGV2ZW50cyByZWNvcmQgdGhlIFBST1RfRVhFQyBtYXBwaW5ncyBzbyB0aGF0IHdlIGNhbgorCSAqIGNvcnJlbGF0ZSB1c2Vyc3BhY2UgSVBzIHRvIGNvZGUuIFRoZXkgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKwkgKgorCSAqIHN0cnVjdCB7CisJICoJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwkgKgorCSAqCXUzMgkJCQlwaWQsIHRpZDsKKwkgKgl1NjQJCQkJYWRkcjsKKwkgKgl1NjQJCQkJbGVuOworCSAqCXU2NAkJCQlwZ29mZjsKKwkgKgljaGFyCQkJCWZpbGVuYW1lW107CisJICogfTsKKwkgKi8KKwlQRVJGX1JFQ09SRF9NTUFQCQkJPSAxLAorCisJLyoKKwkgKiBzdHJ1Y3QgeworCSAqCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlcgloZWFkZXI7CisJICoJdTY0CQkJCWlkOworCSAqCXU2NAkJCQlsb3N0OworCSAqIH07CisJICovCisJUEVSRl9SRUNPUkRfTE9TVAkJCT0gMiwKKworCS8qCisJICogc3RydWN0IHsKKwkgKglzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIJaGVhZGVyOworCSAqCisJICoJdTMyCQkJCXBpZCwgdGlkOworCSAqCWNoYXIJCQkJY29tbVtdOworCSAqIH07CisJICovCisJUEVSRl9SRUNPUkRfQ09NTQkJCT0gMywKKworCS8qCisJICogc3RydWN0IHsKKwkgKglzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIJaGVhZGVyOworCSAqCXUzMgkJCQlwaWQsIHBwaWQ7CisJICoJdTMyCQkJCXRpZCwgcHRpZDsKKwkgKgl1NjQJCQkJdGltZTsKKwkgKiB9OworCSAqLworCVBFUkZfUkVDT1JEX0VYSVQJCQk9IDQsCisKKwkvKgorCSAqIHN0cnVjdCB7CisJICoJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwkgKgl1NjQJCQkJdGltZTsKKwkgKgl1NjQJCQkJaWQ7CisJICoJdTY0CQkJCXN0cmVhbV9pZDsKKwkgKiB9OworCSAqLworCVBFUkZfUkVDT1JEX1RIUk9UVExFCQkJPSA1LAorCVBFUkZfUkVDT1JEX1VOVEhST1RUTEUJCQk9IDYsCisKKwkvKgorCSAqIHN0cnVjdCB7CisJICoJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwkgKgl1MzIJCQkJcGlkLCBwcGlkOworCSAqCXUzMgkJCQl0aWQsIHB0aWQ7CisJICoJdTY0CQkJCXRpbWU7CisJICogfTsKKwkgKi8KKwlQRVJGX1JFQ09SRF9GT1JLCQkJPSA3LAorCisJLyoKKwkgKiBzdHJ1Y3QgeworCSAqCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlcgloZWFkZXI7CisJICoJdTMyCQkJCXBpZCwgdGlkOworCSAqCisJICoJc3RydWN0IHJlYWRfZm9ybWF0CQl2YWx1ZXM7CisJICogfTsKKwkgKi8KKwlQRVJGX1JFQ09SRF9SRUFECQkJPSA4LAorCisJLyoKKwkgKiBzdHJ1Y3QgeworCSAqCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlcgloZWFkZXI7CisJICoKKwkgKgl7IHU2NAkJCWlwOwkgIH0gJiYgUEVSRl9TQU1QTEVfSVAKKwkgKgl7IHUzMgkJCXBpZCwgdGlkOyB9ICYmIFBFUkZfU0FNUExFX1RJRAorCSAqCXsgdTY0CQkJdGltZTsgICAgIH0gJiYgUEVSRl9TQU1QTEVfVElNRQorCSAqCXsgdTY0CQkJYWRkcjsgICAgIH0gJiYgUEVSRl9TQU1QTEVfQUREUgorCSAqCXsgdTY0CQkJaWQ7CSAgfSAmJiBQRVJGX1NBTVBMRV9JRAorCSAqCXsgdTY0CQkJc3RyZWFtX2lkO30gJiYgUEVSRl9TQU1QTEVfU1RSRUFNX0lECisJICoJeyB1MzIJCQljcHUsIHJlczsgfSAmJiBQRVJGX1NBTVBMRV9DUFUKKwkgKgl7IHU2NAkJCXBlcmlvZDsgICB9ICYmIFBFUkZfU0FNUExFX1BFUklPRAorCSAqCisJICoJeyBzdHJ1Y3QgcmVhZF9mb3JtYXQJdmFsdWVzOwkgIH0gJiYgUEVSRl9TQU1QTEVfUkVBRAorCSAqCisJICoJeyB1NjQJCQluciwKKwkgKgkgIHU2NAkJCWlwc1tucl07ICB9ICYmIFBFUkZfU0FNUExFX0NBTExDSEFJTgorCSAqCisJICoJIworCSAqCSMgVGhlIFJBVyByZWNvcmQgYmVsb3cgaXMgb3BhcXVlIGRhdGEgd3J0IHRoZSBBQkkKKwkgKgkjCisJICoJIyBUaGF0IGlzLCB0aGUgQUJJIGRvZXNuJ3QgbWFrZSBhbnkgcHJvbWlzZXMgd3J0IHRvCisJICoJIyB0aGUgc3RhYmlsaXR5IG9mIGl0cyBjb250ZW50LCBpdCBtYXkgdmFyeSBkZXBlbmRpbmcKKwkgKgkjIG9uIGV2ZW50LCBoYXJkd2FyZSwga2VybmVsIHZlcnNpb24gYW5kIHBoYXNlIG9mCisJICoJIyB0aGUgbW9vbi4KKwkgKgkjCisJICoJIyBJbiBvdGhlciB3b3JkcywgUEVSRl9TQU1QTEVfUkFXIGNvbnRlbnRzIGFyZSBub3QgYW4gQUJJLgorCSAqCSMKKwkgKgorCSAqCXsgdTMyCQkJc2l6ZTsKKwkgKgkgIGNoYXIgICAgICAgICAgICAgICAgICBkYXRhW3NpemVdO30mJiBQRVJGX1NBTVBMRV9SQVcKKwkgKiB9OworCSAqLworCVBFUkZfUkVDT1JEX1NBTVBMRQkJCT0gOSwKKworCVBFUkZfUkVDT1JEX01BWCwJCQkvKiBub24tQUJJICovCit9OworCitlbnVtIHBlcmZfY2FsbGNoYWluX2NvbnRleHQgeworCVBFUkZfQ09OVEVYVF9IVgkJCT0gKF9fdTY0KS0zMiwKKwlQRVJGX0NPTlRFWFRfS0VSTkVMCQk9IChfX3U2NCktMTI4LAorCVBFUkZfQ09OVEVYVF9VU0VSCQk9IChfX3U2NCktNTEyLAorCisJUEVSRl9DT05URVhUX0dVRVNUCQk9IChfX3U2NCktMjA0OCwKKwlQRVJGX0NPTlRFWFRfR1VFU1RfS0VSTkVMCT0gKF9fdTY0KS0yMTc2LAorCVBFUkZfQ09OVEVYVF9HVUVTVF9VU0VSCQk9IChfX3U2NCktMjU2MCwKKworCVBFUkZfQ09OVEVYVF9NQVgJCT0gKF9fdTY0KS00MDk1LAorfTsKKworI2RlZmluZSBQRVJGX0ZMQUdfRkRfTk9fR1JPVVAJCSgxVSA8PCAwKQorI2RlZmluZSBQRVJGX0ZMQUdfRkRfT1VUUFVUCQkoMVUgPDwgMSkKKyNkZWZpbmUgUEVSRl9GTEFHX1BJRF9DR1JPVVAJCSgxVSA8PCAyKSAvKiBwaWQ9Y2dyb3VwIGlkLCBwZXItY3B1IG1vZGUgb25seSAqLworCisjZW5kaWYgLyogX0xJTlVYX1BFUkZfRVZFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wZXJzb25hbGl0eS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wZXJzb25hbGl0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NzE3MDMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BlcnNvbmFsaXR5LmgKQEAgLTAsMCArMSw2OSBAQAorI2lmbmRlZiBfTElOVVhfUEVSU09OQUxJVFlfSAorI2RlZmluZSBfTElOVVhfUEVSU09OQUxJVFlfSAorCisKKy8qCisgKiBGbGFncyBmb3IgYnVnIGVtdWxhdGlvbi4KKyAqCisgKiBUaGVzZSBvY2N1cHkgdGhlIHRvcCB0aHJlZSBieXRlcy4KKyAqLworZW51bSB7CisJVU5BTUUyNgk9ICAgICAgICAgICAgICAgMHgwMDIwMDAwLAorCUFERFJfTk9fUkFORE9NSVpFID0gCTB4MDA0MDAwMCwJLyogZGlzYWJsZSByYW5kb21pemF0aW9uIG9mIFZBIHNwYWNlICovCisJRkRQSUNfRlVOQ1BUUlMgPQkweDAwODAwMDAsCS8qIHVzZXJzcGFjZSBmdW5jdGlvbiBwdHJzIHBvaW50IHRvIGRlc2NyaXB0b3JzCisJCQkJCQkgKiAoc2lnbmFsIGhhbmRsaW5nKQorCQkJCQkJICovCisJTU1BUF9QQUdFX1pFUk8gPQkweDAxMDAwMDAsCisJQUREUl9DT01QQVRfTEFZT1VUID0JMHgwMjAwMDAwLAorCVJFQURfSU1QTElFU19FWEVDID0JMHgwNDAwMDAwLAorCUFERFJfTElNSVRfMzJCSVQgPQkweDA4MDAwMDAsCisJU0hPUlRfSU5PREUgPQkJMHgxMDAwMDAwLAorCVdIT0xFX1NFQ09ORFMgPQkJMHgyMDAwMDAwLAorCVNUSUNLWV9USU1FT1VUUwk9CTB4NDAwMDAwMCwKKwlBRERSX0xJTUlUXzNHQiA9IAkweDgwMDAwMDAsCit9OworCisvKgorICogU2VjdXJpdHktcmVsZXZhbnQgY29tcGF0aWJpbGl0eSBmbGFncyB0aGF0IG11c3QgYmUKKyAqIGNsZWFyZWQgdXBvbiBzZXR1aWQgb3Igc2V0Z2lkIGV4ZWM6CisgKi8KKyNkZWZpbmUgUEVSX0NMRUFSX09OX1NFVElEIChSRUFEX0lNUExJRVNfRVhFQyAgfCBcCisJCQkgICAgQUREUl9OT19SQU5ET01JWkUgIHwgXAorCQkJICAgIEFERFJfQ09NUEFUX0xBWU9VVCB8IFwKKwkJCSAgICBNTUFQX1BBR0VfWkVSTykKKworLyoKKyAqIFBlcnNvbmFsaXR5IHR5cGVzLgorICoKKyAqIFRoZXNlIGdvIGluIHRoZSBsb3cgYnl0ZS4gIEF2b2lkIHVzaW5nIHRoZSB0b3AgYml0LCBpdCB3aWxsCisgKiBjb25mbGljdCB3aXRoIGVycm9yIHJldHVybnMuCisgKi8KK2VudW0geworCVBFUl9MSU5VWCA9CQkweDAwMDAsCisJUEVSX0xJTlVYXzMyQklUID0JMHgwMDAwIHwgQUREUl9MSU1JVF8zMkJJVCwKKwlQRVJfTElOVVhfRkRQSUMgPQkweDAwMDAgfCBGRFBJQ19GVU5DUFRSUywKKwlQRVJfU1ZSNCA9CQkweDAwMDEgfCBTVElDS1lfVElNRU9VVFMgfCBNTUFQX1BBR0VfWkVSTywKKwlQRVJfU1ZSMyA9CQkweDAwMDIgfCBTVElDS1lfVElNRU9VVFMgfCBTSE9SVF9JTk9ERSwKKwlQRVJfU0NPU1ZSMyA9CQkweDAwMDMgfCBTVElDS1lfVElNRU9VVFMgfAorCQkJCQkgV0hPTEVfU0VDT05EUyB8IFNIT1JUX0lOT0RFLAorCVBFUl9PU1I1ID0JCTB4MDAwMyB8IFNUSUNLWV9USU1FT1VUUyB8IFdIT0xFX1NFQ09ORFMsCisJUEVSX1dZU0VWMzg2ID0JCTB4MDAwNCB8IFNUSUNLWV9USU1FT1VUUyB8IFNIT1JUX0lOT0RFLAorCVBFUl9JU0NSNCA9CQkweDAwMDUgfCBTVElDS1lfVElNRU9VVFMsCisJUEVSX0JTRCA9CQkweDAwMDYsCisJUEVSX1NVTk9TID0JCTB4MDAwNiB8IFNUSUNLWV9USU1FT1VUUywKKwlQRVJfWEVOSVggPQkJMHgwMDA3IHwgU1RJQ0tZX1RJTUVPVVRTIHwgU0hPUlRfSU5PREUsCisJUEVSX0xJTlVYMzIgPQkJMHgwMDA4LAorCVBFUl9MSU5VWDMyXzNHQiA9CTB4MDAwOCB8IEFERFJfTElNSVRfM0dCLAorCVBFUl9JUklYMzIgPQkJMHgwMDA5IHwgU1RJQ0tZX1RJTUVPVVRTLC8qIElSSVg1IDMyLWJpdCAqLworCVBFUl9JUklYTjMyID0JCTB4MDAwYSB8IFNUSUNLWV9USU1FT1VUUywvKiBJUklYNiBuZXcgMzItYml0ICovCisJUEVSX0lSSVg2NCA9CQkweDAwMGIgfCBTVElDS1lfVElNRU9VVFMsLyogSVJJWDYgNjQtYml0ICovCisJUEVSX1JJU0NPUyA9CQkweDAwMGMsCisJUEVSX1NPTEFSSVMgPQkJMHgwMDBkIHwgU1RJQ0tZX1RJTUVPVVRTLAorCVBFUl9VVzcgPQkJMHgwMDBlIHwgU1RJQ0tZX1RJTUVPVVRTIHwgTU1BUF9QQUdFX1pFUk8sCisJUEVSX09TRjQgPQkJMHgwMDBmLAkJCSAvKiBPU0YvMSB2NCAqLworCVBFUl9IUFVYID0JCTB4MDAxMCwKKwlQRVJfTUFTSyA9CQkweDAwZmYsCit9OworCisKKyNlbmRpZiAvKiBfTElOVVhfUEVSU09OQUxJVFlfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wZmtleXYyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Bma2V5djIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjgwYzgwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wZmtleXYyLmgKQEAgLTAsMCArMSwzNzAgQEAKKy8qIFBGX0tFWSB1c2VyIGludGVyZmFjZSwgdGhpcyBpcyBkZWZpbmVkIGJ5IHJmYzIzNjcgc28KKyAqIGRvIG5vdCBtYWtlIGFyYml0cmFyeSBtb2RpZmljYXRpb25zIG9yIGVsc2UgdGhpcyBoZWFkZXIKKyAqIGZpbGUgd2lsbCBub3QgYmUgY29tcGxpYW50LgorICovCisKKyNpZm5kZWYgX0xJTlVYX1BGS0VZMl9ICisjZGVmaW5lIF9MSU5VWF9QRktFWTJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBQRl9LRVlfVjIJCTIKKyNkZWZpbmUgUEZLRVlWMl9SRVZJU0lPTgkxOTk4MDZMCisKK3N0cnVjdCBzYWRiX21zZyB7CisJX191OAkJc2FkYl9tc2dfdmVyc2lvbjsKKwlfX3U4CQlzYWRiX21zZ190eXBlOworCV9fdTgJCXNhZGJfbXNnX2Vycm5vOworCV9fdTgJCXNhZGJfbXNnX3NhdHlwZTsKKwlfX3UxNglzYWRiX21zZ19sZW47CisJX191MTYJc2FkYl9tc2dfcmVzZXJ2ZWQ7CisJX191MzIJc2FkYl9tc2dfc2VxOworCV9fdTMyCXNhZGJfbXNnX3BpZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisvKiBzaXplb2Yoc3RydWN0IHNhZGJfbXNnKSA9PSAxNiAqLworCitzdHJ1Y3Qgc2FkYl9leHQgeworCV9fdTE2CXNhZGJfZXh0X2xlbjsKKwlfX3UxNglzYWRiX2V4dF90eXBlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl9leHQpID09IDQgKi8KKworc3RydWN0IHNhZGJfc2EgeworCV9fdTE2CXNhZGJfc2FfbGVuOworCV9fdTE2CXNhZGJfc2FfZXh0dHlwZTsKKwlfX2JlMzIJCXNhZGJfc2Ffc3BpOworCV9fdTgJCXNhZGJfc2FfcmVwbGF5OworCV9fdTgJCXNhZGJfc2Ffc3RhdGU7CisJX191OAkJc2FkYl9zYV9hdXRoOworCV9fdTgJCXNhZGJfc2FfZW5jcnlwdDsKKwlfX3UzMglzYWRiX3NhX2ZsYWdzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl9zYSkgPT0gMTYgKi8KKworc3RydWN0IHNhZGJfbGlmZXRpbWUgeworCV9fdTE2CXNhZGJfbGlmZXRpbWVfbGVuOworCV9fdTE2CXNhZGJfbGlmZXRpbWVfZXh0dHlwZTsKKwlfX3UzMglzYWRiX2xpZmV0aW1lX2FsbG9jYXRpb25zOworCV9fdTY0CXNhZGJfbGlmZXRpbWVfYnl0ZXM7CisJX191NjQJc2FkYl9saWZldGltZV9hZGR0aW1lOworCV9fdTY0CXNhZGJfbGlmZXRpbWVfdXNldGltZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisvKiBzaXplb2Yoc3RydWN0IHNhZGJfbGlmZXRpbWUpID09IDMyICovCisKK3N0cnVjdCBzYWRiX2FkZHJlc3MgeworCV9fdTE2CXNhZGJfYWRkcmVzc19sZW47CisJX191MTYJc2FkYl9hZGRyZXNzX2V4dHR5cGU7CisJX191OAkJc2FkYl9hZGRyZXNzX3Byb3RvOworCV9fdTgJCXNhZGJfYWRkcmVzc19wcmVmaXhsZW47CisJX191MTYJc2FkYl9hZGRyZXNzX3Jlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl9hZGRyZXNzKSA9PSA4ICovCisKK3N0cnVjdCBzYWRiX2tleSB7CisJX191MTYJc2FkYl9rZXlfbGVuOworCV9fdTE2CXNhZGJfa2V5X2V4dHR5cGU7CisJX191MTYJc2FkYl9rZXlfYml0czsKKwlfX3UxNglzYWRiX2tleV9yZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisvKiBzaXplb2Yoc3RydWN0IHNhZGJfa2V5KSA9PSA4ICovCisKK3N0cnVjdCBzYWRiX2lkZW50IHsKKwlfX3UxNglzYWRiX2lkZW50X2xlbjsKKwlfX3UxNglzYWRiX2lkZW50X2V4dHR5cGU7CisJX191MTYJc2FkYl9pZGVudF90eXBlOworCV9fdTE2CXNhZGJfaWRlbnRfcmVzZXJ2ZWQ7CisJX191NjQJc2FkYl9pZGVudF9pZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisvKiBzaXplb2Yoc3RydWN0IHNhZGJfaWRlbnQpID09IDE2ICovCisKK3N0cnVjdCBzYWRiX3NlbnMgeworCV9fdTE2CXNhZGJfc2Vuc19sZW47CisJX191MTYJc2FkYl9zZW5zX2V4dHR5cGU7CisJX191MzIJc2FkYl9zZW5zX2RwZDsKKwlfX3U4CQlzYWRiX3NlbnNfc2Vuc19sZXZlbDsKKwlfX3U4CQlzYWRiX3NlbnNfc2Vuc19sZW47CisJX191OAkJc2FkYl9zZW5zX2ludGVnX2xldmVsOworCV9fdTgJCXNhZGJfc2Vuc19pbnRlZ19sZW47CisJX191MzIJc2FkYl9zZW5zX3Jlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl9zZW5zKSA9PSAxNiAqLworCisvKiBmb2xsb3dlZCBieToKKwlfX3U2NAlzYWRiX3NlbnNfYml0bWFwW3NlbnNfbGVuXTsKKwlfX3U2NAlzYWRiX2ludGVnX2JpdG1hcFtpbnRlZ19sZW5dOyAgKi8KKworc3RydWN0IHNhZGJfcHJvcCB7CisJX191MTYJc2FkYl9wcm9wX2xlbjsKKwlfX3UxNglzYWRiX3Byb3BfZXh0dHlwZTsKKwlfX3U4CQlzYWRiX3Byb3BfcmVwbGF5OworCV9fdTgJCXNhZGJfcHJvcF9yZXNlcnZlZFszXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisvKiBzaXplb2Yoc3RydWN0IHNhZGJfcHJvcCkgPT0gOCAqLworCisvKiBmb2xsb3dlZCBieToKKwlzdHJ1Y3Qgc2FkYl9jb21iIHNhZGJfY29tYnNbKHNhZGJfcHJvcF9sZW4gKworCQlzaXplb2YoX191NjQpIC0gc2l6ZW9mKHN0cnVjdCBzYWRiX3Byb3ApKSAvCisJCXNpemVvZihzdHJ1Y3Qgc2FkYl9jb21iKV07ICovCisKK3N0cnVjdCBzYWRiX2NvbWIgeworCV9fdTgJCXNhZGJfY29tYl9hdXRoOworCV9fdTgJCXNhZGJfY29tYl9lbmNyeXB0OworCV9fdTE2CXNhZGJfY29tYl9mbGFnczsKKwlfX3UxNglzYWRiX2NvbWJfYXV0aF9taW5iaXRzOworCV9fdTE2CXNhZGJfY29tYl9hdXRoX21heGJpdHM7CisJX191MTYJc2FkYl9jb21iX2VuY3J5cHRfbWluYml0czsKKwlfX3UxNglzYWRiX2NvbWJfZW5jcnlwdF9tYXhiaXRzOworCV9fdTMyCXNhZGJfY29tYl9yZXNlcnZlZDsKKwlfX3UzMglzYWRiX2NvbWJfc29mdF9hbGxvY2F0aW9uczsKKwlfX3UzMglzYWRiX2NvbWJfaGFyZF9hbGxvY2F0aW9uczsKKwlfX3U2NAlzYWRiX2NvbWJfc29mdF9ieXRlczsKKwlfX3U2NAlzYWRiX2NvbWJfaGFyZF9ieXRlczsKKwlfX3U2NAlzYWRiX2NvbWJfc29mdF9hZGR0aW1lOworCV9fdTY0CXNhZGJfY29tYl9oYXJkX2FkZHRpbWU7CisJX191NjQJc2FkYl9jb21iX3NvZnRfdXNldGltZTsKKwlfX3U2NAlzYWRiX2NvbWJfaGFyZF91c2V0aW1lOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl9jb21iKSA9PSA3MiAqLworCitzdHJ1Y3Qgc2FkYl9zdXBwb3J0ZWQgeworCV9fdTE2CXNhZGJfc3VwcG9ydGVkX2xlbjsKKwlfX3UxNglzYWRiX3N1cHBvcnRlZF9leHR0eXBlOworCV9fdTMyCXNhZGJfc3VwcG9ydGVkX3Jlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl9zdXBwb3J0ZWQpID09IDggKi8KKworLyogZm9sbG93ZWQgYnk6CisJc3RydWN0IHNhZGJfYWxnIHNhZGJfYWxnc1soc2FkYl9zdXBwb3J0ZWRfbGVuICsKKwkJc2l6ZW9mKF9fdTY0KSAtIHNpemVvZihzdHJ1Y3Qgc2FkYl9zdXBwb3J0ZWQpKSAvCisJCXNpemVvZihzdHJ1Y3Qgc2FkYl9hbGcpXTsgKi8KKworc3RydWN0IHNhZGJfYWxnIHsKKwlfX3U4CQlzYWRiX2FsZ19pZDsKKwlfX3U4CQlzYWRiX2FsZ19pdmxlbjsKKwlfX3UxNglzYWRiX2FsZ19taW5iaXRzOworCV9fdTE2CXNhZGJfYWxnX21heGJpdHM7CisJX191MTYJc2FkYl9hbGdfcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX2FsZykgPT0gOCAqLworCitzdHJ1Y3Qgc2FkYl9zcGlyYW5nZSB7CisJX191MTYJc2FkYl9zcGlyYW5nZV9sZW47CisJX191MTYJc2FkYl9zcGlyYW5nZV9leHR0eXBlOworCV9fdTMyCXNhZGJfc3BpcmFuZ2VfbWluOworCV9fdTMyCXNhZGJfc3BpcmFuZ2VfbWF4OworCV9fdTMyCXNhZGJfc3BpcmFuZ2VfcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX3NwaXJhbmdlKSA9PSAxNiAqLworCitzdHJ1Y3Qgc2FkYl94X2ttcHJpdmF0ZSB7CisJX191MTYJc2FkYl94X2ttcHJpdmF0ZV9sZW47CisJX191MTYJc2FkYl94X2ttcHJpdmF0ZV9leHR0eXBlOworCV9fdTMyCXNhZGJfeF9rbXByaXZhdGVfcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX3hfa21wcml2YXRlKSA9PSA4ICovCisKK3N0cnVjdCBzYWRiX3hfc2EyIHsKKwlfX3UxNglzYWRiX3hfc2EyX2xlbjsKKwlfX3UxNglzYWRiX3hfc2EyX2V4dHR5cGU7CisJX191OAkJc2FkYl94X3NhMl9tb2RlOworCV9fdTgJCXNhZGJfeF9zYTJfcmVzZXJ2ZWQxOworCV9fdTE2CXNhZGJfeF9zYTJfcmVzZXJ2ZWQyOworCV9fdTMyCXNhZGJfeF9zYTJfc2VxdWVuY2U7CisJX191MzIJc2FkYl94X3NhMl9yZXFpZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisvKiBzaXplb2Yoc3RydWN0IHNhZGJfeF9zYTIpID09IDE2ICovCisKK3N0cnVjdCBzYWRiX3hfcG9saWN5IHsKKwlfX3UxNglzYWRiX3hfcG9saWN5X2xlbjsKKwlfX3UxNglzYWRiX3hfcG9saWN5X2V4dHR5cGU7CisJX191MTYJc2FkYl94X3BvbGljeV90eXBlOworCV9fdTgJCXNhZGJfeF9wb2xpY3lfZGlyOworCV9fdTgJCXNhZGJfeF9wb2xpY3lfcmVzZXJ2ZWQ7CisJX191MzIJc2FkYl94X3BvbGljeV9pZDsKKwlfX3UzMglzYWRiX3hfcG9saWN5X3ByaW9yaXR5OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl94X3BvbGljeSkgPT0gMTYgKi8KKworc3RydWN0IHNhZGJfeF9pcHNlY3JlcXVlc3QgeworCV9fdTE2CXNhZGJfeF9pcHNlY3JlcXVlc3RfbGVuOworCV9fdTE2CXNhZGJfeF9pcHNlY3JlcXVlc3RfcHJvdG87CisJX191OAkJc2FkYl94X2lwc2VjcmVxdWVzdF9tb2RlOworCV9fdTgJCXNhZGJfeF9pcHNlY3JlcXVlc3RfbGV2ZWw7CisJX191MTYJc2FkYl94X2lwc2VjcmVxdWVzdF9yZXNlcnZlZDE7CisJX191MzIJc2FkYl94X2lwc2VjcmVxdWVzdF9yZXFpZDsKKwlfX3UzMglzYWRiX3hfaXBzZWNyZXF1ZXN0X3Jlc2VydmVkMjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisvKiBzaXplb2Yoc3RydWN0IHNhZGJfeF9pcHNlY3JlcXVlc3QpID09IDE2ICovCisKKy8qIFRoaXMgZGVmaW5lcyB0aGUgVFlQRSBvZiBOYXQgVHJhdmVyc2FsIGluIHVzZS4gIEN1cnJlbnRseSBvbmx5IG9uZQorICogdHlwZSBvZiBOQVQtVCBpcyBzdXBwb3J0ZWQsIGRyYWZ0LWlldGYtaXBzZWMtdWRwLWVuY2Fwcy0wNgorICovCitzdHJ1Y3Qgc2FkYl94X25hdF90X3R5cGUgeworCV9fdTE2CXNhZGJfeF9uYXRfdF90eXBlX2xlbjsKKwlfX3UxNglzYWRiX3hfbmF0X3RfdHlwZV9leHR0eXBlOworCV9fdTgJCXNhZGJfeF9uYXRfdF90eXBlX3R5cGU7CisJX191OAkJc2FkYl94X25hdF90X3R5cGVfcmVzZXJ2ZWRbM107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX3hfbmF0X3RfdHlwZSkgPT0gOCAqLworCisvKiBQYXNzIGEgTkFUIFRyYXZlcnNhbCBwb3J0IChTb3VyY2Ugb3IgRGVzdCBwb3J0KSAqLworc3RydWN0IHNhZGJfeF9uYXRfdF9wb3J0IHsKKwlfX3UxNglzYWRiX3hfbmF0X3RfcG9ydF9sZW47CisJX191MTYJc2FkYl94X25hdF90X3BvcnRfZXh0dHlwZTsKKwlfX2JlMTYJCXNhZGJfeF9uYXRfdF9wb3J0X3BvcnQ7CisJX191MTYJc2FkYl94X25hdF90X3BvcnRfcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX3hfbmF0X3RfcG9ydCkgPT0gOCAqLworCisvKiBHZW5lcmljIExTTSBzZWN1cml0eSBjb250ZXh0ICovCitzdHJ1Y3Qgc2FkYl94X3NlY19jdHggeworCV9fdTE2CXNhZGJfeF9zZWNfbGVuOworCV9fdTE2CXNhZGJfeF9zZWNfZXh0dHlwZTsKKwlfX3U4CQlzYWRiX3hfY3R4X2FsZzsgIC8qIExTTXM6IGUuZy4sIHNlbGludXggPT0gMSAqLworCV9fdTgJCXNhZGJfeF9jdHhfZG9pOworCV9fdTE2CXNhZGJfeF9jdHhfbGVuOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl9zZWNfY3R4KSA9IDggKi8KKworLyogVXNlZCBieSBNSUdSQVRFIHRvIHBhc3MgYWRkcmVzc2VzIElLRSB3aWxsIHVzZSB0byBwZXJmb3JtCisgKiBuZWdvdGlhdGlvbiB3aXRoIHRoZSBwZWVyICovCitzdHJ1Y3Qgc2FkYl94X2ttYWRkcmVzcyB7CisJX191MTYJc2FkYl94X2ttYWRkcmVzc19sZW47CisJX191MTYJc2FkYl94X2ttYWRkcmVzc19leHR0eXBlOworCV9fdTMyCXNhZGJfeF9rbWFkZHJlc3NfcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX3hfa21hZGRyZXNzKSA9PSA4ICovCisKKy8qIE1lc3NhZ2UgdHlwZXMgKi8KKyNkZWZpbmUgU0FEQl9SRVNFUlZFRAkJMAorI2RlZmluZSBTQURCX0dFVFNQSQkJMQorI2RlZmluZSBTQURCX1VQREFURQkJMgorI2RlZmluZSBTQURCX0FERAkJMworI2RlZmluZSBTQURCX0RFTEVURQkJNAorI2RlZmluZSBTQURCX0dFVAkJNQorI2RlZmluZSBTQURCX0FDUVVJUkUJCTYKKyNkZWZpbmUgU0FEQl9SRUdJU1RFUgkJNworI2RlZmluZSBTQURCX0VYUElSRQkJOAorI2RlZmluZSBTQURCX0ZMVVNICQk5CisjZGVmaW5lIFNBREJfRFVNUAkJMTAKKyNkZWZpbmUgU0FEQl9YX1BST01JU0MJCTExCisjZGVmaW5lIFNBREJfWF9QQ0hBTkdFCQkxMgorI2RlZmluZSBTQURCX1hfU1BEVVBEQVRFCTEzCisjZGVmaW5lIFNBREJfWF9TUERBREQJCTE0CisjZGVmaW5lIFNBREJfWF9TUERERUxFVEUJMTUKKyNkZWZpbmUgU0FEQl9YX1NQREdFVAkJMTYKKyNkZWZpbmUgU0FEQl9YX1NQREFDUVVJUkUJMTcKKyNkZWZpbmUgU0FEQl9YX1NQRERVTVAJCTE4CisjZGVmaW5lIFNBREJfWF9TUERGTFVTSAkJMTkKKyNkZWZpbmUgU0FEQl9YX1NQRFNFVElEWAkyMAorI2RlZmluZSBTQURCX1hfU1BERVhQSVJFCTIxCisjZGVmaW5lIFNBREJfWF9TUERERUxFVEUyCTIyCisjZGVmaW5lIFNBREJfWF9OQVRfVF9ORVdfTUFQUElORwkyMworI2RlZmluZSBTQURCX1hfTUlHUkFURQkJMjQKKyNkZWZpbmUgU0FEQl9NQVgJCTI0CisKKy8qIFNlY3VyaXR5IEFzc29jaWF0aW9uIGZsYWdzICovCisjZGVmaW5lIFNBREJfU0FGTEFHU19QRlMJMQorI2RlZmluZSBTQURCX1NBRkxBR1NfTk9QTVRVRElTQwkweDIwMDAwMDAwCisjZGVmaW5lIFNBREJfU0FGTEFHU19ERUNBUF9EU0NQCTB4NDAwMDAwMDAKKyNkZWZpbmUgU0FEQl9TQUZMQUdTX05PRUNOCTB4ODAwMDAwMDAKKworLyogU2VjdXJpdHkgQXNzb2NpYXRpb24gc3RhdGVzICovCisjZGVmaW5lIFNBREJfU0FTVEFURV9MQVJWQUwJMAorI2RlZmluZSBTQURCX1NBU1RBVEVfTUFUVVJFCTEKKyNkZWZpbmUgU0FEQl9TQVNUQVRFX0RZSU5HCTIKKyNkZWZpbmUgU0FEQl9TQVNUQVRFX0RFQUQJMworI2RlZmluZSBTQURCX1NBU1RBVEVfTUFYCTMKKworLyogU2VjdXJpdHkgQXNzb2NpYXRpb24gdHlwZXMgKi8KKyNkZWZpbmUgU0FEQl9TQVRZUEVfVU5TUEVDCTAKKyNkZWZpbmUgU0FEQl9TQVRZUEVfQUgJCTIKKyNkZWZpbmUgU0FEQl9TQVRZUEVfRVNQCQkzCisjZGVmaW5lIFNBREJfU0FUWVBFX1JTVlAJNQorI2RlZmluZSBTQURCX1NBVFlQRV9PU1BGVjIJNgorI2RlZmluZSBTQURCX1NBVFlQRV9SSVBWMgk3CisjZGVmaW5lIFNBREJfU0FUWVBFX01JUAkJOAorI2RlZmluZSBTQURCX1hfU0FUWVBFX0lQQ09NUAk5CisjZGVmaW5lIFNBREJfU0FUWVBFX01BWAkJOQorCisvKiBBdXRoZW50aWNhdGlvbiBhbGdvcml0aG1zICovCisjZGVmaW5lIFNBREJfQUFMR19OT05FCQkJMAorI2RlZmluZSBTQURCX0FBTEdfTUQ1SE1BQwkJMgorI2RlZmluZSBTQURCX0FBTEdfU0hBMUhNQUMJCTMKKyNkZWZpbmUgU0FEQl9YX0FBTEdfU0hBMl8yNTZITUFDCTUKKyNkZWZpbmUgU0FEQl9YX0FBTEdfU0hBMl8zODRITUFDCTYKKyNkZWZpbmUgU0FEQl9YX0FBTEdfU0hBMl81MTJITUFDCTcKKyNkZWZpbmUgU0FEQl9YX0FBTEdfUklQRU1EMTYwSE1BQwk4CisjZGVmaW5lIFNBREJfWF9BQUxHX0FFU19YQ0JDX01BQwk5CisjZGVmaW5lIFNBREJfWF9BQUxHX05VTEwJCTI1MQkvKiBrYW1lICovCisjZGVmaW5lIFNBREJfQUFMR19NQVgJCQkyNTEKKworLyogRW5jcnlwdGlvbiBhbGdvcml0aG1zICovCisjZGVmaW5lIFNBREJfRUFMR19OT05FCQkJMAorI2RlZmluZSBTQURCX0VBTEdfREVTQ0JDCQkyCisjZGVmaW5lIFNBREJfRUFMR18zREVTQ0JDCQkzCisjZGVmaW5lIFNBREJfWF9FQUxHX0NBU1RDQkMJCTYKKyNkZWZpbmUgU0FEQl9YX0VBTEdfQkxPV0ZJU0hDQkMJCTcKKyNkZWZpbmUgU0FEQl9FQUxHX05VTEwJCQkxMQorI2RlZmluZSBTQURCX1hfRUFMR19BRVNDQkMJCTEyCisjZGVmaW5lIFNBREJfWF9FQUxHX0FFU0NUUgkJMTMKKyNkZWZpbmUgU0FEQl9YX0VBTEdfQUVTX0NDTV9JQ1Y4CTE0CisjZGVmaW5lIFNBREJfWF9FQUxHX0FFU19DQ01fSUNWMTIJMTUKKyNkZWZpbmUgU0FEQl9YX0VBTEdfQUVTX0NDTV9JQ1YxNgkxNgorI2RlZmluZSBTQURCX1hfRUFMR19BRVNfR0NNX0lDVjgJMTgKKyNkZWZpbmUgU0FEQl9YX0VBTEdfQUVTX0dDTV9JQ1YxMgkxOQorI2RlZmluZSBTQURCX1hfRUFMR19BRVNfR0NNX0lDVjE2CTIwCisjZGVmaW5lIFNBREJfWF9FQUxHX0NBTUVMTElBQ0JDCQkyMgorI2RlZmluZSBTQURCX1hfRUFMR19OVUxMX0FFU19HTUFDCTIzCisjZGVmaW5lIFNBREJfRUFMR19NQVggICAgICAgICAgICAgICAgICAgMjUzIC8qIGxhc3QgRUFMRyAqLworLyogcHJpdmF0ZSBhbGxvY2F0aW9ucyBzaG91bGQgdXNlIDI0OS0yNTUgKFJGQzI0MDcpICovCisjZGVmaW5lIFNBREJfWF9FQUxHX1NFUlBFTlRDQkMgIDI1MiAgICAgLyogZHJhZnQtaWV0Zi1pcHNlYy1jaXBoLWFlcy1jYmMtMDAgKi8KKyNkZWZpbmUgU0FEQl9YX0VBTEdfVFdPRklTSENCQyAgMjUzICAgICAvKiBkcmFmdC1pZXRmLWlwc2VjLWNpcGgtYWVzLWNiYy0wMCAqLworCisvKiBDb21wcmVzc2lvbiBhbGdvcml0aG1zICovCisjZGVmaW5lIFNBREJfWF9DQUxHX05PTkUJCTAKKyNkZWZpbmUgU0FEQl9YX0NBTEdfT1VJCQkJMQorI2RlZmluZSBTQURCX1hfQ0FMR19ERUZMQVRFCQkyCisjZGVmaW5lIFNBREJfWF9DQUxHX0xaUwkJCTMKKyNkZWZpbmUgU0FEQl9YX0NBTEdfTFpKSAkJNAorI2RlZmluZSBTQURCX1hfQ0FMR19NQVgJCQk0CisKKy8qIEV4dGVuc2lvbiBIZWFkZXIgdmFsdWVzICovCisjZGVmaW5lIFNBREJfRVhUX1JFU0VSVkVECQkwCisjZGVmaW5lIFNBREJfRVhUX1NBCQkJMQorI2RlZmluZSBTQURCX0VYVF9MSUZFVElNRV9DVVJSRU5UCTIKKyNkZWZpbmUgU0FEQl9FWFRfTElGRVRJTUVfSEFSRAkJMworI2RlZmluZSBTQURCX0VYVF9MSUZFVElNRV9TT0ZUCQk0CisjZGVmaW5lIFNBREJfRVhUX0FERFJFU1NfU1JDCQk1CisjZGVmaW5lIFNBREJfRVhUX0FERFJFU1NfRFNUCQk2CisjZGVmaW5lIFNBREJfRVhUX0FERFJFU1NfUFJPWFkJCTcKKyNkZWZpbmUgU0FEQl9FWFRfS0VZX0FVVEgJCTgKKyNkZWZpbmUgU0FEQl9FWFRfS0VZX0VOQ1JZUFQJCTkKKyNkZWZpbmUgU0FEQl9FWFRfSURFTlRJVFlfU1JDCQkxMAorI2RlZmluZSBTQURCX0VYVF9JREVOVElUWV9EU1QJCTExCisjZGVmaW5lIFNBREJfRVhUX1NFTlNJVElWSVRZCQkxMgorI2RlZmluZSBTQURCX0VYVF9QUk9QT1NBTAkJMTMKKyNkZWZpbmUgU0FEQl9FWFRfU1VQUE9SVEVEX0FVVEgJCTE0CisjZGVmaW5lIFNBREJfRVhUX1NVUFBPUlRFRF9FTkNSWVBUCTE1CisjZGVmaW5lIFNBREJfRVhUX1NQSVJBTkdFCQkxNgorI2RlZmluZSBTQURCX1hfRVhUX0tNUFJJVkFURQkJMTcKKyNkZWZpbmUgU0FEQl9YX0VYVF9QT0xJQ1kJCTE4CisjZGVmaW5lIFNBREJfWF9FWFRfU0EyCQkJMTkKKy8qIFRoZSBuZXh0IGZvdXIgZW50cmllcyBhcmUgZm9yIHNldHRpbmcgdXAgTkFUIFRyYXZlcnNhbCAqLworI2RlZmluZSBTQURCX1hfRVhUX05BVF9UX1RZUEUJCTIwCisjZGVmaW5lIFNBREJfWF9FWFRfTkFUX1RfU1BPUlQJCTIxCisjZGVmaW5lIFNBREJfWF9FWFRfTkFUX1RfRFBPUlQJCTIyCisjZGVmaW5lIFNBREJfWF9FWFRfTkFUX1RfT0EJCTIzCisjZGVmaW5lIFNBREJfWF9FWFRfU0VDX0NUWAkJMjQKKy8qIFVzZWQgd2l0aCBNSUdSQVRFIHRvIHBhc3MgQCB0byBJS0UgZm9yIG5lZ290aWF0aW9uICovCisjZGVmaW5lIFNBREJfWF9FWFRfS01BRERSRVNTCQkyNQorI2RlZmluZSBTQURCX0VYVF9NQVgJCQkyNQorCisvKiBJZGVudGl0eSBFeHRlbnNpb24gdmFsdWVzICovCisjZGVmaW5lIFNBREJfSURFTlRUWVBFX1JFU0VSVkVECTAKKyNkZWZpbmUgU0FEQl9JREVOVFRZUEVfUFJFRklYCTEKKyNkZWZpbmUgU0FEQl9JREVOVFRZUEVfRlFETgkyCisjZGVmaW5lIFNBREJfSURFTlRUWVBFX1VTRVJGUUROCTMKKyNkZWZpbmUgU0FEQl9JREVOVFRZUEVfTUFYCTMKKworI2VuZGlmIC8qICEoX0xJTlVYX1BGS0VZMl9IKSAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOTk0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BnLmgKQEAgLTAsMCArMSw2MyBAQAorLyogCXBnLmggKGMpIDE5OTggIEdyYW50IFIuIEd1ZW50aGVyIDxncmFudEB0b3JxdWUubmV0PgorIAkJICAgICAgIFVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKworCisJcGcuaCBkZWZpbmVzIHRoZSB1c2VyIGludGVyZmFjZSB0byB0aGUgZ2VuZXJpYyBBVEFQSSBwYWNrZXQKKyAgICAgICAgY29tbWFuZCBkcml2ZXIgZm9yIHBhcmFsbGVsIHBvcnQgQVRBUEkgZGV2aWNlcyAocGcpLiBUaGUKKwlkcml2ZXIgaXMgbG9vc2VseSBtb2RlbGxlZCBhZnRlciB0aGUgZ2VuZXJpYyBTQ1NJIGRyaXZlciwgc2csCisJYWx0aG91Z2ggdGhlIGFjdHVhbCBpbnRlcmZhY2UgaXMgZGlmZmVyZW50LgorCisJVGhlIHBnIGRyaXZlciBwcm92aWRlcyBhIHNpbXBsZSBjaGFyYWN0ZXIgZGV2aWNlIGludGVyZmFjZSBmb3IKKyAgICAgICAgc2VuZGluZyBBVEFQSSBjb21tYW5kcyB0byBhIGRldmljZS4gIFdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUKKwlBVEFQSSByZXNldCBvcGVyYXRpb24sIGFsbCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgYnkgYSBwYWlyCisgICAgICAgIG9mIHJlYWQgYW5kIHdyaXRlIG9wZXJhdGlvbnMgdG8gdGhlIGFwcHJvcHJpYXRlIC9kZXYvcGdOIGRldmljZS4KKwlBIHdyaXRlIG9wZXJhdGlvbiBkZWxpdmVycyBhIGNvbW1hbmQgYW5kIGFueSBvdXRib3VuZCBkYXRhIGluCisgICAgICAgIGEgc2luZ2xlIGJ1ZmZlci4gIE5vcm1hbGx5LCB0aGUgd3JpdGUgd2lsbCBzdWNjZWVkIHVubGVzcyB0aGUKKyAgICAgICAgZGV2aWNlIGlzIG9mZmxpbmUgb3IgbWFsZnVuY3Rpb25pbmcsIG9yIHRoZXJlIGlzIGFscmVhZHkgYW5vdGhlcgorCWNvbW1hbmQgcGVuZGluZy4gIElmIHRoZSB3cml0ZSBzdWNjZWVkcywgaXQgc2hvdWxkIGJlIGZvbGxvd2VkCisgICAgICAgIGltbWVkaWF0ZWx5IGJ5IGEgcmVhZCBvcGVyYXRpb24sIHRvIG9idGFpbiBhbnkgcmV0dXJuZWQgZGF0YSBhbmQKKyAgICAgICAgc3RhdHVzIGluZm9ybWF0aW9uLiAgQSByZWFkIHdpbGwgZmFpbCBpZiB0aGVyZSBpcyBubyBvcGVyYXRpb24KKyAgICAgICAgaW4gcHJvZ3Jlc3MuCisKKwlBcyBhIHNwZWNpYWwgY2FzZSwgdGhlIGRldmljZSBjYW4gYmUgcmVzZXQgd2l0aCBhIHdyaXRlIG9wZXJhdGlvbiwKKyAgICAgICAgYW5kIGluIHRoaXMgY2FzZSwgbm8gZm9sbG93aW5nIHJlYWQgaXMgZXhwZWN0ZWQsIG9yIHBlcm1pdHRlZC4KKworCVRoZXJlIGFyZSBubyBpb2N0bCgpIG9wZXJhdGlvbnMuICBBbnkgc2luZ2xlIG9wZXJhdGlvbgorCW1heSB0cmFuc2ZlciBhdCBtb3N0IFBHX01BWF9EQVRBIGJ5dGVzLiAgTm90ZSB0aGF0IHRoZSBkcml2ZXIgbXVzdAorICAgICAgICBjb3B5IHRoZSBkYXRhIHRocm91Z2ggYW4gaW50ZXJuYWwgYnVmZmVyLiAgSW4ga2VlcGluZyB3aXRoIGFsbAorCWN1cnJlbnQgQVRBUEkgZGV2aWNlcywgY29tbWFuZCBwYWNrZXRzIGFyZSBhc3N1bWVkIHRvIGJlIGV4YWN0bHkKKwkxMiBieXRlcyBpbiBsZW5ndGguCisKKwlUbyBwZXJtaXQgZnV0dXJlIGNoYW5nZXMgdG8gdGhpcyBpbnRlcmZhY2UsIHRoZSBoZWFkZXJzIGluIHRoZQorCXJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMgY29udGFpbiBhIHNpbmdsZSBjaGFyYWN0ZXIgIm1hZ2ljIiBmbGFnLgorICAgICAgICBDdXJyZW50bHkgdGhpcyBmbGFnIG11c3QgYmUgdGhlIGNoYXJhY3RlciAiUCIuCisKKyovCisKKyNkZWZpbmUgUEdfTUFHSUMJJ1AnCisjZGVmaW5lIFBHX1JFU0VUCSdaJworI2RlZmluZSBQR19DT01NQU5ECSdDJworCisjZGVmaW5lIFBHX01BWF9EQVRBCTMyNzY4CisKK3N0cnVjdCBwZ193cml0ZV9oZHIgeworCisJY2hhcgltYWdpYzsJCS8qID09IFBHX01BR0lDICovCisJY2hhcglmdW5jOwkJLyogUEdfUkVTRVQgb3IgUEdfQ09NTUFORCAqLworCWludCAgICAgZGxlbjsJCS8qIG51bWJlciBvZiBieXRlcyBleHBlY3RlZCB0byB0cmFuc2ZlciAqLworCWludCAgICAgdGltZW91dDsJLyogbnVtYmVyIG9mIHNlY29uZHMgYmVmb3JlIHRpbWVvdXQgKi8KKwljaGFyCXBhY2tldFsxMl07CS8qIHBhY2tldCBjb21tYW5kICovCisKK307CisKK3N0cnVjdCBwZ19yZWFkX2hkciB7CisKKwljaGFyCW1hZ2ljOwkJLyogPT0gUEdfTUFHSUMgKi8KKwljaGFyCXNjc2k7CQkvKiAic2NzaSIgc3RhdHVzID09IHNlbnNlIGtleSAqLworCWludAlkbGVuOwkJLyogc2l6ZSBvZiBkZXZpY2UgdHJhbnNmZXIgcmVxdWVzdCAqLworCWludCAgICAgZHVyYXRpb247CS8qIHRpbWUgaW4gc2Vjb25kcyBjb21tYW5kIHRvb2sgKi8KKwljaGFyICAgIHBhZFsxMl07CS8qIG5vdCB1c2VkICovCisKK307CisKKy8qIGVuZCBvZiBwZy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BoYW50b20uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGhhbnRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZGQ2NjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BoYW50b20uaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IEppcmkgU2xhYnkgPGppcmlzbGFieUBnbWFpbC5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX1BIQU5UT01fSAorI2RlZmluZSBfX1BIQU5UT01fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogUEhOXyhHL1MpRVRfUkVHIHBhcmFtICovCitzdHJ1Y3QgcGhtX3JlZyB7CisJX191MzIgcmVnOworCV9fdTMyIHZhbHVlOworfTsKKworLyogUEhOXyhHL1MpRVRfUkVHUyBwYXJhbSAqLworc3RydWN0IHBobV9yZWdzIHsKKwlfX3UzMiBjb3VudDsKKwlfX3UzMiBtYXNrOworCV9fdTMyIHZhbHVlc1s4XTsKK307CisKKyNkZWZpbmUgUEhfSU9DX01BR0lDCQkncCcKKyNkZWZpbmUgUEhOX0dFVF9SRUcJCV9JT1dSKFBIX0lPQ19NQUdJQywgMCwgc3RydWN0IHBobV9yZWcgKikKKyNkZWZpbmUgUEhOX1NFVF9SRUcJCV9JT1coUEhfSU9DX01BR0lDLCAxLCBzdHJ1Y3QgcGhtX3JlZyAqKQorI2RlZmluZSBQSE5fR0VUX1JFR1MJCV9JT1dSKFBIX0lPQ19NQUdJQywgMiwgc3RydWN0IHBobV9yZWdzICopCisjZGVmaW5lIFBITl9TRVRfUkVHUwkJX0lPVyhQSF9JT0NfTUFHSUMsIDMsIHN0cnVjdCBwaG1fcmVncyAqKQorLyogdGhpcyBpb2N0bCB0ZWxscyB0aGUgZHJpdmVyLCB0aGF0IHRoZSBjYWxsZXIgaXMgbm90IE9wZW5IYXB0aWNzIGFuZCBtaWdodAorICogdXNlIGltcHJvdmVkIHJlZ2lzdGVycyB1cGRhdGUgKG5vIG1vcmUgcGhhbnRvbSBzd2l0Y2hvZmZzIHdoZW4gdXNpbmcKKyAqIGxpYnBoYW50b20pICovCisjZGVmaW5lIFBITl9OT1RfT0gJCV9JTyhQSF9JT0NfTUFHSUMsIDQpCisjZGVmaW5lIFBITl9HRVRSRUcJCV9JT1dSKFBIX0lPQ19NQUdJQywgNSwgc3RydWN0IHBobV9yZWcpCisjZGVmaW5lIFBITl9TRVRSRUcJCV9JT1coUEhfSU9DX01BR0lDLCA2LCBzdHJ1Y3QgcGhtX3JlZykKKyNkZWZpbmUgUEhOX0dFVFJFR1MJCV9JT1dSKFBIX0lPQ19NQUdJQywgNywgc3RydWN0IHBobV9yZWdzKQorI2RlZmluZSBQSE5fU0VUUkVHUwkJX0lPVyhQSF9JT0NfTUFHSUMsIDgsIHN0cnVjdCBwaG1fcmVncykKKworI2RlZmluZSBQSE5fQ09OVFJPTAkJMHg2ICAgICAvKiBjb250cm9sIGJ5dGUgaW4gaWFkZHIgc3BhY2UgKi8KKyNkZWZpbmUgUEhOX0NUTF9BTVAJCTB4MSAgICAgLyogICBzd2l0Y2ggYWZ0ZXIgdG9ycXVlcyBjaGFuZ2UgKi8KKyNkZWZpbmUgUEhOX0NUTF9CVVQJCTB4MiAgICAgLyogICBpcyBidXR0b24gc3dpdGNoZWQgKi8KKyNkZWZpbmUgUEhOX0NUTF9JUlEJCTB4MTAgICAgLyogICBpcyBpcnEgZW5hYmxlZCAqLworCisjZGVmaW5lIFBITl9aRVJPX0ZPUkNFCQkyMDQ4CS8qIHplcm8gdG9ycXVlIG9uIG1vdG9yICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9waG9uZXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGhvbmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzYjIwYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGhvbmV0LmgKQEAgLTAsMCArMSwxODMgQEAKKy8qKgorICogZmlsZSBwaG9uZXQuaAorICoKKyAqIFBob25ldCBzb2NrZXRzIGtlcm5lbCBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgTElOVVhfUEhPTkVUX0gKKyNkZWZpbmUgTElOVVhfUEhPTkVUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisKKy8qIEF1dG9tYXRpYyBwcm90b2NvbCBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgUE5fUFJPVE9fVFJBTlNQT1JUCTAKKy8qIFBob25ldCBkYXRhZ3JhbSBzb2NrZXQgKi8KKyNkZWZpbmUgUE5fUFJPVE9fUEhPTkVUCQkxCisvKiBQaG9uZXQgcGlwZSAqLworI2RlZmluZSBQTl9QUk9UT19QSVBFCQkyCisjZGVmaW5lIFBIT05FVF9OUFJPVE8JCTMKKworLyogU29ja2V0IG9wdGlvbnMgZm9yIFNPTF9QTlBJUEUgbGV2ZWwgKi8KKyNkZWZpbmUgUE5QSVBFX0VOQ0FQCQkxCisjZGVmaW5lIFBOUElQRV9JRklOREVYCQkyCisjZGVmaW5lIFBOUElQRV9IQU5ETEUJCTMKKworI2RlZmluZSBQTkFERFJfQU5ZCQkwCisjZGVmaW5lIFBOQUREUl9CUk9BRENBU1QJMHhGQworI2RlZmluZSBQTlBPUlRfUkVTT1VSQ0VfUk9VVElORwkwCisKKy8qIFZhbHVlcyBmb3IgUE5QSVBFX0VOQ0FQIG9wdGlvbiAqLworI2RlZmluZSBQTlBJUEVfRU5DQVBfTk9ORQkwCisjZGVmaW5lIFBOUElQRV9FTkNBUF9JUAkJMQorCisvKiBpb2N0bHMgKi8KKyNkZWZpbmUgU0lPQ1BOR0VUT0JKRUNUCQkoU0lPQ1BST1RPUFJJVkFURSArIDApCisjZGVmaW5lIFNJT0NQTkFERFJFU09VUkNFCShTSU9DUFJPVE9QUklWQVRFICsgMTQpCisjZGVmaW5lIFNJT0NQTkRFTFJFU09VUkNFCShTSU9DUFJPVE9QUklWQVRFICsgMTUpCisKKy8qIFBob25ldCBwcm90b2NvbCBoZWFkZXIgKi8KK3N0cnVjdCBwaG9uZXRoZHIgeworCV9fdTgJcG5fcmRldjsKKwlfX3U4CXBuX3NkZXY7CisJX191OAlwbl9yZXM7CisJX19iZTE2CXBuX2xlbmd0aDsKKwlfX3U4CXBuX3JvYmo7CisJX191OAlwbl9zb2JqOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogQ29tbW9uIFBob25ldCBwYXlsb2FkIGhlYWRlciAqLworc3RydWN0IHBob25ldG1zZyB7CisJX191OAlwbl90cmFuc19pZDsJLyogdHJhbnNhY3Rpb24gSUQgKi8KKwlfX3U4CXBuX21zZ19pZDsJLyogbWVzc2FnZSB0eXBlICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191OAlwbl9zdWJtc2dfaWQ7CS8qIG1lc3NhZ2Ugc3VidHlwZSAqLworCQkJX191OAlwbl9kYXRhWzVdOworCQl9IGJhc2U7CisJCXN0cnVjdCB7CisJCQlfX3UxNglwbl9lX3Jlc19pZDsJLyogZXh0ZW5kZWQgcmVzb3VyY2UgSUQgKi8KKwkJCV9fdTgJcG5fZV9zdWJtc2dfaWQ7CS8qIG1lc3NhZ2Ugc3VidHlwZSAqLworCQkJX191OAlwbl9lX2RhdGFbM107CisJCX0gZXh0OworCX0gcG5fbXNnX3U7Cit9OworI2RlZmluZSBQTl9DT01NT05fTUVTU0FHRQkweEYwCisjZGVmaW5lIFBOX0NPTU1HUgkJMHgxMAorI2RlZmluZSBQTl9QUkVGSVgJCTB4RTAgLyogcmVzb3VyY2UgZm9yIGV4dGVuZGVkIG1lc3NhZ2VzICovCisjZGVmaW5lIHBuX3N1Ym1zZ19pZAkJcG5fbXNnX3UuYmFzZS5wbl9zdWJtc2dfaWQKKyNkZWZpbmUgcG5fZV9zdWJtc2dfaWQJCXBuX21zZ191LmV4dC5wbl9lX3N1Ym1zZ19pZAorI2RlZmluZSBwbl9lX3Jlc19pZAkJcG5fbXNnX3UuZXh0LnBuX2VfcmVzX2lkCisjZGVmaW5lIHBuX2RhdGEJCQlwbl9tc2dfdS5iYXNlLnBuX2RhdGEKKyNkZWZpbmUgcG5fZV9kYXRhCQlwbl9tc2dfdS5leHQucG5fZV9kYXRhCisKKy8qIGRhdGEgZm9yIHVucmVhY2hhYmxlIGVycm9ycyAqLworI2RlZmluZSBQTl9DT01NX1NFUlZJQ0VfTk9UX0lERU5USUZJRURfUkVTUAkweDAxCisjZGVmaW5lIFBOX0NPTU1fSVNBX0VOVElUWV9OT1RfUkVBQ0hBQkxFX1JFU1AJMHgxNAorI2RlZmluZSBwbl9vcmlnX21zZ19pZAkJcG5fZGF0YVswXQorI2RlZmluZSBwbl9zdGF0dXMJCXBuX2RhdGFbMV0KKyNkZWZpbmUgcG5fZV9vcmlnX21zZ19pZAlwbl9lX2RhdGFbMF0KKyNkZWZpbmUgcG5fZV9zdGF0dXMJCXBuX2VfZGF0YVsxXQorCisvKiBQaG9uZXQgc29ja2V0IGFkZHJlc3Mgc3RydWN0dXJlICovCitzdHJ1Y3Qgc29ja2FkZHJfcG4geworCV9fa2VybmVsX3NhX2ZhbWlseV90IHNwbl9mYW1pbHk7CisJX191OCBzcG5fb2JqOworCV9fdTggc3BuX2RldjsKKwlfX3U4IHNwbl9yZXNvdXJjZTsKKwlfX3U4IHNwbl96ZXJvW3NpemVvZihzdHJ1Y3Qgc29ja2FkZHIpIC0gc2l6ZW9mKF9fa2VybmVsX3NhX2ZhbWlseV90KSAtIDNdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogV2VsbCBrbm93biBhZGRyZXNzICovCisjZGVmaW5lIFBOX0RFVl9QQwkweDEwCisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTE2IHBuX29iamVjdChfX3U4IGFkZHIsIF9fdTE2IHBvcnQpCit7CisJcmV0dXJuIChhZGRyIDw8IDgpIHwgKHBvcnQgJiAweDNmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTggcG5fb2JqKF9fdTE2IGhhbmRsZSkKK3sKKwlyZXR1cm4gaGFuZGxlICYgMHhmZjsKK30KKworc3RhdGljIF9faW5saW5lX18gX191OCBwbl9kZXYoX191MTYgaGFuZGxlKQoreworCXJldHVybiBoYW5kbGUgPj4gODsKK30KKworc3RhdGljIF9faW5saW5lX18gX191MTYgcG5fcG9ydChfX3UxNiBoYW5kbGUpCit7CisJcmV0dXJuIGhhbmRsZSAmIDB4M2ZmOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX3U4IHBuX2FkZHIoX191MTYgaGFuZGxlKQoreworCXJldHVybiAoaGFuZGxlID4+IDgpICYgMHhmYzsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBwbl9zb2NrYWRkcl9zZXRfYWRkcihzdHJ1Y3Qgc29ja2FkZHJfcG4gKnNwbiwgX191OCBhZGRyKQoreworCXNwbi0+c3BuX2RldiAmPSAweDAzOworCXNwbi0+c3BuX2RldiB8PSBhZGRyICYgMHhmYzsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBwbl9zb2NrYWRkcl9zZXRfcG9ydChzdHJ1Y3Qgc29ja2FkZHJfcG4gKnNwbiwgX191MTYgcG9ydCkKK3sKKwlzcG4tPnNwbl9kZXYgJj0gMHhmYzsKKwlzcG4tPnNwbl9kZXYgfD0gKHBvcnQgPj4gOCkgJiAweDAzOworCXNwbi0+c3BuX29iaiA9IHBvcnQgJiAweGZmOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHBuX3NvY2thZGRyX3NldF9vYmplY3Qoc3RydWN0IHNvY2thZGRyX3BuICpzcG4sCisJCQkJCQlfX3UxNiBoYW5kbGUpCit7CisJc3BuLT5zcG5fZGV2ID0gcG5fZGV2KGhhbmRsZSk7CisJc3BuLT5zcG5fb2JqID0gcG5fb2JqKGhhbmRsZSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcG5fc29ja2FkZHJfc2V0X3Jlc291cmNlKHN0cnVjdCBzb2NrYWRkcl9wbiAqc3BuLAorCQkJCQkJX191OCByZXNvdXJjZSkKK3sKKwlzcG4tPnNwbl9yZXNvdXJjZSA9IHJlc291cmNlOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX3U4IHBuX3NvY2thZGRyX2dldF9hZGRyKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9wbiAqc3BuKQoreworCXJldHVybiBzcG4tPnNwbl9kZXYgJiAweGZjOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX3UxNiBwbl9zb2NrYWRkcl9nZXRfcG9ydChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfcG4gKnNwbikKK3sKKwlyZXR1cm4gKChzcG4tPnNwbl9kZXYgJiAweDAzKSA8PCA4KSB8IHNwbi0+c3BuX29iajsKK30KKworc3RhdGljIF9faW5saW5lX18gX191MTYgcG5fc29ja2FkZHJfZ2V0X29iamVjdChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfcG4gKnNwbikKK3sKKwlyZXR1cm4gcG5fb2JqZWN0KHNwbi0+c3BuX2Rldiwgc3BuLT5zcG5fb2JqKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX191OCBwbl9zb2NrYWRkcl9nZXRfcmVzb3VyY2UoY29uc3Qgc3RydWN0IHNvY2thZGRyX3BuICpzcG4pCit7CisJcmV0dXJuIHNwbi0+c3BuX3Jlc291cmNlOworfQorCisvKiBQaG9uZXQgZGV2aWNlIGlvY3RsIHJlcXVlc3RzICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wa3RfY2xzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BrdF9jbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWZiZGUyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wa3RfY2xzLmgKQEAgLTAsMCArMSw0NjcgQEAKKyNpZm5kZWYgX19MSU5VWF9QS1RfQ0xTX0gKKyNkZWZpbmUgX19MSU5VWF9QS1RfQ0xTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X3NjaGVkLmg+CisKKy8qIEkgdGhpbmsgaSBjb3VsZCBoYXZlIGRvbmUgYmV0dGVyIG1hY3JvcyA7IGZvciBub3cgdGhpcyBpcyBzdG9sZW4gZnJvbQorICogc29tZSBhcmNoL21pcHMgY29kZSAtIGpocworKi8KKyNkZWZpbmUgX1RDX01BS0UzMih4KSAoKHgpKQorCisjZGVmaW5lIF9UQ19NQUtFTUFTSzEobikgKF9UQ19NQUtFMzIoMSkgPDwgX1RDX01BS0UzMihuKSkKKyNkZWZpbmUgX1RDX01BS0VNQVNLKHYsbikgKF9UQ19NQUtFMzIoKF9UQ19NQUtFMzIoMSk8PCh2KSktMSkgPDwgX1RDX01BS0UzMihuKSkKKyNkZWZpbmUgX1RDX01BS0VWQUxVRSh2LG4pIChfVENfTUFLRTMyKHYpIDw8IF9UQ19NQUtFMzIobikpCisjZGVmaW5lIF9UQ19HRVRWQUxVRSh2LG4sbSkgKChfVENfTUFLRTMyKHYpICYgX1RDX01BS0UzMihtKSkgPj4gX1RDX01BS0UzMihuKSkKKworLyogdmVyZGljdCBiaXQgYnJlYWtkb3duIAorICoKK2JpdCAwOiB3aGVuIHNldCAtPiB0aGlzIHBhY2tldCBoYXMgYmVlbiBtdW5nZWQgYWxyZWFkeQorCitiaXQgMTogd2hlbiBzZXQgLT4gSXQgaXMgb2sgdG8gbXVuZ2UgdGhpcyBwYWNrZXQKKworYml0IDIsMyw0LDU6IFJlY2xhc3NpZnkgY291bnRlciAtIHNvcnQgb2YgcmV2ZXJzZSBUVEwgLSBpZiBleGNlZWRlZAorYXNzdW1lIGxvb3AKKworYml0IDYsNzogV2hlcmUgdGhpcyBwYWNrZXQgd2FzIGxhc3Qgc2VlbiAKKzA6IEFib3ZlIHRoZSB0cmFuc21pdCBleGFtcGxlIGF0IHRoZSBzb2NrZXQgbGV2ZWwKKzE6IG9uIHRoZSBJbmdyZXNzCisyOiBvbiB0aGUgRWdyZXNzCisKK2JpdCA4OiB3aGVuIHNldCAtLT4gUmVxdWVzdCBub3QgdG8gY2xhc3NpZnkgb24gaW5ncmVzcy4gCisKK2JpdHMgOSwxMCwxMTogcmVkaXJlY3QgY291bnRlciAtICByZWRpcmVjdCBUVEwuIExvb3AgYXZvaWRhbmNlCisKKyAqCisgKiAqLworCisjZGVmaW5lIFRDX01VTkdFRCAgICAgICAgICBfVENfTUFLRU1BU0sxKDApCisjZGVmaW5lIFNFVF9UQ19NVU5HRUQodikgICAoIFRDX01VTkdFRCB8ICh2ICYgflRDX01VTkdFRCkpCisjZGVmaW5lIENMUl9UQ19NVU5HRUQodikgICAoIHYgJiB+VENfTVVOR0VEKQorCisjZGVmaW5lIFRDX09LMk1VTkdFICAgICAgICBfVENfTUFLRU1BU0sxKDEpCisjZGVmaW5lIFNFVF9UQ19PSzJNVU5HRSh2KSAgICggVENfT0syTVVOR0UgfCAodiAmIH5UQ19PSzJNVU5HRSkpCisjZGVmaW5lIENMUl9UQ19PSzJNVU5HRSh2KSAgICggdiAmIH5UQ19PSzJNVU5HRSkKKworI2RlZmluZSBTX1RDX1ZFUkQgICAgICAgICAgX1RDX01BS0UzMigyKQorI2RlZmluZSBNX1RDX1ZFUkQgICAgICAgICAgX1RDX01BS0VNQVNLKDQsU19UQ19WRVJEKQorI2RlZmluZSBHX1RDX1ZFUkQoeCkgICAgICAgX1RDX0dFVFZBTFVFKHgsU19UQ19WRVJELE1fVENfVkVSRCkKKyNkZWZpbmUgVl9UQ19WRVJEKHgpICAgICAgIF9UQ19NQUtFVkFMVUUoeCxTX1RDX1ZFUkQpCisjZGVmaW5lIFNFVF9UQ19WRVJEKHYsbikgICAoKFZfVENfVkVSRChuKSkgfCAodiAmIH5NX1RDX1ZFUkQpKQorCisjZGVmaW5lIFNfVENfRlJPTSAgICAgICAgICBfVENfTUFLRTMyKDYpCisjZGVmaW5lIE1fVENfRlJPTSAgICAgICAgICBfVENfTUFLRU1BU0soMixTX1RDX0ZST00pCisjZGVmaW5lIEdfVENfRlJPTSh4KSAgICAgICBfVENfR0VUVkFMVUUoeCxTX1RDX0ZST00sTV9UQ19GUk9NKQorI2RlZmluZSBWX1RDX0ZST00oeCkgICAgICAgX1RDX01BS0VWQUxVRSh4LFNfVENfRlJPTSkKKyNkZWZpbmUgU0VUX1RDX0ZST00odixuKSAgICgoVl9UQ19GUk9NKG4pKSB8ICh2ICYgfk1fVENfRlJPTSkpCisjZGVmaW5lIEFUX1NUQUNLCTB4MAorI2RlZmluZSBBVF9JTkdSRVNTCTB4MQorI2RlZmluZSBBVF9FR1JFU1MJMHgyCisKKyNkZWZpbmUgVENfTkNMUyAgICAgICAgICBfVENfTUFLRU1BU0sxKDgpCisjZGVmaW5lIFNFVF9UQ19OQ0xTKHYpICAgKCBUQ19OQ0xTIHwgKHYgJiB+VENfTkNMUykpCisjZGVmaW5lIENMUl9UQ19OQ0xTKHYpICAgKCB2ICYgflRDX05DTFMpCisKKyNkZWZpbmUgU19UQ19SVFRMICAgICAgICAgIF9UQ19NQUtFMzIoOSkKKyNkZWZpbmUgTV9UQ19SVFRMICAgICAgICAgIF9UQ19NQUtFTUFTSygzLFNfVENfUlRUTCkKKyNkZWZpbmUgR19UQ19SVFRMKHgpICAgICAgIF9UQ19HRVRWQUxVRSh4LFNfVENfUlRUTCxNX1RDX1JUVEwpCisjZGVmaW5lIFZfVENfUlRUTCh4KSAgICAgICBfVENfTUFLRVZBTFVFKHgsU19UQ19SVFRMKQorI2RlZmluZSBTRVRfVENfUlRUTCh2LG4pICAgKChWX1RDX1JUVEwobikpIHwgKHYgJiB+TV9UQ19SVFRMKSkKKworI2RlZmluZSBTX1RDX0FUICAgICAgICAgIF9UQ19NQUtFMzIoMTIpCisjZGVmaW5lIE1fVENfQVQgICAgICAgICAgX1RDX01BS0VNQVNLKDIsU19UQ19BVCkKKyNkZWZpbmUgR19UQ19BVCh4KSAgICAgICBfVENfR0VUVkFMVUUoeCxTX1RDX0FULE1fVENfQVQpCisjZGVmaW5lIFZfVENfQVQoeCkgICAgICAgX1RDX01BS0VWQUxVRSh4LFNfVENfQVQpCisjZGVmaW5lIFNFVF9UQ19BVCh2LG4pICAgKChWX1RDX0FUKG4pKSB8ICh2ICYgfk1fVENfQVQpKQorCisvKiBBY3Rpb24gYXR0cmlidXRlcyAqLworZW51bSB7CisJVENBX0FDVF9VTlNQRUMsCisJVENBX0FDVF9LSU5ELAorCVRDQV9BQ1RfT1BUSU9OUywKKwlUQ0FfQUNUX0lOREVYLAorCVRDQV9BQ1RfU1RBVFMsCisJX19UQ0FfQUNUX01BWAorfTsKKworI2RlZmluZSBUQ0FfQUNUX01BWCBfX1RDQV9BQ1RfTUFYCisjZGVmaW5lIFRDQV9PTERfQ09NUEFUIChUQ0FfQUNUX01BWCsxKQorI2RlZmluZSBUQ0FfQUNUX01BWF9QUklPIDMyCisjZGVmaW5lIFRDQV9BQ1RfQklORAkxCisjZGVmaW5lIFRDQV9BQ1RfTk9CSU5ECTAKKyNkZWZpbmUgVENBX0FDVF9VTkJJTkQJMQorI2RlZmluZSBUQ0FfQUNUX05PVU5CSU5ECTAKKyNkZWZpbmUgVENBX0FDVF9SRVBMQUNFCQkxCisjZGVmaW5lIFRDQV9BQ1RfTk9SRVBMQUNFCTAKKyNkZWZpbmUgTUFYX1JFQ19MT09QIDQKKyNkZWZpbmUgTUFYX1JFRF9MT09QIDQKKworI2RlZmluZSBUQ19BQ1RfVU5TUEVDCSgtMSkKKyNkZWZpbmUgVENfQUNUX09LCQkwCisjZGVmaW5lIFRDX0FDVF9SRUNMQVNTSUZZCTEKKyNkZWZpbmUgVENfQUNUX1NIT1QJCTIKKyNkZWZpbmUgVENfQUNUX1BJUEUJCTMKKyNkZWZpbmUgVENfQUNUX1NUT0xFTgkJNAorI2RlZmluZSBUQ19BQ1RfUVVFVUVECQk1CisjZGVmaW5lIFRDX0FDVF9SRVBFQVQJCTYKKyNkZWZpbmUgVENfQUNUX0pVTVAJCTB4MTAwMDAwMDAKKworLyogQWN0aW9uIHR5cGUgaWRlbnRpZmllcnMqLworZW51bSB7CisJVENBX0lEX1VOU1BFQz0wLAorCVRDQV9JRF9QT0xJQ0U9MSwKKwkvKiBvdGhlciBhY3Rpb25zIGdvIGhlcmUgKi8KKwlfX1RDQV9JRF9NQVg9MjU1Cit9OworCisjZGVmaW5lIFRDQV9JRF9NQVggX19UQ0FfSURfTUFYCisKK3N0cnVjdCB0Y19wb2xpY2UgeworCV9fdTMyCQkJaW5kZXg7CisJaW50CQkJYWN0aW9uOworI2RlZmluZSBUQ19QT0xJQ0VfVU5TUEVDCVRDX0FDVF9VTlNQRUMKKyNkZWZpbmUgVENfUE9MSUNFX09LCQlUQ19BQ1RfT0sKKyNkZWZpbmUgVENfUE9MSUNFX1JFQ0xBU1NJRlkJVENfQUNUX1JFQ0xBU1NJRlkKKyNkZWZpbmUgVENfUE9MSUNFX1NIT1QJCVRDX0FDVF9TSE9UCisjZGVmaW5lIFRDX1BPTElDRV9QSVBFCQlUQ19BQ1RfUElQRQorCisJX191MzIJCQlsaW1pdDsKKwlfX3UzMgkJCWJ1cnN0OworCV9fdTMyCQkJbXR1OworCXN0cnVjdCB0Y19yYXRlc3BlYwlyYXRlOworCXN0cnVjdCB0Y19yYXRlc3BlYwlwZWFrcmF0ZTsKKwlpbnQgCQkJcmVmY250OworCWludCAJCQliaW5kY250OworCV9fdTMyCQkJY2FwYWI7Cit9OworCitzdHJ1Y3QgdGNmX3QgeworCV9fdTY0ICAgaW5zdGFsbDsKKwlfX3U2NCAgIGxhc3R1c2U7CisJX191NjQgICBleHBpcmVzOworfTsKKworc3RydWN0IHRjX2NudCB7CisJaW50ICAgICAgICAgICAgICAgICAgIHJlZmNudDsgCisJaW50ICAgICAgICAgICAgICAgICAgIGJpbmRjbnQ7Cit9OworCisjZGVmaW5lIHRjX2dlbiBcCisJX191MzIgICAgICAgICAgICAgICAgIGluZGV4OyBcCisJX191MzIgICAgICAgICAgICAgICAgIGNhcGFiOyBcCisJaW50ICAgICAgICAgICAgICAgICAgIGFjdGlvbjsgXAorCWludCAgICAgICAgICAgICAgICAgICByZWZjbnQ7IFwKKwlpbnQgICAgICAgICAgICAgICAgICAgYmluZGNudAorCitlbnVtIHsKKwlUQ0FfUE9MSUNFX1VOU1BFQywKKwlUQ0FfUE9MSUNFX1RCRiwKKwlUQ0FfUE9MSUNFX1JBVEUsCisJVENBX1BPTElDRV9QRUFLUkFURSwKKwlUQ0FfUE9MSUNFX0FWUkFURSwKKwlUQ0FfUE9MSUNFX1JFU1VMVCwKKwlfX1RDQV9QT0xJQ0VfTUFYCisjZGVmaW5lIFRDQV9QT0xJQ0VfUkVTVUxUIFRDQV9QT0xJQ0VfUkVTVUxUCit9OworCisjZGVmaW5lIFRDQV9QT0xJQ0VfTUFYIChfX1RDQV9QT0xJQ0VfTUFYIC0gMSkKKworLyogVTMyIGZpbHRlcnMgKi8KKworI2RlZmluZSBUQ19VMzJfSFRJRChoKSAoKGgpJjB4RkZGMDAwMDApCisjZGVmaW5lIFRDX1UzMl9VU0VSSFRJRChoKSAoVENfVTMyX0hUSUQoaCk+PjIwKQorI2RlZmluZSBUQ19VMzJfSEFTSChoKSAoKChoKT4+MTIpJjB4RkYpCisjZGVmaW5lIFRDX1UzMl9OT0RFKGgpICgoaCkmMHhGRkYpCisjZGVmaW5lIFRDX1UzMl9LRVkoaCkgKChoKSYweEZGRkZGKQorI2RlZmluZSBUQ19VMzJfVU5TUEVDCTAKKyNkZWZpbmUgVENfVTMyX1JPT1QJKDB4RkZGMDAwMDApCisKK2VudW0geworCVRDQV9VMzJfVU5TUEVDLAorCVRDQV9VMzJfQ0xBU1NJRCwKKwlUQ0FfVTMyX0hBU0gsCisJVENBX1UzMl9MSU5LLAorCVRDQV9VMzJfRElWSVNPUiwKKwlUQ0FfVTMyX1NFTCwKKwlUQ0FfVTMyX1BPTElDRSwKKwlUQ0FfVTMyX0FDVCwgICAKKwlUQ0FfVTMyX0lOREVWLAorCVRDQV9VMzJfUENOVCwKKwlUQ0FfVTMyX01BUkssCisJX19UQ0FfVTMyX01BWAorfTsKKworI2RlZmluZSBUQ0FfVTMyX01BWCAoX19UQ0FfVTMyX01BWCAtIDEpCisKK3N0cnVjdCB0Y191MzJfa2V5IHsKKwlfX2JlMzIJCW1hc2s7CisJX19iZTMyCQl2YWw7CisJaW50CQlvZmY7CisJaW50CQlvZmZtYXNrOworfTsKKworc3RydWN0IHRjX3UzMl9zZWwgeworCXVuc2lnbmVkIGNoYXIJCWZsYWdzOworCXVuc2lnbmVkIGNoYXIJCW9mZnNoaWZ0OworCXVuc2lnbmVkIGNoYXIJCW5rZXlzOworCisJX19iZTE2CQkJb2ZmbWFzazsKKwlfX3UxNgkJCW9mZjsKKwlzaG9ydAkJCW9mZm9mZjsKKworCXNob3J0CQkJaG9mZjsKKwlfX2JlMzIJCQlobWFzazsKKwlzdHJ1Y3QgdGNfdTMyX2tleQlrZXlzWzBdOworfTsKKworc3RydWN0IHRjX3UzMl9tYXJrIHsKKwlfX3UzMgkJdmFsOworCV9fdTMyCQltYXNrOworCV9fdTMyCQlzdWNjZXNzOworfTsKKworc3RydWN0IHRjX3UzMl9wY250IHsKKwlfX3U2NCByY250OworCV9fdTY0IHJoaXQ7CisJX191NjQga2NudHNbMF07Cit9OworCisvKiBGbGFncyAqLworCisjZGVmaW5lIFRDX1UzMl9URVJNSU5BTAkJMQorI2RlZmluZSBUQ19VMzJfT0ZGU0VUCQkyCisjZGVmaW5lIFRDX1UzMl9WQVJPRkZTRVQJNAorI2RlZmluZSBUQ19VMzJfRUFUCQk4CisKKyNkZWZpbmUgVENfVTMyX01BWERFUFRIIDgKKworCisvKiBSU1ZQIGZpbHRlciAqLworCitlbnVtIHsKKwlUQ0FfUlNWUF9VTlNQRUMsCisJVENBX1JTVlBfQ0xBU1NJRCwKKwlUQ0FfUlNWUF9EU1QsCisJVENBX1JTVlBfU1JDLAorCVRDQV9SU1ZQX1BJTkZPLAorCVRDQV9SU1ZQX1BPTElDRSwKKwlUQ0FfUlNWUF9BQ1QsCisJX19UQ0FfUlNWUF9NQVgKK307CisKKyNkZWZpbmUgVENBX1JTVlBfTUFYIChfX1RDQV9SU1ZQX01BWCAtIDEgKQorCitzdHJ1Y3QgdGNfcnN2cF9ncGkgeworCV9fdTMyCWtleTsKKwlfX3UzMgltYXNrOworCWludAlvZmZzZXQ7Cit9OworCitzdHJ1Y3QgdGNfcnN2cF9waW5mbyB7CisJc3RydWN0IHRjX3JzdnBfZ3BpIGRwaTsKKwlzdHJ1Y3QgdGNfcnN2cF9ncGkgc3BpOworCV9fdTgJcHJvdG9jb2w7CisJX191OAl0dW5uZWxpZDsKKwlfX3U4CXR1bm5lbGhkcjsKKwlfX3U4CXBhZDsKK307CisKKy8qIFJPVVRFIGZpbHRlciAqLworCitlbnVtIHsKKwlUQ0FfUk9VVEU0X1VOU1BFQywKKwlUQ0FfUk9VVEU0X0NMQVNTSUQsCisJVENBX1JPVVRFNF9UTywKKwlUQ0FfUk9VVEU0X0ZST00sCisJVENBX1JPVVRFNF9JSUYsCisJVENBX1JPVVRFNF9QT0xJQ0UsCisJVENBX1JPVVRFNF9BQ1QsCisJX19UQ0FfUk9VVEU0X01BWAorfTsKKworI2RlZmluZSBUQ0FfUk9VVEU0X01BWCAoX19UQ0FfUk9VVEU0X01BWCAtIDEpCisKKworLyogRlcgZmlsdGVyICovCisKK2VudW0geworCVRDQV9GV19VTlNQRUMsCisJVENBX0ZXX0NMQVNTSUQsCisJVENBX0ZXX1BPTElDRSwKKwlUQ0FfRldfSU5ERVYsIC8qICB1c2VkIGJ5IENPTkZJR19ORVRfQ0xTX0lORCAqLworCVRDQV9GV19BQ1QsIC8qIHVzZWQgYnkgQ09ORklHX05FVF9DTFNfQUNUICovCisJVENBX0ZXX01BU0ssCisJX19UQ0FfRldfTUFYCit9OworCisjZGVmaW5lIFRDQV9GV19NQVggKF9fVENBX0ZXX01BWCAtIDEpCisKKy8qIFRDIGluZGV4IGZpbHRlciAqLworCitlbnVtIHsKKwlUQ0FfVENJTkRFWF9VTlNQRUMsCisJVENBX1RDSU5ERVhfSEFTSCwKKwlUQ0FfVENJTkRFWF9NQVNLLAorCVRDQV9UQ0lOREVYX1NISUZULAorCVRDQV9UQ0lOREVYX0ZBTExfVEhST1VHSCwKKwlUQ0FfVENJTkRFWF9DTEFTU0lELAorCVRDQV9UQ0lOREVYX1BPTElDRSwKKwlUQ0FfVENJTkRFWF9BQ1QsCisJX19UQ0FfVENJTkRFWF9NQVgKK307CisKKyNkZWZpbmUgVENBX1RDSU5ERVhfTUFYICAgICAoX19UQ0FfVENJTkRFWF9NQVggLSAxKQorCisvKiBGbG93IGZpbHRlciAqLworCitlbnVtIHsKKwlGTE9XX0tFWV9TUkMsCisJRkxPV19LRVlfRFNULAorCUZMT1dfS0VZX1BST1RPLAorCUZMT1dfS0VZX1BST1RPX1NSQywKKwlGTE9XX0tFWV9QUk9UT19EU1QsCisJRkxPV19LRVlfSUlGLAorCUZMT1dfS0VZX1BSSU9SSVRZLAorCUZMT1dfS0VZX01BUkssCisJRkxPV19LRVlfTkZDVCwKKwlGTE9XX0tFWV9ORkNUX1NSQywKKwlGTE9XX0tFWV9ORkNUX0RTVCwKKwlGTE9XX0tFWV9ORkNUX1BST1RPX1NSQywKKwlGTE9XX0tFWV9ORkNUX1BST1RPX0RTVCwKKwlGTE9XX0tFWV9SVENMQVNTSUQsCisJRkxPV19LRVlfU0tVSUQsCisJRkxPV19LRVlfU0tHSUQsCisJRkxPV19LRVlfVkxBTl9UQUcsCisJRkxPV19LRVlfUlhIQVNILAorCV9fRkxPV19LRVlfTUFYLAorfTsKKworI2RlZmluZSBGTE9XX0tFWV9NQVgJKF9fRkxPV19LRVlfTUFYIC0gMSkKKworZW51bSB7CisJRkxPV19NT0RFX01BUCwKKwlGTE9XX01PREVfSEFTSCwKK307CisKK2VudW0geworCVRDQV9GTE9XX1VOU1BFQywKKwlUQ0FfRkxPV19LRVlTLAorCVRDQV9GTE9XX01PREUsCisJVENBX0ZMT1dfQkFTRUNMQVNTLAorCVRDQV9GTE9XX1JTSElGVCwKKwlUQ0FfRkxPV19BRERFTkQsCisJVENBX0ZMT1dfTUFTSywKKwlUQ0FfRkxPV19YT1IsCisJVENBX0ZMT1dfRElWSVNPUiwKKwlUQ0FfRkxPV19BQ1QsCisJVENBX0ZMT1dfUE9MSUNFLAorCVRDQV9GTE9XX0VNQVRDSEVTLAorCVRDQV9GTE9XX1BFUlRVUkIsCisJX19UQ0FfRkxPV19NQVgKK307CisKKyNkZWZpbmUgVENBX0ZMT1dfTUFYCShfX1RDQV9GTE9XX01BWCAtIDEpCisKKy8qIEJhc2ljIGZpbHRlciAqLworCitlbnVtIHsKKwlUQ0FfQkFTSUNfVU5TUEVDLAorCVRDQV9CQVNJQ19DTEFTU0lELAorCVRDQV9CQVNJQ19FTUFUQ0hFUywKKwlUQ0FfQkFTSUNfQUNULAorCVRDQV9CQVNJQ19QT0xJQ0UsCisJX19UQ0FfQkFTSUNfTUFYCit9OworCisjZGVmaW5lIFRDQV9CQVNJQ19NQVggKF9fVENBX0JBU0lDX01BWCAtIDEpCisKKworLyogQ2dyb3VwIGNsYXNzaWZpZXIgKi8KKworZW51bSB7CisJVENBX0NHUk9VUF9VTlNQRUMsCisJVENBX0NHUk9VUF9BQ1QsCisJVENBX0NHUk9VUF9QT0xJQ0UsCisJVENBX0NHUk9VUF9FTUFUQ0hFUywKKwlfX1RDQV9DR1JPVVBfTUFYLAorfTsKKworI2RlZmluZSBUQ0FfQ0dST1VQX01BWCAoX19UQ0FfQ0dST1VQX01BWCAtIDEpCisKKy8qIEV4dGVuZGVkIE1hdGNoZXMgKi8KKworc3RydWN0IHRjZl9lbWF0Y2hfdHJlZV9oZHIgeworCV9fdTE2CQlubWF0Y2hlczsKKwlfX3UxNgkJcHJvZ2lkOworfTsKKworZW51bSB7CisJVENBX0VNQVRDSF9UUkVFX1VOU1BFQywKKwlUQ0FfRU1BVENIX1RSRUVfSERSLAorCVRDQV9FTUFUQ0hfVFJFRV9MSVNULAorCV9fVENBX0VNQVRDSF9UUkVFX01BWAorfTsKKyNkZWZpbmUgVENBX0VNQVRDSF9UUkVFX01BWCAoX19UQ0FfRU1BVENIX1RSRUVfTUFYIC0gMSkKKworc3RydWN0IHRjZl9lbWF0Y2hfaGRyIHsKKwlfX3UxNgkJbWF0Y2hpZDsKKwlfX3UxNgkJa2luZDsKKwlfX3UxNgkJZmxhZ3M7CisJX191MTYJCXBhZDsgLyogY3VycmVudGx5IHVudXNlZCAqLworfTsKKworLyogIDAgICAgICAgICAgICAgICAgICAgMQorICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgCisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLSstKy0tLSsKKyAqIHwgICAgICAgICBVbnVzZWQgICAgICAgIHxTfEl8IFIgfAorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0rLSstLS0rCisgKgorICogUigyKSA6Oj0gcmVsYXRpb24gdG8gbmV4dCBlbWF0Y2gKKyAqICAgICAgICAgIHdoZXJlOiAwIDAgRU5EIChsYXN0IGVtYXRjaCkKKyAqICAgICAgICAgICAgICAgICAwIDEgQU5ECisgKiAgICAgICAgICAgICAgICAgMSAwIE9SCisgKiAgICAgICAgICAgICAgICAgMSAxIFVudXNlZCAoaW52YWxpZCkKKyAqIEkoMSkgOjo9IGludmVydCByZXN1bHQKKyAqIFMoMSkgOjo9IHNpbXBsZSBwYXlsb2FkCisgKi8KKyNkZWZpbmUgVENGX0VNX1JFTF9FTkQJMAorI2RlZmluZSBUQ0ZfRU1fUkVMX0FORAkoMTw8MCkKKyNkZWZpbmUgVENGX0VNX1JFTF9PUgkoMTw8MSkKKyNkZWZpbmUgVENGX0VNX0lOVkVSVAkoMTw8MikKKyNkZWZpbmUgVENGX0VNX1NJTVBMRQkoMTw8MykKKworI2RlZmluZSBUQ0ZfRU1fUkVMX01BU0sJMworI2RlZmluZSBUQ0ZfRU1fUkVMX1ZBTElEKHYpICgoKHYpICYgVENGX0VNX1JFTF9NQVNLKSAhPSBUQ0ZfRU1fUkVMX01BU0spCisKK2VudW0geworCVRDRl9MQVlFUl9MSU5LLAorCVRDRl9MQVlFUl9ORVRXT1JLLAorCVRDRl9MQVlFUl9UUkFOU1BPUlQsCisJX19UQ0ZfTEFZRVJfTUFYCit9OworI2RlZmluZSBUQ0ZfTEFZRVJfTUFYIChfX1RDRl9MQVlFUl9NQVggLSAxKQorCisvKiBFbWF0Y2ggdHlwZSBhc3NpZ25tZW50cworICogICAxLi4zMjc2NwkJUmVzZXJ2ZWQgZm9yIGVtYXRjaGVzIGluc2lkZSBrZXJuZWwgdHJlZQorICogICAzMjc2OC4uNjU1MzUJRnJlZSB0byB1c2UsIG5vdCByZWxpYWJsZQorICovCisjZGVmaW5lCVRDRl9FTV9DT05UQUlORVIJMAorI2RlZmluZQlUQ0ZfRU1fQ01QCQkxCisjZGVmaW5lCVRDRl9FTV9OQllURQkJMgorI2RlZmluZQlUQ0ZfRU1fVTMyCQkzCisjZGVmaW5lCVRDRl9FTV9NRVRBCQk0CisjZGVmaW5lCVRDRl9FTV9URVhUCQk1CisjZGVmaW5lICAgICAgICBUQ0ZfRU1fVkxBTgkJNgorI2RlZmluZQlUQ0ZfRU1fTUFYCQk2CisKK2VudW0geworCVRDRl9FTV9QUk9HX1RDCit9OworCitlbnVtIHsKKwlUQ0ZfRU1fT1BORF9FUSwKKwlUQ0ZfRU1fT1BORF9HVCwKKwlUQ0ZfRU1fT1BORF9MVAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BrdF9zY2hlZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wa3Rfc2NoZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjgxZDVhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wa3Rfc2NoZWQuaApAQCAtMCwwICsxLDYwNiBAQAorI2lmbmRlZiBfX0xJTlVYX1BLVF9TQ0hFRF9ICisjZGVmaW5lIF9fTElOVVhfUEtUX1NDSEVEX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIExvZ2ljYWwgcHJpb3JpdHkgYmFuZHMgbm90IGRlcGVuZGluZyBvbiBzcGVjaWZpYyBwYWNrZXQgc2NoZWR1bGVyLgorICAgRXZlcnkgc2NoZWR1bGVyIHdpbGwgbWFwIHRoZW0gdG8gcmVhbCB0cmFmZmljIGNsYXNzZXMsIGlmIGl0IGhhcworICAgbm8gbW9yZSBwcmVjaXNlIG1lY2hhbmlzbSB0byBjbGFzc2lmeSBwYWNrZXRzLgorCisgICBUaGVzZSBudW1iZXJzIGhhdmUgbm8gc3BlY2lhbCBtZWFuaW5nLCB0aG91Z2ggdGhlaXIgY29pbmNpZGVuY2UKKyAgIHdpdGggb2Jzb2xldGUgSVB2NiB2YWx1ZXMgaXMgbm90IG9jY2FzaW9uYWwgOi0pLiBOZXcgSVB2NiBkcmFmdHMKKyAgIHByZWZlcnJlZCBmdWxsIGFuYXJjaHkgaW5zcGlyZWQgYnkgZGlmZnNlcnYgZ3JvdXAuCisKKyAgIE5vdGU6IFRDX1BSSU9fQkVTVEVGRk9SVCBkb2VzIG5vdCBtZWFuIHRoYXQgaXQgaXMgdGhlIG1vc3QgdW5oYXBweQorICAgY2xhc3MsIGFjdHVhbGx5LCBhcyBydWxlIGl0IHdpbGwgYmUgaGFuZGxlZCB3aXRoIG1vcmUgY2FyZSB0aGFuCisgICBmaWxsZXIgb3IgZXZlbiBidWxrLgorICovCisKKyNkZWZpbmUgVENfUFJJT19CRVNURUZGT1JUCQkwCisjZGVmaW5lIFRDX1BSSU9fRklMTEVSCQkJMQorI2RlZmluZSBUQ19QUklPX0JVTEsJCQkyCisjZGVmaW5lIFRDX1BSSU9fSU5URVJBQ1RJVkVfQlVMSwk0CisjZGVmaW5lIFRDX1BSSU9fSU5URVJBQ1RJVkUJCTYKKyNkZWZpbmUgVENfUFJJT19DT05UUk9MCQkJNworCisjZGVmaW5lIFRDX1BSSU9fTUFYCQkJMTUKKworLyogR2VuZXJpYyBxdWV1ZSBzdGF0aXN0aWNzLCBhdmFpbGFibGUgZm9yIGFsbCB0aGUgZWxlbWVudHMuCisgICBQYXJ0aWN1bGFyIHNjaGVkdWxlcnMgbWF5IGhhdmUgYWxzbyB0aGVpciBwcml2YXRlIHJlY29yZHMuCisgKi8KKworc3RydWN0IHRjX3N0YXRzIHsKKwlfX3U2NAlieXRlczsJCQkvKiBOdW1iZXIgb2YgZW5xdWV1ZWQgYnl0ZXMgKi8KKwlfX3UzMglwYWNrZXRzOwkJLyogTnVtYmVyIG9mIGVucXVldWVkIHBhY2tldHMJKi8KKwlfX3UzMglkcm9wczsJCQkvKiBQYWNrZXRzIGRyb3BwZWQgYmVjYXVzZSBvZiBsYWNrIG9mIHJlc291cmNlcyAqLworCV9fdTMyCW92ZXJsaW1pdHM7CQkvKiBOdW1iZXIgb2YgdGhyb3R0bGUgZXZlbnRzIHdoZW4gdGhpcworCQkJCQkgKiBmbG93IGdvZXMgb3V0IG9mIGFsbG9jYXRlZCBiYW5kd2lkdGggKi8KKwlfX3UzMglicHM7CQkJLyogQ3VycmVudCBmbG93IGJ5dGUgcmF0ZSAqLworCV9fdTMyCXBwczsJCQkvKiBDdXJyZW50IGZsb3cgcGFja2V0IHJhdGUgKi8KKwlfX3UzMglxbGVuOworCV9fdTMyCWJhY2tsb2c7Cit9OworCitzdHJ1Y3QgdGNfZXN0aW1hdG9yIHsKKwlzaWduZWQgY2hhcglpbnRlcnZhbDsKKwl1bnNpZ25lZCBjaGFyCWV3bWFfbG9nOworfTsKKworLyogIkhhbmRsZXMiCisgICAtLS0tLS0tLS0KKworICAgIEFsbCB0aGUgdHJhZmZpYyBjb250cm9sIG9iamVjdHMgaGF2ZSAzMmJpdCBpZGVudGlmaWVycywgb3IgImhhbmRsZXMiLgorCisgICAgVGhleSBjYW4gYmUgY29uc2lkZXJlZCBhcyBvcGFxdWUgbnVtYmVycyBmcm9tIHVzZXIgQVBJIHZpZXdwb2ludCwKKyAgICBidXQgYWN0dWFsbHkgdGhleSBhbHdheXMgY29uc2lzdCBvZiB0d28gZmllbGRzOiBtYWpvciBhbmQKKyAgICBtaW5vciBudW1iZXJzLCB3aGljaCBhcmUgaW50ZXJwcmV0ZWQgYnkga2VybmVsIHNwZWNpYWxseSwKKyAgICB0aGF0IG1heSBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucywgdGhvdWdoIG5vdCByZWNvbW1lbmRlZC4KKworICAgIEYuZS4gcWRpc2MgaGFuZGxlcyBhbHdheXMgaGF2ZSBtaW5vciBudW1iZXIgZXF1YWwgdG8gemVybywKKyAgICBjbGFzc2VzIChvciBmbG93cykgaGF2ZSBtYWpvciBlcXVhbCB0byBwYXJlbnQgcWRpc2MgbWFqb3IsIGFuZAorICAgIG1pbm9yIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIGNsYXNzIGluc2lkZSBxZGlzYy4KKworICAgIE1hY3JvcyB0byBtYW5pcHVsYXRlIGhhbmRsZXM6CisgKi8KKworI2RlZmluZSBUQ19IX01BSl9NQVNLICgweEZGRkYwMDAwVSkKKyNkZWZpbmUgVENfSF9NSU5fTUFTSyAoMHgwMDAwRkZGRlUpCisjZGVmaW5lIFRDX0hfTUFKKGgpICgoaCkmVENfSF9NQUpfTUFTSykKKyNkZWZpbmUgVENfSF9NSU4oaCkgKChoKSZUQ19IX01JTl9NQVNLKQorI2RlZmluZSBUQ19IX01BS0UobWFqLG1pbikgKCgobWFqKSZUQ19IX01BSl9NQVNLKXwoKG1pbikmVENfSF9NSU5fTUFTSykpCisKKyNkZWZpbmUgVENfSF9VTlNQRUMJKDBVKQorI2RlZmluZSBUQ19IX1JPT1QJKDB4RkZGRkZGRkZVKQorI2RlZmluZSBUQ19IX0lOR1JFU1MgICAgKDB4RkZGRkZGRjFVKQorCitzdHJ1Y3QgdGNfcmF0ZXNwZWMgeworCXVuc2lnbmVkIGNoYXIJY2VsbF9sb2c7CisJdW5zaWduZWQgY2hhcglfX3Jlc2VydmVkOworCXVuc2lnbmVkIHNob3J0CW92ZXJoZWFkOworCXNob3J0CQljZWxsX2FsaWduOworCXVuc2lnbmVkIHNob3J0CW1wdTsKKwlfX3UzMgkJcmF0ZTsKK307CisKKyNkZWZpbmUgVENfUlRBQl9TSVpFCTEwMjQKKworc3RydWN0IHRjX3NpemVzcGVjIHsKKwl1bnNpZ25lZCBjaGFyCWNlbGxfbG9nOworCXVuc2lnbmVkIGNoYXIJc2l6ZV9sb2c7CisJc2hvcnQJCWNlbGxfYWxpZ247CisJaW50CQlvdmVyaGVhZDsKKwl1bnNpZ25lZCBpbnQJbGlua2xheWVyOworCXVuc2lnbmVkIGludAltcHU7CisJdW5zaWduZWQgaW50CW10dTsKKwl1bnNpZ25lZCBpbnQJdHNpemU7Cit9OworCitlbnVtIHsKKwlUQ0FfU1RBQl9VTlNQRUMsCisJVENBX1NUQUJfQkFTRSwKKwlUQ0FfU1RBQl9EQVRBLAorCV9fVENBX1NUQUJfTUFYCit9OworCisjZGVmaW5lIFRDQV9TVEFCX01BWCAoX19UQ0FfU1RBQl9NQVggLSAxKQorCisvKiBGSUZPIHNlY3Rpb24gKi8KKworc3RydWN0IHRjX2ZpZm9fcW9wdCB7CisJX191MzIJbGltaXQ7CS8qIFF1ZXVlIGxlbmd0aDogYnl0ZXMgZm9yIGJmaWZvLCBwYWNrZXRzIGZvciBwZmlmbyAqLworfTsKKworLyogUFJJTyBzZWN0aW9uICovCisKKyNkZWZpbmUgVENRX1BSSU9fQkFORFMJMTYKKyNkZWZpbmUgVENRX01JTl9QUklPX0JBTkRTIDIKKworc3RydWN0IHRjX3ByaW9fcW9wdCB7CisJaW50CWJhbmRzOwkJCS8qIE51bWJlciBvZiBiYW5kcyAqLworCV9fdTgJcHJpb21hcFtUQ19QUklPX01BWCsxXTsJLyogTWFwOiBsb2dpY2FsIHByaW9yaXR5IC0+IFBSSU8gYmFuZCAqLworfTsKKworLyogTVVMVElRIHNlY3Rpb24gKi8KKworc3RydWN0IHRjX211bHRpcV9xb3B0IHsKKwlfX3UxNgliYW5kczsJCQkvKiBOdW1iZXIgb2YgYmFuZHMgKi8KKwlfX3UxNgltYXhfYmFuZHM7CQkvKiBNYXhpbXVtIG51bWJlciBvZiBxdWV1ZXMgKi8KK307CisKKy8qIFRCRiBzZWN0aW9uICovCisKK3N0cnVjdCB0Y190YmZfcW9wdCB7CisJc3RydWN0IHRjX3JhdGVzcGVjIHJhdGU7CisJc3RydWN0IHRjX3JhdGVzcGVjIHBlYWtyYXRlOworCV9fdTMyCQlsaW1pdDsKKwlfX3UzMgkJYnVmZmVyOworCV9fdTMyCQltdHU7Cit9OworCitlbnVtIHsKKwlUQ0FfVEJGX1VOU1BFQywKKwlUQ0FfVEJGX1BBUk1TLAorCVRDQV9UQkZfUlRBQiwKKwlUQ0FfVEJGX1BUQUIsCisJX19UQ0FfVEJGX01BWCwKK307CisKKyNkZWZpbmUgVENBX1RCRl9NQVggKF9fVENBX1RCRl9NQVggLSAxKQorCisKKy8qIFRFUUwgc2VjdGlvbiAqLworCisvKiBURVFMIGRvZXMgbm90IHJlcXVpcmUgYW55IHBhcmFtZXRlcnMgKi8KKworLyogU0ZRIHNlY3Rpb24gKi8KKworc3RydWN0IHRjX3NmcV9xb3B0IHsKKwl1bnNpZ25lZAlxdWFudHVtOwkvKiBCeXRlcyBwZXIgcm91bmQgYWxsb2NhdGVkIHRvIGZsb3cgKi8KKwlpbnQJCXBlcnR1cmJfcGVyaW9kOwkvKiBQZXJpb2Qgb2YgaGFzaCBwZXJ0dXJiYXRpb24gKi8KKwlfX3UzMgkJbGltaXQ7CQkvKiBNYXhpbWFsIHBhY2tldHMgaW4gcXVldWUgKi8KKwl1bnNpZ25lZAlkaXZpc29yOwkvKiBIYXNoIGRpdmlzb3IgICovCisJdW5zaWduZWQJZmxvd3M7CQkvKiBNYXhpbWFsIG51bWJlciBvZiBmbG93cyAgKi8KK307CisKK3N0cnVjdCB0Y19zZnFfeHN0YXRzIHsKKwlfX3MzMgkJYWxsb3Q7Cit9OworCisvKgorICogIE5PVEU6IGxpbWl0LCBkaXZpc29yIGFuZCBmbG93cyBhcmUgaGFyZHdpcmVkIHRvIGNvZGUgYXQgdGhlIG1vbWVudC4KKyAqCisgKglsaW1pdD1mbG93cz0xMjgsIGRpdmlzb3I9MTAyNDsKKyAqCisgKglUaGUgb25seSByZWFzb24gZm9yIHRoaXMgaXMgZWZmaWNpZW5jeSwgaXQgaXMgcG9zc2libGUKKyAqCXRvIGNoYW5nZSB0aGVzZSBwYXJhbWV0ZXJzIGluIGNvbXBpbGUgdGltZS4KKyAqLworCisvKiBSRUQgc2VjdGlvbiAqLworCitlbnVtIHsKKwlUQ0FfUkVEX1VOU1BFQywKKwlUQ0FfUkVEX1BBUk1TLAorCVRDQV9SRURfU1RBQiwKKwlfX1RDQV9SRURfTUFYLAorfTsKKworI2RlZmluZSBUQ0FfUkVEX01BWCAoX19UQ0FfUkVEX01BWCAtIDEpCisKK3N0cnVjdCB0Y19yZWRfcW9wdCB7CisJX191MzIJCWxpbWl0OwkJLyogSEFSRCBtYXhpbWFsIHF1ZXVlIGxlbmd0aCAoYnl0ZXMpCSovCisJX191MzIJCXF0aF9taW47CS8qIE1pbiBhdmVyYWdlIGxlbmd0aCB0aHJlc2hvbGQgKGJ5dGVzKSAqLworCV9fdTMyCQlxdGhfbWF4OwkvKiBNYXggYXZlcmFnZSBsZW5ndGggdGhyZXNob2xkIChieXRlcykgKi8KKwl1bnNpZ25lZCBjaGFyICAgV2xvZzsJCS8qIGxvZyhXKQkJKi8KKwl1bnNpZ25lZCBjaGFyICAgUGxvZzsJCS8qIGxvZyhQX21heC8ocXRoX21heC1xdGhfbWluKSkJKi8KKwl1bnNpZ25lZCBjaGFyICAgU2NlbGxfbG9nOwkvKiBjZWxsIHNpemUgZm9yIGlkbGUgZGFtcGluZyAqLworCXVuc2lnbmVkIGNoYXIJZmxhZ3M7CisjZGVmaW5lIFRDX1JFRF9FQ04JMQorI2RlZmluZSBUQ19SRURfSEFSRERST1AJMgorfTsKKworc3RydWN0IHRjX3JlZF94c3RhdHMgeworCV9fdTMyICAgICAgICAgICBlYXJseTsgICAgICAgICAgLyogRWFybHkgZHJvcHMgKi8KKwlfX3UzMiAgICAgICAgICAgcGRyb3A7ICAgICAgICAgIC8qIERyb3BzIGR1ZSB0byBxdWV1ZSBsaW1pdHMgKi8KKwlfX3UzMiAgICAgICAgICAgb3RoZXI7ICAgICAgICAgIC8qIERyb3BzIGR1ZSB0byBkcm9wKCkgY2FsbHMgKi8KKwlfX3UzMiAgICAgICAgICAgbWFya2VkOyAgICAgICAgIC8qIE1hcmtlZCBwYWNrZXRzICovCit9OworCisvKiBHUkVEIHNlY3Rpb24gKi8KKworI2RlZmluZSBNQVhfRFBzIDE2CisKK2VudW0geworICAgICAgIFRDQV9HUkVEX1VOU1BFQywKKyAgICAgICBUQ0FfR1JFRF9QQVJNUywKKyAgICAgICBUQ0FfR1JFRF9TVEFCLAorICAgICAgIFRDQV9HUkVEX0RQUywKKwkgICBfX1RDQV9HUkVEX01BWCwKK307CisKKyNkZWZpbmUgVENBX0dSRURfTUFYIChfX1RDQV9HUkVEX01BWCAtIDEpCisKK3N0cnVjdCB0Y19ncmVkX3FvcHQgeworCV9fdTMyCQlsaW1pdDsgICAgICAgIC8qIEhBUkQgbWF4aW1hbCBxdWV1ZSBsZW5ndGggKGJ5dGVzKSAgICAqLworCV9fdTMyCQlxdGhfbWluOyAgICAgIC8qIE1pbiBhdmVyYWdlIGxlbmd0aCB0aHJlc2hvbGQgKGJ5dGVzKSAqLworCV9fdTMyCQlxdGhfbWF4OyAgICAgIC8qIE1heCBhdmVyYWdlIGxlbmd0aCB0aHJlc2hvbGQgKGJ5dGVzKSAqLworCV9fdTMyCQlEUDsgICAgICAgICAgIC8qIHVwIHRvIDJeMzIgRFBzICovCisJX191MzIJCWJhY2tsb2c7CisJX191MzIJCXFhdmU7CisJX191MzIJCWZvcmNlZDsKKwlfX3UzMgkJZWFybHk7CisJX191MzIJCW90aGVyOworCV9fdTMyCQlwZHJvcDsKKwlfX3U4CQlXbG9nOyAgICAgICAgIC8qIGxvZyhXKSAgICAgICAgICAgICAgICovCisJX191OAkJUGxvZzsgICAgICAgICAvKiBsb2coUF9tYXgvKHF0aF9tYXgtcXRoX21pbikpICovCisJX191OAkJU2NlbGxfbG9nOyAgICAvKiBjZWxsIHNpemUgZm9yIGlkbGUgZGFtcGluZyAqLworCV9fdTgJCXByaW87ICAgICAgICAgLyogcHJpbyBvZiB0aGlzIFZRICovCisJX191MzIJCXBhY2tldHM7CisJX191MzIJCWJ5dGVzaW47Cit9OworCisvKiBncmVkIHNldHVwICovCitzdHJ1Y3QgdGNfZ3JlZF9zb3B0IHsKKwlfX3UzMgkJRFBzOworCV9fdTMyCQlkZWZfRFA7CisJX191OAkJZ3JpbzsKKwlfX3U4CQlmbGFnczsKKwlfX3UxNgkJcGFkMTsKK307CisKKy8qIENIT0tlIHNlY3Rpb24gKi8KKworZW51bSB7CisJVENBX0NIT0tFX1VOU1BFQywKKwlUQ0FfQ0hPS0VfUEFSTVMsCisJVENBX0NIT0tFX1NUQUIsCisJX19UQ0FfQ0hPS0VfTUFYLAorfTsKKworI2RlZmluZSBUQ0FfQ0hPS0VfTUFYIChfX1RDQV9DSE9LRV9NQVggLSAxKQorCitzdHJ1Y3QgdGNfY2hva2VfcW9wdCB7CisJX191MzIJCWxpbWl0OwkJLyogSGFyZCBxdWV1ZSBsZW5ndGggKHBhY2tldHMpCSovCisJX191MzIJCXF0aF9taW47CS8qIE1pbiBhdmVyYWdlIHRocmVzaG9sZCAocGFja2V0cykgKi8KKwlfX3UzMgkJcXRoX21heDsJLyogTWF4IGF2ZXJhZ2UgdGhyZXNob2xkIChwYWNrZXRzKSAqLworCXVuc2lnbmVkIGNoYXIgICBXbG9nOwkJLyogbG9nKFcpCQkqLworCXVuc2lnbmVkIGNoYXIgICBQbG9nOwkJLyogbG9nKFBfbWF4LyhxdGhfbWF4LXF0aF9taW4pKQkqLworCXVuc2lnbmVkIGNoYXIgICBTY2VsbF9sb2c7CS8qIGNlbGwgc2l6ZSBmb3IgaWRsZSBkYW1waW5nICovCisJdW5zaWduZWQgY2hhcglmbGFnczsJCS8qIHNlZSBSRUQgZmxhZ3MgKi8KK307CisKK3N0cnVjdCB0Y19jaG9rZV94c3RhdHMgeworCV9fdTMyCQllYXJseTsgICAgICAgICAgLyogRWFybHkgZHJvcHMgKi8KKwlfX3UzMgkJcGRyb3A7ICAgICAgICAgIC8qIERyb3BzIGR1ZSB0byBxdWV1ZSBsaW1pdHMgKi8KKwlfX3UzMgkJb3RoZXI7ICAgICAgICAgIC8qIERyb3BzIGR1ZSB0byBkcm9wKCkgY2FsbHMgKi8KKwlfX3UzMgkJbWFya2VkOyAgICAgICAgIC8qIE1hcmtlZCBwYWNrZXRzICovCisJX191MzIJCW1hdGNoZWQ7CS8qIERyb3BzIGR1ZSB0byBmbG93IG1hdGNoICovCit9OworCisvKiBIVEIgc2VjdGlvbiAqLworI2RlZmluZSBUQ19IVEJfTlVNUFJJTwkJOAorI2RlZmluZSBUQ19IVEJfTUFYREVQVEgJCTgKKyNkZWZpbmUgVENfSFRCX1BST1RPVkVSCQkzIC8qIHRoZSBzYW1lIGFzIEhUQiBhbmQgVEMncyBtYWpvciAqLworCitzdHJ1Y3QgdGNfaHRiX29wdCB7CisJc3RydWN0IHRjX3JhdGVzcGVjIAlyYXRlOworCXN0cnVjdCB0Y19yYXRlc3BlYyAJY2VpbDsKKwlfX3UzMglidWZmZXI7CisJX191MzIJY2J1ZmZlcjsKKwlfX3UzMglxdWFudHVtOworCV9fdTMyCWxldmVsOwkJLyogb3V0IG9ubHkgKi8KKwlfX3UzMglwcmlvOworfTsKK3N0cnVjdCB0Y19odGJfZ2xvYiB7CisJX191MzIgdmVyc2lvbjsJCS8qIHRvIG1hdGNoIEhUQi9UQyAqLworICAgIAlfX3UzMiByYXRlMnF1YW50dW07CS8qIGJwcy0+cXVhbnR1bSBkaXZpc29yICovCisgICAgCV9fdTMyIGRlZmNsczsJCS8qIGRlZmF1bHQgY2xhc3MgbnVtYmVyICovCisJX191MzIgZGVidWc7CQkvKiBkZWJ1ZyBmbGFncyAqLworCisJLyogc3RhdHMgKi8KKwlfX3UzMiBkaXJlY3RfcGt0czsgLyogY291bnQgb2Ygbm9uIHNoYXBlZCBwYWNrZXRzICovCit9OworZW51bSB7CisJVENBX0hUQl9VTlNQRUMsCisJVENBX0hUQl9QQVJNUywKKwlUQ0FfSFRCX0lOSVQsCisJVENBX0hUQl9DVEFCLAorCVRDQV9IVEJfUlRBQiwKKwlfX1RDQV9IVEJfTUFYLAorfTsKKworI2RlZmluZSBUQ0FfSFRCX01BWCAoX19UQ0FfSFRCX01BWCAtIDEpCisKK3N0cnVjdCB0Y19odGJfeHN0YXRzIHsKKwlfX3UzMiBsZW5kczsKKwlfX3UzMiBib3Jyb3dzOworCV9fdTMyIGdpYW50czsJLyogdG9vIGJpZyBwYWNrZXRzIChyYXRlIHdpbGwgbm90IGJlIGFjY3VyYXRlKSAqLworCV9fdTMyIHRva2VuczsKKwlfX3UzMiBjdG9rZW5zOworfTsKKworLyogSEZTQyBzZWN0aW9uICovCisKK3N0cnVjdCB0Y19oZnNjX3FvcHQgeworCV9fdTE2CWRlZmNsczsJCS8qIGRlZmF1bHQgY2xhc3MgKi8KK307CisKK3N0cnVjdCB0Y19zZXJ2aWNlX2N1cnZlIHsKKwlfX3UzMgltMTsJCS8qIHNsb3BlIG9mIHRoZSBmaXJzdCBzZWdtZW50IGluIGJwcyAqLworCV9fdTMyCWQ7CQkvKiB4LXByb2plY3Rpb24gb2YgdGhlIGZpcnN0IHNlZ21lbnQgaW4gdXMgKi8KKwlfX3UzMgltMjsJCS8qIHNsb3BlIG9mIHRoZSBzZWNvbmQgc2VnbWVudCBpbiBicHMgKi8KK307CisKK3N0cnVjdCB0Y19oZnNjX3N0YXRzIHsKKwlfX3U2NAl3b3JrOwkJLyogdG90YWwgd29yayBkb25lICovCisJX191NjQJcnR3b3JrOwkJLyogd29yayBkb25lIGJ5IHJlYWwtdGltZSBjcml0ZXJpYSAqLworCV9fdTMyCXBlcmlvZDsJCS8qIGN1cnJlbnQgcGVyaW9kICovCisJX191MzIJbGV2ZWw7CQkvKiBjbGFzcyBsZXZlbCBpbiBoaWVyYXJjaHkgKi8KK307CisKK2VudW0geworCVRDQV9IRlNDX1VOU1BFQywKKwlUQ0FfSEZTQ19SU0MsCisJVENBX0hGU0NfRlNDLAorCVRDQV9IRlNDX1VTQywKKwlfX1RDQV9IRlNDX01BWCwKK307CisKKyNkZWZpbmUgVENBX0hGU0NfTUFYIChfX1RDQV9IRlNDX01BWCAtIDEpCisKKworLyogQ0JRIHNlY3Rpb24gKi8KKworI2RlZmluZSBUQ19DQlFfTUFYUFJJTwkJOAorI2RlZmluZSBUQ19DQlFfTUFYTEVWRUwJCTgKKyNkZWZpbmUgVENfQ0JRX0RFRl9FV01BCQk1CisKK3N0cnVjdCB0Y19jYnFfbHNzb3B0IHsKKwl1bnNpZ25lZCBjaGFyCWNoYW5nZTsKKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworI2RlZmluZSBUQ0ZfQ0JRX0xTU19CT1VOREVECTEKKyNkZWZpbmUgVENGX0NCUV9MU1NfSVNPTEFURUQJMgorCXVuc2lnbmVkIGNoYXIgIAlld21hX2xvZzsKKwl1bnNpZ25lZCBjaGFyICAJbGV2ZWw7CisjZGVmaW5lIFRDRl9DQlFfTFNTX0ZMQUdTCTEKKyNkZWZpbmUgVENGX0NCUV9MU1NfRVdNQQkyCisjZGVmaW5lIFRDRl9DQlFfTFNTX01BWElETEUJNAorI2RlZmluZSBUQ0ZfQ0JRX0xTU19NSU5JRExFCTgKKyNkZWZpbmUgVENGX0NCUV9MU1NfT0ZGVElNRQkweDEwCisjZGVmaW5lIFRDRl9DQlFfTFNTX0FWUEtUCTB4MjAKKwlfX3UzMgkJbWF4aWRsZTsKKwlfX3UzMgkJbWluaWRsZTsKKwlfX3UzMgkJb2ZmdGltZTsKKwlfX3UzMgkJYXZwa3Q7Cit9OworCitzdHJ1Y3QgdGNfY2JxX3dycm9wdCB7CisJdW5zaWduZWQgY2hhcglmbGFnczsKKwl1bnNpZ25lZCBjaGFyCXByaW9yaXR5OworCXVuc2lnbmVkIGNoYXIJY3ByaW9yaXR5OworCXVuc2lnbmVkIGNoYXIJX19yZXNlcnZlZDsKKwlfX3UzMgkJYWxsb3Q7CisJX191MzIJCXdlaWdodDsKK307CisKK3N0cnVjdCB0Y19jYnFfb3ZsIHsKKwl1bnNpZ25lZCBjaGFyCXN0cmF0ZWd5OworI2RlZmluZQlUQ19DQlFfT1ZMX0NMQVNTSUMJMAorI2RlZmluZQlUQ19DQlFfT1ZMX0RFTEFZCTEKKyNkZWZpbmUJVENfQ0JRX09WTF9MT1dQUklPCTIKKyNkZWZpbmUJVENfQ0JRX09WTF9EUk9QCQkzCisjZGVmaW5lCVRDX0NCUV9PVkxfUkNMQVNTSUMJNAorCXVuc2lnbmVkIGNoYXIJcHJpb3JpdHkyOworCV9fdTE2CQlwYWQ7CisJX191MzIJCXBlbmFsdHk7Cit9OworCitzdHJ1Y3QgdGNfY2JxX3BvbGljZSB7CisJdW5zaWduZWQgY2hhcglwb2xpY2U7CisJdW5zaWduZWQgY2hhcglfX3JlczE7CisJdW5zaWduZWQgc2hvcnQJX19yZXMyOworfTsKKworc3RydWN0IHRjX2NicV9mb3B0IHsKKwlfX3UzMgkJc3BsaXQ7CisJX191MzIJCWRlZm1hcDsKKwlfX3UzMgkJZGVmY2hhbmdlOworfTsKKworc3RydWN0IHRjX2NicV94c3RhdHMgeworCV9fdTMyCQlib3Jyb3dzOworCV9fdTMyCQlvdmVyYWN0aW9uczsKKwlfX3MzMgkJYXZnaWRsZTsKKwlfX3MzMgkJdW5kZXJ0aW1lOworfTsKKworZW51bSB7CisJVENBX0NCUV9VTlNQRUMsCisJVENBX0NCUV9MU1NPUFQsCisJVENBX0NCUV9XUlJPUFQsCisJVENBX0NCUV9GT1BULAorCVRDQV9DQlFfT1ZMX1NUUkFURUdZLAorCVRDQV9DQlFfUkFURSwKKwlUQ0FfQ0JRX1JUQUIsCisJVENBX0NCUV9QT0xJQ0UsCisJX19UQ0FfQ0JRX01BWCwKK307CisKKyNkZWZpbmUgVENBX0NCUV9NQVgJKF9fVENBX0NCUV9NQVggLSAxKQorCisvKiBkc21hcmsgc2VjdGlvbiAqLworCitlbnVtIHsKKwlUQ0FfRFNNQVJLX1VOU1BFQywKKwlUQ0FfRFNNQVJLX0lORElDRVMsCisJVENBX0RTTUFSS19ERUZBVUxUX0lOREVYLAorCVRDQV9EU01BUktfU0VUX1RDX0lOREVYLAorCVRDQV9EU01BUktfTUFTSywKKwlUQ0FfRFNNQVJLX1ZBTFVFLAorCV9fVENBX0RTTUFSS19NQVgsCit9OworCisjZGVmaW5lIFRDQV9EU01BUktfTUFYIChfX1RDQV9EU01BUktfTUFYIC0gMSkKKworLyogQVRNICBzZWN0aW9uICovCisKK2VudW0geworCVRDQV9BVE1fVU5TUEVDLAorCVRDQV9BVE1fRkQsCQkvKiBmaWxlL3NvY2tldCBkZXNjcmlwdG9yICovCisJVENBX0FUTV9QVFIsCQkvKiBwb2ludGVyIHRvIGRlc2NyaXB0b3IgLSBsYXRlciAqLworCVRDQV9BVE1fSERSLAkJLyogTEwgaGVhZGVyICovCisJVENBX0FUTV9FWENFU1MsCQkvKiBleGNlc3MgdHJhZmZpYyBjbGFzcyAoMCBmb3IgQ0xQKSAgKi8KKwlUQ0FfQVRNX0FERFIsCQkvKiBQVkMgYWRkcmVzcyAoZm9yIG91dHB1dCBvbmx5KSAqLworCVRDQV9BVE1fU1RBVEUsCQkvKiBWQyBzdGF0ZSAoQVRNX1ZTXyo7IGZvciBvdXRwdXQgb25seSkgKi8KKwlfX1RDQV9BVE1fTUFYLAorfTsKKworI2RlZmluZSBUQ0FfQVRNX01BWAkoX19UQ0FfQVRNX01BWCAtIDEpCisKKy8qIE5ldHdvcmsgZW11bGF0b3IgKi8KKworZW51bSB7CisJVENBX05FVEVNX1VOU1BFQywKKwlUQ0FfTkVURU1fQ09SUiwKKwlUQ0FfTkVURU1fREVMQVlfRElTVCwKKwlUQ0FfTkVURU1fUkVPUkRFUiwKKwlUQ0FfTkVURU1fQ09SUlVQVCwKKwlUQ0FfTkVURU1fTE9TUywKKwlfX1RDQV9ORVRFTV9NQVgsCit9OworCisjZGVmaW5lIFRDQV9ORVRFTV9NQVggKF9fVENBX05FVEVNX01BWCAtIDEpCisKK3N0cnVjdCB0Y19uZXRlbV9xb3B0IHsKKwlfX3UzMglsYXRlbmN5OwkvKiBhZGRlZCBkZWxheSAodXMpICovCisJX191MzIgICBsaW1pdDsJCS8qIGZpZm8gbGltaXQgKHBhY2tldHMpICovCisJX191MzIJbG9zczsJCS8qIHJhbmRvbSBwYWNrZXQgbG9zcyAoMD1ub25lIH4wPTEwMCUpICovCisJX191MzIJZ2FwOwkJLyogcmUtb3JkZXJpbmcgZ2FwICgwIGZvciBub25lKSAqLworCV9fdTMyICAgZHVwbGljYXRlOwkvKiByYW5kb20gcGFja2V0IGR1cCAgKDA9bm9uZSB+MD0xMDAlKSAqLworCV9fdTMyCWppdHRlcjsJCS8qIHJhbmRvbSBqaXR0ZXIgaW4gbGF0ZW5jeSAodXMpICovCit9OworCitzdHJ1Y3QgdGNfbmV0ZW1fY29yciB7CisJX191MzIJZGVsYXlfY29ycjsJLyogZGVsYXkgY29ycmVsYXRpb24gKi8KKwlfX3UzMglsb3NzX2NvcnI7CS8qIHBhY2tldCBsb3NzIGNvcnJlbGF0aW9uICovCisJX191MzIJZHVwX2NvcnI7CS8qIGR1cGxpY2F0ZSBjb3JyZWxhdGlvbiAgKi8KK307CisKK3N0cnVjdCB0Y19uZXRlbV9yZW9yZGVyIHsKKwlfX3UzMglwcm9iYWJpbGl0eTsKKwlfX3UzMgljb3JyZWxhdGlvbjsKK307CisKK3N0cnVjdCB0Y19uZXRlbV9jb3JydXB0IHsKKwlfX3UzMglwcm9iYWJpbGl0eTsKKwlfX3UzMgljb3JyZWxhdGlvbjsKK307CisKK2VudW0geworCU5FVEVNX0xPU1NfVU5TUEVDLAorCU5FVEVNX0xPU1NfR0ksCQkvKiBHZW5lcmFsIEludHVpdGl2ZSAtIDQgc3RhdGUgbW9kZWwgKi8KKwlORVRFTV9MT1NTX0dFLAkJLyogR2lsYmVydCBFbGxpb3QgbW9kZWxzICovCisJX19ORVRFTV9MT1NTX01BWAorfTsKKyNkZWZpbmUgTkVURU1fTE9TU19NQVggKF9fTkVURU1fTE9TU19NQVggLSAxKQorCisvKiBTdGF0ZSB0cmFuc2l0aW9uIHByb2JhYmlsaXRpZXMgZm9yIDQgc3RhdGUgbW9kZWwgKi8KK3N0cnVjdCB0Y19uZXRlbV9naW1vZGVsIHsKKwlfX3UzMglwMTM7CisJX191MzIJcDMxOworCV9fdTMyCXAzMjsKKwlfX3UzMglwMTQ7CisJX191MzIJcDIzOworfTsKKworLyogR2lsYmVydC1FbGxpb3QgbW9kZWxzICovCitzdHJ1Y3QgdGNfbmV0ZW1fZ2Vtb2RlbCB7CisJX191MzIgcDsKKwlfX3UzMiByOworCV9fdTMyIGg7CisJX191MzIgazE7Cit9OworCisjZGVmaW5lIE5FVEVNX0RJU1RfU0NBTEUJODE5MgorI2RlZmluZSBORVRFTV9ESVNUX01BWAkJMTYzODQKKworLyogRFJSICovCisKK2VudW0geworCVRDQV9EUlJfVU5TUEVDLAorCVRDQV9EUlJfUVVBTlRVTSwKKwlfX1RDQV9EUlJfTUFYCit9OworCisjZGVmaW5lIFRDQV9EUlJfTUFYCShfX1RDQV9EUlJfTUFYIC0gMSkKKworc3RydWN0IHRjX2Rycl9zdGF0cyB7CisJX191MzIJZGVmaWNpdDsKK307CisKKy8qIE1RUFJJTyAqLworI2RlZmluZSBUQ19RT1BUX0JJVE1BU0sgMTUKKyNkZWZpbmUgVENfUU9QVF9NQVhfUVVFVUUgMTYKKworc3RydWN0IHRjX21xcHJpb19xb3B0IHsKKwlfX3U4CW51bV90YzsKKwlfX3U4CXByaW9fdGNfbWFwW1RDX1FPUFRfQklUTUFTSyArIDFdOworCV9fdTgJaHc7CisJX191MTYJY291bnRbVENfUU9QVF9NQVhfUVVFVUVdOworCV9fdTE2CW9mZnNldFtUQ19RT1BUX01BWF9RVUVVRV07Cit9OworCisvKiBTRkIgKi8KKworZW51bSB7CisJVENBX1NGQl9VTlNQRUMsCisJVENBX1NGQl9QQVJNUywKKwlfX1RDQV9TRkJfTUFYLAorfTsKKworI2RlZmluZSBUQ0FfU0ZCX01BWCAoX19UQ0FfU0ZCX01BWCAtIDEpCisKKy8qCisgKiBOb3RlOiBpbmNyZW1lbnQsIGRlY3JlbWVudCBhcmUgUTAuMTYgZml4ZWQtcG9pbnQgdmFsdWVzLgorICovCitzdHJ1Y3QgdGNfc2ZiX3FvcHQgeworCV9fdTMyIHJlaGFzaF9pbnRlcnZhbDsJLyogZGVsYXkgYmV0d2VlbiBoYXNoIG1vdmUsIGluIG1zICovCisJX191MzIgd2FybXVwX3RpbWU7CS8qIGRvdWJsZSBidWZmZXJpbmcgd2FybXVwIHRpbWUgaW4gbXMgKHdhcm11cF90aW1lIDwgcmVoYXNoX2ludGVydmFsKSAqLworCV9fdTMyIG1heDsJCS8qIG1heCBsZW4gb2YgcWxlbl9taW4gKi8KKwlfX3UzMiBiaW5fc2l6ZTsJCS8qIG1heGltdW0gcXVldWUgbGVuZ3RoIHBlciBiaW4gKi8KKwlfX3UzMiBpbmNyZW1lbnQ7CS8qIHByb2JhYmlsaXR5IGluY3JlbWVudCwgKGQxIGluIEJsdWUpICovCisJX191MzIgZGVjcmVtZW50OwkvKiBwcm9iYWJpbGl0eSBkZWNyZW1lbnQsIChkMiBpbiBCbHVlKSAqLworCV9fdTMyIGxpbWl0OwkJLyogbWF4IFNGQiBxdWV1ZSBsZW5ndGggKi8KKwlfX3UzMiBwZW5hbHR5X3JhdGU7CS8qIGluZWxhc3RpYyBmbG93cyBhcmUgcmF0ZSBsaW1pdGVkIHRvICdyYXRlJyBwcHMgKi8KKwlfX3UzMiBwZW5hbHR5X2J1cnN0OworfTsKKworc3RydWN0IHRjX3NmYl94c3RhdHMgeworCV9fdTMyIGVhcmx5ZHJvcDsKKwlfX3UzMiBwZW5hbHR5ZHJvcDsKKwlfX3UzMiBidWNrZXRkcm9wOworCV9fdTMyIHF1ZXVlZHJvcDsKKwlfX3UzMiBjaGlsZGRyb3A7IC8qIGRyb3BzIGluIGNoaWxkIHFkaXNjICovCisJX191MzIgbWFya2VkOworCV9fdTMyIG1heHFsZW47CisJX191MzIgbWF4cHJvYjsKKwlfX3UzMiBhdmdwcm9iOworfTsKKworI2RlZmluZSBTRkJfTUFYX1BST0IgMHhGRkZGCisKKy8qIFFGUSAqLworZW51bSB7CisJVENBX1FGUV9VTlNQRUMsCisJVENBX1FGUV9XRUlHSFQsCisJVENBX1FGUV9MTUFYLAorCV9fVENBX1FGUV9NQVgKK307CisKKyNkZWZpbmUgVENBX1FGUV9NQVgJKF9fVENBX1FGUV9NQVggLSAxKQorCitzdHJ1Y3QgdGNfcWZxX3N0YXRzIHsKKwlfX3UzMiB3ZWlnaHQ7CisJX191MzIgbG1heDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wa3RjZHZkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BrdGNkdmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzMxZWI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wa3RjZHZkLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgSmVucyBBeGJvZSA8YXhib2VAc3VzZS5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFBldGVyIE9zdGVybHVuZCA8cGV0ZXJvMkB0ZWxpYS5jb20+CisgKgorICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIFBhY2tldCB3cml0aW5nIGxheWVyIGZvciBBVEFQSSBhbmQgU0NTSSBDRC1SLCBDRC1SVywgRFZELVIsIGFuZAorICogRFZELVJXIGRldmljZXMuCisgKgorICovCisjaWZuZGVmIF9fUEtUQ0RWRF9ICisjZGVmaW5lIF9fUEtUQ0RWRF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogMSBmb3Igbm9ybWFsIGRlYnVnIG1lc3NhZ2VzLCAyIGlzIHZlcnkgdmVyYm9zZS4gMCB0byB0dXJuIGl0IG9mZi4KKyAqLworI2RlZmluZSBQQUNLRVRfREVCVUcJCTEKKworI2RlZmluZQlNQVhfV1JJVEVSUwkJOAorCisjZGVmaW5lIFBLVF9SQl9QT09MX1NJWkUJNTEyCisKKy8qCisgKiBIb3cgbG9uZyB3ZSBzaG91bGQgaG9sZCBhIG5vbi1mdWxsIHBhY2tldCBiZWZvcmUgc3RhcnRpbmcgZGF0YSBnYXRoZXJpbmcuCisgKi8KKyNkZWZpbmUgUEFDS0VUX1dBSVRfVElNRQkoSFogKiA1IC8gMTAwMCkKKworLyoKKyAqIHVzZSBkcml2ZSB3cml0ZSBjYWNoaW5nIC0tIHdlIG5lZWQgZGVmZXJyZWQgZXJyb3IgaGFuZGxpbmcgdG8gYmUKKyAqIGFibGUgdG8gc3VjY2Vzc2Z1bGx5IHJlY292ZXIgd2l0aCB0aGlzIG9wdGlvbiAoZHJpdmUgd2lsbCByZXR1cm4gZ29vZAorICogc3RhdHVzIGFzIHNvb24gYXMgdGhlIGNkYiBpcyB2YWxpZGF0ZWQpLgorICovCisjaWYgZGVmaW5lZChDT05GSUdfQ0RST01fUEtUQ0RWRF9XQ0FDSEUpCisjZGVmaW5lIFVTRV9XQ0FDSElORwkJMQorI2Vsc2UKKyNkZWZpbmUgVVNFX1dDQUNISU5HCQkwCisjZW5kaWYKKworLyoKKyAqIE5vIHVzZXItc2VydmljYWJsZSBwYXJ0cyBiZXlvbmQgdGhpcyBwb2ludCAtPgorICovCisKKy8qCisgKiBkZXZpY2UgdHlwZXMKKyAqLworI2RlZmluZSBQQUNLRVRfQ0RSCQkxCisjZGVmaW5lCVBBQ0tFVF9DRFJXCQkyCisjZGVmaW5lIFBBQ0tFVF9EVkRSCQkzCisjZGVmaW5lIFBBQ0tFVF9EVkRSVwkJNAorCisvKgorICogZmxhZ3MKKyAqLworI2RlZmluZSBQQUNLRVRfV1JJVEFCTEUJCTEJLyogcGQgaXMgd3JpdGFibGUgKi8KKyNkZWZpbmUgUEFDS0VUX05XQV9WQUxJRAkyCS8qIG5leHQgd3JpdGFibGUgYWRkcmVzcyB2YWxpZCAqLworI2RlZmluZSBQQUNLRVRfTFJBX1ZBTElECTMJLyogbGFzdCByZWNvcmRlZCBhZGRyZXNzIHZhbGlkICovCisjZGVmaW5lIFBBQ0tFVF9NRVJHRV9TRUdTCTQJLyogcGVyZm9ybSBzZWdtZW50IG1lcmdpbmcgdG8ga2VlcCAqLworCQkJCQkvKiB1bmRlcmx5aW5nIGNkcm9tIGRldmljZSBoYXBweSAqLworCisvKgorICogRGlzYyBzdGF0dXMgLS0gZnJvbSBSRUFEX0RJU0NfSU5GTworICovCisjZGVmaW5lIFBBQ0tFVF9ESVNDX0VNUFRZCTAKKyNkZWZpbmUgUEFDS0VUX0RJU0NfSU5DT01QTEVURQkxCisjZGVmaW5lIFBBQ0tFVF9ESVNDX0NPTVBMRVRFCTIKKyNkZWZpbmUgUEFDS0VUX0RJU0NfT1RIRVIJMworCisvKgorICogd3JpdGUgdHlwZSwgYW5kIGNvcnJlc3BvbmRpbmcgZGF0YSBibG9jayB0eXBlCisgKi8KKyNkZWZpbmUgUEFDS0VUX01PREUxCQkxCisjZGVmaW5lIFBBQ0tFVF9NT0RFMgkJMgorI2RlZmluZSBQQUNLRVRfQkxPQ0tfTU9ERTEJOAorI2RlZmluZSBQQUNLRVRfQkxPQ0tfTU9ERTIJMTAKKworLyoKKyAqIExhc3Qgc2Vzc2lvbi9ib3JkZXIgc3RhdHVzCisgKi8KKyNkZWZpbmUgUEFDS0VUX1NFU1NJT05fRU1QVFkJCTAKKyNkZWZpbmUgUEFDS0VUX1NFU1NJT05fSU5DT01QTEVURQkxCisjZGVmaW5lIFBBQ0tFVF9TRVNTSU9OX1JFU0VSVkVECQkyCisjZGVmaW5lIFBBQ0tFVF9TRVNTSU9OX0NPTVBMRVRFCQkzCisKKyNkZWZpbmUgUEFDS0VUX01DTgkJCSI0YTY1NmU3MzQxNzg2MjZmNjUzMjMwMzAzMDAwMDAiCisKKyN1bmRlZiBQQUNLRVRfVVNFX0xTCisKKyNkZWZpbmUgUEtUX0NUUkxfQ01EX1NFVFVQCTAKKyNkZWZpbmUgUEtUX0NUUkxfQ01EX1RFQVJET1dOCTEKKyNkZWZpbmUgUEtUX0NUUkxfQ01EX1NUQVRVUwkyCisKK3N0cnVjdCBwa3RfY3RybF9jb21tYW5kIHsKKwlfX3UzMiBjb21tYW5kOwkJCQkvKiBpbjogU2V0dXAsIHRlYXJkb3duLCBzdGF0dXMgKi8KKwlfX3UzMiBkZXZfaW5kZXg7CQkJLyogaW4vb3V0OiBEZXZpY2UgaW5kZXggKi8KKwlfX3UzMiBkZXY7CQkJCS8qIGluL291dDogRGV2aWNlIG5yIGZvciBjZHJ3IGRldmljZSAqLworCV9fdTMyIHBrdF9kZXY7CQkJCS8qIGluL291dDogRGV2aWNlIG5yIGZvciBwYWNrZXQgZGV2aWNlICovCisJX191MzIgbnVtX2RldmljZXM7CQkJLyogb3V0OiBMYXJnZXN0IGRldmljZSBpbmRleCArIDEgKi8KKwlfX3UzMiBwYWRkaW5nOwkJCQkvKiBOb3QgdXNlZCAqLworfTsKKworLyoKKyAqIHBhY2tldCBpb2N0bHMKKyAqLworI2RlZmluZSBQQUNLRVRfSU9DVExfTUFHSUMJKCdYJykKKyNkZWZpbmUgUEFDS0VUX0NUUkxfQ01ECQlfSU9XUihQQUNLRVRfSU9DVExfTUFHSUMsIDEsIHN0cnVjdCBwa3RfY3RybF9jb21tYW5kKQorCisKKyNlbmRpZiAvKiBfX1BLVENEVkRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wbXUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcG11LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE3NzM5OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcG11LmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGFsa2luZyB0byB0aGUgUE1VLiAgVGhlIFBNVSBpcyBhIG1pY3JvY29udHJvbGxlcgorICogd2hpY2ggY29udHJvbHMgYmF0dGVyeSBjaGFyZ2luZyBhbmQgc3lzdGVtIHBvd2VyIG9uIFBvd2VyQm9vayAzNDAwCisgKiBhbmQgMjQwMCBtb2RlbHMgYXMgd2VsbCBhcyB0aGUgUlRDIGFuZCB2YXJpb3VzIG90aGVyIHRoaW5ncy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggUGF1bCBNYWNrZXJyYXMuCisgKi8KKworCisjZGVmaW5lIFBNVV9EUklWRVJfVkVSU0lPTgkyCisKKy8qCisgKiBQTVUgY29tbWFuZHMKKyAqLworI2RlZmluZSBQTVVfUE9XRVJfQ1RSTDAJCTB4MTAJLyogY29udHJvbCBwb3dlciBvZiBzb21lIGRldmljZXMgKi8KKyNkZWZpbmUgUE1VX1BPV0VSX0NUUkwJCTB4MTEJLyogY29udHJvbCBwb3dlciBvZiBzb21lIGRldmljZXMgKi8KKyNkZWZpbmUgUE1VX0FEQl9DTUQJCTB4MjAJLyogc2VuZCBBREIgcGFja2V0ICovCisjZGVmaW5lIFBNVV9BREJfUE9MTF9PRkYJMHgyMQkvKiBkaXNhYmxlIEFEQiBhdXRvLXBvbGwgKi8KKyNkZWZpbmUgUE1VX1dSSVRFX05WUkFNCQkweDMzCS8qIHdyaXRlIG5vbi12b2xhdGlsZSBSQU0gKi8KKyNkZWZpbmUgUE1VX1JFQURfTlZSQU0JCTB4M2IJLyogcmVhZCBub24tdm9sYXRpbGUgUkFNICovCisjZGVmaW5lIFBNVV9TRVRfUlRDCQkweDMwCS8qIHNldCByZWFsLXRpbWUgY2xvY2sgKi8KKyNkZWZpbmUgUE1VX1JFQURfUlRDCQkweDM4CS8qIHJlYWQgcmVhbC10aW1lIGNsb2NrICovCisjZGVmaW5lIFBNVV9TRVRfVk9MQlVUVE9OCTB4NDAJLyogc2V0IHZvbHVtZSB1cC9kb3duIHBvc2l0aW9uICovCisjZGVmaW5lIFBNVV9CQUNLTElHSFRfQlJJR0hUCTB4NDEJLyogc2V0IGJhY2tsaWdodCBicmlnaHRuZXNzICovCisjZGVmaW5lIFBNVV9HRVRfVk9MQlVUVE9OCTB4NDgJLyogZ2V0IHZvbHVtZSB1cC9kb3duIHBvc2l0aW9uICovCisjZGVmaW5lIFBNVV9QQ0VKRUNUCQkweDRjCS8qIGVqZWN0IFBDLWNhcmQgZnJvbSBzbG90ICovCisjZGVmaW5lIFBNVV9CQVRURVJZX1NUQVRFCTB4NmIJLyogcmVwb3J0IGJhdHRlcnkgc3RhdGUgZXRjLiAqLworI2RlZmluZSBQTVVfU01BUlRfQkFUVEVSWV9TVEFURQkweDZmCS8qIHJlcG9ydCBiYXR0ZXJ5IHN0YXRlIChuZXcgd2F5KSAqLworI2RlZmluZSBQTVVfU0VUX0lOVFJfTUFTSwkweDcwCS8qIHNldCBQTVUgaW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUgUE1VX0lOVF9BQ0sJCTB4NzgJLyogcmVhZCBpbnRlcnJ1cHQgYml0cyAqLworI2RlZmluZSBQTVVfU0hVVERPV04JCTB4N2UJLyogdHVybiBwb3dlciBvZmYgKi8KKyNkZWZpbmUgUE1VX0NQVV9TUEVFRAkJMHg3ZAkvKiBjb250cm9sIENQVSBzcGVlZCBvbiBzb21lIG1vZGVscyAqLworI2RlZmluZSBQTVVfU0xFRVAJCTB4N2YJLyogcHV0IENQVSB0byBzbGVlcCAqLworI2RlZmluZSBQTVVfUE9XRVJfRVZFTlRTCTB4OGYJLyogU2VuZCBwb3dlci1ldmVudCBjb21tYW5kcyB0byBQTVUgKi8KKyNkZWZpbmUgUE1VX0kyQ19DTUQJCTB4OWEJLyogSTJDIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgUE1VX1JFU0VUCQkweGQwCS8qIHJlc2V0IENQVSAqLworI2RlZmluZSBQTVVfR0VUX0JSSUdIVEJVVFRPTgkweGQ5CS8qIHJlcG9ydCBicmlnaHRuZXNzIHVwL2Rvd24gcG9zICovCisjZGVmaW5lIFBNVV9HRVRfQ09WRVIJCTB4ZGMJLyogcmVwb3J0IGNvdmVyIG9wZW4vY2xvc2VkICovCisjZGVmaW5lIFBNVV9TWVNURU1fUkVBRFkJMHhkZgkvKiB0ZWxsIFBNVSB3ZSBhcmUgYXdha2UgKi8KKyNkZWZpbmUgUE1VX0dFVF9WRVJTSU9OCQkweGVhCS8qIHJlYWQgdGhlIFBNVSB2ZXJzaW9uICovCisKKy8qIEJpdHMgdG8gdXNlIHdpdGggdGhlIFBNVV9QT1dFUl9DVFJMMCBjb21tYW5kICovCisjZGVmaW5lIFBNVV9QT1cwX09OCQkweDgwCS8qIE9SIHRoaXMgdG8gcG93ZXIgT04gdGhlIGRldmljZSAqLworI2RlZmluZSBQTVVfUE9XMF9PRkYJCTB4MDAJLyogbGVhdmUgYml0IDcgdG8gMCB0byBwb3dlciBpdCBPRkYgKi8KKyNkZWZpbmUgUE1VX1BPVzBfSEFSRF9EUklWRQkweDA0CS8qIEhhcmQgZHJpdmUgcG93ZXIgKG9uIHdhbGxzdHJlZXQvbG9tYmFyZCA/KSAqLworCisvKiBCaXRzIHRvIHVzZSB3aXRoIHRoZSBQTVVfUE9XRVJfQ1RSTCBjb21tYW5kICovCisjZGVmaW5lIFBNVV9QT1dfT04JCTB4ODAJLyogT1IgdGhpcyB0byBwb3dlciBPTiB0aGUgZGV2aWNlICovCisjZGVmaW5lIFBNVV9QT1dfT0ZGCQkweDAwCS8qIGxlYXZlIGJpdCA3IHRvIDAgdG8gcG93ZXIgaXQgT0ZGICovCisjZGVmaW5lIFBNVV9QT1dfQkFDS0xJR0hUCTB4MDEJLyogYmFja2xpZ2h0IHBvd2VyICovCisjZGVmaW5lIFBNVV9QT1dfQ0hBUkdFUgkJMHgwMgkvKiBiYXR0ZXJ5IGNoYXJnZXIgcG93ZXIgKi8KKyNkZWZpbmUgUE1VX1BPV19JUkxFRAkJMHgwNAkvKiBJUiBsZWQgcG93ZXIgKG9uIHdhbGxzdHJlZXQpICovCisjZGVmaW5lIFBNVV9QT1dfTUVESUFCQVkJMHgwOAkvKiBtZWRpYSBiYXkgcG93ZXIgKHdhbGxzdHJlZXQvbG9tYmFyZCA/KSAqLworCisvKiBCaXRzIGluIFBNVSBpbnRlcnJ1cHQgYW5kIGludGVycnVwdCBtYXNrIGJ5dGVzICovCisjZGVmaW5lIFBNVV9JTlRfUENFSkVDVAkJMHgwNAkvKiBQQy1jYXJkIGVqZWN0IGJ1dHRvbnMgKi8KKyNkZWZpbmUgUE1VX0lOVF9TTkRCUlQJCTB4MDgJLyogc291bmQvYnJpZ2h0bmVzcyB1cC9kb3duIGJ1dHRvbnMgKi8KKyNkZWZpbmUgUE1VX0lOVF9BREIJCTB4MTAJLyogQURCIGF1dG9wb2xsIG9yIHJlcGx5IGRhdGEgKi8KKyNkZWZpbmUgUE1VX0lOVF9CQVRURVJZCQkweDIwCS8qIEJhdHRlcnkgc3RhdGUgY2hhbmdlICovCisjZGVmaW5lIFBNVV9JTlRfRU5WSVJPTk1FTlQJMHg0MAkvKiBFbnZpcm9ubWVudCBpbnRlcnJ1cHRzICovCisjZGVmaW5lIFBNVV9JTlRfVElDSwkJMHg4MAkvKiAxLXNlY29uZCB0aWNrIGludGVycnVwdCAqLworCisvKiBPdGhlciBiaXRzIGluIFBNVSBpbnRlcnJ1cHQgdmFsaWQgd2hlbiBQTVVfSU5UX0FEQiBpcyBzZXQgKi8KKyNkZWZpbmUgUE1VX0lOVF9BREJfQVVUTwkweDA0CS8qIEFEQiBhdXRvcG9sbCwgd2hlbiBQTVVfSU5UX0FEQiAqLworI2RlZmluZSBQTVVfSU5UX1dBSVRJTkdfQ0hBUkdFUgkweDAxCS8qID8/PyAqLworI2RlZmluZSBQTVVfSU5UX0FVVE9fU1JRX1BPTEwJMHgwMgkvKiA/Pz8gKi8KKworLyogQml0cyBpbiB0aGUgZW52aXJvbmVtZW50IG1lc3NhZ2UgKGVpdGhlciBvYnRhaW5lZCB2aWEgUE1VX0dFVF9DT1ZFUiwKKyAqIG9yIHZpYSBQTVVfSU5UX0VOVklST05NRU5UIG9uIGNvcmU5OSAqLworI2RlZmluZSBQTVVfRU5WX0xJRF9DTE9TRUQJMHgwMQkvKiBUaGUgbGlkIGlzIGNsb3NlZCAqLworCisvKiBJMkMgcmVsYXRlZCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBQTVVfSTJDX01PREVfU0lNUExFCTAKKyNkZWZpbmUgUE1VX0kyQ19NT0RFX1NURFNVQgkxCisjZGVmaW5lIFBNVV9JMkNfTU9ERV9DT01CSU5FRAkyCisKKyNkZWZpbmUgUE1VX0kyQ19CVVNfU1RBVFVTCTAKKyNkZWZpbmUgUE1VX0kyQ19CVVNfU1lTQ0xLCTEKKyNkZWZpbmUgUE1VX0kyQ19CVVNfUE9XRVIJMgorCisjZGVmaW5lIFBNVV9JMkNfU1RBVFVTX09LCTAKKyNkZWZpbmUgUE1VX0kyQ19TVEFUVVNfREFUQVJFQUQJMQorI2RlZmluZSBQTVVfSTJDX1NUQVRVU19CVVNZCTB4ZmUKKworCisvKiBLaW5kIG9mIFBNVSAobW9kZWwpICovCitlbnVtIHsKKwlQTVVfVU5LTk9XTiwKKwlQTVVfT0hBUkVfQkFTRUQsCS8qIDI0MDAsIDM0MDAsIDM1MDAgKG9sZCBHMyBwb3dlcmJvb2spICovCisJUE1VX0hFQVRIUk9XX0JBU0VELAkvKiBQb3dlckJvb2sgRzMgc2VyaWVzICovCisJUE1VX1BBRERJTkdUT05fQkFTRUQsCS8qIDE5OTkgUG93ZXJCb29rIEczICovCisJUE1VX0tFWUxBUkdPX0JBU0VELAkvKiBDb3JlOTkgbW90aGVyYm9hcmQgKFBNVTk5KSAqLworCVBNVV82OEtfVjEsCQkvKiA2OEsgUE1VLCB2ZXJzaW9uIDEgKi8KKwlQTVVfNjhLX1YyLCAJCS8qIDY4SyBQTVUsIHZlcnNpb24gMiAqLworfTsKKworLyogUE1VIFBNVV9QT1dFUl9FVkVOVFMgY29tbWFuZHMgKi8KK2VudW0geworCVBNVV9QV1JfR0VUX1BPV0VSVVBfRVZFTlRTCT0gMHgwMCwKKwlQTVVfUFdSX1NFVF9QT1dFUlVQX0VWRU5UUwk9IDB4MDEsCisJUE1VX1BXUl9DTFJfUE9XRVJVUF9FVkVOVFMJPSAweDAyLAorCVBNVV9QV1JfR0VUX1dBS0VVUF9FVkVOVFMJPSAweDAzLAorCVBNVV9QV1JfU0VUX1dBS0VVUF9FVkVOVFMJPSAweDA0LAorCVBNVV9QV1JfQ0xSX1dBS0VVUF9FVkVOVFMJPSAweDA1LAorfTsKKworLyogUG93ZXIgZXZlbnRzIHdha2V1cCBiaXRzICovCitlbnVtIHsKKwlQTVVfUFdSX1dBS0VVUF9LRVkJCT0gMHgwMSwJLyogV2FrZSBvbiBrZXkgcHJlc3MgKi8KKwlQTVVfUFdSX1dBS0VVUF9BQ19JTlNFUlQJPSAweDAyLCAvKiBXYWtlIG9uIEFDIGFkYXB0ZXIgcGx1ZyAqLworCVBNVV9QV1JfV0FLRVVQX0FDX0NIQU5HRQk9IDB4MDQsCisJUE1VX1BXUl9XQUtFVVBfTElEX09QRU4JCT0gMHgwOCwKKwlQTVVfUFdSX1dBS0VVUF9SSU5HCQk9IDB4MTAsCit9OworCQorLyoKKyAqIElvY3RsIGNvbW1hbmRzIGZvciB0aGUgL2Rldi9wbXUgZGV2aWNlCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisvKiBubyBwYXJhbSAqLworI2RlZmluZSBQTVVfSU9DX1NMRUVQCQlfSU8oJ0InLCAwKQorLyogb3V0IHBhcmFtOiB1MzIqCWJhY2tsaWdodCB2YWx1ZTogMCB0byAxNSAqLworI2RlZmluZSBQTVVfSU9DX0dFVF9CQUNLTElHSFQJX0lPUignQicsIDEsIHNpemVfdCkKKy8qIGluIHBhcmFtOiB1MzIJYmFja2xpZ2h0IHZhbHVlOiAwIHRvIDE1ICovCisjZGVmaW5lIFBNVV9JT0NfU0VUX0JBQ0tMSUdIVAlfSU9XKCdCJywgMiwgc2l6ZV90KQorLyogb3V0IHBhcmFtOiB1MzIqCVBNVSBtb2RlbCAqLworI2RlZmluZSBQTVVfSU9DX0dFVF9NT0RFTAlfSU9SKCdCJywgMywgc2l6ZV90KQorLyogb3V0IHBhcmFtOiB1MzIqCWhhc19hZGI6IDAgb3IgMSAqLworI2RlZmluZSBQTVVfSU9DX0hBU19BREIJCV9JT1IoJ0InLCA0LCBzaXplX3QpIAorLyogb3V0IHBhcmFtOiB1MzIqCWNhbl9zbGVlcDogMCBvciAxICovCisjZGVmaW5lIFBNVV9JT0NfQ0FOX1NMRUVQCV9JT1IoJ0InLCA1LCBzaXplX3QpIAorLyogbm8gcGFyYW0sIGJ1dCBoaXN0b3JpY2FsbHkgd2FzIF9JT1IoJ0InLCA2LCAwKSwgbWVhbmluZyA0IGJ5dGVzICovCisjZGVmaW5lIFBNVV9JT0NfR1JBQl9CQUNLTElHSFQJX0lPUignQicsIDYsIHNpemVfdCkgCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcG9sbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wb2xsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxYjMwNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcG9sbC5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfTElOVVhfUE9MTF9ICisjZGVmaW5lIF9MSU5VWF9QT0xMX0gKKworI2luY2x1ZGUgPGFzbS9wb2xsLmg+CisKKworI2VuZGlmIC8qIF9MSU5VWF9QT0xMX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcG9zaXhfdHlwZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcG9zaXhfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDRjOThjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wb3NpeF90eXBlcy5oCkBAIC0wLDAgKzEsNDkgQEAKKyNpZm5kZWYgX0xJTlVYX1BPU0lYX1RZUEVTX0gKKyNkZWZpbmUgX0xJTlVYX1BPU0lYX1RZUEVTX0gKKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorCisvKgorICogVGhpcyBhbGxvd3MgZm9yIDEwMjQgZmlsZSBkZXNjcmlwdG9yczogaWYgTlJfT1BFTiBpcyBldmVyIGdyb3duCisgKiBiZXlvbmQgdGhhdCB5b3UnbGwgaGF2ZSB0byBjaGFuZ2UgdGhpcyB0b28uIEJ1dCAxMDI0IGZkJ3Mgc2VlbSB0byBiZQorICogZW5vdWdoIGV2ZW4gZm9yIHN1Y2ggInJlYWwiIHVuaWNlcyBsaWtlIE9TRi8xLCBzbyBob3BlZnVsbHkgdGhpcyBpcworICogb25lIGxpbWl0IHRoYXQgZG9lc24ndCBoYXZlIHRvIGJlIGNoYW5nZWQgW2FnYWluXS4KKyAqCisgKiBOb3RlIHRoYXQgUE9TSVggd2FudHMgdGhlIEZEX0NMRUFSKGZkLGZkc2V0cCkgZGVmaW5lcyB0byBiZSBpbgorICogPHN5cy90aW1lLmg+IChhbmQgdGh1cyA8bGludXgvdGltZS5oPikgLSBidXQgdGhpcyBpcyBhIG1vcmUgbG9naWNhbAorICogcGxhY2UgZm9yIHRoZW0uIFNvbHZlZCBieSBoYXZpbmcgZHVtbXkgZGVmaW5lcyBpbiA8c3lzL3RpbWUuaD4uCisgKi8KKworLyoKKyAqIFRob3NlIG1hY3JvcyBtYXkgaGF2ZSBiZWVuIGRlZmluZWQgaW4gPGdudS90eXBlcy5oPi4gQnV0IHdlIGFsd2F5cworICogdXNlIHRoZSBvbmVzIGhlcmUuIAorICovCisjdW5kZWYgX19ORkRCSVRTCisjZGVmaW5lIF9fTkZEQklUUwkoOCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkKKworI3VuZGVmIF9fRkRfU0VUU0laRQorI2RlZmluZSBfX0ZEX1NFVFNJWkUJMTAyNAorCisjdW5kZWYgX19GRFNFVF9MT05HUworI2RlZmluZSBfX0ZEU0VUX0xPTkdTCShfX0ZEX1NFVFNJWkUvX19ORkRCSVRTKQorCisjdW5kZWYgX19GREVMVAorI2RlZmluZQlfX0ZERUxUKGQpCSgoZCkgLyBfX05GREJJVFMpCisKKyN1bmRlZiBfX0ZETUFTSworI2RlZmluZQlfX0ZETUFTSyhkKQkoMVVMIDw8ICgoZCkgJSBfX05GREJJVFMpKQorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBmZHNfYml0cyBbX19GRFNFVF9MT05HU107Cit9IF9fa2VybmVsX2ZkX3NldDsKKworLyogVHlwZSBvZiBhIHNpZ25hbCBoYW5kbGVyLiAgKi8KK3R5cGVkZWYgdm9pZCAoKl9fa2VybmVsX3NpZ2hhbmRsZXJfdCkoaW50KTsKKworLyogVHlwZSBvZiBhIFNZU1YgSVBDIGtleS4gICovCit0eXBlZGVmIGludCBfX2tlcm5lbF9rZXlfdDsKK3R5cGVkZWYgaW50IF9fa2VybmVsX21xZF90OworCisjaW5jbHVkZSA8YXNtL3Bvc2l4X3R5cGVzLmg+CisKKyNlbmRpZiAvKiBfTElOVVhfUE9TSVhfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wcGRldi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wcGRldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMThjNWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BwZGV2LmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIGxpbnV4L2luY2x1ZGUvbGludXgvcHBkZXYuaAorICoKKyAqIFVzZXItc3BhY2UgcGFyYWxsZWwgcG9ydCBkZXZpY2UgZHJpdmVyIChoZWFkZXIgZmlsZSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LTkgVGltIFdhdWdoIDx0aW1AY3liZXJlbGsuZGVtb24uY28udWs+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBZGRlZCBQUEdFVFRJTUUvUFBTRVRUSU1FLCBGcmVkIEJhcm5lcywgMTk5OQorICogQWRkZWQgUFBHRVRNT0RFUy9QUEdFVE1PREUvUFBHRVRQSEFTRSwgRnJlZCBCYXJuZXMgPGZybWIyQHVrYy5hYy51az4sIDAzLzAxLzIwMDEKKyAqLworCisjZGVmaW5lIFBQX0lPQ1RMCSdwJworCisvKiBTZXQgbW9kZSBmb3IgcmVhZC93cml0ZSAoZS5nLiBJRUVFMTI4NF9NT0RFX0VQUCkgKi8KKyNkZWZpbmUgUFBTRVRNT0RFCV9JT1coUFBfSU9DVEwsIDB4ODAsIGludCkKKworLyogUmVhZCBzdGF0dXMgKi8KKyNkZWZpbmUgUFBSU1RBVFVTCV9JT1IoUFBfSU9DVEwsIDB4ODEsIHVuc2lnbmVkIGNoYXIpCisjZGVmaW5lIFBQV1NUQVRVUwlPQlNPTEVURV9fSU9XKFBQX0lPQ1RMLCAweDgyLCB1bnNpZ25lZCBjaGFyKQorCisvKiBSZWFkL3dyaXRlIGNvbnRyb2wgKi8KKyNkZWZpbmUgUFBSQ09OVFJPTAlfSU9SKFBQX0lPQ1RMLCAweDgzLCB1bnNpZ25lZCBjaGFyKQorI2RlZmluZSBQUFdDT05UUk9MCV9JT1coUFBfSU9DVEwsIDB4ODQsIHVuc2lnbmVkIGNoYXIpCisKK3N0cnVjdCBwcGRldl9mcm9iX3N0cnVjdCB7CisJdW5zaWduZWQgY2hhciBtYXNrOworCXVuc2lnbmVkIGNoYXIgdmFsOworfTsKKyNkZWZpbmUgUFBGQ09OVFJPTCAgICAgIF9JT1coUFBfSU9DVEwsIDB4OGUsIHN0cnVjdCBwcGRldl9mcm9iX3N0cnVjdCkKKworLyogUmVhZC93cml0ZSBkYXRhICovCisjZGVmaW5lIFBQUkRBVEEJCV9JT1IoUFBfSU9DVEwsIDB4ODUsIHVuc2lnbmVkIGNoYXIpCisjZGVmaW5lIFBQV0RBVEEJCV9JT1coUFBfSU9DVEwsIDB4ODYsIHVuc2lnbmVkIGNoYXIpCisKKy8qIFJlYWQvd3JpdGUgZWNvbnRyb2wgKG5vdCB1c2VkKSAqLworI2RlZmluZSBQUFJFQ09OVFJPTAlPQlNPTEVURV9fSU9SKFBQX0lPQ1RMLCAweDg3LCB1bnNpZ25lZCBjaGFyKQorI2RlZmluZSBQUFdFQ09OVFJPTAlPQlNPTEVURV9fSU9XKFBQX0lPQ1RMLCAweDg4LCB1bnNpZ25lZCBjaGFyKQorCisvKiBSZWFkL3dyaXRlIEZJRk8gKG5vdCB1c2VkKSAqLworI2RlZmluZSBQUFJGSUZPCQlPQlNPTEVURV9fSU9SKFBQX0lPQ1RMLCAweDg5LCB1bnNpZ25lZCBjaGFyKQorI2RlZmluZSBQUFdGSUZPCQlPQlNPTEVURV9fSU9XKFBQX0lPQ1RMLCAweDhhLCB1bnNpZ25lZCBjaGFyKQorCisvKiBDbGFpbSB0aGUgcG9ydCB0byBzdGFydCB1c2luZyBpdCAqLworI2RlZmluZSBQUENMQUlNCQlfSU8oUFBfSU9DVEwsIDB4OGIpCisKKy8qIFJlbGVhc2UgdGhlIHBvcnQgd2hlbiB5b3UgYXJlbid0IHVzaW5nIGl0ICovCisjZGVmaW5lIFBQUkVMRUFTRQlfSU8oUFBfSU9DVEwsIDB4OGMpCisKKy8qIFlpZWxkIHRoZSBwb3J0IChyZWxlYXNlIGl0IGlmIGFub3RoZXIgZHJpdmVyIGlzIHdhaXRpbmcsCisgKiB0aGVuIHJlY2xhaW0pICovCisjZGVmaW5lIFBQWUlFTEQJCV9JTyhQUF9JT0NUTCwgMHg4ZCkKKworLyogUmVnaXN0ZXIgZGV2aWNlIGV4Y2x1c2l2ZWx5IChtdXN0IGJlIGJlZm9yZSBQUENMQUlNKS4gKi8KKyNkZWZpbmUgUFBFWENMCQlfSU8oUFBfSU9DVEwsIDB4OGYpCisKKy8qIERhdGEgbGluZSBkaXJlY3Rpb246IG5vbi16ZXJvIGZvciBpbnB1dCBtb2RlLiAqLworI2RlZmluZSBQUERBVEFESVIJX0lPVyhQUF9JT0NUTCwgMHg5MCwgaW50KQorCisvKiBOZWdvdGlhdGUgYSBwYXJ0aWN1bGFyIElFRUUgMTI4NCBtb2RlLiAqLworI2RlZmluZSBQUE5FR09UCQlfSU9XKFBQX0lPQ1RMLCAweDkxLCBpbnQpCisKKy8qIFNldCBjb250cm9sIGxpbmVzIHdoZW4gYW4gaW50ZXJydXB0IG9jY3Vycy4gKi8KKyNkZWZpbmUgUFBXQ1RMT05JUlEJX0lPVyhQUF9JT0NUTCwgMHg5MiwgdW5zaWduZWQgY2hhcikKKworLyogQ2xlYXIgKGFuZCByZXR1cm4pIGludGVycnVwdCBjb3VudC4gKi8KKyNkZWZpbmUgUFBDTFJJUlEJX0lPUihQUF9JT0NUTCwgMHg5MywgaW50KQorCisvKiBTZXQgdGhlIElFRUUgMTI4NCBwaGFzZSB0aGF0IHdlJ3JlIGluIChlLmcuIElFRUUxMjg0X1BIX0ZXRF9JRExFKSAqLworI2RlZmluZSBQUFNFVFBIQVNFCV9JT1coUFBfSU9DVEwsIDB4OTQsIGludCkKKworLyogU2V0IGFuZCBnZXQgcG9ydCB0aW1lb3V0IChzdHJ1Y3QgdGltZXZhbCdzKSAqLworI2RlZmluZSBQUEdFVFRJTUUJX0lPUihQUF9JT0NUTCwgMHg5NSwgc3RydWN0IHRpbWV2YWwpCisjZGVmaW5lIFBQU0VUVElNRQlfSU9XKFBQX0lPQ1RMLCAweDk2LCBzdHJ1Y3QgdGltZXZhbCkKKworLyogR2V0IGF2YWlsYWJsZSBtb2RlcyAod2hhdCB0aGUgaGFyZHdhcmUgY2FuIGRvKSAqLworI2RlZmluZSBQUEdFVE1PREVTCV9JT1IoUFBfSU9DVEwsIDB4OTcsIHVuc2lnbmVkIGludCkKKworLyogR2V0IHRoZSBjdXJyZW50IG1vZGUgYW5kIHBoYXplICovCisjZGVmaW5lIFBQR0VUTU9ERQlfSU9SKFBQX0lPQ1RMLCAweDk4LCBpbnQpCisjZGVmaW5lIFBQR0VUUEhBU0UJX0lPUihQUF9JT0NUTCwgMHg5OSwgaW50KQorCisvKiBnZXQvc2V0IGZsYWdzICovCisjZGVmaW5lIFBQR0VURkxBR1MJX0lPUihQUF9JT0NUTCwgMHg5YSwgaW50KQorI2RlZmluZSBQUFNFVEZMQUdTCV9JT1coUFBfSU9DVEwsIDB4OWIsIGludCkKKworLyogZmxhZ3MgdmlzaWJsZSB0byB0aGUgd29ybGQgKi8KKyNkZWZpbmUgUFBfRkFTVFdSSVRFCSgxPDwyKQorI2RlZmluZSBQUF9GQVNUUkVBRAkoMTw8MykKKyNkZWZpbmUgUFBfVzkxMjg0UElDCSgxPDw0KQorCisvKiBvbmx5IG1hc2tzIHVzZXItdmlzaWJsZSBmbGFncyAqLworI2RlZmluZSBQUF9GTEFHTUFTSwkoUFBfRkFTVFdSSVRFIHwgUFBfRkFTVFJFQUQgfCBQUF9XOTEyODRQSUMpCisKKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wcHAtY29tcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wcHAtY29tcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NDhkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BwcC1jb21wLmgKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBwcHAtY29tcC5oIC0gRGVmaW5pdGlvbnMgZm9yIGRvaW5nIFBQUCBwYWNrZXQgY29tcHJlc3Npb24uCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0IFRoZSBBdXN0cmFsaWFuIE5hdGlvbmFsIFVuaXZlcnNpdHkuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCB3aXRob3V0IGFueQorICogd2FycmFudHksIGV4cHJlc3Mgb3IgaW1wbGllZC4gVGhlIEF1c3RyYWxpYW4gTmF0aW9uYWwgVW5pdmVyc2l0eQorICogbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2UuCisgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVU1RSQUxJQU4gTkFUSU9OQUwgVU5JVkVSU0lUWSBCRSBMSUFCTEUgVE8gQU5ZCisgKiBQQVJUWSBGT1IgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUgQU5EIElUUyBET0NVTUVOVEFUSU9OLCBFVkVOIElGCisgKiBUSEUgQVVTVFJBTElBTiBOQVRJT05BTCBVTklWRVJTSVRZIEhBVkUgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQorICogT0YgU1VDSCBEQU1BR0UuCisgKgorICogVEhFIEFVU1RSQUxJQU4gTkFUSU9OQUwgVU5JVkVSU0lUWSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCisgKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgU09GVFdBUkUgUFJPVklERUQgSEVSRVVOREVSIElTCisgKiBPTiBBTiAiQVMgSVMiIEJBU0lTLCBBTkQgVEhFIEFVU1RSQUxJQU4gTkFUSU9OQUwgVU5JVkVSU0lUWSBIQVMgTk8KKyAqIE9CTElHQVRJT04gVE8gUFJPVklERSBNQUlOVEVOQU5DRSwgU1VQUE9SVCwgVVBEQVRFUywgRU5IQU5DRU1FTlRTLAorICogT1IgTU9ESUZJQ0FUSU9OUy4KKyAqLworCisvKgorICogID09RklMRVZFUlNJT04gOTgwMzE5PT0KKyAqCisgKiAgTk9URSBUTyBNQUlOVEFJTkVSUzoKKyAqICAgICBJZiB5b3UgbW9kaWZ5IHRoaXMgZmlsZSBhdCBhbGwsIHBsZWFzZSBzZXQgdGhlIGFib3ZlIGRhdGUuCisgKiAgICAgcHBwLWNvbXAuaCBpcyBzaGlwcGVkIHdpdGggYSBQUFAgZGlzdHJpYnV0aW9uIGFzIHdlbGwgYXMgd2l0aCB0aGUga2VybmVsOworICogICAgIGlmIGV2ZXJ5b25lIGluY3JlYXNlcyB0aGUgRklMRVZFUlNJT04gbnVtYmVyIGFib3ZlLCB0aGVuIHNjcmlwdHMKKyAqICAgICBjYW4gZG8gdGhlIHJpZ2h0IHRoaW5nIHdoZW4gZGVjaWRpbmcgd2hldGhlciB0byBpbnN0YWxsIGEgbmV3IHBwcC1jb21wLmgKKyAqICAgICBmaWxlLiAgRG9uJ3QgY2hhbmdlIHRoZSBmb3JtYXQgb2YgdGhhdCBsaW5lIG90aGVyd2lzZSwgc28gdGhlCisgKiAgICAgaW5zdGFsbGF0aW9uIHNjcmlwdCBjYW4gcmVjb2duaXplIGl0LgorICovCisKKyNpZm5kZWYgX05FVF9QUFBfQ09NUF9ICisjZGVmaW5lIF9ORVRfUFBQX0NPTVBfSAorCitzdHJ1Y3QgbW9kdWxlOworCisvKgorICogVGhlIGZvbGxvd2luZyBzeW1ib2xzIGNvbnRyb2wgd2hldGhlciB3ZSBpbmNsdWRlIGNvZGUgZm9yCisgKiB2YXJpb3VzIGNvbXByZXNzaW9uIG1ldGhvZHMuCisgKi8KKworI2lmbmRlZiBET19CU0RfQ09NUFJFU1MKKyNkZWZpbmUgRE9fQlNEX0NPTVBSRVNTCTEJLyogYnkgZGVmYXVsdCwgaW5jbHVkZSBCU0QtQ29tcHJlc3MgKi8KKyNlbmRpZgorI2lmbmRlZiBET19ERUZMQVRFCisjZGVmaW5lIERPX0RFRkxBVEUJMQkvKiBieSBkZWZhdWx0LCBpbmNsdWRlIERlZmxhdGUgKi8KKyNlbmRpZgorI2RlZmluZSBET19QUkVESUNUT1JfMQkwCisjZGVmaW5lIERPX1BSRURJQ1RPUl8yCTAKKworLyoKKyAqIFN0cnVjdHVyZSBnaXZpbmcgbWV0aG9kcyBmb3IgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbi4KKyAqLworCitzdHJ1Y3QgY29tcHJlc3NvciB7CisJaW50CWNvbXByZXNzX3Byb3RvOwkvKiBDQ1AgY29tcHJlc3Npb24gcHJvdG9jb2wgbnVtYmVyICovCisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSBjb21wcmVzc29yICh0cmFuc21pdCBzaWRlKSAqLworCXZvaWQJKigqY29tcF9hbGxvYykgKHVuc2lnbmVkIGNoYXIgKm9wdGlvbnMsIGludCBvcHRfbGVuKTsKKworCS8qIEZyZWUgc3BhY2UgdXNlZCBieSBhIGNvbXByZXNzb3IgKi8KKwl2b2lkCSgqY29tcF9mcmVlKSAodm9pZCAqc3RhdGUpOworCisJLyogSW5pdGlhbGl6ZSBhIGNvbXByZXNzb3IgKi8KKwlpbnQJKCpjb21wX2luaXQpICh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqb3B0aW9ucywKKwkJCSAgICAgIGludCBvcHRfbGVuLCBpbnQgdW5pdCwgaW50IG9wdGhkciwgaW50IGRlYnVnKTsKKworCS8qIFJlc2V0IGEgY29tcHJlc3NvciAqLworCXZvaWQJKCpjb21wX3Jlc2V0KSAodm9pZCAqc3RhdGUpOworCisJLyogQ29tcHJlc3MgYSBwYWNrZXQgKi8KKwlpbnQgICAgICgqY29tcHJlc3MpICh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqcnB0ciwKKwkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKm9idWYsIGludCBpc2l6ZSwgaW50IG9zaXplKTsKKworCS8qIFJldHVybiBjb21wcmVzc2lvbiBzdGF0aXN0aWNzICovCisJdm9pZAkoKmNvbXBfc3RhdCkgKHZvaWQgKnN0YXRlLCBzdHJ1Y3QgY29tcHN0YXQgKnN0YXRzKTsKKworCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIGRlY29tcHJlc3NvciAocmVjZWl2ZSBzaWRlKSAqLworCXZvaWQJKigqZGVjb21wX2FsbG9jKSAodW5zaWduZWQgY2hhciAqb3B0aW9ucywgaW50IG9wdF9sZW4pOworCisJLyogRnJlZSBzcGFjZSB1c2VkIGJ5IGEgZGVjb21wcmVzc29yICovCisJdm9pZAkoKmRlY29tcF9mcmVlKSAodm9pZCAqc3RhdGUpOworCisJLyogSW5pdGlhbGl6ZSBhIGRlY29tcHJlc3NvciAqLworCWludAkoKmRlY29tcF9pbml0KSAodm9pZCAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgKm9wdGlvbnMsCisJCQkJaW50IG9wdF9sZW4sIGludCB1bml0LCBpbnQgb3B0aGRyLCBpbnQgbXJ1LAorCQkJCWludCBkZWJ1Zyk7CisKKwkvKiBSZXNldCBhIGRlY29tcHJlc3NvciAqLworCXZvaWQJKCpkZWNvbXBfcmVzZXQpICh2b2lkICpzdGF0ZSk7CisKKwkvKiBEZWNvbXByZXNzIGEgcGFja2V0LiAqLworCWludAkoKmRlY29tcHJlc3MpICh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqaWJ1ZiwgaW50IGlzaXplLAorCQkJCXVuc2lnbmVkIGNoYXIgKm9idWYsIGludCBvc2l6ZSk7CisKKwkvKiBVcGRhdGUgc3RhdGUgZm9yIGFuIGluY29tcHJlc3NpYmxlIHBhY2tldCByZWNlaXZlZCAqLworCXZvaWQJKCppbmNvbXApICh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqaWJ1ZiwgaW50IGljbnQpOworCisJLyogUmV0dXJuIGRlY29tcHJlc3Npb24gc3RhdGlzdGljcyAqLworCXZvaWQJKCpkZWNvbXBfc3RhdCkgKHZvaWQgKnN0YXRlLCBzdHJ1Y3QgY29tcHN0YXQgKnN0YXRzKTsKKworCS8qIFVzZWQgaW4gbG9ja2luZyBjb21wcmVzc29yIG1vZHVsZXMgKi8KKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKwkvKiBFeHRyYSBza2Igc3BhY2UgbmVlZGVkIGJ5IHRoZSBjb21wcmVzc29yIGFsZ29yaXRobSAqLworCXVuc2lnbmVkIGludCBjb21wX2V4dHJhOworfTsKKworLyoKKyAqIFRoZSByZXR1cm4gdmFsdWUgZnJvbSBkZWNvbXByZXNzIHJvdXRpbmUgaXMgdGhlIGxlbmd0aCBvZiB0aGUKKyAqIGRlY29tcHJlc3NlZCBwYWNrZXQgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIERFQ09NUF9FUlJPUgorICogb3IgREVDT01QX0ZBVEFMRVJST1IgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKiAKKyAqIFdlIG5lZWQgdG8gbWFrZSB0aGlzIGRpc3RpbmN0aW9uIHNvIHRoYXQgd2UgY2FuIGRpc2FibGUgY2VydGFpbgorICogdXNlZnVsIGZ1bmN0aW9uYWxpdHksIG5hbWVseSBzZW5kaW5nIGEgQ0NQIHJlc2V0LXJlcXVlc3QgYXMgYSByZXN1bHQKKyAqIG9mIGFuIGVycm9yIGRldGVjdGVkIGFmdGVyIGRlY29tcHJlc3Npb24uICBUaGlzIGlzIHRvIGF2b2lkIGluZnJpbmdpbmcKKyAqIGEgcGF0ZW50IGhlbGQgYnkgTW90b3JvbGEuCisgKiBEb24ndCB5b3UganVzdCBsdXJ2ZSBzb2Z0d2FyZSBwYXRlbnRzLgorICovCisKKyNkZWZpbmUgREVDT01QX0VSUk9SCQktMQkvKiBlcnJvciBkZXRlY3RlZCBiZWZvcmUgZGVjb21wLiAqLworI2RlZmluZSBERUNPTVBfRkFUQUxFUlJPUgktMgkvKiBlcnJvciBkZXRlY3RlZCBhZnRlciBkZWNvbXAuICovCisKKy8qCisgKiBDQ1AgY29kZXMuCisgKi8KKworI2RlZmluZSBDQ1BfQ09ORlJFUQkxCisjZGVmaW5lIENDUF9DT05GQUNLCTIKKyNkZWZpbmUgQ0NQX1RFUk1SRVEJNQorI2RlZmluZSBDQ1BfVEVSTUFDSwk2CisjZGVmaW5lIENDUF9SRVNFVFJFUQkxNAorI2RlZmluZSBDQ1BfUkVTRVRBQ0sJMTUKKworLyoKKyAqIE1heCAjIGJ5dGVzIGZvciBhIENDUCBvcHRpb24KKyAqLworCisjZGVmaW5lIENDUF9NQVhfT1BUSU9OX0xFTkdUSAkzMgorCisvKgorICogUGFydHMgb2YgYSBDQ1AgcGFja2V0LgorICovCisKKyNkZWZpbmUgQ0NQX0NPREUoZHApCQkoKGRwKVswXSkKKyNkZWZpbmUgQ0NQX0lEKGRwKQkJKChkcClbMV0pCisjZGVmaW5lIENDUF9MRU5HVEgoZHApCQkoKChkcClbMl0gPDwgOCkgKyAoZHApWzNdKQorI2RlZmluZSBDQ1BfSERSTEVOCQk0CisKKyNkZWZpbmUgQ0NQX09QVF9DT0RFKGRwKQkoKGRwKVswXSkKKyNkZWZpbmUgQ0NQX09QVF9MRU5HVEgoZHApCSgoZHApWzFdKQorI2RlZmluZSBDQ1BfT1BUX01JTkxFTgkJMgorCisvKgorICogRGVmaW5pdGlvbnMgZm9yIEJTRC1Db21wcmVzcy4KKyAqLworCisjZGVmaW5lIENJX0JTRF9DT01QUkVTUwkJMjEJLyogY29uZmlnLiBvcHRpb24gZm9yIEJTRC1Db21wcmVzcyAqLworI2RlZmluZSBDSUxFTl9CU0RfQ09NUFJFU1MJMwkvKiBsZW5ndGggb2YgY29uZmlnLiBvcHRpb24gKi8KKworLyogTWFjcm9zIGZvciBoYW5kbGluZyB0aGUgM3JkIGJ5dGUgb2YgdGhlIEJTRC1Db21wcmVzcyBjb25maWcgb3B0aW9uLiAqLworI2RlZmluZSBCU0RfTkJJVFMoeCkJCSgoeCkgJiAweDFGKQkvKiBudW1iZXIgb2YgYml0cyByZXF1ZXN0ZWQgKi8KKyNkZWZpbmUgQlNEX1ZFUlNJT04oeCkJCSgoeCkgPj4gNSkJLyogdmVyc2lvbiBvZiBvcHRpb24gZm9ybWF0ICovCisjZGVmaW5lIEJTRF9DVVJSRU5UX1ZFUlNJT04JMQkJLyogY3VycmVudCB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZSBCU0RfTUFLRV9PUFQodiwgbikJKCgodikgPDwgNSkgfCAobikpCisKKyNkZWZpbmUgQlNEX01JTl9CSVRTCQk5CS8qIHNtYWxsZXN0IGNvZGUgc2l6ZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgQlNEX01BWF9CSVRTCQkxNQkvKiBsYXJnZXN0IGNvZGUgc2l6ZSBzdXBwb3J0ZWQgKi8KKworLyoKKyAqIERlZmluaXRpb25zIGZvciBEZWZsYXRlLgorICovCisKKyNkZWZpbmUgQ0lfREVGTEFURQkJMjYJLyogY29uZmlnIG9wdGlvbiBmb3IgRGVmbGF0ZSAqLworI2RlZmluZSBDSV9ERUZMQVRFX0RSQUZUCTI0CS8qIHZhbHVlIHVzZWQgaW4gb3JpZ2luYWwgZHJhZnQgUkZDICovCisjZGVmaW5lIENJTEVOX0RFRkxBVEUJCTQJLyogbGVuZ3RoIG9mIGl0cyBjb25maWcgb3B0aW9uICovCisKKyNkZWZpbmUgREVGTEFURV9NSU5fU0laRQk5CisjZGVmaW5lIERFRkxBVEVfTUFYX1NJWkUJMTUKKyNkZWZpbmUgREVGTEFURV9NRVRIT0RfVkFMCTgKKyNkZWZpbmUgREVGTEFURV9TSVpFKHgpCQkoKCh4KSA+PiA0KSArIDgpCisjZGVmaW5lIERFRkxBVEVfTUVUSE9EKHgpCSgoeCkgJiAweDBGKQorI2RlZmluZSBERUZMQVRFX01BS0VfT1BUKHcpCSgoKCh3KSAtIDgpIDw8IDQpICsgREVGTEFURV9NRVRIT0RfVkFMKQorI2RlZmluZSBERUZMQVRFX0NIS19TRVFVRU5DRQkwCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgTVBQRS4KKyAqLworCisjZGVmaW5lIENJX01QUEUgICAgICAgICAgICAgICAgMTggICAgICAvKiBjb25maWcgb3B0aW9uIGZvciBNUFBFICovCisjZGVmaW5lIENJTEVOX01QUEUgICAgICAgICAgICAgIDYgICAgICAvKiBsZW5ndGggb2YgY29uZmlnIG9wdGlvbiAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIG90aGVyLCBhcyB5ZXQgdW5zdXBwb3J0ZWQsIGNvbXByZXNzaW9uIG1ldGhvZHMuCisgKi8KKworI2RlZmluZSBDSV9QUkVESUNUT1JfMQkJMQkvKiBjb25maWcgb3B0aW9uIGZvciBQcmVkaWN0b3ItMSAqLworI2RlZmluZSBDSUxFTl9QUkVESUNUT1JfMQkyCS8qIGxlbmd0aCBvZiBpdHMgY29uZmlnIG9wdGlvbiAqLworI2RlZmluZSBDSV9QUkVESUNUT1JfMgkJMgkvKiBjb25maWcgb3B0aW9uIGZvciBQcmVkaWN0b3ItMiAqLworI2RlZmluZSBDSUxFTl9QUkVESUNUT1JfMgkyCS8qIGxlbmd0aCBvZiBpdHMgY29uZmlnIG9wdGlvbiAqLworCisKKyNlbmRpZiAvKiBfTkVUX1BQUF9DT01QX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcHBwX2RlZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcHBwX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTE0ZTVmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wcHBfZGVmcy5oCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogcHBwX2RlZnMuaCAtIFBQUCBkZWZpbml0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgVGhlIEF1c3RyYWxpYW4gTmF0aW9uYWwgVW5pdmVyc2l0eS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMuICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSwgZXhwcmVzcyBvciBpbXBsaWVkLiBUaGUgQXVzdHJhbGlhbiBOYXRpb25hbCBVbml2ZXJzaXR5CisgKiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZS4KKyAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVTVFJBTElBTiBOQVRJT05BTCBVTklWRVJTSVRZIEJFIExJQUJMRSBUTyBBTlkKKyAqIFBBUlRZIEZPUiBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBBTkQgSVRTIERPQ1VNRU5UQVRJT04sIEVWRU4gSUYKKyAqIFRIRSBBVVNUUkFMSUFOIE5BVElPTkFMIFVOSVZFUlNJVFkgSEFWRSBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUSEUgQVVTVFJBTElBTiBOQVRJT05BTCBVTklWRVJTSVRZIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKKyAqIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBTT0ZUV0FSRSBQUk9WSURFRCBIRVJFVU5ERVIgSVMKKyAqIE9OIEFOICJBUyBJUyIgQkFTSVMsIEFORCBUSEUgQVVTVFJBTElBTiBOQVRJT05BTCBVTklWRVJTSVRZIEhBUyBOTworICogT0JMSUdBVElPTiBUTyBQUk9WSURFIE1BSU5URU5BTkNFLCBTVVBQT1JULCBVUERBVEVTLCBFTkhBTkNFTUVOVFMsCisgKiBPUiBNT0RJRklDQVRJT05TLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogID09RklMRVZFUlNJT04gMjAwMDAxMTQ9PQorICoKKyAqICBOT1RFIFRPIE1BSU5UQUlORVJTOgorICogICAgIElmIHlvdSBtb2RpZnkgdGhpcyBmaWxlIGF0IGFsbCwgcGxlYXNlIHNldCB0aGUgYWJvdmUgZGF0ZS4KKyAqICAgICBwcHBfZGVmcy5oIGlzIHNoaXBwZWQgd2l0aCBhIFBQUCBkaXN0cmlidXRpb24gYXMgd2VsbCBhcyB3aXRoIHRoZSBrZXJuZWw7CisgKiAgICAgaWYgZXZlcnlvbmUgaW5jcmVhc2VzIHRoZSBGSUxFVkVSU0lPTiBudW1iZXIgYWJvdmUsIHRoZW4gc2NyaXB0cworICogICAgIGNhbiBkbyB0aGUgcmlnaHQgdGhpbmcgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIGluc3RhbGwgYSBuZXcgcHBwX2RlZnMuaAorICogICAgIGZpbGUuICBEb24ndCBjaGFuZ2UgdGhlIGZvcm1hdCBvZiB0aGF0IGxpbmUgb3RoZXJ3aXNlLCBzbyB0aGUKKyAqICAgICBpbnN0YWxsYXRpb24gc2NyaXB0IGNhbiByZWNvZ25pemUgaXQuCisgKi8KKworI2lmbmRlZiBfUFBQX0RFRlNfSF8KKyNkZWZpbmUgX1BQUF9ERUZTX0hfCisKKy8qCisgKiBUaGUgYmFzaWMgUFBQIGZyYW1lLgorICovCisjZGVmaW5lIFBQUF9IRFJMRU4JNAkvKiBvY3RldHMgZm9yIHN0YW5kYXJkIHBwcCBoZWFkZXIgKi8KKyNkZWZpbmUgUFBQX0ZDU0xFTgkyCS8qIG9jdGV0cyBmb3IgRkNTICovCisjZGVmaW5lIFBQUF9NUlUJCTE1MDAJLyogZGVmYXVsdCBNUlUgPSBtYXggbGVuZ3RoIG9mIGluZm8gZmllbGQgKi8KKworI2RlZmluZSBQUFBfQUREUkVTUyhwKQkoKChfX3U4ICopKHApKVswXSkKKyNkZWZpbmUgUFBQX0NPTlRST0wocCkJKCgoX191OCAqKShwKSlbMV0pCisjZGVmaW5lIFBQUF9QUk9UT0NPTChwKQkoKCgoX191OCAqKShwKSlbMl0gPDwgOCkgKyAoKF9fdTggKikocCkpWzNdKQorCisvKgorICogU2lnbmlmaWNhbnQgb2N0ZXQgdmFsdWVzLgorICovCisjZGVmaW5lCVBQUF9BTExTVEFUSU9OUwkweGZmCS8qIEFsbC1TdGF0aW9ucyBicm9hZGNhc3QgYWRkcmVzcyAqLworI2RlZmluZQlQUFBfVUkJCTB4MDMJLyogVW5udW1iZXJlZCBJbmZvcm1hdGlvbiAqLworI2RlZmluZQlQUFBfRkxBRwkweDdlCS8qIEZsYWcgU2VxdWVuY2UgKi8KKyNkZWZpbmUJUFBQX0VTQ0FQRQkweDdkCS8qIEFzeW5jaHJvbm91cyBDb250cm9sIEVzY2FwZSAqLworI2RlZmluZQlQUFBfVFJBTlMJMHgyMAkvKiBBc3luY2hyb25vdXMgdHJhbnNwYXJlbmN5IG1vZGlmaWVyICovCisKKy8qCisgKiBQcm90b2NvbCBmaWVsZCB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgUFBQX0lQCQkweDIxCS8qIEludGVybmV0IFByb3RvY29sICovCisjZGVmaW5lIFBQUF9BVAkJMHgyOQkvKiBBcHBsZVRhbGsgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0lQWAkJMHgyYgkvKiBJUFggcHJvdG9jb2wgKi8KKyNkZWZpbmUJUFBQX1ZKQ19DT01QCTB4MmQJLyogVkogY29tcHJlc3NlZCBUQ1AgKi8KKyNkZWZpbmUJUFBQX1ZKQ19VTkNPTVAJMHgyZgkvKiBWSiB1bmNvbXByZXNzZWQgVENQICovCisjZGVmaW5lIFBQUF9NUAkJMHgzZAkvKiBNdWx0aWxpbmsgcHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0lQVjYJMHg1NwkvKiBJbnRlcm5ldCBQcm90b2NvbCBWZXJzaW9uIDYgKi8KKyNkZWZpbmUgUFBQX0NPTVBGUkFHCTB4ZmIJLyogZnJhZ21lbnQgY29tcHJlc3NlZCBiZWxvdyBidW5kbGUgKi8KKyNkZWZpbmUgUFBQX0NPTVAJMHhmZAkvKiBjb21wcmVzc2VkIHBhY2tldCAqLworI2RlZmluZSBQUFBfTVBMU19VQwkweDAyODEJLyogTXVsdGkgUHJvdG9jb2wgTGFiZWwgU3dpdGNoaW5nIC0gVW5pY2FzdCAqLworI2RlZmluZSBQUFBfTVBMU19NQwkweDAyODMJLyogTXVsdGkgUHJvdG9jb2wgTGFiZWwgU3dpdGNoaW5nIC0gTXVsdGljYXN0ICovCisjZGVmaW5lIFBQUF9JUENQCTB4ODAyMQkvKiBJUCBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9BVENQCTB4ODAyOQkvKiBBcHBsZVRhbGsgQ29udHJvbCBQcm90b2NvbCAqLworI2RlZmluZSBQUFBfSVBYQ1AJMHg4MDJiCS8qIElQWCBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9JUFY2Q1AJMHg4MDU3CS8qIElQdjYgQ29udHJvbCBQcm90b2NvbCAqLworI2RlZmluZSBQUFBfQ0NQRlJBRwkweDgwZmIJLyogQ0NQIGF0IGxpbmsgbGV2ZWwgKGJlbG93IE1QIGJ1bmRsZSkgKi8KKyNkZWZpbmUgUFBQX0NDUAkJMHg4MGZkCS8qIENvbXByZXNzaW9uIENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX01QTFNDUAkweDgwZmQJLyogTVBMUyBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9MQ1AJCTB4YzAyMQkvKiBMaW5rIENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX1BBUAkJMHhjMDIzCS8qIFBhc3N3b3JkIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9MUVIJCTB4YzAyNQkvKiBMaW5rIFF1YWxpdHkgUmVwb3J0IHByb3RvY29sICovCisjZGVmaW5lIFBQUF9DSEFQCTB4YzIyMwkvKiBDcnlwdG9ncmFwaGljIEhhbmRzaGFrZSBBdXRoLiBQcm90b2NvbCAqLworI2RlZmluZSBQUFBfQ0JDUAkweGMwMjkJLyogQ2FsbGJhY2sgQ29udHJvbCBQcm90b2NvbCAqLworCisvKgorICogVmFsdWVzIGZvciBGQ1MgY2FsY3VsYXRpb25zLgorICovCisKKyNkZWZpbmUgUFBQX0lOSVRGQ1MJMHhmZmZmCS8qIEluaXRpYWwgRkNTIHZhbHVlICovCisjZGVmaW5lIFBQUF9HT09ERkNTCTB4ZjBiOAkvKiBHb29kIGZpbmFsIEZDUyB2YWx1ZSAqLworCisKKy8qCisgKiBFeHRlbmRlZCBhc3luY21hcCAtIGFsbG93cyBhbnkgY2hhcmFjdGVyIHRvIGJlIGVzY2FwZWQuCisgKi8KKwordHlwZWRlZiBfX3UzMgkJZXh0X2FjY21bOF07CisKKy8qCisgKiBXaGF0IHRvIGRvIHdpdGggbmV0d29yayBwcm90b2NvbCAoTlApIHBhY2tldHMuCisgKi8KK2VudW0gTlBtb2RlIHsKKyAgICBOUE1PREVfUEFTUywJCS8qIHBhc3MgdGhlIHBhY2tldCB0aHJvdWdoICovCisgICAgTlBNT0RFX0RST1AsCQkvKiBzaWxlbnRseSBkcm9wIHRoZSBwYWNrZXQgKi8KKyAgICBOUE1PREVfRVJST1IsCQkvKiByZXR1cm4gYW4gZXJyb3IgKi8KKyAgICBOUE1PREVfUVVFVUUJCS8qIHNhdmUgaXQgdXAgZm9yIGxhdGVyLiAqLworfTsKKworLyoKKyAqIFN0YXRpc3RpY3MgZm9yIExRUlAgYW5kIHBwcHN0YXRzCisgKi8KK3N0cnVjdCBwcHBzdGF0CXsKKyAgICBfX3UzMglwcHBfZGlzY2FyZHM7CS8qICMgZnJhbWVzIGRpc2NhcmRlZCAqLworCisgICAgX191MzIJcHBwX2lieXRlczsJLyogYnl0ZXMgcmVjZWl2ZWQgKi8KKyAgICBfX3UzMglwcHBfaW9jdGVjdHM7CS8qIGJ5dGVzIHJlY2VpdmVkIG5vdCBpbiBlcnJvciAqLworICAgIF9fdTMyCXBwcF9pcGFja2V0czsJLyogcGFja2V0cyByZWNlaXZlZCAqLworICAgIF9fdTMyCXBwcF9pZXJyb3JzOwkvKiByZWNlaXZlIGVycm9ycyAqLworICAgIF9fdTMyCXBwcF9pbHFyczsJLyogIyBMUVIgZnJhbWVzIHJlY2VpdmVkICovCisKKyAgICBfX3UzMglwcHBfb2J5dGVzOwkvKiByYXcgYnl0ZXMgc2VudCAqLworICAgIF9fdTMyCXBwcF9vb2N0ZWN0czsJLyogZnJhbWUgYnl0ZXMgc2VudCAqLworICAgIF9fdTMyCXBwcF9vcGFja2V0czsJLyogcGFja2V0cyBzZW50ICovCisgICAgX191MzIJcHBwX29lcnJvcnM7CS8qIHRyYW5zbWl0IGVycm9ycyAqLyAKKyAgICBfX3UzMglwcHBfb2xxcnM7CS8qICMgTFFSIGZyYW1lcyBzZW50ICovCit9OworCitzdHJ1Y3QgdmpzdGF0IHsKKyAgICBfX3UzMgl2anNfcGFja2V0czsJLyogb3V0Ym91bmQgcGFja2V0cyAqLworICAgIF9fdTMyCXZqc19jb21wcmVzc2VkOwkvKiBvdXRib3VuZCBjb21wcmVzc2VkIHBhY2tldHMgKi8KKyAgICBfX3UzMgl2anNfc2VhcmNoZXM7CS8qIHNlYXJjaGVzIGZvciBjb25uZWN0aW9uIHN0YXRlICovCisgICAgX191MzIJdmpzX21pc3NlczsJLyogdGltZXMgY291bGRuJ3QgZmluZCBjb25uLiBzdGF0ZSAqLworICAgIF9fdTMyCXZqc191bmNvbXByZXNzZWRpbjsgLyogaW5ib3VuZCB1bmNvbXByZXNzZWQgcGFja2V0cyAqLworICAgIF9fdTMyCXZqc19jb21wcmVzc2VkaW47ICAgLyogaW5ib3VuZCBjb21wcmVzc2VkIHBhY2tldHMgKi8KKyAgICBfX3UzMgl2anNfZXJyb3JpbjsJLyogaW5ib3VuZCB1bmtub3duIHR5cGUgcGFja2V0cyAqLworICAgIF9fdTMyCXZqc190b3NzZWQ7CS8qIGluYm91bmQgcGFja2V0cyB0b3NzZWQgYmVjYXVzZSBvZiBlcnJvciAqLworfTsKKworc3RydWN0IGNvbXBzdGF0IHsKKyAgICBfX3UzMgl1bmNfYnl0ZXM7CS8qIHRvdGFsIHVuY29tcHJlc3NlZCBieXRlcyAqLworICAgIF9fdTMyCXVuY19wYWNrZXRzOwkvKiB0b3RhbCB1bmNvbXByZXNzZWQgcGFja2V0cyAqLworICAgIF9fdTMyCWNvbXBfYnl0ZXM7CS8qIGNvbXByZXNzZWQgYnl0ZXMgKi8KKyAgICBfX3UzMgljb21wX3BhY2tldHM7CS8qIGNvbXByZXNzZWQgcGFja2V0cyAqLworICAgIF9fdTMyCWluY19ieXRlczsJLyogaW5jb21wcmVzc2libGUgYnl0ZXMgKi8KKyAgICBfX3UzMglpbmNfcGFja2V0czsJLyogaW5jb21wcmVzc2libGUgcGFja2V0cyAqLworCisgICAgLyogdGhlIGNvbXByZXNzaW9uIHJhdGlvIGlzIGRlZmluZWQgYXMgaW5fY291bnQgLyBieXRlc19vdXQgKi8KKyAgICBfX3UzMiAgICAgICBpbl9jb3VudDsJLyogQnl0ZXMgcmVjZWl2ZWQgKi8KKyAgICBfX3UzMiAgICAgICBieXRlc19vdXQ7CS8qIEJ5dGVzIHRyYW5zbWl0dGVkICovCisKKyAgICBkb3VibGUJcmF0aW87CQkvKiBub3QgY29tcHV0ZWQgaW4ga2VybmVsLiAqLworfTsKKworc3RydWN0IHBwcF9zdGF0cyB7CisgICAgc3RydWN0IHBwcHN0YXQJcDsJLyogYmFzaWMgUFBQIHN0YXRpc3RpY3MgKi8KKyAgICBzdHJ1Y3QgdmpzdGF0CXZqOwkvKiBWSiBoZWFkZXIgY29tcHJlc3Npb24gc3RhdGlzdGljcyAqLworfTsKKworc3RydWN0IHBwcF9jb21wX3N0YXRzIHsKKyAgICBzdHJ1Y3QgY29tcHN0YXQJYzsJLyogcGFja2V0IGNvbXByZXNzaW9uIHN0YXRpc3RpY3MgKi8KKyAgICBzdHJ1Y3QgY29tcHN0YXQJZDsJLyogcGFja2V0IGRlY29tcHJlc3Npb24gc3RhdGlzdGljcyAqLworfTsKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIHJlY29yZHMgdGhlIHRpbWUgaW4gc2Vjb25kcyBzaW5jZQorICogdGhlIGxhc3QgTlAgcGFja2V0IHdhcyBzZW50IG9yIHJlY2VpdmVkLgorICovCitzdHJ1Y3QgcHBwX2lkbGUgeworICAgIF9fa2VybmVsX3RpbWVfdCB4bWl0X2lkbGU7CS8qIHRpbWUgc2luY2UgbGFzdCBOUCBwYWNrZXQgc2VudCAqLworICAgIF9fa2VybmVsX3RpbWVfdCByZWN2X2lkbGU7CS8qIHRpbWUgc2luY2UgbGFzdCBOUCBwYWNrZXQgcmVjZWl2ZWQgKi8KK307CisKKyNlbmRpZiAvKiBfUFBQX0RFRlNfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcHBzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Bwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YmIxZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Bwcy5oCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogUFBTIEFQSSBoZWFkZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOSAgIFJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGxpbnV4Lml0PgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX1BQU19IXworI2RlZmluZSBfUFBTX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFBQU19WRVJTSU9OCQkiNS4zLjYiCisjZGVmaW5lIFBQU19NQVhfU09VUkNFUwkJMTYJCS8qIHNob3VsZCBiZSBlbm91Z2guLi4gKi8KKworLyogSW1wbGVtZW50YXRpb24gbm90ZTogdGhlIGxvZ2ljYWwgc3RhdGVzIGBgYXNzZXJ0JycgYW5kIGBgY2xlYXInJworICogYXJlIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHRoZSBjaGlwIHJlZ2lzdGVyLCBpLmUuIGBgYXNzZXJ0JycKKyAqIG1lYW5zIHRoZSBiaXQgaXMgc2V0LiAgKi8KKworLyoKKyAqIDMuMiBOZXcgZGF0YSBzdHJ1Y3R1cmVzCisgKi8KKworI2RlZmluZSBQUFNfQVBJX1ZFUlNfMQkJMQorI2RlZmluZSBQUFNfQVBJX1ZFUlMJCVBQU19BUElfVkVSU18xCS8qIHdlIHVzZSBBUEkgdmVyc2lvbiAxICovCisjZGVmaW5lIFBQU19NQVhfTkFNRV9MRU4JMzIKKworLyogMzItYml0IHZzLiA2NC1iaXQgY29tcGF0aWJpbGl0eS4KKyAqCisgKiAwbiBpMzg2LCB0aGUgYWxpZ25tZW50IG9mIGEgdWludDY0X3QgaXMgb25seSA0IGJ5dGVzLCB3aGlsZSBvbiBtb3N0IG90aGVyCisgKiBhcmNoaXRlY3R1cmVzIGl0J3MgOCBieXRlcy4gT24gaTM4NiwgdGhlcmUgd2lsbCBiZSBubyBwYWRkaW5nIGJldHdlZW4gdGhlCisgKiB0d28gY29uc2VjdXRpdmUgJ3N0cnVjdCBwcHNfa3RpbWUnIG1lbWJlcnMgb2Ygc3RydWN0IHBwc19raW5mbyBhbmQgc3RydWN0CisgKiBwcHNfa3BhcmFtcy4gQnV0IG9uIG1vc3QgcGxhdGZvcm1zIHRoZXJlIHdpbGwgYmUgcGFkZGluZyB0byBlbnN1cmUgY29ycmVjdAorICogYWxpZ25tZW50LgorICoKKyAqIFRoZSBzaW1wbGUgZml4IGlzIHByb2JhYmx5IHRvIGFkZCBhbiBleHBsaWNpdCBwYWRkaW5nLgorICoJCQkJCSAJCVtEYXZpZCBXb29kaG91c2VdCisgKi8KK3N0cnVjdCBwcHNfa3RpbWUgeworCV9fczY0IHNlYzsKKwlfX3MzMiBuc2VjOworCV9fdTMyIGZsYWdzOworfTsKKyNkZWZpbmUgUFBTX1RJTUVfSU5WQUxJRAkoMTw8MCkJLyogdXNlZCB0byBzcGVjaWZ5IHRpbWVvdXQ9PU5VTEwgKi8KKworc3RydWN0IHBwc19raW5mbyB7CisJX191MzIgYXNzZXJ0X3NlcXVlbmNlOwkJLyogc2VxLiBudW0uIG9mIGFzc2VydCBldmVudCAqLworCV9fdTMyIGNsZWFyX3NlcXVlbmNlOyAJCS8qIHNlcS4gbnVtLiBvZiBjbGVhciBldmVudCAqLworCXN0cnVjdCBwcHNfa3RpbWUgYXNzZXJ0X3R1OwkvKiB0aW1lIG9mIGFzc2VydCBldmVudCAqLworCXN0cnVjdCBwcHNfa3RpbWUgY2xlYXJfdHU7CS8qIHRpbWUgb2YgY2xlYXIgZXZlbnQgKi8KKwlpbnQgY3VycmVudF9tb2RlOwkJLyogY3VycmVudCBtb2RlIGJpdHMgKi8KK307CisKK3N0cnVjdCBwcHNfa3BhcmFtcyB7CisJaW50IGFwaV92ZXJzaW9uOwkJLyogQVBJIHZlcnNpb24gIyAqLworCWludCBtb2RlOwkJCS8qIG1vZGUgYml0cyAqLworCXN0cnVjdCBwcHNfa3RpbWUgYXNzZXJ0X29mZl90dTsJLyogb2Zmc2V0IGNvbXBlbnNhdGlvbiBmb3IgYXNzZXJ0ICovCisJc3RydWN0IHBwc19rdGltZSBjbGVhcl9vZmZfdHU7CS8qIG9mZnNldCBjb21wZW5zYXRpb24gZm9yIGNsZWFyICovCit9OworCisvKgorICogMy4zIE1vZGUgYml0IGRlZmluaXRpb25zCisgKi8KKworLyogRGV2aWNlL2ltcGxlbWVudGF0aW9uIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgUFBTX0NBUFRVUkVBU1NFUlQJMHgwMQkvKiBjYXB0dXJlIGFzc2VydCBldmVudHMgKi8KKyNkZWZpbmUgUFBTX0NBUFRVUkVDTEVBUgkweDAyCS8qIGNhcHR1cmUgY2xlYXIgZXZlbnRzICovCisjZGVmaW5lIFBQU19DQVBUVVJFQk9USAkJMHgwMwkvKiBjYXB0dXJlIGFzc2VydCBhbmQgY2xlYXIgZXZlbnRzICovCisKKyNkZWZpbmUgUFBTX09GRlNFVEFTU0VSVAkweDEwCS8qIGFwcGx5IGNvbXBlbnNhdGlvbiBmb3IgYXNzZXJ0IGV2LiAqLworI2RlZmluZSBQUFNfT0ZGU0VUQ0xFQVIJCTB4MjAJLyogYXBwbHkgY29tcGVuc2F0aW9uIGZvciBjbGVhciBldi4gKi8KKworI2RlZmluZSBQUFNfQ0FOV0FJVAkJMHgxMDAJLyogY2FuIHdlIHdhaXQgZm9yIGFuIGV2ZW50PyAqLworI2RlZmluZSBQUFNfQ0FOUE9MTAkJMHgyMDAJLyogYml0IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisKKy8qIEtlcm5lbCBhY3Rpb25zICovCisjZGVmaW5lIFBQU19FQ0hPQVNTRVJUCQkweDQwCS8qIGZlZWQgYmFjayBhc3NlcnQgZXZlbnQgdG8gb3V0cHV0ICovCisjZGVmaW5lIFBQU19FQ0hPQ0xFQVIJCTB4ODAJLyogZmVlZCBiYWNrIGNsZWFyIGV2ZW50IHRvIG91dHB1dCAqLworCisvKiBUaW1lc3RhbXAgZm9ybWF0cyAqLworI2RlZmluZSBQUFNfVFNGTVRfVFNQRUMJCTB4MTAwMAkvKiBzZWxlY3QgdGltZXNwZWMgZm9ybWF0ICovCisjZGVmaW5lIFBQU19UU0ZNVF9OVFBGUAkJMHgyMDAwCS8qIHNlbGVjdCBOVFAgZm9ybWF0ICovCisKKy8qCisgKiAzLjQuNCBOZXcgZnVuY3Rpb25zOiBkaXNjaXBsaW5pbmcgdGhlIGtlcm5lbCB0aW1lYmFzZQorICovCisKKy8qIEtlcm5lbCBjb25zdW1lcnMgKi8KKyNkZWZpbmUgUFBTX0tDX0hBUkRQUFMJCTAJLyogaGFyZHBwcygpIChvciBlcXVpdmFsZW50KSAqLworI2RlZmluZSBQUFNfS0NfSEFSRFBQU19QTEwJMQkvKiBoYXJkcHBzKCkgY29uc3RyYWluZWQgdG8KKwkJCQkJICAgdXNlIGEgcGhhc2UtbG9ja2VkIGxvb3AgKi8KKyNkZWZpbmUgUFBTX0tDX0hBUkRQUFNfRkxMCTIJLyogaGFyZHBwcygpIGNvbnN0cmFpbmVkIHRvCisJCQkJCSAgIHVzZSBhIGZyZXF1ZW5jeS1sb2NrZWQgbG9vcCAqLworLyoKKyAqIEhlcmUgYmVnaW5zIHRoZSBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBwYXJ0IQorICovCisKK3N0cnVjdCBwcHNfZmRhdGEgeworCXN0cnVjdCBwcHNfa2luZm8gaW5mbzsKKwlzdHJ1Y3QgcHBzX2t0aW1lIHRpbWVvdXQ7Cit9OworCitzdHJ1Y3QgcHBzX2JpbmRfYXJncyB7CisJaW50IHRzZm9ybWF0OwkvKiBmb3JtYXQgb2YgdGltZSBzdGFtcHMgKi8KKwlpbnQgZWRnZTsJLyogc2VsZWN0ZWQgZXZlbnQgdHlwZSAqLworCWludCBjb25zdW1lcjsJLyogc2VsZWN0ZWQga2VybmVsIGNvbnN1bWVyICovCit9OworCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2RlZmluZSBQUFNfR0VUUEFSQU1TCQlfSU9SKCdwJywgMHhhMSwgc3RydWN0IHBwc19rcGFyYW1zICopCisjZGVmaW5lIFBQU19TRVRQQVJBTVMJCV9JT1coJ3AnLCAweGEyLCBzdHJ1Y3QgcHBzX2twYXJhbXMgKikKKyNkZWZpbmUgUFBTX0dFVENBUAkJX0lPUigncCcsIDB4YTMsIGludCAqKQorI2RlZmluZSBQUFNfRkVUQ0gJCV9JT1dSKCdwJywgMHhhNCwgc3RydWN0IHBwc19mZGF0YSAqKQorI2RlZmluZSBQUFNfS0NfQklORAkJX0lPVygncCcsIDB4YTUsIHN0cnVjdCBwcHNfYmluZF9hcmdzICopCisKKyNlbmRpZiAvKiBfUFBTX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ByY3RsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ByY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5M2M3MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcHJjdGwuaApAQCAtMCwwICsxLDEzOSBAQAorI2lmbmRlZiBfTElOVVhfUFJDVExfSAorI2RlZmluZSBfTElOVVhfUFJDVExfSAorCisvKiBWYWx1ZXMgdG8gcGFzcyBhcyBmaXJzdCBhcmd1bWVudCB0byBwcmN0bCgpICovCisKKyNkZWZpbmUgUFJfU0VUX1BERUFUSFNJRyAgMSAgLyogU2Vjb25kIGFyZyBpcyBhIHNpZ25hbCAqLworI2RlZmluZSBQUl9HRVRfUERFQVRIU0lHICAyICAvKiBTZWNvbmQgYXJnIGlzIGEgcHRyIHRvIHJldHVybiB0aGUgc2lnbmFsICovCisKKy8qIEdldC9zZXQgY3VycmVudC0+bW0tPmR1bXBhYmxlICovCisjZGVmaW5lIFBSX0dFVF9EVU1QQUJMRSAgIDMKKyNkZWZpbmUgUFJfU0VUX0RVTVBBQkxFICAgNAorCisvKiBHZXQvc2V0IHVuYWxpZ25lZCBhY2Nlc3MgY29udHJvbCBiaXRzIChpZiBtZWFuaW5nZnVsKSAqLworI2RlZmluZSBQUl9HRVRfVU5BTElHTgkgIDUKKyNkZWZpbmUgUFJfU0VUX1VOQUxJR04JICA2CisjIGRlZmluZSBQUl9VTkFMSUdOX05PUFJJTlQJMQkvKiBzaWxlbnRseSBmaXggdXAgdW5hbGlnbmVkIHVzZXIgYWNjZXNzZXMgKi8KKyMgZGVmaW5lIFBSX1VOQUxJR05fU0lHQlVTCTIJLyogZ2VuZXJhdGUgU0lHQlVTIG9uIHVuYWxpZ25lZCB1c2VyIGFjY2VzcyAqLworCisvKiBHZXQvc2V0IHdoZXRoZXIgb3Igbm90IHRvIGRyb3AgY2FwYWJpbGl0aWVzIG9uIHNldHVpZCgpIGF3YXkgZnJvbQorICogdWlkIDAgKGFzIHBlciBzZWN1cml0eS9jb21tb25jYXAuYykgKi8KKyNkZWZpbmUgUFJfR0VUX0tFRVBDQVBTICAgNworI2RlZmluZSBQUl9TRVRfS0VFUENBUFMgICA4CisKKy8qIEdldC9zZXQgZmxvYXRpbmctcG9pbnQgZW11bGF0aW9uIGNvbnRyb2wgYml0cyAoaWYgbWVhbmluZ2Z1bCkgKi8KKyNkZWZpbmUgUFJfR0VUX0ZQRU1VICA5CisjZGVmaW5lIFBSX1NFVF9GUEVNVSAxMAorIyBkZWZpbmUgUFJfRlBFTVVfTk9QUklOVAkxCS8qIHNpbGVudGx5IGVtdWxhdGUgZnAgb3BlcmF0aW9ucyBhY2Nlc3NlcyAqLworIyBkZWZpbmUgUFJfRlBFTVVfU0lHRlBFCTIJLyogZG9uJ3QgZW11bGF0ZSBmcCBvcGVyYXRpb25zLCBzZW5kIFNJR0ZQRSBpbnN0ZWFkICovCisKKy8qIEdldC9zZXQgZmxvYXRpbmctcG9pbnQgZXhjZXB0aW9uIG1vZGUgKGlmIG1lYW5pbmdmdWwpICovCisjZGVmaW5lIFBSX0dFVF9GUEVYQwkxMQorI2RlZmluZSBQUl9TRVRfRlBFWEMJMTIKKyMgZGVmaW5lIFBSX0ZQX0VYQ19TV19FTkFCTEUJMHg4MAkvKiBVc2UgRlBFWEMgZm9yIEZQIGV4Y2VwdGlvbiBlbmFibGVzICovCisjIGRlZmluZSBQUl9GUF9FWENfRElWCQkweDAxMDAwMAkvKiBmbG9hdGluZyBwb2ludCBkaXZpZGUgYnkgemVybyAqLworIyBkZWZpbmUgUFJfRlBfRVhDX09WRgkJMHgwMjAwMDAJLyogZmxvYXRpbmcgcG9pbnQgb3ZlcmZsb3cgKi8KKyMgZGVmaW5lIFBSX0ZQX0VYQ19VTkQJCTB4MDQwMDAwCS8qIGZsb2F0aW5nIHBvaW50IHVuZGVyZmxvdyAqLworIyBkZWZpbmUgUFJfRlBfRVhDX1JFUwkJMHgwODAwMDAJLyogZmxvYXRpbmcgcG9pbnQgaW5leGFjdCByZXN1bHQgKi8KKyMgZGVmaW5lIFBSX0ZQX0VYQ19JTlYJCTB4MTAwMDAwCS8qIGZsb2F0aW5nIHBvaW50IGludmFsaWQgb3BlcmF0aW9uICovCisjIGRlZmluZSBQUl9GUF9FWENfRElTQUJMRUQJMAkvKiBGUCBleGNlcHRpb25zIGRpc2FibGVkICovCisjIGRlZmluZSBQUl9GUF9FWENfTk9OUkVDT1YJMQkvKiBhc3luYyBub24tcmVjb3ZlcmFibGUgZXhjLiBtb2RlICovCisjIGRlZmluZSBQUl9GUF9FWENfQVNZTkMJMgkvKiBhc3luYyByZWNvdmVyYWJsZSBleGNlcHRpb24gbW9kZSAqLworIyBkZWZpbmUgUFJfRlBfRVhDX1BSRUNJU0UJMwkvKiBwcmVjaXNlIGV4Y2VwdGlvbiBtb2RlICovCisKKy8qIEdldC9zZXQgd2hldGhlciB3ZSB1c2Ugc3RhdGlzdGljYWwgcHJvY2VzcyB0aW1pbmcgb3IgYWNjdXJhdGUgdGltZXN0YW1wCisgKiBiYXNlZCBwcm9jZXNzIHRpbWluZyAqLworI2RlZmluZSBQUl9HRVRfVElNSU5HICAgMTMKKyNkZWZpbmUgUFJfU0VUX1RJTUlORyAgIDE0CisjIGRlZmluZSBQUl9USU1JTkdfU1RBVElTVElDQUwgIDAgICAgICAgLyogTm9ybWFsLCB0cmFkaXRpb25hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpc3RpY2FsIHByb2Nlc3MgdGltaW5nICovCisjIGRlZmluZSBQUl9USU1JTkdfVElNRVNUQU1QICAgIDEgICAgICAgLyogQWNjdXJhdGUgdGltZXN0YW1wIGJhc2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzIHRpbWluZyAqLworCisjZGVmaW5lIFBSX1NFVF9OQU1FICAgIDE1CQkvKiBTZXQgcHJvY2VzcyBuYW1lICovCisjZGVmaW5lIFBSX0dFVF9OQU1FICAgIDE2CQkvKiBHZXQgcHJvY2VzcyBuYW1lICovCisKKy8qIEdldC9zZXQgcHJvY2VzcyBlbmRpYW4gKi8KKyNkZWZpbmUgUFJfR0VUX0VORElBTgkxOQorI2RlZmluZSBQUl9TRVRfRU5ESUFOCTIwCisjIGRlZmluZSBQUl9FTkRJQU5fQklHCQkwCisjIGRlZmluZSBQUl9FTkRJQU5fTElUVExFCTEJLyogVHJ1ZSBsaXR0bGUgZW5kaWFuIG1vZGUgKi8KKyMgZGVmaW5lIFBSX0VORElBTl9QUENfTElUVExFCTIJLyogIlBvd2VyUEMiIHBzZXVkbyBsaXR0bGUgZW5kaWFuICovCisKKy8qIEdldC9zZXQgcHJvY2VzcyBzZWNjb21wIG1vZGUgKi8KKyNkZWZpbmUgUFJfR0VUX1NFQ0NPTVAJMjEKKyNkZWZpbmUgUFJfU0VUX1NFQ0NPTVAJMjIKKworLyogR2V0L3NldCB0aGUgY2FwYWJpbGl0eSBib3VuZGluZyBzZXQgKGFzIHBlciBzZWN1cml0eS9jb21tb25jYXAuYykgKi8KKyNkZWZpbmUgUFJfQ0FQQlNFVF9SRUFEIDIzCisjZGVmaW5lIFBSX0NBUEJTRVRfRFJPUCAyNAorCisvKiBHZXQvc2V0IHRoZSBwcm9jZXNzJyBhYmlsaXR5IHRvIHVzZSB0aGUgdGltZXN0YW1wIGNvdW50ZXIgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgUFJfR0VUX1RTQyAyNQorI2RlZmluZSBQUl9TRVRfVFNDIDI2CisjIGRlZmluZSBQUl9UU0NfRU5BQkxFCQkxCS8qIGFsbG93IHRoZSB1c2Ugb2YgdGhlIHRpbWVzdGFtcCBjb3VudGVyICovCisjIGRlZmluZSBQUl9UU0NfU0lHU0VHVgkJMgkvKiB0aHJvdyBhIFNJR1NFR1YgaW5zdGVhZCBvZiByZWFkaW5nIHRoZSBUU0MgKi8KKworLyogR2V0L3NldCBzZWN1cmViaXRzIChhcyBwZXIgc2VjdXJpdHkvY29tbW9uY2FwLmMpICovCisjZGVmaW5lIFBSX0dFVF9TRUNVUkVCSVRTIDI3CisjZGVmaW5lIFBSX1NFVF9TRUNVUkVCSVRTIDI4CisKKy8qCisgKiBHZXQvc2V0IHRoZSB0aW1lcnNsYWNrIGFzIHVzZWQgYnkgcG9sbC9zZWxlY3QvbmFub3NsZWVwCisgKiBBIHZhbHVlIG9mIDAgbWVhbnMgInVzZSBkZWZhdWx0IgorICovCisjZGVmaW5lIFBSX1NFVF9USU1FUlNMQUNLIDI5CisjZGVmaW5lIFBSX0dFVF9USU1FUlNMQUNLIDMwCisKKyNkZWZpbmUgUFJfVEFTS19QRVJGX0VWRU5UU19ESVNBQkxFCQkzMQorI2RlZmluZSBQUl9UQVNLX1BFUkZfRVZFTlRTX0VOQUJMRQkJMzIKKworLyoKKyAqIFNldCBlYXJseS9sYXRlIGtpbGwgbW9kZSBmb3IgaHdwb2lzb24gbWVtb3J5IGNvcnJ1cHRpb24uCisgKiBUaGlzIGluZmx1ZW5jZXMgd2hlbiB0aGUgcHJvY2VzcyBnZXRzIGtpbGxlZCBvbiBhIG1lbW9yeSBjb3JydXB0aW9uLgorICovCisjZGVmaW5lIFBSX01DRV9LSUxMCTMzCisjIGRlZmluZSBQUl9NQ0VfS0lMTF9DTEVBUiAgIDAKKyMgZGVmaW5lIFBSX01DRV9LSUxMX1NFVCAgICAgMQorCisjIGRlZmluZSBQUl9NQ0VfS0lMTF9MQVRFICAgIDAKKyMgZGVmaW5lIFBSX01DRV9LSUxMX0VBUkxZICAgMQorIyBkZWZpbmUgUFJfTUNFX0tJTExfREVGQVVMVCAyCisKKyNkZWZpbmUgUFJfTUNFX0tJTExfR0VUIDM0CisKKy8qCisgKiBUdW5lIHVwIHByb2Nlc3MgbWVtb3J5IG1hcCBzcGVjaWZpY3MuCisgKi8KKyNkZWZpbmUgUFJfU0VUX01NCQkzNQorIyBkZWZpbmUgUFJfU0VUX01NX1NUQVJUX0NPREUJCTEKKyMgZGVmaW5lIFBSX1NFVF9NTV9FTkRfQ09ERQkJMgorIyBkZWZpbmUgUFJfU0VUX01NX1NUQVJUX0RBVEEJCTMKKyMgZGVmaW5lIFBSX1NFVF9NTV9FTkRfREFUQQkJNAorIyBkZWZpbmUgUFJfU0VUX01NX1NUQVJUX1NUQUNLCQk1CisjIGRlZmluZSBQUl9TRVRfTU1fU1RBUlRfQlJLCQk2CisjIGRlZmluZSBQUl9TRVRfTU1fQlJLCQkJNworCisvKgorICogU2V0IHNwZWNpZmljIHBpZCB0aGF0IGlzIGFsbG93ZWQgdG8gcHRyYWNlIHRoZSBjdXJyZW50IHRhc2suCisgKiBBIHZhbHVlIG9mIDAgbWVhbiAibm8gcHJvY2VzcyIuCisgKi8KKyNkZWZpbmUgUFJfU0VUX1BUUkFDRVIgMHg1OTYxNmQ2MQorIyBkZWZpbmUgUFJfU0VUX1BUUkFDRVJfQU5ZICgodW5zaWduZWQgbG9uZyktMSkKKworLyoKKyAqIElmIG5vX25ld19wcml2cyBpcyBzZXQsIHRoZW4gb3BlcmF0aW9ucyB0aGF0IGdyYW50IG5ldyBwcml2aWxlZ2VzIChpLmUuCisgKiBleGVjdmUpIHdpbGwgZWl0aGVyIGZhaWwgb3Igbm90IGdyYW50IHRoZW0uICBUaGlzIGFmZmVjdHMgc3VpZC9zZ2lkLAorICogZmlsZSBjYXBhYmlsaXRpZXMsIGFuZCBMU01zLgorICoKKyAqIE9wZXJhdGlvbnMgdGhhdCBtZXJlbHkgbWFuaXB1bGF0ZSBvciBkcm9wIGV4aXN0aW5nIHByaXZpbGVnZXMgKHNldHJlc3VpZCwKKyAqIGNhcHNldCwgZXRjLikgd2lsbCBzdGlsbCB3b3JrLiAgRHJvcCB0aG9zZSBwcml2aWxlZ2VzIGlmIHlvdSB3YW50IHRoZW0gZ29uZS4KKyAqCisgKiBDaGFuZ2luZyBMU00gc2VjdXJpdHkgZG9tYWluIGlzIGNvbnNpZGVyZWQgYSBuZXcgcHJpdmlsZWdlLiAgU28sIGZvciBleGFtcGxlLAorICogYXNraW5nIHNlbGludXggZm9yIGEgc3BlY2lmaWMgbmV3IGNvbnRleHQgKGUuZy4gd2l0aCBydW5jb24pIHdpbGwgcmVzdWx0CisgKiBpbiBleGVjdmUgcmV0dXJuaW5nIC1FUEVSTS4KKyAqLworI2RlZmluZSBQUl9TRVRfTk9fTkVXX1BSSVZTIDM4CisjZGVmaW5lIFBSX0dFVF9OT19ORVdfUFJJVlMgMzkKKworI2VuZGlmIC8qIF9MSU5VWF9QUkNUTF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3B0cF9jbG9jay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wdHBfY2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGU5ODFmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wdHBfY2xvY2suaApAQCAtMCwwICsxLDg0IEBACisvKgorICogUFRQIDE1ODggY2xvY2sgc3VwcG9ydCAtIHVzZXIgc3BhY2UgaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE9NSUNST04gZWxlY3Ryb25pY3MgR21iSAorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfUFRQX0NMT0NLX0hfCisjZGVmaW5lIF9QVFBfQ0xPQ0tfSF8KKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogUFRQX3h4eCBiaXRzLCBmb3IgdGhlIGZsYWdzIGZpZWxkIHdpdGhpbiB0aGUgcmVxdWVzdCBzdHJ1Y3R1cmVzLiAqLworI2RlZmluZSBQVFBfRU5BQkxFX0ZFQVRVUkUgKDE8PDApCisjZGVmaW5lIFBUUF9SSVNJTkdfRURHRSAgICAoMTw8MSkKKyNkZWZpbmUgUFRQX0ZBTExJTkdfRURHRSAgICgxPDwyKQorCisvKgorICogc3RydWN0IHB0cF9jbG9ja190aW1lIC0gcmVwcmVzZW50cyBhIHRpbWUgdmFsdWUKKyAqCisgKiBUaGUgc2lnbiBvZiB0aGUgc2Vjb25kcyBmaWVsZCBhcHBsaWVzIHRvIHRoZSB3aG9sZSB2YWx1ZS4gVGhlCisgKiBuYW5vc2Vjb25kcyBmaWVsZCBpcyBhbHdheXMgdW5zaWduZWQuIFRoZSByZXNlcnZlZCBmaWVsZCBpcworICogaW5jbHVkZWQgZm9yIHN1Yi1uYW5vc2Vjb25kIHJlc29sdXRpb24sIHNob3VsZCB0aGUgZGVtYW5kIGZvcgorICogdGhpcyBldmVyIGFwcGVhci4KKyAqCisgKi8KK3N0cnVjdCBwdHBfY2xvY2tfdGltZSB7CisJX19zNjQgc2VjOyAgLyogc2Vjb25kcyAqLworCV9fdTMyIG5zZWM7IC8qIG5hbm9zZWNvbmRzICovCisJX191MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgcHRwX2Nsb2NrX2NhcHMgeworCWludCBtYXhfYWRqOyAgIC8qIE1heGltdW0gZnJlcXVlbmN5IGFkanVzdG1lbnQgaW4gcGFydHMgcGVyIGJpbGxvbi4gKi8KKwlpbnQgbl9hbGFybTsgICAvKiBOdW1iZXIgb2YgcHJvZ3JhbW1hYmxlIGFsYXJtcy4gKi8KKwlpbnQgbl9leHRfdHM7ICAvKiBOdW1iZXIgb2YgZXh0ZXJuYWwgdGltZSBzdGFtcCBjaGFubmVscy4gKi8KKwlpbnQgbl9wZXJfb3V0OyAvKiBOdW1iZXIgb2YgcHJvZ3JhbW1hYmxlIHBlcmlvZGljIHNpZ25hbHMuICovCisJaW50IHBwczsgICAgICAgLyogV2hldGhlciB0aGUgY2xvY2sgc3VwcG9ydHMgYSBQUFMgY2FsbGJhY2suICovCisJaW50IHJzdlsxNV07ICAgLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuICovCit9OworCitzdHJ1Y3QgcHRwX2V4dHRzX3JlcXVlc3QgeworCXVuc2lnbmVkIGludCBpbmRleDsgIC8qIFdoaWNoIGNoYW5uZWwgdG8gY29uZmlndXJlLiAqLworCXVuc2lnbmVkIGludCBmbGFnczsgIC8qIEJpdCBmaWVsZCBmb3IgUFRQX3h4eCBmbGFncy4gKi8KKwl1bnNpZ25lZCBpbnQgcnN2WzJdOyAvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gKi8KK307CisKK3N0cnVjdCBwdHBfcGVyb3V0X3JlcXVlc3QgeworCXN0cnVjdCBwdHBfY2xvY2tfdGltZSBzdGFydDsgIC8qIEFic29sdXRlIHN0YXJ0IHRpbWUuICovCisJc3RydWN0IHB0cF9jbG9ja190aW1lIHBlcmlvZDsgLyogRGVzaXJlZCBwZXJpb2QsIHplcm8gbWVhbnMgZGlzYWJsZS4gKi8KKwl1bnNpZ25lZCBpbnQgaW5kZXg7ICAgICAgICAgICAvKiBXaGljaCBjaGFubmVsIHRvIGNvbmZpZ3VyZS4gKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7ICAgICAgICAgICAvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gKi8KKwl1bnNpZ25lZCBpbnQgcnN2WzRdOyAgICAgICAgICAvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gKi8KK307CisKKyNkZWZpbmUgUFRQX0NMS19NQUdJQyAnPScKKworI2RlZmluZSBQVFBfQ0xPQ0tfR0VUQ0FQUyAgX0lPUihQVFBfQ0xLX01BR0lDLCAxLCBzdHJ1Y3QgcHRwX2Nsb2NrX2NhcHMpCisjZGVmaW5lIFBUUF9FWFRUU19SRVFVRVNUICBfSU9XKFBUUF9DTEtfTUFHSUMsIDIsIHN0cnVjdCBwdHBfZXh0dHNfcmVxdWVzdCkKKyNkZWZpbmUgUFRQX1BFUk9VVF9SRVFVRVNUIF9JT1coUFRQX0NMS19NQUdJQywgMywgc3RydWN0IHB0cF9wZXJvdXRfcmVxdWVzdCkKKyNkZWZpbmUgUFRQX0VOQUJMRV9QUFMgICAgIF9JT1coUFRQX0NMS19NQUdJQywgNCwgaW50KQorCitzdHJ1Y3QgcHRwX2V4dHRzX2V2ZW50IHsKKwlzdHJ1Y3QgcHRwX2Nsb2NrX3RpbWUgdDsgLyogVGltZSBldmVudCBvY2N1cmVkLiAqLworCXVuc2lnbmVkIGludCBpbmRleDsgICAgICAvKiBXaGljaCBjaGFubmVsIHByb2R1Y2VkIHRoZSBldmVudC4gKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7ICAgICAgLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuICovCisJdW5zaWduZWQgaW50IHJzdlsyXTsgICAgIC8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTk3MjM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wdHJhY2UuaApAQCAtMCwwICsxLDgyIEBACisjaWZuZGVmIF9MSU5VWF9QVFJBQ0VfSAorI2RlZmluZSBfTElOVVhfUFRSQUNFX0gKKy8qIHB0cmFjZS5oICovCisvKiBzdHJ1Y3RzIGFuZCBkZWZpbmVzIHRvIGhlbHAgdGhlIHVzZXIgdXNlIHRoZSBwdHJhY2Ugc3lzdGVtIGNhbGwuICovCisKKy8qIGhhcyB0aGUgZGVmaW5lcyB0byBnZXQgYXQgdGhlIHJlZ2lzdGVycy4gKi8KKworI2RlZmluZSBQVFJBQ0VfVFJBQ0VNRQkJICAgMAorI2RlZmluZSBQVFJBQ0VfUEVFS1RFWFQJCSAgIDEKKyNkZWZpbmUgUFRSQUNFX1BFRUtEQVRBCQkgICAyCisjZGVmaW5lIFBUUkFDRV9QRUVLVVNSCQkgICAzCisjZGVmaW5lIFBUUkFDRV9QT0tFVEVYVAkJICAgNAorI2RlZmluZSBQVFJBQ0VfUE9LRURBVEEJCSAgIDUKKyNkZWZpbmUgUFRSQUNFX1BPS0VVU1IJCSAgIDYKKyNkZWZpbmUgUFRSQUNFX0NPTlQJCSAgIDcKKyNkZWZpbmUgUFRSQUNFX0tJTEwJCSAgIDgKKyNkZWZpbmUgUFRSQUNFX1NJTkdMRVNURVAJICAgOQorCisjZGVmaW5lIFBUUkFDRV9BVFRBQ0gJCSAgMTYKKyNkZWZpbmUgUFRSQUNFX0RFVEFDSAkJICAxNworCisjZGVmaW5lIFBUUkFDRV9TWVNDQUxMCQkgIDI0CisKKy8qIDB4NDIwMC0weDQzMDAgYXJlIHJlc2VydmVkIGZvciBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgYWRkaXRpb25zLiAgKi8KKyNkZWZpbmUgUFRSQUNFX1NFVE9QVElPTlMJMHg0MjAwCisjZGVmaW5lIFBUUkFDRV9HRVRFVkVOVE1TRwkweDQyMDEKKyNkZWZpbmUgUFRSQUNFX0dFVFNJR0lORk8JMHg0MjAyCisjZGVmaW5lIFBUUkFDRV9TRVRTSUdJTkZPCTB4NDIwMworCisvKgorICogR2VuZXJpYyBwdHJhY2UgaW50ZXJmYWNlIHRoYXQgZXhwb3J0cyB0aGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIHJlZ3NldHMKKyAqIHVzaW5nIHRoZSBjb3JyZXNwb25kaW5nIE5UXyogdHlwZXMgKHdoaWNoIGFyZSBhbHNvIHVzZWQgaW4gdGhlIGNvcmUgZHVtcCkuCisgKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBOVF9QUlNUQVRVUyBub3RlIHR5cGUgaW4gYSBjb3JlIGR1bXAgY29udGFpbnMgYSBmdWxsCisgKiAnc3RydWN0IGVsZl9wcnN0YXR1cycuIEJ1dCB0aGUgdXNlcl9yZWdzZXQgZm9yIE5UX1BSU1RBVFVTIGNvbnRhaW5zIGp1c3QgdGhlCisgKiBlbGZfZ3JlZ3NldF90IHRoYXQgaXMgdGhlIHByX3JlZyBmaWVsZCBvZiAnc3RydWN0IGVsZl9wcnN0YXR1cycuIEZvciBhbGwgdGhlCisgKiBvdGhlciB1c2VyX3JlZ3NldCBmbGF2b3JzLCB0aGUgdXNlcl9yZWdzZXQgbGF5b3V0IGFuZCB0aGUgRUxGIGNvcmUgZHVtcCBub3RlCisgKiBwYXlsb2FkIGFyZSBleGFjdGx5IHRoZSBzYW1lIGxheW91dC4KKyAqCisgKiBUaGlzIGludGVyZmFjZSB1c2FnZSBpcyBhcyBmb2xsb3dzOgorICoJc3RydWN0IGlvdmVjIGlvdiA9IHsgYnVmLCBsZW59OworICoKKyAqCXJldCA9IHB0cmFjZShQVFJBQ0VfR0VUUkVHU0VUL1BUUkFDRV9TRVRSRUdTRVQsIHBpZCwgTlRfWFhYX1RZUEUsICZpb3YpOworICoKKyAqIE9uIHRoZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24sIGlvdi5sZW4gd2lsbCBiZSB1cGRhdGVkIGJ5IHRoZSBrZXJuZWwsCisgKiBzcGVjaWZ5aW5nIGhvdyBtdWNoIHRoZSBrZXJuZWwgaGFzIHdyaXR0ZW4vcmVhZCB0by9mcm9tIHRoZSB1c2VyJ3MgaW92LmJ1Zi4KKyAqLworI2RlZmluZSBQVFJBQ0VfR0VUUkVHU0VUCTB4NDIwNAorI2RlZmluZSBQVFJBQ0VfU0VUUkVHU0VUCTB4NDIwNQorCisjZGVmaW5lIFBUUkFDRV9TRUlaRQkJMHg0MjA2CisjZGVmaW5lIFBUUkFDRV9JTlRFUlJVUFQJMHg0MjA3CisjZGVmaW5lIFBUUkFDRV9MSVNURU4JCTB4NDIwOAorCisvKiBmbGFncyBpbiBAZGF0YSBmb3IgUFRSQUNFX1NFSVpFICovCisjZGVmaW5lIFBUUkFDRV9TRUlaRV9ERVZFTAkweDgwMDAwMDAwIC8qIHRlbXAgZmxhZyBmb3IgZGV2ZWxvcG1lbnQgKi8KKworLyogb3B0aW9ucyBzZXQgdXNpbmcgUFRSQUNFX1NFVE9QVElPTlMgKi8KKyNkZWZpbmUgUFRSQUNFX09fVFJBQ0VTWVNHT09ECTB4MDAwMDAwMDEKKyNkZWZpbmUgUFRSQUNFX09fVFJBQ0VGT1JLCTB4MDAwMDAwMDIKKyNkZWZpbmUgUFRSQUNFX09fVFJBQ0VWRk9SSwkweDAwMDAwMDA0CisjZGVmaW5lIFBUUkFDRV9PX1RSQUNFQ0xPTkUJMHgwMDAwMDAwOAorI2RlZmluZSBQVFJBQ0VfT19UUkFDRUVYRUMJMHgwMDAwMDAxMAorI2RlZmluZSBQVFJBQ0VfT19UUkFDRVZGT1JLRE9ORQkweDAwMDAwMDIwCisjZGVmaW5lIFBUUkFDRV9PX1RSQUNFRVhJVAkweDAwMDAwMDQwCisjZGVmaW5lIFBUUkFDRV9PX1RSQUNFU0VDQ09NUAkweDAwMDAwMDgwCisKKyNkZWZpbmUgUFRSQUNFX09fTUFTSwkJMHgwMDAwMDBmZgorCisvKiBXYWl0IGV4dGVuZGVkIHJlc3VsdCBjb2RlcyBmb3IgdGhlIGFib3ZlIHRyYWNlIG9wdGlvbnMuICAqLworI2RlZmluZSBQVFJBQ0VfRVZFTlRfRk9SSwkxCisjZGVmaW5lIFBUUkFDRV9FVkVOVF9WRk9SSwkyCisjZGVmaW5lIFBUUkFDRV9FVkVOVF9DTE9ORQkzCisjZGVmaW5lIFBUUkFDRV9FVkVOVF9FWEVDCTQKKyNkZWZpbmUgUFRSQUNFX0VWRU5UX1ZGT1JLX0RPTkUJNQorI2RlZmluZSBQVFJBQ0VfRVZFTlRfRVhJVAk2CisjZGVmaW5lIFBUUkFDRV9FVkVOVF9TVE9QCTcKKyNkZWZpbmUgUFRSQUNFX0VWRU5UX1NFQ0NPTVAJOAorCisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9xbng0X2ZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3FueDRfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjlhZWUxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9xbng0X2ZzLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqICBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgIDogcW54NF9mcy5oCisgKiAgQXV0aG9yICAgICAgICAgICAgICAgICAgICAgICA6IFJpY2hhcmQgRnJvd2lqbgorICogIEZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgOiBxbng0IGdsb2JhbCBmaWxlc3lzdGVtIGRlZmluaXRpb25zCisgKiAgSGlzdG9yeSAgICAgICAgICAgICAgICAgICAgICA6IDIzLTAzLTE5OTggY3JlYXRlZAorICovCisjaWZuZGVmIF9MSU5VWF9RTlg0X0ZTX0gKKyNkZWZpbmUgX0xJTlVYX1FOWDRfRlNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9xbnh0eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisKKyNkZWZpbmUgUU5YNF9ST09UX0lOTyAxCisKKyNkZWZpbmUgUU5YNF9NQVhfWFROVFNfUEVSX1hCTEsJNjAKKy8qIGZvciBkaV9zdGF0dXMgKi8KKyNkZWZpbmUgUU5YNF9GSUxFX1VTRUQgICAgICAgICAgMHgwMQorI2RlZmluZSBRTlg0X0ZJTEVfTU9ESUZJRUQgICAgICAweDAyCisjZGVmaW5lIFFOWDRfRklMRV9CVVNZICAgICAgICAgIDB4MDQKKyNkZWZpbmUgUU5YNF9GSUxFX0xJTksgICAgICAgICAgMHgwOAorI2RlZmluZSBRTlg0X0ZJTEVfSU5PREUgICAgICAgICAweDEwCisjZGVmaW5lIFFOWDRfRklMRV9GU1lTQ0xFQU4gICAgIDB4MjAKKworI2RlZmluZSBRTlg0X0lfTUFQX1NMT1RTCTgKKyNkZWZpbmUgUU5YNF9aX01BUF9TTE9UUwk2NAorI2RlZmluZSBRTlg0X1ZBTElEX0ZTCQkweDAwMDEJLyogQ2xlYW4gZnMuICovCisjZGVmaW5lIFFOWDRfRVJST1JfRlMJCTB4MDAwMgkvKiBmcyBoYXMgZXJyb3JzLiAqLworI2RlZmluZSBRTlg0X0JMT0NLX1NJWkUgICAgICAgICAweDIwMAkvKiBibG9ja3NpemUgb2YgNTEyIGJ5dGVzICovCisjZGVmaW5lIFFOWDRfQkxPQ0tfU0laRV9CSVRTICAgIDkJLyogYmxvY2tzaXplIHNoaWZ0ICovCisjZGVmaW5lIFFOWDRfRElSX0VOVFJZX1NJWkUgICAgIDB4MDQwCS8qIGRpciBlbnRyeSBzaXplIG9mIDY0IGJ5dGVzICovCisjZGVmaW5lIFFOWDRfRElSX0VOVFJZX1NJWkVfQklUUyA2CS8qIGRpciBlbnRyeSBzaXplIHNoaWZ0ICovCisjZGVmaW5lIFFOWDRfWEJMS19FTlRSWV9TSVpFICAgIDB4MjAwCS8qIHhibGsgZW50cnkgc2l6ZSAqLworI2RlZmluZSBRTlg0X0lOT0RFU19QRVJfQkxPQ0sgICAweDA4CS8qIDUxMiAvIDY0ICovCisKKy8qIGZvciBmaWxlbmFtZXMgKi8KKyNkZWZpbmUgUU5YNF9TSE9SVF9OQU1FX01BWAkxNgorI2RlZmluZSBRTlg0X05BTUVfTUFYCQk0OAorCisvKgorICogVGhpcyBpcyB0aGUgb3JpZ2luYWwgcW54NCBpbm9kZSBsYXlvdXQgb24gZGlzay4KKyAqLworc3RydWN0IHFueDRfaW5vZGVfZW50cnkgeworCWNoYXIJCWRpX2ZuYW1lW1FOWDRfU0hPUlRfTkFNRV9NQVhdOworCXFueDRfb2ZmX3QJZGlfc2l6ZTsKKwlxbng0X3h0bnRfdAlkaV9maXJzdF94dG50OworCV9fbGUzMgkJZGlfeGJsazsKKwlfX2xlMzIJCWRpX2Z0aW1lOworCV9fbGUzMgkJZGlfbXRpbWU7CisJX19sZTMyCQlkaV9hdGltZTsKKwlfX2xlMzIJCWRpX2N0aW1lOworCXFueDRfbnh0bnRfdAlkaV9udW1feHRudHM7CisJcW54NF9tb2RlX3QJZGlfbW9kZTsKKwlxbng0X211aWRfdAlkaV91aWQ7CisJcW54NF9tZ2lkX3QJZGlfZ2lkOworCXFueDRfbmxpbmtfdAlkaV9ubGluazsKKwlfX3U4CQlkaV96ZXJvWzRdOworCXFueDRfZnR5cGVfdAlkaV90eXBlOworCV9fdTgJCWRpX3N0YXR1czsKK307CisKK3N0cnVjdCBxbng0X2xpbmtfaW5mbyB7CisJY2hhcgkJZGxfZm5hbWVbUU5YNF9OQU1FX01BWF07CisJX19sZTMyCQlkbF9pbm9kZV9ibGs7CisJX191OAkJZGxfaW5vZGVfbmR4OworCV9fdTgJCWRsX3NwYXJlWzEwXTsKKwlfX3U4CQlkbF9zdGF0dXM7Cit9OworCitzdHJ1Y3QgcW54NF94YmxrIHsKKwlfX2xlMzIJCXhibGtfbmV4dF94YmxrOworCV9fbGUzMgkJeGJsa19wcmV2X3hibGs7CisJX191OAkJeGJsa19udW1feHRudHM7CisJX191OAkJeGJsa19zcGFyZVszXTsKKwlfX2xlMzIJCXhibGtfbnVtX2Jsb2NrczsKKwlxbng0X3h0bnRfdAl4YmxrX3h0bnRzW1FOWDRfTUFYX1hUTlRTX1BFUl9YQkxLXTsKKwljaGFyCQl4YmxrX3NpZ25hdHVyZVs4XTsKKwlxbng0X3h0bnRfdAl4YmxrX2ZpcnN0X3h0bnQ7Cit9OworCitzdHJ1Y3QgcW54NF9zdXBlcl9ibG9jayB7CisJc3RydWN0IHFueDRfaW5vZGVfZW50cnkgUm9vdERpcjsKKwlzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSBJbm9kZTsKKwlzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSBCb290OworCXN0cnVjdCBxbng0X2lub2RlX2VudHJ5IEFsdEJvb3Q7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcW54dHlwZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcW54dHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWJiZTVjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9xbnh0eXBlcy5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiAgTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICA6IHFueHR5cGVzLmgKKyAqICBBdXRob3IgICAgICAgICAgICAgICAgICAgICAgIDogUmljaGFyZCBGcm93aWpuCisgKiAgRnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICA6IHN0YW5kYXJkIHFueCB0eXBlcworICogIEhpc3RvcnkgICAgICAgICAgICAgICAgICAgICAgOiAyMi0wMy0xOTk4IGNyZWF0ZWQKKyAqCisgKi8KKworI2lmbmRlZiBfUU5YNFRZUEVTX0gKKyNkZWZpbmUgX1FOWDRUWVBFU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCit0eXBlZGVmIF9fbGUxNiBxbng0X254dG50X3Q7Cit0eXBlZGVmIF9fdTggIHFueDRfZnR5cGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fbGUzMiB4dG50X2JsazsKKwlfX2xlMzIgeHRudF9zaXplOworfSBxbng0X3h0bnRfdDsKKwordHlwZWRlZiBfX2xlMTYgcW54NF9tb2RlX3Q7Cit0eXBlZGVmIF9fbGUxNiBxbng0X211aWRfdDsKK3R5cGVkZWYgX19sZTE2IHFueDRfbWdpZF90OwordHlwZWRlZiBfX2xlMzIgcW54NF9vZmZfdDsKK3R5cGVkZWYgX19sZTE2IHFueDRfbmxpbmtfdDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3F1b3RhLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3F1b3RhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmZDYxNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcXVvdGEuaApAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIFJvYmVydCBFbHogYXQgVGhlIFVuaXZlcnNpdHkgb2YgTWVsYm91cm5lLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9RVU9UQV8KKyNkZWZpbmUgX0xJTlVYX1FVT1RBXworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIF9fRFFVT1RfVkVSU0lPTl9fCSJkcXVvdF82LjUuMiIKKworI2RlZmluZSBNQVhRVU9UQVMgMgorI2RlZmluZSBVU1JRVU9UQSAgMAkJLyogZWxlbWVudCB1c2VkIGZvciB1c2VyIHF1b3RhcyAqLworI2RlZmluZSBHUlBRVU9UQSAgMQkJLyogZWxlbWVudCB1c2VkIGZvciBncm91cCBxdW90YXMgKi8KKworLyoKKyAqIERlZmluaXRpb25zIGZvciB0aGUgZGVmYXVsdCBuYW1lcyBvZiB0aGUgcXVvdGFzIGZpbGVzLgorICovCisjZGVmaW5lIElOSVRRRk5BTUVTIHsgXAorCSJ1c2VyIiwgICAgLyogVVNSUVVPVEEgKi8gXAorCSJncm91cCIsICAgLyogR1JQUVVPVEEgKi8gXAorCSJ1bmRlZmluZWQiLCBcCit9OworCisvKgorICogQ29tbWFuZCBkZWZpbml0aW9ucyBmb3IgdGhlICdxdW90YWN0bCcgc3lzdGVtIGNhbGwuCisgKiBUaGUgY29tbWFuZHMgYXJlIGJyb2tlbiBpbnRvIGEgbWFpbiBjb21tYW5kIGRlZmluZWQgYmVsb3cKKyAqIGFuZCBhIHN1YmNvbW1hbmQgdGhhdCBpcyB1c2VkIHRvIGNvbnZleSB0aGUgdHlwZSBvZgorICogcXVvdGEgdGhhdCBpcyBiZWluZyBtYW5pcHVsYXRlZCAoc2VlIGFib3ZlKS4KKyAqLworI2RlZmluZSBTVUJDTURNQVNLICAweDAwZmYKKyNkZWZpbmUgU1VCQ01EU0hJRlQgOAorI2RlZmluZSBRQ01EKGNtZCwgdHlwZSkgICgoKGNtZCkgPDwgU1VCQ01EU0hJRlQpIHwgKCh0eXBlKSAmIFNVQkNNRE1BU0spKQorCisjZGVmaW5lIFFfU1lOQyAgICAgMHg4MDAwMDEJLyogc3luYyBkaXNrIGNvcHkgb2YgYSBmaWxlc3lzdGVtcyBxdW90YXMgKi8KKyNkZWZpbmUgUV9RVU9UQU9OICAweDgwMDAwMgkvKiB0dXJuIHF1b3RhcyBvbiAqLworI2RlZmluZSBRX1FVT1RBT0ZGIDB4ODAwMDAzCS8qIHR1cm4gcXVvdGFzIG9mZiAqLworI2RlZmluZSBRX0dFVEZNVCAgIDB4ODAwMDA0CS8qIGdldCBxdW90YSBmb3JtYXQgdXNlZCBvbiBnaXZlbiBmaWxlc3lzdGVtICovCisjZGVmaW5lIFFfR0VUSU5GTyAgMHg4MDAwMDUJLyogZ2V0IGluZm9ybWF0aW9uIGFib3V0IHF1b3RhIGZpbGVzICovCisjZGVmaW5lIFFfU0VUSU5GTyAgMHg4MDAwMDYJLyogc2V0IGluZm9ybWF0aW9uIGFib3V0IHF1b3RhIGZpbGVzICovCisjZGVmaW5lIFFfR0VUUVVPVEEgMHg4MDAwMDcJLyogZ2V0IHVzZXIgcXVvdGEgc3RydWN0dXJlICovCisjZGVmaW5lIFFfU0VUUVVPVEEgMHg4MDAwMDgJLyogc2V0IHVzZXIgcXVvdGEgc3RydWN0dXJlICovCisKKy8qIFF1b3RhIGZvcm1hdCB0eXBlIElEcyAqLworI2RlZmluZQlRRk1UX1ZGU19PTEQgMQorI2RlZmluZQlRRk1UX1ZGU19WMCAyCisjZGVmaW5lIFFGTVRfT0NGUzIgMworI2RlZmluZQlRRk1UX1ZGU19WMSA0CisKKy8qIFNpemUgb2YgYmxvY2sgaW4gd2hpY2ggc3BhY2UgbGltaXRzIGFyZSBwYXNzZWQgdGhyb3VnaCB0aGUgcXVvdGEKKyAqIGludGVyZmFjZSAqLworI2RlZmluZSBRSUZfRFFCTEtTSVpFX0JJVFMgMTAKKyNkZWZpbmUgUUlGX0RRQkxLU0laRSAoMSA8PCBRSUZfRFFCTEtTSVpFX0JJVFMpCisKKy8qCisgKiBRdW90YSBzdHJ1Y3R1cmUgdXNlZCBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHVzZXJzcGFjZSB2aWEgcXVvdGFjdGwKKyAqIEZvbGxvd2luZyBmbGFncyBhcmUgdXNlZCB0byBzcGVjaWZ5IHdoaWNoIGZpZWxkcyBhcmUgdmFsaWQKKyAqLworZW51bSB7CisJUUlGX0JMSU1JVFNfQiA9IDAsCisJUUlGX1NQQUNFX0IsCisJUUlGX0lMSU1JVFNfQiwKKwlRSUZfSU5PREVTX0IsCisJUUlGX0JUSU1FX0IsCisJUUlGX0lUSU1FX0IsCit9OworCisjZGVmaW5lIFFJRl9CTElNSVRTCSgxIDw8IFFJRl9CTElNSVRTX0IpCisjZGVmaW5lIFFJRl9TUEFDRQkoMSA8PCBRSUZfU1BBQ0VfQikKKyNkZWZpbmUgUUlGX0lMSU1JVFMJKDEgPDwgUUlGX0lMSU1JVFNfQikKKyNkZWZpbmUgUUlGX0lOT0RFUwkoMSA8PCBRSUZfSU5PREVTX0IpCisjZGVmaW5lIFFJRl9CVElNRQkoMSA8PCBRSUZfQlRJTUVfQikKKyNkZWZpbmUgUUlGX0lUSU1FCSgxIDw8IFFJRl9JVElNRV9CKQorI2RlZmluZSBRSUZfTElNSVRTCShRSUZfQkxJTUlUUyB8IFFJRl9JTElNSVRTKQorI2RlZmluZSBRSUZfVVNBR0UJKFFJRl9TUEFDRSB8IFFJRl9JTk9ERVMpCisjZGVmaW5lIFFJRl9USU1FUwkoUUlGX0JUSU1FIHwgUUlGX0lUSU1FKQorI2RlZmluZSBRSUZfQUxMCQkoUUlGX0xJTUlUUyB8IFFJRl9VU0FHRSB8IFFJRl9USU1FUykKKworc3RydWN0IGlmX2RxYmxrIHsKKwlfX3U2NCBkcWJfYmhhcmRsaW1pdDsKKwlfX3U2NCBkcWJfYnNvZnRsaW1pdDsKKwlfX3U2NCBkcWJfY3Vyc3BhY2U7CisJX191NjQgZHFiX2loYXJkbGltaXQ7CisJX191NjQgZHFiX2lzb2Z0bGltaXQ7CisJX191NjQgZHFiX2N1cmlub2RlczsKKwlfX3U2NCBkcWJfYnRpbWU7CisJX191NjQgZHFiX2l0aW1lOworCV9fdTMyIGRxYl92YWxpZDsKK307CisKKy8qCisgKiBTdHJ1Y3R1cmUgdXNlZCBmb3Igc2V0dGluZyBxdW90YSBpbmZvcm1hdGlvbiBhYm91dCBmaWxlIHZpYSBxdW90YWN0bAorICogRm9sbG93aW5nIGZsYWdzIGFyZSB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggZmllbGRzIGFyZSB2YWxpZAorICovCisjZGVmaW5lIElJRl9CR1JBQ0UJMQorI2RlZmluZSBJSUZfSUdSQUNFCTIKKyNkZWZpbmUgSUlGX0ZMQUdTCTQKKyNkZWZpbmUgSUlGX0FMTAkJKElJRl9CR1JBQ0UgfCBJSUZfSUdSQUNFIHwgSUlGX0ZMQUdTKQorCitzdHJ1Y3QgaWZfZHFpbmZvIHsKKwlfX3U2NCBkcWlfYmdyYWNlOworCV9fdTY0IGRxaV9pZ3JhY2U7CisJX191MzIgZHFpX2ZsYWdzOworCV9fdTMyIGRxaV92YWxpZDsKK307CisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgcXVvdGEgbmV0bGluayBpbnRlcmZhY2UKKyAqLworI2RlZmluZSBRVU9UQV9OTF9OT1dBUk4gMAorI2RlZmluZSBRVU9UQV9OTF9JSEFSRFdBUk4gMQkJLyogSW5vZGUgaGFyZGxpbWl0IHJlYWNoZWQgKi8KKyNkZWZpbmUgUVVPVEFfTkxfSVNPRlRMT05HV0FSTiAyIAkvKiBJbm9kZSBncmFjZSB0aW1lIGV4cGlyZWQgKi8KKyNkZWZpbmUgUVVPVEFfTkxfSVNPRlRXQVJOIDMJCS8qIElub2RlIHNvZnRsaW1pdCByZWFjaGVkICovCisjZGVmaW5lIFFVT1RBX05MX0JIQVJEV0FSTiA0CQkvKiBCbG9jayBoYXJkbGltaXQgcmVhY2hlZCAqLworI2RlZmluZSBRVU9UQV9OTF9CU09GVExPTkdXQVJOIDUJLyogQmxvY2sgZ3JhY2UgdGltZSBleHBpcmVkICovCisjZGVmaW5lIFFVT1RBX05MX0JTT0ZUV0FSTiA2CQkvKiBCbG9jayBzb2Z0bGltaXQgcmVhY2hlZCAqLworI2RlZmluZSBRVU9UQV9OTF9JSEFSREJFTE9XIDcJCS8qIFVzYWdlIGdvdCBiZWxvdyBpbm9kZSBoYXJkbGltaXQgKi8KKyNkZWZpbmUgUVVPVEFfTkxfSVNPRlRCRUxPVyA4CQkvKiBVc2FnZSBnb3QgYmVsb3cgaW5vZGUgc29mdGxpbWl0ICovCisjZGVmaW5lIFFVT1RBX05MX0JIQVJEQkVMT1cgOQkJLyogVXNhZ2UgZ290IGJlbG93IGJsb2NrIGhhcmRsaW1pdCAqLworI2RlZmluZSBRVU9UQV9OTF9CU09GVEJFTE9XIDEwCQkvKiBVc2FnZSBnb3QgYmVsb3cgYmxvY2sgc29mdGxpbWl0ICovCisKK2VudW0geworCVFVT1RBX05MX0NfVU5TUEVDLAorCVFVT1RBX05MX0NfV0FSTklORywKKwlfX1FVT1RBX05MX0NfTUFYLAorfTsKKyNkZWZpbmUgUVVPVEFfTkxfQ19NQVggKF9fUVVPVEFfTkxfQ19NQVggLSAxKQorCitlbnVtIHsKKwlRVU9UQV9OTF9BX1VOU1BFQywKKwlRVU9UQV9OTF9BX1FUWVBFLAorCVFVT1RBX05MX0FfRVhDRVNTX0lELAorCVFVT1RBX05MX0FfV0FSTklORywKKwlRVU9UQV9OTF9BX0RFVl9NQUpPUiwKKwlRVU9UQV9OTF9BX0RFVl9NSU5PUiwKKwlRVU9UQV9OTF9BX0NBVVNFRF9JRCwKKwlfX1FVT1RBX05MX0FfTUFYLAorfTsKKyNkZWZpbmUgUVVPVEFfTkxfQV9NQVggKF9fUVVPVEFfTkxfQV9NQVggLSAxKQorCisKKyNlbmRpZiAvKiBfUVVPVEFfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JhZGVvbmZiLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JhZGVvbmZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM0YmJkZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmFkZW9uZmIuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIF9fTElOVVhfUkFERU9ORkJfSF9fCisjZGVmaW5lIF9fTElOVVhfUkFERU9ORkJfSF9fCisKKyNpbmNsdWRlIDxhc20vaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEFUWV9SQURFT05fTENEX09OCTB4MDAwMDAwMDEKKyNkZWZpbmUgQVRZX1JBREVPTl9DUlRfT04JMHgwMDAwMDAwMgorCisKKyNkZWZpbmUgRkJJT19SQURFT05fR0VUX01JUlJPUglfSU9SKCdAJywgMywgc2l6ZV90KQorI2RlZmluZSBGQklPX1JBREVPTl9TRVRfTUlSUk9SCV9JT1coJ0AnLCA0LCBzaXplX3QpCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yYWlkL21kX3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2M2ZDFhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yYWlkL21kX3AuaApAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAgIG1kX3AuaCA6IHBoeXNpY2FsIGxheW91dCBvZiBMaW51eCBSQUlEIGRldmljZXMKKyAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTYtOTggSW5nbyBNb2xuYXIsIEdhZGkgT3htYW4KKwkgIAorICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgIAorICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIChmb3IgZXhhbXBsZSAvdXNyL3NyYy9saW51eC9DT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAKKyovCisKKyNpZm5kZWYgX01EX1BfSAorI2RlZmluZSBfTURfUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogUkFJRCBzdXBlcmJsb2NrLgorICoKKyAqIFRoZSBSQUlEIHN1cGVyYmxvY2sgbWFpbnRhaW5zIHNvbWUgc3RhdGlzdGljcyBvbiBlYWNoIFJBSUQgY29uZmlndXJhdGlvbi4KKyAqIEVhY2ggcmVhbCBkZXZpY2UgaW4gdGhlIFJBSUQgc2V0IGNvbnRhaW5zIGl0IG5lYXIgdGhlIGVuZCBvZiB0aGUgZGV2aWNlLgorICogU29tZSBvZiB0aGUgaWRlYXMgYXJlIGNvcGllZCBmcm9tIHRoZSBleHQyZnMgaW1wbGVtZW50YXRpb24uCisgKgorICogV2UgY3VycmVudGx5IHVzZSA0MDk2IGJ5dGVzIGFzIGZvbGxvd3M6CisgKgorICoJd29yZCBvZmZzZXQJZnVuY3Rpb24KKyAqCisgKgkgICAwICAtICAgIDMxCUNvbnN0YW50IGdlbmVyaWMgUkFJRCBkZXZpY2UgaW5mb3JtYXRpb24uCisgKiAgICAgICAgMzIgIC0gICAgNjMgICBHZW5lcmljIHN0YXRlIGluZm9ybWF0aW9uLgorICoJICA2NCAgLSAgIDEyNwlQZXJzb25hbGl0eSBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KKyAqCSAxMjggIC0gICA1MTEJMTIgMzItd29yZHMgZGVzY3JpcHRvcnMgb2YgdGhlIGRpc2tzIGluIHRoZSByYWlkIHNldC4KKyAqCSA1MTIgIC0gICA5MTEJUmVzZXJ2ZWQuCisgKgkgOTEyICAtICAxMDIzCURpc2sgc3BlY2lmaWMgZGVzY3JpcHRvci4KKyAqLworCisvKgorICogSWYgeCBpcyB0aGUgcmVhbCBkZXZpY2Ugc2l6ZSBpbiBieXRlcywgd2UgcmV0dXJuIGFuIGFwcGFyZW50IHNpemUgb2Y6CisgKgorICoJeSA9ICh4ICYgfihNRF9SRVNFUlZFRF9CWVRFUyAtIDEpKSAtIE1EX1JFU0VSVkVEX0JZVEVTCisgKgorICogYW5kIHBsYWNlIHRoZSA0a0Igc3VwZXJibG9jayBhdCBvZmZzZXQgeS4KKyAqLworI2RlZmluZSBNRF9SRVNFUlZFRF9CWVRFUwkJKDY0ICogMTAyNCkKKyNkZWZpbmUgTURfUkVTRVJWRURfU0VDVE9SUwkJKE1EX1JFU0VSVkVEX0JZVEVTIC8gNTEyKQorCisjZGVmaW5lIE1EX05FV19TSVpFX1NFQ1RPUlMoeCkJCSgoeCAmIH4oTURfUkVTRVJWRURfU0VDVE9SUyAtIDEpKSAtIE1EX1JFU0VSVkVEX1NFQ1RPUlMpCisKKyNkZWZpbmUgTURfU0JfQllURVMJCQk0MDk2CisjZGVmaW5lIE1EX1NCX1dPUkRTCQkJKE1EX1NCX0JZVEVTIC8gNCkKKyNkZWZpbmUgTURfU0JfU0VDVE9SUwkJCShNRF9TQl9CWVRFUyAvIDUxMikKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgYXJlIGNvdW50ZWQgaW4gMzItYml0IHdvcmRzCisgKi8KKyNkZWZpbmUJTURfU0JfR0VORVJJQ19PRkZTRVQJCTAKKyNkZWZpbmUgTURfU0JfUEVSU09OQUxJVFlfT0ZGU0VUCTY0CisjZGVmaW5lIE1EX1NCX0RJU0tTX09GRlNFVAkJMTI4CisjZGVmaW5lIE1EX1NCX0RFU0NSSVBUT1JfT0ZGU0VUCQk5OTIKKworI2RlZmluZSBNRF9TQl9HRU5FUklDX0NPTlNUQU5UX1dPUkRTCTMyCisjZGVmaW5lIE1EX1NCX0dFTkVSSUNfU1RBVEVfV09SRFMJMzIKKyNkZWZpbmUgTURfU0JfR0VORVJJQ19XT1JEUwkJKE1EX1NCX0dFTkVSSUNfQ09OU1RBTlRfV09SRFMgKyBNRF9TQl9HRU5FUklDX1NUQVRFX1dPUkRTKQorI2RlZmluZSBNRF9TQl9QRVJTT05BTElUWV9XT1JEUwkJNjQKKyNkZWZpbmUgTURfU0JfREVTQ1JJUFRPUl9XT1JEUwkJMzIKKyNkZWZpbmUgTURfU0JfRElTS1MJCQkyNworI2RlZmluZSBNRF9TQl9ESVNLU19XT1JEUwkJKE1EX1NCX0RJU0tTKk1EX1NCX0RFU0NSSVBUT1JfV09SRFMpCisjZGVmaW5lIE1EX1NCX1JFU0VSVkVEX1dPUkRTCQkoMTAyNCAtIE1EX1NCX0dFTkVSSUNfV09SRFMgLSBNRF9TQl9QRVJTT05BTElUWV9XT1JEUyAtIE1EX1NCX0RJU0tTX1dPUkRTIC0gTURfU0JfREVTQ1JJUFRPUl9XT1JEUykKKyNkZWZpbmUgTURfU0JfRVFVQUxfV09SRFMJCShNRF9TQl9HRU5FUklDX1dPUkRTICsgTURfU0JfUEVSU09OQUxJVFlfV09SRFMgKyBNRF9TQl9ESVNLU19XT1JEUykKKworLyoKKyAqIERldmljZSAib3BlcmF0aW9uYWwiIHN0YXRlIGJpdHMKKyAqLworI2RlZmluZSBNRF9ESVNLX0ZBVUxUWQkJMCAvKiBkaXNrIGlzIGZhdWx0eSAvIG9wZXJhdGlvbmFsICovCisjZGVmaW5lIE1EX0RJU0tfQUNUSVZFCQkxIC8qIGRpc2sgaXMgcnVubmluZyBvciBzcGFyZSBkaXNrICovCisjZGVmaW5lIE1EX0RJU0tfU1lOQwkJMiAvKiBkaXNrIGlzIGluIHN5bmMgd2l0aCB0aGUgcmFpZCBzZXQgKi8KKyNkZWZpbmUgTURfRElTS19SRU1PVkVECQkzIC8qIGRpc2sgaXMgaW4gc3luYyB3aXRoIHRoZSByYWlkIHNldCAqLworCisjZGVmaW5lCU1EX0RJU0tfV1JJVEVNT1NUTFkJOSAvKiBkaXNrIGlzICJ3cml0ZS1tb3N0bHkiIGlzIFJBSUQxIGNvbmZpZy4KKwkJCQkgICAqIHJlYWQgcmVxdWVzdHMgd2lsbCBvbmx5IGJlIHNlbnQgaGVyZSBpbgorCQkJCSAgICogZGlyZSBuZWVkCisJCQkJICAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbWRwX2RldmljZV9kZXNjcmlwdG9yX3MgeworCV9fdTMyIG51bWJlcjsJCS8qIDAgRGV2aWNlIG51bWJlciBpbiB0aGUgZW50aXJlIHNldAkgICAgICAqLworCV9fdTMyIG1ham9yOwkJLyogMSBEZXZpY2UgbWFqb3IgbnVtYmVyCQkgICAgICAqLworCV9fdTMyIG1pbm9yOwkJLyogMiBEZXZpY2UgbWlub3IgbnVtYmVyCQkgICAgICAqLworCV9fdTMyIHJhaWRfZGlzazsJLyogMyBUaGUgcm9sZSBvZiB0aGUgZGV2aWNlIGluIHRoZSByYWlkIHNldCAgICovCisJX191MzIgc3RhdGU7CQkvKiA0IE9wZXJhdGlvbmFsIHN0YXRlCQkJICAgICAgKi8KKwlfX3UzMiByZXNlcnZlZFtNRF9TQl9ERVNDUklQVE9SX1dPUkRTIC0gNV07Cit9IG1kcF9kaXNrX3Q7CisKKyNkZWZpbmUgTURfU0JfTUFHSUMJCTB4YTkyYjRlZmMKKworLyoKKyAqIFN1cGVyYmxvY2sgc3RhdGUgYml0cworICovCisjZGVmaW5lIE1EX1NCX0NMRUFOCQkwCisjZGVmaW5lIE1EX1NCX0VSUk9SUwkJMQorCisjZGVmaW5lCU1EX1NCX0JJVE1BUF9QUkVTRU5UCTggLyogYml0bWFwIG1heSBiZSBwcmVzZW50IG5lYXJieSAqLworCisvKgorICogTm90ZXM6CisgKiAtIGlmIGFuIGFycmF5IGlzIGJlaW5nIHJlc2hhcGVkIChyZXN0cmlwZWQpIGluIG9yZGVyIHRvIGNoYW5nZSB0aGUKKyAqICAgdGhlIG51bWJlciBvZiBhY3RpdmUgZGV2aWNlcyBpbiB0aGUgYXJyYXksICdyYWlkX2Rpc2tzJyB3aWxsIGJlCisgKiAgIHRoZSBsYXJnZXIgb2YgdGhlIG9sZCBhbmQgbmV3IG51bWJlcnMuICAnZGVsdGFfZGlza3MnIHdpbGwKKyAqICAgYmUgdGhlICJuZXcgLSBvbGQiLiAgU28gaWYgK3ZlLCByYWlkX2Rpc2tzIGlzIHRoZSBuZXcgdmFsdWUsIGFuZAorICogICAicmFpZF9kaXNrcy1kZWx0YV9kaXNrcyIgaXMgdGhlIG9sZC4gIElmIC12ZSwgcmFpZF9kaXNrcyBpcyB0aGUKKyAqICAgb2xkIHZhbHVlIGFuZCAicmFpZF9kaXNrcytkZWx0YV9kaXNrcyIgaXMgdGhlIG5ldyAoc21hbGxlcikgdmFsdWUuCisgKi8KKworCit0eXBlZGVmIHN0cnVjdCBtZHBfc3VwZXJibG9ja19zIHsKKwkvKgorCSAqIENvbnN0YW50IGdlbmVyaWMgaW5mb3JtYXRpb24KKwkgKi8KKwlfX3UzMiBtZF9tYWdpYzsJCS8qICAwIE1EIGlkZW50aWZpZXIgCQkJICAgICAgKi8KKwlfX3UzMiBtYWpvcl92ZXJzaW9uOwkvKiAgMSBtYWpvciB2ZXJzaW9uIHRvIHdoaWNoIHRoZSBzZXQgY29uZm9ybXMgKi8KKwlfX3UzMiBtaW5vcl92ZXJzaW9uOwkvKiAgMiBtaW5vciB2ZXJzaW9uIC4uLgkJCSAgICAgICovCisJX191MzIgcGF0Y2hfdmVyc2lvbjsJLyogIDMgcGF0Y2hsZXZlbCB2ZXJzaW9uIC4uLgkJICAgICAgKi8KKwlfX3UzMiBndmFsaWRfd29yZHM7CS8qICA0IE51bWJlciBvZiB1c2VkIHdvcmRzIGluIHRoaXMgc2VjdGlvbiAgICAqLworCV9fdTMyIHNldF91dWlkMDsJLyogIDUgUmFpZCBzZXQgaWRlbnRpZmllcgkJICAgICAgKi8KKwlfX3UzMiBjdGltZTsJCS8qICA2IENyZWF0aW9uIHRpbWUJCQkgICAgICAqLworCV9fdTMyIGxldmVsOwkJLyogIDcgUmFpZCBwZXJzb25hbGl0eQkJCSAgICAgICovCisJX191MzIgc2l6ZTsJCS8qICA4IEFwcGFyZW50IHNpemUgb2YgZWFjaCBpbmRpdmlkdWFsIGRpc2sgICAqLworCV9fdTMyIG5yX2Rpc2tzOwkJLyogIDkgdG90YWwgZGlza3MgaW4gdGhlIHJhaWQgc2V0CSAgICAgICovCisJX191MzIgcmFpZF9kaXNrczsJLyogMTAgZGlza3MgaW4gYSBmdWxseSBmdW5jdGlvbmFsIHJhaWQgc2V0ICAgICovCisJX191MzIgbWRfbWlub3I7CQkvKiAxMSBwcmVmZXJyZWQgTUQgbWlub3IgZGV2aWNlIG51bWJlcgkgICAgICAqLworCV9fdTMyIG5vdF9wZXJzaXN0ZW50OwkvKiAxMiBkb2VzIGl0IGhhdmUgYSBwZXJzaXN0ZW50IHN1cGVyYmxvY2sgICAgKi8KKwlfX3UzMiBzZXRfdXVpZDE7CS8qIDEzIFJhaWQgc2V0IGlkZW50aWZpZXIgIzIJCSAgICAgICovCisJX191MzIgc2V0X3V1aWQyOwkvKiAxNCBSYWlkIHNldCBpZGVudGlmaWVyICMzCQkgICAgICAqLworCV9fdTMyIHNldF91dWlkMzsJLyogMTUgUmFpZCBzZXQgaWRlbnRpZmllciAjNAkJICAgICAgKi8KKwlfX3UzMiBnc3RhdGVfY3Jlc2VydmVkW01EX1NCX0dFTkVSSUNfQ09OU1RBTlRfV09SRFMgLSAxNl07CisKKwkvKgorCSAqIEdlbmVyaWMgc3RhdGUgaW5mb3JtYXRpb24KKwkgKi8KKwlfX3UzMiB1dGltZTsJCS8qICAwIFN1cGVyYmxvY2sgdXBkYXRlIHRpbWUJCSAgICAgICovCisJX191MzIgc3RhdGU7CQkvKiAgMSBTdGF0ZSBiaXRzIChjbGVhbiwgLi4uKQkJICAgICAgKi8KKwlfX3UzMiBhY3RpdmVfZGlza3M7CS8qICAyIE51bWJlciBvZiBjdXJyZW50bHkgYWN0aXZlIGRpc2tzCSAgICAgICovCisJX191MzIgd29ya2luZ19kaXNrczsJLyogIDMgTnVtYmVyIG9mIHdvcmtpbmcgZGlza3MJCSAgICAgICovCisJX191MzIgZmFpbGVkX2Rpc2tzOwkvKiAgNCBOdW1iZXIgb2YgZmFpbGVkIGRpc2tzCQkgICAgICAqLworCV9fdTMyIHNwYXJlX2Rpc2tzOwkvKiAgNSBOdW1iZXIgb2Ygc3BhcmUgZGlza3MJCSAgICAgICovCisJX191MzIgc2JfY3N1bTsJCS8qICA2IGNoZWNrc3VtIG9mIHRoZSB3aG9sZSBzdXBlcmJsb2NrICAgICAgICAqLworI2lmZGVmIF9fQklHX0VORElBTgorCV9fdTMyIGV2ZW50c19oaTsJLyogIDcgaGlnaC1vcmRlciBvZiBzdXBlcmJsb2NrIHVwZGF0ZSBjb3VudCAgICovCisJX191MzIgZXZlbnRzX2xvOwkvKiAgOCBsb3ctb3JkZXIgb2Ygc3VwZXJibG9jayB1cGRhdGUgY291bnQgICAgKi8KKwlfX3UzMiBjcF9ldmVudHNfaGk7CS8qICA5IGhpZ2gtb3JkZXIgb2YgY2hlY2twb2ludCB1cGRhdGUgY291bnQgICAqLworCV9fdTMyIGNwX2V2ZW50c19sbzsJLyogMTAgbG93LW9yZGVyIG9mIGNoZWNrcG9pbnQgdXBkYXRlIGNvdW50ICAgICovCisjZWxzZQorCV9fdTMyIGV2ZW50c19sbzsJLyogIDcgbG93LW9yZGVyIG9mIHN1cGVyYmxvY2sgdXBkYXRlIGNvdW50ICAgICovCisJX191MzIgZXZlbnRzX2hpOwkvKiAgOCBoaWdoLW9yZGVyIG9mIHN1cGVyYmxvY2sgdXBkYXRlIGNvdW50ICAgKi8KKwlfX3UzMiBjcF9ldmVudHNfbG87CS8qICA5IGxvdy1vcmRlciBvZiBjaGVja3BvaW50IHVwZGF0ZSBjb3VudCAgICAqLworCV9fdTMyIGNwX2V2ZW50c19oaTsJLyogMTAgaGlnaC1vcmRlciBvZiBjaGVja3BvaW50IHVwZGF0ZSBjb3VudCAgICovCisjZW5kaWYKKwlfX3UzMiByZWNvdmVyeV9jcDsJLyogMTEgcmVjb3ZlcnkgY2hlY2twb2ludCBzZWN0b3IgY291bnQJICAgICAgKi8KKwkvKiBUaGVyZSBhcmUgb25seSB2YWxpZCBmb3IgbWlub3JfdmVyc2lvbiA+IDkwICovCisJX191NjQgcmVzaGFwZV9wb3NpdGlvbjsJLyogMTIsMTMgbmV4dCBhZGRyZXNzIGluIGFycmF5LXNwYWNlIGZvciByZXNoYXBlICovCisJX191MzIgbmV3X2xldmVsOwkvKiAxNCBuZXcgbGV2ZWwgd2UgYXJlIHJlc2hhcGluZyB0bwkgICAgICAqLworCV9fdTMyIGRlbHRhX2Rpc2tzOwkvKiAxNSBjaGFuZ2UgaW4gbnVtYmVyIG9mIHJhaWRfZGlza3MJICAgICAgKi8KKwlfX3UzMiBuZXdfbGF5b3V0OwkvKiAxNiBuZXcgbGF5b3V0CQkJICAgICAgKi8KKwlfX3UzMiBuZXdfY2h1bms7CS8qIDE3IG5ldyBjaHVuayBzaXplIChieXRlcykJCSAgICAgICovCisJX191MzIgZ3N0YXRlX3NyZXNlcnZlZFtNRF9TQl9HRU5FUklDX1NUQVRFX1dPUkRTIC0gMThdOworCisJLyoKKwkgKiBQZXJzb25hbGl0eSBpbmZvcm1hdGlvbgorCSAqLworCV9fdTMyIGxheW91dDsJCS8qICAwIHRoZSBhcnJheSdzIHBoeXNpY2FsIGxheW91dAkgICAgICAqLworCV9fdTMyIGNodW5rX3NpemU7CS8qICAxIGNodW5rIHNpemUgaW4gYnl0ZXMJCSAgICAgICovCisJX191MzIgcm9vdF9wdjsJCS8qICAyIExWIHJvb3QgUFYgKi8KKwlfX3UzMiByb290X2Jsb2NrOwkvKiAgMyBMViByb290IGJsb2NrICovCisJX191MzIgcHN0YXRlX3Jlc2VydmVkW01EX1NCX1BFUlNPTkFMSVRZX1dPUkRTIC0gNF07CisKKwkvKgorCSAqIERpc2tzIGluZm9ybWF0aW9uCisJICovCisJbWRwX2Rpc2tfdCBkaXNrc1tNRF9TQl9ESVNLU107CisKKwkvKgorCSAqIFJlc2VydmVkCisJICovCisJX191MzIgcmVzZXJ2ZWRbTURfU0JfUkVTRVJWRURfV09SRFNdOworCisJLyoKKwkgKiBBY3RpdmUgZGVzY3JpcHRvcgorCSAqLworCW1kcF9kaXNrX3QgdGhpc19kaXNrOworCit9IG1kcF9zdXBlcl90OworCitzdGF0aWMgX19pbmxpbmVfXyBfX3U2NCBtZF9ldmVudChtZHBfc3VwZXJfdCAqc2IpIHsKKwlfX3U2NCBldiA9IHNiLT5ldmVudHNfaGk7CisJcmV0dXJuIChldjw8MzIpfCBzYi0+ZXZlbnRzX2xvOworfQorCisjZGVmaW5lIE1EX1NVUEVSQkxPQ0tfMV9USU1FX1NFQ19NQVNLICgoMVVMTDw8NDApIC0gMSkKKworLyoKKyAqIFRoZSB2ZXJzaW9uLTEgc3VwZXJibG9jayA6CisgKiBBbGwgbnVtZXJpYyBmaWVsZHMgYXJlIGxpdHRsZS1lbmRpYW4uCisgKgorICogdG90YWwgc2l6ZTogMjU2IGJ5dGVzIHBsdXMgMiBwZXIgZGV2aWNlLgorICogIDFLIGFsbG93cyAzODQgZGV2aWNlcy4KKyAqLworc3RydWN0IG1kcF9zdXBlcmJsb2NrXzEgeworCS8qIGNvbnN0YW50IGFycmF5IGluZm9ybWF0aW9uIC0gMTI4IGJ5dGVzICovCisJX19sZTMyCW1hZ2ljOwkJLyogTURfU0JfTUFHSUM6IDB4YTkyYjRlZmMgLSBsaXR0bGUgZW5kaWFuICovCisJX19sZTMyCW1ham9yX3ZlcnNpb247CS8qIDEgKi8KKwlfX2xlMzIJZmVhdHVyZV9tYXA7CS8qIGJpdCAwIHNldCBpZiAnYml0bWFwX29mZnNldCcgaXMgbWVhbmluZ2Z1bCAqLworCV9fbGUzMglwYWQwOwkJLyogYWx3YXlzIHNldCB0byAwIHdoZW4gd3JpdGluZyAqLworCisJX191OAlzZXRfdXVpZFsxNl07CS8qIHVzZXItc3BhY2UgZ2VuZXJhdGVkLiAqLworCWNoYXIJc2V0X25hbWVbMzJdOwkvKiBzZXQgYW5kIGludGVycHJldGVkIGJ5IHVzZXItc3BhY2UgKi8KKworCV9fbGU2NAljdGltZTsJCS8qIGxvIDQwIGJpdHMgYXJlIHNlY29uZHMsIHRvcCAyNCBhcmUgbWljcm9zZWNvbmRzIG9yIDAqLworCV9fbGUzMglsZXZlbDsJCS8qIC00IChtdWx0aXBhdGgpLCAtMSAobGluZWFyKSwgMCwxLDQsNSAqLworCV9fbGUzMglsYXlvdXQ7CQkvKiBvbmx5IGZvciByYWlkNSBhbmQgcmFpZDEwIGN1cnJlbnRseSAqLworCV9fbGU2NAlzaXplOwkJLyogdXNlZCBzaXplIG9mIGNvbXBvbmVudCBkZXZpY2VzLCBpbiA1MTJieXRlIHNlY3RvcnMgKi8KKworCV9fbGUzMgljaHVua3NpemU7CS8qIGluIDUxMmJ5dGUgc2VjdG9ycyAqLworCV9fbGUzMglyYWlkX2Rpc2tzOworCV9fbGUzMgliaXRtYXBfb2Zmc2V0OwkvKiBzZWN0b3JzIGFmdGVyIHN0YXJ0IG9mIHN1cGVyYmxvY2sgdGhhdCBiaXRtYXAgc3RhcnRzCisJCQkJICogTk9URTogc2lnbmVkLCBzbyBiaXRtYXAgY2FuIGJlIGJlZm9yZSBzdXBlcmJsb2NrCisJCQkJICogb25seSBtZWFuaW5nZnVsIG9mIGZlYXR1cmVfbWFwWzBdIGlzIHNldC4KKwkJCQkgKi8KKworCS8qIFRoZXNlIGFyZSBvbmx5IHZhbGlkIHdpdGggZmVhdHVyZSBiaXQgJzQnICovCisJX19sZTMyCW5ld19sZXZlbDsJLyogbmV3IGxldmVsIHdlIGFyZSByZXNoYXBpbmcgdG8JCSovCisJX19sZTY0CXJlc2hhcGVfcG9zaXRpb247CS8qIG5leHQgYWRkcmVzcyBpbiBhcnJheS1zcGFjZSBmb3IgcmVzaGFwZSAqLworCV9fbGUzMglkZWx0YV9kaXNrczsJLyogY2hhbmdlIGluIG51bWJlciBvZiByYWlkX2Rpc2tzCQkqLworCV9fbGUzMgluZXdfbGF5b3V0OwkvKiBuZXcgbGF5b3V0CQkJCQkqLworCV9fbGUzMgluZXdfY2h1bms7CS8qIG5ldyBjaHVuayBzaXplICg1MTJieXRlIHNlY3RvcnMpCQkqLworCV9fdTgJcGFkMVsxMjgtMTI0XTsJLyogc2V0IHRvIDAgd2hlbiB3cml0dGVuICovCisKKwkvKiBjb25zdGFudCB0aGlzLWRldmljZSBpbmZvcm1hdGlvbiAtIDY0IGJ5dGVzICovCisJX19sZTY0CWRhdGFfb2Zmc2V0OwkvKiBzZWN0b3Igc3RhcnQgb2YgZGF0YSwgb2Z0ZW4gMCAqLworCV9fbGU2NAlkYXRhX3NpemU7CS8qIHNlY3RvcnMgaW4gdGhpcyBkZXZpY2UgdGhhdCBjYW4gYmUgdXNlZCBmb3IgZGF0YSAqLworCV9fbGU2NAlzdXBlcl9vZmZzZXQ7CS8qIHNlY3RvciBzdGFydCBvZiB0aGlzIHN1cGVyYmxvY2sgKi8KKwlfX2xlNjQJcmVjb3Zlcnlfb2Zmc2V0Oy8qIHNlY3RvcnMgYmVmb3JlIHRoaXMgb2Zmc2V0IChmcm9tIGRhdGFfb2Zmc2V0KSBoYXZlIGJlZW4gcmVjb3ZlcmVkICovCisJX19sZTMyCWRldl9udW1iZXI7CS8qIHBlcm1hbmVudCBpZGVudGlmaWVyIG9mIHRoaXMgIGRldmljZSAtIG5vdCByb2xlIGluIHJhaWQgKi8KKwlfX2xlMzIJY250X2NvcnJlY3RlZF9yZWFkOyAvKiBudW1iZXIgb2YgcmVhZCBlcnJvcnMgdGhhdCB3ZXJlIGNvcnJlY3RlZCBieSByZS13cml0aW5nICovCisJX191OAlkZXZpY2VfdXVpZFsxNl07IC8qIHVzZXItc3BhY2Ugc2V0YWJsZSwgaWdub3JlZCBieSBrZXJuZWwgKi8KKwlfX3U4CWRldmZsYWdzOwkvKiBwZXItZGV2aWNlIGZsYWdzLiAgT25seSBvbmUgZGVmaW5lZC4uLiovCisjZGVmaW5lCVdyaXRlTW9zdGx5MQkxCS8qIG1hc2sgZm9yIHdyaXRlbW9zdGx5IGZsYWcgaW4gYWJvdmUgKi8KKwkvKiBCYWQgYmxvY2sgbG9nLiAgSWYgdGhlcmUgYXJlIGFueSBiYWQgYmxvY2tzIHRoZSBmZWF0dXJlIGZsYWcgaXMgc2V0LgorCSAqIElmIG9mZnNldCBhbmQgc2l6ZSBhcmUgbm9uLXplcm8sIHRoYXQgc3BhY2UgaXMgcmVzZXJ2ZWQgYW5kIGF2YWlsYWJsZQorCSAqLworCV9fdTgJYmJsb2dfc2hpZnQ7CS8qIHNoaWZ0IGZyb20gc2VjdG9ycyB0byBibG9jayBzaXplICovCisJX19sZTE2CWJibG9nX3NpemU7CS8qIG51bWJlciBvZiBzZWN0b3JzIHJlc2VydmVkIGZvciBsaXN0ICovCisJX19sZTMyCWJibG9nX29mZnNldDsJLyogc2VjdG9yIG9mZnNldCBmcm9tIHN1cGVyYmxvY2sgdG8gYmJsb2csCisJCQkJICogc2lnbmVkIC0gbm90IHVuc2lnbmVkICovCisKKwkvKiBhcnJheSBzdGF0ZSBpbmZvcm1hdGlvbiAtIDY0IGJ5dGVzICovCisJX19sZTY0CXV0aW1lOwkJLyogNDAgYml0cyBzZWNvbmQsIDI0IGJpdHMgbWljcm9zZWNvbmRzICovCisJX19sZTY0CWV2ZW50czsJCS8qIGluY3JlbWVudGVkIHdoZW4gc3VwZXJibG9jayB1cGRhdGVkICovCisJX19sZTY0CXJlc3luY19vZmZzZXQ7CS8qIGRhdGEgYmVmb3JlIHRoaXMgb2Zmc2V0IChmcm9tIGRhdGFfb2Zmc2V0KSBrbm93biB0byBiZSBpbiBzeW5jICovCisJX19sZTMyCXNiX2NzdW07CS8qIGNoZWNrc3VtIHVwIHRvIGRldnNbbWF4X2Rldl0gKi8KKwlfX2xlMzIJbWF4X2RldjsJLyogc2l6ZSBvZiBkZXZzW10gYXJyYXkgdG8gY29uc2lkZXIgKi8KKwlfX3U4CXBhZDNbNjQtMzJdOwkvKiBzZXQgdG8gMCB3aGVuIHdyaXRpbmcgKi8KKworCS8qIGRldmljZSBzdGF0ZSBpbmZvcm1hdGlvbi4gSW5kZXhlZCBieSBkZXZfbnVtYmVyLgorCSAqIDIgYnl0ZXMgcGVyIGRldmljZQorCSAqIE5vdGUgdGhlcmUgYXJlIG5vIHBlci1kZXZpY2Ugc3RhdGUgZmxhZ3MuIFN0YXRlIGluZm9ybWF0aW9uIGlzIHJvbGxlZAorCSAqIGludG8gdGhlICdyb2xlcycgdmFsdWUuICBJZiBhIGRldmljZSBpcyBzcGFyZSBvciBmYXVsdHksIHRoZW4gaXQgZG9lc24ndAorCSAqIGhhdmUgYSBtZWFuaW5nZnVsIHJvbGUuCisJICovCisJX19sZTE2CWRldl9yb2xlc1swXTsJLyogcm9sZSBpbiBhcnJheSwgb3IgMHhmZmZmIGZvciBhIHNwYXJlLCBvciAweGZmZmUgZm9yIGZhdWx0eSAqLworfTsKKworLyogZmVhdHVyZV9tYXAgYml0cyAqLworI2RlZmluZSBNRF9GRUFUVVJFX0JJVE1BUF9PRkZTRVQJMQorI2RlZmluZQlNRF9GRUFUVVJFX1JFQ09WRVJZX09GRlNFVAkyIC8qIHJlY292ZXJ5X29mZnNldCBpcyBwcmVzZW50IGFuZAorCQkJCQkgICAqIG11c3QgYmUgaG9ub3VyZWQKKwkJCQkJICAgKi8KKyNkZWZpbmUJTURfRkVBVFVSRV9SRVNIQVBFX0FDVElWRQk0CisjZGVmaW5lCU1EX0ZFQVRVUkVfQkFEX0JMT0NLUwkJOCAvKiBiYWRibG9jayBsaXN0IGlzIG5vdCBlbXB0eSAqLworCisjZGVmaW5lCU1EX0ZFQVRVUkVfQUxMCQkJKDF8Mnw0fDgpCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmFpZC9tZF91LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODVhN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfdS5oCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICAgbWRfdS5oIDogdXNlciA8PT4ga2VybmVsIEFQSSBiZXR3ZWVuIExpbnV4IHJhaWR0b29scyBhbmQgUkFJRCBkcml2ZXJzCisgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk4IEluZ28gTW9sbmFyCisJICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisgICAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAoZm9yIGV4YW1wbGUgL3Vzci9zcmMvbGludXgvQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgCisqLworCisjaWZuZGVmIF9NRF9VX0gKKyNkZWZpbmUgX01EX1VfSAorCisvKgorICogRGlmZmVyZW50IG1ham9yIHZlcnNpb25zIGFyZSBub3QgY29tcGF0aWJsZS4KKyAqIERpZmZlcmVudCBtaW5vciB2ZXJzaW9ucyBhcmUgb25seSBkb3dud2FyZCBjb21wYXRpYmxlLgorICogRGlmZmVyZW50IHBhdGNobGV2ZWwgdmVyc2lvbnMgYXJlIGRvd253YXJkIGFuZCB1cHdhcmQgY29tcGF0aWJsZS4KKyAqLworI2RlZmluZSBNRF9NQUpPUl9WRVJTSU9OICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTURfTUlOT1JfVkVSU0lPTiAgICAgICAgICAgICAgICA5MAorLyoKKyAqIE1EX1BBVENITEVWRUxfVkVSU0lPTiBpbmRpY2F0ZXMga2VybmVsIGZ1bmN0aW9uYWxpdHkuCisgKiA+PTEgbWVhbnMgZGlmZmVyZW50IHN1cGVyYmxvY2sgZm9ybWF0cyBhcmUgc2VsZWN0YWJsZSB1c2luZyBTRVRfQVJSQVlfSU5GTworICogICAgIGFuZCBtYWpvcl92ZXJzaW9uL21pbm9yX3ZlcnNpb24gYWNjb3JkaW5nbHkKKyAqID49MiBtZWFucyB0aGF0IEludGVybmFsIGJpdG1hcHMgYXJlIHN1cHBvcnRlZCBieSBzZXR0aW5nIE1EX1NCX0JJVE1BUF9QUkVTRU5UCisgKiAgICAgaW4gdGhlIHN1cGVyIHN0YXR1cyBieXRlCisgKiA+PTMgbWVhbnMgdGhhdCBiaXRtYXAgc3VwZXJibG9jayB2ZXJzaW9uIDQgaXMgc3VwcG9ydGVkLCB3aGljaCB1c2VzCisgKiAgICAgbGl0dGxlLWVuZGluZyByZXByZXNlbnRhdGlvbiByYXRoZXIgdGhhbiBob3N0LWVuZGlhbgorICovCisjZGVmaW5lIE1EX1BBVENITEVWRUxfVkVSU0lPTiAgICAgICAgICAgMworCisvKiBpb2N0bHMgKi8KKworLyogc3RhdHVzICovCisjZGVmaW5lIFJBSURfVkVSU0lPTgkJX0lPUiAoTURfTUFKT1IsIDB4MTAsIG1kdV92ZXJzaW9uX3QpCisjZGVmaW5lIEdFVF9BUlJBWV9JTkZPCQlfSU9SIChNRF9NQUpPUiwgMHgxMSwgbWR1X2FycmF5X2luZm9fdCkKKyNkZWZpbmUgR0VUX0RJU0tfSU5GTwkJX0lPUiAoTURfTUFKT1IsIDB4MTIsIG1kdV9kaXNrX2luZm9fdCkKKyNkZWZpbmUgUFJJTlRfUkFJRF9ERUJVRwlfSU8gKE1EX01BSk9SLCAweDEzKQorI2RlZmluZSBSQUlEX0FVVE9SVU4JCV9JTyAoTURfTUFKT1IsIDB4MTQpCisjZGVmaW5lIEdFVF9CSVRNQVBfRklMRQkJX0lPUiAoTURfTUFKT1IsIDB4MTUsIG1kdV9iaXRtYXBfZmlsZV90KQorCisvKiBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIENMRUFSX0FSUkFZCQlfSU8gKE1EX01BSk9SLCAweDIwKQorI2RlZmluZSBBRERfTkVXX0RJU0sJCV9JT1cgKE1EX01BSk9SLCAweDIxLCBtZHVfZGlza19pbmZvX3QpCisjZGVmaW5lIEhPVF9SRU1PVkVfRElTSwkJX0lPIChNRF9NQUpPUiwgMHgyMikKKyNkZWZpbmUgU0VUX0FSUkFZX0lORk8JCV9JT1cgKE1EX01BSk9SLCAweDIzLCBtZHVfYXJyYXlfaW5mb190KQorI2RlZmluZSBTRVRfRElTS19JTkZPCQlfSU8gKE1EX01BSk9SLCAweDI0KQorI2RlZmluZSBXUklURV9SQUlEX0lORk8JCV9JTyAoTURfTUFKT1IsIDB4MjUpCisjZGVmaW5lIFVOUFJPVEVDVF9BUlJBWQkJX0lPIChNRF9NQUpPUiwgMHgyNikKKyNkZWZpbmUgUFJPVEVDVF9BUlJBWQkJX0lPIChNRF9NQUpPUiwgMHgyNykKKyNkZWZpbmUgSE9UX0FERF9ESVNLCQlfSU8gKE1EX01BSk9SLCAweDI4KQorI2RlZmluZSBTRVRfRElTS19GQVVMVFkJCV9JTyAoTURfTUFKT1IsIDB4MjkpCisjZGVmaW5lIEhPVF9HRU5FUkFURV9FUlJPUglfSU8gKE1EX01BSk9SLCAweDJhKQorI2RlZmluZSBTRVRfQklUTUFQX0ZJTEUJCV9JT1cgKE1EX01BSk9SLCAweDJiLCBpbnQpCisKKy8qIHVzYWdlICovCisjZGVmaW5lIFJVTl9BUlJBWQkJX0lPVyAoTURfTUFKT1IsIDB4MzAsIG1kdV9wYXJhbV90KQorLyogIDB4MzEgd2FzIFNUQVJUX0FSUkFZICAqLworI2RlZmluZSBTVE9QX0FSUkFZCQlfSU8gKE1EX01BSk9SLCAweDMyKQorI2RlZmluZSBTVE9QX0FSUkFZX1JPCQlfSU8gKE1EX01BSk9SLCAweDMzKQorI2RlZmluZSBSRVNUQVJUX0FSUkFZX1JXCV9JTyAoTURfTUFKT1IsIDB4MzQpCisKKy8qIDYzIHBhcnRpdGlvbnMgd2l0aCB0aGUgYWx0ZXJuYXRlIG1ham9yIG51bWJlciAobWRwKSAqLworI2RlZmluZSBNZHBNaW5vclNoaWZ0IDYKKwordHlwZWRlZiBzdHJ1Y3QgbWR1X3ZlcnNpb25fcyB7CisJaW50IG1ham9yOworCWludCBtaW5vcjsKKwlpbnQgcGF0Y2hsZXZlbDsKK30gbWR1X3ZlcnNpb25fdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWR1X2FycmF5X2luZm9fcyB7CisJLyoKKwkgKiBHZW5lcmljIGNvbnN0YW50IGluZm9ybWF0aW9uCisJICovCisJaW50IG1ham9yX3ZlcnNpb247CisJaW50IG1pbm9yX3ZlcnNpb247CisJaW50IHBhdGNoX3ZlcnNpb247CisJaW50IGN0aW1lOworCWludCBsZXZlbDsKKwlpbnQgc2l6ZTsKKwlpbnQgbnJfZGlza3M7CisJaW50IHJhaWRfZGlza3M7CisJaW50IG1kX21pbm9yOworCWludCBub3RfcGVyc2lzdGVudDsKKworCS8qCisJICogR2VuZXJpYyBzdGF0ZSBpbmZvcm1hdGlvbgorCSAqLworCWludCB1dGltZTsJCS8qICAwIFN1cGVyYmxvY2sgdXBkYXRlIHRpbWUJCSAgICAgICovCisJaW50IHN0YXRlOwkJLyogIDEgU3RhdGUgYml0cyAoY2xlYW4sIC4uLikJCSAgICAgICovCisJaW50IGFjdGl2ZV9kaXNrczsJLyogIDIgTnVtYmVyIG9mIGN1cnJlbnRseSBhY3RpdmUgZGlza3MJICAgICAgKi8KKwlpbnQgd29ya2luZ19kaXNrczsJLyogIDMgTnVtYmVyIG9mIHdvcmtpbmcgZGlza3MJCSAgICAgICovCisJaW50IGZhaWxlZF9kaXNrczsJLyogIDQgTnVtYmVyIG9mIGZhaWxlZCBkaXNrcwkJICAgICAgKi8KKwlpbnQgc3BhcmVfZGlza3M7CS8qICA1IE51bWJlciBvZiBzcGFyZSBkaXNrcwkJICAgICAgKi8KKworCS8qCisJICogUGVyc29uYWxpdHkgaW5mb3JtYXRpb24KKwkgKi8KKwlpbnQgbGF5b3V0OwkJLyogIDAgdGhlIGFycmF5J3MgcGh5c2ljYWwgbGF5b3V0CSAgICAgICovCisJaW50IGNodW5rX3NpemU7CS8qICAxIGNodW5rIHNpemUgaW4gYnl0ZXMJCSAgICAgICovCisKK30gbWR1X2FycmF5X2luZm9fdDsKKworLyogbm9uLW9idmlvdXMgdmFsdWVzIGZvciAnbGV2ZWwnICovCisjZGVmaW5lCUxFVkVMX01VTFRJUEFUSAkJKC00KQorI2RlZmluZQlMRVZFTF9MSU5FQVIJCSgtMSkKKyNkZWZpbmUJTEVWRUxfRkFVTFRZCQkoLTUpCisKKy8qIHdlIG5lZWQgYSB2YWx1ZSBmb3IgJ25vIGxldmVsIHNwZWNpZmllZCcgYW5kIDAKKyAqIG1lYW5zICdyYWlkMCcsIHNvIHdlIG5lZWQgc29tZXRoaW5nIGVsc2UuICBUaGlzIGlzCisgKiBmb3IgaW50ZXJuYWwgdXNlIG9ubHkKKyAqLworI2RlZmluZQlMRVZFTF9OT05FCQkoLTEwMDAwMDApCisKK3R5cGVkZWYgc3RydWN0IG1kdV9kaXNrX2luZm9fcyB7CisJLyoKKwkgKiBjb25maWd1cmF0aW9uL3N0YXR1cyBvZiBvbmUgcGFydGljdWxhciBkaXNrCisJICovCisJaW50IG51bWJlcjsKKwlpbnQgbWFqb3I7CisJaW50IG1pbm9yOworCWludCByYWlkX2Rpc2s7CisJaW50IHN0YXRlOworCit9IG1kdV9kaXNrX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWR1X3N0YXJ0X2luZm9fcyB7CisJLyoKKwkgKiBjb25maWd1cmF0aW9uL3N0YXR1cyBvZiBvbmUgcGFydGljdWxhciBkaXNrCisJICovCisJaW50IG1ham9yOworCWludCBtaW5vcjsKKwlpbnQgcmFpZF9kaXNrOworCWludCBzdGF0ZTsKKworfSBtZHVfc3RhcnRfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCBtZHVfYml0bWFwX2ZpbGVfcworeworCWNoYXIgcGF0aG5hbWVbNDA5Nl07Cit9IG1kdV9iaXRtYXBfZmlsZV90OworCit0eXBlZGVmIHN0cnVjdCBtZHVfcGFyYW1fcworeworCWludAkJCXBlcnNvbmFsaXR5OwkvKiAxLDIsMyw0ICovCisJaW50CQkJY2h1bmtfc2l6ZTsJLyogaW4gYnl0ZXMgKi8KKwlpbnQJCQltYXhfZmF1bHQ7CS8qIHVudXNlZCBmb3Igbm93ICovCit9IG1kdV9wYXJhbV90OworCisjZW5kaWYgCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmFuZG9tLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JhbmRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZTY0NDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JhbmRvbS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBpbmNsdWRlL2xpbnV4L3JhbmRvbS5oCisgKgorICogSW5jbHVkZSBmaWxlIGZvciB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgKi8KKworI2lmbmRlZiBfTElOVVhfUkFORE9NX0gKKyNkZWZpbmUgX0xJTlVYX1JBTkRPTV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvaXJxbnIuaD4KKworLyogaW9jdGwoKSdzIGZvciB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgKi8KKworLyogR2V0IHRoZSBlbnRyb3B5IGNvdW50LiAqLworI2RlZmluZSBSTkRHRVRFTlRDTlQJX0lPUiggJ1InLCAweDAwLCBpbnQgKQorCisvKiBBZGQgdG8gKG9yIHN1YnRyYWN0IGZyb20pIHRoZSBlbnRyb3B5IGNvdW50LiAgKFN1cGVydXNlciBvbmx5LikgKi8KKyNkZWZpbmUgUk5EQUREVE9FTlRDTlQJX0lPVyggJ1InLCAweDAxLCBpbnQgKQorCisvKiBHZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnRyb3B5IHBvb2wuICAoU3VwZXJ1c2VyIG9ubHkuKSAqLworI2RlZmluZSBSTkRHRVRQT09MCV9JT1IoICdSJywgMHgwMiwgaW50IFsyXSApCisKKy8qIAorICogV3JpdGUgYnl0ZXMgaW50byB0aGUgZW50cm9weSBwb29sIGFuZCBhZGQgdG8gdGhlIGVudHJvcHkgY291bnQuCisgKiAoU3VwZXJ1c2VyIG9ubHkuKQorICovCisjZGVmaW5lIFJOREFEREVOVFJPUFkJX0lPVyggJ1InLCAweDAzLCBpbnQgWzJdICkKKworLyogQ2xlYXIgZW50cm9weSBjb3VudCB0byAwLiAgKFN1cGVydXNlciBvbmx5LikgKi8KKyNkZWZpbmUgUk5EWkFQRU5UQ05UCV9JTyggJ1InLCAweDA0ICkKKworLyogQ2xlYXIgdGhlIGVudHJvcHkgcG9vbCBhbmQgYXNzb2NpYXRlZCBjb3VudGVycy4gIChTdXBlcnVzZXIgb25seS4pICovCisjZGVmaW5lIFJORENMRUFSUE9PTAlfSU8oICdSJywgMHgwNiApCisKK3N0cnVjdCByYW5kX3Bvb2xfaW5mbyB7CisJaW50CWVudHJvcHlfY291bnQ7CisJaW50CWJ1Zl9zaXplOworCV9fdTMyCWJ1ZlswXTsKK307CisKK3N0cnVjdCBybmRfc3RhdGUgeworCV9fdTMyIHMxLCBzMiwgczM7Cit9OworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgKi8KKworCisjZW5kaWYgLyogX0xJTlVYX1JBTkRPTV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Jhdy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yYXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmQ1NDNlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yYXcuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9fTElOVVhfUkFXX0gKKyNkZWZpbmUgX19MSU5VWF9SQVdfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBSQVdfU0VUQklORAlfSU8oIDB4YWMsIDAgKQorI2RlZmluZSBSQVdfR0VUQklORAlfSU8oIDB4YWMsIDEgKQorCitzdHJ1Y3QgcmF3X2NvbmZpZ19yZXF1ZXN0IAoreworCWludAlyYXdfbWlub3I7CisJX191NjQJYmxvY2tfbWFqb3I7CisJX191NjQJYmxvY2tfbWlub3I7Cit9OworCisjZGVmaW5lIE1BWF9SQVdfTUlOT1JTIENPTkZJR19NQVhfUkFXX0RFVlMKKworI2VuZGlmIC8qIF9fTElOVVhfUkFXX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmRzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Jkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTUwOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Jkcy5oCkBAIC0wLDAgKzEsMjg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfUkRTX0gKKyNkZWZpbmUgX0xJTlVYX1JEU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFJEU19JQl9BQklfVkVSU0lPTgkJMHgzMDEKKworLyoKKyAqIHNldHNvY2tvcHQvZ2V0c29ja29wdCBmb3IgU09MX1JEUworICovCisjZGVmaW5lIFJEU19DQU5DRUxfU0VOVF9UTyAgICAgIAkxCisjZGVmaW5lIFJEU19HRVRfTVIJCQkyCisjZGVmaW5lIFJEU19GUkVFX01SCQkJMworLyogZGVwcmVjYXRlZDogUkRTX0JBUlJJRVIgNCAqLworI2RlZmluZSBSRFNfUkVDVkVSUgkJCTUKKyNkZWZpbmUgUkRTX0NPTkdfTU9OSVRPUgkJNgorI2RlZmluZSBSRFNfR0VUX01SX0ZPUl9ERVNUCQk3CisKKy8qCisgKiBDb250cm9sIG1lc3NhZ2UgdHlwZXMgZm9yIFNPTF9SRFMuCisgKgorICogQ01TR19SRE1BX0FSR1MgKHNlbmRtc2cpCisgKglSZXF1ZXN0IGEgUkRNQSB0cmFuc2ZlciB0by9mcm9tIHRoZSBzcGVjaWZpZWQKKyAqCW1lbW9yeSByYW5nZXMuCisgKglUaGUgY21zZ19kYXRhIGlzIGEgc3RydWN0IHJkc19yZG1hX2FyZ3MuCisgKiBSRFNfQ01TR19SRE1BX0RFU1QgKHJlY3Ztc2csIHNlbmRtc2cpCisgKglLZXJuZWwgaW5mb3JtcyBhcHBsaWNhdGlvbiBhYm91dCBpbnRlbmRlZAorICoJc291cmNlL2Rlc3RpbmF0aW9uIG9mIGEgUkRNQSB0cmFuc2ZlcgorICogUkRTX0NNU0dfUkRNQV9NQVAgKHNlbmRtc2cpCisgKglBcHBsaWNhdGlvbiBhc2tzIGtlcm5lbCB0byBtYXAgdGhlIGdpdmVuCisgKgltZW1vcnkgcmFuZ2UgaW50byBhIElCIE1SLCBhbmQgc2VuZCB0aGUKKyAqCVJfS2V5IGFsb25nIGluIGFuIFJEUyBleHRlbnNpb24gaGVhZGVyLgorICoJVGhlIGNtc2dfZGF0YSBpcyBhIHN0cnVjdCByZHNfZ2V0X21yX2FyZ3MsCisgKgl0aGUgc2FtZSBhcyBmb3IgdGhlIEdFVF9NUiBzZXRzb2Nrb3B0LgorICogUkRTX0NNU0dfUkRNQV9TVEFUVVMgKHJlY3Ztc2cpCisgKglSZXR1cm5zIHRoZSBzdGF0dXMgb2YgYSBjb21wbGV0ZWQgUkRNQSBvcGVyYXRpb24uCisgKi8KKyNkZWZpbmUgUkRTX0NNU0dfUkRNQV9BUkdTCQkxCisjZGVmaW5lIFJEU19DTVNHX1JETUFfREVTVAkJMgorI2RlZmluZSBSRFNfQ01TR19SRE1BX01BUAkJMworI2RlZmluZSBSRFNfQ01TR19SRE1BX1NUQVRVUwkJNAorI2RlZmluZSBSRFNfQ01TR19DT05HX1VQREFURQkJNQorI2RlZmluZSBSRFNfQ01TR19BVE9NSUNfRkFERAkJNgorI2RlZmluZSBSRFNfQ01TR19BVE9NSUNfQ1NXUAkJNworI2RlZmluZSBSRFNfQ01TR19NQVNLRURfQVRPTUlDX0ZBREQJOAorI2RlZmluZSBSRFNfQ01TR19NQVNLRURfQVRPTUlDX0NTV1AJOQorCisjZGVmaW5lIFJEU19JTkZPX0ZJUlNUCQkJMTAwMDAKKyNkZWZpbmUgUkRTX0lORk9fQ09VTlRFUlMJCTEwMDAwCisjZGVmaW5lIFJEU19JTkZPX0NPTk5FQ1RJT05TCQkxMDAwMQorLyogMTAwMDIgYWthIFJEU19JTkZPX0ZMT1dTIGlzIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgUkRTX0lORk9fU0VORF9NRVNTQUdFUwkJMTAwMDMKKyNkZWZpbmUgUkRTX0lORk9fUkVUUkFOU19NRVNTQUdFUyAgICAgICAxMDAwNAorI2RlZmluZSBSRFNfSU5GT19SRUNWX01FU1NBR0VTICAgICAgICAgIDEwMDA1CisjZGVmaW5lIFJEU19JTkZPX1NPQ0tFVFMgICAgICAgICAgICAgICAgMTAwMDYKKyNkZWZpbmUgUkRTX0lORk9fVENQX1NPQ0tFVFMgICAgICAgICAgICAxMDAwNworI2RlZmluZSBSRFNfSU5GT19JQl9DT05ORUNUSU9OUwkJMTAwMDgKKyNkZWZpbmUgUkRTX0lORk9fQ09OTkVDVElPTl9TVEFUUwkxMDAwOQorI2RlZmluZSBSRFNfSU5GT19JV0FSUF9DT05ORUNUSU9OUwkxMDAxMAorI2RlZmluZSBSRFNfSU5GT19MQVNUCQkJMTAwMTAKKworc3RydWN0IHJkc19pbmZvX2NvdW50ZXIgeworCXVpbnQ4X3QJbmFtZVszMl07CisJdWludDY0X3QJdmFsdWU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIFJEU19JTkZPX0NPTk5FQ1RJT05fRkxBR19TRU5ESU5HCTB4MDEKKyNkZWZpbmUgUkRTX0lORk9fQ09OTkVDVElPTl9GTEFHX0NPTk5FQ1RJTkcJMHgwMgorI2RlZmluZSBSRFNfSU5GT19DT05ORUNUSU9OX0ZMQUdfQ09OTkVDVEVECTB4MDQKKworI2RlZmluZSBUUkFOU05BTVNJWgkxNgorCitzdHJ1Y3QgcmRzX2luZm9fY29ubmVjdGlvbiB7CisJdWludDY0X3QJbmV4dF90eF9zZXE7CisJdWludDY0X3QJbmV4dF9yeF9zZXE7CisJX19iZTMyCQlsYWRkcjsKKwlfX2JlMzIJCWZhZGRyOworCXVpbnQ4X3QJdHJhbnNwb3J0W1RSQU5TTkFNU0laXTsJCS8qIG51bGwgdGVybSBhc2NpaSAqLworCXVpbnQ4X3QJZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIFJEU19JTkZPX01FU1NBR0VfRkxBR19BQ0sgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFJEU19JTkZPX01FU1NBR0VfRkxBR19GQVNUX0FDSyAgICAgICAgICAweDAyCisKK3N0cnVjdCByZHNfaW5mb19tZXNzYWdlIHsKKwl1aW50NjRfdAlzZXE7CisJdWludDMyX3QJbGVuOworCV9fYmUzMgkJbGFkZHI7CisJX19iZTMyCQlmYWRkcjsKKwlfX2JlMTYJCWxwb3J0OworCV9fYmUxNgkJZnBvcnQ7CisJdWludDhfdAlmbGFnczsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCByZHNfaW5mb19zb2NrZXQgeworCXVpbnQzMl90CXNuZGJ1ZjsKKwlfX2JlMzIJCWJvdW5kX2FkZHI7CisJX19iZTMyCQljb25uZWN0ZWRfYWRkcjsKKwlfX2JlMTYJCWJvdW5kX3BvcnQ7CisJX19iZTE2CQljb25uZWN0ZWRfcG9ydDsKKwl1aW50MzJfdAlyY3ZidWY7CisJdWludDY0X3QJaW51bTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCByZHNfaW5mb190Y3Bfc29ja2V0IHsKKwlfX2JlMzIgICAgICAgICAgbG9jYWxfYWRkcjsKKwlfX2JlMTYgICAgICAgICAgbG9jYWxfcG9ydDsKKwlfX2JlMzIgICAgICAgICAgcGVlcl9hZGRyOworCV9fYmUxNiAgICAgICAgICBwZWVyX3BvcnQ7CisJdWludDY0X3QgICAgICAgaGRyX3JlbTsKKwl1aW50NjRfdCAgICAgICBkYXRhX3JlbTsKKwl1aW50MzJfdCAgICAgICBsYXN0X3NlbnRfbnh0OworCXVpbnQzMl90ICAgICAgIGxhc3RfZXhwZWN0ZWRfdW5hOworCXVpbnQzMl90ICAgICAgIGxhc3Rfc2Vlbl91bmE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIFJEU19JQl9HSURfTEVOCTE2CitzdHJ1Y3QgcmRzX2luZm9fcmRtYV9jb25uZWN0aW9uIHsKKwlfX2JlMzIJCXNyY19hZGRyOworCV9fYmUzMgkJZHN0X2FkZHI7CisJdWludDhfdAkJc3JjX2dpZFtSRFNfSUJfR0lEX0xFTl07CisJdWludDhfdAkJZHN0X2dpZFtSRFNfSUJfR0lEX0xFTl07CisKKwl1aW50MzJfdAltYXhfc2VuZF93cjsKKwl1aW50MzJfdAltYXhfcmVjdl93cjsKKwl1aW50MzJfdAltYXhfc2VuZF9zZ2U7CisJdWludDMyX3QJcmRtYV9tcl9tYXg7CisJdWludDMyX3QJcmRtYV9tcl9zaXplOworfTsKKworLyoKKyAqIENvbmdlc3Rpb24gbW9uaXRvcmluZy4KKyAqIENvbmdlc3Rpb24gY29udHJvbCBpbiBSRFMgaGFwcGVucyBhdCB0aGUgaG9zdCBjb25uZWN0aW9uCisgKiBsZXZlbCBieSBleGNoYW5naW5nIGEgYml0bWFwIG1hcmtpbmcgY29uZ2VzdGVkIHBvcnRzLgorICogQnkgZGVmYXVsdCwgYSBwcm9jZXNzIHNsZWVwaW5nIGluIHBvbGwoKSBpcyBhbHdheXMgd29rZW4KKyAqIHVwIHdoZW4gdGhlIGNvbmdlc3Rpb24gbWFwIGlzIHVwZGF0ZWQuCisgKiBXaXRoIGV4cGxpY2l0IG1vbml0b3JpbmcsIGFuIGFwcGxpY2F0aW9uIGNhbiBoYXZlIG1vcmUKKyAqIGZpbmUtZ3JhaW5lZCBjb250cm9sLgorICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbGxzIGEgNjRiaXQgbWFzayB2YWx1ZSBpbiB0aGUgc29ja2V0LAorICogd2hlcmUgZWFjaCBiaXQgY29ycmVzcG9uZHMgdG8gYSBncm91cCBvZiBwb3J0cy4KKyAqIFdoZW4gYSBjb25nZXN0aW9uIHVwZGF0ZSBhcnJpdmVzLCBSRFMgY2hlY2tzIHRoZSBzZXQgb2YKKyAqIHBvcnRzIHRoYXQgYXJlIG5vdyB1bmNvbmdlc3RlZCBhZ2FpbnN0IHRoZSBsaXN0IGJpdCBtYXNrCisgKiBpbnN0YWxsZWQgaW4gdGhlIHNvY2tldCwgYW5kIGlmIHRoZXkgb3ZlcmxhcCwgd2UgcXVldWUgYQorICogY29uZ19ub3RpZmljYXRpb24gb24gdGhlIHNvY2tldC4KKyAqCisgKiBUbyBpbnN0YWxsIHRoZSBjb25nZXN0aW9uIG1vbml0b3IgYml0bWFzaywgdXNlIFJEU19DT05HX01PTklUT1IKKyAqIHdpdGggdGhlIDY0Yml0IG1hc2suCisgKiBDb25nZXN0aW9uIHVwZGF0ZXMgYXJlIHJlY2VpdmVkIHZpYSBSRFNfQ01TR19DT05HX1VQREFURQorICogY29udHJvbCBtZXNzYWdlcy4KKyAqCisgKiBUaGUgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBiaXRzIGFuZCBwb3J0cyBpcworICoJMSA8PCAocG9ydG51bSAlIDY0KQorICovCisjZGVmaW5lIFJEU19DT05HX01PTklUT1JfU0laRQk2NAorI2RlZmluZSBSRFNfQ09OR19NT05JVE9SX0JJVChwb3J0KSAgKCgodW5zaWduZWQgaW50KSBwb3J0KSAlIFJEU19DT05HX01PTklUT1JfU0laRSkKKyNkZWZpbmUgUkRTX0NPTkdfTU9OSVRPUl9NQVNLKHBvcnQpICgxVUxMIDw8IFJEU19DT05HX01PTklUT1JfQklUKHBvcnQpKQorCisvKgorICogUkRNQSByZWxhdGVkIHR5cGVzCisgKi8KKworLyoKKyAqIFRoaXMgZW5jYXBzdWxhdGVzIGEgcmVtb3RlIG1lbW9yeSBsb2NhdGlvbi4KKyAqIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCBpdCBjb250YWlucyB0aGUgUl9LZXkKKyAqIG9mIHRoZSByZW1vdGUgbWVtb3J5IHJlZ2lvbiwgYW5kIHRoZSBvZmZzZXQgaW50byBpdAorICogKHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IGhhdmUgdG8gd29ycnkgYWJvdXQKKyAqIGFsaWdubWVudCkuCisgKi8KK3R5cGVkZWYgdWludDY0X3QJcmRzX3JkbWFfY29va2llX3Q7CisKK3N0cnVjdCByZHNfaW92ZWMgeworCXVpbnQ2NF90CWFkZHI7CisJdWludDY0X3QJYnl0ZXM7Cit9OworCitzdHJ1Y3QgcmRzX2dldF9tcl9hcmdzIHsKKwlzdHJ1Y3QgcmRzX2lvdmVjIHZlYzsKKwl1aW50NjRfdAljb29raWVfYWRkcjsKKwl1aW50NjRfdAlmbGFnczsKK307CisKK3N0cnVjdCByZHNfZ2V0X21yX2Zvcl9kZXN0X2FyZ3MgeworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlCWRlc3RfYWRkcjsKKwlzdHJ1Y3QgcmRzX2lvdmVjIAl2ZWM7CisJdWludDY0X3QJCWNvb2tpZV9hZGRyOworCXVpbnQ2NF90CQlmbGFnczsKK307CisKK3N0cnVjdCByZHNfZnJlZV9tcl9hcmdzIHsKKwlyZHNfcmRtYV9jb29raWVfdCBjb29raWU7CisJdWludDY0X3QJZmxhZ3M7Cit9OworCitzdHJ1Y3QgcmRzX3JkbWFfYXJncyB7CisJcmRzX3JkbWFfY29va2llX3QgY29va2llOworCXN0cnVjdCByZHNfaW92ZWMgcmVtb3RlX3ZlYzsKKwl1aW50NjRfdAlsb2NhbF92ZWNfYWRkcjsKKwl1aW50NjRfdAlucl9sb2NhbDsKKwl1aW50NjRfdAlmbGFnczsKKwl1aW50NjRfdAl1c2VyX3Rva2VuOworfTsKKworc3RydWN0IHJkc19hdG9taWNfYXJncyB7CisJcmRzX3JkbWFfY29va2llX3QgY29va2llOworCXVpbnQ2NF90IAlsb2NhbF9hZGRyOworCXVpbnQ2NF90IAlyZW1vdGVfYWRkcjsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1aW50NjRfdAljb21wYXJlOworCQkJdWludDY0X3QJc3dhcDsKKwkJfSBjc3dwOworCQlzdHJ1Y3QgeworCQkJdWludDY0X3QJYWRkOworCQl9IGZhZGQ7CisJCXN0cnVjdCB7CisJCQl1aW50NjRfdAljb21wYXJlOworCQkJdWludDY0X3QJc3dhcDsKKwkJCXVpbnQ2NF90CWNvbXBhcmVfbWFzazsKKwkJCXVpbnQ2NF90CXN3YXBfbWFzazsKKwkJfSBtX2Nzd3A7CisJCXN0cnVjdCB7CisJCQl1aW50NjRfdAlhZGQ7CisJCQl1aW50NjRfdAlub2NhcnJ5X21hc2s7CisJCX0gbV9mYWRkOworCX07CisJdWludDY0X3QJZmxhZ3M7CisJdWludDY0X3QJdXNlcl90b2tlbjsKK307CisKK3N0cnVjdCByZHNfcmRtYV9ub3RpZnkgeworCXVpbnQ2NF90CXVzZXJfdG9rZW47CisJaW50MzJfdAkJc3RhdHVzOworfTsKKworI2RlZmluZSBSRFNfUkRNQV9TVUNDRVNTCTAKKyNkZWZpbmUgUkRTX1JETUFfUkVNT1RFX0VSUk9SCTEKKyNkZWZpbmUgUkRTX1JETUFfQ0FOQ0VMRUQJMgorI2RlZmluZSBSRFNfUkRNQV9EUk9QUEVECTMKKyNkZWZpbmUgUkRTX1JETUFfT1RIRVJfRVJST1IJNAorCisvKgorICogQ29tbW9uIHNldCBvZiBmbGFncyBmb3IgYWxsIFJETUEgcmVsYXRlZCBzdHJ1Y3RzCisgKi8KKyNkZWZpbmUgUkRTX1JETUFfUkVBRFdSSVRFCTB4MDAwMQorI2RlZmluZSBSRFNfUkRNQV9GRU5DRQkJMHgwMDAyCS8qIHVzZSBGRU5DRSBmb3IgaW1tZWRpYXRlIHNlbmQgKi8KKyNkZWZpbmUgUkRTX1JETUFfSU5WQUxJREFURQkweDAwMDQJLyogaW52YWxpZGF0ZSBSX0tleSBhZnRlciBmcmVlaW5nIE1SICovCisjZGVmaW5lIFJEU19SRE1BX1VTRV9PTkNFCTB4MDAwOAkvKiBmcmVlIE1SIGFmdGVyIHVzZSAqLworI2RlZmluZSBSRFNfUkRNQV9ET05UV0FJVAkweDAwMTAJLyogRG9uJ3Qgd2FpdCBpbiBTRVRfQkFSUklFUiAqLworI2RlZmluZSBSRFNfUkRNQV9OT1RJRllfTUUJMHgwMDIwCS8qIE5vdGlmeSB3aGVuIG9wZXJhdGlvbiBjb21wbGV0ZXMgKi8KKyNkZWZpbmUgUkRTX1JETUFfU0lMRU5UCQkweDAwNDAJLyogRG8gbm90IGludGVycnVwdCByZW1vdGUgKi8KKworI2VuZGlmIC8qIElCX1JEU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JlYm9vdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yZWJvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTMzNjc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yZWJvb3QuaApAQCAtMCwwICsxLDM5IEBACisjaWZuZGVmIF9MSU5VWF9SRUJPT1RfSAorI2RlZmluZSBfTElOVVhfUkVCT09UX0gKKworLyoKKyAqIE1hZ2ljIHZhbHVlcyByZXF1aXJlZCB0byB1c2UgX3JlYm9vdCgpIHN5c3RlbSBjYWxsLgorICovCisKKyNkZWZpbmUJTElOVVhfUkVCT09UX01BR0lDMQkweGZlZTFkZWFkCisjZGVmaW5lCUxJTlVYX1JFQk9PVF9NQUdJQzIJNjcyMjc0NzkzCisjZGVmaW5lCUxJTlVYX1JFQk9PVF9NQUdJQzJBCTg1MDcyMjc4CisjZGVmaW5lCUxJTlVYX1JFQk9PVF9NQUdJQzJCCTM2OTM2NzQ0OAorI2RlZmluZQlMSU5VWF9SRUJPT1RfTUFHSUMyQwk1Mzc5OTMyMTYKKworCisvKgorICogQ29tbWFuZHMgYWNjZXB0ZWQgYnkgdGhlIF9yZWJvb3QoKSBzeXN0ZW0gY2FsbC4KKyAqCisgKiBSRVNUQVJUICAgICBSZXN0YXJ0IHN5c3RlbSB1c2luZyBkZWZhdWx0IGNvbW1hbmQgYW5kIG1vZGUuCisgKiBIQUxUICAgICAgICBTdG9wIE9TIGFuZCBnaXZlIHN5c3RlbSBjb250cm9sIHRvIFJPTSBtb25pdG9yLCBpZiBhbnkuCisgKiBDQURfT04gICAgICBDdHJsLUFsdC1EZWwgc2VxdWVuY2UgY2F1c2VzIFJFU1RBUlQgY29tbWFuZC4KKyAqIENBRF9PRkYgICAgIEN0cmwtQWx0LURlbCBzZXF1ZW5jZSBzZW5kcyBTSUdJTlQgdG8gaW5pdCB0YXNrLgorICogUE9XRVJfT0ZGICAgU3RvcCBPUyBhbmQgcmVtb3ZlIGFsbCBwb3dlciBmcm9tIHN5c3RlbSwgaWYgcG9zc2libGUuCisgKiBSRVNUQVJUMiAgICBSZXN0YXJ0IHN5c3RlbSB1c2luZyBnaXZlbiBjb21tYW5kIHN0cmluZy4KKyAqIFNXX1NVU1BFTkQgIFN1c3BlbmQgc3lzdGVtIHVzaW5nIHNvZnR3YXJlIHN1c3BlbmQgaWYgY29tcGlsZWQgaW4uCisgKiBLRVhFQyAgICAgICBSZXN0YXJ0IHN5c3RlbSB1c2luZyBhIHByZXZpb3VzbHkgbG9hZGVkIExpbnV4IGtlcm5lbAorICovCisKKyNkZWZpbmUJTElOVVhfUkVCT09UX0NNRF9SRVNUQVJUCTB4MDEyMzQ1NjcKKyNkZWZpbmUJTElOVVhfUkVCT09UX0NNRF9IQUxUCQkweENERUYwMTIzCisjZGVmaW5lCUxJTlVYX1JFQk9PVF9DTURfQ0FEX09OCQkweDg5QUJDREVGCisjZGVmaW5lCUxJTlVYX1JFQk9PVF9DTURfQ0FEX09GRgkweDAwMDAwMDAwCisjZGVmaW5lCUxJTlVYX1JFQk9PVF9DTURfUE9XRVJfT0ZGCTB4NDMyMUZFREMKKyNkZWZpbmUJTElOVVhfUkVCT09UX0NNRF9SRVNUQVJUMgkweEExQjJDM0Q0CisjZGVmaW5lCUxJTlVYX1JFQk9PVF9DTURfU1dfU1VTUEVORAkweEQwMDBGQ0UyCisjZGVmaW5lCUxJTlVYX1JFQk9PVF9DTURfS0VYRUMJCTB4NDU1ODQ1NDMKKworCisKKyNlbmRpZiAvKiBfTElOVVhfUkVCT09UX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2EyMjUxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCBIYW5zIFJlaXNlciwgc2VlIHJlaXNlcmZzL1JFQURNRSBmb3IgbGljZW5zaW5nIGFuZCBjb3B5cmlnaHQgZGV0YWlscworICovCisKKwkJCQkvKiB0aGlzIGZpbGUgaGFzIGFuIGFtYXppbmdseSBzdHVwaWQKKwkJCQkgICBuYW1lLCB5dXJhIHBsZWFzZSBmaXggaXQgdG8gYmUKKwkJCQkgICByZWlzZXJmcy5oLCBhbmQgbWVyZ2UgYWxsIHRoZSByZXN0CisJCQkJICAgb2Ygb3VyIC5oIGZpbGVzIHRoYXQgYXJlIGluIHRoaXMKKwkJCQkgICBkaXJlY3RvcnkgaW50byBpdC4gICovCisKKyNpZm5kZWYgX0xJTlVYX1JFSVNFUl9GU19ICisjZGVmaW5lIF9MSU5VWF9SRUlTRVJfRlNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorCisKKy8qCisgKiAgaW5jbHVkZS9saW51eC9yZWlzZXJfZnMuaAorICoKKyAqICBSZWlzZXIgRmlsZSBTeXN0ZW0gY29uc3RhbnRzIGFuZCBzdHJ1Y3R1cmVzCisgKgorICovCisKKy8qIGlvY3RsJ3MgY29tbWFuZCAqLworI2RlZmluZSBSRUlTRVJGU19JT0NfVU5QQUNLCQlfSU9XKDB4Q0QsMSxsb25nKQorLyogZGVmaW5lIGZvbGxvd2luZyBmbGFncyB0byBiZSB0aGUgc2FtZSBhcyBpbiBleHQyLCBzbyB0aGF0IGNoYXR0cigxKSwKKyAgIGxzYXR0cigxKSB3aWxsIHdvcmsgd2l0aCB1cy4gKi8KKyNkZWZpbmUgUkVJU0VSRlNfSU9DX0dFVEZMQUdTCQlGU19JT0NfR0VURkxBR1MKKyNkZWZpbmUgUkVJU0VSRlNfSU9DX1NFVEZMQUdTCQlGU19JT0NfU0VURkxBR1MKKyNkZWZpbmUgUkVJU0VSRlNfSU9DX0dFVFZFUlNJT04JCUZTX0lPQ19HRVRWRVJTSU9OCisjZGVmaW5lIFJFSVNFUkZTX0lPQ19TRVRWRVJTSU9OCQlGU19JT0NfU0VUVkVSU0lPTgorCisKKyNlbmRpZgkJCQkvKiBfTElOVVhfUkVJU0VSX0ZTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfeGF0dHIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfeGF0dHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGZmZjJlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yZWlzZXJmc194YXR0ci5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgIEZpbGU6IGxpbnV4L3JlaXNlcmZzX3hhdHRyLmgKKyovCisKKyNpZm5kZWYgX0xJTlVYX1JFSVNFUkZTX1hBVFRSX0gKKyNkZWZpbmUgX0xJTlVYX1JFSVNFUkZTX1hBVFRSX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIE1hZ2ljIHZhbHVlIGluIGhlYWRlciAqLworI2RlZmluZSBSRUlTRVJGU19YQVRUUl9NQUdJQyAweDUyNDY1ODQxCS8qICJSRlhBIiAqLworCitzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyIHsKKwlfX2xlMzIgaF9tYWdpYzsJCS8qIG1hZ2ljIG51bWJlciBmb3IgaWRlbnRpZmljYXRpb24gKi8KKwlfX2xlMzIgaF9oYXNoOwkJLyogaGFzaCBvZiB0aGUgdmFsdWUgKi8KK307CisKK3N0cnVjdCByZWlzZXJmc19zZWN1cml0eV9oYW5kbGUgeworCWNoYXIgKm5hbWU7CisJdm9pZCAqdmFsdWU7CisJc2l6ZV90IGxlbmd0aDsKK307CisKKworI2VuZGlmICAvKiAgX0xJTlVYX1JFSVNFUkZTX1hBVFRSX0ggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Jlc291cmNlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Jlc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU2ZWYyMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmVzb3VyY2UuaApAQCAtMCwwICsxLDgwIEBACisjaWZuZGVmIF9MSU5VWF9SRVNPVVJDRV9ICisjZGVmaW5lIF9MSU5VWF9SRVNPVVJDRV9ICisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIFJlc291cmNlIGNvbnRyb2wvYWNjb3VudGluZyBoZWFkZXIgZmlsZSBmb3IgbGludXgKKyAqLworCisvKgorICogRGVmaW5pdGlvbiBvZiBzdHJ1Y3QgcnVzYWdlIHRha2VuIGZyb20gQlNEIDQuMyBSZW5vCisgKiAKKyAqIFdlIGRvbid0IHN1cHBvcnQgYWxsIG9mIHRoZXNlIHlldCwgYnV0IHdlIG1pZ2h0IGFzIHdlbGwgaGF2ZSB0aGVtLi4uLgorICogT3RoZXJ3aXNlLCBlYWNoIHRpbWUgd2UgYWRkIG5ldyBpdGVtcywgcHJvZ3JhbXMgd2hpY2ggZGVwZW5kIG9uIHRoaXMKKyAqIHN0cnVjdHVyZSB3aWxsIGxvc2UuICBUaGlzIHJlZHVjZXMgdGhlIGNoYW5jZXMgb2YgdGhhdCBoYXBwZW5pbmcuCisgKi8KKyNkZWZpbmUJUlVTQUdFX1NFTEYJMAorI2RlZmluZQlSVVNBR0VfQ0hJTERSRU4JKC0xKQorI2RlZmluZSBSVVNBR0VfQk9USAkoLTIpCQkvKiBzeXNfd2FpdDQoKSB1c2VzIHRoaXMgKi8KKyNkZWZpbmUJUlVTQUdFX1RIUkVBRAkxCQkvKiBvbmx5IHRoZSBjYWxsaW5nIHRocmVhZCAqLworCitzdHJ1Y3QJcnVzYWdlIHsKKwlzdHJ1Y3QgdGltZXZhbCBydV91dGltZTsJLyogdXNlciB0aW1lIHVzZWQgKi8KKwlzdHJ1Y3QgdGltZXZhbCBydV9zdGltZTsJLyogc3lzdGVtIHRpbWUgdXNlZCAqLworCWxvbmcJcnVfbWF4cnNzOwkJLyogbWF4aW11bSByZXNpZGVudCBzZXQgc2l6ZSAqLworCWxvbmcJcnVfaXhyc3M7CQkvKiBpbnRlZ3JhbCBzaGFyZWQgbWVtb3J5IHNpemUgKi8KKwlsb25nCXJ1X2lkcnNzOwkJLyogaW50ZWdyYWwgdW5zaGFyZWQgZGF0YSBzaXplICovCisJbG9uZwlydV9pc3JzczsJCS8qIGludGVncmFsIHVuc2hhcmVkIHN0YWNrIHNpemUgKi8KKwlsb25nCXJ1X21pbmZsdDsJCS8qIHBhZ2UgcmVjbGFpbXMgKi8KKwlsb25nCXJ1X21hamZsdDsJCS8qIHBhZ2UgZmF1bHRzICovCisJbG9uZwlydV9uc3dhcDsJCS8qIHN3YXBzICovCisJbG9uZwlydV9pbmJsb2NrOwkJLyogYmxvY2sgaW5wdXQgb3BlcmF0aW9ucyAqLworCWxvbmcJcnVfb3VibG9jazsJCS8qIGJsb2NrIG91dHB1dCBvcGVyYXRpb25zICovCisJbG9uZwlydV9tc2dzbmQ7CQkvKiBtZXNzYWdlcyBzZW50ICovCisJbG9uZwlydV9tc2dyY3Y7CQkvKiBtZXNzYWdlcyByZWNlaXZlZCAqLworCWxvbmcJcnVfbnNpZ25hbHM7CQkvKiBzaWduYWxzIHJlY2VpdmVkICovCisJbG9uZwlydV9udmNzdzsJCS8qIHZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzICovCisJbG9uZwlydV9uaXZjc3c7CQkvKiBpbnZvbHVudGFyeSAiICovCit9OworCitzdHJ1Y3QgcmxpbWl0IHsKKwl1bnNpZ25lZCBsb25nCXJsaW1fY3VyOworCXVuc2lnbmVkIGxvbmcJcmxpbV9tYXg7Cit9OworCisjZGVmaW5lIFJMSU02NF9JTkZJTklUWQkJKH4wVUxMKQorCitzdHJ1Y3QgcmxpbWl0NjQgeworCV9fdTY0IHJsaW1fY3VyOworCV9fdTY0IHJsaW1fbWF4OworfTsKKworI2RlZmluZQlQUklPX01JTgkoLTIwKQorI2RlZmluZQlQUklPX01BWAkyMAorCisjZGVmaW5lCVBSSU9fUFJPQ0VTUwkwCisjZGVmaW5lCVBSSU9fUEdSUAkxCisjZGVmaW5lCVBSSU9fVVNFUgkyCisKKy8qCisgKiBMaW1pdCB0aGUgc3RhY2sgYnkgdG8gc29tZSBzYW5lIGRlZmF1bHQ6IHJvb3QgY2FuIGFsd2F5cworICogaW5jcmVhc2UgdGhpcyBsaW1pdCBpZiBuZWVkZWQuLiAgOE1CIHNlZW1zIHJlYXNvbmFibGUuCisgKi8KKyNkZWZpbmUgX1NUS19MSU0JKDgqMTAyNCoxMDI0KQorCisvKgorICogR1BHMiB3YW50cyA2NGtCIG9mIG1sb2NrZWQgbWVtb3J5LCB0byBtYWtlIHN1cmUgcGFzcyBwaHJhc2VzCisgKiBhbmQgb3RoZXIgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIGFyZSBuZXZlciB3cml0dGVuIHRvIGRpc2suCisgKi8KKyNkZWZpbmUgTUxPQ0tfTElNSVQJKChQQUdFX1NJWkUgPiA2NCoxMDI0KSA/IFBBR0VfU0laRSA6IDY0KjEwMjQpCisKKy8qCisgKiBEdWUgdG8gYmluYXJ5IGNvbXBhdGliaWxpdHksIHRoZSBhY3R1YWwgcmVzb3VyY2UgbnVtYmVycworICogbWF5IGJlIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IGxpbnV4IHZlcnNpb25zLi4KKyAqLworI2luY2x1ZGUgPGFzbS9yZXNvdXJjZS5oPgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yZmtpbGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmZraWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJiMmM2NgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmZraWxsLmgKQEAgLTAsMCArMSwxMDcgQEAKKyNpZm5kZWYgX19SRktJTExfSAorI2RlZmluZSBfX1JGS0lMTF9ICisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgLSAyMDA3IEl2byB2YW4gRG9vcm4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBEbWl0cnkgVG9yb2tob3YKKyAqIENvcHlyaWdodCAyMDA5IEpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIGRlZmluZSB1c2Vyc3BhY2UgdmlzaWJsZSBzdGF0ZXMgKi8KKyNkZWZpbmUgUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRAkwCisjZGVmaW5lIFJGS0lMTF9TVEFURV9VTkJMT0NLRUQJCTEKKyNkZWZpbmUgUkZLSUxMX1NUQVRFX0hBUkRfQkxPQ0tFRAkyCisKKy8qKgorICogZW51bSByZmtpbGxfdHlwZSAtIHR5cGUgb2YgcmZraWxsIHN3aXRjaC4KKyAqCisgKiBAUkZLSUxMX1RZUEVfQUxMOiB0b2dnbGVzIGFsbCBzd2l0Y2hlcyAocmVxdWVzdHMgb25seSAtIG5vdCBhIHN3aXRjaCB0eXBlKQorICogQFJGS0lMTF9UWVBFX1dMQU46IHN3aXRjaCBpcyBvbiBhIDgwMi4xMSB3aXJlbGVzcyBuZXR3b3JrIGRldmljZS4KKyAqIEBSRktJTExfVFlQRV9CTFVFVE9PVEg6IHN3aXRjaCBpcyBvbiBhIGJsdWV0b290aCBkZXZpY2UuCisgKiBAUkZLSUxMX1RZUEVfVVdCOiBzd2l0Y2ggaXMgb24gYSB1bHRyYSB3aWRlYmFuZCBkZXZpY2UuCisgKiBAUkZLSUxMX1RZUEVfV0lNQVg6IHN3aXRjaCBpcyBvbiBhIFdpTUFYIGRldmljZS4KKyAqIEBSRktJTExfVFlQRV9XV0FOOiBzd2l0Y2ggaXMgb24gYSB3aXJlbGVzcyBXQU4gZGV2aWNlLgorICogQFJGS0lMTF9UWVBFX0dQUzogc3dpdGNoIGlzIG9uIGEgR1BTIGRldmljZS4KKyAqIEBSRktJTExfVFlQRV9GTTogc3dpdGNoIGlzIG9uIGEgRk0gcmFkaW8gZGV2aWNlLgorICogQE5VTV9SRktJTExfVFlQRVM6IG51bWJlciBvZiBkZWZpbmVkIHJma2lsbCB0eXBlcworICovCitlbnVtIHJma2lsbF90eXBlIHsKKwlSRktJTExfVFlQRV9BTEwgPSAwLAorCVJGS0lMTF9UWVBFX1dMQU4sCisJUkZLSUxMX1RZUEVfQkxVRVRPT1RILAorCVJGS0lMTF9UWVBFX1VXQiwKKwlSRktJTExfVFlQRV9XSU1BWCwKKwlSRktJTExfVFlQRV9XV0FOLAorCVJGS0lMTF9UWVBFX0dQUywKKwlSRktJTExfVFlQRV9GTSwKKwlOVU1fUkZLSUxMX1RZUEVTLAorfTsKKworLyoqCisgKiBlbnVtIHJma2lsbF9vcGVyYXRpb24gLSBvcGVyYXRpb24gdHlwZXMKKyAqIEBSRktJTExfT1BfQUREOiBhIGRldmljZSB3YXMgYWRkZWQKKyAqIEBSRktJTExfT1BfREVMOiBhIGRldmljZSB3YXMgcmVtb3ZlZAorICogQFJGS0lMTF9PUF9DSEFOR0U6IGEgZGV2aWNlJ3Mgc3RhdGUgY2hhbmdlZCAtLSB1c2Vyc3BhY2UgY2hhbmdlcyBvbmUgZGV2aWNlCisgKiBAUkZLSUxMX09QX0NIQU5HRV9BTEw6IHVzZXJzcGFjZSBjaGFuZ2VzIGFsbCBkZXZpY2VzIChvZiBhIHR5cGUsIG9yIGFsbCkKKyAqLworZW51bSByZmtpbGxfb3BlcmF0aW9uIHsKKwlSRktJTExfT1BfQUREID0gMCwKKwlSRktJTExfT1BfREVMLAorCVJGS0lMTF9PUF9DSEFOR0UsCisJUkZLSUxMX09QX0NIQU5HRV9BTEwsCit9OworCisvKioKKyAqIHN0cnVjdCByZmtpbGxfZXZlbnQgLSBldmVudHMgZm9yIHVzZXJzcGFjZSBvbiAvZGV2L3Jma2lsbAorICogQGlkeDogaW5kZXggb2YgZGV2IHJma2lsbAorICogQHR5cGU6IHR5cGUgb2YgdGhlIHJma2lsbCBzdHJ1Y3QKKyAqIEBvcDogb3BlcmF0aW9uIGNvZGUKKyAqIEBoYXJkOiBoYXJkIHN0YXRlICgwLzEpCisgKiBAc29mdDogc29mdCBzdGF0ZSAoMC8xKQorICoKKyAqIFN0cnVjdHVyZSB1c2VkIGZvciB1c2Vyc3BhY2UgY29tbXVuaWNhdGlvbiBvbiAvZGV2L3Jma2lsbCwKKyAqIHVzZWQgZm9yIGV2ZW50cyBmcm9tIHRoZSBrZXJuZWwgYW5kIGNvbnRyb2wgdG8gdGhlIGtlcm5lbC4KKyAqLworc3RydWN0IHJma2lsbF9ldmVudCB7CisJX191MzIgaWR4OworCV9fdTggIHR5cGU7CisJX191OCAgb3A7CisJX191OCAgc29mdCwgaGFyZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qCisgKiBXZSBhcmUgcGxhbm5pbmcgdG8gYmUgYmFja3dhcmQgYW5kIGZvcndhcmQgY29tcGF0aWJsZSB3aXRoIGNoYW5nZXMKKyAqIHRvIHRoZSBldmVudCBzdHJ1Y3QsIGJ5IGFkZGluZyBuZXcsIG9wdGlvbmFsLCBtZW1iZXJzIGF0IHRoZSBlbmQuCisgKiBXaGVuIHJlYWRpbmcgYW4gZXZlbnQgKHdoZXRoZXIgdGhlIGtlcm5lbCBmcm9tIHVzZXJzcGFjZSBvciB2aWNlCisgKiB2ZXJzYSkgd2UgbmVlZCB0byBhY2NlcHQgYW55dGhpbmcgdGhhdCdzIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZQorICogdmVyc2lvbiAxIGV2ZW50IHNpemUsIGJ1dCBtaWdodCBiZSBhYmxlIHRvIGFjY2VwdCBvdGhlciBzaXplcyBpbgorICogdGhlIGZ1dHVyZS4KKyAqCisgKiBPbmUgZXhjZXB0aW9uIGlzIHRoZSBrZXJuZWwgLS0gd2UgYWxyZWFkeSBoYXZlIHR3byBldmVudCBzaXplcyBpbgorICogdGhhdCB3ZSd2ZSBtYWRlIHRoZSAnaGFyZCcgbWVtYmVyIG9wdGlvbmFsIHNpbmNlIG91ciBvbmx5IG9wdGlvbgorICogaXMgdG8gaWdub3JlIGl0IGFueXdheS4KKyAqLworI2RlZmluZSBSRktJTExfRVZFTlRfU0laRV9WMQk4CisKKy8qIGlvY3RsIGZvciB0dXJuaW5nIG9mZiByZmtpbGwtaW5wdXQgKGlmIHByZXNlbnQpICovCisjZGVmaW5lIFJGS0lMTF9JT0NfTUFHSUMJJ1InCisjZGVmaW5lIFJGS0lMTF9JT0NfTk9JTlBVVAkxCisjZGVmaW5lIFJGS0lMTF9JT0NUTF9OT0lOUFVUCV9JTyhSRktJTExfSU9DX01BR0lDLCBSRktJTExfSU9DX05PSU5QVVQpCisKKy8qIGFuZCB0aGF0J3MgYWxsIHVzZXJzcGFjZSBnZXRzICovCisKKyNlbmRpZiAvKiBSRktJTExfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yb21mc19mcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yb21mc19mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNTdmOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JvbWZzX2ZzLmgKQEAgLTAsMCArMSw1OSBAQAorI2lmbmRlZiBfX0xJTlVYX1JPTUZTX0ZTX0gKKyNkZWZpbmUgX19MSU5VWF9ST01GU19GU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKy8qIFRoZSBiYXNpYyBzdHJ1Y3R1cmVzIG9mIHRoZSByb21mcyBmaWxlc3lzdGVtICovCisKKyNkZWZpbmUgUk9NQlNJWkUgQkxPQ0tfU0laRQorI2RlZmluZSBST01CU0JJVFMgQkxPQ0tfU0laRV9CSVRTCisjZGVmaW5lIFJPTUJNQVNLIChST01CU0laRS0xKQorI2RlZmluZSBST01GU19NQUdJQyAweDcyNzUKKworI2RlZmluZSBST01GU19NQVhGTiAxMjgKKworI2RlZmluZSBfX21rdyhoLGwpICgoKGgpJjB4MDBmZik8PCA4fCgobCkmMHgwMGZmKSkKKyNkZWZpbmUgX19ta2woaCxsKSAoKChoKSYweGZmZmYpPDwxNnwoKGwpJjB4ZmZmZikpCisjZGVmaW5lIF9fbWs0KGEsYixjLGQpIGNwdV90b19iZTMyKF9fbWtsKF9fbWt3KGEsYiksX19ta3coYyxkKSkpCisjZGVmaW5lIFJPTVNCX1dPUkQwIF9fbWs0KCctJywncicsJ28nLCdtJykKKyNkZWZpbmUgUk9NU0JfV09SRDEgX19tazQoJzEnLCdmJywncycsJy0nKQorCisvKiBPbi1kaXNrICJzdXBlciBibG9jayIgKi8KKworc3RydWN0IHJvbWZzX3N1cGVyX2Jsb2NrIHsKKwlfX2JlMzIgd29yZDA7CisJX19iZTMyIHdvcmQxOworCV9fYmUzMiBzaXplOworCV9fYmUzMiBjaGVja3N1bTsKKwljaGFyIG5hbWVbMF07CQkvKiB2b2x1bWUgbmFtZSAqLworfTsKKworLyogT24gZGlzayBpbm9kZSAqLworCitzdHJ1Y3Qgcm9tZnNfaW5vZGUgeworCV9fYmUzMiBuZXh0OwkJLyogbG93IDQgYml0cyBzZWUgUk9NRkhfICovCisJX19iZTMyIHNwZWM7CisJX19iZTMyIHNpemU7CisJX19iZTMyIGNoZWNrc3VtOworCWNoYXIgbmFtZVswXTsKK307CisKKyNkZWZpbmUgUk9NRkhfVFlQRSA3CisjZGVmaW5lIFJPTUZIX0hSRCAwCisjZGVmaW5lIFJPTUZIX0RJUiAxCisjZGVmaW5lIFJPTUZIX1JFRyAyCisjZGVmaW5lIFJPTUZIX1NZTSAzCisjZGVmaW5lIFJPTUZIX0JMSyA0CisjZGVmaW5lIFJPTUZIX0NIUiA1CisjZGVmaW5lIFJPTUZIX1NDSyA2CisjZGVmaW5lIFJPTUZIX0ZJRiA3CisjZGVmaW5lIFJPTUZIX0VYRUMgOAorCisvKiBBbGlnbm1lbnQgKi8KKworI2RlZmluZSBST01GSF9TSVpFIDE2CisjZGVmaW5lIFJPTUZIX1BBRCAoUk9NRkhfU0laRS0xKQorI2RlZmluZSBST01GSF9NQVNLICh+Uk9NRkhfUEFEKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcm9zZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yb3NlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjZmU5NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcm9zZS5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHB1YmxpYyBlbGVtZW50cyBvZiB0aGUgTGludXgga2VybmVsIFJvc2UgaW1wbGVtZW50YXRpb24uCisgKiBGb3Iga2VybmVsIEFYLjI1IHNlZSB0aGUgZmlsZSBheDI1LmguIFRoaXMgZmlsZSByZXF1aXJlcyBheDI1LmggZm9yIHRoZQorICogZGVmaW5pdGlvbiBvZiB0aGUgYXgyNV9hZGRyZXNzIHN0cnVjdHVyZS4KKyAqLworCisjaWZuZGVmCVJPU0VfS0VSTkVMX0gKKyNkZWZpbmUJUk9TRV9LRVJORUxfSAorCisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvYXgyNS5oPgorCisjZGVmaW5lIFJPU0VfTVRVCTI1MQorCisjZGVmaW5lIFJPU0VfTUFYX0RJR0lTIDYKKworI2RlZmluZQlST1NFX0RFRkVSCTEKKyNkZWZpbmUgUk9TRV9UMQkJMgorI2RlZmluZQlST1NFX1QyCQkzCisjZGVmaW5lCVJPU0VfVDMJCTQKKyNkZWZpbmUJUk9TRV9JRExFCTUKKyNkZWZpbmUJUk9TRV9RQklUSU5DTAk2CisjZGVmaW5lCVJPU0VfSE9MREJBQ0sJNworCisjZGVmaW5lCVNJT0NSU0dDQVVTRQkJKFNJT0NQUk9UT1BSSVZBVEUrMCkKKyNkZWZpbmUJU0lPQ1JTU0NBVVNFCQkoU0lPQ1BST1RPUFJJVkFURSsxKQorI2RlZmluZQlTSU9DUlNMMkNBTEwJCShTSU9DUFJPVE9QUklWQVRFKzIpCisjZGVmaW5lCVNJT0NSU1NMMkNBTEwJCShTSU9DUFJPVE9QUklWQVRFKzIpCisjZGVmaW5lCVNJT0NSU0FDQ0VQVAkJKFNJT0NQUk9UT1BSSVZBVEUrMykKKyNkZWZpbmUJU0lPQ1JTQ0xSUlQJCShTSU9DUFJPVE9QUklWQVRFKzQpCisjZGVmaW5lCVNJT0NSU0dMMkNBTEwJCShTSU9DUFJPVE9QUklWQVRFKzUpCisjZGVmaW5lCVNJT0NSU0dGQUNJTElUSUVTCShTSU9DUFJPVE9QUklWQVRFKzYpCisKKyNkZWZpbmUJUk9TRV9EVEVfT1JJR0lOQVRFRAkweDAwCisjZGVmaW5lCVJPU0VfTlVNQkVSX0JVU1kJMHgwMQorI2RlZmluZQlST1NFX0lOVkFMSURfRkFDSUxJVFkJMHgwMworI2RlZmluZQlST1NFX05FVFdPUktfQ09OR0VTVElPTgkweDA1CisjZGVmaW5lCVJPU0VfT1VUX09GX09SREVSCTB4MDkKKyNkZWZpbmUJUk9TRV9BQ0NFU1NfQkFSUkVECTB4MEIKKyNkZWZpbmUJUk9TRV9OT1RfT0JUQUlOQUJMRQkweDBECisjZGVmaW5lCVJPU0VfUkVNT1RFX1BST0NFRFVSRQkweDExCisjZGVmaW5lCVJPU0VfTE9DQUxfUFJPQ0VEVVJFCTB4MTMKKyNkZWZpbmUJUk9TRV9TSElQX0FCU0VOVAkweDM5CisKK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyCQlyb3NlX2FkZHJbNV07Cit9IHJvc2VfYWRkcmVzczsKKworc3RydWN0IHNvY2thZGRyX3Jvc2UgeworCV9fa2VybmVsX3NhX2ZhbWlseV90IHNyb3NlX2ZhbWlseTsKKwlyb3NlX2FkZHJlc3MJc3Jvc2VfYWRkcjsKKwlheDI1X2FkZHJlc3MJc3Jvc2VfY2FsbDsKKwlpbnQJCXNyb3NlX25kaWdpczsKKwlheDI1X2FkZHJlc3MJc3Jvc2VfZGlnaTsKK307CisKK3N0cnVjdCBmdWxsX3NvY2thZGRyX3Jvc2UgeworCV9fa2VybmVsX3NhX2ZhbWlseV90IHNyb3NlX2ZhbWlseTsKKwlyb3NlX2FkZHJlc3MJc3Jvc2VfYWRkcjsKKwlheDI1X2FkZHJlc3MJc3Jvc2VfY2FsbDsKKwl1bnNpZ25lZCBpbnQJc3Jvc2VfbmRpZ2lzOworCWF4MjVfYWRkcmVzcwlzcm9zZV9kaWdpc1tST1NFX01BWF9ESUdJU107Cit9OworCitzdHJ1Y3Qgcm9zZV9yb3V0ZV9zdHJ1Y3QgeworCXJvc2VfYWRkcmVzcwlhZGRyZXNzOworCXVuc2lnbmVkIHNob3J0CW1hc2s7CisJYXgyNV9hZGRyZXNzCW5laWdoYm91cjsKKwljaGFyCQlkZXZpY2VbMTZdOworCXVuc2lnbmVkIGNoYXIJbmRpZ2lzOworCWF4MjVfYWRkcmVzcwlkaWdpcGVhdGVyc1tBWDI1X01BWF9ESUdJU107Cit9OworCitzdHJ1Y3Qgcm9zZV9jYXVzZV9zdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIJY2F1c2U7CisJdW5zaWduZWQgY2hhcglkaWFnbm9zdGljOworfTsKKworc3RydWN0IHJvc2VfZmFjaWxpdGllc19zdHJ1Y3QgeworCXJvc2VfYWRkcmVzcwlzb3VyY2VfYWRkciwgICBkZXN0X2FkZHI7CisJYXgyNV9hZGRyZXNzCXNvdXJjZV9jYWxsLCAgIGRlc3RfY2FsbDsKKwl1bnNpZ25lZCBjaGFyCXNvdXJjZV9uZGlnaXMsIGRlc3RfbmRpZ2lzOworCWF4MjVfYWRkcmVzcwlzb3VyY2VfZGlnaXNbUk9TRV9NQVhfRElHSVNdOworCWF4MjVfYWRkcmVzcwlkZXN0X2RpZ2lzW1JPU0VfTUFYX0RJR0lTXTsKKwl1bnNpZ25lZCBpbnQJcmFuZDsKKwlyb3NlX2FkZHJlc3MJZmFpbF9hZGRyOworCWF4MjVfYWRkcmVzcwlmYWlsX2NhbGw7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcm91dGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcm91dGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWFiZjU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yb3V0ZS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJR2xvYmFsIGRlZmluaXRpb25zIGZvciB0aGUgSVAgcm91dGVyIGludGVyZmFjZS4KKyAqCisgKiBWZXJzaW9uOglAKCMpcm91dGUuaAkxLjAuMwkwNS8yNy85MworICoKKyAqIEF1dGhvcnM6CU9yaWdpbmFsIHRha2VuIGZyb20gQmVya2VsZXkgVU5JWCA0LjMsIChjKSBVQ0IgMTk4Ni0xOTg4CisgKgkJZm9yIHRoZSBwdXJwb3NlcyBvZiBjb21wYXRpYmlsaXR5IG9ubHkuCisgKgorICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoKKyAqIENoYW5nZXM6CisgKiAgICAgICAgICAgICAgTWlrZSBNY0xhZ2FuICAgIDogICAgICAgUm91dGluZyBieSBzb3VyY2UKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfUk9VVEVfSAorI2RlZmluZSBfTElOVVhfUk9VVEVfSAorCisjaW5jbHVkZSA8bGludXgvaWYuaD4KKworCisvKiBUaGlzIHN0cnVjdHVyZSBnZXRzIHBhc3NlZCBieSB0aGUgU0lPQ0FERFJUIGFuZCBTSU9DREVMUlQgY2FsbHMuICovCitzdHJ1Y3QgcnRlbnRyeSB7CisJdW5zaWduZWQgbG9uZwlydF9wYWQxOworCXN0cnVjdCBzb2NrYWRkcglydF9kc3Q7CQkvKiB0YXJnZXQgYWRkcmVzcwkJKi8KKwlzdHJ1Y3Qgc29ja2FkZHIJcnRfZ2F0ZXdheTsJLyogZ2F0ZXdheSBhZGRyIChSVEZfR0FURVdBWSkJKi8KKwlzdHJ1Y3Qgc29ja2FkZHIJcnRfZ2VubWFzazsJLyogdGFyZ2V0IG5ldHdvcmsgbWFzayAoSVApCSovCisJdW5zaWduZWQgc2hvcnQJcnRfZmxhZ3M7CisJc2hvcnQJCXJ0X3BhZDI7CisJdW5zaWduZWQgbG9uZwlydF9wYWQzOworCXZvaWQJCSpydF9wYWQ0OworCXNob3J0CQlydF9tZXRyaWM7CS8qICsxIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSEJKi8KKwljaGFyICpydF9kZXY7CS8qIGZvcmNpbmcgdGhlIGRldmljZSBhdCBhZGQJKi8KKwl1bnNpZ25lZCBsb25nCXJ0X210dTsJCS8qIHBlciByb3V0ZSBNVFUvV2luZG93IAkqLworI2RlZmluZSBydF9tc3MJcnRfbXR1CQkJLyogQ29tcGF0aWJpbGl0eSA6LSggICAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcJcnRfd2luZG93OwkvKiBXaW5kb3cgY2xhbXBpbmcgCQkqLworCXVuc2lnbmVkIHNob3J0CXJ0X2lydHQ7CS8qIEluaXRpYWwgUlRUCQkJKi8KK307CisKKworI2RlZmluZQlSVEZfVVAJCTB4MDAwMQkJLyogcm91dGUgdXNhYmxlCQkgIAkqLworI2RlZmluZQlSVEZfR0FURVdBWQkweDAwMDIJCS8qIGRlc3RpbmF0aW9uIGlzIGEgZ2F0ZXdheQkqLworI2RlZmluZQlSVEZfSE9TVAkweDAwMDQJCS8qIGhvc3QgZW50cnkgKG5ldCBvdGhlcndpc2UpCSovCisjZGVmaW5lIFJURl9SRUlOU1RBVEUJMHgwMDA4CQkvKiByZWluc3RhdGUgcm91dGUgYWZ0ZXIgdG1vdXQJKi8KKyNkZWZpbmUJUlRGX0RZTkFNSUMJMHgwMDEwCQkvKiBjcmVhdGVkIGR5bi4gKGJ5IHJlZGlyZWN0KQkqLworI2RlZmluZQlSVEZfTU9ESUZJRUQJMHgwMDIwCQkvKiBtb2RpZmllZCBkeW4uIChieSByZWRpcmVjdCkJKi8KKyNkZWZpbmUgUlRGX01UVQkJMHgwMDQwCQkvKiBzcGVjaWZpYyBNVFUgZm9yIHRoaXMgcm91dGUJKi8KKyNkZWZpbmUgUlRGX01TUwkJUlRGX01UVQkJLyogQ29tcGF0aWJpbGl0eSA6LSgJCSovCisjZGVmaW5lIFJURl9XSU5ET1cJMHgwMDgwCQkvKiBwZXIgcm91dGUgd2luZG93IGNsYW1waW5nCSovCisjZGVmaW5lIFJURl9JUlRUCTB4MDEwMAkJLyogSW5pdGlhbCByb3VuZCB0cmlwIHRpbWUJKi8KKyNkZWZpbmUgUlRGX1JFSkVDVAkweDAyMDAJCS8qIFJlamVjdCByb3V0ZQkJCSovCisKKy8qCisgKgk8bGludXgvaXB2Nl9yb3V0ZS5oPiB1c2VzIFJURiB2YWx1ZXMgPj0gNjRrCisgKi8KKworCisKKyNlbmRpZgkvKiBfTElOVVhfUk9VVEVfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3J0Yy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ydGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDY4MzdlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ydGMuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIEdlbmVyaWMgUlRDIGludGVyZmFjZS4KKyAqIFRoaXMgdmVyc2lvbiBjb250YWlucyB0aGUgcGFydCBvZiB0aGUgdXNlciBpbnRlcmZhY2UgdG8gdGhlIFJlYWwgVGltZSBDbG9jaworICogc2VydmljZS4gSXQgaXMgdXNlZCB3aXRoIGJvdGggdGhlIGxlZ2FjeSBtYzE0NjgxOCBhbmQgYWxzbyAgRUZJCisgKiBTdHJ1Y3QgcnRjX3RpbWUgYW5kIGZpcnN0IDEyIGlvY3RsIGJ5IFBhdWwgR29ydG1ha2VyLCAxOTk2IC0gc2VwYXJhdGVkIG91dAorICogZnJvbSA8bGludXgvbWMxNDY4MThydGMuaD4gdG8gdGhpcyBmaWxlIGZvciAyLjQga2VybmVscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgSGV3bGV0dC1QYWNrYXJkIENvLgorICogQ29weXJpZ2h0IChDKSAxOTk5IFN0ZXBoYW5lIEVyYW5pYW4gPGVyYW5pYW5AaHBsLmhwLmNvbT4KKyAqLworI2lmbmRlZiBfTElOVVhfUlRDX0hfCisjZGVmaW5lIF9MSU5VWF9SVENfSF8KKworLyoKKyAqIFRoZSBzdHJ1Y3QgdXNlZCB0byBwYXNzIGRhdGEgdmlhIHRoZSBmb2xsb3dpbmcgaW9jdGwuIFNpbWlsYXIgdG8gdGhlCisgKiBzdHJ1Y3QgdG0gaW4gPHRpbWUuaD4sIGJ1dCBpdCBuZWVkcyB0byBiZSBoZXJlIHNvIHRoYXQgdGhlIGtlcm5lbAorICogc291cmNlIGlzIHNlbGYgY29udGFpbmVkLCBhbGxvd2luZyBjcm9zcy1jb21waWxlcywgZXRjLiBldGMuCisgKi8KKworc3RydWN0IHJ0Y190aW1lIHsKKwlpbnQgdG1fc2VjOworCWludCB0bV9taW47CisJaW50IHRtX2hvdXI7CisJaW50IHRtX21kYXk7CisJaW50IHRtX21vbjsKKwlpbnQgdG1feWVhcjsKKwlpbnQgdG1fd2RheTsKKwlpbnQgdG1feWRheTsKKwlpbnQgdG1faXNkc3Q7Cit9OworCisvKgorICogVGhpcyBkYXRhIHN0cnVjdHVyZSBpcyBpbnNwaXJlZCBieSB0aGUgRUZJICh2MC45Mikgd2FrZXVwCisgKiBhbGFybSBBUEkuCisgKi8KK3N0cnVjdCBydGNfd2thbHJtIHsKKwl1bnNpZ25lZCBjaGFyIGVuYWJsZWQ7CS8qIDAgPSBhbGFybSBkaXNhYmxlZCwgMSA9IGFsYXJtIGVuYWJsZWQgKi8KKwl1bnNpZ25lZCBjaGFyIHBlbmRpbmc7ICAvKiAwID0gYWxhcm0gbm90IHBlbmRpbmcsIDEgPSBhbGFybSBwZW5kaW5nICovCisJc3RydWN0IHJ0Y190aW1lIHRpbWU7CS8qIHRpbWUgdGhlIGFsYXJtIGlzIHNldCB0byAqLworfTsKKworLyoKKyAqIERhdGEgc3RydWN0dXJlIHRvIGNvbnRyb2wgUExMIGNvcnJlY3Rpb24gc29tZSBiZXR0ZXIgUlRDIGZlYXR1cmUKKyAqIHBsbF92YWx1ZSBpcyB1c2VkIHRvIGdldCBvciBzZXQgY3VycmVudCB2YWx1ZSBvZiBjb3JyZWN0aW9uLAorICogdGhlIHJlc3Qgb2YgdGhlIHN0cnVjdCBpcyB1c2VkIHRvIHF1ZXJ5IEhXIGNhcGFiaWxpdGllcy4KKyAqIFRoaXMgaXMgbW9kZWxlZCBhZnRlciB0aGUgUlRDIHVzZWQgaW4gUTQwL1E2MCBjb21wdXRlcnMgYnV0CisgKiBzaG91bGQgYmUgc3VmZmljaWVudGx5IGZsZXhpYmxlIGZvciBvdGhlciBkZXZpY2VzCisgKgorICogK3ZlIHBsbF92YWx1ZSBtZWFucyBjbG9jayB3aWxsIHJ1biBmYXN0ZXIgYnkKKyAqICAgcGxsX3ZhbHVlKnBsbF9wb3NtdWx0L3BsbF9jbG9jaworICogLXZlIHBsbF92YWx1ZSBtZWFucyBjbG9jayB3aWxsIHJ1biBzbG93ZXIgYnkKKyAqICAgcGxsX3ZhbHVlKnBsbF9uZWdtdWx0L3BsbF9jbG9jaworICovCisKK3N0cnVjdCBydGNfcGxsX2luZm8geworCWludCBwbGxfY3RybDsgICAgICAgLyogcGxhY2Vob2xkZXIgZm9yIGZhbmNpZXIgY29udHJvbCAqLworCWludCBwbGxfdmFsdWU7ICAgICAgLyogZ2V0L3NldCBjb3JyZWN0aW9uIHZhbHVlICovCisJaW50IHBsbF9tYXg7ICAgICAgICAvKiBtYXggK3ZlIChmYXN0ZXIpIGFkanVzdG1lbnQgdmFsdWUgKi8KKwlpbnQgcGxsX21pbjsgICAgICAgIC8qIG1heCAtdmUgKHNsb3dlcikgYWRqdXN0bWVudCB2YWx1ZSAqLworCWludCBwbGxfcG9zbXVsdDsgICAgLyogZmFjdG9yIGZvciArdmUgY29ycmVjdGlvbiAqLworCWludCBwbGxfbmVnbXVsdDsgICAgLyogZmFjdG9yIGZvciAtdmUgY29ycmVjdGlvbiAqLworCWxvbmcgcGxsX2Nsb2NrOyAgICAgLyogYmFzZSBQTEwgZnJlcXVlbmN5ICovCit9OworCisvKgorICogaW9jdGwgY2FsbHMgdGhhdCBhcmUgcGVybWl0dGVkIHRvIHRoZSAvZGV2L3J0YyBpbnRlcmZhY2UsIGlmCisgKiBhbnkgb2YgdGhlIFJUQyBkcml2ZXJzIGFyZSBlbmFibGVkLgorICovCisKKyNkZWZpbmUgUlRDX0FJRV9PTglfSU8oJ3AnLCAweDAxKQkvKiBBbGFybSBpbnQuIGVuYWJsZSBvbgkJKi8KKyNkZWZpbmUgUlRDX0FJRV9PRkYJX0lPKCdwJywgMHgwMikJLyogLi4uIG9mZgkJCSovCisjZGVmaW5lIFJUQ19VSUVfT04JX0lPKCdwJywgMHgwMykJLyogVXBkYXRlIGludC4gZW5hYmxlIG9uCSovCisjZGVmaW5lIFJUQ19VSUVfT0ZGCV9JTygncCcsIDB4MDQpCS8qIC4uLiBvZmYJCQkqLworI2RlZmluZSBSVENfUElFX09OCV9JTygncCcsIDB4MDUpCS8qIFBlcmlvZGljIGludC4gZW5hYmxlIG9uCSovCisjZGVmaW5lIFJUQ19QSUVfT0ZGCV9JTygncCcsIDB4MDYpCS8qIC4uLiBvZmYJCQkqLworI2RlZmluZSBSVENfV0lFX09OCV9JTygncCcsIDB4MGYpICAvKiBXYXRjaGRvZyBpbnQuIGVuYWJsZSBvbgkqLworI2RlZmluZSBSVENfV0lFX09GRglfSU8oJ3AnLCAweDEwKSAgLyogLi4uIG9mZgkJCSovCisKKyNkZWZpbmUgUlRDX0FMTV9TRVQJX0lPVygncCcsIDB4MDcsIHN0cnVjdCBydGNfdGltZSkgLyogU2V0IGFsYXJtIHRpbWUgICovCisjZGVmaW5lIFJUQ19BTE1fUkVBRAlfSU9SKCdwJywgMHgwOCwgc3RydWN0IHJ0Y190aW1lKSAvKiBSZWFkIGFsYXJtIHRpbWUgKi8KKyNkZWZpbmUgUlRDX1JEX1RJTUUJX0lPUigncCcsIDB4MDksIHN0cnVjdCBydGNfdGltZSkgLyogUmVhZCBSVEMgdGltZSAgICovCisjZGVmaW5lIFJUQ19TRVRfVElNRQlfSU9XKCdwJywgMHgwYSwgc3RydWN0IHJ0Y190aW1lKSAvKiBTZXQgUlRDIHRpbWUgICAgKi8KKyNkZWZpbmUgUlRDX0lSUVBfUkVBRAlfSU9SKCdwJywgMHgwYiwgdW5zaWduZWQgbG9uZykJIC8qIFJlYWQgSVJRIHJhdGUgICAqLworI2RlZmluZSBSVENfSVJRUF9TRVQJX0lPVygncCcsIDB4MGMsIHVuc2lnbmVkIGxvbmcpCSAvKiBTZXQgSVJRIHJhdGUgICAgKi8KKyNkZWZpbmUgUlRDX0VQT0NIX1JFQUQJX0lPUigncCcsIDB4MGQsIHVuc2lnbmVkIGxvbmcpCSAvKiBSZWFkIGVwb2NoICAgICAgKi8KKyNkZWZpbmUgUlRDX0VQT0NIX1NFVAlfSU9XKCdwJywgMHgwZSwgdW5zaWduZWQgbG9uZykJIC8qIFNldCBlcG9jaCAgICAgICAqLworCisjZGVmaW5lIFJUQ19XS0FMTV9TRVQJX0lPVygncCcsIDB4MGYsIHN0cnVjdCBydGNfd2thbHJtKS8qIFNldCB3YWtldXAgYWxhcm0qLworI2RlZmluZSBSVENfV0tBTE1fUkQJX0lPUigncCcsIDB4MTAsIHN0cnVjdCBydGNfd2thbHJtKS8qIEdldCB3YWtldXAgYWxhcm0qLworCisjZGVmaW5lIFJUQ19QTExfR0VUCV9JT1IoJ3AnLCAweDExLCBzdHJ1Y3QgcnRjX3BsbF9pbmZvKSAgLyogR2V0IFBMTCBjb3JyZWN0aW9uICovCisjZGVmaW5lIFJUQ19QTExfU0VUCV9JT1coJ3AnLCAweDEyLCBzdHJ1Y3QgcnRjX3BsbF9pbmZvKSAgLyogU2V0IFBMTCBjb3JyZWN0aW9uICovCisKKy8qIGludGVycnVwdCBmbGFncyAqLworI2RlZmluZSBSVENfSVJRRiAweDgwCS8qIEFueSBvZiB0aGUgZm9sbG93aW5nIGlzIGFjdGl2ZSAqLworI2RlZmluZSBSVENfUEYgMHg0MAkvKiBQZXJpb2RpYyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgUlRDX0FGIDB4MjAJLyogQWxhcm0gaW50ZXJydXB0ICovCisjZGVmaW5lIFJUQ19VRiAweDEwCS8qIFVwZGF0ZSBpbnRlcnJ1cHQgZm9yIDFIeiBSVEMgKi8KKworCisjZGVmaW5lIFJUQ19NQVhfRlJFUQk4MTkyCisKKworI2VuZGlmIC8qIF9MSU5VWF9SVENfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYjE5ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oCkBAIC0wLDAgKzEsNjA3IEBACisjaWZuZGVmIF9fTElOVVhfUlRORVRMSU5LX0gKKyNkZWZpbmUgX19MSU5VWF9SVE5FVExJTktfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaWZfbGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FkZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZWlnaGJvdXIuaD4KKworLyogcnRuZXRsaW5rIGZhbWlsaWVzLiBWYWx1ZXMgdXAgdG8gMTI3IGFyZSByZXNlcnZlZCBmb3IgcmVhbCBhZGRyZXNzCisgKiBmYW1pbGllcywgdmFsdWVzIGFib3ZlIDEyOCBtYXkgYmUgdXNlZCBhcmJpdHJhcmlseS4KKyAqLworI2RlZmluZSBSVE5MX0ZBTUlMWV9JUE1SCQkxMjgKKyNkZWZpbmUgUlROTF9GQU1JTFlfSVA2TVIJCTEyOQorI2RlZmluZSBSVE5MX0ZBTUlMWV9NQVgJCQkxMjkKKworLyoqKioKKyAqCQlSb3V0aW5nL25laWdoYm91ciBkaXNjb3ZlcnkgbWVzc2FnZXMuCisgKioqKi8KKworLyogVHlwZXMgb2YgbWVzc2FnZXMgKi8KKworZW51bSB7CisJUlRNX0JBU0UJPSAxNiwKKyNkZWZpbmUgUlRNX0JBU0UJUlRNX0JBU0UKKworCVJUTV9ORVdMSU5LCT0gMTYsCisjZGVmaW5lIFJUTV9ORVdMSU5LCVJUTV9ORVdMSU5LCisJUlRNX0RFTExJTkssCisjZGVmaW5lIFJUTV9ERUxMSU5LCVJUTV9ERUxMSU5LCisJUlRNX0dFVExJTkssCisjZGVmaW5lIFJUTV9HRVRMSU5LCVJUTV9HRVRMSU5LCisJUlRNX1NFVExJTkssCisjZGVmaW5lIFJUTV9TRVRMSU5LCVJUTV9TRVRMSU5LCisKKwlSVE1fTkVXQUREUgk9IDIwLAorI2RlZmluZSBSVE1fTkVXQUREUglSVE1fTkVXQUREUgorCVJUTV9ERUxBRERSLAorI2RlZmluZSBSVE1fREVMQUREUglSVE1fREVMQUREUgorCVJUTV9HRVRBRERSLAorI2RlZmluZSBSVE1fR0VUQUREUglSVE1fR0VUQUREUgorCisJUlRNX05FV1JPVVRFCT0gMjQsCisjZGVmaW5lIFJUTV9ORVdST1VURQlSVE1fTkVXUk9VVEUKKwlSVE1fREVMUk9VVEUsCisjZGVmaW5lIFJUTV9ERUxST1VURQlSVE1fREVMUk9VVEUKKwlSVE1fR0VUUk9VVEUsCisjZGVmaW5lIFJUTV9HRVRST1VURQlSVE1fR0VUUk9VVEUKKworCVJUTV9ORVdORUlHSAk9IDI4LAorI2RlZmluZSBSVE1fTkVXTkVJR0gJUlRNX05FV05FSUdICisJUlRNX0RFTE5FSUdILAorI2RlZmluZSBSVE1fREVMTkVJR0gJUlRNX0RFTE5FSUdICisJUlRNX0dFVE5FSUdILAorI2RlZmluZSBSVE1fR0VUTkVJR0gJUlRNX0dFVE5FSUdICisKKwlSVE1fTkVXUlVMRQk9IDMyLAorI2RlZmluZSBSVE1fTkVXUlVMRQlSVE1fTkVXUlVMRQorCVJUTV9ERUxSVUxFLAorI2RlZmluZSBSVE1fREVMUlVMRQlSVE1fREVMUlVMRQorCVJUTV9HRVRSVUxFLAorI2RlZmluZSBSVE1fR0VUUlVMRQlSVE1fR0VUUlVMRQorCisJUlRNX05FV1FESVNDCT0gMzYsCisjZGVmaW5lIFJUTV9ORVdRRElTQwlSVE1fTkVXUURJU0MKKwlSVE1fREVMUURJU0MsCisjZGVmaW5lIFJUTV9ERUxRRElTQwlSVE1fREVMUURJU0MKKwlSVE1fR0VUUURJU0MsCisjZGVmaW5lIFJUTV9HRVRRRElTQwlSVE1fR0VUUURJU0MKKworCVJUTV9ORVdUQ0xBU1MJPSA0MCwKKyNkZWZpbmUgUlRNX05FV1RDTEFTUwlSVE1fTkVXVENMQVNTCisJUlRNX0RFTFRDTEFTUywKKyNkZWZpbmUgUlRNX0RFTFRDTEFTUwlSVE1fREVMVENMQVNTCisJUlRNX0dFVFRDTEFTUywKKyNkZWZpbmUgUlRNX0dFVFRDTEFTUwlSVE1fR0VUVENMQVNTCisKKwlSVE1fTkVXVEZJTFRFUgk9IDQ0LAorI2RlZmluZSBSVE1fTkVXVEZJTFRFUglSVE1fTkVXVEZJTFRFUgorCVJUTV9ERUxURklMVEVSLAorI2RlZmluZSBSVE1fREVMVEZJTFRFUglSVE1fREVMVEZJTFRFUgorCVJUTV9HRVRURklMVEVSLAorI2RlZmluZSBSVE1fR0VUVEZJTFRFUglSVE1fR0VUVEZJTFRFUgorCisJUlRNX05FV0FDVElPTgk9IDQ4LAorI2RlZmluZSBSVE1fTkVXQUNUSU9OICAgUlRNX05FV0FDVElPTgorCVJUTV9ERUxBQ1RJT04sCisjZGVmaW5lIFJUTV9ERUxBQ1RJT04gICBSVE1fREVMQUNUSU9OCisJUlRNX0dFVEFDVElPTiwKKyNkZWZpbmUgUlRNX0dFVEFDVElPTiAgIFJUTV9HRVRBQ1RJT04KKworCVJUTV9ORVdQUkVGSVgJPSA1MiwKKyNkZWZpbmUgUlRNX05FV1BSRUZJWAlSVE1fTkVXUFJFRklYCisKKwlSVE1fR0VUTVVMVElDQVNUID0gNTgsCisjZGVmaW5lIFJUTV9HRVRNVUxUSUNBU1QgUlRNX0dFVE1VTFRJQ0FTVAorCisJUlRNX0dFVEFOWUNBU1QJPSA2MiwKKyNkZWZpbmUgUlRNX0dFVEFOWUNBU1QJUlRNX0dFVEFOWUNBU1QKKworCVJUTV9ORVdORUlHSFRCTAk9IDY0LAorI2RlZmluZSBSVE1fTkVXTkVJR0hUQkwJUlRNX05FV05FSUdIVEJMCisJUlRNX0dFVE5FSUdIVEJMCT0gNjYsCisjZGVmaW5lIFJUTV9HRVRORUlHSFRCTAlSVE1fR0VUTkVJR0hUQkwKKwlSVE1fU0VUTkVJR0hUQkwsCisjZGVmaW5lIFJUTV9TRVRORUlHSFRCTAlSVE1fU0VUTkVJR0hUQkwKKworCVJUTV9ORVdORFVTRVJPUFQgPSA2OCwKKyNkZWZpbmUgUlRNX05FV05EVVNFUk9QVCBSVE1fTkVXTkRVU0VST1BUCisKKwlSVE1fTkVXQUREUkxBQkVMID0gNzIsCisjZGVmaW5lIFJUTV9ORVdBRERSTEFCRUwgUlRNX05FV0FERFJMQUJFTAorCVJUTV9ERUxBRERSTEFCRUwsCisjZGVmaW5lIFJUTV9ERUxBRERSTEFCRUwgUlRNX0RFTEFERFJMQUJFTAorCVJUTV9HRVRBRERSTEFCRUwsCisjZGVmaW5lIFJUTV9HRVRBRERSTEFCRUwgUlRNX0dFVEFERFJMQUJFTAorCisJUlRNX0dFVERDQiA9IDc4LAorI2RlZmluZSBSVE1fR0VURENCIFJUTV9HRVREQ0IKKwlSVE1fU0VURENCLAorI2RlZmluZSBSVE1fU0VURENCIFJUTV9TRVREQ0IKKworCV9fUlRNX01BWCwKKyNkZWZpbmUgUlRNX01BWAkJKCgoX19SVE1fTUFYICsgMykgJiB+MykgLSAxKQorfTsKKworI2RlZmluZSBSVE1fTlJfTVNHVFlQRVMJKFJUTV9NQVggKyAxIC0gUlRNX0JBU0UpCisjZGVmaW5lIFJUTV9OUl9GQU1JTElFUwkoUlRNX05SX01TR1RZUEVTID4+IDIpCisjZGVmaW5lIFJUTV9GQU0oY21kKQkoKChjbWQpIC0gUlRNX0JBU0UpID4+IDIpCisKKy8qIAorICAgR2VuZXJpYyBzdHJ1Y3R1cmUgZm9yIGVuY2Fwc3VsYXRpb24gb2Ygb3B0aW9uYWwgcm91dGUgaW5mb3JtYXRpb24uCisgICBJdCBpcyByZW1pbmlzY2VudCBvZiBzb2NrYWRkciwgYnV0IHdpdGggc2FfZmFtaWx5IHJlcGxhY2VkCisgICB3aXRoIGF0dHJpYnV0ZSB0eXBlLgorICovCisKK3N0cnVjdCBydGF0dHIgeworCXVuc2lnbmVkIHNob3J0CXJ0YV9sZW47CisJdW5zaWduZWQgc2hvcnQJcnRhX3R5cGU7Cit9OworCisvKiBNYWNyb3MgdG8gaGFuZGxlIHJ0YXR0cmlidXRlcyAqLworCisjZGVmaW5lIFJUQV9BTElHTlRPCTQKKyNkZWZpbmUgUlRBX0FMSUdOKGxlbikgKCAoKGxlbikrUlRBX0FMSUdOVE8tMSkgJiB+KFJUQV9BTElHTlRPLTEpICkKKyNkZWZpbmUgUlRBX09LKHJ0YSxsZW4pICgobGVuKSA+PSAoaW50KXNpemVvZihzdHJ1Y3QgcnRhdHRyKSAmJiBcCisJCQkgKHJ0YSktPnJ0YV9sZW4gPj0gc2l6ZW9mKHN0cnVjdCBydGF0dHIpICYmIFwKKwkJCSAocnRhKS0+cnRhX2xlbiA8PSAobGVuKSkKKyNkZWZpbmUgUlRBX05FWFQocnRhLGF0dHJsZW4pCSgoYXR0cmxlbikgLT0gUlRBX0FMSUdOKChydGEpLT5ydGFfbGVuKSwgXAorCQkJCSAoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopKHJ0YSkpICsgUlRBX0FMSUdOKChydGEpLT5ydGFfbGVuKSkpCisjZGVmaW5lIFJUQV9MRU5HVEgobGVuKQkoUlRBX0FMSUdOKHNpemVvZihzdHJ1Y3QgcnRhdHRyKSkgKyAobGVuKSkKKyNkZWZpbmUgUlRBX1NQQUNFKGxlbikJUlRBX0FMSUdOKFJUQV9MRU5HVEgobGVuKSkKKyNkZWZpbmUgUlRBX0RBVEEocnRhKSAgICgodm9pZCopKCgoY2hhciopKHJ0YSkpICsgUlRBX0xFTkdUSCgwKSkpCisjZGVmaW5lIFJUQV9QQVlMT0FEKHJ0YSkgKChpbnQpKChydGEpLT5ydGFfbGVuKSAtIFJUQV9MRU5HVEgoMCkpCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlEZWZpbml0aW9ucyB1c2VkIGluIHJvdXRpbmcgdGFibGUgYWRtaW5pc3RyYXRpb24uCisgKioqKi8KKworc3RydWN0IHJ0bXNnIHsKKwl1bnNpZ25lZCBjaGFyCQlydG1fZmFtaWx5OworCXVuc2lnbmVkIGNoYXIJCXJ0bV9kc3RfbGVuOworCXVuc2lnbmVkIGNoYXIJCXJ0bV9zcmNfbGVuOworCXVuc2lnbmVkIGNoYXIJCXJ0bV90b3M7CisKKwl1bnNpZ25lZCBjaGFyCQlydG1fdGFibGU7CS8qIFJvdXRpbmcgdGFibGUgaWQgKi8KKwl1bnNpZ25lZCBjaGFyCQlydG1fcHJvdG9jb2w7CS8qIFJvdXRpbmcgcHJvdG9jb2w7IHNlZSBiZWxvdwkqLworCXVuc2lnbmVkIGNoYXIJCXJ0bV9zY29wZTsJLyogU2VlIGJlbG93ICovCQorCXVuc2lnbmVkIGNoYXIJCXJ0bV90eXBlOwkvKiBTZWUgYmVsb3cJKi8KKworCXVuc2lnbmVkCQlydG1fZmxhZ3M7Cit9OworCisvKiBydG1fdHlwZSAqLworCitlbnVtIHsKKwlSVE5fVU5TUEVDLAorCVJUTl9VTklDQVNULAkJLyogR2F0ZXdheSBvciBkaXJlY3Qgcm91dGUJKi8KKwlSVE5fTE9DQUwsCQkvKiBBY2NlcHQgbG9jYWxseQkJKi8KKwlSVE5fQlJPQURDQVNULAkJLyogQWNjZXB0IGxvY2FsbHkgYXMgYnJvYWRjYXN0LAorCQkJCSAgIHNlbmQgYXMgYnJvYWRjYXN0ICovCisJUlROX0FOWUNBU1QsCQkvKiBBY2NlcHQgbG9jYWxseSBhcyBicm9hZGNhc3QsCisJCQkJICAgYnV0IHNlbmQgYXMgdW5pY2FzdCAqLworCVJUTl9NVUxUSUNBU1QsCQkvKiBNdWx0aWNhc3Qgcm91dGUJCSovCisJUlROX0JMQUNLSE9MRSwJCS8qIERyb3AJCQkJKi8KKwlSVE5fVU5SRUFDSEFCTEUsCS8qIERlc3RpbmF0aW9uIGlzIHVucmVhY2hhYmxlICAgKi8KKwlSVE5fUFJPSElCSVQsCQkvKiBBZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQJKi8KKwlSVE5fVEhST1csCQkvKiBOb3QgaW4gdGhpcyB0YWJsZQkJKi8KKwlSVE5fTkFULAkJLyogVHJhbnNsYXRlIHRoaXMgYWRkcmVzcwkqLworCVJUTl9YUkVTT0xWRSwJCS8qIFVzZSBleHRlcm5hbCByZXNvbHZlcgkqLworCV9fUlROX01BWAorfTsKKworI2RlZmluZSBSVE5fTUFYIChfX1JUTl9NQVggLSAxKQorCisKKy8qIHJ0bV9wcm90b2NvbCAqLworCisjZGVmaW5lIFJUUFJPVF9VTlNQRUMJMAorI2RlZmluZSBSVFBST1RfUkVESVJFQ1QJMQkvKiBSb3V0ZSBpbnN0YWxsZWQgYnkgSUNNUCByZWRpcmVjdHM7CisJCQkJICAgbm90IHVzZWQgYnkgY3VycmVudCBJUHY0ICovCisjZGVmaW5lIFJUUFJPVF9LRVJORUwJMgkvKiBSb3V0ZSBpbnN0YWxsZWQgYnkga2VybmVsCQkqLworI2RlZmluZSBSVFBST1RfQk9PVAkzCS8qIFJvdXRlIGluc3RhbGxlZCBkdXJpbmcgYm9vdAkJKi8KKyNkZWZpbmUgUlRQUk9UX1NUQVRJQwk0CS8qIFJvdXRlIGluc3RhbGxlZCBieSBhZG1pbmlzdHJhdG9yCSovCisKKy8qIFZhbHVlcyBvZiBwcm90b2NvbCA+PSBSVFBST1RfU1RBVElDIGFyZSBub3QgaW50ZXJwcmV0ZWQgYnkga2VybmVsOworICAgdGhleSBhcmUganVzdCBwYXNzZWQgZnJvbSB1c2VyIGFuZCBiYWNrIGFzIGlzLgorICAgSXQgd2lsbCBiZSB1c2VkIGJ5IGh5cG90aGV0aWNhbCBtdWx0aXBsZSByb3V0aW5nIGRhZW1vbnMuCisgICBOb3RlIHRoYXQgcHJvdG9jb2wgdmFsdWVzIHNob3VsZCBiZSBzdGFuZGFyZGl6ZWQgaW4gb3JkZXIgdG8KKyAgIGF2b2lkIGNvbmZsaWN0cy4KKyAqLworCisjZGVmaW5lIFJUUFJPVF9HQVRFRAk4CS8qIEFwcGFyZW50bHksIEdhdGVEICovCisjZGVmaW5lIFJUUFJPVF9SQQk5CS8qIFJESVNDL05EIHJvdXRlciBhZHZlcnRpc2VtZW50cyAqLworI2RlZmluZSBSVFBST1RfTVJUCTEwCS8qIE1lcml0IE1SVCAqLworI2RlZmluZSBSVFBST1RfWkVCUkEJMTEJLyogWmVicmEgKi8KKyNkZWZpbmUgUlRQUk9UX0JJUkQJMTIJLyogQklSRCAqLworI2RlZmluZSBSVFBST1RfRE5ST1VURUQJMTMJLyogREVDbmV0IHJvdXRpbmcgZGFlbW9uICovCisjZGVmaW5lIFJUUFJPVF9YT1JQCTE0CS8qIFhPUlAgKi8KKyNkZWZpbmUgUlRQUk9UX05USwkxNQkvKiBOZXRzdWt1a3UgKi8KKyNkZWZpbmUgUlRQUk9UX0RIQ1AJMTYgICAgICAvKiBESENQIGNsaWVudCAqLworCisvKiBydG1fc2NvcGUKKworICAgUmVhbGx5IGl0IGlzIG5vdCBzY29wZSwgYnV0IHNvcnQgb2YgZGlzdGFuY2UgdG8gdGhlIGRlc3RpbmF0aW9uLgorICAgTk9XSEVSRSBhcmUgcmVzZXJ2ZWQgZm9yIG5vdCBleGlzdGluZyBkZXN0aW5hdGlvbnMsIEhPU1QgaXMgb3VyCisgICBsb2NhbCBhZGRyZXNzZXMsIExJTksgYXJlIGRlc3RpbmF0aW9ucywgbG9jYXRlZCBvbiBkaXJlY3RseSBhdHRhY2hlZAorICAgbGluayBhbmQgVU5JVkVSU0UgaXMgZXZlcnl3aGVyZSBpbiB0aGUgVW5pdmVyc2UuCisKKyAgIEludGVybWVkaWF0ZSB2YWx1ZXMgYXJlIGFsc28gcG9zc2libGUgZi5lLiBpbnRlcmlvciByb3V0ZXMKKyAgIGNvdWxkIGJlIGFzc2lnbmVkIGEgdmFsdWUgYmV0d2VlbiBVTklWRVJTRSBhbmQgTElOSy4KKyovCisKK2VudW0gcnRfc2NvcGVfdCB7CisJUlRfU0NPUEVfVU5JVkVSU0U9MCwKKy8qIFVzZXIgZGVmaW5lZCB2YWx1ZXMgICovCisJUlRfU0NPUEVfU0lURT0yMDAsCisJUlRfU0NPUEVfTElOSz0yNTMsCisJUlRfU0NPUEVfSE9TVD0yNTQsCisJUlRfU0NPUEVfTk9XSEVSRT0yNTUKK307CisKKy8qIHJ0bV9mbGFncyAqLworCisjZGVmaW5lIFJUTV9GX05PVElGWQkJMHgxMDAJLyogTm90aWZ5IHVzZXIgb2Ygcm91dGUgY2hhbmdlCSovCisjZGVmaW5lIFJUTV9GX0NMT05FRAkJMHgyMDAJLyogVGhpcyByb3V0ZSBpcyBjbG9uZWQJCSovCisjZGVmaW5lIFJUTV9GX0VRVUFMSVpFCQkweDQwMAkvKiBNdWx0aXBhdGggZXF1YWxpemVyOiBOSQkqLworI2RlZmluZSBSVE1fRl9QUkVGSVgJCTB4ODAwCS8qIFByZWZpeCBhZGRyZXNzZXMJCSovCisKKy8qIFJlc2VydmVkIHRhYmxlIGlkZW50aWZpZXJzICovCisKK2VudW0gcnRfY2xhc3NfdCB7CisJUlRfVEFCTEVfVU5TUEVDPTAsCisvKiBVc2VyIGRlZmluZWQgdmFsdWVzICovCisJUlRfVEFCTEVfQ09NUEFUPTI1MiwKKwlSVF9UQUJMRV9ERUZBVUxUPTI1MywKKwlSVF9UQUJMRV9NQUlOPTI1NCwKKwlSVF9UQUJMRV9MT0NBTD0yNTUsCisJUlRfVEFCTEVfTUFYPTB4RkZGRkZGRkYKK307CisKKworLyogUm91dGluZyBtZXNzYWdlIGF0dHJpYnV0ZXMgKi8KKworZW51bSBydGF0dHJfdHlwZV90IHsKKwlSVEFfVU5TUEVDLAorCVJUQV9EU1QsCisJUlRBX1NSQywKKwlSVEFfSUlGLAorCVJUQV9PSUYsCisJUlRBX0dBVEVXQVksCisJUlRBX1BSSU9SSVRZLAorCVJUQV9QUkVGU1JDLAorCVJUQV9NRVRSSUNTLAorCVJUQV9NVUxUSVBBVEgsCisJUlRBX1BST1RPSU5GTywgLyogbm8gbG9uZ2VyIHVzZWQgKi8KKwlSVEFfRkxPVywKKwlSVEFfQ0FDSEVJTkZPLAorCVJUQV9TRVNTSU9OLCAvKiBubyBsb25nZXIgdXNlZCAqLworCVJUQV9NUF9BTEdPLCAvKiBubyBsb25nZXIgdXNlZCAqLworCVJUQV9UQUJMRSwKKwlSVEFfTUFSSywKKwlfX1JUQV9NQVgKK307CisKKyNkZWZpbmUgUlRBX01BWCAoX19SVEFfTUFYIC0gMSkKKworI2RlZmluZSBSVE1fUlRBKHIpICAoKHN0cnVjdCBydGF0dHIqKSgoKGNoYXIqKShyKSkgKyBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IHJ0bXNnKSkpKQorI2RlZmluZSBSVE1fUEFZTE9BRChuKSBOTE1TR19QQVlMT0FEKG4sc2l6ZW9mKHN0cnVjdCBydG1zZykpCisKKy8qIFJUTV9NVUxUSVBBVEggLS0tIGFycmF5IG9mIHN0cnVjdCBydG5leHRob3AuCisgKgorICogInN0cnVjdCBydG5leHRob3AiIGRlc2NyaWJlcyBhbGwgbmVjZXNzYXJ5IG5leHRob3AgaW5mb3JtYXRpb24sCisgKiBpLmUuIHBhcmFtZXRlcnMgb2YgcGF0aCB0byBhIGRlc3RpbmF0aW9uIHZpYSB0aGlzIG5leHRob3AuCisgKgorICogQXQgdGhlIG1vbWVudCBpdCBpcyBpbXBvc3NpYmxlIHRvIHNldCBkaWZmZXJlbnQgcHJlZnNyYywgbXR1LCB3aW5kb3cKKyAqIGFuZCBydHQgZm9yIGRpZmZlcmVudCBwYXRocyBmcm9tIG11bHRpcGF0aC4KKyAqLworCitzdHJ1Y3QgcnRuZXh0aG9wIHsKKwl1bnNpZ25lZCBzaG9ydAkJcnRuaF9sZW47CisJdW5zaWduZWQgY2hhcgkJcnRuaF9mbGFnczsKKwl1bnNpZ25lZCBjaGFyCQlydG5oX2hvcHM7CisJaW50CQkJcnRuaF9pZmluZGV4OworfTsKKworLyogcnRuaF9mbGFncyAqLworCisjZGVmaW5lIFJUTkhfRl9ERUFECQkxCS8qIE5leHRob3AgaXMgZGVhZCAodXNlZCBieSBtdWx0aXBhdGgpCSovCisjZGVmaW5lIFJUTkhfRl9QRVJWQVNJVkUJMgkvKiBEbyByZWN1cnNpdmUgZ2F0ZXdheSBsb29rdXAJKi8KKyNkZWZpbmUgUlROSF9GX09OTElOSwkJNAkvKiBHYXRld2F5IGlzIGZvcmNlZCBvbiBsaW5rCSovCisKKy8qIE1hY3JvcyB0byBoYW5kbGUgaGV4dGhvcHMgKi8KKworI2RlZmluZSBSVE5IX0FMSUdOVE8JNAorI2RlZmluZSBSVE5IX0FMSUdOKGxlbikgKCAoKGxlbikrUlROSF9BTElHTlRPLTEpICYgfihSVE5IX0FMSUdOVE8tMSkgKQorI2RlZmluZSBSVE5IX09LKHJ0bmgsbGVuKSAoKHJ0bmgpLT5ydG5oX2xlbiA+PSBzaXplb2Yoc3RydWN0IHJ0bmV4dGhvcCkgJiYgXAorCQkJICAgKChpbnQpKHJ0bmgpLT5ydG5oX2xlbikgPD0gKGxlbikpCisjZGVmaW5lIFJUTkhfTkVYVChydG5oKQkoKHN0cnVjdCBydG5leHRob3AqKSgoKGNoYXIqKShydG5oKSkgKyBSVE5IX0FMSUdOKChydG5oKS0+cnRuaF9sZW4pKSkKKyNkZWZpbmUgUlROSF9MRU5HVEgobGVuKSAoUlROSF9BTElHTihzaXplb2Yoc3RydWN0IHJ0bmV4dGhvcCkpICsgKGxlbikpCisjZGVmaW5lIFJUTkhfU1BBQ0UobGVuKQlSVE5IX0FMSUdOKFJUTkhfTEVOR1RIKGxlbikpCisjZGVmaW5lIFJUTkhfREFUQShydG5oKSAgICgoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopKHJ0bmgpKSArIFJUTkhfTEVOR1RIKDApKSkKKworLyogUlRNX0NBQ0hFSU5GTyAqLworCitzdHJ1Y3QgcnRhX2NhY2hlaW5mbyB7CisJX191MzIJcnRhX2NsbnRyZWY7CisJX191MzIJcnRhX2xhc3R1c2U7CisJX19zMzIJcnRhX2V4cGlyZXM7CisJX191MzIJcnRhX2Vycm9yOworCV9fdTMyCXJ0YV91c2VkOworCisjZGVmaW5lIFJUTkVUTElOS19IQVZFX1BFRVJJTkZPIDEKKwlfX3UzMglydGFfaWQ7CisJX191MzIJcnRhX3RzOworCV9fdTMyCXJ0YV90c2FnZTsKK307CisKKy8qIFJUTV9NRVRSSUNTIC0tLSBhcnJheSBvZiBzdHJ1Y3QgcnRhdHRyIHdpdGggdHlwZXMgb2YgUlRBWF8qICovCisKK2VudW0geworCVJUQVhfVU5TUEVDLAorI2RlZmluZSBSVEFYX1VOU1BFQyBSVEFYX1VOU1BFQworCVJUQVhfTE9DSywKKyNkZWZpbmUgUlRBWF9MT0NLIFJUQVhfTE9DSworCVJUQVhfTVRVLAorI2RlZmluZSBSVEFYX01UVSBSVEFYX01UVQorCVJUQVhfV0lORE9XLAorI2RlZmluZSBSVEFYX1dJTkRPVyBSVEFYX1dJTkRPVworCVJUQVhfUlRULAorI2RlZmluZSBSVEFYX1JUVCBSVEFYX1JUVAorCVJUQVhfUlRUVkFSLAorI2RlZmluZSBSVEFYX1JUVFZBUiBSVEFYX1JUVFZBUgorCVJUQVhfU1NUSFJFU0gsCisjZGVmaW5lIFJUQVhfU1NUSFJFU0ggUlRBWF9TU1RIUkVTSAorCVJUQVhfQ1dORCwKKyNkZWZpbmUgUlRBWF9DV05EIFJUQVhfQ1dORAorCVJUQVhfQURWTVNTLAorI2RlZmluZSBSVEFYX0FEVk1TUyBSVEFYX0FEVk1TUworCVJUQVhfUkVPUkRFUklORywKKyNkZWZpbmUgUlRBWF9SRU9SREVSSU5HIFJUQVhfUkVPUkRFUklORworCVJUQVhfSE9QTElNSVQsCisjZGVmaW5lIFJUQVhfSE9QTElNSVQgUlRBWF9IT1BMSU1JVAorCVJUQVhfSU5JVENXTkQsCisjZGVmaW5lIFJUQVhfSU5JVENXTkQgUlRBWF9JTklUQ1dORAorCVJUQVhfRkVBVFVSRVMsCisjZGVmaW5lIFJUQVhfRkVBVFVSRVMgUlRBWF9GRUFUVVJFUworCVJUQVhfUlRPX01JTiwKKyNkZWZpbmUgUlRBWF9SVE9fTUlOIFJUQVhfUlRPX01JTgorCVJUQVhfSU5JVFJXTkQsCisjZGVmaW5lIFJUQVhfSU5JVFJXTkQgUlRBWF9JTklUUldORAorCV9fUlRBWF9NQVgKK307CisKKyNkZWZpbmUgUlRBWF9NQVggKF9fUlRBWF9NQVggLSAxKQorCisjZGVmaW5lIFJUQVhfRkVBVFVSRV9FQ04JMHgwMDAwMDAwMQorI2RlZmluZSBSVEFYX0ZFQVRVUkVfU0FDSwkweDAwMDAwMDAyCisjZGVmaW5lIFJUQVhfRkVBVFVSRV9USU1FU1RBTVAJMHgwMDAwMDAwNAorI2RlZmluZSBSVEFYX0ZFQVRVUkVfQUxMRlJBRwkweDAwMDAwMDA4CisKK3N0cnVjdCBydGFfc2Vzc2lvbiB7CisJX191OAlwcm90bzsKKwlfX3U4CXBhZDE7CisJX191MTYJcGFkMjsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTE2CXNwb3J0OworCQkJX191MTYJZHBvcnQ7CisJCX0gcG9ydHM7CisKKwkJc3RydWN0IHsKKwkJCV9fdTgJdHlwZTsKKwkJCV9fdTgJY29kZTsKKwkJCV9fdTE2CWlkZW50OworCQl9IGljbXB0OworCisJCV9fdTMyCQlzcGk7CisJfSB1OworfTsKKworLyoqKioKKyAqCQlHZW5lcmFsIGZvcm0gb2YgYWRkcmVzcyBmYW1pbHkgZGVwZW5kZW50IG1lc3NhZ2UuCisgKioqKi8KKworc3RydWN0IHJ0Z2VubXNnIHsKKwl1bnNpZ25lZCBjaGFyCQlydGdlbl9mYW1pbHk7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlMaW5rIGxheWVyIHNwZWNpZmljIG1lc3NhZ2VzLgorICoqKiovCisKKy8qIHN0cnVjdCBpZmluZm9tc2cKKyAqIHBhc3NlcyBsaW5rIGxldmVsIHNwZWNpZmljIGluZm9ybWF0aW9uLCBub3QgZGVwZW5kZW50CisgKiBvbiBuZXR3b3JrIHByb3RvY29sLgorICovCisKK3N0cnVjdCBpZmluZm9tc2cgeworCXVuc2lnbmVkIGNoYXIJaWZpX2ZhbWlseTsKKwl1bnNpZ25lZCBjaGFyCV9faWZpX3BhZDsKKwl1bnNpZ25lZCBzaG9ydAlpZmlfdHlwZTsJCS8qIEFSUEhSRF8qICovCisJaW50CQlpZmlfaW5kZXg7CQkvKiBMaW5rIGluZGV4CSovCisJdW5zaWduZWQJaWZpX2ZsYWdzOwkJLyogSUZGXyogZmxhZ3MJKi8KKwl1bnNpZ25lZAlpZmlfY2hhbmdlOwkJLyogSUZGXyogY2hhbmdlIG1hc2sgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCXByZWZpeCBpbmZvcm1hdGlvbiAKKyAqKioqLworCitzdHJ1Y3QgcHJlZml4bXNnIHsKKwl1bnNpZ25lZCBjaGFyCXByZWZpeF9mYW1pbHk7CisJdW5zaWduZWQgY2hhcglwcmVmaXhfcGFkMTsKKwl1bnNpZ25lZCBzaG9ydAlwcmVmaXhfcGFkMjsKKwlpbnQJCXByZWZpeF9pZmluZGV4OworCXVuc2lnbmVkIGNoYXIJcHJlZml4X3R5cGU7CisJdW5zaWduZWQgY2hhcglwcmVmaXhfbGVuOworCXVuc2lnbmVkIGNoYXIJcHJlZml4X2ZsYWdzOworCXVuc2lnbmVkIGNoYXIJcHJlZml4X3BhZDM7Cit9OworCitlbnVtIAoreworCVBSRUZJWF9VTlNQRUMsCisJUFJFRklYX0FERFJFU1MsCisJUFJFRklYX0NBQ0hFSU5GTywKKwlfX1BSRUZJWF9NQVgKK307CisKKyNkZWZpbmUgUFJFRklYX01BWAkoX19QUkVGSVhfTUFYIC0gMSkKKworc3RydWN0IHByZWZpeF9jYWNoZWluZm8geworCV9fdTMyCXByZWZlcnJlZF90aW1lOworCV9fdTMyCXZhbGlkX3RpbWU7Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCVRyYWZmaWMgY29udHJvbCBtZXNzYWdlcy4KKyAqKioqLworCitzdHJ1Y3QgdGNtc2cgeworCXVuc2lnbmVkIGNoYXIJdGNtX2ZhbWlseTsKKwl1bnNpZ25lZCBjaGFyCXRjbV9fcGFkMTsKKwl1bnNpZ25lZCBzaG9ydAl0Y21fX3BhZDI7CisJaW50CQl0Y21faWZpbmRleDsKKwlfX3UzMgkJdGNtX2hhbmRsZTsKKwlfX3UzMgkJdGNtX3BhcmVudDsKKwlfX3UzMgkJdGNtX2luZm87Cit9OworCitlbnVtIHsKKwlUQ0FfVU5TUEVDLAorCVRDQV9LSU5ELAorCVRDQV9PUFRJT05TLAorCVRDQV9TVEFUUywKKwlUQ0FfWFNUQVRTLAorCVRDQV9SQVRFLAorCVRDQV9GQ05ULAorCVRDQV9TVEFUUzIsCisJVENBX1NUQUIsCisJX19UQ0FfTUFYCit9OworCisjZGVmaW5lIFRDQV9NQVggKF9fVENBX01BWCAtIDEpCisKKyNkZWZpbmUgVENBX1JUQShyKSAgKChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKikocikpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCB0Y21zZykpKSkKKyNkZWZpbmUgVENBX1BBWUxPQUQobikgTkxNU0dfUEFZTE9BRChuLHNpemVvZihzdHJ1Y3QgdGNtc2cpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlOZWlnaGJvciBEaXNjb3ZlcnkgdXNlcmxhbmQgb3B0aW9ucworICoqKiovCisKK3N0cnVjdCBuZHVzZXJvcHRtc2cgeworCXVuc2lnbmVkIGNoYXIJbmR1c2Vyb3B0X2ZhbWlseTsKKwl1bnNpZ25lZCBjaGFyCW5kdXNlcm9wdF9wYWQxOworCXVuc2lnbmVkIHNob3J0CW5kdXNlcm9wdF9vcHRzX2xlbjsJLyogVG90YWwgbGVuZ3RoIG9mIG9wdGlvbnMgKi8KKwlpbnQJCW5kdXNlcm9wdF9pZmluZGV4OworCV9fdTgJCW5kdXNlcm9wdF9pY21wX3R5cGU7CisJX191OAkJbmR1c2Vyb3B0X2ljbXBfY29kZTsKKwl1bnNpZ25lZCBzaG9ydAluZHVzZXJvcHRfcGFkMjsKKwl1bnNpZ25lZCBpbnQJbmR1c2Vyb3B0X3BhZDM7CisJLyogRm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgTkQgb3B0aW9ucyAqLworfTsKKworZW51bSB7CisJTkRVU0VST1BUX1VOU1BFQywKKwlORFVTRVJPUFRfU1JDQUREUiwKKwlfX05EVVNFUk9QVF9NQVgKK307CisKKyNkZWZpbmUgTkRVU0VST1BUX01BWAkoX19ORFVTRVJPUFRfTUFYIC0gMSkKKworLyogUlRuZXRsaW5rIG11bHRpY2FzdCBncm91cHMgLSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgdXNlcnNwYWNlICovCisjZGVmaW5lIFJUTUdSUF9MSU5LCQkxCisjZGVmaW5lIFJUTUdSUF9OT1RJRlkJCTIKKyNkZWZpbmUgUlRNR1JQX05FSUdICQk0CisjZGVmaW5lIFJUTUdSUF9UQwkJOAorCisjZGVmaW5lIFJUTUdSUF9JUFY0X0lGQUREUgkweDEwCisjZGVmaW5lIFJUTUdSUF9JUFY0X01ST1VURQkweDIwCisjZGVmaW5lIFJUTUdSUF9JUFY0X1JPVVRFCTB4NDAKKyNkZWZpbmUgUlRNR1JQX0lQVjRfUlVMRQkweDgwCisKKyNkZWZpbmUgUlRNR1JQX0lQVjZfSUZBRERSCTB4MTAwCisjZGVmaW5lIFJUTUdSUF9JUFY2X01ST1VURQkweDIwMAorI2RlZmluZSBSVE1HUlBfSVBWNl9ST1VURQkweDQwMAorI2RlZmluZSBSVE1HUlBfSVBWNl9JRklORk8JMHg4MDAKKworI2RlZmluZSBSVE1HUlBfREVDbmV0X0lGQUREUiAgICAweDEwMDAKKyNkZWZpbmUgUlRNR1JQX0RFQ25ldF9ST1VURSAgICAgMHg0MDAwCisKKyNkZWZpbmUgUlRNR1JQX0lQVjZfUFJFRklYCTB4MjAwMDAKKworLyogUlRuZXRsaW5rIG11bHRpY2FzdCBncm91cHMgKi8KK2VudW0gcnRuZXRsaW5rX2dyb3VwcyB7CisJUlROTEdSUF9OT05FLAorI2RlZmluZSBSVE5MR1JQX05PTkUJCVJUTkxHUlBfTk9ORQorCVJUTkxHUlBfTElOSywKKyNkZWZpbmUgUlROTEdSUF9MSU5LCQlSVE5MR1JQX0xJTksKKwlSVE5MR1JQX05PVElGWSwKKyNkZWZpbmUgUlROTEdSUF9OT1RJRlkJCVJUTkxHUlBfTk9USUZZCisJUlROTEdSUF9ORUlHSCwKKyNkZWZpbmUgUlROTEdSUF9ORUlHSAkJUlROTEdSUF9ORUlHSAorCVJUTkxHUlBfVEMsCisjZGVmaW5lIFJUTkxHUlBfVEMJCVJUTkxHUlBfVEMKKwlSVE5MR1JQX0lQVjRfSUZBRERSLAorI2RlZmluZSBSVE5MR1JQX0lQVjRfSUZBRERSCVJUTkxHUlBfSVBWNF9JRkFERFIKKwlSVE5MR1JQX0lQVjRfTVJPVVRFLAorI2RlZmluZQlSVE5MR1JQX0lQVjRfTVJPVVRFCVJUTkxHUlBfSVBWNF9NUk9VVEUKKwlSVE5MR1JQX0lQVjRfUk9VVEUsCisjZGVmaW5lIFJUTkxHUlBfSVBWNF9ST1VURQlSVE5MR1JQX0lQVjRfUk9VVEUKKwlSVE5MR1JQX0lQVjRfUlVMRSwKKyNkZWZpbmUgUlROTEdSUF9JUFY0X1JVTEUJUlROTEdSUF9JUFY0X1JVTEUKKwlSVE5MR1JQX0lQVjZfSUZBRERSLAorI2RlZmluZSBSVE5MR1JQX0lQVjZfSUZBRERSCVJUTkxHUlBfSVBWNl9JRkFERFIKKwlSVE5MR1JQX0lQVjZfTVJPVVRFLAorI2RlZmluZSBSVE5MR1JQX0lQVjZfTVJPVVRFCVJUTkxHUlBfSVBWNl9NUk9VVEUKKwlSVE5MR1JQX0lQVjZfUk9VVEUsCisjZGVmaW5lIFJUTkxHUlBfSVBWNl9ST1VURQlSVE5MR1JQX0lQVjZfUk9VVEUKKwlSVE5MR1JQX0lQVjZfSUZJTkZPLAorI2RlZmluZSBSVE5MR1JQX0lQVjZfSUZJTkZPCVJUTkxHUlBfSVBWNl9JRklORk8KKwlSVE5MR1JQX0RFQ25ldF9JRkFERFIsCisjZGVmaW5lIFJUTkxHUlBfREVDbmV0X0lGQUREUglSVE5MR1JQX0RFQ25ldF9JRkFERFIKKwlSVE5MR1JQX05PUDIsCisJUlROTEdSUF9ERUNuZXRfUk9VVEUsCisjZGVmaW5lIFJUTkxHUlBfREVDbmV0X1JPVVRFCVJUTkxHUlBfREVDbmV0X1JPVVRFCisJUlROTEdSUF9ERUNuZXRfUlVMRSwKKyNkZWZpbmUgUlROTEdSUF9ERUNuZXRfUlVMRQlSVE5MR1JQX0RFQ25ldF9SVUxFCisJUlROTEdSUF9OT1A0LAorCVJUTkxHUlBfSVBWNl9QUkVGSVgsCisjZGVmaW5lIFJUTkxHUlBfSVBWNl9QUkVGSVgJUlROTEdSUF9JUFY2X1BSRUZJWAorCVJUTkxHUlBfSVBWNl9SVUxFLAorI2RlZmluZSBSVE5MR1JQX0lQVjZfUlVMRQlSVE5MR1JQX0lQVjZfUlVMRQorCVJUTkxHUlBfTkRfVVNFUk9QVCwKKyNkZWZpbmUgUlROTEdSUF9ORF9VU0VST1BUCVJUTkxHUlBfTkRfVVNFUk9QVAorCVJUTkxHUlBfUEhPTkVUX0lGQUREUiwKKyNkZWZpbmUgUlROTEdSUF9QSE9ORVRfSUZBRERSCVJUTkxHUlBfUEhPTkVUX0lGQUREUgorCVJUTkxHUlBfUEhPTkVUX1JPVVRFLAorI2RlZmluZSBSVE5MR1JQX1BIT05FVF9ST1VURQlSVE5MR1JQX1BIT05FVF9ST1VURQorCVJUTkxHUlBfRENCLAorI2RlZmluZSBSVE5MR1JQX0RDQgkJUlROTEdSUF9EQ0IKKwlfX1JUTkxHUlBfTUFYCit9OworI2RlZmluZSBSVE5MR1JQX01BWAkoX19SVE5MR1JQX01BWCAtIDEpCisKKy8qIFRDIGFjdGlvbiBwaWVjZSAqLworc3RydWN0IHRjYW1zZyB7CisJdW5zaWduZWQgY2hhcgl0Y2FfZmFtaWx5OworCXVuc2lnbmVkIGNoYXIJdGNhX19wYWQxOworCXVuc2lnbmVkIHNob3J0CXRjYV9fcGFkMjsKK307CisjZGVmaW5lIFRBX1JUQShyKSAgKChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKikocikpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCB0Y2Ftc2cpKSkpCisjZGVmaW5lIFRBX1BBWUxPQUQobikgTkxNU0dfUEFZTE9BRChuLHNpemVvZihzdHJ1Y3QgdGNhbXNnKSkKKyNkZWZpbmUgVENBX0FDVF9UQUIgMSAvKiBhdHRyIHR5cGUgbXVzdCBiZSA+PTEgKi8JCisjZGVmaW5lIFRDQUFfTUFYIDEKKworLyogRW5kIG9mIGluZm9ybWF0aW9uIGV4cG9ydGVkIHRvIHVzZXIgbGV2ZWwgKi8KKworCisKKyNlbmRpZgkvKiBfX0xJTlVYX1JUTkVUTElOS19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NjYy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjdjYzAzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zY2MuaApAQCAtMCwwICsxLDE3MiBAQAorLyogJElkOiBzY2MuaCx2IDEuMjkgMTk5Ny8wNC8wMiAxNDo1Njo0NSBqcmV1dGVyIEV4cCBqcmV1dGVyICQgKi8KKworI2lmbmRlZglfU0NDX0gKKyNkZWZpbmUJX1NDQ19ICisKKworLyogc2VsZWN0aW9uIG9mIGhhcmR3YXJlIHR5cGVzICovCisKKyNkZWZpbmUgUEEwSFpQCQkweDAwCS8qIGhhcmR3YXJlIHR5cGUgZm9yIFBBMEhaUCBTQ0MgY2FyZCBhbmQgY29tcGF0aWJsZSAqLworI2RlZmluZSBFQUdMRQkJMHgwMSAgICAvKiBoYXJkd2FyZSB0eXBlIGZvciBFQUdMRSBjYXJkICovCisjZGVmaW5lIFBDMTAwCQkweDAyCS8qIGhhcmR3YXJlIHR5cGUgZm9yIFBDMTAwIGNhcmQgKi8KKyNkZWZpbmUgUFJJTVVTCQkweDA0CS8qIGhhcmR3YXJlIHR5cGUgZm9yIFBSSU1VUy1QQyAoREc5QkwpIGNhcmQgKi8KKyNkZWZpbmUgRFJTSQkJMHgwOAkvKiBoYXJkd2FyZSB0eXBlIGZvciBEUlNJIFBDKlBhY2tldCBjYXJkICovCisjZGVmaW5lIEJBWUNPTQkJMHgxMAkvKiBoYXJkd2FyZSB0eXBlIGZvciBCYXlDb20gKFUpU0NDICovCisKKy8qIERFViBpb2N0bCgpIGNvbW1hbmRzICovCisKK2VudW0gU0NDX2lvY3RsX2NtZHMgeworCVNJT0NTQ0NSRVNFUlZFRCA9IFNJT0NERVZQUklWQVRFLAorCVNJT0NTQ0NDRkcsCisJU0lPQ1NDQ0lOSSwKKwlTSU9DU0NDQ0hBTklOSSwKKwlTSU9DU0NDU01FTSwKKwlTSU9DU0NDR0tJU1MsCisJU0lPQ1NDQ1NLSVNTLAorCVNJT0NTQ0NHU1RBVCwKKwlTSU9DU0NDQ0FMCit9OworCisvKiBEZXZpY2UgcGFyYW1ldGVyIGNvbnRyb2wgKGZyb20gV0FNUEVTKSAqLworCitlbnVtIEwxX3BhcmFtcyB7CisJUEFSQU1fREFUQSwKKwlQQVJBTV9UWERFTEFZLAorCVBBUkFNX1BFUlNJU1QsCisJUEFSQU1fU0xPVFRJTUUsCisJUEFSQU1fVFhUQUlMLAorCVBBUkFNX0ZVTExEVVAsCisJUEFSQU1fU09GVERDRCwJCS8qIHdhczogUEFSQU1fSFcgKi8KKwlQQVJBTV9NVVRFLAkJLyogPz8/ICovCisJUEFSQU1fRFRSLAorCVBBUkFNX1JUUywKKwlQQVJBTV9TUEVFRCwKKwlQQVJBTV9FTkRERUxBWSwJCS8qID8/PyAqLworCVBBUkFNX0dST1VQLAorCVBBUkFNX0lETEUsCisJUEFSQU1fTUlOLAorCVBBUkFNX01BWEtFWSwKKwlQQVJBTV9XQUlULAorCVBBUkFNX01BWERFRkVSLAorCVBBUkFNX1RYLAorCVBBUkFNX0hXRVZFTlQgPSAzMSwKKwlQQVJBTV9SRVRVUk4gPSAyNTUJLyogcmVzZXQga2lzcyBtb2RlICovCit9OworCisvKiBmdWxsZHVwIHBhcmFtZXRlciAqLworCitlbnVtIEZVTExEVVBfbW9kZXMgeworCUtJU1NfRFVQTEVYX0hBTEYsCS8qIG5vcm1hbCBDU01BIG9wZXJhdGlvbiAqLworCUtJU1NfRFVQTEVYX0ZVTEwsCS8qIGZ1bGxkdXBsZXgsIGtleSBkb3duIHRyeCBhZnRlciB0cmFuc21pc3Npb24gKi8KKwlLSVNTX0RVUExFWF9MSU5LLAkvKiBmdWxsZHVwbGV4LCBrZXkgZG93biB0cnggYWZ0ZXIgJ2lkbGV0aW1lJyBzZWMgKi8KKwlLSVNTX0RVUExFWF9PUFRJTUEJLyogZnVsbGR1cGxleCwgbGV0IHRoZSBwcm90b2NvbCBsYXllciBjb250cm9sIHRoZSBodyAqLworfTsKKworLyogbWlzYy4gcGFyYW1ldGVycyAqLworCisjZGVmaW5lIFRJTUVSX09GRgk2NTUzNVUJLyogdG8gc3dpdGNoIG9mZiB0aW1lcnMgKi8KKyNkZWZpbmUgTk9fU1VDSF9QQVJBTQk2NTUzNFUJLyogcGFyYW0gbm90IGltcGxlbWVudGVkICovCisKKy8qIEhXRVZFTlQgcGFyYW1ldGVyICovCisKK2VudW0gSFdFVkVOVF9vcHRzIHsKKwlIV0VWX0RDRF9PTiwKKwlIV0VWX0RDRF9PRkYsCisJSFdFVl9BTExfU0VOVAorfTsKKworLyogY2hhbm5lbCBncm91cGluZyAqLworCisjZGVmaW5lIFJYR1JPVVAJCTAxMDAJLyogaWYgc2V0LCBvbmx5IHR4IHdoZW4gYWxsIGNoYW5uZWxzIGNsZWFyICovCisjZGVmaW5lIFRYR1JPVVAJCTAyMDAJLyogaWYgc2V0LCBkb24ndCB0cmFuc21pdCBzaW11bHRhbmVvdXNseSAqLworCisvKiBUeC9SeCBjbG9jayBzb3VyY2VzICovCisKK2VudW0gQ0xPQ0tfc291cmNlcyB7CisJQ0xLX0RQTEwsCS8qIG5vcm1hbCBoYWxmZHVwbGV4IG9wZXJhdGlvbiAqLworCUNMS19FWFRFUk5BTCwJLyogZXh0ZXJuYWwgY2xvY2tpbmcgKEczUlVIL0RGOUlDIG1vZGVtcykgKi8KKwlDTEtfRElWSURFUiwJLyogUnggPSBEUExMLCBUeCA9IGRpdmlkZXIgKGZ1bGxkdXBsZXggd2l0aCAqLworCQkJLyogbW9kZW1zIHdpdGhvdXQgY2xvY2sgcmVnZW5lcmF0aW9uICovCisJQ0xLX0JSRwkJLyogZXhwZXJpbWVudGFsIGZ1bGxkdXBsZXggbW9kZSB3aXRoIERQTEwvQlJHIGZvciAqLworCQkJLyogTU9ERU1zIHdpdGhvdXQgY2xvY2sgcmVjb3ZlcnkgKi8KK307CisKKy8qIFR4IHN0YXRlICovCisKK2VudW0gVFhfc3RhdGUgeworCVRYU19JRExFLAkvKiBUcmFuc21pdHRlciBvZmYsIG5vIGRhdGEgcGVuZGluZyAqLworCVRYU19CVVNZLAkvKiB3YWl0aW5nIGZvciBwZXJtaXNzaW9uIHRvIHNlbmQgLyB0YWlsdGltZSAqLworCVRYU19BQ1RJVkUsCS8qIFRyYW5zbWl0dGVyIG9uLCBzZW5kaW5nIGRhdGEgKi8KKwlUWFNfTkVXRlJBTUUsCS8qIHJlc2V0IENSQyBhbmQgc2VuZCAobmV4dCkgZnJhbWUgKi8KKwlUWFNfSURMRTIsCS8qIFRyYW5zbWl0dGVyIG9uLCBubyBkYXRhIHBlbmRpbmcgKi8KKwlUWFNfV0FJVCwJLyogV2FpdGluZyBmb3IgTWludGltZSB0byBleHBpcmUgKi8KKwlUWFNfVElNRU9VVAkvKiBXZSBoYWQgYSB0cmFuc21pc3Npb24gdGltZW91dCAqLworfTsKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGlvX3BvcnQ7CS8qIHR5cGUgZGVmaW5pdGlvbiBmb3IgYW4gJ2lvIHBvcnQgYWRkcmVzcycgKi8KKworLyogU0NDIHN0YXRpc3RpY2FsIGluZm9ybWF0aW9uICovCisKK3N0cnVjdCBzY2Nfc3RhdCB7CisgICAgICAgIGxvbmcgcnhpbnRzOyAgICAgICAgICAgIC8qIFJlY2VpdmVyIGludGVycnVwdHMgKi8KKyAgICAgICAgbG9uZyB0eGludHM7ICAgICAgICAgICAgLyogVHJhbnNtaXR0ZXIgaW50ZXJydXB0cyAqLworICAgICAgICBsb25nIGV4aW50czsgICAgICAgICAgICAvKiBFeHRlcm5hbC9zdGF0dXMgaW50ZXJydXB0cyAqLworICAgICAgICBsb25nIHNwaW50czsgICAgICAgICAgICAvKiBTcGVjaWFsIHJlY2VpdmVyIGludGVycnVwdHMgKi8KKworICAgICAgICBsb25nIHR4ZnJhbWVzOyAgICAgICAgICAvKiBQYWNrZXRzIHNlbnQgKi8KKyAgICAgICAgbG9uZyByeGZyYW1lczsgICAgICAgICAgLyogTnVtYmVyIG9mIEZyYW1lcyBBY3R1YWxseSBSZWNlaXZlZCAqLworICAgICAgICBsb25nIHJ4ZXJyczsgICAgICAgICAgICAvKiBDUkMgRXJyb3JzICovCisgICAgICAgIGxvbmcgdHhlcnJzOwkJLyogS0lTUyBlcnJvcnMgKi8KKyAgICAgICAgCisJdW5zaWduZWQgaW50IG5vc3BhY2U7CS8qICJPdXQgb2YgYnVmZmVycyIgKi8KKwl1bnNpZ25lZCBpbnQgcnhfb3ZlcjsJLyogUmVjZWl2ZXIgT3ZlcnJ1bnMgKi8KKwl1bnNpZ25lZCBpbnQgdHhfdW5kZXI7CS8qIFRyYW5zbWl0dGVyIFVuZGVycnVucyAqLworCisJdW5zaWduZWQgaW50IHR4X3N0YXRlOwkvKiBUcmFuc21pdHRlciBzdGF0ZSAqLworCWludCB0eF9xdWV1ZWQ7CQkvKiB0eCBmcmFtZXMgZW5xdWV1ZWQgKi8KKworCXVuc2lnbmVkIGludCBtYXhxdWV1ZTsJLyogYWxsb2NhdGVkIHR4X2J1ZmZlcnMgKi8KKwl1bnNpZ25lZCBpbnQgYnVmc2l6ZTsJLyogdXNlZCBidWZmZXJzaXplICovCit9OworCitzdHJ1Y3Qgc2NjX21vZGVtIHsKKwlsb25nIHNwZWVkOwkJLyogTGluZSBzcGVlZCwgYnBzICovCisJY2hhciBjbG9ja3NyYzsJCS8qIDAgPSBEUExMLCAxID0gZXh0ZXJuYWwsIDIgPSBkaXZpZGVyICovCisJY2hhciBucno7CQkvKiBOUlogaW5zdGVhZCBvZiBOUlpJICovCQorfTsKKworc3RydWN0IHNjY19raXNzX2NtZCB7CisJaW50ICAJIGNvbW1hbmQ7CS8qIG9uZSBvZiB0aGUgS0lTUy1Db21tYW5kcyBkZWZpbmVkIGFib3ZlICovCisJdW5zaWduZWQgcGFyYW07CQkvKiBLSVNTLVBhcmFtICovCit9OworCitzdHJ1Y3Qgc2NjX2h3X2NvbmZpZyB7CisJaW9fcG9ydCBkYXRhX2E7CQkvKiBkYXRhIHBvcnQgY2hhbm5lbCBBICovCisJaW9fcG9ydCBjdHJsX2E7CQkvKiBjb250cm9sIHBvcnQgY2hhbm5lbCBBICovCisJaW9fcG9ydCBkYXRhX2I7CQkvKiBkYXRhIHBvcnQgY2hhbm5lbCBCICovCisJaW9fcG9ydCBjdHJsX2I7CQkvKiBjb250cm9sIHBvcnQgY2hhbm5lbCBCICovCisJaW9fcG9ydCB2ZWN0b3JfbGF0Y2g7CS8qIElOVEFDSy1MYXRjaCAoIykgKi8KKwlpb19wb3J0CXNwZWNpYWw7CS8qIHNwZWNpYWwgZnVuY3Rpb24gcG9ydCAqLworCisJaW50CWlycTsJCS8qIGlycSAqLworCWxvbmcJY2xvY2s7CQkvKiBjbG9jayAqLworCWNoYXIJb3B0aW9uOwkJLyogY29tbWFuZCBmb3IgZnVuY3Rpb24gcG9ydCAqLworCisJY2hhciBicmFuZDsJCS8qIGhhcmR3YXJlIHR5cGUgKi8KKwljaGFyIGVzY2M7CQkvKiB1c2UgZXh0LiBmZWF0dXJlcyBvZiBhIDg1ODAvODUxODAvODUyODAgKi8KK307CisKKy8qICgjKSBvbmx5IG9uZSBJTlRBQ0sgbGF0Y2ggYWxsb3dlZC4gKi8KKworCitzdHJ1Y3Qgc2NjX21lbV9jb25maWcgeworCXVuc2lnbmVkIGludCBkdW1teTsKKwl1bnNpZ25lZCBpbnQgYnVmc2l6ZTsKK307CisKK3N0cnVjdCBzY2NfY2FsaWJyYXRlIHsKKwl1bnNpZ25lZCBpbnQgdGltZTsKKwl1bnNpZ25lZCBjaGFyIHBhdHRlcm47Cit9OworCisjZW5kaWYgLyogZGVmaW5lZChfU0NDX0gpICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NjaGVkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ5NjhjZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2NoZWQuaApAQCAtMCwwICsxLDQ2IEBACisjaWZuZGVmIF9MSU5VWF9TQ0hFRF9ICisjZGVmaW5lIF9MSU5VWF9TQ0hFRF9ICisKKy8qCisgKiBjbG9uaW5nIGZsYWdzOgorICovCisjZGVmaW5lIENTSUdOQUwJCTB4MDAwMDAwZmYJLyogc2lnbmFsIG1hc2sgdG8gYmUgc2VudCBhdCBleGl0ICovCisjZGVmaW5lIENMT05FX1ZNCTB4MDAwMDAxMDAJLyogc2V0IGlmIFZNIHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3NlcyAqLworI2RlZmluZSBDTE9ORV9GUwkweDAwMDAwMjAwCS8qIHNldCBpZiBmcyBpbmZvIHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3NlcyAqLworI2RlZmluZSBDTE9ORV9GSUxFUwkweDAwMDAwNDAwCS8qIHNldCBpZiBvcGVuIGZpbGVzIHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3NlcyAqLworI2RlZmluZSBDTE9ORV9TSUdIQU5ECTB4MDAwMDA4MDAJLyogc2V0IGlmIHNpZ25hbCBoYW5kbGVycyBhbmQgYmxvY2tlZCBzaWduYWxzIHNoYXJlZCAqLworI2RlZmluZSBDTE9ORV9QVFJBQ0UJMHgwMDAwMjAwMAkvKiBzZXQgaWYgd2Ugd2FudCB0byBsZXQgdHJhY2luZyBjb250aW51ZSBvbiB0aGUgY2hpbGQgdG9vICovCisjZGVmaW5lIENMT05FX1ZGT1JLCTB4MDAwMDQwMDAJLyogc2V0IGlmIHRoZSBwYXJlbnQgd2FudHMgdGhlIGNoaWxkIHRvIHdha2UgaXQgdXAgb24gbW1fcmVsZWFzZSAqLworI2RlZmluZSBDTE9ORV9QQVJFTlQJMHgwMDAwODAwMAkvKiBzZXQgaWYgd2Ugd2FudCB0byBoYXZlIHRoZSBzYW1lIHBhcmVudCBhcyB0aGUgY2xvbmVyICovCisjZGVmaW5lIENMT05FX1RIUkVBRAkweDAwMDEwMDAwCS8qIFNhbWUgdGhyZWFkIGdyb3VwPyAqLworI2RlZmluZSBDTE9ORV9ORVdOUwkweDAwMDIwMDAwCS8qIE5ldyBuYW1lc3BhY2UgZ3JvdXA/ICovCisjZGVmaW5lIENMT05FX1NZU1ZTRU0JMHgwMDA0MDAwMAkvKiBzaGFyZSBzeXN0ZW0gViBTRU1fVU5ETyBzZW1hbnRpY3MgKi8KKyNkZWZpbmUgQ0xPTkVfU0VUVExTCTB4MDAwODAwMDAJLyogY3JlYXRlIGEgbmV3IFRMUyBmb3IgdGhlIGNoaWxkICovCisjZGVmaW5lIENMT05FX1BBUkVOVF9TRVRUSUQJMHgwMDEwMDAwMAkvKiBzZXQgdGhlIFRJRCBpbiB0aGUgcGFyZW50ICovCisjZGVmaW5lIENMT05FX0NISUxEX0NMRUFSVElECTB4MDAyMDAwMDAJLyogY2xlYXIgdGhlIFRJRCBpbiB0aGUgY2hpbGQgKi8KKyNkZWZpbmUgQ0xPTkVfREVUQUNIRUQJCTB4MDA0MDAwMDAJLyogVW51c2VkLCBpZ25vcmVkICovCisjZGVmaW5lIENMT05FX1VOVFJBQ0VECQkweDAwODAwMDAwCS8qIHNldCBpZiB0aGUgdHJhY2luZyBwcm9jZXNzIGNhbid0IGZvcmNlIENMT05FX1BUUkFDRSBvbiB0aGlzIGNsb25lICovCisjZGVmaW5lIENMT05FX0NISUxEX1NFVFRJRAkweDAxMDAwMDAwCS8qIHNldCB0aGUgVElEIGluIHRoZSBjaGlsZCAqLworLyogMHgwMjAwMDAwMCB3YXMgcHJldmlvdXNseSB0aGUgdW51c2VkIENMT05FX1NUT1BQRUQgKFN0YXJ0IGluIHN0b3BwZWQgc3RhdGUpCisgICBhbmQgaXMgbm93IGF2YWlsYWJsZSBmb3IgcmUtdXNlLiAqLworI2RlZmluZSBDTE9ORV9ORVdVVFMJCTB4MDQwMDAwMDAJLyogTmV3IHV0c25hbWUgZ3JvdXA/ICovCisjZGVmaW5lIENMT05FX05FV0lQQwkJMHgwODAwMDAwMAkvKiBOZXcgaXBjcyAqLworI2RlZmluZSBDTE9ORV9ORVdVU0VSCQkweDEwMDAwMDAwCS8qIE5ldyB1c2VyIG5hbWVzcGFjZSAqLworI2RlZmluZSBDTE9ORV9ORVdQSUQJCTB4MjAwMDAwMDAJLyogTmV3IHBpZCBuYW1lc3BhY2UgKi8KKyNkZWZpbmUgQ0xPTkVfTkVXTkVUCQkweDQwMDAwMDAwCS8qIE5ldyBuZXR3b3JrIG5hbWVzcGFjZSAqLworI2RlZmluZSBDTE9ORV9JTwkJMHg4MDAwMDAwMAkvKiBDbG9uZSBpbyBjb250ZXh0ICovCisKKy8qCisgKiBTY2hlZHVsaW5nIHBvbGljaWVzCisgKi8KKyNkZWZpbmUgU0NIRURfTk9STUFMCQkwCisjZGVmaW5lIFNDSEVEX0ZJRk8JCTEKKyNkZWZpbmUgU0NIRURfUlIJCTIKKyNkZWZpbmUgU0NIRURfQkFUQ0gJCTMKKy8qIFNDSEVEX0lTTzogcmVzZXJ2ZWQgYnV0IG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKyNkZWZpbmUgU0NIRURfSURMRQkJNQorLyogQ2FuIGJlIE9SZWQgaW4gdG8gbWFrZSBzdXJlIHRoZSBwcm9jZXNzIGlzIHJldmVydGVkIGJhY2sgdG8gU0NIRURfTk9STUFMIG9uIGZvcmsgKi8KKyNkZWZpbmUgU0NIRURfUkVTRVRfT05fRk9SSyAgICAgMHg0MDAwMDAwMAorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zY3JlZW5faW5mby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zY3JlZW5faW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMDBiOTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NjcmVlbl9pbmZvLmgKQEAgLTAsMCArMSw3MyBAQAorI2lmbmRlZiBfU0NSRUVOX0lORk9fSAorI2RlZmluZSBfU0NSRUVOX0lORk9fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIFRoZXNlIGFyZSBzZXQgdXAgYnkgdGhlIHNldHVwLXJvdXRpbmUgYXQgYm9vdC10aW1lOgorICovCisKK3N0cnVjdCBzY3JlZW5faW5mbyB7CisJX191OCAgb3JpZ194OwkJLyogMHgwMCAqLworCV9fdTggIG9yaWdfeTsJCS8qIDB4MDEgKi8KKwlfX3UxNiBleHRfbWVtX2s7CS8qIDB4MDIgKi8KKwlfX3UxNiBvcmlnX3ZpZGVvX3BhZ2U7CS8qIDB4MDQgKi8KKwlfX3U4ICBvcmlnX3ZpZGVvX21vZGU7CS8qIDB4MDYgKi8KKwlfX3U4ICBvcmlnX3ZpZGVvX2NvbHM7CS8qIDB4MDcgKi8KKwlfX3U4ICBmbGFnczsJCS8qIDB4MDggKi8KKwlfX3U4ICB1bnVzZWQyOwkJLyogMHgwOSAqLworCV9fdTE2IG9yaWdfdmlkZW9fZWdhX2J4Oy8qIDB4MGEgKi8KKwlfX3UxNiB1bnVzZWQzOwkJLyogMHgwYyAqLworCV9fdTggIG9yaWdfdmlkZW9fbGluZXM7CS8qIDB4MGUgKi8KKwlfX3U4ICBvcmlnX3ZpZGVvX2lzVkdBOwkvKiAweDBmICovCisJX191MTYgb3JpZ192aWRlb19wb2ludHM7LyogMHgxMCAqLworCisJLyogVkVTQSBncmFwaGljIG1vZGUgLS0gbGluZWFyIGZyYW1lIGJ1ZmZlciAqLworCV9fdTE2IGxmYl93aWR0aDsJLyogMHgxMiAqLworCV9fdTE2IGxmYl9oZWlnaHQ7CS8qIDB4MTQgKi8KKwlfX3UxNiBsZmJfZGVwdGg7CS8qIDB4MTYgKi8KKwlfX3UzMiBsZmJfYmFzZTsJCS8qIDB4MTggKi8KKwlfX3UzMiBsZmJfc2l6ZTsJCS8qIDB4MWMgKi8KKwlfX3UxNiBjbF9tYWdpYywgY2xfb2Zmc2V0OyAvKiAweDIwICovCisJX191MTYgbGZiX2xpbmVsZW5ndGg7CS8qIDB4MjQgKi8KKwlfX3U4ICByZWRfc2l6ZTsJCS8qIDB4MjYgKi8KKwlfX3U4ICByZWRfcG9zOwkJLyogMHgyNyAqLworCV9fdTggIGdyZWVuX3NpemU7CS8qIDB4MjggKi8KKwlfX3U4ICBncmVlbl9wb3M7CS8qIDB4MjkgKi8KKwlfX3U4ICBibHVlX3NpemU7CS8qIDB4MmEgKi8KKwlfX3U4ICBibHVlX3BvczsJCS8qIDB4MmIgKi8KKwlfX3U4ICByc3ZkX3NpemU7CS8qIDB4MmMgKi8KKwlfX3U4ICByc3ZkX3BvczsJCS8qIDB4MmQgKi8KKwlfX3UxNiB2ZXNhcG1fc2VnOwkvKiAweDJlICovCisJX191MTYgdmVzYXBtX29mZjsJLyogMHgzMCAqLworCV9fdTE2IHBhZ2VzOwkJLyogMHgzMiAqLworCV9fdTE2IHZlc2FfYXR0cmlidXRlczsJLyogMHgzNCAqLworCV9fdTMyIGNhcGFiaWxpdGllczsgICAgIC8qIDB4MzYgKi8KKwlfX3U4ICBfcmVzZXJ2ZWRbNl07CS8qIDB4M2EgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgVklERU9fVFlQRV9NREEJCTB4MTAJLyogTW9ub2Nocm9tZSBUZXh0IERpc3BsYXkJKi8KKyNkZWZpbmUgVklERU9fVFlQRV9DR0EJCTB4MTEJLyogQ0dBIERpc3BsYXkgCQkJKi8KKyNkZWZpbmUgVklERU9fVFlQRV9FR0FNCQkweDIwCS8qIEVHQS9WR0EgaW4gTW9ub2Nocm9tZSBNb2RlCSovCisjZGVmaW5lIFZJREVPX1RZUEVfRUdBQwkJMHgyMQkvKiBFR0EgaW4gQ29sb3IgTW9kZQkJKi8KKyNkZWZpbmUgVklERU9fVFlQRV9WR0FDCQkweDIyCS8qIFZHQSsgaW4gQ29sb3IgTW9kZQkJKi8KKyNkZWZpbmUgVklERU9fVFlQRV9WTEZCCQkweDIzCS8qIFZFU0EgVkdBIGluIGdyYXBoaWMgbW9kZQkqLworCisjZGVmaW5lIFZJREVPX1RZUEVfUElDQV9TMwkweDMwCS8qIEFDRVIgUElDQS02MSBsb2NhbCBTMyB2aWRlbwkqLworI2RlZmluZSBWSURFT19UWVBFX01JUFNfRzM2NAkweDMxICAgIC8qIE1JUFMgTWFnbnVtIDQwMDAgRzM2NCB2aWRlbyAgKi8KKyNkZWZpbmUgVklERU9fVFlQRV9TR0kgICAgICAgICAgMHgzMyAgICAvKiBWYXJpb3VzIFNHSSBncmFwaGljcyBoYXJkd2FyZSAqLworCisjZGVmaW5lIFZJREVPX1RZUEVfVEdBQwkJMHg0MAkvKiBERUMgVEdBICovCisKKyNkZWZpbmUgVklERU9fVFlQRV9TVU4gICAgICAgICAgMHg1MCAgICAvKiBTdW4gZnJhbWUgYnVmZmVyLiAqLworI2RlZmluZSBWSURFT19UWVBFX1NVTlBDSSAgICAgICAweDUxICAgIC8qIFN1biBQQ0kgYmFzZWQgZnJhbWUgYnVmZmVyLiAqLworCisjZGVmaW5lIFZJREVPX1RZUEVfUE1BQwkJMHg2MAkvKiBQb3dlck1hY2ludG9zaCBmcmFtZSBidWZmZXIuICovCisKKyNkZWZpbmUgVklERU9fVFlQRV9FRkkJCTB4NzAJLyogRUZJIGdyYXBoaWMgbW9kZQkJKi8KKworI2RlZmluZSBWSURFT19GTEFHU19OT0NVUlNPUgkoMSA8PCAwKSAvKiBUaGUgdmlkZW8gbW9kZSBoYXMgbm8gY3Vyc29yIHNldCAqLworI2RlZmluZSBWSURFT19GTEFHU19IQU5ET0ZGCSgxIDw8IDEpIC8qIFZpZGVvIGJ1ZmZlciBpcyBhbHJlZHkgcGFpbnRlZCAqLworCisKKyNlbmRpZiAvKiBfU0NSRUVOX0lORk9fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZGxhLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NkbGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTRmN2VjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZGxhLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJR2xvYmFsIGRlZmluaXRpb25zIGZvciB0aGUgRnJhbWUgcmVsYXkgaW50ZXJmYWNlLgorICoKKyAqIFZlcnNpb246CUAoIylpZl9pZnJhZC5oCTAuMjAJMTMgQXByIDk2CisgKgorICogQXV0aG9yOglNaWtlIE1jTGFnYW4gPG1pa2UubWNsYWdhbkBsaW51eC5vcmc+CisgKgorICogQ2hhbmdlczoKKyAqCQkwLjE1CU1pa2UgTWNMYWdhbglTdHJ1Y3R1cmUgcGFja2luZworICoKKyAqCQkwLjIwCU1pa2UgTWNMYWdhbglOZXcgZmxhZ3MgZm9yIFM1MDggYnVmZmVyIGhhbmRsaW5nCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBTRExBX0gKKyNkZWZpbmUgU0RMQV9ICisKKy8qIGFkYXB0ZXIgdHlwZSAqLworI2RlZmluZSBTRExBX1RZUEVTCisjZGVmaW5lIFNETEFfUzUwMkEJCQk1MDIwCisjZGVmaW5lIFNETEFfUzUwMkUJCQk1MDIxCisjZGVmaW5lIFNETEFfUzUwMwkJCTUwMzAKKyNkZWZpbmUgU0RMQV9TNTA3CQkJNTA3MAorI2RlZmluZSBTRExBX1M1MDgJCQk1MDgwCisjZGVmaW5lIFNETEFfUzUwOQkJCTUwOTAKKyNkZWZpbmUgU0RMQV9VTktOT1dOCQkJLTEKKworLyogcG9ydCBzZWxlY3Rpb24gZmxhZ3MgZm9yIHRoZSBTNTA4ICovCisjZGVmaW5lIFNETEFfUzUwOF9QT1JUX1YzNQkJMHgwMAorI2RlZmluZSBTRExBX1M1MDhfUE9SVF9SUzIzMgkJMHgwMgorCisvKiBaODAgQ1BVIHNwZWVkcyAqLworI2RlZmluZSBTRExBX0NQVV8zTQkJCTB4MDAKKyNkZWZpbmUgU0RMQV9DUFVfNU0JCQkweDAxCisjZGVmaW5lIFNETEFfQ1BVXzdNCQkJMHgwMgorI2RlZmluZSBTRExBX0NQVV84TQkJCTB4MDMKKyNkZWZpbmUgU0RMQV9DUFVfMTBNCQkJMHgwNAorI2RlZmluZSBTRExBX0NQVV8xNk0JCQkweDA1CisjZGVmaW5lIFNETEFfQ1BVXzEyTQkJCTB4MDYKKworLyogc29tZSBwcml2YXRlIElPQ1RMcyAqLworI2RlZmluZSBTRExBX0lERU5USUZZCQkJKEZSQURfTEFTVF9JT0NUTCArIDEpCisjZGVmaW5lIFNETEFfQ1BVU1BFRUQJCQkoRlJBRF9MQVNUX0lPQ1RMICsgMikKKyNkZWZpbmUgU0RMQV9QUk9UT0NPTAkJCShGUkFEX0xBU1RfSU9DVEwgKyAzKQorCisjZGVmaW5lIFNETEFfQ0xFQVJNRU0JCQkoRlJBRF9MQVNUX0lPQ1RMICsgNCkKKyNkZWZpbmUgU0RMQV9XUklURU1FTQkJCShGUkFEX0xBU1RfSU9DVEwgKyA1KQorI2RlZmluZSBTRExBX1JFQURNRU0JCQkoRlJBRF9MQVNUX0lPQ1RMICsgNikKKworc3RydWN0IHNkbGFfbWVtIHsKKyAgIGludCAgYWRkcjsKKyAgIGludCAgbGVuOworICAgdm9pZCAqZGF0YTsKK307CisKKyNkZWZpbmUgU0RMQV9TVEFSVAkJCShGUkFEX0xBU1RfSU9DVEwgKyA3KQorI2RlZmluZSBTRExBX1NUT1AJCQkoRlJBRF9MQVNUX0lPQ1RMICsgOCkKKworLyogc29tZSBvZmZzZXRzIGluIHRoZSBaODAncyBtZW1vcnkgc3BhY2UgKi8KKyNkZWZpbmUgU0RMQV9OTUlBRERSCQkJMHgwMDAwCisjZGVmaW5lIFNETEFfQ09ORl9BRERSCQkJMHgwMDEwCisjZGVmaW5lIFNETEFfUzUwMkFfTk1JQUREUgkJMHgwMDY2CisjZGVmaW5lIFNETEFfQ09ERV9CQVNFQUREUgkJMHgwMTAwCisjZGVmaW5lIFNETEFfV0lORE9XX1NJWkUJCTB4MjAwMAorI2RlZmluZSBTRExBX0FERFJfTUFTSwkJCTB4MUZGRgorCisvKiBsYXJnZXN0IGhhbmRsZWFibGUgYmxvY2sgb2YgZGF0YSAqLworI2RlZmluZSBTRExBX01BWF9EQVRBCQkJNDA4MAorI2RlZmluZSBTRExBX01BWF9NVFUJCQk0MDcyCS8qIE1BWF9EQVRBIC0gc2l6ZW9mKGZyYWRoZHIpICovCisjZGVmaW5lIFNETEFfTUFYX0RMQ0kJCQkyNAorCisvKiB0aGlzIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBmcmFkX2NvbmYgKi8KK3N0cnVjdCBzZGxhX2NvbmYgeworICAgc2hvcnQgc3RhdGlvbjsKKyAgIHNob3J0IGNvbmZpZzsKKyAgIHNob3J0IGtiYXVkOworICAgc2hvcnQgY2xvY2tpbmc7CisgICBzaG9ydCBtYXhfZnJtOworICAgc2hvcnQgVDM5MTsKKyAgIHNob3J0IFQzOTI7CisgICBzaG9ydCBOMzkxOworICAgc2hvcnQgTjM5MjsKKyAgIHNob3J0IE4zOTM7CisgICBzaG9ydCBDSVJfZndkOworICAgc2hvcnQgQmNfZndkOworICAgc2hvcnQgQmVfZndkOworICAgc2hvcnQgQ0lSX2J3ZDsKKyAgIHNob3J0IEJjX2J3ZDsKKyAgIHNob3J0IEJlX2J3ZDsKK307CisKKy8qIHRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGRsY2lfY29uZiAqLworc3RydWN0IHNkbGFfZGxjaV9jb25mIHsKKyAgIHNob3J0IGNvbmZpZzsKKyAgIHNob3J0IENJUl9md2Q7CisgICBzaG9ydCBCY19md2Q7CisgICBzaG9ydCBCZV9md2Q7CisgICBzaG9ydCBDSVJfYndkOworICAgc2hvcnQgQmNfYndkOworICAgc2hvcnQgQmVfYndkOyAKKyAgIHNob3J0IFRjX2Z3ZDsKKyAgIHNob3J0IFRjX2J3ZDsKKyAgIHNob3J0IFRmX21heDsKKyAgIHNob3J0IFRiX21heDsKK307CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlY2NvbXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VjY29tcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3Nzg4NWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlY2NvbXAuaApAQCAtMCwwICsxLDQ3IEBACisjaWZuZGVmIF9MSU5VWF9TRUNDT01QX0gKKyNkZWZpbmUgX0xJTlVYX1NFQ0NPTVBfSAorCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisKKy8qIFZhbGlkIHZhbHVlcyBmb3Igc2VjY29tcC5tb2RlIGFuZCBwcmN0bChQUl9TRVRfU0VDQ09NUCwgPG1vZGU+KSAqLworI2RlZmluZSBTRUNDT01QX01PREVfRElTQUJMRUQJMCAvKiBzZWNjb21wIGlzIG5vdCBpbiB1c2UuICovCisjZGVmaW5lIFNFQ0NPTVBfTU9ERV9TVFJJQ1QJMSAvKiB1c2VzIGhhcmQtY29kZWQgZmlsdGVyLiAqLworI2RlZmluZSBTRUNDT01QX01PREVfRklMVEVSCTIgLyogdXNlcyB1c2VyLXN1cHBsaWVkIGZpbHRlci4gKi8KKworLyoKKyAqIEFsbCBCUEYgcHJvZ3JhbXMgbXVzdCByZXR1cm4gYSAzMi1iaXQgdmFsdWUuCisgKiBUaGUgYm90dG9tIDE2LWJpdHMgYXJlIGZvciBvcHRpb25hbCByZXR1cm4gZGF0YS4KKyAqIFRoZSB1cHBlciAxNi1iaXRzIGFyZSBvcmRlcmVkIGZyb20gbGVhc3QgcGVybWlzc2l2ZSB2YWx1ZXMgdG8gbW9zdC4KKyAqCisgKiBUaGUgb3JkZXJpbmcgZW5zdXJlcyB0aGF0IGEgbWluX3QoKSBvdmVyIGNvbXBvc2VkIHJldHVybiB2YWx1ZXMgYWx3YXlzCisgKiBzZWxlY3RzIHRoZSBsZWFzdCBwZXJtaXNzaXZlIGNob2ljZS4KKyAqLworI2RlZmluZSBTRUNDT01QX1JFVF9LSUxMCTB4MDAwMDAwMDBVIC8qIGtpbGwgdGhlIHRhc2sgaW1tZWRpYXRlbHkgKi8KKyNkZWZpbmUgU0VDQ09NUF9SRVRfVFJBUAkweDAwMDMwMDAwVSAvKiBkaXNhbGxvdyBhbmQgZm9yY2UgYSBTSUdTWVMgKi8KKyNkZWZpbmUgU0VDQ09NUF9SRVRfRVJSTk8JMHgwMDA1MDAwMFUgLyogcmV0dXJucyBhbiBlcnJubyAqLworI2RlZmluZSBTRUNDT01QX1JFVF9UUkFDRQkweDdmZjAwMDAwVSAvKiBwYXNzIHRvIGEgdHJhY2VyIG9yIGRpc2FsbG93ICovCisjZGVmaW5lIFNFQ0NPTVBfUkVUX0FMTE9XCTB4N2ZmZjAwMDBVIC8qIGFsbG93ICovCisKKy8qIE1hc2tzIGZvciB0aGUgcmV0dXJuIHZhbHVlIHNlY3Rpb25zLiAqLworI2RlZmluZSBTRUNDT01QX1JFVF9BQ1RJT04JMHhmZmZmMDAwMFUKKyNkZWZpbmUgU0VDQ09NUF9SRVRfREFUQQkweDAwMDBmZmZmVQorCisvKioKKyAqIHN0cnVjdCBzZWNjb21wX2RhdGEgLSB0aGUgZm9ybWF0IHRoZSBCUEYgcHJvZ3JhbSBleGVjdXRlcyBvdmVyLgorICogQG5yOiB0aGUgc3lzdGVtIGNhbGwgbnVtYmVyCisgKiBAYXJjaDogaW5kaWNhdGVzIHN5c3RlbSBjYWxsIGNvbnZlbnRpb24gYXMgYW4gQVVESVRfQVJDSF8qIHZhbHVlCisgKiAgICAgICAgYXMgZGVmaW5lZCBpbiA8bGludXgvYXVkaXQuaD4uCisgKiBAaW5zdHJ1Y3Rpb25fcG9pbnRlcjogYXQgdGhlIHRpbWUgb2YgdGhlIHN5c3RlbSBjYWxsLgorICogQGFyZ3M6IHVwIHRvIDYgc3lzdGVtIGNhbGwgYXJndW1lbnRzIGFsd2F5cyBzdG9yZWQgYXMgNjQtYml0IHZhbHVlcworICogICAgICAgIHJlZ2FyZGxlc3Mgb2YgdGhlIGFyY2hpdGVjdHVyZS4KKyAqLworc3RydWN0IHNlY2NvbXBfZGF0YSB7CisJaW50IG5yOworCV9fdTMyIGFyY2g7CisJX191NjQgaW5zdHJ1Y3Rpb25fcG9pbnRlcjsKKwlfX3U2NCBhcmdzWzZdOworfTsKKworI2VuZGlmIC8qIF9MSU5VWF9TRUNDT01QX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VjdXJlYml0cy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZWN1cmViaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAzNWM2MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VjdXJlYml0cy5oCkBAIC0wLDAgKzEsNTEgQEAKKyNpZm5kZWYgX0xJTlVYX1NFQ1VSRUJJVFNfSAorI2RlZmluZSBfTElOVVhfU0VDVVJFQklUU19IIDEKKworLyogRWFjaCBzZWN1cmVzZXR0aW5nIGlzIGltcGxlbWVudGVkIHVzaW5nIHR3byBiaXRzLiBPbmUgYml0IHNwZWNpZmllcworICAgd2hldGhlciB0aGUgc2V0dGluZyBpcyBvbiBvciBvZmYuIFRoZSBvdGhlciBiaXQgc3BlY2lmeSB3aGV0aGVyIHRoZQorICAgc2V0dGluZyBpcyBsb2NrZWQgb3Igbm90LiBBIHNldHRpbmcgd2hpY2ggaXMgbG9ja2VkIGNhbm5vdCBiZQorICAgY2hhbmdlZCBmcm9tIHVzZXItbGV2ZWwuICovCisjZGVmaW5lIGlzc2VjdXJlX21hc2soWCkJKDEgPDwgKFgpKQorCisjZGVmaW5lIFNFQ1VSRUJJVFNfREVGQVVMVCAweDAwMDAwMDAwCisKKy8qIFdoZW4gc2V0IFVJRCAwIGhhcyBubyBzcGVjaWFsIHByaXZpbGVnZXMuIFdoZW4gdW5zZXQsIHdlIHN1cHBvcnQKKyAgIGluaGVyaXRhbmNlIG9mIHJvb3QtcGVybWlzc2lvbnMgYW5kIHN1aWQtcm9vdCBleGVjdXRhYmxlIHVuZGVyCisgICBjb21wYXRpYmlsaXR5IG1vZGUuIFdlIHJhaXNlIHRoZSBlZmZlY3RpdmUgYW5kIGluaGVyaXRhYmxlIGJpdG1hc2tzCisgICAqb2YgdGhlIGV4ZWN1dGFibGUgZmlsZSogaWYgdGhlIGVmZmVjdGl2ZSB1aWQgb2YgdGhlIG5ldyBwcm9jZXNzIGlzCisgICAwLiBJZiB0aGUgcmVhbCB1aWQgaXMgMCwgd2UgcmFpc2UgdGhlIGVmZmVjdGl2ZSAobGVnYWN5KSBiaXQgb2YgdGhlCisgICBleGVjdXRhYmxlIGZpbGUuICovCisjZGVmaW5lIFNFQ1VSRV9OT1JPT1QJCQkwCisjZGVmaW5lIFNFQ1VSRV9OT1JPT1RfTE9DS0VECQkxICAvKiBtYWtlIGJpdC0wIGltbXV0YWJsZSAqLworCisjZGVmaW5lIFNFQ0JJVF9OT1JPT1QJCShpc3NlY3VyZV9tYXNrKFNFQ1VSRV9OT1JPT1QpKQorI2RlZmluZSBTRUNCSVRfTk9ST09UX0xPQ0tFRAkoaXNzZWN1cmVfbWFzayhTRUNVUkVfTk9ST09UX0xPQ0tFRCkpCisKKy8qIFdoZW4gc2V0LCBzZXR1aWQgdG8vZnJvbSB1aWQgMCBkb2VzIG5vdCB0cmlnZ2VyIGNhcGFiaWxpdHktImZpeHVwIi4KKyAgIFdoZW4gdW5zZXQsIHRvIHByb3ZpZGUgY29tcGF0aWJsaWxpdHkgd2l0aCBvbGQgcHJvZ3JhbXMgcmVseWluZyBvbgorICAgc2V0KnVpZCB0byBnYWluL2xvc2UgcHJpdmlsZWdlLCB0cmFuc2l0aW9ucyB0by9mcm9tIHVpZCAwIGNhdXNlCisgICBjYXBhYmlsaXRpZXMgdG8gYmUgZ2FpbmVkL2xvc3QuICovCisjZGVmaW5lIFNFQ1VSRV9OT19TRVRVSURfRklYVVAJCTIKKyNkZWZpbmUgU0VDVVJFX05PX1NFVFVJRF9GSVhVUF9MT0NLRUQJMyAgLyogbWFrZSBiaXQtMiBpbW11dGFibGUgKi8KKworI2RlZmluZSBTRUNCSVRfTk9fU0VUVUlEX0ZJWFVQCShpc3NlY3VyZV9tYXNrKFNFQ1VSRV9OT19TRVRVSURfRklYVVApKQorI2RlZmluZSBTRUNCSVRfTk9fU0VUVUlEX0ZJWFVQX0xPQ0tFRCBcCisJCQkoaXNzZWN1cmVfbWFzayhTRUNVUkVfTk9fU0VUVUlEX0ZJWFVQX0xPQ0tFRCkpCisKKy8qIFdoZW4gc2V0LCBhIHByb2Nlc3MgY2FuIHJldGFpbiBpdHMgY2FwYWJpbGl0aWVzIGV2ZW4gYWZ0ZXIKKyAgIHRyYW5zaXRpb25pbmcgdG8gYSBub24tcm9vdCB1c2VyICh0aGUgc2V0LXVpZCBmaXh1cCBzdXBwcmVzc2VkIGJ5CisgICBiaXQgMikuIEJpdC00IGlzIGNsZWFyZWQgd2hlbiBhIHByb2Nlc3MgY2FsbHMgZXhlYygpOyBzZXR0aW5nIGJvdGgKKyAgIGJpdCA0IGFuZCA1IHdpbGwgY3JlYXRlIGEgYmFycmllciB0aHJvdWdoIGV4ZWMgdGhhdCBubyBleGVjKCknZAorICAgY2hpbGQgY2FuIHVzZSB0aGlzIGZlYXR1cmUgYWdhaW4uICovCisjZGVmaW5lIFNFQ1VSRV9LRUVQX0NBUFMJCTQKKyNkZWZpbmUgU0VDVVJFX0tFRVBfQ0FQU19MT0NLRUQJCTUgIC8qIG1ha2UgYml0LTQgaW1tdXRhYmxlICovCisKKyNkZWZpbmUgU0VDQklUX0tFRVBfQ0FQUwkoaXNzZWN1cmVfbWFzayhTRUNVUkVfS0VFUF9DQVBTKSkKKyNkZWZpbmUgU0VDQklUX0tFRVBfQ0FQU19MT0NLRUQgKGlzc2VjdXJlX21hc2soU0VDVVJFX0tFRVBfQ0FQU19MT0NLRUQpKQorCisjZGVmaW5lIFNFQ1VSRV9BTExfQklUUwkJKGlzc2VjdXJlX21hc2soU0VDVVJFX05PUk9PVCkgfCBcCisJCQkJIGlzc2VjdXJlX21hc2soU0VDVVJFX05PX1NFVFVJRF9GSVhVUCkgfCBcCisJCQkJIGlzc2VjdXJlX21hc2soU0VDVVJFX0tFRVBfQ0FQUykpCisjZGVmaW5lIFNFQ1VSRV9BTExfTE9DS1MJKFNFQ1VSRV9BTExfQklUUyA8PCAxKQorCisjZW5kaWYgLyogIV9MSU5VWF9TRUNVUkVCSVRTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VsaW51eF9uZXRsaW5rLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlbGludXhfbmV0bGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOWJmNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlbGludXhfbmV0bGluay5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBOZXRsaW5rIGV2ZW50IG5vdGlmaWNhdGlvbnMgZm9yIFNFTGludXguCisgKgorICogQXV0aG9yOiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAcmVkaGF0LmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiwgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQHJlZGhhdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLAorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpZm5kZWYgX0xJTlVYX1NFTElOVVhfTkVUTElOS19ICisjZGVmaW5lIF9MSU5VWF9TRUxJTlVYX05FVExJTktfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogTWVzc2FnZSB0eXBlcy4gKi8KKyNkZWZpbmUgU0VMTkxfTVNHX0JBU0UgMHgxMAorZW51bSB7CisJU0VMTkxfTVNHX1NFVEVORk9SQ0UgPSBTRUxOTF9NU0dfQkFTRSwKKwlTRUxOTF9NU0dfUE9MSUNZTE9BRCwKKwlTRUxOTF9NU0dfTUFYCit9OworCisvKiBNdWx0aWNhc3QgZ3JvdXBzIC0gYmFja3dhcmRzIGNvbXBhdGlibGlsaXR5IGZvciB1c2Vyc3BhY2UgKi8KKyNkZWZpbmUgU0VMTkxfR1JQX05PTkUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgU0VMTkxfR1JQX0FWQwkJMHgwMDAwMDAwMQkvKiBBVkMgbm90aWZpY2F0aW9ucyAqLworI2RlZmluZSBTRUxOTF9HUlBfQUxMCQkweGZmZmZmZmZmCisKK2VudW0gc2VsaW51eF9ubGdyb3VwcyB7CisJU0VMTkxHUlBfTk9ORSwKKyNkZWZpbmUgU0VMTkxHUlBfTk9ORQlTRUxOTEdSUF9OT05FCisJU0VMTkxHUlBfQVZDLAorI2RlZmluZSBTRUxOTEdSUF9BVkMJU0VMTkxHUlBfQVZDCisJX19TRUxOTEdSUF9NQVgKK307CisjZGVmaW5lIFNFTE5MR1JQX01BWAkoX19TRUxOTEdSUF9NQVggLSAxKQorCisvKiBNZXNzYWdlIHN0cnVjdHVyZXMgKi8KK3N0cnVjdCBzZWxubF9tc2dfc2V0ZW5mb3JjZSB7CisJX19zMzIJCXZhbDsKK307CisKK3N0cnVjdCBzZWxubF9tc2dfcG9saWN5bG9hZCB7CisJX191MzIJc2Vxbm87Cit9OworCisjZW5kaWYgLyogX0xJTlVYX1NFTElOVVhfTkVUTElOS19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjE5NzRjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZW0uaApAQCAtMCwwICsxLDgwIEBACisjaWZuZGVmIF9MSU5VWF9TRU1fSAorI2RlZmluZSBfTElOVVhfU0VNX0gKKworI2luY2x1ZGUgPGxpbnV4L2lwYy5oPgorCisvKiBzZW1vcCBmbGFncyAqLworI2RlZmluZSBTRU1fVU5ETyAgICAgICAgMHgxMDAwICAvKiB1bmRvIHRoZSBvcGVyYXRpb24gb24gZXhpdCAqLworCisvKiBzZW1jdGwgQ29tbWFuZCBEZWZpbml0aW9ucy4gKi8KKyNkZWZpbmUgR0VUUElEICAxMSAgICAgICAvKiBnZXQgc2VtcGlkICovCisjZGVmaW5lIEdFVFZBTCAgMTIgICAgICAgLyogZ2V0IHNlbXZhbCAqLworI2RlZmluZSBHRVRBTEwgIDEzICAgICAgIC8qIGdldCBhbGwgc2VtdmFsJ3MgKi8KKyNkZWZpbmUgR0VUTkNOVCAxNCAgICAgICAvKiBnZXQgc2VtbmNudCAqLworI2RlZmluZSBHRVRaQ05UIDE1ICAgICAgIC8qIGdldCBzZW16Y250ICovCisjZGVmaW5lIFNFVFZBTCAgMTYgICAgICAgLyogc2V0IHNlbXZhbCAqLworI2RlZmluZSBTRVRBTEwgIDE3ICAgICAgIC8qIHNldCBhbGwgc2VtdmFsJ3MgKi8KKworLyogaXBjcyBjdGwgY21kcyAqLworI2RlZmluZSBTRU1fU1RBVCAxOAorI2RlZmluZSBTRU1fSU5GTyAxOQorCisvKiBPYnNvbGV0ZSwgdXNlZCBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBhbmQgbGliYzUgY29tcGlsZXMgKi8KK3N0cnVjdCBzZW1pZF9kcyB7CisJc3RydWN0IGlwY19wZXJtCXNlbV9wZXJtOwkJLyogcGVybWlzc2lvbnMgLi4gc2VlIGlwYy5oICovCisJX19rZXJuZWxfdGltZV90CXNlbV9vdGltZTsJCS8qIGxhc3Qgc2Vtb3AgdGltZSAqLworCV9fa2VybmVsX3RpbWVfdAlzZW1fY3RpbWU7CQkvKiBsYXN0IGNoYW5nZSB0aW1lICovCisJc3RydWN0IHNlbQkqc2VtX2Jhc2U7CQkvKiBwdHIgdG8gZmlyc3Qgc2VtYXBob3JlIGluIGFycmF5ICovCisJc3RydWN0IHNlbV9xdWV1ZSAqc2VtX3BlbmRpbmc7CQkvKiBwZW5kaW5nIG9wZXJhdGlvbnMgdG8gYmUgcHJvY2Vzc2VkICovCisJc3RydWN0IHNlbV9xdWV1ZSAqKnNlbV9wZW5kaW5nX2xhc3Q7CS8qIGxhc3QgcGVuZGluZyBvcGVyYXRpb24gKi8KKwlzdHJ1Y3Qgc2VtX3VuZG8JKnVuZG87CQkJLyogdW5kbyByZXF1ZXN0cyBvbiB0aGlzIGFycmF5ICovCisJdW5zaWduZWQgc2hvcnQJc2VtX25zZW1zOwkJLyogbm8uIG9mIHNlbWFwaG9yZXMgaW4gYXJyYXkgKi8KK307CisKKy8qIEluY2x1ZGUgdGhlIGRlZmluaXRpb24gb2Ygc2VtaWQ2NF9kcyAqLworI2luY2x1ZGUgPGFzbS9zZW1idWYuaD4KKworLyogc2Vtb3Agc3lzdGVtIGNhbGxzIHRha2VzIGFuIGFycmF5IG9mIHRoZXNlLiAqLworc3RydWN0IHNlbWJ1ZiB7CisJdW5zaWduZWQgc2hvcnQgIHNlbV9udW07CS8qIHNlbWFwaG9yZSBpbmRleCBpbiBhcnJheSAqLworCXNob3J0CQlzZW1fb3A7CQkvKiBzZW1hcGhvcmUgb3BlcmF0aW9uICovCisJc2hvcnQJCXNlbV9mbGc7CS8qIG9wZXJhdGlvbiBmbGFncyAqLworfTsKKworLyogYXJnIGZvciBzZW1jdGwgc3lzdGVtIGNhbGxzLiAqLwordW5pb24gc2VtdW4geworCWludCB2YWw7CQkJLyogdmFsdWUgZm9yIFNFVFZBTCAqLworCXN0cnVjdCBzZW1pZF9kcyAqYnVmOwkvKiBidWZmZXIgZm9yIElQQ19TVEFUICYgSVBDX1NFVCAqLworCXVuc2lnbmVkIHNob3J0ICphcnJheTsJLyogYXJyYXkgZm9yIEdFVEFMTCAmIFNFVEFMTCAqLworCXN0cnVjdCBzZW1pbmZvICpfX2J1ZjsJLyogYnVmZmVyIGZvciBJUENfSU5GTyAqLworCXZvaWQgKl9fcGFkOworfTsKKworc3RydWN0ICBzZW1pbmZvIHsKKwlpbnQgc2VtbWFwOworCWludCBzZW1tbmk7CisJaW50IHNlbW1uczsKKwlpbnQgc2VtbW51OworCWludCBzZW1tc2w7CisJaW50IHNlbW9wbTsKKwlpbnQgc2VtdW1lOworCWludCBzZW11c3o7CisJaW50IHNlbXZteDsKKwlpbnQgc2VtYWVtOworfTsKKworI2RlZmluZSBTRU1NTkkgIDEyOCAgICAgICAgICAgICAvKiA8PSBJUENNTkkgIG1heCAjIG9mIHNlbWFwaG9yZSBpZGVudGlmaWVycyAqLworI2RlZmluZSBTRU1NU0wgIDI1MCAgICAgICAgICAgICAvKiA8PSA4IDAwMCBtYXggbnVtIG9mIHNlbWFwaG9yZXMgcGVyIGlkICovCisjZGVmaW5lIFNFTU1OUyAgKFNFTU1OSSpTRU1NU0wpIC8qIDw9IElOVF9NQVggbWF4ICMgb2Ygc2VtYXBob3JlcyBpbiBzeXN0ZW0gKi8KKyNkZWZpbmUgU0VNT1BNICAzMgkgICAgICAgIC8qIDw9IDEgMDAwIG1heCBudW0gb2Ygb3BzIHBlciBzZW1vcCBjYWxsICovCisjZGVmaW5lIFNFTVZNWCAgMzI3NjcgICAgICAgICAgIC8qIDw9IDMyNzY3IHNlbWFwaG9yZSBtYXhpbXVtIHZhbHVlICovCisjZGVmaW5lIFNFTUFFTSAgU0VNVk1YICAgICAgICAgIC8qIGFkanVzdCBvbiBleGl0IG1heCB2YWx1ZSAqLworCisvKiB1bnVzZWQgKi8KKyNkZWZpbmUgU0VNVU1FICBTRU1PUE0gICAgICAgICAgLyogbWF4IG51bSBvZiB1bmRvIGVudHJpZXMgcGVyIHByb2Nlc3MgKi8KKyNkZWZpbmUgU0VNTU5VICBTRU1NTlMgICAgICAgICAgLyogbnVtIG9mIHVuZG8gc3RydWN0dXJlcyBzeXN0ZW0gd2lkZSAqLworI2RlZmluZSBTRU1NQVAgIFNFTU1OUyAgICAgICAgICAvKiAjIG9mIGVudHJpZXMgaW4gc2VtYXBob3JlIG1hcCAqLworI2RlZmluZSBTRU1VU1ogIDIwCQkvKiBzaXplb2Ygc3RydWN0IHNlbV91bmRvICovCisKKworI2VuZGlmIC8qIF9MSU5VWF9TRU1fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZXJpYWwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VyaWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5NzIzMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VyaWFsLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBpbmNsdWRlL2xpbnV4L3NlcmlhbC5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyIGJ5IFRoZW9kb3JlIFRzJ28uCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgCisgKiBQdWJsaWMgTGljZW5zZSAoR1BMKQorICovCisKKyNpZm5kZWYgX0xJTlVYX1NFUklBTF9ICisjZGVmaW5lIF9MSU5VWF9TRVJJQUxfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworCitzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB7CisJaW50CXR5cGU7CisJaW50CWxpbmU7CisJdW5zaWduZWQgaW50CXBvcnQ7CisJaW50CWlycTsKKwlpbnQJZmxhZ3M7CisJaW50CXhtaXRfZmlmb19zaXplOworCWludAljdXN0b21fZGl2aXNvcjsKKwlpbnQJYmF1ZF9iYXNlOworCXVuc2lnbmVkIHNob3J0CWNsb3NlX2RlbGF5OworCWNoYXIJaW9fdHlwZTsKKwljaGFyCXJlc2VydmVkX2NoYXJbMV07CisJaW50CWh1YjY7CisJdW5zaWduZWQgc2hvcnQJY2xvc2luZ193YWl0OyAvKiB0aW1lIHRvIHdhaXQgYmVmb3JlIGNsb3NpbmcgKi8KKwl1bnNpZ25lZCBzaG9ydAljbG9zaW5nX3dhaXQyOyAvKiBubyBsb25nZXIgdXNlZC4uLiAqLworCXVuc2lnbmVkIGNoYXIJKmlvbWVtX2Jhc2U7CisJdW5zaWduZWQgc2hvcnQJaW9tZW1fcmVnX3NoaWZ0OworCXVuc2lnbmVkIGludAlwb3J0X2hpZ2g7CisJdW5zaWduZWQgbG9uZwlpb21hcF9iYXNlOwkvKiBjb29raWUgcGFzc2VkIGludG8gaW9yZW1hcCAqLworfTsKKworLyoKKyAqIEZvciB0aGUgY2xvc2Ugd2FpdCB0aW1lcywgMCBtZWFucyB3YWl0IGZvcmV2ZXIgZm9yIHNlcmlhbCBwb3J0IHRvCisgKiBmbHVzaCBpdHMgb3V0cHV0LiAgNjU1MzUgbWVhbnMgZG9uJ3Qgd2FpdCBhdCBhbGwuCisgKi8KKyNkZWZpbmUgQVNZTkNfQ0xPU0lOR19XQUlUX0lORgkwCisjZGVmaW5lIEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FCTY1NTM1CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHN1cHBvcnRlZCBzZXJpYWwgdHlwZXMuCisgKi8KKyNkZWZpbmUgUE9SVF9VTktOT1dOCTAKKyNkZWZpbmUgUE9SVF84MjUwCTEKKyNkZWZpbmUgUE9SVF8xNjQ1MAkyCisjZGVmaW5lIFBPUlRfMTY1NTAJMworI2RlZmluZSBQT1JUXzE2NTUwQQk0CisjZGVmaW5lIFBPUlRfQ0lSUlVTICAgICA1CS8qIHVzdXJwZWQgYnkgY3ljbGFkZXMuYyAqLworI2RlZmluZSBQT1JUXzE2NjUwCTYKKyNkZWZpbmUgUE9SVF8xNjY1MFYyCTcKKyNkZWZpbmUgUE9SVF8xNjc1MAk4CisjZGVmaW5lIFBPUlRfU1RBUlRFQ0gJOQkvKiB1c3VycGVkIGJ5IGN5Y2xhZGVzLmMgKi8KKyNkZWZpbmUgUE9SVF8xNkM5NTAJMTAJLyogT3hmb3JkIFNlbWljb25kdWN0b3IgKi8KKyNkZWZpbmUgUE9SVF8xNjY1NAkxMQorI2RlZmluZSBQT1JUXzE2ODUwCTEyCisjZGVmaW5lIFBPUlRfUlNBCTEzCS8qIFJTQS1EViBJSS9TIGNhcmQgKi8KKyNkZWZpbmUgUE9SVF9NQVgJMTMKKworI2RlZmluZSBTRVJJQUxfSU9fUE9SVAkwCisjZGVmaW5lIFNFUklBTF9JT19IVUI2CTEKKyNkZWZpbmUgU0VSSUFMX0lPX01FTQkyCisKK3N0cnVjdCBzZXJpYWxfdWFydF9jb25maWcgeworCWNoYXIJKm5hbWU7CisJaW50CWRmbF94bWl0X2ZpZm9fc2l6ZTsKKwlpbnQJZmxhZ3M7Cit9OworCisjZGVmaW5lIFVBUlRfQ0xFQVJfRklGTwkJMHgwMQorI2RlZmluZSBVQVJUX1VTRV9GSUZPCQkweDAyCisjZGVmaW5lIFVBUlRfU1RBUlRFQ0gJCTB4MDQKKyNkZWZpbmUgVUFSVF9OQVRTRU1JCQkweDA4CisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgYXN5bmNfc3RydWN0IChhbmQgc2VyaWFsX3N0cnVjdCkgZmxhZ3MgZmllbGQKKyAqCisgKiBEZWZpbmUgQVNZTkNCXyogZm9yIGNvbnZlbmllbnQgdXNlIHdpdGgge3Rlc3Qsc2V0LGNsZWFyfV9iaXQuCisgKi8KKyNkZWZpbmUgQVNZTkNCX0hVUF9OT1RJRlkJIDAgLyogTm90aWZ5IGdldHR5IG9uIGhhbmd1cHMgYW5kIGNsb3NlcworCQkJCSAgICAqIG9uIHRoZSBjYWxsb3V0IHBvcnQgKi8KKyNkZWZpbmUgQVNZTkNCX0ZPVVJQT1JUCQkgMSAvKiBTZXQgT1UxLCBPVVQyIHBlciBBU1QgRm91cnBvcnQgc2V0dGluZ3MgKi8KKyNkZWZpbmUgQVNZTkNCX1NBSwkJIDIgLyogU2VjdXJlIEF0dGVudGlvbiBLZXkgKE9yYW5nZSBib29rKSAqLworI2RlZmluZSBBU1lOQ0JfU1BMSVRfVEVSTUlPUwkgMyAvKiBTZXBhcmF0ZSB0ZXJtaW9zIGZvciBkaWFsaW4vY2FsbG91dCAqLworI2RlZmluZSBBU1lOQ0JfU1BEX0hJCQkgNCAvKiBVc2UgNTYwMDAgaW5zdGVhZCBvZiAzODQwMCBicHMgKi8KKyNkZWZpbmUgQVNZTkNCX1NQRF9WSEkJCSA1IC8qIFVzZSAxMTUyMDAgaW5zdGVhZCBvZiAzODQwMCBicHMgKi8KKyNkZWZpbmUgQVNZTkNCX1NLSVBfVEVTVAkgNiAvKiBTa2lwIFVBUlQgdGVzdCBkdXJpbmcgYXV0b2NvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQVNZTkNCX0FVVE9fSVJRCQkgNyAvKiBEbyBhdXRvbWF0aWMgSVJRIGR1cmluZworCQkJCSAgICAqIGF1dG9jb25maWd1cmF0aW9uICovCisjZGVmaW5lIEFTWU5DQl9TRVNTSU9OX0xPQ0tPVVQJIDggLyogTG9jayBvdXQgY3VhIG9wZW5zIGJhc2VkIG9uIHNlc3Npb24gKi8KKyNkZWZpbmUgQVNZTkNCX1BHUlBfTE9DS09VVAkgOSAvKiBMb2NrIG91dCBjdWEgb3BlbnMgYmFzZWQgb24gcGdycCAqLworI2RlZmluZSBBU1lOQ0JfQ0FMTE9VVF9OT0hVUAkxMCAvKiBEb24ndCBkbyBoYW5ndXBzIGZvciBjdWEgZGV2aWNlICovCisjZGVmaW5lIEFTWU5DQl9IQVJEUFBTX0NECTExIC8qIENhbGwgaGFyZHBwcyB3aGVuIENEIGdvZXMgaGlnaCAgKi8KKyNkZWZpbmUgQVNZTkNCX1NQRF9TSEkJCTEyIC8qIFVzZSAyMzA0MDAgaW5zdGVhZCBvZiAzODQwMCBicHMgKi8KKyNkZWZpbmUgQVNZTkNCX0xPV19MQVRFTkNZCTEzIC8qIFJlcXVlc3QgbG93IGxhdGVuY3kgYmVoYXZpb3VyICovCisjZGVmaW5lIEFTWU5DQl9CVUdHWV9VQVJUCTE0IC8qIFRoaXMgaXMgYSBidWdneSBVQVJULCBza2lwIHNvbWUgc2FmZXR5CisJCQkJICAgICogY2hlY2tzLiAgTm90ZTogY2FuIGJlIGRhbmdlcm91cyEgKi8KKyNkZWZpbmUgQVNZTkNCX0FVVE9QUk9CRQkxNSAvKiBQb3J0IHdhcyBhdXRvcHJvYmVkIGJ5IFBDSSBvciBQTlAgY29kZSAqLworI2RlZmluZSBBU1lOQ0JfTEFTVF9VU0VSCTE1CisKKy8qIEludGVybmFsIGZsYWdzIHVzZWQgb25seSBieSBrZXJuZWwgKi8KKyNkZWZpbmUgQVNZTkNCX0lOSVRJQUxJWkVECTMxIC8qIFNlcmlhbCBwb3J0IHdhcyBpbml0aWFsaXplZCAqLworI2RlZmluZSBBU1lOQ0JfU1VTUEVOREVECTMwIC8qIFNlcmlhbCBwb3J0IGlzIHN1c3BlbmRlZCAqLworI2RlZmluZSBBU1lOQ0JfTk9STUFMX0FDVElWRQkyOSAvKiBOb3JtYWwgZGV2aWNlIGlzIGFjdGl2ZSAqLworI2RlZmluZSBBU1lOQ0JfQk9PVF9BVVRPQ09ORgkyOCAvKiBBdXRvY29uZmlndXJlIHBvcnQgb24gYm9vdHVwICovCisjZGVmaW5lIEFTWU5DQl9DTE9TSU5HCQkyNyAvKiBTZXJpYWwgcG9ydCBpcyBjbG9zaW5nICovCisjZGVmaW5lIEFTWU5DQl9DVFNfRkxPVwkJMjYgLyogRG8gQ1RTIGZsb3cgY29udHJvbCAqLworI2RlZmluZSBBU1lOQ0JfQ0hFQ0tfQ0QJCTI1IC8qIGkuZS4sIENMT0NBTCAqLworI2RlZmluZSBBU1lOQ0JfU0hBUkVfSVJRCTI0IC8qIGZvciBtdWx0aWZ1bmN0aW9uIGNhcmRzLCBubyBsb25nZXIgdXNlZCAqLworI2RlZmluZSBBU1lOQ0JfQ09OU19GTE9XCTIzIC8qIGZsb3cgY29udHJvbCBmb3IgY29uc29sZSAgKi8KKyNkZWZpbmUgQVNZTkNCX0JPT1RfT05MWU1DQQkyMiAvKiBQcm9iZSBvbmx5IGlmIE1DQSBidXMgKi8KKyNkZWZpbmUgQVNZTkNCX0ZJUlNUX0tFUk5FTAkyMgorCisjZGVmaW5lIEFTWU5DX0hVUF9OT1RJRlkJKDFVIDw8IEFTWU5DQl9IVVBfTk9USUZZKQorI2RlZmluZSBBU1lOQ19TVVNQRU5ERUQJCSgxVSA8PCBBU1lOQ0JfU1VTUEVOREVEKQorI2RlZmluZSBBU1lOQ19GT1VSUE9SVAkJKDFVIDw8IEFTWU5DQl9GT1VSUE9SVCkKKyNkZWZpbmUgQVNZTkNfU0FLCQkoMVUgPDwgQVNZTkNCX1NBSykKKyNkZWZpbmUgQVNZTkNfU1BMSVRfVEVSTUlPUwkoMVUgPDwgQVNZTkNCX1NQTElUX1RFUk1JT1MpCisjZGVmaW5lIEFTWU5DX1NQRF9ISQkJKDFVIDw8IEFTWU5DQl9TUERfSEkpCisjZGVmaW5lIEFTWU5DX1NQRF9WSEkJCSgxVSA8PCBBU1lOQ0JfU1BEX1ZISSkKKyNkZWZpbmUgQVNZTkNfU0tJUF9URVNUCQkoMVUgPDwgQVNZTkNCX1NLSVBfVEVTVCkKKyNkZWZpbmUgQVNZTkNfQVVUT19JUlEJCSgxVSA8PCBBU1lOQ0JfQVVUT19JUlEpCisjZGVmaW5lIEFTWU5DX1NFU1NJT05fTE9DS09VVAkoMVUgPDwgQVNZTkNCX1NFU1NJT05fTE9DS09VVCkKKyNkZWZpbmUgQVNZTkNfUEdSUF9MT0NLT1VUCSgxVSA8PCBBU1lOQ0JfUEdSUF9MT0NLT1VUKQorI2RlZmluZSBBU1lOQ19DQUxMT1VUX05PSFVQCSgxVSA8PCBBU1lOQ0JfQ0FMTE9VVF9OT0hVUCkKKyNkZWZpbmUgQVNZTkNfSEFSRFBQU19DRAkoMVUgPDwgQVNZTkNCX0hBUkRQUFNfQ0QpCisjZGVmaW5lIEFTWU5DX1NQRF9TSEkJCSgxVSA8PCBBU1lOQ0JfU1BEX1NISSkKKyNkZWZpbmUgQVNZTkNfTE9XX0xBVEVOQ1kJKDFVIDw8IEFTWU5DQl9MT1dfTEFURU5DWSkKKyNkZWZpbmUgQVNZTkNfQlVHR1lfVUFSVAkoMVUgPDwgQVNZTkNCX0JVR0dZX1VBUlQpCisjZGVmaW5lIEFTWU5DX0FVVE9QUk9CRQkJKDFVIDw8IEFTWU5DQl9BVVRPUFJPQkUpCisKKyNkZWZpbmUgQVNZTkNfRkxBR1MJCSgoMVUgPDwgKEFTWU5DQl9MQVNUX1VTRVIgKyAxKSkgLSAxKQorI2RlZmluZSBBU1lOQ19VU1JfTUFTSwkJKEFTWU5DX1NQRF9ISXxBU1lOQ19TUERfVkhJfCBcCisJCUFTWU5DX0NBTExPVVRfTk9IVVB8QVNZTkNfU1BEX1NISXxBU1lOQ19MT1dfTEFURU5DWSkKKyNkZWZpbmUgQVNZTkNfU1BEX0NVU1QJCShBU1lOQ19TUERfSEl8QVNZTkNfU1BEX1ZISSkKKyNkZWZpbmUgQVNZTkNfU1BEX1dBUlAJCShBU1lOQ19TUERfSEl8QVNZTkNfU1BEX1NISSkKKyNkZWZpbmUgQVNZTkNfU1BEX01BU0sJCShBU1lOQ19TUERfSEl8QVNZTkNfU1BEX1ZISXxBU1lOQ19TUERfU0hJKQorCisjZGVmaW5lIEFTWU5DX0lOSVRJQUxJWkVECSgxVSA8PCBBU1lOQ0JfSU5JVElBTElaRUQpCisjZGVmaW5lIEFTWU5DX05PUk1BTF9BQ1RJVkUJKDFVIDw8IEFTWU5DQl9OT1JNQUxfQUNUSVZFKQorI2RlZmluZSBBU1lOQ19CT09UX0FVVE9DT05GCSgxVSA8PCBBU1lOQ0JfQk9PVF9BVVRPQ09ORikKKyNkZWZpbmUgQVNZTkNfQ0xPU0lORwkJKDFVIDw8IEFTWU5DQl9DTE9TSU5HKQorI2RlZmluZSBBU1lOQ19DVFNfRkxPVwkJKDFVIDw8IEFTWU5DQl9DVFNfRkxPVykKKyNkZWZpbmUgQVNZTkNfQ0hFQ0tfQ0QJCSgxVSA8PCBBU1lOQ0JfQ0hFQ0tfQ0QpCisjZGVmaW5lIEFTWU5DX1NIQVJFX0lSUQkJKDFVIDw8IEFTWU5DQl9TSEFSRV9JUlEpCisjZGVmaW5lIEFTWU5DX0NPTlNfRkxPVwkJKDFVIDw8IEFTWU5DQl9DT05TX0ZMT1cpCisjZGVmaW5lIEFTWU5DX0JPT1RfT05MWU1DQQkoMVUgPDwgQVNZTkNCX0JPT1RfT05MWU1DQSkKKyNkZWZpbmUgQVNZTkNfSU5URVJOQUxfRkxBR1MJKH4oKDFVIDw8IEFTWU5DQl9GSVJTVF9LRVJORUwpIC0gMSkpCisKKy8qCisgKiBNdWx0aXBvcnQgc2VyaWFsIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIC0tLSBleHRlcm5hbCBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IHNlcmlhbF9tdWx0aXBvcnRfc3RydWN0IHsKKwlpbnQJCWlycTsKKwlpbnQJCXBvcnQxOworCXVuc2lnbmVkIGNoYXIJbWFzazEsIG1hdGNoMTsKKwlpbnQJCXBvcnQyOworCXVuc2lnbmVkIGNoYXIJbWFzazIsIG1hdGNoMjsKKwlpbnQJCXBvcnQzOworCXVuc2lnbmVkIGNoYXIJbWFzazMsIG1hdGNoMzsKKwlpbnQJCXBvcnQ0OworCXVuc2lnbmVkIGNoYXIJbWFzazQsIG1hdGNoNDsKKwlpbnQJCXBvcnRfbW9uaXRvcjsKKwlpbnQJcmVzZXJ2ZWRbMzJdOworfTsKKworLyoKKyAqIFNlcmlhbCBpbnB1dCBpbnRlcnJ1cHQgbGluZSBjb3VudGVycyAtLSBleHRlcm5hbCBzdHJ1Y3R1cmUKKyAqIEZvdXIgbGluZXMgY2FuIGludGVycnVwdDogQ1RTLCBEU1IsIFJJLCBEQ0QKKyAqLworc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgeworCWludCBjdHMsIGRzciwgcm5nLCBkY2Q7CisJaW50IHJ4LCB0eDsKKwlpbnQgZnJhbWUsIG92ZXJydW4sIHBhcml0eSwgYnJrOworCWludCBidWZfb3ZlcnJ1bjsKKwlpbnQgcmVzZXJ2ZWRbOV07Cit9OworCisvKgorICogU2VyaWFsIGludGVyZmFjZSBmb3IgY29udHJvbGxpbmcgUlM0ODUgc2V0dGluZ3Mgb24gY2hpcHMgd2l0aCBzdWl0YWJsZQorICogc3VwcG9ydC4gU2V0IHdpdGggVElPQ1NSUzQ4NSBhbmQgZ2V0IHdpdGggVElPQ0dSUzQ4NSBpZiBzdXBwb3J0ZWQgYnkgeW91cgorICogcGxhdGZvcm0uIFRoZSBzZXQgZnVuY3Rpb24gcmV0dXJucyB0aGUgbmV3IHN0YXRlLCB3aXRoIGFueSB1bnN1cHBvcnRlZCBiaXRzCisgKiByZXZlcnRlZCBhcHByb3ByaWF0ZWx5LgorICovCisKK3N0cnVjdCBzZXJpYWxfcnM0ODUgeworCV9fdTMyCWZsYWdzOwkJCS8qIFJTNDg1IGZlYXR1cmUgZmxhZ3MgKi8KKyNkZWZpbmUgU0VSX1JTNDg1X0VOQUJMRUQJCSgxIDw8IDApCS8qIElmIGVuYWJsZWQgKi8KKyNkZWZpbmUgU0VSX1JTNDg1X1JUU19PTl9TRU5ECQkoMSA8PCAxKQkvKiBMb2dpY2FsIGxldmVsIGZvcgorCQkJCQkJCSAgIFJUUyBwaW4gd2hlbgorCQkJCQkJCSAgIHNlbmRpbmcgKi8KKyNkZWZpbmUgU0VSX1JTNDg1X1JUU19BRlRFUl9TRU5ECSgxIDw8IDIpCS8qIExvZ2ljYWwgbGV2ZWwgZm9yCisJCQkJCQkJICAgUlRTIHBpbiBhZnRlciBzZW50Ki8KKyNkZWZpbmUgU0VSX1JTNDg1X1JYX0RVUklOR19UWAkJKDEgPDwgNCkKKwlfX3UzMglkZWxheV9ydHNfYmVmb3JlX3NlbmQ7CS8qIERlbGF5IGJlZm9yZSBzZW5kIChtaWxsaXNlY29uZHMpICovCisJX191MzIJZGVsYXlfcnRzX2FmdGVyX3NlbmQ7CS8qIERlbGF5IGFmdGVyIHNlbmQgKG1pbGxpc2Vjb25kcykgKi8KKwlfX3UzMglwYWRkaW5nWzVdOwkJLyogTWVtb3J5IGlzIGNoZWFwLCBuZXcgc3RydWN0cworCQkJCQkgICBhcmUgYSByb3lhbCBQSVRBIC4uICovCit9OworCisjZW5kaWYgLyogX0xJTlVYX1NFUklBTF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxNzNlYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaApAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2NoYXIvc2VyaWFsX2NvcmUuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaWZuZGVmIExJTlVYX1NFUklBTF9DT1JFX0gKKyNkZWZpbmUgTElOVVhfU0VSSUFMX0NPUkVfSAorCisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisKKy8qCisgKiBUaGUgdHlwZSBkZWZpbml0aW9ucy4gIFRoZXNlIGFyZSBmcm9tIFRlZCBUcydvJ3Mgc2VyaWFsLmgKKyAqLworI2RlZmluZSBQT1JUX1VOS05PV04JMAorI2RlZmluZSBQT1JUXzgyNTAJMQorI2RlZmluZSBQT1JUXzE2NDUwCTIKKyNkZWZpbmUgUE9SVF8xNjU1MAkzCisjZGVmaW5lIFBPUlRfMTY1NTBBCTQKKyNkZWZpbmUgUE9SVF9DSVJSVVMJNQorI2RlZmluZSBQT1JUXzE2NjUwCTYKKyNkZWZpbmUgUE9SVF8xNjY1MFYyCTcKKyNkZWZpbmUgUE9SVF8xNjc1MAk4CisjZGVmaW5lIFBPUlRfU1RBUlRFQ0gJOQorI2RlZmluZSBQT1JUXzE2Qzk1MAkxMAorI2RlZmluZSBQT1JUXzE2NjU0CTExCisjZGVmaW5lIFBPUlRfMTY4NTAJMTIKKyNkZWZpbmUgUE9SVF9SU0EJMTMKKyNkZWZpbmUgUE9SVF9OUzE2NTUwQQkxNAorI2RlZmluZSBQT1JUX1hTQ0FMRQkxNQorI2RlZmluZSBQT1JUX1JNOTAwMAkxNgkvKiBQTUMtU2llcnJhIFJNOXh4eCBpbnRlcm5hbCBVQVJUICovCisjZGVmaW5lIFBPUlRfT0NURU9OCTE3CS8qIENhdml1bSBPQ1RFT04gaW50ZXJuYWwgVUFSVCAqLworI2RlZmluZSBQT1JUX0FSNwkxOAkvKiBUZXhhcyBJbnN0cnVtZW50cyBBUjcgaW50ZXJuYWwgVUFSVCAqLworI2RlZmluZSBQT1JUX1U2XzE2NTUwQQkxOQkvKiBTVC1Fcmljc3NvbiBVNnh4eCBpbnRlcm5hbCBVQVJUICovCisjZGVmaW5lIFBPUlRfVEVHUkEJMjAJLyogTlZJRElBIFRlZ3JhIGludGVybmFsIFVBUlQgKi8KKyNkZWZpbmUgUE9SVF9YUjE3RDE1WAkyMQkvKiBFeGFyIFhSMTdEMTV4IFVBUlQgKi8KKyNkZWZpbmUgUE9SVF9NQVhfODI1MAkyMQkvKiBtYXggcG9ydCBJRCAqLworCisvKgorICogQVJNIHNwZWNpZmljIHR5cGUgbnVtYmVycy4gIFRoZXNlIGFyZSBub3QgY3VycmVudGx5IGd1YXJhbnRlZWQKKyAqIHRvIGJlIGltcGxlbWVudGVkLCBhbmQgd2lsbCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4gIFRoZXNlIGFyZQorICogc2VwYXJhdGUgc28gYW55IGFkZGl0aW9ucyB0byB0aGUgb2xkIHNlcmlhbC5jIHRoYXQgb2NjdXIgYmVmb3JlCisgKiB3ZSBhcmUgbWVyZ2VkIGNhbiBiZSBlYXNpbHkgbWVyZ2VkIGhlcmUuCisgKi8KKyNkZWZpbmUgUE9SVF9QWEEJMzEKKyNkZWZpbmUgUE9SVF9BTUJBCTMyCisjZGVmaW5lIFBPUlRfQ0xQUzcxMVgJMzMKKyNkZWZpbmUgUE9SVF9TQTExMDAJMzQKKyNkZWZpbmUgUE9SVF9VQVJUMDAJMzUKKyNkZWZpbmUgUE9SVF8yMTI4NQkzNworCisvKiBTcGFyYyB0eXBlIG51bWJlcnMuICAqLworI2RlZmluZSBQT1JUX1NVTlpJTE9HCTM4CisjZGVmaW5lIFBPUlRfU1VOU0FCCTM5CisKKy8qIERFQyAqLworI2RlZmluZSBQT1JUX0RaCQk0NgorI2RlZmluZSBQT1JUX1pTCQk0NworCisvKiBQYXJpc2MgdHlwZSBudW1iZXJzLiAqLworI2RlZmluZSBQT1JUX01VWAk0OAorCisvKiBBdG1lbCBBVDkxIC8gQVQzMiBTb0MgKi8KKyNkZWZpbmUgUE9SVF9BVE1FTAk0OQorCisvKiBNYWNpbnRvc2ggWmlsb2cgdHlwZSBudW1iZXJzICovCisjZGVmaW5lIFBPUlRfTUFDX1pJTE9HCTUwCS8qIG02OGsgOiBub3QgeWV0IGltcGxlbWVudGVkICovCisjZGVmaW5lIFBPUlRfUE1BQ19aSUxPRwk1MQorCisvKiBTSC1TQ0kgKi8KKyNkZWZpbmUgUE9SVF9TQ0kJNTIKKyNkZWZpbmUgUE9SVF9TQ0lGCTUzCisjZGVmaW5lIFBPUlRfSVJEQQk1NAorCisvKiBTYW1zdW5nIFMzQzI0MTAgU29DIGFuZCBkZXJpdmF0aXZlcyB0aGVyZW9mICovCisjZGVmaW5lIFBPUlRfUzNDMjQxMCAgICA1NQorCisvKiBTR0kgSVAyMiBha2EgSW5keSAvIENoYWxsZW5nZSBTIC8gSW5kaWdvIDIgKi8KKyNkZWZpbmUgUE9SVF9JUDIyWklMT0cJNTYKKworLyogU2hhcnAgTEg3YTQweCAtLSBhbiBBUk05IFNvQyBzZXJpZXMgKi8KKyNkZWZpbmUgUE9SVF9MSDdBNDBYCTU3CisKKy8qIFBQQyBDUE0gdHlwZSBudW1iZXIgKi8KKyNkZWZpbmUgUE9SVF9DUE0gICAgICAgIDU4CisKKy8qIE1QQzUyeHggKGFuZCBNUEM1MTJ4KSB0eXBlIG51bWJlcnMgKi8KKyNkZWZpbmUgUE9SVF9NUEM1Mnh4CTU5CisKKy8qIElCTSBpY29tICovCisjZGVmaW5lIFBPUlRfSUNPTQk2MAorCisvKiBTYW1zdW5nIFMzQzI0NDAgU29DICovCisjZGVmaW5lIFBPUlRfUzNDMjQ0MAk2MQorCisvKiBNb3Rvcm9sYSBpLk1YIFNvQyAqLworI2RlZmluZSBQT1JUX0lNWAk2MgorCisvKiBNYXJ2ZWxsIE1QU0MgKi8KKyNkZWZpbmUgUE9SVF9NUFNDCTYzCisKKy8qIFRYWDkgdHlwZSBudW1iZXIgKi8KKyNkZWZpbmUgUE9SVF9UWFg5CTY0CisKKy8qIE5FQyBWUjQxMDAgc2VyaWVzIFNJVS9EU0lVICovCisjZGVmaW5lIFBPUlRfVlI0MVhYX1NJVQkJNjUKKyNkZWZpbmUgUE9SVF9WUjQxWFhfRFNJVQk2NgorCisvKiBTYW1zdW5nIFMzQzI0MDAgU29DICovCisjZGVmaW5lIFBPUlRfUzNDMjQwMAk2NworCisvKiBNMzJSIFNJTyAqLworI2RlZmluZSBQT1JUX00zMlJfU0lPCTY4CisKKy8qRGlnaSBqc20gKi8KKyNkZWZpbmUgUE9SVF9KU00gICAgICAgIDY5CisKKyNkZWZpbmUgUE9SVF9QTlg4WFhYCTcwCisKKy8qIEhpbHNjaGVyIG5ldHggKi8KKyNkZWZpbmUgUE9SVF9ORVRYCTcxCisKKy8qIFNVTjRWIEh5cGVydmlzb3IgQ29uc29sZSAqLworI2RlZmluZSBQT1JUX1NVTkhWCTcyCisKKyNkZWZpbmUgUE9SVF9TM0MyNDEyCTczCisKKy8qIFhpbGlueCB1YXJ0bGl0ZSAqLworI2RlZmluZSBQT1JUX1VBUlRMSVRFCTc0CisKKy8qIEJsYWNrZmluIGJmNXh4ICovCisjZGVmaW5lIFBPUlRfQkZJTgk3NQorCisvKiBNaWNyZWwgS1M4Njk1ICovCisjZGVmaW5lIFBPUlRfS1M4Njk1CTc2CisKKy8qIEJyb2FkY29tIFNCMTI1MCwgZXRjLiBTT0MgKi8KKyNkZWZpbmUgUE9SVF9TQjEyNTBfRFVBUlQJNzcKKworLyogRnJlZXNjYWxlIENvbGRGaXJlICovCisjZGVmaW5lIFBPUlRfTUNGCTc4CisKKy8qIEJsYWNrZmluIFNQT1JUICovCisjZGVmaW5lIFBPUlRfQkZJTl9TUE9SVAkJNzkKKworLyogTU4xMDMwMCBvbi1jaGlwIFVBUlQgbnVtYmVycyAqLworI2RlZmluZSBQT1JUX01OMTAzMDAJCTgwCisjZGVmaW5lIFBPUlRfTU4xMDMwMF9DVFMJODEKKworI2RlZmluZSBQT1JUX1NDMjZYWAk4MgorCisvKiBTSC1TQ0kgKi8KKyNkZWZpbmUgUE9SVF9TQ0lGQQk4MworCisjZGVmaW5lIFBPUlRfUzNDNjQwMAk4NAorCisvKiBOV1BTRVJJQUwgKi8KKyNkZWZpbmUgUE9SVF9OV1BTRVJJQUwJODUKKworLyogTUFYMzEwMCAqLworI2RlZmluZSBQT1JUX01BWDMxMDAgICAgODYKKworLyogVGltYmVyZGFsZSBVQVJUICovCisjZGVmaW5lIFBPUlRfVElNQlVBUlQJODcKKworLyogUXVhbGNvbW0gTVNNIFNvQ3MgKi8KKyNkZWZpbmUgUE9SVF9NU00JODgKKworLyogQkNNNjN4eCBmYW1pbHkgU29DcyAqLworI2RlZmluZSBQT1JUX0JDTTYzWFgJODkKKworLyogQWVyb2ZsZXggR2Fpc2xlciBHUkxJQiBBUEJVQVJUICovCisjZGVmaW5lIFBPUlRfQVBCVUFSVCAgICA5MAorCisvKiBBbHRlcmEgVUFSVHMgKi8KKyNkZWZpbmUgUE9SVF9BTFRFUkFfSlRBR1VBUlQJOTEKKyNkZWZpbmUgUE9SVF9BTFRFUkFfVUFSVAk5MgorCisvKiBTSC1TQ0kgKi8KKyNkZWZpbmUgUE9SVF9TQ0lGQgk5MworCisvKiBNQVgzMTA3ICovCisjZGVmaW5lIFBPUlRfTUFYMzEwNwk5NAorCisvKiBIaWdoIFNwZWVkIFVBUlQgZm9yIE1lZGZpZWxkICovCisjZGVmaW5lIFBPUlRfTUZECTk1CisKKy8qIFRJIE9NQVAtVUFSVCAqLworI2RlZmluZSBQT1JUX09NQVAJOTYKKworLyogVklBIFZUODUwMCBTb0MgKi8KKyNkZWZpbmUgUE9SVF9WVDg1MDAJOTcKKworLyogWGlsaW54IFBTUyBVQVJUICovCisjZGVmaW5lIFBPUlRfWFVBUlRQUwk5OAorCisKKyNlbmRpZiAvKiBMSU5VWF9TRVJJQUxfQ09SRV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlcmlhbF9yZWcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VyaWFsX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZTcwZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlcmlhbF9yZWcuaApAQCAtMCwwICsxLDM2NyBAQAorLyoKKyAqIGluY2x1ZGUvbGludXgvc2VyaWFsX3JlZy5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0IGJ5IFRoZW9kb3JlIFRzJ28uCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgCisgKiBQdWJsaWMgTGljZW5zZSAoR1BMKQorICogCisgKiBUaGVzZSBhcmUgdGhlIFVBUlQgcG9ydCBhc3NpZ25tZW50cywgZXhwcmVzc2VkIGFzIG9mZnNldHMgZnJvbSB0aGUgYmFzZQorICogcmVnaXN0ZXIuICBUaGVzZSBhc3NpZ25tZW50cyBzaG91bGQgaG9sZCBmb3IgYW55IHNlcmlhbCBwb3J0IGJhc2VkIG9uCisgKiBhIDgyNTAsIDE2NDUwLCBvciAxNjU1MChBKS4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9TRVJJQUxfUkVHX0gKKyNkZWZpbmUgX0xJTlVYX1NFUklBTF9SRUdfSAorCisvKgorICogRExBQj0wCisgKi8KKyNkZWZpbmUgVUFSVF9SWAkJMAkvKiBJbjogIFJlY2VpdmUgYnVmZmVyICovCisjZGVmaW5lIFVBUlRfVFgJCTAJLyogT3V0OiBUcmFuc21pdCBidWZmZXIgKi8KKworI2RlZmluZSBVQVJUX0lFUgkxCS8qIE91dDogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBVQVJUX0lFUl9NU0kJCTB4MDggLyogRW5hYmxlIE1vZGVtIHN0YXR1cyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVUFSVF9JRVJfUkxTSQkJMHgwNCAvKiBFbmFibGUgcmVjZWl2ZXIgbGluZSBzdGF0dXMgaW50ZXJydXB0ICovCisjZGVmaW5lIFVBUlRfSUVSX1RIUkkJCTB4MDIgLyogRW5hYmxlIFRyYW5zbWl0dGVyIGhvbGRpbmcgcmVnaXN0ZXIgaW50LiAqLworI2RlZmluZSBVQVJUX0lFUl9SREkJCTB4MDEgLyogRW5hYmxlIHJlY2VpdmVyIGRhdGEgaW50ZXJydXB0ICovCisvKgorICogU2xlZXAgbW9kZSBmb3IgU1QxNjY1MCBhbmQgVEkxNjc1MC4gIEZvciB0aGUgU1QxNjY1MCwgRUZSWzRdPTEKKyAqLworI2RlZmluZSBVQVJUX0lFUlhfU0xFRVAJCTB4MTAgLyogRW5hYmxlIHNsZWVwIG1vZGUgKi8KKworI2RlZmluZSBVQVJUX0lJUgkyCS8qIEluOiAgSW50ZXJydXB0IElEIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfSUlSX05PX0lOVAkJMHgwMSAvKiBObyBpbnRlcnJ1cHRzIHBlbmRpbmcgKi8KKyNkZWZpbmUgVUFSVF9JSVJfSUQJCTB4MDYgLyogTWFzayBmb3IgdGhlIGludGVycnVwdCBJRCAqLworI2RlZmluZSBVQVJUX0lJUl9NU0kJCTB4MDAgLyogTW9kZW0gc3RhdHVzIGludGVycnVwdCAqLworI2RlZmluZSBVQVJUX0lJUl9USFJJCQkweDAyIC8qIFRyYW5zbWl0dGVyIGhvbGRpbmcgcmVnaXN0ZXIgZW1wdHkgKi8KKyNkZWZpbmUgVUFSVF9JSVJfUkRJCQkweDA0IC8qIFJlY2VpdmVyIGRhdGEgaW50ZXJydXB0ICovCisjZGVmaW5lIFVBUlRfSUlSX1JMU0kJCTB4MDYgLyogUmVjZWl2ZXIgbGluZSBzdGF0dXMgaW50ZXJydXB0ICovCisKKyNkZWZpbmUgVUFSVF9JSVJfQlVTWQkJMHgwNyAvKiBEZXNpZ25XYXJlIEFQQiBCdXN5IERldGVjdCAqLworCisjZGVmaW5lIFVBUlRfRkNSCTIJLyogT3V0OiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9GQ1JfRU5BQkxFX0ZJRk8JMHgwMSAvKiBFbmFibGUgdGhlIEZJRk8gKi8KKyNkZWZpbmUgVUFSVF9GQ1JfQ0xFQVJfUkNWUgkweDAyIC8qIENsZWFyIHRoZSBSQ1ZSIEZJRk8gKi8KKyNkZWZpbmUgVUFSVF9GQ1JfQ0xFQVJfWE1JVAkweDA0IC8qIENsZWFyIHRoZSBYTUlUIEZJRk8gKi8KKyNkZWZpbmUgVUFSVF9GQ1JfRE1BX1NFTEVDVAkweDA4IC8qIEZvciBETUEgYXBwbGljYXRpb25zICovCisvKgorICogTm90ZTogVGhlIEZJRk8gdHJpZ2dlciBsZXZlbHMgYXJlIGNoaXAgc3BlY2lmaWM6CisgKglSWDo3NiA9IDAwICAwMSAgMTAgIDExCVRYOjU0ID0gMDAgIDAxICAxMCAgMTEKKyAqIFBDMTY1NTBEOgkgMSAgIDQgICA4ICAxNAkJeHggIHh4ICB4eCAgeHgKKyAqIFRJMTZDNTUwQToJIDEgICA0ICAgOCAgMTQgICAgICAgICAgeHggIHh4ICB4eCAgeHgKKyAqIFRJMTZDNTUwQzoJIDEgICA0ICAgOCAgMTQgICAgICAgICAgeHggIHh4ICB4eCAgeHgKKyAqIFNUMTZDNTUwOgkgMSAgIDQgICA4ICAxNAkJeHggIHh4ICB4eCAgeHgKKyAqIFNUMTZDNjUwOgkgOCAgMTYgIDI0ICAyOAkJMTYgICA4ICAyNCAgMzAJUE9SVF8xNjY1MFYyCisgKiBOUzE2QzU1MjoJIDEgICA0ICAgOCAgMTQJCXh4ICB4eCAgeHggIHh4CisgKiBTVDE2QzY1NDoJIDggIDE2ICA1NiAgNjAJCSA4ICAxNiAgMzIgIDU2CVBPUlRfMTY2NTQKKyAqIFRJMTZDNzUwOgkgMSAgMTYgIDMyICA1NgkJeHggIHh4ICB4eCAgeHgJUE9SVF8xNjc1MAorICogVEkxNkM3NTI6CSA4ICAxNiAgNTYgIDYwCQkgOCAgMTYgIDMyICA1NgorICogVGVncmE6CSAxICAgNCAgIDggIDE0CQkxNiAgIDggICA0ICAgMQlQT1JUX1RFR1JBCisgKi8KKyNkZWZpbmUgVUFSVF9GQ1JfUl9UUklHXzAwCTB4MDAKKyNkZWZpbmUgVUFSVF9GQ1JfUl9UUklHXzAxCTB4NDAKKyNkZWZpbmUgVUFSVF9GQ1JfUl9UUklHXzEwCTB4ODAKKyNkZWZpbmUgVUFSVF9GQ1JfUl9UUklHXzExCTB4YzAKKyNkZWZpbmUgVUFSVF9GQ1JfVF9UUklHXzAwCTB4MDAKKyNkZWZpbmUgVUFSVF9GQ1JfVF9UUklHXzAxCTB4MTAKKyNkZWZpbmUgVUFSVF9GQ1JfVF9UUklHXzEwCTB4MjAKKyNkZWZpbmUgVUFSVF9GQ1JfVF9UUklHXzExCTB4MzAKKworI2RlZmluZSBVQVJUX0ZDUl9UUklHR0VSX01BU0sJMHhDMCAvKiBNYXNrIGZvciB0aGUgRklGTyB0cmlnZ2VyIHJhbmdlICovCisjZGVmaW5lIFVBUlRfRkNSX1RSSUdHRVJfMQkweDAwIC8qIE1hc2sgZm9yIHRyaWdnZXIgc2V0IGF0IDEgKi8KKyNkZWZpbmUgVUFSVF9GQ1JfVFJJR0dFUl80CTB4NDAgLyogTWFzayBmb3IgdHJpZ2dlciBzZXQgYXQgNCAqLworI2RlZmluZSBVQVJUX0ZDUl9UUklHR0VSXzgJMHg4MCAvKiBNYXNrIGZvciB0cmlnZ2VyIHNldCBhdCA4ICovCisjZGVmaW5lIFVBUlRfRkNSX1RSSUdHRVJfMTQJMHhDMCAvKiBNYXNrIGZvciB0cmlnZ2VyIHNldCBhdCAxNCAqLworLyogMTY2NTAgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVUFSVF9GQ1I2X1JfVFJJR0dFUl84CTB4MDAgLyogTWFzayBmb3IgcmVjZWl2ZSB0cmlnZ2VyIHNldCBhdCAxICovCisjZGVmaW5lIFVBUlRfRkNSNl9SX1RSSUdHRVJfMTYJMHg0MCAvKiBNYXNrIGZvciByZWNlaXZlIHRyaWdnZXIgc2V0IGF0IDQgKi8KKyNkZWZpbmUgVUFSVF9GQ1I2X1JfVFJJR0dFUl8yNCAgMHg4MCAvKiBNYXNrIGZvciByZWNlaXZlIHRyaWdnZXIgc2V0IGF0IDggKi8KKyNkZWZpbmUgVUFSVF9GQ1I2X1JfVFJJR0dFUl8yOAkweEMwIC8qIE1hc2sgZm9yIHJlY2VpdmUgdHJpZ2dlciBzZXQgYXQgMTQgKi8KKyNkZWZpbmUgVUFSVF9GQ1I2X1RfVFJJR0dFUl8xNgkweDAwIC8qIE1hc2sgZm9yIHRyYW5zbWl0IHRyaWdnZXIgc2V0IGF0IDE2ICovCisjZGVmaW5lIFVBUlRfRkNSNl9UX1RSSUdHRVJfOAkweDEwIC8qIE1hc2sgZm9yIHRyYW5zbWl0IHRyaWdnZXIgc2V0IGF0IDggKi8KKyNkZWZpbmUgVUFSVF9GQ1I2X1RfVFJJR0dFUl8yNCAgMHgyMCAvKiBNYXNrIGZvciB0cmFuc21pdCB0cmlnZ2VyIHNldCBhdCAyNCAqLworI2RlZmluZSBVQVJUX0ZDUjZfVF9UUklHR0VSXzMwCTB4MzAgLyogTWFzayBmb3IgdHJhbnNtaXQgdHJpZ2dlciBzZXQgYXQgMzAgKi8KKyNkZWZpbmUgVUFSVF9GQ1I3XzY0QllURQkweDIwIC8qIEdvIGludG8gNjQgYnl0ZSBtb2RlIChUSTE2Qzc1MCkgKi8KKworI2RlZmluZSBVQVJUX0xDUgkzCS8qIE91dDogTGluZSBDb250cm9sIFJlZ2lzdGVyICovCisvKgorICogTm90ZTogaWYgdGhlIHdvcmQgbGVuZ3RoIGlzIDUgYml0cyAoVUFSVF9MQ1JfV0xFTjUpLCB0aGVuIHNldHRpbmcgCisgKiBVQVJUX0xDUl9TVE9QIHdpbGwgc2VsZWN0IDEuNSBzdG9wIGJpdHMsIG5vdCAyIHN0b3AgYml0cy4KKyAqLworI2RlZmluZSBVQVJUX0xDUl9ETEFCCQkweDgwIC8qIERpdmlzb3IgbGF0Y2ggYWNjZXNzIGJpdCAqLworI2RlZmluZSBVQVJUX0xDUl9TQkMJCTB4NDAgLyogU2V0IGJyZWFrIGNvbnRyb2wgKi8KKyNkZWZpbmUgVUFSVF9MQ1JfU1BBUgkJMHgyMCAvKiBTdGljayBwYXJpdHkgKD8pICovCisjZGVmaW5lIFVBUlRfTENSX0VQQVIJCTB4MTAgLyogRXZlbiBwYXJpdHkgc2VsZWN0ICovCisjZGVmaW5lIFVBUlRfTENSX1BBUklUWQkJMHgwOCAvKiBQYXJpdHkgRW5hYmxlICovCisjZGVmaW5lIFVBUlRfTENSX1NUT1AJCTB4MDQgLyogU3RvcCBiaXRzOiAwPTEgYml0LCAxPTIgYml0cyAqLworI2RlZmluZSBVQVJUX0xDUl9XTEVONQkJMHgwMCAvKiBXb3JkbGVuZ3RoOiA1IGJpdHMgKi8KKyNkZWZpbmUgVUFSVF9MQ1JfV0xFTjYJCTB4MDEgLyogV29yZGxlbmd0aDogNiBiaXRzICovCisjZGVmaW5lIFVBUlRfTENSX1dMRU43CQkweDAyIC8qIFdvcmRsZW5ndGg6IDcgYml0cyAqLworI2RlZmluZSBVQVJUX0xDUl9XTEVOOAkJMHgwMyAvKiBXb3JkbGVuZ3RoOiA4IGJpdHMgKi8KKworLyoKKyAqIEFjY2VzcyB0byBzb21lIHJlZ2lzdGVycyBkZXBlbmRzIG9uIHJlZ2lzdGVyIGFjY2VzcyAvIGNvbmZpZ3VyYXRpb24KKyAqIG1vZGUuCisgKi8KKyNkZWZpbmUgVUFSVF9MQ1JfQ09ORl9NT0RFX0EJVUFSVF9MQ1JfRExBQgkvKiBDb25maWd1dGF0aW9uIG1vZGUgQSAqLworI2RlZmluZSBVQVJUX0xDUl9DT05GX01PREVfQgkweEJGCQkvKiBDb25maWd1dGF0aW9uIG1vZGUgQiAqLworCisjZGVmaW5lIFVBUlRfTUNSCTQJLyogT3V0OiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfTUNSX0NMS1NFTAkJMHg4MCAvKiBEaXZpZGUgY2xvY2sgYnkgNCAoVEkxNkM3NTIsIEVGUls0XT0xKSAqLworI2RlZmluZSBVQVJUX01DUl9UQ1JUTFIJCTB4NDAgLyogQWNjZXNzIFRDUi9UTFIgKFRJMTZDNzUyLCBFRlJbNF09MSkgKi8KKyNkZWZpbmUgVUFSVF9NQ1JfWE9OQU5ZCQkweDIwIC8qIEVuYWJsZSBYb24gQW55IChUSTE2Qzc1MiwgRUZSWzRdPTEpICovCisjZGVmaW5lIFVBUlRfTUNSX0FGRQkJMHgyMCAvKiBFbmFibGUgYXV0by1SVFMvQ1RTIChUSTE2QzU1MEMvVEkxNkM3NTApICovCisjZGVmaW5lIFVBUlRfTUNSX0xPT1AJCTB4MTAgLyogRW5hYmxlIGxvb3BiYWNrIHRlc3QgbW9kZSAqLworI2RlZmluZSBVQVJUX01DUl9PVVQyCQkweDA4IC8qIE91dDIgY29tcGxlbWVudCAqLworI2RlZmluZSBVQVJUX01DUl9PVVQxCQkweDA0IC8qIE91dDEgY29tcGxlbWVudCAqLworI2RlZmluZSBVQVJUX01DUl9SVFMJCTB4MDIgLyogUlRTIGNvbXBsZW1lbnQgKi8KKyNkZWZpbmUgVUFSVF9NQ1JfRFRSCQkweDAxIC8qIERUUiBjb21wbGVtZW50ICovCisKKyNkZWZpbmUgVUFSVF9MU1IJNQkvKiBJbjogIExpbmUgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfTFNSX0ZJRk9FCQkweDgwIC8qIEZpZm8gZXJyb3IgKi8KKyNkZWZpbmUgVUFSVF9MU1JfVEVNVAkJMHg0MCAvKiBUcmFuc21pdHRlciBlbXB0eSAqLworI2RlZmluZSBVQVJUX0xTUl9USFJFCQkweDIwIC8qIFRyYW5zbWl0LWhvbGQtcmVnaXN0ZXIgZW1wdHkgKi8KKyNkZWZpbmUgVUFSVF9MU1JfQkkJCTB4MTAgLyogQnJlYWsgaW50ZXJydXB0IGluZGljYXRvciAqLworI2RlZmluZSBVQVJUX0xTUl9GRQkJMHgwOCAvKiBGcmFtZSBlcnJvciBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgVUFSVF9MU1JfUEUJCTB4MDQgLyogUGFyaXR5IGVycm9yIGluZGljYXRvciAqLworI2RlZmluZSBVQVJUX0xTUl9PRQkJMHgwMiAvKiBPdmVycnVuIGVycm9yIGluZGljYXRvciAqLworI2RlZmluZSBVQVJUX0xTUl9EUgkJMHgwMSAvKiBSZWNlaXZlciBkYXRhIHJlYWR5ICovCisjZGVmaW5lIFVBUlRfTFNSX0JSS19FUlJPUl9CSVRTCTB4MUUgLyogQkksIEZFLCBQRSwgT0UgYml0cyAqLworCisjZGVmaW5lIFVBUlRfTVNSCTYJLyogSW46ICBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9NU1JfRENECQkweDgwIC8qIERhdGEgQ2FycmllciBEZXRlY3QgKi8KKyNkZWZpbmUgVUFSVF9NU1JfUkkJCTB4NDAgLyogUmluZyBJbmRpY2F0b3IgKi8KKyNkZWZpbmUgVUFSVF9NU1JfRFNSCQkweDIwIC8qIERhdGEgU2V0IFJlYWR5ICovCisjZGVmaW5lIFVBUlRfTVNSX0NUUwkJMHgxMCAvKiBDbGVhciB0byBTZW5kICovCisjZGVmaW5lIFVBUlRfTVNSX0REQ0QJCTB4MDggLyogRGVsdGEgRENEICovCisjZGVmaW5lIFVBUlRfTVNSX1RFUkkJCTB4MDQgLyogVHJhaWxpbmcgZWRnZSByaW5nIGluZGljYXRvciAqLworI2RlZmluZSBVQVJUX01TUl9ERFNSCQkweDAyIC8qIERlbHRhIERTUiAqLworI2RlZmluZSBVQVJUX01TUl9EQ1RTCQkweDAxIC8qIERlbHRhIENUUyAqLworI2RlZmluZSBVQVJUX01TUl9BTllfREVMVEEJMHgwRiAvKiBBbnkgb2YgdGhlIGRlbHRhIGJpdHMhICovCisKKyNkZWZpbmUgVUFSVF9TQ1IJNwkvKiBJL086IFNjcmF0Y2ggUmVnaXN0ZXIgKi8KKworLyoKKyAqIERMQUI9MQorICovCisjZGVmaW5lIFVBUlRfRExMCTAJLyogT3V0OiBEaXZpc29yIExhdGNoIExvdyAqLworI2RlZmluZSBVQVJUX0RMTQkxCS8qIE91dDogRGl2aXNvciBMYXRjaCBIaWdoICovCisKKy8qCisgKiBMQ1I9MHhCRiAob3IgRExBQj0xIGZvciAxNkM2NjApCisgKi8KKyNkZWZpbmUgVUFSVF9FRlIJMgkvKiBJL086IEV4dGVuZGVkIEZlYXR1cmVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfWFJfRUZSCTkJLyogSS9POiBFeHRlbmRlZCBGZWF0dXJlcyBSZWdpc3RlciAoWFIxN0QxNXgpICovCisjZGVmaW5lIFVBUlRfRUZSX0NUUwkJMHg4MCAvKiBDVFMgZmxvdyBjb250cm9sICovCisjZGVmaW5lIFVBUlRfRUZSX1JUUwkJMHg0MCAvKiBSVFMgZmxvdyBjb250cm9sICovCisjZGVmaW5lIFVBUlRfRUZSX1NDRAkJMHgyMCAvKiBTcGVjaWFsIGNoYXJhY3RlciBkZXRlY3QgKi8KKyNkZWZpbmUgVUFSVF9FRlJfRUNCCQkweDEwIC8qIEVuaGFuY2VkIGNvbnRyb2wgYml0ICovCisvKgorICogdGhlIGxvdyBmb3VyIGJpdHMgY29udHJvbCBzb2Z0d2FyZSBmbG93IGNvbnRyb2wKKyAqLworCisvKgorICogTENSPTB4QkYsIFRJMTZDNzUyLCBTVDE2NjUwLCBTVDE2NjUwQSwgU1QxNjY1NAorICovCisjZGVmaW5lIFVBUlRfWE9OMQk0CS8qIEkvTzogWG9uIGNoYXJhY3RlciAxICovCisjZGVmaW5lIFVBUlRfWE9OMgk1CS8qIEkvTzogWG9uIGNoYXJhY3RlciAyICovCisjZGVmaW5lIFVBUlRfWE9GRjEJNgkvKiBJL086IFhvZmYgY2hhcmFjdGVyIDEgKi8KKyNkZWZpbmUgVUFSVF9YT0ZGMgk3CS8qIEkvTzogWG9mZiBjaGFyYWN0ZXIgMiAqLworCisvKgorICogRUZSWzRdPTEgTUNSWzZdPTEsIFRJMTZDNzUyCisgKi8KKyNkZWZpbmUgVUFSVF9USTc1Ml9UQ1IJNgkvKiBJL086IHRyYW5zbWlzc2lvbiBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfVEk3NTJfVExSCTcJLyogSS9POiB0cmlnZ2VyIGxldmVsIHJlZ2lzdGVyICovCisKKy8qCisgKiBMQ1I9MHhCRiwgWFIxNkM4NXgKKyAqLworI2RlZmluZSBVQVJUX1RSRwkwCS8qIEZDVFIgYml0IDcgc2VsZWN0cyBSeCBvciBUeAorCQkJCSAqIEluOiBGaWZvIGNvdW50CisJCQkJICogT3V0OiBGaWZvIGN1c3RvbSB0cmlnZ2VyIGxldmVscyAqLworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBQcm9ncmFtbWFibGUgVHJpZ2dlciBSZWdpc3RlcgorICovCisjZGVmaW5lIFVBUlRfVFJHXzEJCTB4MDEKKyNkZWZpbmUgVUFSVF9UUkdfNAkJMHgwNAorI2RlZmluZSBVQVJUX1RSR184CQkweDA4CisjZGVmaW5lIFVBUlRfVFJHXzE2CQkweDEwCisjZGVmaW5lIFVBUlRfVFJHXzMyCQkweDIwCisjZGVmaW5lIFVBUlRfVFJHXzY0CQkweDQwCisjZGVmaW5lIFVBUlRfVFJHXzk2CQkweDYwCisjZGVmaW5lIFVBUlRfVFJHXzEyMAkJMHg3OAorI2RlZmluZSBVQVJUX1RSR18xMjgJCTB4ODAKKworI2RlZmluZSBVQVJUX0ZDVFIJMQkvKiBGZWF0dXJlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9GQ1RSX1JUU19OT0RFTEFZCTB4MDAgIC8qIFJUUyBmbG93IGNvbnRyb2wgZGVsYXkgKi8KKyNkZWZpbmUgVUFSVF9GQ1RSX1JUU180REVMQVkJMHgwMQorI2RlZmluZSBVQVJUX0ZDVFJfUlRTXzZERUxBWQkweDAyCisjZGVmaW5lIFVBUlRfRkNUUl9SVFNfOERFTEFZCTB4MDMKKyNkZWZpbmUgVUFSVF9GQ1RSX0lSREEJCTB4MDQgIC8qIElyRGEgZGF0YSBlbmNvZGUgc2VsZWN0ICovCisjZGVmaW5lIFVBUlRfRkNUUl9UWF9JTlQJMHgwOCAgLyogVHggaW50ZXJydXB0IHR5cGUgc2VsZWN0ICovCisjZGVmaW5lIFVBUlRfRkNUUl9UUkdBCQkweDAwICAvKiBUeC9SeCA1NTAgdHJpZ2dlciB0YWJsZSBzZWxlY3QgKi8KKyNkZWZpbmUgVUFSVF9GQ1RSX1RSR0IJCTB4MTAgIC8qIFR4L1J4IDY1MCB0cmlnZ2VyIHRhYmxlIHNlbGVjdCAqLworI2RlZmluZSBVQVJUX0ZDVFJfVFJHQwkJMHgyMCAgLyogVHgvUnggNjU0IHRyaWdnZXIgdGFibGUgc2VsZWN0ICovCisjZGVmaW5lIFVBUlRfRkNUUl9UUkdECQkweDMwICAvKiBUeC9SeCA4NTAgcHJvZ3JhbW1hYmxlIHRyaWdnZXIgc2VsZWN0ICovCisjZGVmaW5lIFVBUlRfRkNUUl9TQ1JfU1dBUAkweDQwICAvKiBTY3JhdGNoIHBhZCByZWdpc3RlciBzd2FwICovCisjZGVmaW5lIFVBUlRfRkNUUl9SWAkJMHgwMCAgLyogUHJvZ3JhbW1hYmxlIHRyaWdnZXIgbW9kZSBzZWxlY3QgKi8KKyNkZWZpbmUgVUFSVF9GQ1RSX1RYCQkweDgwICAvKiBQcm9ncmFtbWFibGUgdHJpZ2dlciBtb2RlIHNlbGVjdCAqLworCisvKgorICogTENSPTB4QkYsIEZDVFJbNl09MQorICovCisjZGVmaW5lIFVBUlRfRU1TUgk3CS8qIEV4dGVuZGVkIE1vZGUgU2VsZWN0IFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfRU1TUl9GSUZPX0NPVU5UCTB4MDEgIC8qIFJ4L1R4IHNlbGVjdCAqLworI2RlZmluZSBVQVJUX0VNU1JfQUxUX0NPVU5UCTB4MDIgIC8qIEFsdGVybmF0aW5nIGNvdW50IHNlbGVjdCAqLworCisvKgorICogVGhlIEludGVsIFhTY2FsZSBvbi1jaGlwIFVBUlRzIGRlZmluZSB0aGVzZSBiaXRzCisgKi8KKyNkZWZpbmUgVUFSVF9JRVJfRE1BRQkweDgwCS8qIERNQSBSZXF1ZXN0cyBFbmFibGUgKi8KKyNkZWZpbmUgVUFSVF9JRVJfVVVFCTB4NDAJLyogVUFSVCBVbml0IEVuYWJsZSAqLworI2RlZmluZSBVQVJUX0lFUl9OUlpFCTB4MjAJLyogTlJaIGNvZGluZyBFbmFibGUgKi8KKyNkZWZpbmUgVUFSVF9JRVJfUlRPSUUJMHgxMAkvKiBSZWNlaXZlciBUaW1lIE91dCBJbnRlcnJ1cHQgRW5hYmxlICovCisKKyNkZWZpbmUgVUFSVF9JSVJfVE9ECTB4MDgJLyogQ2hhcmFjdGVyIFRpbWVvdXQgSW5kaWNhdGlvbiBEZXRlY3RlZCAqLworCisjZGVmaW5lIFVBUlRfRkNSX1BYQVIxCTB4MDAJLyogcmVjZWl2ZSBGSUZPIHRocmVzaG9sZCA9IDEgKi8KKyNkZWZpbmUgVUFSVF9GQ1JfUFhBUjgJMHg0MAkvKiByZWNlaXZlIEZJRk8gdGhyZXNob2xkID0gOCAqLworI2RlZmluZSBVQVJUX0ZDUl9QWEFSMTYJMHg4MAkvKiByZWNlaXZlIEZJRk8gdGhyZXNob2xkID0gMTYgKi8KKyNkZWZpbmUgVUFSVF9GQ1JfUFhBUjMyCTB4YzAJLyogcmVjZWl2ZSBGSUZPIHRocmVzaG9sZCA9IDMyICovCisKKy8qCisgKiBJbnRlbCBNSUQgb24tY2hpcCBIU1UgKEhpZ2ggU3BlZWQgVUFSVCkgZGVmaW5lZCBiaXRzCisgKi8KKyNkZWZpbmUgVUFSVF9GQ1JfSFNVXzY0XzFCCTB4MDAJLyogcmVjZWl2ZSBGSUZPIHRyZXNob2xkID0gMSAqLworI2RlZmluZSBVQVJUX0ZDUl9IU1VfNjRfMTZCCTB4NDAJLyogcmVjZWl2ZSBGSUZPIHRyZXNob2xkID0gMTYgKi8KKyNkZWZpbmUgVUFSVF9GQ1JfSFNVXzY0XzMyQgkweDgwCS8qIHJlY2VpdmUgRklGTyB0cmVzaG9sZCA9IDMyICovCisjZGVmaW5lIFVBUlRfRkNSX0hTVV82NF81NkIJMHhjMAkvKiByZWNlaXZlIEZJRk8gdHJlc2hvbGQgPSA1NiAqLworCisjZGVmaW5lIFVBUlRfRkNSX0hTVV8xNl8xQgkweDAwCS8qIHJlY2VpdmUgRklGTyB0cmVzaG9sZCA9IDEgKi8KKyNkZWZpbmUgVUFSVF9GQ1JfSFNVXzE2XzRCCTB4NDAJLyogcmVjZWl2ZSBGSUZPIHRyZXNob2xkID0gNCAqLworI2RlZmluZSBVQVJUX0ZDUl9IU1VfMTZfOEIJMHg4MAkvKiByZWNlaXZlIEZJRk8gdHJlc2hvbGQgPSA4ICovCisjZGVmaW5lIFVBUlRfRkNSX0hTVV8xNl8xNEIJMHhjMAkvKiByZWNlaXZlIEZJRk8gdHJlc2hvbGQgPSAxNCAqLworCisjZGVmaW5lIFVBUlRfRkNSX0hTVV82NEJfRklGTwkweDIwCS8qIGNob3NlIDY0IGJ5dGVzIEZJRk8gKi8KKyNkZWZpbmUgVUFSVF9GQ1JfSFNVXzE2Ql9GSUZPCTB4MDAJLyogY2hvc2UgMTYgYnl0ZXMgRklGTyAqLworCisjZGVmaW5lIFVBUlRfRkNSX0hBTEZfRU1QVF9UWEkJMHgwMAkvKiB0cmlnZ2VyIFRYX0VNUFQgSVJRIGZvciBoYWxmIGVtcHR5ICovCisjZGVmaW5lIFVBUlRfRkNSX0ZVTExfRU1QVF9UWEkJMHgwOAkvKiB0cmlnZ2VyIFRYX0VNUFQgSVJRIGZvciBmdWxsIGVtcHR5ICovCisKKy8qCisgKiBUaGVzZSByZWdpc3RlciBkZWZpbml0aW9ucyBhcmUgZm9yIHRoZSAxNkM5NTAKKyAqLworI2RlZmluZSBVQVJUX0FTUgkweDAxCS8qIEFkZGl0aW9uYWwgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfUkZMCTB4MDMJLyogUmVjZWl2ZXIgRklGTyBsZXZlbCAqLworI2RlZmluZSBVQVJUX1RGTCAJMHgwNAkvKiBUcmFuc21pdHRlciBGSUZPIGxldmVsICovCisjZGVmaW5lIFVBUlRfSUNSCTB4MDUJLyogSW5kZXggQ29udHJvbCBSZWdpc3RlciAqLworCisvKiBUaGUgMTY5NTAgSUNSIHJlZ2lzdGVycyAqLworI2RlZmluZSBVQVJUX0FDUgkweDAwCS8qIEFkZGl0aW9uYWwgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBVQVJUX0NQUgkweDAxCS8qIENsb2NrIFByZXNjYWxhciBSZWdpc3RlciAqLworI2RlZmluZSBVQVJUX1RDUgkweDAyCS8qIFRpbWVzIENsb2NrIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfQ0tTCTB4MDMJLyogQ2xvY2sgU2VsZWN0IFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfVFRMCTB4MDQJLyogVHJhbnNtaXR0ZXIgSW50ZXJydXB0IFRyaWdnZXIgTGV2ZWwgKi8KKyNkZWZpbmUgVUFSVF9SVEwJMHgwNQkvKiBSZWNlaXZlciBJbnRlcnJ1cHQgVHJpZ2dlciBMZXZlbCAqLworI2RlZmluZSBVQVJUX0ZDTAkweDA2CS8qIEZsb3cgQ29udHJvbCBMZXZlbCBMb3dlciAqLworI2RlZmluZSBVQVJUX0ZDSAkweDA3CS8qIEZsb3cgQ29udHJvbCBMZXZlbCBIaWdoZXIgKi8KKyNkZWZpbmUgVUFSVF9JRDEJMHgwOAkvKiBJRCAjMSAqLworI2RlZmluZSBVQVJUX0lEMgkweDA5CS8qIElEICMyICovCisjZGVmaW5lIFVBUlRfSUQzCTB4MEEJLyogSUQgIzMgKi8KKyNkZWZpbmUgVUFSVF9SRVYJMHgwQgkvKiBSZXZpc2lvbiAqLworI2RlZmluZSBVQVJUX0NTUgkweDBDCS8qIENoYW5uZWwgU29mdHdhcmUgUmVzZXQgKi8KKyNkZWZpbmUgVUFSVF9OTVIJMHgwRAkvKiBOaW5lLWJpdCBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfQ1RSCTB4RkYKKworLyoKKyAqIFRoZSAxNkM5NTAgQWRkaXRpb25hbCBDb250cm9sIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgVUFSVF9BQ1JfUlhESVMJMHgwMQkvKiBSZWNlaXZlciBkaXNhYmxlICovCisjZGVmaW5lIFVBUlRfQUNSX1RYRElTCTB4MDIJLyogVHJhbnNtaXR0ZXIgZGlzYWJsZSAqLworI2RlZmluZSBVQVJUX0FDUl9EU1JGQwkweDA0CS8qIERTUiBGbG93IENvbnRyb2wgKi8KKyNkZWZpbmUgVUFSVF9BQ1JfVExFTkIJMHgyMAkvKiA5NTAgdHJpZ2dlciBsZXZlbHMgZW5hYmxlICovCisjZGVmaW5lIFVBUlRfQUNSX0lDUlJECTB4NDAJLyogSUNSIFJlYWQgZW5hYmxlICovCisjZGVmaW5lIFVBUlRfQUNSX0FTUkVOCTB4ODAJLyogQWRkaXRpb25hbCBzdGF0dXMgZW5hYmxlICovCisKKworCisvKgorICogVGhlc2UgZGVmaW5pdGlvbnMgYXJlIGZvciB0aGUgUlNBLURWIElJL1MgY2FyZCwgZnJvbQorICoKKyAqIEtpeW9rYXp1IFNVVE8gPHN1dG9Aa3MtYW5kLWtzLm5lLmpwPgorICovCisKKyNkZWZpbmUgVUFSVF9SU0FfQkFTRSAoLTgpCisKKyNkZWZpbmUgVUFSVF9SU0FfTVNSICgoVUFSVF9SU0FfQkFTRSkgKyAwKSAvKiBJL086IE1vZGUgU2VsZWN0IFJlZ2lzdGVyICovCisKKyNkZWZpbmUgVUFSVF9SU0FfTVNSX1NXQVAgKDEgPDwgMCkgLyogU3dhcCBsb3cvaGlnaCA4IGJ5dGVzIGluIEkvTyBwb3J0IGFkZHIgKi8KKyNkZWZpbmUgVUFSVF9SU0FfTVNSX0ZJRk8gKDEgPDwgMikgLyogRW5hYmxlIHRoZSBleHRlcm5hbCBGSUZPICovCisjZGVmaW5lIFVBUlRfUlNBX01TUl9GTE9XICgxIDw8IDMpIC8qIEVuYWJsZSB0aGUgYXV0byBSVFMvQ1RTIGZsb3cgY29udHJvbCAqLworI2RlZmluZSBVQVJUX1JTQV9NU1JfSVRZUCAoMSA8PCA0KSAvKiBMZXZlbCAoMSkgLyBFZGdlIHRyaWdlciAoMCkgKi8KKworI2RlZmluZSBVQVJUX1JTQV9JRVIgKChVQVJUX1JTQV9CQVNFKSArIDEpIC8qIEkvTzogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworCisjZGVmaW5lIFVBUlRfUlNBX0lFUl9SeF9GSUZPX0ggKDEgPDwgMCkgLyogRW5hYmxlIFJ4IEZJRk8gaGFsZiBmdWxsIGludC4gKi8KKyNkZWZpbmUgVUFSVF9SU0FfSUVSX1R4X0ZJRk9fSCAoMSA8PCAxKSAvKiBFbmFibGUgVHggRklGTyBoYWxmIGZ1bGwgaW50LiAqLworI2RlZmluZSBVQVJUX1JTQV9JRVJfVHhfRklGT19FICgxIDw8IDIpIC8qIEVuYWJsZSBUeCBGSUZPIGVtcHR5IGludC4gKi8KKyNkZWZpbmUgVUFSVF9SU0FfSUVSX1J4X1RPVVQgKDEgPDwgMykgLyogRW5hYmxlIGNoYXIgcmVjZWl2ZSB0aW1lb3V0IGludCAqLworI2RlZmluZSBVQVJUX1JTQV9JRVJfVElNRVIgKDEgPDwgNCkgLyogRW5hYmxlIHRpbWVyIGludGVycnVwdCAqLworCisjZGVmaW5lIFVBUlRfUlNBX1NSUiAoKFVBUlRfUlNBX0JBU0UpICsgMikgLyogSU46IFN0YXR1cyBSZWFkIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgVUFSVF9SU0FfU1JSX1R4X0ZJRk9fTkVNUCAoMSA8PCAwKSAvKiBUeCBGSUZPIGlzIG5vdCBlbXB0eSAoMSkgKi8KKyNkZWZpbmUgVUFSVF9SU0FfU1JSX1R4X0ZJRk9fTkhGTCAoMSA8PCAxKSAvKiBUeCBGSUZPIGlzIG5vdCBoYWxmIGZ1bGwgKDEpICovCisjZGVmaW5lIFVBUlRfUlNBX1NSUl9UeF9GSUZPX05GVUwgKDEgPDwgMikgLyogVHggRklGTyBpcyBub3QgZnVsbCAoMSkgKi8KKyNkZWZpbmUgVUFSVF9SU0FfU1JSX1J4X0ZJRk9fTkVNUCAoMSA8PCAzKSAvKiBSeCBGSUZPIGlzIG5vdCBlbXB0eSAoMSkgKi8KKyNkZWZpbmUgVUFSVF9SU0FfU1JSX1J4X0ZJRk9fTkhGTCAoMSA8PCA0KSAvKiBSeCBGSUZPIGlzIG5vdCBoYWxmIGZ1bGwgKDEpICovCisjZGVmaW5lIFVBUlRfUlNBX1NSUl9SeF9GSUZPX05GVUwgKDEgPDwgNSkgLyogUnggRklGTyBpcyBub3QgZnVsbCAoMSkgKi8KKyNkZWZpbmUgVUFSVF9SU0FfU1JSX1J4X1RPVVQgKDEgPDwgNikgLyogQ2hhcmFjdGVyIHJlY2VwdGlvbiB0aW1lb3V0IG9jY3VycmVkICgxKSAqLworI2RlZmluZSBVQVJUX1JTQV9TUlJfVElNRVIgKDEgPDwgNykgLyogVGltZXIgaW50ZXJydXB0IG9jY3VycmVkICovCisKKyNkZWZpbmUgVUFSVF9SU0FfRlJSICgoVUFSVF9SU0FfQkFTRSkgKyAyKSAvKiBPVVQ6IEZJRk8gUmVzZXQgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBVQVJUX1JTQV9USVZTUiAoKFVBUlRfUlNBX0JBU0UpICsgMykgLyogSS9POiBUaW1lciBJbnRlcnZhbCBWYWx1ZSBTZXQgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBVQVJUX1JTQV9UQ1IgKChVQVJUX1JTQV9CQVNFKSArIDQpIC8qIE9VVDogVGltZXIgQ29udHJvbCBSZWdpc3RlciAqLworCisjZGVmaW5lIFVBUlRfUlNBX1RDUl9TV0lUQ0ggKDEgPDwgMCkgLyogVGltZXIgb24gKi8KKworLyoKKyAqIFRoZSBSU0EgRFNWL0lJIGJvYXJkIGhhcyB0d28gZml4ZWQgY2xvY2sgZnJlcXVlbmNpZXMuICBPbmUgaXMgdGhlCisgKiBzdGFuZGFyZCByYXRlLCBhbmQgdGhlIG90aGVyIGlzIDggdGltZXMgZmFzdGVyLgorICovCisjZGVmaW5lIFNFUklBTF9SU0FfQkFVRF9CQVNFICg5MjE2MDApCisjZGVmaW5lIFNFUklBTF9SU0FfQkFVRF9CQVNFX0xPIChTRVJJQUxfUlNBX0JBVURfQkFTRSAvIDgpCisKKy8qCisgKiBFeHRyYSBzZXJpYWwgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBpbnRlcm5hbCBVQVJUcworICogaW4gVEkgT01BUCBwcm9jZXNzb3JzLgorICovCisjZGVmaW5lIFVBUlRfT01BUF9NRFIxCQkweDA4CS8qIE1vZGUgZGVmaW5pdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBVQVJUX09NQVBfTURSMgkJMHgwOQkvKiBNb2RlIGRlZmluaXRpb24gcmVnaXN0ZXIgMiAqLworI2RlZmluZSBVQVJUX09NQVBfU0NSCQkweDEwCS8qIFN1cHBsZW1lbnRhcnkgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBVQVJUX09NQVBfU1NSCQkweDExCS8qIFN1cHBsZW1lbnRhcnkgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfT01BUF9FQkxSCQkweDEyCS8qIEJPRiBsZW5ndGggcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9PTUFQX09TQ18xMk1fU0VMCTB4MTMJLyogT01BUDE1MTAgMTJNSHogb3NjIHNlbGVjdCAqLworI2RlZmluZSBVQVJUX09NQVBfTVZFUgkJMHgxNAkvKiBNb2R1bGUgdmVyc2lvbiByZWdpc3RlciAqLworI2RlZmluZSBVQVJUX09NQVBfU1lTQwkJMHgxNQkvKiBTeXN0ZW0gY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBVQVJUX09NQVBfU1lTUwkJMHgxNgkvKiBTeXN0ZW0gc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfT01BUF9XRVIJCTB4MTcJLyogV2FrZS11cCBlbmFibGUgcmVnaXN0ZXIgKi8KKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBNRFIxIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgVUFSVF9PTUFQX01EUjFfMTZYX01PREUJCTB4MDAJLyogVUFSVCAxNnggbW9kZSAqLworI2RlZmluZSBVQVJUX09NQVBfTURSMV9TSVJfTU9ERQkJMHgwMQkvKiBTSVIgbW9kZSAqLworI2RlZmluZSBVQVJUX09NQVBfTURSMV8xNlhfQUJBVURfTU9ERQkweDAyCS8qIFVBUlQgMTZ4IGF1dG8tYmF1ZCAqLworI2RlZmluZSBVQVJUX09NQVBfTURSMV8xM1hfTU9ERQkJMHgwMwkvKiBVQVJUIDEzeCBtb2RlICovCisjZGVmaW5lIFVBUlRfT01BUF9NRFIxX01JUl9NT0RFCQkweDA0CS8qIE1JUiBtb2RlICovCisjZGVmaW5lIFVBUlRfT01BUF9NRFIxX0ZJUl9NT0RFCQkweDA1CS8qIEZJUiBtb2RlICovCisjZGVmaW5lIFVBUlRfT01BUF9NRFIxX0NJUl9NT0RFCQkweDA2CS8qIENJUiBtb2RlICovCisjZGVmaW5lIFVBUlRfT01BUF9NRFIxX0RJU0FCTEUJCTB4MDcJLyogRGlzYWJsZSAoZGVmYXVsdCBzdGF0ZSkgKi8KKworI2VuZGlmIC8qIF9MSU5VWF9TRVJJQUxfUkVHX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZXJpby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZXJpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMTI3ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlcmlvLmgKQEAgLTAsMCArMSw4MCBAQAorI2lmbmRlZiBfU0VSSU9fSAorI2RlZmluZSBfU0VSSU9fSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDIgVm9qdGVjaCBQYXZsaWsKKyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNkZWZpbmUgU1BJT0NTVFlQRQlfSU9XKCdxJywgMHgwMSwgdW5zaWduZWQgbG9uZykKKworCisvKgorICogYml0IG1hc2tzIGZvciB1c2UgaW4gImludGVycnVwdCIgZmxhZ3MgKDNyZCBhcmd1bWVudCkKKyAqLworI2RlZmluZSBTRVJJT19USU1FT1VUCTEKKyNkZWZpbmUgU0VSSU9fUEFSSVRZCTIKKyNkZWZpbmUgU0VSSU9fRlJBTUUJNAorCisvKgorICogU2VyaW8gdHlwZXMKKyAqLworI2RlZmluZSBTRVJJT19YVAkweDAwCisjZGVmaW5lIFNFUklPXzgwNDIJMHgwMQorI2RlZmluZSBTRVJJT19SUzIzMgkweDAyCisjZGVmaW5lIFNFUklPX0hJTF9NTEMJMHgwMworI2RlZmluZSBTRVJJT19QU19QU1RIUlUJMHgwNQorI2RlZmluZSBTRVJJT184MDQyX1hMCTB4MDYKKworLyoKKyAqIFNlcmlvIHByb3RvY29scworICovCisjZGVmaW5lIFNFUklPX1VOS05PV04JMHgwMAorI2RlZmluZSBTRVJJT19NU0MJMHgwMQorI2RlZmluZSBTRVJJT19TVU4JMHgwMgorI2RlZmluZSBTRVJJT19NUwkweDAzCisjZGVmaW5lIFNFUklPX01QCTB4MDQKKyNkZWZpbmUgU0VSSU9fTVoJMHgwNQorI2RlZmluZSBTRVJJT19NWlAJMHgwNgorI2RlZmluZSBTRVJJT19NWlBQCTB4MDcKKyNkZWZpbmUgU0VSSU9fVlNYWFhBQQkweDA4CisjZGVmaW5lIFNFUklPX1NVTktCRAkweDEwCisjZGVmaW5lIFNFUklPX1dBUlJJT1IJMHgxOAorI2RlZmluZSBTRVJJT19TUEFDRU9SQgkweDE5CisjZGVmaW5lIFNFUklPX01BR0VMTEFOCTB4MWEKKyNkZWZpbmUgU0VSSU9fU1BBQ0VCQUxMCTB4MWIKKyNkZWZpbmUgU0VSSU9fR1VOWkUJMHgxYworI2RlZmluZSBTRVJJT19JRk9SQ0UJMHgxZAorI2RlZmluZSBTRVJJT19TVElOR0VSCTB4MWUKKyNkZWZpbmUgU0VSSU9fTkVXVE9OCTB4MWYKKyNkZWZpbmUgU0VSSU9fU1RPV0FXQVkJMHgyMAorI2RlZmluZSBTRVJJT19IMzYwMAkweDIxCisjZGVmaW5lIFNFUklPX1BTMlNFUgkweDIyCisjZGVmaW5lIFNFUklPX1RXSURLQkQJMHgyMworI2RlZmluZSBTRVJJT19UV0lESk9ZCTB4MjQKKyNkZWZpbmUgU0VSSU9fSElMCTB4MjUKKyNkZWZpbmUgU0VSSU9fU05FUzIzMgkweDI2CisjZGVmaW5lIFNFUklPX1NFTVRFQ0gJMHgyNworI2RlZmluZSBTRVJJT19MS0tCRAkweDI4CisjZGVmaW5lIFNFUklPX0VMTwkweDI5CisjZGVmaW5lIFNFUklPX01JQ1JPVE9VQ0gJMHgzMAorI2RlZmluZSBTRVJJT19QRU5NT1VOVAkweDMxCisjZGVmaW5lIFNFUklPX1RPVUNIUklHSFQJMHgzMgorI2RlZmluZSBTRVJJT19UT1VDSFdJTgkweDMzCisjZGVmaW5lIFNFUklPX1RBT1NFVk0JMHgzNAorI2RlZmluZSBTRVJJT19GVUpJVFNVCTB4MzUKKyNkZWZpbmUgU0VSSU9fWkhFTkhVQQkweDM2CisjZGVmaW5lIFNFUklPX0lORVhJTwkweDM3CisjZGVmaW5lIFNFUklPX1RPVUNISVQyMTMJMHgzOAorI2RlZmluZSBTRVJJT19XODAwMQkweDM5CisjZGVmaW5lIFNFUklPX0RZTkFQUk8JMHgzYQorI2RlZmluZSBTRVJJT19IQU1QU0hJUkUJMHgzYgorI2RlZmluZSBTRVJJT19QUzJNVUxUCTB4M2MKKyNkZWZpbmUgU0VSSU9fVFNDNDAJMHgzZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2htLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NobS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OWNlZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NobS5oCkBAIC0wLDAgKzEsNzUgQEAKKyNpZm5kZWYgX0xJTlVYX1NITV9IXworI2RlZmluZSBfTElOVVhfU0hNX0hfCisKKyNpbmNsdWRlIDxsaW51eC9pcGMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisvKgorICogU0hNTUFYLCBTSE1NTkkgYW5kIFNITUFMTCBhcmUgdXBwZXIgbGltaXRzIGFyZSBkZWZhdWx0cyB3aGljaCBjYW4KKyAqIGJlIGluY3JlYXNlZCBieSBzeXNjdGwKKyAqLworCisjZGVmaW5lIFNITU1BWCAweDIwMDAwMDAJCSAvKiBtYXggc2hhcmVkIHNlZyBzaXplIChieXRlcykgKi8KKyNkZWZpbmUgU0hNTUlOIDEJCQkgLyogbWluIHNoYXJlZCBzZWcgc2l6ZSAoYnl0ZXMpICovCisjZGVmaW5lIFNITU1OSSA0MDk2CQkJIC8qIG1heCBudW0gb2Ygc2VncyBzeXN0ZW0gd2lkZSAqLworI2RlZmluZSBTSE1BTEwgKFNITU1BWC9nZXRwYWdlc2l6ZSgpKihTSE1NTkkvMTYpKQorI2RlZmluZSBTSE1TRUcgU0hNTU5JCQkJIC8qIG1heCBzaGFyZWQgc2VncyBwZXIgcHJvY2VzcyAqLworCisKKy8qIE9ic29sZXRlLCB1c2VkIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZCBsaWJjNSBjb21waWxlcyAqLworc3RydWN0IHNobWlkX2RzIHsKKwlzdHJ1Y3QgaXBjX3Blcm0JCXNobV9wZXJtOwkvKiBvcGVyYXRpb24gcGVybXMgKi8KKwlpbnQJCQlzaG1fc2Vnc3o7CS8qIHNpemUgb2Ygc2VnbWVudCAoYnl0ZXMpICovCisJX19rZXJuZWxfdGltZV90CQlzaG1fYXRpbWU7CS8qIGxhc3QgYXR0YWNoIHRpbWUgKi8KKwlfX2tlcm5lbF90aW1lX3QJCXNobV9kdGltZTsJLyogbGFzdCBkZXRhY2ggdGltZSAqLworCV9fa2VybmVsX3RpbWVfdAkJc2htX2N0aW1lOwkvKiBsYXN0IGNoYW5nZSB0aW1lICovCisJX19rZXJuZWxfaXBjX3BpZF90CXNobV9jcGlkOwkvKiBwaWQgb2YgY3JlYXRvciAqLworCV9fa2VybmVsX2lwY19waWRfdAlzaG1fbHBpZDsJLyogcGlkIG9mIGxhc3Qgb3BlcmF0b3IgKi8KKwl1bnNpZ25lZCBzaG9ydAkJc2htX25hdHRjaDsJLyogbm8uIG9mIGN1cnJlbnQgYXR0YWNoZXMgKi8KKwl1bnNpZ25lZCBzaG9ydCAJCXNobV91bnVzZWQ7CS8qIGNvbXBhdGliaWxpdHkgKi8KKwl2b2lkIAkJCSpzaG1fdW51c2VkMjsJLyogZGl0dG8gLSB1c2VkIGJ5IERJUEMgKi8KKwl2b2lkCQkJKnNobV91bnVzZWQzOwkvKiB1bnVzZWQgKi8KK307CisKKy8qIEluY2x1ZGUgdGhlIGRlZmluaXRpb24gb2Ygc2htaWQ2NF9kcyBhbmQgc2htaW5mbzY0ICovCisjaW5jbHVkZSA8YXNtL3NobWJ1Zi5oPgorCisvKiBwZXJtaXNzaW9uIGZsYWcgZm9yIHNobWdldCAqLworI2RlZmluZSBTSE1fUgkJMDQwMAkvKiBvciBTX0lSVUdPIGZyb20gPGxpbnV4L3N0YXQuaD4gKi8KKyNkZWZpbmUgU0hNX1cJCTAyMDAJLyogb3IgU19JV1VHTyBmcm9tIDxsaW51eC9zdGF0Lmg+ICovCisKKy8qIG1vZGUgZm9yIGF0dGFjaCAqLworI2RlZmluZQlTSE1fUkRPTkxZCTAxMDAwMAkvKiByZWFkLW9ubHkgYWNjZXNzICovCisjZGVmaW5lCVNITV9STkQJCTAyMDAwMAkvKiByb3VuZCBhdHRhY2ggYWRkcmVzcyB0byBTSE1MQkEgYm91bmRhcnkgKi8KKyNkZWZpbmUJU0hNX1JFTUFQCTA0MDAwMAkvKiB0YWtlLW92ZXIgcmVnaW9uIG9uIGF0dGFjaCAqLworI2RlZmluZQlTSE1fRVhFQwkwMTAwMDAwCS8qIGV4ZWN1dGlvbiBhY2Nlc3MgKi8KKworLyogc3VwZXIgdXNlciBzaG1jdGwgY29tbWFuZHMgKi8KKyNkZWZpbmUgU0hNX0xPQ0sgCTExCisjZGVmaW5lIFNITV9VTkxPQ0sgCTEyCisKKy8qIGlwY3MgY3RsIGNvbW1hbmRzICovCisjZGVmaW5lIFNITV9TVEFUIAkxMworI2RlZmluZSBTSE1fSU5GTyAJMTQKKworLyogT2Jzb2xldGUsIHVzZWQgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KK3N0cnVjdAlzaG1pbmZvIHsKKwlpbnQgc2htbWF4OworCWludCBzaG1taW47CisJaW50IHNobW1uaTsKKwlpbnQgc2htc2VnOworCWludCBzaG1hbGw7Cit9OworCitzdHJ1Y3Qgc2htX2luZm8geworCWludCB1c2VkX2lkczsKKwl1bnNpZ25lZCBsb25nIHNobV90b3Q7CS8qIHRvdGFsIGFsbG9jYXRlZCBzaG0gKi8KKwl1bnNpZ25lZCBsb25nIHNobV9yc3M7CS8qIHRvdGFsIHJlc2lkZW50IHNobSAqLworCXVuc2lnbmVkIGxvbmcgc2htX3N3cDsJLyogdG90YWwgc3dhcHBlZCBzaG0gKi8KKwl1bnNpZ25lZCBsb25nIHN3YXBfYXR0ZW1wdHM7CisJdW5zaWduZWQgbG9uZyBzd2FwX3N1Y2Nlc3NlczsKK307CisKKworI2VuZGlmIC8qIF9MSU5VWF9TSE1fSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2lnbmFsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjY5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfTElOVVhfU0lHTkFMX0gKKyNkZWZpbmUgX0xJTlVYX1NJR05BTF9ICisKKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CisjaW5jbHVkZSA8YXNtL3NpZ2luZm8uaD4KKworCisjZW5kaWYgLyogX0xJTlVYX1NJR05BTF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NpZ25hbGZkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NpZ25hbGZkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBlNjg5YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2lnbmFsZmQuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogIGluY2x1ZGUvbGludXgvc2lnbmFsZmQuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfU0lHTkFMRkRfSAorI2RlZmluZSBfTElOVVhfU0lHTkFMRkRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKy8qIEZvciBPX0NMT0VYRUMgYW5kIE9fTk9OQkxPQ0sgKi8KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorCisvKiBGbGFncyBmb3Igc2lnbmFsZmQ0LiAgKi8KKyNkZWZpbmUgU0ZEX0NMT0VYRUMgT19DTE9FWEVDCisjZGVmaW5lIFNGRF9OT05CTE9DSyBPX05PTkJMT0NLCisKK3N0cnVjdCBzaWduYWxmZF9zaWdpbmZvIHsKKwlfX3UzMiBzc2lfc2lnbm87CisJX19zMzIgc3NpX2Vycm5vOworCV9fczMyIHNzaV9jb2RlOworCV9fdTMyIHNzaV9waWQ7CisJX191MzIgc3NpX3VpZDsKKwlfX3MzMiBzc2lfZmQ7CisJX191MzIgc3NpX3RpZDsKKwlfX3UzMiBzc2lfYmFuZDsKKwlfX3UzMiBzc2lfb3ZlcnJ1bjsKKwlfX3UzMiBzc2lfdHJhcG5vOworCV9fczMyIHNzaV9zdGF0dXM7CisJX19zMzIgc3NpX2ludDsKKwlfX3U2NCBzc2lfcHRyOworCV9fdTY0IHNzaV91dGltZTsKKwlfX3U2NCBzc2lfc3RpbWU7CisJX191NjQgc3NpX2FkZHI7CisJX191MTYgc3NpX2FkZHJfbHNiOworCisJLyoKKwkgKiBQYWQgc3RyY3R1cmUgdG8gMTI4IGJ5dGVzLiBSZW1lbWJlciB0byB1cGRhdGUgdGhlCisJICogcGFkIHNpemUgd2hlbiB5b3UgYWRkIG5ldyBtZW1iZXJzLiBXZSB1c2UgYSBmaXhlZAorCSAqIHNpemUgc3RydWN0dXJlIHRvIGF2b2lkIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgd2l0aAorCSAqIGZ1dHVyZSB2ZXJzaW9ucywgYW5kIHdlIGxlYXZlIGV4dHJhIHNwYWNlIGZvciBhZGRpdGlvbmFsCisJICogbWVtYmVycy4gV2UgdXNlIGZpeGVkIHNpemUgbWVtYmVycyBiZWNhdXNlIHRoaXMgc3RyY3R1cmUKKwkgKiBjb21lcyBvdXQgb2YgYSByZWFkKDIpIGFuZCB3ZSByZWFsbHkgZG9uJ3Qgd2FudCB0byBoYXZlCisJICogYSBjb21wYXQgb24gcmVhZCgyKS4KKwkgKi8KKwlfX3U4IF9fcGFkWzQ2XTsKK307CisKKworCisjZW5kaWYgLyogX0xJTlVYX1NJR05BTEZEX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc25tcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zbm1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2NTU3YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc25tcC5oCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogRGVmaW5pdGlvbnMgZm9yIE1JQnMKKyAqCisgKiBBdXRob3I6IEhpZGVha2kgWU9TSElGVUpJIDx5b3NoZnVqaUBsaW51eC1pcHY2Lm9yZz4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9TTk1QX0gKKyNkZWZpbmUgX0xJTlVYX1NOTVBfSAorCisvKiBpcHN0YXRzIG1pYiBkZWZpbml0aW9ucyAqLworLyoKKyAqIFJGQyAxMjEzOiAgTUlCLUlJCisgKiBSRkMgMjAxMSAodXBkYXRlcyAxMjEzKTogIFNOTVB2Mi1NSUItSVAKKyAqIFJGQyAyODYzOiAgSW50ZXJmYWNlcyBHcm91cCBNSUIKKyAqIFJGQyAyNDY1OiAgSVB2NiBNSUI6IEdlbmVyYWwgR3JvdXAKKyAqIGRyYWZ0LWlldGYtaXB2Ni1yZmMyMDExLXVwZGF0ZS0xMC50eHQ6IE1JQiBmb3IgSVA6IElQIFN0YXRpc3RpY3MgVGFibGVzCisgKi8KK2VudW0KK3sKKwlJUFNUQVRTX01JQl9OVU0gPSAwLAorCUlQU1RBVFNfTUlCX0lOUEtUUywJCQkvKiBJblJlY2VpdmVzICovCisJSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMsCQkvKiBJbkhkckVycm9ycyAqLworCUlQU1RBVFNfTUlCX0lOVE9PQklHRVJST1JTLAkJLyogSW5Ub29CaWdFcnJvcnMgKi8KKwlJUFNUQVRTX01JQl9JTk5PUk9VVEVTLAkJCS8qIEluTm9Sb3V0ZXMgKi8KKwlJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMsCQkvKiBJbkFkZHJFcnJvcnMgKi8KKwlJUFNUQVRTX01JQl9JTlVOS05PV05QUk9UT1MsCQkvKiBJblVua25vd25Qcm90b3MgKi8KKwlJUFNUQVRTX01JQl9JTlRSVU5DQVRFRFBLVFMsCQkvKiBJblRydW5jYXRlZFBrdHMgKi8KKwlJUFNUQVRTX01JQl9JTkRJU0NBUkRTLAkJCS8qIEluRGlzY2FyZHMgKi8KKwlJUFNUQVRTX01JQl9JTkRFTElWRVJTLAkJCS8qIEluRGVsaXZlcnMgKi8KKwlJUFNUQVRTX01JQl9PVVRGT1JXREFUQUdSQU1TLAkJLyogT3V0Rm9yd0RhdGFncmFtcyAqLworCUlQU1RBVFNfTUlCX09VVFBLVFMsCQkJLyogT3V0UmVxdWVzdHMgKi8KKwlJUFNUQVRTX01JQl9PVVRESVNDQVJEUywJCS8qIE91dERpc2NhcmRzICovCisJSVBTVEFUU19NSUJfT1VUTk9ST1VURVMsCQkvKiBPdXROb1JvdXRlcyAqLworCUlQU1RBVFNfTUlCX1JFQVNNVElNRU9VVCwJCS8qIFJlYXNtVGltZW91dCAqLworCUlQU1RBVFNfTUlCX1JFQVNNUkVRRFMsCQkJLyogUmVhc21SZXFkcyAqLworCUlQU1RBVFNfTUlCX1JFQVNNT0tTLAkJCS8qIFJlYXNtT0tzICovCisJSVBTVEFUU19NSUJfUkVBU01GQUlMUywJCQkvKiBSZWFzbUZhaWxzICovCisJSVBTVEFUU19NSUJfRlJBR09LUywJCQkvKiBGcmFnT0tzICovCisJSVBTVEFUU19NSUJfRlJBR0ZBSUxTLAkJCS8qIEZyYWdGYWlscyAqLworCUlQU1RBVFNfTUlCX0ZSQUdDUkVBVEVTLAkJLyogRnJhZ0NyZWF0ZXMgKi8KKwlJUFNUQVRTX01JQl9JTk1DQVNUUEtUUywJCS8qIEluTWNhc3RQa3RzICovCisJSVBTVEFUU19NSUJfT1VUTUNBU1RQS1RTLAkJLyogT3V0TWNhc3RQa3RzICovCisJSVBTVEFUU19NSUJfSU5CQ0FTVFBLVFMsCQkvKiBJbkJjYXN0UGt0cyAqLworCUlQU1RBVFNfTUlCX09VVEJDQVNUUEtUUywJCS8qIE91dEJjYXN0UGt0cyAqLworCUlQU1RBVFNfTUlCX0lOT0NURVRTLAkJCS8qIEluT2N0ZXRzICovCisJSVBTVEFUU19NSUJfT1VUT0NURVRTLAkJCS8qIE91dE9jdGV0cyAqLworCUlQU1RBVFNfTUlCX0lOTUNBU1RPQ1RFVFMsCQkvKiBJbk1jYXN0T2N0ZXRzICovCisJSVBTVEFUU19NSUJfT1VUTUNBU1RPQ1RFVFMsCQkvKiBPdXRNY2FzdE9jdGV0cyAqLworCUlQU1RBVFNfTUlCX0lOQkNBU1RPQ1RFVFMsCQkvKiBJbkJjYXN0T2N0ZXRzICovCisJSVBTVEFUU19NSUJfT1VUQkNBU1RPQ1RFVFMsCQkvKiBPdXRCY2FzdE9jdGV0cyAqLworCV9fSVBTVEFUU19NSUJfTUFYCit9OworCisvKiBpY21wIG1pYiBkZWZpbml0aW9ucyAqLworLyoKKyAqIFJGQyAxMjEzOiAgTUlCLUlJIElDTVAgR3JvdXAKKyAqIFJGQyAyMDExICh1cGRhdGVzIDEyMTMpOiAgU05NUHYyIE1JQiBmb3IgSVA6IElDTVAgZ3JvdXAKKyAqLworZW51bQoreworCUlDTVBfTUlCX05VTSA9IDAsCisJSUNNUF9NSUJfSU5NU0dTLAkJCS8qIEluTXNncyAqLworCUlDTVBfTUlCX0lORVJST1JTLAkJCS8qIEluRXJyb3JzICovCisJSUNNUF9NSUJfSU5ERVNUVU5SRUFDSFMsCQkvKiBJbkRlc3RVbnJlYWNocyAqLworCUlDTVBfTUlCX0lOVElNRUVYQ0RTLAkJCS8qIEluVGltZUV4Y2RzICovCisJSUNNUF9NSUJfSU5QQVJNUFJPQlMsCQkJLyogSW5QYXJtUHJvYnMgKi8KKwlJQ01QX01JQl9JTlNSQ1FVRU5DSFMsCQkJLyogSW5TcmNRdWVuY2hzICovCisJSUNNUF9NSUJfSU5SRURJUkVDVFMsCQkJLyogSW5SZWRpcmVjdHMgKi8KKwlJQ01QX01JQl9JTkVDSE9TLAkJCS8qIEluRWNob3MgKi8KKwlJQ01QX01JQl9JTkVDSE9SRVBTLAkJCS8qIEluRWNob1JlcHMgKi8KKwlJQ01QX01JQl9JTlRJTUVTVEFNUFMsCQkJLyogSW5UaW1lc3RhbXBzICovCisJSUNNUF9NSUJfSU5USU1FU1RBTVBSRVBTLAkJLyogSW5UaW1lc3RhbXBSZXBzICovCisJSUNNUF9NSUJfSU5BRERSTUFTS1MsCQkJLyogSW5BZGRyTWFza3MgKi8KKwlJQ01QX01JQl9JTkFERFJNQVNLUkVQUywJCS8qIEluQWRkck1hc2tSZXBzICovCisJSUNNUF9NSUJfT1VUTVNHUywJCQkvKiBPdXRNc2dzICovCisJSUNNUF9NSUJfT1VURVJST1JTLAkJCS8qIE91dEVycm9ycyAqLworCUlDTVBfTUlCX09VVERFU1RVTlJFQUNIUywJCS8qIE91dERlc3RVbnJlYWNocyAqLworCUlDTVBfTUlCX09VVFRJTUVFWENEUywJCQkvKiBPdXRUaW1lRXhjZHMgKi8KKwlJQ01QX01JQl9PVVRQQVJNUFJPQlMsCQkJLyogT3V0UGFybVByb2JzICovCisJSUNNUF9NSUJfT1VUU1JDUVVFTkNIUywJCQkvKiBPdXRTcmNRdWVuY2hzICovCisJSUNNUF9NSUJfT1VUUkVESVJFQ1RTLAkJCS8qIE91dFJlZGlyZWN0cyAqLworCUlDTVBfTUlCX09VVEVDSE9TLAkJCS8qIE91dEVjaG9zICovCisJSUNNUF9NSUJfT1VURUNIT1JFUFMsCQkJLyogT3V0RWNob1JlcHMgKi8KKwlJQ01QX01JQl9PVVRUSU1FU1RBTVBTLAkJCS8qIE91dFRpbWVzdGFtcHMgKi8KKwlJQ01QX01JQl9PVVRUSU1FU1RBTVBSRVBTLAkJLyogT3V0VGltZXN0YW1wUmVwcyAqLworCUlDTVBfTUlCX09VVEFERFJNQVNLUywJCQkvKiBPdXRBZGRyTWFza3MgKi8KKwlJQ01QX01JQl9PVVRBRERSTUFTS1JFUFMsCQkvKiBPdXRBZGRyTWFza1JlcHMgKi8KKwlfX0lDTVBfTUlCX01BWAorfTsKKworI2RlZmluZSBfX0lDTVBNU0dfTUlCX01BWCA1MTIJLyogT3V0K0luIGZvciBhbGwgOC1iaXQgSUNNUCB0eXBlcyAqLworCisvKiBpY21wNiBtaWIgZGVmaW5pdGlvbnMgKi8KKy8qCisgKiBSRkMgMjQ2NjogIElDTVB2Ni1NSUIKKyAqLworZW51bQoreworCUlDTVA2X01JQl9OVU0gPSAwLAorCUlDTVA2X01JQl9JTk1TR1MsCQkJLyogSW5Nc2dzICovCisJSUNNUDZfTUlCX0lORVJST1JTLAkJCS8qIEluRXJyb3JzICovCisJSUNNUDZfTUlCX09VVE1TR1MsCQkJLyogT3V0TXNncyAqLworCUlDTVA2X01JQl9PVVRFUlJPUlMsCQkJLyogT3V0RXJyb3JzICovCisJX19JQ01QNl9NSUJfTUFYCit9OworCisjZGVmaW5lIF9fSUNNUDZNU0dfTUlCX01BWCA1MTIgLyogT3V0K0luIGZvciBhbGwgOC1iaXQgSUNNUHY2IHR5cGVzICovCisKKy8qIHRjcCBtaWIgZGVmaW5pdGlvbnMgKi8KKy8qCisgKiBSRkMgMTIxMzogIE1JQi1JSSBUQ1AgZ3JvdXAKKyAqIFJGQyAyMDEyICh1cGRhdGVzIDEyMTMpOiAgU05NUHYyLU1JQi1UQ1AKKyAqLworZW51bQoreworCVRDUF9NSUJfTlVNID0gMCwKKwlUQ1BfTUlCX1JUT0FMR09SSVRITSwJCQkvKiBSdG9BbGdvcml0aG0gKi8KKwlUQ1BfTUlCX1JUT01JTiwJCQkJLyogUnRvTWluICovCisJVENQX01JQl9SVE9NQVgsCQkJCS8qIFJ0b01heCAqLworCVRDUF9NSUJfTUFYQ09OTiwJCQkvKiBNYXhDb25uICovCisJVENQX01JQl9BQ1RJVkVPUEVOUywJCQkvKiBBY3RpdmVPcGVucyAqLworCVRDUF9NSUJfUEFTU0lWRU9QRU5TLAkJCS8qIFBhc3NpdmVPcGVucyAqLworCVRDUF9NSUJfQVRURU1QVEZBSUxTLAkJCS8qIEF0dGVtcHRGYWlscyAqLworCVRDUF9NSUJfRVNUQUJSRVNFVFMsCQkJLyogRXN0YWJSZXNldHMgKi8KKwlUQ1BfTUlCX0NVUlJFU1RBQiwJCQkvKiBDdXJyRXN0YWIgKi8KKwlUQ1BfTUlCX0lOU0VHUywJCQkJLyogSW5TZWdzICovCisJVENQX01JQl9PVVRTRUdTLAkJCS8qIE91dFNlZ3MgKi8KKwlUQ1BfTUlCX1JFVFJBTlNTRUdTLAkJCS8qIFJldHJhbnNTZWdzICovCisJVENQX01JQl9JTkVSUlMsCQkJCS8qIEluRXJycyAqLworCVRDUF9NSUJfT1VUUlNUUywJCQkvKiBPdXRSc3RzICovCisJX19UQ1BfTUlCX01BWAorfTsKKworLyogdWRwIG1pYiBkZWZpbml0aW9ucyAqLworLyoKKyAqIFJGQyAxMjEzOiAgTUlCLUlJIFVEUCBncm91cAorICogUkZDIDIwMTMgKHVwZGF0ZXMgMTIxMyk6ICBTTk1QdjItTUlCLVVEUAorICovCitlbnVtCit7CisJVURQX01JQl9OVU0gPSAwLAorCVVEUF9NSUJfSU5EQVRBR1JBTVMsCQkJLyogSW5EYXRhZ3JhbXMgKi8KKwlVRFBfTUlCX05PUE9SVFMsCQkJLyogTm9Qb3J0cyAqLworCVVEUF9NSUJfSU5FUlJPUlMsCQkJLyogSW5FcnJvcnMgKi8KKwlVRFBfTUlCX09VVERBVEFHUkFNUywJCQkvKiBPdXREYXRhZ3JhbXMgKi8KKwlVRFBfTUlCX1JDVkJVRkVSUk9SUywJCQkvKiBSY3ZidWZFcnJvcnMgKi8KKwlVRFBfTUlCX1NOREJVRkVSUk9SUywJCQkvKiBTbmRidWZFcnJvcnMgKi8KKwlfX1VEUF9NSUJfTUFYCit9OworCisvKiBsaW51eCBtaWIgZGVmaW5pdGlvbnMgKi8KK2VudW0KK3sKKwlMSU5VWF9NSUJfTlVNID0gMCwKKwlMSU5VWF9NSUJfU1lOQ09PS0lFU1NFTlQsCQkvKiBTeW5jb29raWVzU2VudCAqLworCUxJTlVYX01JQl9TWU5DT09LSUVTUkVDViwJCS8qIFN5bmNvb2tpZXNSZWN2ICovCisJTElOVVhfTUlCX1NZTkNPT0tJRVNGQUlMRUQsCQkvKiBTeW5jb29raWVzRmFpbGVkICovCisJTElOVVhfTUlCX0VNQlJZT05JQ1JTVFMsCQkvKiBFbWJyeW9uaWNSc3RzICovCisJTElOVVhfTUlCX1BSVU5FQ0FMTEVELAkJCS8qIFBydW5lQ2FsbGVkICovCisJTElOVVhfTUlCX1JDVlBSVU5FRCwJCQkvKiBSY3ZQcnVuZWQgKi8KKwlMSU5VWF9NSUJfT0ZPUFJVTkVELAkJCS8qIE9mb1BydW5lZCAqLworCUxJTlVYX01JQl9PVVRPRldJTkRPV0lDTVBTLAkJLyogT3V0T2ZXaW5kb3dJY21wcyAqLworCUxJTlVYX01JQl9MT0NLRFJPUFBFRElDTVBTLAkJLyogTG9ja0Ryb3BwZWRJY21wcyAqLworCUxJTlVYX01JQl9BUlBGSUxURVIsCQkJLyogQXJwRmlsdGVyICovCisJTElOVVhfTUlCX1RJTUVXQUlURUQsCQkJLyogVGltZVdhaXRlZCAqLworCUxJTlVYX01JQl9USU1FV0FJVFJFQ1lDTEVELAkJLyogVGltZVdhaXRSZWN5Y2xlZCAqLworCUxJTlVYX01JQl9USU1FV0FJVEtJTExFRCwJCS8qIFRpbWVXYWl0S2lsbGVkICovCisJTElOVVhfTUlCX1BBV1NQQVNTSVZFUkVKRUNURUQsCQkvKiBQQVdTUGFzc2l2ZVJlamVjdGVkICovCisJTElOVVhfTUlCX1BBV1NBQ1RJVkVSRUpFQ1RFRCwJCS8qIFBBV1NBY3RpdmVSZWplY3RlZCAqLworCUxJTlVYX01JQl9QQVdTRVNUQUJSRUpFQ1RFRCwJCS8qIFBBV1NFc3RhYlJlamVjdGVkICovCisJTElOVVhfTUlCX0RFTEFZRURBQ0tTLAkJCS8qIERlbGF5ZWRBQ0tzICovCisJTElOVVhfTUlCX0RFTEFZRURBQ0tMT0NLRUQsCQkvKiBEZWxheWVkQUNLTG9ja2VkICovCisJTElOVVhfTUlCX0RFTEFZRURBQ0tMT1NULAkJLyogRGVsYXllZEFDS0xvc3QgKi8KKwlMSU5VWF9NSUJfTElTVEVOT1ZFUkZMT1dTLAkJLyogTGlzdGVuT3ZlcmZsb3dzICovCisJTElOVVhfTUlCX0xJU1RFTkRST1BTLAkJCS8qIExpc3RlbkRyb3BzICovCisJTElOVVhfTUlCX1RDUFBSRVFVRVVFRCwJCQkvKiBUQ1BQcmVxdWV1ZWQgKi8KKwlMSU5VWF9NSUJfVENQRElSRUNUQ09QWUZST01CQUNLTE9HLAkvKiBUQ1BEaXJlY3RDb3B5RnJvbUJhY2tsb2cgKi8KKwlMSU5VWF9NSUJfVENQRElSRUNUQ09QWUZST01QUkVRVUVVRSwJLyogVENQRGlyZWN0Q29weUZyb21QcmVxdWV1ZSAqLworCUxJTlVYX01JQl9UQ1BQUkVRVUVVRURST1BQRUQsCQkvKiBUQ1BQcmVxdWV1ZURyb3BwZWQgKi8KKwlMSU5VWF9NSUJfVENQSFBISVRTLAkJCS8qIFRDUEhQSGl0cyAqLworCUxJTlVYX01JQl9UQ1BIUEhJVFNUT1VTRVIsCQkvKiBUQ1BIUEhpdHNUb1VzZXIgKi8KKwlMSU5VWF9NSUJfVENQUFVSRUFDS1MsCQkJLyogVENQUHVyZUFja3MgKi8KKwlMSU5VWF9NSUJfVENQSFBBQ0tTLAkJCS8qIFRDUEhQQWNrcyAqLworCUxJTlVYX01JQl9UQ1BSRU5PUkVDT1ZFUlksCQkvKiBUQ1BSZW5vUmVjb3ZlcnkgKi8KKwlMSU5VWF9NSUJfVENQU0FDS1JFQ09WRVJZLAkJLyogVENQU2Fja1JlY292ZXJ5ICovCisJTElOVVhfTUlCX1RDUFNBQ0tSRU5FR0lORywJCS8qIFRDUFNBQ0tSZW5lZ2luZyAqLworCUxJTlVYX01JQl9UQ1BGQUNLUkVPUkRFUiwJCS8qIFRDUEZBQ0tSZW9yZGVyICovCisJTElOVVhfTUlCX1RDUFNBQ0tSRU9SREVSLAkJLyogVENQU0FDS1Jlb3JkZXIgKi8KKwlMSU5VWF9NSUJfVENQUkVOT1JFT1JERVIsCQkvKiBUQ1BSZW5vUmVvcmRlciAqLworCUxJTlVYX01JQl9UQ1BUU1JFT1JERVIsCQkJLyogVENQVFNSZW9yZGVyICovCisJTElOVVhfTUlCX1RDUEZVTExVTkRPLAkJCS8qIFRDUEZ1bGxVbmRvICovCisJTElOVVhfTUlCX1RDUFBBUlRJQUxVTkRPLAkJLyogVENQUGFydGlhbFVuZG8gKi8KKwlMSU5VWF9NSUJfVENQRFNBQ0tVTkRPLAkJCS8qIFRDUERTQUNLVW5kbyAqLworCUxJTlVYX01JQl9UQ1BMT1NTVU5ETywJCQkvKiBUQ1BMb3NzVW5kbyAqLworCUxJTlVYX01JQl9UQ1BMT1NTLAkJCS8qIFRDUExvc3MgKi8KKwlMSU5VWF9NSUJfVENQTE9TVFJFVFJBTlNNSVQsCQkvKiBUQ1BMb3N0UmV0cmFuc21pdCAqLworCUxJTlVYX01JQl9UQ1BSRU5PRkFJTFVSRVMsCQkvKiBUQ1BSZW5vRmFpbHVyZXMgKi8KKwlMSU5VWF9NSUJfVENQU0FDS0ZBSUxVUkVTLAkJLyogVENQU2Fja0ZhaWx1cmVzICovCisJTElOVVhfTUlCX1RDUExPU1NGQUlMVVJFUywJCS8qIFRDUExvc3NGYWlsdXJlcyAqLworCUxJTlVYX01JQl9UQ1BGQVNUUkVUUkFOUywJCS8qIFRDUEZhc3RSZXRyYW5zICovCisJTElOVVhfTUlCX1RDUEZPUldBUkRSRVRSQU5TLAkJLyogVENQRm9yd2FyZFJldHJhbnMgKi8KKwlMSU5VWF9NSUJfVENQU0xPV1NUQVJUUkVUUkFOUywJCS8qIFRDUFNsb3dTdGFydFJldHJhbnMgKi8KKwlMSU5VWF9NSUJfVENQVElNRU9VVFMsCQkJLyogVENQVGltZW91dHMgKi8KKwlMSU5VWF9NSUJfVENQUkVOT1JFQ09WRVJZRkFJTCwJCS8qIFRDUFJlbm9SZWNvdmVyeUZhaWwgKi8KKwlMSU5VWF9NSUJfVENQU0FDS1JFQ09WRVJZRkFJTCwJCS8qIFRDUFNhY2tSZWNvdmVyeUZhaWwgKi8KKwlMSU5VWF9NSUJfVENQU0NIRURVTEVSRkFJTEVELAkJLyogVENQU2NoZWR1bGVyRmFpbGVkICovCisJTElOVVhfTUlCX1RDUFJDVkNPTExBUFNFRCwJCS8qIFRDUFJjdkNvbGxhcHNlZCAqLworCUxJTlVYX01JQl9UQ1BEU0FDS09MRFNFTlQsCQkvKiBUQ1BEU0FDS09sZFNlbnQgKi8KKwlMSU5VWF9NSUJfVENQRFNBQ0tPRk9TRU5ULAkJLyogVENQRFNBQ0tPZm9TZW50ICovCisJTElOVVhfTUlCX1RDUERTQUNLUkVDViwJCQkvKiBUQ1BEU0FDS1JlY3YgKi8KKwlMSU5VWF9NSUJfVENQRFNBQ0tPRk9SRUNWLAkJLyogVENQRFNBQ0tPZm9SZWN2ICovCisJTElOVVhfTUlCX1RDUEFCT1JUT05TWU4sCQkvKiBUQ1BBYm9ydE9uU3luICovCisJTElOVVhfTUlCX1RDUEFCT1JUT05EQVRBLAkJLyogVENQQWJvcnRPbkRhdGEgKi8KKwlMSU5VWF9NSUJfVENQQUJPUlRPTkNMT1NFLAkJLyogVENQQWJvcnRPbkNsb3NlICovCisJTElOVVhfTUlCX1RDUEFCT1JUT05NRU1PUlksCQkvKiBUQ1BBYm9ydE9uTWVtb3J5ICovCisJTElOVVhfTUlCX1RDUEFCT1JUT05USU1FT1VULAkJLyogVENQQWJvcnRPblRpbWVvdXQgKi8KKwlMSU5VWF9NSUJfVENQQUJPUlRPTkxJTkdFUiwJCS8qIFRDUEFib3J0T25MaW5nZXIgKi8KKwlMSU5VWF9NSUJfVENQQUJPUlRGQUlMRUQsCQkvKiBUQ1BBYm9ydEZhaWxlZCAqLworCUxJTlVYX01JQl9UQ1BNRU1PUllQUkVTU1VSRVMsCQkvKiBUQ1BNZW1vcnlQcmVzc3VyZXMgKi8KKwlMSU5VWF9NSUJfVENQU0FDS0RJU0NBUkQsCQkvKiBUQ1BTQUNLRGlzY2FyZCAqLworCUxJTlVYX01JQl9UQ1BEU0FDS0lHTk9SRURPTEQsCQkvKiBUQ1BTQUNLSWdub3JlZE9sZCAqLworCUxJTlVYX01JQl9UQ1BEU0FDS0lHTk9SRUROT1VORE8sCS8qIFRDUFNBQ0tJZ25vcmVkTm9VbmRvICovCisJTElOVVhfTUlCX1RDUFNQVVJJT1VTUlRPUywJCS8qIFRDUFNwdXJpb3VzUlRPcyAqLworCUxJTlVYX01JQl9UQ1BNRDVOT1RGT1VORCwJCS8qIFRDUE1ENU5vdEZvdW5kICovCisJTElOVVhfTUlCX1RDUE1ENVVORVhQRUNURUQsCQkvKiBUQ1BNRDVVbmV4cGVjdGVkICovCisJTElOVVhfTUlCX1NBQ0tTSElGVEVELAorCUxJTlVYX01JQl9TQUNLTUVSR0VELAorCUxJTlVYX01JQl9TQUNLU0hJRlRGQUxMQkFDSywKKwlMSU5VWF9NSUJfVENQQkFDS0xPR0RST1AsCisJTElOVVhfTUlCX1RDUE1JTlRUTERST1AsIC8qIFJGQyA1MDgyICovCisJTElOVVhfTUlCX1RDUERFRkVSQUNDRVBURFJPUCwKKwlMSU5VWF9NSUJfSVBSUEZJTFRFUiwgLyogSVAgUmV2ZXJzZSBQYXRoIEZpbHRlciAocnBfZmlsdGVyKSAqLworCUxJTlVYX01JQl9UQ1BUSU1FV0FJVE9WRVJGTE9XLAkJLyogVENQVGltZVdhaXRPdmVyZmxvdyAqLworCUxJTlVYX01JQl9UQ1BSRVFRRlVMTERPQ09PS0lFUywJCS8qIFRDUFJlcVFGdWxsRG9Db29raWVzICovCisJTElOVVhfTUlCX1RDUFJFUVFGVUxMRFJPUCwJCS8qIFRDUFJlcVFGdWxsRHJvcCAqLworCV9fTElOVVhfTUlCX01BWAorfTsKKworLyogbGludXggWGZybSBtaWIgZGVmaW5pdGlvbnMgKi8KK2VudW0KK3sKKwlMSU5VWF9NSUJfWEZSTU5VTSA9IDAsCisJTElOVVhfTUlCX1hGUk1JTkVSUk9SLAkJCS8qIFhmcm1JbkVycm9yICovCisJTElOVVhfTUlCX1hGUk1JTkJVRkZFUkVSUk9SLAkJLyogWGZybUluQnVmZmVyRXJyb3IgKi8KKwlMSU5VWF9NSUJfWEZSTUlOSERSRVJST1IsCQkvKiBYZnJtSW5IZHJFcnJvciAqLworCUxJTlVYX01JQl9YRlJNSU5OT1NUQVRFUywJCS8qIFhmcm1Jbk5vU3RhdGVzICovCisJTElOVVhfTUlCX1hGUk1JTlNUQVRFUFJPVE9FUlJPUiwJLyogWGZybUluU3RhdGVQcm90b0Vycm9yICovCisJTElOVVhfTUlCX1hGUk1JTlNUQVRFTU9ERUVSUk9SLAkJLyogWGZybUluU3RhdGVNb2RlRXJyb3IgKi8KKwlMSU5VWF9NSUJfWEZSTUlOU1RBVEVTRVFFUlJPUiwJCS8qIFhmcm1JblN0YXRlU2VxRXJyb3IgKi8KKwlMSU5VWF9NSUJfWEZSTUlOU1RBVEVFWFBJUkVELAkJLyogWGZybUluU3RhdGVFeHBpcmVkICovCisJTElOVVhfTUlCX1hGUk1JTlNUQVRFTUlTTUFUQ0gsCQkvKiBYZnJtSW5TdGF0ZU1pc21hdGNoICovCisJTElOVVhfTUlCX1hGUk1JTlNUQVRFSU5WQUxJRCwJCS8qIFhmcm1JblN0YXRlSW52YWxpZCAqLworCUxJTlVYX01JQl9YRlJNSU5UTVBMTUlTTUFUQ0gsCQkvKiBYZnJtSW5UbXBsTWlzbWF0Y2ggKi8KKwlMSU5VWF9NSUJfWEZSTUlOTk9QT0xTLAkJCS8qIFhmcm1Jbk5vUG9scyAqLworCUxJTlVYX01JQl9YRlJNSU5QT0xCTE9DSywJCS8qIFhmcm1JblBvbEJsb2NrICovCisJTElOVVhfTUlCX1hGUk1JTlBPTEVSUk9SLAkJLyogWGZybUluUG9sRXJyb3IgKi8KKwlMSU5VWF9NSUJfWEZSTU9VVEVSUk9SLAkJCS8qIFhmcm1PdXRFcnJvciAqLworCUxJTlVYX01JQl9YRlJNT1VUQlVORExFR0VORVJST1IsCS8qIFhmcm1PdXRCdW5kbGVHZW5FcnJvciAqLworCUxJTlVYX01JQl9YRlJNT1VUQlVORExFQ0hFQ0tFUlJPUiwJLyogWGZybU91dEJ1bmRsZUNoZWNrRXJyb3IgKi8KKwlMSU5VWF9NSUJfWEZSTU9VVE5PU1RBVEVTLAkJLyogWGZybU91dE5vU3RhdGVzICovCisJTElOVVhfTUlCX1hGUk1PVVRTVEFURVBST1RPRVJST1IsCS8qIFhmcm1PdXRTdGF0ZVByb3RvRXJyb3IgKi8KKwlMSU5VWF9NSUJfWEZSTU9VVFNUQVRFTU9ERUVSUk9SLAkvKiBYZnJtT3V0U3RhdGVNb2RlRXJyb3IgKi8KKwlMSU5VWF9NSUJfWEZSTU9VVFNUQVRFU0VRRVJST1IsCQkvKiBYZnJtT3V0U3RhdGVTZXFFcnJvciAqLworCUxJTlVYX01JQl9YRlJNT1VUU1RBVEVFWFBJUkVELAkJLyogWGZybU91dFN0YXRlRXhwaXJlZCAqLworCUxJTlVYX01JQl9YRlJNT1VUUE9MQkxPQ0ssCQkvKiBYZnJtT3V0UG9sQmxvY2sgKi8KKwlMSU5VWF9NSUJfWEZSTU9VVFBPTERFQUQsCQkvKiBYZnJtT3V0UG9sRGVhZCAqLworCUxJTlVYX01JQl9YRlJNT1VUUE9MRVJST1IsCQkvKiBYZnJtT3V0UG9sRXJyb3IgKi8KKwlMSU5VWF9NSUJfWEZSTUZXREhEUkVSUk9SLAkJLyogWGZybUZ3ZEhkckVycm9yKi8KKwlfX0xJTlVYX01JQl9YRlJNTUFYCit9OworCisjZW5kaWYJLyogX0xJTlVYX1NOTVBfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb2NrZXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMxZTUwMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc29ja2V0LmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfTElOVVhfU09DS0VUX0gKKyNkZWZpbmUgX0xJTlVYX1NPQ0tFVF9ICisKKy8qCisgKiBEZXNpcmVkIGRlc2lnbiBvZiBtYXhpbXVtIHNpemUgYW5kIGFsaWdubWVudCAoc2VlIFJGQzI1NTMpCisgKi8KKyNkZWZpbmUgX0tfU1NfTUFYU0laRQkxMjgJLyogSW1wbGVtZW50YXRpb24gc3BlY2lmaWMgbWF4IHNpemUgKi8KKyNkZWZpbmUgX0tfU1NfQUxJR05TSVpFCShfX2FsaWdub2ZfXyAoc3RydWN0IHNvY2thZGRyICopKQorCQkJCS8qIEltcGxlbWVudGF0aW9uIHNwZWNpZmljIGRlc2lyZWQgYWxpZ25tZW50ICovCisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgX19rZXJuZWxfc2FfZmFtaWx5X3Q7CisKK3N0cnVjdCBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlIHsKKwlfX2tlcm5lbF9zYV9mYW1pbHlfdAlzc19mYW1pbHk7CQkvKiBhZGRyZXNzIGZhbWlseSAqLworCS8qIEZvbGxvd2luZyBmaWVsZChzKSBhcmUgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgKi8KKwljaGFyCQlfX2RhdGFbX0tfU1NfTUFYU0laRSAtIHNpemVvZih1bnNpZ25lZCBzaG9ydCldOworCQkJCS8qIHNwYWNlIHRvIGFjaGlldmUgZGVzaXJlZCBzaXplLCAqLworCQkJCS8qIF9TU19NQVhTSVpFIHZhbHVlIG1pbnVzIHNpemUgb2Ygc3NfZmFtaWx5ICovCit9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKF9LX1NTX0FMSUdOU0laRSkpKTsJLyogZm9yY2UgZGVzaXJlZCBhbGlnbm1lbnQgKi8KKworI2VuZGlmIC8qIF9MSU5VWF9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb2NraW9zLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvY2tpb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTk3YTUwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb2NraW9zLmgKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJRGVmaW5pdGlvbnMgb2YgdGhlIHNvY2tldC1sZXZlbCBJL08gY29udHJvbCBjYWxscy4KKyAqCisgKiBWZXJzaW9uOglAKCMpc29ja2lvcy5oCTEuMC4yCTAzLzA5LzkzCisgKgorICogQXV0aG9yczoJUm9zcyBCaXJvCisgKgkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0xJTlVYX1NPQ0tJT1NfSAorI2RlZmluZSBfTElOVVhfU09DS0lPU19ICisKKyNpbmNsdWRlIDxhc20vc29ja2lvcy5oPgorCisvKiBMaW51eC1zcGVjaWZpYyBzb2NrZXQgaW9jdGxzICovCisjZGVmaW5lIFNJT0NJTlEJCUZJT05SRUFECisjZGVmaW5lIFNJT0NPVVRRCVRJT0NPVVRRICAgICAgICAvKiBvdXRwdXQgcXVldWUgc2l6ZSAobm90IHNlbnQgKyBub3QgYWNrZWQpICovCisKKy8qIFJvdXRpbmcgdGFibGUgY2FsbHMuICovCisjZGVmaW5lIFNJT0NBRERSVAkweDg5MEIJCS8qIGFkZCByb3V0aW5nIHRhYmxlIGVudHJ5CSovCisjZGVmaW5lIFNJT0NERUxSVAkweDg5MEMJCS8qIGRlbGV0ZSByb3V0aW5nIHRhYmxlIGVudHJ5CSovCisjZGVmaW5lIFNJT0NSVE1TRwkweDg5MEQJCS8qIGNhbGwgdG8gcm91dGluZyBzeXN0ZW0JKi8KKworLyogU29ja2V0IGNvbmZpZ3VyYXRpb24gY29udHJvbHMuICovCisjZGVmaW5lIFNJT0NHSUZOQU1FCTB4ODkxMAkJLyogZ2V0IGlmYWNlIG5hbWUJCSovCisjZGVmaW5lIFNJT0NTSUZMSU5LCTB4ODkxMQkJLyogc2V0IGlmYWNlIGNoYW5uZWwJCSovCisjZGVmaW5lIFNJT0NHSUZDT05GCTB4ODkxMgkJLyogZ2V0IGlmYWNlIGxpc3QJCSovCisjZGVmaW5lIFNJT0NHSUZGTEFHUwkweDg5MTMJCS8qIGdldCBmbGFncwkJCSovCisjZGVmaW5lIFNJT0NTSUZGTEFHUwkweDg5MTQJCS8qIHNldCBmbGFncwkJCSovCisjZGVmaW5lIFNJT0NHSUZBRERSCTB4ODkxNQkJLyogZ2V0IFBBIGFkZHJlc3MJCSovCisjZGVmaW5lIFNJT0NTSUZBRERSCTB4ODkxNgkJLyogc2V0IFBBIGFkZHJlc3MJCSovCisjZGVmaW5lIFNJT0NHSUZEU1RBRERSCTB4ODkxNwkJLyogZ2V0IHJlbW90ZSBQQSBhZGRyZXNzCSovCisjZGVmaW5lIFNJT0NTSUZEU1RBRERSCTB4ODkxOAkJLyogc2V0IHJlbW90ZSBQQSBhZGRyZXNzCSovCisjZGVmaW5lIFNJT0NHSUZCUkRBRERSCTB4ODkxOQkJLyogZ2V0IGJyb2FkY2FzdCBQQSBhZGRyZXNzCSovCisjZGVmaW5lIFNJT0NTSUZCUkRBRERSCTB4ODkxYQkJLyogc2V0IGJyb2FkY2FzdCBQQSBhZGRyZXNzCSovCisjZGVmaW5lIFNJT0NHSUZORVRNQVNLCTB4ODkxYgkJLyogZ2V0IG5ldHdvcmsgUEEgbWFzawkJKi8KKyNkZWZpbmUgU0lPQ1NJRk5FVE1BU0sJMHg4OTFjCQkvKiBzZXQgbmV0d29yayBQQSBtYXNrCQkqLworI2RlZmluZSBTSU9DR0lGTUVUUklDCTB4ODkxZAkJLyogZ2V0IG1ldHJpYwkJCSovCisjZGVmaW5lIFNJT0NTSUZNRVRSSUMJMHg4OTFlCQkvKiBzZXQgbWV0cmljCQkJKi8KKyNkZWZpbmUgU0lPQ0dJRk1FTQkweDg5MWYJCS8qIGdldCBtZW1vcnkgYWRkcmVzcyAoQlNEKQkqLworI2RlZmluZSBTSU9DU0lGTUVNCTB4ODkyMAkJLyogc2V0IG1lbW9yeSBhZGRyZXNzIChCU0QpCSovCisjZGVmaW5lIFNJT0NHSUZNVFUJMHg4OTIxCQkvKiBnZXQgTVRVIHNpemUJCQkqLworI2RlZmluZSBTSU9DU0lGTVRVCTB4ODkyMgkJLyogc2V0IE1UVSBzaXplCQkJKi8KKyNkZWZpbmUgU0lPQ1NJRk5BTUUJMHg4OTIzCQkvKiBzZXQgaW50ZXJmYWNlIG5hbWUgKi8KKyNkZWZpbmUJU0lPQ1NJRkhXQUREUgkweDg5MjQJCS8qIHNldCBoYXJkd2FyZSBhZGRyZXNzIAkqLworI2RlZmluZSBTSU9DR0lGRU5DQVAJMHg4OTI1CQkvKiBnZXQvc2V0IGVuY2Fwc3VsYXRpb25zICAgICAgICovCisjZGVmaW5lIFNJT0NTSUZFTkNBUAkweDg5MjYJCQorI2RlZmluZSBTSU9DR0lGSFdBRERSCTB4ODkyNwkJLyogR2V0IGhhcmR3YXJlIGFkZHJlc3MJCSovCisjZGVmaW5lIFNJT0NHSUZTTEFWRQkweDg5MjkJCS8qIERyaXZlciBzbGF2aW5nIHN1cHBvcnQJKi8KKyNkZWZpbmUgU0lPQ1NJRlNMQVZFCTB4ODkzMAorI2RlZmluZSBTSU9DQURETVVMVEkJMHg4OTMxCQkvKiBNdWx0aWNhc3QgYWRkcmVzcyBsaXN0cwkqLworI2RlZmluZSBTSU9DREVMTVVMVEkJMHg4OTMyCisjZGVmaW5lIFNJT0NHSUZJTkRFWAkweDg5MzMJCS8qIG5hbWUgLT4gaWZfaW5kZXggbWFwcGluZwkqLworI2RlZmluZSBTSU9HSUZJTkRFWAlTSU9DR0lGSU5ERVgJLyogbWlzcHJpbnQgY29tcGF0aWJpbGl0eSA6LSkJKi8KKyNkZWZpbmUgU0lPQ1NJRlBGTEFHUwkweDg5MzQJCS8qIHNldC9nZXQgZXh0ZW5kZWQgZmxhZ3Mgc2V0CSovCisjZGVmaW5lIFNJT0NHSUZQRkxBR1MJMHg4OTM1CisjZGVmaW5lIFNJT0NESUZBRERSCTB4ODkzNgkJLyogZGVsZXRlIFBBIGFkZHJlc3MJCSovCisjZGVmaW5lCVNJT0NTSUZIV0JST0FEQ0FTVAkweDg5MzcJLyogc2V0IGhhcmR3YXJlIGJyb2FkY2FzdCBhZGRyCSovCisjZGVmaW5lIFNJT0NHSUZDT1VOVAkweDg5MzgJCS8qIGdldCBudW1iZXIgb2YgZGV2aWNlcyAqLworCisjZGVmaW5lIFNJT0NHSUZCUgkweDg5NDAJCS8qIEJyaWRnaW5nIHN1cHBvcnQJCSovCisjZGVmaW5lIFNJT0NTSUZCUgkweDg5NDEJCS8qIFNldCBicmlkZ2luZyBvcHRpb25zIAkqLworCisjZGVmaW5lIFNJT0NHSUZUWFFMRU4JMHg4OTQyCQkvKiBHZXQgdGhlIHR4IHF1ZXVlIGxlbmd0aAkqLworI2RlZmluZSBTSU9DU0lGVFhRTEVOCTB4ODk0MwkJLyogU2V0IHRoZSB0eCBxdWV1ZSBsZW5ndGggCSovCisKKy8qIFNJT0NHSUZESVZFUlQgd2FzOgkweDg5NDQJCUZyYW1lIGRpdmVyc2lvbiBzdXBwb3J0ICovCisvKiBTSU9DU0lGRElWRVJUIHdhczoJMHg4OTQ1CQlTZXQgZnJhbWUgZGl2ZXJzaW9uIG9wdGlvbnMgKi8KKworI2RlZmluZSBTSU9DRVRIVE9PTAkweDg5NDYJCS8qIEV0aHRvb2wgaW50ZXJmYWNlCQkqLworCisjZGVmaW5lIFNJT0NHTUlJUEhZCTB4ODk0NwkJLyogR2V0IGFkZHJlc3Mgb2YgTUlJIFBIWSBpbiB1c2UuICovCisjZGVmaW5lIFNJT0NHTUlJUkVHCTB4ODk0OAkJLyogUmVhZCBNSUkgUEhZIHJlZ2lzdGVyLgkqLworI2RlZmluZSBTSU9DU01JSVJFRwkweDg5NDkJCS8qIFdyaXRlIE1JSSBQSFkgcmVnaXN0ZXIuCSovCisKKyNkZWZpbmUgU0lPQ1dBTkRFVgkweDg5NEEJCS8qIGdldC9zZXQgbmV0ZGV2IHBhcmFtZXRlcnMJKi8KKworI2RlZmluZSBTSU9DT1VUUU5TRAkweDg5NEIJCS8qIG91dHB1dCBxdWV1ZSBzaXplIChub3Qgc2VudCBvbmx5KSAqLworCisvKiBBUlAgY2FjaGUgY29udHJvbCBjYWxscy4gKi8KKwkJICAgIC8qICAweDg5NTAgLSAweDg5NTIgICogb2Jzb2xldGUgY2FsbHMsIGRvbid0IHJlLXVzZSAqLworI2RlZmluZSBTSU9DREFSUAkweDg5NTMJCS8qIGRlbGV0ZSBBUlAgdGFibGUgZW50cnkJKi8KKyNkZWZpbmUgU0lPQ0dBUlAJMHg4OTU0CQkvKiBnZXQgQVJQIHRhYmxlIGVudHJ5CQkqLworI2RlZmluZSBTSU9DU0FSUAkweDg5NTUJCS8qIHNldCBBUlAgdGFibGUgZW50cnkJCSovCisKKy8qIFJBUlAgY2FjaGUgY29udHJvbCBjYWxscy4gKi8KKyNkZWZpbmUgU0lPQ0RSQVJQCTB4ODk2MAkJLyogZGVsZXRlIFJBUlAgdGFibGUgZW50cnkJKi8KKyNkZWZpbmUgU0lPQ0dSQVJQCTB4ODk2MQkJLyogZ2V0IFJBUlAgdGFibGUgZW50cnkJCSovCisjZGVmaW5lIFNJT0NTUkFSUAkweDg5NjIJCS8qIHNldCBSQVJQIHRhYmxlIGVudHJ5CQkqLworCisvKiBEcml2ZXIgY29uZmlndXJhdGlvbiBjYWxscyAqLworCisjZGVmaW5lIFNJT0NHSUZNQVAJMHg4OTcwCQkvKiBHZXQgZGV2aWNlIHBhcmFtZXRlcnMJKi8KKyNkZWZpbmUgU0lPQ1NJRk1BUAkweDg5NzEJCS8qIFNldCBkZXZpY2UgcGFyYW1ldGVycwkqLworCisvKiBETENJIGNvbmZpZ3VyYXRpb24gY2FsbHMgKi8KKworI2RlZmluZSBTSU9DQURERExDSQkweDg5ODAJCS8qIENyZWF0ZSBuZXcgRExDSSBkZXZpY2UJKi8KKyNkZWZpbmUgU0lPQ0RFTERMQ0kJMHg4OTgxCQkvKiBEZWxldGUgRExDSSBkZXZpY2UJCSovCisKKyNkZWZpbmUgU0lPQ0dJRlZMQU4JMHg4OTgyCQkvKiA4MDIuMVEgVkxBTiBzdXBwb3J0CQkqLworI2RlZmluZSBTSU9DU0lGVkxBTgkweDg5ODMJCS8qIFNldCA4MDIuMVEgVkxBTiBvcHRpb25zIAkqLworCisvKiBib25kaW5nIGNhbGxzICovCisKKyNkZWZpbmUgU0lPQ0JPTkRFTlNMQVZFCTB4ODk5MAkJLyogZW5zbGF2ZSBhIGRldmljZSB0byB0aGUgYm9uZCAqLworI2RlZmluZSBTSU9DQk9ORFJFTEVBU0UgMHg4OTkxCQkvKiByZWxlYXNlIGEgc2xhdmUgZnJvbSB0aGUgYm9uZCovCisjZGVmaW5lIFNJT0NCT05EU0VUSFdBRERSICAgICAgMHg4OTkyCS8qIHNldCB0aGUgaHcgYWRkciBvZiB0aGUgYm9uZCAgKi8KKyNkZWZpbmUgU0lPQ0JPTkRTTEFWRUlORk9RVUVSWSAweDg5OTMgICAvKiBydG4gaW5mbyBhYm91dCBzbGF2ZSBzdGF0ZSAgICovCisjZGVmaW5lIFNJT0NCT05ESU5GT1FVRVJZICAgICAgMHg4OTk0CS8qIHJ0biBpbmZvIGFib3V0IGJvbmQgc3RhdGUgICAgKi8KKyNkZWZpbmUgU0lPQ0JPTkRDSEFOR0VBQ1RJVkUgICAweDg5OTUgICAvKiB1cGRhdGUgdG8gYSBuZXcgYWN0aXZlIHNsYXZlICovCisJCQkKKy8qIGJyaWRnZSBjYWxscyAqLworI2RlZmluZSBTSU9DQlJBRERCUiAgICAgMHg4OWEwCQkvKiBjcmVhdGUgbmV3IGJyaWRnZSBkZXZpY2UgICAgICovCisjZGVmaW5lIFNJT0NCUkRFTEJSICAgICAweDg5YTEJCS8qIHJlbW92ZSBicmlkZ2UgZGV2aWNlICAgICAgICAgKi8KKyNkZWZpbmUgU0lPQ0JSQURESUYJMHg4OWEyCQkvKiBhZGQgaW50ZXJmYWNlIHRvIGJyaWRnZSAgICAgICovCisjZGVmaW5lIFNJT0NCUkRFTElGCTB4ODlhMwkJLyogcmVtb3ZlIGludGVyZmFjZSBmcm9tIGJyaWRnZSAqLworCisvKiBoYXJkd2FyZSB0aW1lIHN0YW1waW5nOiBwYXJhbWV0ZXJzIGluIGxpbnV4L25ldF90c3RhbXAuaCAqLworI2RlZmluZSBTSU9DU0hXVFNUQU1QICAgMHg4OWIwCisKKy8qIERldmljZSBwcml2YXRlIGlvY3RsIGNhbGxzICovCisKKy8qCisgKglUaGVzZSAxNiBpb2N0bHMgYXJlIGF2YWlsYWJsZSB0byBkZXZpY2VzIHZpYSB0aGUgZG9faW9jdGwoKSBkZXZpY2UKKyAqCXZlY3Rvci4gRWFjaCBkZXZpY2Ugc2hvdWxkIGluY2x1ZGUgdGhpcyBmaWxlIGFuZCByZWRlZmluZSB0aGVzZSBuYW1lcworICoJYXMgdGhlaXIgb3duLiBCZWNhdXNlIHRoZXNlIGFyZSBkZXZpY2UgZGVwZW5kZW50IGl0IGlzIGEgZ29vZCBpZGVhCisgKglfTk9UXyB0byBpc3N1ZSB0aGVtIHRvIHJhbmRvbSBvYmplY3RzIGFuZCBob3BlLgorICoKKyAqCVRIRVNFIElPQ1RMUyBBUkUgX0RFUFJFQ0FURURfIEFORCBXSUxMIERJU0FQUEVBUiBJTiAyLjUuWCAtRGF2ZU0KKyAqLworIAorI2RlZmluZSBTSU9DREVWUFJJVkFURQkweDg5RjAJLyogdG8gODlGRiAqLworCisvKgorICoJVGhlc2UgMTYgaW9jdGwgY2FsbHMgYXJlIHByb3RvY29sIHByaXZhdGUKKyAqLworIAorI2RlZmluZSBTSU9DUFJPVE9QUklWQVRFIDB4ODlFMCAvKiB0byA4OUVGICovCisjZW5kaWYJLyogX0xJTlVYX1NPQ0tJT1NfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb20uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc29tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2NTk0ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc29tLmgKQEAgLTAsMCArMSwxNTQgQEAKKyNpZm5kZWYgX0xJTlVYX1NPTV9ICisjZGVmaW5lIF9MSU5VWF9TT01fSAorCisvKiBGaWxlIGZvcm1hdCBkZWZpbml0aW9uIGZvciBTT00gZXhlY3V0YWJsZXMgLyBzaGFyZWQgbGlicmFyaWVzICovCisKKy8qIHdlIG5lZWQgc3RydWN0IHRpbWVzcGVjICovCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisjZGVmaW5lIFNPTV9QQUdFU0laRSA0MDk2CisKKy8qIHRoaXMgaXMgdGhlIFNPTSBoZWFkZXIgKi8KK3N0cnVjdCBzb21faGRyIHsKKwlzaG9ydAkJc3lzdGVtX2lkOwkJLyogbWFnaWMgbnVtYmVyIC0gc3lzdGVtICovCisJc2hvcnQJCWFfbWFnaWM7CQkvKiBtYWdpYyBudW1iZXIgLSBmaWxlIHR5cGUgKi8KKwl1bnNpZ25lZCBpbnQJdmVyc2lvbl9pZDsJCS8qIHZlcnNpb2QgSUQ6IFlZTU1EREhIICovCisJc3RydWN0IHRpbWVzcGVjCWZpbGVfdGltZTsJCS8qIHN5c3RlbSBjbG9jayAqLworCXVuc2lnbmVkIGludAllbnRyeV9zcGFjZTsJCS8qIHNwYWNlIGZvciBlbnRyeSBwb2ludCAqLworCXVuc2lnbmVkIGludAllbnRyeV9zdWJzcGFjZTsJCS8qIHN1YnNwYWNlIGZvciBlbnRyeSBwb2ludCAqLworCXVuc2lnbmVkIGludAllbnRyeV9vZmZzZXQ7CQkvKiBvZmZzZXQgb2YgZW50cnkgcG9pbnQgKi8KKwl1bnNpZ25lZCBpbnQJYXV4X2hlYWRlcl9sb2NhdGlvbjsJLyogYXV4aWxpYXJ5IGhlYWRlciBsb2NhdGlvbiAqLworCXVuc2lnbmVkIGludAlhdXhfaGVhZGVyX3NpemU7CS8qIGF1eGlsaWFyeSBoZWFkZXIgc2l6ZSAqLworCXVuc2lnbmVkIGludAlzb21fbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIGVudGlyZSBTT00gKi8KKwl1bnNpZ25lZCBpbnQJcHJlc3VtZWRfZHA7CQkvKiBjb21waWxlcidzIERQIHZhbHVlICovCisJdW5zaWduZWQgaW50CXNwYWNlX2xvY2F0aW9uOwkJLyogc3BhY2UgZGljdGlvbmFyeSBsb2NhdGlvbiAqLworCXVuc2lnbmVkIGludAlzcGFjZV90b3RhbDsJCS8qIG51bWJlciBvZiBzcGFjZSBlbnRyaWVzICovCisJdW5zaWduZWQgaW50CXN1YnNwYWNlX2xvY2F0aW9uOwkvKiBzdWJzcGFjZSBlbnRyaWVzIGxvY2F0aW9uICovCisJdW5zaWduZWQgaW50CXN1YnNwYWNlX3RvdGFsOwkJLyogbnVtYmVyIG9mIHN1YnNwYWNlIGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQJbG9hZGVyX2ZpeHVwX2xvY2F0aW9uOwkvKiBNUEUvaVggbG9hZGVyIGZpeHVwICovCisJdW5zaWduZWQgaW50CWxvYWRlcl9maXh1cF90b3RhbDsJLyogbnVtYmVyIG9mIGZpeHVwIHJlY29yZHMgKi8KKwl1bnNpZ25lZCBpbnQJc3BhY2Vfc3RyaW5nc19sb2NhdGlvbjsJLyogKHN1YilzcGFjZSBuYW1lcyAqLworCXVuc2lnbmVkIGludAlzcGFjZV9zdHJpbmdzX3NpemU7CS8qIHNpemUgb2Ygc3RyaW5ncyBhcmVhICovCisJdW5zaWduZWQgaW50CWluaXRfYXJyYXlfbG9jYXRpb247CS8qIHJlc2VydmVkICovCisJdW5zaWduZWQgaW50CWluaXRfYXJyYXlfdG90YWw7CS8qIHJlc2VydmVkICovCisJdW5zaWduZWQgaW50CWNvbXBpbGVyX2xvY2F0aW9uOwkvKiBtb2R1bGUgZGljdGlvbmFyeSAqLworCXVuc2lnbmVkIGludAljb21waWxlcl90b3RhbDsJCS8qIG51bWJlciBvZiBtb2R1bGVzICovCisJdW5zaWduZWQgaW50CXN5bWJvbF9sb2NhdGlvbjsJLyogc3ltYm9sIGRpY3Rpb25hcnkgKi8KKwl1bnNpZ25lZCBpbnQJc3ltYm9sX3RvdGFsOwkJLyogbnVtYmVyIG9mIHN5bWJvbHMgKi8KKwl1bnNpZ25lZCBpbnQJZml4dXBfcmVxdWVzdF9sb2NhdGlvbjsJLyogZml4dXAgcmVxdWVzdHMgKi8KKwl1bnNpZ25lZCBpbnQJZml4dXBfcmVxdWVzdF90b3RhbDsJLyogbnVtYmVyIG9mIGZpeHVwIHJlcXVlc3RzICovCisJdW5zaWduZWQgaW50CXN5bWJvbF9zdHJpbmdzX2xvY2F0aW9uOy8qIG1vZHVsZSAmIHN5bWJvbCBuYW1lcyBhcmVhICovCisJdW5zaWduZWQgaW50CXN5bWJvbF9zdHJpbmdzX3NpemU7CS8qIHNpemUgb2Ygc3RyaW5ncyBhcmVhICovCisJdW5zaWduZWQgaW50CXVubG9hZGFibGVfc3BfbG9jYXRpb247CS8qIHVubG9hZGFibGUgc3BhY2VzIGxvY2F0aW9uICovCisJdW5zaWduZWQgaW50CXVubG9hZGFibGVfc3Bfc2l6ZTsJLyogc2l6ZSBvZiBkYXRhICovCisJdW5zaWduZWQgaW50CWNoZWNrc3VtOworfTsKKworLyogdmFsdWVzIGZvciBzeXN0ZW1faWQgKi8KKworI2RlZmluZSBTT01fU0lEX1BBUklTQ18xXzAJMHgwMjBiCisjZGVmaW5lIFNPTV9TSURfUEFSSVNDXzFfMQkweDAyMTAKKyNkZWZpbmUgU09NX1NJRF9QQVJJU0NfMl8wCTB4MDIxNAorCisvKiB2YWx1ZXMgZm9yIGFfbWFnaWMgKi8KKworI2RlZmluZSBTT01fTElCX0VYRUMJCTB4MDEwNAorI2RlZmluZSBTT01fUkVMT0NBVEFCTEUJCTB4MDEwNgorI2RlZmluZSBTT01fRVhFQ19OT05TSEFSRQkweDAxMDcKKyNkZWZpbmUgU09NX0VYRUNfU0hBUkUJCTB4MDEwOAorI2RlZmluZSBTT01fRVhFQ19ERU1BTkQJCTB4MDEwQgorI2RlZmluZSBTT01fTElCX0RZTgkJMHgwMTBECisjZGVmaW5lIFNPTV9MSUJfU0hBUkUJCTB4MDEwRQorI2RlZmluZSBTT01fTElCX1JFTE9DCQkweDA2MTkKKworLyogdmFsdWVzIGZvciB2ZXJzaW9uX2lkLiAgRGVjaW1hbCBub3QgaGV4LCB5ZXMuICBHcnIuICovCisKKyNkZWZpbmUgU09NX0lEX09MRAkJODUwODIxMTIKKyNkZWZpbmUgU09NX0lEX05FVwkJODcxMDI0MTIKKworc3RydWN0IGF1eF9pZCB7CisJdW5zaWduZWQgaW50CW1hbmRhdG9yeSA6MTsJLyogdGhlIGxpbmtlciBtdXN0IHVuZGVyc3RhbmQgdGhpcyAqLworCXVuc2lnbmVkIGludAljb3B5CSAgOjE7CS8qIE11c3QgYmUgY29waWVkIGJ5IHRoZSBsaW5rZXIgKi8KKwl1bnNpZ25lZCBpbnQJYXBwZW5kCSAgOjE7CS8qIE11c3QgYmUgbWVyZ2VkIGJ5IHRoZSBsaW5rZXIgKi8KKwl1bnNpZ25lZCBpbnQJaWdub3JlCSAgOjE7CS8qIERpc2NhcmQgc2VjdGlvbiBpZiB1bmtub3duICovCisJdW5zaWduZWQgaW50CXJlc2VydmVkICA6MTI7CisJdW5zaWduZWQgaW50CXR5cGUJICA6MTY7CS8qIEhlYWRlciB0eXBlICovCisJdW5zaWduZWQgaW50CWxlbmd0aDsJCS8qIGxlbmd0aCBvZiBfZm9sbG93aW5nXyBkYXRhICovCit9OworCisvKiBUaGUgRXhlYyBBdXhpbGlhcnkgSGVhZGVyLiAgQ2FsbGVkIFRoZSBIUC1VWCBIZWFkZXIgd2l0aGluIEhQIGFwcGFyZW50bHkuICovCitzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyIHsKKwlzdHJ1Y3QgYXV4X2lkCXNvbV9hdXhoZHI7CisJaW50CQlleGVjX3RzaXplOwkvKiBUZXh0IHNpemUgaW4gYnl0ZXMgKi8KKwlpbnQJCWV4ZWNfdG1lbTsJLyogQWRkcmVzcyB0byBsb2FkIHRleHQgYXQgKi8KKwlpbnQJCWV4ZWNfdGZpbGU7CS8qIExvY2F0aW9uIG9mIHRleHQgaW4gZmlsZSAqLworCWludAkJZXhlY19kc2l6ZTsJLyogRGF0YSBzaXplIGluIGJ5dGVzICovCisJaW50CQlleGVjX2RtZW07CS8qIEFkZHJlc3MgdG8gbG9hZCBkYXRhIGF0ICovCisJaW50CQlleGVjX2RmaWxlOwkvKiBMb2NhdGlvbiBvZiBkYXRhIGluIGZpbGUgKi8KKwlpbnQJCWV4ZWNfYnNpemU7CS8qIFVuaW5pdGlhbGlzZWQgZGF0YSAoYnNzKSAqLworCWludAkJZXhlY19lbnRyeTsJLyogQWRkcmVzcyB0byBzdGFydCBleGVjdXRpbmcgKi8KKwlpbnQJCWV4ZWNfZmxhZ3M7CS8qIGxvYWRlciBmbGFncyAqLworCWludAkJZXhlY19iZmlsbDsJLyogaW5pdGlhbGlzYXRpb24gdmFsdWUgZm9yIGJzcyAqLworfTsKKworLyogT2gsIHRoZSB0aGluZ3MgcGVvcGxlIGRvIHRvIGF2b2lkIGNhc3RzLiAgU2hhbWUgaXQnbGwgYnJlYWsgd2l0aCBnY2MncworICogbmV3IGFsaWFzaW5nIHJ1bGVzIHJlYWxseS4KKyAqLwordW5pb24gbmFtZV9wdCB7CisJY2hhciAqCQluX25hbWU7CisJdW5zaWduZWQgaW50CW5fc3RyeDsKK307CisKKy8qIFRoZSBTcGFjZSBEaWN0aW9uYXJ5ICovCitzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQgeworCXVuaW9uIG5hbWVfcHQJbmFtZTsJCQkvKiBpbmRleCB0byBzdWJzcGFjZSBuYW1lICovCisJdW5zaWduZWQgaW50CWlzX2xvYWRhYmxlCToxOwkvKiBsb2FkYWJsZSAqLworCXVuc2lnbmVkIGludAlpc19kZWZpbmVkCToxOwkvKiBkZWZpbmVkIHdpdGhpbiBmaWxlICovCisJdW5zaWduZWQgaW50CWlzX3ByaXZhdGUJOjE7CS8qIG5vdCBzaGFyYWJsZSAqLworCXVuc2lnbmVkIGludAloYXNfaW50ZXJtZWRpYXRlX2NvZGUgOjE7IC8qIGNvbnRhaW5zIGludGVybWVkaWF0ZSBjb2RlICovCisJdW5zaWduZWQgaW50CWlzX3RzcGVjaWZpYwk6MTsJLyogdGhyZWFkIHNwZWNpZmljICovCisJdW5zaWduZWQgaW50CXJlc2VydmVkCToxMTsJLyogZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKwl1bnNpZ25lZCBpbnQJc29ydF9rZXkJOjg7CS8qIGZvciBsaW5rZXIgKi8KKwl1bnNpZ25lZCBpbnQJcmVzZXJ2ZWQyCTo4OwkvKiBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworCisJaW50CQlzcGFjZV9udW1iZXI7CQkvKiBpbmRleCAqLworCWludAkJc3Vic3BhY2VfaW5kZXg7CQkvKiBpbmRleCBpbnRvIHN1YnNwYWNlIGRpY3QgKi8KKwl1bnNpZ25lZCBpbnQJc3Vic3BhY2VfcXVhbnRpdHk7CS8qIG51bWJlciBvZiBzdWJzcGFjZXMgKi8KKwlpbnQJCWxvYWRlcl9maXhfaW5kZXg7CS8qIGZvciBsb2FkZXIgKi8KKwl1bnNpZ25lZCBpbnQJbG9hZGVyX2ZpeF9xdWFudGl0eTsJLyogZm9yIGxvYWRlciAqLworCWludAkJaW5pdF9wb2ludGVyX2luZGV4OwkvKiBkYXRhIHBvaW50ZXIgYXJyYXkgaW5kZXggKi8KKwl1bnNpZ25lZCBpbnQJaW5pdF9wb2ludGVyX3F1YW50aXR5OwkvKiBudW1iZXIgb2YgZGF0YSBwb2ludGVycyAqLworfTsKKworLyogVGhlIFN1YnNwYWNlIERpY3Rpb25hcnkgKi8KK3N0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCB7CisJaW50CQlzcGFjZV9pbmRleDsKKwl1bnNpZ25lZCBpbnQJYWNjZXNzX2NvbnRyb2xfYml0cyA6NzsKKwl1bnNpZ25lZCBpbnQJbWVtb3J5X3Jlc2lkZW50CToxOworCXVuc2lnbmVkIGludAlkdXBfY29tbW9uCToxOworCXVuc2lnbmVkIGludAlpc19jb21tb24JOjE7CisJdW5zaWduZWQgaW50CXF1YWRyYW50CToyOworCXVuc2lnbmVkIGludAlpbml0aWFsbHlfZnJvemVuIDoxOworCXVuc2lnbmVkIGludAlpc19maXJzdAk6MTsKKwl1bnNpZ25lZCBpbnQJY29kZV9vbmx5CToxOworCXVuc2lnbmVkIGludAlzb3J0X2tleQk6ODsKKwl1bnNpZ25lZCBpbnQJcmVwbGljYXRlX2luaXQJOjE7CisJdW5zaWduZWQgaW50CWNvbnRpbnVhdGlvbgk6MTsKKwl1bnNpZ25lZCBpbnQJaXNfdHNwZWNpZmljCToxOworCXVuc2lnbmVkIGludAlpc19jb21kYXQJOjE7CisJdW5zaWduZWQgaW50CXJlc2VydmVkCTo0OworCisJaW50CQlmaWxlX2xvY19pbml0X3ZhbHVlOworCXVuc2lnbmVkIGludAlpbml0aWFsaXphdGlvbl9sZW5ndGg7CisJdW5zaWduZWQgaW50CXN1YnNwYWNlX3N0YXJ0OworCXVuc2lnbmVkIGludAlzdWJzcGFjZV9sZW5ndGg7CisKKwl1bnNpZ25lZCBpbnQJcmVzZXJ2ZWQyCTo1OworCXVuc2lnbmVkIGludAlhbGlnbm1lbnQJOjI3OworCisJdW5pb24gbmFtZV9wdAluYW1lOworCWludAkJZml4dXBfcmVxdWVzdF9pbmRleDsKKwl1bnNpZ25lZCBpbnQJZml4dXBfcmVxdWVzdF9xdWFudGl0eTsKK307CisKKyNlbmRpZiAvKiBfTElOVVhfU09NX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc29uZXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc29uZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDY4MjkzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb25ldC5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qIHNvbmV0LmggLSBTT05FVC9TSEQgcGh5c2ljYWwgbGF5ZXIgY29udHJvbCAqLworIAorLyogV3JpdHRlbiAxOTk1LTIwMDAgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKyAKKworI2lmbmRlZiBMSU5VWF9TT05FVF9ICisjZGVmaW5lIExJTlVYX1NPTkVUX0gKKworI2RlZmluZSBfX1NPTkVUX0lURU1TIFwKKyAgICBfX0hBTkRMRV9JVEVNKHNlY3Rpb25fYmlwKTsgCS8qIHNlY3Rpb24gcGFyaXR5IGVycm9ycyAoQjEpICovIFwKKyAgICBfX0hBTkRMRV9JVEVNKGxpbmVfYmlwKTsJCS8qIGxpbmUgcGFyaXR5IGVycm9ycyAoQjIpICovIFwKKyAgICBfX0hBTkRMRV9JVEVNKHBhdGhfYmlwKTsJCS8qIHBhdGggcGFyaXR5IGVycm9ycyAoQjMpICovIFwKKyAgICBfX0hBTkRMRV9JVEVNKGxpbmVfZmViZSk7CQkvKiBsaW5lIHBhcml0eSBlcnJvcnMgYXQgcmVtb3RlICovIFwKKyAgICBfX0hBTkRMRV9JVEVNKHBhdGhfZmViZSk7CQkvKiBwYXRoIHBhcml0eSBlcnJvcnMgYXQgcmVtb3RlICovIFwKKyAgICBfX0hBTkRMRV9JVEVNKGNvcnJfaGNzKTsJCS8qIGNvcnJlY3RhYmxlIGhlYWRlciBlcnJvcnMgKi8gXAorICAgIF9fSEFORExFX0lURU0odW5jb3JyX2hjcyk7CQkvKiB1bmNvcnJlY3RhYmxlIGhlYWRlciBlcnJvcnMgKi8gXAorICAgIF9fSEFORExFX0lURU0odHhfY2VsbHMpOwkJLyogY2VsbHMgc2VudCAqLyBcCisgICAgX19IQU5ETEVfSVRFTShyeF9jZWxscyk7CQkvKiBjZWxscyByZWNlaXZlZCAqLworCitzdHJ1Y3Qgc29uZXRfc3RhdHMgeworI2RlZmluZSBfX0hBTkRMRV9JVEVNKGkpIGludCBpCisJX19TT05FVF9JVEVNUworI3VuZGVmIF9fSEFORExFX0lURU0KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKKyNkZWZpbmUgU09ORVRfR0VUU1RBVAlfSU9SKCdhJyxBVE1JT0NfUEhZVFlQLHN0cnVjdCBzb25ldF9zdGF0cykKKwkJCQkJLyogZ2V0IHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgU09ORVRfR0VUU1RBVFoJX0lPUignYScsQVRNSU9DX1BIWVRZUCsxLHN0cnVjdCBzb25ldF9zdGF0cykKKwkJCQkJLyogLi4uIGFuZCB6ZXJvIGNvdW50ZXJzICovCisjZGVmaW5lIFNPTkVUX1NFVERJQUcJX0lPV1IoJ2EnLEFUTUlPQ19QSFlUWVArMixpbnQpCisJCQkJCS8qIHNldCBlcnJvciBpbnNlcnRpb24gKi8KKyNkZWZpbmUgU09ORVRfQ0xSRElBRwlfSU9XUignYScsQVRNSU9DX1BIWVRZUCszLGludCkKKwkJCQkJLyogY2xlYXIgZXJyb3IgaW5zZXJ0aW9uICovCisjZGVmaW5lIFNPTkVUX0dFVERJQUcJX0lPUignYScsQVRNSU9DX1BIWVRZUCs0LGludCkKKwkJCQkJLyogcXVlcnkgZXJyb3IgaW5zZXJ0aW9uICovCisjZGVmaW5lIFNPTkVUX1NFVEZSQU1JTkcgX0lPVygnYScsQVRNSU9DX1BIWVRZUCs1LGludCkKKwkJCQkJLyogc2V0IGZyYW1pbmcgbW9kZSAoU09ORVQvU0RIKSAqLworI2RlZmluZSBTT05FVF9HRVRGUkFNSU5HIF9JT1IoJ2EnLEFUTUlPQ19QSFlUWVArNixpbnQpCisJCQkJCS8qIGdldCBmcmFtaW5nIG1vZGUgKi8KKyNkZWZpbmUgU09ORVRfR0VURlJTRU5TRSBfSU9SKCdhJyxBVE1JT0NfUEhZVFlQKzcsIFwKKyAgdW5zaWduZWQgY2hhcltTT05FVF9GUlNFTlNFX1NJWkVdKQkvKiBnZXQgZnJhbWluZyBzZW5zZSBpbmZvcm1hdGlvbiAqLworCisjZGVmaW5lIFNPTkVUX0lOU19TQklQCSAgMQkJLyogc2VjdGlvbiBCSVAgKi8KKyNkZWZpbmUgU09ORVRfSU5TX0xCSVAJICAyCQkvKiBsaW5lIEJJUCAqLworI2RlZmluZSBTT05FVF9JTlNfUEJJUAkgIDQJCS8qIHBhdGggQklQICovCisjZGVmaW5lIFNPTkVUX0lOU19GUkFNRQkgIDgJCS8qIG91dCBvZiBmcmFtZSAqLworI2RlZmluZSBTT05FVF9JTlNfTE9TCSAxNgkJLyogc2V0IGxpbmUgdG8gemVybyAqLworI2RlZmluZSBTT05FVF9JTlNfTEFJUwkgMzIJCS8qIGxpbmUgYWxhcm0gaW5kaWNhdGlvbiBzaWduYWwgKi8KKyNkZWZpbmUgU09ORVRfSU5TX1BBSVMJIDY0CQkvKiBwYXRoIGFsYXJtIGluZGljYXRpb24gc2lnbmFsICovCisjZGVmaW5lIFNPTkVUX0lOU19IQ1MJMTI4CQkvKiBpbnNlcnQgSENTIGVycm9yICovCisKKyNkZWZpbmUgU09ORVRfRlJBTUVfU09ORVQgMAkJLyogU09ORVQgU1RTLTMgZnJhbWluZyAqLworI2RlZmluZSBTT05FVF9GUkFNRV9TREggICAxCQkvKiBTREggU1RNLTEgZnJhbWluZyAqLworCisjZGVmaW5lIFNPTkVUX0ZSU0VOU0VfU0laRSA2CQkvKiBDMVszXSxIMVszXSAoMHhmZiBmb3IgdW5rbm93bikgKi8KKworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb255cGkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc29ueXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1ZGEwZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc29ueXBpLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBTb255IFByb2dyYW1tYWJsZSBJL08gQ29udHJvbCBEZXZpY2UgZHJpdmVyIGZvciBWQUlPCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgU3RlbGlhbiBQb3AgPHN0ZWxpYW5AcG9waWVzLm5ldD4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTmFyYXlhbmFuIFIgUyA8bmFyc0BrYWRhbWJhLm9yZz4KKworICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgQWxjw7R2ZSA8d3d3LmFsY292ZS5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIE1pY2hhZWwgQXNobGV5IDxtLmFzaGxleUB1bnN3LmVkdS5hdT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgSnVuaWNoaSBNb3JpdGEgPGp1bjFtQG1hcnMuZHRpLm5lLmpwPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBUYWtheWEgS2luam8gPHQta2luam9AdGM0LnNvLW5ldC5uZS5qcD4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgQW5kcmV3IFRyaWRnZWxsIDx0cmlkZ2VAdmFsaW51eC5jb20+CisgKgorICogRWFybGllciB3b3JrIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgUGF1bCBgUnVzdHknIFJ1c3NlbGwgYW5kIFBhdWwgTWFja2VycmFzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9TT05ZUElfSF8KKyNkZWZpbmUgX1NPTllQSV9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogZXZlbnRzIHRoZSB1c2VyIGFwcGxpY2F0aW9uIHJlYWRpbmcgL2Rldi9zb255cGkgY2FuIHVzZSAqLworCisjZGVmaW5lIFNPTllQSV9FVkVOVF9JR05PUkUJCQkgMAorI2RlZmluZSBTT05ZUElfRVZFTlRfSk9HRElBTF9ET1dOCQkgMQorI2RlZmluZSBTT05ZUElfRVZFTlRfSk9HRElBTF9VUAkJCSAyCisjZGVmaW5lIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV05fUFJFU1NFRAkgMworI2RlZmluZSBTT05ZUElfRVZFTlRfSk9HRElBTF9VUF9QUkVTU0VECQkgNAorI2RlZmluZSBTT05ZUElfRVZFTlRfSk9HRElBTF9QUkVTU0VECQkgNQorI2RlZmluZSBTT05ZUElfRVZFTlRfSk9HRElBTF9SRUxFQVNFRAkJIDYJLyogb2Jzb2xldGUgKi8KKyNkZWZpbmUgU09OWVBJX0VWRU5UX0NBUFRVUkVfUFJFU1NFRAkJIDcKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0NBUFRVUkVfUkVMRUFTRUQJCSA4CS8qIG9ic29sZXRlICovCisjZGVmaW5lIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BBUlRJQUxQUkVTU0VECSA5CisjZGVmaW5lIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BBUlRJQUxSRUxFQVNFRAkxMAorI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfRVNDCQkJMTEKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX0YxCQkJMTIKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX0YyCQkJMTMKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX0YzCQkJMTQKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX0Y0CQkJMTUKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX0Y1CQkJMTYKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX0Y2CQkJMTcKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX0Y3CQkJMTgKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX0Y4CQkJMTkKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX0Y5CQkJMjAKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMAkJCTIxCisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9GMTEJCQkyMgorI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfRjEyCQkJMjMKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZXzEJCQkyNAorI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfMgkJCTI1CisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9ECQkJMjYKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX0UJCQkyNworI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfRgkJCTI4CisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9TCQkJMjkKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX0IJCQkzMAorI2RlZmluZSBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX1BSRVNTRUQJCTMxCisjZGVmaW5lIFNPTllQSV9FVkVOVF9QS0VZX1AxCQkJMzIKKyNkZWZpbmUgU09OWVBJX0VWRU5UX1BLRVlfUDIJCQkzMworI2RlZmluZSBTT05ZUElfRVZFTlRfUEtFWV9QMwkJCTM0CisjZGVmaW5lIFNPTllQSV9FVkVOVF9CQUNLX1BSRVNTRUQJCTM1CisjZGVmaW5lIFNPTllQSV9FVkVOVF9MSURfQ0xPU0VECQkJMzYKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0xJRF9PUEVORUQJCQkzNworI2RlZmluZSBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX09OCQkzOAorI2RlZmluZSBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX09GRgkJMzkKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0hFTFBfUFJFU1NFRAkJNDAKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX09OTFkJCQk0MQorI2RlZmluZSBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX0RPV04JCTQyCisjZGVmaW5lIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfVVAJCTQzCisjZGVmaW5lIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfRE9XTl9QUkVTU0VECTQ0CisjZGVmaW5lIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfVVBfUFJFU1NFRAk0NQorI2RlZmluZSBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9ET1dOCQk0NgorI2RlZmluZSBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9VUAkJNDcKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfRE9XTl9QUkVTU0VECTQ4CisjZGVmaW5lIFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX1VQX1BSRVNTRUQJNDkKKyNkZWZpbmUgU09OWVBJX0VWRU5UX1pPT01fUFJFU1NFRAkJNTAKKyNkZWZpbmUgU09OWVBJX0VWRU5UX1RIVU1CUEhSQVNFX1BSRVNTRUQJNTEKKyNkZWZpbmUgU09OWVBJX0VWRU5UX01FWUVfRkFDRQkJCTUyCisjZGVmaW5lIFNPTllQSV9FVkVOVF9NRVlFX09QUE9TSVRFCQk1MworI2RlZmluZSBTT05ZUElfRVZFTlRfTUVNT1JZU1RJQ0tfSU5TRVJUCQk1NAorI2RlZmluZSBTT05ZUElfRVZFTlRfTUVNT1JZU1RJQ0tfRUpFQ1QJCTU1CisjZGVmaW5lIFNPTllQSV9FVkVOVF9BTllCVVRUT05fUkVMRUFTRUQJCTU2CisjZGVmaW5lIFNPTllQSV9FVkVOVF9CQVRURVJZX0lOU0VSVAkJNTcKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0JBVFRFUllfUkVNT1ZFCQk1OAorI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfUkVMRUFTRUQJCTU5CisjZGVmaW5lIFNPTllQSV9FVkVOVF9XSVJFTEVTU19PTgkJNjAKKyNkZWZpbmUgU09OWVBJX0VWRU5UX1dJUkVMRVNTX09GRgkJNjEKKyNkZWZpbmUgU09OWVBJX0VWRU5UX1pPT01fSU5fUFJFU1NFRAkJNjIKKyNkZWZpbmUgU09OWVBJX0VWRU5UX1pPT01fT1VUX1BSRVNTRUQJCTYzCisjZGVmaW5lIFNPTllQSV9FVkVOVF9DRF9FSkVDVF9QUkVTU0VECQk2NAorI2RlZmluZSBTT05ZUElfRVZFTlRfTU9ERUtFWV9QUkVTU0VECQk2NQorI2RlZmluZSBTT05ZUElfRVZFTlRfUEtFWV9QNAkJCTY2CisjZGVmaW5lIFNPTllQSV9FVkVOVF9QS0VZX1A1CQkJNjcKKyNkZWZpbmUgU09OWVBJX0VWRU5UX1NFVFRJTkdLRVlfUFJFU1NFRAkJNjgKKyNkZWZpbmUgU09OWVBJX0VWRU5UX1ZPTFVNRV9JTkNfUFJFU1NFRAkJNjkKKyNkZWZpbmUgU09OWVBJX0VWRU5UX1ZPTFVNRV9ERUNfUFJFU1NFRAkJNzAKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0JSSUdIVE5FU1NfUFJFU1NFRAkJNzEKKyNkZWZpbmUgU09OWVBJX0VWRU5UX01FRElBX1BSRVNTRUQJCTcyCisjZGVmaW5lIFNPTllQSV9FVkVOVF9WRU5ET1JfUFJFU1NFRAkJNzMKKworLyogZ2V0L3NldCBicmlnaHRuZXNzICovCisjZGVmaW5lIFNPTllQSV9JT0NHQlJUCQlfSU9SKCd2JywgMCwgX191OCkKKyNkZWZpbmUgU09OWVBJX0lPQ1NCUlQJCV9JT1coJ3YnLCAwLCBfX3U4KQorCisvKiBnZXQgYmF0dGVyeSBmdWxsIGNhcGFjaXR5L3JlbWFpbmluZyBjYXBhY2l0eSAqLworI2RlZmluZSBTT05ZUElfSU9DR0JBVDFDQVAJX0lPUigndicsIDIsIF9fdTE2KQorI2RlZmluZSBTT05ZUElfSU9DR0JBVDFSRU0JX0lPUigndicsIDMsIF9fdTE2KQorI2RlZmluZSBTT05ZUElfSU9DR0JBVDJDQVAJX0lPUigndicsIDQsIF9fdTE2KQorI2RlZmluZSBTT05ZUElfSU9DR0JBVDJSRU0JX0lPUigndicsIDUsIF9fdTE2KQorCisvKiBnZXQgYmF0dGVyeSBmbGFnczogYmF0dGVyeTEvYmF0dGVyeTIvYWMgYWRhcHRlciBwcmVzZW50ICovCisjZGVmaW5lIFNPTllQSV9CRkxBR1NfQjEJMHgwMQorI2RlZmluZSBTT05ZUElfQkZMQUdTX0IyCTB4MDIKKyNkZWZpbmUgU09OWVBJX0JGTEFHU19BQwkweDA0CisjZGVmaW5lIFNPTllQSV9JT0NHQkFURkxBR1MJX0lPUigndicsIDcsIF9fdTgpCisKKy8qIGdldC9zZXQgYmx1ZXRvb3RoIHN1YnN5c3RlbSBzdGF0ZSBvbi9vZmYgKi8KKyNkZWZpbmUgU09OWVBJX0lPQ0dCTFVFCQlfSU9SKCd2JywgOCwgX191OCkKKyNkZWZpbmUgU09OWVBJX0lPQ1NCTFVFCQlfSU9XKCd2JywgOSwgX191OCkKKworLyogZ2V0L3NldCBmYW4gc3RhdGUgb24vb2ZmICovCisjZGVmaW5lIFNPTllQSV9JT0NHRkFOCQlfSU9SKCd2JywgMTAsIF9fdTgpCisjZGVmaW5lIFNPTllQSV9JT0NTRkFOCQlfSU9XKCd2JywgMTEsIF9fdTgpCisKKy8qIGdldCB0ZW1wZXJhdHVyZSAoQykgKi8KKyNkZWZpbmUgU09OWVBJX0lPQ0dURU1QCQlfSU9SKCd2JywgMTIsIF9fdTgpCisKKworI2VuZGlmCQkJCS8qIF9TT05ZUElfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc291bmQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc291bmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGQ4NDJlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb3VuZC5oCkBAIC0wLDAgKzEsMjcgQEAKKworLyoKKyAqIE1pbm9yIG51bWJlcnMgZm9yIHRoZSBzb3VuZCBkcml2ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKyNkZWZpbmUgU05EX0RFVl9DVEwJCTAJLyogQ29udHJvbCBwb3J0IC9kZXYvbWl4ZXIgKi8KKyNkZWZpbmUgU05EX0RFVl9TRVEJCTEJLyogU2VxdWVuY2VyIG91dHB1dCAvZGV2L3NlcXVlbmNlciAoRk0KKwkJCQkJCXN5bnRoZXNpemVyIGFuZCBNSURJIG91dHB1dCkgKi8KKyNkZWZpbmUgU05EX0RFVl9NSURJTgkJMgkvKiBSYXcgbWlkaSBhY2Nlc3MgKi8KKyNkZWZpbmUgU05EX0RFVl9EU1AJCTMJLyogRGlnaXRpemVkIHZvaWNlIC9kZXYvZHNwICovCisjZGVmaW5lIFNORF9ERVZfQVVESU8JCTQJLyogU3BhcmMgY29tcGF0aWJsZSAvZGV2L2F1ZGlvICovCisjZGVmaW5lIFNORF9ERVZfRFNQMTYJCTUJLyogTGlrZSAvZGV2L2RzcCBidXQgMTYgYml0cy9zYW1wbGUgKi8KKy8qICNkZWZpbmUgU05EX0RFVl9TVEFUVVMJNiAqLwkvKiAvZGV2L3NuZHN0YXQgKG9ic29sZXRlKSAqLworI2RlZmluZSBTTkRfREVWX1VOVVNFRAkJNgorI2RlZmluZSBTTkRfREVWX0FXRk0JCTcJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgU05EX0RFVl9TRVEyCQk4CS8qIC9kZXYvc2VxdWVuY2VyLCBsZXZlbCAyIGludGVyZmFjZSAqLworLyogI2RlZmluZSBTTkRfREVWX1NORFBST0MJOSAqLwkvKiAvZGV2L3NuZHByb2MgZm9yIHByb2dyYW1tYWJsZSBkZXZpY2VzIChub3QgdXNlZCkgKi8KKy8qICNkZWZpbmUgU05EX0RFVl9ETU1JREkJOSAqLworI2RlZmluZSBTTkRfREVWX1NZTlRICQk5CS8qIFJhdyBzeW50aCBhY2Nlc3MgL2Rldi9zeW50aCAoc2FtZSBhcyAvZGV2L2RtZm0pICovCisjZGVmaW5lIFNORF9ERVZfRE1GTQkJMTAJLyogUmF3IHN5bnRoIGFjY2VzcyAvZGV2L2RtZm0gKi8KKyNkZWZpbmUgU05EX0RFVl9VTktOT1dOMTEJMTEKKyNkZWZpbmUgU05EX0RFVl9BRFNQCQkxMgkvKiBMaWtlIC9kZXYvZHNwIChvYnNvbGV0ZSkgKi8KKyNkZWZpbmUgU05EX0RFVl9BTUlESQkJMTMJLyogTGlrZSAvZGV2L21pZGkgKG9ic29sZXRlKSAqLworI2RlZmluZSBTTkRfREVWX0FETU1JREkJCTE0CS8qIExpa2UgL2Rldi9kbW1pZGkgKG9uc29sZXRlKSAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvdW5kY2FyZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb3VuZGNhcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGY2NWJlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb3VuZGNhcmQuaApAQCAtMCwwICsxLDEyNzYgQEAKKyNpZm5kZWYgU09VTkRDQVJEX0gKKyNkZWZpbmUgU09VTkRDQVJEX0gKKy8qCisgKiBDb3B5cmlnaHQgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gMi4KKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKworLyoKKyAqIE9TUyBpbnRlcmZhY2UgdmVyc2lvbi4gV2l0aCB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gMy42IHRoaXMgdmFsdWUgaXMKKyAqIGFuIGludGVnZXIgd2l0aCB2YWx1ZSBsZXNzIHRoYW4gMzYxLiBJbiB2ZXJzaW9ucyAzLjYgYW5kIGxhdGVyCisgKiBpdCdzIGEgc2l4IGRpZ2l0IGhleGFkZWNpbWFsIHZhbHVlLiBGb3IgZXhhbXBsZSB2YWx1ZQorICogb2YgMHgwMzA2MDAgcmVwcmVzZW50cyBPU1MgdmVyc2lvbiAzLjYuMC4KKyAqIFVzZSBpb2N0bChmZCwgT1NTX0dFVFZFUlNJT04sICZpbnQpIHRvIGdldCB0aGUgdmVyc2lvbiBudW1iZXIgb2YKKyAqIHRoZSBjdXJyZW50bHkgYWN0aXZlIGRyaXZlci4KKyAqLworI2RlZmluZSBTT1VORF9WRVJTSU9OCTB4MDMwODAyCisjZGVmaW5lIE9QRU5fU09VTkRfU1lTVEVNCisKKy8qIEluIExpbnV4IHdlIG5lZWQgdG8gYmUgcHJlcGFyZWQgZm9yIGNyb3NzIGNvbXBpbGluZyAqLworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKy8qIEVuZGlhbiBtYWNyb3MuICovCisjICBpbmNsdWRlIDxlbmRpYW4uaD4KKworLyoKKyAqCVN1cHBvcnRlZCBjYXJkIElEIG51bWJlcnMgKFNob3VsZCBiZSBzb21ld2hlcmUgZWxzZT8pCisgKi8KKworI2RlZmluZSBTTkRDQVJEX0FETElCCQkxCisjZGVmaW5lIFNORENBUkRfU0IJCTIKKyNkZWZpbmUgU05EQ0FSRF9QQVMJCTMKKyNkZWZpbmUgU05EQ0FSRF9HVVMJCTQKKyNkZWZpbmUgU05EQ0FSRF9NUFU0MDEJCTUKKyNkZWZpbmUgU05EQ0FSRF9TQjE2CQk2CisjZGVmaW5lIFNORENBUkRfU0IxNk1JREkJNworI2RlZmluZSBTTkRDQVJEX1VBUlQ2ODUwCTgKKyNkZWZpbmUgU05EQ0FSRF9HVVMxNgkJOQorI2RlZmluZSBTTkRDQVJEX01TUwkJMTAKKyNkZWZpbmUgU05EQ0FSRF9QU1MgICAgIAkxMQorI2RlZmluZSBTTkRDQVJEX1NTQ0FQRQkJMTIKKyNkZWZpbmUgU05EQ0FSRF9QU1NfTVBVICAgICAJMTMKKyNkZWZpbmUgU05EQ0FSRF9QU1NfTVNTICAgICAJMTQKKyNkZWZpbmUgU05EQ0FSRF9TU0NBUEVfTVNTCTE1CisjZGVmaW5lIFNORENBUkRfVFJYUFJPCQkxNgorI2RlZmluZSBTTkRDQVJEX1RSWFBST19TQgkxNworI2RlZmluZSBTTkRDQVJEX1RSWFBST19NUFUJMTgKKyNkZWZpbmUgU05EQ0FSRF9NQUQxNgkJMTkKKyNkZWZpbmUgU05EQ0FSRF9NQUQxNl9NUFUJMjAKKyNkZWZpbmUgU05EQ0FSRF9DUzQyMzIJCTIxCisjZGVmaW5lIFNORENBUkRfQ1M0MjMyX01QVQkyMgorI2RlZmluZSBTTkRDQVJEX01BVUkJCTIzCisjZGVmaW5lIFNORENBUkRfUFNFVURPX01TUwkyNAorI2RlZmluZSBTTkRDQVJEX0dVU1BOUAkJMjUKKyNkZWZpbmUgU05EQ0FSRF9VQVJUNDAxCQkyNgorLyogU291bmQgY2FyZCBudW1iZXJzIDI3IHRvIE4gYXJlIHJlc2VydmVkLiBEb24ndCBhZGQgbW9yZSBudW1iZXJzIGhlcmUuICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU9DVEwgQ29tbWFuZHMgZm9yIC9kZXYvc2VxdWVuY2VyCisgKi8KKworI2lmbmRlZiBfU0lPV1IKKyNpZiBkZWZpbmVkKF9JT1dSKSAmJiAoZGVmaW5lZChfQUlYKSB8fCAoIWRlZmluZWQoc3VuKSAmJiAhZGVmaW5lZChzcGFyYykgJiYgIWRlZmluZWQoX19zcGFyY19fKSAmJiAhZGVmaW5lZChfX0lOQ2lvY3RsaCkgJiYgIWRlZmluZWQoX19MeW54X18pKSkKKy8qIFVzZSBhbHJlYWR5IGRlZmluZWQgaW9jdGwgZGVmaW5lcyBpZiB0aGV5IGV4aXN0IChleGNlcHQgd2l0aCBTdW4gb3IgU3BhcmMpICovCisjZGVmaW5lCVNJT0NQQVJNX01BU0sJSU9DUEFSTV9NQVNLCisjZGVmaW5lCVNJT0NfVk9JRAlJT0NfVk9JRAorI2RlZmluZQlTSU9DX09VVAlJT0NfT1VUCisjZGVmaW5lCVNJT0NfSU4JCUlPQ19JTgorI2RlZmluZQlTSU9DX0lOT1VUCUlPQ19JTk9VVAorI2RlZmluZSBfU0lPQ19TSVpFCV9JT0NfU0laRQorI2RlZmluZSBfU0lPQ19ESVIJX0lPQ19ESVIKKyNkZWZpbmUgX1NJT0NfTk9ORQlfSU9DX05PTkUKKyNkZWZpbmUgX1NJT0NfUkVBRAlfSU9DX1JFQUQKKyNkZWZpbmUgX1NJT0NfV1JJVEUJX0lPQ19XUklURQorI2RlZmluZQlfU0lPCQlfSU8KKyNkZWZpbmUJX1NJT1IJCV9JT1IKKyNkZWZpbmUJX1NJT1cJCV9JT1cKKyNkZWZpbmUJX1NJT1dSCQlfSU9XUgorI2Vsc2UKKworLyogSW9jdGwncyBoYXZlIHRoZSBjb21tYW5kIGVuY29kZWQgaW4gdGhlIGxvd2VyIHdvcmQsCisgKiBhbmQgdGhlIHNpemUgb2YgYW55IGluIG9yIG91dCBwYXJhbWV0ZXJzIGluIHRoZSB1cHBlcgorICogd29yZC4gIFRoZSBoaWdoIDIgYml0cyBvZiB0aGUgdXBwZXIgd29yZCBhcmUgdXNlZAorICogdG8gZW5jb2RlIHRoZSBpbi9vdXQgc3RhdHVzIG9mIHRoZSBwYXJhbWV0ZXI7IGZvciBub3cKKyAqIHdlIHJlc3RyaWN0IHBhcmFtZXRlcnMgdG8gYXQgbW9zdCA4MTkxIGJ5dGVzLgorICovCisvKiAjZGVmaW5lCVNJT0NUWVBFCQkoMHhmZjw8OCkgKi8KKyNkZWZpbmUJU0lPQ1BBUk1fTUFTSwkweDFmZmYJCS8qIHBhcmFtZXRlcnMgbXVzdCBiZSA8IDgxOTIgYnl0ZXMgKi8KKyNkZWZpbmUJU0lPQ19WT0lECTB4MDAwMDAwMDAJLyogbm8gcGFyYW1ldGVycyAqLworI2RlZmluZQlTSU9DX09VVAkweDIwMDAwMDAwCS8qIGNvcHkgb3V0IHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUJU0lPQ19JTgkJMHg0MDAwMDAwMAkvKiBjb3B5IGluIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUJU0lPQ19JTk9VVAkoU0lPQ19JTnxTSU9DX09VVCkKKy8qIHRoZSAweDIwMDAwMDAwIGlzIHNvIHdlIGNhbiBkaXN0aW5ndWlzaCBuZXcgaW9jdGwncyBmcm9tIG9sZCAqLworI2RlZmluZQlfU0lPKHgseSkJKChpbnQpKFNJT0NfVk9JRHwoeDw8OCl8eSkpCisjZGVmaW5lCV9TSU9SKHgseSx0KQkoKGludCkoU0lPQ19PVVR8KChzaXplb2YodCkmU0lPQ1BBUk1fTUFTSyk8PDE2KXwoeDw8OCl8eSkpCisjZGVmaW5lCV9TSU9XKHgseSx0KQkoKGludCkoU0lPQ19JTnwoKHNpemVvZih0KSZTSU9DUEFSTV9NQVNLKTw8MTYpfCh4PDw4KXx5KSkKKy8qIHRoaXMgc2hvdWxkIGJlIF9TSU9SVywgYnV0IHN0ZGlvIGdvdCB0aGVyZSBmaXJzdCAqLworI2RlZmluZQlfU0lPV1IoeCx5LHQpCSgoaW50KShTSU9DX0lOT1VUfCgoc2l6ZW9mKHQpJlNJT0NQQVJNX01BU0spPDwxNil8KHg8PDgpfHkpKQorI2RlZmluZSBfU0lPQ19TSVpFKHgpCSgoeD4+MTYpJlNJT0NQQVJNX01BU0spCQorI2RlZmluZSBfU0lPQ19ESVIoeCkJKHggJiAweGYwMDAwMDAwKQorI2RlZmluZSBfU0lPQ19OT05FCVNJT0NfVk9JRAorI2RlZmluZSBfU0lPQ19SRUFECVNJT0NfT1VUCisjZGVmaW5lIF9TSU9DX1dSSVRFCVNJT0NfSU4KKyMgIGVuZGlmIC8qIF9JT1dSICovCisjZW5kaWYgIC8qICFfU0lPV1IgKi8KKworI2RlZmluZSBTTkRDVExfU0VRX1JFU0VUCQlfU0lPICAoJ1EnLCAwKQorI2RlZmluZSBTTkRDVExfU0VRX1NZTkMJCQlfU0lPICAoJ1EnLCAxKQorI2RlZmluZSBTTkRDVExfU1lOVEhfSU5GTwkJX1NJT1dSKCdRJywgMiwgc3RydWN0IHN5bnRoX2luZm8pCisjZGVmaW5lIFNORENUTF9TRVFfQ1RSTFJBVEUJCV9TSU9XUignUScsIDMsIGludCkJLyogU2V0L2dldCB0aW1lciByZXNvbHV0aW9uIChIWikgKi8KKyNkZWZpbmUgU05EQ1RMX1NFUV9HRVRPVVRDT1VOVAkJX1NJT1IgKCdRJywgNCwgaW50KQorI2RlZmluZSBTTkRDVExfU0VRX0dFVElOQ09VTlQJCV9TSU9SICgnUScsIDUsIGludCkKKyNkZWZpbmUgU05EQ1RMX1NFUV9QRVJDTU9ERQkJX1NJT1cgKCdRJywgNiwgaW50KQorI2RlZmluZSBTTkRDVExfRk1fTE9BRF9JTlNUUgkJX1NJT1cgKCdRJywgNywgc3RydWN0IHNiaV9pbnN0cnVtZW50KQkvKiBPYnNvbGV0ZS4gRG9uJ3QgdXNlISEhISEhICovCisjZGVmaW5lIFNORENUTF9TRVFfVEVTVE1JREkJCV9TSU9XICgnUScsIDgsIGludCkKKyNkZWZpbmUgU05EQ1RMX1NFUV9SRVNFVFNBTVBMRVMJCV9TSU9XICgnUScsIDksIGludCkKKyNkZWZpbmUgU05EQ1RMX1NFUV9OUlNZTlRIUwkJX1NJT1IgKCdRJywxMCwgaW50KQorI2RlZmluZSBTTkRDVExfU0VRX05STUlESVMJCV9TSU9SICgnUScsMTEsIGludCkKKyNkZWZpbmUgU05EQ1RMX01JRElfSU5GTwkJX1NJT1dSKCdRJywxMiwgc3RydWN0IG1pZGlfaW5mbykKKyNkZWZpbmUgU05EQ1RMX1NFUV9USFJFU0hPTEQJCV9TSU9XICgnUScsMTMsIGludCkKKyNkZWZpbmUgU05EQ1RMX1NZTlRIX01FTUFWTAkJX1NJT1dSKCdRJywxNCwgaW50KQkvKiBpbj1kZXYjLCBvdXQ9bWVtc2l6ZSAqLworI2RlZmluZSBTTkRDVExfRk1fNE9QX0VOQUJMRQkJX1NJT1cgKCdRJywxNSwgaW50KQkvKiBpbj1kZXYjICovCisjZGVmaW5lIFNORENUTF9TRVFfUEFOSUMJCV9TSU8gICgnUScsMTcpCisjZGVmaW5lIFNORENUTF9TRVFfT1VUT0ZCQU5ECQlfU0lPVyAoJ1EnLDE4LCBzdHJ1Y3Qgc2VxX2V2ZW50X3JlYykKKyNkZWZpbmUgU05EQ1RMX1NFUV9HRVRUSU1FCQlfU0lPUiAoJ1EnLDE5LCBpbnQpCisjZGVmaW5lIFNORENUTF9TWU5USF9JRAkJCV9TSU9XUignUScsMjAsIHN0cnVjdCBzeW50aF9pbmZvKQorI2RlZmluZSBTTkRDVExfU1lOVEhfQ09OVFJPTAkJX1NJT1dSKCdRJywyMSwgc3RydWN0IHN5bnRoX2NvbnRyb2wpCisjZGVmaW5lIFNORENUTF9TWU5USF9SRU1PVkVTQU1QTEUJX1NJT1dSKCdRJywyMiwgc3RydWN0IHJlbW92ZV9zYW1wbGUpCisKK3R5cGVkZWYgc3RydWN0IHN5bnRoX2NvbnRyb2wKK3sKKwlpbnQgZGV2bm87CS8qIFN5bnRoZXNpemVyICMgKi8KKwljaGFyIGRhdGFbNDAwMF07IC8qIERldmljZSBzcGVzaWZpYyBjb21tYW5kL2RhdGEgcmVjb3JkICovCit9c3ludGhfY29udHJvbDsKKwordHlwZWRlZiBzdHJ1Y3QgcmVtb3ZlX3NhbXBsZQoreworCWludCBkZXZubzsJLyogU3ludGhlc2l6ZXIgIyAqLworCWludCBiYW5rbm87CS8qIE1JREkgYmFuayAjICgwPUdlbmVyYWwgTUlESSkgKi8KKwlpbnQgaW5zdHJubzsJLyogTUlESSBpbnN0cnVtZW50IG51bWJlciAqLworfSByZW1vdmVfc2FtcGxlOworCit0eXBlZGVmIHN0cnVjdCBzZXFfZXZlbnRfcmVjIHsKKwkJdW5zaWduZWQgY2hhciBhcnJbOF07Cit9IHNlcV9ldmVudF9yZWM7CisKKyNkZWZpbmUgU05EQ1RMX1RNUl9USU1FQkFTRQkJX1NJT1dSKCdUJywgMSwgaW50KQorI2RlZmluZSBTTkRDVExfVE1SX1NUQVJUCQlfU0lPICAoJ1QnLCAyKQorI2RlZmluZSBTTkRDVExfVE1SX1NUT1AJCQlfU0lPICAoJ1QnLCAzKQorI2RlZmluZSBTTkRDVExfVE1SX0NPTlRJTlVFCQlfU0lPICAoJ1QnLCA0KQorI2RlZmluZSBTTkRDVExfVE1SX1RFTVBPCQlfU0lPV1IoJ1QnLCA1LCBpbnQpCisjZGVmaW5lIFNORENUTF9UTVJfU09VUkNFCQlfU0lPV1IoJ1QnLCA2LCBpbnQpCisjCWRlZmluZSBUTVJfSU5URVJOQUwJCTB4MDAwMDAwMDEKKyMJZGVmaW5lIFRNUl9FWFRFUk5BTAkJMHgwMDAwMDAwMgorIwkJZGVmaW5lIFRNUl9NT0RFX01JREkJMHgwMDAwMDAxMAorIwkJZGVmaW5lIFRNUl9NT0RFX0ZTSwkweDAwMDAwMDIwCisjCQlkZWZpbmUgVE1SX01PREVfQ0xTCTB4MDAwMDAwNDAKKyMJCWRlZmluZSBUTVJfTU9ERV9TTVBURQkweDAwMDAwMDgwCisjZGVmaW5lIFNORENUTF9UTVJfTUVUUk9OT01FCQlfU0lPVyAoJ1QnLCA3LCBpbnQpCisjZGVmaW5lIFNORENUTF9UTVJfU0VMRUNUCQlfU0lPVyAoJ1QnLCA4LCBpbnQpCisKKy8qCisgKiBTb21lIGJpZyBlbmRpYW4vbGl0dGxlIGVuZGlhbiBoYW5kbGluZyBtYWNyb3MKKyAqLworCisjZGVmaW5lIF9MSU5VWF9QQVRDSEtFWV9IX0lORElSRUNUCisjaW5jbHVkZSA8bGludXgvcGF0Y2hrZXkuaD4KKyN1bmRlZiBfTElOVVhfUEFUQ0hLRVlfSF9JTkRJUkVDVAorCisjaWYgICBkZWZpbmVkKF9fQllURV9PUkRFUikKKyMgIGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyMgICAgZGVmaW5lIEFGTVRfUzE2X05FIEFGTVRfUzE2X0JFCisjICBlbGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgICAgZGVmaW5lIEFGTVRfUzE2X05FIEFGTVRfUzE2X0xFCisjICBlbHNlCisjICAgIGVycm9yICJjb3VsZCBub3QgZGV0ZXJtaW5lIGJ5dGUgb3JkZXIiCisjICBlbmRpZgorI2VuZGlmCisKKy8qCisgKglTYW1wbGUgbG9hZGluZyBtZWNoYW5pc20gZm9yIGludGVybmFsIHN5bnRoZXNpemVycyAoL2Rldi9zZXF1ZW5jZXIpCisgKglUaGUgZm9sbG93aW5nIHBhdGNoX2luZm8gc3RydWN0dXJlIGhhcyBiZWVuIGRlc2lnbmVkIHRvIHN1cHBvcnQKKyAqCUdyYXZpcyBVbHRyYVNvdW5kLiBJdCB0cmllcyB0byBiZSB1bml2ZXJzYWwgZm9ybWF0IGZvciB1cGxvYWRpbmcKKyAqCXNhbXBsZSBiYXNlZCBwYXRjaGVzIGJ1dCBpcyBwcm9iYWJseSB0b28gbGltaXRlZC4KKyAqCisgKiAgICAgIChQQkQpIEFzIEhhbm51IGd1ZXNzZWQsIHRoZSBHVVMgc3RydWN0dXJlIGlzIHRvbyBsaW1pdGVkIGZvciAKKyAqICAgICAgdGhlIFdhdmVGcm9udCwgYnV0IHRoaXMgaXMgdGhlIHJpZ2h0IHBsYWNlIGZvciBhIGNvbnN0YW50IGRlZmluaXRpb24uCisgKi8KKworc3RydWN0IHBhdGNoX2luZm8geworCQl1bnNpZ25lZCBzaG9ydCBrZXk7CQkvKiBVc2UgV0FWRV9QQVRDSCBoZXJlICovCisjZGVmaW5lIFdBVkVfUEFUQ0gJICAgX1BBVENIS0VZKDB4MDQpCisjZGVmaW5lIEdVU19QQVRDSAkgICBXQVZFX1BBVENICisjZGVmaW5lIFdBVkVGUk9OVF9QQVRDSCAgICBfUEFUQ0hLRVkoMHgwNikKKworCQlzaG9ydCBkZXZpY2Vfbm87CS8qIFN5bnRoZXNpemVyIG51bWJlciAqLworCQlzaG9ydCBpbnN0cl9ubzsJCS8qIE1pZGkgcGdtIyAqLworCisJCXVuc2lnbmVkIGludCBtb2RlOworLyoKKyAqIFRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIGhhcyB0aGUgc2FtZSBmb3JtYXQgdGhhbiB0aGUgR1VTIC5QQVQKKyAqIGZpbGVzCisgKi8KKyNkZWZpbmUgV0FWRV8xNl9CSVRTCTB4MDEJLyogYml0IDAgPSA4IG9yIDE2IGJpdCB3YXZlIGRhdGEuICovCisjZGVmaW5lIFdBVkVfVU5TSUdORUQJMHgwMgkvKiBiaXQgMSA9IFNpZ25lZCAtIFVuc2lnbmVkIGRhdGEuICovCisjZGVmaW5lIFdBVkVfTE9PUElORwkweDA0CS8qIGJpdCAyID0gbG9vcGluZyBlbmFibGVkLTEuICovCisjZGVmaW5lIFdBVkVfQklESVJfTE9PUAkweDA4CS8qIGJpdCAzID0gU2V0IGlzIGJpZGlyZWN0aW9uYWwgbG9vcGluZy4gKi8KKyNkZWZpbmUgV0FWRV9MT09QX0JBQ0sJMHgxMAkvKiBiaXQgNCA9IFNldCBpcyBsb29waW5nIGJhY2t3YXJkLiAqLworI2RlZmluZSBXQVZFX1NVU1RBSU5fT04JMHgyMAkvKiBiaXQgNSA9IFR1cm4gc3VzdGFpbmluZyBvbi4gKEVudi4gcHRzLiAzKSovCisjZGVmaW5lIFdBVkVfRU5WRUxPUEVTCTB4NDAJLyogYml0IDYgPSBFbmFibGUgZW52ZWxvcGVzIC0gMSAqLworI2RlZmluZSBXQVZFX0ZBU1RfUkVMRUFTRSAweDgwCS8qIGJpdCA3ID0gU2h1dCBvZmYgaW1tZWRpYXRlbHkgYWZ0ZXIgbm90ZSBvZmYgKi8KKwkJCQkvKiAJKHVzZSB0aGUgZW52X3JhdGUvZW52X29mZnMgZmllbGRzKS4gKi8KKy8qIExpbnV4IHNwZWNpZmljIGJpdHMgKi8KKyNkZWZpbmUgV0FWRV9WSUJSQVRPCTB4MDAwMTAwMDAJLyogVGhlIHZpYnJhdG8gaW5mbyBpcyB2YWxpZCAqLworI2RlZmluZSBXQVZFX1RSRU1PTE8JMHgwMDAyMDAwMAkvKiBUaGUgdHJlbW9sbyBpbmZvIGlzIHZhbGlkICovCisjZGVmaW5lIFdBVkVfU0NBTEUJMHgwMDA0MDAwMAkvKiBUaGUgc2NhbGluZyBpbmZvIGlzIHZhbGlkICovCisjZGVmaW5lIFdBVkVfRlJBQ1RJT05TCTB4MDAwODAwMDAJLyogRnJhY3Rpb24gaW5mb3JtYXRpb24gaXMgdmFsaWQgKi8KKy8qIFJlc2VydmVkIGJpdHMgKi8KKyNkZWZpbmUgV0FWRV9ST00JMHg0MDAwMDAwMAkvKiBGb3IgZnV0dXJlIHVzZSAqLworI2RlZmluZSBXQVZFX01VTEFXCTB4MjAwMDAwMDAJLyogRm9yIGZ1dHVyZSB1c2UgKi8KKy8qIE90aGVyIGJpdHMgbXVzdCBiZSB6ZXJvZWQgKi8KKworCQlpbnQgbGVuOwkvKiBTaXplIG9mIHRoZSB3YXZlIGRhdGEgaW4gYnl0ZXMgKi8KKwkJaW50IGxvb3Bfc3RhcnQsIGxvb3BfZW5kOyAvKiBCeXRlIG9mZnNldHMgZnJvbSB0aGUgYmVnaW5uaW5nICovCisKKy8qIAorICogVGhlIGJhc2VfZnJlcSBhbmQgYmFzZV9ub3RlIGZpZWxkcyBhcmUgdXNlZCB3aGVuIGNvbXB1dGluZyB0aGUKKyAqIHBsYXliYWNrIHNwZWVkIGZvciBhIG5vdGUuIFRoZSBiYXNlX25vdGUgZGVmaW5lcyB0aGUgdG9uZSBmcmVxdWVuY3kKKyAqIHdoaWNoIGlzIGhlYXJkIGlmIHRoZSBzYW1wbGUgaXMgcGxheWVkIHVzaW5nIHRoZSBiYXNlX2ZyZXEgYXMgdGhlCisgKiBwbGF5YmFjayBzcGVlZC4KKyAqCisgKiBUaGUgbG93X25vdGUgYW5kIGhpZ2hfbm90ZSBmaWVsZHMgZGVmaW5lIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG5vdGUKKyAqIGZyZXF1ZW5jaWVzIGZvciB3aGljaCB0aGlzIHNhbXBsZSBpcyB2YWxpZC4gSXQgaXMgcG9zc2libGUgdG8gZGVmaW5lCisgKiBtb3JlIHRoYW4gb25lIHNhbXBsZXMgZm9yIGFuIGluc3RydW1lbnQgbnVtYmVyIGF0IHRoZSBzYW1lIHRpbWUuIFRoZQorICogbG93X25vdGUgYW5kIGhpZ2hfbm90ZSBmaWVsZHMgYXJlIHVzZWQgdG8gc2VsZWN0IHRoZSBtb3N0IHN1aXRhYmxlIG9uZS4KKyAqCisgKiBUaGUgZmllbGRzIGJhc2Vfbm90ZSwgaGlnaF9ub3RlIGFuZCBsb3dfbm90ZSBzaG91bGQgY29udGFpbgorICogdGhlIG5vdGUgZnJlcXVlbmN5IG11bHRpcGxpZWQgYnkgMTAwMC4gRm9yIGV4YW1wbGUgdmFsdWUgZm9yIHRoZQorICogbWlkZGxlIEEgaXMgNDQwKjEwMDAuCisgKi8KKworCQl1bnNpZ25lZCBpbnQgYmFzZV9mcmVxOworCQl1bnNpZ25lZCBpbnQgYmFzZV9ub3RlOworCQl1bnNpZ25lZCBpbnQgaGlnaF9ub3RlOworCQl1bnNpZ25lZCBpbnQgbG93X25vdGU7CisJCWludCBwYW5uaW5nOwkvKiAtMTI4PWxlZnQsIDEyNz1yaWdodCAqLworCQlpbnQgZGV0dW5pbmc7CisKKy8qCU5ldyBmaWVsZHMgaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDEuOTkuNQkqLworCisgICAgICAgLyogRW52ZWxvcGUuIEVuYWJsZWQgYnkgbW9kZSBiaXQgV0FWRV9FTlZFTE9QRVMJKi8KKwkJdW5zaWduZWQgY2hhcgllbnZfcmF0ZVsgNiBdOwkgLyogR1VTIEhXIHJhbXBpbmcgcmF0ZSAqLworCQl1bnNpZ25lZCBjaGFyCWVudl9vZmZzZXRbIDYgXTsgLyogMjU1ID09IDEwMCUgKi8KKworCS8qIAorCSAqIFRoZSB0cmVtb2xvLCB2aWJyYXRvIGFuZCBzY2FsZSBpbmZvIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4KKwkgKiBFbmFibGUgYnkgc2V0dGluZyB0aGUgbW9kZSBiaXRzIFdBVkVfVFJFTU9MTywgV0FWRV9WSUJSQVRPIG9yCisJICogV0FWRV9TQ0FMRQorCSAqLworCisJCXVuc2lnbmVkIGNoYXIJdHJlbW9sb19zd2VlcDsKKwkJdW5zaWduZWQgY2hhcgl0cmVtb2xvX3JhdGU7CisJCXVuc2lnbmVkIGNoYXIJdHJlbW9sb19kZXB0aDsKKwkKKwkJdW5zaWduZWQgY2hhcgl2aWJyYXRvX3N3ZWVwOworCQl1bnNpZ25lZCBjaGFyCXZpYnJhdG9fcmF0ZTsKKwkJdW5zaWduZWQgY2hhcgl2aWJyYXRvX2RlcHRoOworCisJCWludAkJc2NhbGVfZnJlcXVlbmN5OworCQl1bnNpZ25lZCBpbnQJc2NhbGVfZmFjdG9yOwkJLyogZnJvbSAwIHRvIDIwNDggb3IgMCB0byAyICovCisJCisJICAgICAgICBpbnQJCXZvbHVtZTsKKwkJaW50CQlmcmFjdGlvbnM7CisJCWludAkJcmVzZXJ2ZWQxOworCSAgICAgICAgaW50CQlzcGFyZVsyXTsKKwkJY2hhciBkYXRhWzFdOwkvKiBUaGUgd2F2ZWZvcm0gZGF0YSBzdGFydHMgaGVyZSAqLworCX07CisKK3N0cnVjdCBzeXNleF9pbmZvIHsKKwkJc2hvcnQga2V5OwkJLyogVXNlIFNZU0VYX1BBVENIIG9yIE1BVUlfUEFUQ0ggaGVyZSAqLworI2RlZmluZSBTWVNFWF9QQVRDSAlfUEFUQ0hLRVkoMHgwNSkKKyNkZWZpbmUgTUFVSV9QQVRDSAlfUEFUQ0hLRVkoMHgwNikKKwkJc2hvcnQgZGV2aWNlX25vOwkvKiBTeW50aGVzaXplciBudW1iZXIgKi8KKwkJaW50IGxlbjsJLyogU2l6ZSBvZiB0aGUgc3lzZXggZGF0YSBpbiBieXRlcyAqLworCQl1bnNpZ25lZCBjaGFyIGRhdGFbMV07CS8qIFN5c2V4IGRhdGEgc3RhcnRzIGhlcmUgKi8KKwl9OworCisvKgorICogL2Rldi9zZXF1ZW5jZXIgaW5wdXQgZXZlbnRzLgorICoKKyAqIFRoZSBkYXRhIHdyaXR0ZW4gdG8gdGhlIC9kZXYvc2VxdWVuY2VyIGlzIGEgc3RyZWFtIG9mIGV2ZW50cy4gRXZlbnRzCisgKiBhcmUgcmVjb3JkcyBvZiA0IG9yIDggYnl0ZXMuIFRoZSBmaXJzdCBieXRlIGRlZmluZXMgdGhlIHNpemUuIAorICogQW55IG51bWJlciBvZiBldmVudHMgY2FuIGJlIHdyaXR0ZW4gd2l0aCBhIHdyaXRlIGNhbGwuIFRoZXJlCisgKiBpcyBhIHNldCBvZiBtYWNyb3MgZm9yIHNlbmRpbmcgdGhlc2UgZXZlbnRzLiBVc2UgdGhlc2UgbWFjcm9zIGlmIHlvdQorICogd2FudCB0byBtYXhpbWl6ZSBwb3J0YWJpbGl0eSBvZiB5b3VyIHByb2dyYW0uCisgKgorICogRXZlbnRzIFNFUV9XQUlULCBTRVFfTUlESVBVVEMgYW5kIFNFUV9FQ0hPLiBBcmUgYWxzbyBpbnB1dCBldmVudHMuCisgKiAoQWxsIGlucHV0IGV2ZW50cyBhcmUgY3VycmVudGx5IDQgYnl0ZXMgbG9uZy4gQmUgcHJlcGFyZWQgdG8gc3VwcG9ydAorICogOCBieXRlIGV2ZW50cyBhbHNvLiBJZiB5b3UgcmVjZWl2ZSBhbnkgZXZlbnQgaGF2aW5nIGZpcnN0IGJ5dGUgPj0gMTI4LAorICogaXQncyBhIDggYnl0ZSBldmVudC4KKyAqCisgKiBUaGUgZXZlbnRzIGFyZSBkb2N1bWVudGVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorICoKKyAqIE5vcm1hbCBldmVudHMgKDQgYnl0ZXMpCisgKiBUaGVyZSBpcyBhbHNvIGEgOCBieXRlIHZlcnNpb24gb2YgbW9zdCBvZiB0aGUgNCBieXRlIGV2ZW50cy4gVGhlCisgKiA4IGJ5dGUgb25lIGlzIHJlY29tbWVuZGVkLgorICovCisjZGVmaW5lIFNFUV9OT1RFT0ZGCQkwCisjZGVmaW5lIFNFUV9GTU5PVEVPRkYJCVNFUV9OT1RFT0ZGCS8qIEp1c3Qgb2xkIG5hbWUgKi8KKyNkZWZpbmUgU0VRX05PVEVPTgkJMQorI2RlZmluZQlTRVFfRk1OT1RFT04JCVNFUV9OT1RFT04KKyNkZWZpbmUgU0VRX1dBSVQJCVRNUl9XQUlUX0FCUworI2RlZmluZSBTRVFfUEdNQ0hBTkdFCQkzCisjZGVmaW5lIFNFUV9GTVBHTUNIQU5HRQkJU0VRX1BHTUNIQU5HRQorI2RlZmluZSBTRVFfU1lOQ1RJTUVSCQlUTVJfU1RBUlQKKyNkZWZpbmUgU0VRX01JRElQVVRDCQk1CisjZGVmaW5lIFNFUV9EUlVNT04JCTYJLyoqKiBPQlNPTEVURSAqKiovCisjZGVmaW5lIFNFUV9EUlVNT0ZGCQk3CS8qKiogT0JTT0xFVEUgKioqLworI2RlZmluZSBTRVFfRUNITwkJVE1SX0VDSE8JLyogRm9yIHN5bmNoaW5nIHByb2dyYW1zIHdpdGggb3V0cHV0ICovCisjZGVmaW5lIFNFUV9BRlRFUlRPVUNICQk5CisjZGVmaW5lIFNFUV9DT05UUk9MTEVSCQkxMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTWlkaSBjb250cm9sbGVyIG51bWJlcnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb250cm9sbGVycyAwIHRvIDMxICgweDAwIHRvIDB4MWYpIGFuZAorICogMzIgdG8gNjMgKDB4MjAgdG8gMHgzZikgYXJlIGNvbnRpbnVvdXMKKyAqIGNvbnRyb2xsZXJzLgorICogSW4gdGhlIE1JREkgMS4wIHRoZXNlIGNvbnRyb2xsZXJzIGFyZSBzZW50IHVzaW5nCisgKiB0d28gbWVzc2FnZXMuIENvbnRyb2xsZXIgbnVtYmVycyAwIHRvIDMxIGFyZSB1c2VkCisgKiB0byBzZW5kIHRoZSBNU0IgYW5kIHRoZSBjb250cm9sbGVyIG51bWJlcnMgMzIgdG8gNjMKKyAqIGFyZSBmb3IgdGhlIExTQi4gTm90ZSB0aGF0IGp1c3QgNyBiaXRzIGFyZSB1c2VkIGluIE1JREkgYnl0ZXMuCisgKi8KKworI2RlZmluZQkgICBDVExfQkFOS19TRUxFQ1QJCTB4MDAKKyNkZWZpbmUJICAgQ1RMX01PRFdIRUVMCQkJMHgwMQorI2RlZmluZSAgICBDVExfQlJFQVRICQkJMHgwMgorLyoJCXVuZGVmaW5lZAkJMHgwMyAqLworI2RlZmluZSAgICBDVExfRk9PVAkJCTB4MDQKKyNkZWZpbmUgICAgQ1RMX1BPUlRBTUVOVE9fVElNRQkJMHgwNQorI2RlZmluZSAgICBDVExfREFUQV9FTlRSWQkJMHgwNgorI2RlZmluZSAgICBDVExfTUFJTl9WT0xVTUUJCTB4MDcKKyNkZWZpbmUgICAgQ1RMX0JBTEFOQ0UJCQkweDA4CisvKgkJdW5kZWZpbmVkCQkweDA5ICovCisjZGVmaW5lICAgIENUTF9QQU4JCQkweDBhCisjZGVmaW5lICAgIENUTF9FWFBSRVNTSU9OCQkweDBiCisvKgkJdW5kZWZpbmVkCQkweDBjICovCisvKgkJdW5kZWZpbmVkCQkweDBkICovCisvKgkJdW5kZWZpbmVkCQkweDBlICovCisvKgkJdW5kZWZpbmVkCQkweDBmICovCisjZGVmaW5lICAgIENUTF9HRU5FUkFMX1BVUlBPU0UxCTB4MTAKKyNkZWZpbmUgICAgQ1RMX0dFTkVSQUxfUFVSUE9TRTIJMHgxMQorI2RlZmluZSAgICBDVExfR0VORVJBTF9QVVJQT1NFMwkweDEyCisjZGVmaW5lICAgIENUTF9HRU5FUkFMX1BVUlBPU0U0CTB4MTMKKy8qCQl1bmRlZmluZWQJCTB4MTQgLSAweDFmICovCisKKy8qCQl1bmRlZmluZWQJCTB4MjAgKi8KKy8qIFRoZSBjb250cm9sbGVyIG51bWJlcnMgMHgyMSB0byAweDNmIGFyZSByZXNlcnZlZCBmb3IgdGhlICovCisvKiBsZWFzdCBzaWduaWZpY2FudCBieXRlcyBvZiB0aGUgY29udHJvbGxlcnMgMHgwMCB0byAweDFmLiAqLworLyogVGhlc2UgY29udHJvbGxlcnMgYXJlIG5vdCByZWNvZ25pc2VkIGJ5IHRoZSBkcml2ZXIuICovCisKKy8qIENvbnRyb2xsZXJzIDY0IHRvIDY5ICgweDQwIHRvIDB4NDUpIGFyZSBvbi9vZmYgc3dpdGNoZXMuICovCisvKiAwPU9GRiBhbmQgMTI3PU9OIChpbnRlcm1lZGlhdGUgdmFsdWVzIGFyZSBwb3NzaWJsZSkgKi8KKyNkZWZpbmUgICAgQ1RMX0RBTVBFUl9QRURBTAkJMHg0MAorI2RlZmluZSAgICBDVExfU1VTVEFJTgkJCTB4NDAJLyogQWxpYXMgKi8KKyNkZWZpbmUgICAgQ1RMX0hPTEQJCQkweDQwCS8qIEFsaWFzICovCisjZGVmaW5lICAgIENUTF9QT1JUQU1FTlRPCQkweDQxCisjZGVmaW5lICAgIENUTF9TT1NURU5VVE8JCTB4NDIKKyNkZWZpbmUgICAgQ1RMX1NPRlRfUEVEQUwJCTB4NDMKKy8qCQl1bmRlZmluZWQJCTB4NDQgKi8KKyNkZWZpbmUgICAgQ1RMX0hPTEQyCQkJMHg0NQorLyoJCXVuZGVmaW5lZAkJMHg0NiAtIDB4NGYgKi8KKworI2RlZmluZSAgICBDVExfR0VORVJBTF9QVVJQT1NFNQkweDUwCisjZGVmaW5lICAgIENUTF9HRU5FUkFMX1BVUlBPU0U2CTB4NTEKKyNkZWZpbmUgICAgQ1RMX0dFTkVSQUxfUFVSUE9TRTcJMHg1MgorI2RlZmluZSAgICBDVExfR0VORVJBTF9QVVJQT1NFOAkweDUzCisvKgkJdW5kZWZpbmVkCQkweDU0IC0gMHg1YSAqLworI2RlZmluZSAgICBDVExfRVhUX0VGRl9ERVBUSAkJMHg1YgorI2RlZmluZSAgICBDVExfVFJFTU9MT19ERVBUSAkJMHg1YworI2RlZmluZSAgICBDVExfQ0hPUlVTX0RFUFRICQkweDVkCisjZGVmaW5lICAgIENUTF9ERVRVTkVfREVQVEgJCTB4NWUKKyNkZWZpbmUgICAgQ1RMX0NFTEVTVEVfREVQVEgJCTB4NWUJLyogQWxpYXMgZm9yIHRoZSBhYm92ZSBvbmUgKi8KKyNkZWZpbmUgICAgQ1RMX1BIQVNFUl9ERVBUSAkJMHg1ZgorI2RlZmluZSAgICBDVExfREFUQV9JTkNSRU1FTlQJCTB4NjAKKyNkZWZpbmUgICAgQ1RMX0RBVEFfREVDUkVNRU5UCQkweDYxCisjZGVmaW5lICAgIENUTF9OT05SRUdfUEFSTV9OVU1fTFNCCTB4NjIKKyNkZWZpbmUgICAgQ1RMX05PTlJFR19QQVJNX05VTV9NU0IJMHg2MworI2RlZmluZSAgICBDVExfUkVHSVNUX1BBUk1fTlVNX0xTQgkweDY0CisjZGVmaW5lICAgIENUTF9SRUdJU1RfUEFSTV9OVU1fTVNCCTB4NjUKKy8qCQl1bmRlZmluZWQJCTB4NjYgLSAweDc4ICovCisvKgkJcmVzZXJ2ZWQJCTB4NzkgLSAweDdmICovCisKKy8qIFBzZXVkbyBjb250cm9sbGVycyAobm90IG1pZGkgY29tcGF0aWJsZSkgKi8KKyNkZWZpbmUgICAgQ1RSTF9QSVRDSF9CRU5ERVIJCTI1NQorI2RlZmluZSAgICBDVFJMX1BJVENIX0JFTkRFUl9SQU5HRQkyNTQKKyNkZWZpbmUgICAgQ1RSTF9FWFBSRVNTSU9OCQkyNTMJLyogT2Jzb2xldGUgKi8KKyNkZWZpbmUgICAgQ1RSTF9NQUlOX1ZPTFVNRQkJMjUyCS8qIE9ic29sZXRlICovCisjZGVmaW5lIFNFUV9CQUxBTkNFCQkxMQorI2RlZmluZSBTRVFfVk9MTU9ERSAgICAgICAgICAgICAxMgorCisvKgorICogVm9sdW1lIG1vZGUgZGVjaWRlcyBob3cgdm9sdW1lcyBhcmUgdXNlZAorICovCisKKyNkZWZpbmUgVk9MX01FVEhPRF9BREFHSU8JMQorI2RlZmluZSBWT0xfTUVUSE9EX0xJTkVBUgkyCisKKy8qCisgKiBOb3RlISBTRVFfV0FJVCwgU0VRX01JRElQVVRDIGFuZCBTRVFfRUNITyBhcmUgdXNlZCBhbHNvIGFzCisgKgkgaW5wdXQgZXZlbnRzLgorICovCisKKy8qCisgKiBFdmVudCBjb2RlcyAweGYwIHRvIDB4ZmMgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucy4KKyAqLworCisjZGVmaW5lIFNFUV9GVUxMU0laRQkJMHhmZAkvKiBMb25nIGV2ZW50cyAqLworLyoKKyAqCVNFUV9GVUxMU0laRSBldmVudHMgYXJlIHVzZWQgZm9yIGxvYWRpbmcgcGF0Y2hlcy9zYW1wbGVzIHRvIHRoZQorICoJc3ludGhlc2l6ZXIgZGV2aWNlcy4gVGhlc2UgZXZlbnRzIGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGRyaXZlcgorICoJb2YgdGhlIGFzc29jaWF0ZWQgc3ludGhlc2l6ZXIgZGV2aWNlLiBUaGVyZSBpcyBubyBsaW1pdCB0byB0aGUgc2l6ZQorICoJb2YgdGhlIGV4dGVuZGVkIGV2ZW50cy4gVGhlc2UgZXZlbnRzIGFyZSBub3QgcXVldWVkIGJ1dCBleGVjdXRlZAorICoJaW1tZWRpYXRlbHkgd2hlbiB0aGUgd3JpdGUoKSBpcyBjYWxsZWQgKGV4ZWN1dGlvbiBjYW4gdGFrZSBzZXZlcmFsCisgKglzZWNvbmRzIG9mIHRpbWUpLiAKKyAqCisgKglXaGVuIGEgU0VRX0ZVTExTSVpFIG1lc3NhZ2UgaXMgd3JpdHRlbiB0byB0aGUgZGV2aWNlLCBpdCBtdXN0CisgKgliZSB3cml0dGVuIHVzaW5nIGV4YWN0bHkgb25lIHdyaXRlKCkgY2FsbC4gT3RoZXIgZXZlbnRzIGNhbm5vdAorICoJYmUgbWl4ZWQgdG8gdGhlIHNhbWUgd3JpdGUuCisgKgkKKyAqCUZvciBGTSBzeW50aHMgKFlNMzgxMi9PUEwzKSB1c2Ugc3RydWN0IHNiaV9pbnN0cnVtZW50IGFuZCB3cml0ZSBpdCB0byB0aGUgCisgKgkvZGV2L3NlcXVlbmNlci4gRG9uJ3Qgd3JpdGUgb3RoZXIgZGF0YSB0b2dldGhlciB3aXRoIHRoZSBpbnN0cnVtZW50IHN0cnVjdHVyZQorICoJU2V0IHRoZSBrZXkgZmllbGQgb2YgdGhlIHN0cnVjdHVyZSB0byBGTV9QQVRDSC4gVGhlIGRldmljZSBmaWVsZCBpcyB1c2VkIHRvCisgKglyb3V0ZSB0aGUgcGF0Y2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGV2aWNlLgorICoKKyAqCUZvciB3YXZlIHRhYmxlIHVzZSBzdHJ1Y3QgcGF0Y2hfaW5mby4gSW5pdGlhbGl6ZSB0aGUga2V5IGZpZWxkCisgKiAgICAgIHRvIFdBVkVfUEFUQ0guCisgKi8KKyNkZWZpbmUgU0VRX1BSSVZBVEUJCTB4ZmUJLyogTG93IGxldmVsIEhXIGRlcGVuZGVudCBldmVudHMgKDggYnl0ZXMpICovCisjZGVmaW5lIFNFUV9FWFRFTkRFRAkJMHhmZgkvKiBFeHRlbmRlZCBldmVudHMgKDggYnl0ZXMpIE9CU09MRVRFICovCisKKy8qCisgKiBSZWNvcmQgZm9yIEZNIHBhdGNoZXMKKyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgc2JpX2luc3RyX2RhdGFbMzJdOworCitzdHJ1Y3Qgc2JpX2luc3RydW1lbnQgeworCQl1bnNpZ25lZCBzaG9ydAlrZXk7CS8qIEZNX1BBVENIIG9yIE9QTDNfUEFUQ0ggKi8KKyNkZWZpbmUgRk1fUEFUQ0gJX1BBVENIS0VZKDB4MDEpCisjZGVmaW5lIE9QTDNfUEFUQ0gJX1BBVENIS0VZKDB4MDMpCisJCXNob3J0CQlkZXZpY2U7CQkvKglTeW50aCMgKDAtNCkJKi8KKwkJaW50IAkJY2hhbm5lbDsJLyoJUHJvZ3JhbSMgdG8gYmUgaW5pdGlhbGl6ZWQgCSovCisJCXNiaV9pbnN0cl9kYXRhCW9wZXJhdG9yczsJLyoJUmVnaXN0ZXIgc2V0dGluZ3MgZm9yIG9wZXJhdG9yIGNlbGxzICguU0JJIGZvcm1hdCkJKi8KKwl9OworCitzdHJ1Y3Qgc3ludGhfaW5mbyB7CS8qIFJlYWQgb25seSAqLworCQljaGFyCW5hbWVbMzBdOworCQlpbnQJZGV2aWNlOwkJLyogMC1OLiBJTklUSUFMSVpFIEJFRk9SRSBDQUxMSU5HICovCisJCWludAlzeW50aF90eXBlOworI2RlZmluZSBTWU5USF9UWVBFX0ZNCQkJMAorI2RlZmluZSBTWU5USF9UWVBFX1NBTVBMRQkJMQorI2RlZmluZSBTWU5USF9UWVBFX01JREkJCQkyCS8qIE1pZGkgaW50ZXJmYWNlICovCisKKwkJaW50CXN5bnRoX3N1YnR5cGU7CisjZGVmaW5lIEZNX1RZUEVfQURMSUIJCQkweDAwCisjZGVmaW5lIEZNX1RZUEVfT1BMMwkJCTB4MDEKKyNkZWZpbmUgTUlESV9UWVBFX01QVTQwMQkJMHg0MDEKKworI2RlZmluZSBTQU1QTEVfVFlQRV9CQVNJQwkJMHgxMAorI2RlZmluZSBTQU1QTEVfVFlQRV9HVVMJCQlTQU1QTEVfVFlQRV9CQVNJQworI2RlZmluZSBTQU1QTEVfVFlQRV9XQVZFRlJPTlQgICAgICAgICAgIDB4MTEKKworCQlpbnQJcGVyY19tb2RlOwkvKiBObyBsb25nZXIgc3VwcG9ydGVkICovCisJCWludAlucl92b2ljZXM7CisJCWludAlucl9kcnVtczsJLyogT2Jzb2xldGUgZmllbGQgKi8KKwkJaW50CWluc3RyX2Jhbmtfc2l6ZTsKKwkJdW5zaWduZWQgaW50CWNhcGFiaWxpdGllczsJCisjZGVmaW5lIFNZTlRIX0NBUF9QRVJDTU9ERQkJMHgwMDAwMDAwMSAvKiBObyBsb25nZXIgdXNlZCAqLworI2RlZmluZSBTWU5USF9DQVBfT1BMMwkJCTB4MDAwMDAwMDIgLyogU2V0IGlmIE9QTDMgc3VwcG9ydGVkICovCisjZGVmaW5lIFNZTlRIX0NBUF9JTlBVVAkJCTB4MDAwMDAwMDQgLyogSW5wdXQgKE1JREkpIGRldmljZSAqLworCQlpbnQJZHVtbWllc1sxOV07CS8qIFJlc2VydmUgc3BhY2UgKi8KKwl9OworCitzdHJ1Y3Qgc291bmRfdGltZXJfaW5mbyB7CisJCWNoYXIgbmFtZVszMl07CisJCWludCBjYXBzOworCX07CisKKyNkZWZpbmUgTUlESV9DQVBfTVBVNDAxCQkxCQkvKiBNUFUtNDAxIGludGVsbGlnZW50IG1vZGUgKi8KKworc3RydWN0IG1pZGlfaW5mbyB7CisJCWNoYXIJCW5hbWVbMzBdOworCQlpbnQJCWRldmljZTsJCS8qIDAtTi4gSU5JVElBTElaRSBCRUZPUkUgQ0FMTElORyAqLworCQl1bnNpZ25lZCBpbnQJY2FwYWJpbGl0aWVzOwkvKiBUbyBiZSBkZWZpbmVkIGxhdGVyICovCisJCWludAkJZGV2X3R5cGU7CisJCWludAkJZHVtbWllc1sxOF07CS8qIFJlc2VydmUgc3BhY2UgKi8KKwl9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGlvY3RsIGNvbW1hbmRzIGZvciB0aGUgL2Rldi9taWRpIyMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZDsKKwkJY2hhciBucl9hcmdzLCBucl9yZXR1cm5zOworCQl1bnNpZ25lZCBjaGFyIGRhdGFbMzBdOworCX0gbXB1X2NvbW1hbmRfcmVjOworCisjZGVmaW5lIFNORENUTF9NSURJX1BSRVRJTUUJCV9TSU9XUignbScsIDAsIGludCkKKyNkZWZpbmUgU05EQ1RMX01JRElfTVBVTU9ERQkJX1NJT1dSKCdtJywgMSwgaW50KQorI2RlZmluZSBTTkRDVExfTUlESV9NUFVDTUQJCV9TSU9XUignbScsIDIsIG1wdV9jb21tYW5kX3JlYykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJT0NUTCBjb21tYW5kcyBmb3IgL2Rldi9kc3AgYW5kIC9kZXYvYXVkaW8KKyAqLworCisjZGVmaW5lIFNORENUTF9EU1BfUkVTRVQJCV9TSU8gICgnUCcsIDApCisjZGVmaW5lIFNORENUTF9EU1BfU1lOQwkJCV9TSU8gICgnUCcsIDEpCisjZGVmaW5lIFNORENUTF9EU1BfU1BFRUQJCV9TSU9XUignUCcsIDIsIGludCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9TVEVSRU8JCV9TSU9XUignUCcsIDMsIGludCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRCTEtTSVpFCQlfU0lPV1IoJ1AnLCA0LCBpbnQpCisjZGVmaW5lIFNORENUTF9EU1BfU0FNUExFU0laRQkJU05EQ1RMX0RTUF9TRVRGTVQKKyNkZWZpbmUgU05EQ1RMX0RTUF9DSEFOTkVMUwkJX1NJT1dSKCdQJywgNiwgaW50KQorI2RlZmluZSBTT1VORF9QQ01fV1JJVEVfQ0hBTk5FTFMJU05EQ1RMX0RTUF9DSEFOTkVMUworI2RlZmluZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSCQlfU0lPV1IoJ1AnLCA3LCBpbnQpCisjZGVmaW5lIFNORENUTF9EU1BfUE9TVAkJCV9TSU8gICgnUCcsIDgpCisjZGVmaW5lIFNORENUTF9EU1BfU1VCRElWSURFCQlfU0lPV1IoJ1AnLCA5LCBpbnQpCisjZGVmaW5lIFNORENUTF9EU1BfU0VURlJBR01FTlQJCV9TSU9XUignUCcsMTAsIGludCkKKworLyoJQXVkaW8gZGF0YSBmb3JtYXRzIChOb3RlISBVOD04IGFuZCBTMTZfTEU9MTYgZm9yIGNvbXBhdGliaWxpdHkpICovCisjZGVmaW5lIFNORENUTF9EU1BfR0VURk1UUwkJX1NJT1IgKCdQJywxMSwgaW50KSAvKiBSZXR1cm5zIGEgbWFzayAqLworI2RlZmluZSBTTkRDVExfRFNQX1NFVEZNVAkJX1NJT1dSKCdQJyw1LCBpbnQpIC8qIFNlbGVjdHMgT05FIGZtdCovCisjCWRlZmluZSBBRk1UX1FVRVJZCQkweDAwMDAwMDAwCS8qIFJldHVybiBjdXJyZW50IGZtdCAqLworIwlkZWZpbmUgQUZNVF9NVV9MQVcJCTB4MDAwMDAwMDEKKyMJZGVmaW5lIEFGTVRfQV9MQVcJCTB4MDAwMDAwMDIKKyMJZGVmaW5lIEFGTVRfSU1BX0FEUENNCQkweDAwMDAwMDA0CisjCWRlZmluZSBBRk1UX1U4CQkJMHgwMDAwMDAwOAorIwlkZWZpbmUgQUZNVF9TMTZfTEUJCTB4MDAwMDAwMTAJLyogTGl0dGxlIGVuZGlhbiBzaWduZWQgMTYqLworIwlkZWZpbmUgQUZNVF9TMTZfQkUJCTB4MDAwMDAwMjAJLyogQmlnIGVuZGlhbiBzaWduZWQgMTYgKi8KKyMJZGVmaW5lIEFGTVRfUzgJCQkweDAwMDAwMDQwCisjCWRlZmluZSBBRk1UX1UxNl9MRQkJMHgwMDAwMDA4MAkvKiBMaXR0bGUgZW5kaWFuIFUxNiAqLworIwlkZWZpbmUgQUZNVF9VMTZfQkUJCTB4MDAwMDAxMDAJLyogQmlnIGVuZGlhbiBVMTYgKi8KKyMJZGVmaW5lIEFGTVRfTVBFRwkJMHgwMDAwMDIwMAkvKiBNUEVHICgyKSBhdWRpbyAqLworIwlkZWZpbmUgQUZNVF9BQzMJCTB4MDAwMDA0MDAJLyogRG9sYnkgRGlnaXRhbCBBQzMgKi8KKworLyoKKyAqIEJ1ZmZlciBzdGF0dXMgcXVlcmllcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYXVkaW9fYnVmX2luZm8geworCQkJaW50IGZyYWdtZW50czsJLyogIyBvZiBhdmFpbGFibGUgZnJhZ21lbnRzIChwYXJ0aWFsbHkgdXNlbmQgb25lcyBub3QgY291bnRlZCkgKi8KKwkJCWludCBmcmFnc3RvdGFsOwkvKiBUb3RhbCAjIG9mIGZyYWdtZW50cyBhbGxvY2F0ZWQgKi8KKwkJCWludCBmcmFnc2l6ZTsJLyogU2l6ZSBvZiBhIGZyYWdtZW50IGluIGJ5dGVzICovCisKKwkJCWludCBieXRlczsJLyogQXZhaWxhYmxlIHNwYWNlIGluIGJ5dGVzIChpbmNsdWRlcyBwYXJ0aWFsbHkgdXNlZCBmcmFnbWVudHMpICovCisJCQkvKiBOb3RlISAnYnl0ZXMnIGNvdWxkIGJlIG1vcmUgdGhhbiBmcmFnbWVudHMqZnJhZ3NpemUgKi8KKwkJfSBhdWRpb19idWZfaW5mbzsKKworI2RlZmluZSBTTkRDVExfRFNQX0dFVE9TUEFDRQkJX1NJT1IgKCdQJywxMiwgYXVkaW9fYnVmX2luZm8pCisjZGVmaW5lIFNORENUTF9EU1BfR0VUSVNQQUNFCQlfU0lPUiAoJ1AnLDEzLCBhdWRpb19idWZfaW5mbykKKyNkZWZpbmUgU05EQ1RMX0RTUF9OT05CTE9DSwkJX1NJTyAgKCdQJywxNCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRDQVBTCQlfU0lPUiAoJ1AnLDE1LCBpbnQpCisjCWRlZmluZSBEU1BfQ0FQX1JFVklTSU9OCQkweDAwMDAwMGZmCS8qIEJpdHMgZm9yIHJldmlzaW9uIGxldmVsICgwIHRvIDI1NSkgKi8KKyMJZGVmaW5lIERTUF9DQVBfRFVQTEVYCQkweDAwMDAwMTAwCS8qIEZ1bGwgZHVwbGV4IHJlY29yZC9wbGF5YmFjayAqLworIwlkZWZpbmUgRFNQX0NBUF9SRUFMVElNRQkJMHgwMDAwMDIwMAkvKiBSZWFsIHRpbWUgY2FwYWJpbGl0eSAqLworIwlkZWZpbmUgRFNQX0NBUF9CQVRDSAkJMHgwMDAwMDQwMAkvKiBEZXZpY2UgaGFzIHNvbWUga2luZCBvZiAqLworCQkJCQkJCS8qIGludGVybmFsIGJ1ZmZlcnMgd2hpY2ggbWF5ICovCisJCQkJCQkJLyogY2F1c2Ugc29tZSBkZWxheXMgYW5kICovCisJCQkJCQkJLyogZGVjcmVhc2UgcHJlY2lzaW9uIG9mIHRpbWluZyAqLworIwlkZWZpbmUgRFNQX0NBUF9DT1BST0MJCTB4MDAwMDA4MDAJLyogSGFzIGEgY29wcm9jZXNzb3IgKi8KKwkJCQkJCQkvKiBTb21ldGltZXMgaXQncyBhIERTUCAqLworCQkJCQkJCS8qIGJ1dCB1c3VhbGx5IG5vdCAqLworIwlkZWZpbmUgRFNQX0NBUF9UUklHR0VSCQkweDAwMDAxMDAwCS8qIFN1cHBvcnRzIFNFVFRSSUdHRVIgKi8KKyMJZGVmaW5lIERTUF9DQVBfTU1BUAkJMHgwMDAwMjAwMAkvKiBTdXBwb3J0cyBtbWFwKCkgKi8KKyMJZGVmaW5lIERTUF9DQVBfTVVMVEkJCTB4MDAwMDQwMDAJLyogc3VwcG9ydCBtdWx0aXBsZSBvcGVuICovCisjCWRlZmluZSBEU1BfQ0FQX0JJTkQJCTB4MDAwMDgwMDAJLyogY2hhbm5lbCBiaW5kaW5nIHRvIGZyb250L3JlYXIvY25ldGVyL2xmZSAqLworCisKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRUUklHR0VSCQlfU0lPUiAoJ1AnLDE2LCBpbnQpCisjZGVmaW5lIFNORENUTF9EU1BfU0VUVFJJR0dFUgkJX1NJT1cgKCdQJywxNiwgaW50KQorIwlkZWZpbmUgUENNX0VOQUJMRV9JTlBVVAkJMHgwMDAwMDAwMQorIwlkZWZpbmUgUENNX0VOQUJMRV9PVVRQVVQJCTB4MDAwMDAwMDIKKwordHlwZWRlZiBzdHJ1Y3QgY291bnRfaW5mbyB7CisJCWludCBieXRlczsJLyogVG90YWwgIyBvZiBieXRlcyBwcm9jZXNzZWQgKi8KKwkJaW50IGJsb2NrczsJLyogIyBvZiBmcmFnbWVudCB0cmFuc2l0aW9ucyBzaW5jZSBsYXN0IHRpbWUgKi8KKwkJaW50IHB0cjsJLyogQ3VycmVudCBETUEgcG9pbnRlciB2YWx1ZSAqLworCX0gY291bnRfaW5mbzsKKworI2RlZmluZSBTTkRDVExfRFNQX0dFVElQVFIJCV9TSU9SICgnUCcsMTcsIGNvdW50X2luZm8pCisjZGVmaW5lIFNORENUTF9EU1BfR0VUT1BUUgkJX1NJT1IgKCdQJywxOCwgY291bnRfaW5mbykKKwordHlwZWRlZiBzdHJ1Y3QgYnVmZm1lbV9kZXNjIHsKKwkJdW5zaWduZWQgKmJ1ZmZlcjsKKwkJaW50IHNpemU7CisJfSBidWZmbWVtX2Rlc2M7CisjZGVmaW5lIFNORENUTF9EU1BfTUFQSU5CVUYJCV9TSU9SICgnUCcsIDE5LCBidWZmbWVtX2Rlc2MpCisjZGVmaW5lIFNORENUTF9EU1BfTUFQT1VUQlVGCQlfU0lPUiAoJ1AnLCAyMCwgYnVmZm1lbV9kZXNjKQorI2RlZmluZSBTTkRDVExfRFNQX1NFVFNZTkNSTwkJX1NJTyAgKCdQJywgMjEpCisjZGVmaW5lIFNORENUTF9EU1BfU0VURFVQTEVYCQlfU0lPICAoJ1AnLCAyMikKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRPREVMQVkJCV9TSU9SICgnUCcsIDIzLCBpbnQpCisKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRDSEFOTkVMTUFTSwkJX1NJT1dSKCdQJywgNjQsIGludCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9CSU5EX0NIQU5ORUwJCV9TSU9XUignUCcsIDY1LCBpbnQpCisjCWRlZmluZSBEU1BfQklORF9RVUVSWQkJMHgwMDAwMDAwMAorIwlkZWZpbmUgRFNQX0JJTkRfRlJPTlQJCTB4MDAwMDAwMDEKKyMJZGVmaW5lIERTUF9CSU5EX1NVUlIJCTB4MDAwMDAwMDIKKyMJZGVmaW5lIERTUF9CSU5EX0NFTlRFUl9MRkUJMHgwMDAwMDAwNAorIwlkZWZpbmUgRFNQX0JJTkRfSEFORFNFVAkJMHgwMDAwMDAwOAorIwlkZWZpbmUgRFNQX0JJTkRfTUlDCQkweDAwMDAwMDEwCisjCWRlZmluZSBEU1BfQklORF9NT0RFTTEJCTB4MDAwMDAwMjAKKyMJZGVmaW5lIERTUF9CSU5EX01PREVNMgkJMHgwMDAwMDA0MAorIwlkZWZpbmUgRFNQX0JJTkRfSTJTCQkweDAwMDAwMDgwCisjCWRlZmluZSBEU1BfQklORF9TUERJRgkJMHgwMDAwMDEwMAorCisjZGVmaW5lIFNORENUTF9EU1BfU0VUU1BESUYJCV9TSU9XICgnUCcsIDY2LCBpbnQpCisjZGVmaW5lIFNORENUTF9EU1BfR0VUU1BESUYJCV9TSU9SICgnUCcsIDY3LCBpbnQpCisjCWRlZmluZSBTUERJRl9QUk8JMHgwMDAxCisjCWRlZmluZSBTUERJRl9OX0FVRAkweDAwMDIKKyMJZGVmaW5lIFNQRElGX0NPUFkJMHgwMDA0CisjCWRlZmluZSBTUERJRl9QUkUJMHgwMDA4CisjCWRlZmluZSBTUERJRl9DQwkJMHgwN2YwCisjCWRlZmluZSBTUERJRl9MCQkweDA4MDAKKyMJZGVmaW5lIFNQRElGX0RSUwkweDQwMDAKKyMJZGVmaW5lIFNQRElGX1YJCTB4ODAwMAorCisvKgorICogQXBwbGljYXRpb24ncyBwcm9maWxlIGRlZmluZXMgdGhlIHdheSBob3cgcGxheWJhY2sgdW5kZXJydW4gc2l0dWF0aW9ucyBzaG91bGQgYmUgaGFuZGxlZC4KKyAqIAorICoJQVBGX05PUk1BTCAodGhlIGRlZmF1bHQpIGFuZCBBUEZfTkVUV09SSyBtYWtlIHRoZSBkcml2ZXIgdG8gY2xlYW51cCB0aGUKKyAqCXBsYXliYWNrIGJ1ZmZlciB3aGVuZXZlciBhbiB1bmRlcnJ1biBvY2N1cnMuIFRoaXMgY29uc3VtZXMgc29tZSB0aW1lCisgKglwcmV2ZW50cyBsb29waW5nIHRoZSBleGlzdGluZyBidWZmZXIuCisgKglBUEZfQ1BVSU5URU5TIGlzIGludGVuZGVkIHRvIGJlIHNldCBieSBDUFUgaW50ZW5zaXZlIGFwcGxpY2F0aW9ucyB3aGljaAorICoJYXJlIGxpa2VseSB0byBydW4gb3V0IG9mIHRpbWUgb2NjYXNpb25hbGx5LiBJbiB0aGlzIG1vZGUgdGhlIGJ1ZmZlciBjbGVhbnVwIGlzCisgKglkaXNhYmxlZCB3aGljaCBzYXZlcyBDUFUgdGltZSBidXQgYWxzbyBsZXQncyB0aGUgcHJldmlvdXMgYnVmZmVyIGNvbnRlbnQgdG8KKyAqCWJlIHBsYXllZCBkdXJpbmcgdGhlICJwYXVzZSIgYWZ0ZXIgdGhlIHVuZGVycnVuLgorICovCisjZGVmaW5lIFNORENUTF9EU1BfUFJPRklMRQkJX1NJT1cgKCdQJywgMjMsIGludCkKKyNkZWZpbmUJICBBUEZfTk9STUFMCTAJLyogTm9ybWFsIGFwcGxpY2F0aW9ucyAqLworI2RlZmluZQkgIEFQRl9ORVRXT1JLCTEJLyogVW5kZXJydW5zIHByb2JhYmx5IGNhdXNlZCBieSBhbiAiZXh0ZXJuYWwiIGRlbGF5ICovCisjZGVmaW5lICAgQVBGX0NQVUlOVEVOUyAyCS8qIFVuZGVycnVucyBwcm9iYWJseSBjYXVzZWQgYnkgIm92ZXJoZWF0aW5nIiB0aGUgQ1BVICovCisKKyNkZWZpbmUgU09VTkRfUENNX1JFQURfUkFURQkJX1NJT1IgKCdQJywgMiwgaW50KQorI2RlZmluZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUwkJX1NJT1IgKCdQJywgNiwgaW50KQorI2RlZmluZSBTT1VORF9QQ01fUkVBRF9CSVRTCQlfU0lPUiAoJ1AnLCA1LCBpbnQpCisjZGVmaW5lIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUgkJX1NJT1IgKCdQJywgNywgaW50KQorCisvKiBTb21lIGFsaWFzIG5hbWVzICovCisjZGVmaW5lIFNPVU5EX1BDTV9XUklURV9CSVRTCQlTTkRDVExfRFNQX1NFVEZNVAorI2RlZmluZSBTT1VORF9QQ01fV1JJVEVfUkFURQkJU05EQ1RMX0RTUF9TUEVFRAorI2RlZmluZSBTT1VORF9QQ01fUE9TVAkJCVNORENUTF9EU1BfUE9TVAorI2RlZmluZSBTT1VORF9QQ01fUkVTRVQJCQlTTkRDVExfRFNQX1JFU0VUCisjZGVmaW5lIFNPVU5EX1BDTV9TWU5DCQkJU05EQ1RMX0RTUF9TWU5DCisjZGVmaW5lIFNPVU5EX1BDTV9TVUJESVZJREUJCVNORENUTF9EU1BfU1VCRElWSURFCisjZGVmaW5lIFNPVU5EX1BDTV9TRVRGUkFHTUVOVAkJU05EQ1RMX0RTUF9TRVRGUkFHTUVOVAorI2RlZmluZSBTT1VORF9QQ01fR0VURk1UUwkJU05EQ1RMX0RTUF9HRVRGTVRTCisjZGVmaW5lIFNPVU5EX1BDTV9TRVRGTVQJCVNORENUTF9EU1BfU0VURk1UCisjZGVmaW5lIFNPVU5EX1BDTV9HRVRPU1BBQ0UJCVNORENUTF9EU1BfR0VUT1NQQUNFCisjZGVmaW5lIFNPVU5EX1BDTV9HRVRJU1BBQ0UJCVNORENUTF9EU1BfR0VUSVNQQUNFCisjZGVmaW5lIFNPVU5EX1BDTV9OT05CTE9DSwkJU05EQ1RMX0RTUF9OT05CTE9DSworI2RlZmluZSBTT1VORF9QQ01fR0VUQ0FQUwkJU05EQ1RMX0RTUF9HRVRDQVBTCisjZGVmaW5lIFNPVU5EX1BDTV9HRVRUUklHR0VSCQlTTkRDVExfRFNQX0dFVFRSSUdHRVIKKyNkZWZpbmUgU09VTkRfUENNX1NFVFRSSUdHRVIJCVNORENUTF9EU1BfU0VUVFJJR0dFUgorI2RlZmluZSBTT1VORF9QQ01fU0VUU1lOQ1JPCQlTTkRDVExfRFNQX1NFVFNZTkNSTworI2RlZmluZSBTT1VORF9QQ01fR0VUSVBUUgkJU05EQ1RMX0RTUF9HRVRJUFRSCisjZGVmaW5lIFNPVU5EX1BDTV9HRVRPUFRSCQlTTkRDVExfRFNQX0dFVE9QVFIKKyNkZWZpbmUgU09VTkRfUENNX01BUElOQlVGCQlTTkRDVExfRFNQX01BUElOQlVGCisjZGVmaW5lIFNPVU5EX1BDTV9NQVBPVVRCVUYJCVNORENUTF9EU1BfTUFQT1VUQlVGCisKKy8qCisgKiBpb2N0bCBjYWxscyB0byBiZSB1c2VkIGluIGNvbW11bmljYXRpb24gd2l0aCBjb3Byb2Nlc3NvcnMgYW5kCisgKiBEU1AgY2hpcHMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgY29wcl9idWZmZXIgeworCQlpbnQgY29tbWFuZDsJLyogU2V0IHRvIDAgaWYgbm90IHVzZWQgKi8KKwkJaW50IGZsYWdzOworI2RlZmluZSBDUEZfTk9ORQkJMHgwMDAwCisjZGVmaW5lIENQRl9GSVJTVAkJMHgwMDAxCS8qIEZpcnN0IGJsb2NrICovCisjZGVmaW5lIENQRl9MQVNUCQkweDAwMDIJLyogTGFzdCBibG9jayAqLworCQlpbnQgbGVuOworCQlpbnQgb2ZmczsJLyogSWYgcmVxdWlyZWQgYnkgdGhlIGRldmljZSAoMCBpZiBub3QgdXNlZCkgKi8KKworCQl1bnNpZ25lZCBjaGFyIGRhdGFbNDAwMF07IC8qIE5PVEUhIDQwMDAgaXMgbm90IDRrICovCisJfSBjb3ByX2J1ZmZlcjsKKwordHlwZWRlZiBzdHJ1Y3QgY29wcl9kZWJ1Z19idWYgeworCQlpbnQgY29tbWFuZDsJLyogVXNlZCBpbnRlcm5hbGx5LiBTZXQgdG8gMCAqLworCQlpbnQgcGFybTE7CisJCWludCBwYXJtMjsKKwkJaW50IGZsYWdzOwkKKwkJaW50IGxlbjsJLyogTGVuZ3RoIG9mIGRhdGEgaW4gYnl0ZXMgKi8KKwl9IGNvcHJfZGVidWdfYnVmOworCit0eXBlZGVmIHN0cnVjdCBjb3ByX21zZyB7CisJCWludCBsZW47CisJCXVuc2lnbmVkIGNoYXIgZGF0YVs0MDAwXTsKKwl9IGNvcHJfbXNnOworCisjZGVmaW5lIFNORENUTF9DT1BSX1JFU0VUICAgICAgICAgICAgIF9TSU8gICgnQycsICAwKQorI2RlZmluZSBTTkRDVExfQ09QUl9MT0FECSAgICAgIF9TSU9XUignQycsICAxLCBjb3ByX2J1ZmZlcikKKyNkZWZpbmUgU05EQ1RMX0NPUFJfUkRBVEEJICAgICAgX1NJT1dSKCdDJywgIDIsIGNvcHJfZGVidWdfYnVmKQorI2RlZmluZSBTTkRDVExfQ09QUl9SQ09ERQkgICAgICBfU0lPV1IoJ0MnLCAgMywgY29wcl9kZWJ1Z19idWYpCisjZGVmaW5lIFNORENUTF9DT1BSX1dEQVRBCSAgICAgIF9TSU9XICgnQycsICA0LCBjb3ByX2RlYnVnX2J1ZikKKyNkZWZpbmUgU05EQ1RMX0NPUFJfV0NPREUJICAgICAgX1NJT1cgKCdDJywgIDUsIGNvcHJfZGVidWdfYnVmKQorI2RlZmluZSBTTkRDVExfQ09QUl9SVU4JCSAgICAgIF9TSU9XUignQycsICA2LCBjb3ByX2RlYnVnX2J1ZikKKyNkZWZpbmUgU05EQ1RMX0NPUFJfSEFMVAkgICAgICBfU0lPV1IoJ0MnLCAgNywgY29wcl9kZWJ1Z19idWYpCisjZGVmaW5lIFNORENUTF9DT1BSX1NFTkRNU0cJICAgICAgX1NJT1dSKCdDJywgIDgsIGNvcHJfbXNnKQorI2RlZmluZSBTTkRDVExfQ09QUl9SQ1ZNU0cJICAgICAgX1NJT1IgKCdDJywgIDksIGNvcHJfbXNnKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJT0NUTCBjb21tYW5kcyBmb3IgL2Rldi9taXhlcgorICovCisJCisvKiAKKyAqIE1peGVyIGRldmljZXMKKyAqCisgKiBUaGVyZSBjYW4gYmUgdXAgdG8gMjAgZGlmZmVyZW50IGFuYWxvZyBtaXhlciBjaGFubmVscy4gVGhlCisgKiBTT1VORF9NSVhFUl9OUkRFVklDRVMgZ2l2ZXMgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgbWF4aW11bS4gCisgKiBUaGUgU09VTkRfTUlYRVJfUkVBRF9ERVZNQVNLIHJldHVybnMgYSBiaXRtYXNrIHdoaWNoIHRlbGxzCisgKiB0aGUgZGV2aWNlcyBzdXBwb3J0ZWQgYnkgdGhlIHBhcnRpY3VsYXIgbWl4ZXIuCisgKi8KKworI2RlZmluZSBTT1VORF9NSVhFUl9OUkRFVklDRVMJMjUKKyNkZWZpbmUgU09VTkRfTUlYRVJfVk9MVU1FCTAKKyNkZWZpbmUgU09VTkRfTUlYRVJfQkFTUwkxCisjZGVmaW5lIFNPVU5EX01JWEVSX1RSRUJMRQkyCisjZGVmaW5lIFNPVU5EX01JWEVSX1NZTlRICTMKKyNkZWZpbmUgU09VTkRfTUlYRVJfUENNCQk0CisjZGVmaW5lIFNPVU5EX01JWEVSX1NQRUFLRVIJNQorI2RlZmluZSBTT1VORF9NSVhFUl9MSU5FCTYKKyNkZWZpbmUgU09VTkRfTUlYRVJfTUlDCQk3CisjZGVmaW5lIFNPVU5EX01JWEVSX0NECQk4CisjZGVmaW5lIFNPVU5EX01JWEVSX0lNSVgJOQkvKiAgUmVjb3JkaW5nIG1vbml0b3IgICovCisjZGVmaW5lIFNPVU5EX01JWEVSX0FMVFBDTQkxMAorI2RlZmluZSBTT1VORF9NSVhFUl9SRUNMRVYJMTEJLyogUmVjb3JkaW5nIGxldmVsICovCisjZGVmaW5lIFNPVU5EX01JWEVSX0lHQUlOCTEyCS8qIElucHV0IGdhaW4gKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfT0dBSU4JMTMJLyogT3V0cHV0IGdhaW4gKi8KKy8qIAorICogVGhlIEFEMTg0OCBjb2RlYyBhbmQgY29tcGF0aWJsZXMgaGF2ZSB0aHJlZSBsaW5lIGxldmVsIGlucHV0cworICogKGxpbmUsIGF1eDEgYW5kIGF1eDIpLiBTaW5jZSBlYWNoIGNhcmQgbWFudWZhY3R1cmVyIGhhdmUgYXNzaWduZWQKKyAqIGRpZmZlcmVudCBtZWFuaW5ncyB0byB0aGVzZSBpbnB1dHMsIGl0J3MgaW5wcmFjdGljYWwgdG8gYXNzaWduCisgKiBzcGVjaWZpYyBtZWFuaW5ncyAobGluZSwgY2QsIHN5bnRoIGV0Yy4pIHRvIHRoZW0uCisgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfTElORTEJMTQJLyogSW5wdXQgc291cmNlIDEgIChhdXgxKSAqLworI2RlZmluZSBTT1VORF9NSVhFUl9MSU5FMgkxNQkvKiBJbnB1dCBzb3VyY2UgMiAgKGF1eDIpICovCisjZGVmaW5lIFNPVU5EX01JWEVSX0xJTkUzCTE2CS8qIElucHV0IHNvdXJjZSAzICAobGluZSkgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfRElHSVRBTDEJMTcJLyogRGlnaXRhbCAoaW5wdXQpIDEgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfRElHSVRBTDIJMTgJLyogRGlnaXRhbCAoaW5wdXQpIDIgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfRElHSVRBTDMJMTkJLyogRGlnaXRhbCAoaW5wdXQpIDMgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfUEhPTkVJTgkyMAkvKiBQaG9uZSBpbnB1dCAqLworI2RlZmluZSBTT1VORF9NSVhFUl9QSE9ORU9VVAkyMQkvKiBQaG9uZSBvdXRwdXQgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfVklERU8JMjIJLyogVmlkZW8vVFYgKGF1ZGlvKSBpbiAqLworI2RlZmluZSBTT1VORF9NSVhFUl9SQURJTwkyMwkvKiBSYWRpbyBpbiAqLworI2RlZmluZSBTT1VORF9NSVhFUl9NT05JVE9SCTI0CS8qIE1vbml0b3IgKHVzdWFsbHkgbWljKSB2b2x1bWUgKi8KKworLyogU29tZSBvbi9vZmYgc2V0dGluZ3MgKFNPVU5EX1NQRUNJQUxfTUlOIC0gU09VTkRfU1BFQ0lBTF9NQVgpICovCisvKiBOb3QgY291bnRlZCB0byBTT1VORF9NSVhFUl9OUkRFVklDRVMsIGJ1dCB1c2UgdGhlIHNhbWUgbnVtYmVyIHNwYWNlICovCisjZGVmaW5lIFNPVU5EX09OT0ZGX01JTgkJMjgKKyNkZWZpbmUgU09VTkRfT05PRkZfTUFYCQkzMAorCisvKiBOb3RlIQlOdW1iZXIgMzEgY2Fubm90IGJlIHVzZWQgc2luY2UgdGhlIHNpZ24gYml0IGlzIHJlc2VydmVkICovCisjZGVmaW5lIFNPVU5EX01JWEVSX05PTkUJMzEKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgdW5zdXBwb3J0ZWQgbWFjcm9zIGFyZSBubyBsb25nZXIgZnVuY3Rpb25hbC4KKyAqIFVzZSBTT1VORF9NSVhFUl9QUklWQVRFIyBtYWNyb3MgaW4gZnV0dXJlLgorICovCisjZGVmaW5lIFNPVU5EX01JWEVSX0VOSEFOQ0UJU09VTkRfTUlYRVJfTk9ORQorI2RlZmluZSBTT1VORF9NSVhFUl9NVVRFCVNPVU5EX01JWEVSX05PTkUKKyNkZWZpbmUgU09VTkRfTUlYRVJfTE9VRAlTT1VORF9NSVhFUl9OT05FCisKKworI2RlZmluZSBTT1VORF9ERVZJQ0VfTEFCRUxTCXsiVm9sICAiLCAiQmFzcyAiLCAiVHJlYmwiLCAiU3ludGgiLCAiUGNtICAiLCAiU3BrciAiLCAiTGluZSAiLCBcCisJCQkJICJNaWMgICIsICJDRCAgICIsICJNaXggICIsICJQY20yICIsICJSZWMgICIsICJJR2FpbiIsICJPR2FpbiIsIFwKKwkJCQkgIkxpbmUxIiwgIkxpbmUyIiwgIkxpbmUzIiwgIkRpZ2l0YWwxIiwgIkRpZ2l0YWwyIiwgIkRpZ2l0YWwzIiwgXAorCQkJCSAiUGhvbmVJbiIsICJQaG9uZU91dCIsICJWaWRlbyIsICJSYWRpbyIsICJNb25pdG9yIn0KKworI2RlZmluZSBTT1VORF9ERVZJQ0VfTkFNRVMJeyJ2b2wiLCAiYmFzcyIsICJ0cmVibGUiLCAic3ludGgiLCAicGNtIiwgInNwZWFrZXIiLCAibGluZSIsIFwKKwkJCQkgIm1pYyIsICJjZCIsICJtaXgiLCAicGNtMiIsICJyZWMiLCAiaWdhaW4iLCAib2dhaW4iLCBcCisJCQkJICJsaW5lMSIsICJsaW5lMiIsICJsaW5lMyIsICJkaWcxIiwgImRpZzIiLCAiZGlnMyIsIFwKKwkJCQkgInBoaW4iLCAicGhvdXQiLCAidmlkZW8iLCAicmFkaW8iLCAibW9uaXRvciJ9CisKKy8qCURldmljZSBiaXRtYXNrIGlkZW50aWZpZXJzCSovCisKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVDU1JDCTB4ZmYJLyogQXJnIGNvbnRhaW5zIGEgYml0IGZvciBlYWNoIHJlY29yZGluZyBzb3VyY2UgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfREVWTUFTSwkweGZlCS8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBzdXBwb3J0ZWQgZGV2aWNlICovCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQ01BU0sJMHhmZAkvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggc3VwcG9ydGVkIHJlY29yZGluZyBzb3VyY2UgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfQ0FQUwkweGZjCisjCWRlZmluZSBTT1VORF9DQVBfRVhDTF9JTlBVVAkweDAwMDAwMDAxCS8qIE9ubHkgb25lIHJlY29yZGluZyBzb3VyY2UgYXQgYSB0aW1lICovCisjZGVmaW5lIFNPVU5EX01JWEVSX1NURVJFT0RFVlMJMHhmYgkvKiBNaXhlciBjaGFubmVscyBzdXBwb3J0aW5nIHN0ZXJlbyAqLworI2RlZmluZSBTT1VORF9NSVhFUl9PVVRTUkMJMHhmYQkvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggaW5wdXQgc291cmNlIHRvIG91dHB1dCAqLworI2RlZmluZSBTT1VORF9NSVhFUl9PVVRNQVNLCTB4ZjkJLyogQXJnIGNvbnRhaW5zIGEgYml0IGZvciBlYWNoIHN1cHBvcnRlZCBpbnB1dCBzb3VyY2UgdG8gb3V0cHV0ICovCisKKy8qCURldmljZSBtYXNrIGJpdHMJKi8KKworI2RlZmluZSBTT1VORF9NQVNLX1ZPTFVNRQkoMSA8PCBTT1VORF9NSVhFUl9WT0xVTUUpCisjZGVmaW5lIFNPVU5EX01BU0tfQkFTUwkJKDEgPDwgU09VTkRfTUlYRVJfQkFTUykKKyNkZWZpbmUgU09VTkRfTUFTS19UUkVCTEUJKDEgPDwgU09VTkRfTUlYRVJfVFJFQkxFKQorI2RlZmluZSBTT1VORF9NQVNLX1NZTlRICSgxIDw8IFNPVU5EX01JWEVSX1NZTlRIKQorI2RlZmluZSBTT1VORF9NQVNLX1BDTQkJKDEgPDwgU09VTkRfTUlYRVJfUENNKQorI2RlZmluZSBTT1VORF9NQVNLX1NQRUFLRVIJKDEgPDwgU09VTkRfTUlYRVJfU1BFQUtFUikKKyNkZWZpbmUgU09VTkRfTUFTS19MSU5FCQkoMSA8PCBTT1VORF9NSVhFUl9MSU5FKQorI2RlZmluZSBTT1VORF9NQVNLX01JQwkJKDEgPDwgU09VTkRfTUlYRVJfTUlDKQorI2RlZmluZSBTT1VORF9NQVNLX0NECQkoMSA8PCBTT1VORF9NSVhFUl9DRCkKKyNkZWZpbmUgU09VTkRfTUFTS19JTUlYCQkoMSA8PCBTT1VORF9NSVhFUl9JTUlYKQorI2RlZmluZSBTT1VORF9NQVNLX0FMVFBDTQkoMSA8PCBTT1VORF9NSVhFUl9BTFRQQ00pCisjZGVmaW5lIFNPVU5EX01BU0tfUkVDTEVWCSgxIDw8IFNPVU5EX01JWEVSX1JFQ0xFVikKKyNkZWZpbmUgU09VTkRfTUFTS19JR0FJTgkoMSA8PCBTT1VORF9NSVhFUl9JR0FJTikKKyNkZWZpbmUgU09VTkRfTUFTS19PR0FJTgkoMSA8PCBTT1VORF9NSVhFUl9PR0FJTikKKyNkZWZpbmUgU09VTkRfTUFTS19MSU5FMQkoMSA8PCBTT1VORF9NSVhFUl9MSU5FMSkKKyNkZWZpbmUgU09VTkRfTUFTS19MSU5FMgkoMSA8PCBTT1VORF9NSVhFUl9MSU5FMikKKyNkZWZpbmUgU09VTkRfTUFTS19MSU5FMwkoMSA8PCBTT1VORF9NSVhFUl9MSU5FMykKKyNkZWZpbmUgU09VTkRfTUFTS19ESUdJVEFMMQkoMSA8PCBTT1VORF9NSVhFUl9ESUdJVEFMMSkKKyNkZWZpbmUgU09VTkRfTUFTS19ESUdJVEFMMgkoMSA8PCBTT1VORF9NSVhFUl9ESUdJVEFMMikKKyNkZWZpbmUgU09VTkRfTUFTS19ESUdJVEFMMwkoMSA8PCBTT1VORF9NSVhFUl9ESUdJVEFMMykKKyNkZWZpbmUgU09VTkRfTUFTS19QSE9ORUlOCSgxIDw8IFNPVU5EX01JWEVSX1BIT05FSU4pCisjZGVmaW5lIFNPVU5EX01BU0tfUEhPTkVPVVQJKDEgPDwgU09VTkRfTUlYRVJfUEhPTkVPVVQpCisjZGVmaW5lIFNPVU5EX01BU0tfUkFESU8JKDEgPDwgU09VTkRfTUlYRVJfUkFESU8pCisjZGVmaW5lIFNPVU5EX01BU0tfVklERU8JKDEgPDwgU09VTkRfTUlYRVJfVklERU8pCisjZGVmaW5lIFNPVU5EX01BU0tfTU9OSVRPUgkoMSA8PCBTT1VORF9NSVhFUl9NT05JVE9SKQorCisvKiBPYnNvbGV0ZSBtYWNyb3MgKi8KKyNkZWZpbmUgU09VTkRfTUFTS19NVVRFCQkoMSA8PCBTT1VORF9NSVhFUl9NVVRFKQorI2RlZmluZSBTT1VORF9NQVNLX0VOSEFOQ0UJKDEgPDwgU09VTkRfTUlYRVJfRU5IQU5DRSkKKyNkZWZpbmUgU09VTkRfTUFTS19MT1VECQkoMSA8PCBTT1VORF9NSVhFUl9MT1VEKQorCisjZGVmaW5lIE1JWEVSX1JFQUQoZGV2KQkJX1NJT1IoJ00nLCBkZXYsIGludCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9WT0xVTUUJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfVk9MVU1FKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0JBU1MJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfQkFTUykKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9UUkVCTEUJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfVFJFQkxFKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX1NZTlRICQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1NZTlRIKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX1BDTQkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9QQ00pCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfU1BFQUtFUglNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1NQRUFLRVIpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfTElORQkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9MSU5FKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX01JQwkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9NSUMpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfQ0QJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfQ0QpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfSU1JWAkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9JTUlYKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0FMVFBDTQkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9BTFRQQ00pCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfUkVDTEVWCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1JFQ0xFVikKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9JR0FJTgkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9JR0FJTikKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9PR0FJTgkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9PR0FJTikKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9MSU5FMQkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9MSU5FMSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9MSU5FMgkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9MSU5FMikKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9MSU5FMwkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9MSU5FMykKKworLyogT2Jzb2xldGUgbWFjcm9zICovCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfTVVURQkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9NVVRFKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0VOSEFOQ0UJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9FTkhBTkNFKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0xPVUQJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfTE9VRCkKKworI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX1JFQ1NSQwkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9SRUNTUkMpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfREVWTUFTSwlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0RFVk1BU0spCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfUkVDTUFTSwlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1JFQ01BU0spCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfU1RFUkVPREVWUwlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1NURVJFT0RFVlMpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfQ0FQUwkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9DQVBTKQorCisjZGVmaW5lIE1JWEVSX1dSSVRFKGRldikJCV9TSU9XUignTScsIGRldiwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9WT0xVTUUJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfVk9MVU1FKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9CQVNTCQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9CQVNTKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9UUkVCTEUJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfVFJFQkxFKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9TWU5USAkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfU1lOVEgpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX1BDTQkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfUENNKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9TUEVBS0VSCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX1NQRUFLRVIpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0xJTkUJCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX01JQwkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfTUlDKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9DRAkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfQ0QpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0lNSVgJCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0lNSVgpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0FMVFBDTQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9BTFRQQ00pCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX1JFQ0xFVglNSVhFUl9XUklURShTT1VORF9NSVhFUl9SRUNMRVYpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0lHQUlOCQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9JR0FJTikKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfT0dBSU4JCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX09HQUlOKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9MSU5FMQkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfTElORTEpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0xJTkUyCQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9MSU5FMikKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfTElORTMJCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUzKQorCisvKiBPYnNvbGV0ZSBtYWNyb3MgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfTVVURQkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfTVVURSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfRU5IQU5DRQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9FTkhBTkNFKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9MT1VECQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9MT1VEKQorCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX1JFQ1NSQwlNSVhFUl9XUklURShTT1VORF9NSVhFUl9SRUNTUkMpCisKK3R5cGVkZWYgc3RydWN0IG1peGVyX2luZm8KK3sKKyAgY2hhciBpZFsxNl07CisgIGNoYXIgbmFtZVszMl07CisgIGludCAgbW9kaWZ5X2NvdW50ZXI7CisgIGludCBmaWxsZXJzWzEwXTsKK30gbWl4ZXJfaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgX29sZF9taXhlcl9pbmZvIC8qIE9ic29sZXRlICovCit7CisgIGNoYXIgaWRbMTZdOworICBjaGFyIG5hbWVbMzJdOworfSBfb2xkX21peGVyX2luZm87CisKKyNkZWZpbmUgU09VTkRfTUlYRVJfSU5GTwkJX1NJT1IgKCdNJywgMTAxLCBtaXhlcl9pbmZvKQorI2RlZmluZSBTT1VORF9PTERfTUlYRVJfSU5GTwkJX1NJT1IgKCdNJywgMTAxLCBfb2xkX21peGVyX2luZm8pCisKKy8qCisgKiBBIG1lY2hhbmlzbSBmb3IgYWNjZXNzaW5nICJwcm9wcmlldGFyeSIgbWl4ZXIgZmVhdHVyZXMuIFRoaXMgbWV0aG9kCisgKiBwZXJtaXRzIHBhc3NpbmcgMTI4IGJ5dGVzIG9mIGFyYml0cmFyeSBkYXRhIGJldHdlZW4gYSBtaXhlciBhcHBsaWNhdGlvbgorICogYW5kIHRoZSBtaXhlciBkcml2ZXIuIEludGVycHJldGF0aW9uIG9mIHRoZSByZWNvcmQgaXMgZGVmaW5lZCBieQorICogdGhlIHBhcnRpY3VsYXIgbWl4ZXIgZHJpdmVyLgorICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgbWl4ZXJfcmVjb3JkWzEyOF07CisKKyNkZWZpbmUgU09VTkRfTUlYRVJfQUNDRVNTCQlfU0lPV1IoJ00nLCAxMDIsIG1peGVyX3JlY29yZCkKKworLyoKKyAqIFR3byBpb2N0bHMgZm9yIHNwZWNpYWwgc291bmNhcmQgZnVuY3Rpb24KKyAqLworI2RlZmluZSBTT1VORF9NSVhFUl9BR0MgIF9TSU9XUignTScsIDEwMywgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl8zRFNFICBfU0lPV1IoJ00nLCAxMDQsIGludCkKKworLyoKKyAqIFRoZSBTT1VORF9NSVhFUl9QUklWQVRFIyBjb21tYW5kcyBjYW4gYmUgcmVkZWZpbmVkIGJ5IGxvdyBsZXZlbCBkcml2ZXJzLgorICogVGhlc2UgZmVhdHVyZXMgY2FuIGJlIHVzZWQgd2hlbiBhY2Nlc3NpbmcgZGV2aWNlIHNwZWNpZmljIGZlYXR1cmVzLgorICovCisjZGVmaW5lIFNPVU5EX01JWEVSX1BSSVZBVEUxCQlfU0lPV1IoJ00nLCAxMTEsIGludCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUFJJVkFURTIJCV9TSU9XUignTScsIDExMiwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9QUklWQVRFMwkJX1NJT1dSKCdNJywgMTEzLCBpbnQpCisjZGVmaW5lIFNPVU5EX01JWEVSX1BSSVZBVEU0CQlfU0lPV1IoJ00nLCAxMTQsIGludCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUFJJVkFURTUJCV9TSU9XUignTScsIDExNSwgaW50KQorCisvKgorICogU09VTkRfTUlYRVJfR0VUTEVWRUxTIGFuZCBTT1VORF9NSVhFUl9TRVRMRVZFTFMgY2FsbHMgY2FuIGJlIHVzZWQKKyAqIGZvciBxdWVyeWluZyBjdXJyZW50IG1peGVyIHNldHRpbmdzIGZyb20gdGhlIGRyaXZlciBhbmQgZm9yIGxvYWRpbmcKKyAqIGRlZmF1bHQgdm9sdW1lIHNldHRpbmdzIF9wcmlvcl8gYWN0aXZhdGluZyB0aGUgbWl4ZXIgKGxvYWRpbmcKKyAqIGRvZXNuJ3QgYWZmZWN0IGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1peGVyIGhhcmR3YXJlKS4gVGhlc2UgY2FsbHMKKyAqIGFyZSBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbWl4ZXJfdm9sX3RhYmxlIHsKKyAgaW50IG51bTsJLyogSW5kZXggdG8gdm9sdW1lIHRhYmxlICovCisgIGNoYXIgbmFtZVszMl07CisgIGludCBsZXZlbHNbMzJdOworfSBtaXhlcl92b2xfdGFibGU7CisKKyNkZWZpbmUgU09VTkRfTUlYRVJfR0VUTEVWRUxTCQlfU0lPV1IoJ00nLCAxMTYsIG1peGVyX3ZvbF90YWJsZSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfU0VUTEVWRUxTCQlfU0lPV1IoJ00nLCAxMTcsIG1peGVyX3ZvbF90YWJsZSkKKworLyogCisgKiBBbiBpb2N0bCBmb3IgaWRlbnRpZnlpbmcgdGhlIGRyaXZlciB2ZXJzaW9uLiBJdCB3aWxsIHJldHVybiB2YWx1ZQorICogb2YgdGhlIFNPVU5EX1ZFUlNJT04gbWFjcm8gdXNlZCB3aGVuIGNvbXBpbGluZyB0aGUgZHJpdmVyLgorICogVGhpcyBjYWxsIHdhcyBpbnRyb2R1Y2VkIGluIE9TUyB2ZXJzaW9uIDMuNiBhbmQgaXQgd2lsbCBub3Qgd29yaworICogd2l0aCBlYXJsaWVyIHZlcnNpb25zIChyZXR1cm5zIEVJTlZBTCkuCisgKi8KKyNkZWZpbmUgT1NTX0dFVFZFUlNJT04JCQlfU0lPUiAoJ00nLCAxMTgsIGludCkKKworLyoKKyAqIExldmVsIDIgZXZlbnQgdHlwZXMgZm9yIC9kZXYvc2VxdWVuY2VyCisgKi8KKworLyoKKyAqIFRoZSA0IG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiBieXRlIDAgc3BlY2lmeSB0aGUgY2xhc3Mgb2YKKyAqIHRoZSBldmVudDogCisgKgorICoJMHg4WCA9IHN5c3RlbSBsZXZlbCBldmVudHMsCisgKgkweDlYID0gZGV2aWNlL3BvcnQgc3BlY2lmaWMgZXZlbnRzLCBldmVudFsxXSA9IGRldmljZS9wb3J0LAorICoJCVRoZSBsYXN0IDQgYml0cyBnaXZlIHRoZSBzdWJ0eXBlOgorICoJCQkweDAyCT0gQ2hhbm5lbCBldmVudCAoZXZlbnRbM10gPSBjaG4pLgorICoJCQkweDAxCT0gbm90ZSBldmVudCAoZXZlbnRbNF0gPSBub3RlKS4KKyAqCQkJKDB4MDEgaXMgbm90IHVzZWQgYWxvbmUgYnV0IGFsd2F5cyB3aXRoIGJpdCAweDAyKS4KKyAqCSAgICAgICBldmVudFsyXSA9IE1JREkgbWVzc2FnZSBjb2RlICgweDgwPW5vdGUgb2ZmIGV0Yy4pCisgKgorICovCisKKyNkZWZpbmUgRVZfU0VRX0xPQ0FMCQkweDgwCisjZGVmaW5lIEVWX1RJTUlORwkJMHg4MQorI2RlZmluZSBFVl9DSE5fQ09NTU9OCQkweDkyCisjZGVmaW5lIEVWX0NITl9WT0lDRQkJMHg5MworI2RlZmluZSBFVl9TWVNFWAkJMHg5NAorLyoKKyAqIEV2ZW50IHR5cGVzIDIwMCB0byAyMjAgYXJlIHJlc2VydmVkIGZvciBhcHBsaWNhdGlvbiB1c2UuCisgKiBUaGVzZSBudW1iZXJzIHdpbGwgbm90IGJlIHVzZWQgYnkgdGhlIGRyaXZlci4KKyAqLworCisvKgorICogRXZlbnRzIGZvciBldmVudCB0eXBlIEVWX0NITl9WT0lDRQorICovCisKKyNkZWZpbmUgTUlESV9OT1RFT0ZGCQkweDgwCisjZGVmaW5lIE1JRElfTk9URU9OCQkweDkwCisjZGVmaW5lIE1JRElfS0VZX1BSRVNTVVJFCTB4QTAKKworLyoKKyAqIEV2ZW50cyBmb3IgZXZlbnQgdHlwZSBFVl9DSE5fQ09NTU9OCisgKi8KKworI2RlZmluZSBNSURJX0NUTF9DSEFOR0UJCTB4QjAKKyNkZWZpbmUgTUlESV9QR01fQ0hBTkdFCQkweEMwCisjZGVmaW5lIE1JRElfQ0hOX1BSRVNTVVJFCTB4RDAKKyNkZWZpbmUgTUlESV9QSVRDSF9CRU5ECQkweEUwCisKKyNkZWZpbmUgTUlESV9TWVNURU1fUFJFRklYCTB4RjAKKworLyoKKyAqIFRpbWVyIGV2ZW50IHR5cGVzCisgKi8KKyNkZWZpbmUgVE1SX1dBSVRfUkVMCQkxCS8qIFRpbWUgcmVsYXRpdmUgdG8gdGhlIHByZXYgdGltZSAqLworI2RlZmluZSBUTVJfV0FJVF9BQlMJCTIJLyogQWJzb2x1dGUgdGltZSBzaW5jZSBUTVJfU1RBUlQgKi8KKyNkZWZpbmUgVE1SX1NUT1AJCTMKKyNkZWZpbmUgVE1SX1NUQVJUCQk0CisjZGVmaW5lIFRNUl9DT05USU5VRQkJNQorI2RlZmluZSBUTVJfVEVNUE8JCTYKKyNkZWZpbmUgVE1SX0VDSE8JCTgKKyNkZWZpbmUgVE1SX0NMT0NLCQk5CS8qIE1JREkgY2xvY2sgKi8KKyNkZWZpbmUgVE1SX1NQUAkJCTEwCS8qIFNvbmcgcG9zaXRpb24gcG9pbnRlciAqLworI2RlZmluZSBUTVJfVElNRVNJRwkJMTEJLyogVGltZSBzaWduYXR1cmUgKi8KKworLyoKKyAqCUxvY2FsIGV2ZW50IHR5cGVzCisgKi8KKyNkZWZpbmUgTE9DTF9TVEFSVEFVRElPCQkxCisKKy8qCisgKglTb21lIGNvbnZlbmllbmNlIG1hY3JvcyB0byBzaW1wbGlmeSBwcm9ncmFtbWluZyBvZiB0aGUKKyAqCS9kZXYvc2VxdWVuY2VyIGludGVyZmFjZQorICoKKyAqCVRoaXMgaXMgYSBsZWdhY3kgaW50ZXJmYWNlIGZvciBhcHBsaWNhdGlvbnMgd3JpdHRlbiBhZ2FpbnN0CisgKgl0aGUgT1NTbGliLTMuOCBzdHlsZSBpbnRlcmZhY2UuIEl0IGlzIG5vIGxvbmdlciBwb3NzaWJsZQorICoJdG8gYWN0dWFsbHkgbGluayBhZ2FpbnN0IE9TU2xpYiB3aXRoIHRoaXMgaGVhZGVyLCBidXQgd2UKKyAqCXN0aWxsIHByb3ZpZGUgdGhlc2UgbWFjcm9zIGZvciBwcm9ncmFtcyB1c2luZyB0aGVtLgorICoKKyAqCUlmIHlvdSB3YW50IHRvIHVzZSBPU1NsaWIsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGdldAorICoJdGhlIEdQTCB2ZXJzaW9uIG9mIE9TUy00LnggYW5kIGJ1aWxkIGFnYWluc3QgdGhhdCB2ZXJzaW9uCisgKglvZiB0aGUgaGVhZGVyLgorICoKKyAqCVdlIHJlZGVmaW5lIHRoZSBleHRlcm4ga2V5d29yZCBzbyB0aGF0IG1ha2UgaGVhZGVyc19jaGVjaworICoJZG9lcyBub3QgY29tcGxhaW4gYWJvdXQgU0VRX1VTRV9FWFRCVUYuCisgKi8KKyNkZWZpbmUgU0VRX0RFQ0xBUkVCVUYoKQkJU0VRX1VTRV9FWFRCVUYoKQorCit2b2lkIHNlcWJ1Zl9kdW1wKHZvaWQpOwkvKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgcHJvdmlkZWQgYnkgcHJvZ3JhbXMgKi8KKworI2RlZmluZSBTRVFfUE1fREVGSU5FUyBpbnQgX19mb29fYmFyX19fCisKKyNkZWZpbmUgU0VRX0xPQURfR01JTlNUUihkZXYsIGluc3RyKQorI2RlZmluZSBTRVFfTE9BRF9HTURSVU0oZGV2LCBkcnVtKQorCisjZGVmaW5lIF9TRVFfRVhURVJOIGV4dGVybgorI2RlZmluZSBTRVFfVVNFX0VYVEJVRigpIFwKKwkJX1NFUV9FWFRFUk4gdW5zaWduZWQgY2hhciBfc2VxYnVmW107IFwKKwkJX1NFUV9FWFRFUk4gaW50IF9zZXFidWZsZW47IF9TRVFfRVhURVJOIGludCBfc2VxYnVmcHRyCisKKyNpZm5kZWYgVVNFX1NJTVBMRV9NQUNST1MKKy8qIFNhbXBsZSBzZXFidWZfZHVtcCgpIGltcGxlbWVudGF0aW9uOgorICoKKyAqCVNFUV9ERUZJTkVCVUYgKDIwNDgpOwktLSBEZWZpbmVzIGEgYnVmZmVyIGZvciAyMDQ4IGJ5dGVzCisgKgorICoJaW50IHNlcWZkOwkJLS0gVGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgL2Rldi9zZXF1ZW5jZXIuCisgKgorICoJdm9pZAorICoJc2VxYnVmX2R1bXAgKCkKKyAqCXsKKyAqCSAgaWYgKF9zZXFidWZwdHIpCisgKgkgICAgaWYgKHdyaXRlIChzZXFmZCwgX3NlcWJ1ZiwgX3NlcWJ1ZnB0cikgPT0gLTEpCisgKgkgICAgICB7CisgKgkJcGVycm9yICgid3JpdGUgL2Rldi9zZXF1ZW5jZXIiKTsKKyAqCQlleGl0ICgtMSk7CisgKgkgICAgICB9CisgKgkgIF9zZXFidWZwdHIgPSAwOworICoJfQorICovCisKKyNkZWZpbmUgU0VRX0RFRklORUJVRihsZW4pCQl1bnNpZ25lZCBjaGFyIF9zZXFidWZbbGVuXTsgaW50IF9zZXFidWZsZW4gPSBsZW47aW50IF9zZXFidWZwdHIgPSAwCisjZGVmaW5lIF9TRVFfTkVFREJVRihsZW4pCQlpZiAoKF9zZXFidWZwdHIrKGxlbikpID4gX3NlcWJ1Zmxlbikgc2VxYnVmX2R1bXAoKQorI2RlZmluZSBfU0VRX0FEVkJVRihsZW4pCQlfc2VxYnVmcHRyICs9IGxlbgorI2RlZmluZSBTRVFfRFVNUEJVRgkJCXNlcWJ1Zl9kdW1wCisjZWxzZQorLyoKKyAqIFRoaXMgdmFyaWF0aW9uIG9mIHRoZSBzZXF1ZW5jZXIgbWFjcm9zIGlzIHVzZWQganVzdCB0byBmb3JtYXQgb25lIGV2ZW50CisgKiB1c2luZyBmaXhlZCBidWZmZXIuCisgKiAKKyAqIFRoZSBwcm9ncmFtIHVzaW5nIHRoZSBtYWNybyBsaWJyYXJ5IG11c3QgZGVmaW5lIHRoZSBmb2xsb3dpbmcgbWFjcm9zIGJlZm9yZQorICogdXNpbmcgdGhpcyBsaWJyYXJ5LgorICoKKyAqICNkZWZpbmUgX3NlcWJ1ZiAJCSBuYW1lIG9mIHRoZSBidWZmZXIgKHVuc2lnbmVkIGNoYXJbXSkgCisgKiAjZGVmaW5lIF9TRVFfQURWQlVGKGxlbikJIElmIHRoZSBhcHBsaWMgbmVlZHMgdG8ga25vdyB0aGUgZXhhY3QKKyAqCQkJCSBzaXplIG9mIHRoZSBldmVudCwgdGhpcyBtYWNybyBjYW4gYmUgdXNlZC4KKyAqCQkJCSBPdGhlcndpc2UgdGhpcyBtdXN0IGJlIGRlZmluZWQgYXMgZW1wdHkuCisgKiAjZGVmaW5lIF9zZXFidWZwdHIJCSBEZWZpbmUgdGhlIG5hbWUgb2YgaW5kZXggdmFyaWFibGUgb3IgMCBpZgorICoJCQkJIG5vdCByZXF1aXJlZC4gCisgKi8KKyNkZWZpbmUgX1NFUV9ORUVEQlVGKGxlbikJLyogZW1wdHkgKi8KKyNlbmRpZgorCisjZGVmaW5lIFNFUV9WT0xVTUVfTU9ERShkZXYsIG1vZGUpCXtfU0VRX05FRURCVUYoOCk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHJdID0gU0VRX0VYVEVOREVEO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzFdID0gU0VRX1ZPTE1PREU7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrMl0gPSAoZGV2KTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0ciszXSA9IChtb2RlKTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cis0XSA9IDA7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrNV0gPSAwO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzZdID0gMDtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cis3XSA9IDA7XAorCQkJCQlfU0VRX0FEVkJVRig4KTt9CisKKy8qCisgKiBNaWRpIHZvaWNlIG1lc3NhZ2VzCisgKi8KKworI2RlZmluZSBfQ0hOX1ZPSUNFKGRldiwgZXZlbnQsIGNobiwgbm90ZSwgcGFybSkgXAorCQkJCQl7X1NFUV9ORUVEQlVGKDgpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyXSA9IEVWX0NITl9WT0lDRTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisxXSA9IChkZXYpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzJdID0gKGV2ZW50KTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0ciszXSA9IChjaG4pO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzRdID0gKG5vdGUpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzVdID0gKHBhcm0pO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzZdID0gKDApO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzddID0gMDtcCisJCQkJCV9TRVFfQURWQlVGKDgpO30KKworI2RlZmluZSBTRVFfU1RBUlRfTk9URShkZXYsIGNobiwgbm90ZSwgdm9sKSBcCisJCV9DSE5fVk9JQ0UoZGV2LCBNSURJX05PVEVPTiwgY2huLCBub3RlLCB2b2wpCisKKyNkZWZpbmUgU0VRX1NUT1BfTk9URShkZXYsIGNobiwgbm90ZSwgdm9sKSBcCisJCV9DSE5fVk9JQ0UoZGV2LCBNSURJX05PVEVPRkYsIGNobiwgbm90ZSwgdm9sKQorCisjZGVmaW5lIFNFUV9LRVlfUFJFU1NVUkUoZGV2LCBjaG4sIG5vdGUsIHByZXNzdXJlKSBcCisJCV9DSE5fVk9JQ0UoZGV2LCBNSURJX0tFWV9QUkVTU1VSRSwgY2huLCBub3RlLCBwcmVzc3VyZSkKKworLyoKKyAqIE1pZGkgY2hhbm5lbCBtZXNzYWdlcworICovCisKKyNkZWZpbmUgX0NITl9DT01NT04oZGV2LCBldmVudCwgY2huLCBwMSwgcDIsIHcxNCkgXAorCQkJCQl7X1NFUV9ORUVEQlVGKDgpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyXSA9IEVWX0NITl9DT01NT047XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrMV0gPSAoZGV2KTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisyXSA9IChldmVudCk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrM10gPSAoY2huKTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cis0XSA9IChwMSk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrNV0gPSAocDIpO1wKKwkJCQkJKihzaG9ydCAqKSZfc2VxYnVmW19zZXFidWZwdHIrNl0gPSAodzE0KTtcCisJCQkJCV9TRVFfQURWQlVGKDgpO30KKy8qCisgKiBTRVFfU1lTRVggcGVybWl0cyBzZW5kaW5nIG9mIHN5c2V4IG1lc3NhZ2VzLiAoSXQgbWF5IGxvb2sgdGhhdCBpdCBwZXJtaXRzCisgKiBzZW5kaW5nIGFueSBNSURJIGJ5dGVzIGJ1dCBpdCdzIGFic29sdXRlbHkgbm90IHBvc3NpYmxlLiBUcnlpbmcgdG8gZG8KKyAqIHNvIF93aWxsXyBjYXVzZSBwcm9ibGVtcyB3aXRoIE1QVTQwMSBpbnRlbGxpZ2VudCBtb2RlKS4KKyAqCisgKiBTeXNleCBtZXNzYWdlcyBhcmUgc2VudCBpbiBibG9ja3Mgb2YgMSB0byA2IGJ5dGVzLiBMb25nZXIgbWVzc2FnZXMgbXVzdCBiZSAKKyAqIHNlbnQgYnkgY2FsbGluZyBTRVFfU1lTRVgoKSBzZXZlcmFsIHRpbWVzICh0aGVyZSBtdXN0IGJlIG5vIG90aGVyIGV2ZW50cworICogYmV0d2VlbiB0aGVtKS4gRmlyc3Qgc3lzZXggZnJhZ21lbnQgbXVzdCBoYXZlIDB4ZjAgaW4gdGhlIGZpcnN0IGJ5dGUKKyAqIGFuZCB0aGUgbGFzdCBieXRlIChidWZbbGVuLTFdIG9mIHRoZSBsYXN0IGZyYWdtZW50IG11c3QgYmUgMHhmNy4gTm8gYnl0ZQorICogYmV0d2VlbiB0aGVzZSBzeXNleCBzdGFydCBhbmQgZW5kIG1hcmtlcnMgY2Fubm90IGJlIGxhcmdlciB0aGFuIDB4N2YuIEFsc28KKyAqIGxlbmd0aHMgb2YgZWFjaCBmcmFnbWVudHMgKGV4Y2VwdCB0aGUgbGFzdCBvbmUpIG11c3QgYmUgNi4KKyAqCisgKiBCcmVha2luZyB0aGUgYWJvdmUgcnVsZXMgbWF5IHdvcmsgd2l0aCBzb21lIE1JREkgcG9ydHMgYnV0IGlzIGxpa2VseSB0bworICogY2F1c2UgZmF0YWwgcHJvYmxlbXMgd2l0aCBzb21lIG90aGVyIGRldmljZXMgKHN1Y2ggYXMgTVBVNDAxKS4KKyAqLworI2RlZmluZSBTRVFfU1lTRVgoZGV2LCBidWYsIGxlbikgXAorCQkJCQl7aW50IGlpLCBsbD0obGVuKTsgXAorCQkJCQkgdW5zaWduZWQgY2hhciAqYnVmcD1idWY7XAorCQkJCQkgaWYgKGxsPjYpbGw9NjtcCisJCQkJCV9TRVFfTkVFREJVRig4KTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cl0gPSBFVl9TWVNFWDtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisxXSA9IChkZXYpO1wKKwkJCQkJZm9yKGlpPTA7aWk8bGw7aWkrKylcCisJCQkJCSAgIF9zZXFidWZbX3NlcWJ1ZnB0citpaSsyXSA9IGJ1ZnBbaWldO1wKKwkJCQkJZm9yKGlpPWxsO2lpPDY7aWkrKylcCisJCQkJCSAgIF9zZXFidWZbX3NlcWJ1ZnB0citpaSsyXSA9IDB4ZmY7XAorCQkJCQlfU0VRX0FEVkJVRig4KTt9CisKKyNkZWZpbmUgU0VRX0NITl9QUkVTU1VSRShkZXYsIGNobiwgcHJlc3N1cmUpIFwKKwkJX0NITl9DT01NT04oZGV2LCBNSURJX0NITl9QUkVTU1VSRSwgY2huLCBwcmVzc3VyZSwgMCwgMCkKKworI2RlZmluZSBTRVFfU0VUX1BBVENIIFNFUV9QR01fQ0hBTkdFCisjZGVmaW5lIFNFUV9QR01fQ0hBTkdFKGRldiwgY2huLCBwYXRjaCkgXAorCQlfQ0hOX0NPTU1PTihkZXYsIE1JRElfUEdNX0NIQU5HRSwgY2huLCBwYXRjaCwgMCwgMCkKKworI2RlZmluZSBTRVFfQ09OVFJPTChkZXYsIGNobiwgY29udHJvbGxlciwgdmFsdWUpIFwKKwkJX0NITl9DT01NT04oZGV2LCBNSURJX0NUTF9DSEFOR0UsIGNobiwgY29udHJvbGxlciwgMCwgdmFsdWUpCisKKyNkZWZpbmUgU0VRX0JFTkRFUihkZXYsIGNobiwgdmFsdWUpIFwKKwkJX0NITl9DT01NT04oZGV2LCBNSURJX1BJVENIX0JFTkQsIGNobiwgMCwgMCwgdmFsdWUpCisKKworI2RlZmluZSBTRVFfVjJfWF9DT05UUk9MKGRldiwgdm9pY2UsIGNvbnRyb2xsZXIsIHZhbHVlKQl7X1NFUV9ORUVEQlVGKDgpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyXSA9IFNFUV9FWFRFTkRFRDtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisxXSA9IFNFUV9DT05UUk9MTEVSO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzJdID0gKGRldik7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrM10gPSAodm9pY2UpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzRdID0gKGNvbnRyb2xsZXIpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzVdID0gKCh2YWx1ZSkmMHhmZik7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrNl0gPSAoKHZhbHVlPj44KSYweGZmKTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cis3XSA9IDA7XAorCQkJCQlfU0VRX0FEVkJVRig4KTt9CisvKgorICogVGhlIGZvbGxvd2luZyA1IG1hY3JvcyBhcmUgaW5jb3JyZWN0bHkgaW1wbGVtZW50ZWQgYW5kIG9ic29sZXRlLgorICogVXNlIFNFUV9CRU5ERVIgYW5kIFNFUV9DT05UUk9MICh3aXRoIHByb3BlciBjb250cm9sbGVyKSBpbnN0ZWFkLgorICovCisjZGVmaW5lIFNFUV9QSVRDSEJFTkQoZGV2LCB2b2ljZSwgdmFsdWUpIFNFUV9WMl9YX0NPTlRST0woZGV2LCB2b2ljZSwgQ1RSTF9QSVRDSF9CRU5ERVIsIHZhbHVlKQorI2RlZmluZSBTRVFfQkVOREVSX1JBTkdFKGRldiwgdm9pY2UsIHZhbHVlKSBTRVFfVjJfWF9DT05UUk9MKGRldiwgdm9pY2UsIENUUkxfUElUQ0hfQkVOREVSX1JBTkdFLCB2YWx1ZSkKKyNkZWZpbmUgU0VRX0VYUFJFU1NJT04oZGV2LCB2b2ljZSwgdmFsdWUpIFNFUV9DT05UUk9MKGRldiwgdm9pY2UsIENUTF9FWFBSRVNTSU9OLCB2YWx1ZSoxMjgpCisjZGVmaW5lIFNFUV9NQUlOX1ZPTFVNRShkZXYsIHZvaWNlLCB2YWx1ZSkgU0VRX0NPTlRST0woZGV2LCB2b2ljZSwgQ1RMX01BSU5fVk9MVU1FLCAodmFsdWUqMTYzODMpLzEwMCkKKyNkZWZpbmUgU0VRX1BBTk5JTkcoZGV2LCB2b2ljZSwgcG9zKSBTRVFfQ09OVFJPTChkZXYsIHZvaWNlLCBDVExfUEFOLCAocG9zKzEyOCkgLyAyKQorCisvKgorICogVGltaW5nIGFuZCBzeW5jaHJvbml6YXRpb24gbWFjcm9zCisgKi8KKworI2RlZmluZSBfVElNRVJfRVZFTlQoZXYsIHBhcm0pCQl7X1NFUV9ORUVEQlVGKDgpO1wKKwkJCQkgCV9zZXFidWZbX3NlcWJ1ZnB0ciswXSA9IEVWX1RJTUlORzsgXAorCQkJCSAJX3NlcWJ1Zltfc2VxYnVmcHRyKzFdID0gKGV2KTsgXAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrMl0gPSAwO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzNdID0gMDtcCisJCQkJIAkqKHVuc2lnbmVkIGludCAqKSZfc2VxYnVmW19zZXFidWZwdHIrNF0gPSAocGFybSk7IFwKKwkJCQkJX1NFUV9BRFZCVUYoOCk7fQorCisjZGVmaW5lIFNFUV9TVEFSVF9USU1FUigpCQlfVElNRVJfRVZFTlQoVE1SX1NUQVJULCAwKQorI2RlZmluZSBTRVFfU1RPUF9USU1FUigpCQlfVElNRVJfRVZFTlQoVE1SX1NUT1AsIDApCisjZGVmaW5lIFNFUV9DT05USU5VRV9USU1FUigpCQlfVElNRVJfRVZFTlQoVE1SX0NPTlRJTlVFLCAwKQorI2RlZmluZSBTRVFfV0FJVF9USU1FKHRpY2tzKQkJX1RJTUVSX0VWRU5UKFRNUl9XQUlUX0FCUywgdGlja3MpCisjZGVmaW5lIFNFUV9ERUxUQV9USU1FKHRpY2tzKQkJX1RJTUVSX0VWRU5UKFRNUl9XQUlUX1JFTCwgdGlja3MpCisjZGVmaW5lIFNFUV9FQ0hPX0JBQ0soa2V5KQkJX1RJTUVSX0VWRU5UKFRNUl9FQ0hPLCBrZXkpCisjZGVmaW5lIFNFUV9TRVRfVEVNUE8odmFsdWUpCQlfVElNRVJfRVZFTlQoVE1SX1RFTVBPLCB2YWx1ZSkKKyNkZWZpbmUgU0VRX1NPTkdQT1MocG9zKQkJX1RJTUVSX0VWRU5UKFRNUl9TUFAsIHBvcykKKyNkZWZpbmUgU0VRX1RJTUVfU0lHTkFUVVJFKHNpZykJCV9USU1FUl9FVkVOVChUTVJfVElNRVNJRywgc2lnKQorCisvKgorICogTG9jYWwgY29udHJvbCBldmVudHMKKyAqLworCisjZGVmaW5lIF9MT0NBTF9FVkVOVChldiwgcGFybSkJCXtfU0VRX05FRURCVUYoOCk7XAorCQkJCSAJX3NlcWJ1Zltfc2VxYnVmcHRyKzBdID0gRVZfU0VRX0xPQ0FMOyBcCisJCQkJIAlfc2VxYnVmW19zZXFidWZwdHIrMV0gPSAoZXYpOyBcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisyXSA9IDA7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrM10gPSAwO1wKKwkJCQkgCSoodW5zaWduZWQgaW50ICopJl9zZXFidWZbX3NlcWJ1ZnB0cis0XSA9IChwYXJtKTsgXAorCQkJCQlfU0VRX0FEVkJVRig4KTt9CisKKyNkZWZpbmUgU0VRX1BMQVlBVURJTyhkZXZtYXNrKQkJX0xPQ0FMX0VWRU5UKExPQ0xfU1RBUlRBVURJTywgZGV2bWFzaykKKy8qCisgKiBFdmVudHMgZm9yIHRoZSBsZXZlbCAxIGludGVyZmFjZSBvbmx5IAorICovCisKKyNkZWZpbmUgU0VRX01JRElPVVQoZGV2aWNlLCBieXRlKQl7X1NFUV9ORUVEQlVGKDQpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyXSA9IFNFUV9NSURJUFVUQztcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisxXSA9IChieXRlKTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisyXSA9IChkZXZpY2UpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzNdID0gMDtcCisJCQkJCV9TRVFfQURWQlVGKDQpO30KKworLyoKKyAqIFBhdGNoIGxvYWRpbmcuCisgKi8KKyNkZWZpbmUgU0VRX1dSUEFUQ0gocGF0Y2h4LCBsZW4pIFwKKwkJe2lmIChfc2VxYnVmcHRyKSBTRVFfRFVNUEJVRigpO1wKKwkJIGlmICh3cml0ZShzZXFmZCwgKGNoYXIqKShwYXRjaHgpLCBsZW4pPT0tMSkgXAorCQkgICAgcGVycm9yKCJXcml0ZSBwYXRjaDogL2Rldi9zZXF1ZW5jZXIiKTt9CisjZGVmaW5lIFNFUV9XUlBBVENIMihwYXRjaHgsIGxlbikgXAorCQkoU0VRX0RVTVBCVUYoKSwgd3JpdGUoc2VxZmQsIChjaGFyKikocGF0Y2h4KSwgbGVuKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NwaS9zcGlkZXYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3BpL3NwaWRldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZDllZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NwaS9zcGlkZXYuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIGluY2x1ZGUvbGludXgvc3BpL3NwaWRldi5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFNXQVBQCisgKglBbmRyZWEgUGF0ZXJuaWFuaSA8YS5wYXRlcm5pYW5pQHN3YXBwLWVuZy5pdD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAgKi8KKworI2lmbmRlZiBTUElERVZfSAorI2RlZmluZSBTUElERVZfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogVXNlciBzcGFjZSB2ZXJzaW9ucyBvZiBrZXJuZWwgc3ltYm9scyBmb3IgU1BJIGNsb2NraW5nIG1vZGVzLAorICogbWF0Y2hpbmcgPGxpbnV4L3NwaS9zcGkuaD4KKyAqLworCisjZGVmaW5lIFNQSV9DUEhBCQkweDAxCisjZGVmaW5lIFNQSV9DUE9MCQkweDAyCisKKyNkZWZpbmUgU1BJX01PREVfMAkJKDB8MCkKKyNkZWZpbmUgU1BJX01PREVfMQkJKDB8U1BJX0NQSEEpCisjZGVmaW5lIFNQSV9NT0RFXzIJCShTUElfQ1BPTHwwKQorI2RlZmluZSBTUElfTU9ERV8zCQkoU1BJX0NQT0x8U1BJX0NQSEEpCisKKyNkZWZpbmUgU1BJX0NTX0hJR0gJCTB4MDQKKyNkZWZpbmUgU1BJX0xTQl9GSVJTVAkJMHgwOAorI2RlZmluZSBTUElfM1dJUkUJCTB4MTAKKyNkZWZpbmUgU1BJX0xPT1AJCTB4MjAKKyNkZWZpbmUgU1BJX05PX0NTCQkweDQwCisjZGVmaW5lIFNQSV9SRUFEWQkJMHg4MAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIElPQ1RMIGNvbW1hbmRzICovCisKKyNkZWZpbmUgU1BJX0lPQ19NQUdJQwkJCSdrJworCisvKioKKyAqIHN0cnVjdCBzcGlfaW9jX3RyYW5zZmVyIC0gZGVzY3JpYmVzIGEgc2luZ2xlIFNQSSB0cmFuc2ZlcgorICogQHR4X2J1ZjogSG9sZHMgcG9pbnRlciB0byB1c2Vyc3BhY2UgYnVmZmVyIHdpdGggdHJhbnNtaXQgZGF0YSwgb3IgbnVsbC4KKyAqCUlmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHplcm9lcyBhcmUgc2hpZnRlZCBvdXQuCisgKiBAcnhfYnVmOiBIb2xkcyBwb2ludGVyIHRvIHVzZXJzcGFjZSBidWZmZXIgZm9yIHJlY2VpdmUgZGF0YSwgb3IgbnVsbC4KKyAqIEBsZW46IExlbmd0aCBvZiB0eCBhbmQgcnggYnVmZmVycywgaW4gYnl0ZXMuCisgKiBAc3BlZWRfaHo6IFRlbXBvcmFyeSBvdmVycmlkZSBvZiB0aGUgZGV2aWNlJ3MgYml0cmF0ZS4KKyAqIEBiaXRzX3Blcl93b3JkOiBUZW1wb3Jhcnkgb3ZlcnJpZGUgb2YgdGhlIGRldmljZSdzIHdvcmRzaXplLgorICogQGRlbGF5X3VzZWNzOiBJZiBub256ZXJvLCBob3cgbG9uZyB0byBkZWxheSBhZnRlciB0aGUgbGFzdCBiaXQgdHJhbnNmZXIKKyAqCWJlZm9yZSBvcHRpb25hbGx5IGRlc2VsZWN0aW5nIHRoZSBkZXZpY2UgYmVmb3JlIHRoZSBuZXh0IHRyYW5zZmVyLgorICogQGNzX2NoYW5nZTogVHJ1ZSB0byBkZXNlbGVjdCBkZXZpY2UgYmVmb3JlIHN0YXJ0aW5nIHRoZSBuZXh0IHRyYW5zZmVyLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIG1hcHBlZCBkaXJlY3RseSB0byB0aGUga2VybmVsIHNwaV90cmFuc2ZlciBzdHJ1Y3R1cmU7CisgKiB0aGUgZmllbGRzIGhhdmUgdGhlIHNhbWUgbWVhbmluZ3MsIGV4Y2VwdCBvZiBjb3Vyc2UgdGhhdCB0aGUgcG9pbnRlcnMKKyAqIGFyZSBpbiBhIGRpZmZlcmVudCBhZGRyZXNzIHNwYWNlIChhbmQgbWF5IGJlIG9mIGRpZmZlcmVudCBzaXplcyBpbiBzb21lCisgKiBjYXNlcywgc3VjaCBhcyAzMi1iaXQgaTM4NiB1c2Vyc3BhY2Ugb3ZlciBhIDY0LWJpdCB4ODZfNjQga2VybmVsKS4KKyAqIFplcm8taW5pdGlhbGl6ZSB0aGUgc3RydWN0dXJlLCBpbmNsdWRpbmcgY3VycmVudGx5IHVudXNlZCBmaWVsZHMsIHRvCisgKiBhY2NvbW1vZGF0ZSBwb3RlbnRpYWwgZnV0dXJlIHVwZGF0ZXMuCisgKgorICogU1BJX0lPQ19NRVNTQUdFIGdpdmVzIHVzZXJzcGFjZSB0aGUgZXF1aXZhbGVudCBvZiBrZXJuZWwgc3BpX3N5bmMoKS4KKyAqIFBhc3MgaXQgYW4gYXJyYXkgb2YgcmVsYXRlZCB0cmFuc2ZlcnMsIHRoZXknbGwgZXhlY3V0ZSB0b2dldGhlci4KKyAqIEVhY2ggdHJhbnNmZXIgbWF5IGJlIGhhbGYgZHVwbGV4IChlaXRoZXIgZGlyZWN0aW9uKSBvciBmdWxsIGR1cGxleC4KKyAqCisgKglzdHJ1Y3Qgc3BpX2lvY190cmFuc2ZlciBtZXNnWzRdOworICoJLi4uCisgKglzdGF0dXMgPSBpb2N0bChmZCwgU1BJX0lPQ19NRVNTQUdFKDQpLCBtZXNnKTsKKyAqCisgKiBTbyBmb3IgZXhhbXBsZSBvbmUgdHJhbnNmZXIgbWlnaHQgc2VuZCBhIG5pbmUgYml0IGNvbW1hbmQgKHJpZ2h0IGFsaWduZWQKKyAqIGluIGEgMTYtYml0IHdvcmQpLCB0aGUgbmV4dCBjb3VsZCByZWFkIGEgYmxvY2sgb2YgOC1iaXQgZGF0YSBiZWZvcmUKKyAqIHRlcm1pbmF0aW5nIHRoYXQgY29tbWFuZCBieSB0ZW1wb3JhcmlseSBkZXNlbGVjdGluZyB0aGUgY2hpcDsgdGhlIG5leHQKKyAqIGNvdWxkIHNlbmQgYSBkaWZmZXJlbnQgbmluZSBiaXQgY29tbWFuZCAocmUtc2VsZWN0aW5nIHRoZSBjaGlwKSwgYW5kIHRoZQorICogbGFzdCB0cmFuc2ZlciBtaWdodCB3cml0ZSBzb21lIHJlZ2lzdGVyIHZhbHVlcy4KKyAqLworc3RydWN0IHNwaV9pb2NfdHJhbnNmZXIgeworCV9fdTY0CQl0eF9idWY7CisJX191NjQJCXJ4X2J1ZjsKKworCV9fdTMyCQlsZW47CisJX191MzIJCXNwZWVkX2h6OworCisJX191MTYJCWRlbGF5X3VzZWNzOworCV9fdTgJCWJpdHNfcGVyX3dvcmQ7CisJX191OAkJY3NfY2hhbmdlOworCV9fdTMyCQlwYWQ7CisKKwkvKiBJZiB0aGUgY29udGVudHMgb2YgJ3N0cnVjdCBzcGlfaW9jX3RyYW5zZmVyJyBldmVyIGNoYW5nZQorCSAqIGluY29tcGF0aWJseSwgdGhlbiB0aGUgaW9jdGwgbnVtYmVyIChjdXJyZW50bHkgMCkgbXVzdCBjaGFuZ2U7CisJICogaW9jdGxzIHdpdGggY29uc3RhbnQgc2l6ZSBmaWVsZHMgZ2V0IGEgYml0IG1vcmUgaW4gdGhlIHdheSBvZgorCSAqIGVycm9yIGNoZWNraW5nIHRoYW4gb25lcyAobGlrZSB0aGlzKSB3aGVyZSB0aGF0IGZpZWxkIHZhcmllcy4KKwkgKgorCSAqIE5PVEU6IHN0cnVjdCBsYXlvdXQgaXMgdGhlIHNhbWUgaW4gNjRiaXQgYW5kIDMyYml0IHVzZXJzcGFjZS4KKwkgKi8KK307CisKKy8qIG5vdCBhbGwgcGxhdGZvcm1zIHVzZSA8YXNtLWdlbmVyaWMvaW9jdGwuaD4gb3IgX0lPQ19UWVBFQ0hFQ0soKSAuLi4gKi8KKyNkZWZpbmUgU1BJX01TR1NJWkUoTikgXAorCSgoKChOKSooc2l6ZW9mIChzdHJ1Y3Qgc3BpX2lvY190cmFuc2ZlcikpKSA8ICgxIDw8IF9JT0NfU0laRUJJVFMpKSBcCisJCT8gKChOKSooc2l6ZW9mIChzdHJ1Y3Qgc3BpX2lvY190cmFuc2ZlcikpKSA6IDApCisjZGVmaW5lIFNQSV9JT0NfTUVTU0FHRShOKSBfSU9XKFNQSV9JT0NfTUFHSUMsIDAsIGNoYXJbU1BJX01TR1NJWkUoTildKQorCisKKy8qIFJlYWQgLyBXcml0ZSBvZiBTUEkgbW9kZSAoU1BJX01PREVfMC4uU1BJX01PREVfMykgKi8KKyNkZWZpbmUgU1BJX0lPQ19SRF9NT0RFCQkJX0lPUihTUElfSU9DX01BR0lDLCAxLCBfX3U4KQorI2RlZmluZSBTUElfSU9DX1dSX01PREUJCQlfSU9XKFNQSV9JT0NfTUFHSUMsIDEsIF9fdTgpCisKKy8qIFJlYWQgLyBXcml0ZSBTUEkgYml0IGp1c3RpZmljYXRpb24gKi8KKyNkZWZpbmUgU1BJX0lPQ19SRF9MU0JfRklSU1QJCV9JT1IoU1BJX0lPQ19NQUdJQywgMiwgX191OCkKKyNkZWZpbmUgU1BJX0lPQ19XUl9MU0JfRklSU1QJCV9JT1coU1BJX0lPQ19NQUdJQywgMiwgX191OCkKKworLyogUmVhZCAvIFdyaXRlIFNQSSBkZXZpY2Ugd29yZCBsZW5ndGggKDEuLk4pICovCisjZGVmaW5lIFNQSV9JT0NfUkRfQklUU19QRVJfV09SRAlfSU9SKFNQSV9JT0NfTUFHSUMsIDMsIF9fdTgpCisjZGVmaW5lIFNQSV9JT0NfV1JfQklUU19QRVJfV09SRAlfSU9XKFNQSV9JT0NfTUFHSUMsIDMsIF9fdTgpCisKKy8qIFJlYWQgLyBXcml0ZSBTUEkgZGV2aWNlIGRlZmF1bHQgbWF4IHNwZWVkIGh6ICovCisjZGVmaW5lIFNQSV9JT0NfUkRfTUFYX1NQRUVEX0haCQlfSU9SKFNQSV9JT0NfTUFHSUMsIDQsIF9fdTMyKQorI2RlZmluZSBTUElfSU9DX1dSX01BWF9TUEVFRF9IWgkJX0lPVyhTUElfSU9DX01BR0lDLCA0LCBfX3UzMikKKworCisKKyNlbmRpZiAvKiBTUElERVZfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zdGF0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTlmMDM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zdGF0LmgKQEAgLTAsMCArMSw0NSBAQAorI2lmbmRlZiBfTElOVVhfU1RBVF9ICisjZGVmaW5lIF9MSU5VWF9TVEFUX0gKKworCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCAhZGVmaW5lZChfX0dMSUJDX18pIHx8IChfX0dMSUJDX18gPCAyKQorCisjZGVmaW5lIFNfSUZNVCAgMDAxNzAwMDAKKyNkZWZpbmUgU19JRlNPQ0sgMDE0MDAwMAorI2RlZmluZSBTX0lGTE5LCSAwMTIwMDAwCisjZGVmaW5lIFNfSUZSRUcgIDAxMDAwMDAKKyNkZWZpbmUgU19JRkJMSyAgMDA2MDAwMAorI2RlZmluZSBTX0lGRElSICAwMDQwMDAwCisjZGVmaW5lIFNfSUZDSFIgIDAwMjAwMDAKKyNkZWZpbmUgU19JRklGTyAgMDAxMDAwMAorI2RlZmluZSBTX0lTVUlEICAwMDA0MDAwCisjZGVmaW5lIFNfSVNHSUQgIDAwMDIwMDAKKyNkZWZpbmUgU19JU1ZUWCAgMDAwMTAwMAorCisjZGVmaW5lIFNfSVNMTksobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZMTkspCisjZGVmaW5lIFNfSVNSRUcobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZSRUcpCisjZGVmaW5lIFNfSVNESVIobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZESVIpCisjZGVmaW5lIFNfSVNDSFIobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZDSFIpCisjZGVmaW5lIFNfSVNCTEsobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZCTEspCisjZGVmaW5lIFNfSVNGSUZPKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGSUZPKQorI2RlZmluZSBTX0lTU09DSyhtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRlNPQ0spCisKKyNkZWZpbmUgU19JUldYVSAwMDcwMAorI2RlZmluZSBTX0lSVVNSIDAwNDAwCisjZGVmaW5lIFNfSVdVU1IgMDAyMDAKKyNkZWZpbmUgU19JWFVTUiAwMDEwMAorCisjZGVmaW5lIFNfSVJXWEcgMDAwNzAKKyNkZWZpbmUgU19JUkdSUCAwMDA0MAorI2RlZmluZSBTX0lXR1JQIDAwMDIwCisjZGVmaW5lIFNfSVhHUlAgMDAwMTAKKworI2RlZmluZSBTX0lSV1hPIDAwMDA3CisjZGVmaW5lIFNfSVJPVEggMDAwMDQKKyNkZWZpbmUgU19JV09USCAwMDAwMgorI2RlZmluZSBTX0lYT1RIIDAwMDAxCisKKyNlbmRpZgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zdGRkZWYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3RkZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyY2UxYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3RkZGVmLmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfTElOVVhfU1REREVGX0gKKyNkZWZpbmUgX0xJTlVYX1NURERFRl9ICisKKworCisjdW5kZWYgTlVMTAorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIE5VTEwgMAorI2Vsc2UKKyNkZWZpbmUgTlVMTCAoKHZvaWQgKikwKQorI2VuZGlmCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N0cmluZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2VkODQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zdHJpbmcuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgX0xJTlVYX1NUUklOR19IXworI2RlZmluZSBfTElOVVhfU1RSSU5HX0hfCisKKy8qIFdlIGRvbid0IHdhbnQgc3RyaW5ncy5oIHN0dWZmIGJlaW5nIHVzZWQgYnkgdXNlciBzdHVmZiBieSBhY2NpZGVudCAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYgLyogX0xJTlVYX1NUUklOR19IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zdW5ycGMvZGVidWcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3VucnBjL2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhZDMxOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3VucnBjL2RlYnVnLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIGxpbnV4L2luY2x1ZGUvbGludXgvc3VucnBjL2RlYnVnLmgKKyAqCisgKiBEZWJ1Z2dpbmcgc3VwcG9ydCBmb3Igc3VucnBjIG1vZHVsZQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2lmbmRlZiBfTElOVVhfU1VOUlBDX0RFQlVHX0hfCisjZGVmaW5lIF9MSU5VWF9TVU5SUENfREVCVUdfSF8KKworLyoKKyAqIFJQQyBkZWJ1ZyBmYWNpbGl0aWVzCisgKi8KKyNkZWZpbmUgUlBDREJHX1hQUlQJCTB4MDAwMQorI2RlZmluZSBSUENEQkdfQ0FMTAkJMHgwMDAyCisjZGVmaW5lIFJQQ0RCR19ERUJVRwkJMHgwMDA0CisjZGVmaW5lIFJQQ0RCR19ORlMJCTB4MDAwOAorI2RlZmluZSBSUENEQkdfQVVUSAkJMHgwMDEwCisjZGVmaW5lIFJQQ0RCR19CSU5ECQkweDAwMjAKKyNkZWZpbmUgUlBDREJHX1NDSEVECQkweDAwNDAKKyNkZWZpbmUgUlBDREJHX1RSQU5TCQkweDAwODAKKyNkZWZpbmUgUlBDREJHX1NWQ1hQUlQJCTB4MDEwMAorI2RlZmluZSBSUENEQkdfU1ZDRFNQCQkweDAyMDAKKyNkZWZpbmUgUlBDREJHX01JU0MJCTB4MDQwMAorI2RlZmluZSBSUENEQkdfQ0FDSEUJCTB4MDgwMAorI2RlZmluZSBSUENEQkdfQUxMCQkweDdmZmYKKworCisvKgorICogRGVjbGFyYXRpb25zIGZvciB0aGUgc3lzY3RsIGRlYnVnIGludGVyZmFjZSwgd2hpY2ggYWxsb3dzIHRvIHJlYWQgb3IKKyAqIGNoYW5nZSB0aGUgZGVidWcgZmxhZ3MgZm9yIHJwYywgbmZzLCBuZnNkLCBhbmQgbG9ja2QuIFNpbmNlIHRoZSBzdW5ycGMKKyAqIG1vZHVsZSBjdXJyZW50bHkgcmVnaXN0ZXJzIGl0cyBzeXNjdGwgdGFibGUgZHluYW1pY2FsbHksIHRoZSBzeXNjdGwgcGF0aAorICogZm9yIG1vZHVsZSBGT08gaXMgPENUTF9TVU5SUEMsIENUTF9GT09ERUJVRz4uCisgKi8KKworZW51bSB7CisJQ1RMX1JQQ0RFQlVHID0gMSwKKwlDVExfTkZTREVCVUcsCisJQ1RMX05GU0RERUJVRywKKwlDVExfTkxNREVCVUcsCisJQ1RMX1NMT1RUQUJMRV9VRFAsCisJQ1RMX1NMT1RUQUJMRV9UQ1AsCisJQ1RMX01JTl9SRVNWUE9SVCwKKwlDVExfTUFYX1JFU1ZQT1JULAorfTsKKworI2VuZGlmIC8qIF9MSU5VWF9TVU5SUENfREVCVUdfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3VzcGVuZF9pb2N0bHMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3VzcGVuZF9pb2N0bHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjMwMzgyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zdXNwZW5kX2lvY3Rscy5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgX0xJTlVYX1NVU1BFTkRfSU9DVExTX0gKKyNkZWZpbmUgX0xJTlVYX1NVU1BFTkRfSU9DVExTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBwYXNzIHRoZSB2YWx1ZXMgbmVlZGVkIGZvciB0aGUgaWRlbnRpZmljYXRpb24KKyAqIG9mIHRoZSByZXN1bWUgc3dhcCBhcmVhIGZyb20gYSB1c2VyIHNwYWNlIHRvIHRoZSBrZXJuZWwgdmlhIHRoZQorICogU05BUFNIT1RfU0VUX1NXQVBfQVJFQSBpb2N0bAorICovCitzdHJ1Y3QgcmVzdW1lX3N3YXBfYXJlYSB7CisJX19rZXJuZWxfbG9mZl90IG9mZnNldDsKKwlfX3UzMiBkZXY7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIFNOQVBTSE9UX0lPQ19NQUdJQwknMycKKyNkZWZpbmUgU05BUFNIT1RfRlJFRVpFCQkJX0lPKFNOQVBTSE9UX0lPQ19NQUdJQywgMSkKKyNkZWZpbmUgU05BUFNIT1RfVU5GUkVFWkUJCV9JTyhTTkFQU0hPVF9JT0NfTUFHSUMsIDIpCisjZGVmaW5lIFNOQVBTSE9UX0FUT01JQ19SRVNUT1JFCQlfSU8oU05BUFNIT1RfSU9DX01BR0lDLCA0KQorI2RlZmluZSBTTkFQU0hPVF9GUkVFCQkJX0lPKFNOQVBTSE9UX0lPQ19NQUdJQywgNSkKKyNkZWZpbmUgU05BUFNIT1RfRlJFRV9TV0FQX1BBR0VTCV9JTyhTTkFQU0hPVF9JT0NfTUFHSUMsIDkpCisjZGVmaW5lIFNOQVBTSE9UX1MyUkFNCQkJX0lPKFNOQVBTSE9UX0lPQ19NQUdJQywgMTEpCisjZGVmaW5lIFNOQVBTSE9UX1NFVF9TV0FQX0FSRUEJCV9JT1coU05BUFNIT1RfSU9DX01BR0lDLCAxMywgXAorCQkJCQkJCXN0cnVjdCByZXN1bWVfc3dhcF9hcmVhKQorI2RlZmluZSBTTkFQU0hPVF9HRVRfSU1BR0VfU0laRQkJX0lPUihTTkFQU0hPVF9JT0NfTUFHSUMsIDE0LCBfX2tlcm5lbF9sb2ZmX3QpCisjZGVmaW5lIFNOQVBTSE9UX1BMQVRGT1JNX1NVUFBPUlQJX0lPKFNOQVBTSE9UX0lPQ19NQUdJQywgMTUpCisjZGVmaW5lIFNOQVBTSE9UX1BPV0VSX09GRgkJX0lPKFNOQVBTSE9UX0lPQ19NQUdJQywgMTYpCisjZGVmaW5lIFNOQVBTSE9UX0NSRUFURV9JTUFHRQkJX0lPVyhTTkFQU0hPVF9JT0NfTUFHSUMsIDE3LCBpbnQpCisjZGVmaW5lIFNOQVBTSE9UX1BSRUZfSU1BR0VfU0laRQlfSU8oU05BUFNIT1RfSU9DX01BR0lDLCAxOCkKKyNkZWZpbmUgU05BUFNIT1RfQVZBSUxfU1dBUF9TSVpFCV9JT1IoU05BUFNIT1RfSU9DX01BR0lDLCAxOSwgX19rZXJuZWxfbG9mZl90KQorI2RlZmluZSBTTkFQU0hPVF9BTExPQ19TV0FQX1BBR0UJX0lPUihTTkFQU0hPVF9JT0NfTUFHSUMsIDIwLCBfX2tlcm5lbF9sb2ZmX3QpCisjZGVmaW5lIFNOQVBTSE9UX0lPQ19NQVhOUgkyMAorCisjZW5kaWYgLyogX0xJTlVYX1NVU1BFTkRfSU9DVExTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3dhYi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE0YWZkZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3dhYi5oCkBAIC0wLDAgKzEsMjgyIEBACisjaWZuZGVmIF9MSU5VWF9TV0FCX0gKKyNkZWZpbmUgX0xJTlVYX1NXQUJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9zd2FiLmg+CisKKy8qCisgKiBjYXN0cyBhcmUgbmVjZXNzYXJ5IGZvciBjb25zdGFudHMsIGJlY2F1c2Ugd2UgbmV2ZXIga25vdyBob3cgZm9yIHN1cmUKKyAqIGhvdyBVL1VML1VMTCBtYXAgdG8gX191MTYsIF9fdTMyLCBfX3U2NC4gQXQgbGVhc3Qgbm90IGluIGEgcG9ydGFibGUgd2F5LgorICovCisjZGVmaW5lIF9fX2NvbnN0YW50X3N3YWIxNih4KSAoKF9fdTE2KSgJCQkJXAorCSgoKF9fdTE2KSh4KSAmIChfX3UxNikweDAwZmZVKSA8PCA4KSB8CQkJXAorCSgoKF9fdTE2KSh4KSAmIChfX3UxNikweGZmMDBVKSA+PiA4KSkpCisKKyNkZWZpbmUgX19fY29uc3RhbnRfc3dhYjMyKHgpICgoX191MzIpKAkJCQlcCisJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4MDAwMDAwZmZVTCkgPDwgMjQpIHwJCVwKKwkoKChfX3UzMikoeCkgJiAoX191MzIpMHgwMDAwZmYwMFVMKSA8PCAgOCkgfAkJXAorCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweDAwZmYwMDAwVUwpID4+ICA4KSB8CQlcCisJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4ZmYwMDAwMDBVTCkgPj4gMjQpKSkKKworI2RlZmluZSBfX19jb25zdGFudF9zd2FiNjQoeCkgKChfX3U2NCkoCQkJCVwKKwkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMDAwMDAwMGZmVUxMKSA8PCA1NikgfAlcCisJKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDAwMDAwZmYwMFVMTCkgPDwgNDApIHwJXAorCSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwMDAwMDAwMDBmZjAwMDBVTEwpIDw8IDI0KSB8CVwKKwkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMGZmMDAwMDAwVUxMKSA8PCAgOCkgfAlcCisJKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwZmYwMDAwMDAwMFVMTCkgPj4gIDgpIHwJXAorCSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwMDBmZjAwMDAwMDAwMDBVTEwpID4+IDI0KSB8CVwKKwkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMGZmMDAwMDAwMDAwMDAwVUxMKSA+PiA0MCkgfAlcCisJKCgoX191NjQpKHgpICYgKF9fdTY0KTB4ZmYwMDAwMDAwMDAwMDAwMFVMTCkgPj4gNTYpKSkKKworI2RlZmluZSBfX19jb25zdGFudF9zd2FodzMyKHgpICgoX191MzIpKAkJCVwKKwkoKChfX3UzMikoeCkgJiAoX191MzIpMHgwMDAwZmZmZlVMKSA8PCAxNikgfAkJXAorCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweGZmZmYwMDAwVUwpID4+IDE2KSkpCisKKyNkZWZpbmUgX19fY29uc3RhbnRfc3dhaGIzMih4KSAoKF9fdTMyKSgJCQlcCisJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4MDBmZjAwZmZVTCkgPDwgOCkgfAkJXAorCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweGZmMDBmZjAwVUwpID4+IDgpKSkKKworLyoKKyAqIEltcGxlbWVudCB0aGUgZm9sbG93aW5nIGFzIGlubGluZXMsIGJ1dCBkZWZpbmUgdGhlIGludGVyZmFjZSB1c2luZworICogbWFjcm9zIHRvIGFsbG93IGNvbnN0YW50IGZvbGRpbmcgd2hlbiBwb3NzaWJsZToKKyAqIF9fX3N3YWIxNiwgX19fc3dhYjMyLCBfX19zd2FiNjQsIF9fX3N3YWh3MzIsIF9fX3N3YWhiMzIKKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyBfX3UxNiBfX2Zzd2FiMTYoX191MTYgdmFsKQoreworI2lmZGVmIF9fYXJjaF9zd2FiMTYKKwlyZXR1cm4gX19hcmNoX3N3YWIxNih2YWwpOworI2Vsc2UKKwlyZXR1cm4gX19fY29uc3RhbnRfc3dhYjE2KHZhbCk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gX191MzIgX19mc3dhYjMyKF9fdTMyIHZhbCkKK3sKKyNpZmRlZiBfX2FyY2hfc3dhYjMyCisJcmV0dXJuIF9fYXJjaF9zd2FiMzIodmFsKTsKKyNlbHNlCisJcmV0dXJuIF9fX2NvbnN0YW50X3N3YWIzMih2YWwpOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTY0IF9fZnN3YWI2NChfX3U2NCB2YWwpCit7CisjaWZkZWYgX19hcmNoX3N3YWI2NAorCXJldHVybiBfX2FyY2hfc3dhYjY0KHZhbCk7CisjZWxpZiBkZWZpbmVkKF9fU1dBQl82NF9USFJVXzMyX18pCisJX191MzIgaCA9IHZhbCA+PiAzMjsKKwlfX3UzMiBsID0gdmFsICYgKCgxVUxMIDw8IDMyKSAtIDEpOworCXJldHVybiAoKChfX3U2NClfX2Zzd2FiMzIobCkpIDw8IDMyKSB8ICgoX191NjQpKF9fZnN3YWIzMihoKSkpOworI2Vsc2UKKwlyZXR1cm4gX19fY29uc3RhbnRfc3dhYjY0KHZhbCk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gX191MzIgX19mc3dhaHczMihfX3UzMiB2YWwpCit7CisjaWZkZWYgX19hcmNoX3N3YWh3MzIKKwlyZXR1cm4gX19hcmNoX3N3YWh3MzIodmFsKTsKKyNlbHNlCisJcmV0dXJuIF9fX2NvbnN0YW50X3N3YWh3MzIodmFsKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBfX2Zzd2FoYjMyKF9fdTMyIHZhbCkKK3sKKyNpZmRlZiBfX2FyY2hfc3dhaGIzMgorCXJldHVybiBfX2FyY2hfc3dhaGIzMih2YWwpOworI2Vsc2UKKwlyZXR1cm4gX19fY29uc3RhbnRfc3dhaGIzMih2YWwpOworI2VuZGlmCit9CisKKy8qKgorICogX19zd2FiMTYgLSByZXR1cm4gYSBieXRlc3dhcHBlZCAxNi1iaXQgdmFsdWUKKyAqIEB4OiB2YWx1ZSB0byBieXRlc3dhcAorICovCisjZGVmaW5lIF9fc3dhYjE2KHgpCQkJCVwKKwkoX19idWlsdGluX2NvbnN0YW50X3AoKF9fdTE2KSh4KSkgPwlcCisJX19fY29uc3RhbnRfc3dhYjE2KHgpIDoJCQlcCisJX19mc3dhYjE2KHgpKQorCisvKioKKyAqIF9fc3dhYjMyIC0gcmV0dXJuIGEgYnl0ZXN3YXBwZWQgMzItYml0IHZhbHVlCisgKiBAeDogdmFsdWUgdG8gYnl0ZXN3YXAKKyAqLworI2RlZmluZSBfX3N3YWIzMih4KQkJCQlcCisJKF9fYnVpbHRpbl9jb25zdGFudF9wKChfX3UzMikoeCkpID8JXAorCV9fX2NvbnN0YW50X3N3YWIzMih4KSA6CQkJXAorCV9fZnN3YWIzMih4KSkKKworLyoqCisgKiBfX3N3YWI2NCAtIHJldHVybiBhIGJ5dGVzd2FwcGVkIDY0LWJpdCB2YWx1ZQorICogQHg6IHZhbHVlIHRvIGJ5dGVzd2FwCisgKi8KKyNkZWZpbmUgX19zd2FiNjQoeCkJCQkJXAorCShfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191NjQpKHgpKSA/CVwKKwlfX19jb25zdGFudF9zd2FiNjQoeCkgOgkJCVwKKwlfX2Zzd2FiNjQoeCkpCisKKy8qKgorICogX19zd2FodzMyIC0gcmV0dXJuIGEgd29yZC1zd2FwcGVkIDMyLWJpdCB2YWx1ZQorICogQHg6IHZhbHVlIHRvIHdvcmRzd2FwCisgKgorICogX19zd2FodzMyKDB4MTIzNDAwMDApIGlzIDB4MDAwMDEyMzQKKyAqLworI2RlZmluZSBfX3N3YWh3MzIoeCkJCQkJXAorCShfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191MzIpKHgpKSA/CVwKKwlfX19jb25zdGFudF9zd2FodzMyKHgpIDoJCVwKKwlfX2Zzd2FodzMyKHgpKQorCisvKioKKyAqIF9fc3dhaGIzMiAtIHJldHVybiBhIGhpZ2ggYW5kIGxvdyBieXRlLXN3YXBwZWQgMzItYml0IHZhbHVlCisgKiBAeDogdmFsdWUgdG8gYnl0ZXN3YXAKKyAqCisgKiBfX3N3YWhiMzIoMHgxMjM0NTY3OCkgaXMgMHgzNDEyNzg1NgorICovCisjZGVmaW5lIF9fc3dhaGIzMih4KQkJCQlcCisJKF9fYnVpbHRpbl9jb25zdGFudF9wKChfX3UzMikoeCkpID8JXAorCV9fX2NvbnN0YW50X3N3YWhiMzIoeCkgOgkJXAorCV9fZnN3YWhiMzIoeCkpCisKKy8qKgorICogX19zd2FiMTZwIC0gcmV0dXJuIGEgYnl0ZXN3YXBwZWQgMTYtYml0IHZhbHVlIGZyb20gYSBwb2ludGVyCisgKiBAcDogcG9pbnRlciB0byBhIG5hdHVyYWxseS1hbGlnbmVkIDE2LWJpdCB2YWx1ZQorICovCitzdGF0aWMgX19pbmxpbmVfXyBfX3UxNiBfX3N3YWIxNnAoY29uc3QgX191MTYgKnApCit7CisjaWZkZWYgX19hcmNoX3N3YWIxNnAKKwlyZXR1cm4gX19hcmNoX3N3YWIxNnAocCk7CisjZWxzZQorCXJldHVybiBfX3N3YWIxNigqcCk7CisjZW5kaWYKK30KKworLyoqCisgKiBfX3N3YWIzMnAgLSByZXR1cm4gYSBieXRlc3dhcHBlZCAzMi1iaXQgdmFsdWUgZnJvbSBhIHBvaW50ZXIKKyAqIEBwOiBwb2ludGVyIHRvIGEgbmF0dXJhbGx5LWFsaWduZWQgMzItYml0IHZhbHVlCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIF9fdTMyIF9fc3dhYjMycChjb25zdCBfX3UzMiAqcCkKK3sKKyNpZmRlZiBfX2FyY2hfc3dhYjMycAorCXJldHVybiBfX2FyY2hfc3dhYjMycChwKTsKKyNlbHNlCisJcmV0dXJuIF9fc3dhYjMyKCpwKTsKKyNlbmRpZgorfQorCisvKioKKyAqIF9fc3dhYjY0cCAtIHJldHVybiBhIGJ5dGVzd2FwcGVkIDY0LWJpdCB2YWx1ZSBmcm9tIGEgcG9pbnRlcgorICogQHA6IHBvaW50ZXIgdG8gYSBuYXR1cmFsbHktYWxpZ25lZCA2NC1iaXQgdmFsdWUKKyAqLworc3RhdGljIF9faW5saW5lX18gX191NjQgX19zd2FiNjRwKGNvbnN0IF9fdTY0ICpwKQoreworI2lmZGVmIF9fYXJjaF9zd2FiNjRwCisJcmV0dXJuIF9fYXJjaF9zd2FiNjRwKHApOworI2Vsc2UKKwlyZXR1cm4gX19zd2FiNjQoKnApOworI2VuZGlmCit9CisKKy8qKgorICogX19zd2FodzMycCAtIHJldHVybiBhIHdvcmRzd2FwcGVkIDMyLWJpdCB2YWx1ZSBmcm9tIGEgcG9pbnRlcgorICogQHA6IHBvaW50ZXIgdG8gYSBuYXR1cmFsbHktYWxpZ25lZCAzMi1iaXQgdmFsdWUKKyAqCisgKiBTZWUgX19zd2FodzMyKCkgZm9yIGRldGFpbHMgb2Ygd29yZHN3YXBwaW5nLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBfX3N3YWh3MzJwKGNvbnN0IF9fdTMyICpwKQoreworI2lmZGVmIF9fYXJjaF9zd2FodzMycAorCXJldHVybiBfX2FyY2hfc3dhaHczMnAocCk7CisjZWxzZQorCXJldHVybiBfX3N3YWh3MzIoKnApOworI2VuZGlmCit9CisKKy8qKgorICogX19zd2FoYjMycCAtIHJldHVybiBhIGhpZ2ggYW5kIGxvdyBieXRlc3dhcHBlZCAzMi1iaXQgdmFsdWUgZnJvbSBhIHBvaW50ZXIKKyAqIEBwOiBwb2ludGVyIHRvIGEgbmF0dXJhbGx5LWFsaWduZWQgMzItYml0IHZhbHVlCisgKgorICogU2VlIF9fc3dhaGIzMigpIGZvciBkZXRhaWxzIG9mIGhpZ2gvbG93IGJ5dGVzd2FwcGluZy4KKyAqLworc3RhdGljIF9faW5saW5lX18gX191MzIgX19zd2FoYjMycChjb25zdCBfX3UzMiAqcCkKK3sKKyNpZmRlZiBfX2FyY2hfc3dhaGIzMnAKKwlyZXR1cm4gX19hcmNoX3N3YWhiMzJwKHApOworI2Vsc2UKKwlyZXR1cm4gX19zd2FoYjMyKCpwKTsKKyNlbmRpZgorfQorCisvKioKKyAqIF9fc3dhYjE2cyAtIGJ5dGVzd2FwIGEgMTYtYml0IHZhbHVlIGluLXBsYWNlCisgKiBAcDogcG9pbnRlciB0byBhIG5hdHVyYWxseS1hbGlnbmVkIDE2LWJpdCB2YWx1ZQorICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fc3dhYjE2cyhfX3UxNiAqcCkKK3sKKyNpZmRlZiBfX2FyY2hfc3dhYjE2cworCV9fYXJjaF9zd2FiMTZzKHApOworI2Vsc2UKKwkqcCA9IF9fc3dhYjE2cChwKTsKKyNlbmRpZgorfQorLyoqCisgKiBfX3N3YWIzMnMgLSBieXRlc3dhcCBhIDMyLWJpdCB2YWx1ZSBpbi1wbGFjZQorICogQHA6IHBvaW50ZXIgdG8gYSBuYXR1cmFsbHktYWxpZ25lZCAzMi1iaXQgdmFsdWUKKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3N3YWIzMnMoX191MzIgKnApCit7CisjaWZkZWYgX19hcmNoX3N3YWIzMnMKKwlfX2FyY2hfc3dhYjMycyhwKTsKKyNlbHNlCisJKnAgPSBfX3N3YWIzMnAocCk7CisjZW5kaWYKK30KKworLyoqCisgKiBfX3N3YWI2NHMgLSBieXRlc3dhcCBhIDY0LWJpdCB2YWx1ZSBpbi1wbGFjZQorICogQHA6IHBvaW50ZXIgdG8gYSBuYXR1cmFsbHktYWxpZ25lZCA2NC1iaXQgdmFsdWUKKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3N3YWI2NHMoX191NjQgKnApCit7CisjaWZkZWYgX19hcmNoX3N3YWI2NHMKKwlfX2FyY2hfc3dhYjY0cyhwKTsKKyNlbHNlCisJKnAgPSBfX3N3YWI2NHAocCk7CisjZW5kaWYKK30KKworLyoqCisgKiBfX3N3YWh3MzJzIC0gd29yZHN3YXAgYSAzMi1iaXQgdmFsdWUgaW4tcGxhY2UKKyAqIEBwOiBwb2ludGVyIHRvIGEgbmF0dXJhbGx5LWFsaWduZWQgMzItYml0IHZhbHVlCisgKgorICogU2VlIF9fc3dhaHczMigpIGZvciBkZXRhaWxzIG9mIHdvcmRzd2FwcGluZworICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fc3dhaHczMnMoX191MzIgKnApCit7CisjaWZkZWYgX19hcmNoX3N3YWh3MzJzCisJX19hcmNoX3N3YWh3MzJzKHApOworI2Vsc2UKKwkqcCA9IF9fc3dhaHczMnAocCk7CisjZW5kaWYKK30KKworLyoqCisgKiBfX3N3YWhiMzJzIC0gaGlnaCBhbmQgbG93IGJ5dGVzd2FwIGEgMzItYml0IHZhbHVlIGluLXBsYWNlCisgKiBAcDogcG9pbnRlciB0byBhIG5hdHVyYWxseS1hbGlnbmVkIDMyLWJpdCB2YWx1ZQorICoKKyAqIFNlZSBfX3N3YWhiMzIoKSBmb3IgZGV0YWlscyBvZiBoaWdoIGFuZCBsb3cgYnl0ZSBzd2FwcGluZworICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fc3dhaGIzMnMoX191MzIgKnApCit7CisjaWZkZWYgX19hcmNoX3N3YWhiMzJzCisJX19hcmNoX3N3YWhiMzJzKHApOworI2Vsc2UKKwkqcCA9IF9fc3dhaGIzMnAocCk7CisjZW5kaWYKK30KKworCisjZW5kaWYgLyogX0xJTlVYX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zeW5jbGluay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zeW5jbGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MTg0MzQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N5bmNsaW5rLmgKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiBTeW5jTGluayBNdWx0aXByb3RvY29sIFNlcmlhbCBBZGFwdGVyIERyaXZlcgorICoKKyAqICRJZDogc3luY2xpbmsuaCx2IDMuMTQgMjAwNi8wNy8xNyAyMDoxNTo0MyBwYXVsa2YgRXhwICQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCBieSBNaWNyb2dhdGUgQ29ycG9yYXRpb24KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUgaXMgcGVybWl0dGVkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSAoR1BMKQorICovCisKKyNpZm5kZWYgX1NZTkNMSU5LX0hfCisjZGVmaW5lIF9TWU5DTElOS19IXworI2RlZmluZSBTWU5DTElOS19IX1ZFUlNJT04gMy42CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEJJVDAJMHgwMDAxCisjZGVmaW5lIEJJVDEJMHgwMDAyCisjZGVmaW5lIEJJVDIJMHgwMDA0CisjZGVmaW5lIEJJVDMJMHgwMDA4CisjZGVmaW5lIEJJVDQJMHgwMDEwCisjZGVmaW5lIEJJVDUJMHgwMDIwCisjZGVmaW5lIEJJVDYJMHgwMDQwCisjZGVmaW5lIEJJVDcJMHgwMDgwCisjZGVmaW5lIEJJVDgJMHgwMTAwCisjZGVmaW5lIEJJVDkJMHgwMjAwCisjZGVmaW5lIEJJVDEwCTB4MDQwMAorI2RlZmluZSBCSVQxMQkweDA4MDAKKyNkZWZpbmUgQklUMTIJMHgxMDAwCisjZGVmaW5lIEJJVDEzCTB4MjAwMAorI2RlZmluZSBCSVQxNAkweDQwMDAKKyNkZWZpbmUgQklUMTUJMHg4MDAwCisjZGVmaW5lIEJJVDE2CTB4MDAwMTAwMDAKKyNkZWZpbmUgQklUMTcJMHgwMDAyMDAwMAorI2RlZmluZSBCSVQxOAkweDAwMDQwMDAwCisjZGVmaW5lIEJJVDE5CTB4MDAwODAwMDAKKyNkZWZpbmUgQklUMjAJMHgwMDEwMDAwMAorI2RlZmluZSBCSVQyMQkweDAwMjAwMDAwCisjZGVmaW5lIEJJVDIyCTB4MDA0MDAwMDAKKyNkZWZpbmUgQklUMjMJMHgwMDgwMDAwMAorI2RlZmluZSBCSVQyNAkweDAxMDAwMDAwCisjZGVmaW5lIEJJVDI1CTB4MDIwMDAwMDAKKyNkZWZpbmUgQklUMjYJMHgwNDAwMDAwMAorI2RlZmluZSBCSVQyNwkweDA4MDAwMDAwCisjZGVmaW5lIEJJVDI4CTB4MTAwMDAwMDAKKyNkZWZpbmUgQklUMjkJMHgyMDAwMDAwMAorI2RlZmluZSBCSVQzMAkweDQwMDAwMDAwCisjZGVmaW5lIEJJVDMxCTB4ODAwMDAwMDAKKworCisjZGVmaW5lIEhETENfTUFYX0ZSQU1FX1NJWkUJNjU1MzUKKyNkZWZpbmUgTUFYX0FTWU5DX1RSQU5TTUlUCTQwOTYKKyNkZWZpbmUgTUFYX0FTWU5DX0JVRkZFUl9TSVpFCTQwOTYKKworI2RlZmluZSBBU1lOQ19QQVJJVFlfTk9ORQkJMAorI2RlZmluZSBBU1lOQ19QQVJJVFlfRVZFTgkJMQorI2RlZmluZSBBU1lOQ19QQVJJVFlfT0RECQkyCisjZGVmaW5lIEFTWU5DX1BBUklUWV9TUEFDRQkJMworCisjZGVmaW5lIEhETENfRkxBR19VTkRFUlJVTl9BQk9SVDcJMHgwMDAwCisjZGVmaW5lIEhETENfRkxBR19VTkRFUlJVTl9BQk9SVDE1CTB4MDAwMQorI2RlZmluZSBIRExDX0ZMQUdfVU5ERVJSVU5fRkxBRwkJMHgwMDAyCisjZGVmaW5lIEhETENfRkxBR19VTkRFUlJVTl9DUkMJCTB4MDAwNAorI2RlZmluZSBIRExDX0ZMQUdfU0hBUkVfWkVSTwkJMHgwMDEwCisjZGVmaW5lIEhETENfRkxBR19BVVRPX0NUUwkJMHgwMDIwCisjZGVmaW5lIEhETENfRkxBR19BVVRPX0RDRAkJMHgwMDQwCisjZGVmaW5lIEhETENfRkxBR19BVVRPX1JUUwkJMHgwMDgwCisjZGVmaW5lIEhETENfRkxBR19SWENfRFBMTAkJMHgwMTAwCisjZGVmaW5lIEhETENfRkxBR19SWENfQlJHCQkweDAyMDAKKyNkZWZpbmUgSERMQ19GTEFHX1JYQ19UWENQSU4JCTB4ODAwMAorI2RlZmluZSBIRExDX0ZMQUdfUlhDX1JYQ1BJTgkJMHgwMDAwCisjZGVmaW5lIEhETENfRkxBR19UWENfRFBMTAkJMHgwNDAwCisjZGVmaW5lIEhETENfRkxBR19UWENfQlJHCQkweDA4MDAKKyNkZWZpbmUgSERMQ19GTEFHX1RYQ19UWENQSU4JCTB4MDAwMAorI2RlZmluZSBIRExDX0ZMQUdfVFhDX1JYQ1BJTgkJMHgwMDA4CisjZGVmaW5lIEhETENfRkxBR19EUExMX0RJVjgJCTB4MTAwMAorI2RlZmluZSBIRExDX0ZMQUdfRFBMTF9ESVYxNgkJMHgyMDAwCisjZGVmaW5lIEhETENfRkxBR19EUExMX0RJVjMyCQkweDAwMDAKKyNkZWZpbmUgSERMQ19GTEFHX0hETENfTE9PUE1PREUJCTB4NDAwMAorCisjZGVmaW5lIEhETENfQ1JDX05PTkUJCQkwCisjZGVmaW5lIEhETENfQ1JDXzE2X0NDSVRUCQkxCisjZGVmaW5lIEhETENfQ1JDXzMyX0NDSVRUCQkyCisjZGVmaW5lIEhETENfQ1JDX01BU0sJCQkweDAwZmYKKyNkZWZpbmUgSERMQ19DUkNfUkVUVVJOX0VYCQkweDgwMDAKKworI2RlZmluZSBSWF9PSwkJCQkwCisjZGVmaW5lIFJYX0NSQ19FUlJPUgkJCTEKKworI2RlZmluZSBIRExDX1RYSURMRV9GTEFHUwkJMAorI2RlZmluZSBIRExDX1RYSURMRV9BTFRfWkVST1NfT05FUwkxCisjZGVmaW5lIEhETENfVFhJRExFX1pFUk9TCQkyCisjZGVmaW5lIEhETENfVFhJRExFX09ORVMJCTMKKyNkZWZpbmUgSERMQ19UWElETEVfQUxUX01BUktfU1BBQ0UJNAorI2RlZmluZSBIRExDX1RYSURMRV9TUEFDRQkJNQorI2RlZmluZSBIRExDX1RYSURMRV9NQVJLCQk2CisjZGVmaW5lIEhETENfVFhJRExFX0NVU1RPTV84ICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBIRExDX1RYSURMRV9DVVNUT01fMTYgICAgICAgICAgIDB4MjAwMDAwMDAKKworI2RlZmluZSBIRExDX0VOQ09ESU5HX05SWgkJCTAKKyNkZWZpbmUgSERMQ19FTkNPRElOR19OUlpCCQkJMQorI2RlZmluZSBIRExDX0VOQ09ESU5HX05SWklfTUFSSwkJCTIKKyNkZWZpbmUgSERMQ19FTkNPRElOR19OUlpJX1NQQUNFCQkzCisjZGVmaW5lIEhETENfRU5DT0RJTkdfTlJaSQkJCUhETENfRU5DT0RJTkdfTlJaSV9TUEFDRQorI2RlZmluZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfTUFSSwkJNAorI2RlZmluZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfU1BBQ0UJCTUKKyNkZWZpbmUgSERMQ19FTkNPRElOR19CSVBIQVNFX0xFVkVMCQk2CisjZGVmaW5lIEhETENfRU5DT0RJTkdfRElGRl9CSVBIQVNFX0xFVkVMCTcKKworI2RlZmluZSBIRExDX1BSRUFNQkxFX0xFTkdUSF84QklUUwkwCisjZGVmaW5lIEhETENfUFJFQU1CTEVfTEVOR1RIXzE2QklUUwkxCisjZGVmaW5lIEhETENfUFJFQU1CTEVfTEVOR1RIXzMyQklUUwkyCisjZGVmaW5lIEhETENfUFJFQU1CTEVfTEVOR1RIXzY0QklUUwkzCisKKyNkZWZpbmUgSERMQ19QUkVBTUJMRV9QQVRURVJOX05PTkUJMAorI2RlZmluZSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fWkVST1MJMQorI2RlZmluZSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fRkxBR1MJMgorI2RlZmluZSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fMTAJMworI2RlZmluZSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fMDEJNAorI2RlZmluZSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fT05FUwk1CisKKyNkZWZpbmUgTUdTTF9NT0RFX0FTWU5DCQkxCisjZGVmaW5lIE1HU0xfTU9ERV9IRExDCQkyCisjZGVmaW5lIE1HU0xfTU9ERV9NT05PU1lOQwkzCisjZGVmaW5lIE1HU0xfTU9ERV9CSVNZTkMJNAorI2RlZmluZSBNR1NMX01PREVfUkFXCQk2CisjZGVmaW5lIE1HU0xfTU9ERV9CQVNFX0NMT0NLICAgIDcKKyNkZWZpbmUgTUdTTF9NT0RFX1hTWU5DICAgICAgICAgOAorCisjZGVmaW5lIE1HU0xfQlVTX1RZUEVfSVNBCTEKKyNkZWZpbmUgTUdTTF9CVVNfVFlQRV9FSVNBCTIKKyNkZWZpbmUgTUdTTF9CVVNfVFlQRV9QQ0kJNQorCisjZGVmaW5lIE1HU0xfSU5URVJGQUNFX01BU0sgICAgIDB4ZgorI2RlZmluZSBNR1NMX0lOVEVSRkFDRV9ESVNBQkxFICAwCisjZGVmaW5lIE1HU0xfSU5URVJGQUNFX1JTMjMyICAgIDEKKyNkZWZpbmUgTUdTTF9JTlRFUkZBQ0VfVjM1ICAgICAgMgorI2RlZmluZSBNR1NMX0lOVEVSRkFDRV9SUzQyMiAgICAzCisjZGVmaW5lIE1HU0xfSU5URVJGQUNFX1JUU19FTiAgIDB4MTAKKyNkZWZpbmUgTUdTTF9JTlRFUkZBQ0VfTEwgICAgICAgMHgyMAorI2RlZmluZSBNR1NMX0lOVEVSRkFDRV9STCAgICAgICAweDQwCisjZGVmaW5lIE1HU0xfSU5URVJGQUNFX01TQl9GSVJTVCAweDgwCisKK3R5cGVkZWYgc3RydWN0IF9NR1NMX1BBUkFNUworeworCS8qIENvbW1vbiAqLworCisJdW5zaWduZWQgbG9uZwltb2RlOwkJLyogQXN5bmNocm9ub3VzIG9yIEhETEMgKi8KKwl1bnNpZ25lZCBjaGFyCWxvb3BiYWNrOwkvKiBpbnRlcm5hbCBsb29wYmFjayBtb2RlICovCisKKwkvKiBIRExDIE9ubHkgKi8KKworCXVuc2lnbmVkIHNob3J0CWZsYWdzOworCXVuc2lnbmVkIGNoYXIJZW5jb2Rpbmc7CS8qIE5SWiwgTlJaSSwgZXRjLiAqLworCXVuc2lnbmVkIGxvbmcJY2xvY2tfc3BlZWQ7CS8qIGV4dGVybmFsIGNsb2NrIHNwZWVkIGluIGJpdHMgcGVyIHNlY29uZCAqLworCXVuc2lnbmVkIGNoYXIJYWRkcl9maWx0ZXI7CS8qIHJlY2VpdmUgSERMQyBhZGRyZXNzIGZpbHRlciwgMHhGRiA9IGRpc2FibGUgKi8KKwl1bnNpZ25lZCBzaG9ydAljcmNfdHlwZTsJLyogTm9uZSwgQ1JDMTYtQ0NJVFQsIG9yIENSQzMyLUNDSVRUICovCisJdW5zaWduZWQgY2hhcglwcmVhbWJsZV9sZW5ndGg7CisJdW5zaWduZWQgY2hhcglwcmVhbWJsZTsKKworCS8qIEFzeW5jIE9ubHkgKi8KKworCXVuc2lnbmVkIGxvbmcJZGF0YV9yYXRlOwkvKiBiaXRzIHBlciBzZWNvbmQgKi8KKwl1bnNpZ25lZCBjaGFyCWRhdGFfYml0czsJLyogNyBvciA4IGRhdGEgYml0cyAqLworCXVuc2lnbmVkIGNoYXIJc3RvcF9iaXRzOwkvKiAxIG9yIDIgc3RvcCBiaXRzICovCisJdW5zaWduZWQgY2hhcglwYXJpdHk7CQkvKiBub25lLCBldmVuLCBvciBvZGQgKi8KKworfSBNR1NMX1BBUkFNUywgKlBNR1NMX1BBUkFNUzsKKworI2RlZmluZSBNSUNST0dBVEVfVkVORE9SX0lEIDB4MTNjMAorI2RlZmluZSBTWU5DTElOS19ERVZJQ0VfSUQgMHgwMDEwCisjZGVmaW5lIE1HU0NDX0RFVklDRV9JRCAweDAwMjAKKyNkZWZpbmUgU1lOQ0xJTktfU0NBX0RFVklDRV9JRCAweDAwMzAKKyNkZWZpbmUgU1lOQ0xJTktfR1RfREVWSUNFX0lEIDB4MDA3MAorI2RlZmluZSBTWU5DTElOS19HVDRfREVWSUNFX0lEIDB4MDA4MAorI2RlZmluZSBTWU5DTElOS19BQ19ERVZJQ0VfSUQgIDB4MDA5MAorI2RlZmluZSBTWU5DTElOS19HVDJfREVWSUNFX0lEIDB4MDBBMAorI2RlZmluZSBNR1NMX01BWF9TRVJJQUxfTlVNQkVSIDMwCisKKy8qCisqKiBkZXZpY2UgZGlhZ25vc3RpY3Mgc3RhdHVzCisqLworCisjZGVmaW5lIERpYWdTdGF0dXNfT0sJCQkJMAorI2RlZmluZSBEaWFnU3RhdHVzX0FkZHJlc3NGYWlsdXJlCQkxCisjZGVmaW5lIERpYWdTdGF0dXNfQWRkcmVzc0NvbmZsaWN0CQkyCisjZGVmaW5lIERpYWdTdGF0dXNfSXJxRmFpbHVyZQkJCTMKKyNkZWZpbmUgRGlhZ1N0YXR1c19JcnFDb25mbGljdAkJCTQKKyNkZWZpbmUgRGlhZ1N0YXR1c19EbWFGYWlsdXJlCQkJNQorI2RlZmluZSBEaWFnU3RhdHVzX0RtYUNvbmZsaWN0CQkJNgorI2RlZmluZSBEaWFnU3RhdHVzX1BjaUFkYXB0ZXJOb3RGb3VuZAkJNworI2RlZmluZSBEaWFnU3RhdHVzX0NhbnRBc3NpZ25QY2lSZXNvdXJjZXMJOAorI2RlZmluZSBEaWFnU3RhdHVzX0NhbnRBc3NpZ25QY2lNZW1BZGRyCQk5CisjZGVmaW5lIERpYWdTdGF0dXNfQ2FudEFzc2lnblBjaUlvQWRkcgkJMTAKKyNkZWZpbmUgRGlhZ1N0YXR1c19DYW50QXNzaWduUGNpSXJxCQkxMQorI2RlZmluZSBEaWFnU3RhdHVzX01lbW9yeUVycm9yCQkJMTIKKworI2RlZmluZSBTZXJpYWxTaWduYWxfRENEICAgICAgICAgICAgMHgwMSAgICAgLyogRGF0YSBDYXJyaWVyIERldGVjdCAqLworI2RlZmluZSBTZXJpYWxTaWduYWxfVFhEICAgICAgICAgICAgMHgwMiAgICAgLyogVHJhbnNtaXQgRGF0YSAqLworI2RlZmluZSBTZXJpYWxTaWduYWxfUkkgICAgICAgICAgICAgMHgwNCAgICAgLyogUmluZyBJbmRpY2F0b3IgKi8KKyNkZWZpbmUgU2VyaWFsU2lnbmFsX1JYRCAgICAgICAgICAgIDB4MDggICAgIC8qIFJlY2VpdmUgRGF0YSAqLworI2RlZmluZSBTZXJpYWxTaWduYWxfQ1RTICAgICAgICAgICAgMHgxMCAgICAgLyogQ2xlYXIgdG8gU2VuZCAqLworI2RlZmluZSBTZXJpYWxTaWduYWxfUlRTICAgICAgICAgICAgMHgyMCAgICAgLyogUmVxdWVzdCB0byBTZW5kICovCisjZGVmaW5lIFNlcmlhbFNpZ25hbF9EU1IgICAgICAgICAgICAweDQwICAgICAvKiBEYXRhIFNldCBSZWFkeSAqLworI2RlZmluZSBTZXJpYWxTaWduYWxfRFRSICAgICAgICAgICAgMHg4MCAgICAgLyogRGF0YSBUZXJtaW5hbCBSZWFkeSAqLworCisKKy8qCisgKiBDb3VudGVycyBvZiB0aGUgaW5wdXQgbGluZXMgKENUUywgRFNSLCBSSSwgQ0QpIGludGVycnVwdHMKKyAqLworc3RydWN0IG1nc2xfaWNvdW50IHsKKwlfX3UzMgljdHMsIGRzciwgcm5nLCBkY2QsIHR4LCByeDsKKwlfX3UzMglmcmFtZSwgcGFyaXR5LCBvdmVycnVuLCBicms7CisJX191MzIJYnVmX292ZXJydW47CisJX191MzIJdHhvazsKKwlfX3UzMgl0eHVuZGVyOworCV9fdTMyCXR4YWJvcnQ7CisJX191MzIJdHh0aW1lb3V0OworCV9fdTMyCXJ4c2hvcnQ7CisJX191MzIJcnhsb25nOworCV9fdTMyCXJ4YWJvcnQ7CisJX191MzIJcnhvdmVyOworCV9fdTMyCXJ4Y3JjOworCV9fdTMyCXJ4b2s7CisJX191MzIJZXhpdGh1bnQ7CisJX191MzIJcnhpZGxlOworfTsKKworc3RydWN0IGdwaW9fZGVzYyB7CisJX191MzIgc3RhdGU7CisJX191MzIgc21hc2s7CisJX191MzIgZGlyOworCV9fdTMyIGRtYXNrOworfTsKKworI2RlZmluZSBERUJVR19MRVZFTF9EQVRBCTEKKyNkZWZpbmUgREVCVUdfTEVWRUxfRVJST1IgCTIKKyNkZWZpbmUgREVCVUdfTEVWRUxfSU5GTyAgCTMKKyNkZWZpbmUgREVCVUdfTEVWRUxfQkggICAgCTQKKyNkZWZpbmUgREVCVUdfTEVWRUxfSVNSCQk1CisKKy8qCisqKiBFdmVudCBiaXQgZmxhZ3MgZm9yIHVzZSB3aXRoIE1nc2xXYWl0RXZlbnQKKyovCisKKyNkZWZpbmUgTWdzbEV2ZW50X0RzckFjdGl2ZQkweDAwMDEKKyNkZWZpbmUgTWdzbEV2ZW50X0RzckluYWN0aXZlCTB4MDAwMgorI2RlZmluZSBNZ3NsRXZlbnRfRHNyCQkweDAwMDMKKyNkZWZpbmUgTWdzbEV2ZW50X0N0c0FjdGl2ZQkweDAwMDQKKyNkZWZpbmUgTWdzbEV2ZW50X0N0c0luYWN0aXZlCTB4MDAwOAorI2RlZmluZSBNZ3NsRXZlbnRfQ3RzCQkweDAwMGMKKyNkZWZpbmUgTWdzbEV2ZW50X0RjZEFjdGl2ZQkweDAwMTAKKyNkZWZpbmUgTWdzbEV2ZW50X0RjZEluYWN0aXZlCTB4MDAyMAorI2RlZmluZSBNZ3NsRXZlbnRfRGNkCQkweDAwMzAKKyNkZWZpbmUgTWdzbEV2ZW50X1JpQWN0aXZlCTB4MDA0MAorI2RlZmluZSBNZ3NsRXZlbnRfUmlJbmFjdGl2ZQkweDAwODAKKyNkZWZpbmUgTWdzbEV2ZW50X1JpCQkweDAwYzAKKyNkZWZpbmUgTWdzbEV2ZW50X0V4aXRIdW50TW9kZQkweDAxMDAKKyNkZWZpbmUgTWdzbEV2ZW50X0lkbGVSZWNlaXZlZAkweDAyMDAKKworLyogUHJpdmF0ZSBJT0NUTCBjb2RlczoKKyAqCisgKiBNR1NMX0lPQ1NQQVJBTVMJc2V0IE1HU0xfUEFSQU1TIHN0cnVjdHVyZSB2YWx1ZXMKKyAqIE1HU0xfSU9DR1BBUkFNUwlnZXQgY3VycmVudCBNR1NMX1BBUkFNUyBzdHJ1Y3R1cmUgdmFsdWVzCisgKiBNR1NMX0lPQ1NUWElETEUJc2V0IGN1cnJlbnQgdHJhbnNtaXQgaWRsZSBtb2RlCisgKiBNR1NMX0lPQ0dUWElETEUJZ2V0IGN1cnJlbnQgdHJhbnNtaXQgaWRsZSBtb2RlCisgKiBNR1NMX0lPQ1RYRU5BQkxFCWVuYWJsZSBvciBkaXNhYmxlIHRyYW5zbWl0dGVyCisgKiBNR1NMX0lPQ1JYRU5BQkxFCWVuYWJsZSBvciBkaXNhYmxlIHJlY2VpdmVyCisgKiBNR1NMX0lPQ1RYQUJPUlQJYWJvcnQgdHJhbnNtaXR0aW5nIGZyYW1lIChIRExDKQorICogTUdTTF9JT0NHU1RBVFMJcmV0dXJuIGN1cnJlbnQgc3RhdGlzdGljcworICogTUdTTF9JT0NXQUlURVZFTlQJd2FpdCBmb3Igc3BlY2lmaWVkIGV2ZW50IHRvIG9jY3VyCisgKiBNR1NMX0xPT1BUWERPTkUJdHJhbnNtaXQgaW4gSERMQyBMb29wTW9kZSBkb25lCisgKiBNR1NMX0lPQ1NJRiAgICAgICAgICBzZXQgdGhlIHNlcmlhbCBpbnRlcmZhY2UgdHlwZQorICogTUdTTF9JT0NHSUYgICAgICAgICAgZ2V0IHRoZSBzZXJpYWwgaW50ZXJmYWNlIHR5cGUKKyAqLworI2RlZmluZSBNR1NMX01BR0lDX0lPQwknbScKKyNkZWZpbmUgTUdTTF9JT0NTUEFSQU1TCQlfSU9XKE1HU0xfTUFHSUNfSU9DLDAsc3RydWN0IF9NR1NMX1BBUkFNUykKKyNkZWZpbmUgTUdTTF9JT0NHUEFSQU1TCQlfSU9SKE1HU0xfTUFHSUNfSU9DLDEsc3RydWN0IF9NR1NMX1BBUkFNUykKKyNkZWZpbmUgTUdTTF9JT0NTVFhJRExFCQlfSU8oTUdTTF9NQUdJQ19JT0MsMikKKyNkZWZpbmUgTUdTTF9JT0NHVFhJRExFCQlfSU8oTUdTTF9NQUdJQ19JT0MsMykKKyNkZWZpbmUgTUdTTF9JT0NUWEVOQUJMRQlfSU8oTUdTTF9NQUdJQ19JT0MsNCkKKyNkZWZpbmUgTUdTTF9JT0NSWEVOQUJMRQlfSU8oTUdTTF9NQUdJQ19JT0MsNSkKKyNkZWZpbmUgTUdTTF9JT0NUWEFCT1JUCQlfSU8oTUdTTF9NQUdJQ19JT0MsNikKKyNkZWZpbmUgTUdTTF9JT0NHU1RBVFMJCV9JTyhNR1NMX01BR0lDX0lPQyw3KQorI2RlZmluZSBNR1NMX0lPQ1dBSVRFVkVOVAlfSU9XUihNR1NMX01BR0lDX0lPQyw4LGludCkKKyNkZWZpbmUgTUdTTF9JT0NDTFJNT0RDT1VOVAlfSU8oTUdTTF9NQUdJQ19JT0MsMTUpCisjZGVmaW5lIE1HU0xfSU9DTE9PUFRYRE9ORQlfSU8oTUdTTF9NQUdJQ19JT0MsOSkKKyNkZWZpbmUgTUdTTF9JT0NTSUYJCV9JTyhNR1NMX01BR0lDX0lPQywxMCkKKyNkZWZpbmUgTUdTTF9JT0NHSUYJCV9JTyhNR1NMX01BR0lDX0lPQywxMSkKKyNkZWZpbmUgTUdTTF9JT0NTR1BJTwkJX0lPVyhNR1NMX01BR0lDX0lPQywxNixzdHJ1Y3QgZ3Bpb19kZXNjKQorI2RlZmluZSBNR1NMX0lPQ0dHUElPCQlfSU9SKE1HU0xfTUFHSUNfSU9DLDE3LHN0cnVjdCBncGlvX2Rlc2MpCisjZGVmaW5lIE1HU0xfSU9DV0FJVEdQSU8JX0lPV1IoTUdTTF9NQUdJQ19JT0MsMTgsc3RydWN0IGdwaW9fZGVzYykKKyNkZWZpbmUgTUdTTF9JT0NTWFNZTkMJCV9JTyhNR1NMX01BR0lDX0lPQywgMTkpCisjZGVmaW5lIE1HU0xfSU9DR1hTWU5DCQlfSU8oTUdTTF9NQUdJQ19JT0MsIDIwKQorI2RlZmluZSBNR1NMX0lPQ1NYQ1RSTAkJX0lPKE1HU0xfTUFHSUNfSU9DLCAyMSkKKyNkZWZpbmUgTUdTTF9JT0NHWENUUkwJCV9JTyhNR1NMX01BR0lDX0lPQywgMjIpCisKKworI2VuZGlmIC8qIF9TWU5DTElOS19IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zeXNjdGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA5MmJjZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKQEAgLTAsMCArMSw5MzIgQEAKKy8qCisgKiBzeXNjdGwuaDogR2VuZXJhbCBsaW51eCBzeXN0ZW0gY29udHJvbCBpbnRlcmZhY2UKKyAqCisgKiBCZWd1biAyNCBNYXJjaCAxOTk1LCBTdGVwaGVuIFR3ZWVkaWUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqICBXQVJOSU5HOgorICoqICBUaGUgdmFsdWVzIGluIHRoaXMgZmlsZSBhcmUgZXhwb3J0ZWQgdG8gdXNlciBzcGFjZSB2aWEgCisgKiogIHRoZSBzeXNjdGwoKSBiaW5hcnkgaW50ZXJmYWNlLiAgRG8gKk5PVCogY2hhbmdlIHRoZQorICoqICBudW1iZXJpbmcgb2YgYW55IGV4aXN0aW5nIHZhbHVlcyBoZXJlLCBhbmQgZG8gbm90IGNoYW5nZQorICoqICBhbnkgbnVtYmVycyB3aXRoaW4gYW55IG9uZSBzZXQgb2YgdmFsdWVzLiAgSWYgeW91IGhhdmUgdG8KKyAqKiAgcmVkZWZpbmUgYW4gZXhpc3RpbmcgaW50ZXJmYWNlLCB1c2UgYSBuZXcgbnVtYmVyIGZvciBpdC4KKyAqKiAgVGhlIGtlcm5lbCB3aWxsIHRoZW4gcmV0dXJuIC1FTk9URElSIHRvIGFueSBhcHBsaWNhdGlvbiB1c2luZworICoqICB0aGUgb2xkIGJpbmFyeSBpbnRlcmZhY2UuCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX0xJTlVYX1NZU0NUTF9ICisjZGVmaW5lIF9MSU5VWF9TWVNDVExfSAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworCitzdHJ1Y3QgY29tcGxldGlvbjsKKworI2RlZmluZSBDVExfTUFYTkFNRSAxMAkJLyogaG93IG1hbnkgcGF0aCBjb21wb25lbnRzIGRvIHdlIGFsbG93IGluIGEKKwkJCQkgICBjYWxsIHRvIHN5c2N0bD8gICBJbiBvdGhlciB3b3Jkcywgd2hhdCBpcworCQkJCSAgIHRoZSBsYXJnZXN0IGFjY2VwdGFibGUgdmFsdWUgZm9yIHRoZSBubGVuCisJCQkJICAgbWVtYmVyIG9mIGEgc3RydWN0IF9fc3lzY3RsX2FyZ3MgdG8gaGF2ZT8gKi8KKworc3RydWN0IF9fc3lzY3RsX2FyZ3MgeworCWludCAqbmFtZTsKKwlpbnQgbmxlbjsKKwl2b2lkICpvbGR2YWw7CisJc2l6ZV90ICpvbGRsZW5wOworCXZvaWQgKm5ld3ZhbDsKKwlzaXplX3QgbmV3bGVuOworCXVuc2lnbmVkIGxvbmcgX191bnVzZWRbNF07Cit9OworCisvKiBEZWZpbmUgc3lzY3RsIG5hbWVzIGZpcnN0ICovCisKKy8qIFRvcC1sZXZlbCBuYW1lczogKi8KKworZW51bQoreworCUNUTF9LRVJOPTEsCQkvKiBHZW5lcmFsIGtlcm5lbCBpbmZvIGFuZCBjb250cm9sICovCisJQ1RMX1ZNPTIsCQkvKiBWTSBtYW5hZ2VtZW50ICovCisJQ1RMX05FVD0zLAkJLyogTmV0d29ya2luZyAqLworCUNUTF9QUk9DPTQsCQkvKiByZW1vdmFsIGJyZWFrcyBzdHJhY2UoMSkgY29tcGlsYXRpb24gKi8KKwlDVExfRlM9NSwJCS8qIEZpbGVzeXN0ZW1zICovCisJQ1RMX0RFQlVHPTYsCQkvKiBEZWJ1Z2dpbmcgKi8KKwlDVExfREVWPTcsCQkvKiBEZXZpY2VzICovCisJQ1RMX0JVUz04LAkJLyogQnVzc2VzICovCisJQ1RMX0FCST05LAkJLyogQmluYXJ5IGVtdWxhdGlvbiAqLworCUNUTF9DUFU9MTAsCQkvKiBDUFUgc3R1ZmYgKHNwZWVkIHNjYWxpbmcsIGV0YykgKi8KKwlDVExfQVJMQU49MjU0LAkJLyogYXJsYW4gd2lyZWxlc3MgZHJpdmVyICovCisJQ1RMX1MzOTBEQkY9NTY3NywJLyogczM5MCBkZWJ1ZyAqLworCUNUTF9TVU5SUEM9NzI0OSwJLyogc3VucnBjIGRlYnVnICovCisJQ1RMX1BNPTk4OTksCQkvKiBmcnYgcG93ZXIgbWFuYWdlbWVudCAqLworCUNUTF9GUlY9OTg5OCwJCS8qIGZydiBzcGVjaWZpYyBzeXNjdGxzICovCit9OworCisvKiBDVExfQlVTIG5hbWVzOiAqLworZW51bQoreworCUNUTF9CVVNfSVNBPTEJCS8qIElTQSAqLworfTsKKworLyogL3Byb2Mvc3lzL2ZzL2lub3RpZnkvICovCitlbnVtCit7CisJSU5PVElGWV9NQVhfVVNFUl9JTlNUQU5DRVM9MSwJLyogbWF4IGluc3RhbmNlcyBwZXIgdXNlciAqLworCUlOT1RJRllfTUFYX1VTRVJfV0FUQ0hFUz0yLAkvKiBtYXggd2F0Y2hlcyBwZXIgdXNlciAqLworCUlOT1RJRllfTUFYX1FVRVVFRF9FVkVOVFM9MwkvKiBtYXggcXVldWVkIGV2ZW50cyBwZXIgaW5zdGFuY2UgKi8KK307CisKKy8qIENUTF9LRVJOIG5hbWVzOiAqLworZW51bQoreworCUtFUk5fT1NUWVBFPTEsCQkvKiBzdHJpbmc6IHN5c3RlbSB2ZXJzaW9uICovCisJS0VSTl9PU1JFTEVBU0U9MiwJLyogc3RyaW5nOiBzeXN0ZW0gcmVsZWFzZSAqLworCUtFUk5fT1NSRVY9MywJCS8qIGludDogc3lzdGVtIHJldmlzaW9uICovCisJS0VSTl9WRVJTSU9OPTQsCQkvKiBzdHJpbmc6IGNvbXBpbGUgdGltZSBpbmZvICovCisJS0VSTl9TRUNVUkVNQVNLPTUsCS8qIHN0cnVjdDogbWF4aW11bSByaWdodHMgbWFzayAqLworCUtFUk5fUFJPRj02LAkJLyogdGFibGU6IHByb2ZpbGluZyBpbmZvcm1hdGlvbiAqLworCUtFUk5fTk9ERU5BTUU9NywJLyogc3RyaW5nOiBob3N0bmFtZSAqLworCUtFUk5fRE9NQUlOTkFNRT04LAkvKiBzdHJpbmc6IGRvbWFpbm5hbWUgKi8KKworCUtFUk5fUEFOSUM9MTUsCQkvKiBpbnQ6IHBhbmljIHRpbWVvdXQgKi8KKwlLRVJOX1JFQUxST09UREVWPTE2LAkvKiByZWFsIHJvb3QgZGV2aWNlIHRvIG1vdW50IGFmdGVyIGluaXRyZCAqLworCisJS0VSTl9TUEFSQ19SRUJPT1Q9MjEsCS8qIHJlYm9vdCBjb21tYW5kIG9uIFNwYXJjICovCisJS0VSTl9DVExBTFRERUw9MjIsCS8qIGludDogYWxsb3cgY3RsLWFsdC1kZWwgdG8gcmVib290ICovCisJS0VSTl9QUklOVEs9MjMsCQkvKiBzdHJ1Y3Q6IGNvbnRyb2wgcHJpbnRrIGxvZ2dpbmcgcGFyYW1ldGVycyAqLworCUtFUk5fTkFNRVRSQU5TPTI0LAkvKiBOYW1lIHRyYW5zbGF0aW9uICovCisJS0VSTl9QUENfSFRBQlJFQ0xBSU09MjUsIC8qIHR1cm4gaHRhYiByZWNsYWltYXRpb24gb24vb2ZmIG9uIFBQQyAqLworCUtFUk5fUFBDX1pFUk9QQUdFRD0yNiwJLyogdHVybiBpZGxlIHBhZ2UgemVyb2luZyBvbi9vZmYgb24gUFBDICovCisJS0VSTl9QUENfUE9XRVJTQVZFX05BUD0yNywgLyogdXNlIG5hcCBtb2RlIGZvciBwb3dlciBzYXZpbmcgKi8KKwlLRVJOX01PRFBST0JFPTI4LAkvKiBzdHJpbmc6IG1vZHByb2JlIHBhdGggKi8KKwlLRVJOX1NHX0JJR19CVUZGPTI5LAkvKiBpbnQ6IHNnIGRyaXZlciByZXNlcnZlZCBidWZmZXIgc2l6ZSAqLworCUtFUk5fQUNDVD0zMCwJCS8qIEJTRCBwcm9jZXNzIGFjY291bnRpbmcgcGFyYW1ldGVycyAqLworCUtFUk5fUFBDX0wyQ1I9MzEsCS8qIGwyY3IgcmVnaXN0ZXIgb24gUFBDICovCisKKwlLRVJOX1JUU0lHTlI9MzIsCS8qIE51bWJlciBvZiBydCBzaWdzIHF1ZXVlZCAqLworCUtFUk5fUlRTSUdNQVg9MzMsCS8qIE1heCBxdWV1YWJsZSAqLworCQorCUtFUk5fU0hNTUFYPTM0LCAgICAgICAgIC8qIGxvbmc6IE1heGltdW0gc2hhcmVkIG1lbW9yeSBzZWdtZW50ICovCisJS0VSTl9NU0dNQVg9MzUsICAgICAgICAgLyogaW50OiBNYXhpbXVtIHNpemUgb2YgYSBtZXNzZWdlICovCisJS0VSTl9NU0dNTkI9MzYsICAgICAgICAgLyogaW50OiBNYXhpbXVtIG1lc3NhZ2UgcXVldWUgc2l6ZSAqLworCUtFUk5fTVNHUE9PTD0zNywgICAgICAgIC8qIGludDogTWF4aW11bSBzeXN0ZW0gbWVzc2FnZSBwb29sIHNpemUgKi8KKwlLRVJOX1NZU1JRPTM4LAkJLyogaW50OiBTeXNyZXEgZW5hYmxlICovCisJS0VSTl9NQVhfVEhSRUFEUz0zOSwJLyogaW50OiBNYXhpbXVtIG5yIG9mIHRocmVhZHMgaW4gdGhlIHN5c3RlbSAqLworIAlLRVJOX1JBTkRPTT00MCwJCS8qIFJhbmRvbSBkcml2ZXIgKi8KKyAJS0VSTl9TSE1BTEw9NDEsCQkvKiBpbnQ6IE1heGltdW0gc2l6ZSBvZiBzaGFyZWQgbWVtb3J5ICovCisgCUtFUk5fTVNHTU5JPTQyLAkJLyogaW50OiBtc2cgcXVldWUgaWRlbnRpZmllcnMgKi8KKyAJS0VSTl9TRU09NDMsCQkvKiBzdHJ1Y3Q6IHN5c3Ygc2VtYXBob3JlIGxpbWl0cyAqLworIAlLRVJOX1NQQVJDX1NUT1BfQT00NCwJLyogaW50OiBTcGFyYyBTdG9wLUEgZW5hYmxlICovCisgCUtFUk5fU0hNTU5JPTQ1LAkJLyogaW50OiBzaG0gYXJyYXkgaWRlbnRpZmllcnMgKi8KKwlLRVJOX09WRVJGTE9XVUlEPTQ2LAkvKiBpbnQ6IG92ZXJmbG93IFVJRCAqLworCUtFUk5fT1ZFUkZMT1dHSUQ9NDcsCS8qIGludDogb3ZlcmZsb3cgR0lEICovCisJS0VSTl9TSE1QQVRIPTQ4LAkvKiBzdHJpbmc6IHBhdGggdG8gc2htIGZzICovCisJS0VSTl9IT1RQTFVHPTQ5LAkvKiBzdHJpbmc6IHBhdGggdG8gdWV2ZW50IGhlbHBlciAoZGVwcmVjYXRlZCkgKi8KKwlLRVJOX0lFRUVfRU1VTEFUSU9OX1dBUk5JTkdTPTUwLCAvKiBpbnQ6IHVuaW1wbGVtZW50ZWQgaWVlZSBpbnN0cnVjdGlvbnMgKi8KKwlLRVJOX1MzOTBfVVNFUl9ERUJVR19MT0dHSU5HPTUxLCAgLyogaW50OiBkdW1wcyBvZiB1c2VyIGZhdWx0cyAqLworCUtFUk5fQ09SRV9VU0VTX1BJRD01MiwJCS8qIGludDogdXNlIGNvcmUgb3IgY29yZS4lcGlkICovCisJS0VSTl9UQUlOVEVEPTUzLAkvKiBpbnQ6IHZhcmlvdXMga2VybmVsIHRhaW50ZWQgZmxhZ3MgKi8KKwlLRVJOX0NBRFBJRD01NCwJCS8qIGludDogUElEIG9mIHRoZSBwcm9jZXNzIHRvIG5vdGlmeSBvbiBDQUQgKi8KKwlLRVJOX1BJRE1BWD01NSwJCS8qIGludDogUElEICMgbGltaXQgKi8KKyAgCUtFUk5fQ09SRV9QQVRURVJOPTU2LAkvKiBzdHJpbmc6IHBhdHRlcm4gZm9yIGNvcmUtZmlsZSBuYW1lcyAqLworCUtFUk5fUEFOSUNfT05fT09QUz01NywgIC8qIGludDogd2hldGhlciB3ZSB3aWxsIHBhbmljIG9uIGFuIG9vcHMgKi8KKwlLRVJOX0hQUEFfUFdSU1c9NTgsCS8qIGludDogaHBwYSBzb2Z0LXBvd2VyIGVuYWJsZSAqLworCUtFUk5fSFBQQV9VTkFMSUdORUQ9NTksCS8qIGludDogaHBwYSB1bmFsaWduZWQtdHJhcCBlbmFibGUgKi8KKwlLRVJOX1BSSU5US19SQVRFTElNSVQ9NjAsIC8qIGludDogdHVuZSBwcmludGsgcmF0ZWxpbWl0aW5nICovCisJS0VSTl9QUklOVEtfUkFURUxJTUlUX0JVUlNUPTYxLAkvKiBpbnQ6IHR1bmUgcHJpbnRrIHJhdGVsaW1pdGluZyAqLworCUtFUk5fUFRZPTYyLAkJLyogZGlyOiBwdHkgZHJpdmVyICovCisJS0VSTl9OR1JPVVBTX01BWD02MywJLyogaW50OiBOR1JPVVBTX01BWCAqLworCUtFUk5fU1BBUkNfU0NPTlNfUFdST0ZGPTY0LCAvKiBpbnQ6IHNlcmlhbCBjb25zb2xlIHBvd2VyLW9mZiBoYWx0ICovCisJS0VSTl9IWl9USU1FUj02NSwJLyogaW50OiBoeiB0aW1lciBvbiBvciBvZmYgKi8KKwlLRVJOX1VOS05PV05fTk1JX1BBTklDPTY2LCAvKiBpbnQ6IHVua25vd24gbm1pIHBhbmljIGZsYWcgKi8KKwlLRVJOX0JPT1RMT0FERVJfVFlQRT02NywgLyogaW50OiBib290IGxvYWRlciB0eXBlICovCisJS0VSTl9SQU5ET01JWkU9NjgsIC8qIGludDogcmFuZG9taXplIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAqLworCUtFUk5fU0VUVUlEX0RVTVBBQkxFPTY5LCAvKiBpbnQ6IGJlaGF2aW91ciBvZiBkdW1wcyBmb3Igc2V0dWlkIGNvcmUgKi8KKwlLRVJOX1NQSU5fUkVUUlk9NzAsCS8qIGludDogbnVtYmVyIG9mIHNwaW5sb2NrIHJldHJpZXMgKi8KKwlLRVJOX0FDUElfVklERU9fRkxBR1M9NzEsIC8qIGludDogZmxhZ3MgZm9yIHNldHRpbmcgdXAgdmlkZW8gYWZ0ZXIgQUNQSSBzbGVlcCAqLworCUtFUk5fSUE2NF9VTkFMSUdORUQ9NzIsIC8qIGludDogaWE2NCB1bmFsaWduZWQgdXNlcmxhbmQgdHJhcCBlbmFibGUgKi8KKwlLRVJOX0NPTVBBVF9MT0c9NzMsCS8qIGludDogcHJpbnQgY29tcGF0IGxheWVyICBtZXNzYWdlcyAqLworCUtFUk5fTUFYX0xPQ0tfREVQVEg9NzQsIC8qIGludDogcnRtdXRleCdzIG1heGltdW0gbG9jayBkZXB0aCAqLworCUtFUk5fTk1JX1dBVENIRE9HPTc1LCAvKiBpbnQ6IGVuYWJsZS9kaXNhYmxlIG5taSB3YXRjaGRvZyAqLworCUtFUk5fUEFOSUNfT05fTk1JPTc2LCAvKiBpbnQ6IHdoZXRoZXIgd2Ugd2lsbCBwYW5pYyBvbiBhbiB1bnJlY292ZXJlZCAqLworfTsKKworCisKKy8qIENUTF9WTSBuYW1lczogKi8KK2VudW0KK3sKKwlWTV9VTlVTRUQxPTEsCQkvKiB3YXM6IHN0cnVjdDogU2V0IHZtIHN3YXBwaW5nIGNvbnRyb2wgKi8KKwlWTV9VTlVTRUQyPTIsCQkvKiB3YXM7IGludDogTGluZWFyIG9yIHNxcnQoKSBzd2Fwb3V0IGZvciBob2dzICovCisJVk1fVU5VU0VEMz0zLAkJLyogd2FzOiBzdHJ1Y3Q6IFNldCBmcmVlIHBhZ2UgdGhyZXNob2xkcyAqLworCVZNX1VOVVNFRDQ9NCwJCS8qIFNwYXJlICovCisJVk1fT1ZFUkNPTU1JVF9NRU1PUlk9NSwJLyogVHVybiBvZmYgdGhlIHZpcnR1YWwgbWVtb3J5IHNhZmV0eSBsaW1pdCAqLworCVZNX1VOVVNFRDU9NiwJCS8qIHdhczogc3RydWN0OiBTZXQgYnVmZmVyIG1lbW9yeSB0aHJlc2hvbGRzICovCisJVk1fVU5VU0VENz03LAkJLyogd2FzOiBzdHJ1Y3Q6IFNldCBjYWNoZSBtZW1vcnkgdGhyZXNob2xkcyAqLworCVZNX1VOVVNFRDg9OCwJCS8qIHdhczogc3RydWN0OiBDb250cm9sIGtzd2FwZCBiZWhhdmlvdXIgKi8KKwlWTV9VTlVTRUQ5PTksCQkvKiB3YXM6IHN0cnVjdDogU2V0IHBhZ2UgdGFibGUgY2FjaGUgcGFyYW1ldGVycyAqLworCVZNX1BBR0VfQ0xVU1RFUj0xMCwJLyogaW50OiBzZXQgbnVtYmVyIG9mIHBhZ2VzIHRvIHN3YXAgdG9nZXRoZXIgKi8KKwlWTV9ESVJUWV9CQUNLR1JPVU5EPTExLAkvKiBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvICovCisJVk1fRElSVFlfUkFUSU89MTIsCS8qIGRpcnR5X3JhdGlvICovCisJVk1fRElSVFlfV0JfQ1M9MTMsCS8qIGRpcnR5X3dyaXRlYmFja19jZW50aXNlY3MgKi8KKwlWTV9ESVJUWV9FWFBJUkVfQ1M9MTQsCS8qIGRpcnR5X2V4cGlyZV9jZW50aXNlY3MgKi8KKwlWTV9OUl9QREZMVVNIX1RIUkVBRFM9MTUsIC8qIG5yX3BkZmx1c2hfdGhyZWFkcyAqLworCVZNX09WRVJDT01NSVRfUkFUSU89MTYsIC8qIHBlcmNlbnQgb2YgUkFNIHRvIGFsbG93IG92ZXJjb21taXQgaW4gKi8KKwlWTV9QQUdFQlVGPTE3LAkJLyogc3RydWN0OiBDb250cm9sIHBhZ2VidWYgcGFyYW1ldGVycyAqLworCVZNX0hVR0VUTEJfUEFHRVM9MTgsCS8qIGludDogTnVtYmVyIG9mIGF2YWlsYWJsZSBIdWdlIFBhZ2VzICovCisJVk1fU1dBUFBJTkVTUz0xOSwJLyogVGVuZGVuY3kgdG8gc3RlYWwgbWFwcGVkIG1lbW9yeSAqLworCVZNX0xPV01FTV9SRVNFUlZFX1JBVElPPTIwLC8qIHJlc2VydmF0aW9uIHJhdGlvIGZvciBsb3dlciBtZW1vcnkgem9uZXMgKi8KKwlWTV9NSU5fRlJFRV9LQllURVM9MjEsCS8qIE1pbmltdW0gZnJlZSBraWxvYnl0ZXMgdG8gbWFpbnRhaW4gKi8KKwlWTV9NQVhfTUFQX0NPVU5UPTIyLAkvKiBpbnQ6IE1heGltdW0gbnVtYmVyIG9mIG1tYXBzL2FkZHJlc3Mtc3BhY2UgKi8KKwlWTV9MQVBUT1BfTU9ERT0yMywJLyogdm0gbGFwdG9wIG1vZGUgKi8KKwlWTV9CTE9DS19EVU1QPTI0LAkvKiBibG9jayBkdW1wIG1vZGUgKi8KKwlWTV9IVUdFVExCX0dST1VQPTI1LAkvKiBwZXJtaXR0ZWQgaHVnZXRsYiBncm91cCAqLworCVZNX1ZGU19DQUNIRV9QUkVTU1VSRT0yNiwgLyogZGNhY2hlL2ljYWNoZSByZWNsYWltIHByZXNzdXJlICovCisJVk1fTEVHQUNZX1ZBX0xBWU9VVD0yNywgLyogbGVnYWN5L2NvbXBhdGliaWxpdHkgdmlydHVhbCBhZGRyZXNzIHNwYWNlIGxheW91dCAqLworCVZNX1NXQVBfVE9LRU5fVElNRU9VVD0yOCwgLyogZGVmYXVsdCB0aW1lIGZvciB0b2tlbiB0aW1lIG91dCAqLworCVZNX0RST1BfUEFHRUNBQ0hFPTI5LAkvKiBpbnQ6IG51a2UgbG90cyBvZiBwYWdlY2FjaGUgKi8KKwlWTV9QRVJDUFVfUEFHRUxJU1RfRlJBQ1RJT049MzAsLyogaW50OiBmcmFjdGlvbiBvZiBwYWdlcyBpbiBlYWNoIHBlcmNwdV9wYWdlbGlzdCAqLworCVZNX1pPTkVfUkVDTEFJTV9NT0RFPTMxLCAvKiByZWNsYWltIGxvY2FsIHpvbmUgbWVtb3J5IGJlZm9yZSBnb2luZyBvZmYgbm9kZSAqLworCVZNX01JTl9VTk1BUFBFRD0zMiwJLyogU2V0IG1pbiBwZXJjZW50IG9mIHVubWFwcGVkIHBhZ2VzICovCisJVk1fUEFOSUNfT05fT09NPTMzLAkvKiBwYW5pYyBhdCBvdXQtb2YtbWVtb3J5ICovCisJVk1fVkRTT19FTkFCTEVEPTM0LAkvKiBtYXAgVkRTTyBpbnRvIG5ldyBwcm9jZXNzZXM/ICovCisJVk1fTUlOX1NMQUI9MzUsCQkgLyogUGVyY2VudCBwYWdlcyBpZ25vcmVkIGJ5IHpvbmUgcmVjbGFpbSAqLworfTsKKworCisvKiBDVExfTkVUIG5hbWVzOiAqLworZW51bQoreworCU5FVF9DT1JFPTEsCisJTkVUX0VUSEVSPTIsCisJTkVUXzgwMj0zLAorCU5FVF9VTklYPTQsCisJTkVUX0lQVjQ9NSwKKwlORVRfSVBYPTYsCisJTkVUX0FUQUxLPTcsCisJTkVUX05FVFJPTT04LAorCU5FVF9BWDI1PTksCisJTkVUX0JSSURHRT0xMCwKKwlORVRfUk9TRT0xMSwKKwlORVRfSVBWNj0xMiwKKwlORVRfWDI1PTEzLAorCU5FVF9UUj0xNCwKKwlORVRfREVDTkVUPTE1LAorCU5FVF9FQ09ORVQ9MTYsCisJTkVUX1NDVFA9MTcsCisJTkVUX0xMQz0xOCwKKwlORVRfTkVURklMVEVSPTE5LAorCU5FVF9EQ0NQPTIwLAorCU5FVF9JUkRBPTQxMiwKK307CisKKy8qIC9wcm9jL3N5cy9rZXJuZWwvcmFuZG9tICovCitlbnVtCit7CisJUkFORE9NX1BPT0xTSVpFPTEsCisJUkFORE9NX0VOVFJPUFlfQ09VTlQ9MiwKKwlSQU5ET01fUkVBRF9USFJFU0g9MywKKwlSQU5ET01fV1JJVEVfVEhSRVNIPTQsCisJUkFORE9NX0JPT1RfSUQ9NSwKKwlSQU5ET01fVVVJRD02Cit9OworCisvKiAvcHJvYy9zeXMva2VybmVsL3B0eSAqLworZW51bQoreworCVBUWV9NQVg9MSwKKwlQVFlfTlI9MgorfTsKKworLyogL3Byb2Mvc3lzL2J1cy9pc2EgKi8KK2VudW0KK3sKKwlCVVNfSVNBX01FTV9CQVNFPTEsCisJQlVTX0lTQV9QT1JUX0JBU0U9MiwKKwlCVVNfSVNBX1BPUlRfU0hJRlQ9MworfTsKKworLyogL3Byb2Mvc3lzL25ldC9jb3JlICovCitlbnVtCit7CisJTkVUX0NPUkVfV01FTV9NQVg9MSwKKwlORVRfQ09SRV9STUVNX01BWD0yLAorCU5FVF9DT1JFX1dNRU1fREVGQVVMVD0zLAorCU5FVF9DT1JFX1JNRU1fREVGQVVMVD00LAorLyogd2FzCU5FVF9DT1JFX0RFU1RST1lfREVMQVkgKi8KKwlORVRfQ09SRV9NQVhfQkFDS0xPRz02LAorCU5FVF9DT1JFX0ZBU1RST1VURT03LAorCU5FVF9DT1JFX01TR19DT1NUPTgsCisJTkVUX0NPUkVfTVNHX0JVUlNUPTksCisJTkVUX0NPUkVfT1BUTUVNX01BWD0xMCwKKwlORVRfQ09SRV9IT1RfTElTVF9MRU5HVEg9MTEsCisJTkVUX0NPUkVfRElWRVJUX1ZFUlNJT049MTIsCisJTkVUX0NPUkVfTk9fQ09OR19USFJFU0g9MTMsCisJTkVUX0NPUkVfTk9fQ09ORz0xNCwKKwlORVRfQ09SRV9MT19DT05HPTE1LAorCU5FVF9DT1JFX01PRF9DT05HPTE2LAorCU5FVF9DT1JFX0RFVl9XRUlHSFQ9MTcsCisJTkVUX0NPUkVfU09NQVhDT05OPTE4LAorCU5FVF9DT1JFX0JVREdFVD0xOSwKKwlORVRfQ09SRV9BRVZFTlRfRVRJTUU9MjAsCisJTkVUX0NPUkVfQUVWRU5UX1JTRVFUSD0yMSwKKwlORVRfQ09SRV9XQVJOSU5HUz0yMiwKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvZXRoZXJuZXQgKi8KKworLyogL3Byb2Mvc3lzL25ldC84MDIgKi8KKworLyogL3Byb2Mvc3lzL25ldC91bml4ICovCisKK2VudW0KK3sKKwlORVRfVU5JWF9ERVNUUk9ZX0RFTEFZPTEsCisJTkVUX1VOSVhfREVMRVRFX0RFTEFZPTIsCisJTkVUX1VOSVhfTUFYX0RHUkFNX1FMRU49MywKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvbmV0ZmlsdGVyICovCitlbnVtCit7CisJTkVUX05GX0NPTk5UUkFDS19NQVg9MSwKKwlORVRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX1NZTl9TRU5UPTIsCisJTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9TWU5fUkVDVj0zLAorCU5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfRVNUQUJMSVNIRUQ9NCwKKwlORVRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0ZJTl9XQUlUPTUsCisJTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9DTE9TRV9XQUlUPTYsCisJTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9MQVNUX0FDSz03LAorCU5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfVElNRV9XQUlUPTgsCisJTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9DTE9TRT05LAorCU5FVF9ORl9DT05OVFJBQ0tfVURQX1RJTUVPVVQ9MTAsCisJTkVUX05GX0NPTk5UUkFDS19VRFBfVElNRU9VVF9TVFJFQU09MTEsCisJTkVUX05GX0NPTk5UUkFDS19JQ01QX1RJTUVPVVQ9MTIsCisJTkVUX05GX0NPTk5UUkFDS19HRU5FUklDX1RJTUVPVVQ9MTMsCisJTkVUX05GX0NPTk5UUkFDS19CVUNLRVRTPTE0LAorCU5FVF9ORl9DT05OVFJBQ0tfTE9HX0lOVkFMSUQ9MTUsCisJTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9NQVhfUkVUUkFOUz0xNiwKKwlORVRfTkZfQ09OTlRSQUNLX1RDUF9MT09TRT0xNywKKwlORVRfTkZfQ09OTlRSQUNLX1RDUF9CRV9MSUJFUkFMPTE4LAorCU5FVF9ORl9DT05OVFJBQ0tfVENQX01BWF9SRVRSQU5TPTE5LAorCU5FVF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX0NMT1NFRD0yMCwKKwlORVRfTkZfQ09OTlRSQUNLX1NDVFBfVElNRU9VVF9DT09LSUVfV0FJVD0yMSwKKwlORVRfTkZfQ09OTlRSQUNLX1NDVFBfVElNRU9VVF9DT09LSUVfRUNIT0VEPTIyLAorCU5FVF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX0VTVEFCTElTSEVEPTIzLAorCU5FVF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX1NIVVRET1dOX1NFTlQ9MjQsCisJTkVUX05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfU0hVVERPV05fUkVDRD0yNSwKKwlORVRfTkZfQ09OTlRSQUNLX1NDVFBfVElNRU9VVF9TSFVURE9XTl9BQ0tfU0VOVD0yNiwKKwlORVRfTkZfQ09OTlRSQUNLX0NPVU5UPTI3LAorCU5FVF9ORl9DT05OVFJBQ0tfSUNNUFY2X1RJTUVPVVQ9MjgsCisJTkVUX05GX0NPTk5UUkFDS19GUkFHNl9USU1FT1VUPTI5LAorCU5FVF9ORl9DT05OVFJBQ0tfRlJBRzZfTE9XX1RIUkVTSD0zMCwKKwlORVRfTkZfQ09OTlRSQUNLX0ZSQUc2X0hJR0hfVEhSRVNIPTMxLAorCU5FVF9ORl9DT05OVFJBQ0tfQ0hFQ0tTVU09MzIsCit9OworCisvKiAvcHJvYy9zeXMvbmV0L2lwdjQgKi8KK2VudW0KK3sKKwkvKiB2Mi4wIGNvbXBhdGliaWxlIHZhcmlhYmxlcyAqLworCU5FVF9JUFY0X0ZPUldBUkQ9OCwKKwlORVRfSVBWNF9EWU5BRERSPTksCisKKwlORVRfSVBWNF9DT05GPTE2LAorCU5FVF9JUFY0X05FSUdIPTE3LAorCU5FVF9JUFY0X1JPVVRFPTE4LAorCU5FVF9JUFY0X0ZJQl9IQVNIPTE5LAorCU5FVF9JUFY0X05FVEZJTFRFUj0yMCwKKworCU5FVF9JUFY0X1RDUF9USU1FU1RBTVBTPTMzLAorCU5FVF9JUFY0X1RDUF9XSU5ET1dfU0NBTElORz0zNCwKKwlORVRfSVBWNF9UQ1BfU0FDSz0zNSwKKwlORVRfSVBWNF9UQ1BfUkVUUkFOU19DT0xMQVBTRT0zNiwKKwlORVRfSVBWNF9ERUZBVUxUX1RUTD0zNywKKwlORVRfSVBWNF9BVVRPQ09ORklHPTM4LAorCU5FVF9JUFY0X05PX1BNVFVfRElTQz0zOSwKKwlORVRfSVBWNF9UQ1BfU1lOX1JFVFJJRVM9NDAsCisJTkVUX0lQVjRfSVBGUkFHX0hJR0hfVEhSRVNIPTQxLAorCU5FVF9JUFY0X0lQRlJBR19MT1dfVEhSRVNIPTQyLAorCU5FVF9JUFY0X0lQRlJBR19USU1FPTQzLAorCU5FVF9JUFY0X1RDUF9NQVhfS0FfUFJPQkVTPTQ0LAorCU5FVF9JUFY0X1RDUF9LRUVQQUxJVkVfVElNRT00NSwKKwlORVRfSVBWNF9UQ1BfS0VFUEFMSVZFX1BST0JFUz00NiwKKwlORVRfSVBWNF9UQ1BfUkVUUklFUzE9NDcsCisJTkVUX0lQVjRfVENQX1JFVFJJRVMyPTQ4LAorCU5FVF9JUFY0X1RDUF9GSU5fVElNRU9VVD00OSwKKwlORVRfSVBWNF9JUF9NQVNRX0RFQlVHPTUwLAorCU5FVF9UQ1BfU1lOQ09PS0lFUz01MSwKKwlORVRfVENQX1NURFVSRz01MiwKKwlORVRfVENQX1JGQzEzMzc9NTMsCisJTkVUX1RDUF9TWU5fVEFJTERST1A9NTQsCisJTkVUX1RDUF9NQVhfU1lOX0JBQ0tMT0c9NTUsCisJTkVUX0lQVjRfTE9DQUxfUE9SVF9SQU5HRT01NiwKKwlORVRfSVBWNF9JQ01QX0VDSE9fSUdOT1JFX0FMTD01NywKKwlORVRfSVBWNF9JQ01QX0VDSE9fSUdOT1JFX0JST0FEQ0FTVFM9NTgsCisJTkVUX0lQVjRfSUNNUF9TT1VSQ0VRVUVOQ0hfUkFURT01OSwKKwlORVRfSVBWNF9JQ01QX0RFU1RVTlJFQUNIX1JBVEU9NjAsCisJTkVUX0lQVjRfSUNNUF9USU1FRVhDRUVEX1JBVEU9NjEsCisJTkVUX0lQVjRfSUNNUF9QQVJBTVBST0JfUkFURT02MiwKKwlORVRfSVBWNF9JQ01QX0VDSE9SRVBMWV9SQVRFPTYzLAorCU5FVF9JUFY0X0lDTVBfSUdOT1JFX0JPR1VTX0VSUk9SX1JFU1BPTlNFUz02NCwKKwlORVRfSVBWNF9JR01QX01BWF9NRU1CRVJTSElQUz02NSwKKwlORVRfVENQX1RXX1JFQ1lDTEU9NjYsCisJTkVUX0lQVjRfQUxXQVlTX0RFRlJBRz02NywKKwlORVRfSVBWNF9UQ1BfS0VFUEFMSVZFX0lOVFZMPTY4LAorCU5FVF9JUFY0X0lORVRfUEVFUl9USFJFU0hPTEQ9NjksCisJTkVUX0lQVjRfSU5FVF9QRUVSX01JTlRUTD03MCwKKwlORVRfSVBWNF9JTkVUX1BFRVJfTUFYVFRMPTcxLAorCU5FVF9JUFY0X0lORVRfUEVFUl9HQ19NSU5USU1FPTcyLAorCU5FVF9JUFY0X0lORVRfUEVFUl9HQ19NQVhUSU1FPTczLAorCU5FVF9UQ1BfT1JQSEFOX1JFVFJJRVM9NzQsCisJTkVUX1RDUF9BQk9SVF9PTl9PVkVSRkxPVz03NSwKKwlORVRfVENQX1NZTkFDS19SRVRSSUVTPTc2LAorCU5FVF9UQ1BfTUFYX09SUEhBTlM9NzcsCisJTkVUX1RDUF9NQVhfVFdfQlVDS0VUUz03OCwKKwlORVRfVENQX0ZBQ0s9NzksCisJTkVUX1RDUF9SRU9SREVSSU5HPTgwLAorCU5FVF9UQ1BfRUNOPTgxLAorCU5FVF9UQ1BfRFNBQ0s9ODIsCisJTkVUX1RDUF9NRU09ODMsCisJTkVUX1RDUF9XTUVNPTg0LAorCU5FVF9UQ1BfUk1FTT04NSwKKwlORVRfVENQX0FQUF9XSU49ODYsCisJTkVUX1RDUF9BRFZfV0lOX1NDQUxFPTg3LAorCU5FVF9JUFY0X05PTkxPQ0FMX0JJTkQ9ODgsCisJTkVUX0lQVjRfSUNNUF9SQVRFTElNSVQ9ODksCisJTkVUX0lQVjRfSUNNUF9SQVRFTUFTSz05MCwKKwlORVRfVENQX1RXX1JFVVNFPTkxLAorCU5FVF9UQ1BfRlJUTz05MiwKKwlORVRfVENQX0xPV19MQVRFTkNZPTkzLAorCU5FVF9JUFY0X0lQRlJBR19TRUNSRVRfSU5URVJWQUw9OTQsCisJTkVUX0lQVjRfSUdNUF9NQVhfTVNGPTk2LAorCU5FVF9UQ1BfTk9fTUVUUklDU19TQVZFPTk3LAorCU5FVF9UQ1BfREVGQVVMVF9XSU5fU0NBTEU9MTA1LAorCU5FVF9UQ1BfTU9ERVJBVEVfUkNWQlVGPTEwNiwKKwlORVRfVENQX1RTT19XSU5fRElWSVNPUj0xMDcsCisJTkVUX1RDUF9CSUNfQkVUQT0xMDgsCisJTkVUX0lQVjRfSUNNUF9FUlJPUlNfVVNFX0lOQk9VTkRfSUZBRERSPTEwOSwKKwlORVRfVENQX0NPTkdfQ09OVFJPTD0xMTAsCisJTkVUX1RDUF9BQkM9MTExLAorCU5FVF9JUFY0X0lQRlJBR19NQVhfRElTVD0xMTIsCisgCU5FVF9UQ1BfTVRVX1BST0JJTkc9MTEzLAorCU5FVF9UQ1BfQkFTRV9NU1M9MTE0LAorCU5FVF9JUFY0X1RDUF9XT1JLQVJPVU5EX1NJR05FRF9XSU5ET1dTPTExNSwKKwlORVRfVENQX0RNQV9DT1BZQlJFQUs9MTE2LAorCU5FVF9UQ1BfU0xPV19TVEFSVF9BRlRFUl9JRExFPTExNywKKwlORVRfQ0lQU09WNF9DQUNIRV9FTkFCTEU9MTE4LAorCU5FVF9DSVBTT1Y0X0NBQ0hFX0JVQ0tFVF9TSVpFPTExOSwKKwlORVRfQ0lQU09WNF9SQk1fT1BURk1UPTEyMCwKKwlORVRfQ0lQU09WNF9SQk1fU1RSSUNUVkFMSUQ9MTIxLAorCU5FVF9UQ1BfQVZBSUxfQ09OR19DT05UUk9MPTEyMiwKKwlORVRfVENQX0FMTE9XRURfQ09OR19DT05UUk9MPTEyMywKKwlORVRfVENQX01BWF9TU1RIUkVTSD0xMjQsCisJTkVUX1RDUF9GUlRPX1JFU1BPTlNFPTEyNSwKK307CisKK2VudW0geworCU5FVF9JUFY0X1JPVVRFX0ZMVVNIPTEsCisJTkVUX0lQVjRfUk9VVEVfTUlOX0RFTEFZPTIsIC8qIG9ic29sZXRlIHNpbmNlIDIuNi4yNSAqLworCU5FVF9JUFY0X1JPVVRFX01BWF9ERUxBWT0zLCAvKiBvYnNvbGV0ZSBzaW5jZSAyLjYuMjUgKi8KKwlORVRfSVBWNF9ST1VURV9HQ19USFJFU0g9NCwKKwlORVRfSVBWNF9ST1VURV9NQVhfU0laRT01LAorCU5FVF9JUFY0X1JPVVRFX0dDX01JTl9JTlRFUlZBTD02LAorCU5FVF9JUFY0X1JPVVRFX0dDX1RJTUVPVVQ9NywKKwlORVRfSVBWNF9ST1VURV9HQ19JTlRFUlZBTD04LCAvKiBvYnNvbGV0ZSBzaW5jZSAyLjYuMzggKi8KKwlORVRfSVBWNF9ST1VURV9SRURJUkVDVF9MT0FEPTksCisJTkVUX0lQVjRfUk9VVEVfUkVESVJFQ1RfTlVNQkVSPTEwLAorCU5FVF9JUFY0X1JPVVRFX1JFRElSRUNUX1NJTEVOQ0U9MTEsCisJTkVUX0lQVjRfUk9VVEVfRVJST1JfQ09TVD0xMiwKKwlORVRfSVBWNF9ST1VURV9FUlJPUl9CVVJTVD0xMywKKwlORVRfSVBWNF9ST1VURV9HQ19FTEFTVElDSVRZPTE0LAorCU5FVF9JUFY0X1JPVVRFX01UVV9FWFBJUkVTPTE1LAorCU5FVF9JUFY0X1JPVVRFX01JTl9QTVRVPTE2LAorCU5FVF9JUFY0X1JPVVRFX01JTl9BRFZNU1M9MTcsCisJTkVUX0lQVjRfUk9VVEVfU0VDUkVUX0lOVEVSVkFMPTE4LAorCU5FVF9JUFY0X1JPVVRFX0dDX01JTl9JTlRFUlZBTF9NUz0xOSwKK307CisKK2VudW0KK3sKKwlORVRfUFJPVE9fQ09ORl9BTEw9LTIsCisJTkVUX1BST1RPX0NPTkZfREVGQVVMVD0tMworCisJLyogQW5kIGRldmljZSBpZmluZGljZXMgLi4uICovCit9OworCitlbnVtCit7CisJTkVUX0lQVjRfQ09ORl9GT1JXQVJESU5HPTEsCisJTkVUX0lQVjRfQ09ORl9NQ19GT1JXQVJESU5HPTIsCisJTkVUX0lQVjRfQ09ORl9QUk9YWV9BUlA9MywKKwlORVRfSVBWNF9DT05GX0FDQ0VQVF9SRURJUkVDVFM9NCwKKwlORVRfSVBWNF9DT05GX1NFQ1VSRV9SRURJUkVDVFM9NSwKKwlORVRfSVBWNF9DT05GX1NFTkRfUkVESVJFQ1RTPTYsCisJTkVUX0lQVjRfQ09ORl9TSEFSRURfTUVESUE9NywKKwlORVRfSVBWNF9DT05GX1JQX0ZJTFRFUj04LAorCU5FVF9JUFY0X0NPTkZfQUNDRVBUX1NPVVJDRV9ST1VURT05LAorCU5FVF9JUFY0X0NPTkZfQk9PVFBfUkVMQVk9MTAsCisJTkVUX0lQVjRfQ09ORl9MT0dfTUFSVElBTlM9MTEsCisJTkVUX0lQVjRfQ09ORl9UQUc9MTIsCisJTkVUX0lQVjRfQ09ORl9BUlBGSUxURVI9MTMsCisJTkVUX0lQVjRfQ09ORl9NRURJVU1fSUQ9MTQsCisJTkVUX0lQVjRfQ09ORl9OT1hGUk09MTUsCisJTkVUX0lQVjRfQ09ORl9OT1BPTElDWT0xNiwKKwlORVRfSVBWNF9DT05GX0ZPUkNFX0lHTVBfVkVSU0lPTj0xNywKKwlORVRfSVBWNF9DT05GX0FSUF9BTk5PVU5DRT0xOCwKKwlORVRfSVBWNF9DT05GX0FSUF9JR05PUkU9MTksCisJTkVUX0lQVjRfQ09ORl9QUk9NT1RFX1NFQ09OREFSSUVTPTIwLAorCU5FVF9JUFY0X0NPTkZfQVJQX0FDQ0VQVD0yMSwKKwlORVRfSVBWNF9DT05GX0FSUF9OT1RJRlk9MjIsCit9OworCisvKiAvcHJvYy9zeXMvbmV0L2lwdjQvbmV0ZmlsdGVyICovCitlbnVtCit7CisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX01BWD0xLAorCU5FVF9JUFY0X05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9TWU5fU0VOVD0yLAorCU5FVF9JUFY0X05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9TWU5fUkVDVj0zLAorCU5FVF9JUFY0X05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9FU1RBQkxJU0hFRD00LAorCU5FVF9JUFY0X05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9GSU5fV0FJVD01LAorCU5FVF9JUFY0X05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9DTE9TRV9XQUlUPTYsCisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0xBU1RfQUNLPTcsCisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX1RJTUVfV0FJVD04LAorCU5FVF9JUFY0X05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9DTE9TRT05LAorCU5FVF9JUFY0X05GX0NPTk5UUkFDS19VRFBfVElNRU9VVD0xMCwKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfVURQX1RJTUVPVVRfU1RSRUFNPTExLAorCU5FVF9JUFY0X05GX0NPTk5UUkFDS19JQ01QX1RJTUVPVVQ9MTIsCisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX0dFTkVSSUNfVElNRU9VVD0xMywKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfQlVDS0VUUz0xNCwKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfTE9HX0lOVkFMSUQ9MTUsCisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX01BWF9SRVRSQU5TPTE2LAorCU5FVF9JUFY0X05GX0NPTk5UUkFDS19UQ1BfTE9PU0U9MTcsCisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9CRV9MSUJFUkFMPTE4LAorCU5FVF9JUFY0X05GX0NPTk5UUkFDS19UQ1BfTUFYX1JFVFJBTlM9MTksCisgCU5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfQ0xPU0VEPTIwLAorIAlORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX0NPT0tJRV9XQUlUPTIxLAorIAlORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX0NPT0tJRV9FQ0hPRUQ9MjIsCisgCU5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfRVNUQUJMSVNIRUQ9MjMsCisgCU5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfU0hVVERPV05fU0VOVD0yNCwKKyAJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1NDVFBfVElNRU9VVF9TSFVURE9XTl9SRUNEPTI1LAorIAlORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX1NIVVRET1dOX0FDS19TRU5UPTI2LAorCU5FVF9JUFY0X05GX0NPTk5UUkFDS19DT1VOVD0yNywKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfQ0hFQ0tTVU09MjgsCit9OworIAorLyogL3Byb2Mvc3lzL25ldC9pcHY2ICovCitlbnVtIHsKKwlORVRfSVBWNl9DT05GPTE2LAorCU5FVF9JUFY2X05FSUdIPTE3LAorCU5FVF9JUFY2X1JPVVRFPTE4LAorCU5FVF9JUFY2X0lDTVA9MTksCisJTkVUX0lQVjZfQklORFY2T05MWT0yMCwKKwlORVRfSVBWNl9JUDZGUkFHX0hJR0hfVEhSRVNIPTIxLAorCU5FVF9JUFY2X0lQNkZSQUdfTE9XX1RIUkVTSD0yMiwKKwlORVRfSVBWNl9JUDZGUkFHX1RJTUU9MjMsCisJTkVUX0lQVjZfSVA2RlJBR19TRUNSRVRfSU5URVJWQUw9MjQsCisJTkVUX0lQVjZfTUxEX01BWF9NU0Y9MjUsCit9OworCitlbnVtIHsKKwlORVRfSVBWNl9ST1VURV9GTFVTSD0xLAorCU5FVF9JUFY2X1JPVVRFX0dDX1RIUkVTSD0yLAorCU5FVF9JUFY2X1JPVVRFX01BWF9TSVpFPTMsCisJTkVUX0lQVjZfUk9VVEVfR0NfTUlOX0lOVEVSVkFMPTQsCisJTkVUX0lQVjZfUk9VVEVfR0NfVElNRU9VVD01LAorCU5FVF9JUFY2X1JPVVRFX0dDX0lOVEVSVkFMPTYsCisJTkVUX0lQVjZfUk9VVEVfR0NfRUxBU1RJQ0lUWT03LAorCU5FVF9JUFY2X1JPVVRFX01UVV9FWFBJUkVTPTgsCisJTkVUX0lQVjZfUk9VVEVfTUlOX0FEVk1TUz05LAorCU5FVF9JUFY2X1JPVVRFX0dDX01JTl9JTlRFUlZBTF9NUz0xMAorfTsKKworZW51bSB7CisJTkVUX0lQVjZfRk9SV0FSRElORz0xLAorCU5FVF9JUFY2X0hPUF9MSU1JVD0yLAorCU5FVF9JUFY2X01UVT0zLAorCU5FVF9JUFY2X0FDQ0VQVF9SQT00LAorCU5FVF9JUFY2X0FDQ0VQVF9SRURJUkVDVFM9NSwKKwlORVRfSVBWNl9BVVRPQ09ORj02LAorCU5FVF9JUFY2X0RBRF9UUkFOU01JVFM9NywKKwlORVRfSVBWNl9SVFJfU09MSUNJVFM9OCwKKwlORVRfSVBWNl9SVFJfU09MSUNJVF9JTlRFUlZBTD05LAorCU5FVF9JUFY2X1JUUl9TT0xJQ0lUX0RFTEFZPTEwLAorCU5FVF9JUFY2X1VTRV9URU1QQUREUj0xMSwKKwlORVRfSVBWNl9URU1QX1ZBTElEX0xGVD0xMiwKKwlORVRfSVBWNl9URU1QX1BSRUZFUkVEX0xGVD0xMywKKwlORVRfSVBWNl9SRUdFTl9NQVhfUkVUUlk9MTQsCisJTkVUX0lQVjZfTUFYX0RFU1lOQ19GQUNUT1I9MTUsCisJTkVUX0lQVjZfTUFYX0FERFJFU1NFUz0xNiwKKwlORVRfSVBWNl9GT1JDRV9NTERfVkVSU0lPTj0xNywKKwlORVRfSVBWNl9BQ0NFUFRfUkFfREVGUlRSPTE4LAorCU5FVF9JUFY2X0FDQ0VQVF9SQV9QSU5GTz0xOSwKKwlORVRfSVBWNl9BQ0NFUFRfUkFfUlRSX1BSRUY9MjAsCisJTkVUX0lQVjZfUlRSX1BST0JFX0lOVEVSVkFMPTIxLAorCU5FVF9JUFY2X0FDQ0VQVF9SQV9SVF9JTkZPX01BWF9QTEVOPTIyLAorCU5FVF9JUFY2X1BST1hZX05EUD0yMywKKwlORVRfSVBWNl9BQ0NFUFRfU09VUkNFX1JPVVRFPTI1LAorCV9fTkVUX0lQVjZfTUFYCit9OworCisvKiAvcHJvYy9zeXMvbmV0L2lwdjYvaWNtcCAqLworZW51bSB7CisJTkVUX0lQVjZfSUNNUF9SQVRFTElNSVQ9MQorfTsKKworLyogL3Byb2Mvc3lzL25ldC88cHJvdG9jb2w+L25laWdoLzxkZXY+ICovCitlbnVtIHsKKwlORVRfTkVJR0hfTUNBU1RfU09MSUNJVD0xLAorCU5FVF9ORUlHSF9VQ0FTVF9TT0xJQ0lUPTIsCisJTkVUX05FSUdIX0FQUF9TT0xJQ0lUPTMsCisJTkVUX05FSUdIX1JFVFJBTlNfVElNRT00LAorCU5FVF9ORUlHSF9SRUFDSEFCTEVfVElNRT01LAorCU5FVF9ORUlHSF9ERUxBWV9QUk9CRV9USU1FPTYsCisJTkVUX05FSUdIX0dDX1NUQUxFX1RJTUU9NywKKwlORVRfTkVJR0hfVU5SRVNfUUxFTj04LAorCU5FVF9ORUlHSF9QUk9YWV9RTEVOPTksCisJTkVUX05FSUdIX0FOWUNBU1RfREVMQVk9MTAsCisJTkVUX05FSUdIX1BST1hZX0RFTEFZPTExLAorCU5FVF9ORUlHSF9MT0NLVElNRT0xMiwKKwlORVRfTkVJR0hfR0NfSU5URVJWQUw9MTMsCisJTkVUX05FSUdIX0dDX1RIUkVTSDE9MTQsCisJTkVUX05FSUdIX0dDX1RIUkVTSDI9MTUsCisJTkVUX05FSUdIX0dDX1RIUkVTSDM9MTYsCisJTkVUX05FSUdIX1JFVFJBTlNfVElNRV9NUz0xNywKKwlORVRfTkVJR0hfUkVBQ0hBQkxFX1RJTUVfTVM9MTgsCit9OworCisvKiAvcHJvYy9zeXMvbmV0L2RjY3AgKi8KK2VudW0geworCU5FVF9EQ0NQX0RFRkFVTFQ9MSwKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvaXB4ICovCitlbnVtIHsKKwlORVRfSVBYX1BQUk9QX0JST0FEQ0FTVElORz0xLAorCU5FVF9JUFhfRk9SV0FSRElORz0yCit9OworCisvKiAvcHJvYy9zeXMvbmV0L2xsYyAqLworZW51bSB7CisJTkVUX0xMQzI9MSwKKwlORVRfTExDX1NUQVRJT049MiwKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvbGxjL2xsYzIgKi8KK2VudW0geworCU5FVF9MTEMyX1RJTUVPVVQ9MSwKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvbGxjL3N0YXRpb24gKi8KK2VudW0geworCU5FVF9MTENfU1RBVElPTl9BQ0tfVElNRU9VVD0xLAorfTsKKworLyogL3Byb2Mvc3lzL25ldC9sbGMvbGxjMi90aW1lb3V0ICovCitlbnVtIHsKKwlORVRfTExDMl9BQ0tfVElNRU9VVD0xLAorCU5FVF9MTEMyX1BfVElNRU9VVD0yLAorCU5FVF9MTEMyX1JFSl9USU1FT1VUPTMsCisJTkVUX0xMQzJfQlVTWV9USU1FT1VUPTQsCit9OworCisvKiAvcHJvYy9zeXMvbmV0L2FwcGxldGFsayAqLworZW51bSB7CisJTkVUX0FUQUxLX0FBUlBfRVhQSVJZX1RJTUU9MSwKKwlORVRfQVRBTEtfQUFSUF9USUNLX1RJTUU9MiwKKwlORVRfQVRBTEtfQUFSUF9SRVRSQU5TTUlUX0xJTUlUPTMsCisJTkVUX0FUQUxLX0FBUlBfUkVTT0xWRV9USU1FPTQKK307CisKKworLyogL3Byb2Mvc3lzL25ldC9uZXRyb20gKi8KK2VudW0geworCU5FVF9ORVRST01fREVGQVVMVF9QQVRIX1FVQUxJVFk9MSwKKwlORVRfTkVUUk9NX09CU09MRVNDRU5DRV9DT1VOVF9JTklUSUFMSVNFUj0yLAorCU5FVF9ORVRST01fTkVUV09SS19UVExfSU5JVElBTElTRVI9MywKKwlORVRfTkVUUk9NX1RSQU5TUE9SVF9USU1FT1VUPTQsCisJTkVUX05FVFJPTV9UUkFOU1BPUlRfTUFYSU1VTV9UUklFUz01LAorCU5FVF9ORVRST01fVFJBTlNQT1JUX0FDS05PV0xFREdFX0RFTEFZPTYsCisJTkVUX05FVFJPTV9UUkFOU1BPUlRfQlVTWV9ERUxBWT03LAorCU5FVF9ORVRST01fVFJBTlNQT1JUX1JFUVVFU1RFRF9XSU5ET1dfU0laRT04LAorCU5FVF9ORVRST01fVFJBTlNQT1JUX05PX0FDVElWSVRZX1RJTUVPVVQ9OSwKKwlORVRfTkVUUk9NX1JPVVRJTkdfQ09OVFJPTD0xMCwKKwlORVRfTkVUUk9NX0xJTktfRkFJTFNfQ09VTlQ9MTEsCisJTkVUX05FVFJPTV9SRVNFVD0xMgorfTsKKworLyogL3Byb2Mvc3lzL25ldC9heDI1ICovCitlbnVtIHsKKwlORVRfQVgyNV9JUF9ERUZBVUxUX01PREU9MSwKKwlORVRfQVgyNV9ERUZBVUxUX01PREU9MiwKKwlORVRfQVgyNV9CQUNLT0ZGX1RZUEU9MywKKwlORVRfQVgyNV9DT05ORUNUX01PREU9NCwKKwlORVRfQVgyNV9TVEFOREFSRF9XSU5ET1c9NSwKKwlORVRfQVgyNV9FWFRFTkRFRF9XSU5ET1c9NiwKKwlORVRfQVgyNV9UMV9USU1FT1VUPTcsCisJTkVUX0FYMjVfVDJfVElNRU9VVD04LAorCU5FVF9BWDI1X1QzX1RJTUVPVVQ9OSwKKwlORVRfQVgyNV9JRExFX1RJTUVPVVQ9MTAsCisJTkVUX0FYMjVfTjI9MTEsCisJTkVUX0FYMjVfUEFDTEVOPTEyLAorCU5FVF9BWDI1X1BST1RPQ09MPTEzLAorCU5FVF9BWDI1X0RBTUFfU0xBVkVfVElNRU9VVD0xNAorfTsKKworLyogL3Byb2Mvc3lzL25ldC9yb3NlICovCitlbnVtIHsKKwlORVRfUk9TRV9SRVNUQVJUX1JFUVVFU1RfVElNRU9VVD0xLAorCU5FVF9ST1NFX0NBTExfUkVRVUVTVF9USU1FT1VUPTIsCisJTkVUX1JPU0VfUkVTRVRfUkVRVUVTVF9USU1FT1VUPTMsCisJTkVUX1JPU0VfQ0xFQVJfUkVRVUVTVF9USU1FT1VUPTQsCisJTkVUX1JPU0VfQUNLX0hPTERfQkFDS19USU1FT1VUPTUsCisJTkVUX1JPU0VfUk9VVElOR19DT05UUk9MPTYsCisJTkVUX1JPU0VfTElOS19GQUlMX1RJTUVPVVQ9NywKKwlORVRfUk9TRV9NQVhfVkNTPTgsCisJTkVUX1JPU0VfV0lORE9XX1NJWkU9OSwKKwlORVRfUk9TRV9OT19BQ1RJVklUWV9USU1FT1VUPTEwCit9OworCisvKiAvcHJvYy9zeXMvbmV0L3gyNSAqLworZW51bSB7CisJTkVUX1gyNV9SRVNUQVJUX1JFUVVFU1RfVElNRU9VVD0xLAorCU5FVF9YMjVfQ0FMTF9SRVFVRVNUX1RJTUVPVVQ9MiwKKwlORVRfWDI1X1JFU0VUX1JFUVVFU1RfVElNRU9VVD0zLAorCU5FVF9YMjVfQ0xFQVJfUkVRVUVTVF9USU1FT1VUPTQsCisJTkVUX1gyNV9BQ0tfSE9MRF9CQUNLX1RJTUVPVVQ9NSwKKwlORVRfWDI1X0ZPUldBUkQ9NgorfTsKKworLyogL3Byb2Mvc3lzL25ldC90b2tlbi1yaW5nICovCitlbnVtCit7CisJTkVUX1RSX1JJRl9USU1FT1VUPTEKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvZGVjbmV0LyAqLworZW51bSB7CisJTkVUX0RFQ05FVF9OT0RFX1RZUEUgPSAxLAorCU5FVF9ERUNORVRfTk9ERV9BRERSRVNTID0gMiwKKwlORVRfREVDTkVUX05PREVfTkFNRSA9IDMsCisJTkVUX0RFQ05FVF9ERUZBVUxUX0RFVklDRSA9IDQsCisJTkVUX0RFQ05FVF9USU1FX1dBSVQgPSA1LAorCU5FVF9ERUNORVRfRE5fQ09VTlQgPSA2LAorCU5FVF9ERUNORVRfRElfQ09VTlQgPSA3LAorCU5FVF9ERUNORVRfRFJfQ09VTlQgPSA4LAorCU5FVF9ERUNORVRfRFNUX0dDX0lOVEVSVkFMID0gOSwKKwlORVRfREVDTkVUX0NPTkYgPSAxMCwKKwlORVRfREVDTkVUX05PX0ZDX01BWF9DV05EID0gMTEsCisJTkVUX0RFQ05FVF9NRU0gPSAxMiwKKwlORVRfREVDTkVUX1JNRU0gPSAxMywKKwlORVRfREVDTkVUX1dNRU0gPSAxNCwKKwlORVRfREVDTkVUX0RFQlVHX0xFVkVMID0gMjU1Cit9OworCisvKiAvcHJvYy9zeXMvbmV0L2RlY25ldC9jb25mLzxkZXY+ICovCitlbnVtIHsKKwlORVRfREVDTkVUX0NPTkZfTE9PUEJBQ0sgPSAtMiwKKwlORVRfREVDTkVUX0NPTkZfRERDTVAgPSAtMywKKwlORVRfREVDTkVUX0NPTkZfUFBQID0gLTQsCisJTkVUX0RFQ05FVF9DT05GX1gyNSA9IC01LAorCU5FVF9ERUNORVRfQ09ORl9HUkUgPSAtNiwKKwlORVRfREVDTkVUX0NPTkZfRVRIRVIgPSAtNworCisJLyogLi4uIGFuZCBpZmluZGV4IG9mIGRldmljZXMgKi8KK307CisKKy8qIC9wcm9jL3N5cy9uZXQvZGVjbmV0L2NvbmYvPGRldj4vICovCitlbnVtIHsKKwlORVRfREVDTkVUX0NPTkZfREVWX1BSSU9SSVRZID0gMSwKKwlORVRfREVDTkVUX0NPTkZfREVWX1QxID0gMiwKKwlORVRfREVDTkVUX0NPTkZfREVWX1QyID0gMywKKwlORVRfREVDTkVUX0NPTkZfREVWX1QzID0gNCwKKwlORVRfREVDTkVUX0NPTkZfREVWX0ZPUldBUkRJTkcgPSA1LAorCU5FVF9ERUNORVRfQ09ORl9ERVZfQkxLU0laRSA9IDYsCisJTkVUX0RFQ05FVF9DT05GX0RFVl9TVEFURSA9IDcKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvc2N0cCAqLworZW51bSB7CisJTkVUX1NDVFBfUlRPX0lOSVRJQUwgPSAxLAorCU5FVF9TQ1RQX1JUT19NSU4gICAgID0gMiwKKwlORVRfU0NUUF9SVE9fTUFYICAgICA9IDMsCisJTkVUX1NDVFBfUlRPX0FMUEhBICAgPSA0LAorCU5FVF9TQ1RQX1JUT19CRVRBICAgID0gNSwKKwlORVRfU0NUUF9WQUxJRF9DT09LSUVfTElGRSAgICAgICA9ICA2LAorCU5FVF9TQ1RQX0FTU09DSUFUSU9OX01BWF9SRVRSQU5TID0gIDcsCisJTkVUX1NDVFBfUEFUSF9NQVhfUkVUUkFOUyAgICAgICAgPSAgOCwKKwlORVRfU0NUUF9NQVhfSU5JVF9SRVRSQU5TTUlUUyAgICA9ICA5LAorCU5FVF9TQ1RQX0hCX0lOVEVSVkFMICAgICAgICAgICAgID0gMTAsCisJTkVUX1NDVFBfUFJFU0VSVkVfRU5BQkxFICAgICAgICAgPSAxMSwKKwlORVRfU0NUUF9NQVhfQlVSU1QgICAgICAgICAgICAgICA9IDEyLAorCU5FVF9TQ1RQX0FERElQX0VOQUJMRQkJID0gMTMsCisJTkVUX1NDVFBfUFJTQ1RQX0VOQUJMRQkJID0gMTQsCisJTkVUX1NDVFBfU05EQlVGX1BPTElDWQkJID0gMTUsCisJTkVUX1NDVFBfU0FDS19USU1FT1VUCQkgPSAxNiwKKwlORVRfU0NUUF9SQ1ZCVUZfUE9MSUNZCQkgPSAxNywKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvYnJpZGdlICovCitlbnVtIHsKKwlORVRfQlJJREdFX05GX0NBTExfQVJQVEFCTEVTID0gMSwKKwlORVRfQlJJREdFX05GX0NBTExfSVBUQUJMRVMgPSAyLAorCU5FVF9CUklER0VfTkZfQ0FMTF9JUDZUQUJMRVMgPSAzLAorCU5FVF9CUklER0VfTkZfRklMVEVSX1ZMQU5fVEFHR0VEID0gNCwKKwlORVRfQlJJREdFX05GX0ZJTFRFUl9QUFBPRV9UQUdHRUQgPSA1LAorfTsKKworLyogcHJvYy9zeXMvbmV0L2lyZGEgKi8KK2VudW0geworCU5FVF9JUkRBX0RJU0NPVkVSWT0xLAorCU5FVF9JUkRBX0RFVk5BTUU9MiwKKwlORVRfSVJEQV9ERUJVRz0zLAorCU5FVF9JUkRBX0ZBU1RfUE9MTD00LAorCU5FVF9JUkRBX0RJU0NPVkVSWV9TTE9UUz01LAorCU5FVF9JUkRBX0RJU0NPVkVSWV9USU1FT1VUPTYsCisJTkVUX0lSREFfU0xPVF9USU1FT1VUPTcsCisJTkVUX0lSREFfTUFYX0JBVURfUkFURT04LAorCU5FVF9JUkRBX01JTl9UWF9UVVJOX1RJTUU9OSwKKwlORVRfSVJEQV9NQVhfVFhfREFUQV9TSVpFPTEwLAorCU5FVF9JUkRBX01BWF9UWF9XSU5ET1c9MTEsCisJTkVUX0lSREFfTUFYX05PUkVQTFlfVElNRT0xMiwKKwlORVRfSVJEQV9XQVJOX05PUkVQTFlfVElNRT0xMywKKwlORVRfSVJEQV9MQVBfS0VFUEFMSVZFX1RJTUU9MTQsCit9OworCisKKy8qIENUTF9GUyBuYW1lczogKi8KK2VudW0KK3sKKwlGU19OUklOT0RFPTEsCS8qIGludDpjdXJyZW50IG51bWJlciBvZiBhbGxvY2F0ZWQgaW5vZGVzICovCisJRlNfU1RBVElOT0RFPTIsCisJRlNfTUFYSU5PREU9MywJLyogaW50Om1heGltdW0gbnVtYmVyIG9mIGlub2RlcyB0aGF0IGNhbiBiZSBhbGxvY2F0ZWQgKi8KKwlGU19OUkRRVU9UPTQsCS8qIGludDpjdXJyZW50IG51bWJlciBvZiBhbGxvY2F0ZWQgZHF1b3RzICovCisJRlNfTUFYRFFVT1Q9NSwJLyogaW50Om1heGltdW0gbnVtYmVyIG9mIGRxdW90cyB0aGF0IGNhbiBiZSBhbGxvY2F0ZWQgKi8KKwlGU19OUkZJTEU9NiwJLyogaW50OmN1cnJlbnQgbnVtYmVyIG9mIGFsbG9jYXRlZCBmaWxlZGVzY3JpcHRvcnMgKi8KKwlGU19NQVhGSUxFPTcsCS8qIGludDptYXhpbXVtIG51bWJlciBvZiBmaWxlZGVzY3JpcHRvcnMgdGhhdCBjYW4gYmUgYWxsb2NhdGVkICovCisJRlNfREVOVFJZPTgsCisJRlNfTlJTVVBFUj05LAkvKiBpbnQ6Y3VycmVudCBudW1iZXIgb2YgYWxsb2NhdGVkIHN1cGVyX2Jsb2NrcyAqLworCUZTX01BWFNVUEVSPTEwLAkvKiBpbnQ6bWF4aW11bSBudW1iZXIgb2Ygc3VwZXJfYmxvY2tzIHRoYXQgY2FuIGJlIGFsbG9jYXRlZCAqLworCUZTX09WRVJGTE9XVUlEPTExLAkvKiBpbnQ6IG92ZXJmbG93IFVJRCAqLworCUZTX09WRVJGTE9XR0lEPTEyLAkvKiBpbnQ6IG92ZXJmbG93IEdJRCAqLworCUZTX0xFQVNFUz0xMywJLyogaW50OiBsZWFzZXMgZW5hYmxlZCAqLworCUZTX0RJUl9OT1RJRlk9MTQsCS8qIGludDogZGlyZWN0b3J5IG5vdGlmaWNhdGlvbiBlbmFibGVkICovCisJRlNfTEVBU0VfVElNRT0xNSwJLyogaW50OiBtYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3IgYSBsZWFzZSBicmVhayAqLworCUZTX0RRU1RBVFM9MTYsCS8qIGRpc2MgcXVvdGEgdXNhZ2Ugc3RhdGlzdGljcyBhbmQgY29udHJvbCAqLworCUZTX1hGUz0xNywJLyogc3RydWN0OiBjb250cm9sIHhmcyBwYXJhbWV0ZXJzICovCisJRlNfQUlPX05SPTE4LAkvKiBjdXJyZW50IHN5c3RlbS13aWRlIG51bWJlciBvZiBhaW8gcmVxdWVzdHMgKi8KKwlGU19BSU9fTUFYX05SPTE5LAkvKiBzeXN0ZW0td2lkZSBtYXhpbXVtIG51bWJlciBvZiBhaW8gcmVxdWVzdHMgKi8KKwlGU19JTk9USUZZPTIwLAkvKiBpbm90aWZ5IHN1Ym1lbnUgKi8KKwlGU19PQ0ZTMj05ODgsCS8qIG9jZnMyICovCit9OworCisvKiAvcHJvYy9zeXMvZnMvcXVvdGEvICovCitlbnVtIHsKKwlGU19EUV9MT09LVVBTID0gMSwKKwlGU19EUV9EUk9QUyA9IDIsCisJRlNfRFFfUkVBRFMgPSAzLAorCUZTX0RRX1dSSVRFUyA9IDQsCisJRlNfRFFfQ0FDSEVfSElUUyA9IDUsCisJRlNfRFFfQUxMT0NBVEVEID0gNiwKKwlGU19EUV9GUkVFID0gNywKKwlGU19EUV9TWU5DUyA9IDgsCisJRlNfRFFfV0FSTklOR1MgPSA5LAorfTsKKworLyogQ1RMX0RFQlVHIG5hbWVzOiAqLworCisvKiBDVExfREVWIG5hbWVzOiAqLworZW51bSB7CisJREVWX0NEUk9NPTEsCisJREVWX0hXTU9OPTIsCisJREVWX1BBUlBPUlQ9MywKKwlERVZfUkFJRD00LAorCURFVl9NQUNfSElEPTUsCisJREVWX1NDU0k9NiwKKwlERVZfSVBNST03LAorfTsKKworLyogL3Byb2Mvc3lzL2Rldi9jZHJvbSAqLworZW51bSB7CisJREVWX0NEUk9NX0lORk89MSwKKwlERVZfQ0RST01fQVVUT0NMT1NFPTIsCisJREVWX0NEUk9NX0FVVE9FSkVDVD0zLAorCURFVl9DRFJPTV9ERUJVRz00LAorCURFVl9DRFJPTV9MT0NLPTUsCisJREVWX0NEUk9NX0NIRUNLX01FRElBPTYKK307CisKKy8qIC9wcm9jL3N5cy9kZXYvcGFycG9ydCAqLworZW51bSB7CisJREVWX1BBUlBPUlRfREVGQVVMVD0tMworfTsKKworLyogL3Byb2Mvc3lzL2Rldi9yYWlkICovCitlbnVtIHsKKwlERVZfUkFJRF9TUEVFRF9MSU1JVF9NSU49MSwKKwlERVZfUkFJRF9TUEVFRF9MSU1JVF9NQVg9MgorfTsKKworLyogL3Byb2Mvc3lzL2Rldi9wYXJwb3J0L2RlZmF1bHQgKi8KK2VudW0geworCURFVl9QQVJQT1JUX0RFRkFVTFRfVElNRVNMSUNFPTEsCisJREVWX1BBUlBPUlRfREVGQVVMVF9TUElOVElNRT0yCit9OworCisvKiAvcHJvYy9zeXMvZGV2L3BhcnBvcnQvcGFycG9ydCBuICovCitlbnVtIHsKKwlERVZfUEFSUE9SVF9TUElOVElNRT0xLAorCURFVl9QQVJQT1JUX0JBU0VfQUREUj0yLAorCURFVl9QQVJQT1JUX0lSUT0zLAorCURFVl9QQVJQT1JUX0RNQT00LAorCURFVl9QQVJQT1JUX01PREVTPTUsCisJREVWX1BBUlBPUlRfREVWSUNFUz02LAorCURFVl9QQVJQT1JUX0FVVE9QUk9CRT0xNgorfTsKKworLyogL3Byb2Mvc3lzL2Rldi9wYXJwb3J0L3BhcnBvcnQgbi9kZXZpY2VzLyAqLworZW51bSB7CisJREVWX1BBUlBPUlRfREVWSUNFU19BQ1RJVkU9LTMsCit9OworCisvKiAvcHJvYy9zeXMvZGV2L3BhcnBvcnQvcGFycG9ydCBuL2RldmljZXMvZGV2aWNlIG4gKi8KK2VudW0geworCURFVl9QQVJQT1JUX0RFVklDRV9USU1FU0xJQ0U9MSwKK307CisKKy8qIC9wcm9jL3N5cy9kZXYvbWFjX2hpZCAqLworZW51bSB7CisJREVWX01BQ19ISURfS0VZQk9BUkRfU0VORFNfTElOVVhfS0VZQ09ERVM9MSwKKwlERVZfTUFDX0hJRF9LRVlCT0FSRF9MT0NLX0tFWUNPREVTPTIsCisJREVWX01BQ19ISURfTU9VU0VfQlVUVE9OX0VNVUxBVElPTj0zLAorCURFVl9NQUNfSElEX01PVVNFX0JVVFRPTjJfS0VZQ09ERT00LAorCURFVl9NQUNfSElEX01PVVNFX0JVVFRPTjNfS0VZQ09ERT01LAorCURFVl9NQUNfSElEX0FEQl9NT1VTRV9TRU5EU19LRVlDT0RFUz02Cit9OworCisvKiAvcHJvYy9zeXMvZGV2L3Njc2kgKi8KK2VudW0geworCURFVl9TQ1NJX0xPR0dJTkdfTEVWRUw9MSwKK307CisKKy8qIC9wcm9jL3N5cy9kZXYvaXBtaSAqLworZW51bSB7CisJREVWX0lQTUlfUE9XRVJPRkZfUE9XRVJDWUNMRT0xLAorfTsKKworLyogL3Byb2Mvc3lzL2FiaSAqLworZW51bQoreworCUFCSV9ERUZIQU5ETEVSX0NPRkY9MSwJLyogZGVmYXVsdCBoYW5kbGVyIGZvciBjb2ZmIGJpbmFyaWVzICovCisJQUJJX0RFRkhBTkRMRVJfRUxGPTIsIAkvKiBkZWZhdWx0IGhhbmRsZXIgZm9yIEVMRiBiaW5hcmllcyAqLworCUFCSV9ERUZIQU5ETEVSX0xDQUxMNz0zLC8qIGRlZmF1bHQgaGFuZGxlciBmb3IgcHJvY3MgdXNpbmcgbGNhbGw3ICovCisJQUJJX0RFRkhBTkRMRVJfTElCQ1NPPTQsLyogZGVmYXVsdCBoYW5kbGVyIGZvciBhbiBsaWJjLnNvIEVMRiBpbnRlcnAgKi8KKwlBQklfVFJBQ0U9NSwJCS8qIHRyYWNpbmcgZmxhZ3MgKi8KKwlBQklfRkFLRV9VVFNOQU1FPTYsCS8qIGZha2UgdGFyZ2V0IHV0c25hbWUgaW5mb3JtYXRpb24gKi8KK307CisKKworI2VuZGlmIC8qIF9MSU5VWF9TWVNDVExfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90YXNrc3RhdHMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGFza3N0YXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2NmU1NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGFza3N0YXRzLmgKQEAgLTAsMCArMSwyMTMgQEAKKy8qIHRhc2tzdGF0cy5oIC0gZXhwb3J0aW5nIHBlci10YXNrIHN0YXRpc3RpY3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIFNoYWlsYWJoIE5hZ2FyLCBJQk0gQ29ycC4gMjAwNgorICogICAgICAgICAgIChDKSBCYWxiaXIgU2luZ2gsICAgSUJNIENvcnAuIDIwMDYKKyAqICAgICAgICAgICAoQykgSmF5IExhbiwgICAgICAgIFNHSSwgMjAwNgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyLjEgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9UQVNLU1RBVFNfSAorI2RlZmluZSBfTElOVVhfVEFTS1NUQVRTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIEZvcm1hdCBmb3IgcGVyLXRhc2sgZGF0YSByZXR1cm5lZCB0byB1c2VybGFuZCB3aGVuCisgKgktIGEgdGFzayBleGl0cworICoJLSBsaXN0ZW5lciByZXF1ZXN0cyBzdGF0cyBmb3IgYSB0YXNrCisgKgorICogVGhlIHN0cnVjdCBpcyB2ZXJzaW9uZWQuIE5ld2VyIHZlcnNpb25zIHNob3VsZCBvbmx5IGFkZCBmaWVsZHMgdG8KKyAqIHRoZSBib3R0b20gb2YgdGhlIHN0cnVjdCB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICoKKyAqCisgKiBUbyBhZGQgbmV3IGZpZWxkcworICoJYSkgYnVtcCB1cCBUQVNLU1RBVFNfVkVSU0lPTgorICoJYikgYWRkIGNvbW1lbnQgaW5kaWNhdGluZyBuZXcgdmVyc2lvbiBudW1iZXIgYXQgZW5kIG9mIHN0cnVjdAorICoJYykgYWRkIG5ldyBmaWVsZHMgYWZ0ZXIgdmVyc2lvbiBjb21tZW50OyBtYWludGFpbiA2NC1iaXQgYWxpZ25tZW50CisgKi8KKworCisjZGVmaW5lIFRBU0tTVEFUU19WRVJTSU9OCTgKKyNkZWZpbmUgVFNfQ09NTV9MRU4JCTMyCS8qIHNob3VsZCBiZSA+PSBUQVNLX0NPTU1fTEVOCisJCQkJCSAqIGluIGxpbnV4L3NjaGVkLmggKi8KKworc3RydWN0IHRhc2tzdGF0cyB7CisKKwkvKiBUaGUgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBzdHJ1Y3QuIFRoaXMgZmllbGQgaXMgYWx3YXlzIHNldCB0bworCSAqIFRBS1NUQVRTX1ZFUlNJT04sIHdoaWNoIGlzIGRlZmluZWQgaW4gPGxpbnV4L3Rhc2tzdGF0cy5oPi4KKwkgKiBFYWNoIHRpbWUgdGhlIHN0cnVjdCBpcyBjaGFuZ2VkLCB0aGUgdmFsdWUgc2hvdWxkIGJlIGluY3JlbWVudGVkLgorCSAqLworCV9fdTE2CXZlcnNpb247CisJX191MzIJYWNfZXhpdGNvZGU7CQkvKiBFeGl0IHN0YXR1cyAqLworCisJLyogVGhlIGFjY291bnRpbmcgZmxhZ3Mgb2YgYSB0YXNrIGFzIGRlZmluZWQgaW4gPGxpbnV4L2FjY3QuaD4KKwkgKiBEZWZpbmVkIHZhbHVlcyBhcmUgQUZPUkssIEFTVSwgQUNPTVBBVCwgQUNPUkUsIGFuZCBBWFNJRy4KKwkgKi8KKwlfX3U4CWFjX2ZsYWc7CQkvKiBSZWNvcmQgZmxhZ3MgKi8KKwlfX3U4CWFjX25pY2U7CQkvKiB0YXNrX25pY2UgKi8KKworCS8qIERlbGF5IGFjY291bnRpbmcgZmllbGRzIHN0YXJ0CisJICoKKwkgKiBBbGwgdmFsdWVzLCB1bnRpbCBjb21tZW50ICJEZWxheSBhY2NvdW50aW5nIGZpZWxkcyBlbmQiIGFyZQorCSAqIGF2YWlsYWJsZSBvbmx5IGlmIGRlbGF5IGFjY291bnRpbmcgaXMgZW5hYmxlZCwgZXZlbiB0aG91Z2ggdGhlIGxhc3QKKwkgKiBmZXcgZmllbGRzIGFyZSBub3QgZGVsYXlzCisJICoKKwkgKiB4eHhfY291bnQgaXMgdGhlIG51bWJlciBvZiBkZWxheSB2YWx1ZXMgcmVjb3JkZWQKKwkgKiB4eHhfZGVsYXlfdG90YWwgaXMgdGhlIGNvcnJlc3BvbmRpbmcgY3VtdWxhdGl2ZSBkZWxheSBpbiBuYW5vc2Vjb25kcworCSAqCisJICogeHh4X2RlbGF5X3RvdGFsIHdyYXBzIGFyb3VuZCB0byB6ZXJvIG9uIG92ZXJmbG93CisJICogeHh4X2NvdW50IGluY3JlbWVudGVkIHJlZ2FyZGxlc3Mgb2Ygb3ZlcmZsb3cKKwkgKi8KKworCS8qIERlbGF5IHdhaXRpbmcgZm9yIGNwdSwgd2hpbGUgcnVubmFibGUKKwkgKiBjb3VudCwgZGVsYXlfdG90YWwgTk9UIHVwZGF0ZWQgYXRvbWljYWxseQorCSAqLworCV9fdTY0CWNwdV9jb3VudCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJX191NjQJY3B1X2RlbGF5X3RvdGFsOworCisJLyogRm9sbG93aW5nIGZvdXIgZmllbGRzIGF0b21pY2FsbHkgdXBkYXRlZCB1c2luZyB0YXNrLT5kZWxheXMtPmxvY2sgKi8KKworCS8qIERlbGF5IHdhaXRpbmcgZm9yIHN5bmNocm9ub3VzIGJsb2NrIEkvTyB0byBjb21wbGV0ZQorCSAqIGRvZXMgbm90IGFjY291bnQgZm9yIGRlbGF5cyBpbiBJL08gc3VibWlzc2lvbgorCSAqLworCV9fdTY0CWJsa2lvX2NvdW50OworCV9fdTY0CWJsa2lvX2RlbGF5X3RvdGFsOworCisJLyogRGVsYXkgd2FpdGluZyBmb3IgcGFnZSBmYXVsdCBJL08gKHN3YXAgaW4gb25seSkgKi8KKwlfX3U2NAlzd2FwaW5fY291bnQ7CisJX191NjQJc3dhcGluX2RlbGF5X3RvdGFsOworCisJLyogY3B1ICJ3YWxsLWNsb2NrIiBydW5uaW5nIHRpbWUKKwkgKiBPbiBzb21lIGFyY2hpdGVjdHVyZXMsIHZhbHVlIHdpbGwgYWRqdXN0IGZvciBjcHUgdGltZSBzdG9sZW4KKwkgKiBmcm9tIHRoZSBrZXJuZWwgaW4gaW52b2x1bnRhcnkgd2FpdHMgZHVlIHRvIHZpcnR1YWxpemF0aW9uLgorCSAqIFZhbHVlIGlzIGN1bXVsYXRpdmUsIGluIG5hbm9zZWNvbmRzLCB3aXRob3V0IGEgY29ycmVzcG9uZGluZyBjb3VudAorCSAqIGFuZCB3cmFwcyBhcm91bmQgdG8gemVybyBzaWxlbnRseSBvbiBvdmVyZmxvdworCSAqLworCV9fdTY0CWNwdV9ydW5fcmVhbF90b3RhbDsKKworCS8qIGNwdSAidmlydHVhbCIgcnVubmluZyB0aW1lCisJICogVXNlcyB0aW1lIGludGVydmFscyBzZWVuIGJ5IHRoZSBrZXJuZWwgaS5lLiBubyBhZGp1c3RtZW50CisJICogZm9yIGtlcm5lbCdzIGludm9sdW50YXJ5IHdhaXRzIGR1ZSB0byB2aXJ0dWFsaXphdGlvbi4KKwkgKiBWYWx1ZSBpcyBjdW11bGF0aXZlLCBpbiBuYW5vc2Vjb25kcywgd2l0aG91dCBhIGNvcnJlc3BvbmRpbmcgY291bnQKKwkgKiBhbmQgd3JhcHMgYXJvdW5kIHRvIHplcm8gc2lsZW50bHkgb24gb3ZlcmZsb3cKKwkgKi8KKwlfX3U2NAljcHVfcnVuX3ZpcnR1YWxfdG90YWw7CisJLyogRGVsYXkgYWNjb3VudGluZyBmaWVsZHMgZW5kICovCisJLyogdmVyc2lvbiAxIGVuZHMgaGVyZSAqLworCisJLyogQmFzaWMgQWNjb3VudGluZyBGaWVsZHMgc3RhcnQgKi8KKwljaGFyCWFjX2NvbW1bVFNfQ09NTV9MRU5dOwkvKiBDb21tYW5kIG5hbWUgKi8KKwlfX3U4CWFjX3NjaGVkIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwkJCQkJLyogU2NoZWR1bGluZyBkaXNjaXBsaW5lICovCisJX191OAlhY19wYWRbM107CisJX191MzIJYWNfdWlkIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwkJCQkJLyogVXNlciBJRCAqLworCV9fdTMyCWFjX2dpZDsJCQkvKiBHcm91cCBJRCAqLworCV9fdTMyCWFjX3BpZDsJCQkvKiBQcm9jZXNzIElEICovCisJX191MzIJYWNfcHBpZDsJCS8qIFBhcmVudCBwcm9jZXNzIElEICovCisJX191MzIJYWNfYnRpbWU7CQkvKiBCZWdpbiB0aW1lIFtzZWMgc2luY2UgMTk3MF0gKi8KKwlfX3U2NAlhY19ldGltZSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisJCQkJCS8qIEVsYXBzZWQgdGltZSBbdXNlY10gKi8KKwlfX3U2NAlhY191dGltZTsJCS8qIFVzZXIgQ1BVIHRpbWUgW3VzZWNdICovCisJX191NjQJYWNfc3RpbWU7CQkvKiBTWXN0ZW0gQ1BVIHRpbWUgW3VzZWNdICovCisJX191NjQJYWNfbWluZmx0OwkJLyogTWlub3IgUGFnZSBGYXVsdCBDb3VudCAqLworCV9fdTY0CWFjX21hamZsdDsJCS8qIE1ham9yIFBhZ2UgRmF1bHQgQ291bnQgKi8KKwkvKiBCYXNpYyBBY2NvdW50aW5nIEZpZWxkcyBlbmQgKi8KKworCS8qIEV4dGVuZGVkIGFjY291bnRpbmcgZmllbGRzIHN0YXJ0ICovCisJLyogQWNjdW11bGF0ZWQgUlNTIHVzYWdlIGluIGR1cmF0aW9uIG9mIGEgdGFzaywgaW4gTUJ5dGVzLXVzZWNzLgorCSAqIFRoZSBjdXJyZW50IHJzcyB1c2FnZSBpcyBhZGRlZCB0byB0aGlzIGNvdW50ZXIgZXZlcnkgdGltZQorCSAqIGEgdGljayBpcyBjaGFyZ2VkIHRvIGEgdGFzaydzIHN5c3RlbSB0aW1lLiBTbywgYXQgdGhlIGVuZCB3ZQorCSAqIHdpbGwgaGF2ZSBtZW1vcnkgdXNhZ2UgbXVsdGlwbGllZCBieSBzeXN0ZW0gdGltZS4gVGh1cyBhbgorCSAqIGF2ZXJhZ2UgdXNhZ2UgcGVyIHN5c3RlbSB0aW1lIHVuaXQgY2FuIGJlIGNhbGN1bGF0ZWQuCisJICovCisJX191NjQJY29yZW1lbTsJCS8qIGFjY3VtdWxhdGVkIFJTUyB1c2FnZSBpbiBNQi11c2VjICovCisJLyogQWNjdW11bGF0ZWQgdmlydHVhbCBtZW1vcnkgdXNhZ2UgaW4gZHVyYXRpb24gb2YgYSB0YXNrLgorCSAqIFNhbWUgYXMgYWNjdF9yc3NfbWVtMSBhYm92ZSBleGNlcHQgdGhhdCB3ZSBrZWVwIHRyYWNrIG9mIFZNIHVzYWdlLgorCSAqLworCV9fdTY0CXZpcnRtZW07CQkvKiBhY2N1bXVsYXRlZCBWTSAgdXNhZ2UgaW4gTUItdXNlYyAqLworCisJLyogSGlnaCB3YXRlcm1hcmsgb2YgUlNTIGFuZCB2aXJ0dWFsIG1lbW9yeSB1c2FnZSBpbiBkdXJhdGlvbiBvZgorCSAqIGEgdGFzaywgaW4gS0J5dGVzLgorCSAqLworCV9fdTY0CWhpd2F0ZXJfcnNzOwkJLyogSGlnaC13YXRlcm1hcmsgb2YgUlNTIHVzYWdlLCBpbiBLQiAqLworCV9fdTY0CWhpd2F0ZXJfdm07CQkvKiBIaWdoLXdhdGVyIFZNIHVzYWdlLCBpbiBLQiAqLworCisJLyogVGhlIGZvbGxvd2luZyBmb3VyIGZpZWxkcyBhcmUgSS9PIHN0YXRpc3RpY3Mgb2YgYSB0YXNrLiAqLworCV9fdTY0CXJlYWRfY2hhcjsJCS8qIGJ5dGVzIHJlYWQgKi8KKwlfX3U2NAl3cml0ZV9jaGFyOwkJLyogYnl0ZXMgd3JpdHRlbiAqLworCV9fdTY0CXJlYWRfc3lzY2FsbHM7CQkvKiByZWFkIHN5c2NhbGxzICovCisJX191NjQJd3JpdGVfc3lzY2FsbHM7CQkvKiB3cml0ZSBzeXNjYWxscyAqLworCS8qIEV4dGVuZGVkIGFjY291bnRpbmcgZmllbGRzIGVuZCAqLworCisjZGVmaW5lIFRBU0tTVEFUU19IQVNfSU9fQUNDT1VOVElORworCS8qIFBlci10YXNrIHN0b3JhZ2UgSS9PIGFjY291bnRpbmcgc3RhcnRzICovCisJX191NjQJcmVhZF9ieXRlczsJCS8qIGJ5dGVzIG9mIHJlYWQgSS9PICovCisJX191NjQJd3JpdGVfYnl0ZXM7CQkvKiBieXRlcyBvZiB3cml0ZSBJL08gKi8KKwlfX3U2NAljYW5jZWxsZWRfd3JpdGVfYnl0ZXM7CS8qIGJ5dGVzIG9mIGNhbmNlbGxlZCB3cml0ZSBJL08gKi8KKworCV9fdTY0ICBudmNzdzsJCQkvKiB2b2x1bnRhcnlfY3R4dF9zd2l0Y2hlcyAqLworCV9fdTY0ICBuaXZjc3c7CQkJLyogbm9udm9sdW50YXJ5X2N0eHRfc3dpdGNoZXMgKi8KKworCS8qIHRpbWUgYWNjb3VudGluZyBmb3IgU01UIG1hY2hpbmVzICovCisJX191NjQJYWNfdXRpbWVzY2FsZWQ7CQkvKiB1dGltZSBzY2FsZWQgb24gZnJlcXVlbmN5IGV0YyAqLworCV9fdTY0CWFjX3N0aW1lc2NhbGVkOwkJLyogc3RpbWUgc2NhbGVkIG9uIGZyZXF1ZW5jeSBldGMgKi8KKwlfX3U2NAljcHVfc2NhbGVkX3J1bl9yZWFsX3RvdGFsOyAvKiBzY2FsZWQgY3B1X3J1bl9yZWFsX3RvdGFsICovCisKKwkvKiBEZWxheSB3YWl0aW5nIGZvciBtZW1vcnkgcmVjbGFpbSAqLworCV9fdTY0CWZyZWVwYWdlc19jb3VudDsKKwlfX3U2NAlmcmVlcGFnZXNfZGVsYXlfdG90YWw7Cit9OworCisKKy8qCisgKiBDb21tYW5kcyBzZW50IGZyb20gdXNlcnNwYWNlCisgKiBOb3QgdmVyc2lvbmVkLiBOZXcgY29tbWFuZHMgc2hvdWxkIG9ubHkgYmUgaW5zZXJ0ZWQgYXQgdGhlIGVudW0ncyBlbmQKKyAqIHByaW9yIHRvIF9fVEFTS1NUQVRTX0NNRF9NQVgKKyAqLworCitlbnVtIHsKKwlUQVNLU1RBVFNfQ01EX1VOU1BFQyA9IDAsCS8qIFJlc2VydmVkICovCisJVEFTS1NUQVRTX0NNRF9HRVQsCQkvKiB1c2VyLT5rZXJuZWwgcmVxdWVzdC9nZXQtcmVzcG9uc2UgKi8KKwlUQVNLU1RBVFNfQ01EX05FVywJCS8qIGtlcm5lbC0+dXNlciBldmVudCAqLworCV9fVEFTS1NUQVRTX0NNRF9NQVgsCit9OworCisjZGVmaW5lIFRBU0tTVEFUU19DTURfTUFYIChfX1RBU0tTVEFUU19DTURfTUFYIC0gMSkKKworZW51bSB7CisJVEFTS1NUQVRTX1RZUEVfVU5TUEVDID0gMCwJLyogUmVzZXJ2ZWQgKi8KKwlUQVNLU1RBVFNfVFlQRV9QSUQsCQkvKiBQcm9jZXNzIGlkICovCisJVEFTS1NUQVRTX1RZUEVfVEdJRCwJCS8qIFRocmVhZCBncm91cCBpZCAqLworCVRBU0tTVEFUU19UWVBFX1NUQVRTLAkJLyogdGFza3N0YXRzIHN0cnVjdHVyZSAqLworCVRBU0tTVEFUU19UWVBFX0FHR1JfUElELAkvKiBjb250YWlucyBwaWQgKyBzdGF0cyAqLworCVRBU0tTVEFUU19UWVBFX0FHR1JfVEdJRCwJLyogY29udGFpbnMgdGdpZCArIHN0YXRzICovCisJVEFTS1NUQVRTX1RZUEVfTlVMTCwJCS8qIGNvbnRhaW5zIG5vdGhpbmcgKi8KKwlfX1RBU0tTVEFUU19UWVBFX01BWCwKK307CisKKyNkZWZpbmUgVEFTS1NUQVRTX1RZUEVfTUFYIChfX1RBU0tTVEFUU19UWVBFX01BWCAtIDEpCisKK2VudW0geworCVRBU0tTVEFUU19DTURfQVRUUl9VTlNQRUMgPSAwLAorCVRBU0tTVEFUU19DTURfQVRUUl9QSUQsCisJVEFTS1NUQVRTX0NNRF9BVFRSX1RHSUQsCisJVEFTS1NUQVRTX0NNRF9BVFRSX1JFR0lTVEVSX0NQVU1BU0ssCisJVEFTS1NUQVRTX0NNRF9BVFRSX0RFUkVHSVNURVJfQ1BVTUFTSywKKwlfX1RBU0tTVEFUU19DTURfQVRUUl9NQVgsCit9OworCisjZGVmaW5lIFRBU0tTVEFUU19DTURfQVRUUl9NQVggKF9fVEFTS1NUQVRTX0NNRF9BVFRSX01BWCAtIDEpCisKKy8qIE5FVExJTktfR0VORVJJQyByZWxhdGVkIGluZm8gKi8KKworI2RlZmluZSBUQVNLU1RBVFNfR0VOTF9OQU1FCSJUQVNLU1RBVFMiCisjZGVmaW5lIFRBU0tTVEFUU19HRU5MX1ZFUlNJT04JMHgxCisKKyNlbmRpZiAvKiBfTElOVVhfVEFTS1NUQVRTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX2NzdW0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX2NzdW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDQ3YzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfY3N1bS5oCkBAIC0wLDAgKzEsMzIgQEAKKyNpZm5kZWYgX19MSU5VWF9UQ19DU1VNX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19DU1VNX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCisjZGVmaW5lIFRDQV9BQ1RfQ1NVTSAxNgorCitlbnVtIHsKKwlUQ0FfQ1NVTV9VTlNQRUMsCisJVENBX0NTVU1fUEFSTVMsCisJVENBX0NTVU1fVE0sCisJX19UQ0FfQ1NVTV9NQVgKK307CisjZGVmaW5lIFRDQV9DU1VNX01BWCAoX19UQ0FfQ1NVTV9NQVggLSAxKQorCitlbnVtIHsKKwlUQ0FfQ1NVTV9VUERBVEVfRkxBR19JUFY0SERSID0gMSwKKwlUQ0FfQ1NVTV9VUERBVEVfRkxBR19JQ01QICAgID0gMiwKKwlUQ0FfQ1NVTV9VUERBVEVfRkxBR19JR01QICAgID0gNCwKKwlUQ0FfQ1NVTV9VUERBVEVfRkxBR19UQ1AgICAgID0gOCwKKwlUQ0FfQ1NVTV9VUERBVEVfRkxBR19VRFAgICAgID0gMTYsCisJVENBX0NTVU1fVVBEQVRFX0ZMQUdfVURQTElURSA9IDMyCit9OworCitzdHJ1Y3QgdGNfY3N1bSB7CisJdGNfZ2VuOworCisJX191MzIgdXBkYXRlX2ZsYWdzOworfTsKKworI2VuZGlmIC8qIF9fTElOVVhfVENfQ1NVTV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19nYWN0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19nYWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiZjk0ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX2dhY3QuaApAQCAtMCwwICsxLDMyIEBACisjaWZuZGVmIF9fTElOVVhfVENfR0FDVF9ICisjZGVmaW5lIF9fTElOVVhfVENfR0FDVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKworI2RlZmluZSBUQ0FfQUNUX0dBQ1QgNQorc3RydWN0IHRjX2dhY3QgeworCXRjX2dlbjsKKworfTsKKworc3RydWN0IHRjX2dhY3RfcCB7CisjZGVmaW5lIFBHQUNUX05PTkUgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEdBQ1RfTkVUUkFORCAgICAgICAgICAgMQorI2RlZmluZSBQR0FDVF9ERVRFUk0gICAgICAgICAgICAyCisjZGVmaW5lIE1BWF9SQU5EICAgICAgICAgICAgICAgIChQR0FDVF9ERVRFUk0gKyAxICkKKwlfX3UxNiAgICAgICAgICAgICAgICAgcHR5cGU7CisJX191MTYgICAgICAgICAgICAgICAgIHB2YWw7CisJaW50ICAgICAgICAgICAgICAgICAgIHBhY3Rpb247Cit9OworIAorZW51bSB7CisJVENBX0dBQ1RfVU5TUEVDLAorCVRDQV9HQUNUX1RNLAorCVRDQV9HQUNUX1BBUk1TLAorCVRDQV9HQUNUX1BST0IsCisJX19UQ0FfR0FDVF9NQVgKK307CisjZGVmaW5lIFRDQV9HQUNUX01BWCAoX19UQ0FfR0FDVF9NQVggLSAxKQorIAorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19pcHQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX2lwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMzM1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19pcHQuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9fTElOVVhfVENfSVBUX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19JUFRfSAorCisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCisjZGVmaW5lIFRDQV9BQ1RfSVBUIDYKKworZW51bSB7CisJVENBX0lQVF9VTlNQRUMsCisJVENBX0lQVF9UQUJMRSwKKwlUQ0FfSVBUX0hPT0ssCisJVENBX0lQVF9JTkRFWCwKKwlUQ0FfSVBUX0NOVCwKKwlUQ0FfSVBUX1RNLAorCVRDQV9JUFRfVEFSRywKKwlfX1RDQV9JUFRfTUFYCit9OworI2RlZmluZSBUQ0FfSVBUX01BWCAoX19UQ0FfSVBUX01BWCAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19taXJyZWQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX21pcnJlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NjE3NTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19taXJyZWQuaApAQCAtMCwwICsxLDI3IEBACisjaWZuZGVmIF9fTElOVVhfVENfTUlSX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19NSVJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3RfY2xzLmg+CisKKyNkZWZpbmUgVENBX0FDVF9NSVJSRUQgOAorI2RlZmluZSBUQ0FfRUdSRVNTX1JFRElSIDEgIC8qIHBhY2tldCByZWRpcmVjdCB0byBFR1JFU1MqLworI2RlZmluZSBUQ0FfRUdSRVNTX01JUlJPUiAyIC8qIG1pcnJvciBwYWNrZXQgdG8gRUdSRVNTICovCisjZGVmaW5lIFRDQV9JTkdSRVNTX1JFRElSIDMgIC8qIHBhY2tldCByZWRpcmVjdCB0byBJTkdSRVNTKi8KKyNkZWZpbmUgVENBX0lOR1JFU1NfTUlSUk9SIDQgLyogbWlycm9yIHBhY2tldCB0byBJTkdSRVNTICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorc3RydWN0IHRjX21pcnJlZCB7CisJdGNfZ2VuOworCWludCAgICAgICAgICAgICAgICAgICAgIGVhY3Rpb247ICAgLyogb25lIG9mIElOL0VHUkVTU19NSVJST1IvUkVESVIgKi8KKwlfX3UzMiAgICAgICAgICAgICAgICAgICBpZmluZGV4OyAgLyogaWZpbmRleCBvZiBlZ3Jlc3MgcG9ydCAqLworfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitlbnVtIHsKKwlUQ0FfTUlSUkVEX1VOU1BFQywKKwlUQ0FfTUlSUkVEX1RNLAorCVRDQV9NSVJSRURfUEFSTVMsCisJX19UQ0FfTUlSUkVEX01BWAorfTsKKyNkZWZpbmUgVENBX01JUlJFRF9NQVggKF9fVENBX01JUlJFRF9NQVggLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfbmF0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19uYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjYzYWViCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfbmF0LmgKQEAgLTAsMCArMSwyNyBAQAorI2lmbmRlZiBfX0xJTlVYX1RDX05BVF9ICisjZGVmaW5lIF9fTElOVVhfVENfTkFUX0gKKworI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFRDQV9BQ1RfTkFUIDkKKworZW51bSB7CisJVENBX05BVF9VTlNQRUMsCisJVENBX05BVF9QQVJNUywKKwlUQ0FfTkFUX1RNLAorCV9fVENBX05BVF9NQVgKK307CisjZGVmaW5lIFRDQV9OQVRfTUFYIChfX1RDQV9OQVRfTUFYIC0gMSkKKworI2RlZmluZSBUQ0FfTkFUX0ZMQUdfRUdSRVNTIDEKKworc3RydWN0IHRjX25hdCB7CisJdGNfZ2VuOworCV9fYmUzMiBvbGRfYWRkcjsKKwlfX2JlMzIgbmV3X2FkZHI7CisJX19iZTMyIG1hc2s7CisJX191MzIgZmxhZ3M7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX3BlZGl0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19wZWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNmNmYWIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19wZWRpdC5oCkBAIC0wLDAgKzEsMzQgQEAKKyNpZm5kZWYgX19MSU5VWF9UQ19QRURfSAorI2RlZmluZSBfX0xJTlVYX1RDX1BFRF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKworI2RlZmluZSBUQ0FfQUNUX1BFRElUIDcKKworZW51bSB7CisJVENBX1BFRElUX1VOU1BFQywKKwlUQ0FfUEVESVRfVE0sCisJVENBX1BFRElUX1BBUk1TLAorCV9fVENBX1BFRElUX01BWAorfTsKKyNkZWZpbmUgVENBX1BFRElUX01BWCAoX19UQ0FfUEVESVRfTUFYIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitzdHJ1Y3QgdGNfcGVkaXRfa2V5IHsKKwlfX3UzMiAgICAgICAgICAgbWFzazsgIC8qIEFORCAqLworCV9fdTMyICAgICAgICAgICB2YWw7ICAgLypYT1IgKi8KKwlfX3UzMiAgICAgICAgICAgb2ZmOyAgLypvZmZzZXQgKi8KKwlfX3UzMiAgICAgICAgICAgYXQ7CisJX191MzIgICAgICAgICAgIG9mZm1hc2s7CisJX191MzIgICAgICAgICAgIHNoaWZ0OworfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitzdHJ1Y3QgdGNfcGVkaXRfc2VsIHsKKwl0Y19nZW47CisJdW5zaWduZWQgY2hhciAgICAgICAgICAgbmtleXM7CisJdW5zaWduZWQgY2hhciAgICAgICAgICAgZmxhZ3M7CisJc3RydWN0IHRjX3BlZGl0X2tleSAgICAga2V5c1swXTsKK307CisjZGVmaW5lIHRjX3BlZGl0IHRjX3BlZGl0X3NlbAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX3NrYmVkaXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX3NrYmVkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTJlOTEwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfc2tiZWRpdC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCisgKiBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiBBdXRob3I6IEFsZXhhbmRlciBEdXljayA8YWxleGFuZGVyLmguZHV5Y2tAaW50ZWwuY29tPgorICovCisKKyNpZm5kZWYgX19MSU5VWF9UQ19TS0JFRElUX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19TS0JFRElUX0gKKworI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKworI2RlZmluZSBUQ0FfQUNUX1NLQkVESVQgMTEKKworI2RlZmluZSBTS0JFRElUX0ZfUFJJT1JJVFkJCTB4MQorI2RlZmluZSBTS0JFRElUX0ZfUVVFVUVfTUFQUElORwkJMHgyCisjZGVmaW5lIFNLQkVESVRfRl9NQVJLCQkJMHg0CisKK3N0cnVjdCB0Y19za2JlZGl0IHsKKwl0Y19nZW47Cit9OworCitlbnVtIHsKKwlUQ0FfU0tCRURJVF9VTlNQRUMsCisJVENBX1NLQkVESVRfVE0sCisJVENBX1NLQkVESVRfUEFSTVMsCisJVENBX1NLQkVESVRfUFJJT1JJVFksCisJVENBX1NLQkVESVRfUVVFVUVfTUFQUElORywKKwlUQ0FfU0tCRURJVF9NQVJLLAorCV9fVENBX1NLQkVESVRfTUFYCit9OworI2RlZmluZSBUQ0FfU0tCRURJVF9NQVggKF9fVENBX1NLQkVESVRfTUFYIC0gMSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9jbXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX2NtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNGJiMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9jbXAuaApAQCAtMCwwICsxLDI1IEBACisjaWZuZGVmIF9fTElOVVhfVENfRU1fQ01QX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19FTV9DTVBfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3RfY2xzLmg+CisKK3N0cnVjdCB0Y2ZfZW1fY21wIHsKKwlfX3UzMgkJdmFsOworCV9fdTMyCQltYXNrOworCV9fdTE2CQlvZmY7CisJX191OAkJYWxpZ246NDsKKwlfX3U4CQlmbGFnczo0OworCV9fdTgJCWxheWVyOjQ7CisJX191OAkJb3BuZDo0OworfTsKKworZW51bSB7CisJVENGX0VNX0FMSUdOX1U4ICA9IDEsCisJVENGX0VNX0FMSUdOX1UxNiA9IDIsCisJVENGX0VNX0FMSUdOX1UzMiA9IDQKK307CisKKyNkZWZpbmUgVENGX0VNX0NNUF9UUkFOUwkxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fbWV0YS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fbWV0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMWY4Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9tZXRhLmgKQEAgLTAsMCArMSw5MiBAQAorI2lmbmRlZiBfX0xJTlVYX1RDX0VNX01FVEFfSAorI2RlZmluZSBfX0xJTlVYX1RDX0VNX01FVEFfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3RfY2xzLmg+CisKK2VudW0geworCVRDQV9FTV9NRVRBX1VOU1BFQywKKwlUQ0FfRU1fTUVUQV9IRFIsCisJVENBX0VNX01FVEFfTFZBTFVFLAorCVRDQV9FTV9NRVRBX1JWQUxVRSwKKwlfX1RDQV9FTV9NRVRBX01BWAorfTsKKyNkZWZpbmUgVENBX0VNX01FVEFfTUFYIChfX1RDQV9FTV9NRVRBX01BWCAtIDEpCisKK3N0cnVjdCB0Y2ZfbWV0YV92YWwgeworCV9fdTE2CQkJa2luZDsKKwlfX3U4CQkJc2hpZnQ7CisJX191OAkJCW9wOworfTsKKworI2RlZmluZSBUQ0ZfTUVUQV9UWVBFX01BU0sJKDB4ZiA8PCAxMikKKyNkZWZpbmUgVENGX01FVEFfVFlQRShraW5kKQkoKChraW5kKSAmIFRDRl9NRVRBX1RZUEVfTUFTSykgPj4gMTIpCisjZGVmaW5lIFRDRl9NRVRBX0lEX01BU0sJMHg3ZmYKKyNkZWZpbmUgVENGX01FVEFfSUQoa2luZCkJKChraW5kKSAmIFRDRl9NRVRBX0lEX01BU0spCisKK2VudW0geworCVRDRl9NRVRBX1RZUEVfVkFSLAorCVRDRl9NRVRBX1RZUEVfSU5ULAorCV9fVENGX01FVEFfVFlQRV9NQVgKK307CisjZGVmaW5lIFRDRl9NRVRBX1RZUEVfTUFYIChfX1RDRl9NRVRBX1RZUEVfTUFYIC0gMSkKKworZW51bSB7CisJVENGX01FVEFfSURfVkFMVUUsCisJVENGX01FVEFfSURfUkFORE9NLAorCVRDRl9NRVRBX0lEX0xPQURBVkdfMCwKKwlUQ0ZfTUVUQV9JRF9MT0FEQVZHXzEsCisJVENGX01FVEFfSURfTE9BREFWR18yLAorCVRDRl9NRVRBX0lEX0RFViwKKwlUQ0ZfTUVUQV9JRF9QUklPUklUWSwKKwlUQ0ZfTUVUQV9JRF9QUk9UT0NPTCwKKwlUQ0ZfTUVUQV9JRF9QS1RUWVBFLAorCVRDRl9NRVRBX0lEX1BLVExFTiwKKwlUQ0ZfTUVUQV9JRF9EQVRBTEVOLAorCVRDRl9NRVRBX0lEX01BQ0xFTiwKKwlUQ0ZfTUVUQV9JRF9ORk1BUkssCisJVENGX01FVEFfSURfVENJTkRFWCwKKwlUQ0ZfTUVUQV9JRF9SVENMQVNTSUQsCisJVENGX01FVEFfSURfUlRJSUYsCisJVENGX01FVEFfSURfU0tfRkFNSUxZLAorCVRDRl9NRVRBX0lEX1NLX1NUQVRFLAorCVRDRl9NRVRBX0lEX1NLX1JFVVNFLAorCVRDRl9NRVRBX0lEX1NLX0JPVU5EX0lGLAorCVRDRl9NRVRBX0lEX1NLX1JFRkNOVCwKKwlUQ0ZfTUVUQV9JRF9TS19TSFVURE9XTiwKKwlUQ0ZfTUVUQV9JRF9TS19QUk9UTywKKwlUQ0ZfTUVUQV9JRF9TS19UWVBFLAorCVRDRl9NRVRBX0lEX1NLX1JDVkJVRiwKKwlUQ0ZfTUVUQV9JRF9TS19STUVNX0FMTE9DLAorCVRDRl9NRVRBX0lEX1NLX1dNRU1fQUxMT0MsCisJVENGX01FVEFfSURfU0tfT01FTV9BTExPQywKKwlUQ0ZfTUVUQV9JRF9TS19XTUVNX1FVRVVFRCwKKwlUQ0ZfTUVUQV9JRF9TS19SQ1ZfUUxFTiwKKwlUQ0ZfTUVUQV9JRF9TS19TTkRfUUxFTiwKKyAJVENGX01FVEFfSURfU0tfRVJSX1FMRU4sCisJVENGX01FVEFfSURfU0tfRk9SV0FSRF9BTExPQ1MsCisJVENGX01FVEFfSURfU0tfU05EQlVGLAorIAlUQ0ZfTUVUQV9JRF9TS19BTExPQ1MsCisJX19UQ0ZfTUVUQV9JRF9TS19ST1VURV9DQVBTLAkvKiB1bmltcGxlbWVudGVkIGJ1dCBpbiBBQkkgYWxyZWFkeSAqLworIAlUQ0ZfTUVUQV9JRF9TS19IQVNILAorIAlUQ0ZfTUVUQV9JRF9TS19MSU5HRVJUSU1FLAorIAlUQ0ZfTUVUQV9JRF9TS19BQ0tfQkFDS0xPRywKKyAJVENGX01FVEFfSURfU0tfTUFYX0FDS19CQUNLTE9HLAorIAlUQ0ZfTUVUQV9JRF9TS19QUklPLAorIAlUQ0ZfTUVUQV9JRF9TS19SQ1ZMT1dBVCwKKyAJVENGX01FVEFfSURfU0tfUkNWVElNRU8sCisgCVRDRl9NRVRBX0lEX1NLX1NORFRJTUVPLAorIAlUQ0ZfTUVUQV9JRF9TS19TRU5ETVNHX09GRiwKKyAJVENGX01FVEFfSURfU0tfV1JJVEVfUEVORElORywKKwlUQ0ZfTUVUQV9JRF9WTEFOX1RBRywKKwlUQ0ZfTUVUQV9JRF9SWEhBU0gsCisJX19UQ0ZfTUVUQV9JRF9NQVgKK307CisjZGVmaW5lIFRDRl9NRVRBX0lEX01BWCAoX19UQ0ZfTUVUQV9JRF9NQVggLSAxKQorCitzdHJ1Y3QgdGNmX21ldGFfaGRyIHsKKwlzdHJ1Y3QgdGNmX21ldGFfdmFsCWxlZnQ7CisJc3RydWN0IHRjZl9tZXRhX3ZhbAlyaWdodDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fbmJ5dGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX25ieXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3MmNmYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX25ieXRlLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfX0xJTlVYX1RDX0VNX05CWVRFX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19FTV9OQllURV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKworc3RydWN0IHRjZl9lbV9uYnl0ZSB7CisJX191MTYJCW9mZjsKKwlfX3UxNgkJbGVuOjEyOworCV9fdTgJCWxheWVyOjQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX3RleHQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX3RleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWFjNDA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fdGV4dC5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX19MSU5VWF9UQ19FTV9URVhUX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19FTV9URVhUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCisjZGVmaW5lIFRDX0VNX1RFWFRfQUxHT1NJWgkxNgorCitzdHJ1Y3QgdGNmX2VtX3RleHQgeworCWNoYXIJCWFsZ29bVENfRU1fVEVYVF9BTEdPU0laXTsKKwlfX3UxNgkJZnJvbV9vZmZzZXQ7CisJX191MTYJCXRvX29mZnNldDsKKwlfX3UxNgkJcGF0dGVybl9sZW47CisJX191OAkJZnJvbV9sYXllcjo0OworCV9fdTgJCXRvX2xheWVyOjQ7CisJX191OAkJcGFkOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDJmMTc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y3AuaApAQCAtMCwwICsxLDIwOCBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlEZWZpbml0aW9ucyBmb3IgdGhlIFRDUCBwcm90b2NvbC4KKyAqCisgKiBWZXJzaW9uOglAKCMpdGNwLmgJMS4wLjIJMDQvMjgvOTMKKyAqCisgKiBBdXRob3I6CUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9MSU5VWF9UQ1BfSAorI2RlZmluZSBfTElOVVhfVENQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorCitzdHJ1Y3QgdGNwaGRyIHsKKwlfX2JlMTYJc291cmNlOworCV9fYmUxNglkZXN0OworCV9fYmUzMglzZXE7CisJX19iZTMyCWFja19zZXE7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191MTYJcmVzMTo0LAorCQlkb2ZmOjQsCisJCWZpbjoxLAorCQlzeW46MSwKKwkJcnN0OjEsCisJCXBzaDoxLAorCQlhY2s6MSwKKwkJdXJnOjEsCisJCWVjZToxLAorCQljd3I6MTsKKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTE2CWRvZmY6NCwKKwkJcmVzMTo0LAorCQljd3I6MSwKKwkJZWNlOjEsCisJCXVyZzoxLAorCQlhY2s6MSwKKwkJcHNoOjEsCisJCXJzdDoxLAorCQlzeW46MSwKKwkJZmluOjE7CisjZWxzZQorI2Vycm9yCSJBZGp1c3QgeW91ciA8YXNtL2J5dGVvcmRlci5oPiBkZWZpbmVzIgorI2VuZGlmCQorCV9fYmUxNgl3aW5kb3c7CisJX19zdW0xNgljaGVjazsKKwlfX2JlMTYJdXJnX3B0cjsKK307CisKKy8qCisgKglUaGUgdW5pb24gY2FzdCB1c2VzIGEgZ2NjIGV4dGVuc2lvbiB0byBhdm9pZCBhbGlhc2luZyBwcm9ibGVtcworICogICh1bmlvbiBpcyBjb21wYXRpYmxlIHRvIGFueSBvZiBpdHMgbWVtYmVycykKKyAqICBUaGlzIG1lYW5zIHRoaXMgcGFydCBvZiB0aGUgY29kZSBpcyAtZnN0cmljdC1hbGlhc2luZyBzYWZlIG5vdy4KKyAqLwordW5pb24gdGNwX3dvcmRfaGRyIHsgCisJc3RydWN0IHRjcGhkciBoZHI7CisJX19iZTMyIAkJICB3b3Jkc1s1XTsKK307IAorCisjZGVmaW5lIHRjcF9mbGFnX3dvcmQodHApICggKCh1bmlvbiB0Y3Bfd29yZF9oZHIgKikodHApKS0+d29yZHMgWzNdKSAKKworZW51bSB7IAorCVRDUF9GTEFHX0NXUiA9IF9fY3B1X3RvX2JlMzIoMHgwMDgwMDAwMCksCisJVENQX0ZMQUdfRUNFID0gX19jcHVfdG9fYmUzMigweDAwNDAwMDAwKSwKKwlUQ1BfRkxBR19VUkcgPSBfX2NwdV90b19iZTMyKDB4MDAyMDAwMDApLAorCVRDUF9GTEFHX0FDSyA9IF9fY3B1X3RvX2JlMzIoMHgwMDEwMDAwMCksCisJVENQX0ZMQUdfUFNIID0gX19jcHVfdG9fYmUzMigweDAwMDgwMDAwKSwKKwlUQ1BfRkxBR19SU1QgPSBfX2NwdV90b19iZTMyKDB4MDAwNDAwMDApLAorCVRDUF9GTEFHX1NZTiA9IF9fY3B1X3RvX2JlMzIoMHgwMDAyMDAwMCksCisJVENQX0ZMQUdfRklOID0gX19jcHVfdG9fYmUzMigweDAwMDEwMDAwKSwKKwlUQ1BfUkVTRVJWRURfQklUUyA9IF9fY3B1X3RvX2JlMzIoMHgwRjAwMDAwMCksCisJVENQX0RBVEFfT0ZGU0VUID0gX19jcHVfdG9fYmUzMigweEYwMDAwMDAwKQorfTsgCisKKy8qCisgKiBUQ1AgZ2VuZXJhbCBjb25zdGFudHMKKyAqLworI2RlZmluZSBUQ1BfTVNTX0RFRkFVTFQJCSA1MzZVCS8qIElQdjQgKFJGQzExMjIsIFJGQzI1ODEpICovCisjZGVmaW5lIFRDUF9NU1NfREVTSVJFRAkJMTIyMFUJLyogSVB2NiAodHVubmVsZWQpLCBFRE5TMCAoUkZDMzIyNikgKi8KKworLyogVENQIHNvY2tldCBvcHRpb25zICovCisjZGVmaW5lIFRDUF9OT0RFTEFZCQkxCS8qIFR1cm4gb2ZmIE5hZ2xlJ3MgYWxnb3JpdGhtLiAqLworI2RlZmluZSBUQ1BfTUFYU0VHCQkyCS8qIExpbWl0IE1TUyAqLworI2RlZmluZSBUQ1BfQ09SSwkJMwkvKiBOZXZlciBzZW5kIHBhcnRpYWxseSBjb21wbGV0ZSBzZWdtZW50cyAqLworI2RlZmluZSBUQ1BfS0VFUElETEUJCTQJLyogU3RhcnQga2VlcGxpdmVzIGFmdGVyIHRoaXMgcGVyaW9kICovCisjZGVmaW5lIFRDUF9LRUVQSU5UVkwJCTUJLyogSW50ZXJ2YWwgYmV0d2VlbiBrZWVwYWxpdmVzICovCisjZGVmaW5lIFRDUF9LRUVQQ05UCQk2CS8qIE51bWJlciBvZiBrZWVwYWxpdmVzIGJlZm9yZSBkZWF0aCAqLworI2RlZmluZSBUQ1BfU1lOQ05UCQk3CS8qIE51bWJlciBvZiBTWU4gcmV0cmFuc21pdHMgKi8KKyNkZWZpbmUgVENQX0xJTkdFUjIJCTgJLyogTGlmZSB0aW1lIG9mIG9ycGhhbmVkIEZJTi1XQUlULTIgc3RhdGUgKi8KKyNkZWZpbmUgVENQX0RFRkVSX0FDQ0VQVAk5CS8qIFdha2UgdXAgbGlzdGVuZXIgb25seSB3aGVuIGRhdGEgYXJyaXZlICovCisjZGVmaW5lIFRDUF9XSU5ET1dfQ0xBTVAJMTAJLyogQm91bmQgYWR2ZXJ0aXNlZCB3aW5kb3cgKi8KKyNkZWZpbmUgVENQX0lORk8JCTExCS8qIEluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29ubmVjdGlvbi4gKi8KKyNkZWZpbmUgVENQX1FVSUNLQUNLCQkxMgkvKiBCbG9jay9yZWVuYWJsZSBxdWljayBhY2tzICovCisjZGVmaW5lIFRDUF9DT05HRVNUSU9OCQkxMwkvKiBDb25nZXN0aW9uIGNvbnRyb2wgYWxnb3JpdGhtICovCisjZGVmaW5lIFRDUF9NRDVTSUcJCTE0CS8qIFRDUCBNRDUgU2lnbmF0dXJlIChSRkMyMzg1KSAqLworI2RlZmluZSBUQ1BfQ09PS0lFX1RSQU5TQUNUSU9OUwkxNQkvKiBUQ1AgQ29va2llIFRyYW5zYWN0aW9ucyAqLworI2RlZmluZSBUQ1BfVEhJTl9MSU5FQVJfVElNRU9VVFMgMTYgICAgICAvKiBVc2UgbGluZWFyIHRpbWVvdXRzIGZvciB0aGluIHN0cmVhbXMqLworI2RlZmluZSBUQ1BfVEhJTl9EVVBBQ0sgICAgICAgICAxNyAgICAgIC8qIEZhc3QgcmV0cmFucy4gYWZ0ZXIgMSBkdXBhY2sgKi8KKyNkZWZpbmUgVENQX1VTRVJfVElNRU9VVAkxOAkvKiBIb3cgbG9uZyBmb3IgbG9zcyByZXRyeSBiZWZvcmUgdGltZW91dCAqLworCisvKiBmb3IgVENQX0lORk8gc29ja2V0IG9wdGlvbiAqLworI2RlZmluZSBUQ1BJX09QVF9USU1FU1RBTVBTCTEKKyNkZWZpbmUgVENQSV9PUFRfU0FDSwkJMgorI2RlZmluZSBUQ1BJX09QVF9XU0NBTEUJCTQKKyNkZWZpbmUgVENQSV9PUFRfRUNOCQk4IC8qIEVDTiB3YXMgbmVnb2NpYXRlZCBhdCBUQ1Agc2Vzc2lvbiBpbml0ICovCisjZGVmaW5lIFRDUElfT1BUX0VDTl9TRUVOCTE2IC8qIHdlIHJlY2VpdmVkIGF0IGxlYXN0IG9uZSBwYWNrZXQgd2l0aCBFQ1QgKi8KKworZW51bSB0Y3BfY2Ffc3RhdGUgeworCVRDUF9DQV9PcGVuID0gMCwKKyNkZWZpbmUgVENQRl9DQV9PcGVuCSgxPDxUQ1BfQ0FfT3BlbikKKwlUQ1BfQ0FfRGlzb3JkZXIgPSAxLAorI2RlZmluZSBUQ1BGX0NBX0Rpc29yZGVyICgxPDxUQ1BfQ0FfRGlzb3JkZXIpCisJVENQX0NBX0NXUiA9IDIsCisjZGVmaW5lIFRDUEZfQ0FfQ1dSCSgxPDxUQ1BfQ0FfQ1dSKQorCVRDUF9DQV9SZWNvdmVyeSA9IDMsCisjZGVmaW5lIFRDUEZfQ0FfUmVjb3ZlcnkgKDE8PFRDUF9DQV9SZWNvdmVyeSkKKwlUQ1BfQ0FfTG9zcyA9IDQKKyNkZWZpbmUgVENQRl9DQV9Mb3NzCSgxPDxUQ1BfQ0FfTG9zcykKK307CisKK3N0cnVjdCB0Y3BfaW5mbyB7CisJX191OAl0Y3BpX3N0YXRlOworCV9fdTgJdGNwaV9jYV9zdGF0ZTsKKwlfX3U4CXRjcGlfcmV0cmFuc21pdHM7CisJX191OAl0Y3BpX3Byb2JlczsKKwlfX3U4CXRjcGlfYmFja29mZjsKKwlfX3U4CXRjcGlfb3B0aW9uczsKKwlfX3U4CXRjcGlfc25kX3dzY2FsZSA6IDQsIHRjcGlfcmN2X3dzY2FsZSA6IDQ7CisKKwlfX3UzMgl0Y3BpX3J0bzsKKwlfX3UzMgl0Y3BpX2F0bzsKKwlfX3UzMgl0Y3BpX3NuZF9tc3M7CisJX191MzIJdGNwaV9yY3ZfbXNzOworCisJX191MzIJdGNwaV91bmFja2VkOworCV9fdTMyCXRjcGlfc2Fja2VkOworCV9fdTMyCXRjcGlfbG9zdDsKKwlfX3UzMgl0Y3BpX3JldHJhbnM7CisJX191MzIJdGNwaV9mYWNrZXRzOworCisJLyogVGltZXMuICovCisJX191MzIJdGNwaV9sYXN0X2RhdGFfc2VudDsKKwlfX3UzMgl0Y3BpX2xhc3RfYWNrX3NlbnQ7ICAgICAvKiBOb3QgcmVtZW1iZXJlZCwgc29ycnkuICovCisJX191MzIJdGNwaV9sYXN0X2RhdGFfcmVjdjsKKwlfX3UzMgl0Y3BpX2xhc3RfYWNrX3JlY3Y7CisKKwkvKiBNZXRyaWNzLiAqLworCV9fdTMyCXRjcGlfcG10dTsKKwlfX3UzMgl0Y3BpX3Jjdl9zc3RocmVzaDsKKwlfX3UzMgl0Y3BpX3J0dDsKKwlfX3UzMgl0Y3BpX3J0dHZhcjsKKwlfX3UzMgl0Y3BpX3NuZF9zc3RocmVzaDsKKwlfX3UzMgl0Y3BpX3NuZF9jd25kOworCV9fdTMyCXRjcGlfYWR2bXNzOworCV9fdTMyCXRjcGlfcmVvcmRlcmluZzsKKworCV9fdTMyCXRjcGlfcmN2X3J0dDsKKwlfX3UzMgl0Y3BpX3Jjdl9zcGFjZTsKKworCV9fdTMyCXRjcGlfdG90YWxfcmV0cmFuczsKK307CisKKy8qIGZvciBUQ1BfTUQ1U0lHIHNvY2tldCBvcHRpb24gKi8KKyNkZWZpbmUgVENQX01ENVNJR19NQVhLRVlMRU4JODAKKworc3RydWN0IHRjcF9tZDVzaWcgeworCXN0cnVjdCBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlIHRjcG1fYWRkcjsJLyogYWRkcmVzcyBhc3NvY2lhdGVkICovCisJX191MTYJX190Y3BtX3BhZDE7CQkJCS8qIHplcm8gKi8KKwlfX3UxNgl0Y3BtX2tleWxlbjsJCQkJLyoga2V5IGxlbmd0aCAqLworCV9fdTMyCV9fdGNwbV9wYWQyOwkJCQkvKiB6ZXJvICovCisJX191OAl0Y3BtX2tleVtUQ1BfTUQ1U0lHX01BWEtFWUxFTl07CQkvKiBrZXkgKGJpbmFyeSkgKi8KK307CisKKy8qIGZvciBUQ1BfQ09PS0lFX1RSQU5TQUNUSU9OUyAoVENQQ1QpIHNvY2tldCBvcHRpb24gKi8KKyNkZWZpbmUgVENQX0NPT0tJRV9NSU4JCSA4CQkvKiAgNjQtYml0cyAqLworI2RlZmluZSBUQ1BfQ09PS0lFX01BWAkJMTYJCS8qIDEyOC1iaXRzICovCisjZGVmaW5lIFRDUF9DT09LSUVfUEFJUl9TSVpFCSgyKlRDUF9DT09LSUVfTUFYKQorCisvKiBGbGFncyBmb3IgYm90aCBnZXRzb2Nrb3B0IGFuZCBzZXRzb2Nrb3B0ICovCisjZGVmaW5lIFRDUF9DT09LSUVfSU5fQUxXQVlTCSgxIDw8IDApCS8qIERpc2NhcmQgU1lOIHdpdGhvdXQgY29va2llICovCisjZGVmaW5lIFRDUF9DT09LSUVfT1VUX05FVkVSCSgxIDw8IDEpCS8qIFByb2hpYml0IG91dGdvaW5nIGNvb2tpZXMsCisJCQkJCQkgKiBzdXBlcmNlZGVzIGV2ZXJ5dGhpbmcuICovCisKKy8qIEZsYWdzIGZvciBnZXRzb2Nrb3B0ICovCisjZGVmaW5lIFRDUF9TX0RBVEFfSU4JCSgxIDw8IDIpCS8qIFdhcyBkYXRhIHJlY2VpdmVkPyAqLworI2RlZmluZSBUQ1BfU19EQVRBX09VVAkJKDEgPDwgMykJLyogV2FzIGRhdGEgc2VudD8gKi8KKworLyogVENQX0NPT0tJRV9UUkFOU0FDVElPTlMgZGF0YSAqLworc3RydWN0IHRjcF9jb29raWVfdHJhbnNhY3Rpb25zIHsKKwlfX3UxNgl0Y3BjdF9mbGFnczsJCQkvKiBzZWUgYWJvdmUgKi8KKwlfX3U4CV9fdGNwY3RfcGFkMTsJCQkvKiB6ZXJvICovCisJX191OAl0Y3BjdF9jb29raWVfZGVzaXJlZDsJCS8qIGJ5dGVzICovCisJX191MTYJdGNwY3Rfc19kYXRhX2Rlc2lyZWQ7CQkvKiBieXRlcyBvZiB2YXJpYWJsZSBkYXRhICovCisJX191MTYJdGNwY3RfdXNlZDsJCQkvKiBieXRlcyBpbiB2YWx1ZSAqLworCV9fdTgJdGNwY3RfdmFsdWVbVENQX01TU19ERUZBVUxUXTsKK307CisKKworI2VuZGlmCS8qIF9MSU5VWF9UQ1BfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90ZWxlcGhvbnkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGVsZXBob255LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYzYWZlMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGVsZXBob255LmgKQEAgLTAsMCArMSwyNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkJdGVsZXBob255LmgKKyAqCisgKgkJQmFzaWMgTGludXggVGVsZXBob255IEludGVyZmFjZQorICoKKyAqCQkoYykgQ29weXJpZ2h0IDE5OTktMjAwMSBRdWlja25ldCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBBdXRob3JzOiAgICAgICBFZCBPa2Vyc29uLCA8ZW9rZXJzb25AcXVpY2tuZXQubmV0PgorICogICAgICAgICAgICAgICAgICAgR3JlZyBIZXJsZWluLCA8Z2hlcmxlaW5AcXVpY2tuZXQubmV0PgorICoKKyAqICAgIENvbnRyaWJ1dG9yczogIEFsYW4gQ294LCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgorICogICAgICAgICAgICAgICAgICAgRGF2aWQgVy4gRXJoYXJ0LCA8ZGVyaGFydEBxdWlja25ldC5uZXQ+CisgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgUVVJQ0tORVQgVEVDSE5PTE9HSUVTLCBJTkMuIEJFIExJQUJMRSBUTyBBTlkgUEFSVFkgRk9SCisgKiBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBBTkQgSVRTIERPQ1VNRU5UQVRJT04sIEVWRU4gSUYgUVVJQ0tORVQKKyAqIFRFQ0hOT0xPR0lFUywgSU5DLiBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBRVUlDS05FVCBURUNITk9MT0dJRVMsIElOQy4gU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQorICogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIFNPRlRXQVJFIFBST1ZJREVEIEhFUkVVTkRFUiBJUworICogT04gQU4gIkFTIElTIiBCQVNJUywgQU5EIFFVSUNLTkVUIFRFQ0hOT0xPR0lFUywgSU5DLiBIQVMgTk8gT0JMSUdBVElPTgorICogVE8gUFJPVklERSBNQUlOVEVOQU5DRSwgU1VQUE9SVCwgVVBEQVRFUywgRU5IQU5DRU1FTlRTLCBPUiBNT0RJRklDQVRJT05TLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBURUxFUEhPTllfSAorI2RlZmluZSBURUxFUEhPTllfSAorCisjZGVmaW5lIFRFTEVQSE9OWV9WRVJTSU9OIDMwMTMKKworI2RlZmluZSBQSE9ORV9WRU5ET1JfSVhKICAgICAgICAgIDEKKyNkZWZpbmUgUEhPTkVfVkVORE9SX1FVSUNLTkVUCSAgUEhPTkVfVkVORE9SX0lYSgorI2RlZmluZSBQSE9ORV9WRU5ET1JfVk9JQ0VUUk9OSVggIDIKKyNkZWZpbmUgUEhPTkVfVkVORE9SX0FDVUxBQiAgICAgICAzCisjZGVmaW5lIFBIT05FX1ZFTkRPUl9ESUdJICAgICAgICAgNAorI2RlZmluZSBQSE9ORV9WRU5ET1JfRlJBTktMSU4gICAgIDUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFZlbmRvciBTdW1tYXJ5IEluZm9ybWF0aW9uIEFyZWEKKyAqCisgKiAgUXVpY2tuZXQgVGVjaG5vbG9naWVzLCBJbmMuIC0gbWFrZXMgbG93IGRlbnNpdHkgYW5hbG9nIHRlbGVwaG9ueSBjYXJkcworICogICAgd2l0aCBhdWRpbyBjb21wcmVzc2lvbiwgUE9UUyBhbmQgUFNUTiBpbnRlcmZhY2VzICh3d3cucXVpY2tuZXQubmV0KQorICoKKyAqICAob3RoZXIgdmVuZG9ycyBmb2xsb3dpbmcgdGhpcyBBUEkgc2h1bGQgYWRkIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YKKyAqICB0aGUgdGVsZXBob255IHByb2R1Y3RzIHRoZXkgc3VwcG9ydCB1bmRlciBMaW51eCkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFFUSV9QSE9ORUpBQ0sJCTEwMAorI2RlZmluZSBRVElfTElORUpBQ0sJCTMwMAorI2RlZmluZSBRVElfUEhPTkVKQUNLX0xJVEUJNDAwCisjZGVmaW5lIFFUSV9QSE9ORUpBQ0tfUENJCTUwMAorI2RlZmluZSBRVElfUEhPTkVDQVJECQk2MDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBUaGUgY2FwYWJpbGl0aWVzIGlvY3RscyBjYW4gaW5mb3JtIHlvdSBvZiB0aGUgY2FwYWJpbGl0aWVzIG9mIGVhY2ggcGhvbmUKKyogZGV2aWNlIGluc3RhbGxlZCBpbiB5b3VyIHN5c3RlbS4gIFRoZSBQSE9ORUNUTF9DQVBBQklMSVRJRVMgaW9jdGwKKyogcmV0dXJucyBhbiBpbnRlZ2VyIHZhbHVlIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiBjYXBhYmlsaXRpZXMgdGhlICAgCisqIGRldmljZSBoYXMuICBUaGUgUEhPTkVDVExfQ0FQQUJJTElUSUVTX0xJU1Qgd2lsbCBmaWxsIGFuIGFycmF5IG9mIAorKiBjYXBhYmlsaXR5IHN0cnVjdHMgd2l0aCBhbGwgb2YgaXRzIGNhcGFiaWxpdGllcy4gIFRoZQorKiBQSE9ORUNUTF9DQVBBQklMSVRJRVNfQ0hFQ0sgdGFrZXMgYSBzaW5nbGUgY2FwYWJpbGl0eSBzdHJ1Y3QgYW5kIHJldHVybnMKKyogYSBUUlVFIGlmIHRoZSBkZXZpY2UgaGFzIHRoYXQgY2FwYWJpbGl0eSwgb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCisqIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKwl2ZW5kb3IgPSAwLAorCWRldmljZSwKKwlwb3J0LAorCWNvZGVjLAorCWRzcAorfSBwaG9uZV9jYXA7CisKK3N0cnVjdCBwaG9uZV9jYXBhYmlsaXR5IHsKKwljaGFyIGRlc2NbODBdOworCXBob25lX2NhcCBjYXB0eXBlOworCWludCBjYXA7CisJaW50IGhhbmRsZTsKK307CisKK3R5cGVkZWYgZW51bSB7CisJcG90cyA9IDAsCisJcHN0biwKKwloYW5kc2V0LAorCXNwZWFrZXIKK30gcGhvbmVfcG9ydHM7CisKKyNkZWZpbmUgUEhPTkVfQ0FQQUJJTElUSUVTICAgICAgICAgICAgICBfSU8gICgncScsIDB4ODApCisjZGVmaW5lIFBIT05FX0NBUEFCSUxJVElFU19MSVNUICAgICAgICAgX0lPUiAoJ3EnLCAweDgxLCBzdHJ1Y3QgcGhvbmVfY2FwYWJpbGl0eSAqKQorI2RlZmluZSBQSE9ORV9DQVBBQklMSVRJRVNfQ0hFQ0sgICAgICAgIF9JT1cgKCdxJywgMHg4Miwgc3RydWN0IHBob25lX2NhcGFiaWxpdHkgKikKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBjaGFyIG1vbnRoWzNdOworICAgICAgICBjaGFyIGRheVszXTsKKyAgICAgICAgY2hhciBob3VyWzNdOworICAgICAgICBjaGFyIG1pblszXTsKKyAgICAgICAgaW50IG51bWxlbjsKKyAgICAgICAgY2hhciBudW1iZXJbMTFdOworICAgICAgICBpbnQgbmFtZWxlbjsKKyAgICAgICAgY2hhciBuYW1lWzgwXTsKK30gUEhPTkVfQ0lEOworIAorI2RlZmluZSBQSE9ORV9SSU5HCQkJX0lPICAoJ3EnLCAweDgzKQorI2RlZmluZSBQSE9ORV9IT09LU1RBVEUJCQlfSU8gICgncScsIDB4ODQpCisjZGVmaW5lIFBIT05FX01BWFJJTkdTCQkJX0lPVyAoJ3EnLCAweDg1LCBjaGFyKQorI2RlZmluZSBQSE9ORV9SSU5HX0NBREVOQ0UJCV9JT1cgKCdxJywgMHg4Niwgc2hvcnQpCisjZGVmaW5lIE9MRF9QSE9ORV9SSU5HX1NUQVJUICAgICAgICAgICAgX0lPICAoJ3EnLCAweDg3KQorI2RlZmluZSBQSE9ORV9SSU5HX1NUQVJUCQlfSU9XICgncScsIDB4ODcsIFBIT05FX0NJRCAqKQorI2RlZmluZSBQSE9ORV9SSU5HX1NUT1AJCQlfSU8gICgncScsIDB4ODgpCisKKyNkZWZpbmUgVVNBX1JJTkdfQ0FERU5DRQkgMHhDMEMwCisKKyNkZWZpbmUgUEhPTkVfUkVDX0NPREVDCQkJX0lPVyAoJ3EnLCAweDg5LCBpbnQpCisjZGVmaW5lIFBIT05FX1JFQ19TVEFSVAkJCV9JTyAgKCdxJywgMHg4QSkKKyNkZWZpbmUgUEhPTkVfUkVDX1NUT1AJCQlfSU8gICgncScsIDB4OEIpCisjZGVmaW5lIFBIT05FX1JFQ19ERVBUSAkJCV9JT1cgKCdxJywgMHg4QywgaW50KQorI2RlZmluZSBQSE9ORV9GUkFNRQkJCV9JT1cgKCdxJywgMHg4RCwgaW50KQorI2RlZmluZSBQSE9ORV9SRUNfVk9MVU1FCQlfSU9XICgncScsIDB4OEUsIGludCkKKyNkZWZpbmUgUEhPTkVfUkVDX1ZPTFVNRV9MSU5FQVIJCV9JT1cgKCdxJywgMHhEQiwgaW50KQorI2RlZmluZSBQSE9ORV9SRUNfTEVWRUwJCQlfSU8gICgncScsIDB4OEYpCisKKyNkZWZpbmUgUEhPTkVfUExBWV9DT0RFQwkJX0lPVyAoJ3EnLCAweDkwLCBpbnQpCisjZGVmaW5lIFBIT05FX1BMQVlfU1RBUlQJCV9JTyAgKCdxJywgMHg5MSkKKyNkZWZpbmUgUEhPTkVfUExBWV9TVE9QCQkJX0lPICAoJ3EnLCAweDkyKQorI2RlZmluZSBQSE9ORV9QTEFZX0RFUFRICQlfSU9XICgncScsIDB4OTMsIGludCkKKyNkZWZpbmUgUEhPTkVfUExBWV9WT0xVTUUJCV9JT1cgKCdxJywgMHg5NCwgaW50KQorI2RlZmluZSBQSE9ORV9QTEFZX1ZPTFVNRV9MSU5FQVIJX0lPVyAoJ3EnLCAweERDLCBpbnQpCisjZGVmaW5lIFBIT05FX1BMQVlfTEVWRUwJCV9JTyAgKCdxJywgMHg5NSkKKyNkZWZpbmUgUEhPTkVfRFRNRl9SRUFEWQkJX0lPUiAoJ3EnLCAweDk2LCBpbnQpCisjZGVmaW5lIFBIT05FX0dFVF9EVE1GCQkJX0lPUiAoJ3EnLCAweDk3LCBpbnQpCisjZGVmaW5lIFBIT05FX0dFVF9EVE1GX0FTQ0lJCQlfSU9SICgncScsIDB4OTgsIGludCkKKyNkZWZpbmUgUEhPTkVfRFRNRl9PT0IJCQlfSU9XICgncScsIDB4OTksIGludCkKKyNkZWZpbmUgUEhPTkVfRVhDRVBUSU9OCQkJX0lPUiAoJ3EnLCAweDlBLCBpbnQpCisjZGVmaW5lIFBIT05FX1BMQVlfVE9ORQkJCV9JT1cgKCdxJywgMHg5QiwgY2hhcikKKyNkZWZpbmUgUEhPTkVfU0VUX1RPTkVfT05fVElNRQkJX0lPVyAoJ3EnLCAweDlDLCBpbnQpCisjZGVmaW5lIFBIT05FX1NFVF9UT05FX09GRl9USU1FCQlfSU9XICgncScsIDB4OUQsIGludCkKKyNkZWZpbmUgUEhPTkVfR0VUX1RPTkVfT05fVElNRQkJX0lPICAoJ3EnLCAweDlFKQorI2RlZmluZSBQSE9ORV9HRVRfVE9ORV9PRkZfVElNRQkJX0lPICAoJ3EnLCAweDlGKQorI2RlZmluZSBQSE9ORV9HRVRfVE9ORV9TVEFURQkJX0lPICAoJ3EnLCAweEEwKQorI2RlZmluZSBQSE9ORV9CVVNZCQkJX0lPICAoJ3EnLCAweEExKQorI2RlZmluZSBQSE9ORV9SSU5HQkFDSwkJCV9JTyAgKCdxJywgMHhBMikKKyNkZWZpbmUgUEhPTkVfRElBTFRPTkUJCQlfSU8gICgncScsIDB4QTMpCisjZGVmaW5lIFBIT05FX0NQVF9TVE9QCQkJX0lPICAoJ3EnLCAweEE0KQorCisjZGVmaW5lIFBIT05FX1BTVE5fU0VUX1NUQVRFCQlfSU9XICgncScsIDB4QTQsIGludCkKKyNkZWZpbmUgUEhPTkVfUFNUTl9HRVRfU1RBVEUJCV9JTyAgKCdxJywgMHhBNSkKKworI2RlZmluZSBQU1ROX09OX0hPT0sJCTAKKyNkZWZpbmUgUFNUTl9SSU5HSU5HCQkxCisjZGVmaW5lIFBTVE5fT0ZGX0hPT0sJCTIKKyNkZWZpbmUgUFNUTl9QVUxTRV9ESUFMCQkzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogCisqIFRoZSB3aW5rIGR1cmF0aW9uIGlzIHR1bmFibGUgd2l0aCB0aGlzIGlvY3RsLiAgVGhlIGRlZmF1bHQgd2luayBkdXJhdGlvbiAgCisqIGlzIDMyMG1zLiAgWW91IGRvIG5vdCBuZWVkIHRvIHVzZSB0aGlzIGlvY3RsIGlmIHlvdSBkbyBub3QgcmVxdWlyZSBhCisqIGRpZmZlcmVudCB3aW5rIGR1cmF0aW9uLgorKiAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUEhPTkVfV0lOS19EVVJBVElPTgkJX0lPVyAoJ3EnLCAweEE2LCBpbnQpCisjZGVmaW5lIFBIT05FX1dJTksJCQlfSU9XICgncScsIDB4QUEsIGludCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAKKyogIENvZGVjIERlZmluaXRpb25zCisqIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKwlHNzIzXzYzID0gMSwKKwlHNzIzXzUzID0gMiwKKwlUUzg1ID0gMywKKwlUUzQ4ID0gNCwKKwlUUzQxID0gNSwKKwlHNzI4ID0gNiwKKwlHNzI5ID0gNywKKwlVTEFXID0gOCwKKwlBTEFXID0gOSwKKwlMSU5FQVIxNiA9IDEwLAorCUxJTkVBUjggPSAxMSwKKwlXU1MgPSAxMiwKKwlHNzI5QiA9IDEzCit9IHBob25lX2NvZGVjOworCitzdHJ1Y3QgcGhvbmVfY29kZWNfZGF0YQoreworICAgICAgICBwaG9uZV9jb2RlYyB0eXBlOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBidWZfbWluLCBidWZfb3B0LCBidWZfbWF4OworfTsKKworI2RlZmluZSBQSE9ORV9RVUVSWV9DT0RFQyAgICAgICAgICAgICAgIF9JT1dSICgncScsIDB4QTcsIHN0cnVjdCBwaG9uZV9jb2RlY19kYXRhICopCisjZGVmaW5lIFBIT05FX1BTVE5fTElORVRFU1QgICAgICAgICAgICAgX0lPICgncScsIDB4QTgpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogCisqIFRoaXMgY29udHJvbHMgdGhlIFZBRC9DTkcgZnVuY3Rpb25hbGl0eSBvZiBHLjcyMy4xLiAgVGhlIGRyaXZlciB3aWxsCisqIGFsd2F5cyBwYXNzIGZ1bGwgc2l6ZSBmcmFtZXMsIGFueSB1bnVzZWQgYnl0ZXMgd2lsbCBiZSBwYWRkZWQgd2l0aCB6ZXJvcywKKyogYW5kIGZyYW1lcyBwYXNzZWQgdG8gdGhlIGRyaXZlciBzaG91bGQgYWxzbyBiZSBwYWRkZWQgd2l0aCB6ZXJvcy4gIFRoZQorKiBmcmFtZSB0eXBlIGlzIGVuY29kZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IHR3byBiaXRzIG9mIHRoZSBmaXJzdAorKiBXT1JEIG9mIHRoZSBmcmFtZSBhcyBmb2xsb3dzOgorKgorKiBiaXRzIDEtMAlGcmFtZSBUeXBlCURhdGEgUmF0ZQkJU2lnbmlmaWNhbnQgV29yZHMKKyogMDAJCTAJCUcuNzIzLjEgNi4zCQkxMgorKiAwMQkJMQkJRy43MjMuMSA1LjMJCTEwCisqIDEwCQkyCQlWQUQvQ05HCQkJIDIKKyogMTEJCTMJCVJlcGVhdCBsYXN0IENORwkJIDIgYml0cworKiAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUEhPTkVfVkFECQkJX0lPVyAoJ3EnLCAweEE5LCBpbnQpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBUaGUgZXhjZXB0aW9uIHN0cnVjdHVyZSBhbGxvd3MgdXMgdG8gbXVsdGlwbGV4IG11bHRpcGxlIGV2ZW50cyBvbnRvIHRoZQorKiBzZWxlY3QoKSBleGNlcHRpb24gc2V0LiAgSWYgYW55IG9mIHRoZXNlIGZsYWdzIGFyZSBzZXQgc2VsZWN0KCkgd2lsbAorKiByZXR1cm4gd2l0aCBhIHBvc2l0aXZlIGluZGljYXRpb24gb24gdGhlIGV4Y2VwdGlvbiBzZXQuICBUaGUgZHRtZl9yZWFkeQorKiBiaXQgaW5kaWNhdGVzIGlmIHRoZXJlIGlzIGRhdGEgd2FpdGluZyBpbiB0aGUgRFRNRiBidWZmZXIuICBUaGUKKyogaG9va3N0YXRlIGJpdCBpcyBzZXQgaWYgdGhlcmUgaXMgYSBjaGFuZ2UgaW4gaG9va3N0YXRlIHN0YXR1cywgaXQgZG9lcyBub3QKKyogaW5kaWNhdGUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGhvb2tzd2l0Y2guICBUaGUgcHN0bl9yaW5nIGJpdAorKiBpbmRpY2F0ZXMgdGhhdCB0aGUgREFBIG9uIGEgTGluZUpBQ0sgY2FyZCBoYXMgZGV0ZWN0ZWQgcmluZyB2b2x0YWdlIG9uCisqIHRoZSBQU1ROIHBvcnQuICBUaGUgY2FsbGVyX2lkIGJpdCBpbmRpY2F0ZXMgdGhhdCBjYWxsZXJfaWQgZGF0YSBoYXMgYmVlbgorKiByZWNlaXZlZCBhbmQgaXMgYXZhaWxhYmxlLiAgVGhlIHBzdG5fd2luayBiaXQgaW5kaWNhdGVzIHRoYXQgdGhlIERBQSBvbgorKiB0aGUgTGluZUpBQ0sgaGFzIHJlY2VpdmVkIGEgd2luayBmcm9tIHRoZSB0ZWxjbyBzd2l0Y2guICBUaGUgZjAsIGYxLCBmMgorKiBhbmQgZjMgYml0cyBpbmRpY2F0ZSB0aGF0IHRoZSBmaWx0ZXIgaGFzIGJlZW4gdHJpZ2dlcmVkIGJ5IGRldGVjdGluZyB0aGUKKyogZnJlcXVlbmN5IHByb2dyYW1tZWQgaW50byB0aGF0IGZpbHRlci4KKyoKKyogVGhlIHJlbWFpbmluZyBiaXRzIHNob3VsZCBiZSBzZXQgdG8gemVyby4gVGhleSB3aWxsIGJlY29tZSBkZWZpbmVkIG92ZXIgdGltZQorKiBmb3Igb3RoZXIgaW50ZXJmYWNlIGNhcmRzIGFuZCB0aGVpciBuZWVkcy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBwaG9uZV9leGNlcHQKK3sKKwl1bnNpZ25lZCBpbnQgZHRtZl9yZWFkeToxOworCXVuc2lnbmVkIGludCBob29rc3RhdGU6MTsKKwl1bnNpZ25lZCBpbnQgcHN0bl9yaW5nOjE7CisJdW5zaWduZWQgaW50IGNhbGxlcl9pZDoxOworCXVuc2lnbmVkIGludCBwc3RuX3dpbms6MTsKKwl1bnNpZ25lZCBpbnQgZjA6MTsKKwl1bnNpZ25lZCBpbnQgZjE6MTsKKwl1bnNpZ25lZCBpbnQgZjI6MTsKKwl1bnNpZ25lZCBpbnQgZjM6MTsKKwl1bnNpZ25lZCBpbnQgZmxhc2g6MTsKKwl1bnNpZ25lZCBpbnQgZmMwOjE7CisJdW5zaWduZWQgaW50IGZjMToxOworCXVuc2lnbmVkIGludCBmYzI6MTsKKwl1bnNpZ25lZCBpbnQgZmMzOjE7CisJdW5zaWduZWQgaW50IHJlc2VydmVkOjE4OworfTsKKwordW5pb24gdGVsZXBob255X2V4Y2VwdGlvbiB7CisJc3RydWN0IHBob25lX2V4Y2VwdCBiaXRzOworCXVuc2lnbmVkIGludCBieXRlczsKK307CisKKworI2VuZGlmCQkvKiBURUxFUEhPTllfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Rlcm1pb3MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGVybWlvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhY2QwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Rlcm1pb3MuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9MSU5VWF9URVJNSU9TX0gKKyNkZWZpbmUgX0xJTlVYX1RFUk1JT1NfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vdGVybWlvcy5oPgorCisjZGVmaW5lIE5GRgk1CisKK3N0cnVjdCB0ZXJtaW94Cit7CisJX191MTYJeF9oZmxhZzsKKwlfX3UxNgl4X2NmbGFnOworCV9fdTE2CXhfcmZsYWdbTkZGXTsKKwlfX3UxNgl4X3NmbGFnOworfTsKKworI2RlZmluZQlSVFNYT0ZGCQkweDAwMDEJCS8qIFJUUyBmbG93IGNvbnRyb2wgb24gaW5wdXQgKi8KKyNkZWZpbmUJQ1RTWE9OCQkweDAwMDIJCS8qIENUUyBmbG93IGNvbnRyb2wgb24gb3V0cHV0ICovCisjZGVmaW5lCURUUlhPRkYJCTB4MDAwNAkJLyogRFRSIGZsb3cgY29udHJvbCBvbiBpbnB1dCAqLworI2RlZmluZSBEU1JYT04JCTB4MDAwOAkJLyogRENEIGZsb3cgY29udHJvbCBvbiBvdXRwdXQgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RpbWUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZjVmZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RpbWUuaApAQCAtMCwwICsxLDc5IEBACisjaWZuZGVmIF9MSU5VWF9USU1FX0gKKyNkZWZpbmUgX0xJTlVYX1RJTUVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworCisjaWZuZGVmIF9TVFJVQ1RfVElNRVNQRUMKKyNkZWZpbmUgX1NUUlVDVF9USU1FU1BFQworc3RydWN0IHRpbWVzcGVjIHsKKwlfX2tlcm5lbF90aW1lX3QJdHZfc2VjOwkJCS8qIHNlY29uZHMgKi8KKwlsb25nCQl0dl9uc2VjOwkJLyogbmFub3NlY29uZHMgKi8KK307CisjZW5kaWYKKworc3RydWN0IHRpbWV2YWwgeworCV9fa2VybmVsX3RpbWVfdAkJdHZfc2VjOwkJLyogc2Vjb25kcyAqLworCV9fa2VybmVsX3N1c2Vjb25kc190CXR2X3VzZWM7CS8qIG1pY3Jvc2Vjb25kcyAqLworfTsKKworc3RydWN0IHRpbWV6b25lIHsKKwlpbnQJdHpfbWludXRlc3dlc3Q7CS8qIG1pbnV0ZXMgd2VzdCBvZiBHcmVlbndpY2ggKi8KKwlpbnQJdHpfZHN0dGltZTsJLyogdHlwZSBvZiBkc3QgY29ycmVjdGlvbiAqLworfTsKKworCisjZGVmaW5lIE5GREJJVFMJCQlfX05GREJJVFMKKworI2RlZmluZSBGRF9TRVRTSVpFCQlfX0ZEX1NFVFNJWkUKKyNkZWZpbmUgRkRfU0VUKGZkLGZkc2V0cCkJX19GRF9TRVQoZmQsZmRzZXRwKQorI2RlZmluZSBGRF9DTFIoZmQsZmRzZXRwKQlfX0ZEX0NMUihmZCxmZHNldHApCisjZGVmaW5lIEZEX0lTU0VUKGZkLGZkc2V0cCkJX19GRF9JU1NFVChmZCxmZHNldHApCisjZGVmaW5lIEZEX1pFUk8oZmRzZXRwKQkJX19GRF9aRVJPKGZkc2V0cCkKKworLyoKKyAqIE5hbWVzIG9mIHRoZSBpbnRlcnZhbCB0aW1lcnMsIGFuZCBzdHJ1Y3R1cmUKKyAqIGRlZmluaW5nIGEgdGltZXIgc2V0dGluZzoKKyAqLworI2RlZmluZQlJVElNRVJfUkVBTAkJMAorI2RlZmluZQlJVElNRVJfVklSVFVBTAkJMQorI2RlZmluZQlJVElNRVJfUFJPRgkJMgorCitzdHJ1Y3QgaXRpbWVyc3BlYyB7CisJc3RydWN0IHRpbWVzcGVjIGl0X2ludGVydmFsOwkvKiB0aW1lciBwZXJpb2QgKi8KKwlzdHJ1Y3QgdGltZXNwZWMgaXRfdmFsdWU7CS8qIHRpbWVyIGV4cGlyYXRpb24gKi8KK307CisKK3N0cnVjdCBpdGltZXJ2YWwgeworCXN0cnVjdCB0aW1ldmFsIGl0X2ludGVydmFsOwkvKiB0aW1lciBpbnRlcnZhbCAqLworCXN0cnVjdCB0aW1ldmFsIGl0X3ZhbHVlOwkvKiBjdXJyZW50IHZhbHVlICovCit9OworCisvKgorICogVGhlIElEcyBvZiB0aGUgdmFyaW91cyBzeXN0ZW0gY2xvY2tzIChmb3IgUE9TSVguMWIgaW50ZXJ2YWwgdGltZXJzKToKKyAqLworI2RlZmluZSBDTE9DS19SRUFMVElNRQkJCTAKKyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDCQkJMQorI2RlZmluZSBDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQJMgorI2RlZmluZSBDTE9DS19USFJFQURfQ1BVVElNRV9JRAkJMworI2RlZmluZSBDTE9DS19NT05PVE9OSUNfUkFXCQk0CisjZGVmaW5lIENMT0NLX1JFQUxUSU1FX0NPQVJTRQkJNQorI2RlZmluZSBDTE9DS19NT05PVE9OSUNfQ09BUlNFCQk2CisjZGVmaW5lIENMT0NLX0JPT1RUSU1FCQkJNworI2RlZmluZSBDTE9DS19SRUFMVElNRV9BTEFSTQkJOAorI2RlZmluZSBDTE9DS19CT09UVElNRV9BTEFSTQkJOQorCisvKgorICogVGhlIElEcyBvZiB2YXJpb3VzIGhhcmR3YXJlIGNsb2NrczoKKyAqLworI2RlZmluZSBDTE9DS19TR0lfQ1lDTEUJCQkxMAorI2RlZmluZSBNQVhfQ0xPQ0tTCQkJMTYKKyNkZWZpbmUgQ0xPQ0tTX01BU0sJCQkoQ0xPQ0tfUkVBTFRJTUUgfCBDTE9DS19NT05PVE9OSUMpCisjZGVmaW5lIENMT0NLU19NT05PCQkJQ0xPQ0tfTU9OT1RPTklDCisKKy8qCisgKiBUaGUgdmFyaW91cyBmbGFncyBmb3Igc2V0dGluZyBQT1NJWC4xYiBpbnRlcnZhbCB0aW1lcnM6CisgKi8KKyNkZWZpbmUgVElNRVJfQUJTVElNRQkJCTB4MDEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RpbWVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RpbWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdiNjI2MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGltZXMuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9MSU5VWF9USU1FU19ICisjZGVmaW5lIF9MSU5VWF9USU1FU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgdG1zIHsKKwlfX2tlcm5lbF9jbG9ja190IHRtc191dGltZTsKKwlfX2tlcm5lbF9jbG9ja190IHRtc19zdGltZTsKKwlfX2tlcm5lbF9jbG9ja190IHRtc19jdXRpbWU7CisJX19rZXJuZWxfY2xvY2tfdCB0bXNfY3N0aW1lOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RpbWV4LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RpbWV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlmOTQzYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGltZXguaApAQCAtMCwwICsxLDE2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoYykgRGF2aWQgTC4gTWlsbHMgMTk5MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgICAgICoKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgKgorICogdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGUgICAqCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nICAgICAgICAgICoKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIFVuaXZlcnNpdHkgb2YgRGVsYXdhcmUgbm90IGJlIHVzZWQgaW4gICAgKgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSAgICAgICAqCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgVW5pdmVyc2l0eSBvZiBEZWxhd2FyZSAgICoKKyAqIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55ICAgICAgKgorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIE1vZGlmaWNhdGlvbiBoaXN0b3J5IHRpbWV4LmgKKyAqCisgKiAyOSBEZWMgOTcJUnVzc2VsbCBLaW5nCisgKglNb3ZlZCBDTE9DS19USUNLX1JBVEUsIENMT0NLX1RJQ0tfRkFDVE9SIGFuZCBGSU5FVFVORSB0byBhc20vdGltZXguaAorICoJZm9yIEFSTSBtYWNoaW5lcworICoKKyAqICA5IEphbiA5NyAgICBBZHJpYW4gU3VuCisgKiAgICAgIFNoaWZ0ZWQgTEFUQ0ggZGVmaW5lIHRvIGFsbG93IGFjY2VzcyB0byBhbHBoYSBtYWNoaW5lcy4KKyAqCisgKiAyNiBTZXAgOTQJRGF2aWQgTC4gTWlsbHMKKyAqCUFkZGVkIGRlZmluZXMgZm9yIGh5YnJpZCBwaGFzZS9mcmVxdWVuY3ktbG9jayBsb29wLgorICoKKyAqIDE5IE1hciA5NAlEYXZpZCBMLiBNaWxscworICoJTW92ZWQgZGVmaW5lcyBmcm9tIGtlcm5lbCByb3V0aW5lcyB0byBoZWFkZXIgZmlsZSBhbmQgYWRkZWQgbmV3CisgKglkZWZpbmVzIGZvciBQUFMgcGhhc2UtbG9jayBsb29wLgorICoKKyAqIDIwIEZlYiA5NAlEYXZpZCBMLiBNaWxscworICoJUmV2aXNlZCBzdGF0dXMgY29kZXMgYW5kIHN0cnVjdHVyZXMgZm9yIGV4dGVybmFsIGNsb2NrIGFuZCBQUFMKKyAqCXNpZ25hbCBkaXNjaXBsaW5lLgorICoKKyAqIDI4IE5vdiA5MwlEYXZpZCBMLiBNaWxscworICoJQWRqdXN0ZWQgcGFyYW1ldGVycyB0byBpbXByb3ZlIHN0YWJpbGl0eSBhbmQgaW5jcmVhc2UgcG9sbAorICoJaW50ZXJ2YWwuCisgKgorICogMTcgU2VwIDkzICAgIERhdmlkIEwuIE1pbGxzCisgKiAgICAgIENyZWF0ZWQgZmlsZSAkTlRQL2luY2x1ZGUvc3lzL3RpbWV4LmgKKyAqIDA3IE9jdCA5MyAgICBUb3JzdGVuIER1d2UKKyAqICAgICAgRGVyaXZlZCBsaW51eC90aW1leC5oCisgKiAxOTk1LTA4LTEzICAgIFRvcnN0ZW4gRHV3ZQorICogICAgICBrZXJuZWwgUExMIHVwZGF0ZWQgdG8gMTk5NC0xMi0xMyBzcGVjcyAocmZjLTE1ODkpCisgKiAxOTk3LTA4LTMwICAgIFVscmljaCBXaW5kbAorICogICAgICBBZGRlZCBuZXcgY29uc3RhbnQgTlRQX1BIQVNFX0xJTUlUCisgKiAyMDA0LTA4LTEyICAgIENocmlzdG9waCBMYW1ldGVyCisgKiAgICAgIFJld29ya2VkIHRpbWUgaW50ZXJwb2xhdGlvbiBsb2dpYworICovCisjaWZuZGVmIF9MSU5VWF9USU1FWF9ICisjZGVmaW5lIF9MSU5VWF9USU1FWF9ICisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKyNkZWZpbmUgTlRQX0FQSQkJNAkvKiBOVFAgQVBJIHZlcnNpb24gKi8KKworLyoKKyAqIHN5c2NhbGwgaW50ZXJmYWNlIC0gdXNlZCAobWFpbmx5IGJ5IE5UUCBkYWVtb24pCisgKiB0byBkaXNjaXBsaW5lIGtlcm5lbCBjbG9jayBvc2NpbGxhdG9yCisgKi8KK3N0cnVjdCB0aW1leCB7CisJdW5zaWduZWQgaW50IG1vZGVzOwkvKiBtb2RlIHNlbGVjdG9yICovCisJbG9uZyBvZmZzZXQ7CQkvKiB0aW1lIG9mZnNldCAodXNlYykgKi8KKwlsb25nIGZyZXE7CQkvKiBmcmVxdWVuY3kgb2Zmc2V0IChzY2FsZWQgcHBtKSAqLworCWxvbmcgbWF4ZXJyb3I7CQkvKiBtYXhpbXVtIGVycm9yICh1c2VjKSAqLworCWxvbmcgZXN0ZXJyb3I7CQkvKiBlc3RpbWF0ZWQgZXJyb3IgKHVzZWMpICovCisJaW50IHN0YXR1czsJCS8qIGNsb2NrIGNvbW1hbmQvc3RhdHVzICovCisJbG9uZyBjb25zdGFudDsJCS8qIHBsbCB0aW1lIGNvbnN0YW50ICovCisJbG9uZyBwcmVjaXNpb247CQkvKiBjbG9jayBwcmVjaXNpb24gKHVzZWMpIChyZWFkIG9ubHkpICovCisJbG9uZyB0b2xlcmFuY2U7CQkvKiBjbG9jayBmcmVxdWVuY3kgdG9sZXJhbmNlIChwcG0pCisJCQkJICogKHJlYWQgb25seSkKKwkJCQkgKi8KKwlzdHJ1Y3QgdGltZXZhbCB0aW1lOwkvKiAocmVhZCBvbmx5LCBleGNlcHQgZm9yIEFESl9TRVRPRkZTRVQpICovCisJbG9uZyB0aWNrOwkJLyogKG1vZGlmaWVkKSB1c2VjcyBiZXR3ZWVuIGNsb2NrIHRpY2tzICovCisKKwlsb25nIHBwc2ZyZXE7ICAgICAgICAgICAvKiBwcHMgZnJlcXVlbmN5IChzY2FsZWQgcHBtKSAocm8pICovCisJbG9uZyBqaXR0ZXI7ICAgICAgICAgICAgLyogcHBzIGppdHRlciAodXMpIChybykgKi8KKwlpbnQgc2hpZnQ7ICAgICAgICAgICAgICAvKiBpbnRlcnZhbCBkdXJhdGlvbiAocykgKHNoaWZ0KSAocm8pICovCisJbG9uZyBzdGFiaWw7ICAgICAgICAgICAgLyogcHBzIHN0YWJpbGl0eSAoc2NhbGVkIHBwbSkgKHJvKSAqLworCWxvbmcgaml0Y250OyAgICAgICAgICAgIC8qIGppdHRlciBsaW1pdCBleGNlZWRlZCAocm8pICovCisJbG9uZyBjYWxjbnQ7ICAgICAgICAgICAgLyogY2FsaWJyYXRpb24gaW50ZXJ2YWxzIChybykgKi8KKwlsb25nIGVycmNudDsgICAgICAgICAgICAvKiBjYWxpYnJhdGlvbiBlcnJvcnMgKHJvKSAqLworCWxvbmcgc3RiY250OyAgICAgICAgICAgIC8qIHN0YWJpbGl0eSBsaW1pdCBleGNlZWRlZCAocm8pICovCisKKwlpbnQgdGFpOwkJLyogVEFJIG9mZnNldCAocm8pICovCisKKwlpbnQgIDozMjsgaW50ICA6MzI7IGludCAgOjMyOyBpbnQgIDozMjsKKwlpbnQgIDozMjsgaW50ICA6MzI7IGludCAgOjMyOyBpbnQgIDozMjsKKwlpbnQgIDozMjsgaW50ICA6MzI7IGludCAgOjMyOworfTsKKworLyoKKyAqIE1vZGUgY29kZXMgKHRpbWV4Lm1vZGUpCisgKi8KKyNkZWZpbmUgQURKX09GRlNFVAkJMHgwMDAxCS8qIHRpbWUgb2Zmc2V0ICovCisjZGVmaW5lIEFESl9GUkVRVUVOQ1kJCTB4MDAwMgkvKiBmcmVxdWVuY3kgb2Zmc2V0ICovCisjZGVmaW5lIEFESl9NQVhFUlJPUgkJMHgwMDA0CS8qIG1heGltdW0gdGltZSBlcnJvciAqLworI2RlZmluZSBBREpfRVNURVJST1IJCTB4MDAwOAkvKiBlc3RpbWF0ZWQgdGltZSBlcnJvciAqLworI2RlZmluZSBBREpfU1RBVFVTCQkweDAwMTAJLyogY2xvY2sgc3RhdHVzICovCisjZGVmaW5lIEFESl9USU1FQ09OU1QJCTB4MDAyMAkvKiBwbGwgdGltZSBjb25zdGFudCAqLworI2RlZmluZSBBREpfVEFJCQkJMHgwMDgwCS8qIHNldCBUQUkgb2Zmc2V0ICovCisjZGVmaW5lIEFESl9TRVRPRkZTRVQJCTB4MDEwMCAgLyogYWRkICd0aW1lJyB0byBjdXJyZW50IHRpbWUgKi8KKyNkZWZpbmUgQURKX01JQ1JPCQkweDEwMDAJLyogc2VsZWN0IG1pY3Jvc2Vjb25kIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgQURKX05BTk8JCTB4MjAwMAkvKiBzZWxlY3QgbmFub3NlY29uZCByZXNvbHV0aW9uICovCisjZGVmaW5lIEFESl9USUNLCQkweDQwMDAJLyogdGljayB2YWx1ZSAqLworCisjZGVmaW5lIEFESl9PRkZTRVRfU0lOR0xFU0hPVAkweDgwMDEJLyogb2xkLWZhc2hpb25lZCBhZGp0aW1lICovCisjZGVmaW5lIEFESl9PRkZTRVRfU1NfUkVBRAkweGEwMDEJLyogcmVhZC1vbmx5IGFkanRpbWUgKi8KKworLyogTlRQIHVzZXJsYW5kIGxpa2VzIHRoZSBNT0RfIHByZWZpeCBiZXR0ZXIgKi8KKyNkZWZpbmUgTU9EX09GRlNFVAlBREpfT0ZGU0VUCisjZGVmaW5lIE1PRF9GUkVRVUVOQ1kJQURKX0ZSRVFVRU5DWQorI2RlZmluZSBNT0RfTUFYRVJST1IJQURKX01BWEVSUk9SCisjZGVmaW5lIE1PRF9FU1RFUlJPUglBREpfRVNURVJST1IKKyNkZWZpbmUgTU9EX1NUQVRVUwlBREpfU1RBVFVTCisjZGVmaW5lIE1PRF9USU1FQ09OU1QJQURKX1RJTUVDT05TVAorI2RlZmluZSBNT0RfVEFJCUFESl9UQUkKKyNkZWZpbmUgTU9EX01JQ1JPCUFESl9NSUNSTworI2RlZmluZSBNT0RfTkFOTwlBREpfTkFOTworCisKKy8qCisgKiBTdGF0dXMgY29kZXMgKHRpbWV4LnN0YXR1cykKKyAqLworI2RlZmluZSBTVEFfUExMCQkweDAwMDEJLyogZW5hYmxlIFBMTCB1cGRhdGVzIChydykgKi8KKyNkZWZpbmUgU1RBX1BQU0ZSRVEJMHgwMDAyCS8qIGVuYWJsZSBQUFMgZnJlcSBkaXNjaXBsaW5lIChydykgKi8KKyNkZWZpbmUgU1RBX1BQU1RJTUUJMHgwMDA0CS8qIGVuYWJsZSBQUFMgdGltZSBkaXNjaXBsaW5lIChydykgKi8KKyNkZWZpbmUgU1RBX0ZMTAkJMHgwMDA4CS8qIHNlbGVjdCBmcmVxdWVuY3ktbG9jayBtb2RlIChydykgKi8KKworI2RlZmluZSBTVEFfSU5TCQkweDAwMTAJLyogaW5zZXJ0IGxlYXAgKHJ3KSAqLworI2RlZmluZSBTVEFfREVMCQkweDAwMjAJLyogZGVsZXRlIGxlYXAgKHJ3KSAqLworI2RlZmluZSBTVEFfVU5TWU5DCTB4MDA0MAkvKiBjbG9jayB1bnN5bmNocm9uaXplZCAocncpICovCisjZGVmaW5lIFNUQV9GUkVRSE9MRAkweDAwODAJLyogaG9sZCBmcmVxdWVuY3kgKHJ3KSAqLworCisjZGVmaW5lIFNUQV9QUFNTSUdOQUwJMHgwMTAwCS8qIFBQUyBzaWduYWwgcHJlc2VudCAocm8pICovCisjZGVmaW5lIFNUQV9QUFNKSVRURVIJMHgwMjAwCS8qIFBQUyBzaWduYWwgaml0dGVyIGV4Y2VlZGVkIChybykgKi8KKyNkZWZpbmUgU1RBX1BQU1dBTkRFUgkweDA0MDAJLyogUFBTIHNpZ25hbCB3YW5kZXIgZXhjZWVkZWQgKHJvKSAqLworI2RlZmluZSBTVEFfUFBTRVJST1IJMHgwODAwCS8qIFBQUyBzaWduYWwgY2FsaWJyYXRpb24gZXJyb3IgKHJvKSAqLworCisjZGVmaW5lIFNUQV9DTE9DS0VSUgkweDEwMDAJLyogY2xvY2sgaGFyZHdhcmUgZmF1bHQgKHJvKSAqLworI2RlZmluZSBTVEFfTkFOTwkweDIwMDAJLyogcmVzb2x1dGlvbiAoMCA9IHVzLCAxID0gbnMpIChybykgKi8KKyNkZWZpbmUgU1RBX01PREUJMHg0MDAwCS8qIG1vZGUgKDAgPSBQTEwsIDEgPSBGTEwpIChybykgKi8KKyNkZWZpbmUgU1RBX0NMSwkJMHg4MDAwCS8qIGNsb2NrIHNvdXJjZSAoMCA9IEEsIDEgPSBCKSAocm8pICovCisKKy8qIHJlYWQtb25seSBiaXRzICovCisjZGVmaW5lIFNUQV9ST05MWSAoU1RBX1BQU1NJR05BTCB8IFNUQV9QUFNKSVRURVIgfCBTVEFfUFBTV0FOREVSIHwgXAorCVNUQV9QUFNFUlJPUiB8IFNUQV9DTE9DS0VSUiB8IFNUQV9OQU5PIHwgU1RBX01PREUgfCBTVEFfQ0xLKQorCisvKgorICogQ2xvY2sgc3RhdGVzICh0aW1lX3N0YXRlKQorICovCisjZGVmaW5lIFRJTUVfT0sJCTAJLyogY2xvY2sgc3luY2hyb25pemVkLCBubyBsZWFwIHNlY29uZCAqLworI2RlZmluZSBUSU1FX0lOUwkxCS8qIGluc2VydCBsZWFwIHNlY29uZCAqLworI2RlZmluZSBUSU1FX0RFTAkyCS8qIGRlbGV0ZSBsZWFwIHNlY29uZCAqLworI2RlZmluZSBUSU1FX09PUAkzCS8qIGxlYXAgc2Vjb25kIGluIHByb2dyZXNzICovCisjZGVmaW5lIFRJTUVfV0FJVAk0CS8qIGxlYXAgc2Vjb25kIGhhcyBvY2N1cnJlZCAqLworI2RlZmluZSBUSU1FX0VSUk9SCTUJLyogY2xvY2sgbm90IHN5bmNocm9uaXplZCAqLworI2RlZmluZSBUSU1FX0JBRAlUSU1FX0VSUk9SIC8qIGJ3IGNvbXBhdCAqLworCisKKyNlbmRpZiAvKiBMSU5VWF9USU1FWF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Rpb2NsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Rpb2NsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc1Njg2MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGlvY2wuaApAQCAtMCwwICsxLDM5IEBACisjaWZuZGVmIF9MSU5VWF9USU9DTF9ICisjZGVmaW5lIF9MSU5VWF9USU9DTF9ICisKKyNkZWZpbmUgVElPQ0xfU0VUU0VMCTIJLyogc2V0IGEgc2VsZWN0aW9uICovCisjZGVmaW5lIAlUSU9DTF9TRUxDSEFSCTAJLyogc2VsZWN0IGNoYXJhY3RlcnMgKi8KKyNkZWZpbmUgCVRJT0NMX1NFTFdPUkQJMQkvKiBzZWxlY3Qgd2hvbGUgd29yZHMgKi8KKyNkZWZpbmUgCVRJT0NMX1NFTExJTkUJMgkvKiBzZWxlY3Qgd2hvbGUgbGluZXMgKi8KKyNkZWZpbmUgCVRJT0NMX1NFTFBPSU5URVIJMwkvKiBzaG93IHRoZSBwb2ludGVyICovCisjZGVmaW5lIAlUSU9DTF9TRUxDTEVBUgk0CS8qIGNsZWFyIHZpc2liaWxpdHkgb2Ygc2VsZWN0aW9uICovCisjZGVmaW5lIAlUSU9DTF9TRUxNT1VTRVJFUE9SVAkxNgkvKiByZXBvcnQgYmVnaW5uaW5nIG9mIHNlbGVjdGlvbiAqLworI2RlZmluZSAJVElPQ0xfU0VMQlVUVE9OTUFTSwkxNQkvKiBidXR0b24gbWFzayBmb3IgcmVwb3J0ICovCisvKiBzZWxlY3Rpb24gZXh0ZW50ICovCitzdHJ1Y3QgdGlvY2xfc2VsZWN0aW9uIHsKKwl1bnNpZ25lZCBzaG9ydCB4czsJLyogWCBzdGFydCAqLworCXVuc2lnbmVkIHNob3J0IHlzOwkvKiBZIHN0YXJ0ICovCisJdW5zaWduZWQgc2hvcnQgeGU7CS8qIFggZW5kICovCisJdW5zaWduZWQgc2hvcnQgeWU7CS8qIFkgZW5kICovCisJdW5zaWduZWQgc2hvcnQgc2VsX21vZGU7CS8qIHNlbGVjdGlvbiBtb2RlICovCit9OworCisjZGVmaW5lIFRJT0NMX1BBU1RFU0VMCTMJLyogcGFzdGUgcHJldmlvdXMgc2VsZWN0aW9uICovCisjZGVmaW5lIFRJT0NMX1VOQkxBTktTQ1JFRU4JNAkvKiB1bmJsYW5rIHNjcmVlbiAqLworCisjZGVmaW5lIFRJT0NMX1NFTExPQURMVVQJNQorCS8qIHNldCBjaGFyYWN0ZXJzIHRvIGJlIGNvbnNpZGVyZWQgYWxwaGFiZXRpYyB3aGVuIHNlbGVjdGluZyAqLworCS8qIHUzMls4XSBiaXQgYXJyYXksIDQgYnl0ZXMtYWxpZ25lZCB3aXRoIHR5cGUgKi8KKworLyogdGhlc2UgdHdvIGRvbid0IHJldHVybiBhIHZhbHVlOiB0aGV5IHdyaXRlIGl0IGJhY2sgaW4gdGhlIHR5cGUgKi8KKyNkZWZpbmUgVElPQ0xfR0VUU0hJRlRTVEFURQk2CS8qIHdyaXRlIHNoaWZ0IHN0YXRlICovCisjZGVmaW5lIFRJT0NMX0dFVE1PVVNFUkVQT1JUSU5HCTcJLyogd3JpdGUgd2hldGhlciBtb3VzZSBldmVudCBhcmUgcmVwb3J0ZWQgKi8KKyNkZWZpbmUgVElPQ0xfU0VUVkVTQUJMQU5LCTEwCS8qIHNldCB2ZXNhIGJsYW5raW5nIG1vZGUgKi8KKyNkZWZpbmUgVElPQ0xfU0VUS01TR1JFRElSRUNUCTExCS8qIHJlc3RyaWN0IGtlcm5lbCBtZXNzYWdlcyB0byBhIHZ0ICovCisjZGVmaW5lIFRJT0NMX0dFVEZHQ09OU09MRQkxMgkvKiBnZXQgZm9yZWdyb3VuZCB2dCAqLworI2RlZmluZSBUSU9DTF9TQ1JPTExDT05TT0xFCTEzCS8qIHNjcm9sbCBjb25zb2xlICovCisjZGVmaW5lIFRJT0NMX0JMQU5LU0NSRUVOCTE0CS8qIGtlZXAgc2NyZWVuIGJsYW5rIGV2ZW4gaWYgYSBrZXkgaXMgcHJlc3NlZCAqLworI2RlZmluZSBUSU9DTF9CTEFOS0VEU0NSRUVOCTE1CS8qIHJldHVybiB3aGljaCB2dCB3YXMgYmxhbmtlZCAqLworI2RlZmluZSBUSU9DTF9HRVRLTVNHUkVESVJFQ1QJMTcJLyogZ2V0IHRoZSB2dCB0aGUga2VybmVsIG1lc3NhZ2VzIGFyZSByZXN0cmljdGVkIHRvICovCisKKyNlbmRpZiAvKiBfTElOVVhfVElPQ0xfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90aXBjLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RpcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTJjYTBmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90aXBjLmgKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBpbmNsdWRlL2xpbnV4L3RpcGMuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIHNvY2tldCBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMC0yMDExLCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX0xJTlVYX1RJUENfSF8KKyNkZWZpbmUgX0xJTlVYX1RJUENfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBUSVBDIGFkZHJlc3NpbmcgcHJpbWl0aXZlcworICovCisKK3N0cnVjdCB0aXBjX3BvcnRpZCB7CisJX191MzIgcmVmOworCV9fdTMyIG5vZGU7Cit9OworCitzdHJ1Y3QgdGlwY19uYW1lIHsKKwlfX3UzMiB0eXBlOworCV9fdTMyIGluc3RhbmNlOworfTsKKworc3RydWN0IHRpcGNfbmFtZV9zZXEgeworCV9fdTMyIHR5cGU7CisJX191MzIgbG93ZXI7CisJX191MzIgdXBwZXI7Cit9OworCitzdGF0aWMgX19pbmxpbmVfXyBfX3UzMiB0aXBjX2FkZHIodW5zaWduZWQgaW50IHpvbmUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY2x1c3RlciwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBub2RlKQoreworCXJldHVybiAoem9uZSA8PCAyNCkgfCAoY2x1c3RlciA8PCAxMikgfCBub2RlOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgdGlwY196b25lKF9fdTMyIGFkZHIpCit7CisJcmV0dXJuIGFkZHIgPj4gMjQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCB0aXBjX2NsdXN0ZXIoX191MzIgYWRkcikKK3sKKwlyZXR1cm4gKGFkZHIgPj4gMTIpICYgMHhmZmY7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCB0aXBjX25vZGUoX191MzIgYWRkcikKK3sKKwlyZXR1cm4gYWRkciAmIDB4ZmZmOworfQorCisvKgorICogQXBwbGljYXRpb24tYWNjZXNzaWJsZSBwb3J0IG5hbWUgdHlwZXMKKyAqLworCisjZGVmaW5lIFRJUENfQ0ZHX1NSVgkJMAkvKiBjb25maWd1cmF0aW9uIHNlcnZpY2UgbmFtZSB0eXBlICovCisjZGVmaW5lIFRJUENfVE9QX1NSVgkJMQkvKiB0b3BvbG9neSBzZXJ2aWNlIG5hbWUgdHlwZSAqLworI2RlZmluZSBUSVBDX1JFU0VSVkVEX1RZUEVTCTY0CS8qIGxvd2VzdCB1c2VyLXB1Ymxpc2hhYmxlIG5hbWUgdHlwZSAqLworCisvKgorICogUHVibGljYXRpb24gc2NvcGVzIHdoZW4gYmluZGluZyBwb3J0IG5hbWVzIGFuZCBwb3J0IG5hbWUgc2VxdWVuY2VzCisgKi8KKworI2RlZmluZSBUSVBDX1pPTkVfU0NPUEUJCTEKKyNkZWZpbmUgVElQQ19DTFVTVEVSX1NDT1BFCTIKKyNkZWZpbmUgVElQQ19OT0RFX1NDT1BFCQkzCisKKy8qCisgKiBMaW1pdGluZyB2YWx1ZXMgZm9yIG1lc3NhZ2VzCisgKi8KKworI2RlZmluZSBUSVBDX01BWF9VU0VSX01TR19TSVpFCTY2MDAwVQorCisvKgorICogTWVzc2FnZSBpbXBvcnRhbmNlIGxldmVscworICovCisKKyNkZWZpbmUgVElQQ19MT1dfSU1QT1JUQU5DRQkJMAorI2RlZmluZSBUSVBDX01FRElVTV9JTVBPUlRBTkNFCQkxCisjZGVmaW5lIFRJUENfSElHSF9JTVBPUlRBTkNFCQkyCisjZGVmaW5lIFRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRQkzCisKKy8qCisgKiBNc2cgcmVqZWN0aW9uL2Nvbm5lY3Rpb24gc2h1dGRvd24gcmVhc29ucworICovCisKKyNkZWZpbmUgVElQQ19PSwkJCTAKKyNkZWZpbmUgVElQQ19FUlJfTk9fTkFNRQkxCisjZGVmaW5lIFRJUENfRVJSX05PX1BPUlQJMgorI2RlZmluZSBUSVBDX0VSUl9OT19OT0RFCTMKKyNkZWZpbmUgVElQQ19FUlJfT1ZFUkxPQUQJNAorI2RlZmluZSBUSVBDX0NPTk5fU0hVVERPV04JNQorCisvKgorICogVElQQyB0b3BvbG9neSBzdWJzY3JpcHRpb24gc2VydmljZSBkZWZpbml0aW9ucworICovCisKKyNkZWZpbmUgVElQQ19TVUJfUE9SVFMJCTB4MDEJLyogZmlsdGVyIGZvciBwb3J0IGF2YWlsYWJpbGl0eSAqLworI2RlZmluZSBUSVBDX1NVQl9TRVJWSUNFCTB4MDIJLyogZmlsdGVyIGZvciBzZXJ2aWNlIGF2YWlsYWJpbGl0eSAqLworI2RlZmluZSBUSVBDX1NVQl9DQU5DRUwJCTB4MDQJLyogY2FuY2VsIGEgc3Vic2NyaXB0aW9uICovCisKKyNkZWZpbmUgVElQQ19XQUlUX0ZPUkVWRVIJKH4wKQkvKiB0aW1lb3V0IGZvciBwZXJtYW5lbnQgc3Vic2NyaXB0aW9uICovCisKK3N0cnVjdCB0aXBjX3N1YnNjciB7CisJc3RydWN0IHRpcGNfbmFtZV9zZXEgc2VxOwkvKiBuYW1lIHNlcXVlbmNlIG9mIGludGVyZXN0ICovCisJX191MzIgdGltZW91dDsJCQkvKiBzdWJzY3JpcHRpb24gZHVyYXRpb24gKGluIG1zKSAqLworCV9fdTMyIGZpbHRlcjsJCQkvKiBiaXRtYXNrIG9mIGZpbHRlciBvcHRpb25zICovCisJY2hhciB1c3JfaGFuZGxlWzhdOwkJLyogYXZhaWxhYmxlIGZvciBzdWJzY3JpYmVyIHVzZSAqLworfTsKKworI2RlZmluZSBUSVBDX1BVQkxJU0hFRAkJMQkvKiBwdWJsaWNhdGlvbiBldmVudCAqLworI2RlZmluZSBUSVBDX1dJVEhEUkFXTgkJMgkvKiB3aXRoZHJhdyBldmVudCAqLworI2RlZmluZSBUSVBDX1NVQlNDUl9USU1FT1VUCTMJLyogc3Vic2NyaXB0aW9uIHRpbWVvdXQgZXZlbnQgKi8KKworc3RydWN0IHRpcGNfZXZlbnQgeworCV9fdTMyIGV2ZW50OwkJCS8qIGV2ZW50IHR5cGUgKi8KKwlfX3UzMiBmb3VuZF9sb3dlcjsJCS8qIG1hdGNoaW5nIG5hbWUgc2VxIGluc3RhbmNlcyAqLworCV9fdTMyIGZvdW5kX3VwcGVyOwkJLyogICAgIiAgICAgICIgICAgIiAgICAgIiAgICAgICovCisJc3RydWN0IHRpcGNfcG9ydGlkIHBvcnQ7CS8qIGFzc29jaWF0ZWQgcG9ydCAqLworCXN0cnVjdCB0aXBjX3N1YnNjciBzOwkJLyogYXNzb2NpYXRlZCBzdWJzY3JpcHRpb24gKi8KK307CisKKy8qCisgKiBTb2NrZXQgQVBJCisgKi8KKworI2lmbmRlZiBBRl9USVBDCisjZGVmaW5lIEFGX1RJUEMJCTMwCisjZW5kaWYKKworI2lmbmRlZiBQRl9USVBDCisjZGVmaW5lIFBGX1RJUEMJCUFGX1RJUEMKKyNlbmRpZgorCisjaWZuZGVmIFNPTF9USVBDCisjZGVmaW5lIFNPTF9USVBDCTI3MQorI2VuZGlmCisKKyNkZWZpbmUgVElQQ19BRERSX05BTUVTRVEJMQorI2RlZmluZSBUSVBDX0FERFJfTUNBU1QJCTEKKyNkZWZpbmUgVElQQ19BRERSX05BTUUJCTIKKyNkZWZpbmUgVElQQ19BRERSX0lECQkzCisKK3N0cnVjdCBzb2NrYWRkcl90aXBjIHsKKwl1bnNpZ25lZCBzaG9ydCBmYW1pbHk7CisJdW5zaWduZWQgY2hhciAgYWRkcnR5cGU7CisJc2lnbmVkICAgY2hhciAgc2NvcGU7CisJdW5pb24geworCQlzdHJ1Y3QgdGlwY19wb3J0aWQgaWQ7CisJCXN0cnVjdCB0aXBjX25hbWVfc2VxIG5hbWVzZXE7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgdGlwY19uYW1lIG5hbWU7CisJCQlfX3UzMiBkb21haW47CisJCX0gbmFtZTsKKwl9IGFkZHI7Cit9OworCisvKgorICogQW5jaWxsYXJ5IGRhdGEgb2JqZWN0cyBzdXBwb3J0ZWQgYnkgcmVjdm1zZygpCisgKi8KKworI2RlZmluZSBUSVBDX0VSUklORk8JMQkvKiBlcnJvciBpbmZvICovCisjZGVmaW5lIFRJUENfUkVUREFUQQkyCS8qIHJldHVybmVkIGRhdGEgKi8KKyNkZWZpbmUgVElQQ19ERVNUTkFNRQkzCS8qIGRlc3RpbmF0aW9uIG5hbWUgKi8KKworLyoKKyAqIFRJUEMtc3BlY2lmaWMgc29ja2V0IG9wdGlvbiB2YWx1ZXMKKyAqLworCisjZGVmaW5lIFRJUENfSU1QT1JUQU5DRQkJMTI3CS8qIERlZmF1bHQ6IFRJUENfTE9XX0lNUE9SVEFOQ0UgKi8KKyNkZWZpbmUgVElQQ19TUkNfRFJPUFBBQkxFCTEyOAkvKiBEZWZhdWx0OiBiYXNlZCBvbiBzb2NrZXQgdHlwZSAqLworI2RlZmluZSBUSVBDX0RFU1RfRFJPUFBBQkxFCTEyOQkvKiBEZWZhdWx0OiBiYXNlZCBvbiBzb2NrZXQgdHlwZSAqLworI2RlZmluZSBUSVBDX0NPTk5fVElNRU9VVAkxMzAJLyogRGVmYXVsdDogODAwMCAobXMpICAqLworI2RlZmluZSBUSVBDX05PREVfUkVDVlFfREVQVEgJMTMxCS8qIERlZmF1bHQ6IG5vbmUgKHJlYWQgb25seSkgKi8KKyNkZWZpbmUgVElQQ19TT0NLX1JFQ1ZRX0RFUFRICTEzMgkvKiBEZWZhdWx0OiBub25lIChyZWFkIG9ubHkpICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90aXBjX2NvbmZpZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90aXBjX2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMjU5ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RpcGNfY29uZmlnLmgKQEAgLTAsMCArMSwzOTMgQEAKKy8qCisgKiBpbmNsdWRlL2xpbnV4L3RpcGNfY29uZmlnLmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBjb25maWd1cmF0aW9uIGludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcsIDIwMTAtMjAxMSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9USVBDX0NPTkZJR19IXworI2RlZmluZSBfTElOVVhfVElQQ19DT05GSUdfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+IC8qIGZvciBudG9ocyBldGMuICovCisKKy8qCisgKiBDb25maWd1cmF0aW9uCisgKgorICogQWxsIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCBtZXNzYWdpbmcgaW52b2x2ZXMgc2VuZGluZyBhIHJlcXVlc3QgbWVzc2FnZQorICogdG8gdGhlIFRJUEMgY29uZmlndXJhdGlvbiBzZXJ2aWNlIG9uIGEgbm9kZSwgd2hpY2ggc2VuZHMgYSByZXBseSBtZXNzYWdlCisgKiBiYWNrLiAgKEluIHRoZSBmdXR1cmUgbXVsdGktbWVzc2FnZSByZXBsaWVzIG1heSBiZSBzdXBwb3J0ZWQuKQorICoKKyAqIEJvdGggcmVxdWVzdCBhbmQgcmVwbHkgbWVzc2FnZXMgY29uc2lzdCBvZiBhIHRyYW5zcG9ydCBoZWFkZXIgYW5kIHBheWxvYWQuCisgKiBUaGUgdHJhbnNwb3J0IGhlYWRlciBjb250YWlucyBpbmZvIGFib3V0IHRoZSBkZXNpcmVkIG9wZXJhdGlvbjsKKyAqIHRoZSBwYXlsb2FkIGNvbnNpc3RzIG9mIHplcm8gb3IgbW9yZSB0eXBlL2xlbmd0aC92YWx1ZSAoVExWKSBpdGVtcworICogd2hpY2ggc3BlY2lmeSBwYXJhbWV0ZXJzIG9yIHJlc3VsdHMgZm9yIHRoZSBvcGVyYXRpb24uCisgKgorICogRm9yIG1hbnkgb3BlcmF0aW9ucywgdGhlIHJlcXVlc3QgYW5kIHJlcGx5IG1lc3NhZ2VzIGhhdmUgYSBmaXhlZCBudW1iZXIKKyAqIG9mIFRMVnMgKHVzdWFsbHkgemVybyBvciBvbmUpOyBob3dldmVyLCBzb21lIHJlcGx5IG1lc3NhZ2VzIG1heSByZXR1cm4KKyAqIGEgdmFyaWFibGUgbnVtYmVyIG9mIFRMVnMuICBBIGZhaWxlZCByZXF1ZXN0IGlzIGRlbm90ZWQgYnkgdGhlIHByZXNlbmNlCisgKiBvZiBhbiAiZXJyb3Igc3RyaW5nIiBUTFYgaW4gdGhlIHJlcGx5IG1lc3NhZ2UgaW5zdGVhZCBvZiB0aGUgVExWKHMpIHRoZQorICogcmVwbHkgc2hvdWxkIGNvbnRhaW4gaWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMuCisgKi8KKworLyoKKyAqIFB1YmxpYyBjb21tYW5kczoKKyAqIE1heSBiZSBpc3N1ZWQgYnkgYW55IHByb2Nlc3MuCisgKiBBY2NlcHRlZCBieSBvd24gbm9kZSwgb3IgYnkgcmVtb3RlIG5vZGUgb25seSBpZiByZW1vdGUgbWFuYWdlbWVudCBlbmFibGVkLgorICovCisKKyNkZWZpbmUgIFRJUENfQ01EX05PT1AgICAgICAgICAgICAgIDB4MDAwMCAgICAvKiB0eCBub25lLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTk9ERVMgICAgICAgICAweDAwMDEgICAgLyogdHggbmV0X2FkZHIsIHJ4IG5vZGVfaW5mbyhzKSAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX01FRElBX05BTUVTICAgMHgwMDAyICAgIC8qIHR4IG5vbmUsIHJ4IG1lZGlhX25hbWUocykgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9CRUFSRVJfTkFNRVMgIDB4MDAwMyAgICAvKiB0eCBub25lLCByeCBiZWFyZXJfbmFtZShzKSAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX0xJTktTICAgICAgICAgMHgwMDA0ICAgIC8qIHR4IG5ldF9hZGRyLCByeCBsaW5rX2luZm8ocykgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NIT1dfTkFNRV9UQUJMRSAgIDB4MDAwNSAgICAvKiB0eCBuYW1lX3RibF9xdWVyeSwgcnggdWx0cmFfc3RyaW5nICovCisjZGVmaW5lICBUSVBDX0NNRF9TSE9XX1BPUlRTICAgICAgICAweDAwMDYgICAgLyogdHggbm9uZSwgcnggdWx0cmFfc3RyaW5nICovCisjZGVmaW5lICBUSVBDX0NNRF9TSE9XX0xJTktfU1RBVFMgICAweDAwMEIgICAgLyogdHggbGlua19uYW1lLCByeCB1bHRyYV9zdHJpbmcgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NIT1dfU1RBVFMgICAgICAgIDB4MDAwRiAgICAvKiB0eCB1bnNpZ25lZCwgcnggdWx0cmFfc3RyaW5nICovCisKKy8qCisgKiBQcm90ZWN0ZWQgY29tbWFuZHM6CisgKiBNYXkgb25seSBiZSBpc3N1ZWQgYnkgIm5ldHdvcmsgYWRtaW5pc3RyYXRpb24gY2FwYWJsZSIgcHJvY2Vzcy4KKyAqIEFjY2VwdGVkIGJ5IG93biBub2RlLCBvciBieSByZW1vdGUgbm9kZSBvbmx5IGlmIHJlbW90ZSBtYW5hZ2VtZW50IGVuYWJsZWQKKyAqIGFuZCB0aGlzIG5vZGUgaXMgem9uZSBtYW5hZ2VyLgorICovCisKKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9SRU1PVEVfTU5HICAgIDB4NDAwMyAgICAvKiB0eCBub25lLCByeCB1bnNpZ25lZCAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX01BWF9QT1JUUyAgICAgMHg0MDA0ICAgIC8qIHR4IG5vbmUsIHJ4IHVuc2lnbmVkICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTUFYX1BVQkwgICAgICAweDQwMDUgICAgLyogdHggbm9uZSwgcnggdW5zaWduZWQgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9NQVhfU1VCU0NSICAgIDB4NDAwNiAgICAvKiB0eCBub25lLCByeCB1bnNpZ25lZCAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX01BWF9aT05FUyAgICAgMHg0MDA3ICAgIC8qIG9ic29sZXRlZCAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX01BWF9DTFVTVEVSUyAgMHg0MDA4ICAgIC8qIG9ic29sZXRlZCAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX01BWF9OT0RFUyAgICAgMHg0MDA5ICAgIC8qIG9ic29sZXRlZCAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX01BWF9TTEFWRVMgICAgMHg0MDBBICAgIC8qIG9ic29sZXRlZCAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX05FVElEICAgICAgICAgMHg0MDBCICAgIC8qIHR4IG5vbmUsIHJ4IHVuc2lnbmVkICovCisKKyNkZWZpbmUgIFRJUENfQ01EX0VOQUJMRV9CRUFSRVIgICAgIDB4NDEwMSAgICAvKiB0eCBiZWFyZXJfY29uZmlnLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9ESVNBQkxFX0JFQVJFUiAgICAweDQxMDIgICAgLyogdHggYmVhcmVyX25hbWUsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9MSU5LX1RPTCAgICAgIDB4NDEwNyAgICAvKiB0eCBsaW5rX2NvbmZpZywgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX0xJTktfUFJJICAgICAgMHg0MTA4ICAgIC8qIHR4IGxpbmtfY29uZmlnLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTElOS19XSU5ET1cgICAweDQxMDkgICAgLyogdHggbGlua19jb25maWcsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9MT0dfU0laRSAgICAgIDB4NDEwQSAgICAvKiB0eCB1bnNpZ25lZCwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfRFVNUF9MT0cgICAgICAgICAgMHg0MTBCICAgIC8qIHR4IG5vbmUsIHJ4IHVsdHJhX3N0cmluZyAqLworI2RlZmluZSAgVElQQ19DTURfUkVTRVRfTElOS19TVEFUUyAgMHg0MTBDICAgIC8qIHR4IGxpbmtfbmFtZSwgcnggbm9uZSAqLworCisvKgorICogUHJpdmF0ZSBjb21tYW5kczoKKyAqIE1heSBvbmx5IGJlIGlzc3VlZCBieSAibmV0d29yayBhZG1pbmlzdHJhdGlvbiBjYXBhYmxlIiBwcm9jZXNzLgorICogQWNjZXB0ZWQgYnkgb3duIG5vZGUgb25seTsgY2Fubm90IGJlIHVzZWQgb24gYSByZW1vdGUgbm9kZS4KKyAqLworCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTk9ERV9BRERSICAgICAweDgwMDEgICAgLyogdHggbmV0X2FkZHIsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9SRU1PVEVfTU5HICAgIDB4ODAwMyAgICAvKiB0eCB1bnNpZ25lZCwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX01BWF9QT1JUUyAgICAgMHg4MDA0ICAgIC8qIHR4IHVuc2lnbmVkLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTUFYX1BVQkwgICAgICAweDgwMDUgICAgLyogdHggdW5zaWduZWQsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9NQVhfU1VCU0NSICAgIDB4ODAwNiAgICAvKiB0eCB1bnNpZ25lZCwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX01BWF9aT05FUyAgICAgMHg4MDA3ICAgIC8qIG9ic29sZXRlZCAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX01BWF9DTFVTVEVSUyAgMHg4MDA4ICAgIC8qIG9ic29sZXRlZCAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX01BWF9OT0RFUyAgICAgMHg4MDA5ICAgIC8qIG9ic29sZXRlZCAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX01BWF9TTEFWRVMgICAgMHg4MDBBICAgIC8qIG9ic29sZXRlZCAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX05FVElEICAgICAgICAgMHg4MDBCICAgIC8qIHR4IHVuc2lnbmVkLCByeCBub25lICovCisKKy8qCisgKiBSZXNlcnZlZCBjb21tYW5kczoKKyAqIE1heSBub3QgYmUgaXNzdWVkIGJ5IGFueSBwcm9jZXNzLgorICogVXNlZCBpbnRlcm5hbGx5IGJ5IFRJUEMuCisgKi8KKworI2RlZmluZSAgVElQQ19DTURfTk9UX05FVF9BRE1JTiAgICAgMHhDMDAxICAgIC8qIHR4IG5vbmUsIHJ4IG5vbmUgKi8KKworLyoKKyAqIFRMViB0eXBlcyBkZWZpbmVkIGZvciBUSVBDCisgKi8KKworI2RlZmluZSBUSVBDX1RMVl9OT05FCQkwCS8qIG5vIFRMViBwcmVzZW50ICovCisjZGVmaW5lIFRJUENfVExWX1ZPSUQJCTEJLyogZW1wdHkgVExWICgwIGRhdGEgYnl0ZXMpKi8KKyNkZWZpbmUgVElQQ19UTFZfVU5TSUdORUQJMgkvKiAzMi1iaXQgaW50ZWdlciAqLworI2RlZmluZSBUSVBDX1RMVl9TVFJJTkcJCTMJLyogY2hhclsxMjhdIChtYXgpICovCisjZGVmaW5lIFRJUENfVExWX0xBUkdFX1NUUklORwk0CS8qIGNoYXJbMjA0OF0gKG1heCkgKi8KKyNkZWZpbmUgVElQQ19UTFZfVUxUUkFfU1RSSU5HCTUJLyogY2hhclszMjc2OF0gKG1heCkgKi8KKworI2RlZmluZSBUSVBDX1RMVl9FUlJPUl9TVFJJTkcJMTYJLyogY2hhclsxMjhdIGNvbnRhaW5pbmcgImVycm9yIGNvZGUiICovCisjZGVmaW5lIFRJUENfVExWX05FVF9BRERSCTE3CS8qIDMyLWJpdCBpbnRlZ2VyIGRlbm90aW5nIDxaLkMuTj4gKi8KKyNkZWZpbmUgVElQQ19UTFZfTUVESUFfTkFNRQkxOAkvKiBjaGFyW1RJUENfTUFYX01FRElBX05BTUVdICovCisjZGVmaW5lIFRJUENfVExWX0JFQVJFUl9OQU1FCTE5CS8qIGNoYXJbVElQQ19NQVhfQkVBUkVSX05BTUVdICovCisjZGVmaW5lIFRJUENfVExWX0xJTktfTkFNRQkyMAkvKiBjaGFyW1RJUENfTUFYX0xJTktfTkFNRV0gKi8KKyNkZWZpbmUgVElQQ19UTFZfTk9ERV9JTkZPCTIxCS8qIHN0cnVjdCB0aXBjX25vZGVfaW5mbyAqLworI2RlZmluZSBUSVBDX1RMVl9MSU5LX0lORk8JMjIJLyogc3RydWN0IHRpcGNfbGlua19pbmZvICovCisjZGVmaW5lIFRJUENfVExWX0JFQVJFUl9DT05GSUcJMjMJLyogc3RydWN0IHRpcGNfYmVhcmVyX2NvbmZpZyAqLworI2RlZmluZSBUSVBDX1RMVl9MSU5LX0NPTkZJRwkyNAkvKiBzdHJ1Y3QgdGlwY19saW5rX2NvbmZpZyAqLworI2RlZmluZSBUSVBDX1RMVl9OQU1FX1RCTF9RVUVSWQkyNQkvKiBzdHJ1Y3QgdGlwY19uYW1lX3RhYmxlX3F1ZXJ5ICovCisjZGVmaW5lIFRJUENfVExWX1BPUlRfUkVGCTI2CS8qIDMyLWJpdCBwb3J0IHJlZmVyZW5jZSAqLworCisvKgorICogTWF4aW11bSBzaXplcyBvZiBUSVBDIGJlYXJlci1yZWxhdGVkIG5hbWVzIChpbmNsdWRpbmcgdGVybWluYXRpbmcgTlVMKQorICovCisKKyNkZWZpbmUgVElQQ19NQVhfTUVESUFfTkFNRQkxNgkvKiBmb3JtYXQgPSBtZWRpYSAqLworI2RlZmluZSBUSVBDX01BWF9JRl9OQU1FCTE2CS8qIGZvcm1hdCA9IGludGVyZmFjZSAqLworI2RlZmluZSBUSVBDX01BWF9CRUFSRVJfTkFNRQkzMgkvKiBmb3JtYXQgPSBtZWRpYTppbnRlcmZhY2UgKi8KKyNkZWZpbmUgVElQQ19NQVhfTElOS19OQU1FCTYwCS8qIGZvcm1hdCA9IFouQy5OOmludGVyZmFjZS1aLkMuTjppbnRlcmZhY2UgKi8KKworLyoKKyAqIExpbmsgcHJpb3JpdHkgbGltaXRzIChtaW4sIGRlZmF1bHQsIG1heCwgbWVkaWEgZGVmYXVsdCkKKyAqLworCisjZGVmaW5lIFRJUENfTUlOX0xJTktfUFJJCTAKKyNkZWZpbmUgVElQQ19ERUZfTElOS19QUkkJMTAKKyNkZWZpbmUgVElQQ19NQVhfTElOS19QUkkJMzEKKyNkZWZpbmUgVElQQ19NRURJQV9MSU5LX1BSSQkoVElQQ19NQVhfTElOS19QUkkgKyAxKQorCisvKgorICogTGluayB0b2xlcmFuY2UgbGltaXRzIChtaW4sIGRlZmF1bHQsIG1heCksIGluIG1zCisgKi8KKworI2RlZmluZSBUSVBDX01JTl9MSU5LX1RPTCA1MAorI2RlZmluZSBUSVBDX0RFRl9MSU5LX1RPTCAxNTAwCisjZGVmaW5lIFRJUENfTUFYX0xJTktfVE9MIDMwMDAwCisKKyNpZiAoVElQQ19NSU5fTElOS19UT0wgPCAxNikKKyNlcnJvciAiVElQQ19NSU5fTElOS19UT0wgaXMgdG9vIHNtYWxsIChhYm9ydCBsaW1pdCBtYXkgYmUgTmFOKSIKKyNlbmRpZgorCisvKgorICogTGluayB3aW5kb3cgbGltaXRzIChtaW4sIGRlZmF1bHQsIG1heCksIGluIHBhY2tldHMKKyAqLworCisjZGVmaW5lIFRJUENfTUlOX0xJTktfV0lOIDE2CisjZGVmaW5lIFRJUENfREVGX0xJTktfV0lOIDUwCisjZGVmaW5lIFRJUENfTUFYX0xJTktfV0lOIDE1MAorCisKK3N0cnVjdCB0aXBjX25vZGVfaW5mbyB7CisJX19iZTMyIGFkZHI7CQkJLyogbmV0d29yayBhZGRyZXNzIG9mIG5vZGUgKi8KKwlfX2JlMzIgdXA7CQkJLyogMD1kb3duLCAxPSB1cCAqLworfTsKKworc3RydWN0IHRpcGNfbGlua19pbmZvIHsKKwlfX2JlMzIgZGVzdDsJCQkvKiBuZXR3b3JrIGFkZHJlc3Mgb2YgcGVlciBub2RlICovCisJX19iZTMyIHVwOwkJCS8qIDA9ZG93biwgMT11cCAqLworCWNoYXIgc3RyW1RJUENfTUFYX0xJTktfTkFNRV07CS8qIGxpbmsgbmFtZSAqLworfTsKKworc3RydWN0IHRpcGNfYmVhcmVyX2NvbmZpZyB7CisJX19iZTMyIHByaW9yaXR5OwkJLyogUmFuZ2UgWzEsMzFdLiBPdmVycmlkZSBwZXIgbGluayAgKi8KKwlfX2JlMzIgZGlzY19kb21haW47CQkvKiA8Wi5DLk4+IGRlc2NyaWJpbmcgZGVzaXJlZCBub2RlcyAqLworCWNoYXIgbmFtZVtUSVBDX01BWF9CRUFSRVJfTkFNRV07Cit9OworCitzdHJ1Y3QgdGlwY19saW5rX2NvbmZpZyB7CisJX19iZTMyIHZhbHVlOworCWNoYXIgbmFtZVtUSVBDX01BWF9MSU5LX05BTUVdOworfTsKKworI2RlZmluZSBUSVBDX05UUV9BTExUWVBFUyAweDgwMDAwMDAwCisKK3N0cnVjdCB0aXBjX25hbWVfdGFibGVfcXVlcnkgeworCV9fYmUzMiBkZXB0aDsJLyogMTp0eXBlLCAyOituYW1lIGluZm8sIDM6K3BvcnQgaW5mbywgNCs6K2RlYnVnIGluZm8gKi8KKwlfX2JlMzIgdHlwZTsJLyoge3QsbCx1fSBpbmZvIGlnbm9yZWQgaWYgaGlnaCBiaXQgb2YgImRlcHRoIiBpcyBzZXQgKi8KKwlfX2JlMzIgbG93Ym91bmQ7IC8qIChpLmUuIGRpc3BsYXlzIGFsbCBlbnRyaWVzIG9mIG5hbWUgdGFibGUpICovCisJX19iZTMyIHVwYm91bmQ7Cit9OworCisvKgorICogVGhlIGVycm9yIHN0cmluZyBUTFYgaXMgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNhdXNlCisgKiBvZiB0aGUgcmVxdWVzdCBmYWlsdXJlLiAgVG8gc2ltcGxpZnkgZXJyb3IgcHJvY2Vzc2luZyAoYW5kIHRvIHNhdmUgc3BhY2UpCisgKiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgY2FuIGJlIGEgc3BlY2lhbCBlcnJvciBjb2RlIGNoYXJhY3RlcgorICogKGx5aW5nIGJ5IHRoZSByYW5nZSAweDgwIHRvIDB4RkYpIHdoaWNoIHJlcHJlc2VudHMgYSBwcmUtZGVmaW5lZCByZWFzb24uCisgKi8KKworI2RlZmluZSBUSVBDX0NGR19UTFZfRVJST1IgICAgICAiXHg4MCIgIC8qIHJlcXVlc3QgY29udGFpbnMgaW5jb3JyZWN0IFRMVihzKSAqLworI2RlZmluZSBUSVBDX0NGR19OT1RfTkVUX0FETUlOICAiXHg4MSIJLyogbXVzdCBiZSBuZXR3b3JrIGFkbWluaXN0cmF0b3IgKi8KKyNkZWZpbmUgVElQQ19DRkdfTk9UX1pPTkVfTVNUUgkiXHg4MiIJLyogbXVzdCBiZSB6b25lIG1hc3RlciAqLworI2RlZmluZSBUSVBDX0NGR19OT19SRU1PVEUJIlx4ODMiCS8qIHJlbW90ZSBtYW5hZ2VtZW50IG5vdCBlbmFibGVkICovCisjZGVmaW5lIFRJUENfQ0ZHX05PVF9TVVBQT1JURUQgICJceDg0IgkvKiByZXF1ZXN0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgVElQQyAqLworI2RlZmluZSBUSVBDX0NGR19JTlZBTElEX1ZBTFVFICAiXHg4NSIgIC8qIHJlcXVlc3QgaGFzIGludmFsaWQgYXJndW1lbnQgdmFsdWUgKi8KKworLyoKKyAqIEEgVExWIGNvbnNpc3RzIG9mIGEgZGVzY3JpcHRvciwgZm9sbG93ZWQgYnkgdGhlIFRMViB2YWx1ZS4KKyAqIFRMViBkZXNjcmlwdG9yIGZpZWxkcyBhcmUgc3RvcmVkIGluIG5ldHdvcmsgYnl0ZSBvcmRlcjsKKyAqIFRMViB2YWx1ZXMgbXVzdCBhbHNvIGJlIHN0b3JlZCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKHdoZXJlIGFwcGxpY2FibGUpLgorICogVExWIGRlc2NyaXB0b3JzIG11c3QgYmUgYWxpZ25lZCB0byBhZGRyZXNzZXMgd2hpY2ggYXJlIG11bHRpcGxlIG9mIDQsCisgKiBzbyB1cCB0byAzIGJ5dGVzIG9mIHBhZGRpbmcgbWF5IGV4aXN0IGF0IHRoZSBlbmQgb2YgdGhlIFRMViB2YWx1ZSBhcmVhLgorICogVGhlcmUgbXVzdCBub3QgYmUgYW55IHBhZGRpbmcgYmV0d2VlbiB0aGUgVExWIGRlc2NyaXB0b3IgYW5kIGl0cyB2YWx1ZS4KKyAqLworCitzdHJ1Y3QgdGx2X2Rlc2MgeworCV9fYmUxNiB0bHZfbGVuOwkJLyogVExWIGxlbmd0aCAoZGVzY3JpcHRvciArIHZhbHVlKSAqLworCV9fYmUxNiB0bHZfdHlwZTsJCS8qIFRMViBpZGVudGlmaWVyICovCit9OworCisjZGVmaW5lIFRMVl9BTElHTlRPIDQKKworI2RlZmluZSBUTFZfQUxJR04oZGF0YWxlbikgKCgoZGF0YWxlbikrKFRMVl9BTElHTlRPLTEpKSAmIH4oVExWX0FMSUdOVE8tMSkpCisjZGVmaW5lIFRMVl9MRU5HVEgoZGF0YWxlbikgKHNpemVvZihzdHJ1Y3QgdGx2X2Rlc2MpICsgKGRhdGFsZW4pKQorI2RlZmluZSBUTFZfU1BBQ0UoZGF0YWxlbikgKFRMVl9BTElHTihUTFZfTEVOR1RIKGRhdGFsZW4pKSkKKyNkZWZpbmUgVExWX0RBVEEodGx2KSAoKHZvaWQgKikoKGNoYXIgKikodGx2KSArIFRMVl9MRU5HVEgoMCkpKQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgVExWX09LKGNvbnN0IHZvaWQgKnRsdiwgX191MTYgc3BhY2UpCit7CisJLyoKKwkgKiBXb3VsZCBhbHNvIGxpa2UgdG8gY2hlY2sgdGhhdCAidGx2IiBpcyBhIG11bHRpcGxlIG9mIDQsCisJICogYnV0IGRvbid0IGtub3cgaG93IHRvIGRvIHRoaXMgaW4gYSBwb3J0YWJsZSB3YXkuCisJICogLSBUcmllZCBkb2luZyAoISh0bHYgJiAoVExWX0FMSUdOVE8tMSkpKSwgYnV0IEdDQyBjb21waWxlcgorCSAqICAgd29uJ3QgYWxsb3cgYmluYXJ5ICImIiB3aXRoIGEgcG9pbnRlci4KKwkgKiAtIFRyaWVkIGNhc3RpbmcgInRsdiIgdG8gaW50ZWdlciB0eXBlLCBidXQgY2F1c2VzIHdhcm5pbmcgYWJvdXQgc2l6ZQorCSAqICAgbWlzbWF0Y2ggd2hlbiBwb2ludGVyIGlzIGJpZ2dlciB0aGFuIGNob3NlbiB0eXBlIChpbnQsIGxvbmcsIC4uLikuCisJICovCisKKwlyZXR1cm4gKHNwYWNlID49IFRMVl9TUEFDRSgwKSkgJiYKKwkJKG50b2hzKCgoc3RydWN0IHRsdl9kZXNjICopdGx2KS0+dGx2X2xlbikgPD0gc3BhY2UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgVExWX0NIRUNLKGNvbnN0IHZvaWQgKnRsdiwgX191MTYgc3BhY2UsIF9fdTE2IGV4cF90eXBlKQoreworCXJldHVybiBUTFZfT0sodGx2LCBzcGFjZSkgJiYKKwkJKG50b2hzKCgoc3RydWN0IHRsdl9kZXNjICopdGx2KS0+dGx2X3R5cGUpID09IGV4cF90eXBlKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IFRMVl9TRVQodm9pZCAqdGx2LCBfX3UxNiB0eXBlLCB2b2lkICpkYXRhLCBfX3UxNiBsZW4pCit7CisJc3RydWN0IHRsdl9kZXNjICp0bHZfcHRyOworCWludCB0bHZfbGVuOworCisJdGx2X2xlbiA9IFRMVl9MRU5HVEgobGVuKTsKKwl0bHZfcHRyID0gKHN0cnVjdCB0bHZfZGVzYyAqKXRsdjsKKwl0bHZfcHRyLT50bHZfdHlwZSA9IGh0b25zKHR5cGUpOworCXRsdl9wdHItPnRsdl9sZW4gID0gaHRvbnModGx2X2xlbik7CisJaWYgKGxlbiAmJiBkYXRhKQorCQltZW1jcHkoVExWX0RBVEEodGx2X3B0ciksIGRhdGEsIHRsdl9sZW4pOworCXJldHVybiBUTFZfU1BBQ0UobGVuKTsKK30KKworLyoKKyAqIEEgVExWIGxpc3QgZGVzY3JpcHRvciBzaW1wbGlmaWVzIHByb2Nlc3Npbmcgb2YgbWVzc2FnZXMKKyAqIGNvbnRhaW5pbmcgbXVsdGlwbGUgVExWcy4KKyAqLworCitzdHJ1Y3QgdGx2X2xpc3RfZGVzYyB7CisJc3RydWN0IHRsdl9kZXNjICp0bHZfcHRyOwkvKiBwdHIgdG8gY3VycmVudCBUTFYgKi8KKwlfX3UzMiB0bHZfc3BhY2U7CQkvKiAjIGJ5dGVzIGZyb20gY3VyciBUTFYgdG8gbGlzdCBlbmQgKi8KK307CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgVExWX0xJU1RfSU5JVChzdHJ1Y3QgdGx2X2xpc3RfZGVzYyAqbGlzdCwKKwkJCQkgdm9pZCAqZGF0YSwgX191MzIgc3BhY2UpCit7CisJbGlzdC0+dGx2X3B0ciA9IChzdHJ1Y3QgdGx2X2Rlc2MgKilkYXRhOworCWxpc3QtPnRsdl9zcGFjZSA9IHNwYWNlOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgVExWX0xJU1RfRU1QVFkoc3RydWN0IHRsdl9saXN0X2Rlc2MgKmxpc3QpCit7CisJcmV0dXJuIChsaXN0LT50bHZfc3BhY2UgPT0gMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBUTFZfTElTVF9DSEVDSyhzdHJ1Y3QgdGx2X2xpc3RfZGVzYyAqbGlzdCwgX191MTYgZXhwX3R5cGUpCit7CisJcmV0dXJuIFRMVl9DSEVDSyhsaXN0LT50bHZfcHRyLCBsaXN0LT50bHZfc3BhY2UsIGV4cF90eXBlKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCAqVExWX0xJU1RfREFUQShzdHJ1Y3QgdGx2X2xpc3RfZGVzYyAqbGlzdCkKK3sKKwlyZXR1cm4gVExWX0RBVEEobGlzdC0+dGx2X3B0cik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgVExWX0xJU1RfU1RFUChzdHJ1Y3QgdGx2X2xpc3RfZGVzYyAqbGlzdCkKK3sKKwlfX3UxNiB0bHZfc3BhY2UgPSBUTFZfQUxJR04obnRvaHMobGlzdC0+dGx2X3B0ci0+dGx2X2xlbikpOworCisJbGlzdC0+dGx2X3B0ciA9IChzdHJ1Y3QgdGx2X2Rlc2MgKikoKGNoYXIgKilsaXN0LT50bHZfcHRyICsgdGx2X3NwYWNlKTsKKwlsaXN0LT50bHZfc3BhY2UgLT0gdGx2X3NwYWNlOworfQorCisvKgorICogQ29uZmlndXJhdGlvbiBtZXNzYWdlcyBleGNoYW5nZWQgdmlhIE5FVExJTktfR0VORVJJQyB1c2UgdGhlIGZvbGxvd2luZworICogZmFtaWx5IGlkLCBuYW1lLCB2ZXJzaW9uIGFuZCBjb21tYW5kLgorICovCisjZGVmaW5lIFRJUENfR0VOTF9OQU1FCQkiVElQQyIKKyNkZWZpbmUgVElQQ19HRU5MX1ZFUlNJT04JMHgxCisjZGVmaW5lIFRJUENfR0VOTF9DTUQJCTB4MQorCisvKgorICogVElQQyBzcGVjaWZpYyBoZWFkZXIgdXNlZCBpbiBORVRMSU5LX0dFTkVSSUMgcmVxdWVzdHMuCisgKi8KK3N0cnVjdCB0aXBjX2dlbmxtc2doZHIgeworCV9fdTMyIGRlc3Q7CQkvKiBEZXN0aW5hdGlvbiBhZGRyZXNzICovCisJX191MTYgY21kOwkJLyogQ29tbWFuZCAqLworCV9fdTE2IHJlc2VydmVkOwkJLyogVW51c2VkICovCit9OworCisjZGVmaW5lIFRJUENfR0VOTF9IRFJMRU4JTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCB0aXBjX2dlbmxtc2doZHIpKQorCisvKgorICogQ29uZmlndXJhdGlvbiBtZXNzYWdlcyBleGNoYW5nZWQgdmlhIFRJUEMgc29ja2V0cyB1c2UgdGhlIFRJUEMgY29uZmlndXJhdGlvbgorICogbWVzc2FnZSBoZWFkZXIsIHdoaWNoIGlzIGRlZmluZWQgYmVsb3cuICBUaGlzIHN0cnVjdHVyZSBpcyBhbmFsb2dvdXMKKyAqIHRvIHRoZSBOZXRsaW5rIG1lc3NhZ2UgaGVhZGVyLCBidXQgZmllbGRzIGFyZSBzdG9yZWQgaW4gbmV0d29yayBieXRlIG9yZGVyCisgKiBhbmQgbm8gcGFkZGluZyBpcyBwZXJtaXR0ZWQgYmV0d2VlbiB0aGUgaGVhZGVyIGFuZCB0aGUgbWVzc2FnZSBkYXRhCisgKiB0aGF0IGZvbGxvd3MuCisgKi8KKworc3RydWN0IHRpcGNfY2ZnX21zZ19oZHIgeworCV9fYmUzMiB0Y21fbGVuOwkJLyogTWVzc2FnZSBsZW5ndGggKGluY2x1ZGluZyBoZWFkZXIpICovCisJX19iZTE2IHRjbV90eXBlOwkvKiBDb21tYW5kIHR5cGUgKi8KKwlfX2JlMTYgdGNtX2ZsYWdzOwkvKiBBZGRpdGlvbmFsIGZsYWdzICovCisJY2hhciAgdGNtX3Jlc2VydmVkWzhdOwkvKiBVbnVzZWQgKi8KK307CisKKyNkZWZpbmUgVENNX0ZfUkVRVUVTVAkweDEJLyogRmxhZzogUmVxdWVzdCBtZXNzYWdlICovCisjZGVmaW5lIFRDTV9GX01PUkUJMHgyCS8qIEZsYWc6IE1lc3NhZ2UgdG8gYmUgY29udGludWVkICovCisKKyNkZWZpbmUgVENNX0FMSUdOKGRhdGFsZW4pICAoKChkYXRhbGVuKSszKSAmIH4zKQorI2RlZmluZSBUQ01fTEVOR1RIKGRhdGFsZW4pIChzaXplb2Yoc3RydWN0IHRpcGNfY2ZnX21zZ19oZHIpICsgZGF0YWxlbikKKyNkZWZpbmUgVENNX1NQQUNFKGRhdGFsZW4pICAoVENNX0FMSUdOKFRDTV9MRU5HVEgoZGF0YWxlbikpKQorI2RlZmluZSBUQ01fREFUQSh0Y21faGRyKSAgICgodm9pZCAqKSgoY2hhciAqKSh0Y21faGRyKSArIFRDTV9MRU5HVEgoMCkpKQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgVENNX1NFVCh2b2lkICptc2csIF9fdTE2IGNtZCwgX191MTYgZmxhZ3MsCisJCQkgIHZvaWQgKmRhdGEsIF9fdTE2IGRhdGFfbGVuKQoreworCXN0cnVjdCB0aXBjX2NmZ19tc2dfaGRyICp0Y21faGRyOworCWludCBtc2dfbGVuOworCisJbXNnX2xlbiA9IFRDTV9MRU5HVEgoZGF0YV9sZW4pOworCXRjbV9oZHIgPSAoc3RydWN0IHRpcGNfY2ZnX21zZ19oZHIgKiltc2c7CisJdGNtX2hkci0+dGNtX2xlbiAgID0gaHRvbmwobXNnX2xlbik7CisJdGNtX2hkci0+dGNtX3R5cGUgID0gaHRvbnMoY21kKTsKKwl0Y21faGRyLT50Y21fZmxhZ3MgPSBodG9ucyhmbGFncyk7CisJaWYgKGRhdGFfbGVuICYmIGRhdGEpCisJCW1lbWNweShUQ01fREFUQShtc2cpLCBkYXRhLCBkYXRhX2xlbik7CisJcmV0dXJuIFRDTV9TUEFDRShkYXRhX2xlbik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90b3NoaWJhLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Rvc2hpYmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjY1MjdmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90b3NoaWJhLmgKQEAgLTAsMCArMSwzNyBAQAorLyogdG9zaGliYS5oIC0tIExpbnV4IGRyaXZlciBmb3IgYWNjZXNzaW5nIHRoZSBTTU0gb24gVG9zaGliYSBsYXB0b3BzIAorICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0yMDAwICBKb25hdGhhbiBBLiBCdXp6YXJkIChqb25hdGhhbkBidXp6YXJkLm9yZy51aykKKyAqCisgKiBUaGFua3MgdG8gSnVlcmdlbiBIZWluemwgPGp1ZXJnZW5AbW9ub2NlcnVzLmRlbW9uLmNvLnVrPiBmb3IgdGhlIHBvaW50ZXJzCisgKiBvbiBtYWtpbmcgc3VyZSB0aGUgc3RydWN0dXJlIGlzIGFsaWduZWQgYW5kIHBhY2tlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgX0xJTlVYX1RPU0hJQkFfSAorI2RlZmluZSBfTElOVVhfVE9TSElCQV9ICisKKyNkZWZpbmUgVE9TSF9QUk9DICIvcHJvYy90b3NoaWJhIgorI2RlZmluZSBUT1NIX0RFVklDRSAiL2Rldi90b3NoaWJhIgorI2RlZmluZSBUT1NIX1NNTSBfSU9XUigndCcsIDB4OTAsIGludCkJLyogYnJva2VuOiBtZWFudCAyNCBieXRlcyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGVheDsKKwl1bnNpZ25lZCBpbnQgZWJ4IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwl1bnNpZ25lZCBpbnQgZWN4IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwl1bnNpZ25lZCBpbnQgZWR4IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwl1bnNpZ25lZCBpbnQgZXNpIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwl1bnNpZ25lZCBpbnQgZWRpIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gU01NUmVnaXN0ZXJzOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90dHkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdHR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZkYmVkYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdHR5LmgKQEAgLTAsMCArMSwzOCBAQAorI2lmbmRlZiBfTElOVVhfVFRZX0gKKyNkZWZpbmUgX0xJTlVYX1RUWV9ICisKKy8qCisgKiAndHR5LmgnIGRlZmluZXMgc29tZSBzdHJ1Y3R1cmVzIHVzZWQgYnkgdHR5X2lvLmMgYW5kIHNvbWUgZGVmaW5lcy4KKyAqLworCisjZGVmaW5lIE5SX0xESVNDUwkJMzAKKworLyogbGluZSBkaXNjaXBsaW5lcyAqLworI2RlZmluZSBOX1RUWQkJMAorI2RlZmluZSBOX1NMSVAJCTEKKyNkZWZpbmUgTl9NT1VTRQkJMgorI2RlZmluZSBOX1BQUAkJMworI2RlZmluZSBOX1NUUklQCQk0CisjZGVmaW5lIE5fQVgyNQkJNQorI2RlZmluZSBOX1gyNQkJNgkvKiBYLjI1IGFzeW5jICovCisjZGVmaW5lIE5fNlBBQ0sJCTcKKyNkZWZpbmUgTl9NQVNDCQk4CS8qIFJlc2VydmVkIGZvciBNb2JpdGV4IG1vZHVsZSA8a2F6QGNhZmUubmV0PiAqLworI2RlZmluZSBOX1IzOTY0CQk5CS8qIFJlc2VydmVkIGZvciBTaW1hdGljIFIzOTY0IG1vZHVsZSAqLworI2RlZmluZSBOX1BST0ZJQlVTX0ZETAkxMAkvKiBSZXNlcnZlZCBmb3IgUHJvZmlidXMgKi8KKyNkZWZpbmUgTl9JUkRBCQkxMQkvKiBMaW51eCBJckRhIC0gaHR0cDovL2lyZGEuc291cmNlZm9yZ2UubmV0LyAqLworI2RlZmluZSBOX1NNU0JMT0NLCTEyCS8qIFNNUyBibG9jayBtb2RlIC0gZm9yIHRhbGtpbmcgdG8gR1NNIGRhdGEgKi8KKwkJCQkvKiBjYXJkcyBhYm91dCBTTVMgbWVzc2FnZXMgKi8KKyNkZWZpbmUgTl9IRExDCQkxMwkvKiBzeW5jaHJvbm91cyBIRExDICovCisjZGVmaW5lIE5fU1lOQ19QUFAJMTQJLyogc3luY2hyb25vdXMgUFBQICovCisjZGVmaW5lIE5fSENJCQkxNQkvKiBCbHVldG9vdGggSENJIFVBUlQgKi8KKyNkZWZpbmUgTl9HSUdBU0VUX00xMDEJMTYJLyogU2llbWVucyBHaWdhc2V0IE0xMDEgc2VyaWFsIERFQ1QgYWRhcHRlciAqLworI2RlZmluZSBOX1NMQ0FOCQkxNwkvKiBTZXJpYWwgLyBVU0Igc2VyaWFsIENBTiBBZGFwdG9ycyAqLworI2RlZmluZSBOX1BQUwkJMTgJLyogUHVsc2UgcGVyIFNlY29uZCAqLworI2RlZmluZSBOX1YyNTMJCTE5CS8qIENvZGVjIGNvbnRyb2wgb3ZlciB2b2ljZSBtb2RlbSAqLworI2RlZmluZSBOX0NBSUYJCTIwICAgICAgLyogQ0FJRiBwcm90b2NvbCBmb3IgdGFsa2luZyB0byBtb2RlbXMgKi8KKyNkZWZpbmUgTl9HU00wNzEwCTIxCS8qIEdTTSAwNzEwIE11eCAqLworI2RlZmluZSBOX1RJX1dMCQkyMgkvKiBmb3IgVEkncyBXTCBCVCwgRk0sIEdQUyBjb21ibyBjaGlwcyAqLworI2RlZmluZSBOX1RSQUNFU0lOSwkyMwkvKiBUcmFjZSBkYXRhIHJvdXRpbmcgZm9yIE1JUEkgUDExNDkuNyAqLworI2RlZmluZSBOX1RSQUNFUk9VVEVSCTI0CS8qIFRyYWNlIGRhdGEgcm91dGluZyBmb3IgTUlQSSBQMTE0OS43ICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90eXBlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMGNkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKQEAgLTAsMCArMSw1MSBAQAorI2lmbmRlZiBfTElOVVhfVFlQRVNfSAorI2RlZmluZSBfTElOVVhfVFlQRVNfSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpbmNsdWRlIDxsaW51eC9wb3NpeF90eXBlcy5oPgorCisKKy8qCisgKiBCZWxvdyBhcmUgdHJ1bHkgTGludXgtc3BlY2lmaWMgdHlwZXMgdGhhdCBzaG91bGQgbmV2ZXIgY29sbGlkZSB3aXRoCisgKiBhbnkgYXBwbGljYXRpb24vbGlicmFyeSB0aGF0IHdhbnRzIGxpbnV4L3R5cGVzLmguCisgKi8KKworI2lmZGVmIF9fQ0hFQ0tFUl9fCisjZGVmaW5lIF9fYml0d2lzZV9fIF9fYXR0cmlidXRlX18oKGJpdHdpc2UpKQorI2Vsc2UKKyNkZWZpbmUgX19iaXR3aXNlX18KKyNlbmRpZgorI2lmZGVmIF9fQ0hFQ0tfRU5ESUFOX18KKyNkZWZpbmUgX19iaXR3aXNlIF9fYml0d2lzZV9fCisjZWxzZQorI2RlZmluZSBfX2JpdHdpc2UKKyNlbmRpZgorCit0eXBlZGVmIF9fdTE2IF9fYml0d2lzZSBfX2xlMTY7Cit0eXBlZGVmIF9fdTE2IF9fYml0d2lzZSBfX2JlMTY7Cit0eXBlZGVmIF9fdTMyIF9fYml0d2lzZSBfX2xlMzI7Cit0eXBlZGVmIF9fdTMyIF9fYml0d2lzZSBfX2JlMzI7Cit0eXBlZGVmIF9fdTY0IF9fYml0d2lzZSBfX2xlNjQ7Cit0eXBlZGVmIF9fdTY0IF9fYml0d2lzZSBfX2JlNjQ7CisKK3R5cGVkZWYgX191MTYgX19iaXR3aXNlIF9fc3VtMTY7Cit0eXBlZGVmIF9fdTMyIF9fYml0d2lzZSBfX3dzdW07CisKKy8qCisgKiBhbGlnbmVkX3U2NCBzaG91bGQgYmUgdXNlZCBpbiBkZWZpbmluZyBrZXJuZWw8LT51c2Vyc3BhY2UgQUJJcyB0byBhdm9pZAorICogY29tbW9uIDMyLzY0LWJpdCBjb21wYXQgcHJvYmxlbXMuCisgKiA2NC1iaXQgdmFsdWVzIGFsaWduIHRvIDQtYnl0ZSBib3VuZGFyaWVzIG9uIHg4Nl8zMiAoYW5kIHBvc3NpYmx5IG90aGVyCisgKiBhcmNoaXRlY3R1cmVzKSBhbmQgdG8gOC1ieXRlIGJvdW5kYXJpZXMgb24gNjQtYml0IGFyY2hpdGV0dXJlcy4gIFRoZSBuZXcKKyAqIGFsaWduZWRfNjQgdHlwZSBlbmZvcmNlcyA4LWJ5dGUgYWxpZ25tZW50IHNvIHRoYXQgc3RydWN0cyBjb250YWluaW5nCisgKiBhbGlnbmVkXzY0IHZhbHVlcyBoYXZlIHRoZSBzYW1lIGFsaWdubWVudCBvbiAzMi1iaXQgYW5kIDY0LWJpdCBhcmNoaXRlY3R1cmVzLgorICogTm8gY29udmVyc2lvbnMgYXJlIG5lY2Vzc2FyeSBiZXR3ZWVuIDMyLWJpdCB1c2VyLXNwYWNlIGFuZCBhIDY0LWJpdCBrZXJuZWwuCisgKi8KKyNkZWZpbmUgX19hbGlnbmVkX3U2NCBfX3U2NCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSkKKyNkZWZpbmUgX19hbGlnbmVkX2JlNjQgX19iZTY0IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKQorI2RlZmluZSBfX2FsaWduZWRfbGU2NCBfX2xlNjQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpCisKKyNlbmRpZiAvKiAgX19BU1NFTUJMWV9fICovCisjZW5kaWYgLyogX0xJTlVYX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdWRmX2ZzX2kuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdWRmX2ZzX2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTM2OTY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91ZGZfZnNfaS5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiB1ZGZfZnNfaS5oCisgKgorICogVGhpcyBmaWxlIGlzIGludGVuZGVkIGZvciB0aGUgTGludXgga2VybmVsL21vZHVsZS4gCisgKgorICogQ09QWVJJR0hUCisgKglUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgKEdQTCkuIENvcGllcyBvZiB0aGUgR1BMIGNhbiBiZSBvYnRhaW5lZCBmcm9tOgorICoJCWZ0cDovL3ByZXAuYWkubWl0LmVkdS9wdWIvZ251L0dQTAorICoJRWFjaCBjb250cmlidXRpbmcgYXV0aG9yIHJldGFpbnMgYWxsIHJpZ2h0cyB0byB0aGVpciBvd24gd29yay4KKyAqLworI2lmbmRlZiBfVURGX0ZTX0lfSAorI2RlZmluZSBfVURGX0ZTX0lfSCAxCisKKy8qIGV4cG9ydGVkIElPQ1RMcywgd2UgaGF2ZSAnbCcsIDB4NDAtMHg3ZiAqLworI2RlZmluZSBVREZfR0VURUFTSVpFICAgX0lPUignbCcsIDB4NDAsIGludCkKKyNkZWZpbmUgVURGX0dFVEVBQkxPQ0sgIF9JT1IoJ2wnLCAweDQxLCB2b2lkICopCisjZGVmaW5lIFVERl9HRVRWT0xJREVOVCBfSU9SKCdsJywgMHg0Miwgdm9pZCAqKQorI2RlZmluZSBVREZfUkVMT0NBVEVfQkxPQ0tTIF9JT1dSKCdsJywgMHg0MywgbG9uZykKKworI2VuZGlmIC8qIF9VREZfRlNfSV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VkcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91ZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2NmMjFhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91ZHAuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCURlZmluaXRpb25zIGZvciB0aGUgVURQIHByb3RvY29sLgorICoKKyAqIFZlcnNpb246CUAoIyl1ZHAuaAkxLjAuMgkwNC8yOC85MworICoKKyAqIEF1dGhvcjoJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0xJTlVYX1VEUF9ICisjZGVmaW5lIF9MSU5VWF9VRFBfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IHVkcGhkciB7CisJX19iZTE2CXNvdXJjZTsKKwlfX2JlMTYJZGVzdDsKKwlfX2JlMTYJbGVuOworCV9fc3VtMTYJY2hlY2s7Cit9OworCisvKiBVRFAgc29ja2V0IG9wdGlvbnMgKi8KKyNkZWZpbmUgVURQX0NPUksJMQkvKiBOZXZlciBzZW5kIHBhcnRpYWxseSBjb21wbGV0ZSBzZWdtZW50cyAqLworI2RlZmluZSBVRFBfRU5DQVAJMTAwCS8qIFNldCB0aGUgc29ja2V0IHRvIGFjY2VwdCBlbmNhcHN1bGF0ZWQgcGFja2V0cyAqLworCisvKiBVRFAgZW5jYXBzdWxhdGlvbiB0eXBlcyAqLworI2RlZmluZSBVRFBfRU5DQVBfRVNQSU5VRFBfTk9OX0lLRQkxIC8qIGRyYWZ0LWlldGYtaXBzZWMtbmF0LXQtaWtlLTAwLzAxICovCisjZGVmaW5lIFVEUF9FTkNBUF9FU1BJTlVEUAkyIC8qIGRyYWZ0LWlldGYtaXBzZWMtdWRwLWVuY2Fwcy0wNiAqLworI2RlZmluZSBVRFBfRU5DQVBfTDJUUElOVURQCTMgLyogcmZjMjY2MSAqLworCisKKyNlbmRpZgkvKiBfTElOVVhfVURQX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdWlucHV0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VpbnB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NjY1OTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VpbnB1dC5oCkBAIC0wLDAgKzEsMTM3IEBACisjaWZuZGVmIF9fVUlOUFVUX0hfCisjZGVmaW5lIF9fVUlOUFVUX0hfCisvKgorICogIFVzZXIgbGV2ZWwgZHJpdmVyIHN1cHBvcnQgZm9yIGlucHV0IHN1YnN5c3RlbQorICoKKyAqIEhlYXZpbHkgYmFzZWQgb24gZXZkZXYuYyBieSBWb2p0ZWNoIFBhdmxpaworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogQXV0aG9yOiBBcmlzdGV1IFNlcmdpbyBSb3phbnNraSBGaWxobyA8YXJpc0BjYXRoZWRyYWxsYWJzLm9yZz4KKyAqCisgKiBDaGFuZ2VzL1JldmlzaW9uczoKKyAqCTAuMwkyNC8wNS8yMDA2IChBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhZ21haWwuY29tPikKKyAqCQktIHVwZGF0ZSBmZiBzdXBwb3J0IGZvciB0aGUgY2hhbmdlcyBpbiBrZXJuZWwgaW50ZXJmYWNlCisgKgkJLSBhZGQgVUlOUFVUX1ZFUlNJT04KKyAqCTAuMgkxNi8xMC8yMDA0IChNaWNhaCBEb3d0eSA8bWljYWhAbmF2aS5jeD4pCisgKgkJLSBhZGRlZCBmb3JjZSBmZWVkYmFjayBzdXBwb3J0CisgKiAgICAgICAgICAgICAtIGFkZGVkIFVJX1NFVF9QSFlTCisgKgkwLjEJMjAvMDYvMjAwMgorICoJCS0gZmlyc3QgcHVibGljIHZlcnNpb24KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKworI2RlZmluZSBVSU5QVVRfVkVSU0lPTgkJMworCisKK3N0cnVjdCB1aW5wdXRfZmZfdXBsb2FkIHsKKwlpbnQJCQlyZXF1ZXN0X2lkOworCWludAkJCXJldHZhbDsKKwlzdHJ1Y3QgZmZfZWZmZWN0CWVmZmVjdDsKKwlzdHJ1Y3QgZmZfZWZmZWN0CW9sZDsKK307CisKK3N0cnVjdCB1aW5wdXRfZmZfZXJhc2UgeworCWludAkJCXJlcXVlc3RfaWQ7CisJaW50CQkJcmV0dmFsOworCWludAkJCWVmZmVjdF9pZDsKK307CisKKy8qIGlvY3RsICovCisjZGVmaW5lIFVJTlBVVF9JT0NUTF9CQVNFCSdVJworI2RlZmluZSBVSV9ERVZfQ1JFQVRFCQlfSU8oVUlOUFVUX0lPQ1RMX0JBU0UsIDEpCisjZGVmaW5lIFVJX0RFVl9ERVNUUk9ZCQlfSU8oVUlOUFVUX0lPQ1RMX0JBU0UsIDIpCisKKyNkZWZpbmUgVUlfU0VUX0VWQklUCQlfSU9XKFVJTlBVVF9JT0NUTF9CQVNFLCAxMDAsIGludCkKKyNkZWZpbmUgVUlfU0VUX0tFWUJJVAkJX0lPVyhVSU5QVVRfSU9DVExfQkFTRSwgMTAxLCBpbnQpCisjZGVmaW5lIFVJX1NFVF9SRUxCSVQJCV9JT1coVUlOUFVUX0lPQ1RMX0JBU0UsIDEwMiwgaW50KQorI2RlZmluZSBVSV9TRVRfQUJTQklUCQlfSU9XKFVJTlBVVF9JT0NUTF9CQVNFLCAxMDMsIGludCkKKyNkZWZpbmUgVUlfU0VUX01TQ0JJVAkJX0lPVyhVSU5QVVRfSU9DVExfQkFTRSwgMTA0LCBpbnQpCisjZGVmaW5lIFVJX1NFVF9MRURCSVQJCV9JT1coVUlOUFVUX0lPQ1RMX0JBU0UsIDEwNSwgaW50KQorI2RlZmluZSBVSV9TRVRfU05EQklUCQlfSU9XKFVJTlBVVF9JT0NUTF9CQVNFLCAxMDYsIGludCkKKyNkZWZpbmUgVUlfU0VUX0ZGQklUCQlfSU9XKFVJTlBVVF9JT0NUTF9CQVNFLCAxMDcsIGludCkKKyNkZWZpbmUgVUlfU0VUX1BIWVMJCV9JT1coVUlOUFVUX0lPQ1RMX0JBU0UsIDEwOCwgY2hhciopCisjZGVmaW5lIFVJX1NFVF9TV0JJVAkJX0lPVyhVSU5QVVRfSU9DVExfQkFTRSwgMTA5LCBpbnQpCisjZGVmaW5lIFVJX1NFVF9QUk9QQklUCQlfSU9XKFVJTlBVVF9JT0NUTF9CQVNFLCAxMTAsIGludCkKKworI2RlZmluZSBVSV9CRUdJTl9GRl9VUExPQUQJX0lPV1IoVUlOUFVUX0lPQ1RMX0JBU0UsIDIwMCwgc3RydWN0IHVpbnB1dF9mZl91cGxvYWQpCisjZGVmaW5lIFVJX0VORF9GRl9VUExPQUQJX0lPVyhVSU5QVVRfSU9DVExfQkFTRSwgMjAxLCBzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZCkKKyNkZWZpbmUgVUlfQkVHSU5fRkZfRVJBU0UJX0lPV1IoVUlOUFVUX0lPQ1RMX0JBU0UsIDIwMiwgc3RydWN0IHVpbnB1dF9mZl9lcmFzZSkKKyNkZWZpbmUgVUlfRU5EX0ZGX0VSQVNFCQlfSU9XKFVJTlBVVF9JT0NUTF9CQVNFLCAyMDMsIHN0cnVjdCB1aW5wdXRfZmZfZXJhc2UpCisKKy8qCisgKiBUbyB3cml0ZSBhIGZvcmNlLWZlZWRiYWNrLWNhcGFibGUgZHJpdmVyLCB0aGUgdXBsb2FkX2VmZmVjdAorICogYW5kIGVyYXNlX2VmZmVjdCBjYWxsYmFja3MgaW4gaW5wdXRfZGV2IG11c3QgYmUgaW1wbGVtZW50ZWQuCisgKiBUaGUgdWlucHV0IGRyaXZlciB3aWxsIGdlbmVyYXRlIGEgZmFrZSBpbnB1dCBldmVudCB3aGVuIG9uZSBvZgorICogdGhlc2UgY2FsbGJhY2tzIGFyZSBpbnZva2VkLiBUaGUgdXNlcnNwYWNlIGNvZGUgdGhlbiB1c2VzCisgKiBpb2N0bHMgdG8gcmV0cmlldmUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGFuZCBzZW5kIHRoZSByZXR1cm4gY29kZS4KKyAqIFRoZSBjYWxsYmFjayBibG9ja3MgdW50aWwgdGhpcyByZXR1cm4gY29kZSBpcyBzZW50LgorICoKKyAqIFRoZSBkZXNjcmliZWQgY2FsbGJhY2sgbWVjaGFuaXNtIGlzIG9ubHkgdXNlZCBpZiBmZl9lZmZlY3RzX21heAorICogaXMgc2V0LgorICoKKyAqIFRvIGltcGxlbWVudCB1cGxvYWRfZWZmZWN0KCk6CisgKiAgIDEuIFdhaXQgZm9yIGFuIGV2ZW50IHdpdGggdHlwZSA9PSBFVl9VSU5QVVQgYW5kIGNvZGUgPT0gVUlfRkZfVVBMT0FELgorICogICAgICBBIHJlcXVlc3QgSUQgd2lsbCBiZSBnaXZlbiBpbiAndmFsdWUnLgorICogICAyLiBBbGxvY2F0ZSBhIHVpbnB1dF9mZl91cGxvYWQgc3RydWN0LCBmaWxsIGluIHJlcXVlc3RfaWQgd2l0aAorICogICAgICB0aGUgJ3ZhbHVlJyBmcm9tIHRoZSBFVl9VSU5QVVQgZXZlbnQuCisgKiAgIDMuIElzc3VlIGEgVUlfQkVHSU5fRkZfVVBMT0FEIGlvY3RsLCBnaXZpbmcgaXQgdGhlCisgKiAgICAgIHVpbnB1dF9mZl91cGxvYWQgc3RydWN0LiBJdCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIHRoZQorICogICAgICBmZl9lZmZlY3RzIHBhc3NlZCB0byB1cGxvYWRfZWZmZWN0KCkuCisgKiAgIDQuIFBlcmZvcm0gdGhlIGVmZmVjdCB1cGxvYWQsIGFuZCBwbGFjZSBhIHJldHVybiBjb2RlIGJhY2sgaW50bworICAgICAgICB0aGUgdWlucHV0X2ZmX3VwbG9hZCBzdHJ1Y3QuCisgKiAgIDUuIElzc3VlIGEgVUlfRU5EX0ZGX1VQTE9BRCBpb2N0bCwgYWxzbyBnaXZpbmcgaXQgdGhlCisgKiAgICAgIHVpbnB1dF9mZl91cGxvYWRfZWZmZWN0IHN0cnVjdC4gVGhpcyB3aWxsIGNvbXBsZXRlIGV4ZWN1dGlvbgorICogICAgICBvZiBvdXIgdXBsb2FkX2VmZmVjdCgpIGhhbmRsZXIuCisgKgorICogVG8gaW1wbGVtZW50IGVyYXNlX2VmZmVjdCgpOgorICogICAxLiBXYWl0IGZvciBhbiBldmVudCB3aXRoIHR5cGUgPT0gRVZfVUlOUFVUIGFuZCBjb2RlID09IFVJX0ZGX0VSQVNFLgorICogICAgICBBIHJlcXVlc3QgSUQgd2lsbCBiZSBnaXZlbiBpbiAndmFsdWUnLgorICogICAyLiBBbGxvY2F0ZSBhIHVpbnB1dF9mZl9lcmFzZSBzdHJ1Y3QsIGZpbGwgaW4gcmVxdWVzdF9pZCB3aXRoCisgKiAgICAgIHRoZSAndmFsdWUnIGZyb20gdGhlIEVWX1VJTlBVVCBldmVudC4KKyAqICAgMy4gSXNzdWUgYSBVSV9CRUdJTl9GRl9FUkFTRSBpb2N0bCwgZ2l2aW5nIGl0IHRoZQorICogICAgICB1aW5wdXRfZmZfZXJhc2Ugc3RydWN0LiBJdCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIHRoZQorICogICAgICBlZmZlY3QgSUQgcGFzc2VkIHRvIGVyYXNlX2VmZmVjdCgpLgorICogICA0LiBQZXJmb3JtIHRoZSBlZmZlY3QgZXJhc3VyZSwgYW5kIHBsYWNlIGEgcmV0dXJuIGNvZGUgYmFjaworICogICAgICBpbnRvIHRoZSB1aW5wdXRfZmZfZXJhc2Ugc3RydWN0LgorICogICA1LiBJc3N1ZSBhIFVJX0VORF9GRl9FUkFTRSBpb2N0bCwgYWxzbyBnaXZpbmcgaXQgdGhlCisgKiAgICAgIHVpbnB1dF9mZl9lcmFzZV9lZmZlY3Qgc3RydWN0LiBUaGlzIHdpbGwgY29tcGxldGUgZXhlY3V0aW9uCisgKiAgICAgIG9mIG91ciBlcmFzZV9lZmZlY3QoKSBoYW5kbGVyLgorICovCisKKy8qCisgKiBUaGlzIGlzIHRoZSBuZXcgZXZlbnQgdHlwZSwgdXNlZCBvbmx5IGJ5IHVpbnB1dC4KKyAqICdjb2RlJyBpcyBVSV9GRl9VUExPQUQgb3IgVUlfRkZfRVJBU0UsIGFuZCAndmFsdWUnCisgKiBpcyB0aGUgdW5pcXVlIHJlcXVlc3QgSUQuIFRoaXMgbnVtYmVyIHdhcyBwaWNrZWQKKyAqIGFyYml0cmFyaWx5LCBhYm92ZSBFVl9NQVggKHNpbmNlIHRoZSBpbnB1dCBzeXN0ZW0KKyAqIG5ldmVyIHNlZXMgaXQpIGJ1dCBpbiB0aGUgcmFuZ2Ugb2YgYSAxNi1iaXQgaW50LgorICovCisjZGVmaW5lIEVWX1VJTlBVVAkJMHgwMTAxCisjZGVmaW5lIFVJX0ZGX1VQTE9BRAkJMQorI2RlZmluZSBVSV9GRl9FUkFTRQkJMgorCisjZGVmaW5lIFVJTlBVVF9NQVhfTkFNRV9TSVpFCTgwCitzdHJ1Y3QgdWlucHV0X3VzZXJfZGV2IHsKKwljaGFyIG5hbWVbVUlOUFVUX01BWF9OQU1FX1NJWkVdOworCXN0cnVjdCBpbnB1dF9pZCBpZDsKKwlpbnQgZmZfZWZmZWN0c19tYXg7CisJaW50IGFic21heFtBQlNfQ05UXTsKKwlpbnQgYWJzbWluW0FCU19DTlRdOworCWludCBhYnNmdXp6W0FCU19DTlRdOworCWludCBhYnNmbGF0W0FCU19DTlRdOworfTsKKyNlbmRpZgkvKiBfX1VJTlBVVF9IXyAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Vpby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91aW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmY0YTg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91aW8uaApAQCAtMCwwICsxLDMwIEBACisjaWZuZGVmIF9fTElOVVhfVUlPX0gKKyNkZWZpbmUgX19MSU5VWF9VSU9fSAorCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICoJQmVya2VsZXkgc3R5bGUgVUlPIHN0cnVjdHVyZXMJLQlBbGFuIENveCAxOTk0LgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKK3N0cnVjdCBpb3ZlYworeworCXZvaWQgKmlvdl9iYXNlOwkvKiBCU0QgdXNlcyBjYWRkcl90ICgxMDAzLjFnIHJlcXVpcmVzIHZvaWQgKikgKi8KKwlfX2tlcm5lbF9zaXplX3QgaW92X2xlbjsgLyogTXVzdCBiZSBzaXplX3QgKDEwMDMuMWcpICovCit9OworCisvKgorICoJVUlPX01BWElPViBzaGFsbCBiZSBhdCBsZWFzdCAxNiAxMDAzLjFnICg1LjQuMS4xKQorICovCisgCisjZGVmaW5lIFVJT19GQVNUSU9WCTgKKyNkZWZpbmUgVUlPX01BWElPVgkxMDI0CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VsdHJhc291bmQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdWx0cmFzb3VuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMzM5ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VsdHJhc291bmQuaApAQCAtMCwwICsxLDEwMyBAQAorI2lmbmRlZiBfVUxUUkFTT1VORF9IXworI2RlZmluZSBfVUxUUkFTT1VORF9IXworLyoKKyAqCXVsdHJhc291bmQuaCAtIE1hY3JvcyBmb3IgcHJvZ3JhbW1pbmcgdGhlIEdyYXZpcyBVbHRyYXNvdW5kCisgKgkJCVRoZXNlIG1hY3JvcyBhcmUgZXh0cmVtZWx5IGRldmljZSBkZXBlbmRlbnQKKyAqCQkJYW5kIG5vdCBwb3J0YWJsZS4KKyAqLworLyoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICovCisKKworLyoKKyAqCVByaXZhdGUgZXZlbnRzIGZvciBHcmF2aXMgVWx0cmFzb3VuZCAoR1VTKQorICoKKyAqCUZvcm1hdDoKKyAqCQlieXRlIDAgCQktIFNFUV9QUklWQVRFICgweGZlKQorICoJCWJ5dGUgMSAJCS0gU3ludGhlc2l6ZXIgZGV2aWNlIG51bWJlciAoMC1OKQorICoJCWJ5dGUgMiAJCS0gQ29tbWFuZCAoc2VlIGJlbG93KQorICoJCWJ5dGUgMyAJCS0gVm9pY2UgbnVtYmVyICgwLTMxKQorICoJCWJ5dGVzIDQgYW5kIDUJLSBwYXJhbWV0ZXIgUDEgKHVuc2lnbmVkIHNob3J0KQorICoJCWJ5dGVzIDYgYW5kIDcJLSBwYXJhbWV0ZXIgUDIgKHVuc2lnbmVkIHNob3J0KQorICoKKyAqCUNvbW1hbmRzOgorICoJCUVhY2ggY29tbWFuZCBhZmZlY3RzIG9uZSB2b2ljZSBkZWZpbmVkIGluIGJ5dGUgMy4KKyAqCQlVbnVzZWQgcGFyYW1ldGVycyAoUDEgYW5kL29yIFAyICpNVVNUKiBiZSBpbml0aWFsaXplZCB0byB6ZXJvKS4KKyAqCQlfR1VTX05VTVZPSUNFUwktIFNldHMgbWF4LiBudW1iZXIgb2YgY29uY3VycmVudCB2b2ljZXMgKFAxPTE0LTMxLCBkZWZhdWx0IDE2KQorICoJCV9HVVNfVk9JQ0VTQU1QTEUtICoqKioqKioqKioqKiBPQlNPTEVURSAqKioqKioqKioqKioqCisgKgkJX0dVU19WT0lDRU9OCS0gU3RhcnRzIHZvaWNlIChQMT12b2ljZSBtb2RlKQorICoJCV9HVVNfVk9JQ0VPRkYJLSBTdG9wcyB2b2ljZSAobm8gcGFyYW1ldGVycykKKyAqCQlfR1VTX1ZPSUNFRkFERQktIFN0b3BzIHRoZSB2b2ljZSBzbW9vdGhseS4KKyAqCQlfR1VTX1ZPSUNFTU9ERQktIEFsdGVycyB0aGUgdm9pY2UgbW9kZSwgZG9uJ3Qgc3RhcnQgb3Igc3RvcCB2b2ljZSAoUDE9dm9pY2UgbW9kZSkKKyAqCQlfR1VTX1ZPSUNFQkFMQQktIFNldHMgdm9pY2UgYmFsYW5jZSAoUDEsIDA9bGVmdCwgNz1taWRkbGUgYW5kIDE1PXJpZ2h0LCBkZWZhdWx0IDcpCisgKgkJX0dVU19WT0lDRUZSRVEJLSBTZXRzIHZvaWNlIChzYW1wbGUpIHBsYXliYWNrIGZyZXF1ZW5jeSAoUDE9SHopCisgKgkJX0dVU19WT0lDRVZPTAktIFNldHMgdm9pY2Ugdm9sdW1lIChQMT12b2x1bWUsIDB4ZmZmPW1heCwgMHhlZmY9aGFsZiwgMHgwMDA9b2ZmKQorICoJCV9HVVNfVk9JQ0VWT0wyCS0gU2V0cyB2b2ljZSB2b2x1bWUgKFAxPXZvbHVtZSwgMHhmZmY9bWF4LCAweGVmZj1oYWxmLCAweDAwMD1vZmYpCisgKgkJCQkgIChMaWtlIEdVU19WT0lDRVZPTCBidXQgZG9lc24ndCBjaGFuZ2UgdGhlIGh3CisgKgkJCQkgIHZvbHVtZS4gSXQganVzdCB1cGRhdGVzIHZvbHVtZSBpbiB0aGUgdm9pY2UgdGFibGUpLgorICoKKyAqCQlfR1VTX1JBTVBSQU5HRQktIFNldHMgbGltaXRzIGZvciB2b2x1bWUgcmFtcGluZyAoUDE9bG93IHZvbHVtZSwgUDI9aGlnaCB2b2x1bWUpCisgKgkJX0dVU19SQU1QUkFURQktIFNldHMgdGhlIHNwZWVkIGZvciB2b2x1bWUgcmFtcGluZyAoUDE9c2NhbGUsIFAyPXJhdGUpCisgKgkJX0dVU19SQU1QTU9ERQktIFNldHMgdGhlIHZvbHVtZSByYW1waW5nIG1vZGUgKFAxPXJhbXBpbmcgbW9kZSkKKyAqCQlfR1VTX1JBTVBPTgktIFN0YXJ0cyB2b2x1bWUgcmFtcGluZyAobm8gcGFyYW1ldGVycykKKyAqCQlfR1VTX1JBTVBPRkYJLSBTdG9wcyB2b2x1bWUgcmFtcGluZyAobm8gcGFyYW1ldGVycykKKyAqCQlfR1VTX1ZPTFVNRV9TQ0FMRSAtIENoYW5nZXMgdGhlIHZvbHVtZSBjYWxjdWxhdGlvbiBjb25zdGFudHMKKyAqCQkJCSAgZm9yIGFsbCB2b2ljZXMuCisgKi8KKworI2RlZmluZSBfR1VTX05VTVZPSUNFUwkJMHgwMAorI2RlZmluZSBfR1VTX1ZPSUNFU0FNUExFCTB4MDEJLyogT0JTT0xFVEUgKi8KKyNkZWZpbmUgX0dVU19WT0lDRU9OCQkweDAyCisjZGVmaW5lIF9HVVNfVk9JQ0VPRkYJCTB4MDMKKyNkZWZpbmUgX0dVU19WT0lDRU1PREUJCTB4MDQKKyNkZWZpbmUgX0dVU19WT0lDRUJBTEEJCTB4MDUKKyNkZWZpbmUgX0dVU19WT0lDRUZSRVEJCTB4MDYKKyNkZWZpbmUgX0dVU19WT0lDRVZPTAkJMHgwNworI2RlZmluZSBfR1VTX1JBTVBSQU5HRQkJMHgwOAorI2RlZmluZSBfR1VTX1JBTVBSQVRFCQkweDA5CisjZGVmaW5lIF9HVVNfUkFNUE1PREUJCTB4MGEKKyNkZWZpbmUgX0dVU19SQU1QT04JCTB4MGIKKyNkZWZpbmUgX0dVU19SQU1QT0ZGCQkweDBjCisjZGVmaW5lIF9HVVNfVk9JQ0VGQURFCQkweDBkCisjZGVmaW5lIF9HVVNfVk9MVU1FX1NDQUxFCTB4MGUKKyNkZWZpbmUgX0dVU19WT0lDRVZPTDIJCTB4MGYKKyNkZWZpbmUgX0dVU19WT0lDRV9QT1MJCTB4MTAKKworLyoKKyAqCUdVUyBBUEkgbWFjcm9zCisgKi8KKworI2RlZmluZSBfR1VTX0NNRChjaG4sIHZvaWNlLCBjbWQsIHAxLCBwMikgXAorCQkJCQl7X1NFUV9ORUVEQlVGKDgpOyBfc2VxYnVmW19zZXFidWZwdHJdID0gU0VRX1BSSVZBVEU7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrMV0gPSAoY2huKTsgX3NlcWJ1Zltfc2VxYnVmcHRyKzJdID0gY21kO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzNdID0gdm9pY2U7XAorCQkJCQkqKHVuc2lnbmVkIHNob3J0KikmX3NlcWJ1Zltfc2VxYnVmcHRyKzRdID0gcDE7XAorCQkJCQkqKHVuc2lnbmVkIHNob3J0KikmX3NlcWJ1Zltfc2VxYnVmcHRyKzZdID0gcDI7XAorCQkJCQlfU0VRX0FEVkJVRig4KTt9CisKKyNkZWZpbmUgR1VTX05VTVZPSUNFUyhjaG4sIHAxKQkJCV9HVVNfQ01EKGNobiwgMCwgX0dVU19OVU1WT0lDRVMsIChwMSksIDApCisjZGVmaW5lIEdVU19WT0lDRVNBTVBMRShjaG4sIHZvaWNlLCBwMSkJCV9HVVNfQ01EKGNobiwgdm9pY2UsIF9HVVNfVk9JQ0VTQU1QTEUsIChwMSksIDApCS8qIE9CU09MRVRFICovCisjZGVmaW5lIEdVU19WT0lDRU9OKGNobiwgdm9pY2UsIHAxKQkJX0dVU19DTUQoY2huLCB2b2ljZSwgX0dVU19WT0lDRU9OLCAocDEpLCAwKQorI2RlZmluZSBHVVNfVk9JQ0VPRkYoY2huLCB2b2ljZSkJCV9HVVNfQ01EKGNobiwgdm9pY2UsIF9HVVNfVk9JQ0VPRkYsIDAsIDApCisjZGVmaW5lIEdVU19WT0lDRUZBREUoY2huLCB2b2ljZSkJCV9HVVNfQ01EKGNobiwgdm9pY2UsIF9HVVNfVk9JQ0VGQURFLCAwLCAwKQorI2RlZmluZSBHVVNfVk9JQ0VNT0RFKGNobiwgdm9pY2UsIHAxKQkJX0dVU19DTUQoY2huLCB2b2ljZSwgX0dVU19WT0lDRU1PREUsIChwMSksIDApCisjZGVmaW5lIEdVU19WT0lDRUJBTEEoY2huLCB2b2ljZSwgcDEpCQlfR1VTX0NNRChjaG4sIHZvaWNlLCBfR1VTX1ZPSUNFQkFMQSwgKHAxKSwgMCkKKyNkZWZpbmUgR1VTX1ZPSUNFRlJFUShjaG4sIHZvaWNlLCBwKQkJX0dVU19DTUQoY2huLCB2b2ljZSwgX0dVU19WT0lDRUZSRVEsIFwKKwkJCQkJCQkocCkgJiAweGZmZmYsICgocCkgPj4gMTYpICYgMHhmZmZmKQorI2RlZmluZSBHVVNfVk9JQ0VWT0woY2huLCB2b2ljZSwgcDEpCQlfR1VTX0NNRChjaG4sIHZvaWNlLCBfR1VTX1ZPSUNFVk9MLCAocDEpLCAwKQorI2RlZmluZSBHVVNfVk9JQ0VWT0wyKGNobiwgdm9pY2UsIHAxKQkJX0dVU19DTUQoY2huLCB2b2ljZSwgX0dVU19WT0lDRVZPTDIsIChwMSksIDApCisjZGVmaW5lIEdVU19SQU1QUkFOR0UoY2huLCB2b2ljZSwgbG93LCBoaWdoKQlfR1VTX0NNRChjaG4sIHZvaWNlLCBfR1VTX1JBTVBSQU5HRSwgKGxvdyksIChoaWdoKSkKKyNkZWZpbmUgR1VTX1JBTVBSQVRFKGNobiwgdm9pY2UsIHAxLCBwMikJX0dVU19DTUQoY2huLCB2b2ljZSwgX0dVU19SQU1QUkFURSwgKHAxKSwgKHAyKSkKKyNkZWZpbmUgR1VTX1JBTVBNT0RFKGNobiwgdm9pY2UsIHAxKQkJX0dVU19DTUQoY2huLCB2b2ljZSwgX0dVU19SQU1QTU9ERSwgKHAxKSwgMCkKKyNkZWZpbmUgR1VTX1JBTVBPTihjaG4sIHZvaWNlLCBwMSkJCV9HVVNfQ01EKGNobiwgdm9pY2UsIF9HVVNfUkFNUE9OLCAocDEpLCAwKQorI2RlZmluZSBHVVNfUkFNUE9GRihjaG4sIHZvaWNlKQkJCV9HVVNfQ01EKGNobiwgdm9pY2UsIF9HVVNfUkFNUE9GRiwgMCwgMCkKKyNkZWZpbmUgR1VTX1ZPTFVNRV9TQ0FMRShjaG4sIHZvaWNlLCBwMSwgcDIpCV9HVVNfQ01EKGNobiwgdm9pY2UsIF9HVVNfVk9MVU1FX1NDQUxFLCAocDEpLCAocDIpKQorI2RlZmluZSBHVVNfVk9JQ0VfUE9TKGNobiwgdm9pY2UsIHApCQlfR1VTX0NNRChjaG4sIHZvaWNlLCBfR1VTX1ZPSUNFX1BPUywgXAorCQkJCQkJCShwKSAmIDB4ZmZmZiwgKChwKSA+PiAxNikgJiAweGZmZmYpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91bi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91bi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZDNlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VuLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfTElOVVhfVU5fSAorI2RlZmluZSBfTElOVVhfVU5fSAorCisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisKKyNkZWZpbmUgVU5JWF9QQVRIX01BWAkxMDgKKworc3RydWN0IHNvY2thZGRyX3VuIHsKKwlfX2tlcm5lbF9zYV9mYW1pbHlfdCBzdW5fZmFtaWx5OyAvKiBBRl9VTklYICovCisJY2hhciBzdW5fcGF0aFtVTklYX1BBVEhfTUFYXTsJLyogcGF0aG5hbWUgKi8KK307CisKKyNlbmRpZiAvKiBfTElOVVhfVU5fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91bmlzdGQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdW5pc3RkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4ZDViNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdW5pc3RkLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9MSU5VWF9VTklTVERfSF8KKyNkZWZpbmUgX0xJTlVYX1VOSVNURF9IXworCisvKgorICogSW5jbHVkZSBtYWNoaW5lIHNwZWNpZmljIHN5c2NhbGwgbnVtYmVycworICovCisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisjZW5kaWYgLyogX0xJTlVYX1VOSVNURF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvYXVkaW8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2F1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1NGRiYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2F1ZGlvLmgKQEAgLTAsMCArMSw1NDUgQEAKKy8qCisgKiA8bGludXgvdXNiL2F1ZGlvLmg+IC0tIFVTQiBBdWRpbyBkZWZpbml0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGh1bXRyb25pY3MgUHR5IEx0ZC4KKyAqIERldmVsb3BlZCBmb3IgVGh1bXRyb25pY3MgYnkgR3JleSBJbm5vdmF0aW9uCisgKiBCZW4gV2lsbGlhbXNvbiA8YmVuLndpbGxpYW1zb25AZ3JleWlubm92YXRpb24uY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBob2xkcyBVU0IgY29uc3RhbnRzIGFuZCBzdHJ1Y3R1cmVzIGRlZmluZWQKKyAqIGJ5IHRoZSBVU0IgRGV2aWNlIENsYXNzIERlZmluaXRpb24gZm9yIEF1ZGlvIERldmljZXMuCisgKiBDb21tZW50cyBiZWxvdyByZWZlcmVuY2UgcmVsZXZhbnQgc2VjdGlvbnMgb2YgdGhhdCBkb2N1bWVudDoKKyAqCisgKiBodHRwOi8vd3d3LnVzYi5vcmcvZGV2ZWxvcGVycy9kZXZjbGFzc19kb2NzL2F1ZGlvMTAucGRmCisgKgorICogVHlwZXMgYW5kIGRlZmluZXMgaW4gdGhpcyBmaWxlIGFyZSBlaXRoZXIgc3BlY2lmaWMgdG8gdmVyc2lvbiAxLjAgb2YKKyAqIHRoaXMgc3RhbmRhcmQgb3IgY29tbW9uIGZvciBuZXdlciB2ZXJzaW9ucy4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfVVNCX0FVRElPX0gKKyNkZWZpbmUgX19MSU5VWF9VU0JfQVVESU9fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogYkludGVyZmFjZVByb3RvY29sIHZhbHVlcyB0byBkZW5vdGUgdGhlIHZlcnNpb24gb2YgdGhlIHN0YW5kYXJkIHVzZWQgKi8KKyNkZWZpbmUgVUFDX1ZFUlNJT05fMQkJCTB4MDAKKyNkZWZpbmUgVUFDX1ZFUlNJT05fMgkJCTB4MjAKKworLyogQS4yIEF1ZGlvIEludGVyZmFjZSBTdWJjbGFzcyBDb2RlcyAqLworI2RlZmluZSBVU0JfU1VCQ0xBU1NfQVVESU9DT05UUk9MCTB4MDEKKyNkZWZpbmUgVVNCX1NVQkNMQVNTX0FVRElPU1RSRUFNSU5HCTB4MDIKKyNkZWZpbmUgVVNCX1NVQkNMQVNTX01JRElTVFJFQU1JTkcJMHgwMworCisvKiBBLjUgQXVkaW8gQ2xhc3MtU3BlY2lmaWMgQUMgSW50ZXJmYWNlIERlc2NyaXB0b3IgU3VidHlwZXMgKi8KKyNkZWZpbmUgVUFDX0hFQURFUgkJCTB4MDEKKyNkZWZpbmUgVUFDX0lOUFVUX1RFUk1JTkFMCQkweDAyCisjZGVmaW5lIFVBQ19PVVRQVVRfVEVSTUlOQUwJCTB4MDMKKyNkZWZpbmUgVUFDX01JWEVSX1VOSVQJCQkweDA0CisjZGVmaW5lIFVBQ19TRUxFQ1RPUl9VTklUCQkweDA1CisjZGVmaW5lIFVBQ19GRUFUVVJFX1VOSVQJCTB4MDYKKyNkZWZpbmUgVUFDMV9QUk9DRVNTSU5HX1VOSVQJCTB4MDcKKyNkZWZpbmUgVUFDMV9FWFRFTlNJT05fVU5JVAkJMHgwOAorCisvKiBBLjYgQXVkaW8gQ2xhc3MtU3BlY2lmaWMgQVMgSW50ZXJmYWNlIERlc2NyaXB0b3IgU3VidHlwZXMgKi8KKyNkZWZpbmUgVUFDX0FTX0dFTkVSQUwJCQkweDAxCisjZGVmaW5lIFVBQ19GT1JNQVRfVFlQRQkJCTB4MDIKKyNkZWZpbmUgVUFDX0ZPUk1BVF9TUEVDSUZJQwkJMHgwMworCisvKiBBLjcgUHJvY2Vzc2luZyBVbml0IFByb2Nlc3MgVHlwZXMgKi8KKyNkZWZpbmUgVUFDX1BST0NFU1NfVU5ERUZJTkVECQkweDAwCisjZGVmaW5lIFVBQ19QUk9DRVNTX1VQX0RPV05NSVgJCTB4MDEKKyNkZWZpbmUgVUFDX1BST0NFU1NfRE9MQllfUFJPTE9HSUMJMHgwMgorI2RlZmluZSBVQUNfUFJPQ0VTU19TVEVSRU9fRVhURU5ERVIJMHgwMworI2RlZmluZSBVQUNfUFJPQ0VTU19SRVZFUkIJCTB4MDQKKyNkZWZpbmUgVUFDX1BST0NFU1NfQ0hPUlVTCQkweDA1CisjZGVmaW5lIFVBQ19QUk9DRVNTX0RZTl9SQU5HRV9DT01QCTB4MDYKKworLyogQS44IEF1ZGlvIENsYXNzLVNwZWNpZmljIEVuZHBvaW50IERlc2NyaXB0b3IgU3VidHlwZXMgKi8KKyNkZWZpbmUgVUFDX0VQX0dFTkVSQUwJCQkweDAxCisKKy8qIEEuOSBBdWRpbyBDbGFzcy1TcGVjaWZpYyBSZXF1ZXN0IENvZGVzICovCisjZGVmaW5lIFVBQ19TRVRfCQkJMHgwMAorI2RlZmluZSBVQUNfR0VUXwkJCTB4ODAKKworI2RlZmluZSBVQUNfX0NVUgkJCTB4MQorI2RlZmluZSBVQUNfX01JTgkJCTB4MgorI2RlZmluZSBVQUNfX01BWAkJCTB4MworI2RlZmluZSBVQUNfX1JFUwkJCTB4NAorI2RlZmluZSBVQUNfX01FTQkJCTB4NQorCisjZGVmaW5lIFVBQ19TRVRfQ1VSCQkJKFVBQ19TRVRfIHwgVUFDX19DVVIpCisjZGVmaW5lIFVBQ19HRVRfQ1VSCQkJKFVBQ19HRVRfIHwgVUFDX19DVVIpCisjZGVmaW5lIFVBQ19TRVRfTUlOCQkJKFVBQ19TRVRfIHwgVUFDX19NSU4pCisjZGVmaW5lIFVBQ19HRVRfTUlOCQkJKFVBQ19HRVRfIHwgVUFDX19NSU4pCisjZGVmaW5lIFVBQ19TRVRfTUFYCQkJKFVBQ19TRVRfIHwgVUFDX19NQVgpCisjZGVmaW5lIFVBQ19HRVRfTUFYCQkJKFVBQ19HRVRfIHwgVUFDX19NQVgpCisjZGVmaW5lIFVBQ19TRVRfUkVTCQkJKFVBQ19TRVRfIHwgVUFDX19SRVMpCisjZGVmaW5lIFVBQ19HRVRfUkVTCQkJKFVBQ19HRVRfIHwgVUFDX19SRVMpCisjZGVmaW5lIFVBQ19TRVRfTUVNCQkJKFVBQ19TRVRfIHwgVUFDX19NRU0pCisjZGVmaW5lIFVBQ19HRVRfTUVNCQkJKFVBQ19HRVRfIHwgVUFDX19NRU0pCisKKyNkZWZpbmUgVUFDX0dFVF9TVEFUCQkJMHhmZgorCisvKiBBLjEwIENvbnRyb2wgU2VsZWN0b3IgQ29kZXMgKi8KKworLyogQS4xMC4xIFRlcm1pbmFsIENvbnRyb2wgU2VsZWN0b3JzICovCisjZGVmaW5lIFVBQ19URVJNX0NPUFlfUFJPVEVDVAkJMHgwMQorCisvKiBBLjEwLjIgRmVhdHVyZSBVbml0IENvbnRyb2wgU2VsZWN0b3JzICovCisjZGVmaW5lIFVBQ19GVV9NVVRFCQkJMHgwMQorI2RlZmluZSBVQUNfRlVfVk9MVU1FCQkJMHgwMgorI2RlZmluZSBVQUNfRlVfQkFTUwkJCTB4MDMKKyNkZWZpbmUgVUFDX0ZVX01JRAkJCTB4MDQKKyNkZWZpbmUgVUFDX0ZVX1RSRUJMRQkJCTB4MDUKKyNkZWZpbmUgVUFDX0ZVX0dSQVBISUNfRVFVQUxJWkVSCTB4MDYKKyNkZWZpbmUgVUFDX0ZVX0FVVE9NQVRJQ19HQUlOCQkweDA3CisjZGVmaW5lIFVBQ19GVV9ERUxBWQkJCTB4MDgKKyNkZWZpbmUgVUFDX0ZVX0JBU1NfQk9PU1QJCTB4MDkKKyNkZWZpbmUgVUFDX0ZVX0xPVURORVNTCQkJMHgwYQorCisjZGVmaW5lIFVBQ19DT05UUk9MX0JJVChDUykJKDEgPDwgKChDUykgLSAxKSkKKworLyogQS4xMC4zLjEgVXAvRG93bi1taXggUHJvY2Vzc2luZyBVbml0IENvbnRyb2xzIFNlbGVjdG9ycyAqLworI2RlZmluZSBVQUNfVURfRU5BQkxFCQkJMHgwMQorI2RlZmluZSBVQUNfVURfTU9ERV9TRUxFQ1QJCTB4MDIKKworLyogQS4xMC4zLjIgRG9sYnkgUHJvbG9naWMgKHRtKSBQcm9jZXNzaW5nIFVuaXQgQ29udHJvbHMgU2VsZWN0b3JzICovCisjZGVmaW5lIFVBQ19EUF9FTkFCTEUJCQkweDAxCisjZGVmaW5lIFVBQ19EUF9NT0RFX1NFTEVDVAkJMHgwMgorCisvKiBBLjEwLjMuMyAzRCBTdGVyZW8gRXh0ZW5kZXIgUHJvY2Vzc2luZyBVbml0IENvbnRyb2wgU2VsZWN0b3JzICovCisjZGVmaW5lIFVBQ18zRF9FTkFCTEUJCQkweDAxCisjZGVmaW5lIFVBQ18zRF9TUEFDRQkJCTB4MDIKKworLyogQS4xMC4zLjQgUmV2ZXJiZXJhdGlvbiBQcm9jZXNzaW5nIFVuaXQgQ29udHJvbCBTZWxlY3RvcnMgKi8KKyNkZWZpbmUgVUFDX1JFVkVSQl9FTkFCTEUJCTB4MDEKKyNkZWZpbmUgVUFDX1JFVkVSQl9MRVZFTAkJMHgwMgorI2RlZmluZSBVQUNfUkVWRVJCX1RJTUUJCQkweDAzCisjZGVmaW5lIFVBQ19SRVZFUkJfRkVFREJBQ0sJCTB4MDQKKworLyogQS4xMC4zLjUgQ2hvcnVzIFByb2Nlc3NpbmcgVW5pdCBDb250cm9sIFNlbGVjdG9ycyAqLworI2RlZmluZSBVQUNfQ0hPUlVTX0VOQUJMRQkJMHgwMQorI2RlZmluZSBVQUNfQ0hPUlVTX0xFVkVMCQkweDAyCisjZGVmaW5lIFVBQ19DSE9SVVNfUkFURQkJCTB4MDMKKyNkZWZpbmUgVUFDX0NIT1JVU19ERVBUSAkJMHgwNAorCisvKiBBLjEwLjMuNiBEeW5hbWljIFJhbmdlIENvbXByZXNzb3IgVW5pdCBDb250cm9sIFNlbGVjdG9ycyAqLworI2RlZmluZSBVQUNfRENSX0VOQUJMRQkJCTB4MDEKKyNkZWZpbmUgVUFDX0RDUl9SQVRFCQkJMHgwMgorI2RlZmluZSBVQUNfRENSX01BWEFNUEwJCQkweDAzCisjZGVmaW5lIFVBQ19EQ1JfVEhSRVNIT0xECQkweDA0CisjZGVmaW5lIFVBQ19EQ1JfQVRUQUNLX1RJTUUJCTB4MDUKKyNkZWZpbmUgVUFDX0RDUl9SRUxFQVNFX1RJTUUJCTB4MDYKKworLyogQS4xMC40IEV4dGVuc2lvbiBVbml0IENvbnRyb2wgU2VsZWN0b3JzICovCisjZGVmaW5lIFVBQ19YVV9FTkFCTEUJCQkweDAxCisKKy8qIE1JREkgLSBBLjEgTVMgQ2xhc3MtU3BlY2lmaWMgSW50ZXJmYWNlIERlc2NyaXB0b3IgU3VidHlwZXMgKi8KKyNkZWZpbmUgVUFDX01TX0hFQURFUgkJCTB4MDEKKyNkZWZpbmUgVUFDX01JRElfSU5fSkFDSwkJMHgwMgorI2RlZmluZSBVQUNfTUlESV9PVVRfSkFDSwkJMHgwMworCisvKiBNSURJIC0gQS4xIE1TIENsYXNzLVNwZWNpZmljIEVuZHBvaW50IERlc2NyaXB0b3IgU3VidHlwZXMgKi8KKyNkZWZpbmUgVUFDX01TX0dFTkVSQUwJCQkweDAxCisKKy8qIFRlcm1pbmFscyAtIDIuMSBVU0IgVGVybWluYWwgVHlwZXMgKi8KKyNkZWZpbmUgVUFDX1RFUk1JTkFMX1VOREVGSU5FRAkJMHgxMDAKKyNkZWZpbmUgVUFDX1RFUk1JTkFMX1NUUkVBTUlORwkJMHgxMDEKKyNkZWZpbmUgVUFDX1RFUk1JTkFMX1ZFTkRPUl9TUEVDCTB4MUZGCisKKy8qIFRlcm1pbmFsIENvbnRyb2wgU2VsZWN0b3JzICovCisvKiA0LjMuMiAgQ2xhc3MtU3BlY2lmaWMgQUMgSW50ZXJmYWNlIERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1YWMxX2FjX2hlYWRlcl9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOwkJCS8qIDggKyBuICovCisJX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJLyogVVNCX0RUX0NTX0lOVEVSRkFDRSAqLworCV9fdTggIGJEZXNjcmlwdG9yU3VidHlwZTsJLyogVUFDX01TX0hFQURFUiAqLworCV9fbGUxNiBiY2RBREM7CQkJLyogMHgwMTAwICovCisJX19sZTE2IHdUb3RhbExlbmd0aDsJCS8qIGluY2x1ZGVzIFVuaXQgYW5kIFRlcm1pbmFsIGRlc2MuICovCisJX191OCAgYkluQ29sbGVjdGlvbjsJCS8qIG4gKi8KKwlfX3U4ICBiYUludGVyZmFjZU5yW107CQkvKiBbbl0gKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFVBQ19EVF9BQ19IRUFERVJfU0laRShuKQkoOCArIChuKSkKKworLyogQXMgYWJvdmUsIGJ1dCBtb3JlIHVzZWZ1bCBmb3IgZGVmaW5pbmcgeW91ciBvd24gZGVzY3JpcHRvcnM6ICovCisjZGVmaW5lIERFQ0xBUkVfVUFDX0FDX0hFQURFUl9ERVNDUklQVE9SKG4pCQkJXAorc3RydWN0IHVhYzFfYWNfaGVhZGVyX2Rlc2NyaXB0b3JfIyNuIHsJCQlcCisJX191OCAgYkxlbmd0aDsJCQkJCQlcCisJX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yU3VidHlwZTsJCQkJXAorCV9fbGUxNiBiY2RBREM7CQkJCQkJXAorCV9fbGUxNiB3VG90YWxMZW5ndGg7CQkJCQlcCisJX191OCAgYkluQ29sbGVjdGlvbjsJCQkJCVwKKwlfX3U4ICBiYUludGVyZmFjZU5yW25dOwkJCQkJXAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKworLyogNC4zLjIuMSBJbnB1dCBUZXJtaW5hbCBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdWFjX2lucHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CQkJLyogaW4gYnl0ZXM6IDEyICovCisJX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJLyogQ1NfSU5URVJGQUNFIGRlc2NyaXB0b3IgdHlwZSAqLworCV9fdTggIGJEZXNjcmlwdG9yU3VidHlwZTsJLyogSU5QVVRfVEVSTUlOQUwgZGVzY3JpcHRvciBzdWJ0eXBlICovCisJX191OCAgYlRlcm1pbmFsSUQ7CQkvKiBDb25zdGFudCB1bmlxdWVseSB0ZXJtaW5hbCBJRCAqLworCV9fbGUxNiB3VGVybWluYWxUeXBlOwkJLyogVVNCIEF1ZGlvIFRlcm1pbmFsIFR5cGVzICovCisJX191OCAgYkFzc29jVGVybWluYWw7CQkvKiBJRCBvZiB0aGUgT3V0cHV0IFRlcm1pbmFsIGFzc29jaWF0ZWQgKi8KKwlfX3U4ICBiTnJDaGFubmVsczsJCS8qIE51bWJlciBvZiBsb2dpY2FsIG91dHB1dCBjaGFubmVscyAqLworCV9fbGUxNiB3Q2hhbm5lbENvbmZpZzsKKwlfX3U4ICBpQ2hhbm5lbE5hbWVzOworCV9fdTggIGlUZXJtaW5hbDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFVBQ19EVF9JTlBVVF9URVJNSU5BTF9TSVpFCQkJMTIKKworLyogVGVybWluYWxzIC0gMi4yIElucHV0IFRlcm1pbmFsIFR5cGVzICovCisjZGVmaW5lIFVBQ19JTlBVVF9URVJNSU5BTF9VTkRFRklORUQJCQkweDIwMAorI2RlZmluZSBVQUNfSU5QVVRfVEVSTUlOQUxfTUlDUk9QSE9ORQkJCTB4MjAxCisjZGVmaW5lIFVBQ19JTlBVVF9URVJNSU5BTF9ERVNLVE9QX01JQ1JPUEhPTkUJCTB4MjAyCisjZGVmaW5lIFVBQ19JTlBVVF9URVJNSU5BTF9QRVJTT05BTF9NSUNST1BIT05FCQkweDIwMworI2RlZmluZSBVQUNfSU5QVVRfVEVSTUlOQUxfT01OSV9ESVJfTUlDUk9QSE9ORQkJMHgyMDQKKyNkZWZpbmUgVUFDX0lOUFVUX1RFUk1JTkFMX01JQ1JPUEhPTkVfQVJSQVkJCTB4MjA1CisjZGVmaW5lIFVBQ19JTlBVVF9URVJNSU5BTF9QUk9DX01JQ1JPUEhPTkVfQVJSQVkJMHgyMDYKKworLyogVGVybWluYWxzIC0gY29udHJvbCBzZWxlY3RvcnMgKi8KKworI2RlZmluZSBVQUNfVEVSTUlOQUxfQ1NfQ09QWV9QUk9URUNUX0NPTlRST0wJCTB4MDEKKworLyogNC4zLjIuMiBPdXRwdXQgVGVybWluYWwgRGVzY3JpcHRvciAqLworc3RydWN0IHVhYzFfb3V0cHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CQkJLyogaW4gYnl0ZXM6IDkgKi8KKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkvKiBDU19JTlRFUkZBQ0UgZGVzY3JpcHRvciB0eXBlICovCisJX191OCAgYkRlc2NyaXB0b3JTdWJ0eXBlOwkvKiBPVVRQVVRfVEVSTUlOQUwgZGVzY3JpcHRvciBzdWJ0eXBlICovCisJX191OCAgYlRlcm1pbmFsSUQ7CQkvKiBDb25zdGFudCB1bmlxdWVseSB0ZXJtaW5hbCBJRCAqLworCV9fbGUxNiB3VGVybWluYWxUeXBlOwkJLyogVVNCIEF1ZGlvIFRlcm1pbmFsIFR5cGVzICovCisJX191OCAgYkFzc29jVGVybWluYWw7CQkvKiBJRCBvZiB0aGUgSW5wdXQgVGVybWluYWwgYXNzb2NpYXRlZCAqLworCV9fdTggIGJTb3VyY2VJRDsJCS8qIElEIG9mIHRoZSBjb25uZWN0ZWQgVW5pdCBvciBUZXJtaW5hbCovCisJX191OCAgaVRlcm1pbmFsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVUFDX0RUX09VVFBVVF9URVJNSU5BTF9TSVpFCQkJOQorCisvKiBUZXJtaW5hbHMgLSAyLjMgT3V0cHV0IFRlcm1pbmFsIFR5cGVzICovCisjZGVmaW5lIFVBQ19PVVRQVVRfVEVSTUlOQUxfVU5ERUZJTkVECQkJMHgzMDAKKyNkZWZpbmUgVUFDX09VVFBVVF9URVJNSU5BTF9TUEVBS0VSCQkJMHgzMDEKKyNkZWZpbmUgVUFDX09VVFBVVF9URVJNSU5BTF9IRUFEUEhPTkVTCQkJMHgzMDIKKyNkZWZpbmUgVUFDX09VVFBVVF9URVJNSU5BTF9IRUFEX01PVU5URURfRElTUExBWV9BVURJTwkweDMwMworI2RlZmluZSBVQUNfT1VUUFVUX1RFUk1JTkFMX0RFU0tUT1BfU1BFQUtFUgkJMHgzMDQKKyNkZWZpbmUgVUFDX09VVFBVVF9URVJNSU5BTF9ST09NX1NQRUFLRVIJCTB4MzA1CisjZGVmaW5lIFVBQ19PVVRQVVRfVEVSTUlOQUxfQ09NTVVOSUNBVElPTl9TUEVBS0VSCTB4MzA2CisjZGVmaW5lIFVBQ19PVVRQVVRfVEVSTUlOQUxfTE9XX0ZSRVFfRUZGRUNUU19TUEVBS0VSCTB4MzA3CisKKy8qIFNldCBiQ29udHJvbFNpemUgPSAyIGFzIGRlZmF1bHQgc2V0dGluZyAqLworI2RlZmluZSBVQUNfRFRfRkVBVFVSRV9VTklUX1NJWkUoY2gpCQkoNyArICgoY2gpICsgMSkgKiAyKQorCisvKiBBcyBhYm92ZSwgYnV0IG1vcmUgdXNlZnVsIGZvciBkZWZpbmluZyB5b3VyIG93biBkZXNjcmlwdG9yczogKi8KKyNkZWZpbmUgREVDTEFSRV9VQUNfRkVBVFVSRV9VTklUX0RFU0NSSVBUT1IoY2gpCQkJXAorc3RydWN0IHVhY19mZWF0dXJlX3VuaXRfZGVzY3JpcHRvcl8jI2NoIHsJCQlcCisJX191OCAgYkxlbmd0aDsJCQkJCQlcCisJX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yU3VidHlwZTsJCQkJXAorCV9fdTggIGJVbml0SUQ7CQkJCQkJXAorCV9fdTggIGJTb3VyY2VJRDsJCQkJCVwKKwlfX3U4ICBiQ29udHJvbFNpemU7CQkJCQlcCisJX19sZTE2IGJtYUNvbnRyb2xzW2NoICsgMV07CQkJCVwKKwlfX3U4ICBpRmVhdHVyZTsJCQkJCQlcCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQorCisvKiA0LjMuMi4zIE1peGVyIFVuaXQgRGVzY3JpcHRvciAqLworc3RydWN0IHVhY19taXhlcl91bml0X2Rlc2NyaXB0b3IgeworCV9fdTggYkxlbmd0aDsKKwlfX3U4IGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4IGJEZXNjcmlwdG9yU3VidHlwZTsKKwlfX3U4IGJVbml0SUQ7CisJX191OCBiTnJJblBpbnM7CisJX191OCBiYVNvdXJjZUlEW107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RhdGljIF9faW5saW5lX18gX191OCB1YWNfbWl4ZXJfdW5pdF9iTnJDaGFubmVscyhzdHJ1Y3QgdWFjX21peGVyX3VuaXRfZGVzY3JpcHRvciAqZGVzYykKK3sKKwlyZXR1cm4gZGVzYy0+YmFTb3VyY2VJRFtkZXNjLT5iTnJJblBpbnNdOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX3UzMiB1YWNfbWl4ZXJfdW5pdF93Q2hhbm5lbENvbmZpZyhzdHJ1Y3QgdWFjX21peGVyX3VuaXRfZGVzY3JpcHRvciAqZGVzYywKKwkJCQkJCSAgaW50IHByb3RvY29sKQoreworCWlmIChwcm90b2NvbCA9PSBVQUNfVkVSU0lPTl8xKQorCQlyZXR1cm4gKGRlc2MtPmJhU291cmNlSURbZGVzYy0+Yk5ySW5QaW5zICsgMl0gPDwgOCkgfAorCQkJZGVzYy0+YmFTb3VyY2VJRFtkZXNjLT5iTnJJblBpbnMgKyAxXTsKKwllbHNlCisJCXJldHVybiAgKGRlc2MtPmJhU291cmNlSURbZGVzYy0+Yk5ySW5QaW5zICsgNF0gPDwgMjQpIHwKKwkJCShkZXNjLT5iYVNvdXJjZUlEW2Rlc2MtPmJOckluUGlucyArIDNdIDw8IDE2KSB8CisJCQkoZGVzYy0+YmFTb3VyY2VJRFtkZXNjLT5iTnJJblBpbnMgKyAyXSA8PCA4KSAgfAorCQkJKGRlc2MtPmJhU291cmNlSURbZGVzYy0+Yk5ySW5QaW5zICsgMV0pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX3U4IHVhY19taXhlcl91bml0X2lDaGFubmVsTmFtZXMoc3RydWN0IHVhY19taXhlcl91bml0X2Rlc2NyaXB0b3IgKmRlc2MsCisJCQkJCQlpbnQgcHJvdG9jb2wpCit7CisJcmV0dXJuIChwcm90b2NvbCA9PSBVQUNfVkVSU0lPTl8xKSA/CisJCWRlc2MtPmJhU291cmNlSURbZGVzYy0+Yk5ySW5QaW5zICsgM10gOgorCQlkZXNjLT5iYVNvdXJjZUlEW2Rlc2MtPmJOckluUGlucyArIDVdOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX3U4ICp1YWNfbWl4ZXJfdW5pdF9ibUNvbnRyb2xzKHN0cnVjdCB1YWNfbWl4ZXJfdW5pdF9kZXNjcmlwdG9yICpkZXNjLAorCQkJCQkgICAgICBpbnQgcHJvdG9jb2wpCit7CisJcmV0dXJuIChwcm90b2NvbCA9PSBVQUNfVkVSU0lPTl8xKSA/CisJCSZkZXNjLT5iYVNvdXJjZUlEW2Rlc2MtPmJOckluUGlucyArIDRdIDoKKwkJJmRlc2MtPmJhU291cmNlSURbZGVzYy0+Yk5ySW5QaW5zICsgNl07Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTggdWFjX21peGVyX3VuaXRfaU1peGVyKHN0cnVjdCB1YWNfbWl4ZXJfdW5pdF9kZXNjcmlwdG9yICpkZXNjKQoreworCV9fdTggKnJhdyA9IChfX3U4ICopIGRlc2M7CisJcmV0dXJuIHJhd1tkZXNjLT5iTGVuZ3RoIC0gMV07Cit9CisKKy8qIDQuMy4yLjQgU2VsZWN0b3IgVW5pdCBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdWFjX3NlbGVjdG9yX3VuaXRfZGVzY3JpcHRvciB7CisJX191OCBiTGVuZ3RoOworCV9fdTggYkRlc2NyaXB0b3JUeXBlOworCV9fdTggYkRlc2NyaXB0b3JTdWJ0eXBlOworCV9fdTggYlVpbnRJRDsKKwlfX3U4IGJOckluUGluczsKKwlfX3U4IGJhU291cmNlSURbXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgX19pbmxpbmVfXyBfX3U4IHVhY19zZWxlY3Rvcl91bml0X2lTZWxlY3RvcihzdHJ1Y3QgdWFjX3NlbGVjdG9yX3VuaXRfZGVzY3JpcHRvciAqZGVzYykKK3sKKwlfX3U4ICpyYXcgPSAoX191OCAqKSBkZXNjOworCXJldHVybiByYXdbZGVzYy0+Ykxlbmd0aCAtIDFdOworfQorCisvKiA0LjMuMi41IEZlYXR1cmUgVW5pdCBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdWFjX2ZlYXR1cmVfdW5pdF9kZXNjcmlwdG9yIHsKKwlfX3U4IGJMZW5ndGg7CisJX191OCBiRGVzY3JpcHRvclR5cGU7CisJX191OCBiRGVzY3JpcHRvclN1YnR5cGU7CisJX191OCBiVW5pdElEOworCV9fdTggYlNvdXJjZUlEOworCV9fdTggYkNvbnRyb2xTaXplOworCV9fdTggYm1hQ29udHJvbHNbMF07IC8qIHZhcmlhYmxlIGxlbmd0aCAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RhdGljIF9faW5saW5lX18gX191OCB1YWNfZmVhdHVyZV91bml0X2lGZWF0dXJlKHN0cnVjdCB1YWNfZmVhdHVyZV91bml0X2Rlc2NyaXB0b3IgKmRlc2MpCit7CisJX191OCAqcmF3ID0gKF9fdTggKikgZGVzYzsKKwlyZXR1cm4gcmF3W2Rlc2MtPmJMZW5ndGggLSAxXTsKK30KKworLyogNC4zLjIuNiBQcm9jZXNzaW5nIFVuaXQgRGVzY3JpcHRvcnMgKi8KK3N0cnVjdCB1YWNfcHJvY2Vzc2luZ191bml0X2Rlc2NyaXB0b3IgeworCV9fdTggYkxlbmd0aDsKKwlfX3U4IGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4IGJEZXNjcmlwdG9yU3VidHlwZTsKKwlfX3U4IGJVbml0SUQ7CisJX191MTYgd1Byb2Nlc3NUeXBlOworCV9fdTggYk5ySW5QaW5zOworCV9fdTggYmFTb3VyY2VJRFtdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTggdWFjX3Byb2Nlc3NpbmdfdW5pdF9iTnJDaGFubmVscyhzdHJ1Y3QgdWFjX3Byb2Nlc3NpbmdfdW5pdF9kZXNjcmlwdG9yICpkZXNjKQoreworCXJldHVybiBkZXNjLT5iYVNvdXJjZUlEW2Rlc2MtPmJOckluUGluc107Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTMyIHVhY19wcm9jZXNzaW5nX3VuaXRfd0NoYW5uZWxDb25maWcoc3RydWN0IHVhY19wcm9jZXNzaW5nX3VuaXRfZGVzY3JpcHRvciAqZGVzYywKKwkJCQkJCSAgICAgICBpbnQgcHJvdG9jb2wpCit7CisJaWYgKHByb3RvY29sID09IFVBQ19WRVJTSU9OXzEpCisJCXJldHVybiAoZGVzYy0+YmFTb3VyY2VJRFtkZXNjLT5iTnJJblBpbnMgKyAyXSA8PCA4KSB8CisJCQlkZXNjLT5iYVNvdXJjZUlEW2Rlc2MtPmJOckluUGlucyArIDFdOworCWVsc2UKKwkJcmV0dXJuICAoZGVzYy0+YmFTb3VyY2VJRFtkZXNjLT5iTnJJblBpbnMgKyA0XSA8PCAyNCkgfAorCQkJKGRlc2MtPmJhU291cmNlSURbZGVzYy0+Yk5ySW5QaW5zICsgM10gPDwgMTYpIHwKKwkJCShkZXNjLT5iYVNvdXJjZUlEW2Rlc2MtPmJOckluUGlucyArIDJdIDw8IDgpICB8CisJCQkoZGVzYy0+YmFTb3VyY2VJRFtkZXNjLT5iTnJJblBpbnMgKyAxXSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTggdWFjX3Byb2Nlc3NpbmdfdW5pdF9pQ2hhbm5lbE5hbWVzKHN0cnVjdCB1YWNfcHJvY2Vzc2luZ191bml0X2Rlc2NyaXB0b3IgKmRlc2MsCisJCQkJCQkgICAgIGludCBwcm90b2NvbCkKK3sKKwlyZXR1cm4gKHByb3RvY29sID09IFVBQ19WRVJTSU9OXzEpID8KKwkJZGVzYy0+YmFTb3VyY2VJRFtkZXNjLT5iTnJJblBpbnMgKyAzXSA6CisJCWRlc2MtPmJhU291cmNlSURbZGVzYy0+Yk5ySW5QaW5zICsgNV07Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTggdWFjX3Byb2Nlc3NpbmdfdW5pdF9iQ29udHJvbFNpemUoc3RydWN0IHVhY19wcm9jZXNzaW5nX3VuaXRfZGVzY3JpcHRvciAqZGVzYywKKwkJCQkJCSAgICBpbnQgcHJvdG9jb2wpCit7CisJcmV0dXJuIChwcm90b2NvbCA9PSBVQUNfVkVSU0lPTl8xKSA/CisJCWRlc2MtPmJhU291cmNlSURbZGVzYy0+Yk5ySW5QaW5zICsgNF0gOgorCQlkZXNjLT5iYVNvdXJjZUlEW2Rlc2MtPmJOckluUGlucyArIDZdOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX3U4ICp1YWNfcHJvY2Vzc2luZ191bml0X2JtQ29udHJvbHMoc3RydWN0IHVhY19wcm9jZXNzaW5nX3VuaXRfZGVzY3JpcHRvciAqZGVzYywKKwkJCQkJCSAgIGludCBwcm90b2NvbCkKK3sKKwlyZXR1cm4gKHByb3RvY29sID09IFVBQ19WRVJTSU9OXzEpID8KKwkJJmRlc2MtPmJhU291cmNlSURbZGVzYy0+Yk5ySW5QaW5zICsgNV0gOgorCQkmZGVzYy0+YmFTb3VyY2VJRFtkZXNjLT5iTnJJblBpbnMgKyA3XTsKK30KKworc3RhdGljIF9faW5saW5lX18gX191OCB1YWNfcHJvY2Vzc2luZ191bml0X2lQcm9jZXNzaW5nKHN0cnVjdCB1YWNfcHJvY2Vzc2luZ191bml0X2Rlc2NyaXB0b3IgKmRlc2MsCisJCQkJCQkgICBpbnQgcHJvdG9jb2wpCit7CisJX191OCBjb250cm9sX3NpemUgPSB1YWNfcHJvY2Vzc2luZ191bml0X2JDb250cm9sU2l6ZShkZXNjLCBwcm90b2NvbCk7CisJcmV0dXJuIGRlc2MtPmJhU291cmNlSURbZGVzYy0+Yk5ySW5QaW5zICsgY29udHJvbF9zaXplXTsKK30KKworc3RhdGljIF9faW5saW5lX18gX191OCAqdWFjX3Byb2Nlc3NpbmdfdW5pdF9zcGVjaWZpYyhzdHJ1Y3QgdWFjX3Byb2Nlc3NpbmdfdW5pdF9kZXNjcmlwdG9yICpkZXNjLAorCQkJCQkJIGludCBwcm90b2NvbCkKK3sKKwlfX3U4IGNvbnRyb2xfc2l6ZSA9IHVhY19wcm9jZXNzaW5nX3VuaXRfYkNvbnRyb2xTaXplKGRlc2MsIHByb3RvY29sKTsKKwlyZXR1cm4gJmRlc2MtPmJhU291cmNlSURbZGVzYy0+Yk5ySW5QaW5zICsgY29udHJvbF9zaXplICsgMV07Cit9CisKKy8qIDQuNS4yIENsYXNzLVNwZWNpZmljIEFTIEludGVyZmFjZSBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdWFjMV9hc19oZWFkZXJfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsJCQkvKiBpbiBieXRlczogNyAqLworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCS8qIFVTQl9EVF9DU19JTlRFUkZBQ0UgKi8KKwlfX3U4ICBiRGVzY3JpcHRvclN1YnR5cGU7CS8qIEFTX0dFTkVSQUwgKi8KKwlfX3U4ICBiVGVybWluYWxMaW5rOwkJLyogVGVybWluYWwgSUQgb2YgY29ubmVjdGVkIFRlcm1pbmFsICovCisJX191OCAgYkRlbGF5OwkJCS8qIERlbGF5IGludHJvZHVjZWQgYnkgdGhlIGRhdGEgcGF0aCAqLworCV9fbGUxNiB3Rm9ybWF0VGFnOwkJLyogVGhlIEF1ZGlvIERhdGEgRm9ybWF0ICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBVQUNfRFRfQVNfSEVBREVSX1NJWkUJCTcKKworLyogRm9ybWF0cyAtIEEuMS4xIEF1ZGlvIERhdGEgRm9ybWF0IFR5cGUgSSBDb2RlcyAqLworI2RlZmluZSBVQUNfRk9STUFUX1RZUEVfSV9VTkRFRklORUQJMHgwCisjZGVmaW5lIFVBQ19GT1JNQVRfVFlQRV9JX1BDTQkJMHgxCisjZGVmaW5lIFVBQ19GT1JNQVRfVFlQRV9JX1BDTTgJCTB4MgorI2RlZmluZSBVQUNfRk9STUFUX1RZUEVfSV9JRUVFX0ZMT0FUCTB4MworI2RlZmluZSBVQUNfRk9STUFUX1RZUEVfSV9BTEFXCQkweDQKKyNkZWZpbmUgVUFDX0ZPUk1BVF9UWVBFX0lfTVVMQVcJCTB4NQorCitzdHJ1Y3QgdWFjX2Zvcm1hdF90eXBlX2lfY29udGludW91c19kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOwkJCS8qIGluIGJ5dGVzOiA4ICsgKG5zICogMykgKi8KKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkvKiBVU0JfRFRfQ1NfSU5URVJGQUNFICovCisJX191OCAgYkRlc2NyaXB0b3JTdWJ0eXBlOwkvKiBGT1JNQVRfVFlQRSAqLworCV9fdTggIGJGb3JtYXRUeXBlOwkJLyogRk9STUFUX1RZUEVfMSAqLworCV9fdTggIGJOckNoYW5uZWxzOwkJLyogcGh5c2ljYWwgY2hhbm5lbHMgaW4gdGhlIHN0cmVhbSAqLworCV9fdTggIGJTdWJmcmFtZVNpemU7CQkvKiAqLworCV9fdTggIGJCaXRSZXNvbHV0aW9uOworCV9fdTggIGJTYW1GcmVxVHlwZTsKKwlfX3U4ICB0TG93ZXJTYW1GcmVxWzNdOworCV9fdTggIHRVcHBlclNhbUZyZXFbM107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBVQUNfRk9STUFUX1RZUEVfSV9DT05USU5VT1VTX0RFU0NfU0laRQkxNAorCitzdHJ1Y3QgdWFjX2Zvcm1hdF90eXBlX2lfZGlzY3JldGVfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsJCQkvKiBpbiBieXRlczogOCArIChucyAqIDMpICovCisJX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJLyogVVNCX0RUX0NTX0lOVEVSRkFDRSAqLworCV9fdTggIGJEZXNjcmlwdG9yU3VidHlwZTsJLyogRk9STUFUX1RZUEUgKi8KKwlfX3U4ICBiRm9ybWF0VHlwZTsJCS8qIEZPUk1BVF9UWVBFXzEgKi8KKwlfX3U4ICBiTnJDaGFubmVsczsJCS8qIHBoeXNpY2FsIGNoYW5uZWxzIGluIHRoZSBzdHJlYW0gKi8KKwlfX3U4ICBiU3ViZnJhbWVTaXplOwkJLyogKi8KKwlfX3U4ICBiQml0UmVzb2x1dGlvbjsKKwlfX3U4ICBiU2FtRnJlcVR5cGU7CisJX191OCAgdFNhbUZyZXFbXVszXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIERFQ0xBUkVfVUFDX0ZPUk1BVF9UWVBFX0lfRElTQ1JFVEVfREVTQyhuKQkJXAorc3RydWN0IHVhY19mb3JtYXRfdHlwZV9pX2Rpc2NyZXRlX2Rlc2NyaXB0b3JfIyNuIHsJCVwKKwlfX3U4ICBiTGVuZ3RoOwkJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkJCQlcCisJX191OCAgYkRlc2NyaXB0b3JTdWJ0eXBlOwkJCQlcCisJX191OCAgYkZvcm1hdFR5cGU7CQkJCQlcCisJX191OCAgYk5yQ2hhbm5lbHM7CQkJCQlcCisJX191OCAgYlN1YmZyYW1lU2l6ZTsJCQkJCVwKKwlfX3U4ICBiQml0UmVzb2x1dGlvbjsJCQkJCVwKKwlfX3U4ICBiU2FtRnJlcVR5cGU7CQkJCQlcCisJX191OCAgdFNhbUZyZXFbbl1bM107CQkJCQlcCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQorCisjZGVmaW5lIFVBQ19GT1JNQVRfVFlQRV9JX0RJU0NSRVRFX0RFU0NfU0laRShuKQkoOCArIChuICogMykpCisKK3N0cnVjdCB1YWNfZm9ybWF0X3R5cGVfaV9leHRfZGVzY3JpcHRvciB7CisJX191OCBiTGVuZ3RoOworCV9fdTggYkRlc2NyaXB0b3JUeXBlOworCV9fdTggYkRlc2NyaXB0b3JTdWJ0eXBlOworCV9fdTggYkZvcm1hdFR5cGU7CisJX191OCBiU3Vic2xvdFNpemU7CisJX191OCBiQml0UmVzb2x1dGlvbjsKKwlfX3U4IGJIZWFkZXJMZW5ndGg7CisJX191OCBiQ29udHJvbFNpemU7CisJX191OCBiU2lkZUJhbmRQcm90b2NvbDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIEZvcm1hdHMgLSBBdWRpbyBEYXRhIEZvcm1hdCBUeXBlIEkgQ29kZXMgKi8KKworI2RlZmluZSBVQUNfRk9STUFUX1RZUEVfSUlfTVBFRwkweDEwMDEKKyNkZWZpbmUgVUFDX0ZPUk1BVF9UWVBFX0lJX0FDMwkweDEwMDIKKworc3RydWN0IHVhY19mb3JtYXRfdHlwZV9paV9kaXNjcmV0ZV9kZXNjcmlwdG9yIHsKKwlfX3U4IGJMZW5ndGg7CisJX191OCBiRGVzY3JpcHRvclR5cGU7CisJX191OCBiRGVzY3JpcHRvclN1YnR5cGU7CisJX191OCBiRm9ybWF0VHlwZTsKKwlfX2xlMTYgd01heEJpdFJhdGU7CisJX19sZTE2IHdTYW1wbGVzUGVyRnJhbWU7CisJX191OCBiU2FtRnJlcVR5cGU7CisJX191OCB0U2FtRnJlcVtdWzNdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHVhY19mb3JtYXRfdHlwZV9paV9leHRfZGVzY3JpcHRvciB7CisJX191OCBiTGVuZ3RoOworCV9fdTggYkRlc2NyaXB0b3JUeXBlOworCV9fdTggYkRlc2NyaXB0b3JTdWJ0eXBlOworCV9fdTggYkZvcm1hdFR5cGU7CisJX191MTYgd01heEJpdFJhdGU7CisJX191MTYgd1NhbXBsZXNQZXJGcmFtZTsKKwlfX3U4IGJIZWFkZXJMZW5ndGg7CisJX191OCBiU2lkZUJhbmRQcm90b2NvbDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIHR5cGUgSUlJICovCisjZGVmaW5lIFVBQ19GT1JNQVRfVFlQRV9JSUlfSUVDMTkzN19BQzMJMHgyMDAxCisjZGVmaW5lIFVBQ19GT1JNQVRfVFlQRV9JSUlfSUVDMTkzN19NUEVHMV9MQVlFUjEJMHgyMDAyCisjZGVmaW5lIFVBQ19GT1JNQVRfVFlQRV9JSUlfSUVDMTkzN19NUEVHMl9OT0VYVAkweDIwMDMKKyNkZWZpbmUgVUFDX0ZPUk1BVF9UWVBFX0lJSV9JRUMxOTM3X01QRUcyX0VYVAkweDIwMDQKKyNkZWZpbmUgVUFDX0ZPUk1BVF9UWVBFX0lJSV9JRUMxOTM3X01QRUcyX0xBWUVSMV9MUwkweDIwMDUKKyNkZWZpbmUgVUFDX0ZPUk1BVF9UWVBFX0lJSV9JRUMxOTM3X01QRUcyX0xBWUVSMjNfTFMJMHgyMDA2CisKKy8qIEZvcm1hdHMgLSBBLjIgRm9ybWF0IFR5cGUgQ29kZXMgKi8KKyNkZWZpbmUgVUFDX0ZPUk1BVF9UWVBFX1VOREVGSU5FRAkweDAKKyNkZWZpbmUgVUFDX0ZPUk1BVF9UWVBFX0kJCTB4MQorI2RlZmluZSBVQUNfRk9STUFUX1RZUEVfSUkJCTB4MgorI2RlZmluZSBVQUNfRk9STUFUX1RZUEVfSUlJCQkweDMKKyNkZWZpbmUgVUFDX0VYVF9GT1JNQVRfVFlQRV9JCQkweDgxCisjZGVmaW5lIFVBQ19FWFRfRk9STUFUX1RZUEVfSUkJCTB4ODIKKyNkZWZpbmUgVUFDX0VYVF9GT1JNQVRfVFlQRV9JSUkJCTB4ODMKKworc3RydWN0IHVhY19pc29fZW5kcG9pbnRfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsJCQkvKiBpbiBieXRlczogNyAqLworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCS8qIFVTQl9EVF9DU19FTkRQT0lOVCAqLworCV9fdTggIGJEZXNjcmlwdG9yU3VidHlwZTsJLyogRVBfR0VORVJBTCAqLworCV9fdTggIGJtQXR0cmlidXRlczsKKwlfX3U4ICBiTG9ja0RlbGF5VW5pdHM7CisJX19sZTE2IHdMb2NrRGVsYXk7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworI2RlZmluZSBVQUNfSVNPX0VORFBPSU5UX0RFU0NfU0laRQk3CisKKyNkZWZpbmUgVUFDX0VQX0NTX0FUVFJfU0FNUExFX1JBVEUJMHgwMQorI2RlZmluZSBVQUNfRVBfQ1NfQVRUUl9QSVRDSF9DT05UUk9MCTB4MDIKKyNkZWZpbmUgVUFDX0VQX0NTX0FUVFJfRklMTF9NQVgJCTB4ODAKKworLyogc3RhdHVzIHdvcmQgZm9ybWF0ICgzLjcuMS4xKSAqLworCisjZGVmaW5lIFVBQzFfU1RBVFVTX1RZUEVfT1JJR19NQVNLCQkweDBmCisjZGVmaW5lIFVBQzFfU1RBVFVTX1RZUEVfT1JJR19BVURJT19DT05UUk9MX0lGCTB4MAorI2RlZmluZSBVQUMxX1NUQVRVU19UWVBFX09SSUdfQVVESU9fU1RSRUFNX0lGCTB4MQorI2RlZmluZSBVQUMxX1NUQVRVU19UWVBFX09SSUdfQVVESU9fU1RSRUFNX0VQCTB4MgorCisjZGVmaW5lIFVBQzFfU1RBVFVTX1RZUEVfSVJRX1BFTkRJTkcJCSgxIDw8IDcpCisjZGVmaW5lIFVBQzFfU1RBVFVTX1RZUEVfTUVNX0NIQU5HRUQJCSgxIDw8IDYpCisKK3N0cnVjdCB1YWMxX3N0YXR1c193b3JkIHsKKwlfX3U4IGJTdGF0dXNUeXBlOworCV9fdTggYk9yaWdpbmF0b3I7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9BVURJT19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYi9jZGMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2NkYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYTkyNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYi9jZGMuaApAQCAtMCwwICsxLDQxMiBAQAorLyoKKyAqIFVTQiBDb21tdW5pY2F0aW9ucyBEZXZpY2UgQ2xhc3MgKENEQykgZGVmaW5pdGlvbnMKKyAqCisgKiBDREMgc2F5cyBob3cgdG8gdGFsayB0byBsb3RzIG9mIGRpZmZlcmVudCB0eXBlcyBvZiBuZXR3b3JrIGFkYXB0ZXJzLAorICogbm90YWJseSBldGhlcm5ldCBhZGFwdGVycyBhbmQgdmFyaW91cyBtb2RlbXMuICBJdCdzIHVzZWQgbW9zdGx5IHdpdGgKKyAqIGZpcm13YXJlIGJhc2VkIFVTQiBwZXJpcGhlcmFscy4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfVVNCX0NEQ19ICisjZGVmaW5lIF9fTElOVVhfVVNCX0NEQ19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFVTQl9DRENfU1VCQ0xBU1NfQUNNCQkJMHgwMgorI2RlZmluZSBVU0JfQ0RDX1NVQkNMQVNTX0VUSEVSTkVUCQkweDA2CisjZGVmaW5lIFVTQl9DRENfU1VCQ0xBU1NfV0hDTQkJCTB4MDgKKyNkZWZpbmUgVVNCX0NEQ19TVUJDTEFTU19ETU0JCQkweDA5CisjZGVmaW5lIFVTQl9DRENfU1VCQ0xBU1NfTURMTQkJCTB4MGEKKyNkZWZpbmUgVVNCX0NEQ19TVUJDTEFTU19PQkVYCQkJMHgwYgorI2RlZmluZSBVU0JfQ0RDX1NVQkNMQVNTX0VFTQkJCTB4MGMKKyNkZWZpbmUgVVNCX0NEQ19TVUJDTEFTU19OQ00JCQkweDBkCisKKyNkZWZpbmUgVVNCX0NEQ19QUk9UT19OT05FCQkJMAorCisjZGVmaW5lIFVTQl9DRENfQUNNX1BST1RPX0FUX1YyNVRFUgkJMQorI2RlZmluZSBVU0JfQ0RDX0FDTV9QUk9UT19BVF9QQ0NBMTAxCQkyCisjZGVmaW5lIFVTQl9DRENfQUNNX1BST1RPX0FUX1BDQ0ExMDFfV0FLRQkzCisjZGVmaW5lIFVTQl9DRENfQUNNX1BST1RPX0FUX0dTTQkJNAorI2RlZmluZSBVU0JfQ0RDX0FDTV9QUk9UT19BVF8zRwkJCTUKKyNkZWZpbmUgVVNCX0NEQ19BQ01fUFJPVE9fQVRfQ0RNQQkJNgorI2RlZmluZSBVU0JfQ0RDX0FDTV9QUk9UT19WRU5ET1IJCTB4ZmYKKworI2RlZmluZSBVU0JfQ0RDX1BST1RPX0VFTQkJCTcKKworI2RlZmluZSBVU0JfQ0RDX05DTV9QUk9UT19OVEIJCQkxCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBDbGFzcy1TcGVjaWZpYyBkZXNjcmlwdG9ycyAuLi4gdGhlcmUgYXJlIGEgY291cGxlIGRvemVuIG9mIHRoZW0KKyAqLworCisjZGVmaW5lIFVTQl9DRENfSEVBREVSX1RZUEUJCTB4MDAJLyogaGVhZGVyX2Rlc2MgKi8KKyNkZWZpbmUgVVNCX0NEQ19DQUxMX01BTkFHRU1FTlRfVFlQRQkweDAxCS8qIGNhbGxfbWdtdF9kZXNjcmlwdG9yICovCisjZGVmaW5lIFVTQl9DRENfQUNNX1RZUEUJCTB4MDIJLyogYWNtX2Rlc2NyaXB0b3IgKi8KKyNkZWZpbmUgVVNCX0NEQ19VTklPTl9UWVBFCQkweDA2CS8qIHVuaW9uX2Rlc2MgKi8KKyNkZWZpbmUgVVNCX0NEQ19DT1VOVFJZX1RZUEUJCTB4MDcKKyNkZWZpbmUgVVNCX0NEQ19ORVRXT1JLX1RFUk1JTkFMX1RZUEUJMHgwYQkvKiBuZXR3b3JrX3Rlcm1pbmFsX2Rlc2MgKi8KKyNkZWZpbmUgVVNCX0NEQ19FVEhFUk5FVF9UWVBFCQkweDBmCS8qIGV0aGVyX2Rlc2MgKi8KKyNkZWZpbmUgVVNCX0NEQ19XSENNX1RZUEUJCTB4MTEKKyNkZWZpbmUgVVNCX0NEQ19NRExNX1RZUEUJCTB4MTIJLyogbWRsbV9kZXNjICovCisjZGVmaW5lIFVTQl9DRENfTURMTV9ERVRBSUxfVFlQRQkweDEzCS8qIG1kbG1fZGV0YWlsX2Rlc2MgKi8KKyNkZWZpbmUgVVNCX0NEQ19ETU1fVFlQRQkJMHgxNAorI2RlZmluZSBVU0JfQ0RDX09CRVhfVFlQRQkJMHgxNQorI2RlZmluZSBVU0JfQ0RDX05DTV9UWVBFCQkweDFhCisKKy8qICJIZWFkZXIgRnVuY3Rpb25hbCBEZXNjcmlwdG9yIiBmcm9tIENEQyBzcGVjICA1LjIuMy4xICovCitzdHJ1Y3QgdXNiX2NkY19oZWFkZXJfZGVzYyB7CisJX191OAliTGVuZ3RoOworCV9fdTgJYkRlc2NyaXB0b3JUeXBlOworCV9fdTgJYkRlc2NyaXB0b3JTdWJUeXBlOworCisJX19sZTE2CWJjZENEQzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiAiQ2FsbCBNYW5hZ2VtZW50IERlc2NyaXB0b3IiIGZyb20gQ0RDIHNwZWMgIDUuMi4zLjIgKi8KK3N0cnVjdCB1c2JfY2RjX2NhbGxfbWdtdF9kZXNjcmlwdG9yIHsKKwlfX3U4CWJMZW5ndGg7CisJX191OAliRGVzY3JpcHRvclR5cGU7CisJX191OAliRGVzY3JpcHRvclN1YlR5cGU7CisKKwlfX3U4CWJtQ2FwYWJpbGl0aWVzOworI2RlZmluZSBVU0JfQ0RDX0NBTExfTUdNVF9DQVBfQ0FMTF9NR01UCQkweDAxCisjZGVmaW5lIFVTQl9DRENfQ0FMTF9NR01UX0NBUF9EQVRBX0lOVEYJCTB4MDIKKworCV9fdTgJYkRhdGFJbnRlcmZhY2U7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogIkFic3RyYWN0IENvbnRyb2wgTWFuYWdlbWVudCBEZXNjcmlwdG9yIiBmcm9tIENEQyBzcGVjICA1LjIuMy4zICovCitzdHJ1Y3QgdXNiX2NkY19hY21fZGVzY3JpcHRvciB7CisJX191OAliTGVuZ3RoOworCV9fdTgJYkRlc2NyaXB0b3JUeXBlOworCV9fdTgJYkRlc2NyaXB0b3JTdWJUeXBlOworCisJX191OAlibUNhcGFiaWxpdGllczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBjYXBhYmlsaXRpZXMgZnJvbSA1LjIuMy4zICovCisKKyNkZWZpbmUgVVNCX0NEQ19DT01NX0ZFQVRVUkUJMHgwMQorI2RlZmluZSBVU0JfQ0RDX0NBUF9MSU5FCTB4MDIKKyNkZWZpbmUgVVNCX0NEQ19DQVBfQlJLCQkweDA0CisjZGVmaW5lIFVTQl9DRENfQ0FQX05PVElGWQkweDA4CisKKy8qICJVbmlvbiBGdW5jdGlvbmFsIERlc2NyaXB0b3IiIGZyb20gQ0RDIHNwZWMgNS4yLjMuOCAqLworc3RydWN0IHVzYl9jZGNfdW5pb25fZGVzYyB7CisJX191OAliTGVuZ3RoOworCV9fdTgJYkRlc2NyaXB0b3JUeXBlOworCV9fdTgJYkRlc2NyaXB0b3JTdWJUeXBlOworCisJX191OAliTWFzdGVySW50ZXJmYWNlMDsKKwlfX3U4CWJTbGF2ZUludGVyZmFjZTA7CisJLyogLi4uIGFuZCB0aGVyZSBjb3VsZCBiZSBvdGhlciBzbGF2ZSBpbnRlcmZhY2VzICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogIkNvdW50cnkgU2VsZWN0aW9uIEZ1bmN0aW9uYWwgRGVzY3JpcHRvciIgZnJvbSBDREMgc3BlYyA1LjIuMy45ICovCitzdHJ1Y3QgdXNiX2NkY19jb3VudHJ5X2Z1bmN0aW9uYWxfZGVzYyB7CisJX191OAliTGVuZ3RoOworCV9fdTgJYkRlc2NyaXB0b3JUeXBlOworCV9fdTgJYkRlc2NyaXB0b3JTdWJUeXBlOworCisJX191OAlpQ291bnRyeUNvZGVSZWxEYXRlOworCV9fbGUxNgl3Q291bnR5Q29kZTA7CisJLyogLi4uIGFuZCB0aGVyZSBjYW4gYmUgYSBsb3Qgb2YgY291bnRyeSBjb2RlcyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qICJOZXR3b3JrIENoYW5uZWwgVGVybWluYWwgRnVuY3Rpb25hbCBEZXNjcmlwdG9yIiBmcm9tIENEQyBzcGVjIDUuMi4zLjExICovCitzdHJ1Y3QgdXNiX2NkY19uZXR3b3JrX3Rlcm1pbmFsX2Rlc2MgeworCV9fdTgJYkxlbmd0aDsKKwlfX3U4CWJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4CWJEZXNjcmlwdG9yU3ViVHlwZTsKKworCV9fdTgJYkVudGl0eUlkOworCV9fdTgJaU5hbWU7CisJX191OAliQ2hhbm5lbEluZGV4OworCV9fdTgJYlBoeXNpY2FsSW50ZXJmYWNlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qICJFdGhlcm5ldCBOZXR3b3JraW5nIEZ1bmN0aW9uYWwgRGVzY3JpcHRvciIgZnJvbSBDREMgc3BlYyA1LjIuMy4xNiAqLworc3RydWN0IHVzYl9jZGNfZXRoZXJfZGVzYyB7CisJX191OAliTGVuZ3RoOworCV9fdTgJYkRlc2NyaXB0b3JUeXBlOworCV9fdTgJYkRlc2NyaXB0b3JTdWJUeXBlOworCisJX191OAlpTUFDQWRkcmVzczsKKwlfX2xlMzIJYm1FdGhlcm5ldFN0YXRpc3RpY3M7CisJX19sZTE2CXdNYXhTZWdtZW50U2l6ZTsKKwlfX2xlMTYJd051bWJlck1DRmlsdGVyczsKKwlfX3U4CWJOdW1iZXJQb3dlckZpbHRlcnM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogIlRlbGVwaG9uZSBDb250cm9sIE1vZGVsIEZ1bmN0aW9uYWwgRGVzY3JpcHRvciIgZnJvbSBDREMgV01DIHNwZWMgNi4zLi4zICovCitzdHJ1Y3QgdXNiX2NkY19kbW1fZGVzYyB7CisJX191OAliRnVuY3Rpb25MZW5ndGg7CisJX191OAliRGVzY3JpcHRvclR5cGU7CisJX191OAliRGVzY3JpcHRvclN1YnR5cGU7CisJX191MTYJYmNkVmVyc2lvbjsKKwlfX2xlMTYJd01heENvbW1hbmQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogIk1ETE0gRnVuY3Rpb25hbCBEZXNjcmlwdG9yIiBmcm9tIENEQyBXTUMgc3BlYyA2LjcuMi4zICovCitzdHJ1Y3QgdXNiX2NkY19tZGxtX2Rlc2MgeworCV9fdTgJYkxlbmd0aDsKKwlfX3U4CWJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4CWJEZXNjcmlwdG9yU3ViVHlwZTsKKworCV9fbGUxNgliY2RWZXJzaW9uOworCV9fdTgJYkdVSURbMTZdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qICJNRExNIERldGFpbCBGdW5jdGlvbmFsIERlc2NyaXB0b3IiIGZyb20gQ0RDIFdNQyBzcGVjIDYuNy4yLjQgKi8KK3N0cnVjdCB1c2JfY2RjX21kbG1fZGV0YWlsX2Rlc2MgeworCV9fdTgJYkxlbmd0aDsKKwlfX3U4CWJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4CWJEZXNjcmlwdG9yU3ViVHlwZTsKKworCS8qIHR5cGUgaXMgYXNzb2NpYXRlZCB3aXRoIG1kbG1fZGVzYy5iR1VJRCAqLworCV9fdTgJYkd1aWREZXNjcmlwdG9yVHlwZTsKKwlfX3U4CWJEZXRhaWxEYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qICJPQkVYIENvbnRyb2wgTW9kZWwgRnVuY3Rpb25hbCBEZXNjcmlwdG9yIiAqLworc3RydWN0IHVzYl9jZGNfb2JleF9kZXNjIHsKKwlfX3U4CWJMZW5ndGg7CisJX191OAliRGVzY3JpcHRvclR5cGU7CisJX191OAliRGVzY3JpcHRvclN1YlR5cGU7CisKKwlfX2xlMTYJYmNkVmVyc2lvbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiAiTkNNIENvbnRyb2wgTW9kZWwgRnVuY3Rpb25hbCBEZXNjcmlwdG9yIiAqLworc3RydWN0IHVzYl9jZGNfbmNtX2Rlc2MgeworCV9fdTgJYkxlbmd0aDsKKwlfX3U4CWJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4CWJEZXNjcmlwdG9yU3ViVHlwZTsKKworCV9fbGUxNgliY2ROY21WZXJzaW9uOworCV9fdTgJYm1OZXR3b3JrQ2FwYWJpbGl0aWVzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogQ2xhc3MtU3BlY2lmaWMgQ29udHJvbCBSZXF1ZXN0cyAoNi4yKQorICoKKyAqIHNlY3Rpb24gMy42LjIuMSB0YWJsZSA0IGhhcyB0aGUgQUNNIHByb2ZpbGUsIGZvciBtb2RlbXMuCisgKiBzZWN0aW9uIDMuOC4yIHRhYmxlIDEwIGhhcyB0aGUgZXRoZXJuZXQgcHJvZmlsZS4KKyAqCisgKiBNaWNyb3NvZnQncyBSTkRJUyBzdGFjayBmb3IgRXRoZXJuZXQgaXMgYSB2ZW5kb3Itc3BlY2lmaWMgQ0RDIEFDTSB2YXJpYW50LAorICogaGVhdmlseSBkZXBlbmRlbnQgb24gdGhlIGVuY2Fwc3VsYXRlZCAocHJvcHJpZXRhcnkpIGNvbW1hbmQgbWVjaGFuaXNtLgorICovCisKKyNkZWZpbmUgVVNCX0NEQ19TRU5EX0VOQ0FQU1VMQVRFRF9DT01NQU5ECTB4MDAKKyNkZWZpbmUgVVNCX0NEQ19HRVRfRU5DQVBTVUxBVEVEX1JFU1BPTlNFCTB4MDEKKyNkZWZpbmUgVVNCX0NEQ19SRVFfU0VUX0xJTkVfQ09ESU5HCQkweDIwCisjZGVmaW5lIFVTQl9DRENfUkVRX0dFVF9MSU5FX0NPRElORwkJMHgyMQorI2RlZmluZSBVU0JfQ0RDX1JFUV9TRVRfQ09OVFJPTF9MSU5FX1NUQVRFCTB4MjIKKyNkZWZpbmUgVVNCX0NEQ19SRVFfU0VORF9CUkVBSwkJCTB4MjMKKyNkZWZpbmUgVVNCX0NEQ19TRVRfRVRIRVJORVRfTVVMVElDQVNUX0ZJTFRFUlMJMHg0MAorI2RlZmluZSBVU0JfQ0RDX1NFVF9FVEhFUk5FVF9QTV9QQVRURVJOX0ZJTFRFUgkweDQxCisjZGVmaW5lIFVTQl9DRENfR0VUX0VUSEVSTkVUX1BNX1BBVFRFUk5fRklMVEVSCTB4NDIKKyNkZWZpbmUgVVNCX0NEQ19TRVRfRVRIRVJORVRfUEFDS0VUX0ZJTFRFUgkweDQzCisjZGVmaW5lIFVTQl9DRENfR0VUX0VUSEVSTkVUX1NUQVRJU1RJQwkJMHg0NAorI2RlZmluZSBVU0JfQ0RDX0dFVF9OVEJfUEFSQU1FVEVSUwkJMHg4MAorI2RlZmluZSBVU0JfQ0RDX0dFVF9ORVRfQUREUkVTUwkJCTB4ODEKKyNkZWZpbmUgVVNCX0NEQ19TRVRfTkVUX0FERFJFU1MJCQkweDgyCisjZGVmaW5lIFVTQl9DRENfR0VUX05UQl9GT1JNQVQJCQkweDgzCisjZGVmaW5lIFVTQl9DRENfU0VUX05UQl9GT1JNQVQJCQkweDg0CisjZGVmaW5lIFVTQl9DRENfR0VUX05UQl9JTlBVVF9TSVpFCQkweDg1CisjZGVmaW5lIFVTQl9DRENfU0VUX05UQl9JTlBVVF9TSVpFCQkweDg2CisjZGVmaW5lIFVTQl9DRENfR0VUX01BWF9EQVRBR1JBTV9TSVpFCQkweDg3CisjZGVmaW5lIFVTQl9DRENfU0VUX01BWF9EQVRBR1JBTV9TSVpFCQkweDg4CisjZGVmaW5lIFVTQl9DRENfR0VUX0NSQ19NT0RFCQkJMHg4OQorI2RlZmluZSBVU0JfQ0RDX1NFVF9DUkNfTU9ERQkJCTB4OGEKKworLyogTGluZSBDb2RpbmcgU3RydWN0dXJlIGZyb20gQ0RDIHNwZWMgNi4yLjEzICovCitzdHJ1Y3QgdXNiX2NkY19saW5lX2NvZGluZyB7CisJX19sZTMyCWR3RFRFUmF0ZTsKKwlfX3U4CWJDaGFyRm9ybWF0OworI2RlZmluZSBVU0JfQ0RDXzFfU1RPUF9CSVRTCQkJMAorI2RlZmluZSBVU0JfQ0RDXzFfNV9TVE9QX0JJVFMJCQkxCisjZGVmaW5lIFVTQl9DRENfMl9TVE9QX0JJVFMJCQkyCisKKwlfX3U4CWJQYXJpdHlUeXBlOworI2RlZmluZSBVU0JfQ0RDX05PX1BBUklUWQkJCTAKKyNkZWZpbmUgVVNCX0NEQ19PRERfUEFSSVRZCQkJMQorI2RlZmluZSBVU0JfQ0RDX0VWRU5fUEFSSVRZCQkJMgorI2RlZmluZSBVU0JfQ0RDX01BUktfUEFSSVRZCQkJMworI2RlZmluZSBVU0JfQ0RDX1NQQUNFX1BBUklUWQkJCTQKKworCV9fdTgJYkRhdGFCaXRzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIHRhYmxlIDYyOyBiaXRzIGluIG11bHRpY2FzdCBmaWx0ZXIgKi8KKyNkZWZpbmUJVVNCX0NEQ19QQUNLRVRfVFlQRV9QUk9NSVNDVU9VUwkJKDEgPDwgMCkKKyNkZWZpbmUJVVNCX0NEQ19QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUCSgxIDw8IDEpIC8qIG5vIGZpbHRlciAqLworI2RlZmluZQlVU0JfQ0RDX1BBQ0tFVF9UWVBFX0RJUkVDVEVECQkoMSA8PCAyKQorI2RlZmluZQlVU0JfQ0RDX1BBQ0tFVF9UWVBFX0JST0FEQ0FTVAkJKDEgPDwgMykKKyNkZWZpbmUJVVNCX0NEQ19QQUNLRVRfVFlQRV9NVUxUSUNBU1QJCSgxIDw8IDQpIC8qIGZpbHRlcmVkICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIENsYXNzLVNwZWNpZmljIE5vdGlmaWNhdGlvbnMgKDYuMykgc2VudCBieSBpbnRlcnJ1cHQgdHJhbnNmZXJzCisgKgorICogc2VjdGlvbiAzLjguMiB0YWJsZSAxMSBvZiB0aGUgQ0RDIHNwZWMgbGlzdHMgRXRoZXJuZXQgbm90aWZpY2F0aW9ucworICogc2VjdGlvbiAzLjYuMi4xIHRhYmxlIDUgc3BlY2lmaWVzIEFDTSBub3RpZmljYXRpb25zLCBhY2NlcHRlZCBieSBSTkRJUworICogUk5ESVMgYWxzbyBkZWZpbmVzIGl0cyBvd24gYml0LWluY29tcGF0aWJsZSBub3RpZmljYXRpb25zCisgKi8KKworI2RlZmluZSBVU0JfQ0RDX05PVElGWV9ORVRXT1JLX0NPTk5FQ1RJT04JMHgwMAorI2RlZmluZSBVU0JfQ0RDX05PVElGWV9SRVNQT05TRV9BVkFJTEFCTEUJMHgwMQorI2RlZmluZSBVU0JfQ0RDX05PVElGWV9TRVJJQUxfU1RBVEUJCTB4MjAKKyNkZWZpbmUgVVNCX0NEQ19OT1RJRllfU1BFRURfQ0hBTkdFCQkweDJhCisKK3N0cnVjdCB1c2JfY2RjX25vdGlmaWNhdGlvbiB7CisJX191OAlibVJlcXVlc3RUeXBlOworCV9fdTgJYk5vdGlmaWNhdGlvblR5cGU7CisJX19sZTE2CXdWYWx1ZTsKKwlfX2xlMTYJd0luZGV4OworCV9fbGUxNgl3TGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCB1c2JfY2RjX3NwZWVkX2NoYW5nZSB7CisJX19sZTMyCURMQml0UlJhdGU7CS8qIGNvbnRhaW5zIHRoZSBkb3dubGluayBiaXQgcmF0ZSAoSU4gcGlwZSkgKi8KKwlfX2xlMzIJVUxCaXRSYXRlOwkvKiBjb250YWlucyB0aGUgdXBsaW5rIGJpdCByYXRlIChPVVQgcGlwZSkgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogQ2xhc3MgU3BlY2lmaWMgc3RydWN0dXJlcyBhbmQgY29uc3RhbnRzCisgKgorICogQ0RDIE5DTSBOVEIgcGFyYW1ldGVycyBzdHJ1Y3R1cmUsIENEQyBOQ00gc3ViY2xhc3MgNi4yLjEKKyAqCisgKi8KKworc3RydWN0IHVzYl9jZGNfbmNtX250Yl9wYXJhbWV0ZXJzIHsKKwlfX2xlMTYJd0xlbmd0aDsKKwlfX2xlMTYJYm1OdGJGb3JtYXRzU3VwcG9ydGVkOworCV9fbGUzMglkd050YkluTWF4U2l6ZTsKKwlfX2xlMTYJd05kcEluRGl2aXNvcjsKKwlfX2xlMTYJd05kcEluUGF5bG9hZFJlbWFpbmRlcjsKKwlfX2xlMTYJd05kcEluQWxpZ25tZW50OworCV9fbGUxNgl3UGFkZGluZzE7CisJX19sZTMyCWR3TnRiT3V0TWF4U2l6ZTsKKwlfX2xlMTYJd05kcE91dERpdmlzb3I7CisJX19sZTE2CXdOZHBPdXRQYXlsb2FkUmVtYWluZGVyOworCV9fbGUxNgl3TmRwT3V0QWxpZ25tZW50OworCV9fbGUxNgl3TnRiT3V0TWF4RGF0YWdyYW1zOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiBDREMgTkNNIHRyYW5zZmVyIGhlYWRlcnMsIENEQyBOQ00gc3ViY2xhc3MgMy4yCisgKi8KKworI2RlZmluZSBVU0JfQ0RDX05DTV9OVEgxNl9TSUdOCQkweDQ4NEQ0MzRFIC8qIE5DTUggKi8KKyNkZWZpbmUgVVNCX0NEQ19OQ01fTlRIMzJfU0lHTgkJMHg2ODZENjM2RSAvKiBuY21oICovCisKK3N0cnVjdCB1c2JfY2RjX25jbV9udGgxNiB7CisJX19sZTMyCWR3U2lnbmF0dXJlOworCV9fbGUxNgl3SGVhZGVyTGVuZ3RoOworCV9fbGUxNgl3U2VxdWVuY2U7CisJX19sZTE2CXdCbG9ja0xlbmd0aDsKKwlfX2xlMTYJd05kcEluZGV4OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCB1c2JfY2RjX25jbV9udGgzMiB7CisJX19sZTMyCWR3U2lnbmF0dXJlOworCV9fbGUxNgl3SGVhZGVyTGVuZ3RoOworCV9fbGUxNgl3U2VxdWVuY2U7CisJX19sZTMyCWR3QmxvY2tMZW5ndGg7CisJX19sZTMyCWR3TmRwSW5kZXg7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqIENEQyBOQ00gZGF0YWdyYW0gcG9pbnRlcnMsIENEQyBOQ00gc3ViY2xhc3MgMy4zCisgKi8KKworI2RlZmluZSBVU0JfQ0RDX05DTV9ORFAxNl9DUkNfU0lHTgkweDMxNEQ0MzRFIC8qIE5DTTEgKi8KKyNkZWZpbmUgVVNCX0NEQ19OQ01fTkRQMTZfTk9DUkNfU0lHTgkweDMwNEQ0MzRFIC8qIE5DTTAgKi8KKyNkZWZpbmUgVVNCX0NEQ19OQ01fTkRQMzJfQ1JDX1NJR04JMHgzMTZENjM2RSAvKiBuY20xICovCisjZGVmaW5lIFVTQl9DRENfTkNNX05EUDMyX05PQ1JDX1NJR04JMHgzMDZENjM2RSAvKiBuY20wICovCisKKy8qIDE2LWJpdCBOQ00gRGF0YWdyYW0gUG9pbnRlciBFbnRyeSAqLworc3RydWN0IHVzYl9jZGNfbmNtX2RwZTE2IHsKKwlfX2xlMTYJd0RhdGFncmFtSW5kZXg7CisJX19sZTE2CXdEYXRhZ3JhbUxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKiAxNi1iaXQgTkNNIERhdGFncmFtIFBvaW50ZXIgVGFibGUgKi8KK3N0cnVjdCB1c2JfY2RjX25jbV9uZHAxNiB7CisJX19sZTMyCWR3U2lnbmF0dXJlOworCV9fbGUxNgl3TGVuZ3RoOworCV9fbGUxNgl3TmV4dE5kcEluZGV4OworCXN0cnVjdAl1c2JfY2RjX25jbV9kcGUxNiBkcGUxNlswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiAzMi1iaXQgTkNNIERhdGFncmFtIFBvaW50ZXIgRW50cnkgKi8KK3N0cnVjdCB1c2JfY2RjX25jbV9kcGUzMiB7CisJX19sZTMyCWR3RGF0YWdyYW1JbmRleDsKKwlfX2xlMzIJZHdEYXRhZ3JhbUxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKiAzMi1iaXQgTkNNIERhdGFncmFtIFBvaW50ZXIgVGFibGUgKi8KK3N0cnVjdCB1c2JfY2RjX25jbV9uZHAzMiB7CisJX19sZTMyCWR3U2lnbmF0dXJlOworCV9fbGUxNgl3TGVuZ3RoOworCV9fbGUxNgl3UmVzZXJ2ZWQ2OworCV9fbGUzMglkd05leHROZHBJbmRleDsKKwlfX2xlMzIJZHdSZXNlcnZlZDEyOworCXN0cnVjdAl1c2JfY2RjX25jbV9kcGUzMiBkcGUzMlswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBDREMgTkNNIHN1YmNsYXNzIDMuMi4xIGFuZCAzLjIuMiAqLworI2RlZmluZSBVU0JfQ0RDX05DTV9ORFAxNl9JTkRFWF9NSU4JCQkweDAwMEMKKyNkZWZpbmUgVVNCX0NEQ19OQ01fTkRQMzJfSU5ERVhfTUlOCQkJMHgwMDEwCisKKy8qIENEQyBOQ00gc3ViY2xhc3MgMy4zLjMgRGF0YWdyYW0gRm9ybWF0dGluZyAqLworI2RlZmluZSBVU0JfQ0RDX05DTV9EQVRBR1JBTV9GT1JNQVRfQ1JDCQkJMHgzMAorI2RlZmluZSBVU0JfQ0RDX05DTV9EQVRBR1JBTV9GT1JNQVRfTk9DUkMJCTBYMzEKKworLyogQ0RDIE5DTSBzdWJjbGFzcyA0LjIgTkNNIENvbW11bmljYXRpb25zIEludGVyZmFjZSBQcm90b2NvbCBDb2RlICovCisjZGVmaW5lIFVTQl9DRENfTkNNX1BST1RPX0NPREVfTk9fRU5DQVBfQ09NTUFORFMJMHgwMAorI2RlZmluZSBVU0JfQ0RDX05DTV9QUk9UT19DT0RFX0VYVEVSTl9QUk9UTwkJMHhGRQorCisvKiBDREMgTkNNIHN1YmNsYXNzIDUuMi4xIE5DTSBGdW5jdGlvbmFsIERlc2NyaXB0b3IsIGJtTmV0d29ya0NhcGFiaWxpdGllcyAqLworI2RlZmluZSBVU0JfQ0RDX05DTV9OQ0FQX0VUSF9GSUxURVIJCQkoMSA8PCAwKQorI2RlZmluZSBVU0JfQ0RDX05DTV9OQ0FQX05FVF9BRERSRVNTCQkJKDEgPDwgMSkKKyNkZWZpbmUgVVNCX0NEQ19OQ01fTkNBUF9FTkNBUF9DT01NQU5ECQkJKDEgPDwgMikKKyNkZWZpbmUgVVNCX0NEQ19OQ01fTkNBUF9NQVhfREFUQUdSQU1fU0laRQkJKDEgPDwgMykKKyNkZWZpbmUgVVNCX0NEQ19OQ01fTkNBUF9DUkNfTU9ERQkJCSgxIDw8IDQpCisjZGVmaW5lCVVTQl9DRENfTkNNX05DQVBfTlRCX0lOUFVUX1NJWkUJCQkoMSA8PCA1KQorCisvKiBDREMgTkNNIHN1YmNsYXNzIFRhYmxlIDYtMzogTlRCIFBhcmFtZXRlciBTdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgVVNCX0NEQ19OQ01fTlRCMTZfU1VQUE9SVEVECQkJKDEgPDwgMCkKKyNkZWZpbmUgVVNCX0NEQ19OQ01fTlRCMzJfU1VQUE9SVEVECQkJKDEgPDwgMSkKKworLyogQ0RDIE5DTSBzdWJjbGFzcyBUYWJsZSA2LTM6IE5UQiBQYXJhbWV0ZXIgU3RydWN0dXJlICovCisjZGVmaW5lIFVTQl9DRENfTkNNX05EUF9BTElHTl9NSU5fU0laRQkJCTB4MDQKKyNkZWZpbmUgVVNCX0NEQ19OQ01fTlRCX01BWF9MRU5HVEgJCQkweDFDCisKKy8qIENEQyBOQ00gc3ViY2xhc3MgNi4yLjUgU2V0TnRiRm9ybWF0ICovCisjZGVmaW5lIFVTQl9DRENfTkNNX05UQjE2X0ZPUk1BVAkJCTB4MDAKKyNkZWZpbmUgVVNCX0NEQ19OQ01fTlRCMzJfRk9STUFUCQkJMHgwMQorCisvKiBDREMgTkNNIHN1YmNsYXNzIDYuMi43IFNldE50YklucHV0U2l6ZSAqLworI2RlZmluZSBVU0JfQ0RDX05DTV9OVEJfTUlOX0lOX1NJWkUJCQkyMDQ4CisjZGVmaW5lIFVTQl9DRENfTkNNX05UQl9NSU5fT1VUX1NJWkUJCQkyMDQ4CisKKy8qIE5UQiBJbnB1dCBTaXplIFN0cnVjdHVyZSAqLworc3RydWN0IHVzYl9jZGNfbmNtX25kcF9pbnB1dF9zaXplIHsKKwlfX2xlMzIJZHdOdGJJbk1heFNpemU7CisJX19sZTE2CXdOdGJJbk1heERhdGFncmFtczsKKwlfX2xlMTYJd1Jlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIENEQyBOQ00gc3ViY2xhc3MgNi4yLjExIFNldENyY01vZGUgKi8KKyNkZWZpbmUgVVNCX0NEQ19OQ01fQ1JDX05PVF9BUFBFTkRFRAkJCTB4MDAKKyNkZWZpbmUgVVNCX0NEQ19OQ01fQ1JDX0FQUEVOREVECQkJMHgwMQorCisjZW5kaWYgLyogX19MSU5VWF9VU0JfQ0RDX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2NoMTEuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2NoMTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWI3MzViCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvY2gxMS5oCkBAIC0wLDAgKzEsMjQwIEBACisvKgorICogVGhpcyBmaWxlIGhvbGRzIEh1YiBwcm90b2NvbCBjb25zdGFudHMgYW5kIGRhdGEgc3RydWN0dXJlcyB0aGF0IGFyZQorICogZGVmaW5lZCBpbiBjaGFwdGVyIDExIChIdWIgU3BlY2lmaWNhdGlvbikgb2YgdGhlIFVTQiAyLjAgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBJdCBpcyB1c2VkL3NoYXJlZCBiZXR3ZWVuIHRoZSBVU0IgY29yZSwgdGhlIEhDRHMgYW5kIGNvdXBsZSBvZiBvdGhlciBVU0IKKyAqIGRyaXZlcnMuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0NIMTFfSAorI2RlZmluZSBfX0xJTlVYX0NIMTFfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4JLyogX191OCBldGMgKi8KKworLyoKKyAqIEh1YiByZXF1ZXN0IHR5cGVzCisgKi8KKworI2RlZmluZSBVU0JfUlRfSFVCCShVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9ERVZJQ0UpCisjZGVmaW5lIFVTQl9SVF9QT1JUCShVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9PVEhFUikKKworLyoKKyAqIEh1YiBjbGFzcyByZXF1ZXN0cworICogU2VlIFVTQiAyLjAgc3BlYyBUYWJsZSAxMS0xNgorICovCisjZGVmaW5lIEhVQl9DTEVBUl9UVF9CVUZGRVIJOAorI2RlZmluZSBIVUJfUkVTRVRfVFQJCTkKKyNkZWZpbmUgSFVCX0dFVF9UVF9TVEFURQkxMAorI2RlZmluZSBIVUJfU1RPUF9UVAkJMTEKKyNkZWZpbmUgSFVCX1NFVF9ERVBUSAkJMTIKKworLyoKKyAqIEh1YiBjbGFzcyBhZGRpdGlvbmFsIHJlcXVlc3RzIGRlZmluZWQgYnkgVVNCIDMuMCBzcGVjCisgKiBTZWUgVVNCIDMuMCBzcGVjIFRhYmxlIDEwLTYKKyAqLworI2RlZmluZSBIVUJfU0VUX0RFUFRICQkxMgorI2RlZmluZSBIVUJfR0VUX1BPUlRfRVJSX0NPVU5UCTEzCisKKy8qCisgKiBIdWIgQ2xhc3MgZmVhdHVyZSBudW1iZXJzCisgKiBTZWUgVVNCIDIuMCBzcGVjIFRhYmxlIDExLTE3CisgKi8KKyNkZWZpbmUgQ19IVUJfTE9DQUxfUE9XRVIJMAorI2RlZmluZSBDX0hVQl9PVkVSX0NVUlJFTlQJMQorCisvKgorICogUG9ydCBmZWF0dXJlIG51bWJlcnMKKyAqIFNlZSBVU0IgMi4wIHNwZWMgVGFibGUgMTEtMTcKKyAqLworI2RlZmluZSBVU0JfUE9SVF9GRUFUX0NPTk5FQ1RJT04JMAorI2RlZmluZSBVU0JfUE9SVF9GRUFUX0VOQUJMRQkJMQorI2RlZmluZSBVU0JfUE9SVF9GRUFUX1NVU1BFTkQJCTIJLyogTDIgc3VzcGVuZCAqLworI2RlZmluZSBVU0JfUE9SVF9GRUFUX09WRVJfQ1VSUkVOVAkzCisjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfUkVTRVQJCTQKKyNkZWZpbmUgVVNCX1BPUlRfRkVBVF9MMQkJNQkvKiBMMSBzdXNwZW5kICovCisjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfUE9XRVIJCTgKKyNkZWZpbmUgVVNCX1BPUlRfRkVBVF9MT1dTUEVFRAkJOQkvKiBTaG91bGQgbmV2ZXIgYmUgdXNlZCAqLworI2RlZmluZSBVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTgkxNgorI2RlZmluZSBVU0JfUE9SVF9GRUFUX0NfRU5BQkxFCQkxNworI2RlZmluZSBVU0JfUE9SVF9GRUFUX0NfU1VTUEVORAkJMTgKKyNkZWZpbmUgVVNCX1BPUlRfRkVBVF9DX09WRVJfQ1VSUkVOVAkxOQorI2RlZmluZSBVU0JfUE9SVF9GRUFUX0NfUkVTRVQJCTIwCisjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfVEVTVCAgICAgICAgICAgICAgMjEKKyNkZWZpbmUgVVNCX1BPUlRfRkVBVF9JTkRJQ0FUT1IgICAgICAgICAyMgorI2RlZmluZSBVU0JfUE9SVF9GRUFUX0NfUE9SVF9MMSAgICAgICAgIDIzCisKKy8qCisgKiBQb3J0IGZlYXR1cmUgc2VsZWN0b3JzIGFkZGVkIGJ5IFVTQiAzLjAgc3BlYy4KKyAqIFNlZSBVU0IgMy4wIHNwZWMgVGFibGUgMTAtNworICovCisjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfTElOS19TVEFURQkJNQorI2RlZmluZSBVU0JfUE9SVF9GRUFUX1UxX1RJTUVPVVQJCTIzCisjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfVTJfVElNRU9VVAkJMjQKKyNkZWZpbmUgVVNCX1BPUlRfRkVBVF9DX1BPUlRfTElOS19TVEFURQkJMjUKKyNkZWZpbmUgVVNCX1BPUlRfRkVBVF9DX1BPUlRfQ09ORklHX0VSUk9SCTI2CisjZGVmaW5lIFVTQl9QT1JUX0ZFQVRfUkVNT1RFX1dBS0VfTUFTSwkJMjcKKyNkZWZpbmUgVVNCX1BPUlRfRkVBVF9CSF9QT1JUX1JFU0VUCQkyOAorI2RlZmluZSBVU0JfUE9SVF9GRUFUX0NfQkhfUE9SVF9SRVNFVAkJMjkKKyNkZWZpbmUgVVNCX1BPUlRfRkVBVF9GT1JDRV9MSU5LUE1fQUNDRVBUCTMwCisKKy8qCisgKiBIdWIgU3RhdHVzIGFuZCBIdWIgQ2hhbmdlIHJlc3VsdHMKKyAqIFNlZSBVU0IgMi4wIHNwZWMgVGFibGUgMTEtMTkgYW5kIFRhYmxlIDExLTIwCisgKi8KK3N0cnVjdCB1c2JfcG9ydF9zdGF0dXMgeworCV9fbGUxNiB3UG9ydFN0YXR1czsKKwlfX2xlMTYgd1BvcnRDaGFuZ2U7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqIHdQb3J0U3RhdHVzIGJpdCBmaWVsZAorICogU2VlIFVTQiAyLjAgc3BlYyBUYWJsZSAxMS0yMQorICovCisjZGVmaW5lIFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTgkweDAwMDEKKyNkZWZpbmUgVVNCX1BPUlRfU1RBVF9FTkFCTEUJCTB4MDAwMgorI2RlZmluZSBVU0JfUE9SVF9TVEFUX1NVU1BFTkQJCTB4MDAwNAorI2RlZmluZSBVU0JfUE9SVF9TVEFUX09WRVJDVVJSRU5UCTB4MDAwOAorI2RlZmluZSBVU0JfUE9SVF9TVEFUX1JFU0VUCQkweDAwMTAKKyNkZWZpbmUgVVNCX1BPUlRfU1RBVF9MMQkJMHgwMDIwCisvKiBiaXRzIDYgdG8gNyBhcmUgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgVVNCX1BPUlRfU1RBVF9QT1dFUgkJMHgwMTAwCisjZGVmaW5lIFVTQl9QT1JUX1NUQVRfTE9XX1NQRUVECQkweDAyMDAKKyNkZWZpbmUgVVNCX1BPUlRfU1RBVF9ISUdIX1NQRUVEICAgICAgICAweDA0MDAKKyNkZWZpbmUgVVNCX1BPUlRfU1RBVF9URVNUICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgVVNCX1BPUlRfU1RBVF9JTkRJQ0FUT1IgICAgICAgICAweDEwMDAKKy8qIGJpdHMgMTMgdG8gMTUgYXJlIHJlc2VydmVkICovCisKKy8qCisgKiBBZGRpdGlvbnMgdG8gd1BvcnRTdGF0dXMgYml0IGZpZWxkIGZyb20gVVNCIDMuMAorICogU2VlIFVTQiAzLjAgc3BlYyBUYWJsZSAxMC0xMAorICovCisjZGVmaW5lIFVTQl9QT1JUX1NUQVRfTElOS19TVEFURQkweDAxZTAKKyNkZWZpbmUgVVNCX1NTX1BPUlRfU1RBVF9QT1dFUgkJMHgwMjAwCisjZGVmaW5lIFVTQl9TU19QT1JUX1NUQVRfU1BFRUQJCTB4MWMwMAorI2RlZmluZSBVU0JfUE9SVF9TVEFUX1NQRUVEXzVHQlBTCTB4MDAwMAorLyogVmFsaWQgb25seSBpZiBwb3J0IGlzIGVuYWJsZWQgKi8KKy8qIEJpdHMgdGhhdCBhcmUgdGhlIHNhbWUgZnJvbSBVU0IgMi4wICovCisjZGVmaW5lIFVTQl9TU19QT1JUX1NUQVRfTUFTSyAoVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OIHwJICAgIFwKKwkJCQlVU0JfUE9SVF9TVEFUX0VOQUJMRSB8CSAgICBcCisJCQkJVVNCX1BPUlRfU1RBVF9PVkVSQ1VSUkVOVCB8IFwKKwkJCQlVU0JfUE9SVF9TVEFUX1JFU0VUKQorCisvKgorICogRGVmaW5pdGlvbnMgZm9yIFBPUlRfTElOS19TVEFURSB2YWx1ZXMKKyAqIChiaXRzIDUtOCkgaW4gd1BvcnRTdGF0dXMKKyAqLworI2RlZmluZSBVU0JfU1NfUE9SVF9MU19VMAkJMHgwMDAwCisjZGVmaW5lIFVTQl9TU19QT1JUX0xTX1UxCQkweDAwMjAKKyNkZWZpbmUgVVNCX1NTX1BPUlRfTFNfVTIJCTB4MDA0MAorI2RlZmluZSBVU0JfU1NfUE9SVF9MU19VMwkJMHgwMDYwCisjZGVmaW5lIFVTQl9TU19QT1JUX0xTX1NTX0RJU0FCTEVECTB4MDA4MAorI2RlZmluZSBVU0JfU1NfUE9SVF9MU19SWF9ERVRFQ1QJMHgwMGEwCisjZGVmaW5lIFVTQl9TU19QT1JUX0xTX1NTX0lOQUNUSVZFCTB4MDBjMAorI2RlZmluZSBVU0JfU1NfUE9SVF9MU19QT0xMSU5HCQkweDAwZTAKKyNkZWZpbmUgVVNCX1NTX1BPUlRfTFNfUkVDT1ZFUlkJCTB4MDEwMAorI2RlZmluZSBVU0JfU1NfUE9SVF9MU19IT1RfUkVTRVQJMHgwMTIwCisjZGVmaW5lIFVTQl9TU19QT1JUX0xTX0NPTVBfTU9ECQkweDAxNDAKKyNkZWZpbmUgVVNCX1NTX1BPUlRfTFNfTE9PUEJBQ0sJCTB4MDE2MAorCisvKgorICogd1BvcnRDaGFuZ2UgYml0IGZpZWxkCisgKiBTZWUgVVNCIDIuMCBzcGVjIFRhYmxlIDExLTIyIGFuZCBVU0IgMi4wIExQTSBFQ04gVGFibGUtNC4xMAorICogQml0cyAwIHRvIDUgc2hvd24sIGJpdHMgNiB0byAxNSBhcmUgcmVzZXJ2ZWQKKyAqLworI2RlZmluZSBVU0JfUE9SVF9TVEFUX0NfQ09OTkVDVElPTgkweDAwMDEKKyNkZWZpbmUgVVNCX1BPUlRfU1RBVF9DX0VOQUJMRQkJMHgwMDAyCisjZGVmaW5lIFVTQl9QT1JUX1NUQVRfQ19TVVNQRU5ECQkweDAwMDQKKyNkZWZpbmUgVVNCX1BPUlRfU1RBVF9DX09WRVJDVVJSRU5UCTB4MDAwOAorI2RlZmluZSBVU0JfUE9SVF9TVEFUX0NfUkVTRVQJCTB4MDAxMAorI2RlZmluZSBVU0JfUE9SVF9TVEFUX0NfTDEJCTB4MDAyMAorLyoKKyAqIFVTQiAzLjAgd1BvcnRDaGFuZ2UgYml0IGZpZWxkcworICogU2VlIFVTQiAzLjAgc3BlYyBUYWJsZSAxMC0xMQorICovCisjZGVmaW5lIFVTQl9QT1JUX1NUQVRfQ19CSF9SRVNFVAkweDAwMjAKKyNkZWZpbmUgVVNCX1BPUlRfU1RBVF9DX0xJTktfU1RBVEUJMHgwMDQwCisjZGVmaW5lIFVTQl9QT1JUX1NUQVRfQ19DT05GSUdfRVJST1IJMHgwMDgwCisKKy8qCisgKiB3SHViQ2hhcmFjdGVyaXN0aWNzIChtYXNrcykKKyAqIFNlZSBVU0IgMi4wIHNwZWMgVGFibGUgMTEtMTMsIG9mZnNldCAzCisgKi8KKyNkZWZpbmUgSFVCX0NIQVJfTFBTTQkJMHgwMDAzIC8qIEQxIC4uIEQwICovCisjZGVmaW5lIEhVQl9DSEFSX0NPTVBPVU5ECTB4MDAwNCAvKiBEMiAgICAgICAqLworI2RlZmluZSBIVUJfQ0hBUl9PQ1BNCQkweDAwMTggLyogRDQgLi4gRDMgKi8KKyNkZWZpbmUgSFVCX0NIQVJfVFRUVCAgICAgICAgICAgMHgwMDYwIC8qIEQ2IC4uIEQ1ICovCisjZGVmaW5lIEhVQl9DSEFSX1BPUlRJTkQgICAgICAgIDB4MDA4MCAvKiBENyAgICAgICAqLworCitzdHJ1Y3QgdXNiX2h1Yl9zdGF0dXMgeworCV9fbGUxNiB3SHViU3RhdHVzOworCV9fbGUxNiB3SHViQ2hhbmdlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiBIdWIgU3RhdHVzICYgSHViIENoYW5nZSBiaXQgbWFza3MKKyAqIFNlZSBVU0IgMi4wIHNwZWMgVGFibGUgMTEtMTkgYW5kIFRhYmxlIDExLTIwCisgKiBCaXRzIDAgYW5kIDEgZm9yIHdIdWJTdGF0dXMgYW5kIHdIdWJDaGFuZ2UKKyAqIEJpdHMgMiB0byAxNSBhcmUgcmVzZXJ2ZWQgZm9yIGJvdGgKKyAqLworI2RlZmluZSBIVUJfU1RBVFVTX0xPQ0FMX1BPV0VSCTB4MDAwMQorI2RlZmluZSBIVUJfU1RBVFVTX09WRVJDVVJSRU5UCTB4MDAwMgorI2RlZmluZSBIVUJfQ0hBTkdFX0xPQ0FMX1BPV0VSCTB4MDAwMQorI2RlZmluZSBIVUJfQ0hBTkdFX09WRVJDVVJSRU5UCTB4MDAwMgorCisKKy8qCisgKiBIdWIgZGVzY3JpcHRvcgorICogU2VlIFVTQiAyLjAgc3BlYyBUYWJsZSAxMS0xMworICovCisKKyNkZWZpbmUgVVNCX0RUX0hVQgkJCShVU0JfVFlQRV9DTEFTUyB8IDB4MDkpCisjZGVmaW5lIFVTQl9EVF9TU19IVUIJCQkoVVNCX1RZUEVfQ0xBU1MgfCAweDBhKQorI2RlZmluZSBVU0JfRFRfSFVCX05PTlZBUl9TSVpFCQk3CisjZGVmaW5lIFVTQl9EVF9TU19IVUJfU0laRSAgICAgICAgICAgICAgMTIKKworc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciB7CisJX191OCAgYkRlc2NMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJOYnJQb3J0czsKKwlfX2xlMTYgd0h1YkNoYXJhY3RlcmlzdGljczsKKwlfX3U4ICBiUHdyT24yUHdyR29vZDsKKwlfX3U4ICBiSHViQ29udHJDdXJyZW50OworCisJLyogMi4wIGFuZCAzLjAgaHVicyBkaWZmZXIgaGVyZSAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCS8qIGFkZCAxIGJpdCBmb3IgaHViIHN0YXR1cyBjaGFuZ2U7IHJvdW5kIHRvIGJ5dGVzICovCisJCQlfX3U4ICBEZXZpY2VSZW1vdmFibGVbKFVTQl9NQVhDSElMRFJFTiArIDEgKyA3KSAvIDhdOworCQkJX191OCAgUG9ydFB3ckN0cmxNYXNrWyhVU0JfTUFYQ0hJTERSRU4gKyAxICsgNykgLyA4XTsKKwkJfSAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGhzOworCisJCXN0cnVjdCB7CisJCQlfX3U4IGJIdWJIZHJEZWNMYXQ7CisJCQlfX3UxNiB3SHViRGVsYXk7CisJCQlfX3UxNiBEZXZpY2VSZW1vdmFibGU7CisJCX0gIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBzczsKKwl9IHU7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogcG9ydCBpbmRpY2F0b3Igc3RhdHVzIHNlbGVjdG9ycywgdGFibGVzIDExLTcgYW5kIDExLTI1ICovCisjZGVmaW5lIEhVQl9MRURfQVVUTwkwCisjZGVmaW5lIEhVQl9MRURfQU1CRVIJMQorI2RlZmluZSBIVUJfTEVEX0dSRUVOCTIKKyNkZWZpbmUgSFVCX0xFRF9PRkYJMworCitlbnVtIGh1Yl9sZWRfbW9kZSB7CisJSU5ESUNBVE9SX0FVVE8gPSAwLAorCUlORElDQVRPUl9DWUNMRSwKKwkvKiBzb2Z0d2FyZSBibGlua3MgZm9yIGF0dGVudGlvbjogIHNvZnR3YXJlLCBoYXJkd2FyZSwgcmVzZXJ2ZWQgKi8KKwlJTkRJQ0FUT1JfR1JFRU5fQkxJTkssIElORElDQVRPUl9HUkVFTl9CTElOS19PRkYsCisJSU5ESUNBVE9SX0FNQkVSX0JMSU5LLCBJTkRJQ0FUT1JfQU1CRVJfQkxJTktfT0ZGLAorCUlORElDQVRPUl9BTFRfQkxJTkssIElORElDQVRPUl9BTFRfQkxJTktfT0ZGCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVHJhbnNhY3Rpb24gVHJhbnNsYXRvciBUaGluayBUaW1lcywgaW4gYml0cyAqLworI2RlZmluZSBIVUJfVFRUVF84X0JJVFMJCTB4MDAKKyNkZWZpbmUgSFVCX1RUVFRfMTZfQklUUwkweDIwCisjZGVmaW5lIEhVQl9UVFRUXzI0X0JJVFMJMHg0MAorI2RlZmluZSBIVUJfVFRUVF8zMl9CSVRTCTB4NjAKKworI2VuZGlmIC8qIF9fTElOVVhfQ0gxMV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYi9jaDkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2N2JkNGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYi9jaDkuaApAQCAtMCwwICsxLDkzMCBAQAorLyoKKyAqIFRoaXMgZmlsZSBob2xkcyBVU0IgY29uc3RhbnRzIGFuZCBzdHJ1Y3R1cmVzIHRoYXQgYXJlIG5lZWRlZCBmb3IKKyAqIFVTQiBkZXZpY2UgQVBJcy4gIFRoZXNlIGFyZSB1c2VkIGJ5IHRoZSBVU0IgZGV2aWNlIG1vZGVsLCB3aGljaCBpcworICogZGVmaW5lZCBpbiBjaGFwdGVyIDkgb2YgdGhlIFVTQiAyLjAgc3BlY2lmaWNhdGlvbiBhbmQgaW4gdGhlCisgKiBXaXJlbGVzcyBVU0IgMS4wIChzcHJlYWQgYXJvdW5kKS4gIExpbnV4IGhhcyBzZXZlcmFsIEFQSXMgaW4gQyB0aGF0CisgKiBuZWVkIHRoZXNlOgorICoKKyAqIC0gdGhlIG1hc3Rlci9ob3N0IHNpZGUgTGludXgtVVNCIGtlcm5lbCBkcml2ZXIgQVBJOworICogLSB0aGUgInVzYmZzIiB1c2VyIHNwYWNlIEFQSTsgYW5kCisgKiAtIHRoZSBMaW51eCAiZ2FkZ2V0IiBzbGF2ZS9kZXZpY2UvcGVyaXBoZXJhbCBzaWRlIGRyaXZlciBBUEkuCisgKgorICogVVNCIDIuMCBhZGRzIGFuIGFkZGl0aW9uYWwgIk9uIFRoZSBHbyIgKE9URykgbW9kZSwgd2hpY2ggbGV0cyBzeXN0ZW1zCisgKiBhY3QgZWl0aGVyIGFzIGEgVVNCIG1hc3Rlci9ob3N0IG9yIGFzIGEgVVNCIHNsYXZlL2RldmljZS4gIFRoYXQgbWVhbnMKKyAqIHRoZSBtYXN0ZXIgYW5kIHNsYXZlIHNpZGUgQVBJcyBiZW5lZml0IGZyb20gd29ya2luZyB3ZWxsIHRvZ2V0aGVyLgorICoKKyAqIFRoZXJlJ3MgYWxzbyAiV2lyZWxlc3MgVVNCIiwgdXNpbmcgbG93IHBvd2VyIHNob3J0IHJhbmdlIHJhZGlvcyBmb3IKKyAqIHBlcmlwaGVyYWwgaW50ZXJjb25uZWN0aW9uIGJ1dCBvdGhlcndpc2UgYnVpbGRpbmcgb24gdGhlIFVTQiBmcmFtZXdvcmsuCisgKgorICogTm90ZSBhbGwgZGVzY3JpcHRvcnMgYXJlIGRlY2xhcmVkICdfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKScgc28gdGhhdDoKKyAqCisgKiBbYV0gdGhleSBuZXZlciBnZXQgcGFkZGVkLCBlaXRoZXIgaW50ZXJuYWxseSAoVVNCIHNwZWMgd3JpdGVycworICogICAgIHByb2JhYmx5IGhhbmRsZWQgdGhhdCkgb3IgZXh0ZXJuYWxseTsKKyAqCisgKiBbYl0gc28gdGhhdCBhY2Nlc3NpbmcgYmlnZ2VyLXRoYW4tYS1ieXRlcyBmaWVsZHMgd2lsbCBuZXZlcgorICogICAgIGdlbmVyYXRlIGJ1cyBlcnJvcnMgb24gYW55IHBsYXRmb3JtLCBldmVuIHdoZW4gdGhlIGxvY2F0aW9uIG9mCisgKiAgICAgaXRzIGRlc2NyaXB0b3IgaW5zaWRlIGEgYnVuZGxlIGlzbid0ICJuYXR1cmFsbHkgYWxpZ25lZCIsIGFuZAorICoKKyAqIFtjXSBmb3IgY29uc2lzdGVuY3ksIHJlbW92aW5nIGFsbCBkb3VidCBldmVuIHdoZW4gaXQgYXBwZWFycyB0bworICogICAgIHNvbWVvbmUgdGhhdCB0aGUgdHdvIG90aGVyIHBvaW50cyBhcmUgbm9uLWlzc3VlcyBmb3IgdGhhdAorICogICAgIHBhcnRpY3VsYXIgZGVzY3JpcHRvciB0eXBlLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9VU0JfQ0g5X0gKKyNkZWZpbmUgX19MSU5VWF9VU0JfQ0g5X0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CS8qIF9fdTggZXRjICovCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgkvKiBsZTE2X3RvX2NwdSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBDT05UUk9MIFJFUVVFU1QgU1VQUE9SVCAqLworCisvKgorICogVVNCIGRpcmVjdGlvbnMKKyAqCisgKiBUaGlzIGJpdCBmbGFnIGlzIHVzZWQgaW4gZW5kcG9pbnQgZGVzY3JpcHRvcnMnIGJFbmRwb2ludEFkZHJlc3MgZmllbGQuCisgKiBJdCdzIGFsc28gb25lIG9mIHRocmVlIGZpZWxkcyBpbiBjb250cm9sIHJlcXVlc3RzIGJSZXF1ZXN0VHlwZS4KKyAqLworI2RlZmluZSBVU0JfRElSX09VVAkJCTAJCS8qIHRvIGRldmljZSAqLworI2RlZmluZSBVU0JfRElSX0lOCQkJMHg4MAkJLyogdG8gaG9zdCAqLworCisvKgorICogVVNCIHR5cGVzLCB0aGUgc2Vjb25kIG9mIHRocmVlIGJSZXF1ZXN0VHlwZSBmaWVsZHMKKyAqLworI2RlZmluZSBVU0JfVFlQRV9NQVNLCQkJKDB4MDMgPDwgNSkKKyNkZWZpbmUgVVNCX1RZUEVfU1RBTkRBUkQJCSgweDAwIDw8IDUpCisjZGVmaW5lIFVTQl9UWVBFX0NMQVNTCQkJKDB4MDEgPDwgNSkKKyNkZWZpbmUgVVNCX1RZUEVfVkVORE9SCQkJKDB4MDIgPDwgNSkKKyNkZWZpbmUgVVNCX1RZUEVfUkVTRVJWRUQJCSgweDAzIDw8IDUpCisKKy8qCisgKiBVU0IgcmVjaXBpZW50cywgdGhlIHRoaXJkIG9mIHRocmVlIGJSZXF1ZXN0VHlwZSBmaWVsZHMKKyAqLworI2RlZmluZSBVU0JfUkVDSVBfTUFTSwkJCTB4MWYKKyNkZWZpbmUgVVNCX1JFQ0lQX0RFVklDRQkJMHgwMAorI2RlZmluZSBVU0JfUkVDSVBfSU5URVJGQUNFCQkweDAxCisjZGVmaW5lIFVTQl9SRUNJUF9FTkRQT0lOVAkJMHgwMgorI2RlZmluZSBVU0JfUkVDSVBfT1RIRVIJCQkweDAzCisvKiBGcm9tIFdpcmVsZXNzIFVTQiAxLjAgKi8KKyNkZWZpbmUgVVNCX1JFQ0lQX1BPUlQJCQkweDA0CisjZGVmaW5lIFVTQl9SRUNJUF9SUElQRQkJMHgwNQorCisvKgorICogU3RhbmRhcmQgcmVxdWVzdHMsIGZvciB0aGUgYlJlcXVlc3QgZmllbGQgb2YgYSBTRVRVUCBwYWNrZXQuCisgKgorICogVGhlc2UgYXJlIHF1YWxpZmllZCBieSB0aGUgYlJlcXVlc3RUeXBlIGZpZWxkLCBzbyB0aGF0IGZvciBleGFtcGxlCisgKiBUWVBFX0NMQVNTIG9yIFRZUEVfVkVORE9SIHNwZWNpZmljIGZlYXR1cmUgZmxhZ3MgY291bGQgYmUgcmV0cmlldmVkCisgKiBieSBhIEdFVF9TVEFUVVMgcmVxdWVzdC4KKyAqLworI2RlZmluZSBVU0JfUkVRX0dFVF9TVEFUVVMJCTB4MDAKKyNkZWZpbmUgVVNCX1JFUV9DTEVBUl9GRUFUVVJFCQkweDAxCisjZGVmaW5lIFVTQl9SRVFfU0VUX0ZFQVRVUkUJCTB4MDMKKyNkZWZpbmUgVVNCX1JFUV9TRVRfQUREUkVTUwkJMHgwNQorI2RlZmluZSBVU0JfUkVRX0dFVF9ERVNDUklQVE9SCQkweDA2CisjZGVmaW5lIFVTQl9SRVFfU0VUX0RFU0NSSVBUT1IJCTB4MDcKKyNkZWZpbmUgVVNCX1JFUV9HRVRfQ09ORklHVVJBVElPTgkweDA4CisjZGVmaW5lIFVTQl9SRVFfU0VUX0NPTkZJR1VSQVRJT04JMHgwOQorI2RlZmluZSBVU0JfUkVRX0dFVF9JTlRFUkZBQ0UJCTB4MEEKKyNkZWZpbmUgVVNCX1JFUV9TRVRfSU5URVJGQUNFCQkweDBCCisjZGVmaW5lIFVTQl9SRVFfU1lOQ0hfRlJBTUUJCTB4MEMKKworI2RlZmluZSBVU0JfUkVRX1NFVF9FTkNSWVBUSU9OCQkweDBECS8qIFdpcmVsZXNzIFVTQiAqLworI2RlZmluZSBVU0JfUkVRX0dFVF9FTkNSWVBUSU9OCQkweDBFCisjZGVmaW5lIFVTQl9SRVFfUlBJUEVfQUJPUlQJCTB4MEUKKyNkZWZpbmUgVVNCX1JFUV9TRVRfSEFORFNIQUtFCQkweDBGCisjZGVmaW5lIFVTQl9SRVFfUlBJUEVfUkVTRVQJCTB4MEYKKyNkZWZpbmUgVVNCX1JFUV9HRVRfSEFORFNIQUtFCQkweDEwCisjZGVmaW5lIFVTQl9SRVFfU0VUX0NPTk5FQ1RJT04JCTB4MTEKKyNkZWZpbmUgVVNCX1JFUV9TRVRfU0VDVVJJVFlfREFUQQkweDEyCisjZGVmaW5lIFVTQl9SRVFfR0VUX1NFQ1VSSVRZX0RBVEEJMHgxMworI2RlZmluZSBVU0JfUkVRX1NFVF9XVVNCX0RBVEEJCTB4MTQKKyNkZWZpbmUgVVNCX1JFUV9MT09QQkFDS19EQVRBX1dSSVRFCTB4MTUKKyNkZWZpbmUgVVNCX1JFUV9MT09QQkFDS19EQVRBX1JFQUQJMHgxNgorI2RlZmluZSBVU0JfUkVRX1NFVF9JTlRFUkZBQ0VfRFMJMHgxNworCisvKiBUaGUgTGluayBQb3dlciBNYW5hZ2VtZW50IChMUE0pIEVDTiBkZWZpbmVzIFVTQl9SRVFfVEVTVF9BTkRfU0VUIGNvbW1hbmQsCisgKiB1c2VkIGJ5IGh1YnMgdG8gcHV0IHBvcnRzIGludG8gYSBuZXcgTDEgc3VzcGVuZCBzdGF0ZSwgZXhjZXB0IHRoYXQgaXQKKyAqIGZvcmdvdCB0byBkZWZpbmUgaXRzIG51bWJlciAuLi4KKyAqLworCisvKgorICogVVNCIGZlYXR1cmUgZmxhZ3MgYXJlIHdyaXR0ZW4gdXNpbmcgVVNCX1JFUV97Q0xFQVIsU0VUfV9GRUFUVVJFLCBhbmQKKyAqIGFyZSByZWFkIGFzIGEgYml0IGFycmF5IHJldHVybmVkIGJ5IFVTQl9SRVFfR0VUX1NUQVRVUy4gIChTbyB0aGVyZQorICogYXJlIGF0IG1vc3Qgc2l4dGVlbiBmZWF0dXJlcyBvZiBlYWNoIHR5cGUuKSAgSHVicyBtYXkgYWxzbyBzdXBwb3J0IGEKKyAqIG5ldyBVU0JfUkVRX1RFU1RfQU5EX1NFVF9GRUFUVVJFIHRvIHB1dCBwb3J0cyBpbnRvIEwxIHN1c3BlbmQuCisgKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9TRUxGX1BPV0VSRUQJCTAJLyogKHJlYWQgb25seSkgKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQCTEJLyogZGV2IG1heSBpbml0aWF0ZSB3YWtldXAgKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9URVNUX01PREUJCTIJLyogKHdpcmVkIGhpZ2ggc3BlZWQgb25seSkgKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9CQVRURVJZCQkyCS8qICh3aXJlbGVzcykgKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9CX0hOUF9FTkFCTEUJCTMJLyogKG90ZykgZGV2IG1heSBpbml0aWF0ZSBITlAgKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9XVVNCX0RFVklDRQkJMwkvKiAod2lyZWxlc3MpKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9BX0hOUF9TVVBQT1JUCTQJLyogKG90ZykgUkggcG9ydCBzdXBwb3J0cyBITlAgKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9BX0FMVF9ITlBfU1VQUE9SVAk1CS8qIChvdGcpIG90aGVyIFJIIHBvcnQgZG9lcyAqLworI2RlZmluZSBVU0JfREVWSUNFX0RFQlVHX01PREUJCTYJLyogKHNwZWNpYWwgZGV2aWNlcyBvbmx5KSAqLworCisvKgorICogVGVzdCBNb2RlIFNlbGVjdG9ycworICogU2VlIFVTQiAyLjAgc3BlYyBUYWJsZSA5LTcKKyAqLworI2RlZmluZQlURVNUX0oJCTEKKyNkZWZpbmUJVEVTVF9LCQkyCisjZGVmaW5lCVRFU1RfU0UwX05BSwkzCisjZGVmaW5lCVRFU1RfUEFDS0VUCTQKKyNkZWZpbmUJVEVTVF9GT1JDRV9FTgk1CisKKy8qCisgKiBOZXcgRmVhdHVyZSBTZWxlY3RvcnMgYXMgYWRkZWQgYnkgVVNCIDMuMAorICogU2VlIFVTQiAzLjAgc3BlYyBUYWJsZSA5LTYKKyAqLworI2RlZmluZSBVU0JfREVWSUNFX1UxX0VOQUJMRQk0OAkvKiBkZXYgbWF5IGluaXRpYXRlIFUxIHRyYW5zaXRpb24gKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9VMl9FTkFCTEUJNDkJLyogZGV2IG1heSBpbml0aWF0ZSBVMiB0cmFuc2l0aW9uICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfTFRNX0VOQUJMRQk1MAkvKiBkZXYgbWF5IHNlbmQgTFRNICovCisjZGVmaW5lIFVTQl9JTlRSRl9GVU5DX1NVU1BFTkQJMAkvKiBmdW5jdGlvbiBzdXNwZW5kICovCisKKyNkZWZpbmUgVVNCX0lOVFJfRlVOQ19TVVNQRU5EX09QVF9NQVNLCTB4RkYwMAorLyoKKyAqIFN1c3BlbmQgT3B0aW9ucywgVGFibGUgOS03IFVTQiAzLjAgc3BlYworICovCisjZGVmaW5lIFVTQl9JTlRSRl9GVU5DX1NVU1BFTkRfTFAJKDEgPDwgKDggKyAwKSkKKyNkZWZpbmUgVVNCX0lOVFJGX0ZVTkNfU1VTUEVORF9SVwkoMSA8PCAoOCArIDEpKQorCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9IQUxUCQkwCS8qIElOL09VVCB3aWxsIFNUQUxMICovCisKKy8qIEJpdCBhcnJheSBlbGVtZW50cyBhcyByZXR1cm5lZCBieSB0aGUgVVNCX1JFUV9HRVRfU1RBVFVTIHJlcXVlc3QuICovCisjZGVmaW5lIFVTQl9ERVZfU1RBVF9VMV9FTkFCTEVECQkyCS8qIHRyYW5zaXRpb24gaW50byBVMSBzdGF0ZSAqLworI2RlZmluZSBVU0JfREVWX1NUQVRfVTJfRU5BQkxFRAkJMwkvKiB0cmFuc2l0aW9uIGludG8gVTIgc3RhdGUgKi8KKyNkZWZpbmUgVVNCX0RFVl9TVEFUX0xUTV9FTkFCTEVECTQJLyogTGF0ZW5jeSB0b2xlcmFuY2UgbWVzc2FnZXMgKi8KKworLyoqCisgKiBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0IC0gU0VUVVAgZGF0YSBmb3IgYSBVU0IgZGV2aWNlIGNvbnRyb2wgcmVxdWVzdAorICogQGJSZXF1ZXN0VHlwZTogbWF0Y2hlcyB0aGUgVVNCIGJtUmVxdWVzdFR5cGUgZmllbGQKKyAqIEBiUmVxdWVzdDogbWF0Y2hlcyB0aGUgVVNCIGJSZXF1ZXN0IGZpZWxkCisgKiBAd1ZhbHVlOiBtYXRjaGVzIHRoZSBVU0Igd1ZhbHVlIGZpZWxkIChsZTE2IGJ5dGUgb3JkZXIpCisgKiBAd0luZGV4OiBtYXRjaGVzIHRoZSBVU0Igd0luZGV4IGZpZWxkIChsZTE2IGJ5dGUgb3JkZXIpCisgKiBAd0xlbmd0aDogbWF0Y2hlcyB0aGUgVVNCIHdMZW5ndGggZmllbGQgKGxlMTYgYnl0ZSBvcmRlcikKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHNlbmQgY29udHJvbCByZXF1ZXN0cyB0byBhIFVTQiBkZXZpY2UuICBJdCBtYXRjaGVzCisgKiB0aGUgZGlmZmVyZW50IGZpZWxkcyBvZiB0aGUgVVNCIDIuMCBTcGVjIHNlY3Rpb24gOS4zLCB0YWJsZSA5LTIuICBTZWUgdGhlCisgKiBVU0Igc3BlYyBmb3IgYSBmdWxsZXIgZGVzY3JpcHRpb24gb2YgdGhlIGRpZmZlcmVudCBmaWVsZHMsIGFuZCB3aGF0IHRoZXkgYXJlCisgKiB1c2VkIGZvci4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGRyaXZlciBmb3IgYW55IGludGVyZmFjZSBjYW4gaXNzdWUgY29udHJvbCByZXF1ZXN0cy4KKyAqIEZvciBtb3N0IGRldmljZXMsIGludGVyZmFjZXMgZG9uJ3QgY29vcmRpbmF0ZSB3aXRoIGVhY2ggb3RoZXIsIHNvCisgKiBzdWNoIHJlcXVlc3RzIG1heSBiZSBtYWRlIGF0IGFueSB0aW1lLgorICovCitzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0IHsKKwlfX3U4IGJSZXF1ZXN0VHlwZTsKKwlfX3U4IGJSZXF1ZXN0OworCV9fbGUxNiB3VmFsdWU7CisJX19sZTE2IHdJbmRleDsKKwlfX2xlMTYgd0xlbmd0aDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU1RBTkRBUkQgREVTQ1JJUFRPUlMgLi4uIGFzIHJldHVybmVkIGJ5IEdFVF9ERVNDUklQVE9SLCBvcgorICogKHJhcmVseSkgYWNjZXB0ZWQgYnkgU0VUX0RFU0NSSVBUT1IuCisgKgorICogTm90ZSB0aGF0IGFsbCBtdWx0aS1ieXRlIHZhbHVlcyBoZXJlIGFyZSBlbmNvZGVkIGluIGxpdHRsZSBlbmRpYW4KKyAqIGJ5dGUgb3JkZXIgIm9uIHRoZSB3aXJlIi4gIFdpdGhpbiB0aGUga2VybmVsIGFuZCB3aGVuIGV4cG9zZWQKKyAqIHRocm91Z2ggdGhlIExpbnV4LVVTQiBBUElzLCB0aGV5IGFyZSBub3QgY29udmVydGVkIHRvIGNwdSBieXRlCisgKiBvcmRlcjsgaXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjbGllbnQgY29kZSB0byBkbyB0aGlzLgorICogVGhlIHNpbmdsZSBleGNlcHRpb24gaXMgd2hlbiBkZXZpY2UgYW5kIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvcnMgKGJ1dAorICogbm90IG90aGVyIGRlc2NyaXB0b3JzKSBhcmUgcmVhZCBmcm9tIHVzYmZzIChpLmUuIC9wcm9jL2J1cy91c2IvQkJCL0RERCk7CisgKiBpbiB0aGlzIGNhc2UgdGhlIGZpZWxkcyBhcmUgY29udmVydGVkIHRvIGhvc3QgZW5kaWFubmVzcyBieSB0aGUga2VybmVsLgorICovCisKKy8qCisgKiBEZXNjcmlwdG9yIHR5cGVzIC4uLiBVU0IgMi4wIHNwZWMgdGFibGUgOS41CisgKi8KKyNkZWZpbmUgVVNCX0RUX0RFVklDRQkJCTB4MDEKKyNkZWZpbmUgVVNCX0RUX0NPTkZJRwkJCTB4MDIKKyNkZWZpbmUgVVNCX0RUX1NUUklORwkJCTB4MDMKKyNkZWZpbmUgVVNCX0RUX0lOVEVSRkFDRQkJMHgwNAorI2RlZmluZSBVU0JfRFRfRU5EUE9JTlQJCQkweDA1CisjZGVmaW5lIFVTQl9EVF9ERVZJQ0VfUVVBTElGSUVSCQkweDA2CisjZGVmaW5lIFVTQl9EVF9PVEhFUl9TUEVFRF9DT05GSUcJMHgwNworI2RlZmluZSBVU0JfRFRfSU5URVJGQUNFX1BPV0VSCQkweDA4CisvKiB0aGVzZSBhcmUgZnJvbSBhIG1pbm9yIHVzYiAyLjAgcmV2aXNpb24gKEVDTikgKi8KKyNkZWZpbmUgVVNCX0RUX09URwkJCTB4MDkKKyNkZWZpbmUgVVNCX0RUX0RFQlVHCQkJMHgwYQorI2RlZmluZSBVU0JfRFRfSU5URVJGQUNFX0FTU09DSUFUSU9OCTB4MGIKKy8qIHRoZXNlIGFyZSBmcm9tIHRoZSBXaXJlbGVzcyBVU0Igc3BlYyAqLworI2RlZmluZSBVU0JfRFRfU0VDVVJJVFkJCQkweDBjCisjZGVmaW5lIFVTQl9EVF9LRVkJCQkweDBkCisjZGVmaW5lIFVTQl9EVF9FTkNSWVBUSU9OX1RZUEUJCTB4MGUKKyNkZWZpbmUgVVNCX0RUX0JPUwkJCTB4MGYKKyNkZWZpbmUgVVNCX0RUX0RFVklDRV9DQVBBQklMSVRZCTB4MTAKKyNkZWZpbmUgVVNCX0RUX1dJUkVMRVNTX0VORFBPSU5UX0NPTVAJMHgxMQorI2RlZmluZSBVU0JfRFRfV0lSRV9BREFQVEVSCQkweDIxCisjZGVmaW5lIFVTQl9EVF9SUElQRQkJCTB4MjIKKyNkZWZpbmUgVVNCX0RUX0NTX1JBRElPX0NPTlRST0wJCTB4MjMKKy8qIEZyb20gdGhlIFQxMCBVQVMgc3BlY2lmaWNhdGlvbiAqLworI2RlZmluZSBVU0JfRFRfUElQRV9VU0FHRQkJMHgyNAorLyogRnJvbSB0aGUgVVNCIDMuMCBzcGVjICovCisjZGVmaW5lCVVTQl9EVF9TU19FTkRQT0lOVF9DT01QCQkweDMwCisKKy8qIENvbnZlbnRpb25hbCBjb2RlcyBmb3IgY2xhc3Mtc3BlY2lmaWMgZGVzY3JpcHRvcnMuICBUaGUgY29udmVudGlvbiBpcworICogZGVmaW5lZCBpbiB0aGUgVVNCICJDb21tb24gQ2xhc3MiIFNwZWMgKDMuMTEpLiAgSW5kaXZpZHVhbCBjbGFzcyBzcGVjcworICogYXJlIGF1dGhvcml0YXRpdmUgZm9yIHRoZWlyIHVzYWdlLCBub3QgdGhlICJjb21tb24gY2xhc3MiIHdyaXRldXAuCisgKi8KKyNkZWZpbmUgVVNCX0RUX0NTX0RFVklDRQkJKFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RUX0RFVklDRSkKKyNkZWZpbmUgVVNCX0RUX0NTX0NPTkZJRwkJKFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RUX0NPTkZJRykKKyNkZWZpbmUgVVNCX0RUX0NTX1NUUklORwkJKFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RUX1NUUklORykKKyNkZWZpbmUgVVNCX0RUX0NTX0lOVEVSRkFDRQkJKFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RUX0lOVEVSRkFDRSkKKyNkZWZpbmUgVVNCX0RUX0NTX0VORFBPSU5UCQkoVVNCX1RZUEVfQ0xBU1MgfCBVU0JfRFRfRU5EUE9JTlQpCisKKy8qIEFsbCBzdGFuZGFyZCBkZXNjcmlwdG9ycyBoYXZlIHRoZXNlIDIgZmllbGRzIGF0IHRoZSBiZWdpbm5pbmcgKi8KK3N0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVVNCX0RUX0RFVklDRTogRGV2aWNlIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCisJX19sZTE2IGJjZFVTQjsKKwlfX3U4ICBiRGV2aWNlQ2xhc3M7CisJX191OCAgYkRldmljZVN1YkNsYXNzOworCV9fdTggIGJEZXZpY2VQcm90b2NvbDsKKwlfX3U4ICBiTWF4UGFja2V0U2l6ZTA7CisJX19sZTE2IGlkVmVuZG9yOworCV9fbGUxNiBpZFByb2R1Y3Q7CisJX19sZTE2IGJjZERldmljZTsKKwlfX3U4ICBpTWFudWZhY3R1cmVyOworCV9fdTggIGlQcm9kdWN0OworCV9fdTggIGlTZXJpYWxOdW1iZXI7CisJX191OCAgYk51bUNvbmZpZ3VyYXRpb25zOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVVNCX0RUX0RFVklDRV9TSVpFCQkxOAorCisKKy8qCisgKiBEZXZpY2UgYW5kL29yIEludGVyZmFjZSBDbGFzcyBjb2RlcworICogYXMgZm91bmQgaW4gYkRldmljZUNsYXNzIG9yIGJJbnRlcmZhY2VDbGFzcworICogYW5kIGRlZmluZWQgYnkgd3d3LnVzYi5vcmcgZG9jdW1lbnRzCisgKi8KKyNkZWZpbmUgVVNCX0NMQVNTX1BFUl9JTlRFUkZBQ0UJCTAJLyogZm9yIERldmljZUNsYXNzICovCisjZGVmaW5lIFVTQl9DTEFTU19BVURJTwkJCTEKKyNkZWZpbmUgVVNCX0NMQVNTX0NPTU0JCQkyCisjZGVmaW5lIFVTQl9DTEFTU19ISUQJCQkzCisjZGVmaW5lIFVTQl9DTEFTU19QSFlTSUNBTAkJNQorI2RlZmluZSBVU0JfQ0xBU1NfU1RJTExfSU1BR0UJCTYKKyNkZWZpbmUgVVNCX0NMQVNTX1BSSU5URVIJCTcKKyNkZWZpbmUgVVNCX0NMQVNTX01BU1NfU1RPUkFHRQkJOAorI2RlZmluZSBVU0JfQ0xBU1NfSFVCCQkJOQorI2RlZmluZSBVU0JfQ0xBU1NfQ0RDX0RBVEEJCTB4MGEKKyNkZWZpbmUgVVNCX0NMQVNTX0NTQ0lECQkJMHgwYgkvKiBjaGlwKyBzbWFydCBjYXJkICovCisjZGVmaW5lIFVTQl9DTEFTU19DT05URU5UX1NFQwkJMHgwZAkvKiBjb250ZW50IHNlY3VyaXR5ICovCisjZGVmaW5lIFVTQl9DTEFTU19WSURFTwkJCTB4MGUKKyNkZWZpbmUgVVNCX0NMQVNTX1dJUkVMRVNTX0NPTlRST0xMRVIJMHhlMAorI2RlZmluZSBVU0JfQ0xBU1NfTUlTQwkJCTB4ZWYKKyNkZWZpbmUgVVNCX0NMQVNTX0FQUF9TUEVDCQkweGZlCisjZGVmaW5lIFVTQl9DTEFTU19WRU5ET1JfU1BFQwkJMHhmZgorCisjZGVmaW5lIFVTQl9TVUJDTEFTU19WRU5ET1JfU1BFQwkweGZmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9EVF9DT05GSUc6IENvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciBpbmZvcm1hdGlvbi4KKyAqCisgKiBVU0JfRFRfT1RIRVJfU1BFRURfQ09ORklHIGlzIHRoZSBzYW1lIGRlc2NyaXB0b3IsIGV4Y2VwdCB0aGF0IHRoZQorICogZGVzY3JpcHRvciB0eXBlIGlzIGRpZmZlcmVudC4gIEhpZ2hzcGVlZC1jYXBhYmxlIGRldmljZXMgY2FuIGxvb2sKKyAqIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gd2hhdCBzcGVlZCB0aGV5J3JlIGN1cnJlbnRseSBydW5uaW5nLiAgT25seQorICogZGV2aWNlcyB3aXRoIGEgVVNCX0RUX0RFVklDRV9RVUFMSUZJRVIgaGF2ZSBhbnkgT1RIRVJfU1BFRURfQ09ORklHCisgKiBkZXNjcmlwdG9ycy4KKyAqLworc3RydWN0IHVzYl9jb25maWdfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX2xlMTYgd1RvdGFsTGVuZ3RoOworCV9fdTggIGJOdW1JbnRlcmZhY2VzOworCV9fdTggIGJDb25maWd1cmF0aW9uVmFsdWU7CisJX191OCAgaUNvbmZpZ3VyYXRpb247CisJX191OCAgYm1BdHRyaWJ1dGVzOworCV9fdTggIGJNYXhQb3dlcjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFVTQl9EVF9DT05GSUdfU0laRQkJOQorCisvKiBmcm9tIGNvbmZpZyBkZXNjcmlwdG9yIGJtQXR0cmlidXRlcyAqLworI2RlZmluZSBVU0JfQ09ORklHX0FUVF9PTkUJCSgxIDw8IDcpCS8qIG11c3QgYmUgc2V0ICovCisjZGVmaW5lIFVTQl9DT05GSUdfQVRUX1NFTEZQT1dFUgkoMSA8PCA2KQkvKiBzZWxmIHBvd2VyZWQgKi8KKyNkZWZpbmUgVVNCX0NPTkZJR19BVFRfV0FLRVVQCQkoMSA8PCA1KQkvKiBjYW4gd2FrZXVwICovCisjZGVmaW5lIFVTQl9DT05GSUdfQVRUX0JBVFRFUlkJCSgxIDw8IDQpCS8qIGJhdHRlcnkgcG93ZXJlZCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfU1RSSU5HOiBTdHJpbmcgZGVzY3JpcHRvciAqLworc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX2xlMTYgd0RhdGFbMV07CQkvKiBVVEYtMTZMRSBlbmNvZGVkICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogbm90ZSB0aGF0ICJzdHJpbmciIHplcm8gaXMgc3BlY2lhbCwgaXQgaG9sZHMgbGFuZ3VhZ2UgY29kZXMgdGhhdAorICogdGhlIGRldmljZSBzdXBwb3J0cywgbm90IFVuaWNvZGUgY2hhcmFjdGVycy4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfSU5URVJGQUNFOiBJbnRlcmZhY2UgZGVzY3JpcHRvciAqLworc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX3U4ICBiSW50ZXJmYWNlTnVtYmVyOworCV9fdTggIGJBbHRlcm5hdGVTZXR0aW5nOworCV9fdTggIGJOdW1FbmRwb2ludHM7CisJX191OCAgYkludGVyZmFjZUNsYXNzOworCV9fdTggIGJJbnRlcmZhY2VTdWJDbGFzczsKKwlfX3U4ICBiSW50ZXJmYWNlUHJvdG9jb2w7CisJX191OCAgaUludGVyZmFjZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFVTQl9EVF9JTlRFUkZBQ0VfU0laRQkJOQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfRU5EUE9JTlQ6IEVuZHBvaW50IGRlc2NyaXB0b3IgKi8KK3N0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX3U4ICBiRW5kcG9pbnRBZGRyZXNzOworCV9fdTggIGJtQXR0cmlidXRlczsKKwlfX2xlMTYgd01heFBhY2tldFNpemU7CisJX191OCAgYkludGVydmFsOworCisJLyogTk9URTogIHRoZXNlIHR3byBhcmUgX29ubHlfIGluIGF1ZGlvIGVuZHBvaW50cy4gKi8KKwkvKiB1c2UgVVNCX0RUX0VORFBPSU5UKl9TSVpFIGluIGJMZW5ndGgsIG5vdCBzaXplb2YuICovCisJX191OCAgYlJlZnJlc2g7CisJX191OCAgYlN5bmNoQWRkcmVzczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFVTQl9EVF9FTkRQT0lOVF9TSVpFCQk3CisjZGVmaW5lIFVTQl9EVF9FTkRQT0lOVF9BVURJT19TSVpFCTkJLyogQXVkaW8gZXh0ZW5zaW9uICovCisKKworLyoKKyAqIEVuZHBvaW50cworICovCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSwkweDBmCS8qIGluIGJFbmRwb2ludEFkZHJlc3MgKi8KKyNkZWZpbmUgVVNCX0VORFBPSU5UX0RJUl9NQVNLCQkweDgwCisKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0sJMHgwMwkvKiBpbiBibUF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTAkwCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MJCTEKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1hGRVJfQlVMSwkJMgorI2RlZmluZSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQJCTMKKyNkZWZpbmUgVVNCX0VORFBPSU5UX01BWF9BREpVU1RBQkxFCTB4ODAKKworI2RlZmluZSBVU0JfRU5EUE9JTlRfU1lOQ1RZUEUJCTB4MGMKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1NZTkNfTk9ORQkJKDAgPDwgMikKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1NZTkNfQVNZTkMJCSgxIDw8IDIpCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9TWU5DX0FEQVBUSVZFCSgyIDw8IDIpCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9TWU5DX1NZTkMJCSgzIDw8IDIpCisKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1VTQUdFX01BU0sJCTB4MzAKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1VTQUdFX0RBVEEJCTB4MDAKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1VTQUdFX0ZFRURCQUNLCTB4MTAKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1VTQUdFX0lNUExJQ0lUX0ZCCTB4MjAJLyogSW1wbGljaXQgZmVlZGJhY2sgRGF0YSBlbmRwb2ludCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIHVzYl9lbmRwb2ludF9udW0gLSBnZXQgdGhlIGVuZHBvaW50J3MgbnVtYmVyCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyBAZXBkJ3MgbnVtYmVyOiAwIHRvIDE1LgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdXNiX2VuZHBvaW50X251bShjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOworfQorCisvKioKKyAqIHVzYl9lbmRwb2ludF90eXBlIC0gZ2V0IHRoZSBlbmRwb2ludCdzIHRyYW5zZmVyIHR5cGUKKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIG9uZSBvZiBVU0JfRU5EUE9JTlRfWEZFUl97Q09OVFJPTCwgSVNPQywgQlVMSywgSU5UfSBhY2NvcmRpbmcKKyAqIHRvIEBlcGQncyB0cmFuc2ZlciB0eXBlLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdXNiX2VuZHBvaW50X3R5cGUoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuIGVwZC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0s7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X2Rpcl9pbiAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgSU4gZGlyZWN0aW9uCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBpcyBvZiB0eXBlIElOLCBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IHVzYl9lbmRwb2ludF9kaXJfaW4oY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuICgoZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX0lOKTsKK30KKworLyoqCisgKiB1c2JfZW5kcG9pbnRfZGlyX291dCAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgT1VUIGRpcmVjdGlvbgorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaXMgb2YgdHlwZSBPVVQsIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdXNiX2VuZHBvaW50X2Rpcl9vdXQoCisJCQkJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuICgoZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX09VVCk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X3hmZXJfYnVsayAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgYnVsayB0cmFuc2ZlciB0eXBlCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBpcyBvZiB0eXBlIGJ1bGssIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdXNiX2VuZHBvaW50X3hmZXJfYnVsaygKKwkJCQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gKChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQorCQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKTsKK30KKworLyoqCisgKiB1c2JfZW5kcG9pbnRfeGZlcl9jb250cm9sIC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGhhcyBjb250cm9sIHRyYW5zZmVyIHR5cGUKKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGlzIG9mIHR5cGUgY29udHJvbCwgb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCB1c2JfZW5kcG9pbnRfeGZlcl9jb250cm9sKAorCQkJCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworCXJldHVybiAoKGVwZC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09CisJCVVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wpOworfQorCisvKioKKyAqIHVzYl9lbmRwb2ludF94ZmVyX2ludCAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgaW50ZXJydXB0IHRyYW5zZmVyIHR5cGUKKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGlzIG9mIHR5cGUgaW50ZXJydXB0LCBvdGhlcndpc2UgaXQgcmV0dXJucworICogZmFsc2UuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCB1c2JfZW5kcG9pbnRfeGZlcl9pbnQoCisJCQkJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuICgoZXBkLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0KKwkJVVNCX0VORFBPSU5UX1hGRVJfSU5UKTsKK30KKworLyoqCisgKiB1c2JfZW5kcG9pbnRfeGZlcl9pc29jIC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGhhcyBpc29jaHJvbm91cyB0cmFuc2ZlciB0eXBlCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBpcyBvZiB0eXBlIGlzb2Nocm9ub3VzLCBvdGhlcndpc2UgaXQgcmV0dXJucworICogZmFsc2UuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCB1c2JfZW5kcG9pbnRfeGZlcl9pc29jKAorCQkJCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworCXJldHVybiAoKGVwZC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09CisJCVVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpOworfQorCisvKioKKyAqIHVzYl9lbmRwb2ludF9pc19idWxrX2luIC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGlzIGJ1bGsgSU4KKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGhhcyBidWxrIHRyYW5zZmVyIHR5cGUgYW5kIElOIGRpcmVjdGlvbiwKKyAqIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdXNiX2VuZHBvaW50X2lzX2J1bGtfaW4oCisJCQkJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuIHVzYl9lbmRwb2ludF94ZmVyX2J1bGsoZXBkKSAmJiB1c2JfZW5kcG9pbnRfZGlyX2luKGVwZCk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0IC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGlzIGJ1bGsgT1VUCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBoYXMgYnVsayB0cmFuc2ZlciB0eXBlIGFuZCBPVVQgZGlyZWN0aW9uLAorICogb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCB1c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoCisJCQkJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuIHVzYl9lbmRwb2ludF94ZmVyX2J1bGsoZXBkKSAmJiB1c2JfZW5kcG9pbnRfZGlyX291dChlcGQpOworfQorCisvKioKKyAqIHVzYl9lbmRwb2ludF9pc19pbnRfaW4gLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaXMgaW50ZXJydXB0IElOCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBoYXMgaW50ZXJydXB0IHRyYW5zZmVyIHR5cGUgYW5kIElOIGRpcmVjdGlvbiwKKyAqIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdXNiX2VuZHBvaW50X2lzX2ludF9pbigKKwkJCQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gdXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkgJiYgdXNiX2VuZHBvaW50X2Rpcl9pbihlcGQpOworfQorCisvKioKKyAqIHVzYl9lbmRwb2ludF9pc19pbnRfb3V0IC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGlzIGludGVycnVwdCBPVVQKKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGhhcyBpbnRlcnJ1cHQgdHJhbnNmZXIgdHlwZSBhbmQgT1VUIGRpcmVjdGlvbiwKKyAqIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdXNiX2VuZHBvaW50X2lzX2ludF9vdXQoCisJCQkJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuIHVzYl9lbmRwb2ludF94ZmVyX2ludChlcGQpICYmIHVzYl9lbmRwb2ludF9kaXJfb3V0KGVwZCk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X2lzX2lzb2NfaW4gLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaXMgaXNvY2hyb25vdXMgSU4KKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGhhcyBpc29jaHJvbm91cyB0cmFuc2ZlciB0eXBlIGFuZCBJTiBkaXJlY3Rpb24sCisgKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IHVzYl9lbmRwb2ludF9pc19pc29jX2luKAorCQkJCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworCXJldHVybiB1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGVwZCkgJiYgdXNiX2VuZHBvaW50X2Rpcl9pbihlcGQpOworfQorCisvKioKKyAqIHVzYl9lbmRwb2ludF9pc19pc29jX291dCAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBpc29jaHJvbm91cyBPVVQKKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGhhcyBpc29jaHJvbm91cyB0cmFuc2ZlciB0eXBlIGFuZCBPVVQgZGlyZWN0aW9uLAorICogb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCB1c2JfZW5kcG9pbnRfaXNfaXNvY19vdXQoCisJCQkJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuIHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZXBkKSAmJiB1c2JfZW5kcG9pbnRfZGlyX291dChlcGQpOworfQorCisvKioKKyAqIHVzYl9lbmRwb2ludF9tYXhwIC0gZ2V0IGVuZHBvaW50J3MgbWF4IHBhY2tldCBzaXplCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyBAZXBkJ3MgbWF4IHBhY2tldAorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdXNiX2VuZHBvaW50X21heHAoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuIF9fbGUxNl90b19jcHUoZXBkLT53TWF4UGFja2V0U2l6ZSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9EVF9TU19FTkRQT0lOVF9DT01QOiBTdXBlclNwZWVkIEVuZHBvaW50IENvbXBhbmlvbiBkZXNjcmlwdG9yICovCitzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX3U4ICBiTWF4QnVyc3Q7CisJX191OCAgYm1BdHRyaWJ1dGVzOworCV9fbGUxNiB3Qnl0ZXNQZXJJbnRlcnZhbDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFVTQl9EVF9TU19FUF9DT01QX1NJWkUJCTYKKworLyogQml0cyA0OjAgb2YgYm1BdHRyaWJ1dGVzIGlmIHRoaXMgaXMgYSBidWxrIGVuZHBvaW50ICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQKK3VzYl9zc19tYXhfc3RyZWFtcyhjb25zdCBzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciAqY29tcCkKK3sKKwlpbnQJCW1heF9zdHJlYW1zOworCisJaWYgKCFjb21wKQorCQlyZXR1cm4gMDsKKworCW1heF9zdHJlYW1zID0gY29tcC0+Ym1BdHRyaWJ1dGVzICYgMHgxZjsKKworCWlmICghbWF4X3N0cmVhbXMpCisJCXJldHVybiAwOworCisJbWF4X3N0cmVhbXMgPSAxIDw8IG1heF9zdHJlYW1zOworCisJcmV0dXJuIG1heF9zdHJlYW1zOworfQorCisvKiBCaXRzIDE6MCBvZiBibUF0dHJpYnV0ZXMgaWYgdGhpcyBpcyBhbiBpc29jIGVuZHBvaW50ICovCisjZGVmaW5lIFVTQl9TU19NVUxUKHApCQkJKDEgKyAoKHApICYgMHgzKSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVVNCX0RUX0RFVklDRV9RVUFMSUZJRVI6IERldmljZSBRdWFsaWZpZXIgZGVzY3JpcHRvciAqLworc3RydWN0IHVzYl9xdWFsaWZpZXJfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX2xlMTYgYmNkVVNCOworCV9fdTggIGJEZXZpY2VDbGFzczsKKwlfX3U4ICBiRGV2aWNlU3ViQ2xhc3M7CisJX191OCAgYkRldmljZVByb3RvY29sOworCV9fdTggIGJNYXhQYWNrZXRTaXplMDsKKwlfX3U4ICBiTnVtQ29uZmlndXJhdGlvbnM7CisJX191OCAgYlJFU0VSVkVEOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVVNCX0RUX09URyAoZnJvbSBPVEcgMS4wYSBzdXBwbGVtZW50KSAqLworc3RydWN0IHVzYl9vdGdfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX3U4ICBibUF0dHJpYnV0ZXM7CS8qIHN1cHBvcnQgZm9yIEhOUCwgU1JQLCBldGMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBmcm9tIHVzYl9vdGdfZGVzY3JpcHRvci5ibUF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgVVNCX09UR19TUlAJCSgxIDw8IDApCisjZGVmaW5lIFVTQl9PVEdfSE5QCQkoMSA8PCAxKQkvKiBzd2FwIGhvc3QvZGV2aWNlIHJvbGVzICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9EVF9ERUJVRzogIGZvciBzcGVjaWFsIGhpZ2hzcGVlZCBkZXZpY2VzLCByZXBsYWNpbmcgc2VyaWFsIGNvbnNvbGUgKi8KK3N0cnVjdCB1c2JfZGVidWdfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwkvKiBidWxrIGVuZHBvaW50cyB3aXRoIDggYnl0ZSBtYXhwYWNrZXQgKi8KKwlfX3U4ICBiRGVidWdJbkVuZHBvaW50OworCV9fdTggIGJEZWJ1Z091dEVuZHBvaW50OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVVNCX0RUX0lOVEVSRkFDRV9BU1NPQ0lBVElPTjogZ3JvdXBzIGludGVyZmFjZXMgKi8KK3N0cnVjdCB1c2JfaW50ZXJmYWNlX2Fzc29jX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCisJX191OCAgYkZpcnN0SW50ZXJmYWNlOworCV9fdTggIGJJbnRlcmZhY2VDb3VudDsKKwlfX3U4ICBiRnVuY3Rpb25DbGFzczsKKwlfX3U4ICBiRnVuY3Rpb25TdWJDbGFzczsKKwlfX3U4ICBiRnVuY3Rpb25Qcm90b2NvbDsKKwlfX3U4ICBpRnVuY3Rpb247Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfU0VDVVJJVFk6ICBncm91cCBvZiB3aXJlbGVzcyBzZWN1cml0eSBkZXNjcmlwdG9ycywgaW5jbHVkaW5nCisgKiBlbmNyeXB0aW9uIHR5cGVzIGF2YWlsYWJsZSBmb3Igc2V0dGluZyB1cCBhIENDL2Fzc29jaWF0aW9uLgorICovCitzdHJ1Y3QgdXNiX3NlY3VyaXR5X2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCisJX19sZTE2IHdUb3RhbExlbmd0aDsKKwlfX3U4ICBiTnVtRW5jcnlwdGlvblR5cGVzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVVNCX0RUX0tFWTogIHVzZWQgd2l0aCB7R0VULFNFVH1fU0VDVVJJVFlfREFUQTsgb25seSBwdWJsaWMga2V5cworICogbWF5IGJlIHJldHJpZXZlZC4KKyAqLworc3RydWN0IHVzYl9rZXlfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX3U4ICB0VEtJRFszXTsKKwlfX3U4ICBiUmVzZXJ2ZWQ7CisJX191OCAgYktleURhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfRU5DUllQVElPTl9UWVBFOiAgYnVuZGxlZCBpbiBEVF9TRUNVUklUWSBncm91cHMgKi8KK3N0cnVjdCB1c2JfZW5jcnlwdGlvbl9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKworCV9fdTggIGJFbmNyeXB0aW9uVHlwZTsKKyNkZWZpbmUJVVNCX0VOQ19UWVBFX1VOU0VDVVJFCQkwCisjZGVmaW5lCVVTQl9FTkNfVFlQRV9XSVJFRAkJMQkvKiBub24td2lyZWxlc3MgbW9kZSAqLworI2RlZmluZQlVU0JfRU5DX1RZUEVfQ0NNXzEJCTIJLyogYWVzMTI4L2NiYyBzZXNzaW9uICovCisjZGVmaW5lCVVTQl9FTkNfVFlQRV9SU0FfMQkJMwkvKiByc2EzMDcyL3NoYTEgYXV0aCAqLworCV9fdTggIGJFbmNyeXB0aW9uVmFsdWU7CQkvKiB1c2UgaW4gU0VUX0VOQ1JZUFRJT04gKi8KKwlfX3U4ICBiQXV0aEtleUluZGV4OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfQk9TOiAgZ3JvdXAgb2YgZGV2aWNlLWxldmVsIGNhcGFiaWxpdGllcyAqLworc3RydWN0IHVzYl9ib3NfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX2xlMTYgd1RvdGFsTGVuZ3RoOworCV9fdTggIGJOdW1EZXZpY2VDYXBzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBVU0JfRFRfQk9TX1NJWkUJCTUKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9EVF9ERVZJQ0VfQ0FQQUJJTElUWTogIGdyb3VwZWQgd2l0aCBCT1MgKi8KK3N0cnVjdCB1c2JfZGV2X2NhcF9oZWFkZXIgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXZDYXBhYmlsaXR5VHlwZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUJVVNCX0NBUF9UWVBFX1dJUkVMRVNTX1VTQgkxCisKK3N0cnVjdCB1c2Jfd2lyZWxlc3NfY2FwX2Rlc2NyaXB0b3IgewkvKiBVbHRyYSBXaWRlIEJhbmQgKi8KKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGV2Q2FwYWJpbGl0eVR5cGU7CisKKwlfX3U4ICBibUF0dHJpYnV0ZXM7CisjZGVmaW5lCVVTQl9XSVJFTEVTU19QMlBfRFJECQkoMSA8PCAxKQorI2RlZmluZQlVU0JfV0lSRUxFU1NfQkVBQ09OX01BU0sJKDMgPDwgMikKKyNkZWZpbmUJVVNCX1dJUkVMRVNTX0JFQUNPTl9TRUxGCSgxIDw8IDIpCisjZGVmaW5lCVVTQl9XSVJFTEVTU19CRUFDT05fRElSRUNURUQJKDIgPDwgMikKKyNkZWZpbmUJVVNCX1dJUkVMRVNTX0JFQUNPTl9OT05FCSgzIDw8IDIpCisJX19sZTE2IHdQSFlSYXRlczsJLyogYml0IHJhdGVzLCBNYnBzICovCisjZGVmaW5lCVVTQl9XSVJFTEVTU19QSFlfNTMJCSgxIDw8IDApCS8qIGFsd2F5cyBzZXQgKi8KKyNkZWZpbmUJVVNCX1dJUkVMRVNTX1BIWV84MAkJKDEgPDwgMSkKKyNkZWZpbmUJVVNCX1dJUkVMRVNTX1BIWV8xMDcJCSgxIDw8IDIpCS8qIGFsd2F5cyBzZXQgKi8KKyNkZWZpbmUJVVNCX1dJUkVMRVNTX1BIWV8xNjAJCSgxIDw8IDMpCisjZGVmaW5lCVVTQl9XSVJFTEVTU19QSFlfMjAwCQkoMSA8PCA0KQkvKiBhbHdheXMgc2V0ICovCisjZGVmaW5lCVVTQl9XSVJFTEVTU19QSFlfMzIwCQkoMSA8PCA1KQorI2RlZmluZQlVU0JfV0lSRUxFU1NfUEhZXzQwMAkJKDEgPDwgNikKKyNkZWZpbmUJVVNCX1dJUkVMRVNTX1BIWV80ODAJCSgxIDw8IDcpCisJX191OCAgYm1URklUWFBvd2VySW5mbzsJLyogVEZJIHBvd2VyIGxldmVscyAqLworCV9fdTggIGJtRkZJVFhQb3dlckluZm87CS8qIEZGSSBwb3dlciBsZXZlbHMgKi8KKwlfX2xlMTYgYm1CYW5kR3JvdXA7CisJX191OCAgYlJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogVVNCIDIuMCBFeHRlbnNpb24gZGVzY3JpcHRvciAqLworI2RlZmluZQlVU0JfQ0FQX1RZUEVfRVhUCQkyCisKK3N0cnVjdCB1c2JfZXh0X2NhcF9kZXNjcmlwdG9yIHsJCS8qIExpbmsgUG93ZXIgTWFuYWdlbWVudCAqLworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXZDYXBhYmlsaXR5VHlwZTsKKwlfX2xlMzIgYm1BdHRyaWJ1dGVzOworI2RlZmluZSBVU0JfTFBNX1NVUFBPUlQJCQkoMSA8PCAxKQkvKiBzdXBwb3J0cyBMUE0gKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgVVNCX0RUX1VTQl9FWFRfQ0FQX1NJWkUJNworCisvKgorICogU3VwZXJTcGVlZCBVU0IgQ2FwYWJpbGl0eSBkZXNjcmlwdG9yOiBEZWZpbmVzIHRoZSBzZXQgb2YgU3VwZXJTcGVlZCBVU0IKKyAqIHNwZWNpZmljIGRldmljZSBsZXZlbCBjYXBhYmlsaXRpZXMKKyAqLworI2RlZmluZQkJVVNCX1NTX0NBUF9UWVBFCQkzCitzdHJ1Y3QgdXNiX3NzX2NhcF9kZXNjcmlwdG9yIHsJCS8qIExpbmsgUG93ZXIgTWFuYWdlbWVudCAqLworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXZDYXBhYmlsaXR5VHlwZTsKKwlfX3U4ICBibUF0dHJpYnV0ZXM7CisjZGVmaW5lIFVTQl9MVE1fU1VQUE9SVAkJCSgxIDw8IDEpIC8qIHN1cHBvcnRzIExUTSAqLworCV9fbGUxNiB3U3BlZWRTdXBwb3J0ZWQ7CisjZGVmaW5lIFVTQl9MT1dfU1BFRURfT1BFUkFUSU9OCQkoMSkJIC8qIExvdyBzcGVlZCBvcGVyYXRpb24gKi8KKyNkZWZpbmUgVVNCX0ZVTExfU1BFRURfT1BFUkFUSU9OCSgxIDw8IDEpIC8qIEZ1bGwgc3BlZWQgb3BlcmF0aW9uICovCisjZGVmaW5lIFVTQl9ISUdIX1NQRUVEX09QRVJBVElPTgkoMSA8PCAyKSAvKiBIaWdoIHNwZWVkIG9wZXJhdGlvbiAqLworI2RlZmluZSBVU0JfNUdCUFNfT1BFUkFUSU9OCQkoMSA8PCAzKSAvKiBPcGVyYXRpb24gYXQgNUdicHMgKi8KKwlfX3U4ICBiRnVuY3Rpb25hbGl0eVN1cHBvcnQ7CisJX191OCAgYlUxZGV2RXhpdExhdDsKKwlfX2xlMTYgYlUyRGV2RXhpdExhdDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgVVNCX0RUX1VTQl9TU19DQVBfU0laRQkxMAorCisvKgorICogQ29udGFpbmVyIElEIENhcGFiaWxpdHkgZGVzY3JpcHRvcjogRGVmaW5lcyB0aGUgaW5zdGFuY2UgdW5pcXVlIElEIHVzZWQgdG8KKyAqIGlkZW50aWZ5IHRoZSBpbnN0YW5jZSBhY3Jvc3MgYWxsIG9wZXJhdGluZyBtb2RlcworICovCisjZGVmaW5lCUNPTlRBSU5FUl9JRF9UWVBFCTQKK3N0cnVjdCB1c2Jfc3NfY29udGFpbmVyX2lkX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXZDYXBhYmlsaXR5VHlwZTsKKwlfX3U4ICBiUmVzZXJ2ZWQ7CisJX191OCAgQ29udGFpbmVySURbMTZdOyAvKiAxMjgtYml0IG51bWJlciAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBVU0JfRFRfVVNCX1NTX0NPTlROX0lEX1NJWkUJMjAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9EVF9XSVJFTEVTU19FTkRQT0lOVF9DT01QOiAgY29tcGFuaW9uIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoCisgKiBlYWNoIGVuZHBvaW50IGRlc2NyaXB0b3IgZm9yIGEgd2lyZWxlc3MgZGV2aWNlCisgKi8KK3N0cnVjdCB1c2Jfd2lyZWxlc3NfZXBfY29tcF9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKworCV9fdTggIGJNYXhCdXJzdDsKKwlfX3U4ICBiTWF4U2VxdWVuY2U7CisJX19sZTE2IHdNYXhTdHJlYW1EZWxheTsKKwlfX2xlMTYgd092ZXJUaGVBaXJQYWNrZXRTaXplOworCV9fdTggIGJPdmVyVGhlQWlySW50ZXJ2YWw7CisJX191OCAgYm1Db21wQXR0cmlidXRlczsKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1NXSVRDSF9NQVNLCTB4MDMJLyogaW4gYm1Db21wQXR0cmlidXRlcyAqLworI2RlZmluZSBVU0JfRU5EUE9JTlRfU1dJVENIX05PCQkwCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9TV0lUQ0hfU1dJVENICTEKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1NXSVRDSF9TQ0FMRQkyCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfUkVRX1NFVF9IQU5EU0hBS0UgaXMgYSBmb3VyLXdheSBoYW5kc2hha2UgdXNlZCBiZXR3ZWVuIGEgd2lyZWxlc3MKKyAqIGhvc3QgYW5kIGEgZGV2aWNlIGZvciBjb25uZWN0aW9uIHNldCB1cCwgbXV0dWFsIGF1dGhlbnRpY2F0aW9uLCBhbmQKKyAqIGV4Y2hhbmdpbmcgc2hvcnQgbGl2ZWQgc2Vzc2lvbiBrZXlzLiAgVGhlIGhhbmRzaGFrZSBkZXBlbmRzIG9uIGEgQ0MuCisgKi8KK3N0cnVjdCB1c2JfaGFuZHNoYWtlIHsKKwlfX3U4IGJNZXNzYWdlTnVtYmVyOworCV9fdTggYlN0YXR1czsKKwlfX3U4IHRUS0lEWzNdOworCV9fdTggYlJlc2VydmVkOworCV9fdTggQ0RJRFsxNl07CisJX191OCBub25jZVsxNl07CisJX191OCBNSUNbOF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfUkVRX1NFVF9DT05ORUNUSU9OIG1vZGlmaWVzIG9yIHJldm9rZXMgYSBjb25uZWN0aW9uIGNvbnRleHQgKENDKS4KKyAqIEEgQ0MgbWF5IGFsc28gYmUgc2V0IHVwIHVzaW5nIG5vbi13aXJlbGVzcyBzZWN1cmUgY2hhbm5lbHMgKGluY2x1ZGluZworICogd2lyZWQgVVNCISksIGFuZCBzb21lIGRldmljZXMgbWF5IHN1cHBvcnQgQ0NzIHdpdGggbXVsdGlwbGUgaG9zdHMuCisgKi8KK3N0cnVjdCB1c2JfY29ubmVjdGlvbl9jb250ZXh0IHsKKwlfX3U4IENISURbMTZdOwkJLyogcGVyc2lzdGVudCBob3N0IGlkICovCisJX191OCBDRElEWzE2XTsJCS8qIGRldmljZSBpZCAodW5pcXVlIHcvaW4gaG9zdCBjb250ZXh0KSAqLworCV9fdTggQ0tbMTZdOwkJLyogY29ubmVjdGlvbiBrZXkgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQiAyLjAgZGVmaW5lcyB0aHJlZSBzcGVlZHMsIGhlcmUncyBob3cgTGludXggaWRlbnRpZmllcyB0aGVtICovCisKK2VudW0gdXNiX2RldmljZV9zcGVlZCB7CisJVVNCX1NQRUVEX1VOS05PV04gPSAwLAkJCS8qIGVudW1lcmF0aW5nICovCisJVVNCX1NQRUVEX0xPVywgVVNCX1NQRUVEX0ZVTEwsCQkvKiB1c2IgMS4xICovCisJVVNCX1NQRUVEX0hJR0gsCQkJCS8qIHVzYiAyLjAgKi8KKwlVU0JfU1BFRURfV0lSRUxFU1MsCQkJLyogd2lyZWxlc3MgKHVzYiAyLjUpICovCisJVVNCX1NQRUVEX1NVUEVSLAkJCS8qIHVzYiAzLjAgKi8KK307CisKKworZW51bSB1c2JfZGV2aWNlX3N0YXRlIHsKKwkvKiBOT1RBVFRBQ0hFRCBpc24ndCBpbiB0aGUgVVNCIHNwZWMsIGFuZCB0aGlzIHN0YXRlIGFjdHMKKwkgKiB0aGUgc2FtZSBhcyBBVFRBQ0hFRCAuLi4gYnV0IGl0J3MgY2xlYXJlciB0aGlzIHdheS4KKwkgKi8KKwlVU0JfU1RBVEVfTk9UQVRUQUNIRUQgPSAwLAorCisJLyogY2hhcHRlciA5IGFuZCBhdXRoZW50aWNhdGlvbiAod2lyZWxlc3MpIGRldmljZSBzdGF0ZXMgKi8KKwlVU0JfU1RBVEVfQVRUQUNIRUQsCisJVVNCX1NUQVRFX1BPV0VSRUQsCQkJLyogd2lyZWQgKi8KKwlVU0JfU1RBVEVfUkVDT05ORUNUSU5HLAkJCS8qIGF1dGggKi8KKwlVU0JfU1RBVEVfVU5BVVRIRU5USUNBVEVELAkJLyogYXV0aCAqLworCVVTQl9TVEFURV9ERUZBVUxULAkJCS8qIGxpbWl0ZWQgZnVuY3Rpb24gKi8KKwlVU0JfU1RBVEVfQUREUkVTUywKKwlVU0JfU1RBVEVfQ09ORklHVVJFRCwJCQkvKiBtb3N0IGZ1bmN0aW9ucyAqLworCisJVVNCX1NUQVRFX1NVU1BFTkRFRAorCisJLyogTk9URTogIHRoZXJlIGFyZSBhY3R1YWxseSBmb3VyIGRpZmZlcmVudCBTVVNQRU5ERUQKKwkgKiBzdGF0ZXMsIHJldHVybmluZyB0byBQT1dFUkVELCBERUZBVUxULCBBRERSRVNTLCBvcgorCSAqIENPTkZJR1VSRUQgcmVzcGVjdGl2ZWx5IHdoZW4gU09GIHRva2VucyBmbG93IGFnYWluLgorCSAqIEF0IHRoaXMgbGV2ZWwgdGhlcmUncyBubyBkaWZmZXJlbmNlIGJldHdlZW4gTDEgYW5kIEwyCisJICogc3VzcGVuZCBzdGF0ZXMuICAoTDIgYmVpbmcgb3JpZ2luYWwgVVNCIDEuMSBzdXNwZW5kLikKKwkgKi8KK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBBcyBwZXIgVVNCIGNvbXBsaWFuY2UgdXBkYXRlLCBhIGRldmljZSB0aGF0IGlzIGFjdGl2ZWx5IGRyYXdpbmcKKyAqIG1vcmUgdGhhbiAxMDBtQSBmcm9tIFVTQiBtdXN0IHJlcG9ydCBpdHNlbGYgYXMgYnVzLXBvd2VyZWQgaW4KKyAqIHRoZSBHZXRTdGF0dXMoREVWSUNFKSBjYWxsLgorICogaHR0cDovL2NvbXBsaWFuY2UudXNiLm9yZy9pbmRleC5hc3A/VXBkYXRlRmlsZT1FbGVjdHJpY2FsJkZvcm1hdD1TdGFuZGFyZCMzNAorICovCisjZGVmaW5lIFVTQl9TRUxGX1BPV0VSX1ZCVVNfTUFYX0RSQVcJCTEwMAorCisjZW5kaWYgLyogX19MSU5VWF9VU0JfQ0g5X0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2Z1bmN0aW9uZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2Z1bmN0aW9uZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2EzZjMwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvZnVuY3Rpb25mcy5oCkBAIC0wLDAgKzEsMTY3IEBACisjaWZuZGVmIF9fTElOVVhfRlVOQ1RJT05GU19IX18KKyNkZWZpbmUgX19MSU5VWF9GVU5DVElPTkZTX0hfXyAxCisKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KKworCitlbnVtIHsKKwlGVU5DVElPTkZTX0RFU0NSSVBUT1JTX01BR0lDID0gMSwKKwlGVU5DVElPTkZTX1NUUklOR1NfTUFHSUMgICAgID0gMgorfTsKKworCisKKy8qIERlc2NyaXB0b3Igb2YgYW4gbm9uLWF1ZGlvIGVuZHBvaW50ICovCitzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8geworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCisJX191OCAgYkVuZHBvaW50QWRkcmVzczsKKwlfX3U4ICBibUF0dHJpYnV0ZXM7CisJX19sZTE2IHdNYXhQYWNrZXRTaXplOworCV9fdTggIGJJbnRlcnZhbDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyoKKyAqIEFsbCBudW1iZXJzIG11c3QgYmUgaW4gbGl0dGxlIGVuZGlhbiBvcmRlci4KKyAqLworCitzdHJ1Y3QgdXNiX2Z1bmN0aW9uZnNfZGVzY3NfaGVhZCB7CisJX19sZTMyIG1hZ2ljOworCV9fbGUzMiBsZW5ndGg7CisJX19sZTMyIGZzX2NvdW50OworCV9fbGUzMiBoc19jb3VudDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qCisgKiBEZXNjcmlwdG9ycyBmb3JtYXQ6CisgKgorICogfCBvZmYgfCBuYW1lICAgICAgfCB0eXBlICAgICAgICAgfCBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfC0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgIDAgfCBtYWdpYyAgICAgfCBMRTMyICAgICAgICAgfCBGVU5DVElPTkZTX3tGUyxIU31fREVTQ1JJUFRPUlNfTUFHSUMgfAorICogfCAgIDQgfCBsZW5ndGggICAgfCBMRTMyICAgICAgICAgfCBsZW5ndGggb2YgdGhlIHdob2xlIGRhdGEgY2h1bmsgICAgICAgfAorICogfCAgIDggfCBmc19jb3VudCAgfCBMRTMyICAgICAgICAgfCBudW1iZXIgb2YgZnVsbC1zcGVlZCBkZXNjcmlwdG9ycyAgICAgfAorICogfCAgMTIgfCBoc19jb3VudCAgfCBMRTMyICAgICAgICAgfCBudW1iZXIgb2YgaGlnaC1zcGVlZCBkZXNjcmlwdG9ycyAgICAgfAorICogfCAgMTYgfCBmc19kZXNjcnMgfCBEZXNjcmlwdG9yW10gfCBsaXN0IG9mIGZ1bGwtc3BlZWQgZGVzY3JpcHRvcnMgICAgICAgfAorICogfCAgICAgfCBoc19kZXNjcnMgfCBEZXNjcmlwdG9yW10gfCBsaXN0IG9mIGhpZ2gtc3BlZWQgZGVzY3JpcHRvcnMgICAgICAgfAorICoKKyAqIGRlc2NzIGFyZSBqdXN0IHZhbGlkIFVTQiBkZXNjcmlwdG9ycyBhbmQgaGF2ZSB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKyAqCisgKiB8IG9mZiB8IG5hbWUgICAgICAgICAgICB8IHR5cGUgfCBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgfAorICogfC0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAwIHwgYkxlbmd0aCAgICAgICAgIHwgVTggICB8IGxlbmd0aCBvZiB0aGUgZGVzY3JpcHRvciB8CisgKiB8ICAgMSB8IGJEZXNjcmlwdG9yVHlwZSB8IFU4ICAgfCBkZXNjcmlwdG9yIHR5cGUgICAgICAgICAgfAorICogfCAgIDIgfCBwYXlsb2FkICAgICAgICAgfCAgICAgIHwgZGVzY3JpcHRvcidzIHBheWxvYWQgICAgIHwKKyAqLworCitzdHJ1Y3QgdXNiX2Z1bmN0aW9uZnNfc3RyaW5nc19oZWFkIHsKKwlfX2xlMzIgbWFnaWM7CisJX19sZTMyIGxlbmd0aDsKKwlfX2xlMzIgc3RyX2NvdW50OworCV9fbGUzMiBsYW5nX2NvdW50OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoKKyAqIFN0cmluZ3MgZm9ybWF0OgorICoKKyAqIHwgb2ZmIHwgbmFtZSAgICAgICB8IHR5cGUgICAgICAgICAgICAgICAgICB8IGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgIHwKKyAqIHwtLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgICAwIHwgbWFnaWMgICAgICB8IExFMzIgICAgICAgICAgICAgICAgICB8IEZVTkNUSU9ORlNfU1RSSU5HU19NQUdJQyAgIHwKKyAqIHwgICA0IHwgbGVuZ3RoICAgICB8IExFMzIgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiB0aGUgZGF0YSBjaHVuayAgIHwKKyAqIHwgICA4IHwgc3RyX2NvdW50ICB8IExFMzIgICAgICAgICAgICAgICAgICB8IG51bWJlciBvZiBzdHJpbmdzICAgICAgICAgIHwKKyAqIHwgIDEyIHwgbGFuZ19jb3VudCB8IExFMzIgICAgICAgICAgICAgICAgICB8IG51bWJlciBvZiBsYW5ndWFnZXMgICAgICAgIHwKKyAqIHwgIDE2IHwgc3RyaW5ndGFiICB8IFN0cmluZ1RhYltsYW5nX2NvdW50XSB8IHRhYmxlIG9mIHN0cmluZ3MgcGVyIGxhbmcgIHwKKyAqCisgKiBGb3IgZWFjaCBsYW5ndWFnZSB0aGVyZSBpcyBvbmUgc3RyaW5ndGFiIGVudHJ5IChpZS4gdGhlcmUgYXJlIGxhbmdfY291bnQKKyAqIHN0cmluZ3RhYiBlbnRpcmVzKS4gIEVhY2ggU3RyaW5nVGFiIGhhcyBmb2xsb3dpbmcgZm9ybWF0OgorICoKKyAqIHwgb2ZmIHwgbmFtZSAgICB8IHR5cGUgICAgICAgICAgICAgIHwgZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8LS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCAgIDAgfCBsYW5nICAgIHwgTEUxNiAgICAgICAgICAgICAgfCBsYW5ndWFnZSBjb2RlICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAyIHwgc3RyaW5ncyB8IFN0cmluZ1tzdHJfY291bnRdIHwgYXJyYXkgb2Ygc3RyaW5ncyBpbiBnaXZlbiBsYW5ndWFnZSB8CisgKgorICogRm9yIGVhY2ggc3RyaW5nIHRoZXJlIGlzIG9uZSBzdHJpbmdzIGVudHJ5IChpZS4gdGhlcmUgYXJlIHN0cl9jb3VudAorICogc3RyaW5nIGVudHJpZXMpLiAgRWFjaCBTdHJpbmcgaXMgYSBOVUwgdGVybWluYXRlZCBzdHJpbmcgZW5jb2RlZCBpbgorICogVVRGLTguCisgKi8KKworCisKKy8qCisgKiBFdmVudHMgYXJlIGRlbGl2ZXJlZCBvbiB0aGUgZXAwIGZpbGUgZGVzY3JpcHRvciwgd2hlbiB0aGUgdXNlciBtb2RlIGRyaXZlcgorICogcmVhZHMgZnJvbSB0aGlzIGZpbGUgZGVzY3JpcHRvciBhZnRlciB3cml0aW5nIHRoZSBkZXNjcmlwdG9ycy4gIERvbid0CisgKiBzdG9wIHBvbGxpbmcgdGhpcyBkZXNjcmlwdG9yLgorICovCisKK2VudW0gdXNiX2Z1bmN0aW9uZnNfZXZlbnRfdHlwZSB7CisJRlVOQ1RJT05GU19CSU5ELAorCUZVTkNUSU9ORlNfVU5CSU5ELAorCisJRlVOQ1RJT05GU19FTkFCTEUsCisJRlVOQ1RJT05GU19ESVNBQkxFLAorCisJRlVOQ1RJT05GU19TRVRVUCwKKworCUZVTkNUSU9ORlNfU1VTUEVORCwKKwlGVU5DVElPTkZTX1JFU1VNRQorfTsKKworLyogTk9URTogIHRoaXMgc3RydWN0dXJlIG11c3Qgc3RheSB0aGUgc2FtZSBzaXplIGFuZCBsYXlvdXQgb24KKyAqIGJvdGggMzItYml0IGFuZCA2NC1iaXQga2VybmVscy4KKyAqLworc3RydWN0IHVzYl9mdW5jdGlvbmZzX2V2ZW50IHsKKwl1bmlvbiB7CisJCS8qIFNFVFVQOiBwYWNrZXQ7IERBVEEgcGhhc2UgaS9vIHByZWNlZGVzIG5leHQgZXZlbnQKKwkJICooc2V0dXAuYm1SZXF1ZXN0VHlwZSAmIFVTQl9ESVJfSU4pIGZsYWdzIGRpcmVjdGlvbiAqLworCQlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0CXNldHVwOworCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdTsKKworCS8qIGVudW0gdXNiX2Z1bmN0aW9uZnNfZXZlbnRfdHlwZSAqLworCV9fdTgJCQkJdHlwZTsKKwlfX3U4CQkJCV9wYWRbM107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qIEVuZHBvaW50IGlvY3RscyAqLworLyogVGhlIHNhbWUgYXMgaW4gZ2FkZ2V0ZnMgKi8KKworLyogSU4gdHJhbnNmZXJzIG1heSBiZSByZXBvcnRlZCB0byB0aGUgZ2FkZ2V0IGRyaXZlciBhcyBjb21wbGV0ZQorICoJd2hlbiB0aGUgZmlmbyBpcyBsb2FkZWQsIGJlZm9yZSB0aGUgaG9zdCByZWFkcyB0aGUgZGF0YTsKKyAqIE9VVCB0cmFuc2ZlcnMgbWF5IGJlIHJlcG9ydGVkIHRvIHRoZSBob3N0J3MgImNsaWVudCIgZHJpdmVyIGFzCisgKgljb21wbGV0ZSB3aGVuIHRoZXkncmUgc2l0dGluZyBpbiB0aGUgRklGTyB1bnJlYWQuCisgKiBUSElTIHJldHVybnMgaG93IG1hbnkgYnl0ZXMgYXJlICJ1bmNsYWltZWQiIGluIHRoZSBlbmRwb2ludCBmaWZvCisgKiAobmVlZGVkIGZvciBwcmVjaXNlIGZhdWx0IGhhbmRsaW5nLCB3aGVuIHRoZSBoYXJkd2FyZSBhbGxvd3MgaXQpCisgKi8KKyNkZWZpbmUJRlVOQ1RJT05GU19GSUZPX1NUQVRVUwlfSU8oJ2cnLCAxKQorCisvKiBkaXNjYXJkcyBhbnkgdW5jbGFpbWVkIGRhdGEgaW4gdGhlIGZpZm8uICovCisjZGVmaW5lCUZVTkNUSU9ORlNfRklGT19GTFVTSAlfSU8oJ2cnLCAyKQorCisvKiByZXNldHMgZW5kcG9pbnQgaGFsdCt0b2dnbGU7IHVzZWQgdG8gaW1wbGVtZW50IHNldF9pbnRlcmZhY2UuCisgKiBzb21lIGhhcmR3YXJlIChsaWtlIHB4YTJ4eCkgY2FuJ3Qgc3VwcG9ydCB0aGlzLgorICovCisjZGVmaW5lCUZVTkNUSU9ORlNfQ0xFQVJfSEFMVAlfSU8oJ2cnLCAzKQorCisvKiBTcGVjaWZpYyBmb3IgZnVuY3Rpb25mcyAqLworCisvKgorICogUmV0dXJucyByZXZlcnNlIG1hcHBpbmcgb2YgYW4gaW50ZXJmYWNlLiAgQ2FsbGVkIG9uIEVQMC4gIElmIHRoZXJlCisgKiBpcyBubyBzdWNoIGludGVyZmFjZSByZXR1cm5zIC1FRE9NLiAgSWYgZnVuY3Rpb24gaXMgbm90IGFjdGl2ZQorICogcmV0dXJucyAtRU5PREVWLgorICovCisjZGVmaW5lCUZVTkNUSU9ORlNfSU5URVJGQUNFX1JFVk1BUAlfSU8oJ2cnLCAxMjgpCisKKy8qCisgKiBSZXR1cm5zIHJlYWwgYkVuZHBvaW50QWRkcmVzcyBvZiBhbiBlbmRwb2ludC4gIElmIGZ1bmN0aW9uIGlzIG5vdAorICogYWN0aXZlIHJldHVybnMgLUVOT0RFVi4KKyAqLworI2RlZmluZQlGVU5DVElPTkZTX0VORFBPSU5UX1JFVk1BUAlfSU8oJ2cnLCAxMjkpCisKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2dfcHJpbnRlci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvZ19wcmludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE3OGZkZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2dfcHJpbnRlci5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBnX3ByaW50ZXIuaCAtLSBIZWFkZXIgZmlsZSBmb3IgVVNCIFByaW50ZXIgZ2FkZ2V0IGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBDcmFpZyBXLiBOYWRsZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1VTQl9HX1BSSU5URVJfSAorI2RlZmluZSBfX0xJTlVYX1VTQl9HX1BSSU5URVJfSAorCisjZGVmaW5lIFBSSU5URVJfTk9UX0VSUk9SCTB4MDgKKyNkZWZpbmUgUFJJTlRFUl9TRUxFQ1RFRAkweDEwCisjZGVmaW5lIFBSSU5URVJfUEFQRVJfRU1QVFkJMHgyMAorCisvKiBUaGUgJ2cnIGNvZGUgaXMgYWxzbyB1c2VkIGJ5IGdhZGdldGZzIGlvY3RsIHJlcXVlc3RzLgorICogRG9uJ3QgYWRkIGFueSBjb2xsaWRpbmcgY29kZXMgdG8gZWl0aGVyIGRyaXZlciwgYW5kIGtlZXAKKyAqIHRoZW0gaW4gdW5pcXVlIHJhbmdlcyAoc2l6ZSAweDIwIGZvciBub3cpLgorICovCisjZGVmaW5lIEdBREdFVF9HRVRfUFJJTlRFUl9TVEFUVVMJX0lPUignZycsIDB4MjEsIHVuc2lnbmVkIGNoYXIpCisjZGVmaW5lIEdBREdFVF9TRVRfUFJJTlRFUl9TVEFUVVMJX0lPV1IoJ2cnLCAweDIyLCB1bnNpZ25lZCBjaGFyKQorCisjZW5kaWYgLyogX19MSU5VWF9VU0JfR19QUklOVEVSX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2dhZGdldGZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXRmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjEyZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXRmcy5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBGaWxlc3lzdGVtIGJhc2VkIHVzZXItbW9kZSBBUEkgdG8gVVNCIEdhZGdldCBjb250cm9sbGVyIGhhcmR3YXJlCisgKgorICogT3RoZXIgdGhhbiBlcDAgb3BlcmF0aW9ucywgbW9zdCB0aGluZ3MgYXJlIGRvbmUgYnkgcmVhZCgpIGFuZCB3cml0ZSgpCisgKiBvbiBlbmRwb2ludCBmaWxlcyBmb3VuZCBpbiBvbmUgZGlyZWN0b3J5LiAgVGhleSBhcmUgY29uZmlndXJlZCBieQorICogd3JpdGluZyBkZXNjcmlwdG9ycywgYW5kIHRoZW4gbWF5IGJlIHVzZWQgZm9yIG5vcm1hbCBzdHJlYW0gc3R5bGUKKyAqIGkvbyByZXF1ZXN0cy4gIFdoZW4gZXAwIGlzIGNvbmZpZ3VyZWQsIHRoZSBkZXZpY2UgY2FuIGVudW1lcmF0ZTsKKyAqIHdoZW4gaXQncyBjbG9zZWQsIHRoZSBkZXZpY2UgZGlzY29ubmVjdHMgZnJvbSB1c2IuICBPcGVyYXRpb25zIG9uCisgKiBlcDAgcmVxdWlyZSBpb2N0bCgpIG9wZXJhdGlvbnMuCisgKgorICogQ29uZmlndXJhdGlvbiBhbmQgZGV2aWNlIGRlc2NyaXB0b3JzIGdldCB3cml0dGVuIHRvIC9kZXYvZ2FkZ2V0LyRDSElQLAorICogd2hpY2ggbWF5IHRoZW4gYmUgdXNlZCB0byByZWFkIHVzYl9nYWRnZXRmc19ldmVudCBzdHJ1Y3RzLiAgVGhlIGRyaXZlcgorICogbWF5IGFjdGl2YXRlIGVuZHBvaW50cyBhcyBpdCBoYW5kbGVzIFNFVF9DT05GSUdVUkFUSU9OIHNldHVwIGV2ZW50cywKKyAqIG9yIGVhcmxpZXI7IHdyaXRpbmcgZW5kcG9pbnQgZGVzY3JpcHRvcnMgdG8gL2Rldi9nYWRnZXQvJEVORFBPSU5UCisgKiB0aGVuIHBlcmZvcm1pbmcgZGF0YSB0cmFuc2ZlcnMgYnkgcmVhZGluZyBvciB3cml0aW5nLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9VU0JfR0FER0VURlNfSAorI2RlZmluZSBfX0xJTlVYX1VTQl9HQURHRVRGU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CisKKy8qCisgKiBFdmVudHMgYXJlIGRlbGl2ZXJlZCBvbiB0aGUgZXAwIGZpbGUgZGVzY3JpcHRvciwgd2hlbiB0aGUgdXNlciBtb2RlIGRyaXZlcgorICogcmVhZHMgZnJvbSB0aGlzIGZpbGUgZGVzY3JpcHRvciBhZnRlciB3cml0aW5nIHRoZSBkZXNjcmlwdG9ycy4gIERvbid0CisgKiBzdG9wIHBvbGxpbmcgdGhpcyBkZXNjcmlwdG9yLgorICovCisKK2VudW0gdXNiX2dhZGdldGZzX2V2ZW50X3R5cGUgeworCUdBREdFVEZTX05PUCA9IDAsCisKKwlHQURHRVRGU19DT05ORUNULAorCUdBREdFVEZTX0RJU0NPTk5FQ1QsCisJR0FER0VURlNfU0VUVVAsCisJR0FER0VURlNfU1VTUEVORCwKKwkvKiBhbmQgbGlrZWx5IG1vcmUgISAqLworfTsKKworLyogTk9URTogIHRoaXMgc3RydWN0dXJlIG11c3Qgc3RheSB0aGUgc2FtZSBzaXplIGFuZCBsYXlvdXQgb24KKyAqIGJvdGggMzItYml0IGFuZCA2NC1iaXQga2VybmVscy4KKyAqLworc3RydWN0IHVzYl9nYWRnZXRmc19ldmVudCB7CisJdW5pb24geworCQkvKiBOT1AsIERJU0NPTk5FQ1QsIFNVU1BFTkQ6IG5vdGhpbmcKKwkJICogLi4uIHNvbWUgaGFyZHdhcmUgY2FuJ3QgcmVwb3J0IGRpc2Nvbm5lY3Rpb24KKwkJICovCisKKwkJLyogQ09OTkVDVDoganVzdCB0aGUgc3BlZWQgKi8KKwkJZW51bSB1c2JfZGV2aWNlX3NwZWVkCXNwZWVkOworCisJCS8qIFNFVFVQOiBwYWNrZXQ7IERBVEEgcGhhc2UgaS9vIHByZWNlZGVzIG5leHQgZXZlbnQKKwkJICooc2V0dXAuYm1SZXF1ZXN0VHlwZSAmIFVTQl9ESVJfSU4pIGZsYWdzIGRpcmVjdGlvbgorCQkgKiAuLi4gaW5jbHVkZXMgU0VUX0NPTkZJR1VSQVRJT04sIFNFVF9JTlRFUkZBQ0UKKwkJICovCisJCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QJc2V0dXA7CisJfSB1OworCWVudW0gdXNiX2dhZGdldGZzX2V2ZW50X3R5cGUJdHlwZTsKK307CisKKworLyogVGhlICdnJyBjb2RlIGlzIGFsc28gdXNlZCBieSBwcmludGVyIGdhZGdldCBpb2N0bCByZXF1ZXN0cy4KKyAqIERvbid0IGFkZCBhbnkgY29sbGlkaW5nIGNvZGVzIHRvIGVpdGhlciBkcml2ZXIsIGFuZCBrZWVwCisgKiB0aGVtIGluIHVuaXF1ZSByYW5nZXMgKHNpemUgMHgyMCBmb3Igbm93KS4KKyAqLworCisvKiBlbmRwb2ludCBpb2N0bHMgKi8KKworLyogSU4gdHJhbnNmZXJzIG1heSBiZSByZXBvcnRlZCB0byB0aGUgZ2FkZ2V0IGRyaXZlciBhcyBjb21wbGV0ZQorICoJd2hlbiB0aGUgZmlmbyBpcyBsb2FkZWQsIGJlZm9yZSB0aGUgaG9zdCByZWFkcyB0aGUgZGF0YTsKKyAqIE9VVCB0cmFuc2ZlcnMgbWF5IGJlIHJlcG9ydGVkIHRvIHRoZSBob3N0J3MgImNsaWVudCIgZHJpdmVyIGFzCisgKgljb21wbGV0ZSB3aGVuIHRoZXkncmUgc2l0dGluZyBpbiB0aGUgRklGTyB1bnJlYWQuCisgKiBUSElTIHJldHVybnMgaG93IG1hbnkgYnl0ZXMgYXJlICJ1bmNsYWltZWQiIGluIHRoZSBlbmRwb2ludCBmaWZvCisgKiAobmVlZGVkIGZvciBwcmVjaXNlIGZhdWx0IGhhbmRsaW5nLCB3aGVuIHRoZSBoYXJkd2FyZSBhbGxvd3MgaXQpCisgKi8KKyNkZWZpbmUJR0FER0VURlNfRklGT19TVEFUVVMJX0lPKCdnJywgMSkKKworLyogZGlzY2FyZHMgYW55IHVuY2xhaW1lZCBkYXRhIGluIHRoZSBmaWZvLiAqLworI2RlZmluZQlHQURHRVRGU19GSUZPX0ZMVVNICV9JTygnZycsIDIpCisKKy8qIHJlc2V0cyBlbmRwb2ludCBoYWx0K3RvZ2dsZTsgdXNlZCB0byBpbXBsZW1lbnQgc2V0X2ludGVyZmFjZS4KKyAqIHNvbWUgaGFyZHdhcmUgKGxpa2UgcHhhMnh4KSBjYW4ndCBzdXBwb3J0IHRoaXMuCisgKi8KKyNkZWZpbmUJR0FER0VURlNfQ0xFQVJfSEFMVAlfSU8oJ2cnLCAzKQorCisjZW5kaWYgLyogX19MSU5VWF9VU0JfR0FER0VURlNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvbWlkaS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvbWlkaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YzUyZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYi9taWRpLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiA8bGludXgvdXNiL21pZGkuaD4gLS0gVVNCIE1JREkgZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRodW10cm9uaWNzIFB0eSBMdGQuCisgKiBEZXZlbG9wZWQgZm9yIFRodW10cm9uaWNzIGJ5IEdyZXkgSW5ub3ZhdGlvbgorICogQmVuIFdpbGxpYW1zb24gPGJlbi53aWxsaWFtc29uQGdyZXlpbm5vdmF0aW9uLmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgaG9sZHMgVVNCIGNvbnN0YW50cyBhbmQgc3RydWN0dXJlcyBkZWZpbmVkCisgKiBieSB0aGUgVVNCIERldmljZSBDbGFzcyBEZWZpbml0aW9uIGZvciBNSURJIERldmljZXMuCisgKiBDb21tZW50cyBiZWxvdyByZWZlcmVuY2UgcmVsZXZhbnQgc2VjdGlvbnMgb2YgdGhhdCBkb2N1bWVudDoKKyAqCisgKiBodHRwOi8vd3d3LnVzYi5vcmcvZGV2ZWxvcGVycy9kZXZjbGFzc19kb2NzL21pZGkxMC5wZGYKKyAqLworCisjaWZuZGVmIF9fTElOVVhfVVNCX01JRElfSAorI2RlZmluZSBfX0xJTlVYX1VTQl9NSURJX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIEEuMSAgTVMgQ2xhc3MtU3BlY2lmaWMgSW50ZXJmYWNlIERlc2NyaXB0b3IgU3VidHlwZXMgKi8KKyNkZWZpbmUgVVNCX01TX0hFQURFUgkJMHgwMQorI2RlZmluZSBVU0JfTVNfTUlESV9JTl9KQUNLCTB4MDIKKyNkZWZpbmUgVVNCX01TX01JRElfT1VUX0pBQ0sJMHgwMworI2RlZmluZSBVU0JfTVNfRUxFTUVOVAkJMHgwNAorCisvKiBBLjIgIE1TIENsYXNzLVNwZWNpZmljIEVuZHBvaW50IERlc2NyaXB0b3IgU3VidHlwZXMgKi8KKyNkZWZpbmUgVVNCX01TX0dFTkVSQUwJCTB4MDEKKworLyogQS4zICBNUyBNSURJIElOIGFuZCBPVVQgSmFjayBUeXBlcyAqLworI2RlZmluZSBVU0JfTVNfRU1CRURERUQJCTB4MDEKKyNkZWZpbmUgVVNCX01TX0VYVEVSTkFMCQkweDAyCisKKy8qIDYuMS4yLjEgIENsYXNzLVNwZWNpZmljIE1TIEludGVyZmFjZSBIZWFkZXIgRGVzY3JpcHRvciAqLworc3RydWN0IHVzYl9tc19oZWFkZXJfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRlc2NyaXB0b3JTdWJ0eXBlOworCV9fbGUxNiBiY2RNU0M7CisJX19sZTE2IHdUb3RhbExlbmd0aDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFVTQl9EVF9NU19IRUFERVJfU0laRQk3CisKKy8qIDYuMS4yLjIgIE1JREkgSU4gSmFjayBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdXNiX21pZGlfaW5famFja19kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCS8qIFVTQl9EVF9DU19JTlRFUkZBQ0UgKi8KKwlfX3U4ICBiRGVzY3JpcHRvclN1YnR5cGU7CS8qIFVTQl9NU19NSURJX0lOX0pBQ0sgKi8KKwlfX3U4ICBiSmFja1R5cGU7CQkvKiBVU0JfTVNfRU1CRURERUQvRVhURVJOQUwgKi8KKwlfX3U4ICBiSmFja0lEOworCV9fdTggIGlKYWNrOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVVNCX0RUX01JRElfSU5fU0laRQk2CisKK3N0cnVjdCB1c2JfbWlkaV9zb3VyY2VfcGluIHsKKwlfX3U4ICBiYVNvdXJjZUlEOworCV9fdTggIGJhU291cmNlUGluOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIDYuMS4yLjMgIE1JREkgT1VUIEphY2sgRGVzY3JpcHRvciAqLworc3RydWN0IHVzYl9taWRpX291dF9qYWNrX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJLyogVVNCX0RUX0NTX0lOVEVSRkFDRSAqLworCV9fdTggIGJEZXNjcmlwdG9yU3VidHlwZTsJLyogVVNCX01TX01JRElfT1VUX0pBQ0sgKi8KKwlfX3U4ICBiSmFja1R5cGU7CQkvKiBVU0JfTVNfRU1CRURERUQvRVhURVJOQUwgKi8KKwlfX3U4ICBiSmFja0lEOworCV9fdTggIGJOcklucHV0UGluczsJCS8qIHAgKi8KKwlzdHJ1Y3QgdXNiX21pZGlfc291cmNlX3BpbiBwaW5zW107IC8qIFtwXSAqLworCS8qX191OCAgaUphY2s7ICAtLSBvbWl0dGVkIGR1ZSB0byB2YXJpYWJsZS1zaXplZCBwaW5zW10gKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFVTQl9EVF9NSURJX09VVF9TSVpFKHApCSg3ICsgMiAqIChwKSkKKworLyogQXMgYWJvdmUsIGJ1dCBtb3JlIHVzZWZ1bCBmb3IgZGVmaW5pbmcgeW91ciBvd24gZGVzY3JpcHRvcnM6ICovCisjZGVmaW5lIERFQ0xBUkVfVVNCX01JRElfT1VUX0pBQ0tfREVTQ1JJUFRPUihwKQkJCVwKK3N0cnVjdCB1c2JfbWlkaV9vdXRfamFja19kZXNjcmlwdG9yXyMjcCB7CQkJXAorCV9fdTggIGJMZW5ndGg7CQkJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclN1YnR5cGU7CQkJCVwKKwlfX3U4ICBiSmFja1R5cGU7CQkJCQlcCisJX191OCAgYkphY2tJRDsJCQkJCQlcCisJX191OCAgYk5ySW5wdXRQaW5zOwkJCQkJXAorCXN0cnVjdCB1c2JfbWlkaV9zb3VyY2VfcGluIHBpbnNbcF07CQkJXAorCV9fdTggIGlKYWNrOwkJCQkJCVwKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKy8qIDYuMi4yICBDbGFzcy1TcGVjaWZpYyBNUyBCdWxrIERhdGEgRW5kcG9pbnQgRGVzY3JpcHRvciAqLworc3RydWN0IHVzYl9tc19lbmRwb2ludF9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOwkJCS8qIDQrbiAqLworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCS8qIFVTQl9EVF9DU19FTkRQT0lOVCAqLworCV9fdTggIGJEZXNjcmlwdG9yU3VidHlwZTsJLyogVVNCX01TX0dFTkVSQUwgKi8KKwlfX3U4ICBiTnVtRW1iTUlESUphY2s7CQkvKiBuICovCisJX191OCAgYmFBc3NvY0phY2tJRFtdOwkJLyogW25dICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBVU0JfRFRfTVNfRU5EUE9JTlRfU0laRShuKQkoNCArIChuKSkKKworLyogQXMgYWJvdmUsIGJ1dCBtb3JlIHVzZWZ1bCBmb3IgZGVmaW5pbmcgeW91ciBvd24gZGVzY3JpcHRvcnM6ICovCisjZGVmaW5lIERFQ0xBUkVfVVNCX01TX0VORFBPSU5UX0RFU0NSSVBUT1IobikJCQlcCitzdHJ1Y3QgdXNiX21zX2VuZHBvaW50X2Rlc2NyaXB0b3JfIyNuIHsJCQkJXAorCV9fdTggIGJMZW5ndGg7CQkJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclN1YnR5cGU7CQkJCVwKKwlfX3U4ICBiTnVtRW1iTUlESUphY2s7CQkJCQlcCisJX191OCAgYmFBc3NvY0phY2tJRFtuXTsJCQkJCVwKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9NSURJX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL3RtYy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvdG1jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA0NWFlMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL3RtYy5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU3RlZmFuIEtvcHAsIEdlY2hpbmdlbiwgR2VybWFueQorICogQ29weXJpZ2h0IChDKSAyMDA4IE5vdmVsbCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+CisgKgorICogVGhpcyBmaWxlIGhvbGRzIFVTQiBjb25zdGFudHMgZGVmaW5lZCBieSB0aGUgVVNCIERldmljZSBDbGFzcworICogRGVmaW5pdGlvbiBmb3IgVGVzdCBhbmQgTWVhc3VyZW1lbnQgZGV2aWNlcyBwdWJsaXNoZWQgYnkgdGhlIFVTQi1JRi4KKyAqCisgKiBJdCBhbHNvIGhhcyB0aGUgaW9jdGwgZGVmaW5pdGlvbnMgZm9yIHRoZSB1c2J0bWMga2VybmVsIGRyaXZlciB0aGF0CisgKiB1c2Vyc3BhY2UgbmVlZHMgdG8ga25vdyBhYm91dC4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfVVNCX1RNQ19ICisjZGVmaW5lIF9fTElOVVhfVVNCX1RNQ19ICisKKy8qIFVTQiBUTUMgc3RhdHVzIHZhbHVlcyAqLworI2RlZmluZSBVU0JUTUNfU1RBVFVTX1NVQ0NFU1MJCQkJMHgwMQorI2RlZmluZSBVU0JUTUNfU1RBVFVTX1BFTkRJTkcJCQkJMHgwMgorI2RlZmluZSBVU0JUTUNfU1RBVFVTX0ZBSUxFRAkJCQkweDgwCisjZGVmaW5lIFVTQlRNQ19TVEFUVVNfVFJBTlNGRVJfTk9UX0lOX1BST0dSRVNTCQkweDgxCisjZGVmaW5lIFVTQlRNQ19TVEFUVVNfU1BMSVRfTk9UX0lOX1BST0dSRVNTCQkweDgyCisjZGVmaW5lIFVTQlRNQ19TVEFUVVNfU1BMSVRfSU5fUFJPR1JFU1MJCQkweDgzCisKKy8qIFVTQiBUTUMgcmVxdWVzdHMgdmFsdWVzICovCisjZGVmaW5lIFVTQlRNQ19SRVFVRVNUX0lOSVRJQVRFX0FCT1JUX0JVTEtfT1VUCQkxCisjZGVmaW5lIFVTQlRNQ19SRVFVRVNUX0NIRUNLX0FCT1JUX0JVTEtfT1VUX1NUQVRVUwkyCisjZGVmaW5lIFVTQlRNQ19SRVFVRVNUX0lOSVRJQVRFX0FCT1JUX0JVTEtfSU4JCTMKKyNkZWZpbmUgVVNCVE1DX1JFUVVFU1RfQ0hFQ0tfQUJPUlRfQlVMS19JTl9TVEFUVVMJNAorI2RlZmluZSBVU0JUTUNfUkVRVUVTVF9JTklUSUFURV9DTEVBUgkJCTUKKyNkZWZpbmUgVVNCVE1DX1JFUVVFU1RfQ0hFQ0tfQ0xFQVJfU1RBVFVTCQk2CisjZGVmaW5lIFVTQlRNQ19SRVFVRVNUX0dFVF9DQVBBQklMSVRJRVMJCQk3CisjZGVmaW5lIFVTQlRNQ19SRVFVRVNUX0lORElDQVRPUl9QVUxTRQkJCTY0CisKKy8qIFJlcXVlc3QgdmFsdWVzIGZvciBVU0JUTUMgZHJpdmVyJ3MgaW9jdGwgZW50cnkgcG9pbnQgKi8KKyNkZWZpbmUgVVNCVE1DX0lPQ19OUgkJCTkxCisjZGVmaW5lIFVTQlRNQ19JT0NUTF9JTkRJQ0FUT1JfUFVMU0UJX0lPKFVTQlRNQ19JT0NfTlIsIDEpCisjZGVmaW5lIFVTQlRNQ19JT0NUTF9DTEVBUgkJX0lPKFVTQlRNQ19JT0NfTlIsIDIpCisjZGVmaW5lIFVTQlRNQ19JT0NUTF9BQk9SVF9CVUxLX09VVAlfSU8oVVNCVE1DX0lPQ19OUiwgMykKKyNkZWZpbmUgVVNCVE1DX0lPQ1RMX0FCT1JUX0JVTEtfSU4JX0lPKFVTQlRNQ19JT0NfTlIsIDQpCisjZGVmaW5lIFVTQlRNQ19JT0NUTF9DTEVBUl9PVVRfSEFMVAlfSU8oVVNCVE1DX0lPQ19OUiwgNikKKyNkZWZpbmUgVVNCVE1DX0lPQ1RMX0NMRUFSX0lOX0hBTFQJX0lPKFVTQlRNQ19JT0NfTlIsIDcpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvdmlkZW8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL3ZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzYjk1ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL3ZpZGVvLmgKQEAgLTAsMCArMSw1NjggQEAKKy8qCisgKiBVU0IgVmlkZW8gQ2xhc3MgZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IExhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQucGluY2hhcnRAc2t5bmV0LmJlPgorICoKKyAqIFRoaXMgZmlsZSBob2xkcyBVU0IgY29uc3RhbnRzIGFuZCBzdHJ1Y3R1cmVzIGRlZmluZWQgYnkgdGhlIFVTQiBEZXZpY2UKKyAqIENsYXNzIERlZmluaXRpb24gZm9yIFZpZGVvIERldmljZXMuIFVubGVzcyBvdGhlcndpc2Ugc3RhdGVkLCBjb21tZW50cworICogYmVsb3cgcmVmZXJlbmNlIHJlbGV2YW50IHNlY3Rpb25zIG9mIHRoZSBVU0IgVmlkZW8gQ2xhc3MgMS4xIHNwZWNpZmljYXRpb24KKyAqIGF2YWlsYWJsZSBhdAorICoKKyAqIGh0dHA6Ly93d3cudXNiLm9yZy9kZXZlbG9wZXJzL2RldmNsYXNzX2RvY3MvVVNCX1ZpZGVvX0NsYXNzXzFfMS56aXAKKyAqLworCisjaWZuZGVmIF9fTElOVVhfVVNCX1ZJREVPX0gKKyNkZWZpbmUgX19MSU5VWF9VU0JfVklERU9fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFVWQyBjb25zdGFudHMKKyAqLworCisvKiBBLjIuIFZpZGVvIEludGVyZmFjZSBTdWJjbGFzcyBDb2RlcyAqLworI2RlZmluZSBVVkNfU0NfVU5ERUZJTkVECQkJCTB4MDAKKyNkZWZpbmUgVVZDX1NDX1ZJREVPQ09OVFJPTAkJCQkweDAxCisjZGVmaW5lIFVWQ19TQ19WSURFT1NUUkVBTUlORwkJCQkweDAyCisjZGVmaW5lIFVWQ19TQ19WSURFT19JTlRFUkZBQ0VfQ09MTEVDVElPTgkJMHgwMworCisvKiBBLjMuIFZpZGVvIEludGVyZmFjZSBQcm90b2NvbCBDb2RlcyAqLworI2RlZmluZSBVVkNfUENfUFJPVE9DT0xfVU5ERUZJTkVECQkJMHgwMAorCisvKiBBLjUuIFZpZGVvIENsYXNzLVNwZWNpZmljIFZDIEludGVyZmFjZSBEZXNjcmlwdG9yIFN1YnR5cGVzICovCisjZGVmaW5lIFVWQ19WQ19ERVNDUklQVE9SX1VOREVGSU5FRAkJCTB4MDAKKyNkZWZpbmUgVVZDX1ZDX0hFQURFUgkJCQkJMHgwMQorI2RlZmluZSBVVkNfVkNfSU5QVVRfVEVSTUlOQUwJCQkJMHgwMgorI2RlZmluZSBVVkNfVkNfT1VUUFVUX1RFUk1JTkFMCQkJCTB4MDMKKyNkZWZpbmUgVVZDX1ZDX1NFTEVDVE9SX1VOSVQJCQkJMHgwNAorI2RlZmluZSBVVkNfVkNfUFJPQ0VTU0lOR19VTklUCQkJCTB4MDUKKyNkZWZpbmUgVVZDX1ZDX0VYVEVOU0lPTl9VTklUCQkJCTB4MDYKKworLyogQS42LiBWaWRlbyBDbGFzcy1TcGVjaWZpYyBWUyBJbnRlcmZhY2UgRGVzY3JpcHRvciBTdWJ0eXBlcyAqLworI2RlZmluZSBVVkNfVlNfVU5ERUZJTkVECQkJCTB4MDAKKyNkZWZpbmUgVVZDX1ZTX0lOUFVUX0hFQURFUgkJCQkweDAxCisjZGVmaW5lIFVWQ19WU19PVVRQVVRfSEVBREVSCQkJCTB4MDIKKyNkZWZpbmUgVVZDX1ZTX1NUSUxMX0lNQUdFX0ZSQU1FCQkJMHgwMworI2RlZmluZSBVVkNfVlNfRk9STUFUX1VOQ09NUFJFU1NFRAkJCTB4MDQKKyNkZWZpbmUgVVZDX1ZTX0ZSQU1FX1VOQ09NUFJFU1NFRAkJCTB4MDUKKyNkZWZpbmUgVVZDX1ZTX0ZPUk1BVF9NSlBFRwkJCQkweDA2CisjZGVmaW5lIFVWQ19WU19GUkFNRV9NSlBFRwkJCQkweDA3CisjZGVmaW5lIFVWQ19WU19GT1JNQVRfTVBFRzJUUwkJCQkweDBhCisjZGVmaW5lIFVWQ19WU19GT1JNQVRfRFYJCQkJMHgwYworI2RlZmluZSBVVkNfVlNfQ09MT1JGT1JNQVQJCQkJMHgwZAorI2RlZmluZSBVVkNfVlNfRk9STUFUX0ZSQU1FX0JBU0VECQkJMHgxMAorI2RlZmluZSBVVkNfVlNfRlJBTUVfRlJBTUVfQkFTRUQJCQkweDExCisjZGVmaW5lIFVWQ19WU19GT1JNQVRfU1RSRUFNX0JBU0VECQkJMHgxMgorCisvKiBBLjcuIFZpZGVvIENsYXNzLVNwZWNpZmljIEVuZHBvaW50IERlc2NyaXB0b3IgU3VidHlwZXMgKi8KKyNkZWZpbmUgVVZDX0VQX1VOREVGSU5FRAkJCQkweDAwCisjZGVmaW5lIFVWQ19FUF9HRU5FUkFMCQkJCQkweDAxCisjZGVmaW5lIFVWQ19FUF9FTkRQT0lOVAkJCQkJMHgwMgorI2RlZmluZSBVVkNfRVBfSU5URVJSVVBUCQkJCTB4MDMKKworLyogQS44LiBWaWRlbyBDbGFzcy1TcGVjaWZpYyBSZXF1ZXN0IENvZGVzICovCisjZGVmaW5lIFVWQ19SQ19VTkRFRklORUQJCQkJMHgwMAorI2RlZmluZSBVVkNfU0VUX0NVUgkJCQkJMHgwMQorI2RlZmluZSBVVkNfR0VUX0NVUgkJCQkJMHg4MQorI2RlZmluZSBVVkNfR0VUX01JTgkJCQkJMHg4MgorI2RlZmluZSBVVkNfR0VUX01BWAkJCQkJMHg4MworI2RlZmluZSBVVkNfR0VUX1JFUwkJCQkJMHg4NAorI2RlZmluZSBVVkNfR0VUX0xFTgkJCQkJMHg4NQorI2RlZmluZSBVVkNfR0VUX0lORk8JCQkJCTB4ODYKKyNkZWZpbmUgVVZDX0dFVF9ERUYJCQkJCTB4ODcKKworLyogQS45LjEuIFZpZGVvQ29udHJvbCBJbnRlcmZhY2UgQ29udHJvbCBTZWxlY3RvcnMgKi8KKyNkZWZpbmUgVVZDX1ZDX0NPTlRST0xfVU5ERUZJTkVECQkJMHgwMAorI2RlZmluZSBVVkNfVkNfVklERU9fUE9XRVJfTU9ERV9DT05UUk9MCQkJMHgwMQorI2RlZmluZSBVVkNfVkNfUkVRVUVTVF9FUlJPUl9DT0RFX0NPTlRST0wJCTB4MDIKKworLyogQS45LjIuIFRlcm1pbmFsIENvbnRyb2wgU2VsZWN0b3JzICovCisjZGVmaW5lIFVWQ19URV9DT05UUk9MX1VOREVGSU5FRAkJCTB4MDAKKworLyogQS45LjMuIFNlbGVjdG9yIFVuaXQgQ29udHJvbCBTZWxlY3RvcnMgKi8KKyNkZWZpbmUgVVZDX1NVX0NPTlRST0xfVU5ERUZJTkVECQkJMHgwMAorI2RlZmluZSBVVkNfU1VfSU5QVVRfU0VMRUNUX0NPTlRST0wJCQkweDAxCisKKy8qIEEuOS40LiBDYW1lcmEgVGVybWluYWwgQ29udHJvbCBTZWxlY3RvcnMgKi8KKyNkZWZpbmUgVVZDX0NUX0NPTlRST0xfVU5ERUZJTkVECQkJMHgwMAorI2RlZmluZSBVVkNfQ1RfU0NBTk5JTkdfTU9ERV9DT05UUk9MCQkJMHgwMQorI2RlZmluZSBVVkNfQ1RfQUVfTU9ERV9DT05UUk9MCQkJCTB4MDIKKyNkZWZpbmUgVVZDX0NUX0FFX1BSSU9SSVRZX0NPTlRST0wJCQkweDAzCisjZGVmaW5lIFVWQ19DVF9FWFBPU1VSRV9USU1FX0FCU09MVVRFX0NPTlRST0wJCTB4MDQKKyNkZWZpbmUgVVZDX0NUX0VYUE9TVVJFX1RJTUVfUkVMQVRJVkVfQ09OVFJPTAkJMHgwNQorI2RlZmluZSBVVkNfQ1RfRk9DVVNfQUJTT0xVVEVfQ09OVFJPTAkJCTB4MDYKKyNkZWZpbmUgVVZDX0NUX0ZPQ1VTX1JFTEFUSVZFX0NPTlRST0wJCQkweDA3CisjZGVmaW5lIFVWQ19DVF9GT0NVU19BVVRPX0NPTlRST0wJCQkweDA4CisjZGVmaW5lIFVWQ19DVF9JUklTX0FCU09MVVRFX0NPTlRST0wJCQkweDA5CisjZGVmaW5lIFVWQ19DVF9JUklTX1JFTEFUSVZFX0NPTlRST0wJCQkweDBhCisjZGVmaW5lIFVWQ19DVF9aT09NX0FCU09MVVRFX0NPTlRST0wJCQkweDBiCisjZGVmaW5lIFVWQ19DVF9aT09NX1JFTEFUSVZFX0NPTlRST0wJCQkweDBjCisjZGVmaW5lIFVWQ19DVF9QQU5USUxUX0FCU09MVVRFX0NPTlRST0wJCQkweDBkCisjZGVmaW5lIFVWQ19DVF9QQU5USUxUX1JFTEFUSVZFX0NPTlRST0wJCQkweDBlCisjZGVmaW5lIFVWQ19DVF9ST0xMX0FCU09MVVRFX0NPTlRST0wJCQkweDBmCisjZGVmaW5lIFVWQ19DVF9ST0xMX1JFTEFUSVZFX0NPTlRST0wJCQkweDEwCisjZGVmaW5lIFVWQ19DVF9QUklWQUNZX0NPTlRST0wJCQkJMHgxMQorCisvKiBBLjkuNS4gUHJvY2Vzc2luZyBVbml0IENvbnRyb2wgU2VsZWN0b3JzICovCisjZGVmaW5lIFVWQ19QVV9DT05UUk9MX1VOREVGSU5FRAkJCTB4MDAKKyNkZWZpbmUgVVZDX1BVX0JBQ0tMSUdIVF9DT01QRU5TQVRJT05fQ09OVFJPTAkJMHgwMQorI2RlZmluZSBVVkNfUFVfQlJJR0hUTkVTU19DT05UUk9MCQkJMHgwMgorI2RlZmluZSBVVkNfUFVfQ09OVFJBU1RfQ09OVFJPTAkJCQkweDAzCisjZGVmaW5lIFVWQ19QVV9HQUlOX0NPTlRST0wJCQkJMHgwNAorI2RlZmluZSBVVkNfUFVfUE9XRVJfTElORV9GUkVRVUVOQ1lfQ09OVFJPTAkJMHgwNQorI2RlZmluZSBVVkNfUFVfSFVFX0NPTlRST0wJCQkJMHgwNgorI2RlZmluZSBVVkNfUFVfU0FUVVJBVElPTl9DT05UUk9MCQkJMHgwNworI2RlZmluZSBVVkNfUFVfU0hBUlBORVNTX0NPTlRST0wJCQkweDA4CisjZGVmaW5lIFVWQ19QVV9HQU1NQV9DT05UUk9MCQkJCTB4MDkKKyNkZWZpbmUgVVZDX1BVX1dISVRFX0JBTEFOQ0VfVEVNUEVSQVRVUkVfQ09OVFJPTAkweDBhCisjZGVmaW5lIFVWQ19QVV9XSElURV9CQUxBTkNFX1RFTVBFUkFUVVJFX0FVVE9fQ09OVFJPTAkweDBiCisjZGVmaW5lIFVWQ19QVV9XSElURV9CQUxBTkNFX0NPTVBPTkVOVF9DT05UUk9MCQkweDBjCisjZGVmaW5lIFVWQ19QVV9XSElURV9CQUxBTkNFX0NPTVBPTkVOVF9BVVRPX0NPTlRST0wJMHgwZAorI2RlZmluZSBVVkNfUFVfRElHSVRBTF9NVUxUSVBMSUVSX0NPTlRST0wJCTB4MGUKKyNkZWZpbmUgVVZDX1BVX0RJR0lUQUxfTVVMVElQTElFUl9MSU1JVF9DT05UUk9MCQkweDBmCisjZGVmaW5lIFVWQ19QVV9IVUVfQVVUT19DT05UUk9MCQkJCTB4MTAKKyNkZWZpbmUgVVZDX1BVX0FOQUxPR19WSURFT19TVEFOREFSRF9DT05UUk9MCQkweDExCisjZGVmaW5lIFVWQ19QVV9BTkFMT0dfTE9DS19TVEFUVVNfQ09OVFJPTAkJMHgxMgorCisvKiBBLjkuNy4gVmlkZW9TdHJlYW1pbmcgSW50ZXJmYWNlIENvbnRyb2wgU2VsZWN0b3JzICovCisjZGVmaW5lIFVWQ19WU19DT05UUk9MX1VOREVGSU5FRAkJCTB4MDAKKyNkZWZpbmUgVVZDX1ZTX1BST0JFX0NPTlRST0wJCQkJMHgwMQorI2RlZmluZSBVVkNfVlNfQ09NTUlUX0NPTlRST0wJCQkJMHgwMgorI2RlZmluZSBVVkNfVlNfU1RJTExfUFJPQkVfQ09OVFJPTAkJCTB4MDMKKyNkZWZpbmUgVVZDX1ZTX1NUSUxMX0NPTU1JVF9DT05UUk9MCQkJMHgwNAorI2RlZmluZSBVVkNfVlNfU1RJTExfSU1BR0VfVFJJR0dFUl9DT05UUk9MCQkweDA1CisjZGVmaW5lIFVWQ19WU19TVFJFQU1fRVJST1JfQ09ERV9DT05UUk9MCQkweDA2CisjZGVmaW5lIFVWQ19WU19HRU5FUkFURV9LRVlfRlJBTUVfQ09OVFJPTAkJMHgwNworI2RlZmluZSBVVkNfVlNfVVBEQVRFX0ZSQU1FX1NFR01FTlRfQ09OVFJPTAkJMHgwOAorI2RlZmluZSBVVkNfVlNfU1lOQ19ERUxBWV9DT05UUk9MCQkJMHgwOQorCisvKiBCLjEuIFVTQiBUZXJtaW5hbCBUeXBlcyAqLworI2RlZmluZSBVVkNfVFRfVkVORE9SX1NQRUNJRklDCQkJCTB4MDEwMAorI2RlZmluZSBVVkNfVFRfU1RSRUFNSU5HCQkJCTB4MDEwMQorCisvKiBCLjIuIElucHV0IFRlcm1pbmFsIFR5cGVzICovCisjZGVmaW5lIFVWQ19JVFRfVkVORE9SX1NQRUNJRklDCQkJCTB4MDIwMAorI2RlZmluZSBVVkNfSVRUX0NBTUVSQQkJCQkJMHgwMjAxCisjZGVmaW5lIFVWQ19JVFRfTUVESUFfVFJBTlNQT1JUX0lOUFVUCQkJMHgwMjAyCisKKy8qIEIuMy4gT3V0cHV0IFRlcm1pbmFsIFR5cGVzICovCisjZGVmaW5lIFVWQ19PVFRfVkVORE9SX1NQRUNJRklDCQkJCTB4MDMwMAorI2RlZmluZSBVVkNfT1RUX0RJU1BMQVkJCQkJCTB4MDMwMQorI2RlZmluZSBVVkNfT1RUX01FRElBX1RSQU5TUE9SVF9PVVRQVVQJCQkweDAzMDIKKworLyogQi40LiBFeHRlcm5hbCBUZXJtaW5hbCBUeXBlcyAqLworI2RlZmluZSBVVkNfRVhURVJOQUxfVkVORE9SX1NQRUNJRklDCQkJMHgwNDAwCisjZGVmaW5lIFVWQ19DT01QT1NJVEVfQ09OTkVDVE9SCQkJCTB4MDQwMQorI2RlZmluZSBVVkNfU1ZJREVPX0NPTk5FQ1RPUgkJCQkweDA0MDIKKyNkZWZpbmUgVVZDX0NPTVBPTkVOVF9DT05ORUNUT1IJCQkJMHgwNDAzCisKKy8qIDIuNC4yLjIuIFN0YXR1cyBQYWNrZXQgVHlwZSAqLworI2RlZmluZSBVVkNfU1RBVFVTX1RZUEVfQ09OVFJPTAkJCQkxCisjZGVmaW5lIFVWQ19TVEFUVVNfVFlQRV9TVFJFQU1JTkcJCQkyCisKKy8qIDIuNC4zLjMuIFBheWxvYWQgSGVhZGVyIEluZm9ybWF0aW9uICovCisjZGVmaW5lIFVWQ19TVFJFQU1fRU9ICQkJCQkoMSA8PCA3KQorI2RlZmluZSBVVkNfU1RSRUFNX0VSUgkJCQkJKDEgPDwgNikKKyNkZWZpbmUgVVZDX1NUUkVBTV9TVEkJCQkJCSgxIDw8IDUpCisjZGVmaW5lIFVWQ19TVFJFQU1fUkVTCQkJCQkoMSA8PCA0KQorI2RlZmluZSBVVkNfU1RSRUFNX1NDUgkJCQkJKDEgPDwgMykKKyNkZWZpbmUgVVZDX1NUUkVBTV9QVFMJCQkJCSgxIDw8IDIpCisjZGVmaW5lIFVWQ19TVFJFQU1fRU9GCQkJCQkoMSA8PCAxKQorI2RlZmluZSBVVkNfU1RSRUFNX0ZJRAkJCQkJKDEgPDwgMCkKKworLyogNC4xLjIuIENvbnRyb2wgQ2FwYWJpbGl0aWVzICovCisjZGVmaW5lIFVWQ19DT05UUk9MX0NBUF9HRVQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgVVZDX0NPTlRST0xfQ0FQX1NFVAkJCQkoMSA8PCAxKQorI2RlZmluZSBVVkNfQ09OVFJPTF9DQVBfRElTQUJMRUQJCQkoMSA8PCAyKQorI2RlZmluZSBVVkNfQ09OVFJPTF9DQVBfQVVUT1VQREFURQkJCSgxIDw8IDMpCisjZGVmaW5lIFVWQ19DT05UUk9MX0NBUF9BU1lOQ0hST05PVVMJCQkoMSA8PCA0KQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFVWQyBzdHJ1Y3R1cmVzCisgKi8KKworLyogQWxsIFVWQyBkZXNjcmlwdG9ycyBoYXZlIHRoZXNlIDMgZmllbGRzIGF0IHRoZSBiZWdpbm5pbmcgKi8KK3N0cnVjdCB1dmNfZGVzY3JpcHRvcl9oZWFkZXIgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIDMuNy4yLiBWaWRlbyBDb250cm9sIEludGVyZmFjZSBIZWFkZXIgRGVzY3JpcHRvciAqLworc3RydWN0IHV2Y19oZWFkZXJfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOworCV9fdTE2IGJjZFVWQzsKKwlfX3UxNiB3VG90YWxMZW5ndGg7CisJX191MzIgZHdDbG9ja0ZyZXF1ZW5jeTsKKwlfX3U4ICBiSW5Db2xsZWN0aW9uOworCV9fdTggIGJhSW50ZXJmYWNlTnJbXTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisjZGVmaW5lIFVWQ19EVF9IRUFERVJfU0laRShuKQkJCQkoMTIrKG4pKQorCisjZGVmaW5lIFVWQ19IRUFERVJfREVTQ1JJUFRPUihuKSBcCisJdXZjX2hlYWRlcl9kZXNjcmlwdG9yXyMjbgorCisjZGVmaW5lIERFQ0xBUkVfVVZDX0hFQURFUl9ERVNDUklQVE9SKG4pCQlcCitzdHJ1Y3QgVVZDX0hFQURFUl9ERVNDUklQVE9SKG4pIHsJCQlcCisJX191OCAgYkxlbmd0aDsJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CQkJXAorCV9fdTE2IGJjZFVWQzsJCQkJCVwKKwlfX3UxNiB3VG90YWxMZW5ndGg7CQkJCVwKKwlfX3UzMiBkd0Nsb2NrRnJlcXVlbmN5OwkJCQlcCisJX191OCAgYkluQ29sbGVjdGlvbjsJCQkJXAorCV9fdTggIGJhSW50ZXJmYWNlTnJbbl07CQkJCVwKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKy8qIDMuNy4yLjEuIElucHV0IFRlcm1pbmFsIERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1dmNfaW5wdXRfdGVybWluYWxfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOworCV9fdTggIGJUZXJtaW5hbElEOworCV9fdTE2IHdUZXJtaW5hbFR5cGU7CisJX191OCAgYkFzc29jVGVybWluYWw7CisJX191OCAgaVRlcm1pbmFsOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgVVZDX0RUX0lOUFVUX1RFUk1JTkFMX1NJWkUJCQk4CisKKy8qIDMuNy4yLjIuIE91dHB1dCBUZXJtaW5hbCBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdXZjX291dHB1dF90ZXJtaW5hbF9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CisJX191OCAgYlRlcm1pbmFsSUQ7CisJX191MTYgd1Rlcm1pbmFsVHlwZTsKKwlfX3U4ICBiQXNzb2NUZXJtaW5hbDsKKwlfX3U4ICBiU291cmNlSUQ7CisJX191OCAgaVRlcm1pbmFsOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgVVZDX0RUX09VVFBVVF9URVJNSU5BTF9TSVpFCQkJOQorCisvKiAzLjcuMi4zLiBDYW1lcmEgVGVybWluYWwgRGVzY3JpcHRvciAqLworc3RydWN0IHV2Y19jYW1lcmFfdGVybWluYWxfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOworCV9fdTggIGJUZXJtaW5hbElEOworCV9fdTE2IHdUZXJtaW5hbFR5cGU7CisJX191OCAgYkFzc29jVGVybWluYWw7CisJX191OCAgaVRlcm1pbmFsOworCV9fdTE2IHdPYmplY3RpdmVGb2NhbExlbmd0aE1pbjsKKwlfX3UxNiB3T2JqZWN0aXZlRm9jYWxMZW5ndGhNYXg7CisJX191MTYgd09jdWxhckZvY2FsTGVuZ3RoOworCV9fdTggIGJDb250cm9sU2l6ZTsKKwlfX3U4ICBibUNvbnRyb2xzWzNdOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgVVZDX0RUX0NBTUVSQV9URVJNSU5BTF9TSVpFKG4pCQkJKDE1KyhuKSkKKworLyogMy43LjIuNC4gU2VsZWN0b3IgVW5pdCBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdXZjX3NlbGVjdG9yX3VuaXRfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOworCV9fdTggIGJVbml0SUQ7CisJX191OCAgYk5ySW5QaW5zOworCV9fdTggIGJhU291cmNlSURbMF07CisJX191OCAgaVNlbGVjdG9yOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgVVZDX0RUX1NFTEVDVE9SX1VOSVRfU0laRShuKQkJCSg2KyhuKSkKKworI2RlZmluZSBVVkNfU0VMRUNUT1JfVU5JVF9ERVNDUklQVE9SKG4pCVwKKwl1dmNfc2VsZWN0b3JfdW5pdF9kZXNjcmlwdG9yXyMjbgorCisjZGVmaW5lIERFQ0xBUkVfVVZDX1NFTEVDVE9SX1VOSVRfREVTQ1JJUFRPUihuKQlcCitzdHJ1Y3QgVVZDX1NFTEVDVE9SX1VOSVRfREVTQ1JJUFRPUihuKSB7CQlcCisJX191OCAgYkxlbmd0aDsJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CQkJXAorCV9fdTggIGJVbml0SUQ7CQkJCQlcCisJX191OCAgYk5ySW5QaW5zOwkJCQlcCisJX191OCAgYmFTb3VyY2VJRFtuXTsJCQkJXAorCV9fdTggIGlTZWxlY3RvcjsJCQkJXAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKworLyogMy43LjIuNS4gUHJvY2Vzc2luZyBVbml0IERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1dmNfcHJvY2Vzc2luZ191bml0X2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKKwlfX3U4ICBiVW5pdElEOworCV9fdTggIGJTb3VyY2VJRDsKKwlfX3UxNiB3TWF4TXVsdGlwbGllcjsKKwlfX3U4ICBiQ29udHJvbFNpemU7CisJX191OCAgYm1Db250cm9sc1syXTsKKwlfX3U4ICBpUHJvY2Vzc2luZzsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisjZGVmaW5lIFVWQ19EVF9QUk9DRVNTSU5HX1VOSVRfU0laRShuKQkJCSg5KyhuKSkKKworLyogMy43LjIuNi4gRXh0ZW5zaW9uIFVuaXQgRGVzY3JpcHRvciAqLworc3RydWN0IHV2Y19leHRlbnNpb25fdW5pdF9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CisJX191OCAgYlVuaXRJRDsKKwlfX3U4ICBndWlkRXh0ZW5zaW9uQ29kZVsxNl07CisJX191OCAgYk51bUNvbnRyb2xzOworCV9fdTggIGJOckluUGluczsKKwlfX3U4ICBiYVNvdXJjZUlEWzBdOworCV9fdTggIGJDb250cm9sU2l6ZTsKKwlfX3U4ICBibUNvbnRyb2xzWzBdOworCV9fdTggIGlFeHRlbnNpb247Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworI2RlZmluZSBVVkNfRFRfRVhURU5TSU9OX1VOSVRfU0laRShwLCBuKQkJKDI0KyhwKSsobikpCisKKyNkZWZpbmUgVVZDX0VYVEVOU0lPTl9VTklUX0RFU0NSSVBUT1IocCwgbikgXAorCXV2Y19leHRlbnNpb25fdW5pdF9kZXNjcmlwdG9yXyMjcF8jI24KKworI2RlZmluZSBERUNMQVJFX1VWQ19FWFRFTlNJT05fVU5JVF9ERVNDUklQVE9SKHAsIG4pCVwKK3N0cnVjdCBVVkNfRVhURU5TSU9OX1VOSVRfREVTQ1JJUFRPUihwLCBuKSB7CQlcCisJX191OCAgYkxlbmd0aDsJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CQkJXAorCV9fdTggIGJVbml0SUQ7CQkJCQlcCisJX191OCAgZ3VpZEV4dGVuc2lvbkNvZGVbMTZdOwkJCVwKKwlfX3U4ICBiTnVtQ29udHJvbHM7CQkJCVwKKwlfX3U4ICBiTnJJblBpbnM7CQkJCVwKKwlfX3U4ICBiYVNvdXJjZUlEW3BdOwkJCQlcCisJX191OCAgYkNvbnRyb2xTaXplOwkJCQlcCisJX191OCAgYm1Db250cm9sc1tuXTsJCQkJXAorCV9fdTggIGlFeHRlbnNpb247CQkJCVwKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKy8qIDMuOC4yLjIuIFZpZGVvIENvbnRyb2wgSW50ZXJydXB0IEVuZHBvaW50IERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1dmNfY29udHJvbF9lbmRwb2ludF9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CisJX191MTYgd01heFRyYW5zZmVyU2l6ZTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisjZGVmaW5lIFVWQ19EVF9DT05UUk9MX0VORFBPSU5UX1NJWkUJCQk1CisKKy8qIDMuOS4yLjEuIElucHV0IEhlYWRlciBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdXZjX2lucHV0X2hlYWRlcl9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CisJX191OCAgYk51bUZvcm1hdHM7CisJX191MTYgd1RvdGFsTGVuZ3RoOworCV9fdTggIGJFbmRwb2ludEFkZHJlc3M7CisJX191OCAgYm1JbmZvOworCV9fdTggIGJUZXJtaW5hbExpbms7CisJX191OCAgYlN0aWxsQ2FwdHVyZU1ldGhvZDsKKwlfX3U4ICBiVHJpZ2dlclN1cHBvcnQ7CisJX191OCAgYlRyaWdnZXJVc2FnZTsKKwlfX3U4ICBiQ29udHJvbFNpemU7CisJX191OCAgYm1hQ29udHJvbHNbXTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisjZGVmaW5lIFVWQ19EVF9JTlBVVF9IRUFERVJfU0laRShuLCBwKQkJCSgxMysobipwKSkKKworI2RlZmluZSBVVkNfSU5QVVRfSEVBREVSX0RFU0NSSVBUT1IobiwgcCkgXAorCXV2Y19pbnB1dF9oZWFkZXJfZGVzY3JpcHRvcl8jI25fIyNwCisKKyNkZWZpbmUgREVDTEFSRV9VVkNfSU5QVVRfSEVBREVSX0RFU0NSSVBUT1IobiwgcCkJXAorc3RydWN0IFVWQ19JTlBVVF9IRUFERVJfREVTQ1JJUFRPUihuLCBwKSB7CQlcCisJX191OCAgYkxlbmd0aDsJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CQkJXAorCV9fdTggIGJOdW1Gb3JtYXRzOwkJCQlcCisJX191MTYgd1RvdGFsTGVuZ3RoOwkJCQlcCisJX191OCAgYkVuZHBvaW50QWRkcmVzczsJCQkJXAorCV9fdTggIGJtSW5mbzsJCQkJCVwKKwlfX3U4ICBiVGVybWluYWxMaW5rOwkJCQlcCisJX191OCAgYlN0aWxsQ2FwdHVyZU1ldGhvZDsJCQlcCisJX191OCAgYlRyaWdnZXJTdXBwb3J0OwkJCQlcCisJX191OCAgYlRyaWdnZXJVc2FnZTsJCQkJXAorCV9fdTggIGJDb250cm9sU2l6ZTsJCQkJXAorCV9fdTggIGJtYUNvbnRyb2xzW3BdW25dOwkJCVwKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKy8qIDMuOS4yLjIuIE91dHB1dCBIZWFkZXIgRGVzY3JpcHRvciAqLworc3RydWN0IHV2Y19vdXRwdXRfaGVhZGVyX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKKwlfX3U4ICBiTnVtRm9ybWF0czsKKwlfX3UxNiB3VG90YWxMZW5ndGg7CisJX191OCAgYkVuZHBvaW50QWRkcmVzczsKKwlfX3U4ICBiVGVybWluYWxMaW5rOworCV9fdTggIGJDb250cm9sU2l6ZTsKKwlfX3U4ICBibWFDb250cm9sc1tdOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgVVZDX0RUX09VVFBVVF9IRUFERVJfU0laRShuLCBwKQkJCSg5KyhuKnApKQorCisjZGVmaW5lIFVWQ19PVVRQVVRfSEVBREVSX0RFU0NSSVBUT1IobiwgcCkgXAorCXV2Y19vdXRwdXRfaGVhZGVyX2Rlc2NyaXB0b3JfIyNuXyMjcAorCisjZGVmaW5lIERFQ0xBUkVfVVZDX09VVFBVVF9IRUFERVJfREVTQ1JJUFRPUihuLCBwKQlcCitzdHJ1Y3QgVVZDX09VVFBVVF9IRUFERVJfREVTQ1JJUFRPUihuLCBwKSB7CQlcCisJX191OCAgYkxlbmd0aDsJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CQkJXAorCV9fdTggIGJOdW1Gb3JtYXRzOwkJCQlcCisJX191MTYgd1RvdGFsTGVuZ3RoOwkJCQlcCisJX191OCAgYkVuZHBvaW50QWRkcmVzczsJCQkJXAorCV9fdTggIGJUZXJtaW5hbExpbms7CQkJCVwKKwlfX3U4ICBiQ29udHJvbFNpemU7CQkJCVwKKwlfX3U4ICBibWFDb250cm9sc1twXVtuXTsJCQlcCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQorCisvKiAzLjkuMi42LiBDb2xvciBtYXRjaGluZyBkZXNjcmlwdG9yICovCitzdHJ1Y3QgdXZjX2NvbG9yX21hdGNoaW5nX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsKKwlfX3U4ICBiQ29sb3JQcmltYXJpZXM7CisJX191OCAgYlRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzOworCV9fdTggIGJNYXRyaXhDb2VmZmljaWVudHM7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworI2RlZmluZSBVVkNfRFRfQ09MT1JfTUFUQ0hJTkdfU0laRQkJCTYKKworLyogNC4zLjEuMS4gVmlkZW8gUHJvYmUgYW5kIENvbW1pdCBDb250cm9scyAqLworc3RydWN0IHV2Y19zdHJlYW1pbmdfY29udHJvbCB7CisJX191MTYgYm1IaW50OworCV9fdTggIGJGb3JtYXRJbmRleDsKKwlfX3U4ICBiRnJhbWVJbmRleDsKKwlfX3UzMiBkd0ZyYW1lSW50ZXJ2YWw7CisJX191MTYgd0tleUZyYW1lUmF0ZTsKKwlfX3UxNiB3UEZyYW1lUmF0ZTsKKwlfX3UxNiB3Q29tcFF1YWxpdHk7CisJX191MTYgd0NvbXBXaW5kb3dTaXplOworCV9fdTE2IHdEZWxheTsKKwlfX3UzMiBkd01heFZpZGVvRnJhbWVTaXplOworCV9fdTMyIGR3TWF4UGF5bG9hZFRyYW5zZmVyU2l6ZTsKKwlfX3UzMiBkd0Nsb2NrRnJlcXVlbmN5OworCV9fdTggIGJtRnJhbWluZ0luZm87CisJX191OCAgYlByZWZlcmVkVmVyc2lvbjsKKwlfX3U4ICBiTWluVmVyc2lvbjsKKwlfX3U4ICBiTWF4VmVyc2lvbjsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKiBVbmNvbXByZXNzZWQgUGF5bG9hZCAtIDMuMS4xLiBVbmNvbXByZXNzZWQgVmlkZW8gRm9ybWF0IERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1dmNfZm9ybWF0X3VuY29tcHJlc3NlZCB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOworCV9fdTggIGJGb3JtYXRJbmRleDsKKwlfX3U4ICBiTnVtRnJhbWVEZXNjcmlwdG9yczsKKwlfX3U4ICBndWlkRm9ybWF0WzE2XTsKKwlfX3U4ICBiQml0c1BlclBpeGVsOworCV9fdTggIGJEZWZhdWx0RnJhbWVJbmRleDsKKwlfX3U4ICBiQXNwZWN0UmF0aW9YOworCV9fdTggIGJBc3BlY3RSYXRpb1k7CisJX191OCAgYm1JbnRlcmZhY2VGbGFnczsKKwlfX3U4ICBiQ29weVByb3RlY3Q7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworI2RlZmluZSBVVkNfRFRfRk9STUFUX1VOQ09NUFJFU1NFRF9TSVpFCQkJMjcKKworLyogVW5jb21wcmVzc2VkIFBheWxvYWQgLSAzLjEuMi4gVW5jb21wcmVzc2VkIFZpZGVvIEZyYW1lIERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1dmNfZnJhbWVfdW5jb21wcmVzc2VkIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CisJX191OCAgYkZyYW1lSW5kZXg7CisJX191OCAgYm1DYXBhYmlsaXRpZXM7CisJX191MTYgd1dpZHRoOworCV9fdTE2IHdIZWlnaHQ7CisJX191MzIgZHdNaW5CaXRSYXRlOworCV9fdTMyIGR3TWF4Qml0UmF0ZTsKKwlfX3UzMiBkd01heFZpZGVvRnJhbWVCdWZmZXJTaXplOworCV9fdTMyIGR3RGVmYXVsdEZyYW1lSW50ZXJ2YWw7CisJX191OCAgYkZyYW1lSW50ZXJ2YWxUeXBlOworCV9fdTMyIGR3RnJhbWVJbnRlcnZhbFtdOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgVVZDX0RUX0ZSQU1FX1VOQ09NUFJFU1NFRF9TSVpFKG4pCQkoMjYrNCoobikpCisKKyNkZWZpbmUgVVZDX0ZSQU1FX1VOQ09NUFJFU1NFRChuKSBcCisJdXZjX2ZyYW1lX3VuY29tcHJlc3NlZF8jI24KKworI2RlZmluZSBERUNMQVJFX1VWQ19GUkFNRV9VTkNPTVBSRVNTRUQobikJCVwKK3N0cnVjdCBVVkNfRlJBTUVfVU5DT01QUkVTU0VEKG4pIHsJCQlcCisJX191OCAgYkxlbmd0aDsJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CQkJXAorCV9fdTggIGJGcmFtZUluZGV4OwkJCQlcCisJX191OCAgYm1DYXBhYmlsaXRpZXM7CQkJCVwKKwlfX3UxNiB3V2lkdGg7CQkJCQlcCisJX191MTYgd0hlaWdodDsJCQkJCVwKKwlfX3UzMiBkd01pbkJpdFJhdGU7CQkJCVwKKwlfX3UzMiBkd01heEJpdFJhdGU7CQkJCVwKKwlfX3UzMiBkd01heFZpZGVvRnJhbWVCdWZmZXJTaXplOwkJXAorCV9fdTMyIGR3RGVmYXVsdEZyYW1lSW50ZXJ2YWw7CQkJXAorCV9fdTggIGJGcmFtZUludGVydmFsVHlwZTsJCQlcCisJX191MzIgZHdGcmFtZUludGVydmFsW25dOwkJCVwKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKy8qIE1KUEVHIFBheWxvYWQgLSAzLjEuMS4gTUpQRUcgVmlkZW8gRm9ybWF0IERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1dmNfZm9ybWF0X21qcGVnIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGVzY3JpcHRvclN1YlR5cGU7CisJX191OCAgYkZvcm1hdEluZGV4OworCV9fdTggIGJOdW1GcmFtZURlc2NyaXB0b3JzOworCV9fdTggIGJtRmxhZ3M7CisJX191OCAgYkRlZmF1bHRGcmFtZUluZGV4OworCV9fdTggIGJBc3BlY3RSYXRpb1g7CisJX191OCAgYkFzcGVjdFJhdGlvWTsKKwlfX3U4ICBibUludGVyZmFjZUZsYWdzOworCV9fdTggIGJDb3B5UHJvdGVjdDsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisjZGVmaW5lIFVWQ19EVF9GT1JNQVRfTUpQRUdfU0laRQkJCTExCisKKy8qIE1KUEVHIFBheWxvYWQgLSAzLjEuMi4gTUpQRUcgVmlkZW8gRnJhbWUgRGVzY3JpcHRvciAqLworc3RydWN0IHV2Y19mcmFtZV9tanBlZyB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRlc2NyaXB0b3JTdWJUeXBlOworCV9fdTggIGJGcmFtZUluZGV4OworCV9fdTggIGJtQ2FwYWJpbGl0aWVzOworCV9fdTE2IHdXaWR0aDsKKwlfX3UxNiB3SGVpZ2h0OworCV9fdTMyIGR3TWluQml0UmF0ZTsKKwlfX3UzMiBkd01heEJpdFJhdGU7CisJX191MzIgZHdNYXhWaWRlb0ZyYW1lQnVmZmVyU2l6ZTsKKwlfX3UzMiBkd0RlZmF1bHRGcmFtZUludGVydmFsOworCV9fdTggIGJGcmFtZUludGVydmFsVHlwZTsKKwlfX3UzMiBkd0ZyYW1lSW50ZXJ2YWxbXTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisjZGVmaW5lIFVWQ19EVF9GUkFNRV9NSlBFR19TSVpFKG4pCQkJKDI2KzQqKG4pKQorCisjZGVmaW5lIFVWQ19GUkFNRV9NSlBFRyhuKSBcCisJdXZjX2ZyYW1lX21qcGVnXyMjbgorCisjZGVmaW5lIERFQ0xBUkVfVVZDX0ZSQU1FX01KUEVHKG4pCQkJXAorc3RydWN0IFVWQ19GUkFNRV9NSlBFRyhuKSB7CQkJCVwKKwlfX3U4ICBiTGVuZ3RoOwkJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yU3ViVHlwZTsJCQlcCisJX191OCAgYkZyYW1lSW5kZXg7CQkJCVwKKwlfX3U4ICBibUNhcGFiaWxpdGllczsJCQkJXAorCV9fdTE2IHdXaWR0aDsJCQkJCVwKKwlfX3UxNiB3SGVpZ2h0OwkJCQkJXAorCV9fdTMyIGR3TWluQml0UmF0ZTsJCQkJXAorCV9fdTMyIGR3TWF4Qml0UmF0ZTsJCQkJXAorCV9fdTMyIGR3TWF4VmlkZW9GcmFtZUJ1ZmZlclNpemU7CQlcCisJX191MzIgZHdEZWZhdWx0RnJhbWVJbnRlcnZhbDsJCQlcCisJX191OCAgYkZyYW1lSW50ZXJ2YWxUeXBlOwkJCVwKKwlfX3UzMiBkd0ZyYW1lSW50ZXJ2YWxbbl07CQkJXAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKworI2VuZGlmIC8qIF9fTElOVVhfVVNCX1ZJREVPX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2JkZXZpY2VfZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiZGV2aWNlX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M1ZWMwNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiZGV2aWNlX2ZzLmgKQEAgLTAsMCArMSwxNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCXVzYmRldmljZV9mcy5oICAtLSAgVVNCIGRldmljZSBmaWxlIHN5c3RlbS4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDIwMDAKKyAqICAgICAgICAgIFRob21hcyBTYWlsZXIgKHNhaWxlckBpZmUuZWUuZXRoei5jaCkKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAgSGlzdG9yeToKKyAqICAgMC4xICAwNC4wMS4yMDAwICBDcmVhdGVkCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9MSU5VWF9VU0JERVZJQ0VfRlNfSAorI2RlZmluZSBfTElOVVhfVVNCREVWSUNFX0ZTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIHVzYmRldmZzIGlvY3RsIGNvZGVzICovCisKK3N0cnVjdCB1c2JkZXZmc19jdHJsdHJhbnNmZXIgeworCV9fdTggYlJlcXVlc3RUeXBlOworCV9fdTggYlJlcXVlc3Q7CisJX191MTYgd1ZhbHVlOworCV9fdTE2IHdJbmRleDsKKwlfX3UxNiB3TGVuZ3RoOworCV9fdTMyIHRpbWVvdXQ7ICAvKiBpbiBtaWxsaXNlY29uZHMgKi8KKyAJdm9pZCAqZGF0YTsKK307CisKK3N0cnVjdCB1c2JkZXZmc19idWxrdHJhbnNmZXIgeworCXVuc2lnbmVkIGludCBlcDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCXVuc2lnbmVkIGludCB0aW1lb3V0OyAvKiBpbiBtaWxsaXNlY29uZHMgKi8KKwl2b2lkICpkYXRhOworfTsKKworc3RydWN0IHVzYmRldmZzX3NldGludGVyZmFjZSB7CisJdW5zaWduZWQgaW50IGludGVyZmFjZTsKKwl1bnNpZ25lZCBpbnQgYWx0c2V0dGluZzsKK307CisKK3N0cnVjdCB1c2JkZXZmc19kaXNjb25uZWN0c2lnbmFsIHsKKwl1bnNpZ25lZCBpbnQgc2lnbnI7CisJdm9pZCAqY29udGV4dDsKK307CisKKyNkZWZpbmUgVVNCREVWRlNfTUFYRFJJVkVSTkFNRSAyNTUKKworc3RydWN0IHVzYmRldmZzX2dldGRyaXZlciB7CisJdW5zaWduZWQgaW50IGludGVyZmFjZTsKKwljaGFyIGRyaXZlcltVU0JERVZGU19NQVhEUklWRVJOQU1FICsgMV07Cit9OworCitzdHJ1Y3QgdXNiZGV2ZnNfY29ubmVjdGluZm8geworCXVuc2lnbmVkIGludCBkZXZudW07CisJdW5zaWduZWQgY2hhciBzbG93OworfTsKKworI2RlZmluZSBVU0JERVZGU19VUkJfU0hPUlRfTk9UX09LCTB4MDEKKyNkZWZpbmUgVVNCREVWRlNfVVJCX0lTT19BU0FQCQkweDAyCisjZGVmaW5lIFVTQkRFVkZTX1VSQl9CVUxLX0NPTlRJTlVBVElPTgkweDA0CisjZGVmaW5lIFVTQkRFVkZTX1VSQl9OT19GU0JSCQkweDIwCisjZGVmaW5lIFVTQkRFVkZTX1VSQl9aRVJPX1BBQ0tFVAkweDQwCisjZGVmaW5lIFVTQkRFVkZTX1VSQl9OT19JTlRFUlJVUFQJMHg4MAorCisjZGVmaW5lIFVTQkRFVkZTX1VSQl9UWVBFX0lTTwkJICAgMAorI2RlZmluZSBVU0JERVZGU19VUkJfVFlQRV9JTlRFUlJVUFQJICAgMQorI2RlZmluZSBVU0JERVZGU19VUkJfVFlQRV9DT05UUk9MCSAgIDIKKyNkZWZpbmUgVVNCREVWRlNfVVJCX1RZUEVfQlVMSwkJICAgMworCitzdHJ1Y3QgdXNiZGV2ZnNfaXNvX3BhY2tldF9kZXNjIHsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoOworCXVuc2lnbmVkIGludCBhY3R1YWxfbGVuZ3RoOworCXVuc2lnbmVkIGludCBzdGF0dXM7Cit9OworCitzdHJ1Y3QgdXNiZGV2ZnNfdXJiIHsKKwl1bnNpZ25lZCBjaGFyIHR5cGU7CisJdW5zaWduZWQgY2hhciBlbmRwb2ludDsKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGludCBmbGFnczsKKwl2b2lkICpidWZmZXI7CisJaW50IGJ1ZmZlcl9sZW5ndGg7CisJaW50IGFjdHVhbF9sZW5ndGg7CisJaW50IHN0YXJ0X2ZyYW1lOworCWludCBudW1iZXJfb2ZfcGFja2V0czsKKwlpbnQgZXJyb3JfY291bnQ7CisJdW5zaWduZWQgaW50IHNpZ25yOwkvKiBzaWduYWwgdG8gYmUgc2VudCBvbiBjb21wbGV0aW9uLAorCQkJCSAgb3IgMCBpZiBub25lIHNob3VsZCBiZSBzZW50LiAqLworCXZvaWQgKnVzZXJjb250ZXh0OworCXN0cnVjdCB1c2JkZXZmc19pc29fcGFja2V0X2Rlc2MgaXNvX2ZyYW1lX2Rlc2NbMF07Cit9OworCisvKiBpb2N0bHMgZm9yIHRhbGtpbmcgZGlyZWN0bHkgdG8gZHJpdmVycyAqLworc3RydWN0IHVzYmRldmZzX2lvY3RsIHsKKwlpbnQJaWZubzsJCS8qIGludGVyZmFjZSAwLi5OIDsgbmVnYXRpdmUgbnVtYmVycyByZXNlcnZlZCAqLworCWludAlpb2N0bF9jb2RlOwkvKiBNVVNUIGVuY29kZSBzaXplICsgZGlyZWN0aW9uIG9mIGRhdGEgc28gdGhlCisJCQkJICogbWFjcm9zIGluIDxhc20vaW9jdGwuaD4gZ2l2ZSBjb3JyZWN0IHZhbHVlcyAqLworCXZvaWQgKmRhdGE7CS8qIHBhcmFtIGJ1ZmZlciAoaW4sIG9yIG91dCkgKi8KK307CisKKy8qIFlvdSBjYW4gZG8gbW9zdCB0aGluZ3Mgd2l0aCBodWJzIGp1c3QgdGhyb3VnaCBjb250cm9sIG1lc3NhZ2VzLAorICogZXhjZXB0IGZpbmQgb3V0IHdoYXQgZGV2aWNlIGNvbm5lY3RzIHRvIHdoYXQgcG9ydC4gKi8KK3N0cnVjdCB1c2JkZXZmc19odWJfcG9ydGluZm8geworCWNoYXIgbnBvcnRzOwkJLyogbnVtYmVyIG9mIGRvd25zdHJlYW0gcG9ydHMgaW4gdGhpcyBodWIgKi8KKwljaGFyIHBvcnQgWzEyN107CS8qIGUuZy4gcG9ydCAzIGNvbm5lY3RzIHRvIGRldmljZSAyNyAqLworfTsKKworCisjZGVmaW5lIFVTQkRFVkZTX0NPTlRST0wgICAgICAgICAgIF9JT1dSKCdVJywgMCwgc3RydWN0IHVzYmRldmZzX2N0cmx0cmFuc2ZlcikKKyNkZWZpbmUgVVNCREVWRlNfQ09OVFJPTDMyICAgICAgICAgICBfSU9XUignVScsIDAsIHN0cnVjdCB1c2JkZXZmc19jdHJsdHJhbnNmZXIzMikKKyNkZWZpbmUgVVNCREVWRlNfQlVMSyAgICAgICAgICAgICAgX0lPV1IoJ1UnLCAyLCBzdHJ1Y3QgdXNiZGV2ZnNfYnVsa3RyYW5zZmVyKQorI2RlZmluZSBVU0JERVZGU19CVUxLMzIgICAgICAgICAgICAgIF9JT1dSKCdVJywgMiwgc3RydWN0IHVzYmRldmZzX2J1bGt0cmFuc2ZlcjMyKQorI2RlZmluZSBVU0JERVZGU19SRVNFVEVQICAgICAgICAgICBfSU9SKCdVJywgMywgdW5zaWduZWQgaW50KQorI2RlZmluZSBVU0JERVZGU19TRVRJTlRFUkZBQ0UgICAgICBfSU9SKCdVJywgNCwgc3RydWN0IHVzYmRldmZzX3NldGludGVyZmFjZSkKKyNkZWZpbmUgVVNCREVWRlNfU0VUQ09ORklHVVJBVElPTiAgX0lPUignVScsIDUsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgVVNCREVWRlNfR0VURFJJVkVSICAgICAgICAgX0lPVygnVScsIDgsIHN0cnVjdCB1c2JkZXZmc19nZXRkcml2ZXIpCisjZGVmaW5lIFVTQkRFVkZTX1NVQk1JVFVSQiAgICAgICAgIF9JT1IoJ1UnLCAxMCwgc3RydWN0IHVzYmRldmZzX3VyYikKKyNkZWZpbmUgVVNCREVWRlNfU1VCTUlUVVJCMzIgICAgICAgX0lPUignVScsIDEwLCBzdHJ1Y3QgdXNiZGV2ZnNfdXJiMzIpCisjZGVmaW5lIFVTQkRFVkZTX0RJU0NBUkRVUkIgICAgICAgIF9JTygnVScsIDExKQorI2RlZmluZSBVU0JERVZGU19SRUFQVVJCICAgICAgICAgICBfSU9XKCdVJywgMTIsIHZvaWQgKikKKyNkZWZpbmUgVVNCREVWRlNfUkVBUFVSQjMyICAgICAgICAgX0lPVygnVScsIDEyLCBfX3UzMikKKyNkZWZpbmUgVVNCREVWRlNfUkVBUFVSQk5ERUxBWSAgICAgX0lPVygnVScsIDEzLCB2b2lkICopCisjZGVmaW5lIFVTQkRFVkZTX1JFQVBVUkJOREVMQVkzMiAgIF9JT1coJ1UnLCAxMywgX191MzIpCisjZGVmaW5lIFVTQkRFVkZTX0RJU0NTSUdOQUwgICAgICAgIF9JT1IoJ1UnLCAxNCwgc3RydWN0IHVzYmRldmZzX2Rpc2Nvbm5lY3RzaWduYWwpCisjZGVmaW5lIFVTQkRFVkZTX0RJU0NTSUdOQUwzMiAgICAgIF9JT1IoJ1UnLCAxNCwgc3RydWN0IHVzYmRldmZzX2Rpc2Nvbm5lY3RzaWduYWwzMikKKyNkZWZpbmUgVVNCREVWRlNfQ0xBSU1JTlRFUkZBQ0UgICAgX0lPUignVScsIDE1LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIFVTQkRFVkZTX1JFTEVBU0VJTlRFUkZBQ0UgIF9JT1IoJ1UnLCAxNiwgdW5zaWduZWQgaW50KQorI2RlZmluZSBVU0JERVZGU19DT05ORUNUSU5GTyAgICAgICBfSU9XKCdVJywgMTcsIHN0cnVjdCB1c2JkZXZmc19jb25uZWN0aW5mbykKKyNkZWZpbmUgVVNCREVWRlNfSU9DVEwgICAgICAgICAgICAgX0lPV1IoJ1UnLCAxOCwgc3RydWN0IHVzYmRldmZzX2lvY3RsKQorI2RlZmluZSBVU0JERVZGU19JT0NUTDMyICAgICAgICAgICBfSU9XUignVScsIDE4LCBzdHJ1Y3QgdXNiZGV2ZnNfaW9jdGwzMikKKyNkZWZpbmUgVVNCREVWRlNfSFVCX1BPUlRJTkZPICAgICAgX0lPUignVScsIDE5LCBzdHJ1Y3QgdXNiZGV2ZnNfaHViX3BvcnRpbmZvKQorI2RlZmluZSBVU0JERVZGU19SRVNFVCAgICAgICAgICAgICBfSU8oJ1UnLCAyMCkKKyNkZWZpbmUgVVNCREVWRlNfQ0xFQVJfSEFMVCAgICAgICAgX0lPUignVScsIDIxLCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIFVTQkRFVkZTX0RJU0NPTk5FQ1QgICAgICAgIF9JTygnVScsIDIyKQorI2RlZmluZSBVU0JERVZGU19DT05ORUNUICAgICAgICAgICBfSU8oJ1UnLCAyMykKKyNkZWZpbmUgVVNCREVWRlNfQ0xBSU1fUE9SVCAgICAgICAgX0lPUignVScsIDI0LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIFVTQkRFVkZTX1JFTEVBU0VfUE9SVCAgICAgIF9JT1IoJ1UnLCAyNSwgdW5zaWduZWQgaW50KQorI2VuZGlmIC8qIF9MSU5VWF9VU0JERVZJQ0VfRlNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91dGltZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91dGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZGY2NzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3V0aW1lLmgKQEAgLTAsMCArMSwxMSBAQAorI2lmbmRlZiBfTElOVVhfVVRJTUVfSAorI2RlZmluZSBfTElOVVhfVVRJTUVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IHV0aW1idWYgeworCV9fa2VybmVsX3RpbWVfdCBhY3RpbWU7CisJX19rZXJuZWxfdGltZV90IG1vZHRpbWU7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXRzbmFtZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91dHNuYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM4N2Q0NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXRzbmFtZS5oCkBAIC0wLDAgKzEsMzQgQEAKKyNpZm5kZWYgX0xJTlVYX1VUU05BTUVfSAorI2RlZmluZSBfTElOVVhfVVRTTkFNRV9ICisKKyNkZWZpbmUgX19PTERfVVRTX0xFTiA4CisKK3N0cnVjdCBvbGRvbGRfdXRzbmFtZSB7CisJY2hhciBzeXNuYW1lWzldOworCWNoYXIgbm9kZW5hbWVbOV07CisJY2hhciByZWxlYXNlWzldOworCWNoYXIgdmVyc2lvbls5XTsKKwljaGFyIG1hY2hpbmVbOV07Cit9OworCisjZGVmaW5lIF9fTkVXX1VUU19MRU4gNjQKKworc3RydWN0IG9sZF91dHNuYW1lIHsKKwljaGFyIHN5c25hbWVbNjVdOworCWNoYXIgbm9kZW5hbWVbNjVdOworCWNoYXIgcmVsZWFzZVs2NV07CisJY2hhciB2ZXJzaW9uWzY1XTsKKwljaGFyIG1hY2hpbmVbNjVdOworfTsKKworc3RydWN0IG5ld191dHNuYW1lIHsKKwljaGFyIHN5c25hbWVbX19ORVdfVVRTX0xFTiArIDFdOworCWNoYXIgbm9kZW5hbWVbX19ORVdfVVRTX0xFTiArIDFdOworCWNoYXIgcmVsZWFzZVtfX05FV19VVFNfTEVOICsgMV07CisJY2hhciB2ZXJzaW9uW19fTkVXX1VUU19MRU4gKyAxXTsKKwljaGFyIG1hY2hpbmVbX19ORVdfVVRTX0xFTiArIDFdOworCWNoYXIgZG9tYWlubmFtZVtfX05FV19VVFNfTEVOICsgMV07Cit9OworCisKKyNlbmRpZiAvKiBfTElOVVhfVVRTTkFNRV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3V2Y3ZpZGVvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3V2Y3ZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhYWNmYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXZjdmlkZW8uaApAQCAtMCwwICsxLDY5IEBACisjaWZuZGVmIF9fTElOVVhfVVZDVklERU9fSF8KKyNkZWZpbmUgX19MSU5VWF9VVkNWSURFT19IXworCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogRHluYW1pYyBjb250cm9scworICovCisKKy8qIERhdGEgdHlwZXMgZm9yIFVWQyBjb250cm9sIGRhdGEgKi8KKyNkZWZpbmUgVVZDX0NUUkxfREFUQV9UWVBFX1JBVwkJMAorI2RlZmluZSBVVkNfQ1RSTF9EQVRBX1RZUEVfU0lHTkVECTEKKyNkZWZpbmUgVVZDX0NUUkxfREFUQV9UWVBFX1VOU0lHTkVECTIKKyNkZWZpbmUgVVZDX0NUUkxfREFUQV9UWVBFX0JPT0xFQU4JMworI2RlZmluZSBVVkNfQ1RSTF9EQVRBX1RZUEVfRU5VTQkJNAorI2RlZmluZSBVVkNfQ1RSTF9EQVRBX1RZUEVfQklUTUFTSwk1CisKKy8qIENvbnRyb2wgZmxhZ3MgKi8KKyNkZWZpbmUgVVZDX0NUUkxfRkxBR19TRVRfQ1VSCQkoMSA8PCAwKQorI2RlZmluZSBVVkNfQ1RSTF9GTEFHX0dFVF9DVVIJCSgxIDw8IDEpCisjZGVmaW5lIFVWQ19DVFJMX0ZMQUdfR0VUX01JTgkJKDEgPDwgMikKKyNkZWZpbmUgVVZDX0NUUkxfRkxBR19HRVRfTUFYCQkoMSA8PCAzKQorI2RlZmluZSBVVkNfQ1RSTF9GTEFHX0dFVF9SRVMJCSgxIDw8IDQpCisjZGVmaW5lIFVWQ19DVFJMX0ZMQUdfR0VUX0RFRgkJKDEgPDwgNSkKKy8qIENvbnRyb2wgc2hvdWxkIGJlIHNhdmVkIGF0IHN1c3BlbmQgYW5kIHJlc3RvcmVkIGF0IHJlc3VtZS4gKi8KKyNkZWZpbmUgVVZDX0NUUkxfRkxBR19SRVNUT1JFCQkoMSA8PCA2KQorLyogQ29udHJvbCBjYW4gYmUgdXBkYXRlZCBieSB0aGUgY2FtZXJhLiAqLworI2RlZmluZSBVVkNfQ1RSTF9GTEFHX0FVVE9fVVBEQVRFCSgxIDw8IDcpCisKKyNkZWZpbmUgVVZDX0NUUkxfRkxBR19HRVRfUkFOR0UgXAorCShVVkNfQ1RSTF9GTEFHX0dFVF9DVVIgfCBVVkNfQ1RSTF9GTEFHX0dFVF9NSU4gfCBcCisJIFVWQ19DVFJMX0ZMQUdfR0VUX01BWCB8IFVWQ19DVFJMX0ZMQUdfR0VUX1JFUyB8IFwKKwkgVVZDX0NUUkxfRkxBR19HRVRfREVGKQorCitzdHJ1Y3QgdXZjX21lbnVfaW5mbyB7CisJX191MzIgdmFsdWU7CisJX191OCBuYW1lWzMyXTsKK307CisKK3N0cnVjdCB1dmNfeHVfY29udHJvbF9tYXBwaW5nIHsKKwlfX3UzMiBpZDsKKwlfX3U4IG5hbWVbMzJdOworCV9fdTggZW50aXR5WzE2XTsKKwlfX3U4IHNlbGVjdG9yOworCisJX191OCBzaXplOworCV9fdTggb2Zmc2V0OworCV9fdTMyIHY0bDJfdHlwZTsKKwlfX3UzMiBkYXRhX3R5cGU7CisKKwlzdHJ1Y3QgdXZjX21lbnVfaW5mbyAqbWVudV9pbmZvOworCV9fdTMyIG1lbnVfY291bnQ7CisKKwlfX3UzMiByZXNlcnZlZFs0XTsKK307CisKK3N0cnVjdCB1dmNfeHVfY29udHJvbF9xdWVyeSB7CisJX191OCB1bml0OworCV9fdTggc2VsZWN0b3I7CisJX191OCBxdWVyeTsKKwlfX3UxNiBzaXplOworCV9fdTggKmRhdGE7Cit9OworCisjZGVmaW5lIFVWQ0lPQ19DVFJMX01BUAkJX0lPV1IoJ3UnLCAweDIwLCBzdHJ1Y3QgdXZjX3h1X2NvbnRyb2xfbWFwcGluZykKKyNkZWZpbmUgVVZDSU9DX0NUUkxfUVVFUlkJX0lPV1IoJ3UnLCAweDIxLCBzdHJ1Y3QgdXZjX3h1X2NvbnRyb2xfcXVlcnkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92NGwyLW1lZGlhYnVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Y0bDItbWVkaWFidXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWE3Zjc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92NGwyLW1lZGlhYnVzLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBNZWRpYSBCdXMgQVBJIGhlYWRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgR3Vlbm5hZGkgTGlha2hvdmV0c2tpIDxnLmxpYWtob3ZldHNraUBnbXguZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfVjRMMl9NRURJQUJVU19ICisjZGVmaW5lIF9fTElOVVhfVjRMMl9NRURJQUJVU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorCisvKgorICogVGhlc2UgcGl4ZWwgY29kZXMgdW5pcXVlbHkgaWRlbnRpZnkgZGF0YSBmb3JtYXRzIG9uIHRoZSBtZWRpYSBidXMuIE1vc3RseQorICogdGhleSBjb3JyZXNwb25kIHRvIHNpbWlsYXJseSBuYW1lZCBWNEwyX1BJWF9GTVRfKiBmb3JtYXRzLCBmb3JtYXQgMCBpcworICogcmVzZXJ2ZWQsIFY0TDJfTUJVU19GTVRfRklYRUQgc2hhbGwgYmUgdXNlZCBieSBob3N0LWNsaWVudCBwYWlycywgd2hlcmUgdGhlCisgKiBkYXRhIGZvcm1hdCBpcyBmaXhlZC4gQWRkaXRpb25hbGx5LCAiMlg4IiBtZWFucyB0aGF0IG9uZSBwaXhlbCBpcyB0cmFuc2ZlcnJlZAorICogaW4gdHdvIDgtYml0IHNhbXBsZXMsICJCRSIgb3IgIkxFIiBzcGVjaWZ5IGluIHdoaWNoIG9yZGVyIHRob3NlIHNhbXBsZXMgYXJlCisgKiB0cmFuc2ZlcnJlZCBvdmVyIHRoZSBidXM6ICJMRSIgbWVhbnMgdGhhdCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUKKyAqIHRyYW5zZmVycmVkIGZpcnN0LCAiQkUiIG1lYW5zIHRoYXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUgdHJhbnNmZXJyZWQKKyAqIGZpcnN0LCBhbmQgIlBBREhJIiBhbmQgIlBBRExPIiBkZWZpbmUgd2hpY2ggYml0cyAtIGxvdyBvciBoaWdoLCBpbiB0aGUKKyAqIGluY29tcGxldGUgaGlnaCBieXRlLCBhcmUgZmlsbGVkIHdpdGggcGFkZGluZyBiaXRzLgorICoKKyAqIFRoZSBwaXhlbCBjb2RlcyBhcmUgZ3JvdXBlZCBieSB0eXBlLCBidXNfd2lkdGgsIGJpdHMgcGVyIGNvbXBvbmVudCwgc2FtcGxlcworICogcGVyIHBpeGVsIGFuZCBvcmRlciBvZiBzdWJzYW1wbGVzLiBOdW1lcmljYWwgdmFsdWVzIGFyZSBzb3J0ZWQgdXNpbmcgZ2VuZXJpYworICogbnVtZXJpY2FsIHNvcnQgb3JkZXIgKDggdGh1cyBjb21lcyBiZWZvcmUgMTApLgorICoKKyAqIEFzIHRoZWlyIHZhbHVlIGNhbid0IGNoYW5nZSB3aGVuIGEgbmV3IHBpeGVsIGNvZGUgaXMgaW5zZXJ0ZWQgaW4gdGhlCisgKiBlbnVtZXJhdGlvbiwgdGhlIHBpeGVsIGNvZGVzIGFyZSBleHBsaWNpdGx5IGdpdmVuIGEgbnVtZXJpY2FsIHZhbHVlLiBUaGUgbmV4dAorICogZnJlZSB2YWx1ZXMgZm9yIGVhY2ggY2F0ZWdvcnkgYXJlIGxpc3RlZCBiZWxvdywgdXBkYXRlIHRoZW0gd2hlbiBpbnNlcnRpbmcKKyAqIG5ldyBwaXhlbCBjb2Rlcy4KKyAqLworZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIHsKKwlWNEwyX01CVVNfRk1UX0ZJWEVEID0gMHgwMDAxLAorCisJLyogUkdCIC0gbmV4dCBpcyAweDEwMDkgKi8KKwlWNEwyX01CVVNfRk1UX1JHQjQ0NF8yWDhfUEFESElfQkUgPSAweDEwMDEsCisJVjRMMl9NQlVTX0ZNVF9SR0I0NDRfMlg4X1BBREhJX0xFID0gMHgxMDAyLAorCVY0TDJfTUJVU19GTVRfUkdCNTU1XzJYOF9QQURISV9CRSA9IDB4MTAwMywKKwlWNEwyX01CVVNfRk1UX1JHQjU1NV8yWDhfUEFESElfTEUgPSAweDEwMDQsCisJVjRMMl9NQlVTX0ZNVF9CR1I1NjVfMlg4X0JFID0gMHgxMDA1LAorCVY0TDJfTUJVU19GTVRfQkdSNTY1XzJYOF9MRSA9IDB4MTAwNiwKKwlWNEwyX01CVVNfRk1UX1JHQjU2NV8yWDhfQkUgPSAweDEwMDcsCisJVjRMMl9NQlVTX0ZNVF9SR0I1NjVfMlg4X0xFID0gMHgxMDA4LAorCisJLyogWVVWIChpbmNsdWRpbmcgZ3JleSkgLSBuZXh0IGlzIDB4MjAxNCAqLworCVY0TDJfTUJVU19GTVRfWThfMVg4ID0gMHgyMDAxLAorCVY0TDJfTUJVU19GTVRfVVlWWThfMV81WDggPSAweDIwMDIsCisJVjRMMl9NQlVTX0ZNVF9WWVVZOF8xXzVYOCA9IDB4MjAwMywKKwlWNEwyX01CVVNfRk1UX1lVWVY4XzFfNVg4ID0gMHgyMDA0LAorCVY0TDJfTUJVU19GTVRfWVZZVThfMV81WDggPSAweDIwMDUsCisJVjRMMl9NQlVTX0ZNVF9VWVZZOF8yWDggPSAweDIwMDYsCisJVjRMMl9NQlVTX0ZNVF9WWVVZOF8yWDggPSAweDIwMDcsCisJVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDggPSAweDIwMDgsCisJVjRMMl9NQlVTX0ZNVF9ZVllVOF8yWDggPSAweDIwMDksCisJVjRMMl9NQlVTX0ZNVF9ZMTBfMVgxMCA9IDB4MjAwYSwKKwlWNEwyX01CVVNfRk1UX1lVWVYxMF8yWDEwID0gMHgyMDBiLAorCVY0TDJfTUJVU19GTVRfWVZZVTEwXzJYMTAgPSAweDIwMGMsCisJVjRMMl9NQlVTX0ZNVF9ZMTJfMVgxMiA9IDB4MjAxMywKKwlWNEwyX01CVVNfRk1UX1VZVlk4XzFYMTYgPSAweDIwMGYsCisJVjRMMl9NQlVTX0ZNVF9WWVVZOF8xWDE2ID0gMHgyMDEwLAorCVY0TDJfTUJVU19GTVRfWVVZVjhfMVgxNiA9IDB4MjAxMSwKKwlWNEwyX01CVVNfRk1UX1lWWVU4XzFYMTYgPSAweDIwMTIsCisJVjRMMl9NQlVTX0ZNVF9ZVVlWMTBfMVgyMCA9IDB4MjAwZCwKKwlWNEwyX01CVVNfRk1UX1lWWVUxMF8xWDIwID0gMHgyMDBlLAorCisJLyogQmF5ZXIgLSBuZXh0IGlzIDB4MzAxNSAqLworCVY0TDJfTUJVU19GTVRfU0JHR1I4XzFYOCA9IDB4MzAwMSwKKwlWNEwyX01CVVNfRk1UX1NHQlJHOF8xWDggPSAweDMwMTMsCisJVjRMMl9NQlVTX0ZNVF9TR1JCRzhfMVg4ID0gMHgzMDAyLAorCVY0TDJfTUJVU19GTVRfU1JHR0I4XzFYOCA9IDB4MzAxNCwKKwlWNEwyX01CVVNfRk1UX1NCR0dSMTBfRFBDTThfMVg4ID0gMHgzMDBiLAorCVY0TDJfTUJVU19GTVRfU0dCUkcxMF9EUENNOF8xWDggPSAweDMwMGMsCisJVjRMMl9NQlVTX0ZNVF9TR1JCRzEwX0RQQ004XzFYOCA9IDB4MzAwOSwKKwlWNEwyX01CVVNfRk1UX1NSR0dCMTBfRFBDTThfMVg4ID0gMHgzMDBkLAorCVY0TDJfTUJVU19GTVRfU0JHR1IxMF8yWDhfUEFESElfQkUgPSAweDMwMDMsCisJVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzJYOF9QQURISV9MRSA9IDB4MzAwNCwKKwlWNEwyX01CVVNfRk1UX1NCR0dSMTBfMlg4X1BBRExPX0JFID0gMHgzMDA1LAorCVY0TDJfTUJVU19GTVRfU0JHR1IxMF8yWDhfUEFETE9fTEUgPSAweDMwMDYsCisJVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzFYMTAgPSAweDMwMDcsCisJVjRMMl9NQlVTX0ZNVF9TR0JSRzEwXzFYMTAgPSAweDMwMGUsCisJVjRMMl9NQlVTX0ZNVF9TR1JCRzEwXzFYMTAgPSAweDMwMGEsCisJVjRMMl9NQlVTX0ZNVF9TUkdHQjEwXzFYMTAgPSAweDMwMGYsCisJVjRMMl9NQlVTX0ZNVF9TQkdHUjEyXzFYMTIgPSAweDMwMDgsCisJVjRMMl9NQlVTX0ZNVF9TR0JSRzEyXzFYMTIgPSAweDMwMTAsCisJVjRMMl9NQlVTX0ZNVF9TR1JCRzEyXzFYMTIgPSAweDMwMTEsCisJVjRMMl9NQlVTX0ZNVF9TUkdHQjEyXzFYMTIgPSAweDMwMTIsCisKKwkvKiBKUEVHIGNvbXByZXNzZWQgZm9ybWF0cyAtIG5leHQgaXMgMHg0MDAyICovCisJVjRMMl9NQlVTX0ZNVF9KUEVHXzFYOCA9IDB4NDAwMSwKK307CisKKy8qKgorICogc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAtIGZyYW1lIGZvcm1hdCBvbiB0aGUgbWVkaWEgYnVzCisgKiBAd2lkdGg6CWZyYW1lIHdpZHRoCisgKiBAaGVpZ2h0OglmcmFtZSBoZWlnaHQKKyAqIEBjb2RlOglkYXRhIGZvcm1hdCBjb2RlIChmcm9tIGVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSkKKyAqIEBmaWVsZDoJdXNlZCBpbnRlcmxhY2luZyB0eXBlIChmcm9tIGVudW0gdjRsMl9maWVsZCkKKyAqIEBjb2xvcnNwYWNlOgljb2xvcnNwYWNlIG9mIHRoZSBkYXRhIChmcm9tIGVudW0gdjRsMl9jb2xvcnNwYWNlKQorICovCitzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IHsKKwlfX3UzMgkJCXdpZHRoOworCV9fdTMyCQkJaGVpZ2h0OworCV9fdTMyCQkJY29kZTsKKwlfX3UzMgkJCWZpZWxkOworCV9fdTMyCQkJY29sb3JzcGFjZTsKKwlfX3UzMgkJCXJlc2VydmVkWzddOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Y0bDItc3ViZGV2LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Y0bDItc3ViZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyOWNiYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdjRsMi1zdWJkZXYuaApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIFY0TDIgc3ViZGV2IHVzZXJzcGFjZSBBUEkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBDb250YWN0czogTGF1cmVudCBQaW5jaGFydCA8bGF1cmVudC5waW5jaGFydEBpZGVhc29uYm9hcmQuY29tPgorICoJICAgICBTYWthcmkgQWlsdXMgPHNha2FyaS5haWx1c0Bpa2kuZmk+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX19MSU5VWF9WNEwyX1NVQkRFVl9ICisjZGVmaW5lIF9fTElOVVhfVjRMMl9TVUJERVZfSAorCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Y0bDItbWVkaWFidXMuaD4KKworLyoqCisgKiBlbnVtIHY0bDJfc3ViZGV2X2Zvcm1hdF93aGVuY2UgLSBNZWRpYSBidXMgZm9ybWF0IHR5cGUKKyAqIEBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZOiB0cnkgZm9ybWF0LCBmb3IgbmVnb3RpYXRpb24gb25seQorICogQFY0TDJfU1VCREVWX0ZPUk1BVF9BQ1RJVkU6IGFjdGl2ZSBmb3JtYXQsIGFwcGxpZWQgdG8gdGhlIGRldmljZQorICovCitlbnVtIHY0bDJfc3ViZGV2X2Zvcm1hdF93aGVuY2UgeworCVY0TDJfU1VCREVWX0ZPUk1BVF9UUlkgPSAwLAorCVY0TDJfU1VCREVWX0ZPUk1BVF9BQ1RJVkUgPSAxLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0IC0gUGFkLWxldmVsIG1lZGlhIGJ1cyBmb3JtYXQKKyAqIEB3aGljaDogZm9ybWF0IHR5cGUgKGZyb20gZW51bSB2NGwyX3N1YmRldl9mb3JtYXRfd2hlbmNlKQorICogQHBhZDogcGFkIG51bWJlciwgYXMgcmVwb3J0ZWQgYnkgdGhlIG1lZGlhIEFQSQorICogQGZvcm1hdDogbWVkaWEgYnVzIGZvcm1hdCAoZm9ybWF0IGNvZGUgYW5kIGZyYW1lIHNpemUpCisgKi8KK3N0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgeworCV9fdTMyIHdoaWNoOworCV9fdTMyIHBhZDsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IGZvcm1hdDsKKwlfX3UzMiByZXNlcnZlZFs4XTsKK307CisKKy8qKgorICogc3RydWN0IHY0bDJfc3ViZGV2X2Nyb3AgLSBQYWQtbGV2ZWwgY3JvcCBzZXR0aW5ncworICogQHdoaWNoOiBmb3JtYXQgdHlwZSAoZnJvbSBlbnVtIHY0bDJfc3ViZGV2X2Zvcm1hdF93aGVuY2UpCisgKiBAcGFkOiBwYWQgbnVtYmVyLCBhcyByZXBvcnRlZCBieSB0aGUgbWVkaWEgQVBJCisgKiBAcmVjdDogcGFkIGNyb3AgcmVjdGFuZ2xlIGJvdW5kYXJpZXMKKyAqLworc3RydWN0IHY0bDJfc3ViZGV2X2Nyb3AgeworCV9fdTMyIHdoaWNoOworCV9fdTMyIHBhZDsKKwlzdHJ1Y3QgdjRsMl9yZWN0IHJlY3Q7CisJX191MzIgcmVzZXJ2ZWRbOF07Cit9OworCisvKioKKyAqIHN0cnVjdCB2NGwyX3N1YmRldl9tYnVzX2NvZGVfZW51bSAtIE1lZGlhIGJ1cyBmb3JtYXQgZW51bWVyYXRpb24KKyAqIEBwYWQ6IHBhZCBudW1iZXIsIGFzIHJlcG9ydGVkIGJ5IHRoZSBtZWRpYSBBUEkKKyAqIEBpbmRleDogZm9ybWF0IGluZGV4IGR1cmluZyBlbnVtZXJhdGlvbgorICogQGNvZGU6IGZvcm1hdCBjb2RlIChmcm9tIGVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSkKKyAqLworc3RydWN0IHY0bDJfc3ViZGV2X21idXNfY29kZV9lbnVtIHsKKwlfX3UzMiBwYWQ7CisJX191MzIgaW5kZXg7CisJX191MzIgY29kZTsKKwlfX3UzMiByZXNlcnZlZFs5XTsKK307CisKKy8qKgorICogc3RydWN0IHY0bDJfc3ViZGV2X2ZyYW1lX3NpemVfZW51bSAtIE1lZGlhIGJ1cyBmb3JtYXQgZW51bWVyYXRpb24KKyAqIEBwYWQ6IHBhZCBudW1iZXIsIGFzIHJlcG9ydGVkIGJ5IHRoZSBtZWRpYSBBUEkKKyAqIEBpbmRleDogZm9ybWF0IGluZGV4IGR1cmluZyBlbnVtZXJhdGlvbgorICogQGNvZGU6IGZvcm1hdCBjb2RlIChmcm9tIGVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSkKKyAqLworc3RydWN0IHY0bDJfc3ViZGV2X2ZyYW1lX3NpemVfZW51bSB7CisJX191MzIgaW5kZXg7CisJX191MzIgcGFkOworCV9fdTMyIGNvZGU7CisJX191MzIgbWluX3dpZHRoOworCV9fdTMyIG1heF93aWR0aDsKKwlfX3UzMiBtaW5faGVpZ2h0OworCV9fdTMyIG1heF9oZWlnaHQ7CisJX191MzIgcmVzZXJ2ZWRbOV07Cit9OworCisvKioKKyAqIHN0cnVjdCB2NGwyX3N1YmRldl9mcmFtZV9pbnRlcnZhbCAtIFBhZC1sZXZlbCBmcmFtZSByYXRlCisgKiBAcGFkOiBwYWQgbnVtYmVyLCBhcyByZXBvcnRlZCBieSB0aGUgbWVkaWEgQVBJCisgKiBAaW50ZXJ2YWw6IGZyYW1lIGludGVydmFsIGluIHNlY29uZHMKKyAqLworc3RydWN0IHY0bDJfc3ViZGV2X2ZyYW1lX2ludGVydmFsIHsKKwlfX3UzMiBwYWQ7CisJc3RydWN0IHY0bDJfZnJhY3QgaW50ZXJ2YWw7CisJX191MzIgcmVzZXJ2ZWRbOV07Cit9OworCisvKioKKyAqIHN0cnVjdCB2NGwyX3N1YmRldl9mcmFtZV9pbnRlcnZhbF9lbnVtIC0gRnJhbWUgaW50ZXJ2YWwgZW51bWVyYXRpb24KKyAqIEBwYWQ6IHBhZCBudW1iZXIsIGFzIHJlcG9ydGVkIGJ5IHRoZSBtZWRpYSBBUEkKKyAqIEBpbmRleDogZnJhbWUgaW50ZXJ2YWwgaW5kZXggZHVyaW5nIGVudW1lcmF0aW9uCisgKiBAY29kZTogZm9ybWF0IGNvZGUgKGZyb20gZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlKQorICogQHdpZHRoOiBmcmFtZSB3aWR0aCBpbiBwaXhlbHMKKyAqIEBoZWlnaHQ6IGZyYW1lIGhlaWdodCBpbiBwaXhlbHMKKyAqIEBpbnRlcnZhbDogZnJhbWUgaW50ZXJ2YWwgaW4gc2Vjb25kcworICovCitzdHJ1Y3QgdjRsMl9zdWJkZXZfZnJhbWVfaW50ZXJ2YWxfZW51bSB7CisJX191MzIgaW5kZXg7CisJX191MzIgcGFkOworCV9fdTMyIGNvZGU7CisJX191MzIgd2lkdGg7CisJX191MzIgaGVpZ2h0OworCXN0cnVjdCB2NGwyX2ZyYWN0IGludGVydmFsOworCV9fdTMyIHJlc2VydmVkWzldOworfTsKKworI2RlZmluZSBWSURJT0NfU1VCREVWX0dfRk1UCV9JT1dSKCdWJywgIDQsIHN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQpCisjZGVmaW5lIFZJRElPQ19TVUJERVZfU19GTVQJX0lPV1IoJ1YnLCAgNSwgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCkKKyNkZWZpbmUgVklESU9DX1NVQkRFVl9HX0ZSQU1FX0lOVEVSVkFMIFwKKwkJCV9JT1dSKCdWJywgMjEsIHN0cnVjdCB2NGwyX3N1YmRldl9mcmFtZV9pbnRlcnZhbCkKKyNkZWZpbmUgVklESU9DX1NVQkRFVl9TX0ZSQU1FX0lOVEVSVkFMIFwKKwkJCV9JT1dSKCdWJywgMjIsIHN0cnVjdCB2NGwyX3N1YmRldl9mcmFtZV9pbnRlcnZhbCkKKyNkZWZpbmUgVklESU9DX1NVQkRFVl9FTlVNX01CVVNfQ09ERSBcCisJCQlfSU9XUignVicsICAyLCBzdHJ1Y3QgdjRsMl9zdWJkZXZfbWJ1c19jb2RlX2VudW0pCisjZGVmaW5lIFZJRElPQ19TVUJERVZfRU5VTV9GUkFNRV9TSVpFIFwKKwkJCV9JT1dSKCdWJywgNzQsIHN0cnVjdCB2NGwyX3N1YmRldl9mcmFtZV9zaXplX2VudW0pCisjZGVmaW5lIFZJRElPQ19TVUJERVZfRU5VTV9GUkFNRV9JTlRFUlZBTCBcCisJCQlfSU9XUignVicsIDc1LCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZnJhbWVfaW50ZXJ2YWxfZW51bSkKKyNkZWZpbmUgVklESU9DX1NVQkRFVl9HX0NST1AJX0lPV1IoJ1YnLCA1OSwgc3RydWN0IHY0bDJfc3ViZGV2X2Nyb3ApCisjZGVmaW5lIFZJRElPQ19TVUJERVZfU19DUk9QCV9JT1dSKCdWJywgNjAsIHN0cnVjdCB2NGwyX3N1YmRldl9jcm9wKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmVyc2lvbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3MDQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmVyc2lvbi5oCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSBMSU5VWF9WRVJTSU9OX0NPREUgMTk3MTM0CisjZGVmaW5lIEtFUk5FTF9WRVJTSU9OKGEsYixjKSAoKChhKSA8PCAxNikgKyAoKGIpIDw8IDgpICsgKGMpKQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92ZXRoLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZldGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzU0YzFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92ZXRoLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfX05FVF9WRVRIX0hfCisjZGVmaW5lIF9fTkVUX1ZFVEhfSF8KKworZW51bSB7CisJVkVUSF9JTkZPX1VOU1BFQywKKwlWRVRIX0lORk9fUEVFUiwKKworCV9fVkVUSF9JTkZPX01BWAorI2RlZmluZSBWRVRIX0lORk9fTUFYCShfX1ZFVEhfSU5GT19NQVggLSAxKQorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Zob3N0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Zob3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY1YTQ4NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmhvc3QuaApAQCAtMCwwICsxLDEzMCBAQAorI2lmbmRlZiBfTElOVVhfVkhPU1RfSAorI2RlZmluZSBfTElOVVhfVkhPU1RfSAorLyogVXNlcnNwYWNlIGludGVyZmFjZSBmb3IgaW4ta2VybmVsIHZpcnRpbyBhY2NlbGVyYXRvcnMuICovCisKKy8qIHZob3N0IGlzIHVzZWQgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygc3lzdGVtIGNhbGxzIGludm9sdmVkIGluIHZpcnRpby4KKyAqCisgKiBFeGlzdGluZyB2aXJ0aW8gbmV0IGNvZGUgaXMgdXNlZCBpbiB0aGUgZ3Vlc3Qgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKgorICogVGhpcyBoZWFkZXIgaW5jbHVkZXMgaW50ZXJmYWNlIHVzZWQgYnkgdXNlcnNwYWNlIGh5cGVydmlzb3IgZm9yCisgKiBkZXZpY2UgY29uZmlndXJhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19yaW5nLmg+CisKK3N0cnVjdCB2aG9zdF92cmluZ19zdGF0ZSB7CisJdW5zaWduZWQgaW50IGluZGV4OworCXVuc2lnbmVkIGludCBudW07Cit9OworCitzdHJ1Y3Qgdmhvc3RfdnJpbmdfZmlsZSB7CisJdW5zaWduZWQgaW50IGluZGV4OworCWludCBmZDsgLyogUGFzcyAtMSB0byB1bmJpbmQgZnJvbSBmaWxlLiAqLworCit9OworCitzdHJ1Y3Qgdmhvc3RfdnJpbmdfYWRkciB7CisJdW5zaWduZWQgaW50IGluZGV4OworCS8qIE9wdGlvbiBmbGFncy4gKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJLyogRmxhZyB2YWx1ZXM6ICovCisJLyogV2hldGhlciBsb2cgYWRkcmVzcyBpcyB2YWxpZC4gSWYgc2V0IGVuYWJsZXMgbG9nZ2luZy4gKi8KKyNkZWZpbmUgVkhPU1RfVlJJTkdfRl9MT0cgMAorCisJLyogU3RhcnQgb2YgYXJyYXkgb2YgZGVzY3JpcHRvcnMgKHZpcnR1YWxseSBjb250aWd1b3VzKSAqLworCV9fdTY0IGRlc2NfdXNlcl9hZGRyOworCS8qIFVzZWQgc3RydWN0dXJlIGFkZHJlc3MuIE11c3QgYmUgMzIgYml0IGFsaWduZWQgKi8KKwlfX3U2NCB1c2VkX3VzZXJfYWRkcjsKKwkvKiBBdmFpbGFibGUgc3RydWN0dXJlIGFkZHJlc3MuIE11c3QgYmUgMTYgYml0IGFsaWduZWQgKi8KKwlfX3U2NCBhdmFpbF91c2VyX2FkZHI7CisJLyogTG9nZ2luZyBzdXBwb3J0LiAqLworCS8qIExvZyB3cml0ZXMgdG8gdXNlZCBzdHJ1Y3R1cmUsIGF0IG9mZnNldCBjYWxjdWxhdGVkIGZyb20gc3BlY2lmaWVkCisJICogYWRkcmVzcy4gQWRkcmVzcyBtdXN0IGJlIDMyIGJpdCBhbGlnbmVkLiAqLworCV9fdTY0IGxvZ19ndWVzdF9hZGRyOworfTsKKworc3RydWN0IHZob3N0X21lbW9yeV9yZWdpb24geworCV9fdTY0IGd1ZXN0X3BoeXNfYWRkcjsKKwlfX3U2NCBtZW1vcnlfc2l6ZTsgLyogYnl0ZXMgKi8KKwlfX3U2NCB1c2Vyc3BhY2VfYWRkcjsKKwlfX3U2NCBmbGFnc19wYWRkaW5nOyAvKiBObyBmbGFncyBhcmUgY3VycmVudGx5IHNwZWNpZmllZC4gKi8KK307CisKKy8qIEFsbCByZWdpb24gYWRkcmVzc2VzIGFuZCBzaXplcyBtdXN0IGJlIDRLIGFsaWduZWQuICovCisjZGVmaW5lIFZIT1NUX1BBR0VfU0laRSAweDEwMDAKKworc3RydWN0IHZob3N0X21lbW9yeSB7CisJX191MzIgbnJlZ2lvbnM7CisJX191MzIgcGFkZGluZzsKKwlzdHJ1Y3Qgdmhvc3RfbWVtb3J5X3JlZ2lvbiByZWdpb25zWzBdOworfTsKKworLyogaW9jdGxzICovCisKKyNkZWZpbmUgVkhPU1RfVklSVElPIDB4QUYKKworLyogRmVhdHVyZXMgYml0bWFzayBmb3IgZm9yd2FyZCBjb21wYXRpYmlsaXR5LiAgVHJhbnNwb3J0IGJpdHMgYXJlIHVzZWQgZm9yCisgKiB2aG9zdCBzcGVjaWZpYyBmZWF0dXJlcy4gKi8KKyNkZWZpbmUgVkhPU1RfR0VUX0ZFQVRVUkVTCV9JT1IoVkhPU1RfVklSVElPLCAweDAwLCBfX3U2NCkKKyNkZWZpbmUgVkhPU1RfU0VUX0ZFQVRVUkVTCV9JT1coVkhPU1RfVklSVElPLCAweDAwLCBfX3U2NCkKKworLyogU2V0IGN1cnJlbnQgcHJvY2VzcyBhcyB0aGUgKGV4Y2x1c2l2ZSkgb3duZXIgb2YgdGhpcyBmaWxlIGRlc2NyaXB0b3IuICBUaGlzCisgKiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIHZob3N0IGNvbW1hbmQuICBGdXJ0aGVyIGNhbGxzIHRvCisgKiBWSE9TVF9PV05FUl9TRVQgZmFpbCB1bnRpbCBWSE9TVF9PV05FUl9SRVNFVCBpcyBjYWxsZWQuICovCisjZGVmaW5lIFZIT1NUX1NFVF9PV05FUiBfSU8oVkhPU1RfVklSVElPLCAweDAxKQorLyogR2l2ZSB1cCBvd25lcnNoaXAsIGFuZCByZXNldCB0aGUgZGV2aWNlIHRvIGRlZmF1bHQgdmFsdWVzLgorICogQWxsb3dzIHN1YnNlcXVlbnQgY2FsbCB0byBWSE9TVF9PV05FUl9TRVQgdG8gc3VjY2VlZC4gKi8KKyNkZWZpbmUgVkhPU1RfUkVTRVRfT1dORVIgX0lPKFZIT1NUX1ZJUlRJTywgMHgwMikKKworLyogU2V0IHVwL21vZGlmeSBtZW1vcnkgbGF5b3V0ICovCisjZGVmaW5lIFZIT1NUX1NFVF9NRU1fVEFCTEUJX0lPVyhWSE9TVF9WSVJUSU8sIDB4MDMsIHN0cnVjdCB2aG9zdF9tZW1vcnkpCisKKy8qIFdyaXRlIGxvZ2dpbmcgc2V0dXAuICovCisvKiBNZW1vcnkgd3JpdGVzIGNhbiBvcHRpb25hbGx5IGJlIGxvZ2dlZCBieSBzZXR0aW5nIGJpdCBhdCBhbiBvZmZzZXQKKyAqIChjYWxjdWxhdGVkIGZyb20gdGhlIHBoeXNpY2FsIGFkZHJlc3MpIGZyb20gc3BlY2lmaWVkIGxvZyBiYXNlLgorICogVGhlIGJpdCBpcyBzZXQgdXNpbmcgYW4gYXRvbWljIDMyIGJpdCBvcGVyYXRpb24uICovCisvKiBTZXQgYmFzZSBhZGRyZXNzIGZvciBsb2dnaW5nLiAqLworI2RlZmluZSBWSE9TVF9TRVRfTE9HX0JBU0UgX0lPVyhWSE9TVF9WSVJUSU8sIDB4MDQsIF9fdTY0KQorLyogU3BlY2lmeSBhbiBldmVudGZkIGZpbGUgZGVzY3JpcHRvciB0byBzaWduYWwgb24gbG9nIHdyaXRlLiAqLworI2RlZmluZSBWSE9TVF9TRVRfTE9HX0ZEIF9JT1coVkhPU1RfVklSVElPLCAweDA3LCBpbnQpCisKKy8qIFJpbmcgc2V0dXAuICovCisvKiBTZXQgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIHJpbmcuIFRoaXMgcGFyYW1ldGVyIGNhbiBub3QKKyAqIGJlIG1vZGlmaWVkIHdoaWxlIHJpbmcgaXMgcnVubmluZyAoYm91bmQgdG8gYSBkZXZpY2UpLiAqLworI2RlZmluZSBWSE9TVF9TRVRfVlJJTkdfTlVNIF9JT1coVkhPU1RfVklSVElPLCAweDEwLCBzdHJ1Y3Qgdmhvc3RfdnJpbmdfc3RhdGUpCisvKiBTZXQgYWRkcmVzc2VzIGZvciB0aGUgcmluZy4gKi8KKyNkZWZpbmUgVkhPU1RfU0VUX1ZSSU5HX0FERFIgX0lPVyhWSE9TVF9WSVJUSU8sIDB4MTEsIHN0cnVjdCB2aG9zdF92cmluZ19hZGRyKQorLyogQmFzZSB2YWx1ZSB3aGVyZSBxdWV1ZSBsb29rcyBmb3IgYXZhaWxhYmxlIGRlc2NyaXB0b3JzICovCisjZGVmaW5lIFZIT1NUX1NFVF9WUklOR19CQVNFIF9JT1coVkhPU1RfVklSVElPLCAweDEyLCBzdHJ1Y3Qgdmhvc3RfdnJpbmdfc3RhdGUpCisvKiBHZXQgYWNjZXNzb3I6IHJlYWRzIGluZGV4LCB3cml0ZXMgdmFsdWUgaW4gbnVtICovCisjZGVmaW5lIFZIT1NUX0dFVF9WUklOR19CQVNFIF9JT1dSKFZIT1NUX1ZJUlRJTywgMHgxMiwgc3RydWN0IHZob3N0X3ZyaW5nX3N0YXRlKQorCisvKiBUaGUgZm9sbG93aW5nIGlvY3RscyB1c2UgZXZlbnRmZCBmaWxlIGRlc2NyaXB0b3JzIHRvIHNpZ25hbCBhbmQgcG9sbAorICogZm9yIGV2ZW50cy4gKi8KKworLyogU2V0IGV2ZW50ZmQgdG8gcG9sbCBmb3IgYWRkZWQgYnVmZmVycyAqLworI2RlZmluZSBWSE9TVF9TRVRfVlJJTkdfS0lDSyBfSU9XKFZIT1NUX1ZJUlRJTywgMHgyMCwgc3RydWN0IHZob3N0X3ZyaW5nX2ZpbGUpCisvKiBTZXQgZXZlbnRmZCB0byBzaWduYWwgd2hlbiBidWZmZXJzIGhhdmUgYmVlZCB1c2VkICovCisjZGVmaW5lIFZIT1NUX1NFVF9WUklOR19DQUxMIF9JT1coVkhPU1RfVklSVElPLCAweDIxLCBzdHJ1Y3Qgdmhvc3RfdnJpbmdfZmlsZSkKKy8qIFNldCBldmVudGZkIHRvIHNpZ25hbCBhbiBlcnJvciAqLworI2RlZmluZSBWSE9TVF9TRVRfVlJJTkdfRVJSIF9JT1coVkhPU1RfVklSVElPLCAweDIyLCBzdHJ1Y3Qgdmhvc3RfdnJpbmdfZmlsZSkKKworLyogVkhPU1RfTkVUIHNwZWNpZmljIGRlZmluZXMgKi8KKworLyogQXR0YWNoIHZpcnRpbyBuZXQgcmluZyB0byBhIHJhdyBzb2NrZXQsIG9yIHRhcCBkZXZpY2UuCisgKiBUaGUgc29ja2V0IG11c3QgYmUgYWxyZWFkeSBib3VuZCB0byBhbiBldGhlcm5ldCBkZXZpY2UsIHRoaXMgZGV2aWNlIHdpbGwgYmUKKyAqIHVzZWQgZm9yIHRyYW5zbWl0LiAgUGFzcyBmZCAtMSB0byB1bmJpbmQgZnJvbSB0aGUgc29ja2V0IGFuZCB0aGUgdHJhbnNtaXQKKyAqIGRldmljZS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gc3RvcCB0aGUgcmluZyAoZS5nLiBmb3IgbWlncmF0aW9uKS4gKi8KKyNkZWZpbmUgVkhPU1RfTkVUX1NFVF9CQUNLRU5EIF9JT1coVkhPU1RfVklSVElPLCAweDMwLCBzdHJ1Y3Qgdmhvc3RfdnJpbmdfZmlsZSkKKworLyogRmVhdHVyZSBiaXRzICovCisvKiBMb2cgYWxsIHdyaXRlIGRlc2NyaXB0b3JzLiBDYW4gYmUgY2hhbmdlZCB3aGlsZSBkZXZpY2UgaXMgYWN0aXZlLiAqLworI2RlZmluZSBWSE9TVF9GX0xPR19BTEwgMjYKKy8qIHZob3N0LW5ldCBzaG91bGQgYWRkIHZpcnRpb19uZXRfaGRyIGZvciBSWCwgYW5kIHN0cmlwIGZvciBUWCBwYWNrZXRzLiAqLworI2RlZmluZSBWSE9TVF9ORVRfRl9WSVJUSU9fTkVUX0hEUiAyNworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMzlhYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oCkBAIC0wLDAgKzEsMjI1OCBAQAorLyoKKyAqICBWaWRlbyBmb3IgTGludXggVHdvIGhlYWRlciBmaWxlCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OS0yMDA3IHRoZSBjb250cmlidXRvcnMKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgQWx0ZXJuYXRpdmVseSB5b3UgY2FuIHJlZGlzdHJpYnV0ZSB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogIEJTRCBsaWNlbnNlIGFzIHN0YXRlZCBiZWxvdzoKKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICogICAgIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiAgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiAgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECisgKiAgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCUhlYWRlciBmaWxlIGZvciB2NGwgb3IgVjRMMiBkcml2ZXJzIGFuZCBhcHBsaWNhdGlvbnMKKyAqIHdpdGggcHVibGljIEFQSS4KKyAqIEFsbCBrZXJuZWwtc3BlY2lmaWMgc3R1ZmYgd2VyZSBtb3ZlZCB0byBtZWRpYS92NGwyLWRldi5oLCBzbworICogbm8gI2lmIF9fS0VSTkVMIHRlc3RzIGFyZSBhbGxvd2VkIGhlcmUKKyAqCisgKglTZWUgaHR0cDovL2xpbnV4dHYub3JnIGZvciBtb3JlIGluZm8KKyAqCisgKglBdXRob3I6IEJpbGwgRGlya3MgPGJpbGxAdGhlZGlya3Mub3JnPgorICoJCUp1c3RpbiBTY2hvZW1hbgorICogICAgICAgICAgICAgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorICoJCWV0IGFsLgorICovCisjaWZuZGVmIF9fTElOVVhfVklERU9ERVYyX0gKKyNkZWZpbmUgX19MSU5VWF9WSURFT0RFVjJfSAorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIENvbW1vbiBzdHVmZiBmb3IgYm90aCBWNEwxIGFuZCBWNEwyCisgKiBNb3ZlZCBmcm9tIHZpZGVvZGV2LmgKKyAqLworI2RlZmluZSBWSURFT19NQVhfRlJBTUUgICAgICAgICAgICAgICAzMgorI2RlZmluZSBWSURFT19NQVhfUExBTkVTICAgICAgICAgICAgICAgOAorCisKKy8qIFRoZXNlIGRlZmluZXMgYXJlIFY0TDEgc3BlY2lmaWMgYW5kIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIHRoZSBWNEwyIEFQSSEKKyAgIFRoZXkgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhpcyBoZWFkZXIgaW4gdGhlIGZ1dHVyZS4gKi8KKworI2RlZmluZSBWSURfVFlQRV9DQVBUVVJFCTEJLyogQ2FuIGNhcHR1cmUgKi8KKyNkZWZpbmUgVklEX1RZUEVfVFVORVIJCTIJLyogQ2FuIHR1bmUgKi8KKyNkZWZpbmUgVklEX1RZUEVfVEVMRVRFWFQJNAkvKiBEb2VzIHRlbGV0ZXh0ICovCisjZGVmaW5lIFZJRF9UWVBFX09WRVJMQVkJOAkvKiBPdmVybGF5IG9udG8gZnJhbWUgYnVmZmVyICovCisjZGVmaW5lIFZJRF9UWVBFX0NIUk9NQUtFWQkxNgkvKiBPdmVybGF5IGJ5IGNocm9tYWtleSAqLworI2RlZmluZSBWSURfVFlQRV9DTElQUElORwkzMgkvKiBDYW4gY2xpcCAqLworI2RlZmluZSBWSURfVFlQRV9GUkFNRVJBTQk2NAkvKiBVc2VzIHRoZSBmcmFtZSBidWZmZXIgbWVtb3J5ICovCisjZGVmaW5lIFZJRF9UWVBFX1NDQUxFUwkJMTI4CS8qIFNjYWxhYmxlICovCisjZGVmaW5lIFZJRF9UWVBFX01PTk9DSFJPTUUJMjU2CS8qIE1vbm9jaHJvbWUgb25seSAqLworI2RlZmluZSBWSURfVFlQRV9TVUJDQVBUVVJFCTUxMgkvKiBDYW4gY2FwdHVyZSBzdWJhcmVhcyBvZiB0aGUgaW1hZ2UgKi8KKyNkZWZpbmUgVklEX1RZUEVfTVBFR19ERUNPREVSCTEwMjQJLyogQ2FuIGRlY29kZSBNUEVHIHN0cmVhbXMgKi8KKyNkZWZpbmUgVklEX1RZUEVfTVBFR19FTkNPREVSCTIwNDgJLyogQ2FuIGVuY29kZSBNUEVHIHN0cmVhbXMgKi8KKyNkZWZpbmUgVklEX1RZUEVfTUpQRUdfREVDT0RFUgk0MDk2CS8qIENhbiBkZWNvZGUgTUpQRUcgc3RyZWFtcyAqLworI2RlZmluZSBWSURfVFlQRV9NSlBFR19FTkNPREVSCTgxOTIJLyogQ2FuIGVuY29kZSBNSlBFRyBzdHJlYW1zICovCisKKy8qCisgKglNIEkgUyBDIEUgTCBMIEEgTiBFIE8gVSBTCisgKi8KKworLyogIEZvdXItY2hhcmFjdGVyLWNvZGUgKEZPVVJDQykgKi8KKyNkZWZpbmUgdjRsMl9mb3VyY2MoYSwgYiwgYywgZClcCisJKChfX3UzMikoYSkgfCAoKF9fdTMyKShiKSA8PCA4KSB8ICgoX191MzIpKGMpIDw8IDE2KSB8ICgoX191MzIpKGQpIDw8IDI0KSkKKworLyoKKyAqCUUgTiBVIE0gUworICovCitlbnVtIHY0bDJfZmllbGQgeworCVY0TDJfRklFTERfQU5ZICAgICAgICAgICA9IDAsIC8qIGRyaXZlciBjYW4gY2hvb3NlIGZyb20gbm9uZSwKKwkJCQkJIHRvcCwgYm90dG9tLCBpbnRlcmxhY2VkCisJCQkJCSBkZXBlbmRpbmcgb24gd2hhdGV2ZXIgaXQgdGhpbmtzCisJCQkJCSBpcyBhcHByb3hpbWF0ZSAuLi4gKi8KKwlWNEwyX0ZJRUxEX05PTkUgICAgICAgICAgPSAxLCAvKiB0aGlzIGRldmljZSBoYXMgbm8gZmllbGRzIC4uLiAqLworCVY0TDJfRklFTERfVE9QICAgICAgICAgICA9IDIsIC8qIHRvcCBmaWVsZCBvbmx5ICovCisJVjRMMl9GSUVMRF9CT1RUT00gICAgICAgID0gMywgLyogYm90dG9tIGZpZWxkIG9ubHkgKi8KKwlWNEwyX0ZJRUxEX0lOVEVSTEFDRUQgICAgPSA0LCAvKiBib3RoIGZpZWxkcyBpbnRlcmxhY2VkICovCisJVjRMMl9GSUVMRF9TRVFfVEIgICAgICAgID0gNSwgLyogYm90aCBmaWVsZHMgc2VxdWVudGlhbCBpbnRvIG9uZQorCQkJCQkgYnVmZmVyLCB0b3AtYm90dG9tIG9yZGVyICovCisJVjRMMl9GSUVMRF9TRVFfQlQgICAgICAgID0gNiwgLyogc2FtZSBhcyBhYm92ZSArIGJvdHRvbS10b3Agb3JkZXIgKi8KKwlWNEwyX0ZJRUxEX0FMVEVSTkFURSAgICAgPSA3LCAvKiBib3RoIGZpZWxkcyBhbHRlcm5hdGluZyBpbnRvCisJCQkJCSBzZXBhcmF0ZSBidWZmZXJzICovCisJVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX1RCID0gOCwgLyogYm90aCBmaWVsZHMgaW50ZXJsYWNlZCwgdG9wIGZpZWxkCisJCQkJCSBmaXJzdCBhbmQgdGhlIHRvcCBmaWVsZCBpcworCQkJCQkgdHJhbnNtaXR0ZWQgZmlyc3QgKi8KKwlWNEwyX0ZJRUxEX0lOVEVSTEFDRURfQlQgPSA5LCAvKiBib3RoIGZpZWxkcyBpbnRlcmxhY2VkLCB0b3AgZmllbGQKKwkJCQkJIGZpcnN0IGFuZCB0aGUgYm90dG9tIGZpZWxkIGlzCisJCQkJCSB0cmFuc21pdHRlZCBmaXJzdCAqLworfTsKKyNkZWZpbmUgVjRMMl9GSUVMRF9IQVNfVE9QKGZpZWxkKQlcCisJKChmaWVsZCkgPT0gVjRMMl9GSUVMRF9UT1AgCXx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRCB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfVEIgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX0JUIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfU0VRX1RCCXx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfU0VRX0JUKQorI2RlZmluZSBWNEwyX0ZJRUxEX0hBU19CT1RUT00oZmllbGQpCVwKKwkoKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0JPVFRPTSAJfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9UQiB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfQlQgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9TRVFfVEIJfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9TRVFfQlQpCisjZGVmaW5lIFY0TDJfRklFTERfSEFTX0JPVEgoZmllbGQpCVwKKwkoKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX1RCIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9CVCB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1NFUV9UQiB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1NFUV9CVCkKKworZW51bSB2NGwyX2J1Zl90eXBlIHsKKwlWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgICAgICAgID0gMSwKKwlWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAgICAgICAgID0gMiwKKwlWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVkgICAgICAgID0gMywKKwlWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFICAgICAgICAgID0gNCwKKwlWNEwyX0JVRl9UWVBFX1ZCSV9PVVRQVVQgICAgICAgICAgID0gNSwKKwlWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRSAgID0gNiwKKwlWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVUICAgID0gNywKKyNpZiAxCisJLyogRXhwZXJpbWVudGFsICovCisJVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfT1ZFUkxBWSA9IDgsCisjZW5kaWYKKwlWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FID0gOSwKKwlWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUgID0gMTAsCisJVjRMMl9CVUZfVFlQRV9QUklWQVRFICAgICAgICAgICAgICA9IDB4ODAsCit9OworCisjZGVmaW5lIFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUih0eXBlKQkJCVwKKwkoKHR5cGUpID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUJXAorCSB8fCAodHlwZSkgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKQorCisjZGVmaW5lIFY0TDJfVFlQRV9JU19PVVRQVVQodHlwZSkJCQkJXAorCSgodHlwZSkgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQJCQlcCisJIHx8ICh0eXBlKSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUJCVwKKwkgfHwgKHR5cGUpID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWQkJXAorCSB8fCAodHlwZSkgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfT1ZFUkxBWQlcCisJIHx8ICh0eXBlKSA9PSBWNEwyX0JVRl9UWVBFX1ZCSV9PVVRQVVQJCQlcCisJIHx8ICh0eXBlKSA9PSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVUKQorCitlbnVtIHY0bDJfdHVuZXJfdHlwZSB7CisJVjRMMl9UVU5FUl9SQURJTwkgICAgID0gMSwKKwlWNEwyX1RVTkVSX0FOQUxPR19UVgkgICAgID0gMiwKKwlWNEwyX1RVTkVSX0RJR0lUQUxfVFYJICAgICA9IDMsCit9OworCitlbnVtIHY0bDJfbWVtb3J5IHsKKwlWNEwyX01FTU9SWV9NTUFQICAgICAgICAgICAgID0gMSwKKwlWNEwyX01FTU9SWV9VU0VSUFRSICAgICAgICAgID0gMiwKKwlWNEwyX01FTU9SWV9PVkVSTEFZICAgICAgICAgID0gMywKK307CisKKy8qIHNlZSBhbHNvIGh0dHA6Ly92ZWt0b3IudGhlb3JlbS5jYS9ncmFwaGljcy95Y2Jjci8gKi8KK2VudW0gdjRsMl9jb2xvcnNwYWNlIHsKKwkvKiBJVFUtUiA2MDEgLS0gYnJvYWRjYXN0IE5UU0MvUEFMICovCisJVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTSAgICAgPSAxLAorCisJLyogMTEyNS1MaW5lIChVUykgSERUViAqLworCVY0TDJfQ09MT1JTUEFDRV9TTVBURTI0ME0gICAgID0gMiwKKworCS8qIEhEIGFuZCBtb2Rlcm4gY2FwdHVyZXMuICovCisJVjRMMl9DT0xPUlNQQUNFX1JFQzcwOSAgICAgICAgPSAzLAorCisJLyogYnJva2VuIEJUODc4IGV4dGVudHMgKDYwMSwgbHVtYSByYW5nZSAxNi0yNTMgaW5zdGVhZCBvZiAxNi0yMzUpICovCisJVjRMMl9DT0xPUlNQQUNFX0JUODc4ICAgICAgICAgPSA0LAorCisJLyogVGhlc2Ugc2hvdWxkIGJlIHVzZWZ1bC4gIEFzc3VtZSA2MDEgZXh0ZW50cy4gKi8KKwlWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9NICA9IDUsCisJVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkcgPSA2LAorCisJLyogSSBrbm93IHRoZXJlIHdpbGwgYmUgY2FtZXJhcyB0aGF0IHNlbmQgdGhpcy4gIFNvLCB0aGlzIGlzCisJICogdW5zcGVjaWZpZWQgY2hyb21hdGljaXRpZXMgYW5kIGZ1bGwgMC0yNTUgb24gZWFjaCBvZiB0aGUKKwkgKiBZJ0NiQ3IgY29tcG9uZW50cworCSAqLworCVY0TDJfQ09MT1JTUEFDRV9KUEVHICAgICAgICAgID0gNywKKworCS8qIEZvciBSR0IgY29sb3Vyc3BhY2VzLCB0aGlzIGlzIHByb2JhYmx5IGEgZ29vZCBzdGFydC4gKi8KKwlWNEwyX0NPTE9SU1BBQ0VfU1JHQiAgICAgICAgICA9IDgsCit9OworCitlbnVtIHY0bDJfcHJpb3JpdHkgeworCVY0TDJfUFJJT1JJVFlfVU5TRVQgICAgICAgPSAwLCAgLyogbm90IGluaXRpYWxpemVkICovCisJVjRMMl9QUklPUklUWV9CQUNLR1JPVU5EICA9IDEsCisJVjRMMl9QUklPUklUWV9JTlRFUkFDVElWRSA9IDIsCisJVjRMMl9QUklPUklUWV9SRUNPUkQgICAgICA9IDMsCisJVjRMMl9QUklPUklUWV9ERUZBVUxUICAgICA9IFY0TDJfUFJJT1JJVFlfSU5URVJBQ1RJVkUsCit9OworCitzdHJ1Y3QgdjRsMl9yZWN0IHsKKwlfX3MzMiAgIGxlZnQ7CisJX19zMzIgICB0b3A7CisJX19zMzIgICB3aWR0aDsKKwlfX3MzMiAgIGhlaWdodDsKK307CisKK3N0cnVjdCB2NGwyX2ZyYWN0IHsKKwlfX3UzMiAgIG51bWVyYXRvcjsKKwlfX3UzMiAgIGRlbm9taW5hdG9yOworfTsKKworLyoKKyAqCUQgUiBJIFYgRSBSICAgQyBBIFAgQSBCIEkgTCBJIFQgSSBFIFMKKyAqLworc3RydWN0IHY0bDJfY2FwYWJpbGl0eSB7CisJX191OAlkcml2ZXJbMTZdOwkvKiBpLmUuICJidHR2IiAqLworCV9fdTgJY2FyZFszMl07CS8qIGkuZS4gIkhhdXBwYXVnZSBXaW5UViIgKi8KKwlfX3U4CWJ1c19pbmZvWzMyXTsJLyogIlBDSToiICsgcGNpX25hbWUocGNpX2RldikgKi8KKwlfX3UzMiAgIHZlcnNpb247ICAgICAgICAvKiBzaG91bGQgdXNlIEtFUk5FTF9WRVJTSU9OKCkgKi8KKwlfX3UzMgljYXBhYmlsaXRpZXM7CS8qIERldmljZSBjYXBhYmlsaXRpZXMgKi8KKwlfX3UzMglyZXNlcnZlZFs0XTsKK307CisKKy8qIFZhbHVlcyBmb3IgJ2NhcGFiaWxpdGllcycgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9DQVBfVklERU9fQ0FQVFVSRQkJMHgwMDAwMDAwMSAgLyogSXMgYSB2aWRlbyBjYXB0dXJlIGRldmljZSAqLworI2RlZmluZSBWNEwyX0NBUF9WSURFT19PVVRQVVQJCTB4MDAwMDAwMDIgIC8qIElzIGEgdmlkZW8gb3V0cHV0IGRldmljZSAqLworI2RlZmluZSBWNEwyX0NBUF9WSURFT19PVkVSTEFZCQkweDAwMDAwMDA0ICAvKiBDYW4gZG8gdmlkZW8gb3ZlcmxheSAqLworI2RlZmluZSBWNEwyX0NBUF9WQklfQ0FQVFVSRQkJMHgwMDAwMDAxMCAgLyogSXMgYSByYXcgVkJJIGNhcHR1cmUgZGV2aWNlICovCisjZGVmaW5lIFY0TDJfQ0FQX1ZCSV9PVVRQVVQJCTB4MDAwMDAwMjAgIC8qIElzIGEgcmF3IFZCSSBvdXRwdXQgZGV2aWNlICovCisjZGVmaW5lIFY0TDJfQ0FQX1NMSUNFRF9WQklfQ0FQVFVSRQkweDAwMDAwMDQwICAvKiBJcyBhIHNsaWNlZCBWQkkgY2FwdHVyZSBkZXZpY2UgKi8KKyNkZWZpbmUgVjRMMl9DQVBfU0xJQ0VEX1ZCSV9PVVRQVVQJMHgwMDAwMDA4MCAgLyogSXMgYSBzbGljZWQgVkJJIG91dHB1dCBkZXZpY2UgKi8KKyNkZWZpbmUgVjRMMl9DQVBfUkRTX0NBUFRVUkUJCTB4MDAwMDAxMDAgIC8qIFJEUyBkYXRhIGNhcHR1cmUgKi8KKyNkZWZpbmUgVjRMMl9DQVBfVklERU9fT1VUUFVUX09WRVJMQVkJMHgwMDAwMDIwMCAgLyogQ2FuIGRvIHZpZGVvIG91dHB1dCBvdmVybGF5ICovCisjZGVmaW5lIFY0TDJfQ0FQX0hXX0ZSRVFfU0VFSwkJMHgwMDAwMDQwMCAgLyogQ2FuIGRvIGhhcmR3YXJlIGZyZXF1ZW5jeSBzZWVrICAqLworI2RlZmluZSBWNEwyX0NBUF9SRFNfT1VUUFVUCQkweDAwMDAwODAwICAvKiBJcyBhbiBSRFMgZW5jb2RlciAqLworCisvKiBJcyBhIHZpZGVvIGNhcHR1cmUgZGV2aWNlIHRoYXQgc3VwcG9ydHMgbXVsdGlwbGFuYXIgZm9ybWF0cyAqLworI2RlZmluZSBWNEwyX0NBUF9WSURFT19DQVBUVVJFX01QTEFORQkweDAwMDAxMDAwCisvKiBJcyBhIHZpZGVvIG91dHB1dCBkZXZpY2UgdGhhdCBzdXBwb3J0cyBtdWx0aXBsYW5hciBmb3JtYXRzICovCisjZGVmaW5lIFY0TDJfQ0FQX1ZJREVPX09VVFBVVF9NUExBTkUJMHgwMDAwMjAwMAorCisjZGVmaW5lIFY0TDJfQ0FQX1RVTkVSCQkJMHgwMDAxMDAwMCAgLyogaGFzIGEgdHVuZXIgKi8KKyNkZWZpbmUgVjRMMl9DQVBfQVVESU8JCQkweDAwMDIwMDAwICAvKiBoYXMgYXVkaW8gc3VwcG9ydCAqLworI2RlZmluZSBWNEwyX0NBUF9SQURJTwkJCTB4MDAwNDAwMDAgIC8qIGlzIGEgcmFkaW8gZGV2aWNlICovCisjZGVmaW5lIFY0TDJfQ0FQX01PRFVMQVRPUgkJMHgwMDA4MDAwMCAgLyogaGFzIGEgbW9kdWxhdG9yICovCisKKyNkZWZpbmUgVjRMMl9DQVBfUkVBRFdSSVRFICAgICAgICAgICAgICAweDAxMDAwMDAwICAvKiByZWFkL3dyaXRlIHN5c3RlbWNhbGxzICovCisjZGVmaW5lIFY0TDJfQ0FQX0FTWU5DSU8gICAgICAgICAgICAgICAgMHgwMjAwMDAwMCAgLyogYXN5bmMgSS9PICovCisjZGVmaW5lIFY0TDJfQ0FQX1NUUkVBTUlORyAgICAgICAgICAgICAgMHgwNDAwMDAwMCAgLyogc3RyZWFtaW5nIEkvTyBpb2N0bHMgKi8KKworLyoKKyAqCVYgSSBEIEUgTyAgIEkgTSBBIEcgRSAgIEYgTyBSIE0gQSBUCisgKi8KK3N0cnVjdCB2NGwyX3BpeF9mb3JtYXQgeworCV9fdTMyICAgICAgICAgCQl3aWR0aDsKKwlfX3UzMgkJCWhlaWdodDsKKwlfX3UzMgkJCXBpeGVsZm9ybWF0OworCWVudW0gdjRsMl9maWVsZCAgCWZpZWxkOworCV9fdTMyICAgICAgICAgICAgCWJ5dGVzcGVybGluZTsJLyogZm9yIHBhZGRpbmcsIHplcm8gaWYgdW51c2VkICovCisJX191MzIgICAgICAgICAgCQlzaXplaW1hZ2U7CisJZW51bSB2NGwyX2NvbG9yc3BhY2UJY29sb3JzcGFjZTsKKwlfX3UzMgkJCXByaXY7CQkvKiBwcml2YXRlIGRhdGEsIGRlcGVuZHMgb24gcGl4ZWxmb3JtYXQgKi8KK307CisKKy8qICAgICAgUGl4ZWwgZm9ybWF0ICAgICAgICAgRk9VUkNDICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCAgRGVzY3JpcHRpb24gICovCisKKy8qIFJHQiBmb3JtYXRzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0IzMzIgIHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnQicsICcxJykgLyogIDggIFJHQi0zLTMtMiAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1JHQjQ0NCAgdjRsMl9mb3VyY2MoJ1InLCAnNCcsICc0JywgJzQnKSAvKiAxNiAgeHh4eHJycnIgZ2dnZ2JiYmIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1JHQjU1NSAgdjRsMl9mb3VyY2MoJ1InLCAnRycsICdCJywgJ08nKSAvKiAxNiAgUkdCLTUtNS01ICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCNTY1ICB2NGwyX2ZvdXJjYygnUicsICdHJywgJ0InLCAnUCcpIC8qIDE2ICBSR0ItNS02LTUgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0I1NTVYIHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnQicsICdRJykgLyogMTYgIFJHQi01LTUtNSBCRSAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1JHQjU2NVggdjRsMl9mb3VyY2MoJ1InLCAnRycsICdCJywgJ1InKSAvKiAxNiAgUkdCLTUtNi01IEJFICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfQkdSNjY2ICB2NGwyX2ZvdXJjYygnQicsICdHJywgJ1InLCAnSCcpIC8qIDE4ICBCR1ItNi02LTYJICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfQkdSMjQgICB2NGwyX2ZvdXJjYygnQicsICdHJywgJ1InLCAnMycpIC8qIDI0ICBCR1ItOC04LTggICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0IyNCAgIHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnQicsICczJykgLyogMjQgIFJHQi04LTgtOCAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0JHUjMyICAgdjRsMl9mb3VyY2MoJ0InLCAnRycsICdSJywgJzQnKSAvKiAzMiAgQkdSLTgtOC04LTggICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCMzIgICB2NGwyX2ZvdXJjYygnUicsICdHJywgJ0InLCAnNCcpIC8qIDMyICBSR0ItOC04LTgtOCAgICovCisKKy8qIEdyZXkgZm9ybWF0cyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfR1JFWSAgICB2NGwyX2ZvdXJjYygnRycsICdSJywgJ0UnLCAnWScpIC8qICA4ICBHcmV5c2NhbGUgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZNCAgICAgIHY0bDJfZm91cmNjKCdZJywgJzAnLCAnNCcsICcgJykgLyogIDQgIEdyZXlzY2FsZSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1k2ICAgICAgdjRsMl9mb3VyY2MoJ1knLCAnMCcsICc2JywgJyAnKSAvKiAgNiAgR3JleXNjYWxlICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWTEwICAgICB2NGwyX2ZvdXJjYygnWScsICcxJywgJzAnLCAnICcpIC8qIDEwICBHcmV5c2NhbGUgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZMTIgICAgIHY0bDJfZm91cmNjKCdZJywgJzEnLCAnMicsICcgJykgLyogMTIgIEdyZXlzY2FsZSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1kxNiAgICAgdjRsMl9mb3VyY2MoJ1knLCAnMScsICc2JywgJyAnKSAvKiAxNiAgR3JleXNjYWxlICAgICAqLworCisvKiBHcmV5IGJpdC1wYWNrZWQgZm9ybWF0cyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWTEwQlBBQ0sgICAgdjRsMl9mb3VyY2MoJ1knLCAnMScsICcwJywgJ0InKSAvKiAxMCAgR3JleXNjYWxlIGJpdC1wYWNrZWQgKi8KKworLyogUGFsZXR0ZSBmb3JtYXRzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9QQUw4ICAgIHY0bDJfZm91cmNjKCdQJywgJ0EnLCAnTCcsICc4JykgLyogIDggIDgtYml0IHBhbGV0dGUgKi8KKworLyogTHVtaW5hbmNlK0Nocm9taW5hbmNlIGZvcm1hdHMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lWVTQxMCAgdjRsMl9mb3VyY2MoJ1knLCAnVicsICdVJywgJzknKSAvKiAgOSAgWVZVIDQ6MTowICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVZVNDIwICB2NGwyX2ZvdXJjYygnWScsICdWJywgJzEnLCAnMicpIC8qIDEyICBZVlUgNDoyOjAgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVlWICAgIHY0bDJfZm91cmNjKCdZJywgJ1UnLCAnWScsICdWJykgLyogMTYgIFlVViA0OjI6MiAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lZVVYgICAgdjRsMl9mb3VyY2MoJ1knLCAnWScsICdVJywgJ1YnKSAvKiAxNiAgWVVWIDQ6MjoyICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVZZVSAgICB2NGwyX2ZvdXJjYygnWScsICdWJywgJ1knLCAnVScpIC8qIDE2IFlWVSA0OjI6MiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfVVlWWSAgICB2NGwyX2ZvdXJjYygnVScsICdZJywgJ1YnLCAnWScpIC8qIDE2ICBZVVYgNDoyOjIgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9WWVVZICAgIHY0bDJfZm91cmNjKCdWJywgJ1knLCAnVScsICdZJykgLyogMTYgIFlVViA0OjI6MiAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjQyMlAgdjRsMl9mb3VyY2MoJzQnLCAnMicsICcyJywgJ1AnKSAvKiAxNiAgWVZVNDIyIHBsYW5hciAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNDExUCB2NGwyX2ZvdXJjYygnNCcsICcxJywgJzEnLCAnUCcpIC8qIDE2ICBZVlU0MTEgcGxhbmFyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZNDFQICAgIHY0bDJfZm91cmNjKCdZJywgJzQnLCAnMScsICdQJykgLyogMTIgIFlVViA0OjE6MSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjQ0NCAgdjRsMl9mb3VyY2MoJ1knLCAnNCcsICc0JywgJzQnKSAvKiAxNiAgeHh4eHl5eXkgdXV1dXZ2dnYgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjU1NSAgdjRsMl9mb3VyY2MoJ1knLCAnVScsICdWJywgJ08nKSAvKiAxNiAgWVVWLTUtNS01ICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNTY1ICB2NGwyX2ZvdXJjYygnWScsICdVJywgJ1YnLCAnUCcpIC8qIDE2ICBZVVYtNS02LTUgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVYzMiAgIHY0bDJfZm91cmNjKCdZJywgJ1UnLCAnVicsICc0JykgLyogMzIgIFlVVi04LTgtOC04ICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjQxMCAgdjRsMl9mb3VyY2MoJ1knLCAnVScsICdWJywgJzknKSAvKiAgOSAgWVVWIDQ6MTowICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNDIwICB2NGwyX2ZvdXJjYygnWScsICdVJywgJzEnLCAnMicpIC8qIDEyICBZVVYgNDoyOjAgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ISTI0MCAgIHY0bDJfZm91cmNjKCdIJywgJ0knLCAnMicsICc0JykgLyogIDggIDgtYml0IGNvbG9yICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0hNMTIgICAgdjRsMl9mb3VyY2MoJ0gnLCAnTScsICcxJywgJzInKSAvKiAgOCAgWVVWIDQ6MjowIDE2eDE2IG1hY3JvYmxvY2tzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9NNDIwICAgIHY0bDJfZm91cmNjKCdNJywgJzQnLCAnMicsICcwJykgLyogMTIgIFlVViA0OjI6MCAyIGxpbmVzIHksIDEgbGluZSB1diBpbnRlcmxlYXZlZCAqLworCisvKiB0d28gcGxhbmVzIC0tIG9uZSBZLCBvbmUgQ3IgKyBDYiBpbnRlcmxlYXZlZCAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WMTIgICAgdjRsMl9mb3VyY2MoJ04nLCAnVicsICcxJywgJzInKSAvKiAxMiAgWS9DYkNyIDQ6MjowICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYyMSAgICB2NGwyX2ZvdXJjYygnTicsICdWJywgJzInLCAnMScpIC8qIDEyICBZL0NyQ2IgNDoyOjAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjE2ICAgIHY0bDJfZm91cmNjKCdOJywgJ1YnLCAnMScsICc2JykgLyogMTYgIFkvQ2JDciA0OjI6MiAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WNjEgICAgdjRsMl9mb3VyY2MoJ04nLCAnVicsICc2JywgJzEnKSAvKiAxNiAgWS9DckNiIDQ6MjoyICAqLworCisvKiB0d28gbm9uIGNvbnRpZ3VvdXMgcGxhbmVzIC0gb25lIFksIG9uZSBDciArIENiIGludGVybGVhdmVkICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYxMk0gICB2NGwyX2ZvdXJjYygnTicsICdNJywgJzEnLCAnMicpIC8qIDEyICBZL0NiQ3IgNDoyOjAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjEyTVQgIHY0bDJfZm91cmNjKCdUJywgJ00nLCAnMScsICcyJykgLyogMTIgIFkvQ2JDciA0OjI6MCA2NHgzMiBtYWNyb2Jsb2NrcyAqLworCisvKiB0aHJlZSBub24gY29udGlndW91cyBwbGFuZXMgLSBZLCBDYiwgQ3IgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjQyME0gdjRsMl9mb3VyY2MoJ1knLCAnTScsICcxJywgJzInKSAvKiAxMiAgWVVWNDIwIHBsYW5hciAqLworCisvKiBCYXllciBmb3JtYXRzIC0gc2VlIGh0dHA6Ly93d3cuc2lsaWNvbmltYWdpbmcuY29tL1JHQiUyMEJheWVyLmh0bSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0JHR1I4ICB2NGwyX2ZvdXJjYygnQicsICdBJywgJzgnLCAnMScpIC8qICA4ICBCR0JHLi4gR1JHUi4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TR0JSRzggIHY0bDJfZm91cmNjKCdHJywgJ0InLCAnUicsICdHJykgLyogIDggIEdCR0IuLiBSR1JHLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHUkJHOCAgdjRsMl9mb3VyY2MoJ0cnLCAnUicsICdCJywgJ0cnKSAvKiAgOCAgR1JHUi4uIEJHQkcuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU1JHR0I4ICB2NGwyX2ZvdXJjYygnUicsICdHJywgJ0cnLCAnQicpIC8qICA4ICBSR1JHLi4gR0JHQi4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TQkdHUjEwIHY0bDJfZm91cmNjKCdCJywgJ0cnLCAnMScsICcwJykgLyogMTAgIEJHQkcuLiBHUkdSLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHQlJHMTAgdjRsMl9mb3VyY2MoJ0cnLCAnQicsICcxJywgJzAnKSAvKiAxMCAgR0JHQi4uIFJHUkcuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dSQkcxMCB2NGwyX2ZvdXJjYygnQicsICdBJywgJzEnLCAnMCcpIC8qIDEwICBHUkdSLi4gQkdCRy4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TUkdHQjEwIHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnMScsICcwJykgLyogMTAgIFJHUkcuLiBHQkdCLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NCR0dSMTIgdjRsMl9mb3VyY2MoJ0InLCAnRycsICcxJywgJzInKSAvKiAxMiAgQkdCRy4uIEdSR1IuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dCUkcxMiB2NGwyX2ZvdXJjYygnRycsICdCJywgJzEnLCAnMicpIC8qIDEyICBHQkdCLi4gUkdSRy4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TR1JCRzEyIHY0bDJfZm91cmNjKCdCJywgJ0EnLCAnMScsICcyJykgLyogMTIgIEdSR1IuLiBCR0JHLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NSR0dCMTIgdjRsMl9mb3VyY2MoJ1InLCAnRycsICcxJywgJzInKSAvKiAxMiAgUkdSRy4uIEdCR0IuLiAqLworCS8qIDEwYml0IHJhdyBiYXllciBEUENNIGNvbXByZXNzZWQgdG8gOCBiaXRzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TR1JCRzEwRFBDTTggdjRsMl9mb3VyY2MoJ0InLCAnRCcsICcxJywgJzAnKQorCS8qCisJICogMTBiaXQgcmF3IGJheWVyLCBleHBhbmRlZCB0byAxNiBiaXRzCisJICogeHh4eHJycnJycnJycnJ4eHh4Z2dnZ2dnZ2dnZyB4eHh4Z2dnZ2dnZ2dnZ3h4eHhiYmJiYmJiYmJiLi4uCisJICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TQkdHUjE2IHY0bDJfZm91cmNjKCdCJywgJ1knLCAnUicsICcyJykgLyogMTYgIEJHQkcuLiBHUkdSLi4gKi8KKworLyogY29tcHJlc3NlZCBmb3JtYXRzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9NSlBFRyAgICB2NGwyX2ZvdXJjYygnTScsICdKJywgJ1AnLCAnRycpIC8qIE1vdGlvbi1KUEVHICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0pQRUcgICAgIHY0bDJfZm91cmNjKCdKJywgJ1AnLCAnRScsICdHJykgLyogSkZJRiBKUEVHICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfRFYgICAgICAgdjRsMl9mb3VyY2MoJ2QnLCAndicsICdzJywgJ2QnKSAvKiAxMzk0ICAgICAgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9NUEVHICAgICB2NGwyX2ZvdXJjYygnTScsICdQJywgJ0UnLCAnRycpIC8qIE1QRUctMS8yLzQgTXVsdGlwbGV4ZWQgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0gyNjQgICAgIHY0bDJfZm91cmNjKCdIJywgJzInLCAnNicsICc0JykgLyogSDI2NCB3aXRoIHN0YXJ0IGNvZGVzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9IMjY0X05PX1NDIHY0bDJfZm91cmNjKCdBJywgJ1YnLCAnQycsICcxJykgLyogSDI2NCB3aXRob3V0IHN0YXJ0IGNvZGVzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9IMjYzICAgICB2NGwyX2ZvdXJjYygnSCcsICcyJywgJzYnLCAnMycpIC8qIEgyNjMgICAgICAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX01QRUcxICAgIHY0bDJfZm91cmNjKCdNJywgJ1AnLCAnRycsICcxJykgLyogTVBFRy0xIEVTICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTVBFRzIgICAgdjRsMl9mb3VyY2MoJ00nLCAnUCcsICdHJywgJzInKSAvKiBNUEVHLTIgRVMgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9NUEVHNCAgICB2NGwyX2ZvdXJjYygnTScsICdQJywgJ0cnLCAnNCcpIC8qIE1QRUctNCBFUyAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1hWSUQgICAgIHY0bDJfZm91cmNjKCdYJywgJ1YnLCAnSScsICdEJykgLyogWHZpZCAgICAgICAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1ZDMV9BTk5FWF9HIHY0bDJfZm91cmNjKCdWJywgJ0MnLCAnMScsICdHJykgLyogU01QVEUgNDIxTSBBbm5leCBHIGNvbXBsaWFudCBzdHJlYW0gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1ZDMV9BTk5FWF9MIHY0bDJfZm91cmNjKCdWJywgJ0MnLCAnMScsICdMJykgLyogU01QVEUgNDIxTSBBbm5leCBMIGNvbXBsaWFudCBzdHJlYW0gKi8KKworLyogIFZlbmRvci1zcGVjaWZpYyBmb3JtYXRzICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0NQSUExICAgIHY0bDJfZm91cmNjKCdDJywgJ1AnLCAnSScsICdBJykgLyogY3BpYTEgWVVWICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9XTlZBICAgICB2NGwyX2ZvdXJjYygnVycsICdOJywgJ1YnLCAnQScpIC8qIFdpbm5vdiBodyBjb21wcmVzcyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU045QzEwWCAgdjRsMl9mb3VyY2MoJ1MnLCAnOScsICcxJywgJzAnKSAvKiBTTjlDMTB4IGNvbXByZXNzaW9uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TTjlDMjBYX0k0MjAgdjRsMl9mb3VyY2MoJ1MnLCAnOScsICcyJywgJzAnKSAvKiBTTjlDMjB4IFlVViA0OjI6MCAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUFdDMSAgICAgdjRsMl9mb3VyY2MoJ1AnLCAnVycsICdDJywgJzEnKSAvKiBwd2Mgb2xkZXIgd2ViY2FtICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9QV0MyICAgICB2NGwyX2ZvdXJjYygnUCcsICdXJywgJ0MnLCAnMicpIC8qIHB3YyBuZXdlciB3ZWJjYW0gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0VUNjFYMjUxIHY0bDJfZm91cmNjKCdFJywgJzYnLCAnMicsICc1JykgLyogRVQ2MVgyNTEgY29tcHJlc3Npb24gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NQQ0E1MDEgIHY0bDJfZm91cmNjKCdTJywgJzUnLCAnMCcsICcxJykgLyogWVVZViBwZXIgbGluZSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU1BDQTUwNSAgdjRsMl9mb3VyY2MoJ1MnLCAnNScsICcwJywgJzUnKSAvKiBZWVVWIHBlciBsaW5lICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TUENBNTA4ICB2NGwyX2ZvdXJjYygnUycsICc1JywgJzAnLCAnOCcpIC8qIFlVVlkgcGVyIGxpbmUgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NQQ0E1NjEgIHY0bDJfZm91cmNjKCdTJywgJzUnLCAnNicsICcxJykgLyogY29tcHJlc3NlZCBHQlJHIGJheWVyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9QQUMyMDcgICB2NGwyX2ZvdXJjYygnUCcsICcyJywgJzAnLCAnNycpIC8qIGNvbXByZXNzZWQgQkdHUiBiYXllciAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTVI5NzMxMEEgdjRsMl9mb3VyY2MoJ00nLCAnMycsICcxJywgJzAnKSAvKiBjb21wcmVzc2VkIEJHR1IgYmF5ZXIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NOOUMyMDI4IHY0bDJfZm91cmNjKCdTJywgJ08nLCAnTicsICdYJykgLyogY29tcHJlc3NlZCBHQlJHIGJheWVyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TUTkwNUMgICB2NGwyX2ZvdXJjYygnOScsICcwJywgJzUnLCAnQycpIC8qIGNvbXByZXNzZWQgUkdHQiBiYXllciAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUEpQRyAgICAgdjRsMl9mb3VyY2MoJ1AnLCAnSicsICdQJywgJ0cnKSAvKiBQaXhhcnQgNzN4eCBKUEVHICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9PVjUxMSAgICB2NGwyX2ZvdXJjYygnTycsICc1JywgJzEnLCAnMScpIC8qIG92NTExIEpQRUcgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX09WNTE4ICAgIHY0bDJfZm91cmNjKCdPJywgJzUnLCAnMScsICc4JykgLyogb3Y1MTggSlBFRyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU1RWMDY4MCAgdjRsMl9mb3VyY2MoJ1MnLCAnNicsICc4JywgJzAnKSAvKiBzdHYwNjgwIGJheWVyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9UTTYwMDAgICB2NGwyX2ZvdXJjYygnVCcsICdNJywgJzYnLCAnMCcpIC8qIHRtNTYwMC90bTYweDAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0NJVF9ZWVZZVVkgdjRsMl9mb3VyY2MoJ0MnLCAnSScsICdUJywgJ1YnKSAvKiBvbmUgbGluZSBvZiBZIHRoZW4gMSBsaW5lIG9mIFZZVVkgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0tPTklDQTQyMCAgdjRsMl9mb3VyY2MoJ0snLCAnTycsICdOJywgJ0knKSAvKiBZVVY0MjAgcGxhbmFyIGluIGJsb2NrcyBvZiAyNTYgcGl4ZWxzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9KUEdMCXY0bDJfZm91cmNjKCdKJywgJ1AnLCAnRycsICdMJykgLyogSlBFRy1MaXRlICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TRTQwMSAgICAgIHY0bDJfZm91cmNjKCdTJywgJzQnLCAnMCcsICcxJykgLyogc2U0MDEgamFuZ2d1IGNvbXByZXNzZWQgcmdiICovCisKKy8qCisgKglGIE8gUiBNIEEgVCAgIEUgTiBVIE0gRSBSIEEgVCBJIE8gTgorICovCitzdHJ1Y3QgdjRsMl9mbXRkZXNjIHsKKwlfX3UzMgkJICAgIGluZGV4OyAgICAgICAgICAgICAvKiBGb3JtYXQgbnVtYmVyICAgICAgKi8KKwllbnVtIHY0bDJfYnVmX3R5cGUgIHR5cGU7ICAgICAgICAgICAgICAvKiBidWZmZXIgdHlwZSAgICAgICAgKi8KKwlfX3UzMiAgICAgICAgICAgICAgIGZsYWdzOworCV9fdTgJCSAgICBkZXNjcmlwdGlvblszMl07ICAgLyogRGVzY3JpcHRpb24gc3RyaW5nICovCisJX191MzIJCSAgICBwaXhlbGZvcm1hdDsgICAgICAgLyogRm9ybWF0IGZvdXJjYyAgICAgICovCisJX191MzIJCSAgICByZXNlcnZlZFs0XTsKK307CisKKyNkZWZpbmUgVjRMMl9GTVRfRkxBR19DT01QUkVTU0VEIDB4MDAwMQorI2RlZmluZSBWNEwyX0ZNVF9GTEFHX0VNVUxBVEVEICAgMHgwMDAyCisKKyNpZiAxCisJLyogRXhwZXJpbWVudGFsIEZyYW1lIFNpemUgYW5kIGZyYW1lIHJhdGUgZW51bWVyYXRpb24gKi8KKy8qCisgKglGIFIgQSBNIEUgICBTIEkgWiBFICAgRSBOIFUgTSBFIFIgQSBUIEkgTyBOCisgKi8KK2VudW0gdjRsMl9mcm1zaXpldHlwZXMgeworCVY0TDJfRlJNU0laRV9UWVBFX0RJU0NSRVRFCT0gMSwKKwlWNEwyX0ZSTVNJWkVfVFlQRV9DT05USU5VT1VTCT0gMiwKKwlWNEwyX0ZSTVNJWkVfVFlQRV9TVEVQV0lTRQk9IDMsCit9OworCitzdHJ1Y3QgdjRsMl9mcm1zaXplX2Rpc2NyZXRlIHsKKwlfX3UzMgkJCXdpZHRoOwkJLyogRnJhbWUgd2lkdGggW3BpeGVsXSAqLworCV9fdTMyCQkJaGVpZ2h0OwkJLyogRnJhbWUgaGVpZ2h0IFtwaXhlbF0gKi8KK307CisKK3N0cnVjdCB2NGwyX2ZybXNpemVfc3RlcHdpc2UgeworCV9fdTMyCQkJbWluX3dpZHRoOwkvKiBNaW5pbXVtIGZyYW1lIHdpZHRoIFtwaXhlbF0gKi8KKwlfX3UzMgkJCW1heF93aWR0aDsJLyogTWF4aW11bSBmcmFtZSB3aWR0aCBbcGl4ZWxdICovCisJX191MzIJCQlzdGVwX3dpZHRoOwkvKiBGcmFtZSB3aWR0aCBzdGVwIHNpemUgW3BpeGVsXSAqLworCV9fdTMyCQkJbWluX2hlaWdodDsJLyogTWluaW11bSBmcmFtZSBoZWlnaHQgW3BpeGVsXSAqLworCV9fdTMyCQkJbWF4X2hlaWdodDsJLyogTWF4aW11bSBmcmFtZSBoZWlnaHQgW3BpeGVsXSAqLworCV9fdTMyCQkJc3RlcF9oZWlnaHQ7CS8qIEZyYW1lIGhlaWdodCBzdGVwIHNpemUgW3BpeGVsXSAqLworfTsKKworc3RydWN0IHY0bDJfZnJtc2l6ZWVudW0geworCV9fdTMyCQkJaW5kZXg7CQkvKiBGcmFtZSBzaXplIG51bWJlciAqLworCV9fdTMyCQkJcGl4ZWxfZm9ybWF0OwkvKiBQaXhlbCBmb3JtYXQgKi8KKwlfX3UzMgkJCXR5cGU7CQkvKiBGcmFtZSBzaXplIHR5cGUgdGhlIGRldmljZSBzdXBwb3J0cy4gKi8KKworCXVuaW9uIHsJCQkJCS8qIEZyYW1lIHNpemUgKi8KKwkJc3RydWN0IHY0bDJfZnJtc2l6ZV9kaXNjcmV0ZQlkaXNjcmV0ZTsKKwkJc3RydWN0IHY0bDJfZnJtc2l6ZV9zdGVwd2lzZQlzdGVwd2lzZTsKKwl9OworCisJX191MzIgICByZXNlcnZlZFsyXTsJCQkvKiBSZXNlcnZlZCBzcGFjZSBmb3IgZnV0dXJlIHVzZSAqLworfTsKKworLyoKKyAqCUYgUiBBIE0gRSAgIFIgQSBUIEUgICBFIE4gVSBNIEUgUiBBIFQgSSBPIE4KKyAqLworZW51bSB2NGwyX2ZybWl2YWx0eXBlcyB7CisJVjRMMl9GUk1JVkFMX1RZUEVfRElTQ1JFVEUJPSAxLAorCVY0TDJfRlJNSVZBTF9UWVBFX0NPTlRJTlVPVVMJPSAyLAorCVY0TDJfRlJNSVZBTF9UWVBFX1NURVBXSVNFCT0gMywKK307CisKK3N0cnVjdCB2NGwyX2ZybWl2YWxfc3RlcHdpc2UgeworCXN0cnVjdCB2NGwyX2ZyYWN0CW1pbjsJCS8qIE1pbmltdW0gZnJhbWUgaW50ZXJ2YWwgW3NdICovCisJc3RydWN0IHY0bDJfZnJhY3QJbWF4OwkJLyogTWF4aW11bSBmcmFtZSBpbnRlcnZhbCBbc10gKi8KKwlzdHJ1Y3QgdjRsMl9mcmFjdAlzdGVwOwkJLyogRnJhbWUgaW50ZXJ2YWwgc3RlcCBzaXplIFtzXSAqLworfTsKKworc3RydWN0IHY0bDJfZnJtaXZhbGVudW0geworCV9fdTMyCQkJaW5kZXg7CQkvKiBGcmFtZSBmb3JtYXQgaW5kZXggKi8KKwlfX3UzMgkJCXBpeGVsX2Zvcm1hdDsJLyogUGl4ZWwgZm9ybWF0ICovCisJX191MzIJCQl3aWR0aDsJCS8qIEZyYW1lIHdpZHRoICovCisJX191MzIJCQloZWlnaHQ7CQkvKiBGcmFtZSBoZWlnaHQgKi8KKwlfX3UzMgkJCXR5cGU7CQkvKiBGcmFtZSBpbnRlcnZhbCB0eXBlIHRoZSBkZXZpY2Ugc3VwcG9ydHMuICovCisKKwl1bmlvbiB7CQkJCQkvKiBGcmFtZSBpbnRlcnZhbCAqLworCQlzdHJ1Y3QgdjRsMl9mcmFjdAkJZGlzY3JldGU7CisJCXN0cnVjdCB2NGwyX2ZybWl2YWxfc3RlcHdpc2UJc3RlcHdpc2U7CisJfTsKKworCV9fdTMyCXJlc2VydmVkWzJdOwkJCS8qIFJlc2VydmVkIHNwYWNlIGZvciBmdXR1cmUgdXNlICovCit9OworI2VuZGlmCisKKy8qCisgKglUIEkgTSBFIEMgTyBEIEUKKyAqLworc3RydWN0IHY0bDJfdGltZWNvZGUgeworCV9fdTMyCXR5cGU7CisJX191MzIJZmxhZ3M7CisJX191OAlmcmFtZXM7CisJX191OAlzZWNvbmRzOworCV9fdTgJbWludXRlczsKKwlfX3U4CWhvdXJzOworCV9fdTgJdXNlcmJpdHNbNF07Cit9OworCisvKiAgVHlwZSAgKi8KKyNkZWZpbmUgVjRMMl9UQ19UWVBFXzI0RlBTCQkxCisjZGVmaW5lIFY0TDJfVENfVFlQRV8yNUZQUwkJMgorI2RlZmluZSBWNEwyX1RDX1RZUEVfMzBGUFMJCTMKKyNkZWZpbmUgVjRMMl9UQ19UWVBFXzUwRlBTCQk0CisjZGVmaW5lIFY0TDJfVENfVFlQRV82MEZQUwkJNQorCisvKiAgRmxhZ3MgICovCisjZGVmaW5lIFY0TDJfVENfRkxBR19EUk9QRlJBTUUJCTB4MDAwMSAvKiAiZHJvcC1mcmFtZSIgbW9kZSAqLworI2RlZmluZSBWNEwyX1RDX0ZMQUdfQ09MT1JGUkFNRQkJMHgwMDAyCisjZGVmaW5lIFY0TDJfVENfVVNFUkJJVFNfZmllbGQJCTB4MDAwQworI2RlZmluZSBWNEwyX1RDX1VTRVJCSVRTX1VTRVJERUZJTkVECTB4MDAwMAorI2RlZmluZSBWNEwyX1RDX1VTRVJCSVRTXzhCSVRDSEFSUwkweDAwMDgKKy8qIFRoZSBhYm92ZSBpcyBiYXNlZCBvbiBTTVBURSB0aW1lY29kZXMgKi8KKworc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uIHsKKwlpbnQgcXVhbGl0eTsKKworCWludCAgQVBQbjsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBBUFAgc2VnbWVudCB0byBiZSB3cml0dGVuLAorCQkJCSAqIG11c3QgYmUgMC4uMTUgKi8KKwlpbnQgIEFQUF9sZW47ICAgICAgICAgICAvKiBMZW5ndGggb2YgZGF0YSBpbiBKUEVHIEFQUG4gc2VnbWVudCAqLworCWNoYXIgQVBQX2RhdGFbNjBdOyAgICAgIC8qIERhdGEgaW4gdGhlIEpQRUcgQVBQbiBzZWdtZW50LiAqLworCisJaW50ICBDT01fbGVuOyAgICAgICAgICAgLyogTGVuZ3RoIG9mIGRhdGEgaW4gSlBFRyBDT00gc2VnbWVudCAqLworCWNoYXIgQ09NX2RhdGFbNjBdOyAgICAgIC8qIERhdGEgaW4gSlBFRyBDT00gc2VnbWVudCAqLworCisJX191MzIganBlZ19tYXJrZXJzOyAgICAgLyogV2hpY2ggbWFya2VycyBzaG91bGQgZ28gaW50byB0aGUgSlBFRworCQkJCSAqIG91dHB1dC4gVW5sZXNzIHlvdSBleGFjdGx5IGtub3cgd2hhdAorCQkJCSAqIHlvdSBkbywgbGVhdmUgdGhlbSB1bnRvdWNoZWQuCisJCQkJICogSW5sdWRpbmcgbGVzcyBtYXJrZXJzIHdpbGwgbWFrZSB0aGUKKwkJCQkgKiByZXN1bHRpbmcgY29kZSBzbWFsbGVyLCBidXQgdGhlcmUgd2lsbAorCQkJCSAqIGJlIGZld2VyIGFwcGxpY2F0aW9ucyB3aGljaCBjYW4gcmVhZCBpdC4KKwkJCQkgKiBUaGUgcHJlc2VuY2Ugb2YgdGhlIEFQUCBhbmQgQ09NIG1hcmtlcgorCQkJCSAqIGlzIGluZmx1ZW5jZWQgYnkgQVBQX2xlbiBhbmQgQ09NX2xlbgorCQkJCSAqIE9OTFksIG5vdCBieSB0aGlzIHByb3BlcnR5ISAqLworCisjZGVmaW5lIFY0TDJfSlBFR19NQVJLRVJfREhUICgxPDwzKSAgICAvKiBEZWZpbmUgSHVmZm1hbiBUYWJsZXMgKi8KKyNkZWZpbmUgVjRMMl9KUEVHX01BUktFUl9EUVQgKDE8PDQpICAgIC8qIERlZmluZSBRdWFudGl6YXRpb24gVGFibGVzICovCisjZGVmaW5lIFY0TDJfSlBFR19NQVJLRVJfRFJJICgxPDw1KSAgICAvKiBEZWZpbmUgUmVzdGFydCBJbnRlcnZhbCAqLworI2RlZmluZSBWNEwyX0pQRUdfTUFSS0VSX0NPTSAoMTw8NikgICAgLyogQ29tbWVudCBzZWdtZW50ICovCisjZGVmaW5lIFY0TDJfSlBFR19NQVJLRVJfQVBQICgxPDw3KSAgICAvKiBBcHAgc2VnbWVudCwgZHJpdmVyIHdpbGwKKwkJCQkJKiBhbGx3YXlzIHVzZSBBUFAwICovCit9OworCisvKgorICoJTSBFIE0gTyBSIFkgLSBNIEEgUCBQIEkgTiBHICAgQiBVIEYgRiBFIFIgUworICovCitzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyB7CisJX191MzIJCQljb3VudDsKKwllbnVtIHY0bDJfYnVmX3R5cGUgICAgICB0eXBlOworCWVudW0gdjRsMl9tZW1vcnkgICAgICAgIG1lbW9yeTsKKwlfX3UzMgkJCXJlc2VydmVkWzJdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdjRsMl9wbGFuZSAtIHBsYW5lIGluZm8gZm9yIG11bHRpLXBsYW5hciBidWZmZXJzCisgKiBAYnl0ZXN1c2VkOgkJbnVtYmVyIG9mIGJ5dGVzIG9jY3VwaWVkIGJ5IGRhdGEgaW4gdGhlIHBsYW5lIChwYXlsb2FkKQorICogQGxlbmd0aDoJCXNpemUgb2YgdGhpcyBwbGFuZSAoTk9UIHRoZSBwYXlsb2FkKSBpbiBieXRlcworICogQG1lbV9vZmZzZXQ6CQl3aGVuIG1lbW9yeSBpbiB0aGUgYXNzb2NpYXRlZCBzdHJ1Y3QgdjRsMl9idWZmZXIgaXMKKyAqCQkJVjRMMl9NRU1PUllfTU1BUCwgZXF1YWxzIHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YKKyAqCQkJdGhlIGRldmljZSBtZW1vcnkgZm9yIHRoaXMgcGxhbmUgKG9yIGlzIGEgImNvb2tpZSIgdGhhdAorICoJCQlzaG91bGQgYmUgcGFzc2VkIHRvIG1tYXAoKSBjYWxsZWQgb24gdGhlIHZpZGVvIG5vZGUpCisgKiBAdXNlcnB0cjoJCXdoZW4gbWVtb3J5IGlzIFY0TDJfTUVNT1JZX1VTRVJQVFIsIGEgdXNlcnNwYWNlIHBvaW50ZXIKKyAqCQkJcG9pbnRpbmcgdG8gdGhpcyBwbGFuZQorICogQGRhdGFfb2Zmc2V0OglvZmZzZXQgaW4gdGhlIHBsYW5lIHRvIHRoZSBzdGFydCBvZiBkYXRhOyB1c3VhbGx5IDAsCisgKgkJCXVubGVzcyB0aGVyZSBpcyBhIGhlYWRlciBpbiBmcm9udCBvZiB0aGUgZGF0YQorICoKKyAqIE11bHRpLXBsYW5hciBidWZmZXJzIGNvbnNpc3Qgb2Ygb25lIG9yIG1vcmUgcGxhbmVzLCBlLmcuIGFuIFlDYkNyIGJ1ZmZlcgorICogd2l0aCB0d28gcGxhbmVzIGNhbiBoYXZlIG9uZSBwbGFuZSBmb3IgWSwgYW5kIGFub3RoZXIgZm9yIGludGVybGVhdmVkIENiQ3IKKyAqIGNvbXBvbmVudHMuIEVhY2ggcGxhbmUgY2FuIHJlc2lkZSBpbiBhIHNlcGFyYXRlIG1lbW9yeSBidWZmZXIsIG9yIGV2ZW4gaW4KKyAqIGEgY29tcGxldGVseSBzZXBhcmF0ZSBtZW1vcnkgbm9kZSAoZS5nLiBpbiBlbWJlZGRlZCBkZXZpY2VzKS4KKyAqLworc3RydWN0IHY0bDJfcGxhbmUgeworCV9fdTMyCQkJYnl0ZXN1c2VkOworCV9fdTMyCQkJbGVuZ3RoOworCXVuaW9uIHsKKwkJX191MzIJCW1lbV9vZmZzZXQ7CisJCXVuc2lnbmVkIGxvbmcJdXNlcnB0cjsKKwl9IG07CisJX191MzIJCQlkYXRhX29mZnNldDsKKwlfX3UzMgkJCXJlc2VydmVkWzExXTsKK307CisKKy8qKgorICogc3RydWN0IHY0bDJfYnVmZmVyIC0gdmlkZW8gYnVmZmVyIGluZm8KKyAqIEBpbmRleDoJaWQgbnVtYmVyIG9mIHRoZSBidWZmZXIKKyAqIEB0eXBlOglidWZmZXIgdHlwZSAodHlwZSA9PSAqX01QTEFORSBmb3IgbXVsdGlwbGFuYXIgYnVmZmVycykKKyAqIEBieXRlc3VzZWQ6CW51bWJlciBvZiBieXRlcyBvY2N1cGllZCBieSBkYXRhIGluIHRoZSBidWZmZXIgKHBheWxvYWQpOworICoJCXVudXNlZCAoc2V0IHRvIDApIGZvciBtdWx0aXBsYW5hciBidWZmZXJzCisgKiBAZmxhZ3M6CWJ1ZmZlciBpbmZvcm1hdGlvbmFsIGZsYWdzCisgKiBAZmllbGQ6CWZpZWxkIG9yZGVyIG9mIHRoZSBpbWFnZSBpbiB0aGUgYnVmZmVyCisgKiBAdGltZXN0YW1wOglmcmFtZSB0aW1lc3RhbXAKKyAqIEB0aW1lY29kZToJZnJhbWUgdGltZWNvZGUKKyAqIEBzZXF1ZW5jZToJc2VxdWVuY2UgY291bnQgb2YgdGhpcyBmcmFtZQorICogQG1lbW9yeToJdGhlIG1ldGhvZCwgaW4gd2hpY2ggdGhlIGFjdHVhbCB2aWRlbyBkYXRhIGlzIHBhc3NlZAorICogQG9mZnNldDoJZm9yIG5vbi1tdWx0aXBsYW5hciBidWZmZXJzIHdpdGggbWVtb3J5ID09IFY0TDJfTUVNT1JZX01NQVA7CisgKgkJb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBkZXZpY2UgbWVtb3J5IGZvciB0aGlzIHBsYW5lLAorICoJCShvciBhICJjb29raWUiIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCB0byBtbWFwKCkgYXMgb2Zmc2V0KQorICogQHVzZXJwdHI6CWZvciBub24tbXVsdGlwbGFuYXIgYnVmZmVycyB3aXRoIG1lbW9yeSA9PSBWNEwyX01FTU9SWV9VU0VSUFRSOworICoJCWEgdXNlcnNwYWNlIHBvaW50ZXIgcG9pbnRpbmcgdG8gdGhpcyBidWZmZXIKKyAqIEBwbGFuZXM6CWZvciBtdWx0aXBsYW5hciBidWZmZXJzOyB1c2Vyc3BhY2UgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgcGxhbmUKKyAqCQlpbmZvIHN0cnVjdHMgZm9yIHRoaXMgYnVmZmVyCisgKiBAbGVuZ3RoOglzaXplIGluIGJ5dGVzIG9mIHRoZSBidWZmZXIgKE5PVCBpdHMgcGF5bG9hZCkgZm9yIHNpbmdsZS1wbGFuZQorICoJCWJ1ZmZlcnMgKHdoZW4gdHlwZSAhPSAqX01QTEFORSk7IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUKKyAqCQlwbGFuZXMgYXJyYXkgZm9yIG11bHRpLXBsYW5lIGJ1ZmZlcnMKKyAqIEBpbnB1dDoJaW5wdXQgbnVtYmVyIGZyb20gd2hpY2ggdGhlIHZpZGVvIGRhdGEgaGFzIGhhcyBiZWVuIGNhcHR1cmVkCisgKgorICogQ29udGFpbnMgZGF0YSBleGNoYW5nZWQgYnkgYXBwbGljYXRpb24gYW5kIGRyaXZlciB1c2luZyBvbmUgb2YgdGhlIFN0cmVhbWluZworICogSS9PIG1ldGhvZHMuCisgKi8KK3N0cnVjdCB2NGwyX2J1ZmZlciB7CisJX191MzIJCQlpbmRleDsKKwllbnVtIHY0bDJfYnVmX3R5cGUgICAgICB0eXBlOworCV9fdTMyCQkJYnl0ZXN1c2VkOworCV9fdTMyCQkJZmxhZ3M7CisJZW51bSB2NGwyX2ZpZWxkCQlmaWVsZDsKKwlzdHJ1Y3QgdGltZXZhbAkJdGltZXN0YW1wOworCXN0cnVjdCB2NGwyX3RpbWVjb2RlCXRpbWVjb2RlOworCV9fdTMyCQkJc2VxdWVuY2U7CisKKwkvKiBtZW1vcnkgbG9jYXRpb24gKi8KKwllbnVtIHY0bDJfbWVtb3J5ICAgICAgICBtZW1vcnk7CisJdW5pb24geworCQlfX3UzMiAgICAgICAgICAgb2Zmc2V0OworCQl1bnNpZ25lZCBsb25nICAgdXNlcnB0cjsKKwkJc3RydWN0IHY0bDJfcGxhbmUgKnBsYW5lczsKKwl9IG07CisJX191MzIJCQlsZW5ndGg7CisJX191MzIJCQlpbnB1dDsKKwlfX3UzMgkJCXJlc2VydmVkOworfTsKKworLyogIEZsYWdzIGZvciAnZmxhZ3MnIGZpZWxkICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfTUFQUEVECTB4MDAwMSAgLyogQnVmZmVyIGlzIG1hcHBlZCAoZmxhZykgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19RVUVVRUQJMHgwMDAyCS8qIEJ1ZmZlciBpcyBxdWV1ZWQgZm9yIHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19ET05FCTB4MDAwNAkvKiBCdWZmZXIgaXMgcmVhZHkgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19LRVlGUkFNRQkweDAwMDgJLyogSW1hZ2UgaXMgYSBrZXlmcmFtZSAoSS1mcmFtZSkgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19QRlJBTUUJMHgwMDEwCS8qIEltYWdlIGlzIGEgUC1mcmFtZSAqLworI2RlZmluZSBWNEwyX0JVRl9GTEFHX0JGUkFNRQkweDAwMjAJLyogSW1hZ2UgaXMgYSBCLWZyYW1lICovCisvKiBCdWZmZXIgaXMgcmVhZHksIGJ1dCB0aGUgZGF0YSBjb250YWluZWQgd2l0aGluIGlzIGNvcnJ1cHRlZC4gKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19FUlJPUgkweDAwNDAKKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19USU1FQ09ERQkweDAxMDAJLyogdGltZWNvZGUgZmllbGQgaXMgdmFsaWQgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19JTlBVVCAgICAgMHgwMjAwICAvKiBpbnB1dCBmaWVsZCBpcyB2YWxpZCAqLworI2RlZmluZSBWNEwyX0JVRl9GTEFHX1BSRVBBUkVECTB4MDQwMAkvKiBCdWZmZXIgaXMgcHJlcGFyZWQgZm9yIHF1ZXVpbmcgKi8KKy8qIENhY2hlIGhhbmRsaW5nIGZsYWdzICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfTk9fQ0FDSEVfSU5WQUxJREFURQkweDA4MDAKKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19OT19DQUNIRV9DTEVBTgkJMHgxMDAwCisKKy8qCisgKglPIFYgRSBSIEwgQSBZICAgUCBSIEUgViBJIEUgVworICovCitzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciB7CisJX191MzIJCQljYXBhYmlsaXR5OworCV9fdTMyCQkJZmxhZ3M7CisvKiBGSVhNRTogaW4gdGhlb3J5IHdlIHNob3VsZCBwYXNzIHNvbWV0aGluZyBsaWtlIFBDSSBkZXZpY2UgKyBtZW1vcnkKKyAqIHJlZ2lvbiArIG9mZnNldCBpbnN0ZWFkIG9mIHNvbWUgcGh5c2ljYWwgYWRkcmVzcyAqLworCXZvaWQgICAgICAgICAgICAgICAgICAgICpiYXNlOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQJZm10OworfTsKKy8qICBGbGFncyBmb3IgdGhlICdjYXBhYmlsaXR5JyBmaWVsZC4gUmVhZCBvbmx5ICovCisjZGVmaW5lIFY0TDJfRkJVRl9DQVBfRVhURVJOT1ZFUkxBWQkweDAwMDEKKyNkZWZpbmUgVjRMMl9GQlVGX0NBUF9DSFJPTUFLRVkJCTB4MDAwMgorI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0xJU1RfQ0xJUFBJTkcgICAgIDB4MDAwNAorI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0JJVE1BUF9DTElQUElORwkweDAwMDgKKyNkZWZpbmUgVjRMMl9GQlVGX0NBUF9MT0NBTF9BTFBIQQkweDAwMTAKKyNkZWZpbmUgVjRMMl9GQlVGX0NBUF9HTE9CQUxfQUxQSEEJMHgwMDIwCisjZGVmaW5lIFY0TDJfRkJVRl9DQVBfTE9DQUxfSU5WX0FMUEhBCTB4MDA0MAorI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX1NSQ19DSFJPTUFLRVkJMHgwMDgwCisvKiAgRmxhZ3MgZm9yIHRoZSAnZmxhZ3MnIGZpZWxkLiAqLworI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19QUklNQVJZCQkweDAwMDEKKyNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfT1ZFUkxBWQkJMHgwMDAyCisjZGVmaW5lIFY0TDJfRkJVRl9GTEFHX0NIUk9NQUtFWQkweDAwMDQKKyNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfTE9DQUxfQUxQSEEJMHgwMDA4CisjZGVmaW5lIFY0TDJfRkJVRl9GTEFHX0dMT0JBTF9BTFBIQQkweDAwMTAKKyNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfTE9DQUxfSU5WX0FMUEhBCTB4MDAyMAorI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19TUkNfQ0hST01BS0VZCTB4MDA0MAorCitzdHJ1Y3QgdjRsMl9jbGlwIHsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICBjOworCXN0cnVjdCB2NGwyX2NsaXAJKm5leHQ7Cit9OworCitzdHJ1Y3QgdjRsMl93aW5kb3cgeworCXN0cnVjdCB2NGwyX3JlY3QgICAgICAgIHc7CisJZW51bSB2NGwyX2ZpZWxkICAJZmllbGQ7CisJX191MzIJCQljaHJvbWFrZXk7CisJc3RydWN0IHY0bDJfY2xpcAkqY2xpcHM7CisJX191MzIJCQljbGlwY291bnQ7CisJdm9pZAkJCSpiaXRtYXA7CisJX191OCAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX2FscGhhOworfTsKKworLyoKKyAqCUMgQSBQIFQgVSBSIEUgICBQIEEgUiBBIE0gRSBUIEUgUiBTCisgKi8KK3N0cnVjdCB2NGwyX2NhcHR1cmVwYXJtIHsKKwlfX3UzMgkJICAgY2FwYWJpbGl0eTsJICAvKiAgU3VwcG9ydGVkIG1vZGVzICovCisJX191MzIJCSAgIGNhcHR1cmVtb2RlOwkgIC8qICBDdXJyZW50IG1vZGUgKi8KKwlzdHJ1Y3QgdjRsMl9mcmFjdCAgdGltZXBlcmZyYW1lOyAgLyogIFRpbWUgcGVyIGZyYW1lIGluIC4xdXMgdW5pdHMgKi8KKwlfX3UzMgkJICAgZXh0ZW5kZWRtb2RlOyAgLyogIERyaXZlci1zcGVjaWZpYyBleHRlbnNpb25zICovCisJX191MzIgICAgICAgICAgICAgIHJlYWRidWZmZXJzOyAgIC8qICAjIG9mIGJ1ZmZlcnMgZm9yIHJlYWQgKi8KKwlfX3UzMgkJICAgcmVzZXJ2ZWRbNF07Cit9OworCisvKiAgRmxhZ3MgZm9yICdjYXBhYmlsaXR5JyBhbmQgJ2NhcHR1cmVtb2RlJyBmaWVsZHMgKi8KKyNkZWZpbmUgVjRMMl9NT0RFX0hJR0hRVUFMSVRZCTB4MDAwMQkvKiAgSGlnaCBxdWFsaXR5IGltYWdpbmcgbW9kZSAqLworI2RlZmluZSBWNEwyX0NBUF9USU1FUEVSRlJBTUUJMHgxMDAwCS8qICB0aW1lcGVyZnJhbWUgZmllbGQgaXMgc3VwcG9ydGVkICovCisKK3N0cnVjdCB2NGwyX291dHB1dHBhcm0geworCV9fdTMyCQkgICBjYXBhYmlsaXR5OwkgLyogIFN1cHBvcnRlZCBtb2RlcyAqLworCV9fdTMyCQkgICBvdXRwdXRtb2RlOwkgLyogIEN1cnJlbnQgbW9kZSAqLworCXN0cnVjdCB2NGwyX2ZyYWN0ICB0aW1lcGVyZnJhbWU7IC8qICBUaW1lIHBlciBmcmFtZSBpbiBzZWNvbmRzICovCisJX191MzIJCSAgIGV4dGVuZGVkbW9kZTsgLyogIERyaXZlci1zcGVjaWZpYyBleHRlbnNpb25zICovCisJX191MzIgICAgICAgICAgICAgIHdyaXRlYnVmZmVyczsgLyogICMgb2YgYnVmZmVycyBmb3Igd3JpdGUgKi8KKwlfX3UzMgkJICAgcmVzZXJ2ZWRbNF07Cit9OworCisvKgorICoJSSBOIFAgVSBUICAgSSBNIEEgRyBFICAgQyBSIE8gUCBQIEkgTiBHCisgKi8KK3N0cnVjdCB2NGwyX2Nyb3BjYXAgeworCWVudW0gdjRsMl9idWZfdHlwZSAgICAgIHR5cGU7CisJc3RydWN0IHY0bDJfcmVjdCAgICAgICAgYm91bmRzOworCXN0cnVjdCB2NGwyX3JlY3QgICAgICAgIGRlZnJlY3Q7CisJc3RydWN0IHY0bDJfZnJhY3QgICAgICAgcGl4ZWxhc3BlY3Q7Cit9OworCitzdHJ1Y3QgdjRsMl9jcm9wIHsKKwllbnVtIHY0bDJfYnVmX3R5cGUgICAgICB0eXBlOworCXN0cnVjdCB2NGwyX3JlY3QgICAgICAgIGM7Cit9OworCisvKgorICogICAgICBBIE4gQSBMIE8gRyAgIFYgSSBEIEUgTyAgIFMgVCBBIE4gRCBBIFIgRAorICovCisKK3R5cGVkZWYgX191NjQgdjRsMl9zdGRfaWQ7CisKKy8qIG9uZSBiaXQgZm9yIGVhY2ggKi8KKyNkZWZpbmUgVjRMMl9TVERfUEFMX0IgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMDAxKQorI2RlZmluZSBWNEwyX1NURF9QQUxfQjEgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwMDIpCisjZGVmaW5lIFY0TDJfU1REX1BBTF9HICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDAwNCkKKyNkZWZpbmUgVjRMMl9TVERfUEFMX0ggICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMDA4KQorI2RlZmluZSBWNEwyX1NURF9QQUxfSSAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwMTApCisjZGVmaW5lIFY0TDJfU1REX1BBTF9EICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDAyMCkKKyNkZWZpbmUgVjRMMl9TVERfUEFMX0QxICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMDQwKQorI2RlZmluZSBWNEwyX1NURF9QQUxfSyAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwODApCisKKyNkZWZpbmUgVjRMMl9TVERfUEFMX00gICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMTAwKQorI2RlZmluZSBWNEwyX1NURF9QQUxfTiAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAyMDApCisjZGVmaW5lIFY0TDJfU1REX1BBTF9OYyAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDQwMCkKKyNkZWZpbmUgVjRMMl9TVERfUEFMXzYwICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwODAwKQorCisjZGVmaW5lIFY0TDJfU1REX05UU0NfTSAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMTAwMCkJLyogQlRTQyAqLworI2RlZmluZSBWNEwyX1NURF9OVFNDX01fSlAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDIwMDApCS8qIEVJQS1KICovCisjZGVmaW5lIFY0TDJfU1REX05UU0NfNDQzICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwNDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfTlRTQ19NX0tSICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDA4MDAwKQkvKiBGTSBBMiAqLworCisjZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0IgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAxMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fRCAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDIwMDAwKQorI2RlZmluZSBWNEwyX1NURF9TRUNBTV9HICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwNDAwMDApCisjZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0ggICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDA4MDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fSyAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMTAwMDAwKQorI2RlZmluZSBWNEwyX1NURF9TRUNBTV9LMSAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAyMDAwMDApCisjZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0wgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDQwMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fTEMgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwODAwMDAwKQorCisvKiBBVFNDL0hEVFYgKi8KKyNkZWZpbmUgVjRMMl9TVERfQVRTQ184X1ZTQiAgICAgKCh2NGwyX3N0ZF9pZCkweDAxMDAwMDAwKQorI2RlZmluZSBWNEwyX1NURF9BVFNDXzE2X1ZTQiAgICAoKHY0bDJfc3RkX2lkKTB4MDIwMDAwMDApCisKKy8qIEZJWE1FOgorICAgQWx0aG91Z2ggc3RkX2lkIGlzIDY0IGJpdHMsIHRoZXJlIGlzIGFuIGlzc3VlIG9uIFBQQzMyIGFyY2hpdGVjdHVyZSB0aGF0CisgICBtYWtlcyBzd2l0Y2goX191NjQpIHRvIGJyZWFrLiBTbywgdGhlcmUncyBhIGhhY2sgb24gdjRsMi1jb21tb24uYyByb3VuZGluZworICAgdGhpcyB2YWx1ZSB0byAzMiBiaXRzLgorICAgQXMsIGN1cnJlbnRseSwgdGhlIG1heCB2YWx1ZSBpcyBmb3IgVjRMMl9TVERfQVRTQ18xNl9WU0IgKDMwIGJpdHMgd2lkZSksCisgICBpdCBzaG91bGQgd29yayBmaW5lLiBIb3dldmVyLCBpZiBuZWVkZWQgdG8gYWRkIG1vcmUgdGhhbiB0d28gc3RhbmRhcmRzLAorICAgdjRsMi1jb21tb24uYyBzaG91bGQgYmUgZml4ZWQuCisgKi8KKworLyoKKyAqIFNvbWUgbWFjcm9zIHRvIG1lcmdlIHZpZGVvIHN0YW5kYXJkcyBpbiBvcmRlciB0byBtYWtlIGxpdmUgZWFzaWVyIGZvciB0aGUKKyAqIGRyaXZlcnMgYW5kIFY0TDIgYXBwbGljYXRpb25zCisgKi8KKworLyoKKyAqICJDb21tb24iIE5UU0MvTSAtIEl0IHNob3VsZCBiZSBub3RpY2VkIHRoYXQgVjRMMl9TVERfTlRTQ180NDMgaXMKKyAqIE1pc3NpbmcgaGVyZS4KKyAqLworI2RlZmluZSBWNEwyX1NURF9OVFNDICAgICAgICAgICAoVjRMMl9TVERfTlRTQ19NCXxcCisJCQkJIFY0TDJfU1REX05UU0NfTV9KUCAgICAgfFwKKwkJCQkgVjRMMl9TVERfTlRTQ19NX0tSKQorLyogU2VjYW0gbWFjcm9zICovCisjZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0RLICAgICAgCShWNEwyX1NURF9TRUNBTV9ECXxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0sJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fSzEpCisvKiBBbGwgU2VjYW0gU3RhbmRhcmRzICovCisjZGVmaW5lIFY0TDJfU1REX1NFQ0FNCQkoVjRMMl9TVERfU0VDQU1fQgl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9HCXxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0gJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fREsJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fTCAgICAgICB8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9MQykKKy8qIFBBTCBtYWNyb3MgKi8KKyNkZWZpbmUgVjRMMl9TVERfUEFMX0JHCQkoVjRMMl9TVERfUEFMX0IJCXxcCisJCQkJIFY0TDJfU1REX1BBTF9CMQl8XAorCQkJCSBWNEwyX1NURF9QQUxfRykKKyNkZWZpbmUgVjRMMl9TVERfUEFMX0RLCQkoVjRMMl9TVERfUEFMX0QJCXxcCisJCQkJIFY0TDJfU1REX1BBTF9EMQl8XAorCQkJCSBWNEwyX1NURF9QQUxfSykKKy8qCisgKiAiQ29tbW9uIiBQQUwgLSBUaGlzIG1hY3JvIGlzIHRoZXJlIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgb2xkCisgKiBWNEwxIGNvbmNlcHQgb2YgIlBBTCI6IC9CR0RLSEkuCisgKiBTZXZlcmFsIFBBTCBzdGFuZGFyZHMgYXJlIG1pc2luZyBoZXJlOiAvTSwgL04gYW5kIC9OYworICovCisjZGVmaW5lIFY0TDJfU1REX1BBTAkJKFY0TDJfU1REX1BBTF9CRwl8XAorCQkJCSBWNEwyX1NURF9QQUxfREsJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0gJCXxcCisJCQkJIFY0TDJfU1REX1BBTF9JKQorLyogQ2hyb21hICJhZ25vc3RpYyIgc3RhbmRhcmRzICovCisjZGVmaW5lIFY0TDJfU1REX0IJCShWNEwyX1NURF9QQUxfQgkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0IxCXxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0IpCisjZGVmaW5lIFY0TDJfU1REX0cJCShWNEwyX1NURF9QQUxfRwkJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fRykKKyNkZWZpbmUgVjRMMl9TVERfSAkJKFY0TDJfU1REX1BBTF9ICQl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9IKQorI2RlZmluZSBWNEwyX1NURF9MCQkoVjRMMl9TVERfU0VDQU1fTAl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9MQykKKyNkZWZpbmUgVjRMMl9TVERfR0gJCShWNEwyX1NURF9HCQl8XAorCQkJCSBWNEwyX1NURF9IKQorI2RlZmluZSBWNEwyX1NURF9ESwkJKFY0TDJfU1REX1BBTF9ESwl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9ESykKKyNkZWZpbmUgVjRMMl9TVERfQkcJCShWNEwyX1NURF9CCQl8XAorCQkJCSBWNEwyX1NURF9HKQorI2RlZmluZSBWNEwyX1NURF9NTgkJKFY0TDJfU1REX1BBTF9NCQl8XAorCQkJCSBWNEwyX1NURF9QQUxfTgkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX05jCXxcCisJCQkJIFY0TDJfU1REX05UU0MpCisKKy8qIFN0YW5kYXJkcyB3aGVyZSBNVFMvQlRTQyBzdGVyZW8gY291bGQgYmUgZm91bmQgKi8KKyNkZWZpbmUgVjRMMl9TVERfTVRTCQkoVjRMMl9TVERfTlRTQ19NCXxcCisJCQkJIFY0TDJfU1REX1BBTF9NCQl8XAorCQkJCSBWNEwyX1NURF9QQUxfTgkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX05jKQorCisvKiBTdGFuZGFyZHMgZm9yIENvdW50cmllcyB3aXRoIDYwSHogTGluZSBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgVjRMMl9TVERfNTI1XzYwCQkoVjRMMl9TVERfUEFMX00JCXxcCisJCQkJIFY0TDJfU1REX1BBTF82MAl8XAorCQkJCSBWNEwyX1NURF9OVFNDCQl8XAorCQkJCSBWNEwyX1NURF9OVFNDXzQ0MykKKy8qIFN0YW5kYXJkcyBmb3IgQ291bnRyaWVzIHdpdGggNTBIeiBMaW5lIGZyZXF1ZW5jeSAqLworI2RlZmluZSBWNEwyX1NURF82MjVfNTAJCShWNEwyX1NURF9QQUwJCXxcCisJCQkJIFY0TDJfU1REX1BBTF9OCQl8XAorCQkJCSBWNEwyX1NURF9QQUxfTmMJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU0pCisKKyNkZWZpbmUgVjRMMl9TVERfQVRTQyAgICAgICAgICAgKFY0TDJfU1REX0FUU0NfOF9WU0IgICAgfFwKKwkJCQkgVjRMMl9TVERfQVRTQ18xNl9WU0IpCisvKiBNYWNyb3Mgd2l0aCBub25lIGFuZCBhbGwgYW5hbG9nIHN0YW5kYXJkcyAqLworI2RlZmluZSBWNEwyX1NURF9VTktOT1dOICAgICAgICAwCisjZGVmaW5lIFY0TDJfU1REX0FMTCAgICAgICAgICAgIChWNEwyX1NURF81MjVfNjAJfFwKKwkJCQkgVjRMMl9TVERfNjI1XzUwKQorCitzdHJ1Y3QgdjRsMl9zdGFuZGFyZCB7CisJX191MzIJCSAgICAgaW5kZXg7CisJdjRsMl9zdGRfaWQgICAgICAgICAgaWQ7CisJX191OAkJICAgICBuYW1lWzI0XTsKKwlzdHJ1Y3QgdjRsMl9mcmFjdCAgICBmcmFtZXBlcmlvZDsgLyogRnJhbWVzLCBub3QgZmllbGRzICovCisJX191MzIJCSAgICAgZnJhbWVsaW5lczsKKwlfX3UzMgkJICAgICByZXNlcnZlZFs0XTsKK307CisKKy8qCisgKglWIEkgRCBFIE8JVCBJIE0gSSBOIEcgUwlEIFYJUCBSIEUgUyBFIFQKKyAqLworc3RydWN0IHY0bDJfZHZfcHJlc2V0IHsKKwlfX3UzMglwcmVzZXQ7CisJX191MzIJcmVzZXJ2ZWRbNF07Cit9OworCisvKgorICoJRCBWCVAgUiBFIFMgRSBUIFMJRSBOIFUgTSBFIFIgQSBUIEkgTyBOCisgKi8KK3N0cnVjdCB2NGwyX2R2X2VudW1fcHJlc2V0IHsKKwlfX3UzMglpbmRleDsKKwlfX3UzMglwcmVzZXQ7CisJX191OAluYW1lWzMyXTsgLyogTmFtZSBvZiB0aGUgcHJlc2V0IHRpbWluZyAqLworCV9fdTMyCXdpZHRoOworCV9fdTMyCWhlaWdodDsKKwlfX3UzMglyZXNlcnZlZFs0XTsKK307CisKKy8qCisgKiAJRCBWCVAgUiBFIFMgRSBUCVYgQSBMIFUgRSBTCisgKi8KKyNkZWZpbmUJCVY0TDJfRFZfSU5WQUxJRAkJMAorI2RlZmluZQkJVjRMMl9EVl80ODBQNTlfOTQJMSAvKiBCVC4xMzYyICovCisjZGVmaW5lCQlWNEwyX0RWXzU3NlA1MAkJMiAvKiBCVC4xMzYyICovCisjZGVmaW5lCQlWNEwyX0RWXzcyMFAyNAkJMyAvKiBTTVBURSAyOTZNICovCisjZGVmaW5lCQlWNEwyX0RWXzcyMFAyNQkJNCAvKiBTTVBURSAyOTZNICovCisjZGVmaW5lCQlWNEwyX0RWXzcyMFAzMAkJNSAvKiBTTVBURSAyOTZNICovCisjZGVmaW5lCQlWNEwyX0RWXzcyMFA1MAkJNiAvKiBTTVBURSAyOTZNICovCisjZGVmaW5lCQlWNEwyX0RWXzcyMFA1OV85NAk3IC8qIFNNUFRFIDI3NE0gKi8KKyNkZWZpbmUJCVY0TDJfRFZfNzIwUDYwCQk4IC8qIFNNUFRFIDI3NE0vMjk2TSAqLworI2RlZmluZQkJVjRMMl9EVl8xMDgwSTI5Xzk3CTkgLyogQlQuMTEyMC8gU01QVEUgMjc0TSAqLworI2RlZmluZQkJVjRMMl9EVl8xMDgwSTMwCQkxMCAvKiBCVC4xMTIwLyBTTVBURSAyNzRNICovCisjZGVmaW5lCQlWNEwyX0RWXzEwODBJMjUJCTExIC8qIEJULjExMjAgKi8KKyNkZWZpbmUJCVY0TDJfRFZfMTA4MEk1MAkJMTIgLyogU01QVEUgMjk2TSAqLworI2RlZmluZQkJVjRMMl9EVl8xMDgwSTYwCQkxMyAvKiBTTVBURSAyOTZNICovCisjZGVmaW5lCQlWNEwyX0RWXzEwODBQMjQJCTE0IC8qIFNNUFRFIDI5Nk0gKi8KKyNkZWZpbmUJCVY0TDJfRFZfMTA4MFAyNQkJMTUgLyogU01QVEUgMjk2TSAqLworI2RlZmluZQkJVjRMMl9EVl8xMDgwUDMwCQkxNiAvKiBTTVBURSAyOTZNICovCisjZGVmaW5lCQlWNEwyX0RWXzEwODBQNTAJCTE3IC8qIEJULjExMjAgKi8KKyNkZWZpbmUJCVY0TDJfRFZfMTA4MFA2MAkJMTggLyogQlQuMTEyMCAqLworCisvKgorICoJRCBWIAlCIFQJVCBJIE0gSSBOIEcgUworICovCisKKy8qIEJULjY1Ni9CVC4xMTIwIHRpbWluZyBkYXRhICovCitzdHJ1Y3QgdjRsMl9idF90aW1pbmdzIHsKKwlfX3UzMgl3aWR0aDsJCS8qIHdpZHRoIGluIHBpeGVscyAqLworCV9fdTMyCWhlaWdodDsJCS8qIGhlaWdodCBpbiBsaW5lcyAqLworCV9fdTMyCWludGVybGFjZWQ7CS8qIEludGVybGFjZWQgb3IgcHJvZ3Jlc3NpdmUgKi8KKwlfX3UzMglwb2xhcml0aWVzOwkvKiBQb3NpdGl2ZSBvciBuZWdhdGl2ZSBwb2xhcml0eSAqLworCV9fdTY0CXBpeGVsY2xvY2s7CS8qIFBpeGVsIGNsb2NrIGluIEhaLiBFeC4gNzQuMjVNSHotPjc0MjUwMDAwICovCisJX191MzIJaGZyb250cG9yY2g7CS8qIEhvcml6cG9udGFsIGZyb250IHBvcmNoIGluIHBpeGVscyAqLworCV9fdTMyCWhzeW5jOwkJLyogSG9yaXpvbnRhbCBTeW5jIGxlbmd0aCBpbiBwaXhlbHMgKi8KKwlfX3UzMgloYmFja3BvcmNoOwkvKiBIb3Jpem9udGFsIGJhY2sgcG9yY2ggaW4gcGl4ZWxzICovCisJX191MzIJdmZyb250cG9yY2g7CS8qIFZlcnRpY2FsIGZyb250IHBvcmNoIGluIHBpeGVscyAqLworCV9fdTMyCXZzeW5jOwkJLyogVmVydGljYWwgU3luYyBsZW5ndGggaW4gbGluZXMgKi8KKwlfX3UzMgl2YmFja3BvcmNoOwkvKiBWZXJ0aWNhbCBiYWNrIHBvcmNoIGluIGxpbmVzICovCisJX191MzIJaWxfdmZyb250cG9yY2g7CS8qIFZlcnRpY2FsIGZyb250IHBvcmNoIGZvciBib3R0b20gZmllbGQgb2YKKwkJCQkgKiBpbnRlcmxhY2VkIGZpZWxkIGZvcm1hdHMKKwkJCQkgKi8KKwlfX3UzMglpbF92c3luYzsJLyogVmVydGljYWwgc3luYyBsZW5ndGggZm9yIGJvdHRvbSBmaWVsZCBvZgorCQkJCSAqIGludGVybGFjZWQgZmllbGQgZm9ybWF0cworCQkJCSAqLworCV9fdTMyCWlsX3ZiYWNrcG9yY2g7CS8qIFZlcnRpY2FsIGJhY2sgcG9yY2ggZm9yIGJvdHRvbSBmaWVsZCBvZgorCQkJCSAqIGludGVybGFjZWQgZmllbGQgZm9ybWF0cworCQkJCSAqLworCV9fdTMyCXJlc2VydmVkWzE2XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBJbnRlcmxhY2VkIG9yIHByb2dyZXNzaXZlIGZvcm1hdCAqLworI2RlZmluZQlWNEwyX0RWX1BST0dSRVNTSVZFCTAKKyNkZWZpbmUJVjRMMl9EVl9JTlRFUkxBQ0VECTEKKworLyogUG9sYXJpdGllcy4gSWYgYml0IGlzIG5vdCBzZXQsIGl0IGlzIGFzc3VtZWQgdG8gYmUgbmVnYXRpdmUgcG9sYXJpdHkgKi8KKyNkZWZpbmUgVjRMMl9EVl9WU1lOQ19QT1NfUE9MCTB4MDAwMDAwMDEKKyNkZWZpbmUgVjRMMl9EVl9IU1lOQ19QT1NfUE9MCTB4MDAwMDAwMDIKKworCisvKiBEViB0aW1pbmdzICovCitzdHJ1Y3QgdjRsMl9kdl90aW1pbmdzIHsKKwlfX3UzMiB0eXBlOworCXVuaW9uIHsKKwkJc3RydWN0IHY0bDJfYnRfdGltaW5ncwlidDsKKwkJX191MzIJcmVzZXJ2ZWRbMzJdOworCX07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVmFsdWVzIGZvciB0aGUgdHlwZSBmaWVsZCAqLworI2RlZmluZSBWNEwyX0RWX0JUXzY1Nl8xMTIwCTAJLyogQlQuNjU2LzExMjAgdGltaW5nIHR5cGUgKi8KKworLyoKKyAqCVYgSSBEIEUgTyAgIEkgTiBQIFUgVCBTCisgKi8KK3N0cnVjdCB2NGwyX2lucHV0IHsKKwlfX3UzMgkgICAgIGluZGV4OwkJLyogIFdoaWNoIGlucHV0ICovCisJX191OAkgICAgIG5hbWVbMzJdOwkJLyogIExhYmVsICovCisJX191MzIJICAgICB0eXBlOwkJLyogIFR5cGUgb2YgaW5wdXQgKi8KKwlfX3UzMgkgICAgIGF1ZGlvc2V0OwkJLyogIEFzc29jaWF0ZWQgYXVkaW9zIChiaXRmaWVsZCkgKi8KKwlfX3UzMiAgICAgICAgdHVuZXI7ICAgICAgICAgICAgIC8qICBBc3NvY2lhdGVkIHR1bmVyICovCisJdjRsMl9zdGRfaWQgIHN0ZDsKKwlfX3UzMgkgICAgIHN0YXR1czsKKwlfX3UzMgkgICAgIGNhcGFiaWxpdGllczsKKwlfX3UzMgkgICAgIHJlc2VydmVkWzNdOworfTsKKworLyogIFZhbHVlcyBmb3IgdGhlICd0eXBlJyBmaWVsZCAqLworI2RlZmluZSBWNEwyX0lOUFVUX1RZUEVfVFVORVIJCTEKKyNkZWZpbmUgVjRMMl9JTlBVVF9UWVBFX0NBTUVSQQkJMgorCisvKiBmaWVsZCAnc3RhdHVzJyAtIGdlbmVyYWwgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9OT19QT1dFUiAgICAweDAwMDAwMDAxICAvKiBBdHRhY2hlZCBkZXZpY2UgaXMgb2ZmICovCisjZGVmaW5lIFY0TDJfSU5fU1RfTk9fU0lHTkFMICAgMHgwMDAwMDAwMgorI2RlZmluZSBWNEwyX0lOX1NUX05PX0NPTE9SICAgIDB4MDAwMDAwMDQKKworLyogZmllbGQgJ3N0YXR1cycgLSBzZW5zb3Igb3JpZW50YXRpb24gKi8KKy8qIElmIHNlbnNvciBpcyBtb3VudGVkIHVwc2lkZSBkb3duIHNldCBib3RoIGJpdHMgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9IRkxJUCAgICAgICAweDAwMDAwMDEwIC8qIEZyYW1lcyBhcmUgZmxpcHBlZCBob3Jpem9udGFsbHkgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9WRkxJUCAgICAgICAweDAwMDAwMDIwIC8qIEZyYW1lcyBhcmUgZmxpcHBlZCB2ZXJ0aWNhbGx5ICovCisKKy8qIGZpZWxkICdzdGF0dXMnIC0gYW5hbG9nICovCisjZGVmaW5lIFY0TDJfSU5fU1RfTk9fSF9MT0NLICAgMHgwMDAwMDEwMCAgLyogTm8gaG9yaXpvbnRhbCBzeW5jIGxvY2sgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9DT0xPUl9LSUxMICAweDAwMDAwMjAwICAvKiBDb2xvciBraWxsZXIgaXMgYWN0aXZlICovCisKKy8qIGZpZWxkICdzdGF0dXMnIC0gZGlnaXRhbCAqLworI2RlZmluZSBWNEwyX0lOX1NUX05PX1NZTkMgICAgIDB4MDAwMTAwMDAgIC8qIE5vIHN5bmNocm9uaXphdGlvbiBsb2NrICovCisjZGVmaW5lIFY0TDJfSU5fU1RfTk9fRVFVICAgICAgMHgwMDAyMDAwMCAgLyogTm8gZXF1YWxpemVyIGxvY2sgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9OT19DQVJSSUVSICAweDAwMDQwMDAwICAvKiBDYXJyaWVyIHJlY292ZXJ5IGZhaWxlZCAqLworCisvKiBmaWVsZCAnc3RhdHVzJyAtIFZDUiBhbmQgc2V0LXRvcCBib3ggKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9NQUNST1ZJU0lPTiAweDAxMDAwMDAwICAvKiBNYWNyb3Zpc2lvbiBkZXRlY3RlZCAqLworI2RlZmluZSBWNEwyX0lOX1NUX05PX0FDQ0VTUyAgIDB4MDIwMDAwMDAgIC8qIENvbmRpdGlvbmFsIGFjY2VzcyBkZW5pZWQgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9WVFIgICAgICAgICAweDA0MDAwMDAwICAvKiBWVFIgdGltZSBjb25zdGFudCAqLworCisvKiBjYXBhYmlsaXRpZXMgZmxhZ3MgKi8KKyNkZWZpbmUgVjRMMl9JTl9DQVBfUFJFU0VUUwkJMHgwMDAwMDAwMSAvKiBTdXBwb3J0cyBTX0RWX1BSRVNFVCAqLworI2RlZmluZSBWNEwyX0lOX0NBUF9DVVNUT01fVElNSU5HUwkweDAwMDAwMDAyIC8qIFN1cHBvcnRzIFNfRFZfVElNSU5HUyAqLworI2RlZmluZSBWNEwyX0lOX0NBUF9TVEQJCQkweDAwMDAwMDA0IC8qIFN1cHBvcnRzIFNfU1REICovCisKKy8qCisgKglWIEkgRCBFIE8gICBPIFUgVCBQIFUgVCBTCisgKi8KK3N0cnVjdCB2NGwyX291dHB1dCB7CisJX191MzIJICAgICBpbmRleDsJCS8qICBXaGljaCBvdXRwdXQgKi8KKwlfX3U4CSAgICAgbmFtZVszMl07CQkvKiAgTGFiZWwgKi8KKwlfX3UzMgkgICAgIHR5cGU7CQkvKiAgVHlwZSBvZiBvdXRwdXQgKi8KKwlfX3UzMgkgICAgIGF1ZGlvc2V0OwkJLyogIEFzc29jaWF0ZWQgYXVkaW9zIChiaXRmaWVsZCkgKi8KKwlfX3UzMgkgICAgIG1vZHVsYXRvcjsgICAgICAgICAvKiAgQXNzb2NpYXRlZCBtb2R1bGF0b3IgKi8KKwl2NGwyX3N0ZF9pZCAgc3RkOworCV9fdTMyCSAgICAgY2FwYWJpbGl0aWVzOworCV9fdTMyCSAgICAgcmVzZXJ2ZWRbM107Cit9OworLyogIFZhbHVlcyBmb3IgdGhlICd0eXBlJyBmaWVsZCAqLworI2RlZmluZSBWNEwyX09VVFBVVF9UWVBFX01PRFVMQVRPUgkJMQorI2RlZmluZSBWNEwyX09VVFBVVF9UWVBFX0FOQUxPRwkJCTIKKyNkZWZpbmUgVjRMMl9PVVRQVVRfVFlQRV9BTkFMT0dWR0FPVkVSTEFZCTMKKworLyogY2FwYWJpbGl0aWVzIGZsYWdzICovCisjZGVmaW5lIFY0TDJfT1VUX0NBUF9QUkVTRVRTCQkweDAwMDAwMDAxIC8qIFN1cHBvcnRzIFNfRFZfUFJFU0VUICovCisjZGVmaW5lIFY0TDJfT1VUX0NBUF9DVVNUT01fVElNSU5HUwkweDAwMDAwMDAyIC8qIFN1cHBvcnRzIFNfRFZfVElNSU5HUyAqLworI2RlZmluZSBWNEwyX09VVF9DQVBfU1RECQkweDAwMDAwMDA0IC8qIFN1cHBvcnRzIFNfU1REICovCisKKy8qCisgKglDIE8gTiBUIFIgTyBMIFMKKyAqLworc3RydWN0IHY0bDJfY29udHJvbCB7CisJX191MzIJCSAgICAgaWQ7CisJX19zMzIJCSAgICAgdmFsdWU7Cit9OworCitzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCB7CisJX191MzIgaWQ7CisJX191MzIgc2l6ZTsKKwlfX3UzMiByZXNlcnZlZDJbMV07CisJdW5pb24geworCQlfX3MzMiB2YWx1ZTsKKwkJX19zNjQgdmFsdWU2NDsKKwkJY2hhciAqc3RyaW5nOworCX07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzIHsKKwlfX3UzMiBjdHJsX2NsYXNzOworCV9fdTMyIGNvdW50OworCV9fdTMyIGVycm9yX2lkeDsKKwlfX3UzMiByZXNlcnZlZFsyXTsKKwlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCAqY29udHJvbHM7Cit9OworCisvKiAgVmFsdWVzIGZvciBjdHJsX2NsYXNzIGZpZWxkICovCisjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19VU0VSIDB4MDA5ODAwMDAJLyogT2xkLXN0eWxlICd1c2VyJyBjb250cm9scyAqLworI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfTVBFRyAweDAwOTkwMDAwCS8qIE1QRUctY29tcHJlc3Npb24gY29udHJvbHMgKi8KKyNkZWZpbmUgVjRMMl9DVFJMX0NMQVNTX0NBTUVSQSAweDAwOWEwMDAwCS8qIENhbWVyYSBjbGFzcyBjb250cm9scyAqLworI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfRk1fVFggMHgwMDliMDAwMAkvKiBGTSBNb2R1bGF0b3IgY29udHJvbCBjbGFzcyAqLworI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfRkxBU0ggMHgwMDljMDAwMAkvKiBDYW1lcmEgZmxhc2ggY29udHJvbHMgKi8KKworI2RlZmluZSBWNEwyX0NUUkxfSURfTUFTSyAgICAgIAkgICgweDBmZmZmZmZmKQorI2RlZmluZSBWNEwyX0NUUkxfSUQyQ0xBU1MoaWQpICAgICgoaWQpICYgMHgwZmZmMDAwMFVMKQorI2RlZmluZSBWNEwyX0NUUkxfRFJJVkVSX1BSSVYoaWQpICgoKGlkKSAmIDB4ZmZmZikgPj0gMHgxMDAwKQorCitlbnVtIHY0bDJfY3RybF90eXBlIHsKKwlWNEwyX0NUUkxfVFlQRV9JTlRFR0VSCSAgICAgPSAxLAorCVY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4JICAgICA9IDIsCisJVjRMMl9DVFJMX1RZUEVfTUVOVQkgICAgID0gMywKKwlWNEwyX0NUUkxfVFlQRV9CVVRUT04JICAgICA9IDQsCisJVjRMMl9DVFJMX1RZUEVfSU5URUdFUjY0ICAgICA9IDUsCisJVjRMMl9DVFJMX1RZUEVfQ1RSTF9DTEFTUyAgICA9IDYsCisJVjRMMl9DVFJMX1RZUEVfU1RSSU5HICAgICAgICA9IDcsCisJVjRMMl9DVFJMX1RZUEVfQklUTUFTSyAgICAgICA9IDgsCit9OworCisvKiAgVXNlZCBpbiB0aGUgVklESU9DX1FVRVJZQ1RSTCBpb2N0bCBmb3IgcXVlcnlpbmcgY29udHJvbHMgKi8KK3N0cnVjdCB2NGwyX3F1ZXJ5Y3RybCB7CisJX191MzIJCSAgICAgaWQ7CisJZW51bSB2NGwyX2N0cmxfdHlwZSAgdHlwZTsKKwlfX3U4CQkgICAgIG5hbWVbMzJdOwkvKiBXaGF0ZXZlciAqLworCV9fczMyCQkgICAgIG1pbmltdW07CS8qIE5vdGUgc2lnbmVkbmVzcyAqLworCV9fczMyCQkgICAgIG1heGltdW07CisJX19zMzIJCSAgICAgc3RlcDsKKwlfX3MzMgkJICAgICBkZWZhdWx0X3ZhbHVlOworCV9fdTMyICAgICAgICAgICAgICAgIGZsYWdzOworCV9fdTMyCQkgICAgIHJlc2VydmVkWzJdOworfTsKKworLyogIFVzZWQgaW4gdGhlIFZJRElPQ19RVUVSWU1FTlUgaW9jdGwgZm9yIHF1ZXJ5aW5nIG1lbnUgaXRlbXMgKi8KK3N0cnVjdCB2NGwyX3F1ZXJ5bWVudSB7CisJX191MzIJCWlkOworCV9fdTMyCQlpbmRleDsKKwlfX3U4CQluYW1lWzMyXTsJLyogV2hhdGV2ZXIgKi8KKwlfX3UzMgkJcmVzZXJ2ZWQ7Cit9OworCisvKiAgQ29udHJvbCBmbGFncyAgKi8KKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQJCTB4MDAwMQorI2RlZmluZSBWNEwyX0NUUkxfRkxBR19HUkFCQkVECQkweDAwMDIKKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfUkVBRF9PTkxZIAkweDAwMDQKKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfVVBEQVRFIAkJMHgwMDA4CisjZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFIAkweDAwMTAKKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfU0xJREVSIAkJMHgwMDIwCisjZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX1dSSVRFX09OTFkgCTB4MDA0MAorI2RlZmluZSBWNEwyX0NUUkxfRkxBR19WT0xBVElMRQkJMHgwMDgwCisKKy8qICBRdWVyeSBmbGFnLCB0byBiZSBPUmVkIHdpdGggdGhlIGNvbnRyb2wgSUQgKi8KKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfTkVYVF9DVFJMCTB4ODAwMDAwMDAKKworLyogIFVzZXItY2xhc3MgY29udHJvbCBJRHMgZGVmaW5lZCBieSBWNEwyICovCisjZGVmaW5lIFY0TDJfQ0lEX01BWF9DVFJMUwkJMTAyNAorI2RlZmluZSBWNEwyX0NJRF9CQVNFCQkJKFY0TDJfQ1RSTF9DTEFTU19VU0VSIHwgMHg5MDApCisjZGVmaW5lIFY0TDJfQ0lEX1VTRVJfQkFTRSAJCVY0TDJfQ0lEX0JBU0UKKy8qICBJRHMgcmVzZXJ2ZWQgZm9yIGRyaXZlciBzcGVjaWZpYyBjb250cm9scyAqLworI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX0JBU0UJCTB4MDgwMDAwMDAKKworI2RlZmluZSBWNEwyX0NJRF9VU0VSX0NMQVNTIAkJKFY0TDJfQ1RSTF9DTEFTU19VU0VSIHwgMSkKKyNkZWZpbmUgVjRMMl9DSURfQlJJR0hUTkVTUwkJKFY0TDJfQ0lEX0JBU0UrMCkKKyNkZWZpbmUgVjRMMl9DSURfQ09OVFJBU1QJCShWNEwyX0NJRF9CQVNFKzEpCisjZGVmaW5lIFY0TDJfQ0lEX1NBVFVSQVRJT04JCShWNEwyX0NJRF9CQVNFKzIpCisjZGVmaW5lIFY0TDJfQ0lEX0hVRQkJCShWNEwyX0NJRF9CQVNFKzMpCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRQkJKFY0TDJfQ0lEX0JBU0UrNSkKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fQkFMQU5DRQkJKFY0TDJfQ0lEX0JBU0UrNikKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fQkFTUwkJKFY0TDJfQ0lEX0JBU0UrNykKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fVFJFQkxFCQkoVjRMMl9DSURfQkFTRSs4KQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19NVVRFCQkoVjRMMl9DSURfQkFTRSs5KQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19MT1VETkVTUwkJKFY0TDJfQ0lEX0JBU0UrMTApCisjZGVmaW5lIFY0TDJfQ0lEX0JMQUNLX0xFVkVMCQkoVjRMMl9DSURfQkFTRSsxMSkgLyogRGVwcmVjYXRlZCAqLworI2RlZmluZSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0UJKFY0TDJfQ0lEX0JBU0UrMTIpCisjZGVmaW5lIFY0TDJfQ0lEX0RPX1dISVRFX0JBTEFOQ0UJKFY0TDJfQ0lEX0JBU0UrMTMpCisjZGVmaW5lIFY0TDJfQ0lEX1JFRF9CQUxBTkNFCQkoVjRMMl9DSURfQkFTRSsxNCkKKyNkZWZpbmUgVjRMMl9DSURfQkxVRV9CQUxBTkNFCQkoVjRMMl9DSURfQkFTRSsxNSkKKyNkZWZpbmUgVjRMMl9DSURfR0FNTUEJCQkoVjRMMl9DSURfQkFTRSsxNikKKyNkZWZpbmUgVjRMMl9DSURfV0hJVEVORVNTCQkoVjRMMl9DSURfR0FNTUEpIC8qIERlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgVjRMMl9DSURfRVhQT1NVUkUJCShWNEwyX0NJRF9CQVNFKzE3KQorI2RlZmluZSBWNEwyX0NJRF9BVVRPR0FJTgkJKFY0TDJfQ0lEX0JBU0UrMTgpCisjZGVmaW5lIFY0TDJfQ0lEX0dBSU4JCQkoVjRMMl9DSURfQkFTRSsxOSkKKyNkZWZpbmUgVjRMMl9DSURfSEZMSVAJCQkoVjRMMl9DSURfQkFTRSsyMCkKKyNkZWZpbmUgVjRMMl9DSURfVkZMSVAJCQkoVjRMMl9DSURfQkFTRSsyMSkKKworLyogRGVwcmVjYXRlZDsgdXNlIFY0TDJfQ0lEX1BBTl9SRVNFVCBhbmQgVjRMMl9DSURfVElMVF9SRVNFVCAqLworI2RlZmluZSBWNEwyX0NJRF9IQ0VOVEVSCQkoVjRMMl9DSURfQkFTRSsyMikKKyNkZWZpbmUgVjRMMl9DSURfVkNFTlRFUgkJKFY0TDJfQ0lEX0JBU0UrMjMpCisKKyNkZWZpbmUgVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1kJKFY0TDJfQ0lEX0JBU0UrMjQpCitlbnVtIHY0bDJfcG93ZXJfbGluZV9mcmVxdWVuY3kgeworCVY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZX0RJU0FCTEVECT0gMCwKKwlWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV81MEhaCT0gMSwKKwlWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV82MEhaCT0gMiwKKwlWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV9BVVRPCT0gMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX0hVRV9BVVRPCQkJKFY0TDJfQ0lEX0JBU0UrMjUpCisjZGVmaW5lIFY0TDJfQ0lEX1dISVRFX0JBTEFOQ0VfVEVNUEVSQVRVUkUJKFY0TDJfQ0lEX0JBU0UrMjYpCisjZGVmaW5lIFY0TDJfQ0lEX1NIQVJQTkVTUwkJCShWNEwyX0NJRF9CQVNFKzI3KQorI2RlZmluZSBWNEwyX0NJRF9CQUNLTElHSFRfQ09NUEVOU0FUSU9OIAkoVjRMMl9DSURfQkFTRSsyOCkKKyNkZWZpbmUgVjRMMl9DSURfQ0hST01BX0FHQyAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzI5KQorI2RlZmluZSBWNEwyX0NJRF9DT0xPUl9LSUxMRVIgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMzApCisjZGVmaW5lIFY0TDJfQ0lEX0NPTE9SRlgJCQkoVjRMMl9DSURfQkFTRSszMSkKK2VudW0gdjRsMl9jb2xvcmZ4IHsKKwlWNEwyX0NPTE9SRlhfTk9ORQk9IDAsCisJVjRMMl9DT0xPUkZYX0JXCQk9IDEsCisJVjRMMl9DT0xPUkZYX1NFUElBCT0gMiwKKwlWNEwyX0NPTE9SRlhfTkVHQVRJVkUgPSAzLAorCVY0TDJfQ09MT1JGWF9FTUJPU1MgPSA0LAorCVY0TDJfQ09MT1JGWF9TS0VUQ0ggPSA1LAorCVY0TDJfQ09MT1JGWF9TS1lfQkxVRSA9IDYsCisJVjRMMl9DT0xPUkZYX0dSQVNTX0dSRUVOID0gNywKKwlWNEwyX0NPTE9SRlhfU0tJTl9XSElURU4gPSA4LAorCVY0TDJfQ09MT1JGWF9WSVZJRCA9IDksCit9OworI2RlZmluZSBWNEwyX0NJRF9BVVRPQlJJR0hUTkVTUwkJCShWNEwyX0NJRF9CQVNFKzMyKQorI2RlZmluZSBWNEwyX0NJRF9CQU5EX1NUT1BfRklMVEVSCQkoVjRMMl9DSURfQkFTRSszMykKKworI2RlZmluZSBWNEwyX0NJRF9ST1RBVEUJCQkJKFY0TDJfQ0lEX0JBU0UrMzQpCisjZGVmaW5lIFY0TDJfQ0lEX0JHX0NPTE9SCQkJKFY0TDJfQ0lEX0JBU0UrMzUpCisKKyNkZWZpbmUgVjRMMl9DSURfQ0hST01BX0dBSU4gICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzM2KQorCisjZGVmaW5lIFY0TDJfQ0lEX0lMTFVNSU5BVE9SU18xCQkJKFY0TDJfQ0lEX0JBU0UrMzcpCisjZGVmaW5lIFY0TDJfQ0lEX0lMTFVNSU5BVE9SU18yCQkJKFY0TDJfQ0lEX0JBU0UrMzgpCisKKyNkZWZpbmUgVjRMMl9DSURfTUlOX0JVRkZFUlNfRk9SX0NBUFRVUkUJKFY0TDJfQ0lEX0JBU0UrMzkpCisjZGVmaW5lIFY0TDJfQ0lEX01JTl9CVUZGRVJTX0ZPUl9PVVRQVVQJCShWNEwyX0NJRF9CQVNFKzQwKQorCisvKiBsYXN0IENJRCArIDEgKi8KKyNkZWZpbmUgVjRMMl9DSURfTEFTVFAxICAgICAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzQxKQorCisvKiBNaW5pbXVtIG51bWJlciBvZiBidWZmZXIgbmVlZGUgYnkgdGhlIGRldmljZSAqLworCisvKiAgTVBFRy1jbGFzcyBjb250cm9sIElEcyBkZWZpbmVkIGJ5IFY0TDIgKi8KKyNkZWZpbmUgVjRMMl9DSURfTVBFR19CQVNFIAkJCShWNEwyX0NUUkxfQ0xBU1NfTVBFRyB8IDB4OTAwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NMQVNTIAkJCShWNEwyX0NUUkxfQ0xBU1NfTVBFRyB8IDEpCisKKy8qICBNUEVHIHN0cmVhbXMsIHNwZWNpZmljIHRvIG11bHRpcGxleGVkIHN0cmVhbXMgKi8KKyNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMCkKK2VudW0gdjRsMl9tcGVnX3N0cmVhbV90eXBlIHsKKwlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfUFMgICA9IDAsIC8qIE1QRUctMiBwcm9ncmFtIHN0cmVhbSAqLworCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9UUyAgID0gMSwgLyogTVBFRy0yIHRyYW5zcG9ydCBzdHJlYW0gKi8KKwlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzFfU1MgICA9IDIsIC8qIE1QRUctMSBzeXN0ZW0gc3RyZWFtICovCisJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX0RWRCAgPSAzLCAvKiBNUEVHLTIgRFZELWNvbXBhdGlibGUgc3RyZWFtICovCisJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcxX1ZDRCAgPSA0LCAvKiBNUEVHLTEgVkNELWNvbXBhdGlibGUgc3RyZWFtICovCisJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX1NWQ0QgPSA1LCAvKiBNUEVHLTIgU1ZDRC1jb21wYXRpYmxlIHN0cmVhbSAqLworfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1BNVCAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX0FVRElPIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfVklERU8gCQkoVjRMMl9DSURfTVBFR19CQVNFKzMpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9QQ1IgCQkoVjRMMl9DSURfTVBFR19CQVNFKzQpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BFU19JRF9BVURJTyAJKFY0TDJfQ0lEX01QRUdfQkFTRSs1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QRVNfSURfVklERU8gCShWNEwyX0NJRF9NUEVHX0JBU0UrNikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fVkJJX0ZNVCAJCShWNEwyX0NJRF9NUEVHX0JBU0UrNykKK2VudW0gdjRsMl9tcGVnX3N0cmVhbV92YmlfZm10IHsKKwlWNEwyX01QRUdfU1RSRUFNX1ZCSV9GTVRfTk9ORSA9IDAsICAvKiBObyBWQkkgaW4gdGhlIE1QRUcgc3RyZWFtICovCisJVjRMMl9NUEVHX1NUUkVBTV9WQklfRk1UX0lWVFYgPSAxLCAgLyogVkJJIGluIHByaXZhdGUgcGFja2V0cywgSVZUViBmb3JtYXQgKi8KK307CisKKy8qICBNUEVHIGF1ZGlvIGNvbnRyb2xzIHNwZWNpZmljIHRvIG11bHRpcGxleGVkIHN0cmVhbXMgICovCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUSAJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDApCitlbnVtIHY0bDJfbXBlZ19hdWRpb19zYW1wbGluZ19mcmVxIHsKKwlWNEwyX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUV80NDEwMCA9IDAsCisJVjRMMl9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVFfNDgwMDAgPSAxLAorCVY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzMyMDAwID0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fRU5DT0RJTkcgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwMSkKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX2VuY29kaW5nIHsKKwlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMSA9IDAsCisJVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0xBWUVSXzIgPSAxLAorCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8zID0gMiwKKwlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfQUFDICAgICA9IDMsCisJVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0FDMyAgICAgPSA0LAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19MMV9CSVRSQVRFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDIpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19sMV9iaXRyYXRlIHsKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8zMksgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV82NEsgID0gMSwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV85NksgID0gMiwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8xMjhLID0gMywKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8xNjBLID0gNCwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8xOTJLID0gNSwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8yMjRLID0gNiwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8yNTZLID0gNywKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8yODhLID0gOCwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8zMjBLID0gOSwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8zNTJLID0gMTAsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMzg0SyA9IDExLAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzQxNksgPSAxMiwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV80NDhLID0gMTMsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wyX0JJVFJBVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwMykKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX2wyX2JpdHJhdGUgeworCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzMySyAgPSAwLAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzQ4SyAgPSAxLAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzU2SyAgPSAyLAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzY0SyAgPSAzLAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzgwSyAgPSA0LAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzk2SyAgPSA1LAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzExMksgPSA2LAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzEyOEsgPSA3LAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzE2MEsgPSA4LAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzE5MksgPSA5LAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzIyNEsgPSAxMCwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yNTZLID0gMTEsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzIwSyA9IDEyLAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzM4NEsgPSAxMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fTDNfQklUUkFURSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTA0KQorZW51bSB2NGwyX21wZWdfYXVkaW9fbDNfYml0cmF0ZSB7CisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMzJLICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfNDBLICA9IDEsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfNDhLICA9IDIsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfNTZLICA9IDMsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfNjRLICA9IDQsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfODBLICA9IDUsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfOTZLICA9IDYsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMTEySyA9IDcsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMTI4SyA9IDgsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMTYwSyA9IDksCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMTkySyA9IDEwLAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzIyNEsgPSAxMSwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8yNTZLID0gMTIsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMzIwSyA9IDEzLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19NT0RFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDUpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19tb2RlIHsKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9TVEVSRU8gICAgICAgPSAwLAorCVY0TDJfTVBFR19BVURJT19NT0RFX0pPSU5UX1NURVJFTyA9IDEsCisJVjRMMl9NUEVHX0FVRElPX01PREVfRFVBTCAgICAgICAgID0gMiwKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9NT05PICAgICAgICAgPSAzLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTiAJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDYpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19tb2RlX2V4dGVuc2lvbiB7CisJVjRMMl9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OX0JPVU5EXzQgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT05fQk9VTkRfOCAgPSAxLAorCVY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF8xMiA9IDIsCisJVjRMMl9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OX0JPVU5EXzE2ID0gMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVMgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwNykKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX2VtcGhhc2lzIHsKKwlWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfTk9ORSAgICAgICAgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfNTBfRElWXzE1X3VTID0gMSwKKwlWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfQ0NJVFRfSjE3ICAgID0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fQ1JDIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDgpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19jcmMgeworCVY0TDJfTVBFR19BVURJT19DUkNfTk9ORSAgPSAwLAorCVY0TDJfTVBFR19BVURJT19DUkNfQ1JDMTYgPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19NVVRFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDkpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fQUFDX0JJVFJBVEUJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTEwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0FDM19CSVRSQVRFCQkoVjRMMl9DSURfTVBFR19CQVNFKzExMSkKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX2FjM19iaXRyYXRlIHsKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMzJLICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzQwSyAgPSAxLAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV80OEsgID0gMiwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNTZLICA9IDMsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzY0SyAgPSA0LAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV84MEsgID0gNSwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfOTZLICA9IDYsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzExMksgPSA3LAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8xMjhLID0gOCwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMTYwSyA9IDksCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzE5MksgPSAxMCwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMjI0SyA9IDExLAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8yNTZLID0gMTIsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzMyMEsgPSAxMywKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMzg0SyA9IDE0LAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV80NDhLID0gMTUsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzUxMksgPSAxNiwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNTc2SyA9IDE3LAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV82NDBLID0gMTgsCit9OworCisvKiAgTVBFRyB2aWRlbyBjb250cm9scyBzcGVjaWZpYyB0byBtdWx0aXBsZXhlZCBzdHJlYW1zICovCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkcgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwMCkKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2VuY29kaW5nIHsKKwlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18xICAgICA9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMiAgICAgPSAxLAorCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzRfQVZDID0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNUIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDEpCitlbnVtIHY0bDJfbXBlZ192aWRlb19hc3BlY3QgeworCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMXgxICAgICA9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF80eDMgICAgID0gMSwKKwlWNEwyX01QRUdfVklERU9fQVNQRUNUXzE2eDkgICAgPSAyLAorCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMjIxeDEwMCA9IDMsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JfRlJBTUVTIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDIpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX1NJWkUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwMykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19HT1BfQ0xPU1VSRSAJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDQpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fUFVMTERPV04gCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwNSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREUgCShWNEwyX0NJRF9NUEVHX0JBU0UrMjA2KQorZW51bSB2NGwyX21wZWdfdmlkZW9fYml0cmF0ZV9tb2RlIHsKKwlWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX1ZCUiA9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9DQlIgPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDcpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9QRUFLIAkoVjRMMl9DSURfTVBFR19CQVNFKzIwOCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19URU1QT1JBTF9ERUNJTUFUSU9OIChWNEwyX0NJRF9NUEVHX0JBU0UrMjA5KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIxMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NVVRFX1lVViAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjExKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0RFQ09ERVJfU0xJQ0VfSU5URVJGQUNFCQkoVjRMMl9DSURfTVBFR19CQVNFKzIxMikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19ERUNPREVSX01QRUc0X0RFQkxPQ0tfRklMVEVSCShWNEwyX0NJRF9NUEVHX0JBU0UrMjEzKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0NZQ0xJQ19JTlRSQV9SRUZSRVNIX01CCQkoVjRMMl9DSURfTVBFR19CQVNFKzIxNCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19GUkFNRV9SQ19FTkFCTEUJCQkoVjRMMl9DSURfTVBFR19CQVNFKzIxNSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IRUFERVJfTU9ERQkJCQkoVjRMMl9DSURfTVBFR19CQVNFKzIxNikKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2hlYWRlcl9tb2RlIHsKKwlWNEwyX01QRUdfVklERU9fSEVBREVSX01PREVfU0VQQVJBVEUJCQk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0hFQURFUl9NT0RFX0pPSU5FRF9XSVRIXzFTVF9GUkFNRQk9IDEsCisKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTUFYX1JFRl9QSUMJCQkoVjRMMl9DSURfTVBFR19CQVNFKzIxNykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NQl9SQ19FTkFCTEUJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjE4KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01BWF9CWVRFUwkoVjRMMl9DSURfTVBFR19CQVNFKzIxOSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NQVhfTUIJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjIwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01PREUJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjIxKQorZW51bSB2NGwyX21wZWdfdmlkZW9fbXVsdGlfc2xpY2VfbW9kZSB7CisJVjRMMl9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01PREVfU0lOR0xFCQk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX01VTFRJX1NJQ0VfTU9ERV9NQVhfTUIJCT0gMSwKKwlWNEwyX01QRUdfVklERU9fTVVMVElfU0lDRV9NT0RFX01BWF9CWVRFUwk9IDIsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZCVl9TSVpFCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMjIpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19JX0ZSQU1FX1FQCQkoVjRMMl9DSURfTVBFR19CQVNFKzMwMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjYzX1BfRlJBTUVfUVAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzAxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjNfQl9GUkFNRV9RUAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszMDIpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19NSU5fUVAJCQkoVjRMMl9DSURfTVBFR19CQVNFKzMwMykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjYzX01BWF9RUAkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzA0KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfSV9GUkFNRV9RUAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9QX0ZSQU1FX1FQCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1MSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0JfRlJBTUVfUVAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzUyKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTUlOX1FQCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTMpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9NQVhfUVAJCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1NCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0XzhYOF9UUkFOU0ZPUk0JCShWNEwyX0NJRF9NUEVHX0JBU0UrMzU1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfQ1BCX1NJWkUJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzU2KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfRU5UUk9QWV9NT0RFCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1NykKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2gyNjRfZW50cm9weV9tb2RlIHsKKwlWNEwyX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREVfQ0FWTEMJPSAwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0VOVFJPUFlfTU9ERV9DQUJBQwk9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfSV9QRVJJT0QJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzU4KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTEVWRUwJCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1OSkKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2gyNjRfbGV2ZWwgeworCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMAk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMUIJPSAxLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMQk9IDIsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8yCT0gMywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzMJPSA0LAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzJfMAk9IDUsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMl8xCT0gNiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8yXzIJPSA3LAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzNfMAk9IDgsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfM18xCT0gOSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8zXzIJPSAxMCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzAJPSAxMSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzEJPSAxMiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzIJPSAxMywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF81XzAJPSAxNCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF81XzEJPSAxNSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9BTFBIQQkoVjRMMl9DSURfTVBFR19CQVNFKzM2MCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX0JFVEEJKFY0TDJfQ0lEX01QRUdfQkFTRSszNjEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFCShWNEwyX0NJRF9NUEVHX0JBU0UrMzYyKQorZW51bSB2NGwyX21wZWdfdmlkZW9faDI2NF9sb29wX2ZpbHRlcl9tb2RlIHsKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFX0VOQUJMRUQJCQkJPSAwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX01PREVfRElTQUJMRUQJCQkJPSAxLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX01PREVfRElTQUJMRURfQVRfU0xJQ0VfQk9VTkRBUlkJPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1BST0ZJTEUJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzYzKQorZW51bSB2NGwyX21wZWdfdmlkZW9faDI2NF9wcm9maWxlIHsKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0JBU0VMSU5FCQkJPSAwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQ09OU1RSQUlORURfQkFTRUxJTkUJPSAxLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfTUFJTgkJCT0gMiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0VYVEVOREVECQkJPSAzLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSAkJCT0gNCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfMTAJCQk9IDUsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzQyMgkJCT0gNiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfNDQ0X1BSRURJQ1RJVkUJPSA3LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF8xMF9JTlRSQQkJPSA4LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF80MjJfSU5UUkEJCT0gOSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfNDQ0X0lOVFJBCQk9IDEwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQ0FWTENfNDQ0X0lOVFJBCQk9IDExLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU0NBTEFCTEVfQkFTRUxJTkUJCT0gMTIsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9TQ0FMQUJMRV9ISUdICQk9IDEzLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU0NBTEFCTEVfSElHSF9JTlRSQQk9IDE0LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU1RFUkVPX0hJR0gJCT0gMTUsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9NVUxUSVZJRVdfSElHSAkJPSAxNiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfRVhUX1NBUl9IRUlHSFQJKFY0TDJfQ0lEX01QRUdfQkFTRSszNjQpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfRVhUX1NBUl9XSURUSAkoVjRMMl9DSURfTVBFR19CQVNFKzM2NSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfRU5BQkxFCQkoVjRMMl9DSURfTVBFR19CQVNFKzM2NikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDCQkoVjRMMl9DSURfTVBFR19CQVNFKzM2NykKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2gyNjRfdnVpX3Nhcl9pZGMgeworCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDX1VOU1BFQ0lGSUVECT0gMCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18xeDEJCT0gMSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18xMngxMQkJPSAyLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzEweDExCQk9IDMsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTZ4MTEJCT0gNCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ180MHgzMwkJPSA1LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzI0eDExCQk9IDYsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMjB4MTEJCT0gNywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18zMngxMQkJPSA4LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzgweDMzCQk9IDksCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTh4MTEJCT0gMTAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTV4MTEJCT0gMTEsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfNjR4MzMJCT0gMTIsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTYweDk5CQk9IDEzLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzR4MwkJPSAxNCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18zeDIJCT0gMTUsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMngxCQk9IDE2LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDX0VYVEVOREVECT0gMTcsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X0lfRlJBTUVfUVAJKFY0TDJfQ0lEX01QRUdfQkFTRSs0MDApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfUF9GUkFNRV9RUAkoVjRMMl9DSURfTVBFR19CQVNFKzQwMSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9CX0ZSQU1FX1FQCShWNEwyX0NJRF9NUEVHX0JBU0UrNDAyKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X01JTl9RUAkoVjRMMl9DSURfTVBFR19CQVNFKzQwMykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9NQVhfUVAJKFY0TDJfQ0lEX01QRUdfQkFTRSs0MDQpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfTEVWRUwJCShWNEwyX0NJRF9NUEVHX0JBU0UrNDA1KQorZW51bSB2NGwyX21wZWdfdmlkZW9fbXBlZzRfbGV2ZWwgeworCVY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8wCT0gMCwKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfMEIJPSAxLAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8xCT0gMiwKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfMgk9IDMsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzMJPSA0LAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8zQgk9IDUsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzQJPSA2LAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF81CT0gNywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfUFJPRklMRQkoVjRMMl9DSURfTVBFR19CQVNFKzQwNikKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX21wZWc0X3Byb2ZpbGUgeworCVY0TDJfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFX1NJTVBMRQkJCQk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfQURWQU5DRURfU0lNUExFCQkJPSAxLAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFX0NPUkUJCQkJPSAyLAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFX1NJTVBMRV9TQ0FMQUJMRQkJCT0gMywKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfUFJPRklMRV9BRFZBTkNFRF9DT0RJTkdfRUZGSUNJRU5DWQk9IDQsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1FQRUwJCShWNEwyX0NJRF9NUEVHX0JBU0UrNDA3KQorCisvKiAgTVBFRy1jbGFzcyBjb250cm9sIElEcyBzcGVjaWZpYyB0byB0aGUgQ1gyMzQxeCBkcml2ZXIgYXMgZGVmaW5lZCBieSBWNEwyICovCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFIAkJCQkoVjRMMl9DVFJMX0NMQVNTX01QRUcgfCAweDEwMDApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFIAkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrMCkKK2VudW0gdjRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fc3BhdGlhbF9maWx0ZXJfbW9kZSB7CisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERV9NQU5VQUwgPSAwLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSX01PREVfQVVUTyAgID0gMSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUiAJCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFIAkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrMikKK2VudW0gdjRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fbHVtYV9zcGF0aWFsX2ZpbHRlcl90eXBlIHsKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEVfT0ZGICAgICAgICAgICAgICAgICAgPSAwLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRV8xRF9IT1IgICAgICAgICAgICAgICA9IDEsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzFEX1ZFUlQgICAgICAgICAgICAgID0gMiwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEVfMkRfSFZfU0VQQVJBQkxFICAgICAgPSAzLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRV8yRF9TWU1fTk9OX1NFUEFSQUJMRSA9IDQsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX1NQQVRJQUxfRklMVEVSX1RZUEUgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSszKQorZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb19jaHJvbWFfc3BhdGlhbF9maWx0ZXJfdHlwZSB7CisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX1NQQVRJQUxfRklMVEVSX1RZUEVfT0ZGICAgID0gMCwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRV8xRF9IT1IgPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUl9NT0RFIAkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrNCkKK2VudW0gdjRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fdGVtcG9yYWxfZmlsdGVyX21vZGUgeworCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUl9NT0RFX01BTlVBTCA9IDAsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREVfQVVUTyAgID0gMSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVIgCQkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrNSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRSAJCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs2KQorZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb19tZWRpYW5fZmlsdGVyX3R5cGUgeworCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9PRkYgICAgICA9IDAsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX0hPUiAgICAgID0gMSwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfVkVSVCAgICAgPSAyLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9IT1JfVkVSVCA9IDMsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX0RJQUcgICAgID0gNCwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX01FRElBTl9GSUxURVJfQk9UVE9NIAkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrNykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfTUVESUFOX0ZJTFRFUl9UT1AgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs4KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX01FRElBTl9GSUxURVJfQk9UVE9NCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs5KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX01FRElBTl9GSUxURVJfVE9QIAkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrMTApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9TVFJFQU1fSU5TRVJUX05BVl9QQUNLRVRTIAkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrMTEpCisKKy8qICBNUEVHLWNsYXNzIGNvbnRyb2wgSURzIHNwZWNpZmljIHRvIHRoZSBTYW1zdW5nIE1GQyA1LjEgZHJpdmVyIGFzIGRlZmluZWQgYnkgVjRMMiAqLworI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UJCQkJKFY0TDJfQ1RSTF9DTEFTU19NUEVHIHwgMHgxMTAwKQorCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fREVDT0RFUl9IMjY0X0RJU1BMQVlfREVMQVkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19ERUNPREVSX0gyNjRfRElTUExBWV9ERUxBWV9FTkFCTEUJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSsxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0ZSQU1FX1NLSVBfTU9ERQkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrMikKK2VudW0gdjRsMl9tcGVnX21mYzUxX3ZpZGVvX2ZyYW1lX3NraXBfbW9kZSB7CisJVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZSQU1FX1NLSVBfTU9ERV9ESVNBQkxFRAkJPSAwLAorCVY0TDJfTVBFR19NRkM1MV9WSURFT19GUkFNRV9TS0lQX01PREVfTEVWRUxfTElNSVQJPSAxLAorCVY0TDJfTVBFR19NRkM1MV9WSURFT19GUkFNRV9TS0lQX01PREVfQlVGX0xJTUlUCQk9IDIsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0ZPUkNFX0ZSQU1FX1RZUEUJCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzMpCitlbnVtIHY0bDJfbXBlZ19tZmM1MV92aWRlb19mb3JjZV9mcmFtZV90eXBlIHsKKwlWNEwyX01QRUdfTUZDNTFfVklERU9fRk9SQ0VfRlJBTUVfVFlQRV9ESVNBQkxFRAkJPSAwLAorCVY0TDJfTVBFR19NRkM1MV9WSURFT19GT1JDRV9GUkFNRV9UWVBFX0lfRlJBTUUJCT0gMSwKKwlWNEwyX01QRUdfTUZDNTFfVklERU9fRk9SQ0VfRlJBTUVfVFlQRV9OT1RfQ09ERUQJPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19QQURESU5HCQkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrNCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19QQURESU5HX1lVVgkJCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzUpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fUkNfRklYRURfVEFSR0VUX0JJVAkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrNikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19SQ19SRUFDVElPTl9DT0VGRgkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrNykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X0FEQVBUSVZFX1JDX0FDVElWSVRZCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzUwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfQURBUFRJVkVfUkNfREFSSwkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrNTEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fSDI2NF9BREFQVElWRV9SQ19TTU9PVEgJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrNTIpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fSDI2NF9BREFQVElWRV9SQ19TVEFUSUMJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrNTMpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fSDI2NF9OVU1fUkVGX1BJQ19GT1JfUAkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs1NCkKKworLyogIENhbWVyYSBjbGFzcyBjb250cm9sIElEcyAqLworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSAJKFY0TDJfQ1RSTF9DTEFTU19DQU1FUkEgfCAweDkwMCkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0NMQVNTIAkJKFY0TDJfQ1RSTF9DTEFTU19DQU1FUkEgfCAxKQorCisjZGVmaW5lIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE8JCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMSkKK2VudW0gIHY0bDJfZXhwb3N1cmVfYXV0b190eXBlIHsKKwlWNEwyX0VYUE9TVVJFX0FVVE8gPSAwLAorCVY0TDJfRVhQT1NVUkVfTUFOVUFMID0gMSwKKwlWNEwyX0VYUE9TVVJFX1NIVVRURVJfUFJJT1JJVFkgPSAyLAorCVY0TDJfRVhQT1NVUkVfQVBFUlRVUkVfUFJJT1JJVFkgPSAzCit9OworI2RlZmluZSBWNEwyX0NJRF9FWFBPU1VSRV9BQlNPTFVURQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzIpCisjZGVmaW5lIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE9fUFJJT1JJVFkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSszKQorCisjZGVmaW5lIFY0TDJfQ0lEX1BBTl9SRUxBVElWRQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSs0KQorI2RlZmluZSBWNEwyX0NJRF9USUxUX1JFTEFUSVZFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzUpCisjZGVmaW5lIFY0TDJfQ0lEX1BBTl9SRVNFVAkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSs2KQorI2RlZmluZSBWNEwyX0NJRF9USUxUX1JFU0VUCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzcpCisKKyNkZWZpbmUgVjRMMl9DSURfUEFOX0FCU09MVVRFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzgpCisjZGVmaW5lIFY0TDJfQ0lEX1RJTFRfQUJTT0xVVEUJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrOSkKKworI2RlZmluZSBWNEwyX0NJRF9GT0NVU19BQlNPTFVURQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxMCkKKyNkZWZpbmUgVjRMMl9DSURfRk9DVVNfUkVMQVRJVkUJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTEpCisjZGVmaW5lIFY0TDJfQ0lEX0ZPQ1VTX0FVVE8JCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTIpCisKKyNkZWZpbmUgVjRMMl9DSURfWk9PTV9BQlNPTFVURQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxMykKKyNkZWZpbmUgVjRMMl9DSURfWk9PTV9SRUxBVElWRQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxNCkKKyNkZWZpbmUgVjRMMl9DSURfWk9PTV9DT05USU5VT1VTCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTUpCisKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFDWQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxNikKKworI2RlZmluZSBWNEwyX0NJRF9JUklTX0FCU09MVVRFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzE3KQorI2RlZmluZSBWNEwyX0NJRF9JUklTX1JFTEFUSVZFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzE4KQorCisvKiBGTSBNb2R1bGF0b3IgY2xhc3MgY29udHJvbCBJRHMgKi8KKyNkZWZpbmUgVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRQkJKFY0TDJfQ1RSTF9DTEFTU19GTV9UWCB8IDB4OTAwKQorI2RlZmluZSBWNEwyX0NJRF9GTV9UWF9DTEFTUwkJCShWNEwyX0NUUkxfQ0xBU1NfRk1fVFggfCAxKQorCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19UWF9ERVZJQVRJT04JCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgMSkKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX1BJCQkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAyKQorI2RlZmluZSBWNEwyX0NJRF9SRFNfVFhfUFRZCQkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAzKQorI2RlZmluZSBWNEwyX0NJRF9SRFNfVFhfUFNfTkFNRQkJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgNSkKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX1JBRElPX1RFWFQJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgNikKKworI2RlZmluZSBWNEwyX0NJRF9BVURJT19MSU1JVEVSX0VOQUJMRUQJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgNjQpCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0xJTUlURVJfUkVMRUFTRV9USU1FCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgNjUpCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0xJTUlURVJfREVWSUFUSU9OCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgNjYpCisKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fQ09NUFJFU1NJT05fRU5BQkxFRAkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDgwKQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19DT01QUkVTU0lPTl9HQUlOCQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDgxKQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19DT01QUkVTU0lPTl9USFJFU0hPTEQJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA4MikKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fQ09NUFJFU1NJT05fQVRUQUNLX1RJTUUJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA4MykKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fQ09NUFJFU1NJT05fUkVMRUFTRV9USU1FCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgODQpCisKKyNkZWZpbmUgVjRMMl9DSURfUElMT1RfVE9ORV9FTkFCTEVECQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDk2KQorI2RlZmluZSBWNEwyX0NJRF9QSUxPVF9UT05FX0RFVklBVElPTgkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA5NykKKyNkZWZpbmUgVjRMMl9DSURfUElMT1RfVE9ORV9GUkVRVUVOQ1kJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgOTgpCisKKyNkZWZpbmUgVjRMMl9DSURfVFVORV9QUkVFTVBIQVNJUwkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAxMTIpCitlbnVtIHY0bDJfcHJlZW1waGFzaXMgeworCVY0TDJfUFJFRU1QSEFTSVNfRElTQUJMRUQJPSAwLAorCVY0TDJfUFJFRU1QSEFTSVNfNTBfdVMJCT0gMSwKKwlWNEwyX1BSRUVNUEhBU0lTXzc1X3VTCQk9IDIsCit9OworI2RlZmluZSBWNEwyX0NJRF9UVU5FX1BPV0VSX0xFVkVMCQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDExMykKKyNkZWZpbmUgVjRMMl9DSURfVFVORV9BTlRFTk5BX0NBUEFDSVRPUgkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAxMTQpCisKKy8qIEZsYXNoIGFuZCBwcml2YWN5IChpbmRpY2F0b3IpIGxpZ2h0IGNvbnRyb2xzICovCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UJCShWNEwyX0NUUkxfQ0xBU1NfRkxBU0ggfCAweDkwMCkKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfQ0xBU1MJCQkoVjRMMl9DVFJMX0NMQVNTX0ZMQVNIIHwgMSkKKworI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9MRURfTU9ERQkJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgMSkKK2VudW0gdjRsMl9mbGFzaF9sZWRfbW9kZSB7CisJVjRMMl9GTEFTSF9MRURfTU9ERV9OT05FLAorCVY0TDJfRkxBU0hfTEVEX01PREVfRkxBU0gsCisJVjRMMl9GTEFTSF9MRURfTU9ERV9UT1JDSCwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfU1RST0JFX1NPVVJDRQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyAyKQorZW51bSB2NGwyX2ZsYXNoX3N0cm9iZV9zb3VyY2UgeworCVY0TDJfRkxBU0hfU1RST0JFX1NPVVJDRV9TT0ZUV0FSRSwKKwlWNEwyX0ZMQVNIX1NUUk9CRV9TT1VSQ0VfRVhURVJOQUwsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX1NUUk9CRQkJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgMykKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfU1RST0JFX1NUT1AJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgNCkKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfU1RST0JFX1NUQVRVUwkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyA1KQorCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX1RJTUVPVVQJCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDYpCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX0lOVEVOU0lUWQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyA3KQorI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9UT1JDSF9JTlRFTlNJVFkJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgOCkKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfSU5ESUNBVE9SX0lOVEVOU0lUWQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDkpCisKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfRkFVTFQJCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDEwKQorI2RlZmluZSBWNEwyX0ZMQVNIX0ZBVUxUX09WRVJfVk9MVEFHRQkJKDEgPDwgMCkKKyNkZWZpbmUgVjRMMl9GTEFTSF9GQVVMVF9USU1FT1VUCQkoMSA8PCAxKQorI2RlZmluZSBWNEwyX0ZMQVNIX0ZBVUxUX09WRVJfVEVNUEVSQVRVUkUJKDEgPDwgMikKKyNkZWZpbmUgVjRMMl9GTEFTSF9GQVVMVF9TSE9SVF9DSVJDVUlUCQkoMSA8PCAzKQorCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX0NIQVJHRQkJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgMTEpCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX1JFQURZCQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyAxMikKKworLyoKKyAqCVQgVSBOIEkgTiBHCisgKi8KK3N0cnVjdCB2NGwyX3R1bmVyIHsKKwlfX3UzMiAgICAgICAgICAgICAgICAgICBpbmRleDsKKwlfX3U4CQkJbmFtZVszMl07CisJZW51bSB2NGwyX3R1bmVyX3R5cGUgICAgdHlwZTsKKwlfX3UzMgkJCWNhcGFiaWxpdHk7CisJX191MzIJCQlyYW5nZWxvdzsKKwlfX3UzMgkJCXJhbmdlaGlnaDsKKwlfX3UzMgkJCXJ4c3ViY2hhbnM7CisJX191MzIJCQlhdWRtb2RlOworCV9fczMyCQkJc2lnbmFsOworCV9fczMyCQkJYWZjOworCV9fdTMyCQkJcmVzZXJ2ZWRbNF07Cit9OworCitzdHJ1Y3QgdjRsMl9tb2R1bGF0b3IgeworCV9fdTMyCQkJaW5kZXg7CisJX191OAkJCW5hbWVbMzJdOworCV9fdTMyCQkJY2FwYWJpbGl0eTsKKwlfX3UzMgkJCXJhbmdlbG93OworCV9fdTMyCQkJcmFuZ2VoaWdoOworCV9fdTMyCQkJdHhzdWJjaGFuczsKKwlfX3UzMgkJCXJlc2VydmVkWzRdOworfTsKKworLyogIEZsYWdzIGZvciB0aGUgJ2NhcGFiaWxpdHknIGZpZWxkICovCisjZGVmaW5lIFY0TDJfVFVORVJfQ0FQX0xPVwkJMHgwMDAxCisjZGVmaW5lIFY0TDJfVFVORVJfQ0FQX05PUk0JCTB4MDAwMgorI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9TVEVSRU8JCTB4MDAxMAorI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9MQU5HMgkJMHgwMDIwCisjZGVmaW5lIFY0TDJfVFVORVJfQ0FQX1NBUAkJMHgwMDIwCisjZGVmaW5lIFY0TDJfVFVORVJfQ0FQX0xBTkcxCQkweDAwNDAKKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfUkRTCQkweDAwODAKKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfUkRTX0JMT0NLX0lPCTB4MDEwMAorI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9SRFNfQ09OVFJPTFMJMHgwMjAwCisKKy8qICBGbGFncyBmb3IgdGhlICdyeHN1YmNoYW5zJyBmaWVsZCAqLworI2RlZmluZSBWNEwyX1RVTkVSX1NVQl9NT05PCQkweDAwMDEKKyNkZWZpbmUgVjRMMl9UVU5FUl9TVUJfU1RFUkVPCQkweDAwMDIKKyNkZWZpbmUgVjRMMl9UVU5FUl9TVUJfTEFORzIJCTB4MDAwNAorI2RlZmluZSBWNEwyX1RVTkVSX1NVQl9TQVAJCTB4MDAwNAorI2RlZmluZSBWNEwyX1RVTkVSX1NVQl9MQU5HMQkJMHgwMDA4CisjZGVmaW5lIFY0TDJfVFVORVJfU1VCX1JEUwkJMHgwMDEwCisKKy8qICBWYWx1ZXMgZm9yIHRoZSAnYXVkbW9kZScgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9UVU5FUl9NT0RFX01PTk8JCTB4MDAwMAorI2RlZmluZSBWNEwyX1RVTkVSX01PREVfU1RFUkVPCQkweDAwMDEKKyNkZWZpbmUgVjRMMl9UVU5FUl9NT0RFX0xBTkcyCQkweDAwMDIKKyNkZWZpbmUgVjRMMl9UVU5FUl9NT0RFX1NBUAkJMHgwMDAyCisjZGVmaW5lIFY0TDJfVFVORVJfTU9ERV9MQU5HMQkJMHgwMDAzCisjZGVmaW5lIFY0TDJfVFVORVJfTU9ERV9MQU5HMV9MQU5HMgkweDAwMDQKKworc3RydWN0IHY0bDJfZnJlcXVlbmN5IHsKKwlfX3UzMgkJICAgICAgdHVuZXI7CisJZW51bSB2NGwyX3R1bmVyX3R5cGUgIHR5cGU7CisJX191MzIJCSAgICAgIGZyZXF1ZW5jeTsKKwlfX3UzMgkJICAgICAgcmVzZXJ2ZWRbOF07Cit9OworCitzdHJ1Y3QgdjRsMl9od19mcmVxX3NlZWsgeworCV9fdTMyCQkgICAgICB0dW5lcjsKKwllbnVtIHY0bDJfdHVuZXJfdHlwZSAgdHlwZTsKKwlfX3UzMgkJICAgICAgc2Vla191cHdhcmQ7CisJX191MzIJCSAgICAgIHdyYXBfYXJvdW5kOworCV9fdTMyCQkgICAgICBzcGFjaW5nOworCV9fdTMyCQkgICAgICByZXNlcnZlZFs3XTsKK307CisKKy8qCisgKglSIEQgUworICovCisKK3N0cnVjdCB2NGwyX3Jkc19kYXRhIHsKKwlfX3U4IAlsc2I7CisJX191OCAJbXNiOworCV9fdTggCWJsb2NrOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVjRMMl9SRFNfQkxPQ0tfTVNLIAkgMHg3CisjZGVmaW5lIFY0TDJfUkRTX0JMT0NLX0EgCSAwCisjZGVmaW5lIFY0TDJfUkRTX0JMT0NLX0IgCSAxCisjZGVmaW5lIFY0TDJfUkRTX0JMT0NLX0MgCSAyCisjZGVmaW5lIFY0TDJfUkRTX0JMT0NLX0QgCSAzCisjZGVmaW5lIFY0TDJfUkRTX0JMT0NLX0NfQUxUIAkgNAorI2RlZmluZSBWNEwyX1JEU19CTE9DS19JTlZBTElEIAkgNworCisjZGVmaW5lIFY0TDJfUkRTX0JMT0NLX0NPUlJFQ1RFRCAweDQwCisjZGVmaW5lIFY0TDJfUkRTX0JMT0NLX0VSUk9SIAkgMHg4MAorCisvKgorICoJQSBVIEQgSSBPCisgKi8KK3N0cnVjdCB2NGwyX2F1ZGlvIHsKKwlfX3UzMglpbmRleDsKKwlfX3U4CW5hbWVbMzJdOworCV9fdTMyCWNhcGFiaWxpdHk7CisJX191MzIJbW9kZTsKKwlfX3UzMglyZXNlcnZlZFsyXTsKK307CisKKy8qICBGbGFncyBmb3IgdGhlICdjYXBhYmlsaXR5JyBmaWVsZCAqLworI2RlZmluZSBWNEwyX0FVRENBUF9TVEVSRU8JCTB4MDAwMDEKKyNkZWZpbmUgVjRMMl9BVURDQVBfQVZMCQkJMHgwMDAwMgorCisvKiAgRmxhZ3MgZm9yIHRoZSAnbW9kZScgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9BVURNT0RFX0FWTAkJMHgwMDAwMQorCitzdHJ1Y3QgdjRsMl9hdWRpb291dCB7CisJX191MzIJaW5kZXg7CisJX191OAluYW1lWzMyXTsKKwlfX3UzMgljYXBhYmlsaXR5OworCV9fdTMyCW1vZGU7CisJX191MzIJcmVzZXJ2ZWRbMl07Cit9OworCisvKgorICoJTSBQIEUgRyAgIFMgRSBSIFYgSSBDIEUgUworICoKKyAqCU5PVEU6IEVYUEVSSU1FTlRBTCBBUEkKKyAqLworI2lmIDEKKyNkZWZpbmUgVjRMMl9FTkNfSURYX0ZSQU1FX0kgICAgKDApCisjZGVmaW5lIFY0TDJfRU5DX0lEWF9GUkFNRV9QICAgICgxKQorI2RlZmluZSBWNEwyX0VOQ19JRFhfRlJBTUVfQiAgICAoMikKKyNkZWZpbmUgVjRMMl9FTkNfSURYX0ZSQU1FX01BU0sgKDB4ZikKKworc3RydWN0IHY0bDJfZW5jX2lkeF9lbnRyeSB7CisJX191NjQgb2Zmc2V0OworCV9fdTY0IHB0czsKKwlfX3UzMiBsZW5ndGg7CisJX191MzIgZmxhZ3M7CisJX191MzIgcmVzZXJ2ZWRbMl07Cit9OworCisjZGVmaW5lIFY0TDJfRU5DX0lEWF9FTlRSSUVTICg2NCkKK3N0cnVjdCB2NGwyX2VuY19pZHggeworCV9fdTMyIGVudHJpZXM7CisJX191MzIgZW50cmllc19jYXA7CisJX191MzIgcmVzZXJ2ZWRbNF07CisJc3RydWN0IHY0bDJfZW5jX2lkeF9lbnRyeSBlbnRyeVtWNEwyX0VOQ19JRFhfRU5UUklFU107Cit9OworCisKKyNkZWZpbmUgVjRMMl9FTkNfQ01EX1NUQVJUICAgICAgKDApCisjZGVmaW5lIFY0TDJfRU5DX0NNRF9TVE9QICAgICAgICgxKQorI2RlZmluZSBWNEwyX0VOQ19DTURfUEFVU0UgICAgICAoMikKKyNkZWZpbmUgVjRMMl9FTkNfQ01EX1JFU1VNRSAgICAgKDMpCisKKy8qIEZsYWdzIGZvciBWNEwyX0VOQ19DTURfU1RPUCAqLworI2RlZmluZSBWNEwyX0VOQ19DTURfU1RPUF9BVF9HT1BfRU5EICAgICgxIDw8IDApCisKK3N0cnVjdCB2NGwyX2VuY29kZXJfY21kIHsKKwlfX3UzMiBjbWQ7CisJX191MzIgZmxhZ3M7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191MzIgZGF0YVs4XTsKKwkJfSByYXc7CisJfTsKK307CisKKyNlbmRpZgorCisKKy8qCisgKglEIEEgVCBBICAgUyBFIFIgViBJIEMgRSBTICAgKCBWIEIgSSApCisgKgorICoJRGF0YSBzZXJ2aWNlcyBBUEkgYnkgTWljaGFlbCBTY2hpbWVrCisgKi8KKworLyogUmF3IFZCSSAqLworc3RydWN0IHY0bDJfdmJpX2Zvcm1hdCB7CisJX191MzIJc2FtcGxpbmdfcmF0ZTsJCS8qIGluIDEgSHogKi8KKwlfX3UzMglvZmZzZXQ7CisJX191MzIJc2FtcGxlc19wZXJfbGluZTsKKwlfX3UzMglzYW1wbGVfZm9ybWF0OwkJLyogVjRMMl9QSVhfRk1UXyogKi8KKwlfX3MzMglzdGFydFsyXTsKKwlfX3UzMgljb3VudFsyXTsKKwlfX3UzMglmbGFnczsJCQkvKiBWNEwyX1ZCSV8qICovCisJX191MzIJcmVzZXJ2ZWRbMl07CQkvKiBtdXN0IGJlIHplcm8gKi8KK307CisKKy8qICBWQkkgZmxhZ3MgICovCisjZGVmaW5lIFY0TDJfVkJJX1VOU1lOQwkJKDEgPDwgMCkKKyNkZWZpbmUgVjRMMl9WQklfSU5URVJMQUNFRAkoMSA8PCAxKQorCisvKiBTbGljZWQgVkJJCisgKgorICogICAgVGhpcyBpbXBsZW1lbnRzIGlzIGEgcHJvcG9zYWwgVjRMMiBBUEkgdG8gYWxsb3cgU0xJQ0VEIFZCSQorICogcmVxdWlyZWQgZm9yIHNvbWUgaGFyZHdhcmUgZW5jb2RlcnMuIEl0IHNob3VsZCBjaGFuZ2Ugd2l0aG91dAorICogbm90aWNlIGluIHRoZSBkZWZpbml0aXZlIGltcGxlbWVudGF0aW9uLgorICovCisKK3N0cnVjdCB2NGwyX3NsaWNlZF92YmlfZm9ybWF0IHsKKwlfX3UxNiAgIHNlcnZpY2Vfc2V0OworCS8qIHNlcnZpY2VfbGluZXNbMF1bLi4uXSBzcGVjaWZpZXMgbGluZXMgMC0yMyAoMS0yMyB1c2VkKSBvZiB0aGUgZmlyc3QgZmllbGQKKwkgICBzZXJ2aWNlX2xpbmVzWzFdWy4uLl0gc3BlY2lmaWVzIGxpbmVzIDAtMjMgKDEtMjMgdXNlZCkgb2YgdGhlIHNlY29uZCBmaWVsZAorCQkJCSAoZXF1YWxzIGZyYW1lIGxpbmVzIDMxMy0zMzYgZm9yIDYyNSBsaW5lIHZpZGVvCisJCQkJICBzdGFuZGFyZHMsIDI2My0yODYgZm9yIDUyNSBsaW5lIHN0YW5kYXJkcykgKi8KKwlfX3UxNiAgIHNlcnZpY2VfbGluZXNbMl1bMjRdOworCV9fdTMyICAgaW9fc2l6ZTsKKwlfX3UzMiAgIHJlc2VydmVkWzJdOyAgICAgICAgICAgIC8qIG11c3QgYmUgemVybyAqLworfTsKKworLyogVGVsZXRleHQgV29ybGQgU3lzdGVtIFRlbGV0ZXh0CisgICAoV1NUKSwgZGVmaW5lZCBvbiBJVFUtUiBCVC42NTMtMiAqLworI2RlZmluZSBWNEwyX1NMSUNFRF9URUxFVEVYVF9CICAgICAgICAgICgweDAwMDEpCisvKiBWaWRlbyBQcm9ncmFtIFN5c3RlbSwgZGVmaW5lZCBvbiBFVFMgMzAwIDIzMSovCisjZGVmaW5lIFY0TDJfU0xJQ0VEX1ZQUyAgICAgICAgICAgICAgICAgKDB4MDQwMCkKKy8qIENsb3NlZCBDYXB0aW9uLCBkZWZpbmVkIG9uIEVJQS02MDggKi8KKyNkZWZpbmUgVjRMMl9TTElDRURfQ0FQVElPTl81MjUgICAgICAgICAoMHgxMDAwKQorLyogV2lkZSBTY3JlZW4gU3lzdGVtLCBkZWZpbmVkIG9uIElUVS1SIEJUMTExOS4xICovCisjZGVmaW5lIFY0TDJfU0xJQ0VEX1dTU182MjUgICAgICAgICAgICAgKDB4NDAwMCkKKworI2RlZmluZSBWNEwyX1NMSUNFRF9WQklfNTI1ICAgICAgICAgICAgIChWNEwyX1NMSUNFRF9DQVBUSU9OXzUyNSkKKyNkZWZpbmUgVjRMMl9TTElDRURfVkJJXzYyNSAgICAgICAgICAgICAoVjRMMl9TTElDRURfVEVMRVRFWFRfQiB8IFY0TDJfU0xJQ0VEX1ZQUyB8IFY0TDJfU0xJQ0VEX1dTU182MjUpCisKK3N0cnVjdCB2NGwyX3NsaWNlZF92YmlfY2FwIHsKKwlfX3UxNiAgIHNlcnZpY2Vfc2V0OworCS8qIHNlcnZpY2VfbGluZXNbMF1bLi4uXSBzcGVjaWZpZXMgbGluZXMgMC0yMyAoMS0yMyB1c2VkKSBvZiB0aGUgZmlyc3QgZmllbGQKKwkgICBzZXJ2aWNlX2xpbmVzWzFdWy4uLl0gc3BlY2lmaWVzIGxpbmVzIDAtMjMgKDEtMjMgdXNlZCkgb2YgdGhlIHNlY29uZCBmaWVsZAorCQkJCSAoZXF1YWxzIGZyYW1lIGxpbmVzIDMxMy0zMzYgZm9yIDYyNSBsaW5lIHZpZGVvCisJCQkJICBzdGFuZGFyZHMsIDI2My0yODYgZm9yIDUyNSBsaW5lIHN0YW5kYXJkcykgKi8KKwlfX3UxNiAgIHNlcnZpY2VfbGluZXNbMl1bMjRdOworCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlOworCV9fdTMyICAgcmVzZXJ2ZWRbM107ICAgIC8qIG11c3QgYmUgMCAqLworfTsKKworc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9kYXRhIHsKKwlfX3UzMiAgIGlkOworCV9fdTMyICAgZmllbGQ7ICAgICAgICAgIC8qIDA6IGZpcnN0IGZpZWxkLCAxOiBzZWNvbmQgZmllbGQgKi8KKwlfX3UzMiAgIGxpbmU7ICAgICAgICAgICAvKiAxLTIzICovCisJX191MzIgICByZXNlcnZlZDsgICAgICAgLyogbXVzdCBiZSAwICovCisJX191OCAgICBkYXRhWzQ4XTsKK307CisKKy8qCisgKiBTbGljZWQgVkJJIGRhdGEgaW5zZXJ0ZWQgaW50byBNUEVHIFN0cmVhbXMKKyAqLworCisvKgorICogVjRMMl9NUEVHX1NUUkVBTV9WQklfRk1UX0lWVFY6CisgKgorICogU3RydWN0dXJlIG9mIHBheWxvYWQgY29udGFpbmVkIGluIGFuIE1QRUcgMiBQcml2YXRlIFN0cmVhbSAxIFBFUyBQYWNrZXQgaW4gYW4KKyAqIE1QRUctMiBQcm9ncmFtIFBhY2sgdGhhdCBjb250YWlucyBWNEwyX01QRUdfU1RSRUFNX1ZCSV9GTVRfSVZUViBTbGljZWQgVkJJCisgKiBkYXRhCisgKgorICogTm90ZSwgdGhlIE1QRUctMiBQcm9ncmFtIFBhY2sgYW5kIFByaXZhdGUgU3RyZWFtIDEgUEVTIHBhY2tldCBoZWFkZXIKKyAqIGRlZmluaXRpb25zIGFyZSBub3QgaW5jbHVkZWQgaGVyZS4gIFNlZSB0aGUgTVBFRy0yIHNwZWNpZmljYXRpb25zIGZvciBkZXRhaWxzCisgKiBvbiB0aGVzZSBoZWFkZXJzLgorICovCisKKy8qIExpbmUgdHlwZSBJRHMgKi8KKyNkZWZpbmUgVjRMMl9NUEVHX1ZCSV9JVlRWX1RFTEVURVhUX0IgICAgICgxKQorI2RlZmluZSBWNEwyX01QRUdfVkJJX0lWVFZfQ0FQVElPTl81MjUgICAgKDQpCisjZGVmaW5lIFY0TDJfTVBFR19WQklfSVZUVl9XU1NfNjI1ICAgICAgICAoNSkKKyNkZWZpbmUgVjRMMl9NUEVHX1ZCSV9JVlRWX1ZQUyAgICAgICAgICAgICg3KQorCitzdHJ1Y3QgdjRsMl9tcGVnX3ZiaV9pdHYwX2xpbmUgeworCV9fdTggaWQ7CS8qIE9uZSBvZiBWNEwyX01QRUdfVkJJX0lWVFZfKiBhYm92ZSAqLworCV9fdTggZGF0YVs0Ml07CS8qIFNsaWNlZCBWQkkgZGF0YSBmb3IgdGhlIGxpbmUgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgdjRsMl9tcGVnX3ZiaV9pdHYwIHsKKwlfX2xlMzIgbGluZW1hc2tbMl07IC8qIEJpdG1hc2tzIG9mIFZCSSBzZXJ2aWNlIGxpbmVzIHByZXNlbnQgKi8KKwlzdHJ1Y3QgdjRsMl9tcGVnX3ZiaV9pdHYwX2xpbmUgbGluZVszNV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHY0bDJfbXBlZ192YmlfSVRWMCB7CisJc3RydWN0IHY0bDJfbXBlZ192YmlfaXR2MF9saW5lIGxpbmVbMzZdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVjRMMl9NUEVHX1ZCSV9JVlRWX01BR0lDMAkiaXR2MCIKKyNkZWZpbmUgVjRMMl9NUEVHX1ZCSV9JVlRWX01BR0lDMQkiSVRWMCIKKworc3RydWN0IHY0bDJfbXBlZ192YmlfZm10X2l2dHYgeworCV9fdTggbWFnaWNbNF07CisJdW5pb24geworCQlzdHJ1Y3QgdjRsMl9tcGVnX3ZiaV9pdHYwIGl0djA7CisJCXN0cnVjdCB2NGwyX21wZWdfdmJpX0lUVjAgSVRWMDsKKwl9OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKglBIEcgRyBSIEUgRyBBIFQgRSAgIFMgVCBSIFUgQyBUIFUgUiBFIFMKKyAqLworCisvKioKKyAqIHN0cnVjdCB2NGwyX3BsYW5lX3BpeF9mb3JtYXQgLSBhZGRpdGlvbmFsLCBwZXItcGxhbmUgZm9ybWF0IGRlZmluaXRpb24KKyAqIEBzaXplaW1hZ2U6CQltYXhpbXVtIHNpemUgaW4gYnl0ZXMgcmVxdWlyZWQgZm9yIGRhdGEsIGZvciB3aGljaAorICoJCQl0aGlzIHBsYW5lIHdpbGwgYmUgdXNlZAorICogQGJ5dGVzcGVybGluZToJZGlzdGFuY2UgaW4gYnl0ZXMgYmV0d2VlbiB0aGUgbGVmdG1vc3QgcGl4ZWxzIGluIHR3bworICoJCQlhZGphY2VudCBsaW5lcworICovCitzdHJ1Y3QgdjRsMl9wbGFuZV9waXhfZm9ybWF0IHsKKwlfX3UzMgkJc2l6ZWltYWdlOworCV9fdTE2CQlieXRlc3BlcmxpbmU7CisJX191MTYJCXJlc2VydmVkWzddOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qKgorICogc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgLSBtdWx0aXBsYW5hciBmb3JtYXQgZGVmaW5pdGlvbgorICogQHdpZHRoOgkJaW1hZ2Ugd2lkdGggaW4gcGl4ZWxzCisgKiBAaGVpZ2h0OgkJaW1hZ2UgaGVpZ2h0IGluIHBpeGVscworICogQHBpeGVsZm9ybWF0OglsaXR0bGUgZW5kaWFuIGZvdXIgY2hhcmFjdGVyIGNvZGUgKGZvdXJjYykKKyAqIEBmaWVsZDoJCWZpZWxkIG9yZGVyIChmb3IgaW50ZXJsYWNlZCB2aWRlbykKKyAqIEBjb2xvcnNwYWNlOgkJc3VwcGxlbWVudGFsIHRvIHBpeGVsZm9ybWF0CisgKiBAcGxhbmVfZm10OgkJcGVyLXBsYW5lIGluZm9ybWF0aW9uCisgKiBAbnVtX3BsYW5lczoJCW51bWJlciBvZiBwbGFuZXMgZm9yIHRoaXMgZm9ybWF0CisgKi8KK3N0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lIHsKKwlfX3UzMgkJCQl3aWR0aDsKKwlfX3UzMgkJCQloZWlnaHQ7CisJX191MzIJCQkJcGl4ZWxmb3JtYXQ7CisJZW51bSB2NGwyX2ZpZWxkCQkJZmllbGQ7CisJZW51bSB2NGwyX2NvbG9yc3BhY2UJCWNvbG9yc3BhY2U7CisKKwlzdHJ1Y3QgdjRsMl9wbGFuZV9waXhfZm9ybWF0CXBsYW5lX2ZtdFtWSURFT19NQVhfUExBTkVTXTsKKwlfX3U4CQkJCW51bV9wbGFuZXM7CisJX191OAkJCQlyZXNlcnZlZFsxMV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoqCisgKiBzdHJ1Y3QgdjRsMl9mb3JtYXQgLSBzdHJlYW0gZGF0YSBmb3JtYXQKKyAqIEB0eXBlOgl0eXBlIG9mIHRoZSBkYXRhIHN0cmVhbQorICogQHBpeDoJZGVmaW5pdGlvbiBvZiBhbiBpbWFnZSBmb3JtYXQKKyAqIEBwaXhfbXA6CWRlZmluaXRpb24gb2YgYSBtdWx0aXBsYW5hciBpbWFnZSBmb3JtYXQKKyAqIEB3aW46CWRlZmluaXRpb24gb2YgYW4gb3ZlcmxhaWQgaW1hZ2UKKyAqIEB2Ymk6CXJhdyBWQkkgY2FwdHVyZSBvciBvdXRwdXQgcGFyYW1ldGVycworICogQHNsaWNlZDoJc2xpY2VkIFZCSSBjYXB0dXJlIG9yIG91dHB1dCBwYXJhbWV0ZXJzCisgKiBAcmF3X2RhdGE6CXBsYWNlaG9sZGVyIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyBhbmQgY3VzdG9tIGZvcm1hdHMKKyAqLworc3RydWN0IHY0bDJfZm9ybWF0IHsKKwllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZTsKKwl1bmlvbiB7CisJCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQJCXBpeDsgICAgIC8qIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSAqLworCQlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZQlwaXhfbXA7ICAvKiBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FICovCisJCXN0cnVjdCB2NGwyX3dpbmRvdwkJd2luOyAgICAgLyogVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZICovCisJCXN0cnVjdCB2NGwyX3ZiaV9mb3JtYXQJCXZiaTsgICAgIC8qIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUgKi8KKwkJc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9mb3JtYXQJc2xpY2VkOyAgLyogVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkUgKi8KKwkJX191OAlyYXdfZGF0YVsyMDBdOyAgICAgICAgICAgICAgICAgICAvKiB1c2VyLWRlZmluZWQgKi8KKwl9IGZtdDsKK307CisKKy8qCVN0cmVhbSB0eXBlLWRlcGVuZGVudCBwYXJhbWV0ZXJzCisgKi8KK3N0cnVjdCB2NGwyX3N0cmVhbXBhcm0geworCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlOworCXVuaW9uIHsKKwkJc3RydWN0IHY0bDJfY2FwdHVyZXBhcm0JY2FwdHVyZTsKKwkJc3RydWN0IHY0bDJfb3V0cHV0cGFybQlvdXRwdXQ7CisJCV9fdTgJcmF3X2RhdGFbMjAwXTsgIC8qIHVzZXItZGVmaW5lZCAqLworCX0gcGFybTsKK307CisKKy8qCisgKglFIFYgRSBOIFQgUworICovCisKKyNkZWZpbmUgVjRMMl9FVkVOVF9BTEwJCQkJMAorI2RlZmluZSBWNEwyX0VWRU5UX1ZTWU5DCQkJMQorI2RlZmluZSBWNEwyX0VWRU5UX0VPUwkJCQkyCisjZGVmaW5lIFY0TDJfRVZFTlRfQ1RSTAkJCQkzCisjZGVmaW5lIFY0TDJfRVZFTlRfRlJBTUVfU1lOQwkJCTQKKyNkZWZpbmUgVjRMMl9FVkVOVF9QUklWQVRFX1NUQVJUCQkweDA4MDAwMDAwCisKKy8qIFBheWxvYWQgZm9yIFY0TDJfRVZFTlRfVlNZTkMgKi8KK3N0cnVjdCB2NGwyX2V2ZW50X3ZzeW5jIHsKKwkvKiBDYW4gYmUgVjRMMl9GSUVMRF9BTlksIF9OT05FLCBfVE9QIG9yIF9CT1RUT00gKi8KKwlfX3U4IGZpZWxkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFBheWxvYWQgZm9yIFY0TDJfRVZFTlRfQ1RSTCAqLworI2RlZmluZSBWNEwyX0VWRU5UX0NUUkxfQ0hfVkFMVUUJCSgxIDw8IDApCisjZGVmaW5lIFY0TDJfRVZFTlRfQ1RSTF9DSF9GTEFHUwkJKDEgPDwgMSkKKworc3RydWN0IHY0bDJfZXZlbnRfY3RybCB7CisJX191MzIgY2hhbmdlczsKKwlfX3UzMiB0eXBlOworCXVuaW9uIHsKKwkJX19zMzIgdmFsdWU7CisJCV9fczY0IHZhbHVlNjQ7CisJfTsKKwlfX3UzMiBmbGFnczsKKwlfX3MzMiBtaW5pbXVtOworCV9fczMyIG1heGltdW07CisJX19zMzIgc3RlcDsKKwlfX3MzMiBkZWZhdWx0X3ZhbHVlOworfTsKKworc3RydWN0IHY0bDJfZXZlbnRfZnJhbWVfc3luYyB7CisJX191MzIgZnJhbWVfc2VxdWVuY2U7Cit9OworCitzdHJ1Y3QgdjRsMl9ldmVudCB7CisJX191MzIJCQkJdHlwZTsKKwl1bmlvbiB7CisJCXN0cnVjdCB2NGwyX2V2ZW50X3ZzeW5jCQl2c3luYzsKKwkJc3RydWN0IHY0bDJfZXZlbnRfY3RybAkJY3RybDsKKwkJc3RydWN0IHY0bDJfZXZlbnRfZnJhbWVfc3luYwlmcmFtZV9zeW5jOworCQlfX3U4CQkJCWRhdGFbNjRdOworCX0gdTsKKwlfX3UzMgkJCQlwZW5kaW5nOworCV9fdTMyCQkJCXNlcXVlbmNlOworCXN0cnVjdCB0aW1lc3BlYwkJCXRpbWVzdGFtcDsKKwlfX3UzMgkJCQlpZDsKKwlfX3UzMgkJCQlyZXNlcnZlZFs4XTsKK307CisKKyNkZWZpbmUgVjRMMl9FVkVOVF9TVUJfRkxfU0VORF9JTklUSUFMCQkoMSA8PCAwKQorI2RlZmluZSBWNEwyX0VWRU5UX1NVQl9GTF9BTExPV19GRUVEQkFDSwkoMSA8PCAxKQorCitzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24geworCV9fdTMyCQkJCXR5cGU7CisJX191MzIJCQkJaWQ7CisJX191MzIJCQkJZmxhZ3M7CisJX191MzIJCQkJcmVzZXJ2ZWRbNV07Cit9OworCisvKgorICoJQSBEIFYgQSBOIEMgRSBEICAgRCBFIEIgVSBHIEcgSSBOIEcKKyAqCisgKglOT1RFOiBFWFBFUklNRU5UQUwgQVBJLCBORVZFUiBSRUxZIE9OIFRISVMgSU4gQVBQTElDQVRJT05TIQorICoJRk9SIERFQlVHR0lORywgVEVTVElORyBBTkQgSU5URVJOQUwgVVNFIE9OTFkhCisgKi8KKworLyogVklESU9DX0RCR19HX1JFR0lTVEVSIGFuZCBWSURJT0NfREJHX1NfUkVHSVNURVIgKi8KKworI2RlZmluZSBWNEwyX0NISVBfTUFUQ0hfSE9TVCAgICAgICAwICAvKiBNYXRjaCBhZ2FpbnN0IGNoaXAgSUQgb24gaG9zdCAoMCBmb3IgdGhlIGhvc3QpICovCisjZGVmaW5lIFY0TDJfQ0hJUF9NQVRDSF9JMkNfRFJJVkVSIDEgIC8qIE1hdGNoIGFnYWluc3QgSTJDIGRyaXZlciBuYW1lICovCisjZGVmaW5lIFY0TDJfQ0hJUF9NQVRDSF9JMkNfQUREUiAgIDIgIC8qIE1hdGNoIGFnYWluc3QgSTJDIDctYml0IGFkZHJlc3MgKi8KKyNkZWZpbmUgVjRMMl9DSElQX01BVENIX0FDOTcgICAgICAgMyAgLyogTWF0Y2ggYWdhaW5zdCBhbmNpbGlhcnkgQUM5NyBjaGlwICovCisKK3N0cnVjdCB2NGwyX2RiZ19tYXRjaCB7CisJX191MzIgdHlwZTsgLyogTWF0Y2ggdHlwZSAqLworCXVuaW9uIHsgICAgIC8qIE1hdGNoIHRoaXMgY2hpcCwgbWVhbmluZyBkZXRlcm1pbmVkIGJ5IHR5cGUgKi8KKwkJX191MzIgYWRkcjsKKwkJY2hhciBuYW1lWzMyXTsKKwl9OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciB7CisJc3RydWN0IHY0bDJfZGJnX21hdGNoIG1hdGNoOworCV9fdTMyIHNpemU7CS8qIHJlZ2lzdGVyIHNpemUgaW4gYnl0ZXMgKi8KKwlfX3U2NCByZWc7CisJX191NjQgdmFsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFZJRElPQ19EQkdfR19DSElQX0lERU5UICovCitzdHJ1Y3QgdjRsMl9kYmdfY2hpcF9pZGVudCB7CisJc3RydWN0IHY0bDJfZGJnX21hdGNoIG1hdGNoOworCV9fdTMyIGlkZW50OyAgICAgICAvKiBjaGlwIGlkZW50aWZpZXIgYXMgc3BlY2lmaWVkIGluIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4gKi8KKwlfX3UzMiByZXZpc2lvbjsgICAgLyogY2hpcCByZXZpc2lvbiwgY2hpcCBzcGVjaWZpYyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qKgorICogc3RydWN0IHY0bDJfY3JlYXRlX2J1ZmZlcnMgLSBWSURJT0NfQ1JFQVRFX0JVRlMgYXJndW1lbnQKKyAqIEBpbmRleDoJb24gcmV0dXJuLCBpbmRleCBvZiB0aGUgZmlyc3QgY3JlYXRlZCBidWZmZXIKKyAqIEBjb3VudDoJZW50cnk6IG51bWJlciBvZiByZXF1ZXN0ZWQgYnVmZmVycywKKyAqCQlyZXR1cm46IG51bWJlciBvZiBjcmVhdGVkIGJ1ZmZlcnMKKyAqIEBtZW1vcnk6CWJ1ZmZlciBtZW1vcnkgdHlwZQorICogQGZvcm1hdDoJZnJhbWUgZm9ybWF0LCBmb3Igd2hpY2ggYnVmZmVycyBhcmUgcmVxdWVzdGVkCisgKiBAcmVzZXJ2ZWQ6CWZ1dHVyZSBleHRlbnNpb25zCisgKi8KK3N0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzIHsKKwlfX3UzMgkJCWluZGV4OworCV9fdTMyCQkJY291bnQ7CisJZW51bSB2NGwyX21lbW9yeSAgICAgICAgbWVtb3J5OworCXN0cnVjdCB2NGwyX2Zvcm1hdAlmb3JtYXQ7CisJX191MzIJCQlyZXNlcnZlZFs4XTsKK307CisKKy8qCisgKglJIE8gQyBUIEwgICBDIE8gRCBFIFMgICBGIE8gUiAgIFYgSSBEIEUgTyAgIEQgRSBWIEkgQyBFIFMKKyAqCisgKi8KKyNkZWZpbmUgVklESU9DX1FVRVJZQ0FQCQkgX0lPUignVicsICAwLCBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5KQorI2RlZmluZSBWSURJT0NfUkVTRVJWRUQJCSAgX0lPKCdWJywgIDEpCisjZGVmaW5lIFZJRElPQ19FTlVNX0ZNVCAgICAgICAgIF9JT1dSKCdWJywgIDIsIHN0cnVjdCB2NGwyX2ZtdGRlc2MpCisjZGVmaW5lIFZJRElPQ19HX0ZNVAkJX0lPV1IoJ1YnLCAgNCwgc3RydWN0IHY0bDJfZm9ybWF0KQorI2RlZmluZSBWSURJT0NfU19GTVQJCV9JT1dSKCdWJywgIDUsIHN0cnVjdCB2NGwyX2Zvcm1hdCkKKyNkZWZpbmUgVklESU9DX1JFUUJVRlMJCV9JT1dSKCdWJywgIDgsIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzKQorI2RlZmluZSBWSURJT0NfUVVFUllCVUYJCV9JT1dSKCdWJywgIDksIHN0cnVjdCB2NGwyX2J1ZmZlcikKKyNkZWZpbmUgVklESU9DX0dfRkJVRgkJIF9JT1IoJ1YnLCAxMCwgc3RydWN0IHY0bDJfZnJhbWVidWZmZXIpCisjZGVmaW5lIFZJRElPQ19TX0ZCVUYJCSBfSU9XKCdWJywgMTEsIHN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyKQorI2RlZmluZSBWSURJT0NfT1ZFUkxBWQkJIF9JT1coJ1YnLCAxNCwgaW50KQorI2RlZmluZSBWSURJT0NfUUJVRgkJX0lPV1IoJ1YnLCAxNSwgc3RydWN0IHY0bDJfYnVmZmVyKQorI2RlZmluZSBWSURJT0NfRFFCVUYJCV9JT1dSKCdWJywgMTcsIHN0cnVjdCB2NGwyX2J1ZmZlcikKKyNkZWZpbmUgVklESU9DX1NUUkVBTU9OCQkgX0lPVygnVicsIDE4LCBpbnQpCisjZGVmaW5lIFZJRElPQ19TVFJFQU1PRkYJIF9JT1coJ1YnLCAxOSwgaW50KQorI2RlZmluZSBWSURJT0NfR19QQVJNCQlfSU9XUignVicsIDIxLCBzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtKQorI2RlZmluZSBWSURJT0NfU19QQVJNCQlfSU9XUignVicsIDIyLCBzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtKQorI2RlZmluZSBWSURJT0NfR19TVEQJCSBfSU9SKCdWJywgMjMsIHY0bDJfc3RkX2lkKQorI2RlZmluZSBWSURJT0NfU19TVEQJCSBfSU9XKCdWJywgMjQsIHY0bDJfc3RkX2lkKQorI2RlZmluZSBWSURJT0NfRU5VTVNURAkJX0lPV1IoJ1YnLCAyNSwgc3RydWN0IHY0bDJfc3RhbmRhcmQpCisjZGVmaW5lIFZJRElPQ19FTlVNSU5QVVQJX0lPV1IoJ1YnLCAyNiwgc3RydWN0IHY0bDJfaW5wdXQpCisjZGVmaW5lIFZJRElPQ19HX0NUUkwJCV9JT1dSKCdWJywgMjcsIHN0cnVjdCB2NGwyX2NvbnRyb2wpCisjZGVmaW5lIFZJRElPQ19TX0NUUkwJCV9JT1dSKCdWJywgMjgsIHN0cnVjdCB2NGwyX2NvbnRyb2wpCisjZGVmaW5lIFZJRElPQ19HX1RVTkVSCQlfSU9XUignVicsIDI5LCBzdHJ1Y3QgdjRsMl90dW5lcikKKyNkZWZpbmUgVklESU9DX1NfVFVORVIJCSBfSU9XKCdWJywgMzAsIHN0cnVjdCB2NGwyX3R1bmVyKQorI2RlZmluZSBWSURJT0NfR19BVURJTwkJIF9JT1IoJ1YnLCAzMywgc3RydWN0IHY0bDJfYXVkaW8pCisjZGVmaW5lIFZJRElPQ19TX0FVRElPCQkgX0lPVygnVicsIDM0LCBzdHJ1Y3QgdjRsMl9hdWRpbykKKyNkZWZpbmUgVklESU9DX1FVRVJZQ1RSTAlfSU9XUignVicsIDM2LCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwpCisjZGVmaW5lIFZJRElPQ19RVUVSWU1FTlUJX0lPV1IoJ1YnLCAzNywgc3RydWN0IHY0bDJfcXVlcnltZW51KQorI2RlZmluZSBWSURJT0NfR19JTlBVVAkJIF9JT1IoJ1YnLCAzOCwgaW50KQorI2RlZmluZSBWSURJT0NfU19JTlBVVAkJX0lPV1IoJ1YnLCAzOSwgaW50KQorI2RlZmluZSBWSURJT0NfR19PVVRQVVQJCSBfSU9SKCdWJywgNDYsIGludCkKKyNkZWZpbmUgVklESU9DX1NfT1VUUFVUCQlfSU9XUignVicsIDQ3LCBpbnQpCisjZGVmaW5lIFZJRElPQ19FTlVNT1VUUFVUCV9JT1dSKCdWJywgNDgsIHN0cnVjdCB2NGwyX291dHB1dCkKKyNkZWZpbmUgVklESU9DX0dfQVVET1VUCQkgX0lPUignVicsIDQ5LCBzdHJ1Y3QgdjRsMl9hdWRpb291dCkKKyNkZWZpbmUgVklESU9DX1NfQVVET1VUCQkgX0lPVygnVicsIDUwLCBzdHJ1Y3QgdjRsMl9hdWRpb291dCkKKyNkZWZpbmUgVklESU9DX0dfTU9EVUxBVE9SCV9JT1dSKCdWJywgNTQsIHN0cnVjdCB2NGwyX21vZHVsYXRvcikKKyNkZWZpbmUgVklESU9DX1NfTU9EVUxBVE9SCSBfSU9XKCdWJywgNTUsIHN0cnVjdCB2NGwyX21vZHVsYXRvcikKKyNkZWZpbmUgVklESU9DX0dfRlJFUVVFTkNZCV9JT1dSKCdWJywgNTYsIHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSkKKyNkZWZpbmUgVklESU9DX1NfRlJFUVVFTkNZCSBfSU9XKCdWJywgNTcsIHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSkKKyNkZWZpbmUgVklESU9DX0NST1BDQVAJCV9JT1dSKCdWJywgNTgsIHN0cnVjdCB2NGwyX2Nyb3BjYXApCisjZGVmaW5lIFZJRElPQ19HX0NST1AJCV9JT1dSKCdWJywgNTksIHN0cnVjdCB2NGwyX2Nyb3ApCisjZGVmaW5lIFZJRElPQ19TX0NST1AJCSBfSU9XKCdWJywgNjAsIHN0cnVjdCB2NGwyX2Nyb3ApCisjZGVmaW5lIFZJRElPQ19HX0pQRUdDT01QCSBfSU9SKCdWJywgNjEsIHN0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbikKKyNkZWZpbmUgVklESU9DX1NfSlBFR0NPTVAJIF9JT1coJ1YnLCA2Miwgc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uKQorI2RlZmluZSBWSURJT0NfUVVFUllTVEQgICAgICAJIF9JT1IoJ1YnLCA2MywgdjRsMl9zdGRfaWQpCisjZGVmaW5lIFZJRElPQ19UUllfRk1UICAgICAgCV9JT1dSKCdWJywgNjQsIHN0cnVjdCB2NGwyX2Zvcm1hdCkKKyNkZWZpbmUgVklESU9DX0VOVU1BVURJTwlfSU9XUignVicsIDY1LCBzdHJ1Y3QgdjRsMl9hdWRpbykKKyNkZWZpbmUgVklESU9DX0VOVU1BVURPVVQJX0lPV1IoJ1YnLCA2Niwgc3RydWN0IHY0bDJfYXVkaW9vdXQpCisjZGVmaW5lIFZJRElPQ19HX1BSSU9SSVRZICAgICAgICBfSU9SKCdWJywgNjcsIGVudW0gdjRsMl9wcmlvcml0eSkKKyNkZWZpbmUgVklESU9DX1NfUFJJT1JJVFkgICAgICAgIF9JT1coJ1YnLCA2OCwgZW51bSB2NGwyX3ByaW9yaXR5KQorI2RlZmluZSBWSURJT0NfR19TTElDRURfVkJJX0NBUCBfSU9XUignVicsIDY5LCBzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2NhcCkKKyNkZWZpbmUgVklESU9DX0xPR19TVEFUVVMgICAgICAgICBfSU8oJ1YnLCA3MCkKKyNkZWZpbmUgVklESU9DX0dfRVhUX0NUUkxTCV9JT1dSKCdWJywgNzEsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scykKKyNkZWZpbmUgVklESU9DX1NfRVhUX0NUUkxTCV9JT1dSKCdWJywgNzIsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scykKKyNkZWZpbmUgVklESU9DX1RSWV9FWFRfQ1RSTFMJX0lPV1IoJ1YnLCA3Mywgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzKQorI2lmIDEKKyNkZWZpbmUgVklESU9DX0VOVU1fRlJBTUVTSVpFUwlfSU9XUignVicsIDc0LCBzdHJ1Y3QgdjRsMl9mcm1zaXplZW51bSkKKyNkZWZpbmUgVklESU9DX0VOVU1fRlJBTUVJTlRFUlZBTFMgX0lPV1IoJ1YnLCA3NSwgc3RydWN0IHY0bDJfZnJtaXZhbGVudW0pCisjZGVmaW5lIFZJRElPQ19HX0VOQ19JTkRFWCAgICAgICBfSU9SKCdWJywgNzYsIHN0cnVjdCB2NGwyX2VuY19pZHgpCisjZGVmaW5lIFZJRElPQ19FTkNPREVSX0NNRCAgICAgIF9JT1dSKCdWJywgNzcsIHN0cnVjdCB2NGwyX2VuY29kZXJfY21kKQorI2RlZmluZSBWSURJT0NfVFJZX0VOQ09ERVJfQ01EICBfSU9XUignVicsIDc4LCBzdHJ1Y3QgdjRsMl9lbmNvZGVyX2NtZCkKKyNlbmRpZgorCisjaWYgMQorLyogRXhwZXJpbWVudGFsLCBtZWFudCBmb3IgZGVidWdnaW5nLCB0ZXN0aW5nIGFuZCBpbnRlcm5hbCB1c2UuCisgICBPbmx5IGltcGxlbWVudGVkIGlmIENPTkZJR19WSURFT19BRFZfREVCVUcgaXMgZGVmaW5lZC4KKyAgIFlvdSBtdXN0IGJlIHJvb3QgdG8gdXNlIHRoZXNlIGlvY3Rscy4gTmV2ZXIgdXNlIHRoZXNlIGluIGFwcGxpY2F0aW9ucyEgKi8KKyNkZWZpbmUJVklESU9DX0RCR19TX1JFR0lTVEVSIAkgX0lPVygnVicsIDc5LCBzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIpCisjZGVmaW5lCVZJRElPQ19EQkdfR19SRUdJU1RFUiAJX0lPV1IoJ1YnLCA4MCwgc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyKQorCisvKiBFeHBlcmltZW50YWwsIG1lYW50IGZvciBkZWJ1Z2dpbmcsIHRlc3RpbmcgYW5kIGludGVybmFsIHVzZS4KKyAgIE5ldmVyIHVzZSB0aGlzIGlvY3RsIGluIGFwcGxpY2F0aW9ucyEgKi8KKyNkZWZpbmUgVklESU9DX0RCR19HX0NISVBfSURFTlQgX0lPV1IoJ1YnLCA4MSwgc3RydWN0IHY0bDJfZGJnX2NoaXBfaWRlbnQpCisjZW5kaWYKKworI2RlZmluZSBWSURJT0NfU19IV19GUkVRX1NFRUsJIF9JT1coJ1YnLCA4Miwgc3RydWN0IHY0bDJfaHdfZnJlcV9zZWVrKQorI2RlZmluZQlWSURJT0NfRU5VTV9EVl9QUkVTRVRTCV9JT1dSKCdWJywgODMsIHN0cnVjdCB2NGwyX2R2X2VudW1fcHJlc2V0KQorI2RlZmluZQlWSURJT0NfU19EVl9QUkVTRVQJX0lPV1IoJ1YnLCA4NCwgc3RydWN0IHY0bDJfZHZfcHJlc2V0KQorI2RlZmluZQlWSURJT0NfR19EVl9QUkVTRVQJX0lPV1IoJ1YnLCA4NSwgc3RydWN0IHY0bDJfZHZfcHJlc2V0KQorI2RlZmluZQlWSURJT0NfUVVFUllfRFZfUFJFU0VUCV9JT1IoJ1YnLCAgODYsIHN0cnVjdCB2NGwyX2R2X3ByZXNldCkKKyNkZWZpbmUJVklESU9DX1NfRFZfVElNSU5HUwlfSU9XUignVicsIDg3LCBzdHJ1Y3QgdjRsMl9kdl90aW1pbmdzKQorI2RlZmluZQlWSURJT0NfR19EVl9USU1JTkdTCV9JT1dSKCdWJywgODgsIHN0cnVjdCB2NGwyX2R2X3RpbWluZ3MpCisjZGVmaW5lCVZJRElPQ19EUUVWRU5UCQkgX0lPUignVicsIDg5LCBzdHJ1Y3QgdjRsMl9ldmVudCkKKyNkZWZpbmUJVklESU9DX1NVQlNDUklCRV9FVkVOVAkgX0lPVygnVicsIDkwLCBzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24pCisjZGVmaW5lCVZJRElPQ19VTlNVQlNDUklCRV9FVkVOVCBfSU9XKCdWJywgOTEsIHN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbikKKworLyogRXhwZXJpbWVudGFsLCB0aGUgYmVsb3cgdHdvIGlvY3RscyBtYXkgY2hhbmdlIG92ZXIgdGhlIG5leHQgY291cGxlIG9mIGtlcm5lbAorICAgdmVyc2lvbnMgKi8KKyNkZWZpbmUgVklESU9DX0NSRUFURV9CVUZTCV9JT1dSKCdWJywgOTIsIHN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzKQorI2RlZmluZSBWSURJT0NfUFJFUEFSRV9CVUYJX0lPV1IoJ1YnLCA5Mywgc3RydWN0IHY0bDJfYnVmZmVyKQorCisvKiBSZW1pbmRlcjogd2hlbiBhZGRpbmcgbmV3IGlvY3RscyBwbGVhc2UgYWRkIHN1cHBvcnQgZm9yIHRoZW0gdG8KKyAgIGRyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21wYXQtaW9jdGwzMi5jIGFzIHdlbGwhICovCisKKyNkZWZpbmUgQkFTRV9WSURJT0NfUFJJVkFURQkxOTIJCS8qIDE5Mi0yNTUgYXJlIHByaXZhdGUgKi8KKworI2VuZGlmIC8qIF9fTElOVVhfVklERU9ERVYyX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvXzlwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpcnRpb185cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3N2M0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpcnRpb185cC5oCkBAIC0wLDAgKzEsNDQgQEAKKyNpZm5kZWYgX0xJTlVYX1ZJUlRJT185UF9ICisjZGVmaW5lIF9MSU5VWF9WSVJUSU9fOVBfSAorLyogVGhpcyBoZWFkZXIgaXMgQlNEIGxpY2Vuc2VkIHNvIGFueW9uZSBjYW4gdXNlIHRoZSBkZWZpbml0aW9ucyB0byBpbXBsZW1lbnQKKyAqIGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBJQk0gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIElCTSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLiAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmlydGlvX2lkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19jb25maWcuaD4KKworLyogVGhlIGZlYXR1cmUgYml0bWFwIGZvciB2aXJ0aW8gOVAgKi8KKworLyogVGhlIG1vdW50IHBvaW50IGlzIHNwZWNpZmllZCBpbiBhIGNvbmZpZyB2YXJpYWJsZSAqLworI2RlZmluZSBWSVJUSU9fOVBfTU9VTlRfVEFHIDAKKworc3RydWN0IHZpcnRpb185cF9jb25maWcgeworCS8qIGxlbmd0aCBvZiB0aGUgdGFnIG5hbWUgKi8KKwlfX3UxNiB0YWdfbGVuOworCS8qIG5vbi1OVUxMIHRlcm1pbmF0ZWQgdGFnIG5hbWUgKi8KKwlfX3U4IHRhZ1swXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNlbmRpZiAvKiBfTElOVVhfVklSVElPXzlQX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX2JhbGxvb24uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX2JhbGxvb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTJkYzhiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fYmFsbG9vbi5oCkBAIC0wLDAgKzEsNTkgQEAKKyNpZm5kZWYgX0xJTlVYX1ZJUlRJT19CQUxMT09OX0gKKyNkZWZpbmUgX0xJTlVYX1ZJUlRJT19CQUxMT09OX0gKKy8qIFRoaXMgaGVhZGVyIGlzIEJTRCBsaWNlbnNlZCBzbyBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50CisgKiBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVycy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSUJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4gKi8KKyNpbmNsdWRlIDxsaW51eC92aXJ0aW9faWRzLmg+CisjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbmZpZy5oPgorCisvKiBUaGUgZmVhdHVyZSBiaXRtYXAgZm9yIHZpcnRpbyBiYWxsb29uICovCisjZGVmaW5lIFZJUlRJT19CQUxMT09OX0ZfTVVTVF9URUxMX0hPU1QJMCAvKiBUZWxsIGJlZm9yZSByZWNsYWltaW5nIHBhZ2VzICovCisjZGVmaW5lIFZJUlRJT19CQUxMT09OX0ZfU1RBVFNfVlEJMSAvKiBNZW1vcnkgU3RhdHMgdmlydHF1ZXVlICovCisKKy8qIFNpemUgb2YgYSBQRk4gaW4gdGhlIGJhbGxvb24gaW50ZXJmYWNlLiAqLworI2RlZmluZSBWSVJUSU9fQkFMTE9PTl9QRk5fU0hJRlQgMTIKKworc3RydWN0IHZpcnRpb19iYWxsb29uX2NvbmZpZworeworCS8qIE51bWJlciBvZiBwYWdlcyBob3N0IHdhbnRzIEd1ZXN0IHRvIGdpdmUgdXAuICovCisJX19sZTMyIG51bV9wYWdlczsKKwkvKiBOdW1iZXIgb2YgcGFnZXMgd2UndmUgYWN0dWFsbHkgZ290IGluIGJhbGxvb24uICovCisJX19sZTMyIGFjdHVhbDsKK307CisKKyNkZWZpbmUgVklSVElPX0JBTExPT05fU19TV0FQX0lOICAwICAgLyogQW1vdW50IG9mIG1lbW9yeSBzd2FwcGVkIGluICovCisjZGVmaW5lIFZJUlRJT19CQUxMT09OX1NfU1dBUF9PVVQgMSAgIC8qIEFtb3VudCBvZiBtZW1vcnkgc3dhcHBlZCBvdXQgKi8KKyNkZWZpbmUgVklSVElPX0JBTExPT05fU19NQUpGTFQgICAyICAgLyogTnVtYmVyIG9mIG1ham9yIGZhdWx0cyAqLworI2RlZmluZSBWSVJUSU9fQkFMTE9PTl9TX01JTkZMVCAgIDMgICAvKiBOdW1iZXIgb2YgbWlub3IgZmF1bHRzICovCisjZGVmaW5lIFZJUlRJT19CQUxMT09OX1NfTUVNRlJFRSAgNCAgIC8qIFRvdGFsIGFtb3VudCBvZiBmcmVlIG1lbW9yeSAqLworI2RlZmluZSBWSVJUSU9fQkFMTE9PTl9TX01FTVRPVCAgIDUgICAvKiBUb3RhbCBhbW91bnQgb2YgbWVtb3J5ICovCisjZGVmaW5lIFZJUlRJT19CQUxMT09OX1NfTlIgICAgICAgNgorCitzdHJ1Y3QgdmlydGlvX2JhbGxvb25fc3RhdCB7CisJdTE2IHRhZzsKKwl1NjQgdmFsOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2VuZGlmIC8qIF9MSU5VWF9WSVJUSU9fQkFMTE9PTl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpcnRpb19ibGsuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX2Jsay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZWRiNDAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpcnRpb19ibGsuaApAQCAtMCwwICsxLDEyMiBAQAorI2lmbmRlZiBfTElOVVhfVklSVElPX0JMS19ICisjZGVmaW5lIF9MSU5VWF9WSVJUSU9fQkxLX0gKKy8qIFRoaXMgaGVhZGVyIGlzIEJTRCBsaWNlbnNlZCBzbyBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50CisgKiBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVycy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSUJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4gKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19pZHMuaD4KKyNpbmNsdWRlIDxsaW51eC92aXJ0aW9fY29uZmlnLmg+CisKKy8qIEZlYXR1cmUgYml0cyAqLworI2RlZmluZSBWSVJUSU9fQkxLX0ZfQkFSUklFUgkwCS8qIERvZXMgaG9zdCBzdXBwb3J0IGJhcnJpZXJzPyAqLworI2RlZmluZSBWSVJUSU9fQkxLX0ZfU0laRV9NQVgJMQkvKiBJbmRpY2F0ZXMgbWF4aW11bSBzZWdtZW50IHNpemUgKi8KKyNkZWZpbmUgVklSVElPX0JMS19GX1NFR19NQVgJMgkvKiBJbmRpY2F0ZXMgbWF4aW11bSAjIG9mIHNlZ21lbnRzICovCisjZGVmaW5lIFZJUlRJT19CTEtfRl9HRU9NRVRSWQk0CS8qIExlZ2FjeSBnZW9tZXRyeSBhdmFpbGFibGUgICovCisjZGVmaW5lIFZJUlRJT19CTEtfRl9STwkJNQkvKiBEaXNrIGlzIHJlYWQtb25seSAqLworI2RlZmluZSBWSVJUSU9fQkxLX0ZfQkxLX1NJWkUJNgkvKiBCbG9jayBzaXplIG9mIGRpc2sgaXMgYXZhaWxhYmxlKi8KKyNkZWZpbmUgVklSVElPX0JMS19GX1NDU0kJNwkvKiBTdXBwb3J0cyBzY3NpIGNvbW1hbmQgcGFzc3RocnUgKi8KKyNkZWZpbmUgVklSVElPX0JMS19GX0ZMVVNICTkJLyogQ2FjaGUgZmx1c2ggY29tbWFuZCBzdXBwb3J0ICovCisjZGVmaW5lIFZJUlRJT19CTEtfRl9UT1BPTE9HWQkxMAkvKiBUb3BvbG9neSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgKi8KKworI2RlZmluZSBWSVJUSU9fQkxLX0lEX0JZVEVTCTIwCS8qIElEIHN0cmluZyBsZW5ndGggKi8KKworc3RydWN0IHZpcnRpb19ibGtfY29uZmlnIHsKKwkvKiBUaGUgY2FwYWNpdHkgKGluIDUxMi1ieXRlIHNlY3RvcnMpLiAqLworCV9fdTY0IGNhcGFjaXR5OworCS8qIFRoZSBtYXhpbXVtIHNlZ21lbnQgc2l6ZSAoaWYgVklSVElPX0JMS19GX1NJWkVfTUFYKSAqLworCV9fdTMyIHNpemVfbWF4OworCS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWdtZW50cyAoaWYgVklSVElPX0JMS19GX1NFR19NQVgpICovCisJX191MzIgc2VnX21heDsKKwkvKiBnZW9tZXRyeSB0aGUgZGV2aWNlIChpZiBWSVJUSU9fQkxLX0ZfR0VPTUVUUlkpICovCisJc3RydWN0IHZpcnRpb19ibGtfZ2VvbWV0cnkgeworCQlfX3UxNiBjeWxpbmRlcnM7CisJCV9fdTggaGVhZHM7CisJCV9fdTggc2VjdG9yczsKKwl9IGdlb21ldHJ5OworCisJLyogYmxvY2sgc2l6ZSBvZiBkZXZpY2UgKGlmIFZJUlRJT19CTEtfRl9CTEtfU0laRSkgKi8KKwlfX3UzMiBibGtfc2l6ZTsKKworCS8qIHRoZSBuZXh0IDQgZW50cmllcyBhcmUgZ3VhcmRlZCBieSBWSVJUSU9fQkxLX0ZfVE9QT0xPR1kgICovCisJLyogZXhwb25lbnQgZm9yIHBoeXNpY2FsIGJsb2NrIHBlciBsb2dpY2FsIGJsb2NrLiAqLworCV9fdTggcGh5c2ljYWxfYmxvY2tfZXhwOworCS8qIGFsaWdubWVudCBvZmZzZXQgaW4gbG9naWNhbCBibG9ja3MuICovCisJX191OCBhbGlnbm1lbnRfb2Zmc2V0OworCS8qIG1pbmltdW0gSS9PIHNpemUgd2l0aG91dCBwZXJmb3JtYW5jZSBwZW5hbHR5IGluIGxvZ2ljYWwgYmxvY2tzLiAqLworCV9fdTE2IG1pbl9pb19zaXplOworCS8qIG9wdGltYWwgc3VzdGFpbmVkIEkvTyBzaXplIGluIGxvZ2ljYWwgYmxvY2tzLiAqLworCV9fdTMyIG9wdF9pb19zaXplOworCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKgorICogQ29tbWFuZCB0eXBlcworICoKKyAqIFVzYWdlIGlzIGEgYml0IHRyaWNreSBhcyBzb21lIGJpdHMgYXJlIHVzZWQgYXMgZmxhZ3MgYW5kIHNvbWUgYXJlIG5vdC4KKyAqCisgKiBSdWxlczoKKyAqICAgVklSVElPX0JMS19UX09VVCBtYXkgYmUgY29tYmluZWQgd2l0aCBWSVJUSU9fQkxLX1RfU0NTSV9DTUQgb3IKKyAqICAgVklSVElPX0JMS19UX0JBUlJJRVIuICBWSVJUSU9fQkxLX1RfRkxVU0ggaXMgYSBjb21tYW5kIG9mIGl0cyBvd24KKyAqICAgYW5kIG1heSBub3QgYmUgY29tYmluZWQgd2l0aCBhbnkgb2YgdGhlIG90aGVyIGZsYWdzLgorICovCisKKy8qIFRoZXNlIHR3byBkZWZpbmUgZGlyZWN0aW9uLiAqLworI2RlZmluZSBWSVJUSU9fQkxLX1RfSU4JCTAKKyNkZWZpbmUgVklSVElPX0JMS19UX09VVAkxCisKKy8qIFRoaXMgYml0IHNheXMgaXQncyBhIHNjc2kgY29tbWFuZCwgbm90IGFuIGFjdHVhbCByZWFkIG9yIHdyaXRlLiAqLworI2RlZmluZSBWSVJUSU9fQkxLX1RfU0NTSV9DTUQJMgorCisvKiBDYWNoZSBmbHVzaCBjb21tYW5kICovCisjZGVmaW5lIFZJUlRJT19CTEtfVF9GTFVTSAk0CisKKy8qIEdldCBkZXZpY2UgSUQgY29tbWFuZCAqLworI2RlZmluZSBWSVJUSU9fQkxLX1RfR0VUX0lEICAgIDgKKworLyogQmFycmllciBiZWZvcmUgdGhpcyBvcC4gKi8KKyNkZWZpbmUgVklSVElPX0JMS19UX0JBUlJJRVIJMHg4MDAwMDAwMAorCisvKiBUaGlzIGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSByZWFkIHNjYXR0ZXItZ2F0aGVyIGxpc3QuICovCitzdHJ1Y3QgdmlydGlvX2Jsa19vdXRoZHIgeworCS8qIFZJUlRJT19CTEtfVCogKi8KKwlfX3UzMiB0eXBlOworCS8qIGlvIHByaW9yaXR5LiAqLworCV9fdTMyIGlvcHJpbzsKKwkvKiBTZWN0b3IgKGllLiA1MTIgYnl0ZSBvZmZzZXQpICovCisJX191NjQgc2VjdG9yOworfTsKKworc3RydWN0IHZpcnRpb19zY3NpX2luaGRyIHsKKwlfX3UzMiBlcnJvcnM7CisJX191MzIgZGF0YV9sZW47CisJX191MzIgc2Vuc2VfbGVuOworCV9fdTMyIHJlc2lkdWFsOworfTsKKworLyogQW5kIHRoaXMgaXMgdGhlIGZpbmFsIGJ5dGUgb2YgdGhlIHdyaXRlIHNjYXR0ZXItZ2F0aGVyIGxpc3QuICovCisjZGVmaW5lIFZJUlRJT19CTEtfU19PSwkJMAorI2RlZmluZSBWSVJUSU9fQkxLX1NfSU9FUlIJMQorI2RlZmluZSBWSVJUSU9fQkxLX1NfVU5TVVBQCTIKKyNlbmRpZiAvKiBfTElOVVhfVklSVElPX0JMS19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpcnRpb19jb25maWcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNTFkOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpcnRpb19jb25maWcuaApAQCAtMCwwICsxLDU0IEBACisjaWZuZGVmIF9MSU5VWF9WSVJUSU9fQ09ORklHX0gKKyNkZWZpbmUgX0xJTlVYX1ZJUlRJT19DT05GSUdfSAorLyogVGhpcyBoZWFkZXIsIGV4Y2x1ZGluZyB0aGUgI2lmZGVmIF9fS0VSTkVMX18gcGFydCwgaXMgQlNEIGxpY2Vuc2VkIHNvCisgKiBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50IGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBJQk0gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIElCTSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLiAqLworCisvKiBWaXJ0aW8gZGV2aWNlcyB1c2UgYSBzdGFuZGFyZGl6ZWQgY29uZmlndXJhdGlvbiBzcGFjZSB0byBkZWZpbmUgdGhlaXIKKyAqIGZlYXR1cmVzIGFuZCBwYXNzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24sIGJ1dCBlYWNoIGltcGxlbWVudGF0aW9uIGNhbgorICogc3RvcmUgYW5kIGFjY2VzcyB0aGF0IHNwYWNlIGRpZmZlcmVudGx5LiAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIFN0YXR1cyBieXRlIGZvciBndWVzdCB0byByZXBvcnQgcHJvZ3Jlc3MsIGFuZCBzeW5jaHJvbml6ZSBmZWF0dXJlcy4gKi8KKy8qIFdlIGhhdmUgc2VlbiBkZXZpY2UgYW5kIHByb2Nlc3NlZCBnZW5lcmljIGZpZWxkcyAoVklSVElPX0NPTkZJR19GX1ZJUlRJTykgKi8KKyNkZWZpbmUgVklSVElPX0NPTkZJR19TX0FDS05PV0xFREdFCTEKKy8qIFdlIGhhdmUgZm91bmQgYSBkcml2ZXIgZm9yIHRoZSBkZXZpY2UuICovCisjZGVmaW5lIFZJUlRJT19DT05GSUdfU19EUklWRVIJCTIKKy8qIERyaXZlciBoYXMgdXNlZCBpdHMgcGFydHMgb2YgdGhlIGNvbmZpZywgYW5kIGlzIGhhcHB5ICovCisjZGVmaW5lIFZJUlRJT19DT05GSUdfU19EUklWRVJfT0sJNAorLyogV2UndmUgZ2l2ZW4gdXAgb24gdGhpcyBkZXZpY2UuICovCisjZGVmaW5lIFZJUlRJT19DT05GSUdfU19GQUlMRUQJCTB4ODAKKworLyogU29tZSB2aXJ0aW8gZmVhdHVyZSBiaXRzIChjdXJyZW50bHkgYml0cyAyOCB0aHJvdWdoIDMxKSBhcmUgcmVzZXJ2ZWQgZm9yIHRoZQorICogdHJhbnNwb3J0IGJlaW5nIHVzZWQgKGVnLiB2aXJ0aW9fcmluZyksIHRoZSByZXN0IGFyZSBwZXItZGV2aWNlIGZlYXR1cmUKKyAqIGJpdHMuICovCisjZGVmaW5lIFZJUlRJT19UUkFOU1BPUlRfRl9TVEFSVAkyOAorI2RlZmluZSBWSVJUSU9fVFJBTlNQT1JUX0ZfRU5ECQkzMgorCisvKiBEbyB3ZSBnZXQgY2FsbGJhY2tzIHdoZW4gdGhlIHJpbmcgaXMgY29tcGxldGVseSB1c2VkLCBldmVuIGlmIHdlJ3ZlCisgKiBzdXBwcmVzc2VkIHRoZW0/ICovCisjZGVmaW5lIFZJUlRJT19GX05PVElGWV9PTl9FTVBUWQkyNAorCisjZW5kaWYgLyogX0xJTlVYX1ZJUlRJT19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fY29uc29sZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fY29uc29sZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTRlMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpcnRpb19jb25zb2xlLmgKQEAgLTAsMCArMSw3NCBAQAorI2lmbmRlZiBfTElOVVhfVklSVElPX0NPTlNPTEVfSAorI2RlZmluZSBfTElOVVhfVklSVElPX0NPTlNPTEVfSAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmlydGlvX2lkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19jb25maWcuaD4KKy8qCisgKiBUaGlzIGhlYWRlciwgZXhjbHVkaW5nIHRoZSAjaWZkZWYgX19LRVJORUxfXyBwYXJ0LCBpcyBCU0QgbGljZW5zZWQgc28KKyAqIGFueW9uZSBjYW4gdXNlIHRoZSBkZWZpbml0aW9ucyB0byBpbXBsZW1lbnQgY29tcGF0aWJsZSBkcml2ZXJzL3NlcnZlcnM6CisgKgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBJQk0gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIElCTSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIENvcHlyaWdodCAoQykgUmVkIEhhdCwgSW5jLiwgMjAwOSwgMjAxMCwgMjAxMQorICogQ29weXJpZ2h0IChDKSBBbWl0IFNoYWggPGFtaXQuc2hhaEByZWRoYXQuY29tPiwgMjAwOSwgMjAxMCwgMjAxMQorICovCisKKy8qIEZlYXR1cmUgYml0cyAqLworI2RlZmluZSBWSVJUSU9fQ09OU09MRV9GX1NJWkUJMAkvKiBEb2VzIGhvc3QgcHJvdmlkZSBjb25zb2xlIHNpemU/ICovCisjZGVmaW5lIFZJUlRJT19DT05TT0xFX0ZfTVVMVElQT1JUIDEJLyogRG9lcyBob3N0IHByb3ZpZGUgbXVsdGlwbGUgcG9ydHM/ICovCisKKyNkZWZpbmUgVklSVElPX0NPTlNPTEVfQkFEX0lECQkofih1MzIpMCkKKworc3RydWN0IHZpcnRpb19jb25zb2xlX2NvbmZpZyB7CisJLyogY29sdW1zIG9mIHRoZSBzY3JlZW5zICovCisJX191MTYgY29sczsKKwkvKiByb3dzIG9mIHRoZSBzY3JlZW5zICovCisJX191MTYgcm93czsKKwkvKiBtYXguIG51bWJlciBvZiBwb3J0cyB0aGlzIGRldmljZSBjYW4gaG9sZCAqLworCV9fdTMyIG1heF9ucl9wb3J0czsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qCisgKiBBIG1lc3NhZ2UgdGhhdCdzIHBhc3NlZCBiZXR3ZWVuIHRoZSBIb3N0IGFuZCB0aGUgR3Vlc3QgZm9yIGEKKyAqIHBhcnRpY3VsYXIgcG9ydC4KKyAqLworc3RydWN0IHZpcnRpb19jb25zb2xlX2NvbnRyb2wgeworCV9fdTMyIGlkOwkJLyogUG9ydCBudW1iZXIgKi8KKwlfX3UxNiBldmVudDsJCS8qIFRoZSBraW5kIG9mIGNvbnRyb2wgZXZlbnQgKHNlZSBiZWxvdykgKi8KKwlfX3UxNiB2YWx1ZTsJCS8qIEV4dHJhIGluZm9ybWF0aW9uIGZvciB0aGUga2V5ICovCit9OworCisvKiBTb21lIGV2ZW50cyBmb3IgY29udHJvbCBtZXNzYWdlcyAqLworI2RlZmluZSBWSVJUSU9fQ09OU09MRV9ERVZJQ0VfUkVBRFkJMAorI2RlZmluZSBWSVJUSU9fQ09OU09MRV9QT1JUX0FERAkJMQorI2RlZmluZSBWSVJUSU9fQ09OU09MRV9QT1JUX1JFTU9WRQkyCisjZGVmaW5lIFZJUlRJT19DT05TT0xFX1BPUlRfUkVBRFkJMworI2RlZmluZSBWSVJUSU9fQ09OU09MRV9DT05TT0xFX1BPUlQJNAorI2RlZmluZSBWSVJUSU9fQ09OU09MRV9SRVNJWkUJCTUKKyNkZWZpbmUgVklSVElPX0NPTlNPTEVfUE9SVF9PUEVOCTYKKyNkZWZpbmUgVklSVElPX0NPTlNPTEVfUE9SVF9OQU1FCTcKKworCisjZW5kaWYgLyogX0xJTlVYX1ZJUlRJT19DT05TT0xFX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX2lkcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9faWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODViYjBiYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX2lkcy5oCkBAIC0wLDAgKzEsMzkgQEAKKyNpZm5kZWYgX0xJTlVYX1ZJUlRJT19JRFNfSAorI2RlZmluZSBfTElOVVhfVklSVElPX0lEU19ICisvKgorICogVmlydGlvIElEcworICoKKyAqIFRoaXMgaGVhZGVyIGlzIEJTRCBsaWNlbnNlZCBzbyBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50CisgKiBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVycy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSUJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4gKi8KKworI2RlZmluZSBWSVJUSU9fSURfTkVUCQkxIC8qIHZpcnRpbyBuZXQgKi8KKyNkZWZpbmUgVklSVElPX0lEX0JMT0NLCQkyIC8qIHZpcnRpbyBibG9jayAqLworI2RlZmluZSBWSVJUSU9fSURfQ09OU09MRQkzIC8qIHZpcnRpbyBjb25zb2xlICovCisjZGVmaW5lIFZJUlRJT19JRF9STkcJCTQgLyogdmlydGlvIHJpbmcgKi8KKyNkZWZpbmUgVklSVElPX0lEX0JBTExPT04JNSAvKiB2aXJ0aW8gYmFsbG9vbiAqLworI2RlZmluZSBWSVJUSU9fSURfOVAJCTkgLyogOXAgdmlydGlvIGNvbnNvbGUgKi8KKworI2VuZGlmIC8qIF9MSU5VWF9WSVJUSU9fSURTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX25ldC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fbmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcwZDVhMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX25ldC5oCkBAIC0wLDAgKzEsMTU1IEBACisjaWZuZGVmIF9MSU5VWF9WSVJUSU9fTkVUX0gKKyNkZWZpbmUgX0xJTlVYX1ZJUlRJT19ORVRfSAorLyogVGhpcyBoZWFkZXIgaXMgQlNEIGxpY2Vuc2VkIHNvIGFueW9uZSBjYW4gdXNlIHRoZSBkZWZpbml0aW9ucyB0byBpbXBsZW1lbnQKKyAqIGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBJQk0gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIElCTSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLiAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmlydGlvX2lkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorCisvKiBUaGUgZmVhdHVyZSBiaXRtYXAgZm9yIHZpcnRpbyBuZXQgKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX0NTVU0JMAkvKiBIb3N0IGhhbmRsZXMgcGt0cyB3LyBwYXJ0aWFsIGNzdW0gKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX0dVRVNUX0NTVU0JMQkvKiBHdWVzdCBoYW5kbGVzIHBrdHMgdy8gcGFydGlhbCBjc3VtICovCisjZGVmaW5lIFZJUlRJT19ORVRfRl9NQUMJNQkvKiBIb3N0IGhhcyBnaXZlbiBNQUMgYWRkcmVzcy4gKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX0dTTwk2CS8qIEhvc3QgaGFuZGxlcyBwa3RzIHcvIGFueSBHU08gdHlwZSAqLworI2RlZmluZSBWSVJUSU9fTkVUX0ZfR1VFU1RfVFNPNAk3CS8qIEd1ZXN0IGNhbiBoYW5kbGUgVFNPdjQgaW4uICovCisjZGVmaW5lIFZJUlRJT19ORVRfRl9HVUVTVF9UU082CTgJLyogR3Vlc3QgY2FuIGhhbmRsZSBUU092NiBpbi4gKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX0dVRVNUX0VDTgk5CS8qIEd1ZXN0IGNhbiBoYW5kbGUgVFNPWzZdIHcvIEVDTiBpbi4gKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX0dVRVNUX1VGTwkxMAkvKiBHdWVzdCBjYW4gaGFuZGxlIFVGTyBpbi4gKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX0hPU1RfVFNPNAkxMQkvKiBIb3N0IGNhbiBoYW5kbGUgVFNPdjQgaW4uICovCisjZGVmaW5lIFZJUlRJT19ORVRfRl9IT1NUX1RTTzYJMTIJLyogSG9zdCBjYW4gaGFuZGxlIFRTT3Y2IGluLiAqLworI2RlZmluZSBWSVJUSU9fTkVUX0ZfSE9TVF9FQ04JMTMJLyogSG9zdCBjYW4gaGFuZGxlIFRTT1s2XSB3LyBFQ04gaW4uICovCisjZGVmaW5lIFZJUlRJT19ORVRfRl9IT1NUX1VGTwkxNAkvKiBIb3N0IGNhbiBoYW5kbGUgVUZPIGluLiAqLworI2RlZmluZSBWSVJUSU9fTkVUX0ZfTVJHX1JYQlVGCTE1CS8qIEhvc3QgY2FuIG1lcmdlIHJlY2VpdmUgYnVmZmVycy4gKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX1NUQVRVUwkxNgkvKiB2aXJ0aW9fbmV0X2NvbmZpZy5zdGF0dXMgYXZhaWxhYmxlICovCisjZGVmaW5lIFZJUlRJT19ORVRfRl9DVFJMX1ZRCTE3CS8qIENvbnRyb2wgY2hhbm5lbCBhdmFpbGFibGUgKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX0NUUkxfUlgJMTgJLyogQ29udHJvbCBjaGFubmVsIFJYIG1vZGUgc3VwcG9ydCAqLworI2RlZmluZSBWSVJUSU9fTkVUX0ZfQ1RSTF9WTEFOCTE5CS8qIENvbnRyb2wgY2hhbm5lbCBWTEFOIGZpbHRlcmluZyAqLworI2RlZmluZSBWSVJUSU9fTkVUX0ZfQ1RSTF9SWF9FWFRSQSAyMAkvKiBFeHRyYSBSWCBtb2RlIGNvbnRyb2wgc3VwcG9ydCAqLworCisjZGVmaW5lIFZJUlRJT19ORVRfU19MSU5LX1VQCTEJLyogTGluayBpcyB1cCAqLworCitzdHJ1Y3QgdmlydGlvX25ldF9jb25maWcgeworCS8qIFRoZSBjb25maWcgZGVmaW5pbmcgbWFjIGFkZHJlc3MgKGlmIFZJUlRJT19ORVRfRl9NQUMpICovCisJX191OCBtYWNbNl07CisJLyogU2VlIFZJUlRJT19ORVRfRl9TVEFUVVMgYW5kIFZJUlRJT19ORVRfU18qIGFib3ZlICovCisJX191MTYgc3RhdHVzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogVGhpcyBpcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgc2NhdHRlci1nYXRoZXIgbGlzdC4gIElmIHlvdSBkb24ndAorICogc3BlY2lmeSBHU08gb3IgQ1NVTSBmZWF0dXJlcywgeW91IGNhbiBzaW1wbHkgaWdub3JlIHRoZSBoZWFkZXIuICovCitzdHJ1Y3QgdmlydGlvX25ldF9oZHIgeworI2RlZmluZSBWSVJUSU9fTkVUX0hEUl9GX05FRURTX0NTVU0JMQkvLyBVc2UgY3N1bV9zdGFydCwgY3N1bV9vZmZzZXQKKyNkZWZpbmUgVklSVElPX05FVF9IRFJfRl9EQVRBX1ZBTElECTIJLy8gQ3N1bSBpcyB2YWxpZAorCV9fdTggZmxhZ3M7CisjZGVmaW5lIFZJUlRJT19ORVRfSERSX0dTT19OT05FCQkwCS8vIE5vdCBhIEdTTyBmcmFtZQorI2RlZmluZSBWSVJUSU9fTkVUX0hEUl9HU09fVENQVjQJMQkvLyBHU08gZnJhbWUsIElQdjQgVENQIChUU08pCisjZGVmaW5lIFZJUlRJT19ORVRfSERSX0dTT19VRFAJCTMJLy8gR1NPIGZyYW1lLCBJUHY0IFVEUCAoVUZPKQorI2RlZmluZSBWSVJUSU9fTkVUX0hEUl9HU09fVENQVjYJNAkvLyBHU08gZnJhbWUsIElQdjYgVENQCisjZGVmaW5lIFZJUlRJT19ORVRfSERSX0dTT19FQ04JCTB4ODAJLy8gVENQIGhhcyBFQ04gc2V0CisJX191OCBnc29fdHlwZTsKKwlfX3UxNiBoZHJfbGVuOwkJLyogRXRoZXJuZXQgKyBJUCArIHRjcC91ZHAgaGRycyAqLworCV9fdTE2IGdzb19zaXplOwkJLyogQnl0ZXMgdG8gYXBwZW5kIHRvIGhkcl9sZW4gcGVyIGZyYW1lICovCisJX191MTYgY3N1bV9zdGFydDsJLyogUG9zaXRpb24gdG8gc3RhcnQgY2hlY2tzdW1taW5nIGZyb20gKi8KKwlfX3UxNiBjc3VtX29mZnNldDsJLyogT2Zmc2V0IGFmdGVyIHRoYXQgdG8gcGxhY2UgY2hlY2tzdW0gKi8KK307CisKKy8qIFRoaXMgaXMgdGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlciB0byB1c2Ugd2hlbiB0aGUgTVJHX1JYQlVGCisgKiBmZWF0dXJlIGhhcyBiZWVuIG5lZ290aWF0ZWQuICovCitzdHJ1Y3QgdmlydGlvX25ldF9oZHJfbXJnX3J4YnVmIHsKKwlzdHJ1Y3QgdmlydGlvX25ldF9oZHIgaGRyOworCV9fdTE2IG51bV9idWZmZXJzOwkvKiBOdW1iZXIgb2YgbWVyZ2VkIHJ4IGJ1ZmZlcnMgKi8KK307CisKKy8qCisgKiBDb250cm9sIHZpcnRxdWV1ZSBkYXRhIHN0cnVjdHVyZXMKKyAqCisgKiBUaGUgY29udHJvbCB2aXJ0cXVldWUgZXhwZWN0cyBhIGhlYWRlciBpbiB0aGUgZmlyc3Qgc2cgZW50cnkKKyAqIGFuZCBhbiBhY2svc3RhdHVzIHJlc3BvbnNlIGluIHRoZSBsYXN0IGVudHJ5LiAgRGF0YSBmb3IgdGhlCisgKiBjb21tYW5kIGdvZXMgaW4gYmV0d2Vlbi4KKyAqLworc3RydWN0IHZpcnRpb19uZXRfY3RybF9oZHIgeworCV9fdTggY2xhc3M7CisJX191OCBjbWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCit0eXBlZGVmIF9fdTggdmlydGlvX25ldF9jdHJsX2FjazsKKworI2RlZmluZSBWSVJUSU9fTkVUX09LICAgICAwCisjZGVmaW5lIFZJUlRJT19ORVRfRVJSICAgIDEKKworLyoKKyAqIENvbnRyb2wgdGhlIFJYIG1vZGUsIGllLiBwcm9taXN1Y291cywgYWxsbXVsdGksIGV0Yy4uLgorICogQWxsIGNvbW1hbmRzIHJlcXVpcmUgYW4gIm91dCIgc2cgZW50cnkgY29udGFpbmluZyBhIDEgYnl0ZQorICogc3RhdGUgdmFsdWUsIHplcm8gPSBkaXNhYmxlLCBub24temVybyA9IGVuYWJsZS4gIENvbW1hbmRzCisgKiAwIGFuZCAxIGFyZSBzdXBwb3J0ZWQgd2l0aCB0aGUgVklSVElPX05FVF9GX0NUUkxfUlggZmVhdHVyZS4KKyAqIENvbW1hbmRzIDItNSBhcmUgYWRkZWQgd2l0aCBWSVJUSU9fTkVUX0ZfQ1RSTF9SWF9FWFRSQS4KKyAqLworI2RlZmluZSBWSVJUSU9fTkVUX0NUUkxfUlggICAgMAorICNkZWZpbmUgVklSVElPX05FVF9DVFJMX1JYX1BST01JU0MgICAgICAwCisgI2RlZmluZSBWSVJUSU9fTkVUX0NUUkxfUlhfQUxMTVVMVEkgICAgIDEKKyAjZGVmaW5lIFZJUlRJT19ORVRfQ1RSTF9SWF9BTExVTkkgICAgICAgMgorICNkZWZpbmUgVklSVElPX05FVF9DVFJMX1JYX05PTVVMVEkgICAgICAzCisgI2RlZmluZSBWSVJUSU9fTkVUX0NUUkxfUlhfTk9VTkkgICAgICAgIDQKKyAjZGVmaW5lIFZJUlRJT19ORVRfQ1RSTF9SWF9OT0JDQVNUICAgICAgNQorCisvKgorICogQ29udHJvbCB0aGUgTUFDIGZpbHRlciB0YWJsZS4KKyAqCisgKiBUaGUgTUFDIGZpbHRlciB0YWJsZSBpcyBtYW5hZ2VkIGJ5IHRoZSBoeXBlcnZpc29yLCB0aGUgZ3Vlc3Qgc2hvdWxkCisgKiBhc3N1bWUgdGhlIHNpemUgaXMgaW5maW5pdGUuICBGaWx0ZXJpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQKKyAqIG5vbi1wZXJmZWN0LCBpZS4gYmFzZWQgb24gaHlwZXJ2aXNvciByZXNvdXJjZXMsIHRoZSBndWVzdCBtYXkKKyAqIHJlY2VpdmVkIHBhY2tldHMgZnJvbSBzb3VyY2VzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGZpbHRlciBsaXN0LgorICoKKyAqIEluIGFkZGl0aW9uIHRvIHRoZSBjbGFzcy9jbWQgaGVhZGVyLCB0aGUgVEFCTEVfU0VUIGNvbW1hbmQgcmVxdWlyZXMKKyAqIHR3byBvdXQgc2NhdHRlcmxpc3RzLiAgRWFjaCBjb250YWlucyBhIDQgYnl0ZSBjb3VudCBvZiBlbnRyaWVzIGZvbGxvd2VkCisgKiBieSBhIGNvbmNhdGVuYXRlZCBieXRlIHN0cmVhbSBvZiB0aGUgRVRIX0FMRU4gTUFDIGFkZHJlc3Nlcy4gIFRoZQorICogZmlyc3Qgc2cgbGlzdCBjb250YWlucyB1bmljYXN0IGFkZHJlc3NlcywgdGhlIHNlY29uZCBpcyBmb3IgbXVsdGljYXN0LgorICogVGhpcyBmdW5jdGlvbmFsaXR5IGlzIHByZXNlbnQgaWYgdGhlIFZJUlRJT19ORVRfRl9DVFJMX1JYIGZlYXR1cmUKKyAqIGlzIGF2YWlsYWJsZS4KKyAqLworc3RydWN0IHZpcnRpb19uZXRfY3RybF9tYWMgeworCV9fdTMyIGVudHJpZXM7CisJX191OCBtYWNzW11bRVRIX0FMRU5dOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBWSVJUSU9fTkVUX0NUUkxfTUFDICAgIDEKKyAjZGVmaW5lIFZJUlRJT19ORVRfQ1RSTF9NQUNfVEFCTEVfU0VUICAgICAgICAwCisKKy8qCisgKiBDb250cm9sIFZMQU4gZmlsdGVyaW5nCisgKgorICogVGhlIFZMQU4gZmlsdGVyIHRhYmxlIGlzIGNvbnRyb2xsZWQgdmlhIGEgc2ltcGxlIEFERC9ERUwgaW50ZXJmYWNlLgorICogVkxBTiBJRHMgbm90IGFkZGVkIG1heSBiZSBmaWx0ZXJkIGJ5IHRoZSBoeXBlcnZpc29yLiAgRGVsIGlzIHRoZQorICogb3Bwb3NpdGUgb2YgYWRkLiAgQm90aCBjb21tYW5kcyBleHBlY3QgYW4gb3V0IGVudHJ5IGNvbnRhaW5pbmcgYSAyCisgKiBieXRlIFZMQU4gSUQuICBWTEFOIGZpbHRlcnRpbmcgaXMgYXZhaWxhYmxlIHdpdGggdGhlCisgKiBWSVJUSU9fTkVUX0ZfQ1RSTF9WTEFOIGZlYXR1cmUgYml0LgorICovCisjZGVmaW5lIFZJUlRJT19ORVRfQ1RSTF9WTEFOICAgICAgIDIKKyAjZGVmaW5lIFZJUlRJT19ORVRfQ1RSTF9WTEFOX0FERCAgICAgICAgICAgICAwCisgI2RlZmluZSBWSVJUSU9fTkVUX0NUUkxfVkxBTl9ERUwgICAgICAgICAgICAgMQorCisjZW5kaWYgLyogX0xJTlVYX1ZJUlRJT19ORVRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fcGNpLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpcnRpb19wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTY2ZjNmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fcGNpLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIFZpcnRpbyBQQ0kgZHJpdmVyCisgKgorICogVGhpcyBtb2R1bGUgYWxsb3dzIHZpcnRpbyBkZXZpY2VzIHRvIGJlIHVzZWQgb3ZlciBhIHZpcnR1YWwgUENJIGRldmljZS4KKyAqIFRoaXMgY2FuIGJlIHVzZWQgd2l0aCBRRU1VIGJhc2VkIFZNTXMgbGlrZSBLVk0gb3IgWGVuLgorICoKKyAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNworICoKKyAqIEF1dGhvcnM6CisgKiAgQW50aG9ueSBMaWd1b3JpICA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIGhlYWRlciBpcyBCU0QgbGljZW5zZWQgc28gYW55b25lIGNhbiB1c2UgdGhlIGRlZmluaXRpb25zIHRvIGltcGxlbWVudAorICogY29tcGF0aWJsZSBkcml2ZXJzL3NlcnZlcnMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIElCTSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgSUJNIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfTElOVVhfVklSVElPX1BDSV9ICisjZGVmaW5lIF9MSU5VWF9WSVJUSU9fUENJX0gKKworI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19jb25maWcuaD4KKworLyogQSAzMi1iaXQgci9vIGJpdG1hc2sgb2YgdGhlIGZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGUgaG9zdCAqLworI2RlZmluZSBWSVJUSU9fUENJX0hPU1RfRkVBVFVSRVMJMAorCisvKiBBIDMyLWJpdCByL3cgYml0bWFzayBvZiBmZWF0dXJlcyBhY3RpdmF0ZWQgYnkgdGhlIGd1ZXN0ICovCisjZGVmaW5lIFZJUlRJT19QQ0lfR1VFU1RfRkVBVFVSRVMJNAorCisvKiBBIDMyLWJpdCByL3cgUEZOIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHF1ZXVlICovCisjZGVmaW5lIFZJUlRJT19QQ0lfUVVFVUVfUEZOCQk4CisKKy8qIEEgMTYtYml0IHIvbyBxdWV1ZSBzaXplIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHF1ZXVlICovCisjZGVmaW5lIFZJUlRJT19QQ0lfUVVFVUVfTlVNCQkxMgorCisvKiBBIDE2LWJpdCByL3cgcXVldWUgc2VsZWN0b3IgKi8KKyNkZWZpbmUgVklSVElPX1BDSV9RVUVVRV9TRUwJCTE0CisKKy8qIEEgMTYtYml0IHIvdyBxdWV1ZSBub3RpZmllciAqLworI2RlZmluZSBWSVJUSU9fUENJX1FVRVVFX05PVElGWQkJMTYKKworLyogQW4gOC1iaXQgZGV2aWNlIHN0YXR1cyByZWdpc3Rlci4gICovCisjZGVmaW5lIFZJUlRJT19QQ0lfU1RBVFVTCQkxOAorCisvKiBBbiA4LWJpdCByL28gaW50ZXJydXB0IHN0YXR1cyByZWdpc3Rlci4gIFJlYWRpbmcgdGhlIHZhbHVlIHdpbGwgcmV0dXJuIHRoZQorICogY3VycmVudCBjb250ZW50cyBvZiB0aGUgSVNSIGFuZCB3aWxsIGFsc28gY2xlYXIgaXQuICBUaGlzIGlzIGVmZmVjdGl2ZWx5CisgKiBhIHJlYWQtYW5kLWFja25vd2xlZGdlLiAqLworI2RlZmluZSBWSVJUSU9fUENJX0lTUgkJCTE5CisKKy8qIFRoZSBiaXQgb2YgdGhlIElTUiB3aGljaCBpbmRpY2F0ZXMgYSBkZXZpY2UgY29uZmlndXJhdGlvbiBjaGFuZ2UuICovCisjZGVmaW5lIFZJUlRJT19QQ0lfSVNSX0NPTkZJRwkJMHgyCisKKy8qIE1TSS1YIHJlZ2lzdGVyczogb25seSBlbmFibGVkIGlmIE1TSS1YIGlzIGVuYWJsZWQuICovCisvKiBBIDE2LWJpdCB2ZWN0b3IgZm9yIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4gKi8KKyNkZWZpbmUgVklSVElPX01TSV9DT05GSUdfVkVDVE9SICAgICAgICAyMAorLyogQSAxNi1iaXQgdmVjdG9yIGZvciBzZWxlY3RlZCBxdWV1ZSBub3RpZmljYXRpb25zLiAqLworI2RlZmluZSBWSVJUSU9fTVNJX1FVRVVFX1ZFQ1RPUiAgICAgICAgIDIyCisvKiBWZWN0b3IgdmFsdWUgdXNlZCB0byBkaXNhYmxlIE1TSSBmb3IgcXVldWUgKi8KKyNkZWZpbmUgVklSVElPX01TSV9OT19WRUNUT1IgICAgICAgICAgICAweGZmZmYKKworLyogVGhlIHJlbWFpbmluZyBzcGFjZSBpcyBkZWZpbmVkIGJ5IGVhY2ggZHJpdmVyIGFzIHRoZSBwZXItZHJpdmVyCisgKiBjb25maWd1cmF0aW9uIHNwYWNlICovCisjZGVmaW5lIFZJUlRJT19QQ0lfQ09ORklHKGRldikJCSgoZGV2KS0+bXNpeF9lbmFibGVkID8gMjQgOiAyMCkKKworLyogVmlydGlvIEFCSSB2ZXJzaW9uLCB0aGlzIG11c3QgbWF0Y2ggZXhhY3RseSAqLworI2RlZmluZSBWSVJUSU9fUENJX0FCSV9WRVJTSU9OCQkwCisKKy8qIEhvdyBtYW55IGJpdHMgdG8gc2hpZnQgcGh5c2ljYWwgcXVldWUgYWRkcmVzcyB3cml0dGVuIHRvIFFVRVVFX1BGTi4KKyAqIDEyIGlzIGhpc3RvcmljYWwsIGFuZCBkdWUgdG8geDg2IHBhZ2Ugc2l6ZS4gKi8KKyNkZWZpbmUgVklSVElPX1BDSV9RVUVVRV9BRERSX1NISUZUCTEyCisKKy8qIFRoZSBhbGlnbm1lbnQgdG8gdXNlIGJldHdlZW4gY29uc3VtZXIgYW5kIHByb2R1Y2VyIHBhcnRzIG9mIHZyaW5nLgorICogeDg2IHBhZ2VzaXplIGFnYWluLiAqLworI2RlZmluZSBWSVJUSU9fUENJX1ZSSU5HX0FMSUdOCQk0MDk2CisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX3JpbmcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX3JpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjMzM2UyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fcmluZy5oCkBAIC0wLDAgKzEsMTYzIEBACisjaWZuZGVmIF9MSU5VWF9WSVJUSU9fUklOR19ICisjZGVmaW5lIF9MSU5VWF9WSVJUSU9fUklOR19ICisvKiBBbiBpbnRlcmZhY2UgZm9yIGVmZmljaWVudCB2aXJ0aW8gaW1wbGVtZW50YXRpb24sIGN1cnJlbnRseSBmb3IgdXNlIGJ5IEtWTQorICogYW5kIGxndWVzdCwgYnV0IGhvcGVmdWxseSBvdGhlcnMgc29vbi4gIERvIE5PVCBjaGFuZ2UgdGhpcyBzaW5jZSBpdCB3aWxsCisgKiBicmVhayBleGlzdGluZyBzZXJ2ZXJzIGFuZCBjbGllbnRzLgorICoKKyAqIFRoaXMgaGVhZGVyIGlzIEJTRCBsaWNlbnNlZCBzbyBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50CisgKiBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVycy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSUJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBDb3B5cmlnaHQgUnVzdHkgUnVzc2VsbCBJQk0gQ29ycG9yYXRpb24gMjAwNy4gKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBUaGlzIG1hcmtzIGEgYnVmZmVyIGFzIGNvbnRpbnVpbmcgdmlhIHRoZSBuZXh0IGZpZWxkLiAqLworI2RlZmluZSBWUklOR19ERVNDX0ZfTkVYVAkxCisvKiBUaGlzIG1hcmtzIGEgYnVmZmVyIGFzIHdyaXRlLW9ubHkgKG90aGVyd2lzZSByZWFkLW9ubHkpLiAqLworI2RlZmluZSBWUklOR19ERVNDX0ZfV1JJVEUJMgorLyogVGhpcyBtZWFucyB0aGUgYnVmZmVyIGNvbnRhaW5zIGEgbGlzdCBvZiBidWZmZXIgZGVzY3JpcHRvcnMuICovCisjZGVmaW5lIFZSSU5HX0RFU0NfRl9JTkRJUkVDVAk0CisKKy8qIFRoZSBIb3N0IHVzZXMgdGhpcyBpbiB1c2VkLT5mbGFncyB0byBhZHZpc2UgdGhlIEd1ZXN0OiBkb24ndCBraWNrIG1lIHdoZW4KKyAqIHlvdSBhZGQgYSBidWZmZXIuICBJdCdzIHVucmVsaWFibGUsIHNvIGl0J3Mgc2ltcGx5IGFuIG9wdGltaXphdGlvbi4gIEd1ZXN0CisgKiB3aWxsIHN0aWxsIGtpY2sgaWYgaXQncyBvdXQgb2YgYnVmZmVycy4gKi8KKyNkZWZpbmUgVlJJTkdfVVNFRF9GX05PX05PVElGWQkxCisvKiBUaGUgR3Vlc3QgdXNlcyB0aGlzIGluIGF2YWlsLT5mbGFncyB0byBhZHZpc2UgdGhlIEhvc3Q6IGRvbid0IGludGVycnVwdCBtZQorICogd2hlbiB5b3UgY29uc3VtZSBhIGJ1ZmZlci4gIEl0J3MgdW5yZWxpYWJsZSwgc28gaXQncyBzaW1wbHkgYW4KKyAqIG9wdGltaXphdGlvbi4gICovCisjZGVmaW5lIFZSSU5HX0FWQUlMX0ZfTk9fSU5URVJSVVBUCTEKKworLyogV2Ugc3VwcG9ydCBpbmRpcmVjdCBidWZmZXIgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgVklSVElPX1JJTkdfRl9JTkRJUkVDVF9ERVNDCTI4CisKKy8qIFRoZSBHdWVzdCBwdWJsaXNoZXMgdGhlIHVzZWQgaW5kZXggZm9yIHdoaWNoIGl0IGV4cGVjdHMgYW4gaW50ZXJydXB0CisgKiBhdCB0aGUgZW5kIG9mIHRoZSBhdmFpbCByaW5nLiBIb3N0IHNob3VsZCBpZ25vcmUgdGhlIGF2YWlsLT5mbGFncyBmaWVsZC4gKi8KKy8qIFRoZSBIb3N0IHB1Ymxpc2hlcyB0aGUgYXZhaWwgaW5kZXggZm9yIHdoaWNoIGl0IGV4cGVjdHMgYSBraWNrCisgKiBhdCB0aGUgZW5kIG9mIHRoZSB1c2VkIHJpbmcuIEd1ZXN0IHNob3VsZCBpZ25vcmUgdGhlIHVzZWQtPmZsYWdzIGZpZWxkLiAqLworI2RlZmluZSBWSVJUSU9fUklOR19GX0VWRU5UX0lEWAkJMjkKKworLyogVmlydGlvIHJpbmcgZGVzY3JpcHRvcnM6IDE2IGJ5dGVzLiAgVGhlc2UgY2FuIGNoYWluIHRvZ2V0aGVyIHZpYSAibmV4dCIuICovCitzdHJ1Y3QgdnJpbmdfZGVzYyB7CisJLyogQWRkcmVzcyAoZ3Vlc3QtcGh5c2ljYWwpLiAqLworCV9fdTY0IGFkZHI7CisJLyogTGVuZ3RoLiAqLworCV9fdTMyIGxlbjsKKwkvKiBUaGUgZmxhZ3MgYXMgaW5kaWNhdGVkIGFib3ZlLiAqLworCV9fdTE2IGZsYWdzOworCS8qIFdlIGNoYWluIHVudXNlZCBkZXNjcmlwdG9ycyB2aWEgdGhpcywgdG9vICovCisJX191MTYgbmV4dDsKK307CisKK3N0cnVjdCB2cmluZ19hdmFpbCB7CisJX191MTYgZmxhZ3M7CisJX191MTYgaWR4OworCV9fdTE2IHJpbmdbXTsKK307CisKKy8qIHUzMiBpcyB1c2VkIGhlcmUgZm9yIGlkcyBmb3IgcGFkZGluZyByZWFzb25zLiAqLworc3RydWN0IHZyaW5nX3VzZWRfZWxlbSB7CisJLyogSW5kZXggb2Ygc3RhcnQgb2YgdXNlZCBkZXNjcmlwdG9yIGNoYWluLiAqLworCV9fdTMyIGlkOworCS8qIFRvdGFsIGxlbmd0aCBvZiB0aGUgZGVzY3JpcHRvciBjaGFpbiB3aGljaCB3YXMgdXNlZCAod3JpdHRlbiB0bykgKi8KKwlfX3UzMiBsZW47Cit9OworCitzdHJ1Y3QgdnJpbmdfdXNlZCB7CisJX191MTYgZmxhZ3M7CisJX191MTYgaWR4OworCXN0cnVjdCB2cmluZ191c2VkX2VsZW0gcmluZ1tdOworfTsKKworc3RydWN0IHZyaW5nIHsKKwl1bnNpZ25lZCBpbnQgbnVtOworCisJc3RydWN0IHZyaW5nX2Rlc2MgKmRlc2M7CisKKwlzdHJ1Y3QgdnJpbmdfYXZhaWwgKmF2YWlsOworCisJc3RydWN0IHZyaW5nX3VzZWQgKnVzZWQ7Cit9OworCisvKiBUaGUgc3RhbmRhcmQgbGF5b3V0IGZvciB0aGUgcmluZyBpcyBhIGNvbnRpbnVvdXMgY2h1bmsgb2YgbWVtb3J5IHdoaWNoIGxvb2tzCisgKiBsaWtlIHRoaXMuICBXZSBhc3N1bWUgbnVtIGlzIGEgcG93ZXIgb2YgMi4KKyAqCisgKiBzdHJ1Y3QgdnJpbmcKKyAqIHsKKyAqCS8vIFRoZSBhY3R1YWwgZGVzY3JpcHRvcnMgKDE2IGJ5dGVzIGVhY2gpCisgKglzdHJ1Y3QgdnJpbmdfZGVzYyBkZXNjW251bV07CisgKgorICoJLy8gQSByaW5nIG9mIGF2YWlsYWJsZSBkZXNjcmlwdG9yIGhlYWRzIHdpdGggZnJlZS1ydW5uaW5nIGluZGV4LgorICoJX191MTYgYXZhaWxfZmxhZ3M7CisgKglfX3UxNiBhdmFpbF9pZHg7CisgKglfX3UxNiBhdmFpbGFibGVbbnVtXTsKKyAqCV9fdTE2IHVzZWRfZXZlbnRfaWR4OworICoKKyAqCS8vIFBhZGRpbmcgdG8gdGhlIG5leHQgYWxpZ24gYm91bmRhcnkuCisgKgljaGFyIHBhZFtdOworICoKKyAqCS8vIEEgcmluZyBvZiB1c2VkIGRlc2NyaXB0b3IgaGVhZHMgd2l0aCBmcmVlLXJ1bm5pbmcgaW5kZXguCisgKglfX3UxNiB1c2VkX2ZsYWdzOworICoJX191MTYgdXNlZF9pZHg7CisgKglzdHJ1Y3QgdnJpbmdfdXNlZF9lbGVtIHVzZWRbbnVtXTsKKyAqCV9fdTE2IGF2YWlsX2V2ZW50X2lkeDsKKyAqIH07CisgKi8KKy8qIFdlIHB1Ymxpc2ggdGhlIHVzZWQgZXZlbnQgaW5kZXggYXQgdGhlIGVuZCBvZiB0aGUgYXZhaWxhYmxlIHJpbmcsIGFuZCB2aWNlCisgKiB2ZXJzYS4gVGhleSBhcmUgYXQgdGhlIGVuZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICovCisjZGVmaW5lIHZyaW5nX3VzZWRfZXZlbnQodnIpICgodnIpLT5hdmFpbC0+cmluZ1sodnIpLT5udW1dKQorI2RlZmluZSB2cmluZ19hdmFpbF9ldmVudCh2cikgKCooX191MTYgKikmKHZyKS0+dXNlZC0+cmluZ1sodnIpLT5udW1dKQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHZyaW5nX2luaXQoc3RydWN0IHZyaW5nICp2ciwgdW5zaWduZWQgaW50IG51bSwgdm9pZCAqcCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWxpZ24pCit7CisJdnItPm51bSA9IG51bTsKKwl2ci0+ZGVzYyA9IHA7CisJdnItPmF2YWlsID0gcCArIG51bSpzaXplb2Yoc3RydWN0IHZyaW5nX2Rlc2MpOworCXZyLT51c2VkID0gKHZvaWQgKikoKCh1bnNpZ25lZCBsb25nKSZ2ci0+YXZhaWwtPnJpbmdbbnVtXSArIHNpemVvZihfX3UxNikKKwkJKyBhbGlnbi0xKSAmIH4oYWxpZ24gLSAxKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIHZyaW5nX3NpemUodW5zaWduZWQgaW50IG51bSwgdW5zaWduZWQgbG9uZyBhbGlnbikKK3sKKwlyZXR1cm4gKChzaXplb2Yoc3RydWN0IHZyaW5nX2Rlc2MpICogbnVtICsgc2l6ZW9mKF9fdTE2KSAqICgzICsgbnVtKQorCQkgKyBhbGlnbiAtIDEpICYgfihhbGlnbiAtIDEpKQorCQkrIHNpemVvZihfX3UxNikgKiAzICsgc2l6ZW9mKHN0cnVjdCB2cmluZ191c2VkX2VsZW0pICogbnVtOworfQorCisvKiBUaGUgZm9sbG93aW5nIGlzIHVzZWQgd2l0aCBVU0VEX0VWRU5UX0lEWCBhbmQgQVZBSUxfRVZFTlRfSURYICovCisvKiBBc3N1bWluZyBhIGdpdmVuIGV2ZW50X2lkeCB2YWx1ZSBmcm9tIHRoZSBvdGhlciBzaXplLCBpZgorICogd2UgaGF2ZSBqdXN0IGluY3JlbWVudGVkIGluZGV4IGZyb20gb2xkIHRvIG5ld19pZHgsCisgKiBzaG91bGQgd2UgdHJpZ2dlciBhbiBldmVudD8gKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCB2cmluZ19uZWVkX2V2ZW50KF9fdTE2IGV2ZW50X2lkeCwgX191MTYgbmV3X2lkeCwgX191MTYgb2xkKQoreworCS8qIE5vdGU6IFhlbiBoYXMgc2ltaWxhciBsb2dpYyBmb3Igbm90aWZpY2F0aW9uIGhvbGQtb2ZmCisJICogaW4gaW5jbHVkZS94ZW4vaW50ZXJmYWNlL2lvL3JpbmcuaCB3aXRoIHJlcV9ldmVudCBhbmQgcmVxX3Byb2QKKwkgKiBjb3JyZXNwb25kaW5nIHRvIGV2ZW50X2lkeCArIDEgYW5kIG5ld19pZHggcmVzcGVjdGl2ZWx5LgorCSAqIE5vdGUgYWxzbyB0aGF0IHJlcV9ldmVudCBhbmQgcmVxX3Byb2QgaW4gWGVuIHN0YXJ0IGF0IDEsCisJICogZXZlbnQgaW5kZXhlcyBpbiB2aXJ0aW8gc3RhcnQgYXQgMC4gKi8KKwlyZXR1cm4gKF9fdTE2KShuZXdfaWR4IC0gZXZlbnRfaWR4IC0gMSkgPCAoX191MTYpKG5ld19pZHggLSBvbGQpOworfQorCisjZW5kaWYgLyogX0xJTlVYX1ZJUlRJT19SSU5HX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX3JuZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fcm5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRkNWRlOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX3JuZy5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfTElOVVhfVklSVElPX1JOR19ICisjZGVmaW5lIF9MSU5VWF9WSVJUSU9fUk5HX0gKKy8qIFRoaXMgaGVhZGVyIGlzIEJTRCBsaWNlbnNlZCBzbyBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50CisgKiBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVycy4gKi8KKyNpbmNsdWRlIDxsaW51eC92aXJ0aW9faWRzLmg+CisjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbmZpZy5oPgorCisjZW5kaWYgLyogX0xJTlVYX1ZJUlRJT19STkdfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMDhmMDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Z0LmgKQEAgLTAsMCArMSw5MCBAQAorI2lmbmRlZiBfTElOVVhfVlRfSAorI2RlZmluZSBfTElOVVhfVlRfSAorCisKKy8qCisgKiBUaGVzZSBjb25zdGFudHMgYXJlIGFsc28gdXNlZnVsIGZvciB1c2VyLWxldmVsIGFwcHMgKGUuZy4sIFZDCisgKiByZXNpemluZykuCisgKi8KKyNkZWZpbmUgTUlOX05SX0NPTlNPTEVTIDEgICAgICAgLyogbXVzdCBiZSBhdCBsZWFzdCAxICovCisjZGVmaW5lIE1BWF9OUl9DT05TT0xFUwk2MwkvKiBzZXJpYWwgbGluZXMgc3RhcnQgYXQgNjQgKi8KKyNkZWZpbmUgTUFYX05SX1VTRVJfQ09OU09MRVMgNjMJLyogbXVzdCBiZSByb290IHRvIGFsbG9jYXRlIGFib3ZlIHRoaXMgKi8KKwkJLyogTm90ZTogdGhlIGlvY3RsIFZUX0dFVFNUQVRFIGRvZXMgbm90IHdvcmsgZm9yCisJCSAgIGNvbnNvbGVzIDE2IGFuZCBoaWdoZXIgKHNpbmNlIGl0IHJldHVybnMgYSBzaG9ydCkgKi8KKworLyogMHg1NiBpcyAnVicsIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIHRlcm1pb3MgYW5kIGtkICovCisKKyNkZWZpbmUgVlRfT1BFTlFSWQkweDU2MDAJLyogZmluZCBhdmFpbGFibGUgdnQgKi8KKworc3RydWN0IHZ0X21vZGUgeworCWNoYXIgbW9kZTsJCS8qIHZ0IG1vZGUgKi8KKwljaGFyIHdhaXR2OwkJLyogaWYgc2V0LCBoYW5nIG9uIHdyaXRlcyBpZiBub3QgYWN0aXZlICovCisJc2hvcnQgcmVsc2lnOwkJLyogc2lnbmFsIHRvIHJhaXNlIG9uIHJlbGVhc2UgcmVxICovCisJc2hvcnQgYWNxc2lnOwkJLyogc2lnbmFsIHRvIHJhaXNlIG9uIGFjcXVpc2l0aW9uICovCisJc2hvcnQgZnJzaWc7CQkvKiB1bnVzZWQgKHNldCB0byAwKSAqLworfTsKKyNkZWZpbmUgVlRfR0VUTU9ERQkweDU2MDEJLyogZ2V0IG1vZGUgb2YgYWN0aXZlIHZ0ICovCisjZGVmaW5lIFZUX1NFVE1PREUJMHg1NjAyCS8qIHNldCBtb2RlIG9mIGFjdGl2ZSB2dCAqLworI2RlZmluZQkJVlRfQVVUTwkJMHgwMAkvKiBhdXRvIHZ0IHN3aXRjaGluZyAqLworI2RlZmluZQkJVlRfUFJPQ0VTUwkweDAxCS8qIHByb2Nlc3MgY29udHJvbHMgc3dpdGNoaW5nICovCisjZGVmaW5lCQlWVF9BQ0tBQ1EJMHgwMgkvKiBhY2tub3dsZWRnZSBzd2l0Y2ggKi8KKworc3RydWN0IHZ0X3N0YXQgeworCXVuc2lnbmVkIHNob3J0IHZfYWN0aXZlOwkvKiBhY3RpdmUgdnQgKi8KKwl1bnNpZ25lZCBzaG9ydCB2X3NpZ25hbDsJLyogc2lnbmFsIHRvIHNlbmQgKi8KKwl1bnNpZ25lZCBzaG9ydCB2X3N0YXRlOwkJLyogdnQgYml0bWFzayAqLworfTsKKyNkZWZpbmUgVlRfR0VUU1RBVEUJMHg1NjAzCS8qIGdldCBnbG9iYWwgdnQgc3RhdGUgaW5mbyAqLworI2RlZmluZSBWVF9TRU5EU0lHCTB4NTYwNAkvKiBzaWduYWwgdG8gc2VuZCB0byBiaXRtYXNrIG9mIHZ0cyAqLworCisjZGVmaW5lIFZUX1JFTERJU1AJMHg1NjA1CS8qIHJlbGVhc2UgZGlzcGxheSAqLworCisjZGVmaW5lIFZUX0FDVElWQVRFCTB4NTYwNgkvKiBtYWtlIHZ0IGFjdGl2ZSAqLworI2RlZmluZSBWVF9XQUlUQUNUSVZFCTB4NTYwNwkvKiB3YWl0IGZvciB2dCBhY3RpdmUgKi8KKyNkZWZpbmUgVlRfRElTQUxMT0NBVEUJMHg1NjA4ICAvKiBmcmVlIG1lbW9yeSBhc3NvY2lhdGVkIHRvIHZ0ICovCisKK3N0cnVjdCB2dF9zaXplcyB7CisJdW5zaWduZWQgc2hvcnQgdl9yb3dzOwkJLyogbnVtYmVyIG9mIHJvd3MgKi8KKwl1bnNpZ25lZCBzaG9ydCB2X2NvbHM7CQkvKiBudW1iZXIgb2YgY29sdW1ucyAqLworCXVuc2lnbmVkIHNob3J0IHZfc2Nyb2xsc2l6ZTsJLyogbnVtYmVyIG9mIGxpbmVzIG9mIHNjcm9sbGJhY2sgKi8KK307CisjZGVmaW5lIFZUX1JFU0laRQkweDU2MDkJLyogc2V0IGtlcm5lbCdzIGlkZWEgb2Ygc2NyZWVuc2l6ZSAqLworCitzdHJ1Y3QgdnRfY29uc2l6ZSB7CisJdW5zaWduZWQgc2hvcnQgdl9yb3dzOwkvKiBudW1iZXIgb2Ygcm93cyAqLworCXVuc2lnbmVkIHNob3J0IHZfY29sczsJLyogbnVtYmVyIG9mIGNvbHVtbnMgKi8KKwl1bnNpZ25lZCBzaG9ydCB2X3ZsaW47CS8qIG51bWJlciBvZiBwaXhlbCByb3dzIG9uIHNjcmVlbiAqLworCXVuc2lnbmVkIHNob3J0IHZfY2xpbjsJLyogbnVtYmVyIG9mIHBpeGVsIHJvd3MgcGVyIGNoYXJhY3RlciAqLworCXVuc2lnbmVkIHNob3J0IHZfdmNvbDsJLyogbnVtYmVyIG9mIHBpeGVsIGNvbHVtbnMgb24gc2NyZWVuICovCisJdW5zaWduZWQgc2hvcnQgdl9jY29sOwkvKiBudW1iZXIgb2YgcGl4ZWwgY29sdW1ucyBwZXIgY2hhcmFjdGVyICovCit9OworI2RlZmluZSBWVF9SRVNJWkVYICAgICAgMHg1NjBBICAvKiBzZXQga2VybmVsJ3MgaWRlYSBvZiBzY3JlZW5zaXplICsgbW9yZSAqLworI2RlZmluZSBWVF9MT0NLU1dJVENIICAgMHg1NjBCICAvKiBkaXNhbGxvdyB2dCBzd2l0Y2hpbmcgKi8KKyNkZWZpbmUgVlRfVU5MT0NLU1dJVENIIDB4NTYwQyAgLyogYWxsb3cgdnQgc3dpdGNoaW5nICovCisjZGVmaW5lIFZUX0dFVEhJRk9OVE1BU0sgMHg1NjBEICAvKiByZXR1cm4gaGkgZm9udCBtYXNrICovCisKK3N0cnVjdCB2dF9ldmVudCB7CisJdW5zaWduZWQgaW50IGV2ZW50OworI2RlZmluZSBWVF9FVkVOVF9TV0lUQ0gJCTB4MDAwMQkvKiBDb25zb2xlIHN3aXRjaCAqLworI2RlZmluZSBWVF9FVkVOVF9CTEFOSwkJMHgwMDAyCS8qIFNjcmVlbiBibGFuayAqLworI2RlZmluZSBWVF9FVkVOVF9VTkJMQU5LCTB4MDAwNAkvKiBTY3JlZW4gdW5ibGFuayAqLworI2RlZmluZSBWVF9FVkVOVF9SRVNJWkUJCTB4MDAwOAkvKiBSZXNpemUgZGlzcGxheSAqLworI2RlZmluZSBWVF9NQVhfRVZFTlQJCTB4MDAwRgorCXVuc2lnbmVkIGludCBvbGRldjsJCS8qIE9sZCBjb25zb2xlICovCisJdW5zaWduZWQgaW50IG5ld2V2OwkJLyogTmV3IGNvbnNvbGUgKGlmIGNoYW5naW5nKSAqLworCXVuc2lnbmVkIGludCBwYWRbNF07CQkvKiBQYWRkaW5nIGZvciBleHBhbnNpb24gKi8KK307CisKKyNkZWZpbmUgVlRfV0FJVEVWRU5UCTB4NTYwRQkvKiBXYWl0IGZvciBhbiBldmVudCAqLworCitzdHJ1Y3QgdnRfc2V0YWN0aXZhdGUgeworCXVuc2lnbmVkIGludCBjb25zb2xlOworCXN0cnVjdCB2dF9tb2RlIG1vZGU7Cit9OworCisjZGVmaW5lIFZUX1NFVEFDVElWQVRFCTB4NTYwRgkvKiBBY3RpdmF0ZSBhbmQgc2V0IHRoZSBtb2RlIG9mIGEgY29uc29sZSAqLworCisKKyNkZWZpbmUgdnRfZ2V0X2ttc2dfcmVkaXJlY3QoKSB2dF9rbXNnX3JlZGlyZWN0KC0xKQorCisjZW5kaWYgLyogX0xJTlVYX1ZUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvd2FpdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC93YWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNkYmRjMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvd2FpdC5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX0xJTlVYX1dBSVRfSAorI2RlZmluZSBfTElOVVhfV0FJVF9ICisKKyNkZWZpbmUgV05PSEFORwkJMHgwMDAwMDAwMQorI2RlZmluZSBXVU5UUkFDRUQJMHgwMDAwMDAwMgorI2RlZmluZSBXU1RPUFBFRAlXVU5UUkFDRUQKKyNkZWZpbmUgV0VYSVRFRAkJMHgwMDAwMDAwNAorI2RlZmluZSBXQ09OVElOVUVECTB4MDAwMDAwMDgKKyNkZWZpbmUgV05PV0FJVAkJMHgwMTAwMDAwMAkvKiBEb24ndCByZWFwLCBqdXN0IHBvbGwgc3RhdHVzLiAgKi8KKworI2RlZmluZSBfX1dOT1RIUkVBRAkweDIwMDAwMDAwCS8qIERvbid0IHdhaXQgb24gY2hpbGRyZW4gb2Ygb3RoZXIgdGhyZWFkcyBpbiB0aGlzIGdyb3VwICovCisjZGVmaW5lIF9fV0FMTAkJMHg0MDAwMDAwMAkvKiBXYWl0IG9uIGFsbCBjaGlsZHJlbiwgcmVnYXJkbGVzcyBvZiB0eXBlICovCisjZGVmaW5lIF9fV0NMT05FCTB4ODAwMDAwMDAJLyogV2FpdCBvbmx5IG9uIG5vbi1TSUdDSExEIGNoaWxkcmVuICovCisKKy8qIEZpcnN0IGFyZ3VtZW50IHRvIHdhaXRpZDogKi8KKyNkZWZpbmUgUF9BTEwJCTAKKyNkZWZpbmUgUF9QSUQJCTEKKyNkZWZpbmUgUF9QR0lECQkyCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3dhbnJvdXRlci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC93YW5yb3V0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTYxNWFiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC93YW5yb3V0ZXIuaApAQCAtMCwwICsxLDQ1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHdhbnJvdXRlci5oCURlZmluaXRpb25zIGZvciB0aGUgV0FOIE11bHRpcHJvdG9jb2wgUm91dGVyIE1vZHVsZS4KKyoJCVRoaXMgbW9kdWxlIHByb3ZpZGVzIEFQSSBhbmQgY29tbW9uIHNlcnZpY2VzIGZvciBXQU4gTGluaworKgkJRHJpdmVycyBhbmQgaXMgY29tcGxldGVseSBoYXJkd2FyZS1pbmRlcGVuZGVudC4KKyoKKyogQXV0aG9yOiAJTmVuYWQgQ29yYmljIDxuY29yYmljQHNhbmdvbWEuY29tPgorKgkJR2lkZW9uIEhhY2sgCQorKiBBZGRpdGlvbnM6CUFybmFsZG8gTWVsbworKgorKiBDb3B5cmlnaHQ6CShjKSAxOTk1LTIwMDAgU2FuZ29tYSBUZWNobm9sb2dpZXMgSW5jLgorKgorKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiBKdWwgMjEsIDIwMDAgIE5lbmFkIENvcmJpYwlBZGRlZCBXQU5fRlQxX1JFQURZIFN0YXRlCisqIEZlYiAyNCwgMjAwMCAgTmVuYWQgQ29yYmljICAgIEFkZGVkIHN1cHBvcnQgZm9yIHNvY2tldCBiYXNlZCB4MjVhcGkKKyogSmFuIDI4LCAyMDAwICBOZW5hZCBDb3JiaWMgICAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIEFTWU5DIHByb3RvY29sLgorKiBPY3QgMDQsIDE5OTkgIE5lbmFkIENvcmJpYyAJVXBkYXRlZCBmb3IgMi4xLjAgcmVsZWFzZQorKiBKdW4gMDIsIDE5OTkgIEdpZGVvbiBIYWNrCUFkZGVkIHN1cHBvcnQgZm9yIHRoZSBTNTE0IGFkYXB0ZXIuCisqIE1heSAyMywgMTk5OQlBcm5hbGRvIE1lbG8JQWRkZWQgbG9jYWxfYWRkciB0byB3YW5pZl9jb25mX3QKKyoJCQkJV0FOX0RJU0NPTk5FQ1RJTkcgc3RhdGUgYWRkZWQKKyogSnVsIDIwLCAxOTk4CURhdmlkIEZvbmcJQWRkZWQgSW52ZXJzZSBBUlAgb3B0aW9ucyB0byAnd2FuaWZfY29uZl90JworKiBKdW4gMTIsIDE5OTgJRGF2aWQgRm9uZwlBZGRlZCBDaXNjbyBIRExDIHN1cHBvcnQuCisqIERlYyAxNiwgMTk5NwlKYXNwcmVldCBTaW5naAlNb3ZlZCAnZW5hYmxlX0lQWCcgYW5kICduZXR3b3JrX251bWJlcicgdG8KKyoJCQkJJ3dhbmlmX2NvbmZfdCcKKyogRGVjIDA1LCAxOTk3CUphc3ByZWV0IFNpbmdoCUFkZGVkICdwYXAnLCAnY2hhcCcgdG8gJ3dhbmlmX2NvbmZfdCcKKyoJCQkJQWRkZWQgJ2F1dGhlbnRpY2F0b3InIHRvICd3YW5fcHBwX2NvbmZfdCcKKyogTm92IDA2LCAxOTk3CUphc3ByZWV0IFNpbmdoCUNoYW5nZWQgUm91dGVyIERyaXZlciB2ZXJzaW9uIHRvIDEuMSBmcm9tIDEuMAorKiBPY3QgMjAsIDE5OTcJSmFzcHJlZXQgU2luZ2gJQWRkZWQgJ2NpcicsJ2JjJywnYmUnIGFuZCAnbWMnIHRvICd3YW5pZl9jb25mX3QnCisqCQkJCUFkZGVkICdlbmFibGVfSVBYJyBhbmQgJ25ldHdvcmtfbnVtYmVyJyB0byAKKyoJCQkJJ3dhbl9kZXZpY2VfdCcuICBBbHNvIGFkZGVkIGRlZmluZXMgZm9yCisqCQkJCVVEUCBQQUNLRVQgVFlQRSwgSW50ZXJydXB0IHRlc3QsIGNyaXRpY2FsIHZhbHVlcworKgkJCQlmb3IgUkFDRSBjb25kaXRpb25zLgorKiBPY3QgMDUsIDE5OTcJSmFzcHJlZXQgU2luZ2gJQWRkZWQgJ2RsY2lfbnVtJyBhbmQgJ2RsY2lbMTAwXScgdG8gCisqCQkJCSd3YW5fZnJfY29uZl90JyB0byBjb25maWd1cmUgYSBsaXN0IG9mIGRsY2kocykKKyoJCQkJZm9yIGEgTk9ERSAKKyogSnVsIDA3LCAxOTk3CUphc3ByZWV0IFNpbmdoCUFkZGVkICd0dGwnIHRvICd3YW5kZXZfY29uZl90JyAmICd3YW5fZGV2aWNlX3QnCisqIE1heSAyOSwgMTk5NyAJSmFzcHJlZXQgU2luZ2gJQWRkZWQgJ3R4X2ludF9lbmFibGVkJyB0byAnd2FuX2RldmljZV90JworKiBNYXkgMjEsIDE5OTcJSmFzcHJlZXQgU2luZ2gJQWRkZWQgJ3VkcF9wb3J0JyB0byAnd2FuX2RldmljZV90JworKiBBcHIgMjUsIDE5OTcgIEZhcmhhbiBUaGF3YXIgICBBZGRlZCAndWRwX3BvcnQnIHRvICd3YW5kZXZfY29uZl90JworKiBKYW4gMTYsIDE5OTcJR2VuZSBLb3ppbglyb3V0ZXJfZGV2bGlzdCBtYWRlIHB1YmxpYworKiBKYW4gMDIsIDE5OTcJR2VuZSBLb3ppbglJbml0aWFsIHZlcnNpb24gKGJhc2VkIG9uIHdhbnBpcGUuaCkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZglfUk9VVEVSX0gKKyNkZWZpbmUJX1JPVVRFUl9ICisKKyNkZWZpbmUJUk9VVEVSX05BTUUJIndhbnJvdXRlciIJLyogaW4gY2FzZSB3ZSBldmVyIGNoYW5nZSBpdCAqLworI2RlZmluZQlST1VURVJfVkVSU0lPTgkxCQkvKiB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZQlST1VURVJfUkVMRUFTRQkxCQkvKiByZWxlYXNlIChtaW5vciB2ZXJzaW9uKSBudW1iZXIgKi8KKyNkZWZpbmUJUk9VVEVSX0lPQ1RMCSdXJwkJLyogZm9yIElPQ1RMIGNhbGxzICovCisjZGVmaW5lCVJPVVRFUl9NQUdJQwkweDUyNEQ0MTU3TAkvKiBzaWduYXR1cmU6ICdXQU5SJyByZXZlcnNlZCAqLworCisvKiBJT0NUTCBjb2RlcyBmb3IgL3Byb2Mvcm91dGVyLzxkZXZpY2U+IGVudHJpZXMgKHVwIHRvIDI1NSkgKi8KK2VudW0gcm91dGVyX2lvY3RscworeworCVJPVVRFUl9TRVRVUAk9IFJPVVRFUl9JT0NUTDw8OCwJLyogY29uZmlndXJlIGRldmljZSAqLworCVJPVVRFUl9ET1dOLAkJCQkvKiBzaHV0IGRvd24gZGV2aWNlICovCisJUk9VVEVSX1NUQVQsCQkJCS8qIGdldCBkZXZpY2Ugc3RhdHVzICovCisJUk9VVEVSX0lGTkVXLAkJCQkvKiBhZGQgaW50ZXJmYWNlICovCisJUk9VVEVSX0lGREVMLAkJCQkvKiBkZWxldGUgaW50ZXJmYWNlICovCisJUk9VVEVSX0lGU1RBVCwJCQkJLyogZ2V0IGludGVyZmFjZSBzdGF0dXMgKi8KKwlST1VURVJfVVNFUgk9IChST1VURVJfSU9DVEw8PDgpKzE2LAkvKiBkcml2ZXItc3BlY2lmaWMgY2FsbHMgKi8KKwlST1VURVJfVVNFUl9NQVgJPSAoUk9VVEVSX0lPQ1RMPDw4KSszMQorfTsKKworLyogaWRlbnRpZmllcnMgZm9yIGRpc3BsYXlpbmcgcHJvYyBmaWxlIGRhdGEgZm9yIGR1YWwgcG9ydCBhZGFwdGVycyAqLworI2RlZmluZSBQUk9DX0RBVEFfUE9SVF8wIDB4ODAwMAkvKiB0aGUgZGF0YSBpcyBmb3IgcG9ydCAwICovCisjZGVmaW5lIFBST0NfREFUQV9QT1JUXzEgMHg4MDAxCS8qIHRoZSBkYXRhIGlzIGZvciBwb3J0IDEgKi8KKworLyogTkxQSUQgZm9yIHBhY2tldCBlbmNhcHN1bGF0aW9uIChJU08vSUVDIFRSIDk1NzcpICovCisjZGVmaW5lCU5MUElEX0lQCTB4Q0MJLyogSW50ZXJuZXQgUHJvdG9jb2wgRGF0YWdyYW0gKi8KKyNkZWZpbmUJTkxQSURfU05BUAkweDgwCS8qIElFRUUgU3VibmV0d29yayBBY2Nlc3MgUHJvdG9jb2wgKi8KKyNkZWZpbmUJTkxQSURfQ0xOUAkweDgxCS8qIElTTy9JRUMgODQ3MyAqLworI2RlZmluZQlOTFBJRF9FU0lTCTB4ODIJLyogSVNPL0lFQyA5NTQyICovCisjZGVmaW5lCU5MUElEX0lTSVMJMHg4MwkvKiBJU08vSUVDIElTSVMgKi8KKyNkZWZpbmUJTkxQSURfUTkzMwkweDA4CS8qIENDSVRUIFEuOTMzICovCisKKy8qIE1pc2NlbGxhbmVvdXMgKi8KKyNkZWZpbmUJV0FOX0lGTkFNRV9TWgkxNQkvKiBtYXggbGVuZ3RoIG9mIHRoZSBpbnRlcmZhY2UgbmFtZSAqLworI2RlZmluZQlXQU5fRFJWTkFNRV9TWgkxNQkvKiBtYXggbGVuZ3RoIG9mIHRoZSBsaW5rIGRyaXZlciBuYW1lICovCisjZGVmaW5lCVdBTl9BRERSRVNTX1NaCTMxCS8qIG1heCBsZW5ndGggb2YgdGhlIFdBTiBtZWRpYSBhZGRyZXNzICovCisjZGVmaW5lIFVTRURfQllfRklFTEQJOAkvKiBtYXggbGVuZ3RoIG9mIHRoZSB1c2VkIGJ5IGZpZWxkICovCisKKy8qIERlZmluZXMgZm9yIFVEUCBQQUNLRVQgVFlQRSAqLworI2RlZmluZSBVRFBfUFRQSVBFX1RZUEUgCTB4MDEKKyNkZWZpbmUgVURQX0ZQSVBFX1RZUEUJCTB4MDIKKyNkZWZpbmUgVURQX0NQSVBFX1RZUEUJCTB4MDMKKyNkZWZpbmUgVURQX0RSVlNUQVRTX1RZUEUgCTB4MDQKKyNkZWZpbmUgVURQX0lOVkFMSURfVFlQRSAgCTB4MDUKKworLyogQ29tbWFuZCByZXR1cm4gY29kZSAqLworI2RlZmluZSBDTURfT0sJCTAJCS8qIG5vcm1hbCBmaXJtd2FyZSByZXR1cm4gY29kZSAqLworI2RlZmluZSBDTURfVElNRU9VVAkweEZGCQkvKiBmaXJtd2FyZSBjb21tYW5kIHRpbWVkIG91dCAqLworCisvKiBVRFAgUGFja2V0IE1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgVURQX1BLVF9GUk1fU1RBQ0sJMHgwMAorI2RlZmluZSBVRFBfUEtUX0ZSTV9ORVRXT1JLCTB4MDEKKworLyogTWF4aW11bSBpbnRlcnJ1cHQgdGVzdCBjb3VudGVyICovCisjZGVmaW5lIE1BWF9JTlRSX1RFU1RfQ09VTlRFUgkxMDAKKworLyogQ3JpdGljYWwgVmFsdWVzIGZvciBSQUNFIGNvbmRpdGlvbnMqLworI2RlZmluZSBDUklUSUNBTF9JTl9JU1IJCTB4QTEKKyNkZWZpbmUgQ1JJVElDQUxfSU5UUl9IQU5ETEVECTB4QjEKKworLyoqKioqKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogWC4yNS1zcGVjaWZpYyBsaW5rLWxldmVsIGNvbmZpZ3VyYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHdhbl94MjVfY29uZgoreworCXVuc2lnbmVkIGxvX3B2YzsJLyogbG93ZXN0IHBlcm1hbmVudCBjaXJjdWl0IG51bWJlciAqLworCXVuc2lnbmVkIGhpX3B2YzsJLyogaGlnaGVzdCBwZXJtYW5lbnQgY2lyY3VpdCBudW1iZXIgKi8KKwl1bnNpZ25lZCBsb19zdmM7CS8qIGxvd2VzdCBzd2l0Y2hlZCBjaXJjdWl0IG51bWJlciAqLworCXVuc2lnbmVkIGhpX3N2YzsJLyogaGlnaGVzdCBzd2l0Y2hlZCBjaXJjdWl0IG51bWJlciAqLworCXVuc2lnbmVkIGhkbGNfd2luZG93OwkvKiBIRExDIHdpbmRvdyBzaXplICgxLi43KSAqLworCXVuc2lnbmVkIHBrdF93aW5kb3c7CS8qIFguMjUgcGFja2V0IHdpbmRvdyBzaXplICgxLi43KSAqLworCXVuc2lnbmVkIHQxOwkJLyogSERMQyB0aW1lciBUMSwgc2VjICgxLi4zMCkgKi8KKwl1bnNpZ25lZCB0MjsJCS8qIEhETEMgdGltZXIgVDIsIHNlYyAoMC4uMjkpICovCisJdW5zaWduZWQgdDQ7CQkvKiBIRExDIHN1cGVydmlzb3J5IGZyYW1lIHRpbWVyID0gVDQgKiBUMSAqLworCXVuc2lnbmVkIG4yOwkJLyogSERMQyByZXRyYW5zbWlzc2lvbiBsaW1pdCAoMS4uMzApICovCisJdW5zaWduZWQgdDEwX3QyMDsJLyogWC4yNSBSRVNUQVJUIHRpbWVvdXQsIHNlYyAoMS4uMjU1KSAqLworCXVuc2lnbmVkIHQxMV90MjE7CS8qIFguMjUgQ0FMTCB0aW1lb3V0LCBzZWMgKDEuLjI1NSkgKi8KKwl1bnNpZ25lZCB0MTJfdDIyOwkvKiBYLjI1IFJFU0VUIHRpbWVvdXQsIHNlYyAoMS4uMjU1KSAqLworCXVuc2lnbmVkIHQxM190MjM7CS8qIFguMjUgQ0xFQVIgdGltZW91dCwgc2VjICgxLi4yNTUpICovCisJdW5zaWduZWQgdDE2X3QyNjsJLyogWC4yNSBJTlRFUlJVUFQgdGltZW91dCwgc2VjICgxLi4yNTUpICovCisJdW5zaWduZWQgdDI4OwkJLyogWC4yNSBSRUdJU1RSQVRJT04gdGltZW91dCwgc2VjICgxLi4yNTUpICovCisJdW5zaWduZWQgcjEwX3IyMDsJLyogUkVTVEFSVCByZXRyYW5zbWlzc2lvbiBsaW1pdCAoMC4uMjUwKSAqLworCXVuc2lnbmVkIHIxMl9yMjI7CS8qIFJFU0VUIHJldHJhbnNtaXNzaW9uIGxpbWl0ICgwLi4yNTApICovCisJdW5zaWduZWQgcjEzX3IyMzsJLyogQ0xFQVIgcmV0cmFuc21pc3Npb24gbGltaXQgKDAuLjI1MCkgKi8KKwl1bnNpZ25lZCBjY2l0dF9jb21wYXQ7CS8qIGNvbXBhdGliaWxpdHkgbW9kZTogMTk4OC8xOTg0LzE5ODAgKi8KKwl1bnNpZ25lZCB4MjVfY29uZl9vcHQ7ICAgLyogVXNlciBkZWZpbmVkIHgyNSBjb25maWcgb3B0b2lucyAqLworCXVuc2lnbmVkIGNoYXIgTEFQQl9oZGxjX29ubHk7IC8qIFJ1biBpbiBIRExDIG9ubHkgbW9kZSAqLworCXVuc2lnbmVkIGNoYXIgbG9nZ2luZzsgICAvKiBDb250cm9sIGNvbm5lY3Rpb24gbG9nZ2luZyAqLyAgCisJdW5zaWduZWQgY2hhciBvb2Jfb25fbW9kZW07IC8qIFdoZXRoZXIgdG8gc2VuZCBtb2RlbSBzdGF0dXMgdG8gdGhlIHVzZXIgYXBwICovCit9IHdhbl94MjVfY29uZl90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZyYW1lIHJlbGF5IHNwZWNpZmljIGxpbmstbGV2ZWwgY29uZmlndXJhdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgd2FuX2ZyX2NvbmYKK3sKKwl1bnNpZ25lZCBzaWduYWxsaW5nOwkvKiBsb2NhbCBpbi1jaGFubmVsIHNpZ25hbGxpbmcgdHlwZSAqLworCXVuc2lnbmVkIHQzOTE7CQkvKiBsaW5rIGludGVncml0eSB2ZXJpZmljYXRpb24gdGltZXIgKi8KKwl1bnNpZ25lZCB0MzkyOwkJLyogcG9sbGluZyB2ZXJpZmljYXRpb24gdGltZXIgKi8KKwl1bnNpZ25lZCBuMzkxOwkJLyogZnVsbCBzdGF0dXMgcG9sbGluZyBjeWNsZSBjb3VudGVyICovCisJdW5zaWduZWQgbjM5MjsJCS8qIGVycm9yIHRocmVzaG9sZCBjb3VudGVyICovCisJdW5zaWduZWQgbjM5MzsJCS8qIG1vbml0b3JlZCBldmVudHMgY291bnRlciAqLworCXVuc2lnbmVkIGRsY2lfbnVtOwkvKiBudW1iZXIgb2YgRExDcyAoYWNjZXNzIG5vZGUpICovCisJdW5zaWduZWQgIGRsY2lbMTAwXTsgICAgLyogTGlzdCBvZiBhbGwgRExDSXMgKi8KK30gd2FuX2ZyX2NvbmZfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQUFAtc3BlY2lmaWMgbGluay1sZXZlbCBjb25maWd1cmF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCB3YW5fcHBwX2NvbmYKK3sKKwl1bnNpZ25lZCByZXN0YXJ0X3RtcjsJLyogcmVzdGFydCB0aW1lciAqLworCXVuc2lnbmVkIGF1dGhfcnNydF90bXI7CS8qIGF1dGhlbnRpY2F0aW9uIHRpbWVyICovCisJdW5zaWduZWQgYXV0aF93YWl0X3RtcjsJLyogYXV0aGVudGljYXRpb24gdGltZXIgKi8KKwl1bnNpZ25lZCBtZG1fZmFpbF90bXI7CS8qIG1vZGVtIGZhaWx1cmUgdGltZXIgKi8KKwl1bnNpZ25lZCBkdHJfZHJvcF90bXI7CS8qIERUUiBkcm9wIHRpbWVyICovCisJdW5zaWduZWQgY29ubmVjdF90bW91dDsJLyogY29ubmVjdGlvbiB0aW1lb3V0ICovCisJdW5zaWduZWQgY29uZl9yZXRyeTsJLyogbWF4LiByZXRyeSAqLworCXVuc2lnbmVkIHRlcm1fcmV0cnk7CS8qIG1heC4gcmV0cnkgKi8KKwl1bnNpZ25lZCBmYWlsX3JldHJ5OwkvKiBtYXguIHJldHJ5ICovCisJdW5zaWduZWQgYXV0aF9yZXRyeTsJLyogbWF4LiByZXRyeSAqLworCXVuc2lnbmVkIGF1dGhfb3B0aW9uczsJLyogYXV0aGVudGljYXRpb24gb3B0LiAqLworCXVuc2lnbmVkIGlwX29wdGlvbnM7CS8qIElQIG9wdGlvbnMgKi8KKwljaGFyCWF1dGhlbnRpY2F0b3I7CS8qIEFVVEhFTlRJQ0FUT1Igb3Igbm90ICovCisJY2hhcglpcF9tb2RlOwkvKiBTdGF0aWMvSG9zdC9QZWVyICovCit9IHdhbl9wcHBfY29uZl90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENIRExDLXNwZWNpZmljIGxpbmstbGV2ZWwgY29uZmlndXJhdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgd2FuX2NoZGxjX2NvbmYKK3sKKwl1bnNpZ25lZCBjaGFyIGlnbm9yZV9kY2Q7CS8qIFByb3RvY29sIG9wdGlvbnM6CQkqLworCXVuc2lnbmVkIGNoYXIgaWdub3JlX2N0czsJLyogIElnbm9yZSB0aGVzZSB0byBkZXRlcm1pbmUJKi8KKwl1bnNpZ25lZCBjaGFyIGlnbm9yZV9rZWVwYWxpdmU7CS8qICBsaW5rIHN0YXR1cyAoWWVzIG9yIE5vKQkqLworCXVuc2lnbmVkIGNoYXIgaGRsY19zdHJlYW1pbmc7CS8qICBoZGxjX3N0cmVhbWluZyBtb2RlIChZL04pICovCisJdW5zaWduZWQgY2hhciByZWNlaXZlX29ubHk7CS8qICBubyB0cmFuc21pdCBidWZmZXJpbmcgKFkvTikgKi8KKwl1bnNpZ25lZCBrZWVwYWxpdmVfdHhfdG1yOwkvKiB0cmFuc21pdCBrZWVwYWxpdmUgdGltZXIgKi8KKwl1bnNpZ25lZCBrZWVwYWxpdmVfcnhfdG1yOwkvKiByZWNlaXZlICBrZWVwYWxpdmUgdGltZXIgKi8KKwl1bnNpZ25lZCBrZWVwYWxpdmVfZXJyX21hcmdpbjsJLyoga2VlcGFsaXZlX2Vycm9yX3RvbGVyYW5jZSAqLworCXVuc2lnbmVkIHNsYXJwX3RpbWVyOwkJLyogU0xBUlAgcmVxdWVzdCB0aW1lciAqLworfSB3YW5fY2hkbGNfY29uZl90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogV0FOIGRldmljZSBjb25maWd1cmF0aW9uLiBQYXNzZWQgdG8gUk9VVEVSX1NFVFVQIElPQ1RMLgorICovCit0eXBlZGVmIHN0cnVjdCB3YW5kZXZfY29uZgoreworCXVuc2lnbmVkIG1hZ2ljOwkJLyogbWFnaWMgbnVtYmVyIChmb3IgdmVyaWZpY2F0aW9uKSAqLworCXVuc2lnbmVkIGNvbmZpZ19pZDsJLyogY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgaWRlbnRpZmllciAqLworCQkJCS8qKioqKiogaGFyZHdhcmUgY29uZmlndXJhdGlvbiAqKioqKiovCisJdW5zaWduZWQgaW9wb3J0OwkvKiBhZGFwdGVyIEkvTyBwb3J0IGJhc2UgKi8KKwl1bnNpZ25lZCBsb25nIG1hZGRyOwkvKiBkdWFsLXBvcnQgbWVtb3J5IGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBtc2l6ZTsJCS8qIGR1YWwtcG9ydCBtZW1vcnkgc2l6ZSAqLworCWludCBpcnE7CQkvKiBpbnRlcnJ1cHQgcmVxdWVzdCBsZXZlbCAqLworCWludCBkbWE7CQkvKiBETUEgcmVxdWVzdCBsZXZlbCAqLworICAgICAgICBjaGFyIFM1MTRfQ1BVX25vWzFdOwkvKiBTNTE0IFBDSSBhZGFwdGVyIENQVSBudW1iZXIgKCdBJyBvciAnQicpICovCisgICAgICAgIHVuc2lnbmVkIFBDSV9zbG90X25vOwkvKiBTNTE0IFBDSSBhZGFwdGVyIHNsb3QgbnVtYmVyICovCisJY2hhciBhdXRvX3BjaV9jZmc7CS8qIFM1MTUgUENJIGF1dG9tYXRpYyBzbG90IGRldGVjdGlvbiAqLworCWNoYXIgY29tbV9wb3J0OwkJLyogQ29tbXVuaWNhdGlvbiBQb3J0IChQUkk9MCwgU0VDPTEpICovIAorCXVuc2lnbmVkIGJwczsJCS8qIGRhdGEgdHJhbnNmZXIgcmF0ZSAqLworCXVuc2lnbmVkIG10dTsJCS8qIG1heGltdW0gdHJhbnNtaXQgdW5pdCBzaXplICovCisgICAgICAgIHVuc2lnbmVkIHVkcF9wb3J0OyAgICAgIC8qIFVEUCBwb3J0IGZvciBtYW5hZ2VtZW50ICovCisJdW5zaWduZWQgY2hhciB0dGw7CS8qIFRpbWUgVG8gTGl2ZSBmb3IgVURQIHNlY3VyaXR5ICovCisJdW5zaWduZWQgY2hhciBmdDE7CS8qIEZUMSBDb25maWd1cmF0b3IgT3B0aW9uICovCisgICAgICAgIGNoYXIgaW50ZXJmYWNlOwkJLyogUlMtMjMyL1YuMzUsIGV0Yy4gKi8KKwljaGFyIGNsb2NraW5nOwkJLyogZXh0ZXJuYWwvaW50ZXJuYWwgKi8KKwljaGFyIGxpbmVfY29kaW5nOwkvKiBOUlovTlJaSS9GTTAvRk0xLCBldGMuICovCisJY2hhciBzdGF0aW9uOwkJLyogRFRFL0RDRSwgcHJpbWFyeS9zZWNvbmRhcnksIGV0Yy4gKi8KKwljaGFyIGNvbm5lY3Rpb247CS8qIHBlcm1hbmVudC9zd2l0Y2hlZC9vbi1kZW1hbmQgKi8KKwljaGFyIHJlYWRfbW9kZTsJCS8qIHJlYWQgbW9kZTogUG9sbGluZyBvciBpbnRlcnJ1cHQgKi8KKwljaGFyIHJlY2VpdmVfb25seTsJLyogZGlzYWJsZSB0eCBidWZmZXJzICovCisJY2hhciB0dHk7CQkvKiBDcmVhdGUgYSBmYWtlIHR0eSBkZXZpY2UgKi8KKwl1bnNpZ25lZCB0dHlfbWFqb3I7CS8qIE1ham9yIG51bWJlciBmb3Igd2FucGlwZSB0dHkgZGV2aWNlICovCisJdW5zaWduZWQgdHR5X21pbm9yOyAJLyogTWlub3IgbnVtYmVyIGZvciB3YW5waXBlIHR0eSBkZXZpY2UgKi8KKwl1bnNpZ25lZCB0dHlfbW9kZTsJLyogVFRZIG9wZXJhdGlvbiBtb2RlIFNZTkMgb3IgQVNZTkMgKi8KKwljaGFyIGJhY2t1cDsJCS8qIEJhY2t1cCBNb2RlICovCisJdW5zaWduZWQgaHdfb3B0WzRdOwkvKiBvdGhlciBoYXJkd2FyZSBvcHRpb25zICovCisJdW5zaWduZWQgcmVzZXJ2ZWRbNF07CisJCQkJLyoqKioqKiBhcmJpdHJhcnkgZGF0YSAqKioqKioqKioqKioqKiovCisJdW5zaWduZWQgZGF0YV9zaXplOwkvKiBkYXRhIGJ1ZmZlciBzaXplICovCisJdm9pZCogZGF0YTsJCS8qIGRhdGEgYnVmZmVyLCBlLmcuIGZpcm13YXJlICovCisJdW5pb24JCQkvKioqKioqIHByb3RvY29sLXNwZWNpZmljICoqKioqKioqKioqKi8KKwl7CisJCXdhbl94MjVfY29uZl90IHgyNTsJLyogWC4yNSBjb25maWd1cmF0aW9uICovCisJCXdhbl9wcHBfY29uZl90IHBwcDsJLyogUFBQIGNvbmZpZ3VyYXRpb24gKi8KKwkJd2FuX2ZyX2NvbmZfdCBmcjsJLyogZnJhbWUgcmVsYXkgY29uZmlndXJhdGlvbiAqLworCQl3YW5fY2hkbGNfY29uZl90IGNoZGxjOwkvKiBDaXNjbyBIRExDIGNvbmZpZ3VyYXRpb24gKi8KKwl9IHU7Cit9IHdhbmRldl9jb25mX3Q7CisKKy8qICdjb25maWdfaWQnIGRlZmluaXRpb25zICovCisjZGVmaW5lCVdBTkNPTkZJR19YMjUJMTAxCS8qIFguMjUgbGluayAqLworI2RlZmluZQlXQU5DT05GSUdfRlIJMTAyCS8qIGZyYW1lIHJlbGF5IGxpbmsgKi8KKyNkZWZpbmUJV0FOQ09ORklHX1BQUAkxMDMJLyogc3luY2hyb25vdXMgUFBQIGxpbmsgKi8KKyNkZWZpbmUgV0FOQ09ORklHX0NIRExDCTEwNAkvKiBDaXNjbyBIRExDIExpbmsgKi8KKyNkZWZpbmUgV0FOQ09ORklHX0JTQwkxMDUJLyogQmlTeW5jIFN0cmVhbWluZyAqLworI2RlZmluZSBXQU5DT05GSUdfSERMQwkxMDYJLyogSERMQyBTdXBwb3J0ICovCisjZGVmaW5lIFdBTkNPTkZJR19NUFBQICAxMDcJLyogTXVsdGkgUG9ydCBQUFAgb3ZlciBSQVcgQ0hETEMgKi8KKworLyoKKyAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBkZWZpbmVzLgorICovCisvKiBnZW5lcmFsIG9wdGlvbnMgKi8KKyNkZWZpbmUJV0FOT1BUX09GRgkwCisjZGVmaW5lCVdBTk9QVF9PTgkxCisjZGVmaW5lCVdBTk9QVF9OTwkwCisjZGVmaW5lCVdBTk9QVF9ZRVMJMQorCisvKiBpbnRlcmNhY2Ugb3B0aW9ucyAqLworI2RlZmluZQlXQU5PUFRfUlMyMzIJMAorI2RlZmluZQlXQU5PUFRfVjM1CTEKKworLyogZGF0YSBlbmNvZGluZyBvcHRpb25zICovCisjZGVmaW5lCVdBTk9QVF9OUloJMAorI2RlZmluZQlXQU5PUFRfTlJaSQkxCisjZGVmaW5lCVdBTk9QVF9GTTAJMgorI2RlZmluZQlXQU5PUFRfRk0xCTMKKworLyogbGluayB0eXBlIG9wdGlvbnMgKi8KKyNkZWZpbmUJV0FOT1BUX1BPSU5UVE9QT0lOVAkwCS8qIFJUUyBhbHdheXMgYWN0aXZlICovCisjZGVmaW5lCVdBTk9QVF9NVUxUSURST1AJMQkvKiBSVFMgaXMgYWN0aXZlIHdoZW4gdHJhbnNtaXR0aW5nICovCisKKy8qIGNsb2NraW5nIG9wdGlvbnMgKi8KKyNkZWZpbmUJV0FOT1BUX0VYVEVSTkFMCTAKKyNkZWZpbmUJV0FOT1BUX0lOVEVSTkFMCTEKKworLyogc3RhdGlvbiBvcHRpb25zICovCisjZGVmaW5lCVdBTk9QVF9EVEUJCTAKKyNkZWZpbmUJV0FOT1BUX0RDRQkJMQorI2RlZmluZQlXQU5PUFRfQ1BFCQkwCisjZGVmaW5lCVdBTk9QVF9OT0RFCQkxCisjZGVmaW5lCVdBTk9QVF9TRUNPTkRBUlkJMAorI2RlZmluZQlXQU5PUFRfUFJJTUFSWQkJMQorCisvKiBjb25uZWN0aW9uIG9wdGlvbnMgKi8KKyNkZWZpbmUJV0FOT1BUX1BFUk1BTkVOVAkwCS8qIERUUiBhbHdheXMgYWN0aXZlICovCisjZGVmaW5lCVdBTk9QVF9TV0lUQ0hFRAkJMQkvKiB1c2UgRFRSIHRvIHNldHVwIGxpbmsgKGRpYWwtdXApICovCisjZGVmaW5lCVdBTk9QVF9PTkRFTUFORAkJMgkvKiBhY3RpdmF0ZSBEVFIgb25seSBiZWZvcmUgc2VuZGluZyAqLworCisvKiBmcmFtZSByZWxheSBpbi1jaGFubmVsIHNpZ25hbGxpbmcgKi8KKyNkZWZpbmUJV0FOT1BUX0ZSX0FOU0kJCTEJLyogQU5TSSBUMS42MTcgQW5uZXggRCAqLworI2RlZmluZQlXQU5PUFRfRlJfUTkzMwkJMgkvKiBJVFUgUS45MzNBICovCisjZGVmaW5lCVdBTk9QVF9GUl9MTUkJCTMJLyogTE1JICovCisKKy8qIFBQUCBJUCBNb2RlIE9wdGlvbnMgKi8KKyNkZWZpbmUJV0FOT1BUX1BQUF9TVEFUSUMJMAorI2RlZmluZQlXQU5PUFRfUFBQX0hPU1QJCTEKKyNkZWZpbmUJV0FOT1BUX1BQUF9QRUVSCQkyCisKKy8qIEFTWSBNb2RlIE9wdGlvbnMgKi8KKyNkZWZpbmUgV0FOT1BUX09ORSAJCTEKKyNkZWZpbmUgV0FOT1BUX1RXTwkJMgorI2RlZmluZSBXQU5PUFRfT05FX0FORF9IQUxGCTMKKworI2RlZmluZSBXQU5PUFRfTk9ORQkwCisjZGVmaW5lIFdBTk9QVF9PREQgICAgICAxCisjZGVmaW5lIFdBTk9QVF9FVkVOCTIKKworLyogQ0hETEMgUHJvdG9jb2wgT3B0aW9ucyAqLworLyogREYgQ29tbW1lbnRlZCBvdXQgZm9yIG5vdy4KKworI2RlZmluZSBXQU5PUFRfQ0hETENfTk9fRENECQlJR05PUkVfRENEX0ZPUl9MSU5LX1NUQVQKKyNkZWZpbmUgV0FOT1BUX0NIRExDX05PX0NUUwkJSUdOT1JFX0NUU19GT1JfTElOS19TVEFUCisjZGVmaW5lIFdBTk9QVF9DSERMQ19OT19LRUVQQUxJVkUJSUdOT1JFX0tQQUxWX0ZPUl9MSU5LX1NUQVQKKyovCisKKy8qIFBvcnQgb3B0aW9ucyAqLworI2RlZmluZSBXQU5PUFRfUFJJIDAKKyNkZWZpbmUgV0FOT1BUX1NFQyAxCisvKiByZWFkIG1vZGUgKi8KKyNkZWZpbmUJV0FOT1BUX0lOVFIJMAorI2RlZmluZSBXQU5PUFRfUE9MTAkxCisKKworI2RlZmluZSBXQU5PUFRfVFRZX1NZTkMgIDAKKyNkZWZpbmUgV0FOT1BUX1RUWV9BU1lOQyAxCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFdBTiBMaW5rIFN0YXR1cyBJbmZvIChmb3IgUk9VVEVSX1NUQVQgSU9DVEwpLgorICovCit0eXBlZGVmIHN0cnVjdCB3YW5kZXZfc3RhdAoreworCXVuc2lnbmVkIHN0YXRlOwkJLyogbGluayBzdGF0ZSAqLworCXVuc2lnbmVkIG5kZXY7CQkvKiBudW1iZXIgb2YgY29uZmlndXJlZCBpbnRlcmZhY2VzICovCisKKwkvKiBsaW5rL2ludGVyZmFjZSBjb25maWd1cmF0aW9uICovCisJdW5zaWduZWQgY29ubmVjdGlvbjsJLyogcGVybWFuZW50L3N3aXRjaGVkL29uLWRlbWFuZCAqLworCXVuc2lnbmVkIG1lZGlhX3R5cGU7CS8qIEZyYW1lIHJlbGF5L1BQUC9YLjI1L1NETEMsIGV0Yy4gKi8KKwl1bnNpZ25lZCBtdHU7CQkvKiBtYXguIHRyYW5zbWl0IHVuaXQgZm9yIHRoaXMgZGV2aWNlICovCisKKwkvKiBwaHlzaWNhbCBsZXZlbCBzdGF0aXN0aWNzICovCisJdW5zaWduZWQgbW9kZW1fc3RhdHVzOwkvKiBtb2RlbSBzdGF0dXMgKi8KKwl1bnNpZ25lZCByeF9mcmFtZXM7CS8qIHJlY2VpdmVkIGZyYW1lcyBjb3VudCAqLworCXVuc2lnbmVkIHJ4X292ZXJydW5zOwkvKiByZWNlaXZlciBvdmVycnVuIGVycm9yIGNvdW50ICovCisJdW5zaWduZWQgcnhfY3JjX2VycjsJLyogcmVjZWl2ZSBDUkMgZXJyb3IgY291bnQgKi8KKwl1bnNpZ25lZCByeF9hYm9ydHM7CS8qIHJlY2VpdmVkIGFib3J0ZWQgZnJhbWVzIGNvdW50ICovCisJdW5zaWduZWQgcnhfYmFkX2xlbmd0aDsJLyogdW5leHBldGVkbHkgbG9uZy9zaG9ydCBmcmFtZXMgY291bnQgKi8KKwl1bnNpZ25lZCByeF9kcm9wcGVkOwkvKiBmcmFtZXMgZGlzY2FyZGVkIGF0IGRldmljZSBsZXZlbCAqLworCXVuc2lnbmVkIHR4X2ZyYW1lczsJLyogdHJhbnNtaXR0ZWQgZnJhbWVzIGNvdW50ICovCisJdW5zaWduZWQgdHhfdW5kZXJydW5zOwkvKiBhYm9ydGVkIHRyYW5zbWlzc2lvbnMgKHVuZGVycnVucykgY291bnQgKi8KKwl1bnNpZ25lZCB0eF90aW1lb3V0czsJLyogdHJhbnNtaXNzaW9uIHRpbWVvdXRzICovCisJdW5zaWduZWQgdHhfcmVqZWN0czsJLyogb3RoZXIgdHJhbnNtaXQgZXJyb3JzICovCisKKwkvKiBtZWRpYSBsZXZlbCBzdGF0aXN0aWNzICovCisJdW5zaWduZWQgcnhfYmFkX2Zvcm1hdDsJLyogZnJhbWVzIHdpdGggaW52YWxpZCBmb3JtYXQgKi8KKwl1bnNpZ25lZCByeF9iYWRfYWRkcjsJLyogZnJhbWVzIHdpdGggaW52YWxpZCBtZWRpYSBhZGRyZXNzICovCisJdW5zaWduZWQgdHhfcmV0cmllczsJLyogZnJhbWVzIHJlLXRyYW5zbWl0dGVkICovCisJdW5zaWduZWQgcmVzZXJ2ZWRbMTZdOwkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworfSB3YW5kZXZfc3RhdF90OworCisvKiAnc3RhdGUnIGRlZmluZXMgKi8KK2VudW0gd2FuX3N0YXRlcworeworCVdBTl9VTkNPTkZJR1VSRUQsCS8qIGxpbmsvY2hhbm5lbCBpcyBub3QgY29uZmlndXJlZCAqLworCVdBTl9ESVNDT05ORUNURUQsCS8qIGxpbmsvY2hhbm5lbCBpcyBkaXNjb25uZWN0ZWQgKi8KKwlXQU5fQ09OTkVDVElORywJCS8qIGNvbm5lY3Rpb24gaXMgaW4gcHJvZ3Jlc3MgKi8KKwlXQU5fQ09OTkVDVEVELAkJLyogbGluay9jaGFubmVsIGlzIG9wZXJhdGlvbmFsICovCisJV0FOX0xJTUlULAkJLyogZm9yIHZlcmlmaWNhdGlvbiBvbmx5ICovCisJV0FOX0RVQUxQT1JULAkJLyogZm9yIER1YWwgUG9ydCBjYXJkcyAqLworCVdBTl9ESVNDT05ORUNUSU5HLAorCVdBTl9GVDFfUkVBRFkJCS8qIEZUMSBDb25maWd1cmF0b3IgUmVhZHkgKi8KK307CisKK2VudW0geworCVdBTl9MT0NBTF9JUCwKKwlXQU5fUE9JTlRPUE9JTlRfSVAsCisJV0FOX05FVE1BU0tfSVAsCisJV0FOX0JST0FEQ0FTVF9JUAorfTsKKworLyogJ21vZGVtX3N0YXR1cycgbWFza3MgKi8KKyNkZWZpbmUJV0FOX01PREVNX0NUUwkweDAwMDEJLyogQ1RTIGxpbmUgYWN0aXZlICovCisjZGVmaW5lCVdBTl9NT0RFTV9EQ0QJMHgwMDAyCS8qIERDRCBsaW5lIGFjdGl2ZSAqLworI2RlZmluZQlXQU5fTU9ERU1fRFRSCTB4MDAxMAkvKiBEVFIgbGluZSBhY3RpdmUgKi8KKyNkZWZpbmUJV0FOX01PREVNX1JUUwkweDAwMjAJLyogUlRTIGxpbmUgYWN0aXZlICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogV0FOIGludGVyZmFjZSAobG9naWNhbCBjaGFubmVsKSBjb25maWd1cmF0aW9uIChmb3IgUk9VVEVSX0lGTkVXIElPQ1RMKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgd2FuaWZfY29uZgoreworCXVuc2lnbmVkIG1hZ2ljOwkJCS8qIG1hZ2ljIG51bWJlciAqLworCXVuc2lnbmVkIGNvbmZpZ19pZDsJCS8qIGNvbmZpZ3VyYXRpb24gaWRlbnRpZmllciAqLworCWNoYXIgbmFtZVtXQU5fSUZOQU1FX1NaKzFdOwkvKiBpbnRlcmZhY2UgbmFtZSwgQVNDSUlaICovCisJY2hhciBhZGRyW1dBTl9BRERSRVNTX1NaKzFdOwkvKiBtZWRpYSBhZGRyZXNzLCBBU0NJSVogKi8KKwljaGFyIHVzZWRieVtVU0VEX0JZX0ZJRUxEXTsJLyogdXNlZCBieSBBUEkgb3IgV0FOUElQRSAqLworCXVuc2lnbmVkIGlkbGVfdGltZW91dDsJCS8qIHNlYywgYmVmb3JlIGRpc2Nvbm5lY3RpbmcgKi8KKwl1bnNpZ25lZCBob2xkX3RpbWVvdXQ7CQkvKiBzZWMsIGJlZm9yZSByZS1jb25uZWN0aW5nICovCisJdW5zaWduZWQgY2lyOwkJCS8qIENvbW1pdHRlZCBJbmZvcm1hdGlvbiBSYXRlIGZ3ZCxid2QqLworCXVuc2lnbmVkIGJjOwkJCS8qIENvbW1pdHRlZCBCdXJzdCBTaXplIGZ3ZCwgYndkICovCisJdW5zaWduZWQgYmU7CQkJLyogRXhjZXNzIEJ1cnN0IFNpemUgZndkLCBid2QgKi8gCisJdW5zaWduZWQgY2hhciBlbmFibGVfSVBYOwkvKiBFbmFibGUgb3IgRGlzYWJsZSBJUFggKi8KKwl1bnNpZ25lZCBjaGFyIGluYXJwOwkJLyogU2VuZCBJbnZlcnNlIEFSUCByZXF1ZXN0cyBZL04gKi8KKwl1bnNpZ25lZCBpbmFycF9pbnRlcnZhbDsJLyogc2VjLCBiZXR3ZWVuIEluQVJQIHJlcXVlc3RzICovCisJdW5zaWduZWQgbG9uZyBuZXR3b3JrX251bWJlcjsJLyogTmV0d29yayBOdW1iZXIgZm9yIElQWCAqLworCWNoYXIgbWM7CQkJLyogTXVsdGljYXN0IG9uIG9yIG9mZiAqLworCWNoYXIgbG9jYWxfYWRkcltXQU5fQUREUkVTU19TWisxXTsvKiBsb2NhbCBtZWRpYSBhZGRyZXNzLCBBU0NJSVogKi8KKwl1bnNpZ25lZCBjaGFyIHBvcnQ7CQkvKiBib2FyZCBwb3J0ICovCisJdW5zaWduZWQgY2hhciBwcm90b2NvbDsJCS8qIHByb2NvY29sIHVzZWQgaW4gdGhpcyBjaGFubmVsIChUQ1BPWDI1IG9yIFgyNSkgKi8KKwljaGFyIHBhcDsJCQkvKiBQQVAgZW5hYmxlZCBvciBkaXNhYmxlZCAqLworCWNoYXIgY2hhcDsJCQkvKiBDSEFQIGVuYWJsZWQgb3IgZGlzYWJsZWQgKi8KKwl1bnNpZ25lZCBjaGFyIHVzZXJpZFs1MTFdOwkvKiBMaXN0IG9mIFVzZXIgSWQgKi8KKwl1bnNpZ25lZCBjaGFyIHBhc3N3ZFs1MTFdOwkvKiBMaXN0IG9mIHBhc3N3b3JkcyAqLworCXVuc2lnbmVkIGNoYXIgc3lzbmFtZVszMV07CS8qIE5hbWUgb2YgdGhlIHN5c3RlbSAqLworCXVuc2lnbmVkIGNoYXIgaWdub3JlX2RjZDsJLyogUHJvdG9jb2wgb3B0aW9uczogKi8KKwl1bnNpZ25lZCBjaGFyIGlnbm9yZV9jdHM7CS8qICBJZ25vcmUgdGhlc2UgdG8gZGV0ZXJtaW5lICovCisJdW5zaWduZWQgY2hhciBpZ25vcmVfa2VlcGFsaXZlOwkvKiAgbGluayBzdGF0dXMgKFllcyBvciBObykgKi8KKwl1bnNpZ25lZCBjaGFyIGhkbGNfc3RyZWFtaW5nOwkvKiAgSGRsYyBzdHJlYW1pbmcgbW9kZSAoWS9OKSAqLworCXVuc2lnbmVkIGtlZXBhbGl2ZV90eF90bXI7CS8qIHRyYW5zbWl0IGtlZXBhbGl2ZSB0aW1lciAqLworCXVuc2lnbmVkIGtlZXBhbGl2ZV9yeF90bXI7CS8qIHJlY2VpdmUgIGtlZXBhbGl2ZSB0aW1lciAqLworCXVuc2lnbmVkIGtlZXBhbGl2ZV9lcnJfbWFyZ2luOwkvKiBrZWVwYWxpdmVfZXJyb3JfdG9sZXJhbmNlICovCisJdW5zaWduZWQgc2xhcnBfdGltZXI7CQkvKiBTTEFSUCByZXF1ZXN0IHRpbWVyICovCisJdW5zaWduZWQgY2hhciB0dGw7CQkvKiBUaW1lIFRvIExpdmUgZm9yIFVEUCBzZWN1cml0eSAqLworCWNoYXIgaW50ZXJmYWNlOwkJCS8qIFJTLTIzMi9WLjM1LCBldGMuICovCisJY2hhciBjbG9ja2luZzsJCQkvKiBleHRlcm5hbC9pbnRlcm5hbCAqLworCXVuc2lnbmVkIGJwczsJCQkvKiBkYXRhIHRyYW5zZmVyIHJhdGUgKi8KKwl1bnNpZ25lZCBtdHU7CQkJLyogbWF4aW11bSB0cmFuc21pdCB1bml0IHNpemUgKi8KKwl1bnNpZ25lZCBjaGFyIGlmX2Rvd247CQkvKiBicmluZCBkb3duIGludGVyZmFjZSB3aGVuIGRpc2Nvbm5lY3RlZCAqLworCXVuc2lnbmVkIGNoYXIgZ2F0ZXdheTsJCS8qIElzIHRoaXMgaW50ZXJmYWNlIGEgZ2F0ZXdheSAqLworCXVuc2lnbmVkIGNoYXIgdHJ1ZV9pZl9lbmNvZGluZzsJLyogU2V0IHRoZSBkZXYtPnR5cGUgdG8gdHJ1ZSBib2FyZCBwcm90b2NvbCAqLworCisJdW5zaWduZWQgY2hhciBhc3lfZGF0YV90cmFuczsgICAgIC8qIGFzeW5jIEFQSSBvcHRpb25zICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgcnRzX2hzX2Zvcl9yZWNlaXZlOyAvKiBhc3luYyBQcm90b2NvbCBvcHRpb25zICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgeG9uX3hvZmZfaHNfZm9yX3JlY2VpdmU7CisJdW5zaWduZWQgY2hhciB4b25feG9mZl9oc19mb3JfdHJhbnNtaXQ7CisJdW5zaWduZWQgY2hhciBkY2RfaHNfZm9yX3RyYW5zbWl0OworCXVuc2lnbmVkIGNoYXIgY3RzX2hzX2Zvcl90cmFuc21pdDsKKwl1bnNpZ25lZCBjaGFyIGFzeW5jX21vZGU7CisJdW5zaWduZWQgdHhfYml0c19wZXJfY2hhcjsKKwl1bnNpZ25lZCByeF9iaXRzX3Blcl9jaGFyOworCXVuc2lnbmVkIHN0b3BfYml0czsgIAorCXVuc2lnbmVkIGNoYXIgcGFyaXR5OworIAl1bnNpZ25lZCBicmVha190aW1lcjsKKyAgICAgICAgdW5zaWduZWQgaW50ZXJfY2hhcl90aW1lcjsKKwl1bnNpZ25lZCByeF9jb21wbGV0ZV9sZW5ndGg7CisJdW5zaWduZWQgeG9uX2NoYXI7CisJdW5zaWduZWQgeG9mZl9jaGFyOworCXVuc2lnbmVkIGNoYXIgcmVjZWl2ZV9vbmx5OwkvKiAgbm8gdHJhbnNtaXQgYnVmZmVyaW5nIChZL04pICovCit9IHdhbmlmX2NvbmZfdDsKKworI2VuZGlmCS8qIF9ST1VURVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC93YXRjaGRvZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC93YXRjaGRvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYzBjNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3dhdGNoZG9nLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqCUdlbmVyaWMgd2F0Y2hkb2cgZGVmaW5lcy4gRGVyaXZlZCBmcm9tLi4KKyAqCisgKiBCZXJrc2hpcmUgUEMgV2F0Y2hkb2cgRGVmaW5lcworICogYnkgS2VuIEhvbGxpcyA8a2hvbGxpc0BiaXRnYXRlLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfV0FUQ0hET0dfSAorI2RlZmluZSBfTElOVVhfV0FUQ0hET0dfSAorCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lCVdBVENIRE9HX0lPQ1RMX0JBU0UJJ1cnCisKK3N0cnVjdCB3YXRjaGRvZ19pbmZvIHsKKwlfX3UzMiBvcHRpb25zOwkJLyogT3B0aW9ucyB0aGUgY2FyZC9kcml2ZXIgc3VwcG9ydHMgKi8KKwlfX3UzMiBmaXJtd2FyZV92ZXJzaW9uOwkvKiBGaXJtd2FyZSB2ZXJzaW9uIG9mIHRoZSBjYXJkICovCisJX191OCAgaWRlbnRpdHlbMzJdOwkvKiBJZGVudGl0eSBvZiB0aGUgYm9hcmQgKi8KK307CisKKyNkZWZpbmUJV0RJT0NfR0VUU1VQUE9SVAlfSU9SKFdBVENIRE9HX0lPQ1RMX0JBU0UsIDAsIHN0cnVjdCB3YXRjaGRvZ19pbmZvKQorI2RlZmluZQlXRElPQ19HRVRTVEFUVVMJCV9JT1IoV0FUQ0hET0dfSU9DVExfQkFTRSwgMSwgaW50KQorI2RlZmluZQlXRElPQ19HRVRCT09UU1RBVFVTCV9JT1IoV0FUQ0hET0dfSU9DVExfQkFTRSwgMiwgaW50KQorI2RlZmluZQlXRElPQ19HRVRURU1QCQlfSU9SKFdBVENIRE9HX0lPQ1RMX0JBU0UsIDMsIGludCkKKyNkZWZpbmUJV0RJT0NfU0VUT1BUSU9OUwlfSU9SKFdBVENIRE9HX0lPQ1RMX0JBU0UsIDQsIGludCkKKyNkZWZpbmUJV0RJT0NfS0VFUEFMSVZFCQlfSU9SKFdBVENIRE9HX0lPQ1RMX0JBU0UsIDUsIGludCkKKyNkZWZpbmUJV0RJT0NfU0VUVElNRU9VVCAgICAgICAgX0lPV1IoV0FUQ0hET0dfSU9DVExfQkFTRSwgNiwgaW50KQorI2RlZmluZQlXRElPQ19HRVRUSU1FT1VUICAgICAgICBfSU9SKFdBVENIRE9HX0lPQ1RMX0JBU0UsIDcsIGludCkKKyNkZWZpbmUJV0RJT0NfU0VUUFJFVElNRU9VVAlfSU9XUihXQVRDSERPR19JT0NUTF9CQVNFLCA4LCBpbnQpCisjZGVmaW5lCVdESU9DX0dFVFBSRVRJTUVPVVQJX0lPUihXQVRDSERPR19JT0NUTF9CQVNFLCA5LCBpbnQpCisjZGVmaW5lCVdESU9DX0dFVFRJTUVMRUZUCV9JT1IoV0FUQ0hET0dfSU9DVExfQkFTRSwgMTAsIGludCkKKworI2RlZmluZQlXRElPRl9VTktOT1dOCQktMQkvKiBVbmtub3duIGZsYWcgZXJyb3IgKi8KKyNkZWZpbmUJV0RJT1NfVU5LTk9XTgkJLTEJLyogVW5rbm93biBzdGF0dXMgZXJyb3IgKi8KKworI2RlZmluZQlXRElPRl9PVkVSSEVBVAkJMHgwMDAxCS8qIFJlc2V0IGR1ZSB0byBDUFUgb3ZlcmhlYXQgKi8KKyNkZWZpbmUJV0RJT0ZfRkFORkFVTFQJCTB4MDAwMgkvKiBGYW4gZmFpbGVkICovCisjZGVmaW5lCVdESU9GX0VYVEVSTjEJCTB4MDAwNAkvKiBFeHRlcm5hbCByZWxheSAxICovCisjZGVmaW5lCVdESU9GX0VYVEVSTjIJCTB4MDAwOAkvKiBFeHRlcm5hbCByZWxheSAyICovCisjZGVmaW5lCVdESU9GX1BPV0VSVU5ERVIJMHgwMDEwCS8qIFBvd2VyIGJhZC9wb3dlciBmYXVsdCAqLworI2RlZmluZQlXRElPRl9DQVJEUkVTRVQJCTB4MDAyMAkvKiBDYXJkIHByZXZpb3VzbHkgcmVzZXQgdGhlIENQVSAqLworI2RlZmluZQlXRElPRl9QT1dFUk9WRVIJCTB4MDA0MAkvKiBQb3dlciBvdmVyIHZvbHRhZ2UgKi8KKyNkZWZpbmUJV0RJT0ZfU0VUVElNRU9VVAkweDAwODAgIC8qIFNldCB0aW1lb3V0IChpbiBzZWNvbmRzKSAqLworI2RlZmluZQlXRElPRl9NQUdJQ0NMT1NFCTB4MDEwMAkvKiBTdXBwb3J0cyBtYWdpYyBjbG9zZSBjaGFyICovCisjZGVmaW5lCVdESU9GX1BSRVRJTUVPVVQJMHgwMjAwICAvKiBQcmV0aW1lb3V0IChpbiBzZWNvbmRzKSwgZ2V0L3NldCAqLworI2RlZmluZQlXRElPRl9LRUVQQUxJVkVQSU5HCTB4ODAwMAkvKiBLZWVwIGFsaXZlIHBpbmcgcmVwbHkgKi8KKworI2RlZmluZQlXRElPU19ESVNBQkxFQ0FSRAkweDAwMDEJLyogVHVybiBvZmYgdGhlIHdhdGNoZG9nIHRpbWVyICovCisjZGVmaW5lCVdESU9TX0VOQUJMRUNBUkQJMHgwMDAyCS8qIFR1cm4gb24gdGhlIHdhdGNoZG9nIHRpbWVyICovCisjZGVmaW5lCVdESU9TX1RFTVBQQU5JQwkJMHgwMDA0CS8qIEtlcm5lbCBwYW5pYyBvbiB0ZW1wZXJhdHVyZSB0cmlwICovCisKKworI2VuZGlmICAvKiBpZm5kZWYgX0xJTlVYX1dBVENIRE9HX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvd2ltYXguaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvd2ltYXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjZiNzdhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC93aW1heC5oCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogTGludXggV2lNYXgKKyAqIEFQSSBmb3IgdXNlciBzcGFjZQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKiAgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKgorICoKKyAqIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgdXNlci9rZXJuZWwgcHJvdG9jb2wgdGhhdCBpcyBzcG9rZW4gb3ZlcgorICogR2VuZXJpYyBOZXRsaW5rLCBhcyB3ZWxsIGFzIGFueSB0eXBlIGRlY2xhcmF0aW9uIHRoYXQgaXMgdG8gYmUgdXNlZAorICogYnkga2VybmVsIGFuZCB1c2VyIHNwYWNlLgorICoKKyAqIEl0IGlzIGludGVuZGVkIGZvciB1c2VyIHNwYWNlIHRvIGNsb25lIGl0IHZlcmJhdGltIHRvIHVzZSBpdCBhcyBhCisgKiBwcmltYXJ5IHJlZmVyZW5jZSBmb3IgZGVmaW5pdGlvbnMuCisgKgorICogU3R1ZmYgaW50ZW5kZWQgZm9yIGtlcm5lbCB1c2FnZSBhcyB3ZWxsIGFzIGZ1bGwgcHJvdG9jb2wgYW5kIHN0YWNrCisgKiBkb2N1bWVudGF0aW9uIGlzIHJvb3RlZCBpbiBpbmNsdWRlL25ldC93aW1heC5oLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9fV0lNQVhfSF9fCisjZGVmaW5lIF9fTElOVVhfX1dJTUFYX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZW51bSB7CisJLyoqCisJICogVmVyc2lvbiBvZiB0aGUgaW50ZXJmYWNlICh1bnNpZ25lZCBkZWNpbWFsLCBNTW0sIG1heCAyNS41KQorCSAqIE0gLSBNYWpvcjogY2hhbmdlIGlmIHJlbW92aW5nIG9yIG1vZGlmeWluZyBhbiBleGlzdGluZyBjYWxsLgorCSAqIG0gLSBtaW5vcjogY2hhbmdlIHdoZW4gYWRkaW5nIGEgbmV3IGNhbGwKKwkgKi8KKwlXSU1BWF9HTkxfVkVSU0lPTiA9IDAxLAorCS8qIEdlbmVyaWMgTmV0TGluayBhdHRyaWJ1dGVzICovCisJV0lNQVhfR05MX0FUVFJfSU5WQUxJRCA9IDB4MDAsCisJV0lNQVhfR05MX0FUVFJfTUFYID0gMTAsCit9OworCisKKy8qCisgKiBHZW5lcmljIE5ldExpbmsgb3BlcmF0aW9ucworICoKKyAqIE1vc3Qgb2YgdGhlc2UgbWFwIHRvIGFuIEFQSSBjYWxsOyBfT1BfIHN0YW5kcyBmb3Igb3BlcmF0aW9uLCBfUlBfCisgKiBmb3IgcmVwbHkgYW5kIF9SRV8gZm9yIHJlcG9ydCAoYWthOiBzaWduYWwpLgorICovCitlbnVtIHsKKwlXSU1BWF9HTkxfT1BfTVNHX0ZST01fVVNFUiwJLyogVXNlciB0byBrZXJuZWwgbWVzc2FnZSAqLworCVdJTUFYX0dOTF9PUF9NU0dfVE9fVVNFUiwJLyogS2VybmVsIHRvIHVzZXIgbWVzc2FnZSAqLworCVdJTUFYX0dOTF9PUF9SRktJTEwsCS8qIFJ1biB3aW1heF9yZmtpbGwoKSAqLworCVdJTUFYX0dOTF9PUF9SRVNFVCwJLyogUnVuIHdpbWF4X3Jma2lsbCgpICovCisJV0lNQVhfR05MX1JFX1NUQVRFX0NIQU5HRSwJLyogUmVwb3J0OiBzdGF0dXMgY2hhbmdlICovCisJV0lNQVhfR05MX09QX1NUQVRFX0dFVCwJCS8qIFJlcXVlc3QgZm9yIGN1cnJlbnQgc3RhdGUgKi8KK307CisKKworLyogTWVzc2FnZSBmcm9tIHVzZXIgLyB0byB1c2VyICovCitlbnVtIHsKKwlXSU1BWF9HTkxfTVNHX0lGSURYID0gMSwKKwlXSU1BWF9HTkxfTVNHX1BJUEVfTkFNRSwKKwlXSU1BWF9HTkxfTVNHX0RBVEEsCit9OworCisKKy8qCisgKiB3aW1heF9yZmtpbGwoKQorICoKKyAqIFRoZSBzdGF0ZSBvZiB0aGUgcmFkaW8gKE9OL09GRikgaXMgbWFwcGVkIHRvIHRoZSByZmtpbGwgc3Vic3lzdGVtJ3MKKyAqIHN3aXRjaCBzdGF0ZSAoRElTQUJMRUQvRU5BQkxFRCkuCisgKi8KK2VudW0gd2ltYXhfcmZfc3RhdGUgeworCVdJTUFYX1JGX09GRiA9IDAsCS8qIFJhZGlvIGlzIG9mZiwgcmZraWxsIG9uL2VuYWJsZWQgKi8KKwlXSU1BWF9SRl9PTiA9IDEsCS8qIFJhZGlvIGlzIG9uLCByZmtpbGwgb2ZmL2Rpc2FibGVkICovCisJV0lNQVhfUkZfUVVFUlkgPSAyLAorfTsKKworLyogQXR0cmlidXRlcyAqLworZW51bSB7CisJV0lNQVhfR05MX1JGS0lMTF9JRklEWCA9IDEsCisJV0lNQVhfR05MX1JGS0lMTF9TVEFURSwKK307CisKKworLyogQXR0cmlidXRlcyBmb3Igd2ltYXhfcmVzZXQoKSAqLworZW51bSB7CisJV0lNQVhfR05MX1JFU0VUX0lGSURYID0gMSwKK307CisKKy8qIEF0dHJpYnV0ZXMgZm9yIHdpbWF4X3N0YXRlX2dldCgpICovCitlbnVtIHsKKwlXSU1BWF9HTkxfU1RHRVRfSUZJRFggPSAxLAorfTsKKworLyoKKyAqIEF0dHJpYnV0ZXMgZm9yIHRoZSBSZXBvcnQgU3RhdGUgQ2hhbmdlCisgKgorICogRm9yIG5vdyB3ZSBqdXN0IGhhdmUgdGhlIG9sZCBhbmQgbmV3IHN0YXRlczsgbmV3IGF0dHJpYnV0ZXMgbWlnaHQKKyAqIGJlIGFkZGVkIGxhdGVyIG9uLgorICovCitlbnVtIHsKKwlXSU1BWF9HTkxfU1RDSF9JRklEWCA9IDEsCisJV0lNQVhfR05MX1NUQ0hfU1RBVEVfT0xELAorCVdJTUFYX0dOTF9TVENIX1NUQVRFX05FVywKK307CisKKworLyoqCisgKiBlbnVtIHdpbWF4X3N0IC0gVGhlIGRpZmZlcmVudCBzdGF0ZXMgb2YgYSBXaU1BWCBkZXZpY2UKKyAqIEBfX1dJTUFYX1NUX05VTEw6IFRoZSBkZXZpY2Ugc3RydWN0dXJlIGhhcyBiZWVuIGFsbG9jYXRlZCBhbmQgemVyb2VkLAorICogICAgIGJ1dCBzdGlsbCB3aW1heF9kZXZfYWRkKCkgaGFzbid0IGJlZW4gY2FsbGVkLiBUaGVyZSBpcyBubyBzdGF0ZS4KKyAqCisgKiBAV0lNQVhfU1RfRE9XTjogVGhlIGRldmljZSBoYXMgYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlIFdpTUFYIGFuZAorICogICAgIG5ldHdvcmtpbmcgc3RhY2tzLCBidXQgaXQgaXMgbm90IGluaXRpYWxpemVkIChub3JtYWxseSB0aGF0IGlzCisgKiAgICAgZG9uZSB3aXRoICdpZmNvbmZpZyBERVYgdXAnIFtvciBlcXVpdmFsZW50XSwgd2hpY2ggY2FuIHVwbG9hZAorICogICAgIGZpcm13YXJlIGFuZCBlbmFibGUgY29tbXVuaWNhdGlvbnMgd2l0aCB0aGUgZGV2aWNlKS4KKyAqICAgICBJbiB0aGlzIHN0YXRlLCB0aGUgZGV2aWNlIGlzIHBvd2VyZWQgZG93biBhbmQgdXNpbmcgYXMgbGVzcworICogICAgIHBvd2VyIGFzIHBvc3NpYmxlLgorICogICAgIFRoaXMgc3RhdGUgaXMgdGhlIGRlZmF1bHQgYWZ0ZXIgYSBjYWxsIHRvIHdpbWF4X2Rldl9hZGQoKS4gSXQKKyAqICAgICBpcyBvayB0byBoYXZlIGRyaXZlcnMgbW92ZSBkaXJlY3RseSB0byAlV0lNQVhfU1RfVU5JTklUSUFMSVpFRAorICogICAgIG9yICVXSU1BWF9TVF9SQURJT19PRkYgaW4gX3Byb2JlKCkgYWZ0ZXIgdGhlIGNhbGwgdG8KKyAqICAgICB3aW1heF9kZXZfYWRkKCkuCisgKiAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgZHJpdmVyIGxlYXZlcyB0aGlzIHN0YXRlIHdoZW4KKyAqICAgICBjYWxsaW5nICdpZmNvbmZpZyBERVYgdXAnIGFuZCBlbnRlcnMgaXQgYmFjayBvbiAnaWZjb25maWcgREVWCisgKiAgICAgZG93bicuCisgKgorICogQF9fV0lNQVhfU1RfUVVJRVNDSU5HOiBUaGUgZGV2aWNlIGlzIGJlaW5nIHRvcm4gZG93biwgc28gbm8gQVBJCisgKiAgICAgb3BlcmF0aW9ucyBhcmUgYWxsb3dlZCB0byBwcm9jZWVkIGV4Y2VwdCB0aGUgb25lcyBuZWVkZWQgdG8KKyAqICAgICBjb21wbGV0ZSB0aGUgZGV2aWNlIGNsZWFuIHVwIHByb2Nlc3MuCisgKgorICogQFdJTUFYX1NUX1VOSU5JVElBTElaRUQ6IFtvcHRpb25hbF0gQ29tbXVuaWNhdGlvbiB3aXRoIHRoZSBkZXZpY2UKKyAqICAgICBpcyBzZXR1cCwgYnV0IHRoZSBkZXZpY2Ugc3RpbGwgcmVxdWlyZXMgc29tZSBjb25maWd1cmF0aW9uCisgKiAgICAgYmVmb3JlIGJlaW5nIG9wZXJhdGlvbmFsLgorICogICAgIFNvbWUgV2lNQVggQVBJIGNhbGxzIG1pZ2h0IHdvcmsuCisgKgorICogQFdJTUFYX1NUX1JBRElPX09GRjogVGhlIGRldmljZSBpcyBmdWxseSB1cDsgcmFkaW8gaXMgb2ZmICh3ZXRoZXIKKyAqICAgICBieSBoYXJkd2FyZSBvciBzb2Z0d2FyZSBzd2l0Y2hlcykuCisgKiAgICAgSXQgaXMgcmVjb21tZW5kZWQgdG8gYWx3YXlzIGxlYXZlIHRoZSBkZXZpY2UgaW4gdGhpcyBzdGF0ZQorICogICAgIGFmdGVyIGluaXRpYWxpemF0aW9uLgorICoKKyAqIEBXSU1BWF9TVF9SRUFEWTogVGhlIGRldmljZSBpcyBmdWxseSB1cCBhbmQgcmFkaW8gaXMgb24uCisgKgorICogQFdJTUFYX1NUX1NDQU5OSU5HOiBbb3B0aW9uYWxdIFRoZSBkZXZpY2UgaGFzIGJlZW4gaW5zdHJ1Y3RlZCB0bworICogICAgIHNjYW4uIEluIHRoaXMgc3RhdGUsIHRoZSBkZXZpY2UgY2Fubm90IGJlIGFjdGl2ZWx5IGNvbm5lY3RlZCB0bworICogICAgIGEgbmV0d29yay4KKyAqCisgKiBAV0lNQVhfU1RfQ09OTkVDVElORzogVGhlIGRldmljZSBpcyBjb25uZWN0aW5nIHRvIGEgbmV0d29yay4gVGhpcworICogICAgIHN0YXRlIGV4aXN0cyBiZWNhdXNlIGluIHNvbWUgZGV2aWNlcywgdGhlIGNvbm5lY3QgcHJvY2VzcyBjYW4KKyAqICAgICBpbmNsdWRlIGEgbnVtYmVyIG9mIG5lZ290aWF0aW9ucyBiZXR3ZWVuIHVzZXIgc3BhY2UsIGtlcm5lbAorICogICAgIHNwYWNlIGFuZCB0aGUgZGV2aWNlLiBVc2VyIHNwYWNlIG5lZWRzIHRvIGtub3cgd2hhdCB0aGUgZGV2aWNlCisgKiAgICAgaXMgZG9pbmcuIElmIHRoZSBjb25uZWN0IHNlcXVlbmNlIGluIGEgZGV2aWNlIGlzIGF0b21pYyBhbmQKKyAqICAgICBmYXN0LCB0aGUgZGV2aWNlIGNhbiB0cmFuc2l0aW9uIGRpcmVjdGx5IHRvIENPTk5FQ1RFRAorICoKKyAqIEBXSU1BWF9TVF9DT05ORUNURUQ6IFRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIGEgbmV0d29yay4KKyAqCisgKiBAX19XSU1BWF9TVF9JTlZBTElEOiBUaGlzIGlzIGFuIGludmFsaWQgc3RhdGUgdXNlZCB0byBtYXJrIHRoZQorICogICAgIG1heGltdW0gbnVtZXJpYyB2YWx1ZSBvZiBzdGF0ZXMuCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogVHJhbnNpdGlvbnMgZnJvbSBvbmUgc3RhdGUgdG8gYW5vdGhlciBvbmUgYXJlIGF0b21pYyBhbmQgY2FuIG9ubHkKKyAqIGJlIGNhdXNlZCBpbiBrZXJuZWwgc3BhY2Ugd2l0aCB3aW1heF9zdGF0ZV9jaGFuZ2UoKS4gVG8gcmVhZCB0aGUKKyAqIHN0YXRlLCB1c2Ugd2ltYXhfc3RhdGVfZ2V0KCkuCisgKgorICogU3RhdGVzIHN0YXJ0aW5nIHdpdGggX18gYXJlIGludGVybmFsIGFuZCBzaGFsbCBub3QgYmUgdXNlZCBvcgorICogcmVmZXJyZWQgdG8gYnkgZHJpdmVycyBvciB1c2Vyc3BhY2UuIFRoZXkgbG9vayB1Z2x5LCBidXQgdGhhdCdzIHRoZQorICogcG9pbnQgLS0gaWYgYW55IHVzZSBpcyBtYWRlIG5vbi1pbnRlcm5hbCB0byB0aGUgc3RhY2ssIGl0IGlzIGVhc2llcgorICogdG8gY2F0Y2ggb24gcmV2aWV3LgorICoKKyAqIEFsbCBBUEkgb3BlcmF0aW9ucyBbd2l0aCB3ZWxsIGRlZmluZWQgZXhjZXB0aW9uc10gd2lsbCB0YWtlIHRoZQorICogZGV2aWNlIG11dGV4IGJlZm9yZSBzdGFydGluZyBhbmQgdGhlbiBjaGVjayB0aGUgc3RhdGUuIElmIHRoZSBzdGF0ZQorICogaXMgJV9fV0lNQVhfU1RfTlVMTCwgJVdJTUFYX1NUX0RPV04sICVXSU1BWF9TVF9VTklOSVRJQUxJWkVEIG9yCisgKiAlX19XSU1BWF9TVF9RVUlFU0NJTkcsIGl0IHdpbGwgZHJvcCB0aGUgbG9jayBhbmQgcXVpdCB3aXRoCisgKiAtJUVJTlZBTCwgLSVFTk9NRURJVU0sIC0lRU5PVENPTk4gb3IgLSVFU0hVVERPV04uCisgKgorICogVGhlIG9yZGVyIG9mIHRoZSBkZWZpbml0aW9ucyBpcyBpbXBvcnRhbnQsIHNvIHdlIGNhbiBkbyBudW1lcmljYWwKKyAqIGNvbXBhcmlzb25zIChlZzogPCAlV0lNQVhfU1RfUkFESU9fT0ZGIG1lYW5zIHRoZSBkZXZpY2UgaXMgbm90IHJlYWR5CisgKiB0byBvcGVyYXRlKS4KKyAqLworLyoKKyAqIFRoZSBhbGxvd2VkIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBkZXNjcmliZWQgaW4gdGhlIHRhYmxlIGJlbG93CisgKiAoc3RhdGVzIGluIHJvd3MgY2FuIGdvIHRvIHN0YXRlcyBpbiBjb2x1bW5zIHdoZXJlIHRoZXJlIGlzIGFuIFgpOgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOSU5JICAgUkFESU8gUkVBRFkgU0NBTiBDT05ORUMgQ09OTkVDCisgKiAgICAgICAgICAgICBOVUxMIERPV04gUVVJRVNDSU5HIFRJQUxJWkVEICBPRkYgICAgICAgIE5JTkcgIFRJTkcgICBURUQKKyAqIE5VTEwgICAgICAgICAtICAgIHgKKyAqIERPV04gICAgICAgICAgICAgIC0gICAgICB4ICAgICAgICB4ICAgICAgIHgKKyAqIFFVSUVTQ0lORyAgICAgICAgIHggICAgICAtCisgKiBVTklOSVRJQUxJWkVEICAgICAgICAgICAgeCAgICAgICAgLSAgICAgICB4CisgKiBSQURJT19PRkYgICAgICAgICAgICAgICAgeCAgICAgICAgICAgICAgICAtICAgICB4CisgKiBSRUFEWSAgICAgICAgICAgICAgICAgICAgeCAgICAgICAgICAgICAgICB4ICAgICAtICAgICB4ICAgICB4ICAgICAgeAorICogU0NBTk5JTkcgICAgICAgICAgICAgICAgIHggICAgICAgICAgICAgICAgeCAgICAgeCAgICAgLSAgICAgeCAgICAgIHgKKyAqIENPTk5FQ1RJTkcgICAgICAgICAgICAgICB4ICAgICAgICAgICAgICAgIHggICAgIHggICAgIHggICAgIC0gICAgICB4CisgKiBDT05ORUNURUQgICAgICAgICAgICAgICAgeCAgICAgICAgICAgICAgICB4ICAgICB4ICAgICAgICAgICAgICAgICAgLQorICoKKyAqIFRoaXMgdGFibGUgbm90IGF2YWlsYWJsZSBpbiBrZXJuZWwtZG9jIGJlY2F1c2UgdGhlIGZvcm1hdHRpbmcgbWVzc2VzIGl0IHVwLgorICovCisgZW51bSB3aW1heF9zdCB7CisJX19XSU1BWF9TVF9OVUxMID0gMCwKKwlXSU1BWF9TVF9ET1dOLAorCV9fV0lNQVhfU1RfUVVJRVNDSU5HLAorCVdJTUFYX1NUX1VOSU5JVElBTElaRUQsCisJV0lNQVhfU1RfUkFESU9fT0ZGLAorCVdJTUFYX1NUX1JFQURZLAorCVdJTUFYX1NUX1NDQU5OSU5HLAorCVdJTUFYX1NUX0NPTk5FQ1RJTkcsCisJV0lNQVhfU1RfQ09OTkVDVEVELAorCV9fV0lNQVhfU1RfSU5WQUxJRAkJCS8qIEFsd2F5cyBrZWVwIGxhc3QgKi8KK307CisKKworI2VuZGlmIC8qICNpZm5kZWYgX19MSU5VWF9fV0lNQVhfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3dpbWF4L2kyNDAwbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC93aW1heC9pMjQwMG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmQzNTYxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC93aW1heC9pMjQwMG0uaApAQCAtMCwwICsxLDU3MiBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTWF4IENvbm5lY3Rpb24gMjQwMG0KKyAqIEhvc3QtRGV2aWNlIHByb3RvY29sIGludGVyZmFjZSBkZWZpbml0aW9ucworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKiAgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKgorICoKKyAqIFRoaXMgaGVhZGVyIGRlZmluZXMgdGhlIGRhdGEgc3RydWN0dXJlcyBhbmQgY29uc3RhbnRzIHVzZWQgdG8KKyAqIGNvbW11bmljYXRlIHdpdGggdGhlIGRldmljZS4KKyAqCisgKiBCT09UTU9ERS9CT09UUk9NL0ZJUk1XQVJFIFVQTE9BRCBQUk9UT0NPTAorICoKKyAqIFRoZSBmaXJtd2FyZSB1cGxvYWQgcHJvdG9jb2wgaXMgcXVpdGUgc2ltcGxlIGFuZCBvbmx5IHJlcXVpcmVzIGEKKyAqIGhhbmRmdWwgb2YgY29tbWFuZHMuIFNlZSBkcml2ZXJzL25ldC93aW1heC9pMjQwMG0vZncuYyBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKiBUaGUgQkNGIGRhdGEgc3RydWN0dXJlIGlzIGZvciB0aGUgZmlybXdhcmUgZmlsZSBoZWFkZXIuCisgKgorICoKKyAqIFRIRSBEQVRBIC8gQ09OVFJPTCBQUk9UT0NPTAorICoKKyAqIFRoaXMgaXMgdGhlIG5vcm1hbCBwcm90b2NvbCBzcG9rZW4gd2l0aCB0aGUgZGV2aWNlIG9uY2UgdGhlCisgKiBmaXJtd2FyZSBpcyB1cGxvYWRlZC4gSXQgdHJhbnNwb3J0cyBkYXRhIHBheWxvYWRzIGFuZCBjb250cm9sCisgKiBtZXNzYWdlcyBiYWNrIGFuZCBmb3J0aC4KKyAqCisgKiBJdCBjb25zaXN0cyAnbWVzc2FnZXMnIHRoYXQgcGFjayBvbmUgb3IgbW9yZSBwYXlsb2FkcyBlYWNoLiBUaGUKKyAqIGZvcm1hdCBpcyBkZXNjcmliZWQgaW4gZGV0YWlsIGluIGRyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9yeC5jIGFuZAorICogdHguYy4KKyAqCisgKgorICogVEhFIEwzTDQgUFJPVE9DT0wKKyAqCisgKiBUaGUgdGVybSBMM0w0IHJlZmVycyB0byBMYXllciAzICh0aGUgZGV2aWNlKSwgTGF5ZXIgNCAodGhlCisgKiBkcml2ZXIvaG9zdCBzb2Z0d2FyZSkuCisgKgorICogVGhpcyBpcyB0aGUgY29udHJvbCBwcm90b2NvbCB1c2VkIGJ5IHRoZSBob3N0IHRvIGNvbnRyb2wgdGhlIGkyNDAwbQorICogZGV2aWNlIChzY2FuLCBjb25uZWN0LCBkaXNjb25uZWN0Li4uKS4gVGhpcyBpcyBzZW50IHRvIC8gcmVjZWl2ZWQKKyAqIGFzIGNvbnRyb2wgZnJhbWVzLiBUaGVzZSBmcmFtZXMgY29uc2lzdCBvZiBhIGhlYWRlciBhbmQgemVybyBvcgorICogbW9yZSBUTFZzIHdpdGggaW5mb3JtYXRpb24uIFdlIGNhbGwgZWFjaCBjb250cm9sIGZyYW1lIGEgIm1lc3NhZ2UiLgorICoKKyAqIEVhY2ggbWVzc2FnZSBpcyBjb21wb3NlZCBvZjoKKyAqCisgKiBIRUFERVIKKyAqIFtUTFYwICsgUEFZTE9BRDBdCisgKiBbVExWMSArIFBBWUxPQUQxXQorICogWy4uLl0KKyAqIFtUTFZOICsgUEFZTE9BRE5dCisgKgorICogVGhlIEhFQURFUiBpcyBkZWZpbmVkIGJ5ICdzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyJy4gVGhlIHBheWxvYWRzIGFyZQorICogZGVmaW5lZCBieSBhIFRMViBzdHJ1Y3R1cmUgKFR5cGUgTGVuZ3RoIFZhbHVlKSB3aGljaCBpcyBhICdoZWFkZXInCisgKiAoc3RydWN0IGkyNDAwbV90bHZfaGRyKSBhbmQgdGhlbiB0aGUgcGF5bG9hZC4KKyAqCisgKiBBbGwgaW50ZWdlcnMgYXJlIHJlcHJlc2VudGVkIGFzIExpdHRsZSBFbmRpYW4uCisgKgorICogLSBSRVFVRVNUUyBBTkQgRVZFTlRTCisgKgorICogVGhlIHJlcXVlc3RzIGNhbiBiZSBjbGFzaWZpZWQgYXMgZm9sbG93czoKKyAqCisgKiAgIENPTU1BTkQ6ICBpbXBsaWVzIGEgcmVxdWVzdCBmcm9tIHRoZSBob3N0IHRvIHRoZSBkZXZpY2UgcmVxdWVzdGluZworICogICAgICAgICAgICAgYW4gYWN0aW9uIGJlaW5nIHBlcmZvcm1lZC4gVGhlIGRldmljZSB3aWxsIHJlcGx5IHdpdGggYQorICogICAgICAgICAgICAgbWVzc2FnZSAod2l0aCB0aGUgc2FtZSB0eXBlIGFzIHRoZSBjb21tYW5kKSwgc3RhdHVzIGFuZAorICogICAgICAgICAgICAgbm8gKFRMVikgcGF5bG9hZC4gRXhlY3V0aW9uIG9mIGEgY29tbWFuZCBtaWdodCBjYXVzZQorICogICAgICAgICAgICAgZXZlbnRzIChvZiBkaWZmZXJlbnQgdHlwZSkgdG8gYmUgc2VudCBsYXRlciBvbiBhcworICogICAgICAgICAgICAgZGV2aWNlJ3Mgc3RhdGUgY2hhbmdlcy4KKyAqCisgKiAgIEdFVC9TRVQ6ICBzaW1pbGFyIHRvIENPTU1BTkQsIGJ1dCB3aWxsIG5vdCBjYXVzZSBvdGhlcgorICogICAgICAgICAgICAgRVZFTlRzLiBUaGUgcmVwbHksIGluIHRoZSBjYXNlIG9mIEdFVCwgd2lsbCBjb250YWluCisgKiAgICAgICAgICAgICBUTFZzIHdpdGggdGhlIHJlcXVlc3RlZCBpbmZvcm1hdGlvbi4KKyAqCisgKiAgIEVWRU5UOiAgICBhc3luY2hyb25vdXMgbWVzc2FnZXMgc2VudCBmcm9tIHRoZSBkZXZpY2UsIG1heWJlIGFzIGEKKyAqICAgICAgICAgICAgIGNvbnNlcXVlbmNlIG9mIHByZXZpb3VzIENPTU1BTkRzIGJ1dCBkaXNhc3NvY2lhdGVkIGZyb20KKyAqICAgICAgICAgICAgIHRoZW0uCisgKgorICogT25seSBvbmUgcmVxdWVzdCBtaWdodCBiZSBwZW5kaW5nIGF0IHRoZSBzYW1lIHRpbWUgKGllOiBkb24ndAorICogcGFyYWxsZWxpemUgbm9yIHBvc3QgYW5vdGhlciBHRVQgcmVxdWVzdCBiZWZvcmUgdGhlIHByZXZpb3VzCisgKiBDT01NQU5EIGhhcyBiZWVuIGFja25vd2xlZGdlZCB3aXRoIGl0J3MgY29ycmVzcG9uZGluZyByZXBseSBieSB0aGUKKyAqIGRldmljZSkuCisgKgorICogVGhlIGRpZmZlcmVudCByZXF1ZXN0cyBhbmQgdGhlaXIgZm9ybWF0cyBhcmUgZGVzY3JpYmVkIGJlbG93OgorICoKKyAqICBJMjQwME1fTVRfKiAgIE1lc3NhZ2UgdHlwZXMKKyAqICBJMjQwME1fTVNfKiAgIE1lc3NhZ2Ugc3RhdHVzIChmb3IgcmVwbGllcywgZXZlbnRzKQorICogIGkyNDAwbV90bHZfKiAgVExWcworICoKKyAqIGRhdGEgdHlwZXMgYXJlIG5hbWVkICdzdHJ1Y3QgaTI0MDBtX21zZ19PUE5BTUUnLCBPUE5BTUUgbWF0Y2hpbmcgdGhlCisgKiBvcGVyYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX19XSU1BWF9fSTI0MDBNX0hfXworI2RlZmluZSBfX0xJTlVYX19XSU1BWF9fSTI0MDBNX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworCisvKgorICogSG9zdCBEZXZpY2UgSW50ZXJmYWNlIChIREkpIGNvbW1vbiB0byBhbGwgYnVzc2VzCisgKi8KKworLyogQm9vdC1tb2RlIChmaXJtd2FyZSB1cGxvYWQgbW9kZSkgY29tbWFuZHMgKi8KKworLyogSGVhZGVyIGZvciB0aGUgZmlybXdhcmUgZmlsZSAqLworc3RydWN0IGkyNDAwbV9iY2ZfaGRyIHsKKwlfX2xlMzIgbW9kdWxlX3R5cGU7CisJX19sZTMyIGhlYWRlcl9sZW47CisJX19sZTMyIGhlYWRlcl92ZXJzaW9uOworCV9fbGUzMiBtb2R1bGVfaWQ7CisJX19sZTMyIG1vZHVsZV92ZW5kb3I7CisJX19sZTMyIGRhdGU7CQkvKiBCQ0QgWVlZTU1ERCAqLworCV9fbGUzMiBzaXplOyAgICAgICAgICAgIC8qIGluIGR3b3JkcyAqLworCV9fbGUzMiBrZXlfc2l6ZTsJLyogaW4gZHdvcmRzICovCisJX19sZTMyIG1vZHVsdXNfc2l6ZTsJLyogaW4gZHdvcmRzICovCisJX19sZTMyIGV4cG9uZW50X3NpemU7CS8qIGluIGR3b3JkcyAqLworCV9fdTggcmVzZXJ2ZWRbODhdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEJvb3QgbW9kZSBvcGNvZGVzICovCitlbnVtIGkyNDAwbV9icmhfb3Bjb2RlIHsKKwlJMjQwME1fQlJIX1JFQUQgPSAxLAorCUkyNDAwTV9CUkhfV1JJVEUgPSAyLAorCUkyNDAwTV9CUkhfSlVNUCA9IDMsCisJSTI0MDBNX0JSSF9TSUdORURfSlVNUCA9IDgsCisJSTI0MDBNX0JSSF9IQVNIX1BBWUxPQURfT05MWSA9IDksCit9OworCisvKiBCb290IG1vZGUgY29tbWFuZCBtYXNrcyBhbmQgc3R1ZmYgKi8KK2VudW0gaTI0MDBtX2JyaCB7CisJSTI0MDBNX0JSSF9TSUdOQVRVUkUgPSAweGNiYmMwMDAwLAorCUkyNDAwTV9CUkhfU0lHTkFUVVJFX01BU0sgPSAweGZmZmYwMDAwLAorCUkyNDAwTV9CUkhfU0lHTkFUVVJFX1NISUZUID0gMTYsCisJSTI0MDBNX0JSSF9PUENPREVfTUFTSyA9IDB4MDAwMDAwMGYsCisJSTI0MDBNX0JSSF9SRVNQT05TRV9NQVNLID0gMHgwMDAwMDBmMCwKKwlJMjQwME1fQlJIX1JFU1BPTlNFX1NISUZUID0gNCwKKwlJMjQwME1fQlJIX0RJUkVDVF9BQ0NFU1MgPSAweDAwMDAwNDAwLAorCUkyNDAwTV9CUkhfUkVTUE9OU0VfUkVRVUlSRUQgPSAweDAwMDAwMjAwLAorCUkyNDAwTV9CUkhfVVNFX0NIRUNLU1VNID0gMHgwMDAwMDEwMCwKK307CisKKworLyoqCisgKiBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgLSBIZWFkZXIgZm9yIGEgYm9vdC1tb2RlIGNvbW1hbmQKKyAqCisgKiBAY21kOiB0aGUgYWJvdmUgY29tbWFuZCBkZXNjcmlwdG9yCisgKiBAdGFyZ2V0X2FkZHI6IHdoZXJlIG9uIHRoZSBkZXZpY2UgbWVtb3J5IHNob3VsZCB0aGUgYWN0aW9uIGJlIHBlcmZvcm1lZC4KKyAqIEBkYXRhX3NpemU6IGZvciByZWFkL3dyaXRlLCBhbW91bnQgb2YgZGF0YSB0byBiZSByZWFkL3dyaXR0ZW4KKyAqIEBibG9ja19jaGVja3N1bTogY2hlY2tzdW0gdmFsdWUgKGlmIGFwcGxpY2FibGUpCisgKiBAcGF5bG9hZDogdGhlIGJlZ2lubmluZyBvZiBkYXRhIGF0dGFjaGVkIHRvIHRoaXMgaGVhZGVyCisgKi8KK3N0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgeworCV9fbGUzMiBjb21tYW5kOwkJLyogQ29tcG9zZSB3aXRoIGVudW0gaTI0MDBfYnJoICovCisJX19sZTMyIHRhcmdldF9hZGRyOworCV9fbGUzMiBkYXRhX3NpemU7CisJX19sZTMyIGJsb2NrX2NoZWNrc3VtOworCWNoYXIgcGF5bG9hZFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKKy8qCisgKiBEYXRhIC8gY29udHJvbCBwcm90b2NvbAorICovCisKKy8qIFBhY2tldCB0eXBlcyBmb3IgdGhlIGhvc3QtZGV2aWNlIGludGVyZmFjZSAqLworZW51bSBpMjQwMG1fcHQgeworCUkyNDAwTV9QVF9EQVRBID0gMCwKKwlJMjQwME1fUFRfQ1RSTCwKKwlJMjQwME1fUFRfVFJBQ0UsCS8qIEZvciBkZXZpY2UgZGVidWcgKi8KKwlJMjQwME1fUFRfUkVTRVRfV0FSTSwJLyogZGV2aWNlIHJlc2V0ICovCisJSTI0MDBNX1BUX1JFU0VUX0NPTEQsCS8qIFVTQlt0cmFuc3BvcnRdIHJlc2V0LCBsaWtlIHJlY29ubmVjdCAqLworCUkyNDAwTV9QVF9FREFUQSwJLyogRXh0ZW5kZWQgUlggZGF0YSAqLworCUkyNDAwTV9QVF9JTExFR0FMCit9OworCisKKy8qCisgKiBQYXlsb2FkIGZvciBhIGRhdGEgcGFja2V0CisgKgorICogVGhpcyBpcyBwcmVmaXhlZCB0byBlYWNoIGFuZCBldmVyeSBvdXRnb2luZyBEQVRBIHR5cGUuCisgKi8KK3N0cnVjdCBpMjQwMG1fcGxfZGF0YV9oZHIgeworCV9fbGUzMiByZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyoKKyAqIFBheWxvYWQgZm9yIGFuIGV4dGVuZGVkIGRhdGEgcGFja2V0CisgKgorICogTmV3IGluIGZ3IHYxLjQKKyAqCisgKiBAcmVvcmRlcjogaWYgdGhpcyBwYXlsb2FkIGhhcyB0byBiZSByZW9yZGVyIG9yIG5vdCAoYW5kIGhvdykKKyAqIEBjczogdGhlIHR5cGUgb2YgZGF0YSBpbiB0aGUgcGFja2V0LCBhcyBkZWZpbmVkIHBlciAoODAyLjE2ZQorICogICAgIFQxMS4xMy4xOS4xKS4gQ3VycmVudGx5IG9ubHkgMiAoSVB2NCBwYWNrZXQpIHN1cHBvcnRlZC4KKyAqCisgKiBUaGlzIGlzIHByZWZpeGVkIHRvIGVhY2ggYW5kIGV2ZXJ5IElOQ09NSU5HIERBVEEgcGFja2V0LgorICovCitzdHJ1Y3QgaTI0MDBtX3BsX2VkYXRhX2hkciB7CisJX19sZTMyIHJlb3JkZXI7CQkvKiBiaXRzIGRlZmluZWQgaW4gaTI0MDBtX3JvICovCisJX191OCBjczsKKwlfX3U4IHJlc2VydmVkWzExXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK2VudW0gaTI0MDBtX2NzIHsKKwlJMjQwME1fQ1NfSVBWNF8wID0gMCwKKwlJMjQwME1fQ1NfSVBWNCA9IDIsCit9OworCitlbnVtIGkyNDAwbV9ybyB7CisJSTI0MDBNX1JPX05FRURFRCAgICAgPSAweDAxLAorCUkyNDAwTV9ST19UWVBFICAgICAgID0gMHgwMywKKwlJMjQwME1fUk9fVFlQRV9TSElGVCA9IDEsCisJSTI0MDBNX1JPX0NJTiAgICAgICAgPSAweDBmLAorCUkyNDAwTV9ST19DSU5fU0hJRlQgID0gNCwKKwlJMjQwME1fUk9fRkJOICAgICAgICA9IDB4MDdmZiwKKwlJMjQwME1fUk9fRkJOX1NISUZUICA9IDgsCisJSTI0MDBNX1JPX1NOICAgICAgICAgPSAweDA3ZmYsCisJSTI0MDBNX1JPX1NOX1NISUZUICAgPSAyMSwKK307CisKK2VudW0gaTI0MDBtX3JvX3R5cGUgeworCUkyNDAwTV9ST19UWVBFX1JFU0VUID0gMCwKKwlJMjQwME1fUk9fVFlQRV9QQUNLRVQsCisJSTI0MDBNX1JPX1RZUEVfV1MsCisJSTI0MDBNX1JPX1RZUEVfUEFDS0VUX1dTLAorfTsKKworCisvKiBNaXNjIGNvbnN0YW50cyAqLworZW51bSB7CisJSTI0MDBNX1BMX0FMSUdOID0gMTYsCS8qIFBheWxvYWQgZGF0YSBzaXplIGFsaWdubWVudCAqLworCUkyNDAwTV9QTF9TSVpFX01BWCA9IDB4M0VGRiwKKwlJMjQwME1fTUFYX1BMU19JTl9NU0cgPSA2MCwKKwkvKiBwcm90b2NvbCBiYXJrZXJzOiBzeW5jIHNlcXVlbmNlczsgZm9yIG5vdGlmaWNhdGlvbnMgdGhleQorCSAqIGFyZSBzZW50IGluIGdyb3VwcyBvZiBmb3VyLiAqLworCUkyNDAwTV9IMkRfUFJFVklFV19CQVJLRVIgPSAweGNhZmU5MDBkLAorCUkyNDAwTV9DT0xEX1JFU0VUX0JBUktFUiA9IDB4YzAxZGMwMWQsCisJSTI0MDBNX1dBUk1fUkVTRVRfQkFSS0VSID0gMHg1MGY3NTBmNywKKwlJMjQwME1fTkJPT1RfQkFSS0VSID0gMHhkZWFkYmVlZiwKKwlJMjQwME1fU0JPT1RfQkFSS0VSID0gMHgwZmYxYzFhMSwKKwlJMjQwME1fU0JPT1RfQkFSS0VSXzYwNTAgPSAweDgwMDAwMDAxLAorCUkyNDAwTV9BQ0tfQkFSS0VSID0gMHhmZWVkYmFiZSwKKwlJMjQwME1fRDJIX01TR19CQVJLRVIgPSAweGJlZWZiYWJlLAorfTsKKworCisvKgorICogSGFyZHdhcmUgcGF5bG9hZCBkZXNjcmlwdG9yCisgKgorICogQml0ZmllbGRzIGVuY29kZWQgaW4gYSBzdHJ1Y3QgdG8gZW5mb3JjZSB0eXBpbmcgc2VtYW50aWNzLgorICoKKyAqIExvb2sgaW4gcnguYyBhbmQgdHguYyBmb3IgYSBmdWxsIGRlc2NyaXB0aW9uIG9mIHRoZSBmb3JtYXQuCisgKi8KK3N0cnVjdCBpMjQwMG1fcGxkIHsKKwlfX2xlMzIgdmFsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgSTI0MDBNX1BMRF9TSVpFX01BU0sgMHgwMDAwM2ZmZgorI2RlZmluZSBJMjQwME1fUExEX1RZUEVfU0hJRlQgMTYKKyNkZWZpbmUgSTI0MDBNX1BMRF9UWVBFX01BU0sgMHgwMDBmMDAwMAorCisvKgorICogSGVhZGVyIGZvciBhIFRYIG1lc3NhZ2Ugb3IgUlggbWVzc2FnZQorICoKKyAqIEBiYXJrZXI6IHByZWFtYmxlCisgKiBAc2l6ZTogdXNlZCBmb3IgbWFuYWdlbWVudCBvZiB0aGUgRklGTyBxdWV1ZSBidWZmZXI7IGJlZm9yZQorICogICAgIHNlbmRpbmcsIHRoaXMgaXMgY29udmVydGVkIHRvIGJlIGEgcmVhbCBwcmVhbWJsZS4gVGhpcworICogICAgIGluZGljYXRlcyB0aGUgcmVhbCBzaXplIG9mIHRoZSBUWCBtZXNzYWdlIHRoYXQgc3RhcnRzIGF0IHRoaXMKKyAqICAgICBwb2ludC4gSWYgdGhlIGhpZ2hlc3QgYml0IGlzIHNldCwgdGhlbiB0aGlzIG1lc3NhZ2UgaXMgdG8gYmUKKyAqICAgICBza2lwcGVkLgorICogQHNlcXVlbmNlOiBzZXF1ZW5jZSBudW1iZXIgb2YgdGhpcyBtZXNzYWdlCisgKiBAb2Zmc2V0OiBvZmZzZXQgd2hlcmUgdGhlIG1lc3NhZ2UgaXRzZWxmIHN0YXJ0cyAtLSBzZWUgdGhlIGNvbW1lbnRzCisgKiAgICAgaW4gdGhlIGZpbGUgaGVhZGVyIGFib3V0IG1lc3NhZ2UgaGVhZGVyIGFuZCBwYXlsb2FkIGRlc2NyaXB0b3IKKyAqICAgICBhbGlnbm1lbnQuCisgKiBAbnVtX3BsczogbnVtYmVyIG9mIHBheWxvYWRzIGluIHRoaXMgbWVzc2FnZQorICogQHBhZGRpbmc6IGFtb3VudCBvZiBwYWRkaW5nIGJ5dGVzIGF0IHRoZSBlbmQgb2YgdGhlIG1lc3NhZ2UgdG8gbWFrZQorICogICAgICAgICAgIGl0IGJlIG9mIGJsb2NrLXNpemUgYWxpZ25lZAorICoKKyAqIExvb2sgaW4gcnguYyBhbmQgdHguYyBmb3IgYSBmdWxsIGRlc2NyaXB0aW9uIG9mIHRoZSBmb3JtYXQuCisgKi8KK3N0cnVjdCBpMjQwMG1fbXNnX2hkciB7CisJdW5pb24geworCQlfX2xlMzIgYmFya2VyOworCQlfX3UzMiBzaXplOwkvKiBzYW1lIHNpemUgdHlwZSBhcyBiYXJrZXIhISAqLworCX07CisJdW5pb24geworCQlfX2xlMzIgc2VxdWVuY2U7CisJCV9fdTMyIG9mZnNldDsJLyogc2FtZSBzaXplIHR5cGUgYXMgYmFya2VyISEgKi8KKwl9OworCV9fbGUxNiBudW1fcGxzOworCV9fbGUxNiByc3YxOworCV9fbGUxNiBwYWRkaW5nOworCV9fbGUxNiByc3YyOworCXN0cnVjdCBpMjQwMG1fcGxkIHBsZFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKKworLyoKKyAqIEwzL0w0IGNvbnRyb2wgcHJvdG9jb2wKKyAqLworCitlbnVtIHsKKwkvKiBJbnRlcmZhY2UgdmVyc2lvbiAqLworCUkyNDAwTV9MM0w0X1ZFUlNJT04gICAgICAgICAgICAgPSAweDAxMDAsCit9OworCisvKiBNZXNzYWdlIHR5cGVzICovCitlbnVtIGkyNDAwbV9tdCB7CisJSTI0MDBNX01UX1JFU0VSVkVEICAgICAgICAgICAgICA9IDB4MDAwMCwKKwlJMjQwME1fTVRfSU5WQUxJRCAgICAgICAgICAgICAgID0gMHhmZmZmLAorCUkyNDAwTV9NVF9SRVBPUlRfTUFTSwkJPSAweDgwMDAsCisKKwlJMjQwME1fTVRfR0VUX1NDQU5fUkVTVUxUICAJPSAweDQyMDIsCisJSTI0MDBNX01UX1NFVF9TQ0FOX1BBUkFNICAgCT0gMHg0NDAyLAorCUkyNDAwTV9NVF9DTURfUkZfQ09OVFJPTCAgIAk9IDB4NDYwMiwKKwlJMjQwME1fTVRfQ01EX1NDQU4gICAgICAgICAJPSAweDQ2MDMsCisJSTI0MDBNX01UX0NNRF9DT05ORUNUICAgICAgCT0gMHg0NjA0LAorCUkyNDAwTV9NVF9DTURfRElTQ09OTkVDVCAgIAk9IDB4NDYwNSwKKwlJMjQwME1fTVRfQ01EX0VYSVRfSURMRSAgIAk9IDB4NDYwNiwKKwlJMjQwME1fTVRfR0VUX0xNX1ZFUlNJT04gICAJPSAweDUyMDEsCisJSTI0MDBNX01UX0dFVF9ERVZJQ0VfSU5GTyAgCT0gMHg1MjAyLAorCUkyNDAwTV9NVF9HRVRfTElOS19TVEFUVVMgIAk9IDB4NTIwMywKKwlJMjQwME1fTVRfR0VUX1NUQVRJU1RJQ1MgICAJPSAweDUyMDQsCisJSTI0MDBNX01UX0dFVF9TVEFURSAgICAgICAgCT0gMHg1MjA1LAorCUkyNDAwTV9NVF9HRVRfTUVESUFfU1RBVFVTCT0gMHg1MjA2LAorCUkyNDAwTV9NVF9TRVRfSU5JVF9DT05GSUcJPSAweDU0MDQsCisJSTI0MDBNX01UX0NNRF9JTklUCSAgICAgICAgPSAweDU2MDEsCisJSTI0MDBNX01UX0NNRF9URVJNSU5BVEUJCT0gMHg1NjAyLAorCUkyNDAwTV9NVF9DTURfTU9ERV9PRl9PUAk9IDB4NTYwMywKKwlJMjQwME1fTVRfQ01EX1JFU0VUX0RFVklDRQk9IDB4NTYwNCwKKwlJMjQwME1fTVRfQ01EX01PTklUT1JfQ09OVFJPTCAgID0gMHg1NjA1LAorCUkyNDAwTV9NVF9DTURfRU5URVJfUE9XRVJTQVZFICAgPSAweDU2MDYsCisJSTI0MDBNX01UX0dFVF9UTFNfT1BFUkFUSU9OX1JFU1VMVCA9IDB4NjIwMSwKKwlJMjQwME1fTVRfU0VUX0VBUF9TVUNDRVNTICAgICAgID0gMHg2NDAyLAorCUkyNDAwTV9NVF9TRVRfRUFQX0ZBSUwgICAgICAgICAgPSAweDY0MDMsCisJSTI0MDBNX01UX1NFVF9FQVBfS0VZICAgICAgICAgIAk9IDB4NjQwNCwKKwlJMjQwME1fTVRfQ01EX1NFTkRfRUFQX1JFU1BPTlNFID0gMHg2NjAyLAorCUkyNDAwTV9NVF9SRVBPUlRfU0NBTl9SRVNVTFQgICAgPSAweGMwMDIsCisJSTI0MDBNX01UX1JFUE9SVF9TVEFURQkJPSAweGQwMDIsCisJSTI0MDBNX01UX1JFUE9SVF9QT1dFUlNBVkVfUkVBRFkgPSAweGQwMDUsCisJSTI0MDBNX01UX1JFUE9SVF9FQVBfUkVRVUVTVCAgICA9IDB4ZTAwMiwKKwlJMjQwME1fTVRfUkVQT1JUX0VBUF9SRVNUQVJUICAgID0gMHhlMDAzLAorCUkyNDAwTV9NVF9SRVBPUlRfQUxUX0FDQ0VQVCAgICAJPSAweGUwMDQsCisJSTI0MDBNX01UX1JFUE9SVF9LRVlfUkVRVUVTVCAJPSAweGUwMDUsCit9OworCisKKy8qCisgKiBNZXNzYWdlIEFjayBTdGF0dXMgY29kZXMKKyAqCisgKiBXaGVuIGEgbWVzc2FnZSBpcyByZXBsaWVkLXRvLCB0aGlzIHN0YXR1cyBpcyByZXBvcnRlZC4KKyAqLworZW51bSBpMjQwMG1fbXMgeworCUkyNDAwTV9NU19ET05FX09LICAgICAgICAgICAgICAgICAgPSAwLAorCUkyNDAwTV9NU19ET05FX0lOX1BST0dSRVNTICAgICAgICAgPSAxLAorCUkyNDAwTV9NU19JTlZBTElEX09QICAgICAgICAgICAgICAgPSAyLAorCUkyNDAwTV9NU19CQURfU1RBVEUgICAgICAgICAgICAgICAgPSAzLAorCUkyNDAwTV9NU19JTExFR0FMX1ZBTFVFICAgICAgICAgICAgPSA0LAorCUkyNDAwTV9NU19NSVNTSU5HX1BBUkFNUyAgICAgICAgICAgPSA1LAorCUkyNDAwTV9NU19WRVJTSU9OX0VSUk9SICAgICAgICAgICAgPSA2LAorCUkyNDAwTV9NU19BQ0NFU1NJQklMSVRZX0VSUk9SICAgICAgPSA3LAorCUkyNDAwTV9NU19CVVNZICAgICAgICAgICAgICAgICAgICAgPSA4LAorCUkyNDAwTV9NU19DT1JSVVBURURfVExWICAgICAgICAgICAgPSA5LAorCUkyNDAwTV9NU19VTklOSVRJQUxJWkVEICAgICAgICAgICAgPSAxMCwKKwlJMjQwME1fTVNfVU5LTk9XTl9FUlJPUiAgICAgICAgICAgID0gMTEsCisJSTI0MDBNX01TX1BST0RVQ1RJT05fRVJST1IgICAgICAgICA9IDEyLAorCUkyNDAwTV9NU19OT19SRiAgICAgICAgICAgICAgICAgICAgPSAxMywKKwlJMjQwME1fTVNfTk9UX1JFQURZX0ZPUl9QT1dFUlNBVkUgID0gMTQsCisJSTI0MDBNX01TX1RIRVJNQUxfQ1JJVElDQUwgICAgICAgICA9IDE1LAorCUkyNDAwTV9NU19NQVgKK307CisKKworLyoqCisgKiBpMjQwMG1fdGx2IC0gZW51bWVyYXRpb24gb2YgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBUTFZzCisgKgorICogVExWcyBzdGFuZCBmb3IgdHlwZS1sZW5ndGgtdmFsdWUgYW5kIGFyZSB0aGUgaGVhZGVyIGZvciBhIHBheWxvYWQKKyAqIGNvbXBvc2VkIG9mIGFsbW9zdCBhbnl0aGluZy4gRWFjaCBwYXlsb2FkIGhhcyBhIHR5cGUgYXNzaWduZWQKKyAqIGFuZCBhIGxlbmd0aC4KKyAqLworZW51bSBpMjQwMG1fdGx2IHsKKwlJMjQwME1fVExWX0w0X01FU1NBR0VfVkVSU0lPTlMgPSAxMjksCisJSTI0MDBNX1RMVl9TWVNURU1fU1RBVEUgPSAxNDEsCisJSTI0MDBNX1RMVl9NRURJQV9TVEFUVVMgPSAxNjEsCisJSTI0MDBNX1RMVl9SRl9PUEVSQVRJT04gPSAxNjIsCisJSTI0MDBNX1RMVl9SRl9TVEFUVVMgPSAxNjMsCisJSTI0MDBNX1RMVl9ERVZJQ0VfUkVTRVRfVFlQRSA9IDEzMiwKKwlJMjQwME1fVExWX0NPTkZJR19JRExFX1BBUkFNRVRFUlMgPSA2MDEsCisJSTI0MDBNX1RMVl9DT05GSUdfSURMRV9USU1FT1VUID0gNjExLAorCUkyNDAwTV9UTFZfQ09ORklHX0QySF9EQVRBX0ZPUk1BVCA9IDYxNCwKKwlJMjQwME1fVExWX0NPTkZJR19ETF9IT1NUX1JFT1JERVIgPSA2MTUsCit9OworCisKK3N0cnVjdCBpMjQwMG1fdGx2X2hkciB7CisJX19sZTE2IHR5cGU7CisJX19sZTE2IGxlbmd0aDsJCS8qIHBheWxvYWQncyAqLworCV9fdTggICBwbFswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworc3RydWN0IGkyNDAwbV9sM2w0X2hkciB7CisJX19sZTE2IHR5cGU7CisJX19sZTE2IGxlbmd0aDsJCS8qIHBheWxvYWQncyAqLworCV9fbGUxNiB2ZXJzaW9uOworCV9fbGUxNiByZXN2MTsKKwlfX2xlMTYgc3RhdHVzOworCV9fbGUxNiByZXN2MjsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgcGxbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qKgorICogaTI0MDBtX3N5c3RlbV9zdGF0ZSAtIGRpZmZlcmVudCBzdGF0ZXMgb2YgdGhlIGRldmljZQorICovCitlbnVtIGkyNDAwbV9zeXN0ZW1fc3RhdGUgeworCUkyNDAwTV9TU19VTklOSVRJQUxJWkVEID0gMSwKKwlJMjQwME1fU1NfSU5JVCwKKwlJMjQwME1fU1NfUkVBRFksCisJSTI0MDBNX1NTX1NDQU4sCisJSTI0MDBNX1NTX1NUQU5EQlksCisJSTI0MDBNX1NTX0NPTk5FQ1RJTkcsCisJSTI0MDBNX1NTX1dJTUFYX0NPTk5FQ1RFRCwKKwlJMjQwME1fU1NfREFUQV9QQVRIX0NPTk5FQ1RFRCwKKwlJMjQwME1fU1NfSURMRSwKKwlJMjQwME1fU1NfRElTQ09OTkVDVElORywKKwlJMjQwME1fU1NfT1VUX09GX1pPTkUsCisJSTI0MDBNX1NTX1NMRUVQQUNUSVZFLAorCUkyNDAwTV9TU19QUk9EVUNUSU9OLAorCUkyNDAwTV9TU19DT05GSUcsCisJSTI0MDBNX1NTX1JGX09GRiwKKwlJMjQwME1fU1NfUkZfU0hVVERPV04sCisJSTI0MDBNX1NTX0RFVklDRV9ESVNDT05ORUNULAorCUkyNDAwTV9TU19NQVgsCit9OworCisKKy8qKgorICogaTI0MDBtX3Rsdl9zeXN0ZW1fc3RhdGUgLSByZXBvcnQgb24gdGhlIHN0YXRlIG9mIHRoZSBzeXN0ZW0KKyAqCisgKiBAc3RhdGU6IHNlZSBlbnVtIGkyNDAwbV9zeXN0ZW1fc3RhdGUKKyAqLworc3RydWN0IGkyNDAwbV90bHZfc3lzdGVtX3N0YXRlIHsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgaGRyOworCV9fbGUzMiBzdGF0ZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworc3RydWN0IGkyNDAwbV90bHZfbDRfbWVzc2FnZV92ZXJzaW9ucyB7CisJc3RydWN0IGkyNDAwbV90bHZfaGRyIGhkcjsKKwlfX2xlMTYgbWFqb3I7CisJX19sZTE2IG1pbm9yOworCV9fbGUxNiBicmFuY2g7CisJX19sZTE2IHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCitzdHJ1Y3QgaTI0MDBtX3Rsdl9kZXRhaWxlZF9kZXZpY2VfaW5mbyB7CisJc3RydWN0IGkyNDAwbV90bHZfaGRyIGhkcjsKKwlfX3U4IHJlc2VydmVkMVs0MDBdOworCV9fdTggbWFjX2FkZHJlc3NbNl07CisJX191OCByZXNlcnZlZDJbMl07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK2VudW0gaTI0MDBtX3JmX3N3aXRjaF9zdGF0dXMgeworCUkyNDAwTV9SRl9TV0lUQ0hfT04gPSAxLAorCUkyNDAwTV9SRl9TV0lUQ0hfT0ZGID0gMiwKK307CisKK3N0cnVjdCBpMjQwMG1fdGx2X3JmX3N3aXRjaGVzX3N0YXR1cyB7CisJc3RydWN0IGkyNDAwbV90bHZfaGRyIGhkcjsKKwlfX3U4IHN3X3JmX3N3aXRjaDsJLyogMSBPTiwgMiBPRkYgKi8KKwlfX3U4IGh3X3JmX3N3aXRjaDsJLyogMSBPTiwgMiBPRkYgKi8KKwlfX3U4IHJlc2VydmVkWzJdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCitlbnVtIHsKKwlpMjQwMG1fcmZfb3BlcmF0aW9uX29uID0gMSwKKwlpMjQwMG1fcmZfb3BlcmF0aW9uX29mZiA9IDIKK307CisKK3N0cnVjdCBpMjQwMG1fdGx2X3JmX29wZXJhdGlvbiB7CisJc3RydWN0IGkyNDAwbV90bHZfaGRyIGhkcjsKKwlfX2xlMzIgc3RhdHVzOwkvKiAxIE9OLCAyIE9GRiAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCitlbnVtIGkyNDAwbV90bHZfcmVzZXRfdHlwZSB7CisJSTI0MDBNX1JFU0VUX1RZUEVfQ09MRCA9IDEsCisJSTI0MDBNX1JFU0VUX1RZUEVfV0FSTQorfTsKKworc3RydWN0IGkyNDAwbV90bHZfZGV2aWNlX3Jlc2V0X3R5cGUgeworCXN0cnVjdCBpMjQwMG1fdGx2X2hkciBoZHI7CisJX19sZTMyIHJlc2V0X3R5cGU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK3N0cnVjdCBpMjQwMG1fdGx2X2NvbmZpZ19pZGxlX3BhcmFtZXRlcnMgeworCXN0cnVjdCBpMjQwMG1fdGx2X2hkciBoZHI7CisJX19sZTMyIGlkbGVfdGltZW91dDsJLyogMTAwIHRvIDMwMDAwMCBtcyBbNW1pbl0sIDEwMCBpbmNyZW1lbnRzCisJCQkJICogMCBkaXNhYmxlZCAqLworCV9fbGUzMiBpZGxlX3BhZ2luZ19pbnRlcnZhbDsJLyogZnJhbWVzICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK2VudW0gaTI0MDBtX21lZGlhX3N0YXR1cyB7CisJSTI0MDBNX01FRElBX1NUQVRVU19MSU5LX1VQID0gMSwKKwlJMjQwME1fTUVESUFfU1RBVFVTX0xJTktfRE9XTiwKKwlJMjQwME1fTUVESUFfU1RBVFVTX0xJTktfUkVORVcsCit9OworCitzdHJ1Y3QgaTI0MDBtX3Rsdl9tZWRpYV9zdGF0dXMgeworCXN0cnVjdCBpMjQwMG1fdGx2X2hkciBoZHI7CisJX19sZTMyIG1lZGlhX3N0YXR1czsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyogTmV3IGluIHYxLjQgKi8KK3N0cnVjdCBpMjQwMG1fdGx2X2NvbmZpZ19pZGxlX3RpbWVvdXQgeworCXN0cnVjdCBpMjQwMG1fdGx2X2hkciBoZHI7CisJX19sZTMyIHRpbWVvdXQ7CS8qIDEwMCB0byAzMDAwMDAgbXMgWzVtaW5dLCAxMDAgaW5jcmVtZW50cworCQkJICogMCBkaXNhYmxlZCAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogTmV3IGluIHYxLjQgLS0gZm9yIGJhY2t3YXJkIGNvbXBhdCwgd2lsbCBiZSByZW1vdmVkICovCitzdHJ1Y3QgaTI0MDBtX3Rsdl9jb25maWdfZDJoX2RhdGFfZm9ybWF0IHsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgaGRyOworCV9fdTggZm9ybWF0OyAJCS8qIDAgb2xkIGZvcm1hdCwgMSBlbmhhbmNlZCAqLworCV9fdTggcmVzZXJ2ZWRbM107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBOZXcgaW4gdjEuNCAqLworc3RydWN0IGkyNDAwbV90bHZfY29uZmlnX2RsX2hvc3RfcmVvcmRlciB7CisJc3RydWN0IGkyNDAwbV90bHZfaGRyIGhkcjsKKwlfX3U4IHJlb3JkZXI7IAkJLyogMCBkaXNhYmxlZCwgMSBlbmFibGVkICovCisJX191OCByZXNlcnZlZFszXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworI2VuZGlmIC8qICNpZm5kZWYgX19MSU5VWF9fV0lNQVhfX0kyNDAwTV9IX18gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvd2lyZWxlc3MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvd2lyZWxlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzY0MjZiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC93aXJlbGVzcy5oCkBAIC0wLDAgKzEsMTEyOCBAQAorLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmUgYSBzZXQgb2Ygc3RhbmRhcmQgd2lyZWxlc3MgZXh0ZW5zaW9ucworICoKKyAqIFZlcnNpb24gOgkyMgkxNi4zLjA3CisgKgorICogQXV0aG9ycyA6CUplYW4gVG91cnJpbGhlcyAtIEhQTCAtIDxqdEBocGwuaHAuY29tPgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDcgSmVhbiBUb3VycmlsaGVzLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICovCisKKyNpZm5kZWYgX0xJTlVYX1dJUkVMRVNTX0gKKyNkZWZpbmUgX0xJTlVYX1dJUkVMRVNTX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIERPQ1VNRU5UQVRJT04gKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogSW5pdGlhbCBBUElzICgxOTk2IC0+IG9ud2FyZCkgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJhc2ljYWxseSwgdGhlIHdpcmVsZXNzIGV4dGVuc2lvbnMgYXJlIGZvciBub3cgYSBzZXQgb2Ygc3RhbmRhcmQgaW9jdGwKKyAqIGNhbGwgKyAvcHJvYy9uZXQvd2lyZWxlc3MKKyAqCisgKiBUaGUgZW50cnkgL3Byb2MvbmV0L3dpcmVsZXNzIGdpdmUgc3RhdGlzdGljcyBhbmQgaW5mb3JtYXRpb24gb24gdGhlCisgKiBkcml2ZXIuCisgKiBUaGlzIGlzIGJldHRlciB0aGFuIGhhdmluZyBlYWNoIGRyaXZlciBoYXZpbmcgaXRzIGVudHJ5IGJlY2F1c2UKKyAqIGl0cyBjZW50cmFsaXNlZCBhbmQgd2UgbWF5IHJlbW92ZSB0aGUgZHJpdmVyIG1vZHVsZSBzYWZlbHkuCisgKgorICogSW9jdGwgYXJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBkcml2ZXIgYW5kIGlzc3VlIGNvbW1hbmRzLiAgVGhpcyBpcworICogYmV0dGVyIHRoYW4gY29tbWFuZCBsaW5lIG9wdGlvbnMgb2YgaW5zbW9kIGJlY2F1c2Ugd2UgbWF5IHdhbnQgdG8KKyAqIGNoYW5nZSBkeW5hbWljYWxseSAod2hpbGUgdGhlIGRyaXZlciBpcyBydW5uaW5nKSBzb21lIHBhcmFtZXRlcnMuCisgKgorICogVGhlIGlvY3RsIG1lY2hhbmltc20gYXJlIGNvcGllZCBmcm9tIHN0YW5kYXJkIGRldmljZXMgaW9jdGwuCisgKiBXZSBoYXZlIHRoZSBsaXN0IG9mIGNvbW1hbmQgcGx1cyBhIHN0cnVjdHVyZSBkZXNjaWJpbmcgdGhlCisgKiBkYXRhIGV4Y2hhbmdlZC4uLgorICogTm90ZSB0aGF0IHRvIGFkZCB0aGVzZSBpb2N0bCwgSSB3YXMgb2JsaWdlZCB0byBtb2RpZnkgOgorICoJIyBuZXQvY29yZS9kZXYuYyAodHdvIHBsYWNlICsgYWRkIGluY2x1ZGUpCisgKgkjIG5ldC9pcHY0L2FmX2luZXQuYyAob25lIHBsYWNlICsgYWRkIGluY2x1ZGUpCisgKgorICogL3Byb2MvbmV0L3dpcmVsZXNzIGlzIGEgY29weSBvZiAvcHJvYy9uZXQvZGV2LgorICogV2UgaGF2ZSBhIHN0cnVjdHVyZSBmb3IgZGF0YSBwYXNzZWQgZnJvbSB0aGUgZHJpdmVyIHRvIC9wcm9jL25ldC93aXJlbGVzcworICogVG9vIGFkZCB0aGlzLCBJJ3ZlIG1vZGlmaWVkIDoKKyAqCSMgbmV0L2NvcmUvZGV2LmMgKHR3byBvdGhlciBwbGFjZXMpCisgKgkjIGluY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmggKG9uZSBwbGFjZSkKKyAqCSMgaW5jbHVkZS9saW51eC9wcm9jX2ZzLmggKG9uZSBwbGFjZSkKKyAqCisgKiBOZXcgZHJpdmVyIEFQSSAoMjAwMiAtPiBvbndhcmQpIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgZmlsZSBpcyBvbmx5IGNvbmNlcm5lZCB3aXRoIHRoZSB1c2VyIHNwYWNlIEFQSSBhbmQgY29tbW9uIGRlZmluaXRpb25zLgorICogVGhlIG5ldyBkcml2ZXIgQVBJIGlzIGRlZmluZWQgYW5kIGRvY3VtZW50ZWQgaW4gOgorICoJIyBpbmNsdWRlL25ldC9pd19oYW5kbGVyLmgKKyAqCisgKiBOb3RlIGFzIHdlbGwgdGhhdCAvcHJvYy9uZXQvd2lyZWxlc3MgaW1wbGVtZW50YXRpb24gaGFzIG5vdyBtb3ZlZCBpbiA6CisgKgkjIG5ldC9jb3JlL3dpcmVsZXNzLmMKKyAqCisgKiBXaXJlbGVzcyBFdmVudHMgKDIwMDIgLT4gb253YXJkKSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRXZlbnRzIGFyZSBkZWZpbmVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLCBhbmQgaW1wbGVtZW50ZWQgaW4gOgorICoJIyBuZXQvY29yZS93aXJlbGVzcy5jCisgKgorICogT3RoZXIgY29tbWVudHMgOgorICogLS0tLS0tLS0tLS0tLS0KKyAqIERvIG5vdCBhZGQgaGVyZSB0aGluZ3MgdGhhdCBhcmUgcmVkdW5kYW50IHdpdGggb3RoZXIgbWVjaGFuaXNtcworICogKGRyaXZlcnMgaW5pdCwgaWZjb25maWcsIC9wcm9jL25ldC9kZXYsIC4uLikgYW5kIHdpdGggYXJlIG5vdAorICogd2lyZWxlc3Mgc3BlY2lmaWMuCisgKgorICogVGhlc2Ugd2lyZWxlc3MgZXh0ZW5zaW9ucyBhcmUgbm90IG1hZ2ljIDogZWFjaCBkcml2ZXIgaGFzIHRvIHByb3ZpZGUKKyAqIHN1cHBvcnQgZm9yIHRoZW0uLi4KKyAqCisgKiBJTVBPUlRBTlQgTk9URSA6IEFzIGV2ZXJ5dGhpbmcgaW4gdGhlIGtlcm5lbCwgdGhpcyBpcyB2ZXJ5IG11Y2ggYQorICogd29yayBpbiBwcm9ncmVzcy4gQ29udGFjdCBtZSBpZiB5b3UgaGF2ZSBpZGVhcyBvZiBpbXByb3ZlbWVudHMuLi4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5DTFVERVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgkJLyogZm9yIF9fdSogYW5kIF9fcyogdHlwZWRlZnMgKi8KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4JCS8qIGZvciAic3RydWN0IHNvY2thZGRyIiBldCBhbAkqLworI2luY2x1ZGUgPGxpbnV4L2lmLmg+CQkJLyogZm9yIElGTkFNU0laIGFuZCBjby4uLiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVkVSU0lPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIGNvbnN0YW50IGlzIHVzZWQgdG8ga25vdyB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSB3aXJlbGVzcworICogZXh0ZW5zaW9ucyBhbmQgdG8ga25vdyB3aGljaCB2ZXJzaW9uIG9mIHdpcmVsZXNzIGV4dGVuc2lvbnMgaXQgaXMKKyAqICh0aGVyZSBpcyBzb21lIHN0dWZmIHRoYXQgd2lsbCBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlLi4uKQorICogSSBqdXN0IHBsYW4gdG8gaW5jcmVtZW50IHdpdGggZWFjaCBuZXcgdmVyc2lvbi4KKyAqLworI2RlZmluZSBXSVJFTEVTU19FWFQJMjIKKworLyoKKyAqIENoYW5nZXMgOgorICoKKyAqIFYyIHRvIFYzCisgKiAtLS0tLS0tLQorICoJQWxhbiBDb3ggc3RhcnQgc29tZSBpbmNvbXBhdGlibGVzIGNoYW5nZXMuIEkndmUgaW50ZWdyYXRlZCBhIGJpdCBtb3JlLgorICoJLSBFbmNyeXB0aW9uIHJlbmFtZWQgdG8gRW5jb2RlIHRvIGF2b2lkIFVTIHJlZ3VsYXRpb24gcHJvYmxlbXMKKyAqCS0gRnJlcXVlbmN5IGNoYW5nZWQgZnJvbSBmbG9hdCB0byBzdHJ1Y3QgdG8gYXZvaWQgcHJvYmxlbXMgb24gb2xkIDM4NgorICoKKyAqIFYzIHRvIFY0CisgKiAtLS0tLS0tLQorICoJLSBBZGQgc2Vuc2l0aXZpdHkKKyAqCisgKiBWNCB0byBWNQorICogLS0tLS0tLS0KKyAqCS0gTWlzc2luZyBlbmNvZGluZyBkZWZpbml0aW9ucyBpbiByYW5nZQorICoJLSBBY2Nlc3MgcG9pbnRzIHN0dWZmCisgKgorICogVjUgdG8gVjYKKyAqIC0tLS0tLS0tCisgKgktIDgwMi4xMSBzdXBwb3J0IChFU1NJRCBpb2N0bHMpCisgKgorICogVjYgdG8gVjcKKyAqIC0tLS0tLS0tCisgKgktIGRlZmluZSBJV19FU1NJRF9NQVhfU0laRSBhbmQgSVdfTUFYX0FQCisgKgorICogVjcgdG8gVjgKKyAqIC0tLS0tLS0tCisgKgktIENoYW5nZWQgbXkgZS1tYWlsIGFkZHJlc3MKKyAqCS0gTW9yZSA4MDIuMTEgc3VwcG9ydCAobmlja25hbWUsIHJhdGUsIHJ0cywgZnJhZykKKyAqCS0gTGlzdCBpbmRleCBpbiBmcmVxdWVuY2llcworICoKKyAqIFY4IHRvIFY5CisgKiAtLS0tLS0tLQorICoJLSBTdXBwb3J0IGZvciAnbW9kZSBvZiBvcGVyYXRpb24nIChhZC1ob2MsIG1hbmFnZWQuLi4pCisgKgktIFN1cHBvcnQgZm9yIHVuaWNhc3QgYW5kIG11bHRpY2FzdCBwb3dlciBzYXZpbmcKKyAqCS0gQ2hhbmdlIGVuY29kaW5nIHRvIHN1cHBvcnQgbGFyZ2VyIHRva2VucyAoPjY0IGJpdHMpCisgKgktIFVwZGF0ZWQgaXdfcGFyYW1zIChkaXNhYmxlLCBmbGFncykgYW5kIHVzZSBpdCBmb3IgTldJRAorICoJLSBFeHRyYWN0ZWQgaXdfcG9pbnQgZnJvbSBpd3JlcSBmb3IgY2xhcml0eQorICoKKyAqIFY5IHRvIFYxMAorICogLS0tLS0tLS0tCisgKgktIEFkZCBQTSBjYXBhYmlsaXR5IHRvIHJhbmdlIHN0cnVjdHVyZQorICoJLSBBZGQgUE0gbW9kaWZpZXIgOiBNQVgvTUlOL1JFTEFUSVZFCisgKgktIEFkZCBlbmNvZGluZyBvcHRpb24gOiBJV19FTkNPREVfTk9LRVkKKyAqCS0gQWRkIFR4UG93ZXIgaW9jdGxzICh3b3JrIGxpa2UgVHhSYXRlKQorICoKKyAqIFYxMCB0byBWMTEKKyAqIC0tLS0tLS0tLS0KKyAqCS0gQWRkIFdFIHZlcnNpb24gaW4gcmFuZ2UgKGhlbHAgYmFja3dhcmQvZm9yd2FyZCBjb21wYXRpYmlsaXR5KQorICoJLSBBZGQgcmV0cnkgaW9jdGxzICh3b3JrIGxpa2UgUE0pCisgKgorICogVjExIHRvIFYxMgorICogLS0tLS0tLS0tLQorICoJLSBBZGQgU0lPQ1NJV1NUQVRTIHRvIGdldCAvcHJvYy9uZXQvd2lyZWxlc3MgcHJvZ3JhbWF0aWNhbGx5CisgKgktIEFkZCBERVYgUFJJVkFURSBJT0NUTCB0byBhdm9pZCBjb2xsaXNpb25zIGluIFNJT0NERVZQUklWQVRFIHNwYWNlCisgKgktIEFkZCBuZXcgc3RhdGlzdGljcyAoZnJhZywgcmV0cnksIGJlYWNvbikKKyAqCS0gQWRkIGF2ZXJhZ2UgcXVhbGl0eSAoZm9yIHVzZXIgc3BhY2UgY2FsaWJyYXRpb24pCisgKgorICogVjEyIHRvIFYxMworICogLS0tLS0tLS0tLQorICoJLSBEb2N1bWVudCBjcmVhdGlvbiBvZiBuZXcgZHJpdmVyIEFQSS4KKyAqCS0gRXh0cmFjdCB1bmlvbiBpd3JlcV9kYXRhIGZyb20gc3RydWN0IGl3cmVxIChmb3IgbmV3IGRyaXZlciBBUEkpLgorICoJLSBSZW5hbWUgU0lPQ1NJV05BTUUgYXMgU0lPQ1NJV0NPTU1JVAorICoKKyAqIFYxMyB0byBWMTQKKyAqIC0tLS0tLS0tLS0KKyAqCS0gV2lyZWxlc3MgRXZlbnRzIHN1cHBvcnQgOiBkZWZpbmUgc3RydWN0IGl3X2V2ZW50CisgKgktIERlZmluZSBhZGRpdGlvbmFsIHNwZWNpZmljIGV2ZW50IG51bWJlcnMKKyAqCS0gQWRkICJhZGRyIiBhbmQgInBhcmFtIiBmaWVsZHMgaW4gdW5pb24gaXdyZXFfZGF0YQorICoJLSBBUCBzY2FubmluZyBzdHVmZiAoU0lPQ1NJV1NDQU4gYW5kIGZyaWVuZHMpCisgKgorICogVjE0IHRvIFYxNQorICogLS0tLS0tLS0tLQorICoJLSBBZGQgSVdfUFJJVl9UWVBFX0FERFIgZm9yIHN0cnVjdCBzb2NrYWRkciBwcml2YXRlIGFyZworICoJLSBNYWtlIHN0cnVjdCBpd19mcmVxIHNpZ25lZCAoYm90aCBtICYgZSksIGFkZCBleHBsaWNpdCBwYWRkaW5nCisgKgktIEFkZCBJV0VWQ1VTVE9NIGZvciBkcml2ZXIgc3BlY2lmaWMgZXZlbnQvc2Nhbm5pbmcgdG9rZW4KKyAqCS0gQWRkIElXX01BWF9HRVRfU1BZIGZvciBkcml2ZXIgcmV0dXJuaW5nIGEgbG90IG9mIGFkZHJlc3NlcworICoJLSBBZGQgSVdfVFhQT1dfUkFOR0UgZm9yIHJhbmdlIG9mIFR4IFBvd2VycworICoJLSBBZGQgSVdFVlJFR0lTVEVSRUQgJiBJV0VWRVhQSVJFRCBldmVudHMgZm9yIEFjY2VzcyBQb2ludHMKKyAqCS0gQWRkIElXX01PREVfTU9OSVRPUiBmb3IgcGFzc2l2ZSBtb25pdG9yCisgKgorICogVjE1IHRvIFYxNgorICogLS0tLS0tLS0tLQorICoJLSBJbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGJpdHJhdGVzIGluIGl3X3JhbmdlIHRvIDMyIChmb3IgODAyLjExZykKKyAqCS0gSW5jcmVhc2UgdGhlIG51bWJlciBvZiBmcmVxdWVuY2llcyBpbiBpd19yYW5nZSB0byAzMiAoZm9yIDgwMi4xMWIrYSkKKyAqCS0gUmVzaHVmZmxlIHN0cnVjdCBpd19yYW5nZSBmb3IgaW5jcmVhc2VzLCBhZGQgZmlsbGVyCisgKgktIEluY3JlYXNlIElXX01BWF9BUCB0byA2NCBmb3IgZHJpdmVyIHJldHVybmluZyBhIGxvdCBvZiBhZGRyZXNzZXMKKyAqCS0gUmVtb3ZlIElXX01BWF9HRVRfU1BZIGJlY2F1c2UgY29uZmxpY3Qgd2l0aCBlbmhhbmNlZCBzcHkgc3VwcG9ydAorICoJLSBBZGQgU0lPQ1NJV1RIUlNQWS9TSU9DR0lXVEhSU1BZIGFuZCAic3RydWN0IGl3X3RocnNweSIKKyAqCS0gQWRkIElXX0VOQ09ERV9URU1QIGFuZCBpd19yYW5nZS0+ZW5jb2RpbmdfbG9naW5faW5kZXgKKyAqCisgKiBWMTYgdG8gVjE3CisgKiAtLS0tLS0tLS0tCisgKgktIEFkZCBmbGFncyB0byBmcmVxdWVuY3kgLT4gYXV0by9maXhlZAorICoJLSBEb2N1bWVudCAoc3RydWN0IGl3X3F1YWxpdHkgKiktPnVwZGF0ZWQsIGFkZCBuZXcgZmxhZ3MgKElOVkFMSUQpCisgKgktIFdpcmVsZXNzIEV2ZW50IGNhcGFiaWxpdHkgaW4gc3RydWN0IGl3X3JhbmdlCisgKgktIEFkZCBzdXBwb3J0IGZvciByZWxhdGl2ZSBUeFBvd2VyICh5aWNrICEpCisgKgorICogVjE3IHRvIFYxOCAoRnJvbSBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPikKKyAqIC0tLS0tLS0tLS0KKyAqCS0gQWRkIHN1cHBvcnQgZm9yIFdQQS9XUEEyCisgKgktIEFkZCBleHRlbmRlZCBlbmNvZGluZyBjb25maWd1cmF0aW9uIChTSU9DU0lXRU5DT0RFRVhUIGFuZAorICoJICBTSU9DR0lXRU5DT0RFRVhUKQorICoJLSBBZGQgU0lPQ1NJV0dFTklFL1NJT0NHSVdHRU5JRQorICoJLSBBZGQgU0lPQ1NJV01MTUUKKyAqCS0gQWRkIFNJT0NTSVdQTUtTQQorICoJLSBBZGQgc3RydWN0IGl3X3JhbmdlIGJpdCBmaWVsZCBmb3Igc3VwcG9ydGVkIGVuY29kaW5nIGNhcGFiaWxpdGllcworICoJLSBBZGQgb3B0aW9uYWwgc2NhbiByZXF1ZXN0IHBhcmFtZXRlcnMgZm9yIFNJT0NTSVdTQ0FOCisgKgktIEFkZCBTSU9DU0lXQVVUSC9TSU9DR0lXQVVUSCBmb3Igc2V0dGluZyBhdXRoZW50aWNhdGlvbiBhbmQgV1BBCisgKgkgIHJlbGF0ZWQgcGFyYW1ldGVycyAoZXh0ZW5zaWJsZSB1cCB0byA0MDk2IHBhcmFtZXRlciB2YWx1ZXMpCisgKgktIEFkZCB3aXJlbGVzcyBldmVudHM6IElXRVZHRU5JRSwgSVdFVk1JQ0hBRUxNSUNGQUlMVVJFLAorICoJICBJV0VWQVNTT0NSRVFJRSwgSVdFVkFTU09DUkVTUElFLCBJV0VWUE1LSURDQU5ECisgKgorICogVjE4IHRvIFYxOQorICogLS0tLS0tLS0tLQorICoJLSBSZW1vdmUgKHN0cnVjdCBpd19wb2ludCAqKS0+cG9pbnRlciBmcm9tIGV2ZW50cyBhbmQgc3RyZWFtcworICoJLSBSZW1vdmUgaGVhZGVyIGluY2x1ZGVzIHRvIGhlbHAgdXNlciBzcGFjZQorICoJLSBJbmNyZWFzZSBJV19FTkNPRElOR19UT0tFTl9NQVggZnJvbSAzMiB0byA2NAorICoJLSBBZGQgSVdfUVVBTF9BTExfVVBEQVRFRCBhbmQgSVdfUVVBTF9BTExfSU5WQUxJRCBtYWNyb3MKKyAqCS0gQWRkIGV4cGxpY2l0IGZsYWcgdG8gdGVsbCBzdGF0cyBhcmUgaW4gZEJtIDogSVdfUVVBTF9EQk0KKyAqCS0gQWRkIElXX0lPQ1RMX0lEWCgpIGFuZCBJV19FVkVOVF9JRFgoKSBtYWNyb3MKKyAqCisgKiBWMTkgdG8gVjIwCisgKiAtLS0tLS0tLS0tCisgKgktIFJ0TmV0bGluayByZXF1ZXN0cyBzdXBwb3J0IChTRVQvR0VUKQorICoKKyAqIFYyMCB0byBWMjEKKyAqIC0tLS0tLS0tLS0KKyAqCS0gUmVtb3ZlIChzdHJ1Y3QgbmV0X2RldmljZSAqKS0+Z2V0X3dpcmVsZXNzX3N0YXRzKCkKKyAqCS0gQ2hhbmdlIGxlbmd0aCBpbiBFU1NJRCBhbmQgTklDSyB0byBzdHJsZW4oKSBpbnN0ZWFkIG9mIHN0cmxlbigpKzEKKyAqCS0gQWRkIElXX1JFVFJZX1NIT1JUL0lXX1JFVFJZX0xPTkcgcmV0cnkgbW9kaWZpZXJzCisgKgktIFBvd2VyL1JldHJ5IHJlbGF0aXZlIHZhbHVlcyBubyBsb25nZXIgKiAxMDAwMDAKKyAqCS0gQWRkIGV4cGxpY2l0IGZsYWcgdG8gdGVsbCBzdGF0cyBhcmUgaW4gODAyLjExayBSQ1BJIDogSVdfUVVBTF9SQ1BJCisgKgorICogVjIxIHRvIFYyMgorICogLS0tLS0tLS0tLQorICoJLSBQcmV2ZW50IGxlYWtpbmcgb2Yga2VybmVsIHNwYWNlIGluIHN0cmVhbSBvbiA2NCBiaXRzLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTlNUQU5UUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJT0NUTCBMSVNUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFdpcmVsZXNzIElkZW50aWZpY2F0aW9uICovCisjZGVmaW5lIFNJT0NTSVdDT01NSVQJMHg4QjAwCQkvKiBDb21taXQgcGVuZGluZyBjaGFuZ2VzIHRvIGRyaXZlciAqLworI2RlZmluZSBTSU9DR0lXTkFNRQkweDhCMDEJCS8qIGdldCBuYW1lID09IHdpcmVsZXNzIHByb3RvY29sICovCisvKiBTSU9DR0lXTkFNRSBpcyB1c2VkIHRvIHZlcmlmeSB0aGUgcHJlc2VuY2Ugb2YgV2lyZWxlc3MgRXh0ZW5zaW9ucy4KKyAqIENvbW1vbiB2YWx1ZXMgOiAiSUVFRSA4MDIuMTEtRFMiLCAiSUVFRSA4MDIuMTEtRkgiLCAiSUVFRSA4MDIuMTFiIi4uLgorICogRG9uJ3QgcHV0IHRoZSBuYW1lIG9mIHlvdXIgZHJpdmVyIHRoZXJlLCBpdCdzIHVzZWxlc3MuICovCisKKy8qIEJhc2ljIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgU0lPQ1NJV05XSUQJMHg4QjAyCQkvKiBzZXQgbmV0d29yayBpZCAocHJlLTgwMi4xMSkgKi8KKyNkZWZpbmUgU0lPQ0dJV05XSUQJMHg4QjAzCQkvKiBnZXQgbmV0d29yayBpZCAodGhlIGNlbGwpICovCisjZGVmaW5lIFNJT0NTSVdGUkVRCTB4OEIwNAkJLyogc2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikgKi8KKyNkZWZpbmUgU0lPQ0dJV0ZSRVEJMHg4QjA1CQkvKiBnZXQgY2hhbm5lbC9mcmVxdWVuY3kgKEh6KSAqLworI2RlZmluZSBTSU9DU0lXTU9ERQkweDhCMDYJCS8qIHNldCBvcGVyYXRpb24gbW9kZSAqLworI2RlZmluZSBTSU9DR0lXTU9ERQkweDhCMDcJCS8qIGdldCBvcGVyYXRpb24gbW9kZSAqLworI2RlZmluZSBTSU9DU0lXU0VOUwkweDhCMDgJCS8qIHNldCBzZW5zaXRpdml0eSAoZEJtKSAqLworI2RlZmluZSBTSU9DR0lXU0VOUwkweDhCMDkJCS8qIGdldCBzZW5zaXRpdml0eSAoZEJtKSAqLworCisvKiBJbmZvcm1hdGl2ZSBzdHVmZiAqLworI2RlZmluZSBTSU9DU0lXUkFOR0UJMHg4QjBBCQkvKiBVbnVzZWQgKi8KKyNkZWZpbmUgU0lPQ0dJV1JBTkdFCTB4OEIwQgkJLyogR2V0IHJhbmdlIG9mIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgU0lPQ1NJV1BSSVYJMHg4QjBDCQkvKiBVbnVzZWQgKi8KKyNkZWZpbmUgU0lPQ0dJV1BSSVYJMHg4QjBECQkvKiBnZXQgcHJpdmF0ZSBpb2N0bCBpbnRlcmZhY2UgaW5mbyAqLworI2RlZmluZSBTSU9DU0lXU1RBVFMJMHg4QjBFCQkvKiBVbnVzZWQgKi8KKyNkZWZpbmUgU0lPQ0dJV1NUQVRTCTB4OEIwRgkJLyogR2V0IC9wcm9jL25ldC93aXJlbGVzcyBzdGF0cyAqLworLyogU0lPQ0dJV1NUQVRTIGlzIHN0cmljdGx5IHVzZWQgYmV0d2VlbiB1c2VyIHNwYWNlIGFuZCB0aGUga2VybmVsLCBhbmQKKyAqIGlzIG5ldmVyIHBhc3NlZCB0byB0aGUgZHJpdmVyIChpLmUuIHRoZSBkcml2ZXIgd2lsbCBuZXZlciBzZWUgaXQpLiAqLworCisvKiBTcHkgc3VwcG9ydCAoc3RhdGlzdGljcyBwZXIgTUFDIGFkZHJlc3MgLSB1c2VkIGZvciBNb2JpbGUgSVAgc3VwcG9ydCkgKi8KKyNkZWZpbmUgU0lPQ1NJV1NQWQkweDhCMTAJCS8qIHNldCBzcHkgYWRkcmVzc2VzICovCisjZGVmaW5lIFNJT0NHSVdTUFkJMHg4QjExCQkvKiBnZXQgc3B5IGluZm8gKHF1YWxpdHkgb2YgbGluaykgKi8KKyNkZWZpbmUgU0lPQ1NJV1RIUlNQWQkweDhCMTIJCS8qIHNldCBzcHkgdGhyZXNob2xkIChzcHkgZXZlbnQpICovCisjZGVmaW5lIFNJT0NHSVdUSFJTUFkJMHg4QjEzCQkvKiBnZXQgc3B5IHRocmVzaG9sZCAqLworCisvKiBBY2Nlc3MgUG9pbnQgbWFuaXB1bGF0aW9uICovCisjZGVmaW5lIFNJT0NTSVdBUAkweDhCMTQJCS8qIHNldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcyAqLworI2RlZmluZSBTSU9DR0lXQVAJMHg4QjE1CQkvKiBnZXQgYWNjZXNzIHBvaW50IE1BQyBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgU0lPQ0dJV0FQTElTVAkweDhCMTcJCS8qIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2Ygc2Nhbm5pbmcgKi8KKyNkZWZpbmUgU0lPQ1NJV1NDQU4JMHg4QjE4CQkvKiB0cmlnZ2VyIHNjYW5uaW5nIChsaXN0IGNlbGxzKSAqLworI2RlZmluZSBTSU9DR0lXU0NBTgkweDhCMTkJCS8qIGdldCBzY2FubmluZyByZXN1bHRzICovCisKKy8qIDgwMi4xMSBzcGVjaWZpYyBzdXBwb3J0ICovCisjZGVmaW5lIFNJT0NTSVdFU1NJRAkweDhCMUEJCS8qIHNldCBFU1NJRCAobmV0d29yayBuYW1lKSAqLworI2RlZmluZSBTSU9DR0lXRVNTSUQJMHg4QjFCCQkvKiBnZXQgRVNTSUQgKi8KKyNkZWZpbmUgU0lPQ1NJV05JQ0tOCTB4OEIxQwkJLyogc2V0IG5vZGUgbmFtZS9uaWNrbmFtZSAqLworI2RlZmluZSBTSU9DR0lXTklDS04JMHg4QjFECQkvKiBnZXQgbm9kZSBuYW1lL25pY2tuYW1lICovCisvKiBBcyB0aGUgRVNTSUQgYW5kIE5JQ0tOIGFyZSBzdHJpbmdzIHVwIHRvIDMyIGJ5dGVzIGxvbmcsIGl0IGRvZXNuJ3QgZml0CisgKiB3aXRoaW4gdGhlICdpd3JlcScgc3RydWN0dXJlLCBzbyB3ZSBuZWVkIHRvIHVzZSB0aGUgJ2RhdGEnIG1lbWJlciB0bworICogcG9pbnQgdG8gYSBzdHJpbmcgaW4gdXNlciBzcGFjZSwgbGlrZSBpdCBpcyBkb25lIGZvciBSQU5HRS4uLiAqLworCisvKiBPdGhlciBwYXJhbWV0ZXJzIHVzZWZ1bCBpbiA4MDIuMTEgYW5kIHNvbWUgb3RoZXIgZGV2aWNlcyAqLworI2RlZmluZSBTSU9DU0lXUkFURQkweDhCMjAJCS8qIHNldCBkZWZhdWx0IGJpdCByYXRlIChicHMpICovCisjZGVmaW5lIFNJT0NHSVdSQVRFCTB4OEIyMQkJLyogZ2V0IGRlZmF1bHQgYml0IHJhdGUgKGJwcykgKi8KKyNkZWZpbmUgU0lPQ1NJV1JUUwkweDhCMjIJCS8qIHNldCBSVFMvQ1RTIHRocmVzaG9sZCAoYnl0ZXMpICovCisjZGVmaW5lIFNJT0NHSVdSVFMJMHg4QjIzCQkvKiBnZXQgUlRTL0NUUyB0aHJlc2hvbGQgKGJ5dGVzKSAqLworI2RlZmluZSBTSU9DU0lXRlJBRwkweDhCMjQJCS8qIHNldCBmcmFnbWVudGF0aW9uIHRociAoYnl0ZXMpICovCisjZGVmaW5lIFNJT0NHSVdGUkFHCTB4OEIyNQkJLyogZ2V0IGZyYWdtZW50YXRpb24gdGhyIChieXRlcykgKi8KKyNkZWZpbmUgU0lPQ1NJV1RYUE9XCTB4OEIyNgkJLyogc2V0IHRyYW5zbWl0IHBvd2VyIChkQm0pICovCisjZGVmaW5lIFNJT0NHSVdUWFBPVwkweDhCMjcJCS8qIGdldCB0cmFuc21pdCBwb3dlciAoZEJtKSAqLworI2RlZmluZSBTSU9DU0lXUkVUUlkJMHg4QjI4CQkvKiBzZXQgcmV0cnkgbGltaXRzIGFuZCBsaWZldGltZSAqLworI2RlZmluZSBTSU9DR0lXUkVUUlkJMHg4QjI5CQkvKiBnZXQgcmV0cnkgbGltaXRzIGFuZCBsaWZldGltZSAqLworCisvKiBFbmNvZGluZyBzdHVmZiAoc2NyYW1ibGluZywgaGFyZHdhcmUgc2VjdXJpdHksIFdFUC4uLikgKi8KKyNkZWZpbmUgU0lPQ1NJV0VOQ09ERQkweDhCMkEJCS8qIHNldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUgKi8KKyNkZWZpbmUgU0lPQ0dJV0VOQ09ERQkweDhCMkIJCS8qIGdldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUgKi8KKy8qIFBvd2VyIHNhdmluZyBzdHVmZiAocG93ZXIgbWFuYWdlbWVudCwgdW5pY2FzdCBhbmQgbXVsdGljYXN0KSAqLworI2RlZmluZSBTSU9DU0lXUE9XRVIJMHg4QjJDCQkvKiBzZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncyAqLworI2RlZmluZSBTSU9DR0lXUE9XRVIJMHg4QjJECQkvKiBnZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncyAqLworCisvKiBXUEEgOiBHZW5lcmljIElFRUUgODAyLjExIGluZm9ybWF0aW9tIGVsZW1lbnQgKGUuZy4sIGZvciBXUEEvUlNOL1dNTSkuCisgKiBUaGlzIGlvY3RsIHVzZXMgc3RydWN0IGl3X3BvaW50IGFuZCBkYXRhIGJ1ZmZlciB0aGF0IGluY2x1ZGVzIElFIGlkIGFuZCBsZW4KKyAqIGZpZWxkcy4gTW9yZSB0aGFuIG9uZSBJRSBtYXkgYmUgaW5jbHVkZWQgaW4gdGhlIHJlcXVlc3QuIFNldHRpbmcgdGhlIGdlbmVyaWMKKyAqIElFIHRvIGVtcHR5IGJ1ZmZlciAobGVuPTApIHJlbW92ZXMgdGhlIGdlbmVyaWMgSUUgZnJvbSB0aGUgZHJpdmVyLiBEcml2ZXJzCisgKiBhcmUgYWxsb3dlZCB0byBnZW5lcmF0ZSB0aGVpciBvd24gV1BBL1JTTiBJRXMsIGJ1dCBpbiB0aGVzZSBjYXNlcywgZHJpdmVycworICogYXJlIHJlcXVpcmVkIHRvIHJlcG9ydCB0aGUgdXNlZCBJRSBhcyBhIHdpcmVsZXNzIGV2ZW50LCBlLmcuLCB3aGVuCisgKiBhc3NvY2lhdGluZyB3aXRoIGFuIEFQLiAqLworI2RlZmluZSBTSU9DU0lXR0VOSUUJMHg4QjMwCQkvKiBzZXQgZ2VuZXJpYyBJRSAqLworI2RlZmluZSBTSU9DR0lXR0VOSUUJMHg4QjMxCQkvKiBnZXQgZ2VuZXJpYyBJRSAqLworCisvKiBXUEEgOiBJRUVFIDgwMi4xMSBNTE1FIHJlcXVlc3RzICovCisjZGVmaW5lIFNJT0NTSVdNTE1FCTB4OEIxNgkJLyogcmVxdWVzdCBNTE1FIG9wZXJhdGlvbjsgdXNlcworCQkJCQkgKiBzdHJ1Y3QgaXdfbWxtZSAqLworLyogV1BBIDogQXV0aGVudGljYXRpb24gbW9kZSBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFNJT0NTSVdBVVRICTB4OEIzMgkJLyogc2V0IGF1dGhlbnRpY2F0aW9uIG1vZGUgcGFyYW1zICovCisjZGVmaW5lIFNJT0NHSVdBVVRICTB4OEIzMwkJLyogZ2V0IGF1dGhlbnRpY2F0aW9uIG1vZGUgcGFyYW1zICovCisKKy8qIFdQQSA6IEV4dGVuZGVkIHZlcnNpb24gb2YgZW5jb2RpbmcgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBTSU9DU0lXRU5DT0RFRVhUIDB4OEIzNAkJLyogc2V0IGVuY29kaW5nIHRva2VuICYgbW9kZSAqLworI2RlZmluZSBTSU9DR0lXRU5DT0RFRVhUIDB4OEIzNQkJLyogZ2V0IGVuY29kaW5nIHRva2VuICYgbW9kZSAqLworCisvKiBXUEEyIDogUE1LU0EgY2FjaGUgbWFuYWdlbWVudCAqLworI2RlZmluZSBTSU9DU0lXUE1LU0EJMHg4QjM2CQkvKiBQTUtTQSBjYWNoZSBvcGVyYXRpb24gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gREVWIFBSSVZBVEUgSU9DVEwgTElTVCAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUaGVzZSAzMiBpb2N0bCBhcmUgd2lyZWxlc3MgZGV2aWNlIHByaXZhdGUsIGZvciAxNiBjb21tYW5kcy4KKyAqIEVhY2ggZHJpdmVyIGlzIGZyZWUgdG8gdXNlIHRoZW0gZm9yIHdoYXRldmVyIHB1cnBvc2UgaXQgY2hvb3NlcywKKyAqIGhvd2V2ZXIgdGhlIGRyaXZlciAqbXVzdCogZXhwb3J0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aG9zZSBpb2N0bHMKKyAqIHdpdGggU0lPQ0dJV1BSSVYgYW5kICptdXN0KiB1c2UgYXJndW1lbnRzIGFzIGRlZmluZWQgYmVsb3cuCisgKiBJZiB5b3UgZG9uJ3QgZm9sbG93IHRob3NlIHJ1bGVzLCBEYXZlTSBpcyBnb2luZyB0byBoYXRlIHlvdSAocmVhc29uIDoKKyAqIGl0IG1ha2UgbWl4ZWQgMzIvNjRiaXQgb3BlcmF0aW9uIGltcG9zc2libGUpLgorICovCisjZGVmaW5lIFNJT0NJV0ZJUlNUUFJJVgkweDhCRTAKKyNkZWZpbmUgU0lPQ0lXTEFTVFBSSVYJMHg4QkZGCisvKiBQcmV2aW91c2x5LCB3ZSB3ZXJlIHVzaW5nIFNJT0NERVZQUklWQVRFLCBidXQgd2Ugbm93IGhhdmUgb3VyCisgKiBzZXBhcmF0ZSByYW5nZSBiZWNhdXNlIG9mIGNvbGxpc2lvbnMgd2l0aCBvdGhlciB0b29scyBzdWNoIGFzCisgKiAnbWlpLXRvb2wnLgorICogV2Ugbm93IGhhdmUgMzIgY29tbWFuZHMsIHNvIGEgYml0IG1vcmUgc3BhY2UgOy0pLgorICogQWxzbywgYWxsICdldmVuJyBjb21tYW5kcyBhcmUgb25seSB1c2FibGUgYnkgcm9vdCBhbmQgZG9uJ3QgcmV0dXJuIHRoZQorICogY29udGVudCBvZiBpZnIvaXdyIHRvIHVzZXIgKGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2VkIHRvIHVzZSB0aGUgc2V0L2dldAorICogY29udmVudGlvbiwganVzdCB1c2UgZXZlcnkgb3RoZXIgdHdvIGNvbW1hbmQpLiBNb3JlIGRldGFpbHMgaW4gaXdwcml2LmMuCisgKiBBbmQgSSByZXBlYXQgOiB5b3UgYXJlIG5vdCBmb3JjZWQgdG8gdXNlIHRoZW0gd2l0aCBpd3ByaXYsIGJ1dCB5b3UKKyAqIG11c3QgYmUgY29tcGxpYW50IHdpdGggaXQuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJT0NUTCBTVFVGRiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFRoZSBmaXJzdCBhbmQgdGhlIGxhc3QgKHJhbmdlKSAqLworI2RlZmluZSBTSU9DSVdGSVJTVAkweDhCMDAKKyNkZWZpbmUgU0lPQ0lXTEFTVAlTSU9DSVdMQVNUUFJJVgkJLyogMHg4QkZGICovCisjZGVmaW5lIElXX0lPQ1RMX0lEWChjbWQpCSgoY21kKSAtIFNJT0NJV0ZJUlNUKQorI2RlZmluZSBJV19IQU5ETEVSKGlkLCBmdW5jKQkJCVwKKwlbSVdfSU9DVExfSURYKGlkKV0gPSBmdW5jCisKKy8qIE9kZCA6IGdldCAod29ybGQgYWNjZXNzKSwgZXZlbiA6IHNldCAocm9vdCBhY2Nlc3MpICovCisjZGVmaW5lIElXX0lTX1NFVChjbWQpCSghKChjbWQpICYgMHgxKSkKKyNkZWZpbmUgSVdfSVNfR0VUKGNtZCkJKChjbWQpICYgMHgxKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXSVJFTEVTUyBFVkVOVFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFRob3NlIGFyZSAqTk9UKiBpb2N0bHMsIGRvIG5vdCBpc3N1ZSByZXF1ZXN0IG9uIHRoZW0gISEhICovCisvKiBNb3N0IGV2ZW50cyB1c2UgdGhlIHNhbWUgaWRlbnRpZmllciBhcyBpb2N0bCByZXF1ZXN0cyAqLworCisjZGVmaW5lIElXRVZUWERST1AJMHg4QzAwCQkvKiBQYWNrZXQgZHJvcHBlZCB0byBleGNlc3NpdmUgcmV0cnkgKi8KKyNkZWZpbmUgSVdFVlFVQUwJMHg4QzAxCQkvKiBRdWFsaXR5IHBhcnQgb2Ygc3RhdGlzdGljcyAoc2NhbikgKi8KKyNkZWZpbmUgSVdFVkNVU1RPTQkweDhDMDIJCS8qIERyaXZlciBzcGVjaWZpYyBhc2NpaSBzdHJpbmcgKi8KKyNkZWZpbmUgSVdFVlJFR0lTVEVSRUQJMHg4QzAzCQkvKiBEaXNjb3ZlcmVkIGEgbmV3IG5vZGUgKEFQIG1vZGUpICovCisjZGVmaW5lIElXRVZFWFBJUkVECTB4OEMwNAkJLyogRXhwaXJlZCBhIG5vZGUgKEFQIG1vZGUpICovCisjZGVmaW5lIElXRVZHRU5JRQkweDhDMDUJCS8qIEdlbmVyaWMgSUUgKFdQQSwgUlNOLCBXTU0sIC4uKQorCQkJCQkgKiAoc2NhbiByZXN1bHRzKTsgVGhpcyBpbmNsdWRlcyBpZCBhbmQKKwkJCQkJICogbGVuZ3RoIGZpZWxkcy4gT25lIElXRVZHRU5JRSBtYXkKKwkJCQkJICogY29udGFpbiBtb3JlIHRoYW4gb25lIElFLiBTY2FuCisJCQkJCSAqIHJlc3VsdHMgbWF5IGNvbnRhaW4gb25lIG9yIG1vcmUKKwkJCQkJICogSVdFVkdFTklFIGV2ZW50cy4gKi8KKyNkZWZpbmUgSVdFVk1JQ0hBRUxNSUNGQUlMVVJFIDB4OEMwNgkvKiBNaWNoYWVsIE1JQyBmYWlsdXJlCisJCQkJCSAqIChzdHJ1Y3QgaXdfbWljaGFlbG1pY2ZhaWx1cmUpCisJCQkJCSAqLworI2RlZmluZSBJV0VWQVNTT0NSRVFJRQkweDhDMDcJCS8qIElFcyB1c2VkIGluIChSZSlBc3NvY2lhdGlvbiBSZXF1ZXN0LgorCQkJCQkgKiBUaGUgZGF0YSBpbmNsdWRlcyBpZCBhbmQgbGVuZ3RoCisJCQkJCSAqIGZpZWxkcyBhbmQgbWF5IGNvbnRhaW4gbW9yZSB0aGFuIG9uZQorCQkJCQkgKiBJRS4gVGhpcyBldmVudCBpcyByZXF1aXJlZCBpbgorCQkJCQkgKiBNYW5hZ2VkIG1vZGUgaWYgdGhlIGRyaXZlcgorCQkJCQkgKiBnZW5lcmF0ZXMgaXRzIG93biBXUEEvUlNOIElFLiBUaGlzCisJCQkJCSAqIHNob3VsZCBiZSBzZW50IGp1c3QgYmVmb3JlCisJCQkJCSAqIElXRVZSRUdJU1RFUkVEIGV2ZW50IGZvciB0aGUKKwkJCQkJICogYXNzb2NpYXRpb24uICovCisjZGVmaW5lIElXRVZBU1NPQ1JFU1BJRQkweDhDMDgJCS8qIElFcyB1c2VkIGluIChSZSlBc3NvY2lhdGlvbgorCQkJCQkgKiBSZXNwb25zZS4gVGhlIGRhdGEgaW5jbHVkZXMgaWQgYW5kCisJCQkJCSAqIGxlbmd0aCBmaWVsZHMgYW5kIG1heSBjb250YWluIG1vcmUKKwkJCQkJICogdGhhbiBvbmUgSUUuIFRoaXMgbWF5IGJlIHNlbnQKKwkJCQkJICogYmV0d2VlbiBJV0VWQVNTT0NSRVFJRSBhbmQKKwkJCQkJICogSVdFVlJFR0lTVEVSRUQgZXZlbnRzIGZvciB0aGUKKwkJCQkJICogYXNzb2NpYXRpb24uICovCisjZGVmaW5lIElXRVZQTUtJRENBTkQJMHg4QzA5CQkvKiBQTUtJRCBjYW5kaWRhdGUgZm9yIFJTTgorCQkJCQkgKiBwcmUtYXV0aGVudGljYXRpb24KKwkJCQkJICogKHN0cnVjdCBpd19wbWtpZF9jYW5kKSAqLworCisjZGVmaW5lIElXRVZGSVJTVAkweDhDMDAKKyNkZWZpbmUgSVdfRVZFTlRfSURYKGNtZCkJKChjbWQpIC0gSVdFVkZJUlNUKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBSSVZBVEUgSU5GTyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogVGhlIGZvbGxvd2luZyBpcyB1c2VkIHdpdGggU0lPQ0dJV1BSSVYuIEl0IGFsbG93IGEgZHJpdmVyIHRvIGRlZmluZQorICogdGhlIGludGVyZmFjZSAobmFtZSwgdHlwZSBvZiBkYXRhKSBmb3IgaXRzIHByaXZhdGUgaW9jdGwuCisgKiBQcml2YXRlcyBpb2N0bCBhcmUgU0lPQ0lXRklSU1RQUklWIC0+IFNJT0NJV0xBU1RQUklWCisgKi8KKworI2RlZmluZSBJV19QUklWX1RZUEVfTUFTSwkweDcwMDAJLyogVHlwZSBvZiBhcmd1bWVudHMgKi8KKyNkZWZpbmUgSVdfUFJJVl9UWVBFX05PTkUJMHgwMDAwCisjZGVmaW5lIElXX1BSSVZfVFlQRV9CWVRFCTB4MTAwMAkvKiBDaGFyIGFzIG51bWJlciAqLworI2RlZmluZSBJV19QUklWX1RZUEVfQ0hBUgkweDIwMDAJLyogQ2hhciBhcyBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgSVdfUFJJVl9UWVBFX0lOVAkweDQwMDAJLyogMzIgYml0cyBpbnQgKi8KKyNkZWZpbmUgSVdfUFJJVl9UWVBFX0ZMT0FUCTB4NTAwMAkvKiBzdHJ1Y3QgaXdfZnJlcSAqLworI2RlZmluZSBJV19QUklWX1RZUEVfQUREUgkweDYwMDAJLyogc3RydWN0IHNvY2thZGRyICovCisKKyNkZWZpbmUgSVdfUFJJVl9TSVpFX0ZJWEVECTB4MDgwMAkvKiBWYXJpYWJsZSBvciBmaXhlZCBudW1iZXIgb2YgYXJncyAqLworCisjZGVmaW5lIElXX1BSSVZfU0laRV9NQVNLCTB4MDdGRgkvKiBNYXggbnVtYmVyIG9mIHRob3NlIGFyZ3MgKi8KKworLyoKKyAqIE5vdGUgOiBpZiB0aGUgbnVtYmVyIG9mIGFyZ3MgaXMgZml4ZWQgYW5kIHRoZSBzaXplIDwgMTYgb2N0ZXRzLAorICogaW5zdGVhZCBvZiBwYXNzaW5nIGEgcG9pbnRlciB3ZSB3aWxsIHB1dCBhcmdzIGluIHRoZSBpd3JlcSBzdHJ1Y3QuLi4KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPVEhFUiBDT05TVEFOVFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogTWF4aW11bSBmcmVxdWVuY2llcyBpbiB0aGUgcmFuZ2Ugc3RydWN0ICovCisjZGVmaW5lIElXX01BWF9GUkVRVUVOQ0lFUwkzMgorLyogTm90ZSA6IGlmIHlvdSBoYXZlIHNvbWV0aGluZyBsaWtlIDgwIGZyZXF1ZW5jaWVzLAorICogZG9uJ3QgaW5jcmVhc2UgdGhpcyBjb25zdGFudCBhbmQgZG9uJ3QgZmlsbCB0aGUgZnJlcXVlbmN5IGxpc3QuCisgKiBUaGUgdXNlciB3aWxsIGJlIGFibGUgdG8gc2V0IGJ5IGNoYW5uZWwgYW55d2F5Li4uICovCisKKy8qIE1heGltdW0gYml0IHJhdGVzIGluIHRoZSByYW5nZSBzdHJ1Y3QgKi8KKyNkZWZpbmUgSVdfTUFYX0JJVFJBVEVTCQkzMgorCisvKiBNYXhpbXVtIHR4IHBvd2VycyBpbiB0aGUgcmFuZ2Ugc3RydWN0ICovCisjZGVmaW5lIElXX01BWF9UWFBPV0VSCQk4CisvKiBOb3RlIDogaWYgeW91IG1vcmUgdGhhbiA4IFRYUG93ZXJzLCBqdXN0IHNldCB0aGUgbWF4IGFuZCBtaW4gb3IKKyAqIGEgZmV3IG9mIHRoZW0gaW4gdGhlIHN0cnVjdCBpd19yYW5nZS4gKi8KKworLyogTWF4aW11bSBvZiBhZGRyZXNzIHRoYXQgeW91IG1heSBzZXQgd2l0aCBTUFkgKi8KKyNkZWZpbmUgSVdfTUFYX1NQWQkJOAorCisvKiBNYXhpbXVtIG9mIGFkZHJlc3MgdGhhdCB5b3UgbWF5IGdldCBpbiB0aGUKKyAgIGxpc3Qgb2YgYWNjZXNzIHBvaW50cyBpbiByYW5nZSAqLworI2RlZmluZSBJV19NQVhfQVAJCTY0CisKKy8qIE1heGltdW0gc2l6ZSBvZiB0aGUgRVNTSUQgYW5kIE5JQ0tOIHN0cmluZ3MgKi8KKyNkZWZpbmUgSVdfRVNTSURfTUFYX1NJWkUJMzIKKworLyogTW9kZXMgb2Ygb3BlcmF0aW9uICovCisjZGVmaW5lIElXX01PREVfQVVUTwkwCS8qIExldCB0aGUgZHJpdmVyIGRlY2lkZXMgKi8KKyNkZWZpbmUgSVdfTU9ERV9BREhPQwkxCS8qIFNpbmdsZSBjZWxsIG5ldHdvcmsgKi8KKyNkZWZpbmUgSVdfTU9ERV9JTkZSQQkyCS8qIE11bHRpIGNlbGwgbmV0d29yaywgcm9hbWluZywgLi4uICovCisjZGVmaW5lIElXX01PREVfTUFTVEVSCTMJLyogU3luY2hyb25pc2F0aW9uIG1hc3RlciBvciBBY2Nlc3MgUG9pbnQgKi8KKyNkZWZpbmUgSVdfTU9ERV9SRVBFQVQJNAkvKiBXaXJlbGVzcyBSZXBlYXRlciAoZm9yd2FyZGVyKSAqLworI2RlZmluZSBJV19NT0RFX1NFQ09ORAk1CS8qIFNlY29uZGFyeSBtYXN0ZXIvcmVwZWF0ZXIgKGJhY2t1cCkgKi8KKyNkZWZpbmUgSVdfTU9ERV9NT05JVE9SCTYJLyogUGFzc2l2ZSBtb25pdG9yIChsaXN0ZW4gb25seSkgKi8KKyNkZWZpbmUgSVdfTU9ERV9NRVNICTcJLyogTWVzaCAoSUVFRSA4MDIuMTFzKSBuZXR3b3JrICovCisKKy8qIFN0YXRpc3RpY3MgZmxhZ3MgKGJpdG1hc2sgaW4gdXBkYXRlZCkgKi8KKyNkZWZpbmUgSVdfUVVBTF9RVUFMX1VQREFURUQJMHgwMQkvKiBWYWx1ZSB3YXMgdXBkYXRlZCBzaW5jZSBsYXN0IHJlYWQgKi8KKyNkZWZpbmUgSVdfUVVBTF9MRVZFTF9VUERBVEVECTB4MDIKKyNkZWZpbmUgSVdfUVVBTF9OT0lTRV9VUERBVEVECTB4MDQKKyNkZWZpbmUgSVdfUVVBTF9BTExfVVBEQVRFRAkweDA3CisjZGVmaW5lIElXX1FVQUxfREJNCQkweDA4CS8qIExldmVsICsgTm9pc2UgYXJlIGRCbSAqLworI2RlZmluZSBJV19RVUFMX1FVQUxfSU5WQUxJRAkweDEwCS8qIERyaXZlciBkb2Vzbid0IHByb3ZpZGUgdmFsdWUgKi8KKyNkZWZpbmUgSVdfUVVBTF9MRVZFTF9JTlZBTElECTB4MjAKKyNkZWZpbmUgSVdfUVVBTF9OT0lTRV9JTlZBTElECTB4NDAKKyNkZWZpbmUgSVdfUVVBTF9SQ1BJCQkweDgwCS8qIExldmVsICsgTm9pc2UgYXJlIDgwMi4xMWsgUkNQSSAqLworI2RlZmluZSBJV19RVUFMX0FMTF9JTlZBTElECTB4NzAKKworLyogRnJlcXVlbmN5IGZsYWdzICovCisjZGVmaW5lIElXX0ZSRVFfQVVUTwkJMHgwMAkvKiBMZXQgdGhlIGRyaXZlciBkZWNpZGVzICovCisjZGVmaW5lIElXX0ZSRVFfRklYRUQJCTB4MDEJLyogRm9yY2UgYSBzcGVjaWZpYyB2YWx1ZSAqLworCisvKiBNYXhpbXVtIG51bWJlciBvZiBzaXplIG9mIGVuY29kaW5nIHRva2VuIGF2YWlsYWJsZQorICogdGhleSBhcmUgbGlzdGVkIGluIHRoZSByYW5nZSBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgSVdfTUFYX0VOQ09ESU5HX1NJWkVTCTgKKworLyogTWF4aW11bSBzaXplIG9mIHRoZSBlbmNvZGluZyB0b2tlbiBpbiBieXRlcyAqLworI2RlZmluZSBJV19FTkNPRElOR19UT0tFTl9NQVgJNjQJLyogNTEyIGJpdHMgKGZvciBub3cpICovCisKKy8qIEZsYWdzIGZvciBlbmNvZGluZyAoYWxvbmcgd2l0aCB0aGUgdG9rZW4pICovCisjZGVmaW5lIElXX0VOQ09ERV9JTkRFWAkJMHgwMEZGCS8qIFRva2VuIGluZGV4IChpZiBuZWVkZWQpICovCisjZGVmaW5lIElXX0VOQ09ERV9GTEFHUwkJMHhGRjAwCS8qIEZsYWdzIGRlZmluZWQgYmVsb3cgKi8KKyNkZWZpbmUgSVdfRU5DT0RFX01PREUJCTB4RjAwMAkvKiBNb2RlcyBkZWZpbmVkIGJlbG93ICovCisjZGVmaW5lIElXX0VOQ09ERV9ESVNBQkxFRAkweDgwMDAJLyogRW5jb2RpbmcgZGlzYWJsZWQgKi8KKyNkZWZpbmUgSVdfRU5DT0RFX0VOQUJMRUQJMHgwMDAwCS8qIEVuY29kaW5nIGVuYWJsZWQgKi8KKyNkZWZpbmUgSVdfRU5DT0RFX1JFU1RSSUNURUQJMHg0MDAwCS8qIFJlZnVzZSBub24tZW5jb2RlZCBwYWNrZXRzICovCisjZGVmaW5lIElXX0VOQ09ERV9PUEVOCQkweDIwMDAJLyogQWNjZXB0IG5vbi1lbmNvZGVkIHBhY2tldHMgKi8KKyNkZWZpbmUgSVdfRU5DT0RFX05PS0VZCQkweDA4MDAgIC8qIEtleSBpcyB3cml0ZSBvbmx5LCBzbyBub3QgcHJlc2VudCAqLworI2RlZmluZSBJV19FTkNPREVfVEVNUAkJMHgwNDAwICAvKiBUZW1wb3Jhcnkga2V5ICovCisKKy8qIFBvd2VyIG1hbmFnZW1lbnQgZmxhZ3MgYXZhaWxhYmxlIChhbG9uZyB3aXRoIHRoZSB2YWx1ZSwgaWYgYW55KSAqLworI2RlZmluZSBJV19QT1dFUl9PTgkJMHgwMDAwCS8qIE5vIGRldGFpbHMuLi4gKi8KKyNkZWZpbmUgSVdfUE9XRVJfVFlQRQkJMHhGMDAwCS8qIFR5cGUgb2YgcGFyYW1ldGVyICovCisjZGVmaW5lIElXX1BPV0VSX1BFUklPRAkJMHgxMDAwCS8qIFZhbHVlIGlzIGEgcGVyaW9kL2R1cmF0aW9uIG9mICAqLworI2RlZmluZSBJV19QT1dFUl9USU1FT1VUCTB4MjAwMAkvKiBWYWx1ZSBpcyBhIHRpbWVvdXQgKHRvIGdvIGFzbGVlcCkgKi8KKyNkZWZpbmUgSVdfUE9XRVJfTU9ERQkJMHgwRjAwCS8qIFBvd2VyIE1hbmFnZW1lbnQgbW9kZSAqLworI2RlZmluZSBJV19QT1dFUl9VTklDQVNUX1IJMHgwMTAwCS8qIFJlY2VpdmUgb25seSB1bmljYXN0IG1lc3NhZ2VzICovCisjZGVmaW5lIElXX1BPV0VSX01VTFRJQ0FTVF9SCTB4MDIwMAkvKiBSZWNlaXZlIG9ubHkgbXVsdGljYXN0IG1lc3NhZ2VzICovCisjZGVmaW5lIElXX1BPV0VSX0FMTF9SCQkweDAzMDAJLyogUmVjZWl2ZSBhbGwgbWVzc2FnZXMgdGhvdWdoIFBNICovCisjZGVmaW5lIElXX1BPV0VSX0ZPUkNFX1MJMHgwNDAwCS8qIEZvcmNlIFBNIHByb2NlZHVyZSBmb3Igc2VuZGluZyB1bmljYXN0ICovCisjZGVmaW5lIElXX1BPV0VSX1JFUEVBVEVSCTB4MDgwMAkvKiBSZXBlYXQgYnJvYWRjYXN0IG1lc3NhZ2VzIGluIFBNIHBlcmlvZCAqLworI2RlZmluZSBJV19QT1dFUl9NT0RJRklFUgkweDAwMEYJLyogTW9kaWZ5IGEgcGFyYW1ldGVyICovCisjZGVmaW5lIElXX1BPV0VSX01JTgkJMHgwMDAxCS8qIFZhbHVlIGlzIGEgbWluaW11bSAgKi8KKyNkZWZpbmUgSVdfUE9XRVJfTUFYCQkweDAwMDIJLyogVmFsdWUgaXMgYSBtYXhpbXVtICovCisjZGVmaW5lIElXX1BPV0VSX1JFTEFUSVZFCTB4MDAwNAkvKiBWYWx1ZSBpcyBub3QgaW4gc2Vjb25kcy9tcy91cyAqLworCisvKiBUcmFuc21pdCBQb3dlciBmbGFncyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgSVdfVFhQT1dfVFlQRQkJMHgwMEZGCS8qIFR5cGUgb2YgdmFsdWUgKi8KKyNkZWZpbmUgSVdfVFhQT1dfREJNCQkweDAwMDAJLyogVmFsdWUgaXMgaW4gZEJtICovCisjZGVmaW5lIElXX1RYUE9XX01XQVRUCQkweDAwMDEJLyogVmFsdWUgaXMgaW4gbVcgKi8KKyNkZWZpbmUgSVdfVFhQT1dfUkVMQVRJVkUJMHgwMDAyCS8qIFZhbHVlIGlzIGluIGFyYml0cmFyeSB1bml0cyAqLworI2RlZmluZSBJV19UWFBPV19SQU5HRQkJMHgxMDAwCS8qIFJhbmdlIG9mIHZhbHVlIGJldHdlZW4gbWluL21heCAqLworCisvKiBSZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lIGZsYWdzIGF2YWlsYWJsZSAqLworI2RlZmluZSBJV19SRVRSWV9PTgkJMHgwMDAwCS8qIE5vIGRldGFpbHMuLi4gKi8KKyNkZWZpbmUgSVdfUkVUUllfVFlQRQkJMHhGMDAwCS8qIFR5cGUgb2YgcGFyYW1ldGVyICovCisjZGVmaW5lIElXX1JFVFJZX0xJTUlUCQkweDEwMDAJLyogTWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyovCisjZGVmaW5lIElXX1JFVFJZX0xJRkVUSU1FCTB4MjAwMAkvKiBNYXhpbXVtIGR1cmF0aW9uIG9mIHJldHJpZXMgaW4gdXMgKi8KKyNkZWZpbmUgSVdfUkVUUllfTU9ESUZJRVIJMHgwMEZGCS8qIE1vZGlmeSBhIHBhcmFtZXRlciAqLworI2RlZmluZSBJV19SRVRSWV9NSU4JCTB4MDAwMQkvKiBWYWx1ZSBpcyBhIG1pbmltdW0gICovCisjZGVmaW5lIElXX1JFVFJZX01BWAkJMHgwMDAyCS8qIFZhbHVlIGlzIGEgbWF4aW11bSAqLworI2RlZmluZSBJV19SRVRSWV9SRUxBVElWRQkweDAwMDQJLyogVmFsdWUgaXMgbm90IGluIHNlY29uZHMvbXMvdXMgKi8KKyNkZWZpbmUgSVdfUkVUUllfU0hPUlQJCTB4MDAxMAkvKiBWYWx1ZSBpcyBmb3Igc2hvcnQgcGFja2V0cyAgKi8KKyNkZWZpbmUgSVdfUkVUUllfTE9ORwkJMHgwMDIwCS8qIFZhbHVlIGlzIGZvciBsb25nIHBhY2tldHMgKi8KKworLyogU2Nhbm5pbmcgcmVxdWVzdCBmbGFncyAqLworI2RlZmluZSBJV19TQ0FOX0RFRkFVTFQJCTB4MDAwMAkvKiBEZWZhdWx0IHNjYW4gb2YgdGhlIGRyaXZlciAqLworI2RlZmluZSBJV19TQ0FOX0FMTF9FU1NJRAkweDAwMDEJLyogU2NhbiBhbGwgRVNTSURzICovCisjZGVmaW5lIElXX1NDQU5fVEhJU19FU1NJRAkweDAwMDIJLyogU2NhbiBvbmx5IHRoaXMgRVNTSUQgKi8KKyNkZWZpbmUgSVdfU0NBTl9BTExfRlJFUQkweDAwMDQJLyogU2NhbiBhbGwgRnJlcXVlbmNpZXMgKi8KKyNkZWZpbmUgSVdfU0NBTl9USElTX0ZSRVEJMHgwMDA4CS8qIFNjYW4gb25seSB0aGlzIEZyZXF1ZW5jeSAqLworI2RlZmluZSBJV19TQ0FOX0FMTF9NT0RFCTB4MDAxMAkvKiBTY2FuIGFsbCBNb2RlcyAqLworI2RlZmluZSBJV19TQ0FOX1RISVNfTU9ERQkweDAwMjAJLyogU2NhbiBvbmx5IHRoaXMgTW9kZSAqLworI2RlZmluZSBJV19TQ0FOX0FMTF9SQVRFCTB4MDA0MAkvKiBTY2FuIGFsbCBCaXQtUmF0ZXMgKi8KKyNkZWZpbmUgSVdfU0NBTl9USElTX1JBVEUJMHgwMDgwCS8qIFNjYW4gb25seSB0aGlzIEJpdC1SYXRlICovCisvKiBzdHJ1Y3QgaXdfc2Nhbl9yZXEgc2Nhbl90eXBlICovCisjZGVmaW5lIElXX1NDQU5fVFlQRV9BQ1RJVkUgMAorI2RlZmluZSBJV19TQ0FOX1RZUEVfUEFTU0lWRSAxCisvKiBNYXhpbXVtIHNpemUgb2YgcmV0dXJuZWQgZGF0YSAqLworI2RlZmluZSBJV19TQ0FOX01BWF9EQVRBCTQwOTYJLyogSW4gYnl0ZXMgKi8KKworLyogU2NhbiBjYXBhYmlsaXR5IGZsYWdzIC0gaW4gKHN0cnVjdCBpd19yYW5nZSAqKS0+c2Nhbl9jYXBhICovCisjZGVmaW5lIElXX1NDQU5fQ0FQQV9OT05FCQkweDAwCisjZGVmaW5lIElXX1NDQU5fQ0FQQV9FU1NJRAkJMHgwMQorI2RlZmluZSBJV19TQ0FOX0NBUEFfQlNTSUQJCTB4MDIKKyNkZWZpbmUgSVdfU0NBTl9DQVBBX0NIQU5ORUwJMHgwNAorI2RlZmluZSBJV19TQ0FOX0NBUEFfTU9ERQkJMHgwOAorI2RlZmluZSBJV19TQ0FOX0NBUEFfUkFURQkJMHgxMAorI2RlZmluZSBJV19TQ0FOX0NBUEFfVFlQRQkJMHgyMAorI2RlZmluZSBJV19TQ0FOX0NBUEFfVElNRQkJMHg0MAorCisvKiBNYXggbnVtYmVyIG9mIGNoYXIgaW4gY3VzdG9tIGV2ZW50IC0gdXNlIG11bHRpcGxlIG9mIHRoZW0gaWYgbmVlZGVkICovCisjZGVmaW5lIElXX0NVU1RPTV9NQVgJCTI1NgkvKiBJbiBieXRlcyAqLworCisvKiBHZW5lcmljIGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KKyNkZWZpbmUgSVdfR0VORVJJQ19JRV9NQVgJMTAyNAorCisvKiBNTE1FIHJlcXVlc3RzIChTSU9DU0lXTUxNRSAvIHN0cnVjdCBpd19tbG1lKSAqLworI2RlZmluZSBJV19NTE1FX0RFQVVUSAkJMAorI2RlZmluZSBJV19NTE1FX0RJU0FTU09DCTEKKyNkZWZpbmUgSVdfTUxNRV9BVVRICQkyCisjZGVmaW5lIElXX01MTUVfQVNTT0MJCTMKKworLyogU0lPQ1NJV0FVVEgvU0lPQ0dJV0FVVEggc3RydWN0IGl3X3BhcmFtIGZsYWdzICovCisjZGVmaW5lIElXX0FVVEhfSU5ERVgJCTB4MEZGRgorI2RlZmluZSBJV19BVVRIX0ZMQUdTCQkweEYwMDAKKy8qIFNJT0NTSVdBVVRIL1NJT0NHSVdBVVRIIHBhcmFtZXRlcnMgKDAgLi4gNDA5NSkKKyAqIChJV19BVVRIX0lOREVYIG1hc2sgaW4gc3RydWN0IGl3X3BhcmFtIGZsYWdzOyB0aGlzIGlzIHRoZSBpbmRleCBvZiB0aGUKKyAqIHBhcmFtZXRlciB0aGF0IGlzIGJlaW5nIHNldC9nZXQgdG87IHZhbHVlIHdpbGwgYmUgcmVhZC93cml0dGVuIHRvCisgKiBzdHJ1Y3QgaXdfcGFyYW0gdmFsdWUgZmllbGQpICovCisjZGVmaW5lIElXX0FVVEhfV1BBX1ZFUlNJT04JCTAKKyNkZWZpbmUgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0UJCTEKKyNkZWZpbmUgSVdfQVVUSF9DSVBIRVJfR1JPVVAJCTIKKyNkZWZpbmUgSVdfQVVUSF9LRVlfTUdNVAkJMworI2RlZmluZSBJV19BVVRIX1RLSVBfQ09VTlRFUk1FQVNVUkVTCTQKKyNkZWZpbmUgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVECTUKKyNkZWZpbmUgSVdfQVVUSF84MDIxMV9BVVRIX0FMRwkJNgorI2RlZmluZSBJV19BVVRIX1dQQV9FTkFCTEVECQk3CisjZGVmaW5lIElXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0wJOAorI2RlZmluZSBJV19BVVRIX1JPQU1JTkdfQ09OVFJPTAkJOQorI2RlZmluZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRAkJMTAKKyNkZWZpbmUgSVdfQVVUSF9DSVBIRVJfR1JPVVBfTUdNVAkxMQorI2RlZmluZSBJV19BVVRIX01GUAkJCTEyCisKKy8qIElXX0FVVEhfV1BBX1ZFUlNJT04gdmFsdWVzIChiaXQgZmllbGQpICovCisjZGVmaW5lIElXX0FVVEhfV1BBX1ZFUlNJT05fRElTQUJMRUQJMHgwMDAwMDAwMQorI2RlZmluZSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQQkJMHgwMDAwMDAwMgorI2RlZmluZSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTIJMHgwMDAwMDAwNAorCisvKiBJV19BVVRIX1BBSVJXSVNFX0NJUEhFUiwgSVdfQVVUSF9HUk9VUF9DSVBIRVIsIGFuZCBJV19BVVRIX0NJUEhFUl9HUk9VUF9NR01UCisgKiB2YWx1ZXMgKGJpdCBmaWVsZCkgKi8KKyNkZWZpbmUgSVdfQVVUSF9DSVBIRVJfTk9ORQkweDAwMDAwMDAxCisjZGVmaW5lIElXX0FVVEhfQ0lQSEVSX1dFUDQwCTB4MDAwMDAwMDIKKyNkZWZpbmUgSVdfQVVUSF9DSVBIRVJfVEtJUAkweDAwMDAwMDA0CisjZGVmaW5lIElXX0FVVEhfQ0lQSEVSX0NDTVAJMHgwMDAwMDAwOAorI2RlZmluZSBJV19BVVRIX0NJUEhFUl9XRVAxMDQJMHgwMDAwMDAxMAorI2RlZmluZSBJV19BVVRIX0NJUEhFUl9BRVNfQ01BQwkweDAwMDAwMDIwCisKKy8qIElXX0FVVEhfS0VZX01HTVQgdmFsdWVzIChiaXQgZmllbGQpICovCisjZGVmaW5lIElXX0FVVEhfS0VZX01HTVRfODAyXzFYCTEKKyNkZWZpbmUgSVdfQVVUSF9LRVlfTUdNVF9QU0sJMgorCisvKiBJV19BVVRIXzgwMjExX0FVVEhfQUxHIHZhbHVlcyAoYml0IGZpZWxkKSAqLworI2RlZmluZSBJV19BVVRIX0FMR19PUEVOX1NZU1RFTQkweDAwMDAwMDAxCisjZGVmaW5lIElXX0FVVEhfQUxHX1NIQVJFRF9LRVkJMHgwMDAwMDAwMgorI2RlZmluZSBJV19BVVRIX0FMR19MRUFQCTB4MDAwMDAwMDQKKworLyogSVdfQVVUSF9ST0FNSU5HX0NPTlRST0wgdmFsdWVzICovCisjZGVmaW5lIElXX0FVVEhfUk9BTUlOR19FTkFCTEUJMAkvKiBkcml2ZXIvZmlybXdhcmUgYmFzZWQgcm9hbWluZyAqLworI2RlZmluZSBJV19BVVRIX1JPQU1JTkdfRElTQUJMRQkxCS8qIHVzZXIgc3BhY2UgcHJvZ3JhbSB1c2VkIGZvciByb2FtaW5nCisJCQkJCSAqIGNvbnRyb2wgKi8KKworLyogSVdfQVVUSF9NRlAgKG1hbmFnZW1lbnQgZnJhbWUgcHJvdGVjdGlvbikgdmFsdWVzICovCisjZGVmaW5lIElXX0FVVEhfTUZQX0RJU0FCTEVECTAJLyogTUZQIGRpc2FibGVkICovCisjZGVmaW5lIElXX0FVVEhfTUZQX09QVElPTkFMCTEJLyogTUZQIG9wdGlvbmFsICovCisjZGVmaW5lIElXX0FVVEhfTUZQX1JFUVVJUkVECTIJLyogTUZQIHJlcXVpcmVkICovCisKKy8qIFNJT0NTSVdFTkNPREVFWFQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgSVdfRU5DT0RFX1NFUV9NQVhfU0laRQk4CisvKiBzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAtPmFsZyAqLworI2RlZmluZSBJV19FTkNPREVfQUxHX05PTkUJMAorI2RlZmluZSBJV19FTkNPREVfQUxHX1dFUAkxCisjZGVmaW5lIElXX0VOQ09ERV9BTEdfVEtJUAkyCisjZGVmaW5lIElXX0VOQ09ERV9BTEdfQ0NNUAkzCisjZGVmaW5lIElXX0VOQ09ERV9BTEdfUE1LCTQKKyNkZWZpbmUgSVdfRU5DT0RFX0FMR19BRVNfQ01BQwk1CisvKiBzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAtPmV4dF9mbGFncyAqLworI2RlZmluZSBJV19FTkNPREVfRVhUX1RYX1NFUV9WQUxJRAkweDAwMDAwMDAxCisjZGVmaW5lIElXX0VOQ09ERV9FWFRfUlhfU0VRX1ZBTElECTB4MDAwMDAwMDIKKyNkZWZpbmUgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZCTB4MDAwMDAwMDgKKworLyogSVdFVk1JQ0hBRUxNSUNGQUlMVVJFIDogc3RydWN0IGl3X21pY2hhZWxtaWNmYWlsdXJlIC0+ZmxhZ3MgKi8KKyNkZWZpbmUgSVdfTUlDRkFJTFVSRV9LRVlfSUQJMHgwMDAwMDAwMyAvKiBLZXkgSUQgMC4uMyAqLworI2RlZmluZSBJV19NSUNGQUlMVVJFX0dST1VQCTB4MDAwMDAwMDQKKyNkZWZpbmUgSVdfTUlDRkFJTFVSRV9QQUlSV0lTRQkweDAwMDAwMDA4CisjZGVmaW5lIElXX01JQ0ZBSUxVUkVfU1RBS0VZCTB4MDAwMDAwMTAKKyNkZWZpbmUgSVdfTUlDRkFJTFVSRV9DT1VOVAkweDAwMDAwMDYwIC8qIDEgb3IgMiAoMCA9IGNvdW50IG5vdCBzdXBwb3J0ZWQpCisJCQkJCSAgICAqLworCisvKiBCaXQgZmllbGQgdmFsdWVzIGZvciBlbmNfY2FwYSBpbiBzdHJ1Y3QgaXdfcmFuZ2UgKi8KKyNkZWZpbmUgSVdfRU5DX0NBUEFfV1BBCQkweDAwMDAwMDAxCisjZGVmaW5lIElXX0VOQ19DQVBBX1dQQTIJMHgwMDAwMDAwMgorI2RlZmluZSBJV19FTkNfQ0FQQV9DSVBIRVJfVEtJUAkweDAwMDAwMDA0CisjZGVmaW5lIElXX0VOQ19DQVBBX0NJUEhFUl9DQ01QCTB4MDAwMDAwMDgKKyNkZWZpbmUgSVdfRU5DX0NBUEFfNFdBWV9IQU5EU0hBS0UJMHgwMDAwMDAxMAorCisvKiBFdmVudCBjYXBhYmlsaXR5IG1hY3JvcyAtIGluIChzdHJ1Y3QgaXdfcmFuZ2UgKiktPmV2ZW50X2NhcGEKKyAqIEJlY2F1c2Ugd2UgaGF2ZSBtb3JlIHRoYW4gMzIgcG9zc2libGUgZXZlbnRzLCB3ZSB1c2UgYW4gYXJyYXkgb2YKKyAqIDMyIGJpdCBiaXRtYXNrcy4gTm90ZSA6IDMyIGJpdHMgPSAweDIwID0gMl41LiAqLworI2RlZmluZSBJV19FVkVOVF9DQVBBX0JBU0UoY21kKQkJKChjbWQgPj0gU0lPQ0lXRklSU1RQUklWKSA/IFwKKwkJCQkJIChjbWQgLSBTSU9DSVdGSVJTVFBSSVYgKyAweDYwKSA6IFwKKwkJCQkJIChjbWQgLSBTSU9DSVdGSVJTVCkpCisjZGVmaW5lIElXX0VWRU5UX0NBUEFfSU5ERVgoY21kKQkoSVdfRVZFTlRfQ0FQQV9CQVNFKGNtZCkgPj4gNSkKKyNkZWZpbmUgSVdfRVZFTlRfQ0FQQV9NQVNLKGNtZCkJCSgxIDw8IChJV19FVkVOVF9DQVBBX0JBU0UoY21kKSAmIDB4MUYpKQorLyogRXZlbnQgY2FwYWJpbGl0eSBjb25zdGFudHMgLSBldmVudCBhdXRvZ2VuZXJhdGVkIGJ5IHRoZSBrZXJuZWwKKyAqIFRoaXMgbGlzdCBpcyB2YWxpZCBmb3IgbW9zdCA4MDIuMTEgZGV2aWNlcywgY3VzdG9taXNlIGFzIG5lZWRlZC4uLiAqLworI2RlZmluZSBJV19FVkVOVF9DQVBBX0tfMAkoSVdfRVZFTlRfQ0FQQV9NQVNLKDB4OEIwNCkgfCBcCisJCQkJIElXX0VWRU5UX0NBUEFfTUFTSygweDhCMDYpIHwgXAorCQkJCSBJV19FVkVOVF9DQVBBX01BU0soMHg4QjFBKSkKKyNkZWZpbmUgSVdfRVZFTlRfQ0FQQV9LXzEJKElXX0VWRU5UX0NBUEFfTUFTSygweDhCMkEpKQorLyogIkVhc3kiIG1hY3JvIHRvIHNldCBldmVudHMgaW4gaXdfcmFuZ2UgKGxlc3MgZWZmaWNpZW50KSAqLworI2RlZmluZSBJV19FVkVOVF9DQVBBX1NFVChldmVudF9jYXBhLCBjbWQpIChldmVudF9jYXBhW0lXX0VWRU5UX0NBUEFfSU5ERVgoY21kKV0gfD0gSVdfRVZFTlRfQ0FQQV9NQVNLKGNtZCkpCisjZGVmaW5lIElXX0VWRU5UX0NBUEFfU0VUX0tFUk5FTChldmVudF9jYXBhKSB7ZXZlbnRfY2FwYVswXSB8PSBJV19FVkVOVF9DQVBBX0tfMDsgZXZlbnRfY2FwYVsxXSB8PSBJV19FVkVOVF9DQVBBX0tfMTsgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVFlQRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1VCVFlQRVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICoJR2VuZXJpYyBmb3JtYXQgZm9yIG1vc3QgcGFyYW1ldGVycyB0aGF0IGZpdCBpbiBhbiBpbnQKKyAqLworc3RydWN0CWl3X3BhcmFtCit7CisgIF9fczMyCQl2YWx1ZTsJCS8qIFRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIGl0c2VsZiAqLworICBfX3U4CQlmaXhlZDsJCS8qIEhhcmR3YXJlIHNob3VsZCBub3QgdXNlIGF1dG8gc2VsZWN0ICovCisgIF9fdTgJCWRpc2FibGVkOwkvKiBEaXNhYmxlIHRoZSBmZWF0dXJlICovCisgIF9fdTE2CQlmbGFnczsJCS8qIFZhcmlvdXMgc3BlY2lmYyBmbGFncyAoaWYgYW55KSAqLworfTsKKworLyoKKyAqCUZvciBhbGwgZGF0YSBsYXJnZXIgdGhhbiAxNiBvY3RldHMsIHdlIG5lZWQgdG8gdXNlIGEKKyAqCXBvaW50ZXIgdG8gbWVtb3J5IGFsbG9jYXRlZCBpbiB1c2VyIHNwYWNlLgorICovCitzdHJ1Y3QJaXdfcG9pbnQKK3sKKyAgdm9pZCAqcG9pbnRlcjsJLyogUG9pbnRlciB0byB0aGUgZGF0YSAgKGluIHVzZXIgc3BhY2UpICovCisgIF9fdTE2CQlsZW5ndGg7CQkvKiBudW1iZXIgb2YgZmllbGRzIG9yIHNpemUgaW4gYnl0ZXMgKi8KKyAgX191MTYJCWZsYWdzOwkJLyogT3B0aW9uYWwgcGFyYW1zICovCit9OworCisKKy8qCisgKglBIGZyZXF1ZW5jeQorICoJRm9yIG51bWJlcnMgbG93ZXIgdGhhbiAxMF45LCB3ZSBlbmNvZGUgdGhlIG51bWJlciBpbiAnbScgYW5kCisgKglzZXQgJ2UnIHRvIDAKKyAqCUZvciBudW1iZXIgZ3JlYXRlciB0aGFuIDEwXjksIHdlIGRpdmlkZSBpdCBieSB0aGUgbG93ZXN0IHBvd2VyCisgKglvZiAxMCB0byBnZXQgJ20nIGxvd2VyIHRoYW4gMTBeOSwgd2l0aCAnbSc9IGYgLyAoMTBeJ2UnKS4uLgorICoJVGhlIHBvd2VyIG9mIDEwIGlzIGluICdlJywgdGhlIHJlc3VsdCBvZiB0aGUgZGl2aXNpb24gaXMgaW4gJ20nLgorICovCitzdHJ1Y3QJaXdfZnJlcQoreworCV9fczMyCQltOwkJLyogTWFudGlzc2EgKi8KKwlfX3MxNgkJZTsJCS8qIEV4cG9uZW50ICovCisJX191OAkJaTsJCS8qIExpc3QgaW5kZXggKHdoZW4gaW4gcmFuZ2Ugc3RydWN0KSAqLworCV9fdTgJCWZsYWdzOwkJLyogRmxhZ3MgKGZpeGVkL2F1dG8pICovCit9OworCisvKgorICoJUXVhbGl0eSBvZiB0aGUgbGluaworICovCitzdHJ1Y3QJaXdfcXVhbGl0eQoreworCV9fdTgJCXF1YWw7CQkvKiBsaW5rIHF1YWxpdHkgKCVyZXRyaWVzLCBTTlIsCisJCQkJCSAgICVtaXNzZWQgYmVhY29ucyBvciBiZXR0ZXIuLi4pICovCisJX191OAkJbGV2ZWw7CQkvKiBzaWduYWwgbGV2ZWwgKGRCbSkgKi8KKwlfX3U4CQlub2lzZTsJCS8qIG5vaXNlIGxldmVsIChkQm0pICovCisJX191OAkJdXBkYXRlZDsJLyogRmxhZ3MgdG8ga25vdyBpZiB1cGRhdGVkICovCit9OworCisvKgorICoJUGFja2V0IGRpc2NhcmRlZCBpbiB0aGUgd2lyZWxlc3MgYWRhcHRlciBkdWUgdG8KKyAqCSJ3aXJlbGVzcyIgc3BlY2lmaWMgcHJvYmxlbXMuLi4KKyAqCU5vdGUgOiB0aGUgbGlzdCBvZiBjb3VudGVyIGFuZCBzdGF0aXN0aWNzIGluIG5ldF9kZXZpY2Vfc3RhdHMKKyAqCWlzIGFscmVhZHkgcHJldHR5IGV4aGF1c3RpdmUsIGFuZCB5b3Ugc2hvdWxkIHVzZSB0aGF0IGZpcnN0LgorICoJVGhpcyBpcyBvbmx5IGFkZGl0aW9uYWwgc3RhdHMuLi4KKyAqLworc3RydWN0CWl3X2Rpc2NhcmRlZAoreworCV9fdTMyCQlud2lkOwkJLyogUnggOiBXcm9uZyBud2lkL2Vzc2lkICovCisJX191MzIJCWNvZGU7CQkvKiBSeCA6IFVuYWJsZSB0byBjb2RlL2RlY29kZSAoV0VQKSAqLworCV9fdTMyCQlmcmFnbWVudDsJLyogUnggOiBDYW4ndCBwZXJmb3JtIE1BQyByZWFzc2VtYmx5ICovCisJX191MzIJCXJldHJpZXM7CS8qIFR4IDogTWF4IE1BQyByZXRyaWVzIG51bSByZWFjaGVkICovCisJX191MzIJCW1pc2M7CQkvKiBPdGhlcnMgY2FzZXMgKi8KK307CisKKy8qCisgKglQYWNrZXQvVGltZSBwZXJpb2QgbWlzc2VkIGluIHRoZSB3aXJlbGVzcyBhZGFwdGVyIGR1ZSB0bworICoJIndpcmVsZXNzIiBzcGVjaWZpYyBwcm9ibGVtcy4uLgorICovCitzdHJ1Y3QJaXdfbWlzc2VkCit7CisJX191MzIJCWJlYWNvbjsJCS8qIE1pc3NlZCBiZWFjb25zL3N1cGVyZnJhbWUgKi8KK307CisKKy8qCisgKglRdWFsaXR5IHJhbmdlIChmb3Igc3B5IHRocmVzaG9sZCkKKyAqLworc3RydWN0CWl3X3RocnNweQoreworCXN0cnVjdCBzb2NrYWRkcgkJYWRkcjsJCS8qIFNvdXJjZSBhZGRyZXNzIChody9tYWMpICovCisJc3RydWN0IGl3X3F1YWxpdHkJcXVhbDsJCS8qIFF1YWxpdHkgb2YgdGhlIGxpbmsgKi8KKwlzdHJ1Y3QgaXdfcXVhbGl0eQlsb3c7CQkvKiBMb3cgdGhyZXNob2xkICovCisJc3RydWN0IGl3X3F1YWxpdHkJaGlnaDsJCS8qIEhpZ2ggdGhyZXNob2xkICovCit9OworCisvKgorICoJT3B0aW9uYWwgZGF0YSBmb3Igc2NhbiByZXF1ZXN0CisgKgorICoJTm90ZTogdGhlc2Ugb3B0aW9uYWwgcGFyYW1ldGVycyBhcmUgY29udHJvbGxpbmcgcGFyYW1ldGVycyBmb3IgdGhlCisgKglzY2FubmluZyBiZWhhdmlvciwgdGhlc2UgZG8gbm90IGFwcGx5IHRvIGdldHRpbmcgc2NhbiByZXN1bHRzCisgKgkoU0lPQ0dJV1NDQU4pLiBEcml2ZXJzIGFyZSBleHBlY3RlZCB0byBrZWVwIGEgbG9jYWwgQlNTIHRhYmxlIGFuZAorICoJcHJvdmlkZSBhIG1lcmdlZCByZXN1bHRzIHdpdGggYWxsIEJTU2VzIGV2ZW4gaWYgdGhlIHByZXZpb3VzIHNjYW4KKyAqCXJlcXVlc3QgbGltaXRlZCBzY2FubmluZyB0byBhIHN1YnNldCwgZS5nLiwgYnkgc3BlY2lmeWluZyBhbiBTU0lELgorICoJRXNwZWNpYWxseSwgc2NhbiByZXN1bHRzIGFyZSByZXF1aXJlZCB0byBpbmNsdWRlIGFuIGVudHJ5IGZvciB0aGUKKyAqCWN1cnJlbnQgQlNTIGlmIHRoZSBkcml2ZXIgaXMgaW4gTWFuYWdlZCBtb2RlIGFuZCBhc3NvY2lhdGVkIHdpdGggYW4gQVAuCisgKi8KK3N0cnVjdAlpd19zY2FuX3JlcQoreworCV9fdTgJCXNjYW5fdHlwZTsgLyogSVdfU0NBTl9UWVBFX3tBQ1RJVkUsUEFTU0lWRX0gKi8KKwlfX3U4CQllc3NpZF9sZW47CisJX191OAkJbnVtX2NoYW5uZWxzOyAvKiBudW0gZW50cmllcyBpbiBjaGFubmVsX2xpc3Q7CisJCQkJICAgICAgICogMCA9IHNjYW4gYWxsIGFsbG93ZWQgY2hhbm5lbHMgKi8KKwlfX3U4CQlmbGFnczsgLyogcmVzZXJ2ZWQgYXMgcGFkZGluZzsgdXNlIHplcm8sIHRoaXMgbWF5CisJCQkJKiBiZSB1c2VkIGluIHRoZSBmdXR1cmUgZm9yIGFkZGluZyBmbGFncworCQkJCSogdG8gcmVxdWVzdCBkaWZmZXJlbnQgc2NhbiBiZWhhdmlvciAqLworCXN0cnVjdCBzb2NrYWRkcglic3NpZDsgLyogZmY6ZmY6ZmY6ZmY6ZmY6ZmYgZm9yIGJyb2FkY2FzdCBCU1NJRCBvcgorCQkJCSogaW5kaXZpZHVhbCBhZGRyZXNzIG9mIGEgc3BlY2lmaWMgQlNTICovCisKKwkvKgorCSAqIFVzZSB0aGlzIEVTU0lEIGlmIElXX1NDQU5fVEhJU19FU1NJRCBmbGFnIGlzIHVzZWQgaW5zdGVhZCBvZiB1c2luZworCSAqIHRoZSBjdXJyZW50IEVTU0lELiBUaGlzIGFsbG93cyBzY2FuIHJlcXVlc3RzIGZvciBzcGVjaWZpYyBFU1NJRAorCSAqIHdpdGhvdXQgaGF2aW5nIHRvIGNoYW5nZSB0aGUgY3VycmVudCBFU1NJRCBhbmQgcG90ZW50aWFsbHkgYnJlYWtpbmcKKwkgKiB0aGUgY3VycmVudCBhc3NvY2lhdGlvbi4KKwkgKi8KKwlfX3U4CQllc3NpZFtJV19FU1NJRF9NQVhfU0laRV07CisKKwkvKgorCSAqIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGNoYW5naW5nIHRoZSBkZWZhdWx0IHNjYW5uaW5nIGJlaGF2aW9yLgorCSAqIFRoZXNlIGFyZSBiYXNlZCBvbiB0aGUgTUxNRS1TQ0FOLnJlcXVlc3QgZnJvbSBJRUVFIFN0ZCA4MDIuMTEuCisJICogVFUgaXMgMS4wMjQgbXMuIElmIHRoZXNlIGFyZSBzZXQgdG8gMCwgZHJpdmVyIGlzIGV4cGVjdGVkIHRvIHVzZQorCSAqIHJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZXMuIG1pbl9jaGFubmVsX3RpbWUgZGVmaW5lcyB0aGUgdGltZSB0aGF0CisJICogd2lsbCBiZSB1c2VkIHRvIHdhaXQgZm9yIHRoZSBmaXJzdCByZXBseSBvbiBlYWNoIGNoYW5uZWwuIElmIG5vCisJICogcmVwbGllcyBhcmUgcmVjZWl2ZWQsIG5leHQgY2hhbm5lbCB3aWxsIGJlIHNjYW5uZWQgYWZ0ZXIgdGhpcy4gSWYKKwkgKiByZXBsaWVzIGFyZSByZWNlaXZlZCwgdG90YWwgdGltZSB3YWl0ZWQgb24gdGhlIGNoYW5uZWwgaXMgZGVmaW5lZCBieQorCSAqIG1heF9jaGFubmVsX3RpbWUuCisJICovCisJX191MzIJCW1pbl9jaGFubmVsX3RpbWU7IC8qIGluIFRVICovCisJX191MzIJCW1heF9jaGFubmVsX3RpbWU7IC8qIGluIFRVICovCisKKwlzdHJ1Y3QgaXdfZnJlcQljaGFubmVsX2xpc3RbSVdfTUFYX0ZSRVFVRU5DSUVTXTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV1BBIFNVUFBPUlQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICoJRXh0ZW5kZWQgZGF0YSBzdHJ1Y3R1cmUgZm9yIGdldC9zZXQgZW5jb2RpbmcgKHRoaXMgaXMgdXNlZCB3aXRoCisgKglTSU9DU0lXRU5DT0RFRVhUL1NJT0NHSVdFTkNPREVFWFQuIHN0cnVjdCBpd19wb2ludCBhbmQgSVdfRU5DT0RFXyoKKyAqCWZsYWdzIGFyZSB1c2VkIGluIHRoZSBzYW1lIHdheSBhcyB3aXRoIFNJT0NTSVdFTkNPREUvU0lPQ0dJV0VOQ09ERSBhbmQKKyAqCW9ubHkgdGhlIGRhdGEgY29udGVudHMgY2hhbmdlcyAoa2V5IGRhdGEgLT4gdGhpcyBzdHJ1Y3R1cmUsIGluY2x1ZGluZworICoJa2V5IGRhdGEpLgorICoKKyAqCUlmIHRoZSBuZXcga2V5IGlzIHRoZSBmaXJzdCBncm91cCBrZXksIGl0IHdpbGwgYmUgc2V0IGFzIHRoZSBkZWZhdWx0CisgKglUWCBrZXkuIE90aGVyd2lzZSwgZGVmYXVsdCBUWCBrZXkgaW5kZXggaXMgb25seSBjaGFuZ2VkIGlmCisgKglJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkgZmxhZyBpcyBzZXQuCisgKgorICoJS2V5IHdpbGwgYmUgY2hhbmdlZCB3aXRoIFNJT0NTSVdFTkNPREVFWFQgaW4gYWxsIGNhc2VzIGV4Y2VwdCBmb3IKKyAqCXNwZWNpYWwgImNoYW5nZSBUWCBrZXkgaW5kZXgiIG9wZXJhdGlvbiB3aGljaCBpcyBpbmRpY2F0ZWQgYnkgc2V0dGluZworICoJa2V5X2xlbiA9IDAgYW5kIGV4dF9mbGFncyB8PSBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkuCisgKgorICoJdHhfc2VxL3J4X3NlcSBhcmUgb25seSB1c2VkIHdoZW4gcmVzcGVjdGl2ZQorICoJSVdfRU5DT0RFX0VYVF97VFgsUlh9X1NFUV9WQUxJRCBmbGFnIGlzIHNldCBpbiBleHRfZmxhZ3MuIE5vcm1hbAorICoJVEtJUC9DQ01QIG9wZXJhdGlvbiBpcyB0byBzZXQgUlggc2VxIHdpdGggU0lPQ1NJV0VOQ09ERUVYVCBhbmQgc3RhcnQKKyAqCVRYIHNlcSBmcm9tIHplcm8gd2hlbmV2ZXIga2V5IGlzIGNoYW5nZWQuIFNJT0NHSVdFTkNPREVFWFQgaXMgbm9ybWFsbHkKKyAqCXVzZWQgb25seSBieSBhbiBBdXRoZW50aWNhdG9yIChBUCBvciBhbiBJQlNTIHN0YXRpb24pIHRvIGdldCB0aGUKKyAqCWN1cnJlbnQgVFggc2VxdWVuY2UgbnVtYmVyLiBVc2luZyBUWF9TRVFfVkFMSUQgZm9yIFNJT0NTSVdFTkNPREVFWFQgYW5kCisgKglSWF9TRVFfVkFMSUQgZm9yIFNJT0NHSVdFTkNPREVFWFQgYXJlIG9wdGlvbmFsLCBidXQgY2FuIGJlIHVzZWZ1bCBmb3IKKyAqCWRlYnVnZ2luZy90ZXN0aW5nLgorICovCitzdHJ1Y3QJaXdfZW5jb2RlX2V4dAoreworCV9fdTMyCQlleHRfZmxhZ3M7IC8qIElXX0VOQ09ERV9FWFRfKiAqLworCV9fdTgJCXR4X3NlcVtJV19FTkNPREVfU0VRX01BWF9TSVpFXTsgLyogTFNCIGZpcnN0ICovCisJX191OAkJcnhfc2VxW0lXX0VOQ09ERV9TRVFfTUFYX1NJWkVdOyAvKiBMU0IgZmlyc3QgKi8KKwlzdHJ1Y3Qgc29ja2FkZHIJYWRkcjsgLyogZmY6ZmY6ZmY6ZmY6ZmY6ZmYgZm9yIGJyb2FkY2FzdC9tdWx0aWNhc3QKKwkJCSAgICAgICAqIChncm91cCkga2V5cyBvciB1bmljYXN0IGFkZHJlc3MgZm9yCisJCQkgICAgICAgKiBpbmRpdmlkdWFsIGtleXMgKi8KKwlfX3UxNgkJYWxnOyAvKiBJV19FTkNPREVfQUxHXyogKi8KKwlfX3UxNgkJa2V5X2xlbjsKKwlfX3U4CQlrZXlbMF07Cit9OworCisvKiBTSU9DU0lXTUxNRSBkYXRhICovCitzdHJ1Y3QJaXdfbWxtZQoreworCV9fdTE2CQljbWQ7IC8qIElXX01MTUVfKiAqLworCV9fdTE2CQlyZWFzb25fY29kZTsKKwlzdHJ1Y3Qgc29ja2FkZHIJYWRkcjsKK307CisKKy8qIFNJT0NTSVdQTUtTQSBkYXRhICovCisjZGVmaW5lIElXX1BNS1NBX0FERAkJMQorI2RlZmluZSBJV19QTUtTQV9SRU1PVkUJCTIKKyNkZWZpbmUgSVdfUE1LU0FfRkxVU0gJCTMKKworI2RlZmluZSBJV19QTUtJRF9MRU4JMTYKKworc3RydWN0CWl3X3Bta3NhCit7CisJX191MzIJCWNtZDsgLyogSVdfUE1LU0FfKiAqLworCXN0cnVjdCBzb2NrYWRkcglic3NpZDsKKwlfX3U4CQlwbWtpZFtJV19QTUtJRF9MRU5dOworfTsKKworLyogSVdFVk1JQ0hBRUxNSUNGQUlMVVJFIGRhdGEgKi8KK3N0cnVjdAlpd19taWNoYWVsbWljZmFpbHVyZQoreworCV9fdTMyCQlmbGFnczsKKwlzdHJ1Y3Qgc29ja2FkZHIJc3JjX2FkZHI7CisJX191OAkJdHNjW0lXX0VOQ09ERV9TRVFfTUFYX1NJWkVdOyAvKiBMU0IgZmlyc3QgKi8KK307CisKKy8qIElXRVZQTUtJRENBTkQgZGF0YSAqLworI2RlZmluZSBJV19QTUtJRF9DQU5EX1BSRUFVVEgJMHgwMDAwMDAwMSAvKiBSTlMgcHJlLWF1dGhlbnRpY2F0aW9uIGVuYWJsZWQgKi8KK3N0cnVjdAlpd19wbWtpZF9jYW5kCit7CisJX191MzIJCWZsYWdzOyAvKiBJV19QTUtJRF9DQU5EXyogKi8KKwlfX3UzMgkJaW5kZXg7IC8qIHRoZSBzbWFsbGVyIHRoZSBpbmRleCwgdGhlIGhpZ2hlciB0aGUKKwkJCQkqIHByaW9yaXR5ICovCisJc3RydWN0IHNvY2thZGRyCWJzc2lkOworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdJUkVMRVNTIFNUQVRTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFdpcmVsZXNzIHN0YXRpc3RpY3MgKHVzZWQgZm9yIC9wcm9jL25ldC93aXJlbGVzcykKKyAqLworc3RydWN0CWl3X3N0YXRpc3RpY3MKK3sKKwlfX3UxNgkJc3RhdHVzOwkJLyogU3RhdHVzCisJCQkJCSAqIC0gZGV2aWNlIGRlcGVuZGVudCBmb3Igbm93ICovCisKKwlzdHJ1Y3QgaXdfcXVhbGl0eQlxdWFsOwkJLyogUXVhbGl0eSBvZiB0aGUgbGluaworCQkJCQkJICogKGluc3RhbnQvbWVhbi9tYXgpICovCisJc3RydWN0IGl3X2Rpc2NhcmRlZAlkaXNjYXJkOwkvKiBQYWNrZXQgZGlzY2FyZGVkIGNvdW50cyAqLworCXN0cnVjdCBpd19taXNzZWQJbWlzczsJCS8qIFBhY2tldCBtaXNzZWQgY291bnRzICovCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSU9DVEwgUkVRVUVTVCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBwYXlsb2FkIG9mIGFuIGlvY3RsLCBhbmQgaXMgdXNlZCAKKyAqIGJlbG93LgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIHN0cnVjdHVyZSBzaG91bGQgZml0IG9uIHRoZSBtZW1vcnkgZm9vdHByaW50CisgKiBvZiBpd3JlcSAod2hpY2ggaXMgdGhlIHNhbWUgYXMgaWZyZXEpLCB3aGljaCBtZWFuIGEgbWF4IHNpemUgb2YKKyAqIDE2IG9jdGV0cyA9IDEyOCBiaXRzLiBXYXJuaW5nLCBwb2ludGVycyBtaWdodCBiZSA2NCBiaXRzIHdpZGUuLi4KKyAqIFlvdSBzaG91bGQgY2hlY2sgdGhpcyB3aGVuIGluY3JlYXNpbmcgdGhlIHN0cnVjdHVyZXMgZGVmaW5lZAorICogYWJvdmUgaW4gdGhpcyBmaWxlLi4uCisgKi8KK3VuaW9uCWl3cmVxX2RhdGEKK3sKKwkvKiBDb25maWcgLSBnZW5lcmljICovCisJY2hhcgkJbmFtZVtJRk5BTVNJWl07CisJLyogTmFtZSA6IHVzZWQgdG8gdmVyaWZ5IHRoZSBwcmVzZW5jZSBvZiAgd2lyZWxlc3MgZXh0ZW5zaW9ucy4KKwkgKiBOYW1lIG9mIHRoZSBwcm90b2NvbC9wcm92aWRlci4uLiAqLworCisJc3RydWN0IGl3X3BvaW50CWVzc2lkOwkJLyogRXh0ZW5kZWQgbmV0d29yayBuYW1lICovCisJc3RydWN0IGl3X3BhcmFtCW53aWQ7CQkvKiBuZXR3b3JrIGlkIChvciBkb21haW4gLSB0aGUgY2VsbCkgKi8KKwlzdHJ1Y3QgaXdfZnJlcQlmcmVxOwkJLyogZnJlcXVlbmN5IG9yIGNoYW5uZWwgOgorCQkJCQkgKiAwLTEwMDAgPSBjaGFubmVsCisJCQkJCSAqID4gMTAwMCA9IGZyZXF1ZW5jeSBpbiBIeiAqLworCisJc3RydWN0IGl3X3BhcmFtCXNlbnM7CQkvKiBzaWduYWwgbGV2ZWwgdGhyZXNob2xkICovCisJc3RydWN0IGl3X3BhcmFtCWJpdHJhdGU7CS8qIGRlZmF1bHQgYml0IHJhdGUgKi8KKwlzdHJ1Y3QgaXdfcGFyYW0JdHhwb3dlcjsJLyogZGVmYXVsdCB0cmFuc21pdCBwb3dlciAqLworCXN0cnVjdCBpd19wYXJhbQlydHM7CQkvKiBSVFMgdGhyZXNob2xkIHRocmVzaG9sZCAqLworCXN0cnVjdCBpd19wYXJhbQlmcmFnOwkJLyogRnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgKi8KKwlfX3UzMgkJbW9kZTsJCS8qIE9wZXJhdGlvbiBtb2RlICovCisJc3RydWN0IGl3X3BhcmFtCXJldHJ5OwkJLyogUmV0cnkgbGltaXRzICYgbGlmZXRpbWUgKi8KKworCXN0cnVjdCBpd19wb2ludAllbmNvZGluZzsJLyogRW5jb2Rpbmcgc3R1ZmYgOiB0b2tlbnMgKi8KKwlzdHJ1Y3QgaXdfcGFyYW0JcG93ZXI7CQkvKiBQTSBkdXJhdGlvbi90aW1lb3V0ICovCisJc3RydWN0IGl3X3F1YWxpdHkgcXVhbDsJCS8qIFF1YWxpdHkgcGFydCBvZiBzdGF0aXN0aWNzICovCisKKwlzdHJ1Y3Qgc29ja2FkZHIJYXBfYWRkcjsJLyogQWNjZXNzIHBvaW50IGFkZHJlc3MgKi8KKwlzdHJ1Y3Qgc29ja2FkZHIJYWRkcjsJCS8qIERlc3RpbmF0aW9uIGFkZHJlc3MgKGh3L21hYykgKi8KKworCXN0cnVjdCBpd19wYXJhbQlwYXJhbTsJCS8qIE90aGVyIHNtYWxsIHBhcmFtZXRlcnMgKi8KKwlzdHJ1Y3QgaXdfcG9pbnQJZGF0YTsJCS8qIE90aGVyIGxhcmdlIHBhcmFtZXRlcnMgKi8KK307CisKKy8qCisgKiBUaGUgc3RydWN0dXJlIHRvIGV4Y2hhbmdlIGRhdGEgZm9yIGlvY3RsLgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIHNhbWUgYXMgJ3N0cnVjdCBpZnJlcScsIGJ1dCAocmUpZGVmaW5lZCBmb3IKKyAqIGNvbnZlbmllbmNlLi4uCisgKiBEbyBJIG5lZWQgdG8gcmVtaW5kIHlvdSBhYm91dCBzdHJ1Y3R1cmUgc2l6ZSAoMzIgb2N0ZXRzKSA/CisgKi8KK3N0cnVjdAlpd3JlcSAKK3sKKwl1bmlvbgorCXsKKwkJY2hhcglpZnJuX25hbWVbSUZOQU1TSVpdOwkvKiBpZiBuYW1lLCBlLmcuICJldGgwIiAqLworCX0gaWZyX2lmcm47CisKKwkvKiBEYXRhIHBhcnQgKGRlZmluZWQganVzdCBhYm92ZSkgKi8KKwl1bmlvbglpd3JlcV9kYXRhCXU7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJT0NUTCBEQVRBIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICoJRm9yIHRob3NlIGlvY3RsIHdoaWNoIHdhbnQgdG8gZXhjaGFuZ2UgbW9kZSBkYXRhIHRoYXQgd2hhdCBjb3VsZAorICoJZml0IGluIHRoZSBhYm92ZSBzdHJ1Y3R1cmUuLi4KKyAqLworCisvKgorICoJUmFuZ2Ugb2YgcGFyYW1ldGVycworICovCisKK3N0cnVjdAlpd19yYW5nZQoreworCS8qIEluZm9ybWF0aXZlIHN0dWZmICh0byBjaG9vc2UgYmV0d2VlbiBkaWZmZXJlbnQgaW50ZXJmYWNlKSAqLworCV9fdTMyCQl0aHJvdWdocHV0OwkvKiBUbyBnaXZlIGFuIGlkZWEuLi4gKi8KKwkvKiBJbiB0aGVvcnkgdGhpcyB2YWx1ZSBzaG91bGQgYmUgdGhlIG1heGltdW0gYmVuY2htYXJrZWQKKwkgKiBUQ1AvSVAgdGhyb3VnaHB1dCwgYmVjYXVzZSB3aXRoIG1vc3Qgb2YgdGhlc2UgZGV2aWNlcyB0aGUKKwkgKiBiaXQgcmF0ZSBpcyBtZWFuaW5nbGVzcyAob3ZlcmhlYWQgYW4gY28pIHRvIGVzdGltYXRlIGhvdworCSAqIGZhc3QgdGhlIGNvbm5lY3Rpb24gd2lsbCBnbyBhbmQgcGljayB0aGUgZmFzdGVzdCBvbmUuCisJICogSSBzdWdnZXN0IHBlb3BsZSB0byBwbGF5IHdpdGggTmV0cGVyZiBvciBhbnkgYmVuY2htYXJrLi4uCisJICovCisKKwkvKiBOV0lEIChvciBkb21haW4gaWQpICovCisJX191MzIJCW1pbl9ud2lkOwkvKiBNaW5pbWFsIE5XSUQgd2UgYXJlIGFibGUgdG8gc2V0ICovCisJX191MzIJCW1heF9ud2lkOwkvKiBNYXhpbWFsIE5XSUQgd2UgYXJlIGFibGUgdG8gc2V0ICovCisKKwkvKiBPbGQgRnJlcXVlbmN5IChiYWNrd2FyZCBjb21wYXQgLSBtb3ZlZCBsb3dlciApICovCisJX191MTYJCW9sZF9udW1fY2hhbm5lbHM7CisJX191OAkJb2xkX251bV9mcmVxdWVuY3k7CisKKwkvKiBTY2FuIGNhcGFiaWxpdGllcyAqLworCV9fdTgJCXNjYW5fY2FwYTsgCS8qIElXX1NDQU5fQ0FQQV8qIGJpdCBmaWVsZCAqLworCisJLyogV2lyZWxlc3MgZXZlbnQgY2FwYWJpbGl0eSBiaXRtYXNrcyAqLworCV9fdTMyCQlldmVudF9jYXBhWzZdOworCisJLyogc2lnbmFsIGxldmVsIHRocmVzaG9sZCByYW5nZSAqLworCV9fczMyCQlzZW5zaXRpdml0eTsKKworCS8qIFF1YWxpdHkgb2YgbGluayAmIFNOUiBzdHVmZiAqLworCS8qIFF1YWxpdHkgcmFuZ2UgKGxpbmssIGxldmVsLCBub2lzZSkKKwkgKiBJZiB0aGUgcXVhbGl0eSBpcyBhYnNvbHV0ZSwgaXQgd2lsbCBiZSBpbiB0aGUgcmFuZ2UgWzAgOyBtYXhfcXVhbF0sCisJICogaWYgdGhlIHF1YWxpdHkgaXMgZEJtLCBpdCB3aWxsIGJlIGluIHRoZSByYW5nZSBbbWF4X3F1YWwgOyAwXS4KKwkgKiBEb24ndCBmb3JnZXQgdGhhdCB3ZSB1c2UgOCBiaXQgYXJpdGhtZXRpY3MuLi4gKi8KKwlzdHJ1Y3QgaXdfcXVhbGl0eQltYXhfcXVhbDsJLyogUXVhbGl0eSBvZiB0aGUgbGluayAqLworCS8qIFRoaXMgc2hvdWxkIGNvbnRhaW4gdGhlIGF2ZXJhZ2UvdHlwaWNhbCB2YWx1ZXMgb2YgdGhlIHF1YWxpdHkKKwkgKiBpbmRpY2F0b3IuIFRoaXMgc2hvdWxkIGJlIHRoZSB0aHJlc2hvbGQgYmV0d2VlbiBhICJnb29kIiBhbmQKKwkgKiBhICJiYWQiIGxpbmsgKGV4YW1wbGUgOiBtb25pdG9yIGdvaW5nIGZyb20gZ3JlZW4gdG8gb3JhbmdlKS4KKwkgKiBDdXJyZW50bHksIHVzZXIgc3BhY2UgYXBwcyBsaWtlIHF1YWxpdHkgbW9uaXRvcnMgZG9uJ3QgaGF2ZSBhbnkKKwkgKiB3YXkgdG8gY2FsaWJyYXRlIHRoZSBtZWFzdXJlbWVudC4gV2l0aCB0aGlzLCB0aGV5IGNhbiBzcGxpdAorCSAqIHRoZSByYW5nZSBiZXR3ZWVuIDAgYW5kIG1heF9xdWFsIGluIGRpZmZlcmVudCBxdWFsaXR5IGxldmVsCisJICogKHVzaW5nIGEgZ2VvbWV0cmljIHN1YmRpdmlzaW9uIGNlbnRlcmVkIG9uIHRoZSBhdmVyYWdlKS4KKwkgKiBJIGV4cGVjdCB0aGF0IHBlb3BsZSBkb2luZyB0aGUgdXNlciBzcGFjZSBhcHBzIHdpbGwgZmVlZGJhY2sKKwkgKiB1cyBvbiB3aGljaCB2YWx1ZSB3ZSBuZWVkIHRvIHB1dCBpbiBlYWNoIGRyaXZlci4uLiAqLworCXN0cnVjdCBpd19xdWFsaXR5CWF2Z19xdWFsOwkvKiBRdWFsaXR5IG9mIHRoZSBsaW5rICovCisKKwkvKiBSYXRlcyAqLworCV9fdTgJCW51bV9iaXRyYXRlczsJLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGxpc3QgKi8KKwlfX3MzMgkJYml0cmF0ZVtJV19NQVhfQklUUkFURVNdOwkvKiBsaXN0LCBpbiBicHMgKi8KKworCS8qIFJUUyB0aHJlc2hvbGQgKi8KKwlfX3MzMgkJbWluX3J0czsJLyogTWluaW1hbCBSVFMgdGhyZXNob2xkICovCisJX19zMzIJCW1heF9ydHM7CS8qIE1heGltYWwgUlRTIHRocmVzaG9sZCAqLworCisJLyogRnJhZyB0aHJlc2hvbGQgKi8KKwlfX3MzMgkJbWluX2ZyYWc7CS8qIE1pbmltYWwgZnJhZyB0aHJlc2hvbGQgKi8KKwlfX3MzMgkJbWF4X2ZyYWc7CS8qIE1heGltYWwgZnJhZyB0aHJlc2hvbGQgKi8KKworCS8qIFBvd2VyIE1hbmFnZW1lbnQgZHVyYXRpb24gJiB0aW1lb3V0ICovCisJX19zMzIJCW1pbl9wbXA7CS8qIE1pbmltYWwgUE0gcGVyaW9kICovCisJX19zMzIJCW1heF9wbXA7CS8qIE1heGltYWwgUE0gcGVyaW9kICovCisJX19zMzIJCW1pbl9wbXQ7CS8qIE1pbmltYWwgUE0gdGltZW91dCAqLworCV9fczMyCQltYXhfcG10OwkvKiBNYXhpbWFsIFBNIHRpbWVvdXQgKi8KKwlfX3UxNgkJcG1wX2ZsYWdzOwkvKiBIb3cgdG8gZGVjb2RlIG1heC9taW4gUE0gcGVyaW9kICovCisJX191MTYJCXBtdF9mbGFnczsJLyogSG93IHRvIGRlY29kZSBtYXgvbWluIFBNIHRpbWVvdXQgKi8KKwlfX3UxNgkJcG1fY2FwYTsJLyogV2hhdCBQTSBvcHRpb25zIGFyZSBzdXBwb3J0ZWQgKi8KKworCS8qIEVuY29kZXIgc3R1ZmYgKi8KKwlfX3UxNgllbmNvZGluZ19zaXplW0lXX01BWF9FTkNPRElOR19TSVpFU107CS8qIERpZmZlcmVudCB0b2tlbiBzaXplcyAqLworCV9fdTgJbnVtX2VuY29kaW5nX3NpemVzOwkvKiBOdW1iZXIgb2YgZW50cnkgaW4gdGhlIGxpc3QgKi8KKwlfX3U4CW1heF9lbmNvZGluZ190b2tlbnM7CS8qIE1heCBudW1iZXIgb2YgdG9rZW5zICovCisJLyogRm9yIGRyaXZlcnMgdGhhdCBuZWVkIGEgImxvZ2luL3Bhc3N3ZCIgZm9ybSAqLworCV9fdTgJZW5jb2RpbmdfbG9naW5faW5kZXg7CS8qIHRva2VuIGluZGV4IGZvciBsb2dpbiB0b2tlbiAqLworCisJLyogVHJhbnNtaXQgcG93ZXIgKi8KKwlfX3UxNgkJdHhwb3dlcl9jYXBhOwkvKiBXaGF0IG9wdGlvbnMgYXJlIHN1cHBvcnRlZCAqLworCV9fdTgJCW51bV90eHBvd2VyOwkvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbGlzdCAqLworCV9fczMyCQl0eHBvd2VyW0lXX01BWF9UWFBPV0VSXTsJLyogbGlzdCwgaW4gYnBzICovCisKKwkvKiBXaXJlbGVzcyBFeHRlbnNpb24gdmVyc2lvbiBpbmZvICovCisJX191OAkJd2VfdmVyc2lvbl9jb21waWxlZDsJLyogTXVzdCBiZSBXSVJFTEVTU19FWFQgKi8KKwlfX3U4CQl3ZV92ZXJzaW9uX3NvdXJjZTsJLyogTGFzdCB1cGRhdGUgb2Ygc291cmNlICovCisKKwkvKiBSZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lICovCisJX191MTYJCXJldHJ5X2NhcGE7CS8qIFdoYXQgcmV0cnkgb3B0aW9ucyBhcmUgc3VwcG9ydGVkICovCisJX191MTYJCXJldHJ5X2ZsYWdzOwkvKiBIb3cgdG8gZGVjb2RlIG1heC9taW4gcmV0cnkgbGltaXQgKi8KKwlfX3UxNgkJcl90aW1lX2ZsYWdzOwkvKiBIb3cgdG8gZGVjb2RlIG1heC9taW4gcmV0cnkgbGlmZSAqLworCV9fczMyCQltaW5fcmV0cnk7CS8qIE1pbmltYWwgbnVtYmVyIG9mIHJldHJpZXMgKi8KKwlfX3MzMgkJbWF4X3JldHJ5OwkvKiBNYXhpbWFsIG51bWJlciBvZiByZXRyaWVzICovCisJX19zMzIJCW1pbl9yX3RpbWU7CS8qIE1pbmltYWwgcmV0cnkgbGlmZXRpbWUgKi8KKwlfX3MzMgkJbWF4X3JfdGltZTsJLyogTWF4aW1hbCByZXRyeSBsaWZldGltZSAqLworCisJLyogRnJlcXVlbmN5ICovCisJX191MTYJCW51bV9jaGFubmVsczsJLyogTnVtYmVyIG9mIGNoYW5uZWxzIFswOyBudW0gLSAxXSAqLworCV9fdTgJCW51bV9mcmVxdWVuY3k7CS8qIE51bWJlciBvZiBlbnRyeSBpbiB0aGUgbGlzdCAqLworCXN0cnVjdCBpd19mcmVxCWZyZXFbSVdfTUFYX0ZSRVFVRU5DSUVTXTsJLyogbGlzdCAqLworCS8qIE5vdGUgOiB0aGlzIGZyZXF1ZW5jeSBsaXN0IGRvZXNuJ3QgbmVlZCB0byBmaXQgY2hhbm5lbCBudW1iZXJzLAorCSAqIGJlY2F1c2UgZWFjaCBlbnRyeSBjb250YWluIGl0cyBjaGFubmVsIGluZGV4ICovCisKKwlfX3UzMgkJZW5jX2NhcGE7CS8qIElXX0VOQ19DQVBBXyogYml0IGZpZWxkICovCit9OworCisvKgorICogUHJpdmF0ZSBpb2N0bCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqLworIAorc3RydWN0CWl3X3ByaXZfYXJncworeworCV9fdTMyCQljbWQ7CQkvKiBOdW1iZXIgb2YgdGhlIGlvY3RsIHRvIGlzc3VlICovCisJX191MTYJCXNldF9hcmdzOwkvKiBUeXBlIGFuZCBudW1iZXIgb2YgYXJncyAqLworCV9fdTE2CQlnZXRfYXJnczsJLyogVHlwZSBhbmQgbnVtYmVyIG9mIGFyZ3MgKi8KKwljaGFyCQluYW1lW0lGTkFNU0laXTsJLyogTmFtZSBvZiB0aGUgZXh0ZW5zaW9uICovCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXSVJFTEVTUyBFVkVOVFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBXaXJlbGVzcyBldmVudHMgYXJlIGNhcnJpZWQgdGhyb3VnaCB0aGUgcnRuZXRsaW5rIHNvY2tldCB0byB1c2VyCisgKiBzcGFjZS4gVGhleSBhcmUgZW5jYXBzdWxhdGVkIGluIHRoZSBJRkxBX1dJUkVMRVNTIGZpZWxkIG9mCisgKiBhIFJUTV9ORVdMSU5LIG1lc3NhZ2UuCisgKi8KKworLyoKKyAqIEEgV2lyZWxlc3MgRXZlbnQuIENvbnRhaW5zIGJhc2ljYWxseSB0aGUgc2FtZSBkYXRhIGFzIHRoZSBpb2N0bC4uLgorICovCitzdHJ1Y3QgaXdfZXZlbnQKK3sKKwlfX3UxNgkJbGVuOwkJCS8qIFJlYWwgbGVuZ3RoIG9mIHRoaXMgc3R1ZmYgKi8KKwlfX3UxNgkJY21kOwkJCS8qIFdpcmVsZXNzIElPQ1RMICovCisJdW5pb24gaXdyZXFfZGF0YQl1OwkJLyogSU9DVEwgZml4ZWQgcGF5bG9hZCAqLworfTsKKworLyogU2l6ZSBvZiB0aGUgRXZlbnQgcHJlZml4IChpbmNsdWRpbmcgcGFkZGluZyBhbmQgYWxpZ25lbWVudCBqdW5rKSAqLworI2RlZmluZSBJV19FVl9MQ1BfTEVOCShzaXplb2Yoc3RydWN0IGl3X2V2ZW50KSAtIHNpemVvZih1bmlvbiBpd3JlcV9kYXRhKSkKKy8qIFNpemUgb2YgdGhlIHZhcmlvdXMgZXZlbnRzICovCisjZGVmaW5lIElXX0VWX0NIQVJfTEVOCShJV19FVl9MQ1BfTEVOICsgSUZOQU1TSVopCisjZGVmaW5lIElXX0VWX1VJTlRfTEVOCShJV19FVl9MQ1BfTEVOICsgc2l6ZW9mKF9fdTMyKSkKKyNkZWZpbmUgSVdfRVZfRlJFUV9MRU4JKElXX0VWX0xDUF9MRU4gKyBzaXplb2Yoc3RydWN0IGl3X2ZyZXEpKQorI2RlZmluZSBJV19FVl9QQVJBTV9MRU4JKElXX0VWX0xDUF9MRU4gKyBzaXplb2Yoc3RydWN0IGl3X3BhcmFtKSkKKyNkZWZpbmUgSVdfRVZfQUREUl9MRU4JKElXX0VWX0xDUF9MRU4gKyBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSkKKyNkZWZpbmUgSVdfRVZfUVVBTF9MRU4JKElXX0VWX0xDUF9MRU4gKyBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpKQorCisvKiBpd19wb2ludCBldmVudHMgYXJlIHNwZWNpYWwuIEZpcnN0LCB0aGUgcGF5bG9hZCAoZXh0cmEgZGF0YSkgY29tZSBhdAorICogdGhlIGVuZCBvZiB0aGUgZXZlbnQsIHNvIHRoZXkgYXJlIGJpZ2dlciB0aGFuIElXX0VWX1BPSU5UX0xFTi4gU2Vjb25kLAorICogd2Ugb21pdCB0aGUgcG9pbnRlciwgc28gc3RhcnQgYXQgYW4gb2Zmc2V0LiAqLworI2RlZmluZSBJV19FVl9QT0lOVF9PRkYgKCgoY2hhciAqKSAmKCgoc3RydWN0IGl3X3BvaW50ICopIE5VTEwpLT5sZW5ndGgpKSAtIFwKKwkJCSAgKGNoYXIgKikgTlVMTCkKKyNkZWZpbmUgSVdfRVZfUE9JTlRfTEVOCShJV19FVl9MQ1BfTEVOICsgc2l6ZW9mKHN0cnVjdCBpd19wb2ludCkgLSBcCisJCQkgSVdfRVZfUE9JTlRfT0ZGKQorCisKKy8qIFNpemUgb2YgdGhlIEV2ZW50IHByZWZpeCB3aGVuIHBhY2tlZCBpbiBzdHJlYW0gKi8KKyNkZWZpbmUgSVdfRVZfTENQX1BLX0xFTgkoNCkKKy8qIFNpemUgb2YgdGhlIHZhcmlvdXMgZXZlbnRzIHdoZW4gcGFja2VkIGluIHN0cmVhbSAqLworI2RlZmluZSBJV19FVl9DSEFSX1BLX0xFTgkoSVdfRVZfTENQX1BLX0xFTiArIElGTkFNU0laKQorI2RlZmluZSBJV19FVl9VSU5UX1BLX0xFTgkoSVdfRVZfTENQX1BLX0xFTiArIHNpemVvZihfX3UzMikpCisjZGVmaW5lIElXX0VWX0ZSRVFfUEtfTEVOCShJV19FVl9MQ1BfUEtfTEVOICsgc2l6ZW9mKHN0cnVjdCBpd19mcmVxKSkKKyNkZWZpbmUgSVdfRVZfUEFSQU1fUEtfTEVOCShJV19FVl9MQ1BfUEtfTEVOICsgc2l6ZW9mKHN0cnVjdCBpd19wYXJhbSkpCisjZGVmaW5lIElXX0VWX0FERFJfUEtfTEVOCShJV19FVl9MQ1BfUEtfTEVOICsgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpCisjZGVmaW5lIElXX0VWX1FVQUxfUEtfTEVOCShJV19FVl9MQ1BfUEtfTEVOICsgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSkKKyNkZWZpbmUgSVdfRVZfUE9JTlRfUEtfTEVOCShJV19FVl9MQ1BfUEtfTEVOICsgNCkKKworI2VuZGlmCS8qIF9MSU5VWF9XSVJFTEVTU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3gyNS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC94MjUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTBjY2U2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC94MjUuaApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIFRoZXNlIGFyZSB0aGUgcHVibGljIGVsZW1lbnRzIG9mIHRoZSBMaW51eCBrZXJuZWwgWC4yNSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiAJSGlzdG9yeQorICoJbWFyLzIwLzAwCURhbmllbGEgU3F1YXNzb25pIERpc2FibGluZy9lbmFibGluZyBvZiBmYWNpbGl0aWVzIAorICoJCQkJCSAgbmVnb3RpYXRpb24uCisgKglhcHIvMDIvMDUJU2hhdW4gUGVyZWlyYSBTZWxlY3RpdmUgc3ViIGFkZHJlc3MgbWF0Y2hpbmcgd2l0aAorICoJCQkJCWNhbGwgdXNlciBkYXRhCisgKi8KKworI2lmbmRlZglYMjVfS0VSTkVMX0gKKyNkZWZpbmUJWDI1X0tFUk5FTF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorCisjZGVmaW5lCVNJT0NYMjVHU1VCU0NSSVAJKFNJT0NQUk9UT1BSSVZBVEUgKyAwKQorI2RlZmluZQlTSU9DWDI1U1NVQlNDUklQCShTSU9DUFJPVE9QUklWQVRFICsgMSkKKyNkZWZpbmUJU0lPQ1gyNUdGQUNJTElUSUVTCShTSU9DUFJPVE9QUklWQVRFICsgMikKKyNkZWZpbmUJU0lPQ1gyNVNGQUNJTElUSUVTCShTSU9DUFJPVE9QUklWQVRFICsgMykKKyNkZWZpbmUJU0lPQ1gyNUdDQUxMVVNFUkRBVEEJKFNJT0NQUk9UT1BSSVZBVEUgKyA0KQorI2RlZmluZQlTSU9DWDI1U0NBTExVU0VSREFUQQkoU0lPQ1BST1RPUFJJVkFURSArIDUpCisjZGVmaW5lCVNJT0NYMjVHQ0FVU0VESUFHCShTSU9DUFJPVE9QUklWQVRFICsgNikKKyNkZWZpbmUgU0lPQ1gyNVNDVURNQVRDSExFTgkoU0lPQ1BST1RPUFJJVkFURSArIDcpCisjZGVmaW5lIFNJT0NYMjVDQUxMQUNDUFRBUFBSViAgIChTSU9DUFJPVE9QUklWQVRFICsgOCkKKyNkZWZpbmUgU0lPQ1gyNVNFTkRDQUxMQUNDUFQgICAgKFNJT0NQUk9UT1BSSVZBVEUgKyA5KQorI2RlZmluZSBTSU9DWDI1R0RURUZBQ0lMSVRJRVMgKFNJT0NQUk9UT1BSSVZBVEUgKyAxMCkKKyNkZWZpbmUgU0lPQ1gyNVNEVEVGQUNJTElUSUVTIChTSU9DUFJPVE9QUklWQVRFICsgMTEpCisjZGVmaW5lIFNJT0NYMjVTQ0FVU0VESUFHCShTSU9DUFJPVE9QUklWQVRFICsgMTIpCisKKy8qCisgKglWYWx1ZXMgZm9yIHtnZXQsc2V0fXNvY2tvcHQuCisgKi8KKyNkZWZpbmUJWDI1X1FCSVRJTkNMCQkxCisKKy8qCisgKglYLjI1IFBhY2tldCBTaXplIHZhbHVlcy4KKyAqLworI2RlZmluZQlYMjVfUFMxNgkJNAorI2RlZmluZQlYMjVfUFMzMgkJNQorI2RlZmluZQlYMjVfUFM2NAkJNgorI2RlZmluZQlYMjVfUFMxMjgJCTcKKyNkZWZpbmUJWDI1X1BTMjU2CQk4CisjZGVmaW5lCVgyNV9QUzUxMgkJOQorI2RlZmluZQlYMjVfUFMxMDI0CQkxMAorI2RlZmluZQlYMjVfUFMyMDQ4CQkxMQorI2RlZmluZQlYMjVfUFM0MDk2CQkxMgorCisvKgorICogQW4gWC4xMjEgYWRkcmVzcywgaXQgaXMgaGVsZCBhcyBBU0NJSSB0ZXh0LCBudWxsIHRlcm1pbmF0ZWQsIHVwIHRvIDE1CisgKiBkaWdpdHMgYW5kIGEgbnVsbCB0ZXJtaW5hdG9yLgorICovCitzdHJ1Y3QgeDI1X2FkZHJlc3MgeworCWNoYXIgeDI1X2FkZHJbMTZdOworfTsKKworLyoKKyAqCUxpbnV4IFguMjUgQWRkcmVzcyBzdHJ1Y3R1cmUsIHVzZWQgZm9yIGJpbmQsIGFuZCBjb25uZWN0IG1vc3RseS4KKyAqLworc3RydWN0IHNvY2thZGRyX3gyNSB7CisJX19rZXJuZWxfc2FfZmFtaWx5X3Qgc3gyNV9mYW1pbHk7CS8qIE11c3QgYmUgQUZfWDI1ICovCisJc3RydWN0IHgyNV9hZGRyZXNzIHN4MjVfYWRkcjsJCS8qIFguMTIxIEFkZHJlc3MgKi8KK307CisKKy8qCisgKglEVEUvRENFIHN1YnNjcmlwdGlvbiBvcHRpb25zLgorICoKKyAqICAgICAgQXMgdGhpcyBpcyBtaXNzaW5nIGxvdHMgb2Ygb3B0aW9ucywgdXNlciBzaG91bGQgZXhwZWN0IG1ham9yCisgKgljaGFuZ2VzIG9mIHRoaXMgc3RydWN0dXJlIGluIDIuNS54IHdoaWNoIG1pZ2h0IGJyZWFrIGNvbXBhdGliaWx0eS4KKyAqICAgICAgVGhlIHNvbWV3aGF0IHVnbHkgZGltZW5zaW9uIDIwMC1zaXplb2YoKSBpcyBuZWVkZWQgdG8gbWFpbnRhaW4KKyAqCWJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgKi8KK3N0cnVjdCB4MjVfc3Vic2NyaXBfc3RydWN0IHsKKwljaGFyIGRldmljZVsyMDAtc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXTsKKwl1bnNpZ25lZCBsb25nCWdsb2JhbF9mYWNpbF9tYXNrOwkvKiAwIHRvIGRpc2FibGUgbmVnb3RpYXRpb24gKi8KKwl1bnNpZ25lZCBpbnQJZXh0ZW5kZWQ7Cit9OworCisvKiB2YWx1ZXMgZm9yIGFib3ZlIGdsb2JhbF9mYWNpbF9tYXNrICovCisKKyNkZWZpbmUJWDI1X01BU0tfUkVWRVJTRQkweDAxCQorI2RlZmluZQlYMjVfTUFTS19USFJPVUdIUFVUCTB4MDIKKyNkZWZpbmUJWDI1X01BU0tfUEFDS0VUX1NJWkUJMHgwNAorI2RlZmluZQlYMjVfTUFTS19XSU5ET1dfU0laRQkweDA4CisKKyNkZWZpbmUgWDI1X01BU0tfQ0FMTElOR19BRSAweDEwCisjZGVmaW5lIFgyNV9NQVNLX0NBTExFRF9BRSAweDIwCisKKworLyoKKyAqCVJvdXRpbmcgdGFibGUgY29udHJvbCBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCB4MjVfcm91dGVfc3RydWN0IHsKKwlzdHJ1Y3QgeDI1X2FkZHJlc3MgYWRkcmVzczsKKwl1bnNpZ25lZCBpbnQJICAgc2lnZGlnaXRzOworCWNoYXIJCSAgIGRldmljZVsyMDBdOworfTsKKworLyoKKyAqCUZhY2lsaXRpZXMgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgeDI1X2ZhY2lsaXRpZXMgeworCXVuc2lnbmVkIGludAl3aW5zaXplX2luLCB3aW5zaXplX291dDsKKwl1bnNpZ25lZCBpbnQJcGFjc2l6ZV9pbiwgcGFjc2l6ZV9vdXQ7CisJdW5zaWduZWQgaW50CXRocm91Z2hwdXQ7CisJdW5zaWduZWQgaW50CXJldmVyc2U7Cit9OworCisvKgorKiBJVFUgRFRFIGZhY2lsaXRpZXMKKyogT25seSB0aGUgY2FsbGVkIGFuZCBjYWxsaW5nIGFkZHJlc3MKKyogZXh0ZW5zaW9uIGFyZSBjdXJyZW50bHkgaW1wbGVtZW50ZWQuCisqIFRoZSByZXN0IGFyZSBpbiBwbGFjZSB0byBhdm9pZCB0aGUgc3RydWN0CisqIGNoYW5naW5nIHNpemUgaWYgc29tZW9uZSBuZWVkcyB0aGVtIGxhdGVyCisqLworCitzdHJ1Y3QgeDI1X2R0ZV9mYWNpbGl0aWVzIHsKKwlfX3UxNiBkZWxheV9jdW11bDsKKwlfX3UxNiBkZWxheV90YXJnZXQ7CisJX191MTYgZGVsYXlfbWF4OworCV9fdTggbWluX3Rocm91Z2hwdXQ7CisJX191OCBleHBlZGl0ZWQ7CisJX191OCBjYWxsaW5nX2xlbjsKKwlfX3U4IGNhbGxlZF9sZW47CisJX191OCBjYWxsaW5nX2FlWzIwXTsKKwlfX3U4IGNhbGxlZF9hZVsyMF07Cit9OworCisvKgorICoJQ2FsbCBVc2VyIERhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgeDI1X2NhbGx1c2VyZGF0YSB7CisJdW5zaWduZWQgaW50CWN1ZGxlbmd0aDsKKwl1bnNpZ25lZCBjaGFyCWN1ZGRhdGFbMTI4XTsKK307CisKKy8qCisgKglDYWxsIGNsZWFyaW5nIENhdXNlIGFuZCBEaWFnbm9zdGljIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IHgyNV9jYXVzZWRpYWcgeworCXVuc2lnbmVkIGNoYXIJY2F1c2U7CisJdW5zaWduZWQgY2hhcglkaWFnbm9zdGljOworfTsKKworLyoKKyAqCUZ1cnRoZXIgb3B0aW9uYWwgY2FsbCB1c2VyIGRhdGEgbWF0Y2ggbGVuZ3RoIHNlbGVjdGlvbgorICovCitzdHJ1Y3QgeDI1X3N1YmFkZHIgeworCXVuc2lnbmVkIGludCBjdWRtYXRjaGxlbmd0aDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC94YXR0ci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC94YXR0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNjI1MzcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3hhdHRyLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAgRmlsZTogbGludXgveGF0dHIuaAorCisgIEV4dGVuZGVkIGF0dHJpYnV0ZXMgaGFuZGxpbmcuCisKKyAgQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEFuZHJlYXMgR3J1ZW5iYWNoZXIgPGEuZ3J1ZW5iYWNoZXJAY29tcHV0ZXIub3JnPgorICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICBDb3B5cmlnaHQgKGMpIDIwMDQgUmVkIEhhdCwgSW5jLiwgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQHJlZGhhdC5jb20+CisqLworI2lmbmRlZiBfTElOVVhfWEFUVFJfSAorI2RlZmluZSBfTElOVVhfWEFUVFJfSAorCisjZGVmaW5lIFhBVFRSX0NSRUFURQkweDEJLyogc2V0IHZhbHVlLCBmYWlsIGlmIGF0dHIgYWxyZWFkeSBleGlzdHMgKi8KKyNkZWZpbmUgWEFUVFJfUkVQTEFDRQkweDIJLyogc2V0IHZhbHVlLCBmYWlsIGlmIGF0dHIgZG9lcyBub3QgZXhpc3QgKi8KKworLyogTmFtZXNwYWNlcyAqLworI2RlZmluZSBYQVRUUl9PUzJfUFJFRklYICJvczIuIgorI2RlZmluZSBYQVRUUl9PUzJfUFJFRklYX0xFTiAoc2l6ZW9mIChYQVRUUl9PUzJfUFJFRklYKSAtIDEpCisKKyNkZWZpbmUgWEFUVFJfU0VDVVJJVFlfUFJFRklYCSJzZWN1cml0eS4iCisjZGVmaW5lIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWF9MRU4gKHNpemVvZiAoWEFUVFJfU0VDVVJJVFlfUFJFRklYKSAtIDEpCisKKyNkZWZpbmUgWEFUVFJfU1lTVEVNX1BSRUZJWCAic3lzdGVtLiIKKyNkZWZpbmUgWEFUVFJfU1lTVEVNX1BSRUZJWF9MRU4gKHNpemVvZiAoWEFUVFJfU1lTVEVNX1BSRUZJWCkgLSAxKQorCisjZGVmaW5lIFhBVFRSX1RSVVNURURfUFJFRklYICJ0cnVzdGVkLiIKKyNkZWZpbmUgWEFUVFJfVFJVU1RFRF9QUkVGSVhfTEVOIChzaXplb2YgKFhBVFRSX1RSVVNURURfUFJFRklYKSAtIDEpCisKKyNkZWZpbmUgWEFUVFJfVVNFUl9QUkVGSVggInVzZXIuIgorI2RlZmluZSBYQVRUUl9VU0VSX1BSRUZJWF9MRU4gKHNpemVvZiAoWEFUVFJfVVNFUl9QUkVGSVgpIC0gMSkKKworLyogU2VjdXJpdHkgbmFtZXNwYWNlICovCisjZGVmaW5lIFhBVFRSX0VWTV9TVUZGSVggImV2bSIKKyNkZWZpbmUgWEFUVFJfTkFNRV9FVk0gWEFUVFJfU0VDVVJJVFlfUFJFRklYIFhBVFRSX0VWTV9TVUZGSVgKKworI2RlZmluZSBYQVRUUl9TRUxJTlVYX1NVRkZJWCAic2VsaW51eCIKKyNkZWZpbmUgWEFUVFJfTkFNRV9TRUxJTlVYIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCBYQVRUUl9TRUxJTlVYX1NVRkZJWAorCisjZGVmaW5lIFhBVFRSX1NNQUNLX1NVRkZJWCAiU01BQ0s2NCIKKyNkZWZpbmUgWEFUVFJfU01BQ0tfSVBJTiAiU01BQ0s2NElQSU4iCisjZGVmaW5lIFhBVFRSX1NNQUNLX0lQT1VUICJTTUFDSzY0SVBPVVQiCisjZGVmaW5lIFhBVFRSX1NNQUNLX0VYRUMgIlNNQUNLNjRFWEVDIgorI2RlZmluZSBYQVRUUl9TTUFDS19UUkFOU01VVEUgIlNNQUNLNjRUUkFOU01VVEUiCisjZGVmaW5lIFhBVFRSX1NNQUNLX01NQVAgIlNNQUNLNjRNTUFQIgorI2RlZmluZSBYQVRUUl9OQU1FX1NNQUNLIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCBYQVRUUl9TTUFDS19TVUZGSVgKKyNkZWZpbmUgWEFUVFJfTkFNRV9TTUFDS0lQSU4JWEFUVFJfU0VDVVJJVFlfUFJFRklYIFhBVFRSX1NNQUNLX0lQSU4KKyNkZWZpbmUgWEFUVFJfTkFNRV9TTUFDS0lQT1VUCVhBVFRSX1NFQ1VSSVRZX1BSRUZJWCBYQVRUUl9TTUFDS19JUE9VVAorI2RlZmluZSBYQVRUUl9OQU1FX1NNQUNLRVhFQwlYQVRUUl9TRUNVUklUWV9QUkVGSVggWEFUVFJfU01BQ0tfRVhFQworI2RlZmluZSBYQVRUUl9OQU1FX1NNQUNLVFJBTlNNVVRFIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCBYQVRUUl9TTUFDS19UUkFOU01VVEUKKyNkZWZpbmUgWEFUVFJfTkFNRV9TTUFDS01NQVAgWEFUVFJfU0VDVVJJVFlfUFJFRklYIFhBVFRSX1NNQUNLX01NQVAKKworI2RlZmluZSBYQVRUUl9DQVBTX1NVRkZJWCAiY2FwYWJpbGl0eSIKKyNkZWZpbmUgWEFUVFJfTkFNRV9DQVBTIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCBYQVRUUl9DQVBTX1NVRkZJWAorCisjZGVmaW5lIFhBVFRSX1BPU0lYX0FDTF9BQ0NFU1MgICJwb3NpeF9hY2xfYWNjZXNzIgorI2RlZmluZSBYQVRUUl9OQU1FX1BPU0lYX0FDTF9BQ0NFU1MgWEFUVFJfU1lTVEVNX1BSRUZJWCBYQVRUUl9QT1NJWF9BQ0xfQUNDRVNTCisjZGVmaW5lIFhBVFRSX1BPU0lYX0FDTF9ERUZBVUxUICAicG9zaXhfYWNsX2RlZmF1bHQiCisjZGVmaW5lIFhBVFRSX05BTUVfUE9TSVhfQUNMX0RFRkFVTFQgWEFUVFJfU1lTVEVNX1BSRUZJWCBYQVRUUl9QT1NJWF9BQ0xfREVGQVVMVAorCisKKyNlbmRpZgkvKiBfTElOVVhfWEFUVFJfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC94ZnJtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3hmcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWEzODA1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC94ZnJtLmgKQEAgLTAsMCArMSw1MDIgQEAKKyNpZm5kZWYgX0xJTlVYX1hGUk1fSAorI2RlZmluZSBfTElOVVhfWEZSTV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBBbGwgb2YgdGhlIHN0cnVjdHVyZXMgaW4gdGhpcyBmaWxlIG1heSBub3QgY2hhbmdlIHNpemUgYXMgdGhleSBhcmUKKyAqIHBhc3NlZCBpbnRvIHRoZSBrZXJuZWwgZnJvbSB1c2Vyc3BhY2UgdmlhIG5ldGxpbmsgc29ja2V0cy4KKyAqLworCisvKiBTdHJ1Y3R1cmUgdG8gZW5jYXBzdWxhdGUgYWRkcmVzc2VzLiBJIGRvIG5vdCB3YW50IHRvIHVzZQorICogInN0YW5kYXJkIiBzdHJ1Y3R1cmUuIE15IGFwb2xvZ2llcy4KKyAqLwordHlwZWRlZiB1bmlvbiB7CisJX19iZTMyCQlhNDsKKwlfX2JlMzIJCWE2WzRdOworfSB4ZnJtX2FkZHJlc3NfdDsKKworLyogSWRlbnQgb2YgYSBzcGVjaWZpYyB4ZnJtX3N0YXRlLiBJdCBpcyB1c2VkIG9uIGlucHV0IHRvIGxvb2t1cAorICogdGhlIHN0YXRlIGJ5IChzcGksZGFkZHIsYWgvZXNwKSBvciB0byBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dAorICogc3BpLCBwcm90b2NvbCBhbmQgdHVubmVsIGFkZHJlc3Mgb24gb3V0cHV0LgorICovCitzdHJ1Y3QgeGZybV9pZCB7CisJeGZybV9hZGRyZXNzX3QJZGFkZHI7CisJX19iZTMyCQlzcGk7CisJX191OAkJcHJvdG87Cit9OworCitzdHJ1Y3QgeGZybV9zZWNfY3R4IHsKKwlfX3U4CWN0eF9kb2k7CisJX191OAljdHhfYWxnOworCV9fdTE2CWN0eF9sZW47CisJX191MzIJY3R4X3NpZDsKKwljaGFyCWN0eF9zdHJbMF07Cit9OworCisvKiBTZWN1cml0eSBDb250ZXh0IERvbWFpbnMgb2YgSW50ZXJwcmV0YXRpb24gKi8KKyNkZWZpbmUgWEZSTV9TQ19ET0lfUkVTRVJWRUQgMAorI2RlZmluZSBYRlJNX1NDX0RPSV9MU00gMQorCisvKiBTZWN1cml0eSBDb250ZXh0IEFsZ29yaXRobXMgKi8KKyNkZWZpbmUgWEZSTV9TQ19BTEdfUkVTRVJWRUQgMAorI2RlZmluZSBYRlJNX1NDX0FMR19TRUxJTlVYIDEKKworLyogU2VsZWN0b3IsIHVzZWQgYXMgc2VsZWN0b3IgYm90aCBvbiBwb2xpY3kgcnVsZXMgKFNQRCkgYW5kIFNBcy4gKi8KKworc3RydWN0IHhmcm1fc2VsZWN0b3IgeworCXhmcm1fYWRkcmVzc190CWRhZGRyOworCXhmcm1fYWRkcmVzc190CXNhZGRyOworCV9fYmUxNglkcG9ydDsKKwlfX2JlMTYJZHBvcnRfbWFzazsKKwlfX2JlMTYJc3BvcnQ7CisJX19iZTE2CXNwb3J0X21hc2s7CisJX191MTYJZmFtaWx5OworCV9fdTgJcHJlZml4bGVuX2Q7CisJX191OAlwcmVmaXhsZW5fczsKKwlfX3U4CXByb3RvOworCWludAlpZmluZGV4OworCV9fa2VybmVsX3VpZDMyX3QJdXNlcjsKK307CisKKyNkZWZpbmUgWEZSTV9JTkYgKH4oX191NjQpMCkKKworc3RydWN0IHhmcm1fbGlmZXRpbWVfY2ZnIHsKKwlfX3U2NAlzb2Z0X2J5dGVfbGltaXQ7CisJX191NjQJaGFyZF9ieXRlX2xpbWl0OworCV9fdTY0CXNvZnRfcGFja2V0X2xpbWl0OworCV9fdTY0CWhhcmRfcGFja2V0X2xpbWl0OworCV9fdTY0CXNvZnRfYWRkX2V4cGlyZXNfc2Vjb25kczsKKwlfX3U2NAloYXJkX2FkZF9leHBpcmVzX3NlY29uZHM7CisJX191NjQJc29mdF91c2VfZXhwaXJlc19zZWNvbmRzOworCV9fdTY0CWhhcmRfdXNlX2V4cGlyZXNfc2Vjb25kczsKK307CisKK3N0cnVjdCB4ZnJtX2xpZmV0aW1lX2N1ciB7CisJX191NjQJYnl0ZXM7CisJX191NjQJcGFja2V0czsKKwlfX3U2NAlhZGRfdGltZTsKKwlfX3U2NAl1c2VfdGltZTsKK307CisKK3N0cnVjdCB4ZnJtX3JlcGxheV9zdGF0ZSB7CisJX191MzIJb3NlcTsKKwlfX3UzMglzZXE7CisJX191MzIJYml0bWFwOworfTsKKworc3RydWN0IHhmcm1fcmVwbGF5X3N0YXRlX2VzbiB7CisJdW5zaWduZWQgaW50CWJtcF9sZW47CisJX191MzIJCW9zZXE7CisJX191MzIJCXNlcTsKKwlfX3UzMgkJb3NlcV9oaTsKKwlfX3UzMgkJc2VxX2hpOworCV9fdTMyCQlyZXBsYXlfd2luZG93OworCV9fdTMyCQlibXBbMF07Cit9OworCitzdHJ1Y3QgeGZybV9hbGdvIHsKKwljaGFyCQlhbGdfbmFtZVs2NF07CisJdW5zaWduZWQgaW50CWFsZ19rZXlfbGVuOyAgICAvKiBpbiBiaXRzICovCisJY2hhcgkJYWxnX2tleVswXTsKK307CisKK3N0cnVjdCB4ZnJtX2FsZ29fYXV0aCB7CisJY2hhcgkJYWxnX25hbWVbNjRdOworCXVuc2lnbmVkIGludAlhbGdfa2V5X2xlbjsgICAgLyogaW4gYml0cyAqLworCXVuc2lnbmVkIGludAlhbGdfdHJ1bmNfbGVuOyAgLyogaW4gYml0cyAqLworCWNoYXIJCWFsZ19rZXlbMF07Cit9OworCitzdHJ1Y3QgeGZybV9hbGdvX2FlYWQgeworCWNoYXIJCWFsZ19uYW1lWzY0XTsKKwl1bnNpZ25lZCBpbnQJYWxnX2tleV9sZW47CS8qIGluIGJpdHMgKi8KKwl1bnNpZ25lZCBpbnQJYWxnX2ljdl9sZW47CS8qIGluIGJpdHMgKi8KKwljaGFyCQlhbGdfa2V5WzBdOworfTsKKworc3RydWN0IHhmcm1fc3RhdHMgeworCV9fdTMyCXJlcGxheV93aW5kb3c7CisJX191MzIJcmVwbGF5OworCV9fdTMyCWludGVncml0eV9mYWlsZWQ7Cit9OworCitlbnVtIHsKKwlYRlJNX1BPTElDWV9UWVBFX01BSU4JPSAwLAorCVhGUk1fUE9MSUNZX1RZUEVfU1VCCT0gMSwKKwlYRlJNX1BPTElDWV9UWVBFX01BWAk9IDIsCisJWEZSTV9QT0xJQ1lfVFlQRV9BTlkJPSAyNTUKK307CisKK2VudW0geworCVhGUk1fUE9MSUNZX0lOCT0gMCwKKwlYRlJNX1BPTElDWV9PVVQJPSAxLAorCVhGUk1fUE9MSUNZX0ZXRAk9IDIsCisJWEZSTV9QT0xJQ1lfTUFTSyA9IDMsCisJWEZSTV9QT0xJQ1lfTUFYCT0gMworfTsKKworZW51bSB7CisJWEZSTV9TSEFSRV9BTlksCQkvKiBObyBsaW1pdGF0aW9ucyAqLworCVhGUk1fU0hBUkVfU0VTU0lPTiwJLyogRm9yIHRoaXMgc2Vzc2lvbiBvbmx5ICovCisJWEZSTV9TSEFSRV9VU0VSLAkvKiBGb3IgdGhpcyB1c2VyIG9ubHkgKi8KKwlYRlJNX1NIQVJFX1VOSVFVRQkvKiBVc2Ugb25jZSAqLworfTsKKworI2RlZmluZSBYRlJNX01PREVfVFJBTlNQT1JUIDAKKyNkZWZpbmUgWEZSTV9NT0RFX1RVTk5FTCAxCisjZGVmaW5lIFhGUk1fTU9ERV9ST1VURU9QVElNSVpBVElPTiAyCisjZGVmaW5lIFhGUk1fTU9ERV9JTl9UUklHR0VSIDMKKyNkZWZpbmUgWEZSTV9NT0RFX0JFRVQgNAorI2RlZmluZSBYRlJNX01PREVfTUFYIDUKKworLyogTmV0bGluayBjb25maWd1cmF0aW9uIG1lc3NhZ2VzLiAgKi8KK2VudW0geworCVhGUk1fTVNHX0JBU0UgPSAweDEwLAorCisJWEZSTV9NU0dfTkVXU0EgPSAweDEwLAorI2RlZmluZSBYRlJNX01TR19ORVdTQSBYRlJNX01TR19ORVdTQQorCVhGUk1fTVNHX0RFTFNBLAorI2RlZmluZSBYRlJNX01TR19ERUxTQSBYRlJNX01TR19ERUxTQQorCVhGUk1fTVNHX0dFVFNBLAorI2RlZmluZSBYRlJNX01TR19HRVRTQSBYRlJNX01TR19HRVRTQQorCisJWEZSTV9NU0dfTkVXUE9MSUNZLAorI2RlZmluZSBYRlJNX01TR19ORVdQT0xJQ1kgWEZSTV9NU0dfTkVXUE9MSUNZCisJWEZSTV9NU0dfREVMUE9MSUNZLAorI2RlZmluZSBYRlJNX01TR19ERUxQT0xJQ1kgWEZSTV9NU0dfREVMUE9MSUNZCisJWEZSTV9NU0dfR0VUUE9MSUNZLAorI2RlZmluZSBYRlJNX01TR19HRVRQT0xJQ1kgWEZSTV9NU0dfR0VUUE9MSUNZCisKKwlYRlJNX01TR19BTExPQ1NQSSwKKyNkZWZpbmUgWEZSTV9NU0dfQUxMT0NTUEkgWEZSTV9NU0dfQUxMT0NTUEkKKwlYRlJNX01TR19BQ1FVSVJFLAorI2RlZmluZSBYRlJNX01TR19BQ1FVSVJFIFhGUk1fTVNHX0FDUVVJUkUKKwlYRlJNX01TR19FWFBJUkUsCisjZGVmaW5lIFhGUk1fTVNHX0VYUElSRSBYRlJNX01TR19FWFBJUkUKKworCVhGUk1fTVNHX1VQRFBPTElDWSwKKyNkZWZpbmUgWEZSTV9NU0dfVVBEUE9MSUNZIFhGUk1fTVNHX1VQRFBPTElDWQorCVhGUk1fTVNHX1VQRFNBLAorI2RlZmluZSBYRlJNX01TR19VUERTQSBYRlJNX01TR19VUERTQQorCisJWEZSTV9NU0dfUE9MRVhQSVJFLAorI2RlZmluZSBYRlJNX01TR19QT0xFWFBJUkUgWEZSTV9NU0dfUE9MRVhQSVJFCisKKwlYRlJNX01TR19GTFVTSFNBLAorI2RlZmluZSBYRlJNX01TR19GTFVTSFNBIFhGUk1fTVNHX0ZMVVNIU0EKKwlYRlJNX01TR19GTFVTSFBPTElDWSwKKyNkZWZpbmUgWEZSTV9NU0dfRkxVU0hQT0xJQ1kgWEZSTV9NU0dfRkxVU0hQT0xJQ1kKKworCVhGUk1fTVNHX05FV0FFLAorI2RlZmluZSBYRlJNX01TR19ORVdBRSBYRlJNX01TR19ORVdBRQorCVhGUk1fTVNHX0dFVEFFLAorI2RlZmluZSBYRlJNX01TR19HRVRBRSBYRlJNX01TR19HRVRBRQorCisJWEZSTV9NU0dfUkVQT1JULAorI2RlZmluZSBYRlJNX01TR19SRVBPUlQgWEZSTV9NU0dfUkVQT1JUCisKKwlYRlJNX01TR19NSUdSQVRFLAorI2RlZmluZSBYRlJNX01TR19NSUdSQVRFIFhGUk1fTVNHX01JR1JBVEUKKworCVhGUk1fTVNHX05FV1NBRElORk8sCisjZGVmaW5lIFhGUk1fTVNHX05FV1NBRElORk8gWEZSTV9NU0dfTkVXU0FESU5GTworCVhGUk1fTVNHX0dFVFNBRElORk8sCisjZGVmaW5lIFhGUk1fTVNHX0dFVFNBRElORk8gWEZSTV9NU0dfR0VUU0FESU5GTworCisJWEZSTV9NU0dfTkVXU1BESU5GTywKKyNkZWZpbmUgWEZSTV9NU0dfTkVXU1BESU5GTyBYRlJNX01TR19ORVdTUERJTkZPCisJWEZSTV9NU0dfR0VUU1BESU5GTywKKyNkZWZpbmUgWEZSTV9NU0dfR0VUU1BESU5GTyBYRlJNX01TR19HRVRTUERJTkZPCisKKwlYRlJNX01TR19NQVBQSU5HLAorI2RlZmluZSBYRlJNX01TR19NQVBQSU5HIFhGUk1fTVNHX01BUFBJTkcKKwlfX1hGUk1fTVNHX01BWAorfTsKKyNkZWZpbmUgWEZSTV9NU0dfTUFYIChfX1hGUk1fTVNHX01BWCAtIDEpCisKKyNkZWZpbmUgWEZSTV9OUl9NU0dUWVBFUyAoWEZSTV9NU0dfTUFYICsgMSAtIFhGUk1fTVNHX0JBU0UpCisKKy8qCisgKiBHZW5lcmljIExTTSBzZWN1cml0eSBjb250ZXh0IGZvciBjb211bmljYXRpbmcgdG8gdXNlciBzcGFjZQorICogTk9URTogU2FtZSBmb3JtYXQgYXMgc2FkYl94X3NlY19jdHgKKyAqLworc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4IHsKKwlfX3UxNgkJCWxlbjsKKwlfX3UxNgkJCWV4dHR5cGU7CisJX191OAkJCWN0eF9hbGc7ICAvKiBMU01zOiBlLmcuLCBzZWxpbnV4ID09IDEgKi8KKwlfX3U4CQkJY3R4X2RvaTsKKwlfX3UxNgkJCWN0eF9sZW47Cit9OworCitzdHJ1Y3QgeGZybV91c2VyX3RtcGwgeworCXN0cnVjdCB4ZnJtX2lkCQlpZDsKKwlfX3UxNgkJCWZhbWlseTsKKwl4ZnJtX2FkZHJlc3NfdAkJc2FkZHI7CisJX191MzIJCQlyZXFpZDsKKwlfX3U4CQkJbW9kZTsKKwlfX3U4CQkJc2hhcmU7CisJX191OAkJCW9wdGlvbmFsOworCV9fdTMyCQkJYWFsZ29zOworCV9fdTMyCQkJZWFsZ29zOworCV9fdTMyCQkJY2FsZ29zOworfTsKKworc3RydWN0IHhmcm1fZW5jYXBfdG1wbCB7CisJX191MTYJCWVuY2FwX3R5cGU7CisJX19iZTE2CQllbmNhcF9zcG9ydDsKKwlfX2JlMTYJCWVuY2FwX2Rwb3J0OworCXhmcm1fYWRkcmVzc190CWVuY2FwX29hOworfTsKKworLyogQUVWRU5UIGZsYWdzICAqLworZW51bSB4ZnJtX2FlX2Z0eXBlX3QgeworCVhGUk1fQUVfVU5TUEVDLAorCVhGUk1fQUVfUlRIUj0xLAkvKiByZXBsYXkgdGhyZXNob2xkKi8KKwlYRlJNX0FFX1JWQUw9MiwgLyogcmVwbGF5IHZhbHVlICovCisJWEZSTV9BRV9MVkFMPTQsIC8qIGxpZmV0aW1lIHZhbHVlICovCisJWEZSTV9BRV9FVEhSPTgsIC8qIGV4cGlyeSB0aW1lciB0aHJlc2hvbGQgKi8KKwlYRlJNX0FFX0NSPTE2LCAvKiBFdmVudCBjYXVzZSBpcyByZXBsYXkgdXBkYXRlICovCisJWEZSTV9BRV9DRT0zMiwgLyogRXZlbnQgY2F1c2UgaXMgdGltZXIgZXhwaXJ5ICovCisJWEZSTV9BRV9DVT02NCwgLyogRXZlbnQgY2F1c2UgaXMgcG9saWN5IHVwZGF0ZSAqLworCV9fWEZSTV9BRV9NQVgKKworI2RlZmluZSBYRlJNX0FFX01BWCAoX19YRlJNX0FFX01BWCAtIDEpCit9OworCitzdHJ1Y3QgeGZybV91c2VycG9saWN5X3R5cGUgeworCV9fdTgJCXR5cGU7CisJX191MTYJCXJlc2VydmVkMTsKKwlfX3U4CQlyZXNlcnZlZDI7Cit9OworCisvKiBOZXRsaW5rIG1lc3NhZ2UgYXR0cmlidXRlcy4gICovCitlbnVtIHhmcm1fYXR0cl90eXBlX3QgeworCVhGUk1BX1VOU1BFQywKKwlYRlJNQV9BTEdfQVVUSCwJCS8qIHN0cnVjdCB4ZnJtX2FsZ28gKi8KKwlYRlJNQV9BTEdfQ1JZUFQsCS8qIHN0cnVjdCB4ZnJtX2FsZ28gKi8KKwlYRlJNQV9BTEdfQ09NUCwJCS8qIHN0cnVjdCB4ZnJtX2FsZ28gKi8KKwlYRlJNQV9FTkNBUCwJCS8qIHN0cnVjdCB4ZnJtX2FsZ28gKyBzdHJ1Y3QgeGZybV9lbmNhcF90bXBsICovCisJWEZSTUFfVE1QTCwJCS8qIDEgb3IgbW9yZSBzdHJ1Y3QgeGZybV91c2VyX3RtcGwgKi8KKwlYRlJNQV9TQSwJCS8qIHN0cnVjdCB4ZnJtX3VzZXJzYV9pbmZvICAqLworCVhGUk1BX1BPTElDWSwJCS8qc3RydWN0IHhmcm1fdXNlcnBvbGljeV9pbmZvICovCisJWEZSTUFfU0VDX0NUWCwJCS8qIHN0cnVjdCB4ZnJtX3NlY19jdHggKi8KKwlYRlJNQV9MVElNRV9WQUwsCisJWEZSTUFfUkVQTEFZX1ZBTCwKKwlYRlJNQV9SRVBMQVlfVEhSRVNILAorCVhGUk1BX0VUSU1FUl9USFJFU0gsCisJWEZSTUFfU1JDQUREUiwJCS8qIHhmcm1fYWRkcmVzc190ICovCisJWEZSTUFfQ09BRERSLAkJLyogeGZybV9hZGRyZXNzX3QgKi8KKwlYRlJNQV9MQVNUVVNFRCwJCS8qIHVuc2lnbmVkIGxvbmcgICovCisJWEZSTUFfUE9MSUNZX1RZUEUsCS8qIHN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfdHlwZSAqLworCVhGUk1BX01JR1JBVEUsCisJWEZSTUFfQUxHX0FFQUQsCQkvKiBzdHJ1Y3QgeGZybV9hbGdvX2FlYWQgKi8KKwlYRlJNQV9LTUFERFJFU1MsICAgICAgICAvKiBzdHJ1Y3QgeGZybV91c2VyX2ttYWRkcmVzcyAqLworCVhGUk1BX0FMR19BVVRIX1RSVU5DLAkvKiBzdHJ1Y3QgeGZybV9hbGdvX2F1dGggKi8KKwlYRlJNQV9NQVJLLAkJLyogc3RydWN0IHhmcm1fbWFyayAqLworCVhGUk1BX1RGQ1BBRCwJCS8qIF9fdTMyICovCisJWEZSTUFfUkVQTEFZX0VTTl9WQUwsCS8qIHN0cnVjdCB4ZnJtX3JlcGxheV9lc24gKi8KKwlfX1hGUk1BX01BWAorCisjZGVmaW5lIFhGUk1BX01BWCAoX19YRlJNQV9NQVggLSAxKQorfTsKKworc3RydWN0IHhmcm1fbWFyayB7CisJX191MzIgICAgICAgICAgIHY7IC8qIHZhbHVlICovCisJX191MzIgICAgICAgICAgIG07IC8qIG1hc2sgKi8KK307CisKK2VudW0geGZybV9zYWRhdHRyX3R5cGVfdCB7CisJWEZSTUFfU0FEX1VOU1BFQywKKwlYRlJNQV9TQURfQ05ULAorCVhGUk1BX1NBRF9ISU5GTywKKwlfX1hGUk1BX1NBRF9NQVgKKworI2RlZmluZSBYRlJNQV9TQURfTUFYIChfX1hGUk1BX1NBRF9NQVggLSAxKQorfTsKKworc3RydWN0IHhmcm11X3NhZGhpbmZvIHsKKwlfX3UzMiBzYWRoY250OyAvKiBjdXJyZW50IGhhc2ggYmt0cyAqLworCV9fdTMyIHNhZGhtY250OyAvKiBtYXggYWxsb3dlZCBoYXNoIGJrdHMgKi8KK307CisKK2VudW0geGZybV9zcGRhdHRyX3R5cGVfdCB7CisJWEZSTUFfU1BEX1VOU1BFQywKKwlYRlJNQV9TUERfSU5GTywKKwlYRlJNQV9TUERfSElORk8sCisJX19YRlJNQV9TUERfTUFYCisKKyNkZWZpbmUgWEZSTUFfU1BEX01BWCAoX19YRlJNQV9TUERfTUFYIC0gMSkKK307CisKK3N0cnVjdCB4ZnJtdV9zcGRpbmZvIHsKKwlfX3UzMiBpbmNudDsKKwlfX3UzMiBvdXRjbnQ7CisJX191MzIgZndkY250OworCV9fdTMyIGluc2NudDsKKwlfX3UzMiBvdXRzY250OworCV9fdTMyIGZ3ZHNjbnQ7Cit9OworCitzdHJ1Y3QgeGZybXVfc3BkaGluZm8geworCV9fdTMyIHNwZGhjbnQ7CisJX191MzIgc3BkaG1jbnQ7Cit9OworCitzdHJ1Y3QgeGZybV91c2Vyc2FfaW5mbyB7CisJc3RydWN0IHhmcm1fc2VsZWN0b3IJCXNlbDsKKwlzdHJ1Y3QgeGZybV9pZAkJCWlkOworCXhmcm1fYWRkcmVzc190CQkJc2FkZHI7CisJc3RydWN0IHhmcm1fbGlmZXRpbWVfY2ZnCWxmdDsKKwlzdHJ1Y3QgeGZybV9saWZldGltZV9jdXIJY3VybGZ0OworCXN0cnVjdCB4ZnJtX3N0YXRzCQlzdGF0czsKKwlfX3UzMgkJCQlzZXE7CisJX191MzIJCQkJcmVxaWQ7CisJX191MTYJCQkJZmFtaWx5OworCV9fdTgJCQkJbW9kZTsJCS8qIFhGUk1fTU9ERV94eHggKi8KKwlfX3U4CQkJCXJlcGxheV93aW5kb3c7CisJX191OAkJCQlmbGFnczsKKyNkZWZpbmUgWEZSTV9TVEFURV9OT0VDTgkxCisjZGVmaW5lIFhGUk1fU1RBVEVfREVDQVBfRFNDUAkyCisjZGVmaW5lIFhGUk1fU1RBVEVfTk9QTVRVRElTQwk0CisjZGVmaW5lIFhGUk1fU1RBVEVfV0lMRFJFQ1YJOAorI2RlZmluZSBYRlJNX1NUQVRFX0lDTVAJCTE2CisjZGVmaW5lIFhGUk1fU1RBVEVfQUZfVU5TUEVDCTMyCisjZGVmaW5lIFhGUk1fU1RBVEVfQUxJR040CTY0CisjZGVmaW5lIFhGUk1fU1RBVEVfRVNOCQkxMjgKK307CisKK3N0cnVjdCB4ZnJtX3VzZXJzYV9pZCB7CisJeGZybV9hZGRyZXNzX3QJCQlkYWRkcjsKKwlfX2JlMzIJCQkJc3BpOworCV9fdTE2CQkJCWZhbWlseTsKKwlfX3U4CQkJCXByb3RvOworfTsKKworc3RydWN0IHhmcm1fYWV2ZW50X2lkIHsKKwlzdHJ1Y3QgeGZybV91c2Vyc2FfaWQJCXNhX2lkOworCXhmcm1fYWRkcmVzc190CQkJc2FkZHI7CisJX191MzIJCQkJZmxhZ3M7CisJX191MzIJCQkJcmVxaWQ7Cit9OworCitzdHJ1Y3QgeGZybV91c2Vyc3BpX2luZm8geworCXN0cnVjdCB4ZnJtX3VzZXJzYV9pbmZvCQlpbmZvOworCV9fdTMyCQkJCW1pbjsKKwlfX3UzMgkJCQltYXg7Cit9OworCitzdHJ1Y3QgeGZybV91c2VycG9saWN5X2luZm8geworCXN0cnVjdCB4ZnJtX3NlbGVjdG9yCQlzZWw7CisJc3RydWN0IHhmcm1fbGlmZXRpbWVfY2ZnCWxmdDsKKwlzdHJ1Y3QgeGZybV9saWZldGltZV9jdXIJY3VybGZ0OworCV9fdTMyCQkJCXByaW9yaXR5OworCV9fdTMyCQkJCWluZGV4OworCV9fdTgJCQkJZGlyOworCV9fdTgJCQkJYWN0aW9uOworI2RlZmluZSBYRlJNX1BPTElDWV9BTExPVwkwCisjZGVmaW5lIFhGUk1fUE9MSUNZX0JMT0NLCTEKKwlfX3U4CQkJCWZsYWdzOworI2RlZmluZSBYRlJNX1BPTElDWV9MT0NBTE9LCTEJLyogQWxsb3cgdXNlciB0byBvdmVycmlkZSBnbG9iYWwgcG9saWN5ICovCisJLyogQXV0b21hdGljYWxseSBleHBhbmQgc2VsZWN0b3IgdG8gaW5jbHVkZSBtYXRjaGluZyBJQ01QIHBheWxvYWRzLiAqLworI2RlZmluZSBYRlJNX1BPTElDWV9JQ01QCTIKKwlfX3U4CQkJCXNoYXJlOworfTsKKworc3RydWN0IHhmcm1fdXNlcnBvbGljeV9pZCB7CisJc3RydWN0IHhmcm1fc2VsZWN0b3IJCXNlbDsKKwlfX3UzMgkJCQlpbmRleDsKKwlfX3U4CQkJCWRpcjsKK307CisKK3N0cnVjdCB4ZnJtX3VzZXJfYWNxdWlyZSB7CisJc3RydWN0IHhmcm1faWQJCQlpZDsKKwl4ZnJtX2FkZHJlc3NfdAkJCXNhZGRyOworCXN0cnVjdCB4ZnJtX3NlbGVjdG9yCQlzZWw7CisJc3RydWN0IHhmcm1fdXNlcnBvbGljeV9pbmZvCXBvbGljeTsKKwlfX3UzMgkJCQlhYWxnb3M7CisJX191MzIJCQkJZWFsZ29zOworCV9fdTMyCQkJCWNhbGdvczsKKwlfX3UzMgkJCQlzZXE7Cit9OworCitzdHJ1Y3QgeGZybV91c2VyX2V4cGlyZSB7CisJc3RydWN0IHhmcm1fdXNlcnNhX2luZm8JCXN0YXRlOworCV9fdTgJCQkJaGFyZDsKK307CisKK3N0cnVjdCB4ZnJtX3VzZXJfcG9sZXhwaXJlIHsKKwlzdHJ1Y3QgeGZybV91c2VycG9saWN5X2luZm8JcG9sOworCV9fdTgJCQkJaGFyZDsKK307CisKK3N0cnVjdCB4ZnJtX3VzZXJzYV9mbHVzaCB7CisJX191OAkJCQlwcm90bzsKK307CisKK3N0cnVjdCB4ZnJtX3VzZXJfcmVwb3J0IHsKKwlfX3U4CQkJCXByb3RvOworCXN0cnVjdCB4ZnJtX3NlbGVjdG9yCQlzZWw7Cit9OworCisvKiBVc2VkIGJ5IE1JR1JBVEUgdG8gcGFzcyBhZGRyZXNzZXMgSUtFIHNob3VsZCB1c2UgdG8gcGVyZm9ybQorICogU0EgbmVnb3RpYXRpb24gd2l0aCB0aGUgcGVlciAqLworc3RydWN0IHhmcm1fdXNlcl9rbWFkZHJlc3MgeworCXhmcm1fYWRkcmVzc190ICAgICAgICAgICAgICAgICAgbG9jYWw7CisJeGZybV9hZGRyZXNzX3QgICAgICAgICAgICAgICAgICByZW1vdGU7CisJX191MzIJCQkJcmVzZXJ2ZWQ7CisJX191MTYJCQkJZmFtaWx5OworfTsKKworc3RydWN0IHhmcm1fdXNlcl9taWdyYXRlIHsKKwl4ZnJtX2FkZHJlc3NfdAkJCW9sZF9kYWRkcjsKKwl4ZnJtX2FkZHJlc3NfdAkJCW9sZF9zYWRkcjsKKwl4ZnJtX2FkZHJlc3NfdAkJCW5ld19kYWRkcjsKKwl4ZnJtX2FkZHJlc3NfdAkJCW5ld19zYWRkcjsKKwlfX3U4CQkJCXByb3RvOworCV9fdTgJCQkJbW9kZTsKKwlfX3UxNgkJCQlyZXNlcnZlZDsKKwlfX3UzMgkJCQlyZXFpZDsKKwlfX3UxNgkJCQlvbGRfZmFtaWx5OworCV9fdTE2CQkJCW5ld19mYW1pbHk7Cit9OworCitzdHJ1Y3QgeGZybV91c2VyX21hcHBpbmcgeworCXN0cnVjdCB4ZnJtX3VzZXJzYV9pZAkJaWQ7CisJX191MzIJCQkJcmVxaWQ7CisJeGZybV9hZGRyZXNzX3QJCQlvbGRfc2FkZHI7CisJeGZybV9hZGRyZXNzX3QJCQluZXdfc2FkZHI7CisJX19iZTE2CQkJCW9sZF9zcG9ydDsKKwlfX2JlMTYJCQkJbmV3X3Nwb3J0OworfTsKKworLyogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHVzZXJzcGFjZSAqLworI2RlZmluZSBYRlJNR1JQX0FDUVVJUkUJCTEKKyNkZWZpbmUgWEZSTUdSUF9FWFBJUkUJCTIKKyNkZWZpbmUgWEZSTUdSUF9TQQkJNAorI2RlZmluZSBYRlJNR1JQX1BPTElDWQkJOAorI2RlZmluZSBYRlJNR1JQX1JFUE9SVAkJMHgyMAorCitlbnVtIHhmcm1fbmxncm91cHMgeworCVhGUk1OTEdSUF9OT05FLAorI2RlZmluZSBYRlJNTkxHUlBfTk9ORQkJWEZSTU5MR1JQX05PTkUKKwlYRlJNTkxHUlBfQUNRVUlSRSwKKyNkZWZpbmUgWEZSTU5MR1JQX0FDUVVJUkUJWEZSTU5MR1JQX0FDUVVJUkUKKwlYRlJNTkxHUlBfRVhQSVJFLAorI2RlZmluZSBYRlJNTkxHUlBfRVhQSVJFCVhGUk1OTEdSUF9FWFBJUkUKKwlYRlJNTkxHUlBfU0EsCisjZGVmaW5lIFhGUk1OTEdSUF9TQQkJWEZSTU5MR1JQX1NBCisJWEZSTU5MR1JQX1BPTElDWSwKKyNkZWZpbmUgWEZSTU5MR1JQX1BPTElDWQlYRlJNTkxHUlBfUE9MSUNZCisJWEZSTU5MR1JQX0FFVkVOVFMsCisjZGVmaW5lIFhGUk1OTEdSUF9BRVZFTlRTCVhGUk1OTEdSUF9BRVZFTlRTCisJWEZSTU5MR1JQX1JFUE9SVCwKKyNkZWZpbmUgWEZSTU5MR1JQX1JFUE9SVAlYRlJNTkxHUlBfUkVQT1JUCisJWEZSTU5MR1JQX01JR1JBVEUsCisjZGVmaW5lIFhGUk1OTEdSUF9NSUdSQVRFCVhGUk1OTEdSUF9NSUdSQVRFCisJWEZSTU5MR1JQX01BUFBJTkcsCisjZGVmaW5lIFhGUk1OTEdSUF9NQVBQSU5HCVhGUk1OTEdSUF9NQVBQSU5HCisJX19YRlJNTkxHUlBfTUFYCit9OworI2RlZmluZSBYRlJNTkxHUlBfTUFYCShfX1hGUk1OTEdSUF9NQVggLSAxKQorCisjZW5kaWYgLyogX0xJTlVYX1hGUk1fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9sb2NhbGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbG9jYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhMTllNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbG9jYWxlLmgKQEAgLTAsMCArMSwyMDggQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwxOTkyLDE5OTUtMjAwMiwyMDA3LDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglJU08gQzk5IFN0YW5kYXJkOiA3LjExIExvY2FsaXphdGlvbgk8bG9jYWxlLmg+CisgKi8KKworI2lmbmRlZglfTE9DQUxFX0gKKyNkZWZpbmUJX0xPQ0FMRV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNkZWZpbmUgX19uZWVkX05VTEwKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxiaXRzL2xvY2FsZS5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoZXNlIGFyZSB0aGUgcG9zc2liaWxpdGllcyBmb3IgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHNldGxvY2FsZS4KKyAgIFRoZSBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgbG93ZXN0IExDXyogc3ltYm9sIGhhcyB0aGUgdmFsdWUgemVyby4gICovCisjZGVmaW5lIExDX0NUWVBFICAgICAgICAgIF9fTENfQ1RZUEUKKyNkZWZpbmUgTENfTlVNRVJJQyAgICAgICAgX19MQ19OVU1FUklDCisjZGVmaW5lIExDX1RJTUUgICAgICAgICAgIF9fTENfVElNRQorI2RlZmluZSBMQ19DT0xMQVRFICAgICAgICBfX0xDX0NPTExBVEUKKyNkZWZpbmUgTENfTU9ORVRBUlkgICAgICAgX19MQ19NT05FVEFSWQorI2RlZmluZSBMQ19NRVNTQUdFUyAgICAgICBfX0xDX01FU1NBR0VTCisjZGVmaW5lCUxDX0FMTAkJICBfX0xDX0FMTAorI2RlZmluZSBMQ19QQVBFUgkgIF9fTENfUEFQRVIKKyNkZWZpbmUgTENfTkFNRQkJICBfX0xDX05BTUUKKyNkZWZpbmUgTENfQUREUkVTUwkgIF9fTENfQUREUkVTUworI2RlZmluZSBMQ19URUxFUEhPTkUJICBfX0xDX1RFTEVQSE9ORQorI2RlZmluZSBMQ19NRUFTVVJFTUVOVAkgIF9fTENfTUVBU1VSRU1FTlQKKyNkZWZpbmUgTENfSURFTlRJRklDQVRJT04gX19MQ19JREVOVElGSUNBVElPTgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorCisvKiBTdHJ1Y3R1cmUgZ2l2aW5nIGluZm9ybWF0aW9uIGFib3V0IG51bWVyaWMgYW5kIG1vbmV0YXJ5IG5vdGF0aW9uLiAgKi8KK3N0cnVjdCBsY29udgoreworICAvKiBOdW1lcmljIChub24tbW9uZXRhcnkpIGluZm9ybWF0aW9uLiAgKi8KKworICBjaGFyICpkZWNpbWFsX3BvaW50OwkJLyogRGVjaW1hbCBwb2ludCBjaGFyYWN0ZXIuICAqLworICBjaGFyICp0aG91c2FuZHNfc2VwOwkJLyogVGhvdXNhbmRzIHNlcGFyYXRvci4gICovCisgIC8qIEVhY2ggZWxlbWVudCBpcyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBpbiBlYWNoIGdyb3VwOworICAgICBlbGVtZW50cyB3aXRoIGhpZ2hlciBpbmRpY2VzIGFyZSBmYXJ0aGVyIGxlZnQuCisgICAgIEFuIGVsZW1lbnQgd2l0aCB2YWx1ZSBDSEFSX01BWCBtZWFucyB0aGF0IG5vIGZ1cnRoZXIgZ3JvdXBpbmcgaXMgZG9uZS4KKyAgICAgQW4gZWxlbWVudCB3aXRoIHZhbHVlIDAgbWVhbnMgdGhhdCB0aGUgcHJldmlvdXMgZWxlbWVudCBpcyB1c2VkCisgICAgIGZvciBhbGwgZ3JvdXBzIGZhcnRoZXIgbGVmdC4gICovCisgIGNoYXIgKmdyb3VwaW5nOworCisgIC8qIE1vbmV0YXJ5IGluZm9ybWF0aW9uLiAgKi8KKworICAvKiBGaXJzdCB0aHJlZSBjaGFycyBhcmUgYSBjdXJyZW5jeSBzeW1ib2wgZnJvbSBJU08gNDIxNy4KKyAgICAgRm91cnRoIGNoYXIgaXMgdGhlIHNlcGFyYXRvci4gIEZpZnRoIGNoYXIgaXMgJ1wwJy4gICovCisgIGNoYXIgKmludF9jdXJyX3N5bWJvbDsKKyAgY2hhciAqY3VycmVuY3lfc3ltYm9sOwkvKiBMb2NhbCBjdXJyZW5jeSBzeW1ib2wuICAqLworICBjaGFyICptb25fZGVjaW1hbF9wb2ludDsJLyogRGVjaW1hbCBwb2ludCBjaGFyYWN0ZXIuICAqLworICBjaGFyICptb25fdGhvdXNhbmRzX3NlcDsJLyogVGhvdXNhbmRzIHNlcGFyYXRvci4gICovCisgIGNoYXIgKm1vbl9ncm91cGluZzsJCS8qIExpa2UgYGdyb3VwaW5nJyBlbGVtZW50IChhYm92ZSkuICAqLworICBjaGFyICpwb3NpdGl2ZV9zaWduOwkJLyogU2lnbiBmb3IgcG9zaXRpdmUgdmFsdWVzLiAgKi8KKyAgY2hhciAqbmVnYXRpdmVfc2lnbjsJCS8qIFNpZ24gZm9yIG5lZ2F0aXZlIHZhbHVlcy4gICovCisgIGNoYXIgaW50X2ZyYWNfZGlnaXRzOwkJLyogSW50J2wgZnJhY3Rpb25hbCBkaWdpdHMuICAqLworICBjaGFyIGZyYWNfZGlnaXRzOwkJLyogTG9jYWwgZnJhY3Rpb25hbCBkaWdpdHMuICAqLworICAvKiAxIGlmIGN1cnJlbmN5X3N5bWJvbCBwcmVjZWRlcyBhIHBvc2l0aXZlIHZhbHVlLCAwIGlmIHN1Y2NlZWRzLiAgKi8KKyAgY2hhciBwX2NzX3ByZWNlZGVzOworICAvKiAxIGlmZiBhIHNwYWNlIHNlcGFyYXRlcyBjdXJyZW5jeV9zeW1ib2wgZnJvbSBhIHBvc2l0aXZlIHZhbHVlLiAgKi8KKyAgY2hhciBwX3NlcF9ieV9zcGFjZTsKKyAgLyogMSBpZiBjdXJyZW5jeV9zeW1ib2wgcHJlY2VkZXMgYSBuZWdhdGl2ZSB2YWx1ZSwgMCBpZiBzdWNjZWVkcy4gICovCisgIGNoYXIgbl9jc19wcmVjZWRlczsKKyAgLyogMSBpZmYgYSBzcGFjZSBzZXBhcmF0ZXMgY3VycmVuY3lfc3ltYm9sIGZyb20gYSBuZWdhdGl2ZSB2YWx1ZS4gICovCisgIGNoYXIgbl9zZXBfYnlfc3BhY2U7CisgIC8qIFBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBzaWduIHBvc2l0aW9uczoKKyAgICAgMCBQYXJlbnRoZXNlcyBzdXJyb3VuZCB0aGUgcXVhbnRpdHkgYW5kIGN1cnJlbmN5X3N5bWJvbC4KKyAgICAgMSBUaGUgc2lnbiBzdHJpbmcgcHJlY2VkZXMgdGhlIHF1YW50aXR5IGFuZCBjdXJyZW5jeV9zeW1ib2wuCisgICAgIDIgVGhlIHNpZ24gc3RyaW5nIGZvbGxvd3MgdGhlIHF1YW50aXR5IGFuZCBjdXJyZW5jeV9zeW1ib2wuCisgICAgIDMgVGhlIHNpZ24gc3RyaW5nIGltbWVkaWF0ZWx5IHByZWNlZGVzIHRoZSBjdXJyZW5jeV9zeW1ib2wuCisgICAgIDQgVGhlIHNpZ24gc3RyaW5nIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlIGN1cnJlbmN5X3N5bWJvbC4gICovCisgIGNoYXIgcF9zaWduX3Bvc247CisgIGNoYXIgbl9zaWduX3Bvc247CisjaWZkZWYgX19VU0VfSVNPQzk5CisgIC8qIDEgaWYgaW50X2N1cnJfc3ltYm9sIHByZWNlZGVzIGEgcG9zaXRpdmUgdmFsdWUsIDAgaWYgc3VjY2VlZHMuICAqLworICBjaGFyIGludF9wX2NzX3ByZWNlZGVzOworICAvKiAxIGlmZiBhIHNwYWNlIHNlcGFyYXRlcyBpbnRfY3Vycl9zeW1ib2wgZnJvbSBhIHBvc2l0aXZlIHZhbHVlLiAgKi8KKyAgY2hhciBpbnRfcF9zZXBfYnlfc3BhY2U7CisgIC8qIDEgaWYgaW50X2N1cnJfc3ltYm9sIHByZWNlZGVzIGEgbmVnYXRpdmUgdmFsdWUsIDAgaWYgc3VjY2VlZHMuICAqLworICBjaGFyIGludF9uX2NzX3ByZWNlZGVzOworICAvKiAxIGlmZiBhIHNwYWNlIHNlcGFyYXRlcyBpbnRfY3Vycl9zeW1ib2wgZnJvbSBhIG5lZ2F0aXZlIHZhbHVlLiAgKi8KKyAgY2hhciBpbnRfbl9zZXBfYnlfc3BhY2U7CisgIC8qIFBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBzaWduIHBvc2l0aW9uczoKKyAgICAgMCBQYXJlbnRoZXNlcyBzdXJyb3VuZCB0aGUgcXVhbnRpdHkgYW5kIGludF9jdXJyX3N5bWJvbC4KKyAgICAgMSBUaGUgc2lnbiBzdHJpbmcgcHJlY2VkZXMgdGhlIHF1YW50aXR5IGFuZCBpbnRfY3Vycl9zeW1ib2wuCisgICAgIDIgVGhlIHNpZ24gc3RyaW5nIGZvbGxvd3MgdGhlIHF1YW50aXR5IGFuZCBpbnRfY3Vycl9zeW1ib2wuCisgICAgIDMgVGhlIHNpZ24gc3RyaW5nIGltbWVkaWF0ZWx5IHByZWNlZGVzIHRoZSBpbnRfY3Vycl9zeW1ib2wuCisgICAgIDQgVGhlIHNpZ24gc3RyaW5nIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlIGludF9jdXJyX3N5bWJvbC4gICovCisgIGNoYXIgaW50X3Bfc2lnbl9wb3NuOworICBjaGFyIGludF9uX3NpZ25fcG9zbjsKKyNlbHNlCisgIGNoYXIgX19pbnRfcF9jc19wcmVjZWRlczsKKyAgY2hhciBfX2ludF9wX3NlcF9ieV9zcGFjZTsKKyAgY2hhciBfX2ludF9uX2NzX3ByZWNlZGVzOworICBjaGFyIF9faW50X25fc2VwX2J5X3NwYWNlOworICBjaGFyIF9faW50X3Bfc2lnbl9wb3NuOworICBjaGFyIF9faW50X25fc2lnbl9wb3NuOworI2VuZGlmCit9OworCisKKy8qIFNldCBhbmQvb3IgcmV0dXJuIHRoZSBjdXJyZW50IGxvY2FsZS4gICovCitleHRlcm4gY2hhciAqc2V0bG9jYWxlIChpbnQgX19jYXRlZ29yeSwgX19jb25zdCBjaGFyICpfX2xvY2FsZSkgX19USFJPVzsKKworLyogUmV0dXJuIHRoZSBudW1lcmljL21vbmV0YXJ5IGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBsb2NhbGUuICAqLworZXh0ZXJuIHN0cnVjdCBsY29udiAqbG9jYWxlY29udiAodm9pZCkgX19USFJPVzsKKworX19FTkRfTkFNRVNQQUNFX1NURAorCisKKyNpZmRlZglfX1VTRV9YT1BFTjJLOAorLyogVGhlIGNvbmNlcHQgb2Ygb25lIHN0YXRpYyBsb2NhbGUgcGVyIGNhdGVnb3J5IGlzIG5vdCB2ZXJ5IHdlbGwKKyAgIHRob3VnaHQgb3V0LiAgTWFueSBhcHBsaWNhdGlvbnMgd2lsbCBuZWVkIHRvIHByb2Nlc3MgaXRzIGRhdGEgdXNpbmcKKyAgIGluZm9ybWF0aW9uIGZyb20gc2V2ZXJhbCBkaWZmZXJlbnQgbG9jYWxlcy4gIEFub3RoZXIgYXBwbGljYXRpb24gaXMKKyAgIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYXRpb25hbGl6YXRpb24gaGFuZGxpbmcgaW4gdGhlCisgICB1cGNvbWluZyBJU08gQysrIHN0YW5kYXJkIGxpYnJhcnkuICBUbyBzdXBwb3J0IHRoaXMgYW5vdGhlciBzZXQgb2YKKyAgIHRoZSBmdW5jdGlvbnMgdXNpbmcgbG9jYWxlIGRhdGEgZXhpc3Qgd2hpY2ggaGF2ZSBhbiBhZGRpdGlvbmFsCisgICBhcmd1bWVudC4KKworICAgQXR0ZW50aW9uOiBhbGwgdGhlc2UgZnVuY3Rpb25zIGFyZSAqbm90KiBzdGFuZGFyZGl6ZWQgaW4gYW55IGZvcm0uCisgICBUaGlzIGlzIGEgcHJvb2Ytb2YtY29uY2VwdCBpbXBsZW1lbnRhdGlvbi4gICovCisKKy8qIEdldCBsb2NhbGUgZGF0YXR5cGUgZGVmaW5pdGlvbi4gICovCisjIGluY2x1ZGUgPHhsb2NhbGUuaD4KKworLyogUmV0dXJuIGEgcmVmZXJlbmNlIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgc2V0IG9mIGxvY2FsZQorICAgZGF0YXNldHMuICBVbmxpa2UgZm9yIHRoZSBDQVRFR09SWSBwYXJhbWV0ZXIgZm9yIGBzZXRsb2NhbGUnIHRoZQorICAgQ0FURUdPUllfTUFTSyBwYXJhbWV0ZXIgaGVyZSB1c2VzIGEgc2luZ2xlIGJpdCBmb3IgZWFjaCBjYXRlZ29yeSwKKyAgIG1hZGUgYnkgT1InaW5nIHRvZ2V0aGVyIExDXypfTUFTSyBiaXRzIGFib3ZlLiAgKi8KK2V4dGVybiBfX2xvY2FsZV90IG5ld2xvY2FsZSAoaW50IF9fY2F0ZWdvcnlfbWFzaywgX19jb25zdCBjaGFyICpfX2xvY2FsZSwKKwkJCSAgICAgX19sb2NhbGVfdCBfX2Jhc2UpIF9fVEhST1c7CisKKy8qIFRoZXNlIGFyZSB0aGUgYml0cyB0aGF0IGNhbiBiZSBzZXQgaW4gdGhlIENBVEVHT1JZX01BU0sgYXJndW1lbnQgdG8KKyAgIGBuZXdsb2NhbGUnLiAgSW4gdGhlIEdOVSBpbXBsZW1lbnRhdGlvbiwgTENfRk9PX01BU0sgaGFzIHRoZSB2YWx1ZQorICAgb2YgKDEgPDwgTENfRk9PKSwgYnV0IHRoaXMgaXMgbm90IGEgcGFydCBvZiB0aGUgaW50ZXJmYWNlIHRoYXQKKyAgIGNhbGxlcnMgY2FuIGFzc3VtZSB3aWxsIGJlIHRydWUuICAqLworIyBkZWZpbmUgTENfQ1RZUEVfTUFTSwkJKDEgPDwgX19MQ19DVFlQRSkKKyMgZGVmaW5lIExDX05VTUVSSUNfTUFTSwkoMSA8PCBfX0xDX05VTUVSSUMpCisjIGRlZmluZSBMQ19USU1FX01BU0sJCSgxIDw8IF9fTENfVElNRSkKKyMgZGVmaW5lIExDX0NPTExBVEVfTUFTSwkoMSA8PCBfX0xDX0NPTExBVEUpCisjIGRlZmluZSBMQ19NT05FVEFSWV9NQVNLCSgxIDw8IF9fTENfTU9ORVRBUlkpCisjIGRlZmluZSBMQ19NRVNTQUdFU19NQVNLCSgxIDw8IF9fTENfTUVTU0FHRVMpCisjIGRlZmluZSBMQ19QQVBFUl9NQVNLCQkoMSA8PCBfX0xDX1BBUEVSKQorIyBkZWZpbmUgTENfTkFNRV9NQVNLCQkoMSA8PCBfX0xDX05BTUUpCisjIGRlZmluZSBMQ19BRERSRVNTX01BU0sJKDEgPDwgX19MQ19BRERSRVNTKQorIyBkZWZpbmUgTENfVEVMRVBIT05FX01BU0sJKDEgPDwgX19MQ19URUxFUEhPTkUpCisjIGRlZmluZSBMQ19NRUFTVVJFTUVOVF9NQVNLCSgxIDw8IF9fTENfTUVBU1VSRU1FTlQpCisjIGRlZmluZSBMQ19JREVOVElGSUNBVElPTl9NQVNLCSgxIDw8IF9fTENfSURFTlRJRklDQVRJT04pCisjIGRlZmluZSBMQ19BTExfTUFTSwkJKExDX0NUWVBFX01BU0sgXAorCQkJCSB8IExDX05VTUVSSUNfTUFTSyBcCisJCQkJIHwgTENfVElNRV9NQVNLIFwKKwkJCQkgfCBMQ19DT0xMQVRFX01BU0sgXAorCQkJCSB8IExDX01PTkVUQVJZX01BU0sgXAorCQkJCSB8IExDX01FU1NBR0VTX01BU0sgXAorCQkJCSB8IExDX1BBUEVSX01BU0sgXAorCQkJCSB8IExDX05BTUVfTUFTSyBcCisJCQkJIHwgTENfQUREUkVTU19NQVNLIFwKKwkJCQkgfCBMQ19URUxFUEhPTkVfTUFTSyBcCisJCQkJIHwgTENfTUVBU1VSRU1FTlRfTUFTSyBcCisJCQkJIHwgTENfSURFTlRJRklDQVRJT05fTUFTSyBcCisJCQkJICkKKworLyogUmV0dXJuIGEgZHVwbGljYXRlIG9mIHRoZSBzZXQgb2YgbG9jYWxlIGluIERBVEFTRVQuICBBbGwgdXNhZ2UKKyAgIGNvdW50ZXJzIGFyZSBpbmNyZWFzZWQgaWYgbmVjZXNzYXJ5LiAgKi8KK2V4dGVybiBfX2xvY2FsZV90IGR1cGxvY2FsZSAoX19sb2NhbGVfdCBfX2RhdGFzZXQpIF9fVEhST1c7CisKKy8qIEZyZWUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgbG9jYWxlIGRhdGFzZXQgcHJldmlvdXNseSByZXR1cm5lZAorICAgYnkgYSBjYWxsIHRvIGBzZXRsb2NhbGVfcicuICAqLworZXh0ZXJuIHZvaWQgZnJlZWxvY2FsZSAoX19sb2NhbGVfdCBfX2RhdGFzZXQpIF9fVEhST1c7CisKKy8qIFN3aXRjaCB0aGUgY3VycmVudCB0aHJlYWQncyBsb2NhbGUgdG8gREFUQVNFVC4KKyAgIElmIERBVEFTRVQgaXMgbnVsbCwgaW5zdGVhZCBqdXN0IHJldHVybiB0aGUgY3VycmVudCBzZXR0aW5nLgorICAgVGhlIHNwZWNpYWwgdmFsdWUgTENfR0xPQkFMX0xPQ0FMRSBpcyB0aGUgaW5pdGlhbCBzZXR0aW5nCisgICBmb3IgYWxsIHRocmVhZHMgYW5kIGNhbiBhbHNvIGJlIGluc3RhbGxlZCBhbnkgdGltZSwgbWVhbmluZworICAgdGhlIHRocmVhZCB1c2VzIHRoZSBnbG9iYWwgc2V0dGluZ3MgY29udHJvbGxlZCBieSBgc2V0bG9jYWxlJy4gICovCitleHRlcm4gX19sb2NhbGVfdCB1c2Vsb2NhbGUgKF9fbG9jYWxlX3QgX19kYXRhc2V0KSBfX1RIUk9XOworCisvKiBUaGlzIHZhbHVlIGNhbiBiZSBwYXNzZWQgdG8gYHVzZWxvY2FsZScgYW5kIG1heSBiZSByZXR1cm5lZCBieSBpdC4KKyAgIFBhc3NpbmcgdGhpcyB2YWx1ZSB0byBhbnkgb3RoZXIgZnVuY3Rpb24gaGFzIHVuZGVmaW5lZCBiZWhhdmlvci4gICovCisjIGRlZmluZSBMQ19HTE9CQUxfTE9DQUxFCSgoX19sb2NhbGVfdCkgLTFMKQorCisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGxvY2FsZS5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9tYWxsb2MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbWFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0M2Y3YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbWFsbG9jLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qIFByb3RvdHlwZXMgYW5kIGRlZmluaXRpb24gZm9yIG1hbGxvYyBpbXBsZW1lbnRhdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCwgMjAwMi0yMDA0LCAyMDA1LCAyMDA3LCAyMDA5LCAyMDExCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTUFMTE9DX0gKKyNkZWZpbmUgX01BTExPQ19IIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyMgZGVmaW5lIF9fbWFsbG9jX3B0cl90ICB2b2lkICoKKworLyogVXNlZCBieSBHTlUgbGliYyBpbnRlcm5hbHMuICovCisjZGVmaW5lIF9fbWFsbG9jX3NpemVfdCBzaXplX3QKKyNkZWZpbmUgX19tYWxsb2NfcHRyZGlmZl90IHB0cmRpZmZfdAorCisjaWZkZWYgX19HTlVDX18KKworIyBkZWZpbmUgX19NQUxMT0NfUChhcmdzKQlhcmdzIF9fVEhST1cKKy8qIFRoaXMgbWFjcm8gd2lsbCBiZSB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggbWlnaHQgdGFrZSBDKysgY2FsbGJhY2sKKyAgIGZ1bmN0aW9ucy4gICovCisjIGRlZmluZSBfX01BTExPQ19QTVQoYXJncykJYXJncworCisjIGlmZGVmIF9MSUJDCisjICBkZWZpbmUgX19NQUxMT0NfSE9PS19WT0xBVElMRQorIyAgZGVmaW5lIF9fTUFMTE9DX0RFUFJFQ0FURUQKKyMgZWxzZQorIyAgZGVmaW5lIF9fTUFMTE9DX0hPT0tfVk9MQVRJTEUgX192b2xhdGlsZQorIyAgZGVmaW5lIF9fTUFMTE9DX0RFUFJFQ0FURUQgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fCisjIGVuZGlmCisKKyNlbHNlCS8qIE5vdCBHQ0MuICAqLworCisjIGRlZmluZSBfX01BTExPQ19QKGFyZ3MpCWFyZ3MKKyMgZGVmaW5lIF9fTUFMTE9DX1BNVChhcmdzKQlhcmdzCisjIGRlZmluZSBfX01BTExPQ19IT09LX1ZPTEFUSUxFCisjIGRlZmluZSBfX01BTExPQ19ERVBSRUNBVEVEIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXworCisjZW5kaWYJLyogR0NDLiAgKi8KKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIEFsbG9jYXRlIFNJWkUgYnl0ZXMgb2YgbWVtb3J5LiAgKi8KK2V4dGVybiB2b2lkICptYWxsb2MgKHNpemVfdCBfX3NpemUpIF9fVEhST1cgX19hdHRyaWJ1dGVfbWFsbG9jX18gX193dXI7CisKKy8qIEFsbG9jYXRlIE5NRU1CIGVsZW1lbnRzIG9mIFNJWkUgYnl0ZXMgZWFjaCwgYWxsIGluaXRpYWxpemVkIHRvIDAuICAqLworZXh0ZXJuIHZvaWQgKmNhbGxvYyAoc2l6ZV90IF9fbm1lbWIsIHNpemVfdCBfX3NpemUpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfbWFsbG9jX18gX193dXI7CisKKy8qIFJlLWFsbG9jYXRlIHRoZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBibG9jayBpbiBfX3B0ciwgbWFraW5nIHRoZSBuZXcKKyAgIGJsb2NrIFNJWkUgYnl0ZXMgbG9uZy4gICovCisvKiBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBpcyBub3QgdXNlZCwgYmVjYXVzZSBpZiByZWFsbG9jIHJldHVybnMKKyAgIHRoZSBzYW1lIHBvaW50ZXIgdGhhdCB3YXMgcGFzc2VkIHRvIGl0LCBhbGlhc2luZyBuZWVkcyB0byBiZSBhbGxvd2VkCisgICBiZXR3ZWVuIG9iamVjdHMgcG9pbnRlZCBieSB0aGUgb2xkIGFuZCBuZXcgcG9pbnRlcnMuICAqLworZXh0ZXJuIHZvaWQgKnJlYWxsb2MgKHZvaWQgKl9fcHRyLCBzaXplX3QgX19zaXplKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3dhcm5fdW51c2VkX3Jlc3VsdF9fOworCisvKiBGcmVlIGEgYmxvY2sgYWxsb2NhdGVkIGJ5IGBtYWxsb2MnLCBgcmVhbGxvYycgb3IgYGNhbGxvYycuICAqLworZXh0ZXJuIHZvaWQgZnJlZSAodm9pZCAqX19wdHIpIF9fVEhST1c7CisKKy8qIEZyZWUgYSBibG9jayBhbGxvY2F0ZWQgYnkgYGNhbGxvYycuICovCitleHRlcm4gdm9pZCBjZnJlZSAodm9pZCAqX19wdHIpIF9fVEhST1c7CisKKy8qIEFsbG9jYXRlIFNJWkUgYnl0ZXMgYWxsb2NhdGVkIHRvIEFMSUdOTUVOVCBieXRlcy4gICovCitleHRlcm4gdm9pZCAqbWVtYWxpZ24gKHNpemVfdCBfX2FsaWdubWVudCwgc2l6ZV90IF9fc2l6ZSkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBfX3d1cjsKKworLyogQWxsb2NhdGUgU0laRSBieXRlcyBvbiBhIHBhZ2UgYm91bmRhcnkuICAqLworZXh0ZXJuIHZvaWQgKnZhbGxvYyAoc2l6ZV90IF9fc2l6ZSkgX19USFJPVyBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBfX3d1cjsKKworLyogRXF1aXZhbGVudCB0byB2YWxsb2MobWluaW11bS1wYWdlLXRoYXQtaG9sZHMobikpLCB0aGF0IGlzLCByb3VuZCB1cAorICAgX19zaXplIHRvIG5lYXJlc3QgcGFnZXNpemUuICovCitleHRlcm4gdm9pZCAqIHB2YWxsb2MgKHNpemVfdCBfX3NpemUpIF9fVEhST1cgX19hdHRyaWJ1dGVfbWFsbG9jX18gX193dXI7CisKKy8qIFVuZGVybHlpbmcgYWxsb2NhdGlvbiBmdW5jdGlvbjsgc3VjY2Vzc2l2ZSBjYWxscyBzaG91bGQgcmV0dXJuCisgICBjb250aWd1b3VzIHBpZWNlcyBvZiBtZW1vcnkuICAqLworZXh0ZXJuIHZvaWQgKigqX19tb3JlY29yZSkgKHB0cmRpZmZfdCBfX3NpemUpOworCisvKiBEZWZhdWx0IHZhbHVlIG9mIGBfX21vcmVjb3JlJy4gICovCitleHRlcm4gdm9pZCAqX19kZWZhdWx0X21vcmVjb3JlIChwdHJkaWZmX3QgX19zaXplKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX21hbGxvY19fOworCisvKiBTVklEMi9YUEcgbWFsbGluZm8gc3RydWN0dXJlICovCisKK3N0cnVjdCBtYWxsaW5mbworeworICBpbnQgYXJlbmE7ICAgIC8qIG5vbi1tbWFwcGVkIHNwYWNlIGFsbG9jYXRlZCBmcm9tIHN5c3RlbSAqLworICBpbnQgb3JkYmxrczsgIC8qIG51bWJlciBvZiBmcmVlIGNodW5rcyAqLworICBpbnQgc21ibGtzOyAgIC8qIG51bWJlciBvZiBmYXN0YmluIGJsb2NrcyAqLworICBpbnQgaGJsa3M7ICAgIC8qIG51bWJlciBvZiBtbWFwcGVkIHJlZ2lvbnMgKi8KKyAgaW50IGhibGtoZDsgICAvKiBzcGFjZSBpbiBtbWFwcGVkIHJlZ2lvbnMgKi8KKyAgaW50IHVzbWJsa3M7ICAvKiBtYXhpbXVtIHRvdGFsIGFsbG9jYXRlZCBzcGFjZSAqLworICBpbnQgZnNtYmxrczsgIC8qIHNwYWNlIGF2YWlsYWJsZSBpbiBmcmVlZCBmYXN0YmluIGJsb2NrcyAqLworICBpbnQgdW9yZGJsa3M7IC8qIHRvdGFsIGFsbG9jYXRlZCBzcGFjZSAqLworICBpbnQgZm9yZGJsa3M7IC8qIHRvdGFsIGZyZWUgc3BhY2UgKi8KKyAgaW50IGtlZXBjb3N0OyAvKiB0b3AtbW9zdCwgcmVsZWFzYWJsZSAodmlhIG1hbGxvY190cmltKSBzcGFjZSAqLworfTsKKworLyogUmV0dXJucyBhIGNvcHkgb2YgdGhlIHVwZGF0ZWQgY3VycmVudCBtYWxsaW5mby4gKi8KK2V4dGVybiBzdHJ1Y3QgbWFsbGluZm8gbWFsbGluZm8gKHZvaWQpIF9fVEhST1c7CisKKy8qIFNWSUQyL1hQRyBtYWxsb3B0IG9wdGlvbnMgKi8KKyNpZm5kZWYgTV9NWEZBU1QKKyMgZGVmaW5lIE1fTVhGQVNUICAxCS8qIG1heGltdW0gcmVxdWVzdCBzaXplIGZvciAiZmFzdGJpbnMiICovCisjZW5kaWYKKyNpZm5kZWYgTV9OTEJMS1MKKyMgZGVmaW5lIE1fTkxCTEtTICAyCS8qIFVOVVNFRCBpbiB0aGlzIG1hbGxvYyAqLworI2VuZGlmCisjaWZuZGVmIE1fR1JBSU4KKyMgZGVmaW5lIE1fR1JBSU4gICAzCS8qIFVOVVNFRCBpbiB0aGlzIG1hbGxvYyAqLworI2VuZGlmCisjaWZuZGVmIE1fS0VFUAorIyBkZWZpbmUgTV9LRUVQICAgIDQJLyogVU5VU0VEIGluIHRoaXMgbWFsbG9jICovCisjZW5kaWYKKworLyogbWFsbG9wdCBvcHRpb25zIHRoYXQgYWN0dWFsbHkgZG8gc29tZXRoaW5nICovCisjZGVmaW5lIE1fVFJJTV9USFJFU0hPTEQgICAgLTEKKyNkZWZpbmUgTV9UT1BfUEFEICAgICAgICAgICAtMgorI2RlZmluZSBNX01NQVBfVEhSRVNIT0xEICAgIC0zCisjZGVmaW5lIE1fTU1BUF9NQVggICAgICAgICAgLTQKKyNkZWZpbmUgTV9DSEVDS19BQ1RJT04gICAgICAtNQorI2RlZmluZSBNX1BFUlRVUkIJICAgIC02CisjZGVmaW5lIE1fQVJFTkFfVEVTVAkgICAgLTcKKyNkZWZpbmUgTV9BUkVOQV9NQVgJICAgIC04CisKKy8qIEdlbmVyYWwgU1ZJRC9YUEcgaW50ZXJmYWNlIHRvIHR1bmFibGUgcGFyYW1ldGVycy4gKi8KK2V4dGVybiBpbnQgbWFsbG9wdCAoaW50IF9fcGFyYW0sIGludCBfX3ZhbCkgX19USFJPVzsKKworLyogUmVsZWFzZSBhbGwgYnV0IF9fcGFkIGJ5dGVzIG9mIGZyZWVkIHRvcC1tb3N0IG1lbW9yeSBiYWNrIHRvIHRoZQorICAgc3lzdGVtLiBSZXR1cm4gMSBpZiBzdWNjZXNzZnVsLCBlbHNlIDAuICovCitleHRlcm4gaW50IG1hbGxvY190cmltIChzaXplX3QgX19wYWQpIF9fVEhST1c7CisKKy8qIFJlcG9ydCB0aGUgbnVtYmVyIG9mIHVzYWJsZSBhbGxvY2F0ZWQgYnl0ZXMgYXNzb2NpYXRlZCB3aXRoIGFsbG9jYXRlZAorICAgY2h1bmsgX19wdHIuICovCitleHRlcm4gc2l6ZV90IG1hbGxvY191c2FibGVfc2l6ZSAodm9pZCAqX19wdHIpIF9fVEhST1c7CisKKy8qIFByaW50cyBicmllZiBzdW1tYXJ5IHN0YXRpc3RpY3Mgb24gc3RkZXJyLiAqLworZXh0ZXJuIHZvaWQgbWFsbG9jX3N0YXRzICh2b2lkKSBfX1RIUk9XOworCisvKiBPdXRwdXQgaW5mb3JtYXRpb24gYWJvdXQgc3RhdGUgb2YgYWxsb2NhdG9yIHRvIHN0cmVhbSBGUC4gICovCitleHRlcm4gaW50IG1hbGxvY19pbmZvIChpbnQgX19vcHRpb25zLCBGSUxFICpfX2ZwKSBfX1RIUk9XOworCisvKiBSZWNvcmQgdGhlIHN0YXRlIG9mIGFsbCBtYWxsb2MgdmFyaWFibGVzIGluIGFuIG9wYXF1ZSBkYXRhIHN0cnVjdHVyZS4gKi8KK2V4dGVybiB2b2lkICptYWxsb2NfZ2V0X3N0YXRlICh2b2lkKSBfX1RIUk9XOworCisvKiBSZXN0b3JlIHRoZSBzdGF0ZSBvZiBhbGwgbWFsbG9jIHZhcmlhYmxlcyBmcm9tIGRhdGEgb2J0YWluZWQgd2l0aAorICAgbWFsbG9jX2dldF9zdGF0ZSgpLiAqLworZXh0ZXJuIGludCBtYWxsb2Nfc2V0X3N0YXRlICh2b2lkICpfX3B0cikgX19USFJPVzsKKworLyogQ2FsbGVkIG9uY2Ugd2hlbiBtYWxsb2MgaXMgaW5pdGlhbGl6ZWQ7IHJlZGVmaW5pbmcgdGhpcyB2YXJpYWJsZSBpbgorICAgdGhlIGFwcGxpY2F0aW9uIHByb3ZpZGVzIHRoZSBwcmVmZXJyZWQgd2F5IHRvIHNldCB1cCB0aGUgaG9vaworICAgcG9pbnRlcnMuICovCitleHRlcm4gdm9pZCAoKl9fTUFMTE9DX0hPT0tfVk9MQVRJTEUgX19tYWxsb2NfaW5pdGlhbGl6ZV9ob29rKSAodm9pZCkKKyAgICAgX19NQUxMT0NfREVQUkVDQVRFRDsKKy8qIEhvb2tzIGZvciBkZWJ1Z2dpbmcgYW5kIHVzZXItZGVmaW5lZCB2ZXJzaW9ucy4gKi8KK2V4dGVybiB2b2lkICgqX19NQUxMT0NfSE9PS19WT0xBVElMRSBfX2ZyZWVfaG9vaykgKHZvaWQgKl9fcHRyLAorCQkJCQkJICAgX19jb25zdCBfX21hbGxvY19wdHJfdCkKKyAgICAgX19NQUxMT0NfREVQUkVDQVRFRDsKK2V4dGVybiB2b2lkICooKl9fTUFMTE9DX0hPT0tfVk9MQVRJTEUgX19tYWxsb2NfaG9vaykgKHNpemVfdCBfX3NpemUsCisJCQkJCQkgICAgICBfX2NvbnN0IF9fbWFsbG9jX3B0cl90KQorICAgICBfX01BTExPQ19ERVBSRUNBVEVEOworZXh0ZXJuIHZvaWQgKigqX19NQUxMT0NfSE9PS19WT0xBVElMRSBfX3JlYWxsb2NfaG9vaykgKHZvaWQgKl9fcHRyLAorCQkJCQkJICAgICAgIHNpemVfdCBfX3NpemUsCisJCQkJCQkgICAgICAgX19jb25zdCBfX21hbGxvY19wdHJfdCkKKyAgICAgX19NQUxMT0NfREVQUkVDQVRFRDsKK2V4dGVybiB2b2lkICooKl9fTUFMTE9DX0hPT0tfVk9MQVRJTEUgX19tZW1hbGlnbl9ob29rKSAoc2l6ZV90IF9fYWxpZ25tZW50LAorCQkJCQkJCXNpemVfdCBfX3NpemUsCisJCQkJCQkJX19jb25zdCBfX21hbGxvY19wdHJfdCkKKyAgICAgX19NQUxMT0NfREVQUkVDQVRFRDsKK2V4dGVybiB2b2lkICgqX19NQUxMT0NfSE9PS19WT0xBVElMRSBfX2FmdGVyX21vcmVjb3JlX2hvb2spICh2b2lkKTsKKworLyogQWN0aXZhdGUgYSBzdGFuZGFyZCBzZXQgb2YgZGVidWdnaW5nIGhvb2tzLiAqLworZXh0ZXJuIHZvaWQgX19tYWxsb2NfY2hlY2tfaW5pdCAodm9pZCkgX19USFJPVyBfX01BTExPQ19ERVBSRUNBVEVEOworCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBtYWxsb2MuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9tYXRoLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL21hdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmMyMzUzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9tYXRoLmgKQEAgLTAsMCArMSw0ODYgQEAKKy8qIERlY2xhcmF0aW9ucyBmb3IgbWF0aCBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5MywgMTk5NS0xOTk5LCAyMDAxLCAyMDAyLCAyMDA0LCAyMDA2LCAyMDA5LCAyMDExCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCUlTTyBDOTkgU3RhbmRhcmQ6IDcuMTIgTWF0aGVtYXRpY3MJPG1hdGguaD4KKyAqLworCisjaWZuZGVmCV9NQVRIX0gKKyNkZWZpbmUJX01BVEhfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIEdldCBtYWNoaW5lLWRlcGVuZGVudCBIVUdFX1ZBTCB2YWx1ZSAocmV0dXJuZWQgb24gb3ZlcmZsb3cpLgorICAgT24gYWxsIElFRUU3NTQgbWFjaGluZXMsIHRoaXMgaXMgK0luZmluaXR5LiAgKi8KKyNpbmNsdWRlIDxiaXRzL2h1Z2VfdmFsLmg+CisjaWZkZWYgX19VU0VfSVNPQzk5CisjIGluY2x1ZGUgPGJpdHMvaHVnZV92YWxmLmg+CisjIGluY2x1ZGUgPGJpdHMvaHVnZV92YWxsLmg+CisKKy8qIEdldCBtYWNoaW5lLWRlcGVuZGVudCBJTkZJTklUWSB2YWx1ZS4gICovCisjIGluY2x1ZGUgPGJpdHMvaW5mLmg+CisKKy8qIEdldCBtYWNoaW5lLWRlcGVuZGVudCBOQU4gdmFsdWUgKHJldHVybmVkIGZvciBzb21lIGRvbWFpbiBlcnJvcnMpLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy9uYW4uaD4KKyNlbmRpZiAvKiBfX1VTRV9JU09DOTkgKi8KKworLyogR2V0IGdlbmVyYWwgYW5kIElTTyBDOTkgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLworI2luY2x1ZGUgPGJpdHMvbWF0aGRlZi5oPgorCisvKiBUaGUgZmlsZSA8Yml0cy9tYXRoY2FsbHMuaD4gY29udGFpbnMgdGhlIHByb3RvdHlwZXMgZm9yIGFsbCB0aGUKKyAgIGFjdHVhbCBtYXRoIGZ1bmN0aW9ucy4gIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBmb3IgdGhvc2UgcHJvdG90eXBlcywKKyAgIHNvIHdlIGNhbiBlYXNpbHkgZGVjbGFyZSBlYWNoIGZ1bmN0aW9uIGFzIGJvdGggYG5hbWUnIGFuZCBgX19uYW1lJywKKyAgIGFuZCBjYW4gZGVjbGFyZSB0aGUgZmxvYXQgdmVyc2lvbnMgYG5hbWVmJyBhbmQgYF9fbmFtZWYnLiAgKi8KKworI2RlZmluZSBfX01BVEhDQUxMKGZ1bmN0aW9uLHN1ZmZpeCwgYXJncykJXAorICBfX01BVEhERUNMIChfTWRvdWJsZV8sZnVuY3Rpb24sc3VmZml4LCBhcmdzKQorI2RlZmluZSBfX01BVEhERUNMKHR5cGUsIGZ1bmN0aW9uLHN1ZmZpeCwgYXJncykgXAorICBfX01BVEhERUNMXzEodHlwZSwgZnVuY3Rpb24sc3VmZml4LCBhcmdzKTsgXAorICBfX01BVEhERUNMXzEodHlwZSwgX19DT05DQVQoX18sZnVuY3Rpb24pLHN1ZmZpeCwgYXJncykKKyNkZWZpbmUgX19NQVRIQ0FMTFgoZnVuY3Rpb24sc3VmZml4LCBhcmdzLCBhdHRyaWIpCVwKKyAgX19NQVRIREVDTFggKF9NZG91YmxlXyxmdW5jdGlvbixzdWZmaXgsIGFyZ3MsIGF0dHJpYikKKyNkZWZpbmUgX19NQVRIREVDTFgodHlwZSwgZnVuY3Rpb24sc3VmZml4LCBhcmdzLCBhdHRyaWIpIFwKKyAgX19NQVRIREVDTF8xKHR5cGUsIGZ1bmN0aW9uLHN1ZmZpeCwgYXJncykgX19hdHRyaWJ1dGVfXyAoYXR0cmliKTsgXAorICBfX01BVEhERUNMXzEodHlwZSwgX19DT05DQVQoX18sZnVuY3Rpb24pLHN1ZmZpeCwgYXJncykgX19hdHRyaWJ1dGVfXyAoYXR0cmliKQorI2RlZmluZSBfX01BVEhERUNMXzEodHlwZSwgZnVuY3Rpb24sc3VmZml4LCBhcmdzKSBcCisgIGV4dGVybiB0eXBlIF9fTUFUSF9QUkVDTkFNRShmdW5jdGlvbixzdWZmaXgpIGFyZ3MgX19USFJPVworCisjZGVmaW5lIF9NZG91YmxlXwkJZG91YmxlCisjZGVmaW5lIF9fTUFUSF9QUkVDTkFNRShuYW1lLHIpCV9fQ09OQ0FUKG5hbWUscikKKyNkZWZpbmUgX01kb3VibGVfQkVHSU5fTkFNRVNQQUNFIF9fQkVHSU5fTkFNRVNQQUNFX1NURAorI2RlZmluZSBfTWRvdWJsZV9FTkRfTkFNRVNQQUNFICAgX19FTkRfTkFNRVNQQUNFX1NURAorI2luY2x1ZGUgPGJpdHMvbWF0aGNhbGxzLmg+CisjdW5kZWYJX01kb3VibGVfCisjdW5kZWYgX01kb3VibGVfQkVHSU5fTkFNRVNQQUNFCisjdW5kZWYgX01kb3VibGVfRU5EX05BTUVTUEFDRQorI3VuZGVmCV9fTUFUSF9QUkVDTkFNRQorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CisKKworLyogSW5jbHVkZSB0aGUgZmlsZSBvZiBkZWNsYXJhdGlvbnMgYWdhaW4sIHRoaXMgdGltZSB1c2luZyBgZmxvYXQnCisgICBpbnN0ZWFkIG9mIGBkb3VibGUnIGFuZCBhcHBlbmRpbmcgZiB0byBlYWNoIGZ1bmN0aW9uIG5hbWUuICAqLworCisjIGlmbmRlZiBfTWZsb2F0XworIyAgZGVmaW5lIF9NZmxvYXRfCQlmbG9hdAorIyBlbmRpZgorIyBkZWZpbmUgX01kb3VibGVfCQlfTWZsb2F0XworIyBpZmRlZiBfX1NURENfXworIyAgZGVmaW5lIF9fTUFUSF9QUkVDTkFNRShuYW1lLHIpIG5hbWUjI2YjI3IKKyMgZWxzZQorIyAgZGVmaW5lIF9fTUFUSF9QUkVDTkFNRShuYW1lLHIpIG5hbWUvKiovZi8qKi9yCisjIGVuZGlmCisjIGRlZmluZSBfTWRvdWJsZV9CRUdJTl9OQU1FU1BBQ0UgX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisjIGRlZmluZSBfTWRvdWJsZV9FTkRfTkFNRVNQQUNFICAgX19FTkRfTkFNRVNQQUNFX0M5OQorIyBpbmNsdWRlIDxiaXRzL21hdGhjYWxscy5oPgorIyB1bmRlZglfTWRvdWJsZV8KKyMgdW5kZWYgX01kb3VibGVfQkVHSU5fTkFNRVNQQUNFCisjIHVuZGVmIF9NZG91YmxlX0VORF9OQU1FU1BBQ0UKKyMgdW5kZWYJX19NQVRIX1BSRUNOQU1FCisKKyMgaWYgKF9fU1REQ19fIC0gMCB8fCBfX0dOVUNfXyAtIDApIFwKKyAgICAgJiYgKCEoZGVmaW5lZCBfX05PX0xPTkdfRE9VQkxFX01BVEggJiYgZGVmaW5lZCBfTElCQykgXAorCSB8fCBkZWZpbmVkIF9fTERCTF9DT01QQVQpCisjICBpZmRlZiBfX0xEQkxfQ09NUEFUCisKKyMgICBpZmRlZiBfX1VTRV9JU09DOTkKK2V4dGVybiBmbG9hdCBfX25sZGJsX25leHR0b3dhcmRmIChmbG9hdCBfX3gsIGxvbmcgZG91YmxlIF9feSkKKwkJCQkgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworIyAgICBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChuZXh0dG93YXJkZiwgKGZsb2F0IF9feCwgbG9uZyBkb3VibGUgX195KSwKKwkJCSAgICAgX19ubGRibF9uZXh0dG93YXJkZikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAobmV4dHRvd2FyZCwgKGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSksCisJCQkgICAgICBuZXh0YWZ0ZXIpIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAobmV4dHRvd2FyZGwsCisJCQkJICAgKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KSwKKwkJCQkgICBuZXh0YWZ0ZXIpIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCBfX0xEQkxfQ09NUEFUIHx8IGRlZmluZWQgX19OT19MT05HX0RPVUJMRV9NQVRICisKKyMgICB1bmRlZiBfX01BVEhERUNMXzEKKyMgICBkZWZpbmUgX19NQVRIREVDTF8yKHR5cGUsIGZ1bmN0aW9uLHN1ZmZpeCwgYXJncywgYWxpYXMpIFwKKyAgZXh0ZXJuIHR5cGUgX19SRURJUkVDVF9OVEgoX19NQVRIX1BSRUNOQU1FKGZ1bmN0aW9uLHN1ZmZpeCksIFwKKwkJCSAgICAgYXJncywgYWxpYXMpCisjICAgZGVmaW5lIF9fTUFUSERFQ0xfMSh0eXBlLCBmdW5jdGlvbixzdWZmaXgsIGFyZ3MpIFwKKyAgX19NQVRIREVDTF8yKHR5cGUsIGZ1bmN0aW9uLHN1ZmZpeCwgYXJncywgX19DT05DQVQoZnVuY3Rpb24sc3VmZml4KSkKKyMgIGVuZGlmCisKKy8qIEluY2x1ZGUgdGhlIGZpbGUgb2YgZGVjbGFyYXRpb25zIGFnYWluLCB0aGlzIHRpbWUgdXNpbmcgYGxvbmcgZG91YmxlJworICAgaW5zdGVhZCBvZiBgZG91YmxlJyBhbmQgYXBwZW5kaW5nIGwgdG8gZWFjaCBmdW5jdGlvbiBuYW1lLiAgKi8KKworIyAgaWZuZGVmIF9NbG9uZ19kb3VibGVfCisjICAgZGVmaW5lIF9NbG9uZ19kb3VibGVfCWxvbmcgZG91YmxlCisjICBlbmRpZgorIyAgZGVmaW5lIF9NZG91YmxlXwkJX01sb25nX2RvdWJsZV8KKyMgIGlmZGVmIF9fU1REQ19fCisjICAgZGVmaW5lIF9fTUFUSF9QUkVDTkFNRShuYW1lLHIpIG5hbWUjI2wjI3IKKyMgIGVsc2UKKyMgICBkZWZpbmUgX19NQVRIX1BSRUNOQU1FKG5hbWUscikgbmFtZS8qKi9sLyoqL3IKKyMgIGVuZGlmCisjICBkZWZpbmUgX01kb3VibGVfQkVHSU5fTkFNRVNQQUNFIF9fQkVHSU5fTkFNRVNQQUNFX0M5OQorIyAgZGVmaW5lIF9NZG91YmxlX0VORF9OQU1FU1BBQ0UgICBfX0VORF9OQU1FU1BBQ0VfQzk5CisjICBkZWZpbmUgX19NQVRIX0RFQ0xBUkVfTERPVUJMRSAgIDEKKyMgIGluY2x1ZGUgPGJpdHMvbWF0aGNhbGxzLmg+CisjICB1bmRlZiBfTWRvdWJsZV8KKyMgIHVuZGVmIF9NZG91YmxlX0JFR0lOX05BTUVTUEFDRQorIyAgdW5kZWYgX01kb3VibGVfRU5EX05BTUVTUEFDRQorIyAgdW5kZWYgX19NQVRIX1BSRUNOQU1FCisKKyMgZW5kaWYgLyogX19TVERDX18gfHwgX19HTlVDX18gKi8KKworI2VuZGlmCS8qIFVzZSBtaXNjIG9yIElTTyBDOTkuICAqLworI3VuZGVmCV9fTUFUSERFQ0xfMQorI3VuZGVmCV9fTUFUSERFQ0wKKyN1bmRlZglfX01BVEhDQUxMCisKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisvKiBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgYnkgYGdhbW1hJyBhbmQgYGxnYW1tYScuICAqLworZXh0ZXJuIGludCBzaWduZ2FtOworI2VuZGlmCisKKworLyogSVNPIEM5OSBkZWZpbmVzIHNvbWUgZ2VuZXJpYyBtYWNyb3Mgd2hpY2ggd29yayBvbiBhbnkgZGF0YSB0eXBlLiAgKi8KKyNpZmRlZiBfX1VTRV9JU09DOTkKKworLyogR2V0IHRoZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgdmFsdWVzIGRlc2NyaWJpbmcgdGhlIGZsb2F0aW5nLXBvaW50CisgICBldmFsdWF0aW9uLiAgVGhlIGZvbGxvd2luZyBzeW1ib2xzIHdpbGwgZ2V0IGRlZmluZWQ6CisKKyAgICBmbG9hdF90CWZsb2F0aW5nLXBvaW50IHR5cGUgYXQgbGVhc3QgYXMgd2lkZSBhcyBgZmxvYXQnIHVzZWQKKwkJdG8gZXZhbHVhdGUgYGZsb2F0JyBleHByZXNzaW9ucworICAgIGRvdWJsZV90CWZsb2F0aW5nLXBvaW50IHR5cGUgYXQgbGVhc3QgYXMgd2lkZSBhcyBgZG91YmxlJyB1c2VkCisJCXRvIGV2YWx1YXRlIGBkb3VibGUnIGV4cHJlc3Npb25zCisKKyAgICBGTFRfRVZBTF9NRVRIT0QKKwkJRGVmaW5lZCB0bworCQkgIDAJaWYgYGZsb2F0X3QnIGlzIGBmbG9hdCcgYW5kIGBkb3VibGVfdCcgaXMgYGRvdWJsZScKKwkJICAxCWlmIGBmbG9hdF90JyBhbmQgYGRvdWJsZV90JyBhcmUgYGRvdWJsZScKKwkJICAyCWlmIGBmbG9hdF90JyBhbmQgYGRvdWJsZV90JyBhcmUgYGxvbmcgZG91YmxlJworCQkgIGVsc2UJYGZsb2F0X3QnIGFuZCBgZG91YmxlX3QnIGFyZSB1bnNwZWNpZmllZAorCisgICAgSU5GSU5JVFkJcmVwcmVzZW50YXRpb24gb2YgdGhlIGluZmluaXR5IHZhbHVlIG9mIHR5cGUgYGZsb2F0JworCisgICAgRlBfRkFTVF9GTUEKKyAgICBGUF9GQVNUX0ZNQUYKKyAgICBGUF9GQVNUX0ZNQUwKKwkJSWYgZGVmaW5lZCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgYGZtYScgZnVuY3Rpb24KKwkJZ2VuZXJhbGx5IGV4ZWN1dGVzIGFib3V0IGFzIGZhc3QgYXMgYSBtdWx0aXBseSBhbmQgYW4gYWRkLgorCQlUaGlzIG1hY3JvIGlzIGRlZmluZWQgb25seSBpZmYgdGhlIGBmbWEnIGZ1bmN0aW9uIGlzCisJCWltcGxlbWVudGVkIGRpcmVjdGx5IHdpdGggYSBoYXJkd2FyZSBtdWx0aXBseS1hZGQgaW5zdHJ1Y3Rpb25zLgorCisgICAgRlBfSUxPR0IwCUV4cGFuZHMgdG8gYSB2YWx1ZSByZXR1cm5lZCBieSBgaWxvZ2IgKDAuMCknLgorICAgIEZQX0lMT0dCTkFOCUV4cGFuZHMgdG8gYSB2YWx1ZSByZXR1cm5lZCBieSBgaWxvZ2IgKE5BTiknLgorCisgICAgREVDSU1BTF9ESUcJTnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIHN1cHBvcnRlZCBieSBjb252ZXJzaW9uIGJldHdlZW4KKwkJZGVjaW1hbCBhbmQgYWxsIGludGVybmFsIGZsb2F0aW5nLXBvaW50IGZvcm1hdHMuCisKKyovCisKKy8qIEFsbCBmbG9hdGluZy1wb2ludCBudW1iZXJzIGNhbiBiZSBwdXQgaW4gb25lIG9mIHRoZXNlIGNhdGVnb3JpZXMuICAqLworZW51bQorICB7CisgICAgRlBfTkFOLAorIyBkZWZpbmUgRlBfTkFOIEZQX05BTgorICAgIEZQX0lORklOSVRFLAorIyBkZWZpbmUgRlBfSU5GSU5JVEUgRlBfSU5GSU5JVEUKKyAgICBGUF9aRVJPLAorIyBkZWZpbmUgRlBfWkVSTyBGUF9aRVJPCisgICAgRlBfU1VCTk9STUFMLAorIyBkZWZpbmUgRlBfU1VCTk9STUFMIEZQX1NVQk5PUk1BTAorICAgIEZQX05PUk1BTAorIyBkZWZpbmUgRlBfTk9STUFMIEZQX05PUk1BTAorICB9OworCisvKiBSZXR1cm4gbnVtYmVyIG9mIGNsYXNzaWZpY2F0aW9uIGFwcHJvcHJpYXRlIGZvciBYLiAgKi8KKyMgaWZkZWYgX19OT19MT05HX0RPVUJMRV9NQVRICisjICBkZWZpbmUgZnBjbGFzc2lmeSh4KSBcCisgICAgIChzaXplb2YgKHgpID09IHNpemVvZiAoZmxvYXQpID8gX19mcGNsYXNzaWZ5ZiAoeCkgOiBfX2ZwY2xhc3NpZnkgKHgpKQorIyBlbHNlCisjICBkZWZpbmUgZnBjbGFzc2lmeSh4KSBcCisgICAgIChzaXplb2YgKHgpID09IHNpemVvZiAoZmxvYXQpCQkJCQkgICAgICBcCisgICAgICA/IF9fZnBjbGFzc2lmeWYgKHgpCQkJCQkJICAgICAgXAorICAgICAgOiBzaXplb2YgKHgpID09IHNpemVvZiAoZG91YmxlKQkJCQkJICAgICAgXAorICAgICAgPyBfX2ZwY2xhc3NpZnkgKHgpIDogX19mcGNsYXNzaWZ5bCAoeCkpCisjIGVuZGlmCisKKy8qIFJldHVybiBub256ZXJvIHZhbHVlIGlmIHNpZ24gb2YgWCBpcyBuZWdhdGl2ZS4gICovCisjIGlmZGVmIF9fTk9fTE9OR19ET1VCTEVfTUFUSAorIyAgZGVmaW5lIHNpZ25iaXQoeCkgXAorICAgICAoc2l6ZW9mICh4KSA9PSBzaXplb2YgKGZsb2F0KSA/IF9fc2lnbmJpdGYgKHgpIDogX19zaWduYml0ICh4KSkKKyMgZWxzZQorIyAgZGVmaW5lIHNpZ25iaXQoeCkgXAorICAgICAoc2l6ZW9mICh4KSA9PSBzaXplb2YgKGZsb2F0KQkJCQkJICAgICAgXAorICAgICAgPyBfX3NpZ25iaXRmICh4KQkJCQkJCQkgICAgICBcCisgICAgICA6IHNpemVvZiAoeCkgPT0gc2l6ZW9mIChkb3VibGUpCQkJCQkgICAgICBcCisgICAgICA/IF9fc2lnbmJpdCAoeCkgOiBfX3NpZ25iaXRsICh4KSkKKyMgZW5kaWYKKworLyogUmV0dXJuIG5vbnplcm8gdmFsdWUgaWYgWCBpcyBub3QgKy1JbmYgb3IgTmFOLiAgKi8KKyMgaWZkZWYgX19OT19MT05HX0RPVUJMRV9NQVRICisjICBkZWZpbmUgaXNmaW5pdGUoeCkgXAorICAgICAoc2l6ZW9mICh4KSA9PSBzaXplb2YgKGZsb2F0KSA/IF9fZmluaXRlZiAoeCkgOiBfX2Zpbml0ZSAoeCkpCisjIGVsc2UKKyMgIGRlZmluZSBpc2Zpbml0ZSh4KSBcCisgICAgIChzaXplb2YgKHgpID09IHNpemVvZiAoZmxvYXQpCQkJCQkgICAgICBcCisgICAgICA/IF9fZmluaXRlZiAoeCkJCQkJCQkJICAgICAgXAorICAgICAgOiBzaXplb2YgKHgpID09IHNpemVvZiAoZG91YmxlKQkJCQkJICAgICAgXAorICAgICAgPyBfX2Zpbml0ZSAoeCkgOiBfX2Zpbml0ZWwgKHgpKQorIyBlbmRpZgorCisvKiBSZXR1cm4gbm9uemVybyB2YWx1ZSBpZiBYIGlzIG5laXRoZXIgemVybywgc3Vibm9ybWFsLCBJbmYsIG5vciBOYU4uICAqLworIyBkZWZpbmUgaXNub3JtYWwoeCkgKGZwY2xhc3NpZnkgKHgpID09IEZQX05PUk1BTCkKKworLyogUmV0dXJuIG5vbnplcm8gdmFsdWUgaWYgWCBpcyBhIE5hTi4gIFdlIGNvdWxkIHVzZSBgZnBjbGFzc2lmeScgYnV0CisgICB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBmdW5jdGlvbnMgYF9faXNuYW4nIGFuZCBpdCBpcyBmYXN0ZXIuICAqLworIyBpZmRlZiBfX05PX0xPTkdfRE9VQkxFX01BVEgKKyMgIGRlZmluZSBpc25hbih4KSBcCisgICAgIChzaXplb2YgKHgpID09IHNpemVvZiAoZmxvYXQpID8gX19pc25hbmYgKHgpIDogX19pc25hbiAoeCkpCisjIGVsc2UKKyMgIGRlZmluZSBpc25hbih4KSBcCisgICAgIChzaXplb2YgKHgpID09IHNpemVvZiAoZmxvYXQpCQkJCQkgICAgICBcCisgICAgICA/IF9faXNuYW5mICh4KQkJCQkJCQkgICAgICBcCisgICAgICA6IHNpemVvZiAoeCkgPT0gc2l6ZW9mIChkb3VibGUpCQkJCQkgICAgICBcCisgICAgICA/IF9faXNuYW4gKHgpIDogX19pc25hbmwgKHgpKQorIyBlbmRpZgorCisvKiBSZXR1cm4gbm9uemVybyB2YWx1ZSBpZiBYIGlzIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGluZmluaXR5LiAgKi8KKyMgaWZkZWYgX19OT19MT05HX0RPVUJMRV9NQVRICisjICBkZWZpbmUgaXNpbmYoeCkgXAorICAgICAoc2l6ZW9mICh4KSA9PSBzaXplb2YgKGZsb2F0KSA/IF9faXNpbmZmICh4KSA6IF9faXNpbmYgKHgpKQorIyBlbHNlCisjICBkZWZpbmUgaXNpbmYoeCkgXAorICAgICAoc2l6ZW9mICh4KSA9PSBzaXplb2YgKGZsb2F0KQkJCQkJICAgICAgXAorICAgICAgPyBfX2lzaW5mZiAoeCkJCQkJCQkJICAgICAgXAorICAgICAgOiBzaXplb2YgKHgpID09IHNpemVvZiAoZG91YmxlKQkJCQkJICAgICAgXAorICAgICAgPyBfX2lzaW5mICh4KSA6IF9faXNpbmZsICh4KSkKKyMgZW5kaWYKKworLyogQml0bWFza3MgZm9yIHRoZSBtYXRoX2VycmhhbmRsaW5nIG1hY3JvLiAgKi8KKyMgZGVmaW5lIE1BVEhfRVJSTk8JMQkvKiBlcnJubyBzZXQgYnkgbWF0aCBmdW5jdGlvbnMuICAqLworIyBkZWZpbmUgTUFUSF9FUlJFWENFUFQJMgkvKiBFeGNlcHRpb25zIHJhaXNlZCBieSBtYXRoIGZ1bmN0aW9ucy4gICovCisKKy8qIEJ5IGRlZmF1bHQgYWxsIGZ1bmN0aW9ucyBzdXBwb3J0IGJvdGggZXJybm8gYW5kIGV4Y2VwdGlvbiBoYW5kbGluZy4KKyAgIEluIGdjYydzIGZhc3QgbWF0aCBtb2RlIGFuZCBpZiBpbmxpbmUgZnVuY3Rpb25zIGFyZSBkZWZpbmVkIHRoaXMKKyAgIG1pZ2h0IG5vdCBiZSB0cnVlLiAgKi8KKyMgaWZuZGVmIF9fRkFTVF9NQVRIX18KKyMgIGRlZmluZSBtYXRoX2VycmhhbmRsaW5nCShNQVRIX0VSUk5PIHwgTUFUSF9FUlJFWENFUFQpCisjIGVuZGlmCisKKyNlbmRpZiAvKiBVc2UgSVNPIEM5OS4gICovCisKKyNpZmRlZglfX1VTRV9NSVNDCisvKiBTdXBwb3J0IGZvciB2YXJpb3VzIGRpZmZlcmVudCBzdGFuZGFyZCBlcnJvciBoYW5kbGluZyBiZWhhdmlvcnMuICAqLwordHlwZWRlZiBlbnVtCit7CisgIF9JRUVFXyA9IC0xLAkvKiBBY2NvcmRpbmcgdG8gSUVFRSA3NTQvSUVFRSA4NTQuICAqLworICBfU1ZJRF8sCS8qIEFjY29yZGluZyB0byBTeXN0ZW0gViwgcmVsZWFzZSA0LiAgKi8KKyAgX1hPUEVOXywJLyogTm93YWRheXMgYWxzbyBVbml4OTguICAqLworICBfUE9TSVhfLAorICBfSVNPQ18JLyogQWN0dWFsbHkgdGhpcyBpcyBJU08gQzk5LiAgKi8KK30gX0xJQl9WRVJTSU9OX1RZUEU7CisKKy8qIFRoaXMgdmFyaWFibGUgY2FuIGJlIGNoYW5nZWQgYXQgcnVuLXRpbWUgdG8gYW55IG9mIHRoZSB2YWx1ZXMgYWJvdmUgdG8KKyAgIGFmZmVjdCBmbG9hdGluZyBwb2ludCBlcnJvciBoYW5kbGluZyBiZWhhdmlvciAoaXQgbWF5IGFsc28gYmUgbmVjZXNzYXJ5CisgICB0byBjaGFuZ2UgdGhlIGhhcmR3YXJlIEZQVSBleGNlcHRpb24gc2V0dGluZ3MpLiAgKi8KK2V4dGVybiBfTElCX1ZFUlNJT05fVFlQRSBfTElCX1ZFUlNJT047CisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfU1ZJRAorLyogSW4gU1ZJRCBlcnJvciBoYW5kbGluZywgYG1hdGhlcnInIGlzIGNhbGxlZCB3aXRoIHRoaXMgZGVzY3JpcHRpb24KKyAgIG9mIHRoZSBleGNlcHRpb25hbCBjb25kaXRpb24uCisKKyAgIFdlIGhhdmUgYSBwcm9ibGVtIHdoZW4gdXNpbmcgQysrIHNpbmNlIGBleGNlcHRpb24nIGlzIGEgcmVzZXJ2ZWQKKyAgIG5hbWUgaW4gQysrLiAgKi8KKyMgaWZkZWYgX19jcGx1c3BsdXMKK3N0cnVjdCBfX2V4Y2VwdGlvbgorIyBlbHNlCitzdHJ1Y3QgZXhjZXB0aW9uCisjIGVuZGlmCisgIHsKKyAgICBpbnQgdHlwZTsKKyAgICBjaGFyICpuYW1lOworICAgIGRvdWJsZSBhcmcxOworICAgIGRvdWJsZSBhcmcyOworICAgIGRvdWJsZSByZXR2YWw7CisgIH07CisKKyMgaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiBpbnQgbWF0aGVyciAoc3RydWN0IF9fZXhjZXB0aW9uICpfX2V4YykgdGhyb3cgKCk7CisjIGVsc2UKK2V4dGVybiBpbnQgbWF0aGVyciAoc3RydWN0IGV4Y2VwdGlvbiAqX19leGMpOworIyBlbmRpZgorCisjIGRlZmluZSBYX1RMT1NTCTEuNDE0ODQ3NTUwNDA1Njg4MDAwMDBlKzE2CisKKy8qIFR5cGVzIG9mIGV4Y2VwdGlvbnMgaW4gdGhlIGB0eXBlJyBmaWVsZC4gICovCisjIGRlZmluZSBET01BSU4JCTEKKyMgZGVmaW5lIFNJTkcJCTIKKyMgZGVmaW5lIE9WRVJGTE9XCTMKKyMgZGVmaW5lIFVOREVSRkxPVwk0CisjIGRlZmluZSBUTE9TUwkJNQorIyBkZWZpbmUgUExPU1MJCTYKKworLyogU1ZJRCBtb2RlIHNwZWNpZmllcyByZXR1cm5pbmcgdGhpcyBsYXJnZSB2YWx1ZSBpbnN0ZWFkIG9mIGluZmluaXR5LiAgKi8KKyMgZGVmaW5lIEhVR0UJCTMuNDAyODIzNDdlKzM4RgorCisjZWxzZQkvKiAhU1ZJRCAqLworCisjIGlmZGVmIF9fVVNFX1hPUEVOCisvKiBYL09wZW4gd2FudHMgYW5vdGhlciBzdHJhbmdlIGNvbnN0YW50LiAgKi8KKyMgIGRlZmluZSBNQVhGTE9BVAkzLjQwMjgyMzQ3ZSszOEYKKyMgZW5kaWYKKworI2VuZGlmCS8qIFNWSUQgKi8KKworCisvKiBTb21lIHVzZWZ1bCBjb25zdGFudHMuICAqLworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKyMgZGVmaW5lIE1fRQkJMi43MTgyODE4Mjg0NTkwNDUyMzU0CS8qIGUgKi8KKyMgZGVmaW5lIE1fTE9HMkUJMS40NDI2OTUwNDA4ODg5NjM0MDc0CS8qIGxvZ18yIGUgKi8KKyMgZGVmaW5lIE1fTE9HMTBFCTAuNDM0Mjk0NDgxOTAzMjUxODI3NjUJLyogbG9nXzEwIGUgKi8KKyMgZGVmaW5lIE1fTE4yCQkwLjY5MzE0NzE4MDU1OTk0NTMwOTQyCS8qIGxvZ19lIDIgKi8KKyMgZGVmaW5lIE1fTE4xMAkJMi4zMDI1ODUwOTI5OTQwNDU2ODQwMgkvKiBsb2dfZSAxMCAqLworIyBkZWZpbmUgTV9QSQkJMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgkvKiBwaSAqLworIyBkZWZpbmUgTV9QSV8yCQkxLjU3MDc5NjMyNjc5NDg5NjYxOTIzCS8qIHBpLzIgKi8KKyMgZGVmaW5lIE1fUElfNAkJMC43ODUzOTgxNjMzOTc0NDgzMDk2MgkvKiBwaS80ICovCisjIGRlZmluZSBNXzFfUEkJCTAuMzE4MzA5ODg2MTgzNzkwNjcxNTQJLyogMS9waSAqLworIyBkZWZpbmUgTV8yX1BJCQkwLjYzNjYxOTc3MjM2NzU4MTM0MzA4CS8qIDIvcGkgKi8KKyMgZGVmaW5lIE1fMl9TUVJUUEkJMS4xMjgzNzkxNjcwOTU1MTI1NzM5MAkvKiAyL3NxcnQocGkpICovCisjIGRlZmluZSBNX1NRUlQyCTEuNDE0MjEzNTYyMzczMDk1MDQ4ODAJLyogc3FydCgyKSAqLworIyBkZWZpbmUgTV9TUVJUMV8yCTAuNzA3MTA2NzgxMTg2NTQ3NTI0NDAJLyogMS9zcXJ0KDIpICovCisjZW5kaWYKKworLyogVGhlIGFib3ZlIGNvbnN0YW50cyBhcmUgbm90IGFkZXF1YXRlIGZvciBjb21wdXRhdGlvbiB1c2luZyBgbG9uZyBkb3VibGUncy4KKyAgIFRoZXJlZm9yZSB3ZSBwcm92aWRlIGFzIGFuIGV4dGVuc2lvbiBjb25zdGFudHMgd2l0aCBzaW1pbGFyIG5hbWVzIGFzIGEKKyAgIEdOVSBleHRlbnNpb24uICBQcm92aWRlIGVub3VnaCBkaWdpdHMgZm9yIHRoZSAxMjgtYml0IElFRUUgcXVhZC4gICovCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBNX0VsCQkyLjcxODI4MTgyODQ1OTA0NTIzNTM2MDI4NzQ3MTM1MjY2MjVMICAvKiBlICovCisjIGRlZmluZSBNX0xPRzJFbAkxLjQ0MjY5NTA0MDg4ODk2MzQwNzM1OTkyNDY4MTAwMTg5MjFMICAvKiBsb2dfMiBlICovCisjIGRlZmluZSBNX0xPRzEwRWwJMC40MzQyOTQ0ODE5MDMyNTE4Mjc2NTExMjg5MTg5MTY2MDUxTCAgLyogbG9nXzEwIGUgKi8KKyMgZGVmaW5lIE1fTE4ybAkJMC42OTMxNDcxODA1NTk5NDUzMDk0MTcyMzIxMjE0NTgxNzY2TCAgLyogbG9nX2UgMiAqLworIyBkZWZpbmUgTV9MTjEwbAkyLjMwMjU4NTA5Mjk5NDA0NTY4NDAxNzk5MTQ1NDY4NDM2NDJMICAvKiBsb2dfZSAxMCAqLworIyBkZWZpbmUgTV9QSWwJCTMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NTAyOUwgIC8qIHBpICovCisjIGRlZmluZSBNX1BJXzJsCTEuNTcwNzk2MzI2Nzk0ODk2NjE5MjMxMzIxNjkxNjM5NzUxNEwgIC8qIHBpLzIgKi8KKyMgZGVmaW5lIE1fUElfNGwJMC43ODUzOTgxNjMzOTc0NDgzMDk2MTU2NjA4NDU4MTk4NzU3TCAgLyogcGkvNCAqLworIyBkZWZpbmUgTV8xX1BJbAkwLjMxODMwOTg4NjE4Mzc5MDY3MTUzNzc2NzUyNjc0NTAyODdMICAvKiAxL3BpICovCisjIGRlZmluZSBNXzJfUElsCTAuNjM2NjE5NzcyMzY3NTgxMzQzMDc1NTM1MDUzNDkwMDU3NEwgIC8qIDIvcGkgKi8KKyMgZGVmaW5lIE1fMl9TUVJUUElsCTEuMTI4Mzc5MTY3MDk1NTEyNTczODk2MTU4OTAzMTIxNTQ1MkwgIC8qIDIvc3FydChwaSkgKi8KKyMgZGVmaW5lIE1fU1FSVDJsCTEuNDE0MjEzNTYyMzczMDk1MDQ4ODAxNjg4NzI0MjA5Njk4MUwgIC8qIHNxcnQoMikgKi8KKyMgZGVmaW5lIE1fU1FSVDFfMmwJMC43MDcxMDY3ODExODY1NDc1MjQ0MDA4NDQzNjIxMDQ4NDkwTCAgLyogMS9zcXJ0KDIpICovCisjZW5kaWYKKworCisvKiBXaGVuIGNvbXBpbGluZyBpbiBzdHJpY3QgSVNPIEMgY29tcGF0aWJsZSBtb2RlIHdlIG11c3Qgbm90IHVzZSB0aGUKKyAgIGlubGluZSBmdW5jdGlvbnMgc2luY2UgdGhleSwgYW1vbmcgb3RoZXIgdGhpbmdzLCBkbyBub3Qgc2V0IHRoZQorICAgYGVycm5vJyB2YXJpYWJsZSBjb3JyZWN0bHkuICAqLworI2lmIGRlZmluZWQgX19TVFJJQ1RfQU5TSV9fICYmICFkZWZpbmVkIF9fTk9fTUFUSF9JTkxJTkVTCisjIGRlZmluZSBfX05PX01BVEhfSU5MSU5FUwkxCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfSVNPQzk5ICYmIF9fR05VQ19QUkVSRVEoMiw5NykKKy8qIElTTyBDOTkgZGVmaW5lcyBzb21lIG1hY3JvcyB0byBjb21wYXJlIG51bWJlciB3aGlsZSB0YWtpbmcgY2FyZSBmb3IKKyAgIHVub3JkZXJlZCBudW1iZXJzLiAgTWFueSBGUFVzIHByb3ZpZGUgc3BlY2lhbCBpbnN0cnVjdGlvbnMgdG8gc3VwcG9ydAorICAgdGhlc2Ugb3BlcmF0aW9ucy4gIEdlbmVyaWMgc3VwcG9ydCBpbiBHQ0MgZm9yIHRoZXNlIGFzIGJ1aWx0aW5zIHdlbnQKKyAgIGluIGJlZm9yZSAzLjAuMCwgYnV0IG5vdCBhbGwgY3B1cyBhZGRlZCB0aGVpciBwYXR0ZXJucy4gIFdlIGRlZmluZQorICAgdmVyc2lvbnMgdGhhdCB1c2UgdGhlIGJ1aWx0aW5zIGhlcmUsIGFuZCA8Yml0cy9tYXRoaW5saW5lLmg+IHdpbGwKKyAgIHVuZGVmL3JlZGVmaW5lIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgc3BlY2lmaWMgR0NDIHZlcnNpb24gaW4gdXNlLiAgKi8KKyMgZGVmaW5lIGlzZ3JlYXRlcih4LCB5KQlfX2J1aWx0aW5faXNncmVhdGVyKHgsIHkpCisjIGRlZmluZSBpc2dyZWF0ZXJlcXVhbCh4LCB5KQlfX2J1aWx0aW5faXNncmVhdGVyZXF1YWwoeCwgeSkKKyMgZGVmaW5lIGlzbGVzcyh4LCB5KQkJX19idWlsdGluX2lzbGVzcyh4LCB5KQorIyBkZWZpbmUgaXNsZXNzZXF1YWwoeCwgeSkJX19idWlsdGluX2lzbGVzc2VxdWFsKHgsIHkpCisjIGRlZmluZSBpc2xlc3NncmVhdGVyKHgsIHkpCV9fYnVpbHRpbl9pc2xlc3NncmVhdGVyKHgsIHkpCisjIGRlZmluZSBpc3Vub3JkZXJlZCh1LCB2KQlfX2J1aWx0aW5faXN1bm9yZGVyZWQodSwgdikKKyNlbmRpZgorCisvKiBHZXQgbWFjaGluZS1kZXBlbmRlbnQgaW5saW5lIHZlcnNpb25zIChpZiB0aGVyZSBhcmUgYW55KS4gICovCisjaWZkZWYgX19VU0VfRVhURVJOX0lOTElORVMKKyMgaW5jbHVkZSA8Yml0cy9tYXRoaW5saW5lLmg+CisjZW5kaWYKKworLyogRGVmaW5lIHNwZWNpYWwgZW50cnkgcG9pbnRzIHRvIHVzZSB3aGVuIHRoZSBjb21waWxlciBnb3QgdG9sZCB0bworICAgb25seSBleHBlY3QgZmluaXRlIHJlc3VsdHMuICAqLworI2lmIGRlZmluZWQgX19GSU5JVEVfTUFUSF9PTkxZX18gJiYgX19GSU5JVEVfTUFUSF9PTkxZX18gPiAwCisjIGluY2x1ZGUgPGJpdHMvbWF0aC1maW5pdGUuaD4KKyNlbmRpZgorCisjaWZkZWYgX19VU0VfSVNPQzk5CisvKiBJZiB3ZSd2ZSBzdGlsbCBnb3QgdW5kZWZpbmVkIGNvbXBhcmlzb24gbWFjcm9zLCBwcm92aWRlIGRlZmF1bHRzLiAgKi8KKworLyogUmV0dXJuIG5vbnplcm8gdmFsdWUgaWYgWCBpcyBncmVhdGVyIHRoYW4gWS4gICovCisjIGlmbmRlZiBpc2dyZWF0ZXIKKyMgIGRlZmluZSBpc2dyZWF0ZXIoeCwgeSkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBfX3R5cGVvZl9fKHgpIF9feCA9ICh4KTsgX190eXBlb2ZfXyh5KSBfX3kgPSAoeSk7CQkJICAgICAgXAorICAgICAgIWlzdW5vcmRlcmVkIChfX3gsIF9feSkgJiYgX194ID4gX195OyB9KSkKKyMgZW5kaWYKKworLyogUmV0dXJuIG5vbnplcm8gdmFsdWUgaWYgWCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gWS4gICovCisjIGlmbmRlZiBpc2dyZWF0ZXJlcXVhbAorIyAgZGVmaW5lIGlzZ3JlYXRlcmVxdWFsKHgsIHkpIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKHsgX190eXBlb2ZfXyh4KSBfX3ggPSAoeCk7IF9fdHlwZW9mX18oeSkgX195ID0gKHkpOwkJCSAgICAgIFwKKyAgICAgICFpc3Vub3JkZXJlZCAoX194LCBfX3kpICYmIF9feCA+PSBfX3k7IH0pKQorIyBlbmRpZgorCisvKiBSZXR1cm4gbm9uemVybyB2YWx1ZSBpZiBYIGlzIGxlc3MgdGhhbiBZLiAgKi8KKyMgaWZuZGVmIGlzbGVzcworIyAgZGVmaW5lIGlzbGVzcyh4LCB5KSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7IF9fdHlwZW9mX18oeCkgX194ID0gKHgpOyBfX3R5cGVvZl9fKHkpIF9feSA9ICh5KTsJCQkgICAgICBcCisgICAgICAhaXN1bm9yZGVyZWQgKF9feCwgX195KSAmJiBfX3ggPCBfX3k7IH0pKQorIyBlbmRpZgorCisvKiBSZXR1cm4gbm9uemVybyB2YWx1ZSBpZiBYIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBZLiAgKi8KKyMgaWZuZGVmIGlzbGVzc2VxdWFsCisjICBkZWZpbmUgaXNsZXNzZXF1YWwoeCwgeSkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBfX3R5cGVvZl9fKHgpIF9feCA9ICh4KTsgX190eXBlb2ZfXyh5KSBfX3kgPSAoeSk7CQkJICAgICAgXAorICAgICAgIWlzdW5vcmRlcmVkIChfX3gsIF9feSkgJiYgX194IDw9IF9feTsgfSkpCisjIGVuZGlmCisKKy8qIFJldHVybiBub256ZXJvIHZhbHVlIGlmIGVpdGhlciBYIGlzIGxlc3MgdGhhbiBZIG9yIFkgaXMgbGVzcyB0aGFuIFguICAqLworIyBpZm5kZWYgaXNsZXNzZ3JlYXRlcgorIyAgZGVmaW5lIGlzbGVzc2dyZWF0ZXIoeCwgeSkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBfX3R5cGVvZl9fKHgpIF9feCA9ICh4KTsgX190eXBlb2ZfXyh5KSBfX3kgPSAoeSk7CQkJICAgICAgXAorICAgICAgIWlzdW5vcmRlcmVkIChfX3gsIF9feSkgJiYgKF9feCA8IF9feSB8fCBfX3kgPCBfX3gpOyB9KSkKKyMgZW5kaWYKKworLyogUmV0dXJuIG5vbnplcm8gdmFsdWUgaWYgYXJndW1lbnRzIGFyZSB1bm9yZGVyZWQuICAqLworIyBpZm5kZWYgaXN1bm9yZGVyZWQKKyMgIGRlZmluZSBpc3Vub3JkZXJlZCh1LCB2KSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7IF9fdHlwZW9mX18odSkgX191ID0gKHUpOyBfX3R5cGVvZl9fKHYpIF9fdiA9ICh2KTsJCQkgICAgICBcCisgICAgICBmcGNsYXNzaWZ5IChfX3UpID09IEZQX05BTiB8fCBmcGNsYXNzaWZ5IChfX3YpID09IEZQX05BTjsgfSkpCisjIGVuZGlmCisKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisKKyNlbmRpZiAvKiBtYXRoLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL21jaGVjay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9tY2hlY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjJiOTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9tY2hlY2suaApAQCAtMCwwICsxLDYyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsMTk5NywxOTk4LDE5OTksMjAwMCwyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9NQ0hFQ0tfSAorI2RlZmluZSBfTUNIRUNLX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBSZXR1cm4gdmFsdWVzIGZvciBgbXByb2JlJzogdGhlc2UgYXJlIHRoZSBraW5kcyBvZiBpbmNvbnNpc3RlbmNpZXMgdGhhdAorICAgYG1jaGVjaycgZW5hYmxlcyBkZXRlY3Rpb24gb2YuICAqLworZW51bSBtY2hlY2tfc3RhdHVzCisgIHsKKyAgICBNQ0hFQ0tfRElTQUJMRUQgPSAtMSwgICAgICAgLyogQ29uc2lzdGVuY3kgY2hlY2tpbmcgaXMgbm90IHR1cm5lZCBvbi4gICovCisgICAgTUNIRUNLX09LLCAgICAgICAgICAgICAgICAgIC8qIEJsb2NrIGlzIGZpbmUuICAqLworICAgIE1DSEVDS19GUkVFLCAgICAgICAgICAgICAgICAvKiBCbG9jayBmcmVlZCB0d2ljZS4gICovCisgICAgTUNIRUNLX0hFQUQsICAgICAgICAgICAgICAgIC8qIE1lbW9yeSBiZWZvcmUgdGhlIGJsb2NrIHdhcyBjbG9iYmVyZWQuICAqLworICAgIE1DSEVDS19UQUlMICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgYWZ0ZXIgdGhlIGJsb2NrIHdhcyBjbG9iYmVyZWQuICAqLworICB9OworCisKKy8qIEFjdGl2YXRlIGEgc3RhbmRhcmQgY29sbGVjdGlvbiBvZiBkZWJ1Z2dpbmcgaG9va3MuICBUaGlzIG11c3QgYmUgY2FsbGVkCisgICBiZWZvcmUgYG1hbGxvYycgaXMgZXZlciBjYWxsZWQuICBBQk9SVEZVTkMgaXMgY2FsbGVkIHdpdGggYW4gZXJyb3IgY29kZQorICAgKHNlZSBlbnVtIGFib3ZlKSB3aGVuIGFuIGluY29uc2lzdGVuY3kgaXMgZGV0ZWN0ZWQuICBJZiBBQk9SVEZVTkMgaXMKKyAgIG51bGwsIHRoZSBzdGFuZGFyZCBmdW5jdGlvbiBwcmludHMgb24gc3RkZXJyIGFuZCB0aGVuIGNhbGxzIGBhYm9ydCcuICAqLworZXh0ZXJuIGludCBtY2hlY2sgKHZvaWQgKCpfX2Fib3J0ZnVuYykgKGVudW0gbWNoZWNrX3N0YXR1cykpIF9fVEhST1c7CisKKy8qIFNpbWlsYXIgdG8gYG1jaGVjaycgYnV0IHBlcmZvcm1zIGNoZWNrcyBmb3IgYWxsIGJsb2NrIHdoZW5ldmVyIG9uZSBvZgorICAgdGhlIG1lbW9yeSBoYW5kbGluZyBmdW5jdGlvbnMgaXMgY2FsbGVkLiAgVGhpcyBjYW4gYmUgdmVyeSBzbG93LiAgKi8KK2V4dGVybiBpbnQgbWNoZWNrX3BlZGFudGljICh2b2lkICgqX19hYm9ydGZ1bmMpIChlbnVtIG1jaGVja19zdGF0dXMpKSBfX1RIUk9XOworCisvKiBGb3JjZSBjaGVjayBvZiBhbGwgYmxvY2tzIG5vdy4gICovCitleHRlcm4gdm9pZCBtY2hlY2tfY2hlY2tfYWxsICh2b2lkKTsKKworLyogQ2hlY2sgZm9yIGFiZXJyYXRpb25zIGluIGEgcGFydGljdWxhciBtYWxsb2MnZCBibG9jay4gIFlvdSBtdXN0IGhhdmUKKyAgIGNhbGxlZCBgbWNoZWNrJyBhbHJlYWR5LiAgVGhlc2UgYXJlIHRoZSBzYW1lIGNoZWNrcyB0aGF0IGBtY2hlY2snIGRvZXMKKyAgIHdoZW4geW91IGZyZWUgb3IgcmVhbGxvY2F0ZSBhIGJsb2NrLiAgKi8KK2V4dGVybiBlbnVtIG1jaGVja19zdGF0dXMgbXByb2JlICh2b2lkICpfX3B0cikgX19USFJPVzsKKworLyogQWN0aXZhdGUgYSBzdGFuZGFyZCBjb2xsZWN0aW9uIG9mIHRyYWNpbmcgaG9va3MuICAqLworZXh0ZXJuIHZvaWQgbXRyYWNlICh2b2lkKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgbXVudHJhY2UgKHZvaWQpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBtY2hlY2suaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9tZW1vcnkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbWVtb3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQzZmE2YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbWVtb3J5LmgKQEAgLTAsMCArMSwzNCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICogU1ZJRAorICovCisKKyNpZm5kZWYJX01FTU9SWV9ICisjZGVmaW5lCV9NRU1PUllfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisKKyNpZm5kZWYJX1NUUklOR19ICisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCS8qIHN0cmluZy5oICAqLworCisKKyNlbmRpZgkvKiBtZW1vcnkuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbWVudS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9tZW51LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlYWMwMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbWVudS5oCkBAIC0wLDAgKzEsMjYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDcsMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgKgorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgICoKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAqCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgKgorICogZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgICoKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAqCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAqCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAqCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAqCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgKgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgICoKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICoKKyAqIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAqCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgKgorICogYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBBdXRob3I6ICBKdWVyZ2VuIFBmZWlmZXIsIDE5OTUsMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAkSWQ6IG1lbnUuaCx2IDEuMjAgMjAwOS8wNC8wNSAwMDoyODowNyB0b20gRXhwICQgKi8KKworI2lmbmRlZiBFVElfTUVOVQorI2RlZmluZSBFVElfTUVOVQorCisjaWZkZWYgQU1JR0EKKyNkZWZpbmUgVEVYVCBURVhUX25jdXJzZXMKKyNlbmRpZgorCisjaW5jbHVkZSA8Y3Vyc2VzLmg+CisjaW5jbHVkZSA8ZXRpLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBpbnQgTWVudV9PcHRpb25zOwordHlwZWRlZiBpbnQgSXRlbV9PcHRpb25zOworCisvKiBNZW51IG9wdGlvbnM6ICovCisjZGVmaW5lIE9fT05FVkFMVUUgICAgICAoMHgwMSkKKyNkZWZpbmUgT19TSE9XREVTQyAgICAgICgweDAyKQorI2RlZmluZSBPX1JPV01BSk9SICAgICAgKDB4MDQpCisjZGVmaW5lIE9fSUdOT1JFQ0FTRSAgICAoMHgwOCkKKyNkZWZpbmUgT19TSE9XTUFUQ0ggICAgICgweDEwKQorI2RlZmluZSBPX05PTkNZQ0xJQyAgICAgKDB4MjApCisKKy8qIEl0ZW0gb3B0aW9uczogKi8KKyNkZWZpbmUgT19TRUxFQ1RBQkxFICAgICgweDAxKQorCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyKiBzdHI7CisgIHVuc2lnbmVkIHNob3J0IGxlbmd0aDsKK30gVEVYVDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnSVRFTSAKK3sKKyAgVEVYVCAgICAgICAgICAgbmFtZTsgICAgICAgIC8qIG5hbWUgb2YgbWVudSBpdGVtICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFRFWFQgICAgICAgICAgIGRlc2NyaXB0aW9uOyAvKiBkZXNjcmlwdGlvbiBvZiBpdGVtLCBvcHRpb25hbCBpbiBkaXNwbGF5ICAqLyAKKyAgc3RydWN0IHRhZ01FTlUgKmltZW51OyAgICAgIC8qIFBvaW50ZXIgdG8gcGFyZW50IG1lbnUgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgICAgICAgICAgICp1c2VycHRyOyAgICAvKiBQb2ludGVyIHRvIHVzZXIgZGVmaW5lZCBwZXIgaXRlbSBkYXRhICAgICAqLyAKKyAgSXRlbV9PcHRpb25zICAgb3B0OyAgICAgICAgIC8qIEl0ZW0gb3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIAorICBzaG9ydCAgICAgICAgICBpbmRleDsgICAgICAgLyogSXRlbSBudW1iZXIgaWYgY29ubmVjdGVkIHRvIGEgbWVudSAgICAgICAgKi8KKyAgc2hvcnQgICAgICAgICAgeTsgICAgICAgICAgIC8qIHkgYW5kIHggbG9jYXRpb24gb2YgaXRlbSBpbiBtZW51ICAgICAgICAgICovCisgIHNob3J0ICAgICAgICAgIHg7CisgIGJvb2wgICAgICAgICAgIHZhbHVlOyAgICAgICAvKiBTZWxlY3Rpb24gdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgc3RydWN0IHRhZ0lURU0gKmxlZnQ7ICAgICAgIC8qIG5laWdoYm9yIGl0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0cnVjdCB0YWdJVEVNICpyaWdodDsKKyAgc3RydWN0IHRhZ0lURU0gKnVwOworICBzdHJ1Y3QgdGFnSVRFTSAqZG93bjsKKworfSBJVEVNOworCit0eXBlZGVmIHZvaWQgKCpNZW51X0hvb2spKHN0cnVjdCB0YWdNRU5VICopOworCit0eXBlZGVmIHN0cnVjdCB0YWdNRU5VIAoreworICBzaG9ydCAgICAgICAgICBoZWlnaHQ7ICAgICAgICAgICAgICAgIC8qIE5yLiBvZiBjaGFycyBoaWdoICAgICAgICAgICAgICAgKi8KKyAgc2hvcnQgICAgICAgICAgd2lkdGg7ICAgICAgICAgICAgICAgICAvKiBOci4gb2YgY2hhcnMgd2lkZSAgICAgICAgICAgICAgICovCisgIHNob3J0ICAgICAgICAgIHJvd3M7ICAgICAgICAgICAgICAgICAgLyogTnIuIG9mIGl0ZW1zIGhpZ2ggICAgICAgICAgICAgICAqLworICBzaG9ydCAgICAgICAgICBjb2xzOyAgICAgICAgICAgICAgICAgIC8qIE5yLiBvZiBpdGVtcyB3aWRlICAgICAgICAgICAgICAgKi8KKyAgc2hvcnQgICAgICAgICAgZnJvd3M7ICAgICAgICAgICAgICAgICAvKiBOci4gb2YgZm9ybWF0dGVkIGl0ZW1zIGhpZ2ggICAgICovCisgIHNob3J0ICAgICAgICAgIGZjb2xzOyAgICAgICAgICAgICAgICAgLyogTnIuIG9mIGZvcm1hdHRlZCBpdGVtcyB3aWRlICAgICAqLworICBzaG9ydCAgICAgICAgICBhcm93czsgICAgICAgICAgICAgICAgIC8qIE5yLiBvZiBpdGVtcyBoaWdoIChhY3R1YWwpICAgICAgKi8KKyAgc2hvcnQgICAgICAgICAgbmFtZWxlbjsgICAgICAgICAgICAgICAvKiBNYXguIG5hbWUgbGVuZ3RoICAgICAgICAgICAgICAgICovCisgIHNob3J0ICAgICAgICAgIGRlc2NsZW47ICAgICAgICAgICAgICAgLyogTWF4LiBkZXNjcmlwdGlvbiBsZW5ndGggICAgICAgICAqLworICBzaG9ydCAgICAgICAgICBtYXJrbGVuOyAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiBtYXJrLCBpZiBhbnkgICAgICAgICAgKi8KKyAgc2hvcnQgICAgICAgICAgaXRlbWxlbjsgICAgICAgICAgICAgICAvKiBMZW5ndGggb2Ygb25lIGl0ZW0gICAgICAgICAgICAgICovCisgIHNob3J0ICAgICAgICAgIHNwY19kZXNjOyAgICAgICAgICAgICAgLyogU3BhY2luZyBmb3IgZGVzY3JpcHRvciAgICAgICAgICAqLworICBzaG9ydCAgICAgICAgICBzcGNfY29sczsgICAgICAgICAgICAgIC8qIFNwYWNpbmcgZm9yIGNvbHVtbnMgICAgICAgICAgICAgKi8KKyAgc2hvcnQgICAgICAgICAgc3BjX3Jvd3M7ICAgICAgICAgICAgICAvKiBTcGFjaW5nIGZvciByb3dzICAgICAgICAgICAgICAgICovIAorICBjaGFyICAgICAgICAgICpwYXR0ZXJuOyAgICAgICAgICAgICAgIC8qIEJ1ZmZlciB0byBzdG9yZSBtYXRjaCBjaGFycyAgICAgKi8KKyAgc2hvcnQgICAgICAgICAgcGluZGV4OyAgICAgICAgICAgICAgICAvKiBJbmRleCBpbnRvIHBhdHRlcm4gYnVmZmVyICAgICAgICovCisgIFdJTkRPVyAgICAgICAgKndpbjsgICAgICAgICAgICAgICAgICAgLyogV2luZG93IGNvbnRhaW5pbmcgbWVudSAgICAgICAgICAqLworICBXSU5ET1cgICAgICAgICpzdWI7ICAgICAgICAgICAgICAgICAgIC8qIFN1YndpbmRvdyBmb3IgbWVudSBkaXNwbGF5ICAgICAgKi8KKyAgV0lORE9XICAgICAgICAqdXNlcndpbjsgICAgICAgICAgICAgICAvKiBVc2VyJ3Mgd2luZG93ICAgICAgICAgICAgICAgICAgICovCisgIFdJTkRPVyAgICAgICAgKnVzZXJzdWI7ICAgICAgICAgICAgICAgLyogVXNlcidzIHN1YndpbmRvdyAgICAgICAgICAgICAgICAqLworICBJVEVNICAgICAgICAgICoqaXRlbXM7ICAgICAgICAgICAgICAgIC8qIGFycmF5IG9mIGl0ZW1zICAgICAgICAgICAgICAgICAgKi8gCisgIHNob3J0ICAgICAgICAgIG5pdGVtczsgICAgICAgICAgICAgICAgLyogTnIuIG9mIGl0ZW1zIGluIG1lbnUgICAgICAgICAgICAqLworICBJVEVNICAgICAgICAgICpjdXJpdGVtOyAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgaXRlbSAgICAgICAgICAgICAgICAgICAgKi8KKyAgc2hvcnQgICAgICAgICAgdG9wcm93OyAgICAgICAgICAgICAgICAvKiBUb3Agcm93IG9mIG1lbnUgICAgICAgICAgICAgICAgICovCisgIGNodHlwZSAgICAgICAgIGZvcmU7ICAgICAgICAgICAgICAgICAgLyogU2VsZWN0aW9uIGF0dHJpYnV0ZSAgICAgICAgICAgICAqLworICBjaHR5cGUgICAgICAgICBiYWNrOyAgICAgICAgICAgICAgICAgIC8qIE5vbnNlbGVjdGlvbiBhdHRyaWJ1dGUgICAgICAgICAgKi8KKyAgY2h0eXBlICAgICAgICAgZ3JleTsgICAgICAgICAgICAgICAgICAvKiBJbmFjdGl2ZSBhdHRyaWJ1dGUgICAgICAgICAgICAgICovCisgIHVuc2lnbmVkIGNoYXIgIHBhZDsgICAgICAgICAgICAgICAgICAgLyogUGFkIGNoYXJhY3RlciAgICAgICAgICAgICAgICAgICAqLworCisgIE1lbnVfSG9vayAgICAgIG1lbnVpbml0OyAgICAgICAgICAgICAgLyogVXNlciBob29rcyAgICAgICAgICAgICAgICAgICAgICAqLworICBNZW51X0hvb2sgICAgICBtZW51dGVybTsKKyAgTWVudV9Ib29rICAgICAgaXRlbWluaXQ7CisgIE1lbnVfSG9vayAgICAgIGl0ZW10ZXJtOworCisgIHZvaWQgICAgICAgICAgKnVzZXJwdHI7ICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBtZW51cyB1c2VyIGRhdGEgICAgICAqLworICBjaGFyICAgICAgICAgICptYXJrOyAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbWFya2VyIHN0cmluZyAgICAgICAgKi8KKworICBNZW51X09wdGlvbnMgICBvcHQ7ICAgICAgICAgICAgICAgICAgIC8qIE1lbnUgb3B0aW9ucyAgICAgICAgICAgICAgICAgICAgKi8KKyAgdW5zaWduZWQgc2hvcnQgc3RhdHVzOyAgICAgICAgICAgICAgICAvKiBJbnRlcm5hbCBzdGF0ZSBvZiBtZW51ICAgICAgICAgICovCisKK30gTUVOVTsKKworCisvKiBEZWZpbmUga2V5cyAqLworCisjZGVmaW5lIFJFUV9MRUZUX0lURU0gICAgICAgICAgIChLRVlfTUFYICsgMSkKKyNkZWZpbmUgUkVRX1JJR0hUX0lURU0gICAgICAgICAgKEtFWV9NQVggKyAyKQorI2RlZmluZSBSRVFfVVBfSVRFTSAgICAgICAgICAgICAoS0VZX01BWCArIDMpCisjZGVmaW5lIFJFUV9ET1dOX0lURU0gICAgICAgICAgIChLRVlfTUFYICsgNCkKKyNkZWZpbmUgUkVRX1NDUl9VTElORSAgICAgICAgICAgKEtFWV9NQVggKyA1KQorI2RlZmluZSBSRVFfU0NSX0RMSU5FICAgICAgICAgICAoS0VZX01BWCArIDYpCisjZGVmaW5lIFJFUV9TQ1JfRFBBR0UgICAgICAgICAgIChLRVlfTUFYICsgNykKKyNkZWZpbmUgUkVRX1NDUl9VUEFHRSAgICAgICAgICAgKEtFWV9NQVggKyA4KQorI2RlZmluZSBSRVFfRklSU1RfSVRFTSAgICAgICAgICAoS0VZX01BWCArIDkpCisjZGVmaW5lIFJFUV9MQVNUX0lURU0gICAgICAgICAgIChLRVlfTUFYICsgMTApCisjZGVmaW5lIFJFUV9ORVhUX0lURU0gICAgICAgICAgIChLRVlfTUFYICsgMTEpCisjZGVmaW5lIFJFUV9QUkVWX0lURU0gICAgICAgICAgIChLRVlfTUFYICsgMTIpCisjZGVmaW5lIFJFUV9UT0dHTEVfSVRFTSAgICAgICAgIChLRVlfTUFYICsgMTMpCisjZGVmaW5lIFJFUV9DTEVBUl9QQVRURVJOICAgICAgIChLRVlfTUFYICsgMTQpCisjZGVmaW5lIFJFUV9CQUNLX1BBVFRFUk4gICAgICAgIChLRVlfTUFYICsgMTUpCisjZGVmaW5lIFJFUV9ORVhUX01BVENIICAgICAgICAgIChLRVlfTUFYICsgMTYpCisjZGVmaW5lIFJFUV9QUkVWX01BVENIICAgICAgICAgIChLRVlfTUFYICsgMTcpCisKKyNkZWZpbmUgTUlOX01FTlVfQ09NTUFORCAgICAgICAgKEtFWV9NQVggKyAxKQorI2RlZmluZSBNQVhfTUVOVV9DT01NQU5EICAgICAgICAoS0VZX01BWCArIDE3KQorCisvKgorICogU29tZSBBVCZUIGNvZGUgZXhwZWN0cyBNQVhfQ09NTUFORCB0byBiZSBvdXQtb2YtYmFuZCBub3QKKyAqIGp1c3QgZm9yIG1lbnUgY29tbWFuZHMgYnV0IGZvciBmb3JtcyBvbmVzIGFzIHdlbGwuCisgKi8KKyNpZiBkZWZpbmVkKE1BWF9DT01NQU5EKQorIyAgaWYgKE1BWF9NRU5VX0NPTU1BTkQgPiBNQVhfQ09NTUFORCkKKyMgICAgZXJyb3IgU29tZXRoaW5nIGlzIHdyb25nIC0tIE1BWF9NRU5VX0NPTU1BTkQgaXMgZ3JlYXRlciB0aGFuIE1BWF9DT01NQU5ECisjICBlbGlmIChNQVhfQ09NTUFORCAhPSAoS0VZX01BWCArIDEyOCkpCisjICAgIGVycm9yIFNvbWV0aGluZyBpcyB3cm9uZyAtLSBNQVhfQ09NTUFORCBpcyBhbHJlYWR5IGluY29uc2lzdGVudGx5IGRlZmluZWQuCisjICBlbmRpZgorI2Vsc2UKKyMgIGRlZmluZSBNQVhfQ09NTUFORCAoS0VZX01BWCArIDEyOCkKKyNlbmRpZgorCisKKy8qIC0tLS0tLS0tLSBwcm90b3R5cGVzIGZvciBsaWJtZW51IGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoSVRFTSAqKikJbWVudV9pdGVtcyAoY29uc3QgTUVOVSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChJVEVNICopCWN1cnJlbnRfaXRlbSAoY29uc3QgTUVOVSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChJVEVNICopCW5ld19pdGVtIChjb25zdCBjaGFyICosY29uc3QgY2hhciAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKE1FTlUgKikJbmV3X21lbnUgKElURU0gKiopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoSXRlbV9PcHRpb25zKQlpdGVtX29wdHMgKGNvbnN0IElURU0gKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoTWVudV9PcHRpb25zKQltZW51X29wdHMgKGNvbnN0IE1FTlUgKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChNZW51X0hvb2spCWl0ZW1faW5pdCAoY29uc3QgTUVOVSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChNZW51X0hvb2spCWl0ZW1fdGVybSAoY29uc3QgTUVOVSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChNZW51X0hvb2spCW1lbnVfaW5pdCAoY29uc3QgTUVOVSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChNZW51X0hvb2spCW1lbnVfdGVybSAoY29uc3QgTUVOVSAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyAqKQltZW51X3N1YiAoY29uc3QgTUVOVSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChXSU5ET1cgKikJbWVudV93aW4gKGNvbnN0IE1FTlUgKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjb25zdCBjaGFyICopCWl0ZW1fZGVzY3JpcHRpb24gKGNvbnN0IElURU0gKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY29uc3QgY2hhciAqKQlpdGVtX25hbWUgKGNvbnN0IElURU0gKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY29uc3QgY2hhciAqKQltZW51X21hcmsgKGNvbnN0IE1FTlUgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY29uc3QgY2hhciAqKQltZW51X3JlcXVlc3RfbmFtZSAoaW50KTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikJbWVudV9wYXR0ZXJuIChjb25zdCBNRU5VICopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCAqKQltZW51X3VzZXJwdHIgKGNvbnN0IE1FTlUgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCAqKQlpdGVtX3VzZXJwdHIgKGNvbnN0IElURU0gKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaHR5cGUpCW1lbnVfYmFjayAoY29uc3QgTUVOVSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaHR5cGUpCW1lbnVfZm9yZSAoY29uc3QgTUVOVSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaHR5cGUpCW1lbnVfZ3JleSAoY29uc3QgTUVOVSAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJZnJlZV9pdGVtIChJVEVNICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJZnJlZV9tZW51IChNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJaXRlbV9jb3VudCAoY29uc3QgTUVOVSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCWl0ZW1faW5kZXggKGNvbnN0IElURU0gKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlpdGVtX29wdHNfb2ZmIChJVEVNICosSXRlbV9PcHRpb25zKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCWl0ZW1fb3B0c19vbiAoSVRFTSAqLEl0ZW1fT3B0aW9ucyk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQltZW51X2RyaXZlciAoTUVOVSAqLGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQltZW51X29wdHNfb2ZmIChNRU5VICosTWVudV9PcHRpb25zKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCW1lbnVfb3B0c19vbiAoTUVOVSAqLE1lbnVfT3B0aW9ucyk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQltZW51X3BhZCAoY29uc3QgTUVOVSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXBvc19tZW51X2N1cnNvciAoY29uc3QgTUVOVSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXBvc3RfbWVudSAoTUVOVSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNjYWxlX21lbnUgKGNvbnN0IE1FTlUgKixpbnQgKixpbnQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfY3VycmVudF9pdGVtIChNRU5VICptZW51LElURU0gKml0ZW0pOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2l0ZW1faW5pdCAoTUVOVSAqLCBNZW51X0hvb2spOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2l0ZW1fb3B0cyAoSVRFTSAqLEl0ZW1fT3B0aW9ucyk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfaXRlbV90ZXJtIChNRU5VICosIE1lbnVfSG9vayk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfaXRlbV91c2VycHRyIChJVEVNICosIHZvaWQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfaXRlbV92YWx1ZSAoSVRFTSAqLGJvb2wpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X21lbnVfYmFjayAoTUVOVSAqLGNodHlwZSk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbWVudV9mb3JlIChNRU5VICosY2h0eXBlKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9tZW51X2Zvcm1hdCAoTUVOVSAqLGludCxpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X21lbnVfZ3JleSAoTUVOVSAqLGNodHlwZSk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbWVudV9pbml0IChNRU5VICosIE1lbnVfSG9vayk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbWVudV9pdGVtcyAoTUVOVSAqLElURU0gKiopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X21lbnVfbWFyayAoTUVOVSAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X21lbnVfb3B0cyAoTUVOVSAqLE1lbnVfT3B0aW9ucyk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbWVudV9wYWQgKE1FTlUgKixpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X21lbnVfcGF0dGVybiAoTUVOVSAqLGNvbnN0IGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbWVudV9zdWIgKE1FTlUgKixXSU5ET1cgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbWVudV90ZXJtIChNRU5VICosIE1lbnVfSG9vayk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbWVudV91c2VycHRyIChNRU5VICosdm9pZCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9tZW51X3dpbiAoTUVOVSAqLFdJTkRPVyAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF90b3Bfcm93IChNRU5VICosaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXRvcF9yb3cgKGNvbnN0IE1FTlUgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQl1bnBvc3RfbWVudSAoTUVOVSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCW1lbnVfcmVxdWVzdF9ieV9uYW1lIChjb25zdCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X21lbnVfc3BhY2luZyAoTUVOVSAqLGludCxpbnQsaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCW1lbnVfc3BhY2luZyAoY29uc3QgTUVOVSAqLGludCAqLGludCAqLGludCAqKTsKKworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkJaXRlbV92YWx1ZSAoY29uc3QgSVRFTSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKQlpdGVtX3Zpc2libGUgKGNvbnN0IElURU0gKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKQltZW51X2Zvcm1hdCAoY29uc3QgTUVOVSAqLGludCAqLGludCAqKTsKKworI2lmIE5DVVJTRVNfU1BfRlVOQ1MKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChNRU5VICopCU5DVVJTRVNfU1BfTkFNRShuZXdfbWVudSkgKFNDUkVFTiosIElURU0gKiopOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICB9CisjZW5kaWYKKworI2VuZGlmIC8qIEVUSV9NRU5VICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL21udGVudC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9tbnRlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODJlOTUzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9tbnRlbnQuaApAQCAtMCwwICsxLDk4IEBACisvKiBVdGlsaXRpZXMgZm9yIHJlYWRpbmcvd3JpdGluZyBmc3RhYiwgbXRhYiwgZXRjLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9NTlRFTlRfSAorI2RlZmluZQlfTU5URU5UX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNkZWZpbmUgX19uZWVkX0ZJTEUKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHBhdGhzLmg+CisKKworLyogRmlsZSBsaXN0aW5nIGNhbm9uaWNhbCBpbnRlcmVzdGluZyBtb3VudCBwb2ludHMuICAqLworI2RlZmluZQlNTlRUQUIJCV9QQVRIX01OVFRBQgkvKiBEZXByZWNhdGVkIGFsaWFzLiAgKi8KKworLyogRmlsZSBsaXN0aW5nIGN1cnJlbnRseSBhY3RpdmUgbW91bnQgcG9pbnRzLiAgKi8KKyNkZWZpbmUJTU9VTlRFRAkJX1BBVEhfTU9VTlRFRAkvKiBEZXByZWNhdGVkIGFsaWFzLiAgKi8KKworCisvKiBHZW5lcmFsIGZpbGVzeXN0ZW0gdHlwZXMuICAqLworI2RlZmluZSBNTlRUWVBFX0lHTk9SRQkiaWdub3JlIgkvKiBJZ25vcmUgdGhpcyBlbnRyeS4gICovCisjZGVmaW5lIE1OVFRZUEVfTkZTCSJuZnMiCQkvKiBOZXR3b3JrIGZpbGUgc3lzdGVtLiAgKi8KKyNkZWZpbmUgTU5UVFlQRV9TV0FQCSJzd2FwIgkJLyogU3dhcCBkZXZpY2UuICAqLworCisKKy8qIEdlbmVyaWMgbW91bnQgb3B0aW9ucy4gICovCisjZGVmaW5lIE1OVE9QVF9ERUZBVUxUUwkiZGVmYXVsdHMiCS8qIFVzZSBhbGwgZGVmYXVsdCBvcHRpb25zLiAgKi8KKyNkZWZpbmUgTU5UT1BUX1JPCSJybyIJCS8qIFJlYWQgb25seS4gICovCisjZGVmaW5lIE1OVE9QVF9SVwkicnciCQkvKiBSZWFkL3dyaXRlLiAgKi8KKyNkZWZpbmUgTU5UT1BUX1NVSUQJInN1aWQiCQkvKiBTZXQgdWlkIGFsbG93ZWQuICAqLworI2RlZmluZSBNTlRPUFRfTk9TVUlECSJub3N1aWQiCS8qIE5vIHNldCB1aWQgYWxsb3dlZC4gICovCisjZGVmaW5lIE1OVE9QVF9OT0FVVE8JIm5vYXV0byIJLyogRG8gbm90IGF1dG8gbW91bnQuICAqLworCisKK19fQkVHSU5fREVDTFMKKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgYSBtb3VudCB0YWJsZSBlbnRyeS4gICovCitzdHJ1Y3QgbW50ZW50CisgIHsKKyAgICBjaGFyICptbnRfZnNuYW1lOwkJLyogRGV2aWNlIG9yIHNlcnZlciBmb3IgZmlsZXN5c3RlbS4gICovCisgICAgY2hhciAqbW50X2RpcjsJCS8qIERpcmVjdG9yeSBtb3VudGVkIG9uLiAgKi8KKyAgICBjaGFyICptbnRfdHlwZTsJCS8qIFR5cGUgb2YgZmlsZXN5c3RlbTogdWZzLCBuZnMsIGV0Yy4gICovCisgICAgY2hhciAqbW50X29wdHM7CQkvKiBDb21tYS1zZXBhcmF0ZWQgb3B0aW9ucyBmb3IgZnMuICAqLworICAgIGludCBtbnRfZnJlcTsJCS8qIER1bXAgZnJlcXVlbmN5IChpbiBkYXlzKS4gICovCisgICAgaW50IG1udF9wYXNzbm87CQkvKiBQYXNzIG51bWJlciBmb3IgYGZzY2snLiAgKi8KKyAgfTsKKworCisvKiBQcmVwYXJlIHRvIGJlZ2luIHJlYWRpbmcgYW5kL29yIHdyaXRpbmcgbW91bnQgdGFibGUgZW50cmllcyBmcm9tIHRoZQorICAgYmVnaW5uaW5nIG9mIEZJTEUuICBNT0RFIGlzIGFzIGZvciBgZm9wZW4nLiAgKi8KK2V4dGVybiBGSUxFICpzZXRtbnRlbnQgKF9fY29uc3QgY2hhciAqX19maWxlLCBfX2NvbnN0IGNoYXIgKl9fbW9kZSkgX19USFJPVzsKKworLyogUmVhZCBvbmUgbW91bnQgdGFibGUgZW50cnkgZnJvbSBTVFJFQU0uICBSZXR1cm5zIGEgcG9pbnRlciB0byBzdG9yYWdlCisgICByZXVzZWQgb24gdGhlIG5leHQgY2FsbCwgb3IgbnVsbCBmb3IgRU9GIG9yIGVycm9yICh1c2UgZmVvZi9mZXJyb3IgdG8KKyAgIGNoZWNrKS4gICovCitleHRlcm4gc3RydWN0IG1udGVudCAqZ2V0bW50ZW50IChGSUxFICpfX3N0cmVhbSkgX19USFJPVzsKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIFJlZW50cmFudCB2ZXJzaW9uIG9mIHRoZSBhYm92ZSBmdW5jdGlvbi4gICovCitleHRlcm4gc3RydWN0IG1udGVudCAqZ2V0bW50ZW50X3IgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJCQkJICAgc3RydWN0IG1udGVudCAqX19yZXN0cmljdCBfX3Jlc3VsdCwKKwkJCQkgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmZmVyLAorCQkJCSAgIGludCBfX2J1ZnNpemUpIF9fVEhST1c7CisjZW5kaWYKKworLyogV3JpdGUgdGhlIG1vdW50IHRhYmxlIGVudHJ5IGRlc2NyaWJlZCBieSBNTlQgdG8gU1RSRUFNLgorICAgUmV0dXJuIHplcm8gb24gc3VjY2Vzcywgbm9uemVybyBvbiBmYWlsdXJlLiAgKi8KK2V4dGVybiBpbnQgYWRkbW50ZW50IChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCQkgICAgICBfX2NvbnN0IHN0cnVjdCBtbnRlbnQgKl9fcmVzdHJpY3QgX19tbnQpIF9fVEhST1c7CisKKy8qIENsb3NlIGEgc3RyZWFtIG9wZW5lZCB3aXRoIGBzZXRtbnRlbnQnLiAgKi8KK2V4dGVybiBpbnQgZW5kbW50ZW50IChGSUxFICpfX3N0cmVhbSkgX19USFJPVzsKKworLyogU2VhcmNoIE1OVC0+bW50X29wdHMgZm9yIGFuIG9wdGlvbiBtYXRjaGluZyBPUFQuCisgICBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBzdWJzdHJpbmcsIG9yIG51bGwgaWYgbm9uZSBmb3VuZC4gICovCitleHRlcm4gY2hhciAqaGFzbW50b3B0IChfX2NvbnN0IHN0cnVjdCBtbnRlbnQgKl9fbW50LAorCQkJX19jb25zdCBjaGFyICpfX29wdCkgX19USFJPVzsKKworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogbW50ZW50LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbW9uZXRhcnkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbW9uZXRhcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjBjMGVjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9tb25ldGFyeS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qIEhlYWRlciBmaWxlIGZvciBtb25ldGFyeSB2YWx1ZSBmb3JtYXR0aW5nIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwxOTk3LDE5OTgsMTk5OSwyMDAwLDIwMDIsMjAwNiwyMDA5CisJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX01PTkVUQVJZX0gKKyNkZWZpbmUJX01PTkVUQVJZX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogR2V0IG5lZWRlZCB0eXBlcy4gICovCisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKyNpZm5kZWYJX19zc2l6ZV90X2RlZmluZWQKK3R5cGVkZWYgX19zc2l6ZV90IHNzaXplX3Q7CisjIGRlZmluZSBfX3NzaXplX3RfZGVmaW5lZAorI2VuZGlmCisKKworX19CRUdJTl9ERUNMUworCisvKiBGb3JtYXR0aW5nIGEgbW9uZXRhcnkgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxvY2FsZS4gICovCitleHRlcm4gc3NpemVfdCBzdHJmbW9uIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbWF4c2l6ZSwKKwkJCV9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2Zvcm1hdF9zdHJmbW9uX18gKDMsIDQpOworCisjaWZkZWYgX19VU0VfWE9QRU4ySzgKKyMgaW5jbHVkZSA8eGxvY2FsZS5oPgorCisvKiBGb3JtYXR0aW5nIGEgbW9uZXRhcnkgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxvY2FsZS4gICovCitleHRlcm4gc3NpemVfdCBzdHJmbW9uX2wgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19tYXhzaXplLAorCQkJICBfX2xvY2FsZV90IF9fbG9jLAorCQkJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9mb3JtYXRfc3RyZm1vbl9fICg0LCA1KTsKKyNlbmRpZgorCisjaWZkZWYgX19MREJMX0NPTVBBVAorIyBpbmNsdWRlIDxiaXRzL21vbmV0YXJ5LWxkYmwuaD4KKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogbW9uZXRhcnkuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9tcXVldWUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbXF1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRjM2UxYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbXF1ZXVlLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTVFVRVVFX0gKKyNkZWZpbmUgX01RVUVVRV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNkZWZpbmUgX19uZWVkX3NpZ2V2ZW50X3QKKyNpbmNsdWRlIDxiaXRzL3NpZ2luZm8uaD4KKyNkZWZpbmUgX19uZWVkX3RpbWVzcGVjCisjaW5jbHVkZSA8dGltZS5oPgorLyogR2V0IHRoZSBkZWZpbml0aW9uIG9mIG1xZF90IGFuZCBzdHJ1Y3QgbXFfYXR0ci4gICovCisjaW5jbHVkZSA8Yml0cy9tcXVldWUuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBFc3RhYmxpc2ggY29ubmVjdGlvbiBiZXR3ZWVuIGEgcHJvY2VzcyBhbmQgYSBtZXNzYWdlIHF1ZXVlIE5BTUUgYW5kCisgICByZXR1cm4gbWVzc2FnZSBxdWV1ZSBkZXNjcmlwdG9yIG9yIChtcWRfdCkgLTEgb24gZXJyb3IuICBPRkxBRyBkZXRlcm1pbmVzCisgICB0aGUgdHlwZSBvZiBhY2Nlc3MgdXNlZC4gIElmIE9fQ1JFQVQgaXMgb24gT0ZMQUcsIHRoZSB0aGlyZCBhcmd1bWVudCBpcworICAgdGFrZW4gYXMgYSBgbW9kZV90JywgdGhlIG1vZGUgb2YgdGhlIGNyZWF0ZWQgbWVzc2FnZSBxdWV1ZSwgYW5kIHRoZSBmb3VydGgKKyAgIGFyZ3VtZW50IGlzIHRha2VuIGFzIGBzdHJ1Y3QgbXFfYXR0ciAqJywgcG9pbnRlciB0byBtZXNzYWdlIHF1ZXVlCisgICBhdHRyaWJ1dGVzLiAgSWYgdGhlIGZvdXJ0aCBhcmd1bWVudCBpcyBOVUxMLCBkZWZhdWx0IGF0dHJpYnV0ZXMgYXJlCisgICB1c2VkLiAgKi8KK2V4dGVybiBtcWRfdCBtcV9vcGVuIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgaW50IF9fb2ZsYWcsIC4uLikKKyAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFJlbW92ZXMgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gbWVzc2FnZSBxdWV1ZSBkZXNjcmlwdG9yIE1RREVTIGFuZCBpdHMKKyAgIG1lc3NhZ2UgcXVldWUuICAqLworZXh0ZXJuIGludCBtcV9jbG9zZSAobXFkX3QgX19tcWRlcykgX19USFJPVzsKKworLyogUXVlcnkgc3RhdHVzIGFuZCBhdHRyaWJ1dGVzIG9mIG1lc3NhZ2UgcXVldWUgTVFERVMuICAqLworZXh0ZXJuIGludCBtcV9nZXRhdHRyIChtcWRfdCBfX21xZGVzLCBzdHJ1Y3QgbXFfYXR0ciAqX19tcXN0YXQpCisgIF9fVEhST1cgX19ub25udWxsICgoMikpOworCisvKiBTZXQgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggbWVzc2FnZSBxdWV1ZSBNUURFUyBhbmQgaWYgT01RU1RBVCBpcworICAgbm90IE5VTEwgYWxzbyBxdWVyeSBpdHMgb2xkIGF0dHJpYnV0ZXMuICAqLworZXh0ZXJuIGludCBtcV9zZXRhdHRyIChtcWRfdCBfX21xZGVzLAorCQkgICAgICAgX19jb25zdCBzdHJ1Y3QgbXFfYXR0ciAqX19yZXN0cmljdCBfX21xc3RhdCwKKwkJICAgICAgIHN0cnVjdCBtcV9hdHRyICpfX3Jlc3RyaWN0IF9fb21xc3RhdCkKKyAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisKKy8qIFJlbW92ZSBtZXNzYWdlIHF1ZXVlIG5hbWVkIE5BTUUuICAqLworZXh0ZXJuIGludCBtcV91bmxpbmsgKF9fY29uc3QgY2hhciAqX19uYW1lKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogUmVnaXN0ZXIgbm90aWZpY2F0aW9uIGlzc3VlZCB1cG9uIG1lc3NhZ2UgYXJyaXZhbCB0byBhbiBlbXB0eQorICAgbWVzc2FnZSBxdWV1ZSBNUURFUy4gICovCitleHRlcm4gaW50IG1xX25vdGlmeSAobXFkX3QgX19tcWRlcywgX19jb25zdCBzdHJ1Y3Qgc2lnZXZlbnQgKl9fbm90aWZpY2F0aW9uKQorICAgICBfX1RIUk9XOworCisvKiBSZWNlaXZlIHRoZSBvbGRlc3QgZnJvbSBoaWdoZXN0IHByaW9yaXR5IG1lc3NhZ2VzIGluIG1lc3NhZ2UgcXVldWUKKyAgIE1RREVTLiAgKi8KK2V4dGVybiBzc2l6ZV90IG1xX3JlY2VpdmUgKG1xZF90IF9fbXFkZXMsIGNoYXIgKl9fbXNnX3B0ciwgc2l6ZV90IF9fbXNnX2xlbiwKKwkJCSAgIHVuc2lnbmVkIGludCAqX19tc2dfcHJpbykgX19ub25udWxsICgoMikpOworCisvKiBBZGQgbWVzc2FnZSBwb2ludGVkIGJ5IE1TR19QVFIgdG8gbWVzc2FnZSBxdWV1ZSBNUURFUy4gICovCitleHRlcm4gaW50IG1xX3NlbmQgKG1xZF90IF9fbXFkZXMsIF9fY29uc3QgY2hhciAqX19tc2dfcHRyLCBzaXplX3QgX19tc2dfbGVuLAorCQkgICAgdW5zaWduZWQgaW50IF9fbXNnX3ByaW8pIF9fbm9ubnVsbCAoKDIpKTsKKworI2lmZGVmIF9fVVNFX1hPUEVOMksKKy8qIFJlY2VpdmUgdGhlIG9sZGVzdCBmcm9tIGhpZ2hlc3QgcHJpb3JpdHkgbWVzc2FnZXMgaW4gbWVzc2FnZSBxdWV1ZQorICAgTVFERVMsIHN0b3Agd2FpdGluZyBpZiBBQlNfVElNRU9VVCBleHBpcmVzLiAgKi8KK2V4dGVybiBzc2l6ZV90IG1xX3RpbWVkcmVjZWl2ZSAobXFkX3QgX19tcWRlcywgY2hhciAqX19yZXN0cmljdCBfX21zZ19wdHIsCisJCQkJc2l6ZV90IF9fbXNnX2xlbiwKKwkJCQl1bnNpZ25lZCBpbnQgKl9fcmVzdHJpY3QgX19tc2dfcHJpbywKKwkJCQlfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX19yZXN0cmljdCBfX2Fic190aW1lb3V0KQorICBfX25vbm51bGwgKCgyLCA1KSk7CisKKy8qIEFkZCBtZXNzYWdlIHBvaW50ZWQgYnkgTVNHX1BUUiB0byBtZXNzYWdlIHF1ZXVlIE1RREVTLCBzdG9wIGJsb2NraW5nCisgICBvbiBmdWxsIG1lc3NhZ2UgcXVldWUgaWYgQUJTX1RJTUVPVVQgZXhwaXJlcy4gICovCitleHRlcm4gaW50IG1xX3RpbWVkc2VuZCAobXFkX3QgX19tcWRlcywgX19jb25zdCBjaGFyICpfX21zZ19wdHIsCisJCQkgc2l6ZV90IF9fbXNnX2xlbiwgdW5zaWduZWQgaW50IF9fbXNnX3ByaW8sCisJCQkgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fYWJzX3RpbWVvdXQpCisgIF9fbm9ubnVsbCAoKDIsIDUpKTsKKyNlbmRpZgorCisvKiBEZWZpbmUgc29tZSBpbmxpbmVzIGhlbHBpbmcgdG8gY2F0Y2ggY29tbW9uIHByb2JsZW1zLiAgKi8KKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgXAorICAgICYmIGRlZmluZWQgX192YV9hcmdfcGFja19sZW4KKyMgaW5jbHVkZSA8Yml0cy9tcXVldWUyLmg+CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIG1xdWV1ZS5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL210ZC9pbmZ0bC11c2VyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL210ZC9pbmZ0bC11c2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM3NmJkMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbXRkL2luZnRsLXVzZXIuaApAQCAtMCwwICsxLDkxIEBACisvKgorICogUGFydHMgb2YgSU5GVEwgaGVhZGVycyBzaGFyZWQgd2l0aCB1c2Vyc3BhY2UKKyAqCisgKi8KKworI2lmbmRlZiBfX01URF9JTkZUTF9VU0VSX0hfXworI2RlZmluZSBfX01URF9JTkZUTF9VU0VSX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZQlPU0FLX1ZFUlNJT04JMHg1MTIwCisjZGVmaW5lCVBFUkNFTlRVU0VECTk4CisKKyNkZWZpbmUJU0VDVE9SU0laRQk1MTIKKworLyogQmxvY2sgQ29udHJvbCBJbmZvcm1hdGlvbiAqLworCitzdHJ1Y3QgaW5mdGxfYmNpIHsKKwlfX3U4IEVDQ3NpZ1s2XTsKKwlfX3U4IFN0YXR1czsKKwlfX3U4IFN0YXR1czE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaW5mdGxfdW5pdGhlYWQxIHsKKwlfX3UxNiB2aXJ0dWFsVW5pdE5vOworCV9fdTE2IHByZXZVbml0Tm87CisJX191OCBBTkFDOworCV9fdTggTkFDczsKKwlfX3U4IHBhcml0eVBlckZpZWxkOworCV9fdTggZGlzY2FyZGVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGluZnRsX3VuaXRoZWFkMiB7CisJX191OCBwYXJpdHlQZXJGaWVsZDsKKwlfX3U4IEFOQUM7CisJX191MTYgcHJldlVuaXRObzsKKwlfX3UxNiB2aXJ0dWFsVW5pdE5vOworCV9fdTggTkFDczsKKwlfX3U4IGRpc2NhcmRlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBpbmZ0bF91bml0dGFpbCB7CisJX191OCBSZXNlcnZlZFs0XTsKKwlfX3UxNiBFcmFzZU1hcms7CisJX191MTYgRXJhc2VNYXJrMTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3VuaW9uIGluZnRsX3VjaSB7CisJc3RydWN0IGluZnRsX3VuaXRoZWFkMSBhOworCXN0cnVjdCBpbmZ0bF91bml0aGVhZDIgYjsKKwlzdHJ1Y3QgaW5mdGxfdW5pdHRhaWwgYzsKK307CisKK3N0cnVjdCBpbmZ0bF9vb2IgeworCXN0cnVjdCBpbmZ0bF9iY2kgYjsKKwl1bmlvbiBpbmZ0bF91Y2kgdTsKK307CisKKworLyogSU5GVEwgTWVkaWEgSGVhZGVyICovCisKK3N0cnVjdCBJTkZUTFBhcnRpdGlvbiB7CisJX191MzIgdmlydHVhbFVuaXRzOworCV9fdTMyIGZpcnN0VW5pdDsKKwlfX3UzMiBsYXN0VW5pdDsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBzcGFyZVVuaXRzOworCV9fdTMyIFJlc2VydmVkMDsKKwlfX3UzMiBSZXNlcnZlZDE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgSU5GVExNZWRpYUhlYWRlciB7CisJY2hhciBib290UmVjb3JkSURbOF07CisJX191MzIgTm9PZkJvb3RJbWFnZUJsb2NrczsKKwlfX3UzMiBOb09mQmluYXJ5UGFydGl0aW9uczsKKwlfX3UzMiBOb09mQkRUTFBhcnRpdGlvbnM7CisJX191MzIgQmxvY2tNdWx0aXBsaWVyQml0czsKKwlfX3UzMiBGb3JtYXRGbGFnczsKKwlfX3UzMiBPc2FrVmVyc2lvbjsKKwlfX3UzMiBQZXJjZW50VXNlZDsKKwlzdHJ1Y3QgSU5GVExQYXJ0aXRpb24gUGFydGl0aW9uc1s0XTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFBhcnRpdGlvbiBmbGFnIHR5cGVzICovCisjZGVmaW5lCUlORlRMX0JJTkFSWQkweDIwMDAwMDAwCisjZGVmaW5lCUlORlRMX0JEVEwJMHg0MDAwMDAwMAorI2RlZmluZQlJTkZUTF9MQVNUCTB4ODAwMDAwMDAKKworI2VuZGlmIC8qIF9fTVREX0lORlRMX1VTRVJfSF9fICovCisKKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9tdGQvbXRkLWFiaS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9tdGQvbXRkLWFiaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZTE2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL210ZC9tdGQtYWJpLmgKQEAgLTAsMCArMSwyNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMTk5OS0yMDEwIERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4gZXQgYWwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX01URF9BQklfSF9fCisjZGVmaW5lIF9fTVREX0FCSV9IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBlcmFzZV9pbmZvX3VzZXIgeworCV9fdTMyIHN0YXJ0OworCV9fdTMyIGxlbmd0aDsKK307CisKK3N0cnVjdCBlcmFzZV9pbmZvX3VzZXI2NCB7CisJX191NjQgc3RhcnQ7CisJX191NjQgbGVuZ3RoOworfTsKKworc3RydWN0IG10ZF9vb2JfYnVmIHsKKwlfX3UzMiBzdGFydDsKKwlfX3UzMiBsZW5ndGg7CisJdW5zaWduZWQgY2hhciAqcHRyOworfTsKKworc3RydWN0IG10ZF9vb2JfYnVmNjQgeworCV9fdTY0IHN0YXJ0OworCV9fdTMyIHBhZDsKKwlfX3UzMiBsZW5ndGg7CisJX191NjQgdXNyX3B0cjsKK307CisKKy8qKgorICogTVREIG9wZXJhdGlvbiBtb2RlcworICoKKyAqIEBNVERfT1BTX1BMQUNFX09PQjoJT09CIGRhdGEgYXJlIHBsYWNlZCBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IChkZWZhdWx0KQorICogQE1URF9PUFNfQVVUT19PT0I6CU9PQiBkYXRhIGFyZSBhdXRvbWF0aWNhbGx5IHBsYWNlZCBhdCB0aGUgZnJlZSBhcmVhcworICoJCQl3aGljaCBhcmUgZGVmaW5lZCBieSB0aGUgaW50ZXJuYWwgZWNjbGF5b3V0CisgKiBATVREX09QU19SQVc6CWRhdGEgYXJlIHRyYW5zZmVycmVkIGFzLWlzLCB3aXRoIG5vIGVycm9yIGNvcnJlY3Rpb247CisgKgkJCXRoaXMgbW9kZSBpbXBsaWVzICVNVERfT1BTX1BMQUNFX09PQgorICoKKyAqIFRoZXNlIG1vZGVzIGNhbiBiZSBwYXNzZWQgdG8gaW9jdGwoTUVNV1JJVEUpIGFuZCBhcmUgYWxzbyB1c2VkIGludGVybmFsbHkuCisgKiBTZWUgbm90ZXMgb24gIk1URCBmaWxlIG1vZGVzIiBmb3IgZGlzY3Vzc2lvbiBvbiAlTVREX09QU19SQVcgdnMuCisgKiAlTVREX0ZJTEVfTU9ERV9SQVcuCisgKi8KK2VudW0geworCU1URF9PUFNfUExBQ0VfT09CID0gMCwKKwlNVERfT1BTX0FVVE9fT09CID0gMSwKKwlNVERfT1BTX1JBVyA9IDIsCit9OworCisvKioKKyAqIHN0cnVjdCBtdGRfd3JpdGVfcmVxIC0gZGF0YSBzdHJ1Y3R1cmUgZm9yIHJlcXVlc3RpbmcgYSB3cml0ZSBvcGVyYXRpb24KKyAqCisgKiBAc3RhcnQ6CXN0YXJ0IGFkZHJlc3MKKyAqIEBsZW46CWxlbmd0aCBvZiBkYXRhIGJ1ZmZlcgorICogQG9vYmxlbjoJbGVuZ3RoIG9mIE9PQiBidWZmZXIKKyAqIEB1c3JfZGF0YToJdXNlci1wcm92aWRlZCBkYXRhIGJ1ZmZlcgorICogQHVzcl9vb2I6CXVzZXItcHJvdmlkZWQgT09CIGJ1ZmZlcgorICogQG1vZGU6CU1URCBtb2RlIChzZWUgIk1URCBvcGVyYXRpb24gbW9kZXMiKQorICogQHBhZGRpbmc6CXJlc2VydmVkLCBtdXN0IGJlIHNldCB0byAwCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgc3VwcG9ydHMgaW9jdGwoTUVNV1JJVEUpIG9wZXJhdGlvbnMsIGFsbG93aW5nIGRhdGEgYW5kL29yIE9PQgorICogd3JpdGVzIGluIHZhcmlvdXMgbW9kZXMuIFRvIHdyaXRlIHRvIE9PQi1vbmx5LCBzZXQgQHVzcl9kYXRhID09IE5VTEwsIGFuZCB0bworICogd3JpdGUgZGF0YS1vbmx5LCBzZXQgQHVzcl9vb2IgPT0gTlVMTC4gSG93ZXZlciwgc2V0dGluZyBib3RoIEB1c3JfZGF0YSBhbmQKKyAqIEB1c3Jfb29iIHRvIE5VTEwgaXMgbm90IGFsbG93ZWQuCisgKi8KK3N0cnVjdCBtdGRfd3JpdGVfcmVxIHsKKwlfX3U2NCBzdGFydDsKKwlfX3U2NCBsZW47CisJX191NjQgb29ibGVuOworCV9fdTY0IHVzcl9kYXRhOworCV9fdTY0IHVzcl9vb2I7CisJX191OCBtb2RlOworCV9fdTggcGFkZGluZ1s3XTsKK307CisKKyNkZWZpbmUgTVREX0FCU0VOVAkJMAorI2RlZmluZSBNVERfUkFNCQkJMQorI2RlZmluZSBNVERfUk9NCQkJMgorI2RlZmluZSBNVERfTk9SRkxBU0gJCTMKKyNkZWZpbmUgTVREX05BTkRGTEFTSAkJNAorI2RlZmluZSBNVERfREFUQUZMQVNICQk2CisjZGVmaW5lIE1URF9VQklWT0xVTUUJCTcKKyNkZWZpbmUgTVREX01MQ05BTkRGTEFTSAk4CisKKyNkZWZpbmUgTVREX1dSSVRFQUJMRQkJMHg0MDAJLyogRGV2aWNlIGlzIHdyaXRlYWJsZSAqLworI2RlZmluZSBNVERfQklUX1dSSVRFQUJMRQkweDgwMAkvKiBTaW5nbGUgYml0cyBjYW4gYmUgZmxpcHBlZCAqLworI2RlZmluZSBNVERfTk9fRVJBU0UJCTB4MTAwMAkvKiBObyBlcmFzZSBuZWNlc3NhcnkgKi8KKyNkZWZpbmUgTVREX1BPV0VSVVBfTE9DSwkweDIwMDAJLyogQWx3YXlzIGxvY2tlZCBhZnRlciByZXNldCAqLworCisvKiBTb21lIGNvbW1vbiBkZXZpY2VzIC8gY29tYmluYXRpb25zIG9mIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBNVERfQ0FQX1JPTQkJMAorI2RlZmluZSBNVERfQ0FQX1JBTQkJKE1URF9XUklURUFCTEUgfCBNVERfQklUX1dSSVRFQUJMRSB8IE1URF9OT19FUkFTRSkKKyNkZWZpbmUgTVREX0NBUF9OT1JGTEFTSAkoTVREX1dSSVRFQUJMRSB8IE1URF9CSVRfV1JJVEVBQkxFKQorI2RlZmluZSBNVERfQ0FQX05BTkRGTEFTSAkoTVREX1dSSVRFQUJMRSkKKworLyogT2Jzb2xldGUgRUNDIGJ5dGUgcGxhY2VtZW50IG1vZGVzICh1c2VkIHdpdGggb2Jzb2xldGUgTUVNR0VUT09CU0VMKSAqLworI2RlZmluZSBNVERfTkFOREVDQ19PRkYJCTAJLy8gU3dpdGNoIG9mZiBFQ0MgKE5vdCByZWNvbW1lbmRlZCkKKyNkZWZpbmUgTVREX05BTkRFQ0NfUExBQ0UJMQkvLyBVc2UgdGhlIGdpdmVuIHBsYWNlbWVudCBpbiB0aGUgc3RydWN0dXJlIChZQUZGUzEgbGVnYWN5IG1vZGUpCisjZGVmaW5lIE1URF9OQU5ERUNDX0FVVE9QTEFDRQkyCS8vIFVzZSB0aGUgZGVmYXVsdCBwbGFjZW1lbnQgc2NoZW1lCisjZGVmaW5lIE1URF9OQU5ERUNDX1BMQUNFT05MWQkzCS8vIFVzZSB0aGUgZ2l2ZW4gcGxhY2VtZW50IGluIHRoZSBzdHJ1Y3R1cmUgKERvIG5vdCBzdG9yZSBlY2MgcmVzdWx0IG9uIHJlYWQpCisjZGVmaW5lIE1URF9OQU5ERUNDX0FVVE9QTF9VU1IgCTQJLy8gVXNlIHRoZSBnaXZlbiBhdXRvcGxhY2VtZW50IHNjaGVtZSByYXRoZXIgdGhhbiB1c2luZyB0aGUgZGVmYXVsdAorCisvKiBPVFAgbW9kZSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgTVREX09UUF9PRkYJCTAKKyNkZWZpbmUgTVREX09UUF9GQUNUT1JZCQkxCisjZGVmaW5lIE1URF9PVFBfVVNFUgkJMgorCitzdHJ1Y3QgbXRkX2luZm9fdXNlciB7CisJX191OCB0eXBlOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHNpemU7CS8qIFRvdGFsIHNpemUgb2YgdGhlIE1URCAqLworCV9fdTMyIGVyYXNlc2l6ZTsKKwlfX3UzMiB3cml0ZXNpemU7CisJX191MzIgb29ic2l6ZTsJLyogQW1vdW50IG9mIE9PQiBkYXRhIHBlciBibG9jayAoZS5nLiAxNikgKi8KKwlfX3U2NCBwYWRkaW5nOwkvKiBPbGQgb2Jzb2xldGUgZmllbGQ7IGRvIG5vdCB1c2UgKi8KK307CisKK3N0cnVjdCByZWdpb25faW5mb191c2VyIHsKKwlfX3UzMiBvZmZzZXQ7CQkvKiBBdCB3aGljaCB0aGlzIHJlZ2lvbiBzdGFydHMsCisJCQkJICogZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBNVEQgKi8KKwlfX3UzMiBlcmFzZXNpemU7CS8qIEZvciB0aGlzIHJlZ2lvbiAqLworCV9fdTMyIG51bWJsb2NrczsJLyogTnVtYmVyIG9mIGJsb2NrcyBpbiB0aGlzIHJlZ2lvbiAqLworCV9fdTMyIHJlZ2lvbmluZGV4OworfTsKKworc3RydWN0IG90cF9pbmZvIHsKKwlfX3UzMiBzdGFydDsKKwlfX3UzMiBsZW5ndGg7CisJX191MzIgbG9ja2VkOworfTsKKworLyoKKyAqIE5vdGUsIHRoZSBmb2xsb3dpbmcgaW9jdGwgZXhpc3RlZCBpbiB0aGUgcGFzdCBhbmQgd2FzIHJlbW92ZWQ6CisgKiAjZGVmaW5lIE1FTVNFVE9PQlNFTCAgICAgICAgICAgX0lPVygnTScsIDksIHN0cnVjdCBuYW5kX29vYmluZm8pCisgKiBUcnkgdG8gYXZvaWQgYWRkaW5nIGEgbmV3IGlvY3RsIHdpdGggdGhlIHNhbWUgaW9jdGwgbnVtYmVyLgorICovCisKKy8qIEdldCBiYXNpYyBNVEQgY2hhcmFjdGVyaXN0aWNzIGluZm8gKGJldHRlciB0byB1c2Ugc3lzZnMpICovCisjZGVmaW5lIE1FTUdFVElORk8JCV9JT1IoJ00nLCAxLCBzdHJ1Y3QgbXRkX2luZm9fdXNlcikKKy8qIEVyYXNlIHNlZ21lbnQgb2YgTVREICovCisjZGVmaW5lIE1FTUVSQVNFCQlfSU9XKCdNJywgMiwgc3RydWN0IGVyYXNlX2luZm9fdXNlcikKKy8qIFdyaXRlIG91dC1vZi1iYW5kIGRhdGEgZnJvbSBNVEQgKi8KKyNkZWZpbmUgTUVNV1JJVEVPT0IJCV9JT1dSKCdNJywgMywgc3RydWN0IG10ZF9vb2JfYnVmKQorLyogUmVhZCBvdXQtb2YtYmFuZCBkYXRhIGZyb20gTVREICovCisjZGVmaW5lIE1FTVJFQURPT0IJCV9JT1dSKCdNJywgNCwgc3RydWN0IG10ZF9vb2JfYnVmKQorLyogTG9jayBhIGNoaXAgKGZvciBNVEQgdGhhdCBzdXBwb3J0cyBpdCkgKi8KKyNkZWZpbmUgTUVNTE9DSwkJCV9JT1coJ00nLCA1LCBzdHJ1Y3QgZXJhc2VfaW5mb191c2VyKQorLyogVW5sb2NrIGEgY2hpcCAoZm9yIE1URCB0aGF0IHN1cHBvcnRzIGl0KSAqLworI2RlZmluZSBNRU1VTkxPQ0sJCV9JT1coJ00nLCA2LCBzdHJ1Y3QgZXJhc2VfaW5mb191c2VyKQorLyogR2V0IHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGVyYXNlIHJlZ2lvbnMgKi8KKyNkZWZpbmUgTUVNR0VUUkVHSU9OQ09VTlQJX0lPUignTScsIDcsIGludCkKKy8qIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJhc2UgcmVnaW9uIGZvciBhIHNwZWNpZmljIGluZGV4ICovCisjZGVmaW5lIE1FTUdFVFJFR0lPTklORk8JX0lPV1IoJ00nLCA4LCBzdHJ1Y3QgcmVnaW9uX2luZm9fdXNlcikKKy8qIEdldCBpbmZvIGFib3V0IE9PQiBtb2RlcyAoZS5nLiwgUkFXLCBQTEFDRSwgQVVUTykgLSBsZWdhY3kgaW50ZXJmYWNlICovCisjZGVmaW5lIE1FTUdFVE9PQlNFTAkJX0lPUignTScsIDEwLCBzdHJ1Y3QgbmFuZF9vb2JpbmZvKQorLyogQ2hlY2sgaWYgYW4gZXJhc2VibG9jayBpcyBiYWQgKi8KKyNkZWZpbmUgTUVNR0VUQkFEQkxPQ0sJCV9JT1coJ00nLCAxMSwgX19rZXJuZWxfbG9mZl90KQorLyogTWFyayBhbiBlcmFzZWJsb2NrIGFzIGJhZCAqLworI2RlZmluZSBNRU1TRVRCQURCTE9DSwkJX0lPVygnTScsIDEyLCBfX2tlcm5lbF9sb2ZmX3QpCisvKiBTZXQgT1RQIChPbmUtVGltZSBQcm9ncmFtbWFibGUpIG1vZGUgKGZhY3RvcnkgdnMuIHVzZXIpICovCisjZGVmaW5lIE9UUFNFTEVDVAkJX0lPUignTScsIDEzLCBpbnQpCisvKiBHZXQgbnVtYmVyIG9mIE9UUCAoT25lLVRpbWUgUHJvZ3JhbW1hYmxlKSByZWdpb25zICovCisjZGVmaW5lIE9UUEdFVFJFR0lPTkNPVU5UCV9JT1coJ00nLCAxNCwgaW50KQorLyogR2V0IGFsbCBPVFAgKE9uZS1UaW1lIFByb2dyYW1tYWJsZSkgaW5mbyBhYm91dCBNVEQgKi8KKyNkZWZpbmUgT1RQR0VUUkVHSU9OSU5GTwlfSU9XKCdNJywgMTUsIHN0cnVjdCBvdHBfaW5mbykKKy8qIExvY2sgYSBnaXZlbiByYW5nZSBvZiB1c2VyIGRhdGEgKG11c3QgYmUgaW4gbW9kZSAlTVREX0ZJTEVfTU9ERV9PVFBfVVNFUikgKi8KKyNkZWZpbmUgT1RQTE9DSwkJCV9JT1IoJ00nLCAxNiwgc3RydWN0IG90cF9pbmZvKQorLyogR2V0IEVDQyBsYXlvdXQgKGRlcHJlY2F0ZWQpICovCisjZGVmaW5lIEVDQ0dFVExBWU9VVAkJX0lPUignTScsIDE3LCBzdHJ1Y3QgbmFuZF9lY2NsYXlvdXRfdXNlcikKKy8qIEdldCBzdGF0aXN0aWNzIGFib3V0IGNvcnJlY3RlZC91bmNvcnJlY3RlZCBlcnJvcnMgKi8KKyNkZWZpbmUgRUNDR0VUU1RBVFMJCV9JT1IoJ00nLCAxOCwgc3RydWN0IG10ZF9lY2Nfc3RhdHMpCisvKiBTZXQgTVREIG1vZGUgb24gYSBwZXItZmlsZS1kZXNjcmlwdG9yIGJhc2lzIChzZWUgIk1URCBmaWxlIG1vZGVzIikgKi8KKyNkZWZpbmUgTVRERklMRU1PREUJCV9JTygnTScsIDE5KQorLyogRXJhc2Ugc2VnbWVudCBvZiBNVEQgKHN1cHBvcnRzIDY0LWJpdCBhZGRyZXNzKSAqLworI2RlZmluZSBNRU1FUkFTRTY0CQlfSU9XKCdNJywgMjAsIHN0cnVjdCBlcmFzZV9pbmZvX3VzZXI2NCkKKy8qIFdyaXRlIGRhdGEgdG8gT09CICg2NC1iaXQgdmVyc2lvbikgKi8KKyNkZWZpbmUgTUVNV1JJVEVPT0I2NAkJX0lPV1IoJ00nLCAyMSwgc3RydWN0IG10ZF9vb2JfYnVmNjQpCisvKiBSZWFkIGRhdGEgZnJvbSBPT0IgKDY0LWJpdCB2ZXJzaW9uKSAqLworI2RlZmluZSBNRU1SRUFET09CNjQJCV9JT1dSKCdNJywgMjIsIHN0cnVjdCBtdGRfb29iX2J1ZjY0KQorLyogQ2hlY2sgaWYgY2hpcCBpcyBsb2NrZWQgKGZvciBNVEQgdGhhdCBzdXBwb3J0cyBpdCkgKi8KKyNkZWZpbmUgTUVNSVNMT0NLRUQJCV9JT1IoJ00nLCAyMywgc3RydWN0IGVyYXNlX2luZm9fdXNlcikKKy8qCisgKiBNb3N0IGdlbmVyaWMgd3JpdGUgaW50ZXJmYWNlOyBjYW4gd3JpdGUgaW4tYmFuZCBhbmQvb3Igb3V0LW9mLWJhbmQgaW4gdmFyaW91cworICogbW9kZXMgKHNlZSAic3RydWN0IG10ZF93cml0ZV9yZXEiKQorICovCisjZGVmaW5lIE1FTVdSSVRFCQlfSU9XUignTScsIDI0LCBzdHJ1Y3QgbXRkX3dyaXRlX3JlcSkKKworLyoKKyAqIE9ic29sZXRlIGxlZ2FjeSBpbnRlcmZhY2UuIEtlZXAgaXQgaW4gb3JkZXIgbm90IHRvIGJyZWFrIHVzZXJzcGFjZQorICogaW50ZXJmYWNlcworICovCitzdHJ1Y3QgbmFuZF9vb2JpbmZvIHsKKwlfX3UzMiB1c2VlY2M7CisJX191MzIgZWNjYnl0ZXM7CisJX191MzIgb29iZnJlZVs4XVsyXTsKKwlfX3UzMiBlY2Nwb3NbMzJdOworfTsKKworc3RydWN0IG5hbmRfb29iZnJlZSB7CisJX191MzIgb2Zmc2V0OworCV9fdTMyIGxlbmd0aDsKK307CisKKyNkZWZpbmUgTVREX01BWF9PT0JGUkVFX0VOVFJJRVMJOAorI2RlZmluZSBNVERfTUFYX0VDQ1BPU19FTlRSSUVTCTY0CisvKgorICogT0JTT0xFVEU6IEVDQyBsYXlvdXQgY29udHJvbCBzdHJ1Y3R1cmUuIEV4cG9ydGVkIHRvIHVzZXItc3BhY2UgdmlhIGlvY3RsCisgKiBFQ0NHRVRMQVlPVVQgZm9yIGJhY2t3YXJkcyBjb21wYXRiaWxpdHkgYW5kIHNob3VsZCBub3QgYmUgbWlzdGFrZW4gYXMgYQorICogY29tcGxldGUgc2V0IG9mIEVDQyBpbmZvcm1hdGlvbi4gVGhlIGlvY3RsIHRydW5jYXRlcyB0aGUgbGFyZ2VyIGludGVybmFsCisgKiBzdHJ1Y3R1cmUgdG8gcmV0YWluIGJpbmFyeSBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHN0YXRpYyBkZWNsYXJhdGlvbiBvZiB0aGUKKyAqIGlvY3RsLiBOb3RlIHRoYXQgdGhlICJNVERfTUFYXy4uLl9FTlRSSUVTIiBtYWNyb3MgcmVwcmVzZW50IHRoZSBtYXggc2l6ZSBvZgorICogdGhlIHVzZXIgc3RydWN0LCBub3QgdGhlIE1BWCBzaXplIG9mIHRoZSBpbnRlcm5hbCBzdHJ1Y3QgbmFuZF9lY2NsYXlvdXQuCisgKi8KK3N0cnVjdCBuYW5kX2VjY2xheW91dF91c2VyIHsKKwlfX3UzMiBlY2NieXRlczsKKwlfX3UzMiBlY2Nwb3NbTVREX01BWF9FQ0NQT1NfRU5UUklFU107CisJX191MzIgb29iYXZhaWw7CisJc3RydWN0IG5hbmRfb29iZnJlZSBvb2JmcmVlW01URF9NQVhfT09CRlJFRV9FTlRSSUVTXTsKK307CisKKy8qKgorICogc3RydWN0IG10ZF9lY2Nfc3RhdHMgLSBlcnJvciBjb3JyZWN0aW9uIHN0YXRzCisgKgorICogQGNvcnJlY3RlZDoJbnVtYmVyIG9mIGNvcnJlY3RlZCBiaXRzCisgKiBAZmFpbGVkOgludW1iZXIgb2YgdW5jb3JyZWN0YWJsZSBlcnJvcnMKKyAqIEBiYWRibG9ja3M6CW51bWJlciBvZiBiYWQgYmxvY2tzIGluIHRoaXMgcGFydGl0aW9uCisgKiBAYmJ0YmxvY2tzOgludW1iZXIgb2YgYmxvY2tzIHJlc2VydmVkIGZvciBiYWQgYmxvY2sgdGFibGVzCisgKi8KK3N0cnVjdCBtdGRfZWNjX3N0YXRzIHsKKwlfX3UzMiBjb3JyZWN0ZWQ7CisJX191MzIgZmFpbGVkOworCV9fdTMyIGJhZGJsb2NrczsKKwlfX3UzMiBiYnRibG9ja3M7Cit9OworCisvKgorICogTVREIGZpbGUgbW9kZXMgLSBmb3IgcmVhZC93cml0ZSBhY2Nlc3MgdG8gTVRECisgKgorICogQE1URF9GSUxFX01PREVfTk9STUFMOglPVFAgZGlzYWJsZWQsIEVDQyBlbmFibGVkCisgKiBATVREX0ZJTEVfTU9ERV9PVFBfRkFDVE9SWToJT1RQIGVuYWJsZWQgaW4gZmFjdG9yeSBtb2RlCisgKiBATVREX0ZJTEVfTU9ERV9PVFBfVVNFUjoJT1RQIGVuYWJsZWQgaW4gdXNlciBtb2RlCisgKiBATVREX0ZJTEVfTU9ERV9SQVc6CQlPVFAgZGlzYWJsZWQsIEVDQyBkaXNhYmxlZAorICoKKyAqIFRoZXNlIG1vZGVzIGNhbiBiZSBzZXQgdmlhIGlvY3RsKE1UREZJTEVNT0RFKS4gVGhlIG1vZGUgbW9kZSB3aWxsIGJlIHJldGFpbmVkCisgKiBzZXBhcmF0ZWx5IGZvciBlYWNoIG9wZW4gZmlsZSBkZXNjcmlwdG9yLgorICoKKyAqIE5vdGU6ICVNVERfRklMRV9NT0RFX1JBVyBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzICVNVERfT1BTX1JBVyAtCisgKiByYXcgYWNjZXNzIHRvIHRoZSBmbGFzaCwgd2l0aG91dCBlcnJvciBjb3JyZWN0aW9uIG9yIGF1dG9wbGFjZW1lbnQgc2NoZW1lcy4KKyAqIFdoZXJldmVyIHBvc3NpYmxlLCB0aGUgTVREX09QU18qIG1vZGUgd2lsbCBvdmVycmlkZSB0aGUgTVREX0ZJTEVfTU9ERV8qIG1vZGUKKyAqIChlLmcuLCB3aGVuIHVzaW5nIGlvY3RsKE1FTVdSSVRFKSksIGJ1dCBpbiBzb21lIGNhc2VzLCB0aGUgTVREX0ZJTEVfTU9ERSBpcworICogdXNlZCBvdXQgb2YgbmVjZXNzaXR5IChlLmcuLCBgd3JpdGUoKScsIGlvY3RsKE1FTVdSSVRFT09CNjQpKS4KKyAqLworZW51bSBtdGRfZmlsZV9tb2RlcyB7CisJTVREX0ZJTEVfTU9ERV9OT1JNQUwgPSBNVERfT1RQX09GRiwKKwlNVERfRklMRV9NT0RFX09UUF9GQUNUT1JZID0gTVREX09UUF9GQUNUT1JZLAorCU1URF9GSUxFX01PREVfT1RQX1VTRVIgPSBNVERfT1RQX1VTRVIsCisJTVREX0ZJTEVfTU9ERV9SQVcsCit9OworCisjZW5kaWYgLyogX19NVERfQUJJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9tdGQvbXRkLXVzZXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbXRkL210ZC11c2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzMjdjOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbXRkL210ZC11c2VyLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAxOTk5LTIwMTAgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19NVERfVVNFUl9IX18KKyNkZWZpbmUgX19NVERfVVNFUl9IX18KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBUaGlzIGZpbGUgaXMgYmxlc3NlZCBmb3IgaW5jbHVzaW9uIGJ5IHVzZXJzcGFjZSAqLworI2luY2x1ZGUgPG10ZC9tdGQtYWJpLmg+CisKK3R5cGVkZWYgc3RydWN0IG10ZF9pbmZvX3VzZXIgbXRkX2luZm9fdDsKK3R5cGVkZWYgc3RydWN0IGVyYXNlX2luZm9fdXNlciBlcmFzZV9pbmZvX3Q7Cit0eXBlZGVmIHN0cnVjdCByZWdpb25faW5mb191c2VyIHJlZ2lvbl9pbmZvX3Q7Cit0eXBlZGVmIHN0cnVjdCBuYW5kX29vYmluZm8gbmFuZF9vb2JpbmZvX3Q7Cit0eXBlZGVmIHN0cnVjdCBuYW5kX2VjY2xheW91dF91c2VyIG5hbmRfZWNjbGF5b3V0X3Q7CisKKyNlbmRpZiAvKiBfX01URF9VU0VSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9tdGQvbmZ0bC11c2VyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL210ZC9uZnRsLXVzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGVhYmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9tdGQvbmZ0bC11c2VyLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAxOTk5LTIwMTAgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19NVERfTkZUTF9VU0VSX0hfXworI2RlZmluZSBfX01URF9ORlRMX1VTRVJfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBCbG9jayBDb250cm9sIEluZm9ybWF0aW9uICovCisKK3N0cnVjdCBuZnRsX2JjaSB7CisJdW5zaWduZWQgY2hhciBFQ0NTaWdbNl07CisJX191OCBTdGF0dXM7CisJX191OCBTdGF0dXMxOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBVbml0IENvbnRyb2wgSW5mb3JtYXRpb24gKi8KKworc3RydWN0IG5mdGxfdWNpMCB7CisJX191MTYgVmlydFVuaXROdW07CisJX191MTYgUmVwbFVuaXROdW07CisJX191MTYgU3BhcmVWaXJ0VW5pdE51bTsKKwlfX3UxNiBTcGFyZVJlcGxVbml0TnVtOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IG5mdGxfdWNpMSB7CisJX191MzIgV2VhckluZm87CisJX191MTYgRXJhc2VNYXJrOworCV9fdTE2IEVyYXNlTWFyazE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgbmZ0bF91Y2kyIHsKKyAgICAgICAgX191MTYgRm9sZE1hcms7CisgICAgICAgIF9fdTE2IEZvbGRNYXJrMTsKKwlfX3UzMiB1bnVzZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCit1bmlvbiBuZnRsX3VjaSB7CisJc3RydWN0IG5mdGxfdWNpMCBhOworCXN0cnVjdCBuZnRsX3VjaTEgYjsKKwlzdHJ1Y3QgbmZ0bF91Y2kyIGM7Cit9OworCitzdHJ1Y3QgbmZ0bF9vb2IgeworCXN0cnVjdCBuZnRsX2JjaSBiOworCXVuaW9uIG5mdGxfdWNpIHU7Cit9OworCisvKiBORlRMIE1lZGlhIEhlYWRlciAqLworCitzdHJ1Y3QgTkZUTE1lZGlhSGVhZGVyIHsKKwljaGFyIERhdGFPcmdJRFs2XTsKKwlfX3UxNiBOdW1FcmFzZVVuaXRzOworCV9fdTE2IEZpcnN0UGh5c2ljYWxFVU47CisJX191MzIgRm9ybWF0dGVkU2l6ZTsKKwl1bnNpZ25lZCBjaGFyIFVuaXRTaXplRmFjdG9yOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBNQVhfRVJBU0VfWk9ORVMgKDgxOTIgLSA1MTIpCisKKyNkZWZpbmUgRVJBU0VfTUFSSyAweDNjNjkKKyNkZWZpbmUgU0VDVE9SX0ZSRUUgMHhmZgorI2RlZmluZSBTRUNUT1JfVVNFRCAweDU1CisjZGVmaW5lIFNFQ1RPUl9JR05PUkUgMHgxMQorI2RlZmluZSBTRUNUT1JfREVMRVRFRCAweDAwCisKKyNkZWZpbmUgRk9MRF9NQVJLX0lOX1BST0dSRVNTIDB4NTU1NQorCisjZGVmaW5lIFpPTkVfR09PRCAweGZmCisjZGVmaW5lIFpPTkVfQkFEX09SSUdJTkFMIDAKKyNkZWZpbmUgWk9ORV9CQURfTUFSS0VEIDcKKworCisjZW5kaWYgLyogX19NVERfTkZUTF9VU0VSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9tdGQvdWJpLXVzZXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbXRkL3ViaS11c2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NlMTk5MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbXRkL3ViaS11c2VyLmgKQEAgLTAsMCArMSw0MTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwNgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBBdXRob3I6IEFydGVtIEJpdHl1dHNraXkgKNCR0LjRgtGO0YbQutC40Lkg0JDRgNGC0ZHQvCkKKyAqLworCisjaWZuZGVmIF9fVUJJX1VTRVJfSF9fCisjZGVmaW5lIF9fVUJJX1VTRVJfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogVUJJIGRldmljZSBjcmVhdGlvbiAodGhlIHNhbWUgYXMgTVREIGRldmljZSBhdHRhY2htZW50KQorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiBNVEQgZGV2aWNlcyBtYXkgYmUgYXR0YWNoZWQgdXNpbmcgJVVCSV9JT0NBVFQgaW9jdGwgY29tbWFuZCBvZiB0aGUgVUJJCisgKiBjb250cm9sIGRldmljZS4gVGhlIGNhbGxlciBoYXMgdG8gcHJvcGVybHkgZmlsbCBhbmQgcGFzcworICogJnN0cnVjdCB1YmlfYXR0YWNoX3JlcSBvYmplY3QgLSBVQkkgd2lsbCBhdHRhY2ggdGhlIE1URCBkZXZpY2Ugc3BlY2lmaWVkIGluCisgKiB0aGUgcmVxdWVzdCBhbmQgcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIFVCSSBkZXZpY2UgbnVtYmVyIGFzIHRoZSBpb2N0bAorICogcmV0dXJuIHZhbHVlLgorICoKKyAqIFVCSSBkZXZpY2UgZGVsZXRpb24gKHRoZSBzYW1lIGFzIE1URCBkZXZpY2UgZGV0YWNobWVudCkKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogQW4gVUJJIGRldmljZSBtYXliZSBkZWxldGVkIHdpdGggJVVCSV9JT0NERVQgaW9jdGwgY29tbWFuZCBvZiB0aGUgVUJJCisgKiBjb250cm9sIGRldmljZS4KKyAqCisgKiBVQkkgdm9sdW1lIGNyZWF0aW9uCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogVUJJIHZvbHVtZXMgYXJlIGNyZWF0ZWQgdmlhIHRoZSAlVUJJX0lPQ01LVk9MIGlvY3RsIGNvbW1hbmQgb2YgVUJJIGNoYXJhY3RlcgorICogZGV2aWNlLiBBICZzdHJ1Y3QgdWJpX21rdm9sX3JlcSBvYmplY3QgaGFzIHRvIGJlIHByb3Blcmx5IGZpbGxlZCBhbmQgYQorICogcG9pbnRlciB0byBpdCBoYXMgdG8gYmUgcGFzc2VkIHRvIHRoZSBpb2N0bC4KKyAqCisgKiBVQkkgdm9sdW1lIGRlbGV0aW9uCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogVG8gZGVsZXRlIGEgdm9sdW1lLCB0aGUgJVVCSV9JT0NSTVZPTCBpb2N0bCBjb21tYW5kIG9mIHRoZSBVQkkgY2hhcmFjdGVyCisgKiBkZXZpY2Ugc2hvdWxkIGJlIHVzZWQuIEEgcG9pbnRlciB0byB0aGUgMzItYml0IHZvbHVtZSBJRCBoYXN0IHRvIGJlIHBhc3NlZAorICogdG8gdGhlIGlvY3RsLgorICoKKyAqIFVCSSB2b2x1bWUgcmUtc2l6ZQorICogfn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogVG8gcmUtc2l6ZSBhIHZvbHVtZSwgdGhlICVVQklfSU9DUlNWT0wgaW9jdGwgY29tbWFuZCBvZiB0aGUgVUJJIGNoYXJhY3RlcgorICogZGV2aWNlIHNob3VsZCBiZSB1c2VkLiBBICZzdHJ1Y3QgdWJpX3Jzdm9sX3JlcSBvYmplY3QgaGFzIHRvIGJlIHByb3Blcmx5CisgKiBmaWxsZWQgYW5kIGEgcG9pbnRlciB0byBpdCBoYXMgdG8gYmUgcGFzc2VkIHRvIHRoZSBpb2N0bC4KKyAqCisgKiBVQkkgdm9sdW1lcyByZS1uYW1lCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogVG8gcmUtbmFtZSBzZXZlcmFsIHZvbHVtZXMgYXRvbWljYWxseSBhdCBvbmUgZ28sIHRoZSAlVUJJX0lPQ1JOVk9MIGNvbW1hbmQKKyAqIG9mIHRoZSBVQkkgY2hhcmFjdGVyIGRldmljZSBzaG91bGQgYmUgdXNlZC4gQSAmc3RydWN0IHViaV9ybnZvbF9yZXEgb2JqZWN0CisgKiBoYXMgdG8gYmUgcHJvcGVybHkgZmlsbGVkIGFuZCBhIHBvaW50ZXIgdG8gaXQgaGFzIHRvIGJlIHBhc3NlZCB0byB0aGUgaW9jdGwuCisgKgorICogVUJJIHZvbHVtZSB1cGRhdGUKKyAqIH5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogVm9sdW1lIHVwZGF0ZSBzaG91bGQgYmUgZG9uZSB2aWEgdGhlICVVQklfSU9DVk9MVVAgaW9jdGwgY29tbWFuZCBvZiB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgVUJJIHZvbHVtZSBjaGFyYWN0ZXIgZGV2aWNlLiBBIHBvaW50ZXIgdG8gYSA2NC1iaXQgdXBkYXRlCisgKiBzaXplIHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIGlvY3RsLiBBZnRlciB0aGlzLCBVQkkgZXhwZWN0cyB1c2VyIHRvIHdyaXRlCisgKiB0aGlzIG51bWJlciBvZiBieXRlcyB0byB0aGUgdm9sdW1lIGNoYXJhY3RlciBkZXZpY2UuIFRoZSB1cGRhdGUgaXMgZmluaXNoZWQKKyAqIHdoZW4gdGhlIGNsYWltZWQgbnVtYmVyIG9mIGJ5dGVzIGlzIHBhc3NlZC4gU28sIHRoZSB2b2x1bWUgdXBkYXRlIHNlcXVlbmNlCisgKiBpcyBzb21ldGhpbmcgbGlrZToKKyAqCisgKiBmZCA9IG9wZW4oIi9kZXYvbXlfdm9sdW1lIik7CisgKiBpb2N0bChmZCwgVUJJX0lPQ1ZPTFVQLCAmaW1hZ2Vfc2l6ZSk7CisgKiB3cml0ZShmZCwgYnVmLCBpbWFnZV9zaXplKTsKKyAqIGNsb3NlKGZkKTsKKyAqCisgKiBMb2dpY2FsIGVyYXNlYmxvY2sgZXJhc2UKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqIFRvIGVyYXNlIGEgbG9naWNhbCBlcmFzZWJsb2NrLCB0aGUgJVVCSV9JT0NFQkVSIGlvY3RsIGNvbW1hbmQgb2YgdGhlCisgKiBjb3JyZXNwb25kaW5nIFVCSSB2b2x1bWUgY2hhcmFjdGVyIGRldmljZSBzaG91bGQgYmUgdXNlZC4gVGhpcyBjb21tYW5kCisgKiB1bm1hcHMgdGhlIHJlcXVlc3RlZCBsb2dpY2FsIGVyYXNlYmxvY2ssIG1ha2VzIHN1cmUgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIHBoeXNpY2FsIGVyYXNlYmxvY2sgaXMgc3VjY2Vzc2Z1bGx5IGVyYXNlZCwgYW5kIHJldHVybnMuCisgKgorICogQXRvbWljIGxvZ2ljYWwgZXJhc2VibG9jayBjaGFuZ2UKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogQXRvbWljIGxvZ2ljYWwgZXJhc2VibG9jayBjaGFuZ2Ugb3BlcmF0aW9uIGlzIGNhbGxlZCB1c2luZyB0aGUgJVVCSV9JT0NFQkNICisgKiBpb2N0bCBjb21tYW5kIG9mIHRoZSBjb3JyZXNwb25kaW5nIFVCSSB2b2x1bWUgY2hhcmFjdGVyIGRldmljZS4gQSBwb2ludGVyIHRvCisgKiBhICZzdHJ1Y3QgdWJpX2xlYl9jaGFuZ2VfcmVxIG9iamVjdCBoYXMgdG8gYmUgcGFzc2VkIHRvIHRoZSBpb2N0bC4gVGhlbiB0aGUKKyAqIHVzZXIgaXMgZXhwZWN0ZWQgdG8gd3JpdGUgdGhlIHJlcXVlc3RlZCBhbW91bnQgb2YgYnl0ZXMgKHNpbWlsYXJseSB0byB3aGF0CisgKiBzaG91bGQgYmUgZG9uZSBpbiBjYXNlIG9mIHRoZSAidm9sdW1lIHVwZGF0ZSIgaW9jdGwpLgorICoKKyAqIExvZ2ljYWwgZXJhc2VibG9jayBtYXAKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqIFRvIG1hcCBhIGxvZ2ljYWwgZXJhc2VibG9jayB0byBhIHBoeXNpY2FsIGVyYXNlYmxvY2ssIHRoZSAlVUJJX0lPQ0VCTUFQCisgKiBpb2N0bCBjb21tYW5kIHNob3VsZCBiZSB1c2VkLiBBIHBvaW50ZXIgdG8gYSAmc3RydWN0IHViaV9tYXBfcmVxIG9iamVjdCBpcworICogZXhwZWN0ZWQgdG8gYmUgcGFzc2VkLiBUaGUgaW9jdGwgbWFwcyB0aGUgcmVxdWVzdGVkIGxvZ2ljYWwgZXJhc2VibG9jayB0bworICogYSBwaHlzaWNhbCBlcmFzZWJsb2NrIGFuZCByZXR1cm5zLiAgT25seSBub24tbWFwcGVkIGxvZ2ljYWwgZXJhc2VibG9ja3MgY2FuCisgKiBiZSBtYXBwZWQuIElmIHRoZSBsb2dpY2FsIGVyYXNlYmxvY2sgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IGlzIGFscmVhZHkKKyAqIG1hcHBlZCB0byBhIHBoeXNpY2FsIGVyYXNlYmxvY2ssIHRoZSBpb2N0bCBmYWlscyBhbmQgcmV0dXJucyBlcnJvci4KKyAqCisgKiBMb2dpY2FsIGVyYXNlYmxvY2sgdW5tYXAKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqIFRvIHVubWFwIGEgbG9naWNhbCBlcmFzZWJsb2NrIHRvIGEgcGh5c2ljYWwgZXJhc2VibG9jaywgdGhlICVVQklfSU9DRUJVTk1BUAorICogaW9jdGwgY29tbWFuZCBzaG91bGQgYmUgdXNlZC4gVGhlIGlvY3RsIHVubWFwcyB0aGUgbG9naWNhbCBlcmFzZWJsb2NrcywKKyAqIHNjaGVkdWxlcyBjb3JyZXNwb25kaW5nIHBoeXNpY2FsIGVyYXNlYmxvY2sgZm9yIGVyYXN1cmUsIGFuZCByZXR1cm5zLiBVbmxpa2UKKyAqIHRoZSAiTEVCIGVyYXNlIiBjb21tYW5kLCBpdCBkb2VzIG5vdCB3YWl0IGZvciB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayBiZWluZworICogZXJhc2VkLiBOb3RlLCB0aGUgc2lkZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IGlmIGFuIHVuY2xlYW4gcmVib290IGhhcHBlbnMKKyAqIGFmdGVyIHRoZSB1bm1hcCBpb2N0bCByZXR1cm5zLCB5b3UgbWF5IGZpbmQgdGhlIExFQiBtYXBwZWQgYWdhaW4gdG8gdGhlIHNhbWUKKyAqIHBoeXNpY2FsIGVyYXNlYmxvY2sgYWZ0ZXIgdGhlIFVCSSBpcyBydW4gYWdhaW4uCisgKgorICogQ2hlY2sgaWYgbG9naWNhbCBlcmFzZWJsb2NrIGlzIG1hcHBlZAorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiBUbyBjaGVjayBpZiBhIGxvZ2ljYWwgZXJhc2VibG9jayBpcyBtYXBwZWQgdG8gYSBwaHlzaWNhbCBlcmFzZWJsb2NrLCB0aGUKKyAqICVVQklfSU9DRUJJU01BUCBpb2N0bCBjb21tYW5kIHNob3VsZCBiZSB1c2VkLiBJdCByZXR1cm5zICUwIGlmIHRoZSBMRUIgaXMKKyAqIG5vdCBtYXBwZWQsIGFuZCAlMSBpZiBpdCBpcyBtYXBwZWQuCisgKgorICogU2V0IGFuIFVCSSB2b2x1bWUgcHJvcGVydHkKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiBUbyBzZXQgYW4gVUJJIHZvbHVtZSBwcm9wZXJ0eSB0aGUgJVVCSV9JT0NTRVRQUk9QIGlvY3RsIGNvbW1hbmQgc2hvdWxkIGJlCisgKiB1c2VkLiBBIHBvaW50ZXIgdG8gYSAmc3RydWN0IHViaV9zZXRfdm9sX3Byb3BfcmVxIG9iamVjdCBpcyBleHBlY3RlZCB0byBiZQorICogcGFzc2VkLiBUaGUgb2JqZWN0IGRlc2NyaWJlcyB3aGljaCBwcm9wZXJ0eSBzaG91bGQgYmUgc2V0LCBhbmQgdG8gd2hpY2ggdmFsdWUKKyAqIGl0IHNob3VsZCBiZSBzZXQuCisgKi8KKworLyoKKyAqIFdoZW4gYSBuZXcgVUJJIHZvbHVtZSBvciBVQkkgZGV2aWNlIGlzIGNyZWF0ZWQsIHVzZXJzIG1heSBlaXRoZXIgc3BlY2lmeSB0aGUKKyAqIHZvbHVtZS9kZXZpY2UgbnVtYmVyIHRoZXkgd2FudCB0byBjcmVhdGUgb3IgdG8gbGV0IFVCSSBhdXRvbWF0aWNhbGx5IGFzc2lnbgorICogdGhlIG51bWJlciB1c2luZyB0aGVzZSBjb25zdGFudHMuCisgKi8KKyNkZWZpbmUgVUJJX1ZPTF9OVU1fQVVUTyAoLTEpCisjZGVmaW5lIFVCSV9ERVZfTlVNX0FVVE8gKC0xKQorCisvKiBNYXhpbXVtIHZvbHVtZSBuYW1lIGxlbmd0aCAqLworI2RlZmluZSBVQklfTUFYX1ZPTFVNRV9OQU1FIDEyNworCisvKiBpb2N0bCBjb21tYW5kcyBvZiBVQkkgY2hhcmFjdGVyIGRldmljZXMgKi8KKworI2RlZmluZSBVQklfSU9DX01BR0lDICdvJworCisvKiBDcmVhdGUgYW4gVUJJIHZvbHVtZSAqLworI2RlZmluZSBVQklfSU9DTUtWT0wgX0lPVyhVQklfSU9DX01BR0lDLCAwLCBzdHJ1Y3QgdWJpX21rdm9sX3JlcSkKKy8qIFJlbW92ZSBhbiBVQkkgdm9sdW1lICovCisjZGVmaW5lIFVCSV9JT0NSTVZPTCBfSU9XKFVCSV9JT0NfTUFHSUMsIDEsIF9fczMyKQorLyogUmUtc2l6ZSBhbiBVQkkgdm9sdW1lICovCisjZGVmaW5lIFVCSV9JT0NSU1ZPTCBfSU9XKFVCSV9JT0NfTUFHSUMsIDIsIHN0cnVjdCB1YmlfcnN2b2xfcmVxKQorLyogUmUtbmFtZSB2b2x1bWVzICovCisjZGVmaW5lIFVCSV9JT0NSTlZPTCBfSU9XKFVCSV9JT0NfTUFHSUMsIDMsIHN0cnVjdCB1Ymlfcm52b2xfcmVxKQorCisvKiBpb2N0bCBjb21tYW5kcyBvZiB0aGUgVUJJIGNvbnRyb2wgY2hhcmFjdGVyIGRldmljZSAqLworCisjZGVmaW5lIFVCSV9DVFJMX0lPQ19NQUdJQyAnbycKKworLyogQXR0YWNoIGFuIE1URCBkZXZpY2UgKi8KKyNkZWZpbmUgVUJJX0lPQ0FUVCBfSU9XKFVCSV9DVFJMX0lPQ19NQUdJQywgNjQsIHN0cnVjdCB1YmlfYXR0YWNoX3JlcSkKKy8qIERldGFjaCBhbiBNVEQgZGV2aWNlICovCisjZGVmaW5lIFVCSV9JT0NERVQgX0lPVyhVQklfQ1RSTF9JT0NfTUFHSUMsIDY1LCBfX3MzMikKKworLyogaW9jdGwgY29tbWFuZHMgb2YgVUJJIHZvbHVtZSBjaGFyYWN0ZXIgZGV2aWNlcyAqLworCisjZGVmaW5lIFVCSV9WT0xfSU9DX01BR0lDICdPJworCisvKiBTdGFydCBVQkkgdm9sdW1lIHVwZGF0ZSAqLworI2RlZmluZSBVQklfSU9DVk9MVVAgX0lPVyhVQklfVk9MX0lPQ19NQUdJQywgMCwgX19zNjQpCisvKiBMRUIgZXJhc3VyZSBjb21tYW5kLCB1c2VkIGZvciBkZWJ1Z2dpbmcsIGRpc2FibGVkIGJ5IGRlZmF1bHQgKi8KKyNkZWZpbmUgVUJJX0lPQ0VCRVIgX0lPVyhVQklfVk9MX0lPQ19NQUdJQywgMSwgX19zMzIpCisvKiBBdG9taWMgTEVCIGNoYW5nZSBjb21tYW5kICovCisjZGVmaW5lIFVCSV9JT0NFQkNIIF9JT1coVUJJX1ZPTF9JT0NfTUFHSUMsIDIsIF9fczMyKQorLyogTWFwIExFQiBjb21tYW5kICovCisjZGVmaW5lIFVCSV9JT0NFQk1BUCBfSU9XKFVCSV9WT0xfSU9DX01BR0lDLCAzLCBzdHJ1Y3QgdWJpX21hcF9yZXEpCisvKiBVbm1hcCBMRUIgY29tbWFuZCAqLworI2RlZmluZSBVQklfSU9DRUJVTk1BUCBfSU9XKFVCSV9WT0xfSU9DX01BR0lDLCA0LCBfX3MzMikKKy8qIENoZWNrIGlmIExFQiBpcyBtYXBwZWQgY29tbWFuZCAqLworI2RlZmluZSBVQklfSU9DRUJJU01BUCBfSU9SKFVCSV9WT0xfSU9DX01BR0lDLCA1LCBfX3MzMikKKy8qIFNldCBhbiBVQkkgdm9sdW1lIHByb3BlcnR5ICovCisjZGVmaW5lIFVCSV9JT0NTRVRWT0xQUk9QIF9JT1coVUJJX1ZPTF9JT0NfTUFHSUMsIDYsIFwKKwkJCSAgICAgICBzdHJ1Y3QgdWJpX3NldF92b2xfcHJvcF9yZXEpCisKKy8qIE1heGltdW0gTVREIGRldmljZSBuYW1lIGxlbmd0aCBzdXBwb3J0ZWQgYnkgVUJJICovCisjZGVmaW5lIE1BWF9VQklfTVREX05BTUVfTEVOIDEyNworCisvKiBNYXhpbXVtIGFtb3VudCBvZiBVQkkgdm9sdW1lcyB0aGF0IGNhbiBiZSByZS1uYW1lZCBhdCBvbmUgZ28gKi8KKyNkZWZpbmUgVUJJX01BWF9STlZPTCAzMgorCisvKgorICogVUJJIGRhdGEgdHlwZSBoaW50IGNvbnN0YW50cy4KKyAqCisgKiBVQklfTE9OR1RFUk06IGxvbmctdGVybSBkYXRhCisgKiBVQklfU0hPUlRURVJNOiBzaG9ydC10ZXJtIGRhdGEKKyAqIFVCSV9VTktOT1dOOiBkYXRhIHBlcnNpc3RlbmNlIGlzIHVua25vd24KKyAqCisgKiBUaGVzZSBjb25zdGFudHMgYXJlIHVzZWQgd2hlbiBkYXRhIGlzIHdyaXR0ZW4gdG8gVUJJIHZvbHVtZXMgaW4gb3JkZXIgdG8KKyAqIGhlbHAgdGhlIFVCSSB3ZWFyLWxldmVsaW5nIHVuaXQgdG8gZmluZCBtb3JlIGFwcHJvcHJpYXRlIHBoeXNpY2FsCisgKiBlcmFzZWJsb2Nrcy4KKyAqLworZW51bSB7CisJVUJJX0xPTkdURVJNICA9IDEsCisJVUJJX1NIT1JUVEVSTSA9IDIsCisJVUJJX1VOS05PV04gICA9IDMsCit9OworCisvKgorICogVUJJIHZvbHVtZSB0eXBlIGNvbnN0YW50cy4KKyAqCisgKiBAVUJJX0RZTkFNSUNfVk9MVU1FOiBkeW5hbWljIHZvbHVtZQorICogQFVCSV9TVEFUSUNfVk9MVU1FOiAgc3RhdGljIHZvbHVtZQorICovCitlbnVtIHsKKwlVQklfRFlOQU1JQ19WT0xVTUUgPSAzLAorCVVCSV9TVEFUSUNfVk9MVU1FICA9IDQsCit9OworCisvKgorICogVUJJIHNldCB2b2x1bWUgcHJvcGVydHkgaW9jdGwgY29uc3RhbnRzLgorICoKKyAqIEBVQklfVk9MX1BST1BfRElSRUNUX1dSSVRFOiBhbGxvdyAoYW55IG5vbi16ZXJvIHZhbHVlKSBvciBkaXNhbGxvdyAodmFsdWUgMCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyIHRvIGRpcmVjdGx5IHdyaXRlIGFuZCBlcmFzZSBpbmRpdmlkdWFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJhc2VibG9ja3Mgb24gZHluYW1pYyB2b2x1bWVzCisgKi8KK2VudW0geworCVVCSV9WT0xfUFJPUF9ESVJFQ1RfV1JJVEUgPSAxLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgdWJpX2F0dGFjaF9yZXEgLSBhdHRhY2ggTVREIGRldmljZSByZXF1ZXN0LgorICogQHViaV9udW06IFVCSSBkZXZpY2UgbnVtYmVyIHRvIGNyZWF0ZQorICogQG10ZF9udW06IE1URCBkZXZpY2UgbnVtYmVyIHRvIGF0dGFjaAorICogQHZpZF9oZHJfb2Zmc2V0OiBWSUQgaGVhZGVyIG9mZnNldCAodXNlIGRlZmF1bHRzIGlmICUwKQorICogQHBhZGRpbmc6IHJlc2VydmVkIGZvciBmdXR1cmUsIG5vdCB1c2VkLCBoYXMgdG8gYmUgemVyb2VkCisgKgorICogVGhpcyBkYXRhIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHNwZWNpZnkgTVREIGRldmljZSBVQkkgaGFzIHRvIGF0dGFjaCBhbmQgdGhlCisgKiBwYXJhbWV0ZXJzIGl0IGhhcyB0byB1c2UuIFRoZSBudW1iZXIgd2hpY2ggc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSBuZXcgVUJJCisgKiBkZXZpY2UgaXMgcGFzc2VkIGluIEB1YmlfbnVtLiBVQkkgbWF5IGF1dG9tYXRpY2FsbHkgYXNzaWduIHRoZSBudW1iZXIgaWYKKyAqIEBVQklfREVWX05VTV9BVVRPIGlzIHBhc3NlZC4gSW4gdGhpcyBjYXNlLCB0aGUgZGV2aWNlIG51bWJlciBpcyByZXR1cm5lZCBpbgorICogQHViaV9udW0uCisgKgorICogTW9zdCBhcHBsaWNhdGlvbnMgc2hvdWxkIHBhc3MgJTAgaW4gQHZpZF9oZHJfb2Zmc2V0IHRvIG1ha2UgVUJJIHVzZSBkZWZhdWx0CisgKiBvZmZzZXQgb2YgdGhlIFZJRCBoZWFkZXIgd2l0aGluIHBoeXNpY2FsIGVyYXNlYmxvY2tzLiBUaGUgZGVmYXVsdCBvZmZzZXQgaXMKKyAqIHRoZSBuZXh0IG1pbi4gSS9PIHVuaXQgYWZ0ZXIgdGhlIEVDIGhlYWRlci4gRm9yIGV4YW1wbGUsIGl0IHdpbGwgYmUgb2Zmc2V0CisgKiA1MTIgaW4gY2FzZSBvZiBhIDUxMiBieXRlcyBwYWdlIE5BTkQgZmxhc2ggd2l0aCBubyBzdWItcGFnZSBzdXBwb3J0LiBPcgorICogaXQgd2lsbCBiZSA1MTIgaW4gY2FzZSBvZiBhIDJLaUIgcGFnZSBOQU5EIGZsYXNoIHdpdGggNCA1MTItYnl0ZSBzdWItcGFnZXMuCisgKgorICogQnV0IGluIHJhcmUgY2FzZXMsIGlmIHRoaXMgb3B0aW1pemVzIHRoaW5ncywgdGhlIFZJRCBoZWFkZXIgbWF5IGJlIHBsYWNlZCB0bworICogYSBkaWZmZXJlbnQgb2Zmc2V0LiBGb3IgZXhhbXBsZSwgdGhlIGJvb3QtbG9hZGVyIG1pZ2h0IGRvIHRoaW5ncyBmYXN0ZXIgaWYKKyAqIHRoZSBWSUQgaGVhZGVyIHNpdHMgYXQgdGhlIGVuZCBvZiB0aGUgZmlyc3QgMktpQiBOQU5EIHBhZ2Ugd2l0aCA0IHN1Yi1wYWdlcy4KKyAqIEFzIHRoZSBib290LWxvYWRlciB3b3VsZCBub3Qgbm9ybWFsbHkgbmVlZCB0byByZWFkIEVDIGhlYWRlcnMgKHVubGVzcyBpdAorICogbmVlZHMgVUJJIGluIFJXIG1vZGUpLCBpdCBtaWdodCBiZSBmYXN0ZXIgdG8gY2FsY3VsYXRlIEVDQy4gVGhpcyBpcyB3ZWlyZAorICogZXhhbXBsZSwgYnV0IGl0IHJlYWwtbGlmZSBleGFtcGxlLiBTbywgaW4gdGhpcyBleGFtcGxlLCBAdmlkX2hkcl9vZmZlciB3b3VsZAorICogYmUgMktpQi02NCBieXRlcyA9IDE5ODQuIE5vdGUsIHRoYXQgdGhpcyBwb3NpdGlvbiBpcyBub3QgZXZlbiA1MTItYnl0ZXMKKyAqIGFsaWduZWQsIHdoaWNoIGlzIE9LLCBhcyBVQkkgaXMgY2xldmVyIGVub3VnaCB0byByZWFsaXplIHRoaXMgaXMgNHRoCisgKiBzdWItcGFnZSBvZiB0aGUgZmlyc3QgcGFnZSBhbmQgYWRkIG5lZWRlZCBwYWRkaW5nLgorICovCitzdHJ1Y3QgdWJpX2F0dGFjaF9yZXEgeworCV9fczMyIHViaV9udW07CisJX19zMzIgbXRkX251bTsKKwlfX3MzMiB2aWRfaGRyX29mZnNldDsKKwlfX3M4IHBhZGRpbmdbMTJdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdWJpX21rdm9sX3JlcSAtIHZvbHVtZSBkZXNjcmlwdGlvbiBkYXRhIHN0cnVjdHVyZSB1c2VkIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSBjcmVhdGlvbiByZXF1ZXN0cy4KKyAqIEB2b2xfaWQ6IHZvbHVtZSBudW1iZXIKKyAqIEBhbGlnbm1lbnQ6IHZvbHVtZSBhbGlnbm1lbnQKKyAqIEBieXRlczogdm9sdW1lIHNpemUgaW4gYnl0ZXMKKyAqIEB2b2xfdHlwZTogdm9sdW1lIHR5cGUgKCVVQklfRFlOQU1JQ19WT0xVTUUgb3IgJVVCSV9TVEFUSUNfVk9MVU1FKQorICogQHBhZGRpbmcxOiByZXNlcnZlZCBmb3IgZnV0dXJlLCBub3QgdXNlZCwgaGFzIHRvIGJlIHplcm9lZAorICogQG5hbWVfbGVuOiB2b2x1bWUgbmFtZSBsZW5ndGgKKyAqIEBwYWRkaW5nMjogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSwgbm90IHVzZWQsIGhhcyB0byBiZSB6ZXJvZWQKKyAqIEBuYW1lOiB2b2x1bWUgbmFtZQorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYnkgdXNlci1zcGFjZSBwcm9ncmFtcyB3aGVuIGNyZWF0aW5nIG5ldyB2b2x1bWVzLiBUaGUKKyAqIEB1c2VkX2J5dGVzIGZpZWxkIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gY3JlYXRpbmcgc3RhdGljIHZvbHVtZXMuCisgKgorICogVGhlIEBhbGlnbm1lbnQgZmllbGQgc3BlY2lmaWVzIHRoZSByZXF1aXJlZCBhbGlnbm1lbnQgb2YgdGhlIHZvbHVtZSBsb2dpY2FsCisgKiBlcmFzZWJsb2NrLiBUaGlzIG1lYW5zLCB0aGF0IHRoZSBzaXplIG9mIGxvZ2ljYWwgZXJhc2VibG9ja3Mgd2lsbCBiZSBhbGlnbmVkCisgKiB0byB0aGlzIG51bWJlciwgaS5lLiwKKyAqCShVQkkgZGV2aWNlIGxvZ2ljYWwgZXJhc2VibG9jayBzaXplKSBtb2QgKEBhbGlnbm1lbnQpID0gMC4KKyAqCisgKiBUbyBwdXQgaXQgZGlmZmVyZW50bHksIHRoZSBsb2dpY2FsIGVyYXNlYmxvY2sgb2YgdGhpcyB2b2x1bWUgbWF5IGJlIHNsaWdodGx5CisgKiBzaG9ydGVuZWQgaW4gb3JkZXIgdG8gbWFrZSBpdCBwcm9wZXJseSBhbGlnbmVkLiBUaGUgYWxpZ25tZW50IGhhcyB0byBiZQorICogbXVsdGlwbGUgb2YgdGhlIGZsYXNoIG1pbmltYWwgaW5wdXQvb3V0cHV0IHVuaXQsIG9yICUxIHRvIHV0aWxpemUgdGhlIGVudGlyZQorICogYXZhaWxhYmxlIHNwYWNlIG9mIGxvZ2ljYWwgZXJhc2VibG9ja3MuCisgKgorICogVGhlIEBhbGlnbm1lbnQgZmllbGQgbWF5IGJlIHVzZWZ1bCwgZm9yIGV4YW1wbGUsIHdoZW4gb25lIHdhbnRzIHRvIG1haW50YWluCisgKiBhIGJsb2NrIGRldmljZSBvbiB0b3Agb2YgYW4gVUJJIHZvbHVtZS4gSW4gdGhpcyBjYXNlLCBpdCBpcyBkZXNpcmFibGUgdG8gZml0CisgKiBhbiBpbnRlZ2VyIG51bWJlciBvZiBibG9ja3MgaW4gbG9naWNhbCBlcmFzZWJsb2NrcyBvZiB0aGlzIFVCSSB2b2x1bWUuIFdpdGgKKyAqIGFsaWdubWVudCBpdCBpcyBwb3NzaWJsZSB0byB1cGRhdGUgdGhpcyB2b2x1bWUgdXNpbmcgcGxhbmUgVUJJIHZvbHVtZSBpbWFnZQorICogQkxPQnMsIHdpdGhvdXQgY2FyaW5nIGFib3V0IGhvdyB0byBwcm9wZXJseSBhbGlnbiB0aGVtLgorICovCitzdHJ1Y3QgdWJpX21rdm9sX3JlcSB7CisJX19zMzIgdm9sX2lkOworCV9fczMyIGFsaWdubWVudDsKKwlfX3M2NCBieXRlczsKKwlfX3M4IHZvbF90eXBlOworCV9fczggcGFkZGluZzE7CisJX19zMTYgbmFtZV9sZW47CisJX19zOCBwYWRkaW5nMls0XTsKKwljaGFyIG5hbWVbVUJJX01BWF9WT0xVTUVfTkFNRSArIDFdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoqCisgKiBzdHJ1Y3QgdWJpX3Jzdm9sX3JlcSAtIGEgZGF0YSBzdHJ1Y3R1cmUgdXNlZCBpbiB2b2x1bWUgcmUtc2l6ZSByZXF1ZXN0cy4KKyAqIEB2b2xfaWQ6IElEIG9mIHRoZSB2b2x1bWUgdG8gcmUtc2l6ZQorICogQGJ5dGVzOiBuZXcgc2l6ZSBvZiB0aGUgdm9sdW1lIGluIGJ5dGVzCisgKgorICogUmUtc2l6aW5nIGlzIHBvc3NpYmxlIGZvciBib3RoIGR5bmFtaWMgYW5kIHN0YXRpYyB2b2x1bWVzLiBCdXQgd2hpbGUgZHluYW1pYworICogdm9sdW1lcyBtYXkgYmUgcmUtc2l6ZWQgYXJiaXRyYXJpbHksIHN0YXRpYyB2b2x1bWVzIGNhbm5vdCBiZSBtYWRlIHRvIGJlCisgKiBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBieXRlcyB0aGV5IGJlYXIuIFRvIGFyYml0cmFyaWx5IHNocmluayBhIHN0YXRpYworICogdm9sdW1lLCBpdCBtdXN0IGJlIHdpcGVkIG91dCBmaXJzdCAoYnkgbWVhbnMgb2Ygdm9sdW1lIHVwZGF0ZSBvcGVyYXRpb24gd2l0aAorICogemVybyBudW1iZXIgb2YgYnl0ZXMpLgorICovCitzdHJ1Y3QgdWJpX3Jzdm9sX3JlcSB7CisJX19zNjQgYnl0ZXM7CisJX19zMzIgdm9sX2lkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoqCisgKiBzdHJ1Y3QgdWJpX3Judm9sX3JlcSAtIHZvbHVtZXMgcmUtbmFtZSByZXF1ZXN0LgorICogQGNvdW50OiBjb3VudCBvZiB2b2x1bWVzIHRvIHJlLW5hbWUKKyAqIEBwYWRkaW5nMTogIHJlc2VydmVkIGZvciBmdXR1cmUsIG5vdCB1c2VkLCBoYXMgdG8gYmUgemVyb2VkCisgKiBAdm9sX2lkOiBJRCBvZiB0aGUgdm9sdW1lIHRvIHJlLW5hbWUKKyAqIEBuYW1lX2xlbjogbmFtZSBsZW5ndGgKKyAqIEBwYWRkaW5nMjogIHJlc2VydmVkIGZvciBmdXR1cmUsIG5vdCB1c2VkLCBoYXMgdG8gYmUgemVyb2VkCisgKiBAbmFtZTogbmV3IHZvbHVtZSBuYW1lCisgKgorICogVUJJIGFsbG93cyB0byByZS1uYW1lIHVwIHRvICUzMiB2b2x1bWVzIGF0IG9uZSBnby4gVGhlIGNvdW50IG9mIHZvbHVtZXMgdG8KKyAqIHJlLW5hbWUgaXMgc3BlY2lmaWVkIGluIHRoZSBAY291bnQgZmllbGQuIFRoZSBJRCBvZiB0aGUgdm9sdW1lcyB0byByZS1uYW1lCisgKiBhbmQgdGhlIG5ldyBuYW1lcyBhcmUgc3BlY2lmaWVkIGluIHRoZSBAdm9sX2lkIGFuZCBAbmFtZSBmaWVsZHMuCisgKgorICogVGhlIFVCSSB2b2x1bWUgcmUtbmFtZSBvcGVyYXRpb24gaXMgYXRvbWljLCB3aGljaCBtZWFucyB0aGF0IHNob3VsZCBwb3dlciBjdXQKKyAqIGhhcHBlbiwgdGhlIHZvbHVtZXMgd2lsbCBoYXZlIGVpdGhlciBvbGQgbmFtZSBvciBuZXcgbmFtZS4gU28gdGhlIHBvc3NpYmxlCisgKiB1c2UtY2FzZXMgb2YgdGhpcyBjb21tYW5kIGlzIGF0b21pYyB1cGdyYWRlLiBJbmRlZWQsIHRvIHVwZ3JhZGUsIHNheSwgdm9sdW1lcworICogQSBhbmQgQiBvbmUgbWF5IGNyZWF0ZSB0ZW1wb3Jhcnkgdm9sdW1lcyAlQTEgYW5kICVCMSB3aXRoIHRoZSBuZXcgY29udGVudHMsCisgKiB0aGVuIGF0b21pY2FsbHkgcmUtbmFtZSBBMS0+QSBhbmQgQjEtPkIsIGluIHdoaWNoIGNhc2Ugb2xkICVBIGFuZCAlQiB3aWxsCisgKiBiZSByZW1vdmVkLgorICoKKyAqIElmIGl0IGlzIG5vdCBkZXNpcmFibGUgdG8gcmVtb3ZlIG9sZCBBIGFuZCBCLCB0aGUgcmUtbmFtZSByZXF1ZXN0IGhhcyB0bworICogY29udGFpbiA0IGVudHJpZXM6IEExLT5BLCBBLT5BMSwgQjEtPkIsIEItPkIxLCBpbiB3aGljaCBjYXNlIG9sZCBBMSBhbmQgQjEKKyAqIGJlY29tZSBBIGFuZCBCLCBhbmQgb2xkIEEgYW5kIEIgd2lsbCBiZWNvbWUgQTEgYW5kIEIxLgorICoKKyAqIEl0IGlzIGFsc28gT0sgdG8gcmVxdWVzdDogQTEtPkEsIEExLT5YLCBCMS0+QiwgQi0+WSwgaW4gd2hpY2ggY2FzZSBvbGQgQTEKKyAqIGFuZCBCMSBiZWNvbWUgQSBhbmQgQiwgYW5kIG9sZCBBIGFuZCBCIGJlY29tZSBYIGFuZCBZLgorICoKKyAqIEluIG90aGVyIHdvcmRzLCBpbiBjYXNlIG9mIHJlLW5hbWluZyBpbnRvIGFuIGV4aXN0aW5nIHZvbHVtZSBuYW1lLCB0aGUKKyAqIGV4aXN0aW5nIHZvbHVtZSBpcyByZW1vdmVkLCB1bmxlc3MgaXQgaXMgcmUtbmFtZWQgYXMgd2VsbCBhdCB0aGUgc2FtZQorICogcmUtbmFtZSByZXF1ZXN0LgorICovCitzdHJ1Y3QgdWJpX3Judm9sX3JlcSB7CisJX19zMzIgY291bnQ7CisJX19zOCBwYWRkaW5nMVsxMl07CisJc3RydWN0IHsKKwkJX19zMzIgdm9sX2lkOworCQlfX3MxNiBuYW1lX2xlbjsKKwkJX19zOCAgcGFkZGluZzJbMl07CisJCWNoYXIgICAgbmFtZVtVQklfTUFYX1ZPTFVNRV9OQU1FICsgMV07CisJfSBlbnRzW1VCSV9NQVhfUk5WT0xdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoqCisgKiBzdHJ1Y3QgdWJpX2xlYl9jaGFuZ2VfcmVxIC0gYSBkYXRhIHN0cnVjdHVyZSB1c2VkIGluIGF0b21pYyBMRUIgY2hhbmdlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMuCisgKiBAbG51bTogbG9naWNhbCBlcmFzZWJsb2NrIG51bWJlciB0byBjaGFuZ2UKKyAqIEBieXRlczogaG93IG1hbnkgYnl0ZXMgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBsb2dpY2FsIGVyYXNlYmxvY2sKKyAqIEBkdHlwZTogZGF0YSB0eXBlICglVUJJX0xPTkdURVJNLCAlVUJJX1NIT1JUVEVSTSwgJVVCSV9VTktOT1dOKQorICogQHBhZGRpbmc6IHJlc2VydmVkIGZvciBmdXR1cmUsIG5vdCB1c2VkLCBoYXMgdG8gYmUgemVyb2VkCisgKi8KK3N0cnVjdCB1YmlfbGViX2NoYW5nZV9yZXEgeworCV9fczMyIGxudW07CisJX19zMzIgYnl0ZXM7CisJX19zOCAgZHR5cGU7CisJX19zOCAgcGFkZGluZ1s3XTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qKgorICogc3RydWN0IHViaV9tYXBfcmVxIC0gYSBkYXRhIHN0cnVjdHVyZSB1c2VkIGluIG1hcCBMRUIgcmVxdWVzdHMuCisgKiBAbG51bTogbG9naWNhbCBlcmFzZWJsb2NrIG51bWJlciB0byB1bm1hcAorICogQGR0eXBlOiBkYXRhIHR5cGUgKCVVQklfTE9OR1RFUk0sICVVQklfU0hPUlRURVJNLCAlVUJJX1VOS05PV04pCisgKiBAcGFkZGluZzogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSwgbm90IHVzZWQsIGhhcyB0byBiZSB6ZXJvZWQKKyAqLworc3RydWN0IHViaV9tYXBfcmVxIHsKKwlfX3MzMiBsbnVtOworCV9fczggIGR0eXBlOworCV9fczggIHBhZGRpbmdbM107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qKgorICogc3RydWN0IHViaV9zZXRfdm9sX3Byb3BfcmVxIC0gYSBkYXRhIHN0cnVjdHVyZSB1c2VkIHRvIHNldCBhbiBVQkkgdm9sdW1lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS4KKyAqIEBwcm9wZXJ0eTogcHJvcGVydHkgdG8gc2V0ICglVUJJX1ZPTF9QUk9QX0RJUkVDVF9XUklURSkKKyAqIEBwYWRkaW5nOiByZXNlcnZlZCBmb3IgZnV0dXJlLCBub3QgdXNlZCwgaGFzIHRvIGJlIHplcm9lZAorICogQHZhbHVlOiB2YWx1ZSB0byBzZXQKKyAqLworc3RydWN0IHViaV9zZXRfdm9sX3Byb3BfcmVxIHsKKwlfX3U4ICBwcm9wZXJ0eTsKKwlfX3U4ICBwYWRkaW5nWzddOworCV9fdTY0IHZhbHVlOworfSAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNlbmRpZiAvKiBfX1VCSV9VU0VSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uY190cGFybS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uY190cGFybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZGJjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25jX3RwYXJtLmgKQEAgLTAsMCArMSw3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgICoKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgICAgICAgICAgICAqCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nICAgICAgKgorICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAgICAgICoKKyAqIGRpc3RyaWJ1dGUsIGRpc3RyaWJ1dGUgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgICAgICAqCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgICAgKgorICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAgKgorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgKgorICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiAgICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgKgorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SICAgICoKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAqCisgKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAqCisgKiBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSAgICAgKgorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuICAgICAgICoKKyAqIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBBdXRob3I6IFRob21hcyBFLiBEaWNrZXkgICAgICAgICAgICAgICAgICAgICAgICAyMDA2ICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogJElkOiBuY190cGFybS5oLHYgMS41IDIwMTAvMTIvMjUgMjA6Mjc6MjIgdG9tIEV4cCAkICovCisKKyNpZm5kZWYgTkNfVFBBUk1faW5jbHVkZWQKKyNkZWZpbmUgTkNfVFBBUk1faW5jbHVkZWQgMQorCisvKgorICogQ2FzdCBwYXJhbWV0ZXJzIHBhc3QgdGhlIGZvcm1hdHRpbmctc3RyaW5nIGZvciB0cGFybSgpIHRvIG1hdGNoIHRoZQorICogYXNzdW1wdGlvbiBvZiB0aGUgdmFyYXJncyBjb2RlLgorICovCisjaWZuZGVmIFRQQVJNX0FSRworI2RlZmluZSBUUEFSTV9BUkcgbG9uZworI2VuZGlmCisKKyNkZWZpbmUgVFBBUk1fTihuKSAoVFBBUk1fQVJHKShuKQorCisjZGVmaW5lIFRQQVJNXzkoYSxiLGMsZCxlLGYsZyxoLGksaikgdHBhcm0oYSxUUEFSTV9OKGIpLFRQQVJNX04oYyksVFBBUk1fTihkKSxUUEFSTV9OKGUpLFRQQVJNX04oZiksVFBBUk1fTihnKSxUUEFSTV9OKGgpLFRQQVJNX04oaSksVFBBUk1fTihqKSkKKworI2lmIE5DVVJTRVNfVFBBUk1fVkFSQVJHUworI2RlZmluZSBUUEFSTV84KGEsYixjLGQsZSxmLGcsaCxpKSB0cGFybShhLFRQQVJNX04oYiksVFBBUk1fTihjKSxUUEFSTV9OKGQpLFRQQVJNX04oZSksVFBBUk1fTihmKSxUUEFSTV9OKGcpLFRQQVJNX04oaCksVFBBUk1fTihpKSkKKyNkZWZpbmUgVFBBUk1fNyhhLGIsYyxkLGUsZixnLGgpIHRwYXJtKGEsVFBBUk1fTihiKSxUUEFSTV9OKGMpLFRQQVJNX04oZCksVFBBUk1fTihlKSxUUEFSTV9OKGYpLFRQQVJNX04oZyksVFBBUk1fTihoKSkKKyNkZWZpbmUgVFBBUk1fNihhLGIsYyxkLGUsZixnKSB0cGFybShhLFRQQVJNX04oYiksVFBBUk1fTihjKSxUUEFSTV9OKGQpLFRQQVJNX04oZSksVFBBUk1fTihmKSxUUEFSTV9OKGcpKQorI2RlZmluZSBUUEFSTV81KGEsYixjLGQsZSxmKSB0cGFybShhLFRQQVJNX04oYiksVFBBUk1fTihjKSxUUEFSTV9OKGQpLFRQQVJNX04oZSksVFBBUk1fTihmKSkKKyNkZWZpbmUgVFBBUk1fNChhLGIsYyxkLGUpIHRwYXJtKGEsVFBBUk1fTihiKSxUUEFSTV9OKGMpLFRQQVJNX04oZCksVFBBUk1fTihlKSkKKyNkZWZpbmUgVFBBUk1fMyhhLGIsYyxkKSB0cGFybShhLFRQQVJNX04oYiksVFBBUk1fTihjKSxUUEFSTV9OKGQpKQorI2RlZmluZSBUUEFSTV8yKGEsYixjKSB0cGFybShhLFRQQVJNX04oYiksVFBBUk1fTihjKSkKKyNkZWZpbmUgVFBBUk1fMShhLGIpIHRwYXJtKGEsVFBBUk1fTihiKSkKKyNkZWZpbmUgVFBBUk1fMChhKSB0cGFybShhKQorI2Vsc2UKKyNkZWZpbmUgVFBBUk1fOChhLGIsYyxkLGUsZixnLGgsaSkgVFBBUk1fOShhLGIsYyxkLGUsZixnLGgsaSwwKQorI2RlZmluZSBUUEFSTV83KGEsYixjLGQsZSxmLGcsaCkgVFBBUk1fOChhLGIsYyxkLGUsZixnLGgsMCkKKyNkZWZpbmUgVFBBUk1fNihhLGIsYyxkLGUsZixnKSBUUEFSTV83KGEsYixjLGQsZSxmLGcsMCkKKyNkZWZpbmUgVFBBUk1fNShhLGIsYyxkLGUsZikgVFBBUk1fNihhLGIsYyxkLGUsZiwwKQorI2RlZmluZSBUUEFSTV80KGEsYixjLGQsZSkgVFBBUk1fNShhLGIsYyxkLGUsMCkKKyNkZWZpbmUgVFBBUk1fMyhhLGIsYyxkKSBUUEFSTV80KGEsYixjLGQsMCkKKyNkZWZpbmUgVFBBUk1fMihhLGIsYykgVFBBUk1fMyhhLGIsYywwKQorI2RlZmluZSBUUEFSTV8xKGEsYikgVFBBUk1fMihhLGIsMCkKKyNkZWZpbmUgVFBBUk1fMShhLGIpIFRQQVJNXzIoYSxiLDApCisjZGVmaW5lIFRQQVJNXzAoYSkgVFBBUk1fMShhLDApCisjZW5kaWYKKworI2VuZGlmIC8qIE5DX1RQQVJNX2luY2x1ZGVkICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL25jdXJzZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmN1cnNlcy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjE0OWRlNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25jdXJzZXMuaApAQCAtMCwwICsxIEBACitjdXJzZXMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmN1cnNlc19kbGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmN1cnNlc19kbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzg1ZDJiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uY3Vyc2VzX2RsbC5oCkBAIC0wLDAgKzEsODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNywyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAkSWQ6IG5jdXJzZXNfZGxsLmguaW4sdiAxLjggMjAwOS8wNC8wNCAyMjoyNjoyNyB0b20gRXhwICQgKi8KKworI2lmbmRlZiBOQ1VSU0VTX0RMTF9IX2luY2wKKyNkZWZpbmUgTkNVUlNFU19ETExfSF9pbmNsIDEKKworLyoKKyAqIEZvciByZWVudHJhbnQgY29kZSwgd2UgbWFwIHRoZSB2YXJpb3VzIGdsb2JhbCB2YXJpYWJsZXMgaW50byBTQ1JFRU4gYnkKKyAqIHVzaW5nIGZ1bmN0aW9ucyB0byBhY2Nlc3MgdGhlbS4KKyAqLworI2RlZmluZSBOQ1VSU0VTX1BVQkxJQ19WQVIobmFtZSkgX25jXyMjbmFtZQorI2RlZmluZSBOQ1VSU0VTX1dSQVBQRURfVkFSKHR5cGUsbmFtZSkgZXh0ZXJuIHR5cGUgTkNVUlNFU19QVUJMSUNfVkFSKG5hbWUpKHZvaWQpCisKKy8qIG5vIGxvbmdlciBuZWVkZWQgb24gY3lnd2luIG9yIG1pbmd3LCB0aGFua3MgdG8gYXV0by1pbXBvcnQgICAgICAgKi8KKy8qIGJ1dCB0aGlzIHN0cnVjdHVyZSBtYXkgYmUgdXNlZnVsIGF0IHNvbWUgcG9pbnQgZm9yIGFuIE1TVkMgYnVpbGQgKi8KKy8qIHNvLCBmb3Igbm93IHVuY29uZGl0aW9uYWxseSBkZWZpbmUgdGhlIGltcG9ydGFudCBmbGFncyAgICAgICAgICAgKi8KKy8qICJ0aGUgcmlnaHQgd2F5IiBmb3IgcHJvcGVyIHN0YXRpYyBhbmQgZGxsK2F1dG8taW1wb3J0IGJlaGF2aW9yICAgKi8KKyN1bmRlZiBOQ1VSU0VTX0RMTAorI2RlZmluZSBOQ1VSU0VTX1NUQVRJQworCisjaWYgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorIyAgaWYgZGVmaW5lZChOQ1VSU0VTX0RMTCkKKyMgICAgaWYgZGVmaW5lZChOQ1VSU0VTX1NUQVRJQykKKyMgICAgICB1bmRlZiBOQ1VSU0VTX1NUQVRJQworIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIHVuZGVmIE5DVVJTRVNfSU1QRVhQCisjICB1bmRlZiBOQ1VSU0VTX0FQSQorIyAgdW5kZWYgTkNVUlNFU19FWFBPUlQKKyMgIHVuZGVmIE5DVVJTRVNfRVhQT1JUX1ZBUgorIyAgaWYgZGVmaW5lZChOQ1VSU0VTX0RMTCkKKy8qIGJ1aWxkaW5nIGEgRExMICovCisjICAgIGRlZmluZSBOQ1VSU0VTX0lNUEVYUCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgIGVsaWYgZGVmaW5lZChOQ1VSU0VTX1NUQVRJQykKKy8qIGJ1aWxkaW5nIG9yIGxpbmtpbmcgdG8gYSBzdGF0aWMgbGlicmFyeSAqLworIyAgICBkZWZpbmUgTkNVUlNFU19JTVBFWFAgLyogbm90aGluZyAqLworIyAgZWxzZQorLyogbGlua2luZyB0byB0aGUgRExMICovCisjICAgIGRlZmluZSBOQ1VSU0VTX0lNUEVYUCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgIGVuZGlmCisjICBkZWZpbmUgTkNVUlNFU19BUEkgX19jZGVjbAorIyAgZGVmaW5lIE5DVVJTRVNfRVhQT1JUKHR5cGUpIE5DVVJTRVNfSU1QRVhQIHR5cGUgTkNVUlNFU19BUEkKKyMgIGRlZmluZSBOQ1VSU0VTX0VYUE9SVF9WQVIodHlwZSkgTkNVUlNFU19JTVBFWFAgdHlwZQorI2VuZGlmCisKKy8qIFRha2UgY2FyZSBvZiBub24tY3lnd2luIHBsYXRmb3JtcyAqLworI2lmICFkZWZpbmVkKE5DVVJTRVNfSU1QRVhQKQorIyAgZGVmaW5lIE5DVVJTRVNfSU1QRVhQIC8qIG5vdGhpbmcgKi8KKyNlbmRpZgorI2lmICFkZWZpbmVkKE5DVVJTRVNfQVBJKQorIyAgZGVmaW5lIE5DVVJTRVNfQVBJIC8qIG5vdGhpbmcgKi8KKyNlbmRpZgorI2lmICFkZWZpbmVkKE5DVVJTRVNfRVhQT1JUKQorIyAgZGVmaW5lIE5DVVJTRVNfRVhQT1JUKHR5cGUpIE5DVVJTRVNfSU1QRVhQIHR5cGUgTkNVUlNFU19BUEkKKyNlbmRpZgorI2lmICFkZWZpbmVkKE5DVVJTRVNfRVhQT1JUX1ZBUikKKyMgIGRlZmluZSBOQ1VSU0VTX0VYUE9SVF9WQVIodHlwZSkgTkNVUlNFU19JTVBFWFAgdHlwZQorI2VuZGlmCisKKyNlbmRpZiAvKiBOQ1VSU0VTX0RMTF9IX2luY2wgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2V0aGVybmV0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9ldGhlcm5ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNDJkNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9ldGhlcm5ldC5oCkBAIC0wLDAgKzEsODQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSwgMjAwMSwgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogQmFzZWQgb24gdGhlIEZyZWVCU0QgdmVyc2lvbiBvZiB0aGlzIGZpbGUuIEN1cmlvdXNseSwgdGhhdCBmaWxlCisgICBsYWNrcyBhIGNvcHlyaWdodCBpbiB0aGUgaGVhZGVyLiAqLworCisjaWZuZGVmIF9fTkVUX0VUSEVSTkVUX0gKKyNkZWZpbmUgX19ORVRfRVRIRVJORVRfSCAxCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPiAgICAgLyogSUVFRSA4MDIuMyBFdGhlcm5ldCBjb25zdGFudHMgKi8KKworX19CRUdJTl9ERUNMUworCisvKiBUaGlzIGlzIGEgbmFtZSBmb3IgdGhlIDQ4IGJpdCBldGhlcm5ldCBhZGRyZXNzIGF2YWlsYWJsZSBvbiBtYW55CisgICBzeXN0ZW1zLiAgKi8KK3N0cnVjdCBldGhlcl9hZGRyCit7CisgIHVfaW50OF90IGV0aGVyX2FkZHJfb2N0ZXRbRVRIX0FMRU5dOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisvKiAxME1iL3MgZXRoZXJuZXQgaGVhZGVyICovCitzdHJ1Y3QgZXRoZXJfaGVhZGVyCit7CisgIHVfaW50OF90ICBldGhlcl9kaG9zdFtFVEhfQUxFTl07CS8qIGRlc3RpbmF0aW9uIGV0aCBhZGRyCSovCisgIHVfaW50OF90ICBldGhlcl9zaG9zdFtFVEhfQUxFTl07CS8qIHNvdXJjZSBldGhlciBhZGRyCSovCisgIHVfaW50MTZfdCBldGhlcl90eXBlOwkJICAgICAgICAvKiBwYWNrZXQgdHlwZSBJRCBmaWVsZAkqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisvKiBFdGhlcm5ldCBwcm90b2NvbCBJRCdzICovCisjZGVmaW5lCUVUSEVSVFlQRV9QVVAJCTB4MDIwMCAgICAgICAgICAvKiBYZXJveCBQVVAgKi8KKyNkZWZpbmUgRVRIRVJUWVBFX1NQUklURQkweDA1MDAJCS8qIFNwcml0ZSAqLworI2RlZmluZQlFVEhFUlRZUEVfSVAJCTB4MDgwMAkJLyogSVAgKi8KKyNkZWZpbmUJRVRIRVJUWVBFX0FSUAkJMHgwODA2CQkvKiBBZGRyZXNzIHJlc29sdXRpb24gKi8KKyNkZWZpbmUJRVRIRVJUWVBFX1JFVkFSUAkweDgwMzUJCS8qIFJldmVyc2UgQVJQICovCisjZGVmaW5lIEVUSEVSVFlQRV9BVAkJMHg4MDlCCQkvKiBBcHBsZVRhbGsgcHJvdG9jb2wgKi8KKyNkZWZpbmUgRVRIRVJUWVBFX0FBUlAJCTB4ODBGMwkJLyogQXBwbGVUYWxrIEFSUCAqLworI2RlZmluZQlFVEhFUlRZUEVfVkxBTgkJMHg4MTAwCQkvKiBJRUVFIDgwMi4xUSBWTEFOIHRhZ2dpbmcgKi8KKyNkZWZpbmUgRVRIRVJUWVBFX0lQWAkJMHg4MTM3CQkvKiBJUFggKi8KKyNkZWZpbmUJRVRIRVJUWVBFX0lQVjYJCTB4ODZkZAkJLyogSVAgcHJvdG9jb2wgdmVyc2lvbiA2ICovCisjZGVmaW5lIEVUSEVSVFlQRV9MT09QQkFDSwkweDkwMDAJCS8qIHVzZWQgdG8gdGVzdCBpbnRlcmZhY2VzICovCisKKworI2RlZmluZQlFVEhFUl9BRERSX0xFTglFVEhfQUxFTiAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBldGhlcm5ldCBhZGRyICovCisjZGVmaW5lCUVUSEVSX1RZUEVfTEVOCTIgICAgICAgICAgICAgICAgICAgICAgICAvKiBieXRlcyBpbiB0eXBlIGZpZWxkICovCisjZGVmaW5lCUVUSEVSX0NSQ19MRU4JNCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ5dGVzIGluIENSQyBmaWVsZCAqLworI2RlZmluZQlFVEhFUl9IRFJfTEVOCUVUSF9ITEVOICAgICAgICAgICAgICAgICAvKiB0b3RhbCBvY3RldHMgaW4gaGVhZGVyICovCisjZGVmaW5lCUVUSEVSX01JTl9MRU4JKEVUSF9aTEVOICsgRVRIRVJfQ1JDX0xFTikgLyogbWluIHBhY2tldCBsZW5ndGggKi8KKyNkZWZpbmUJRVRIRVJfTUFYX0xFTgkoRVRIX0ZSQU1FX0xFTiArIEVUSEVSX0NSQ19MRU4pIC8qIG1heCBwYWNrZXQgbGVuZ3RoICovCisKKy8qIG1ha2Ugc3VyZSBldGhlbmV0IGxlbmd0aCBpcyB2YWxpZCAqLworI2RlZmluZQlFVEhFUl9JU19WQUxJRF9MRU4oZm9vKQlcCisJKChmb28pID49IEVUSEVSX01JTl9MRU4gJiYgKGZvbykgPD0gRVRIRVJfTUFYX0xFTikKKworLyoKKyAqIFRoZSBFVEhFUlRZUEVfTlRSQUlMRVIgcGFja2V0IHR5cGVzIHN0YXJ0aW5nIGF0IEVUSEVSVFlQRV9UUkFJTCBoYXZlCisgKiAodHlwZS1FVEhFUlRZUEVfVFJBSUwpKjUxMiBieXRlcyBvZiBkYXRhIGZvbGxvd2VkCisgKiBieSBhbiBFVEhFUiB0eXBlIChhcyBnaXZlbiBhYm92ZSkgYW5kIHRoZW4gdGhlICh2YXJpYWJsZS1sZW5ndGgpIGhlYWRlci4KKyAqLworI2RlZmluZQlFVEhFUlRZUEVfVFJBSUwJCTB4MTAwMAkJLyogVHJhaWxlciBwYWNrZXQgKi8KKyNkZWZpbmUJRVRIRVJUWVBFX05UUkFJTEVSCTE2CisKKyNkZWZpbmUJRVRIRVJNVFUJRVRIX0RBVEFfTEVOCisjZGVmaW5lCUVUSEVSTUlOCShFVEhFUl9NSU5fTEVOIC0gRVRIRVJfSERSX0xFTiAtIEVUSEVSX0NSQ19MRU4pCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBuZXQvZXRoZXJuZXQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvaWYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJiM2U5ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmLmgKQEAgLTAsMCArMSwyMDUgQEAKKy8qIG5ldC9pZi5oIC0tIGRlY2xhcmF0aW9ucyBmb3IgaW5xdWlyaW5nIGFib3V0IG5ldHdvcmsgaW50ZXJmYWNlcworICAgQ29weXJpZ2h0IChDKSAxOTk3LDk4LDk5LDIwMDAsMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkVUX0lGX0gKKyNkZWZpbmUgX05FVF9JRl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpZmRlZiBfX1VTRV9NSVNDCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKworCisvKiBMZW5ndGggb2YgaW50ZXJmYWNlIG5hbWUuICAqLworI2RlZmluZSBJRl9OQU1FU0laRQkxNgorCitzdHJ1Y3QgaWZfbmFtZWluZGV4CisgIHsKKyAgICB1bnNpZ25lZCBpbnQgaWZfaW5kZXg7CS8qIDEsIDIsIC4uLiAqLworICAgIGNoYXIgKmlmX25hbWU7CQkvKiBudWxsIHRlcm1pbmF0ZWQgbmFtZTogImV0aDAiLCAuLi4gKi8KKyAgfTsKKworCisjaWZkZWYgX19VU0VfTUlTQworLyogU3RhbmRhcmQgaW50ZXJmYWNlIGZsYWdzLiAqLworZW51bQorICB7CisgICAgSUZGX1VQID0gMHgxLAkJLyogSW50ZXJmYWNlIGlzIHVwLiAgKi8KKyMgZGVmaW5lIElGRl9VUAlJRkZfVVAKKyAgICBJRkZfQlJPQURDQVNUID0gMHgyLAkvKiBCcm9hZGNhc3QgYWRkcmVzcyB2YWxpZC4gICovCisjIGRlZmluZSBJRkZfQlJPQURDQVNUCUlGRl9CUk9BRENBU1QKKyAgICBJRkZfREVCVUcgPSAweDQsCQkvKiBUdXJuIG9uIGRlYnVnZ2luZy4gICovCisjIGRlZmluZSBJRkZfREVCVUcJSUZGX0RFQlVHCisgICAgSUZGX0xPT1BCQUNLID0gMHg4LAkJLyogSXMgYSBsb29wYmFjayBuZXQuICAqLworIyBkZWZpbmUgSUZGX0xPT1BCQUNLCUlGRl9MT09QQkFDSworICAgIElGRl9QT0lOVE9QT0lOVCA9IDB4MTAsCS8qIEludGVyZmFjZSBpcyBwb2ludC10by1wb2ludCBsaW5rLiAgKi8KKyMgZGVmaW5lIElGRl9QT0lOVE9QT0lOVCBJRkZfUE9JTlRPUE9JTlQKKyAgICBJRkZfTk9UUkFJTEVSUyA9IDB4MjAsCS8qIEF2b2lkIHVzZSBvZiB0cmFpbGVycy4gICovCisjIGRlZmluZSBJRkZfTk9UUkFJTEVSUwlJRkZfTk9UUkFJTEVSUworICAgIElGRl9SVU5OSU5HID0gMHg0MCwJCS8qIFJlc291cmNlcyBhbGxvY2F0ZWQuICAqLworIyBkZWZpbmUgSUZGX1JVTk5JTkcJSUZGX1JVTk5JTkcKKyAgICBJRkZfTk9BUlAgPSAweDgwLAkJLyogTm8gYWRkcmVzcyByZXNvbHV0aW9uIHByb3RvY29sLiAgKi8KKyMgZGVmaW5lIElGRl9OT0FSUAlJRkZfTk9BUlAKKyAgICBJRkZfUFJPTUlTQyA9IDB4MTAwLAkvKiBSZWNlaXZlIGFsbCBwYWNrZXRzLiAgKi8KKyMgZGVmaW5lIElGRl9QUk9NSVNDCUlGRl9QUk9NSVNDCisKKyAgICAvKiBOb3Qgc3VwcG9ydGVkICovCisgICAgSUZGX0FMTE1VTFRJID0gMHgyMDAsCS8qIFJlY2VpdmUgYWxsIG11bHRpY2FzdCBwYWNrZXRzLiAgKi8KKyMgZGVmaW5lIElGRl9BTExNVUxUSQlJRkZfQUxMTVVMVEkKKworICAgIElGRl9NQVNURVIgPSAweDQwMCwJCS8qIE1hc3RlciBvZiBhIGxvYWQgYmFsYW5jZXIuICAqLworIyBkZWZpbmUgSUZGX01BU1RFUglJRkZfTUFTVEVSCisgICAgSUZGX1NMQVZFID0gMHg4MDAsCQkvKiBTbGF2ZSBvZiBhIGxvYWQgYmFsYW5jZXIuICAqLworIyBkZWZpbmUgSUZGX1NMQVZFCUlGRl9TTEFWRQorCisgICAgSUZGX01VTFRJQ0FTVCA9IDB4MTAwMCwJLyogU3VwcG9ydHMgbXVsdGljYXN0LiAgKi8KKyMgZGVmaW5lIElGRl9NVUxUSUNBU1QJSUZGX01VTFRJQ0FTVAorCisgICAgSUZGX1BPUlRTRUwgPSAweDIwMDAsCS8qIENhbiBzZXQgbWVkaWEgdHlwZS4gICovCisjIGRlZmluZSBJRkZfUE9SVFNFTAlJRkZfUE9SVFNFTAorICAgIElGRl9BVVRPTUVESUEgPSAweDQwMDAsCS8qIEF1dG8gbWVkaWEgc2VsZWN0IGFjdGl2ZS4gICovCisjIGRlZmluZSBJRkZfQVVUT01FRElBCUlGRl9BVVRPTUVESUEKKyAgICBJRkZfRFlOQU1JQyA9IDB4ODAwMAkvKiBEaWFsdXAgZGV2aWNlIHdpdGggY2hhbmdpbmcgYWRkcmVzc2VzLiAgKi8KKyMgZGVmaW5lIElGRl9EWU5BTUlDCUlGRl9EWU5BTUlDCisgIH07CisKKy8qIFRoZSBpZmFkZHIgc3RydWN0dXJlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IG9uZSBhZGRyZXNzIG9mIGFuCisgICBpbnRlcmZhY2UuICBUaGV5IGFyZSBtYWludGFpbmVkIGJ5IHRoZSBkaWZmZXJlbnQgYWRkcmVzcyBmYW1pbGllcywKKyAgIGFyZSBhbGxvY2F0ZWQgYW5kIGF0dGFjaGVkIHdoZW4gYW4gYWRkcmVzcyBpcyBzZXQsIGFuZCBhcmUgbGlua2VkCisgICB0b2dldGhlciBzbyBhbGwgYWRkcmVzc2VzIGZvciBhbiBpbnRlcmZhY2UgY2FuIGJlIGxvY2F0ZWQuICAqLworCitzdHJ1Y3QgaWZhZGRyCisgIHsKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgaWZhX2FkZHI7CS8qIEFkZHJlc3Mgb2YgaW50ZXJmYWNlLiAgKi8KKyAgICB1bmlvbgorICAgICAgeworCXN0cnVjdCBzb2NrYWRkcglpZnVfYnJvYWRhZGRyOworCXN0cnVjdCBzb2NrYWRkcglpZnVfZHN0YWRkcjsKKyAgICAgIH0gaWZhX2lmdTsKKyAgICBzdHJ1Y3QgaWZhY2UgKmlmYV9pZnA7CS8qIEJhY2stcG9pbnRlciB0byBpbnRlcmZhY2UuICAqLworICAgIHN0cnVjdCBpZmFkZHIgKmlmYV9uZXh0OwkvKiBOZXh0IGFkZHJlc3MgZm9yIGludGVyZmFjZS4gICovCisgIH07CisKKyMgZGVmaW5lIGlmYV9icm9hZGFkZHIJaWZhX2lmdS5pZnVfYnJvYWRhZGRyCS8qIGJyb2FkY2FzdCBhZGRyZXNzCSovCisjIGRlZmluZSBpZmFfZHN0YWRkcglpZmFfaWZ1LmlmdV9kc3RhZGRyCS8qIG90aGVyIGVuZCBvZiBsaW5rCSovCisKKy8qIERldmljZSBtYXBwaW5nIHN0cnVjdHVyZS4gSSdkIGp1c3QgZ29uZSBvZmYgYW5kIGRlc2lnbmVkIGEKKyAgIGJlYXV0aWZ1bCBzY2hlbWUgdXNpbmcgb25seSBsb2FkYWJsZSBtb2R1bGVzIHdpdGggYXJndW1lbnRzIGZvcgorICAgZHJpdmVyIG9wdGlvbnMgYW5kIGFsb25nIGNvbWUgdGhlIFBDTUNJQSBwZW9wbGUgOCkKKworICAgQWggd2VsbC4gVGhlIGdldCgpIHNpZGUgb2YgdGhpcyBpcyBnb29kIGZvciBXRFNFVFVQLCBhbmQgaXQnbGwgYmUKKyAgIGhhbmR5IGZvciBkZWJ1Z2dpbmcgdGhpbmdzLiBUaGUgc2V0IHNpZGUgaXMgZmluZSBmb3Igbm93IGFuZCBiZWluZworICAgdmVyeSBzbWFsbCBtaWdodCBiZSB3b3J0aCBrZWVwaW5nIGZvciBjbGVhbiBjb25maWd1cmF0aW9uLiAgKi8KKworc3RydWN0IGlmbWFwCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCBtZW1fc3RhcnQ7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgbWVtX2VuZDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgYmFzZV9hZGRyOworICAgIHVuc2lnbmVkIGNoYXIgaXJxOworICAgIHVuc2lnbmVkIGNoYXIgZG1hOworICAgIHVuc2lnbmVkIGNoYXIgcG9ydDsKKyAgICAvKiAzIGJ5dGVzIHNwYXJlICovCisgIH07CisKKy8qIEludGVyZmFjZSByZXF1ZXN0IHN0cnVjdHVyZSB1c2VkIGZvciBzb2NrZXQgaW9jdGwncy4gIEFsbCBpbnRlcmZhY2UKKyAgIGlvY3RsJ3MgbXVzdCBoYXZlIHBhcmFtZXRlciBkZWZpbml0aW9ucyB3aGljaCBiZWdpbiB3aXRoIGlmcl9uYW1lLgorICAgVGhlIHJlbWFpbmRlciBtYXkgYmUgaW50ZXJmYWNlIHNwZWNpZmljLiAgKi8KKworc3RydWN0IGlmcmVxCisgIHsKKyMgZGVmaW5lIElGSFdBRERSTEVOCTYKKyMgZGVmaW5lIElGTkFNU0laCUlGX05BTUVTSVpFCisgICAgdW5pb24KKyAgICAgIHsKKwljaGFyIGlmcm5fbmFtZVtJRk5BTVNJWl07CS8qIEludGVyZmFjZSBuYW1lLCBlLmcuICJlbjAiLiAgKi8KKyAgICAgIH0gaWZyX2lmcm47CisKKyAgICB1bmlvbgorICAgICAgeworCXN0cnVjdCBzb2NrYWRkciBpZnJ1X2FkZHI7CisJc3RydWN0IHNvY2thZGRyIGlmcnVfZHN0YWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHIgaWZydV9icm9hZGFkZHI7CisJc3RydWN0IHNvY2thZGRyIGlmcnVfbmV0bWFzazsKKwlzdHJ1Y3Qgc29ja2FkZHIgaWZydV9od2FkZHI7CisJc2hvcnQgaW50IGlmcnVfZmxhZ3M7CisJaW50IGlmcnVfaXZhbHVlOworCWludCBpZnJ1X210dTsKKwlzdHJ1Y3QgaWZtYXAgaWZydV9tYXA7CisJY2hhciBpZnJ1X3NsYXZlW0lGTkFNU0laXTsJLyogSnVzdCBmaXRzIHRoZSBzaXplICovCisJY2hhciBpZnJ1X25ld25hbWVbSUZOQU1TSVpdOworCV9fY2FkZHJfdCBpZnJ1X2RhdGE7CisgICAgICB9IGlmcl9pZnJ1OworICB9OworIyBkZWZpbmUgaWZyX25hbWUJaWZyX2lmcm4uaWZybl9uYW1lCS8qIGludGVyZmFjZSBuYW1lIAkqLworIyBkZWZpbmUgaWZyX2h3YWRkcglpZnJfaWZydS5pZnJ1X2h3YWRkcgkvKiBNQUMgYWRkcmVzcyAJCSovCisjIGRlZmluZSBpZnJfYWRkcglpZnJfaWZydS5pZnJ1X2FkZHIJLyogYWRkcmVzcwkJKi8KKyMgZGVmaW5lIGlmcl9kc3RhZGRyCWlmcl9pZnJ1LmlmcnVfZHN0YWRkcgkvKiBvdGhlciBlbmQgb2YgcC1wIGxuawkqLworIyBkZWZpbmUgaWZyX2Jyb2FkYWRkcglpZnJfaWZydS5pZnJ1X2Jyb2FkYWRkcgkvKiBicm9hZGNhc3QgYWRkcmVzcwkqLworIyBkZWZpbmUgaWZyX25ldG1hc2sJaWZyX2lmcnUuaWZydV9uZXRtYXNrCS8qIGludGVyZmFjZSBuZXQgbWFzawkqLworIyBkZWZpbmUgaWZyX2ZsYWdzCWlmcl9pZnJ1LmlmcnVfZmxhZ3MJLyogZmxhZ3MJCSovCisjIGRlZmluZSBpZnJfbWV0cmljCWlmcl9pZnJ1LmlmcnVfaXZhbHVlCS8qIG1ldHJpYwkJKi8KKyMgZGVmaW5lIGlmcl9tdHUJaWZyX2lmcnUuaWZydV9tdHUJLyogbXR1CQkJKi8KKyMgZGVmaW5lIGlmcl9tYXAJaWZyX2lmcnUuaWZydV9tYXAJLyogZGV2aWNlIG1hcAkJKi8KKyMgZGVmaW5lIGlmcl9zbGF2ZQlpZnJfaWZydS5pZnJ1X3NsYXZlCS8qIHNsYXZlIGRldmljZQkJKi8KKyMgZGVmaW5lIGlmcl9kYXRhCWlmcl9pZnJ1LmlmcnVfZGF0YQkvKiBmb3IgdXNlIGJ5IGludGVyZmFjZQkqLworIyBkZWZpbmUgaWZyX2lmaW5kZXgJaWZyX2lmcnUuaWZydV9pdmFsdWUgICAgLyogaW50ZXJmYWNlIGluZGV4ICAgICAgKi8KKyMgZGVmaW5lIGlmcl9iYW5kd2lkdGgJaWZyX2lmcnUuaWZydV9pdmFsdWUJLyogbGluayBiYW5kd2lkdGgJKi8KKyMgZGVmaW5lIGlmcl9xbGVuCWlmcl9pZnJ1LmlmcnVfaXZhbHVlCS8qIHF1ZXVlIGxlbmd0aAkJKi8KKyMgZGVmaW5lIGlmcl9uZXduYW1lCWlmcl9pZnJ1LmlmcnVfbmV3bmFtZQkvKiBOZXcgbmFtZQkJKi8KKyMgZGVmaW5lIF9JT1RfaWZyZXEJX0lPVChfSU9UUyhjaGFyKSxJRk5BTVNJWixfSU9UUyhjaGFyKSwxNiwwLDApCisjIGRlZmluZSBfSU9UX2lmcmVxX3Nob3J0IF9JT1QoX0lPVFMoY2hhciksSUZOQU1TSVosX0lPVFMoc2hvcnQpLDEsMCwwKQorIyBkZWZpbmUgX0lPVF9pZnJlcV9pbnQJX0lPVChfSU9UUyhjaGFyKSxJRk5BTVNJWixfSU9UUyhpbnQpLDEsMCwwKQorCisKKy8qIFN0cnVjdHVyZSB1c2VkIGluIFNJT0NHSUZDT05GIHJlcXVlc3QuICBVc2VkIHRvIHJldHJpZXZlIGludGVyZmFjZQorICAgY29uZmlndXJhdGlvbiBmb3IgbWFjaGluZSAodXNlZnVsIGZvciBwcm9ncmFtcyB3aGljaCBtdXN0IGtub3cgYWxsCisgICBuZXR3b3JrcyBhY2Nlc3NpYmxlKS4gICovCisKK3N0cnVjdCBpZmNvbmYKKyAgeworICAgIGludAlpZmNfbGVuOwkJCS8qIFNpemUgb2YgYnVmZmVyLiAgKi8KKyAgICB1bmlvbgorICAgICAgeworCV9fY2FkZHJfdCBpZmN1X2J1ZjsKKwlzdHJ1Y3QgaWZyZXEgKmlmY3VfcmVxOworICAgICAgfSBpZmNfaWZjdTsKKyAgfTsKKyMgZGVmaW5lIGlmY19idWYJaWZjX2lmY3UuaWZjdV9idWYJLyogQnVmZmVyIGFkZHJlc3MuICAqLworIyBkZWZpbmUgaWZjX3JlcQlpZmNfaWZjdS5pZmN1X3JlcQkvKiBBcnJheSBvZiBzdHJ1Y3R1cmVzLiAgKi8KKyMgZGVmaW5lIF9JT1RfaWZjb25mIF9JT1QoX0lPVFMoc3RydWN0IGlmY29uZiksMSwwLDAsMCwwKSAvKiBub3QgcmlnaHQgKi8KKyNlbmRpZgkvKiBNaXNjLiAgKi8KKworX19CRUdJTl9ERUNMUworCisvKiBDb252ZXJ0IGFuIGludGVyZmFjZSBuYW1lIHRvIGFuIGluZGV4LCBhbmQgdmljZSB2ZXJzYS4gICovCitleHRlcm4gdW5zaWduZWQgaW50IGlmX25hbWV0b2luZGV4IChfX2NvbnN0IGNoYXIgKl9faWZuYW1lKSBfX1RIUk9XOworZXh0ZXJuIGNoYXIgKmlmX2luZGV4dG9uYW1lICh1bnNpZ25lZCBpbnQgX19pZmluZGV4LCBjaGFyICpfX2lmbmFtZSkgX19USFJPVzsKKworLyogUmV0dXJuIGEgbGlzdCBvZiBhbGwgaW50ZXJmYWNlcyBhbmQgdGhlaXIgaW5kaWNlcy4gICovCitleHRlcm4gc3RydWN0IGlmX25hbWVpbmRleCAqaWZfbmFtZWluZGV4ICh2b2lkKSBfX1RIUk9XOworCisvKiBGcmVlIHRoZSBkYXRhIHJldHVybmVkIGZyb20gaWZfbmFtZWluZGV4LiAgKi8KK2V4dGVybiB2b2lkIGlmX2ZyZWVuYW1laW5kZXggKHN0cnVjdCBpZl9uYW1laW5kZXggKl9fcHRyKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogbmV0L2lmLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmX2FycC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvaWZfYXJwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdjYjYxZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmX2FycC5oCkBAIC0wLDAgKzEsMTg0IEBACisvKiBEZWZpbml0aW9ucyBmb3IgQWRkcmVzcyBSZXNvbHV0aW9uIFByb3RvY29sLgorICAgQ29weXJpZ2h0IChDKSAxOTk3LDE5OTksMjAwMSwyMDA2LDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk3LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogQmFzZWQgb24gdGhlIDQuNEJTRCBhbmQgTGludXggdmVyc2lvbiBvZiB0aGlzIGZpbGUuICAqLworCisjaWZuZGVmIF9ORVRfSUZfQVJQX0gKKworI2RlZmluZSBfTkVUX0lGX0FSUF9IIDEKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBTb21lIGludGVybmFscyBmcm9tIGRlZXAgZG93biBpbiB0aGUga2VybmVsLiAgKi8KKyNkZWZpbmUgTUFYX0FERFJfTEVOCTcKKworCisvKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFuIGV0aGVybmV0IGFycCBoZWFkZXIuICAqLworCisvKiBBUlAgcHJvdG9jb2wgb3Bjb2Rlcy4gKi8KKyNkZWZpbmUJQVJQT1BfUkVRVUVTVAkxCQkvKiBBUlAgcmVxdWVzdC4gICovCisjZGVmaW5lCUFSUE9QX1JFUExZCTIJCS8qIEFSUCByZXBseS4gICovCisjZGVmaW5lCUFSUE9QX1JSRVFVRVNUCTMJCS8qIFJBUlAgcmVxdWVzdC4gICovCisjZGVmaW5lCUFSUE9QX1JSRVBMWQk0CQkvKiBSQVJQIHJlcGx5LiAgKi8KKyNkZWZpbmUJQVJQT1BfSW5SRVFVRVNUCTgJCS8qIEluQVJQIHJlcXVlc3QuICAqLworI2RlZmluZQlBUlBPUF9JblJFUExZCTkJCS8qIEluQVJQIHJlcGx5LiAgKi8KKyNkZWZpbmUJQVJQT1BfTkFLCTEwCQkvKiAoQVRNKUFSUCBOQUsuICAqLworCisvKiBTZWUgUkZDIDgyNiBmb3IgcHJvdG9jb2wgZGVzY3JpcHRpb24uICBBUlAgcGFja2V0cyBhcmUgdmFyaWFibGUKKyAgIGluIHNpemU7IHRoZSBhcnBoZHIgc3RydWN0dXJlIGRlZmluZXMgdGhlIGZpeGVkLWxlbmd0aCBwb3J0aW9uLgorICAgUHJvdG9jb2wgdHlwZSB2YWx1ZXMgYXJlIHRoZSBzYW1lIGFzIHRob3NlIGZvciAxMCBNYi9zIEV0aGVybmV0LgorICAgSXQgaXMgZm9sbG93ZWQgYnkgdGhlIHZhcmlhYmxlLXNpemVkIGZpZWxkcyBhcl9zaGEsIGFycF9zcGEsCisgICBhcnBfdGhhIGFuZCBhcnBfdHBhIGluIHRoYXQgb3JkZXIsIGFjY29yZGluZyB0byB0aGUgbGVuZ3RocworICAgc3BlY2lmaWVkLiAgRmllbGQgbmFtZXMgdXNlZCBjb3JyZXNwb25kIHRvIFJGQyA4MjYuICAqLworCitzdHJ1Y3QgYXJwaGRyCisgIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgYXJfaHJkOwkJLyogRm9ybWF0IG9mIGhhcmR3YXJlIGFkZHJlc3MuICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBhcl9wcm87CQkvKiBGb3JtYXQgb2YgcHJvdG9jb2wgYWRkcmVzcy4gICovCisgICAgdW5zaWduZWQgY2hhciBhcl9obG47CQkvKiBMZW5ndGggb2YgaGFyZHdhcmUgYWRkcmVzcy4gICovCisgICAgdW5zaWduZWQgY2hhciBhcl9wbG47CQkvKiBMZW5ndGggb2YgcHJvdG9jb2wgYWRkcmVzcy4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IGFyX29wOwkJLyogQVJQIG9wY29kZSAoY29tbWFuZCkuICAqLworI2lmIDAKKyAgICAvKiBFdGhlcm5ldCBsb29rcyBsaWtlIHRoaXMgOiBUaGlzIGJpdCBpcyB2YXJpYWJsZSBzaXplZAorICAgICAgIGhvd2V2ZXIuLi4gICovCisgICAgdW5zaWduZWQgY2hhciBfX2FyX3NoYVtFVEhfQUxFTl07CS8qIFNlbmRlciBoYXJkd2FyZSBhZGRyZXNzLiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIF9fYXJfc2lwWzRdOwkJLyogU2VuZGVyIElQIGFkZHJlc3MuICAqLworICAgIHVuc2lnbmVkIGNoYXIgX19hcl90aGFbRVRIX0FMRU5dOwkvKiBUYXJnZXQgaGFyZHdhcmUgYWRkcmVzcy4gICovCisgICAgdW5zaWduZWQgY2hhciBfX2FyX3RpcFs0XTsJCS8qIFRhcmdldCBJUCBhZGRyZXNzLiAgKi8KKyNlbmRpZgorICB9OworCisKKy8qIEFSUCBwcm90b2NvbCBIQVJEV0FSRSBpZGVudGlmaWVycy4gKi8KKyNkZWZpbmUgQVJQSFJEX05FVFJPTQkwCQkvKiBGcm9tIEtBOVE6IE5FVC9ST00gcHNldWRvLiAqLworI2RlZmluZSBBUlBIUkRfRVRIRVIgCTEJCS8qIEV0aGVybmV0IDEwLzEwME1icHMuICAqLworI2RlZmluZQlBUlBIUkRfRUVUSEVSCTIJCS8qIEV4cGVyaW1lbnRhbCBFdGhlcm5ldC4gICovCisjZGVmaW5lCUFSUEhSRF9BWDI1CTMJCS8qIEFYLjI1IExldmVsIDIuICAqLworI2RlZmluZQlBUlBIUkRfUFJPTkVUCTQJCS8qIFBST25ldCB0b2tlbiByaW5nLiAgKi8KKyNkZWZpbmUJQVJQSFJEX0NIQU9TCTUJCS8qIENoYW9zbmV0LiAgKi8KKyNkZWZpbmUJQVJQSFJEX0lFRUU4MDIJNgkJLyogSUVFRSA4MDIuMiBFdGhlcm5ldC9UUi9UQi4gICovCisjZGVmaW5lCUFSUEhSRF9BUkNORVQJNwkJLyogQVJDbmV0LiAgKi8KKyNkZWZpbmUJQVJQSFJEX0FQUExFVExLCTgJCS8qIEFQUExFdGFsay4gICovCisjZGVmaW5lCUFSUEhSRF9ETENJCTE1CQkvKiBGcmFtZSBSZWxheSBETENJLiAgKi8KKyNkZWZpbmUJQVJQSFJEX0FUTQkxOQkJLyogQVRNLiAgKi8KKyNkZWZpbmUJQVJQSFJEX01FVFJJQ09NCTIzCQkvKiBNZXRyaWNvbSBTVFJJUCAobmV3IElBTkEgaWQpLiAgKi8KKyNkZWZpbmUgQVJQSFJEX0lFRUUxMzk0CTI0CQkvKiBJRUVFIDEzOTQgSVB2NCAtIFJGQyAyNzM0LiAgKi8KKyNkZWZpbmUgQVJQSFJEX0VVSTY0CQkyNwkJLyogRVVJLTY0LiAgKi8KKyNkZWZpbmUgQVJQSFJEX0lORklOSUJBTkQJMzIJCS8qIEluZmluaUJhbmQuICAqLworCisvKiBEdW1teSB0eXBlcyBmb3Igbm9uIEFSUCBoYXJkd2FyZSAqLworI2RlZmluZSBBUlBIUkRfU0xJUAkyNTYKKyNkZWZpbmUgQVJQSFJEX0NTTElQCTI1NworI2RlZmluZSBBUlBIUkRfU0xJUDYJMjU4CisjZGVmaW5lIEFSUEhSRF9DU0xJUDYJMjU5CisjZGVmaW5lIEFSUEhSRF9SU1JWRAkyNjAJCS8qIE5vdGlvbmFsIEtJU1MgdHlwZS4gICovCisjZGVmaW5lIEFSUEhSRF9BREFQVAkyNjQKKyNkZWZpbmUgQVJQSFJEX1JPU0UJMjcwCisjZGVmaW5lIEFSUEhSRF9YMjUJMjcxCQkvKiBDQ0lUVCBYLjI1LiAgKi8KKyNkZWZpbmUgQVJQSFJEX0hXWDI1CTI3MgkJLyogQm9hcmRzIHdpdGggWC4yNSBpbiBmaXJtd2FyZS4gICovCisjZGVmaW5lIEFSUEhSRF9QUFAJNTEyCisjZGVmaW5lIEFSUEhSRF9DSVNDTwk1MTMJCS8qIENpc2NvIEhETEMuICAqLworI2RlZmluZSBBUlBIUkRfSERMQwlBUlBIUkRfQ0lTQ08KKyNkZWZpbmUgQVJQSFJEX0xBUEIJNTE2CQkvKiBMQVBCLiAgKi8KKyNkZWZpbmUgQVJQSFJEX0REQ01QCTUxNwkJLyogRGlnaXRhbCdzIEREQ01QLiAgKi8KKyNkZWZpbmUJQVJQSFJEX1JBV0hETEMJNTE4CQkvKiBSYXcgSERMQy4gICovCisKKyNkZWZpbmUgQVJQSFJEX1RVTk5FTAk3NjgJCS8qIElQSVAgdHVubmVsLiAgKi8KKyNkZWZpbmUgQVJQSFJEX1RVTk5FTDYJNzY5CQkvKiBJUElQNiB0dW5uZWwuICAqLworI2RlZmluZSBBUlBIUkRfRlJBRAk3NzAgICAgICAgICAgICAgLyogRnJhbWUgUmVsYXkgQWNjZXNzIERldmljZS4gICovCisjZGVmaW5lIEFSUEhSRF9TS0lQCTc3MQkJLyogU0tJUCB2aWYuICAqLworI2RlZmluZSBBUlBIUkRfTE9PUEJBQ0sJNzcyCQkvKiBMb29wYmFjayBkZXZpY2UuICAqLworI2RlZmluZSBBUlBIUkRfTE9DQUxUTEsgNzczCQkvKiBMb2NhbHRhbGsgZGV2aWNlLiAgKi8KKyNkZWZpbmUgQVJQSFJEX0ZEREkJNzc0CQkvKiBGaWJlciBEaXN0cmlidXRlZCBEYXRhIEludGVyZmFjZS4gKi8KKyNkZWZpbmUgQVJQSFJEX0JJRgk3NzUgICAgICAgICAgICAgLyogQVAxMDAwIEJJRi4gICovCisjZGVmaW5lIEFSUEhSRF9TSVQJNzc2CQkvKiBzaXQwIGRldmljZSAtIElQdjYtaW4tSVB2NC4gICovCisjZGVmaW5lIEFSUEhSRF9JUEREUAk3NzcJCS8qIElQLWluLUREUCB0dW5uZWwuICAqLworI2RlZmluZSBBUlBIUkRfSVBHUkUJNzc4CQkvKiBHUkUgb3ZlciBJUC4gICovCisjZGVmaW5lIEFSUEhSRF9QSU1SRUcJNzc5CQkvKiBQSU1TTSByZWdpc3RlciBpbnRlcmZhY2UuICAqLworI2RlZmluZSBBUlBIUkRfSElQUEkJNzgwCQkvKiBIaWdoIFBlcmZvcm1hbmNlIFBhcmFsbGVsIEknZmFjZS4gKi8KKyNkZWZpbmUgQVJQSFJEX0FTSAk3ODEJCS8qIChOZXh1cyBFbGVjdHJvbmljcykgQXNoLiAgKi8KKyNkZWZpbmUgQVJQSFJEX0VDT05FVAk3ODIJCS8qIEFjb3JuIEVjb25ldC4gICovCisjZGVmaW5lIEFSUEhSRF9JUkRBCTc4MwkJLyogTGludXgtSXJEQS4gICovCisjZGVmaW5lIEFSUEhSRF9GQ1BQCTc4NAkJLyogUG9pbnQgdG8gcG9pbnQgZmlicmVjaGFuZWwuICAqLworI2RlZmluZSBBUlBIUkRfRkNBTAk3ODUJCS8qIEZpYnJlY2hhbmVsIGFyYml0cmF0ZWQgbG9vcC4gICovCisjZGVmaW5lIEFSUEhSRF9GQ1BMCTc4NgkJLyogRmlicmVjaGFuZWwgcHVibGljIGxvb3AuICAqLworI2RlZmluZSBBUlBIUkRfRkNGQUJSSUMgNzg3CQkvKiBGaWJyZWNoYW5lbCBmYWJyaWMuICAqLworI2RlZmluZSBBUlBIUkRfSUVFRTgwMl9UUiA4MDAJCS8qIE1hZ2ljIHR5cGUgaWRlbnQgZm9yIFRSLiAgKi8KKyNkZWZpbmUgQVJQSFJEX0lFRUU4MDIxMSA4MDEJCS8qIElFRUUgODAyLjExLiAgKi8KKyNkZWZpbmUgQVJQSFJEX0lFRUU4MDIxMV9QUklTTSA4MDIJLyogSUVFRSA4MDIuMTEgKyBQcmlzbTIgaGVhZGVyLiAgKi8KKyNkZWZpbmUgQVJQSFJEX0lFRUU4MDIxMV9SQURJT1RBUCA4MDMJLyogSUVFRSA4MDIuMTEgKyByYWRpb3RhcCBoZWFkZXIuICAqLworI2RlZmluZSBBUlBIUkRfSUVFRTgwMjE1NCA4MDQJCS8qIElFRUUgODAyLjE1LjQgaGVhZGVyLiAgKi8KKyNkZWZpbmUgQVJQSFJEX0lFRUU4MDIxNTRfUEhZIDgwNQkvKiBJRUVFIDgwMi4xNS40IFBIWSBoZWFkZXIuICAqLworCisjZGVmaW5lIEFSUEhSRF9WT0lECSAgMHhGRkZGCS8qIFZvaWQgdHlwZSwgbm90aGluZyBpcyBrbm93bi4gICovCisjZGVmaW5lIEFSUEhSRF9OT05FCSAgMHhGRkZFCS8qIFplcm8gaGVhZGVyIGxlbmd0aC4gICovCisKKworLyogQVJQIGlvY3RsIHJlcXVlc3QuICAqLworc3RydWN0IGFycHJlcQorICB7CisgICAgc3RydWN0IHNvY2thZGRyIGFycF9wYTsJCS8qIFByb3RvY29sIGFkZHJlc3MuICAqLworICAgIHN0cnVjdCBzb2NrYWRkciBhcnBfaGE7CQkvKiBIYXJkd2FyZSBhZGRyZXNzLiAgKi8KKyAgICBpbnQgYXJwX2ZsYWdzOwkJCS8qIEZsYWdzLiAgKi8KKyAgICBzdHJ1Y3Qgc29ja2FkZHIgYXJwX25ldG1hc2s7CS8qIE5ldG1hc2sgKG9ubHkgZm9yIHByb3h5IGFycHMpLiAgKi8KKyAgICBjaGFyIGFycF9kZXZbMTZdOworICB9OworCitzdHJ1Y3QgYXJwcmVxX29sZAorICB7CisgICAgc3RydWN0IHNvY2thZGRyIGFycF9wYTsJCS8qIFByb3RvY29sIGFkZHJlc3MuICAqLworICAgIHN0cnVjdCBzb2NrYWRkciBhcnBfaGE7CQkvKiBIYXJkd2FyZSBhZGRyZXNzLiAgKi8KKyAgICBpbnQgYXJwX2ZsYWdzOwkJCS8qIEZsYWdzLiAgKi8KKyAgICBzdHJ1Y3Qgc29ja2FkZHIgYXJwX25ldG1hc2s7CS8qIE5ldG1hc2sgKG9ubHkgZm9yIHByb3h5IGFycHMpLiAgKi8KKyAgfTsKKworLyogQVJQIEZsYWcgdmFsdWVzLiAgKi8KKyNkZWZpbmUgQVRGX0NPTQkJMHgwMgkJLyogQ29tcGxldGVkIGVudHJ5IChoYSB2YWxpZCkuICAqLworI2RlZmluZQlBVEZfUEVSTQkweDA0CQkvKiBQZXJtYW5lbnQgZW50cnkuICAqLworI2RlZmluZQlBVEZfUFVCTAkweDA4CQkvKiBQdWJsaXNoIGVudHJ5LiAgKi8KKyNkZWZpbmUJQVRGX1VTRVRSQUlMRVJTCTB4MTAJCS8qIEhhcyByZXF1ZXN0ZWQgdHJhaWxlcnMuICAqLworI2RlZmluZSBBVEZfTkVUTUFTSyAgICAgMHgyMCAgICAgICAgICAgIC8qIFdhbnQgdG8gdXNlIGEgbmV0bWFzayAob25seQorCQkJCQkgICBmb3IgcHJveHkgZW50cmllcykuICAqLworI2RlZmluZSBBVEZfRE9OVFBVQgkweDQwCQkvKiBEb24ndCBhbnN3ZXIgdGhpcyBhZGRyZXNzZXMuICAqLworI2RlZmluZSBBVEZfTUFHSUMJMHg4MAkJLyogQXV0b21hdGljYWxseSBhZGRlZCBlbnRyeS4gICovCisKKworLyogU3VwcG9ydCBmb3IgdGhlIHVzZXIgc3BhY2UgYXJwIGRhZW1vbiwgYXJwZC4gICovCisjZGVmaW5lIEFSUERfVVBEQVRFCTB4MDEKKyNkZWZpbmUgQVJQRF9MT09LVVAJMHgwMgorI2RlZmluZSBBUlBEX0ZMVVNICTB4MDMKKworc3RydWN0IGFycGRfcmVxdWVzdAorICB7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IHJlcTsJCS8qIFJlcXVlc3QgdHlwZS4gICovCisgICAgdV9pbnQzMl90IGlwOwkJCS8qIElQIGFkZHJlc3Mgb2YgZW50cnkuICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IGRldjsJCS8qIERldmljZSBlbnRyeSBpcyB0aWVkIHRvLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBzdGFtcDsKKyAgICB1bnNpZ25lZCBsb25nIGludCB1cGRhdGVkOworICAgIHVuc2lnbmVkIGNoYXIgaGFbTUFYX0FERFJfTEVOXTsJLyogSGFyZHdhcmUgYWRkcmVzcy4gICovCisgIH07CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBuZXQvaWZfYXJwLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmX3BhY2tldC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvaWZfcGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUxODRlNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmX3BhY2tldC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIERlZmluaXRpb25zIGZvciB1c2Ugd2l0aCBMaW51eCBTT0NLX1BBQ0tFVCBzb2NrZXRzLgorICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9fSUZfUEFDS0VUX0gKKyNkZWZpbmUgX19JRl9QQUNLRVRfSAorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3NvY2thZGRyLmg+CisKKy8qIFRoaXMgaXMgdGhlIFNPQ0tfUEFDS0VUIGFkZHJlc3Mgc3RydWN0dXJlIGFzIHVzZWQgaW4gTGludXggMi4wLgorICAgRnJvbSBMaW51eCAyLjEgdGhlIEFGX1BBQ0tFVCBpbnRlcmZhY2UgaXMgcHJlZmVycmVkIGFuZCB5b3Ugc2hvdWxkCisgICBjb25zaWRlciB1c2luZyBpdCBpbiBwbGFjZSBvZiB0aGlzIG9uZS4gICovCisKK3N0cnVjdCBzb2NrYWRkcl9wa3QKKyAgeworICAgIF9fU09DS0FERFJfQ09NTU9OIChzcGt0Xyk7CisgICAgdW5zaWduZWQgY2hhciBzcGt0X2RldmljZVsxNF07CisgICAgdW5zaWduZWQgc2hvcnQgc3BrdF9wcm90b2NvbDsKKyAgfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9pZl9wcHAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmX3BwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNWVjODMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9pZl9wcHAuaApAQCAtMCwwICsxLDE2OSBAQAorLyoJRnJvbTogaWZfcHBwLmgsdiAxLjMgMTk5NS8wNi8xMiAxMTozNjo1MCBwYXVsdXMgRXhwICovCisKKy8qCisgKiBpZl9wcHAuaCAtIFBvaW50LXRvLVBvaW50IFByb3RvY29sIGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk4OSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4gCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIEFORAorICogQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFVOSVZFUlNJVFkgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCisgKiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworLyoKKyAqICA9PUZJTEVWRVJTSU9OIDk2MDkyNj09CisgKgorICogIE5PVEUgVE8gTUFJTlRBSU5FUlM6CisgKiAgICAgSWYgeW91IG1vZGlmeSB0aGlzIGZpbGUgYXQgYWxsLCBwbGVhc2Ugc2V0IHRoZSBhYm92ZSBkYXRlLgorICogICAgIGlmX3BwcC5oIGlzIHNoaXBwZWQgd2l0aCBhIFBQUCBkaXN0cmlidXRpb24gYXMgd2VsbCBhcyB3aXRoIHRoZSBrZXJuZWw7CisgKiAgICAgaWYgZXZlcnlvbmUgaW5jcmVhc2VzIHRoZSBGSUxFVkVSU0lPTiBudW1iZXIgYWJvdmUsIHRoZW4gc2NyaXB0cworICogICAgIGNhbiBkbyB0aGUgcmlnaHQgdGhpbmcgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIGluc3RhbGwgYSBuZXcgaWZfcHBwLmgKKyAqICAgICBmaWxlLiAgRG9uJ3QgY2hhbmdlIHRoZSBmb3JtYXQgb2YgdGhhdCBsaW5lIG90aGVyd2lzZSwgc28gdGhlCisgKiAgICAgaW5zdGFsbGF0aW9uIHNjcmlwdCBjYW4gcmVjb2duaXplIGl0LgorICovCisKKworI2lmbmRlZiBfX05FVF9JRl9QUFBfSAorI2RlZmluZSBfX05FVF9JRl9QUFBfSCAxCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKworI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPG5ldC9wcHBfZGVmcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qCisgKiBQYWNrZXQgc2l6ZXMKKyAqLworCisjZGVmaW5lCVBQUF9NVFUJCTE1MDAJLyogRGVmYXVsdCBNVFUgKHNpemUgb2YgSW5mbyBmaWVsZCkgKi8KKyNkZWZpbmUgUFBQX01BWE1SVQk2NTAwMAkvKiBMYXJnZXN0IE1SVSB3ZSBhbGxvdyAqLworI2RlZmluZSBQUFBfVkVSU0lPTgkiMi4yLjAiCisjZGVmaW5lIFBQUF9NQUdJQwkweDUwMDIJLyogTWFnaWMgdmFsdWUgZm9yIHRoZSBwcHAgc3RydWN0dXJlICovCisjZGVmaW5lIFBST1RPX0lQWAkweDAwMmIJLyogcHJvdG9jb2wgbnVtYmVycyAqLworI2RlZmluZSBQUk9UT19ETkFfUlQgICAgMHgwMDI3ICAvKiBETkEgUm91dGluZyAqLworCisKKy8qCisgKiBCaXQgZGVmaW5pdGlvbnMgZm9yIGZsYWdzLgorICovCisKKyNkZWZpbmUgU0NfQ09NUF9QUk9UCTB4MDAwMDAwMDEJLyogcHJvdG9jb2wgY29tcHJlc3Npb24gKG91dHB1dCkgKi8KKyNkZWZpbmUgU0NfQ09NUF9BQwkweDAwMDAwMDAyCS8qIGhlYWRlciBjb21wcmVzc2lvbiAob3V0cHV0KSAqLworI2RlZmluZQlTQ19DT01QX1RDUAkweDAwMDAwMDA0CS8qIFRDUCAoVkopIGNvbXByZXNzaW9uIChvdXRwdXQpICovCisjZGVmaW5lIFNDX05PX1RDUF9DQ0lECTB4MDAwMDAwMDgJLyogZGlzYWJsZSBWSiBjb25uZWN0aW9uLWlkIGNvbXAuICovCisjZGVmaW5lIFNDX1JFSl9DT01QX0FDCTB4MDAwMDAwMTAJLyogcmVqZWN0IGFkcnMvY3RybCBjb21wLiBvbiBpbnB1dCAqLworI2RlZmluZSBTQ19SRUpfQ09NUF9UQ1AJMHgwMDAwMDAyMAkvKiByZWplY3QgVENQIChWSikgY29tcC4gb24gaW5wdXQgKi8KKyNkZWZpbmUgU0NfQ0NQX09QRU4JMHgwMDAwMDA0MAkvKiBMb29rIGF0IENDUCBwYWNrZXRzICovCisjZGVmaW5lIFNDX0NDUF9VUAkweDAwMDAwMDgwCS8qIE1heSBzZW5kL3JlY3YgY29tcHJlc3NlZCBwYWNrZXRzICovCisjZGVmaW5lIFNDX0VOQUJMRV9JUAkweDAwMDAwMTAwCS8qIElQIHBhY2tldHMgbWF5IGJlIGV4Y2hhbmdlZCAqLworI2RlZmluZSBTQ19DT01QX1JVTgkweDAwMDAxMDAwCS8qIGNvbXByZXNzb3IgaGFzIGJlZW4gaW5pdGVkICovCisjZGVmaW5lIFNDX0RFQ09NUF9SVU4JMHgwMDAwMjAwMAkvKiBkZWNvbXByZXNzb3IgaGFzIGJlZW4gaW5pdGVkICovCisjZGVmaW5lIFNDX0RFQlVHCTB4MDAwMTAwMDAJLyogZW5hYmxlIGRlYnVnIG1lc3NhZ2VzICovCisjZGVmaW5lIFNDX0xPR19JTlBLVAkweDAwMDIwMDAwCS8qIGxvZyBjb250ZW50cyBvZiBnb29kIHBrdHMgcmVjdmQgKi8KKyNkZWZpbmUgU0NfTE9HX09VVFBLVAkweDAwMDQwMDAwCS8qIGxvZyBjb250ZW50cyBvZiBwa3RzIHNlbnQgKi8KKyNkZWZpbmUgU0NfTE9HX1JBV0lOCTB4MDAwODAwMDAJLyogbG9nIGFsbCBjaGFycyByZWNlaXZlZCAqLworI2RlZmluZSBTQ19MT0dfRkxVU0gJMHgwMDEwMDAwMAkvKiBsb2cgYWxsIGNoYXJzIGZsdXNoZWQgKi8KKyNkZWZpbmUJU0NfTUFTSwkJMHgwZkUwZmZmZgkvKiBiaXRzIHRoYXQgdXNlciBjYW4gY2hhbmdlICovCisKKy8qIHN0YXRlIGJpdHMgKi8KKyNkZWZpbmUJU0NfRVNDQVBFRAkweDgwMDAwMDAwCS8qIHNhdyBhIFBQUF9FU0NBUEUgKi8KKyNkZWZpbmUJU0NfRkxVU0gJMHg0MDAwMDAwMAkvKiBmbHVzaCBpbnB1dCB1bnRpbCBuZXh0IFBQUF9GTEFHICovCisjZGVmaW5lIFNDX1ZKX1JFU0VUCTB4MjAwMDAwMDAJLyogTmVlZCB0byByZXNldCB0aGUgVkogZGVjb21wcmVzc29yICovCisjZGVmaW5lIFNDX1hNSVRfQlVTWQkweDEwMDAwMDAwCS8qIHBwcF93cml0ZV93YWtldXAgaXMgYWN0aXZlICovCisjZGVmaW5lIFNDX1JDVl9PRERQCTB4MDgwMDAwMDAJLyogaGF2ZSByY3ZkIGNoYXIgd2l0aCBvZGQgcGFyaXR5ICovCisjZGVmaW5lIFNDX1JDVl9FVk5QCTB4MDQwMDAwMDAJLyogaGF2ZSByY3ZkIGNoYXIgd2l0aCBldmVuIHBhcml0eSAqLworI2RlZmluZSBTQ19SQ1ZfQjdfMQkweDAyMDAwMDAwCS8qIGhhdmUgcmN2ZCBjaGFyIHdpdGggYml0IDcgPSAxICovCisjZGVmaW5lIFNDX1JDVl9CN18wCTB4MDEwMDAwMDAJLyogaGF2ZSByY3ZkIGNoYXIgd2l0aCBiaXQgNyA9IDAgKi8KKyNkZWZpbmUgU0NfRENfRkVSUk9SCTB4MDA4MDAwMDAJLyogZmF0YWwgZGVjb21wIGVycm9yIGRldGVjdGVkICovCisjZGVmaW5lIFNDX0RDX0VSUk9SCTB4MDA0MDAwMDAJLyogbm9uLWZhdGFsIGRlY29tcCBlcnJvciBkZXRlY3RlZCAqLworCisvKgorICogSW9jdGwgZGVmaW5pdGlvbnMuCisgKi8KKworc3RydWN0IG5waW9jdGwgeworICAgIGludAkJcHJvdG9jb2w7CS8qIFBQUCBwcm90b2NvbCwgZS5nLiBQUFBfSVAgKi8KKyAgICBlbnVtIE5QbW9kZQltb2RlOworfTsKKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgYSBDQ1AgY29uZmlndXJhdGlvbiBvcHRpb24sIGZvciBQUFBJT0NTQ09NUFJFU1MgKi8KK3N0cnVjdCBwcHBfb3B0aW9uX2RhdGEgeworCXVfaW50OF90ICAqcHRyOworCXVfaW50MzJfdCBsZW5ndGg7CisJaW50CSAgdHJhbnNtaXQ7Cit9OworCitzdHJ1Y3QgaWZwcHBzdGF0c3JlcSB7CisgIHN0cnVjdCBpZnJlcQkgICBiOworICBzdHJ1Y3QgcHBwX3N0YXRzIHN0YXRzOwkJCS8qIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiAqLworfTsKKworc3RydWN0IGlmcHBwY3N0YXRzcmVxIHsKKyAgc3RydWN0IGlmcmVxCQliOworICBzdHJ1Y3QgcHBwX2NvbXBfc3RhdHMgc3RhdHM7Cit9OworCisjZGVmaW5lIGlmcl9fbmFtZSAgICAgICBiLmlmcl9pZnJuLmlmcm5fbmFtZQorI2RlZmluZSBzdGF0c19wdHIgICAgICAgYi5pZnJfaWZydS5pZnJ1X2RhdGEKKworLyoKKyAqIElvY3RsIGRlZmluaXRpb25zLgorICovCisKKyNkZWZpbmUJUFBQSU9DR0ZMQUdTCV9JT1IoJ3QnLCA5MCwgaW50KQkvKiBnZXQgY29uZmlndXJhdGlvbiBmbGFncyAqLworI2RlZmluZQlQUFBJT0NTRkxBR1MJX0lPVygndCcsIDg5LCBpbnQpCS8qIHNldCBjb25maWd1cmF0aW9uIGZsYWdzICovCisjZGVmaW5lCVBQUElPQ0dBU1lOQ01BUAlfSU9SKCd0JywgODgsIGludCkJLyogZ2V0IGFzeW5jIG1hcCAqLworI2RlZmluZQlQUFBJT0NTQVNZTkNNQVAJX0lPVygndCcsIDg3LCBpbnQpCS8qIHNldCBhc3luYyBtYXAgKi8KKyNkZWZpbmUJUFBQSU9DR1VOSVQJX0lPUigndCcsIDg2LCBpbnQpCS8qIGdldCBwcHAgdW5pdCBudW1iZXIgKi8KKyNkZWZpbmUJUFBQSU9DR1JBU1lOQ01BUCBfSU9SKCd0JywgODUsIGludCkJLyogZ2V0IHJlY2VpdmUgYXN5bmMgbWFwICovCisjZGVmaW5lCVBQUElPQ1NSQVNZTkNNQVAgX0lPVygndCcsIDg0LCBpbnQpCS8qIHNldCByZWNlaXZlIGFzeW5jIG1hcCAqLworI2RlZmluZQlQUFBJT0NHTVJVCV9JT1IoJ3QnLCA4MywgaW50KQkvKiBnZXQgbWF4IHJlY2VpdmUgdW5pdCAqLworI2RlZmluZQlQUFBJT0NTTVJVCV9JT1coJ3QnLCA4MiwgaW50KQkvKiBzZXQgbWF4IHJlY2VpdmUgdW5pdCAqLworI2RlZmluZQlQUFBJT0NTTUFYQ0lECV9JT1coJ3QnLCA4MSwgaW50KQkvKiBzZXQgVkogbWF4IHNsb3QgSUQgKi8KKyNkZWZpbmUgUFBQSU9DR1hBU1lOQ01BUCBfSU9SKCd0JywgODAsIGV4dF9hY2NtKSAvKiBnZXQgZXh0ZW5kZWQgQUNDTSAqLworI2RlZmluZSBQUFBJT0NTWEFTWU5DTUFQIF9JT1coJ3QnLCA3OSwgZXh0X2FjY20pIC8qIHNldCBleHRlbmRlZCBBQ0NNICovCisjZGVmaW5lIFBQUElPQ1hGRVJVTklUCV9JTygndCcsIDc4KQkJLyogdHJhbnNmZXIgUFBQIHVuaXQgKi8KKyNkZWZpbmUgUFBQSU9DU0NPTVBSRVNTCV9JT1coJ3QnLCA3Nywgc3RydWN0IHBwcF9vcHRpb25fZGF0YSkKKyNkZWZpbmUgUFBQSU9DR05QTU9ERQlfSU9XUigndCcsIDc2LCBzdHJ1Y3QgbnBpb2N0bCkgLyogZ2V0IE5QIG1vZGUgKi8KKyNkZWZpbmUgUFBQSU9DU05QTU9ERQlfSU9XKCd0JywgNzUsIHN0cnVjdCBucGlvY3RsKSAgLyogc2V0IE5QIG1vZGUgKi8KKyNkZWZpbmUgUFBQSU9DR0RFQlVHCV9JT1IoJ3QnLCA2NSwgaW50KQkvKiBSZWFkIGRlYnVnIGxldmVsICovCisjZGVmaW5lIFBQUElPQ1NERUJVRwlfSU9XKCd0JywgNjQsIGludCkJLyogU2V0IGRlYnVnIGxldmVsICovCisjZGVmaW5lIFBQUElPQ0dJRExFCV9JT1IoJ3QnLCA2Mywgc3RydWN0IHBwcF9pZGxlKSAvKiBnZXQgaWRsZSB0aW1lICovCisKKyNkZWZpbmUgU0lPQ0dQUFBTVEFUUyAgIChTSU9DREVWUFJJVkFURSArIDApCisjZGVmaW5lIFNJT0NHUFBQVkVSICAgICAoU0lPQ0RFVlBSSVZBVEUgKyAxKSAgLyogTkVWRVIgY2hhbmdlIHRoaXMhISAqLworI2RlZmluZSBTSU9DR1BQUENTVEFUUyAgKFNJT0NERVZQUklWQVRFICsgMikKKworI2lmICFkZWZpbmVkKGlmcl9tdHUpCisjZGVmaW5lIGlmcl9tdHUJaWZyX2lmcnUuaWZydV9tZXRyaWMKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogbmV0L2lmX3BwcC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9pZl9zaGFwZXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmX3NoYXBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjBhZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9pZl9zaGFwZXIuaApAQCAtMCwwICsxLDU5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX05FVF9JRl9TSEFQRVJfSAorI2RlZmluZSBfTkVUX0lGX1NIQVBFUl9IIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKK19fQkVHSU5fREVDTFMKKworI2RlZmluZSBTSEFQRVJfUUxFTgkxMAorLyoKKyAqCVRoaXMgaXMgYSBiaXQgc3BlZWQgZGVwZW5kYW50IChyZWFkIGl0IHNob3VsZG50IGJlIGEgY29uc3RhbnQhKQorICoKKyAqCTUgaXMgYWJvdXQgcmlnaHQgZm9yIDI4LjggdXB3YXJkcy4gQmVsb3cgdGhhdCBkb3VibGUgZm9yIGV2ZXJ5CisgKgloYWx2aW5nIG9mIHNwZWVkIG9yIHNvLiAtIGllIGFib3V0IDIwIGZvciA5NjAwIGJhdWQuCisgKi8KKyNkZWZpbmUgU0hBUEVSX0xBVEVOQ1kJKDUgKiBIWikKKyNkZWZpbmUgU0hBUEVSX01BWFNMSVAJMgorI2RlZmluZSBTSEFQRVJfQlVSU1QJKEhaIC8gNTApCS8qIEdvb2QgZm9yID4xMjhLIHRoZW4gKi8KKworI2RlZmluZSBTSEFQRVJfU0VUX0RFVgkJMHgwMDAxCisjZGVmaW5lIFNIQVBFUl9TRVRfU1BFRUQJMHgwMDAyCisjZGVmaW5lIFNIQVBFUl9HRVRfREVWCQkweDAwMDMKKyNkZWZpbmUgU0hBUEVSX0dFVF9TUEVFRAkweDAwMDQKKworc3RydWN0IHNoYXBlcmNvbmYKK3sKKyAgdV9pbnQxNl90IHNzX2NtZDsKKyAgdW5pb24KKyAgeworICAgIGNoYXIgc3N1X25hbWVbMTRdOworICAgIHVfaW50MzJfdCBzc3Vfc3BlZWQ7CisgIH0gc3NfdTsKKyNkZWZpbmUgc3Nfc3BlZWQgc3NfdS5zc3Vfc3BlZWQKKyNkZWZpbmUgc3NfbmFtZSBzc191LnNzdV9uYW1lCit9OworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogbmV0L2lmX3NoYXBlci5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9pZl9zbGlwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9pZl9zbGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZiZDdmMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmX3NsaXAuaApAQCAtMCwwICsxLDI1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX05FVF9JRl9TTElQX0gKKyNkZWZpbmUgX05FVF9JRl9TTElQX0ggMQorCisvKiBXZSBjYW4gdXNlIHRoZSBrZXJuZWwgaGVhZGVyLiAgKi8KKyNpbmNsdWRlIDxsaW51eC9pZl9zbGlwLmg+CisKKyNlbmRpZgkvKiBuZXQvaWZfc2xpcC5oLiAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L3BwcC1jb21wLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9wcHAtY29tcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOTkyZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9wcHAtY29tcC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxsaW51eC9wcHAtY29tcC5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvcHBwX2RlZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L3BwcF9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg5MjRjNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L3BwcF9kZWZzLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfTkVUX1BQUF9ERUZTX0gKKyNkZWZpbmUgX05FVF9QUFBfREVGU19IIDEKKworI2RlZmluZSBfX25lZWRfdGltZV90CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcHBwX2RlZnMuaD4KKworI2VuZGlmIC8qIG5ldC9wcHBfZGVmcy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9yb3V0ZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvcm91dGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTVjODEwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvcm91dGUuaApAQCAtMCwwICsxLDE0NSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBCYXNlZCBvbiB0aGUgNC40QlNEIGFuZCBMaW51eCB2ZXJzaW9uIG9mIHRoaXMgZmlsZS4gICovCisKKyNpZm5kZWYgX05FVF9ST1VURV9ICisjZGVmaW5lIF9ORVRfUk9VVEVfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisKKy8qIFRoaXMgc3RydWN0dXJlIGdldHMgcGFzc2VkIGJ5IHRoZSBTSU9DQUREUlQgYW5kIFNJT0NERUxSVCBjYWxscy4gKi8KK3N0cnVjdCBydGVudHJ5CisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCBydF9wYWQxOworICAgIHN0cnVjdCBzb2NrYWRkciBydF9kc3Q7CQkvKiBUYXJnZXQgYWRkcmVzcy4gICovCisgICAgc3RydWN0IHNvY2thZGRyIHJ0X2dhdGV3YXk7CQkvKiBHYXRld2F5IGFkZHIgKFJURl9HQVRFV0FZKS4gICovCisgICAgc3RydWN0IHNvY2thZGRyIHJ0X2dlbm1hc2s7CQkvKiBUYXJnZXQgbmV0d29yayBtYXNrIChJUCkuICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBydF9mbGFnczsKKyAgICBzaG9ydCBpbnQgcnRfcGFkMjsKKyAgICB1bnNpZ25lZCBsb25nIGludCBydF9wYWQzOworICAgIHVuc2lnbmVkIGNoYXIgcnRfdG9zOworICAgIHVuc2lnbmVkIGNoYXIgcnRfY2xhc3M7CisjaWYgX19XT1JEU0laRSA9PSA2NAorICAgIHNob3J0IGludCBydF9wYWQ0WzNdOworI2Vsc2UKKyAgICBzaG9ydCBpbnQgcnRfcGFkNDsKKyNlbmRpZgorICAgIHNob3J0IGludCBydF9tZXRyaWM7CQkvKiArMSBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkhICAqLworICAgIGNoYXIgKnJ0X2RldjsJCQkvKiBGb3JjaW5nIHRoZSBkZXZpY2UgYXQgYWRkLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBydF9tdHU7CQkvKiBQZXIgcm91dGUgTVRVL1dpbmRvdy4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgcnRfd2luZG93OwkvKiBXaW5kb3cgY2xhbXBpbmcuICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBydF9pcnR0OwkJLyogSW5pdGlhbCBSVFQuICAqLworICB9OworLyogQ29tcGF0aWJpbGl0eSBoYWNrLiAgKi8KKyNkZWZpbmUgcnRfbXNzCXJ0X210dQorCisKK3N0cnVjdCBpbjZfcnRtc2cKKyAgeworICAgIHN0cnVjdCBpbjZfYWRkciBydG1zZ19kc3Q7CisgICAgc3RydWN0IGluNl9hZGRyIHJ0bXNnX3NyYzsKKyAgICBzdHJ1Y3QgaW42X2FkZHIgcnRtc2dfZ2F0ZXdheTsKKyAgICB1X2ludDMyX3QgcnRtc2dfdHlwZTsKKyAgICB1X2ludDE2X3QgcnRtc2dfZHN0X2xlbjsKKyAgICB1X2ludDE2X3QgcnRtc2dfc3JjX2xlbjsKKyAgICB1X2ludDMyX3QgcnRtc2dfbWV0cmljOworICAgIHVuc2lnbmVkIGxvbmcgaW50IHJ0bXNnX2luZm87CisgICAgdV9pbnQzMl90IHJ0bXNnX2ZsYWdzOworICAgIGludCBydG1zZ19pZmluZGV4OworICB9OworCisKKyNkZWZpbmUJUlRGX1VQCQkweDAwMDEJCS8qIFJvdXRlIHVzYWJsZS4gICovCisjZGVmaW5lCVJURl9HQVRFV0FZCTB4MDAwMgkJLyogRGVzdGluYXRpb24gaXMgYSBnYXRld2F5LiAgKi8KKworI2RlZmluZQlSVEZfSE9TVAkweDAwMDQJCS8qIEhvc3QgZW50cnkgKG5ldCBvdGhlcndpc2UpLiAgKi8KKyNkZWZpbmUgUlRGX1JFSU5TVEFURQkweDAwMDgJCS8qIFJlaW5zdGF0ZSByb3V0ZSBhZnRlciB0aW1lb3V0LiAgKi8KKyNkZWZpbmUJUlRGX0RZTkFNSUMJMHgwMDEwCQkvKiBDcmVhdGVkIGR5bi4gKGJ5IHJlZGlyZWN0KS4gICovCisjZGVmaW5lCVJURl9NT0RJRklFRAkweDAwMjAJCS8qIE1vZGlmaWVkIGR5bi4gKGJ5IHJlZGlyZWN0KS4gICovCisjZGVmaW5lIFJURl9NVFUJCTB4MDA0MAkJLyogU3BlY2lmaWMgTVRVIGZvciB0aGlzIHJvdXRlLiAgKi8KKyNkZWZpbmUgUlRGX01TUwkJUlRGX01UVQkJLyogQ29tcGF0aWJpbGl0eS4gICovCisjZGVmaW5lIFJURl9XSU5ET1cJMHgwMDgwCQkvKiBQZXIgcm91dGUgd2luZG93IGNsYW1waW5nLiAgKi8KKyNkZWZpbmUgUlRGX0lSVFQJMHgwMTAwCQkvKiBJbml0aWFsIHJvdW5kIHRyaXAgdGltZS4gICovCisjZGVmaW5lIFJURl9SRUpFQ1QJMHgwMjAwCQkvKiBSZWplY3Qgcm91dGUuICAqLworI2RlZmluZQlSVEZfU1RBVElDCTB4MDQwMAkJLyogTWFudWFsbHkgaW5qZWN0ZWQgcm91dGUuICAqLworI2RlZmluZQlSVEZfWFJFU09MVkUJMHgwODAwCQkvKiBFeHRlcm5hbCByZXNvbHZlci4gICovCisjZGVmaW5lIFJURl9OT0ZPUldBUkQgICAweDEwMDAJCS8qIEZvcndhcmRpbmcgaW5oaWJpdGVkLiAgKi8KKyNkZWZpbmUgUlRGX1RIUk9XCTB4MjAwMAkJLyogR28gdG8gbmV4dCBjbGFzcy4gICovCisjZGVmaW5lIFJURl9OT1BNVFVESVNDICAweDQwMDAJCS8qIERvIG5vdCBzZW5kIHBhY2tldHMgd2l0aCBERi4gICovCisKKy8qIGZvciBJUHY2ICovCisjZGVmaW5lIFJURl9ERUZBVUxUCTB4MDAwMTAwMDAJLyogZGVmYXVsdCAtIGxlYXJuZWQgdmlhIE5ECSovCisjZGVmaW5lIFJURl9BTExPTkxJTksJMHgwMDAyMDAwMAkvKiBmYWxsYmFjaywgbm8gcm91dGVycyBvbiBsaW5rCSovCisjZGVmaW5lIFJURl9BRERSQ09ORgkweDAwMDQwMDAwCS8qIGFkZHJjb25mIHJvdXRlIC0gUkEJCSovCisKKyNkZWZpbmUgUlRGX0xJTktSVAkweDAwMTAwMDAwCS8qIGxpbmsgc3BlY2lmaWMgLSBkZXZpY2UgbWF0Y2gJKi8KKyNkZWZpbmUgUlRGX05PTkVYVEhPUAkweDAwMjAwMDAwCS8qIHJvdXRlIHdpdGggbm8gbmV4dGhvcAkqLworCisjZGVmaW5lIFJURl9DQUNIRQkweDAxMDAwMDAwCS8qIGNhY2hlIGVudHJ5CQkJKi8KKyNkZWZpbmUgUlRGX0ZMT1cJMHgwMjAwMDAwMAkvKiBmbG93IHNpZ25pZmljYW50IHJvdXRlCSovCisjZGVmaW5lIFJURl9QT0xJQ1kJMHgwNDAwMDAwMAkvKiBwb2xpY3kgcm91dGUJCQkqLworCisjZGVmaW5lIFJUQ0ZfVkFMVkUJMHgwMDIwMDAwMAorI2RlZmluZSBSVENGX01BU1EJMHgwMDQwMDAwMAorI2RlZmluZSBSVENGX05BVAkweDAwODAwMDAwCisjZGVmaW5lIFJUQ0ZfRE9SRURJUkVDVCAweDAxMDAwMDAwCisjZGVmaW5lIFJUQ0ZfTE9HCTB4MDIwMDAwMDAKKyNkZWZpbmUgUlRDRl9ESVJFQ1RTUkMJMHgwNDAwMDAwMAorCisjZGVmaW5lIFJURl9MT0NBTAkweDgwMDAwMDAwCisjZGVmaW5lIFJURl9JTlRFUkZBQ0UJMHg0MDAwMDAwMAorI2RlZmluZSBSVEZfTVVMVElDQVNUCTB4MjAwMDAwMDAKKyNkZWZpbmUgUlRGX0JST0FEQ0FTVAkweDEwMDAwMDAwCisjZGVmaW5lIFJURl9OQVQJCTB4MDgwMDAwMDAKKworI2RlZmluZSBSVEZfQUREUkNMQVNTTUFTSwkweEY4MDAwMDAwCisjZGVmaW5lIFJUX0FERFJDTEFTUyhmbGFncykJKChfX3VfaW50MzJfdCkgZmxhZ3MgPj4gMjMpCisKKyNkZWZpbmUgUlRfVE9TKHRvcykJCSgodG9zKSAmIElQVE9TX1RPU19NQVNLKQorCisjZGVmaW5lIFJUX0xPQ0FMQUREUihmbGFncykJKChmbGFncyAmIFJURl9BRERSQ0xBU1NNQVNLKSBcCisJCQkJID09IChSVEZfTE9DQUx8UlRGX0lOVEVSRkFDRSkpCisKKyNkZWZpbmUgUlRfQ0xBU1NfVU5TUEVDCQkwCisjZGVmaW5lIFJUX0NMQVNTX0RFRkFVTFQJMjUzCisKKyNkZWZpbmUgUlRfQ0xBU1NfTUFJTgkJMjU0CisjZGVmaW5lIFJUX0NMQVNTX0xPQ0FMCQkyNTUKKyNkZWZpbmUgUlRfQ0xBU1NfTUFYCQkyNTUKKworCisjZGVmaW5lIFJUTVNHX0FDSwkJTkxNU0dfQUNLCisjZGVmaW5lIFJUTVNHX09WRVJSVU4JCU5MTVNHX09WRVJSVU4KKworI2RlZmluZSBSVE1TR19ORVdERVZJQ0UJCTB4MTEKKyNkZWZpbmUgUlRNU0dfREVMREVWSUNFCQkweDEyCisjZGVmaW5lIFJUTVNHX05FV1JPVVRFCQkweDIxCisjZGVmaW5lIFJUTVNHX0RFTFJPVVRFCQkweDIyCisjZGVmaW5lIFJUTVNHX05FV1JVTEUJCTB4MzEKKyNkZWZpbmUgUlRNU0dfREVMUlVMRQkJMHgzMgorI2RlZmluZSBSVE1TR19DT05UUk9MCQkweDQwCisKKyNkZWZpbmUgUlRNU0dfQVJfRkFJTEVECQkweDUxCS8qIEFkZHJlc3MgUmVzb2x1dGlvbiBmYWlsZWQuICAqLworCisjZW5kaWYgLyogbmV0L3JvdXRlLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0YXNoL2FzaC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRhc2gvYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEyYzBhYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0YXNoL2FzaC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qIERlZmluaXRpb25zIGZvciB1c2Ugd2l0aCBMaW51eCBBRl9BU0ggc29ja2V0cy4KKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkVUQVNIX0FTSF9ICisjZGVmaW5lIF9ORVRBU0hfQVNIX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3NvY2thZGRyLmg+CisKK3N0cnVjdCBzb2NrYWRkcl9hc2gKKyAgeworICAgIF9fU09DS0FERFJfQ09NTU9OIChzYXNoXyk7CQkvKiBDb21tb24gZGF0YTogYWRkcmVzcyBmYW1pbHkgZXRjLiAgKi8KKyAgICBpbnQgc2FzaF9pZmluZGV4OwkJCS8qIEludGVyZmFjZSB0byB1c2UuICAqLworICAgIHVuc2lnbmVkIGNoYXIgc2FzaF9jaGFubmVsOwkJLyogUmVhbHRpbWUgb3IgY29udHJvbC4gICovCisgICAgdW5zaWduZWQgaW50IHNhc2hfcGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyIHNhc2hfcHJlZml4WzE2XTsKKyAgfTsKKworLyogVmFsdWVzIGZvciBgY2hhbm5lbCcgbWVtYmVyLiAgKi8KKyNkZWZpbmUgQVNIX0NIQU5ORUxfQU5ZCQkwCisjZGVmaW5lIEFTSF9DSEFOTkVMX0NPTlRST0wJMQorI2RlZmluZSBBU0hfQ0hBTk5FTF9SRUFMVElNRQkyCisKKyNlbmRpZgkvKiBuZXRhc2gvYXNoLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0YXRhbGsvYXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0YXRhbGsvYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjY4ZmM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRhdGFsay9hdC5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NSwgMTk5NiwgMTk5NywgMjAwNAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX05FVEFUQUxLX0FUX0gKKyNkZWZpbmUgX05FVEFUQUxLX0FUX0ggMQorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8Yml0cy9zb2NrYWRkci5oPgorI2luY2x1ZGUgPGxpbnV4L2F0YWxrLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjZGVmaW5lIFNPTF9BVEFMSyAgICAgICAyNTggICAgIC8qIHNvY2tvcHQgbGV2ZWwgZm9yIGF0YWxrICovCisKKyNlbmRpZgkvKiBuZXRhdGFsay9hdC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL25ldGF4MjUvYXgyNS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRheDI1L2F4MjUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTNjN2FiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRheDI1L2F4MjUuaApAQCAtMCwwICsxLDE3MSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9ORVRBWDI1X0FYMjVfSAorI2RlZmluZSBfTkVUQVgyNV9BWDI1X0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3NvY2thZGRyLmg+CisKKy8qIFNldHNvY2tvcHRpb25zKDIpIGxldmVsLiAgVGhhbmtzIHRvIEJTRCB0aGVzZSBtdXN0IG1hdGNoIElQUFJPVE9feHh4LiAgKi8KKyNkZWZpbmUgU09MX0FYMjUJMjU3CisKKy8qIEFYLjI1IGZsYWdzOiAqLworI2RlZmluZSBBWDI1X1dJTkRPVwkxCisjZGVmaW5lIEFYMjVfVDEJCTIKKyNkZWZpbmUgQVgyNV9UMgkJNQorI2RlZmluZSBBWDI1X1QzCQk0CisjZGVmaW5lIEFYMjVfTjIJCTMKKyNkZWZpbmUgQVgyNV9CQUNLT0ZGCTYKKyNkZWZpbmUgQVgyNV9FWFRTRVEJNworI2RlZmluZSBBWDI1X1BJRElOQ0wJOAorI2RlZmluZSBBWDI1X0lETEUJOQorI2RlZmluZQlBWDI1X1BBQ0xFTgkxMAorI2RlZmluZSBBWDI1X0lQTUFYUVVFVUUgMTEKKyNkZWZpbmUgQVgyNV9JQU1ESUdJCTEyCisjZGVmaW5lIEFYMjVfS0lMTAk5OQorCisvKiBBWC4yNSBzb2NrZXQgaW9jdGxzOiAqLworI2RlZmluZSBTSU9DQVgyNUdFVFVJRAkJKFNJT0NQUk9UT1BSSVZBVEUpCisjZGVmaW5lIFNJT0NBWDI1QUREVUlECQkoU0lPQ1BST1RPUFJJVkFURSsxKQorI2RlZmluZSBTSU9DQVgyNURFTFVJRAkJKFNJT0NQUk9UT1BSSVZBVEUrMikKKyNkZWZpbmUgU0lPQ0FYMjVOT1VJRAkJKFNJT0NQUk9UT1BSSVZBVEUrMykKKyNkZWZpbmUgU0lPQ0FYMjVCUFFBRERSCQkoU0lPQ1BST1RPUFJJVkFURSs0KQorI2RlZmluZSBTSU9DQVgyNUdFVFBBUk1TCShTSU9DUFJPVE9QUklWQVRFKzUpCisjZGVmaW5lIFNJT0NBWDI1U0VUUEFSTVMJKFNJT0NQUk9UT1BSSVZBVEUrNikKKyNkZWZpbmUgU0lPQ0FYMjVPUFRSVAkJKFNJT0NQUk9UT1BSSVZBVEUrNykKKyNkZWZpbmUgU0lPQ0FYMjVDVExDT04JCShTSU9DUFJPVE9QUklWQVRFKzgpCisjZGVmaW5lIFNJT0NBWDI1R0VUSU5GTwkJKFNJT0NQUk9UT1BSSVZBVEUrOSkKKyNkZWZpbmUgU0lPQ0FYMjVBRERGV0QJCShTSU9DUFJPVE9QUklWQVRFKzEwKQorI2RlZmluZSBTSU9DQVgyNURFTEZXRAkJKFNJT0NQUk9UT1BSSVZBVEUrMTEpCisKKy8qIHVua25vd246ICovCisjZGVmaW5lIEFYMjVfTk9VSURfREVGQVVMVAkwCisjZGVmaW5lIEFYMjVfTk9VSURfQkxPQ0sJMQorI2RlZmluZSBBWDI1X1NFVF9SVF9JUE1PREUJMgorCisvKiBEaWdpcGVhdGluZyBmbGFnczogKi8KKyNkZWZpbmUgQVgyNV9ESUdJX0lOQkFORAkweDAxCS8qIEFsbG93IGRpZ2lwZWF0aW5nIHdpdGhpbiBwb3J0ICovCisjZGVmaW5lIEFYMjVfRElHSV9YQkFORAkJMHgwMgkvKiBBbGxvdyBkaWdpcGVhdGluZyBhY3Jvc3MgcG9ydHMgKi8KKworLyogTWF4aW1pbSBudW1iZXIgb2YgZGlnaXBlYXRlcnM6ICovCisjZGVmaW5lIEFYMjVfTUFYX0RJR0lTIDgKKworCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgY2hhciBheDI1X2NhbGxbN107CQkvKiA2IGNhbGwgKyBTU0lEIChzaGlmdGVkIGFzY2lpKSAqLworICB9CitheDI1X2FkZHJlc3M7CisKK3N0cnVjdCBzb2NrYWRkcl9heDI1CisgIHsKKyAgICBzYV9mYW1pbHlfdCBzYXgyNV9mYW1pbHk7CisgICAgYXgyNV9hZGRyZXNzIHNheDI1X2NhbGw7CisgICAgaW50IHNheDI1X25kaWdpczsKKyAgfTsKKworLyoKKyAqIFRoZSBzb2NrYWRkciBzdHJ1Y3Qgd2l0aCB0aGUgZGlnaXBlYXRlciBhZHJlc3NlczoKKyAqLworc3RydWN0IGZ1bGxfc29ja2FkZHJfYXgyNQorICB7CisgICAgc3RydWN0IHNvY2thZGRyX2F4MjUgZnNhX2F4MjU7CisgICAgYXgyNV9hZGRyZXNzIGZzYV9kaWdpcGVhdGVyW0FYMjVfTUFYX0RJR0lTXTsKKyAgfTsKKyNkZWZpbmUgc2F4MjVfdWlkCXNheDI1X25kaWdpcworCitzdHJ1Y3QgYXgyNV9yb3V0ZXNfc3RydWN0CisgIHsKKyAgICBheDI1X2FkZHJlc3MgcG9ydF9hZGRyOworICAgIGF4MjVfYWRkcmVzcyBkZXN0X2FkZHI7CisgICAgdW5zaWduZWQgY2hhciBkaWdpX2NvdW50OworICAgIGF4MjVfYWRkcmVzcyBkaWdpX2FkZHJbQVgyNV9NQVhfRElHSVNdOworICB9OworCisvKiBUaGUgQVguMjUgaW9jdGwgc3RydWN0dXJlOiAqLworc3RydWN0IGF4MjVfY3RsX3N0cnVjdAorICB7CisgICAgYXgyNV9hZGRyZXNzIHBvcnRfYWRkcjsKKyAgICBheDI1X2FkZHJlc3Mgc291cmNlX2FkZHI7CisgICAgYXgyNV9hZGRyZXNzIGRlc3RfYWRkcjsKKyAgICB1bnNpZ25lZCBpbnQgY21kOworICAgIHVuc2lnbmVkIGxvbmcgYXJnOworICAgIHVuc2lnbmVkIGNoYXIgZGlnaV9jb3VudDsKKyAgICBheDI1X2FkZHJlc3MgZGlnaV9hZGRyW0FYMjVfTUFYX0RJR0lTXTsKKyAgfTsKKworc3RydWN0IGF4MjVfaW5mb19zdHJ1Y3QKKyAgeworICAgIHVuc2lnbmVkIGludCAgbjIsIG4yY291bnQ7CisgICAgdW5zaWduZWQgaW50IHQxLCB0MXRpbWVyOworICAgIHVuc2lnbmVkIGludCB0MiwgdDJ0aW1lcjsKKyAgICB1bnNpZ25lZCBpbnQgdDMsIHQzdGltZXI7CisgICAgdW5zaWduZWQgaW50IGlkbGUsIGlkbGV0aW1lcjsKKyAgICB1bnNpZ25lZCBpbnQgc3RhdGU7CisgICAgdW5zaWduZWQgaW50IHJjdl9xLCBzbmRfcTsKKyAgfTsKKworc3RydWN0IGF4MjVfZndkX3N0cnVjdAorICB7CisgICAgYXgyNV9hZGRyZXNzIHBvcnRfZnJvbTsKKyAgICBheDI1X2FkZHJlc3MgcG9ydF90bzsKKyAgfTsKKworLyogQVguMjUgcm91dGUgc3RydWN0dXJlOiAqLworc3RydWN0IGF4MjVfcm91dGVfb3B0X3N0cnVjdAorICB7CisgICAgYXgyNV9hZGRyZXNzIHBvcnRfYWRkcjsKKyAgICBheDI1X2FkZHJlc3MgZGVzdF9hZGRyOworICAgIGludCBjbWQ7CisgICAgaW50IGFyZzsKKyAgfTsKKworLyogQVguMjUgQlBRIHN0dWZmOiAqLworc3RydWN0IGF4MjVfYnBxYWRkcl9zdHJ1Y3QKKyAgeworICAgIGNoYXIgZGV2WzE2XTsKKyAgICBheDI1X2FkZHJlc3MgYWRkcjsKKyAgfTsKKworLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBBWC4yNSBgdmFsdWVzJyBmaWVsZHM6ICovCisjZGVmaW5lCUFYMjVfVkFMVUVTX0lQREVGTU9ERQkwCS8qICdEJz1ERyAnVic9VkMgKi8KKyNkZWZpbmUJQVgyNV9WQUxVRVNfQVhERUZNT0RFCTEJLyogOD1Ob3JtYWwgMTI4PUV4dGVuZGVkIFNlcSBOb3MgKi8KKyNkZWZpbmUJQVgyNV9WQUxVRVNfTkVUUk9NCTIJLyogQWxsb3cgTkVUL1JPTSAgLSAwPU5vIDE9WWVzICovCisjZGVmaW5lCUFYMjVfVkFMVUVTX1RFWFQJMwkvKiBBbGxvdyBQSUQ9VGV4dCAtIDA9Tm8gMT1ZZXMgKi8KKyNkZWZpbmUJQVgyNV9WQUxVRVNfQkFDS09GRgk0CS8qICdFJz1FeHBvbmVudGlhbCAnTCc9TGluZWFyICovCisjZGVmaW5lCUFYMjVfVkFMVUVTX0NPTk1PREUJNQkvKiBBbGxvdyBjb25uZWN0ZWQgbW9kZXMgLSAwPU5vIDE9WWVzICovCisjZGVmaW5lCUFYMjVfVkFMVUVTX1dJTkRPVwk2CS8qIERlZmF1bHQgd2luZG93IHNpemUgZm9yIHN0YW5kYXJkIEFYLjI1ICovCisjZGVmaW5lCUFYMjVfVkFMVUVTX0VXSU5ET1cJNwkvKiBEZWZhdWx0IHdpbmRvdyBzaXplIGZvciBleHRlbmRlZCBBWC4yNSAqLworI2RlZmluZQlBWDI1X1ZBTFVFU19UMQkJOAkvKiBEZWZhdWx0IFQxIHRpbWVvdXQgdmFsdWUgKi8KKyNkZWZpbmUJQVgyNV9WQUxVRVNfVDIJCTkJLyogRGVmYXVsdCBUMiB0aW1lb3V0IHZhbHVlICovCisjZGVmaW5lCUFYMjVfVkFMVUVTX1QzCQkxMAkvKiBEZWZhdWx0IFQzIHRpbWVvdXQgdmFsdWUgKi8KKyNkZWZpbmUJQVgyNV9WQUxVRVNfTjIJCTExCS8qIERlZmF1bHQgTjIgdmFsdWUgKi8KKyNkZWZpbmUJQVgyNV9WQUxVRVNfRElHSQkxMgkvKiBEaWdpcGVhdCBtb2RlICovCisjZGVmaW5lIEFYMjVfVkFMVUVTX0lETEUJMTMJLyogbW9kZSB2YyBpZGxlIHRpbWVyICovCisjZGVmaW5lIEFYMjVfVkFMVUVTX1BBQ0xFTgkxNAkvKiBBWC4yNSBNVFUgKi8KKyNkZWZpbmUgQVgyNV9WQUxVRVNfSVBNQVhRVUVVRSAgMTUJLyogTWF4aW11bSBudW1iZXIgb2YgYnVmZmVycyBlbnF1ZXVlZCAqLworI2RlZmluZQlBWDI1X01BWF9WQUxVRVMJCTIwCisKK3N0cnVjdCBheDI1X3Bhcm1zX3N0cnVjdAorICB7CisgICAgYXgyNV9hZGRyZXNzIHBvcnRfYWRkcjsKKyAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZXNbQVgyNV9NQVhfVkFMVUVTXTsKKyAgfTsKKworI2VuZGlmIC8qIG5ldGF4MjUvYXgyNS5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL25ldGRiLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGRiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI3NmEyNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0ZGIuaApAQCAtMCwwICsxLDcxNyBAQAorICAvKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwNCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogQWxsIGRhdGEgcmV0dXJuZWQgYnkgdGhlIG5ldHdvcmsgZGF0YSBiYXNlIGxpYnJhcnkgYXJlIHN1cHBsaWVkIGluCisgICBob3N0IG9yZGVyIGFuZCByZXR1cm5lZCBpbiBuZXR3b3JrIG9yZGVyIChzdWl0YWJsZSBmb3IgdXNlIGluCisgICBzeXN0ZW0gY2FsbHMpLiAgKi8KKworI2lmbmRlZglfTkVUREJfSAorI2RlZmluZQlfTkVUREJfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2lmZGVmIF9fVVNFX01JU0MKKy8qIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIG1ha2UgdGhpcyBpbmNsdWRlIGZpbGUgcHJvcGVybHkgcmVwbGFjZSB0aGUKKyAgIFN1biB2ZXJzaW9uLiAgKi8KKyMgaW5jbHVkZSA8cnBjL25ldGRiLmg+CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgX19uZWVkX3NpZ2V2ZW50X3QKKyMgaW5jbHVkZSA8Yml0cy9zaWdpbmZvLmg+CisjIGRlZmluZSBfX25lZWRfdGltZXNwZWMKKyMgaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL25ldGRiLmg+CisKKy8qIEFic29sdXRlIGZpbGUgbmFtZSBmb3IgbmV0d29yayBkYXRhIGJhc2UgZmlsZXMuICAqLworI2RlZmluZQlfUEFUSF9IRVFVSVYJCSIvZXRjL2hvc3RzLmVxdWl2IgorI2RlZmluZQlfUEFUSF9IT1NUUwkJIi9ldGMvaG9zdHMiCisjZGVmaW5lCV9QQVRIX05FVFdPUktTCQkiL2V0Yy9uZXR3b3JrcyIKKyNkZWZpbmUJX1BBVEhfTlNTV0lUQ0hfQ09ORgkiL2V0Yy9uc3N3aXRjaC5jb25mIgorI2RlZmluZQlfUEFUSF9QUk9UT0NPTFMJCSIvZXRjL3Byb3RvY29scyIKKyNkZWZpbmUJX1BBVEhfU0VSVklDRVMJCSIvZXRjL3NlcnZpY2VzIgorCisKK19fQkVHSU5fREVDTFMKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorLyogRXJyb3Igc3RhdHVzIGZvciBub24tcmVlbnRyYW50IGxvb2t1cCBmdW5jdGlvbnMuCisgICBXZSB1c2UgYSBtYWNybyB0byBhY2Nlc3MgYWx3YXlzIHRoZSB0aHJlYWQtc3BlY2lmaWMgYGhfZXJybm8nIHZhcmlhYmxlLiAgKi8KKyMgZGVmaW5lIGhfZXJybm8gKCpfX2hfZXJybm9fbG9jYXRpb24gKCkpCisKKy8qIEZ1bmN0aW9uIHRvIGdldCBhZGRyZXNzIG9mIGdsb2JhbCBgaF9lcnJubycgdmFyaWFibGUuICAqLworZXh0ZXJuIGludCAqX19oX2Vycm5vX2xvY2F0aW9uICh2b2lkKSBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworCisvKiBQb3NzaWJsZSB2YWx1ZXMgbGVmdCBpbiBgaF9lcnJubycuICAqLworIyBkZWZpbmUgSE9TVF9OT1RfRk9VTkQJMQkvKiBBdXRob3JpdGF0aXZlIEFuc3dlciBIb3N0IG5vdCBmb3VuZC4gICovCisjIGRlZmluZSBUUllfQUdBSU4JMgkvKiBOb24tQXV0aG9yaXRhdGl2ZSBIb3N0IG5vdCBmb3VuZCwKKwkJCQkgICBvciBTRVJWRVJGQUlMLiAgKi8KKyMgZGVmaW5lIE5PX1JFQ09WRVJZCTMJLyogTm9uIHJlY292ZXJhYmxlIGVycm9ycywgRk9STUVSUiwgUkVGVVNFRCwKKwkJCQkgICBOT1RJTVAuICAqLworIyBkZWZpbmUgTk9fREFUQQk0CS8qIFZhbGlkIG5hbWUsIG5vIGRhdGEgcmVjb3JkIG9mIHJlcXVlc3RlZAorCQkJCSAgIHR5cGUuICAqLworI2VuZGlmCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfR05VCisjIGRlZmluZSBORVREQl9JTlRFUk5BTAktMQkvKiBTZWUgZXJybm8uICAqLworIyBkZWZpbmUgTkVUREJfU1VDQ0VTUwkwCS8qIE5vIHByb2JsZW0uICAqLworIyBkZWZpbmUgTk9fQUREUkVTUwlOT19EQVRBCS8qIE5vIGFkZHJlc3MsIGxvb2sgZm9yIE1YIHJlY29yZC4gICovCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX1hPUEVOMksKKy8qIEhpZ2hlc3QgcmVzZXJ2ZWQgSW50ZXJuZXQgcG9ydCBudW1iZXIuICAqLworIyBkZWZpbmUgSVBQT1JUX1JFU0VSVkVECTEwMjQKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisvKiBTY29wZSBkZWxpbWl0ZXIgZm9yIGdldGFkZHJpbmZvKCksIGdldG5hbWVpbmZvKCkuICAqLworIyBkZWZpbmUgU0NPUEVfREVMSU1JVEVSCSclJworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBQcmludCBlcnJvciBpbmRpY2F0ZWQgYnkgYGhfZXJybm8nIHZhcmlhYmxlIG9uIHN0YW5kYXJkIGVycm9yLiAgU1RSCisgICBpZiBub24tbnVsbCBpcyBwcmludGVkIGJlZm9yZSB0aGUgZXJyb3Igc3RyaW5nLiAgKi8KK2V4dGVybiB2b2lkIGhlcnJvciAoX19jb25zdCBjaGFyICpfX3N0cikgX19USFJPVzsKKworLyogUmV0dXJuIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggZXJyb3IgRVJSX05VTS4gICovCitleHRlcm4gX19jb25zdCBjaGFyICpoc3RyZXJyb3IgKGludCBfX2Vycl9udW0pIF9fVEhST1c7CisjZW5kaWYKKworCisvKiBEZXNjcmlwdGlvbiBvZiBkYXRhIGJhc2UgZW50cnkgZm9yIGEgc2luZ2xlIGhvc3QuICAqLworc3RydWN0IGhvc3RlbnQKK3sKKyAgY2hhciAqaF9uYW1lOwkJCS8qIE9mZmljaWFsIG5hbWUgb2YgaG9zdC4gICovCisgIGNoYXIgKipoX2FsaWFzZXM7CQkvKiBBbGlhcyBsaXN0LiAgKi8KKyAgaW50IGhfYWRkcnR5cGU7CQkvKiBIb3N0IGFkZHJlc3MgdHlwZS4gICovCisgIGludCBoX2xlbmd0aDsJCQkvKiBMZW5ndGggb2YgYWRkcmVzcy4gICovCisgIGNoYXIgKipoX2FkZHJfbGlzdDsJCS8qIExpc3Qgb2YgYWRkcmVzc2VzIGZyb20gbmFtZSBzZXJ2ZXIuICAqLworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX0dOVQorIyBkZWZpbmUJaF9hZGRyCWhfYWRkcl9saXN0WzBdIC8qIEFkZHJlc3MsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiovCisjZW5kaWYKK307CisKKy8qIE9wZW4gaG9zdCBkYXRhIGJhc2UgZmlsZXMgYW5kIG1hcmsgdGhlbSBhcyBzdGF5aW5nIG9wZW4gZXZlbiBhZnRlcgorICAgYSBsYXRlciBzZWFyY2ggaWYgU1RBWV9PUEVOIGlzIG5vbi16ZXJvLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIHNldGhvc3RlbnQgKGludCBfX3N0YXlfb3Blbik7CisKKy8qIENsb3NlIGhvc3QgZGF0YSBiYXNlIGZpbGVzIGFuZCBjbGVhciBgc3RheSBvcGVuJyBmbGFnLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIGVuZGhvc3RlbnQgKHZvaWQpOworCisvKiBHZXQgbmV4dCBlbnRyeSBmcm9tIGhvc3QgZGF0YSBiYXNlIGZpbGUuICBPcGVuIGRhdGEgYmFzZSBpZgorICAgbmVjZXNzYXJ5LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgaG9zdGVudCAqZ2V0aG9zdGVudCAodm9pZCk7CisKKy8qIFJldHVybiBlbnRyeSBmcm9tIGhvc3QgZGF0YSBiYXNlIHdoaWNoIGFkZHJlc3MgbWF0Y2ggQUREUiB3aXRoCisgICBsZW5ndGggTEVOIGFuZCB0eXBlIFRZUEUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBob3N0ZW50ICpnZXRob3N0YnlhZGRyIChfX2NvbnN0IHZvaWQgKl9fYWRkciwgX19zb2NrbGVuX3QgX19sZW4sCisJCQkJICAgICAgaW50IF9fdHlwZSk7CisKKy8qIFJldHVybiBlbnRyeSBmcm9tIGhvc3QgZGF0YSBiYXNlIGZvciBob3N0IHdpdGggTkFNRS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IGhvc3RlbnQgKmdldGhvc3RieW5hbWUgKF9fY29uc3QgY2hhciAqX19uYW1lKTsKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIFJldHVybiBlbnRyeSBmcm9tIGhvc3QgZGF0YSBiYXNlIGZvciBob3N0IHdpdGggTkFNRS4gIEFGIG11c3QgYmUKKyAgIHNldCB0byB0aGUgYWRkcmVzcyB0eXBlIHdoaWNoIGlzIGBBRl9JTkVUJyBmb3IgSVB2NCBvciBgQUZfSU5FVDYnCisgICBmb3IgSVB2Ni4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBob3N0ZW50ICpnZXRob3N0YnluYW1lMiAoX19jb25zdCBjaGFyICpfX25hbWUsIGludCBfX2FmKTsKKworLyogUmVlbnRyYW50IHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUuICBUaGUgYWRkaXRpb25hbAorICAgYXJndW1lbnRzIHNwZWNpZnkgYSBidWZmZXIgb2YgQlVGTEVOIHN0YXJ0aW5nIGF0IEJVRi4gIFRoZSBsYXN0CisgICBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gYSB2YXJpYWJsZSB3aGljaCBnZXRzIHRoZSB2YWx1ZSB3aGljaAorICAgd291bGQgYmUgc3RvcmVkIGluIHRoZSBnbG9iYWwgdmFyaWFibGUgYGhlcnJubycgYnkgdGhlCisgICBub24tcmVlbnRyYW50IGZ1bmN0aW9ucy4KKworICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gdGhleSBhcmUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGdldGhvc3RlbnRfciAoc3RydWN0IGhvc3RlbnQgKl9fcmVzdHJpY3QgX19yZXN1bHRfYnVmLAorCQkJIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSBzdHJ1Y3QgaG9zdGVudCAqKl9fcmVzdHJpY3QgX19yZXN1bHQsCisJCQkgaW50ICpfX3Jlc3RyaWN0IF9faF9lcnJub3ApOworCitleHRlcm4gaW50IGdldGhvc3RieWFkZHJfciAoX19jb25zdCB2b2lkICpfX3Jlc3RyaWN0IF9fYWRkciwgX19zb2NrbGVuX3QgX19sZW4sCisJCQkgICAgaW50IF9fdHlwZSwKKwkJCSAgICBzdHJ1Y3QgaG9zdGVudCAqX19yZXN0cmljdCBfX3Jlc3VsdF9idWYsCisJCQkgICAgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLAorCQkJICAgIHN0cnVjdCBob3N0ZW50ICoqX19yZXN0cmljdCBfX3Jlc3VsdCwKKwkJCSAgICBpbnQgKl9fcmVzdHJpY3QgX19oX2Vycm5vcCk7CisKK2V4dGVybiBpbnQgZ2V0aG9zdGJ5bmFtZV9yIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLAorCQkJICAgIHN0cnVjdCBob3N0ZW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0X2J1ZiwKKwkJCSAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19idWZsZW4sCisJCQkgICAgc3RydWN0IGhvc3RlbnQgKipfX3Jlc3RyaWN0IF9fcmVzdWx0LAorCQkJICAgIGludCAqX19yZXN0cmljdCBfX2hfZXJybm9wKTsKKworZXh0ZXJuIGludCBnZXRob3N0YnluYW1lMl9yIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLCBpbnQgX19hZiwKKwkJCSAgICAgc3RydWN0IGhvc3RlbnQgKl9fcmVzdHJpY3QgX19yZXN1bHRfYnVmLAorCQkJICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19idWZsZW4sCisJCQkgICAgIHN0cnVjdCBob3N0ZW50ICoqX19yZXN0cmljdCBfX3Jlc3VsdCwKKwkJCSAgICAgaW50ICpfX3Jlc3RyaWN0IF9faF9lcnJub3ApOworI2VuZGlmCS8qIG1pc2MgKi8KKworCisvKiBPcGVuIG5ldHdvcmsgZGF0YSBiYXNlIGZpbGVzIGFuZCBtYXJrIHRoZW0gYXMgc3RheWluZyBvcGVuIGV2ZW4KKyAgIGFmdGVyIGEgbGF0ZXIgc2VhcmNoIGlmIFNUQVlfT1BFTiBpcyBub24temVyby4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBzZXRuZXRlbnQgKGludCBfX3N0YXlfb3Blbik7CisKKy8qIENsb3NlIG5ldHdvcmsgZGF0YSBiYXNlIGZpbGVzIGFuZCBjbGVhciBgc3RheSBvcGVuJyBmbGFnLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIGVuZG5ldGVudCAodm9pZCk7CisKKy8qIEdldCBuZXh0IGVudHJ5IGZyb20gbmV0d29yayBkYXRhIGJhc2UgZmlsZS4gIE9wZW4gZGF0YSBiYXNlIGlmCisgICBuZWNlc3NhcnkuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBuZXRlbnQgKmdldG5ldGVudCAodm9pZCk7CisKKy8qIFJldHVybiBlbnRyeSBmcm9tIG5ldHdvcmsgZGF0YSBiYXNlIHdoaWNoIGFkZHJlc3MgbWF0Y2ggTkVUIGFuZAorICAgdHlwZSBUWVBFLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgbmV0ZW50ICpnZXRuZXRieWFkZHIgKHVpbnQzMl90IF9fbmV0LCBpbnQgX190eXBlKTsKKworLyogUmV0dXJuIGVudHJ5IGZyb20gbmV0d29yayBkYXRhIGJhc2UgZm9yIG5ldHdvcmsgd2l0aCBOQU1FLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgbmV0ZW50ICpnZXRuZXRieW5hbWUgKF9fY29uc3QgY2hhciAqX19uYW1lKTsKKworI2lmZGVmCV9fVVNFX01JU0MKKy8qIFJlZW50cmFudCB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlLiAgVGhlIGFkZGl0aW9uYWwKKyAgIGFyZ3VtZW50cyBzcGVjaWZ5IGEgYnVmZmVyIG9mIEJVRkxFTiBzdGFydGluZyBhdCBCVUYuICBUaGUgbGFzdAorICAgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIGEgdmFyaWFibGUgd2hpY2ggZ2V0cyB0aGUgdmFsdWUgd2hpY2gKKyAgIHdvdWxkIGJlIHN0b3JlZCBpbiB0aGUgZ2xvYmFsIHZhcmlhYmxlIGBoZXJybm8nIGJ5IHRoZQorICAgbm9uLXJlZW50cmFudCBmdW5jdGlvbnMuCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIHRoZXkgYXJlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRuZXRlbnRfciAoc3RydWN0IG5ldGVudCAqX19yZXN0cmljdCBfX3Jlc3VsdF9idWYsCisJCQljaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19idWZsZW4sCisJCQlzdHJ1Y3QgbmV0ZW50ICoqX19yZXN0cmljdCBfX3Jlc3VsdCwKKwkJCWludCAqX19yZXN0cmljdCBfX2hfZXJybm9wKTsKKworZXh0ZXJuIGludCBnZXRuZXRieWFkZHJfciAodWludDMyX3QgX19uZXQsIGludCBfX3R5cGUsCisJCQkgICBzdHJ1Y3QgbmV0ZW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0X2J1ZiwKKwkJCSAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgIHN0cnVjdCBuZXRlbnQgKipfX3Jlc3RyaWN0IF9fcmVzdWx0LAorCQkJICAgaW50ICpfX3Jlc3RyaWN0IF9faF9lcnJub3ApOworCitleHRlcm4gaW50IGdldG5ldGJ5bmFtZV9yIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLAorCQkJICAgc3RydWN0IG5ldGVudCAqX19yZXN0cmljdCBfX3Jlc3VsdF9idWYsCisJCQkgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19idWZsZW4sCisJCQkgICBzdHJ1Y3QgbmV0ZW50ICoqX19yZXN0cmljdCBfX3Jlc3VsdCwKKwkJCSAgIGludCAqX19yZXN0cmljdCBfX2hfZXJybm9wKTsKKyNlbmRpZgkvKiBtaXNjICovCisKKworLyogRGVzY3JpcHRpb24gb2YgZGF0YSBiYXNlIGVudHJ5IGZvciBhIHNpbmdsZSBzZXJ2aWNlLiAgKi8KK3N0cnVjdCBzZXJ2ZW50Cit7CisgIGNoYXIgKnNfbmFtZTsJCQkvKiBPZmZpY2lhbCBzZXJ2aWNlIG5hbWUuICAqLworICBjaGFyICoqc19hbGlhc2VzOwkJLyogQWxpYXMgbGlzdC4gICovCisgIGludCBzX3BvcnQ7CQkJLyogUG9ydCBudW1iZXIuICAqLworICBjaGFyICpzX3Byb3RvOwkJLyogUHJvdG9jb2wgdG8gdXNlLiAgKi8KK307CisKKy8qIE9wZW4gc2VydmljZSBkYXRhIGJhc2UgZmlsZXMgYW5kIG1hcmsgdGhlbSBhcyBzdGF5aW5nIG9wZW4gZXZlbgorICAgYWZ0ZXIgYSBsYXRlciBzZWFyY2ggaWYgU1RBWV9PUEVOIGlzIG5vbi16ZXJvLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIHNldHNlcnZlbnQgKGludCBfX3N0YXlfb3Blbik7CisKKy8qIENsb3NlIHNlcnZpY2UgZGF0YSBiYXNlIGZpbGVzIGFuZCBjbGVhciBgc3RheSBvcGVuJyBmbGFnLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIGVuZHNlcnZlbnQgKHZvaWQpOworCisvKiBHZXQgbmV4dCBlbnRyeSBmcm9tIHNlcnZpY2UgZGF0YSBiYXNlIGZpbGUuICBPcGVuIGRhdGEgYmFzZSBpZgorICAgbmVjZXNzYXJ5LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3Qgc2VydmVudCAqZ2V0c2VydmVudCAodm9pZCk7CisKKy8qIFJldHVybiBlbnRyeSBmcm9tIG5ldHdvcmsgZGF0YSBiYXNlIGZvciBuZXR3b3JrIHdpdGggTkFNRSBhbmQKKyAgIHByb3RvY29sIFBST1RPLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3Qgc2VydmVudCAqZ2V0c2VydmJ5bmFtZSAoX19jb25zdCBjaGFyICpfX25hbWUsCisJCQkJICAgICAgX19jb25zdCBjaGFyICpfX3Byb3RvKTsKKworLyogUmV0dXJuIGVudHJ5IGZyb20gc2VydmljZSBkYXRhIGJhc2Ugd2hpY2ggbWF0Y2hlcyBwb3J0IFBPUlQgYW5kCisgICBwcm90b2NvbCBQUk9UTy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IHNlcnZlbnQgKmdldHNlcnZieXBvcnQgKGludCBfX3BvcnQsIF9fY29uc3QgY2hhciAqX19wcm90byk7CisKKworI2lmZGVmCV9fVVNFX01JU0MKKy8qIFJlZW50cmFudCB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlLiAgVGhlIGFkZGl0aW9uYWwKKyAgIGFyZ3VtZW50cyBzcGVjaWZ5IGEgYnVmZmVyIG9mIEJVRkxFTiBzdGFydGluZyBhdCBCVUYuCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIHRoZXkgYXJlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRzZXJ2ZW50X3IgKHN0cnVjdCBzZXJ2ZW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0X2J1ZiwKKwkJCSBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19idWZsZW4sCisJCQkgc3RydWN0IHNlcnZlbnQgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KTsKKworZXh0ZXJuIGludCBnZXRzZXJ2YnluYW1lX3IgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcHJvdG8sCisJCQkgICAgc3RydWN0IHNlcnZlbnQgKl9fcmVzdHJpY3QgX19yZXN1bHRfYnVmLAorCQkJICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICBzdHJ1Y3Qgc2VydmVudCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpOworCitleHRlcm4gaW50IGdldHNlcnZieXBvcnRfciAoaW50IF9fcG9ydCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcHJvdG8sCisJCQkgICAgc3RydWN0IHNlcnZlbnQgKl9fcmVzdHJpY3QgX19yZXN1bHRfYnVmLAorCQkJICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICBzdHJ1Y3Qgc2VydmVudCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpOworI2VuZGlmCS8qIG1pc2MgKi8KKworCisvKiBEZXNjcmlwdGlvbiBvZiBkYXRhIGJhc2UgZW50cnkgZm9yIGEgc2luZ2xlIHNlcnZpY2UuICAqLworc3RydWN0IHByb3RvZW50Cit7CisgIGNoYXIgKnBfbmFtZTsJCQkvKiBPZmZpY2lhbCBwcm90b2NvbCBuYW1lLiAgKi8KKyAgY2hhciAqKnBfYWxpYXNlczsJCS8qIEFsaWFzIGxpc3QuICAqLworICBpbnQgcF9wcm90bzsJCQkvKiBQcm90b2NvbCBudW1iZXIuICAqLworfTsKKworLyogT3BlbiBwcm90b2NvbCBkYXRhIGJhc2UgZmlsZXMgYW5kIG1hcmsgdGhlbSBhcyBzdGF5aW5nIG9wZW4gZXZlbgorICAgYWZ0ZXIgYSBsYXRlciBzZWFyY2ggaWYgU1RBWV9PUEVOIGlzIG5vbi16ZXJvLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIHNldHByb3RvZW50IChpbnQgX19zdGF5X29wZW4pOworCisvKiBDbG9zZSBwcm90b2NvbCBkYXRhIGJhc2UgZmlsZXMgYW5kIGNsZWFyIGBzdGF5IG9wZW4nIGZsYWcuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgZW5kcHJvdG9lbnQgKHZvaWQpOworCisvKiBHZXQgbmV4dCBlbnRyeSBmcm9tIHByb3RvY29sIGRhdGEgYmFzZSBmaWxlLiAgT3BlbiBkYXRhIGJhc2UgaWYKKyAgIG5lY2Vzc2FyeS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IHByb3RvZW50ICpnZXRwcm90b2VudCAodm9pZCk7CisKKy8qIFJldHVybiBlbnRyeSBmcm9tIHByb3RvY29sIGRhdGEgYmFzZSBmb3IgbmV0d29yayB3aXRoIE5BTUUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBwcm90b2VudCAqZ2V0cHJvdG9ieW5hbWUgKF9fY29uc3QgY2hhciAqX19uYW1lKTsKKworLyogUmV0dXJuIGVudHJ5IGZyb20gcHJvdG9jb2wgZGF0YSBiYXNlIHdoaWNoIG51bWJlciBpcyBQUk9UTy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IHByb3RvZW50ICpnZXRwcm90b2J5bnVtYmVyIChpbnQgX19wcm90byk7CisKKworI2lmZGVmCV9fVVNFX01JU0MKKy8qIFJlZW50cmFudCB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlLiAgVGhlIGFkZGl0aW9uYWwKKyAgIGFyZ3VtZW50cyBzcGVjaWZ5IGEgYnVmZmVyIG9mIEJVRkxFTiBzdGFydGluZyBhdCBCVUYuCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIHRoZXkgYXJlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRwcm90b2VudF9yIChzdHJ1Y3QgcHJvdG9lbnQgKl9fcmVzdHJpY3QgX19yZXN1bHRfYnVmLAorCQkJICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19idWZsZW4sCisJCQkgIHN0cnVjdCBwcm90b2VudCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpOworCitleHRlcm4gaW50IGdldHByb3RvYnluYW1lX3IgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCQkgICAgIHN0cnVjdCBwcm90b2VudCAqX19yZXN0cmljdCBfX3Jlc3VsdF9idWYsCisJCQkgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICAgc3RydWN0IHByb3RvZW50ICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisKK2V4dGVybiBpbnQgZ2V0cHJvdG9ieW51bWJlcl9yIChpbnQgX19wcm90bywKKwkJCSAgICAgICBzdHJ1Y3QgcHJvdG9lbnQgKl9fcmVzdHJpY3QgX19yZXN1bHRfYnVmLAorCQkJICAgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICAgICBzdHJ1Y3QgcHJvdG9lbnQgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KTsKKworCisvKiBFc3RhYmxpc2ggbmV0d29yayBncm91cCBORVRHUk9VUCBmb3IgZW51bWVyYXRpb24uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgc2V0bmV0Z3JlbnQgKF9fY29uc3QgY2hhciAqX19uZXRncm91cCk7CisKKy8qIEZyZWUgYWxsIHNwYWNlIGFsbG9jYXRlZCBieSBwcmV2aW91cyBgc2V0bmV0Z3JlbnQnIGNhbGwuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIGVuZG5ldGdyZW50ICh2b2lkKTsKKworLyogR2V0IG5leHQgbWVtYmVyIG9mIG5ldGdyb3VwIGVzdGFibGlzaGVkIGJ5IGxhc3QgYHNldG5ldGdyZW50JyBjYWxsCisgICBhbmQgcmV0dXJuIHBvaW50ZXJzIHRvIGVsZW1lbnRzIGluIEhPU1RQLCBVU0VSUCwgYW5kIERPTUFJTlAuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0bmV0Z3JlbnQgKGNoYXIgKipfX3Jlc3RyaWN0IF9faG9zdHAsCisJCQljaGFyICoqX19yZXN0cmljdCBfX3VzZXJwLAorCQkJY2hhciAqKl9fcmVzdHJpY3QgX19kb21haW5wKTsKKworCisvKiBUZXN0IHdoZXRoZXIgTkVUR1JPVVAgY29udGFpbnMgdGhlIHRyaXBsZSAoSE9TVCxVU0VSLERPTUFJTikuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgaW5uZXRnciAoX19jb25zdCBjaGFyICpfX25ldGdyb3VwLCBfX2NvbnN0IGNoYXIgKl9faG9zdCwKKwkJICAgIF9fY29uc3QgY2hhciAqX191c2VyLCBfX2NvbnN0IGNoYXIgKl9fZG9tYWluKTsKKworLyogUmVlbnRyYW50IHZlcnNpb24gb2YgYGdldG5ldGdyZW50JyB3aGVyZSByZXN1bHQgaXMgcGxhY2VkIGluIEJVRkZFUi4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRuZXRncmVudF9yIChjaGFyICoqX19yZXN0cmljdCBfX2hvc3RwLAorCQkJICBjaGFyICoqX19yZXN0cmljdCBfX3VzZXJwLAorCQkJICBjaGFyICoqX19yZXN0cmljdCBfX2RvbWFpbnAsCisJCQkgIGNoYXIgKl9fcmVzdHJpY3QgX19idWZmZXIsIHNpemVfdCBfX2J1Zmxlbik7CisjZW5kaWYJLyogbWlzYyAqLworCisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIENhbGwgYHJzaGQnIGF0IHBvcnQgUlBPUlQgb24gcmVtb3RlIG1hY2hpbmUgKkFIT1NUIHRvIGV4ZWN1dGUgQ01ELgorICAgVGhlIGxvY2FsIHVzZXIgaXMgTE9DVVNFUiwgb24gdGhlIHJlbW90ZSBtYWNoaW5lIHRoZSBjb21tYW5kIGlzCisgICBleGVjdXRlZCBhcyBSRU1VU0VSLiAgSW4gKkZEMlAgdGhlIGRlc2NyaXB0b3IgdG8gdGhlIHNvY2tldCBmb3IgdGhlCisgICBjb25uZWN0aW9uIGlzIHJldHVybmVkLiAgVGhlIGNhbGxlciBtdXN0IGhhdmUgdGhlIHJpZ2h0IHRvIHVzZSBhCisgICByZXNlcnZlZCBwb3J0LiAgV2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucyAqQUhPU1QgY29udGFpbnMgdGhlCisgICBvZmZpY2lhbCBob3N0IG5hbWUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcmNtZCAoY2hhciAqKl9fcmVzdHJpY3QgX19haG9zdCwgdW5zaWduZWQgc2hvcnQgaW50IF9fcnBvcnQsCisJCSBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19sb2N1c2VyLAorCQkgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcmVtdXNlciwKKwkJIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2NtZCwgaW50ICpfX3Jlc3RyaWN0IF9fZmQycCk7CisKKy8qIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgZnVuY3Rpb24gd2hlcmUgdGhlIHByb3RvY29sIGNhbiBiZSBzZWxlY3RlZAorICAgYW5kIHdoaWNoIHRoZXJlZm9yZSBjYW4gYmUgdXNlZCBmb3IgSVB2Ni4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCByY21kX2FmIChjaGFyICoqX19yZXN0cmljdCBfX2Fob3N0LCB1bnNpZ25lZCBzaG9ydCBpbnQgX19ycG9ydCwKKwkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2xvY3VzZXIsCisJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19yZW11c2VyLAorCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fY21kLCBpbnQgKl9fcmVzdHJpY3QgX19mZDJwLAorCQkgICAgc2FfZmFtaWx5X3QgX19hZik7CisKKy8qIENhbGwgYHJleGVjZCcgYXQgcG9ydCBSUE9SVCBvbiByZW1vdGUgbWFjaGluZSAqQUhPU1QgdG8gZXhlY3V0ZQorICAgQ01ELiAgVGhlIHByb2Nlc3MgcnVucyBhdCB0aGUgcmVtb3RlIG1hY2hpbmUgdXNpbmcgdGhlIElEIG9mIHVzZXIKKyAgIE5BTUUgd2hvc2UgY2xlYXJ0ZXh0IHBhc3N3b3JkIGlzIFBBU1NXRC4gIEluICpGRDJQIHRoZSBkZXNjcmlwdG9yCisgICB0byB0aGUgc29ja2V0IGZvciB0aGUgY29ubmVjdGlvbiBpcyByZXR1cm5lZC4gIFdoZW4gdGhlIGZ1bmN0aW9uCisgICByZXR1cm5zICpBSE9TVCBjb250YWlucyB0aGUgb2ZmaWNpYWwgaG9zdCBuYW1lLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHJleGVjIChjaGFyICoqX19yZXN0cmljdCBfX2Fob3N0LCBpbnQgX19ycG9ydCwKKwkJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLAorCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3Bhc3MsCisJCSAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fY21kLCBpbnQgKl9fcmVzdHJpY3QgX19mZDJwKTsKKworLyogVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBmdW5jdGlvbiB3aGVyZSB0aGUgcHJvdG9jb2wgY2FuIGJlIHNlbGVjdGVkCisgICBhbmQgd2hpY2ggdGhlcmVmb3JlIGNhbiBiZSB1c2VkIGZvciBJUHY2LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHJleGVjX2FmIChjaGFyICoqX19yZXN0cmljdCBfX2Fob3N0LCBpbnQgX19ycG9ydCwKKwkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLAorCQkgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3Bhc3MsCisJCSAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fY21kLCBpbnQgKl9fcmVzdHJpY3QgX19mZDJwLAorCQkgICAgIHNhX2ZhbWlseV90IF9fYWYpOworCisvKiBDaGVjayB3aGV0aGVyIHVzZXIgUkVNVVNFUiBvbiBzeXN0ZW0gUkhPU1QgaXMgYWxsb3dlZCB0byBsb2dpbiBhcyBMT0NVU0VSLgorICAgSWYgU1VTRVIgaXMgbm90IHplcm8gdGhlIHVzZXIgdHJpZXMgdG8gYmVjb21lIHN1cGVydXNlci4gIFJldHVybiAwIGlmCisgICBpdCBpcyBwb3NzaWJsZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBydXNlcm9rIChfX2NvbnN0IGNoYXIgKl9fcmhvc3QsIGludCBfX3N1c2VyLAorCQkgICAgX19jb25zdCBjaGFyICpfX3JlbXVzZXIsIF9fY29uc3QgY2hhciAqX19sb2N1c2VyKTsKKworLyogVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBmdW5jdGlvbiB3aGVyZSB0aGUgcHJvdG9jb2wgY2FuIGJlIHNlbGVjdGVkCisgICBhbmQgd2hpY2ggdGhlcmVmb3JlIGNhbiBiZSB1c2VkIGZvciBJUHY2LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHJ1c2Vyb2tfYWYgKF9fY29uc3QgY2hhciAqX19yaG9zdCwgaW50IF9fc3VzZXIsCisJCSAgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVtdXNlciwgX19jb25zdCBjaGFyICpfX2xvY3VzZXIsCisJCSAgICAgICBzYV9mYW1pbHlfdCBfX2FmKTsKKworLyogQ2hlY2sgd2hldGhlciB1c2VyIFJFTVVTRVIgb24gc3lzdGVtIGluZGljYXRlZCBieSBJUHY0IGFkZHJlc3MKKyAgIFJBRERSIGlzIGFsbG93ZWQgdG8gbG9naW4gYXMgTE9DVVNFUi4gIE5vbi1JUHY0IChlLmcuLCBJUHY2KSBhcmUKKyAgIG5vdCBzdXBwb3J0ZWQuICBJZiBTVVNFUiBpcyBub3QgemVybyB0aGUgdXNlciB0cmllcyB0byBiZWNvbWUKKyAgIHN1cGVydXNlci4gIFJldHVybiAwIGlmIGl0IGlzIHBvc3NpYmxlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGlydXNlcm9rICh1aW50MzJfdCBfX3JhZGRyLCBpbnQgX19zdXNlciwKKwkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVtdXNlciwgX19jb25zdCBjaGFyICpfX2xvY3VzZXIpOworCisvKiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IGZ1bmN0aW9uIHdoZXJlIHRoZSBwZmFtaWxpeSBpZiB0aGUgYWRkcmVzcworICAgcG9pbnRlZCB0byBieSBSQUREUiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSB2YWx1ZSBvZiBBRi4gIEl0IHRoZXJlZm9yZQorICAgY2FuIGJlIHVzZWQgZm9yIElQdjYKKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBpcnVzZXJva19hZiAoX19jb25zdCB2b2lkICpfX3JhZGRyLCBpbnQgX19zdXNlciwKKwkJCV9fY29uc3QgY2hhciAqX19yZW11c2VyLCBfX2NvbnN0IGNoYXIgKl9fbG9jdXNlciwKKwkJCXNhX2ZhbWlseV90IF9fYWYpOworCisvKiBUcnkgdG8gYWxsb2NhdGUgcmVzZXJ2ZWQgcG9ydCwgcmV0dXJuaW5nIGEgZGVzY3JpcHRvciBmb3IgYSBzb2NrZXQgb3BlbmVkCisgICBhdCB0aGlzIHBvcnQgb3IgLTEgaWYgdW5zdWNjZXNzZnVsLiAgVGhlIHNlYXJjaCBmb3IgYW4gYXZhaWxhYmxlIHBvcnQKKyAgIHdpbGwgc3RhcnQgYXQgQUxQT1JUIGFuZCBjb250aW51ZXMgd2l0aCBsb3dlciBudW1iZXJzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHJyZXN2cG9ydCAoaW50ICpfX2FscG9ydCk7CisKKy8qIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgZnVuY3Rpb24gd2hlcmUgdGhlIHByb3RvY29sIGNhbiBiZSBzZWxlY3RlZAorICAgYW5kIHdoaWNoIHRoZXJlZm9yZSBjYW4gYmUgdXNlZCBmb3IgSVB2Ni4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBycmVzdnBvcnRfYWYgKGludCAqX19hbHBvcnQsIHNhX2ZhbWlseV90IF9fYWYpOworI2VuZGlmCisKKworLyogRXh0ZW5zaW9uIGZyb20gUE9TSVguMWcuICAqLworI2lmZGVmCV9fVVNFX1BPU0lYCisvKiBTdHJ1Y3R1cmUgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBhZGRyZXNzIG9mIGEgc2VydmljZSBwcm92aWRlci4gICovCitzdHJ1Y3QgYWRkcmluZm8KK3sKKyAgaW50IGFpX2ZsYWdzOwkJCS8qIElucHV0IGZsYWdzLiAgKi8KKyAgaW50IGFpX2ZhbWlseTsJCS8qIFByb3RvY29sIGZhbWlseSBmb3Igc29ja2V0LiAgKi8KKyAgaW50IGFpX3NvY2t0eXBlOwkJLyogU29ja2V0IHR5cGUuICAqLworICBpbnQgYWlfcHJvdG9jb2w7CQkvKiBQcm90b2NvbCBmb3Igc29ja2V0LiAgKi8KKyAgc29ja2xlbl90IGFpX2FkZHJsZW47CQkvKiBMZW5ndGggb2Ygc29ja2V0IGFkZHJlc3MuICAqLworICBzdHJ1Y3Qgc29ja2FkZHIgKmFpX2FkZHI7CS8qIFNvY2tldCBhZGRyZXNzIGZvciBzb2NrZXQuICAqLworICBjaGFyICphaV9jYW5vbm5hbWU7CQkvKiBDYW5vbmljYWwgbmFtZSBmb3Igc2VydmljZSBsb2NhdGlvbi4gICovCisgIHN0cnVjdCBhZGRyaW5mbyAqYWlfbmV4dDsJLyogUG9pbnRlciB0byBuZXh0IGluIGxpc3QuICAqLworfTsKKworIyBpZmRlZiBfX1VTRV9HTlUKKy8qIFN0cnVjdHVyZSB1c2VkIGFzIGNvbnRyb2wgYmxvY2sgZm9yIGFzeW5jaHJvbm91cyBsb29rdXAuICAqLworc3RydWN0IGdhaWNiCit7CisgIGNvbnN0IGNoYXIgKmFyX25hbWU7CQkvKiBOYW1lIHRvIGxvb2sgdXAuICAqLworICBjb25zdCBjaGFyICphcl9zZXJ2aWNlOwkvKiBTZXJ2aWNlIG5hbWUuICAqLworICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKmFyX3JlcXVlc3Q7IC8qIEFkZGl0aW9uYWwgcmVxdWVzdCBzcGVjaWZpY2F0aW9uLiAgKi8KKyAgc3RydWN0IGFkZHJpbmZvICphcl9yZXN1bHQ7CS8qIFBvaW50ZXIgdG8gcmVzdWx0LiAgKi8KKyAgLyogVGhlIGZvbGxvd2luZyBhcmUgaW50ZXJuYWwgZWxlbWVudHMuICAqLworICBpbnQgX19yZXR1cm47CisgIGludCBfX3VudXNlZFs1XTsKK307CisKKy8qIExvb2t1cCBtb2RlLiAgKi8KKyMgIGRlZmluZSBHQUlfV0FJVAkwCisjICBkZWZpbmUgR0FJX05PV0FJVAkxCisjIGVuZGlmCisKKy8qIFBvc3NpYmxlIHZhbHVlcyBmb3IgYGFpX2ZsYWdzJyBmaWVsZCBpbiBgYWRkcmluZm8nIHN0cnVjdHVyZS4gICovCisjIGRlZmluZSBBSV9QQVNTSVZFCTB4MDAwMQkvKiBTb2NrZXQgYWRkcmVzcyBpcyBpbnRlbmRlZCBmb3IgYGJpbmQnLiAgKi8KKyMgZGVmaW5lIEFJX0NBTk9OTkFNRQkweDAwMDIJLyogUmVxdWVzdCBmb3IgY2Fub25pY2FsIG5hbWUuICAqLworIyBkZWZpbmUgQUlfTlVNRVJJQ0hPU1QJMHgwMDA0CS8qIERvbid0IHVzZSBuYW1lIHJlc29sdXRpb24uICAqLworIyBkZWZpbmUgQUlfVjRNQVBQRUQJMHgwMDA4CS8qIElQdjQgbWFwcGVkIGFkZHJlc3NlcyBhcmUgYWNjZXB0YWJsZS4gICovCisjIGRlZmluZSBBSV9BTEwJCTB4MDAxMAkvKiBSZXR1cm4gSVB2NCBtYXBwZWQgYW5kIElQdjYgYWRkcmVzc2VzLiAgKi8KKyMgZGVmaW5lIEFJX0FERFJDT05GSUcJMHgwMDIwCS8qIFVzZSBjb25maWd1cmF0aW9uIG9mIHRoaXMgaG9zdCB0byBjaG9vc2UKKwkJCQkgICByZXR1cm5lZCBhZGRyZXNzIHR5cGUuLiAgKi8KKyMgaWZkZWYgX19VU0VfR05VCisjICBkZWZpbmUgQUlfSUROCTB4MDA0MAkvKiBJRE4gZW5jb2RlIGlucHV0IChhc3N1bWluZyBpdCBpcyBlbmNvZGVkCisJCQkJICAgaW4gdGhlIGN1cnJlbnQgbG9jYWxlJ3MgY2hhcmFjdGVyIHNldCkKKwkJCQkgICBiZWZvcmUgbG9va2luZyBpdCB1cC4gKi8KKyMgIGRlZmluZSBBSV9DQU5PTklETgkweDAwODAJLyogVHJhbnNsYXRlIGNhbm9uaWNhbCBuYW1lIGZyb20gSUROIGZvcm1hdC4gKi8KKyMgIGRlZmluZSBBSV9JRE5fQUxMT1dfVU5BU1NJR05FRCAweDAxMDAgLyogRG9uJ3QgcmVqZWN0IHVuYXNzaWduZWQgVW5pY29kZQorCQkJCQkgICAgY29kZSBwb2ludHMuICAqLworIyAgZGVmaW5lIEFJX0lETl9VU0VfU1REM19BU0NJSV9SVUxFUyAweDAyMDAgLyogVmFsaWRhdGUgc3RyaW5ncyBhY2NvcmRpbmcgdG8KKwkJCQkJCVNURDMgcnVsZXMuICAqLworIyBlbmRpZgorIyBkZWZpbmUgQUlfTlVNRVJJQ1NFUlYJMHgwNDAwCS8qIERvbid0IHVzZSBuYW1lIHJlc29sdXRpb24uICAqLworCisvKiBFcnJvciB2YWx1ZXMgZm9yIGBnZXRhZGRyaW5mbycgZnVuY3Rpb24uICAqLworIyBkZWZpbmUgRUFJX0JBREZMQUdTCSAgLTEJLyogSW52YWxpZCB2YWx1ZSBmb3IgYGFpX2ZsYWdzJyBmaWVsZC4gICovCisjIGRlZmluZSBFQUlfTk9OQU1FCSAgLTIJLyogTkFNRSBvciBTRVJWSUNFIGlzIHVua25vd24uICAqLworIyBkZWZpbmUgRUFJX0FHQUlOCSAgLTMJLyogVGVtcG9yYXJ5IGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uLiAgKi8KKyMgZGVmaW5lIEVBSV9GQUlMCSAgLTQJLyogTm9uLXJlY292ZXJhYmxlIGZhaWx1cmUgaW4gbmFtZSByZXMuICAqLworIyBkZWZpbmUgRUFJX0ZBTUlMWQkgIC02CS8qIGBhaV9mYW1pbHknIG5vdCBzdXBwb3J0ZWQuICAqLworIyBkZWZpbmUgRUFJX1NPQ0tUWVBFCSAgLTcJLyogYGFpX3NvY2t0eXBlJyBub3Qgc3VwcG9ydGVkLiAgKi8KKyMgZGVmaW5lIEVBSV9TRVJWSUNFCSAgLTgJLyogU0VSVklDRSBub3Qgc3VwcG9ydGVkIGZvciBgYWlfc29ja3R5cGUnLiAgKi8KKyMgZGVmaW5lIEVBSV9NRU1PUlkJICAtMTAJLyogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4gICovCisjIGRlZmluZSBFQUlfU1lTVEVNCSAgLTExCS8qIFN5c3RlbSBlcnJvciByZXR1cm5lZCBpbiBgZXJybm8nLiAgKi8KKyMgZGVmaW5lIEVBSV9PVkVSRkxPVwkgIC0xMgkvKiBBcmd1bWVudCBidWZmZXIgb3ZlcmZsb3cuICAqLworIyBpZmRlZiBfX1VTRV9HTlUKKyMgIGRlZmluZSBFQUlfTk9EQVRBCSAgLTUJLyogTm8gYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggTkFNRS4gICovCisjICBkZWZpbmUgRUFJX0FERFJGQU1JTFkgIC05CS8qIEFkZHJlc3MgZmFtaWx5IGZvciBOQU1FIG5vdCBzdXBwb3J0ZWQuICAqLworIyAgZGVmaW5lIEVBSV9JTlBST0dSRVNTICAtMTAwCS8qIFByb2Nlc3NpbmcgcmVxdWVzdCBpbiBwcm9ncmVzcy4gICovCisjICBkZWZpbmUgRUFJX0NBTkNFTEVECSAgLTEwMQkvKiBSZXF1ZXN0IGNhbmNlbGVkLiAgKi8KKyMgIGRlZmluZSBFQUlfTk9UQ0FOQ0VMRUQgLTEwMgkvKiBSZXF1ZXN0IG5vdCBjYW5jZWxlZC4gICovCisjICBkZWZpbmUgRUFJX0FMTERPTkUJICAtMTAzCS8qIEFsbCByZXF1ZXN0cyBkb25lLiAgKi8KKyMgIGRlZmluZSBFQUlfSU5UUgkgIC0xMDQJLyogSW50ZXJydXB0ZWQgYnkgYSBzaWduYWwuICAqLworIyAgZGVmaW5lIEVBSV9JRE5fRU5DT0RFICAtMTA1CS8qIElETiBlbmNvZGluZyBmYWlsZWQuICAqLworIyBlbmRpZgorCisjIGlmZGVmIF9fVVNFX01JU0MKKyMgIGRlZmluZSBOSV9NQVhIT1NUICAgICAgMTAyNQorIyAgZGVmaW5lIE5JX01BWFNFUlYgICAgICAzMgorIyBlbmRpZgorCisjIGRlZmluZSBOSV9OVU1FUklDSE9TVAkxCS8qIERvbid0IHRyeSB0byBsb29rIHVwIGhvc3RuYW1lLiAgKi8KKyMgZGVmaW5lIE5JX05VTUVSSUNTRVJWIDIJLyogRG9uJ3QgY29udmVydCBwb3J0IG51bWJlciB0byBuYW1lLiAgKi8KKyMgZGVmaW5lIE5JX05PRlFETgk0CS8qIE9ubHkgcmV0dXJuIG5vZGVuYW1lIHBvcnRpb24uICAqLworIyBkZWZpbmUgTklfTkFNRVJFUUQJOAkvKiBEb24ndCByZXR1cm4gbnVtZXJpYyBhZGRyZXNzZXMuICAqLworIyBkZWZpbmUgTklfREdSQU0JMTYJLyogTG9vayB1cCBVRFAgc2VydmljZSByYXRoZXIgdGhhbiBUQ1AuICAqLworIyBpZmRlZiBfX1VTRV9HTlUKKyMgIGRlZmluZSBOSV9JRE4JMzIJLyogQ29udmVydCBuYW1lIGZyb20gSUROIGZvcm1hdC4gICovCisjICBkZWZpbmUgTklfSUROX0FMTE9XX1VOQVNTSUdORUQgNjQgLyogRG9uJ3QgcmVqZWN0IHVuYXNzaWduZWQgVW5pY29kZQorCQkJCQljb2RlIHBvaW50cy4gICovCisjICBkZWZpbmUgTklfSUROX1VTRV9TVEQzX0FTQ0lJX1JVTEVTIDEyOCAvKiBWYWxpZGF0ZSBzdHJpbmdzIGFjY29yZGluZyB0bworCQkJCQkgICAgIFNURDMgcnVsZXMuICAqLworIyBlbmRpZgorCisvKiBUcmFuc2xhdGUgbmFtZSBvZiBhIHNlcnZpY2UgbG9jYXRpb24gYW5kL29yIGEgc2VydmljZSBuYW1lIHRvIHNldCBvZgorICAgc29ja2V0IGFkZHJlc3Nlcy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGdldGFkZHJpbmZvIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLAorCQkJX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc2VydmljZSwKKwkJCV9fY29uc3Qgc3RydWN0IGFkZHJpbmZvICpfX3Jlc3RyaWN0IF9fcmVxLAorCQkJc3RydWN0IGFkZHJpbmZvICoqX19yZXN0cmljdCBfX3BhaSk7CisKKy8qIEZyZWUgYGFkZHJpbmZvJyBzdHJ1Y3R1cmUgQUkgaW5jbHVkaW5nIGFzc29jaWF0ZWQgc3RvcmFnZS4gICovCitleHRlcm4gdm9pZCBmcmVlYWRkcmluZm8gKHN0cnVjdCBhZGRyaW5mbyAqX19haSkgX19USFJPVzsKKworLyogQ29udmVydCBlcnJvciByZXR1cm4gZnJvbSBnZXRhZGRyaW5mbygpIHRvIGEgc3RyaW5nLiAgKi8KK2V4dGVybiBfX2NvbnN0IGNoYXIgKmdhaV9zdHJlcnJvciAoaW50IF9fZWNvZGUpIF9fVEhST1c7CisKKy8qIFRyYW5zbGF0ZSBhIHNvY2tldCBhZGRyZXNzIHRvIGEgbG9jYXRpb24gYW5kIHNlcnZpY2UgbmFtZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGdldG5hbWVpbmZvIChfX2NvbnN0IHN0cnVjdCBzb2NrYWRkciAqX19yZXN0cmljdCBfX3NhLAorCQkJc29ja2xlbl90IF9fc2FsZW4sIGNoYXIgKl9fcmVzdHJpY3QgX19ob3N0LAorCQkJc29ja2xlbl90IF9faG9zdGxlbiwgY2hhciAqX19yZXN0cmljdCBfX3NlcnYsCisJCQlzb2NrbGVuX3QgX19zZXJ2bGVuLCBpbnQgX19mbGFncyk7CisjZW5kaWYJLyogUE9TSVggKi8KKworI2lmZGVmIF9fVVNFX0dOVQorLyogRW5xdWV1ZSBFTlQgcmVxdWVzdHMgZnJvbSB0aGUgTElTVC4gIElmIE1PREUgaXMgR0FJX1dBSVQgd2FpdCB1bnRpbCBhbGwKKyAgIHJlcXVlc3RzIGFyZSBoYW5kbGVkLiAgSWYgV0FJVCBpcyBHQUlfTk9XQUlUIHJldHVybiBpbW1lZGlhdGVseSBhZnRlcgorICAgcXVldWVpbmcgdGhlIHJlcXVlc3RzIGFuZCBzaWduYWwgY29tcGxldGlvbiBhY2NvcmRpbmcgdG8gU0lHLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGdldGFkZHJpbmZvX2EgKGludCBfX21vZGUsIHN0cnVjdCBnYWljYiAqX19saXN0W19fcmVzdHJpY3RfYXJyXSwKKwkJCSAgaW50IF9fZW50LCBzdHJ1Y3Qgc2lnZXZlbnQgKl9fcmVzdHJpY3QgX19zaWcpOworCisvKiBTdXNwZW5kIGV4ZWN1dGlvbiBvZiB0aGUgdGhyZWFkIHVudGlsIGF0IGxlYXN0IG9uZSBvZiB0aGUgRU5UIHJlcXVlc3RzCisgICBpbiBMSVNUIGlzIGhhbmRsZWQuICBJZiBUSU1FT1VUIGlzIG5vdCBhIG51bGwgcG9pbnRlciBpdCBzcGVjaWZpZXMgdGhlCisgICBsb25nZXN0IHRpbWUgdGhlIGZ1bmN0aW9uIGtlZXBzIHdhaXRpbmcgYmVmb3JlIHJldHVybmluZyB3aXRoIGFuIGVycm9yLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGdhaV9zdXNwZW5kIChfX2NvbnN0IHN0cnVjdCBnYWljYiAqX19jb25zdCBfX2xpc3RbXSwgaW50IF9fZW50LAorCQkJX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fdGltZW91dCk7CisKKy8qIEdldCB0aGUgZXJyb3Igc3RhdHVzIG9mIHRoZSByZXF1ZXN0IFJFUS4gICovCitleHRlcm4gaW50IGdhaV9lcnJvciAoc3RydWN0IGdhaWNiICpfX3JlcSkgX19USFJPVzsKKworLyogQ2FuY2VsIHRoZSByZXF1ZXN0cyBhc3NvY2lhdGVkIHdpdGggR0FJQ0JQLiAgKi8KK2V4dGVybiBpbnQgZ2FpX2NhbmNlbCAoc3RydWN0IGdhaWNiICpfX2dhaWNicCkgX19USFJPVzsKKyNlbmRpZgkvKiBHTlUgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIG5ldGRiLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0ZWNvbmV0L2VjLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGVjb25ldC9lYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMTYwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGVjb25ldC9lYy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIERlZmluaXRpb25zIGZvciB1c2Ugd2l0aCBMaW51eCBBRl9FQ09ORVQgc29ja2V0cy4KKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkVURUNPTkVUX0VDX0gKKyNkZWZpbmUgX05FVEVDT05FVF9FQ19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8Yml0cy9zb2NrYWRkci5oPgorCitzdHJ1Y3QgZWNfYWRkcgorICB7CisgICAgdW5zaWduZWQgY2hhciBzdGF0aW9uOwkJLyogU3RhdGlvbiBudW1iZXIuICAqLworICAgIHVuc2lnbmVkIGNoYXIgbmV0OwkJCS8qIE5ldHdvcmsgbnVtYmVyLiAgKi8KKyAgfTsKKworc3RydWN0IHNvY2thZGRyX2VjCisgIHsKKyAgICBfX1NPQ0tBRERSX0NPTU1PTiAoc2VjXyk7CisgICAgdW5zaWduZWQgY2hhciBwb3J0OwkJCS8qIFBvcnQgbnVtYmVyLiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGNiOwkJCS8qIENvbnRyb2wvZmxhZyBieXRlLiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHR5cGU7CQkJLyogVHlwZSBvZiBtZXNzYWdlLiAgKi8KKyAgICBzdHJ1Y3QgZWNfYWRkciBhZGRyOworICAgIHVuc2lnbmVkIGxvbmcgY29va2llOworICB9OworCisjZGVmaW5lIEVDVFlQRV9QQUNLRVRfUkVDRUlWRUQJCTAJLyogUGFja2V0IHJlY2VpdmVkICovCisjZGVmaW5lIEVDVFlQRV9UUkFOU01JVF9TVEFUVVMJCTB4MTAJLyogVHJhbnNtaXQgY29tcGxldGVkICovCisKKyNkZWZpbmUgRUNUWVBFX1RSQU5TTUlUX09LCQkxCisjZGVmaW5lIEVDVFlQRV9UUkFOU01JVF9OT1RfTElTVEVOSU5HCTIKKyNkZWZpbmUgRUNUWVBFX1RSQU5TTUlUX05FVF9FUlJPUgkzCisjZGVmaW5lIEVDVFlQRV9UUkFOU01JVF9OT19DTE9DSwk0CisjZGVmaW5lIEVDVFlQRV9UUkFOU01JVF9MSU5FX0pBTU1FRAk1CisjZGVmaW5lIEVDVFlQRV9UUkFOU01JVF9OT1RfUFJFU0VOVAk2CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2V0aGVyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvZXRoZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTc4MGUyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2V0aGVyLmgKQEAgLTAsMCArMSw1NCBAQAorLyogRnVuY3Rpb25zIGZvciBzdG9yaW5nIEV0aGVybmV0IGFkZHJlc3NlcyBpbiBBU0NJSSBhbmQgbWFwcGluZyB0byBob3N0bmFtZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX05FVElORVRfRVRIRVJfSAorI2RlZmluZSBfTkVUSU5FVF9FVEhFUl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIEdldCBkZWZpbml0aW9uIG9mIGBzdHJ1Y3QgZXRoZXJfYWRkcicuICAqLworI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBDb252ZXJ0IDQ4IGJpdCBFdGhlcm5ldCBBRERSZXNzIHRvIEFTQ0lJLiAgKi8KK2V4dGVybiBjaGFyICpldGhlcl9udG9hIChfX2NvbnN0IHN0cnVjdCBldGhlcl9hZGRyICpfX2FkZHIpIF9fVEhST1c7CitleHRlcm4gY2hhciAqZXRoZXJfbnRvYV9yIChfX2NvbnN0IHN0cnVjdCBldGhlcl9hZGRyICpfX2FkZHIsIGNoYXIgKl9fYnVmKQorICAgICBfX1RIUk9XOworCisvKiBDb252ZXJ0IEFTQ0lJIHN0cmluZyBTIHRvIDQ4IGJpdCBFdGhlcm5ldCBhZGRyZXNzLiAgKi8KK2V4dGVybiBzdHJ1Y3QgZXRoZXJfYWRkciAqZXRoZXJfYXRvbiAoX19jb25zdCBjaGFyICpfX2FzYykgX19USFJPVzsKK2V4dGVybiBzdHJ1Y3QgZXRoZXJfYWRkciAqZXRoZXJfYXRvbl9yIChfX2NvbnN0IGNoYXIgKl9fYXNjLAorCQkJCQlzdHJ1Y3QgZXRoZXJfYWRkciAqX19hZGRyKSBfX1RIUk9XOworCisvKiBNYXAgNDggYml0IEV0aGVybmV0IG51bWJlciBBRERSIHRvIEhPU1ROQU1FLiAgKi8KK2V4dGVybiBpbnQgZXRoZXJfbnRvaG9zdCAoY2hhciAqX19ob3N0bmFtZSwgX19jb25zdCBzdHJ1Y3QgZXRoZXJfYWRkciAqX19hZGRyKQorICAgICBfX1RIUk9XOworCisvKiBNYXAgSE9TVE5BTUUgdG8gNDggYml0IEV0aGVybmV0IGFkZHJlc3MuICAqLworZXh0ZXJuIGludCBldGhlcl9ob3N0dG9uIChfX2NvbnN0IGNoYXIgKl9faG9zdG5hbWUsIHN0cnVjdCBldGhlcl9hZGRyICpfX2FkZHIpCisgICAgIF9fVEhST1c7CisKKy8qIFNjYW4gTElORSBhbmQgc2V0IEFERFIgYW5kIEhPU1ROQU1FLiAgKi8KK2V4dGVybiBpbnQgZXRoZXJfbGluZSAoX19jb25zdCBjaGFyICpfX2xpbmUsIHN0cnVjdCBldGhlcl9hZGRyICpfX2FkZHIsCisJCSAgICAgICBjaGFyICpfX2hvc3RuYW1lKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogbmV0aW5ldC9ldGhlci5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaWNtcDYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pY21wNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyODkzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaWNtcDYuaApAQCAtMCwwICsxLDM0NiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsMjAwMCwyMDA2LDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX05FVElORVRfSUNNUDZfSAorI2RlZmluZSBfTkVUSU5FVF9JQ01QNl9IIDEKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjZGVmaW5lIElDTVA2X0ZJTFRFUiAxCisKKyNkZWZpbmUgSUNNUDZfRklMVEVSX0JMT0NLCQkxCisjZGVmaW5lIElDTVA2X0ZJTFRFUl9QQVNTCQkyCisjZGVmaW5lIElDTVA2X0ZJTFRFUl9CTE9DS09USEVSUwkzCisjZGVmaW5lIElDTVA2X0ZJTFRFUl9QQVNTT05MWQkJNAorCitzdHJ1Y3QgaWNtcDZfZmlsdGVyCisgIHsKKyAgICB1aW50MzJfdCBpY21wNl9maWx0WzhdOworICB9OworCitzdHJ1Y3QgaWNtcDZfaGRyCisgIHsKKyAgICB1aW50OF90ICAgICBpY21wNl90eXBlOyAgIC8qIHR5cGUgZmllbGQgKi8KKyAgICB1aW50OF90ICAgICBpY21wNl9jb2RlOyAgIC8qIGNvZGUgZmllbGQgKi8KKyAgICB1aW50MTZfdCAgICBpY21wNl9ja3N1bTsgIC8qIGNoZWNrc3VtIGZpZWxkICovCisgICAgdW5pb24KKyAgICAgIHsKKwl1aW50MzJfdCAgaWNtcDZfdW5fZGF0YTMyWzFdOyAvKiB0eXBlLXNwZWNpZmljIGZpZWxkICovCisJdWludDE2X3QgIGljbXA2X3VuX2RhdGExNlsyXTsgLyogdHlwZS1zcGVjaWZpYyBmaWVsZCAqLworCXVpbnQ4X3QgICBpY21wNl91bl9kYXRhOFs0XTsgIC8qIHR5cGUtc3BlY2lmaWMgZmllbGQgKi8KKyAgICAgIH0gaWNtcDZfZGF0YXVuOworICB9OworCisjZGVmaW5lIGljbXA2X2RhdGEzMiAgICBpY21wNl9kYXRhdW4uaWNtcDZfdW5fZGF0YTMyCisjZGVmaW5lIGljbXA2X2RhdGExNiAgICBpY21wNl9kYXRhdW4uaWNtcDZfdW5fZGF0YTE2CisjZGVmaW5lIGljbXA2X2RhdGE4ICAgICBpY21wNl9kYXRhdW4uaWNtcDZfdW5fZGF0YTgKKyNkZWZpbmUgaWNtcDZfcHB0ciAgICAgIGljbXA2X2RhdGEzMlswXSAgLyogcGFyYW1ldGVyIHByb2IgKi8KKyNkZWZpbmUgaWNtcDZfbXR1ICAgICAgIGljbXA2X2RhdGEzMlswXSAgLyogcGFja2V0IHRvbyBiaWcgKi8KKyNkZWZpbmUgaWNtcDZfaWQgICAgICAgIGljbXA2X2RhdGExNlswXSAgLyogZWNobyByZXF1ZXN0L3JlcGx5ICovCisjZGVmaW5lIGljbXA2X3NlcSAgICAgICBpY21wNl9kYXRhMTZbMV0gIC8qIGVjaG8gcmVxdWVzdC9yZXBseSAqLworI2RlZmluZSBpY21wNl9tYXhkZWxheSAgaWNtcDZfZGF0YTE2WzBdICAvKiBtY2FzdCBncm91cCBtZW1iZXJzaGlwICovCisKKyNkZWZpbmUgSUNNUDZfRFNUX1VOUkVBQ0ggICAgICAgICAgICAgMQorI2RlZmluZSBJQ01QNl9QQUNLRVRfVE9PX0JJRyAgICAgICAgICAyCisjZGVmaW5lIElDTVA2X1RJTUVfRVhDRUVERUQgICAgICAgICAgIDMKKyNkZWZpbmUgSUNNUDZfUEFSQU1fUFJPQiAgICAgICAgICAgICAgNAorCisjZGVmaW5lIElDTVA2X0lORk9NU0dfTUFTSyAgMHg4MCAgICAvKiBhbGwgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyAqLworCisjZGVmaW5lIElDTVA2X0VDSE9fUkVRVUVTVCAgICAgICAgICAxMjgKKyNkZWZpbmUgSUNNUDZfRUNIT19SRVBMWSAgICAgICAgICAgIDEyOQorI2RlZmluZSBNTERfTElTVEVORVJfUVVFUlkgICAgICAgICAgMTMwCisjZGVmaW5lIE1MRF9MSVNURU5FUl9SRVBPUlQgICAgICAgICAxMzEKKyNkZWZpbmUgTUxEX0xJU1RFTkVSX1JFRFVDVElPTiAgICAgIDEzMgorCisjZGVmaW5lIElDTVA2X0RTVF9VTlJFQUNIX05PUk9VVEUgICAgIDAgLyogbm8gcm91dGUgdG8gZGVzdGluYXRpb24gKi8KKyNkZWZpbmUgSUNNUDZfRFNUX1VOUkVBQ0hfQURNSU4gICAgICAgMSAvKiBjb21tdW5pY2F0aW9uIHdpdGggZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQgKi8KKyNkZWZpbmUgSUNNUDZfRFNUX1VOUkVBQ0hfQkVZT05EU0NPUEUgMiAvKiBiZXlvbmQgc2NvcGUgb2Ygc291cmNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgSUNNUDZfRFNUX1VOUkVBQ0hfQUREUiAgICAgICAgMyAvKiBhZGRyZXNzIHVucmVhY2hhYmxlICovCisjZGVmaW5lIElDTVA2X0RTVF9VTlJFQUNIX05PUE9SVCAgICAgIDQgLyogYmFkIHBvcnQgKi8KKworI2RlZmluZSBJQ01QNl9USU1FX0VYQ0VFRF9UUkFOU0lUICAgICAwIC8qIEhvcCBMaW1pdCA9PSAwIGluIHRyYW5zaXQgKi8KKyNkZWZpbmUgSUNNUDZfVElNRV9FWENFRURfUkVBU1NFTUJMWSAgMSAvKiBSZWFzc2VtYmx5IHRpbWUgb3V0ICovCisKKyNkZWZpbmUgSUNNUDZfUEFSQU1QUk9CX0hFQURFUiAgICAgICAgMCAvKiBlcnJvbmVvdXMgaGVhZGVyIGZpZWxkICovCisjZGVmaW5lIElDTVA2X1BBUkFNUFJPQl9ORVhUSEVBREVSICAgIDEgLyogdW5yZWNvZ25pemVkIE5leHQgSGVhZGVyICovCisjZGVmaW5lIElDTVA2X1BBUkFNUFJPQl9PUFRJT04gICAgICAgIDIgLyogdW5yZWNvZ25pemVkIElQdjYgb3B0aW9uICovCisKKyNkZWZpbmUgSUNNUDZfRklMVEVSX1dJTExQQVNTKHR5cGUsIGZpbHRlcnApIFwKKwkoKCgoZmlsdGVycCktPmljbXA2X2ZpbHRbKHR5cGUpID4+IDVdKSAmICgxIDw8ICgodHlwZSkgJiAzMSkpKSA9PSAwKQorCisjZGVmaW5lIElDTVA2X0ZJTFRFUl9XSUxMQkxPQ0sodHlwZSwgZmlsdGVycCkgXAorCSgoKChmaWx0ZXJwKS0+aWNtcDZfZmlsdFsodHlwZSkgPj4gNV0pICYgKDEgPDwgKCh0eXBlKSAmIDMxKSkpICE9IDApCisKKyNkZWZpbmUgSUNNUDZfRklMVEVSX1NFVFBBU1ModHlwZSwgZmlsdGVycCkgXAorCSgoKChmaWx0ZXJwKS0+aWNtcDZfZmlsdFsodHlwZSkgPj4gNV0pICY9IH4oMSA8PCAoKHR5cGUpICYgMzEpKSkpCisKKyNkZWZpbmUgSUNNUDZfRklMVEVSX1NFVEJMT0NLKHR5cGUsIGZpbHRlcnApIFwKKwkoKCgoZmlsdGVycCktPmljbXA2X2ZpbHRbKHR5cGUpID4+IDVdKSB8PSAgKDEgPDwgKCh0eXBlKSAmIDMxKSkpKQorCisjZGVmaW5lIElDTVA2X0ZJTFRFUl9TRVRQQVNTQUxMKGZpbHRlcnApIFwKKwltZW1zZXQgKGZpbHRlcnAsIDAsIHNpemVvZiAoc3RydWN0IGljbXA2X2ZpbHRlcikpOworCisjZGVmaW5lIElDTVA2X0ZJTFRFUl9TRVRCTE9DS0FMTChmaWx0ZXJwKSBcCisJbWVtc2V0IChmaWx0ZXJwLCAweEZGLCBzaXplb2YgKHN0cnVjdCBpY21wNl9maWx0ZXIpKTsKKworI2RlZmluZSBORF9ST1VURVJfU09MSUNJVCAgICAgICAgICAgMTMzCisjZGVmaW5lIE5EX1JPVVRFUl9BRFZFUlQgICAgICAgICAgICAxMzQKKyNkZWZpbmUgTkRfTkVJR0hCT1JfU09MSUNJVCAgICAgICAgIDEzNQorI2RlZmluZSBORF9ORUlHSEJPUl9BRFZFUlQgICAgICAgICAgMTM2CisjZGVmaW5lIE5EX1JFRElSRUNUICAgICAgICAgICAgICAgICAxMzcKKworc3RydWN0IG5kX3JvdXRlcl9zb2xpY2l0ICAgICAgLyogcm91dGVyIHNvbGljaXRhdGlvbiAqLworICB7CisgICAgc3RydWN0IGljbXA2X2hkciAgbmRfcnNfaGRyOworICAgIC8qIGNvdWxkIGJlIGZvbGxvd2VkIGJ5IG9wdGlvbnMgKi8KKyAgfTsKKworI2RlZmluZSBuZF9yc190eXBlICAgICAgICAgICAgICAgbmRfcnNfaGRyLmljbXA2X3R5cGUKKyNkZWZpbmUgbmRfcnNfY29kZSAgICAgICAgICAgICAgIG5kX3JzX2hkci5pY21wNl9jb2RlCisjZGVmaW5lIG5kX3JzX2Nrc3VtICAgICAgICAgICAgICBuZF9yc19oZHIuaWNtcDZfY2tzdW0KKyNkZWZpbmUgbmRfcnNfcmVzZXJ2ZWQgICAgICAgICAgIG5kX3JzX2hkci5pY21wNl9kYXRhMzJbMF0KKworc3RydWN0IG5kX3JvdXRlcl9hZHZlcnQgICAgICAgLyogcm91dGVyIGFkdmVydGlzZW1lbnQgKi8KKyAgeworICAgIHN0cnVjdCBpY21wNl9oZHIgIG5kX3JhX2hkcjsKKyAgICB1aW50MzJfdCAgIG5kX3JhX3JlYWNoYWJsZTsgICAvKiByZWFjaGFibGUgdGltZSAqLworICAgIHVpbnQzMl90ICAgbmRfcmFfcmV0cmFuc21pdDsgIC8qIHJldHJhbnNtaXQgdGltZXIgKi8KKyAgICAvKiBjb3VsZCBiZSBmb2xsb3dlZCBieSBvcHRpb25zICovCisgIH07CisKKyNkZWZpbmUgbmRfcmFfdHlwZSAgICAgICAgICAgICAgIG5kX3JhX2hkci5pY21wNl90eXBlCisjZGVmaW5lIG5kX3JhX2NvZGUgICAgICAgICAgICAgICBuZF9yYV9oZHIuaWNtcDZfY29kZQorI2RlZmluZSBuZF9yYV9ja3N1bSAgICAgICAgICAgICAgbmRfcmFfaGRyLmljbXA2X2Nrc3VtCisjZGVmaW5lIG5kX3JhX2N1cmhvcGxpbWl0ICAgICAgICBuZF9yYV9oZHIuaWNtcDZfZGF0YThbMF0KKyNkZWZpbmUgbmRfcmFfZmxhZ3NfcmVzZXJ2ZWQgICAgIG5kX3JhX2hkci5pY21wNl9kYXRhOFsxXQorI2RlZmluZSBORF9SQV9GTEFHX01BTkFHRUQgICAgICAgMHg4MAorI2RlZmluZSBORF9SQV9GTEFHX09USEVSICAgICAgICAgMHg0MAorI2RlZmluZSBORF9SQV9GTEFHX0hPTUVfQUdFTlQgICAgMHgyMAorI2RlZmluZSBuZF9yYV9yb3V0ZXJfbGlmZXRpbWUgICAgbmRfcmFfaGRyLmljbXA2X2RhdGExNlsxXQorCitzdHJ1Y3QgbmRfbmVpZ2hib3Jfc29saWNpdCAgICAvKiBuZWlnaGJvciBzb2xpY2l0YXRpb24gKi8KKyAgeworICAgIHN0cnVjdCBpY21wNl9oZHIgIG5kX25zX2hkcjsKKyAgICBzdHJ1Y3QgaW42X2FkZHIgICBuZF9uc190YXJnZXQ7IC8qIHRhcmdldCBhZGRyZXNzICovCisgICAgLyogY291bGQgYmUgZm9sbG93ZWQgYnkgb3B0aW9ucyAqLworICB9OworCisjZGVmaW5lIG5kX25zX3R5cGUgICAgICAgICAgICAgICBuZF9uc19oZHIuaWNtcDZfdHlwZQorI2RlZmluZSBuZF9uc19jb2RlICAgICAgICAgICAgICAgbmRfbnNfaGRyLmljbXA2X2NvZGUKKyNkZWZpbmUgbmRfbnNfY2tzdW0gICAgICAgICAgICAgIG5kX25zX2hkci5pY21wNl9ja3N1bQorI2RlZmluZSBuZF9uc19yZXNlcnZlZCAgICAgICAgICAgbmRfbnNfaGRyLmljbXA2X2RhdGEzMlswXQorCitzdHJ1Y3QgbmRfbmVpZ2hib3JfYWR2ZXJ0ICAgICAvKiBuZWlnaGJvciBhZHZlcnRpc2VtZW50ICovCisgIHsKKyAgICBzdHJ1Y3QgaWNtcDZfaGRyICBuZF9uYV9oZHI7CisgICAgc3RydWN0IGluNl9hZGRyICAgbmRfbmFfdGFyZ2V0OyAvKiB0YXJnZXQgYWRkcmVzcyAqLworICAgIC8qIGNvdWxkIGJlIGZvbGxvd2VkIGJ5IG9wdGlvbnMgKi8KKyAgfTsKKworI2RlZmluZSBuZF9uYV90eXBlICAgICAgICAgICAgICAgbmRfbmFfaGRyLmljbXA2X3R5cGUKKyNkZWZpbmUgbmRfbmFfY29kZSAgICAgICAgICAgICAgIG5kX25hX2hkci5pY21wNl9jb2RlCisjZGVmaW5lIG5kX25hX2Nrc3VtICAgICAgICAgICAgICBuZF9uYV9oZHIuaWNtcDZfY2tzdW0KKyNkZWZpbmUgbmRfbmFfZmxhZ3NfcmVzZXJ2ZWQgICAgIG5kX25hX2hkci5pY21wNl9kYXRhMzJbMF0KKyNpZiAgICAgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCisjZGVmaW5lIE5EX05BX0ZMQUdfUk9VVEVSICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIE5EX05BX0ZMQUdfU09MSUNJVEVEICAgICAweDQwMDAwMDAwCisjZGVmaW5lIE5EX05BX0ZMQUdfT1ZFUlJJREUgICAgICAweDIwMDAwMDAwCisjZWxzZSAgIC8qIEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTiAqLworI2RlZmluZSBORF9OQV9GTEFHX1JPVVRFUiAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBORF9OQV9GTEFHX1NPTElDSVRFRCAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBORF9OQV9GTEFHX09WRVJSSURFICAgICAgMHgwMDAwMDAyMAorI2VuZGlmCisKK3N0cnVjdCBuZF9yZWRpcmVjdCAgICAgICAgICAgIC8qIHJlZGlyZWN0ICovCisgIHsKKyAgICBzdHJ1Y3QgaWNtcDZfaGRyICBuZF9yZF9oZHI7CisgICAgc3RydWN0IGluNl9hZGRyICAgbmRfcmRfdGFyZ2V0OyAvKiB0YXJnZXQgYWRkcmVzcyAqLworICAgIHN0cnVjdCBpbjZfYWRkciAgIG5kX3JkX2RzdDsgICAgLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworICAgIC8qIGNvdWxkIGJlIGZvbGxvd2VkIGJ5IG9wdGlvbnMgKi8KKyAgfTsKKworI2RlZmluZSBuZF9yZF90eXBlICAgICAgICAgICAgICAgbmRfcmRfaGRyLmljbXA2X3R5cGUKKyNkZWZpbmUgbmRfcmRfY29kZSAgICAgICAgICAgICAgIG5kX3JkX2hkci5pY21wNl9jb2RlCisjZGVmaW5lIG5kX3JkX2Nrc3VtICAgICAgICAgICAgICBuZF9yZF9oZHIuaWNtcDZfY2tzdW0KKyNkZWZpbmUgbmRfcmRfcmVzZXJ2ZWQgICAgICAgICAgIG5kX3JkX2hkci5pY21wNl9kYXRhMzJbMF0KKworc3RydWN0IG5kX29wdF9oZHIgICAgICAgICAgICAgLyogTmVpZ2hib3IgZGlzY292ZXJ5IG9wdGlvbiBoZWFkZXIgKi8KKyAgeworICAgIHVpbnQ4X3QgIG5kX29wdF90eXBlOworICAgIHVpbnQ4X3QgIG5kX29wdF9sZW47ICAgICAgICAvKiBpbiB1bml0cyBvZiA4IG9jdGV0cyAqLworICAgIC8qIGZvbGxvd2VkIGJ5IG9wdGlvbiBzcGVjaWZpYyBkYXRhICovCisgIH07CisKKyNkZWZpbmUgTkRfT1BUX1NPVVJDRV9MSU5LQUREUgkJMQorI2RlZmluZSBORF9PUFRfVEFSR0VUX0xJTktBRERSCQkyCisjZGVmaW5lIE5EX09QVF9QUkVGSVhfSU5GT1JNQVRJT04JMworI2RlZmluZSBORF9PUFRfUkVESVJFQ1RFRF9IRUFERVIJNAorI2RlZmluZSBORF9PUFRfTVRVCQkJNQorI2RlZmluZSBORF9PUFRfUlRSX0FEVl9JTlRFUlZBTAkJNworI2RlZmluZSBORF9PUFRfSE9NRV9BR0VOVF9JTkZPCQk4CisKK3N0cnVjdCBuZF9vcHRfcHJlZml4X2luZm8gICAgIC8qIHByZWZpeCBpbmZvcm1hdGlvbiAqLworICB7CisgICAgdWludDhfdCAgIG5kX29wdF9waV90eXBlOworICAgIHVpbnQ4X3QgICBuZF9vcHRfcGlfbGVuOworICAgIHVpbnQ4X3QgICBuZF9vcHRfcGlfcHJlZml4X2xlbjsKKyAgICB1aW50OF90ICAgbmRfb3B0X3BpX2ZsYWdzX3Jlc2VydmVkOworICAgIHVpbnQzMl90ICBuZF9vcHRfcGlfdmFsaWRfdGltZTsKKyAgICB1aW50MzJfdCAgbmRfb3B0X3BpX3ByZWZlcnJlZF90aW1lOworICAgIHVpbnQzMl90ICBuZF9vcHRfcGlfcmVzZXJ2ZWQyOworICAgIHN0cnVjdCBpbjZfYWRkciAgbmRfb3B0X3BpX3ByZWZpeDsKKyAgfTsKKworI2RlZmluZSBORF9PUFRfUElfRkxBR19PTkxJTksJMHg4MAorI2RlZmluZSBORF9PUFRfUElfRkxBR19BVVRPCTB4NDAKKyNkZWZpbmUgTkRfT1BUX1BJX0ZMQUdfUkFERFIJMHgyMAorCitzdHJ1Y3QgbmRfb3B0X3JkX2hkciAgICAgICAgICAvKiByZWRpcmVjdGVkIGhlYWRlciAqLworICB7CisgICAgdWludDhfdCAgIG5kX29wdF9yaF90eXBlOworICAgIHVpbnQ4X3QgICBuZF9vcHRfcmhfbGVuOworICAgIHVpbnQxNl90ICBuZF9vcHRfcmhfcmVzZXJ2ZWQxOworICAgIHVpbnQzMl90ICBuZF9vcHRfcmhfcmVzZXJ2ZWQyOworICAgIC8qIGZvbGxvd2VkIGJ5IElQIGhlYWRlciBhbmQgZGF0YSAqLworICB9OworCitzdHJ1Y3QgbmRfb3B0X210dSAgICAgICAgICAgICAvKiBNVFUgb3B0aW9uICovCisgIHsKKyAgICB1aW50OF90ICAgbmRfb3B0X210dV90eXBlOworICAgIHVpbnQ4X3QgICBuZF9vcHRfbXR1X2xlbjsKKyAgICB1aW50MTZfdCAgbmRfb3B0X210dV9yZXNlcnZlZDsKKyAgICB1aW50MzJfdCAgbmRfb3B0X210dV9tdHU7CisgIH07CisKK3N0cnVjdCBtbGRfaGRyCisgIHsKKyAgICBzdHJ1Y3QgaWNtcDZfaGRyICAgIG1sZF9pY21wNl9oZHI7CisgICAgc3RydWN0IGluNl9hZGRyICAgICBtbGRfYWRkcjsgLyogbXVsdGljYXN0IGFkZHJlc3MgKi8KKyAgfTsKKworI2RlZmluZSBtbGRfdHlwZSAgICAgICAgbWxkX2ljbXA2X2hkci5pY21wNl90eXBlCisjZGVmaW5lIG1sZF9jb2RlICAgICAgICBtbGRfaWNtcDZfaGRyLmljbXA2X2NvZGUKKyNkZWZpbmUgbWxkX2Nrc3VtICAgICAgIG1sZF9pY21wNl9oZHIuaWNtcDZfY2tzdW0KKyNkZWZpbmUgbWxkX21heGRlbGF5ICAgIG1sZF9pY21wNl9oZHIuaWNtcDZfZGF0YTE2WzBdCisjZGVmaW5lIG1sZF9yZXNlcnZlZCAgICBtbGRfaWNtcDZfaGRyLmljbXA2X2RhdGExNlsxXQorCisjZGVmaW5lIElDTVA2X1JPVVRFUl9SRU5VTUJFUklORyAgICAxMzgKKworc3RydWN0IGljbXA2X3JvdXRlcl9yZW51bSAgICAvKiByb3V0ZXIgcmVudW1iZXJpbmcgaGVhZGVyICovCisgIHsKKyAgICBzdHJ1Y3QgaWNtcDZfaGRyICAgIHJyX2hkcjsKKyAgICB1aW50OF90ICAgICAgICAgICAgIHJyX3NlZ251bTsKKyAgICB1aW50OF90ICAgICAgICAgICAgIHJyX2ZsYWdzOworICAgIHVpbnQxNl90ICAgICAgICAgICAgcnJfbWF4ZGVsYXk7CisgICAgdWludDMyX3QgICAgICAgICAgICBycl9yZXNlcnZlZDsKKyAgfTsKKworI2RlZmluZSBycl90eXBlCQlycl9oZHIuaWNtcDZfdHlwZQorI2RlZmluZSBycl9jb2RlICAgICAgICAgcnJfaGRyLmljbXA2X2NvZGUKKyNkZWZpbmUgcnJfY2tzdW0gICAgICAgIHJyX2hkci5pY21wNl9ja3N1bQorI2RlZmluZSBycl9zZXFudW0gICAgICAgcnJfaGRyLmljbXA2X2RhdGEzMlswXQorCisvKiBSb3V0ZXIgcmVudW1iZXJpbmcgZmxhZ3MgKi8KKyNkZWZpbmUgSUNNUDZfUlJfRkxBR1NfVEVTVCAgICAgICAgICAgICAweDgwCisjZGVmaW5lIElDTVA2X1JSX0ZMQUdTX1JFUVJFU1VMVCAgICAgICAgMHg0MAorI2RlZmluZSBJQ01QNl9SUl9GTEFHU19GT1JDRUFQUExZICAgICAgIDB4MjAKKyNkZWZpbmUgSUNNUDZfUlJfRkxBR1NfU1BFQ1NJVEUgICAgICAgICAweDEwCisjZGVmaW5lIElDTVA2X1JSX0ZMQUdTX1BSRVZET05FICAgICAgICAgMHgwOAorCitzdHJ1Y3QgcnJfcGNvX21hdGNoICAgIC8qIG1hdGNoIHByZWZpeCBwYXJ0ICovCisgIHsKKyAgICB1aW50OF90ICAgICAgICAgICAgIHJwbV9jb2RlOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcnBtX2xlbjsKKyAgICB1aW50OF90ICAgICAgICAgICAgIHJwbV9vcmRpbmFsOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcnBtX21hdGNobGVuOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcnBtX21pbmxlbjsKKyAgICB1aW50OF90ICAgICAgICAgICAgIHJwbV9tYXhsZW47CisgICAgdWludDE2X3QgICAgICAgICAgICBycG1fcmVzZXJ2ZWQ7CisgICAgc3RydWN0IGluNl9hZGRyICAgICBycG1fcHJlZml4OworICB9OworCisvKiBQQ08gY29kZSB2YWx1ZXMgKi8KKyNkZWZpbmUgUlBNX1BDT19BREQgICAgICAgICAgICAgMQorI2RlZmluZSBSUE1fUENPX0NIQU5HRSAgICAgICAgICAyCisjZGVmaW5lIFJQTV9QQ09fU0VUR0xPQkFMICAgICAgIDMKKworc3RydWN0IHJyX3Bjb191c2UgICAgICAvKiB1c2UgcHJlZml4IHBhcnQgKi8KKyAgeworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcnB1X3VzZWxlbjsKKyAgICB1aW50OF90ICAgICAgICAgICAgIHJwdV9rZWVwbGVuOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcnB1X3JhbWFzazsKKyAgICB1aW50OF90ICAgICAgICAgICAgIHJwdV9yYWZsYWdzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgcnB1X3ZsdGltZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIHJwdV9wbHRpbWU7CisgICAgdWludDMyX3QgICAgICAgICAgICBycHVfZmxhZ3M7CisgICAgc3RydWN0IGluNl9hZGRyICAgICBycHVfcHJlZml4OworICB9OworCisjZGVmaW5lIElDTVA2X1JSX1BDT1VTRV9SQUZMQUdTX09OTElOSyAgMHgyMAorI2RlZmluZSBJQ01QNl9SUl9QQ09VU0VfUkFGTEFHU19BVVRPICAgIDB4MTAKKworI2lmIEJZVEVfT1JERVIgPT0gQklHX0VORElBTgorIyBkZWZpbmUgSUNNUDZfUlJfUENPVVNFX0ZMQUdTX0RFQ1JWTFRJTUUgMHg4MDAwMDAwMAorIyBkZWZpbmUgSUNNUDZfUlJfUENPVVNFX0ZMQUdTX0RFQ1JQTFRJTUUgMHg0MDAwMDAwMAorI2VsaWYgQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOCisjIGRlZmluZSBJQ01QNl9SUl9QQ09VU0VfRkxBR1NfREVDUlZMVElNRSAweDgwCisjIGRlZmluZSBJQ01QNl9SUl9QQ09VU0VfRkxBR1NfREVDUlBMVElNRSAweDQwCisjZW5kaWYKKworc3RydWN0IHJyX3Jlc3VsdCAgICAgICAvKiByb3V0ZXIgcmVudW1iZXJpbmcgcmVzdWx0IG1lc3NhZ2UgKi8KKyAgeworICAgIHVpbnQxNl90ICAgICAgICAgICAgcnJyX2ZsYWdzOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcnJyX29yZGluYWw7CisgICAgdWludDhfdCAgICAgICAgICAgICBycnJfbWF0Y2hlZGxlbjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIHJycl9pZmlkOworICAgIHN0cnVjdCBpbjZfYWRkciAgICAgcnJyX3ByZWZpeDsKKyAgfTsKKworI2lmIEJZVEVfT1JERVIgPT0gQklHX0VORElBTgorIyBkZWZpbmUgSUNNUDZfUlJfUkVTVUxUX0ZMQUdTX09PQiAgICAgICAweDAwMDIKKyMgZGVmaW5lIElDTVA2X1JSX1JFU1VMVF9GTEFHU19GT1JCSURERU4gMHgwMDAxCisjZWxpZiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4KKyMgZGVmaW5lIElDTVA2X1JSX1JFU1VMVF9GTEFHU19PT0IgICAgICAgMHgwMjAwCisjIGRlZmluZSBJQ01QNl9SUl9SRVNVTFRfRkxBR1NfRk9SQklEREVOIDB4MDEwMAorI2VuZGlmCisKKy8qIE1vYmlsZSBJUHY2IGV4dGVuc2lvbjogQWR2ZXJ0aXNlbWVudCBJbnRlcnZhbC4gICovCitzdHJ1Y3QgbmRfb3B0X2Fkdl9pbnRlcnZhbAorICB7CisgICAgdWludDhfdCAgIG5kX29wdF9hZHZfaW50ZXJ2YWxfdHlwZTsKKyAgICB1aW50OF90ICAgbmRfb3B0X2Fkdl9pbnRlcnZhbF9sZW47CisgICAgdWludDE2X3QgIG5kX29wdF9hZHZfaW50ZXJ2YWxfcmVzZXJ2ZWQ7CisgICAgdWludDMyX3QgIG5kX29wdF9hZHZfaW50ZXJ2YWxfaXZhbDsKKyAgfTsKKworLyogTW9iaWxlIElQdjYgZXh0ZW5zaW9uOiBIb21lIEFnZW50IEluZm8uICAqLworc3RydWN0IG5kX29wdF9ob21lX2FnZW50X2luZm8KKyAgeworICAgIHVpbnQ4X3QgICBuZF9vcHRfaG9tZV9hZ2VudF9pbmZvX3R5cGU7CisgICAgdWludDhfdCAgIG5kX29wdF9ob21lX2FnZW50X2luZm9fbGVuOworICAgIHVpbnQxNl90ICBuZF9vcHRfaG9tZV9hZ2VudF9pbmZvX3Jlc2VydmVkOworICAgIHVpbnQxNl90ICBuZF9vcHRfaG9tZV9hZ2VudF9pbmZvX3ByZWZlcmVuY2U7CisgICAgdWludDE2X3QgIG5kX29wdF9ob21lX2FnZW50X2luZm9fbGlmZXRpbWU7CisgIH07CisKKyNlbmRpZiAvKiBuZXRpbmV0L2ljbXB2Ni5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaWZfZXRoZXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pZl9ldGhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZGI1OWIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaWZfZXRoZXIuaApAQCAtMCwwICsxLDEwNSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9fTkVUSU5FVF9JRl9FVEhFUl9ICisKKyNkZWZpbmUgX19ORVRJTkVUX0lGX0VUSEVSX0gJMQorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qIEdldCBkZWZpbml0aW9ucyBmcm9tIGtlcm5lbCBoZWFkZXIgZmlsZS4gICovCisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKworI2lmZGVmIF9fVVNFX0JTRAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylpZl9ldGhlci5oCTguMyAoQmVya2VsZXkpIDUvMi85NQorICoJJEZyZWVCU0QkCisgKi8KKworI2luY2x1ZGUgPG5ldC9ldGhlcm5ldC5oPgorI2luY2x1ZGUgPG5ldC9pZl9hcnAuaD4KKworX19CRUdJTl9ERUNMUworLyoKKyAqIEV0aGVybmV0IEFkZHJlc3MgUmVzb2x1dGlvbiBQcm90b2NvbC4KKyAqCisgKiBTZWUgUkZDIDgyNiBmb3IgcHJvdG9jb2wgZGVzY3JpcHRpb24uICBTdHJ1Y3R1cmUgYmVsb3cgaXMgYWRhcHRlZAorICogdG8gcmVzb2x2aW5nIGludGVybmV0IGFkZHJlc3Nlcy4gIEZpZWxkIG5hbWVzIHVzZWQgY29ycmVzcG9uZCB0bworICogUkZDIDgyNi4KKyAqLworc3RydWN0CWV0aGVyX2FycCB7CisJc3RydWN0CWFycGhkciBlYV9oZHI7CQkvKiBmaXhlZC1zaXplIGhlYWRlciAqLworCXVfaW50OF90IGFycF9zaGFbRVRIX0FMRU5dOwkvKiBzZW5kZXIgaGFyZHdhcmUgYWRkcmVzcyAqLworCXVfaW50OF90IGFycF9zcGFbNF07CQkvKiBzZW5kZXIgcHJvdG9jb2wgYWRkcmVzcyAqLworCXVfaW50OF90IGFycF90aGFbRVRIX0FMRU5dOwkvKiB0YXJnZXQgaGFyZHdhcmUgYWRkcmVzcyAqLworCXVfaW50OF90IGFycF90cGFbNF07CQkvKiB0YXJnZXQgcHJvdG9jb2wgYWRkcmVzcyAqLworfTsKKyNkZWZpbmUJYXJwX2hyZAllYV9oZHIuYXJfaHJkCisjZGVmaW5lCWFycF9wcm8JZWFfaGRyLmFyX3BybworI2RlZmluZQlhcnBfaGxuCWVhX2hkci5hcl9obG4KKyNkZWZpbmUJYXJwX3BsbgllYV9oZHIuYXJfcGxuCisjZGVmaW5lCWFycF9vcAllYV9oZHIuYXJfb3AKKworLyoKKyAqIE1hY3JvIHRvIG1hcCBhbiBJUCBtdWx0aWNhc3QgYWRkcmVzcyB0byBhbiBFdGhlcm5ldCBtdWx0aWNhc3QgYWRkcmVzcy4KKyAqIFRoZSBoaWdoLW9yZGVyIDI1IGJpdHMgb2YgdGhlIEV0aGVybmV0IGFkZHJlc3MgYXJlIHN0YXRpY2FsbHkgYXNzaWduZWQsCisgKiBhbmQgdGhlIGxvdy1vcmRlciAyMyBiaXRzIGFyZSB0YWtlbiBmcm9tIHRoZSBsb3cgZW5kIG9mIHRoZSBJUCBhZGRyZXNzLgorICovCisjZGVmaW5lIEVUSEVSX01BUF9JUF9NVUxUSUNBU1QoaXBhZGRyLCBlbmFkZHIpIFwKKwkvKiBzdHJ1Y3QgaW5fYWRkciAqaXBhZGRyOyAqLyBcCisJLyogdV9jaGFyIGVuYWRkcltFVEhfQUxFTl07CSAgICovIFwKK3sgXAorCShlbmFkZHIpWzBdID0gMHgwMTsgXAorCShlbmFkZHIpWzFdID0gMHgwMDsgXAorCShlbmFkZHIpWzJdID0gMHg1ZTsgXAorCShlbmFkZHIpWzNdID0gKCh1X2ludDhfdCAqKWlwYWRkcilbMV0gJiAweDdmOyBcCisJKGVuYWRkcilbNF0gPSAoKHVfaW50OF90ICopaXBhZGRyKVsyXTsgXAorCShlbmFkZHIpWzVdID0gKCh1X2ludDhfdCAqKWlwYWRkcilbM107IFwKK30KKworX19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX1VTRV9CU0QgKi8KKworI2VuZGlmIC8qIG5ldGluZXQvaWZfZXRoZXIuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lmX2ZkZGkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pZl9mZGRpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVkNWYwYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pZl9mZGRpLmgKQEAgLTAsMCArMSwzOCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9ORVRJTkVUX0lGX0ZERElfSAorI2RlZmluZQlfTkVUSU5FVF9JRl9GRERJX0ggMQorCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2ZkZGkuaD4KKworI2lmZGVmIF9fVVNFX0JTRAorCitzdHJ1Y3QgZmRkaV9oZWFkZXIgeworICB1X2ludDhfdCBmZGRpX2ZjOyAgICAgICAgICAgICAgICAgICAgLyogRnJhbWUgQ29udHJvbCAoRkMpIHZhbHVlICovCisgIHVfaW50OF90IGZkZGlfZGhvc3RbRkRESV9LX0FMRU5dOyAgICAvKiBEZXN0aW5hdGlvbiBob3N0ICovCisgIHVfaW50OF90IGZkZGlfc2hvc3RbRkRESV9LX0FMRU5dOyAgICAvKiBTb3VyY2UgaG9zdCAqLworfTsKKyNlbmRpZgorCisjZW5kaWYJLyogbmV0aW5ldC9pZl9mZGRpLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pZl90ci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lmX3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVjMzkxMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pZl90ci5oCkBAIC0wLDAgKzEsMTExIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX05FVElORVRfSUZfVFJfSAorI2RlZmluZQlfTkVUSU5FVF9JRl9UUl9IIDEKKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKiBJRUVFIDgwMi41IFRva2VuLVJpbmcgbWFnaWMgY29uc3RhbnRzLiAgVGhlIGZyYW1lIHNpemVzIG9taXQgdGhlIHByZWFtYmxlCisgICBhbmQgRkNTL0NSQyAoZnJhbWUgY2hlY2sgc2VxdWVuY2UpLiAqLworI2RlZmluZSBUUl9BTEVOCQk2CQkvKiBPY3RldHMgaW4gb25lIHRva2VuLXJpbmcgYWRkciAqLworI2RlZmluZSBUUl9ITEVOIAkoc2l6ZW9mIChzdHJ1Y3QgdHJoX2hkcikgKyBzaXplb2YgKHN0cnVjdCB0cmxsYykpCisjZGVmaW5lIEFDCQkweDEwCisjZGVmaW5lIExMQ19GUkFNRSAJMHg0MAorCisvKiBMTEMgYW5kIFNOQVAgY29uc3RhbnRzICovCisjZGVmaW5lIEVYVEVOREVEX1NBUCAJMHhBQQorI2RlZmluZSBVSV9DTUQgICAgICAgCTB4MDMKKworLyogVGhpcyBpcyBhbiBUb2tlbi1SaW5nIGZyYW1lIGhlYWRlci4gKi8KK3N0cnVjdCB0cmhfaGRyCit7CisgIHVfaW50OF90ICBhYzsJCQkvKiBhY2Nlc3MgY29udHJvbCBmaWVsZCAqLworICB1X2ludDhfdCAgZmM7CQkJLyogZnJhbWUgY29udHJvbCBmaWVsZCAqLworICB1X2ludDhfdCAgZGFkZHJbVFJfQUxFTl07CS8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKyAgdV9pbnQ4X3QgIHNhZGRyW1RSX0FMRU5dOwkvKiBzb3VyY2UgYWRkcmVzcyAqLworICB1X2ludDE2X3QgcmNmOwkJLyogcm91dGUgY29udHJvbCBmaWVsZCAqLworICB1X2ludDE2X3QgcnNlZ1s4XTsJCS8qIHJvdXRpbmcgcmVnaXN0ZXJzICovCit9OworCisvKiBUaGlzIGlzIGFuIFRva2VuLVJpbmcgTExDIHN0cnVjdHVyZSAqLworc3RydWN0IHRybGxjCit7CisgIHVfaW50OF90ICBkc2FwOwkJLyogZGVzdGluYXRpb24gU0FQICovCisgIHVfaW50OF90ICBzc2FwOwkJLyogc291cmNlIFNBUCAqLworICB1X2ludDhfdCAgbGxjOwkJLyogTExDIGNvbnRyb2wgZmllbGQgKi8KKyAgdV9pbnQ4X3QgIHByb3RpZFszXTsJCS8qIHByb3RvY29sIGlkICovCisgIHVfaW50MTZfdCBldGhlcnR5cGU7CQkvKiBldGhlciB0eXBlIGZpZWxkICovCit9OworCisvKiBUb2tlbi1SaW5nIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBkYXRhLiAqLworc3RydWN0IHRyX3N0YXRpc3RpY3MKK3sKKyAgdW5zaWduZWQgbG9uZyByeF9wYWNrZXRzOyAgICAgLyogdG90YWwgcGFja2V0cyByZWNlaXZlZAkqLworICB1bnNpZ25lZCBsb25nIHR4X3BhY2tldHM7CS8qIHRvdGFsIHBhY2tldHMgdHJhbnNtaXR0ZWQJKi8KKyAgdW5zaWduZWQgbG9uZyByeF9ieXRlczsJLyogdG90YWwgYnl0ZXMgcmVjZWl2ZWQgICAJKi8KKyAgdW5zaWduZWQgbG9uZyB0eF9ieXRlczsJLyogdG90YWwgYnl0ZXMgdHJhbnNtaXR0ZWQJKi8KKyAgdW5zaWduZWQgbG9uZyByeF9lcnJvcnM7CS8qIGJhZCBwYWNrZXRzIHJlY2VpdmVkCQkqLworICB1bnNpZ25lZCBsb25nIHR4X2Vycm9yczsJLyogcGFja2V0IHRyYW5zbWl0IHByb2JsZW1zCSovCisgIHVuc2lnbmVkIGxvbmcgcnhfZHJvcHBlZDsJLyogbm8gc3BhY2UgaW4gbGludXggYnVmZmVycwkqLworICB1bnNpZ25lZCBsb25nIHR4X2Ryb3BwZWQ7CS8qIG5vIHNwYWNlIGF2YWlsYWJsZSBpbiBsaW51eAkqLworICB1bnNpZ25lZCBsb25nIG11bHRpY2FzdDsJLyogbXVsdGljYXN0IHBhY2tldHMgcmVjZWl2ZWQJKi8KKyAgdW5zaWduZWQgbG9uZyB0cmFuc21pdF9jb2xsaXNpb247CisKKyAgLyogZGV0YWlsZWQgVG9rZW4tUmluZyBlcnJvcnMuIFNlZSBJQk0gVG9rZW4tUmluZyBOZXR3b3JrCisgICAgIEFyY2hpdGVjdHVyZSBmb3IgbW9yZSBpbmZvICovCisKKyAgdW5zaWduZWQgbG9uZyBsaW5lX2Vycm9yczsKKyAgdW5zaWduZWQgbG9uZyBpbnRlcm5hbF9lcnJvcnM7CisgIHVuc2lnbmVkIGxvbmcgYnVyc3RfZXJyb3JzOworICB1bnNpZ25lZCBsb25nIEFfQ19lcnJvcnM7CisgIHVuc2lnbmVkIGxvbmcgYWJvcnRfZGVsaW1pdGVyczsKKyAgdW5zaWduZWQgbG9uZyBsb3N0X2ZyYW1lczsKKyAgdW5zaWduZWQgbG9uZyByZWN2X2Nvbmdlc3RfY291bnQ7CisgIHVuc2lnbmVkIGxvbmcgZnJhbWVfY29waWVkX2Vycm9yczsKKyAgdW5zaWduZWQgbG9uZyBmcmVxdWVuY3lfZXJyb3JzOworICB1bnNpZ25lZCBsb25nIHRva2VuX2Vycm9yczsKKyAgdW5zaWduZWQgbG9uZyBkdW1teTE7Cit9OworCisvKiBzb3VyY2Ugcm91dGluZyBzdHVmZiAqLworI2RlZmluZSBUUl9SSUkgCQkJMHg4MAorI2RlZmluZSBUUl9SQ0ZfRElSX0JJVCAJCTB4ODAKKyNkZWZpbmUgVFJfUkNGX0xFTl9NQVNLIAkweDFmMDAKKyNkZWZpbmUgVFJfUkNGX0JST0FEQ0FTVCAJMHg4MDAwCS8qIGFsbC1yb3V0ZXMgYnJvYWRjYXN0ICovCisjZGVmaW5lIFRSX1JDRl9MSU1JVEVEX0JST0FEQ0FTVCAweEMwMDAJLyogc2luZ2xlLXJvdXRlIGJyb2FkY2FzdCAqLworI2RlZmluZSBUUl9SQ0ZfRlJBTUUySyAJCTB4MjAKKyNkZWZpbmUgVFJfUkNGX0JST0FEQ0FTVF9NQVNLIAkweEMwMDAKKyNkZWZpbmUgVFJfTUFYUklGTEVOIAkJMTgKKworI2lmZGVmIF9fVVNFX0JTRAorCitzdHJ1Y3QgdHJuX2hkcgoreworICB1X2ludDhfdCB0cm5fYWM7ICAgICAgICAgICAgICAgIC8qIGFjY2VzcyBjb250cm9sIGZpZWxkICovCisgIHVfaW50OF90IHRybl9mYzsgICAgICAgICAgICAgICAgLyogZmllbGQgY29udHJvbCBmaWVsZCAqLworICB1X2ludDhfdCB0cm5fZGhvc3RbVFJfQUxFTl07ICAgIC8qIGRlc3RpbmF0aW9uIGhvc3QgKi8KKyAgdV9pbnQ4X3QgdHJuX3Nob3N0W1RSX0FMRU5dOyAgICAvKiBzb3VyY2UgaG9zdCAqLworICB1X2ludDE2X3QgdHJuX3JjZjsgICAgICAgICAgICAgIC8qIHJvdXRlIGNvbnRyb2wgZmllbGQgKi8KKyAgdV9pbnQxNl90IHRybl9yc2VnWzhdOyAgICAgICAgICAvKiByb3V0aW5nIHJlZ2lzdGVycyAqLworfTsKKworI2VuZGlmCisKKyNlbmRpZgkvKiBuZXRpbmV0L2lmX3RyLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pZ21wLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaWdtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Mzk2YmEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaWdtcC5oCkBAIC0wLDAgKzEsMTI2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTksIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX05FVElORVRfSUdNUF9ICisjZGVmaW5lCV9ORVRJTkVUX0lHTVBfSCAxCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2lmZGVmIF9fVVNFX0JTRAorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODggU3RlcGhlbiBEZWVyaW5nLgorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBTdGVwaGVuIERlZXJpbmcgb2YgU3RhbmZvcmQgVW5pdmVyc2l0eS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWlnbXAuaAk4LjEgKEJlcmtlbGV5KSA2LzEwLzkzCisgKgkkRnJlZUJTRCQKKyAqLworCitzdHJ1Y3QgaWdtcCB7CisgIHVfaW50OF90IGlnbXBfdHlwZTsgICAgICAgICAgICAgLyogSUdNUCB0eXBlICovCisgIHVfaW50OF90IGlnbXBfY29kZTsgICAgICAgICAgICAgLyogcm91dGluZyBjb2RlICovCisgIHVfaW50MTZfdCBpZ21wX2Nrc3VtOyAgICAgICAgICAgLyogY2hlY2tzdW0gKi8KKyAgc3RydWN0IGluX2FkZHIgaWdtcF9ncm91cDsgICAgICAvKiBncm91cCBhZGRyZXNzICovCit9OworCisjZGVmaW5lIElHTVBfTUlOTEVOCQkJOAorCisvKgorICogTWVzc2FnZSB0eXBlcywgaW5jbHVkaW5nIHZlcnNpb24gbnVtYmVyLgorICovCisjZGVmaW5lIElHTVBfTUVNQkVSU0hJUF9RVUVSWSAgIAkweDExCS8qIG1lbWJlcnNoaXAgcXVlcnkgICAgICAgICAqLworI2RlZmluZSBJR01QX1YxX01FTUJFUlNISVBfUkVQT1JUCTB4MTIJLyogVmVyLiAxIG1lbWJlcnNoaXAgcmVwb3J0ICovCisjZGVmaW5lIElHTVBfVjJfTUVNQkVSU0hJUF9SRVBPUlQJMHgxNgkvKiBWZXIuIDIgbWVtYmVyc2hpcCByZXBvcnQgKi8KKyNkZWZpbmUgSUdNUF9WMl9MRUFWRV9HUk9VUAkJMHgxNwkvKiBMZWF2ZS1ncm91cCBtZXNzYWdlCSAgICAqLworCisjZGVmaW5lIElHTVBfRFZNUlAJCQkweDEzCS8qIERWTVJQIHJvdXRpbmcgbWVzc2FnZSAgICAqLworI2RlZmluZSBJR01QX1BJTQkJCTB4MTQJLyogUElNIHJvdXRpbmcgbWVzc2FnZSAgICAgICovCisjZGVmaW5lIElHTVBfVFJBQ0UJCQkweDE1CisKKyNkZWZpbmUgSUdNUF9NVFJBQ0VfUkVTUAkJMHgxZQkvKiB0cmFjZXJvdXRlIHJlc3AuKHRvIHNlbmRlcikqLworI2RlZmluZSBJR01QX01UUkFDRQkJCTB4MWYJLyogbWNhc3QgdHJhY2Vyb3V0ZSBtZXNzYWdlcyAgKi8KKworI2RlZmluZSBJR01QX01BWF9IT1NUX1JFUE9SVF9ERUxBWQkxMAkvKiBtYXggZGVsYXkgZm9yIHJlc3BvbnNlIHRvICAgICAqLworCQkJCQkJLyogIHF1ZXJ5IChpbiBzZWNvbmRzKSBhY2NvcmRpbmcgKi8KKwkJCQkJCS8qICB0byBSRkMxMTEyICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElHTVBfVElNRVJfU0NBTEUJCTEwCS8qIGRlbm90ZXMgdGhhdCB0aGUgaWdtcCBjb2RlIGZpZWxkICovCisJCQkJCQkvKiBzcGVjaWZpZXMgdGltZSBpbiAxMHRoIG9mIHNlY29uZHMqLworCisvKgorICogU3RhdGVzIGZvciB0aGUgSUdNUCB2MiBzdGF0ZSB0YWJsZS4KKyAqLworI2RlZmluZSBJR01QX0RFTEFZSU5HX01FTUJFUgkxCisjZGVmaW5lIElHTVBfSURMRV9NRU1CRVIJMgorI2RlZmluZSBJR01QX0xBWllfTUVNQkVSCTMKKyNkZWZpbmUgSUdNUF9TTEVFUElOR19NRU1CRVIJNAorI2RlZmluZSBJR01QX0FXQUtFTklOR19NRU1CRVIJNQorCisvKgorICogU3RhdGVzIGZvciBJR01QIHJvdXRlciB2ZXJzaW9uIGNhY2hlLgorICovCisjZGVmaW5lIElHTVBfdjFfUk9VVEVSCQkxCisjZGVmaW5lIElHTVBfdjJfUk9VVEVSCQkyCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGZvdXIgZGVmaW5pbml0aW9ucyBhcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICogVGhleSBzaG91bGQgYmUgcmVtb3ZlZCBhcyBzb29uIGFzIGFsbCBhcHBsaWNhdGlvbnMgYXJlIHVwZGF0ZWQgdG8KKyAqIHVzZSB0aGUgbmV3IGNvbnN0YW50IG5hbWVzLgorICovCisjZGVmaW5lIElHTVBfSE9TVF9NRU1CRVJTSElQX1FVRVJZCUlHTVBfTUVNQkVSU0hJUF9RVUVSWQorI2RlZmluZSBJR01QX0hPU1RfTUVNQkVSU0hJUF9SRVBPUlQJSUdNUF9WMV9NRU1CRVJTSElQX1JFUE9SVAorI2RlZmluZSBJR01QX0hPU1RfTkVXX01FTUJFUlNISVBfUkVQT1JUCUlHTVBfVjJfTUVNQkVSU0hJUF9SRVBPUlQKKyNkZWZpbmUgSUdNUF9IT1NUX0xFQVZFX01FU1NBR0UJCUlHTVBfVjJfTEVBVkVfR1JPVVAKKworX19FTkRfREVDTFMKKworI2VuZGlmCisKKyNlbmRpZgkvKiBuZXRpbmV0L2lnbXAuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2luLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzJjMTg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2luLmgKQEAgLTAsMCArMSw2MTkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0yMDAxLCAyMDAzLCAyMDA0LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDExCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfTkVUSU5FVF9JTl9ICisjZGVmaW5lCV9ORVRJTkVUX0lOX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogU3RhbmRhcmQgd2VsbC1kZWZpbmVkIElQIHByb3RvY29scy4gICovCitlbnVtCisgIHsKKyAgICBJUFBST1RPX0lQID0gMCwJICAgLyogRHVtbXkgcHJvdG9jb2wgZm9yIFRDUC4gICovCisjZGVmaW5lIElQUFJPVE9fSVAJCUlQUFJPVE9fSVAKKyAgICBJUFBST1RPX0hPUE9QVFMgPSAwLCAgIC8qIElQdjYgSG9wLWJ5LUhvcCBvcHRpb25zLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19IT1BPUFRTCQlJUFBST1RPX0hPUE9QVFMKKyAgICBJUFBST1RPX0lDTVAgPSAxLAkgICAvKiBJbnRlcm5ldCBDb250cm9sIE1lc3NhZ2UgUHJvdG9jb2wuICAqLworI2RlZmluZSBJUFBST1RPX0lDTVAJCUlQUFJPVE9fSUNNUAorICAgIElQUFJPVE9fSUdNUCA9IDIsCSAgIC8qIEludGVybmV0IEdyb3VwIE1hbmFnZW1lbnQgUHJvdG9jb2wuICovCisjZGVmaW5lIElQUFJPVE9fSUdNUAkJSVBQUk9UT19JR01QCisgICAgSVBQUk9UT19JUElQID0gNCwJICAgLyogSVBJUCB0dW5uZWxzIChvbGRlciBLQTlRIHR1bm5lbHMgdXNlIDk0KS4gICovCisjZGVmaW5lIElQUFJPVE9fSVBJUAkJSVBQUk9UT19JUElQCisgICAgSVBQUk9UT19UQ1AgPSA2LAkgICAvKiBUcmFuc21pc3Npb24gQ29udHJvbCBQcm90b2NvbC4gICovCisjZGVmaW5lIElQUFJPVE9fVENQCQlJUFBST1RPX1RDUAorICAgIElQUFJPVE9fRUdQID0gOCwJICAgLyogRXh0ZXJpb3IgR2F0ZXdheSBQcm90b2NvbC4gICovCisjZGVmaW5lIElQUFJPVE9fRUdQCQlJUFBST1RPX0VHUAorICAgIElQUFJPVE9fUFVQID0gMTIsCSAgIC8qIFBVUCBwcm90b2NvbC4gICovCisjZGVmaW5lIElQUFJPVE9fUFVQCQlJUFBST1RPX1BVUAorICAgIElQUFJPVE9fVURQID0gMTcsCSAgIC8qIFVzZXIgRGF0YWdyYW0gUHJvdG9jb2wuICAqLworI2RlZmluZSBJUFBST1RPX1VEUAkJSVBQUk9UT19VRFAKKyAgICBJUFBST1RPX0lEUCA9IDIyLAkgICAvKiBYTlMgSURQIHByb3RvY29sLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19JRFAJCUlQUFJPVE9fSURQCisgICAgSVBQUk9UT19UUCA9IDI5LAkgICAvKiBTTyBUcmFuc3BvcnQgUHJvdG9jb2wgQ2xhc3MgNC4gICovCisjZGVmaW5lIElQUFJPVE9fVFAJCUlQUFJPVE9fVFAKKyAgICBJUFBST1RPX0RDQ1AgPSAzMywJICAgLyogRGF0YWdyYW0gQ29uZ2VzdGlvbiBDb250cm9sIFByb3RvY29sLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19EQ0NQCQlJUFBST1RPX0RDQ1AKKyAgICBJUFBST1RPX0lQVjYgPSA0MSwgICAgIC8qIElQdjYgaGVhZGVyLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19JUFY2CQlJUFBST1RPX0lQVjYKKyAgICBJUFBST1RPX1JPVVRJTkcgPSA0MywgIC8qIElQdjYgcm91dGluZyBoZWFkZXIuICAqLworI2RlZmluZSBJUFBST1RPX1JPVVRJTkcJCUlQUFJPVE9fUk9VVElORworICAgIElQUFJPVE9fRlJBR01FTlQgPSA0NCwgLyogSVB2NiBmcmFnbWVudGF0aW9uIGhlYWRlci4gICovCisjZGVmaW5lIElQUFJPVE9fRlJBR01FTlQJSVBQUk9UT19GUkFHTUVOVAorICAgIElQUFJPVE9fUlNWUCA9IDQ2LAkgICAvKiBSZXNlcnZhdGlvbiBQcm90b2NvbC4gICovCisjZGVmaW5lIElQUFJPVE9fUlNWUAkJSVBQUk9UT19SU1ZQCisgICAgSVBQUk9UT19HUkUgPSA0NywJICAgLyogR2VuZXJhbCBSb3V0aW5nIEVuY2Fwc3VsYXRpb24uICAqLworI2RlZmluZSBJUFBST1RPX0dSRQkJSVBQUk9UT19HUkUKKyAgICBJUFBST1RPX0VTUCA9IDUwLCAgICAgIC8qIGVuY2Fwc3VsYXRpbmcgc2VjdXJpdHkgcGF5bG9hZC4gICovCisjZGVmaW5lIElQUFJPVE9fRVNQCQlJUFBST1RPX0VTUAorICAgIElQUFJPVE9fQUggPSA1MSwgICAgICAgLyogYXV0aGVudGljYXRpb24gaGVhZGVyLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19BSAkJSVBQUk9UT19BSAorICAgIElQUFJPVE9fSUNNUFY2ID0gNTgsICAgLyogSUNNUHY2LiAgKi8KKyNkZWZpbmUgSVBQUk9UT19JQ01QVjYJCUlQUFJPVE9fSUNNUFY2CisgICAgSVBQUk9UT19OT05FID0gNTksICAgICAvKiBJUHY2IG5vIG5leHQgaGVhZGVyLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19OT05FCQlJUFBST1RPX05PTkUKKyAgICBJUFBST1RPX0RTVE9QVFMgPSA2MCwgIC8qIElQdjYgZGVzdGluYXRpb24gb3B0aW9ucy4gICovCisjZGVmaW5lIElQUFJPVE9fRFNUT1BUUwkJSVBQUk9UT19EU1RPUFRTCisgICAgSVBQUk9UT19NVFAgPSA5MiwJICAgLyogTXVsdGljYXN0IFRyYW5zcG9ydCBQcm90b2NvbC4gICovCisjZGVmaW5lIElQUFJPVE9fTVRQCQlJUFBST1RPX01UUAorICAgIElQUFJPVE9fRU5DQVAgPSA5OCwJICAgLyogRW5jYXBzdWxhdGlvbiBIZWFkZXIuICAqLworI2RlZmluZSBJUFBST1RPX0VOQ0FQCQlJUFBST1RPX0VOQ0FQCisgICAgSVBQUk9UT19QSU0gPSAxMDMsCSAgIC8qIFByb3RvY29sIEluZGVwZW5kZW50IE11bHRpY2FzdC4gICovCisjZGVmaW5lIElQUFJPVE9fUElNCQlJUFBST1RPX1BJTQorICAgIElQUFJPVE9fQ09NUCA9IDEwOCwJICAgLyogQ29tcHJlc3Npb24gSGVhZGVyIFByb3RvY29sLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19DT01QCQlJUFBST1RPX0NPTVAKKyAgICBJUFBST1RPX1NDVFAgPSAxMzIsCSAgIC8qIFN0cmVhbSBDb250cm9sIFRyYW5zbWlzc2lvbiBQcm90b2NvbC4gICovCisjZGVmaW5lIElQUFJPVE9fU0NUUAkJSVBQUk9UT19TQ1RQCisgICAgSVBQUk9UT19VRFBMSVRFID0gMTM2LCAvKiBVRFAtTGl0ZSBwcm90b2NvbC4gICovCisjZGVmaW5lIElQUFJPVE9fVURQTElURQkJSVBQUk9UT19VRFBMSVRFCisgICAgSVBQUk9UT19SQVcgPSAyNTUsCSAgIC8qIFJhdyBJUCBwYWNrZXRzLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19SQVcJCUlQUFJPVE9fUkFXCisgICAgSVBQUk9UT19NQVgKKyAgfTsKKworCisvKiBUeXBlIHRvIHJlcHJlc2VudCBhIHBvcnQuICAqLwordHlwZWRlZiB1aW50MTZfdCBpbl9wb3J0X3Q7CisKKy8qIFN0YW5kYXJkIHdlbGwta25vd24gcG9ydHMuICAqLworZW51bQorICB7CisgICAgSVBQT1JUX0VDSE8gPSA3LAkJLyogRWNobyBzZXJ2aWNlLiAgKi8KKyAgICBJUFBPUlRfRElTQ0FSRCA9IDksCQkvKiBEaXNjYXJkIHRyYW5zbWlzc2lvbnMgc2VydmljZS4gICovCisgICAgSVBQT1JUX1NZU1RBVCA9IDExLAkJLyogU3lzdGVtIHN0YXR1cyBzZXJ2aWNlLiAgKi8KKyAgICBJUFBPUlRfREFZVElNRSA9IDEzLAkvKiBUaW1lIG9mIGRheSBzZXJ2aWNlLiAgKi8KKyAgICBJUFBPUlRfTkVUU1RBVCA9IDE1LAkvKiBOZXR3b3JrIHN0YXR1cyBzZXJ2aWNlLiAgKi8KKyAgICBJUFBPUlRfRlRQID0gMjEsCQkvKiBGaWxlIFRyYW5zZmVyIFByb3RvY29sLiAgKi8KKyAgICBJUFBPUlRfVEVMTkVUID0gMjMsCQkvKiBUZWxuZXQgcHJvdG9jb2wuICAqLworICAgIElQUE9SVF9TTVRQID0gMjUsCQkvKiBTaW1wbGUgTWFpbCBUcmFuc2ZlciBQcm90b2NvbC4gICovCisgICAgSVBQT1JUX1RJTUVTRVJWRVIgPSAzNywJLyogVGltZXNlcnZlciBzZXJ2aWNlLiAgKi8KKyAgICBJUFBPUlRfTkFNRVNFUlZFUiA9IDQyLAkvKiBEb21haW4gTmFtZSBTZXJ2aWNlLiAgKi8KKyAgICBJUFBPUlRfV0hPSVMgPSA0MywJCS8qIEludGVybmV0IFdob2lzIHNlcnZpY2UuICAqLworICAgIElQUE9SVF9NVFAgPSA1NywKKworICAgIElQUE9SVF9URlRQID0gNjksCQkvKiBUcml2aWFsIEZpbGUgVHJhbnNmZXIgUHJvdG9jb2wuICAqLworICAgIElQUE9SVF9SSkUgPSA3NywKKyAgICBJUFBPUlRfRklOR0VSID0gNzksCQkvKiBGaW5nZXIgc2VydmljZS4gICovCisgICAgSVBQT1JUX1RUWUxJTksgPSA4NywKKyAgICBJUFBPUlRfU1VQRFVQID0gOTUsCQkvKiBTVVBEVVAgcHJvdG9jb2wuICAqLworCisKKyAgICBJUFBPUlRfRVhFQ1NFUlZFUiA9IDUxMiwJLyogZXhlY2Qgc2VydmljZS4gICovCisgICAgSVBQT1JUX0xPR0lOU0VSVkVSID0gNTEzLAkvKiBybG9naW5kIHNlcnZpY2UuICAqLworICAgIElQUE9SVF9DTURTRVJWRVIgPSA1MTQsCisgICAgSVBQT1JUX0VGU1NFUlZFUiA9IDUyMCwKKworICAgIC8qIFVEUCBwb3J0cy4gICovCisgICAgSVBQT1JUX0JJRkZVRFAgPSA1MTIsCisgICAgSVBQT1JUX1dIT1NFUlZFUiA9IDUxMywKKyAgICBJUFBPUlRfUk9VVEVTRVJWRVIgPSA1MjAsCisKKyAgICAvKiBQb3J0cyBsZXNzIHRoYW4gdGhpcyB2YWx1ZSBhcmUgcmVzZXJ2ZWQgZm9yIHByaXZpbGVnZWQgcHJvY2Vzc2VzLiAgKi8KKyAgICBJUFBPUlRfUkVTRVJWRUQgPSAxMDI0LAorCisgICAgLyogUG9ydHMgZ3JlYXRlciB0aGlzIHZhbHVlIGFyZSByZXNlcnZlZCBmb3IgKG5vbi1wcml2aWxlZ2VkKSBzZXJ2ZXJzLiAgKi8KKyAgICBJUFBPUlRfVVNFUlJFU0VSVkVEID0gNTAwMAorICB9OworCisKKy8qIEludGVybmV0IGFkZHJlc3MuICAqLwordHlwZWRlZiB1aW50MzJfdCBpbl9hZGRyX3Q7CitzdHJ1Y3QgaW5fYWRkcgorICB7CisgICAgaW5fYWRkcl90IHNfYWRkcjsKKyAgfTsKKworCisvKiBEZWZpbml0aW9ucyBvZiB0aGUgYml0cyBpbiBhbiBJbnRlcm5ldCBhZGRyZXNzIGludGVnZXIuCisKKyAgIE9uIHN1Ym5ldHMsIGhvc3QgYW5kIG5ldHdvcmsgcGFydHMgYXJlIGZvdW5kIGFjY29yZGluZyB0bworICAgdGhlIHN1Ym5ldCBtYXNrLCBub3QgdGhlc2UgbWFza3MuICAqLworCisjZGVmaW5lCUlOX0NMQVNTQShhKQkJKCgoKGluX2FkZHJfdCkoYSkpICYgMHg4MDAwMDAwMCkgPT0gMCkKKyNkZWZpbmUJSU5fQ0xBU1NBX05FVAkJMHhmZjAwMDAwMAorI2RlZmluZQlJTl9DTEFTU0FfTlNISUZUCTI0CisjZGVmaW5lCUlOX0NMQVNTQV9IT1NUCQkoMHhmZmZmZmZmZiAmIH5JTl9DTEFTU0FfTkVUKQorI2RlZmluZQlJTl9DTEFTU0FfTUFYCQkxMjgKKworI2RlZmluZQlJTl9DTEFTU0IoYSkJCSgoKChpbl9hZGRyX3QpKGEpKSAmIDB4YzAwMDAwMDApID09IDB4ODAwMDAwMDApCisjZGVmaW5lCUlOX0NMQVNTQl9ORVQJCTB4ZmZmZjAwMDAKKyNkZWZpbmUJSU5fQ0xBU1NCX05TSElGVAkxNgorI2RlZmluZQlJTl9DTEFTU0JfSE9TVAkJKDB4ZmZmZmZmZmYgJiB+SU5fQ0xBU1NCX05FVCkKKyNkZWZpbmUJSU5fQ0xBU1NCX01BWAkJNjU1MzYKKworI2RlZmluZQlJTl9DTEFTU0MoYSkJCSgoKChpbl9hZGRyX3QpKGEpKSAmIDB4ZTAwMDAwMDApID09IDB4YzAwMDAwMDApCisjZGVmaW5lCUlOX0NMQVNTQ19ORVQJCTB4ZmZmZmZmMDAKKyNkZWZpbmUJSU5fQ0xBU1NDX05TSElGVAk4CisjZGVmaW5lCUlOX0NMQVNTQ19IT1NUCQkoMHhmZmZmZmZmZiAmIH5JTl9DTEFTU0NfTkVUKQorCisjZGVmaW5lCUlOX0NMQVNTRChhKQkJKCgoKGluX2FkZHJfdCkoYSkpICYgMHhmMDAwMDAwMCkgPT0gMHhlMDAwMDAwMCkKKyNkZWZpbmUJSU5fTVVMVElDQVNUKGEpCQlJTl9DTEFTU0QoYSkKKworI2RlZmluZQlJTl9FWFBFUklNRU5UQUwoYSkJKCgoKGluX2FkZHJfdCkoYSkpICYgMHhlMDAwMDAwMCkgPT0gMHhlMDAwMDAwMCkKKyNkZWZpbmUJSU5fQkFEQ0xBU1MoYSkJCSgoKChpbl9hZGRyX3QpKGEpKSAmIDB4ZjAwMDAwMDApID09IDB4ZjAwMDAwMDApCisKKy8qIEFkZHJlc3MgdG8gYWNjZXB0IGFueSBpbmNvbWluZyBtZXNzYWdlcy4gICovCisjZGVmaW5lCUlOQUREUl9BTlkJCSgoaW5fYWRkcl90KSAweDAwMDAwMDAwKQorLyogQWRkcmVzcyB0byBzZW5kIHRvIGFsbCBob3N0cy4gICovCisjZGVmaW5lCUlOQUREUl9CUk9BRENBU1QJKChpbl9hZGRyX3QpIDB4ZmZmZmZmZmYpCisvKiBBZGRyZXNzIGluZGljYXRpbmcgYW4gZXJyb3IgcmV0dXJuLiAgKi8KKyNkZWZpbmUJSU5BRERSX05PTkUJCSgoaW5fYWRkcl90KSAweGZmZmZmZmZmKQorCisvKiBOZXR3b3JrIG51bWJlciBmb3IgbG9jYWwgaG9zdCBsb29wYmFjay4gICovCisjZGVmaW5lCUlOX0xPT1BCQUNLTkVUCQkxMjcKKy8qIEFkZHJlc3MgdG8gbG9vcGJhY2sgaW4gc29mdHdhcmUgdG8gbG9jYWwgaG9zdC4gICovCisjaWZuZGVmIElOQUREUl9MT09QQkFDSworIyBkZWZpbmUgSU5BRERSX0xPT1BCQUNLCSgoaW5fYWRkcl90KSAweDdmMDAwMDAxKSAvKiBJbmV0IDEyNy4wLjAuMS4gICovCisjZW5kaWYKKworLyogRGVmaW5lcyBmb3IgTXVsdGljYXN0IElOQUREUi4gICovCisjZGVmaW5lIElOQUREUl9VTlNQRUNfR1JPVVAJKChpbl9hZGRyX3QpIDB4ZTAwMDAwMDApIC8qIDIyNC4wLjAuMCAqLworI2RlZmluZSBJTkFERFJfQUxMSE9TVFNfR1JPVVAJKChpbl9hZGRyX3QpIDB4ZTAwMDAwMDEpIC8qIDIyNC4wLjAuMSAqLworI2RlZmluZSBJTkFERFJfQUxMUlRSU19HUk9VUCAgICAoKGluX2FkZHJfdCkgMHhlMDAwMDAwMikgLyogMjI0LjAuMC4yICovCisjZGVmaW5lIElOQUREUl9NQVhfTE9DQUxfR1JPVVAgICgoaW5fYWRkcl90KSAweGUwMDAwMGZmKSAvKiAyMjQuMC4wLjI1NSAqLworCisKKy8qIElQdjYgYWRkcmVzcyAqLworc3RydWN0IGluNl9hZGRyCisgIHsKKyAgICB1bmlvbgorICAgICAgeworCXVpbnQ4X3QJX191Nl9hZGRyOFsxNl07CisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfR05VCisJdWludDE2X3QgX191Nl9hZGRyMTZbOF07CisJdWludDMyX3QgX191Nl9hZGRyMzJbNF07CisjZW5kaWYKKyAgICAgIH0gX19pbjZfdTsKKyNkZWZpbmUgczZfYWRkcgkJCV9faW42X3UuX191Nl9hZGRyOAorI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX0dOVQorIyBkZWZpbmUgczZfYWRkcjE2CQlfX2luNl91Ll9fdTZfYWRkcjE2CisjIGRlZmluZSBzNl9hZGRyMzIJCV9faW42X3UuX191Nl9hZGRyMzIKKyNlbmRpZgorICB9OworCitleHRlcm4gY29uc3Qgc3RydWN0IGluNl9hZGRyIGluNmFkZHJfYW55OyAgICAgICAgLyogOjogKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgaW42YWRkcl9sb29wYmFjazsgICAvKiA6OjEgKi8KKyNkZWZpbmUgSU42QUREUl9BTllfSU5JVCB7IHsgeyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwIH0gfSB9CisjZGVmaW5lIElONkFERFJfTE9PUEJBQ0tfSU5JVCB7IHsgeyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxIH0gfSB9CisKKyNkZWZpbmUgSU5FVF9BRERSU1RSTEVOIDE2CisjZGVmaW5lIElORVQ2X0FERFJTVFJMRU4gNDYKKworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhbiBJbnRlcm5ldCBzb2NrZXQgYWRkcmVzcy4gICovCitzdHJ1Y3Qgc29ja2FkZHJfaW4KKyAgeworICAgIF9fU09DS0FERFJfQ09NTU9OIChzaW5fKTsKKyAgICBpbl9wb3J0X3Qgc2luX3BvcnQ7CQkJLyogUG9ydCBudW1iZXIuICAqLworICAgIHN0cnVjdCBpbl9hZGRyIHNpbl9hZGRyOwkJLyogSW50ZXJuZXQgYWRkcmVzcy4gICovCisKKyAgICAvKiBQYWQgdG8gc2l6ZSBvZiBgc3RydWN0IHNvY2thZGRyJy4gICovCisgICAgdW5zaWduZWQgY2hhciBzaW5femVyb1tzaXplb2YgKHN0cnVjdCBzb2NrYWRkcikgLQorCQkJICAgX19TT0NLQUREUl9DT01NT05fU0laRSAtCisJCQkgICBzaXplb2YgKGluX3BvcnRfdCkgLQorCQkJICAgc2l6ZW9mIChzdHJ1Y3QgaW5fYWRkcildOworICB9OworCisvKiBEaXR0bywgZm9yIElQdjYuICAqLworc3RydWN0IHNvY2thZGRyX2luNgorICB7CisgICAgX19TT0NLQUREUl9DT01NT04gKHNpbjZfKTsKKyAgICBpbl9wb3J0X3Qgc2luNl9wb3J0OwkvKiBUcmFuc3BvcnQgbGF5ZXIgcG9ydCAjICovCisgICAgdWludDMyX3Qgc2luNl9mbG93aW5mbzsJLyogSVB2NiBmbG93IGluZm9ybWF0aW9uICovCisgICAgc3RydWN0IGluNl9hZGRyIHNpbjZfYWRkcjsJLyogSVB2NiBhZGRyZXNzICovCisgICAgdWludDMyX3Qgc2luNl9zY29wZV9pZDsJLyogSVB2NiBzY29wZS1pZCAqLworICB9OworCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9HTlUKKy8qIElQdjQgbXVsdGljYXN0IHJlcXVlc3QuICAqLworc3RydWN0IGlwX21yZXEKKyAgeworICAgIC8qIElQIG11bHRpY2FzdCBhZGRyZXNzIG9mIGdyb3VwLiAgKi8KKyAgICBzdHJ1Y3QgaW5fYWRkciBpbXJfbXVsdGlhZGRyOworCisgICAgLyogTG9jYWwgSVAgYWRkcmVzcyBvZiBpbnRlcmZhY2UuICAqLworICAgIHN0cnVjdCBpbl9hZGRyIGltcl9pbnRlcmZhY2U7CisgIH07CisKK3N0cnVjdCBpcF9tcmVxX3NvdXJjZQorICB7CisgICAgLyogSVAgbXVsdGljYXN0IGFkZHJlc3Mgb2YgZ3JvdXAuICAqLworICAgIHN0cnVjdCBpbl9hZGRyIGltcl9tdWx0aWFkZHI7CisKKyAgICAvKiBJUCBhZGRyZXNzIG9mIHNvdXJjZS4gICovCisgICAgc3RydWN0IGluX2FkZHIgaW1yX2ludGVyZmFjZTsKKworICAgIC8qIElQIGFkZHJlc3Mgb2YgaW50ZXJmYWNlLiAgKi8KKyAgICBzdHJ1Y3QgaW5fYWRkciBpbXJfc291cmNlYWRkcjsKKyAgfTsKKyNlbmRpZgorCisKKy8qIExpa2V3aXNlLCBmb3IgSVB2Ni4gICovCitzdHJ1Y3QgaXB2Nl9tcmVxCisgIHsKKyAgICAvKiBJUHY2IG11bHRpY2FzdCBhZGRyZXNzIG9mIGdyb3VwICovCisgICAgc3RydWN0IGluNl9hZGRyIGlwdjZtcl9tdWx0aWFkZHI7CisKKyAgICAvKiBsb2NhbCBpbnRlcmZhY2UgKi8KKyAgICB1bnNpZ25lZCBpbnQgaXB2Nm1yX2ludGVyZmFjZTsKKyAgfTsKKworCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfR05VCisvKiBNdWx0aWNhc3QgZ3JvdXAgcmVxdWVzdC4gICovCitzdHJ1Y3QgZ3JvdXBfcmVxCisgIHsKKyAgICAvKiBJbnRlcmZhY2UgaW5kZXguICAqLworICAgIHVpbnQzMl90IGdyX2ludGVyZmFjZTsKKworICAgIC8qIEdyb3VwIGFkZHJlc3MuICAqLworICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGdyX2dyb3VwOworICB9OworCitzdHJ1Y3QgZ3JvdXBfc291cmNlX3JlcQorICB7CisgICAgLyogSW50ZXJmYWNlIGluZGV4LiAgKi8KKyAgICB1aW50MzJfdCBnc3JfaW50ZXJmYWNlOworCisgICAgLyogR3JvdXAgYWRkcmVzcy4gICovCisgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgZ3NyX2dyb3VwOworCisgICAgLyogU291cmNlIGFkZHJlc3MuICAqLworICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGdzcl9zb3VyY2U7CisgIH07CisKKworLyogRnVsbC1zdGF0ZSBmaWx0ZXIgb3BlcmF0aW9ucy4gICovCitzdHJ1Y3QgaXBfbXNmaWx0ZXIKKyAgeworICAgIC8qIElQIG11bHRpY2FzdCBhZGRyZXNzIG9mIGdyb3VwLiAgKi8KKyAgICBzdHJ1Y3QgaW5fYWRkciBpbXNmX211bHRpYWRkcjsKKworICAgIC8qIExvY2FsIElQIGFkZHJlc3Mgb2YgaW50ZXJmYWNlLiAgKi8KKyAgICBzdHJ1Y3QgaW5fYWRkciBpbXNmX2ludGVyZmFjZTsKKworICAgIC8qIEZpbHRlciBtb2RlLiAgKi8KKyAgICB1aW50MzJfdCBpbXNmX2Ztb2RlOworCisgICAgLyogTnVtYmVyIG9mIHNvdXJjZSBhZGRyZXNzZXMuICAqLworICAgIHVpbnQzMl90IGltc2ZfbnVtc3JjOworICAgIC8qIFNvdXJjZSBhZGRyZXNzZXMuICAqLworICAgIHN0cnVjdCBpbl9hZGRyIGltc2Zfc2xpc3RbMV07CisgIH07CisKKyNkZWZpbmUgSVBfTVNGSUxURVJfU0laRShudW1zcmMpIChzaXplb2YgKHN0cnVjdCBpcF9tc2ZpbHRlcikgXAorCQkJCSAgLSBzaXplb2YgKHN0cnVjdCBpbl9hZGRyKQkJICAgICAgXAorCQkJCSAgKyAobnVtc3JjKSAqIHNpemVvZiAoc3RydWN0IGluX2FkZHIpKQorCitzdHJ1Y3QgZ3JvdXBfZmlsdGVyCisgIHsKKyAgICAvKiBJbnRlcmZhY2UgaW5kZXguICAqLworICAgIHVpbnQzMl90IGdmX2ludGVyZmFjZTsKKworICAgIC8qIEdyb3VwIGFkZHJlc3MuICAqLworICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGdmX2dyb3VwOworCisgICAgLyogRmlsdGVyIG1vZGUuICAqLworICAgIHVpbnQzMl90IGdmX2Ztb2RlOworCisgICAgLyogTnVtYmVyIG9mIHNvdXJjZSBhZGRyZXNzZXMuICAqLworICAgIHVpbnQzMl90IGdmX251bXNyYzsKKyAgICAvKiBTb3VyY2UgYWRkcmVzc2VzLiAgKi8KKyAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBnZl9zbGlzdFsxXTsKK307CisKKyNkZWZpbmUgR1JPVVBfRklMVEVSX1NJWkUobnVtc3JjKSAoc2l6ZW9mIChzdHJ1Y3QgZ3JvdXBfZmlsdGVyKSBcCisJCQkJICAgLSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKQkgICAgICBcCisJCQkJICAgKyAoKG51bXNyYykJCQkJICAgICAgXAorCQkJCSAgICAgICogc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSkpKQorI2VuZGlmCisKKworLyogR2V0IHN5c3RlbS1zcGVjaWZpYyBkZWZpbml0aW9ucy4gICovCisjaW5jbHVkZSA8Yml0cy9pbi5oPgorCisvKiBGdW5jdGlvbnMgdG8gY29udmVydCBiZXR3ZWVuIGhvc3QgYW5kIG5ldHdvcmsgYnl0ZSBvcmRlci4KKworICAgUGxlYXNlIG5vdGUgdGhhdCB0aGVzZSBmdW5jdGlvbnMgbm9ybWFsbHkgdGFrZSBgdW5zaWduZWQgbG9uZyBpbnQnIG9yCisgICBgdW5zaWduZWQgc2hvcnQgaW50JyB2YWx1ZXMgYXMgYXJndW1lbnRzIGFuZCBhbHNvIHJldHVybiB0aGVtLiAgQnV0CisgICB0aGlzIHdhcyBhIHNob3J0LXNpZ2h0ZWQgZGVjaXNpb24gc2luY2Ugb24gZGlmZmVyZW50IHN5c3RlbXMgdGhlIHR5cGVzCisgICBtYXkgaGF2ZSBkaWZmZXJlbnQgcmVwcmVzZW50YXRpb25zIGJ1dCB0aGUgdmFsdWVzIGFyZSBhbHdheXMgdGhlIHNhbWUuICAqLworCitleHRlcm4gdWludDMyX3QgbnRvaGwgKHVpbnQzMl90IF9fbmV0bG9uZykgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CitleHRlcm4gdWludDE2X3QgbnRvaHMgKHVpbnQxNl90IF9fbmV0c2hvcnQpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworZXh0ZXJuIHVpbnQzMl90IGh0b25sICh1aW50MzJfdCBfX2hvc3Rsb25nKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKK2V4dGVybiB1aW50MTZfdCBodG9ucyAodWludDE2X3QgX19ob3N0c2hvcnQpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisjaW5jbHVkZSA8ZW5kaWFuLmg+CisKKy8qIEdldCBtYWNoaW5lIGRlcGVuZGVudCBvcHRpbWl6ZWQgdmVyc2lvbnMgb2YgYnl0ZSBzd2FwcGluZyBmdW5jdGlvbnMuICAqLworI2luY2x1ZGUgPGJpdHMvYnl0ZXN3YXAuaD4KKworI2lmZGVmIF9fT1BUSU1JWkVfXworLyogV2UgY2FuIG9wdGltaXplIGNhbGxzIHRvIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucy4gIEVpdGhlciBub3RoaW5nIGhhcworICAgdG8gYmUgZG9uZSBvciB3ZSBhcmUgdXNpbmcgZGlyZWN0bHkgdGhlIGJ5dGUtc3dhcHBpbmcgZnVuY3Rpb25zIHdoaWNoCisgICBvZnRlbiBjYW4gYmUgaW5saW5lZC4gICovCisjIGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKy8qIFRoZSBob3N0IGJ5dGUgb3JkZXIgaXMgdGhlIHNhbWUgYXMgbmV0d29yayBieXRlIG9yZGVyLAorICAgc28gdGhlc2UgZnVuY3Rpb25zIGFyZSBhbGwganVzdCBpZGVudGl0eS4gICovCisjIGRlZmluZSBudG9obCh4KQkoeCkKKyMgZGVmaW5lIG50b2hzKHgpCSh4KQorIyBkZWZpbmUgaHRvbmwoeCkJKHgpCisjIGRlZmluZSBodG9ucyh4KQkoeCkKKyMgZWxzZQorIyAgaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorIyAgIGRlZmluZSBudG9obCh4KQlfX2Jzd2FwXzMyICh4KQorIyAgIGRlZmluZSBudG9ocyh4KQlfX2Jzd2FwXzE2ICh4KQorIyAgIGRlZmluZSBodG9ubCh4KQlfX2Jzd2FwXzMyICh4KQorIyAgIGRlZmluZSBodG9ucyh4KQlfX2Jzd2FwXzE2ICh4KQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIElONl9JU19BRERSX1VOU1BFQ0lGSUVEKGEpIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKHsgX19jb25zdCBzdHJ1Y3QgaW42X2FkZHIgKl9fYSA9IChfX2NvbnN0IHN0cnVjdCBpbjZfYWRkciAqKSAoYSk7CSAgICAgIFwKKyAgICAgIF9fYS0+czZfYWRkcjMyWzBdID09IDAJCQkJCQkgICAgICBcCisgICAgICAmJiBfX2EtPnM2X2FkZHIzMlsxXSA9PSAwCQkJCQkJICAgICAgXAorICAgICAgJiYgX19hLT5zNl9hZGRyMzJbMl0gPT0gMAkJCQkJCSAgICAgIFwKKyAgICAgICYmIF9fYS0+czZfYWRkcjMyWzNdID09IDA7IH0pKQorCisjIGRlZmluZSBJTjZfSVNfQUREUl9MT09QQkFDSyhhKSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7IF9fY29uc3Qgc3RydWN0IGluNl9hZGRyICpfX2EgPSAoX19jb25zdCBzdHJ1Y3QgaW42X2FkZHIgKikgKGEpOwkgICAgICBcCisgICAgICBfX2EtPnM2X2FkZHIzMlswXSA9PSAwCQkJCQkJICAgICAgXAorICAgICAgJiYgX19hLT5zNl9hZGRyMzJbMV0gPT0gMAkJCQkJCSAgICAgIFwKKyAgICAgICYmIF9fYS0+czZfYWRkcjMyWzJdID09IDAJCQkJCQkgICAgICBcCisgICAgICAmJiBfX2EtPnM2X2FkZHIzMlszXSA9PSBodG9ubCAoMSk7IH0pKQorCisjIGRlZmluZSBJTjZfSVNfQUREUl9MSU5LTE9DQUwoYSkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBfX2NvbnN0IHN0cnVjdCBpbjZfYWRkciAqX19hID0gKF9fY29uc3Qgc3RydWN0IGluNl9hZGRyICopIChhKTsJICAgICAgXAorICAgICAgKF9fYS0+czZfYWRkcjMyWzBdICYgaHRvbmwgKDB4ZmZjMDAwMDApKSA9PSBodG9ubCAoMHhmZTgwMDAwMCk7IH0pKQorCisjIGRlZmluZSBJTjZfSVNfQUREUl9TSVRFTE9DQUwoYSkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBfX2NvbnN0IHN0cnVjdCBpbjZfYWRkciAqX19hID0gKF9fY29uc3Qgc3RydWN0IGluNl9hZGRyICopIChhKTsJICAgICAgXAorICAgICAgKF9fYS0+czZfYWRkcjMyWzBdICYgaHRvbmwgKDB4ZmZjMDAwMDApKSA9PSBodG9ubCAoMHhmZWMwMDAwMCk7IH0pKQorCisjIGRlZmluZSBJTjZfSVNfQUREUl9WNE1BUFBFRChhKSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7IF9fY29uc3Qgc3RydWN0IGluNl9hZGRyICpfX2EgPSAoX19jb25zdCBzdHJ1Y3QgaW42X2FkZHIgKikgKGEpOwkgICAgICBcCisgICAgICBfX2EtPnM2X2FkZHIzMlswXSA9PSAwCQkJCQkJICAgICAgXAorICAgICAgJiYgX19hLT5zNl9hZGRyMzJbMV0gPT0gMAkJCQkJCSAgICAgIFwKKyAgICAgICYmIF9fYS0+czZfYWRkcjMyWzJdID09IGh0b25sICgweGZmZmYpOyB9KSkKKworIyBkZWZpbmUgSU42X0lTX0FERFJfVjRDT01QQVQoYSkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBfX2NvbnN0IHN0cnVjdCBpbjZfYWRkciAqX19hID0gKF9fY29uc3Qgc3RydWN0IGluNl9hZGRyICopIChhKTsJICAgICAgXAorICAgICAgX19hLT5zNl9hZGRyMzJbMF0gPT0gMAkJCQkJCSAgICAgIFwKKyAgICAgICYmIF9fYS0+czZfYWRkcjMyWzFdID09IDAJCQkJCQkgICAgICBcCisgICAgICAmJiBfX2EtPnM2X2FkZHIzMlsyXSA9PSAwCQkJCQkJICAgICAgXAorICAgICAgJiYgbnRvaGwgKF9fYS0+czZfYWRkcjMyWzNdKSA+IDE7IH0pKQorCisjIGRlZmluZSBJTjZfQVJFX0FERFJfRVFVQUwoYSxiKSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7IF9fY29uc3Qgc3RydWN0IGluNl9hZGRyICpfX2EgPSAoX19jb25zdCBzdHJ1Y3QgaW42X2FkZHIgKikgKGEpOwkgICAgICBcCisgICAgICBfX2NvbnN0IHN0cnVjdCBpbjZfYWRkciAqX19iID0gKF9fY29uc3Qgc3RydWN0IGluNl9hZGRyICopIChiKTsJICAgICAgXAorICAgICAgX19hLT5zNl9hZGRyMzJbMF0gPT0gX19iLT5zNl9hZGRyMzJbMF0JCQkJICAgICAgXAorICAgICAgJiYgX19hLT5zNl9hZGRyMzJbMV0gPT0gX19iLT5zNl9hZGRyMzJbMV0JCQkJICAgICAgXAorICAgICAgJiYgX19hLT5zNl9hZGRyMzJbMl0gPT0gX19iLT5zNl9hZGRyMzJbMl0JCQkJICAgICAgXAorICAgICAgJiYgX19hLT5zNl9hZGRyMzJbM10gPT0gX19iLT5zNl9hZGRyMzJbM107IH0pKQorI2Vsc2UKKyMgZGVmaW5lIElONl9JU19BRERSX1VOU1BFQ0lGSUVEKGEpIFwKKwkoKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbMF0gPT0gMAkJCQkgICAgICBcCisJICYmICgoX19jb25zdCB1aW50MzJfdCAqKSAoYSkpWzFdID09IDAJCQkJICAgICAgXAorCSAmJiAoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVsyXSA9PSAwCQkJCSAgICAgIFwKKwkgJiYgKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbM10gPT0gMCkKKworIyBkZWZpbmUgSU42X0lTX0FERFJfTE9PUEJBQ0soYSkgXAorCSgoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVswXSA9PSAwCQkJCSAgICAgIFwKKwkgJiYgKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbMV0gPT0gMAkJCQkgICAgICBcCisJICYmICgoX19jb25zdCB1aW50MzJfdCAqKSAoYSkpWzJdID09IDAJCQkJICAgICAgXAorCSAmJiAoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVszXSA9PSBodG9ubCAoMSkpCisKKyMgZGVmaW5lIElONl9JU19BRERSX0xJTktMT0NBTChhKSBcCisJKCgoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVswXSAmIGh0b25sICgweGZmYzAwMDAwKSkJCSAgICAgIFwKKwkgPT0gaHRvbmwgKDB4ZmU4MDAwMDApKQorCisjIGRlZmluZSBJTjZfSVNfQUREUl9TSVRFTE9DQUwoYSkgXAorCSgoKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbMF0gJiBodG9ubCAoMHhmZmMwMDAwMCkpCQkgICAgICBcCisJID09IGh0b25sICgweGZlYzAwMDAwKSkKKworIyBkZWZpbmUgSU42X0lTX0FERFJfVjRNQVBQRUQoYSkgXAorCSgoKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbMF0gPT0gMCkJCQkJICAgICAgXAorCSAmJiAoKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbMV0gPT0gMCkJCQkgICAgICBcCisJICYmICgoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVsyXSA9PSBodG9ubCAoMHhmZmZmKSkpCisKKyMgZGVmaW5lIElONl9JU19BRERSX1Y0Q09NUEFUKGEpIFwKKwkoKCgoX19jb25zdCB1aW50MzJfdCAqKSAoYSkpWzBdID09IDApCQkJCSAgICAgIFwKKwkgJiYgKCgoX19jb25zdCB1aW50MzJfdCAqKSAoYSkpWzFdID09IDApCQkJICAgICAgXAorCSAmJiAoKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbMl0gPT0gMCkJCQkgICAgICBcCisJICYmIChudG9obCAoKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbM10pID4gMSkpCisKKyMgZGVmaW5lIElONl9BUkVfQUREUl9FUVVBTChhLGIpIFwKKwkoKCgoX19jb25zdCB1aW50MzJfdCAqKSAoYSkpWzBdID09ICgoX19jb25zdCB1aW50MzJfdCAqKSAoYikpWzBdKSAgICAgXAorCSAmJiAoKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbMV0gPT0gKChfX2NvbnN0IHVpbnQzMl90ICopIChiKSlbMV0pICBcCisJICYmICgoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVsyXSA9PSAoKF9fY29uc3QgdWludDMyX3QgKikgKGIpKVsyXSkgIFwKKwkgJiYgKCgoX19jb25zdCB1aW50MzJfdCAqKSAoYSkpWzNdID09ICgoX19jb25zdCB1aW50MzJfdCAqKSAoYikpWzNdKSkKKyNlbmRpZgorCisjZGVmaW5lIElONl9JU19BRERSX01VTFRJQ0FTVChhKSAoKChfX2NvbnN0IHVpbnQ4X3QgKikgKGEpKVswXSA9PSAweGZmKQorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfR05VCisvKiBCaW5kIHNvY2tldCB0byBhIHByaXZpbGVnZWQgSVAgcG9ydC4gICovCitleHRlcm4gaW50IGJpbmRyZXN2cG9ydCAoaW50IF9fc29ja2ZkLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKl9fc29ja19pbikgX19USFJPVzsKKworLyogVGhlIElQdjYgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uLiAgKi8KK2V4dGVybiBpbnQgYmluZHJlc3Zwb3J0NiAoaW50IF9fc29ja2ZkLCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpfX3NvY2tfaW4pCisgICAgIF9fVEhST1c7CisjZW5kaWYKKworCisjZGVmaW5lIElONl9JU19BRERSX01DX05PREVMT0NBTChhKSBcCisJKElONl9JU19BRERSX01VTFRJQ0FTVChhKQkJCQkJICAgICAgXAorCSAmJiAoKCgoX19jb25zdCB1aW50OF90ICopIChhKSlbMV0gJiAweGYpID09IDB4MSkpCisKKyNkZWZpbmUgSU42X0lTX0FERFJfTUNfTElOS0xPQ0FMKGEpIFwKKwkoSU42X0lTX0FERFJfTVVMVElDQVNUKGEpCQkJCQkgICAgICBcCisJICYmICgoKChfX2NvbnN0IHVpbnQ4X3QgKikgKGEpKVsxXSAmIDB4ZikgPT0gMHgyKSkKKworI2RlZmluZSBJTjZfSVNfQUREUl9NQ19TSVRFTE9DQUwoYSkgXAorCShJTjZfSVNfQUREUl9NVUxUSUNBU1QoYSkJCQkJCSAgICAgIFwKKwkgJiYgKCgoKF9fY29uc3QgdWludDhfdCAqKSAoYSkpWzFdICYgMHhmKSA9PSAweDUpKQorCisjZGVmaW5lIElONl9JU19BRERSX01DX09SR0xPQ0FMKGEpIFwKKwkoSU42X0lTX0FERFJfTVVMVElDQVNUKGEpCQkJCQkgICAgICBcCisJICYmICgoKChfX2NvbnN0IHVpbnQ4X3QgKikgKGEpKVsxXSAmIDB4ZikgPT0gMHg4KSkKKworI2RlZmluZSBJTjZfSVNfQUREUl9NQ19HTE9CQUwoYSkgXAorCShJTjZfSVNfQUREUl9NVUxUSUNBU1QoYSkJCQkJCSAgICAgIFwKKwkgJiYgKCgoKF9fY29uc3QgdWludDhfdCAqKSAoYSkpWzFdICYgMHhmKSA9PSAweGUpKQorCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIElQdjYgcGFja2V0IGluZm9ybWF0aW9uLiAgKi8KK3N0cnVjdCBpbjZfcGt0aW5mbworICB7CisgICAgc3RydWN0IGluNl9hZGRyIGlwaTZfYWRkcjsJLyogc3JjL2RzdCBJUHY2IGFkZHJlc3MgKi8KKyAgICB1bnNpZ25lZCBpbnQgaXBpNl9pZmluZGV4OwkvKiBzZW5kL3JlY3YgaW50ZXJmYWNlIGluZGV4ICovCisgIH07CisKKy8qIElQdjYgTVRVIGluZm9ybWF0aW9uLiAgKi8KK3N0cnVjdCBpcDZfbXR1aW5mbworICB7CisgICAgc3RydWN0IHNvY2thZGRyX2luNiBpcDZtX2FkZHI7IC8qIGRzdCBhZGRyZXNzIGluY2x1ZGluZyB6b25lIElEICovCisgICAgdWludDMyX3QgaXA2bV9tdHU7CQkgICAvKiBwYXRoIE1UVSBpbiBob3N0IGJ5dGUgb3JkZXIgKi8KKyAgfTsKKworCisvKiBPYnNvbGV0ZSBob3AtYnktaG9wIGFuZCBEZXN0aW5hdGlvbiBPcHRpb25zIFByb2Nlc3NpbmcgKFJGQyAyMjkyKS4gICovCitleHRlcm4gaW50IGluZXQ2X29wdGlvbl9zcGFjZSAoaW50IF9fbmJ5dGVzKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXzsKK2V4dGVybiBpbnQgaW5ldDZfb3B0aW9uX2luaXQgKHZvaWQgKl9fYnAsIHN0cnVjdCBjbXNnaGRyICoqX19jbXNncCwKKwkJCSAgICAgIGludCBfX3R5cGUpIF9fVEhST1cgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fOworZXh0ZXJuIGludCBpbmV0Nl9vcHRpb25fYXBwZW5kIChzdHJ1Y3QgY21zZ2hkciAqX19jbXNnLAorCQkJCV9fY29uc3QgdWludDhfdCAqX190eXBlcCwgaW50IF9fbXVsdHgsCisJCQkJaW50IF9fcGx1c3kpIF9fVEhST1cgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fOworZXh0ZXJuIHVpbnQ4X3QgKmluZXQ2X29wdGlvbl9hbGxvYyAoc3RydWN0IGNtc2doZHIgKl9fY21zZywgaW50IF9fZGF0YWxlbiwKKwkJCQkgICAgaW50IF9fbXVsdHgsIGludCBfX3BsdXN5KQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXzsKK2V4dGVybiBpbnQgaW5ldDZfb3B0aW9uX25leHQgKF9fY29uc3Qgc3RydWN0IGNtc2doZHIgKl9fY21zZywKKwkJCSAgICAgIHVpbnQ4X3QgKipfX3RwdHJwKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXzsKK2V4dGVybiBpbnQgaW5ldDZfb3B0aW9uX2ZpbmQgKF9fY29uc3Qgc3RydWN0IGNtc2doZHIgKl9fY21zZywKKwkJCSAgICAgIHVpbnQ4X3QgKipfX3RwdHJwLCBpbnQgX190eXBlKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXzsKKworCisvKiBIb3AtYnktSG9wIGFuZCBEZXN0aW5hdGlvbiBPcHRpb25zIFByb2Nlc3NpbmcgKFJGQyAzNTQyKS4gICovCitleHRlcm4gaW50IGluZXQ2X29wdF9pbml0ICh2b2lkICpfX2V4dGJ1Ziwgc29ja2xlbl90IF9fZXh0bGVuKSBfX1RIUk9XOworZXh0ZXJuIGludCBpbmV0Nl9vcHRfYXBwZW5kICh2b2lkICpfX2V4dGJ1Ziwgc29ja2xlbl90IF9fZXh0bGVuLCBpbnQgX19vZmZzZXQsCisJCQkgICAgIHVpbnQ4X3QgX190eXBlLCBzb2NrbGVuX3QgX19sZW4sIHVpbnQ4X3QgX19hbGlnbiwKKwkJCSAgICAgdm9pZCAqKl9fZGF0YWJ1ZnApIF9fVEhST1c7CitleHRlcm4gaW50IGluZXQ2X29wdF9maW5pc2ggKHZvaWQgKl9fZXh0YnVmLCBzb2NrbGVuX3QgX19leHRsZW4sIGludCBfX29mZnNldCkKKyAgICAgX19USFJPVzsKK2V4dGVybiBpbnQgaW5ldDZfb3B0X3NldF92YWwgKHZvaWQgKl9fZGF0YWJ1ZiwgaW50IF9fb2Zmc2V0LCB2b2lkICpfX3ZhbCwKKwkJCSAgICAgIHNvY2tsZW5fdCBfX3ZhbGxlbikgX19USFJPVzsKK2V4dGVybiBpbnQgaW5ldDZfb3B0X25leHQgKHZvaWQgKl9fZXh0YnVmLCBzb2NrbGVuX3QgX19leHRsZW4sIGludCBfX29mZnNldCwKKwkJCSAgIHVpbnQ4X3QgKl9fdHlwZXAsIHNvY2tsZW5fdCAqX19sZW5wLAorCQkJICAgdm9pZCAqKl9fZGF0YWJ1ZnApIF9fVEhST1c7CitleHRlcm4gaW50IGluZXQ2X29wdF9maW5kICh2b2lkICpfX2V4dGJ1Ziwgc29ja2xlbl90IF9fZXh0bGVuLCBpbnQgX19vZmZzZXQsCisJCQkgICB1aW50OF90IF9fdHlwZSwgc29ja2xlbl90ICpfX2xlbnAsCisJCQkgICB2b2lkICoqX19kYXRhYnVmcCkgX19USFJPVzsKK2V4dGVybiBpbnQgaW5ldDZfb3B0X2dldF92YWwgKHZvaWQgKl9fZGF0YWJ1ZiwgaW50IF9fb2Zmc2V0LCB2b2lkICpfX3ZhbCwKKwkJCSAgICAgIHNvY2tsZW5fdCBfX3ZhbGxlbikgX19USFJPVzsKKworCisvKiBSb3V0aW5nIEhlYWRlciBPcHRpb24gKFJGQyAzNTQyKS4gICovCitleHRlcm4gc29ja2xlbl90IGluZXQ2X3J0aF9zcGFjZSAoaW50IF9fdHlwZSwgaW50IF9fc2VnbWVudHMpIF9fVEhST1c7CitleHRlcm4gdm9pZCAqaW5ldDZfcnRoX2luaXQgKHZvaWQgKl9fYnAsIHNvY2tsZW5fdCBfX2JwX2xlbiwgaW50IF9fdHlwZSwKKwkJCSAgICAgaW50IF9fc2VnbWVudHMpIF9fVEhST1c7CitleHRlcm4gaW50IGluZXQ2X3J0aF9hZGQgKHZvaWQgKl9fYnAsIF9fY29uc3Qgc3RydWN0IGluNl9hZGRyICpfX2FkZHIpIF9fVEhST1c7CitleHRlcm4gaW50IGluZXQ2X3J0aF9yZXZlcnNlIChfX2NvbnN0IHZvaWQgKl9faW4sIHZvaWQgKl9fb3V0KSBfX1RIUk9XOworZXh0ZXJuIGludCBpbmV0Nl9ydGhfc2VnbWVudHMgKF9fY29uc3Qgdm9pZCAqX19icCkgX19USFJPVzsKK2V4dGVybiBzdHJ1Y3QgaW42X2FkZHIgKmluZXQ2X3J0aF9nZXRhZGRyIChfX2NvbnN0IHZvaWQgKl9fYnAsIGludCBfX2luZGV4KQorICAgICBfX1RIUk9XOworCisKKy8qIE11bHRpY2FzdCBzb3VyY2UgZmlsdGVyIHN1cHBvcnQuICAqLworCisvKiBHZXQgSVB2NCBzb3VyY2UgZmlsdGVyLiAgKi8KK2V4dGVybiBpbnQgZ2V0aXB2NHNvdXJjZWZpbHRlciAoaW50IF9fcywgc3RydWN0IGluX2FkZHIgX19pbnRlcmZhY2VfYWRkciwKKwkJCQlzdHJ1Y3QgaW5fYWRkciBfX2dyb3VwLCB1aW50MzJfdCAqX19mbW9kZSwKKwkJCQl1aW50MzJfdCAqX19udW1zcmMsIHN0cnVjdCBpbl9hZGRyICpfX3NsaXN0KQorICAgICBfX1RIUk9XOworCisvKiBTZXQgSVB2NCBzb3VyY2UgZmlsdGVyLiAgKi8KK2V4dGVybiBpbnQgc2V0aXB2NHNvdXJjZWZpbHRlciAoaW50IF9fcywgc3RydWN0IGluX2FkZHIgX19pbnRlcmZhY2VfYWRkciwKKwkJCQlzdHJ1Y3QgaW5fYWRkciBfX2dyb3VwLCB1aW50MzJfdCBfX2Ztb2RlLAorCQkJCXVpbnQzMl90IF9fbnVtc3JjLAorCQkJCV9fY29uc3Qgc3RydWN0IGluX2FkZHIgKl9fc2xpc3QpCisgICAgIF9fVEhST1c7CisKKworLyogR2V0IHNvdXJjZSBmaWx0ZXIuICAqLworZXh0ZXJuIGludCBnZXRzb3VyY2VmaWx0ZXIgKGludCBfX3MsIHVpbnQzMl90IF9faW50ZXJmYWNlX2FkZHIsCisJCQkgICAgX19jb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKl9fZ3JvdXAsCisJCQkgICAgc29ja2xlbl90IF9fZ3JvdXBsZW4sIHVpbnQzMl90ICpfX2Ztb2RlLAorCQkJICAgIHVpbnQzMl90ICpfX251bXNyYywKKwkJCSAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqX19zbGlzdCkgX19USFJPVzsKKworLyogU2V0IHNvdXJjZSBmaWx0ZXIuICAqLworZXh0ZXJuIGludCBzZXRzb3VyY2VmaWx0ZXIgKGludCBfX3MsIHVpbnQzMl90IF9faW50ZXJmYWNlX2FkZHIsCisJCQkgICAgX19jb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKl9fZ3JvdXAsCisJCQkgICAgc29ja2xlbl90IF9fZ3JvdXBsZW4sIHVpbnQzMl90IF9fZm1vZGUsCisJCQkgICAgdWludDMyX3QgX19udW1zcmMsCisJCQkgICAgX19jb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqX19zbGlzdCkgX19USFJPVzsKKyNlbmRpZgkvKiB1c2UgR05VICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBuZXRpbmV0L2luLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbl9zeXN0bS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2luX3N5c3RtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhMDhlMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbl9zeXN0bS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qIFN5c3RlbSBzcGVjaWZpYyB0eXBlIGRlZmluaXRpb25zIGZvciBuZXR3b3JraW5nIGNvZGUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX05FVElORVRfSU5fU1lTVE1fSAorI2RlZmluZSBfTkVUSU5FVF9JTl9TWVNUTV9IIDEKKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qCisgKiBOZXR3b3JrIG9yZGVyIHZlcnNpb25zIG9mIHZhcmlvdXMgZGF0YSB0eXBlcy4gVW5mb3J0dW5hdGVseSwgQlNECisgKiBhc3N1bWVzIHNwZWNpZmljIHNpemVzIGZvciBzaG9ydHMgKDE2IGJpdCkgYW5kIGxvbmdzICgzMiBiaXQpIHdoaWNoCisgKiBkb24ndCBob2xkIGluIGdlbmVyYWwuIEFzIGEgY29uc2VxdWVuY2UsIHRoZSBuZXR3b3JrIG9yZGVyIHZlcnNpb25zCisgKiBtYXkgbm90IHJlZmxlY3QgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBuYXRpdmUgZGF0YSB0eXBlcy4KKyAqLworCit0eXBlZGVmIHVfaW50MTZfdCBuX3Nob3J0OyAgICAgIC8qIHNob3J0IGFzIHJlY2VpdmVkIGZyb20gdGhlIG5ldCAqLwordHlwZWRlZiB1X2ludDMyX3Qgbl9sb25nOyAgICAgICAvKiBsb25nIGFzIHJlY2VpdmVkIGZyb20gdGhlIG5ldCAgKi8KK3R5cGVkZWYgdV9pbnQzMl90IG5fdGltZTsgICAgICAgLyogbXMgc2luY2UgMDA6MDAgR01ULCBieXRlIHJldiAgICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBuZXRpbmV0L2luX3N5c3RtLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk1NWZlZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pcC5oCkBAIC0wLDAgKzEsMzAzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5MywxOTk1LTIwMDAsMjAwOSwyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9fTkVUSU5FVF9JUF9ICisjZGVmaW5lIF9fTkVUSU5FVF9JUF9IIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKK19fQkVHSU5fREVDTFMKKworc3RydWN0IHRpbWVzdGFtcAorICB7CisgICAgdV9pbnQ4X3QgbGVuOworICAgIHVfaW50OF90IHB0cjsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisgICAgdW5zaWduZWQgaW50IGZsYWdzOjQ7CisgICAgdW5zaWduZWQgaW50IG92ZXJmbG93OjQ7CisjZWxpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisgICAgdW5zaWduZWQgaW50IG92ZXJmbG93OjQ7CisgICAgdW5zaWduZWQgaW50IGZsYWdzOjQ7CisjZWxzZQorIyBlcnJvcgkiUGxlYXNlIGZpeCA8Yml0cy9lbmRpYW4uaD4iCisjZW5kaWYKKyAgICB1X2ludDMyX3QgZGF0YVs5XTsKKyAgfTsKKworc3RydWN0IGlwaGRyCisgIHsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisgICAgdW5zaWduZWQgaW50IGlobDo0OworICAgIHVuc2lnbmVkIGludCB2ZXJzaW9uOjQ7CisjZWxpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisgICAgdW5zaWduZWQgaW50IHZlcnNpb246NDsKKyAgICB1bnNpZ25lZCBpbnQgaWhsOjQ7CisjZWxzZQorIyBlcnJvcgkiUGxlYXNlIGZpeCA8Yml0cy9lbmRpYW4uaD4iCisjZW5kaWYKKyAgICB1X2ludDhfdCB0b3M7CisgICAgdV9pbnQxNl90IHRvdF9sZW47CisgICAgdV9pbnQxNl90IGlkOworICAgIHVfaW50MTZfdCBmcmFnX29mZjsKKyAgICB1X2ludDhfdCB0dGw7CisgICAgdV9pbnQ4X3QgcHJvdG9jb2w7CisgICAgdV9pbnQxNl90IGNoZWNrOworICAgIHVfaW50MzJfdCBzYWRkcjsKKyAgICB1X2ludDMyX3QgZGFkZHI7CisgICAgLypUaGUgb3B0aW9ucyBzdGFydCBoZXJlLiAqLworICB9OworCisjaWZkZWYgX19VU0VfQlNECisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWlwLmgJOC4xIChCZXJrZWxleSkgNi8xMC85MworICovCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgaW50ZXJuZXQgcHJvdG9jb2wgdmVyc2lvbiA0LgorICogUGVyIFJGQyA3OTEsIFNlcHRlbWJlciAxOTgxLgorICovCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYW4gaW50ZXJuZXQgaGVhZGVyLCBuYWtlZCBvZiBvcHRpb25zLgorICovCitzdHJ1Y3QgaXAKKyAgeworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyAgICB1bnNpZ25lZCBpbnQgaXBfaGw6NDsJCS8qIGhlYWRlciBsZW5ndGggKi8KKyAgICB1bnNpZ25lZCBpbnQgaXBfdjo0OwkJLyogdmVyc2lvbiAqLworI2VuZGlmCisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorICAgIHVuc2lnbmVkIGludCBpcF92OjQ7CQkvKiB2ZXJzaW9uICovCisgICAgdW5zaWduZWQgaW50IGlwX2hsOjQ7CQkvKiBoZWFkZXIgbGVuZ3RoICovCisjZW5kaWYKKyAgICB1X2ludDhfdCBpcF90b3M7CQkJLyogdHlwZSBvZiBzZXJ2aWNlICovCisgICAgdV9zaG9ydCBpcF9sZW47CQkJLyogdG90YWwgbGVuZ3RoICovCisgICAgdV9zaG9ydCBpcF9pZDsJCQkvKiBpZGVudGlmaWNhdGlvbiAqLworICAgIHVfc2hvcnQgaXBfb2ZmOwkJCS8qIGZyYWdtZW50IG9mZnNldCBmaWVsZCAqLworI2RlZmluZQlJUF9SRiAweDgwMDAJCQkvKiByZXNlcnZlZCBmcmFnbWVudCBmbGFnICovCisjZGVmaW5lCUlQX0RGIDB4NDAwMAkJCS8qIGRvbnQgZnJhZ21lbnQgZmxhZyAqLworI2RlZmluZQlJUF9NRiAweDIwMDAJCQkvKiBtb3JlIGZyYWdtZW50cyBmbGFnICovCisjZGVmaW5lCUlQX09GRk1BU0sgMHgxZmZmCQkvKiBtYXNrIGZvciBmcmFnbWVudGluZyBiaXRzICovCisgICAgdV9pbnQ4X3QgaXBfdHRsOwkJCS8qIHRpbWUgdG8gbGl2ZSAqLworICAgIHVfaW50OF90IGlwX3A7CQkJLyogcHJvdG9jb2wgKi8KKyAgICB1X3Nob3J0IGlwX3N1bTsJCQkvKiBjaGVja3N1bSAqLworICAgIHN0cnVjdCBpbl9hZGRyIGlwX3NyYywgaXBfZHN0OwkvKiBzb3VyY2UgYW5kIGRlc3QgYWRkcmVzcyAqLworICB9OworCisvKgorICogVGltZSBzdGFtcCBvcHRpb24gc3RydWN0dXJlLgorICovCitzdHJ1Y3QgaXBfdGltZXN0YW1wCisgIHsKKyAgICB1X2ludDhfdCBpcHRfY29kZTsJCQkvKiBJUE9QVF9UUyAqLworICAgIHVfaW50OF90IGlwdF9sZW47CQkJLyogc2l6ZSBvZiBzdHJ1Y3R1cmUgKHZhcmlhYmxlKSAqLworICAgIHVfaW50OF90IGlwdF9wdHI7CQkJLyogaW5kZXggb2YgY3VycmVudCBlbnRyeSAqLworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyAgICB1bnNpZ25lZCBpbnQgaXB0X2ZsZzo0OwkJLyogZmxhZ3MsIHNlZSBiZWxvdyAqLworICAgIHVuc2lnbmVkIGludCBpcHRfb2Zsdzo0OwkJLyogb3ZlcmZsb3cgY291bnRlciAqLworI2VuZGlmCisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorICAgIHVuc2lnbmVkIGludCBpcHRfb2Zsdzo0OwkJLyogb3ZlcmZsb3cgY291bnRlciAqLworICAgIHVuc2lnbmVkIGludCBpcHRfZmxnOjQ7CQkvKiBmbGFncywgc2VlIGJlbG93ICovCisjZW5kaWYKKyAgICB1X2ludDMyX3QgZGF0YVs5XTsKKyAgfTsKKyNlbmRpZiAvKiBfX1VTRV9CU0QgKi8KKworI2RlZmluZQlJUFZFUlNJT04JNCAgICAgICAgICAgICAgIC8qIElQIHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lCUlQX01BWFBBQ0tFVAk2NTUzNQkJLyogbWF4aW11bSBwYWNrZXQgc2l6ZSAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIEV4cGxpY2l0IENvbmdlc3Rpb24gTm90aWZpY2F0aW9uIChFQ04pCisgKgorICogVGFrZW4gZnJvbSBSRkMtMzE2OCwgU2VjdGlvbiA1LgorICovCisKKyNkZWZpbmUJSVBUT1NfRUNOX01BU0sJCTB4MDMKKyNkZWZpbmUJSVBUT1NfRUNOKHgpCQkoKHgpICYgSVBUT1NfRUNOX01BU0spCisjZGVmaW5lCUlQVE9TX0VDTl9OT1RfRUNUCTB4MDAKKyNkZWZpbmUJSVBUT1NfRUNOX0VDVDEJCTB4MDEKKyNkZWZpbmUJSVBUT1NfRUNOX0VDVDAJCTB4MDIKKyNkZWZpbmUJSVBUT1NfRUNOX0NFCQkweDAzCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgSVAgZGlmZmVyZW50aWF0ZWQgc2VydmljZXMgY29kZSBwb2ludHMgKERTQ1ApCisgKgorICogVGFrZW4gZnJvbSBSRkMtMjU5NywgU2VjdGlvbiA2IGFuZCBSRkMtMjU5OCwgU2VjdGlvbiAyLjMuCisgKi8KKworI2RlZmluZQlJUFRPU19EU0NQX01BU0sJCTB4ZmMKKyNkZWZpbmUJSVBUT1NfRFNDUCh4KQkJKCh4KSAmIElQVE9TX0RTQ1BfTUFTSykKKyNkZWZpbmUJSVBUT1NfRFNDUF9BRjExCQkweDI4CisjZGVmaW5lCUlQVE9TX0RTQ1BfQUYxMgkJMHgzMAorI2RlZmluZQlJUFRPU19EU0NQX0FGMTMJCTB4MzgKKyNkZWZpbmUJSVBUT1NfRFNDUF9BRjIxCQkweDQ4CisjZGVmaW5lCUlQVE9TX0RTQ1BfQUYyMgkJMHg1MAorI2RlZmluZQlJUFRPU19EU0NQX0FGMjMJCTB4NTgKKyNkZWZpbmUJSVBUT1NfRFNDUF9BRjMxCQkweDY4CisjZGVmaW5lCUlQVE9TX0RTQ1BfQUYzMgkJMHg3MAorI2RlZmluZQlJUFRPU19EU0NQX0FGMzMJCTB4NzgKKyNkZWZpbmUJSVBUT1NfRFNDUF9BRjQxCQkweDg4CisjZGVmaW5lCUlQVE9TX0RTQ1BfQUY0MgkJMHg5MAorI2RlZmluZQlJUFRPU19EU0NQX0FGNDMJCTB4OTgKKyNkZWZpbmUJSVBUT1NfRFNDUF9FRgkJMHhiOAorCisvKgorICogSW4gUkZDIDI0NzQsIFNlY3Rpb24gNC4yLjIuMSwgdGhlIENsYXNzIFNlbGVjdG9yIENvZGVwb2ludHMgc3Vic3VtZQorICogdGhlIG9sZCBUb1MgUHJlY2VkZW5jZSB2YWx1ZXMuCisgKi8KKworI2RlZmluZQlJUFRPU19DTEFTU19NQVNLCQkweGUwCisjZGVmaW5lCUlQVE9TX0NMQVNTKGNsYXNzKQkJKChjbGFzcykgJiBJUFRPU19DTEFTU19NQVNLKQorI2RlZmluZQlJUFRPU19DTEFTU19DUzAJCQkweDAwCisjZGVmaW5lCUlQVE9TX0NMQVNTX0NTMQkJCTB4MjAKKyNkZWZpbmUJSVBUT1NfQ0xBU1NfQ1MyCQkJMHg0MAorI2RlZmluZQlJUFRPU19DTEFTU19DUzMJCQkweDYwCisjZGVmaW5lCUlQVE9TX0NMQVNTX0NTNAkJCTB4ODAKKyNkZWZpbmUJSVBUT1NfQ0xBU1NfQ1M1CQkJMHhhMAorI2RlZmluZQlJUFRPU19DTEFTU19DUzYJCQkweGMwCisjZGVmaW5lCUlQVE9TX0NMQVNTX0NTNwkJCTB4ZTAKKworI2RlZmluZQlJUFRPU19DTEFTU19ERUZBVUxUCQlJUFRPU19DTEFTU19DUzAKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBJUCB0eXBlIG9mIHNlcnZpY2UgKGlwX3RvcykgW2RlcHJlY2F0ZWQ7IHVzZSBEU0NQCisgKiBhbmQgQ1MgZGVmaW5pdGlvbnMgYWJvdmUgaW5zdGVhZC5dCisgKi8KKyNkZWZpbmUJSVBUT1NfVE9TX01BU0sJCTB4MUUKKyNkZWZpbmUJSVBUT1NfVE9TKHRvcykJCSgodG9zKSAmIElQVE9TX1RPU19NQVNLKQorI2RlZmluZQlJUFRPU19MT1dERUxBWQkJMHgxMAorI2RlZmluZQlJUFRPU19USFJPVUdIUFVUCTB4MDgKKyNkZWZpbmUJSVBUT1NfUkVMSUFCSUxJVFkJMHgwNAorI2RlZmluZQlJUFRPU19MT1dDT1NUCQkweDAyCisjZGVmaW5lCUlQVE9TX01JTkNPU1QJCUlQVE9TX0xPV0NPU1QKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBJUCBwcmVjZWRlbmNlIChhbHNvIGluIGlwX3RvcykgW2Fsc28gZGVwcmVjYXRlZC5dCisgKi8KKyNkZWZpbmUJSVBUT1NfUFJFQ19NQVNLCQkJSVBUT1NfQ0xBU1NfTUFTSworI2RlZmluZQlJUFRPU19QUkVDKHRvcykJCQlJUFRPU19DTEFTUyh0b3MpCisjZGVmaW5lCUlQVE9TX1BSRUNfTkVUQ09OVFJPTAkJSVBUT1NfQ0xBU1NfQ1M3CisjZGVmaW5lCUlQVE9TX1BSRUNfSU5URVJORVRDT05UUk9MCUlQVE9TX0NMQVNTX0NTNgorI2RlZmluZQlJUFRPU19QUkVDX0NSSVRJQ19FQ1AJCUlQVE9TX0NMQVNTX0NTNQorI2RlZmluZQlJUFRPU19QUkVDX0ZMQVNIT1ZFUlJJREUJSVBUT1NfQ0xBU1NfQ1M0CisjZGVmaW5lCUlQVE9TX1BSRUNfRkxBU0gJCUlQVE9TX0NMQVNTX0NTMworI2RlZmluZQlJUFRPU19QUkVDX0lNTUVESUFURQkJSVBUT1NfQ0xBU1NfQ1MyCisjZGVmaW5lCUlQVE9TX1BSRUNfUFJJT1JJVFkJCUlQVE9TX0NMQVNTX0NTMQorI2RlZmluZQlJUFRPU19QUkVDX1JPVVRJTkUJCUlQVE9TX0NMQVNTX0NTMAorCisvKgorICogRGVmaW5pdGlvbnMgZm9yIG9wdGlvbnMuCisgKi8KKyNkZWZpbmUJSVBPUFRfQ09QWQkJMHg4MAorI2RlZmluZQlJUE9QVF9DTEFTU19NQVNLCTB4NjAKKyNkZWZpbmUJSVBPUFRfTlVNQkVSX01BU0sJMHgxZgorCisjZGVmaW5lCUlQT1BUX0NPUElFRChvKQkJKChvKSAmIElQT1BUX0NPUFkpCisjZGVmaW5lCUlQT1BUX0NMQVNTKG8pCQkoKG8pICYgSVBPUFRfQ0xBU1NfTUFTSykKKyNkZWZpbmUJSVBPUFRfTlVNQkVSKG8pCQkoKG8pICYgSVBPUFRfTlVNQkVSX01BU0spCisKKyNkZWZpbmUJSVBPUFRfQ09OVFJPTAkJMHgwMAorI2RlZmluZQlJUE9QVF9SRVNFUlZFRDEJCTB4MjAKKyNkZWZpbmUJSVBPUFRfREVCTUVBUwkJMHg0MAorI2RlZmluZQlJUE9QVF9NRUFTVVJFTUVOVCAgICAgICBJUE9QVF9ERUJNRUFTCisjZGVmaW5lCUlQT1BUX1JFU0VSVkVEMgkJMHg2MAorCisjZGVmaW5lCUlQT1BUX0VPTAkJMAkJLyogZW5kIG9mIG9wdGlvbiBsaXN0ICovCisjZGVmaW5lCUlQT1BUX0VORAkJSVBPUFRfRU9MCisjZGVmaW5lCUlQT1BUX05PUAkJMQkJLyogbm8gb3BlcmF0aW9uICovCisjZGVmaW5lCUlQT1BUX05PT1AJCUlQT1BUX05PUAorCisjZGVmaW5lCUlQT1BUX1JSCQk3CQkvKiByZWNvcmQgcGFja2V0IHJvdXRlICovCisjZGVmaW5lCUlQT1BUX1RTCQk2OAkJLyogdGltZXN0YW1wICovCisjZGVmaW5lCUlQT1BUX1RJTUVTVEFNUAkJSVBPUFRfVFMKKyNkZWZpbmUJSVBPUFRfU0VDVVJJVFkJCTEzMAkJLyogcHJvdmlkZSBzLGMsaCx0Y2MgKi8KKyNkZWZpbmUJSVBPUFRfU0VDCQlJUE9QVF9TRUNVUklUWQorI2RlZmluZQlJUE9QVF9MU1JSCQkxMzEJCS8qIGxvb3NlIHNvdXJjZSByb3V0ZSAqLworI2RlZmluZQlJUE9QVF9TQVRJRAkJMTM2CQkvKiBzYXRuZXQgaWQgKi8KKyNkZWZpbmUJSVBPUFRfU0lECQlJUE9QVF9TQVRJRAorI2RlZmluZQlJUE9QVF9TU1JSCQkxMzcJCS8qIHN0cmljdCBzb3VyY2Ugcm91dGUgKi8KKyNkZWZpbmUJSVBPUFRfUkEJCTE0OAkJLyogcm91dGVyIGFsZXJ0ICovCisKKy8qCisgKiBPZmZzZXRzIHRvIGZpZWxkcyBpbiBvcHRpb25zIG90aGVyIHRoYW4gRU9MIGFuZCBOT1AuCisgKi8KKyNkZWZpbmUJSVBPUFRfT1BUVkFMCQkwCQkvKiBvcHRpb24gSUQgKi8KKyNkZWZpbmUJSVBPUFRfT0xFTgkJMQkJLyogb3B0aW9uIGxlbmd0aCAqLworI2RlZmluZQlJUE9QVF9PRkZTRVQJCTIJCS8qIG9mZnNldCB3aXRoaW4gb3B0aW9uICovCisjZGVmaW5lCUlQT1BUX01JTk9GRgkJNAkJLyogbWluIHZhbHVlIG9mIGFib3ZlICovCisKKyNkZWZpbmUJTUFYX0lQT1BUTEVOCQk0MAorCisvKiBmbGFnIGJpdHMgZm9yIGlwdF9mbGcgKi8KKyNkZWZpbmUJSVBPUFRfVFNfVFNPTkxZCQkwCQkvKiB0aW1lc3RhbXBzIG9ubHkgKi8KKyNkZWZpbmUJSVBPUFRfVFNfVFNBTkRBRERSCTEJCS8qIHRpbWVzdGFtcHMgYW5kIGFkZHJlc3NlcyAqLworI2RlZmluZQlJUE9QVF9UU19QUkVTUEVDCTMJCS8qIHNwZWNpZmllZCBtb2R1bGVzIG9ubHkgKi8KKworLyogYml0cyBmb3Igc2VjdXJpdHkgKG5vdCBieXRlIHN3YXBwZWQpICovCisjZGVmaW5lCUlQT1BUX1NFQ1VSX1VOQ0xBU1MJMHgwMDAwCisjZGVmaW5lCUlQT1BUX1NFQ1VSX0NPTkZJRAkweGYxMzUKKyNkZWZpbmUJSVBPUFRfU0VDVVJfRUZUTwkweDc4OWEKKyNkZWZpbmUJSVBPUFRfU0VDVVJfTU1NTQkweGJjNGQKKyNkZWZpbmUJSVBPUFRfU0VDVVJfUkVTVFIJMHhhZjEzCisjZGVmaW5lCUlQT1BUX1NFQ1VSX1NFQ1JFVAkweGQ3ODgKKyNkZWZpbmUJSVBPUFRfU0VDVVJfVE9QU0VDUkVUCTB4NmJjNQorCisvKgorICogSW50ZXJuZXQgaW1wbGVtZW50YXRpb24gcGFyYW1ldGVycy4KKyAqLworI2RlZmluZQlNQVhUVEwJCTI1NQkJLyogbWF4aW11bSB0aW1lIHRvIGxpdmUgKHNlY29uZHMpICovCisjZGVmaW5lCUlQREVGVFRMCTY0CQkvKiBkZWZhdWx0IHR0bCwgZnJvbSBSRkMgMTM0MCAqLworI2RlZmluZQlJUEZSQUdUVEwJNjAJCS8qIHRpbWUgdG8gbGl2ZSBmb3IgZnJhZ3MsIHNsb3doeiAqLworI2RlZmluZQlJUFRUTERFQwkxCQkvKiBzdWJ0cmFjdGVkIHdoZW4gZm9yd2FyZGluZyAqLworCisjZGVmaW5lCUlQX01TUwkJNTc2CQkvKiBkZWZhdWx0IG1heGltdW0gc2VnbWVudCBzaXplICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBuZXRpbmV0L2lwLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pcDYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pcDYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWYyYWYyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lwNi5oCkBAIC0wLDAgKzEsMTg5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgMjAwMSwgMjAwMywgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkVUSU5FVF9JUDZfSAorI2RlZmluZSBfTkVUSU5FVF9JUDZfSCAxCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworc3RydWN0IGlwNl9oZHIKKyAgeworICAgIHVuaW9uCisgICAgICB7CisJc3RydWN0IGlwNl9oZHJjdGwKKwkgIHsKKwkgICAgdWludDMyX3QgaXA2X3VuMV9mbG93OyAgIC8qIDQgYml0cyB2ZXJzaW9uLCA4IGJpdHMgVEMsCisJCQkJCTIwIGJpdHMgZmxvdy1JRCAqLworCSAgICB1aW50MTZfdCBpcDZfdW4xX3BsZW47ICAgLyogcGF5bG9hZCBsZW5ndGggKi8KKwkgICAgdWludDhfdCAgaXA2X3VuMV9ueHQ7ICAgIC8qIG5leHQgaGVhZGVyICovCisJICAgIHVpbnQ4X3QgIGlwNl91bjFfaGxpbTsgICAvKiBob3AgbGltaXQgKi8KKwkgIH0gaXA2X3VuMTsKKwl1aW50OF90IGlwNl91bjJfdmZjOyAgICAgICAvKiA0IGJpdHMgdmVyc2lvbiwgdG9wIDQgYml0cyB0Y2xhc3MgKi8KKyAgICAgIH0gaXA2X2N0bHVuOworICAgIHN0cnVjdCBpbjZfYWRkciBpcDZfc3JjOyAgICAgIC8qIHNvdXJjZSBhZGRyZXNzICovCisgICAgc3RydWN0IGluNl9hZGRyIGlwNl9kc3Q7ICAgICAgLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworICB9OworCisjZGVmaW5lIGlwNl92ZmMgICBpcDZfY3RsdW4uaXA2X3VuMl92ZmMKKyNkZWZpbmUgaXA2X2Zsb3cgIGlwNl9jdGx1bi5pcDZfdW4xLmlwNl91bjFfZmxvdworI2RlZmluZSBpcDZfcGxlbiAgaXA2X2N0bHVuLmlwNl91bjEuaXA2X3VuMV9wbGVuCisjZGVmaW5lIGlwNl9ueHQgICBpcDZfY3RsdW4uaXA2X3VuMS5pcDZfdW4xX254dAorI2RlZmluZSBpcDZfaGxpbSAgaXA2X2N0bHVuLmlwNl91bjEuaXA2X3VuMV9obGltCisjZGVmaW5lIGlwNl9ob3BzICBpcDZfY3RsdW4uaXA2X3VuMS5pcDZfdW4xX2hsaW0KKworLyogR2VuZXJpYyBleHRlbnNpb24gaGVhZGVyLiAgKi8KK3N0cnVjdCBpcDZfZXh0CisgIHsKKyAgICB1aW50OF90ICBpcDZlX254dDsJCS8qIG5leHQgaGVhZGVyLiAgKi8KKyAgICB1aW50OF90ICBpcDZlX2xlbjsJCS8qIGxlbmd0aCBpbiB1bml0cyBvZiA4IG9jdGV0cy4gICovCisgIH07CisKKy8qIEhvcC1ieS1Ib3Agb3B0aW9ucyBoZWFkZXIuICAqLworc3RydWN0IGlwNl9oYmgKKyAgeworICAgIHVpbnQ4X3QgIGlwNmhfbnh0OwkJLyogbmV4dCBoZWFkZXIuICAqLworICAgIHVpbnQ4X3QgIGlwNmhfbGVuOwkJLyogbGVuZ3RoIGluIHVuaXRzIG9mIDggb2N0ZXRzLiAgKi8KKyAgICAvKiBmb2xsb3dlZCBieSBvcHRpb25zICovCisgIH07CisKKy8qIERlc3RpbmF0aW9uIG9wdGlvbnMgaGVhZGVyICovCitzdHJ1Y3QgaXA2X2Rlc3QKKyAgeworICAgIHVpbnQ4X3QgIGlwNmRfbnh0OwkJLyogbmV4dCBoZWFkZXIgKi8KKyAgICB1aW50OF90ICBpcDZkX2xlbjsJCS8qIGxlbmd0aCBpbiB1bml0cyBvZiA4IG9jdGV0cyAqLworICAgIC8qIGZvbGxvd2VkIGJ5IG9wdGlvbnMgKi8KKyAgfTsKKworLyogUm91dGluZyBoZWFkZXIgKi8KK3N0cnVjdCBpcDZfcnRoZHIKKyAgeworICAgIHVpbnQ4X3QgIGlwNnJfbnh0OwkJLyogbmV4dCBoZWFkZXIgKi8KKyAgICB1aW50OF90ICBpcDZyX2xlbjsJCS8qIGxlbmd0aCBpbiB1bml0cyBvZiA4IG9jdGV0cyAqLworICAgIHVpbnQ4X3QgIGlwNnJfdHlwZTsJCS8qIHJvdXRpbmcgdHlwZSAqLworICAgIHVpbnQ4X3QgIGlwNnJfc2VnbGVmdDsJLyogc2VnbWVudHMgbGVmdCAqLworICAgIC8qIGZvbGxvd2VkIGJ5IHJvdXRpbmcgdHlwZSBzcGVjaWZpYyBkYXRhICovCisgIH07CisKKy8qIFR5cGUgMCBSb3V0aW5nIGhlYWRlciAqLworc3RydWN0IGlwNl9ydGhkcjAKKyAgeworICAgIHVpbnQ4X3QgIGlwNnIwX254dDsJCS8qIG5leHQgaGVhZGVyICovCisgICAgdWludDhfdCAgaXA2cjBfbGVuOwkJLyogbGVuZ3RoIGluIHVuaXRzIG9mIDggb2N0ZXRzICovCisgICAgdWludDhfdCAgaXA2cjBfdHlwZTsJLyogYWx3YXlzIHplcm8gKi8KKyAgICB1aW50OF90ICBpcDZyMF9zZWdsZWZ0OwkvKiBzZWdtZW50cyBsZWZ0ICovCisgICAgdWludDhfdCAgaXA2cjBfcmVzZXJ2ZWQ7CS8qIHJlc2VydmVkIGZpZWxkICovCisgICAgdWludDhfdCAgaXA2cjBfc2xtYXBbM107CS8qIHN0cmljdC9sb29zZSBiaXQgbWFwICovCisgICAgLyogZm9sbG93ZWQgYnkgdXAgdG8gMTI3IHN0cnVjdCBpbjZfYWRkciAqLworICAgIHN0cnVjdCBpbjZfYWRkciBpcDZyMF9hZGRyWzBdOworICB9OworCisvKiBGcmFnbWVudCBoZWFkZXIgKi8KK3N0cnVjdCBpcDZfZnJhZworICB7CisgICAgdWludDhfdCAgIGlwNmZfbnh0OwkJLyogbmV4dCBoZWFkZXIgKi8KKyAgICB1aW50OF90ICAgaXA2Zl9yZXNlcnZlZDsJLyogcmVzZXJ2ZWQgZmllbGQgKi8KKyAgICB1aW50MTZfdCAgaXA2Zl9vZmZsZzsJLyogb2Zmc2V0LCByZXNlcnZlZCwgYW5kIGZsYWcgKi8KKyAgICB1aW50MzJfdCAgaXA2Zl9pZGVudDsJLyogaWRlbnRpZmljYXRpb24gKi8KKyAgfTsKKworI2lmIEJZVEVfT1JERVIgPT0gQklHX0VORElBTgorIyBkZWZpbmUgSVA2Rl9PRkZfTUFTSyAgICAgICAweGZmZjggIC8qIG1hc2sgb3V0IG9mZnNldCBmcm9tIF9vZmZsZyAqLworIyBkZWZpbmUgSVA2Rl9SRVNFUlZFRF9NQVNLICAweDAwMDYgIC8qIHJlc2VydmVkIGJpdHMgaW4gaXA2Zl9vZmZsZyAqLworIyBkZWZpbmUgSVA2Rl9NT1JFX0ZSQUcgICAgICAweDAwMDEgIC8qIG1vcmUtZnJhZ21lbnRzIGZsYWcgKi8KKyNlbHNlICAgLyogQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOICovCisjIGRlZmluZSBJUDZGX09GRl9NQVNLICAgICAgIDB4ZjhmZiAgLyogbWFzayBvdXQgb2Zmc2V0IGZyb20gX29mZmxnICovCisjIGRlZmluZSBJUDZGX1JFU0VSVkVEX01BU0sgIDB4MDYwMCAgLyogcmVzZXJ2ZWQgYml0cyBpbiBpcDZmX29mZmxnICovCisjIGRlZmluZSBJUDZGX01PUkVfRlJBRyAgICAgIDB4MDEwMCAgLyogbW9yZS1mcmFnbWVudHMgZmxhZyAqLworI2VuZGlmCisKKy8qIElQdjYgb3B0aW9ucyAqLworc3RydWN0IGlwNl9vcHQKKyAgeworICAgIHVpbnQ4X3QgIGlwNm9fdHlwZTsKKyAgICB1aW50OF90ICBpcDZvX2xlbjsKKyAgfTsKKworLyogVGhlIGhpZ2gtb3JkZXIgMyBiaXRzIG9mIHRoZSBvcHRpb24gdHlwZSBkZWZpbmUgdGhlIGJlaGF2aW9yCisgKiB3aGVuIHByb2Nlc3NpbmcgYW4gdW5rbm93biBvcHRpb24gYW5kIHdoZXRoZXIgb3Igbm90IHRoZSBvcHRpb24KKyAqIGNvbnRlbnQgY2hhbmdlcyBpbiBmbGlnaHQuCisgKi8KKyNkZWZpbmUgSVA2T1BUX1RZUEUobykJCSgobykgJiAweGMwKQorI2RlZmluZSBJUDZPUFRfVFlQRV9TS0lQCTB4MDAKKyNkZWZpbmUgSVA2T1BUX1RZUEVfRElTQ0FSRAkweDQwCisjZGVmaW5lIElQNk9QVF9UWVBFX0ZPUkNFSUNNUAkweDgwCisjZGVmaW5lIElQNk9QVF9UWVBFX0lDTVAJMHhjMAorI2RlZmluZSBJUDZPUFRfVFlQRV9NVVRBQkxFCTB4MjAKKworLyogU3BlY2lhbCBvcHRpb24gdHlwZXMgZm9yIHBhZGRpbmcuICAqLworI2RlZmluZSBJUDZPUFRfUEFEMQkwCisjZGVmaW5lIElQNk9QVF9QQUROCTEKKworI2RlZmluZSBJUDZPUFRfSlVNQk8JCTB4YzIKKyNkZWZpbmUgSVA2T1BUX05TQVBfQUREUgkweGMzCisjZGVmaW5lIElQNk9QVF9UVU5ORUxfTElNSVQJMHgwNAorI2RlZmluZSBJUDZPUFRfUk9VVEVSX0FMRVJUCTB4MDUKKworLyogSnVtYm8gUGF5bG9hZCBPcHRpb24gKi8KK3N0cnVjdCBpcDZfb3B0X2p1bWJvCisgIHsKKyAgICB1aW50OF90ICBpcDZval90eXBlOworICAgIHVpbnQ4X3QgIGlwNm9qX2xlbjsKKyAgICB1aW50OF90ICBpcDZval9qdW1ib19sZW5bNF07CisgIH07CisjZGVmaW5lIElQNk9QVF9KVU1CT19MRU4JNgorCisvKiBOU0FQIEFkZHJlc3MgT3B0aW9uICovCitzdHJ1Y3QgaXA2X29wdF9uc2FwCisgIHsKKyAgICB1aW50OF90ICBpcDZvbl90eXBlOworICAgIHVpbnQ4X3QgIGlwNm9uX2xlbjsKKyAgICB1aW50OF90ICBpcDZvbl9zcmNfbnNhcF9sZW47CisgICAgdWludDhfdCAgaXA2b25fZHN0X25zYXBfbGVuOworICAgICAgLyogZm9sbG93ZWQgYnkgc291cmNlIE5TQVAgKi8KKyAgICAgIC8qIGZvbGxvd2VkIGJ5IGRlc3RpbmF0aW9uIE5TQVAgKi8KKyAgfTsKKworLyogVHVubmVsIExpbWl0IE9wdGlvbiAqLworc3RydWN0IGlwNl9vcHRfdHVubmVsCisgIHsKKyAgICB1aW50OF90ICBpcDZvdF90eXBlOworICAgIHVpbnQ4X3QgIGlwNm90X2xlbjsKKyAgICB1aW50OF90ICBpcDZvdF9lbmNhcF9saW1pdDsKKyAgfTsKKworLyogUm91dGVyIEFsZXJ0IE9wdGlvbiAqLworc3RydWN0IGlwNl9vcHRfcm91dGVyCisgIHsKKyAgICB1aW50OF90ICBpcDZvcl90eXBlOworICAgIHVpbnQ4X3QgIGlwNm9yX2xlbjsKKyAgICB1aW50OF90ICBpcDZvcl92YWx1ZVsyXTsKKyAgfTsKKworLyogUm91dGVyIGFsZXJ0IHZhbHVlcyAoaW4gbmV0d29yayBieXRlIG9yZGVyKSAqLworI2lmIEJZVEVfT1JERVIgPT0gQklHX0VORElBTgorIyBkZWZpbmUgSVA2X0FMRVJUX01MRAkweDAwMDAKKyMgZGVmaW5lIElQNl9BTEVSVF9SU1ZQCTB4MDAwMQorIyBkZWZpbmUgSVA2X0FMRVJUX0FOCTB4MDAwMgorI2Vsc2UgLyogQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESU5HICovCisjIGRlZmluZSBJUDZfQUxFUlRfTUxECTB4MDAwMAorIyBkZWZpbmUgSVA2X0FMRVJUX1JTVlAJMHgwMTAwCisjIGRlZmluZSBJUDZfQUxFUlRfQU4JMHgwMjAwCisjZW5kaWYKKworI2VuZGlmIC8qIG5ldGluZXQvaXA2LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pcF9pY21wLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaXBfaWNtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYzhlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaXBfaWNtcC5oCkBAIC0wLDAgKzEsMjgzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTUsIDk2LCA5NywgOTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX19ORVRJTkVUX0lQX0lDTVBfSAorI2RlZmluZSBfX05FVElORVRfSVBfSUNNUF9IICAgIDEKKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKK3N0cnVjdCBpY21waGRyCit7CisgIHVfaW50OF90IHR5cGU7CQkvKiBtZXNzYWdlIHR5cGUgKi8KKyAgdV9pbnQ4X3QgY29kZTsJCS8qIHR5cGUgc3ViLWNvZGUgKi8KKyAgdV9pbnQxNl90IGNoZWNrc3VtOworICB1bmlvbgorICB7CisgICAgc3RydWN0CisgICAgeworICAgICAgdV9pbnQxNl90CWlkOworICAgICAgdV9pbnQxNl90CXNlcXVlbmNlOworICAgIH0gZWNobzsJCQkvKiBlY2hvIGRhdGFncmFtICovCisgICAgdV9pbnQzMl90CWdhdGV3YXk7CS8qIGdhdGV3YXkgYWRkcmVzcyAqLworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIHVfaW50MTZfdAlfX3VudXNlZDsKKyAgICAgIHVfaW50MTZfdAltdHU7CisgICAgfSBmcmFnOwkJCS8qIHBhdGggbXR1IGRpc2NvdmVyeSAqLworICB9IHVuOworfTsKKworI2RlZmluZSBJQ01QX0VDSE9SRVBMWQkJMAkvKiBFY2hvIFJlcGx5CQkJKi8KKyNkZWZpbmUgSUNNUF9ERVNUX1VOUkVBQ0gJMwkvKiBEZXN0aW5hdGlvbiBVbnJlYWNoYWJsZQkqLworI2RlZmluZSBJQ01QX1NPVVJDRV9RVUVOQ0gJNAkvKiBTb3VyY2UgUXVlbmNoCQkqLworI2RlZmluZSBJQ01QX1JFRElSRUNUCQk1CS8qIFJlZGlyZWN0IChjaGFuZ2Ugcm91dGUpCSovCisjZGVmaW5lIElDTVBfRUNITwkJOAkvKiBFY2hvIFJlcXVlc3QJCQkqLworI2RlZmluZSBJQ01QX1RJTUVfRVhDRUVERUQJMTEJLyogVGltZSBFeGNlZWRlZAkJKi8KKyNkZWZpbmUgSUNNUF9QQVJBTUVURVJQUk9CCTEyCS8qIFBhcmFtZXRlciBQcm9ibGVtCQkqLworI2RlZmluZSBJQ01QX1RJTUVTVEFNUAkJMTMJLyogVGltZXN0YW1wIFJlcXVlc3QJCSovCisjZGVmaW5lIElDTVBfVElNRVNUQU1QUkVQTFkJMTQJLyogVGltZXN0YW1wIFJlcGx5CQkqLworI2RlZmluZSBJQ01QX0lORk9fUkVRVUVTVAkxNQkvKiBJbmZvcm1hdGlvbiBSZXF1ZXN0CQkqLworI2RlZmluZSBJQ01QX0lORk9fUkVQTFkJCTE2CS8qIEluZm9ybWF0aW9uIFJlcGx5CQkqLworI2RlZmluZSBJQ01QX0FERFJFU1MJCTE3CS8qIEFkZHJlc3MgTWFzayBSZXF1ZXN0CQkqLworI2RlZmluZSBJQ01QX0FERFJFU1NSRVBMWQkxOAkvKiBBZGRyZXNzIE1hc2sgUmVwbHkJCSovCisjZGVmaW5lIE5SX0lDTVBfVFlQRVMJCTE4CisKKworLyogQ29kZXMgZm9yIFVOUkVBQ0guICovCisjZGVmaW5lIElDTVBfTkVUX1VOUkVBQ0gJMAkvKiBOZXR3b3JrIFVucmVhY2hhYmxlCQkqLworI2RlZmluZSBJQ01QX0hPU1RfVU5SRUFDSAkxCS8qIEhvc3QgVW5yZWFjaGFibGUJCSovCisjZGVmaW5lIElDTVBfUFJPVF9VTlJFQUNICTIJLyogUHJvdG9jb2wgVW5yZWFjaGFibGUJCSovCisjZGVmaW5lIElDTVBfUE9SVF9VTlJFQUNICTMJLyogUG9ydCBVbnJlYWNoYWJsZQkJKi8KKyNkZWZpbmUgSUNNUF9GUkFHX05FRURFRAk0CS8qIEZyYWdtZW50YXRpb24gTmVlZGVkL0RGIHNldAkqLworI2RlZmluZSBJQ01QX1NSX0ZBSUxFRAkJNQkvKiBTb3VyY2UgUm91dGUgZmFpbGVkCQkqLworI2RlZmluZSBJQ01QX05FVF9VTktOT1dOCTYKKyNkZWZpbmUgSUNNUF9IT1NUX1VOS05PV04JNworI2RlZmluZSBJQ01QX0hPU1RfSVNPTEFURUQJOAorI2RlZmluZSBJQ01QX05FVF9BTk8JCTkKKyNkZWZpbmUgSUNNUF9IT1NUX0FOTwkJMTAKKyNkZWZpbmUgSUNNUF9ORVRfVU5SX1RPUwkxMQorI2RlZmluZSBJQ01QX0hPU1RfVU5SX1RPUwkxMgorI2RlZmluZSBJQ01QX1BLVF9GSUxURVJFRAkxMwkvKiBQYWNrZXQgZmlsdGVyZWQgKi8KKyNkZWZpbmUgSUNNUF9QUkVDX1ZJT0xBVElPTgkxNAkvKiBQcmVjZWRlbmNlIHZpb2xhdGlvbiAqLworI2RlZmluZSBJQ01QX1BSRUNfQ1VUT0ZGCTE1CS8qIFByZWNlZGVuY2UgY3V0IG9mZiAqLworI2RlZmluZSBOUl9JQ01QX1VOUkVBQ0gJCTE1CS8qIGluc3RlYWQgb2YgaGFyZGNvZGluZyBpbW1lZGlhdGUgdmFsdWUgKi8KKworLyogQ29kZXMgZm9yIFJFRElSRUNULiAqLworI2RlZmluZSBJQ01QX1JFRElSX05FVAkJMAkvKiBSZWRpcmVjdCBOZXQJCQkqLworI2RlZmluZSBJQ01QX1JFRElSX0hPU1QJCTEJLyogUmVkaXJlY3QgSG9zdAkJKi8KKyNkZWZpbmUgSUNNUF9SRURJUl9ORVRUT1MJMgkvKiBSZWRpcmVjdCBOZXQgZm9yIFRPUwkJKi8KKyNkZWZpbmUgSUNNUF9SRURJUl9IT1NUVE9TCTMJLyogUmVkaXJlY3QgSG9zdCBmb3IgVE9TCSovCisKKy8qIENvZGVzIGZvciBUSU1FX0VYQ0VFREVELiAqLworI2RlZmluZSBJQ01QX0VYQ19UVEwJCTAJLyogVFRMIGNvdW50IGV4Y2VlZGVkCQkqLworI2RlZmluZSBJQ01QX0VYQ19GUkFHVElNRQkxCS8qIEZyYWdtZW50IFJlYXNzIHRpbWUgZXhjZWVkZWQJKi8KKworCisjaWZkZWYgX19VU0VfQlNECisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWlwX2ljbXAuaAk4LjEgKEJlcmtlbGV5KSA2LzEwLzkzCisgKi8KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisKKy8qCisgKiBJbnRlcm5hbCBvZiBhbiBJQ01QIFJvdXRlciBBZHZlcnRpc2VtZW50CisgKi8KK3N0cnVjdCBpY21wX3JhX2FkZHIKK3sKKyAgdV9pbnQzMl90IGlyYV9hZGRyOworICB1X2ludDMyX3QgaXJhX3ByZWZlcmVuY2U7Cit9OworCitzdHJ1Y3QgaWNtcAoreworICB1X2ludDhfdCAgaWNtcF90eXBlOwkvKiB0eXBlIG9mIG1lc3NhZ2UsIHNlZSBiZWxvdyAqLworICB1X2ludDhfdCAgaWNtcF9jb2RlOwkvKiB0eXBlIHN1YiBjb2RlICovCisgIHVfaW50MTZfdCBpY21wX2Nrc3VtOwkvKiBvbmVzIGNvbXBsZW1lbnQgY2hlY2tzdW0gb2Ygc3RydWN0ICovCisgIHVuaW9uCisgIHsKKyAgICB1X2NoYXIgaWhfcHB0cjsJCS8qIElDTVBfUEFSQU1QUk9CICovCisgICAgc3RydWN0IGluX2FkZHIgaWhfZ3dhZGRyOwkvKiBnYXRld2F5IGFkZHJlc3MgKi8KKyAgICBzdHJ1Y3QgaWhfaWRzZXEJCS8qIGVjaG8gZGF0YWdyYW0gKi8KKyAgICB7CisgICAgICB1X2ludDE2X3QgaWNkX2lkOworICAgICAgdV9pbnQxNl90IGljZF9zZXE7CisgICAgfSBpaF9pZHNlcTsKKyAgICB1X2ludDMyX3QgaWhfdm9pZDsKKworICAgIC8qIElDTVBfVU5SRUFDSF9ORUVERlJBRyAtLSBQYXRoIE1UVSBEaXNjb3ZlcnkgKFJGQzExOTEpICovCisgICAgc3RydWN0IGloX3BtdHUKKyAgICB7CisgICAgICB1X2ludDE2X3QgaXBtX3ZvaWQ7CisgICAgICB1X2ludDE2X3QgaXBtX25leHRtdHU7CisgICAgfSBpaF9wbXR1OworCisgICAgc3RydWN0IGloX3J0cmFkdgorICAgIHsKKyAgICAgIHVfaW50OF90IGlydF9udW1fYWRkcnM7CisgICAgICB1X2ludDhfdCBpcnRfd3BhOworICAgICAgdV9pbnQxNl90IGlydF9saWZldGltZTsKKyAgICB9IGloX3J0cmFkdjsKKyAgfSBpY21wX2h1bjsKKyNkZWZpbmUJaWNtcF9wcHRyCWljbXBfaHVuLmloX3BwdHIKKyNkZWZpbmUJaWNtcF9nd2FkZHIJaWNtcF9odW4uaWhfZ3dhZGRyCisjZGVmaW5lCWljbXBfaWQJCWljbXBfaHVuLmloX2lkc2VxLmljZF9pZAorI2RlZmluZQlpY21wX3NlcQlpY21wX2h1bi5paF9pZHNlcS5pY2Rfc2VxCisjZGVmaW5lCWljbXBfdm9pZAlpY21wX2h1bi5paF92b2lkCisjZGVmaW5lCWljbXBfcG12b2lkCWljbXBfaHVuLmloX3BtdHUuaXBtX3ZvaWQKKyNkZWZpbmUJaWNtcF9uZXh0bXR1CWljbXBfaHVuLmloX3BtdHUuaXBtX25leHRtdHUKKyNkZWZpbmUJaWNtcF9udW1fYWRkcnMJaWNtcF9odW4uaWhfcnRyYWR2LmlydF9udW1fYWRkcnMKKyNkZWZpbmUJaWNtcF93cGEJaWNtcF9odW4uaWhfcnRyYWR2LmlydF93cGEKKyNkZWZpbmUJaWNtcF9saWZldGltZQlpY21wX2h1bi5paF9ydHJhZHYuaXJ0X2xpZmV0aW1lCisgIHVuaW9uCisgIHsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICB1X2ludDMyX3QgaXRzX290aW1lOworICAgICAgdV9pbnQzMl90IGl0c19ydGltZTsKKyAgICAgIHVfaW50MzJfdCBpdHNfdHRpbWU7CisgICAgfSBpZF90czsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICBzdHJ1Y3QgaXAgaWRpX2lwOworICAgICAgLyogb3B0aW9ucyBhbmQgdGhlbiA2NCBiaXRzIG9mIGRhdGEgKi8KKyAgICB9IGlkX2lwOworICAgIHN0cnVjdCBpY21wX3JhX2FkZHIgaWRfcmFkdjsKKyAgICB1X2ludDMyX3QgICBpZF9tYXNrOworICAgIHVfaW50OF90ICAgIGlkX2RhdGFbMV07CisgIH0gaWNtcF9kdW47CisjZGVmaW5lCWljbXBfb3RpbWUJaWNtcF9kdW4uaWRfdHMuaXRzX290aW1lCisjZGVmaW5lCWljbXBfcnRpbWUJaWNtcF9kdW4uaWRfdHMuaXRzX3J0aW1lCisjZGVmaW5lCWljbXBfdHRpbWUJaWNtcF9kdW4uaWRfdHMuaXRzX3R0aW1lCisjZGVmaW5lCWljbXBfaXAJCWljbXBfZHVuLmlkX2lwLmlkaV9pcAorI2RlZmluZQlpY21wX3JhZHYJaWNtcF9kdW4uaWRfcmFkdgorI2RlZmluZQlpY21wX21hc2sJaWNtcF9kdW4uaWRfbWFzaworI2RlZmluZQlpY21wX2RhdGEJaWNtcF9kdW4uaWRfZGF0YQorfTsKKworLyoKKyAqIExvd2VyIGJvdW5kcyBvbiBwYWNrZXQgbGVuZ3RocyBmb3IgdmFyaW91cyB0eXBlcy4KKyAqIEZvciB0aGUgZXJyb3IgYWR2aWNlIHBhY2tldHMgbXVzdCBmaXJzdCBpbnN1cmUgdGhhdCB0aGUKKyAqIHBhY2tldCBpcyBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiB0aGUgcmV0dXJuZWQgaXAgaGVhZGVyLgorICogT25seSB0aGVuIGNhbiB3ZSBkbyB0aGUgY2hlY2sgdG8gc2VlIGlmIDY0IGJpdHMgb2YgcGFja2V0CisgKiBkYXRhIGhhdmUgYmVlbiByZXR1cm5lZCwgc2luY2Ugd2UgbmVlZCB0byBjaGVjayB0aGUgcmV0dXJuZWQKKyAqIGlwIGhlYWRlciBsZW5ndGguCisgKi8KKyNkZWZpbmUJSUNNUF9NSU5MRU4JOAkJCQkvKiBhYnMgbWluaW11bSAqLworI2RlZmluZQlJQ01QX1RTTEVOCSg4ICsgMyAqIHNpemVvZiAobl90aW1lKSkJLyogdGltZXN0YW1wICovCisjZGVmaW5lCUlDTVBfTUFTS0xFTgkxMgkJCQkvKiBhZGRyZXNzIG1hc2sgKi8KKyNkZWZpbmUJSUNNUF9BRFZMRU5NSU4JKDggKyBzaXplb2YgKHN0cnVjdCBpcCkgKyA4KQkvKiBtaW4gKi8KKyNpZm5kZWYgX0lQX1ZITAorI2RlZmluZQlJQ01QX0FEVkxFTihwKQkoOCArICgocCktPmljbXBfaXAuaXBfaGwgPDwgMikgKyA4KQorCS8qIE4uQi46IG11c3Qgc2VwYXJhdGVseSBjaGVjayB0aGF0IGlwX2hsID49IDUgKi8KKyNlbHNlCisjZGVmaW5lCUlDTVBfQURWTEVOKHApCSg4ICsgKElQX1ZITF9ITCgocCktPmljbXBfaXAuaXBfdmhsKSA8PCAyKSArIDgpCisJLyogTi5CLjogbXVzdCBzZXBhcmF0ZWx5IGNoZWNrIHRoYXQgaGVhZGVyIGxlbmd0aCA+PSA1ICovCisjZW5kaWYKKworLyogRGVmaW5pdGlvbiBvZiB0eXBlIGFuZCBjb2RlIGZpZWxkcy4gKi8KKy8qIGRlZmluZWQgYWJvdmU6IElDTVBfRUNIT1JFUExZLCBJQ01QX1JFRElSRUNULCBJQ01QX0VDSE8gKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNICQkzCQkvKiBkZXN0IHVucmVhY2hhYmxlLCBjb2RlczogKi8KKyNkZWZpbmUJSUNNUF9TT1VSQ0VRVUVOQ0gJNAkJLyogcGFja2V0IGxvc3QsIHNsb3cgZG93biAqLworI2RlZmluZQlJQ01QX1JPVVRFUkFEVkVSVAk5CQkvKiByb3V0ZXIgYWR2ZXJ0aXNlbWVudCAqLworI2RlZmluZQlJQ01QX1JPVVRFUlNPTElDSVQJMTAJCS8qIHJvdXRlciBzb2xpY2l0YXRpb24gKi8KKyNkZWZpbmUJSUNNUF9USU1YQ0VFRAkJMTEJCS8qIHRpbWUgZXhjZWVkZWQsIGNvZGU6ICovCisjZGVmaW5lCUlDTVBfUEFSQU1QUk9CCQkxMgkJLyogaXAgaGVhZGVyIGJhZCAqLworI2RlZmluZQlJQ01QX1RTVEFNUAkJMTMJCS8qIHRpbWVzdGFtcCByZXF1ZXN0ICovCisjZGVmaW5lCUlDTVBfVFNUQU1QUkVQTFkJMTQJCS8qIHRpbWVzdGFtcCByZXBseSAqLworI2RlZmluZQlJQ01QX0lSRVEJCTE1CQkvKiBpbmZvcm1hdGlvbiByZXF1ZXN0ICovCisjZGVmaW5lCUlDTVBfSVJFUVJFUExZCQkxNgkJLyogaW5mb3JtYXRpb24gcmVwbHkgKi8KKyNkZWZpbmUJSUNNUF9NQVNLUkVRCQkxNwkJLyogYWRkcmVzcyBtYXNrIHJlcXVlc3QgKi8KKyNkZWZpbmUJSUNNUF9NQVNLUkVQTFkJCTE4CQkvKiBhZGRyZXNzIG1hc2sgcmVwbHkgKi8KKworI2RlZmluZQlJQ01QX01BWFRZUEUJCTE4CisKKy8qIFVOUkVBQ0ggY29kZXMgKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNIX05FVAkgICAgICAgIDAJLyogYmFkIG5ldCAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0hfSE9TVAkgICAgICAgIDEJLyogYmFkIGhvc3QgKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNIX1BST1RPQ09MCSAgICAgICAgMgkvKiBiYWQgcHJvdG9jb2wgKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNIX1BPUlQJICAgICAgICAzCS8qIGJhZCBwb3J0ICovCisjZGVmaW5lCUlDTVBfVU5SRUFDSF9ORUVERlJBRwkgICAgICAgIDQJLyogSVBfREYgY2F1c2VkIGRyb3AgKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNIX1NSQ0ZBSUwJICAgICAgICA1CS8qIHNyYyByb3V0ZSBmYWlsZWQgKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNIX05FVF9VTktOT1dOICAgICAgICA2CS8qIHVua25vd24gbmV0ICovCisjZGVmaW5lCUlDTVBfVU5SRUFDSF9IT1NUX1VOS05PV04gICAgICAgNwkvKiB1bmtub3duIGhvc3QgKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNIX0lTT0xBVEVECSAgICAgICAgOAkvKiBzcmMgaG9zdCBpc29sYXRlZCAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0hfTkVUX1BST0hJQgkgICAgICAgIDkJLyogbmV0IGRlbmllZCAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0hfSE9TVF9QUk9ISUIgICAgICAgIDEwCS8qIGhvc3QgZGVuaWVkICovCisjZGVmaW5lCUlDTVBfVU5SRUFDSF9UT1NORVQJICAgICAgICAxMQkvKiBiYWQgdG9zIGZvciBuZXQgKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNIX1RPU0hPU1QJICAgICAgICAxMgkvKiBiYWQgdG9zIGZvciBob3N0ICovCisjZGVmaW5lCUlDTVBfVU5SRUFDSF9GSUxURVJfUFJPSElCICAgICAgMTMJLyogYWRtaW4gcHJvaGliICovCisjZGVmaW5lCUlDTVBfVU5SRUFDSF9IT1NUX1BSRUNFREVOQ0UgICAgMTQJLyogaG9zdCBwcmVjIHZpby4gKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNIX1BSRUNFREVOQ0VfQ1VUT0ZGICAxNQkvKiBwcmVjIGN1dG9mZiAqLworCisvKiBSRURJUkVDVCBjb2RlcyAqLworI2RlZmluZQlJQ01QX1JFRElSRUNUX05FVAkwCQkvKiBmb3IgbmV0d29yayAqLworI2RlZmluZQlJQ01QX1JFRElSRUNUX0hPU1QJMQkJLyogZm9yIGhvc3QgKi8KKyNkZWZpbmUJSUNNUF9SRURJUkVDVF9UT1NORVQJMgkJLyogZm9yIHRvcyBhbmQgbmV0ICovCisjZGVmaW5lCUlDTVBfUkVESVJFQ1RfVE9TSE9TVAkzCQkvKiBmb3IgdG9zIGFuZCBob3N0ICovCisKKy8qIFRJTUVYQ0VFRCBjb2RlcyAqLworI2RlZmluZQlJQ01QX1RJTVhDRUVEX0lOVFJBTlMJMAkJLyogdHRsPT0wIGluIHRyYW5zaXQgKi8KKyNkZWZpbmUJSUNNUF9USU1YQ0VFRF9SRUFTUwkxCQkvKiB0dGw9PTAgaW4gcmVhc3MgKi8KKworLyogUEFSQU1QUk9CIGNvZGUgKi8KKyNkZWZpbmUJSUNNUF9QQVJBTVBST0JfT1BUQUJTRU5UIDEJCS8qIHJlcS4gb3B0LiBhYnNlbnQgKi8KKworI2RlZmluZQlJQ01QX0lORk9UWVBFKHR5cGUpIFwKKwkoKHR5cGUpID09IElDTVBfRUNIT1JFUExZIHx8ICh0eXBlKSA9PSBJQ01QX0VDSE8gfHwgXAorCSh0eXBlKSA9PSBJQ01QX1JPVVRFUkFEVkVSVCB8fCAodHlwZSkgPT0gSUNNUF9ST1VURVJTT0xJQ0lUIHx8IFwKKwkodHlwZSkgPT0gSUNNUF9UU1RBTVAgfHwgKHR5cGUpID09IElDTVBfVFNUQU1QUkVQTFkgfHwgXAorCSh0eXBlKSA9PSBJQ01QX0lSRVEgfHwgKHR5cGUpID09IElDTVBfSVJFUVJFUExZIHx8IFwKKwkodHlwZSkgPT0gSUNNUF9NQVNLUkVRIHx8ICh0eXBlKSA9PSBJQ01QX01BU0tSRVBMWSkKKworI2VuZGlmIC8qIF9fVVNFX0JTRCAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogbmV0aW5ldC9pcF9pY21wLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC90Y3AuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC90Y3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmU4NDE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L3RjcC5oCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXRjcC5oCTguMSAoQmVya2VsZXkpIDYvMTAvOTMKKyAqLworCisjaWZuZGVmIF9ORVRJTkVUX1RDUF9ICisjZGVmaW5lIF9ORVRJTkVUX1RDUF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qCisgKiBVc2VyLXNldHRhYmxlIG9wdGlvbnMgKHVzZWQgd2l0aCBzZXRzb2Nrb3B0KS4KKyAqLworI2RlZmluZQlUQ1BfTk9ERUxBWQkgMQkvKiBEb24ndCBkZWxheSBzZW5kIHRvIGNvYWxlc2NlIHBhY2tldHMgICovCisjZGVmaW5lCVRDUF9NQVhTRUcJIDIJLyogU2V0IG1heGltdW0gc2VnbWVudCBzaXplICAqLworI2RlZmluZSBUQ1BfQ09SSwkgMwkvKiBDb250cm9sIHNlbmRpbmcgb2YgcGFydGlhbCBmcmFtZXMgICovCisjZGVmaW5lIFRDUF9LRUVQSURMRQkgNAkvKiBTdGFydCBrZWVwbGl2ZXMgYWZ0ZXIgdGhpcyBwZXJpb2QgKi8KKyNkZWZpbmUgVENQX0tFRVBJTlRWTAkgNQkvKiBJbnRlcnZhbCBiZXR3ZWVuIGtlZXBhbGl2ZXMgKi8KKyNkZWZpbmUgVENQX0tFRVBDTlQJIDYJLyogTnVtYmVyIG9mIGtlZXBhbGl2ZXMgYmVmb3JlIGRlYXRoICovCisjZGVmaW5lIFRDUF9TWU5DTlQJIDcJLyogTnVtYmVyIG9mIFNZTiByZXRyYW5zbWl0cyAqLworI2RlZmluZSBUQ1BfTElOR0VSMgkgOAkvKiBMaWZlIHRpbWUgb2Ygb3JwaGFuZWQgRklOLVdBSVQtMiBzdGF0ZSAqLworI2RlZmluZSBUQ1BfREVGRVJfQUNDRVBUIDkJLyogV2FrZSB1cCBsaXN0ZW5lciBvbmx5IHdoZW4gZGF0YSBhcnJpdmUgKi8KKyNkZWZpbmUgVENQX1dJTkRPV19DTEFNUCAxMAkvKiBCb3VuZCBhZHZlcnRpc2VkIHdpbmRvdyAqLworI2RlZmluZSBUQ1BfSU5GTwkgMTEJLyogSW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb25uZWN0aW9uLiAqLworI2RlZmluZQlUQ1BfUVVJQ0tBQ0sJIDEyCS8qIEJvY2svcmVlbmFibGUgcXVpY2sgQUNLcy4gICovCisjZGVmaW5lIFRDUF9DT05HRVNUSU9OCSAxMwkvKiBDb25nZXN0aW9uIGNvbnRyb2wgYWxnb3JpdGhtLiAgKi8KKyNkZWZpbmUgVENQX01ENVNJRwkgMTQJLyogVENQIE1ENSBTaWduYXR1cmUgKFJGQzIzODUpICovCisKKyNpZmRlZiBfX1VTRV9NSVNDCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyMgaWZkZWYgX19GQVZPUl9CU0QKK3R5cGVkZWYJdV9pbnQzMl90IHRjcF9zZXE7CisvKgorICogVENQIGhlYWRlci4KKyAqIFBlciBSRkMgNzkzLCBTZXB0ZW1iZXIsIDE5ODEuCisgKi8KK3N0cnVjdCB0Y3BoZHIKKyAgeworICAgIHVfaW50MTZfdCB0aF9zcG9ydDsJCS8qIHNvdXJjZSBwb3J0ICovCisgICAgdV9pbnQxNl90IHRoX2Rwb3J0OwkJLyogZGVzdGluYXRpb24gcG9ydCAqLworICAgIHRjcF9zZXEgdGhfc2VxOwkJLyogc2VxdWVuY2UgbnVtYmVyICovCisgICAgdGNwX3NlcSB0aF9hY2s7CQkvKiBhY2tub3dsZWRnZW1lbnQgbnVtYmVyICovCisjICBpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisgICAgdV9pbnQ4X3QgdGhfeDI6NDsJCS8qICh1bnVzZWQpICovCisgICAgdV9pbnQ4X3QgdGhfb2ZmOjQ7CQkvKiBkYXRhIG9mZnNldCAqLworIyAgZW5kaWYKKyMgIGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyAgICB1X2ludDhfdCB0aF9vZmY6NDsJCS8qIGRhdGEgb2Zmc2V0ICovCisgICAgdV9pbnQ4X3QgdGhfeDI6NDsJCS8qICh1bnVzZWQpICovCisjICBlbmRpZgorICAgIHVfaW50OF90IHRoX2ZsYWdzOworIyAgZGVmaW5lIFRIX0ZJTgkweDAxCisjICBkZWZpbmUgVEhfU1lOCTB4MDIKKyMgIGRlZmluZSBUSF9SU1QJMHgwNAorIyAgZGVmaW5lIFRIX1BVU0gJMHgwOAorIyAgZGVmaW5lIFRIX0FDSwkweDEwCisjICBkZWZpbmUgVEhfVVJHCTB4MjAKKyAgICB1X2ludDE2X3QgdGhfd2luOwkJLyogd2luZG93ICovCisgICAgdV9pbnQxNl90IHRoX3N1bTsJCS8qIGNoZWNrc3VtICovCisgICAgdV9pbnQxNl90IHRoX3VycDsJCS8qIHVyZ2VudCBwb2ludGVyICovCit9OworCisjIGVsc2UgLyogIV9fRkFWT1JfQlNEICovCitzdHJ1Y3QgdGNwaGRyCisgIHsKKyAgICB1X2ludDE2X3Qgc291cmNlOworICAgIHVfaW50MTZfdCBkZXN0OworICAgIHVfaW50MzJfdCBzZXE7CisgICAgdV9pbnQzMl90IGFja19zZXE7CisjICBpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisgICAgdV9pbnQxNl90IHJlczE6NDsKKyAgICB1X2ludDE2X3QgZG9mZjo0OworICAgIHVfaW50MTZfdCBmaW46MTsKKyAgICB1X2ludDE2X3Qgc3luOjE7CisgICAgdV9pbnQxNl90IHJzdDoxOworICAgIHVfaW50MTZfdCBwc2g6MTsKKyAgICB1X2ludDE2X3QgYWNrOjE7CisgICAgdV9pbnQxNl90IHVyZzoxOworICAgIHVfaW50MTZfdCByZXMyOjI7CisjICBlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyAgICB1X2ludDE2X3QgZG9mZjo0OworICAgIHVfaW50MTZfdCByZXMxOjQ7CisgICAgdV9pbnQxNl90IHJlczI6MjsKKyAgICB1X2ludDE2X3QgdXJnOjE7CisgICAgdV9pbnQxNl90IGFjazoxOworICAgIHVfaW50MTZfdCBwc2g6MTsKKyAgICB1X2ludDE2X3QgcnN0OjE7CisgICAgdV9pbnQxNl90IHN5bjoxOworICAgIHVfaW50MTZfdCBmaW46MTsKKyMgIGVsc2UKKyMgICBlcnJvciAiQWRqdXN0IHlvdXIgPGJpdHMvZW5kaWFuLmg+IGRlZmluZXMiCisjICBlbmRpZgorICAgIHVfaW50MTZfdCB3aW5kb3c7CisgICAgdV9pbnQxNl90IGNoZWNrOworICAgIHVfaW50MTZfdCB1cmdfcHRyOworfTsKKyMgZW5kaWYgLyogX19GQVZPUl9CU0QgKi8KKworZW51bQoreworICBUQ1BfRVNUQUJMSVNIRUQgPSAxLAorICBUQ1BfU1lOX1NFTlQsCisgIFRDUF9TWU5fUkVDViwKKyAgVENQX0ZJTl9XQUlUMSwKKyAgVENQX0ZJTl9XQUlUMiwKKyAgVENQX1RJTUVfV0FJVCwKKyAgVENQX0NMT1NFLAorICBUQ1BfQ0xPU0VfV0FJVCwKKyAgVENQX0xBU1RfQUNLLAorICBUQ1BfTElTVEVOLAorICBUQ1BfQ0xPU0lORyAgIC8qIG5vdyBhIHZhbGlkIHN0YXRlICovCit9OworCisjIGRlZmluZSBUQ1BPUFRfRU9MCQkwCisjIGRlZmluZSBUQ1BPUFRfTk9QCQkxCisjIGRlZmluZSBUQ1BPUFRfTUFYU0VHCQkyCisjIGRlZmluZSBUQ1BPTEVOX01BWFNFRwkJNAorIyBkZWZpbmUgVENQT1BUX1dJTkRPVwkJMworIyBkZWZpbmUgVENQT0xFTl9XSU5ET1cJCTMKKyMgZGVmaW5lIFRDUE9QVF9TQUNLX1BFUk1JVFRFRAk0CQkvKiBFeHBlcmltZW50YWwgKi8KKyMgZGVmaW5lIFRDUE9MRU5fU0FDS19QRVJNSVRURUQJMgorIyBkZWZpbmUgVENQT1BUX1NBQ0sJCTUJCS8qIEV4cGVyaW1lbnRhbCAqLworIyBkZWZpbmUgVENQT1BUX1RJTUVTVEFNUAk4CisjIGRlZmluZSBUQ1BPTEVOX1RJTUVTVEFNUAkxMAorIyBkZWZpbmUgVENQT0xFTl9UU1RBTVBfQVBQQQkoVENQT0xFTl9USU1FU1RBTVArMikgLyogYXBwZW5kaXggQSAqLworCisjIGRlZmluZSBUQ1BPUFRfVFNUQU1QX0hEUglcCisgICAgKFRDUE9QVF9OT1A8PDI0fFRDUE9QVF9OT1A8PDE2fFRDUE9QVF9USU1FU1RBTVA8PDh8VENQT0xFTl9USU1FU1RBTVApCisKKy8qCisgKiBEZWZhdWx0IG1heGltdW0gc2VnbWVudCBzaXplIGZvciBUQ1AuCisgKiBXaXRoIGFuIElQIE1TUyBvZiA1NzYsIHRoaXMgaXMgNTM2LAorICogYnV0IDUxMiBpcyBwcm9iYWJseSBtb3JlIGNvbnZlbmllbnQuCisgKiBUaGlzIHNob3VsZCBiZSBkZWZpbmVkIGFzIE1JTig1MTIsIElQX01TUyAtIHNpemVvZiAoc3RydWN0IHRjcGlwaGRyKSkuCisgKi8KKyMgZGVmaW5lIFRDUF9NU1MJNTEyCisKKyMgZGVmaW5lIFRDUF9NQVhXSU4JNjU1MzUJLyogbGFyZ2VzdCB2YWx1ZSBmb3IgKHVuc2NhbGVkKSB3aW5kb3cgKi8KKworIyBkZWZpbmUgVENQX01BWF9XSU5TSElGVAkxNAkvKiBtYXhpbXVtIHdpbmRvdyBzaGlmdCAqLworCisjIGRlZmluZSBTT0xfVENQCQk2CS8qIFRDUCBsZXZlbCAqLworCisKKyMgZGVmaW5lIFRDUElfT1BUX1RJTUVTVEFNUFMJMQorIyBkZWZpbmUgVENQSV9PUFRfU0FDSwkJMgorIyBkZWZpbmUgVENQSV9PUFRfV1NDQUxFCTQKKyMgZGVmaW5lIFRDUElfT1BUX0VDTgkJOAorCisvKiBWYWx1ZXMgZm9yIHRjcGlfc3RhdGUuICAqLworZW51bSB0Y3BfY2Ffc3RhdGUKK3sKKyAgVENQX0NBX09wZW4gPSAwLAorICBUQ1BfQ0FfRGlzb3JkZXIgPSAxLAorICBUQ1BfQ0FfQ1dSID0gMiwKKyAgVENQX0NBX1JlY292ZXJ5ID0gMywKKyAgVENQX0NBX0xvc3MgPSA0Cit9OworCitzdHJ1Y3QgdGNwX2luZm8KK3sKKyAgdV9pbnQ4X3QJdGNwaV9zdGF0ZTsKKyAgdV9pbnQ4X3QJdGNwaV9jYV9zdGF0ZTsKKyAgdV9pbnQ4X3QJdGNwaV9yZXRyYW5zbWl0czsKKyAgdV9pbnQ4X3QJdGNwaV9wcm9iZXM7CisgIHVfaW50OF90CXRjcGlfYmFja29mZjsKKyAgdV9pbnQ4X3QJdGNwaV9vcHRpb25zOworICB1X2ludDhfdAl0Y3BpX3NuZF93c2NhbGUgOiA0LCB0Y3BpX3Jjdl93c2NhbGUgOiA0OworCisgIHVfaW50MzJfdAl0Y3BpX3J0bzsKKyAgdV9pbnQzMl90CXRjcGlfYXRvOworICB1X2ludDMyX3QJdGNwaV9zbmRfbXNzOworICB1X2ludDMyX3QJdGNwaV9yY3ZfbXNzOworCisgIHVfaW50MzJfdAl0Y3BpX3VuYWNrZWQ7CisgIHVfaW50MzJfdAl0Y3BpX3NhY2tlZDsKKyAgdV9pbnQzMl90CXRjcGlfbG9zdDsKKyAgdV9pbnQzMl90CXRjcGlfcmV0cmFuczsKKyAgdV9pbnQzMl90CXRjcGlfZmFja2V0czsKKworICAvKiBUaW1lcy4gKi8KKyAgdV9pbnQzMl90CXRjcGlfbGFzdF9kYXRhX3NlbnQ7CisgIHVfaW50MzJfdAl0Y3BpX2xhc3RfYWNrX3NlbnQ7CS8qIE5vdCByZW1lbWJlcmVkLCBzb3JyeS4gICovCisgIHVfaW50MzJfdAl0Y3BpX2xhc3RfZGF0YV9yZWN2OworICB1X2ludDMyX3QJdGNwaV9sYXN0X2Fja19yZWN2OworCisgIC8qIE1ldHJpY3MuICovCisgIHVfaW50MzJfdAl0Y3BpX3BtdHU7CisgIHVfaW50MzJfdAl0Y3BpX3Jjdl9zc3RocmVzaDsKKyAgdV9pbnQzMl90CXRjcGlfcnR0OworICB1X2ludDMyX3QJdGNwaV9ydHR2YXI7CisgIHVfaW50MzJfdAl0Y3BpX3NuZF9zc3RocmVzaDsKKyAgdV9pbnQzMl90CXRjcGlfc25kX2N3bmQ7CisgIHVfaW50MzJfdAl0Y3BpX2Fkdm1zczsKKyAgdV9pbnQzMl90CXRjcGlfcmVvcmRlcmluZzsKKworICB1X2ludDMyX3QJdGNwaV9yY3ZfcnR0OworICB1X2ludDMyX3QJdGNwaV9yY3Zfc3BhY2U7CisKKyAgdV9pbnQzMl90CXRjcGlfdG90YWxfcmV0cmFuczsKK307CisKKworLyogRm9yIFRDUF9NRDVTSUcgc29ja2V0IG9wdGlvbi4gICovCisjZGVmaW5lIFRDUF9NRDVTSUdfTUFYS0VZTEVOCTgwCisKK3N0cnVjdCB0Y3BfbWQ1c2lnCit7CisgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHRjcG1fYWRkcjsJCS8qIEFkZHJlc3MgYXNzb2NpYXRlZC4gICovCisgIHVfaW50MTZfdAlfX3RjcG1fcGFkMTsJCQkvKiBaZXJvLiAgKi8KKyAgdV9pbnQxNl90CXRjcG1fa2V5bGVuOwkJCS8qIEtleSBsZW5ndGguICAqLworICB1X2ludDMyX3QJX190Y3BtX3BhZDI7CQkJLyogWmVyby4gICovCisgIHVfaW50OF90CXRjcG1fa2V5W1RDUF9NRDVTSUdfTUFYS0VZTEVOXTsJLyogS2V5IChiaW5hcnkpLiAgKi8KK307CisKKyNlbmRpZiAvKiBNaXNjLiAgKi8KKworI2VuZGlmIC8qIG5ldGluZXQvdGNwLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC91ZHAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC91ZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTFiZWI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L3VkcC5oCkBAIC0wLDAgKzEsODkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0xOTkzLDE5OTUtMTk5NywyMDA0LDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5ODIsIDE5ODYgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfX05FVElORVRfVURQX0gKKyNkZWZpbmUgX19ORVRJTkVUX1VEUF9IICAgIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKworLyogVURQIGhlYWRlciBhcyBzcGVjaWZpZWQgYnkgUkZDIDc2OCwgQXVndXN0IDE5ODAuICovCisjaWZkZWYgX19GQVZPUl9CU0QKKworc3RydWN0IHVkcGhkcgoreworICB1X2ludDE2X3QgdWhfc3BvcnQ7CQkvKiBzb3VyY2UgcG9ydCAqLworICB1X2ludDE2X3QgdWhfZHBvcnQ7CQkvKiBkZXN0aW5hdGlvbiBwb3J0ICovCisgIHVfaW50MTZfdCB1aF91bGVuOwkJLyogdWRwIGxlbmd0aCAqLworICB1X2ludDE2X3QgdWhfc3VtOwkJLyogdWRwIGNoZWNrc3VtICovCit9OworCisjZWxzZQorCitzdHJ1Y3QgdWRwaGRyCit7CisgIHVfaW50MTZfdCBzb3VyY2U7CisgIHVfaW50MTZfdCBkZXN0OworICB1X2ludDE2X3QgbGVuOworICB1X2ludDE2X3QgY2hlY2s7Cit9OworI2VuZGlmCisKKy8qIFVEUCBzb2NrZXQgb3B0aW9ucyAqLworI2RlZmluZSBVRFBfQ09SSwkxCS8qIE5ldmVyIHNlbmQgcGFydGlhbGx5IGNvbXBsZXRlIHNlZ21lbnRzLiAgKi8KKyNkZWZpbmUgVURQX0VOQ0FQCTEwMAkvKiBTZXQgdGhlIHNvY2tldCB0byBhY2NlcHQKKwkJCQkgICBlbmNhcHN1bGF0ZWQgcGFja2V0cy4gICovCisKKy8qIFVEUCBlbmNhcHN1bGF0aW9uIHR5cGVzICovCisjZGVmaW5lIFVEUF9FTkNBUF9FU1BJTlVEUF9OT05fSUtFIDEJLyogZHJhZnQtaWV0Zi1pcHNlYy1uYXQtdC1pa2UtMDAvMDEgKi8KKyNkZWZpbmUgVURQX0VOQ0FQX0VTUElOVURQCTIJLyogZHJhZnQtaWV0Zi1pcHNlYy11ZHAtZW5jYXBzLTA2ICovCisjZGVmaW5lIFVEUF9FTkNBUF9MMlRQSU5VRFAJMwkvKiByZmMyNjYxICovCisKKyNkZWZpbmUgU09MX1VEUCAgICAgICAgICAgIDE3ICAgICAgLyogc29ja29wdCBsZXZlbCBmb3IgVURQICovCisKKyNlbmRpZiAvKiBuZXRpbmV0L3VkcC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL25ldGlweC9pcHguaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aXB4L2lweC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYjQyZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGlweC9pcHguaApAQCAtMCwwICsxLDExMyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk1LCA5NiwgOTcsIDk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9fTkVUSVBYX0lQWF9ICisjZGVmaW5lIF9fTkVUSVBYX0lQWF9IIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3NvY2thZGRyLmg+CisKK19fQkVHSU5fREVDTFMKKworI2RlZmluZSBTT0xfSVBYICAgIDI1NiAgICAgICAgICAvKiBzb2Nrb3B0IGxldmVsICovCisKKyNkZWZpbmUgSVBYX1RZUEUgICAgICAgIDEKKyNkZWZpbmUgSVBYX05PREVfTEVOCTYKKyNkZWZpbmUgSVBYX01UVQkJNTc2CisKK3N0cnVjdCBzb2NrYWRkcl9pcHgKKyAgeworICAgIHNhX2ZhbWlseV90IHNpcHhfZmFtaWx5OworICAgIHVfaW50MTZfdCBzaXB4X3BvcnQ7CisgICAgdV9pbnQzMl90IHNpcHhfbmV0d29yazsKKyAgICB1bnNpZ25lZCBjaGFyIHNpcHhfbm9kZVtJUFhfTk9ERV9MRU5dOworICAgIHVfaW50OF90IHNpcHhfdHlwZTsKKyAgICB1bnNpZ25lZCBjaGFyIHNpcHhfemVybzsJLyogMTYgYnl0ZSBmaWxsICovCisgIH07CisKKy8qCisgKglTbyB3ZSBjYW4gZml0IHRoZSBleHRyYSBpbmZvIGZvciBTSU9DU0lGQUREUiBpbnRvIHRoZSBhZGRyZXNzIG5pY2VseQorICovCisKKyNkZWZpbmUgc2lweF9zcGVjaWFsCXNpcHhfcG9ydAorI2RlZmluZSBzaXB4X2FjdGlvbglzaXB4X3plcm8KKyNkZWZpbmUgSVBYX0RMVElURgkwCisjZGVmaW5lIElQWF9DUlRJVEYJMQorCit0eXBlZGVmIHN0cnVjdCBpcHhfcm91dGVfZGVmaW5pdGlvbgorICB7CisgICAgdW5zaWduZWQgbG9uZyBpcHhfbmV0d29yazsKKyAgICB1bnNpZ25lZCBsb25nIGlweF9yb3V0ZXJfbmV0d29yazsKKyAgICB1bnNpZ25lZCBjaGFyIGlweF9yb3V0ZXJfbm9kZVtJUFhfTk9ERV9MRU5dOworICB9CitpcHhfcm91dGVfZGVmaW5pdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgaXB4X2ludGVyZmFjZV9kZWZpbml0aW9uCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGlweF9uZXR3b3JrOworICAgIHVuc2lnbmVkIGNoYXIgaXB4X2RldmljZVsxNl07CisgICAgdW5zaWduZWQgY2hhciBpcHhfZGxpbmtfdHlwZTsKKyNkZWZpbmUgSVBYX0ZSQU1FX05PTkUJCTAKKyNkZWZpbmUgSVBYX0ZSQU1FX1NOQVAJCTEKKyNkZWZpbmUgSVBYX0ZSQU1FXzgwMjIJCTIKKyNkZWZpbmUgSVBYX0ZSQU1FX0VUSEVSSUkJMworI2RlZmluZSBJUFhfRlJBTUVfODAyMwkJNAorI2RlZmluZSBJUFhfRlJBTUVfVFJfODAyMgk1CisgICAgdW5zaWduZWQgY2hhciBpcHhfc3BlY2lhbDsKKyNkZWZpbmUgSVBYX1NQRUNJQUxfTk9ORQkwCisjZGVmaW5lIElQWF9QUklNQVJZCQkxCisjZGVmaW5lIElQWF9JTlRFUk5BTAkJMgorICAgIHVuc2lnbmVkIGNoYXIgaXB4X25vZGVbSVBYX05PREVfTEVOXTsKKyAgfQoraXB4X2ludGVyZmFjZV9kZWZpbml0aW9uOworCit0eXBlZGVmIHN0cnVjdCBpcHhfY29uZmlnX2RhdGEKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgaXB4Y2ZnX2F1dG9fc2VsZWN0X3ByaW1hcnk7CisgICAgdW5zaWduZWQgY2hhciBpcHhjZmdfYXV0b19jcmVhdGVfaW50ZXJmYWNlczsKKyAgfQoraXB4X2NvbmZpZ19kYXRhOworCisvKgorICogT0xEIFJvdXRlIERlZmluaXRpb24gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgKi8KKworc3RydWN0IGlweF9yb3V0ZV9kZWYKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgaXB4X25ldHdvcms7CisgICAgdW5zaWduZWQgbG9uZyBpcHhfcm91dGVyX25ldHdvcms7CisjZGVmaW5lIElQWF9ST1VURV9OT19ST1VURVIJMAorICAgIHVuc2lnbmVkIGNoYXIgaXB4X3JvdXRlcl9ub2RlW0lQWF9OT0RFX0xFTl07CisgICAgdW5zaWduZWQgY2hhciBpcHhfZGV2aWNlWzE2XTsKKyAgICB1bnNpZ25lZCBzaG9ydCBpcHhfZmxhZ3M7CisjZGVmaW5lIElQWF9SVF9TTkFQCQk4CisjZGVmaW5lIElQWF9SVF84MDIyCQk0CisjZGVmaW5lIElQWF9SVF9CTFVFQk9PSwkJMgorI2RlZmluZSBJUFhfUlRfUk9VVEVECQkxCisgIH07CisKKyNkZWZpbmUgU0lPQ0FJUFhJVEZDUlQJCShTSU9DUFJPVE9QUklWQVRFKQorI2RlZmluZSBTSU9DQUlQWFBSSVNMVAkJKFNJT0NQUk9UT1BSSVZBVEUgKyAxKQorI2RlZmluZSBTSU9DSVBYQ0ZHREFUQQkJKFNJT0NQUk9UT1BSSVZBVEUgKyAyKQorI2RlZmluZSBTSU9DSVBYTkNQQ09OTgkJKFNJT0NQUk9UT1BSSVZBVEUgKyAzKQorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogbmV0aXB4L2lweC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL25ldGl1Y3YvaXVjdi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpdWN2L2l1Y3YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzllYmZmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpdWN2L2l1Y3YuaApAQCAtMCwwICsxLDM5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX19ORVRJVUNWX0lVQ1ZfSAorI2RlZmluZSBfX05FVElVQ1ZfSVVDVl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8Yml0cy9zb2NrYWRkci5oPgorCitfX0JFR0lOX0RFQ0xTCisKK3N0cnVjdCBzb2NrYWRkcl9pdWN2CisgIHsKKyAgICBfX1NPQ0tBRERSX0NPTU1PTiAoc2l1Y3ZfKTsKKyAgICB1bnNpZ25lZCBzaG9ydAlzaXVjdl9wb3J0OwkJLyogUmVzZXJ2ZWQgKi8KKyAgICB1bnNpZ25lZCBpbnQJc2l1Y3ZfYWRkcjsJCS8qIFJlc2VydmVkICovCisgICAgY2hhcgkJc2l1Y3Zfbm9kZWlkWzhdOwkvKiBSZXNlcnZlZCAqLworICAgIGNoYXIJCXNpdWN2X3VzZXJfaWRbOF07CS8qIEd1ZXN0IFVzZXIgSWQgKi8KKyAgICBjaGFyCQlzaXVjdl9uYW1lWzhdOwkJLyogQXBwbGljYXRpb24gTmFtZSAqLworICB9OworCitfX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0cGFja2V0L3BhY2tldC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRwYWNrZXQvcGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2MzQyOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0cGFja2V0L3BhY2tldC5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qIERlZmluaXRpb25zIGZvciB1c2Ugd2l0aCBMaW51eCBBRl9QQUNLRVQgc29ja2V0cy4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfX05FVFBBQ0tFVF9QQUNLRVRfSAorI2RlZmluZSBfX05FVFBBQ0tFVF9QQUNLRVRfSAkxCisKK3N0cnVjdCBzb2NrYWRkcl9sbAorICB7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IHNsbF9mYW1pbHk7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IHNsbF9wcm90b2NvbDsKKyAgICBpbnQgc2xsX2lmaW5kZXg7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IHNsbF9oYXR5cGU7CisgICAgdW5zaWduZWQgY2hhciBzbGxfcGt0dHlwZTsKKyAgICB1bnNpZ25lZCBjaGFyIHNsbF9oYWxlbjsKKyAgICB1bnNpZ25lZCBjaGFyIHNsbF9hZGRyWzhdOworICB9OworCisvKiBQYWNrZXQgdHlwZXMuICAqLworCisjZGVmaW5lIFBBQ0tFVF9IT1NUCQkwCQkvKiBUbyB1cy4gICovCisjZGVmaW5lIFBBQ0tFVF9CUk9BRENBU1QJMQkJLyogVG8gYWxsLiAgKi8KKyNkZWZpbmUgUEFDS0VUX01VTFRJQ0FTVAkyCQkvKiBUbyBncm91cC4gICovCisjZGVmaW5lIFBBQ0tFVF9PVEhFUkhPU1QJMwkJLyogVG8gc29tZW9uZSBlbHNlLiAgKi8KKyNkZWZpbmUgUEFDS0VUX09VVEdPSU5HCQk0CQkvKiBPcmlnaW5hdGVkIGJ5IHVzIC4gKi8KKyNkZWZpbmUgUEFDS0VUX0xPT1BCQUNLCQk1CisjZGVmaW5lIFBBQ0tFVF9GQVNUUk9VVEUJNgorCisvKiBQYWNrZXQgc29ja2V0IG9wdGlvbnMuICAqLworCisjZGVmaW5lIFBBQ0tFVF9BRERfTUVNQkVSU0hJUAkJMQorI2RlZmluZSBQQUNLRVRfRFJPUF9NRU1CRVJTSElQCQkyCisjZGVmaW5lCVBBQ0tFVF9SRUNWX09VVFBVVAkJMworI2RlZmluZQlQQUNLRVRfUlhfUklORwkJCTUKKyNkZWZpbmUJUEFDS0VUX1NUQVRJU1RJQ1MJCTYKKworc3RydWN0IHBhY2tldF9tcmVxCisgIHsKKyAgICBpbnQgbXJfaWZpbmRleDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgbXJfdHlwZTsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgbXJfYWxlbjsKKyAgICB1bnNpZ25lZCBjaGFyIG1yX2FkZHJlc3NbOF07CisgIH07CisKKyNkZWZpbmUgUEFDS0VUX01SX01VTFRJQ0FTVAkwCisjZGVmaW5lIFBBQ0tFVF9NUl9QUk9NSVNDCTEKKyNkZWZpbmUgUEFDS0VUX01SX0FMTE1VTFRJCTIKKworI2VuZGlmCS8qIG5ldHBhY2tldC9wYWNrZXQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRyb20vbmV0cm9tLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldHJvbS9uZXRyb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTg0NzcyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRyb20vbmV0cm9tLmgKQEAgLTAsMCArMSw4NCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9ORVRST01fTkVUUk9NX0gKKyNkZWZpbmUgX05FVFJPTV9ORVRST01fSAkxCisKKyNpbmNsdWRlIDxuZXRheDI1L2F4MjUuaD4KKworLyogU2V0c29ja29wdGlvbnMoMikgbGV2ZWwuICBUaGFua3MgdG8gQlNEIHRoZXNlIG11c3QgbWF0Y2ggSVBQUk9UT194eHguICAqLworI2RlZmluZSBTT0xfTkVUUk9NCTI1OQorCisvKiBOZXRSb20gY29udHJvbCB2YWx1ZXM6ICovCisjZGVmaW5lIE5FVFJPTV9UMQkxCisjZGVmaW5lIE5FVFJPTV9UMgkyCisjZGVmaW5lIE5FVFJPTV9OMgkzCisjZGVmaW5lIE5FVFJPTV9QQUNMRU4JNQorI2RlZmluZQlORVRST01fVDQJNgorI2RlZmluZSBORVRST01fSURMRQk3CisKKyNkZWZpbmUgTkVUUk9NX0tJTEwJOTkKKworLyogVHlwZSBvZiByb3V0ZTogKi8KKyNkZWZpbmUgTkVUUk9NX05FSUdIICAgIDAKKyNkZWZpbmUgTkVUUk9NX05PREUgICAgIDEKKworc3RydWN0IG5yX3JvdXRlX3N0cnVjdAorICB7CisgICAgaW50IHR5cGU7CisgICAgYXgyNV9hZGRyZXNzIGNhbGxzaWduOworICAgIGNoYXIgZGV2aWNlWzE2XTsKKyAgICB1bnNpZ25lZCBpbnQgcXVhbGl0eTsKKyAgICBjaGFyIG1uZW1vbmljWzddOworICAgIGF4MjVfYWRkcmVzcyBuZWlnaGJvdXI7CisgICAgdW5zaWduZWQgaW50IG9ic19jb3VudDsKKyAgICB1bnNpZ25lZCBpbnQgbmRpZ2lzOworICAgIGF4MjVfYWRkcmVzcyBkaWdpcGVhdGVyc1tBWDI1X01BWF9ESUdJU107CisgIH07CisKKy8qIE5ldFJvbSBzb2NrZXQgaW9jdGxzOiAqLworI2RlZmluZQlTSU9DTlJHRVRQQVJNUwkJKFNJT0NQUk9UT1BSSVZBVEUrMCkKKyNkZWZpbmUJU0lPQ05SU0VUUEFSTVMJCShTSU9DUFJPVE9QUklWQVRFKzEpCisjZGVmaW5lCVNJT0NOUkRFQ09CUwkJKFNJT0NQUk9UT1BSSVZBVEUrMikKKyNkZWZpbmUJU0lPQ05SUlRDVEwJCShTSU9DUFJPVE9QUklWQVRFKzMpCisjZGVmaW5lCVNJT0NOUkNUTENPTgkJKFNJT0NQUk9UT1BSSVZBVEUrNCkKKworLyogTmV0Um9tIHBhcmFtZXRlciBzdHJ1Y3R1cmU6ICovCitzdHJ1Y3QgbnJfcGFybXNfc3RydWN0CisgIHsKKyAgICB1bnNpZ25lZCBpbnQgcXVhbGl0eTsKKyAgICB1bnNpZ25lZCBpbnQgb2JzX2NvdW50OworICAgIHVuc2lnbmVkIGludCB0dGw7CisgICAgdW5zaWduZWQgaW50IHRpbWVvdXQ7CisgICAgdW5zaWduZWQgaW50IGFja19kZWxheTsKKyAgICB1bnNpZ25lZCBpbnQgYnVzeV9kZWxheTsKKyAgICB1bnNpZ25lZCBpbnQgdHJpZXM7CisgICAgdW5zaWduZWQgaW50IHdpbmRvdzsKKyAgICB1bnNpZ25lZCBpbnQgcGFjbGVuOworICB9OworCisvKiBOZXRSb20gY29udHJvbCBzdHJ1Y3R1cmU6ICovCitzdHJ1Y3QgbnJfY3RsX3N0cnVjdAorICB7CisgICAgdW5zaWduZWQgY2hhciBpbmRleDsKKyAgICB1bnNpZ25lZCBjaGFyIGlkOworICAgIHVuc2lnbmVkIGludCBjbWQ7CisgICAgdW5zaWduZWQgbG9uZyBhcmc7CisgIH07CisKKyNlbmRpZiAvKiBuZXRyb20vbmV0cm9tLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0cm9zZS9yb3NlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldHJvc2Uvcm9zZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YmE3ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldHJvc2Uvcm9zZS5oCkBAIC0wLDAgKzEsMTE2IEBACisvKiBEZWZpbml0aW9ucyBmb3IgUm9zZSBwYWNrZXQgcmFkaW8gYWRkcmVzcyBmYW1pbHkuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIFdoYXQgZm9sbG93cyBpcyBjb3BpZWQgZnJvbSB0aGUgMi4xLjkzIDxsaW51eC9yb3NlLmg+LiAgKi8KKworI2lmbmRlZiBfTkVUUk9TRV9ST1NFX0gKKyNkZWZpbmUgX05FVFJPU0VfUk9TRV9IIDEKKworLyogU29ja2V0IGxldmVsIHZhbHVlcy4gICovCisjZGVmaW5lIFNPTF9ST1NFICAgICAgICAyNjAKKworCisvKiBUaGVzZSBhcmUgdGhlIHB1YmxpYyBlbGVtZW50cyBvZiB0aGUgTGludXgga2VybmVsIFJvc2UKKyAgIGltcGxlbWVudGF0aW9uLiAgRm9yIGtlcm5lbCBBWC4yNSBzZWUgdGhlIGZpbGUgYXgyNS5oLiBUaGlzIGZpbGUKKyAgIHJlcXVpcmVzIGF4MjUuaCBmb3IgdGhlIGRlZmluaXRpb24gb2YgdGhlIGF4MjVfYWRkcmVzcyBzdHJ1Y3R1cmUuICAqLworI2RlZmluZSBST1NFX01UVQkyNTEKKworI2RlZmluZSBST1NFX01BWF9ESUdJUwk2CisKKyNkZWZpbmUJUk9TRV9ERUZFUgkxCisjZGVmaW5lCVJPU0VfVDEJCTIKKyNkZWZpbmUJUk9TRV9UMgkJMworI2RlZmluZQlST1NFX1QzCQk0CisjZGVmaW5lCVJPU0VfSURMRQk1CisjZGVmaW5lCVJPU0VfUUJJVElOQ0wJNgorI2RlZmluZQlST1NFX0hPTERCQUNLCTcKKworI2RlZmluZQlTSU9DUlNHQ0FVU0UJCShTSU9DUFJPVE9QUklWQVRFICsgMCkKKyNkZWZpbmUJU0lPQ1JTU0NBVVNFCQkoU0lPQ1BST1RPUFJJVkFURSArIDEpCisjZGVmaW5lCVNJT0NSU0wyQ0FMTAkJKFNJT0NQUk9UT1BSSVZBVEUgKyAyKQorI2RlZmluZQlTSU9DUlNTTDJDQUxMCQkoU0lPQ1BST1RPUFJJVkFURSArIDIpCisjZGVmaW5lCVNJT0NSU0FDQ0VQVAkJKFNJT0NQUk9UT1BSSVZBVEUgKyAzKQorI2RlZmluZQlTSU9DUlNDTFJSVAkJKFNJT0NQUk9UT1BSSVZBVEUgKyA0KQorI2RlZmluZQlTSU9DUlNHTDJDQUxMCQkoU0lPQ1BST1RPUFJJVkFURSArIDUpCisjZGVmaW5lCVNJT0NSU0dGQUNJTElUSUVTCShTSU9DUFJPVE9QUklWQVRFICsgNikKKworI2RlZmluZQlST1NFX0RURV9PUklHSU5BVEVECTB4MDAKKyNkZWZpbmUJUk9TRV9OVU1CRVJfQlVTWQkweDAxCisjZGVmaW5lCVJPU0VfSU5WQUxJRF9GQUNJTElUWQkweDAzCisjZGVmaW5lCVJPU0VfTkVUV09SS19DT05HRVNUSU9OCTB4MDUKKyNkZWZpbmUJUk9TRV9PVVRfT0ZfT1JERVIJMHgwOQorI2RlZmluZQlST1NFX0FDQ0VTU19CQVJSRUQJMHgwQgorI2RlZmluZQlST1NFX05PVF9PQlRBSU5BQkxFCTB4MEQKKyNkZWZpbmUJUk9TRV9SRU1PVEVfUFJPQ0VEVVJFCTB4MTEKKyNkZWZpbmUJUk9TRV9MT0NBTF9QUk9DRURVUkUJMHgxMworI2RlZmluZQlST1NFX1NISVBfQUJTRU5UCTB4MzkKKworCit0eXBlZGVmIHN0cnVjdAoreworICBjaGFyIHJvc2VfYWRkcls1XTsKK30gcm9zZV9hZGRyZXNzOworCitzdHJ1Y3Qgc29ja2FkZHJfcm9zZQoreworICBzYV9mYW1pbHlfdCBzcm9zZV9mYW1pbHk7CisgIHJvc2VfYWRkcmVzcyBzcm9zZV9hZGRyOworICBheDI1X2FkZHJlc3Mgc3Jvc2VfY2FsbDsKKyAgaW50IHNyb3NlX25kaWdpczsKKyAgYXgyNV9hZGRyZXNzCXNyb3NlX2RpZ2k7Cit9OworCitzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9yb3NlCit7CisgIHNhX2ZhbWlseV90IHNyb3NlX2ZhbWlseTsKKyAgcm9zZV9hZGRyZXNzIHNyb3NlX2FkZHI7CisgIGF4MjVfYWRkcmVzcyBzcm9zZV9jYWxsOworICB1bnNpZ25lZCBpbnQgc3Jvc2VfbmRpZ2lzOworICBheDI1X2FkZHJlc3Mgc3Jvc2VfZGlnaXNbUk9TRV9NQVhfRElHSVNdOworfTsKKworc3RydWN0IHJvc2Vfcm91dGVfc3RydWN0Cit7CisgIHJvc2VfYWRkcmVzcyBhZGRyZXNzOworICB1bnNpZ25lZCBzaG9ydCBpbnQgbWFzazsKKyAgYXgyNV9hZGRyZXNzCW5laWdoYm91cjsKKyAgY2hhciBkZXZpY2VbMTZdOworICB1bnNpZ25lZCBjaGFyCW5kaWdpczsKKyAgYXgyNV9hZGRyZXNzIGRpZ2lwZWF0ZXJzW0FYMjVfTUFYX0RJR0lTXTsKK307CisKK3N0cnVjdCByb3NlX2NhdXNlX3N0cnVjdAoreworICB1bnNpZ25lZCBjaGFyCWNhdXNlOworICB1bnNpZ25lZCBjaGFyCWRpYWdub3N0aWM7Cit9OworCitzdHJ1Y3Qgcm9zZV9mYWNpbGl0aWVzX3N0cnVjdAoreworICByb3NlX2FkZHJlc3Mgc291cmNlX2FkZHIsICAgZGVzdF9hZGRyOworICBheDI1X2FkZHJlc3Mgc291cmNlX2NhbGwsICAgZGVzdF9jYWxsOworICB1bnNpZ25lZCBjaGFyIHNvdXJjZV9uZGlnaXMsIGRlc3RfbmRpZ2lzOworICBheDI1X2FkZHJlc3Mgc291cmNlX2RpZ2lzW1JPU0VfTUFYX0RJR0lTXTsKKyAgYXgyNV9hZGRyZXNzIGRlc3RfZGlnaXNbUk9TRV9NQVhfRElHSVNdOworICB1bnNpZ25lZCBpbnQgcmFuZDsKKyAgcm9zZV9hZGRyZXNzIGZhaWxfYWRkcjsKKyAgYXgyNV9hZGRyZXNzIGZhaWxfY2FsbDsKK307CisKKyNlbmRpZgkvKiBuZXRyb3NlL3Jvc2UuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uZnMvbmZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL25mcy9uZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWU0YjY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZnMvbmZzLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGxpbnV4L25mcy5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ubF90eXBlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ubF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMTkwYjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25sX3R5cGVzLmgKQEAgLTAsMCArMSw1NSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5LCAyMDAzLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9OTF9UWVBFU19ICisjZGVmaW5lIF9OTF9UWVBFU19IIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIFRoZSBkZWZhdWx0IG1lc3NhZ2Ugc2V0IHVzZWQgYnkgdGhlIGdlbmNhdCBwcm9ncmFtLiAgKi8KKyNkZWZpbmUgTkxfU0VURCAxCisKKy8qIFZhbHVlIGZvciBGTEFHIHBhcmFtZXRlciBvZiBgY2F0Z2V0cycgdG8gc2F5IHdlIHdhbnQgWFBHNCBjb21wbGlhbmNlLiAgKi8KKyNkZWZpbmUgTkxfQ0FUX0xPQ0FMRSAxCisKKworX19CRUdJTl9ERUNMUworCisvKiBNZXNzYWdlIGNhdGFsb2cgZGVzY3JpcHRvciB0eXBlLiAgKi8KK3R5cGVkZWYgdm9pZCAqbmxfY2F0ZDsKKworLyogVHlwZSB1c2VkIGJ5IGBubF9sYW5naW5mbycuICAqLwordHlwZWRlZiBpbnQgbmxfaXRlbTsKKworLyogT3BlbiBtZXNzYWdlIGNhdGFsb2cgZm9yIGxhdGVyIHVzZSwgcmV0dXJuaW5nIGRlc2NyaXB0b3IuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIG5sX2NhdGQgY2F0b3BlbiAoX19jb25zdCBjaGFyICpfX2NhdF9uYW1lLCBpbnQgX19mbGFnKSBfX25vbm51bGwgKCgxKSk7CisKKy8qIFJldHVybiB0cmFuc2xhdGlvbiB3aXRoIE5VTUJFUiBpbiBTRVQgb2YgQ0FUQUxPRzsgaWYgbm90IGZvdW5kCisgICByZXR1cm4gU1RSSU5HLiAgKi8KK2V4dGVybiBjaGFyICpjYXRnZXRzIChubF9jYXRkIF9fY2F0YWxvZywgaW50IF9fc2V0LCBpbnQgX19udW1iZXIsCisJCSAgICAgIF9fY29uc3QgY2hhciAqX19zdHJpbmcpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBDbG9zZSBtZXNzYWdlIENBVEFMT0cuICAqLworZXh0ZXJuIGludCBjYXRjbG9zZSAobmxfY2F0ZCBfX2NhdGFsb2cpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogbmxfdHlwZXMuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbnNzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL25zcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMWIyNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25zcy5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSwgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogRGVmaW5lIGludGVyZmFjZSB0byBOU1MuICBUaGlzIGlzIG1lYW50IGZvciB0aGUgaW50ZXJmYWNlIGZ1bmN0aW9ucworICAgYW5kIGZvciBpbXBsZW1lbnRvcnMgb2YgbmV3IHNlcnZpY2VzLiAgKi8KKworI2lmbmRlZiBfTlNTX0gKKyNkZWZpbmUgX05TU19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKworX19CRUdJTl9ERUNMUworCisvKiBQb3NzaWJsZSByZXN1bHRzIG9mIGxvb2t1cCB1c2luZyBhIG5zc18qIGZ1bmN0aW9uLiAgKi8KK2VudW0gbnNzX3N0YXR1cworeworICBOU1NfU1RBVFVTX1RSWUFHQUlOID0gLTIsCisgIE5TU19TVEFUVVNfVU5BVkFJTCwKKyAgTlNTX1NUQVRVU19OT1RGT1VORCwKKyAgTlNTX1NUQVRVU19TVUNDRVNTLAorICBOU1NfU1RBVFVTX1JFVFVSTgorfTsKKworCisvKiBEYXRhIHN0cnVjdHVyZSB1c2VkIGZvciB0aGUgJ2dldGhvc3RieW5hbWU0X3InIGZ1bmN0aW9uLiAgKi8KK3N0cnVjdCBnYWloX2FkZHJ0dXBsZQorICB7CisgICAgc3RydWN0IGdhaWhfYWRkcnR1cGxlICpuZXh0OworICAgIGNoYXIgKm5hbWU7CisgICAgaW50IGZhbWlseTsKKyAgICB1aW50MzJfdCBhZGRyWzRdOworICAgIHVpbnQzMl90IHNjb3BlaWQ7CisgIH07CisKKworLyogT3ZlcndyaXRlIHNlcnZpY2Ugc2VsZWN0aW9uIGZvciBkYXRhYmFzZSBEQk5BTUUgdXNpbmcgc3BlY2lmaWNhdGlvbgorICAgaW4gU1RSSU5HLgorICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHN5c3RlbSBwcm9ncmFtcyB3aGljaCBoYXZlIHRvCisgICB3b3JrIGFyb3VuZCBub24tZXhpc3Rpbmcgc2VydmljZXMgKGUuZS4sIHdoaWxlIGJvb3RpbmcpLgorICAgQXR0ZW50aW9uOiBVc2luZyB0aGlzIGZ1bmN0aW9uIHJlcGVhdGVkbHkgd2lsbCBzbG93bHkgZWF0IHVwIHRoZQorICAgd2hvbGUgbWVtb3J5IHNpbmNlIHByZXZpb3VzIHNlbGVjdGlvbiBkYXRhIGNhbm5vdCBiZSBmcmVlZC4gICovCitleHRlcm4gaW50IF9fbnNzX2NvbmZpZ3VyZV9sb29rdXAgKF9fY29uc3QgY2hhciAqX19kYm5hbWUsCisJCQkJICAgX19jb25zdCBjaGFyICpfX3N0cmluZykgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIG5zcy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL29ic3RhY2suaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvb2JzdGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2Nzc4OTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL29ic3RhY2suaApAQCAtMCwwICsxLDUwOSBAQAorLyogb2JzdGFjay5oIC0gb2JqZWN0IHN0YWNrIG1hY3JvcworICAgQ29weXJpZ2h0IChDKSAxOTg4LTE5OTQsMTk5Ni0xOTk5LDIwMDMsMjAwNCwyMDA1LDIwMDksMjAxMQorCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuICAqLworCisvKiBTdW1tYXJ5OgorCitBbGwgdGhlIGFwcGFyZW50IGZ1bmN0aW9ucyBkZWZpbmVkIGhlcmUgYXJlIG1hY3Jvcy4gVGhlIGlkZWEKK2lzIHRoYXQgeW91IHdvdWxkIHVzZSB0aGVzZSBwcmUtdGVzdGVkIG1hY3JvcyB0byBzb2x2ZSBhCit2ZXJ5IHNwZWNpZmljIHNldCBvZiBwcm9ibGVtcywgYW5kIHRoZXkgd291bGQgcnVuIGZhc3QuCitDYXV0aW9uOiBubyBzaWRlLWVmZmVjdHMgaW4gYXJndW1lbnRzIHBsZWFzZSEhIFRoZXkgbWF5IGJlCitldmFsdWF0ZWQgTUFOWSB0aW1lcyEhCisKK1RoZXNlIG1hY3JvcyBvcGVyYXRlIGEgc3RhY2sgb2Ygb2JqZWN0cy4gIEVhY2ggb2JqZWN0IHN0YXJ0cyBsaWZlCitzbWFsbCwgYW5kIG1heSBncm93IHRvIG1hdHVyaXR5LiAgKENvbnNpZGVyIGJ1aWxkaW5nIGEgd29yZCBzeWxsYWJsZQorYnkgc3lsbGFibGUuKSAgQW4gb2JqZWN0IGNhbiBtb3ZlIHdoaWxlIGl0IGlzIGdyb3dpbmcuICBPbmNlIGl0IGhhcworYmVlbiAiZmluaXNoZWQiIGl0IG5ldmVyIGNoYW5nZXMgYWRkcmVzcyBhZ2Fpbi4gIFNvIHRoZSAidG9wIG9mIHRoZQorc3RhY2siIGlzIHR5cGljYWxseSBhbiBpbW1hdHVyZSBncm93aW5nIG9iamVjdCwgd2hpbGUgdGhlIHJlc3Qgb2YgdGhlCitzdGFjayBpcyBvZiBtYXR1cmUsIGZpeGVkIHNpemUgYW5kIGZpeGVkIGFkZHJlc3Mgb2JqZWN0cy4KKworVGhlc2Ugcm91dGluZXMgZ3JhYiBsYXJnZSBjaHVua3Mgb2YgbWVtb3J5LCB1c2luZyBhIGZ1bmN0aW9uIHlvdQorc3VwcGx5LCBjYWxsZWQgYG9ic3RhY2tfY2h1bmtfYWxsb2MnLiAgT24gb2NjYXNpb24sIHRoZXkgZnJlZSBjaHVua3MsCitieSBjYWxsaW5nIGBvYnN0YWNrX2NodW5rX2ZyZWUnLiAgWW91IG11c3QgZGVmaW5lIHRoZW0gYW5kIGRlY2xhcmUKK3RoZW0gYmVmb3JlIHVzaW5nIGFueSBvYnN0YWNrIG1hY3Jvcy4KKworRWFjaCBpbmRlcGVuZGVudCBzdGFjayBpcyByZXByZXNlbnRlZCBieSBhIGBzdHJ1Y3Qgb2JzdGFjaycuCitFYWNoIG9mIHRoZSBvYnN0YWNrIG1hY3JvcyBleHBlY3RzIGEgcG9pbnRlciB0byBzdWNoIGEgc3RydWN0dXJlCithcyB0aGUgZmlyc3QgYXJndW1lbnQuCisKK09uZSBtb3RpdmF0aW9uIGZvciB0aGlzIHBhY2thZ2UgaXMgdGhlIHByb2JsZW0gb2YgZ3Jvd2luZyBjaGFyIHN0cmluZ3MKK2luIHN5bWJvbCB0YWJsZXMuICBVbmxlc3MgeW91IGFyZSAiZmFzY2lzdCBwaWcgd2l0aCBhIHJlYWQtb25seSBtaW5kIgorLS1Hb3NwZXIncyBpbW1vcnRhbCBxdW90ZSBmcm9tIEhBS01FTSBpdGVtIDE1NCwgb3V0IG9mIGNvbnRleHQtLXlvdQord291bGQgbm90IGxpa2UgdG8gcHV0IGFueSBhcmJpdHJhcnkgdXBwZXIgbGltaXQgb24gdGhlIGxlbmd0aCBvZiB5b3VyCitzeW1ib2xzLgorCitJbiBwcmFjdGljZSB0aGlzIG9mdGVuIG1lYW5zIHlvdSB3aWxsIGJ1aWxkIG1hbnkgc2hvcnQgc3ltYm9scyBhbmQgYQorZmV3IGxvbmcgc3ltYm9scy4gIEF0IHRoZSB0aW1lIHlvdSBhcmUgcmVhZGluZyBhIHN5bWJvbCB5b3UgZG9uJ3Qga25vdworaG93IGxvbmcgaXQgaXMuICBPbmUgdHJhZGl0aW9uYWwgbWV0aG9kIGlzIHRvIHJlYWQgYSBzeW1ib2wgaW50byBhCitidWZmZXIsIHJlYWxsb2MoKWF0aW5nIHRoZSBidWZmZXIgZXZlcnkgdGltZSB5b3UgdHJ5IHRvIHJlYWQgYSBzeW1ib2wKK3RoYXQgaXMgbG9uZ2VyIHRoYW4gdGhlIGJ1ZmZlci4gIFRoaXMgaXMgYmVhdXQsIGJ1dCB5b3Ugc3RpbGwgd2lsbAord2FudCB0byBjb3B5IHRoZSBzeW1ib2wgZnJvbSB0aGUgYnVmZmVyIHRvIGEgbW9yZSBwZXJtYW5lbnQKK3N5bWJvbC10YWJsZSBlbnRyeSBzYXkgYWJvdXQgaGFsZiB0aGUgdGltZS4KKworV2l0aCBvYnN0YWNrcywgeW91IGNhbiB3b3JrIGRpZmZlcmVudGx5LiAgVXNlIG9uZSBvYnN0YWNrIGZvciBhbGwgc3ltYm9sCituYW1lcy4gIEFzIHlvdSByZWFkIGEgc3ltYm9sLCBncm93IHRoZSBuYW1lIGluIHRoZSBvYnN0YWNrIGdyYWR1YWxseS4KK1doZW4gdGhlIG5hbWUgaXMgY29tcGxldGUsIGZpbmFsaXplIGl0LiAgVGhlbiwgaWYgdGhlIHN5bWJvbCBleGlzdHMgYWxyZWFkeSwKK2ZyZWUgdGhlIG5ld2x5IHJlYWQgbmFtZS4KKworVGhlIHdheSB3ZSBkbyB0aGlzIGlzIHRvIHRha2UgYSBsYXJnZSBjaHVuaywgYWxsb2NhdGluZyBtZW1vcnkgZnJvbQorbG93IGFkZHJlc3Nlcy4gIFdoZW4geW91IHdhbnQgdG8gYnVpbGQgYSBzeW1ib2wgaW4gdGhlIGNodW5rIHlvdSBqdXN0CithZGQgY2hhcnMgYWJvdmUgdGhlIGN1cnJlbnQgImhpZ2ggd2F0ZXIgbWFyayIgaW4gdGhlIGNodW5rLiAgV2hlbiB5b3UKK2hhdmUgZmluaXNoZWQgYWRkaW5nIGNoYXJzLCBiZWNhdXNlIHlvdSBnb3QgdG8gdGhlIGVuZCBvZiB0aGUgc3ltYm9sLAoreW91IGtub3cgaG93IGxvbmcgdGhlIGNoYXJzIGFyZSwgYW5kIHlvdSBjYW4gY3JlYXRlIGEgbmV3IG9iamVjdC4KK01vc3RseSB0aGUgY2hhcnMgd2lsbCBub3QgYnVyc3Qgb3ZlciB0aGUgaGlnaGVzdCBhZGRyZXNzIG9mIHRoZSBjaHVuaywKK2JlY2F1c2UgeW91IHdvdWxkIHR5cGljYWxseSBleHBlY3QgYSBjaHVuayB0byBiZSAoc2F5KSAxMDAgdGltZXMgYXMKK2xvbmcgYXMgYW4gYXZlcmFnZSBvYmplY3QuCisKK0luIGNhc2UgdGhhdCBpc24ndCBjbGVhciwgd2hlbiB3ZSBoYXZlIGVub3VnaCBjaGFycyB0byBtYWtlIHVwCit0aGUgb2JqZWN0LCBUSEVZIEFSRSBBTFJFQURZIENPTlRJR1VPVVMgSU4gVEhFIENIVU5LIChndWFyYW50ZWVkKQorc28gd2UganVzdCBwb2ludCB0byBpdCB3aGVyZSBpdCBsaWVzLiAgTm8gbW92aW5nIG9mIGNoYXJzIGlzCituZWVkZWQgYW5kIHRoaXMgaXMgdGhlIHNlY29uZCB3aW46IHBvdGVudGlhbGx5IGxvbmcgc3RyaW5ncyBuZWVkCituZXZlciBiZSBleHBsaWNpdGx5IHNodWZmbGVkLiBPbmNlIGFuIG9iamVjdCBpcyBmb3JtZWQsIGl0IGRvZXMgbm90CitjaGFuZ2UgaXRzIGFkZHJlc3MgZHVyaW5nIGl0cyBsaWZldGltZS4KKworV2hlbiB0aGUgY2hhcnMgYnVyc3Qgb3ZlciBhIGNodW5rIGJvdW5kYXJ5LCB3ZSBhbGxvY2F0ZSBhIGxhcmdlcgorY2h1bmssIGFuZCB0aGVuIGNvcHkgdGhlIHBhcnRseSBmb3JtZWQgb2JqZWN0IGZyb20gdGhlIGVuZCBvZiB0aGUgb2xkCitjaHVuayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXcgbGFyZ2VyIGNodW5rLiAgV2UgdGhlbiBjYXJyeSBvbgorYWNjcmV0aW5nIGNoYXJhY3RlcnMgdG8gdGhlIGVuZCBvZiB0aGUgb2JqZWN0IGFzIHdlIG5vcm1hbGx5IHdvdWxkLgorCitBIHNwZWNpYWwgbWFjcm8gaXMgcHJvdmlkZWQgdG8gYWRkIGEgc2luZ2xlIGNoYXIgYXQgYSB0aW1lIHRvIGEKK2dyb3dpbmcgb2JqZWN0LiAgVGhpcyBhbGxvd3MgdGhlIHVzZSBvZiByZWdpc3RlciB2YXJpYWJsZXMsIHdoaWNoCiticmVhayB0aGUgb3JkaW5hcnkgJ2dyb3d0aCcgbWFjcm8uCisKK1N1bW1hcnk6CisJV2UgYWxsb2NhdGUgbGFyZ2UgY2h1bmtzLgorCVdlIGNhcnZlIG91dCBvbmUgb2JqZWN0IGF0IGEgdGltZSBmcm9tIHRoZSBjdXJyZW50IGNodW5rLgorCU9uY2UgY2FydmVkLCBhbiBvYmplY3QgbmV2ZXIgbW92ZXMuCisJV2UgYXJlIGZyZWUgdG8gYXBwZW5kIGRhdGEgb2YgYW55IHNpemUgdG8gdGhlIGN1cnJlbnRseQorCSAgZ3Jvd2luZyBvYmplY3QuCisJRXhhY3RseSBvbmUgb2JqZWN0IGlzIGdyb3dpbmcgaW4gYW4gb2JzdGFjayBhdCBhbnkgb25lIHRpbWUuCisJWW91IGNhbiBydW4gb25lIG9ic3RhY2sgcGVyIGNvbnRyb2wgYmxvY2suCisJWW91IG1heSBoYXZlIGFzIG1hbnkgY29udHJvbCBibG9ja3MgYXMgeW91IGRhcmUuCisJQmVjYXVzZSBvZiB0aGUgd2F5IHdlIGRvIGl0LCB5b3UgY2FuIGB1bndpbmQnIGFuIG9ic3RhY2sKKwkgIGJhY2sgdG8gYSBwcmV2aW91cyBzdGF0ZS4gKFlvdSBtYXkgcmVtb3ZlIG9iamVjdHMgbXVjaAorCSAgYXMgeW91IHdvdWxkIHdpdGggYSBzdGFjay4pCisqLworCisKKy8qIERvbid0IGRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbW9yZSB0aGFuIG9uY2UuICAqLworCisjaWZuZGVmIF9PQlNUQUNLX0gKKyNkZWZpbmUgX09CU1RBQ0tfSCAxCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwwKKy8qIFdlIG5lZWQgdGhlIHR5cGUgb2YgYSBwb2ludGVyIHN1YnRyYWN0aW9uLiAgSWYgX19QVFJESUZGX1RZUEVfXyBpcworICAgZGVmaW5lZCwgYXMgd2l0aCBHTlUgQywgdXNlIHRoYXQ7IHRoYXQgd2F5IHdlIGRvbid0IHBvbGx1dGUgdGhlCisgICBuYW1lc3BhY2Ugd2l0aCA8c3RkZGVmLmg+J3Mgc3ltYm9scy4gIE90aGVyd2lzZSwgaW5jbHVkZSA8c3RkZGVmLmg+CisgICBhbmQgdXNlIHB0cmRpZmZfdC4gICovCisKKyNpZmRlZiBfX1BUUkRJRkZfVFlQRV9fCisjIGRlZmluZSBQVFJfSU5UX1RZUEUgX19QVFJESUZGX1RZUEVfXworI2Vsc2UKKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisjIGRlZmluZSBQVFJfSU5UX1RZUEUgcHRyZGlmZl90CisjZW5kaWYKKworLyogSWYgQiBpcyB0aGUgYmFzZSBvZiBhbiBvYmplY3QgYWRkcmVzc2VkIGJ5IFAsIHJldHVybiB0aGUgcmVzdWx0IG9mCisgICBhbGlnbmluZyBQIHRvIHRoZSBuZXh0IG11bHRpcGxlIG9mIEEgKyAxLiAgQiBhbmQgUCBtdXN0IGJlIG9mIHR5cGUKKyAgIGNoYXIgKi4gIEEgKyAxIG11c3QgYmUgYSBwb3dlciBvZiAyLiAgKi8KKworI2RlZmluZSBfX0JQVFJfQUxJR04oQiwgUCwgQSkgKChCKSArICgoKFApIC0gKEIpICsgKEEpKSAmIH4oQSkpKQorCisvKiBTaW1pbGlhciB0byBfQlBUUl9BTElHTiAoQiwgUCwgQSksIGV4Y2VwdCBvcHRpbWl6ZSB0aGUgY29tbW9uIGNhc2UKKyAgIHdoZXJlIHBvaW50ZXJzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gaW50ZWdlcnMsIGFsaWduZWQgYXMgaW50ZWdlcnMsCisgICBhbmQgY29udmVydGVkIGJhY2sgYWdhaW4uICBJZiBQVFJfSU5UX1RZUEUgaXMgbmFycm93ZXIgdGhhbiBhCisgICBwb2ludGVyIChlLmcuLCB0aGUgQVMvNDAwKSwgcGxheSBpdCBzYWZlIGFuZCBjb21wdXRlIHRoZSBhbGlnbm1lbnQKKyAgIHJlbGF0aXZlIHRvIEIuICBPdGhlcndpc2UsIHVzZSB0aGUgZmFzdGVyIHN0cmF0ZWd5IG9mIGNvbXB1dGluZyB0aGUKKyAgIGFsaWdubWVudCByZWxhdGl2ZSB0byAwLiAgKi8KKworI2RlZmluZSBfX1BUUl9BTElHTihCLCBQLCBBKQkJCQkJCSAgICBcCisgIF9fQlBUUl9BTElHTiAoc2l6ZW9mIChQVFJfSU5UX1RZUEUpIDwgc2l6ZW9mICh2b2lkICopID8gKEIpIDogKGNoYXIgKikgMCwgXAorCQlQLCBBKQorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0cnVjdCBfb2JzdGFja19jaHVuawkJLyogTGl2ZXMgYXQgZnJvbnQgb2YgZWFjaCBjaHVuay4gKi8KK3sKKyAgY2hhciAgKmxpbWl0OwkJCS8qIDEgcGFzdCBlbmQgb2YgdGhpcyBjaHVuayAqLworICBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKnByZXY7CS8qIGFkZHJlc3Mgb2YgcHJpb3IgY2h1bmsgb3IgTlVMTCAqLworICBjaGFyCWNvbnRlbnRzWzRdOwkJLyogb2JqZWN0cyBiZWdpbiBoZXJlICovCit9OworCitzdHJ1Y3Qgb2JzdGFjawkJLyogY29udHJvbCBjdXJyZW50IG9iamVjdCBpbiBjdXJyZW50IGNodW5rICovCit7CisgIGxvbmcJY2h1bmtfc2l6ZTsJCS8qIHByZWZlcnJlZCBzaXplIHRvIGFsbG9jYXRlIGNodW5rcyBpbiAqLworICBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKmNodW5rOwkvKiBhZGRyZXNzIG9mIGN1cnJlbnQgc3RydWN0IG9ic3RhY2tfY2h1bmsgKi8KKyAgY2hhcgkqb2JqZWN0X2Jhc2U7CQkvKiBhZGRyZXNzIG9mIG9iamVjdCB3ZSBhcmUgYnVpbGRpbmcgKi8KKyAgY2hhcgkqbmV4dF9mcmVlOwkJLyogd2hlcmUgdG8gYWRkIG5leHQgY2hhciB0byBjdXJyZW50IG9iamVjdCAqLworICBjaGFyCSpjaHVua19saW1pdDsJCS8qIGFkZHJlc3Mgb2YgY2hhciBhZnRlciBjdXJyZW50IGNodW5rICovCisgIHVuaW9uCisgIHsKKyAgICBQVFJfSU5UX1RZUEUgdGVtcGludDsKKyAgICB2b2lkICp0ZW1wcHRyOworICB9IHRlbXA7CQkJLyogVGVtcG9yYXJ5IGZvciBzb21lIG1hY3Jvcy4gICovCisgIGludCAgIGFsaWdubWVudF9tYXNrOwkJLyogTWFzayBvZiBhbGlnbm1lbnQgZm9yIGVhY2ggb2JqZWN0LiAqLworICAvKiBUaGVzZSBwcm90b3R5cGVzIHZhcnkgYmFzZWQgb24gYHVzZV9leHRyYV9hcmcnLCBhbmQgd2UgdXNlCisgICAgIGNhc3RzIHRvIHRoZSBwcm90b3R5cGVsZXNzIGZ1bmN0aW9uIHR5cGUgaW4gYWxsIGFzc2lnbm1lbnRzLAorICAgICBidXQgaGF2aW5nIHByb3RvdHlwZXMgaGVyZSBxdWlldHMgLVdzdHJpY3QtcHJvdG90eXBlcy4gICovCisgIHN0cnVjdCBfb2JzdGFja19jaHVuayAqKCpjaHVua2Z1bikgKHZvaWQgKiwgbG9uZyk7CisgIHZvaWQgKCpmcmVlZnVuKSAodm9pZCAqLCBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKik7CisgIHZvaWQgKmV4dHJhX2FyZzsJCS8qIGZpcnN0IGFyZyBmb3IgY2h1bmsgYWxsb2MvZGVhbGxvYyBmdW5jcyAqLworICB1bnNpZ25lZCB1c2VfZXh0cmFfYXJnOjE7CS8qIGNodW5rIGFsbG9jL2RlYWxsb2MgZnVuY3MgdGFrZSBleHRyYSBhcmcgKi8KKyAgdW5zaWduZWQgbWF5YmVfZW1wdHlfb2JqZWN0OjE7LyogVGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBjdXJyZW50CisJCQkJICAgY2h1bmsgY29udGFpbnMgYSB6ZXJvLWxlbmd0aCBvYmplY3QuICBUaGlzCisJCQkJICAgcHJldmVudHMgZnJlZWluZyB0aGUgY2h1bmsgaWYgd2UgYWxsb2NhdGUKKwkJCQkgICBhIGJpZ2dlciBjaHVuayB0byByZXBsYWNlIGl0LiAqLworICB1bnNpZ25lZCBhbGxvY19mYWlsZWQ6MTsJLyogTm8gbG9uZ2VyIHVzZWQsIGFzIHdlIG5vdyBjYWxsIHRoZSBmYWlsZWQKKwkJCQkgICBoYW5kbGVyIG9uIGVycm9yLCBidXQgcmV0YWluZWQgZm9yIGJpbmFyeQorCQkJCSAgIGNvbXBhdGliaWxpdHkuICAqLworfTsKKworLyogRGVjbGFyZSB0aGUgZXh0ZXJuYWwgZnVuY3Rpb25zIHdlIHVzZTsgdGhleSBhcmUgaW4gb2JzdGFjay5jLiAgKi8KKworZXh0ZXJuIHZvaWQgX29ic3RhY2tfbmV3Y2h1bmsgKHN0cnVjdCBvYnN0YWNrICosIGludCk7CitleHRlcm4gaW50IF9vYnN0YWNrX2JlZ2luIChzdHJ1Y3Qgb2JzdGFjayAqLCBpbnQsIGludCwKKwkJCSAgICB2b2lkICooKikgKGxvbmcpLCB2b2lkICgqKSAodm9pZCAqKSk7CitleHRlcm4gaW50IF9vYnN0YWNrX2JlZ2luXzEgKHN0cnVjdCBvYnN0YWNrICosIGludCwgaW50LAorCQkJICAgICB2b2lkICooKikgKHZvaWQgKiwgbG9uZyksCisJCQkgICAgIHZvaWQgKCopICh2b2lkICosIHZvaWQgKiksIHZvaWQgKik7CitleHRlcm4gaW50IF9vYnN0YWNrX21lbW9yeV91c2VkIChzdHJ1Y3Qgb2JzdGFjayAqKTsKKwordm9pZCBvYnN0YWNrX2ZyZWUgKHN0cnVjdCBvYnN0YWNrICpfX29ic3RhY2ssIHZvaWQgKl9fYmxvY2spOworCisMCisvKiBFcnJvciBoYW5kbGVyIGNhbGxlZCB3aGVuIGBvYnN0YWNrX2NodW5rX2FsbG9jJyBmYWlsZWQgdG8gYWxsb2NhdGUKKyAgIG1vcmUgbWVtb3J5LiAgVGhpcyBjYW4gYmUgc2V0IHRvIGEgdXNlciBkZWZpbmVkIGZ1bmN0aW9uIHdoaWNoCisgICBzaG91bGQgZWl0aGVyIGFib3J0IGdyYWNlZnVsbHkgb3IgdXNlIGxvbmdqdW1wIC0gYnV0IHNob3VsZG4ndAorICAgcmV0dXJuLiAgVGhlIGRlZmF1bHQgYWN0aW9uIGlzIHRvIHByaW50IGEgbWVzc2FnZSBhbmQgYWJvcnQuICAqLworZXh0ZXJuIHZvaWQgKCpvYnN0YWNrX2FsbG9jX2ZhaWxlZF9oYW5kbGVyKSAodm9pZCk7CisKKy8qIEV4aXQgdmFsdWUgdXNlZCB3aGVuIGBwcmludF9hbmRfYWJvcnQnIGlzIHVzZWQuICAqLworZXh0ZXJuIGludCBvYnN0YWNrX2V4aXRfZmFpbHVyZTsKKwwKKy8qIFBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIG9iamVjdCBiZWluZyBhbGxvY2F0ZWQgb3IgdG8gYmUgYWxsb2NhdGVkIG5leHQuCisgICBOb3RlIHRoYXQgdGhpcyBtaWdodCBub3QgYmUgdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlIG9iamVjdAorICAgYmVjYXVzZSBhIG5ldyBjaHVuayBtaWdodCBiZSBuZWVkZWQgdG8gaG9sZCB0aGUgZmluYWwgc2l6ZS4gICovCisKKyNkZWZpbmUgb2JzdGFja19iYXNlKGgpICgodm9pZCAqKSAoaCktPm9iamVjdF9iYXNlKQorCisvKiBTaXplIGZvciBhbGxvY2F0aW5nIG9yZGluYXJ5IGNodW5rcy4gICovCisKKyNkZWZpbmUgb2JzdGFja19jaHVua19zaXplKGgpICgoaCktPmNodW5rX3NpemUpCisKKy8qIFBvaW50ZXIgdG8gbmV4dCBieXRlIG5vdCB5ZXQgYWxsb2NhdGVkIGluIGN1cnJlbnQgY2h1bmsuICAqLworCisjZGVmaW5lIG9ic3RhY2tfbmV4dF9mcmVlKGgpCSgoaCktPm5leHRfZnJlZSkKKworLyogTWFzayBzcGVjaWZ5aW5nIGxvdyBiaXRzIHRoYXQgc2hvdWxkIGJlIGNsZWFyIGluIGFkZHJlc3Mgb2YgYW4gb2JqZWN0LiAgKi8KKworI2RlZmluZSBvYnN0YWNrX2FsaWdubWVudF9tYXNrKGgpICgoaCktPmFsaWdubWVudF9tYXNrKQorCisvKiBUbyBwcmV2ZW50IHByb3RvdHlwZSB3YXJuaW5ncyBwcm92aWRlIGNvbXBsZXRlIGFyZ3VtZW50IGxpc3QuICAqLworI2RlZmluZSBvYnN0YWNrX2luaXQoaCkJCQkJCQlcCisgIF9vYnN0YWNrX2JlZ2luICgoaCksIDAsIDAsCQkJCQlcCisJCSAgKHZvaWQgKigqKSAobG9uZykpIG9ic3RhY2tfY2h1bmtfYWxsb2MsCVwKKwkJICAodm9pZCAoKikgKHZvaWQgKikpIG9ic3RhY2tfY2h1bmtfZnJlZSkKKworI2RlZmluZSBvYnN0YWNrX2JlZ2luKGgsIHNpemUpCQkJCQlcCisgIF9vYnN0YWNrX2JlZ2luICgoaCksIChzaXplKSwgMCwJCQkJXAorCQkgICh2b2lkICooKikgKGxvbmcpKSBvYnN0YWNrX2NodW5rX2FsbG9jLAlcCisJCSAgKHZvaWQgKCopICh2b2lkICopKSBvYnN0YWNrX2NodW5rX2ZyZWUpCisKKyNkZWZpbmUgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb24oaCwgc2l6ZSwgYWxpZ25tZW50LCBjaHVua2Z1biwgZnJlZWZ1bikgIFwKKyAgX29ic3RhY2tfYmVnaW4gKChoKSwgKHNpemUpLCAoYWxpZ25tZW50KSwJCQkJICAgXAorCQkgICh2b2lkICooKikgKGxvbmcpKSAoY2h1bmtmdW4pLAkJCSAgIFwKKwkJICAodm9pZCAoKikgKHZvaWQgKikpIChmcmVlZnVuKSkKKworI2RlZmluZSBvYnN0YWNrX3NwZWNpZnlfYWxsb2NhdGlvbl93aXRoX2FyZyhoLCBzaXplLCBhbGlnbm1lbnQsIGNodW5rZnVuLCBmcmVlZnVuLCBhcmcpIFwKKyAgX29ic3RhY2tfYmVnaW5fMSAoKGgpLCAoc2l6ZSksIChhbGlnbm1lbnQpLAkJCQlcCisJCSAgICAodm9pZCAqKCopICh2b2lkICosIGxvbmcpKSAoY2h1bmtmdW4pLAkJXAorCQkgICAgKHZvaWQgKCopICh2b2lkICosIHZvaWQgKikpIChmcmVlZnVuKSwgKGFyZykpCisKKyNkZWZpbmUgb2JzdGFja19jaHVua2Z1bihoLCBuZXdjaHVua2Z1bikgXAorICAoKGgpIC0+IGNodW5rZnVuID0gKHN0cnVjdCBfb2JzdGFja19jaHVuayAqKCopKHZvaWQgKiwgbG9uZykpIChuZXdjaHVua2Z1bikpCisKKyNkZWZpbmUgb2JzdGFja19mcmVlZnVuKGgsIG5ld2ZyZWVmdW4pIFwKKyAgKChoKSAtPiBmcmVlZnVuID0gKHZvaWQgKCopKHZvaWQgKiwgc3RydWN0IF9vYnN0YWNrX2NodW5rICopKSAobmV3ZnJlZWZ1bikpCisKKyNkZWZpbmUgb2JzdGFja18xZ3Jvd19mYXN0KGgsYWNoYXIpICgqKChoKS0+bmV4dF9mcmVlKSsrID0gKGFjaGFyKSkKKworI2RlZmluZSBvYnN0YWNrX2JsYW5rX2Zhc3QoaCxuKSAoKGgpLT5uZXh0X2ZyZWUgKz0gKG4pKQorCisjZGVmaW5lIG9ic3RhY2tfbWVtb3J5X3VzZWQoaCkgX29ic3RhY2tfbWVtb3J5X3VzZWQgKGgpCisMCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCisvKiBOZXh0U3RlcCAyLjAgY2MgaXMgcmVhbGx5IGdjYyAxLjkzIGJ1dCBpdCBkZWZpbmVzIF9fR05VQ19fID0gMiBhbmQKKyAgIGRvZXMgbm90IGltcGxlbWVudCBfX2V4dGVuc2lvbl9fLiAgQnV0IHRoYXQgY29tcGlsZXIgZG9lc24ndCBkZWZpbmUKKyAgIF9fR05VQ19NSU5PUl9fLiAgKi8KKyMgaWYgX19HTlVDX18gPCAyIHx8IChfX05lWFRfXyAmJiAhX19HTlVDX01JTk9SX18pCisjICBkZWZpbmUgX19leHRlbnNpb25fXworIyBlbmRpZgorCisvKiBGb3IgR05VIEMsIGlmIG5vdCAtdHJhZGl0aW9uYWwsCisgICB3ZSBjYW4gZGVmaW5lIHRoZXNlIG1hY3JvcyB0byBjb21wdXRlIGFsbCBhcmdzIG9ubHkgb25jZQorICAgd2l0aG91dCB1c2luZyBhIGdsb2JhbCB2YXJpYWJsZS4KKyAgIEFsc28sIHdlIGNhbiBhdm9pZCB1c2luZyB0aGUgYHRlbXAnIHNsb3QsIHRvIG1ha2UgZmFzdGVyIGNvZGUuICAqLworCisjIGRlZmluZSBvYnN0YWNrX29iamVjdF9zaXplKE9CU1RBQ0spCQkJCQlcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyAgKHsgc3RydWN0IG9ic3RhY2sgY29uc3QgKl9fbyA9IChPQlNUQUNLKTsJCQkJXAorICAgICAodW5zaWduZWQpIChfX28tPm5leHRfZnJlZSAtIF9fby0+b2JqZWN0X2Jhc2UpOyB9KQorCisjIGRlZmluZSBvYnN0YWNrX3Jvb20oT0JTVEFDSykJCQkJCQlcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyAgKHsgc3RydWN0IG9ic3RhY2sgY29uc3QgKl9fbyA9IChPQlNUQUNLKTsJCQkJXAorICAgICAodW5zaWduZWQpIChfX28tPmNodW5rX2xpbWl0IC0gX19vLT5uZXh0X2ZyZWUpOyB9KQorCisjIGRlZmluZSBvYnN0YWNrX21ha2Vfcm9vbShPQlNUQUNLLGxlbmd0aCkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKKyAgIGludCBfX2xlbiA9IChsZW5ndGgpOwkJCQkJCVwKKyAgIGlmIChfX28tPmNodW5rX2xpbWl0IC0gX19vLT5uZXh0X2ZyZWUgPCBfX2xlbikJCQlcCisgICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIF9fbGVuKTsJCQkJCVwKKyAgICh2b2lkKSAwOyB9KQorCisjIGRlZmluZSBvYnN0YWNrX2VtcHR5X3AoT0JTVEFDSykJCQkJCVwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJXAorICAoeyBzdHJ1Y3Qgb2JzdGFjayBjb25zdCAqX19vID0gKE9CU1RBQ0spOwkJCQlcCisgICAgIChfX28tPmNodW5rLT5wcmV2ID09IDAJCQkJCQlcCisgICAgICAmJiBfX28tPm5leHRfZnJlZSA9PSBfX1BUUl9BTElHTiAoKGNoYXIgKikgX19vLT5jaHVuaywJCVwKKwkJCQkJX19vLT5jaHVuay0+Y29udGVudHMsCQlcCisJCQkJCV9fby0+YWxpZ25tZW50X21hc2spKTsgfSkKKworIyBkZWZpbmUgb2JzdGFja19ncm93KE9CU1RBQ0ssd2hlcmUsbGVuZ3RoKQkJCQlcCitfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAorICAgaW50IF9fbGVuID0gKGxlbmd0aCk7CQkJCQkJXAorICAgaWYgKF9fby0+bmV4dF9mcmVlICsgX19sZW4gPiBfX28tPmNodW5rX2xpbWl0KQkJCVwKKyAgICAgX29ic3RhY2tfbmV3Y2h1bmsgKF9fbywgX19sZW4pOwkJCQkJXAorICAgbWVtY3B5IChfX28tPm5leHRfZnJlZSwgd2hlcmUsIF9fbGVuKTsJCQkJXAorICAgX19vLT5uZXh0X2ZyZWUgKz0gX19sZW47CQkJCQkJXAorICAgKHZvaWQpIDA7IH0pCisKKyMgZGVmaW5lIG9ic3RhY2tfZ3JvdzAoT0JTVEFDSyx3aGVyZSxsZW5ndGgpCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCisgICBpbnQgX19sZW4gPSAobGVuZ3RoKTsJCQkJCQlcCisgICBpZiAoX19vLT5uZXh0X2ZyZWUgKyBfX2xlbiArIDEgPiBfX28tPmNodW5rX2xpbWl0KQkJCVwKKyAgICAgX29ic3RhY2tfbmV3Y2h1bmsgKF9fbywgX19sZW4gKyAxKTsJCQkJXAorICAgbWVtY3B5IChfX28tPm5leHRfZnJlZSwgd2hlcmUsIF9fbGVuKTsJCQkJXAorICAgX19vLT5uZXh0X2ZyZWUgKz0gX19sZW47CQkJCQkJXAorICAgKihfX28tPm5leHRfZnJlZSkrKyA9IDA7CQkJCQkJXAorICAgKHZvaWQpIDA7IH0pCisKKyMgZGVmaW5lIG9ic3RhY2tfMWdyb3coT0JTVEFDSyxkYXR1bSkJCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCisgICBpZiAoX19vLT5uZXh0X2ZyZWUgKyAxID4gX19vLT5jaHVua19saW1pdCkJCQkJXAorICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCAxKTsJCQkJCVwKKyAgIG9ic3RhY2tfMWdyb3dfZmFzdCAoX19vLCBkYXR1bSk7CQkJCQlcCisgICAodm9pZCkgMDsgfSkKKworLyogVGhlc2UgYXNzdW1lIHRoYXQgdGhlIG9ic3RhY2sgYWxpZ25tZW50IGlzIGdvb2QgZW5vdWdoIGZvciBwb2ludGVycworICAgb3IgaW50cywgYW5kIHRoYXQgdGhlIGRhdGEgYWRkZWQgc28gZmFyIHRvIHRoZSBjdXJyZW50IG9iamVjdAorICAgc2hhcmVzIHRoYXQgbXVjaCBhbGlnbm1lbnQuICAqLworCisjIGRlZmluZSBvYnN0YWNrX3B0cl9ncm93KE9CU1RBQ0ssZGF0dW0pCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCisgICBpZiAoX19vLT5uZXh0X2ZyZWUgKyBzaXplb2YgKHZvaWQgKikgPiBfX28tPmNodW5rX2xpbWl0KQkJXAorICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCBzaXplb2YgKHZvaWQgKikpOwkJCQlcCisgICBvYnN0YWNrX3B0cl9ncm93X2Zhc3QgKF9fbywgZGF0dW0pOyB9KQkJCQlcCisKKyMgZGVmaW5lIG9ic3RhY2tfaW50X2dyb3coT0JTVEFDSyxkYXR1bSkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKKyAgIGlmIChfX28tPm5leHRfZnJlZSArIHNpemVvZiAoaW50KSA+IF9fby0+Y2h1bmtfbGltaXQpCQlcCisgICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIHNpemVvZiAoaW50KSk7CQkJCVwKKyAgIG9ic3RhY2tfaW50X2dyb3dfZmFzdCAoX19vLCBkYXR1bSk7IH0pCisKKyMgZGVmaW5lIG9ic3RhY2tfcHRyX2dyb3dfZmFzdChPQlNUQUNLLGFwdHIpCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX28xID0gKE9CU1RBQ0spOwkJCQkJXAorICAgKihjb25zdCB2b2lkICoqKSBfX28xLT5uZXh0X2ZyZWUgPSAoYXB0cik7CQkJCVwKKyAgIF9fbzEtPm5leHRfZnJlZSArPSBzaXplb2YgKGNvbnN0IHZvaWQgKik7CQkJCVwKKyAgICh2b2lkKSAwOyB9KQorCisjIGRlZmluZSBvYnN0YWNrX2ludF9ncm93X2Zhc3QoT0JTVEFDSyxhaW50KQkJCQlcCitfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vMSA9IChPQlNUQUNLKTsJCQkJCVwKKyAgICooaW50ICopIF9fbzEtPm5leHRfZnJlZSA9IChhaW50KTsJCQkJCVwKKyAgIF9fbzEtPm5leHRfZnJlZSArPSBzaXplb2YgKGludCk7CQkJCQlcCisgICAodm9pZCkgMDsgfSkKKworIyBkZWZpbmUgb2JzdGFja19ibGFuayhPQlNUQUNLLGxlbmd0aCkJCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCisgICBpbnQgX19sZW4gPSAobGVuZ3RoKTsJCQkJCQlcCisgICBpZiAoX19vLT5jaHVua19saW1pdCAtIF9fby0+bmV4dF9mcmVlIDwgX19sZW4pCQkJXAorICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCBfX2xlbik7CQkJCQlcCisgICBvYnN0YWNrX2JsYW5rX2Zhc3QgKF9fbywgX19sZW4pOwkJCQkJXAorICAgKHZvaWQpIDA7IH0pCisKKyMgZGVmaW5lIG9ic3RhY2tfYWxsb2MoT0JTVEFDSyxsZW5ndGgpCQkJCQlcCitfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisoeyBzdHJ1Y3Qgb2JzdGFjayAqX19oID0gKE9CU1RBQ0spOwkJCQkJXAorICAgb2JzdGFja19ibGFuayAoX19oLCAobGVuZ3RoKSk7CQkJCQlcCisgICBvYnN0YWNrX2ZpbmlzaCAoX19oKTsgfSkKKworIyBkZWZpbmUgb2JzdGFja19jb3B5KE9CU1RBQ0ssd2hlcmUsbGVuZ3RoKQkJCQlcCitfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisoeyBzdHJ1Y3Qgb2JzdGFjayAqX19oID0gKE9CU1RBQ0spOwkJCQkJXAorICAgb2JzdGFja19ncm93IChfX2gsICh3aGVyZSksIChsZW5ndGgpKTsJCQkJXAorICAgb2JzdGFja19maW5pc2ggKF9faCk7IH0pCisKKyMgZGVmaW5lIG9ic3RhY2tfY29weTAoT0JTVEFDSyx3aGVyZSxsZW5ndGgpCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX2ggPSAoT0JTVEFDSyk7CQkJCQlcCisgICBvYnN0YWNrX2dyb3cwIChfX2gsICh3aGVyZSksIChsZW5ndGgpKTsJCQkJXAorICAgb2JzdGFja19maW5pc2ggKF9faCk7IH0pCisKKy8qIFRoZSBsb2NhbCB2YXJpYWJsZSBpcyBuYW1lZCBfX28xIHRvIGF2b2lkIGEgbmFtZSBjb25mbGljdAorICAgd2hlbiBvYnN0YWNrX2JsYW5rIGlzIGNhbGxlZC4gICovCisjIGRlZmluZSBvYnN0YWNrX2ZpbmlzaChPQlNUQUNLKQkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9fbzEgPSAoT0JTVEFDSyk7CQkJCQlcCisgICB2b2lkICpfX3ZhbHVlID0gKHZvaWQgKikgX19vMS0+b2JqZWN0X2Jhc2U7CQkJCVwKKyAgIGlmIChfX28xLT5uZXh0X2ZyZWUgPT0gX192YWx1ZSkJCQkJCVwKKyAgICAgX19vMS0+bWF5YmVfZW1wdHlfb2JqZWN0ID0gMTsJCQkJCVwKKyAgIF9fbzEtPm5leHRfZnJlZQkJCQkJCQlcCisgICAgID0gX19QVFJfQUxJR04gKF9fbzEtPm9iamVjdF9iYXNlLCBfX28xLT5uZXh0X2ZyZWUsCQkJXAorCQkgICAgX19vMS0+YWxpZ25tZW50X21hc2spOwkJCQlcCisgICBpZiAoX19vMS0+bmV4dF9mcmVlIC0gKGNoYXIgKilfX28xLT5jaHVuawkJCQlcCisgICAgICAgPiBfX28xLT5jaHVua19saW1pdCAtIChjaGFyICopX19vMS0+Y2h1bmspCQkJXAorICAgICBfX28xLT5uZXh0X2ZyZWUgPSBfX28xLT5jaHVua19saW1pdDsJCQkJXAorICAgX19vMS0+b2JqZWN0X2Jhc2UgPSBfX28xLT5uZXh0X2ZyZWU7CQkJCQlcCisgICBfX3ZhbHVlOyB9KQorCisjIGRlZmluZSBvYnN0YWNrX2ZyZWUoT0JTVEFDSywgT0JKKQkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKKyAgIHZvaWQgKl9fb2JqID0gKE9CSik7CQkJCQkJCVwKKyAgIGlmIChfX29iaiA+ICh2b2lkICopX19vLT5jaHVuayAmJiBfX29iaiA8ICh2b2lkICopX19vLT5jaHVua19saW1pdCkgIFwKKyAgICAgX19vLT5uZXh0X2ZyZWUgPSBfX28tPm9iamVjdF9iYXNlID0gKGNoYXIgKilfX29iajsJCQlcCisgICBlbHNlIChvYnN0YWNrX2ZyZWUpIChfX28sIF9fb2JqKTsgfSkKKwwKKyNlbHNlIC8qIG5vdCBfX0dOVUNfXyBvciBub3QgX19TVERDX18gKi8KKworIyBkZWZpbmUgb2JzdGFja19vYmplY3Rfc2l6ZShoKSBcCisgKHVuc2lnbmVkKSAoKGgpLT5uZXh0X2ZyZWUgLSAoaCktPm9iamVjdF9iYXNlKQorCisjIGRlZmluZSBvYnN0YWNrX3Jvb20oaCkJCVwKKyAodW5zaWduZWQpICgoaCktPmNodW5rX2xpbWl0IC0gKGgpLT5uZXh0X2ZyZWUpCisKKyMgZGVmaW5lIG9ic3RhY2tfZW1wdHlfcChoKSBcCisgKChoKS0+Y2h1bmstPnByZXYgPT0gMAkJCQkJCQlcCisgICYmIChoKS0+bmV4dF9mcmVlID09IF9fUFRSX0FMSUdOICgoY2hhciAqKSAoaCktPmNodW5rLAkJXAorCQkJCSAgICAoaCktPmNodW5rLT5jb250ZW50cywJCVwKKwkJCQkgICAgKGgpLT5hbGlnbm1lbnRfbWFzaykpCisKKy8qIE5vdGUgdGhhdCB0aGUgY2FsbCB0byBfb2JzdGFja19uZXdjaHVuayBpcyBlbmNsb3NlZCBpbiAoLi4uLCAwKQorICAgc28gdGhhdCB3ZSBjYW4gYXZvaWQgaGF2aW5nIHZvaWQgZXhwcmVzc2lvbnMKKyAgIGluIHRoZSBhcm1zIG9mIHRoZSBjb25kaXRpb25hbCBleHByZXNzaW9uLgorICAgQ2FzdGluZyB0aGUgdGhpcmQgb3BlcmFuZCB0byB2b2lkIHdhcyB0cmllZCBiZWZvcmUsCisgICBidXQgc29tZSBjb21waWxlcnMgd29uJ3QgYWNjZXB0IGl0LiAgKi8KKworIyBkZWZpbmUgb2JzdGFja19tYWtlX3Jvb20oaCxsZW5ndGgpCQkJCQlcCisoIChoKS0+dGVtcC50ZW1waW50ID0gKGxlbmd0aCksCQkJCQkJXAorICAoKChoKS0+bmV4dF9mcmVlICsgKGgpLT50ZW1wLnRlbXBpbnQgPiAoaCktPmNodW5rX2xpbWl0KQkJXAorICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKChoKSwgKGgpLT50ZW1wLnRlbXBpbnQpLCAwKSA6IDApKQorCisjIGRlZmluZSBvYnN0YWNrX2dyb3coaCx3aGVyZSxsZW5ndGgpCQkJCQlcCisoIChoKS0+dGVtcC50ZW1waW50ID0gKGxlbmd0aCksCQkJCQkJXAorICAoKChoKS0+bmV4dF9mcmVlICsgKGgpLT50ZW1wLnRlbXBpbnQgPiAoaCktPmNodW5rX2xpbWl0KQkJXAorICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKChoKSwgKGgpLT50ZW1wLnRlbXBpbnQpLCAwKSA6IDApLAkJXAorICBtZW1jcHkgKChoKS0+bmV4dF9mcmVlLCB3aGVyZSwgKGgpLT50ZW1wLnRlbXBpbnQpLAkJCVwKKyAgKGgpLT5uZXh0X2ZyZWUgKz0gKGgpLT50ZW1wLnRlbXBpbnQpCisKKyMgZGVmaW5lIG9ic3RhY2tfZ3JvdzAoaCx3aGVyZSxsZW5ndGgpCQkJCQlcCisoIChoKS0+dGVtcC50ZW1waW50ID0gKGxlbmd0aCksCQkJCQkJXAorICAoKChoKS0+bmV4dF9mcmVlICsgKGgpLT50ZW1wLnRlbXBpbnQgKyAxID4gKGgpLT5jaHVua19saW1pdCkJCVwKKyAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIChoKS0+dGVtcC50ZW1waW50ICsgMSksIDApIDogMCksCQlcCisgIG1lbWNweSAoKGgpLT5uZXh0X2ZyZWUsIHdoZXJlLCAoaCktPnRlbXAudGVtcGludCksCQkJXAorICAoaCktPm5leHRfZnJlZSArPSAoaCktPnRlbXAudGVtcGludCwJCQkJCVwKKyAgKigoaCktPm5leHRfZnJlZSkrKyA9IDApCisKKyMgZGVmaW5lIG9ic3RhY2tfMWdyb3coaCxkYXR1bSkJCQkJCQlcCisoICgoKGgpLT5uZXh0X2ZyZWUgKyAxID4gKGgpLT5jaHVua19saW1pdCkJCQkJXAorICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKChoKSwgMSksIDApIDogMCksCQkJCVwKKyAgb2JzdGFja18xZ3Jvd19mYXN0IChoLCBkYXR1bSkpCisKKyMgZGVmaW5lIG9ic3RhY2tfcHRyX2dyb3coaCxkYXR1bSkJCQkJCVwKKyggKCgoaCktPm5leHRfZnJlZSArIHNpemVvZiAoY2hhciAqKSA+IChoKS0+Y2h1bmtfbGltaXQpCQlcCisgICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCBzaXplb2YgKGNoYXIgKikpLCAwKSA6IDApLAkJXAorICBvYnN0YWNrX3B0cl9ncm93X2Zhc3QgKGgsIGRhdHVtKSkKKworIyBkZWZpbmUgb2JzdGFja19pbnRfZ3JvdyhoLGRhdHVtKQkJCQkJXAorKCAoKChoKS0+bmV4dF9mcmVlICsgc2l6ZW9mIChpbnQpID4gKGgpLT5jaHVua19saW1pdCkJCQlcCisgICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCBzaXplb2YgKGludCkpLCAwKSA6IDApLAkJCVwKKyAgb2JzdGFja19pbnRfZ3Jvd19mYXN0IChoLCBkYXR1bSkpCisKKyMgZGVmaW5lIG9ic3RhY2tfcHRyX2dyb3dfZmFzdChoLGFwdHIpCQkJCQlcCisgICgoKGNvbnN0IHZvaWQgKiopICgoaCktPm5leHRfZnJlZSArPSBzaXplb2YgKHZvaWQgKikpKVstMV0gPSAoYXB0cikpCisKKyMgZGVmaW5lIG9ic3RhY2tfaW50X2dyb3dfZmFzdChoLGFpbnQpCQkJCQlcCisgICgoKGludCAqKSAoKGgpLT5uZXh0X2ZyZWUgKz0gc2l6ZW9mIChpbnQpKSlbLTFdID0gKGFpbnQpKQorCisjIGRlZmluZSBvYnN0YWNrX2JsYW5rKGgsbGVuZ3RoKQkJCQkJXAorKCAoaCktPnRlbXAudGVtcGludCA9IChsZW5ndGgpLAkJCQkJCVwKKyAgKCgoaCktPmNodW5rX2xpbWl0IC0gKGgpLT5uZXh0X2ZyZWUgPCAoaCktPnRlbXAudGVtcGludCkJCVwKKyAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIChoKS0+dGVtcC50ZW1waW50KSwgMCkgOiAwKSwJCVwKKyAgb2JzdGFja19ibGFua19mYXN0IChoLCAoaCktPnRlbXAudGVtcGludCkpCisKKyMgZGVmaW5lIG9ic3RhY2tfYWxsb2MoaCxsZW5ndGgpCQkJCQlcCisgKG9ic3RhY2tfYmxhbmsgKChoKSwgKGxlbmd0aCkpLCBvYnN0YWNrX2ZpbmlzaCAoKGgpKSkKKworIyBkZWZpbmUgb2JzdGFja19jb3B5KGgsd2hlcmUsbGVuZ3RoKQkJCQkJXAorIChvYnN0YWNrX2dyb3cgKChoKSwgKHdoZXJlKSwgKGxlbmd0aCkpLCBvYnN0YWNrX2ZpbmlzaCAoKGgpKSkKKworIyBkZWZpbmUgb2JzdGFja19jb3B5MChoLHdoZXJlLGxlbmd0aCkJCQkJCVwKKyAob2JzdGFja19ncm93MCAoKGgpLCAod2hlcmUpLCAobGVuZ3RoKSksIG9ic3RhY2tfZmluaXNoICgoaCkpKQorCisjIGRlZmluZSBvYnN0YWNrX2ZpbmlzaChoKQkJCQkJCVwKKyggKChoKS0+bmV4dF9mcmVlID09IChoKS0+b2JqZWN0X2Jhc2UJCQkJCVwKKyAgID8gKCgoaCktPm1heWJlX2VtcHR5X29iamVjdCA9IDEpLCAwKQkJCQkJXAorICAgOiAwKSwJCQkJCQkJCVwKKyAgKGgpLT50ZW1wLnRlbXBwdHIgPSAoaCktPm9iamVjdF9iYXNlLAkJCQkJXAorICAoaCktPm5leHRfZnJlZQkJCQkJCQlcCisgICAgPSBfX1BUUl9BTElHTiAoKGgpLT5vYmplY3RfYmFzZSwgKGgpLT5uZXh0X2ZyZWUsCQkJXAorCQkgICAoaCktPmFsaWdubWVudF9tYXNrKSwJCQkJXAorICAoKChoKS0+bmV4dF9mcmVlIC0gKGNoYXIgKikgKGgpLT5jaHVuawkJCQlcCisgICAgPiAoaCktPmNodW5rX2xpbWl0IC0gKGNoYXIgKikgKGgpLT5jaHVuaykJCQkJXAorICAgPyAoKGgpLT5uZXh0X2ZyZWUgPSAoaCktPmNodW5rX2xpbWl0KSA6IDApLAkJCQlcCisgIChoKS0+b2JqZWN0X2Jhc2UgPSAoaCktPm5leHRfZnJlZSwJCQkJCVwKKyAgKGgpLT50ZW1wLnRlbXBwdHIpCisKKyMgZGVmaW5lIG9ic3RhY2tfZnJlZShoLG9iaikJCQkJCQlcCisoIChoKS0+dGVtcC50ZW1waW50ID0gKGNoYXIgKikgKG9iaikgLSAoY2hhciAqKSAoaCktPmNodW5rLAkJXAorICAoKCgoaCktPnRlbXAudGVtcGludCA+IDAJCQkJCQlcCisgICAgJiYgKGgpLT50ZW1wLnRlbXBpbnQgPCAoaCktPmNodW5rX2xpbWl0IC0gKGNoYXIgKikgKGgpLT5jaHVuaykpCVwKKyAgID8gKCgoaCktPm5leHRfZnJlZSA9IChoKS0+b2JqZWN0X2Jhc2UJCQkJXAorICAgICAgID0gKGgpLT50ZW1wLnRlbXBpbnQgKyAoY2hhciAqKSAoaCktPmNodW5rKSwgMCkJCQlcCisgICA6ICgob2JzdGFja19mcmVlKSAoKGgpLCAoaCktPnRlbXAudGVtcGludCArIChjaGFyICopIChoKS0+Y2h1bmspLCAwKSkpCisKKyNlbmRpZiAvKiBub3QgX19HTlVDX18gb3Igbm90IF9fU1REQ19fICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQkvKiBDKysgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogb2JzdGFjay5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3BhbmVsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3BhbmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkMjA2MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcGFuZWwuaApAQCAtMCwwICsxLDg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDYsMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgKgorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgICoKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAqCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgKgorICogZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgICoKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAqCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAqCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAqCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAqCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgKgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgICoKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICoKKyAqIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAqCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgKgorICogYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEF1dGhvcjogWmV5ZCBNLiBCZW4tSGFsaW0gPHptYmVuaGFsQG5ldGNvbS5jb20+IDE5OTUgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICBhbmQ6IEVyaWMgUy4gUmF5bW9uZCA8ZXNyQHNuYXJrLnRoeXJzdXMuY29tPiAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgYW5kOiBKdWVyZ2VuIFBmZWlmZXIgICAgICAgICAgICAgICAgICAgICAgICAgMTk5Ni0xOTk5LDIwMDggICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICRJZDogcGFuZWwuaCx2IDEuMTEgMjAwOS8wNC8xMSAxOTo1MDo0MCB0b20gRXhwICQgKi8KKworLyogcGFuZWwuaCAtLSBpbnRlcmZhY2UgZmlsZSBmb3IgcGFuZWxzIGxpYnJhcnkgKi8KKworI2lmbmRlZiBOQ1VSU0VTX1BBTkVMX0hfaW5jbAorI2RlZmluZSBOQ1VSU0VTX1BBTkVMX0hfaW5jbCAxCisKKyNpbmNsdWRlIDxjdXJzZXMuaD4KKwordHlwZWRlZiBzdHJ1Y3QgcGFuZWwKK3sKKyAgV0lORE9XICp3aW47CisgIHN0cnVjdCBwYW5lbCAqYmVsb3c7CisgIHN0cnVjdCBwYW5lbCAqYWJvdmU7CisgIE5DVVJTRVNfQ09OU1Qgdm9pZCAqdXNlcjsKK30gUEFORUw7CisKKyNpZglkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyopIHBhbmVsX3dpbmRvdyAoY29uc3QgUEFORUwgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgICAgdXBkYXRlX3BhbmVscyAodm9pZCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgaGlkZV9wYW5lbCAoUEFORUwgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgc2hvd19wYW5lbCAoUEFORUwgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgZGVsX3BhbmVsIChQQU5FTCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpICAgICB0b3BfcGFuZWwgKFBBTkVMICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgICAgIGJvdHRvbV9wYW5lbCAoUEFORUwgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoUEFORUwqKSAgbmV3X3BhbmVsIChXSU5ET1cgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoUEFORUwqKSAgcGFuZWxfYWJvdmUgKGNvbnN0IFBBTkVMICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFBBTkVMKikgIHBhbmVsX2JlbG93IChjb25zdCBQQU5FTCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpICAgICBzZXRfcGFuZWxfdXNlcnB0ciAoUEFORUwgKiwgTkNVUlNFU19DT05TVCB2b2lkICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKE5DVVJTRVNfQ09OU1Qgdm9pZCopIHBhbmVsX3VzZXJwdHIgKGNvbnN0IFBBTkVMICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgICAgIG1vdmVfcGFuZWwgKFBBTkVMICosIGludCwgaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpICAgICByZXBsYWNlX3BhbmVsIChQQU5FTCAqLFdJTkRPVyAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpICAgICBwYW5lbF9oaWRkZW4gKGNvbnN0IFBBTkVMICopOworCisjaWYgTkNVUlNFU19TUF9GVU5DUworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFBBTkVMICopIGdyb3VuZF9wYW5lbChTQ1JFRU4gKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoUEFORUwgKikgY2VpbGluZ19wYW5lbChTQ1JFRU4gKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSAgICBOQ1VSU0VTX1NQX05BTUUodXBkYXRlX3BhbmVscykgKFNDUkVFTiopOworI2VuZGlmCisKKyNpZglkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKyNlbmRpZiAvKiBOQ1VSU0VTX1BBTkVMX0hfaW5jbCAqLworCisvKiBlbmQgb2YgcGFuZWwuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wYXRocy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wYXRocy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZGE5YzYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3BhdGhzLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylwYXRocy5oCTguMSAoQmVya2VsZXkpIDYvMi85MworICovCisKKyNpZm5kZWYgX1BBVEhTX0hfCisjZGVmaW5lCV9QQVRIU19IXworCisvKiBEZWZhdWx0IHNlYXJjaCBwYXRoLiAqLworI2RlZmluZQlfUEFUSF9ERUZQQVRICSIvdXNyL2JpbjovYmluIgorLyogQWxsIHN0YW5kYXJkIHV0aWxpdGllcyBwYXRoLiAqLworI2RlZmluZQlfUEFUSF9TVERQQVRIIFwKKwkiL3Vzci9iaW46L2JpbjovdXNyL3NiaW46L3NiaW4iCisKKyNkZWZpbmUJX1BBVEhfQlNIRUxMCSIvYmluL3NoIgorI2RlZmluZQlfUEFUSF9DT05TT0xFCSIvZGV2L2NvbnNvbGUiCisjZGVmaW5lCV9QQVRIX0NTSEVMTAkiL2Jpbi9jc2giCisjZGVmaW5lCV9QQVRIX0RFVkRCCSIvdmFyL3J1bi9kZXYuZGIiCisjZGVmaW5lCV9QQVRIX0RFVk5VTEwJIi9kZXYvbnVsbCIKKyNkZWZpbmUJX1BBVEhfRFJVTQkiL2Rldi9kcnVtIgorI2RlZmluZQlfUEFUSF9HU0hBRE9XCSIvZXRjL2dzaGFkb3ciCisjZGVmaW5lCV9QQVRIX0tMT0cJIi9wcm9jL2ttc2ciCisjZGVmaW5lCV9QQVRIX0tNRU0JIi9kZXYva21lbSIKKyNkZWZpbmUJX1BBVEhfTEFTVExPRwkiL3Zhci9sb2cvbGFzdGxvZyIKKyNkZWZpbmUJX1BBVEhfTUFJTERJUgkiL3Zhci9tYWlsIgorI2RlZmluZQlfUEFUSF9NQU4JIi91c3Ivc2hhcmUvbWFuIgorI2RlZmluZQlfUEFUSF9NRU0JIi9kZXYvbWVtIgorI2RlZmluZQlfUEFUSF9NTlRUQUIJIi9ldGMvZnN0YWIiCisjZGVmaW5lCV9QQVRIX01PVU5URUQJIi9ldGMvbXRhYiIKKyNkZWZpbmUJX1BBVEhfTk9MT0dJTgkiL2V0Yy9ub2xvZ2luIgorI2RlZmluZQlfUEFUSF9QUkVTRVJWRQkiL3Zhci9saWIiCisjZGVmaW5lCV9QQVRIX1JXSE9ESVIJIi92YXIvc3Bvb2wvcndobyIKKyNkZWZpbmUJX1BBVEhfU0VORE1BSUwJIi91c3Ivc2Jpbi9zZW5kbWFpbCIKKyNkZWZpbmUJX1BBVEhfU0hBRE9XCSIvZXRjL3NoYWRvdyIKKyNkZWZpbmUJX1BBVEhfU0hFTExTCSIvZXRjL3NoZWxscyIKKyNkZWZpbmUJX1BBVEhfVFRZCSIvZGV2L3R0eSIKKyNkZWZpbmUJX1BBVEhfVU5JWAkiL2Jvb3Qvdm1saW51eCIKKyNkZWZpbmUgX1BBVEhfVVRNUAkiL3Zhci9ydW4vdXRtcCIKKyNkZWZpbmUJX1BBVEhfVkkJIi91c3IvYmluL3ZpIgorI2RlZmluZSBfUEFUSF9XVE1QCSIvdmFyL2xvZy93dG1wIgorCisvKiBQcm92aWRlIHRyYWlsaW5nIHNsYXNoLCBzaW5jZSBtb3N0bHkgdXNlZCBmb3IgYnVpbGRpbmcgcGF0aG5hbWVzLiAqLworI2RlZmluZQlfUEFUSF9ERVYJIi9kZXYvIgorI2RlZmluZQlfUEFUSF9UTVAJIi90bXAvIgorI2RlZmluZQlfUEFUSF9WQVJEQgkiL3Zhci9saWIvbWlzYy8iCisjZGVmaW5lCV9QQVRIX1ZBUlJVTgkiL3Zhci9ydW4vIgorI2RlZmluZQlfUEFUSF9WQVJUTVAJIi92YXIvdG1wLyIKKworI2VuZGlmIC8qICFfUEFUSFNfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcG9sbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wb2xsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZmYjQxYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcG9sbC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wcmludGYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHJpbnRmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY4Y2YzNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHJpbnRmLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0xOTkzLDE5OTUtMjAwMSwyMDA2LDIwMDkKKwlGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfUFJJTlRGX0gKKworI2RlZmluZQlfUFJJTlRGX0gJMQorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2RlZmluZQlfX25lZWRfRklMRQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZGVmaW5lCV9fbmVlZF9zaXplX3QKKyNkZWZpbmUgX19uZWVkX3djaGFyX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworCitzdHJ1Y3QgcHJpbnRmX2luZm8KK3sKKyAgaW50IHByZWM7CQkJLyogUHJlY2lzaW9uLiAgKi8KKyAgaW50IHdpZHRoOwkJCS8qIFdpZHRoLiAgKi8KKyAgd2NoYXJfdCBzcGVjOwkJCS8qIEZvcm1hdCBsZXR0ZXIuICAqLworICB1bnNpZ25lZCBpbnQgaXNfbG9uZ19kb3VibGU6MTsvKiBMIGZsYWcuICAqLworICB1bnNpZ25lZCBpbnQgaXNfc2hvcnQ6MTsJLyogaCBmbGFnLiAgKi8KKyAgdW5zaWduZWQgaW50IGlzX2xvbmc6MTsJLyogbCBmbGFnLiAgKi8KKyAgdW5zaWduZWQgaW50IGFsdDoxOwkJLyogIyBmbGFnLiAgKi8KKyAgdW5zaWduZWQgaW50IHNwYWNlOjE7CQkvKiBTcGFjZSBmbGFnLiAgKi8KKyAgdW5zaWduZWQgaW50IGxlZnQ6MTsJCS8qIC0gZmxhZy4gICovCisgIHVuc2lnbmVkIGludCBzaG93c2lnbjoxOwkvKiArIGZsYWcuICAqLworICB1bnNpZ25lZCBpbnQgZ3JvdXA6MTsJCS8qICcgZmxhZy4gICovCisgIHVuc2lnbmVkIGludCBleHRyYToxOwkJLyogRm9yIHNwZWNpYWwgdXNlLiAgKi8KKyAgdW5zaWduZWQgaW50IGlzX2NoYXI6MTsJLyogaGggZmxhZy4gICovCisgIHVuc2lnbmVkIGludCB3aWRlOjE7CQkvKiBOb256ZXJvIGZvciB3aWRlIGNoYXJhY3RlciBzdHJlYW1zLiAgKi8KKyAgdW5zaWduZWQgaW50IGkxOG46MTsJCS8qIEkgZmxhZy4gICovCisgIHVuc2lnbmVkIGludCBfX3BhZDo0OwkJLyogVW51c2VkIHNvIGZhci4gICovCisgIHVuc2lnbmVkIHNob3J0IGludCB1c2VyOwkvKiBCaXRzIGZvciB1c2VyLWluc3RhbGxlZCBtb2RpZmllcnMuICAqLworICB3Y2hhcl90IHBhZDsJCQkvKiBQYWRkaW5nIGNoYXJhY3Rlci4gICovCit9OworCisKKy8qIFR5cGUgb2YgYSBwcmludGYgc3BlY2lmaWVyLWhhbmRsZXIgZnVuY3Rpb24uCisgICBTVFJFQU0gaXMgdGhlIEZJTEUgb24gd2hpY2ggdG8gd3JpdGUgb3V0cHV0LgorICAgSU5GTyBnaXZlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZm9ybWF0IHNwZWNpZmljYXRpb24uCisgICBBUkdTIGlzIGEgdmVjdG9yIG9mIHBvaW50ZXJzIHRvIHRoZSBhcmd1bWVudCBkYXRhOworICAgdGhlIG51bWJlciBvZiBwb2ludGVycyB3aWxsIGJlIHRoZSBudW1iZXIgcmV0dXJuZWQKKyAgIGJ5IHRoZSBhc3NvY2lhdGVkIGFyZ2luZm8gZnVuY3Rpb24gZm9yIHRoZSBzYW1lIElORk8uCisKKyAgIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuLAorICAgb3IgLTEgZm9yIGVycm9ycy4gICovCisKK3R5cGVkZWYgaW50IHByaW50Zl9mdW5jdGlvbiAoRklMRSAqX19zdHJlYW0sCisJCQkgICAgIF9fY29uc3Qgc3RydWN0IHByaW50Zl9pbmZvICpfX2luZm8sCisJCQkgICAgIF9fY29uc3Qgdm9pZCAqX19jb25zdCAqX19hcmdzKTsKKworLyogVHlwZSBvZiBhIHByaW50ZiBzcGVjaWZpZXItYXJnaW5mbyBmdW5jdGlvbi4KKyAgIElORk8gZ2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZvcm1hdCBzcGVjaWZpY2F0aW9uLgorICAgTiwgQVJHVFlQRVMsICpTSVpFIGhhcyB0byBjb250YWluIHRoZSBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgZm9yCisgICB1c2VyLWRlZmluZWQgdHlwZXMsIGFuZCByZXR1cm4gdmFsdWUgYXJlIGFzIGZvciBwYXJzZV9wcmludGZfZm9ybWF0CisgICBleGNlcHQgdGhhdCAtMSBzaG91bGQgYmUgcmV0dXJuZWQgaWYgdGhlIGhhbmRsZXIgY2Fubm90IGhhbmRsZQorICAgdGhpcyBjYXNlLiAgVGhpcyBhbGxvd3MgdG8gcGFydGlhbGx5IG92ZXJ3cml0ZSB0aGUgZnVuY3Rpb25hbGl0eQorICAgb2YgZXhpc3RpbmcgZm9ybWF0IHNwZWNpZmllcnMuICAqLworCit0eXBlZGVmIGludCBwcmludGZfYXJnaW5mb19zaXplX2Z1bmN0aW9uIChfX2NvbnN0IHN0cnVjdCBwcmludGZfaW5mbyAqX19pbmZvLAorCQkJCQkgIHNpemVfdCBfX24sIGludCAqX19hcmd0eXBlcywKKwkJCQkJICBpbnQgKl9fc2l6ZSk7CisKKy8qIE9sZCB2ZXJzaW9uIG9mICdwcmludGZfYXJnaW5mb19mdW5jdGlvbicgd2l0aG91dCBhIFNJWkUgcGFyYW1ldGVyLiAgKi8KKwordHlwZWRlZiBpbnQgcHJpbnRmX2FyZ2luZm9fZnVuY3Rpb24gKF9fY29uc3Qgc3RydWN0IHByaW50Zl9pbmZvICpfX2luZm8sCisJCQkJICAgICBzaXplX3QgX19uLCBpbnQgKl9fYXJndHlwZXMpOworCisvKiBUeXBlIG9mIGEgZnVuY3Rpb24gdG8gZ2V0IGEgdmFsdWUgb2YgYSB1c2VyLWRlZmluZWQgZnJvbSB0aGUKKyAgIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QuICAqLwordHlwZWRlZiB2b2lkIHByaW50Zl92YV9hcmdfZnVuY3Rpb24gKHZvaWQgKl9fbWVtLCB2YV9saXN0ICpfX2FwKTsKKworCisvKiBSZWdpc3RlciBGVU5DIHRvIGJlIGNhbGxlZCB0byBmb3JtYXQgU1BFQyBzcGVjaWZpZXJzOyBBUkdJTkZPIG11c3QgYmUKKyAgIHNwZWNpZmllZCB0byBkZXRlcm1pbmUgaG93IG1hbnkgYXJndW1lbnRzIGEgU1BFQyBjb252ZXJzaW9uIHJlcXVpcmVzIGFuZAorICAgd2hhdCB0aGVpciB0eXBlcyBhcmUuICAqLworCitleHRlcm4gaW50IHJlZ2lzdGVyX3ByaW50Zl9zcGVjaWZpZXIgKGludCBfX3NwZWMsIHByaW50Zl9mdW5jdGlvbiBfX2Z1bmMsCisJCQkJICAgICAgcHJpbnRmX2FyZ2luZm9fc2l6ZV9mdW5jdGlvbiBfX2FyZ2luZm8pCisgIF9fVEhST1c7CisKKworLyogT2Jzb2xldGUgaW50ZXJmYWNlIHNpbWlsYXIgdG8gcmVnaXN0ZXJfcHJpbnRmX3NwZWNpZmllci4gIEl0IGNhbiBvbmx5CisgICBoYW5kbGUgYmFzaWMgZGF0YSB0eXBlcyBiZWNhdXNlIHRoZSBBUkdJTkZPIGNhbGxiYWNrIGRvZXMgbm90IHJldHVybgorICAgaW5mb3JtYXRpb24gb24gdGhlIHNpemUgb2YgdGhlIHVzZXItZGVmaW5lZCB0eXBlLiAgKi8KKworZXh0ZXJuIGludCByZWdpc3Rlcl9wcmludGZfZnVuY3Rpb24gKGludCBfX3NwZWMsIHByaW50Zl9mdW5jdGlvbiBfX2Z1bmMsCisJCQkJICAgICBwcmludGZfYXJnaW5mb19mdW5jdGlvbiBfX2FyZ2luZm8pCisgIF9fVEhST1cgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fOworCisKKy8qIFJlZ2lzdGVyIGEgbmV3IG1vZGlmaWVyIGNoYXJhY3RlciBzZXF1ZW5jZS4gIElmIHRoZSBjYWxsIHN1Y2NlZWRzCisgICBpdCByZXR1cm5zIGEgcG9zaXRpdmUgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBiaXQgc2V0IGluIHRoZSBVU0VSCisgICBmaWVsZCBpbiAnc3RydWN0IHByaW50Zl9pbmZvJy4gICovCisKK2V4dGVybiBpbnQgcmVnaXN0ZXJfcHJpbnRmX21vZGlmaWVyIChfX2NvbnN0IHdjaGFyX3QgKl9fc3RyKSBfX3d1ciBfX1RIUk9XOworCisKKy8qIFJlZ2lzdGVyIHZhcmlhYmxlIGFyZ3VtZW50IGhhbmRsZXIgZm9yIHVzZXIgdHlwZS4gIFRoZSByZXR1cm4gdmFsdWUKKyAgIGlzIHRvIGJlIHVzZWQgaW4gQVJHSU5GTyBmdW5jdGlvbnMgdG8gc2lnbmFsIHRoZSB1c2Ugb2YgdGhlCisgICB0eXBlLiAgKi8KK2V4dGVybiBpbnQgcmVnaXN0ZXJfcHJpbnRmX3R5cGUgKHByaW50Zl92YV9hcmdfZnVuY3Rpb24gX19mY3QpIF9fd3VyIF9fVEhST1c7CisKKworLyogUGFyc2UgRk1ULCBhbmQgZmlsbCBpbiBOIGVsZW1lbnRzIG9mIEFSR1RZUEVTIHdpdGggdGhlCisgICB0eXBlcyBuZWVkZWQgZm9yIHRoZSBjb252ZXJzaW9ucyBGTVQgc3BlY2lmaWVzLiAgUmV0dXJucworICAgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgcmVxdWlyZWQgYnkgRk1ULgorCisgICBUaGUgQVJHSU5GTyBmdW5jdGlvbiByZWdpc3RlcmVkIHdpdGggYSB1c2VyLWRlZmluZWQgZm9ybWF0IGlzIHBhc3NlZCBhCisgICBgc3RydWN0IHByaW50Zl9pbmZvJyBkZXNjcmliaW5nIHRoZSBmb3JtYXQgc3BlYyBiZWluZyBwYXJzZWQuICBBIHdpZHRoCisgICBvciBwcmVjaXNpb24gb2YgSU5UX01JTiBtZWFucyBhIGAqJyB3YXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZQorICAgd2lkdGgvcHJlY2lzaW9uIHdpbGwgY29tZSBmcm9tIGFuIGFyZy4gIFRoZSBmdW5jdGlvbiBzaG91bGQgZmlsbCBpbiB0aGUKKyAgIGFycmF5IGl0IGlzIHBhc3NlZCB3aXRoIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIGl0IHdhbnRzLCBhbmQgcmV0dXJuCisgICB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpdCB3YW50cy4gICovCisKK2V4dGVybiBzaXplX3QgcGFyc2VfcHJpbnRmX2Zvcm1hdCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCBzaXplX3QgX19uLAorCQkJCSAgIGludCAqX19yZXN0cmljdCBfX2FyZ3R5cGVzKSBfX1RIUk9XOworCisKKy8qIENvZGVzIHJldHVybmVkIGJ5IGBwYXJzZV9wcmludGZfZm9ybWF0JyBmb3IgYmFzaWMgdHlwZXMuCisKKyAgIFRoZXNlIHZhbHVlcyBjb3ZlciBhbGwgdGhlIHN0YW5kYXJkIGZvcm1hdCBzcGVjaWZpY2F0aW9ucy4KKyAgIFVzZXJzIGNhbiByZXNlcnZlIG5ldyB2YWx1ZXMgYWZ0ZXIgUEFfTEFTVCBmb3IgdGhlaXIgb3duIHR5cGVzCisgICB1c2luZyAncmVnaXN0ZXJfcHJpbnRmX3R5cGUnLiAgKi8KKworZW51bQorewkJCQkvKiBDIHR5cGU6ICovCisgIFBBX0lOVCwJCQkvKiBpbnQgKi8KKyAgUEFfQ0hBUiwJCQkvKiBpbnQsIGNhc3QgdG8gY2hhciAqLworICBQQV9XQ0hBUiwJCQkvKiB3aWRlIGNoYXIgKi8KKyAgUEFfU1RSSU5HLAkJCS8qIGNvbnN0IGNoYXIgKiwgYSAnXDAnLXRlcm1pbmF0ZWQgc3RyaW5nICovCisgIFBBX1dTVFJJTkcsCQkJLyogY29uc3Qgd2NoYXJfdCAqLCB3aWRlIGNoYXJhY3RlciBzdHJpbmcgKi8KKyAgUEFfUE9JTlRFUiwJCQkvKiB2b2lkICogKi8KKyAgUEFfRkxPQVQsCQkJLyogZmxvYXQgKi8KKyAgUEFfRE9VQkxFLAkJCS8qIGRvdWJsZSAqLworICBQQV9MQVNUCit9OworCisvKiBGbGFnIGJpdHMgdGhhdCBjYW4gYmUgc2V0IGluIGEgdHlwZSByZXR1cm5lZCBieSBgcGFyc2VfcHJpbnRmX2Zvcm1hdCcuICAqLworI2RlZmluZQlQQV9GTEFHX01BU0sJCTB4ZmYwMAorI2RlZmluZQlQQV9GTEFHX0xPTkdfTE9ORwkoMSA8PCA4KQorI2RlZmluZQlQQV9GTEFHX0xPTkdfRE9VQkxFCVBBX0ZMQUdfTE9OR19MT05HCisjZGVmaW5lCVBBX0ZMQUdfTE9ORwkJKDEgPDwgOSkKKyNkZWZpbmUJUEFfRkxBR19TSE9SVAkJKDEgPDwgMTApCisjZGVmaW5lCVBBX0ZMQUdfUFRSCQkoMSA8PCAxMSkKKworCisKKy8qIEZ1bmN0aW9uIHdoaWNoIGNhbiBiZSByZWdpc3RlcmVkIGFzIGBwcmludGYnLWhhbmRsZXJzLiAgKi8KKworLyogUHJpbnQgZmxvYXRpbmcgcG9pbnQgdmFsdWUgdXNpbmcgdXNpbmcgYWJicmV2aWF0aW9ucyBmb3IgdGhlIG9yZGVycworICAgb2YgbWFnbml0dWRlIHVzZWQgZm9yIG51bWJlcnMgKCdrJyBmb3Iga2lsbywgJ20nIGZvciBtZWdhIGV0YykuICBJZgorICAgdGhlIGZvcm1hdCBzcGVjaWZpZXIgaXMgYSB1cHBlcmNhc2UgY2hhcmFjdGVyIHBvd2VycyBvZiAxMDAwIGFyZQorICAgdXNlZC4gIE90aGVyd2lzZSBwb3dlcnMgb2YgMTAyNC4gICovCitleHRlcm4gaW50IHByaW50Zl9zaXplIChGSUxFICpfX3Jlc3RyaWN0IF9fZnAsCisJCQlfX2NvbnN0IHN0cnVjdCBwcmludGZfaW5mbyAqX19pbmZvLAorCQkJX19jb25zdCB2b2lkICpfX2NvbnN0ICpfX3Jlc3RyaWN0IF9fYXJncykgX19USFJPVzsKKworLyogVGhpcyBpcyB0aGUgYXBwcm9wcmlhdGUgYXJndW1lbnQgaW5mb3JtYXRpb24gZnVuY3Rpb24gZm9yIGBwcmludGZfc2l6ZScuICAqLworZXh0ZXJuIGludCBwcmludGZfc2l6ZV9pbmZvIChfX2NvbnN0IHN0cnVjdCBwcmludGZfaW5mbyAqX19yZXN0cmljdAorCQkJICAgICBfX2luZm8sIHNpemVfdCBfX24sIGludCAqX19yZXN0cmljdCBfX2FyZ3R5cGVzKQorICAgICBfX1RIUk9XOworCisjaWZkZWYgX19MREJMX0NPTVBBVAorIyBpbmNsdWRlIDxiaXRzL3ByaW50Zi1sZGJsLmg+CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHByaW50Zi5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wcm90b2NvbHMvcm91dGVkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3Byb3RvY29scy9yb3V0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWZkODY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wcm90b2NvbHMvcm91dGVkLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTg5LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXJvdXRlZC5oCTguMSAoQmVya2VsZXkpIDYvMi85MworICovCisKKyNpZm5kZWYgX1BST1RPQ09MU19ST1VURURfSAorI2RlZmluZQlfUFJPVE9DT0xTX1JPVVRFRF9IIDEKKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKy8qCisgKiBSb3V0aW5nIEluZm9ybWF0aW9uIFByb3RvY29sCisgKgorICogRGVyaXZlZCBmcm9tIFhlcm94IE5TIFJvdXRpbmcgSW5mb3JtYXRpb24gUHJvdG9jb2wKKyAqIGJ5IGNoYW5naW5nIDMyLWJpdCBuZXQgbnVtYmVycyB0byBzb2NrYWRkcidzIGFuZAorICogcGFkZGluZyBzdHVmZiB0byAzMi1iaXQgYm91bmRhcmllcy4KKyAqLworI2RlZmluZQlSSVBWRVJTSU9OCTEKKworc3RydWN0IG5ldGluZm8geworCXN0cnVjdAlzb2NrYWRkciByaXBfZHN0OwkvKiBkZXN0aW5hdGlvbiBuZXQvaG9zdCAqLworCWludAlyaXBfbWV0cmljOwkJLyogY29zdCBvZiByb3V0ZSAqLworfTsKKworc3RydWN0IHJpcCB7CisJdV9jaGFyCXJpcF9jbWQ7CQkvKiByZXF1ZXN0L3Jlc3BvbnNlICovCisJdV9jaGFyCXJpcF92ZXJzOwkJLyogcHJvdG9jb2wgdmVyc2lvbiAjICovCisJdV9jaGFyCXJpcF9yZXMxWzJdOwkJLyogcGFkIHRvIDMyLWJpdCBib3VuZGFyeSAqLworCXVuaW9uIHsKKwkJc3RydWN0CW5ldGluZm8gcnVfbmV0c1sxXTsJLyogdmFyaWFibGUgbGVuZ3RoLi4uICovCisJCWNoYXIJcnVfdHJhY2VmaWxlWzFdOwkvKiBkaXR0byAuLi4gKi8KKwl9IHJpcHVuOworI2RlZmluZQlyaXBfbmV0cwlyaXB1bi5ydV9uZXRzCisjZGVmaW5lCXJpcF90cmFjZWZpbGUJcmlwdW4ucnVfdHJhY2VmaWxlCit9OworCisvKgorICogUGFja2V0IHR5cGVzLgorICovCisjZGVmaW5lCVJJUENNRF9SRVFVRVNUCQkxCS8qIHdhbnQgaW5mbyAqLworI2RlZmluZQlSSVBDTURfUkVTUE9OU0UJCTIJLyogcmVzcG9uZGluZyB0byByZXF1ZXN0ICovCisjZGVmaW5lCVJJUENNRF9UUkFDRU9OCQkzCS8qIHR1cm4gdHJhY2luZyBvbiAqLworI2RlZmluZQlSSVBDTURfVFJBQ0VPRkYJCTQJLyogdHVybiBpdCBvZmYgKi8KKworI2RlZmluZQlSSVBDTURfTUFYCQk1CisjaWZkZWYgUklQQ01EUworY2hhciAqcmlwY21kc1tSSVBDTURfTUFYXSA9CisgIHsgIiMwIiwgIlJFUVVFU1QiLCAiUkVTUE9OU0UiLCAiVFJBQ0VPTiIsICJUUkFDRU9GRiIgfTsKKyNlbmRpZgorCisjZGVmaW5lCUhPUENOVF9JTkZJTklUWQkJMTYJLyogcGVyIFhlcm94IE5TICovCisjZGVmaW5lCU1BWFBBQ0tFVFNJWkUJCTUxMgkvKiBtYXggYnJvYWRjYXN0IHNpemUgKi8KKworLyoKKyAqIFRpbWVyIHZhbHVlcyB1c2VkIGluIG1hbmFnaW5nIHRoZSByb3V0aW5nIHRhYmxlLgorICogQ29tcGxldGUgdGFibGVzIGFyZSBicm9hZGNhc3QgZXZlcnkgU1VQUExZX0lOVEVSVkFMIHNlY29uZHMuCisgKiBJZiBjaGFuZ2VzIG9jY3VyIGJldHdlZW4gdXBkYXRlcywgZHluYW1pYyB1cGRhdGVzIGNvbnRhaW5pbmcgb25seSBjaGFuZ2VzCisgKiBtYXkgYmUgc2VudC4gIFdoZW4gdGhlc2UgYXJlIHNlbnQsIGEgdGltZXIgaXMgc2V0IGZvciBhIHJhbmRvbSB2YWx1ZQorICogYmV0d2VlbiBNSU5fV0FJVFRJTUUgYW5kIE1BWF9XQUlUVElNRSwgYW5kIG5vIGFkZGl0aW9uYWwgZHluYW1pYyB1cGRhdGVzCisgKiBhcmUgc2VudCB1bnRpbCB0aGUgdGltZXIgZXhwaXJlcy4KKyAqCisgKiBFdmVyeSB1cGRhdGUgb2YgYSByb3V0aW5nIGVudHJ5IGZvcmNlcyBhbiBlbnRyeSdzIHRpbWVyIHRvIGJlIHJlc2V0LgorICogQWZ0ZXIgRVhQSVJFX1RJTUUgd2l0aG91dCB1cGRhdGVzLCB0aGUgZW50cnkgaXMgbWFya2VkIGludmFsaWQsCisgKiBidXQgaGVsZCBvbnRvIHVudGlsIEdBUkJBR0VfVElNRSBzbyB0aGF0IG90aGVycyBtYXkKKyAqIHNlZSBpdCAiYmUgZGVsZXRlZCIuCisgKi8KKyNkZWZpbmUJVElNRVJfUkFURQkJMzAJLyogYWxhcm0gY2xvY2tzIGV2ZXJ5IDMwIHNlY29uZHMgKi8KKworI2RlZmluZQlTVVBQTFlfSU5URVJWQUwJCTMwCS8qIHRpbWUgdG8gc3VwcGx5IHRhYmxlcyAqLworI2RlZmluZQlNSU5fV0FJVFRJTUUJCTIJLyogbWluLiBpbnRlcnZhbCB0byBicm9hZGNhc3QgY2hhbmdlcyAqLworI2RlZmluZQlNQVhfV0FJVFRJTUUJCTUJLyogbWF4LiB0aW1lIHRvIGRlbGF5IGNoYW5nZXMgKi8KKworI2RlZmluZQlFWFBJUkVfVElNRQkJMTgwCS8qIHRpbWUgdG8gbWFyayBlbnRyeSBpbnZhbGlkICovCisjZGVmaW5lCUdBUkJBR0VfVElNRQkJMjQwCS8qIHRpbWUgdG8gZ2FyYmFnZSBjb2xsZWN0ICovCisKKyNlbmRpZiAvKiBwcm90b2NvbHMvcm91dGVkLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHJvdG9jb2xzL3J3aG9kLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3Byb3RvY29scy9yd2hvZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NmQ2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3Byb3RvY29scy9yd2hvZC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpcndob2QuaAk4LjEgKEJlcmtlbGV5KSA2LzIvOTMKKyAqLworCisjaWZuZGVmIF9QUk9UT0NPTFNfUldIT0RfSAorI2RlZmluZQlfUFJPVE9DT0xTX1JXSE9EX0ggMQorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qCisgKiByd2hvIHByb3RvY29sIHBhY2tldCBmb3JtYXQuCisgKi8KK3N0cnVjdAlvdXRtcCB7CisJY2hhcglvdXRfbGluZVs4XTsJCS8qIHR0eSBuYW1lICovCisJY2hhcglvdXRfbmFtZVs4XTsJCS8qIHVzZXIgaWQgKi8KKwlpbnQzMl90CW91dF90aW1lOwkJLyogdGltZSBvbiAqLworfTsKKworc3RydWN0CXdob2QgeworCWNoYXIJd2RfdmVyczsJCS8qIHByb3RvY29sIHZlcnNpb24gIyAqLworCWNoYXIJd2RfdHlwZTsJCS8qIHBhY2tldCB0eXBlLCBzZWUgYmVsb3cgKi8KKwljaGFyCXdkX3BhZFsyXTsKKwlpbnQJd2Rfc2VuZHRpbWU7CQkvKiB0aW1lIHN0YW1wIGJ5IHNlbmRlciAqLworCWludAl3ZF9yZWN2dGltZTsJCS8qIHRpbWUgc3RhbXAgYXBwbGllZCBieSByZWNlaXZlciAqLworCWNoYXIJd2RfaG9zdG5hbWVbMzJdOwkvKiBob3N0cydzIG5hbWUgKi8KKwlpbnQJd2RfbG9hZGF2WzNdOwkJLyogbG9hZCBhdmVyYWdlIGFzIGluIHVwdGltZSAqLworCWludAl3ZF9ib290dGltZTsJCS8qIHRpbWUgc3lzdGVtIGJvb3RlZCAqLworCXN0cnVjdAl3aG9lbnQgeworCQlzdHJ1Y3QJb3V0bXAgd2VfdXRtcDsJLyogYWN0aXZlIHR0eSBpbmZvICovCisJCWludAl3ZV9pZGxlOwkvKiB0dHkgaWRsZSB0aW1lICovCisJfSB3ZF93ZVsxMDI0IC8gc2l6ZW9mIChzdHJ1Y3Qgd2hvZW50KV07Cit9OworCisjZGVmaW5lCVdIT0RWRVJTSU9OCTEKKyNkZWZpbmUJV0hPRFRZUEVfU1RBVFVTCTEJCS8qIGhvc3Qgc3RhdHVzICovCisKKy8qIFdlIHVzZWQgdG8gZGVmaW5lIF9QQVRIX1JXSE9ESVIgaGVyZSBidXQgaXQncyBub3cgaW4gPHBhdGhzLmg+LiAgKi8KKyNpbmNsdWRlIDxwYXRocy5oPgorCisjZW5kaWYgLyogcHJvdG9jb2xzL3J3aG9kLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHJvdG9jb2xzL3RhbGtkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3Byb3RvY29scy90YWxrZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZjMzYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3Byb3RvY29scy90YWxrZC5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXRhbGtkLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKi8KKworI2lmbmRlZiBfUFJPVE9DT0xTX1RBTEtEX0gKKyNkZWZpbmUJX1BST1RPQ09MU19UQUxLRF9IIDEKKworLyoKKyAqIFRoaXMgZGVzY3JpYmVzIHRoZSBwcm90b2NvbCB1c2VkIGJ5IHRoZSB0YWxrIHNlcnZlciBhbmQgY2xpZW50cy4KKyAqCisgKiBUaGUgdGFsayBzZXJ2ZXIgYWN0cyBhIHJlcG9zaXRvcnkgb2YgaW52aXRhdGlvbnMsIHJlc3BvbmRpbmcgdG8KKyAqIHJlcXVlc3RzIGJ5IGNsaWVudHMgd2lzaGluZyB0byByZW5kZXp2b3VzIGZvciB0aGUgcHVycG9zZSBvZgorICogaG9sZGluZyBhIGNvbnZlcnNhdGlvbi4gIEluIG5vcm1hbCBvcGVyYXRpb24sIGEgY2xpZW50LCB0aGUgY2FsbGVyLAorICogaW5pdGlhdGVzIGEgcmVuZGV6dm91cyBieSBzZW5kaW5nIGEgQ1RMX01TRyB0byB0aGUgc2VydmVyIG9mCisgKiB0eXBlIExPT0tfVVAuICBUaGlzIGNhdXNlcyB0aGUgc2VydmVyIHRvIHNlYXJjaCBpdHMgaW52aXRhdGlvbgorICogdGFibGVzIHRvIGNoZWNrIGlmIGFuIGludml0YXRpb24gY3VycmVudGx5IGV4aXN0cyBmb3IgdGhlIGNhbGxlcgorICogKHRvIHNwZWFrIHRvIHRoZSBjYWxsZWUgc3BlY2lmaWVkIGluIHRoZSBtZXNzYWdlKS4gIElmIHRoZSBsb29rdXAKKyAqIGZhaWxzLCB0aGUgY2FsbGVyIHRoZW4gc2VuZHMgYW4gQU5OT1VOQ0UgbWVzc2FnZSBjYXVzaW5nIHRoZSBzZXJ2ZXIKKyAqIHRvIGJyb2FkY2FzdCBhbiBhbm5vdW5jZW1lbnQgb24gdGhlIGNhbGxlZSdzIGxvZ2luIHBvcnRzIHJlcXVlc3RpbmcKKyAqIGNvbnRhY3QuICBXaGVuIHRoZSBjYWxsZWUgcmVzcG9uZHMsIHRoZSBsb2NhbCBzZXJ2ZXIgdXNlcyB0aGUKKyAqIHJlY29yZGVkIGludml0YXRpb24gdG8gcmVzcG9uZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSByZW5kZXp2b3VzCisgKiBhZGRyZXNzIGFuZCB0aGUgY2FsbGVyIGFuZCBjYWxsZWUgY2xpZW50IHByb2dyYW1zIGVzdGFibGlzaCBhCisgKiBzdHJlYW0gY29ubmVjdGlvbiB0aHJvdWdoIHdoaWNoIHRoZSBjb252ZXJzYXRpb24gdGFrZXMgcGxhY2UuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworLyoKKyAqIENsaWVudC0+c2VydmVyIHJlcXVlc3QgbWVzc2FnZSBmb3JtYXQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1X2NoYXIJdmVyczsJCS8qIHByb3RvY29sIHZlcnNpb24gKi8KKwl1X2NoYXIJdHlwZTsJCS8qIHJlcXVlc3QgdHlwZSwgc2VlIGJlbG93ICovCisJdV9jaGFyCWFuc3dlcjsJCS8qIG5vdCB1c2VkICovCisJdV9jaGFyCXBhZDsKKwl1X2ludDMyX3QgaWRfbnVtOwkvKiBtZXNzYWdlIGlkICovCisJc3RydWN0CW9zb2NrYWRkciBhZGRyOwkJLyogb2xkICg0LjMpIHN0eWxlICovCisJc3RydWN0CW9zb2NrYWRkciBjdGxfYWRkcjsJLyogb2xkICg0LjMpIHN0eWxlICovCisJaW50MzJfdAlwaWQ7CQkvKiBjYWxsZXIncyBwcm9jZXNzIGlkICovCisjZGVmaW5lCU5BTUVfU0laRQkxMgorCWNoYXIJbF9uYW1lW05BTUVfU0laRV07LyogY2FsbGVyJ3MgbmFtZSAqLworCWNoYXIJcl9uYW1lW05BTUVfU0laRV07LyogY2FsbGVlJ3MgbmFtZSAqLworI2RlZmluZQlUVFlfU0laRQkxNgorCWNoYXIJcl90dHlbVFRZX1NJWkVdOy8qIGNhbGxlZSdzIHR0eSBuYW1lICovCit9IENUTF9NU0c7CisKKy8qCisgKiBTZXJ2ZXItPmNsaWVudCByZXNwb25zZSBtZXNzYWdlIGZvcm1hdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVfY2hhcgl2ZXJzOwkJLyogcHJvdG9jb2wgdmVyc2lvbiAqLworCXVfY2hhcgl0eXBlOwkJLyogdHlwZSBvZiByZXF1ZXN0IG1lc3NhZ2UsIHNlZSBiZWxvdyAqLworCXVfY2hhcglhbnN3ZXI7CQkvKiByZXNwb25zZSB0byByZXF1ZXN0IG1lc3NhZ2UsIHNlZSBiZWxvdyAqLworCXVfY2hhcglwYWQ7CisJdV9pbnQzMl90IGlkX251bTsJLyogbWVzc2FnZSBpZCAqLworCXN0cnVjdAlvc29ja2FkZHIgYWRkcjsJLyogYWRkcmVzcyBmb3IgZXN0YWJsaXNoaW5nIGNvbnZlcnNhdGlvbiAqLworfSBDVExfUkVTUE9OU0U7CisKKyNkZWZpbmUJVEFMS19WRVJTSU9OCTEJCS8qIHByb3RvY29sIHZlcnNpb24gKi8KKworLyogbWVzc2FnZSB0eXBlIHZhbHVlcyAqLworI2RlZmluZSBMRUFWRV9JTlZJVEUJMAkvKiBsZWF2ZSBpbnZpdGF0aW9uIHdpdGggc2VydmVyICovCisjZGVmaW5lIExPT0tfVVAJCTEJLyogY2hlY2sgZm9yIGludml0YXRpb24gYnkgY2FsbGVlICovCisjZGVmaW5lIERFTEVURQkJMgkvKiBkZWxldGUgaW52aXRhdGlvbiBieSBjYWxsZXIgKi8KKyNkZWZpbmUgQU5OT1VOQ0UJMwkvKiBhbm5vdW5jZSBpbnZpdGF0aW9uIGJ5IGNhbGxlciAqLworCisvKiBhbnN3ZXIgdmFsdWVzICovCisjZGVmaW5lIFNVQ0NFU1MJCTAJLyogb3BlcmF0aW9uIGNvbXBsZXRlZCBwcm9wZXJseSAqLworI2RlZmluZSBOT1RfSEVSRQkxCS8qIGNhbGxlZSBub3QgbG9nZ2VkIGluICovCisjZGVmaW5lIEZBSUxFRAkJMgkvKiBvcGVyYXRpb24gZmFpbGVkIGZvciB1bmV4cGxhaW5lZCByZWFzb24gKi8KKyNkZWZpbmUgTUFDSElORV9VTktOT1dOCTMJLyogY2FsbGVyJ3MgbWFjaGluZSBuYW1lIHVua25vd24gKi8KKyNkZWZpbmUgUEVSTUlTU0lPTl9ERU5JRUQgNAkvKiBjYWxsZWUncyB0dHkgZG9lc24ndCBwZXJtaXQgYW5ub3VuY2UgKi8KKyNkZWZpbmUgVU5LTk9XTl9SRVFVRVNUCTUJLyogcmVxdWVzdCBoYXMgaW52YWxpZCB0eXBlIHZhbHVlICovCisjZGVmaW5lCUJBRFZFUlNJT04JNgkvKiByZXF1ZXN0IGhhcyBpbnZhbGlkIHByb3RvY29sIHZlcnNpb24gKi8KKyNkZWZpbmUJQkFEQUREUgkJNwkvKiByZXF1ZXN0IGhhcyBpbnZhbGlkIGFkZHIgdmFsdWUgKi8KKyNkZWZpbmUJQkFEQ1RMQUREUgk4CS8qIHJlcXVlc3QgaGFzIGludmFsaWQgY3RsX2FkZHIgdmFsdWUgKi8KKworLyoKKyAqIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMuCisgKi8KKyNkZWZpbmUgTUFYX0xJRkUJNjAJLyogbWF4IHRpbWUgZGFlbW9uIHNhdmVzIGludml0YXRpb25zICovCisvKiBSSU5HX1dBSVQgc2hvdWxkIGJlIDEwJ3Mgb2Ygc2Vjb25kcyBsZXNzIHRoYW4gTUFYX0xJRkUgKi8KKyNkZWZpbmUgUklOR19XQUlUCTMwCS8qIHRpbWUgdG8gd2FpdCBiZWZvcmUgcmVzZW5kaW5nIGludml0YXRpb24gKi8KKworI2VuZGlmIC8qIHByb3RvY29scy90YWxrZC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3Byb3RvY29scy90aW1lZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wcm90b2NvbHMvdGltZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWQ0NzAyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wcm90b2NvbHMvdGltZWQuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXRpbWVkLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKi8KKworI2lmbmRlZglfUFJPVE9DT0xTX1RJTUVEX0gKKyNkZWZpbmUJX1BST1RPQ09MU19USU1FRF9IIDEKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKy8qCisgKiBUaW1lIFN5bmNocm9uaXphdGlvbiBQcm90b2NvbAorICovCisKKyNkZWZpbmUJVFNQVkVSU0lPTgkxCisjZGVmaW5lIEFOWUFERFIgCU5VTEwKKyNkZWZpbmUgTUFYSE9TVE5BTUVMRU4JNjQKKworc3RydWN0IHRzcCB7CisJdV9jaGFyCXRzcF90eXBlOworCXVfY2hhcgl0c3BfdmVyczsKKwl1X3Nob3J0CXRzcF9zZXE7CisJdW5pb24geworCQlzdHJ1Y3QgdGltZXZhbCB0c3B1X3RpbWU7CisJCWNoYXIgdHNwdV9ob3BjbnQ7CisJfSB0c3BfdTsKKwljaGFyIHRzcF9uYW1lW01BWEhPU1ROQU1FTEVOXTsKK307CisKKyNkZWZpbmUJdHNwX3RpbWUJdHNwX3UudHNwdV90aW1lCisjZGVmaW5lCXRzcF9ob3BjbnQJdHNwX3UudHNwdV9ob3BjbnQKKworLyoKKyAqIENvbW1hbmQgdHlwZXMuCisgKi8KKyNkZWZpbmUJVFNQX0FOWQkJCTAJLyogbWF0Y2ggYW55IHR5cGVzICovCisjZGVmaW5lCVRTUF9BREpUSU1FCQkxCS8qIHNlbmQgYWRqdGltZSAqLworI2RlZmluZQlUU1BfQUNLCQkJMgkvKiBnZW5lcmljIGFja25vd2xlZGdlbWVudCAqLworI2RlZmluZQlUU1BfTUFTVEVSUkVRCQkzCS8qIGFzayBmb3IgbWFzdGVyJ3MgbmFtZSAqLworI2RlZmluZQlUU1BfTUFTVEVSQUNLCQk0CS8qIGFja25vd2xlZGdlIG1hc3RlciByZXF1ZXN0ICovCisjZGVmaW5lCVRTUF9TRVRUSU1FCQk1CS8qIHNlbmQgbmV0d29yayB0aW1lICovCisjZGVmaW5lCVRTUF9NQVNURVJVUAkJNgkvKiBpbmZvcm0gc2xhdmVzIHRoYXQgbWFzdGVyIGlzIHVwICovCisjZGVmaW5lCVRTUF9TTEFWRVVQCQk3CS8qIHNsYXZlIGlzIHVwIGJ1dCBub3QgcG9sbGVkICovCisjZGVmaW5lCVRTUF9FTEVDVElPTgkJOAkvKiBhZHZhbmNlIGNhbmRpZGF0dXJlIGZvciBtYXN0ZXIgKi8KKyNkZWZpbmUJVFNQX0FDQ0VQVAkJOQkvKiBzdXBwb3J0IGNhbmRpZGF0dXJlIG9mIG1hc3RlciAqLworI2RlZmluZQlUU1BfUkVGVVNFCQkxMAkvKiByZWplY3QgY2FuZGlkYXR1cmUgb2YgbWFzdGVyICovCisjZGVmaW5lCVRTUF9DT05GTElDVAkJMTEJLyogdHdvIG9yIG1vcmUgbWFzdGVycyBwcmVzZW50ICovCisjZGVmaW5lCVRTUF9SRVNPTFZFCQkxMgkvKiBtYXN0ZXJzJyBjb25mbGljdCByZXNvbHV0aW9uICovCisjZGVmaW5lCVRTUF9RVUlUCQkxMwkvKiByZWplY3QgY2FuZGlkYXR1cmUgaWYgbWFzdGVyIGlzIHVwICovCisjZGVmaW5lCVRTUF9EQVRFCQkxNAkvKiByZXNldCB0aGUgdGltZSAoZGF0ZSBjb21tYW5kKSAqLworI2RlZmluZQlUU1BfREFURVJFUQkJMTUJLyogcmVtb3RlIHJlcXVlc3QgdG8gcmVzZXQgdGhlIHRpbWUgKi8KKyNkZWZpbmUJVFNQX0RBVEVBQ0sJCTE2CS8qIGFja25vd2xlZGdlIHRpbWUgc2V0dGluZyAgKi8KKyNkZWZpbmUJVFNQX1RSQUNFT04JCTE3CS8qIHR1cm4gdHJhY2luZyBvbiAqLworI2RlZmluZQlUU1BfVFJBQ0VPRkYJCTE4CS8qIHR1cm4gdHJhY2luZyBvZmYgKi8KKyNkZWZpbmUJVFNQX01TSVRFCQkxOQkvKiBmaW5kIG91dCBtYXN0ZXIncyBzaXRlICovCisjZGVmaW5lCVRTUF9NU0lURVJFUQkJMjAJLyogcmVtb3RlIG1hc3RlcidzIHNpdGUgcmVxdWVzdCAqLworI2RlZmluZQlUU1BfVEVTVAkJMjEJLyogZm9yIHRlc3RpbmcgZWxlY3Rpb24gYWxnbyAqLworI2RlZmluZQlUU1BfU0VUREFURQkJMjIJLyogTmV3IGZyb20gZGF0ZSBjb21tYW5kICovCisjZGVmaW5lCVRTUF9TRVREQVRFUkVRCQkyMwkvKiBOZXcgcmVtb3RlIGZvciBhYm92ZSAqLworI2RlZmluZQlUU1BfTE9PUAkJMjQJLyogbG9vcCBkZXRlY3Rpb24gcGFja2V0ICovCisKKyNkZWZpbmUJVFNQVFlQRU5VTUJFUgkJMjUKKworI2lmZGVmIFRTUFRZUEVTCitjaGFyICp0c3B0eXBlW1RTUFRZUEVOVU1CRVJdID0KKyAgeyAiQU5ZIiwgIkFESlRJTUUiLCAiQUNLIiwgIk1BU1RFUlJFUSIsICJNQVNURVJBQ0siLCAiU0VUVElNRSIsICJNQVNURVJVUCIsCisgICJTTEFWRVVQIiwgIkVMRUNUSU9OIiwgIkFDQ0VQVCIsICJSRUZVU0UiLCAiQ09ORkxJQ1QiLCAiUkVTT0xWRSIsICJRVUlUIiwKKyAgIkRBVEUiLCAiREFURVJFUSIsICJEQVRFQUNLIiwgIlRSQUNFT04iLCAiVFJBQ0VPRkYiLCAiTVNJVEUiLCAiTVNJVEVSRVEiLAorICAiVEVTVCIsICJTRVREQVRFIiwgIlNFVERBVEVSRVEiLCAiTE9PUCIgfTsKKyNlbmRpZgorCisjZW5kaWYgLyogcHJvdG9jb2xzL3RpbWVkLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHRocmVhZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkyNDI4MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHRocmVhZC5oCkBAIC0wLDAgKzEsMTE0NSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfUFRIUkVBRF9ICisjZGVmaW5lIF9QVEhSRUFEX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPGJpdHMvcHRocmVhZHR5cGVzLmg+CisjaW5jbHVkZSA8Yml0cy9zZXRqbXAuaD4KKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKworLyogRGV0YWNoIHN0YXRlLiAgKi8KK2VudW0KK3sKKyAgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUsCisjZGVmaW5lIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFCVBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFCisgIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVECisjZGVmaW5lIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVECVBUSFJFQURfQ1JFQVRFX0RFVEFDSEVECit9OworCisKKy8qIE11dGV4IHR5cGVzLiAgKi8KK2VudW0KK3sKKyAgUFRIUkVBRF9NVVRFWF9USU1FRF9OUCwKKyAgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlAsCisgIFBUSFJFQURfTVVURVhfRVJST1JDSEVDS19OUCwKKyAgUFRIUkVBRF9NVVRFWF9BREFQVElWRV9OUAorI2lmIGRlZmluZWQgX19VU0VfVU5JWDk4IHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKyAgLAorICBQVEhSRUFEX01VVEVYX05PUk1BTCA9IFBUSFJFQURfTVVURVhfVElNRURfTlAsCisgIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFID0gUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlAsCisgIFBUSFJFQURfTVVURVhfRVJST1JDSEVDSyA9IFBUSFJFQURfTVVURVhfRVJST1JDSEVDS19OUCwKKyAgUFRIUkVBRF9NVVRFWF9ERUZBVUxUID0gUFRIUkVBRF9NVVRFWF9OT1JNQUwKKyNlbmRpZgorI2lmZGVmIF9fVVNFX0dOVQorICAvKiBGb3IgY29tcGF0aWJpbGl0eS4gICovCisgICwgUFRIUkVBRF9NVVRFWF9GQVNUX05QID0gUFRIUkVBRF9NVVRFWF9USU1FRF9OUAorI2VuZGlmCit9OworCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBSb2J1c3QgbXV0ZXggb3Igbm90IGZsYWdzLiAgKi8KK2VudW0KK3sKKyAgUFRIUkVBRF9NVVRFWF9TVEFMTEVELAorICBQVEhSRUFEX01VVEVYX1NUQUxMRURfTlAgPSBQVEhSRUFEX01VVEVYX1NUQUxMRUQsCisgIFBUSFJFQURfTVVURVhfUk9CVVNULAorICBQVEhSRUFEX01VVEVYX1JPQlVTVF9OUCA9IFBUSFJFQURfTVVURVhfUk9CVVNUCit9OworI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX1VOSVg5OAorLyogTXV0ZXggcHJvdG9jb2xzLiAgKi8KK2VudW0KK3sKKyAgUFRIUkVBRF9QUklPX05PTkUsCisgIFBUSFJFQURfUFJJT19JTkhFUklULAorICBQVEhSRUFEX1BSSU9fUFJPVEVDVAorfTsKKyNlbmRpZgorCisKKy8qIE11dGV4IGluaXRpYWxpemVycy4gICovCisjaWYgX19XT1JEU0laRSA9PSA2NAorIyBkZWZpbmUgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUiBcCisgIHsgeyAwLCAwLCAwLCAwLCAwLCAwLCB7IDAsIDAgfSB9IH0KKyMgaWZkZWYgX19VU0VfR05VCisjICBkZWZpbmUgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlAgXAorICB7IHsgMCwgMCwgMCwgMCwgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlAsIDAsIHsgMCwgMCB9IH0gfQorIyAgZGVmaW5lIFBUSFJFQURfRVJST1JDSEVDS19NVVRFWF9JTklUSUFMSVpFUl9OUCBcCisgIHsgeyAwLCAwLCAwLCAwLCBQVEhSRUFEX01VVEVYX0VSUk9SQ0hFQ0tfTlAsIDAsIHsgMCwgMCB9IH0gfQorIyAgZGVmaW5lIFBUSFJFQURfQURBUFRJVkVfTVVURVhfSU5JVElBTElaRVJfTlAgXAorICB7IHsgMCwgMCwgMCwgMCwgUFRIUkVBRF9NVVRFWF9BREFQVElWRV9OUCwgMCwgeyAwLCAwIH0gfSB9CisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUiBcCisgIHsgeyAwLCAwLCAwLCAwLCAwLCB7IDAgfSB9IH0KKyMgaWZkZWYgX19VU0VfR05VCisjICBkZWZpbmUgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlAgXAorICB7IHsgMCwgMCwgMCwgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlAsIDAsIHsgMCB9IH0gfQorIyAgZGVmaW5lIFBUSFJFQURfRVJST1JDSEVDS19NVVRFWF9JTklUSUFMSVpFUl9OUCBcCisgIHsgeyAwLCAwLCAwLCBQVEhSRUFEX01VVEVYX0VSUk9SQ0hFQ0tfTlAsIDAsIHsgMCB9IH0gfQorIyAgZGVmaW5lIFBUSFJFQURfQURBUFRJVkVfTVVURVhfSU5JVElBTElaRVJfTlAgXAorICB7IHsgMCwgMCwgMCwgUFRIUkVBRF9NVVRFWF9BREFQVElWRV9OUCwgMCwgeyAwIH0gfSB9CisjIGVuZGlmCisjZW5kaWYKKworCisvKiBSZWFkLXdyaXRlIGxvY2sgdHlwZXMuICAqLworI2lmIGRlZmluZWQgX19VU0VfVU5JWDk4IHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworZW51bQoreworICBQVEhSRUFEX1JXTE9DS19QUkVGRVJfUkVBREVSX05QLAorICBQVEhSRUFEX1JXTE9DS19QUkVGRVJfV1JJVEVSX05QLAorICBQVEhSRUFEX1JXTE9DS19QUkVGRVJfV1JJVEVSX05PTlJFQ1VSU0lWRV9OUCwKKyAgUFRIUkVBRF9SV0xPQ0tfREVGQVVMVF9OUCA9IFBUSFJFQURfUldMT0NLX1BSRUZFUl9SRUFERVJfTlAKK307CisKKy8qIFJlYWQtd3JpdGUgbG9jayBpbml0aWFsaXplcnMuICAqLworIyBkZWZpbmUgUFRIUkVBRF9SV0xPQ0tfSU5JVElBTElaRVIgXAorICB7IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9IH0KKyMgaWZkZWYgX19VU0VfR05VCisjICBpZiBfX1dPUkRTSVpFID09IDY0CisjICAgZGVmaW5lIFBUSFJFQURfUldMT0NLX1dSSVRFUl9OT05SRUNVUlNJVkVfSU5JVElBTElaRVJfTlAgXAorICB7IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJCQkJCSAgICAgIFwKKwlQVEhSRUFEX1JXTE9DS19QUkVGRVJfV1JJVEVSX05PTlJFQ1VSU0lWRV9OUCB9IH0KKyMgIGVsc2UKKyMgICBpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjICAgIGRlZmluZSBQVEhSRUFEX1JXTE9DS19XUklURVJfTk9OUkVDVVJTSVZFX0lOSVRJQUxJWkVSX05QIFwKKyAgeyB7IDAsIDAsIDAsIDAsIDAsIDAsIFBUSFJFQURfUldMT0NLX1BSRUZFUl9XUklURVJfTk9OUkVDVVJTSVZFX05QLCBcCisgICAgICAwLCAwLCAwLCAwIH0gfQorIyAgIGVsc2UKKyMgICAgZGVmaW5lIFBUSFJFQURfUldMT0NLX1dSSVRFUl9OT05SRUNVUlNJVkVfSU5JVElBTElaRVJfTlAgXAorICB7IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgUFRIUkVBRF9SV0xPQ0tfUFJFRkVSX1dSSVRFUl9OT05SRUNVUlNJVkVfTlAsXAorICAgICAgMCB9IH0KKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZiAgLyogVW5peDk4IG9yIFhPcGVuMksgKi8KKworCisvKiBTY2hlZHVsZXIgaW5oZXJpdGFuY2UuICAqLworZW51bQoreworICBQVEhSRUFEX0lOSEVSSVRfU0NIRUQsCisjZGVmaW5lIFBUSFJFQURfSU5IRVJJVF9TQ0hFRCAgIFBUSFJFQURfSU5IRVJJVF9TQ0hFRAorICBQVEhSRUFEX0VYUExJQ0lUX1NDSEVECisjZGVmaW5lIFBUSFJFQURfRVhQTElDSVRfU0NIRUQgIFBUSFJFQURfRVhQTElDSVRfU0NIRUQKK307CisKKworLyogU2NvcGUgaGFuZGxpbmcuICAqLworZW51bQoreworICBQVEhSRUFEX1NDT1BFX1NZU1RFTSwKKyNkZWZpbmUgUFRIUkVBRF9TQ09QRV9TWVNURU0gICAgUFRIUkVBRF9TQ09QRV9TWVNURU0KKyAgUFRIUkVBRF9TQ09QRV9QUk9DRVNTCisjZGVmaW5lIFBUSFJFQURfU0NPUEVfUFJPQ0VTUyAgIFBUSFJFQURfU0NPUEVfUFJPQ0VTUworfTsKKworCisvKiBQcm9jZXNzIHNoYXJlZCBvciBwcml2YXRlIGZsYWcuICAqLworZW51bQoreworICBQVEhSRUFEX1BST0NFU1NfUFJJVkFURSwKKyNkZWZpbmUgUFRIUkVBRF9QUk9DRVNTX1BSSVZBVEUgUFRIUkVBRF9QUk9DRVNTX1BSSVZBVEUKKyAgUFRIUkVBRF9QUk9DRVNTX1NIQVJFRAorI2RlZmluZSBQVEhSRUFEX1BST0NFU1NfU0hBUkVEICBQVEhSRUFEX1BST0NFU1NfU0hBUkVECit9OworCisKKworLyogQ29uZGl0aW9uYWwgdmFyaWFibGUgaGFuZGxpbmcuICAqLworI2RlZmluZSBQVEhSRUFEX0NPTkRfSU5JVElBTElaRVIgeyB7IDAsIDAsIDAsIDAsIDAsICh2b2lkICopIDAsIDAsIDAgfSB9CisKKworLyogQ2xlYW51cCBidWZmZXJzICovCitzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIKK3sKKyAgdm9pZCAoKl9fcm91dGluZSkgKHZvaWQgKik7ICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIHRvIGNhbGwuICAqLworICB2b2lkICpfX2FyZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSXRzIGFyZ3VtZW50LiAgKi8KKyAgaW50IF9fY2FuY2VsdHlwZTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmVkIGNhbmNlbGxhdGlvbiB0eXBlLiAqLworICBzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKl9fcHJldjsgLyogQ2hhaW5pbmcgb2YgY2xlYW51cCBmdW5jdGlvbnMuICAqLworfTsKKworLyogQ2FuY2VsbGF0aW9uICovCitlbnVtCit7CisgIFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSwKKyNkZWZpbmUgUFRIUkVBRF9DQU5DRUxfRU5BQkxFICAgUFRIUkVBRF9DQU5DRUxfRU5BQkxFCisgIFBUSFJFQURfQ0FOQ0VMX0RJU0FCTEUKKyNkZWZpbmUgUFRIUkVBRF9DQU5DRUxfRElTQUJMRSAgUFRIUkVBRF9DQU5DRUxfRElTQUJMRQorfTsKK2VudW0KK3sKKyAgUFRIUkVBRF9DQU5DRUxfREVGRVJSRUQsCisjZGVmaW5lIFBUSFJFQURfQ0FOQ0VMX0RFRkVSUkVECVBUSFJFQURfQ0FOQ0VMX0RFRkVSUkVECisgIFBUSFJFQURfQ0FOQ0VMX0FTWU5DSFJPTk9VUworI2RlZmluZSBQVEhSRUFEX0NBTkNFTF9BU1lOQ0hST05PVVMJUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTCit9OworI2RlZmluZSBQVEhSRUFEX0NBTkNFTEVEICgodm9pZCAqKSAtMSkKKworCisvKiBTaW5nbGUgZXhlY3V0aW9uIGhhbmRsaW5nLiAgKi8KKyNkZWZpbmUgUFRIUkVBRF9PTkNFX0lOSVQgMAorCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBWYWx1ZSByZXR1cm5lZCBieSAncHRocmVhZF9iYXJyaWVyX3dhaXQnIGZvciBvbmUgb2YgdGhlIHRocmVhZHMgYWZ0ZXIKKyAgIHRoZSByZXF1aXJlZCBudW1iZXIgb2YgdGhyZWFkcyBoYXZlIGNhbGxlZCB0aGlzIGZ1bmN0aW9uLgorICAgLTEgaXMgZGlzdGluY3QgZnJvbSAwIGFuZCBhbGwgZXJybm8gY29uc3RhbnRzICovCisjIGRlZmluZSBQVEhSRUFEX0JBUlJJRVJfU0VSSUFMX1RIUkVBRCAtMQorI2VuZGlmCisKKworX19CRUdJTl9ERUNMUworCisvKiBDcmVhdGUgYSBuZXcgdGhyZWFkLCBzdGFydGluZyB3aXRoIGV4ZWN1dGlvbiBvZiBTVEFSVC1ST1VUSU5FCisgICBnZXR0aW5nIHBhc3NlZCBBUkcuICBDcmVhdGlvbiBhdHRyaWJ1dGVkIGNvbWUgZnJvbSBBVFRSLiAgVGhlIG5ldworICAgaGFuZGxlIGlzIHN0b3JlZCBpbiAqTkVXVEhSRUFELiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9jcmVhdGUgKHB0aHJlYWRfdCAqX19yZXN0cmljdCBfX25ld3RocmVhZCwKKwkJCSAgIF9fY29uc3QgcHRocmVhZF9hdHRyX3QgKl9fcmVzdHJpY3QgX19hdHRyLAorCQkJICAgdm9pZCAqKCpfX3N0YXJ0X3JvdXRpbmUpICh2b2lkICopLAorCQkJICAgdm9pZCAqX19yZXN0cmljdCBfX2FyZykgX19USFJPV05MIF9fbm9ubnVsbCAoKDEsIDMpKTsKKworLyogVGVybWluYXRlIGNhbGxpbmcgdGhyZWFkLgorCisgICBUaGUgcmVnaXN0ZXJlZCBjbGVhbnVwIGhhbmRsZXJzIGFyZSBjYWxsZWQgdmlhIGV4Y2VwdGlvbiBoYW5kbGluZworICAgc28gd2UgY2Fubm90IG1hcmsgdGhpcyBmdW5jdGlvbiB3aXRoIF9fVEhST1cuKi8KK2V4dGVybiB2b2lkIHB0aHJlYWRfZXhpdCAodm9pZCAqX19yZXR2YWwpIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKworLyogTWFrZSBjYWxsaW5nIHRocmVhZCB3YWl0IGZvciB0ZXJtaW5hdGlvbiBvZiB0aGUgdGhyZWFkIFRILiAgVGhlCisgICBleGl0IHN0YXR1cyBvZiB0aGUgdGhyZWFkIGlzIHN0b3JlZCBpbiAqVEhSRUFEX1JFVFVSTiwgaWYgVEhSRUFEX1JFVFVSTgorICAgaXMgbm90IE5VTEwuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2pvaW4gKHB0aHJlYWRfdCBfX3RoLCB2b2lkICoqX190aHJlYWRfcmV0dXJuKTsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogQ2hlY2sgd2hldGhlciB0aHJlYWQgVEggaGFzIHRlcm1pbmF0ZWQuICBJZiB5ZXMgcmV0dXJuIHRoZSBzdGF0dXMgb2YKKyAgIHRoZSB0aHJlYWQgaW4gKlRIUkVBRF9SRVRVUk4sIGlmIFRIUkVBRF9SRVRVUk4gaXMgbm90IE5VTEwuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3RyeWpvaW5fbnAgKHB0aHJlYWRfdCBfX3RoLCB2b2lkICoqX190aHJlYWRfcmV0dXJuKSBfX1RIUk9XOworCisvKiBNYWtlIGNhbGxpbmcgdGhyZWFkIHdhaXQgZm9yIHRlcm1pbmF0aW9uIG9mIHRoZSB0aHJlYWQgVEgsIGJ1dCBvbmx5CisgICB1bnRpbCBUSU1FT1VULiAgVGhlIGV4aXQgc3RhdHVzIG9mIHRoZSB0aHJlYWQgaXMgc3RvcmVkIGluCisgICAqVEhSRUFEX1JFVFVSTiwgaWYgVEhSRUFEX1JFVFVSTiBpcyBub3QgTlVMTC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfdGltZWRqb2luX25wIChwdGhyZWFkX3QgX190aCwgdm9pZCAqKl9fdGhyZWFkX3JldHVybiwKKwkJCQkgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fYWJzdGltZSk7CisjZW5kaWYKKworLyogSW5kaWNhdGUgdGhhdCB0aGUgdGhyZWFkIFRIIGlzIG5ldmVyIHRvIGJlIGpvaW5lZCB3aXRoIFBUSFJFQURfSk9JTi4KKyAgIFRoZSByZXNvdXJjZXMgb2YgVEggd2lsbCB0aGVyZWZvcmUgYmUgZnJlZWQgaW1tZWRpYXRlbHkgd2hlbiBpdAorICAgdGVybWluYXRlcywgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciBhbm90aGVyIHRocmVhZCB0byBwZXJmb3JtIFBUSFJFQURfSk9JTgorICAgb24gaXQuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2RldGFjaCAocHRocmVhZF90IF9fdGgpIF9fVEhST1c7CisKKworLyogT2J0YWluIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBjdXJyZW50IHRocmVhZC4gICovCitleHRlcm4gcHRocmVhZF90IHB0aHJlYWRfc2VsZiAodm9pZCkgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKy8qIENvbXBhcmUgdHdvIHRocmVhZCBpZGVudGlmaWVycy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfZXF1YWwgKHB0aHJlYWRfdCBfX3RocmVhZDEsIHB0aHJlYWRfdCBfX3RocmVhZDIpIF9fVEhST1c7CisKKworLyogVGhyZWFkIGF0dHJpYnV0ZSBoYW5kbGluZy4gICovCisKKy8qIEluaXRpYWxpemUgdGhyZWFkIGF0dHJpYnV0ZSAqQVRUUiB3aXRoIGRlZmF1bHQgYXR0cmlidXRlcworICAgKGRldGFjaHN0YXRlIGlzIFBUSFJFQURfSk9JTkFCTEUsIHNjaGVkdWxpbmcgcG9saWN5IGlzIFNDSEVEX09USEVSLAorICAgIG5vIHVzZXItcHJvdmlkZWQgc3RhY2spLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX2luaXQgKHB0aHJlYWRfYXR0cl90ICpfX2F0dHIpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBEZXN0cm95IHRocmVhZCBhdHRyaWJ1dGUgKkFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZGVzdHJveSAocHRocmVhZF9hdHRyX3QgKl9fYXR0cikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIEdldCBkZXRhY2ggc3RhdGUgYXR0cmlidXRlLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dldGRldGFjaHN0YXRlIChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsCisJCQkJCWludCAqX19kZXRhY2hzdGF0ZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldCBkZXRhY2ggc3RhdGUgYXR0cmlidXRlLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlIChwdGhyZWFkX2F0dHJfdCAqX19hdHRyLAorCQkJCQlpbnQgX19kZXRhY2hzdGF0ZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKworLyogR2V0IHRoZSBzaXplIG9mIHRoZSBndWFyZCBhcmVhIGNyZWF0ZWQgZm9yIHN0YWNrIG92ZXJmbG93IHByb3RlY3Rpb24uICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZ2V0Z3VhcmRzaXplIChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsCisJCQkJICAgICAgc2l6ZV90ICpfX2d1YXJkc2l6ZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgZ3VhcmQgYXJlYSBjcmVhdGVkIGZvciBzdGFjayBvdmVyZmxvdyBwcm90ZWN0aW9uLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldGd1YXJkc2l6ZSAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwKKwkJCQkgICAgICBzaXplX3QgX19ndWFyZHNpemUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisKKy8qIFJldHVybiBpbiAqUEFSQU0gdGhlIHNjaGVkdWxpbmcgcGFyYW1ldGVycyBvZiAqQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9nZXRzY2hlZHBhcmFtIChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX3Jlc3RyaWN0CisJCQkJICAgICAgIF9fYXR0ciwKKwkJCQkgICAgICAgc3RydWN0IHNjaGVkX3BhcmFtICpfX3Jlc3RyaWN0IF9fcGFyYW0pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBTZXQgc2NoZWR1bGluZyBwYXJhbWV0ZXJzIChwcmlvcml0eSwgZXRjKSBpbiAqQVRUUiBhY2NvcmRpbmcgdG8gUEFSQU0uICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSAocHRocmVhZF9hdHRyX3QgKl9fcmVzdHJpY3QgX19hdHRyLAorCQkJCSAgICAgICBfX2NvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqX19yZXN0cmljdAorCQkJCSAgICAgICBfX3BhcmFtKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogUmV0dXJuIGluICpQT0xJQ1kgdGhlIHNjaGVkdWxpbmcgcG9saWN5IG9mICpBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dldHNjaGVkcG9saWN5IChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX3Jlc3RyaWN0CisJCQkJCV9fYXR0ciwgaW50ICpfX3Jlc3RyaWN0IF9fcG9saWN5KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogU2V0IHNjaGVkdWxpbmcgcG9saWN5IGluICpBVFRSIGFjY29yZGluZyB0byBQT0xJQ1kuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3kgKHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsIGludCBfX3BvbGljeSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFJldHVybiBpbiAqSU5IRVJJVCB0aGUgc2NoZWR1bGluZyBpbmhlcml0YW5jZSBtb2RlIG9mICpBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dldGluaGVyaXRzY2hlZCAoX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19yZXN0cmljdAorCQkJCQkgX19hdHRyLCBpbnQgKl9fcmVzdHJpY3QgX19pbmhlcml0KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogU2V0IHNjaGVkdWxpbmcgaW5oZXJpdGFuY2UgbW9kZSBpbiAqQVRUUiBhY2NvcmRpbmcgdG8gSU5IRVJJVC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9zZXRpbmhlcml0c2NoZWQgKHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsCisJCQkJCSBpbnQgX19pbmhlcml0KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworCisvKiBSZXR1cm4gaW4gKlNDT1BFIHRoZSBzY2hlZHVsaW5nIGNvbnRlbnRpb24gc2NvcGUgb2YgKkFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZ2V0c2NvcGUgKF9fY29uc3QgcHRocmVhZF9hdHRyX3QgKl9fcmVzdHJpY3QgX19hdHRyLAorCQkJCSAgaW50ICpfX3Jlc3RyaWN0IF9fc2NvcGUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBTZXQgc2NoZWR1bGluZyBjb250ZW50aW9uIHNjb3BlIGluICpBVFRSIGFjY29yZGluZyB0byBTQ09QRS4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9zZXRzY29wZSAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwgaW50IF9fc2NvcGUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBSZXR1cm4gdGhlIHByZXZpb3VzbHkgc2V0IGFkZHJlc3MgZm9yIHRoZSBzdGFjay4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9nZXRzdGFja2FkZHIgKF9fY29uc3QgcHRocmVhZF9hdHRyX3QgKl9fcmVzdHJpY3QKKwkJCQkgICAgICBfX2F0dHIsIHZvaWQgKipfX3Jlc3RyaWN0IF9fc3RhY2thZGRyKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKSBfX2F0dHJpYnV0ZV9kZXByZWNhdGVkX187CisKKy8qIFNldCB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgc3RhY2sgb2YgdGhlIHRocmVhZCB0byBiZSBjcmVhdGVkLgorICAgRGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHN0YWNrIGdyb3dzIHVwIG9yIGRvd24gdGhlIHZhbHVlIG11c3QgZWl0aGVyCisgICBiZSBoaWdoZXIgb3IgbG93ZXIgdGhhbiBhbGwgdGhlIGFkZHJlc3MgaW4gdGhlIG1lbW9yeSBibG9jay4gIFRoZQorICAgbWluaW1hbCBzaXplIG9mIHRoZSBibG9jayBtdXN0IGJlIFBUSFJFQURfU1RBQ0tfTUlOLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldHN0YWNrYWRkciAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwKKwkJCQkgICAgICB2b2lkICpfX3N0YWNrYWRkcikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fOworCisvKiBSZXR1cm4gdGhlIGN1cnJlbnRseSB1c2VkIG1pbmltYWwgc3RhY2sgc2l6ZS4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9nZXRzdGFja3NpemUgKF9fY29uc3QgcHRocmVhZF9hdHRyX3QgKl9fcmVzdHJpY3QKKwkJCQkgICAgICBfX2F0dHIsIHNpemVfdCAqX19yZXN0cmljdCBfX3N0YWNrc2l6ZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIEFkZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWluaW11bSBzdGFjayBzaXplIG5lZWRlZCBmb3IgdGhlIHRocmVhZAorICAgdG8gYmUgc3RhcnRlZC4gIFRoaXMgc2l6ZSBtdXN0IG5ldmVyIGJlIGxlc3MgdGhhbiBQVEhSRUFEX1NUQUNLX01JTgorICAgYW5kIG11c3QgYWxzbyBub3QgZXhjZWVkIHRoZSBzeXN0ZW0gbGltaXRzLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwKKwkJCQkgICAgICBzaXplX3QgX19zdGFja3NpemUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogUmV0dXJuIHRoZSBwcmV2aW91c2x5IHNldCBhZGRyZXNzIGZvciB0aGUgc3RhY2suICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZ2V0c3RhY2sgKF9fY29uc3QgcHRocmVhZF9hdHRyX3QgKl9fcmVzdHJpY3QgX19hdHRyLAorCQkJCSAgdm9pZCAqKl9fcmVzdHJpY3QgX19zdGFja2FkZHIsCisJCQkJICBzaXplX3QgKl9fcmVzdHJpY3QgX19zdGFja3NpemUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMiwgMykpOworCisvKiBUaGUgZm9sbG93aW5nIHR3byBpbnRlcmZhY2VzIGFyZSBpbnRlbmRlZCB0byByZXBsYWNlIHRoZSBsYXN0IHR3by4gIFRoZXkKKyAgIHJlcXVpcmUgc2V0dGluZyB0aGUgYWRkcmVzcyBhcyB3ZWxsIGFzIHRoZSBzaXplIHNpbmNlIG9ubHkgc2V0dGluZyB0aGUKKyAgIGFkZHJlc3Mgd2lsbCBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbiBvbiBzb21lIGFyY2hpdGVjdHVyZXMgaW1wb3NzaWJsZS4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9zZXRzdGFjayAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwgdm9pZCAqX19zdGFja2FkZHIsCisJCQkJICBzaXplX3QgX19zdGFja3NpemUpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRocmVhZCBjcmVhdGVkIHdpdGggYXR0cmlidXRlIEFUVFIgd2lsbCBiZSBsaW1pdGVkIHRvIHJ1biBvbmx5IG9uCisgICB0aGUgcHJvY2Vzc29ycyByZXByZXNlbnRlZCBpbiBDUFVTRVQuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfc2V0YWZmaW5pdHlfbnAgKHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsCisJCQkJCXNpemVfdCBfX2NwdXNldHNpemUsCisJCQkJCV9fY29uc3QgY3B1X3NldF90ICpfX2NwdXNldCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAzKSk7CisKKy8qIEdldCBiaXQgc2V0IGluIENQVVNFVCByZXByZXNlbnRpbmcgdGhlIHByb2Nlc3NvcnMgdGhyZWFkcyBjcmVhdGVkIHdpdGgKKyAgIEFUVFIgY2FuIHJ1biBvbi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9nZXRhZmZpbml0eV9ucCAoX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19hdHRyLAorCQkJCQlzaXplX3QgX19jcHVzZXRzaXplLAorCQkJCQljcHVfc2V0X3QgKl9fY3B1c2V0KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDMpKTsKKworCisvKiBJbml0aWFsaXplIHRocmVhZCBhdHRyaWJ1dGUgKkFUVFIgd2l0aCBhdHRyaWJ1dGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICBhbHJlYWR5IHJ1bm5pbmcgdGhyZWFkIFRILiAgSXQgc2hhbGwgYmUgY2FsbGVkIG9uIHVuaW5pdGlhbGl6ZWQgQVRUUgorICAgYW5kIGRlc3Ryb3llZCB3aXRoIHB0aHJlYWRfYXR0cl9kZXN0cm95IHdoZW4gbm8gbG9uZ2VyIG5lZWRlZC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfZ2V0YXR0cl9ucCAocHRocmVhZF90IF9fdGgsIHB0aHJlYWRfYXR0cl90ICpfX2F0dHIpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworI2VuZGlmCisKKworLyogRnVuY3Rpb25zIGZvciBzY2hlZHVsaW5nIGNvbnRyb2wuICAqLworCisvKiBTZXQgdGhlIHNjaGVkdWxpbmcgcGFyYW1ldGVycyBmb3IgVEFSR0VUX1RIUkVBRCBhY2NvcmRpbmcgdG8gUE9MSUNZCisgICBhbmQgKlBBUkFNLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9zZXRzY2hlZHBhcmFtIChwdGhyZWFkX3QgX190YXJnZXRfdGhyZWFkLCBpbnQgX19wb2xpY3ksCisJCQkJICBfX2NvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqX19wYXJhbSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgzKSk7CisKKy8qIFJldHVybiBpbiAqUE9MSUNZIGFuZCAqUEFSQU0gdGhlIHNjaGVkdWxpbmcgcGFyYW1ldGVycyBmb3IgVEFSR0VUX1RIUkVBRC4gKi8KK2V4dGVybiBpbnQgcHRocmVhZF9nZXRzY2hlZHBhcmFtIChwdGhyZWFkX3QgX190YXJnZXRfdGhyZWFkLAorCQkJCSAgaW50ICpfX3Jlc3RyaWN0IF9fcG9saWN5LAorCQkJCSAgc3RydWN0IHNjaGVkX3BhcmFtICpfX3Jlc3RyaWN0IF9fcGFyYW0pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMiwgMykpOworCisvKiBTZXQgdGhlIHNjaGVkdWxpbmcgcHJpb3JpdHkgZm9yIFRBUkdFVF9USFJFQUQuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3NldHNjaGVkcHJpbyAocHRocmVhZF90IF9fdGFyZ2V0X3RocmVhZCwgaW50IF9fcHJpbykKKyAgICAgX19USFJPVzsKKworCisjaWZkZWYgX19VU0VfR05VCisvKiBHZXQgdGhyZWFkIG5hbWUgdmlzaWJsZSBpbiB0aGUga2VybmVsIGFuZCBpdHMgaW50ZXJmYWNlcy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfZ2V0bmFtZV9ucCAocHRocmVhZF90IF9fdGFyZ2V0X3RocmVhZCwgY2hhciAqX19idWYsCisJCQkgICAgICAgc2l6ZV90IF9fYnVmbGVuKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKworLyogU2V0IHRocmVhZCBuYW1lIHZpc2libGUgaW4gdGhlIGtlcm5lbCBhbmQgaXRzIGludGVyZmFjZXMuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3NldG5hbWVfbnAgKHB0aHJlYWRfdCBfX3RhcmdldF90aHJlYWQsIF9fY29uc3QgY2hhciAqX19uYW1lKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9VTklYOTgKKy8qIERldGVybWluZSBsZXZlbCBvZiBjb25jdXJyZW5jeS4gICovCitleHRlcm4gaW50IHB0aHJlYWRfZ2V0Y29uY3VycmVuY3kgKHZvaWQpIF9fVEhST1c7CisKKy8qIFNldCBuZXcgY29uY3VycmVuY3kgbGV2ZWwgdG8gTEVWRUwuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3NldGNvbmN1cnJlbmN5IChpbnQgX19sZXZlbCkgX19USFJPVzsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisvKiBZaWVsZCB0aGUgcHJvY2Vzc29yIHRvIGFub3RoZXIgdGhyZWFkIG9yIHByb2Nlc3MuCisgICBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIFBPU0lYIGBzY2hlZF95aWVsZCcgZnVuY3Rpb24gYnV0CisgICBtaWdodCBiZSBkaWZmZXJlbnRseSBpbXBsZW1lbnRlZCBpbiB0aGUgY2FzZSBvZiBhIG0tb24tbiB0aHJlYWQKKyAgIGltcGxlbWVudGF0aW9uLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF95aWVsZCAodm9pZCkgX19USFJPVzsKKworCisvKiBMaW1pdCBzcGVjaWZpZWQgdGhyZWFkIFRIIHRvIHJ1biBvbmx5IG9uIHRoZSBwcm9jZXNzb3JzIHJlcHJlc2VudGVkCisgICBpbiBDUFVTRVQuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3NldGFmZmluaXR5X25wIChwdGhyZWFkX3QgX190aCwgc2l6ZV90IF9fY3B1c2V0c2l6ZSwKKwkJCQkgICBfX2NvbnN0IGNwdV9zZXRfdCAqX19jcHVzZXQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMykpOworCisvKiBHZXQgYml0IHNldCBpbiBDUFVTRVQgcmVwcmVzZW50aW5nIHRoZSBwcm9jZXNzb3JzIFRIIGNhbiBydW4gb24uICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2dldGFmZmluaXR5X25wIChwdGhyZWFkX3QgX190aCwgc2l6ZV90IF9fY3B1c2V0c2l6ZSwKKwkJCQkgICBjcHVfc2V0X3QgKl9fY3B1c2V0KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDMpKTsKKyNlbmRpZgorCisKKy8qIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgaW5pdGlhbGl6YXRpb24uICAqLworCisvKiBHdWFyYW50ZWUgdGhhdCB0aGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gSU5JVF9ST1VUSU5FIHdpbGwgYmUgY2FsbGVkCisgICBvbmx5IG9uY2UsIGV2ZW4gaWYgcHRocmVhZF9vbmNlIGlzIGV4ZWN1dGVkIHNldmVyYWwgdGltZXMgd2l0aCB0aGUKKyAgIHNhbWUgT05DRV9DT05UUk9MIGFyZ3VtZW50LiBPTkNFX0NPTlRST0wgbXVzdCBwb2ludCB0byBhIHN0YXRpYyBvcgorICAgZXh0ZXJuIHZhcmlhYmxlIGluaXRpYWxpemVkIHRvIFBUSFJFQURfT05DRV9JTklULgorCisgICBUaGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIG1pZ2h0IHRocm93IGV4Y2VwdGlvbiB3aGljaCBpcyB3aHkKKyAgIHRoaXMgZnVuY3Rpb24gaXMgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX29uY2UgKHB0aHJlYWRfb25jZV90ICpfX29uY2VfY29udHJvbCwKKwkJCSB2b2lkICgqX19pbml0X3JvdXRpbmUpICh2b2lkKSkgX19ub25udWxsICgoMSwgMikpOworCisKKy8qIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgY2FuY2VsbGF0aW9uLgorCisgICBOb3RlIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGFyZSBleHBsaWNpdGx5IG5vdCBtYXJrZWQgdG8gbm90IHRocm93IGFuCisgICBleGNlcHRpb24gaW4gQysrIGNvZGUuICBJZiBjYW5jZWxsYXRpb24gaXMgaW1wbGVtZW50ZWQgYnkgdW53aW5kaW5nCisgICB0aGlzIGlzIG5lY2Vzc2FyeSB0byBoYXZlIHRoZSBjb21waWxlciBnZW5lcmF0ZSB0aGUgdW53aW5kIGluZm9ybWF0aW9uLiAgKi8KKworLyogU2V0IGNhbmNlbGFiaWxpdHkgc3RhdGUgb2YgY3VycmVudCB0aHJlYWQgdG8gU1RBVEUsIHJldHVybmluZyBvbGQKKyAgIHN0YXRlIGluICpPTERTVEFURSBpZiBPTERTVEFURSBpcyBub3QgTlVMTC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUgKGludCBfX3N0YXRlLCBpbnQgKl9fb2xkc3RhdGUpOworCisvKiBTZXQgY2FuY2VsbGF0aW9uIHN0YXRlIG9mIGN1cnJlbnQgdGhyZWFkIHRvIFRZUEUsIHJldHVybmluZyB0aGUgb2xkCisgICB0eXBlIGluICpPTERUWVBFIGlmIE9MRFRZUEUgaXMgbm90IE5VTEwuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3NldGNhbmNlbHR5cGUgKGludCBfX3R5cGUsIGludCAqX19vbGR0eXBlKTsKKworLyogQ2FuY2VsIFRIUkVBRCBpbW1lZGlhdGVseSBvciBhdCB0aGUgbmV4dCBwb3NzaWJpbGl0eS4gICovCitleHRlcm4gaW50IHB0aHJlYWRfY2FuY2VsIChwdGhyZWFkX3QgX190aCk7CisKKy8qIFRlc3QgZm9yIHBlbmRpbmcgY2FuY2VsbGF0aW9uIGZvciB0aGUgY3VycmVudCB0aHJlYWQgYW5kIHRlcm1pbmF0ZQorICAgdGhlIHRocmVhZCBhcyBwZXIgcHRocmVhZF9leGl0KFBUSFJFQURfQ0FOQ0VMRUQpIGlmIGl0IGhhcyBiZWVuCisgICBjYW5jZWxsZWQuICAqLworZXh0ZXJuIHZvaWQgcHRocmVhZF90ZXN0Y2FuY2VsICh2b2lkKTsKKworCisvKiBDYW5jZWxsYXRpb24gaGFuZGxpbmcgd2l0aCBpbnRlZ3JhdGlvbiBpbnRvIGV4Y2VwdGlvbiBoYW5kbGluZy4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHN0cnVjdAorICB7CisgICAgX19qbXBfYnVmIF9fY2FuY2VsX2ptcF9idWY7CisgICAgaW50IF9fbWFza193YXNfc2F2ZWQ7CisgIH0gX19jYW5jZWxfam1wX2J1ZlsxXTsKKyAgdm9pZCAqX19wYWRbNF07Cit9IF9fcHRocmVhZF91bndpbmRfYnVmX3QgX19hdHRyaWJ1dGVfXyAoKF9fYWxpZ25lZF9fKSk7CisKKy8qIE5vIHNwZWNpYWwgYXR0cmlidXRlcyBieSBkZWZhdWx0LiAgKi8KKyNpZm5kZWYgX19jbGVhbnVwX2ZjdF9hdHRyaWJ1dGUKKyMgZGVmaW5lIF9fY2xlYW51cF9mY3RfYXR0cmlidXRlCisjZW5kaWYKKworCisvKiBTdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgY2xlYW51cCBoYW5kbGVyIGluZm9ybWF0aW9uLiAgKi8KK3N0cnVjdCBfX3B0aHJlYWRfY2xlYW51cF9mcmFtZQoreworICB2b2lkICgqX19jYW5jZWxfcm91dGluZSkgKHZvaWQgKik7CisgIHZvaWQgKl9fY2FuY2VsX2FyZzsKKyAgaW50IF9fZG9faXQ7CisgIGludCBfX2NhbmNlbF90eXBlOworfTsKKworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgZGVmaW5lZCBfX0VYQ0VQVElPTlMKKyMgaWZkZWYgX19jcGx1c3BsdXMKKy8qIENsYXNzIHRvIGhhbmRsZSBjYW5jZWxsYXRpb24gaGFuZGxlciBpbnZvY2F0aW9uLiAgKi8KK2NsYXNzIF9fcHRocmVhZF9jbGVhbnVwX2NsYXNzCit7CisgIHZvaWQgKCpfX2NhbmNlbF9yb3V0aW5lKSAodm9pZCAqKTsKKyAgdm9pZCAqX19jYW5jZWxfYXJnOworICBpbnQgX19kb19pdDsKKyAgaW50IF9fY2FuY2VsX3R5cGU7CisKKyBwdWJsaWM6CisgIF9fcHRocmVhZF9jbGVhbnVwX2NsYXNzICh2b2lkICgqX19mY3QpICh2b2lkICopLCB2b2lkICpfX2FyZykKKyAgICA6IF9fY2FuY2VsX3JvdXRpbmUgKF9fZmN0KSwgX19jYW5jZWxfYXJnIChfX2FyZyksIF9fZG9faXQgKDEpIHsgfQorICB+X19wdGhyZWFkX2NsZWFudXBfY2xhc3MgKCkgeyBpZiAoX19kb19pdCkgX19jYW5jZWxfcm91dGluZSAoX19jYW5jZWxfYXJnKTsgfQorICB2b2lkIF9fc2V0ZG9pdCAoaW50IF9fbmV3dmFsKSB7IF9fZG9faXQgPSBfX25ld3ZhbDsgfQorICB2b2lkIF9fZGVmZXIgKCkgeyBwdGhyZWFkX3NldGNhbmNlbHR5cGUgKFBUSFJFQURfQ0FOQ0VMX0RFRkVSUkVELAorCQkJCQkgICAmX19jYW5jZWxfdHlwZSk7IH0KKyAgdm9pZCBfX3Jlc3RvcmUgKCkgY29uc3QgeyBwdGhyZWFkX3NldGNhbmNlbHR5cGUgKF9fY2FuY2VsX3R5cGUsIDApOyB9Cit9OworCisvKiBJbnN0YWxsIGEgY2xlYW51cCBoYW5kbGVyOiBST1VUSU5FIHdpbGwgYmUgY2FsbGVkIHdpdGggYXJndW1lbnRzIEFSRworICAgd2hlbiB0aGUgdGhyZWFkIGlzIGNhbmNlbGVkIG9yIGNhbGxzIHB0aHJlYWRfZXhpdC4gIFJPVVRJTkUgd2lsbCBhbHNvCisgICBiZSBjYWxsZWQgd2l0aCBhcmd1bWVudHMgQVJHIHdoZW4gdGhlIG1hdGNoaW5nIHB0aHJlYWRfY2xlYW51cF9wb3AKKyAgIGlzIGV4ZWN1dGVkIHdpdGggbm9uLXplcm8gRVhFQ1VURSBhcmd1bWVudC4KKworICAgcHRocmVhZF9jbGVhbnVwX3B1c2ggYW5kIHB0aHJlYWRfY2xlYW51cF9wb3AgYXJlIG1hY3JvcyBhbmQgbXVzdCBhbHdheXMKKyAgIGJlIHVzZWQgaW4gbWF0Y2hpbmcgcGFpcnMgYXQgdGhlIHNhbWUgbmVzdGluZyBsZXZlbCBvZiBicmFjZXMuICAqLworIyAgZGVmaW5lIHB0aHJlYWRfY2xlYW51cF9wdXNoKHJvdXRpbmUsIGFyZykgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIF9fcHRocmVhZF9jbGVhbnVwX2NsYXNzIF9fY2xmcmFtZSAocm91dGluZSwgYXJnKQorCisvKiBSZW1vdmUgYSBjbGVhbnVwIGhhbmRsZXIgaW5zdGFsbGVkIGJ5IHRoZSBtYXRjaGluZyBwdGhyZWFkX2NsZWFudXBfcHVzaC4KKyAgIElmIEVYRUNVVEUgaXMgbm9uLXplcm8sIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIGlzIGNhbGxlZC4gKi8KKyMgIGRlZmluZSBwdGhyZWFkX2NsZWFudXBfcG9wKGV4ZWN1dGUpIFwKKyAgICBfX2NsZnJhbWUuX19zZXRkb2l0IChleGVjdXRlKTsJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworIyAgaWZkZWYgX19VU0VfR05VCisvKiBJbnN0YWxsIGEgY2xlYW51cCBoYW5kbGVyIGFzIHB0aHJlYWRfY2xlYW51cF9wdXNoIGRvZXMsIGJ1dCBhbHNvCisgICBzYXZlcyB0aGUgY3VycmVudCBjYW5jZWxsYXRpb24gdHlwZSBhbmQgc2V0cyBpdCB0byBkZWZlcnJlZAorICAgY2FuY2VsbGF0aW9uLiAgKi8KKyMgICBkZWZpbmUgcHRocmVhZF9jbGVhbnVwX3B1c2hfZGVmZXJfbnAocm91dGluZSwgYXJnKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgX19wdGhyZWFkX2NsZWFudXBfY2xhc3MgX19jbGZyYW1lIChyb3V0aW5lLCBhcmcpOwkJCSAgICAgIFwKKyAgICBfX2NsZnJhbWUuX19kZWZlciAoKQorCisvKiBSZW1vdmUgYSBjbGVhbnVwIGhhbmRsZXIgYXMgcHRocmVhZF9jbGVhbnVwX3BvcCBkb2VzLCBidXQgYWxzbworICAgcmVzdG9yZXMgdGhlIGNhbmNlbGxhdGlvbiB0eXBlIHRoYXQgd2FzIGluIGVmZmVjdCB3aGVuIHRoZSBtYXRjaGluZworICAgcHRocmVhZF9jbGVhbnVwX3B1c2hfZGVmZXIgd2FzIGNhbGxlZC4gICovCisjICAgZGVmaW5lIHB0aHJlYWRfY2xlYW51cF9wb3BfcmVzdG9yZV9ucChleGVjdXRlKSBcCisgICAgX19jbGZyYW1lLl9fcmVzdG9yZSAoKTsJCQkJCQkgICAgICBcCisgICAgX19jbGZyYW1lLl9fc2V0ZG9pdCAoZXhlY3V0ZSk7CQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisjICBlbmRpZgorIyBlbHNlCisvKiBGdW5jdGlvbiBjYWxsZWQgdG8gY2FsbCB0aGUgY2xlYW51cCBoYW5kbGVyLiAgQXMgYW4gZXh0ZXJuIGlubGluZQorICAgZnVuY3Rpb24gdGhlIGNvbXBpbGVyIGlzIGZyZWUgdG8gZGVjaWRlIGlubGluaW5nIHRoZSBjaGFuZ2Ugd2hlbgorICAgbmVlZGVkIG9yIGZhbGwgYmFjayBvbiB0aGUgY29weSB3aGljaCBtdXN0IGV4aXN0IHNvbWV3aGVyZQorICAgZWxzZS4gICovCitfX2V4dGVybl9pbmxpbmUgdm9pZAorX19wdGhyZWFkX2NsZWFudXBfcm91dGluZSAoc3RydWN0IF9fcHRocmVhZF9jbGVhbnVwX2ZyYW1lICpfX2ZyYW1lKQoreworICBpZiAoX19mcmFtZS0+X19kb19pdCkKKyAgICBfX2ZyYW1lLT5fX2NhbmNlbF9yb3V0aW5lIChfX2ZyYW1lLT5fX2NhbmNlbF9hcmcpOworfQorCisvKiBJbnN0YWxsIGEgY2xlYW51cCBoYW5kbGVyOiBST1VUSU5FIHdpbGwgYmUgY2FsbGVkIHdpdGggYXJndW1lbnRzIEFSRworICAgd2hlbiB0aGUgdGhyZWFkIGlzIGNhbmNlbGVkIG9yIGNhbGxzIHB0aHJlYWRfZXhpdC4gIFJPVVRJTkUgd2lsbCBhbHNvCisgICBiZSBjYWxsZWQgd2l0aCBhcmd1bWVudHMgQVJHIHdoZW4gdGhlIG1hdGNoaW5nIHB0aHJlYWRfY2xlYW51cF9wb3AKKyAgIGlzIGV4ZWN1dGVkIHdpdGggbm9uLXplcm8gRVhFQ1VURSBhcmd1bWVudC4KKworICAgcHRocmVhZF9jbGVhbnVwX3B1c2ggYW5kIHB0aHJlYWRfY2xlYW51cF9wb3AgYXJlIG1hY3JvcyBhbmQgbXVzdCBhbHdheXMKKyAgIGJlIHVzZWQgaW4gbWF0Y2hpbmcgcGFpcnMgYXQgdGhlIHNhbWUgbmVzdGluZyBsZXZlbCBvZiBicmFjZXMuICAqLworIyAgZGVmaW5lIHB0aHJlYWRfY2xlYW51cF9wdXNoKHJvdXRpbmUsIGFyZykgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIHN0cnVjdCBfX3B0aHJlYWRfY2xlYW51cF9mcmFtZSBfX2NsZnJhbWUJCQkJICAgICAgXAorICAgICAgX19hdHRyaWJ1dGVfXyAoKF9fY2xlYW51cF9fIChfX3B0aHJlYWRfY2xlYW51cF9yb3V0aW5lKSkpCQkgICAgICBcCisgICAgICA9IHsgLl9fY2FuY2VsX3JvdXRpbmUgPSAocm91dGluZSksIC5fX2NhbmNlbF9hcmcgPSAoYXJnKSwJIAkgICAgICBcCisJICAuX19kb19pdCA9IDEgfTsKKworLyogUmVtb3ZlIGEgY2xlYW51cCBoYW5kbGVyIGluc3RhbGxlZCBieSB0aGUgbWF0Y2hpbmcgcHRocmVhZF9jbGVhbnVwX3B1c2guCisgICBJZiBFWEVDVVRFIGlzIG5vbi16ZXJvLCB0aGUgaGFuZGxlciBmdW5jdGlvbiBpcyBjYWxsZWQuICovCisjICBkZWZpbmUgcHRocmVhZF9jbGVhbnVwX3BvcChleGVjdXRlKSBcCisgICAgX19jbGZyYW1lLl9fZG9faXQgPSAoZXhlY3V0ZSk7CQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyMgIGlmZGVmIF9fVVNFX0dOVQorLyogSW5zdGFsbCBhIGNsZWFudXAgaGFuZGxlciBhcyBwdGhyZWFkX2NsZWFudXBfcHVzaCBkb2VzLCBidXQgYWxzbworICAgc2F2ZXMgdGhlIGN1cnJlbnQgY2FuY2VsbGF0aW9uIHR5cGUgYW5kIHNldHMgaXQgdG8gZGVmZXJyZWQKKyAgIGNhbmNlbGxhdGlvbi4gICovCisjICAgZGVmaW5lIHB0aHJlYWRfY2xlYW51cF9wdXNoX2RlZmVyX25wKHJvdXRpbmUsIGFyZykgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIHN0cnVjdCBfX3B0aHJlYWRfY2xlYW51cF9mcmFtZSBfX2NsZnJhbWUJCQkJICAgICAgXAorICAgICAgX19hdHRyaWJ1dGVfXyAoKF9fY2xlYW51cF9fIChfX3B0aHJlYWRfY2xlYW51cF9yb3V0aW5lKSkpCQkgICAgICBcCisgICAgICA9IHsgLl9fY2FuY2VsX3JvdXRpbmUgPSAocm91dGluZSksIC5fX2NhbmNlbF9hcmcgPSAoYXJnKSwJCSAgICAgIFwKKwkgIC5fX2RvX2l0ID0gMSB9OwkJCQkJCSAgICAgIFwKKyAgICAodm9pZCkgcHRocmVhZF9zZXRjYW5jZWx0eXBlIChQVEhSRUFEX0NBTkNFTF9ERUZFUlJFRCwJCSAgICAgIFwKKwkJCQkgICZfX2NsZnJhbWUuX19jYW5jZWxfdHlwZSkKKworLyogUmVtb3ZlIGEgY2xlYW51cCBoYW5kbGVyIGFzIHB0aHJlYWRfY2xlYW51cF9wb3AgZG9lcywgYnV0IGFsc28KKyAgIHJlc3RvcmVzIHRoZSBjYW5jZWxsYXRpb24gdHlwZSB0aGF0IHdhcyBpbiBlZmZlY3Qgd2hlbiB0aGUgbWF0Y2hpbmcKKyAgIHB0aHJlYWRfY2xlYW51cF9wdXNoX2RlZmVyIHdhcyBjYWxsZWQuICAqLworIyAgIGRlZmluZSBwdGhyZWFkX2NsZWFudXBfcG9wX3Jlc3RvcmVfbnAoZXhlY3V0ZSkgXAorICAgICh2b2lkKSBwdGhyZWFkX3NldGNhbmNlbHR5cGUgKF9fY2xmcmFtZS5fX2NhbmNlbF90eXBlLCBOVUxMKTsJICAgICAgXAorICAgIF9fY2xmcmFtZS5fX2RvX2l0ID0gKGV4ZWN1dGUpOwkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbHNlCisvKiBJbnN0YWxsIGEgY2xlYW51cCBoYW5kbGVyOiBST1VUSU5FIHdpbGwgYmUgY2FsbGVkIHdpdGggYXJndW1lbnRzIEFSRworICAgd2hlbiB0aGUgdGhyZWFkIGlzIGNhbmNlbGVkIG9yIGNhbGxzIHB0aHJlYWRfZXhpdC4gIFJPVVRJTkUgd2lsbCBhbHNvCisgICBiZSBjYWxsZWQgd2l0aCBhcmd1bWVudHMgQVJHIHdoZW4gdGhlIG1hdGNoaW5nIHB0aHJlYWRfY2xlYW51cF9wb3AKKyAgIGlzIGV4ZWN1dGVkIHdpdGggbm9uLXplcm8gRVhFQ1VURSBhcmd1bWVudC4KKworICAgcHRocmVhZF9jbGVhbnVwX3B1c2ggYW5kIHB0aHJlYWRfY2xlYW51cF9wb3AgYXJlIG1hY3JvcyBhbmQgbXVzdCBhbHdheXMKKyAgIGJlIHVzZWQgaW4gbWF0Y2hpbmcgcGFpcnMgYXQgdGhlIHNhbWUgbmVzdGluZyBsZXZlbCBvZiBicmFjZXMuICAqLworIyBkZWZpbmUgcHRocmVhZF9jbGVhbnVwX3B1c2gocm91dGluZSwgYXJnKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgX19wdGhyZWFkX3Vud2luZF9idWZfdCBfX2NhbmNlbF9idWY7CQkJCSAgICAgIFwKKyAgICB2b2lkICgqX19jYW5jZWxfcm91dGluZSkgKHZvaWQgKikgPSAocm91dGluZSk7CQkJICAgICAgXAorICAgIHZvaWQgKl9fY2FuY2VsX2FyZyA9IChhcmcpOwkJCQkJCSAgICAgIFwKKyAgICBpbnQgX19ub3RfZmlyc3RfY2FsbCA9IF9fc2lnc2V0am1wICgoc3RydWN0IF9fam1wX2J1Zl90YWcgKikgKHZvaWQgKikgICAgIFwKKwkJCQkJX19jYW5jZWxfYnVmLl9fY2FuY2VsX2ptcF9idWYsIDApOyAgICBcCisgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKF9fbm90X2ZpcnN0X2NhbGwsIDApKQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorCV9fY2FuY2VsX3JvdXRpbmUgKF9fY2FuY2VsX2FyZyk7CQkJCSAgICAgIFwKKwlfX3B0aHJlYWRfdW53aW5kX25leHQgKCZfX2NhbmNlbF9idWYpOwkJCQkgICAgICBcCisJLyogTk9UUkVBQ0hFRCAqLwkJCQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgX19wdGhyZWFkX3JlZ2lzdGVyX2NhbmNlbCAoJl9fY2FuY2VsX2J1Zik7CQkJCSAgICAgIFwKKyAgICBkbyB7CitleHRlcm4gdm9pZCBfX3B0aHJlYWRfcmVnaXN0ZXJfY2FuY2VsIChfX3B0aHJlYWRfdW53aW5kX2J1Zl90ICpfX2J1ZikKKyAgICAgX19jbGVhbnVwX2ZjdF9hdHRyaWJ1dGU7CisKKy8qIFJlbW92ZSBhIGNsZWFudXAgaGFuZGxlciBpbnN0YWxsZWQgYnkgdGhlIG1hdGNoaW5nIHB0aHJlYWRfY2xlYW51cF9wdXNoLgorICAgSWYgRVhFQ1VURSBpcyBub24temVybywgdGhlIGhhbmRsZXIgZnVuY3Rpb24gaXMgY2FsbGVkLiAqLworIyBkZWZpbmUgcHRocmVhZF9jbGVhbnVwX3BvcChleGVjdXRlKSBcCisgICAgICBkbyB7IH0gd2hpbGUgKDApOy8qIEVtcHR5IHRvIGFsbG93IGxhYmVsIGJlZm9yZSBwdGhyZWFkX2NsZWFudXBfcG9wLiAgKi9cCisgICAgfSB3aGlsZSAoMCk7CQkJCQkJCSAgICAgIFwKKyAgICBfX3B0aHJlYWRfdW5yZWdpc3Rlcl9jYW5jZWwgKCZfX2NhbmNlbF9idWYpOwkJCSAgICAgIFwKKyAgICBpZiAoZXhlY3V0ZSkJCQkJCQkJICAgICAgXAorICAgICAgX19jYW5jZWxfcm91dGluZSAoX19jYW5jZWxfYXJnKTsJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKK2V4dGVybiB2b2lkIF9fcHRocmVhZF91bnJlZ2lzdGVyX2NhbmNlbCAoX19wdGhyZWFkX3Vud2luZF9idWZfdCAqX19idWYpCisgIF9fY2xlYW51cF9mY3RfYXR0cmlidXRlOworCisjIGlmZGVmIF9fVVNFX0dOVQorLyogSW5zdGFsbCBhIGNsZWFudXAgaGFuZGxlciBhcyBwdGhyZWFkX2NsZWFudXBfcHVzaCBkb2VzLCBidXQgYWxzbworICAgc2F2ZXMgdGhlIGN1cnJlbnQgY2FuY2VsbGF0aW9uIHR5cGUgYW5kIHNldHMgaXQgdG8gZGVmZXJyZWQKKyAgIGNhbmNlbGxhdGlvbi4gICovCisjICBkZWZpbmUgcHRocmVhZF9jbGVhbnVwX3B1c2hfZGVmZXJfbnAocm91dGluZSwgYXJnKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgX19wdGhyZWFkX3Vud2luZF9idWZfdCBfX2NhbmNlbF9idWY7CQkJCSAgICAgIFwKKyAgICB2b2lkICgqX19jYW5jZWxfcm91dGluZSkgKHZvaWQgKikgPSAocm91dGluZSk7CQkJICAgICAgXAorICAgIHZvaWQgKl9fY2FuY2VsX2FyZyA9IChhcmcpOwkJCQkJCSAgICAgIFwKKyAgICBpbnQgX19ub3RfZmlyc3RfY2FsbCA9IF9fc2lnc2V0am1wICgoc3RydWN0IF9fam1wX2J1Zl90YWcgKikgKHZvaWQgKikgICAgIFwKKwkJCQkJX19jYW5jZWxfYnVmLl9fY2FuY2VsX2ptcF9idWYsIDApOyAgICBcCisgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKF9fbm90X2ZpcnN0X2NhbGwsIDApKQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorCV9fY2FuY2VsX3JvdXRpbmUgKF9fY2FuY2VsX2FyZyk7CQkJCSAgICAgIFwKKwlfX3B0aHJlYWRfdW53aW5kX25leHQgKCZfX2NhbmNlbF9idWYpOwkJCQkgICAgICBcCisJLyogTk9UUkVBQ0hFRCAqLwkJCQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgX19wdGhyZWFkX3JlZ2lzdGVyX2NhbmNlbF9kZWZlciAoJl9fY2FuY2VsX2J1Zik7CQkJICAgICAgXAorICAgIGRvIHsKK2V4dGVybiB2b2lkIF9fcHRocmVhZF9yZWdpc3Rlcl9jYW5jZWxfZGVmZXIgKF9fcHRocmVhZF91bndpbmRfYnVmX3QgKl9fYnVmKQorICAgICBfX2NsZWFudXBfZmN0X2F0dHJpYnV0ZTsKKworLyogUmVtb3ZlIGEgY2xlYW51cCBoYW5kbGVyIGFzIHB0aHJlYWRfY2xlYW51cF9wb3AgZG9lcywgYnV0IGFsc28KKyAgIHJlc3RvcmVzIHRoZSBjYW5jZWxsYXRpb24gdHlwZSB0aGF0IHdhcyBpbiBlZmZlY3Qgd2hlbiB0aGUgbWF0Y2hpbmcKKyAgIHB0aHJlYWRfY2xlYW51cF9wdXNoX2RlZmVyIHdhcyBjYWxsZWQuICAqLworIyAgZGVmaW5lIHB0aHJlYWRfY2xlYW51cF9wb3BfcmVzdG9yZV9ucChleGVjdXRlKSBcCisgICAgICBkbyB7IH0gd2hpbGUgKDApOy8qIEVtcHR5IHRvIGFsbG93IGxhYmVsIGJlZm9yZSBwdGhyZWFkX2NsZWFudXBfcG9wLiAgKi9cCisgICAgfSB3aGlsZSAoMCk7CQkJCQkJCSAgICAgIFwKKyAgICBfX3B0aHJlYWRfdW5yZWdpc3Rlcl9jYW5jZWxfcmVzdG9yZSAoJl9fY2FuY2VsX2J1Zik7CQkgICAgICBcCisgICAgaWYgKGV4ZWN1dGUpCQkJCQkJCSAgICAgIFwKKyAgICAgIF9fY2FuY2VsX3JvdXRpbmUgKF9fY2FuY2VsX2FyZyk7CQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCitleHRlcm4gdm9pZCBfX3B0aHJlYWRfdW5yZWdpc3Rlcl9jYW5jZWxfcmVzdG9yZSAoX19wdGhyZWFkX3Vud2luZF9idWZfdCAqX19idWYpCisgIF9fY2xlYW51cF9mY3RfYXR0cmlidXRlOworIyBlbmRpZgorCisvKiBJbnRlcm5hbCBpbnRlcmZhY2UgdG8gaW5pdGlhdGUgY2xlYW51cC4gICovCitleHRlcm4gdm9pZCBfX3B0aHJlYWRfdW53aW5kX25leHQgKF9fcHRocmVhZF91bndpbmRfYnVmX3QgKl9fYnVmKQorICAgICBfX2NsZWFudXBfZmN0X2F0dHJpYnV0ZSBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSkKKyMgaWZuZGVmIFNIQVJFRAorICAgICBfX2F0dHJpYnV0ZV9fICgoX193ZWFrX18pKQorIyBlbmRpZgorICAgICA7CisjZW5kaWYKKworLyogRnVuY3Rpb24gdXNlZCBpbiB0aGUgbWFjcm9zLiAgKi8KK3N0cnVjdCBfX2ptcF9idWZfdGFnOworZXh0ZXJuIGludCBfX3NpZ3NldGptcCAoc3RydWN0IF9fam1wX2J1Zl90YWcgKl9fZW52LCBpbnQgX19zYXZlbWFzaykgX19USFJPVzsKKworCisvKiBNdXRleCBoYW5kbGluZy4gICovCisKKy8qIEluaXRpYWxpemUgYSBtdXRleC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhfaW5pdCAocHRocmVhZF9tdXRleF90ICpfX211dGV4LAorCQkJICAgICAgIF9fY29uc3QgcHRocmVhZF9tdXRleGF0dHJfdCAqX19tdXRleGF0dHIpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBEZXN0cm95IGEgbXV0ZXguICAqLworZXh0ZXJuIGludCBwdGhyZWFkX211dGV4X2Rlc3Ryb3kgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFRyeSBsb2NraW5nIGEgbXV0ZXguICAqLworZXh0ZXJuIGludCBwdGhyZWFkX211dGV4X3RyeWxvY2sgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKKyAgICAgX19USFJPV05MIF9fbm9ubnVsbCAoKDEpKTsKKworLyogTG9jayBhIG11dGV4LiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleF9sb2NrIChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCisgICAgIF9fVEhST1dOTCBfX25vbm51bGwgKCgxKSk7CisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBXYWl0IHVudGlsIGxvY2sgYmVjb21lcyBhdmFpbGFibGUsIG9yIHNwZWNpZmllZCB0aW1lIHBhc3Nlcy4gKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleF90aW1lZGxvY2sgKHB0aHJlYWRfbXV0ZXhfdCAqX19yZXN0cmljdCBfX211dGV4LAorCQkJCSAgICBfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX19yZXN0cmljdAorCQkJCSAgICBfX2Fic3RpbWUpIF9fVEhST1dOTCBfX25vbm51bGwgKCgxLCAyKSk7CisjZW5kaWYKKworLyogVW5sb2NrIGEgbXV0ZXguICAqLworZXh0ZXJuIGludCBwdGhyZWFkX211dGV4X3VubG9jayAocHRocmVhZF9tdXRleF90ICpfX211dGV4KQorICAgICBfX1RIUk9XTkwgX19ub25udWxsICgoMSkpOworCisKKy8qIEdldCB0aGUgcHJpb3JpdHkgY2VpbGluZyBvZiBNVVRFWC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhfZ2V0cHJpb2NlaWxpbmcgKF9fY29uc3QgcHRocmVhZF9tdXRleF90ICoKKwkJCQkJIF9fcmVzdHJpY3QgX19tdXRleCwKKwkJCQkJIGludCAqX19yZXN0cmljdCBfX3ByaW9jZWlsaW5nKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogU2V0IHRoZSBwcmlvcml0eSBjZWlsaW5nIG9mIE1VVEVYIHRvIFBSSU9DRUlMSU5HLCByZXR1cm4gb2xkCisgICBwcmlvcml0eSBjZWlsaW5nIHZhbHVlIGluICpPTERfQ0VJTElORy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhfc2V0cHJpb2NlaWxpbmcgKHB0aHJlYWRfbXV0ZXhfdCAqX19yZXN0cmljdCBfX211dGV4LAorCQkJCQkgaW50IF9fcHJpb2NlaWxpbmcsCisJCQkJCSBpbnQgKl9fcmVzdHJpY3QgX19vbGRfY2VpbGluZykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAzKSk7CisKKworI2lmZGVmIF9fVVNFX1hPUEVOMks4CisvKiBEZWNsYXJlIHRoZSBzdGF0ZSBwcm90ZWN0ZWQgYnkgTVVURVggYXMgY29uc2lzdGVudC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhfY29uc2lzdGVudCAocHRocmVhZF9tdXRleF90ICpfX211dGV4KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyMgaWZkZWYgX19VU0VfR05VCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhfY29uc2lzdGVudF9ucCAocHRocmVhZF9tdXRleF90ICpfX211dGV4KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgbXV0ZXggYXR0cmlidXRlcy4gICovCisKKy8qIEluaXRpYWxpemUgbXV0ZXggYXR0cmlidXRlIG9iamVjdCBBVFRSIHdpdGggZGVmYXVsdCBhdHRyaWJ1dGVzCisgICAoa2luZCBpcyBQVEhSRUFEX01VVEVYX1RJTUVEX05QKS4gICovCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQgKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fYXR0cikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIERlc3Ryb3kgbXV0ZXggYXR0cmlidXRlIG9iamVjdCBBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSAocHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogR2V0IHRoZSBwcm9jZXNzLXNoYXJlZCBmbGFnIG9mIHRoZSBtdXRleCBhdHRyaWJ1dGUgQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhhdHRyX2dldHBzaGFyZWQgKF9fY29uc3QgcHRocmVhZF9tdXRleGF0dHJfdCAqCisJCQkJCSBfX3Jlc3RyaWN0IF9fYXR0ciwKKwkJCQkJIGludCAqX19yZXN0cmljdCBfX3BzaGFyZWQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBTZXQgdGhlIHByb2Nlc3Mtc2hhcmVkIGZsYWcgb2YgdGhlIG11dGV4IGF0dHJpYnV0ZSBBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJfc2V0cHNoYXJlZCAocHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyLAorCQkJCQkgaW50IF9fcHNoYXJlZCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyNpZiBkZWZpbmVkIF9fVVNFX1VOSVg5OCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisvKiBSZXR1cm4gaW4gKktJTkQgdGhlIG11dGV4IGtpbmQgYXR0cmlidXRlIGluICpBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJfZ2V0dHlwZSAoX19jb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICpfX3Jlc3RyaWN0CisJCQkJICAgICAgX19hdHRyLCBpbnQgKl9fcmVzdHJpY3QgX19raW5kKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogU2V0IHRoZSBtdXRleCBraW5kIGF0dHJpYnV0ZSBpbiAqQVRUUiB0byBLSU5EIChlaXRoZXIgUFRIUkVBRF9NVVRFWF9OT1JNQUwsCisgICBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSwgUFRIUkVBRF9NVVRFWF9FUlJPUkNIRUNLLCBvcgorICAgUFRIUkVBRF9NVVRFWF9ERUZBVUxUKS4gICovCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUgKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fYXR0ciwgaW50IF9fa2luZCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworLyogUmV0dXJuIGluICpQUk9UT0NPTCB0aGUgbXV0ZXggcHJvdG9jb2wgYXR0cmlidXRlIGluICpBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJfZ2V0cHJvdG9jb2wgKF9fY29uc3QgcHRocmVhZF9tdXRleGF0dHJfdCAqCisJCQkJCSAgX19yZXN0cmljdCBfX2F0dHIsCisJCQkJCSAgaW50ICpfX3Jlc3RyaWN0IF9fcHJvdG9jb2wpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBTZXQgdGhlIG11dGV4IHByb3RvY29sIGF0dHJpYnV0ZSBpbiAqQVRUUiB0byBQUk9UT0NPTCAoZWl0aGVyCisgICBQVEhSRUFEX1BSSU9fTk9ORSwgUFRIUkVBRF9QUklPX0lOSEVSSVQsIG9yIFBUSFJFQURfUFJJT19QUk9URUNUKS4gICovCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHByb3RvY29sIChwdGhyZWFkX211dGV4YXR0cl90ICpfX2F0dHIsCisJCQkJCSAgaW50IF9fcHJvdG9jb2wpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBSZXR1cm4gaW4gKlBSSU9DRUlMSU5HIHRoZSBtdXRleCBwcmlvY2VpbGluZyBhdHRyaWJ1dGUgaW4gKkFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX211dGV4YXR0cl9nZXRwcmlvY2VpbGluZyAoX19jb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICoKKwkJCQkJICAgICBfX3Jlc3RyaWN0IF9fYXR0ciwKKwkJCQkJICAgICBpbnQgKl9fcmVzdHJpY3QgX19wcmlvY2VpbGluZykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldCB0aGUgbXV0ZXggcHJpb2NlaWxpbmcgYXR0cmlidXRlIGluICpBVFRSIHRvIFBSSU9DRUlMSU5HLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJfc2V0cHJpb2NlaWxpbmcgKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fYXR0ciwKKwkJCQkJICAgICBpbnQgX19wcmlvY2VpbGluZykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBHZXQgdGhlIHJvYnVzdG5lc3MgZmxhZyBvZiB0aGUgbXV0ZXggYXR0cmlidXRlIEFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX211dGV4YXR0cl9nZXRyb2J1c3QgKF9fY29uc3QgcHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyLAorCQkJCQlpbnQgKl9fcm9idXN0bmVzcykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjIGlmZGVmIF9fVVNFX0dOVQorZXh0ZXJuIGludCBwdGhyZWFkX211dGV4YXR0cl9nZXRyb2J1c3RfbnAgKF9fY29uc3QgcHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyLAorCQkJCQkgICBpbnQgKl9fcm9idXN0bmVzcykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjIGVuZGlmCisKKy8qIFNldCB0aGUgcm9idXN0bmVzcyBmbGFnIG9mIHRoZSBtdXRleCBhdHRyaWJ1dGUgQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHJvYnVzdCAocHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyLAorCQkJCQlpbnQgX19yb2J1c3RuZXNzKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyMgaWZkZWYgX19VU0VfR05VCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHJvYnVzdF9ucCAocHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyLAorCQkJCQkgICBpbnQgX19yb2J1c3RuZXNzKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyMgZW5kaWYKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX1VOSVg5OCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgcmVhZC13cml0ZSBsb2Nrcy4gICovCisKKy8qIEluaXRpYWxpemUgcmVhZC13cml0ZSBsb2NrIFJXTE9DSyB1c2luZyBhdHRyaWJ1dGVzIEFUVFIsIG9yIHVzZQorICAgdGhlIGRlZmF1bHQgdmFsdWVzIGlmIGxhdGVyIGlzIE5VTEwuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja19pbml0IChwdGhyZWFkX3J3bG9ja190ICpfX3Jlc3RyaWN0IF9fcndsb2NrLAorCQkJCV9fY29uc3QgcHRocmVhZF9yd2xvY2thdHRyX3QgKl9fcmVzdHJpY3QKKwkJCQlfX2F0dHIpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBEZXN0cm95IHJlYWQtd3JpdGUgbG9jayBSV0xPQ0suICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja19kZXN0cm95IChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jaykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIEFjcXVpcmUgcmVhZCBsb2NrIGZvciBSV0xPQ0suICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja19yZGxvY2sgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKQorICAgICBfX1RIUk9XTkwgX19ub25udWxsICgoMSkpOworCisvKiBUcnkgdG8gYWNxdWlyZSByZWFkIGxvY2sgZm9yIFJXTE9DSy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrX3RyeXJkbG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2spCisgIF9fVEhST1dOTCBfX25vbm51bGwgKCgxKSk7CisKKyMgaWZkZWYgX19VU0VfWE9QRU4ySworLyogVHJ5IHRvIGFjcXVpcmUgcmVhZCBsb2NrIGZvciBSV0xPQ0sgb3IgcmV0dXJuIGFmdGVyIHNwZWNmaWVkIHRpbWUuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja190aW1lZHJkbG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19yZXN0cmljdCBfX3J3bG9jaywKKwkJCQkgICAgICAgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVzdHJpY3QKKwkJCQkgICAgICAgX19hYnN0aW1lKSBfX1RIUk9XTkwgX19ub25udWxsICgoMSwgMikpOworIyBlbmRpZgorCisvKiBBY3F1aXJlIHdyaXRlIGxvY2sgZm9yIFJXTE9DSy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrX3dybG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2spCisgICAgIF9fVEhST1dOTCBfX25vbm51bGwgKCgxKSk7CisKKy8qIFRyeSB0byBhY3F1aXJlIHdyaXRlIGxvY2sgZm9yIFJXTE9DSy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrX3RyeXdybG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2spCisgICAgIF9fVEhST1dOTCBfX25vbm51bGwgKCgxKSk7CisKKyMgaWZkZWYgX19VU0VfWE9QRU4ySworLyogVHJ5IHRvIGFjcXVpcmUgd3JpdGUgbG9jayBmb3IgUldMT0NLIG9yIHJldHVybiBhZnRlciBzcGVjZmllZCB0aW1lLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9yd2xvY2tfdGltZWR3cmxvY2sgKHB0aHJlYWRfcndsb2NrX3QgKl9fcmVzdHJpY3QgX19yd2xvY2ssCisJCQkJICAgICAgIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3Jlc3RyaWN0CisJCQkJICAgICAgIF9fYWJzdGltZSkgX19USFJPV05MIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgZW5kaWYKKworLyogVW5sb2NrIFJXTE9DSy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrX3VubG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2spCisgICAgIF9fVEhST1dOTCBfX25vbm51bGwgKCgxKSk7CisKKworLyogRnVuY3Rpb25zIGZvciBoYW5kbGluZyByZWFkLXdyaXRlIGxvY2sgYXR0cmlidXRlcy4gICovCisKKy8qIEluaXRpYWxpemUgYXR0cmlidXRlIG9iamVjdCBBVFRSIHdpdGggZGVmYXVsdCB2YWx1ZXMuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja2F0dHJfaW5pdCAocHRocmVhZF9yd2xvY2thdHRyX3QgKl9fYXR0cikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIERlc3Ryb3kgYXR0cmlidXRlIG9iamVjdCBBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9yd2xvY2thdHRyX2Rlc3Ryb3kgKHB0aHJlYWRfcndsb2NrYXR0cl90ICpfX2F0dHIpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBSZXR1cm4gY3VycmVudCBzZXR0aW5nIG9mIHByb2Nlc3Mtc2hhcmVkIGF0dHJpYnV0ZSBvZiBBVFRSIGluIFBTSEFSRUQuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja2F0dHJfZ2V0cHNoYXJlZCAoX19jb25zdCBwdGhyZWFkX3J3bG9ja2F0dHJfdCAqCisJCQkJCSAgX19yZXN0cmljdCBfX2F0dHIsCisJCQkJCSAgaW50ICpfX3Jlc3RyaWN0IF9fcHNoYXJlZCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldCBwcm9jZXNzLXNoYXJlZCBhdHRyaWJ1dGUgb2YgQVRUUiB0byBQU0hBUkVELiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9yd2xvY2thdHRyX3NldHBzaGFyZWQgKHB0aHJlYWRfcndsb2NrYXR0cl90ICpfX2F0dHIsCisJCQkJCSAgaW50IF9fcHNoYXJlZCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFJldHVybiBjdXJyZW50IHNldHRpbmcgb2YgcmVhZGVyL3dyaXRlciBwcmVmZXJlbmNlLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9yd2xvY2thdHRyX2dldGtpbmRfbnAgKF9fY29uc3QgcHRocmVhZF9yd2xvY2thdHRyX3QgKgorCQkJCQkgIF9fcmVzdHJpY3QgX19hdHRyLAorCQkJCQkgIGludCAqX19yZXN0cmljdCBfX3ByZWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBTZXQgcmVhZGVyL3dyaXRlIHByZWZlcmVuY2UuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja2F0dHJfc2V0a2luZF9ucCAocHRocmVhZF9yd2xvY2thdHRyX3QgKl9fYXR0ciwKKwkJCQkJICBpbnQgX19wcmVmKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisKKy8qIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgY29uZGl0aW9uYWwgdmFyaWFibGVzLiAgKi8KKworLyogSW5pdGlhbGl6ZSBjb25kaXRpb24gdmFyaWFibGUgQ09ORCB1c2luZyBhdHRyaWJ1dGVzIEFUVFIsIG9yIHVzZQorICAgdGhlIGRlZmF1bHQgdmFsdWVzIGlmIGxhdGVyIGlzIE5VTEwuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRfaW5pdCAocHRocmVhZF9jb25kX3QgKl9fcmVzdHJpY3QgX19jb25kLAorCQkJICAgICAgX19jb25zdCBwdGhyZWFkX2NvbmRhdHRyX3QgKl9fcmVzdHJpY3QKKwkJCSAgICAgIF9fY29uZF9hdHRyKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogRGVzdHJveSBjb25kaXRpb24gdmFyaWFibGUgQ09ORC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfY29uZF9kZXN0cm95IChwdGhyZWFkX2NvbmRfdCAqX19jb25kKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogV2FrZSB1cCBvbmUgdGhyZWFkIHdhaXRpbmcgZm9yIGNvbmRpdGlvbiB2YXJpYWJsZSBDT05ELiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9jb25kX3NpZ25hbCAocHRocmVhZF9jb25kX3QgKl9fY29uZCkKKyAgICAgX19USFJPV05MIF9fbm9ubnVsbCAoKDEpKTsKKworLyogV2FrZSB1cCBhbGwgdGhyZWFkcyB3YWl0aW5nIGZvciBjb25kaXRpb24gdmFyaWFibGVzIENPTkQuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0IChwdGhyZWFkX2NvbmRfdCAqX19jb25kKQorICAgICBfX1RIUk9XTkwgX19ub25udWxsICgoMSkpOworCisvKiBXYWl0IGZvciBjb25kaXRpb24gdmFyaWFibGUgQ09ORCB0byBiZSBzaWduYWxlZCBvciBicm9hZGNhc3QuCisgICBNVVRFWCBpcyBhc3N1bWVkIHRvIGJlIGxvY2tlZCBiZWZvcmUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRfd2FpdCAocHRocmVhZF9jb25kX3QgKl9fcmVzdHJpY3QgX19jb25kLAorCQkJICAgICAgcHRocmVhZF9tdXRleF90ICpfX3Jlc3RyaWN0IF9fbXV0ZXgpCisgICAgIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogV2FpdCBmb3IgY29uZGl0aW9uIHZhcmlhYmxlIENPTkQgdG8gYmUgc2lnbmFsZWQgb3IgYnJvYWRjYXN0IHVudGlsCisgICBBQlNUSU1FLiAgTVVURVggaXMgYXNzdW1lZCB0byBiZSBsb2NrZWQgYmVmb3JlLiAgQUJTVElNRSBpcyBhbgorICAgYWJzb2x1dGUgdGltZSBzcGVjaWZpY2F0aW9uOyB6ZXJvIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGVwb2NoCisgICAoMDA6MDA6MDAgR01ULCBKYW51YXJ5IDEsIDE5NzApLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9jb25kX3RpbWVkd2FpdCAocHRocmVhZF9jb25kX3QgKl9fcmVzdHJpY3QgX19jb25kLAorCQkJCSAgIHB0aHJlYWRfbXV0ZXhfdCAqX19yZXN0cmljdCBfX211dGV4LAorCQkJCSAgIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3Jlc3RyaWN0CisJCQkJICAgX19hYnN0aW1lKSBfX25vbm51bGwgKCgxLCAyLCAzKSk7CisKKy8qIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgY29uZGl0aW9uIHZhcmlhYmxlIGF0dHJpYnV0ZXMuICAqLworCisvKiBJbml0aWFsaXplIGNvbmRpdGlvbiB2YXJpYWJsZSBhdHRyaWJ1dGUgQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfY29uZGF0dHJfaW5pdCAocHRocmVhZF9jb25kYXR0cl90ICpfX2F0dHIpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBEZXN0cm95IGNvbmRpdGlvbiB2YXJpYWJsZSBhdHRyaWJ1dGUgQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfY29uZGF0dHJfZGVzdHJveSAocHRocmVhZF9jb25kYXR0cl90ICpfX2F0dHIpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBHZXQgdGhlIHByb2Nlc3Mtc2hhcmVkIGZsYWcgb2YgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBhdHRyaWJ1dGUgQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfY29uZGF0dHJfZ2V0cHNoYXJlZCAoX19jb25zdCBwdGhyZWFkX2NvbmRhdHRyX3QgKgorCQkJCQlfX3Jlc3RyaWN0IF9fYXR0ciwKKwkJCQkJaW50ICpfX3Jlc3RyaWN0IF9fcHNoYXJlZCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldCB0aGUgcHJvY2Vzcy1zaGFyZWQgZmxhZyBvZiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIGF0dHJpYnV0ZSBBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9jb25kYXR0cl9zZXRwc2hhcmVkIChwdGhyZWFkX2NvbmRhdHRyX3QgKl9fYXR0ciwKKwkJCQkJaW50IF9fcHNoYXJlZCkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBHZXQgdGhlIGNsb2NrIHNlbGVjdGVkIGZvciB0aGUgY29uZGl0b24gdmFyaWFibGUgYXR0cmlidXRlIEFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRhdHRyX2dldGNsb2NrIChfX2NvbnN0IHB0aHJlYWRfY29uZGF0dHJfdCAqCisJCQkJICAgICAgX19yZXN0cmljdCBfX2F0dHIsCisJCQkJICAgICAgX19jbG9ja2lkX3QgKl9fcmVzdHJpY3QgX19jbG9ja19pZCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldCB0aGUgY2xvY2sgc2VsZWN0ZWQgZm9yIHRoZSBjb25kaXRvbiB2YXJpYWJsZSBhdHRyaWJ1dGUgQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfY29uZGF0dHJfc2V0Y2xvY2sgKHB0aHJlYWRfY29uZGF0dHJfdCAqX19hdHRyLAorCQkJCSAgICAgIF9fY2xvY2tpZF90IF9fY2xvY2tfaWQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX1hPUEVOMksKKy8qIEZ1bmN0aW9ucyB0byBoYW5kbGUgc3BpbmxvY2tzLiAgKi8KKworLyogSW5pdGlhbGl6ZSB0aGUgc3BpbmxvY2sgTE9DSy4gIElmIFBTSEFSRUQgaXMgbm9uemVybyB0aGUgc3BpbmxvY2sgY2FuCisgICBiZSBzaGFyZWQgYmV0d2VlbiBkaWZmZXJlbnQgcHJvY2Vzc2VzLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9zcGluX2luaXQgKHB0aHJlYWRfc3BpbmxvY2tfdCAqX19sb2NrLCBpbnQgX19wc2hhcmVkKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogRGVzdHJveSB0aGUgc3BpbmxvY2sgTE9DSy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfc3Bpbl9kZXN0cm95IChwdGhyZWFkX3NwaW5sb2NrX3QgKl9fbG9jaykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFdhaXQgdW50aWwgc3BpbmxvY2sgTE9DSyBpcyByZXRyaWV2ZWQuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3NwaW5fbG9jayAocHRocmVhZF9zcGlubG9ja190ICpfX2xvY2spCisgICAgIF9fVEhST1dOTCBfX25vbm51bGwgKCgxKSk7CisKKy8qIFRyeSB0byBsb2NrIHNwaW5sb2NrIExPQ0suICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3NwaW5fdHJ5bG9jayAocHRocmVhZF9zcGlubG9ja190ICpfX2xvY2spCisgICAgIF9fVEhST1dOTCBfX25vbm51bGwgKCgxKSk7CisKKy8qIFJlbGVhc2Ugc3BpbmxvY2sgTE9DSy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfc3Bpbl91bmxvY2sgKHB0aHJlYWRfc3BpbmxvY2tfdCAqX19sb2NrKQorICAgICBfX1RIUk9XTkwgX19ub25udWxsICgoMSkpOworCisKKy8qIEZ1bmN0aW9ucyB0byBoYW5kbGUgYmFycmllcnMuICAqLworCisvKiBJbml0aWFsaXplIEJBUlJJRVIgd2l0aCB0aGUgYXR0cmlidXRlcyBpbiBBVFRSLiAgVGhlIGJhcnJpZXIgaXMKKyAgIG9wZW5lZCB3aGVuIENPVU5UIHdhaXRlcnMgYXJyaXZlZC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYmFycmllcl9pbml0IChwdGhyZWFkX2JhcnJpZXJfdCAqX19yZXN0cmljdCBfX2JhcnJpZXIsCisJCQkJIF9fY29uc3QgcHRocmVhZF9iYXJyaWVyYXR0cl90ICpfX3Jlc3RyaWN0CisJCQkJIF9fYXR0ciwgdW5zaWduZWQgaW50IF9fY291bnQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBEZXN0cm95IGEgcHJldmlvdXNseSBkeW5hbWljYWxseSBpbml0aWFsaXplZCBiYXJyaWVyIEJBUlJJRVIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2JhcnJpZXJfZGVzdHJveSAocHRocmVhZF9iYXJyaWVyX3QgKl9fYmFycmllcikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFdhaXQgb24gYmFycmllciBCQVJSSUVSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9iYXJyaWVyX3dhaXQgKHB0aHJlYWRfYmFycmllcl90ICpfX2JhcnJpZXIpCisgICAgIF9fVEhST1dOTCBfX25vbm51bGwgKCgxKSk7CisKKworLyogSW5pdGlhbGl6ZSBiYXJyaWVyIGF0dHJpYnV0ZSBBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9iYXJyaWVyYXR0cl9pbml0IChwdGhyZWFkX2JhcnJpZXJhdHRyX3QgKl9fYXR0cikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIERlc3Ryb3kgcHJldmlvdXNseSBkeW5hbWljYWxseSBpbml0aWFsaXplZCBiYXJyaWVyIGF0dHJpYnV0ZSBBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9iYXJyaWVyYXR0cl9kZXN0cm95IChwdGhyZWFkX2JhcnJpZXJhdHRyX3QgKl9fYXR0cikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIEdldCB0aGUgcHJvY2Vzcy1zaGFyZWQgZmxhZyBvZiB0aGUgYmFycmllciBhdHRyaWJ1dGUgQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYmFycmllcmF0dHJfZ2V0cHNoYXJlZCAoX19jb25zdCBwdGhyZWFkX2JhcnJpZXJhdHRyX3QgKgorCQkJCQkgICBfX3Jlc3RyaWN0IF9fYXR0ciwKKwkJCQkJICAgaW50ICpfX3Jlc3RyaWN0IF9fcHNoYXJlZCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldCB0aGUgcHJvY2Vzcy1zaGFyZWQgZmxhZyBvZiB0aGUgYmFycmllciBhdHRyaWJ1dGUgQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYmFycmllcmF0dHJfc2V0cHNoYXJlZCAocHRocmVhZF9iYXJyaWVyYXR0cl90ICpfX2F0dHIsCisJCQkJCSAgIGludCBfX3BzaGFyZWQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKworLyogRnVuY3Rpb25zIGZvciBoYW5kbGluZyB0aHJlYWQtc3BlY2lmaWMgZGF0YS4gICovCisKKy8qIENyZWF0ZSBhIGtleSB2YWx1ZSBpZGVudGlmeWluZyBhIGxvY2F0aW9uIGluIHRoZSB0aHJlYWQtc3BlY2lmaWMKKyAgIGRhdGEgYXJlYS4gIEVhY2ggdGhyZWFkIG1haW50YWlucyBhIGRpc3RpbmN0IHRocmVhZC1zcGVjaWZpYyBkYXRhCisgICBhcmVhLiAgREVTVFJfRlVOQ1RJT04sIGlmIG5vbi1OVUxMLCBpcyBjYWxsZWQgd2l0aCB0aGUgdmFsdWUKKyAgIGFzc29jaWF0ZWQgdG8gdGhhdCBrZXkgd2hlbiB0aGUga2V5IGlzIGRlc3Ryb3llZC4KKyAgIERFU1RSX0ZVTkNUSU9OIGlzIG5vdCBjYWxsZWQgaWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQgaXMgTlVMTCB3aGVuCisgICB0aGUga2V5IGlzIGRlc3Ryb3llZC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfa2V5X2NyZWF0ZSAocHRocmVhZF9rZXlfdCAqX19rZXksCisJCQkgICAgICAgdm9pZCAoKl9fZGVzdHJfZnVuY3Rpb24pICh2b2lkICopKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogRGVzdHJveSBLRVkuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2tleV9kZWxldGUgKHB0aHJlYWRfa2V5X3QgX19rZXkpIF9fVEhST1c7CisKKy8qIFJldHVybiBjdXJyZW50IHZhbHVlIG9mIHRoZSB0aHJlYWQtc3BlY2lmaWMgZGF0YSBzbG90IGlkZW50aWZpZWQgYnkgS0VZLiAgKi8KK2V4dGVybiB2b2lkICpwdGhyZWFkX2dldHNwZWNpZmljIChwdGhyZWFkX2tleV90IF9fa2V5KSBfX1RIUk9XOworCisvKiBTdG9yZSBQT0lOVEVSIGluIHRoZSB0aHJlYWQtc3BlY2lmaWMgZGF0YSBzbG90IGlkZW50aWZpZWQgYnkgS0VZLiAqLworZXh0ZXJuIGludCBwdGhyZWFkX3NldHNwZWNpZmljIChwdGhyZWFkX2tleV90IF9fa2V5LAorCQkJCV9fY29uc3Qgdm9pZCAqX19wb2ludGVyKSBfX1RIUk9XIDsKKworCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogR2V0IElEIG9mIENQVS10aW1lIGNsb2NrIGZvciB0aHJlYWQgVEhSRUFEX0lELiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9nZXRjcHVjbG9ja2lkIChwdGhyZWFkX3QgX190aHJlYWRfaWQsCisJCQkJICBfX2Nsb2NraWRfdCAqX19jbG9ja19pZCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZW5kaWYKKworCisvKiBJbnN0YWxsIGhhbmRsZXJzIHRvIGJlIGNhbGxlZCB3aGVuIGEgbmV3IHByb2Nlc3MgaXMgY3JlYXRlZCB3aXRoIEZPUksuCisgICBUaGUgUFJFUEFSRSBoYW5kbGVyIGlzIGNhbGxlZCBpbiB0aGUgcGFyZW50IHByb2Nlc3MganVzdCBiZWZvcmUgcGVyZm9ybWluZworICAgRk9SSy4gVGhlIFBBUkVOVCBoYW5kbGVyIGlzIGNhbGxlZCBpbiB0aGUgcGFyZW50IHByb2Nlc3MganVzdCBhZnRlciBGT1JLLgorICAgVGhlIENISUxEIGhhbmRsZXIgaXMgY2FsbGVkIGluIHRoZSBjaGlsZCBwcm9jZXNzLiAgRWFjaCBvZiB0aGUgdGhyZWUKKyAgIGhhbmRsZXJzIGNhbiBiZSBOVUxMLCBtZWFuaW5nIHRoYXQgbm8gaGFuZGxlciBuZWVkcyB0byBiZSBjYWxsZWQgYXQgdGhhdAorICAgcG9pbnQuCisgICBQVEhSRUFEX0FURk9SSyBjYW4gYmUgY2FsbGVkIHNldmVyYWwgdGltZXMsIGluIHdoaWNoIGNhc2UgdGhlIFBSRVBBUkUKKyAgIGhhbmRsZXJzIGFyZSBjYWxsZWQgaW4gTElGTyBvcmRlciAobGFzdCBhZGRlZCB3aXRoIFBUSFJFQURfQVRGT1JLLAorICAgZmlyc3QgY2FsbGVkIGJlZm9yZSBGT1JLKSwgYW5kIHRoZSBQQVJFTlQgYW5kIENISUxEIGhhbmRsZXJzIGFyZSBjYWxsZWQKKyAgIGluIEZJRk8gKGZpcnN0IGFkZGVkLCBmaXJzdCBjYWxsZWQpLiAgKi8KKworZXh0ZXJuIGludCBwdGhyZWFkX2F0Zm9yayAodm9pZCAoKl9fcHJlcGFyZSkgKHZvaWQpLAorCQkJICAgdm9pZCAoKl9fcGFyZW50KSAodm9pZCksCisJCQkgICB2b2lkICgqX19jaGlsZCkgKHZvaWQpKSBfX1RIUk9XOworCisKKyNpZmRlZiBfX1VTRV9FWFRFUk5fSU5MSU5FUworLyogT3B0aW1pemF0aW9ucy4gICovCitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAocHRocmVhZF9lcXVhbCAocHRocmVhZF90IF9fdGhyZWFkMSwgcHRocmVhZF90IF9fdGhyZWFkMikpCit7CisgIHJldHVybiBfX3RocmVhZDEgPT0gX190aHJlYWQyOworfQorI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBwdGhyZWFkLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHR5LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZWQ3N2QKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B0eS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIEZ1bmN0aW9ucyBmb3IgcHNldWRvIFRUWSBoYW5kbGluZy4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfUFRZX0gKKyNkZWZpbmUgX1BUWV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKworX19CRUdJTl9ERUNMUworCisvKiBDcmVhdGUgcHNldWRvIHR0eSBtYXN0ZXIgc2xhdmUgcGFpciB3aXRoIE5BTUUgYW5kIHNldCB0ZXJtaW5hbAorICAgYXR0cmlidXRlcyBhY2NvcmRpbmcgdG8gVEVSTVAgYW5kIFdJTlAgYW5kIHJldHVybiBoYW5kbGVzIGZvciBib3RoCisgICBlbmRzIGluIEFNQVNURVIgYW5kIEFTTEFWRS4gICovCitleHRlcm4gaW50IG9wZW5wdHkgKGludCAqX19hbWFzdGVyLCBpbnQgKl9fYXNsYXZlLCBjaGFyICpfX25hbWUsCisJCSAgICBjb25zdCBzdHJ1Y3QgdGVybWlvcyAqX190ZXJtcCwKKwkJICAgIGNvbnN0IHN0cnVjdCB3aW5zaXplICpfX3dpbnApIF9fVEhST1c7CisKKy8qIENyZWF0ZSBjaGlsZCBwcm9jZXNzIGFuZCBlc3RhYmxpc2ggdGhlIHNsYXZlIHBzZXVkbyB0ZXJtaW5hbCBhcyB0aGUKKyAgIGNoaWxkJ3MgY29udHJvbGxpbmcgdGVybWluYWwuICAqLworZXh0ZXJuIGludCBmb3JrcHR5IChpbnQgKl9fYW1hc3RlciwgY2hhciAqX19uYW1lLAorCQkgICAgY29uc3Qgc3RydWN0IHRlcm1pb3MgKl9fdGVybXAsCisJCSAgICBjb25zdCBzdHJ1Y3Qgd2luc2l6ZSAqX193aW5wKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogcHR5LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvY2RlY2wuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvY2RlY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDBkMTRmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9jZGVjbC5oCkBAIC0wLDAgKzEsNDIgQEAKKyNpZm5kZWYgZm9vcHVsc2VjZGVjbGhmb28KKyNkZWZpbmUgZm9vcHVsc2VjZGVjbGhmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisvKiogXGZpbGUKKyAqIEMrKyBjb21wYXRpYmlsaXR5IHN1cHBvcnQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisvKiogSWYgdXNpbmcgQysrIHRoaXMgbWFjcm8gZW5hYmxlcyBDIG1vZGUsIG90aGVyd2lzZSBkb2VzIG5vdGhpbmcgKi8KKyNkZWZpbmUgUEFfQ19ERUNMX0JFR0lOIGV4dGVybiAiQyIgeworLyoqIElmIHVzaW5nIEMrKyB0aGlzIG1hY3JvcyBzd2l0Y2hlcyBiYWNrIHRvIEMrKyBtb2RlLCBvdGhlcndpc2UgZG9lcyBub3RoaW5nICovCisjZGVmaW5lIFBBX0NfREVDTF9FTkQgfQorCisjZWxzZQorLyoqIElmIHVzaW5nIEMrKyB0aGlzIG1hY3JvIGVuYWJsZXMgQyBtb2RlLCBvdGhlcndpc2UgZG9lcyBub3RoaW5nICovCisjZGVmaW5lIFBBX0NfREVDTF9CRUdJTgorLyoqIElmIHVzaW5nIEMrKyB0aGlzIG1hY3JvcyBzd2l0Y2hlcyBiYWNrIHRvIEMrKyBtb2RlLCBvdGhlcndpc2UgZG9lcyBub3RoaW5nICovCisjZGVmaW5lIFBBX0NfREVDTF9FTkQKKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9jaGFubmVsbWFwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2NoYW5uZWxtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDYyMjI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9jaGFubmVsbWFwLmgKQEAgLTAsMCArMSwzNjMgQEAKKyNpZm5kZWYgZm9vY2hhbm5lbG1hcGhmb28KKyNkZWZpbmUgZm9vY2hhbm5lbG1hcGhmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA1LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxwdWxzZS9zYW1wbGUuaD4KKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL2djY21hY3JvLmg+CisjaW5jbHVkZSA8cHVsc2UvdmVyc2lvbi5oPgorCisvKiogXHBhZ2UgY2hhbm5lbG1hcCBDaGFubmVsIE1hcHMKKyAqCisgKiBcc2VjdGlvbiBvdmVydl9zZWMgT3ZlcnZpZXcKKyAqCisgKiBDaGFubmVsIG1hcHMgcHJvdmlkZSBhIHdheSB0byBhc3NvY2lhdGUgY2hhbm5lbHMgaW4gYSBzdHJlYW0gd2l0aCBhCisgKiBzcGVjaWZpYyBzcGVha2VyIHBvc2l0aW9uLiBUaGlzIHJlbGlldmVzIGFwcGxpY2F0aW9ucyBvZiBoYXZpbmcgdG8KKyAqIG1ha2Ugc3VyZSB0aGVpciBjaGFubmVsIG9yZGVyIGlzIGlkZW50aWNhbCB0byB0aGUgZmluYWwgb3V0cHV0LgorICoKKyAqIFxzZWN0aW9uIGluaXRfc2VjIEluaXRpYWxpc2F0aW9uCisgKgorICogQSBjaGFubmVsIG1hcCBjb25zaXN0cyBvZiBhbiBhcnJheSBvZiBccmVmIHBhX2NoYW5uZWxfcG9zaXRpb24gdmFsdWVzLAorICogb25lIGZvciBlYWNoIGNoYW5uZWwuIFRoaXMgYXJyYXkgaXMgc3RvcmVkIHRvZ2V0aGVyIHdpdGggYSBjaGFubmVsIGNvdW50CisgKiBpbiBhIHBhX2NoYW5uZWxfbWFwIHN0cnVjdHVyZS4KKyAqCisgKiBCZWZvcmUgZmlsbGluZyB0aGUgc3RydWN0dXJlLCB0aGUgYXBwbGljYXRpb24gbXVzdCBpbml0aWFsaXNlIGl0IHVzaW5nCisgKiBwYV9jaGFubmVsX21hcF9pbml0KCkuIFRoZXJlIGFyZSBhbHNvIGEgbnVtYmVyIG9mIGNvbnZlbmllbmNlIGZ1bmN0aW9ucworICogZm9yIHN0YW5kYXJkIGNoYW5uZWwgbWFwcGluZ3M6CisgKgorICogXGxpIHBhX2NoYW5uZWxfbWFwX2luaXRfbW9ubygpIC0gQ3JlYXRlIGEgY2hhbm5lbCBtYXAgd2l0aCBvbmx5IG1vbm8gYXVkaW8uCisgKiBcbGkgcGFfY2hhbm5lbF9tYXBfaW5pdF9zdGVyZW8oKSAtIENyZWF0ZSBhIHN0YW5kYXJkIHN0ZXJlbyBtYXBwaW5nLgorICogXGxpIHBhX2NoYW5uZWxfbWFwX2luaXRfYXV0bygpIC0gQ3JlYXRlIGEgc3RhbmRhcmQgY2hhbm5lbCBtYXAgZm9yIGEgc3BlY2lmaWMgbnVtYmVyIG9mIGNoYW5uZWxzCisgKiBcbGkgcGFfY2hhbm5lbF9tYXBfaW5pdF9leHRlbmQoKSAtIFNpbWlsYXIgdG8KKyAqIHBhX2NoYW5uZWxfbWFwX2luaXRfYXV0bygpIGJ1dCBzeW50aGVzaXplIGEgY2hhbm5lbCBtYXAgaWYgbm8KKyAqIHByZWRlZmluZWQgb25lIGlzIGtub3duIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFubmVscy4KKyAqCisgKiBcc2VjdGlvbiBjb252X3NlYyBDb252ZW5pZW5jZSBGdW5jdGlvbnMKKyAqCisgKiBUaGUgbGlicmFyeSBjb250YWlucyBhIG51bWJlciBvZiBjb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aAorICogY2hhbm5lbCBtYXBzOgorICoKKyAqIFxsaSBwYV9jaGFubmVsX21hcF92YWxpZCgpIC0gVGVzdHMgaWYgYSBjaGFubmVsIG1hcCBpcyB2YWxpZC4KKyAqIFxsaSBwYV9jaGFubmVsX21hcF9lcXVhbCgpIC0gVGVzdHMgaWYgdHdvIGNoYW5uZWwgbWFwcyBhcmUgaWRlbnRpY2FsLgorICogXGxpIHBhX2NoYW5uZWxfbWFwX3NucHJpbnQoKSAtIENyZWF0ZXMgYSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIGEgY2hhbm5lbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC4KKyAqLworCisvKiogXGZpbGUKKyAqIENvbnN0YW50cyBhbmQgcm91dGluZXMgZm9yIGNoYW5uZWwgbWFwcGluZyBoYW5kbGluZworICoKKyAqIFNlZSBhbHNvIFxzdWJwYWdlIGNoYW5uZWxtYXAKKyAqLworCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIEEgbGlzdCBvZiBjaGFubmVsIGxhYmVscyAqLwordHlwZWRlZiBlbnVtIHBhX2NoYW5uZWxfcG9zaXRpb24geworICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fSU5WQUxJRCA9IC0xLAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fTU9OTyA9IDAsCisKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsICAgICAgICAgICAgICAgLyoqPCBBcHBsZSwgRG9sYnkgY2FsbCB0aGlzICdMZWZ0JyAqLworICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsICAgICAgICAgICAgICAvKio8IEFwcGxlLCBEb2xieSBjYWxsIHRoaXMgJ1JpZ2h0JyAqLworICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSLCAgICAgICAgICAgICAvKio8IEFwcGxlLCBEb2xieSBjYWxsIHRoaXMgJ0NlbnRlcicgKi8KKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9MRUZUID0gUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fUklHSFQgPSBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQ0VOVEVSID0gUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIsCisvKiogXGVuZGNvbmQgKi8KKworICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9DRU5URVIsICAgICAgICAgICAgICAvKio8IE1pY3Jvc29mdCBjYWxscyB0aGlzICdCYWNrIENlbnRlcicsIEFwcGxlIGNhbGxzIHRoaXMgJ0NlbnRlciBTdXJyb3VuZCcsIERvbGJ5IGNhbGxzIHRoaXMgJ1N1cnJvdW5kIFJlYXIgQ2VudGVyJyAqLworICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZULCAgICAgICAgICAgICAgICAvKio8IE1pY3Jvc29mdCBjYWxscyB0aGlzICdCYWNrIExlZnQnLCBBcHBsZSBjYWxscyB0aGlzICdMZWZ0IFN1cnJvdW5kJyAoISksIERvbGJ5IGNhbGxzIHRoaXMgJ1N1cnJvdW5kIFJlYXIgTGVmdCcgICovCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9SRUFSX1JJR0hULCAgICAgICAgICAgICAgIC8qKjwgTWljcm9zb2Z0IGNhbGxzIHRoaXMgJ0JhY2sgUmlnaHQnLCBBcHBsZSBjYWxscyB0aGlzICdSaWdodCBTdXJyb3VuZCcgKCEpLCBEb2xieSBjYWxscyB0aGlzICdTdXJyb3VuZCBSZWFyIFJpZ2h0JyAgKi8KKworICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fTEZFLCAgICAgICAgICAgICAgICAgICAgICAvKio8IE1pY3Jvc29mdCBjYWxscyB0aGlzICdMb3cgRnJlcXVlbmN5JywgQXBwbGUgY2FsbHMgdGhpcyAnTEZFU2NyZWVuJyAqLworLyoqIFxjb25kIGZ1bGxkb2NzICovCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9TVUJXT09GRVIgPSBQQV9DSEFOTkVMX1BPU0lUSU9OX0xGRSwKKy8qKiBcZW5kY29uZCAqLworCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUX09GX0NFTlRFUiwgICAgIC8qKjwgQXBwbGUsIERvbGJ5IGNhbGwgdGhpcyAnTGVmdCBDZW50ZXInICovCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVF9PRl9DRU5URVIsICAgIC8qKjwgQXBwbGUsIERvbGJ5IGNhbGwgdGhpcyAnUmlnaHQgQ2VudGVyICovCisKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX1NJREVfTEVGVCwgICAgICAgICAgICAgICAgLyoqPCBBcHBsZSBjYWxscyB0aGlzICdMZWZ0IFN1cnJvdW5kIERpcmVjdCcsIERvbGJ5IGNhbGxzIHRoaXMgJ1N1cnJvdW5kIExlZnQnICghKSAqLworICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fU0lERV9SSUdIVCwgICAgICAgICAgICAgICAvKio8IEFwcGxlIGNhbGxzIHRoaXMgJ1JpZ2h0IFN1cnJvdW5kIERpcmVjdCcsIERvbGJ5IGNhbGxzIHRoaXMgJ1N1cnJvdW5kIFJpZ2h0JyAoISkgKi8KKworICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMCwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDEsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyLAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMywKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDQsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVg1LAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYNiwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDcsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVg4LAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYOSwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDEwLAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTEsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxMiwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDEzLAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTQsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxNSwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDE2LAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTcsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxOCwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDE5LAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjAsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyMSwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDIyLAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjMsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyNCwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDI1LAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjYsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyNywKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDI4LAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjksCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgzMCwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDMxLAorCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfQ0VOVEVSLCAgICAgICAgICAgICAgIC8qKjwgQXBwbGUgY2FsbHMgdGhpcyAnVG9wIENlbnRlciBTdXJyb3VuZCcgKi8KKworICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX0xFRlQsICAgICAgICAgICAvKio8IEFwcGxlIGNhbGxzIHRoaXMgJ1ZlcnRpY2FsIEhlaWdodCBMZWZ0JyAqLworICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX1JJR0hULCAgICAgICAgICAvKio8IEFwcGxlIGNhbGxzIHRoaXMgJ1ZlcnRpY2FsIEhlaWdodCBSaWdodCcgKi8KKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9DRU5URVIsICAgICAgICAgLyoqPCBBcHBsZSBjYWxscyB0aGlzICdWZXJ0aWNhbCBIZWlnaHQgQ2VudGVyJyAqLworCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9MRUZULCAgICAgICAgICAgIC8qKjwgTWljcm9zb2Z0IGFuZCBBcHBsZSBjYWxsIHRoaXMgJ1RvcCBCYWNrIExlZnQnICovCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9SSUdIVCwgICAgICAgICAgIC8qKjwgTWljcm9zb2Z0IGFuZCBBcHBsZSBjYWxsIHRoaXMgJ1RvcCBCYWNrIFJpZ2h0JyAqLworICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfQ0VOVEVSLCAgICAgICAgICAvKio8IE1pY3Jvc29mdCBhbmQgQXBwbGUgY2FsbCB0aGlzICdUb3AgQmFjayBDZW50ZXInICovCisKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX01BWAorfSBwYV9jaGFubmVsX3Bvc2l0aW9uX3Q7CisKKy8qKiBcY29uZCBmdWxsZG9jcyAqLworI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0lOVkFMSUQgUEFfQ0hBTk5FTF9QT1NJVElPTl9JTlZBTElECisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fTU9OTyBQQV9DSEFOTkVMX1BPU0lUSU9OX01PTk8KKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9MRUZUIFBBX0NIQU5ORUxfUE9TSVRJT05fTEVGVAorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX1JJR0hUIFBBX0NIQU5ORUxfUE9TSVRJT05fUklHSFQKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9DRU5URVIgUEFfQ0hBTk5FTF9QT1NJVElPTl9DRU5URVIKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUIFBBX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVAorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUIFBBX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIgUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0NFTlRFUiBQQV9DSEFOTkVMX1BPU0lUSU9OX1JFQVJfQ0VOVEVSCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZUIFBBX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZUCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVCBQQV9DSEFOTkVMX1BPU0lUSU9OX1JFQVJfUklHSFQKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9MRkUgUEFfQ0hBTk5FTF9QT1NJVElPTl9MRkUKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9TVUJXT09GRVIgUEFfQ0hBTk5FTF9QT1NJVElPTl9TVUJXT09GRVIKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUX09GX0NFTlRFUiBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlRfT0ZfQ0VOVEVSCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFRfT0ZfQ0VOVEVSIFBBX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFRfT0ZfQ0VOVEVSCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fU0lERV9MRUZUIFBBX0NIQU5ORUxfUE9TSVRJT05fU0lERV9MRUZUCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fU0lERV9SSUdIVCBQQV9DSEFOTkVMX1BPU0lUSU9OX1NJREVfUklHSFQKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgwIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMAorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDEgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMiBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDIKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgzIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMworI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDQgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVg0CisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYNSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDUKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVg2IFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYNgorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDcgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVg3CisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYOCBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDgKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVg5IFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYOQorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDEwIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTAKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxMSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDExCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTIgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxMgorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDEzIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTMKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxNCBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDE0CisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxNQorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDE2IFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTYKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxNyBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDE3CisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTggUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxOAorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDE5IFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTkKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyMCBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDIwCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjEgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyMQorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDIyIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjIKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyMyBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDIzCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjQgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyNAorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDI1IFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjUKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyNiBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDI2CisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjcgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyNworI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDI4IFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjgKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyOSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDI5CisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMzAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgzMAorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDMxIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMzEKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfQ0VOVEVSIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX0NFTlRFUgorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9MRUZUIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX0xFRlQKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfRlJPTlRfUklHSFQgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfRlJPTlRfUklHSFQKKyNkZWZpbmUgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfRlJPTlRfQ0VOVEVSIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX0NFTlRFUgorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX0xFRlQgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9MRUZUCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfUklHSFQgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9SSUdIVAorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX0NFTlRFUiBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX0NFTlRFUgorI2RlZmluZSBQQV9DSEFOTkVMX1BPU0lUSU9OX01BWCBQQV9DSEFOTkVMX1BPU0lUSU9OX01BWAorLyoqIFxlbmRjb25kICovCisKKy8qKiBBIG1hc2sgb2YgY2hhbm5lbCBwb3NpdGlvbnMuIFxzaW5jZSAwLjkuMTYgKi8KK3R5cGVkZWYgdWludDY0X3QgcGFfY2hhbm5lbF9wb3NpdGlvbl9tYXNrX3Q7CisKKy8qKiBNYWtlcyBhIGJpdCBtYXNrIGZyb20gYSBjaGFubmVsIHBvc2l0aW9uLiBcc2luY2UgMC45LjE2ICovCisjZGVmaW5lIFBBX0NIQU5ORUxfUE9TSVRJT05fTUFTSyhmKSAoKHBhX2NoYW5uZWxfcG9zaXRpb25fbWFza190KSAoMVVMTCA8PCAoZikpKQorCisvKiogQSBsaXN0IG9mIGNoYW5uZWwgbWFwcGluZyBkZWZpbml0aW9ucyBmb3IgcGFfY2hhbm5lbF9tYXBfaW5pdF9hdXRvKCkgKi8KK3R5cGVkZWYgZW51bSBwYV9jaGFubmVsX21hcF9kZWYgeworICAgIFBBX0NIQU5ORUxfTUFQX0FJRkYsCisgICAgLyoqPCBUaGUgbWFwcGluZyBmcm9tIFJGQzM1NTEsIHdoaWNoIGlzIGJhc2VkIG9uIEFJRkYtQyAqLworCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyAgICBQQV9DSEFOTkVMX01BUF9BTFNBLAorICAgIC8qKjwgVGhlIGRlZmF1bHQgbWFwcGluZyB1c2VkIGJ5IEFMU0EuIFRoaXMgbWFwcGluZyBpcyBwcm9iYWJseQorICAgICAqIG5vdCB0b28gdXNlZnVsIHNpbmNlIEFMU0EncyBkZWZhdWx0IGNoYW5uZWwgbWFwcGluZyBkZXBlbmRzIG9uCisgICAgICogdGhlIGRldmljZSBzdHJpbmcgdXNlZC4gKi8KKy8qKiBcZW5kY29uZCAqLworCisgICAgUEFfQ0hBTk5FTF9NQVBfQVVYLAorICAgIC8qKjwgT25seSBhdXggY2hhbm5lbHMgKi8KKworICAgIFBBX0NIQU5ORUxfTUFQX1dBVkVFWCwKKyAgICAvKio8IE1pY3Jvc29mdCdzIFdBVkVGT1JNQVRFWFRFTlNJQkxFIG1hcHBpbmcuIFRoaXMgbWFwcGluZyB3b3JrcworICAgICAqIGFzIGlmIGFsbCBMU0JzIG9mIGR3Q2hhbm5lbE1hc2sgYXJlIHNldC4gICovCisKKy8qKiBcY29uZCBmdWxsZG9jcyAqLworICAgIFBBX0NIQU5ORUxfTUFQX09TUywKKyAgICAvKio8IFRoZSBkZWZhdWx0IGNoYW5uZWwgbWFwcGluZyB1c2VkIGJ5IE9TUyBhcyBkZWZpbmVkIGluIHRoZSBPU1MKKyAgICAgKiA0LjAgQVBJIHNwZWNzLiBUaGlzIG1hcHBpbmcgaXMgcHJvYmFibHkgbm90IHRvbyB1c2VmdWwgc2luY2UKKyAgICAgKiB0aGUgT1NTIEFQSSBoYXMgY2hhbmdlZCBpbiB0aGlzIHJlc3BlY3QgYW5kIG5vIGxvbmdlciBrbm93cyBhCisgICAgICogZGVmYXVsdCBjaGFubmVsIG1hcHBpbmcgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjaGFubmVscy4gKi8KKy8qKiBcZW5kY29uZCAqLworCisgICAgLyoqPCBVcHBlciBsaW1pdCBvZiB2YWxpZCBjaGFubmVsIG1hcHBpbmcgZGVmaW5pdGlvbnMgKi8KKyAgICBQQV9DSEFOTkVMX01BUF9ERUZfTUFYLAorCisgICAgUEFfQ0hBTk5FTF9NQVBfREVGQVVMVCA9IFBBX0NIQU5ORUxfTUFQX0FJRkYKKyAgICAvKio8IFRoZSBkZWZhdWx0IGNoYW5uZWwgbWFwICovCit9IHBhX2NoYW5uZWxfbWFwX2RlZl90OworCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyNkZWZpbmUgUEFfQ0hBTk5FTF9NQVBfQUlGRiBQQV9DSEFOTkVMX01BUF9BSUZGCisjZGVmaW5lIFBBX0NIQU5ORUxfTUFQX0FMU0EgUEFfQ0hBTk5FTF9NQVBfQUxTQQorI2RlZmluZSBQQV9DSEFOTkVMX01BUF9BVVggUEFfQ0hBTk5FTF9NQVBfQVVYCisjZGVmaW5lIFBBX0NIQU5ORUxfTUFQX1dBVkVFWCBQQV9DSEFOTkVMX01BUF9XQVZFRVgKKyNkZWZpbmUgUEFfQ0hBTk5FTF9NQVBfT1NTIFBBX0NIQU5ORUxfTUFQX09TUworI2RlZmluZSBQQV9DSEFOTkVMX01BUF9ERUZfTUFYIFBBX0NIQU5ORUxfTUFQX0RFRl9NQVgKKyNkZWZpbmUgUEFfQ0hBTk5FTF9NQVBfREVGQVVMVCBQQV9DSEFOTkVMX01BUF9ERUZBVUxUCisvKiogXGVuZGNvbmQgKi8KKworLyoqIEEgY2hhbm5lbCBtYXAgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYXR0YWNoIGxhYmVscyB0byBzcGVjaWZpYworICogY2hhbm5lbHMgb2YgYSBzdHJlYW0uIFRoZXNlIHZhbHVlcyBhcmUgcmVsZXZhbnQgZm9yIGNvbnZlcnNpb24gYW5kCisgKiBtaXhpbmcgb2Ygc3RyZWFtcyAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfY2hhbm5lbF9tYXAgeworICAgIHVpbnQ4X3QgY2hhbm5lbHM7CisgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKworICAgIHBhX2NoYW5uZWxfcG9zaXRpb25fdCBtYXBbUEFfQ0hBTk5FTFNfTUFYXTsKKyAgICAvKio8IENoYW5uZWwgbGFiZWxzICovCit9IHBhX2NoYW5uZWxfbWFwOworCisvKiogSW5pdGlhbGl6ZSB0aGUgc3BlY2lmaWVkIGNoYW5uZWwgbWFwIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvCisgKiBpdC4gVGhlIGNoYW5uZWwgbWFwIHdpbGwgaGF2ZSBhIGRlZmluZWQgc3RhdGUgYnV0CisgKiBwYV9jaGFubmVsX21hcF92YWxpZCgpIHdpbGwgZmFpbCBmb3IgaXQuICovCitwYV9jaGFubmVsX21hcCogcGFfY2hhbm5lbF9tYXBfaW5pdChwYV9jaGFubmVsX21hcCAqbSk7CisKKy8qKiBJbml0aWFsaXplIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCBtYXAgZm9yIG1vbmF1cmFsIGF1ZGlvIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0ICovCitwYV9jaGFubmVsX21hcCogcGFfY2hhbm5lbF9tYXBfaW5pdF9tb25vKHBhX2NoYW5uZWxfbWFwICptKTsKKworLyoqIEluaXRpYWxpemUgdGhlIHNwZWNpZmllZCBjaGFubmVsIG1hcCBmb3Igc3RlcmVvcGhvbmljIGF1ZGlvIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0ICovCitwYV9jaGFubmVsX21hcCogcGFfY2hhbm5lbF9tYXBfaW5pdF9zdGVyZW8ocGFfY2hhbm5lbF9tYXAgKm0pOworCisvKiogSW5pdGlhbGl6ZSB0aGUgc3BlY2lmaWVkIGNoYW5uZWwgbWFwIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZgorICogY2hhbm5lbHMgdXNpbmcgZGVmYXVsdCBsYWJlbHMgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuIFRoaXMgY2FsbAorICogd2lsbCBmYWlsIChyZXR1cm4gTlVMTCkgaWYgdGhlcmUgaXMgbm8gZGVmYXVsdCBjaGFubmVsIG1hcCBrbm93biBmb3IgdGhpcworICogc3BlY2lmaWMgbnVtYmVyIG9mIGNoYW5uZWxzIGFuZCBtYXBwaW5nLiAqLworcGFfY2hhbm5lbF9tYXAqIHBhX2NoYW5uZWxfbWFwX2luaXRfYXV0byhwYV9jaGFubmVsX21hcCAqbSwgdW5zaWduZWQgY2hhbm5lbHMsIHBhX2NoYW5uZWxfbWFwX2RlZl90IGRlZik7CisKKy8qKiBTaW1pbGFyIHRvIHBhX2NoYW5uZWxfbWFwX2luaXRfYXV0bygpIGJ1dCBpbnN0ZWFkIG9mIGZhaWxpbmcgaWYgbm8KKyAqIGRlZmF1bHQgbWFwcGluZyBpcyBrbm93biB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpdCB3aWxsCisgKiBzeW50aGVzaXplIGEgbWFwcGluZyBiYXNlZCBvbiBhIGtub3duIG1hcHBpbmcgd2l0aCBmZXdlciBjaGFubmVscworICogYW5kIGZpbGwgdXAgdGhlIHJlc3Qgd2l0aCBBVVgwLi4uQVVYMzEgY2hhbm5lbHMgIFxzaW5jZSAwLjkuMTEgKi8KK3BhX2NoYW5uZWxfbWFwKiBwYV9jaGFubmVsX21hcF9pbml0X2V4dGVuZChwYV9jaGFubmVsX21hcCAqbSwgdW5zaWduZWQgY2hhbm5lbHMsIHBhX2NoYW5uZWxfbWFwX2RlZl90IGRlZik7CisKKy8qKiBSZXR1cm4gYSB0ZXh0IGxhYmVsIGZvciB0aGUgc3BlY2lmaWVkIGNoYW5uZWwgcG9zaXRpb24gKi8KK2NvbnN0IGNoYXIqIHBhX2NoYW5uZWxfcG9zaXRpb25fdG9fc3RyaW5nKHBhX2NoYW5uZWxfcG9zaXRpb25fdCBwb3MpIFBBX0dDQ19QVVJFOworCisvKiogVGhlIGludmVyc2Ugb2YgcGFfY2hhbm5lbF9wb3NpdGlvbl90b19zdHJpbmcoKS4gXHNpbmNlIDAuOS4xNiAqLworcGFfY2hhbm5lbF9wb3NpdGlvbl90IHBhX2NoYW5uZWxfcG9zaXRpb25fZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqcykgUEFfR0NDX1BVUkU7CisKKy8qKiBSZXR1cm4gYSBodW1hbiByZWFkYWJsZSB0ZXh0IGxhYmVsIGZvciB0aGUgc3BlY2lmaWVkIGNoYW5uZWwgcG9zaXRpb24uIFxzaW5jZSAwLjkuNyAqLworY29uc3QgY2hhciogcGFfY2hhbm5lbF9wb3NpdGlvbl90b19wcmV0dHlfc3RyaW5nKHBhX2NoYW5uZWxfcG9zaXRpb25fdCBwb3MpOworCisvKiogVGhlIG1heGltdW0gbGVuZ3RoIG9mIHN0cmluZ3MgcmV0dXJuZWQgYnkKKyAqIHBhX2NoYW5uZWxfbWFwX3NucHJpbnQoKS4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHZhbHVlIGNhbiBjaGFuZ2UKKyAqIHdpdGggYW55IHJlbGVhc2Ugd2l0aG91dCB3YXJuaW5nIGFuZCB3aXRob3V0IGJlaW5nIGNvbnNpZGVyZWQgQVBJCisgKiBvciBBQkkgYnJlYWthZ2UuIFlvdSBzaG91bGQgbm90IHVzZSB0aGlzIGRlZmluaXRpb24gYW55d2hlcmUgd2hlcmUKKyAqIGl0IG1pZ2h0IGJlY29tZSBwYXJ0IG9mIGFuIEFCSS4gKi8KKyNkZWZpbmUgUEFfQ0hBTk5FTF9NQVBfU05QUklOVF9NQVggMzM2CisKKy8qKiBNYWtlIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nIGZyb20gdGhlIHNwZWNpZmllZCBjaGFubmVsIG1hcCAqLworY2hhciogcGFfY2hhbm5lbF9tYXBfc25wcmludChjaGFyICpzLCBzaXplX3QgbCwgY29uc3QgcGFfY2hhbm5lbF9tYXAgKm1hcCk7CisKKy8qKiBQYXJzZSBhIGNoYW5uZWwgcG9zaXRpb24gbGlzdCBvciB3ZWxsLWtub3duIG1hcHBpbmcgbmFtZSBpbnRvIGEKKyAqIGNoYW5uZWwgbWFwIHN0cnVjdHVyZS4gVGhpcyB0dXJucyB0aGUgb3V0cHV0IG9mCisgKiBwYV9jaGFubmVsX21hcF9zbnByaW50KCkgYW5kIHBhX2NoYW5uZWxfbWFwX3RvX25hbWUoKSBiYWNrIGludG8gYQorICogcGFfY2hhbm5lbF9tYXAgKi8KK3BhX2NoYW5uZWxfbWFwICpwYV9jaGFubmVsX21hcF9wYXJzZShwYV9jaGFubmVsX21hcCAqbWFwLCBjb25zdCBjaGFyICpzKTsKKworLyoqIENvbXBhcmUgdHdvIGNoYW5uZWwgbWFwcy4gUmV0dXJuIDEgaWYgYm90aCBtYXRjaC4gKi8KK2ludCBwYV9jaGFubmVsX21hcF9lcXVhbChjb25zdCBwYV9jaGFubmVsX21hcCAqYSwgY29uc3QgcGFfY2hhbm5lbF9tYXAgKmIpIFBBX0dDQ19QVVJFOworCisvKiogUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCBtYXAgaXMgY29uc2lkZXJlZCB2YWxpZCAqLworaW50IHBhX2NoYW5uZWxfbWFwX3ZhbGlkKGNvbnN0IHBhX2NoYW5uZWxfbWFwICptYXApIFBBX0dDQ19QVVJFOworCisvKiogUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCBtYXAgaXMgY29tcGF0aWJsZSB3aXRoCisgKiB0aGUgc3BlY2lmaWVkIHNhbXBsZSBzcGVjLiBcc2luY2UgMC45LjEyICovCitpbnQgcGFfY2hhbm5lbF9tYXBfY29tcGF0aWJsZShjb25zdCBwYV9jaGFubmVsX21hcCAqbWFwLCBjb25zdCBwYV9zYW1wbGVfc3BlYyAqc3MpIFBBX0dDQ19QVVJFOworCisvKiogUmV0dXJucyBub24temVybyBpZiBldmVyeSBjaGFubmVsIGRlZmluZWQgaW4gYiBpcyBhbHNvIGRlZmluZWQgaW4gYS4gXHNpbmNlIDAuOS4xNSAqLworaW50IHBhX2NoYW5uZWxfbWFwX3N1cGVyc2V0KGNvbnN0IHBhX2NoYW5uZWxfbWFwICphLCBjb25zdCBwYV9jaGFubmVsX21hcCAqYikgUEFfR0NDX1BVUkU7CisKKy8qKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGl0IG1ha2VzIHNlbnNlIHRvIGFwcGx5IGEgdm9sdW1lICdiYWxhbmNlJworICogd2l0aCB0aGlzIG1hcHBpbmcsIGkuZS4gaWYgdGhlcmUgYXJlIGxlZnQvcmlnaHQgY2hhbm5lbHMKKyAqIGF2YWlsYWJsZS4gXHNpbmNlIDAuOS4xNSAqLworaW50IHBhX2NoYW5uZWxfbWFwX2Nhbl9iYWxhbmNlKGNvbnN0IHBhX2NoYW5uZWxfbWFwICptYXApIFBBX0dDQ19QVVJFOworCisvKiogUmV0dXJucyBub24temVybyBpZiBpdCBtYWtlcyBzZW5zZSB0byBhcHBseSBhIHZvbHVtZSAnZmFkZScKKyAqIChpLmUuICdiYWxhbmNlJyBiZXR3ZWVuIGZyb250IGFuZCByZWFyKSB3aXRoIHRoaXMgbWFwcGluZywgaS5lLiBpZgorICogdGhlcmUgYXJlIGZyb250L3JlYXIgY2hhbm5lbHMgYXZhaWxhYmxlLiBcc2luY2UgMC45LjE1ICovCitpbnQgcGFfY2hhbm5lbF9tYXBfY2FuX2ZhZGUoY29uc3QgcGFfY2hhbm5lbF9tYXAgKm1hcCkgUEFfR0NDX1BVUkU7CisKKy8qKiBUcmllcyB0byBmaW5kIGEgd2VsbC1rbm93biBjaGFubmVsIG1hcHBpbmcgbmFtZSBmb3IgdGhpcyBjaGFubmVsCisgKiBtYXBwaW5nLiBJLmUuICJzdGVyZW8iLCAic3Vycm91bmQtNzEiIGFuZCBzbyBvbi4gSWYgdGhlIGNoYW5uZWwKKyAqIG1hcHBpbmcgaXMgdW5rbm93biBOVUxMIHdpbGwgYmUgcmV0dXJuZWQuIFRoaXMgbmFtZSBjYW4gYmUgcGFyc2VkCisgKiB3aXRoIHBhX2NoYW5uZWxfbWFwX3BhcnNlKCkgXHNpbmNlIDAuOS4xNSAqLworY29uc3QgY2hhciogcGFfY2hhbm5lbF9tYXBfdG9fbmFtZShjb25zdCBwYV9jaGFubmVsX21hcCAqbWFwKSBQQV9HQ0NfUFVSRTsKKworLyoqIFRyaWVzIHRvIGZpbmQgYSBodW1hbiByZWFkYWJsZSB0ZXh0IGxhYmVsIGZvciB0aGlzIGNoYW5uZWwKK21hcHBpbmcuIEkuZS4gIlN0ZXJlbyIsICJTdXJyb3VuZCA3LjEiIGFuZCBzbyBvbi4gSWYgdGhlIGNoYW5uZWwKK21hcHBpbmcgaXMgdW5rbm93biBOVUxMIHdpbGwgYmUgcmV0dXJuZWQuIFxzaW5jZSAwLjkuMTUgKi8KK2NvbnN0IGNoYXIqIHBhX2NoYW5uZWxfbWFwX3RvX3ByZXR0eV9uYW1lKGNvbnN0IHBhX2NoYW5uZWxfbWFwICptYXApIFBBX0dDQ19QVVJFOworCisvKiogUmV0dXJucyBUUlVFIGlmIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCBwb3NpdGlvbiBpcyBhdmFpbGFibGUgYXQKKyAqIGxlYXN0IG9uY2UgaW4gdGhlIGNoYW5uZWwgbWFwLiBcc2luY2UgMC45LjE2ICovCitpbnQgcGFfY2hhbm5lbF9tYXBfaGFzX3Bvc2l0aW9uKGNvbnN0IHBhX2NoYW5uZWxfbWFwICptYXAsIHBhX2NoYW5uZWxfcG9zaXRpb25fdCBwKSBQQV9HQ0NfUFVSRTsKKworLyoqIEdlbmVyYXRlcyBhIGJpdCBtYXNrIGZyb20gYSBjaGFubmVsIG1hcC4gXHNpbmNlIDAuOS4xNiAqLworcGFfY2hhbm5lbF9wb3NpdGlvbl9tYXNrX3QgcGFfY2hhbm5lbF9tYXBfbWFzayhjb25zdCBwYV9jaGFubmVsX21hcCAqbWFwKSBQQV9HQ0NfUFVSRTsKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvY29udGV4dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9jb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJkNDEzMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvY29udGV4dC5oCkBAIC0wLDAgKzEsMjg1IEBACisjaWZuZGVmIGZvb2NvbnRleHRoZm9vCisjZGVmaW5lIGZvb2NvbnRleHRoZm9vCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwNiBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8cHVsc2Uvc2FtcGxlLmg+CisjaW5jbHVkZSA8cHVsc2UvZGVmLmg+CisjaW5jbHVkZSA8cHVsc2UvbWFpbmxvb3AtYXBpLmg+CisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKyNpbmNsdWRlIDxwdWxzZS9vcGVyYXRpb24uaD4KKyNpbmNsdWRlIDxwdWxzZS9wcm9wbGlzdC5oPgorI2luY2x1ZGUgPHB1bHNlL3ZlcnNpb24uaD4KKworLyoqIFxwYWdlIGFzeW5jIEFzeW5jaHJvbm91cyBBUEkKKyAqCisgKiBcc2VjdGlvbiBvdmVydl9zZWMgT3ZlcnZpZXcKKyAqCisgKiBUaGUgYXN5bmNocm9ub3VzIEFQSSBpcyB0aGUgbmF0aXZlIGludGVyZmFjZSB0byB0aGUgUHVsc2VBdWRpbyBsaWJyYXJ5LgorICogSXQgYWxsb3dzIGZ1bGwgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgZnVuY3Rpb25hbGl0eS4gVGhpcyBob3dldmVyIG1lYW5zIHRoYXQKKyAqIGl0IGlzIHJhdGhlciBjb21wbGV4IGFuZCBjYW4gdGFrZSBzb21lIHRpbWUgdG8gZnVsbHkgbWFzdGVyLgorICoKKyAqIFxzZWN0aW9uIG1haW5sb29wX3NlYyBNYWluIExvb3AgQWJzdHJhY3Rpb24KKyAqCisgKiBUaGUgQVBJIGlzIGJhc2VkIGFyb3VuZCBhbiBhc3luY2hyb25vdXMgZXZlbnQgbG9vcCwgb3IgbWFpbiBsb29wLAorICogYWJzdHJhY3Rpb24uIFRoaXMgYWJzdHJhY3Rpb24gY29udGFpbnMgdGhyZWUgYmFzaWMgZWxlbWVudHM6CisgKgorICogXGxpIERlZmVycmVkIGV2ZW50cyAtIEV2ZW50cyB0aGF0IHdpbGwgdHJpZ2dlciBhcyBzb29uIGFzIHBvc3NpYmxlLiBOb3RlCisgKiAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBzb21lIGltcGxlbWVudGF0aW9ucyBtYXkgYmxvY2sgYWxsIG90aGVyIGV2ZW50cworICogICAgICAgICAgICAgICAgICAgICAgIHdoZW4gYSBkZWZlcnJlZCBldmVudCBpcyBhY3RpdmUuCisgKiBcbGkgSS9PIGV2ZW50cyAtIEV2ZW50cyB0aGF0IHRyaWdnZXIgb24gZmlsZSBkZXNjcmlwdG9yIGFjdGl2aXRpZXMuCisgKiBcbGkgVGltZXMgZXZlbnRzIC0gRXZlbnRzIHRoYXQgdHJpZ2dlciBhZnRlciBhIGZpeGVkIGFtb3VudCBvZiB0aW1lLgorICoKKyAqIFRoZSBhYnN0cmFjdGlvbiBpcyByZXByZXNlbnRlZCBhcyBhIG51bWJlciBvZiBmdW5jdGlvbiBwb2ludGVycyBpbiB0aGUKKyAqIHBhX21haW5sb29wX2FwaSBzdHJ1Y3R1cmUuCisgKgorICogVG8gYWN0dWFsbHkgYmUgYWJsZSB0byB1c2UgdGhlc2UgZnVuY3Rpb25zLCBhbiBpbXBsZW1lbnRhdGlvbiBuZWVkcyB0bworICogYmUgY291cGxlZCB0byB0aGUgYWJzdHJhY3Rpb24uIFRoZXJlIGFyZSB0aHJlZSBvZiB0aGVzZSBzaGlwcGVkIHdpdGgKKyAqIFB1bHNlQXVkaW8sIGJ1dCBhbnkgb3RoZXIgY2FuIGJlIHVzZWQgd2l0aCBhIG1pbmltYWwgYW1vdW50IG9mIHdvcmssCisgKiBwcm92aWRlZCBpdCBzdXBwb3J0cyB0aGUgdGhyZWUgYmFzaWMgZXZlbnRzIGxpc3RlZCBhYm92ZS4KKyAqCisgKiBUaGUgaW1wbGVtZW50YXRpb25zIHNoaXBwZWQgd2l0aCBQdWxzZUF1ZGlvIGFyZToKKyAqCisgKiBcbGkgXHN1YnBhZ2UgbWFpbmxvb3AgLSBBIG1pbmltYWwgYnV0IGZhc3QgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gcG9sbCgpLgorICogXGxpIFxzdWJwYWdlIHRocmVhZGVkX21haW5sb29wIC0gQSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIHByZXZpb3VzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiB3aGVyZSBhbGwgb2YgUHVsc2VBdWRpbydzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCBoYW5kbGluZyBydW5zIGluIGEgc2VwYXJhdGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC4KKyAqIFxsaSBcc3VicGFnZSBnbGliLW1haW5sb29wIC0gQSB3cmFwcGVyIGFyb3VuZCBHTGliJ3MgbWFpbiBsb29wLgorICoKKyAqIFVOSVggc2lnbmFscyBtYXkgYmUgaG9va2VkIHRvIGEgbWFpbiBsb29wIHVzaW5nIHRoZSBmdW5jdGlvbnMgZnJvbQorICogXHJlZiBtYWlubG9vcC1zaWduYWwuaC4gVGhlc2UgcmVseSBvbmx5IG9uIHRoZSBtYWluIGxvb3AgYWJzdHJhY3Rpb24KKyAqIGFuZCBjYW4gdGhlcmVmb3JlIGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiBcc2VjdGlvbiByZWZjbnRfc2VjIFJlZmVyZW5jZSBDb3VudGluZworICoKKyAqIEFsbW9zdCBhbGwgb2JqZWN0cyBpbiBQdWxzZUF1ZGlvIGFyZSByZWZlcmVuY2UgY291bnRlZC4gV2hhdCB0aGF0IG1lYW5zCisgKiBpcyB0aGF0IHlvdSByYXJlbHkgbWFsbG9jKCkgb3IgZnJlZSgpIGFueSBvYmplY3RzLiBJbnN0ZWFkIHlvdSBpbmNyZWFzZQorICogYW5kIGRlY3JlYXNlIHRoZWlyIHJlZmVyZW5jZSBjb3VudHMuIFdoZW5ldmVyIGFuIG9iamVjdCdzIHJlZmVyZW5jZQorICogY291bnQgcmVhY2hlcyB6ZXJvLCB0aGF0IG9iamVjdCBnZXRzIGRlc3Ryb3kgYW5kIGFueSByZXNvdXJjZXMgaXQgdXNlcworICogZ2V0IGZyZWVkLgorICoKKyAqIFRoZSBiZW5lZml0IG9mIHRoaXMgZGVzaWduIGlzIHRoYXQgYW4gYXBwbGljYXRpb24gbmVlZCBub3Qgd29ycnkgYWJvdXQKKyAqIHdoZXRoZXIgb3Igbm90IGl0IG5lZWRzIHRvIGtlZXAgYW4gb2JqZWN0IGFyb3VuZCBpbiBjYXNlIHRoZSBsaWJyYXJ5IGlzCisgKiB1c2luZyBpdCBpbnRlcm5hbGx5LiBJZiBpdCBpcywgdGhlbiBpdCBoYXMgbWFkZSBzdXJlIGl0IGhhcyBpdHMgb3duCisgKiByZWZlcmVuY2UgdG8gaXQuCisgKgorICogV2hlbmV2ZXIgdGhlIGxpYnJhcnkgY3JlYXRlcyBhbiBvYmplY3QsIGl0IHdpbGwgaGF2ZSBhbiBpbml0aWFsCisgKiByZWZlcmVuY2UgY291bnQgb2Ygb25lLiBNb3N0IG9mIHRoZSB0aW1lLCB0aGlzIHNpbmdsZSByZWZlcmVuY2Ugd2lsbCBiZQorICogc3VmZmljaWVudCBmb3IgdGhlIGFwcGxpY2F0aW9uLCBzbyBhbGwgcmVxdWlyZWQgcmVmZXJlbmNlIGNvdW50CisgKiBpbnRlcmFjdGlvbiB3aWxsIGJlIGEgc2luZ2xlIGNhbGwgdG8gdGhlIG9iamVjdHMgdW5yZWYgZnVuY3Rpb24uCisgKgorICogXHNlY3Rpb24gY29udGV4dF9zZWMgQ29udGV4dAorICoKKyAqIEEgY29udGV4dCBpcyB0aGUgYmFzaWMgb2JqZWN0IGZvciBhIGNvbm5lY3Rpb24gdG8gYSBQdWxzZUF1ZGlvIHNlcnZlci4KKyAqIEl0IG11bHRpcGxleGVzIGNvbW1hbmRzLCBkYXRhIHN0cmVhbXMgYW5kIGV2ZW50cyB0aHJvdWdoIGEgc2luZ2xlCisgKiBjaGFubmVsLgorICoKKyAqIFRoZXJlIGlzIG5vIG5lZWQgZm9yIG1vcmUgdGhhbiBvbmUgY29udGV4dCBwZXIgYXBwbGljYXRpb24sIHVubGVzcworICogY29ubmVjdGlvbnMgdG8gbXVsdGlwbGUgc2VydmVycyBhcmUgbmVlZGVkLgorICoKKyAqIFxzdWJzZWN0aW9uIG9wc19zdWJzZWMgT3BlcmF0aW9ucworICoKKyAqIEFsbCBvcGVyYXRpb25zIG9uIHRoZSBjb250ZXh0IGFyZSBwZXJmb3JtZWQgYXN5bmNocm9ub3VzbHkuIEkuZS4gdGhlCisgKiBjbGllbnQgd2lsbCBub3Qgd2FpdCBmb3IgdGhlIHNlcnZlciB0byBjb21wbGV0ZSB0aGUgcmVxdWVzdC4gVG8ga2VlcAorICogdHJhY2sgb2YgYWxsIHRoZXNlIGluLWZsaWdodCBvcGVyYXRpb25zLCB0aGUgYXBwbGljYXRpb24gaXMgZ2l2ZW4gYQorICogcGFfb3BlcmF0aW9uIG9iamVjdCBmb3IgZWFjaCBhc3luY2hyb25vdXMgb3BlcmF0aW9uLgorICoKKyAqIFRoZXJlIGFyZSBvbmx5IHR3byBhY3Rpb25zIChiZXNpZGVzIHJlZmVyZW5jZSBjb3VudGluZykgdGhhdCBjYW4gYmUKKyAqIHBlcmZvcm1lZCBvbiBhIHBhX29wZXJhdGlvbjogcXVlcnlpbmcgaXRzIHN0YXRlIHdpdGgKKyAqIHBhX29wZXJhdGlvbl9nZXRfc3RhdGUoKSBhbmQgYWJvcnRpbmcgaXQgd2l0aCBwYV9vcGVyYXRpb25fY2FuY2VsKCkuCisgKgorICogQSBwYV9vcGVyYXRpb24gb2JqZWN0IGlzIHJlZmVyZW5jZSBjb3VudGVkLCBzbyBhbiBhcHBsaWNhdGlvbiBtdXN0CisgKiBtYWtlIHN1cmUgdG8gdW5yZWZlcmVuY2UgaXQsIGV2ZW4gaWYgaXQgaGFzIG5vIGludGVudGlvbiBvZiB1c2luZyBpdC4KKyAqCisgKiBcc3Vic2VjdGlvbiBjb25uX3N1YnNlYyBDb25uZWN0aW5nCisgKgorICogQSBjb250ZXh0IG11c3QgYmUgY29ubmVjdGVkIHRvIGEgc2VydmVyIGJlZm9yZSBhbnkgb3BlcmF0aW9uIGNhbiBiZQorICogaXNzdWVkLiBDYWxsaW5nIHBhX2NvbnRleHRfY29ubmVjdCgpIHdpbGwgaW5pdGlhdGUgdGhlIGNvbm5lY3Rpb24KKyAqIHByb2NlZHVyZS4gVW5saWtlIG1vc3QgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMsIGNvbm5lY3RpbmcgZG9lcyBub3QKKyAqIHJlc3VsdCBpbiBhIHBhX29wZXJhdGlvbiBvYmplY3QuIEluc3RlYWQsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQKKyAqIHJlZ2lzdGVyIGEgY2FsbGJhY2sgdXNpbmcgcGFfY29udGV4dF9zZXRfc3RhdGVfY2FsbGJhY2soKS4KKyAqCisgKiBcc3Vic2VjdGlvbiBkaXNjX3N1YnNlYyBEaXNjb25uZWN0aW5nCisgKgorICogV2hlbiB0aGUgc291bmQgc3VwcG9ydCBpcyBubyBsb25nZXIgbmVlZGVkLCB0aGUgY29ubmVjdGlvbiBuZWVkcyB0byBiZQorICogY2xvc2VkIHVzaW5nIHBhX2NvbnRleHRfZGlzY29ubmVjdCgpLiBUaGlzIGlzIGFuIGltbWVkaWF0ZSBmdW5jdGlvbiB0aGF0CisgKiB3b3JrcyBzeW5jaHJvbm91c2x5LgorICoKKyAqIFNpbmNlIHRoZSBjb250ZXh0IG9iamVjdCBoYXMgcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzIGl0IG11c3QgYmUKKyAqIGRpc2Nvbm5lY3RlZCBhZnRlciB1c2Ugb3IgdGhlcmUgaXMgYSBoaWdoIHJpc2sgb2YgbWVtb3J5IGxlYWtzLiBJZiB0aGUKKyAqIGNvbm5lY3Rpb24gaGFzIHRlcm1pbmF0ZWQgYnkgaXRzZWxmLCB0aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8gZXhwbGljaXRseQorICogZGlzY29ubmVjdCB0aGUgY29udGV4dCB1c2luZyBwYV9jb250ZXh0X2Rpc2Nvbm5lY3QoKS4KKyAqCisgKiBcc2VjdGlvbiBGdW5jdGlvbnMKKyAqCisgKiBUaGUgc291bmQgc2VydmVyJ3MgZnVuY3Rpb25hbGl0eSBjYW4gYmUgZGl2aWRlZCBpbnRvIGEgbnVtYmVyIG9mCisgKiBzdWJzZWN0aW9uczoKKyAqCisgKiBcbGkgXHN1YnBhZ2Ugc3RyZWFtcworICogXGxpIFxzdWJwYWdlIHNjYWNoZQorICogXGxpIFxzdWJwYWdlIGludHJvc3BlY3QKKyAqIFxsaSBcc3VicGFnZSBzdWJzY3JpYmUKKyAqLworCisvKiogXGZpbGUKKyAqIENvbm5lY3Rpb24gY29udGV4dHMgZm9yIGFzeW5jaHJvbm91cyBjb21tdW5pY2F0aW9uIHdpdGggYQorICogc2VydmVyLiBBIHBhX2NvbnRleHQgb2JqZWN0IHdyYXBzIGEgY29ubmVjdGlvbiB0byBhIFB1bHNlQXVkaW8KKyAqIHNlcnZlciB1c2luZyBpdHMgbmF0aXZlIHByb3RvY29sLgorICoKKyAqIFNlZSBhbHNvIFxzdWJwYWdlIGFzeW5jCisgKi8KKworUEFfQ19ERUNMX0JFR0lOCisKKy8qKiBBbiBvcGFxdWUgY29ubmVjdGlvbiBjb250ZXh0IHRvIGEgZGFlbW9uICovCit0eXBlZGVmIHN0cnVjdCBwYV9jb250ZXh0IHBhX2NvbnRleHQ7CisKKy8qKiBHZW5lcmljIG5vdGlmaWNhdGlvbiBjYWxsYmFjayBwcm90b3R5cGUgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2NvbnRleHRfbm90aWZ5X2NiX3QpKHBhX2NvbnRleHQgKmMsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEEgZ2VuZXJpYyBjYWxsYmFjayBmb3Igb3BlcmF0aW9uIGNvbXBsZXRpb24gKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2NvbnRleHRfc3VjY2Vzc19jYl90KSAocGFfY29udGV4dCAqYywgaW50IHN1Y2Nlc3MsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEEgY2FsbGJhY2sgZm9yIGFzeW5jaHJvbm91cyBtZXRhL3BvbGljeSBldmVudCBtZXNzYWdlcy4gVGhlIHNldAorICogb2YgZGVmaW5lZCBldmVudHMgY2FuIGJlIGV4dGVuZGVkIGF0IGFueSB0aW1lLiBBbHNvLCBzZXJ2ZXIgbW9kdWxlcworICogbWF5IGludHJvZHVjZSBhZGRpdGlvbmFsIG1lc3NhZ2UgdHlwZXMgc28gbWFrZSBzdXJlIHRoYXQgeW91cgorICogY2FsbGJhY2sgZnVuY3Rpb24gaWdub3JlcyBtZXNzYWdlcyBpdCBkb2Vzbid0IGtub3cuIFxzaW5jZQorICogMC45LjE1ICovCit0eXBlZGVmIHZvaWQgKCpwYV9jb250ZXh0X2V2ZW50X2NiX3QpKHBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIgKm5hbWUsIHBhX3Byb3BsaXN0ICpwLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBJbnN0YW50aWF0ZSBhIG5ldyBjb25uZWN0aW9uIGNvbnRleHQgd2l0aCBhbiBhYnN0cmFjdCBtYWlubG9vcCBBUEkKKyAqIGFuZCBhbiBhcHBsaWNhdGlvbiBuYW1lLiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgcGFfY29udGV4dF9uZXdfd2l0aF9wcm9wbGlzdCgpCisgKiBpbnN0ZWFkIGFuZCBzcGVjaWZ5IHNvbWUgaW5pdGlhbCBwcm9wZXJ0aWVzLiovCitwYV9jb250ZXh0ICpwYV9jb250ZXh0X25ldyhwYV9tYWlubG9vcF9hcGkgKm1haW5sb29wLCBjb25zdCBjaGFyICpuYW1lKTsKKworLyoqIEluc3RhbnRpYXRlIGEgbmV3IGNvbm5lY3Rpb24gY29udGV4dCB3aXRoIGFuIGFic3RyYWN0IG1haW5sb29wIEFQSQorICogYW5kIGFuIGFwcGxpY2F0aW9uIG5hbWUsIGFuZCBzcGVjaWZ5IHRoZSB0aGUgaW5pdGlhbCBjbGllbnQgcHJvcGVydHkKKyAqIGxpc3QuIFxzaW5jZSAwLjkuMTEgKi8KK3BhX2NvbnRleHQgKnBhX2NvbnRleHRfbmV3X3dpdGhfcHJvcGxpc3QocGFfbWFpbmxvb3BfYXBpICptYWlubG9vcCwgY29uc3QgY2hhciAqbmFtZSwgcGFfcHJvcGxpc3QgKnByb3BsaXN0KTsKKworLyoqIERlY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnRlciBvZiB0aGUgY29udGV4dCBieSBvbmUgKi8KK3ZvaWQgcGFfY29udGV4dF91bnJlZihwYV9jb250ZXh0ICpjKTsKKworLyoqIEluY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnRlciBvZiB0aGUgY29udGV4dCBieSBvbmUgKi8KK3BhX2NvbnRleHQqIHBhX2NvbnRleHRfcmVmKHBhX2NvbnRleHQgKmMpOworCisvKiogU2V0IGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGNvbnRleHQgc3RhdHVzIGNoYW5nZXMgKi8KK3ZvaWQgcGFfY29udGV4dF9zZXRfc3RhdGVfY2FsbGJhY2socGFfY29udGV4dCAqYywgcGFfY29udGV4dF9ub3RpZnlfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBtZXRhL3BvbGljeQorICogY29udHJvbCBldmVudCBpcyByZWNlaXZlZC4gXHNpbmNlIDAuOS4xNSAqLwordm9pZCBwYV9jb250ZXh0X3NldF9ldmVudF9jYWxsYmFjayhwYV9jb250ZXh0ICpwLCBwYV9jb250ZXh0X2V2ZW50X2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFJldHVybiB0aGUgZXJyb3IgbnVtYmVyIG9mIHRoZSBsYXN0IGZhaWxlZCBvcGVyYXRpb24gKi8KK2ludCBwYV9jb250ZXh0X2Vycm5vKHBhX2NvbnRleHQgKmMpOworCisvKiogUmV0dXJuIG5vbi16ZXJvIGlmIHNvbWUgZGF0YSBpcyBwZW5kaW5nIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGNvbm5lY3Rpb24gKi8KK2ludCBwYV9jb250ZXh0X2lzX3BlbmRpbmcocGFfY29udGV4dCAqYyk7CisKKy8qKiBSZXR1cm4gdGhlIGN1cnJlbnQgY29udGV4dCBzdGF0dXMgKi8KK3BhX2NvbnRleHRfc3RhdGVfdCBwYV9jb250ZXh0X2dldF9zdGF0ZShwYV9jb250ZXh0ICpjKTsKKworLyoqIENvbm5lY3QgdGhlIGNvbnRleHQgdG8gdGhlIHNwZWNpZmllZCBzZXJ2ZXIuIElmIHNlcnZlciBpcyBOVUxMLAorY29ubmVjdCB0byB0aGUgZGVmYXVsdCBzZXJ2ZXIuIFRoaXMgcm91dGluZSBtYXkgYnV0IHdpbGwgbm90IGFsd2F5cworcmV0dXJuIHN5bmNocm9ub3VzbHkgb24gZXJyb3IuIFVzZSBwYV9jb250ZXh0X3NldF9zdGF0ZV9jYWxsYmFjaygpIHRvCitiZSBub3RpZmllZCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLiBJZiBmbGFncyBkb2Vzbid0IGhhdmUKK1BBX0NPTlRFWFRfTk9BVVRPU1BBV04gc2V0IGFuZCBubyBzcGVjaWZpYyBzZXJ2ZXIgaXMgc3BlY2lmaWVkIG9yCithY2Nlc3NpYmxlIGEgbmV3IGRhZW1vbiBpcyBzcGF3bmVkLiBJZiBhcGkgaXMgbm9uLU5VTEwsIHRoZSBmdW5jdGlvbnMKK3NwZWNpZmllZCBpbiB0aGUgc3RydWN0dXJlIGFyZSB1c2VkIHdoZW4gZm9ya2luZyBhIG5ldyBjaGlsZAorcHJvY2Vzcy4gKi8KK2ludCBwYV9jb250ZXh0X2Nvbm5lY3QocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqc2VydmVyLCBwYV9jb250ZXh0X2ZsYWdzX3QgZmxhZ3MsIGNvbnN0IHBhX3NwYXduX2FwaSAqYXBpKTsKKworLyoqIFRlcm1pbmF0ZSB0aGUgY29udGV4dCBjb25uZWN0aW9uIGltbWVkaWF0ZWx5ICovCit2b2lkIHBhX2NvbnRleHRfZGlzY29ubmVjdChwYV9jb250ZXh0ICpjKTsKKworLyoqIERyYWluIHRoZSBjb250ZXh0LiBJZiB0aGVyZSBpcyBub3RoaW5nIHRvIGRyYWluLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBOVUxMICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZHJhaW4ocGFfY29udGV4dCAqYywgcGFfY29udGV4dF9ub3RpZnlfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogVGVsbCB0aGUgZGFlbW9uIHRvIGV4aXQuIFRoZSByZXR1cm5lZCBvcGVyYXRpb24gaXMgdW5saWtlbHkgdG8KKyAqIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseSwgc2luY2UgdGhlIGRhZW1vbiBwcm9iYWJseSBkaWVkIGJlZm9yZQorICogcmV0dXJuaW5nIGEgc3VjY2VzcyBub3RpZmljYXRpb24gKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9leGl0X2RhZW1vbihwYV9jb250ZXh0ICpjLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IHNpbmsuICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc2V0X2RlZmF1bHRfc2luayhwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpuYW1lLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IHNvdXJjZS4gKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zZXRfZGVmYXVsdF9zb3VyY2UocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqbmFtZSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFJldHVybnMgMSB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIHRvIGEgbG9jYWwgZGFlbW9uLiBSZXR1cm5zIG5lZ2F0aXZlIHdoZW4gbm8gY29ubmVjdGlvbiBoYXMgYmVlbiBtYWRlIHlldC4gKi8KK2ludCBwYV9jb250ZXh0X2lzX2xvY2FsKHBhX2NvbnRleHQgKmMpOworCisvKiogU2V0IGEgZGlmZmVyZW50IGFwcGxpY2F0aW9uIG5hbWUgZm9yIGNvbnRleHQgb24gdGhlIHNlcnZlci4gKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zZXRfbmFtZShwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpuYW1lLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogUmV0dXJuIHRoZSBzZXJ2ZXIgbmFtZSB0aGlzIGNvbnRleHQgaXMgY29ubmVjdGVkIHRvLiAqLworY29uc3QgY2hhciogcGFfY29udGV4dF9nZXRfc2VydmVyKHBhX2NvbnRleHQgKmMpOworCisvKiogUmV0dXJuIHRoZSBwcm90b2NvbCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiAqLwordWludDMyX3QgcGFfY29udGV4dF9nZXRfcHJvdG9jb2xfdmVyc2lvbihwYV9jb250ZXh0ICpjKTsKKworLyoqIFJldHVybiB0aGUgcHJvdG9jb2wgdmVyc2lvbiBvZiB0aGUgY29ubmVjdGVkIHNlcnZlci4gKi8KK3VpbnQzMl90IHBhX2NvbnRleHRfZ2V0X3NlcnZlcl9wcm90b2NvbF92ZXJzaW9uKHBhX2NvbnRleHQgKmMpOworCisvKiogVXBkYXRlIHRoZSBwcm9wZXJ0eSBsaXN0IG9mIHRoZSBjbGllbnQsIGFkZGluZyBuZXcgZW50cmllcy4gUGxlYXNlCisgKiBub3RlIHRoYXQgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHNldCBhcyBtdWNoIHByb3BlcnRpZXMKKyAqIGluaXRpYWxseSB2aWEgcGFfY29udGV4dF9uZXdfd2l0aF9wcm9wbGlzdCgpIGFzIHBvc3NpYmxlIGluc3RlYWQgYQorICogcG9zdGVyaW9yaSB3aXRoIHRoaXMgZnVuY3Rpb24sIHNpbmNlIHRoYXQgaW5mb3JtYXRpb24gbWF5IHRoZW4gYmUKKyAqIHVzZWQgdG8gcm91dGUgc3RyZWFtcyBvZiB0aGUgY2xpZW50IHRvIHRoZSByaWdodCBkZXZpY2UuIFxzaW5jZSAwLjkuMTEgKi8KK3BhX29wZXJhdGlvbiAqcGFfY29udGV4dF9wcm9wbGlzdF91cGRhdGUocGFfY29udGV4dCAqYywgcGFfdXBkYXRlX21vZGVfdCBtb2RlLCBwYV9wcm9wbGlzdCAqcCwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFVwZGF0ZSB0aGUgcHJvcGVydHkgbGlzdCBvZiB0aGUgY2xpZW50LCByZW1vdmUgZW50cmllcy4gXHNpbmNlIDAuOS4xMSAqLworcGFfb3BlcmF0aW9uICpwYV9jb250ZXh0X3Byb3BsaXN0X3JlbW92ZShwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpjb25zdCBrZXlzW10sIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBSZXR1cm4gdGhlIGNsaWVudCBpbmRleCB0aGlzIGNvbnRleHQgaXMKKyAqIGlkZW50aWZpZWQgaW4gdGhlIHNlcnZlciB3aXRoLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdXNhZ2Ugd2l0aCB0aGUKKyAqIGludHJvc3BlY3Rpb24gZnVuY3Rpb25zLCBzdWNoIGFzIHBhX2NvbnRleHRfZ2V0X2NsaWVudF9pbmZvKCkuIFxzaW5jZSAwLjkuMTEgKi8KK3VpbnQzMl90IHBhX2NvbnRleHRfZ2V0X2luZGV4KHBhX2NvbnRleHQgKnMpOworCisvKiogQ3JlYXRlIGEgbmV3IHRpbWVyIGV2ZW50IHNvdXJjZSBmb3IgdGhlIHNwZWNpZmllZCB0aW1lICh3cmFwcGVyCisgKiBmb3IgbWFpbmxvb3AtPnRpbWVfbmV3KS4gXHNpbmNlIDAuOS4xNiAqLworcGFfdGltZV9ldmVudCogcGFfY29udGV4dF9ydHRpbWVfbmV3KHBhX2NvbnRleHQgKmMsIHBhX3VzZWNfdCB1c2VjLCBwYV90aW1lX2V2ZW50X2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFJlc3RhcnQgYSBydW5uaW5nIG9yIGV4cGlyZWQgdGltZXIgZXZlbnQgc291cmNlICh3cmFwcGVyIGZvcgorICogbWFpbmxvb3AtPnRpbWVfcmVzdGFydCkuIFxzaW5jZSAwLjkuMTYgKi8KK3ZvaWQgcGFfY29udGV4dF9ydHRpbWVfcmVzdGFydChwYV9jb250ZXh0ICpjLCBwYV90aW1lX2V2ZW50ICplLCBwYV91c2VjX3QgdXNlYyk7CisKKy8qKiBSZXR1cm4gdGhlIG9wdGltYWwgYmxvY2sgc2l6ZSBmb3IgcGFzc2luZyBhcm91bmQgYXVkaW8gYnVmZmVycy4gSXQKKyAqIGlzIHJlY29tbWVuZGVkIHRvIGFsbG9jYXRlIGJ1ZmZlcnMgb2YgdGhlIHNpemUgcmV0dXJuZWQgaGVyZSB3aGVuCisgKiB3cml0aW5nIGF1ZGlvIGRhdGEgdG8gcGxheWJhY2sgc3RyZWFtcywgaWYgdGhlIGxhdGVuY3kgY29uc3RyYWludHMKKyAqIHBlcm1pdCB0aGlzLiBJdCBpcyBub3QgcmVjb21tZW5kZWQgd3JpdGluZyBsYXJnZXIgYmxvY2tzIHRoYW4gdGhpcworICogYmVjYXVzZSB1c3VhbGx5IHRoZXkgd2lsbCB0aGVuIGJlIHNwbGl0IHVwIGludGVybmFsbHkgaW50byBjaHVua3MKKyAqIG9mIHRoaXMgc2l6ZS4gSXQgaXMgbm90IHJlY29tbWVuZGVkIHdyaXRpbmcgc21hbGxlciBibG9ja3MgdGhhbgorICogdGhpcyAodW5sZXNzIHJlcXVpcmVkIGR1ZSB0byBsYXRlbmN5IGRlbWFuZHMpIGJlY2F1c2UgdGhpcworICogaW5jcmVhc2VzIENQVSB1c2FnZS4gSWYgc3MgaXMgTlVMTCB5b3Ugd2lsbCBiZSByZXR1cm5lZCB0aGUKKyAqIGJ5dGUtZXhhY3QgdGlsZSBzaXplLiBJZiB5b3UgcGFzcyBhIHZhbGlkIHNzLCB0aGVuIHRoZSB0aWxlIHNpemUKKyAqIHdpbGwgYmUgcm91bmRlZCBkb3duIHRvIG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplLiBUaGlzIGlzCisgKiBzdXBwb3NlZCB0byBiZSB1c2VkIGluIGEgY29uc3RydWN0IHN1Y2ggYXMKKyAqIHBhX2NvbnRleHRfZ2V0X3RpbGVfc2l6ZShwYV9zdHJlYW1fZ2V0X2NvbnRleHQocyksCisgKiBwYV9zdHJlYW1fZ2V0X3NhbXBsZV9zcGVjKHNzKSk7IFxzaW5jZSAwLjkuMjAgKi8KK3NpemVfdCBwYV9jb250ZXh0X2dldF90aWxlX3NpemUocGFfY29udGV4dCAqYywgY29uc3QgcGFfc2FtcGxlX3NwZWMgKnNzKTsKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZGVmLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2RlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OTAwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2RlZi5oCkBAIC0wLDAgKzEsMTAwMSBAQAorI2lmbmRlZiBmb29kZWZoZm9vCisjZGVmaW5lIGZvb2RlZmhmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUKKyAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgIExpY2Vuc2UgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKyNpbmNsdWRlIDxwdWxzZS9zYW1wbGUuaD4KKyNpbmNsdWRlIDxwdWxzZS92ZXJzaW9uLmg+CisKKy8qKiBcZmlsZQorICogR2xvYmFsIGRlZmluaXRpb25zICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogVGhlIHN0YXRlIG9mIGEgY29ubmVjdGlvbiBjb250ZXh0ICovCit0eXBlZGVmIGVudW0gcGFfY29udGV4dF9zdGF0ZSB7CisgICAgUEFfQ09OVEVYVF9VTkNPTk5FQ1RFRCwgICAgLyoqPCBUaGUgY29udGV4dCBoYXNuJ3QgYmVlbiBjb25uZWN0ZWQgeWV0ICovCisgICAgUEFfQ09OVEVYVF9DT05ORUNUSU5HLCAgICAgLyoqPCBBIGNvbm5lY3Rpb24gaXMgYmVpbmcgZXN0YWJsaXNoZWQgKi8KKyAgICBQQV9DT05URVhUX0FVVEhPUklaSU5HLCAgICAvKio8IFRoZSBjbGllbnQgaXMgYXV0aG9yaXppbmcgaXRzZWxmIHRvIHRoZSBkYWVtb24gKi8KKyAgICBQQV9DT05URVhUX1NFVFRJTkdfTkFNRSwgICAvKio8IFRoZSBjbGllbnQgaXMgcGFzc2luZyBpdHMgYXBwbGljYXRpb24gbmFtZSB0byB0aGUgZGFlbW9uICovCisgICAgUEFfQ09OVEVYVF9SRUFEWSwgICAgICAgICAgLyoqPCBUaGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgdGhlIGNvbnRleHQgaXMgcmVhZHkgdG8gZXhlY3V0ZSBvcGVyYXRpb25zICovCisgICAgUEFfQ09OVEVYVF9GQUlMRUQsICAgICAgICAgLyoqPCBUaGUgY29ubmVjdGlvbiBmYWlsZWQgb3Igd2FzIGRpc2Nvbm5lY3RlZCAqLworICAgIFBBX0NPTlRFWFRfVEVSTUlOQVRFRCAgICAgIC8qKjwgVGhlIGNvbm5lY3Rpb24gd2FzIHRlcm1pbmF0ZWQgY2xlYW5seSAqLworfSBwYV9jb250ZXh0X3N0YXRlX3Q7CisKKy8qKiBSZXR1cm4gbm9uLXplcm8gaWYgdGhlIHBhc3NlZCBzdGF0ZSBpcyBvbmUgb2YgdGhlIGNvbm5lY3RlZCBzdGF0ZXMuIFxzaW5jZSAwLjkuMTEgKi8KK3N0YXRpYyBpbmxpbmUgaW50IFBBX0NPTlRFWFRfSVNfR09PRChwYV9jb250ZXh0X3N0YXRlX3QgeCkgeworICAgIHJldHVybgorICAgICAgICB4ID09IFBBX0NPTlRFWFRfQ09OTkVDVElORyB8fAorICAgICAgICB4ID09IFBBX0NPTlRFWFRfQVVUSE9SSVpJTkcgfHwKKyAgICAgICAgeCA9PSBQQV9DT05URVhUX1NFVFRJTkdfTkFNRSB8fAorICAgICAgICB4ID09IFBBX0NPTlRFWFRfUkVBRFk7Cit9CisKKy8qKiBcY29uZCBmdWxsZG9jcyAqLworI2RlZmluZSBQQV9DT05URVhUX1VOQ09OTkVDVEVEIFBBX0NPTlRFWFRfVU5DT05ORUNURUQKKyNkZWZpbmUgUEFfQ09OVEVYVF9DT05ORUNUSU5HIFBBX0NPTlRFWFRfQ09OTkVDVElORworI2RlZmluZSBQQV9DT05URVhUX0FVVEhPUklaSU5HIFBBX0NPTlRFWFRfQVVUSE9SSVpJTkcKKyNkZWZpbmUgUEFfQ09OVEVYVF9TRVRUSU5HX05BTUUgUEFfQ09OVEVYVF9TRVRUSU5HX05BTUUKKyNkZWZpbmUgUEFfQ09OVEVYVF9SRUFEWSBQQV9DT05URVhUX1JFQURZCisjZGVmaW5lIFBBX0NPTlRFWFRfRkFJTEVEIFBBX0NPTlRFWFRfRkFJTEVECisjZGVmaW5lIFBBX0NPTlRFWFRfVEVSTUlOQVRFRCBQQV9DT05URVhUX1RFUk1JTkFURUQKKyNkZWZpbmUgUEFfQ09OVEVYVF9JU19HT09EIFBBX0NPTlRFWFRfSVNfR09PRAorLyoqIFxlbmRjb25kICovCisKKy8qKiBUaGUgc3RhdGUgb2YgYSBzdHJlYW0gKi8KK3R5cGVkZWYgZW51bSBwYV9zdHJlYW1fc3RhdGUgeworICAgIFBBX1NUUkVBTV9VTkNPTk5FQ1RFRCwgIC8qKjwgVGhlIHN0cmVhbSBpcyBub3QgeWV0IGNvbm5lY3RlZCB0byBhbnkgc2luayBvciBzb3VyY2UgKi8KKyAgICBQQV9TVFJFQU1fQ1JFQVRJTkcsICAgICAvKio8IFRoZSBzdHJlYW0gaXMgYmVpbmcgY3JlYXRlZCAqLworICAgIFBBX1NUUkVBTV9SRUFEWSwgICAgICAgIC8qKjwgVGhlIHN0cmVhbSBpcyBlc3RhYmxpc2hlZCwgeW91IG1heSBwYXNzIGF1ZGlvIGRhdGEgdG8gaXQgbm93ICovCisgICAgUEFfU1RSRUFNX0ZBSUxFRCwgICAgICAgLyoqPCBBbiBlcnJvciBvY2N1cnJlZCB0aGF0IG1hZGUgdGhlIHN0cmVhbSBpbnZhbGlkICovCisgICAgUEFfU1RSRUFNX1RFUk1JTkFURUQgICAgLyoqPCBUaGUgc3RyZWFtIGhhcyBiZWVuIHRlcm1pbmF0ZWQgY2xlYW5seSAqLworfSBwYV9zdHJlYW1fc3RhdGVfdDsKKworLyoqIFJldHVybiBub24temVybyBpZiB0aGUgcGFzc2VkIHN0YXRlIGlzIG9uZSBvZiB0aGUgY29ubmVjdGVkIHN0YXRlcy4gXHNpbmNlIDAuOS4xMSAqLworc3RhdGljIGlubGluZSBpbnQgUEFfU1RSRUFNX0lTX0dPT0QocGFfc3RyZWFtX3N0YXRlX3QgeCkgeworICAgIHJldHVybgorICAgICAgICB4ID09IFBBX1NUUkVBTV9DUkVBVElORyB8fAorICAgICAgICB4ID09IFBBX1NUUkVBTV9SRUFEWTsKK30KKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisjZGVmaW5lIFBBX1NUUkVBTV9VTkNPTk5FQ1RFRCBQQV9TVFJFQU1fVU5DT05ORUNURUQKKyNkZWZpbmUgUEFfU1RSRUFNX0NSRUFUSU5HIFBBX1NUUkVBTV9DUkVBVElORworI2RlZmluZSBQQV9TVFJFQU1fUkVBRFkgUEFfU1RSRUFNX1JFQURZCisjZGVmaW5lIFBBX1NUUkVBTV9GQUlMRUQgUEFfU1RSRUFNX0ZBSUxFRAorI2RlZmluZSBQQV9TVFJFQU1fVEVSTUlOQVRFRCBQQV9TVFJFQU1fVEVSTUlOQVRFRAorI2RlZmluZSBQQV9TVFJFQU1fSVNfR09PRCBQQV9TVFJFQU1fSVNfR09PRAorLyoqIFxlbmRjb25kICovCisKKy8qKiBUaGUgc3RhdGUgb2YgYW4gb3BlcmF0aW9uICovCit0eXBlZGVmIGVudW0gcGFfb3BlcmF0aW9uX3N0YXRlIHsKKyAgICBQQV9PUEVSQVRJT05fUlVOTklORywgICAgICAvKio8IFRoZSBvcGVyYXRpb24gaXMgc3RpbGwgcnVubmluZyAqLworICAgIFBBX09QRVJBVElPTl9ET05FLCAgICAgICAgIC8qKjwgVGhlIG9wZXJhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgKi8KKyAgICBQQV9PUEVSQVRJT05fQ0FOQ0VMTEVEICAgICAvKio8IFRoZSBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkLiBCZWZvcmUgMC45LjE4IHRoaXMgd2FzIGNhbGxlZCBQQV9PUEVSQVRJT05fQ0FOQ0VMRUQuIFRoYXQgbmFtZSBpcyBzdGlsbCBhdmFpbGFibGUgZm9yIGNvbXBhdGliaWxpdHkuICovCit9IHBhX29wZXJhdGlvbl9zdGF0ZV90OworCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyNkZWZpbmUgUEFfT1BFUkFUSU9OX1JVTk5JTkcgUEFfT1BFUkFUSU9OX1JVTk5JTkcKKyNkZWZpbmUgUEFfT1BFUkFUSU9OX0RPTkUgUEFfT1BFUkFUSU9OX0RPTkUKKyNkZWZpbmUgUEFfT1BFUkFUSU9OX0NBTkNFTEVEIFBBX09QRVJBVElPTl9DQU5DRUxMRUQKKyNkZWZpbmUgUEFfT1BFUkFUSU9OX0NBTkNFTExFRCBQQV9PUEVSQVRJT05fQ0FOQ0VMTEVECisvKiogXGVuZGNvbmQgKi8KKworLyoqIEFuIGludmFsaWQgaW5kZXggKi8KKyNkZWZpbmUgUEFfSU5WQUxJRF9JTkRFWCAoKHVpbnQzMl90KSAtMSkKKworLyoqIFNvbWUgc3BlY2lhbCBmbGFncyBmb3IgY29udGV4dHMuICovCit0eXBlZGVmIGVudW0gcGFfY29udGV4dF9mbGFncyB7CisgICAgUEFfQ09OVEVYVF9OT0ZMQUdTID0gMHgwMDAwVSwKKyAgICAvKio8IEZsYWcgdG8gcGFzcyB3aGVuIG5vIHNwZWNpZmljIG9wdGlvbnMgYXJlIG5lZWRlZCAodXNlZCB0byBhdm9pZCBjYXN0aW5nKSAgXHNpbmNlIDAuOS4xOSAqLworICAgIFBBX0NPTlRFWFRfTk9BVVRPU1BBV04gPSAweDAwMDFVLAorICAgIC8qKjwgRGlzYWJsZWQgYXV0b3NwYXduaW5nIG9mIHRoZSBQdWxzZUF1ZGlvIGRhZW1vbiBpZiByZXF1aXJlZCAqLworICAgIFBBX0NPTlRFWFRfTk9GQUlMID0gMHgwMDAyVQorICAgIC8qKjwgRG9uJ3QgZmFpbCBpZiB0aGUgZGFlbW9uIGlzIG5vdCBhdmFpbGFibGUgd2hlbiBwYV9jb250ZXh0X2Nvbm5lY3QoKSBpcyBjYWxsZWQsIGluc3RlYWQgZW50ZXIgUEFfQ09OVEVYVF9DT05ORUNUSU5HIHN0YXRlIGFuZCB3YWl0IGZvciB0aGUgZGFlbW9uIHRvIGFwcGVhci4gIFxzaW5jZSAwLjkuMTUgKi8KK30gcGFfY29udGV4dF9mbGFnc190OworCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKy8qIEFsbG93IGNsaWVudHMgdG8gY2hlY2sgd2l0aCAjaWZkZWYgZm9yIHRob3NlIGZsYWdzICovCisjZGVmaW5lIFBBX0NPTlRFWFRfTk9BVVRPU1BBV04gUEFfQ09OVEVYVF9OT0FVVE9TUEFXTgorI2RlZmluZSBQQV9DT05URVhUX05PRkFJTCBQQV9DT05URVhUX05PRkFJTAorLyoqIFxlbmRjb25kICovCisKKy8qKiBEaXJlY3Rpb24gYml0ZmllbGQgLSB3aGlsZSB3ZSBjdXJyZW50bHkgZG8gbm90IGV4cG9zZSBhbnl0aGluZyBiaWRpcmVjdGlvbmFsLAorICAgIG9uZSBzaG91bGQgdGVzdCBhZ2FpbnN0IHRoZSBiaXQgaW5zdGVhZCBvZiB0aGUgdmFsdWUgKGUgZyBpZiAoZCAmIFBBX0RJUkVDVElPTl9PVVRQVVQpKSwKKyAgICBiZWNhdXNlIHdlIG1pZ2h0IGFkZCBiaWRpcmVjdGlvbmFsIHN0dWZmIGluIHRoZSBmdXR1cmUuIFxzaW5jZSAyLjAKKyovCit0eXBlZGVmIGVudW0gcGFfZGlyZWN0aW9uIHsKKyAgICBQQV9ESVJFQ1RJT05fT1VUUFVUID0gMHgwMDAxVSwgIC8qKjwgT3V0cHV0IGRpcmVjdGlvbiAqLworICAgIFBBX0RJUkVDVElPTl9JTlBVVCA9IDB4MDAwMlUgICAgLyoqPCBJbnB1dCBkaXJlY3Rpb24gKi8KK30gcGFfZGlyZWN0aW9uX3Q7CisKKy8qKiBcY29uZCBmdWxsZG9jcyAqLworI2RlZmluZSBQQV9ESVJFQ1RJT05fT1VUUFVUIFBBX0RJUkVDVElPTl9PVVRQVVQKKyNkZWZpbmUgUEFfRElSRUNUSU9OX0lOUFVUIFBBX0RJUkVDVElPTl9JTlBVVAorLyoqIFxlbmRjb25kICovCisKKy8qKiBUaGUgdHlwZSBvZiBkZXZpY2Ugd2UgYXJlIGRlYWxpbmcgd2l0aCAqLwordHlwZWRlZiBlbnVtIHBhX2RldmljZV90eXBlIHsKKyAgICBQQV9ERVZJQ0VfVFlQRV9TSU5LLCAgICAgLyoqPCBQbGF5YmFjayBkZXZpY2UgKi8KKyAgICBQQV9ERVZJQ0VfVFlQRV9TT1VSQ0UgICAgLyoqPCBSZWNvcmRpbmcgZGV2aWNlICovCit9IHBhX2RldmljZV90eXBlX3Q7CisKKy8qKiBcY29uZCBmdWxsZG9jcyAqLworI2RlZmluZSBQQV9ERVZJQ0VfVFlQRV9TSU5LIFBBX0RFVklDRV9UWVBFX1NJTksKKyNkZWZpbmUgUEFfREVWSUNFX1RZUEVfU09VUkNFIFBBX0RFVklDRV9UWVBFX1NPVVJDRQorLyoqIFxlbmRjb25kICovCisKKy8qKiBUaGUgZGlyZWN0aW9uIG9mIGEgcGFfc3RyZWFtIG9iamVjdCAqLwordHlwZWRlZiBlbnVtIHBhX3N0cmVhbV9kaXJlY3Rpb24geworICAgIFBBX1NUUkVBTV9OT0RJUkVDVElPTiwgICAvKio8IEludmFsaWQgZGlyZWN0aW9uICovCisgICAgUEFfU1RSRUFNX1BMQVlCQUNLLCAgICAgIC8qKjwgUGxheWJhY2sgc3RyZWFtICovCisgICAgUEFfU1RSRUFNX1JFQ09SRCwgICAgICAgIC8qKjwgUmVjb3JkIHN0cmVhbSAqLworICAgIFBBX1NUUkVBTV9VUExPQUQgICAgICAgICAvKio8IFNhbXBsZSB1cGxvYWQgc3RyZWFtICovCit9IHBhX3N0cmVhbV9kaXJlY3Rpb25fdDsKKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisjZGVmaW5lIFBBX1NUUkVBTV9OT0RJUkVDVElPTiBQQV9TVFJFQU1fTk9ESVJFQ1RJT04KKyNkZWZpbmUgUEFfU1RSRUFNX1BMQVlCQUNLIFBBX1NUUkVBTV9QTEFZQkFDSworI2RlZmluZSBQQV9TVFJFQU1fUkVDT1JEIFBBX1NUUkVBTV9SRUNPUkQKKyNkZWZpbmUgUEFfU1RSRUFNX1VQTE9BRCBQQV9TVFJFQU1fVVBMT0FECisvKiogXGVuZGNvbmQgKi8KKworLyoqIFNvbWUgc3BlY2lhbCBmbGFncyBmb3Igc3RyZWFtIGNvbm5lY3Rpb25zLiAqLwordHlwZWRlZiBlbnVtIHBhX3N0cmVhbV9mbGFncyB7CisKKyAgICBQQV9TVFJFQU1fTk9GTEFHUyA9IDB4MDAwMFUsCisgICAgLyoqPCBGbGFnIHRvIHBhc3Mgd2hlbiBubyBzcGVjaWZpYyBvcHRpb25zIGFyZSBuZWVkZWQgKHVzZWQgdG8gYXZvaWQgY2FzdGluZykgIFxzaW5jZSAwLjkuMTkgKi8KKworICAgIFBBX1NUUkVBTV9TVEFSVF9DT1JLRUQgPSAweDAwMDFVLAorICAgIC8qKjwgQ3JlYXRlIHRoZSBzdHJlYW0gY29ya2VkLCByZXF1aXJpbmcgYW4gZXhwbGljaXQKKyAgICAgKiBwYV9zdHJlYW1fY29yaygpIGNhbGwgdG8gdW5jb3JrIGl0LiAqLworCisgICAgUEFfU1RSRUFNX0lOVEVSUE9MQVRFX1RJTUlORyA9IDB4MDAwMlUsCisgICAgLyoqPCBJbnRlcnBvbGF0ZSB0aGUgbGF0ZW5jeSBmb3IgdGhpcyBzdHJlYW0uIFdoZW4gZW5hYmxlZCwKKyAgICAgKiBwYV9zdHJlYW1fZ2V0X2xhdGVuY3koKSBhbmQgcGFfc3RyZWFtX2dldF90aW1lKCkgd2lsbCB0cnkgdG8KKyAgICAgKiBlc3RpbWF0ZSB0aGUgY3VycmVudCByZWNvcmQvcGxheWJhY2sgdGltZSBiYXNlZCBvbiB0aGUgbG9jYWwKKyAgICAgKiB0aW1lIHRoYXQgcGFzc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWluZyBpbmZvIHVwZGF0ZS4gIFVzaW5nIHRoaXMKKyAgICAgKiBvcHRpb24gaGFzIHRoZSBhZHZhbnRhZ2Ugb2Ygbm90IHJlcXVpcmluZyBhIHdob2xlIHJvdW5kdHJpcAorICAgICAqIHdoZW4gdGhlIGN1cnJlbnQgcGxheWJhY2svcmVjb3JkaW5nIHRpbWUgaXMgbmVlZGVkLiBDb25zaWRlcgorICAgICAqIHVzaW5nIHRoaXMgb3B0aW9uIHdoZW4gcmVxdWVzdGluZyBsYXRlbmN5IGluZm9ybWF0aW9uCisgICAgICogZnJlcXVlbnRseS4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBvbiBsb25nIGxhdGVuY3kgbmV0d29yaworICAgICAqIGNvbm5lY3Rpb25zLiBJdCBtYWtlcyBhIGxvdCBvZiBzZW5zZSB0byBjb21iaW5lIHRoaXMgb3B0aW9uCisgICAgICogd2l0aCBQQV9TVFJFQU1fQVVUT19USU1JTkdfVVBEQVRFLiAqLworCisgICAgUEFfU1RSRUFNX05PVF9NT05PVE9OSUMgPSAweDAwMDRVLAorICAgIC8qKjwgRG9uJ3QgZm9yY2UgdGhlIHRpbWUgdG8gaW5jcmVhc2UgbW9ub3RvbmljYWxseS4gSWYgdGhpcworICAgICAqIG9wdGlvbiBpcyBlbmFibGVkLCBwYV9zdHJlYW1fZ2V0X3RpbWUoKSB3aWxsIG5vdCBuZWNlc3NhcmlseQorICAgICAqIHJldHVybiBhbHdheXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHRpbWUgdmFsdWVzIG9uIGVhY2gKKyAgICAgKiBjYWxsLiBUaGlzIG1heSBjb25mdXNlIGFwcGxpY2F0aW9ucyB3aGljaCBjYW5ub3QgZGVhbCB3aXRoIHRpbWUKKyAgICAgKiBnb2luZyAnYmFja3dhcmRzJywgYnV0IGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgYmFkIHRyYW5zcG9ydAorICAgICAqIGxhdGVuY3kgZXN0aW1hdGlvbnMgdGhhdCBjYXVzZWQgdGhlIHRpbWUgdG8gdG8ganVtcCBhaGVhZCBjYW4KKyAgICAgKiBiZSBjb3JyZWN0ZWQgcXVpY2tseSwgd2l0aG91dCB0aGUgbmVlZCB0byB3YWl0LiAoUGxlYXNlIG5vdGUKKyAgICAgKiB0aGF0IHRoaXMgZmxhZyB3YXMgbmFtZWQgUEFfU1RSRUFNX05PVF9NT05PVE9OT1VTIGluIHJlbGVhc2VzCisgICAgICogcHJpb3IgdG8gMC45LjExLiBUaGUgb2xkIG5hbWUgaXMgc3RpbGwgZGVmaW5lZCB0b28sIGZvcgorICAgICAqIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gKi8KKworICAgIFBBX1NUUkVBTV9BVVRPX1RJTUlOR19VUERBVEUgPSAweDAwMDhVLAorICAgIC8qKjwgSWYgc2V0IHRpbWluZyB1cGRhdGUgcmVxdWVzdHMgYXJlIGlzc3VlZCBwZXJpb2RpY2FsbHkKKyAgICAgKiBhdXRvbWF0aWNhbGx5LiBDb21iaW5lZCB3aXRoIFBBX1NUUkVBTV9JTlRFUlBPTEFURV9USU1JTkcgeW91CisgICAgICogd2lsbCBiZSBhYmxlIHRvIHF1ZXJ5IHRoZSBjdXJyZW50IHRpbWUgYW5kIGxhdGVuY3kgd2l0aAorICAgICAqIHBhX3N0cmVhbV9nZXRfdGltZSgpIGFuZCBwYV9zdHJlYW1fZ2V0X2xhdGVuY3koKSBhdCBhbGwgdGltZXMKKyAgICAgKiB3aXRob3V0IGEgcGFja2V0IHJvdW5kIHRyaXAuKi8KKworICAgIFBBX1NUUkVBTV9OT19SRU1BUF9DSEFOTkVMUyA9IDB4MDAxMFUsCisgICAgLyoqPCBEb24ndCByZW1hcCBjaGFubmVscyBieSB0aGVpciBuYW1lLCBpbnN0ZWFkIG1hcCB0aGVtIHNpbXBseQorICAgICAqIGJ5IHRoZWlyIGluZGV4LiBJbXBsaWVzIFBBX1NUUkVBTV9OT19SRU1JWF9DSEFOTkVMUy4gT25seQorICAgICAqIHN1cHBvcnRlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgYXQgbGVhc3QgUEEgMC45LjguIEl0IGlzIGlnbm9yZWQKKyAgICAgKiBvbiBvbGRlciBzZXJ2ZXJzLlxzaW5jZSAwLjkuOCAqLworCisgICAgUEFfU1RSRUFNX05PX1JFTUlYX0NIQU5ORUxTID0gMHgwMDIwVSwKKyAgICAvKio8IFdoZW4gcmVtYXBwaW5nIGNoYW5uZWxzIGJ5IG5hbWUsIGRvbid0IHVwbWl4IG9yIGRvd25taXggdGhlbQorICAgICAqIHRvIHJlbGF0ZWQgY2hhbm5lbHMuIENvcHkgdGhlbSBpbnRvIG1hdGNoaW5nIGNoYW5uZWxzIG9mIHRoZQorICAgICAqIGRldmljZSAxOjEuIE9ubHkgc3VwcG9ydGVkIHdoZW4gdGhlIHNlcnZlciBpcyBhdCBsZWFzdCBQQQorICAgICAqIDAuOS44LiBJdCBpcyBpZ25vcmVkIG9uIG9sZGVyIHNlcnZlcnMuIFxzaW5jZSAwLjkuOCAqLworCisgICAgUEFfU1RSRUFNX0ZJWF9GT1JNQVQgPSAweDAwNDBVLAorICAgIC8qKjwgVXNlIHRoZSBzYW1wbGUgZm9ybWF0IG9mIHRoZSBzaW5rL2RldmljZSB0aGlzIHN0cmVhbSBpcyBiZWluZworICAgICAqIGNvbm5lY3RlZCB0bywgYW5kIHBvc3NpYmx5IGlnbm9yZSB0aGUgZm9ybWF0IHRoZSBzYW1wbGUgc3BlYworICAgICAqIGNvbnRhaW5zIC0tIGJ1dCB5b3Ugc3RpbGwgaGF2ZSB0byBwYXNzIGEgdmFsaWQgdmFsdWUgaW4gaXQgYXMgYQorICAgICAqIGhpbnQgdG8gUHVsc2VBdWRpbyB3aGF0IHdvdWxkIHN1aXQgeW91ciBzdHJlYW0gYmVzdC4gSWYgdGhpcyBpcworICAgICAqIHVzZWQgeW91IHNob3VsZCBxdWVyeSB0aGUgdXNlZCBzYW1wbGUgZm9ybWF0IGFmdGVyIGNyZWF0aW5nIHRoZQorICAgICAqIHN0cmVhbSBieSB1c2luZyBwYV9zdHJlYW1fZ2V0X3NhbXBsZV9zcGVjKCkuIEFsc28sIGlmIHlvdQorICAgICAqIHNwZWNpZmllZCBtYW51YWwgYnVmZmVyIG1ldHJpY3MgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXBkYXRlCisgICAgICogdGhlbSB3aXRoIHBhX3N0cmVhbV9zZXRfYnVmZmVyX2F0dHIoKSB0byBjb21wZW5zYXRlIGZvciB0aGUKKyAgICAgKiBjaGFuZ2VkIGZyYW1lIHNpemVzLiBPbmx5IHN1cHBvcnRlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgYXQgbGVhc3QKKyAgICAgKiBQQSAwLjkuOC4gSXQgaXMgaWdub3JlZCBvbiBvbGRlciBzZXJ2ZXJzLiBcc2luY2UgMC45LjggKi8KKworICAgIFBBX1NUUkVBTV9GSVhfUkFURSA9IDB4MDA4MFUsCisgICAgLyoqPCBVc2UgdGhlIHNhbXBsZSByYXRlIG9mIHRoZSBzaW5rLCBhbmQgcG9zc2libHkgaWdub3JlIHRoZSByYXRlCisgICAgICogdGhlIHNhbXBsZSBzcGVjIGNvbnRhaW5zLiBVc2FnZSBzaW1pbGFyIHRvCisgICAgICogUEFfU1RSRUFNX0ZJWF9GT1JNQVQuT25seSBzdXBwb3J0ZWQgd2hlbiB0aGUgc2VydmVyIGlzIGF0IGxlYXN0CisgICAgICogUEEgMC45LjguIEl0IGlzIGlnbm9yZWQgb24gb2xkZXIgc2VydmVycy4gXHNpbmNlIDAuOS44ICovCisKKyAgICBQQV9TVFJFQU1fRklYX0NIQU5ORUxTID0gMHgwMTAwLAorICAgIC8qKjwgVXNlIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIHRoZSBjaGFubmVsIG1hcCBvZiB0aGUgc2luaywKKyAgICAgKiBhbmQgcG9zc2libHkgaWdub3JlIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIHRoZSBtYXAgdGhlCisgICAgICogc2FtcGxlIHNwZWMgYW5kIHRoZSBwYXNzZWQgY2hhbm5lbCBtYXAgY29udGFpbnMuIFVzYWdlIHNpbWlsYXIKKyAgICAgKiB0byBQQV9TVFJFQU1fRklYX0ZPUk1BVC4gT25seSBzdXBwb3J0ZWQgd2hlbiB0aGUgc2VydmVyIGlzIGF0CisgICAgICogbGVhc3QgUEEgMC45LjguIEl0IGlzIGlnbm9yZWQgb24gb2xkZXIgc2VydmVycy4gXHNpbmNlIDAuOS44ICovCisKKyAgICBQQV9TVFJFQU1fRE9OVF9NT1ZFID0gMHgwMjAwVSwKKyAgICAvKio8IERvbid0IGFsbG93IG1vdmluZyBvZiB0aGlzIHN0cmVhbSB0byBhbm90aGVyCisgICAgICogc2luay9kZXZpY2UuIFVzZWZ1bCBpZiB5b3UgdXNlIGFueSBvZiB0aGUgUEFfU1RSRUFNX0ZJWF8gZmxhZ3MKKyAgICAgKiBhbmQgd2FudCB0byBtYWtlIHN1cmUgdGhhdCByZXNhbXBsaW5nIG5ldmVyIHRha2VzIHBsYWNlIC0tCisgICAgICogd2hpY2ggbWlnaHQgaGFwcGVuIGlmIHRoZSBzdHJlYW0gaXMgbW92ZWQgdG8gYW5vdGhlcgorICAgICAqIHNpbmsvc291cmNlIHdpdGggYSBkaWZmZXJlbnQgc2FtcGxlIHNwZWMvY2hhbm5lbCBtYXAuIE9ubHkKKyAgICAgKiBzdXBwb3J0ZWQgd2hlbiB0aGUgc2VydmVyIGlzIGF0IGxlYXN0IFBBIDAuOS44LiBJdCBpcyBpZ25vcmVkCisgICAgICogb24gb2xkZXIgc2VydmVycy4gXHNpbmNlIDAuOS44ICovCisKKyAgICBQQV9TVFJFQU1fVkFSSUFCTEVfUkFURSA9IDB4MDQwMFUsCisgICAgLyoqPCBBbGxvdyBkeW5hbWljIGNoYW5naW5nIG9mIHRoZSBzYW1wbGluZyByYXRlIGR1cmluZyBwbGF5YmFjaworICAgICAqIHdpdGggcGFfc3RyZWFtX3VwZGF0ZV9zYW1wbGVfcmF0ZSgpLiBPbmx5IHN1cHBvcnRlZCB3aGVuIHRoZQorICAgICAqIHNlcnZlciBpcyBhdCBsZWFzdCBQQSAwLjkuOC4gSXQgaXMgaWdub3JlZCBvbiBvbGRlcgorICAgICAqIHNlcnZlcnMuIFxzaW5jZSAwLjkuOCAqLworCisgICAgUEFfU1RSRUFNX1BFQUtfREVURUNUID0gMHgwODAwVSwKKyAgICAvKio8IEZpbmQgcGVha3MgaW5zdGVhZCBvZiByZXNhbXBsaW5nLiBcc2luY2UgMC45LjExICovCisKKyAgICBQQV9TVFJFQU1fU1RBUlRfTVVURUQgPSAweDEwMDBVLAorICAgIC8qKjwgQ3JlYXRlIGluIG11dGVkIHN0YXRlLiBJZiBuZWl0aGVyIFBBX1NUUkVBTV9TVEFSVF9VTk1VVEVEIG5vcgorICAgICAqIFBBX1NUUkVBTV9TVEFSVF9NVVRFRCBpdCBpcyBsZWZ0IHRvIHRoZSBzZXJ2ZXIgdG8gZGVjaWRlCisgICAgICogd2hldGhlciB0byBjcmVhdGUgdGhlIHN0cmVhbSBpbiBtdXRlZCBvciBpbiB1bm11dGVkCisgICAgICogc3RhdGUuIFxzaW5jZSAwLjkuMTEgKi8KKworICAgIFBBX1NUUkVBTV9BREpVU1RfTEFURU5DWSA9IDB4MjAwMFUsCisgICAgLyoqPCBUcnkgdG8gYWRqdXN0IHRoZSBsYXRlbmN5IG9mIHRoZSBzaW5rL3NvdXJjZSBiYXNlZCBvbiB0aGUKKyAgICAgKiByZXF1ZXN0ZWQgYnVmZmVyIG1ldHJpY3MgYW5kIGFkanVzdCBidWZmZXIgbWV0cmljcworICAgICAqIGFjY29yZGluZ2x5LiBBbHNvIHNlZSBwYV9idWZmZXJfYXR0ci4gVGhpcyBvcHRpb24gbWF5IG5vdCBiZQorICAgICAqIHNwZWNpZmllZCBhdCB0aGUgc2FtZSB0aW1lIGFzIFBBX1NUUkVBTV9FQVJMWV9SRVFVRVNUUy4gXHNpbmNlCisgICAgICogMC45LjExICovCisKKyAgICBQQV9TVFJFQU1fRUFSTFlfUkVRVUVTVFMgPSAweDQwMDBVLAorICAgIC8qKjwgRW5hYmxlIGNvbXBhdGliaWxpdHkgbW9kZSBmb3IgbGVnYWN5IGNsaWVudHMgdGhhdCByZWx5IG9uIGEKKyAgICAgKiAiY2xhc3NpYyIgaGFyZHdhcmUgZGV2aWNlIGZyYWdtZW50LXN0eWxlIHBsYXliYWNrIG1vZGVsLiBJZgorICAgICAqIHRoaXMgb3B0aW9uIGlzIHNldCwgdGhlIG1pbnJlcSB2YWx1ZSBvZiB0aGUgYnVmZmVyIG1ldHJpY3MgZ2V0cworICAgICAqIGEgbmV3IG1lYW5pbmc6IGluc3RlYWQgb2YganVzdCBzcGVjaWZ5aW5nIHRoYXQgbm8gcmVxdWVzdHMKKyAgICAgKiBhc2tpbmcgZm9yIGxlc3MgbmV3IGRhdGEgdGhhbiB0aGlzIHZhbHVlIHdpbGwgYmUgbWFkZSB0byB0aGUKKyAgICAgKiBjbGllbnQgaXQgd2lsbCBhbHNvIGd1YXJhbnRlZSB0aGF0IHJlcXVlc3RzIGFyZSBnZW5lcmF0ZWQgYXMKKyAgICAgKiBlYXJseSBhcyB0aGlzIGxpbWl0IGlzIHJlYWNoZWQuIFRoaXMgZmxhZyBzaG91bGQgb25seSBiZSBzZXQgaW4KKyAgICAgKiB2ZXJ5IGZldyBzaXR1YXRpb25zIHdoZXJlIGNvbXBhdGliaWxpdHkgd2l0aCBhIGZyYWdtZW50LWJhc2VkCisgICAgICogcGxheWJhY2sgbW9kZWwgbmVlZHMgdG8gYmUga2VwdCBhbmQgdGhlIGNsaWVudCBhcHBsaWNhdGlvbnMKKyAgICAgKiBjYW5ub3QgZGVhbCB3aXRoIGRhdGEgcmVxdWVzdHMgdGhhdCBhcmUgZGVsYXllZCB0byB0aGUgbGF0ZXN0CisgICAgICogbW9tZW50IHBvc3NpYmxlLiAoVXN1YWxseSB0aGVzZSBhcmUgcHJvZ3JhbXMgdGhhdCB1c2UgdXNsZWVwKCkKKyAgICAgKiBvciBhIHNpbWlsYXIgY2FsbCBpbiB0aGVpciBwbGF5YmFjayBsb29wcyBpbnN0ZWFkIG9mIHNsZWVwaW5nCisgICAgICogb24gdGhlIGRldmljZSBpdHNlbGYuKSBBbHNvIHNlZSBwYV9idWZmZXJfYXR0ci4gVGhpcyBvcHRpb24gbWF5CisgICAgICogbm90IGJlIHNwZWNpZmllZCBhdCB0aGUgc2FtZSB0aW1lIGFzCisgICAgICogUEFfU1RSRUFNX0FESlVTVF9MQVRFTkNZLiBcc2luY2UgMC45LjEyICovCisKKyAgICBQQV9TVFJFQU1fRE9OVF9JTkhJQklUX0FVVE9fU1VTUEVORCA9IDB4ODAwMFUsCisgICAgLyoqPCBJZiBzZXQgdGhpcyBzdHJlYW0gd29uJ3QgYmUgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gd2UgaXQgaXMKKyAgICAgKiBjaGVja2VkIHdoZXRoZXIgdGhlIGRldmljZSB0aGlzIHN0cmVhbSBpcyBjb25uZWN0ZWQgdG8gc2hvdWxkCisgICAgICogYXV0by1zdXNwZW5kLiBcc2luY2UgMC45LjE1ICovCisKKyAgICBQQV9TVFJFQU1fU1RBUlRfVU5NVVRFRCA9IDB4MTAwMDBVLAorICAgIC8qKjwgQ3JlYXRlIGluIHVubXV0ZWQgc3RhdGUuIElmIG5laXRoZXIgUEFfU1RSRUFNX1NUQVJUX1VOTVVURUQKKyAgICAgKiBub3IgUEFfU1RSRUFNX1NUQVJUX01VVEVEIGl0IGlzIGxlZnQgdG8gdGhlIHNlcnZlciB0byBkZWNpZGUKKyAgICAgKiB3aGV0aGVyIHRvIGNyZWF0ZSB0aGUgc3RyZWFtIGluIG11dGVkIG9yIGluIHVubXV0ZWQKKyAgICAgKiBzdGF0ZS4gXHNpbmNlIDAuOS4xNSAqLworCisgICAgUEFfU1RSRUFNX0ZBSUxfT05fU1VTUEVORCA9IDB4MjAwMDBVLAorICAgIC8qKjwgSWYgdGhlIHNpbmsvc291cmNlIHRoaXMgc3RyZWFtIGlzIGNvbm5lY3RlZCB0byBpcyBzdXNwZW5kZWQKKyAgICAgKiBkdXJpbmcgdGhlIGNyZWF0aW9uIG9mIHRoaXMgc3RyZWFtLCBjYXVzZSBpdCB0byBmYWlsLiBJZiB0aGUKKyAgICAgKiBzaW5rL3NvdXJjZSBpcyBiZWluZyBzdXNwZW5kZWQgZHVyaW5nIGNyZWF0aW9uIG9mIHRoaXMgc3RyZWFtLAorICAgICAqIG1ha2Ugc3VyZSB0aGlzIHN0cmVhbSBpcyB0ZXJtaW5hdGVkLiBcc2luY2UgMC45LjE1ICovCisKKyAgICBQQV9TVFJFQU1fUkVMQVRJVkVfVk9MVU1FID0gMHg0MDAwMFUsCisgICAgLyoqPCBJZiBhIHZvbHVtZSBpcyBwYXNzZWQgd2hlbiB0aGlzIHN0cmVhbSBpcyBjcmVhdGVkLCBjb25zaWRlcgorICAgICAqIGl0IHJlbGF0aXZlIHRvIHRoZSBzaW5rJ3MgY3VycmVudCB2b2x1bWUsIG5ldmVyIGFzIGFic29sdXRlCisgICAgICogZGV2aWNlIHZvbHVtZS4gSWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkIHRoZSB2b2x1bWUgd2lsbCBiZQorICAgICAqIGNvbnNpZGVyIGFic29sdXRlIHdoZW4gdGhlIHNpbmsgaXMgaW4gZmxhdCB2b2x1bWUgbW9kZSwKKyAgICAgKiByZWxhdGl2ZSBvdGhlcndpc2UuIFxzaW5jZSAwLjkuMjAgKi8KKworICAgIFBBX1NUUkVBTV9QQVNTVEhST1VHSCA9IDB4ODAwMDBVCisgICAgLyoqPCBVc2VkIHRvIHRhZyBjb250ZW50IHRoYXQgd2lsbCBiZSByZW5kZXJlZCBieSBwYXNzdGhyb3VnaCBzaW5rcy4KKyAgICAgKiBUaGUgZGF0YSB3aWxsIGJlIGxlZnQgYXMgaXMgYW5kIG5vdCByZWZvcm1hdHRlZCwgcmVzYW1wbGVkLgorICAgICAqIFxzaW5jZSAxLjAgKi8KKworfSBwYV9zdHJlYW1fZmxhZ3NfdDsKKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisKKy8qIEVuZ2xpc2ggaXMgYW4gZXZpbCBsYW5ndWFnZSAqLworI2RlZmluZSBQQV9TVFJFQU1fTk9UX01PTk9UT05PVVMgUEFfU1RSRUFNX05PVF9NT05PVE9OSUMKKworLyogQWxsb3cgY2xpZW50cyB0byBjaGVjayB3aXRoICNpZmRlZiBmb3IgdGhvc2UgZmxhZ3MgKi8KKyNkZWZpbmUgUEFfU1RSRUFNX1NUQVJUX0NPUktFRCBQQV9TVFJFQU1fU1RBUlRfQ09SS0VECisjZGVmaW5lIFBBX1NUUkVBTV9JTlRFUlBPTEFURV9USU1JTkcgUEFfU1RSRUFNX0lOVEVSUE9MQVRFX1RJTUlORworI2RlZmluZSBQQV9TVFJFQU1fTk9UX01PTk9UT05JQyBQQV9TVFJFQU1fTk9UX01PTk9UT05JQworI2RlZmluZSBQQV9TVFJFQU1fQVVUT19USU1JTkdfVVBEQVRFIFBBX1NUUkVBTV9BVVRPX1RJTUlOR19VUERBVEUKKyNkZWZpbmUgUEFfU1RSRUFNX05PX1JFTUFQX0NIQU5ORUxTIFBBX1NUUkVBTV9OT19SRU1BUF9DSEFOTkVMUworI2RlZmluZSBQQV9TVFJFQU1fTk9fUkVNSVhfQ0hBTk5FTFMgUEFfU1RSRUFNX05PX1JFTUlYX0NIQU5ORUxTCisjZGVmaW5lIFBBX1NUUkVBTV9GSVhfRk9STUFUIFBBX1NUUkVBTV9GSVhfRk9STUFUCisjZGVmaW5lIFBBX1NUUkVBTV9GSVhfUkFURSBQQV9TVFJFQU1fRklYX1JBVEUKKyNkZWZpbmUgUEFfU1RSRUFNX0ZJWF9DSEFOTkVMUyBQQV9TVFJFQU1fRklYX0NIQU5ORUxTCisjZGVmaW5lIFBBX1NUUkVBTV9ET05UX01PVkUgUEFfU1RSRUFNX0RPTlRfTU9WRQorI2RlZmluZSBQQV9TVFJFQU1fVkFSSUFCTEVfUkFURSBQQV9TVFJFQU1fVkFSSUFCTEVfUkFURQorI2RlZmluZSBQQV9TVFJFQU1fUEVBS19ERVRFQ1QgUEFfU1RSRUFNX1BFQUtfREVURUNUCisjZGVmaW5lIFBBX1NUUkVBTV9TVEFSVF9NVVRFRCBQQV9TVFJFQU1fU1RBUlRfTVVURUQKKyNkZWZpbmUgUEFfU1RSRUFNX0FESlVTVF9MQVRFTkNZIFBBX1NUUkVBTV9BREpVU1RfTEFURU5DWQorI2RlZmluZSBQQV9TVFJFQU1fRUFSTFlfUkVRVUVTVFMgUEFfU1RSRUFNX0VBUkxZX1JFUVVFU1RTCisjZGVmaW5lIFBBX1NUUkVBTV9ET05UX0lOSElCSVRfQVVUT19TVVNQRU5EIFBBX1NUUkVBTV9ET05UX0lOSElCSVRfQVVUT19TVVNQRU5ECisjZGVmaW5lIFBBX1NUUkVBTV9TVEFSVF9VTk1VVEVEIFBBX1NUUkVBTV9TVEFSVF9VTk1VVEVECisjZGVmaW5lIFBBX1NUUkVBTV9GQUlMX09OX1NVU1BFTkQgUEFfU1RSRUFNX0ZBSUxfT05fU1VTUEVORAorI2RlZmluZSBQQV9TVFJFQU1fUkVMQVRJVkVfVk9MVU1FIFBBX1NUUkVBTV9SRUxBVElWRV9WT0xVTUUKKyNkZWZpbmUgUEFfU1RSRUFNX1BBU1NUSFJPVUdIIFBBX1NUUkVBTV9QQVNTVEhST1VHSAorCisvKiogXGVuZGNvbmQgKi8KKworLyoqIFBsYXliYWNrIGFuZCByZWNvcmQgYnVmZmVyIG1ldHJpY3MgKi8KK3R5cGVkZWYgc3RydWN0IHBhX2J1ZmZlcl9hdHRyIHsKKyAgICB1aW50MzJfdCBtYXhsZW5ndGg7CisgICAgLyoqPCBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgYnVmZmVyLiBTZXR0aW5nIHRoaXMgdG8gKHVpbnQzMl90KSAtMQorICAgICAqIHdpbGwgaW5pdGlhbGl6ZSB0aGlzIHRvIHRoZSBtYXhpbXVtIHZhbHVlIHN1cHBvcnRlZCBieSBzZXJ2ZXIsCisgICAgICogd2hpY2ggaXMgcmVjb21tZW5kZWQuICovCisKKyAgICB1aW50MzJfdCB0bGVuZ3RoOworICAgIC8qKjwgUGxheWJhY2sgb25seTogdGFyZ2V0IGxlbmd0aCBvZiB0aGUgYnVmZmVyLiBUaGUgc2VydmVyIHRyaWVzCisgICAgICogdG8gYXNzdXJlIHRoYXQgYXQgbGVhc3QgdGxlbmd0aCBieXRlcyBhcmUgYWx3YXlzIGF2YWlsYWJsZSBpbgorICAgICAqIHRoZSBwZXItc3RyZWFtIHNlcnZlci1zaWRlIHBsYXliYWNrIGJ1ZmZlci4gSXQgaXMgcmVjb21tZW5kZWQKKyAgICAgKiB0byBzZXQgdGhpcyB0byAodWludDMyX3QpIC0xLCB3aGljaCB3aWxsIGluaXRpYWxpemUgdGhpcyB0byBhCisgICAgICogdmFsdWUgdGhhdCBpcyBkZWVtZWQgc2Vuc2libGUgYnkgdGhlIHNlcnZlci4gSG93ZXZlciwgdGhpcworICAgICAqIHZhbHVlIHdpbGwgZGVmYXVsdCB0byBzb21ldGhpbmcgbGlrZSAycywgaS5lLiBmb3IgYXBwbGljYXRpb25zCisgICAgICogdGhhdCBoYXZlIHNwZWNpZmljIGxhdGVuY3kgcmVxdWlyZW1lbnRzIHRoaXMgdmFsdWUgc2hvdWxkIGJlCisgICAgICogc2V0IHRvIHRoZSBtYXhpbXVtIGxhdGVuY3kgdGhhdCB0aGUgYXBwbGljYXRpb24gY2FuIGRlYWwKKyAgICAgKiB3aXRoLiBXaGVuIFBBX1NUUkVBTV9BREpVU1RfTEFURU5DWSBpcyBub3Qgc2V0IHRoaXMgdmFsdWUgd2lsbAorICAgICAqIGluZmx1ZW5jZSBvbmx5IHRoZSBwZXItc3RyZWFtIHBsYXliYWNrIGJ1ZmZlciBzaXplLiBXaGVuCisgICAgICogUEFfU1RSRUFNX0FESlVTVF9MQVRFTkNZIGlzIHNldCB0aGUgb3ZlcmFsbCBsYXRlbmN5IG9mIHRoZSBzaW5rCisgICAgICogcGx1cyB0aGUgcGxheWJhY2sgYnVmZmVyIHNpemUgaXMgY29uZmlndXJlZCB0byB0aGlzIHZhbHVlLiBTZXQKKyAgICAgKiBQQV9TVFJFQU1fQURKVVNUX0xBVEVOQ1kgaWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIGFkanVzdGluZyB0aGUKKyAgICAgKiBvdmVyYWxsIGxhdGVuY3kuIERvbid0IHNldCBpdCBpZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4KKyAgICAgKiBjb25maWd1cmluZyB0aGUgc2VydmVyLXNpZGUgcGVyLXN0cmVhbSBwbGF5YmFjayBidWZmZXIKKyAgICAgKiBzaXplLiAqLworCisgICAgdWludDMyX3QgcHJlYnVmOworICAgIC8qKjwgUGxheWJhY2sgb25seTogcHJlLWJ1ZmZlcmluZy4gVGhlIHNlcnZlciBkb2VzIG5vdCBzdGFydCB3aXRoCisgICAgICogcGxheWJhY2sgYmVmb3JlIGF0IGxlYXN0IHByZWJ1ZiBieXRlcyBhcmUgYXZhaWxhYmxlIGluIHRoZQorICAgICAqIGJ1ZmZlci4gSXQgaXMgcmVjb21tZW5kZWQgdG8gc2V0IHRoaXMgdG8gKHVpbnQzMl90KSAtMSwgd2hpY2gKKyAgICAgKiB3aWxsIGluaXRpYWxpemUgdGhpcyB0byB0aGUgc2FtZSB2YWx1ZSBhcyB0bGVuZ3RoLCB3aGF0ZXZlcgorICAgICAqIHRoYXQgbWF5IGJlLiBJbml0aWFsaXplIHRvIDAgdG8gZW5hYmxlIG1hbnVhbCBzdGFydC9zdG9wCisgICAgICogY29udHJvbCBvZiB0aGUgc3RyZWFtLiBUaGlzIG1lYW5zIHRoYXQgcGxheWJhY2sgd2lsbCBub3Qgc3RvcAorICAgICAqIG9uIHVuZGVycnVuIGFuZCBwbGF5YmFjayB3aWxsIG5vdCBzdGFydCBhdXRvbWF0aWNhbGx5LiBJbnN0ZWFkCisgICAgICogcGFfc3RyZWFtX2NvcmsoKSBuZWVkcyB0byBiZSBjYWxsZWQgZXhwbGljaXRseS4gSWYgeW91IHNldAorICAgICAqIHRoaXMgdmFsdWUgdG8gMCB5b3Ugc2hvdWxkIGFsc28gc2V0IFBBX1NUUkVBTV9TVEFSVF9DT1JLRUQuICovCisKKyAgICB1aW50MzJfdCBtaW5yZXE7CisgICAgLyoqPCBQbGF5YmFjayBvbmx5OiBtaW5pbXVtIHJlcXVlc3QuIFRoZSBzZXJ2ZXIgZG9lcyBub3QgcmVxdWVzdAorICAgICAqIGxlc3MgdGhhbiBtaW5yZXEgYnl0ZXMgZnJvbSB0aGUgY2xpZW50LCBpbnN0ZWFkIHdhaXRzIHVudGlsIHRoZQorICAgICAqIGJ1ZmZlciBpcyBmcmVlIGVub3VnaCB0byByZXF1ZXN0IG1vcmUgYnl0ZXMgYXQgb25jZS4gSXQgaXMKKyAgICAgKiByZWNvbW1lbmRlZCB0byBzZXQgdGhpcyB0byAodWludDMyX3QpIC0xLCB3aGljaCB3aWxsIGluaXRpYWxpemUKKyAgICAgKiB0aGlzIHRvIGEgdmFsdWUgdGhhdCBpcyBkZWVtZWQgc2Vuc2libGUgYnkgdGhlIHNlcnZlci4gVGhpcworICAgICAqIHNob3VsZCBiZSBzZXQgdG8gYSB2YWx1ZSB0aGF0IGdpdmVzIFB1bHNlQXVkaW8gZW5vdWdoIHRpbWUgdG8KKyAgICAgKiBtb3ZlIHRoZSBkYXRhIGZyb20gdGhlIHBlci1zdHJlYW0gcGxheWJhY2sgYnVmZmVyIGludG8gdGhlCisgICAgICogaGFyZHdhcmUgcGxheWJhY2sgYnVmZmVyLiAqLworCisgICAgdWludDMyX3QgZnJhZ3NpemU7CisgICAgLyoqPCBSZWNvcmRpbmcgb25seTogZnJhZ21lbnQgc2l6ZS4gVGhlIHNlcnZlciBzZW5kcyBkYXRhIGluCisgICAgICogYmxvY2tzIG9mIGZyYWdzaXplIGJ5dGVzIHNpemUuIExhcmdlIHZhbHVlcyBkaW1pbmlzaAorICAgICAqIGludGVyYWN0aXZpdHkgd2l0aCBvdGhlciBvcGVyYXRpb25zIG9uIHRoZSBjb25uZWN0aW9uIGNvbnRleHQKKyAgICAgKiBidXQgZGVjcmVhc2UgY29udHJvbCBvdmVyaGVhZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gc2V0IHRoaXMgdG8KKyAgICAgKiAodWludDMyX3QpIC0xLCB3aGljaCB3aWxsIGluaXRpYWxpemUgdGhpcyB0byBhIHZhbHVlIHRoYXQgaXMKKyAgICAgKiBkZWVtZWQgc2Vuc2libGUgYnkgdGhlIHNlcnZlci4gSG93ZXZlciwgdGhpcyB2YWx1ZSB3aWxsIGRlZmF1bHQKKyAgICAgKiB0byBzb21ldGhpbmcgbGlrZSAycywgaS5lLiBmb3IgYXBwbGljYXRpb25zIHRoYXQgaGF2ZSBzcGVjaWZpYworICAgICAqIGxhdGVuY3kgcmVxdWlyZW1lbnRzIHRoaXMgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0aGUgbWF4aW11bQorICAgICAqIGxhdGVuY3kgdGhhdCB0aGUgYXBwbGljYXRpb24gY2FuIGRlYWwgd2l0aC4gSWYKKyAgICAgKiBQQV9TVFJFQU1fQURKVVNUX0xBVEVOQ1kgaXMgc2V0IHRoZSBvdmVyYWxsIHNvdXJjZSBsYXRlbmN5IHdpbGwKKyAgICAgKiBiZSBhZGp1c3RlZCBhY2NvcmRpbmcgdG8gdGhpcyB2YWx1ZS4gSWYgaXQgaXMgbm90IHNldCB0aGUKKyAgICAgKiBzb3VyY2UgbGF0ZW5jeSBpcyBsZWZ0IHVubW9kaWZpZWQuICovCisKK30gcGFfYnVmZmVyX2F0dHI7CisKKy8qKiBFcnJvciB2YWx1ZXMgYXMgdXNlZCBieSBwYV9jb250ZXh0X2Vycm5vKCkuIFVzZSBwYV9zdHJlcnJvcigpIHRvIGNvbnZlcnQgdGhlc2UgdmFsdWVzIHRvIGh1bWFuIHJlYWRhYmxlIHN0cmluZ3MgKi8KK2VudW0geworICAgIFBBX09LID0gMCwgICAgICAgICAgICAgICAgICAgICAvKio8IE5vIGVycm9yICovCisgICAgUEFfRVJSX0FDQ0VTUywgICAgICAgICAgICAgICAgIC8qKjwgQWNjZXNzIGZhaWx1cmUgKi8KKyAgICBQQV9FUlJfQ09NTUFORCwgICAgICAgICAgICAgICAgLyoqPCBVbmtub3duIGNvbW1hbmQgKi8KKyAgICBQQV9FUlJfSU5WQUxJRCwgICAgICAgICAgICAgICAgLyoqPCBJbnZhbGlkIGFyZ3VtZW50ICovCisgICAgUEFfRVJSX0VYSVNULCAgICAgICAgICAgICAgICAgIC8qKjwgRW50aXR5IGV4aXN0cyAqLworICAgIFBBX0VSUl9OT0VOVElUWSwgICAgICAgICAgICAgICAvKio8IE5vIHN1Y2ggZW50aXR5ICovCisgICAgUEFfRVJSX0NPTk5FQ1RJT05SRUZVU0VELCAgICAgIC8qKjwgQ29ubmVjdGlvbiByZWZ1c2VkICovCisgICAgUEFfRVJSX1BST1RPQ09MLCAgICAgICAgICAgICAgIC8qKjwgUHJvdG9jb2wgZXJyb3IgKi8KKyAgICBQQV9FUlJfVElNRU9VVCwgICAgICAgICAgICAgICAgLyoqPCBUaW1lb3V0ICovCisgICAgUEFfRVJSX0FVVEhLRVksICAgICAgICAgICAgICAgIC8qKjwgTm8gYXV0aG9yaXphdGlvbiBrZXkgKi8KKyAgICBQQV9FUlJfSU5URVJOQUwsICAgICAgICAgICAgICAgLyoqPCBJbnRlcm5hbCBlcnJvciAqLworICAgIFBBX0VSUl9DT05ORUNUSU9OVEVSTUlOQVRFRCwgICAvKio8IENvbm5lY3Rpb24gdGVybWluYXRlZCAqLworICAgIFBBX0VSUl9LSUxMRUQsICAgICAgICAgICAgICAgICAvKio8IEVudGl0eSBraWxsZWQgKi8KKyAgICBQQV9FUlJfSU5WQUxJRFNFUlZFUiwgICAgICAgICAgLyoqPCBJbnZhbGlkIHNlcnZlciAqLworICAgIFBBX0VSUl9NT0RJTklURkFJTEVELCAgICAgICAgICAvKio8IE1vZHVsZSBpbml0aWFsaXphdGlvbiBmYWlsZWQgKi8KKyAgICBQQV9FUlJfQkFEU1RBVEUsICAgICAgICAgICAgICAgLyoqPCBCYWQgc3RhdGUgKi8KKyAgICBQQV9FUlJfTk9EQVRBLCAgICAgICAgICAgICAgICAgLyoqPCBObyBkYXRhICovCisgICAgUEFfRVJSX1ZFUlNJT04sICAgICAgICAgICAgICAgIC8qKjwgSW5jb21wYXRpYmxlIHByb3RvY29sIHZlcnNpb24gKi8KKyAgICBQQV9FUlJfVE9PTEFSR0UsICAgICAgICAgICAgICAgLyoqPCBEYXRhIHRvbyBsYXJnZSAqLworICAgIFBBX0VSUl9OT1RTVVBQT1JURUQsICAgICAgICAgICAvKio8IE9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIFxzaW5jZSAwLjkuNSAqLworICAgIFBBX0VSUl9VTktOT1dOLCAgICAgICAgICAgICAgICAvKio8IFRoZSBlcnJvciBjb2RlIHdhcyB1bmtub3duIHRvIHRoZSBjbGllbnQgKi8KKyAgICBQQV9FUlJfTk9FWFRFTlNJT04sICAgICAgICAgICAgLyoqPCBFeHRlbnNpb24gZG9lcyBub3QgZXhpc3QuIFxzaW5jZSAwLjkuMTIgKi8KKyAgICBQQV9FUlJfT0JTT0xFVEUsICAgICAgICAgICAgICAgLyoqPCBPYnNvbGV0ZSBmdW5jdGlvbmFsaXR5LiBcc2luY2UgMC45LjE1ICovCisgICAgUEFfRVJSX05PVElNUExFTUVOVEVELCAgICAgICAgIC8qKjwgTWlzc2luZyBpbXBsZW1lbnRhdGlvbi4gXHNpbmNlIDAuOS4xNSAqLworICAgIFBBX0VSUl9GT1JLRUQsICAgICAgICAgICAgICAgICAvKio8IFRoZSBjYWxsZXIgZm9ya2VkIHdpdGhvdXQgY2FsbGluZyBleGVjdmUoKSBhbmQgdHJpZWQgdG8gcmV1c2UgdGhlIGNvbnRleHQuIFxzaW5jZSAwLjkuMTUgKi8KKyAgICBQQV9FUlJfSU8sICAgICAgICAgICAgICAgICAgICAgLyoqPCBBbiBJTyBlcnJvciBoYXBwZW5lZC4gXHNpbmNlIDAuOS4xNiAqLworICAgIFBBX0VSUl9CVVNZLCAgICAgICAgICAgICAgICAgICAvKio8IERldmljZSBvciByZXNvdXJjZSBidXN5LiBcc2luY2UgMC45LjE3ICovCisgICAgUEFfRVJSX01BWCAgICAgICAgICAgICAgICAgICAgIC8qKjwgTm90IHJlYWxseSBhbiBlcnJvciBidXQgdGhlIGZpcnN0IGludmFsaWQgZXJyb3IgY29kZSAqLworfTsKKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisjZGVmaW5lIFBBX09LIFBBX09LCisjZGVmaW5lIFBBX0VSUl9BQ0NFU1MgUEFfRVJSX0FDQ0VTUworI2RlZmluZSBQQV9FUlJfQ09NTUFORCBQQV9FUlJfQ09NTUFORAorI2RlZmluZSBQQV9FUlJfSU5WQUxJRCBQQV9FUlJfSU5WQUxJRAorI2RlZmluZSBQQV9FUlJfRVhJU1QgUEFfRVJSX0VYSVNUCisjZGVmaW5lIFBBX0VSUl9OT0VOVElUWSBQQV9FUlJfTk9FTlRJVFkKKyNkZWZpbmUgUEFfRVJSX0NPTk5FQ1RJT05SRUZVU0VEIFBBX0VSUl9DT05ORUNUSU9OUkVGVVNFRAorI2RlZmluZSBQQV9FUlJfUFJPVE9DT0wgUEFfRVJSX1BST1RPQ09MCisjZGVmaW5lIFBBX0VSUl9USU1FT1VUIFBBX0VSUl9USU1FT1VUCisjZGVmaW5lIFBBX0VSUl9BVVRIS0VZIFBBX0VSUl9BVVRIS0VZCisjZGVmaW5lIFBBX0VSUl9JTlRFUk5BTCBQQV9FUlJfSU5URVJOQUwKKyNkZWZpbmUgUEFfRVJSX0NPTk5FQ1RJT05URVJNSU5BVEVEIFBBX0VSUl9DT05ORUNUSU9OVEVSTUlOQVRFRAorI2RlZmluZSBQQV9FUlJfS0lMTEVEIFBBX0VSUl9LSUxMRUQKKyNkZWZpbmUgUEFfRVJSX0lOVkFMSURTRVJWRVIgUEFfRVJSX0lOVkFMSURTRVJWRVIKKyNkZWZpbmUgUEFfRVJSX01PRElOSVRGQUlMRUQgUEFfRVJSX01PRElOSVRGQUlMRUQKKyNkZWZpbmUgUEFfRVJSX0JBRFNUQVRFIFBBX0VSUl9CQURTVEFURQorI2RlZmluZSBQQV9FUlJfTk9EQVRBIFBBX0VSUl9OT0RBVEEKKyNkZWZpbmUgUEFfRVJSX1ZFUlNJT04gUEFfRVJSX1ZFUlNJT04KKyNkZWZpbmUgUEFfRVJSX1RPT0xBUkdFIFBBX0VSUl9UT09MQVJHRQorI2RlZmluZSBQQV9FUlJfTk9UU1VQUE9SVEVEIFBBX0VSUl9OT1RTVVBQT1JURUQKKyNkZWZpbmUgUEFfRVJSX1VOS05PV04gUEFfRVJSX1VOS05PV04KKyNkZWZpbmUgUEFfRVJSX05PRVhURU5TSU9OIFBBX0VSUl9OT0VYVEVOU0lPTgorI2RlZmluZSBQQV9FUlJfT0JTT0xFVEUgUEFfRVJSX09CU09MRVRFCisjZGVmaW5lIFBBX0VSUl9OT1RJTVBMRU1FTlRFRCBQQV9FUlJfTk9USU1QTEVNRU5URUQKKyNkZWZpbmUgUEFfRVJSX0ZPUktFRCBQQV9FUlJfRk9SS0VECisjZGVmaW5lIFBBX0VSUl9NQVggUEFfRVJSX01BWAorLyoqIFxlbmRjb25kICovCisKKy8qKiBTdWJzY3JpcHRpb24gZXZlbnQgbWFzaywgYXMgdXNlZCBieSBwYV9jb250ZXh0X3N1YnNjcmliZSgpICovCit0eXBlZGVmIGVudW0gcGFfc3Vic2NyaXB0aW9uX21hc2sgeworICAgIFBBX1NVQlNDUklQVElPTl9NQVNLX05VTEwgPSAweDAwMDBVLAorICAgIC8qKjwgTm8gZXZlbnRzICovCisKKyAgICBQQV9TVUJTQ1JJUFRJT05fTUFTS19TSU5LID0gMHgwMDAxVSwKKyAgICAvKio8IFNpbmsgZXZlbnRzICovCisKKyAgICBQQV9TVUJTQ1JJUFRJT05fTUFTS19TT1VSQ0UgPSAweDAwMDJVLAorICAgIC8qKjwgU291cmNlIGV2ZW50cyAqLworCisgICAgUEFfU1VCU0NSSVBUSU9OX01BU0tfU0lOS19JTlBVVCA9IDB4MDAwNFUsCisgICAgLyoqPCBTaW5rIGlucHV0IGV2ZW50cyAqLworCisgICAgUEFfU1VCU0NSSVBUSU9OX01BU0tfU09VUkNFX09VVFBVVCA9IDB4MDAwOFUsCisgICAgLyoqPCBTb3VyY2Ugb3V0cHV0IGV2ZW50cyAqLworCisgICAgUEFfU1VCU0NSSVBUSU9OX01BU0tfTU9EVUxFID0gMHgwMDEwVSwKKyAgICAvKio8IE1vZHVsZSBldmVudHMgKi8KKworICAgIFBBX1NVQlNDUklQVElPTl9NQVNLX0NMSUVOVCA9IDB4MDAyMFUsCisgICAgLyoqPCBDbGllbnQgZXZlbnRzICovCisKKyAgICBQQV9TVUJTQ1JJUFRJT05fTUFTS19TQU1QTEVfQ0FDSEUgPSAweDAwNDBVLAorICAgIC8qKjwgU2FtcGxlIGNhY2hlIGV2ZW50cyAqLworCisgICAgUEFfU1VCU0NSSVBUSU9OX01BU0tfU0VSVkVSID0gMHgwMDgwVSwKKyAgICAvKio8IE90aGVyIGdsb2JhbCBzZXJ2ZXIgY2hhbmdlcy4gKi8KKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisgICAgUEFfU1VCU0NSSVBUSU9OX01BU0tfQVVUT0xPQUQgPSAweDAxMDBVLAorICAgIC8qKjwgXGRlcHJlY2F0ZWQgQXV0b2xvYWQgdGFibGUgZXZlbnRzLiAqLworLyoqIFxlbmRjb25kICovCisKKyAgICBQQV9TVUJTQ1JJUFRJT05fTUFTS19DQVJEID0gMHgwMjAwVSwKKyAgICAvKio8IENhcmQgZXZlbnRzLiBcc2luY2UgMC45LjE1ICovCisKKyAgICBQQV9TVUJTQ1JJUFRJT05fTUFTS19BTEwgPSAweDAyZmZVCisgICAgLyoqPCBDYXRjaCBhbGwgZXZlbnRzICovCit9IHBhX3N1YnNjcmlwdGlvbl9tYXNrX3Q7CisKKy8qKiBTdWJzY3JpcHRpb24gZXZlbnQgdHlwZXMsIGFzIHVzZWQgYnkgcGFfY29udGV4dF9zdWJzY3JpYmUoKSAqLwordHlwZWRlZiBlbnVtIHBhX3N1YnNjcmlwdGlvbl9ldmVudF90eXBlIHsKKyAgICBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU0lOSyA9IDB4MDAwMFUsCisgICAgLyoqPCBFdmVudCB0eXBlOiBTaW5rICovCisKKyAgICBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU09VUkNFID0gMHgwMDAxVSwKKyAgICAvKio8IEV2ZW50IHR5cGU6IFNvdXJjZSAqLworCisgICAgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NJTktfSU5QVVQgPSAweDAwMDJVLAorICAgIC8qKjwgRXZlbnQgdHlwZTogU2luayBpbnB1dCAqLworCisgICAgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NPVVJDRV9PVVRQVVQgPSAweDAwMDNVLAorICAgIC8qKjwgRXZlbnQgdHlwZTogU291cmNlIG91dHB1dCAqLworCisgICAgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX01PRFVMRSA9IDB4MDAwNFUsCisgICAgLyoqPCBFdmVudCB0eXBlOiBNb2R1bGUgKi8KKworICAgIFBBX1NVQlNDUklQVElPTl9FVkVOVF9DTElFTlQgPSAweDAwMDVVLAorICAgIC8qKjwgRXZlbnQgdHlwZTogQ2xpZW50ICovCisKKyAgICBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU0FNUExFX0NBQ0hFID0gMHgwMDA2VSwKKyAgICAvKio8IEV2ZW50IHR5cGU6IFNhbXBsZSBjYWNoZSBpdGVtICovCisKKyAgICBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU0VSVkVSID0gMHgwMDA3VSwKKyAgICAvKio8IEV2ZW50IHR5cGU6IEdsb2JhbCBzZXJ2ZXIgY2hhbmdlLCBvbmx5IG9jY3VycmluZyB3aXRoIFBBX1NVQlNDUklQVElPTl9FVkVOVF9DSEFOR0UuICovCisKKy8qKiBcY29uZCBmdWxsZG9jcyAqLworICAgIFBBX1NVQlNDUklQVElPTl9FVkVOVF9BVVRPTE9BRCA9IDB4MDAwOFUsCisgICAgLyoqPCBcZGVwcmVjYXRlZCBFdmVudCB0eXBlOiBBdXRvbG9hZCB0YWJsZSBjaGFuZ2VzLiAqLworLyoqIFxlbmRjb25kICovCisKKyAgICBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfQ0FSRCA9IDB4MDAwOVUsCisgICAgLyoqPCBFdmVudCB0eXBlOiBDYXJkIFxzaW5jZSAwLjkuMTUgKi8KKworICAgIFBBX1NVQlNDUklQVElPTl9FVkVOVF9GQUNJTElUWV9NQVNLID0gMHgwMDBGVSwKKyAgICAvKio8IEEgbWFzayB0byBleHRyYWN0IHRoZSBldmVudCB0eXBlIGZyb20gYW4gZXZlbnQgdmFsdWUgKi8KKworICAgIFBBX1NVQlNDUklQVElPTl9FVkVOVF9ORVcgPSAweDAwMDBVLAorICAgIC8qKjwgQSBuZXcgb2JqZWN0IHdhcyBjcmVhdGVkICovCisKKyAgICBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfQ0hBTkdFID0gMHgwMDEwVSwKKyAgICAvKio8IEEgcHJvcGVydHkgb2YgdGhlIG9iamVjdCB3YXMgbW9kaWZpZWQgKi8KKworICAgIFBBX1NVQlNDUklQVElPTl9FVkVOVF9SRU1PVkUgPSAweDAwMjBVLAorICAgIC8qKjwgQW4gb2JqZWN0IHdhcyByZW1vdmVkICovCisKKyAgICBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfVFlQRV9NQVNLID0gMHgwMDMwVQorICAgIC8qKjwgQSBtYXNrIHRvIGV4dHJhY3QgdGhlIGV2ZW50IG9wZXJhdGlvbiBmcm9tIGFuIGV2ZW50IHZhbHVlICovCisKK30gcGFfc3Vic2NyaXB0aW9uX2V2ZW50X3R5cGVfdDsKKworLyoqIFJldHVybiBvbmUgaWYgYW4gZXZlbnQgdHlwZSB0IG1hdGNoZXMgYW4gZXZlbnQgbWFzayBiaXRmaWVsZCAqLworI2RlZmluZSBwYV9zdWJzY3JpcHRpb25fbWF0Y2hfZmxhZ3MobSwgdCkgKCEhKChtKSAmICgxIDw8ICgodCkgJiBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfRkFDSUxJVFlfTUFTSykpKSkKKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisjZGVmaW5lIFBBX1NVQlNDUklQVElPTl9NQVNLX05VTEwgUEFfU1VCU0NSSVBUSU9OX01BU0tfTlVMTAorI2RlZmluZSBQQV9TVUJTQ1JJUFRJT05fTUFTS19TSU5LIFBBX1NVQlNDUklQVElPTl9NQVNLX1NJTksKKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX01BU0tfU09VUkNFIFBBX1NVQlNDUklQVElPTl9NQVNLX1NPVVJDRQorI2RlZmluZSBQQV9TVUJTQ1JJUFRJT05fTUFTS19TSU5LX0lOUFVUIFBBX1NVQlNDUklQVElPTl9NQVNLX1NJTktfSU5QVVQKKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX01BU0tfU09VUkNFX09VVFBVVCBQQV9TVUJTQ1JJUFRJT05fTUFTS19TT1VSQ0VfT1VUUFVUCisjZGVmaW5lIFBBX1NVQlNDUklQVElPTl9NQVNLX01PRFVMRSBQQV9TVUJTQ1JJUFRJT05fTUFTS19NT0RVTEUKKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX01BU0tfQ0xJRU5UIFBBX1NVQlNDUklQVElPTl9NQVNLX0NMSUVOVAorI2RlZmluZSBQQV9TVUJTQ1JJUFRJT05fTUFTS19TQU1QTEVfQ0FDSEUgUEFfU1VCU0NSSVBUSU9OX01BU0tfU0FNUExFX0NBQ0hFCisjZGVmaW5lIFBBX1NVQlNDUklQVElPTl9NQVNLX1NFUlZFUiBQQV9TVUJTQ1JJUFRJT05fTUFTS19TRVJWRVIKKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX01BU0tfQVVUT0xPQUQgUEFfU1VCU0NSSVBUSU9OX01BU0tfQVVUT0xPQUQKKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX01BU0tfQ0FSRCBQQV9TVUJTQ1JJUFRJT05fTUFTS19DQVJECisjZGVmaW5lIFBBX1NVQlNDUklQVElPTl9NQVNLX0FMTCBQQV9TVUJTQ1JJUFRJT05fTUFTS19BTEwKKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NJTksgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NJTksKKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NPVVJDRSBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU09VUkNFCisjZGVmaW5lIFBBX1NVQlNDUklQVElPTl9FVkVOVF9TSU5LX0lOUFVUIFBBX1NVQlNDUklQVElPTl9FVkVOVF9TSU5LX0lOUFVUCisjZGVmaW5lIFBBX1NVQlNDUklQVElPTl9FVkVOVF9TT1VSQ0VfT1VUUFVUIFBBX1NVQlNDUklQVElPTl9FVkVOVF9TT1VSQ0VfT1VUUFVUCisjZGVmaW5lIFBBX1NVQlNDUklQVElPTl9FVkVOVF9NT0RVTEUgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX01PRFVMRQorI2RlZmluZSBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfQ0xJRU5UIFBBX1NVQlNDUklQVElPTl9FVkVOVF9DTElFTlQKKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NBTVBMRV9DQUNIRSBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU0FNUExFX0NBQ0hFCisjZGVmaW5lIFBBX1NVQlNDUklQVElPTl9FVkVOVF9TRVJWRVIgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NFUlZFUgorI2RlZmluZSBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfQVVUT0xPQUQgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX0FVVE9MT0FECisjZGVmaW5lIFBBX1NVQlNDUklQVElPTl9FVkVOVF9DQVJEIFBBX1NVQlNDUklQVElPTl9FVkVOVF9DQVJECisjZGVmaW5lIFBBX1NVQlNDUklQVElPTl9FVkVOVF9GQUNJTElUWV9NQVNLIFBBX1NVQlNDUklQVElPTl9FVkVOVF9GQUNJTElUWV9NQVNLCisjZGVmaW5lIFBBX1NVQlNDUklQVElPTl9FVkVOVF9ORVcgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX05FVworI2RlZmluZSBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfQ0hBTkdFIFBBX1NVQlNDUklQVElPTl9FVkVOVF9DSEFOR0UKKyNkZWZpbmUgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1JFTU9WRSBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfUkVNT1ZFCisjZGVmaW5lIFBBX1NVQlNDUklQVElPTl9FVkVOVF9UWVBFX01BU0sgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1RZUEVfTUFTSworLyoqIFxlbmRjb25kICovCisKKy8qKiBBIHN0cnVjdHVyZSBmb3IgYWxsIGtpbmRzIG9mIHRpbWluZyBpbmZvcm1hdGlvbiBvZiBhIHN0cmVhbS4gU2VlCisgKiBwYV9zdHJlYW1fdXBkYXRlX3RpbWluZ19pbmZvKCkgYW5kIHBhX3N0cmVhbV9nZXRfdGltaW5nX2luZm8oKS4gVGhlCisgKiB0b3RhbCBvdXRwdXQgbGF0ZW5jeSBhIHNhbXBsZSB0aGF0IGlzIHdyaXR0ZW4gd2l0aAorICogcGFfc3RyZWFtX3dyaXRlKCkgdGFrZXMgdG8gYmUgcGxheWVkIG1heSBiZSBlc3RpbWF0ZWQgYnkKKyAqIHNpbmtfdXNlYytidWZmZXJfdXNlYyt0cmFuc3BvcnRfdXNlYy4gKHdoZXJlIGJ1ZmZlcl91c2VjIGlzIGRlZmluZWQKKyAqIGFzIHBhX2J5dGVzX3RvX3VzZWMod3JpdGVfaW5kZXgtcmVhZF9pbmRleCkpIFRoZSBvdXRwdXQgYnVmZmVyCisgKiB3aGljaCBidWZmZXJfdXNlYyByZWxhdGVzIHRvIG1heSBiZSBtYW5pcHVsYXRlZCBmcmVlbHkgKHdpdGgKKyAqIHBhX3N0cmVhbV93cml0ZSgpJ3Mgc2VlayBhcmd1bWVudCwgcGFfc3RyZWFtX2ZsdXNoKCkgYW5kIGZyaWVuZHMpLAorICogdGhlIGJ1ZmZlcnMgc2lua191c2VjIGFuZCBzb3VyY2VfdXNlYyByZWxhdGUgdG8gYXJlIGZpcnN0LWluCisgKiBmaXJzdC1vdXQgKEZJRk8pIGJ1ZmZlcnMgd2hpY2ggY2Fubm90IGJlIGZsdXNoZWQgb3IgbWFuaXB1bGF0ZWQgaW4KKyAqIGFueSB3YXkuIFRoZSB0b3RhbCBpbnB1dCBsYXRlbmN5IGEgc2FtcGxlIHRoYXQgaXMgcmVjb3JkZWQgdGFrZXMgdG8KKyAqIGJlIGRlbGl2ZXJlZCB0byB0aGUgYXBwbGljYXRpb24gaXM6CisgKiBzb3VyY2VfdXNlYytidWZmZXJfdXNlYyt0cmFuc3BvcnRfdXNlYy1zaW5rX3VzZWMuIChUYWtlIGNhcmUgb2YKKyAqIHNpZ24gaXNzdWVzISkgV2hlbiBjb25uZWN0ZWQgdG8gYSBtb25pdG9yIHNvdXJjZSBzaW5rX3VzZWMgY29udGFpbnMKKyAqIHRoZSBsYXRlbmN5IG9mIHRoZSBvd25pbmcgc2luay4gVGhlIHR3byBsYXRlbmN5IGVzdGltYXRpb25zCisgKiBkZXNjcmliZWQgaGVyZSBhcmUgaW1wbGVtZW50ZWQgaW4gcGFfc3RyZWFtX2dldF9sYXRlbmN5KCkuIFBsZWFzZQorICogbm90ZSB0aGF0IHRoaXMgc3RydWN0dXJlIGNhbiBiZSBleHRlbmRlZCBhcyBwYXJ0IG9mIGV2b2x1dGlvbmFyeQorICogQVBJIHVwZGF0ZXMgYXQgYW55IHRpbWUgaW4gYW55IG5ldyByZWxlYXNlLiovCit0eXBlZGVmIHN0cnVjdCBwYV90aW1pbmdfaW5mbyB7CisgICAgc3RydWN0IHRpbWV2YWwgdGltZXN0YW1wOworICAgIC8qKjwgVGhlIHRpbWUgd2hlbiB0aGlzIHRpbWluZyBpbmZvIHN0cnVjdHVyZSB3YXMgY3VycmVudCAqLworCisgICAgaW50IHN5bmNocm9uaXplZF9jbG9ja3M7CisgICAgLyoqPCBOb24temVybyBpZiB0aGUgbG9jYWwgYW5kIHRoZSByZW1vdGUgbWFjaGluZSBoYXZlCisgICAgICogc3luY2hyb25pemVkIGNsb2Nrcy4gSWYgc3luY2hyb25pemVkIGNsb2NrcyBhcmUgZGV0ZWN0ZWQKKyAgICAgKiB0cmFuc3BvcnRfdXNlYyBiZWNvbWVzIG11Y2ggbW9yZSByZWxpYWJsZS4gSG93ZXZlciwgdGhlIGNvZGUKKyAgICAgKiB0aGF0IGRldGVjdHMgc3luY2hyb25pemVkIGNsb2NrcyBpcyB2ZXJ5IGxpbWl0ZWQgYW5kIHVucmVsaWFibGUKKyAgICAgKiBpdHNlbGYuICovCisKKyAgICBwYV91c2VjX3Qgc2lua191c2VjOworICAgIC8qKjwgVGltZSBpbiB1c2VjcyBhIHNhbXBsZSB0YWtlcyB0byBiZSBwbGF5ZWQgb24gdGhlIHNpbmsuIEZvcgorICAgICAqIHBsYXliYWNrIHN0cmVhbXMgYW5kIHJlY29yZCBzdHJlYW1zIGNvbm5lY3RlZCB0byBhIG1vbml0b3IKKyAgICAgKiBzb3VyY2UuICovCisKKyAgICBwYV91c2VjX3Qgc291cmNlX3VzZWM7CisgICAgLyoqPCBUaW1lIGluIHVzZWNzIGEgc2FtcGxlIHRha2VzIGZyb20gYmVpbmcgcmVjb3JkZWQgdG8gYmVpbmcKKyAgICAgKiBkZWxpdmVyZWQgdG8gdGhlIGFwcGxpY2F0aW9uLiBPbmx5IGZvciByZWNvcmQgc3RyZWFtcy4gKi8KKworICAgIHBhX3VzZWNfdCB0cmFuc3BvcnRfdXNlYzsKKyAgICAvKio8IEVzdGltYXRlZCB0aW1lIGluIHVzZWNzIGEgc2FtcGxlIHRha2VzIHRvIGJlIHRyYW5zZmVycmVkCisgICAgICogdG8vZnJvbSB0aGUgZGFlbW9uLiBGb3IgYm90aCBwbGF5YmFjayBhbmQgcmVjb3JkIHN0cmVhbXMuICovCisKKyAgICBpbnQgcGxheWluZzsKKyAgICAvKio8IE5vbi16ZXJvIHdoZW4gdGhlIHN0cmVhbSBpcyBjdXJyZW50bHkgbm90IHVuZGVycnVuIGFuZCBkYXRhCisgICAgICogaXMgYmVpbmcgcGFzc2VkIG9uIHRvIHRoZSBkZXZpY2UuIE9ubHkgZm9yIHBsYXliYWNrCisgICAgICogc3RyZWFtcy4gVGhpcyBmaWVsZCBkb2VzIG5vdCBzYXkgd2hldGhlciB0aGUgZGF0YSBpcyBhY3R1YWxseQorICAgICAqIGFscmVhZHkgYmVpbmcgcGxheWVkLiBUbyBkZXRlcm1pbmUgdGhpcyBjaGVjayB3aGV0aGVyCisgICAgICogc2luY2VfdW5kZXJydW4gKGNvbnZlcnRlZCB0byB1c2VjKSBpcyBsYXJnZXIgdGhhbiBzaW5rX3VzZWMuKi8KKworICAgIGludCB3cml0ZV9pbmRleF9jb3JydXB0OworICAgIC8qKjwgTm9uLXplcm8gaWYgd3JpdGVfaW5kZXggaXMgbm90IHVwLXRvLWRhdGUgYmVjYXVzZSBhIGxvY2FsCisgICAgICogd3JpdGUgY29tbWFuZCB0aGF0IGNvcnJ1cHRlZCBpdCBoYXMgYmVlbiBpc3N1ZWQgaW4gdGhlIHRpbWUKKyAgICAgKiBzaW5jZSB0aGlzIGxhdGVuY3kgaW5mbyB3YXMgY3VycmVudCAuIE9ubHkgd3JpdGUgY29tbWFuZHMgd2l0aAorICAgICAqIFNFRUtfUkVMQVRJVkVfT05fUkVBRCBhbmQgU0VFS19SRUxBVElWRV9FTkQgY2FuIGNvcnJ1cHQKKyAgICAgKiB3cml0ZV9pbmRleC4gKi8KKworICAgIGludDY0X3Qgd3JpdGVfaW5kZXg7CisgICAgLyoqPCBDdXJyZW50IHdyaXRlIGluZGV4IGludG8gdGhlIHBsYXliYWNrIGJ1ZmZlciBpbiBieXRlcy4gVGhpbmsKKyAgICAgKiB0d2ljZSBiZWZvcmUgdXNpbmcgdGhpcyBmb3Igc2Vla2luZyBwdXJwb3NlczogaXQgbWlnaHQgYmUgb3V0CisgICAgICogb2YgZGF0ZSBhIHRoZSB0aW1lIHlvdSB3YW50IHRvIHVzZSBpdC4gQ29uc2lkZXIgdXNpbmcKKyAgICAgKiBQQV9TRUVLX1JFTEFUSVZFIGluc3RlYWQuICovCisKKyAgICBpbnQgcmVhZF9pbmRleF9jb3JydXB0OworICAgIC8qKjwgTm9uLXplcm8gaWYgcmVhZF9pbmRleCBpcyBub3QgdXAtdG8tZGF0ZSBiZWNhdXNlIGEgbG9jYWwKKyAgICAgKiBwYXVzZSBvciBmbHVzaCByZXF1ZXN0IHRoYXQgY29ycnVwdGVkIGl0IGhhcyBiZWVuIGlzc3VlZCBpbiB0aGUKKyAgICAgKiB0aW1lIHNpbmNlIHRoaXMgbGF0ZW5jeSBpbmZvIHdhcyBjdXJyZW50LiAqLworCisgICAgaW50NjRfdCByZWFkX2luZGV4OworICAgIC8qKjwgQ3VycmVudCByZWFkIGluZGV4IGludG8gdGhlIHBsYXliYWNrIGJ1ZmZlciBpbiBieXRlcy4gVGhpbmsKKyAgICAgKiB0d2ljZSBiZWZvcmUgdXNpbmcgdGhpcyBmb3Igc2Vla2luZyBwdXJwb3NlczogaXQgbWlnaHQgYmUgb3V0CisgICAgICogb2YgZGF0ZSBhIHRoZSB0aW1lIHlvdSB3YW50IHRvIHVzZSBpdC4gQ29uc2lkZXIgdXNpbmcKKyAgICAgKiBQQV9TRUVLX1JFTEFUSVZFX09OX1JFQUQgaW5zdGVhZC4gKi8KKworICAgIHBhX3VzZWNfdCBjb25maWd1cmVkX3NpbmtfdXNlYzsKKyAgICAvKio8IFRoZSBjb25maWd1cmVkIGxhdGVuY3kgZm9yIHRoZSBzaW5rLiBcc2luY2UgMC45LjExICovCisKKyAgICBwYV91c2VjX3QgY29uZmlndXJlZF9zb3VyY2VfdXNlYzsKKyAgICAvKio8IFRoZSBjb25maWd1cmVkIGxhdGVuY3kgZm9yIHRoZSBzb3VyY2UuIFxzaW5jZSAwLjkuMTEgKi8KKworICAgIGludDY0X3Qgc2luY2VfdW5kZXJydW47CisgICAgLyoqPCBCeXRlcyB0aGF0IHdlcmUgaGFuZGVkIHRvIHRoZSBzaW5rIHNpbmNlIHRoZSBsYXN0IHVuZGVycnVuCisgICAgICogaGFwcGVuZWQsIG9yIHNpbmNlIHBsYXliYWNrIHN0YXJ0ZWQgYWdhaW4gYWZ0ZXIgdGhlIGxhc3QKKyAgICAgKiB1bmRlcnJ1bi4gcGxheWluZyB3aWxsIHRlbGwgeW91IHdoaWNoIGNhc2UgaXQgaXMuIFxzaW5jZQorICAgICAqIDAuOS4xMSAqLworCit9IHBhX3RpbWluZ19pbmZvOworCisvKiogQSBzdHJ1Y3R1cmUgZm9yIHRoZSBzcGF3biBhcGkuIFRoaXMgbWF5IGJlIHVzZWQgdG8gaW50ZWdyYXRlIGF1dG8KKyAqIHNwYXduZWQgZGFlbW9ucyBpbnRvIHlvdXIgYXBwbGljYXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZQorICogcGFfY29udGV4dF9jb25uZWN0KCkuIFdoZW4gc3Bhd25pbmcgYSBuZXcgY2hpbGQgcHJvY2VzcyB0aGUKKyAqIHdhaXRwaWQoKSBpcyB1c2VkIG9uIHRoZSBjaGlsZCdzIFBJRC4gVGhlIHNwYXduIHJvdXRpbmUgd2lsbCBub3QKKyAqIGJsb2NrIG9yIGlnbm9yZSBTSUdDSExEIHNpZ25hbHMsIHNpbmNlIHRoaXMgY2Fubm90IGJlIGRvbmUgaW4gYQorICogdGhyZWFkIGNvbXBhdGlibGUgd2F5LiBZb3UgbWlnaHQgaGF2ZSB0byBkbyB0aGlzIGluCisgKiBwcmVmb3JrL3Bvc3Rmb3JrLiAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfc3Bhd25fYXBpIHsKKyAgICB2b2lkICgqcHJlZm9yaykodm9pZCk7CisgICAgLyoqPCBJcyBjYWxsZWQganVzdCBiZWZvcmUgdGhlIGZvcmsgaW4gdGhlIHBhcmVudCBwcm9jZXNzLiBNYXkgYmUKKyAgICAgKiBOVUxMLiAqLworCisgICAgdm9pZCAoKnBvc3Rmb3JrKSh2b2lkKTsKKyAgICAvKio8IElzIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgZm9yayBpbiB0aGUgcGFyZW50CisgICAgICogcHJvY2Vzcy4gTWF5IGJlIE5VTEwuKi8KKworICAgIHZvaWQgKCphdGZvcmspKHZvaWQpOworICAgIC8qKjwgSXMgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmb3JrIGluIHRoZSBjaGlsZAorICAgICAqIHByb2Nlc3MuIE1heSBiZSBOVUxMLiBJdCBpcyBub3Qgc2FmZSB0byBjbG9zZSBhbGwgZmlsZQorICAgICAqIGRlc2NyaXB0b3JzIGluIHRoaXMgZnVuY3Rpb24gdW5jb25kaXRpb25hbGx5LCBzaW5jZSBhIFVOSVgKKyAgICAgKiBzb2NrZXQgKGNyZWF0ZWQgdXNpbmcgc29ja2V0cGFpcigpKSBpcyBwYXNzZWQgdG8gdGhlIG5ldworICAgICAqIHByb2Nlc3MuICovCit9IHBhX3NwYXduX2FwaTsKKworLyoqIFNlZWsgdHlwZSBmb3IgcGFfc3RyZWFtX3dyaXRlKCkuICovCit0eXBlZGVmIGVudW0gcGFfc2Vla19tb2RlIHsKKyAgICBQQV9TRUVLX1JFTEFUSVZFID0gMCwKKyAgICAvKio8IFNlZWsgcmVsYXRpdmVseSB0byB0aGUgd3JpdGUgaW5kZXggKi8KKworICAgIFBBX1NFRUtfQUJTT0xVVEUgPSAxLAorICAgIC8qKjwgU2VlayByZWxhdGl2ZWx5IHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIHF1ZXVlICovCisKKyAgICBQQV9TRUVLX1JFTEFUSVZFX09OX1JFQUQgPSAyLAorICAgIC8qKjwgU2VlayByZWxhdGl2ZWx5IHRvIHRoZSByZWFkIGluZGV4LiAgKi8KKworICAgIFBBX1NFRUtfUkVMQVRJVkVfRU5EID0gMworICAgIC8qKjwgU2VlayByZWxhdGl2ZWx5IHRvIHRoZSBjdXJyZW50IGVuZCBvZiB0aGUgYnVmZmVyIHF1ZXVlLiAqLworfSBwYV9zZWVrX21vZGVfdDsKKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisjZGVmaW5lIFBBX1NFRUtfUkVMQVRJVkUgUEFfU0VFS19SRUxBVElWRQorI2RlZmluZSBQQV9TRUVLX0FCU09MVVRFIFBBX1NFRUtfQUJTT0xVVEUKKyNkZWZpbmUgUEFfU0VFS19SRUxBVElWRV9PTl9SRUFEIFBBX1NFRUtfUkVMQVRJVkVfT05fUkVBRAorI2RlZmluZSBQQV9TRUVLX1JFTEFUSVZFX0VORCBQQV9TRUVLX1JFTEFUSVZFX0VORAorLyoqIFxlbmRjb25kICovCisKKy8qKiBTcGVjaWFsIHNpbmsgZmxhZ3MuICovCit0eXBlZGVmIGVudW0gcGFfc2lua19mbGFncyB7CisgICAgUEFfU0lOS19OT0ZMQUdTID0gMHgwMDAwVSwKKyAgICAvKio8IEZsYWcgdG8gcGFzcyB3aGVuIG5vIHNwZWNpZmljIG9wdGlvbnMgYXJlIG5lZWRlZCAodXNlZCB0byBhdm9pZCBjYXN0aW5nKSAgXHNpbmNlIDAuOS4xOSAqLworCisgICAgUEFfU0lOS19IV19WT0xVTUVfQ1RSTCA9IDB4MDAwMVUsCisgICAgLyoqPCBTdXBwb3J0cyBoYXJkd2FyZSB2b2x1bWUgY29udHJvbC4gVGhpcyBpcyBhIGR5bmFtaWMgZmxhZyBhbmQgbWF5CisgICAgICogY2hhbmdlIGF0IHJ1bnRpbWUgYWZ0ZXIgdGhlIHNpbmsgaGFzIGluaXRpYWxpemVkICovCisKKyAgICBQQV9TSU5LX0xBVEVOQ1kgPSAweDAwMDJVLAorICAgIC8qKjwgU3VwcG9ydHMgbGF0ZW5jeSBxdWVyeWluZyAqLworCisgICAgUEFfU0lOS19IQVJEV0FSRSA9IDB4MDAwNFUsCisgICAgLyoqPCBJcyBhIGhhcmR3YXJlIHNpbmsgb2Ygc29tZSBraW5kLCBpbiBjb250cmFzdCB0bworICAgICAqICJ2aXJ0dWFsIi9zb2Z0d2FyZSBzaW5rcyBcc2luY2UgMC45LjMgKi8KKworICAgIFBBX1NJTktfTkVUV09SSyA9IDB4MDAwOFUsCisgICAgLyoqPCBJcyBhIG5ldHdvcmtlZCBzaW5rIG9mIHNvbWUga2luZC4gXHNpbmNlIDAuOS43ICovCisKKyAgICBQQV9TSU5LX0hXX01VVEVfQ1RSTCA9IDB4MDAxMFUsCisgICAgLyoqPCBTdXBwb3J0cyBoYXJkd2FyZSBtdXRlIGNvbnRyb2wuIFRoaXMgaXMgYSBkeW5hbWljIGZsYWcgYW5kIG1heQorICAgICAqIGNoYW5nZSBhdCBydW50aW1lIGFmdGVyIHRoZSBzaW5rIGhhcyBpbml0aWFsaXplZCBcc2luY2UgMC45LjExICovCisKKyAgICBQQV9TSU5LX0RFQ0lCRUxfVk9MVU1FID0gMHgwMDIwVSwKKyAgICAvKio8IFZvbHVtZSBjYW4gYmUgdHJhbnNsYXRlZCB0byBkQiB3aXRoIHBhX3N3X3ZvbHVtZV90b19kQigpLiBUaGlzIGlzIGEKKyAgICAgKiBkeW5hbWljIGZsYWcgYW5kIG1heSBjaGFuZ2UgYXQgcnVudGltZSBhZnRlciB0aGUgc2luayBoYXMgaW5pdGlhbGl6ZWQKKyAgICAgKiBcc2luY2UgMC45LjExICovCisKKyAgICBQQV9TSU5LX0ZMQVRfVk9MVU1FID0gMHgwMDQwVSwKKyAgICAvKio8IFRoaXMgc2luayBpcyBpbiBmbGF0IHZvbHVtZSBtb2RlLCBpLmUuIGFsd2F5cyB0aGUgbWF4aW11bSBvZgorICAgICAqIHRoZSB2b2x1bWUgb2YgYWxsIGNvbm5lY3RlZCBpbnB1dHMuIFxzaW5jZSAwLjkuMTUgKi8KKworICAgIFBBX1NJTktfRFlOQU1JQ19MQVRFTkNZID0gMHgwMDgwVSwKKyAgICAvKio8IFRoZSBsYXRlbmN5IGNhbiBiZSBhZGp1c3RlZCBkeW5hbWljYWxseSBkZXBlbmRpbmcgb24gdGhlCisgICAgICogbmVlZHMgb2YgdGhlIGNvbm5lY3RlZCBzdHJlYW1zLiBcc2luY2UgMC45LjE1ICovCisKKyAgICBQQV9TSU5LX1NFVF9GT1JNQVRTID0gMHgwMTAwVSwKKyAgICAvKio8IFRoZSBzaW5rIGFsbG93cyBzZXR0aW5nIHdoYXQgZm9ybWF0cyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBjb25uZWN0ZWQKKyAgICAgKiBoYXJkd2FyZS4gVGhlIGFjdHVhbCBmdW5jdGlvbmFsaXR5IHRvIGRvIHRoaXMgbWlnaHQgYmUgcHJvdmlkZWQgYnkgYW4KKyAgICAgKiBleHRlbnNpb24uIFxzaW5jZSAxLjAgKi8KKworI2lmZGVmIF9fSU5DTFVERURfRlJPTV9QVUxTRV9BVURJTworLyoqIFxjb25kIGZ1bGxkb2NzICovCisgICAgLyogUFJJVkFURTogU2VydmVyLXNpZGUgdmFsdWVzIC0tIGRvIG5vdCB0cnkgdG8gdXNlIHRoZXNlIGF0IGNsaWVudC1zaWRlLgorICAgICAqIFRoZSBzZXJ2ZXIgd2lsbCBmaWx0ZXIgb3V0IHRoZXNlIGZsYWdzIGFueXdheSwgc28geW91IHNob3VsZCBuZXZlciBzZWUKKyAgICAgKiB0aGVzZSBmbGFncyBpbiBzaW5rcy4gKi8KKworICAgIFBBX1NJTktfU0hBUkVfVk9MVU1FX1dJVEhfTUFTVEVSID0gMHgxMDAwMDAwVSwKKyAgICAvKio8IFRoaXMgc2luayBzaGFyZXMgdGhlIHZvbHVtZSB3aXRoIHRoZSBtYXN0ZXIgc2luayAodXNlZCBieSBzb21lIGZpbHRlcgorICAgICAqIHNpbmtzKS4gKi8KKworICAgIFBBX1NJTktfREVGRVJSRURfVk9MVU1FID0gMHgyMDAwMDAwVSwKKyAgICAvKio8IFRoZSBIVyB2b2x1bWUgY2hhbmdlcyBhcmUgc3luY3Jvbml6ZWQgd2l0aCBTVyB2b2x1bWUuICovCisvKiogXGVuZGNvbmQgKi8KKyNlbmRpZgorCit9IHBhX3NpbmtfZmxhZ3NfdDsKKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisjZGVmaW5lIFBBX1NJTktfSFdfVk9MVU1FX0NUUkwgUEFfU0lOS19IV19WT0xVTUVfQ1RSTAorI2RlZmluZSBQQV9TSU5LX0xBVEVOQ1kgUEFfU0lOS19MQVRFTkNZCisjZGVmaW5lIFBBX1NJTktfSEFSRFdBUkUgUEFfU0lOS19IQVJEV0FSRQorI2RlZmluZSBQQV9TSU5LX05FVFdPUksgUEFfU0lOS19ORVRXT1JLCisjZGVmaW5lIFBBX1NJTktfSFdfTVVURV9DVFJMIFBBX1NJTktfSFdfTVVURV9DVFJMCisjZGVmaW5lIFBBX1NJTktfREVDSUJFTF9WT0xVTUUgUEFfU0lOS19ERUNJQkVMX1ZPTFVNRQorI2RlZmluZSBQQV9TSU5LX0ZMQVRfVk9MVU1FIFBBX1NJTktfRkxBVF9WT0xVTUUKKyNkZWZpbmUgUEFfU0lOS19EWU5BTUlDX0xBVEVOQ1kgUEFfU0lOS19EWU5BTUlDX0xBVEVOQ1kKKyNkZWZpbmUgUEFfU0lOS19TRVRfRk9STUFUUyBQQV9TSU5LX1NFVF9GT1JNQVRTCisjaWZkZWYgX19JTkNMVURFRF9GUk9NX1BVTFNFX0FVRElPCisjZGVmaW5lIFBBX1NJTktfQ0xJRU5UX0ZMQUdTX01BU0sgMHhGRkZGRkYKKyNlbmRpZgorCisvKiogXGVuZGNvbmQgKi8KKworLyoqIFNpbmsgc3RhdGUuIFxzaW5jZSAwLjkuMTUgKi8KK3R5cGVkZWYgZW51bSBwYV9zaW5rX3N0YXRlIHsgLyogZW51bSBzZXJpYWxpemVkIGluIHU4ICovCisgICAgUEFfU0lOS19JTlZBTElEX1NUQVRFID0gLTEsCisgICAgLyoqPCBUaGlzIHN0YXRlIGlzIHVzZWQgd2hlbiB0aGUgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2luayBzdGF0ZSBpbnRyb3NwZWN0aW9uIFxzaW5jZSAwLjkuMTUgKi8KKworICAgIFBBX1NJTktfUlVOTklORyA9IDAsCisgICAgLyoqPCBSdW5uaW5nLCBzaW5rIGlzIHBsYXlpbmcgYW5kIHVzZWQgYnkgYXQgbGVhc3Qgb25lIG5vbi1jb3JrZWQgc2luay1pbnB1dCBcc2luY2UgMC45LjE1ICovCisKKyAgICBQQV9TSU5LX0lETEUgPSAxLAorICAgIC8qKjwgV2hlbiBpZGxlLCB0aGUgc2luayBpcyBwbGF5aW5nIGJ1dCB0aGVyZSBpcyBubyBub24tY29ya2VkIHNpbmstaW5wdXQgYXR0YWNoZWQgdG8gaXQgXHNpbmNlIDAuOS4xNSAqLworCisgICAgUEFfU0lOS19TVVNQRU5ERUQgPSAyLAorICAgIC8qKjwgV2hlbiBzdXNwZW5kZWQsIGFjdHVhbCBzaW5rIGFjY2VzcyBjYW4gYmUgY2xvc2VkLCBmb3IgaW5zdGFuY2UgXHNpbmNlIDAuOS4xNSAqLworCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyAgICAvKiBQUklWQVRFOiBTZXJ2ZXItc2lkZSB2YWx1ZXMgLS0gRE8gTk9UIFVTRSBUSElTIE9OIFRIRSBDTElFTlQKKyAgICAgKiBTSURFISBUaGVzZSB2YWx1ZXMgYXJlICpub3QqIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgb2ZmaWNpYWwgUEEKKyAgICAgKiBBUEkvQUJJLiBJZiB5b3UgdXNlIHRoZW0geW91ciBhcHBsaWNhdGlvbiBtaWdodCBicmVhayB3aGVuIFBBCisgICAgICogaXMgdXBncmFkZWQuIEFsc28sIHBsZWFzZSBub3RlIHRoYXQgdGhlc2UgdmFsdWVzIGFyZSBub3QgdXNlZnVsCisgICAgICogb24gdGhlIGNsaWVudCBzaWRlIGFueXdheS4gKi8KKworICAgIFBBX1NJTktfSU5JVCA9IC0yLAorICAgIC8qKjwgSW5pdGlhbGl6YXRpb24gc3RhdGUgKi8KKworICAgIFBBX1NJTktfVU5MSU5LRUQgPSAtMworICAgIC8qKjwgVGhlIHN0YXRlIHdoZW4gdGhlIHNpbmsgaXMgZ2V0dGluZyB1bnJlZ2lzdGVyZWQgYW5kIHJlbW92ZWQgZnJvbSBjbGllbnQgYWNjZXNzICovCisvKiogXGVuZGNvbmQgKi8KKworfSBwYV9zaW5rX3N0YXRlX3Q7CisKKy8qKiBSZXR1cm5zIG5vbi16ZXJvIGlmIHNpbmsgaXMgcGxheWluZzogcnVubmluZyBvciBpZGxlLiBcc2luY2UgMC45LjE1ICovCitzdGF0aWMgaW5saW5lIGludCBQQV9TSU5LX0lTX09QRU5FRChwYV9zaW5rX3N0YXRlX3QgeCkgeworICAgIHJldHVybiB4ID09IFBBX1NJTktfUlVOTklORyB8fCB4ID09IFBBX1NJTktfSURMRTsKK30KKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisjZGVmaW5lIFBBX1NJTktfSU5WQUxJRF9TVEFURSBQQV9TSU5LX0lOVkFMSURfU1RBVEUKKyNkZWZpbmUgUEFfU0lOS19SVU5OSU5HIFBBX1NJTktfUlVOTklORworI2RlZmluZSBQQV9TSU5LX0lETEUgUEFfU0lOS19JRExFCisjZGVmaW5lIFBBX1NJTktfU1VTUEVOREVEIFBBX1NJTktfU1VTUEVOREVECisjZGVmaW5lIFBBX1NJTktfSU5JVCBQQV9TSU5LX0lOSVQKKyNkZWZpbmUgUEFfU0lOS19VTkxJTktFRCBQQV9TSU5LX1VOTElOS0VECisjZGVmaW5lIFBBX1NJTktfSVNfT1BFTkVEIFBBX1NJTktfSVNfT1BFTkVECisvKiogXGVuZGNvbmQgKi8KKworLyoqIFNwZWNpYWwgc291cmNlIGZsYWdzLiAgKi8KK3R5cGVkZWYgZW51bSBwYV9zb3VyY2VfZmxhZ3MgeworICAgIFBBX1NPVVJDRV9OT0ZMQUdTID0gMHgwMDAwVSwKKyAgICAvKio8IEZsYWcgdG8gcGFzcyB3aGVuIG5vIHNwZWNpZmljIG9wdGlvbnMgYXJlIG5lZWRlZCAodXNlZCB0byBhdm9pZCBjYXN0aW5nKSAgXHNpbmNlIDAuOS4xOSAqLworCisgICAgUEFfU09VUkNFX0hXX1ZPTFVNRV9DVFJMID0gMHgwMDAxVSwKKyAgICAvKio8IFN1cHBvcnRzIGhhcmR3YXJlIHZvbHVtZSBjb250cm9sLiBUaGlzIGlzIGEgZHluYW1pYyBmbGFnIGFuZCBtYXkKKyAgICAgKiBjaGFuZ2UgYXQgcnVudGltZSBhZnRlciB0aGUgc291cmNlIGhhcyBpbml0aWFsaXplZCAqLworCisgICAgUEFfU09VUkNFX0xBVEVOQ1kgPSAweDAwMDJVLAorICAgIC8qKjwgU3VwcG9ydHMgbGF0ZW5jeSBxdWVyeWluZyAqLworCisgICAgUEFfU09VUkNFX0hBUkRXQVJFID0gMHgwMDA0VSwKKyAgICAvKio8IElzIGEgaGFyZHdhcmUgc291cmNlIG9mIHNvbWUga2luZCwgaW4gY29udHJhc3QgdG8KKyAgICAgKiAidmlydHVhbCIvc29mdHdhcmUgc291cmNlIFxzaW5jZSAwLjkuMyAqLworCisgICAgUEFfU09VUkNFX05FVFdPUksgPSAweDAwMDhVLAorICAgIC8qKjwgSXMgYSBuZXR3b3JrZWQgc291cmNlIG9mIHNvbWUga2luZC4gXHNpbmNlIDAuOS43ICovCisKKyAgICBQQV9TT1VSQ0VfSFdfTVVURV9DVFJMID0gMHgwMDEwVSwKKyAgICAvKio8IFN1cHBvcnRzIGhhcmR3YXJlIG11dGUgY29udHJvbC4gVGhpcyBpcyBhIGR5bmFtaWMgZmxhZyBhbmQgbWF5CisgICAgICogY2hhbmdlIGF0IHJ1bnRpbWUgYWZ0ZXIgdGhlIHNvdXJjZSBoYXMgaW5pdGlhbGl6ZWQgXHNpbmNlIDAuOS4xMSAqLworCisgICAgUEFfU09VUkNFX0RFQ0lCRUxfVk9MVU1FID0gMHgwMDIwVSwKKyAgICAvKio8IFZvbHVtZSBjYW4gYmUgdHJhbnNsYXRlZCB0byBkQiB3aXRoIHBhX3N3X3ZvbHVtZV90b19kQigpLiBUaGlzIGlzIGEKKyAgICAgKiBkeW5hbWljIGZsYWcgYW5kIG1heSBjaGFuZ2UgYXQgcnVudGltZSBhZnRlciB0aGUgc291cmNlIGhhcyBpbml0aWFsaXplZAorICAgICAqIFxzaW5jZSAwLjkuMTEgKi8KKworICAgIFBBX1NPVVJDRV9EWU5BTUlDX0xBVEVOQ1kgPSAweDAwNDBVLAorICAgIC8qKjwgVGhlIGxhdGVuY3kgY2FuIGJlIGFkanVzdGVkIGR5bmFtaWNhbGx5IGRlcGVuZGluZyBvbiB0aGUKKyAgICAgKiBuZWVkcyBvZiB0aGUgY29ubmVjdGVkIHN0cmVhbXMuIFxzaW5jZSAwLjkuMTUgKi8KKworICAgIFBBX1NPVVJDRV9GTEFUX1ZPTFVNRSA9IDB4MDA4MFUsCisgICAgLyoqPCBUaGlzIHNvdXJjZSBpcyBpbiBmbGF0IHZvbHVtZSBtb2RlLCBpLmUuIGFsd2F5cyB0aGUgbWF4aW11bSBvZgorICAgICAqIHRoZSB2b2x1bWUgb2YgYWxsIGNvbm5lY3RlZCBvdXRwdXRzLiBcc2luY2UgMS4wICovCisKKyNpZmRlZiBfX0lOQ0xVREVEX0ZST01fUFVMU0VfQVVESU8KKy8qKiBcY29uZCBmdWxsZG9jcyAqLworICAgIC8qIFBSSVZBVEU6IFNlcnZlci1zaWRlIHZhbHVlcyAtLSBkbyBub3QgdHJ5IHRvIHVzZSB0aGVzZSBhdCBjbGllbnQtc2lkZS4KKyAgICAgKiBUaGUgc2VydmVyIHdpbGwgZmlsdGVyIG91dCB0aGVzZSBmbGFncyBhbnl3YXksIHNvIHlvdSBzaG91bGQgbmV2ZXIgc2VlCisgICAgICogdGhlc2UgZmxhZ3MgaW4gc291cmNlcy4gKi8KKworICAgIFBBX1NPVVJDRV9TSEFSRV9WT0xVTUVfV0lUSF9NQVNURVIgPSAweDEwMDAwMDBVLAorICAgIC8qKjwgVGhpcyBzb3VyY2Ugc2hhcmVzIHRoZSB2b2x1bWUgd2l0aCB0aGUgbWFzdGVyIHNvdXJjZSAodXNlZCBieSBzb21lIGZpbHRlcgorICAgICAqIHNvdXJjZXMpLiAqLworCisgICAgUEFfU09VUkNFX0RFRkVSUkVEX1ZPTFVNRSA9IDB4MjAwMDAwMFUsCisgICAgLyoqPCBUaGUgSFcgdm9sdW1lIGNoYW5nZXMgYXJlIHN5bmNyb25pemVkIHdpdGggU1cgdm9sdW1lLiAqLworI2VuZGlmCit9IHBhX3NvdXJjZV9mbGFnc190OworCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyNkZWZpbmUgUEFfU09VUkNFX0hXX1ZPTFVNRV9DVFJMIFBBX1NPVVJDRV9IV19WT0xVTUVfQ1RSTAorI2RlZmluZSBQQV9TT1VSQ0VfTEFURU5DWSBQQV9TT1VSQ0VfTEFURU5DWQorI2RlZmluZSBQQV9TT1VSQ0VfSEFSRFdBUkUgUEFfU09VUkNFX0hBUkRXQVJFCisjZGVmaW5lIFBBX1NPVVJDRV9ORVRXT1JLIFBBX1NPVVJDRV9ORVRXT1JLCisjZGVmaW5lIFBBX1NPVVJDRV9IV19NVVRFX0NUUkwgUEFfU09VUkNFX0hXX01VVEVfQ1RSTAorI2RlZmluZSBQQV9TT1VSQ0VfREVDSUJFTF9WT0xVTUUgUEFfU09VUkNFX0RFQ0lCRUxfVk9MVU1FCisjZGVmaW5lIFBBX1NPVVJDRV9EWU5BTUlDX0xBVEVOQ1kgUEFfU09VUkNFX0RZTkFNSUNfTEFURU5DWQorI2RlZmluZSBQQV9TT1VSQ0VfRkxBVF9WT0xVTUUgUEFfU09VUkNFX0ZMQVRfVk9MVU1FCisjaWZkZWYgX19JTkNMVURFRF9GUk9NX1BVTFNFX0FVRElPCisjZGVmaW5lIFBBX1NPVVJDRV9DTElFTlRfRkxBR1NfTUFTSyAweEZGRkZGRgorI2VuZGlmCisKKy8qKiBcZW5kY29uZCAqLworCisvKiogU291cmNlIHN0YXRlLiBcc2luY2UgMC45LjE1ICovCit0eXBlZGVmIGVudW0gcGFfc291cmNlX3N0YXRlIHsKKyAgICBQQV9TT1VSQ0VfSU5WQUxJRF9TVEFURSA9IC0xLAorICAgIC8qKjwgVGhpcyBzdGF0ZSBpcyB1c2VkIHdoZW4gdGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNvdXJjZSBzdGF0ZSBpbnRyb3NwZWN0aW9uIFxzaW5jZSAwLjkuMTUgKi8KKworICAgIFBBX1NPVVJDRV9SVU5OSU5HID0gMCwKKyAgICAvKio8IFJ1bm5pbmcsIHNvdXJjZSBpcyByZWNvcmRpbmcgYW5kIHVzZWQgYnkgYXQgbGVhc3Qgb25lIG5vbi1jb3JrZWQgc291cmNlLW91dHB1dCBcc2luY2UgMC45LjE1ICovCisKKyAgICBQQV9TT1VSQ0VfSURMRSA9IDEsCisgICAgLyoqPCBXaGVuIGlkbGUsIHRoZSBzb3VyY2UgaXMgc3RpbGwgcmVjb3JkaW5nIGJ1dCB0aGVyZSBpcyBubyBub24tY29ya2VkIHNvdXJjZS1vdXRwdXQgXHNpbmNlIDAuOS4xNSAqLworCisgICAgUEFfU09VUkNFX1NVU1BFTkRFRCA9IDIsCisgICAgLyoqPCBXaGVuIHN1c3BlbmRlZCwgYWN0dWFsIHNvdXJjZSBhY2Nlc3MgY2FuIGJlIGNsb3NlZCwgZm9yIGluc3RhbmNlIFxzaW5jZSAwLjkuMTUgKi8KKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisgICAgLyogUFJJVkFURTogU2VydmVyLXNpZGUgdmFsdWVzIC0tIERPIE5PVCBVU0UgVEhJUyBPTiBUSEUgQ0xJRU5UCisgICAgICogU0lERSEgVGhlc2UgdmFsdWVzIGFyZSAqbm90KiBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIG9mZmljaWFsIFBBCisgICAgICogQVBJL0FCSS4gSWYgeW91IHVzZSB0aGVtIHlvdXIgYXBwbGljYXRpb24gbWlnaHQgYnJlYWsgd2hlbiBQQQorICAgICAqIGlzIHVwZ3JhZGVkLiBBbHNvLCBwbGVhc2Ugbm90ZSB0aGF0IHRoZXNlIHZhbHVlcyBhcmUgbm90IHVzZWZ1bAorICAgICAqIG9uIHRoZSBjbGllbnQgc2lkZSBhbnl3YXkuICovCisKKyAgICBQQV9TT1VSQ0VfSU5JVCA9IC0yLAorICAgIC8qKjwgSW5pdGlhbGl6YXRpb24gc3RhdGUgKi8KKworICAgIFBBX1NPVVJDRV9VTkxJTktFRCA9IC0zCisgICAgLyoqPCBUaGUgc3RhdGUgd2hlbiB0aGUgc291cmNlIGlzIGdldHRpbmcgdW5yZWdpc3RlcmVkIGFuZCByZW1vdmVkIGZyb20gY2xpZW50IGFjY2VzcyAqLworLyoqIFxlbmRjb25kICovCisKK30gcGFfc291cmNlX3N0YXRlX3Q7CisKKy8qKiBSZXR1cm5zIG5vbi16ZXJvIGlmIHNvdXJjZSBpcyByZWNvcmRpbmc6IHJ1bm5pbmcgb3IgaWRsZS4gXHNpbmNlIDAuOS4xNSAqLworc3RhdGljIGlubGluZSBpbnQgUEFfU09VUkNFX0lTX09QRU5FRChwYV9zb3VyY2Vfc3RhdGVfdCB4KSB7CisgICAgcmV0dXJuIHggPT0gUEFfU09VUkNFX1JVTk5JTkcgfHwgeCA9PSBQQV9TT1VSQ0VfSURMRTsKK30KKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisjZGVmaW5lIFBBX1NPVVJDRV9JTlZBTElEX1NUQVRFIFBBX1NPVVJDRV9JTlZBTElEX1NUQVRFCisjZGVmaW5lIFBBX1NPVVJDRV9SVU5OSU5HIFBBX1NPVVJDRV9SVU5OSU5HCisjZGVmaW5lIFBBX1NPVVJDRV9JRExFIFBBX1NPVVJDRV9JRExFCisjZGVmaW5lIFBBX1NPVVJDRV9TVVNQRU5ERUQgUEFfU09VUkNFX1NVU1BFTkRFRAorI2RlZmluZSBQQV9TT1VSQ0VfSU5JVCBQQV9TT1VSQ0VfSU5JVAorI2RlZmluZSBQQV9TT1VSQ0VfVU5MSU5LRUQgUEFfU09VUkNFX1VOTElOS0VECisjZGVmaW5lIFBBX1NPVVJDRV9JU19PUEVORUQgUEFfU09VUkNFX0lTX09QRU5FRAorLyoqIFxlbmRjb25kICovCisKKy8qKiBBIGdlbmVyaWMgZnJlZSgpIGxpa2UgY2FsbGJhY2sgcHJvdG90eXBlICovCit0eXBlZGVmIHZvaWQgKCpwYV9mcmVlX2NiX3QpKHZvaWQgKnApOworCisvKiogQSBzdHJlYW0gcG9saWN5L21ldGEgZXZlbnQgcmVxdWVzdGluZyB0aGF0IGFuIGFwcGxpY2F0aW9uIHNob3VsZAorICogY29yayBhIHNwZWNpZmljIHN0cmVhbS4gU2VlIHBhX3N0cmVhbV9ldmVudF9jYl90IGZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiwgXHNpbmNlIDAuOS4xNSAqLworI2RlZmluZSBQQV9TVFJFQU1fRVZFTlRfUkVRVUVTVF9DT1JLICJyZXF1ZXN0LWNvcmsiCisKKy8qKiBBIHN0cmVhbSBwb2xpY3kvbWV0YSBldmVudCByZXF1ZXN0aW5nIHRoYXQgYW4gYXBwbGljYXRpb24gc2hvdWxkCisgKiBjb3JrIGEgc3BlY2lmaWMgc3RyZWFtLiBTZWUgcGFfc3RyZWFtX2V2ZW50X2NiX3QgZm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uLCBcc2luY2UgMC45LjE1ICovCisjZGVmaW5lIFBBX1NUUkVBTV9FVkVOVF9SRVFVRVNUX1VOQ09SSyAicmVxdWVzdC11bmNvcmsiCisKKy8qKiBBIHN0cmVhbSBldmVudCBub3RpZnlpbmcgdGhhdCB0aGUgc3RyZWFtIGlzIGdvaW5nIHRvIGJlCisgKiBkaXNjb25uZWN0ZWQgYmVjYXVzZSB0aGUgdW5kZXJseWluZyBzaW5rIGNoYW5nZWQgYW5kIG5vIGxvbmdlcgorICogc3VwcG9ydHMgdGhlIGZvcm1hdCB0aGF0IHdhcyBvcmlnaW5hbGx5IG5lZ290aWF0ZWQuIENsaWVudHMgbmVlZAorICogdG8gY29ubmVjdCBhIG5ldyBzdHJlYW0gdG8gcmVuZWdvdGlhdGUgYSBmb3JtYXQgYW5kIGNvbnRpbnVlCisgKiBwbGF5YmFjaywgXHNpbmNlIDEuMCAqLworI2RlZmluZSBQQV9TVFJFQU1fRVZFTlRfRk9STUFUX0xPU1QgImZvcm1hdC1sb3N0IgorCisvKiogUG9ydCBhdmFpbGFiaWxpdHkgLyBqYWNrIGRldGVjdGlvbiBzdGF0dXMKKyAqIFxzaW5jZSAyLjAgKi8KK3R5cGVkZWYgZW51bSBwYV9wb3J0X2F2YWlsYWJsZSB7CisgICAgUEFfUE9SVF9BVkFJTEFCTEVfVU5LTk9XTiA9IDAsIC8qKjwgVGhpcyBwb3J0IGRvZXMgbm90IHN1cHBvcnQgamFjayBkZXRlY3Rpb24gXHNpbmNlIDIuMCAqLworICAgIFBBX1BPUlRfQVZBSUxBQkxFX05PID0gMSwgICAgICAvKio8IFRoaXMgcG9ydCBpcyBub3QgYXZhaWxhYmxlLCBsaWtlbHkgYmVjYXVzZSB0aGUgamFjayBpcyBub3QgcGx1Z2dlZCBpbi4gXHNpbmNlIDIuMCAqLworICAgIFBBX1BPUlRfQVZBSUxBQkxFX1lFUyA9IDIsICAgICAvKio8IFRoaXMgcG9ydCBpcyBhdmFpbGFibGUsIGxpa2VseSBiZWNhdXNlIHRoZSBqYWNrIGlzIHBsdWdnZWQgaW4uIFxzaW5jZSAyLjAgKi8KK30gcGFfcG9ydF9hdmFpbGFibGVfdDsKKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisjZGVmaW5lIFBBX1BPUlRfQVZBSUxBQkxFX1VOS05PV04gUEFfUE9SVF9BVkFJTEFCTEVfVU5LTk9XTgorI2RlZmluZSBQQV9QT1JUX0FWQUlMQUJMRV9OTyBQQV9QT1JUX0FWQUlMQUJMRV9OTworI2RlZmluZSBQQV9QT1JUX0FWQUlMQUJMRV9ZRVMgUEFfUE9SVF9BVkFJTEFCTEVfWUVTCisKKy8qKiBcZW5kY29uZCAqLworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9lcnJvci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9lcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OGRiODQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2Vycm9yLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBmb29lcnJvcmhmb28KKyNkZWZpbmUgZm9vZXJyb3JoZm9vCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwNiBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKyNpbmNsdWRlIDxwdWxzZS92ZXJzaW9uLmg+CisKKy8qKiBcZmlsZQorICogRXJyb3IgbWFuYWdlbWVudCAqLworCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIFJldHVybiBhIGh1bWFuIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBzcGVjaWZpZWQgbnVtZXJpYyBlcnJvciBjb2RlICovCitjb25zdCBjaGFyKiBwYV9zdHJlcnJvcihpbnQgZXJyb3IpOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9leHQtZGV2aWNlLW1hbmFnZXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZXh0LWRldmljZS1tYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU0MWViZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZXh0LWRldmljZS1tYW5hZ2VyLmgKQEAgLTAsMCArMSwxMjkgQEAKKyNpZm5kZWYgZm9vcHVsc2VleHRkZXZpY2VtYW5hZ2VyaGZvbworI2RlZmluZSBmb29wdWxzZWV4dGRldmljZW1hbmFnZXJoZm9vCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwOCBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDkgQ29saW4gR3V0aHJpZQorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLAorICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisjaW5jbHVkZSA8cHVsc2UvY29udGV4dC5oPgorI2luY2x1ZGUgPHB1bHNlL3ZlcnNpb24uaD4KKworLyoqIFxmaWxlCisgKgorICogUm91dGluZXMgZm9yIGNvbnRyb2xsaW5nIG1vZHVsZS1kZXZpY2UtbWFuYWdlcgorICovCisKK1BBX0NfREVDTF9CRUdJTgorCit0eXBlZGVmIHN0cnVjdCBwYV9leHRfZGV2aWNlX21hbmFnZXJfcm9sZV9wcmlvcml0eV9pbmZvIHsKKyAgICBjb25zdCBjaGFyICpyb2xlOworICAgIHVpbnQzMl90IHByaW9yaXR5OworfSBwYV9leHRfZGV2aWNlX21hbmFnZXJfcm9sZV9wcmlvcml0eV9pbmZvOworCisvKiogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IG9uZSBkZXZpY2UgaW4gdGhlIGRldmljZSBkYXRhYmFzZSB0aGF0IGlzCisgKiBtYWludGFpbmVkIGJ5IG1vZHVsZS1kZXZpY2UtbWFuYWdlci4gXHNpbmNlIDAuOS4yMSAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfZXh0X2RldmljZV9tYW5hZ2VyX2luZm8geworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAgLyoqPCBJZGVudGlmaWVyIHN0cmluZyBvZiB0aGUgZGV2aWNlLiBBIHN0cmluZyBsaWtlICJzaW5rOiIgb3Igc2ltaWxhciBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlLiAqLworICAgIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uOyAgICAgLyoqPCBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGRldmljZSB3aGVuIGl0IHdhcyBsYXN0IHNlZW4sIGlmIGFwcGxpY2FibGUgYW5kIHNhdmVkICovCisgICAgY29uc3QgY2hhciAqaWNvbjsgICAgICAgICAgICAvKio8IFRoZSBpY29uIGdpdmVuIHRvIHRoZSBkZXZpY2UgKi8KKyAgICB1aW50MzJfdCBpbmRleDsgICAgICAgICAgICAgIC8qKjwgVGhlIGRldmljZSBpbmRleCBpZiBpdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIG9yIFBBX0lOVkFMSURfSU5ERVggKi8KKyAgICB1aW50MzJfdCBuX3JvbGVfcHJpb3JpdGllczsgIC8qKjwgSG93IG1hbnkgcm9sZSBwcmlvcml0aWVzIGRvIHdlIGhhdmU/ICovCisgICAgcGFfZXh0X2RldmljZV9tYW5hZ2VyX3JvbGVfcHJpb3JpdHlfaW5mbyAqcm9sZV9wcmlvcml0aWVzOyAvKio8IEFuIGFycmF5IG9mIHJvbGUgcHJpb3JpdHkgc3RydWN0dXJlcyBvciBOVUxMICovCit9IHBhX2V4dF9kZXZpY2VfbWFuYWdlcl9pbmZvOworCisvKiogQ2FsbGJhY2sgcHJvdG90eXBlIGZvciBwYV9leHRfZGV2aWNlX21hbmFnZXJfdGVzdCgpLiBcc2luY2UgMC45LjIxICovCit0eXBlZGVmIHZvaWQgKCpwYV9leHRfZGV2aWNlX21hbmFnZXJfdGVzdF9jYl90KSgKKyAgICAgICAgcGFfY29udGV4dCAqYywKKyAgICAgICAgdWludDMyX3QgdmVyc2lvbiwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKiogVGVzdCBpZiB0aGlzIGV4dGVuc2lvbiBtb2R1bGUgaXMgYXZhaWxhYmxlIGluIHRoZSBzZXJ2ZXIuIFxzaW5jZSAwLjkuMjEgKi8KK3BhX29wZXJhdGlvbiAqcGFfZXh0X2RldmljZV9tYW5hZ2VyX3Rlc3QoCisgICAgICAgIHBhX2NvbnRleHQgKmMsCisgICAgICAgIHBhX2V4dF9kZXZpY2VfbWFuYWdlcl90ZXN0X2NiX3QgY2IsCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIENhbGxiYWNrIHByb3RvdHlwZSBmb3IgcGFfZXh0X2RldmljZV9tYW5hZ2VyX3JlYWQoKS4gXHNpbmNlIDAuOS4yMSAqLwordHlwZWRlZiB2b2lkICgqcGFfZXh0X2RldmljZV9tYW5hZ2VyX3JlYWRfY2JfdCkoCisgICAgICAgIHBhX2NvbnRleHQgKmMsCisgICAgICAgIGNvbnN0IHBhX2V4dF9kZXZpY2VfbWFuYWdlcl9pbmZvICppbmZvLAorICAgICAgICBpbnQgZW9sLAorICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBSZWFkIGFsbCBlbnRyaWVzIGZyb20gdGhlIGRldmljZSBkYXRhYmFzZS4gXHNpbmNlIDAuOS4yMSAqLworcGFfb3BlcmF0aW9uICpwYV9leHRfZGV2aWNlX21hbmFnZXJfcmVhZCgKKyAgICAgICAgcGFfY29udGV4dCAqYywKKyAgICAgICAgcGFfZXh0X2RldmljZV9tYW5hZ2VyX3JlYWRfY2JfdCBjYiwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0cyB0aGUgZGVzY3JpcHRpb24gZm9yIGEgZGV2aWNlLiBcc2luY2UgMC45LjIxICovCitwYV9vcGVyYXRpb24gKnBhX2V4dF9kZXZpY2VfbWFuYWdlcl9zZXRfZGV2aWNlX2Rlc2NyaXB0aW9uKAorICAgICAgICBwYV9jb250ZXh0ICpjLAorICAgICAgICBjb25zdCBjaGFyKiBkZXZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uLAorICAgICAgICBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKiogRGVsZXRlIGVudHJpZXMgZnJvbSB0aGUgZGV2aWNlIGRhdGFiYXNlLiBcc2luY2UgMC45LjIxICovCitwYV9vcGVyYXRpb24gKnBhX2V4dF9kZXZpY2VfbWFuYWdlcl9kZWxldGUoCisgICAgICAgIHBhX2NvbnRleHQgKmMsCisgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IHNbXSwKKyAgICAgICAgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEVuYWJsZSB0aGUgcm9sZS1iYXNlZCBkZXZpY2UtcHJpb3JpdHkgcm91dGluZyBtb2RlLiBcc2luY2UgMC45LjIxICovCitwYV9vcGVyYXRpb24gKnBhX2V4dF9kZXZpY2VfbWFuYWdlcl9lbmFibGVfcm9sZV9kZXZpY2VfcHJpb3JpdHlfcm91dGluZygKKyAgICAgICAgcGFfY29udGV4dCAqYywKKyAgICAgICAgaW50IGVuYWJsZSwKKyAgICAgICAgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFByZWZlciBhIGdpdmVuIGRldmljZSBpbiB0aGUgcHJpb3JpdHkgbGlzdC4gXHNpbmNlIDAuOS4yMSAqLworcGFfb3BlcmF0aW9uICpwYV9leHRfZGV2aWNlX21hbmFnZXJfcmVvcmRlcl9kZXZpY2VzX2Zvcl9yb2xlKAorICAgICAgICBwYV9jb250ZXh0ICpjLAorICAgICAgICBjb25zdCBjaGFyKiByb2xlLAorICAgICAgICBjb25zdCBjaGFyKiogZGV2aWNlcywKKyAgICAgICAgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFN1YnNjcmliZSB0byBjaGFuZ2VzIGluIHRoZSBkZXZpY2UgZGF0YWJhc2UuIFxzaW5jZSAwLjkuMjEgKi8KK3BhX29wZXJhdGlvbiAqcGFfZXh0X2RldmljZV9tYW5hZ2VyX3N1YnNjcmliZSgKKyAgICAgICAgcGFfY29udGV4dCAqYywKKyAgICAgICAgaW50IGVuYWJsZSwKKyAgICAgICAgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIENhbGxiYWNrIHByb3RvdHlwZSBmb3IgcGFfZXh0X2RldmljZV9tYW5hZ2VyX3NldF9zdWJzY3JpYmVfY2IoKS4gXHNpbmNlIDAuOS4yMSAqLwordHlwZWRlZiB2b2lkICgqcGFfZXh0X2RldmljZV9tYW5hZ2VyX3N1YnNjcmliZV9jYl90KSgKKyAgICAgICAgcGFfY29udGV4dCAqYywKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBzdWJzY3JpcHRpb24gY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgd2hlbgorICogcGFfZXh0X2RldmljZV9tYW5hZ2VyX3N1YnNjcmliZSgpIHdhcyBjYWxsZWQuIFxzaW5jZSAwLjkuMjEgKi8KK3ZvaWQgcGFfZXh0X2RldmljZV9tYW5hZ2VyX3NldF9zdWJzY3JpYmVfY2IoCisgICAgICAgIHBhX2NvbnRleHQgKmMsCisgICAgICAgIHBhX2V4dF9kZXZpY2VfbWFuYWdlcl9zdWJzY3JpYmVfY2JfdCBjYiwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9leHQtZGV2aWNlLXJlc3RvcmUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZXh0LWRldmljZS1yZXN0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY4NTdmNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZXh0LWRldmljZS1yZXN0b3JlLmgKQEAgLTAsMCArMSwxMTIgQEAKKyNpZm5kZWYgZm9vcHVsc2VleHRkZXZpY2VyZXN0b3JlaGZvbworI2RlZmluZSBmb29wdWxzZWV4dGRldmljZXJlc3RvcmVoZm9vCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwOCBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMTEgQ29saW4gR3V0aHJpZQorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLAorICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPHB1bHNlL2NvbnRleHQuaD4KKyNpbmNsdWRlIDxwdWxzZS9mb3JtYXQuaD4KKyNpbmNsdWRlIDxwdWxzZS92ZXJzaW9uLmg+CisKKy8qKiBcZmlsZQorICoKKyAqIFJvdXRpbmVzIGZvciBjb250cm9sbGluZyBtb2R1bGUtZGV2aWNlLXJlc3RvcmUKKyAqLworCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIFN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgZGV2aWNlIGluIHRoZSBkZXZpY2UgZGF0YWJhc2UgdGhhdCBpcworICogbWFpbnRhaW5lZCBieSBtb2R1bGUtZGV2aWNlLW1hbmFnZXIuIFxzaW5jZSAxLjAgKi8KK3R5cGVkZWYgc3RydWN0IHBhX2V4dF9kZXZpY2VfcmVzdG9yZV9pbmZvIHsKKyAgICBwYV9kZXZpY2VfdHlwZV90IHR5cGU7ICAgICAgIC8qKjwgRGV2aWNlIHR5cGUgc2luayBvciBzb3VyY2U/ICovCisgICAgdWludDMyX3QgaW5kZXg7ICAgICAgICAgICAgICAvKio8IFRoZSBkZXZpY2UgaW5kZXggKi8KKyAgICB1aW50OF90IG5fZm9ybWF0czsgICAgICAgICAgIC8qKjwgSG93IG1hbnkgZm9ybWF0cyBkbyB3ZSBoYXZlPyAqLworICAgIHBhX2Zvcm1hdF9pbmZvICoqZm9ybWF0czsgICAgLyoqPCBBbiBhcnJheSBvZiBmb3JtYXRzIChtYXkgYmUgTlVMTCBpZiBuX2Zvcm1hdHMgPT0gMCkgKi8KK30gcGFfZXh0X2RldmljZV9yZXN0b3JlX2luZm87CisKKy8qKiBDYWxsYmFjayBwcm90b3R5cGUgZm9yIHBhX2V4dF9kZXZpY2VfcmVzdG9yZV90ZXN0KCkuIFxzaW5jZSAxLjAgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2V4dF9kZXZpY2VfcmVzdG9yZV90ZXN0X2NiX3QpKAorICAgICAgICBwYV9jb250ZXh0ICpjLAorICAgICAgICB1aW50MzJfdCB2ZXJzaW9uLAorICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBUZXN0IGlmIHRoaXMgZXh0ZW5zaW9uIG1vZHVsZSBpcyBhdmFpbGFibGUgaW4gdGhlIHNlcnZlci4gXHNpbmNlIDEuMCAqLworcGFfb3BlcmF0aW9uICpwYV9leHRfZGV2aWNlX3Jlc3RvcmVfdGVzdCgKKyAgICAgICAgcGFfY29udGV4dCAqYywKKyAgICAgICAgcGFfZXh0X2RldmljZV9yZXN0b3JlX3Rlc3RfY2JfdCBjYiwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU3Vic2NyaWJlIHRvIGNoYW5nZXMgaW4gdGhlIGRldmljZSBkYXRhYmFzZS4gXHNpbmNlIDEuMCAqLworcGFfb3BlcmF0aW9uICpwYV9leHRfZGV2aWNlX3Jlc3RvcmVfc3Vic2NyaWJlKAorICAgICAgICBwYV9jb250ZXh0ICpjLAorICAgICAgICBpbnQgZW5hYmxlLAorICAgICAgICBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQ2FsbGJhY2sgcHJvdG90eXBlIGZvciBwYV9leHRfZGV2aWNlX3Jlc3RvcmVfc2V0X3N1YnNjcmliZV9jYigpLiBcc2luY2UgMS4wICovCit0eXBlZGVmIHZvaWQgKCpwYV9leHRfZGV2aWNlX3Jlc3RvcmVfc3Vic2NyaWJlX2NiX3QpKAorICAgICAgICBwYV9jb250ZXh0ICpjLAorICAgICAgICBwYV9kZXZpY2VfdHlwZV90IHR5cGUsCisgICAgICAgIHVpbnQzMl90IGlkeCwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBzdWJzY3JpcHRpb24gY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgd2hlbgorICogcGFfZXh0X2RldmljZV9yZXN0b3JlX3N1YnNjcmliZSgpIHdhcyBjYWxsZWQuIFxzaW5jZSAxLjAgKi8KK3ZvaWQgcGFfZXh0X2RldmljZV9yZXN0b3JlX3NldF9zdWJzY3JpYmVfY2IoCisgICAgICAgIHBhX2NvbnRleHQgKmMsCisgICAgICAgIHBhX2V4dF9kZXZpY2VfcmVzdG9yZV9zdWJzY3JpYmVfY2JfdCBjYiwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQ2FsbGJhY2sgcHJvdG90eXBlIGZvciBwYV9leHRfZGV2aWNlX3Jlc3RvcmVfcmVhZF9mb3JtYXRzKCkuIFxzaW5jZSAxLjAgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2V4dF9kZXZpY2VfcmVzdG9yZV9yZWFkX2RldmljZV9mb3JtYXRzX2NiX3QpKAorICAgICAgICBwYV9jb250ZXh0ICpjLAorICAgICAgICBjb25zdCBwYV9leHRfZGV2aWNlX3Jlc3RvcmVfaW5mbyAqaW5mbywKKyAgICAgICAgaW50IGVvbCwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKiogUmVhZCB0aGUgZm9ybWF0cyBmb3IgYWxsIHByZXNlbnQgZGV2aWNlcyBmcm9tIHRoZSBkZXZpY2UgZGF0YWJhc2UuIFxzaW5jZSAxLjAgKi8KK3BhX29wZXJhdGlvbiAqcGFfZXh0X2RldmljZV9yZXN0b3JlX3JlYWRfZm9ybWF0c19hbGwoCisgICAgICAgIHBhX2NvbnRleHQgKmMsCisgICAgICAgIHBhX2V4dF9kZXZpY2VfcmVzdG9yZV9yZWFkX2RldmljZV9mb3JtYXRzX2NiX3QgY2IsCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFJlYWQgYW4gZW50cnkgZnJvbSB0aGUgZGV2aWNlIGRhdGFiYXNlLiBcc2luY2UgMS4wICovCitwYV9vcGVyYXRpb24gKnBhX2V4dF9kZXZpY2VfcmVzdG9yZV9yZWFkX2Zvcm1hdHMoCisgICAgICAgIHBhX2NvbnRleHQgKmMsCisgICAgICAgIHBhX2RldmljZV90eXBlX3QgdHlwZSwKKyAgICAgICAgdWludDMyX3QgaWR4LAorICAgICAgICBwYV9leHRfZGV2aWNlX3Jlc3RvcmVfcmVhZF9kZXZpY2VfZm9ybWF0c19jYl90IGNiLAorICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBSZWFkIGFuIGVudHJ5IGZyb20gdGhlIGRldmljZSBkYXRhYmFzZS4gXHNpbmNlIDEuMCAqLworcGFfb3BlcmF0aW9uICpwYV9leHRfZGV2aWNlX3Jlc3RvcmVfc2F2ZV9mb3JtYXRzKAorICAgICAgICBwYV9jb250ZXh0ICpjLAorICAgICAgICBwYV9kZXZpY2VfdHlwZV90IHR5cGUsCisgICAgICAgIHVpbnQzMl90IGlkeCwKKyAgICAgICAgdWludDhfdCBuX2Zvcm1hdHMsCisgICAgICAgIHBhX2Zvcm1hdF9pbmZvICoqZm9ybWF0cywKKyAgICAgICAgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZXh0LXN0cmVhbS1yZXN0b3JlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2V4dC1zdHJlYW0tcmVzdG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYjE2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2V4dC1zdHJlYW0tcmVzdG9yZS5oCkBAIC0wLDAgKzEsMTExIEBACisjaWZuZGVmIGZvb3B1bHNlZXh0c3RyZWFtcmVzdG9yZWhmb28KKyNkZWZpbmUgZm9vcHVsc2VleHRzdHJlYW1yZXN0b3JlaGZvbworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDggTGVubmFydCBQb2V0dGVyaW5nCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKyNpbmNsdWRlIDxwdWxzZS9jb250ZXh0Lmg+CisjaW5jbHVkZSA8cHVsc2UvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHB1bHNlL3ZvbHVtZS5oPgorI2luY2x1ZGUgPHB1bHNlL2NoYW5uZWxtYXAuaD4KKworLyoqIFxmaWxlCisgKgorICogUm91dGluZXMgZm9yIGNvbnRyb2xsaW5nIG1vZHVsZS1zdHJlYW0tcmVzdG9yZQorICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IG9uZSBlbnRyeSBpbiB0aGUgc3RyZWFtIGRhdGFiYXNlIHRoYXQgaXMKKyAqIG1haW50YWluZWQgYnkgbW9kdWxlLXN0cmVhbS1yZXN0b3JlLiBcc2luY2UgMC45LjEyICovCit0eXBlZGVmIHN0cnVjdCBwYV9leHRfc3RyZWFtX3Jlc3RvcmVfaW5mbyB7CisgICAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAvKio8IElkZW50aWZpZXIgc3RyaW5nIG9mIHRoZSBzdHJlYW0uIEEgc3RyaW5nIGxpa2UgInNpbmstaW5wdXQtYnktcm9sZToiIG9yIHNpbWlsYXIgZm9sbG93ZWQgYnkgc29tZSBhcmJpdHJhcnkgcHJvcGVydHkgdmFsdWUuICovCisgICAgcGFfY2hhbm5lbF9tYXAgY2hhbm5lbF9tYXA7ICAvKio8IFRoZSBjaGFubmVsIG1hcCBmb3IgdGhlIHZvbHVtZSBmaWVsZCwgaWYgYXBwbGljYWJsZSAqLworICAgIHBhX2N2b2x1bWUgdm9sdW1lOyAgICAgICAgICAgLyoqPCBUaGUgdm9sdW1lIG9mIHRoZSBzdHJlYW0gd2hlbiBpdCB3YXMgc2VlbiBsYXN0LCBpZiBhcHBsaWNhYmxlIGFuZCBzYXZlZCAqLworICAgIGNvbnN0IGNoYXIgKmRldmljZTsgICAgICAgICAgLyoqPCBUaGUgc2luay9zb3VyY2Ugb2YgdGhlIHN0cmVhbSB3aGVuIGl0IHdhcyBsYXN0IHNlZW4sIGlmIGFwcGxpY2FibGUgYW5kIHNhdmVkICovCisgICAgaW50IG11dGU7ICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBib29sZWFuIG11dGUgc3RhdGUgb2YgdGhlIHN0cmVhbSB3aGVuIGl0IHdhcyBsYXN0IHNlZW4sIGlmIGFwcGxpY2FibGUgYW5kIHNhdmVkICovCit9IHBhX2V4dF9zdHJlYW1fcmVzdG9yZV9pbmZvOworCisvKiogQ2FsbGJhY2sgcHJvdG90eXBlIGZvciBwYV9leHRfc3RyZWFtX3Jlc3RvcmVfdGVzdCgpLiBcc2luY2UgMC45LjEyICovCit0eXBlZGVmIHZvaWQgKCpwYV9leHRfc3RyZWFtX3Jlc3RvcmVfdGVzdF9jYl90KSgKKyAgICAgICAgcGFfY29udGV4dCAqYywKKyAgICAgICAgdWludDMyX3QgdmVyc2lvbiwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKiogVGVzdCBpZiB0aGlzIGV4dGVuc2lvbiBtb2R1bGUgaXMgYXZhaWxhYmxlIGluIHRoZSBzZXJ2ZXIuIFxzaW5jZSAwLjkuMTIgKi8KK3BhX29wZXJhdGlvbiAqcGFfZXh0X3N0cmVhbV9yZXN0b3JlX3Rlc3QoCisgICAgICAgIHBhX2NvbnRleHQgKmMsCisgICAgICAgIHBhX2V4dF9zdHJlYW1fcmVzdG9yZV90ZXN0X2NiX3QgY2IsCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIENhbGxiYWNrIHByb3RvdHlwZSBmb3IgcGFfZXh0X3N0cmVhbV9yZXN0b3JlX3JlYWQoKS4gXHNpbmNlIDAuOS4xMiAqLwordHlwZWRlZiB2b2lkICgqcGFfZXh0X3N0cmVhbV9yZXN0b3JlX3JlYWRfY2JfdCkoCisgICAgICAgIHBhX2NvbnRleHQgKmMsCisgICAgICAgIGNvbnN0IHBhX2V4dF9zdHJlYW1fcmVzdG9yZV9pbmZvICppbmZvLAorICAgICAgICBpbnQgZW9sLAorICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBSZWFkIGFsbCBlbnRyaWVzIGZyb20gdGhlIHN0cmVhbSBkYXRhYmFzZS4gXHNpbmNlIDAuOS4xMiAqLworcGFfb3BlcmF0aW9uICpwYV9leHRfc3RyZWFtX3Jlc3RvcmVfcmVhZCgKKyAgICAgICAgcGFfY29udGV4dCAqYywKKyAgICAgICAgcGFfZXh0X3N0cmVhbV9yZXN0b3JlX3JlYWRfY2JfdCBjYiwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU3RvcmUgZW50cmllcyBpbiB0aGUgc3RyZWFtIGRhdGFiYXNlLiBcc2luY2UgMC45LjEyICovCitwYV9vcGVyYXRpb24gKnBhX2V4dF9zdHJlYW1fcmVzdG9yZV93cml0ZSgKKyAgICAgICAgcGFfY29udGV4dCAqYywKKyAgICAgICAgcGFfdXBkYXRlX21vZGVfdCBtb2RlLAorICAgICAgICBjb25zdCBwYV9leHRfc3RyZWFtX3Jlc3RvcmVfaW5mbyBkYXRhW10sCisgICAgICAgIHVuc2lnbmVkIG4sCisgICAgICAgIGludCBhcHBseV9pbW1lZGlhdGVseSwKKyAgICAgICAgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIERlbGV0ZSBlbnRyaWVzIGZyb20gdGhlIHN0cmVhbSBkYXRhYmFzZS4gXHNpbmNlIDAuOS4xMiAqLworcGFfb3BlcmF0aW9uICpwYV9leHRfc3RyZWFtX3Jlc3RvcmVfZGVsZXRlKAorICAgICAgICBwYV9jb250ZXh0ICpjLAorICAgICAgICBjb25zdCBjaGFyICpjb25zdCBzW10sCisgICAgICAgIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLAorICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTdWJzY3JpYmUgdG8gY2hhbmdlcyBpbiB0aGUgc3RyZWFtIGRhdGFiYXNlLiBcc2luY2UgMC45LjEyICovCitwYV9vcGVyYXRpb24gKnBhX2V4dF9zdHJlYW1fcmVzdG9yZV9zdWJzY3JpYmUoCisgICAgICAgIHBhX2NvbnRleHQgKmMsCisgICAgICAgIGludCBlbmFibGUsCisgICAgICAgIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLAorICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBDYWxsYmFjayBwcm90b3R5cGUgZm9yIHBhX2V4dF9zdHJlYW1fcmVzdG9yZV9zZXRfc3Vic2NyaWJlX2NiKCkuIFxzaW5jZSAwLjkuMTIgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2V4dF9zdHJlYW1fcmVzdG9yZV9zdWJzY3JpYmVfY2JfdCkoCisgICAgICAgIHBhX2NvbnRleHQgKmMsCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFNldCB0aGUgc3Vic2NyaXB0aW9uIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIHdoZW4KKyAqIHBhX2V4dF9zdHJlYW1fcmVzdG9yZV9zdWJzY3JpYmUoKSB3YXMgY2FsbGVkLiBcc2luY2UgMC45LjEyICovCit2b2lkIHBhX2V4dF9zdHJlYW1fcmVzdG9yZV9zZXRfc3Vic2NyaWJlX2NiKAorICAgICAgICBwYV9jb250ZXh0ICpjLAorICAgICAgICBwYV9leHRfc3RyZWFtX3Jlc3RvcmVfc3Vic2NyaWJlX2NiX3QgY2IsCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZm9ybWF0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2Zvcm1hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OTk2YzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2Zvcm1hdC5oCkBAIC0wLDAgKzEsMTM3IEBACisjaWZuZGVmIGZvb2Zvcm1hdGhmb28KKyNkZWZpbmUgZm9vZm9ybWF0aGZvbworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMTEgSW50ZWwgQ29ycG9yYXRpb24KKyAgQ29weXJpZ2h0IDIwMTEgQ29sbGFib3JhIE11bHRpbWVkaWEKKyAgQ29weXJpZ2h0IDIwMTEgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKyNpbmNsdWRlIDxwdWxzZS9nY2NtYWNyby5oPgorI2luY2x1ZGUgPHB1bHNlL3Byb3BsaXN0Lmg+CisjaW5jbHVkZSA8cHVsc2Uvc2FtcGxlLmg+CisjaW5jbHVkZSA8cHVsc2UvY2hhbm5lbG1hcC5oPgorCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIFJlcHJlc2VudHMgdGhlIHR5cGUgb2YgZW5jb2RpbmcgdXNlZCBpbiBhIHN0cmVhbSBvciBhY2NlcHRlZCBieSBhIHNpbmsuIFxzaW5jZSAxLjAgKi8KK3R5cGVkZWYgZW51bSBwYV9lbmNvZGluZyB7CisgICAgUEFfRU5DT0RJTkdfQU5ZLAorICAgIC8qKjwgQW55IGVuY29kaW5nIGZvcm1hdCwgUENNIG9yIGNvbXByZXNzZWQgKi8KKworICAgIFBBX0VOQ09ESU5HX1BDTSwKKyAgICAvKio8IEFueSBQQ00gZm9ybWF0ICovCisKKyAgICBQQV9FTkNPRElOR19BQzNfSUVDNjE5MzcsCisgICAgLyoqPCBBQzMgZGF0YSBlbmNhcHN1bGF0ZWQgaW4gSUVDIDYxOTM3IGhlYWRlci9wYWRkaW5nICovCisKKyAgICBQQV9FTkNPRElOR19FQUMzX0lFQzYxOTM3LAorICAgIC8qKjwgRUFDMyBkYXRhIGVuY2Fwc3VsYXRlZCBpbiBJRUMgNjE5MzcgaGVhZGVyL3BhZGRpbmcgKi8KKworICAgIFBBX0VOQ09ESU5HX01QRUdfSUVDNjE5MzcsCisgICAgLyoqPCBNUEVHLTEgb3IgTVBFRy0yIChQYXJ0IDMsIG5vdCBBQUMpIGRhdGEgZW5jYXBzdWxhdGVkIGluIElFQyA2MTkzNyBoZWFkZXIvcGFkZGluZyAqLworCisgICAgUEFfRU5DT0RJTkdfRFRTX0lFQzYxOTM3LAorICAgIC8qKjwgRFRTIGRhdGEgZW5jYXBzdWxhdGVkIGluIElFQyA2MTkzNyBoZWFkZXIvcGFkZGluZyAqLworCisgICAgUEFfRU5DT0RJTkdfTUFYLAorICAgIC8qKjwgVmFsaWQgZW5jb2RpbmcgdHlwZXMgbXVzdCBiZSBsZXNzIHRoYW4gdGhpcyB2YWx1ZSAqLworCisgICAgUEFfRU5DT0RJTkdfSU5WQUxJRCA9IC0xLAorICAgIC8qKjwgUmVwcmVzZW50cyBhbiBpbnZhbGlkIGVuY29kaW5nICovCit9IHBhX2VuY29kaW5nX3Q7CisKKy8qKiBSZXR1cm5zIGEgcHJpbnRhYmxlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGVuY29kaW5nIHR5cGUuIFxzaW5jZSAxLjAgKi8KK2NvbnN0IGNoYXIgKnBhX2VuY29kaW5nX3RvX3N0cmluZyhwYV9lbmNvZGluZ190IGUpIFBBX0dDQ19DT05TVDsKKworLyoqIENvbnZlcnRzIGEgc3RyaW5nIG9mIHRoZSBmb3JtIHJldHVybmVkIGJ5IFxhIHBhX2VuY29kaW5nX3RvX3N0cmluZygpIGJhY2sgdG8gYSBcYSBwYV9lbmNvZGluZ190LiBcc2luY2UgMS4wICovCitwYV9lbmNvZGluZ190IHBhX2VuY29kaW5nX2Zyb21fc3RyaW5nKGNvbnN0IGNoYXIgKmVuY29kaW5nKTsKKworLyoqIFJlcHJlc2VudHMgdGhlIGZvcm1hdCBvZiBkYXRhIHByb3ZpZGVkIGluIGEgc3RyZWFtIG9yIHByb2Nlc3NlZCBieSBhIHNpbmsuIFxzaW5jZSAxLjAgKi8KK3R5cGVkZWYgc3RydWN0IHBhX2Zvcm1hdF9pbmZvIHsKKyAgICBwYV9lbmNvZGluZ190IGVuY29kaW5nOworICAgIC8qKjwgVGhlIGVuY29kaW5nIHVzZWQgZm9yIHRoZSBmb3JtYXQgKi8KKworICAgIHBhX3Byb3BsaXN0ICpwbGlzdDsKKyAgICAvKio8IEFkZGl0aW9uYWwgZW5jb2Rpbmctc3BlY2lmaWMgcHJvcGVydGllcyBzdWNoIGFzIHNhbXBsZSByYXRlLCBiaXRyYXRlLCBldGMuICovCit9IHBhX2Zvcm1hdF9pbmZvOworCisvKiogQWxsb2NhdGVzIGEgbmV3IFxhIHBhX2Zvcm1hdF9pbmZvIHN0cnVjdHVyZS4gQ2xpZW50cyBtdXN0IGluaXRpYWxpc2UgYXQgbGVhc3QgdGhlIGVuY29kaW5nIGZpZWxkIHRoZW1zZWx2ZXMuICovCitwYV9mb3JtYXRfaW5mbyogcGFfZm9ybWF0X2luZm9fbmV3KHZvaWQpOworCisvKiogUmV0dXJucyBhIG5ldyBcYSBwYV9mb3JtYXRfaW5mbyBzdHJ1Y3QgYW5kIHJlcHJlc2VudGluZyB0aGUgc2FtZSBmb3JtYXQgYXMgXGEgc3JjICovCitwYV9mb3JtYXRfaW5mbyogcGFfZm9ybWF0X2luZm9fY29weShjb25zdCBwYV9mb3JtYXRfaW5mbyAqc3JjKTsKKworLyoqIEZyZWVzIGEgXGEgcGFfZm9ybWF0X2luZm8gc3RydWN0dXJlICovCit2b2lkIHBhX2Zvcm1hdF9pbmZvX2ZyZWUocGFfZm9ybWF0X2luZm8gKmYpOworCisvKiogUmV0dXJucyBub24temVybyB3aGVuIHRoZSBmb3JtYXQgaW5mbyBzdHJ1Y3R1cmUgaXMgdmFsaWQgKi8KK2ludCBwYV9mb3JtYXRfaW5mb192YWxpZChjb25zdCBwYV9mb3JtYXRfaW5mbyAqZik7CisKKy8qKiBSZXR1cm5zIG5vbi16ZXJvIHdoZW4gdGhlIGZvcm1hdCBpbmZvIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgUENNIChpLmUuIHVuY29tcHJlc3NlZCBkYXRhKSBmb3JtYXQgKi8KK2ludCBwYV9mb3JtYXRfaW5mb19pc19wY20oY29uc3QgcGFfZm9ybWF0X2luZm8gKmYpOworCisvKiogUmV0dXJucyBub24temVybyBpZiB0aGUgZm9ybWF0IHJlcHJlc2VudGVkIFxhIGZpcnN0IGlzIGEgc3Vic2V0IG9mCisgKiB0aGUgZm9ybWF0IHJlcHJlc2VudGVkIGJ5IFxzZWNvbmQuIFRoaXMgbWVhbnMgdGhhdCBcYSBzZWNvbmQgbXVzdAorICogaGF2ZSBhbGwgdGhlIGZpZWxkcyB0aGF0IFxhIGZpcnN0IGRvZXMsIGJ1dCB0aGUgcmV2ZXJzZSBuZWVkIG5vdAorICogYmUgdHJ1ZS4gVGhpcyBpcyB0eXBpY2FsbHkgZXhwZWN0ZWQgdG8gYmUgdXNlZCB0byBjaGVjayBpZiBhCisgKiBzdHJlYW0ncyBmb3JtYXQgaXMgY29tcGF0aWJsZSB3aXRoIGEgZ2l2ZW4gc2luay4gSW4gc3VjaCBhIGNhc2UsCisgKiBcYSBmaXJzdCB3b3VsZCBiZSB0aGUgc2luaydzIGZvcm1hdCBhbmQgXGEgc2Vjb25kIHdvdWxkIGJlIHRoZQorICogc3RyZWFtJ3MuKi8KK2ludCBwYV9mb3JtYXRfaW5mb19pc19jb21wYXRpYmxlKHBhX2Zvcm1hdF9pbmZvICpmaXJzdCwgcGFfZm9ybWF0X2luZm8gKnNlY29uZCk7CisKKy8qKiBNYXhpbXVtIHJlcXVpcmVkIHN0cmluZyBsZW5ndGggZm9yCisgKiBwYV9mb3JtYXRfaW5mb19zbnByaW50KCkuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyB2YWx1ZSBjYW4gY2hhbmdlCisgKiB3aXRoIGFueSByZWxlYXNlIHdpdGhvdXQgd2FybmluZyBhbmQgd2l0aG91dCBiZWluZyBjb25zaWRlcmVkIEFQSQorICogb3IgQUJJIGJyZWFrYWdlLiBZb3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBkZWZpbml0aW9uIGFueXdoZXJlIHdoZXJlCisgKiBpdCBtaWdodCBiZWNvbWUgcGFydCBvZiBhbiBBQkkuIFxzaW5jZSAxLjAgKi8KKyNkZWZpbmUgUEFfRk9STUFUX0lORk9fU05QUklOVF9NQVggMjU2CisKKy8qKiBSZXR1cm4gYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBmb3JtYXQuIFxzaW5jZSAxLjAgKi8KK2NoYXIgKnBhX2Zvcm1hdF9pbmZvX3NucHJpbnQoY2hhciAqcywgc2l6ZV90IGwsIGNvbnN0IHBhX2Zvcm1hdF9pbmZvICpmKTsKKworLyoqIFBhcnNlIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIG9mIHRoZSBmb3JtIGdlbmVyYXRlZCBieQorICogXGEgcGFfZm9ybWF0X2luZm9fc25wcmludCgpIGludG8gYSBwYV9mb3JtYXRfaW5mbyBzdHJ1Y3R1cmUuIFxzaW5jZSAxLjAgKi8KK3BhX2Zvcm1hdF9pbmZvKiBwYV9mb3JtYXRfaW5mb19mcm9tX3N0cmluZyhjb25zdCBjaGFyICpzdHIpOworCisvKiogU2V0cyBhbiBpbnRlZ2VyIHByb3BlcnR5IG9uIHRoZSBnaXZlbiBmb3JtYXQgaW5mbyAqLwordm9pZCBwYV9mb3JtYXRfaW5mb19zZXRfcHJvcF9pbnQocGFfZm9ybWF0X2luZm8gKmYsIGNvbnN0IGNoYXIgKmtleSwgaW50IHZhbHVlKTsKKy8qKiBTZXRzIGEgcHJvcGVydHkgd2l0aCBhIGxpc3Qgb2YgaW50ZWdlciB2YWx1ZXMgb24gdGhlIGdpdmVuIGZvcm1hdCBpbmZvICovCit2b2lkIHBhX2Zvcm1hdF9pbmZvX3NldF9wcm9wX2ludF9hcnJheShwYV9mb3JtYXRfaW5mbyAqZiwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBpbnQgKnZhbHVlcywgaW50IG5fdmFsdWVzKTsKKy8qKiBTZXRzIGEgcHJvcGVydHkgd2hpY2ggY2FuIGhhdmUgYW55IHZhbHVlIGluIGEgZ2l2ZW4gaW50ZWdlciByYW5nZSBvbiB0aGUgZ2l2ZW4gZm9ybWF0IGluZm8gKi8KK3ZvaWQgcGFfZm9ybWF0X2luZm9fc2V0X3Byb3BfaW50X3JhbmdlKHBhX2Zvcm1hdF9pbmZvICpmLCBjb25zdCBjaGFyICprZXksIGludCBtaW4sIGludCBtYXgpOworLyoqIFNldHMgYSBzdHJpbmcgcHJvcGVydHkgb24gdGhlIGdpdmVuIGZvcm1hdCBpbmZvICovCit2b2lkIHBhX2Zvcm1hdF9pbmZvX3NldF9wcm9wX3N0cmluZyhwYV9mb3JtYXRfaW5mbyAqZiwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSk7CisvKiogU2V0cyBhIHByb3BlcnR5IHdpdGggYSBsaXN0IG9mIHN0cmluZyB2YWx1ZXMgb24gdGhlIGdpdmVuIGZvcm1hdCBpbmZvICovCit2b2lkIHBhX2Zvcm1hdF9pbmZvX3NldF9wcm9wX3N0cmluZ19hcnJheShwYV9mb3JtYXRfaW5mbyAqZiwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICoqdmFsdWVzLCBpbnQgbl92YWx1ZXMpOworCisvKiogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHNldCB0aGUgc2FtcGxlIGZvcm1hdCBhcyBhIHByb3BlcnR5IG9uIHRoZSBnaXZlbiBmb3JtYXQgKi8KK3ZvaWQgcGFfZm9ybWF0X2luZm9fc2V0X3NhbXBsZV9mb3JtYXQocGFfZm9ybWF0X2luZm8gKmYsIHBhX3NhbXBsZV9mb3JtYXRfdCBzZik7CisvKiogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHNldCB0aGUgc2FtcGxpbmcgcmF0ZSBhcyBhIHByb3BlcnR5IG9uIHRoZSBnaXZlbiBmb3JtYXQgKi8KK3ZvaWQgcGFfZm9ybWF0X2luZm9fc2V0X3JhdGUocGFfZm9ybWF0X2luZm8gKmYsIGludCByYXRlKTsKKy8qKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc2V0IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYXMgYSBwcm9wZXJ0eSBvbiB0aGUgZ2l2ZW4gZm9ybWF0ICovCit2b2lkIHBhX2Zvcm1hdF9pbmZvX3NldF9jaGFubmVscyhwYV9mb3JtYXRfaW5mbyAqZiwgaW50IGNoYW5uZWxzKTsKKy8qKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc2V0IHRoZSBjaGFubmVsIG1hcCBhcyBhIHByb3BlcnR5IG9uIHRoZSBnaXZlbiBmb3JtYXQgKi8KK3ZvaWQgcGFfZm9ybWF0X2luZm9fc2V0X2NoYW5uZWxfbWFwKHBhX2Zvcm1hdF9pbmZvICpmLCBjb25zdCBwYV9jaGFubmVsX21hcCAqbWFwKTsKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZ2NjbWFjcm8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZ2NjbWFjcm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTgxOGZmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9nY2NtYWNyby5oCkBAIC0wLDAgKzEsMTI3IEBACisjaWZuZGVmIGZvb3B1bHNlZ2NjbWFjcm9oZm9vCisjZGVmaW5lIGZvb3B1bHNlZ2NjbWFjcm9oZm9vCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLAorICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworLyoqIFxmaWxlCisgKiBHQ0MgYXR0cmlidXRlIG1hY3JvcyAqLworCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgUEFfR0NDX1BSSU5URl9BVFRSKGEsYikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCBhLCBiKSkpCisjZWxzZQorLyoqIElmIHdlJ3JlIGluIEdOVSBDLCB1c2Ugc29tZSBtYWdpYyBmb3IgZGV0ZWN0aW5nIGludmFsaWQgZm9ybWF0IHN0cmluZ3MgKi8KKyNkZWZpbmUgUEFfR0NDX1BSSU5URl9BVFRSKGEsYikKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID49IDQpCisjZGVmaW5lIFBBX0dDQ19TRU5USU5FTCBfX2F0dHJpYnV0ZV9fICgoc2VudGluZWwpKQorI2Vsc2UKKy8qKiBNYWNybyBmb3IgdXNhZ2Ugb2YgR0NDJ3Mgc2VudGluZWwgY29tcGlsYXRpb24gd2FybmluZ3MgKi8KKyNkZWZpbmUgUEFfR0NDX1NFTlRJTkVMCisjZW5kaWYKKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFBBX0dDQ19OT1JFVFVSTiBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpCisjZWxzZQorLyoqIE1hY3JvIGZvciBuby1yZXR1cm4gZnVuY3Rpb25zICovCisjZGVmaW5lIFBBX0dDQ19OT1JFVFVSTgorI2VuZGlmCisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBQQV9HQ0NfVU5VU0VEIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKQorI2Vsc2UKKy8qKiBNYWNybyBmb3Igbm90IHVzZWQgZnVuY3Rpb24sIHZhcmlhYmxlIG9yIHBhcmFtZXRlciAqLworI2RlZmluZSBQQV9HQ0NfVU5VU0VECisjZW5kaWYKKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFBBX0dDQ19ERVNUUlVDVE9SIF9fYXR0cmlidXRlX18gKChkZXN0cnVjdG9yKSkKKyNlbHNlCisvKiogQ2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gcHJvY2VzcyB0ZXJtaW5hdGVzICovCisjZGVmaW5lIFBBX0dDQ19ERVNUUlVDVE9SCisjZW5kaWYKKworI2lmbmRlZiBQQV9HQ0NfUFVSRQorI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFBBX0dDQ19QVVJFIF9fYXR0cmlidXRlX18gKChwdXJlKSkKKyNlbHNlCisvKiogVGhpcyBmdW5jdGlvbidzIHJldHVybiB2YWx1ZSBkZXBlbmRzIG9ubHkgdGhlIGFyZ3VtZW50cyBsaXN0IGFuZCBnbG9iYWwgc3RhdGUgKiovCisjZGVmaW5lIFBBX0dDQ19QVVJFCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFBBX0dDQ19DT05TVAorI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFBBX0dDQ19DT05TVCBfX2F0dHJpYnV0ZV9fICgoY29uc3QpKQorI2Vsc2UKKy8qKiBUaGlzIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIGRlcGVuZHMgb25seSB0aGUgYXJndW1lbnRzIGxpc3QgKHN0cmljdGVyIHZlcnNpb24gb2YgUEFfR0NDX1BVUkUpICoqLworI2RlZmluZSBQQV9HQ0NfQ09OU1QKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgUEFfR0NDX0RFUFJFQ0FURUQKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBQQV9HQ0NfREVQUkVDQVRFRCBfX2F0dHJpYnV0ZV9fICgoZGVwcmVjYXRlZCkpCisjZWxzZQorLyoqIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCAqKi8KKyNkZWZpbmUgUEFfR0NDX0RFUFJFQ0FURUQKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgUEFfR0NDX1BBQ0tFRAorI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFBBX0dDQ19QQUNLRUQgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisjZWxzZQorLyoqIFN0cnVjdHVyZSBzaGFsbCBiZSBwYWNrZWQgaW4gbWVtb3J5ICoqLworI2RlZmluZSBQQV9HQ0NfUEFDS0VECisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFBBX0dDQ19BTExPQ19TSVpFCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID49IDQpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAzKQorI2RlZmluZSBQQV9HQ0NfQUxMT0NfU0laRSh4KSBfX2F0dHJpYnV0ZV9fICgoX19hbGxvY19zaXplX18oeCkpKQorI2RlZmluZSBQQV9HQ0NfQUxMT0NfU0laRTIoeCx5KSBfX2F0dHJpYnV0ZV9fICgoX19hbGxvY19zaXplX18oeCx5KSkpCisjZWxzZQorLyoqIE1hY3JvIGZvciB1c2FnZSBvZiBHQ0MncyBhbGxvY19zaXplIGF0dHJpYnV0ZSAqLworI2RlZmluZSBQQV9HQ0NfQUxMT0NfU0laRSh4KQorLyoqIE1hY3JvIGZvciB1c2FnZSBvZiBHQ0MncyBhbGxvY19zaXplIGF0dHJpYnV0ZSAqLworI2RlZmluZSBQQV9HQ0NfQUxMT0NfU0laRTIoeCx5KQorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBQQV9HQ0NfTUFMTE9DCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgUEFfR0NDX01BTExPQyBfX2F0dHJpYnV0ZV9fICgobWFsbG9jKSkKKyNlbHNlCisvKiogTWFjcm8gZm9yIHVzYWdlIG9mIEdDQydzIG1hbGxvYyBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgUEFfR0NDX01BTExPQworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBQQV9HQ0NfV0VBS1JFRgorI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19FTEZfXykgJiYgKCgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID4gMSkpIHx8IChfX0dOVUNfXyA+IDQpKQorLyoqIE1hY3JvIGZvciB1c2FnZSBvZiBHQ0MncyB3ZWFrcmVmIGF0dHJpYnV0ZSAqLworI2RlZmluZSBQQV9HQ0NfV0VBS1JFRih4KSBfX2F0dHJpYnV0ZV9fKCh3ZWFrcmVmKCN4KSkpCisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZ2xpYi1tYWlubG9vcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9nbGliLW1haW5sb29wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA1ZDc0NgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZ2xpYi1tYWlubG9vcC5oCkBAIC0wLDAgKzEsNjkgQEAKKyNpZm5kZWYgZm9vZ2xpYm1haW5sb29waGZvbworI2RlZmluZSBmb29nbGlibWFpbmxvb3BoZm9vCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwNiBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSA8cHVsc2UvbWFpbmxvb3AtYXBpLmg+CisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKyNpbmNsdWRlIDxwdWxzZS92ZXJzaW9uLmg+CisKKy8qKiBccGFnZSBnbGliLW1haW5sb29wIEdMSUIgTWFpbiBMb29wIEJpbmRpbmdzCisgKgorICogXHNlY3Rpb24gb3ZlcnZfc2VjIE92ZXJ2aWV3CisgKgorICogVGhlIEdMSUIgbWFpbiBsb29wIGJpbmRpbmdzIGFyZSBleHRyZW1lbHkgZWFzeSB0byB1c2UuIEFsbCB0aGF0IGlzCisgKiByZXF1aXJlZCBpcyB0byBjcmVhdGUgYSBwYV9nbGliX21haW5sb29wIG9iamVjdCB1c2luZworICogcGFfZ2xpYl9tYWlubG9vcF9uZXcoKS4gV2hlbiB0aGUgbWFpbiBsb29wIGFic3RyYWN0aW9uIGlzIG5lZWRlZCwgaXQgaXMKKyAqIHByb3ZpZGVkIGJ5IHBhX2dsaWJfbWFpbmxvb3BfZ2V0X2FwaSgpLgorICoKKyAqLworCisvKiogXGZpbGUKKyAqIEdMSUIgbWFpbiBsb29wIHN1cHBvcnQKKyAqCisgKiBTZWUgYWxzbyBcc3VicGFnZSBnbGliLW1haW5sb29wCisgKi8KKworUEFfQ19ERUNMX0JFR0lOCisKKy8qKiBBbiBvcGFxdWUgR0xJQiBtYWluIGxvb3Agb2JqZWN0ICovCit0eXBlZGVmIHN0cnVjdCBwYV9nbGliX21haW5sb29wIHBhX2dsaWJfbWFpbmxvb3A7CisKKy8qKiBDcmVhdGUgYSBuZXcgR0xJQiBtYWluIGxvb3Agb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIEdMSUIgbWFpbgorICogbG9vcCBjb250ZXh0LiBUYWtlcyBhbiBhcmd1bWVudCBjIGZvciB0aGUKKyAqIEdNYWluQ29udGV4dCB0byB1c2UuIElmIGMgaXMgTlVMTCB0aGUgZGVmYXVsdCBjb250ZXh0IGlzIHVzZWQuICovCitwYV9nbGliX21haW5sb29wICpwYV9nbGliX21haW5sb29wX25ldyhHTWFpbkNvbnRleHQgKmMpOworCisvKiogRnJlZSB0aGUgR0xJQiBtYWluIGxvb3Agb2JqZWN0ICovCit2b2lkIHBhX2dsaWJfbWFpbmxvb3BfZnJlZShwYV9nbGliX21haW5sb29wKiBnKTsKKworLyoqIFJldHVybiB0aGUgYWJzdHJhY3QgbWFpbiBsb29wIEFQSSB2dGFibGUgZm9yIHRoZSBHTElCIG1haW4gbG9vcAorICAgIG9iamVjdC4gTm8gbmVlZCB0byBmcmVlIHRoZSBBUEkgYXMgaXQgaXMgb3duZWQgYnkgdGhlIGxvb3AKKyAgICBhbmQgaXMgZGVzdHJveWVkIHdoZW4gdGhlIGxvb3AgaXMgZnJlZWQuICovCitwYV9tYWlubG9vcF9hcGkqIHBhX2dsaWJfbWFpbmxvb3BfZ2V0X2FwaShwYV9nbGliX21haW5sb29wICpnKTsKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvaW50cm9zcGVjdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9pbnRyb3NwZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcwM2U5NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvaW50cm9zcGVjdC5oCkBAIC0wLDAgKzEsNzEyIEBACisjaWZuZGVmIGZvb2ludHJvc3BlY3RoZm9vCisjZGVmaW5lIGZvb2ludHJvc3BlY3RoZm9vCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwNiBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPHB1bHNlL29wZXJhdGlvbi5oPgorI2luY2x1ZGUgPHB1bHNlL2NvbnRleHQuaD4KKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL2djY21hY3JvLmg+CisjaW5jbHVkZSA8cHVsc2UvY2hhbm5lbG1hcC5oPgorI2luY2x1ZGUgPHB1bHNlL3ZvbHVtZS5oPgorI2luY2x1ZGUgPHB1bHNlL3Byb3BsaXN0Lmg+CisjaW5jbHVkZSA8cHVsc2UvZm9ybWF0Lmg+CisjaW5jbHVkZSA8cHVsc2UvdmVyc2lvbi5oPgorCisvKiogXHBhZ2UgaW50cm9zcGVjdCBTZXJ2ZXIgUXVlcnkgYW5kIENvbnRyb2wKKyAqCisgKiBcc2VjdGlvbiBvdmVydl9zZWMgT3ZlcnZpZXcKKyAqCisgKiBTb21ldGltZXMgaXQgaXMgbmVjZXNzYXJ5IHRvIHF1ZXJ5IGFuZCBtb2RpZnkgZ2xvYmFsIHNldHRpbmdzIGluIHRoZQorICogc2VydmVyLiBGb3IgdGhpcywgUHVsc2VBdWRpbyBoYXMgdGhlIGludHJvc3BlY3Rpb24gQVBJLiBJdCBjYW4gbGlzdCBzaW5rcywKKyAqIHNvdXJjZXMsIHNhbXBsZXMgYW5kIG90aGVyIGFzcGVjdHMgb2YgdGhlIHNlcnZlci4gSXQgY2FuIGFsc28gbW9kaWZ5IHRoZQorICogYXR0cmlidXRlcyBvZiB0aGUgc2VydmVyIHRoYXQgd2lsbCBhZmZlY3Qgb3BlcmF0aW9ucyBvbiBhIGdsb2JhbCBsZXZlbCwKKyAqIGFuZCBub3QganVzdCB0aGUgYXBwbGljYXRpb24ncyBjb250ZXh0LgorICoKKyAqIFxzZWN0aW9uIHF1ZXJ5X3NlYyBRdWVyeWluZworICoKKyAqIEFsbCBxdWVyeWluZyBpcyBkb25lIHRocm91Z2ggY2FsbGJhY2tzLiBUaGlzIGRlc2lnbiBpcyBuZWNlc3NhcnkgdG8KKyAqIG1haW50YWluIGFuIGFzeW5jaHJvbm91cyBkZXNpZ24uIFRoZSBjbGllbnQgd2lsbCByZXF1ZXN0IHRoZSBpbmZvcm1hdGlvbgorICogYW5kIHNvbWUgdGltZSBsYXRlciwgdGhlIHNlcnZlciB3aWxsIHJlc3BvbmQgd2l0aCB0aGUgZGVzaXJlZCBkYXRhLgorICoKKyAqIFNvbWUgb2JqZWN0cyBjYW4gaGF2ZSBtdWx0aXBsZSBlbnRyaWVzIGF0IHRoZSBzZXJ2ZXIuIFdoZW4gcmVxdWVzdGluZyBhbGwKKyAqIG9mIHRoZXNlIGF0IG9uY2UsIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywgb25jZSBmb3IKKyAqIGVhY2ggb2JqZWN0LiBXaGVuIHRoZSBsaXN0IGhhcyBiZWVuIGV4aGF1c3RlZCwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkCisgKiB3aXRob3V0IGFuIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBhbmQgdGhlIGVvbCBwYXJhbWV0ZXIgc2V0IHRvIGEgcG9zaXRpdmUKKyAqIHZhbHVlLgorICoKKyAqIE5vdGUgdGhhdCBldmVuIGlmIGEgc2luZ2xlIG9iamVjdCBpcyByZXF1ZXN0ZWQsIGFuZCBub3QgdGhlIGVudGlyZSBsaXN0LAorICogdGhlIHRlcm1pbmF0aW5nIGNhbGwgd2lsbCBzdGlsbCBiZSBtYWRlLgorICoKKyAqIElmIGFuIGVycm9yIG9jY3VycywgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdpdGhvdXQgYW4gaW5mb3JtYXRpb24KKyAqIHN0cnVjdHVyZSBhbmQgZW9sIHNldCB0byBhIG5lZ2F0aXZlIHZhbHVlLi4KKyAqCisgKiBEYXRhIG1lbWJlcnMgaW4gdGhlIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXJlIG9ubHkgdmFsaWQgZHVyaW5nIHRoZQorICogZHVyYXRpb24gb2YgdGhlIGNhbGxiYWNrLiBJZiB0aGV5IGFyZSByZXF1aXJlZCBhZnRlciB0aGUgY2FsbGJhY2sgaXMKKyAqIGZpbmlzaGVkLCBhIGRlZXAgY29weSBtdXN0IGJlIHBlcmZvcm1lZC4KKyAqCisgKiBcc3Vic2VjdGlvbiBzZXJ2ZXJfc3Vic2VjIFNlcnZlciBJbmZvcm1hdGlvbgorICoKKyAqIFRoZSBzZXJ2ZXIgY2FuIGJlIHF1ZXJpZWQgYWJvdXQgaXRzIG5hbWUsIHRoZSBlbnZpcm9ubWVudCBpdCdzIHJ1bm5pbmcgb24KKyAqIGFuZCB0aGUgY3VycmVudGx5IGFjdGl2ZSBnbG9iYWwgZGVmYXVsdHMuIENhbGxpbmcKKyAqIHBhX2NvbnRleHRfZ2V0X3NlcnZlcl9pbmZvKCkgd2lsbCBnZXQgYWNjZXNzIHRvIGEgcGFfc2VydmVyX2luZm8gc3RydWN0dXJlCisgKiBjb250YWluaW5nIGFsbCBvZiB0aGVzZS4KKyAqCisgKiBcc3Vic2VjdGlvbiBtZW1zdGF0X3N1YnNlYyBNZW1vcnkgVXNhZ2UKKyAqCisgKiBTdGF0aXN0aWNzIGFib3V0IG1lbW9yeSB1c2FnZSBjYW4gYmUgZmV0Y2hlZCB1c2luZyBwYV9jb250ZXh0X3N0YXQoKSwKKyAqIGdpdmluZyBhIHBhX3N0YXRfaW5mbyBzdHJ1Y3R1cmUuCisgKgorICogXHN1YnNlY3Rpb24gc2lua3NyY19zdWJzZWMgU2lua3MgYW5kIFNvdXJjZXMKKyAqCisgKiBUaGUgc2VydmVyIGNhbiBoYXZlIGFuIGFyYml0cmFyeSBudW1iZXIgb2Ygc2lua3MgYW5kIHNvdXJjZXMuIEVhY2ggc2luaworICogYW5kIHNvdXJjZSBoYXZlIGJvdGggYW4gaW5kZXggYW5kIGEgbmFtZSBhc3NvY2lhdGVkIHdpdGggaXQuIEFzIHN1Y2gKKyAqIHRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGdldCBhY2Nlc3MgdG8gdGhlbToKKyAqCisgKiBcbGkgQnkgaW5kZXggLSBwYV9jb250ZXh0X2dldF9zaW5rX2luZm9fYnlfaW5kZXgoKSAvCisgKiAgICAgICAgICAgICAgICBwYV9jb250ZXh0X2dldF9zb3VyY2VfaW5mb19ieV9pbmRleCgpCisgKiBcbGkgQnkgbmFtZSAtIHBhX2NvbnRleHRfZ2V0X3NpbmtfaW5mb19ieV9uYW1lKCkgLworICogICAgICAgICAgICAgICBwYV9jb250ZXh0X2dldF9zb3VyY2VfaW5mb19ieV9uYW1lKCkKKyAqIFxsaSBBbGwgLSBwYV9jb250ZXh0X2dldF9zaW5rX2luZm9fbGlzdCgpIC8KKyAqICAgICAgICAgICBwYV9jb250ZXh0X2dldF9zb3VyY2VfaW5mb19saXN0KCkKKyAqCisgKiBBbGwgdGhyZWUgbWV0aG9kIHVzZSB0aGUgc2FtZSBjYWxsYmFjayBhbmQgd2lsbCBwcm92aWRlIGEgcGFfc2lua19pbmZvIG9yCisgKiBwYV9zb3VyY2VfaW5mbyBzdHJ1Y3R1cmUuCisgKgorICogXHN1YnNlY3Rpb24gc2lzb19zdWJzZWMgU2luayBJbnB1dHMgYW5kIFNvdXJjZSBPdXRwdXRzCisgKgorICogU2luayBpbnB1dHMgYW5kIHNvdXJjZSBvdXRwdXRzIGFyZSB0aGUgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBjbGllbnQgZW5kcworICogb2Ygc3RyZWFtcyBpbnNpZGUgdGhlIHNlcnZlci4gSS5lLiB0aGV5IGNvbm5lY3QgYSBjbGllbnQgc3RyZWFtIHRvIG9uZSBvZgorICogdGhlIGdsb2JhbCBzaW5rcyBvciBzb3VyY2VzLgorICoKKyAqIFNpbmsgaW5wdXRzIGFuZCBzb3VyY2Ugb3V0cHV0cyBvbmx5IGhhdmUgYW4gaW5kZXggdG8gaWRlbnRpZnkgdGhlbS4gQXMKKyAqIHN1Y2gsIHRoZXJlIGFyZSBvbmx5IHR3byB3YXlzIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGVtOgorICoKKyAqIFxsaSBCeSBpbmRleCAtIHBhX2NvbnRleHRfZ2V0X3NpbmtfaW5wdXRfaW5mbygpIC8KKyAqICAgICAgICAgICAgICAgIHBhX2NvbnRleHRfZ2V0X3NvdXJjZV9vdXRwdXRfaW5mbygpCisgKiBcbGkgQWxsIC0gcGFfY29udGV4dF9nZXRfc2lua19pbnB1dF9pbmZvX2xpc3QoKSAvCisgKiAgICAgICAgICAgcGFfY29udGV4dF9nZXRfc291cmNlX291dHB1dF9pbmZvX2xpc3QoKQorICoKKyAqIFRoZSBzdHJ1Y3R1cmUgcmV0dXJuZWQgaXMgdGhlIHBhX3NpbmtfaW5wdXRfaW5mbyBvciBwYV9zb3VyY2Vfb3V0cHV0X2luZm8KKyAqIHN0cnVjdHVyZS4KKyAqCisgKiBcc3Vic2VjdGlvbiBzYW1wbGVzX3N1YnNlYyBTYW1wbGVzCisgKgorICogVGhlIGxpc3Qgb2YgY2FjaGVkIHNhbXBsZXMgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBzZXJ2ZXIuIFRocmVlIG1ldGhvZHMKKyAqIGV4aXN0IGZvciBxdWVyeWluZyB0aGUgc2FtcGxlIGNhY2hlIGxpc3Q6CisgKgorICogXGxpIEJ5IGluZGV4IC0gcGFfY29udGV4dF9nZXRfc2FtcGxlX2luZm9fYnlfaW5kZXgoKQorICogXGxpIEJ5IG5hbWUgLSBwYV9jb250ZXh0X2dldF9zYW1wbGVfaW5mb19ieV9uYW1lKCkKKyAqIFxsaSBBbGwgLSBwYV9jb250ZXh0X2dldF9zYW1wbGVfaW5mb19saXN0KCkKKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBvbmx5IHJldHJpZXZlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2FtcGxlLCBub3QgdGhlIHNhbXBsZQorICogZGF0YSBpdHNlbGYuCisgKgorICogXHN1YnNlY3Rpb24gbW9kdWxlX3N1YnNlYyBEcml2ZXIgTW9kdWxlcworICoKKyAqIFB1bHNlQXVkaW8gZHJpdmVyIG1vZHVsZXMgYXJlIGlkZW50aWZpZWQgYnkgaW5kZXggYW5kIGFyZSByZXRyaWV2ZWQgdXNpbmcgZWl0aGVyCisgKiBwYV9jb250ZXh0X2dldF9tb2R1bGVfaW5mbygpIG9yIHBhX2NvbnRleHRfZ2V0X21vZHVsZV9pbmZvX2xpc3QoKS4gVGhlCisgKiBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgaXMgY2FsbGVkIHBhX21vZHVsZV9pbmZvLgorICoKKyAqIFxzdWJzZWN0aW9uIGNsaWVudF9zdWJzZWMgQ2xpZW50cworICoKKyAqIFB1bHNlQXVkaW8gY2xpZW50cyBhcmUgYWxzbyBpZGVudGlmaWVkIGJ5IGluZGV4IGFuZCBhcmUgcmV0cmlldmVkIHVzaW5nCisgKiBlaXRoZXIgcGFfY29udGV4dF9nZXRfY2xpZW50X2luZm8oKSBvciBwYV9jb250ZXh0X2dldF9jbGllbnRfaW5mb19saXN0KCkuCisgKiBUaGUgaW5mb3JtYXRpb24gc3RydWN0dXJlIGlzIGNhbGxlZCBwYV9jbGllbnRfaW5mby4KKyAqCisgKiBcc2VjdGlvbiBjdHJsX3NlYyBDb250cm9sCisgKgorICogU29tZSBwYXJ0cyBvZiB0aGUgc2VydmVyIGFyZSBvbmx5IHBvc3NpYmxlIHRvIHJlYWQsIGJ1dCBtb3N0IGNhbiBhbHNvIGJlCisgKiBtb2RpZmllZCBpbiBkaWZmZXJlbnQgd2F5cy4gTm90ZSB0aGF0IHRoZXNlIGNoYW5nZXMgd2lsbCBhZmZlY3QgYWxsCisgKiBjb25uZWN0ZWQgY2xpZW50cyBhbmQgbm90IGp1c3QgdGhlIG9uZSBpc3N1aW5nIHRoZSByZXF1ZXN0LgorICoKKyAqIFxzdWJzZWN0aW9uIHNpbmtzcmNfc3Vic2VjIFNpbmtzIGFuZCBTb3VyY2VzCisgKgorICogVGhlIG1vc3QgY29tbW9uIGNoYW5nZSBvbmUgd291bGQgd2FudCB0byBkbyB0byBzaW5rcyBhbmQgc291cmNlcyBpcyB0bworICogbW9kaWZ5IHRoZSB2b2x1bWUgb2YgdGhlIGF1ZGlvLiBJZGVudGljYWwgdG8gaG93IHNpbmtzIGFuZCBzb3VyY2VzIGNhbgorICogYmUgcXVlcmllZCwgdGhlcmUgYXJlIHR3byB3YXlzIG9mIGlkZW50aWZ5aW5nIHRoZW06CisgKgorICogXGxpIEJ5IGluZGV4IC0gcGFfY29udGV4dF9zZXRfc2lua192b2x1bWVfYnlfaW5kZXgoKSAvCisgKiAgICAgICAgICAgICAgICBwYV9jb250ZXh0X3NldF9zb3VyY2Vfdm9sdW1lX2J5X2luZGV4KCkKKyAqIFxsaSBCeSBuYW1lIC0gcGFfY29udGV4dF9zZXRfc2lua192b2x1bWVfYnlfbmFtZSgpIC8KKyAqICAgICAgICAgICAgICAgcGFfY29udGV4dF9zZXRfc291cmNlX3ZvbHVtZV9ieV9uYW1lKCkKKyAqCisgKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG11dGUgYSBzaW5rIG9yIHNvdXJjZToKKyAqCisgKiBcbGkgQnkgaW5kZXggLSBwYV9jb250ZXh0X3NldF9zaW5rX211dGVfYnlfaW5kZXgoKSAvCisgKiAgICAgICAgICAgICAgICBwYV9jb250ZXh0X3NldF9zb3VyY2VfbXV0ZV9ieV9pbmRleCgpCisgKiBcbGkgQnkgbmFtZSAtIHBhX2NvbnRleHRfc2V0X3NpbmtfbXV0ZV9ieV9uYW1lKCkgLworICogICAgICAgICAgICAgICBwYV9jb250ZXh0X3NldF9zb3VyY2VfbXV0ZV9ieV9uYW1lKCkKKyAqCisgKiBcc3Vic2VjdGlvbiBzaXNvX3N1YnNlYyBTaW5rIElucHV0cyBhbmQgU291cmNlIE91dHB1dHMKKyAqCisgKiBJZiBhbiBhcHBsaWNhdGlvbiBkZXNpcmVzIHRvIG1vZGlmeSB0aGUgdm9sdW1lIG9mIGp1c3QgYSBzaW5nbGUgc3RyZWFtCisgKiAoY29tbW9ubHkgb25lIG9mIGl0cyBvd24gc3RyZWFtcyksIHRoaXMgY2FuIGJlIGRvbmUgYnkgc2V0dGluZyB0aGUgdm9sdW1lCisgKiBvZiBpdHMgYXNzb2NpYXRlZCBzaW5rIGlucHV0IG9yIHNvdXJjZSBvdXRwdXQsIHVzaW5nCisgKiBwYV9jb250ZXh0X3NldF9zaW5rX2lucHV0X3ZvbHVtZSgpIG9yIHBhX2NvbnRleHRfc2V0X3NvdXJjZV9vdXRwdXRfdm9sdW1lKCkKKyAqCisgKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHJlbW92ZSBzaW5rIGlucHV0cyBhbmQgc291cmNlIG91dHB1dHMsIHRlcm1pbmF0aW5nCisgKiB0aGUgc3RyZWFtcyBhc3NvY2lhdGVkIHdpdGggdGhlbToKKyAqCisgKiBcbGkgU2luayBpbnB1dCAtIHBhX2NvbnRleHRfa2lsbF9zaW5rX2lucHV0KCkKKyAqIFxsaSBTb3VyY2Ugb3V0cHV0IC0gcGFfY29udGV4dF9raWxsX3NvdXJjZV9vdXRwdXQoKQorICoKKyAqIFxzdWJzZWN0aW9uIG1vZHVsZV9zdWJzZWMgTW9kdWxlcworICoKKyAqIFNlcnZlciBtb2R1bGVzIGNhbiBiZSByZW1vdGVseSBsb2FkZWQgYW5kIHVubG9hZGVkIHVzaW5nCisgKiBwYV9jb250ZXh0X2xvYWRfbW9kdWxlKCkgYW5kIHBhX2NvbnRleHRfdW5sb2FkX21vZHVsZSgpLgorICoKKyAqIFxzdWJzZWN0aW9uIGNsaWVudF9zdWJzZWMgQ2xpZW50cworICoKKyAqIFRoZSBvbmx5IG9wZXJhdGlvbiBzdXBwb3J0ZWQgb24gY2xpZW50cywgaXMgdGhlIHBvc3NpYmlsaXR5IG9mIGtpY2tpbmcKKyAqIHRoZW0gb2ZmIHRoZSBzZXJ2ZXIgdXNpbmcgcGFfY29udGV4dF9raWxsX2NsaWVudCgpLgorICovCisKKy8qKiBcZmlsZQorICoKKyAqIFJvdXRpbmVzIGZvciBkYWVtb24gaW50cm9zcGVjdGlvbi4KKyAqCisgKiBTZWUgYWxzbyBcc3VicGFnZSBpbnRyb3NwZWN0CisgKi8KKworUEFfQ19ERUNMX0JFR0lOCisKKy8qKiBAeyBcbmFtZSBTaW5rcyAqLworCisvKiogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgcG9ydCBvZiBhIHNpbmsuICBQbGVhc2UKKyAqIG5vdGUgdGhhdCB0aGlzIHN0cnVjdHVyZSBjYW4gYmUgZXh0ZW5kZWQgYXMgcGFydCBvZiBldm9sdXRpb25hcnkKKyAqIEFQSSB1cGRhdGVzIGF0IGFueSB0aW1lIGluIGFueSBuZXcgcmVsZWFzZS4gXHNpbmNlIDAuOS4xNiAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfc2lua19wb3J0X2luZm8geworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGlzIHBvcnQgKi8KKyAgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsgICAgICAgICAgICAvKio8IERlc2NyaXB0aW9uIG9mIHRoaXMgcG9ydCAqLworICAgIHVpbnQzMl90IHByaW9yaXR5OyAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIGhpZ2hlciB0aGlzIHZhbHVlIGlzIHRoZSBtb3JlIHVzZWZ1bCB0aGlzIHBvcnQgaXMgYXMgYSBkZWZhdWx0ICovCisgICAgaW50IGF2YWlsYWJsZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBIFxsaW5rIHBhX3BvcnRfYXZhaWxhYmxlX3QsIGluZGljYXRpbmcgYXZhaWxhYmlsaXR5IHN0YXR1cyBvZiB0aGlzIHBvcnQuIFxzaW5jZSAyLjAgKi8KK30gcGFfc2lua19wb3J0X2luZm87CisKKy8qKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgc2lua3MuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBzdHJ1Y3R1cmUKKyAqIGNhbiBiZSBleHRlbmRlZCBhcyBwYXJ0IG9mIGV2b2x1dGlvbmFyeSBBUEkgdXBkYXRlcyBhdCBhbnkgdGltZSBpbgorICogYW55IG5ldyByZWxlYXNlLiAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfc2lua19pbmZvIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGUgc2luayAqLworICAgIHVpbnQzMl90IGluZGV4OyAgICAgICAgICAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGUgc2luayAqLworICAgIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uOyAgICAgICAgICAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGlzIHNpbmsgKi8KKyAgICBwYV9zYW1wbGVfc3BlYyBzYW1wbGVfc3BlYzsgICAgICAgIC8qKjwgU2FtcGxlIHNwZWMgb2YgdGhpcyBzaW5rICovCisgICAgcGFfY2hhbm5lbF9tYXAgY2hhbm5lbF9tYXA7ICAgICAgICAvKio8IENoYW5uZWwgbWFwICovCisgICAgdWludDMyX3Qgb3duZXJfbW9kdWxlOyAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBvd25pbmcgbW9kdWxlIG9mIHRoaXMgc2luaywgb3IgUEFfSU5WQUxJRF9JTkRFWCAqLworICAgIHBhX2N2b2x1bWUgdm9sdW1lOyAgICAgICAgICAgICAgICAgLyoqPCBWb2x1bWUgb2YgdGhlIHNpbmsgKi8KKyAgICBpbnQgbXV0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTXV0ZSBzd2l0Y2ggb2YgdGhlIHNpbmsgKi8KKyAgICB1aW50MzJfdCBtb25pdG9yX3NvdXJjZTsgICAgICAgICAgIC8qKjwgSW5kZXggb2YgdGhlIG1vbml0b3Igc291cmNlIGNvbm5lY3RlZCB0byB0aGlzIHNpbmsgKi8KKyAgICBjb25zdCBjaGFyICptb25pdG9yX3NvdXJjZV9uYW1lOyAgIC8qKjwgVGhlIG5hbWUgb2YgdGhlIG1vbml0b3Igc291cmNlICovCisgICAgcGFfdXNlY190IGxhdGVuY3k7ICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBvZiBxdWV1ZWQgYXVkaW8gaW4gdGhlIG91dHB1dCBidWZmZXIuICovCisgICAgY29uc3QgY2hhciAqZHJpdmVyOyAgICAgICAgICAgICAgICAvKio8IERyaXZlciBuYW1lLiAqLworICAgIHBhX3NpbmtfZmxhZ3NfdCBmbGFnczsgICAgICAgICAgICAgLyoqPCBGbGFncyAqLworICAgIHBhX3Byb3BsaXN0ICpwcm9wbGlzdDsgICAgICAgICAgICAgLyoqPCBQcm9wZXJ0eSBsaXN0IFxzaW5jZSAwLjkuMTEgKi8KKyAgICBwYV91c2VjX3QgY29uZmlndXJlZF9sYXRlbmN5OyAgICAgIC8qKjwgVGhlIGxhdGVuY3kgdGhpcyBkZXZpY2UgaGFzIGJlZW4gY29uZmlndXJlZCB0by4gXHNpbmNlIDAuOS4xMSAqLworICAgIHBhX3ZvbHVtZV90IGJhc2Vfdm9sdW1lOyAgICAgICAgICAgLyoqPCBTb21lIGtpbmQgb2YgImJhc2UiIHZvbHVtZSB0aGF0IHJlZmVycyB0byB1bmFtcGxpZmllZC91bmF0dGVudWF0ZWQgdm9sdW1lIGluIHRoZSBjb250ZXh0IG9mIHRoZSBvdXRwdXQgZGV2aWNlLiBcc2luY2UgMC45LjE1ICovCisgICAgcGFfc2lua19zdGF0ZV90IHN0YXRlOyAgICAgICAgICAgICAvKio8IFN0YXRlIFxzaW5jZSAwLjkuMTUgKi8KKyAgICB1aW50MzJfdCBuX3ZvbHVtZV9zdGVwczsgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHZvbHVtZSBzdGVwcyBmb3Igc2lua3Mgd2hpY2ggZG8gbm90IHN1cHBvcnQgYXJiaXRyYXJ5IHZvbHVtZXMuIFxzaW5jZSAwLjkuMTUgKi8KKyAgICB1aW50MzJfdCBjYXJkOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ2FyZCBpbmRleCwgb3IgUEFfSU5WQUxJRF9JTkRFWC4gXHNpbmNlIDAuOS4xNSAqLworICAgIHVpbnQzMl90IG5fcG9ydHM7ICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW50cmllcyBpbiBwb3J0IGFycmF5IFxzaW5jZSAwLjkuMTYgKi8KKyAgICBwYV9zaW5rX3BvcnRfaW5mbyoqIHBvcnRzOyAgICAgICAgIC8qKjwgQXJyYXkgb2YgYXZhaWxhYmxlIHBvcnRzLCBvciBOVUxMLiBBcnJheSBpcyB0ZXJtaW5hdGVkIGJ5IGFuIGVudHJ5IHNldCB0byBOVUxMLiBUaGUgbnVtYmVyIG9mIGVudHJpZXMgaXMgc3RvcmVkIGluIG5fcG9ydHMgXHNpbmNlIDAuOS4xNiAqLworICAgIHBhX3NpbmtfcG9ydF9pbmZvKiBhY3RpdmVfcG9ydDsgICAgLyoqPCBQb2ludGVyIHRvIGFjdGl2ZSBwb3J0IGluIHRoZSBhcnJheSwgb3IgTlVMTCBcc2luY2UgMC45LjE2ICovCisgICAgdWludDhfdCBuX2Zvcm1hdHM7ICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBmb3JtYXRzIHN1cHBvcnRlZCBieSB0aGUgc2luay4gXHNpbmNlIDEuMCAqLworICAgIHBhX2Zvcm1hdF9pbmZvICoqZm9ybWF0czsgICAgICAgICAgLyoqPCBBcnJheSBvZiBmb3JtYXRzIHN1cHBvcnRlZCBieSB0aGUgc2luay4gXHNpbmNlIDEuMCAqLworfSBwYV9zaW5rX2luZm87CisKKy8qKiBDYWxsYmFjayBwcm90b3R5cGUgZm9yIHBhX2NvbnRleHRfZ2V0X3NpbmtfaW5mb19ieV9uYW1lKCkgYW5kIGZyaWVuZHMgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX3NpbmtfaW5mb19jYl90KShwYV9jb250ZXh0ICpjLCBjb25zdCBwYV9zaW5rX2luZm8gKmksIGludCBlb2wsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmsgYnkgaXRzIG5hbWUgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfc2lua19pbmZvX2J5X25hbWUocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqbmFtZSwgcGFfc2lua19pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmsgYnkgaXRzIGluZGV4ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X3NpbmtfaW5mb19ieV9pbmRleChwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIHBhX3NpbmtfaW5mb19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBHZXQgdGhlIGNvbXBsZXRlIHNpbmsgbGlzdCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9zaW5rX2luZm9fbGlzdChwYV9jb250ZXh0ICpjLCBwYV9zaW5rX2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSB2b2x1bWUgb2YgYSBzaW5rIGRldmljZSBzcGVjaWZpZWQgYnkgaXRzIGluZGV4ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc2V0X3Npbmtfdm9sdW1lX2J5X2luZGV4KHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgY29uc3QgcGFfY3ZvbHVtZSAqdm9sdW1lLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSB2b2x1bWUgb2YgYSBzaW5rIGRldmljZSBzcGVjaWZpZWQgYnkgaXRzIG5hbWUgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zZXRfc2lua192b2x1bWVfYnlfbmFtZShwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBwYV9jdm9sdW1lICp2b2x1bWUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIG11dGUgc3dpdGNoIG9mIGEgc2luayBkZXZpY2Ugc3BlY2lmaWVkIGJ5IGl0cyBpbmRleCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9zaW5rX211dGVfYnlfaW5kZXgocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBpbnQgbXV0ZSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFNldCB0aGUgbXV0ZSBzd2l0Y2ggb2YgYSBzaW5rIGRldmljZSBzcGVjaWZpZWQgYnkgaXRzIG5hbWUgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zZXRfc2lua19tdXRlX2J5X25hbWUocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqbmFtZSwgaW50IG11dGUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTdXNwZW5kL1Jlc3VtZSBhIHNpbmsuIFxzaW5jZSAwLjkuNyAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3N1c3BlbmRfc2lua19ieV9uYW1lKHBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIgKnNpbmtfbmFtZSwgaW50IHN1c3BlbmQsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkKiB1c2VyZGF0YSk7CisKKy8qKiBTdXNwZW5kL1Jlc3VtZSBhIHNpbmsuIElmIGlkeCBpcyBQQV9JTlZBTElEX0lOREVYIGFsbCBzaW5rcyB3aWxsIGJlIHN1c3BlbmRlZC4gXHNpbmNlIDAuOS43ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc3VzcGVuZF9zaW5rX2J5X2luZGV4KHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgaW50IHN1c3BlbmQsICBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCogdXNlcmRhdGEpOworCisvKiogQ2hhbmdlIHRoZSBwcm9maWxlIG9mIGEgc2luay4gXHNpbmNlIDAuOS4xNiAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9zaW5rX3BvcnRfYnlfaW5kZXgocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBjb25zdCBjaGFyKnBvcnQsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBDaGFuZ2UgdGhlIHByb2ZpbGUgb2YgYSBzaW5rLiBcc2luY2UgMC45LjE1ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc2V0X3NpbmtfcG9ydF9ieV9uYW1lKHBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIqbmFtZSwgY29uc3QgY2hhcipwb3J0LCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQH0gKi8KKworLyoqIEB7IFxuYW1lIFNvdXJjZXMgKi8KKworLyoqIFN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIHBvcnQgb2YgYSBzb3VyY2UuICBQbGVhc2UKKyAqIG5vdGUgdGhhdCB0aGlzIHN0cnVjdHVyZSBjYW4gYmUgZXh0ZW5kZWQgYXMgcGFydCBvZiBldm9sdXRpb25hcnkKKyAqIEFQSSB1cGRhdGVzIGF0IGFueSB0aW1lIGluIGFueSBuZXcgcmVsZWFzZS4gXHNpbmNlIDAuOS4xNiAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfc291cmNlX3BvcnRfaW5mbyB7CisgICAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgICAgLyoqPCBOYW1lIG9mIHRoaXMgcG9ydCAqLworICAgIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uOyAgICAgICAgICAgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhpcyBwb3J0ICovCisgICAgdWludDMyX3QgcHJpb3JpdHk7ICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgaGlnaGVyIHRoaXMgdmFsdWUgaXMgdGhlIG1vcmUgdXNlZnVsIHRoaXMgcG9ydCBpcyBhcyBhIGRlZmF1bHQgKi8KKyAgICBpbnQgYXZhaWxhYmxlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IEEgXGxpbmsgcGFfcG9ydF9hdmFpbGFibGVfdCwgaW5kaWNhdGluZyBhdmFpbGFiaWxpdHkgc3RhdHVzIG9mIHRoaXMgcG9ydC4gXHNpbmNlIDIuMCAqLworfSBwYV9zb3VyY2VfcG9ydF9pbmZvOworCisvKiogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IHNvdXJjZXMuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBzdHJ1Y3R1cmUKKyAqIGNhbiBiZSBleHRlbmRlZCBhcyBwYXJ0IG9mIGV2b2x1dGlvbmFyeSBBUEkgdXBkYXRlcyBhdCBhbnkgdGltZSBpbgorICogYW55IG5ldyByZWxlYXNlLiAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfc291cmNlX2luZm8geworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGUgc291cmNlICovCisgICAgdWludDMyX3QgaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGUgc291cmNlICovCisgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb247ICAgICAgICAgICAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGlzIHNvdXJjZSAqLworICAgIHBhX3NhbXBsZV9zcGVjIHNhbXBsZV9zcGVjOyAgICAgICAgIC8qKjwgU2FtcGxlIHNwZWMgb2YgdGhpcyBzb3VyY2UgKi8KKyAgICBwYV9jaGFubmVsX21hcCBjaGFubmVsX21hcDsgICAgICAgICAvKio8IENoYW5uZWwgbWFwICovCisgICAgdWludDMyX3Qgb3duZXJfbW9kdWxlOyAgICAgICAgICAgICAgLyoqPCBPd25pbmcgbW9kdWxlIGluZGV4LCBvciBQQV9JTlZBTElEX0lOREVYICovCisgICAgcGFfY3ZvbHVtZSB2b2x1bWU7ICAgICAgICAgICAgICAgICAgLyoqPCBWb2x1bWUgb2YgdGhlIHNvdXJjZSAqLworICAgIGludCBtdXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTXV0ZSBzd2l0Y2ggb2YgdGhlIHNpbmsgKi8KKyAgICB1aW50MzJfdCBtb25pdG9yX29mX3Npbms7ICAgICAgICAgICAvKio8IElmIHRoaXMgaXMgYSBtb25pdG9yIHNvdXJjZSB0aGUgaW5kZXggb2YgdGhlIG93bmluZyBzaW5rLCBvdGhlcndpc2UgUEFfSU5WQUxJRF9JTkRFWCAqLworICAgIGNvbnN0IGNoYXIgKm1vbml0b3Jfb2Zfc2lua19uYW1lOyAgIC8qKjwgTmFtZSBvZiB0aGUgb3duaW5nIHNpbmssIG9yIFBBX0lOVkFMSURfSU5ERVggKi8KKyAgICBwYV91c2VjX3QgbGF0ZW5jeTsgICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBvZiBmaWxsZWQgcmVjb3JkIGJ1ZmZlciBvZiB0aGlzIHNvdXJjZS4gKi8KKyAgICBjb25zdCBjaGFyICpkcml2ZXI7ICAgICAgICAgICAgICAgICAvKio8IERyaXZlciBuYW1lICovCisgICAgcGFfc291cmNlX2ZsYWdzX3QgZmxhZ3M7ICAgICAgICAgICAgLyoqPCBGbGFncyAqLworICAgIHBhX3Byb3BsaXN0ICpwcm9wbGlzdDsgICAgICAgICAgICAgIC8qKjwgUHJvcGVydHkgbGlzdCBcc2luY2UgMC45LjExICovCisgICAgcGFfdXNlY190IGNvbmZpZ3VyZWRfbGF0ZW5jeTsgICAgICAgLyoqPCBUaGUgbGF0ZW5jeSB0aGlzIGRldmljZSBoYXMgYmVlbiBjb25maWd1cmVkIHRvLiBcc2luY2UgMC45LjExICovCisgICAgcGFfdm9sdW1lX3QgYmFzZV92b2x1bWU7ICAgICAgICAgICAgLyoqPCBTb21lIGtpbmQgb2YgImJhc2UiIHZvbHVtZSB0aGF0IHJlZmVycyB0byB1bmFtcGxpZmllZC91bmF0dGVudWF0ZWQgdm9sdW1lIGluIHRoZSBjb250ZXh0IG9mIHRoZSBpbnB1dCBkZXZpY2UuIFxzaW5jZSAwLjkuMTUgKi8KKyAgICBwYV9zb3VyY2Vfc3RhdGVfdCBzdGF0ZTsgICAgICAgICAgICAvKio8IFN0YXRlIFxzaW5jZSAwLjkuMTUgKi8KKyAgICB1aW50MzJfdCBuX3ZvbHVtZV9zdGVwczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiB2b2x1bWUgc3RlcHMgZm9yIHNvdXJjZXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgYXJiaXRyYXJ5IHZvbHVtZXMuIFxzaW5jZSAwLjkuMTUgKi8KKyAgICB1aW50MzJfdCBjYXJkOyAgICAgICAgICAgICAgICAgICAgICAvKio8IENhcmQgaW5kZXgsIG9yIFBBX0lOVkFMSURfSU5ERVguIFxzaW5jZSAwLjkuMTUgKi8KKyAgICB1aW50MzJfdCBuX3BvcnRzOyAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnRyaWVzIGluIHBvcnQgYXJyYXkgXHNpbmNlIDAuOS4xNiAqLworICAgIHBhX3NvdXJjZV9wb3J0X2luZm8qKiBwb3J0czsgICAgICAgIC8qKjwgQXJyYXkgb2YgYXZhaWxhYmxlIHBvcnRzLCBvciBOVUxMLiBBcnJheSBpcyB0ZXJtaW5hdGVkIGJ5IGFuIGVudHJ5IHNldCB0byBOVUxMLiBUaGUgbnVtYmVyIG9mIGVudHJpZXMgaXMgc3RvcmVkIGluIG5fcG9ydHMgXHNpbmNlIDAuOS4xNiAgKi8KKyAgICBwYV9zb3VyY2VfcG9ydF9pbmZvKiBhY3RpdmVfcG9ydDsgICAvKio8IFBvaW50ZXIgdG8gYWN0aXZlIHBvcnQgaW4gdGhlIGFycmF5LCBvciBOVUxMIFxzaW5jZSAwLjkuMTYgICovCisgICAgdWludDhfdCBuX2Zvcm1hdHM7ICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgdGhlIHNvdXJjZS4gXHNpbmNlIDEuMCAqLworICAgIHBhX2Zvcm1hdF9pbmZvICoqZm9ybWF0czsgICAgICAgICAgIC8qKjwgQXJyYXkgb2YgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgdGhlIHNvdXJjZS4gXHNpbmNlIDEuMCAqLworfSBwYV9zb3VyY2VfaW5mbzsKKworLyoqIENhbGxiYWNrIHByb3RvdHlwZSBmb3IgcGFfY29udGV4dF9nZXRfc291cmNlX2luZm9fYnlfbmFtZSgpIGFuZCBmcmllbmRzICovCit0eXBlZGVmIHZvaWQgKCpwYV9zb3VyY2VfaW5mb19jYl90KShwYV9jb250ZXh0ICpjLCBjb25zdCBwYV9zb3VyY2VfaW5mbyAqaSwgaW50IGVvbCwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgc291cmNlIGJ5IGl0cyBuYW1lICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X3NvdXJjZV9pbmZvX2J5X25hbWUocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqbmFtZSwgcGFfc291cmNlX2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgc291cmNlIGJ5IGl0cyBpbmRleCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9zb3VyY2VfaW5mb19ieV9pbmRleChwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIHBhX3NvdXJjZV9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCB0aGUgY29tcGxldGUgc291cmNlIGxpc3QgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfc291cmNlX2luZm9fbGlzdChwYV9jb250ZXh0ICpjLCBwYV9zb3VyY2VfaW5mb19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIHZvbHVtZSBvZiBhIHNvdXJjZSBkZXZpY2Ugc3BlY2lmaWVkIGJ5IGl0cyBpbmRleCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9zb3VyY2Vfdm9sdW1lX2J5X2luZGV4KHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgY29uc3QgcGFfY3ZvbHVtZSAqdm9sdW1lLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSB2b2x1bWUgb2YgYSBzb3VyY2UgZGV2aWNlIHNwZWNpZmllZCBieSBpdHMgbmFtZSAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9zb3VyY2Vfdm9sdW1lX2J5X25hbWUocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgcGFfY3ZvbHVtZSAqdm9sdW1lLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBtdXRlIHN3aXRjaCBvZiBhIHNvdXJjZSBkZXZpY2Ugc3BlY2lmaWVkIGJ5IGl0cyBpbmRleCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9zb3VyY2VfbXV0ZV9ieV9pbmRleChwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIGludCBtdXRlLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBtdXRlIHN3aXRjaCBvZiBhIHNvdXJjZSBkZXZpY2Ugc3BlY2lmaWVkIGJ5IGl0cyBuYW1lICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc2V0X3NvdXJjZV9tdXRlX2J5X25hbWUocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqbmFtZSwgaW50IG11dGUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTdXNwZW5kL1Jlc3VtZSBhIHNvdXJjZS4gXHNpbmNlIDAuOS43ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc3VzcGVuZF9zb3VyY2VfYnlfbmFtZShwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpzb3VyY2VfbmFtZSwgaW50IHN1c3BlbmQsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkKiB1c2VyZGF0YSk7CisKKy8qKiBTdXNwZW5kL1Jlc3VtZSBhIHNvdXJjZS4gSWYgaWR4IGlzIFBBX0lOVkFMSURfSU5ERVggYWxsIHNvdXJjZXMgd2lsbCBiZSBzdXNwZW5kZWQuIFxzaW5jZSAwLjkuNyAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3N1c3BlbmRfc291cmNlX2J5X2luZGV4KHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgaW50IHN1c3BlbmQsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkKiB1c2VyZGF0YSk7CisKKy8qKiBDaGFuZ2UgdGhlIHByb2ZpbGUgb2YgYSBzb3VyY2UuIFxzaW5jZSAwLjkuMTYgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zZXRfc291cmNlX3BvcnRfYnlfaW5kZXgocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBjb25zdCBjaGFyKnBvcnQsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBDaGFuZ2UgdGhlIHByb2ZpbGUgb2YgYSBzb3VyY2UuIFxzaW5jZSAwLjkuMTUgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zZXRfc291cmNlX3BvcnRfYnlfbmFtZShwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyKm5hbWUsIGNvbnN0IGNoYXIqcG9ydCwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEB9ICovCisKKy8qKiBAeyBcbmFtZSBTZXJ2ZXIgKi8KKworLyoqIFNlcnZlciBpbmZvcm1hdGlvbi4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHN0cnVjdHVyZSBjYW4gYmUKKyAqIGV4dGVuZGVkIGFzIHBhcnQgb2YgZXZvbHV0aW9uYXJ5IEFQSSB1cGRhdGVzIGF0IGFueSB0aW1lIGluIGFueSBuZXcKKyAqIHJlbGVhc2UuICovCit0eXBlZGVmIHN0cnVjdCBwYV9zZXJ2ZXJfaW5mbyB7CisgICAgY29uc3QgY2hhciAqdXNlcl9uYW1lOyAgICAgICAgICAgICAgLyoqPCBVc2VyIG5hbWUgb2YgdGhlIGRhZW1vbiBwcm9jZXNzICovCisgICAgY29uc3QgY2hhciAqaG9zdF9uYW1lOyAgICAgICAgICAgICAgLyoqPCBIb3N0IG5hbWUgdGhlIGRhZW1vbiBpcyBydW5uaW5nIG9uICovCisgICAgY29uc3QgY2hhciAqc2VydmVyX3ZlcnNpb247ICAgICAgICAgLyoqPCBWZXJzaW9uIHN0cmluZyBvZiB0aGUgZGFlbW9uICovCisgICAgY29uc3QgY2hhciAqc2VydmVyX25hbWU7ICAgICAgICAgICAgLyoqPCBTZXJ2ZXIgcGFja2FnZSBuYW1lICh1c3VhbGx5ICJwdWxzZWF1ZGlvIikgKi8KKyAgICBwYV9zYW1wbGVfc3BlYyBzYW1wbGVfc3BlYzsgICAgICAgICAvKio8IERlZmF1bHQgc2FtcGxlIHNwZWNpZmljYXRpb24gKi8KKyAgICBjb25zdCBjaGFyICpkZWZhdWx0X3NpbmtfbmFtZTsgICAgICAvKio8IE5hbWUgb2YgZGVmYXVsdCBzaW5rLiAqLworICAgIGNvbnN0IGNoYXIgKmRlZmF1bHRfc291cmNlX25hbWU7ICAgIC8qKjwgTmFtZSBvZiBkZWZhdWx0IHNvdXJjZS4gKi8KKyAgICB1aW50MzJfdCBjb29raWU7ICAgICAgICAgICAgICAgICAgICAvKio8IEEgcmFuZG9tIGNvb2tpZSBmb3IgaWRlbnRpZnlpbmcgdGhpcyBpbnN0YW5jZSBvZiBQdWxzZUF1ZGlvLiAqLworICAgIHBhX2NoYW5uZWxfbWFwIGNoYW5uZWxfbWFwOyAgICAgICAgIC8qKjwgRGVmYXVsdCBjaGFubmVsIG1hcC4gXHNpbmNlIDAuOS4xNSAqLworfSBwYV9zZXJ2ZXJfaW5mbzsKKworLyoqIENhbGxiYWNrIHByb3RvdHlwZSBmb3IgcGFfY29udGV4dF9nZXRfc2VydmVyX2luZm8oKSAqLwordHlwZWRlZiB2b2lkICgqcGFfc2VydmVyX2luZm9fY2JfdCkgKHBhX2NvbnRleHQgKmMsIGNvbnN0IHBhX3NlcnZlcl9pbmZvKmksIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJ2ZXIgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfc2VydmVyX2luZm8ocGFfY29udGV4dCAqYywgcGFfc2VydmVyX2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQH0gKi8KKworLyoqIEB7IFxuYW1lIE1vZHVsZXMgKi8KKworLyoqIFN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBtb2R1bGVzLiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgc3RydWN0dXJlCisgKiBjYW4gYmUgZXh0ZW5kZWQgYXMgcGFydCBvZiBldm9sdXRpb25hcnkgQVBJIHVwZGF0ZXMgYXQgYW55IHRpbWUgaW4KKyAqIGFueSBuZXcgcmVsZWFzZS4gKi8KK3R5cGVkZWYgc3RydWN0IHBhX21vZHVsZV9pbmZvIHsKKyAgICB1aW50MzJfdCBpbmRleDsgICAgICAgICAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBtb2R1bGUgKi8KKyAgICBjb25zdCBjaGFyKm5hbWUsICAgICAgICAgICAgICAgICAgICAvKio8IE5hbWUgb2YgdGhlIG1vZHVsZSAqLworICAgICAgICAqYXJndW1lbnQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQXJndW1lbnQgc3RyaW5nIG9mIHRoZSBtb2R1bGUgKi8KKyAgICB1aW50MzJfdCBuX3VzZWQ7ICAgICAgICAgICAgICAgICAgICAvKio8IFVzYWdlIGNvdW50ZXIgb3IgUEFfSU5WQUxJRF9JTkRFWCAqLworLyoqIFxjb25kIGZ1bGxkb2NzICovCisgICAgaW50IGF1dG9fdW5sb2FkOyAgICAgICAgICAgICAgICAgICAgLyoqPCBcZGVwcmVjYXRlZCBOb24temVybyBpZiB0aGlzIGlzIGFuIGF1dG9sb2FkZWQgbW9kdWxlICovCisvKiogXGVuZGNvbmQgKi8KKyAgICBwYV9wcm9wbGlzdCAqcHJvcGxpc3Q7ICAgICAgICAgICAgICAvKio8IFByb3BlcnR5IGxpc3QgXHNpbmNlIDAuOS4xNSAqLworfSBwYV9tb2R1bGVfaW5mbzsKKworLyoqIENhbGxiYWNrIHByb3RvdHlwZSBmb3IgcGFfY29udGV4dF9nZXRfbW9kdWxlX2luZm8oKSBhbmQgZnJpZW5kcyovCit0eXBlZGVmIHZvaWQgKCpwYV9tb2R1bGVfaW5mb19jYl90KSAocGFfY29udGV4dCAqYywgY29uc3QgcGFfbW9kdWxlX2luZm8qaSwgaW50IGVvbCwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgYSBtb2R1bGUgYnkgaXRzIGluZGV4ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X21vZHVsZV9pbmZvKHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgcGFfbW9kdWxlX2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IHRoZSBjb21wbGV0ZSBsaXN0IG9mIGN1cnJlbnRseSBsb2FkZWQgbW9kdWxlcyAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9tb2R1bGVfaW5mb19saXN0KHBhX2NvbnRleHQgKmMsIHBhX21vZHVsZV9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIENhbGxiYWNrIHByb3RvdHlwZSBmb3IgcGFfY29udGV4dF9sb2FkX21vZHVsZSgpICovCit0eXBlZGVmIHZvaWQgKCpwYV9jb250ZXh0X2luZGV4X2NiX3QpKHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogTG9hZCBhIG1vZHVsZS4gKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9sb2FkX21vZHVsZShwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyKm5hbWUsIGNvbnN0IGNoYXIgKmFyZ3VtZW50LCBwYV9jb250ZXh0X2luZGV4X2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFVubG9hZCBhIG1vZHVsZS4gKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF91bmxvYWRfbW9kdWxlKHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEB9ICovCisKKy8qKiBAeyBcbmFtZSBDbGllbnRzICovCisKKy8qKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgY2xpZW50cy4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHN0cnVjdHVyZQorICogY2FuIGJlIGV4dGVuZGVkIGFzIHBhcnQgb2YgZXZvbHV0aW9uYXJ5IEFQSSB1cGRhdGVzIGF0IGFueSB0aW1lIGluCisgKiBhbnkgbmV3IHJlbGVhc2UuICovCit0eXBlZGVmIHN0cnVjdCBwYV9jbGllbnRfaW5mbyB7CisgICAgdWludDMyX3QgaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW5kZXggb2YgdGhpcyBjbGllbnQgKi8KKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAgLyoqPCBOYW1lIG9mIHRoaXMgY2xpZW50ICovCisgICAgdWludDMyX3Qgb3duZXJfbW9kdWxlOyAgICAgICAgICAgICAgIC8qKjwgSW5kZXggb2YgdGhlIG93bmluZyBtb2R1bGUsIG9yIFBBX0lOVkFMSURfSU5ERVggKi8KKyAgICBjb25zdCBjaGFyICpkcml2ZXI7ICAgICAgICAgICAgICAgICAgLyoqPCBEcml2ZXIgbmFtZSAqLworICAgIHBhX3Byb3BsaXN0ICpwcm9wbGlzdDsgICAgICAgICAgICAgICAvKio8IFByb3BlcnR5IGxpc3QgXHNpbmNlIDAuOS4xMSAqLworfSBwYV9jbGllbnRfaW5mbzsKKworLyoqIENhbGxiYWNrIHByb3RvdHlwZSBmb3IgcGFfY29udGV4dF9nZXRfY2xpZW50X2luZm8oKSBhbmQgZnJpZW5kcyovCit0eXBlZGVmIHZvaWQgKCpwYV9jbGllbnRfaW5mb19jYl90KSAocGFfY29udGV4dCAqYywgY29uc3QgcGFfY2xpZW50X2luZm8qaSwgaW50IGVvbCwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgY2xpZW50IGJ5IGl0cyBpbmRleCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9jbGllbnRfaW5mbyhwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIHBhX2NsaWVudF9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCB0aGUgY29tcGxldGUgY2xpZW50IGxpc3QgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfY2xpZW50X2luZm9fbGlzdChwYV9jb250ZXh0ICpjLCBwYV9jbGllbnRfaW5mb19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBLaWxsIGEgY2xpZW50LiAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2tpbGxfY2xpZW50KHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEB9ICovCisKKy8qKiBAeyBcbmFtZSBDYXJkcyAqLworCisvKiogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgcHJvZmlsZSBvZiBhIGNhcmQuICBQbGVhc2UKKyAqIG5vdGUgdGhhdCB0aGlzIHN0cnVjdHVyZSBjYW4gYmUgZXh0ZW5kZWQgYXMgcGFydCBvZiBldm9sdXRpb25hcnkKKyAqIEFQSSB1cGRhdGVzIGF0IGFueSB0aW1lIGluIGFueSBuZXcgcmVsZWFzZS4gXHNpbmNlIDAuOS4xNSAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfY2FyZF9wcm9maWxlX2luZm8geworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGlzIHByb2ZpbGUgKi8KKyAgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsgICAgICAgICAgICAvKio8IERlc2NyaXB0aW9uIG9mIHRoaXMgcHJvZmlsZSAqLworICAgIHVpbnQzMl90IG5fc2lua3M7ICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHNpbmtzIHRoaXMgcHJvZmlsZSB3b3VsZCBjcmVhdGUgKi8KKyAgICB1aW50MzJfdCBuX3NvdXJjZXM7ICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBzb3VyY2VzIHRoaXMgcHJvZmlsZSB3b3VsZCBjcmVhdGUgKi8KKyAgICB1aW50MzJfdCBwcmlvcml0eTsgICAgICAgICAgICAgICAgICAvKio8IFRoZSBoaWdoZXIgdGhpcyB2YWx1ZSBpcyB0aGUgbW9yZSB1c2VmdWwgdGhpcyBwcm9maWxlIGlzIGFzIGEgZGVmYXVsdCAqLworfSBwYV9jYXJkX3Byb2ZpbGVfaW5mbzsKKworLyoqIFN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIHBvcnQgb2YgYSBjYXJkLiAgUGxlYXNlCisgKiBub3RlIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgY2FuIGJlIGV4dGVuZGVkIGFzIHBhcnQgb2YgZXZvbHV0aW9uYXJ5CisgKiBBUEkgdXBkYXRlcyBhdCBhbnkgdGltZSBpbiBhbnkgbmV3IHJlbGVhc2UuIFxzaW5jZSAyLjAgKi8KK3R5cGVkZWYgc3RydWN0IHBhX2NhcmRfcG9ydF9pbmZvIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAvKio8IE5hbWUgb2YgdGhpcyBwb3J0ICovCisgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb247ICAgICAgICAgICAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGlzIHBvcnQgKi8KKyAgICB1aW50MzJfdCBwcmlvcml0eTsgICAgICAgICAgICAgICAgICAvKio8IFRoZSBoaWdoZXIgdGhpcyB2YWx1ZSBpcyB0aGUgbW9yZSB1c2VmdWwgdGhpcyBwb3J0IGlzIGFzIGEgZGVmYXVsdCAqLworICAgIGludCBhdmFpbGFibGU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQSBcbGluayBwYV9wb3J0X2F2YWlsYWJsZV90LCBpbmRpY2F0aW5nIGF2YWlsYWJpbGl0eSBzdGF0dXMgb2YgdGhpcyBwb3J0LiAqLworICAgIGludCBkaXJlY3Rpb247ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhpcyBpcyBhIFxsaW5rIHBhX2RpcmVjdGlvbl90IGVudW0sIGluZGljYXRpbmcgdGhlIGRpcmVjdGlvbiBvZiB0aGlzIHBvcnQuICovCisgICAgdWludDMyX3Qgbl9wcm9maWxlczsgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW50cmllcyBpbiBwcm9maWxlIGFycmF5ICovCisgICAgcGFfY2FyZF9wcm9maWxlX2luZm8qKiBwcm9maWxlczsgICAgLyoqPCBBcnJheSBvZiBwb2ludGVycyBhdmFpbGFibGUgcHJvZmlsZSwgb3IgTlVMTC4gQXJyYXkgaXMgdGVybWluYXRlZCBieSBhbiBlbnRyeSBzZXQgdG8gTlVMTC4gKi8KKyAgICBwYV9wcm9wbGlzdCAqcHJvcGxpc3Q7ICAgICAgICAgICAgICAvKio8IFByb3BlcnR5IGxpc3QgKi8KK30gcGFfY2FyZF9wb3J0X2luZm87CisKKy8qKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgY2FyZHMuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBzdHJ1Y3R1cmUKKyAqIGNhbiBiZSBleHRlbmRlZCBhcyBwYXJ0IG9mIGV2b2x1dGlvbmFyeSBBUEkgdXBkYXRlcyBhdCBhbnkgdGltZSBpbgorICogYW55IG5ldyByZWxlYXNlLiAgXHNpbmNlIDAuOS4xNSAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfY2FyZF9pbmZvIHsKKyAgICB1aW50MzJfdCBpbmRleDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGlzIGNhcmQgKi8KKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAgLyoqPCBOYW1lIG9mIHRoaXMgY2FyZCAqLworICAgIHVpbnQzMl90IG93bmVyX21vZHVsZTsgICAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBvd25pbmcgbW9kdWxlLCBvciBQQV9JTlZBTElEX0lOREVYICovCisgICAgY29uc3QgY2hhciAqZHJpdmVyOyAgICAgICAgICAgICAgICAgIC8qKjwgRHJpdmVyIG5hbWUgKi8KKyAgICB1aW50MzJfdCBuX3Byb2ZpbGVzOyAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW50cmllcyBpbiBwcm9maWxlIGFycmF5ICovCisgICAgcGFfY2FyZF9wcm9maWxlX2luZm8qIHByb2ZpbGVzOyAgICAgIC8qKjwgQXJyYXkgb2YgYXZhaWxhYmxlIHByb2ZpbGUsIG9yIE5VTEwuIEFycmF5IGlzIHRlcm1pbmF0ZWQgYnkgYW4gZW50cnkgd2l0aCBuYW1lIHNldCB0byBOVUxMLiBOdW1iZXIgb2YgZW50cmllcyBpcyBzdG9yZWQgaW4gbl9wcm9maWxlcyAqLworICAgIHBhX2NhcmRfcHJvZmlsZV9pbmZvKiBhY3RpdmVfcHJvZmlsZTsgLyoqPCBQb2ludGVyIHRvIGFjdGl2ZSBwcm9maWxlIGluIHRoZSBhcnJheSwgb3IgTlVMTCAqLworICAgIHBhX3Byb3BsaXN0ICpwcm9wbGlzdDsgICAgICAgICAgICAgICAvKio8IFByb3BlcnR5IGxpc3QgKi8KKyAgICB1aW50MzJfdCBuX3BvcnRzOyAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW50cmllcyBpbiBwb3J0IGFycmF5ICovCisgICAgcGFfY2FyZF9wb3J0X2luZm8gKipwb3J0czsgICAgICAgICAgIC8qKjwgQXJyYXkgb2YgcG9pbnRlcnMgdG8gcG9ydHMsIG9yIE5VTEwuIEFycmF5IGlzIHRlcm1pbmF0ZWQgYnkgYW4gZW50cnkgc2V0IHRvIE5VTEwuICovCit9IHBhX2NhcmRfaW5mbzsKKworLyoqIENhbGxiYWNrIHByb3RvdHlwZSBmb3IgcGFfY29udGV4dF9nZXRfY2FyZF9pbmZvXy4uLigpIFxzaW5jZSAwLjkuMTUgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2NhcmRfaW5mb19jYl90KSAocGFfY29udGV4dCAqYywgY29uc3QgcGFfY2FyZF9pbmZvKmksIGludCBlb2wsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIGNhcmQgYnkgaXRzIGluZGV4IFxzaW5jZSAwLjkuMTUgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfY2FyZF9pbmZvX2J5X2luZGV4KHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgcGFfY2FyZF9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIGNhcmQgYnkgaXRzIG5hbWUgXHNpbmNlIDAuOS4xNSAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9jYXJkX2luZm9fYnlfbmFtZShwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpuYW1lLCBwYV9jYXJkX2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IHRoZSBjb21wbGV0ZSBjYXJkIGxpc3QgXHNpbmNlIDAuOS4xNSAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9jYXJkX2luZm9fbGlzdChwYV9jb250ZXh0ICpjLCBwYV9jYXJkX2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQ2hhbmdlIHRoZSBwcm9maWxlIG9mIGEgY2FyZC4gXHNpbmNlIDAuOS4xNSAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9jYXJkX3Byb2ZpbGVfYnlfaW5kZXgocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBjb25zdCBjaGFyKnByb2ZpbGUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBDaGFuZ2UgdGhlIHByb2ZpbGUgb2YgYSBjYXJkLiBcc2luY2UgMC45LjE1ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc2V0X2NhcmRfcHJvZmlsZV9ieV9uYW1lKHBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIqbmFtZSwgY29uc3QgY2hhcipwcm9maWxlLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQH0gKi8KKworLyoqIEB7IFxuYW1lIFNpbmsgSW5wdXRzICovCisKKy8qKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgc2luayBpbnB1dHMuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBzdHJ1Y3R1cmUKKyAqIGNhbiBiZSBleHRlbmRlZCBhcyBwYXJ0IG9mIGV2b2x1dGlvbmFyeSBBUEkgdXBkYXRlcyBhdCBhbnkgdGltZSBpbgorICogYW55IG5ldyByZWxlYXNlLiAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfc2lua19pbnB1dF9pbmZvIHsKKyAgICB1aW50MzJfdCBpbmRleDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGUgc2luayBpbnB1dCAqLworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAgICAvKio8IE5hbWUgb2YgdGhlIHNpbmsgaW5wdXQgKi8KKyAgICB1aW50MzJfdCBvd25lcl9tb2R1bGU7ICAgICAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGUgbW9kdWxlIHRoaXMgc2luayBpbnB1dCBiZWxvbmdzIHRvLCBvciBQQV9JTlZBTElEX0lOREVYIHdoZW4gaXQgZG9lcyBub3QgYmVsb25nIHRvIGFueSBtb2R1bGUgKi8KKyAgICB1aW50MzJfdCBjbGllbnQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGUgY2xpZW50IHRoaXMgc2luayBpbnB1dCBiZWxvbmdzIHRvLCBvciBQQV9JTlZBTElEX0lOREVYIHdoZW4gaXQgZG9lcyBub3QgYmVsb25nIHRvIGFueSBjbGllbnQgKi8KKyAgICB1aW50MzJfdCBzaW5rOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGUgY29ubmVjdGVkIHNpbmsgKi8KKyAgICBwYV9zYW1wbGVfc3BlYyBzYW1wbGVfc3BlYzsgICAgICAgICAgLyoqPCBUaGUgc2FtcGxlIHNwZWNpZmljYXRpb24gb2YgdGhlIHNpbmsgaW5wdXQgKi8KKyAgICBwYV9jaGFubmVsX21hcCBjaGFubmVsX21hcDsgICAgICAgICAgLyoqPCBDaGFubmVsIG1hcCAqLworICAgIHBhX2N2b2x1bWUgdm9sdW1lOyAgICAgICAgICAgICAgICAgICAvKio8IFRoZSB2b2x1bWUgb2YgdGhpcyBzaW5rIGlucHV0ICovCisgICAgcGFfdXNlY190IGJ1ZmZlcl91c2VjOyAgICAgICAgICAgICAgIC8qKjwgTGF0ZW5jeSBkdWUgdG8gYnVmZmVyaW5nIGluIHNpbmsgaW5wdXQsIHNlZSBwYV9sYXRlbmN5X2luZm8gZm9yIGRldGFpbHMgKi8KKyAgICBwYV91c2VjX3Qgc2lua191c2VjOyAgICAgICAgICAgICAgICAgLyoqPCBMYXRlbmN5IG9mIHRoZSBzaW5rIGRldmljZSwgc2VlIHBhX2xhdGVuY3lfaW5mbyBmb3IgZGV0YWlscyAqLworICAgIGNvbnN0IGNoYXIgKnJlc2FtcGxlX21ldGhvZDsgICAgICAgICAvKio8IFRoZSByZXNhbXBsaW5nIG1ldGhvZCB1c2VkIGJ5IHRoaXMgc2luayBpbnB1dC4gKi8KKyAgICBjb25zdCBjaGFyICpkcml2ZXI7ICAgICAgICAgICAgICAgICAgLyoqPCBEcml2ZXIgbmFtZSAqLworICAgIGludCBtdXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0cmVhbSBtdXRlZCBcc2luY2UgMC45LjcgKi8KKyAgICBwYV9wcm9wbGlzdCAqcHJvcGxpc3Q7ICAgICAgICAgICAgICAgLyoqPCBQcm9wZXJ0eSBsaXN0IFxzaW5jZSAwLjkuMTEgKi8KKyAgICBpbnQgY29ya2VkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTdHJlYW0gY29ya2VkIFxzaW5jZSAxLjAgKi8KKyAgICBpbnQgaGFzX3ZvbHVtZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTdHJlYW0gaGFzIHZvbHVtZS4gSWYgbm90IHNldCwgdGhlbiB0aGUgbWVhbmluZyBvZiB0aGlzIHN0cnVjdCdzIHZvbHVtZSBtZW1iZXIgaXMgdW5zcGVjaWZpZWQuIFxzaW5jZSAxLjAgKi8KKyAgICBpbnQgdm9sdW1lX3dyaXRhYmxlOyAgICAgICAgICAgICAgICAgLyoqPCBUaGUgdm9sdW1lIGNhbiBiZSBzZXQuIElmIG5vdCBzZXQsIHRoZSB2b2x1bWUgY2FuIHN0aWxsIGNoYW5nZSBldmVuIHRob3VnaCBjbGllbnRzIGNhbid0IGNvbnRyb2wgdGhlIHZvbHVtZS4gXHNpbmNlIDEuMCAqLworICAgIHBhX2Zvcm1hdF9pbmZvICpmb3JtYXQ7ICAgICAgICAgICAgICAvKio8IFN0cmVhbSBmb3JtYXQgaW5mb3JtYXRpb24uIFxzaW5jZSAxLjAgKi8KK30gcGFfc2lua19pbnB1dF9pbmZvOworCisvKiogQ2FsbGJhY2sgcHJvdG90eXBlIGZvciBwYV9jb250ZXh0X2dldF9zaW5rX2lucHV0X2luZm8oKSBhbmQgZnJpZW5kcyovCit0eXBlZGVmIHZvaWQgKCpwYV9zaW5rX2lucHV0X2luZm9fY2JfdCkgKHBhX2NvbnRleHQgKmMsIGNvbnN0IHBhX3NpbmtfaW5wdXRfaW5mbyAqaSwgaW50IGVvbCwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5rIGlucHV0IGJ5IGl0cyBpbmRleCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9zaW5rX2lucHV0X2luZm8ocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBwYV9zaW5rX2lucHV0X2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IHRoZSBjb21wbGV0ZSBzaW5rIGlucHV0IGxpc3QgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfc2lua19pbnB1dF9pbmZvX2xpc3QocGFfY29udGV4dCAqYywgcGFfc2lua19pbnB1dF9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIE1vdmUgdGhlIHNwZWNpZmllZCBzaW5rIGlucHV0IHRvIGEgZGlmZmVyZW50IHNpbmsuIFxzaW5jZSAwLjkuNSAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X21vdmVfc2lua19pbnB1dF9ieV9uYW1lKHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgY29uc3QgY2hhciAqc2lua19uYW1lLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCogdXNlcmRhdGEpOworCisvKiogTW92ZSB0aGUgc3BlY2lmaWVkIHNpbmsgaW5wdXQgdG8gYSBkaWZmZXJlbnQgc2luay4gXHNpbmNlIDAuOS41ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfbW92ZV9zaW5rX2lucHV0X2J5X2luZGV4KHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgdWludDMyX3Qgc2lua19pZHgsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkKiB1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIHZvbHVtZSBvZiBhIHNpbmsgaW5wdXQgc3RyZWFtICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc2V0X3NpbmtfaW5wdXRfdm9sdW1lKHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgY29uc3QgcGFfY3ZvbHVtZSAqdm9sdW1lLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBtdXRlIHN3aXRjaCBvZiBhIHNpbmsgaW5wdXQgc3RyZWFtIFxzaW5jZSAwLjkuNyAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9zaW5rX2lucHV0X211dGUocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBpbnQgbXV0ZSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEtpbGwgYSBzaW5rIGlucHV0LiAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2tpbGxfc2lua19pbnB1dChwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBAfSAqLworCisvKiogQHsgXG5hbWUgU291cmNlIE91dHB1dHMgKi8KKworLyoqIFN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBzb3VyY2Ugb3V0cHV0cy4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHN0cnVjdHVyZQorICogY2FuIGJlIGV4dGVuZGVkIGFzIHBhcnQgb2YgZXZvbHV0aW9uYXJ5IEFQSSB1cGRhdGVzIGF0IGFueSB0aW1lIGluCisgKiBhbnkgbmV3IHJlbGVhc2UuICovCit0eXBlZGVmIHN0cnVjdCBwYV9zb3VyY2Vfb3V0cHV0X2luZm8geworICAgIHVpbnQzMl90IGluZGV4OyAgICAgICAgICAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBzb3VyY2Ugb3V0cHV0ICovCisgICAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGUgc291cmNlIG91dHB1dCAqLworICAgIHVpbnQzMl90IG93bmVyX21vZHVsZTsgICAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBtb2R1bGUgdGhpcyBzb3VyY2Ugb3V0cHV0IGJlbG9uZ3MgdG8sIG9yIFBBX0lOVkFMSURfSU5ERVggd2hlbiBpdCBkb2VzIG5vdCBiZWxvbmcgdG8gYW55IG1vZHVsZSAqLworICAgIHVpbnQzMl90IGNsaWVudDsgICAgICAgICAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBjbGllbnQgdGhpcyBzb3VyY2Ugb3V0cHV0IGJlbG9uZ3MgdG8sIG9yIFBBX0lOVkFMSURfSU5ERVggd2hlbiBpdCBkb2VzIG5vdCBiZWxvbmcgdG8gYW55IGNsaWVudCAqLworICAgIHVpbnQzMl90IHNvdXJjZTsgICAgICAgICAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBjb25uZWN0ZWQgc291cmNlICovCisgICAgcGFfc2FtcGxlX3NwZWMgc2FtcGxlX3NwZWM7ICAgICAgICAgIC8qKjwgVGhlIHNhbXBsZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzb3VyY2Ugb3V0cHV0ICovCisgICAgcGFfY2hhbm5lbF9tYXAgY2hhbm5lbF9tYXA7ICAgICAgICAgIC8qKjwgQ2hhbm5lbCBtYXAgKi8KKyAgICBwYV91c2VjX3QgYnVmZmVyX3VzZWM7ICAgICAgICAgICAgICAgLyoqPCBMYXRlbmN5IGR1ZSB0byBidWZmZXJpbmcgaW4gdGhlIHNvdXJjZSBvdXRwdXQsIHNlZSBwYV9sYXRlbmN5X2luZm8gZm9yIGRldGFpbHMuICovCisgICAgcGFfdXNlY190IHNvdXJjZV91c2VjOyAgICAgICAgICAgICAgIC8qKjwgTGF0ZW5jeSBvZiB0aGUgc291cmNlIGRldmljZSwgc2VlIHBhX2xhdGVuY3lfaW5mbyBmb3IgZGV0YWlscy4gKi8KKyAgICBjb25zdCBjaGFyICpyZXNhbXBsZV9tZXRob2Q7ICAgICAgICAgLyoqPCBUaGUgcmVzYW1wbGluZyBtZXRob2QgdXNlZCBieSB0aGlzIHNvdXJjZSBvdXRwdXQuICovCisgICAgY29uc3QgY2hhciAqZHJpdmVyOyAgICAgICAgICAgICAgICAgIC8qKjwgRHJpdmVyIG5hbWUgKi8KKyAgICBwYV9wcm9wbGlzdCAqcHJvcGxpc3Q7ICAgICAgICAgICAgICAgLyoqPCBQcm9wZXJ0eSBsaXN0IFxzaW5jZSAwLjkuMTEgKi8KKyAgICBpbnQgY29ya2VkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTdHJlYW0gY29ya2VkIFxzaW5jZSAxLjAgKi8KKyAgICBwYV9jdm9sdW1lIHZvbHVtZTsgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgdm9sdW1lIG9mIHRoaXMgc291cmNlIG91dHB1dCBcc2luY2UgMS4wICovCisgICAgaW50IG11dGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU3RyZWFtIG11dGVkIFxzaW5jZSAxLjAgKi8KKyAgICBpbnQgaGFzX3ZvbHVtZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTdHJlYW0gaGFzIHZvbHVtZS4gSWYgbm90IHNldCwgdGhlbiB0aGUgbWVhbmluZyBvZiB0aGlzIHN0cnVjdCdzIHZvbHVtZSBtZW1iZXIgaXMgdW5zcGVjaWZpZWQuIFxzaW5jZSAxLjAgKi8KKyAgICBpbnQgdm9sdW1lX3dyaXRhYmxlOyAgICAgICAgICAgICAgICAgLyoqPCBUaGUgdm9sdW1lIGNhbiBiZSBzZXQuIElmIG5vdCBzZXQsIHRoZSB2b2x1bWUgY2FuIHN0aWxsIGNoYW5nZSBldmVuIHRob3VnaCBjbGllbnRzIGNhbid0IGNvbnRyb2wgdGhlIHZvbHVtZS4gXHNpbmNlIDEuMCAqLworICAgIHBhX2Zvcm1hdF9pbmZvICpmb3JtYXQ7ICAgICAgICAgICAgICAvKio8IFN0cmVhbSBmb3JtYXQgaW5mb3JtYXRpb24uIFxzaW5jZSAxLjAgKi8KK30gcGFfc291cmNlX291dHB1dF9pbmZvOworCisvKiogQ2FsbGJhY2sgcHJvdG90eXBlIGZvciBwYV9jb250ZXh0X2dldF9zb3VyY2Vfb3V0cHV0X2luZm8oKSBhbmQgZnJpZW5kcyovCit0eXBlZGVmIHZvaWQgKCpwYV9zb3VyY2Vfb3V0cHV0X2luZm9fY2JfdCkgKHBhX2NvbnRleHQgKmMsIGNvbnN0IHBhX3NvdXJjZV9vdXRwdXRfaW5mbyAqaSwgaW50IGVvbCwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgc291cmNlIG91dHB1dCBieSBpdHMgaW5kZXggKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfc291cmNlX291dHB1dF9pbmZvKHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgcGFfc291cmNlX291dHB1dF9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCB0aGUgY29tcGxldGUgbGlzdCBvZiBzb3VyY2Ugb3V0cHV0cyAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9zb3VyY2Vfb3V0cHV0X2luZm9fbGlzdChwYV9jb250ZXh0ICpjLCBwYV9zb3VyY2Vfb3V0cHV0X2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogTW92ZSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBvdXRwdXQgdG8gYSBkaWZmZXJlbnQgc291cmNlLiBcc2luY2UgMC45LjUgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9tb3ZlX3NvdXJjZV9vdXRwdXRfYnlfbmFtZShwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIGNvbnN0IGNoYXIgKnNvdXJjZV9uYW1lLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCogdXNlcmRhdGEpOworCisvKiogTW92ZSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBvdXRwdXQgdG8gYSBkaWZmZXJlbnQgc291cmNlLiBcc2luY2UgMC45LjUgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9tb3ZlX3NvdXJjZV9vdXRwdXRfYnlfaW5kZXgocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCB1aW50MzJfdCBzb3VyY2VfaWR4LCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCogdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSB2b2x1bWUgb2YgYSBzb3VyY2Ugb3V0cHV0IHN0cmVhbSBcc2luY2UgMS4wICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc2V0X3NvdXJjZV9vdXRwdXRfdm9sdW1lKHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgY29uc3QgcGFfY3ZvbHVtZSAqdm9sdW1lLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBtdXRlIHN3aXRjaCBvZiBhIHNvdXJjZSBvdXRwdXQgc3RyZWFtIFxzaW5jZSAxLjAgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zZXRfc291cmNlX291dHB1dF9tdXRlKHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgaW50IG11dGUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBLaWxsIGEgc291cmNlIG91dHB1dC4gKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9raWxsX3NvdXJjZV9vdXRwdXQocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQH0gKi8KKworLyoqIEB7IFxuYW1lIFN0YXRpc3RpY3MgKi8KKworLyoqIE1lbW9yeSBibG9jayBzdGF0aXN0aWNzLiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgc3RydWN0dXJlCisgKiBjYW4gYmUgZXh0ZW5kZWQgYXMgcGFydCBvZiBldm9sdXRpb25hcnkgQVBJIHVwZGF0ZXMgYXQgYW55IHRpbWUgaW4KKyAqIGFueSBuZXcgcmVsZWFzZS4gKi8KK3R5cGVkZWYgc3RydWN0IHBhX3N0YXRfaW5mbyB7CisgICAgdWludDMyX3QgbWVtYmxvY2tfdG90YWw7ICAgICAgICAgICAvKio8IEN1cnJlbnRseSBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrcyAqLworICAgIHVpbnQzMl90IG1lbWJsb2NrX3RvdGFsX3NpemU7ICAgICAgLyoqPCBDdXJyZW50IHRvdGFsIHNpemUgb2YgYWxsb2NhdGVkIG1lbW9yeSBibG9ja3MgKi8KKyAgICB1aW50MzJfdCBtZW1ibG9ja19hbGxvY2F0ZWQ7ICAgICAgIC8qKjwgQWxsb2NhdGVkIG1lbW9yeSBibG9ja3MgZHVyaW5nIHRoZSB3aG9sZSBsaWZldGltZSBvZiB0aGUgZGFlbW9uICovCisgICAgdWludDMyX3QgbWVtYmxvY2tfYWxsb2NhdGVkX3NpemU7ICAvKio8IFRvdGFsIHNpemUgb2YgYWxsIG1lbW9yeSBibG9ja3MgYWxsb2NhdGVkIGR1cmluZyB0aGUgd2hvbGUgbGlmZXRpbWUgb2YgdGhlIGRhZW1vbiAqLworICAgIHVpbnQzMl90IHNjYWNoZV9zaXplOyAgICAgICAgICAgICAgLyoqPCBUb3RhbCBzaXplIG9mIGFsbCBzYW1wbGUgY2FjaGUgZW50cmllcy4gKi8KK30gcGFfc3RhdF9pbmZvOworCisvKiogQ2FsbGJhY2sgcHJvdG90eXBlIGZvciBwYV9jb250ZXh0X3N0YXQoKSAqLwordHlwZWRlZiB2b2lkICgqcGFfc3RhdF9pbmZvX2NiX3QpIChwYV9jb250ZXh0ICpjLCBjb25zdCBwYV9zdGF0X2luZm8gKmksIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCBkYWVtb24gbWVtb3J5IGJsb2NrIHN0YXRpc3RpY3MgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zdGF0KHBhX2NvbnRleHQgKmMsIHBhX3N0YXRfaW5mb19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBAfSAqLworCisvKiogQHsgXG5hbWUgQ2FjaGVkIFNhbXBsZXMgKi8KKworLyoqIFN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBzYW1wbGUgY2FjaGUgZW50cmllcy4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHN0cnVjdHVyZQorICogY2FuIGJlIGV4dGVuZGVkIGFzIHBhcnQgb2YgZXZvbHV0aW9uYXJ5IEFQSSB1cGRhdGVzIGF0IGFueSB0aW1lIGluCisgKiBhbnkgbmV3IHJlbGVhc2UuICovCit0eXBlZGVmIHN0cnVjdCBwYV9zYW1wbGVfaW5mbyB7CisgICAgdWludDMyX3QgaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoaXMgZW50cnkgKi8KKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGlzIGVudHJ5ICovCisgICAgcGFfY3ZvbHVtZSB2b2x1bWU7ICAgICAgICAgICAgICAgICAgICAvKio8IERlZmF1bHQgdm9sdW1lIG9mIHRoaXMgZW50cnkgKi8KKyAgICBwYV9zYW1wbGVfc3BlYyBzYW1wbGVfc3BlYzsgICAgICAgICAgIC8qKjwgU2FtcGxlIHNwZWNpZmljYXRpb24gb2YgdGhlIHNhbXBsZSAqLworICAgIHBhX2NoYW5uZWxfbWFwIGNoYW5uZWxfbWFwOyAgICAgICAgICAgLyoqPCBUaGUgY2hhbm5lbCBtYXAgKi8KKyAgICBwYV91c2VjX3QgZHVyYXRpb247ICAgICAgICAgICAgICAgICAgIC8qKjwgRHVyYXRpb24gb2YgdGhpcyBlbnRyeSAqLworICAgIHVpbnQzMl90IGJ5dGVzOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggb2YgdGhpcyBzYW1wbGUgaW4gYnl0ZXMuICovCisgICAgaW50IGxhenk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE5vbi16ZXJvIHdoZW4gdGhpcyBpcyBhIGxhenkgY2FjaGUgZW50cnkuICovCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7ICAgICAgICAgICAgICAgICAvKio8IEluIGNhc2UgdGhpcyBpcyBhIGxhenkgY2FjaGUgZW50cnksIHRoZSBmaWxlbmFtZSBmb3IgdGhlIHNvdW5kIGZpbGUgdG8gYmUgbG9hZGVkIG9uIGRlbWFuZC4gKi8KKyAgICBwYV9wcm9wbGlzdCAqcHJvcGxpc3Q7ICAgICAgICAgICAgICAgIC8qKjwgUHJvcGVydHkgbGlzdCBmb3IgdGhpcyBzYW1wbGUuIFxzaW5jZSAwLjkuMTEgKi8KK30gcGFfc2FtcGxlX2luZm87CisKKy8qKiBDYWxsYmFjayBwcm90b3R5cGUgZm9yIHBhX2NvbnRleHRfZ2V0X3NhbXBsZV9pbmZvX2J5X25hbWUoKSBhbmQgZnJpZW5kcyAqLwordHlwZWRlZiB2b2lkICgqcGFfc2FtcGxlX2luZm9fY2JfdCkocGFfY29udGV4dCAqYywgY29uc3QgcGFfc2FtcGxlX2luZm8gKmksIGludCBlb2wsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHNhbXBsZSBieSBpdHMgbmFtZSAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9zYW1wbGVfaW5mb19ieV9uYW1lKHBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIgKm5hbWUsIHBhX3NhbXBsZV9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHNhbXBsZSBieSBpdHMgaW5kZXggKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfc2FtcGxlX2luZm9fYnlfaW5kZXgocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBwYV9zYW1wbGVfaW5mb19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBHZXQgdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygc2FtcGxlcyBzdG9yZWQgaW4gdGhlIGRhZW1vbi4gKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfc2FtcGxlX2luZm9fbGlzdChwYV9jb250ZXh0ICpjLCBwYV9zYW1wbGVfaW5mb19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBAfSAqLworCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKworLyoqIEB7IFxuYW1lIEF1dG9sb2FkIEVudHJpZXMgKi8KKworLyoqIFxkZXByZWNhdGVkIFR5cGUgb2YgYW4gYXV0b2xvYWQgZW50cnkuICovCit0eXBlZGVmIGVudW0gcGFfYXV0b2xvYWRfdHlwZSB7CisgICAgUEFfQVVUT0xPQURfU0lOSyA9IDAsCisgICAgUEFfQVVUT0xPQURfU09VUkNFID0gMQorfSBwYV9hdXRvbG9hZF90eXBlX3Q7CisKKy8qKiBcZGVwcmVjYXRlZCBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgYXV0b2xvYWQgZW50cmllcy4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHN0cnVjdHVyZQorICogY2FuIGJlIGV4dGVuZGVkIGFzIHBhcnQgb2YgZXZvbHV0aW9uYXJ5IEFQSSB1cGRhdGVzIGF0IGFueSB0aW1lIGluCisgKiBhbnkgbmV3IHJlbGVhc2UuICovCit0eXBlZGVmIHN0cnVjdCBwYV9hdXRvbG9hZF9pbmZvIHsKKyAgICB1aW50MzJfdCBpbmRleDsgICAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoaXMgYXV0b2xvYWQgZW50cnkgKi8KKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAvKio8IE5hbWUgb2YgdGhlIHNpbmsgb3Igc291cmNlICovCisgICAgcGFfYXV0b2xvYWRfdHlwZV90IHR5cGU7ICAgICAgLyoqPCBUeXBlIG9mIHRoZSBhdXRvbG9hZCBlbnRyeSAqLworICAgIGNvbnN0IGNoYXIgKm1vZHVsZTsgICAgICAgICAgIC8qKjwgTW9kdWxlIG5hbWUgdG8gbG9hZCAqLworICAgIGNvbnN0IGNoYXIgKmFyZ3VtZW50OyAgICAgICAgIC8qKjwgQXJndW1lbnQgc3RyaW5nIGZvciBtb2R1bGUgKi8KK30gcGFfYXV0b2xvYWRfaW5mbzsKKworLyoqIFxkZXByZWNhdGVkIENhbGxiYWNrIHByb3RvdHlwZSBmb3IgcGFfY29udGV4dF9nZXRfYXV0b2xvYWRfaW5mb19ieV9uYW1lKCkgYW5kIGZyaWVuZHMgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2F1dG9sb2FkX2luZm9fY2JfdCkocGFfY29udGV4dCAqYywgY29uc3QgcGFfYXV0b2xvYWRfaW5mbyAqaSwgaW50IGVvbCwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogXGRlcHJlY2F0ZWQgR2V0IGluZm8gYWJvdXQgYSBzcGVjaWZpYyBhdXRvbG9hZCBlbnRyeS4gKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfYXV0b2xvYWRfaW5mb19ieV9uYW1lKHBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIgKm5hbWUsIHBhX2F1dG9sb2FkX3R5cGVfdCB0eXBlLCBwYV9hdXRvbG9hZF9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKSBQQV9HQ0NfREVQUkVDQVRFRDsKKworLyoqIFxkZXByZWNhdGVkIEdldCBpbmZvIGFib3V0IGEgc3BlY2lmaWMgYXV0b2xvYWQgZW50cnkuICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X2F1dG9sb2FkX2luZm9fYnlfaW5kZXgocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBwYV9hdXRvbG9hZF9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKSBQQV9HQ0NfREVQUkVDQVRFRDsKKworLyoqIFxkZXByZWNhdGVkIEdldCB0aGUgY29tcGxldGUgbGlzdCBvZiBhdXRvbG9hZCBlbnRyaWVzLiAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9hdXRvbG9hZF9pbmZvX2xpc3QocGFfY29udGV4dCAqYywgcGFfYXV0b2xvYWRfaW5mb19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSkgUEFfR0NDX0RFUFJFQ0FURUQ7CisKKy8qKiBcZGVwcmVjYXRlZCBBZGQgYSBuZXcgYXV0b2xvYWQgZW50cnkuICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfYWRkX2F1dG9sb2FkKHBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIgKm5hbWUsIHBhX2F1dG9sb2FkX3R5cGVfdCB0eXBlLCBjb25zdCBjaGFyICptb2R1bGUsIGNvbnN0IGNoYXIqYXJndW1lbnQsIHBhX2NvbnRleHRfaW5kZXhfY2JfdCwgdm9pZCogdXNlcmRhdGEpIFBBX0dDQ19ERVBSRUNBVEVEOworCisvKiogXGRlcHJlY2F0ZWQgUmVtb3ZlIGFuIGF1dG9sb2FkIGVudHJ5LiAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3JlbW92ZV9hdXRvbG9hZF9ieV9uYW1lKHBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIgKm5hbWUsIHBhX2F1dG9sb2FkX3R5cGVfdCB0eXBlLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCogdXNlcmRhdGEpIFBBX0dDQ19ERVBSRUNBVEVEOworCisvKiogXGRlcHJlY2F0ZWQgUmVtb3ZlIGFuIGF1dG9sb2FkIGVudHJ5LiAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3JlbW92ZV9hdXRvbG9hZF9ieV9pbmRleChwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkKiB1c2VyZGF0YSkgUEFfR0NDX0RFUFJFQ0FURUQ7CisKKy8qKiBAfSAqLworCisvKiogXGVuZGNvbmQgKi8KKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvbWFpbmxvb3AtYXBpLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL21haW5sb29wLWFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOGFlMTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL21haW5sb29wLWFwaS5oCkBAIC0wLDAgKzEsMTIyIEBACisjaWZuZGVmIGZvb21haW5sb29wYXBpaGZvbworI2RlZmluZSBmb29tYWlubG9vcGFwaWhmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUKKyAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgIExpY2Vuc2UgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisjaW5jbHVkZSA8cHVsc2UvdmVyc2lvbi5oPgorCisvKiogXGZpbGUKKyAqCisgKiBNYWluIGxvb3AgYWJzdHJhY3Rpb24gbGF5ZXIuIEJvdGggdGhlIFB1bHNlQXVkaW8gY29yZSBhbmQgdGhlCisgKiBQdWxzZUF1ZGlvIGNsaWVudCBsaWJyYXJ5IHVzZSBhIG1haW4gbG9vcCBhYnN0cmFjdGlvbiBsYXllci4gRHVlIHRvCisgKiB0aGlzIGl0IGlzIHBvc3NpYmxlIHRvIGVtYmVkIFB1bHNlQXVkaW8gaW50byBvdGhlcgorICogYXBwbGljYXRpb25zIGVhc2lseS4gVHdvIG1haW4gbG9vcCBpbXBsZW1lbnRhdGlvbnMgYXJlCisgKiBjdXJyZW50bHkgYXZhaWxhYmxlOgorICogXGxpIEEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiB0aGUgQyBsaWJyYXJ5J3MgcG9sbCgpIGZ1bmN0aW9uIChTZWUgXHJlZiBtYWlubG9vcC5oKQorICogXGxpIEEgd3JhcHBlciBhcm91bmQgdGhlIEdMSUIgbWFpbiBsb29wLiBVc2UgdGhpcyB0byBlbWJlZCBQdWxzZUF1ZGlvIGludG8geW91ciBHTElCL0dUSysvR05PTUUgcHJvZ3JhbXMgKFNlZSBccmVmIGdsaWItbWFpbmxvb3AuaCkKKyAqCisgKiBUaGUgc3RydWN0dXJlIHBhX21haW5sb29wX2FwaSBpcyB1c2VkIGFzIHZ0YWJsZSBmb3IgdGhlIG1haW4gbG9vcCBhYnN0cmFjdGlvbi4KKyAqCisgKiBUaGlzIG1haW5sb29wIGFic3RyYWN0aW9uIGxheWVyIGhhcyBubyBkaXJlY3Qgc3VwcG9ydCBmb3IgVU5JWCBzaWduYWxzLiBHZW5lcmljLCBtYWlubG9vcCBpbXBsZW1lbnRhdGlvbiBhZ25vc3RpYyBzdXBwb3J0IGlzIGF2YWlsYWJsZSB0aHJvdWdoIFxyZWYgbWFpbmxvb3Atc2lnbmFsLmguCisgKiAqLworCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIEFuIGFic3RyYWN0IG1haW5sb29wIEFQSSB2dGFibGUgKi8KK3R5cGVkZWYgc3RydWN0IHBhX21haW5sb29wX2FwaSBwYV9tYWlubG9vcF9hcGk7CisKKy8qKiBBIGJpdG1hc2sgZm9yIElPIGV2ZW50cyAqLwordHlwZWRlZiBlbnVtIHBhX2lvX2V2ZW50X2ZsYWdzIHsKKyAgICBQQV9JT19FVkVOVF9OVUxMID0gMCwgICAgIC8qKjwgTm8gZXZlbnQgKi8KKyAgICBQQV9JT19FVkVOVF9JTlBVVCA9IDEsICAgIC8qKjwgSW5wdXQgZXZlbnQgKi8KKyAgICBQQV9JT19FVkVOVF9PVVRQVVQgPSAyLCAgIC8qKjwgT3V0cHV0IGV2ZW50ICovCisgICAgUEFfSU9fRVZFTlRfSEFOR1VQID0gNCwgICAvKio8IEhhbmd1cCBldmVudCAqLworICAgIFBBX0lPX0VWRU5UX0VSUk9SID0gOCAgICAgLyoqPCBFcnJvciBldmVudCAqLworfSBwYV9pb19ldmVudF9mbGFnc190OworCisvKiogQW4gb3BhcXVlIElPIGV2ZW50IHNvdXJjZSBvYmplY3QgKi8KK3R5cGVkZWYgc3RydWN0IHBhX2lvX2V2ZW50IHBhX2lvX2V2ZW50OworLyoqIEFuIElPIGV2ZW50IGNhbGxiYWNrIHByb3RvdHlwZSBcc2luY2UgMC45LjMgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2lvX2V2ZW50X2NiX3QpKHBhX21haW5sb29wX2FwaSplYSwgcGFfaW9fZXZlbnQqIGUsIGludCBmZCwgcGFfaW9fZXZlbnRfZmxhZ3NfdCBldmVudHMsIHZvaWQgKnVzZXJkYXRhKTsKKy8qKiBBIElPIGV2ZW50IGRlc3Ryb3kgY2FsbGJhY2sgcHJvdG90eXBlIFwgc2luY2UgMC45LjMgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2lvX2V2ZW50X2Rlc3Ryb3lfY2JfdCkocGFfbWFpbmxvb3BfYXBpKmEsIHBhX2lvX2V2ZW50ICplLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBBbiBvcGFxdWUgdGltZXIgZXZlbnQgc291cmNlIG9iamVjdCAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfdGltZV9ldmVudCBwYV90aW1lX2V2ZW50OworLyoqIEEgdGltZSBldmVudCBjYWxsYmFjayBwcm90b3R5cGUgXHNpbmNlIDAuOS4zICovCit0eXBlZGVmIHZvaWQgKCpwYV90aW1lX2V2ZW50X2NiX3QpKHBhX21haW5sb29wX2FwaSphLCBwYV90aW1lX2V2ZW50KiBlLCBjb25zdCBzdHJ1Y3QgdGltZXZhbCAqdHYsIHZvaWQgKnVzZXJkYXRhKTsKKy8qKiBBIHRpbWUgZXZlbnQgZGVzdHJveSBjYWxsYmFjayBwcm90b3R5cGUgXCBzaW5jZSAwLjkuMyAqLwordHlwZWRlZiB2b2lkICgqcGFfdGltZV9ldmVudF9kZXN0cm95X2NiX3QpKHBhX21haW5sb29wX2FwaSphLCBwYV90aW1lX2V2ZW50ICplLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBBbiBvcGFxdWUgZGVmZXJyZWQgZXZlbnQgc291cmNlIG9iamVjdC4gRXZlbnRzIG9mIHRoaXMgdHlwZSBhcmUgdHJpZ2dlcmVkIG9uY2UgaW4gZXZlcnkgbWFpbiBsb29wIGl0ZXJhdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfZGVmZXJfZXZlbnQgcGFfZGVmZXJfZXZlbnQ7CisvKiogQSBkZWZlciBldmVudCBjYWxsYmFjayBwcm90b3R5cGUgXHNpbmNlIDAuOS4zICovCit0eXBlZGVmIHZvaWQgKCpwYV9kZWZlcl9ldmVudF9jYl90KShwYV9tYWlubG9vcF9hcGkqYSwgcGFfZGVmZXJfZXZlbnQqIGUsIHZvaWQgKnVzZXJkYXRhKTsKKy8qKiBBIGRlZmVyIGV2ZW50IGRlc3Ryb3kgY2FsbGJhY2sgcHJvdG90eXBlIFwgc2luY2UgMC45LjMgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2RlZmVyX2V2ZW50X2Rlc3Ryb3lfY2JfdCkocGFfbWFpbmxvb3BfYXBpKmEsIHBhX2RlZmVyX2V2ZW50ICplLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBBbiBhYnN0cmFjdCBtYWlubG9vcCBBUEkgdnRhYmxlICovCitzdHJ1Y3QgcGFfbWFpbmxvb3BfYXBpIHsKKyAgICAvKiogQSBwb2ludGVyIHRvIHNvbWUgcHJpdmF0ZSwgYXJiaXRyYXJ5IGRhdGEgb2YgdGhlIG1haW4gbG9vcCBpbXBsZW1lbnRhdGlvbiAqLworICAgIHZvaWQgKnVzZXJkYXRhOworCisgICAgLyoqIENyZWF0ZSBhIG5ldyBJTyBldmVudCBzb3VyY2Ugb2JqZWN0ICovCisgICAgcGFfaW9fZXZlbnQqICgqaW9fbmV3KShwYV9tYWlubG9vcF9hcGkqYSwgaW50IGZkLCBwYV9pb19ldmVudF9mbGFnc190IGV2ZW50cywgcGFfaW9fZXZlbnRfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworICAgIC8qKiBFbmFibGUgb3IgZGlzYWJsZSBJTyBldmVudHMgb24gdGhpcyBvYmplY3QgKi8KKyAgICB2b2lkICgqaW9fZW5hYmxlKShwYV9pb19ldmVudCogZSwgcGFfaW9fZXZlbnRfZmxhZ3NfdCBldmVudHMpOworICAgIC8qKiBGcmVlIGEgSU8gZXZlbnQgc291cmNlIG9iamVjdCAqLworICAgIHZvaWQgKCppb19mcmVlKShwYV9pb19ldmVudCogZSk7CisgICAgLyoqIFNldCBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIElPIGV2ZW50IHNvdXJjZSBpcyBkZXN0cm95ZWQuIFVzZSB0aGlzIHRvIGZyZWUgdGhlIHVzZXJkYXRhIGFyZ3VtZW50IGlmIHJlcXVpcmVkICovCisgICAgdm9pZCAoKmlvX3NldF9kZXN0cm95KShwYV9pb19ldmVudCAqZSwgcGFfaW9fZXZlbnRfZGVzdHJveV9jYl90IGNiKTsKKworICAgIC8qKiBDcmVhdGUgYSBuZXcgdGltZXIgZXZlbnQgc291cmNlIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBVbml4IHRpbWUgKi8KKyAgICBwYV90aW1lX2V2ZW50KiAoKnRpbWVfbmV3KShwYV9tYWlubG9vcF9hcGkqYSwgY29uc3Qgc3RydWN0IHRpbWV2YWwgKnR2LCBwYV90aW1lX2V2ZW50X2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKyAgICAvKiogUmVzdGFydCBhIHJ1bm5pbmcgb3IgZXhwaXJlZCB0aW1lciBldmVudCBzb3VyY2Ugd2l0aCBhIG5ldyBVbml4IHRpbWUgKi8KKyAgICB2b2lkICgqdGltZV9yZXN0YXJ0KShwYV90aW1lX2V2ZW50KiBlLCBjb25zdCBzdHJ1Y3QgdGltZXZhbCAqdHYpOworICAgIC8qKiBGcmVlIGEgZGVmZXJyZWQgdGltZXIgZXZlbnQgc291cmNlIG9iamVjdCAqLworICAgIHZvaWQgKCp0aW1lX2ZyZWUpKHBhX3RpbWVfZXZlbnQqIGUpOworICAgIC8qKiBTZXQgYSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSB0aW1lciBldmVudCBzb3VyY2UgaXMgZGVzdHJveWVkLiBVc2UgdGhpcyB0byBmcmVlIHRoZSB1c2VyZGF0YSBhcmd1bWVudCBpZiByZXF1aXJlZCAqLworICAgIHZvaWQgKCp0aW1lX3NldF9kZXN0cm95KShwYV90aW1lX2V2ZW50ICplLCBwYV90aW1lX2V2ZW50X2Rlc3Ryb3lfY2JfdCBjYik7CisKKyAgICAvKiogQ3JlYXRlIGEgbmV3IGRlZmVycmVkIGV2ZW50IHNvdXJjZSBvYmplY3QgKi8KKyAgICBwYV9kZWZlcl9ldmVudCogKCpkZWZlcl9uZXcpKHBhX21haW5sb29wX2FwaSphLCBwYV9kZWZlcl9ldmVudF9jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisgICAgLyoqIEVuYWJsZSBvciBkaXNhYmxlIGEgZGVmZXJyZWQgZXZlbnQgc291cmNlIHRlbXBvcmFyaWx5ICovCisgICAgdm9pZCAoKmRlZmVyX2VuYWJsZSkocGFfZGVmZXJfZXZlbnQqIGUsIGludCBiKTsKKyAgICAvKiogRnJlZSBhIGRlZmVycmVkIGV2ZW50IHNvdXJjZSBvYmplY3QgKi8KKyAgICB2b2lkICgqZGVmZXJfZnJlZSkocGFfZGVmZXJfZXZlbnQqIGUpOworICAgIC8qKiBTZXQgYSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSBkZWZlcnJlZCBldmVudCBzb3VyY2UgaXMgZGVzdHJveWVkLiBVc2UgdGhpcyB0byBmcmVlIHRoZSB1c2VyZGF0YSBhcmd1bWVudCBpZiByZXF1aXJlZCAqLworICAgIHZvaWQgKCpkZWZlcl9zZXRfZGVzdHJveSkocGFfZGVmZXJfZXZlbnQgKmUsIHBhX2RlZmVyX2V2ZW50X2Rlc3Ryb3lfY2JfdCBjYik7CisKKyAgICAvKiogRXhpdCB0aGUgbWFpbiBsb29wIGFuZCByZXR1cm4gdGhlIHNwZWNpZmllZCByZXR2YWwqLworICAgIHZvaWQgKCpxdWl0KShwYV9tYWlubG9vcF9hcGkqYSwgaW50IHJldHZhbCk7Cit9OworCisvKiogUnVuIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2sgZnVuY3Rpb24gb25jZSBmcm9tIHRoZSBtYWluIGxvb3AgdXNpbmcgYW4gYW5vbnltb3VzIGRlZmVyIGV2ZW50LiAqLwordm9pZCBwYV9tYWlubG9vcF9hcGlfb25jZShwYV9tYWlubG9vcF9hcGkqbSwgdm9pZCAoKmNhbGxiYWNrKShwYV9tYWlubG9vcF9hcGkqbSwgdm9pZCAqdXNlcmRhdGEpLCB2b2lkICp1c2VyZGF0YSk7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL21haW5sb29wLXNpZ25hbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9tYWlubG9vcC1zaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGIxZjlkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9tYWlubG9vcC1zaWduYWwuaApAQCAtMCwwICsxLDY2IEBACisjaWZuZGVmIGZvb21haW5sb29wc2lnbmFsaGZvbworI2RlZmluZSBmb29tYWlubG9vcHNpZ25hbGhmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDggTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxwdWxzZS9tYWlubG9vcC1hcGkuaD4KKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIFxmaWxlCisgKiBVTklYIHNpZ25hbCBzdXBwb3J0IGZvciBtYWluIGxvb3BzLiBJbiBjb250cmFzdCB0byBvdGhlcgorICogbWFpbiBsb29wIGV2ZW50IHNvdXJjZXMgc3VjaCBhcyB0aW1lciBhbmQgSU8gZXZlbnRzLCBVTklYIHNpZ25hbAorICogc3VwcG9ydCByZXF1aXJlcyBtb2RpZmljYXRpb24gb2YgdGhlIGdsb2JhbCBwcm9jZXNzCisgKiBlbnZpcm9ubWVudC4gRHVlIHRvIHRoaXMgdGhlIGdlbmVyaWMgbWFpbiBsb29wIGFic3RyYWN0aW9uIGxheWVyIGFzCisgKiBkZWZpbmVkIGluIFxyZWYgbWFpbmxvb3AtYXBpLmggZG9lc24ndCBoYXZlIGRpcmVjdCBzdXBwb3J0IGZvciBVTklYCisgKiBzaWduYWxzLiBIb3dldmVyLCB5b3UgbWF5IGhvb2sgc2lnbmFsIHN1cHBvcnQgaW50byBhbiBhYnN0cmFjdCBtYWluIGxvb3AgdmlhIHRoZSByb3V0aW5lcyBkZWZpbmVkIGhlcmVpbi4KKyAqLworCisvKiogQW4gb3BhcXVlIFVOSVggc2lnbmFsIGV2ZW50IHNvdXJjZSBvYmplY3QgKi8KK3R5cGVkZWYgc3RydWN0IHBhX3NpZ25hbF9ldmVudCBwYV9zaWduYWxfZXZlbnQ7CisKKy8qKiBDYWxsYmFjayBwcm90b3R5cGUgZm9yIHNpZ25hbCBldmVudHMgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX3NpZ25hbF9jYl90KSAocGFfbWFpbmxvb3BfYXBpICphcGksIHBhX3NpZ25hbF9ldmVudCplLCBpbnQgc2lnLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBEZXN0cm95IGNhbGxiYWNrIHByb3RvdHlwZSBmb3Igc2lnbmFsIGV2ZW50cyAqLwordHlwZWRlZiB2b2lkICgqcGFfc2lnbmFsX2Rlc3Ryb3lfY2JfdCkgKHBhX21haW5sb29wX2FwaSAqYXBpLCBwYV9zaWduYWxfZXZlbnQqZSwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogSW5pdGlhbGl6ZSB0aGUgVU5JWCBzaWduYWwgc3Vic3lzdGVtIGFuZCBiaW5kIGl0IHRvIHRoZSBzcGVjaWZpZWQgbWFpbiBsb29wICovCitpbnQgcGFfc2lnbmFsX2luaXQocGFfbWFpbmxvb3BfYXBpICphcGkpOworCisvKiogQ2xlYW51cCB0aGUgc2lnbmFsIHN1YnN5c3RlbSAqLwordm9pZCBwYV9zaWduYWxfZG9uZSh2b2lkKTsKKworLyoqIENyZWF0ZSBhIG5ldyBVTklYIHNpZ25hbCBldmVudCBzb3VyY2Ugb2JqZWN0ICovCitwYV9zaWduYWxfZXZlbnQqIHBhX3NpZ25hbF9uZXcoaW50IHNpZywgcGFfc2lnbmFsX2NiX3QgY2FsbGJhY2ssIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEZyZWUgYSBVTklYIHNpZ25hbCBldmVudCBzb3VyY2Ugb2JqZWN0ICovCit2b2lkIHBhX3NpZ25hbF9mcmVlKHBhX3NpZ25hbF9ldmVudCAqZSk7CisKKy8qKiBTZXQgYSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSBzaWduYWwgZXZlbnQgc291cmNlIGlzIGRlc3Ryb3llZC4gVXNlIHRoaXMgdG8gZnJlZSB0aGUgdXNlcmRhdGEgYXJndW1lbnQgaWYgcmVxdWlyZWQgKi8KK3ZvaWQgcGFfc2lnbmFsX3NldF9kZXN0cm95KHBhX3NpZ25hbF9ldmVudCAqZSwgcGFfc2lnbmFsX2Rlc3Ryb3lfY2JfdCBjYWxsYmFjayk7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL21haW5sb29wLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL21haW5sb29wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliMTdmYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvbWFpbmxvb3AuaApAQCAtMCwwICsxLDEzMyBAQAorI2lmbmRlZiBmb29tYWlubG9vcGhmb28KKyNkZWZpbmUgZm9vbWFpbmxvb3BoZm9vCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwNiBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8cHVsc2UvbWFpbmxvb3AtYXBpLmg+CisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKworUEFfQ19ERUNMX0JFR0lOCisKK3N0cnVjdCBwb2xsZmQ7CisKKy8qKiBccGFnZSBtYWlubG9vcCBNYWluIExvb3AKKyAqCisgKiBcc2VjdGlvbiBvdmVydl9zZWMgT3ZlcnZpZXcKKyAqCisgKiBUaGUgYnVpbHQtaW4gbWFpbiBsb29wIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBwb2xsKCkgc3lzdGVtIGNhbGwuCisgKiBJdCBzdXBwb3J0cyB0aGUgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1haW4gbG9vcCBhYnN0cmFjdGlvbiBhbmQgdmVyeQorICogbGl0dGxlIGVsc2UuCisgKgorICogVGhlIG1haW4gbG9vcCBpcyBjcmVhdGVkIHVzaW5nIHBhX21haW5sb29wX25ldygpIGFuZCBkZXN0cm95ZWQgdXNpbmcKKyAqIHBhX21haW5sb29wX2ZyZWUoKS4gVG8gZ2V0IGFjY2VzcyB0byB0aGUgbWFpbiBsb29wIGFic3RyYWN0aW9uLAorICogcGFfbWFpbmxvb3BfZ2V0X2FwaSgpIGlzIHVzZWQuCisgKgorICogXHNlY3Rpb24gaXRlcl9zZWMgSXRlcmF0aW9uCisgKgorICogVGhlIG1haW4gbG9vcCBpcyBkZXNpZ25lZCBhcm91bmQgdGhlIGNvbmNlcHQgb2YgaXRlcmF0aW9ucy4gRWFjaCBpdGVyYXRpb24KKyAqIGNvbnNpc3RzIG9mIHRocmVlIHN0ZXBzIHRoYXQgcmVwZWF0IGR1cmluZyB0aGUgYXBwbGljYXRpb24ncyBlbnRpcmUKKyAqIGxpZmV0aW1lOgorICoKKyAqIC0jIFByZXBhcmUgLSBCdWlsZCBhIGxpc3Qgb2YgZmlsZSBkZXNjcmlwdG9ycworICogICAgICAgICAgICAgICB0aGF0IG5lZWQgdG8gYmUgbW9uaXRvcmVkIGFuZCBjYWxjdWxhdGUgdGhlIG5leHQgdGltZW91dC4KKyAqIC0jIFBvbGwgLSBFeGVjdXRlIHRoZSBhY3R1YWwgcG9sbCgpIHN5c3RlbSBjYWxsLgorICogLSMgRGlzcGF0Y2ggLSBEaXNwYXRjaCBhbnkgZXZlbnRzIHRoYXQgaGF2ZSBmaXJlZC4KKyAqCisgKiBXaGVuIHVzaW5nIHRoZSBtYWluIGxvb3AsIHRoZSBhcHBsaWNhdGlvbiBjYW4gZWl0aGVyIGV4ZWN1dGUgZWFjaAorICogaXRlcmF0aW9uLCBvbmUgYXQgYSB0aW1lLCB1c2luZyBwYV9tYWlubG9vcF9pdGVyYXRlKCksIG9yIGxldCB0aGUgbGlicmFyeQorICogaXRlcmF0ZSBhdXRvbWF0aWNhbGx5IHVzaW5nIHBhX21haW5sb29wX3J1bigpLgorICoKKyAqIFxzZWN0aW9uIHRocmVhZF9zZWMgVGhyZWFkcworICoKKyAqIFRoZSBtYWluIGxvb3AgZnVuY3Rpb25zIGFyZSBkZXNpZ25lZCB0byBiZSB0aHJlYWQgc2FmZSwgYnV0IHRoZSBvYmplY3RzCisgKiBhcmUgbm90LiBXaGF0IHRoaXMgbWVhbnMgaXMgdGhhdCBtdWx0aXBsZSBtYWluIGxvb3BzIGNhbiBiZSB1c2VkLCBidXQgb25seQorICogb25lIG9iamVjdCBwZXIgdGhyZWFkLgorICoKKyAqLworCisvKiogXGZpbGUKKyAqCisgKiBBIG1pbmltYWwgbWFpbiBsb29wIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIHRoZSBDIGxpYnJhcnkncyBwb2xsKCkKKyAqIGZ1bmN0aW9uLiBVc2luZyB0aGUgcm91dGluZXMgZGVmaW5lZCBoZXJlaW4geW91IG1heSBjcmVhdGUgYSBzaW1wbGUKKyAqIG1haW4gbG9vcCBzdXBwb3J0aW5nIHRoZSBnZW5lcmljIG1haW4gbG9vcCBhYnN0cmFjdGlvbiBsYXllciBhcworICogZGVmaW5lZCBpbiBccmVmIG1haW5sb29wLWFwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHRocmVhZCBzYWZlCisgKiBhcyBsb25nIGFzIHlvdSBhY2Nlc3MgdGhlIG1haW4gbG9vcCBvYmplY3QgZnJvbSBhIHNpbmdsZSB0aHJlYWQgb25seS4KKyAqCisgKiBTZWUgYWxzbyBcc3VicGFnZSBtYWlubG9vcAorICovCisKKy8qKiBBbiBvcGFxdWUgbWFpbiBsb29wIG9iamVjdCAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfbWFpbmxvb3AgcGFfbWFpbmxvb3A7CisKKy8qKiBBbGxvY2F0ZSBhIG5ldyBtYWluIGxvb3Agb2JqZWN0ICovCitwYV9tYWlubG9vcCAqcGFfbWFpbmxvb3BfbmV3KHZvaWQpOworCisvKiogRnJlZSBhIG1haW4gbG9vcCBvYmplY3QgKi8KK3ZvaWQgcGFfbWFpbmxvb3BfZnJlZShwYV9tYWlubG9vcCogbSk7CisKKy8qKiBQcmVwYXJlIGZvciBhIHNpbmdsZSBpdGVyYXRpb24gb2YgdGhlIG1haW4gbG9vcC4gUmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlCitvbiBlcnJvciBvciBleGl0IHJlcXVlc3QuIHRpbWVvdXQgc3BlY2lmaWVzIGEgbWF4aW11bSB0aW1lb3V0IGZvciB0aGUgc3Vic2VxdWVudAorcG9sbCwgb3IgLTEgZm9yIGJsb2NraW5nIGJlaGF2aW91ci4gLiovCitpbnQgcGFfbWFpbmxvb3BfcHJlcGFyZShwYV9tYWlubG9vcCAqbSwgaW50IHRpbWVvdXQpOworCisvKiogRXhlY3V0ZSB0aGUgcHJldmlvdXNseSBwcmVwYXJlZCBwb2xsLiBSZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuKi8KK2ludCBwYV9tYWlubG9vcF9wb2xsKHBhX21haW5sb29wICptKTsKKworLyoqIERpc3BhdGNoIHRpbWVvdXQsIGlvIGFuZCBkZWZlcnJlZCBldmVudHMgZnJvbSB0aGUgcHJldmlvdXNseSBleGVjdXRlZCBwb2xsLiBSZXR1cm5zCithIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLiBPbiBzdWNjZXNzIHJldHVybnMgdGhlIG51bWJlciBvZiBzb3VyY2UgZGlzcGF0Y2hlZC4gKi8KK2ludCBwYV9tYWlubG9vcF9kaXNwYXRjaChwYV9tYWlubG9vcCAqbSk7CisKKy8qKiBSZXR1cm4gdGhlIHJldHVybiB2YWx1ZSBhcyBzcGVjaWZpZWQgd2l0aCB0aGUgbWFpbiBsb29wJ3MgcXVpdCgpIHJvdXRpbmUuICovCitpbnQgcGFfbWFpbmxvb3BfZ2V0X3JldHZhbChwYV9tYWlubG9vcCAqbSk7CisKKy8qKiBSdW4gYSBzaW5nbGUgaXRlcmF0aW9uIG9mIHRoZSBtYWluIGxvb3AuIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbgorZm9yIHBhX21haW5sb29wX3ByZXBhcmUoKSwgcGFfbWFpbmxvb3BfcG9sbCgpIGFuZCBwYV9tYWlubG9vcF9kaXNwYXRjaCgpLgorUmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yIG9yIGV4aXQgcmVxdWVzdC4gSWYgYmxvY2sgaXMgbm9uemVybywKK2Jsb2NrIGZvciBldmVudHMgaWYgbm9uZSBhcmUgcXVldWVkLiBPcHRpb25hbGx5IHJldHVybiB0aGUgcmV0dXJuIHZhbHVlIGFzCitzcGVjaWZpZWQgd2l0aCB0aGUgbWFpbiBsb29wJ3MgcXVpdCgpIHJvdXRpbmUgaW4gdGhlIGludGVnZXIgdmFyaWFibGUgcmV0dmFsIHBvaW50cwordG8uIE9uIHN1Y2Nlc3MgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNvdXJjZXMgZGlzcGF0Y2hlZCBpbiB0aGlzIGl0ZXJhdGlvbi4gKi8KK2ludCBwYV9tYWlubG9vcF9pdGVyYXRlKHBhX21haW5sb29wICptLCBpbnQgYmxvY2ssIGludCAqcmV0dmFsKTsKKworLyoqIFJ1biB1bmxpbWl0ZWQgaXRlcmF0aW9ucyBvZiB0aGUgbWFpbiBsb29wIG9iamVjdCB1bnRpbCB0aGUgbWFpbiBsb29wJ3MgcXVpdCgpIHJvdXRpbmUgaXMgY2FsbGVkLiAqLworaW50IHBhX21haW5sb29wX3J1bihwYV9tYWlubG9vcCAqbSwgaW50ICpyZXR2YWwpOworCisvKiogUmV0dXJuIHRoZSBhYnN0cmFjdCBtYWluIGxvb3AgYWJzdHJhY3Rpb24gbGF5ZXIgdnRhYmxlIGZvciB0aGlzCisgICAgbWFpbiBsb29wLiBObyBuZWVkIHRvIGZyZWUgdGhlIEFQSSBhcyBpdCBpcyBvd25lZCBieSB0aGUgbG9vcAorICAgIGFuZCBpcyBkZXN0cm95ZWQgd2hlbiB0aGUgbG9vcCBpcyBmcmVlZC4gKi8KK3BhX21haW5sb29wX2FwaSogcGFfbWFpbmxvb3BfZ2V0X2FwaShwYV9tYWlubG9vcCptKTsKKworLyoqIFNodXRkb3duIHRoZSBtYWluIGxvb3AgKi8KK3ZvaWQgcGFfbWFpbmxvb3BfcXVpdChwYV9tYWlubG9vcCAqbSwgaW50IHIpOworCisvKiogSW50ZXJydXB0IGEgcnVubmluZyBwb2xsIChmb3IgdGhyZWFkZWQgc3lzdGVtcykgKi8KK3ZvaWQgcGFfbWFpbmxvb3Bfd2FrZXVwKHBhX21haW5sb29wICptKTsKKworLyoqIEdlbmVyaWMgcHJvdG90eXBlIG9mIGEgcG9sbCgpIGxpa2UgZnVuY3Rpb24gKi8KK3R5cGVkZWYgaW50ICgqcGFfcG9sbF9mdW5jKShzdHJ1Y3QgcG9sbGZkICp1ZmRzLCB1bnNpZ25lZCBsb25nIG5mZHMsIGludCB0aW1lb3V0LCB2b2lkKnVzZXJkYXRhKTsKKworLyoqIENoYW5nZSB0aGUgcG9sbCgpIGltcGxlbWVudGF0aW9uICovCit2b2lkIHBhX21haW5sb29wX3NldF9wb2xsX2Z1bmMocGFfbWFpbmxvb3AgKm0sIHBhX3BvbGxfZnVuYyBwb2xsX2Z1bmMsIHZvaWQgKnVzZXJkYXRhKTsKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvb3BlcmF0aW9uLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL29wZXJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YjU2OTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL29wZXJhdGlvbi5oCkBAIC0wLDAgKzEsNTUgQEAKKyNpZm5kZWYgZm9vb3BlcmF0aW9uaGZvbworI2RlZmluZSBmb29vcGVyYXRpb25oZm9vCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLAorICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisjaW5jbHVkZSA8cHVsc2UvZGVmLmg+CisjaW5jbHVkZSA8cHVsc2UvdmVyc2lvbi5oPgorCisvKiogXGZpbGUKKyAqIEFzeW5jaHJvbm91cyBvcGVyYXRpb25zICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogQW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBvYmplY3QgKi8KK3R5cGVkZWYgc3RydWN0IHBhX29wZXJhdGlvbiBwYV9vcGVyYXRpb247CisKKy8qKiBJbmNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IGJ5IG9uZSAqLworcGFfb3BlcmF0aW9uICpwYV9vcGVyYXRpb25fcmVmKHBhX29wZXJhdGlvbiAqbyk7CisKKy8qKiBEZWNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IGJ5IG9uZSAqLwordm9pZCBwYV9vcGVyYXRpb25fdW5yZWYocGFfb3BlcmF0aW9uICpvKTsKKworLyoqIENhbmNlbCB0aGUgb3BlcmF0aW9uLiBCZXdhcmUhIFRoaXMgd2lsbCBub3QgbmVjZXNzYXJpbHkgY2FuY2VsIHRoZQorICogZXhlY3V0aW9uIG9mIHRoZSBvcGVyYXRpb24gb24gdGhlIHNlcnZlciBzaWRlLiBIb3dldmVyIGl0IHdpbGwgbWFrZQorICogc3VyZSB0aGF0IHRoZSBjYWxsYmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyBvcGVyYXRpb24gd2lsbCBub3QgYmUKKyAqIGNhbGxlZCBhbnltb3JlLCBlZmZlY3RpdmVseSBkaXNhYmxpbmcgdGhlIG9wZXJhdGlvbiBmcm9tIHRoZSBjbGllbnQKKyAqIHNpZGUncyB2aWV3LiAqLwordm9pZCBwYV9vcGVyYXRpb25fY2FuY2VsKHBhX29wZXJhdGlvbiAqbyk7CisKKy8qKiBSZXR1cm4gdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24gKi8KK3BhX29wZXJhdGlvbl9zdGF0ZV90IHBhX29wZXJhdGlvbl9nZXRfc3RhdGUocGFfb3BlcmF0aW9uICpvKTsKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvcHJvcGxpc3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvcHJvcGxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGIxODA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9wcm9wbGlzdC5oCkBAIC0wLDAgKzEsNDA1IEBACisjaWZuZGVmIGZvb3B1bHNlcHJvcGxpc3RoZm9vCisjZGVmaW5lIGZvb3B1bHNlcHJvcGxpc3RoZm9vCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNyBMZW5uYXJ0IFBvZXR0ZXJpbmcKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUKKyAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgIExpY2Vuc2UgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL2djY21hY3JvLmg+CisjaW5jbHVkZSA8cHVsc2UvdmVyc2lvbi5oPgorCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIEZvciBzdHJlYW1zOiBsb2NhbGl6ZWQgbWVkaWEgbmFtZSwgZm9ybWF0dGVkIGFzIFVURi04LiBlLmcuICJHdW5zJ04nUm9zZXM6IENpdmlsIFdhciIuKi8KKyNkZWZpbmUgUEFfUFJPUF9NRURJQV9OQU1FICAgICAgICAgICAgICAgICAgICAgIm1lZGlhLm5hbWUiCisKKy8qKiBGb3Igc3RyZWFtczogbG9jYWxpemVkIG1lZGlhIHRpdGxlIGlmIGFwcGxpY2FibGUsIGZvcm1hdHRlZCBhcyBVVEYtOC4gZS5nLiAiQ2l2aWwgV2FyIiAqLworI2RlZmluZSBQQV9QUk9QX01FRElBX1RJVExFICAgICAgICAgICAgICAgICAgICAibWVkaWEudGl0bGUiCisKKy8qKiBGb3Igc3RyZWFtczogbG9jYWxpemVkIG1lZGlhIGFydGlzdCBpZiBhcHBsaWNhYmxlLCBmb3JtYXR0ZWQgYXMgVVRGLTguIGUuZy4gIkd1bnMnTidSb3NlcyIgKi8KKyNkZWZpbmUgUEFfUFJPUF9NRURJQV9BUlRJU1QgICAgICAgICAgICAgICAgICAgIm1lZGlhLmFydGlzdCIKKworLyoqIEZvciBzdHJlYW1zOiBsb2NhbGl6ZWQgbWVkaWEgY29weXJpZ2h0IHN0cmluZyBpZiBhcHBsaWNhYmxlLCBmb3JtYXR0ZWQgYXMgVVRGLTguIGUuZy4gIkV2aWwgUmVjb3JkIENvcnAuIiAqLworI2RlZmluZSBQQV9QUk9QX01FRElBX0NPUFlSSUdIVCAgICAgICAgICAgICAgICAibWVkaWEuY29weXJpZ2h0IgorCisvKiogRm9yIHN0cmVhbXM6IGxvY2FsaXplZCBtZWRpYSBnZW5lcmF0b3Igc29mdHdhcmUgc3RyaW5nIGlmIGFwcGxpY2FibGUsIGZvcm1hdHRlZCBhcyBVVEYtOC4gZS5nLiAiRm9vY3JvcCBBdWRpb0Zyb2JuaWNhdG9yIiAqLworI2RlZmluZSBQQV9QUk9QX01FRElBX1NPRlRXQVJFICAgICAgICAgICAgICAgICAibWVkaWEuc29mdHdhcmUiCisKKy8qKiBGb3Igc3RyZWFtczogbWVkaWEgbGFuZ3VhZ2UgaWYgYXBwbGljYWJsZSwgaW4gc3RhbmRhcmQgUE9TSVggZm9ybWF0LiBlLmcuICJkZV9ERSIgKi8KKyNkZWZpbmUgUEFfUFJPUF9NRURJQV9MQU5HVUFHRSAgICAgICAgICAgICAgICAgIm1lZGlhLmxhbmd1YWdlIgorCisvKiogRm9yIHN0cmVhbXM6IHNvdXJjZSBmaWxlbmFtZSBpZiBhcHBsaWNhYmxlLCBpbiBVUkkgZm9ybWF0IG9yIGxvY2FsIHBhdGguIGUuZy4gIi9ob21lL2xlbm5hcnQvbXVzaWMvZm9vYmFyLm9nZyIgKi8KKyNkZWZpbmUgUEFfUFJPUF9NRURJQV9GSUxFTkFNRSAgICAgICAgICAgICAgICAgIm1lZGlhLmZpbGVuYW1lIgorCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKy8qKiBGb3Igc3RyZWFtczogaWNvbiBmb3IgdGhlIG1lZGlhLiBBIGJpbmFyeSBibG9iIGNvbnRhaW5pbmcgUE5HIGltYWdlIGRhdGEgKi8KKyNkZWZpbmUgUEFfUFJPUF9NRURJQV9JQ09OICAgICAgICAgICAgICAgICAgICAgIm1lZGlhLmljb24iCisvKiogXGVuZGNvbmQgKi8KKworLyoqIEZvciBzdHJlYW1zOiBhbiBYREcgaWNvbiBuYW1lIGZvciB0aGUgbWVkaWEuIGUuZy4gImF1ZGlvLXgtbXAzIiAqLworI2RlZmluZSBQQV9QUk9QX01FRElBX0lDT05fTkFNRSAgICAgICAgICAgICAgICAibWVkaWEuaWNvbl9uYW1lIgorCisvKiogRm9yIHN0cmVhbXM6IGxvZ2ljIHJvbGUgb2YgdGhpcyBtZWRpYS4gT25lIG9mIHRoZSBzdHJpbmdzICJ2aWRlbyIsICJtdXNpYyIsICJnYW1lIiwgImV2ZW50IiwgInBob25lIiwgImFuaW1hdGlvbiIsICJwcm9kdWN0aW9uIiwgImExMXkiLCAidGVzdCIgKi8KKyNkZWZpbmUgUEFfUFJPUF9NRURJQV9ST0xFICAgICAgICAgICAgICAgICAgICAgIm1lZGlhLnJvbGUiCisKKy8qKiBGb3Igc3RyZWFtczogdGhlIG5hbWUgb2YgYSBmaWx0ZXIgdGhhdCBpcyBkZXNpcmVkLCBlLmcuICJlY2hvLWNhbmNlbCIgb3IgImVxdWFsaXplci1zaW5rIi4gUHVsc2VBdWRpbyBtYXkgY2hvb3NlIHRvIG5vdCBhcHBseSB0aGUgZmlsdGVyIGlmIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgKGZvciBleGFtcGxlLCBhcHBseWluZyBlY2hvLWNhbmNlbGxhdGlvbiBvbiBhIEJsdWV0b290aCBoZWFkc2V0IHByb2JhYmx5IGRvZXMgbm90IG1ha2Ugc2Vuc2UuIFxzaW5jZSAxLjAgKi8KKyNkZWZpbmUgUEFfUFJPUF9GSUxURVJfV0FOVCAgICAgICAgICAgICAgICAgICAgImZpbHRlci53YW50IgorCisvKiogRm9yIHN0cmVhbXM6IHRoZSBuYW1lIG9mIGEgZmlsdGVyIHRoYXQgaXMgZGVzaXJlZCwgZS5nLiAiZWNoby1jYW5jZWwiIG9yICJlcXVhbGl6ZXItc2luayIuIERpZmZlcnMgZnJvbSBQQV9QUk9QX0ZJTFRFUl9XQU5UIGluIHRoYXQgaXQgZm9yY2VzIFB1bHNlQXVkaW8gdG8gYXBwbHkgdGhlIGZpbHRlciwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIFB1bHNlQXVkaW8gdGhpbmtzIGl0IG1ha2VzIHNlbnNlIHRvIGRvIHNvIG9yIG5vdC4gSWYgdGhpcyBpcyBzZXQsIFBBX1BST1BfRklMVEVSX1dBTlQgaXMgaWdub3JlZC4gSW4gb3RoZXIgd29yZHMsIHlvdSBhbG1vc3QgY2VydGFpbmx5IGRvIG5vdCB3YW50IHRvIHVzZSB0aGlzLiBcc2luY2UgMS4wICovCisjZGVmaW5lIFBBX1BST1BfRklMVEVSX0FQUExZICAgICAgICAgICAgICAgICAgICJmaWx0ZXIuYXBwbHkiCisKKy8qKiBGb3Igc3RyZWFtczogdGhlIG5hbWUgb2YgYSBmaWx0ZXIgdGhhdCBzaG91bGQgc3BlY2lmaWNhbGx5IHN1cHByZXNzZWQgKGkuZS4gb3ZlcnJpZGVzIFBBX1BST1BfRklMVEVSX1dBTlQpLiBVc2VmdWwgZm9yIHRoZSB0aW1lcyB0aGF0IFBBX1BST1BfRklMVEVSX1dBTlQgaXMgYXV0b21hdGljYWxseSBhZGRlZCAoZS5nLiBlY2hvLWNhbmNlbGxhdGlvbiBmb3IgcGhvbmUgc3RyZWFtcyB3aGVuICRWT0lQX0FQUCBkb2VzIGl0J3Mgb3duLCBpbnRlcm5hbCBBRUMpIFxzaW5jZSAxLjAgKi8KKyNkZWZpbmUgUEFfUFJPUF9GSUxURVJfU1VQUFJFU1MgICAgICAgICAgICAgICAgImZpbHRlci5zdXBwcmVzcyIKKworLyoqIEZvciBldmVudCBzb3VuZCBzdHJlYW1zOiBYREcgZXZlbnQgc291bmQgbmFtZS4gZS5nLiAibWVzc2FnZS1uZXctZW1haWwiIChFdmVudCBzb3VuZCBzdHJlYW1zIGFyZSB0aG9zZSB3aXRoIG1lZGlhLnJvbGUgc2V0IHRvICJldmVudCIpICovCisjZGVmaW5lIFBBX1BST1BfRVZFTlRfSUQgICAgICAgICAgICAgICAgICAgICAgICJldmVudC5pZCIKKworLyoqIEZvciBldmVudCBzb3VuZCBzdHJlYW1zOiBsb2NhbGl6ZWQgaHVtYW4gcmVhZGFibGUgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIGV2ZW50LCBmb3JtYXR0ZWQgYXMgVVRGLTguIGUuZy4gIkVtYWlsIGZyb20gbGVubmFydEBleGFtcGxlLmNvbSByZWNlaXZlZC4iICovCisjZGVmaW5lIFBBX1BST1BfRVZFTlRfREVTQ1JJUFRJT04gICAgICAgICAgICAgICJldmVudC5kZXNjcmlwdGlvbiIKKworLyoqIEZvciBldmVudCBzb3VuZCBzdHJlYW1zOiBhYnNvbHV0ZSBob3Jpem9udGFsIG1vdXNlIHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4gaWYgdGhlIGV2ZW50IHNvdW5kIHdhcyB0cmlnZ2VyZWQgYnkgYSBtb3VzZSBjbGljaywgaW50ZWdlciBmb3JtYXR0ZWQgYXMgdGV4dCBzdHJpbmcuIGUuZy4gIjg2NSIgKi8KKyNkZWZpbmUgUEFfUFJPUF9FVkVOVF9NT1VTRV9YICAgICAgICAgICAgICAgICAgImV2ZW50Lm1vdXNlLngiCisKKy8qKiBGb3IgZXZlbnQgc291bmQgc3RyZWFtczogYWJzb2x1dGUgdmVydGljYWwgbW91c2UgcG9zaXRpb24gb24gdGhlIHNjcmVlbiBpZiB0aGUgZXZlbnQgc291bmQgd2FzIHRyaWdnZXJlZCBieSBhIG1vdXNlIGNsaWNrLCBpbnRlZ2VyIGZvcm1hdHRlZCBhcyB0ZXh0IHN0cmluZy4gZS5nLiAiNDMyIiAqLworI2RlZmluZSBQQV9QUk9QX0VWRU5UX01PVVNFX1kgICAgICAgICAgICAgICAgICAiZXZlbnQubW91c2UueSIKKworLyoqIEZvciBldmVudCBzb3VuZCBzdHJlYW1zOiByZWxhdGl2ZSBob3Jpem9udGFsIG1vdXNlIHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4gaWYgdGhlIGV2ZW50IHNvdW5kIHdhcyB0cmlnZ2VyZWQgYnkgYSBtb3VzZSBjbGljaywgZmxvYXQgZm9ybWF0dGVkIGFzIHRleHQgc3RyaW5nLCByYW5naW5nIGZyb20gMC4wIChsZWZ0IHNpZGUgb2YgdGhlIHNjcmVlbikgdG8gMS4wIChyaWdodCBzaWRlIG9mIHRoZSBzY3JlZW4pLiBlLmcuICIwLjY1IiAqLworI2RlZmluZSBQQV9QUk9QX0VWRU5UX01PVVNFX0hQT1MgICAgICAgICAgICAgICAiZXZlbnQubW91c2UuaHBvcyIKKworLyoqIEZvciBldmVudCBzb3VuZCBzdHJlYW1zOiByZWxhdGl2ZSB2ZXJ0aWNhbCBtb3VzZSBwb3NpdGlvbiBvbiB0aGUgc2NyZWVuIGlmIHRoZSBldmVudCBzb3VuZCB3YXMgdHJpZ2dlcmVkIGJ5IGEgbW91c2UgY2xpY2ssIGZsb2F0IGZvcm1hdHRlZCBhcyB0ZXh0IHN0cmluZywgcmFuZ2luZyBmcm9tIDAuMCAodG9wIG9mIHRoZSBzY3JlZW4pIHRvIDEuMCAoYm90dG9tIG9mIHRoZSBzY3JlZW4pLiBlLmcuICIwLjQzIiAqLworI2RlZmluZSBQQV9QUk9QX0VWRU5UX01PVVNFX1ZQT1MgICAgICAgICAgICAgICAiZXZlbnQubW91c2UudnBvcyIKKworLyoqIEZvciBldmVudCBzb3VuZCBzdHJlYW1zOiBtb3VzZSBidXR0b24gdGhhdCB0cmlnZ2VyZWQgdGhlIGV2ZW50IGlmIGFwcGxpY2FibGUsIGludGVnZXIgZm9ybWF0dGVkIGFzIHN0cmluZyB3aXRoIDA9bGVmdCwgMT1taWRkbGUsIDI9cmlnaHQuIGUuZy4gIjAiICovCisjZGVmaW5lIFBBX1BST1BfRVZFTlRfTU9VU0VfQlVUVE9OICAgICAgICAgICAgICJldmVudC5tb3VzZS5idXR0b24iCisKKy8qKiBGb3Igc3RyZWFtcyB0aGF0IGJlbG9uZyB0byBhIHdpbmRvdyBvbiB0aGUgc2NyZWVuOiBsb2NhbGl6ZWQgd2luZG93IHRpdGxlLiBlLmcuICJUb3RlbSBNdXNpYyBQbGF5ZXIiICovCisjZGVmaW5lIFBBX1BST1BfV0lORE9XX05BTUUgICAgICAgICAgICAgICAgICAgICJ3aW5kb3cubmFtZSIKKworLyoqIEZvciBzdHJlYW1zIHRoYXQgYmVsb25nIHRvIGEgd2luZG93IG9uIHRoZSBzY3JlZW46IGEgdGV4dHVhbCBpZCBmb3IgaWRlbnRpZnlpbmcgYSB3aW5kb3cgbG9naWNhbGx5LiBlLmcuICJvcmcuZ25vbWUuVG90ZW0uTWFpbldpbmRvdyIgKi8KKyNkZWZpbmUgUEFfUFJPUF9XSU5ET1dfSUQgICAgICAgICAgICAgICAgICAgICAgIndpbmRvdy5pZCIKKworLyoqIFxjb25kIGZ1bGxkb2NzICovCisvKiogRm9yIHN0cmVhbXMgdGhhdCBiZWxvbmcgdG8gYSB3aW5kb3cgb24gdGhlIHNjcmVlbjogd2luZG93IGljb24uIEEgYmluYXJ5IGJsb2IgY29udGFpbmluZyBQTkcgaW1hZ2UgZGF0YSAqLworI2RlZmluZSBQQV9QUk9QX1dJTkRPV19JQ09OICAgICAgICAgICAgICAgICAgICAid2luZG93Lmljb24iCisvKiogXGVuZGNvbmQgKi8KKworLyoqIEZvciBzdHJlYW1zIHRoYXQgYmVsb25nIHRvIGEgd2luZG93IG9uIHRoZSBzY3JlZW46IGFuIFhERyBpY29uIG5hbWUgZm9yIHRoZSB3aW5kb3cuIGUuZy4gInRvdGVtIiAqLworI2RlZmluZSBQQV9QUk9QX1dJTkRPV19JQ09OX05BTUUgICAgICAgICAgICAgICAid2luZG93Lmljb25fbmFtZSIKKworLyoqIEZvciBzdHJlYW1zIHRoYXQgYmVsb25nIHRvIGEgd2luZG93IG9uIHRoZSBzY3JlZW46IGFic29sdXRlIGhvcml6b250YWwgd2luZG93IHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4sIGludGVnZXIgZm9ybWF0dGVkIGFzIHRleHQgc3RyaW5nLiBlLmcuICI4NjUiLiBcc2luY2UgMC45LjE3ICovCisjZGVmaW5lIFBBX1BST1BfV0lORE9XX1ggICAgICAgICAgICAgICAgICAgICAgICJ3aW5kb3cueCIKKworLyoqIEZvciBzdHJlYW1zIHRoYXQgYmVsb25nIHRvIGEgd2luZG93IG9uIHRoZSBzY3JlZW46IGFic29sdXRlIHZlcnRpY2FsIHdpbmRvdyBwb3NpdGlvbiBvbiB0aGUgc2NyZWVuLCBpbnRlZ2VyIGZvcm1hdHRlZCBhcyB0ZXh0IHN0cmluZy4gZS5nLiAiMzQzIi4gXHNpbmNlIDAuOS4xNyAqLworI2RlZmluZSBQQV9QUk9QX1dJTkRPV19ZICAgICAgICAgICAgICAgICAgICAgICAid2luZG93LnkiCisKKy8qKiBGb3Igc3RyZWFtcyB0aGF0IGJlbG9uZyB0byBhIHdpbmRvdyBvbiB0aGUgc2NyZWVuOiB3aW5kb3cgd2lkdGggb24gdGhlIHNjcmVlbiwgaW50ZWdlciBmb3JtYXR0ZWQgYXMgdGV4dCBzdHJpbmcuIGUuZy4gIjM2NSIuIFxzaW5jZSAwLjkuMTcgKi8KKyNkZWZpbmUgUEFfUFJPUF9XSU5ET1dfV0lEVEggICAgICAgICAgICAgICAgICAgIndpbmRvdy53aWR0aCIKKworLyoqIEZvciBzdHJlYW1zIHRoYXQgYmVsb25nIHRvIGEgd2luZG93IG9uIHRoZSBzY3JlZW46IHdpbmRvdyBoZWlnaHQgb24gdGhlIHNjcmVlbiwgaW50ZWdlciBmb3JtYXR0ZWQgYXMgdGV4dCBzdHJpbmcuIGUuZy4gIjY0MyIuIFxzaW5jZSAwLjkuMTcgKi8KKyNkZWZpbmUgUEFfUFJPUF9XSU5ET1dfSEVJR0hUICAgICAgICAgICAgICAgICAgIndpbmRvdy5oZWlnaHQiCisKKy8qKiBGb3Igc3RyZWFtcyB0aGF0IGJlbG9uZyB0byBhIHdpbmRvdyBvbiB0aGUgc2NyZWVuOiByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93IGNlbnRlciBvbiB0aGUgc2NyZWVuLCBmbG9hdCBmb3JtYXR0ZWQgYXMgdGV4dCBzdHJpbmcsIHJhbmdpbmcgZnJvbSAwLjAgKGxlZnQgc2lkZSBvZiB0aGUgc2NyZWVuKSB0byAxLjAgKHJpZ2h0IHNpZGUgb2YgdGhlIHNjcmVlbikuIGUuZy4gIjAuNjUiLiBcc2luY2UgMC45LjE3ICovCisjZGVmaW5lIFBBX1BST1BfV0lORE9XX0hQT1MgICAgICAgICAgICAgICAgICAgICJ3aW5kb3cuaHBvcyIKKworLyoqIEZvciBzdHJlYW1zIHRoYXQgYmVsb25nIHRvIGEgd2luZG93IG9uIHRoZSBzY3JlZW46IHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cgY2VudGVyIG9uIHRoZSBzY3JlZW4sIGZsb2F0IGZvcm1hdHRlZCBhcyB0ZXh0IHN0cmluZywgcmFuZ2luZyBmcm9tIDAuMCAodG9wIG9mIHRoZSBzY3JlZW4pIHRvIDEuMCAoYm90dG9tIG9mIHRoZSBzY3JlZW4pLiBlLmcuICIwLjQzIi4gXHNpbmNlIDAuOS4xNyAqLworI2RlZmluZSBQQV9QUk9QX1dJTkRPV19WUE9TICAgICAgICAgICAgICAgICAgICAid2luZG93LnZwb3MiCisKKy8qKiBGb3Igc3RyZWFtcyB0aGF0IGJlbG9uZyB0byBhIHdpbmRvdyBvbiB0aGUgc2NyZWVuOiBpZiB0aGUgd2luZG93aW5nIHN5c3RlbSBzdXBwb3J0cyBtdWx0aXBsZSBkZXNrdG9wcywgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBpbmRleGVzIG9mIHRoZSBkZXNrdG9wcyB0aGlzIHdpbmRvdyBpcyB2aXNpYmxlIG9uLiBJZiB0aGlzIHByb3BlcnR5IGlzIGFuIGVtcHR5IHN0cmluZywgaXQgaXMgdmlzaWJsZSBvbiBhbGwgZGVza3RvcHMgKGkuZS4gJ3N0aWNreScpLiBUaGUgZmlyc3QgZGVza3RvcCBpcyAwLiBlLmcuICIwLDIsMyIgXHNpbmNlIDAuOS4xOCAqLworI2RlZmluZSBQQV9QUk9QX1dJTkRPV19ERVNLVE9QICAgICAgICAgICAgICAgICAid2luZG93LmRlc2t0b3AiCisKKy8qKiBGb3Igc3RyZWFtcyB0aGF0IGJlbG9uZyB0byBhbiBYMTEgd2luZG93IG9uIHRoZSBzY3JlZW46IHRoZSBYMTEgZGlzcGxheSBzdHJpbmcuIGUuZy4gIjowLjAiICovCisjZGVmaW5lIFBBX1BST1BfV0lORE9XX1gxMV9ESVNQTEFZICAgICAgICAgICAgICJ3aW5kb3cueDExLmRpc3BsYXkiCisKKy8qKiBGb3Igc3RyZWFtcyB0aGF0IGJlbG9uZyB0byBhbiBYMTEgd2luZG93IG9uIHRoZSBzY3JlZW46IHRoZSBYMTEgc2NyZWVuIHRoZSB3aW5kb3cgaXMgb24sIGFuIGludGVnZXIgZm9ybWF0dGVkIGFzIHN0cmluZy4gZS5nLiAiMCIgKi8KKyNkZWZpbmUgUEFfUFJPUF9XSU5ET1dfWDExX1NDUkVFTiAgICAgICAgICAgICAgIndpbmRvdy54MTEuc2NyZWVuIgorCisvKiogRm9yIHN0cmVhbXMgdGhhdCBiZWxvbmcgdG8gYW4gWDExIHdpbmRvdyBvbiB0aGUgc2NyZWVuOiB0aGUgWDExIG1vbml0b3IgdGhlIHdpbmRvdyBpcyBvbiwgYW4gaW50ZWdlciBmb3JtYXR0ZWQgYXMgc3RyaW5nLiBlLmcuICIwIiAqLworI2RlZmluZSBQQV9QUk9QX1dJTkRPV19YMTFfTU9OSVRPUiAgICAgICAgICAgICAid2luZG93LngxMS5tb25pdG9yIgorCisvKiogRm9yIHN0cmVhbXMgdGhhdCBiZWxvbmcgdG8gYW4gWDExIHdpbmRvdyBvbiB0aGUgc2NyZWVuOiB0aGUgd2luZG93IFhJRCwgYW4gaW50ZWdlciBmb3JtYXR0ZWQgYXMgc3RyaW5nLiBlLmcuICIyNTYzMiIgKi8KKyNkZWZpbmUgUEFfUFJPUF9XSU5ET1dfWDExX1hJRCAgICAgICAgICAgICAgICAgIndpbmRvdy54MTEueGlkIgorCisvKiogRm9yIGNsaWVudHMvc3RyZWFtczogbG9jYWxpemVkIGh1bWFuIHJlYWRhYmxlIGFwcGxpY2F0aW9uIG5hbWUuIGUuZy4gIlRvdGVtIE11c2ljIFBsYXllciIgKi8KKyNkZWZpbmUgUEFfUFJPUF9BUFBMSUNBVElPTl9OQU1FICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uLm5hbWUiCisKKy8qKiBGb3IgY2xpZW50cy9zdHJlYW1zOiBhIHRleHR1YWwgaWQgZm9yIGlkZW50aWZ5aW5nIGFuIGFwcGxpY2F0aW9uIGxvZ2ljYWxseS4gZS5nLiAib3JnLmdub21lLlRvdGVtIiAqLworI2RlZmluZSBQQV9QUk9QX0FQUExJQ0FUSU9OX0lEICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24uaWQiCisKKy8qKiBGb3IgY2xpZW50cy9zdHJlYW1zOiBhIHZlcnNpb24gc3RyaW5nIGUuZy4gIjAuNi44OCIgKi8KKyNkZWZpbmUgUEFfUFJPUF9BUFBMSUNBVElPTl9WRVJTSU9OICAgICAgICAgICAgImFwcGxpY2F0aW9uLnZlcnNpb24iCisKKy8qKiBcY29uZCBmdWxsZG9jcyAqLworLyoqIEZvciBjbGllbnRzL3N0cmVhbXM6IGFwcGxpY2F0aW9uIGljb24uIEEgYmluYXJ5IGJsb2IgY29udGFpbmluZyBQTkcgaW1hZ2UgZGF0YSAqLworI2RlZmluZSBQQV9QUk9QX0FQUExJQ0FUSU9OX0lDT04gICAgICAgICAgICAgICAiYXBwbGljYXRpb24uaWNvbiIKKy8qKiBcZW5kY29uZCAqLworCisvKiogRm9yIGNsaWVudHMvc3RyZWFtczogYW4gWERHIGljb24gbmFtZSBmb3IgdGhlIGFwcGxpY2F0aW9uLiBlLmcuICJ0b3RlbSIgKi8KKyNkZWZpbmUgUEFfUFJPUF9BUFBMSUNBVElPTl9JQ09OX05BTUUgICAgICAgICAgImFwcGxpY2F0aW9uLmljb25fbmFtZSIKKworLyoqIEZvciBjbGllbnRzL3N0cmVhbXM6IGFwcGxpY2F0aW9uIGxhbmd1YWdlIGlmIGFwcGxpY2FibGUsIGluIHN0YW5kYXJkIFBPU0lYIGZvcm1hdC4gZS5nLiAiZGVfREUiICovCisjZGVmaW5lIFBBX1BST1BfQVBQTElDQVRJT05fTEFOR1VBR0UgICAgICAgICAgICJhcHBsaWNhdGlvbi5sYW5ndWFnZSIKKworLyoqIEZvciBjbGllbnRzL3N0cmVhbXMgb24gVU5JWDogYXBwbGljYXRpb24gcHJvY2VzcyBQSUQsIGFuIGludGVnZXIgZm9ybWF0dGVkIGFzIHN0cmluZy4gZS5nLiAiNDcxMSIgKi8KKyNkZWZpbmUgUEFfUFJPUF9BUFBMSUNBVElPTl9QUk9DRVNTX0lEICAgICAgICAgImFwcGxpY2F0aW9uLnByb2Nlc3MuaWQiCisKKy8qKiBGb3IgY2xpZW50cy9zdHJlYW1zOiBhcHBsaWNhdGlvbiBwcm9jZXNzIG5hbWUuIGUuZy4gInRvdGVtIiAqLworI2RlZmluZSBQQV9QUk9QX0FQUExJQ0FUSU9OX1BST0NFU1NfQklOQVJZICAgICAiYXBwbGljYXRpb24ucHJvY2Vzcy5iaW5hcnkiCisKKy8qKiBGb3IgY2xpZW50cy9zdHJlYW1zOiBhcHBsaWNhdGlvbiB1c2VyIG5hbWUuIGUuZy4gImxlbm5hcnQiICovCisjZGVmaW5lIFBBX1BST1BfQVBQTElDQVRJT05fUFJPQ0VTU19VU0VSICAgICAgICJhcHBsaWNhdGlvbi5wcm9jZXNzLnVzZXIiCisKKy8qKiBGb3IgY2xpZW50cy9zdHJlYW1zOiBob3N0IG5hbWUgdGhlIGFwcGxpY2F0aW9uIHJ1bnMgb24uIGUuZy4gIm9tZWdhIiAqLworI2RlZmluZSBQQV9QUk9QX0FQUExJQ0FUSU9OX1BST0NFU1NfSE9TVCAgICAgICAiYXBwbGljYXRpb24ucHJvY2Vzcy5ob3N0IgorCisvKiogRm9yIGNsaWVudHMvc3RyZWFtczogdGhlIEQtQnVzIGhvc3QgaWQgdGhlIGFwcGxpY2F0aW9uIHJ1bnMgb24uIGUuZy4gIjU0MzY3OWU3YjAxMzkzZWQzZTNlNjUwMDQ3ZDc4ZjZlIiAqLworI2RlZmluZSBQQV9QUk9QX0FQUExJQ0FUSU9OX1BST0NFU1NfTUFDSElORV9JRCAiYXBwbGljYXRpb24ucHJvY2Vzcy5tYWNoaW5lX2lkIgorCisvKiogRm9yIGNsaWVudHMvc3RyZWFtczogYW4gaWQgZm9yIHRoZSBsb2dpbiBzZXNzaW9uIHRoZSBhcHBsaWNhdGlvbiBydW5zIGluLiBPbiBVbml4IHRoZSB2YWx1ZSBvZiAkWERHX1NFU1NJT05fQ09PS0lFLiBlLmcuICI1NDM2NzllN2IwMTM5M2VkM2UzZTY1MDA0N2Q3OGY2ZS0xMjM1MTU5Nzk4Ljc2MTkzLTE5MDM2NzcxNyIgKi8KKyNkZWZpbmUgUEFfUFJPUF9BUFBMSUNBVElPTl9QUk9DRVNTX1NFU1NJT05fSUQgImFwcGxpY2F0aW9uLnByb2Nlc3Muc2Vzc2lvbl9pZCIKKworLyoqIEZvciBkZXZpY2VzOiBkZXZpY2Ugc3RyaW5nIGluIHRoZSB1bmRlcmx5aW5nIGF1ZGlvIGxheWVyJ3MgZm9ybWF0LiBlLmcuICJzdXJyb3VuZDUxOjAiICovCisjZGVmaW5lIFBBX1BST1BfREVWSUNFX1NUUklORyAgICAgICAgICAgICAgICAgICJkZXZpY2Uuc3RyaW5nIgorCisvKiogRm9yIGRldmljZXM6IEFQSSB0aGlzIGRldmljZSBpcyBhY2Nlc3Mgd2l0aC4gZS5nLiAiYWxzYSIgKi8KKyNkZWZpbmUgUEFfUFJPUF9ERVZJQ0VfQVBJICAgICAgICAgICAgICAgICAgICAgImRldmljZS5hcGkiCisKKy8qKiBGb3IgZGV2aWNlczogbG9jYWxpemVkIGh1bWFuIHJlYWRhYmxlIGRldmljZSBvbmUtbGluZSBkZXNjcmlwdGlvbiwgZS5nLiAiRm9vYmFyIEluZHVzdHJpZXMgVVNCIEhlYWRzZXQgMjAwMCsgVWx0cmEiICovCisjZGVmaW5lIFBBX1BST1BfREVWSUNFX0RFU0NSSVBUSU9OICAgICAgICAgICAgICJkZXZpY2UuZGVzY3JpcHRpb24iCisKKy8qKiBGb3IgZGV2aWNlczogYnVzIHBhdGggdG8gdGhlIGRldmljZSBpbiB0aGUgT1MnIGZvcm1hdC4gZS5nLiAiL3N5cy9idXMvcGNpL2RldmljZXMvMDAwMDowMDoxZi4yIiAqLworI2RlZmluZSBQQV9QUk9QX0RFVklDRV9CVVNfUEFUSCAgICAgICAgICAgICAgICAiZGV2aWNlLmJ1c19wYXRoIgorCisvKiogRm9yIGRldmljZXM6IHNlcmlhbCBudW1iZXIgaWYgYXBwbGljYWJsZS4gZS5nLiAiNDcxMS0wODE1LTEyMzQiICovCisjZGVmaW5lIFBBX1BST1BfREVWSUNFX1NFUklBTCAgICAgICAgICAgICAgICAgICJkZXZpY2Uuc2VyaWFsIgorCisvKiogRm9yIGRldmljZXM6IHZlbmRvciBJRCBpZiBhcHBsaWNhYmxlLiBlLmcuIDEyNzQgKi8KKyNkZWZpbmUgUEFfUFJPUF9ERVZJQ0VfVkVORE9SX0lEICAgICAgICAgICAgICAgImRldmljZS52ZW5kb3IuaWQiCisKKy8qKiBGb3IgZGV2aWNlczogdmVuZG9yIG5hbWUgaWYgYXBwbGljYWJsZS4gZS5nLiAiRm9vY29ycCBIZWF2eSBJbmR1c3RyaWVzIiAqLworI2RlZmluZSBQQV9QUk9QX0RFVklDRV9WRU5ET1JfTkFNRSAgICAgICAgICAgICAiZGV2aWNlLnZlbmRvci5uYW1lIgorCisvKiogRm9yIGRldmljZXM6IHByb2R1Y3QgSUQgaWYgYXBwbGljYWJsZS4gZS5nLiA0NTY1ICovCisjZGVmaW5lIFBBX1BST1BfREVWSUNFX1BST0RVQ1RfSUQgICAgICAgICAgICAgICJkZXZpY2UucHJvZHVjdC5pZCIKKworLyoqIEZvciBkZXZpY2VzOiBwcm9kdWN0IG5hbWUgaWYgYXBwbGljYWJsZS4gZS5nLiAiU3VwZXJTcGVha2VycyAyMDAwIFBybyIgKi8KKyNkZWZpbmUgUEFfUFJPUF9ERVZJQ0VfUFJPRFVDVF9OQU1FICAgICAgICAgICAgImRldmljZS5wcm9kdWN0Lm5hbWUiCisKKy8qKiBGb3IgZGV2aWNlczogZGV2aWNlIGNsYXNzLiBPbmUgb2YgInNvdW5kIiwgIm1vZGVtIiwgIm1vbml0b3IiLCAiZmlsdGVyIiAqLworI2RlZmluZSBQQV9QUk9QX0RFVklDRV9DTEFTUyAgICAgICAgICAgICAgICAgICAiZGV2aWNlLmNsYXNzIgorCisvKiogRm9yIGRldmljZXM6IGZvcm0gZmFjdG9yIGlmIGFwcGxpY2FibGUuIE9uZSBvZiAiaW50ZXJuYWwiLCAic3BlYWtlciIsICJoYW5kc2V0IiwgInR2IiwgIndlYmNhbSIsICJtaWNyb3Bob25lIiwgImhlYWRzZXQiLCAiaGVhZHBob25lIiwgImhhbmRzLWZyZWUiLCAiY2FyIiwgImhpZmkiLCAiY29tcHV0ZXIiLCAicG9ydGFibGUiICovCisjZGVmaW5lIFBBX1BST1BfREVWSUNFX0ZPUk1fRkFDVE9SICAgICAgICAgICAgICJkZXZpY2UuZm9ybV9mYWN0b3IiCisKKy8qKiBGb3IgZGV2aWNlczogYnVzIG9mIHRoZSBkZXZpY2UgaWYgYXBwbGljYWJsZS4gT25lIG9mICJpc2EiLCAicGNpIiwgInVzYiIsICJmaXJld2lyZSIsICJibHVldG9vdGgiICovCisjZGVmaW5lIFBBX1BST1BfREVWSUNFX0JVUyAgICAgICAgICAgICAgICAgICAgICJkZXZpY2UuYnVzIgorCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKy8qKiBGb3IgZGV2aWNlczogaWNvbiBmb3IgdGhlIGRldmljZS4gQSBiaW5hcnkgYmxvYiBjb250YWluaW5nIFBORyBpbWFnZSBkYXRhICovCisjZGVmaW5lIFBBX1BST1BfREVWSUNFX0lDT04gICAgICAgICAgICAgICAgICAgICJkZXZpY2UuaWNvbiIKKy8qKiBcZW5kY29uZCAqLworCisvKiogRm9yIGRldmljZXM6IGFuIFhERyBpY29uIG5hbWUgZm9yIHRoZSBkZXZpY2UuIGUuZy4gInNvdW5kLWNhcmQtc3BlYWtlcnMtdXNiIiAqLworI2RlZmluZSBQQV9QUk9QX0RFVklDRV9JQ09OX05BTUUgICAgICAgICAgICAgICAiZGV2aWNlLmljb25fbmFtZSIKKworLyoqIEZvciBkZXZpY2VzOiBhY2Nlc3MgbW9kZSBvZiB0aGUgZGV2aWNlIGlmIGFwcGxpY2FibGUuIE9uZSBvZiAibW1hcCIsICJtbWFwX3Jld3JpdGUiLCAic2VyaWFsIiAqLworI2RlZmluZSBQQV9QUk9QX0RFVklDRV9BQ0NFU1NfTU9ERSAgICAgICAgICAgICAiZGV2aWNlLmFjY2Vzc19tb2RlIgorCisvKiogRm9yIGZpbHRlciBkZXZpY2VzOiBtYXN0ZXIgZGV2aWNlIGlkIGlmIGFwcGxpY2FibGUuICovCisjZGVmaW5lIFBBX1BST1BfREVWSUNFX01BU1RFUl9ERVZJQ0UgICAgICAgICAgICJkZXZpY2UubWFzdGVyX2RldmljZSIKKworLyoqIEZvciBkZXZpY2VzOiBidWZmZXIgc2l6ZSBpbiBieXRlcywgaW50ZWdlciBmb3JtYXR0ZWQgYXMgc3RyaW5nLiAqLworI2RlZmluZSBQQV9QUk9QX0RFVklDRV9CVUZGRVJJTkdfQlVGRkVSX1NJWkUgICAiZGV2aWNlLmJ1ZmZlcmluZy5idWZmZXJfc2l6ZSIKKworLyoqIEZvciBkZXZpY2VzOiBmcmFnbWVudCBzaXplIGluIGJ5dGVzLCBpbnRlZ2VyIGZvcm1hdHRlZCBhcyBzdHJpbmcuICovCisjZGVmaW5lIFBBX1BST1BfREVWSUNFX0JVRkZFUklOR19GUkFHTUVOVF9TSVpFICJkZXZpY2UuYnVmZmVyaW5nLmZyYWdtZW50X3NpemUiCisKKy8qKiBGb3IgZGV2aWNlczogcHJvZmlsZSBpZGVudGlmaWVyIGZvciB0aGUgcHJvZmlsZSB0aGlzIGRldmljZXMgaXMgaW4uIGUuZy4gImFuYWxvZy1zdGVyZW8iLCAiYW5hbG9nLXN1cnJvdW5kLTQwIiwgImllYzk1OC1zdGVyZW8iLCAuLi4qLworI2RlZmluZSBQQV9QUk9QX0RFVklDRV9QUk9GSUxFX05BTUUgICAgICAgICAgICAiZGV2aWNlLnByb2ZpbGUubmFtZSIKKworLyoqIEZvciBkZXZpY2VzOiBpbnRlbmRlZCB1c2UuIEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygcm9sZXMgKHNlZSBQQV9QUk9QX01FRElBX1JPTEUpIHRoaXMgZGV2aWNlIGlzIHBhcnRpY3VsYXJseSB3ZWxsIHN1aXRlZCBmb3IsIGR1ZSB0byBsYXRlbmN5LCBxdWFsaXR5IG9yIGZvcm0gZmFjdG9yLiBcc2luY2UgMC45LjE2ICovCisjZGVmaW5lIFBBX1BST1BfREVWSUNFX0lOVEVOREVEX1JPTEVTICAgICAgICAgICJkZXZpY2UuaW50ZW5kZWRfcm9sZXMiCisKKy8qKiBGb3IgZGV2aWNlczogaHVtYW4gcmVhZGFibGUgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIHByb2ZpbGUgdGhpcyBkZXZpY2UgaXMgaW4uIGUuZy4gIkFuYWxvZyBTdGVyZW8iLCAuLi4gKi8KKyNkZWZpbmUgUEFfUFJPUF9ERVZJQ0VfUFJPRklMRV9ERVNDUklQVElPTiAgICAgImRldmljZS5wcm9maWxlLmRlc2NyaXB0aW9uIgorCisvKiogRm9yIG1vZHVsZXM6IHRoZSBhdXRob3IncyBuYW1lLCBmb3JtYXR0ZWQgYXMgVVRGLTggc3RyaW5nLiBlLmcuICJMZW5uYXJ0IFBvZXR0ZXJpbmciICovCisjZGVmaW5lIFBBX1BST1BfTU9EVUxFX0FVVEhPUiAgICAgICAgICAgICAgICAgICJtb2R1bGUuYXV0aG9yIgorCisvKiogRm9yIG1vZHVsZXM6IGEgaHVtYW4gcmVhZGFibGUgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIG1vZHVsZSdzIHB1cnBvc2UgZm9ybWF0dGVkIGFzIFVURi04LiBlLmcuICJGcm9ibmljYXRlIHNvdW5kcyB3aXRoIGEgZmx1eCBjb21wZW5zYXRvciIgKi8KKyNkZWZpbmUgUEFfUFJPUF9NT0RVTEVfREVTQ1JJUFRJT04gICAgICAgICAgICAgIm1vZHVsZS5kZXNjcmlwdGlvbiIKKworLyoqIEZvciBtb2R1bGVzOiBhIGh1bWFuIHJlYWRhYmxlIHVzYWdlIGRlc2NyaXB0aW9uIG9mIHRoZSBtb2R1bGUncyBhcmd1bWVudHMgZm9ybWF0dGVkIGFzIFVURi04LiAqLworI2RlZmluZSBQQV9QUk9QX01PRFVMRV9VU0FHRSAgICAgICAgICAgICAgICAgICAibW9kdWxlLnVzYWdlIgorCisvKiogRm9yIG1vZHVsZXM6IGEgdmVyc2lvbiBzdHJpbmcgZm9yIHRoZSBtb2R1bGUuIGUuZy4gIjAuOS4xNSIgKi8KKyNkZWZpbmUgUEFfUFJPUF9NT0RVTEVfVkVSU0lPTiAgICAgICAgICAgICAgICAgIm1vZHVsZS52ZXJzaW9uIgorCisvKiogRm9yIFBDTSBmb3JtYXRzOiB0aGUgc2FtcGxlIGZvcm1hdCB1c2VkIGFzIHJldHVybmVkIGJ5IHBhX3NhbXBsZV9mb3JtYXRfdG9fc3RyaW5nKCkgXHNpbmNlIDEuMCAqLworI2RlZmluZSBQQV9QUk9QX0ZPUk1BVF9TQU1QTEVfRk9STUFUICAgICAgICAgICAiZm9ybWF0LnNhbXBsZV9mb3JtYXQiCisKKy8qKiBGb3IgYWxsIGZvcm1hdHM6IHRoZSBzYW1wbGUgcmF0ZSAodW5zaWduZWQgaW50ZWdlcikgXHNpbmNlIDEuMCAqLworI2RlZmluZSBQQV9QUk9QX0ZPUk1BVF9SQVRFICAgICAgICAgICAgICAgICAgICAiZm9ybWF0LnJhdGUiCisKKy8qKiBGb3IgYWxsIGZvcm1hdHM6IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgKHVuc2lnbmVkIGludGVnZXIpIFxzaW5jZSAxLjAgKi8KKyNkZWZpbmUgUEFfUFJPUF9GT1JNQVRfQ0hBTk5FTFMgICAgICAgICAgICAgICAgImZvcm1hdC5jaGFubmVscyIKKworLyoqIEZvciBQQ00gZm9ybWF0czogdGhlIGNoYW5uZWwgbWFwIG9mIHRoZSBzdHJlYW0gYXMgcmV0dXJuZWQgYnkgcGFfY2hhbm5lbF9tYXBfc25wcmludCgpIFxzaW5jZSAxLjAgKi8KKyNkZWZpbmUgUEFfUFJPUF9GT1JNQVRfQ0hBTk5FTF9NQVAgICAgICAgICAgICAgImZvcm1hdC5jaGFubmVsX21hcCIKKworLyoqIEEgcHJvcGVydHkgbGlzdCBvYmplY3QuIEJhc2ljYWxseSBhIGRpY3Rpb25hcnkgd2l0aCBBU0NJSSBzdHJpbmdzCisgKiBhcyBrZXlzIGFuZCBhcmJpdHJhcnkgZGF0YSBhcyB2YWx1ZXMuIFxzaW5jZSAwLjkuMTEgKi8KK3R5cGVkZWYgc3RydWN0IHBhX3Byb3BsaXN0IHBhX3Byb3BsaXN0OworCisvKiogQWxsb2NhdGUgYSBwcm9wZXJ0eSBsaXN0LiBcc2luY2UgMC45LjExICovCitwYV9wcm9wbGlzdCogcGFfcHJvcGxpc3RfbmV3KHZvaWQpOworCisvKiogRnJlZSB0aGUgcHJvcGVydHkgbGlzdC4gXHNpbmNlIDAuOS4xMSAqLwordm9pZCBwYV9wcm9wbGlzdF9mcmVlKHBhX3Byb3BsaXN0KiBwKTsKKworLyoqIEFwcGVuZCBhIG5ldyBzdHJpbmcgZW50cnkgdG8gdGhlIHByb3BlcnR5IGxpc3QsIHBvc3NpYmx5CisgKiBvdmVyd3JpdGluZyBhbiBhbHJlYWR5IGV4aXN0aW5nIGVudHJ5IHdpdGggdGhlIHNhbWUga2V5LiBBbgorICogaW50ZXJuYWwgY29weSBvZiB0aGUgZGF0YSBwYXNzZWQgaXMgbWFkZS4gV2lsbCBhY2NlcHQgb25seSB2YWxpZAorICogVVRGLTguIFxzaW5jZSAwLjkuMTEgKi8KK2ludCBwYV9wcm9wbGlzdF9zZXRzKHBhX3Byb3BsaXN0ICpwLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKTsKKworLyoqIEFwcGVuZCBhIG5ldyBzdHJpbmcgZW50cnkgdG8gdGhlIHByb3BlcnR5IGxpc3QsIHBvc3NpYmx5CisgKiBvdmVyd3JpdGluZyBhbiBhbHJlYWR5IGV4aXN0aW5nIGVudHJ5IHdpdGggdGhlIHNhbWUga2V5LiBBbgorICogaW50ZXJuYWwgY29weSBvZiB0aGUgZGF0YSBwYXNzZWQgaXMgbWFkZS4gV2lsbCBhY2NlcHQgb25seSB2YWxpZAorICogVVRGLTguIFRoZSBzdHJpbmcgcGFzc2VkIGluIG11c3QgY29udGFpbiBhICc9Jy4gTGVmdCBoYW5kIHNpZGUgb2YKKyAqIHRoZSAnPScgaXMgdXNlZCBhcyBrZXkgbmFtZSwgdGhlIHJpZ2h0IGhhbmQgc2lkZSBhcyBzdHJpbmcKKyAqIGRhdGEuIFxzaW5jZSAwLjkuMTYgKi8KK2ludCBwYV9wcm9wbGlzdF9zZXRwKHBhX3Byb3BsaXN0ICpwLCBjb25zdCBjaGFyICpwYWlyKTsKKworLyoqIEFwcGVuZCBhIG5ldyBzdHJpbmcgZW50cnkgdG8gdGhlIHByb3BlcnR5IGxpc3QsIHBvc3NpYmx5CisgKiBvdmVyd3JpdGluZyBhbiBhbHJlYWR5IGV4aXN0aW5nIGVudHJ5IHdpdGggdGhlIHNhbWUga2V5LiBBbgorICogaW50ZXJuYWwgY29weSBvZiB0aGUgZGF0YSBwYXNzZWQgaXMgbWFkZS4gV2lsbCBhY2NlcHQgb25seSB2YWxpZAorICogVVRGLTguIFRoZSBkYXRhIGNhbiBiZSBwYXNzZWQgYXMgcHJpbnRmKCktc3R5bGUgZm9ybWF0IHN0cmluZyB3aXRoCisgKiBhcmd1bWVudHMuIFxzaW5jZSAwLjkuMTEgKi8KK2ludCBwYV9wcm9wbGlzdF9zZXRmKHBhX3Byb3BsaXN0ICpwLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBQQV9HQ0NfUFJJTlRGX0FUVFIoMyw0KTsKKworLyoqIEFwcGVuZCBhIG5ldyBhcmJpdHJhcnkgZGF0YSBlbnRyeSB0byB0aGUgcHJvcGVydHkgbGlzdCwgcG9zc2libHkKKyAqIG92ZXJ3cml0aW5nIGFuIGFscmVhZHkgZXhpc3RpbmcgZW50cnkgd2l0aCB0aGUgc2FtZSBrZXkuIEFuCisgKiBpbnRlcm5hbCBjb3B5IG9mIHRoZSBkYXRhIHBhc3NlZCBpcyBtYWRlLiBcc2luY2UgMC45LjExICovCitpbnQgcGFfcHJvcGxpc3Rfc2V0KHBhX3Byb3BsaXN0ICpwLCBjb25zdCBjaGFyICprZXksIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBuYnl0ZXMpOworCisvKiogUmV0dXJuIGEgc3RyaW5nIGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIGtleS4gV2lsbCByZXR1cm4gTlVMTCBpZgorICogdGhlIGRhdGEgaXMgbm90IHZhbGlkIFVURi04LiBXaWxsIHJldHVybiBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBpbgorICogYW4gaW50ZXJuYWxseSBhbGxvY2F0ZWQgYnVmZmVyLiBUaGUgY2FsbGVyIHNob3VsZCBtYWtlIGEgY29weSBvZgorICogdGhlIGRhdGEgYmVmb3JlIGFjY2Vzc2luZyB0aGUgcHJvcGVydHkgbGlzdCBhZ2Fpbi4gXHNpbmNlIDAuOS4xMSAqLworY29uc3QgY2hhciAqcGFfcHJvcGxpc3RfZ2V0cyhwYV9wcm9wbGlzdCAqcCwgY29uc3QgY2hhciAqa2V5KTsKKworLyoqIFJldHVybiB0aGUgdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGtleS4gV2lsbCByZXR1cm4gYQorICogTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGZvciBzdHJpbmcgZW50cmllcy4gVGhlIHBvaW50ZXIgcmV0dXJuZWQgd2lsbAorICogcG9pbnQgdG8gYW4gaW50ZXJuYWxseSBhbGxvY2F0ZWQgYnVmZmVyLiBUaGUgY2FsbGVyIHNob3VsZCBtYWtlIGEKKyAqIGNvcHkgb2YgdGhlIGRhdGEgYmVmb3JlIHRoZSBwcm9wZXJ0eSBsaXN0IGlzIGFjY2Vzc2VkIGFnYWluLiBcc2luY2UKKyAqIDAuOS4xMSAqLworaW50IHBhX3Byb3BsaXN0X2dldChwYV9wcm9wbGlzdCAqcCwgY29uc3QgY2hhciAqa2V5LCBjb25zdCB2b2lkICoqZGF0YSwgc2l6ZV90ICpuYnl0ZXMpOworCisvKiogVXBkYXRlIG1vZGUgZW51bSBmb3IgcGFfcHJvcGxpc3RfdXBkYXRlKCkuIFxzaW5jZSAwLjkuMTEgKi8KK3R5cGVkZWYgZW51bSBwYV91cGRhdGVfbW9kZSB7CisgICAgUEFfVVBEQVRFX1NFVAorICAgIC8qKjwgUmVwbGFjZSB0aGUgZW50aXJlIHByb3BlcnR5IGxpc3Qgd2l0aCB0aGUgbmV3IG9uZS4gRG9uJ3Qga2VlcAorICAgICAqICBhbnkgb2YgdGhlIG9sZCBkYXRhIGFyb3VuZCAqLywKKworICAgIFBBX1VQREFURV9NRVJHRQorICAgIC8qKjwgTWVyZ2UgbmV3IHByb3BlcnR5IGxpc3QgaW50byB0aGUgZXhpc3Rpbmcgb25lLCBub3QgcmVwbGFjaW5nCisgICAgICogIGFueSBvbGQgZW50cmllcyBpZiB0aGV5IHNoYXJlIGEgY29tbW9uIGtleSB3aXRoIHRoZSBuZXcKKyAgICAgKiAgcHJvcGVydHkgbGlzdC4gKi8sCisKKyAgICBQQV9VUERBVEVfUkVQTEFDRQorICAgIC8qKjwgTWVyZ2UgbmV3IHByb3BlcnR5IGxpc3QgaW50byB0aGUgZXhpc3Rpbmcgb25lLCByZXBsYWNpbmcgYWxsCisgICAgICogIG9sZCBlbnRyaWVzIHRoYXQgc2hhcmUgYSBjb21tb24ga2V5IHdpdGggdGhlIG5ldyBwcm9wZXJ0eQorICAgICAqICBsaXN0LiAqLworfSBwYV91cGRhdGVfbW9kZV90OworCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKyNkZWZpbmUgUEFfVVBEQVRFX1NFVCBQQV9VUERBVEVfU0VUCisjZGVmaW5lIFBBX1VQREFURV9NRVJHRSBQQV9VUERBVEVfTUVSR0UKKyNkZWZpbmUgUEFfVVBEQVRFX1JFUExBQ0UgUEFfVVBEQVRFX1JFUExBQ0UKKy8qKiBcZW5kY29uZCAqLworCisvKiogTWVyZ2UgcHJvcGVydHkgbGlzdCAib3RoZXIiIGludG8gInAiLCBhZGhlcmluZyB0aGUgbWVyZ2UgbW9kZSBhcworICogc3BlY2lmaWVkIGluICJtb2RlIi4gXHNpbmNlIDAuOS4xMSAqLwordm9pZCBwYV9wcm9wbGlzdF91cGRhdGUocGFfcHJvcGxpc3QgKnAsIHBhX3VwZGF0ZV9tb2RlX3QgbW9kZSwgcGFfcHJvcGxpc3QgKm90aGVyKTsKKworLyoqIFJlbW92ZXMgYSBzaW5nbGUgZW50cnkgZnJvbSB0aGUgcHJvcGVydHkgbGlzdCwgaWRlbnRpZmllZCBiZSB0aGUKKyAqIHNwZWNpZmllZCBrZXkgbmFtZS4gXHNpbmNlIDAuOS4xMSAqLworaW50IHBhX3Byb3BsaXN0X3Vuc2V0KHBhX3Byb3BsaXN0ICpwLCBjb25zdCBjaGFyICprZXkpOworCisvKiogU2ltaWxhciB0byBwYV9wcm9wbGlzdF91bnNldCgpIGJ1dCB0YWtlcyBhbiBhcnJheSBvZiBrZXlzIHRvCisgKiByZW1vdmUuIFRoZSBhcnJheSBzaG91bGQgYmUgdGVybWluYXRlZCBieSBhIE5VTEwgcG9pbnRlci4gUmV0dXJuIC0xCisgKiBvbiBmYWlsdXJlLCBvdGhlcndpc2UgdGhlIG51bWJlciBvZiBlbnRyaWVzIGFjdHVhbGx5IHJlbW92ZWQgKHdoaWNoCisgKiBtaWdodCBldmVuIGJlIDAsIGlmIHRoZXJlIHdoZXJlIG5vIG1hdGNoaW5nIGVudHJpZXMgdG8KKyAqIHJlbW92ZSkuIFxzaW5jZSAwLjkuMTEgKi8KK2ludCBwYV9wcm9wbGlzdF91bnNldF9tYW55KHBhX3Byb3BsaXN0ICpwLCBjb25zdCBjaGFyICogY29uc3Qga2V5c1tdKTsKKworLyoqIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcHJvcGVydHkgbGlzdC4gVGhlIHVzZXIgc2hvdWxkIGFsbG9jYXRlIGEKKyAqIHN0YXRlIHZhcmlhYmxlIG9mIHR5cGUgdm9pZCogYW5kIGluaXRpYWxpemUgaXQgd2l0aCBOVUxMLiBBIHBvaW50ZXIKKyAqIHRvIHRoaXMgdmFyaWFibGUgc2hvdWxkIHRoZW4gYmUgcGFzc2VkIHRvIHBhX3Byb3BsaXN0X2l0ZXJhdGUoKQorICogd2hpY2ggc2hvdWxkIGJlIGNhbGxlZCBpbiBhIGxvb3AgdW50aWwgaXQgcmV0dXJucyBOVUxMIHdoaWNoCisgKiBzaWduaWZpZXMgRU9MLiBUaGUgcHJvcGVydHkgbGlzdCBzaG91bGQgbm90IGJlIG1vZGlmaWVkIGR1cmluZworICogaXRlcmF0aW9uIHRocm91Z2ggdGhlIGxpc3QgLS0gZXhjZXB0IGZvciBkZWxldGluZyB0aGUgY3VycmVudAorICogbG9va2VkIGF0IGVudHJ5LiBPbiBlYWNoIGludm9jYXRpb24gdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUKKyAqIGtleSBzdHJpbmcgZm9yIHRoZSBuZXh0IGVudHJ5LiBUaGUga2V5cyBpbiB0aGUgcHJvcGVydHkgbGlzdCBkbyBub3QKKyAqIGhhdmUgYW55IHBhcnRpY3VsYXIgb3JkZXIuIFxzaW5jZSAwLjkuMTEgKi8KK2NvbnN0IGNoYXIgKnBhX3Byb3BsaXN0X2l0ZXJhdGUocGFfcHJvcGxpc3QgKnAsIHZvaWQgKipzdGF0ZSk7CisKKy8qKiBGb3JtYXQgdGhlIHByb3BlcnR5IGxpc3QgbmljZWx5IGFzIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nLiBUaGlzCisgKiB3b3JrcyB2ZXJ5IG11Y2ggbGlrZSBwYV9wcm9wbGlzdF90b19zdHJpbmdfc2VwKCkgYW5kIHVzZXMgYSBuZXdsaW5lCisgKiBhcyBzZXBhcmF0b3IgYW5kIGFwcGVuZHMgb25lIGZpbmFsIG9uZS4gQ2FsbCBwYV94ZnJlZSgpIG9uIHRoZQorICogcmVzdWx0LiBcc2luY2UgMC45LjExICovCitjaGFyICpwYV9wcm9wbGlzdF90b19zdHJpbmcocGFfcHJvcGxpc3QgKnApOworCisvKiogRm9ybWF0IHRoZSBwcm9wZXJ0eSBsaXN0IG5pY2VseSBhcyBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZyBhbmQKKyAqIGNob29zZSB0aGUgc2VwYXJhdG9yLiBDYWxsIHBhX3hmcmVlKCkgb24gdGhlIHJlc3VsdC4gXHNpbmNlCisgKiAwLjkuMTUgKi8KK2NoYXIgKnBhX3Byb3BsaXN0X3RvX3N0cmluZ19zZXAocGFfcHJvcGxpc3QgKnAsIGNvbnN0IGNoYXIgKnNlcCk7CisKKy8qKiBBbGxvY2F0ZSBhIG5ldyBwcm9wZXJ0eSBsaXN0IGFuZCBhc3NpZ24ga2V5L3ZhbHVlIGZyb20gYSBodW1hbgorICogcmVhZGFibGUgc3RyaW5nLiBcc2luY2UgMC45LjE1ICovCitwYV9wcm9wbGlzdCAqcGFfcHJvcGxpc3RfZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqc3RyKTsKKworLyoqIFJldHVybnMgMSBpZiBhbiBlbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBrZXkgZXhpc3RzIGluIHRoZQorICogcHJvcGVydHkgbGlzdC4gXHNpbmNlIDAuOS4xMSAqLworaW50IHBhX3Byb3BsaXN0X2NvbnRhaW5zKHBhX3Byb3BsaXN0ICpwLCBjb25zdCBjaGFyICprZXkpOworCisvKiogUmVtb3ZlIGFsbCBlbnRyaWVzIGZyb20gdGhlIHByb3BlcnR5IGxpc3Qgb2JqZWN0LiBcc2luY2UgMC45LjExICovCit2b2lkIHBhX3Byb3BsaXN0X2NsZWFyKHBhX3Byb3BsaXN0ICpwKTsKKworLyoqIEFsbG9jYXRlIGEgbmV3IHByb3BlcnR5IGxpc3QgYW5kIGNvcHkgb3ZlciBldmVyeSBzaW5nbGUgZW50cnkgZnJvbQorICogdGhlIHNwZWNpZmljIGxpc3QuIFxzaW5jZSAwLjkuMTEgKi8KK3BhX3Byb3BsaXN0KiBwYV9wcm9wbGlzdF9jb3B5KHBhX3Byb3BsaXN0ICp0KTsKKworLyoqIFJldHVybiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgb24gdGhlIHByb3BlcnR5IGxpc3QuIFxzaW5jZSAwLjkuMTUgKi8KK3Vuc2lnbmVkIHBhX3Byb3BsaXN0X3NpemUocGFfcHJvcGxpc3QgKnQpOworCisvKiogUmV0dXJucyAwIHdoZW4gdGhlIHByb3BsaXN0IGlzIGVtcHR5LCBwb3NpdGl2ZSBvdGhlcndpc2UgXHNpbmNlIDAuOS4xNSAqLworaW50IHBhX3Byb3BsaXN0X2lzZW1wdHkocGFfcHJvcGxpc3QgKnQpOworCisvKiogUmV0dXJuIG5vbi16ZXJvIHdoZW4gYSBhbmQgYiBoYXZlIHRoZSBzYW1lIGtleXMgYW5kIHZhbHVlcy4KKyAqIFxzaW5jZSAwLjkuMTYgKi8KK2ludCBwYV9wcm9wbGlzdF9lcXVhbChwYV9wcm9wbGlzdCAqYSwgcGFfcHJvcGxpc3QgKmIpOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9wdWxzZWF1ZGlvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3B1bHNlYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjcxNzcyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9wdWxzZWF1ZGlvLmgKQEAgLTAsMCArMSwxMTggQEAKKyNpZm5kZWYgZm9vcHVsc2VhdWRpb2hmb28KKyNkZWZpbmUgZm9vcHVsc2VhdWRpb2hmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUKKyAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgIExpY2Vuc2UgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8cHVsc2UvbWFpbmxvb3AtYXBpLmg+CisjaW5jbHVkZSA8cHVsc2Uvc2FtcGxlLmg+CisjaW5jbHVkZSA8cHVsc2UvZm9ybWF0Lmg+CisjaW5jbHVkZSA8cHVsc2UvZGVmLmg+CisjaW5jbHVkZSA8cHVsc2UvY29udGV4dC5oPgorI2luY2x1ZGUgPHB1bHNlL3N0cmVhbS5oPgorI2luY2x1ZGUgPHB1bHNlL2ludHJvc3BlY3QuaD4KKyNpbmNsdWRlIDxwdWxzZS9zdWJzY3JpYmUuaD4KKyNpbmNsdWRlIDxwdWxzZS9zY2FjaGUuaD4KKyNpbmNsdWRlIDxwdWxzZS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cHVsc2UvZXJyb3IuaD4KKyNpbmNsdWRlIDxwdWxzZS9vcGVyYXRpb24uaD4KKyNpbmNsdWRlIDxwdWxzZS9jaGFubmVsbWFwLmg+CisjaW5jbHVkZSA8cHVsc2Uvdm9sdW1lLmg+CisjaW5jbHVkZSA8cHVsc2UveG1hbGxvYy5oPgorI2luY2x1ZGUgPHB1bHNlL3V0ZjguaD4KKyNpbmNsdWRlIDxwdWxzZS90aHJlYWQtbWFpbmxvb3AuaD4KKyNpbmNsdWRlIDxwdWxzZS9tYWlubG9vcC5oPgorI2luY2x1ZGUgPHB1bHNlL21haW5sb29wLXNpZ25hbC5oPgorI2luY2x1ZGUgPHB1bHNlL3V0aWwuaD4KKyNpbmNsdWRlIDxwdWxzZS90aW1ldmFsLmg+CisjaW5jbHVkZSA8cHVsc2UvcHJvcGxpc3QuaD4KKyNpbmNsdWRlIDxwdWxzZS9ydGNsb2NrLmg+CisKKy8qKiBcZmlsZQorICogSW5jbHVkZSBhbGwgbGlicHVsc2UgaGVhZGVyIGZpbGVzIGF0IG9uY2UuIFRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlCisgKiBpbmNsdWRlZDogXHJlZiBtYWlubG9vcC1hcGkuaCwgXHJlZiBzYW1wbGUuaCwgXHJlZiBkZWYuaCwgXHJlZgorICogY29udGV4dC5oLCBccmVmIHN0cmVhbS5oLCBccmVmIGludHJvc3BlY3QuaCwgXHJlZiBzdWJzY3JpYmUuaCwgXHJlZgorICogc2NhY2hlLmgsIFxyZWYgdmVyc2lvbi5oLCBccmVmIGVycm9yLmgsIFxyZWYgY2hhbm5lbG1hcC5oLCBccmVmCisgKiBvcGVyYXRpb24uaCxccmVmIHZvbHVtZS5oLCBccmVmIHhtYWxsb2MuaCwgXHJlZiB1dGY4LmgsIFxyZWYKKyAqIHRocmVhZC1tYWlubG9vcC5oLCBccmVmIG1haW5sb29wLmgsIFxyZWYgdXRpbC5oLCBccmVmIHByb3BsaXN0LmgsCisgKiBccmVmIHRpbWV2YWwuaCwgXHJlZiBydGNsb2NrLmggYW5kIFxyZWYgbWFpbmxvb3Atc2lnbmFsLmggYXQKKyAqIG9uY2UgKi8KKworLyoqIFxtYWlucGFnZQorICoKKyAqIFxzZWN0aW9uIGludHJvX3NlYyBJbnRyb2R1Y3Rpb24KKyAqCisgKiBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgY2xpZW50IEFQSSBmb3IgdGhlIFB1bHNlQXVkaW8gc291bmQKKyAqIHNlcnZlci4gVGhlIEFQSSBjb21lcyBpbiB0d28gZmxhdm91cnMgdG8gYWNjb21tb2RhdGUgZGlmZmVyZW50IHN0eWxlcworICogb2YgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgbmVlZHMgaW4gY29tcGxleGl0eToKKyAqCisgKiBcbGkgVGhlIGNvbXBsZXRlIGJ1dCBzb21ld2hhdCBjb21wbGljYXRlZCB0byB1c2UgYXN5bmNocm9ub3VzIEFQSQorICogXGxpIFRoZSBzaW1wbGlmaWVkLCBlYXN5IHRvIHVzZSwgYnV0IGxpbWl0ZWQgc3luY2hyb25vdXMgQVBJCisgKgorICogQWxsIHN0cmluZ3MgaW4gUHVsc2VBdWRpbyBhcmUgaW4gdGhlIFVURi04IGVuY29kaW5nLCByZWdhcmRsZXNzIG9mIGN1cnJlbnQKKyAqIGxvY2FsZS4gU29tZSBmdW5jdGlvbnMgd2lsbCBmaWx0ZXIgaW52YWxpZCBzZXF1ZW5jZXMgZnJvbSB0aGUgc3RyaW5nLCBzb21lCisgKiB3aWxsIHNpbXBseSBmYWlsLiBUbyBlbnN1cmUgcmVsaWFibGUgYmVoYXZpb3VyLCBtYWtlIHN1cmUgZXZlcnl0aGluZyB5b3UKKyAqIHBhc3MgdG8gdGhlIEFQSSBpcyBhbHJlYWR5IGluIFVURi04LgorCisgKiBcc2VjdGlvbiBzaW1wbGVfc2VjIFNpbXBsZSBBUEkKKyAqCisgKiBVc2UgdGhpcyBpZiB5b3UgZGV2ZWxvcCB5b3VyIHByb2dyYW0gaW4gc3luY2hyb25vdXMgc3R5bGUgYW5kIGp1c3QKKyAqIG5lZWQgYSB3YXkgdG8gcGxheSBvciByZWNvcmQgZGF0YSBvbiB0aGUgc291bmQgc2VydmVyLiBTZWUKKyAqIFxzdWJwYWdlIHNpbXBsZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFxzZWN0aW9uIGFzeW5jX3NlYyBBc3luY2hyb25vdXMgQVBJCisgKgorICogVXNlIHRoaXMgaWYgeW91IGRldmVsb3AgeW91ciBwcm9ncmFtcyBpbiBhc3luY2hyb25vdXMsIGV2ZW50IGxvb3AKKyAqIGJhc2VkIHN0eWxlIG9yIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgYWR2YW5jZWQgZmVhdHVyZXMgb2YgdGhlCisgKiBQdWxzZUF1ZGlvIEFQSS4gQSBndWlkZSBjYW4gYmUgZm91bmQgaW4gXHN1YnBhZ2UgYXN5bmMuCisgKgorICogQnkgdXNpbmcgdGhlIGJ1aWx0LWluIHRocmVhZGVkIG1haW4gbG9vcCwgaXQgaXMgcG9zc2libGUgdG8gYWNoaWV2ZSBhCisgKiBwc2V1ZG8tc3luY2hyb25vdXMgQVBJLCB3aGljaCBjYW4gYmUgdXNlZnVsIGluIHN5bmNocm9ub3VzIGFwcGxpY2F0aW9ucworICogd2hlcmUgdGhlIHNpbXBsZSBBUEkgaXMgaW5zdWZmaWNpZW50LiBTZWUgdGhlIFxyZWYgYXN5bmMgcGFnZSBmb3IKKyAqIGRldGFpbHMuCisgKgorICogXHNlY3Rpb24gdGhyZWFkX3NlYyBUaHJlYWRzCisgKgorICogVGhlIFB1bHNlQXVkaW8gY2xpZW50IGxpYnJhcmllcyBhcmUgbm90IGRlc2lnbmVkIHRvIGJlIGRpcmVjdGx5CisgKiB0aHJlYWQtc2FmZS4gVGhleSBhcmUgaG93ZXZlciBkZXNpZ25lZCB0byBiZSByZWVudHJhbnQgYW5kCisgKiB0aHJlYWRzLWF3YXJlLgorICoKKyAqIFRvIHVzZSB0aGUgbGlicmFyaWVzIGluIGEgdGhyZWFkZWQgZW52aXJvbm1lbnQsIHlvdSBtdXN0IGFzc3VyZSB0aGF0CisgKiBhbGwgb2JqZWN0cyBhcmUgb25seSB1c2VkIGluIG9uZSB0aHJlYWQgYXQgYSB0aW1lLiBOb3JtYWxseSwgdGhpcyBtZWFucworICogdGhhdCBhbGwgb2JqZWN0cyBiZWxvbmdpbmcgdG8gYSBzaW5nbGUgY29udGV4dCBtdXN0IGJlIGFjY2Vzc2VkIGZyb20gdGhlCisgKiBzYW1lIHRocmVhZC4KKyAqCisgKiBUaGUgaW5jbHVkZWQgbWFpbiBsb29wIGltcGxlbWVudGF0aW9uIGlzIGFsc28gbm90IHRocmVhZCBzYWZlLiBUYWtlIGNhcmUKKyAqIHRvIG1ha2Ugc3VyZSBldmVudCBvYmplY3RzIGFyZSBub3QgbWFuaXB1bGF0ZWQgd2hlbiBhbnkgb3RoZXIgY29kZSBpcworICogdXNpbmcgdGhlIG1haW4gbG9vcC4KKyAqCisgKiBcc2VjdGlvbiBwa2djb25maWcgcGtnLWNvbmZpZworICoKKyAqIFRoZSBQdWxzZUF1ZGlvIGxpYnJhcmllcyBwcm92aWRlIHBrZy1jb25maWcgc25pcHBldHMgZm9yIHRoZSBkaWZmZXJlbnQKKyAqIG1vZHVsZXM6CisgKgorICogXGxpIGxpYnB1bHNlIC0gVGhlIGFzeW5jaHJvbm91cyBBUEkgYW5kIHRoZSBpbnRlcm5hbCBtYWluIGxvb3AgaW1wbGVtZW50YXRpb24uCisgKiBcbGkgbGlicHVsc2UtbWFpbmxvb3AtZ2xpYiAtIEdMSUIgMi54IG1haW4gbG9vcCBiaW5kaW5ncy4KKyAqIFxsaSBsaWJwdWxzZS1zaW1wbGUgLSBUaGUgc2ltcGxlIFB1bHNlQXVkaW8gQVBJLgorICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9ydGNsb2NrLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3J0Y2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmEyMGUzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9ydGNsb2NrLmgKQEAgLTAsMCArMSw0MCBAQAorI2lmbmRlZiBmb29ydGNsb2NrZm9vCisjZGVmaW5lIGZvb3J0Y2xvY2tmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDkgTGVubmFydCBQb2V0dGVyaW5nCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlCisgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICBMaWNlbnNlIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisjaW5jbHVkZSA8cHVsc2Uvc2FtcGxlLmg+CisKKy8qKiBcZmlsZQorICogIE1vbm90b25pYyBjbG9jayB1dGlsaXRpZXMuICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogUmV0dXJuIHRoZSBjdXJyZW50IG1vbm90b25pYyBzeXN0ZW0gdGltZSBpbiB1c2VjLCBpZiBzdWNoIGEgY2xvY2sKKyAqIGlzIGF2YWlsYWJsZS4gIElmIGl0IGlzIG5vdCBhdmFpbGFibGUgdGhpcyB3aWxsIHJldHVybiB0aGUKKyAqIHdhbGxjbG9jayB0aW1lIGluc3RlYWQuICBcc2luY2UgMC45LjE2ICovCitwYV91c2VjX3QgcGFfcnRjbG9ja19ub3codm9pZCk7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3NhbXBsZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9zYW1wbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjU1NTllCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9zYW1wbGUuaApAQCAtMCwwICsxLDMzOSBAQAorI2lmbmRlZiBmb29zYW1wbGVoZm9vCisjZGVmaW5lIGZvb3NhbXBsZWhmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCisjaW5jbHVkZSA8cHVsc2UvZ2NjbWFjcm8uaD4KKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL3ZlcnNpb24uaD4KKworLyoqIFxwYWdlIHNhbXBsZSBTYW1wbGUgRm9ybWF0IFNwZWNpZmljYXRpb25zCisgKgorICogXHNlY3Rpb24gb3ZlcnZfc2VjIE92ZXJ2aWV3CisgKgorICogUHVsc2VBdWRpbyBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nIGEgbXVsdGl0dWRlIG9mIHNhbXBsZSBmb3JtYXRzLCByYXRlcworICogYW5kIGNoYW5uZWxzLCB0cmFuc3BhcmVudGx5IGNvbnZlcnRpbmcgYW5kIG1peGluZyB0aGVtIGFzIG5lZWRlZC4KKyAqCisgKiBcc2VjdGlvbiBmb3JtYXRfc2VjIFNhbXBsZSBGb3JtYXQKKyAqCisgKiBQdWxzZUF1ZGlvIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgc2FtcGxlIGZvcm1hdHM6CisgKgorICogXGxpIFBBX1NBTVBMRV9VOCAtIFVuc2lnbmVkIDggYml0IGludGVnZXIgUENNLgorICogXGxpIFBBX1NBTVBMRV9TMTZMRSAtIFNpZ25lZCAxNiBpbnRlZ2VyIGJpdCBQQ00sIGxpdHRsZSBlbmRpYW4uCisgKiBcbGkgUEFfU0FNUExFX1MxNkJFIC0gU2lnbmVkIDE2IGludGVnZXIgYml0IFBDTSwgYmlnIGVuZGlhbi4KKyAqIFxsaSBQQV9TQU1QTEVfRkxPQVQzMkxFIC0gMzIgYml0IElFRUUgZmxvYXRpbmcgcG9pbnQgUENNLCBsaXR0bGUgZW5kaWFuLgorICogXGxpIFBBX1NBTVBMRV9GTE9BVDMyQkUgLSAzMiBiaXQgSUVFRSBmbG9hdGluZyBwb2ludCBQQ00sIGJpZyBlbmRpYW4uCisgKiBcbGkgUEFfU0FNUExFX0FMQVcgLSA4IGJpdCBhLUxhdy4KKyAqIFxsaSBQQV9TQU1QTEVfVUxBVyAtIDggYml0IG11LUxhdy4KKyAqIFxsaSBQQV9TQU1QTEVfUzMyTEUgLSBTaWduZWQgMzIgYml0IGludGVnZXIgUENNLCBsaXR0bGUgZW5kaWFuLgorICogXGxpIFBBX1NBTVBMRV9TMzJCRSAtIFNpZ25lZCAzMiBiaXQgaW50ZWdlciBQQ00sIGJpZyBlbmRpYW4uCisgKiBcbGkgUEFfU0FNUExFX1MyNExFIC0gU2lnbmVkIDI0IGJpdCBpbnRlZ2VyIFBDTSBwYWNrZWQsIGxpdHRsZSBlbmRpYW4uCisgKiBcbGkgUEFfU0FNUExFX1MyNEJFIC0gU2lnbmVkIDI0IGJpdCBpbnRlZ2VyIFBDTSBwYWNrZWQsIGJpZyBlbmRpYW4uCisgKiBcbGkgUEFfU0FNUExFX1MyNF8zMkxFIC0gU2lnbmVkIDI0IGJpdCBpbnRlZ2VyIFBDTSBpbiBMU0Igb2YgMzIgYml0IHdvcmRzLCBsaXR0bGUgZW5kaWFuLgorICogXGxpIFBBX1NBTVBMRV9TMjRfMzJCRSAtIFNpZ25lZCAyNCBiaXQgaW50ZWdlciBQQ00gaW4gTFNCIG9mIDMyIGJpdCB3b3JkcywgYmlnIGVuZGlhbi4KKyAqCisgKiBUaGUgZmxvYXRpbmcgcG9pbnQgc2FtcGxlIGZvcm1hdHMgaGF2ZSB0aGUgcmFuZ2UgZnJvbSAtMS4wIHRvIDEuMC4KKyAqCisgKiBUaGUgc2FtcGxlIGZvcm1hdHMgdGhhdCBhcmUgc2Vuc2l0aXZlIHRvIGVuZGlhbm5lc3MgaGF2ZSBjb252ZW5pZW5jZQorICogbWFjcm9zIGZvciBuYXRpdmUgZW5kaWFuIChORSksIGFuZCByZXZlcnNlIGVuZGlhbiAoUkUpLgorICoKKyAqIFxzZWN0aW9uIHJhdGVfc2VjIFNhbXBsZSBSYXRlcworICoKKyAqIFB1bHNlQXVkaW8gc3VwcG9ydHMgYW55IHNhbXBsZSByYXRlIGJldHdlZW4gMSBIeiBhbmQgMTkyMDAwIEh6LiBUaGVyZSBpcyBubworICogcG9pbnQgdHJ5aW5nIHRvIGV4Y2VlZCB0aGUgc2FtcGxlIHJhdGUgb2YgdGhlIG91dHB1dCBkZXZpY2UgdGhvdWdoIGFzIHRoZQorICogc2lnbmFsIHdpbGwgb25seSBnZXQgZG93bnNhbXBsZWQsIGNvbnN1bWluZyBDUFUgb24gdGhlIG1hY2hpbmUgcnVubmluZyB0aGUKKyAqIHNlcnZlci4KKyAqCisgKiBcc2VjdGlvbiBjaGFuX3NlYyBDaGFubmVscworICoKKyAqIFB1bHNlQXVkaW8gc3VwcG9ydHMgdXAgdG8gMzIgaW5kaXZpZHVhbCBjaGFubmVscy4gVGhlIG9yZGVyIG9mIHRoZQorICogY2hhbm5lbHMgaXMgdXAgdG8gdGhlIGFwcGxpY2F0aW9uLCBidXQgdGhleSBtdXN0IGJlIGNvbnRpbnVvdXMuIFRvIG1hcAorICogY2hhbm5lbHMgdG8gc3BlYWtlcnMsIHNlZSBccmVmIGNoYW5uZWxtYXAuCisgKgorICogXHNlY3Rpb24gY2FsY19zZWMgQ2FsY3VsYXRpb25zCisgKgorICogVGhlIFB1bHNlQXVkaW8gbGlicmFyeSBjb250YWlucyBhIG51bWJlciBvZiBjb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gZG8KKyAqIGNhbGN1bGF0aW9ucyBvbiBzYW1wbGUgZm9ybWF0czoKKyAqCisgKiBcbGkgcGFfYnl0ZXNfcGVyX3NlY29uZCgpIC0gVGhlIG51bWJlciBvZiBieXRlcyBvbmUgc2Vjb25kIG9mIGF1ZGlvIHdpbGwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlIGdpdmVuIGEgc2FtcGxlIGZvcm1hdC4KKyAqIFxsaSBwYV9mcmFtZV9zaXplKCkgLSBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIG9uZSBmcmFtZSAoaS5lLiBvbmUgc2V0IG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcywgb25lIGZvciBlYWNoIGNoYW5uZWwpLgorICogXGxpIHBhX3NhbXBsZV9zaXplKCkgLSBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIG9uZSBzYW1wbGUuCisgKiBcbGkgcGFfYnl0ZXNfdG9fdXNlYygpIC0gQ2FsY3VsYXRlIHRoZSB0aW1lIGl0IHdvdWxkIHRha2UgdG8gcGxheSBhIGJ1ZmZlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGEgY2VydGFpbiBzaXplLgorICoKKyAqIFxzZWN0aW9uIHV0aWxfc2VjIENvbnZlbmllbmNlIEZ1bmN0aW9ucworICoKKyAqIFRoZSBsaWJyYXJ5IGFsc28gY29udGFpbnMgYSBjb3VwbGUgb2Ygb3RoZXIgY29udmVuaWVuY2UgZnVuY3Rpb25zOgorICoKKyAqIFxsaSBwYV9zYW1wbGVfc3BlY192YWxpZCgpIC0gVGVzdHMgaWYgYSBzYW1wbGUgZm9ybWF0IHNwZWNpZmljYXRpb24gaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQuCisgKiBcbGkgcGFfc2FtcGxlX3NwZWNfZXF1YWwoKSAtIFRlc3RzIGlmIHRoZSBzYW1wbGUgZm9ybWF0IHNwZWNpZmljYXRpb25zIGFyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGljYWwuCisgKiBcbGkgcGFfc2FtcGxlX2Zvcm1hdF90b19zdHJpbmcoKSAtIFJldHVybiBhIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgYQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUgZm9ybWF0LgorICogXGxpIHBhX3BhcnNlX3NhbXBsZV9mb3JtYXQoKSAtIFBhcnNlIGEgdGV4dCBzdHJpbmcgaW50byBhIHNhbXBsZSBmb3JtYXQuCisgKiBcbGkgcGFfc2FtcGxlX3NwZWNfc25wcmludCgpIC0gQ3JlYXRlIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiBhIGNvbXBsZXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZSBmb3JtYXQgc3BlY2lmaWNhdGlvbi4KKyAqIFxsaSBwYV9ieXRlc19zbnByaW50KCkgLSBQcmV0dHkgcHJpbnQgYSBieXRlIHZhbHVlIChlLmcuIDIuNSBNaUIpLgorICovCisKKy8qKiBcZmlsZQorICogQ29uc3RhbnRzIGFuZCByb3V0aW5lcyBmb3Igc2FtcGxlIHR5cGUgaGFuZGxpbmcKKyAqCisgKiBTZWUgYWxzbyBcc3VicGFnZSBzYW1wbGUKKyAqLworCitQQV9DX0RFQ0xfQkVHSU4KKworI2lmICFkZWZpbmVkKFdPUkRTX0JJR0VORElBTikKKyNpZiBkZWZpbmVkKF9fQllURV9PUkRFUikKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisjZGVmaW5lIFdPUkRTX0JJR0VORElBTgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKiogTWF4aW11bSBudW1iZXIgb2YgYWxsb3dlZCBjaGFubmVscyAqLworI2RlZmluZSBQQV9DSEFOTkVMU19NQVggMzJVCisKKy8qKiBNYXhpbXVtIGFsbG93ZWQgc2FtcGxlIHJhdGUgKi8KKyNkZWZpbmUgUEFfUkFURV9NQVggKDQ4MDAwVSo0VSkKKworLyoqIFNhbXBsZSBmb3JtYXQgKi8KK3R5cGVkZWYgZW51bSBwYV9zYW1wbGVfZm9ybWF0IHsKKyAgICBQQV9TQU1QTEVfVTgsCisgICAgLyoqPCBVbnNpZ25lZCA4IEJpdCBQQ00gKi8KKworICAgIFBBX1NBTVBMRV9BTEFXLAorICAgIC8qKjwgOCBCaXQgYS1MYXcgKi8KKworICAgIFBBX1NBTVBMRV9VTEFXLAorICAgIC8qKjwgOCBCaXQgbXUtTGF3ICovCisKKyAgICBQQV9TQU1QTEVfUzE2TEUsCisgICAgLyoqPCBTaWduZWQgMTYgQml0IFBDTSwgbGl0dGxlIGVuZGlhbiAoUEMpICovCisKKyAgICBQQV9TQU1QTEVfUzE2QkUsCisgICAgLyoqPCBTaWduZWQgMTYgQml0IFBDTSwgYmlnIGVuZGlhbiAqLworCisgICAgUEFfU0FNUExFX0ZMT0FUMzJMRSwKKyAgICAvKio8IDMyIEJpdCBJRUVFIGZsb2F0aW5nIHBvaW50LCBsaXR0bGUgZW5kaWFuIChQQyksIHJhbmdlIC0xLjAgdG8gMS4wICovCisKKyAgICBQQV9TQU1QTEVfRkxPQVQzMkJFLAorICAgIC8qKjwgMzIgQml0IElFRUUgZmxvYXRpbmcgcG9pbnQsIGJpZyBlbmRpYW4sIHJhbmdlIC0xLjAgdG8gMS4wICovCisKKyAgICBQQV9TQU1QTEVfUzMyTEUsCisgICAgLyoqPCBTaWduZWQgMzIgQml0IFBDTSwgbGl0dGxlIGVuZGlhbiAoUEMpICovCisKKyAgICBQQV9TQU1QTEVfUzMyQkUsCisgICAgLyoqPCBTaWduZWQgMzIgQml0IFBDTSwgYmlnIGVuZGlhbiAqLworCisgICAgUEFfU0FNUExFX1MyNExFLAorICAgIC8qKjwgU2lnbmVkIDI0IEJpdCBQQ00gcGFja2VkLCBsaXR0bGUgZW5kaWFuIChQQykuIFxzaW5jZSAwLjkuMTUgKi8KKworICAgIFBBX1NBTVBMRV9TMjRCRSwKKyAgICAvKio8IFNpZ25lZCAyNCBCaXQgUENNIHBhY2tlZCwgYmlnIGVuZGlhbi4gXHNpbmNlIDAuOS4xNSAqLworCisgICAgUEFfU0FNUExFX1MyNF8zMkxFLAorICAgIC8qKjwgU2lnbmVkIDI0IEJpdCBQQ00gaW4gTFNCIG9mIDMyIEJpdCB3b3JkcywgbGl0dGxlIGVuZGlhbiAoUEMpLiBcc2luY2UgMC45LjE1ICovCisKKyAgICBQQV9TQU1QTEVfUzI0XzMyQkUsCisgICAgLyoqPCBTaWduZWQgMjQgQml0IFBDTSBpbiBMU0Igb2YgMzIgQml0IHdvcmRzLCBiaWcgZW5kaWFuLiBcc2luY2UgMC45LjE1ICovCisKKyAgICBQQV9TQU1QTEVfTUFYLAorICAgIC8qKjwgVXBwZXIgbGltaXQgb2YgdmFsaWQgc2FtcGxlIHR5cGVzICovCisKKyAgICBQQV9TQU1QTEVfSU5WQUxJRCA9IC0xCisgICAgLyoqPCBBbiBpbnZhbGlkIHZhbHVlICovCit9IHBhX3NhbXBsZV9mb3JtYXRfdDsKKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorLyoqIFNpZ25lZCAxNiBCaXQgUENNLCBuYXRpdmUgZW5kaWFuICovCisjZGVmaW5lIFBBX1NBTVBMRV9TMTZORSBQQV9TQU1QTEVfUzE2QkUKKy8qKiAzMiBCaXQgSUVFRSBmbG9hdGluZyBwb2ludCwgbmF0aXZlIGVuZGlhbiAqLworI2RlZmluZSBQQV9TQU1QTEVfRkxPQVQzMk5FIFBBX1NBTVBMRV9GTE9BVDMyQkUKKy8qKiBTaWduZWQgMzIgQml0IFBDTSwgbmF0aXZlIGVuZGlhbiAqLworI2RlZmluZSBQQV9TQU1QTEVfUzMyTkUgUEFfU0FNUExFX1MzMkJFCisvKiogU2lnbmVkIDI0IEJpdCBQQ00gcGFja2VkLCBuYXRpdmUgZW5kaWFuLiBcc2luY2UgMC45LjE1ICovCisjZGVmaW5lIFBBX1NBTVBMRV9TMjRORSBQQV9TQU1QTEVfUzI0QkUKKy8qKiBTaWduZWQgMjQgQml0IFBDTSBpbiBMU0Igb2YgMzIgQml0IHdvcmRzLCBuYXRpdmUgZW5kaWFuLiBcc2luY2UgMC45LjE1ICovCisjZGVmaW5lIFBBX1NBTVBMRV9TMjRfMzJORSBQQV9TQU1QTEVfUzI0XzMyQkUKKworLyoqIFNpZ25lZCAxNiBCaXQgUENNIHJldmVyc2UgZW5kaWFuICovCisjZGVmaW5lIFBBX1NBTVBMRV9TMTZSRSBQQV9TQU1QTEVfUzE2TEUKKy8qKiAzMiBCaXQgSUVFRSBmbG9hdGluZyBwb2ludCwgcmV2ZXJzZSBlbmRpYW4gKi8KKyNkZWZpbmUgUEFfU0FNUExFX0ZMT0FUMzJSRSBQQV9TQU1QTEVfRkxPQVQzMkxFCisvKiogU2lnbmVkIDMyIEJpdCBQQ00sIHJldmVyc2UgZW5kaWFuICovCisjZGVmaW5lIFBBX1NBTVBMRV9TMzJSRSBQQV9TQU1QTEVfUzMyTEUKKy8qKiBTaWduZWQgMjQgQml0IFBDTSwgcGFja2VkIHJldmVyc2UgZW5kaWFuLiBcc2luY2UgMC45LjE1ICovCisjZGVmaW5lIFBBX1NBTVBMRV9TMjRSRSBQQV9TQU1QTEVfUzI0TEUKKy8qKiBTaWduZWQgMjQgQml0IFBDTSwgaW4gTFNCIG9mIDMyIEJpdCB3b3JkcywgcmV2ZXJzZSBlbmRpYW4uIFxzaW5jZSAwLjkuMTUgKi8KKyNkZWZpbmUgUEFfU0FNUExFX1MyNF8zMlJFIFBBX1NBTVBMRV9TMjRfMzJMRQorI2Vsc2UKKy8qKiBTaWduZWQgMTYgQml0IFBDTSwgbmF0aXZlIGVuZGlhbiAqLworI2RlZmluZSBQQV9TQU1QTEVfUzE2TkUgUEFfU0FNUExFX1MxNkxFCisvKiogMzIgQml0IElFRUUgZmxvYXRpbmcgcG9pbnQsIG5hdGl2ZSBlbmRpYW4gKi8KKyNkZWZpbmUgUEFfU0FNUExFX0ZMT0FUMzJORSBQQV9TQU1QTEVfRkxPQVQzMkxFCisvKiogU2lnbmVkIDMyIEJpdCBQQ00sIG5hdGl2ZSBlbmRpYW4gKi8KKyNkZWZpbmUgUEFfU0FNUExFX1MzMk5FIFBBX1NBTVBMRV9TMzJMRQorLyoqIFNpZ25lZCAyNCBCaXQgUENNIHBhY2tlZCwgbmF0aXZlIGVuZGlhbi4gXHNpbmNlIDAuOS4xNSAqLworI2RlZmluZSBQQV9TQU1QTEVfUzI0TkUgUEFfU0FNUExFX1MyNExFCisvKiogU2lnbmVkIDI0IEJpdCBQQ00gaW4gTFNCIG9mIDMyIEJpdCB3b3JkcywgbmF0aXZlIGVuZGlhbi4gXHNpbmNlIDAuOS4xNSAqLworI2RlZmluZSBQQV9TQU1QTEVfUzI0XzMyTkUgUEFfU0FNUExFX1MyNF8zMkxFCisKKy8qKiBTaWduZWQgMTYgQml0IFBDTSwgcmV2ZXJzZSBlbmRpYW4gKi8KKyNkZWZpbmUgUEFfU0FNUExFX1MxNlJFIFBBX1NBTVBMRV9TMTZCRQorLyoqIDMyIEJpdCBJRUVFIGZsb2F0aW5nIHBvaW50LCByZXZlcnNlIGVuZGlhbiAqLworI2RlZmluZSBQQV9TQU1QTEVfRkxPQVQzMlJFIFBBX1NBTVBMRV9GTE9BVDMyQkUKKy8qKiBTaWduZWQgMzIgQml0IFBDTSwgcmV2ZXJzZSBlbmRpYW4gKi8KKyNkZWZpbmUgUEFfU0FNUExFX1MzMlJFIFBBX1NBTVBMRV9TMzJCRQorLyoqIFNpZ25lZCAyNCBCaXQgUENNLCBwYWNrZWQgcmV2ZXJzZSBlbmRpYW4uIFxzaW5jZSAwLjkuMTUgKi8KKyNkZWZpbmUgUEFfU0FNUExFX1MyNFJFIFBBX1NBTVBMRV9TMjRCRQorLyoqIFNpZ25lZCAyNCBCaXQgUENNLCBpbiBMU0Igb2YgMzIgQml0IHdvcmRzLCByZXZlcnNlIGVuZGlhbi4gXHNpbmNlIDAuOS4xNSAqLworI2RlZmluZSBQQV9TQU1QTEVfUzI0XzMyUkUgUEFfU0FNUExFX1MyNF8zMkJFCisjZW5kaWYKKworLyoqIEEgU2hvcnRjdXQgZm9yIFBBX1NBTVBMRV9GTE9BVDMyTkUgKi8KKyNkZWZpbmUgUEFfU0FNUExFX0ZMT0FUMzIgUEFfU0FNUExFX0ZMT0FUMzJORQorCisvKiogXGNvbmQgZnVsbGRvY3MgKi8KKy8qIEFsbG93IGNsaWVudHMgdG8gY2hlY2sgd2l0aCAjaWZkZWYgZm9yIHRoZXNlIHNhbXBsZSBmb3JtYXRzICovCisjZGVmaW5lIFBBX1NBTVBMRV9VOCBQQV9TQU1QTEVfVTgKKyNkZWZpbmUgUEFfU0FNUExFX0FMQVcgUEFfU0FNUExFX0FMQVcKKyNkZWZpbmUgUEFfU0FNUExFX1VMQVcgUEFfU0FNUExFX1VMQVcKKyNkZWZpbmUgUEFfU0FNUExFX1MxNkxFIFBBX1NBTVBMRV9TMTZMRQorI2RlZmluZSBQQV9TQU1QTEVfUzE2QkUgUEFfU0FNUExFX1MxNkJFCisjZGVmaW5lIFBBX1NBTVBMRV9GTE9BVDMyTEUgUEFfU0FNUExFX0ZMT0FUMzJMRQorI2RlZmluZSBQQV9TQU1QTEVfRkxPQVQzMkJFIFBBX1NBTVBMRV9GTE9BVDMyQkUKKyNkZWZpbmUgUEFfU0FNUExFX1MzMkxFIFBBX1NBTVBMRV9TMzJMRQorI2RlZmluZSBQQV9TQU1QTEVfUzMyQkUgUEFfU0FNUExFX1MzMkJFCisjZGVmaW5lIFBBX1NBTVBMRV9TMjRMRSBQQV9TQU1QTEVfUzI0TEUKKyNkZWZpbmUgUEFfU0FNUExFX1MyNEJFIFBBX1NBTVBMRV9TMjRCRQorI2RlZmluZSBQQV9TQU1QTEVfUzI0XzMyTEUgUEFfU0FNUExFX1MyNF8zMkxFCisjZGVmaW5lIFBBX1NBTVBMRV9TMjRfMzJCRSBQQV9TQU1QTEVfUzI0XzMyQkUKKy8qKiBcZW5kY29uZCAqLworCisvKiogQSBzYW1wbGUgZm9ybWF0IGFuZCBhdHRyaWJ1dGUgc3BlY2lmaWNhdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfc2FtcGxlX3NwZWMgeworICAgIHBhX3NhbXBsZV9mb3JtYXRfdCBmb3JtYXQ7CisgICAgLyoqPCBUaGUgc2FtcGxlIGZvcm1hdCAqLworCisgICAgdWludDMyX3QgcmF0ZTsKKyAgICAvKio8IFRoZSBzYW1wbGUgcmF0ZS4gKGUuZy4gNDQxMDApICovCisKKyAgICB1aW50OF90IGNoYW5uZWxzOworICAgIC8qKjwgQXVkaW8gY2hhbm5lbHMuICgxIGZvciBtb25vLCAyIGZvciBzdGVyZW8sIC4uLikgKi8KK30gcGFfc2FtcGxlX3NwZWM7CisKKy8qKiBUeXBlIGZvciB1c2VjIHNwZWNpZmljYXRpb25zICh1bnNpZ25lZCkuIEFsd2F5cyA2NCBiaXQuICovCit0eXBlZGVmIHVpbnQ2NF90IHBhX3VzZWNfdDsKKworLyoqIFJldHVybiB0aGUgYW1vdW50IG9mIGJ5dGVzIHBsYXliYWNrIG9mIGEgc2Vjb25kIG9mIGF1ZGlvIHdpdGggdGhlIHNwZWNpZmllZCBzYW1wbGUgdHlwZSB0YWtlcyAqLworc2l6ZV90IHBhX2J5dGVzX3Blcl9zZWNvbmQoY29uc3QgcGFfc2FtcGxlX3NwZWMgKnNwZWMpIFBBX0dDQ19QVVJFOworCisvKiogUmV0dXJuIHRoZSBzaXplIG9mIGEgZnJhbWUgd2l0aCB0aGUgc3BlY2lmaWMgc2FtcGxlIHR5cGUgKi8KK3NpemVfdCBwYV9mcmFtZV9zaXplKGNvbnN0IHBhX3NhbXBsZV9zcGVjICpzcGVjKSBQQV9HQ0NfUFVSRTsKKworLyoqIFJldHVybiB0aGUgc2l6ZSBvZiBhIHNhbXBsZSB3aXRoIHRoZSBzcGVjaWZpYyBzYW1wbGUgdHlwZSAqLworc2l6ZV90IHBhX3NhbXBsZV9zaXplKGNvbnN0IHBhX3NhbXBsZV9zcGVjICpzcGVjKSBQQV9HQ0NfUFVSRTsKKworLyoqIFNpbWlsYXIgdG8gcGFfc2FtcGxlX3NpemUoKSBidXQgdGFrZSBhIHNhbXBsZSBmb3JtYXQgaW5zdGVhZCBvZiBhCisgKiBmdWxsIHNhbXBsZSBzcGVjLiBcc2luY2UgMC45LjE1ICovCitzaXplX3QgcGFfc2FtcGxlX3NpemVfb2ZfZm9ybWF0KHBhX3NhbXBsZV9mb3JtYXRfdCBmKSBQQV9HQ0NfUFVSRTsKKworLyoqIENhbGN1bGF0ZSB0aGUgdGltZSB0aGUgc3BlY2lmaWVkIGJ5dGVzIHRha2UgdG8gcGxheSB3aXRoIHRoZQorICogc3BlY2lmaWVkIHNhbXBsZSB0eXBlLiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYWx3YXlzIGJlIHJvdW5kZWQKKyAqIGRvd24gZm9yIG5vbi1pbnRlZ3JhbCByZXR1cm4gdmFsdWVzLiAqLworcGFfdXNlY190IHBhX2J5dGVzX3RvX3VzZWModWludDY0X3QgbGVuZ3RoLCBjb25zdCBwYV9zYW1wbGVfc3BlYyAqc3BlYykgUEFfR0NDX1BVUkU7CisKKy8qKiBDYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpZWQKKyAqIHRpbWUuIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBhbHdheXMgYmUgcm91bmRlZCBkb3duIGZvciBub24taW50ZWdyYWwKKyAqIHJldHVybiB2YWx1ZXMuIFxzaW5jZSAwLjkgKi8KK3NpemVfdCBwYV91c2VjX3RvX2J5dGVzKHBhX3VzZWNfdCB0LCBjb25zdCBwYV9zYW1wbGVfc3BlYyAqc3BlYykgUEFfR0NDX1BVUkU7CisKKy8qKiBJbml0aWFsaXplIHRoZSBzcGVjaWZpZWQgc2FtcGxlIHNwZWMgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8KKyAqIGl0LiBUaGUgc2FtcGxlIHNwZWMgd2lsbCBoYXZlIGEgZGVmaW5lZCBzdGF0ZSBidXQKKyAqIHBhX3NhbXBsZV9zcGVjX3ZhbGlkKCkgd2lsbCBmYWlsIGZvciBpdC4gXHNpbmNlIDAuOS4xMyAqLworcGFfc2FtcGxlX3NwZWMqIHBhX3NhbXBsZV9zcGVjX2luaXQocGFfc2FtcGxlX3NwZWMgKnNwZWMpOworCisvKiogUmV0dXJuIG5vbi16ZXJvIHdoZW4gdGhlIHNhbXBsZSB0eXBlIHNwZWNpZmljYXRpb24gaXMgdmFsaWQgKi8KK2ludCBwYV9zYW1wbGVfc3BlY192YWxpZChjb25zdCBwYV9zYW1wbGVfc3BlYyAqc3BlYykgUEFfR0NDX1BVUkU7CisKKy8qKiBSZXR1cm4gbm9uLXplcm8gd2hlbiB0aGUgdHdvIHNhbXBsZSB0eXBlIHNwZWNpZmljYXRpb25zIG1hdGNoICovCitpbnQgcGFfc2FtcGxlX3NwZWNfZXF1YWwoY29uc3QgcGFfc2FtcGxlX3NwZWMqYSwgY29uc3QgcGFfc2FtcGxlX3NwZWMqYikgUEFfR0NDX1BVUkU7CisKKy8qKiBSZXR1cm4gYSBkZXNjcmlwdGl2ZSBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgc2FtcGxlIGZvcm1hdC4gXHNpbmNlIDAuOCAqLworY29uc3QgY2hhciAqcGFfc2FtcGxlX2Zvcm1hdF90b19zdHJpbmcocGFfc2FtcGxlX2Zvcm1hdF90IGYpIFBBX0dDQ19QVVJFOworCisvKiogUGFyc2UgYSBzYW1wbGUgZm9ybWF0IHRleHQuIEludmVyc2Ugb2YgcGFfc2FtcGxlX2Zvcm1hdF90b19zdHJpbmcoKSAqLworcGFfc2FtcGxlX2Zvcm1hdF90IHBhX3BhcnNlX3NhbXBsZV9mb3JtYXQoY29uc3QgY2hhciAqZm9ybWF0KSBQQV9HQ0NfUFVSRTsKKworLyoqIE1heGltdW0gcmVxdWlyZWQgc3RyaW5nIGxlbmd0aCBmb3IKKyAqIHBhX3NhbXBsZV9zcGVjX3NucHJpbnQoKS4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHZhbHVlIGNhbiBjaGFuZ2UKKyAqIHdpdGggYW55IHJlbGVhc2Ugd2l0aG91dCB3YXJuaW5nIGFuZCB3aXRob3V0IGJlaW5nIGNvbnNpZGVyZWQgQVBJCisgKiBvciBBQkkgYnJlYWthZ2UuIFlvdSBzaG91bGQgbm90IHVzZSB0aGlzIGRlZmluaXRpb24gYW55d2hlcmUgd2hlcmUKKyAqIGl0IG1pZ2h0IGJlY29tZSBwYXJ0IG9mIGFuIEFCSS4gKi8KKyNkZWZpbmUgUEFfU0FNUExFX1NQRUNfU05QUklOVF9NQVggMzIKKworLyoqIFByZXR0eSBwcmludCBhIHNhbXBsZSB0eXBlIHNwZWNpZmljYXRpb24gdG8gYSBzdHJpbmcgKi8KK2NoYXIqIHBhX3NhbXBsZV9zcGVjX3NucHJpbnQoY2hhciAqcywgc2l6ZV90IGwsIGNvbnN0IHBhX3NhbXBsZV9zcGVjICpzcGVjKTsKKworLyoqIE1heGltdW0gcmVxdWlyZWQgc3RyaW5nIGxlbmd0aCBmb3IgcGFfYnl0ZXNfc25wcmludCgpLiBQbGVhc2Ugbm90ZQorICogdGhhdCB0aGlzIHZhbHVlIGNhbiBjaGFuZ2Ugd2l0aCBhbnkgcmVsZWFzZSB3aXRob3V0IHdhcm5pbmcgYW5kCisgKiB3aXRob3V0IGJlaW5nIGNvbnNpZGVyZWQgQVBJIG9yIEFCSSBicmVha2FnZS4gWW91IHNob3VsZCBub3QgdXNlCisgKiB0aGlzIGRlZmluaXRpb24gYW55d2hlcmUgd2hlcmUgaXQgbWlnaHQgYmVjb21lIHBhcnQgb2YgYW4KKyAqIEFCSS4gXHNpbmNlIDAuOS4xNiAqLworI2RlZmluZSBQQV9CWVRFU19TTlBSSU5UX01BWCAxMQorCisvKiogUHJldHR5IHByaW50IGEgYnl0ZSBzaXplIHZhbHVlLiAoaS5lLiAiMi41IE1pQiIpICovCitjaGFyKiBwYV9ieXRlc19zbnByaW50KGNoYXIgKnMsIHNpemVfdCBsLCB1bnNpZ25lZCB2KTsKKworLyoqIFJldHVybiAxIHdoZW4gdGhlIHNwZWNpZmllZCBmb3JtYXQgaXMgbGl0dGxlIGVuZGlhbiwgcmV0dXJuIC0xCisgKiB3aGVuIGVuZGlhbm5lc3MgZG9lcyBub3QgYXBwbHkgdG8gdGhpcyBmb3JtYXQuIFxzaW5jZSAwLjkuMTYgKi8KK2ludCBwYV9zYW1wbGVfZm9ybWF0X2lzX2xlKHBhX3NhbXBsZV9mb3JtYXRfdCBmKSBQQV9HQ0NfUFVSRTsKKworLyoqIFJldHVybiAxIHdoZW4gdGhlIHNwZWNpZmllZCBmb3JtYXQgaXMgYmlnIGVuZGlhbiwgcmV0dXJuIC0xIHdoZW4KKyAqIGVuZGlhbm5lc3MgZG9lcyBub3QgYXBwbHkgdG8gdGhpcyBmb3JtYXQuIFxzaW5jZSAwLjkuMTYgKi8KK2ludCBwYV9zYW1wbGVfZm9ybWF0X2lzX2JlKHBhX3NhbXBsZV9mb3JtYXRfdCBmKSBQQV9HQ0NfUFVSRTsKKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorI2RlZmluZSBwYV9zYW1wbGVfZm9ybWF0X2lzX25lKGYpIHBhX3NhbXBsZV9mb3JtYXRfaXNfYmUoZikKKyNkZWZpbmUgcGFfc2FtcGxlX2Zvcm1hdF9pc19yZShmKSBwYV9zYW1wbGVfZm9ybWF0X2lzX2xlKGYpCisjZWxzZQorLyoqIFJldHVybiAxIHdoZW4gdGhlIHNwZWNpZmllZCBmb3JtYXQgaXMgbmF0aXZlIGVuZGlhbiwgcmV0dXJuIC0xCisgKiB3aGVuIGVuZGlhbm5lc3MgZG9lcyBub3QgYXBwbHkgdG8gdGhpcyBmb3JtYXQuIFxzaW5jZSAwLjkuMTYgKi8KKyNkZWZpbmUgcGFfc2FtcGxlX2Zvcm1hdF9pc19uZShmKSBwYV9zYW1wbGVfZm9ybWF0X2lzX2xlKGYpCisvKiogUmV0dXJuIDEgd2hlbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCBpcyByZXZlcnNlIGVuZGlhbiwgcmV0dXJuIC0xCisgKiB3aGVuIGVuZGlhbm5lc3MgZG9lcyBub3QgYXBwbHkgdG8gdGhpcyBmb3JtYXQuIFxzaW5jZSAwLjkuMTYgKi8KKyNkZWZpbmUgcGFfc2FtcGxlX2Zvcm1hdF9pc19yZShmKSBwYV9zYW1wbGVfZm9ybWF0X2lzX2JlKGYpCisjZW5kaWYKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvc2NhY2hlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3NjYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZmNiZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3NjYWNoZS5oCkBAIC0wLDAgKzEsMTI2IEBACisjaWZuZGVmIGZvb3NjYWNoZWhmb28KKyNkZWZpbmUgZm9vc2NhY2hlaGZvbworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLAorICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8cHVsc2UvY29udGV4dC5oPgorI2luY2x1ZGUgPHB1bHNlL3N0cmVhbS5oPgorI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisjaW5jbHVkZSA8cHVsc2UvdmVyc2lvbi5oPgorCisvKiogXHBhZ2Ugc2NhY2hlIFNhbXBsZSBDYWNoZQorICoKKyAqIFxzZWN0aW9uIG92ZXJ2X3NlYyBPdmVydmlldworICoKKyAqIFRoZSBzYW1wbGUgY2FjaGUgcHJvdmlkZXMgYSBzaW1wbGUgd2F5IG9mIG92ZXJjb21pbmcgaGlnaCBuZXR3b3JrIGxhdGVuY2llcworICogYW5kIHJlZHVjaW5nIGJhbmR3aWR0aC4gSW5zdGVhZCBvZiBzdHJlYW1pbmcgYSBzb3VuZCBwcmVjaXNlbHkgd2hlbiBpdAorICogc2hvdWxkIGJlIHBsYXllZCwgaXQgaXMgc3RvcmVkIG9uIHRoZSBzZXJ2ZXIgYW5kIG9ubHkgdGhlIGNvbW1hbmQgdG8gc3RhcnQKKyAqIHBsYXlpbmcgaXQgbmVlZHMgdG8gYmUgc2VudC4KKyAqCisgKiBcc2VjdGlvbiBjcmVhdGVfc2VjIENyZWF0aW9uCisgKgorICogVG8gY3JlYXRlIGEgc2FtcGxlLCB0aGUgbm9ybWFsIHN0cmVhbSBBUEkgaXMgdXNlZCAoc2VlIFxyZWYgc3RyZWFtcykuIFRoZQorICogZnVuY3Rpb24gcGFfc3RyZWFtX2Nvbm5lY3RfdXBsb2FkKCkgd2lsbCBtYWtlIHN1cmUgdGhlIHN0cmVhbSBpcyBzdG9yZWQgYXMKKyAqIGEgc2FtcGxlIG9uIHRoZSBzZXJ2ZXIuCisgKgorICogVG8gY29tcGxldGUgdGhlIHVwbG9hZCwgcGFfc3RyZWFtX2ZpbmlzaF91cGxvYWQoKSBpcyBjYWxsZWQgYW5kIHRoZSBzYW1wbGUKKyAqIHdpbGwgcmVjZWl2ZSB0aGUgc2FtZSBuYW1lIGFzIHRoZSBzdHJlYW0uIElmIHRoZSB1cGxvYWQgc2hvdWxkIGJlIGFib3J0ZWQsCisgKiBzaW1wbHkgY2FsbCBwYV9zdHJlYW1fZGlzY29ubmVjdCgpLgorICoKKyAqIFxzZWN0aW9uIHBsYXlfc2VjIFBsYXlpbmcgc2FtcGxlcworICoKKyAqIFRvIHBsYXkgYmFjayBhIHNhbXBsZSwgc2ltcGx5IGNhbGwgcGFfY29udGV4dF9wbGF5X3NhbXBsZSgpOgorICoKKyAqIFxjb2RlCisgKiBwYV9vcGVyYXRpb24gKm87CisgKgorICogbyA9IHBhX2NvbnRleHRfcGxheV9zYW1wbGUobXlfY29udGV4dCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYW1wbGUyIiwgICAgICAgLy8gTmFtZSBvZiBteSBzYW1wbGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgLy8gVXNlIGRlZmF1bHQgc2luaworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFfVk9MVU1FX05PUk0sICAvLyBGdWxsIHZvbHVtZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAvLyBEb24ndCBuZWVkIGEgY2FsbGJhY2sKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgKiBpZiAobykKKyAqICAgICBwYV9vcGVyYXRpb25fdW5yZWYobyk7CisgKiBcZW5kY29kZQorICoKKyAqIFxzZWN0aW9uIHJlbV9zZWMgUmVtb3Zpbmcgc2FtcGxlcworICoKKyAqIFdoZW4gYSBzYW1wbGUgaXMgbm8gbG9uZ2VyIG5lZWRlZCwgaXQgc2hvdWxkIGJlIHJlbW92ZWQgb24gdGhlIHNlcnZlciB0bworICogc2F2ZSByZXNvdXJjZXMuIFRoZSBzYW1wbGUgaXMgZGVsZXRlZCB1c2luZyBwYV9jb250ZXh0X3JlbW92ZV9zYW1wbGUoKS4KKyAqLworCisvKiogXGZpbGUKKyAqIEFsbCBzYW1wbGUgY2FjaGUgcmVsYXRlZCByb3V0aW5lcworICoKKyAqIFNlZSBhbHNvIFxzdWJwYWdlIHNjYWNoZQorICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogQ2FsbGJhY2sgcHJvdG90eXBlIGZvciBwYV9jb250ZXh0X3BsYXlfc2FtcGxlX3dpdGhfcHJvcGxpc3QoKS4gVGhlCisgKiBpZHggdmFsdWUgaXMgdGhlIGluZGV4IG9mIHRoZSBzaW5rIGlucHV0IG9iamVjdCwgb3IKKyAqIFBBX0lOVkFMSURfSU5ERVggb24gZmFpbHVyZS4gXHNpbmNlIDAuOS4xMSAqLwordHlwZWRlZiB2b2lkICgqcGFfY29udGV4dF9wbGF5X3NhbXBsZV9jYl90KShwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIE1ha2UgdGhpcyBzdHJlYW0gYSBzYW1wbGUgdXBsb2FkIHN0cmVhbSAqLworaW50IHBhX3N0cmVhbV9jb25uZWN0X3VwbG9hZChwYV9zdHJlYW0gKnMsIHNpemVfdCBsZW5ndGgpOworCisvKiogRmluaXNoIHRoZSBzYW1wbGUgdXBsb2FkLCB0aGUgc3RyZWFtIG5hbWUgd2lsbCBiZWNvbWUgdGhlIHNhbXBsZQorICogbmFtZS4gWW91IGNhbmNlbCBhIHNhbXBsZSB1cGxvYWQgYnkgaXNzdWluZworICogcGFfc3RyZWFtX2Rpc2Nvbm5lY3QoKSAqLworaW50IHBhX3N0cmVhbV9maW5pc2hfdXBsb2FkKHBhX3N0cmVhbSAqcyk7CisKKy8qKiBSZW1vdmUgYSBzYW1wbGUgZnJvbSB0aGUgc2FtcGxlIGNhY2hlLiBSZXR1cm5zIGFuIG9wZXJhdGlvbiBvYmplY3Qgd2hpY2ggbWF5IGJlIHVzZWQgdG8gY2FuY2VsIHRoZSBvcGVyYXRpb24gd2hpbGUgaXQgaXMgcnVubmluZyAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3JlbW92ZV9zYW1wbGUocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqbmFtZSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFBsYXkgYSBzYW1wbGUgZnJvbSB0aGUgc2FtcGxlIGNhY2hlIHRvIHRoZSBzcGVjaWZpZWQgZGV2aWNlLiBJZgorICogdGhlIGxhdHRlciBpcyBOVUxMIHVzZSB0aGUgZGVmYXVsdCBzaW5rLiBSZXR1cm5zIGFuIG9wZXJhdGlvbgorICogb2JqZWN0ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfcGxheV9zYW1wbGUoCisgICAgICAgIHBhX2NvbnRleHQgKmMgICAgICAgICAgICAgICAvKio8IENvbnRleHQgKi8sCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgICAgICAgICAgICAvKio8IE5hbWUgb2YgdGhlIHNhbXBsZSB0byBwbGF5ICovLAorICAgICAgICBjb25zdCBjaGFyICpkZXYgICAgICAgICAgICAgLyoqPCBTaW5rIHRvIHBsYXkgdGhpcyBzYW1wbGUgb24gKi8sCisgICAgICAgIHBhX3ZvbHVtZV90IHZvbHVtZSAgICAgICAgICAvKio8IFZvbHVtZSB0byBwbGF5IHRoaXMgc2FtcGxlIHdpdGguIFN0YXJ0aW5nIHdpdGggMC45LjE1IHlvdSBtYXkgcGFzcyBoZXJlIFBBX1ZPTFVNRV9JTlZBTElEIHdoaWNoIHdpbGwgbGVhdmUgdGhlIGRlY2lzaW9uIGFib3V0IHRoZSB2b2x1bWUgdG8gdGhlIHNlcnZlciBzaWRlIHdoaWNoIGlzIGEgZ29vZCBpZGVhLiAqLyAsCisgICAgICAgIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiICAvKio8IENhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciBzdWNjZXNzZnVsbHkgc3RhcnRpbmcgcGxheWJhY2ssIG9yIE5VTEwgKi8sCisgICAgICAgIHZvaWQgKnVzZXJkYXRhICAgICAgICAgICAgICAvKio8IFVzZXJkYXRhIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrICovKTsKKworLyoqIFBsYXkgYSBzYW1wbGUgZnJvbSB0aGUgc2FtcGxlIGNhY2hlIHRvIHRoZSBzcGVjaWZpZWQgZGV2aWNlLAorICogYWxsb3dpbmcgc3BlY2lmaWNhdGlvbiBvZiBhIHByb3BlcnR5IGxpc3QgZm9yIHRoZSBwbGF5YmFjaworICogc3RyZWFtLiBJZiB0aGUgbGF0dGVyIGlzIE5VTEwgdXNlIHRoZSBkZWZhdWx0IHNpbmsuIFJldHVybnMgYW4KKyAqIG9wZXJhdGlvbiBvYmplY3QuIFxzaW5jZSAwLjkuMTEgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9wbGF5X3NhbXBsZV93aXRoX3Byb3BsaXN0KAorICAgICAgICBwYV9jb250ZXh0ICpjICAgICAgICAgICAgICAgICAgIC8qKjwgQ29udGV4dCAqLywKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSAgICAgICAgICAgICAgICAvKio8IE5hbWUgb2YgdGhlIHNhbXBsZSB0byBwbGF5ICovLAorICAgICAgICBjb25zdCBjaGFyICpkZXYgICAgICAgICAgICAgICAgIC8qKjwgU2luayB0byBwbGF5IHRoaXMgc2FtcGxlIG9uICovLAorICAgICAgICBwYV92b2x1bWVfdCB2b2x1bWUgICAgICAgICAgICAgIC8qKjwgVm9sdW1lIHRvIHBsYXkgdGhpcyBzYW1wbGUgd2l0aC4gU3RhcnRpbmcgd2l0aCAwLjkuMTUgeW91IG1heSBwYXNzIGhlcmUgUEFfVk9MVU1FX0lOVkFMSUQgd2hpY2ggd2lsbCBsZWF2ZSB0aGUgZGVjaXNpb24gYWJvdXQgdGhlIHZvbHVtZSB0byB0aGUgc2VydmVyIHNpZGUgd2hpY2ggaXMgYSBnb29kIGlkZWEuICAqLyAsCisgICAgICAgIHBhX3Byb3BsaXN0ICpwcm9wbGlzdCAgICAgICAgICAgLyoqPCBQcm9wZXJ0eSBsaXN0IGZvciB0aGlzIHNvdW5kLiBUaGUgcHJvcGVydHkgbGlzdCBvZiB0aGUgY2FjaGVkIGVudHJ5IHdpbGwgYmUgbWVyZ2VkIGludG8gdGhpcyBwcm9wZXJ0eSBsaXN0ICovLAorICAgICAgICBwYV9jb250ZXh0X3BsYXlfc2FtcGxlX2NiX3QgY2IgIC8qKjwgQ2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIHN1Y2Nlc3NmdWxseSBzdGFydGluZyBwbGF5YmFjaywgb3IgTlVMTCAqLywKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEgICAgICAgICAgICAgICAgICAvKio8IFVzZXJkYXRhIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrICovKTsKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvc2ltcGxlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3NpbXBsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYmVkNWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3NpbXBsZS5oCkBAIC0wLDAgKzEsMTUxIEBACisjaWZuZGVmIGZvb3NpbXBsZWhmb28KKyNkZWZpbmUgZm9vc2ltcGxlaGZvbworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLAorICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8cHVsc2Uvc2FtcGxlLmg+CisjaW5jbHVkZSA8cHVsc2UvY2hhbm5lbG1hcC5oPgorI2luY2x1ZGUgPHB1bHNlL2RlZi5oPgorI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisjaW5jbHVkZSA8cHVsc2UvdmVyc2lvbi5oPgorCisvKiogXHBhZ2Ugc2ltcGxlIFNpbXBsZSBBUEkKKyAqCisgKiBcc2VjdGlvbiBvdmVydl9zZWMgT3ZlcnZpZXcKKyAqCisgKiBUaGUgc2ltcGxlIEFQSSBpcyBkZXNpZ25lZCBmb3IgYXBwbGljYXRpb25zIHdpdGggdmVyeSBiYXNpYyBzb3VuZAorICogcGxheWJhY2sgb3IgY2FwdHVyZSBuZWVkcy4gSXQgY2FuIG9ubHkgc3VwcG9ydCBhIHNpbmdsZSBzdHJlYW0gcGVyCisgKiBjb25uZWN0aW9uIGFuZCBoYXMgbm8gaGFuZGxpbmcgb2YgY29tcGxleCBmZWF0dXJlcyBsaWtlIGV2ZW50cywgY2hhbm5lbAorICogbWFwcGluZ3MgYW5kIHZvbHVtZSBjb250cm9sLiBJdCBpcywgaG93ZXZlciwgdmVyeSBzaW1wbGUgdG8gdXNlIGFuZAorICogcXVpdGUgc3VmZmljaWVudCBmb3IgbWFueSBwcm9ncmFtcy4KKyAqCisgKiBcc2VjdGlvbiBjb25uX3NlYyBDb25uZWN0aW5nCisgKgorICogVGhlIGZpcnN0IHN0ZXAgYmVmb3JlIHVzaW5nIHRoZSBzb3VuZCBzeXN0ZW0gaXMgdG8gY29ubmVjdCB0byB0aGUKKyAqIHNlcnZlci4gVGhpcyBpcyBub3JtYWxseSBkb25lIHRoaXMgd2F5OgorICoKKyAqIFxjb2RlCisgKiBwYV9zaW1wbGUgKnM7CisgKiBwYV9zYW1wbGVfc3BlYyBzczsKKyAqCisgKiBzcy5mb3JtYXQgPSBQQV9TQU1QTEVfUzE2TkU7CisgKiBzcy5jaGFubmVscyA9IDI7CisgKiBzcy5yYXRlID0gNDQxMDA7CisgKgorICogcyA9IHBhX3NpbXBsZV9uZXcoTlVMTCwgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgc2VydmVyLgorICogICAgICAgICAgICAgICAgICAgIkZvb2FwcCIsICAgICAgICAgICAvLyBPdXIgYXBwbGljYXRpb24ncyBuYW1lLgorICogICAgICAgICAgICAgICAgICAgUEFfU1RSRUFNX1BMQVlCQUNLLAorICogICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgZGV2aWNlLgorICogICAgICAgICAgICAgICAgICAgIk11c2ljIiwgICAgICAgICAgICAvLyBEZXNjcmlwdGlvbiBvZiBvdXIgc3RyZWFtLgorICogICAgICAgICAgICAgICAgICAgJnNzLCAgICAgICAgICAgICAgICAvLyBPdXIgc2FtcGxlIGZvcm1hdC4KKyAqICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgLy8gVXNlIGRlZmF1bHQgY2hhbm5lbCBtYXAKKyAqICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgLy8gVXNlIGRlZmF1bHQgYnVmZmVyaW5nIGF0dHJpYnV0ZXMuCisgKiAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgIC8vIElnbm9yZSBlcnJvciBjb2RlLgorICogICAgICAgICAgICAgICAgICAgKTsKKyAqIFxlbmRjb2RlCisgKgorICogQXQgdGhpcyBwb2ludCBhIGNvbm5lY3RlZCBvYmplY3QgaXMgcmV0dXJuZWQsIG9yIE5VTEwgaWYgdGhlcmUgd2FzIGEKKyAqIHByb2JsZW0gY29ubmVjdGluZy4KKyAqCisgKiBcc2VjdGlvbiB0cmFuc2Zlcl9zZWMgVHJhbnNmZXJyaW5nIGRhdGEKKyAqCisgKiBPbmNlIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIHRvIHRoZSBzZXJ2ZXIsIGRhdGEgY2FuIHN0YXJ0IGZsb3dpbmcuCisgKiBVc2luZyB0aGUgY29ubmVjdGlvbiBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIG5vcm1hbCByZWFkKCkgYW5kIHdyaXRlKCkKKyAqIHN5c3RlbSBjYWxscy4gVGhlIG1haW4gZGlmZmVyZW5jZSBpcyB0aGF0IHRoZXkncmUgY2FsbCBwYV9zaW1wbGVfcmVhZCgpCisgKiBhbmQgcGFfc2ltcGxlX3dyaXRlKCkuIE5vdGUgdGhhdCB0aGVzZSBvcGVyYXRpb25zIGFsd2F5cyBibG9jay4KKyAqCisgKiBcc2VjdGlvbiBjdHJsX3NlYyBCdWZmZXIgY29udHJvbAorICoKKyAqIElmIGEgcGxheWJhY2sgc3RyZWFtIGlzIHVzZWQgdGhlbiBhIGZldyBvdGhlciBvcGVyYXRpb25zIGFyZSBhdmFpbGFibGU6CisgKgorICogXGxpIHBhX3NpbXBsZV9kcmFpbigpIC0gV2lsbCB3YWl0IGZvciBhbGwgc2VudCBkYXRhIHRvIGZpbmlzaCBwbGF5aW5nLgorICogXGxpIHBhX3NpbXBsZV9mbHVzaCgpIC0gV2lsbCB0aHJvdyBhd2F5IGFsbCBkYXRhIGN1cnJlbnRseSBpbiBidWZmZXJzLgorICogXGxpIHBhX3NpbXBsZV9nZXRfbGF0ZW5jeSgpIC0gV2lsbCByZXR1cm4gdGhlIHRvdGFsIGxhdGVuY3kgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwbGF5YmFjayBwaXBlbGluZS4KKyAqCisgKiBcc2VjdGlvbiBjbGVhbnVwX3NlYyBDbGVhbnVwCisgKgorICogT25jZSBwbGF5YmFjayBvciBjYXB0dXJlIGlzIGNvbXBsZXRlLCB0aGUgY29ubmVjdGlvbiBzaG91bGQgYmUgY2xvc2VkCisgKiBhbmQgcmVzb3VyY2VzIGZyZWVkLiBUaGlzIGlzIGRvbmUgdGhyb3VnaDoKKyAqCisgKiBcY29kZQorICogcGFfc2ltcGxlX2ZyZWUocyk7CisgKiBcZW5kY29kZQorICovCisKKy8qKiBcZmlsZQorICogQSBzaW1wbGUgYnV0IGxpbWl0ZWQgc3luY2hyb25vdXMgcGxheWJhY2sgYW5kIHJlY29yZGluZworICogQVBJLiBUaGlzIGlzIGEgc3luY2hyb25vdXMsIHNpbXBsaWZpZWQgd3JhcHBlciBhcm91bmQgdGhlIHN0YW5kYXJkCisgKiBhc3luY2hyb25vdXMgQVBJLgorICoKKyAqIFNlZSBhbHNvIFxzdWJwYWdlIHNpbXBsZQorICovCisKKy8qKiBcZXhhbXBsZSBwYWNhdC1zaW1wbGUuYworICogQSBzaW1wbGUgcGxheWJhY2sgdG9vbCB1c2luZyB0aGUgc2ltcGxlIEFQSSAqLworCisvKiogXGV4YW1wbGUgcGFyZWMtc2ltcGxlLmMKKyAqIEEgc2ltcGxlIHJlY29yZGluZyB0b29sIHVzaW5nIHRoZSBzaW1wbGUgQVBJICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogXHN0cnVjdCBwYV9zaW1wbGUKKyAqIEFuIG9wYXF1ZSBzaW1wbGUgY29ubmVjdGlvbiBvYmplY3QgKi8KK3R5cGVkZWYgc3RydWN0IHBhX3NpbXBsZSBwYV9zaW1wbGU7CisKKy8qKiBDcmVhdGUgYSBuZXcgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyICovCitwYV9zaW1wbGUqIHBhX3NpbXBsZV9uZXcoCisgICAgY29uc3QgY2hhciAqc2VydmVyLCAgICAgICAgICAgICAgICAgLyoqPCBTZXJ2ZXIgbmFtZSwgb3IgTlVMTCBmb3IgZGVmYXVsdCAqLworICAgIGNvbnN0IGNoYXIgKm5hbWUsICAgICAgICAgICAgICAgICAgIC8qKjwgQSBkZXNjcmlwdGl2ZSBuYW1lIGZvciB0aGlzIGNsaWVudCAoYXBwbGljYXRpb24gbmFtZSwgLi4uKSAqLworICAgIHBhX3N0cmVhbV9kaXJlY3Rpb25fdCBkaXIsICAgICAgICAgIC8qKjwgT3BlbiB0aGlzIHN0cmVhbSBmb3IgcmVjb3JkaW5nIG9yIHBsYXliYWNrPyAqLworICAgIGNvbnN0IGNoYXIgKmRldiwgICAgICAgICAgICAgICAgICAgIC8qKjwgU2luayAocmVzcC4gc291cmNlKSBuYW1lLCBvciBOVUxMIGZvciBkZWZhdWx0ICovCisgICAgY29uc3QgY2hhciAqc3RyZWFtX25hbWUsICAgICAgICAgICAgLyoqPCBBIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoaXMgY2xpZW50IChhcHBsaWNhdGlvbiBuYW1lLCBzb25nIHRpdGxlLCAuLi4pICovCisgICAgY29uc3QgcGFfc2FtcGxlX3NwZWMgKnNzLCAgICAgICAgICAgLyoqPCBUaGUgc2FtcGxlIHR5cGUgdG8gdXNlICovCisgICAgY29uc3QgcGFfY2hhbm5lbF9tYXAgKm1hcCwgICAgICAgICAgLyoqPCBUaGUgY2hhbm5lbCBtYXAgdG8gdXNlLCBvciBOVUxMIGZvciBkZWZhdWx0ICovCisgICAgY29uc3QgcGFfYnVmZmVyX2F0dHIgKmF0dHIsICAgICAgICAgLyoqPCBCdWZmZXJpbmcgYXR0cmlidXRlcywgb3IgTlVMTCBmb3IgZGVmYXVsdCAqLworICAgIGludCAqZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQSBwb2ludGVyIHdoZXJlIHRoZSBlcnJvciBjb2RlIGlzIHN0b3JlZCB3aGVuIHRoZSByb3V0aW5lIHJldHVybnMgTlVMTC4gSXQgaXMgT0sgdG8gcGFzcyBOVUxMIGhlcmUuICovCisgICAgKTsKKworLyoqIENsb3NlIGFuZCBmcmVlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIuIFRoZSBjb25uZWN0aW9uIG9iamVjdHMgYmVjb21lcyBpbnZhbGlkIHdoZW4gdGhpcyBpcyBjYWxsZWQuICovCit2b2lkIHBhX3NpbXBsZV9mcmVlKHBhX3NpbXBsZSAqcyk7CisKKy8qKiBXcml0ZSBzb21lIGRhdGEgdG8gdGhlIHNlcnZlciAqLworaW50IHBhX3NpbXBsZV93cml0ZShwYV9zaW1wbGUgKnMsIGNvbnN0IHZvaWQqZGF0YSwgc2l6ZV90IGJ5dGVzLCBpbnQgKmVycm9yKTsKKworLyoqIFdhaXQgdW50aWwgYWxsIGRhdGEgYWxyZWFkeSB3cml0dGVuIGlzIHBsYXllZCBieSB0aGUgZGFlbW9uICovCitpbnQgcGFfc2ltcGxlX2RyYWluKHBhX3NpbXBsZSAqcywgaW50ICplcnJvcik7CisKKy8qKiBSZWFkIHNvbWUgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIgKi8KK2ludCBwYV9zaW1wbGVfcmVhZChwYV9zaW1wbGUgKnMsIHZvaWQqZGF0YSwgc2l6ZV90IGJ5dGVzLCBpbnQgKmVycm9yKTsKKworLyoqIFJldHVybiB0aGUgcGxheWJhY2sgbGF0ZW5jeS4gKi8KK3BhX3VzZWNfdCBwYV9zaW1wbGVfZ2V0X2xhdGVuY3kocGFfc2ltcGxlICpzLCBpbnQgKmVycm9yKTsKKworLyoqIEZsdXNoIHRoZSBwbGF5YmFjayBidWZmZXIuICBUaGlzIGRpc2NhcmRzIGFueSBhdWRpbyBpbiB0aGUgYnVmZmVyLiAqLworaW50IHBhX3NpbXBsZV9mbHVzaChwYV9zaW1wbGUgKnMsIGludCAqZXJyb3IpOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9zdHJlYW0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRhMWQ0OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvc3RyZWFtLmgKQEAgLTAsMCArMSw3NzQgQEAKKyNpZm5kZWYgZm9vc3RyZWFtaGZvbworI2RlZmluZSBmb29zdHJlYW1oZm9vCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwNiBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxwdWxzZS9zYW1wbGUuaD4KKyNpbmNsdWRlIDxwdWxzZS9mb3JtYXQuaD4KKyNpbmNsdWRlIDxwdWxzZS9jaGFubmVsbWFwLmg+CisjaW5jbHVkZSA8cHVsc2Uvdm9sdW1lLmg+CisjaW5jbHVkZSA8cHVsc2UvZGVmLmg+CisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKyNpbmNsdWRlIDxwdWxzZS9vcGVyYXRpb24uaD4KKyNpbmNsdWRlIDxwdWxzZS9jb250ZXh0Lmg+CisjaW5jbHVkZSA8cHVsc2UvcHJvcGxpc3QuaD4KKworLyoqIFxwYWdlIHN0cmVhbXMgQXVkaW8gU3RyZWFtcworICoKKyAqIFxzZWN0aW9uIG92ZXJ2X3NlYyBPdmVydmlldworICoKKyAqIEF1ZGlvIHN0cmVhbXMgZm9ybSB0aGUgY2VudHJhbCBmdW5jdGlvbmFsaXR5IG9mIHRoZSBzb3VuZCBzZXJ2ZXIuIERhdGEgaXMKKyAqIHJvdXRlZCwgY29udmVydGVkIGFuZCBtaXhlZCBmcm9tIHNldmVyYWwgc291cmNlcyBiZWZvcmUgaXQgaXMgcGFzc2VkIGFsb25nCisgKiB0byBhIGZpbmFsIG91dHB1dC4gQ3VycmVudGx5LCB0aGVyZSBhcmUgdGhyZWUgZm9ybXMgb2YgYXVkaW8gc3RyZWFtczoKKyAqCisgKiBcbGkgUGxheWJhY2sgc3RyZWFtcyAtIERhdGEgZmxvd3MgZnJvbSB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2ZXIuCisgKiBcbGkgUmVjb3JkIHN0cmVhbXMgLSBEYXRhIGZsb3dzIGZyb20gdGhlIHNlcnZlciB0byB0aGUgY2xpZW50LgorICogXGxpIFVwbG9hZCBzdHJlYW1zIC0gU2ltaWxhciB0byBwbGF5YmFjayBzdHJlYW1zLCBidXQgdGhlIGRhdGEgaXMgc3RvcmVkIGluCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgc2FtcGxlIGNhY2hlLiBTZWUgXHJlZiBzY2FjaGUgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgIGFib3V0IGNvbnRyb2xsaW5nIHRoZSBzYW1wbGUgY2FjaGUuCisgKgorICogXHNlY3Rpb24gY3JlYXRlX3NlYyBDcmVhdGluZworICoKKyAqIFRvIGFjY2VzcyBhIHN0cmVhbSwgYSBwYV9zdHJlYW0gb2JqZWN0IG11c3QgYmUgY3JlYXRlZCB1c2luZworICogcGFfc3RyZWFtX25ldygpLiBBdCB0aGlzIHBvaW50IHRoZSBhdWRpbyBzYW1wbGUgZm9ybWF0IGFuZCBtYXBwaW5nIG9mCisgKiBjaGFubmVscyBtdXN0IGJlIHNwZWNpZmllZC4gU2VlIFxyZWYgc2FtcGxlIGFuZCBccmVmIGNoYW5uZWxtYXAgZm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIGFib3V0IHRob3NlIHN0cnVjdHVyZXMuCisgKgorICogVGhpcyBmaXJzdCBzdGVwIHdpbGwgb25seSBjcmVhdGUgYSBjbGllbnQtc2lkZSBvYmplY3QsIHJlcHJlc2VudGluZyB0aGUKKyAqIHN0cmVhbS4gVG8gdXNlIHRoZSBzdHJlYW0sIGEgc2VydmVyLXNpZGUgb2JqZWN0IG11c3QgYmUgY3JlYXRlZCBhbmQKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9jYWwgb2JqZWN0LiBEZXBlbmRpbmcgb24gd2hpY2ggdHlwZSBvZiBzdHJlYW0gaXMKKyAqIGRlc2lyZWQsIGEgZGlmZmVyZW50IGZ1bmN0aW9uIGlzIG5lZWRlZDoKKyAqCisgKiBcbGkgUGxheWJhY2sgc3RyZWFtIC0gcGFfc3RyZWFtX2Nvbm5lY3RfcGxheWJhY2soKQorICogXGxpIFJlY29yZCBzdHJlYW0gLSBwYV9zdHJlYW1fY29ubmVjdF9yZWNvcmQoKQorICogXGxpIFVwbG9hZCBzdHJlYW0gLSBwYV9zdHJlYW1fY29ubmVjdF91cGxvYWQoKSAoc2VlIFxyZWYgc2NhY2hlKQorICoKKyAqIFNpbWlsYXIgdG8gaG93IGNvbm5lY3Rpb25zIGFyZSBkb25lIGluIGNvbnRleHRzLCBjb25uZWN0aW5nIGEgc3RyZWFtIHdpbGwKKyAqIG5vdCBnZW5lcmF0ZSBhIHBhX29wZXJhdGlvbiBvYmplY3QuIEFsc28gbGlrZSBjb250ZXh0cywgdGhlIGFwcGxpY2F0aW9uCisgKiBzaG91bGQgcmVnaXN0ZXIgYSBzdGF0ZSBjaGFuZ2UgY2FsbGJhY2ssIHVzaW5nCisgKiBwYV9zdHJlYW1fc2V0X3N0YXRlX2NhbGxiYWNrKCksIGFuZCB3YWl0IGZvciB0aGUgc3RyZWFtIHRvIGVudGVyIGFuIGFjdGl2ZQorICogc3RhdGUuCisgKgorICogXHN1YnNlY3Rpb24gYnVmYXR0cl9zdWJzZWMgQnVmZmVyIEF0dHJpYnV0ZXMKKyAqCisgKiBQbGF5YmFjayBhbmQgcmVjb3JkIHN0cmVhbXMgYWx3YXlzIGhhdmUgYSBzZXJ2ZXItc2lkZSBidWZmZXIgYXMKKyAqIHBhcnQgb2YgdGhlIGRhdGEgZmxvdy4gIFRoZSBzaXplIG9mIHRoaXMgYnVmZmVyIG5lZWRzIHRvIGJlIGNob3NlbgorICogaW4gYSBjb21wcm9taXNlIGJldHdlZW4gbG93IGxhdGVuY3kgYW5kIHNlbnNpdGl2aXR5IGZvciBidWZmZXIKKyAqIG92ZXJmbG93cy91bmRlcnJ1bnMuCisgKgorICogVGhlIGJ1ZmZlciBtZXRyaWNzIG1heSBiZSBjb250cm9sbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gVGhleSBhcmUKKyAqIGRlc2NyaWJlZCB3aXRoIGEgcGFfYnVmZmVyX2F0dHIgc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIGEgbnVtYmVyCisgKiBvZiBmaWVsZHM6CisgKgorICogXGxpIG1heGxlbmd0aCAtIFRoZSBhYnNvbHV0ZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZQorICogICAgICAgICAgICAgICAgIHN0b3JlZCBpbiB0aGUgYnVmZmVyLiBJZiB0aGlzIHZhbHVlIGlzIGV4Y2VlZGVkCisgKiAgICAgICAgICAgICAgICAgdGhlbiBkYXRhIHdpbGwgYmUgbG9zdC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gcGFzcworICogICAgICAgICAgICAgICAgICh1aW50MzJfdCkgLTEgaGVyZSB3aGljaCB3aWxsIGNhdXNlIHRoZSBzZXJ2ZXIgdG8KKyAqICAgICAgICAgICAgICAgICBmaWxsIGluIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlLgorICoKKyAqIFxsaSB0bGVuZ3RoIC0gVGhlIHRhcmdldCBmaWxsIGxldmVsIG9mIHRoZSBwbGF5YmFjayBidWZmZXIuIFRoZQorICogICAgICAgICAgICAgICBzZXJ2ZXIgd2lsbCBvbmx5IHNlbmQgcmVxdWVzdHMgZm9yIG1vcmUgZGF0YSBhcyBsb25nCisgKiAgICAgICAgICAgICAgIGFzIHRoZSBidWZmZXIgaGFzIGxlc3MgdGhhbiB0aGlzIG51bWJlciBvZiBieXRlcyBvZgorICogICAgICAgICAgICAgICBkYXRhLiBJZiB5b3UgcGFzcyAodWludDMyX3QpIC0xICh3aGljaCBpcworICogICAgICAgICAgICAgICByZWNvbW1lbmRlZCkgaGVyZSB0aGUgc2VydmVyIHdpbGwgY2hvb3NlIHRoZSBsb25nZXN0CisgKiAgICAgICAgICAgICAgIHRhcmdldCBidWZmZXIgZmlsbCBsZXZlbCBwb3NzaWJsZSB0byBtaW5pbWl6ZSB0aGUKKyAqICAgICAgICAgICAgICAgbnVtYmVyIG9mIG5lY2Vzc2FyeSB3YWtldXBzIGFuZCBtYXhpbWl6ZSBkcm9wLW91dAorICogICAgICAgICAgICAgICBzYWZldHkuIFRoaXMgY2FuIGV4Y2VlZCAycyBvZiBidWZmZXJpbmcuIEZvcgorICogICAgICAgICAgICAgICBsb3ctbGF0ZW5jeSBhcHBsaWNhdGlvbnMgb3IgYXBwbGljYXRpb25zIHdoZXJlCisgKiAgICAgICAgICAgICAgIGxhdGVuY3kgbWF0dGVycyB5b3Ugc2hvdWxkIHBhc3MgYSBwcm9wZXIgdmFsdWUgaGVyZS4KKyAqCisgKiBcbGkgcHJlYnVmIC0gTnVtYmVyIG9mIGJ5dGVzIHRoYXQgbmVlZCB0byBiZSBpbiB0aGUgYnVmZmVyIGJlZm9yZQorICogICAgICAgICAgICAgIHBsYXliYWNrIHdpbGwgY29tbWVuY2UuIFN0YXJ0IG9mIHBsYXliYWNrIGNhbiBiZQorICogICAgICAgICAgICAgIGZvcmNlZCB1c2luZyBwYV9zdHJlYW1fdHJpZ2dlcigpIGV2ZW4gdGhvdWdoIHRoZQorICogICAgICAgICAgICAgIHByZWJ1ZmZlciBzaXplIGhhc24ndCBiZWVuIHJlYWNoZWQuIElmIGEgYnVmZmVyCisgKiAgICAgICAgICAgICAgdW5kZXJydW4gb2NjdXJzLCB0aGlzIHByZWJ1ZmZlcmluZyB3aWxsIGJlIGFnYWluCisgKiAgICAgICAgICAgICAgZW5hYmxlZC4gSWYgdGhlIHBsYXliYWNrIHNoYWxsIG5ldmVyIHN0b3AgaW4gY2FzZSBvZiBhCisgKiAgICAgICAgICAgICAgYnVmZmVyIHVuZGVycnVuLCB0aGlzIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gMC4gSW4KKyAqICAgICAgICAgICAgICB0aGF0IGNhc2UgdGhlIHJlYWQgaW5kZXggb2YgdGhlIG91dHB1dCBidWZmZXIKKyAqICAgICAgICAgICAgICBvdmVydGFrZXMgdGhlIHdyaXRlIGluZGV4LCBhbmQgaGVuY2UgdGhlIGZpbGwgbGV2ZWwgb2YKKyAqICAgICAgICAgICAgICB0aGUgYnVmZmVyIGlzIG5lZ2F0aXZlLiBJZiB5b3UgcGFzcyAodWludDMyX3QpIC0xIGhlcmUKKyAqICAgICAgICAgICAgICAod2hpY2ggaXMgcmVjb21tZW5kZWQpIHRoZSBzZXJ2ZXIgd2lsbCBjaG9vc2UgdGhlIHNhbWUKKyAqICAgICAgICAgICAgICB2YWx1ZSBhcyB0bGVuZ3RoIGhlcmUuCisgKgorICogXGxpIG1pbnJlcSAtIE1pbmltdW0gZnJlZSBudW1iZXIgb2YgdGhlIGJ5dGVzIGluIHRoZSBwbGF5YmFjaworICogICAgICAgICAgICAgIGJ1ZmZlciBiZWZvcmUgdGhlIHNlcnZlciB3aWxsIHJlcXVlc3QgbW9yZSBkYXRhLiBJdCBpcworICogICAgICAgICAgICAgIHJlY29tbWVuZGVkIHRvIGZpbGwgaW4gKHVpbnQzMl90KSAtMSBoZXJlLiBUaGlzIHZhbHVlCisgKiAgICAgICAgICAgICAgaW5mbHVlbmNlcyBob3cgbXVjaCB0aW1lIHRoZSBzb3VuZCBzZXJ2ZXIgaGFzIHRvIG1vdmUKKyAqICAgICAgICAgICAgICBkYXRhIGZyb20gdGhlIHBlci1zdHJlYW0gc2VydmVyLXNpZGUgcGxheWJhY2sgYnVmZmVyCisgKiAgICAgICAgICAgICAgdG8gdGhlIGhhcmR3YXJlIHBsYXliYWNrIGJ1ZmZlci4KKyAqCisgKiBcbGkgZnJhZ3NpemUgLSBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHRoZSBzZXJ2ZXIgd2lsbCBwdXNoIGluCisgKiAgICAgICAgICAgICAgICBvbmUgY2h1bmsgZm9yIHJlY29yZCBzdHJlYW1zLiBJZiB5b3UgcGFzcyAodWludDMyX3QpCisgKiAgICAgICAgICAgICAgICAtMSAod2hpY2ggaXMgcmVjb21tZW5kZWQpIGhlcmUsIHRoZSBzZXJ2ZXIgd2lsbAorICogICAgICAgICAgICAgICAgY2hvb3NlIHRoZSBsb25nZXN0IGZyYWdtZW50IHNldHRpbmcgcG9zc2libGUgdG8KKyAqICAgICAgICAgICAgICAgIG1pbmltaXplIHRoZSBudW1iZXIgb2YgbmVjZXNzYXJ5IHdha2V1cHMgYW5kCisgKiAgICAgICAgICAgICAgICBtYXhpbWl6ZSBkcm9wLW91dCBzYWZldHkuIFRoaXMgY2FuIGV4Y2VlZCAycyBvZgorICogICAgICAgICAgICAgICAgYnVmZmVyaW5nLiBGb3IgbG93LWxhdGVuY3kgYXBwbGljYXRpb25zIG9yCisgKiAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbnMgd2hlcmUgbGF0ZW5jeSBtYXR0ZXJzIHlvdSBzaG91bGQgcGFzcyBhCisgKiAgICAgICAgICAgICAgICBwcm9wZXIgdmFsdWUgaGVyZS4KKyAqCisgKiBJZiBQQV9TVFJFQU1fQURKVVNUX0xBVEVOQ1kgaXMgc2V0LCB0aGVuIHRoZSB0bGVuZ3RoL2ZyYWdzaXplCisgKiBwYXJhbWV0ZXJzIHdpbGwgYmUgaW50ZXJwcmV0ZWQgc2xpZ2h0bHkgZGlmZmVyZW50bHkgdGhhbiBkZXNjcmliZWQKKyAqIGFib3ZlIHdoZW4gcGFzc2VkIHRvIHBhX3N0cmVhbV9jb25uZWN0X3JlY29yZCgpIGFuZAorICogcGFfc3RyZWFtX2Nvbm5lY3RfcGxheWJhY2soKTogdGhlIG92ZXJhbGwgbGF0ZW5jeSB0aGF0IGlzIGNvbXByaXNlZAorICogb2YgYm90aCB0aGUgc2VydmVyIHNpZGUgcGxheWJhY2sgYnVmZmVyIGxlbmd0aCwgdGhlIGhhcmR3YXJlCisgKiBwbGF5YmFjayBidWZmZXIgbGVuZ3RoIGFuZCBhZGRpdGlvbmFsIGxhdGVuY2llcyB3aWxsIGJlIGFkanVzdGVkIGluCisgKiBhIHdheSB0aGF0IGl0IG1hdGNoZXMgdGxlbmd0aCByZXNwLiBmcmFnc2l6ZS4gU2V0CisgKiBQQV9TVFJFQU1fQURKVVNUX0xBVEVOQ1kgaWYgeW91IHdhbnQgdG8gY29udHJvbCB0aGUgb3ZlcmFsbAorICogcGxheWJhY2sgbGF0ZW5jeSBmb3IgeW91ciBzdHJlYW0uIFVuc2V0IGl0IGlmIHlvdSB3YW50IHRvIGNvbnRyb2wKKyAqIG9ubHkgdGhlIGxhdGVuY3kgaW5kdWNlZCBieSB0aGUgc2VydmVyLXNpZGUsIHJld3JpdGFibGUgcGxheWJhY2sKKyAqIGJ1ZmZlci4gVGhlIHNlcnZlciB3aWxsIHRyeSB0byBmdWxmaWxsIHRoZSBjbGllbnRzIGxhdGVuY3kgcmVxdWVzdHMKKyAqIGFzIGdvb2QgYXMgcG9zc2libGUuIEhvd2V2ZXIgaWYgdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUgY2Fubm90CisgKiBjaGFuZ2UgdGhlIGhhcmR3YXJlIGJ1ZmZlciBsZW5ndGggb3Igb25seSBpbiBhIGxpbWl0ZWQgcmFuZ2UsIHRoZQorICogYWN0dWFsbHkgcmVzdWx0aW5nIGxhdGVuY3kgbWlnaHQgYmUgZGlmZmVyZW50IGZyb20gd2hhdCB0aGUgY2xpZW50CisgKiByZXF1ZXN0ZWQuIFRodXMsIGZvciBzeW5jaHJvbml6YXRpb24gY2xpZW50cyBhbHdheXMgbmVlZCB0byBjaGVjaworICogdGhlIGFjdHVhbCBtZWFzdXJlZCBsYXRlbmN5IHZpYSBwYV9zdHJlYW1fZ2V0X2xhdGVuY3koKSBvciBhCisgKiBzaW1pbGFyIGNhbGwsIGFuZCBub3QgbWFrZSBhbnkgYXNzdW1wdGlvbnMuIGFib3V0IHRoZSBsYXRlbmN5CisgKiBhdmFpbGFibGUuIFRoZSBmdW5jdGlvbiBwYV9zdHJlYW1fZ2V0X2J1ZmZlcl9hdHRyKCkgd2lsbCBhbHdheXMKKyAqIHJldHVybiB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIHNlcnZlci1zaWRlIHBlci1zdHJlYW0gYnVmZmVyIGluCisgKiB0bGVuZ3RoL2ZyYWdzaXplLCByZWdhcmRsZXNzIHdoZXRoZXIgUEFfU1RSRUFNX0FESlVTVF9MQVRFTkNZIGlzCisgKiBzZXQgb3Igbm90LgorICoKKyAqIFRoZSBzZXJ2ZXItc2lkZSBwZXItc3RyZWFtIHBsYXliYWNrIGJ1ZmZlcnMgYXJlIGluZGV4ZWQgYnkgYSB3cml0ZSBhbmQgYSByZWFkCisgKiBpbmRleC4gVGhlIGFwcGxpY2F0aW9uIHdyaXRlcyB0byB0aGUgd3JpdGUgaW5kZXggYW5kIHRoZSBzb3VuZAorICogZGV2aWNlIHJlYWRzIGZyb20gdGhlIHJlYWQgaW5kZXguIFRoZSByZWFkIGluZGV4IGlzIGluY3JlYXNlZAorICogbW9ub3RvbmljYWxseSwgd2hpbGUgdGhlIHdyaXRlIGluZGV4IG1heSBiZSBmcmVlbHkgY29udHJvbGxlZCBieQorICogdGhlIGFwcGxpY2F0aW9uLiBTdWJ0cmFjdGluZyB0aGUgcmVhZCBpbmRleCBmcm9tIHRoZSB3cml0ZSBpbmRleAorICogd2lsbCBnaXZlIHlvdSB0aGUgY3VycmVudCBmaWxsIGxldmVsIG9mIHRoZSBidWZmZXIuIFRoZSByZWFkL3dyaXRlCisgKiBpbmRleGVzIGFyZSA2NGJpdCB2YWx1ZXMgYW5kIG1lYXN1cmVkIGluIGJ5dGVzLCB0aGV5IHdpbGwgbmV2ZXIKKyAqIHdyYXAuIFRoZSBjdXJyZW50IHJlYWQvd3JpdGUgaW5kZXggbWF5IGJlIHF1ZXJpZWQgdXNpbmcKKyAqIHBhX3N0cmVhbV9nZXRfdGltaW5nX2luZm8oKSAoc2VlIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uKS4gSW4KKyAqIGNhc2Ugb2YgYSBidWZmZXIgdW5kZXJydW4gdGhlIHJlYWQgaW5kZXggaXMgZXF1YWwgb3IgbGFyZ2VyIHRoYW4KKyAqIHRoZSB3cml0ZSBpbmRleC4gVW5sZXNzIHRoZSBwcmVidWYgdmFsdWUgaXMgMCwgUHVsc2VBdWRpbyB3aWxsCisgKiB0ZW1wb3JhcmlseSBwYXVzZSBwbGF5YmFjayBpbiBzdWNoIGEgY2FzZSwgYW5kIHdhaXQgdW50aWwgdGhlCisgKiBidWZmZXIgaXMgZmlsbGVkIHVwIHRvIHByZWJ1ZiBieXRlcyBhZ2Fpbi4gSWYgcHJlYnVmIGlzIDAsIHRoZQorICogcmVhZCBpbmRleCBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIHdyaXRlIGluZGV4LCBpbiB3aGljaCBjYXNlCisgKiBzaWxlbmNlIGlzIHBsYXllZC4gSWYgdGhlIGFwcGxpY2F0aW9uIHdyaXRlcyBkYXRhIHRvIGluZGV4ZXMgbG93ZXIKKyAqIHRoYW4gdGhlIHJlYWQgaW5kZXgsIHRoZSBkYXRhIGlzIGltbWVkaWF0ZWx5IGxvc3QuCisgKgorICogXHNlY3Rpb24gdHJhbnNmZXJfc2VjIFRyYW5zZmVycmluZyBEYXRhCisgKgorICogT25jZSB0aGUgc3RyZWFtIGlzIHVwLCBkYXRhIGNhbiBzdGFydCBmbG93aW5nIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlCisgKiBzZXJ2ZXIuIFR3byBkaWZmZXJlbnQgYWNjZXNzIG1vZGVscyBjYW4gYmUgdXNlZCB0byB0cmFuc2ZlciB0aGUgZGF0YToKKyAqCisgKiBcbGkgQXN5bmNocm9ub3VzIC0gVGhlIGFwcGxpY2F0aW9uIHJlZ2lzdGVyIGEgY2FsbGJhY2sgdXNpbmcKKyAqICAgICAgICAgICAgICAgICAgICBwYV9zdHJlYW1fc2V0X3dyaXRlX2NhbGxiYWNrKCkgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgcGFfc3RyZWFtX3NldF9yZWFkX2NhbGxiYWNrKCkgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zCisgKiAgICAgICAgICAgICAgICAgICAgdGhhdCBkYXRhIGNhbiBlaXRoZXIgYmUgd3JpdHRlbiBvciByZWFkLgorICogXGxpIFBvbGxlZCAtIFF1ZXJ5IHRoZSBsaWJyYXJ5IGZvciBhdmFpbGFibGUgZGF0YS9zcGFjZSB1c2luZworICogICAgICAgICAgICAgIHBhX3N0cmVhbV93cml0YWJsZV9zaXplKCkgYW5kIHBhX3N0cmVhbV9yZWFkYWJsZV9zaXplKCkgYW5kCisgKiAgICAgICAgICAgICAgdHJhbnNmZXIgZGF0YSBhcyBuZWVkZWQuIFRoZSBzaXplcyBhcmUgc3RvcmVkIGxvY2FsbHksIGluIHRoZQorICogICAgICAgICAgICAgIGNsaWVudCBlbmQsIHNvIHRoZXJlIGlzIG5vIGRlbGF5IHdoZW4gcmVhZGluZyB0aGVtLgorICoKKyAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gbWl4IHRoZSB0d28gbW9kZWxzIGZyZWVseS4KKyAqCisgKiBPbmNlIHRoZXJlIGlzIGRhdGEvc3BhY2UgYXZhaWxhYmxlLCBpdCBjYW4gYmUgdHJhbnNmZXJyZWQgdXNpbmcgZWl0aGVyCisgKiBwYV9zdHJlYW1fd3JpdGUoKSBmb3IgcGxheWJhY2ssIG9yIHBhX3N0cmVhbV9wZWVrKCkgLyBwYV9zdHJlYW1fZHJvcCgpIGZvcgorICogcmVjb3JkLiBNYWtlIHN1cmUgeW91IGRvIG5vdCBvdmVyZmxvdyB0aGUgcGxheWJhY2sgYnVmZmVycyBhcyBkYXRhIHdpbGwgYmUKKyAqIGRyb3BwZWQuCisgKgorICogXHNlY3Rpb24gYnVmY3RsX3NlYyBCdWZmZXIgQ29udHJvbAorICoKKyAqIFRoZSB0cmFuc2ZlciBidWZmZXJzIGNhbiBiZSBjb250cm9sbGVkIHRocm91Z2ggYSBudW1iZXIgb2Ygb3BlcmF0aW9uczoKKyAqCisgKiBcbGkgcGFfc3RyZWFtX2NvcmsoKSAtIFN0YXJ0IG9yIHN0b3AgdGhlIHBsYXliYWNrIG9yIHJlY29yZGluZy4KKyAqIFxsaSBwYV9zdHJlYW1fdHJpZ2dlcigpIC0gU3RhcnQgcGxheWJhY2sgaW1tZWRpYXRlbHkgYW5kIGRvIG5vdCB3YWl0IGZvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGZpbGwgdXAgdG8gdGhlIHNldCB0cmlnZ2VyIGxldmVsLgorICogXGxpIHBhX3N0cmVhbV9wcmVidWYoKSAtIFJlZW5hYmxlIHRoZSBwbGF5YmFjayB0cmlnZ2VyIGxldmVsLgorICogXGxpIHBhX3N0cmVhbV9kcmFpbigpIC0gV2FpdCBmb3IgdGhlIHBsYXliYWNrIGJ1ZmZlciB0byBnbyBlbXB0eS4gV2lsbAorICogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgcGFfb3BlcmF0aW9uIG9iamVjdCB0aGF0IHdpbGwgaW5kaWNhdGUgd2hlbgorICogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJ1ZmZlciBpcyBjb21wbGV0ZWx5IGRyYWluZWQuCisgKiBcbGkgcGFfc3RyZWFtX2ZsdXNoKCkgLSBEcm9wIGFsbCBkYXRhIGZyb20gdGhlIHBsYXliYWNrIGJ1ZmZlciBhbmQgZG8gbm90CisgKiAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0IGZvciBpdCB0byBmaW5pc2ggcGxheWluZy4KKyAqCisgKiBcc2VjdGlvbiBzZWVrX21vZGVzIFNlZWtpbmcgaW4gdGhlIFBsYXliYWNrIEJ1ZmZlcgorICoKKyAqIEEgY2xpZW50IGFwcGxpY2F0aW9uIG1heSBmcmVlbHkgc2VlayBpbiB0aGUgcGxheWJhY2sgYnVmZmVyLiBUbworICogYWNjb21wbGlzaCB0aGF0IHRoZSBwYV9zdHJlYW1fd3JpdGUoKSBmdW5jdGlvbiB0YWtlcyBhIHNlZWsgbW9kZQorICogYW5kIGFuIG9mZnNldCBhcmd1bWVudC4gVGhlIHNlZWsgbW9kZSBpcyBvbmUgb2Y6CisgKgorICogXGxpIFBBX1NFRUtfUkVMQVRJVkUgLSBzZWVrIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdyaXRlIGluZGV4CisgKiBcbGkgUEFfU0VFS19BQlNPTFVURSAtIHNlZWsgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGxheWJhY2sgYnVmZmVyLCAoaS5lLiB0aGUgZmlyc3QgdGhhdCB3YXMgZXZlciBwbGF5ZWQgaW4gdGhlIHN0cmVhbSkKKyAqIFxsaSBQQV9TRUVLX1JFTEFUSVZFX09OX1JFQUQgLSBzZWVrIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHJlYWQgaW5kZXguIFVzZSB0aGlzIHRvIHdyaXRlIGRhdGEgdG8gdGhlIG91dHB1dCBidWZmZXIgdGhhdCBzaG91bGQgYmUgcGxheWVkIGFzIHNvb24gYXMgcG9zc2libGUKKyAqIFxsaSBQQV9TRUVLX1JFTEFUSVZFX0VORCAtIHNlZWsgcmVsYXRpdmUgdG8gdGhlIGxhc3QgYnl0ZSBldmVyIHdyaXR0ZW4uCisgKgorICogSWYgYW4gYXBwbGljYXRpb24ganVzdCB3YW50cyB0byBhcHBlbmQgc29tZSBkYXRhIHRvIHRoZSBvdXRwdXQKKyAqIGJ1ZmZlciwgUEFfU0VFS19SRUxBVElWRSBhbmQgYW4gb2Zmc2V0IG9mIDAgc2hvdWxkIGJlIHVzZWQuCisgKgorICogQWZ0ZXIgYSBjYWxsIHRvIHBhX3N0cmVhbV93cml0ZSgpIHRoZSB3cml0ZSBpbmRleCB3aWxsIGJlIGxlZnQgYXQKKyAqIHRoZSBwb3NpdGlvbiByaWdodCBhZnRlciB0aGUgbGFzdCBieXRlIG9mIHRoZSB3cml0dGVuIGRhdGEuCisgKgorICogXHNlY3Rpb24gbGF0ZW5jeV9zZWMgTGF0ZW5jeQorICoKKyAqIEEgbWFqb3IgcHJvYmxlbSB3aXRoIG5ldHdvcmtlZCBhdWRpbyBpcyB0aGUgaW5jcmVhc2VkIGxhdGVuY3kgY2F1c2VkIGJ5CisgKiB0aGUgbmV0d29yay4gVG8gcmVtZWR5IHRoaXMsIFB1bHNlQXVkaW8gc3VwcG9ydHMgYW4gYWR2YW5jZWQgc3lzdGVtIG9mCisgKiBtb25pdG9yaW5nIHRoZSBjdXJyZW50IGxhdGVuY3kuCisgKgorICogVG8gZ2V0IHRoZSByYXcgZGF0YSBuZWVkZWQgdG8gY2FsY3VsYXRlIGxhdGVuY2llcywgY2FsbAorICogcGFfc3RyZWFtX2dldF90aW1pbmdfaW5mbygpLiBUaGlzIHdpbGwgZ2l2ZSB5b3UgYSBwYV90aW1pbmdfaW5mbworICogc3RydWN0dXJlIHRoYXQgY29udGFpbnMgZXZlcnl0aGluZyB0aGF0IGlzIGtub3duIGFib3V0IHRoZSBzZXJ2ZXIKKyAqIHNpZGUgYnVmZmVyIHRyYW5zcG9ydCBkZWxheXMgYW5kIHRoZSBiYWNrZW5kIGFjdGl2ZSBpbiB0aGUKKyAqIHNlcnZlci4gKEJlc2lkZXMgb3RoZXIgdGhpbmdzIGl0IGNvbnRhaW5zIHRoZSB3cml0ZSBhbmQgcmVhZCBpbmRleAorICogdmFsdWVzIG1lbnRpb25lZCBhYm92ZS4pCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXBkYXRlZCBldmVyeSB0aW1lIGEKKyAqIHBhX3N0cmVhbV91cGRhdGVfdGltaW5nX2luZm8oKSBvcGVyYXRpb24gaXMgZXhlY3V0ZWQuIChpLmUuIGJlZm9yZQorICogdGhlIGZpcnN0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbiB0aGUgdGltaW5nIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBpcworICogbm90IGF2YWlsYWJsZSEpIFNpbmNlIGl0IGlzIGEgbG90IG9mIHdvcmsgdG8ga2VlcCB0aGlzIHN0cnVjdHVyZQorICogdXAtdG8tZGF0ZSBtYW51YWxseSwgUHVsc2VBdWRpbyBjYW4gZG8gdGhhdCBhdXRvbWF0aWNhbGx5IGZvciB5b3U6CisgKiBpZiBQQV9TVFJFQU1fQVVUT19USU1JTkdfVVBEQVRFIGlzIHBhc3NlZCB3aGVuIGNvbm5lY3RpbmcgdGhlCisgKiBzdHJlYW0gUHVsc2VBdWRpbyB3aWxsIGF1dG9tYXRpY2FsbHkgdXBkYXRlIHRoZSBzdHJ1Y3R1cmUgZXZlcnkKKyAqIDEwMG1zIGFuZCBldmVyeSB0aW1lIGEgZnVuY3Rpb24gaXMgY2FsbGVkIHRoYXQgbWlnaHQgaW52YWxpZGF0ZSB0aGUKKyAqIHByZXZpb3VzbHkga25vd24gdGltaW5nIGRhdGEgKHN1Y2ggYXMgcGFfc3RyZWFtX3dyaXRlKCkgb3IKKyAqIHBhX3N0cmVhbV9mbHVzaCgpKS4gUGxlYXNlIG5vdGUgaG93ZXZlciwgdGhhdCB0aGVyZSBhbHdheXMgaXMgYQorICogc2hvcnQgdGltZSB3aW5kb3cgd2hlbiB0aGUgZGF0YSBpbiB0aGUgdGltaW5nIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorICogaXMgb3V0LW9mLWRhdGUuIFB1bHNlQXVkaW8gdHJpZXMgdG8gbWFyayB0aGVzZSBzaXR1YXRpb25zIGJ5CisgKiBzZXR0aW5nIHRoZSB3cml0ZV9pbmRleF9jb3JydXB0IGFuZCByZWFkX2luZGV4X2NvcnJ1cHQgZmllbGRzCisgKiBhY2NvcmRpbmdseS4KKyAqCisgKiBUaGUgcmF3IHRpbWluZyBkYXRhIGluIHRoZSBwYV90aW1pbmdfaW5mbyBzdHJ1Y3R1cmUgaXMgdXN1YWxseSBoYXJkCisgKiB0byBkZWFsIHdpdGguIFRoZXJlZm9yZSBhIHNpbXBsZXIgaW50ZXJmYWNlIGlzIGF2YWlsYWJsZToKKyAqIHlvdSBjYW4gY2FsbCBwYV9zdHJlYW1fZ2V0X3RpbWUoKSBvciBwYV9zdHJlYW1fZ2V0X2xhdGVuY3koKS4gVGhlCisgKiBmb3JtZXIgd2lsbCByZXR1cm4gdGhlIGN1cnJlbnQgcGxheWJhY2sgdGltZSBvZiB0aGUgaGFyZHdhcmUgc2luY2UKKyAqIHRoZSBzdHJlYW0gaGFzIGJlZW4gc3RhcnRlZC4gVGhlIGxhdHRlciByZXR1cm5zIHRoZSBvdmVyYWxsIHRpbWUgYSBzYW1wbGUKKyAqIHRoYXQgeW91IHdyaXRlIG5vdyB0YWtlcyB0byBiZSBwbGF5ZWQgYnkgdGhlIGhhcmR3YXJlLiBUaGVzZSB0d28KKyAqIGZ1bmN0aW9ucyBiYXNlIHRoZWlyIGNhbGN1bGF0aW9ucyBvbiB0aGUgc2FtZSBkYXRhIHRoYXQgaXMgcmV0dXJuZWQKKyAqIGJ5IHBhX3N0cmVhbV9nZXRfdGltaW5nX2luZm8oKS4gSGVuY2UgdGhlIHNhbWUgcnVsZXMgZm9yIGtlZXBpbmcKKyAqIHRoZSB0aW1pbmcgZGF0YSB1cC10by1kYXRlIGFwcGx5IGhlcmUuIEluIGNhc2UgdGhlIHdyaXRlIG9yIHJlYWQKKyAqIGluZGV4IGlzIGNvcnJ1cHRlZCwgdGhlc2UgdHdvIGZ1bmN0aW9ucyB3aWxsIGZhaWwgd2l0aAorICogUEFfRVJSX05PREFUQSBzZXQuCisgKgorICogU2luY2UgdXBkYXRpbmcgdGhlIHRpbWluZyBpbmZvIHN0cnVjdHVyZSB1c3VhbGx5IHJlcXVpcmVzIGEgZnVsbAorICogbmV0d29yayByb3VuZCB0cmlwIGFuZCBzb21lIGFwcGxpY2F0aW9ucyBtb25pdG9yIHRoZSB0aW1pbmcgdmVyeQorICogb2Z0ZW4gUHVsc2VBdWRpbyBvZmZlcnMgYSB0aW1pbmcgaW50ZXJwb2xhdGlvbiBzeXN0ZW0uIElmCisgKiBQQV9TVFJFQU1fSU5URVJQT0xBVEVfVElNSU5HIGlzIHBhc3NlZCB3aGVuIGNvbm5lY3RpbmcgdGhlIHN0cmVhbSwKKyAqIHBhX3N0cmVhbV9nZXRfdGltZSgpIGFuZCBwYV9zdHJlYW1fZ2V0X2xhdGVuY3koKSB3aWxsIHRyeSB0bworICogaW50ZXJwb2xhdGUgdGhlIGN1cnJlbnQgcGxheWJhY2sgdGltZS9sYXRlbmN5IGJ5IGVzdGltYXRpbmcgdGhlCisgKiBudW1iZXIgb2Ygc2FtcGxlcyB0aGF0IGhhdmUgYmVlbiBwbGF5ZWQgYmFjayBieSB0aGUgaGFyZHdhcmUgc2luY2UKKyAqIHRoZSBsYXN0IHJlZ3VsYXIgdGltaW5nIHVwZGF0ZS4gSXQgaXMgZXNwZWNpYWxseSB1c2VmdWwgdG8gY29tYmluZQorICogdGhpcyBvcHRpb24gd2l0aCBQQV9TVFJFQU1fQVVUT19USU1JTkdfVVBEQVRFLCB3aGljaCB3aWxsIGVuYWJsZQorICogeW91IHRvIG1vbml0b3IgdGhlIGN1cnJlbnQgcGxheWJhY2sgdGltZS9sYXRlbmN5IHZlcnkgcHJlY2lzZWx5IGFuZAorICogdmVyeSBmcmVxdWVudGx5IHdpdGhvdXQgcmVxdWlyaW5nIGEgbmV0d29yayByb3VuZCB0cmlwIGV2ZXJ5IHRpbWUuCisgKgorICogXHNlY3Rpb24gZmxvd19zZWMgT3ZlcmZsb3cgYW5kIHVuZGVyZmxvdworICoKKyAqIEV2ZW4gd2l0aCB0aGUgYmVzdCBwcmVjYXV0aW9ucywgYnVmZmVycyB3aWxsIHNvbWV0aW1lIG92ZXIgLSBvcgorICogdW5kZXJmbG93LiAgVG8gaGFuZGxlIHRoaXMgZ3JhY2VmdWxseSwgdGhlIGFwcGxpY2F0aW9uIGNhbiBiZQorICogbm90aWZpZWQgd2hlbiB0aGlzIGhhcHBlbnMuIENhbGxiYWNrcyBhcmUgcmVnaXN0ZXJlZCB1c2luZworICogcGFfc3RyZWFtX3NldF9vdmVyZmxvd19jYWxsYmFjaygpIGFuZAorICogcGFfc3RyZWFtX3NldF91bmRlcmZsb3dfY2FsbGJhY2soKS4KKyAqCisgKiBcc2VjdGlvbiBzeW5jX3N0cmVhbXMgU3luY2hyb25pemluZyBNdWx0aXBsZSBQbGF5YmFjayBTdHJlYW1zCisgKgorICogUHVsc2VBdWRpbyBhbGxvd3MgYXBwbGljYXRpb25zIHRvIGZ1bGx5IHN5bmNocm9uaXplIG11bHRpcGxlCisgKiBwbGF5YmFjayBzdHJlYW1zIHRoYXQgYXJlIGNvbm5lY3RlZCB0byB0aGUgc2FtZSBvdXRwdXQgZGV2aWNlLiBUaGF0CisgKiBtZWFucyB0aGUgc3RyZWFtcyB3aWxsIGFsd2F5cyBiZSBwbGF5ZWQgYmFjayBzYW1wbGUtYnktc2FtcGxlCisgKiBzeW5jaHJvbm91c2x5LiBJZiBzdHJlYW0gb3BlcmF0aW9ucyBsaWtlIHBhX3N0cmVhbV9jb3JrKCkgYXJlCisgKiBpc3N1ZWQgb24gb25lIG9mIHRoZSBzeW5jaHJvbml6ZWQgc3RyZWFtcywgdGhleSBhcmUgc2ltdWx0YW5lb3VzbHkKKyAqIGlzc3VlZCBvbiB0aGUgb3RoZXJzLgorICoKKyAqIFRvIHN5bmNocm9uaXplIGEgc3RyZWFtIHRvIGFub3RoZXIsIGp1c3QgcGFzcyB0aGUgIm1hc3RlciIgc3RyZWFtCisgKiBhcyBsYXN0IGFyZ3VtZW50IHRvIHBhX3N0cmVhbV9jb25uZWN0X3BsYXliYWNrKCkuIFRvIG1ha2Ugc3VyZSB0aGF0CisgKiB0aGUgZnJlc2hseSBjcmVhdGVkIHN0cmVhbSBkb2Vzbid0IHN0YXJ0IHBsYXliYWNrIHJpZ2h0LWF3YXksIG1ha2UKKyAqIHN1cmUgdG8gcGFzcyBQQV9TVFJFQU1fU1RBUlRfQ09SS0VEIGFuZCAtIGFmdGVyIGFsbCBzdHJlYW1zIGhhdmUKKyAqIGJlZW4gY3JlYXRlZCAtIHVuY29yayB0aGVtIGFsbCB3aXRoIGEgc2luZ2xlIGNhbGwgdG8KKyAqIHBhX3N0cmVhbV9jb3JrKCkgZm9yIHRoZSBtYXN0ZXIgc3RyZWFtLgorICoKKyAqIFRvIG1ha2Ugc3VyZSB0aGF0IGEgcGFydGljdWxhciBzdHJlYW0gZG9lc24ndCBzdG9wIHRvIHBsYXkgd2hlbiBhCisgKiBzZXJ2ZXIgc2lkZSBidWZmZXIgdW5kZXJydW4gaGFwcGVucyBvbiBpdCB3aGlsZSB0aGUgb3RoZXIKKyAqIHN5bmNocm9uaXplZCBzdHJlYW1zIGNvbnRpbnVlIHBsYXlpbmcgYW5kIGhlbmNlIGRldmlhdGUgeW91IG5lZWQgdG8KKyAqIHBhc3MgYSAicHJlYnVmIiBwYV9idWZmZXJfYXR0ciBvZiAwIHdoZW4gY29ubmVjdGluZyBpdC4KKyAqCisgKiBcc2VjdGlvbiBkaXNjX3NlYyBEaXNjb25uZWN0aW5nCisgKgorICogV2hlbiBhIHN0cmVhbSBoYXMgc2VydmVkIGlzIHB1cnBvc2UgaXQgbXVzdCBiZSBkaXNjb25uZWN0ZWQgd2l0aAorICogcGFfc3RyZWFtX2Rpc2Nvbm5lY3QoKS4gSWYgeW91IG9ubHkgdW5yZWZlcmVuY2UgaXQsIHRoZW4gaXQgd2lsbCBsaXZlIG9uCisgKiBhbmQgZWF0IHJlc291cmNlcyBib3RoIGxvY2FsbHkgYW5kIG9uIHRoZSBzZXJ2ZXIgdW50aWwgeW91IGRpc2Nvbm5lY3QgdGhlCisgKiBjb250ZXh0LgorICoKKyAqLworCisvKiogXGZpbGUKKyAqIEF1ZGlvIHN0cmVhbXMgZm9yIGlucHV0LCBvdXRwdXQgYW5kIHNhbXBsZSB1cGxvYWQKKyAqCisgKiBTZWUgYWxzbyBcc3VicGFnZSBzdHJlYW1zCisgKi8KKworUEFfQ19ERUNMX0JFR0lOCisKKy8qKiBBbiBvcGFxdWUgc3RyZWFtIGZvciBwbGF5YmFjayBvciByZWNvcmRpbmcgKi8KK3R5cGVkZWYgc3RydWN0IHBhX3N0cmVhbSBwYV9zdHJlYW07CisKKy8qKiBBIGdlbmVyaWMgY2FsbGJhY2sgZm9yIG9wZXJhdGlvbiBjb21wbGV0aW9uICovCit0eXBlZGVmIHZvaWQgKCpwYV9zdHJlYW1fc3VjY2Vzc19jYl90KSAocGFfc3RyZWFtKnMsIGludCBzdWNjZXNzLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBBIGdlbmVyaWMgcmVxdWVzdCBjYWxsYmFjayAqLwordHlwZWRlZiB2b2lkICgqcGFfc3RyZWFtX3JlcXVlc3RfY2JfdCkocGFfc3RyZWFtICpwLCBzaXplX3QgbmJ5dGVzLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBBIGdlbmVyaWMgbm90aWZpY2F0aW9uIGNhbGxiYWNrICovCit0eXBlZGVmIHZvaWQgKCpwYV9zdHJlYW1fbm90aWZ5X2NiX3QpKHBhX3N0cmVhbSAqcCwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQSBjYWxsYmFjayBmb3IgYXN5bmNocm9ub3VzIG1ldGEvcG9saWN5IGV2ZW50IG1lc3NhZ2VzLiBXZWxsIGtub3duCisgKiBldmVudCBuYW1lcyBhcmUgUEFfU1RSRUFNX0VWRU5UX1JFUVVFU1RfQ09SSyBhbmQKKyAqIFBBX1NUUkVBTV9FVkVOVF9SRVFVRVNUX1VOQ09SSy4gVGhlIHNldCBvZiBkZWZpbmVkIGV2ZW50cyBjYW4gYmUKKyAqIGV4dGVuZGVkIGF0IGFueSB0aW1lLiBBbHNvLCBzZXJ2ZXIgbW9kdWxlcyBtYXkgaW50cm9kdWNlIGFkZGl0aW9uYWwKKyAqIG1lc3NhZ2UgdHlwZXMgc28gbWFrZSBzdXJlIHRoYXQgeW91ciBjYWxsYmFjayBmdW5jdGlvbiBpZ25vcmVzIG1lc3NhZ2VzCisgKiBpdCBkb2Vzbid0IGtub3cuIFxzaW5jZSAwLjkuMTUgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX3N0cmVhbV9ldmVudF9jYl90KShwYV9zdHJlYW0gKnAsIGNvbnN0IGNoYXIgKm5hbWUsIHBhX3Byb3BsaXN0ICpwbCwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQ3JlYXRlIGEgbmV3LCB1bmNvbm5lY3RlZCBzdHJlYW0gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kCisgKiBzYW1wbGUgdHlwZS4gSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHBhX3N0cmVhbV9uZXdfd2l0aF9wcm9wbGlzdCgpCisgKiBpbnN0ZWFkIGFuZCBzcGVjaWZ5IHNvbWUgaW5pdGlhbCBwcm9wZXJ0aWVzLiAqLworcGFfc3RyZWFtKiBwYV9zdHJlYW1fbmV3KAorICAgICAgICBwYV9jb250ZXh0ICpjICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgY29udGV4dCB0byBjcmVhdGUgdGhpcyBzdHJlYW0gaW4gKi8sCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgICAgICAgICAgICAgICAgICAvKio8IEEgbmFtZSBmb3IgdGhpcyBzdHJlYW0gKi8sCisgICAgICAgIGNvbnN0IHBhX3NhbXBsZV9zcGVjICpzcyAgICAgICAgICAvKio8IFRoZSBkZXNpcmVkIHNhbXBsZSBmb3JtYXQgKi8sCisgICAgICAgIGNvbnN0IHBhX2NoYW5uZWxfbWFwICptYXAgICAgICAgICAvKio8IFRoZSBkZXNpcmVkIGNoYW5uZWwgbWFwLCBvciBOVUxMIGZvciBkZWZhdWx0ICovKTsKKworLyoqIENyZWF0ZSBhIG5ldywgdW5jb25uZWN0ZWQgc3RyZWFtIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZAorICogc2FtcGxlIHR5cGUsIGFuZCBzcGVjaWZ5IHRoZSB0aGUgaW5pdGlhbCBzdHJlYW0gcHJvcGVydHkKKyAqIGxpc3QuIFxzaW5jZSAwLjkuMTEgKi8KK3BhX3N0cmVhbSogcGFfc3RyZWFtX25ld193aXRoX3Byb3BsaXN0KAorICAgICAgICBwYV9jb250ZXh0ICpjICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgY29udGV4dCB0byBjcmVhdGUgdGhpcyBzdHJlYW0gaW4gKi8sCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgICAgICAgICAgICAgICAgICAvKio8IEEgbmFtZSBmb3IgdGhpcyBzdHJlYW0gKi8sCisgICAgICAgIGNvbnN0IHBhX3NhbXBsZV9zcGVjICpzcyAgICAgICAgICAvKio8IFRoZSBkZXNpcmVkIHNhbXBsZSBmb3JtYXQgKi8sCisgICAgICAgIGNvbnN0IHBhX2NoYW5uZWxfbWFwICptYXAgICAgICAgICAvKio8IFRoZSBkZXNpcmVkIGNoYW5uZWwgbWFwLCBvciBOVUxMIGZvciBkZWZhdWx0ICovLAorICAgICAgICBwYV9wcm9wbGlzdCAqcCAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgaW5pdGlhbCBwcm9wZXJ0eSBsaXN0ICovKTsKKworLyoqIENyZWF0ZSBhIG5ldywgdW5jb25uZWN0ZWQgc3RyZWFtIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCB0aGUgc2V0IG9mIGZvcm1hdHMKKyAqIHRoaXMgY2xpZW50IGNhbiBwcm92aWRlLCBhbmQgYW4gaW5pdGlhbCBsaXN0IG9mIHByb3BlcnRpZXMuIFdoaWxlCisgKiBjb25uZWN0aW5nLCB0aGUgc2VydmVyIHdpbGwgc2VsZWN0IHRoZSBtb3N0IGFwcHJvcHJpYXRlIGZvcm1hdCB3aGljaCB0aGUKKyAqIGNsaWVudCBtdXN0IHRoZW4gcHJvdmlkZS4gXHNpbmNlIDEuMCAqLworcGFfc3RyZWFtICpwYV9zdHJlYW1fbmV3X2V4dGVuZGVkKAorICAgICAgICBwYV9jb250ZXh0ICpjICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgY29udGV4dCB0byBjcmVhdGUgdGhpcyBzdHJlYW0gaW4gKi8sCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgICAgICAgICAgICAgICAgICAvKio8IEEgbmFtZSBmb3IgdGhpcyBzdHJlYW0gKi8sCisgICAgICAgIHBhX2Zvcm1hdF9pbmZvICogY29uc3QgKiBmb3JtYXRzICAvKio8IFRoZSBsaXN0IG9mIGZvcm1hdHMgdGhhdCBjYW4gYmUgcHJvdmlkZWQgKi8sCisgICAgICAgIHVuc2lnbmVkIGludCBuX2Zvcm1hdHMgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgZm9ybWF0cyBiZWluZyBwYXNzZWQgaW4gKi8sCisgICAgICAgIHBhX3Byb3BsaXN0ICpwICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBpbml0aWFsIHByb3BlcnR5IGxpc3QgKi8pOworCisvKiogRGVjcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudGVyIGJ5IG9uZSAqLwordm9pZCBwYV9zdHJlYW1fdW5yZWYocGFfc3RyZWFtICpzKTsKKworLyoqIEluY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnRlciBieSBvbmUgKi8KK3BhX3N0cmVhbSAqcGFfc3RyZWFtX3JlZihwYV9zdHJlYW0gKnMpOworCisvKiogUmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzdHJlYW0gKi8KK3BhX3N0cmVhbV9zdGF0ZV90IHBhX3N0cmVhbV9nZXRfc3RhdGUocGFfc3RyZWFtICpwKTsKKworLyoqIFJldHVybiB0aGUgY29udGV4dCB0aGlzIHN0cmVhbSBpcyBhdHRhY2hlZCB0byAqLworcGFfY29udGV4dCogcGFfc3RyZWFtX2dldF9jb250ZXh0KHBhX3N0cmVhbSAqcCk7CisKKy8qKiBSZXR1cm4gdGhlIHNpbmsgaW5wdXQgcmVzcC4gc291cmNlIG91dHB1dCBpbmRleCB0aGlzIHN0cmVhbSBpcworICogaWRlbnRpZmllZCBpbiB0aGUgc2VydmVyIHdpdGguIFRoaXMgaXMgdXNlZnVsIGZvciB1c2FnZSB3aXRoIHRoZQorICogaW50cm9zcGVjdGlvbiBmdW5jdGlvbnMsIHN1Y2ggYXMgcGFfY29udGV4dF9nZXRfc2lua19pbnB1dF9pbmZvKCkKKyAqIHJlc3AuIHBhX2NvbnRleHRfZ2V0X3NvdXJjZV9vdXRwdXRfaW5mbygpLiAqLwordWludDMyX3QgcGFfc3RyZWFtX2dldF9pbmRleChwYV9zdHJlYW0gKnMpOworCisvKiogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc2luayBvciBzb3VyY2UgdGhpcyBzdHJlYW0gaXMgY29ubmVjdGVkIHRvCisgKiBpbiB0aGUgc2VydmVyLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdXNhZ2Ugd2l0aCB0aGUgaW50cm9zcGVjdGlvbgorICogZnVuY3Rpb25zLCBzdWNoIGFzIHBhX2NvbnRleHRfZ2V0X3NpbmtfaW5mb19ieV9pbmRleCgpCisgKiByZXNwLiBwYV9jb250ZXh0X2dldF9zb3VyY2VfaW5mb19ieV9pbmRleCgpLiBQbGVhc2Ugbm90ZSB0aGF0CisgKiBzdHJlYW1zIG1heSBiZSBtb3ZlZCBiZXR3ZWVuIHNpbmtzL3NvdXJjZXMgYW5kIHRodXMgaXQgaXMKKyAqIHJlY29tbWVuZGVkIHRvIHVzZSBwYV9zdHJlYW1fc2V0X21vdmVkX2NhbGxiYWNrKCkgdG8gYmUgbm90aWZpZWQKKyAqIGFib3V0IHRoaXMuIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gd2l0aCBQQV9FUlJfTk9UU1VQUE9SVEVEIHdoZW4gdGhlCisgKiBzZXJ2ZXIgaXMgb2xkZXIgdGhhbiAwLjkuOC4gXHNpbmNlIDAuOS44ICovCit1aW50MzJfdCBwYV9zdHJlYW1fZ2V0X2RldmljZV9pbmRleChwYV9zdHJlYW0gKnMpOworCisvKiogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzaW5rIG9yIHNvdXJjZSB0aGlzIHN0cmVhbSBpcyBjb25uZWN0ZWQgdG8KKyAqIGluIHRoZSBzZXJ2ZXIuIFRoaXMgaXMgdXNlZnVsIGZvciB1c2FnZSB3aXRoIHRoZSBpbnRyb3NwZWN0aW9uCisgKiBmdW5jdGlvbnMsIHN1Y2ggYXMgcGFfY29udGV4dF9nZXRfc2lua19pbmZvX2J5X25hbWUoKQorICogcmVzcC4gcGFfY29udGV4dF9nZXRfc291cmNlX2luZm9fYnlfbmFtZSgpLiBQbGVhc2Ugbm90ZSB0aGF0CisgKiBzdHJlYW1zIG1heSBiZSBtb3ZlZCBiZXR3ZWVuIHNpbmtzL3NvdXJjZXMgYW5kIHRodXMgaXQgaXMKKyAqIHJlY29tbWVuZGVkIHRvIHVzZSBwYV9zdHJlYW1fc2V0X21vdmVkX2NhbGxiYWNrKCkgdG8gYmUgbm90aWZpZWQKKyAqIGFib3V0IHRoaXMuIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gd2l0aCBQQV9FUlJfTk9UU1VQUE9SVEVEIHdoZW4gdGhlCisgKiBzZXJ2ZXIgaXMgb2xkZXIgdGhhbiAwLjkuOC4gXHNpbmNlIDAuOS44ICovCitjb25zdCBjaGFyICpwYV9zdHJlYW1fZ2V0X2RldmljZV9uYW1lKHBhX3N0cmVhbSAqcyk7CisKKy8qKiBSZXR1cm4gMSBpZiB0aGUgc2luayBvciBzb3VyY2UgdGhpcyBzdHJlYW0gaXMgY29ubmVjdGVkIHRvIGhhcworICogYmVlbiBzdXNwZW5kZWQuIFRoaXMgd2lsbCByZXR1cm4gMCBpZiBub3QsIGFuZCBuZWdhdGl2ZSBvbgorICogZXJyb3IuIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gd2l0aCBQQV9FUlJfTk9UU1VQUE9SVEVEIHdoZW4gdGhlCisgKiBzZXJ2ZXIgaXMgb2xkZXIgdGhhbiAwLjkuOC4gXHNpbmNlIDAuOS44ICovCitpbnQgcGFfc3RyZWFtX2lzX3N1c3BlbmRlZChwYV9zdHJlYW0gKnMpOworCisvKiogUmV0dXJuIDEgaWYgdGhlIHRoaXMgc3RyZWFtIGhhcyBiZWVuIGNvcmtlZC4gVGhpcyB3aWxsIHJldHVybiAwIGlmCisgKiBub3QsIGFuZCBuZWdhdGl2ZSBvbiBlcnJvci4gXHNpbmNlIDAuOS4xMSAqLworaW50IHBhX3N0cmVhbV9pc19jb3JrZWQocGFfc3RyZWFtICpzKTsKKworLyoqIENvbm5lY3QgdGhlIHN0cmVhbSB0byBhIHNpbmsuIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIHBhc3MKKyAqIE5VTEwgaW4gYm90aCBkZXYgYW5kIHZvbHVtZSBhbmQgbm90IHRvIHNldCBlaXRoZXIKKyAqIFBBX1NUUkVBTV9TVEFSVF9NVVRFRCBub3IgUEFfU1RSRUFNX1NUQVJUX1VOTVVURUQgLS0gdW5sZXNzIHRoZXNlCisgKiBvcHRpb25zIGFyZSBkaXJlY3RseSBkZXBlbmRlbnQgb24gdXNlciBpbnB1dCBvciBjb25maWd1cmF0aW9uLiBJZgorICogeW91IGZvbGxvdyB0aGlzIHJ1bGUgdGhlbiB0aGUgc291bmQgc2VydmVyIHdpbGwgaGF2ZSB0aGUgZnVsbAorICogZmxleGliaWxpdHkgdG8gY2hvb3NlIHRoZSBkZXZpY2UsIHZvbHVtZSBhbmQgbXV0ZSBzdGF0dXMKKyAqIGF1dG9tYXRpY2FsbHksIGJhc2VkIG9uIHNlcnZlci1zaWRlIHBvbGljaWVzLCBoZXVyaXN0aWNzIGFuZCBzdG9yZWQKKyAqIGluZm9ybWF0aW9uIGZyb20gcHJldmlvdXMgdXNlcy4gQWxzbyB0aGUgc2VydmVyIG1heSBjaG9vc2UgdG8KKyAqIHJlY29uZmlndXJlIGF1ZGlvIGRldmljZXMgdG8gbWFrZSBvdGhlciBzaW5rcy9zb3VyY2VzIG9yCisgKiBjYXBhYmlsaXRpZXMgYXZhaWxhYmxlIHRvIGJlIGFibGUgdG8gYWNjZXB0IHRoZSBzdHJlYW0uIEJlZm9yZQorICogMC45LjIwIGl0IHdhcyBub3QgZGVmaW5lZCB3aGV0aGVyIHRoZSAndm9sdW1lJyBwYXJhbWV0ZXIgd2FzCisgKiBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgc2luaydzIGN1cnJlbnQgdm9sdW1lIG9yIHRyZWF0ZWQgYXMKKyAqIGFic29sdXRlIGRldmljZSB2b2x1bWUuIFNpbmNlIDAuOS4yMCBpdCBpcyBhbiBhYnNvbHV0ZSB2b2x1bWUgd2hlbgorICogdGhlIHNpbmsgaXMgaW4gZmxhdCB2b2x1bWUgbW9kZSwgYW5kIHJlbGF0aXZlIG90aGVyd2lzZSwgdGh1cworICogbWFraW5nIHN1cmUgdGhlIHZvbHVtZSBwYXNzZWQgaGVyZSBoYXMgYWx3YXlzIHRoZSBzYW1lIHNlbWFudGljcyBhcworICogdGhlIHZvbHVtZSBwYXNzZWQgdG8gcGFfY29udGV4dF9zZXRfc2lua19pbnB1dF92b2x1bWUoKS4gKi8KK2ludCBwYV9zdHJlYW1fY29ubmVjdF9wbGF5YmFjaygKKyAgICAgICAgcGFfc3RyZWFtICpzICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgc3RyZWFtIHRvIGNvbm5lY3QgdG8gYSBzaW5rICovLAorICAgICAgICBjb25zdCBjaGFyICpkZXYgICAgICAgICAgICAgICAvKio8IE5hbWUgb2YgdGhlIHNpbmsgdG8gY29ubmVjdCB0bywgb3IgTlVMTCBmb3IgZGVmYXVsdCAqLyAsCisgICAgICAgIGNvbnN0IHBhX2J1ZmZlcl9hdHRyICphdHRyICAgIC8qKjwgQnVmZmVyaW5nIGF0dHJpYnV0ZXMsIG9yIE5VTEwgZm9yIGRlZmF1bHQgKi8sCisgICAgICAgIHBhX3N0cmVhbV9mbGFnc190IGZsYWdzICAgICAgIC8qKjwgQWRkaXRpb25hbCBmbGFncywgb3IgMCBmb3IgZGVmYXVsdCAqLywKKyAgICAgICAgY29uc3QgcGFfY3ZvbHVtZSAqdm9sdW1lICAgICAgLyoqPCBJbml0aWFsIHZvbHVtZSwgb3IgTlVMTCBmb3IgZGVmYXVsdCAqLywKKyAgICAgICAgcGFfc3RyZWFtICpzeW5jX3N0cmVhbSAgICAgICAgLyoqPCBTeW5jaHJvbml6ZSB0aGlzIHN0cmVhbSB3aXRoIHRoZSBzcGVjaWZpZWQgb25lLCBvciBOVUxMIGZvciBhIHN0YW5kYWxvbmUgc3RyZWFtKi8pOworCisvKiogQ29ubmVjdCB0aGUgc3RyZWFtIHRvIGEgc291cmNlICovCitpbnQgcGFfc3RyZWFtX2Nvbm5lY3RfcmVjb3JkKAorICAgICAgICBwYV9zdHJlYW0gKnMgICAgICAgICAgICAgICAgICAvKio8IFRoZSBzdHJlYW0gdG8gY29ubmVjdCB0byBhIHNvdXJjZSAqLyAsCisgICAgICAgIGNvbnN0IGNoYXIgKmRldiAgICAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGUgc291cmNlIHRvIGNvbm5lY3QgdG8sIG9yIE5VTEwgZm9yIGRlZmF1bHQgKi8sCisgICAgICAgIGNvbnN0IHBhX2J1ZmZlcl9hdHRyICphdHRyICAgIC8qKjwgQnVmZmVyIGF0dHJpYnV0ZXMsIG9yIE5VTEwgZm9yIGRlZmF1bHQgKi8sCisgICAgICAgIHBhX3N0cmVhbV9mbGFnc190IGZsYWdzICAgICAgIC8qKjwgQWRkaXRpb25hbCBmbGFncywgb3IgMCBmb3IgZGVmYXVsdCAqLyk7CisKKy8qKiBEaXNjb25uZWN0IGEgc3RyZWFtIGZyb20gYSBzb3VyY2Uvc2luayAqLworaW50IHBhX3N0cmVhbV9kaXNjb25uZWN0KHBhX3N0cmVhbSAqcyk7CisKKy8qKiBQcmVwYXJlIHdyaXRpbmcgZGF0YSB0byB0aGUgc2VydmVyIChmb3IgcGxheWJhY2sgc3RyZWFtcykuIFRoaXMKKyAqIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIG9wdGltaXplIHRoZSBudW1iZXIgb2YgbWVtb3J5IGNvcGllcyB3aGVuCisgKiBkb2luZyBwbGF5YmFjayAoInplcm8tY29weSIpLiBJdCBpcyByZWNvbW1lbmRlZCB0byBjYWxsIHRoaXMKKyAqIGZ1bmN0aW9uIGJlZm9yZSBlYWNoIGNhbGwgdG8gcGFfc3RyZWFtX3dyaXRlKCkuIFBhc3MgaW4gdGhlIGFkZHJlc3MKKyAqIHRvIGEgcG9pbnRlciBhbmQgYW4gYWRkcmVzcyBvZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHlvdSB3YW50IHRvCisgKiB3cml0ZS4gT24gcmV0dXJuIHRoZSB0d28gdmFsdWVzIHdpbGwgY29udGFpbiBhIHBvaW50ZXIgd2hlcmUgeW91CisgKiBjYW4gcGxhY2UgdGhlIGRhdGEgdG8gd3JpdGUgYW5kIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB5b3UgY2FuCisgKiB3cml0ZS4gT24gcmV0dXJuICpuYnl0ZXMgY2FuIGJlIHNtYWxsZXIgb3IgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcworICogeW91IHBhc3NlZCBpbi4gWW91IG5lZWQgdG8gYmUgYWJsZSB0byBoYW5kbGUgYm90aCBjYXNlcy4gQWNjZXNzaW5nCisgKiBtZW1vcnkgYmV5b25kIHRoZSByZXR1cm5lZCAqbmJ5dGVzIHZhbHVlIGlzIGludmFsaWQuIEFjY2Vzc2luZyB0aGUKKyAqIG1lbW9yeSByZXR1cm5lZCBhZnRlciB0aGUgZm9sbG93aW5nIHBhX3N0cmVhbV93cml0ZSgpIG9yCisgKiBwYV9zdHJlYW1fY2FuY2VsX3dyaXRlKCkgaXMgaW52YWxpZC4gT24gaW52b2NhdGlvbiBvbmx5ICpuYnl0ZXMKKyAqIG5lZWRzIHRvIGJlIGluaXRpYWxpemVkLCBvbiByZXR1cm4gYm90aCAqZGF0YSBhbmQgKm5ieXRlcyB3aWxsIGJlCisgKiB2YWxpZC4gSWYgeW91IHBsYWNlIChzaXplX3QpIC0xIGluICpuYnl0ZXMgb24gaW52b2NhdGlvbiB0aGUgbWVtb3J5CisgKiBzaXplIHdpbGwgYmUgY2hvc2VuIGF1dG9tYXRpY2FsbHkgKHdoaWNoIGlzIHJlY29tbWVuZGVkIHRvCisgKiBkbykuIEFmdGVyIHBsYWNpbmcgeW91ciBkYXRhIGluIHRoZSBtZW1vcnkgYXJlYSByZXR1cm5lZCBjYWxsCisgKiBwYV9zdHJlYW1fd3JpdGUoKSB3aXRoIGRhdGEgc2V0IHRvIGFuIGFkZHJlc3Mgd2l0aGluIHRoaXMgbWVtb3J5CisgKiBhcmVhIGFuZCBhbiBuYnl0ZXMgdmFsdWUgdGhhdCBpcyBzbWFsbGVyIG9yIGVxdWFsIHRvIHdoYXQgd2FzCisgKiByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIHRvIGFjdHVhbGx5IGV4ZWN1dGUgdGhlIHdyaXRlLiBBbgorICogaW52b2NhdGlvbiBvZiBwYV9zdHJlYW1fd3JpdGUoKSBzaG91bGQgZm9sbG93ICJxdWlja2x5IiBvbgorICogcGFfc3RyZWFtX2JlZ2luX3dyaXRlKCkuIEl0IGlzIG5vdCByZWNvbW1lbmRlZCBsZXR0aW5nIGFuIHVuYm91bmRlZAorICogYW1vdW50IG9mIHRpbWUgcGFzcyBhZnRlciBjYWxsaW5nIHBhX3N0cmVhbV9iZWdpbl93cml0ZSgpIGFuZAorICogYmVmb3JlIGNhbGxpbmcgcGFfc3RyZWFtX3dyaXRlKCkuIElmIHlvdSB3YW50IHRvIGNhbmNlbCBhCisgKiBwcmV2aW91c2x5IGNhbGxlZCBwYV9zdHJlYW1fYmVnaW5fd3JpdGUoKSB3aXRob3V0IGNhbGxpbmcKKyAqIHBhX3N0cmVhbV93cml0ZSgpIHVzZSBwYV9zdHJlYW1fY2FuY2VsX3dyaXRlKCkuIENhbGxpbmcKKyAqIHBhX3N0cmVhbV9iZWdpbl93cml0ZSgpIHR3aWNlIHdpdGhvdXQgY2FsbGluZyBwYV9zdHJlYW1fd3JpdGUoKSBvcgorICogcGFfc3RyZWFtX2NhbmNlbF93cml0ZSgpIGluIGJldHdlZW4gd2lsbCByZXR1cm4gZXhhY3RseSB0aGUgc2FtZQorICogcG9pbnRlci9uYnl0ZXMgdmFsdWVzLlxzaW5jZSAwLjkuMTYgKi8KK2ludCBwYV9zdHJlYW1fYmVnaW5fd3JpdGUoCisgICAgICAgIHBhX3N0cmVhbSAqcCwKKyAgICAgICAgdm9pZCAqKmRhdGEsCisgICAgICAgIHNpemVfdCAqbmJ5dGVzKTsKKworLyoqIFJldmVyc2VzIHRoZSBlZmZlY3Qgb2YgcGFfc3RyZWFtX2JlZ2luX3dyaXRlKCkgZHJvcHBpbmcgYWxsIGRhdGEKKyAqIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBwbGFjZWQgaW4gdGhlIG1lbW9yeSBhcmVhIHJldHVybmVkIGJ5CisgKiBwYV9zdHJlYW1fYmVnaW5fd3JpdGUoKS4gT25seSB2YWxpZCB0byBjYWxsIGlmCisgKiBwYV9zdHJlYW1fYmVnaW5fd3JpdGUoKSB3YXMgY2FsbGVkIGJlZm9yZSBhbmQgbmVpdGhlcgorICogcGFfc3RyZWFtX2NhbmNlbF93cml0ZSgpIG5vciBwYV9zdHJlYW1fd3JpdGUoKSBoYXZlIGJlZW4gY2FsbGVkCisgKiB5ZXQuIEFjY2Vzc2luZyB0aGUgbWVtb3J5IHByZXZpb3VzbHkgcmV0dXJuZWQgYnkKKyAqIHBhX3N0cmVhbV9iZWdpbl93cml0ZSgpIGFmdGVyIHRoaXMgY2FsbCBpcyBpbnZhbGlkLiBBbnkgZnVydGhlcgorICogZXhwbGljaXQgZnJlZWluZyBvZiB0aGUgbWVtb3J5IGFyZWEgaXMgbm90IG5lY2Vzc2FyeS4gXHNpbmNlCisgKiAwLjkuMTYgKi8KK2ludCBwYV9zdHJlYW1fY2FuY2VsX3dyaXRlKAorICAgICAgICBwYV9zdHJlYW0gKnApOworCisvKiogV3JpdGUgc29tZSBkYXRhIHRvIHRoZSBzZXJ2ZXIgKGZvciBwbGF5YmFjayBzdHJlYW1zKSwgaWYgZnJlZV9jYgorICogaXMgbm9uLU5VTEwgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIGFsbCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4KKyAqIG91dCBhbmQgYW4gaW50ZXJuYWwgcmVmZXJlbmNlIHRvIHRoZSBzcGVjaWZpZWQgZGF0YSBpcyBrZXB0LCB0aGUKKyAqIGRhdGEgaXMgbm90IGNvcGllZC4gSWYgTlVMTCwgdGhlIGRhdGEgaXMgY29waWVkIGludG8gYW4gaW50ZXJuYWwKKyAqIGJ1ZmZlci4gVGhlIGNsaWVudCBtYXkgZnJlZWx5IHNlZWsgYXJvdW5kIGluIHRoZSBvdXRwdXQgYnVmZmVyLiBGb3IKKyAqIG1vc3QgYXBwbGljYXRpb25zIHBhc3NpbmcgMCBhbmQgUEFfU0VFS19SRUxBVElWRSBhcyBhcmd1bWVudHMgZm9yCisgKiBvZmZzZXQgYW5kIHNlZWsgc2hvdWxkIGJlIHVzZWZ1bC4gQWZ0ZXIgdGhlIHdyaXRlIGNhbGwgc3VjY2VlZGVkCisgKiB0aGUgd3JpdGUgaW5kZXggd2lsbCBiZSBhdCB0aGUgcG9zaXRpb24gYWZ0ZXIgd2hlcmUgdGhpcyBjaHVuayBvZgorICogZGF0YSBoYXMgYmVlbiB3cml0dGVuIHRvLgorICoKKyAqIEFzIGFuIG9wdGltaXphdGlvbiBmb3IgYXZvaWRpbmcgbmVlZGxlc3MgbWVtb3J5IGNvcGllcyB5b3UgbWF5IGNhbGwKKyAqIHBhX3N0cmVhbV9iZWdpbl93cml0ZSgpIGJlZm9yZSB0aGlzIGNhbGwgYW5kIHRoZW4gcGxhY2UgeW91ciBhdWRpbworICogZGF0YSBkaXJlY3RseSBpbiB0aGUgbWVtb3J5IGFyZWEgcmV0dXJuZWQgYnkgdGhhdCBjYWxsLiBUaGVuLCBwYXNzCisgKiBhIHBvaW50ZXIgdG8gdGhhdCBtZW1vcnkgYXJlYSB0byBwYV9zdHJlYW1fd3JpdGUoKS4gQWZ0ZXIgdGhlCisgKiBpbnZvY2F0aW9uIG9mIHBhX3N0cmVhbV93cml0ZSgpIHRoZSBtZW1vcnkgYXJlYSBtYXkgbm8gbG9uZ2VyIGJlCisgKiBhY2Nlc3NlZC4gQW55IGZ1cnRoZXIgZXhwbGljaXQgZnJlZWluZyBvZiB0aGUgbWVtb3J5IGFyZWEgaXMgbm90CisgKiBuZWNlc3NhcnkuIEl0IGlzIE9LIHRvIHdyaXRlIHRoZSBtZW1vcnkgYXJlYSByZXR1cm5lZCBieQorICogcGFfc3RyZWFtX2JlZ2luX3dyaXRlKCkgb25seSBwYXJ0aWFsbHkgd2l0aCB0aGlzIGNhbGwsIHNraXBwaW5nCisgKiBieXRlcyBib3RoIGF0IHRoZSBlbmQgYW5kIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlc2VydmVkIG1lbW9yeQorICogYXJlYS4qLworaW50IHBhX3N0cmVhbV93cml0ZSgKKyAgICAgICAgcGFfc3RyZWFtICpwICAgICAgICAgICAgIC8qKjwgVGhlIHN0cmVhbSB0byB1c2UgKi8sCisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEgICAgICAgICAvKio8IFRoZSBkYXRhIHRvIHdyaXRlICovLAorICAgICAgICBzaXplX3QgbmJ5dGVzICAgICAgICAgICAgLyoqPCBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIHdyaXRlIGluIGJ5dGVzKi8sCisgICAgICAgIHBhX2ZyZWVfY2JfdCBmcmVlX2NiICAgICAvKio8IEEgY2xlYW51cCByb3V0aW5lIGZvciB0aGUgZGF0YSBvciBOVUxMIHRvIHJlcXVlc3QgYW4gaW50ZXJuYWwgY29weSAqLywKKyAgICAgICAgaW50NjRfdCBvZmZzZXQsICAgICAgICAgIC8qKjwgT2Zmc2V0IGZvciBzZWVraW5nLCBtdXN0IGJlIDAgZm9yIHVwbG9hZCBzdHJlYW1zICovCisgICAgICAgIHBhX3NlZWtfbW9kZV90IHNlZWsgICAgICAvKio8IFNlZWsgbW9kZSwgbXVzdCBiZSBQQV9TRUVLX1JFTEFUSVZFIGZvciB1cGxvYWQgc3RyZWFtcyAqLyk7CisKKy8qKiBSZWFkIHRoZSBuZXh0IGZyYWdtZW50IGZyb20gdGhlIGJ1ZmZlciAoZm9yIHJlY29yZGluZyBzdHJlYW1zKS4KKyAqIGRhdGEgd2lsbCBwb2ludCB0byB0aGUgYWN0dWFsIGRhdGEgYW5kIG5ieXRlcyB3aWxsIGNvbnRhaW4gdGhlIHNpemUKKyAqIG9mIHRoZSBkYXRhIGluIGJ5dGVzICh3aGljaCBjYW4gYmUgbGVzcyBvciBtb3JlIHRoYW4gYSBjb21wbGV0ZQorICogZnJhZ21lbnQpLiAgVXNlIHBhX3N0cmVhbV9kcm9wKCkgdG8gYWN0dWFsbHkgcmVtb3ZlIHRoZSBkYXRhIGZyb20KKyAqIHRoZSBidWZmZXIuIElmIG5vIGRhdGEgaXMgYXZhaWxhYmxlIHRoaXMgd2lsbCByZXR1cm4gYSBOVUxMCisgKiBwb2ludGVyICovCitpbnQgcGFfc3RyZWFtX3BlZWsoCisgICAgICAgIHBhX3N0cmVhbSAqcCAgICAgICAgICAgICAgICAgLyoqPCBUaGUgc3RyZWFtIHRvIHVzZSAqLywKKyAgICAgICAgY29uc3Qgdm9pZCAqKmRhdGEgICAgICAgICAgICAvKio8IFBvaW50ZXIgdG8gcG9pbnRlciB0aGF0IHdpbGwgcG9pbnQgdG8gZGF0YSAqLywKKyAgICAgICAgc2l6ZV90ICpuYnl0ZXMgICAgICAgICAgICAgICAvKio8IFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgcmVhZCBpbiBieXRlcyAqLyk7CisKKy8qKiBSZW1vdmUgdGhlIGN1cnJlbnQgZnJhZ21lbnQgb24gcmVjb3JkIHN0cmVhbXMuIEl0IGlzIGludmFsaWQgdG8gZG8gdGhpcyB3aXRob3V0IGZpcnN0CisgKiBjYWxsaW5nIHBhX3N0cmVhbV9wZWVrKCkuICovCitpbnQgcGFfc3RyZWFtX2Ryb3AocGFfc3RyZWFtICpwKTsKKworLyoqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbWF5IGJlIHdyaXR0ZW4gdXNpbmcgcGFfc3RyZWFtX3dyaXRlKCkgKi8KK3NpemVfdCBwYV9zdHJlYW1fd3JpdGFibGVfc2l6ZShwYV9zdHJlYW0gKnApOworCisvKiogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtYXkgYmUgcmVhZCB1c2luZyBwYV9zdHJlYW1fcGVlaygpKi8KK3NpemVfdCBwYV9zdHJlYW1fcmVhZGFibGVfc2l6ZShwYV9zdHJlYW0gKnApOworCisvKiogRHJhaW4gYSBwbGF5YmFjayBzdHJlYW0uICBVc2UgdGhpcyBmb3Igbm90aWZpY2F0aW9uIHdoZW4gdGhlCisgKiBwbGF5YmFjayBidWZmZXIgaXMgZW1wdHkgYWZ0ZXIgcGxheWluZyBhbGwgdGhlIGF1ZGlvIGluIHRoZSBidWZmZXIuCisgKiBQbGVhc2Ugbm90ZSB0aGF0IG9ubHkgb25lIGRyYWluIG9wZXJhdGlvbiBwZXIgc3RyZWFtIG1heSBiZSBpc3N1ZWQKKyAqIGF0IGEgdGltZS4gKi8KK3BhX29wZXJhdGlvbiogcGFfc3RyZWFtX2RyYWluKHBhX3N0cmVhbSAqcywgcGFfc3RyZWFtX3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogUmVxdWVzdCBhIHRpbWluZyBpbmZvIHN0cnVjdHVyZSB1cGRhdGUgZm9yIGEgc3RyZWFtLiBVc2UKKyAqIHBhX3N0cmVhbV9nZXRfdGltaW5nX2luZm8oKSB0byBnZXQgYWNjZXNzIHRvIHRoZSByYXcgdGltaW5nIGRhdGEsCisgKiBvciBwYV9zdHJlYW1fZ2V0X3RpbWUoKSBvciBwYV9zdHJlYW1fZ2V0X2xhdGVuY3koKSB0byBnZXQgY2xlYW5lZAorICogdXAgdmFsdWVzLiAqLworcGFfb3BlcmF0aW9uKiBwYV9zdHJlYW1fdXBkYXRlX3RpbWluZ19pbmZvKHBhX3N0cmVhbSAqcCwgcGFfc3RyZWFtX3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgc3RhdGUgb2YgdGhlIHN0cmVhbSBjaGFuZ2VzICovCit2b2lkIHBhX3N0cmVhbV9zZXRfc3RhdGVfY2FsbGJhY2socGFfc3RyZWFtICpzLCBwYV9zdHJlYW1fbm90aWZ5X2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFNldCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiBuZXcgZGF0YSBtYXkgYmUKKyAqIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbS4gKi8KK3ZvaWQgcGFfc3RyZWFtX3NldF93cml0ZV9jYWxsYmFjayhwYV9zdHJlYW0gKnAsIHBhX3N0cmVhbV9yZXF1ZXN0X2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFNldCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiBuZXcgZGF0YSBpcyBhdmFpbGFibGUgZnJvbSB0aGUgc3RyZWFtLgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4qLwordm9pZCBwYV9zdHJlYW1fc2V0X3JlYWRfY2FsbGJhY2socGFfc3RyZWFtICpwLCBwYV9zdHJlYW1fcmVxdWVzdF9jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gYSBidWZmZXIgb3ZlcmZsb3cgaGFwcGVucy4gKE9ubHkgZm9yIHBsYXliYWNrIHN0cmVhbXMpICovCit2b2lkIHBhX3N0cmVhbV9zZXRfb3ZlcmZsb3dfY2FsbGJhY2socGFfc3RyZWFtICpwLCBwYV9zdHJlYW1fbm90aWZ5X2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFJldHVybiBhdCB3aGF0IHBvc2l0aW9uIHRoZSBsYXRlc3QgdW5kZXJmbG93IG9jY3VycmVkLCBvciAtMSBpZiB0aGlzIGluZm9ybWF0aW9uIGlzIG5vdAorICoga25vd24gKGUgZyBpZiBubyB1bmRlcmZsb3cgaGFzIG9jY3VycmVkLCBvciBzZXJ2ZXIgaXMgb2xkZXIgdGhhbiAxLjApLgorICogQ2FuIGJlIHVzZWQgaW5zaWRlIHRoZSB1bmRlcmZsb3cgY2FsbGJhY2sgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHVuZGVyZmxvdy4KKyAqIChPbmx5IGZvciBwbGF5YmFjayBzdHJlYW1zKSBcc2luY2UgMS4wICovCitpbnQ2NF90IHBhX3N0cmVhbV9nZXRfdW5kZXJmbG93X2luZGV4KHBhX3N0cmVhbSAqcCk7CisKKy8qKiBTZXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gYSBidWZmZXIgdW5kZXJmbG93IGhhcHBlbnMuIChPbmx5IGZvciBwbGF5YmFjayBzdHJlYW1zKSAqLwordm9pZCBwYV9zdHJlYW1fc2V0X3VuZGVyZmxvd19jYWxsYmFjayhwYV9zdHJlYW0gKnAsIHBhX3N0cmVhbV9ub3RpZnlfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIGEgdGhlIHNlcnZlciBzdGFydHMKKyAqIHBsYXliYWNrIGFmdGVyIGFuIHVuZGVycnVuIG9yIG9uIGluaXRpYWwgc3RhcnR1cC4gVGhpcyBvbmx5IGluZm9ybXMKKyAqIHRoYXQgYXVkaW8gaXMgZmxvd2luZyBhZ2FpbiwgaXQgaXMgbm8gaW5kaWNhdGlvbiB0aGF0IGF1ZGlvIHN0YXJ0ZWQKKyAqIHRvIHJlYWNoIHRoZSBzcGVha2VycyBhbHJlYWR5LiAoT25seSBmb3IgcGxheWJhY2sgc3RyZWFtcykuIFxzaW5jZQorICogMC45LjExICovCit2b2lkIHBhX3N0cmVhbV9zZXRfc3RhcnRlZF9jYWxsYmFjayhwYV9zdHJlYW0gKnAsIHBhX3N0cmVhbV9ub3RpZnlfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuZXZlciBhIGxhdGVuY3kKKyAqIGluZm9ybWF0aW9uIHVwZGF0ZSBoYXBwZW5zLiBVc2VmdWwgb24gUEFfU1RSRUFNX0FVVE9fVElNSU5HX1VQREFURQorICogc3RyZWFtcyBvbmx5LiAoT25seSBmb3IgcGxheWJhY2sgc3RyZWFtcykgKi8KK3ZvaWQgcGFfc3RyZWFtX3NldF9sYXRlbmN5X3VwZGF0ZV9jYWxsYmFjayhwYV9zdHJlYW0gKnAsIHBhX3N0cmVhbV9ub3RpZnlfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgc3RyZWFtIGlzCisgKiBtb3ZlZCB0byBhIGRpZmZlcmVudCBzaW5rL3NvdXJjZS4gVXNlIHBhX3N0cmVhbV9nZXRfZGV2aWNlX25hbWUoKW9yCisgKiBwYV9zdHJlYW1fZ2V0X2RldmljZV9pbmRleCgpIHRvIHF1ZXJ5IHRoZSBuZXcgc2luay9zb3VyY2UuIFRoaXMKKyAqIG5vdGlmaWNhdGlvbiBpcyBvbmx5IGdlbmVyYXRlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgYXQgbGVhc3QKKyAqIDAuOS44LiBcc2luY2UgMC45LjggKi8KK3ZvaWQgcGFfc3RyZWFtX3NldF9tb3ZlZF9jYWxsYmFjayhwYV9zdHJlYW0gKnAsIHBhX3N0cmVhbV9ub3RpZnlfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgc2luay9zb3VyY2UKKyAqIHRoaXMgc3RyZWFtIGlzIGNvbm5lY3RlZCB0byBpcyBzdXNwZW5kZWQgb3IgcmVzdW1lZC4gVXNlCisgKiBwYV9zdHJlYW1faXNfc3VzcGVuZGVkKCkgdG8gcXVlcnkgdGhlIG5ldyBzdXNwZW5kIHN0YXR1cy4gUGxlYXNlCisgKiBub3RlIHRoYXQgdGhlIHN1c3BlbmQgc3RhdHVzIG1pZ2h0IGFsc28gY2hhbmdlIHdoZW4gdGhlIHN0cmVhbSBpcworICogbW92ZWQgYmV0d2VlbiBkZXZpY2VzLiBUaHVzIGlmIHlvdSBjYWxsIHRoaXMgZnVuY3Rpb24geW91IHZlcnkKKyAqIGxpa2VseSB3YW50IHRvIGNhbGwgcGFfc3RyZWFtX3NldF9tb3ZlZF9jYWxsYmFjaywgdG9vLiBUaGlzCisgKiBub3RpZmljYXRpb24gaXMgb25seSBnZW5lcmF0ZWQgd2hlbiB0aGUgc2VydmVyIGlzIGF0IGxlYXN0CisgKiAwLjkuOC4gXHNpbmNlIDAuOS44ICovCit2b2lkIHBhX3N0cmVhbV9zZXRfc3VzcGVuZGVkX2NhbGxiYWNrKHBhX3N0cmVhbSAqcCwgcGFfc3RyZWFtX25vdGlmeV9jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW5ldmVyIGEgbWV0YS9wb2xpY3kKKyAqIGNvbnRyb2wgZXZlbnQgaXMgcmVjZWl2ZWQuXHNpbmNlIDAuOS4xNSAqLwordm9pZCBwYV9zdHJlYW1fc2V0X2V2ZW50X2NhbGxiYWNrKHBhX3N0cmVhbSAqcCwgcGFfc3RyZWFtX2V2ZW50X2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFNldCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGJ1ZmZlcgorICogYXR0cmlidXRlcyBvbiB0aGUgc2VydmVyIHNpZGUgY2hhbmdlLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBidWZmZXIKKyAqIGF0dHJpYnV0ZXMgY2FuIGNoYW5nZSB3aGVuIG1vdmluZyBhIHN0cmVhbSB0byBhIGRpZmZlcmVudAorICogc2luay9zb3VyY2UgdG9vLCBoZW5jZSBpZiB5b3UgdXNlIHRoaXMgY2FsbGJhY2sgeW91IHNob3VsZCB1c2UKKyAqIHBhX3N0cmVhbV9zZXRfbW92ZWRfY2FsbGJhY2soKSBhcyB3ZWxsLiBcc2luY2UgMC45LjE1ICovCit2b2lkIHBhX3N0cmVhbV9zZXRfYnVmZmVyX2F0dHJfY2FsbGJhY2socGFfc3RyZWFtICpwLCBwYV9zdHJlYW1fbm90aWZ5X2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFBhdXNlIChvciByZXN1bWUpIHBsYXliYWNrIG9mIHRoaXMgc3RyZWFtIHRlbXBvcmFyaWx5LiBBdmFpbGFibGUKKyAqIG9uIGJvdGggcGxheWJhY2sgYW5kIHJlY29yZGluZyBzdHJlYW1zLiBJZiBiIGlzIDEgdGhlIHN0cmVhbSBpcworICogcGF1c2VkLiBJZiBiIGlzIDAgdGhlIHN0cmVhbSBpcyByZXN1bWVkLiBUaGUgcGF1c2UvcmVzdW1lIG9wZXJhdGlvbgorICogaXMgZXhlY3V0ZWQgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4gSWYgYSBjb3JrIGlzIHZlcnkgcXVpY2tseQorICogZm9sbG93ZWQgYnkgYW4gdW5jb3JrIG9yIHRoZSBvdGhlciB3YXkgcm91bmQgdGhpcyBtaWdodCBub3QKKyAqIGFjdHVhbGx5IGhhdmUgYW55IGVmZmVjdCBvbiB0aGUgc3RyZWFtIHRoYXQgaXMgb3V0cHV0LiBZb3UgY2FuIHVzZQorICogcGFfc3RyZWFtX2lzX2NvcmtlZCgpIHRvIGZpbmQgb3V0IHdoZXRoZXIgdGhlIHN0cmVhbSBpcyBjdXJyZW50bHkKKyAqIHBhdXNlZCBvciBub3QuIE5vcm1hbGx5IGEgc3RyZWFtIHdpbGwgYmUgY3JlYXRlZCBpbiB1bmNvcmtlZAorICogc3RhdGUuIElmIHlvdSBwYXNzIFBBX1NUUkVBTV9TVEFSVF9DT1JLRUQgYXMgZmxhZyBkdXJpbmcgY29ubmVjdGlvbgorICogb2YgdGhlIHN0cmVhbSBpdCB3aWxsIGJlIGNyZWF0ZWQgaW4gY29ya2VkIHN0YXRlLiAqLworcGFfb3BlcmF0aW9uKiBwYV9zdHJlYW1fY29yayhwYV9zdHJlYW0gKnMsIGludCBiLCBwYV9zdHJlYW1fc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBGbHVzaCB0aGUgcGxheWJhY2sgYnVmZmVyIG9mIHRoaXMgc3RyZWFtLiBUaGlzIGRpc2NhcmRzIGFueSBhdWRpbworICogaW4gdGhlIGJ1ZmZlci4gIE1vc3Qgb2YgdGhlIHRpbWUgeW91J3JlIGJldHRlciBvZmYgdXNpbmcgdGhlIHBhcmFtZXRlcgorICogZGVsdGEgb2YgcGFfc3RyZWFtX3dyaXRlKCkgaW5zdGVhZCBvZiB0aGlzIGZ1bmN0aW9uLiBBdmFpbGFibGUgb24gYm90aAorICogcGxheWJhY2sgYW5kIHJlY29yZGluZyBzdHJlYW1zLiAqLworcGFfb3BlcmF0aW9uKiBwYV9zdHJlYW1fZmx1c2gocGFfc3RyZWFtICpzLCBwYV9zdHJlYW1fc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBSZWVuYWJsZSBwcmVidWZmZXJpbmcgYXMgc3BlY2lmaWVkIGluIHRoZSBwYV9idWZmZXJfYXR0cgorICogc3RydWN0dXJlLiBBdmFpbGFibGUgZm9yIHBsYXliYWNrIHN0cmVhbXMgb25seS4gKi8KK3BhX29wZXJhdGlvbiogcGFfc3RyZWFtX3ByZWJ1ZihwYV9zdHJlYW0gKnMsIHBhX3N0cmVhbV9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFJlcXVlc3QgaW1tZWRpYXRlIHN0YXJ0IG9mIHBsYXliYWNrIG9uIHRoaXMgc3RyZWFtLiBUaGlzIGRpc2FibGVzCisgKiBwcmVidWZmZXJpbmcgYXMgc3BlY2lmaWVkIGluIHRoZSBwYV9idWZmZXJfYXR0ciBzdHJ1Y3R1cmUsCisgKiB0ZW1wb3JhcmlseS4gQXZhaWxhYmxlIGZvciBwbGF5YmFjayBzdHJlYW1zIG9ubHkuICovCitwYV9vcGVyYXRpb24qIHBhX3N0cmVhbV90cmlnZ2VyKHBhX3N0cmVhbSAqcywgcGFfc3RyZWFtX3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogUmVuYW1lIHRoZSBzdHJlYW0uICovCitwYV9vcGVyYXRpb24qIHBhX3N0cmVhbV9zZXRfbmFtZShwYV9zdHJlYW0gKnMsIGNvbnN0IGNoYXIgKm5hbWUsIHBhX3N0cmVhbV9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFJldHVybiB0aGUgY3VycmVudCBwbGF5YmFjay9yZWNvcmRpbmcgdGltZS4gVGhpcyBpcyBiYXNlZCBvbiB0aGUKKyAqIGRhdGEgaW4gdGhlIHRpbWluZyBpbmZvIHN0cnVjdHVyZSByZXR1cm5lZCBieQorICogcGFfc3RyZWFtX2dldF90aW1pbmdfaW5mbygpLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCB1c3VhbGx5IG9ubHkgcmV0dXJuIG5ldyBkYXRhIGlmIGEgdGltaW5nIGluZm8KKyAqIHVwZGF0ZSBoYXMgYmVlbiByZWNlaXZlZC4gT25seSBpZiB0aW1pbmcgaW50ZXJwb2xhdGlvbiBoYXMgYmVlbgorICogcmVxdWVzdGVkIChQQV9TVFJFQU1fSU5URVJQT0xBVEVfVElNSU5HKSB0aGUgZGF0YSBmcm9tIHRoZSBsYXN0CisgKiB0aW1pbmcgdXBkYXRlIGlzIHVzZWQgZm9yIGFuIGVzdGltYXRpb24gb2YgdGhlIGN1cnJlbnQKKyAqIHBsYXliYWNrL3JlY29yZGluZyB0aW1lIGJhc2VkIG9uIHRoZSBsb2NhbCB0aW1lIHRoYXQgcGFzc2VkIHNpbmNlCisgKiB0aGUgdGltaW5nIGluZm8gc3RydWN0dXJlIGhhcyBiZWVuIGFjcXVpcmVkLgorICoKKyAqIFRoZSB0aW1lIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gaXMgZ3VhcmFudGVlZCB0byBpbmNyZWFzZQorICogbW9ub3RvbmljYWxseS4gICh0aGF0IG1lYW5zOiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgYWx3YXlzIGdyZWF0ZXIKKyAqIG9yIGVxdWFsIHRvIHRoZSB2YWx1ZSByZXR1cm5lZCBvbiB0aGUgbGFzdCBjYWxsKS4gVGhpcyBiZWhhdmlvdXIKKyAqIGNhbiBiZSBkaXNhYmxlZCBieSB1c2luZyBQQV9TVFJFQU1fTk9UX01PTk9UT05JQy4gVGhpcyBtYXkgYmUKKyAqIGRlc2lyYWJsZSB0byBkZWFsIGJldHRlciB3aXRoIGJhZCBlc3RpbWF0aW9ucyBvZiB0cmFuc3BvcnQKKyAqIGxhdGVuY2llcywgYnV0IG1heSBoYXZlIHN0cmFuZ2UgZWZmZWN0cyBpZiB0aGUgYXBwbGljYXRpb24gaXMgbm90CisgKiBhYmxlIHRvIGRlYWwgd2l0aCB0aW1lIGdvaW5nICdiYWNrd2FyZHMnLgorICoKKyAqIFRoZSB0aW1lIGludGVycG9sYXRvciBhY3RpdmF0ZWQgYnkgUEFfU1RSRUFNX0lOVEVSUE9MQVRFX1RJTUlORworICogZmF2b3VycyAnc21vb3RoJyB0aW1lIGdyYXBocyBvdmVyIGFjY3VyYXRlIG9uZXMgdG8gaW1wcm92ZSB0aGUKKyAqIHNtb290aG5lc3Mgb2YgVUkgb3BlcmF0aW9ucyB0aGF0IGFyZSB0aWVkIHRvIHRoZSBhdWRpbyBjbG9jay4gSWYKKyAqIGFjY3VyYWN5IGlzIG1vcmUgaW1wb3J0YW50IHRvIHlvdSB5b3UgbWlnaHQgbmVlZCB0byBlc3RpbWF0ZSB5b3VyCisgKiB0aW1pbmcgYmFzZWQgb24gdGhlIGRhdGEgZnJvbSBwYV9zdHJlYW1fZ2V0X3RpbWluZ19pbmZvKCkgeW91cnNlbGYKKyAqIG9yIG5vdCB3b3JrIHdpdGggaW50ZXJwb2xhdGVkIHRpbWluZyBhdCBhbGwgYW5kIGluc3RlYWQgYWx3YXlzCisgKiBxdWVyeSBvbiB0aGUgc2VydmVyIHNpZGUgZm9yIHRoZSBtb3N0IHVwIHRvIGRhdGUgdGltaW5nIHdpdGgKKyAqIHBhX3N0cmVhbV91cGRhdGVfdGltaW5nX2luZm8oKS4KKyAqCisgKiBJZiBubyB0aW1pbmcgaW5mb3JtYXRpb24gaGFzIGJlZW4KKyAqIHJlY2VpdmVkIHlldCB0aGlzIGNhbGwgd2lsbCByZXR1cm4gUEFfRVJSX05PREFUQS4gRm9yIG1vcmUgZGV0YWlscworICogc2VlIHBhX3N0cmVhbV9nZXRfdGltaW5nX2luZm8oKS4gKi8KK2ludCBwYV9zdHJlYW1fZ2V0X3RpbWUocGFfc3RyZWFtICpzLCBwYV91c2VjX3QgKnJfdXNlYyk7CisKKy8qKiBSZXR1cm4gdGhlIHRvdGFsIHN0cmVhbSBsYXRlbmN5LiBUaGlzIGZ1bmN0aW9uIGlzIGJhc2VkIG9uCisgKiBwYV9zdHJlYW1fZ2V0X3RpbWUoKS4KKyAqCisgKiBJbiBjYXNlIHRoZSBzdHJlYW0gaXMgYSBtb25pdG9yaW5nIHN0cmVhbSB0aGUgcmVzdWx0IGNhbiBiZQorICogbmVnYXRpdmUsIGkuZS4gdGhlIGNhcHR1cmVkIHNhbXBsZXMgYXJlIG5vdCB5ZXQgcGxheWVkLiBJbiB0aGlzCisgKiBjYXNlICpuZWdhdGl2ZSBpcyBzZXQgdG8gMS4KKyAqCisgKiBJZiBubyB0aW1pbmcgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgeWV0IHRoaXMgY2FsbCB3aWxsCisgKiByZXR1cm4gUEFfRVJSX05PREFUQS4gRm9yIG1vcmUgZGV0YWlscyBzZWUKKyAqIHBhX3N0cmVhbV9nZXRfdGltaW5nX2luZm8oKSBhbmQgcGFfc3RyZWFtX2dldF90aW1lKCkuICovCitpbnQgcGFfc3RyZWFtX2dldF9sYXRlbmN5KHBhX3N0cmVhbSAqcywgcGFfdXNlY190ICpyX3VzZWMsIGludCAqbmVnYXRpdmUpOworCisvKiogUmV0dXJuIHRoZSBsYXRlc3QgcmF3IHRpbWluZyBkYXRhIHN0cnVjdHVyZS4gVGhlIHJldHVybmVkIHBvaW50ZXIKKyAqIHBvaW50cyB0byBhbiBpbnRlcm5hbCByZWFkLW9ubHkgaW5zdGFuY2Ugb2YgdGhlIHRpbWluZworICogc3RydWN0dXJlLiBUaGUgdXNlciBzaG91bGQgbWFrZSBhIGNvcHkgb2YgdGhpcyBzdHJ1Y3R1cmUgaWYgaGUKKyAqIHdhbnRzIHRvIG1vZGlmeSBpdC4gQW4gaW4tcGxhY2UgdXBkYXRlIHRvIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgbWF5CisgKiBiZSByZXF1ZXN0ZWQgdXNpbmcgcGFfc3RyZWFtX3VwZGF0ZV90aW1pbmdfaW5mbygpLgorICoKKyAqIElmIG5vIHRpbWluZyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZWNlaXZlZCBiZWZvcmUgKGkuZS4gYnkKKyAqIHJlcXVlc3RpbmcgcGFfc3RyZWFtX3VwZGF0ZV90aW1pbmdfaW5mbygpIG9yIGJ5IHVzaW5nCisgKiBQQV9TVFJFQU1fQVVUT19USU1JTkdfVVBEQVRFKSwgdGhpcyBmdW5jdGlvbiB3aWxsIGZhaWwgd2l0aAorICogUEFfRVJSX05PREFUQS4KKyAqCisgKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSB3cml0ZV9pbmRleCBtZW1iZXIgZmllbGQgKGFuZCBvbmx5IHRoaXMgZmllbGQpCisgKiBpcyB1cGRhdGVkIG9uIGVhY2ggcGFfc3RyZWFtX3dyaXRlKCkgY2FsbCwgbm90IGp1c3Qgd2hlbiBhIHRpbWluZworICogdXBkYXRlIGhhcyBiZWVuIHJlY2VpdmVkLiAqLworY29uc3QgcGFfdGltaW5nX2luZm8qIHBhX3N0cmVhbV9nZXRfdGltaW5nX2luZm8ocGFfc3RyZWFtICpzKTsKKworLyoqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSdzIHNhbXBsZSBzcGVjaWZpY2F0aW9uLiAqLworY29uc3QgcGFfc2FtcGxlX3NwZWMqIHBhX3N0cmVhbV9nZXRfc2FtcGxlX3NwZWMocGFfc3RyZWFtICpzKTsKKworLyoqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSdzIGNoYW5uZWwgbWFwLiAqLworY29uc3QgcGFfY2hhbm5lbF9tYXAqIHBhX3N0cmVhbV9nZXRfY2hhbm5lbF9tYXAocGFfc3RyZWFtICpzKTsKKworLyoqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSdzIGZvcm1hdCBcc2luY2UgMS4wICovCitjb25zdCBwYV9mb3JtYXRfaW5mbyogcGFfc3RyZWFtX2dldF9mb3JtYXRfaW5mbyhwYV9zdHJlYW0gKnMpOworCisvKiogUmV0dXJuIHRoZSBwZXItc3RyZWFtIHNlcnZlci1zaWRlIGJ1ZmZlciBtZXRyaWNzIG9mIHRoZQorICogc3RyZWFtLiBPbmx5IHZhbGlkIGFmdGVyIHRoZSBzdHJlYW0gaGFzIGJlZW4gY29ubmVjdGVkIHN1Y2Nlc3NmdWxseQorICogYW5kIGlmIHRoZSBzZXJ2ZXIgaXMgYXQgbGVhc3QgUHVsc2VBdWRpbyAwLjkuIFRoaXMgd2lsbCByZXR1cm4gdGhlCisgKiBhY3R1YWwgY29uZmlndXJlZCBidWZmZXJpbmcgbWV0cmljcywgd2hpY2ggbWF5IGRpZmZlciBmcm9tIHdoYXQgd2FzCisgKiByZXF1ZXN0ZWQgZHVyaW5nIHBhX3N0cmVhbV9jb25uZWN0X3JlY29yZCgpIG9yCisgKiBwYV9zdHJlYW1fY29ubmVjdF9wbGF5YmFjaygpLiBUaGlzIGNhbGwgd2lsbCBhbHdheXMgcmV0dXJuIHRoZQorICogYWN0dWFsbHkgcGVyLXN0cmVhbSBzZXJ2ZXItc2lkZSBidWZmZXIgbWV0cmljcywgcmVnYXJkbGVzcyB3aGV0aGVyCisgKiBQQV9TVFJFQU1fQURKVVNUX0xBVEVOQ1kgaXMgc2V0IG9yIG5vdC4gXHNpbmNlIDAuOS4wICovCitjb25zdCBwYV9idWZmZXJfYXR0ciogcGFfc3RyZWFtX2dldF9idWZmZXJfYXR0cihwYV9zdHJlYW0gKnMpOworCisvKiogQ2hhbmdlIHRoZSBidWZmZXIgbWV0cmljcyBvZiB0aGUgc3RyZWFtIGR1cmluZyBwbGF5YmFjay4gVGhlCisgKiBzZXJ2ZXIgbWlnaHQgaGF2ZSBjaG9zZW4gZGlmZmVyZW50IGJ1ZmZlciBtZXRyaWNzIHRoZW4KKyAqIHJlcXVlc3RlZC4gVGhlIHNlbGVjdGVkIG1ldHJpY3MgbWF5IGJlIHF1ZXJpZWQgd2l0aAorICogcGFfc3RyZWFtX2dldF9idWZmZXJfYXR0cigpIGFzIHNvb24gYXMgdGhlIGNhbGxiYWNrIGlzIGNhbGxlZC4gT25seQorICogdmFsaWQgYWZ0ZXIgdGhlIHN0cmVhbSBoYXMgYmVlbiBjb25uZWN0ZWQgc3VjY2Vzc2Z1bGx5IGFuZCBpZiB0aGUKKyAqIHNlcnZlciBpcyBhdCBsZWFzdCBQdWxzZUF1ZGlvIDAuOS44LiBQbGVhc2UgYmUgYXdhcmUgb2YgdGhlCisgKiBzbGlnaHRseSBkaWZmZXJlbnQgc2VtYW50aWNzIG9mIHRoZSBjYWxsIGRlcGVuZGluZyB3aGV0aGVyCisgKiBQQV9TVFJFQU1fQURKVVNUX0xBVEVOQ1kgaXMgc2V0IG9yIG5vdC4gXHNpbmNlIDAuOS44ICovCitwYV9vcGVyYXRpb24gKnBhX3N0cmVhbV9zZXRfYnVmZmVyX2F0dHIocGFfc3RyZWFtICpzLCBjb25zdCBwYV9idWZmZXJfYXR0ciAqYXR0ciwgcGFfc3RyZWFtX3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQ2hhbmdlIHRoZSBzdHJlYW0gc2FtcGxpbmcgcmF0ZSBkdXJpbmcgcGxheWJhY2suIFlvdSBuZWVkIHRvIHBhc3MKKyAqIFBBX1NUUkVBTV9WQVJJQUJMRV9SQVRFIGluIHRoZSBmbGFncyBwYXJhbWV0ZXIgb2YKKyAqIHBhX3N0cmVhbV9jb25uZWN0Xy4uLigpIGlmIHlvdSBwbGFuIHRvIHVzZSB0aGlzIGZ1bmN0aW9uLiBPbmx5IHZhbGlkCisgKiBhZnRlciB0aGUgc3RyZWFtIGhhcyBiZWVuIGNvbm5lY3RlZCBzdWNjZXNzZnVsbHkgYW5kIGlmIHRoZSBzZXJ2ZXIKKyAqIGlzIGF0IGxlYXN0IFB1bHNlQXVkaW8gMC45LjguIFxzaW5jZSAwLjkuOCAqLworcGFfb3BlcmF0aW9uICpwYV9zdHJlYW1fdXBkYXRlX3NhbXBsZV9yYXRlKHBhX3N0cmVhbSAqcywgdWludDMyX3QgcmF0ZSwgcGFfc3RyZWFtX3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogVXBkYXRlIHRoZSBwcm9wZXJ0eSBsaXN0IG9mIHRoZSBzaW5rIGlucHV0L3NvdXJjZSBvdXRwdXQgb2YgdGhpcworICogc3RyZWFtLCBhZGRpbmcgbmV3IGVudHJpZXMuIFBsZWFzZSBub3RlIHRoYXQgaXQgaXMgaGlnaGx5CisgKiByZWNvbW1lbmRlZCB0byBzZXQgYXMgbXVjaCBwcm9wZXJ0aWVzIGluaXRpYWxseSB2aWEKKyAqIHBhX3N0cmVhbV9uZXdfd2l0aF9wcm9wbGlzdCgpIGFzIHBvc3NpYmxlIGluc3RlYWQgYSBwb3N0ZXJpb3JpIHdpdGgKKyAqIHRoaXMgZnVuY3Rpb24sIHNpbmNlIHRoYXQgaW5mb3JtYXRpb24gbWF5IHRoZW4gYmUgdXNlZCB0byByb3V0ZQorICogdGhpcyBzdHJlYW0gdG8gdGhlIHJpZ2h0IGRldmljZS4gXHNpbmNlIDAuOS4xMSAqLworcGFfb3BlcmF0aW9uICpwYV9zdHJlYW1fcHJvcGxpc3RfdXBkYXRlKHBhX3N0cmVhbSAqcywgcGFfdXBkYXRlX21vZGVfdCBtb2RlLCBwYV9wcm9wbGlzdCAqcCwgcGFfc3RyZWFtX3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogVXBkYXRlIHRoZSBwcm9wZXJ0eSBsaXN0IG9mIHRoZSBzaW5rIGlucHV0L3NvdXJjZSBvdXRwdXQgb2YgdGhpcworICogc3RyZWFtLCByZW1vdmUgZW50cmllcy4gXHNpbmNlIDAuOS4xMSAqLworcGFfb3BlcmF0aW9uICpwYV9zdHJlYW1fcHJvcGxpc3RfcmVtb3ZlKHBhX3N0cmVhbSAqcywgY29uc3QgY2hhciAqY29uc3Qga2V5c1tdLCBwYV9zdHJlYW1fc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBGb3IgcmVjb3JkIHN0cmVhbXMgY29ubmVjdGVkIHRvIGEgbW9uaXRvciBzb3VyY2U6IG1vbml0b3Igb25seSBhCisgKiB2ZXJ5IHNwZWNpZmljIHNpbmsgaW5wdXQgb2YgdGhlIHNpbmsuIFRodXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUKKyAqIGNhbGxlZCBiZWZvcmUgcGFfc3RyZWFtX2Nvbm5lY3RfcmVjb3JkKCkgaXMgY2FsbGVkLiBcc2luY2UKKyAqIDAuOS4xMSAqLworaW50IHBhX3N0cmVhbV9zZXRfbW9uaXRvcl9zdHJlYW0ocGFfc3RyZWFtICpzLCB1aW50MzJfdCBzaW5rX2lucHV0X2lkeCk7CisKKy8qKiBSZXR1cm4gdGhlIHNpbmsgaW5wdXQgaW5kZXggcHJldmlvdXNseSBzZXQgd2l0aAorICogcGFfc3RyZWFtX3NldF9tb25pdG9yX3N0cmVhbSgpLgorICogXHNpbmNlIDAuOS4xMSAqLwordWludDMyX3QgcGFfc3RyZWFtX2dldF9tb25pdG9yX3N0cmVhbShwYV9zdHJlYW0gKnMpOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9zdWJzY3JpYmUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvc3Vic2NyaWJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY3YTg4NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvc3Vic2NyaWJlLmgKQEAgLTAsMCArMSw4NiBAQAorI2lmbmRlZiBmb29zdWJzY3JpYmVoZm9vCisjZGVmaW5lIGZvb3N1YnNjcmliZWhmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8cHVsc2UvZGVmLmg+CisjaW5jbHVkZSA8cHVsc2UvY29udGV4dC5oPgorI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisjaW5jbHVkZSA8cHVsc2UvdmVyc2lvbi5oPgorCisvKiogXHBhZ2Ugc3Vic2NyaWJlIEV2ZW50IFN1YnNjcmlwdGlvbgorICoKKyAqIFxzZWN0aW9uIG92ZXJ2X3NlYyBPdmVydmlldworICoKKyAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gYmUgbm90aWZpZWQsIGFzeW5jaHJvbm91c2x5LCB3aGVuZXZlciB0aGUgaW50ZXJuYWwKKyAqIGxheW91dCBvZiB0aGUgc2VydmVyIGNoYW5nZXMuIFBvc3NpYmxlIG5vdGlmaWNhdGlvbnMgYXJlIGRlc2NyaWJlZCBpbiB0aGUKKyAqIFxyZWYgcGFfc3Vic2NyaXB0aW9uX2V2ZW50X3R5cGUgYW5kIFxyZWYgcGFfc3Vic2NyaXB0aW9uX21hc2sKKyAqIGVudW1lcmF0aW9ucy4KKyAqCisgKiBUaGUgYXBwbGljYXRpb24gc2V0cyB0aGUgbm90aWZpY2F0aW9uIG1hc2sgdXNpbmcgcGFfY29udGV4dF9zdWJzY3JpYmUoKQorICogYW5kIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIGEgbm90aWZpY2F0aW9uIG9jY3VycyB1c2luZworICogcGFfY29udGV4dF9zZXRfc3Vic2NyaWJlX2NhbGxiYWNrKCkuCisgKgorICogVGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdpdGggYSBccmVmIHBhX3N1YnNjcmlwdGlvbl9ldmVudF90eXBlX3QKKyAqIHJlcHJlc2VudGluZyB0aGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhlIGNhbGxiYWNrLiBDbGllbnRzIGNhbiBleGFtaW5lIHdoYXQKKyAqIG9iamVjdCBjaGFuZ2VkIHVzaW5nIFxyZWYgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX0ZBQ0lMSVRZX01BU0suIFRoZSBhY3R1YWwKKyAqIGV2ZW50IHR5cGUgY2FuIHRoZW4gYmUgZXh0cmFjdGVkIHdpdGggXHJlZiBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfVFlQRV9NQVNLLgorICogUGxlYXNlIG5vdGUgdGhhdCB0aGUgbWFza2VkIHZhbHVlcyBhcmUgaW50ZWdlcnMsIG5vdCBmbGFncyAoc28geW91IHdpbGwKKyAqIGNoZWNrIHRoZSBvYmplY3QvZXZlbnQgdHlwZSB1c2luZyBhIGNvbXBhcmlzb24gbm90IGEgYmluYXJ5IEFORCkuIEZvcgorICogZXhhbXBsZSwgdGhlIGNhbGxiYWNrIG1pZ2h0IGxvb2sgc29tZXRoaW5nIGxpa2U6CisgKgorQHZlcmJhdGltCit2b2lkIG15X3N1YnNjcmlwdGlvbl9jYWxsYmFjayhwYV9jb250ZXh0ICpjLCBwYV9zdWJzY3JpcHRpb25fZXZlbnRfdHlwZV90IHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpZHgsIHZvaWQgKnVzZXJkYXRhKQoreworICAgIGlmICgodCAmIFBBX1NVQlNDUklQVElPTl9FVkVOVF9GQUNJTElUWV9NQVNLKSA9PSBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU09VUkNFKSB7CisgICAgICAgIGlmICgodCAmIFBBX1NVQlNDUklQVElPTl9FVkVOVF9UWVBFX01BU0spID09IFBBX1NVQlNDUklQVElPTl9FVkVOVF9ORVcpIHsKKyAgICAgICAgICAgIC4uLiBhIHNvdXJjZSB3YXMgYWRkZWQsIGxldCdzIGRvIHN0dWZmISAuLi4KKyAgICAgICAgfQorICAgIH0KK30KK0BlbmR2ZXJiYXRpbQorICovCisKKy8qKiBcZmlsZQorICogRGFlbW9uIGludHJvc3BlY3Rpb24gZXZlbnQgc3Vic2NyaXB0aW9uIHN1YnN5c3RlbS4KKyAqCisgKiBTZWUgYWxzbyBcc3VicGFnZSBzdWJzY3JpYmUKKyAqLworCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIFN1YnNjcmlwdGlvbiBldmVudCBjYWxsYmFjayBwcm90b3R5cGUgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2NvbnRleHRfc3Vic2NyaWJlX2NiX3QpKHBhX2NvbnRleHQgKmMsIHBhX3N1YnNjcmlwdGlvbl9ldmVudF90eXBlX3QgdCwgdWludDMyX3QgaWR4LCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBFbmFibGUgZXZlbnQgbm90aWZpY2F0aW9uICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc3Vic2NyaWJlKHBhX2NvbnRleHQgKmMsIHBhX3N1YnNjcmlwdGlvbl9tYXNrX3QgbSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFNldCB0aGUgY29udGV4dCBzcGVjaWZpYyBjYWxsIGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHN0YXRlIG9mIHRoZSBkYWVtb24gY2hhbmdlcyAqLwordm9pZCBwYV9jb250ZXh0X3NldF9zdWJzY3JpYmVfY2FsbGJhY2socGFfY29udGV4dCAqYywgcGFfY29udGV4dF9zdWJzY3JpYmVfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS90aHJlYWQtbWFpbmxvb3AuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvdGhyZWFkLW1haW5sb29wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkxMTIyOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvdGhyZWFkLW1haW5sb29wLmgKQEAgLTAsMCArMSwzMTUgQEAKKyNpZm5kZWYgZm9vdGhyZWFkbWFpbmxvb3BoZm9vCisjZGVmaW5lIGZvb3RocmVhZG1haW5sb29waGZvbworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxwdWxzZS9tYWlubG9vcC1hcGkuaD4KKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL3ZlcnNpb24uaD4KKworUEFfQ19ERUNMX0JFR0lOCisKKy8qKiBccGFnZSB0aHJlYWRlZF9tYWlubG9vcCBUaHJlYWRlZCBNYWluIExvb3AKKyAqCisgKiBcc2VjdGlvbiBvdmVydl9zZWMgT3ZlcnZpZXcKKyAqCisgKiBUaGUgdGhyZWFkZWQgbWFpbiBsb29wIGltcGxlbWVudGF0aW9uIGlzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSBwcmltYXJ5CisgKiBtYWluIGxvb3AgaW1wbGVtZW50YXRpb24gKHNlZSBccmVmIG1haW5sb29wKS4gRm9yIHRoZSBiYXNpYyBkZXNpZ24sIHNlZQorICogaXRzIGRvY3VtZW50YXRpb24uCisgKgorICogVGhlIGFkZGVkIGZlYXR1cmUgaW4gdGhlIHRocmVhZGVkIG1haW4gbG9vcCBpcyB0aGF0IGl0IHNwYXducyBhIG5ldyB0aHJlYWQKKyAqIHRoYXQgcnVucyB0aGUgcmVhbCBtYWluIGxvb3AuIFRoaXMgYWxsb3dzIGEgc3luY2hyb25vdXMgYXBwbGljYXRpb24gdG8gdXNlCisgKiB0aGUgYXN5bmNocm9ub3VzIEFQSSB3aXRob3V0IHJpc2tpbmcgdG8gc3RhbGwgdGhlIFB1bHNlQXVkaW8gbGlicmFyeS4KKyAqCisgKiBcc2VjdGlvbiBjcmVhdF9zZWMgQ3JlYXRpb24KKyAqCisgKiBBIHBhX3RocmVhZGVkX21haW5sb29wIG9iamVjdCBpcyBjcmVhdGVkIHVzaW5nIHBhX3RocmVhZGVkX21haW5sb29wX25ldygpLgorICogVGhpcyB3aWxsIG9ubHkgYWxsb2NhdGUgdGhlIHJlcXVpcmVkIHN0cnVjdHVyZXMgdGhvdWdoLCBzbyB0byB1c2UgaXQgdGhlCisgKiB0aHJlYWQgbXVzdCBhbHNvIGJlIHN0YXJ0ZWQuIFRoaXMgaXMgZG9uZSB0aHJvdWdoCisgKiBwYV90aHJlYWRlZF9tYWlubG9vcF9zdGFydCgpLCBhZnRlciB3aGljaCB5b3UgY2FuIHN0YXJ0IHVzaW5nIHRoZSBtYWluIGxvb3AuCisgKgorICogXHNlY3Rpb24gZGVzdHJfc2VjIERlc3RydWN0aW9uCisgKgorICogV2hlbiB0aGUgUHVsc2VBdWRpbyBjb25uZWN0aW9uIGhhcyBiZWVuIHRlcm1pbmF0ZWQsIHRoZSB0aHJlYWQgbXVzdCBiZQorICogc3RvcHBlZCBhbmQgdGhlIHJlc291cmNlcyBmcmVlZC4gU3RvcHBpbmcgdGhlIHRocmVhZCBpcyBkb25lIHVzaW5nCisgKiBwYV90aHJlYWRlZF9tYWlubG9vcF9zdG9wKCksIHdoaWNoIG11c3QgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIGxvY2sgKHNlZQorICogYmVsb3cpIGhlbGQuIFdoZW4gdGhhdCBmdW5jdGlvbiByZXR1cm5zLCB0aGUgdGhyZWFkIGlzIHN0b3BwZWQgYW5kIHRoZQorICogcGFfdGhyZWFkZWRfbWFpbmxvb3Agb2JqZWN0IGNhbiBiZSBmcmVlZCB1c2luZyBwYV90aHJlYWRlZF9tYWlubG9vcF9mcmVlKCkuCisgKgorICogXHNlY3Rpb24gbG9ja19zZWMgTG9ja2luZworICoKKyAqIFNpbmNlIHRoZSBQdWxzZUF1ZGlvIEFQSSBkb2Vzbid0IGFsbG93IGNvbmN1cnJlbnQgYWNjZXNzZXMgdG8gb2JqZWN0cywKKyAqIGEgbG9ja2luZyBzY2hlbWUgbXVzdCBiZSB1c2VkIHRvIGd1YXJhbnRlZSBzYWZlIHVzYWdlLiBUaGUgdGhyZWFkZWQgbWFpbgorICogbG9vcCBBUEkgcHJvdmlkZXMgc3VjaCBhIHNjaGVtZSB0aHJvdWdoIHRoZSBmdW5jdGlvbnMKKyAqIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2soKSBhbmQgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrKCkuCisgKgorICogVGhlIGxvY2sgaXMgcmVjdXJzaXZlLCBzbyBpdCdzIHNhZmUgdG8gdXNlIGl0IG11bHRpcGxlIHRpbWVzIGZyb20gdGhlIHNhbWUKKyAqIHRocmVhZC4gSnVzdCBtYWtlIHN1cmUgeW91IGNhbGwgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrKCkgdGhlIHNhbWUKKyAqIG51bWJlciBvZiB0aW1lcyB5b3UgY2FsbGVkIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2soKS4KKyAqCisgKiBUaGUgbG9jayBuZWVkcyB0byBiZSBoZWxkIHdoZW5ldmVyIHlvdSBjYWxsIGFueSBQdWxzZUF1ZGlvIGZ1bmN0aW9uIHRoYXQKKyAqIHVzZXMgYW4gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1haW4gbG9vcC4gTWFrZSBzdXJlIHlvdSBkbyBub3QgaG9sZAorICogb24gdG8gdGhlIGxvY2sgbW9yZSB0aGFuIG5lY2Vzc2FyeSB0aG91Z2gsIGFzIHRoZSB0aHJlYWRlZCBtYWluIGxvb3Agc3RvcHMKKyAqIHdoaWxlIHRoZSBsb2NrIGlzIGhlbGQuCisgKgorICogRXhhbXBsZToKKyAqCisgKiBcY29kZQorICogdm9pZCBteV9jaGVja19zdHJlYW1fZnVuYyhwYV90aHJlYWRlZF9tYWlubG9vcCAqbSwgcGFfc3RyZWFtICpzKSB7CisgKiAgICAgcGFfc3RyZWFtX3N0YXRlX3Qgc3RhdGU7CisgKgorICogICAgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sobSk7CisgKgorICogICAgIHN0YXRlID0gcGFfc3RyZWFtX2dldF9zdGF0ZShzKTsKKyAqCisgKiAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrKG0pOworICoKKyAqICAgICBpZiAoc3RhdGUgPT0gUEFfU1RSRUFNX1JFQURZKQorICogICAgICAgICBwcmludGYoIlN0cmVhbSBpcyByZWFkeSEiKTsKKyAqICAgICBlbHNlCisgKiAgICAgICAgIHByaW50ZigiU3RyZWFtIGlzIG5vdCByZWFkeSEiKTsKKyAqIH0KKyAqIFxlbmRjb2RlCisgKgorICogXHNlY3Rpb24gY2Jfc2VjIENhbGxiYWNrcworICoKKyAqIENhbGxiYWNrcyBpbiBQdWxzZUF1ZGlvIGFyZSBhc3luY2hyb25vdXMsIHNvIHRoZXkgcmVxdWlyZSBleHRyYSBjYXJlIHdoZW4KKyAqIHVzaW5nIHRoZW0gdG9nZXRoZXIgd2l0aCBhIHRocmVhZGVkIG1haW4gbG9vcC4KKyAqCisgKiBUaGUgZWFzaWVzdCB3YXkgdG8gdHVybiB0aGUgY2FsbGJhY2sgYmFzZWQgb3BlcmF0aW9ucyBpbnRvIHN5bmNocm9ub3VzCisgKiBvbmVzLCBpcyB0byBzaW1wbHkgd2FpdCBmb3IgdGhlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBhbmQgY29udGludWUgZnJvbQorICogdGhlcmUuIFRoaXMgaXMgdGhlIGFwcHJvYWNoIGNob3NlbiBpbiBQdWxzZUF1ZGlvJ3MgdGhyZWFkZWQgQVBJLgorICoKKyAqIFxzdWJzZWN0aW9uIGJhc2ljX3N1YnNlYyBCYXNpYyBjYWxsYmFja3MKKyAqCisgKiBGb3IgdGhlIGJhc2ljIGNhc2UsIHdoZXJlIGFsbCB0aGF0IGlzIHJlcXVpcmVkIGlzIHRvIHdhaXQgZm9yIHRoZSBjYWxsYmFjaworICogdG8gYmUgaW52b2tlZCwgdGhlIGNvZGUgc2hvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoKKyAqCisgKiBFeGFtcGxlOgorICoKKyAqIFxjb2RlCisgKiBzdGF0aWMgdm9pZCBteV9kcmFpbl9jYWxsYmFjayhwYV9zdHJlYW0gKnMsIGludCBzdWNjZXNzLCB2b2lkICp1c2VyZGF0YSkgeworICogICAgIHBhX3RocmVhZGVkX21haW5sb29wICptOworICoKKyAqICAgICBtID0gdXNlcmRhdGE7CisgKiAgICAgYXNzZXJ0KG0pOworICoKKyAqICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwobSwgMCk7CisgKiB9CisgKgorICogdm9pZCBteV9kcmFpbl9zdHJlYW1fZnVuYyhwYV90aHJlYWRlZF9tYWlubG9vcCAqbSwgcGFfc3RyZWFtICpzKSB7CisgKiAgICAgcGFfb3BlcmF0aW9uICpvOworICoKKyAqICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKG0pOworICoKKyAqICAgICBvID0gcGFfc3RyZWFtX2RyYWluKHMsIG15X2RyYWluX2NhbGxiYWNrLCBtKTsKKyAqICAgICBhc3NlcnQobyk7CisgKgorICogICAgIHdoaWxlIChwYV9vcGVyYXRpb25fZ2V0X3N0YXRlKG8pID09IFBBX09QRVJBVElPTl9SVU5OSU5HKQorICogICAgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0KG0pOworICoKKyAqICAgICBwYV9vcGVyYXRpb25fdW5yZWYobyk7CisgKgorICogICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayhtKTsKKyAqIH0KKyAqIFxlbmRjb2RlCisgKgorICogVGhlIG1haW4gZnVuY3Rpb24sIG15X2RyYWluX3N0cmVhbV9mdW5jKCksIHdpbGwgd2FpdCBmb3IgdGhlIGNhbGxiYWNrIHRvCisgKiBiZSBjYWxsZWQgdXNpbmcgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCgpLgorICoKKyAqIElmIHlvdXIgYXBwbGljYXRpb24gaXMgbXVsdGktdGhyZWFkZWQsIHRoZW4gdGhpcyB3YWl0aW5nIG11c3QgYmUKKyAqIGRvbmUgaW5zaWRlIGEgd2hpbGUgbG9vcC4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IG11bHRpcGxlCisgKiB0aHJlYWRzIG1pZ2h0IGJlIHVzaW5nIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQoKSBhdCB0aGUgc2FtZQorICogdGltZS4gRWFjaCB0aHJlYWQgbXVzdCB0aGVyZWZvcmUgdmVyaWZ5IHRoYXQgaXQgd2FzIGl0cyBjYWxsYmFjaworICogdGhhdCB3YXMgaW52b2tlZC4gQWxzbyB0aGUgdW5kZXJseWluZyBPUyBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcworICogYXJlIHVzdWFsbHkgbm90IGZyZWUgb2Ygc3B1cmlvdXMgd2FrZS11cHMsIHNvIGEKKyAqIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQoKSBtdXN0IGJlIGNhbGxlZCB3aXRoaW4gYSBsb29wIGV2ZW4gaWYKKyAqIHlvdSBoYXZlIG9ubHkgb25lIHRocmVhZCB3YWl0aW5nLgorICoKKyAqIFRoZSBjYWxsYmFjaywgbXlfZHJhaW5fY2FsbGJhY2soKSwgaW5kaWNhdGVzIHRvIHRoZSBtYWluIGZ1bmN0aW9uIHRoYXQgaXQKKyAqIGhhcyBiZWVuIGNhbGxlZCB1c2luZyBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwoKS4KKyAqCisgKiBBcyB5b3UgY2FuIHNlZSwgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCgpIG1heSBvbmx5IGJlIGNhbGxlZCB3aXRoCisgKiB0aGUgbG9jayBoZWxkLiBUaGUgc2FtZSB0aGluZyBpcyB0cnVlIGZvciBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwoKSwKKyAqIGJ1dCBhcyB0aGUgbG9jayBpcyBoZWxkIGJlZm9yZSB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCwgeW91IGRvIG5vdCBoYXZlIHRvCisgKiBkZWFsIHdpdGggdGhhdC4KKyAqCisgKiBUaGUgZnVuY3Rpb25zIHdpbGwgbm90IGRlYWQgbG9jayBiZWNhdXNlIHRoZSB3YWl0IGZ1bmN0aW9uIHdpbGwgcmVsZWFzZQorICogdGhlIGxvY2sgYmVmb3JlIHdhaXRpbmcgYW5kIHRoZW4gcmVncmFiIGl0IG9uY2UgaXQgaGFzIGJlZW4gc2lnbmFsZWQuCisgKiBGb3IgdGhvc2Ugb2YgeW91IGZhbWlsaWFyIHdpdGggdGhyZWFkcywgdGhlIGJlaGF2aW91ciBpcyB0aGF0IG9mIGEKKyAqIGNvbmRpdGlvbiB2YXJpYWJsZS4KKyAqCisgKiBcc3Vic2VjdGlvbiBkYXRhX3N1YnNlYyBEYXRhIGNhbGxiYWNrcworICoKKyAqIEZvciBtYW55IGNhbGxiYWNrcywgc2ltcGx5IGtub3dpbmcgdGhhdCB0aGV5IGhhdmUgYmVlbiBjYWxsZWQgaXMKKyAqIGluc3VmZmljaWVudC4gVGhlIGNhbGxiYWNrIGFsc28gcmVjZWl2ZXMgc29tZSBkYXRhIHRoYXQgaXMgZGVzaXJlZC4gVG8KKyAqIGFjY2VzcyB0aGlzIGRhdGEgc2FmZWx5LCB3ZSBtdXN0IGV4dGVuZCBvdXIgZXhhbXBsZSBhIGJpdDoKKyAqCisgKiBcY29kZQorICogc3RhdGljIGludCAqZHJhaW5fcmVzdWx0OworICoKKyAqIHN0YXRpYyB2b2lkIG15X2RyYWluX2NhbGxiYWNrKHBhX3N0cmVhbSpzLCBpbnQgc3VjY2Vzcywgdm9pZCAqdXNlcmRhdGEpIHsKKyAqICAgICBwYV90aHJlYWRlZF9tYWlubG9vcCAqbTsKKyAqCisgKiAgICAgbSA9IHVzZXJkYXRhOworICogICAgIGFzc2VydChtKTsKKyAqCisgKiAgICAgZHJhaW5fcmVzdWx0ID0gJnN1Y2Nlc3M7CisgKgorICogICAgIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbChtLCAxKTsKKyAqIH0KKyAqCisgKiB2b2lkIG15X2RyYWluX3N0cmVhbV9mdW5jKHBhX3RocmVhZGVkX21haW5sb29wICptLCBwYV9zdHJlYW0gKnMpIHsKKyAqICAgICBwYV9vcGVyYXRpb24gKm87CisgKgorICogICAgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sobSk7CisgKgorICogICAgIG8gPSBwYV9zdHJlYW1fZHJhaW4ocywgbXlfZHJhaW5fY2FsbGJhY2ssIG0pOworICogICAgIGFzc2VydChvKTsKKyAqCisgKiAgICAgd2hpbGUgKHBhX29wZXJhdGlvbl9nZXRfc3RhdGUobykgPT0gUEFfT1BFUkFUSU9OX1JVTk5JTkcpCisgKiAgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQobSk7CisgKgorICogICAgIHBhX29wZXJhdGlvbl91bnJlZihvKTsKKyAqCisgKiAgICAgaWYgKCpkcmFpbl9yZXN1bHQpCisgKiAgICAgICAgIHByaW50ZigiU3VjY2VzcyEiKTsKKyAqICAgICBlbHNlCisgKiAgICAgICAgIHByaW50ZigiQml0dGVyIGRlZmVhdC4uLiIpOworICoKKyAqICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9hY2NlcHQobSk7CisgKgorICogICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayhtKTsKKyAqIH0KKyAqIFxlbmRjb2RlCisgKgorICogVGhlIGV4YW1wbGUgaXMgYSBiaXQgc2lsbHkgYXMgaXQgd291bGQgcHJvYmFibHkgaGF2ZSBiZWVuIGVhc2llciB0byBqdXN0CisgKiBjb3B5IHRoZSBjb250ZW50cyBvZiBzdWNjZXNzLCBidXQgZm9yIGxhcmdlciBkYXRhIHN0cnVjdHVyZXMgdGhpcyBjYW4gYmUKKyAqIHdhc3RlZnVsLgorICoKKyAqIFRoZSBkaWZmZXJlbmNlIGhlcmUgY29tcGFyZWQgdG8gdGhlIGJhc2ljIGNhbGxiYWNrIGlzIHRoZSAxIHNlbnQgdG8KKyAqIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbCgpIGFuZCB0aGUgY2FsbCB0bworICogcGFfdGhyZWFkZWRfbWFpbmxvb3BfYWNjZXB0KCkuIFdoYXQgd2lsbCBoYXBwZW4gaXMgdGhhdAorICogcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsKCkgd2lsbCBzaWduYWwgdGhlIG1haW4gZnVuY3Rpb24gYW5kIHRoZW4gc3RvcC4KKyAqIFRoZSBtYWluIGZ1bmN0aW9uIGlzIHRoZW4gZnJlZSB0byB1c2UgdGhlIGRhdGEgaW4gdGhlIGNhbGxiYWNrIHVudGlsCisgKiBwYV90aHJlYWRlZF9tYWlubG9vcF9hY2NlcHQoKSBpcyBjYWxsZWQsIHdoaWNoIHdpbGwgYWxsb3cgdGhlIGNhbGxiYWNrCisgKiB0byBjb250aW51ZS4KKyAqCisgKiBOb3RlIHRoYXQgcGFfdGhyZWFkZWRfbWFpbmxvb3BfYWNjZXB0KCkgbXVzdCBiZSBjYWxsZWQgc29tZSB0aW1lIGJldHdlZW4KKyAqIGV4aXRpbmcgdGhlIHdoaWxlIGxvb3AgYW5kIHVubG9ja2luZyB0aGUgbWFpbiBsb29wISBGYWlsdXJlIHRvIGRvIHNvIHdpbGwKKyAqIHJlc3VsdCBpbiBhIHJhY2UgY29uZGl0aW9uLiBJLmUuIGl0IGlzIG5vdCBvayB0byByZWxlYXNlIHRoZSBsb2NrIGFuZAorICogcmVncmFiIGl0IGJlZm9yZSBjYWxsaW5nIHBhX3RocmVhZGVkX21haW5sb29wX2FjY2VwdCgpLgorICoKKyAqIFxzdWJzZWN0aW9uIGFzeW5jX3N1YnNlYyBBc3luY2hyb25vdXMgY2FsbGJhY2tzCisgKgorICogUHVsc2VBdWRpbyBhbHNvIGhhcyBjYWxsYmFja3MgdGhhdCBhcmUgY29tcGxldGVseSBhc3luY2hyb25vdXMsIG1lYW5pbmcKKyAqIHRoYXQgdGhleSBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lLiBUaGUgdGhyZWFkaW5nIG1haW4gbG9vcCBBUEkgcHJvdmlkZXMKKyAqIHRoZSBsb2NraW5nIG1lY2hhbmlzbSB0byBoYW5kbGUgY29uY3VycmVudCBhY2Nlc3NlcywgYnV0IG5vdGhpbmcgZWxzZS4KKyAqIEFwcGxpY2F0aW9ucyB3aWxsIGhhdmUgdG8gaGFuZGxlIGNvbW11bmljYXRpb24gZnJvbSB0aGUgY2FsbGJhY2sgdG8gdGhlCisgKiBtYWluIHByb2dyYW0gdGhyb3VnaCBzb21lIG93biBzeXN0ZW0uCisgKgorICogVGhlIGNhbGxiYWNrcyB0aGF0IGFyZSBjb21wbGV0ZWx5IGFzeW5jaHJvbm91cyBhcmU6CisgKgorICogXGxpIFN0YXRlIGNhbGxiYWNrcyBmb3IgY29udGV4dHMsIHN0cmVhbXMsIGV0Yy4KKyAqIFxsaSBTdWJzY3JpcHRpb24gbm90aWZpY2F0aW9ucworICovCisKKy8qKiBcZmlsZQorICoKKyAqIEEgdGhyZWFkIGJhc2VkIGV2ZW50IGxvb3AgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gcGFfbWFpbmxvb3AuIFRoZQorICogZXZlbnQgbG9vcCBpcyBydW4gaW4gYSBoZWxwZXIgdGhyZWFkIGluIHRoZSBiYWNrZ3JvdW5kLiBBIGZldworICogc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMgYXJlIGF2YWlsYWJsZSB0byBhY2Nlc3MgdGhlIG9iamVjdHMKKyAqIGF0dGFjaGVkIHRvIHRoZSBldmVudCBsb29wIHNhZmVseS4KKyAqCisgKiBTZWUgYWxzbyBcc3VicGFnZSB0aHJlYWRlZF9tYWlubG9vcAorICovCisKKy8qKiBBbiBvcGFxdWUgdGhyZWFkZWQgbWFpbiBsb29wIG9iamVjdCAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfdGhyZWFkZWRfbWFpbmxvb3AgcGFfdGhyZWFkZWRfbWFpbmxvb3A7CisKKy8qKiBBbGxvY2F0ZSBhIG5ldyB0aHJlYWRlZCBtYWluIGxvb3Agb2JqZWN0LiBZb3UgaGF2ZSB0byBjYWxsCisgKiBwYV90aHJlYWRlZF9tYWlubG9vcF9zdGFydCgpIGJlZm9yZSB0aGUgZXZlbnQgbG9vcCB0aHJlYWQgc3RhcnRzCisgKiBydW5uaW5nLiAqLworcGFfdGhyZWFkZWRfbWFpbmxvb3AgKnBhX3RocmVhZGVkX21haW5sb29wX25ldyh2b2lkKTsKKworLyoqIEZyZWUgYSB0aHJlYWRlZCBtYWluIGxvb3Agb2JqZWN0LiBJZiB0aGUgZXZlbnQgbG9vcCB0aHJlYWQgaXMKKyAqIHN0aWxsIHJ1bm5pbmcsIHRlcm1pbmF0ZSBpdCB3aXRoIHBhX3RocmVhZGVkX21haW5sb29wX3N0b3AoKQorICogZmlyc3QuICovCit2b2lkIHBhX3RocmVhZGVkX21haW5sb29wX2ZyZWUocGFfdGhyZWFkZWRfbWFpbmxvb3AqIG0pOworCisvKiogU3RhcnQgdGhlIGV2ZW50IGxvb3AgdGhyZWFkLiAqLworaW50IHBhX3RocmVhZGVkX21haW5sb29wX3N0YXJ0KHBhX3RocmVhZGVkX21haW5sb29wICptKTsKKworLyoqIFRlcm1pbmF0ZSB0aGUgZXZlbnQgbG9vcCB0aHJlYWQgY2xlYW5seS4gTWFrZSBzdXJlIHRvIHVubG9jayB0aGUKKyAqIG1haW5sb29wIG9iamVjdCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAqLwordm9pZCBwYV90aHJlYWRlZF9tYWlubG9vcF9zdG9wKHBhX3RocmVhZGVkX21haW5sb29wICptKTsKKworLyoqIExvY2sgdGhlIGV2ZW50IGxvb3Agb2JqZWN0LCBlZmZlY3RpdmVseSBibG9ja2luZyB0aGUgZXZlbnQgbG9vcAorICogdGhyZWFkIGZyb20gcHJvY2Vzc2luZyBldmVudHMuIFlvdSBjYW4gdXNlIHRoaXMgdG8gZW5mb3JjZQorICogZXhjbHVzaXZlIGFjY2VzcyB0byBhbGwgb2JqZWN0cyBhdHRhY2hlZCB0byB0aGUgZXZlbnQgbG9vcC4gVGhpcworICogbG9jayBpcyByZWN1cnNpdmUuIFRoaXMgZnVuY3Rpb24gbWF5IG5vdCBiZSBjYWxsZWQgaW5zaWRlIHRoZSBldmVudAorICogbG9vcCB0aHJlYWQuIEV2ZW50cyB0aGF0IGFyZSBkaXNwYXRjaGVkIGZyb20gdGhlIGV2ZW50IGxvb3AgdGhyZWFkCisgKiBhcmUgZXhlY3V0ZWQgd2l0aCB0aGlzIGxvY2sgaGVsZC4gKi8KK3ZvaWQgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayhwYV90aHJlYWRlZF9tYWlubG9vcCAqbSk7CisKKy8qKiBVbmxvY2sgdGhlIGV2ZW50IGxvb3Agb2JqZWN0LCBpbnZlcnNlIG9mIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2soKSAqLwordm9pZCBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2socGFfdGhyZWFkZWRfbWFpbmxvb3AgKm0pOworCisvKiogV2FpdCBmb3IgYW4gZXZlbnQgdG8gYmUgc2lnbmFsbGVkIGJ5IHRoZSBldmVudCBsb29wIHRocmVhZC4gWW91CisgKiBjYW4gdXNlIHRoaXMgdG8gcGFzcyBkYXRhIGZyb20gdGhlIGV2ZW50IGxvb3AgdGhyZWFkIHRvIHRoZSBtYWluCisgKiB0aHJlYWQgaW4gc3luY2hyb25pemVkIGZhc2hpb24uIFRoaXMgZnVuY3Rpb24gbWF5IG5vdCBiZSBjYWxsZWQKKyAqIGluc2lkZSB0aGUgZXZlbnQgbG9vcCB0aHJlYWQuIFByaW9yIHRvIHRoaXMgY2FsbCB0aGUgZXZlbnQgbG9vcAorICogb2JqZWN0IG5lZWRzIHRvIGJlIGxvY2tlZCB1c2luZyBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKCkuIFdoaWxlCisgKiB3YWl0aW5nIHRoZSBsb2NrIHdpbGwgYmUgcmVsZWFzZWQsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXR1cm5pbmcgaXQKKyAqIHdpbGwgYmUgYWNxdWlyZWQgYWdhaW4uIFRoaXMgZnVuY3Rpb24gbWF5IHNwdXJpb3VzbHkgd2FrZSB1cCBldmVuCisgKiB3aXRob3V0IF9zaWduYWwoKSBiZWluZyBjYWxsZWQuIFlvdSBuZWVkIHRvIG1ha2Ugc3VyZSB0byBoYW5kbGUKKyAqIHRoYXQhICovCit2b2lkIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQocGFfdGhyZWFkZWRfbWFpbmxvb3AgKm0pOworCisvKiogU2lnbmFsIGFsbCB0aHJlYWRzIHdhaXRpbmcgZm9yIGEgc2lnbmFsbGluZyBldmVudCBpbgorICogcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCgpLiBJZiB3YWl0X2Zvcl9yZWxlYXNlIGlzIG5vbi16ZXJvLCBkbworICogbm90IHJldHVybiBiZWZvcmUgdGhlIHNpZ25hbCB3YXMgYWNjZXB0ZWQgYnkgYQorICogcGFfdGhyZWFkZWRfbWFpbmxvb3BfYWNjZXB0KCkgY2FsbC4gV2hpbGUgd2FpdGluZyBmb3IgdGhhdCBjb25kaXRpb24KKyAqIHRoZSBldmVudCBsb29wIG9iamVjdCBpcyB1bmxvY2tlZC4gKi8KK3ZvaWQgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsKHBhX3RocmVhZGVkX21haW5sb29wICptLCBpbnQgd2FpdF9mb3JfYWNjZXB0KTsKKworLyoqIEFjY2VwdCBhIHNpZ25hbCBmcm9tIHRoZSBldmVudCB0aHJlYWQgaXNzdWVkIHdpdGgKKyAqIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbCgpLiBUaGlzIGNhbGwgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbgorICogY29uanVuY3Rpb24gd2l0aCBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwoKSB3aXRoIGEgbm9uLXplcm8KKyAqIHdhaXRfZm9yX2FjY2VwdCB2YWx1ZS4gICovCit2b2lkIHBhX3RocmVhZGVkX21haW5sb29wX2FjY2VwdChwYV90aHJlYWRlZF9tYWlubG9vcCAqbSk7CisKKy8qKiBSZXR1cm4gdGhlIHJldHVybiB2YWx1ZSBhcyBzcGVjaWZpZWQgd2l0aCB0aGUgbWFpbiBsb29wJ3MgcXVpdCgpIHJvdXRpbmUuICovCitpbnQgcGFfdGhyZWFkZWRfbWFpbmxvb3BfZ2V0X3JldHZhbChwYV90aHJlYWRlZF9tYWlubG9vcCAqbSk7CisKKy8qKiBSZXR1cm4gdGhlIGFic3RyYWN0IG1haW4gbG9vcCBhYnN0cmFjdGlvbiBsYXllciB2dGFibGUgZm9yIHRoaXMKKyAgICBtYWluIGxvb3AuIE5vIG5lZWQgdG8gZnJlZSB0aGUgQVBJIGFzIGl0IGlzIG93bmVkIGJ5IHRoZSBsb29wCisgICAgYW5kIGlzIGRlc3Ryb3llZCB3aGVuIHRoZSBsb29wIGlzIGZyZWVkLiAqLworcGFfbWFpbmxvb3BfYXBpKiBwYV90aHJlYWRlZF9tYWlubG9vcF9nZXRfYXBpKHBhX3RocmVhZGVkX21haW5sb29wKm0pOworCisvKiogUmV0dXJucyBub24temVybyB3aGVuIGNhbGxlZCBmcm9tIHdpdGhpbmcgdGhlIGV2ZW50IGxvb3AgdGhyZWFkLiBcc2luY2UgMC45LjcgKi8KK2ludCBwYV90aHJlYWRlZF9tYWlubG9vcF9pbl90aHJlYWQocGFfdGhyZWFkZWRfbWFpbmxvb3AgKm0pOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS90aW1ldmFsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3RpbWV2YWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjI1NWY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS90aW1ldmFsLmgKQEAgLTAsMCArMSw4OSBAQAorI2lmbmRlZiBmb290aW1ldmFsaGZvbworI2RlZmluZSBmb290aW1ldmFsaGZvbworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgTGljZW5zZSBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL2djY21hY3JvLmg+CisjaW5jbHVkZSA8cHVsc2Uvc2FtcGxlLmg+CisjaW5jbHVkZSA8cHVsc2UvdmVyc2lvbi5oPgorCisvKiogXGZpbGUKKyAqIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyB0aW1ldmFsIGNhbGN1bGF0aW9ucyAqLworCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGluIGEgc2Vjb25kICovCisjZGVmaW5lIFBBX01TRUNfUEVSX1NFQyAoKHBhX3VzZWNfdCkgMTAwMFVMTCkKKworLyoqIFRoZSBudW1iZXIgb2YgbWljcm9zZWNvbmRzIGluIGEgc2Vjb25kICovCisjZGVmaW5lIFBBX1VTRUNfUEVSX1NFQyAoKHBhX3VzZWNfdCkgMTAwMDAwMFVMTCkKKworLyoqIFRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMgaW4gYSBzZWNvbmQgKi8KKyNkZWZpbmUgUEFfTlNFQ19QRVJfU0VDICgodW5zaWduZWQgbG9uZyBsb25nKSAxMDAwMDAwMDAwVUxMKQorCisvKiogVGhlIG51bWJlciBvZiBtaWNyb3NlY29uZHMgaW4gYSBtaWxsaXNlY29uZCAqLworI2RlZmluZSBQQV9VU0VDX1BFUl9NU0VDICgocGFfdXNlY190KSAxMDAwVUxMKQorCisvKiogVGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcyBpbiBhIG1pbGxpc2Vjb25kICovCisjZGVmaW5lIFBBX05TRUNfUEVSX01TRUMgKCh1bnNpZ25lZCBsb25nIGxvbmcpIDEwMDAwMDBVTEwpCisKKy8qKiBUaGUgbnVtYmVyIG9mIG5hbm9zZWNvbmRzIGluIGEgbWljcm9zZWNvbmQgKi8KKyNkZWZpbmUgUEFfTlNFQ19QRVJfVVNFQyAoKHVuc2lnbmVkIGxvbmcgbG9uZykgMTAwMFVMTCkKKworLyoqIEludmFsaWQgdGltZSBpbiB1c2VjLiBcc2luY2UgMC45LjE1ICovCisjZGVmaW5lIFBBX1VTRUNfSU5WQUxJRCAoKHBhX3VzZWNfdCkgLTEpCisKKy8qKiBCaWdnZXN0IHRpbWUgaW4gdXNlYy4gXHNpbmNlIDAuOS4xOCAqLworI2RlZmluZSBQQV9VU0VDX01BWCAoKHBhX3VzZWNfdCkgLTIpCisKK3N0cnVjdCB0aW1ldmFsOworCisvKiogUmV0dXJuIHRoZSBjdXJyZW50IHdhbGxjbG9jayB0aW1lc3RhbXAsIGp1c3QgbGlrZSBVTklYIGdldHRpbWVvZmRheSgpLiAqLworc3RydWN0IHRpbWV2YWwgKnBhX2dldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqdHYpOworCisvKiogQ2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBzcGVjaWZpZWQgdGltZXZhbAorICogc3RydWN0cy4gKi8KK3BhX3VzZWNfdCBwYV90aW1ldmFsX2RpZmYoY29uc3Qgc3RydWN0IHRpbWV2YWwgKmEsIGNvbnN0IHN0cnVjdCB0aW1ldmFsICpiKSBQQV9HQ0NfUFVSRTsKKworLyoqIENvbXBhcmUgdGhlIHR3byB0aW1ldmFsIHN0cnVjdHMgYW5kIHJldHVybiAwIHdoZW4gZXF1YWwsIG5lZ2F0aXZlIHdoZW4gYSA8IGIsIHBvc2l0aXZlIG90aGVyd2lzZSAqLworaW50IHBhX3RpbWV2YWxfY21wKGNvbnN0IHN0cnVjdCB0aW1ldmFsICphLCBjb25zdCBzdHJ1Y3QgdGltZXZhbCAqYikgUEFfR0NDX1BVUkU7CisKKy8qKiBSZXR1cm4gdGhlIHRpbWUgZGlmZmVyZW5jZSBiZXR3ZWVuIG5vdyBhbmQgdGhlIHNwZWNpZmllZCB0aW1lc3RhbXAgKi8KK3BhX3VzZWNfdCBwYV90aW1ldmFsX2FnZShjb25zdCBzdHJ1Y3QgdGltZXZhbCAqdHYpOworCisvKiogQWRkIHRoZSBzcGVjaWZpZWQgdGltZSBpbiBtaWNyb3NlY29uZHMgdG8gdGhlIHNwZWNpZmllZCB0aW1ldmFsIHN0cnVjdHVyZSAqLworc3RydWN0IHRpbWV2YWwqIHBhX3RpbWV2YWxfYWRkKHN0cnVjdCB0aW1ldmFsICp0diwgcGFfdXNlY190IHYpOworCisvKiogU3VidHJhY3QgdGhlIHNwZWNpZmllZCB0aW1lIGluIG1pY3Jvc2Vjb25kcyB0byB0aGUgc3BlY2lmaWVkIHRpbWV2YWwgc3RydWN0dXJlLiBcc2luY2UgMC45LjExICovCitzdHJ1Y3QgdGltZXZhbCogcGFfdGltZXZhbF9zdWIoc3RydWN0IHRpbWV2YWwgKnR2LCBwYV91c2VjX3Qgdik7CisKKy8qKiBTdG9yZSB0aGUgc3BlY2lmaWVkIHVzZWMgdmFsdWUgaW4gdGhlIHRpbWV2YWwgc3RydWN0LiBcc2luY2UgMC45LjcgKi8KK3N0cnVjdCB0aW1ldmFsKiBwYV90aW1ldmFsX3N0b3JlKHN0cnVjdCB0aW1ldmFsICp0diwgcGFfdXNlY190IHYpOworCisvKiogTG9hZCB0aGUgc3BlY2lmaWVkIHR2IHZhbHVlIGFuZCByZXR1cm4gaXQgaW4gdXNlYy4gXHNpbmNlIDAuOS43ICovCitwYV91c2VjX3QgcGFfdGltZXZhbF9sb2FkKGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0dik7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3V0ZjguaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvdXRmOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5Zjc0OTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3V0ZjguaApAQCAtMCwwICsxLDU2IEBACisjaWZuZGVmIGZvb3V0ZjhoZm9vCisjZGVmaW5lIGZvb3V0ZjhoZm9vCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgTGljZW5zZSBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL2djY21hY3JvLmg+CisjaW5jbHVkZSA8cHVsc2UvdmVyc2lvbi5oPgorCisvKiogXGZpbGUKKyAqIFVURjggVmFsaWRhdGlvbiBmdW5jdGlvbnMKKyAqLworCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIFRlc3QgaWYgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHF1YWxpZmllcyBhcyB2YWxpZCBVVEY4LiBSZXR1cm4gdGhlIHN0cmluZyBpZiBzbywgb3RoZXJ3aXNlIE5VTEwgKi8KK2NoYXIgKnBhX3V0ZjhfdmFsaWQoY29uc3QgY2hhciAqc3RyKSBQQV9HQ0NfUFVSRTsKKworLyoqIFRlc3QgaWYgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHF1YWxpZmllcyBhcyB2YWxpZCA3LWJpdCBBU0NJSS4gUmV0dXJuIHRoZSBzdHJpbmcgaWYgc28sIG90aGVyd2lzZSBOVUxMLiBcc2luY2UgMC45LjE1ICovCitjaGFyICpwYV9hc2NpaV92YWxpZChjb25zdCBjaGFyICpzdHIpIFBBX0dDQ19QVVJFOworCisvKiogRmlsdGVyIGFsbCBpbnZhbGlkIFVURjggY2hhcmFjdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCByZXR1cm5pbmcgYSBuZXcgZnVsbHkgVVRGOCB2YWxpZCBzdHJpbmcuIERvbid0IGZvcmdldCB0byBmcmVlIHRoZSByZXR1cm5lZCBzdHJpbmcgd2l0aCBwYV94ZnJlZSgpICovCitjaGFyICpwYV91dGY4X2ZpbHRlcihjb25zdCBjaGFyICpzdHIpOworCisvKiogRmlsdGVyIGFsbCBpbnZhbGlkIEFTQ0lJIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgcmV0dXJuaW5nIGEgbmV3IGZ1bGx5IEFTQ0lJIHZhbGlkIHN0cmluZy4gRG9uJ3QgZm9yZ2V0IHRvIGZyZWUgdGhlIHJldHVybmVkIHN0cmluZyB3aXRoIHBhX3hmcmVlKCkuIFxzaW5jZSAwLjkuMTUgKi8KK2NoYXIgKnBhX2FzY2lpX2ZpbHRlcihjb25zdCBjaGFyICpzdHIpOworCisvKiogQ29udmVydCBhIFVURi04IHN0cmluZyB0byB0aGUgY3VycmVudCBsb2NhbGUuIEZyZWUgdGhlIHN0cmluZyB1c2luZyBwYV94ZnJlZSgpLiAqLworY2hhciogcGFfdXRmOF90b19sb2NhbGUgKGNvbnN0IGNoYXIgKnN0cik7CisKKy8qKiBDb252ZXJ0IGEgc3RyaW5nIGluIHRoZSBjdXJyZW50IGxvY2FsZSB0byBVVEYtOC4gRnJlZSB0aGUgc3RyaW5nIHVzaW5nIHBhX3hmcmVlKCkuICovCitjaGFyKiBwYV9sb2NhbGVfdG9fdXRmOCAoY29uc3QgY2hhciAqc3RyKTsKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvdXRpbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5MGQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvdXRpbC5oCkBAIC0wLDAgKzEsNjEgQEAKKyNpZm5kZWYgZm9vdXRpbGhmb28KKyNkZWZpbmUgZm9vdXRpbGhmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUKKyAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgIExpY2Vuc2UgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL3ZlcnNpb24uaD4KKworLyoqIFxmaWxlCisgKiBBc3NvcnRlZCB1dGlsaXR5IGZ1bmN0aW9ucyAqLworCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIFJldHVybiB0aGUgY3VycmVudCB1c2VybmFtZSBpbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIuICovCitjaGFyICpwYV9nZXRfdXNlcl9uYW1lKGNoYXIgKnMsIHNpemVfdCBsKTsKKworLyoqIFJldHVybiB0aGUgY3VycmVudCBob3N0bmFtZSBpbiB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4gKi8KK2NoYXIgKnBhX2dldF9ob3N0X25hbWUoY2hhciAqcywgc2l6ZV90IGwpOworCisvKiogUmV0dXJuIHRoZSBmdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWUgaW4gcyAqLworY2hhciAqcGFfZ2V0X2ZxZG4oY2hhciAqcywgc2l6ZV90IGwpOworCisvKiogUmV0dXJuIHRoZSBob21lIGRpcmVjdG9yeSBvZiB0aGUgY3VycmVudCB1c2VyICovCitjaGFyICpwYV9nZXRfaG9tZV9kaXIoY2hhciAqcywgc2l6ZV90IGwpOworCisvKiogUmV0dXJuIHRoZSBiaW5hcnkgZmlsZSBuYW1lIG9mIHRoZSBjdXJyZW50IHByb2Nlc3MuIFRoaXMgaXMgbm90CisgKiBzdXBwb3J0ZWQgb24gYWxsIGFyY2hpdGVjdHVyZXMsIGluIHdoaWNoIGNhc2UgTlVMTCBpcyByZXR1cm5lZC4gKi8KK2NoYXIgKnBhX2dldF9iaW5hcnlfbmFtZShjaGFyICpzLCBzaXplX3QgbCk7CisKKy8qKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaWxlbmFtZSBpbnNpZGUgYSBwYXRoICh3aGljaCBpcyB0aGUgbGFzdAorICogY29tcG9uZW50KS4gSWYgcGFzc2VkIE5VTEwgd2lsbCByZXR1cm4gTlVMTC4gKi8KK2NoYXIgKnBhX3BhdGhfZ2V0X2ZpbGVuYW1lKGNvbnN0IGNoYXIgKnApOworCisvKiogV2FpdCB0IG1pbGxpc2Vjb25kcyAqLworaW50IHBhX21zbGVlcCh1bnNpZ25lZCBsb25nIHQpOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS92ZXJzaW9uLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzkwNTMzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS92ZXJzaW9uLmgKQEAgLTAsMCArMSw3MiBAQAorI2lmbmRlZiBmb292ZXJzaW9uaGZvbyAvKi0qLUMtKi0qLworI2RlZmluZSBmb292ZXJzaW9uaGZvbworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKy8qIFdBUk5JTkc6IE1ha2Ugc3VyZSB0byBlZGl0IHRoZSByZWFsIHNvdXJjZSBmaWxlIHZlcnNpb24uaC5pbiEgKi8KKworI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisKKy8qKiBcZmlsZQorICogRGVmaW5lIGhlYWRlciB2ZXJzaW9uICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBoZWFkZXIgZmlsZXMuIEtlZXAgaW4gbWluZCB0aGF0IHRoaXMgaXMKK2EgbWFjcm8gYW5kIG5vdCBhIGZ1bmN0aW9uLCBzbyBpdCBpcyBpbXBvc3NpYmxlIHRvIGdldCB0aGUgcG9pbnRlciBvZgoraXQuICovCisjZGVmaW5lIHBhX2dldF9oZWFkZXJzX3ZlcnNpb24oKSAoIjEuMS4wIikKKworLyoqIFJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSB0aGUgY3VycmVudCBhcHBsaWNhdGlvbiBpcworICogbGlua2VkIHRvLiAqLworY29uc3QgY2hhciogcGFfZ2V0X2xpYnJhcnlfdmVyc2lvbih2b2lkKTsKKworLyoqIFRoZSBjdXJyZW50IEFQSSB2ZXJzaW9uLiBWZXJzaW9uIDYgcmVsYXRlcyB0byBQb2x5cGF1ZGlvCisgKiAwLjYuIFByaW9yIHZlcnNpb25zIChpLmUuIFBvbHlwYXVkaW8gMC41LjEgYW5kIG9sZGVyKSBoYXZlCisgKiBQQV9BUElfVkVSU0lPTiB1bmRlZmluZWQuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBpcyBvbmx5IGV2ZXIKKyAqIGluY3JlYXNlZCBvbiBpbmNvbXBhdGlibGUgQVBJIGNoYW5nZXMhICAqLworI2RlZmluZSBQQV9BUElfVkVSU0lPTiAxMgorCisvKiogVGhlIGN1cnJlbnQgcHJvdG9jb2wgdmVyc2lvbi4gVmVyc2lvbiA4IHJlbGF0ZXMgdG8gUG9seXBhdWRpbworICogMC44L1B1bHNlQXVkaW8gMC45LiAqLworI2RlZmluZSBQQV9QUk9UT0NPTF9WRVJTSU9OIDI2CisKKy8qKiBUaGUgbWFqb3IgdmVyc2lvbiBvZiBQQS4gXHNpbmNlIDAuOS4xNSAqLworI2RlZmluZSBQQV9NQUpPUiAxCisKKy8qKiBUaGUgbWlub3IgdmVyc2lvbiBvZiBQQS4gXHNpbmNlIDAuOS4xNSAqLworI2RlZmluZSBQQV9NSU5PUiAxCisKKy8qKiBUaGUgbWljcm8gdmVyc2lvbiBvZiBQQSAod2lsbCBhbHdheXMgYmUgMCBmcm9tIHYxLjAgb253YXJkcykuIFxzaW5jZSAwLjkuMTUgKi8KKyNkZWZpbmUgUEFfTUlDUk8gMAorCisvKiogRXZhbHVhdGVzIHRvIFRSVUUgaWYgdGhlIFB1bHNlQXVkaW8gbGlicmFyeSB2ZXJzaW9uIGlzIGVxdWFsIG9yCisgKiBuZXdlciB0aGFuIHRoZSBzcGVjaWZpZWQuIFxzaW5jZSAwLjkuMTYgKi8KKyNkZWZpbmUgUEFfQ0hFQ0tfVkVSU0lPTihtYWpvcixtaW5vcixtaWNybykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKFBBX01BSk9SID4gKG1ham9yKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKFBBX01BSk9SID09IChtYWpvcikgJiYgUEFfTUlOT1IgPiAobWlub3IpKSB8fCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKFBBX01BSk9SID09IChtYWpvcikgJiYgUEFfTUlOT1IgPT0gKG1pbm9yKSAmJiBQQV9NSUNSTyA+PSAobWljcm8pKSkKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvdm9sdW1lLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3ZvbHVtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmODQzNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3ZvbHVtZS5oCkBAIC0wLDAgKzEsMzgyIEBACisjaWZuZGVmIGZvb3ZvbHVtZWhmb28KKyNkZWZpbmUgZm9vdm9sdW1laGZvbworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLAorICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL2djY21hY3JvLmg+CisjaW5jbHVkZSA8cHVsc2Uvc2FtcGxlLmg+CisjaW5jbHVkZSA8cHVsc2UvY2hhbm5lbG1hcC5oPgorI2luY2x1ZGUgPHB1bHNlL3ZlcnNpb24uaD4KKworLyoqIFxwYWdlIHZvbHVtZSBWb2x1bWUgQ29udHJvbAorICoKKyAqIFxzZWN0aW9uIG92ZXJ2X3NlYyBPdmVydmlldworICoKKyAqIFNpbmtzLCBzb3VyY2VzLCBzaW5rIGlucHV0cyBhbmQgc2FtcGxlcyBjYW4gYWxsIGhhdmUgdGhlaXIgb3duIHZvbHVtZXMuCisgKiBUbyBkZWFsIHdpdGggdGhlc2UsIFRoZSBQdWxzZUF1ZGlvIGxpYnJhcnkgY29udGFpbnMgYSBudW1iZXIgb2YgZnVuY3Rpb25zCisgKiB0aGF0IGVhc2UgaGFuZGxpbmcuCisgKgorICogVGhlIGJhc2ljIHZvbHVtZSB0eXBlIGluIFB1bHNlQXVkaW8gaXMgdGhlIFxyZWYgcGFfdm9sdW1lX3QgdHlwZS4gTW9zdCBvZgorICogdGhlIHRpbWUsIGFwcGxpY2F0aW9ucyB3aWxsIHVzZSB0aGUgYWdncmVnYXRlZCBwYV9jdm9sdW1lIHN0cnVjdHVyZSB0aGF0CisgKiBjYW4gc3RvcmUgdGhlIHZvbHVtZSBvZiBhbGwgY2hhbm5lbHMgYXQgb25jZS4KKyAqCisgKiBWb2x1bWVzIGNvbW1vbmx5IHNwYW4gYmV0d2VlbiBtdXRlZCAoMCUpLCBhbmQgbm9ybWFsICgxMDAlKS4gSXQgaXMgcG9zc2libGUKKyAqIHRvIHNldCB2b2x1bWVzIHRvIGhpZ2hlciB0aGFuIDEwMCUsIGJ1dCBjbGlwcGluZyBtaWdodCBvY2N1ci4KKyAqCisgKiBcc2VjdGlvbiBjYWxjX3NlYyBDYWxjdWxhdGlvbnMKKyAqCisgKiBUaGUgdm9sdW1lcyBpbiBQdWxzZUF1ZGlvIGFyZSBsb2dhcml0aG1pYyBpbiBuYXR1cmUgYW5kIGFwcGxpY2F0aW9ucworICogc2hvdWxkbid0IHBlcmZvcm0gY2FsY3VsYXRpb25zIHdpdGggdGhlbSBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQKKyAqIGJlIGNvbnZlcnRlZCB0byBhbmQgZnJvbSBlaXRoZXIgZEIgb3IgYSBsaW5lYXIgc2NhbGU6CisgKgorICogXGxpIGRCIC0gcGFfc3dfdm9sdW1lX2Zyb21fZEIoKSAvIHBhX3N3X3ZvbHVtZV90b19kQigpCisgKiBcbGkgTGluZWFyIC0gcGFfc3dfdm9sdW1lX2Zyb21fbGluZWFyKCkgLyBwYV9zd192b2x1bWVfdG9fbGluZWFyKCkKKyAqCisgKiBGb3Igc2ltcGxlIG11bHRpcGxpY2F0aW9uLCBwYV9zd192b2x1bWVfbXVsdGlwbHkoKSBhbmQKKyAqIHBhX3N3X2N2b2x1bWVfbXVsdGlwbHkoKSBjYW4gYmUgdXNlZC4KKyAqCisgKiBDYWxjdWxhdGlvbnMgY2FuIG9ubHkgYmUgcmVsaWFibHkgcGVyZm9ybWVkIG9uIHNvZnR3YXJlIHZvbHVtZXMKKyAqIGFzIGl0IGlzIGNvbW1vbmx5IHVua25vd24gd2hhdCBzY2FsZSBoYXJkd2FyZSB2b2x1bWVzIHJlbGF0ZSB0by4KKyAqCisgKiBUaGUgZnVuY3Rpb25zIGRlc2NyaWJlZCBhYm92ZSBhcmUgb25seSB2YWxpZCB3aGVuIHVzZWQgd2l0aAorICogc29mdHdhcmUgdm9sdW1lcy4gSGVuY2UgaXQgaXMgdXN1YWxseSBhIGJldHRlciBpZGVhIHRvIHRyZWF0IGFsbAorICogdm9sdW1lIHZhbHVlcyBhcyBvcGFxdWUgd2l0aCBhIHJhbmdlIGZyb20gUEFfVk9MVU1FX01VVEVEICgwJSkgdG8KKyAqIFBBX1ZPTFVNRV9OT1JNICgxMDAlKSBhbmQgdG8gcmVmcmFpbiBmcm9tIGFueSBjYWxjdWxhdGlvbnMgd2l0aAorICogdGhlbS4KKyAqCisgKiBcc2VjdGlvbiBjb252X3NlYyBDb252ZW5pZW5jZSBGdW5jdGlvbnMKKyAqCisgKiBUbyBoYW5kbGUgdGhlIHBhX2N2b2x1bWUgc3RydWN0dXJlLCB0aGUgUHVsc2VBdWRpbyBsaWJyYXJ5IHByb3ZpZGVzIGEKKyAqIG51bWJlciBvZiBjb252ZW5pZW5jZSBmdW5jdGlvbnM6CisgKgorICogXGxpIHBhX2N2b2x1bWVfdmFsaWQoKSAtIFRlc3RzIGlmIGEgcGFfY3ZvbHVtZSBzdHJ1Y3R1cmUgaXMgdmFsaWQuCisgKiBcbGkgcGFfY3ZvbHVtZV9lcXVhbCgpIC0gVGVzdHMgaWYgdHdvIHBhX2N2b2x1bWUgc3RydWN0dXJlcyBhcmUgaWRlbnRpY2FsLgorICogXGxpIHBhX2N2b2x1bWVfY2hhbm5lbHNfZXF1YWxfdG8oKSAtIFRlc3RzIGlmIGFsbCBjaGFubmVscyBvZiBhIHBhX2N2b2x1bWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgaGF2ZSBhIGdpdmVuIHZvbHVtZS4KKyAqIFxsaSBwYV9jdm9sdW1lX2lzX211dGVkKCkgLSBUZXN0cyBpZiBhbGwgY2hhbm5lbHMgb2YgYSBwYV9jdm9sdW1lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIGFyZSBtdXRlZC4KKyAqIFxsaSBwYV9jdm9sdW1lX2lzX25vcm0oKSAtIFRlc3RzIGlmIGFsbCBjaGFubmVscyBvZiBhIHBhX2N2b2x1bWUgc3RydWN0dXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXQgYSBub3JtYWwgdm9sdW1lLgorICogXGxpIHBhX2N2b2x1bWVfc2V0KCkgLSBTZXQgdGhlIGZpcnN0IG4gY2hhbm5lbHMgb2YgYSBwYV9jdm9sdW1lIHN0cnVjdHVyZSB0bworICogICAgICAgICAgICAgICAgICAgICAgICBhIGNlcnRhaW4gdm9sdW1lLgorICogXGxpIHBhX2N2b2x1bWVfcmVzZXQoKSAtIFNldCB0aGUgZmlyc3QgbiBjaGFubmVscyBvZiBhIHBhX2N2b2x1bWUgc3RydWN0dXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYSBub3JtYWwgdm9sdW1lLgorICogXGxpIHBhX2N2b2x1bWVfbXV0ZSgpIC0gU2V0IHRoZSBmaXJzdCBuIGNoYW5uZWxzIG9mIGEgcGFfY3ZvbHVtZSBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGEgbXV0ZWQgdm9sdW1lLgorICogXGxpIHBhX2N2b2x1bWVfYXZnKCkgLSBSZXR1cm4gdGhlIGF2ZXJhZ2Ugdm9sdW1lIG9mIGFsbCBjaGFubmVscy4KKyAqIFxsaSBwYV9jdm9sdW1lX3NucHJpbnQoKSAtIFByZXR0eSBwcmludCBhIHBhX2N2b2x1bWUgc3RydWN0dXJlLgorICovCisKKy8qKiBcZmlsZQorICogQ29uc3RhbnRzIGFuZCByb3V0aW5lcyBmb3Igdm9sdW1lIGhhbmRsaW5nCisgKgorICogU2VlIGFsc28gXHN1YnBhZ2Ugdm9sdW1lCisgKi8KKworUEFfQ19ERUNMX0JFR0lOCisKKy8qKiBWb2x1bWUgc3BlY2lmaWNhdGlvbjoKKyAqICBQQV9WT0xVTUVfTVVURUQ6IHNpbGVuY2U7CisgKiA8IFBBX1ZPTFVNRV9OT1JNOiBkZWNyZWFzZWQgdm9sdW1lOworICogICBQQV9WT0xVTUVfTk9STTogbm9ybWFsIHZvbHVtZTsKKyAqID4gUEFfVk9MVU1FX05PUk06IGluY3JlYXNlZCB2b2x1bWUgKi8KK3R5cGVkZWYgdWludDMyX3QgcGFfdm9sdW1lX3Q7CisKKy8qKiBOb3JtYWwgdm9sdW1lICgxMDAlLCAwIGRCKSAqLworI2RlZmluZSBQQV9WT0xVTUVfTk9STSAoKHBhX3ZvbHVtZV90KSAweDEwMDAwVSkKKworLyoqIE11dGVkIChtaW5pbWFsIHZhbGlkKSB2b2x1bWUgKDAlLCAtaW5mIGRCKSAqLworI2RlZmluZSBQQV9WT0xVTUVfTVVURUQgKChwYV92b2x1bWVfdCkgMFUpCisKKy8qKiBNYXhpbXVtIHZhbGlkIHZvbHVtZSB3ZSBjYW4gc3RvcmUuIFxzaW5jZSAwLjkuMTUgKi8KKyNkZWZpbmUgUEFfVk9MVU1FX01BWCAoKHBhX3ZvbHVtZV90KSBVSU5UMzJfTUFYLzIpCisKKy8qKiBSZWNvbW1lbmRlZCBtYXhpbXVtIHZvbHVtZSB0byBzaG93IGluIHVzZXIgZmFjaW5nIFVJcy4KKyAqIE5vdGU6IFVJcyBzaG91bGQgZGVhbCBncmFjZWZ1bGx5IHdpdGggdm9sdW1lcyBncmVhdGVyIHRoYW4gdGhpcyB2YWx1ZQorICogYW5kIG5vdCBjYXVzZSBmZWVkYmFjayBsb29wcyBldGMuIC0gaS5lLiBpZiB0aGUgdm9sdW1lIGlzIG1vcmUgdGhhbgorICogdGhpcywgdGhlIFVJIHNob3VsZCBub3QgbGltaXQgaXQgYW5kIHB1c2ggdGhlIGxpbWl0ZWQgdmFsdWUgYmFjayB0bworICogdGhlIHNlcnZlci4gXHNpbmNlIDAuOS4yMyAqLworI2RlZmluZSBQQV9WT0xVTUVfVUlfTUFYIChwYV9zd192b2x1bWVfZnJvbV9kQigrMTEuMCkpCisKKy8qKiBTcGVjaWFsICdpbnZhbGlkJyB2b2x1bWUuIFxzaW5jZSAwLjkuMTYgKi8KKyNkZWZpbmUgUEFfVk9MVU1FX0lOVkFMSUQgKChwYV92b2x1bWVfdCkgVUlOVDMyX01BWCkKKworLyoqIENoZWNrIGlmIHZvbHVtZSBpcyB2YWxpZC4gXHNpbmNlIDEuMCAqLworI2RlZmluZSBQQV9WT0xVTUVfSVNfVkFMSUQodikgKCh2KSA8PSBQQV9WT0xVTUVfTUFYKQorCisvKiogQ2xhbXAgdm9sdW1lIHRvIHRoZSBwZXJtaXR0ZWQgcmFuZ2UuIFxzaW5jZSAxLjAgKi8KKyNkZWZpbmUgUEFfQ0xBTVBfVk9MVU1FKHYpIChQQV9DTEFNUF9VTkxJS0VMWSgodiksIFBBX1ZPTFVNRV9NVVRFRCwgUEFfVk9MVU1FX01BWCkpCisKKy8qKiBBIHN0cnVjdHVyZSBlbmNhcHN1bGF0aW5nIGEgcGVyLWNoYW5uZWwgdm9sdW1lICovCit0eXBlZGVmIHN0cnVjdCBwYV9jdm9sdW1lIHsKKyAgICB1aW50OF90IGNoYW5uZWxzOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCisgICAgcGFfdm9sdW1lX3QgdmFsdWVzW1BBX0NIQU5ORUxTX01BWF07ICAvKio8IFBlci1jaGFubmVsIHZvbHVtZSAqLworfSBwYV9jdm9sdW1lOworCisvKiogUmV0dXJuIG5vbi16ZXJvIHdoZW4gKmEgPT0gKmIgKi8KK2ludCBwYV9jdm9sdW1lX2VxdWFsKGNvbnN0IHBhX2N2b2x1bWUgKmEsIGNvbnN0IHBhX2N2b2x1bWUgKmIpIFBBX0dDQ19QVVJFOworCisvKiogSW5pdGlhbGl6ZSB0aGUgc3BlY2lmaWVkIHZvbHVtZSBhbmQgcmV0dXJuIGEgcG9pbnRlciB0bworICogaXQuIFRoZSBzYW1wbGUgc3BlYyB3aWxsIGhhdmUgYSBkZWZpbmVkIHN0YXRlIGJ1dAorICogcGFfY3ZvbHVtZV92YWxpZCgpIHdpbGwgZmFpbCBmb3IgaXQuIFxzaW5jZSAwLjkuMTMgKi8KK3BhX2N2b2x1bWUqIHBhX2N2b2x1bWVfaW5pdChwYV9jdm9sdW1lICphKTsKKworLyoqIFNldCB0aGUgdm9sdW1lIG9mIHRoZSBmaXJzdCBuIGNoYW5uZWxzIHRvIFBBX1ZPTFVNRV9OT1JNICovCisjZGVmaW5lIHBhX2N2b2x1bWVfcmVzZXQoYSwgbikgcGFfY3ZvbHVtZV9zZXQoKGEpLCAobiksIFBBX1ZPTFVNRV9OT1JNKQorCisvKiogU2V0IHRoZSB2b2x1bWUgb2YgdGhlIGZpcnN0IG4gY2hhbm5lbHMgdG8gUEFfVk9MVU1FX01VVEVEICovCisjZGVmaW5lIHBhX2N2b2x1bWVfbXV0ZShhLCBuKSBwYV9jdm9sdW1lX3NldCgoYSksIChuKSwgUEFfVk9MVU1FX01VVEVEKQorCisvKiogU2V0IHRoZSB2b2x1bWUgb2YgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhbm5lbHMgdG8gdGhlIHZvbHVtZSB2ICovCitwYV9jdm9sdW1lKiBwYV9jdm9sdW1lX3NldChwYV9jdm9sdW1lICphLCB1bnNpZ25lZCBjaGFubmVscywgcGFfdm9sdW1lX3Qgdik7CisKKy8qKiBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgc3RyaW5ncyByZXR1cm5lZCBieQorICogcGFfY3ZvbHVtZV9zbnByaW50KCkuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyB2YWx1ZSBjYW4gY2hhbmdlIHdpdGgKKyAqIGFueSByZWxlYXNlIHdpdGhvdXQgd2FybmluZyBhbmQgd2l0aG91dCBiZWluZyBjb25zaWRlcmVkIEFQSSBvciBBQkkKKyAqIGJyZWFrYWdlLiBZb3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBkZWZpbml0aW9uIGFueXdoZXJlIHdoZXJlIGl0CisgKiBtaWdodCBiZWNvbWUgcGFydCBvZiBhbiBBQkkuKi8KKyNkZWZpbmUgUEFfQ1ZPTFVNRV9TTlBSSU5UX01BWCAzMjAKKworLyoqIFByZXR0eSBwcmludCBhIHZvbHVtZSBzdHJ1Y3R1cmUgKi8KK2NoYXIgKnBhX2N2b2x1bWVfc25wcmludChjaGFyICpzLCBzaXplX3QgbCwgY29uc3QgcGFfY3ZvbHVtZSAqYyk7CisKKy8qKiBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgc3RyaW5ncyByZXR1cm5lZCBieQorICogcGFfc3dfY3ZvbHVtZV9zbnByaW50X2RCKCkuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyB2YWx1ZSBjYW4gY2hhbmdlIHdpdGgKKyAqIGFueSByZWxlYXNlIHdpdGhvdXQgd2FybmluZyBhbmQgd2l0aG91dCBiZWluZyBjb25zaWRlcmVkIEFQSSBvciBBQkkKKyAqIGJyZWFrYWdlLiBZb3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBkZWZpbml0aW9uIGFueXdoZXJlIHdoZXJlIGl0CisgKiBtaWdodCBiZWNvbWUgcGFydCBvZiBhbiBBQkkuIFxzaW5jZSAwLjkuMTMgKi8KKyNkZWZpbmUgUEFfU1dfQ1ZPTFVNRV9TTlBSSU5UX0RCX01BWCA0NDgKKworLyoqIFByZXR0eSBwcmludCBhIHZvbHVtZSBzdHJ1Y3R1cmUgYnV0IHNob3cgZEIgdmFsdWVzLiBcc2luY2UgMC45LjEzICovCitjaGFyICpwYV9zd19jdm9sdW1lX3NucHJpbnRfZEIoY2hhciAqcywgc2l6ZV90IGwsIGNvbnN0IHBhX2N2b2x1bWUgKmMpOworCisvKiogTWF4aW11bSBsZW5ndGggb2YgdGhlIHN0cmluZ3MgcmV0dXJuZWQgYnkKKyAqIHBhX3ZvbHVtZV9zbnByaW50KCkuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyB2YWx1ZSBjYW4gY2hhbmdlIHdpdGgKKyAqIGFueSByZWxlYXNlIHdpdGhvdXQgd2FybmluZyBhbmQgd2l0aG91dCBiZWluZyBjb25zaWRlcmVkIEFQSSBvciBBQkkKKyAqIGJyZWFrYWdlLiBZb3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBkZWZpbml0aW9uIGFueXdoZXJlIHdoZXJlIGl0CisgKiBtaWdodCBiZWNvbWUgcGFydCBvZiBhbiBBQkkuIFxzaW5jZSAwLjkuMTUgKi8KKyNkZWZpbmUgUEFfVk9MVU1FX1NOUFJJTlRfTUFYIDEwCisKKy8qKiBQcmV0dHkgcHJpbnQgYSB2b2x1bWUgXHNpbmNlIDAuOS4xNSAqLworY2hhciAqcGFfdm9sdW1lX3NucHJpbnQoY2hhciAqcywgc2l6ZV90IGwsIHBhX3ZvbHVtZV90IHYpOworCisvKiogTWF4aW11bSBsZW5ndGggb2YgdGhlIHN0cmluZ3MgcmV0dXJuZWQgYnkKKyAqIHBhX3N3X3ZvbHVtZV9zbnByaW50X2RCKCkuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyB2YWx1ZSBjYW4gY2hhbmdlIHdpdGgKKyAqIGFueSByZWxlYXNlIHdpdGhvdXQgd2FybmluZyBhbmQgd2l0aG91dCBiZWluZyBjb25zaWRlcmVkIEFQSSBvciBBQkkKKyAqIGJyZWFrYWdlLiBZb3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBkZWZpbml0aW9uIGFueXdoZXJlIHdoZXJlIGl0CisgKiBtaWdodCBiZWNvbWUgcGFydCBvZiBhbiBBQkkuIFxzaW5jZSAwLjkuMTUgKi8KKyNkZWZpbmUgUEFfU1dfVk9MVU1FX1NOUFJJTlRfREJfTUFYIDEwCisKKy8qKiBQcmV0dHkgcHJpbnQgYSB2b2x1bWUgYnV0IHNob3cgZEIgdmFsdWVzLiBcc2luY2UgMC45LjE1ICovCitjaGFyICpwYV9zd192b2x1bWVfc25wcmludF9kQihjaGFyICpzLCBzaXplX3QgbCwgcGFfdm9sdW1lX3Qgdik7CisKKy8qKiBSZXR1cm4gdGhlIGF2ZXJhZ2Ugdm9sdW1lIG9mIGFsbCBjaGFubmVscyAqLworcGFfdm9sdW1lX3QgcGFfY3ZvbHVtZV9hdmcoY29uc3QgcGFfY3ZvbHVtZSAqYSkgUEFfR0NDX1BVUkU7CisKKy8qKiBSZXR1cm4gdGhlIGF2ZXJhZ2Ugdm9sdW1lIG9mIGFsbCBjaGFubmVscyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUKKyAqIHNwZWNpZmllZCBjaGFubmVsIG1hcCB3aXRoIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCBwb3NpdGlvbiBtYXNrLiBJZgorICogY20gaXMgTlVMTCB0aGlzIGNhbGwgaXMgaWRlbnRpY2FsIHRvIHBhX2N2b2x1bWVfYXZnKCkuIElmIG5vCisgKiBjaGFubmVsIGlzIHNlbGVjdGVkIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlCisgKiBQQV9WT0xVTUVfTVVURUQuIFxzaW5jZSAwLjkuMTYgKi8KK3BhX3ZvbHVtZV90IHBhX2N2b2x1bWVfYXZnX21hc2soY29uc3QgcGFfY3ZvbHVtZSAqYSwgY29uc3QgcGFfY2hhbm5lbF9tYXAgKmNtLCBwYV9jaGFubmVsX3Bvc2l0aW9uX21hc2tfdCBtYXNrKSBQQV9HQ0NfUFVSRTsKKworLyoqIFJldHVybiB0aGUgbWF4aW11bSB2b2x1bWUgb2YgYWxsIGNoYW5uZWxzLiBcc2luY2UgMC45LjEyICovCitwYV92b2x1bWVfdCBwYV9jdm9sdW1lX21heChjb25zdCBwYV9jdm9sdW1lICphKSBQQV9HQ0NfUFVSRTsKKworLyoqIFJldHVybiB0aGUgbWF4aW11bSB2b2x1bWUgb2YgYWxsIGNoYW5uZWxzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZQorICogc3BlY2lmaWVkIGNoYW5uZWwgbWFwIHdpdGggdGhlIHNwZWNpZmllZCBjaGFubmVsIHBvc2l0aW9uIG1hc2suIElmCisgKiBjbSBpcyBOVUxMIHRoaXMgY2FsbCBpcyBpZGVudGljYWwgdG8gcGFfY3ZvbHVtZV9tYXgoKS4gSWYgbm8KKyAqIGNoYW5uZWwgaXMgc2VsZWN0ZWQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgUEFfVk9MVU1FX01VVEVELgorICogXHNpbmNlIDAuOS4xNiAqLworcGFfdm9sdW1lX3QgcGFfY3ZvbHVtZV9tYXhfbWFzayhjb25zdCBwYV9jdm9sdW1lICphLCBjb25zdCBwYV9jaGFubmVsX21hcCAqY20sIHBhX2NoYW5uZWxfcG9zaXRpb25fbWFza190IG1hc2spIFBBX0dDQ19QVVJFOworCisvKiogUmV0dXJuIHRoZSBtaW5pbXVtIHZvbHVtZSBvZiBhbGwgY2hhbm5lbHMuIFxzaW5jZSAwLjkuMTYgKi8KK3BhX3ZvbHVtZV90IHBhX2N2b2x1bWVfbWluKGNvbnN0IHBhX2N2b2x1bWUgKmEpIFBBX0dDQ19QVVJFOworCisvKiogUmV0dXJuIHRoZSBtaW5pbXVtIHZvbHVtZSBvZiBhbGwgY2hhbm5lbHMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlCisgKiBzcGVjaWZpZWQgY2hhbm5lbCBtYXAgd2l0aCB0aGUgc3BlY2lmaWVkIGNoYW5uZWwgcG9zaXRpb24gbWFzay4gSWYKKyAqIGNtIGlzIE5VTEwgdGhpcyBjYWxsIGlzIGlkZW50aWNhbCB0byBwYV9jdm9sdW1lX21pbigpLiBJZiBubworICogY2hhbm5lbCBpcyBzZWxlY3RlZCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSBQQV9WT0xVTUVfTVVURUQuCisgKiBcc2luY2UgMC45LjE2ICovCitwYV92b2x1bWVfdCBwYV9jdm9sdW1lX21pbl9tYXNrKGNvbnN0IHBhX2N2b2x1bWUgKmEsIGNvbnN0IHBhX2NoYW5uZWxfbWFwICpjbSwgcGFfY2hhbm5lbF9wb3NpdGlvbl9tYXNrX3QgbWFzaykgUEFfR0NDX1BVUkU7CisKKy8qKiBSZXR1cm4gVFJVRSB3aGVuIHRoZSBwYXNzZWQgY3ZvbHVtZSBzdHJ1Y3R1cmUgaXMgdmFsaWQsIEZBTFNFIG90aGVyd2lzZSAqLworaW50IHBhX2N2b2x1bWVfdmFsaWQoY29uc3QgcGFfY3ZvbHVtZSAqdikgUEFfR0NDX1BVUkU7CisKKy8qKiBSZXR1cm4gbm9uLXplcm8gaWYgdGhlIHZvbHVtZSBvZiBhbGwgY2hhbm5lbHMgaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSAqLworaW50IHBhX2N2b2x1bWVfY2hhbm5lbHNfZXF1YWxfdG8oY29uc3QgcGFfY3ZvbHVtZSAqYSwgcGFfdm9sdW1lX3QgdikgUEFfR0NDX1BVUkU7CisKKy8qKiBSZXR1cm4gMSBpZiB0aGUgc3BlY2lmaWVkIHZvbHVtZSBoYXMgYWxsIGNoYW5uZWxzIG11dGVkICovCisjZGVmaW5lIHBhX2N2b2x1bWVfaXNfbXV0ZWQoYSkgcGFfY3ZvbHVtZV9jaGFubmVsc19lcXVhbF90bygoYSksIFBBX1ZPTFVNRV9NVVRFRCkKKworLyoqIFJldHVybiAxIGlmIHRoZSBzcGVjaWZpZWQgdm9sdW1lIGhhcyBhbGwgY2hhbm5lbHMgb24gbm9ybWFsIGxldmVsICovCisjZGVmaW5lIHBhX2N2b2x1bWVfaXNfbm9ybShhKSBwYV9jdm9sdW1lX2NoYW5uZWxzX2VxdWFsX3RvKChhKSwgUEFfVk9MVU1FX05PUk0pCisKKy8qKiBNdWx0aXBseSB0d28gdm9sdW1lIHNwZWNpZmljYXRpb25zLCByZXR1cm4gdGhlIHJlc3VsdC4gVGhpcyB1c2VzCisgKiBQQV9WT0xVTUVfTk9STSBhcyBuZXV0cmFsIGVsZW1lbnQgb2YgbXVsdGlwbGljYXRpb24uIFRoaXMgaXMgb25seQorICogdmFsaWQgZm9yIHNvZnR3YXJlIHZvbHVtZXMhICovCitwYV92b2x1bWVfdCBwYV9zd192b2x1bWVfbXVsdGlwbHkocGFfdm9sdW1lX3QgYSwgcGFfdm9sdW1lX3QgYikgUEFfR0NDX0NPTlNUOworCisvKiogTXVsdGlwbHkgdHdvIHBlci1jaGFubmVsIHZvbHVtZXMgYW5kIHJldHVybiB0aGUgcmVzdWx0IGluCisgKiAqZGVzdC4gVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBzb2Z0d2FyZSB2b2x1bWVzISBhLCBiIGFuZCBkZXN0IG1heQorICogcG9pbnQgdG8gdGhlIHNhbWUgc3RydWN0dXJlLiAqLworcGFfY3ZvbHVtZSAqcGFfc3dfY3ZvbHVtZV9tdWx0aXBseShwYV9jdm9sdW1lICpkZXN0LCBjb25zdCBwYV9jdm9sdW1lICphLCBjb25zdCBwYV9jdm9sdW1lICpiKTsKKworLyoqIE11bHRpcGx5IGEgcGVyLWNoYW5uZWwgdm9sdW1lIHdpdGggYSBzY2FsYXIgdm9sdW1lIGFuZCByZXR1cm4gdGhlCisgKiByZXN1bHQgaW4gKmRlc3QuIFRoaXMgaXMgb25seSB2YWxpZCBmb3Igc29mdHdhcmUgdm9sdW1lcyEgYQorICogYW5kIGRlc3QgbWF5IHBvaW50IHRvIHRoZSBzYW1lIHN0cnVjdHVyZS4gXHNpbmNlCisgKiAwLjkuMTYgKi8KK3BhX2N2b2x1bWUgKnBhX3N3X2N2b2x1bWVfbXVsdGlwbHlfc2NhbGFyKHBhX2N2b2x1bWUgKmRlc3QsIGNvbnN0IHBhX2N2b2x1bWUgKmEsIHBhX3ZvbHVtZV90IGIpOworCisvKiogRGl2aWRlIHR3byB2b2x1bWUgc3BlY2lmaWNhdGlvbnMsIHJldHVybiB0aGUgcmVzdWx0LiBUaGlzIHVzZXMKKyAqIFBBX1ZPTFVNRV9OT1JNIGFzIG5ldXRyYWwgZWxlbWVudCBvZiBkaXZpc2lvbi4gVGhpcyBpcyBvbmx5IHZhbGlkCisgKiBmb3Igc29mdHdhcmUgdm9sdW1lcyEgSWYgYSBkaXZpc2lvbiBieSB6ZXJvIGlzIHRyaWVkIHRoZSByZXN1bHQKKyAqIHdpbGwgYmUgMC4gXHNpbmNlIDAuOS4xMyAqLworcGFfdm9sdW1lX3QgcGFfc3dfdm9sdW1lX2RpdmlkZShwYV92b2x1bWVfdCBhLCBwYV92b2x1bWVfdCBiKSBQQV9HQ0NfQ09OU1Q7CisKKy8qKiBEaXZpZGUgdHdvIHBlci1jaGFubmVsIHZvbHVtZXMgYW5kIHJldHVybiB0aGUgcmVzdWx0IGluCisgKiAqZGVzdC4gVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBzb2Z0d2FyZSB2b2x1bWVzISBhLCBiCisgKiBhbmQgZGVzdCBtYXkgcG9pbnQgdG8gdGhlIHNhbWUgc3RydWN0dXJlLiBcc2luY2UgMC45LjEzICovCitwYV9jdm9sdW1lICpwYV9zd19jdm9sdW1lX2RpdmlkZShwYV9jdm9sdW1lICpkZXN0LCBjb25zdCBwYV9jdm9sdW1lICphLCBjb25zdCBwYV9jdm9sdW1lICpiKTsKKworLyoqIERpdmlkZSBhIHBlci1jaGFubmVsIHZvbHVtZSBieSBhIHNjYWxhciB2b2x1bWUgYW5kIHJldHVybiB0aGUKKyAqIHJlc3VsdCBpbiAqZGVzdC4gVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBzb2Z0d2FyZSB2b2x1bWVzISBhCisgKiBhbmQgZGVzdCBtYXkgcG9pbnQgdG8gdGhlIHNhbWUgc3RydWN0dXJlLiBcc2luY2UKKyAqIDAuOS4xNiAqLworcGFfY3ZvbHVtZSAqcGFfc3dfY3ZvbHVtZV9kaXZpZGVfc2NhbGFyKHBhX2N2b2x1bWUgKmRlc3QsIGNvbnN0IHBhX2N2b2x1bWUgKmEsIHBhX3ZvbHVtZV90IGIpOworCisvKiogQ29udmVydCBhIGRlY2liZWwgdmFsdWUgdG8gYSB2b2x1bWUgKGFtcGxpdHVkZSwgbm90IHBvd2VyKS4gVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBzb2Z0d2FyZSB2b2x1bWVzISAqLworcGFfdm9sdW1lX3QgcGFfc3dfdm9sdW1lX2Zyb21fZEIoZG91YmxlIGYpIFBBX0dDQ19DT05TVDsKKworLyoqIENvbnZlcnQgYSB2b2x1bWUgdG8gYSBkZWNpYmVsIHZhbHVlIChhbXBsaXR1ZGUsIG5vdCBwb3dlcikuIFRoaXMgaXMgb25seSB2YWxpZCBmb3Igc29mdHdhcmUgdm9sdW1lcyEgKi8KK2RvdWJsZSBwYV9zd192b2x1bWVfdG9fZEIocGFfdm9sdW1lX3QgdikgUEFfR0NDX0NPTlNUOworCisvKiogQ29udmVydCBhIGxpbmVhciBmYWN0b3IgdG8gYSB2b2x1bWUuICAwLjAgYW5kIGxlc3MgaXMgbXV0ZWQgd2hpbGUKKyAqIDEuMCBpcyBQQV9WT0xVTUVfTk9STS4gIFRoaXMgaXMgb25seSB2YWxpZCBmb3Igc29mdHdhcmUgdm9sdW1lcyEgKi8KK3BhX3ZvbHVtZV90IHBhX3N3X3ZvbHVtZV9mcm9tX2xpbmVhcihkb3VibGUgdikgUEFfR0NDX0NPTlNUOworCisvKiogQ29udmVydCBhIHZvbHVtZSB0byBhIGxpbmVhciBmYWN0b3IuIFRoaXMgaXMgb25seSB2YWxpZCBmb3Igc29mdHdhcmUgdm9sdW1lcyEgKi8KK2RvdWJsZSBwYV9zd192b2x1bWVfdG9fbGluZWFyKHBhX3ZvbHVtZV90IHYpIFBBX0dDQ19DT05TVDsKKworI2lmZGVmIElORklOSVRZCisjZGVmaW5lIFBBX0RFQ0lCRUxfTUlOSU5GVFkgKChkb3VibGUpIC1JTkZJTklUWSkKKyNlbHNlCisvKiogVGhpcyBmbG9vciB2YWx1ZSBpcyB1c2VkIGFzIG1pbnVzIGluZmluaXR5IHdoZW4gdXNpbmcgcGFfc3dfdm9sdW1lX3RvX2RCKCkgLyBwYV9zd192b2x1bWVfZnJvbV9kQigpLiAqLworI2RlZmluZSBQQV9ERUNJQkVMX01JTklORlRZICgoZG91YmxlKSAtMjAwLjApCisjZW5kaWYKKworLyoqIFJlbWFwIGEgdm9sdW1lIGZyb20gb25lIGNoYW5uZWwgbWFwcGluZyB0byBhIGRpZmZlcmVudCBjaGFubmVsIG1hcHBpbmcuIFxzaW5jZSAwLjkuMTIgKi8KK3BhX2N2b2x1bWUgKnBhX2N2b2x1bWVfcmVtYXAocGFfY3ZvbHVtZSAqdiwgY29uc3QgcGFfY2hhbm5lbF9tYXAgKmZyb20sIGNvbnN0IHBhX2NoYW5uZWxfbWFwICp0byk7CisKKy8qKiBSZXR1cm4gbm9uLXplcm8gaWYgdGhlIHNwZWNpZmllZCB2b2x1bWUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZQorICogc3BlY2lmaWVkIHNhbXBsZSBzcGVjLiBcc2luY2UgMC45LjEzICovCitpbnQgcGFfY3ZvbHVtZV9jb21wYXRpYmxlKGNvbnN0IHBhX2N2b2x1bWUgKnYsIGNvbnN0IHBhX3NhbXBsZV9zcGVjICpzcykgUEFfR0NDX1BVUkU7CisKKy8qKiBSZXR1cm4gbm9uLXplcm8gaWYgdGhlIHNwZWNpZmllZCB2b2x1bWUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZQorICogc3BlY2lmaWVkIHNhbXBsZSBzcGVjLiBcc2luY2UgMC45LjE1ICovCitpbnQgcGFfY3ZvbHVtZV9jb21wYXRpYmxlX3dpdGhfY2hhbm5lbF9tYXAoY29uc3QgcGFfY3ZvbHVtZSAqdiwgY29uc3QgcGFfY2hhbm5lbF9tYXAgKmNtKSBQQV9HQ0NfUFVSRTsKKworLyoqIENhbGN1bGF0ZSBhICdiYWxhbmNlJyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCB2b2x1bWUgd2l0aCB0aGUKKyAqIHNwZWNpZmllZCBjaGFubmVsIG1hcC4gVGhlIHJldHVybiB2YWx1ZSB3aWxsIHJhbmdlIGZyb20gLTEuMGYKKyAqIChsZWZ0KSB0byArMS4wZiAocmlnaHQpLiBJZiBubyBiYWxhbmNlIHZhbHVlIGlzIGFwcGxpY2FibGUgdG8gdGhpcworICogY2hhbm5lbCBtYXAgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGFsd2F5cyBiZSAwLjBmLiBTZWUKKyAqIHBhX2NoYW5uZWxfbWFwX2Nhbl9iYWxhbmNlKCkuIFxzaW5jZSAwLjkuMTUgKi8KK2Zsb2F0IHBhX2N2b2x1bWVfZ2V0X2JhbGFuY2UoY29uc3QgcGFfY3ZvbHVtZSAqdiwgY29uc3QgcGFfY2hhbm5lbF9tYXAgKm1hcCkgUEFfR0NDX1BVUkU7CisKKy8qKiBBZGp1c3QgdGhlICdiYWxhbmNlJyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCB2b2x1bWUgd2l0aCB0aGUKKyAqIHNwZWNpZmllZCBjaGFubmVsIG1hcC4gdiB3aWxsIGJlIG1vZGlmaWVkIGluIHBsYWNlIGFuZAorICogcmV0dXJuZWQuIFRoZSBiYWxhbmNlIGlzIGEgdmFsdWUgYmV0d2VlbiAtMS4wZiBhbmQgKzEuMGYuIFRoaXMKKyAqIG9wZXJhdGlvbiBtaWdodCBub3QgYmUgcmV2ZXJzaWJsZSEgQWxzbywgYWZ0ZXIgdGhpcyBjYWxsCisgKiBwYV9jdm9sdW1lX2dldF9iYWxhbmNlKCkgaXMgbm90IGd1YXJhbnRlZWQgdG8gYWN0dWFsbHkgcmV0dXJuIHRoZQorICogcmVxdWVzdGVkIGJhbGFuY2UgdmFsdWUgKGUuZy4gd2hlbiB0aGUgaW5wdXQgdm9sdW1lIHdhcyB6ZXJvIGFueXdheSBmb3IKKyAqIGFsbCBjaGFubmVscykuIElmIG5vIGJhbGFuY2UgdmFsdWUgaXMgYXBwbGljYWJsZSB0bworICogdGhpcyBjaGFubmVsIG1hcCB0aGUgdm9sdW1lIHdpbGwgbm90IGJlIG1vZGlmaWVkLiBTZWUKKyAqIHBhX2NoYW5uZWxfbWFwX2Nhbl9iYWxhbmNlKCkuIFxzaW5jZSAwLjkuMTUgKi8KK3BhX2N2b2x1bWUqIHBhX2N2b2x1bWVfc2V0X2JhbGFuY2UocGFfY3ZvbHVtZSAqdiwgY29uc3QgcGFfY2hhbm5lbF9tYXAgKm1hcCwgZmxvYXQgbmV3X2JhbGFuY2UpOworCisvKiogQ2FsY3VsYXRlIGEgJ2ZhZGUnIHZhbHVlIChpLmUuICdiYWxhbmNlJyBiZXR3ZWVuIGZyb250IGFuZCByZWFyKQorICogZm9yIHRoZSBzcGVjaWZpZWQgdm9sdW1lIHdpdGggdGhlIHNwZWNpZmllZCBjaGFubmVsIG1hcC4gVGhlIHJldHVybgorICogdmFsdWUgd2lsbCByYW5nZSBmcm9tIC0xLjBmIChyZWFyKSB0byArMS4wZiAobGVmdCkuIElmIG5vIGZhZGUKKyAqIHZhbHVlIGlzIGFwcGxpY2FibGUgdG8gdGhpcyBjaGFubmVsIG1hcCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwKKyAqIGFsd2F5cyBiZSAwLjBmLiBTZWUgcGFfY2hhbm5lbF9tYXBfY2FuX2ZhZGUoKS4gXHNpbmNlIDAuOS4xNSAqLworZmxvYXQgcGFfY3ZvbHVtZV9nZXRfZmFkZShjb25zdCBwYV9jdm9sdW1lICp2LCBjb25zdCBwYV9jaGFubmVsX21hcCAqbWFwKSBQQV9HQ0NfUFVSRTsKKworLyoqIEFkanVzdCB0aGUgJ2ZhZGUnIHZhbHVlIChpLmUuICdiYWxhbmNlJyBiZXR3ZWVuIGZyb250IGFuZCByZWFyKQorICogZm9yIHRoZSBzcGVjaWZpZWQgdm9sdW1lIHdpdGggdGhlIHNwZWNpZmllZCBjaGFubmVsIG1hcC4gdiB3aWxsIGJlCisgKiBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQuIFRoZSBiYWxhbmNlIGlzIGEgdmFsdWUgYmV0d2VlbgorICogLTEuMGYgYW5kICsxLjBmLiBUaGlzIG9wZXJhdGlvbiBtaWdodCBub3QgYmUgcmV2ZXJzaWJsZSEgQWxzbywKKyAqIGFmdGVyIHRoaXMgY2FsbCBwYV9jdm9sdW1lX2dldF9mYWRlKCkgaXMgbm90IGd1YXJhbnRlZWQgdG8gYWN0dWFsbHkKKyAqIHJldHVybiB0aGUgcmVxdWVzdGVkIGZhZGUgdmFsdWUgKGUuZy4gd2hlbiB0aGUgaW5wdXQgdm9sdW1lIHdhcworICogemVybyBhbnl3YXkgZm9yIGFsbCBjaGFubmVscykuIElmIG5vIGZhZGUgdmFsdWUgaXMgYXBwbGljYWJsZSB0bworICogdGhpcyBjaGFubmVsIG1hcCB0aGUgdm9sdW1lIHdpbGwgbm90IGJlIG1vZGlmaWVkLiBTZWUKKyAqIHBhX2NoYW5uZWxfbWFwX2Nhbl9mYWRlKCkuIFxzaW5jZSAwLjkuMTUgKi8KK3BhX2N2b2x1bWUqIHBhX2N2b2x1bWVfc2V0X2ZhZGUocGFfY3ZvbHVtZSAqdiwgY29uc3QgcGFfY2hhbm5lbF9tYXAgKm1hcCwgZmxvYXQgbmV3X2ZhZGUpOworCisvKiogU2NhbGUgdGhlIHBhc3NlZCBwYV9jdm9sdW1lIHN0cnVjdHVyZSBzbyB0aGF0IHRoZSBtYXhpbXVtIHZvbHVtZQorICogb2YgYWxsIGNoYW5uZWxzIGVxdWFscyBtYXguIFRoZSBwcm9wb3J0aW9ucyBiZXR3ZWVuIHRoZSBjaGFubmVsCisgKiB2b2x1bWVzIGFyZSBrZXB0LiBcc2luY2UgMC45LjE1ICovCitwYV9jdm9sdW1lKiBwYV9jdm9sdW1lX3NjYWxlKHBhX2N2b2x1bWUgKnYsIHBhX3ZvbHVtZV90IG1heCk7CisKKy8qKiBTY2FsZSB0aGUgcGFzc2VkIHBhX2N2b2x1bWUgc3RydWN0dXJlIHNvIHRoYXQgdGhlIG1heGltdW0gdm9sdW1lCisgKiBvZiBhbGwgY2hhbm5lbHMgc2VsZWN0ZWQgdmlhIGNtL21hc2sgZXF1YWxzIG1heC4gVGhpcyBhbHNvIG1vZGlmaWVzCisgKiB0aGUgdm9sdW1lIG9mIHRob3NlIGNoYW5uZWxzIHRoYXQgYXJlIHVubWFza2VkLiBUaGUgcHJvcG9ydGlvbnMKKyAqIGJldHdlZW4gdGhlIGNoYW5uZWwgdm9sdW1lcyBhcmUga2VwdC4gXHNpbmNlIDAuOS4xNiAqLworcGFfY3ZvbHVtZSogcGFfY3ZvbHVtZV9zY2FsZV9tYXNrKHBhX2N2b2x1bWUgKnYsIHBhX3ZvbHVtZV90IG1heCwgcGFfY2hhbm5lbF9tYXAgKmNtLCBwYV9jaGFubmVsX3Bvc2l0aW9uX21hc2tfdCBtYXNrKTsKKworLyoqIFNldCB0aGUgcGFzc2VkIHZvbHVtZSB0byBhbGwgY2hhbm5lbHMgYXQgdGhlIHNwZWNpZmllZCBjaGFubmVsCisgKiBwb3NpdGlvbi4gV2lsbCByZXR1cm4gdGhlIHVwZGF0ZWQgdm9sdW1lIHN0cnVjdCwgb3IgTlVMTCBpZiB0aGVyZQorICogaXMgbm8gY2hhbm5lbCBhdCB0aGUgcG9zaXRpb24gc3BlY2lmaWVkLiBZb3UgY2FuIGNoZWNrIGlmIGEgY2hhbm5lbAorICogbWFwIGluY2x1ZGVzIGEgc3BlY2lmaWMgcG9zaXRpb24gYnkgY2FsbGluZworICogcGFfY2hhbm5lbF9tYXBfaGFzX3Bvc2l0aW9uKCkuIFxzaW5jZSAwLjkuMTYgKi8KK3BhX2N2b2x1bWUqIHBhX2N2b2x1bWVfc2V0X3Bvc2l0aW9uKHBhX2N2b2x1bWUgKmN2LCBjb25zdCBwYV9jaGFubmVsX21hcCAqbWFwLCBwYV9jaGFubmVsX3Bvc2l0aW9uX3QgdCwgcGFfdm9sdW1lX3Qgdik7CisKKy8qKiBHZXQgdGhlIG1heGltdW0gdm9sdW1lIG9mIGFsbCBjaGFubmVscyBhdCB0aGUgc3BlY2lmaWVkIGNoYW5uZWwKKyAqIHBvc2l0aW9uLiBXaWxsIHJldHVybiAwIGlmIHRoZXJlIGlzIG5vIGNoYW5uZWwgYXQgdGhlIHBvc2l0aW9uCisgKiBzcGVjaWZpZWQuIFlvdSBjYW4gY2hlY2sgaWYgYSBjaGFubmVsIG1hcCBpbmNsdWRlcyBhIHNwZWNpZmljCisgKiBwb3NpdGlvbiBieSBjYWxsaW5nIHBhX2NoYW5uZWxfbWFwX2hhc19wb3NpdGlvbigpLiBcc2luY2UgMC45LjE2ICovCitwYV92b2x1bWVfdCBwYV9jdm9sdW1lX2dldF9wb3NpdGlvbihwYV9jdm9sdW1lICpjdiwgY29uc3QgcGFfY2hhbm5lbF9tYXAgKm1hcCwgcGFfY2hhbm5lbF9wb3NpdGlvbl90IHQpIFBBX0dDQ19QVVJFOworCisvKiogVGhpcyBnb2VzIHRocm91Z2ggYWxsIGNoYW5uZWxzIGluIGEgYW5kIGIgYW5kIHNldHMgdGhlCisgKiBjb3JyZXNwb25kaW5nIGNoYW5uZWwgaW4gZGVzdCB0byB0aGUgZ3JlYXRlciB2b2x1bWUgb2YgYm90aC4gYSwgYgorICogYW5kIGRlc3QgbWF5IHBvaW50IHRvIHRoZSBzYW1lIHN0cnVjdHVyZS4gXHNpbmNlIDAuOS4xNiAqLworcGFfY3ZvbHVtZSogcGFfY3ZvbHVtZV9tZXJnZShwYV9jdm9sdW1lICpkZXN0LCBjb25zdCBwYV9jdm9sdW1lICphLCBjb25zdCBwYV9jdm9sdW1lICpiKTsKKworLyoqIEluY3JlYXNlIHRoZSB2b2x1bWUgcGFzc2VkIGluIGJ5ICdpbmMnLCBidXQgbm90IGV4Y2VlZGluZyAnbGltaXQnLgorICogVGhlIHByb3BvcnRpb25zIGJldHdlZW4gdGhlIGNoYW5uZWxzIGFyZSBrZXB0LiBcc2luY2UgMC45LjE5ICovCitwYV9jdm9sdW1lKiBwYV9jdm9sdW1lX2luY19jbGFtcChwYV9jdm9sdW1lICp2LCBwYV92b2x1bWVfdCBpbmMsIHBhX3ZvbHVtZV90IGxpbWl0KTsKKworLyoqIEluY3JlYXNlIHRoZSB2b2x1bWUgcGFzc2VkIGluIGJ5ICdpbmMnLiBUaGUgcHJvcG9ydGlvbnMgYmV0d2VlbgorICogdGhlIGNoYW5uZWxzIGFyZSBrZXB0LiBcc2luY2UgMC45LjE2ICovCitwYV9jdm9sdW1lKiBwYV9jdm9sdW1lX2luYyhwYV9jdm9sdW1lICp2LCBwYV92b2x1bWVfdCBpbmMpOworCisvKiogSW5jcmVhc2UgdGhlIHZvbHVtZSBwYXNzZWQgaW4gYnkgJ2luYycuIFRoZSBwcm9wb3J0aW9ucyBiZXR3ZWVuCisgKiB0aGUgY2hhbm5lbHMgYXJlIGtlcHQuIFxzaW5jZSAwLjkuMTYgKi8KK3BhX2N2b2x1bWUqIHBhX2N2b2x1bWVfZGVjKHBhX2N2b2x1bWUgKnYsIHBhX3ZvbHVtZV90IGRlYyk7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3htYWxsb2MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UveG1hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MjBkODMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3htYWxsb2MuaApAQCAtMCwwICsxLDEwNyBAQAorI2lmbmRlZiBmb29tZW1vcnloZm9vCisjZGVmaW5lIGZvb21lbW9yeWhmb28KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL2djY21hY3JvLmg+CisjaW5jbHVkZSA8cHVsc2UvdmVyc2lvbi5oPgorCisvKiogXGZpbGUKKyAqIE1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KKyAqLworCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIEFsbG9jYXRlIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzLCBqdXN0IGxpa2UgbWFsbG9jKCkgZG9lcy4gSG93ZXZlciwgaW4gY2FzZSBvZiBPT00sIHRlcm1pbmF0ZSAqLwordm9pZCogcGFfeG1hbGxvYyhzaXplX3QgbCkgUEFfR0NDX01BTExPQyBQQV9HQ0NfQUxMT0NfU0laRSgxKTsKKworLyoqIFNhbWUgYXMgcGFfeG1hbGxvYygpLCBidXQgaW5pdGlhbGl6ZSBhbGxvY2F0ZWQgbWVtb3J5IHRvIDAgKi8KK3ZvaWQgKnBhX3htYWxsb2MwKHNpemVfdCBsKSBQQV9HQ0NfTUFMTE9DIFBBX0dDQ19BTExPQ19TSVpFKDEpOworCisvKiogIFRoZSBjb21iaW5hdGlvbiBvZiBwYV94bWFsbG9jKCkgYW5kIHJlYWxsb2MoKSAqLwordm9pZCAqcGFfeHJlYWxsb2Modm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkgUEFfR0NDX0FMTE9DX1NJWkUoMik7CisKKy8qKiBGcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KK3ZvaWQgcGFfeGZyZWUodm9pZCAqcCk7CisKKy8qKiBEdXBsaWNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcsIGFsbG9jYXRpbmcgbWVtb3J5IHdpdGggcGFfeG1hbGxvYygpICovCitjaGFyICpwYV94c3RyZHVwKGNvbnN0IGNoYXIgKnMpIFBBX0dDQ19NQUxMT0M7CisKKy8qKiBEdXBsaWNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcsIGJ1dCB0cnVuY2F0ZSBhZnRlciBsIGNoYXJhY3RlcnMgKi8KK2NoYXIgKnBhX3hzdHJuZHVwKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsKSBQQV9HQ0NfTUFMTE9DOworCisvKiogRHVwbGljYXRlIHRoZSBzcGVjaWZpZWQgbWVtb3J5IGJsb2NrICovCit2b2lkKiBwYV94bWVtZHVwKGNvbnN0IHZvaWQgKnAsIHNpemVfdCBsKSBQQV9HQ0NfTUFMTE9DIFBBX0dDQ19BTExPQ19TSVpFKDIpOworCisvKiogSW50ZXJuYWwgaGVscGVyIGZvciBwYV94bmV3KCkgKi8KK3N0YXRpYyB2b2lkKiBfcGFfeG5ld19pbnRlcm5hbChzaXplX3Qgbiwgc2l6ZV90IGspIFBBX0dDQ19NQUxMT0MgUEFfR0NDX0FMTE9DX1NJWkUyKDEsMik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCogX3BhX3huZXdfaW50ZXJuYWwoc2l6ZV90IG4sIHNpemVfdCBrKSB7CisgICAgYXNzZXJ0KG4gPCBJTlRfTUFYL2spOworICAgIHJldHVybiBwYV94bWFsbG9jKG4qayk7Cit9CisKKy8qKiBBbGxvY2F0ZSBuIG5ldyBzdHJ1Y3R1cmVzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4gKi8KKyNkZWZpbmUgcGFfeG5ldyh0eXBlLCBuKSAoKHR5cGUqKSBfcGFfeG5ld19pbnRlcm5hbCgobiksIHNpemVvZih0eXBlKSkpCisKKy8qKiBJbnRlcm5hbCBoZWxwZXIgZm9yIHBhX3huZXcwKCkgKi8KK3N0YXRpYyB2b2lkKiBfcGFfeG5ldzBfaW50ZXJuYWwoc2l6ZV90IG4sIHNpemVfdCBrKSBQQV9HQ0NfTUFMTE9DIFBBX0dDQ19BTExPQ19TSVpFMigxLDIpOworCitzdGF0aWMgaW5saW5lIHZvaWQqIF9wYV94bmV3MF9pbnRlcm5hbChzaXplX3Qgbiwgc2l6ZV90IGspIHsKKyAgICBhc3NlcnQobiA8IElOVF9NQVgvayk7CisgICAgcmV0dXJuIHBhX3htYWxsb2MwKG4qayk7Cit9CisKKy8qKiBTYW1lIGFzIHBhX3huZXcoKSBidXQgc2V0IHRoZSBtZW1vcnkgdG8gemVybyAqLworI2RlZmluZSBwYV94bmV3MCh0eXBlLCBuKSAoKHR5cGUqKSBfcGFfeG5ldzBfaW50ZXJuYWwoKG4pLCBzaXplb2YodHlwZSkpKQorCisvKiogSW50ZXJuYWwgaGVscGVyIGZvciBwYV94bmV3MCgpICovCitzdGF0aWMgdm9pZCogX3BhX3huZXdkdXBfaW50ZXJuYWwoY29uc3Qgdm9pZCAqcCwgc2l6ZV90IG4sIHNpemVfdCBrKSBQQV9HQ0NfTUFMTE9DIFBBX0dDQ19BTExPQ19TSVpFMigyLDMpOworCitzdGF0aWMgaW5saW5lIHZvaWQqIF9wYV94bmV3ZHVwX2ludGVybmFsKGNvbnN0IHZvaWQgKnAsIHNpemVfdCBuLCBzaXplX3QgaykgeworICAgIGFzc2VydChuIDwgSU5UX01BWC9rKTsKKyAgICByZXR1cm4gcGFfeG1lbWR1cChwLCBuKmspOworfQorCisvKiogU2FtZSBhcyBwYV94bmV3KCkgYnV0IGR1cGxpY2F0ZSB0aGUgc3BlY2lmaWVkIGRhdGEgKi8KKyNkZWZpbmUgcGFfeG5ld2R1cCh0eXBlLCBwLCBuKSAoKHR5cGUqKSBfcGFfeG5ld2R1cF9pbnRlcm5hbCgocCksIChuKSwgc2l6ZW9mKHR5cGUpKSkKKworLyoqIEludGVybmFsIGhlbHBlciBmb3IgcGFfeHJlbmV3KCkgKi8KK3N0YXRpYyB2b2lkKiBfcGFfeHJlbmV3X2ludGVybmFsKHZvaWQgKnAsIHNpemVfdCBuLCBzaXplX3QgaykgUEFfR0NDX01BTExPQyBQQV9HQ0NfQUxMT0NfU0laRTIoMiwzKTsKKworc3RhdGljIGlubGluZSB2b2lkKiBfcGFfeHJlbmV3X2ludGVybmFsKHZvaWQgKnAsIHNpemVfdCBuLCBzaXplX3QgaykgeworICAgIGFzc2VydChuIDwgSU5UX01BWC9rKTsKKyAgICByZXR1cm4gcGFfeHJlYWxsb2MocCwgbiprKTsKK30KKworLyoqIFJlYWxsb2NhdGUgbiBuZXcgc3RydWN0dXJlcyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuICovCisjZGVmaW5lIHBhX3hyZW5ldyh0eXBlLCBwLCBuKSAoKHR5cGUqKSBfcGFfeHJlbmV3X2ludGVybmFsKHAsIChuKSwgc2l6ZW9mKHR5cGUpKSkKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHdkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B3ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NzQxMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B3ZC5oCkBAIC0wLDAgKzEsMTg2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsMTk5MiwxOTk1LTIwMDEsMjAwMywyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJUE9TSVggU3RhbmRhcmQ6IDkuMi4yIFVzZXIgRGF0YWJhc2UgQWNjZXNzCTxwd2QuaD4KKyAqLworCisjaWZuZGVmCV9QV0RfSAorI2RlZmluZQlfUFdEX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmIGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisvKiBUaGUgU2luZ2xlIFVuaXggc3BlY2lmaWNhdGlvbiBzYXlzIHRoYXQgc29tZSBtb3JlIHR5cGVzIGFyZQorICAgYXZhaWxhYmxlIGhlcmUuICAqLworIyBpZm5kZWYgX19naWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fZ2lkX3QgZ2lkX3Q7CisjICBkZWZpbmUgX19naWRfdF9kZWZpbmVkCisjIGVuZGlmCisKKyMgaWZuZGVmIF9fdWlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3VpZF90IHVpZF90OworIyAgZGVmaW5lIF9fdWlkX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCisKKy8qIFRoZSBwYXNzd2Qgc3RydWN0dXJlLiAgKi8KK3N0cnVjdCBwYXNzd2QKK3sKKyAgY2hhciAqcHdfbmFtZTsJCS8qIFVzZXJuYW1lLiAgKi8KKyAgY2hhciAqcHdfcGFzc3dkOwkJLyogUGFzc3dvcmQuICAqLworICBfX3VpZF90IHB3X3VpZDsJCS8qIFVzZXIgSUQuICAqLworICBfX2dpZF90IHB3X2dpZDsJCS8qIEdyb3VwIElELiAgKi8KKyAgY2hhciAqcHdfZ2Vjb3M7CQkvKiBSZWFsIG5hbWUuICAqLworICBjaGFyICpwd19kaXI7CQkJLyogSG9tZSBkaXJlY3RvcnkuICAqLworICBjaGFyICpwd19zaGVsbDsJCS8qIFNoZWxsIHByb2dyYW0uICAqLworfTsKKworCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfR05VCisjIGRlZmluZSBfX25lZWRfRklMRQorIyBpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogUmV3aW5kIHRoZSBwYXNzd29yZC1maWxlIHN0cmVhbS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBzZXRwd2VudCAodm9pZCk7CisKKy8qIENsb3NlIHRoZSBwYXNzd29yZC1maWxlIHN0cmVhbS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBlbmRwd2VudCAodm9pZCk7CisKKy8qIFJlYWQgYW4gZW50cnkgZnJvbSB0aGUgcGFzc3dvcmQtZmlsZSBzdHJlYW0sIG9wZW5pbmcgaXQgaWYgbmVjZXNzYXJ5LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgcGFzc3dkICpnZXRwd2VudCAodm9pZCk7CisjZW5kaWYKKworI2lmZGVmCV9fVVNFX1NWSUQKKy8qIFJlYWQgYW4gZW50cnkgZnJvbSBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgcGFzc3dkICpmZ2V0cHdlbnQgKEZJTEUgKl9fc3RyZWFtKTsKKworLyogV3JpdGUgdGhlIGdpdmVuIGVudHJ5IG9udG8gdGhlIGdpdmVuIHN0cmVhbS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwdXRwd2VudCAoX19jb25zdCBzdHJ1Y3QgcGFzc3dkICpfX3Jlc3RyaWN0IF9fcCwKKwkJICAgICBGSUxFICpfX3Jlc3RyaWN0IF9fZik7CisjZW5kaWYKKworLyogU2VhcmNoIGZvciBhbiBlbnRyeSB3aXRoIGEgbWF0Y2hpbmcgdXNlciBJRC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IHBhc3N3ZCAqZ2V0cHd1aWQgKF9fdWlkX3QgX191aWQpOworCisvKiBTZWFyY2ggZm9yIGFuIGVudHJ5IHdpdGggYSBtYXRjaGluZyB1c2VybmFtZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IHBhc3N3ZCAqZ2V0cHduYW0gKF9fY29uc3QgY2hhciAqX19uYW1lKTsKKworI2lmIGRlZmluZWQgX19VU0VfUE9TSVggfHwgZGVmaW5lZCBfX1VTRV9NSVNDCisKKyMgaWZkZWYgX19VU0VfTUlTQworLyogUmVhc29uYWJsZSB2YWx1ZSBmb3IgdGhlIGJ1ZmZlciBzaXplZCB1c2VkIGluIHRoZSByZWVudHJhbnQKKyAgIGZ1bmN0aW9ucyBiZWxvdy4gIEJ1dCBiZXR0ZXIgdXNlIGBzeXNjb25mJy4gICovCisjICBkZWZpbmUgTlNTX0JVRkxFTl9QQVNTV0QJMTAyNAorIyBlbmRpZgorCisvKiBSZWVudHJhbnQgdmVyc2lvbnMgb2Ygc29tZSBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlLgorCisgICBQTEVBU0UgTk9URTogdGhlIGBnZXRwd2VudF9yJyBmdW5jdGlvbiBpcyBub3QgKHlldCkgc3RhbmRhcmRpemVkLgorICAgVGhlIGludGVyZmFjZSBtYXkgY2hhbmdlIGluIGxhdGVyIHZlcnNpb25zIG9mIHRoaXMgbGlicmFyeS4gIEJ1dAorICAgdGhlIGludGVyZmFjZSBpcyBkZXNpZ25lZCBmb2xsb3dpbmcgdGhlIHByaW5jaXBhbHMgdXNlZCBmb3IgdGhlCisgICBvdGhlciByZWVudHJhbnQgZnVuY3Rpb25zIHNvIHRoZSBjaGFuY2VzIGFyZSBnb29kIHRoaXMgaXMgd2hhdCB0aGUKKyAgIFBPU0lYIHBlb3BsZSB3b3VsZCBjaG9vc2UuICAqLworCisjIGlmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKy8qIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0cHdlbnRfciAoc3RydWN0IHBhc3N3ZCAqX19yZXN0cmljdCBfX3Jlc3VsdGJ1ZiwKKwkJICAgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJICAgICAgIHN0cnVjdCBwYXNzd2QgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KTsKKyMgZW5kaWYKKworZXh0ZXJuIGludCBnZXRwd3VpZF9yIChfX3VpZF90IF9fdWlkLAorCQkgICAgICAgc3RydWN0IHBhc3N3ZCAqX19yZXN0cmljdCBfX3Jlc3VsdGJ1ZiwKKwkJICAgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJICAgICAgIHN0cnVjdCBwYXNzd2QgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KTsKKworZXh0ZXJuIGludCBnZXRwd25hbV9yIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLAorCQkgICAgICAgc3RydWN0IHBhc3N3ZCAqX19yZXN0cmljdCBfX3Jlc3VsdGJ1ZiwKKwkJICAgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJICAgICAgIHN0cnVjdCBwYXNzd2QgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KTsKKworCisjIGlmZGVmCV9fVVNFX1NWSUQKKy8qIFJlYWQgYW4gZW50cnkgZnJvbSBTVFJFQU0uICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBzdGFuZGFyZGl6ZWQgYW5kCisgICBwcm9iYWJseSBuZXZlciB3aWxsLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZnZXRwd2VudF9yIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCQkJc3RydWN0IHBhc3N3ZCAqX19yZXN0cmljdCBfX3Jlc3VsdGJ1ZiwKKwkJCWNoYXIgKl9fcmVzdHJpY3QgX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCXN0cnVjdCBwYXNzd2QgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KTsKKyMgZW5kaWYKKworI2VuZGlmCS8qIFBPU0lYIG9yIHJlZW50cmFudCAqLworCisjaWZkZWYgX19VU0VfR05VCisvKiBSZS1jb25zdHJ1Y3QgdGhlIHBhc3N3b3JkLWZpbGUgbGluZSBmb3IgdGhlIGdpdmVuIHVpZAorICAgaW4gdGhlIGdpdmVuIGJ1ZmZlci4gIFRoaXMga25vd3MgdGhlIGZvcm1hdCB0aGF0IHRoZSBjYWxsZXIKKyAgIHdpbGwgZXhwZWN0LCBidXQgdGhpcyBuZWVkIG5vdCBiZSB0aGUgZm9ybWF0IG9mIHRoZSBwYXNzd29yZCBmaWxlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGdldHB3IChfX3VpZF90IF9fdWlkLCBjaGFyICpfX2J1ZmZlcik7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHB3ZC5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9yZG1hL2liX3VzZXJfY20uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmRtYS9pYl91c2VyX2NtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5MDE0YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmRtYS9pYl91c2VyX2NtLmgKQEAgLTAsMCArMSwzMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgVG9wc3BpbiBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBJQl9VU0VSX0NNX0gKKyNkZWZpbmUgSUJfVVNFUl9DTV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPHJkbWEvaWJfdXNlcl9zYS5oPgorCisjZGVmaW5lIElCX1VTRVJfQ01fQUJJX1ZFUlNJT04gNQorCitlbnVtIHsKKwlJQl9VU0VSX0NNX0NNRF9DUkVBVEVfSUQsCisJSUJfVVNFUl9DTV9DTURfREVTVFJPWV9JRCwKKwlJQl9VU0VSX0NNX0NNRF9BVFRSX0lELAorCisJSUJfVVNFUl9DTV9DTURfTElTVEVOLAorCUlCX1VTRVJfQ01fQ01EX05PVElGWSwKKworCUlCX1VTRVJfQ01fQ01EX1NFTkRfUkVRLAorCUlCX1VTRVJfQ01fQ01EX1NFTkRfUkVQLAorCUlCX1VTRVJfQ01fQ01EX1NFTkRfUlRVLAorCUlCX1VTRVJfQ01fQ01EX1NFTkRfRFJFUSwKKwlJQl9VU0VSX0NNX0NNRF9TRU5EX0RSRVAsCisJSUJfVVNFUl9DTV9DTURfU0VORF9SRUosCisJSUJfVVNFUl9DTV9DTURfU0VORF9NUkEsCisJSUJfVVNFUl9DTV9DTURfU0VORF9MQVAsCisJSUJfVVNFUl9DTV9DTURfU0VORF9BUFIsCisJSUJfVVNFUl9DTV9DTURfU0VORF9TSURSX1JFUSwKKwlJQl9VU0VSX0NNX0NNRF9TRU5EX1NJRFJfUkVQLAorCisJSUJfVVNFUl9DTV9DTURfRVZFTlQsCisJSUJfVVNFUl9DTV9DTURfSU5JVF9RUF9BVFRSLAorfTsKKy8qCisgKiBjb21tYW5kIEFCSSBzdHJ1Y3R1cmVzLgorICovCitzdHJ1Y3QgaWJfdWNtX2NtZF9oZHIgeworCV9fdTMyIGNtZDsKKwlfX3UxNiBpbjsKKwlfX3UxNiBvdXQ7Cit9OworCitzdHJ1Y3QgaWJfdWNtX2NyZWF0ZV9pZCB7CisJX191NjQgdWlkOworCV9fdTY0IHJlc3BvbnNlOworfTsKKworc3RydWN0IGliX3VjbV9jcmVhdGVfaWRfcmVzcCB7CisJX191MzIgaWQ7Cit9OworCitzdHJ1Y3QgaWJfdWNtX2Rlc3Ryb3lfaWQgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTMyIGlkOworCV9fdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IGliX3VjbV9kZXN0cm95X2lkX3Jlc3AgeworCV9fdTMyIGV2ZW50c19yZXBvcnRlZDsKK307CisKK3N0cnVjdCBpYl91Y21fYXR0cl9pZCB7CisJX191NjQgcmVzcG9uc2U7CisJX191MzIgaWQ7CisJX191MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgaWJfdWNtX2F0dHJfaWRfcmVzcCB7CisJX19iZTY0IHNlcnZpY2VfaWQ7CisJX19iZTY0IHNlcnZpY2VfbWFzazsKKwlfX2JlMzIgbG9jYWxfaWQ7CisJX19iZTMyIHJlbW90ZV9pZDsKK307CisKK3N0cnVjdCBpYl91Y21faW5pdF9xcF9hdHRyIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3UzMiBpZDsKKwlfX3UzMiBxcF9zdGF0ZTsKK307CisKK3N0cnVjdCBpYl91Y21fbGlzdGVuIHsKKwlfX2JlNjQgc2VydmljZV9pZDsKKwlfX2JlNjQgc2VydmljZV9tYXNrOworCV9fdTMyIGlkOworCV9fdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IGliX3VjbV9ub3RpZnkgeworCV9fdTMyIGlkOworCV9fdTMyIGV2ZW50OworfTsKKworc3RydWN0IGliX3VjbV9wcml2YXRlX2RhdGEgeworCV9fdTY0IGRhdGE7CisJX191MzIgaWQ7CisJX191OCAgbGVuOworCV9fdTggIHJlc2VydmVkWzNdOworfTsKKworc3RydWN0IGliX3VjbV9yZXEgeworCV9fdTMyIGlkOworCV9fdTMyIHFwbjsKKwlfX3UzMiBxcF90eXBlOworCV9fdTMyIHBzbjsKKwlfX2JlNjQgc2lkOworCV9fdTY0IGRhdGE7CisJX191NjQgcHJpbWFyeV9wYXRoOworCV9fdTY0IGFsdGVybmF0ZV9wYXRoOworCV9fdTggIGxlbjsKKwlfX3U4ICBwZWVyX3RvX3BlZXI7CisJX191OCAgcmVzcG9uZGVyX3Jlc291cmNlczsKKwlfX3U4ICBpbml0aWF0b3JfZGVwdGg7CisJX191OCAgcmVtb3RlX2NtX3Jlc3BvbnNlX3RpbWVvdXQ7CisJX191OCAgZmxvd19jb250cm9sOworCV9fdTggIGxvY2FsX2NtX3Jlc3BvbnNlX3RpbWVvdXQ7CisJX191OCAgcmV0cnlfY291bnQ7CisJX191OCAgcm5yX3JldHJ5X2NvdW50OworCV9fdTggIG1heF9jbV9yZXRyaWVzOworCV9fdTggIHNycTsKKwlfX3U4ICByZXNlcnZlZFs1XTsKK307CisKK3N0cnVjdCBpYl91Y21fcmVwIHsKKwlfX3U2NCB1aWQ7CisJX191NjQgZGF0YTsKKwlfX3UzMiBpZDsKKwlfX3UzMiBxcG47CisJX191MzIgcHNuOworCV9fdTggIGxlbjsKKwlfX3U4ICByZXNwb25kZXJfcmVzb3VyY2VzOworCV9fdTggIGluaXRpYXRvcl9kZXB0aDsKKwlfX3U4ICB0YXJnZXRfYWNrX2RlbGF5OworCV9fdTggIGZhaWxvdmVyX2FjY2VwdGVkOworCV9fdTggIGZsb3dfY29udHJvbDsKKwlfX3U4ICBybnJfcmV0cnlfY291bnQ7CisJX191OCAgc3JxOworCV9fdTggIHJlc2VydmVkWzRdOworfTsKKworc3RydWN0IGliX3VjbV9pbmZvIHsKKwlfX3UzMiBpZDsKKwlfX3UzMiBzdGF0dXM7CisJX191NjQgaW5mbzsKKwlfX3U2NCBkYXRhOworCV9fdTggIGluZm9fbGVuOworCV9fdTggIGRhdGFfbGVuOworCV9fdTggIHJlc2VydmVkWzZdOworfTsKKworc3RydWN0IGliX3VjbV9tcmEgeworCV9fdTY0IGRhdGE7CisJX191MzIgaWQ7CisJX191OCAgbGVuOworCV9fdTggIHRpbWVvdXQ7CisJX191OCAgcmVzZXJ2ZWRbMl07Cit9OworCitzdHJ1Y3QgaWJfdWNtX2xhcCB7CisJX191NjQgcGF0aDsKKwlfX3U2NCBkYXRhOworCV9fdTMyIGlkOworCV9fdTggIGxlbjsKKwlfX3U4ICByZXNlcnZlZFszXTsKK307CisKK3N0cnVjdCBpYl91Y21fc2lkcl9yZXEgeworCV9fdTMyIGlkOworCV9fdTMyIHRpbWVvdXQ7CisJX19iZTY0IHNpZDsKKwlfX3U2NCBkYXRhOworCV9fdTY0IHBhdGg7CisJX191MTYgcmVzZXJ2ZWRfcGtleTsKKwlfX3U4ICBsZW47CisJX191OCAgbWF4X2NtX3JldHJpZXM7CisJX191OCAgcmVzZXJ2ZWRbNF07Cit9OworCitzdHJ1Y3QgaWJfdWNtX3NpZHJfcmVwIHsKKwlfX3UzMiBpZDsKKwlfX3UzMiBxcG47CisJX191MzIgcWtleTsKKwlfX3UzMiBzdGF0dXM7CisJX191NjQgaW5mbzsKKwlfX3U2NCBkYXRhOworCV9fdTggIGluZm9fbGVuOworCV9fdTggIGRhdGFfbGVuOworCV9fdTggIHJlc2VydmVkWzZdOworfTsKKy8qCisgKiBldmVudCBub3RpZmljYXRpb24gQUJJIHN0cnVjdHVyZXMuCisgKi8KK3N0cnVjdCBpYl91Y21fZXZlbnRfZ2V0IHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U2NCBkYXRhOworCV9fdTY0IGluZm87CisJX191OCAgZGF0YV9sZW47CisJX191OCAgaW5mb19sZW47CisJX191OCAgcmVzZXJ2ZWRbNl07Cit9OworCitzdHJ1Y3QgaWJfdWNtX3JlcV9ldmVudF9yZXNwIHsKKwlzdHJ1Y3QgaWJfdXNlcl9wYXRoX3JlYyBwcmltYXJ5X3BhdGg7CisJc3RydWN0IGliX3VzZXJfcGF0aF9yZWMgYWx0ZXJuYXRlX3BhdGg7CisJX19iZTY0ICAgICAgICAgICAgICAgICByZW1vdGVfY2FfZ3VpZDsKKwlfX3UzMiAgICAgICAgICAgICAgICAgIHJlbW90ZV9xa2V5OworCV9fdTMyICAgICAgICAgICAgICAgICAgcmVtb3RlX3FwbjsKKwlfX3UzMiAgICAgICAgICAgICAgICAgIHFwX3R5cGU7CisJX191MzIgICAgICAgICAgICAgICAgICBzdGFydGluZ19wc247CisJX191OCAgcmVzcG9uZGVyX3Jlc291cmNlczsKKwlfX3U4ICBpbml0aWF0b3JfZGVwdGg7CisJX191OCAgbG9jYWxfY21fcmVzcG9uc2VfdGltZW91dDsKKwlfX3U4ICBmbG93X2NvbnRyb2w7CisJX191OCAgcmVtb3RlX2NtX3Jlc3BvbnNlX3RpbWVvdXQ7CisJX191OCAgcmV0cnlfY291bnQ7CisJX191OCAgcm5yX3JldHJ5X2NvdW50OworCV9fdTggIHNycTsKKwlfX3U4ICBwb3J0OworCV9fdTggIHJlc2VydmVkWzddOworfTsKKworc3RydWN0IGliX3VjbV9yZXBfZXZlbnRfcmVzcCB7CisJX19iZTY0IHJlbW90ZV9jYV9ndWlkOworCV9fdTMyIHJlbW90ZV9xa2V5OworCV9fdTMyIHJlbW90ZV9xcG47CisJX191MzIgc3RhcnRpbmdfcHNuOworCV9fdTggIHJlc3BvbmRlcl9yZXNvdXJjZXM7CisJX191OCAgaW5pdGlhdG9yX2RlcHRoOworCV9fdTggIHRhcmdldF9hY2tfZGVsYXk7CisJX191OCAgZmFpbG92ZXJfYWNjZXB0ZWQ7CisJX191OCAgZmxvd19jb250cm9sOworCV9fdTggIHJucl9yZXRyeV9jb3VudDsKKwlfX3U4ICBzcnE7CisJX191OCAgcmVzZXJ2ZWRbNV07Cit9OworCitzdHJ1Y3QgaWJfdWNtX3Jlal9ldmVudF9yZXNwIHsKKwlfX3UzMiByZWFzb247CisJLyogYXJpIGluIGliX3VjbV9ldmVudF9nZXQgaW5mbyBmaWVsZC4gKi8KK307CisKK3N0cnVjdCBpYl91Y21fbXJhX2V2ZW50X3Jlc3AgeworCV9fdTggIHRpbWVvdXQ7CisJX191OCAgcmVzZXJ2ZWRbM107Cit9OworCitzdHJ1Y3QgaWJfdWNtX2xhcF9ldmVudF9yZXNwIHsKKwlzdHJ1Y3QgaWJfdXNlcl9wYXRoX3JlYyBwYXRoOworfTsKKworc3RydWN0IGliX3VjbV9hcHJfZXZlbnRfcmVzcCB7CisJX191MzIgc3RhdHVzOworCS8qIGFwciBpbmZvIGluIGliX3VjbV9ldmVudF9nZXQgaW5mbyBmaWVsZC4gKi8KK307CisKK3N0cnVjdCBpYl91Y21fc2lkcl9yZXFfZXZlbnRfcmVzcCB7CisJX191MTYgcGtleTsKKwlfX3U4ICBwb3J0OworCV9fdTggIHJlc2VydmVkOworfTsKKworc3RydWN0IGliX3VjbV9zaWRyX3JlcF9ldmVudF9yZXNwIHsKKwlfX3UzMiBzdGF0dXM7CisJX191MzIgcWtleTsKKwlfX3UzMiBxcG47CisJLyogaW5mbyBpbiBpYl91Y21fZXZlbnRfZ2V0IGluZm8gZmllbGQuICovCit9OworCisjZGVmaW5lIElCX1VDTV9QUkVTX0RBVEEgICAgICAweDAxCisjZGVmaW5lIElCX1VDTV9QUkVTX0lORk8gICAgICAweDAyCisjZGVmaW5lIElCX1VDTV9QUkVTX1BSSU1BUlkgICAweDA0CisjZGVmaW5lIElCX1VDTV9QUkVTX0FMVEVSTkFURSAweDA4CisKK3N0cnVjdCBpYl91Y21fZXZlbnRfcmVzcCB7CisJX191NjQgdWlkOworCV9fdTMyIGlkOworCV9fdTMyIGV2ZW50OworCV9fdTMyIHByZXNlbnQ7CisJX191MzIgcmVzZXJ2ZWQ7CisJdW5pb24geworCQlzdHJ1Y3QgaWJfdWNtX3JlcV9ldmVudF9yZXNwIHJlcV9yZXNwOworCQlzdHJ1Y3QgaWJfdWNtX3JlcF9ldmVudF9yZXNwIHJlcF9yZXNwOworCQlzdHJ1Y3QgaWJfdWNtX3Jlal9ldmVudF9yZXNwIHJlal9yZXNwOworCQlzdHJ1Y3QgaWJfdWNtX21yYV9ldmVudF9yZXNwIG1yYV9yZXNwOworCQlzdHJ1Y3QgaWJfdWNtX2xhcF9ldmVudF9yZXNwIGxhcF9yZXNwOworCQlzdHJ1Y3QgaWJfdWNtX2Fwcl9ldmVudF9yZXNwIGFwcl9yZXNwOworCisJCXN0cnVjdCBpYl91Y21fc2lkcl9yZXFfZXZlbnRfcmVzcCBzaWRyX3JlcV9yZXNwOworCQlzdHJ1Y3QgaWJfdWNtX3NpZHJfcmVwX2V2ZW50X3Jlc3Agc2lkcl9yZXBfcmVzcDsKKworCQlfX3UzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF9zdGF0dXM7CisJfSB1OworfTsKKworI2VuZGlmIC8qIElCX1VTRVJfQ01fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9yZG1hL2liX3VzZXJfbWFkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JkbWEvaWJfdXNlcl9tYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmZjZTFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9yZG1hL2liX3VzZXJfbWFkLmgKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVG9wc3BpbiBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgVm9sdGFpcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgSUJfVVNFUl9NQURfSAorI2RlZmluZSBJQl9VU0VSX01BRF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKy8qCisgKiBJbmNyZW1lbnQgdGhpcyB2YWx1ZSBpZiBhbnkgY2hhbmdlcyB0aGF0IGJyZWFrIHVzZXJzcGFjZSBBQkkKKyAqIGNvbXBhdGliaWxpdHkgYXJlIG1hZGUuCisgKi8KKyNkZWZpbmUgSUJfVVNFUl9NQURfQUJJX1ZFUlNJT04JNQorCisvKgorICogTWFrZSBzdXJlIHRoYXQgYWxsIHN0cnVjdHMgZGVmaW5lZCBpbiB0aGlzIGZpbGUgcmVtYWluIGxhaWQgb3V0IHNvCisgKiB0aGF0IHRoZXkgcGFjayB0aGUgc2FtZSB3YXkgb24gMzItYml0IGFuZCA2NC1iaXQgYXJjaGl0ZWN0dXJlcyAodG8KKyAqIGF2b2lkIGluY29tcGF0aWJpbGl0eSBiZXR3ZWVuIDMyLWJpdCB1c2Vyc3BhY2UgYW5kIDY0LWJpdCBrZXJuZWxzKS4KKyAqLworCisvKioKKyAqIGliX3VzZXJfbWFkX2hkcl9vbGQgLSBPbGQgdmVyc2lvbiBvZiBNQUQgcGFja2V0IGhlYWRlciB3aXRob3V0IHBrZXlfaW5kZXgKKyAqIEBpZCAtIElEIG9mIGFnZW50IE1BRCByZWNlaXZlZCB3aXRoL3RvIGJlIHNlbnQgd2l0aAorICogQHN0YXR1cyAtIDAgb24gc3VjY2Vzc2Z1bCByZWNlaXZlLCBFVElNRURPVVQgaWYgbm8gcmVzcG9uc2UKKyAqICAgcmVjZWl2ZWQgKHRyYW5zYWN0aW9uIElEIGluIGRhdGFbXSB3aWxsIGJlIHNldCB0byBUSUQgb2Ygb3JpZ2luYWwKKyAqICAgcmVxdWVzdCkgKGlnbm9yZWQgb24gc2VuZCkKKyAqIEB0aW1lb3V0X21zIC0gTWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIHJlc3BvbnNlICh1bnNldCBvbiByZWNlaXZlKQorICogQHJldHJpZXMgLSBOdW1iZXIgb2YgYXV0b21hdGljIHJldHJpZXMgdG8gYXR0ZW1wdAorICogQHFwbiAtIFJlbW90ZSBRUCBudW1iZXIgcmVjZWl2ZWQgZnJvbS90byBiZSBzZW50IHRvCisgKiBAcWtleSAtIFJlbW90ZSBRX0tleSB0byBiZSBzZW50IHdpdGggKHVuc2V0IG9uIHJlY2VpdmUpCisgKiBAbGlkIC0gUmVtb3RlIGxpZCByZWNlaXZlZCBmcm9tL3RvIGJlIHNlbnQgdG8KKyAqIEBzbCAtIFNlcnZpY2UgbGV2ZWwgcmVjZWl2ZWQgd2l0aC90byBiZSBzZW50IHdpdGgKKyAqIEBwYXRoX2JpdHMgLSBMb2NhbCBwYXRoIGJpdHMgcmVjZWl2ZWQgd2l0aC90byBiZSBzZW50IHdpdGgKKyAqIEBncmhfcHJlc2VudCAtIElmIHNldCwgR1JIIHdhcyByZWNlaXZlZC9zaG91bGQgYmUgc2VudAorICogQGdpZF9pbmRleCAtIExvY2FsIEdJRCBpbmRleCB0byBzZW5kIHdpdGggKHVuc2V0IG9uIHJlY2VpdmUpCisgKiBAaG9wX2xpbWl0IC0gSG9wIGxpbWl0IGluIEdSSAorICogQHRyYWZmaWNfY2xhc3MgLSBUcmFmZmljIGNsYXNzIGluIEdSSAorICogQGdpZCAtIFJlbW90ZSBHSUQgaW4gR1JICisgKiBAZmxvd19sYWJlbCAtIEZsb3cgbGFiZWwgaW4gR1JICisgKi8KK3N0cnVjdCBpYl91c2VyX21hZF9oZHJfb2xkIHsKKwlfX3UzMglpZDsKKwlfX3UzMglzdGF0dXM7CisJX191MzIJdGltZW91dF9tczsKKwlfX3UzMglyZXRyaWVzOworCV9fdTMyCWxlbmd0aDsKKwlfX2JlMzIJcXBuOworCV9fYmUzMiAgcWtleTsKKwlfX2JlMTYJbGlkOworCV9fdTgJc2w7CisJX191OAlwYXRoX2JpdHM7CisJX191OAlncmhfcHJlc2VudDsKKwlfX3U4CWdpZF9pbmRleDsKKwlfX3U4CWhvcF9saW1pdDsKKwlfX3U4CXRyYWZmaWNfY2xhc3M7CisJX191OAlnaWRbMTZdOworCV9fYmUzMglmbG93X2xhYmVsOworfTsKKworLyoqCisgKiBpYl91c2VyX21hZF9oZHIgLSBNQUQgcGFja2V0IGhlYWRlcgorICogICBUaGlzIGxheW91dCBhbGxvd3Mgc3BlY2lmeWluZy9yZWNlaXZpbmcgdGhlIFBfS2V5IGluZGV4LiAgVG8gdXNlCisgKiAgIHRoaXMgY2FwYWJpbGl0eSwgYW4gYXBwbGljYXRpb24gbXVzdCBjYWxsIHRoZQorICogICBJQl9VU0VSX01BRF9FTkFCTEVfUEtFWSBpb2N0bCBvbiB0aGUgdXNlciBNQUQgZmlsZSBoYW5kbGUgYmVmb3JlCisgKiAgIGFueSBvdGhlciBhY3Rpb25zIHdpdGggdGhlIGZpbGUgaGFuZGxlLgorICogQGlkIC0gSUQgb2YgYWdlbnQgTUFEIHJlY2VpdmVkIHdpdGgvdG8gYmUgc2VudCB3aXRoCisgKiBAc3RhdHVzIC0gMCBvbiBzdWNjZXNzZnVsIHJlY2VpdmUsIEVUSU1FRE9VVCBpZiBubyByZXNwb25zZQorICogICByZWNlaXZlZCAodHJhbnNhY3Rpb24gSUQgaW4gZGF0YVtdIHdpbGwgYmUgc2V0IHRvIFRJRCBvZiBvcmlnaW5hbAorICogICByZXF1ZXN0KSAoaWdub3JlZCBvbiBzZW5kKQorICogQHRpbWVvdXRfbXMgLSBNaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgcmVzcG9uc2UgKHVuc2V0IG9uIHJlY2VpdmUpCisgKiBAcmV0cmllcyAtIE51bWJlciBvZiBhdXRvbWF0aWMgcmV0cmllcyB0byBhdHRlbXB0CisgKiBAcXBuIC0gUmVtb3RlIFFQIG51bWJlciByZWNlaXZlZCBmcm9tL3RvIGJlIHNlbnQgdG8KKyAqIEBxa2V5IC0gUmVtb3RlIFFfS2V5IHRvIGJlIHNlbnQgd2l0aCAodW5zZXQgb24gcmVjZWl2ZSkKKyAqIEBsaWQgLSBSZW1vdGUgbGlkIHJlY2VpdmVkIGZyb20vdG8gYmUgc2VudCB0bworICogQHNsIC0gU2VydmljZSBsZXZlbCByZWNlaXZlZCB3aXRoL3RvIGJlIHNlbnQgd2l0aAorICogQHBhdGhfYml0cyAtIExvY2FsIHBhdGggYml0cyByZWNlaXZlZCB3aXRoL3RvIGJlIHNlbnQgd2l0aAorICogQGdyaF9wcmVzZW50IC0gSWYgc2V0LCBHUkggd2FzIHJlY2VpdmVkL3Nob3VsZCBiZSBzZW50CisgKiBAZ2lkX2luZGV4IC0gTG9jYWwgR0lEIGluZGV4IHRvIHNlbmQgd2l0aCAodW5zZXQgb24gcmVjZWl2ZSkKKyAqIEBob3BfbGltaXQgLSBIb3AgbGltaXQgaW4gR1JICisgKiBAdHJhZmZpY19jbGFzcyAtIFRyYWZmaWMgY2xhc3MgaW4gR1JICisgKiBAZ2lkIC0gUmVtb3RlIEdJRCBpbiBHUkgKKyAqIEBmbG93X2xhYmVsIC0gRmxvdyBsYWJlbCBpbiBHUkgKKyAqIEBwa2V5X2luZGV4IC0gUF9LZXkgaW5kZXgKKyAqLworc3RydWN0IGliX3VzZXJfbWFkX2hkciB7CisJX191MzIJaWQ7CisJX191MzIJc3RhdHVzOworCV9fdTMyCXRpbWVvdXRfbXM7CisJX191MzIJcmV0cmllczsKKwlfX3UzMglsZW5ndGg7CisJX19iZTMyCXFwbjsKKwlfX2JlMzIgIHFrZXk7CisJX19iZTE2CWxpZDsKKwlfX3U4CXNsOworCV9fdTgJcGF0aF9iaXRzOworCV9fdTgJZ3JoX3ByZXNlbnQ7CisJX191OAlnaWRfaW5kZXg7CisJX191OAlob3BfbGltaXQ7CisJX191OAl0cmFmZmljX2NsYXNzOworCV9fdTgJZ2lkWzE2XTsKKwlfX2JlMzIJZmxvd19sYWJlbDsKKwlfX3UxNglwa2V5X2luZGV4OworCV9fdTgJcmVzZXJ2ZWRbNl07Cit9OworCisvKioKKyAqIGliX3VzZXJfbWFkIC0gTUFEIHBhY2tldAorICogQGhkciAtIE1BRCBwYWNrZXQgaGVhZGVyCisgKiBAZGF0YSAtIENvbnRlbnRzIG9mIE1BRAorICoKKyAqLworc3RydWN0IGliX3VzZXJfbWFkIHsKKwlzdHJ1Y3QgaWJfdXNlcl9tYWRfaGRyIGhkcjsKKwlfX3U2NAlkYXRhWzBdOworfTsKKworLyoKKyAqIEVhcmxpZXIgdmVyc2lvbnMgb2YgdGhpcyBpbnRlcmZhY2UgZGVmaW5pdGlvbiBkZWNsYXJlZCB0aGUKKyAqIG1ldGhvZF9tYXNrW10gbWVtYmVyIGFzIGFuIGFycmF5IG9mIF9fdTMyIGJ1dCB0cmVhdGVkIGl0IGFzIGEKKyAqIGJpdG1hcCBtYWRlIHVwIG9mIGxvbmdzIGluIHRoZSBrZXJuZWwuICBUaGlzIGFtYmlndWl0eSBtZWFudCB0aGF0CisgKiAzMi1iaXQgYmlnLWVuZGlhbiBhcHBsaWNhdGlvbnMgdGhhdCBjYW4gcnVuIG9uIGJvdGggMzItYml0IGFuZAorICogNjQtYml0IGtlcm5lbHMgaGFkIG5vIGNvbnNpc3RlbnQgQUJJIHRvIHJlbHkgb24sIGFuZCA2NC1iaXQKKyAqIGJpZy1lbmRpYW4gYXBwbGljYXRpb25zIHRoYXQgdHJlYXRlZCBtZXRob2RfbWFzayBhcyBiZWluZyBtYWRlIHVwCisgKiBvZiAzMi1iaXQgd29yZHMgd291bGQgaGF2ZSB0aGVpciBiaXRtYXAgbWlzaW50ZXJwcmV0ZWQuCisgKgorICogVG8gY2xlYXIgdXAgdGhpcyBjb25mdXNpb24sIHdlIGNoYW5nZSB0aGUgZGVjbGFyYXRpb24gb2YKKyAqIG1ldGhvZF9tYXNrW10gdG8gdXNlIHVuc2lnbmVkIGxvbmcgYW5kIGhhbmRsZSB0aGUgY29udmVyc2lvbiBmcm9tCisgKiAzMi1iaXQgdXNlcnNwYWNlIHRvIDY0LWJpdCBrZXJuZWwgZm9yIGJpZy1lbmRpYW4gc3lzdGVtcyBpbiB0aGUKKyAqIGNvbXBhdF9pb2N0bCBtZXRob2QuICBVbmZvcnR1bmF0ZWx5LCB0byBrZWVwIHRoZSBzdHJ1Y3R1cmUgbGF5b3V0CisgKiB0aGUgc2FtZSwgd2UgbmVlZCB0aGUgbWV0aG9kX21hc2tbXSBhcnJheSB0byBiZSBhbGlnbmVkIG9ubHkgdG8gNAorICogYnl0ZXMgZXZlbiB3aGVuIGxvbmcgaXMgNjQgYml0cywgd2hpY2ggZm9yY2VzIHVzIGludG8gdGhpcyB1Z2x5CisgKiB0eXBlZGVmLgorICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0KSkpIHBhY2tlZF91bG9uZzsKKyNkZWZpbmUgSUJfVVNFUl9NQURfTE9OR1NfUEVSX01FVEhPRF9NQVNLICgxMjggLyAoOCAqIHNpemVvZiAobG9uZykpKQorCisvKioKKyAqIGliX3VzZXJfbWFkX3JlZ19yZXEgLSBNQUQgcmVnaXN0cmF0aW9uIHJlcXVlc3QKKyAqIEBpZCAtIFNldCBieSB0aGUga2VybmVsOyB1c2VkIHRvIGlkZW50aWZ5IGFnZW50IGluIGZ1dHVyZSByZXF1ZXN0cy4KKyAqIEBxcG4gLSBRdWV1ZSBwYWlyIG51bWJlcjsgbXVzdCBiZSAwIG9yIDEuCisgKiBAbWV0aG9kX21hc2sgLSBUaGUgY2FsbGVyIHdpbGwgcmVjZWl2ZSB1bnNvbGljaXRlZCBNQURzIGZvciBhbnkgbWV0aG9kCisgKiAgIHdoZXJlIEBtZXRob2RfbWFzayA9IDEuCisgKiBAbWdtdF9jbGFzcyAtIEluZGljYXRlcyB3aGljaCBtYW5hZ2VtZW50IGNsYXNzIG9mIE1BRHMgc2hvdWxkIGJlIHJlY2VpdmUKKyAqICAgYnkgdGhlIGNhbGxlci4gIFRoaXMgZmllbGQgaXMgb25seSByZXF1aXJlZCBpZiB0aGUgdXNlciB3aXNoZXMgdG8KKyAqICAgcmVjZWl2ZSB1bnNvbGljaXRlZCBNQURzLCBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIDAuCisgKiBAbWdtdF9jbGFzc192ZXJzaW9uIC0gSW5kaWNhdGVzIHdoaWNoIHZlcnNpb24gb2YgTUFEcyBmb3IgdGhlIGdpdmVuCisgKiAgIG1hbmFnZW1lbnQgY2xhc3MgdG8gcmVjZWl2ZS4KKyAqIEBvdWk6IEluZGljYXRlcyBJRUVFIE9VSSB3aGVuIG1nbXRfY2xhc3MgaXMgYSB2ZW5kb3IgY2xhc3MKKyAqICAgaW4gdGhlIHJhbmdlIGZyb20gMHgzMCB0byAweDRmLiBPdGhlcndpc2Ugbm90IHVzZWQuCisgKiBAcm1wcF92ZXJzaW9uOiBJZiBzZXQsIGluZGljYXRlcyB0aGUgUk1QUCB2ZXJzaW9uIHVzZWQuCisgKgorICovCitzdHJ1Y3QgaWJfdXNlcl9tYWRfcmVnX3JlcSB7CisJX191MzIJaWQ7CisJcGFja2VkX3Vsb25nIG1ldGhvZF9tYXNrW0lCX1VTRVJfTUFEX0xPTkdTX1BFUl9NRVRIT0RfTUFTS107CisJX191OAlxcG47CisJX191OAltZ210X2NsYXNzOworCV9fdTgJbWdtdF9jbGFzc192ZXJzaW9uOworCV9fdTggICAgb3VpWzNdOworCV9fdTgJcm1wcF92ZXJzaW9uOworfTsKKworI2RlZmluZSBJQl9JT0NUTF9NQUdJQwkJMHgxYgorCisjZGVmaW5lIElCX1VTRVJfTUFEX1JFR0lTVEVSX0FHRU5UCV9JT1dSKElCX0lPQ1RMX01BR0lDLCAxLCBcCisJCQkJCSAgICAgIHN0cnVjdCBpYl91c2VyX21hZF9yZWdfcmVxKQorCisjZGVmaW5lIElCX1VTRVJfTUFEX1VOUkVHSVNURVJfQUdFTlQJX0lPVyhJQl9JT0NUTF9NQUdJQywgMiwgX191MzIpCisKKyNkZWZpbmUgSUJfVVNFUl9NQURfRU5BQkxFX1BLRVkJCV9JTyhJQl9JT0NUTF9NQUdJQywgMykKKworI2VuZGlmIC8qIElCX1VTRVJfTUFEX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmRtYS9pYl91c2VyX3NhLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JkbWEvaWJfdXNlcl9zYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYzdjOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JkbWEvaWJfdXNlcl9zYS5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBJQl9VU0VSX1NBX0gKKyNkZWZpbmUgSUJfVVNFUl9TQV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHsKKwlJQl9QQVRIX0dNUAkJPSAxLAorCUlCX1BBVEhfUFJJTUFSWQkJPSAoMTw8MSksCisJSUJfUEFUSF9BTFRFUk5BVEUJPSAoMTw8MiksCisJSUJfUEFUSF9PVVRCT1VORAk9ICgxPDwzKSwKKwlJQl9QQVRIX0lOQk9VTkQJCT0gKDE8PDQpLAorCUlCX1BBVEhfSU5CT1VORF9SRVZFUlNFID0gKDE8PDUpLAorCUlCX1BBVEhfQklESVJFQ1RJT05BTAk9IElCX1BBVEhfT1VUQk9VTkQgfCBJQl9QQVRIX0lOQk9VTkRfUkVWRVJTRQorfTsKKworc3RydWN0IGliX3BhdGhfcmVjX2RhdGEgeworCV9fdTMyCWZsYWdzOworCV9fdTMyCXJlc2VydmVkOworCV9fdTMyCXBhdGhfcmVjWzE2XTsKK307CisKK3N0cnVjdCBpYl91c2VyX3BhdGhfcmVjIHsKKwlfX3U4CWRnaWRbMTZdOworCV9fdTgJc2dpZFsxNl07CisJX19iZTE2CWRsaWQ7CisJX19iZTE2CXNsaWQ7CisJX191MzIJcmF3X3RyYWZmaWM7CisJX19iZTMyCWZsb3dfbGFiZWw7CisJX191MzIJcmV2ZXJzaWJsZTsKKwlfX3UzMgltdHU7CisJX19iZTE2CXBrZXk7CisJX191OAlob3BfbGltaXQ7CisJX191OAl0cmFmZmljX2NsYXNzOworCV9fdTgJbnVtYl9wYXRoOworCV9fdTgJc2w7CisJX191OAltdHVfc2VsZWN0b3I7CisJX191OAlyYXRlX3NlbGVjdG9yOworCV9fdTgJcmF0ZTsKKwlfX3U4CXBhY2tldF9saWZlX3RpbWVfc2VsZWN0b3I7CisJX191OAlwYWNrZXRfbGlmZV90aW1lOworCV9fdTgJcHJlZmVyZW5jZTsKK307CisKKyNlbmRpZiAvKiBJQl9VU0VSX1NBX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmRtYS9pYl91c2VyX3ZlcmJzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JkbWEvaWJfdXNlcl92ZXJicy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYWJhM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JkbWEvaWJfdXNlcl92ZXJicy5oCkBAIC0wLDAgKzEsNzM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IENpc2NvIFN5c3RlbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IFBhdGhTY2FsZSwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiBNZWxsYW5veCBUZWNobm9sb2dpZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBJQl9VU0VSX1ZFUkJTX0gKKyNkZWZpbmUgSUJfVVNFUl9WRVJCU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogSW5jcmVtZW50IHRoaXMgdmFsdWUgaWYgYW55IGNoYW5nZXMgdGhhdCBicmVhayB1c2Vyc3BhY2UgQUJJCisgKiBjb21wYXRpYmlsaXR5IGFyZSBtYWRlLgorICovCisjZGVmaW5lIElCX1VTRVJfVkVSQlNfQUJJX1ZFUlNJT04JNgorCitlbnVtIHsKKwlJQl9VU0VSX1ZFUkJTX0NNRF9HRVRfQ09OVEVYVCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9ERVZJQ0UsCisJSUJfVVNFUl9WRVJCU19DTURfUVVFUllfUE9SVCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9BTExPQ19QRCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9ERUFMTE9DX1BELAorCUlCX1VTRVJfVkVSQlNfQ01EX0NSRUFURV9BSCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9NT0RJRllfQUgsCisJSUJfVVNFUl9WRVJCU19DTURfUVVFUllfQUgsCisJSUJfVVNFUl9WRVJCU19DTURfREVTVFJPWV9BSCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9SRUdfTVIsCisJSUJfVVNFUl9WRVJCU19DTURfUkVHX1NNUiwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9SRVJFR19NUiwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9NUiwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9ERVJFR19NUiwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9BTExPQ19NVywKKwlJQl9VU0VSX1ZFUkJTX0NNRF9CSU5EX01XLAorCUlCX1VTRVJfVkVSQlNfQ01EX0RFQUxMT0NfTVcsCisJSUJfVVNFUl9WRVJCU19DTURfQ1JFQVRFX0NPTVBfQ0hBTk5FTCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9DUkVBVEVfQ1EsCisJSUJfVVNFUl9WRVJCU19DTURfUkVTSVpFX0NRLAorCUlCX1VTRVJfVkVSQlNfQ01EX0RFU1RST1lfQ1EsCisJSUJfVVNFUl9WRVJCU19DTURfUE9MTF9DUSwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9QRUVLX0NRLAorCUlCX1VTRVJfVkVSQlNfQ01EX1JFUV9OT1RJRllfQ1EsCisJSUJfVVNFUl9WRVJCU19DTURfQ1JFQVRFX1FQLAorCUlCX1VTRVJfVkVSQlNfQ01EX1FVRVJZX1FQLAorCUlCX1VTRVJfVkVSQlNfQ01EX01PRElGWV9RUCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9ERVNUUk9ZX1FQLAorCUlCX1VTRVJfVkVSQlNfQ01EX1BPU1RfU0VORCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9QT1NUX1JFQ1YsCisJSUJfVVNFUl9WRVJCU19DTURfQVRUQUNIX01DQVNULAorCUlCX1VTRVJfVkVSQlNfQ01EX0RFVEFDSF9NQ0FTVCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9DUkVBVEVfU1JRLAorCUlCX1VTRVJfVkVSQlNfQ01EX01PRElGWV9TUlEsCisJSUJfVVNFUl9WRVJCU19DTURfUVVFUllfU1JRLAorCUlCX1VTRVJfVkVSQlNfQ01EX0RFU1RST1lfU1JRLAorCUlCX1VTRVJfVkVSQlNfQ01EX1BPU1RfU1JRX1JFQ1YsCisJSUJfVVNFUl9WRVJCU19DTURfT1BFTl9YUkNELAorCUlCX1VTRVJfVkVSQlNfQ01EX0NMT1NFX1hSQ0QsCisJSUJfVVNFUl9WRVJCU19DTURfQ1JFQVRFX1hTUlEsCisJSUJfVVNFUl9WRVJCU19DTURfT1BFTl9RUAorfTsKKworLyoKKyAqIE1ha2Ugc3VyZSB0aGF0IGFsbCBzdHJ1Y3RzIGRlZmluZWQgaW4gdGhpcyBmaWxlIHJlbWFpbiBsYWlkIG91dCBzbworICogdGhhdCB0aGV5IHBhY2sgdGhlIHNhbWUgd2F5IG9uIDMyLWJpdCBhbmQgNjQtYml0IGFyY2hpdGVjdHVyZXMgKHRvCisgKiBhdm9pZCBpbmNvbXBhdGliaWxpdHkgYmV0d2VlbiAzMi1iaXQgdXNlcnNwYWNlIGFuZCA2NC1iaXQga2VybmVscykuCisgKiBTcGVjaWZpY2FsbHk6CisgKiAgLSBEbyBub3QgdXNlIHBvaW50ZXIgdHlwZXMgLS0gcGFzcyBwb2ludGVycyBpbiBfX3U2NCBpbnN0ZWFkLgorICogIC0gTWFrZSBzdXJlIHRoYXQgYW55IHN0cnVjdHVyZSBsYXJnZXIgdGhhbiA0IGJ5dGVzIGlzIHBhZGRlZCB0byBhCisgKiAgICBtdWx0aXBsZSBvZiA4IGJ5dGVzLiAgT3RoZXJ3aXNlIHRoZSBzdHJ1Y3R1cmUgc2l6ZSB3aWxsIGJlCisgKiAgICBkaWZmZXJlbnQgYmV0d2VlbiAzMi1iaXQgYW5kIDY0LWJpdCBhcmNoaXRlY3R1cmVzLgorICovCisKK3N0cnVjdCBpYl91dmVyYnNfYXN5bmNfZXZlbnRfZGVzYyB7CisJX191NjQgZWxlbWVudDsKKwlfX3UzMiBldmVudF90eXBlOwkvKiBlbnVtIGliX2V2ZW50X3R5cGUgKi8KKwlfX3UzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfY29tcF9ldmVudF9kZXNjIHsKKwlfX3U2NCBjcV9oYW5kbGU7Cit9OworCisvKgorICogQWxsIGNvbW1hbmRzIGZyb20gdXNlcnNwYWNlIHNob3VsZCBzdGFydCB3aXRoIGEgX191MzIgY29tbWFuZCBmaWVsZAorICogZm9sbG93ZWQgYnkgX191MTYgaW5fd29yZHMgYW5kIG91dF93b3JkcyBmaWVsZHMgKHdoaWNoIGdpdmUgdGhlCisgKiBsZW5ndGggb2YgdGhlIGNvbW1hbmQgYmxvY2sgYW5kIHJlc3BvbnNlIGJ1ZmZlciBpZiBhbnkgaW4gMzItYml0CisgKiB3b3JkcykuICBUaGUga2VybmVsIGRyaXZlciB3aWxsIHJlYWQgdGhlc2UgZmllbGRzIGZpcnN0IGFuZCByZWFkCisgKiB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZCBzdHJ1Y3QgYmFzZWQgb24gdGhlc2UgdmFsdWUuCisgKi8KKworc3RydWN0IGliX3V2ZXJic19jbWRfaGRyIHsKKwlfX3UzMiBjb21tYW5kOworCV9fdTE2IGluX3dvcmRzOworCV9fdTE2IG91dF93b3JkczsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfZ2V0X2NvbnRleHQgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19nZXRfY29udGV4dF9yZXNwIHsKKwlfX3UzMiBhc3luY19mZDsKKwlfX3UzMiBudW1fY29tcF92ZWN0b3JzOworfTsKKworc3RydWN0IGliX3V2ZXJic19xdWVyeV9kZXZpY2UgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19xdWVyeV9kZXZpY2VfcmVzcCB7CisJX191NjQgZndfdmVyOworCV9fYmU2NCBub2RlX2d1aWQ7CisJX19iZTY0IHN5c19pbWFnZV9ndWlkOworCV9fdTY0IG1heF9tcl9zaXplOworCV9fdTY0IHBhZ2Vfc2l6ZV9jYXA7CisJX191MzIgdmVuZG9yX2lkOworCV9fdTMyIHZlbmRvcl9wYXJ0X2lkOworCV9fdTMyIGh3X3ZlcjsKKwlfX3UzMiBtYXhfcXA7CisJX191MzIgbWF4X3FwX3dyOworCV9fdTMyIGRldmljZV9jYXBfZmxhZ3M7CisJX191MzIgbWF4X3NnZTsKKwlfX3UzMiBtYXhfc2dlX3JkOworCV9fdTMyIG1heF9jcTsKKwlfX3UzMiBtYXhfY3FlOworCV9fdTMyIG1heF9tcjsKKwlfX3UzMiBtYXhfcGQ7CisJX191MzIgbWF4X3FwX3JkX2F0b207CisJX191MzIgbWF4X2VlX3JkX2F0b207CisJX191MzIgbWF4X3Jlc19yZF9hdG9tOworCV9fdTMyIG1heF9xcF9pbml0X3JkX2F0b207CisJX191MzIgbWF4X2VlX2luaXRfcmRfYXRvbTsKKwlfX3UzMiBhdG9taWNfY2FwOworCV9fdTMyIG1heF9lZTsKKwlfX3UzMiBtYXhfcmRkOworCV9fdTMyIG1heF9tdzsKKwlfX3UzMiBtYXhfcmF3X2lwdjZfcXA7CisJX191MzIgbWF4X3Jhd19ldGh5X3FwOworCV9fdTMyIG1heF9tY2FzdF9ncnA7CisJX191MzIgbWF4X21jYXN0X3FwX2F0dGFjaDsKKwlfX3UzMiBtYXhfdG90YWxfbWNhc3RfcXBfYXR0YWNoOworCV9fdTMyIG1heF9haDsKKwlfX3UzMiBtYXhfZm1yOworCV9fdTMyIG1heF9tYXBfcGVyX2ZtcjsKKwlfX3UzMiBtYXhfc3JxOworCV9fdTMyIG1heF9zcnFfd3I7CisJX191MzIgbWF4X3NycV9zZ2U7CisJX191MTYgbWF4X3BrZXlzOworCV9fdTggIGxvY2FsX2NhX2Fja19kZWxheTsKKwlfX3U4ICBwaHlzX3BvcnRfY250OworCV9fdTggIHJlc2VydmVkWzRdOworfTsKKworc3RydWN0IGliX3V2ZXJic19xdWVyeV9wb3J0IHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U4ICBwb3J0X251bTsKKwlfX3U4ICByZXNlcnZlZFs3XTsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcXVlcnlfcG9ydF9yZXNwIHsKKwlfX3UzMiBwb3J0X2NhcF9mbGFnczsKKwlfX3UzMiBtYXhfbXNnX3N6OworCV9fdTMyIGJhZF9wa2V5X2NudHI7CisJX191MzIgcWtleV92aW9sX2NudHI7CisJX191MzIgZ2lkX3RibF9sZW47CisJX191MTYgcGtleV90YmxfbGVuOworCV9fdTE2IGxpZDsKKwlfX3UxNiBzbV9saWQ7CisJX191OCAgc3RhdGU7CisJX191OCAgbWF4X210dTsKKwlfX3U4ICBhY3RpdmVfbXR1OworCV9fdTggIGxtYzsKKwlfX3U4ICBtYXhfdmxfbnVtOworCV9fdTggIHNtX3NsOworCV9fdTggIHN1Ym5ldF90aW1lb3V0OworCV9fdTggIGluaXRfdHlwZV9yZXBseTsKKwlfX3U4ICBhY3RpdmVfd2lkdGg7CisJX191OCAgYWN0aXZlX3NwZWVkOworCV9fdTggIHBoeXNfc3RhdGU7CisJX191OCAgbGlua19sYXllcjsKKwlfX3U4ICByZXNlcnZlZFsyXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfYWxsb2NfcGQgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19hbGxvY19wZF9yZXNwIHsKKwlfX3UzMiBwZF9oYW5kbGU7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2RlYWxsb2NfcGQgeworCV9fdTMyIHBkX2hhbmRsZTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfb3Blbl94cmNkIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3UzMiBmZDsKKwlfX3UzMiBvZmxhZ3M7CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX29wZW5feHJjZF9yZXNwIHsKKwlfX3UzMiB4cmNkX2hhbmRsZTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfY2xvc2VfeHJjZCB7CisJX191MzIgeHJjZF9oYW5kbGU7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3JlZ19tciB7CisJX191NjQgcmVzcG9uc2U7CisJX191NjQgc3RhcnQ7CisJX191NjQgbGVuZ3RoOworCV9fdTY0IGhjYV92YTsKKwlfX3UzMiBwZF9oYW5kbGU7CisJX191MzIgYWNjZXNzX2ZsYWdzOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19yZWdfbXJfcmVzcCB7CisJX191MzIgbXJfaGFuZGxlOworCV9fdTMyIGxrZXk7CisJX191MzIgcmtleTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfZGVyZWdfbXIgeworCV9fdTMyIG1yX2hhbmRsZTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfY3JlYXRlX2NvbXBfY2hhbm5lbCB7CisJX191NjQgcmVzcG9uc2U7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV9jb21wX2NoYW5uZWxfcmVzcCB7CisJX191MzIgZmQ7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV9jcSB7CisJX191NjQgcmVzcG9uc2U7CisJX191NjQgdXNlcl9oYW5kbGU7CisJX191MzIgY3FlOworCV9fdTMyIGNvbXBfdmVjdG9yOworCV9fczMyIGNvbXBfY2hhbm5lbDsKKwlfX3UzMiByZXNlcnZlZDsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfY3JlYXRlX2NxX3Jlc3AgeworCV9fdTMyIGNxX2hhbmRsZTsKKwlfX3UzMiBjcWU7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3Jlc2l6ZV9jcSB7CisJX191NjQgcmVzcG9uc2U7CisJX191MzIgY3FfaGFuZGxlOworCV9fdTMyIGNxZTsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcmVzaXplX2NxX3Jlc3AgeworCV9fdTMyIGNxZTsKKwlfX3UzMiByZXNlcnZlZDsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcG9sbF9jcSB7CisJX191NjQgcmVzcG9uc2U7CisJX191MzIgY3FfaGFuZGxlOworCV9fdTMyIG5lOworfTsKKworc3RydWN0IGliX3V2ZXJic193YyB7CisJX191NjQgd3JfaWQ7CisJX191MzIgc3RhdHVzOworCV9fdTMyIG9wY29kZTsKKwlfX3UzMiB2ZW5kb3JfZXJyOworCV9fdTMyIGJ5dGVfbGVuOworCXVuaW9uIHsKKwkJX191MzIgaW1tX2RhdGE7CisJCV9fdTMyIGludmFsaWRhdGVfcmtleTsKKwl9IGV4OworCV9fdTMyIHFwX251bTsKKwlfX3UzMiBzcmNfcXA7CisJX191MzIgd2NfZmxhZ3M7CisJX191MTYgcGtleV9pbmRleDsKKwlfX3UxNiBzbGlkOworCV9fdTggc2w7CisJX191OCBkbGlkX3BhdGhfYml0czsKKwlfX3U4IHBvcnRfbnVtOworCV9fdTggcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3BvbGxfY3FfcmVzcCB7CisJX191MzIgY291bnQ7CisJX191MzIgcmVzZXJ2ZWQ7CisJc3RydWN0IGliX3V2ZXJic193YyB3Y1swXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcmVxX25vdGlmeV9jcSB7CisJX191MzIgY3FfaGFuZGxlOworCV9fdTMyIHNvbGljaXRlZF9vbmx5OworfTsKKworc3RydWN0IGliX3V2ZXJic19kZXN0cm95X2NxIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3UzMiBjcV9oYW5kbGU7CisJX191MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2Rlc3Ryb3lfY3FfcmVzcCB7CisJX191MzIgY29tcF9ldmVudHNfcmVwb3J0ZWQ7CisJX191MzIgYXN5bmNfZXZlbnRzX3JlcG9ydGVkOworfTsKKworc3RydWN0IGliX3V2ZXJic19nbG9iYWxfcm91dGUgeworCV9fdTggIGRnaWRbMTZdOworCV9fdTMyIGZsb3dfbGFiZWw7CisJX191OCAgc2dpZF9pbmRleDsKKwlfX3U4ICBob3BfbGltaXQ7CisJX191OCAgdHJhZmZpY19jbGFzczsKKwlfX3U4ICByZXNlcnZlZDsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfYWhfYXR0ciB7CisJc3RydWN0IGliX3V2ZXJic19nbG9iYWxfcm91dGUgZ3JoOworCV9fdTE2IGRsaWQ7CisJX191OCAgc2w7CisJX191OCAgc3JjX3BhdGhfYml0czsKKwlfX3U4ICBzdGF0aWNfcmF0ZTsKKwlfX3U4ICBpc19nbG9iYWw7CisJX191OCAgcG9ydF9udW07CisJX191OCAgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3FwX2F0dHIgeworCV9fdTMyCXFwX2F0dHJfbWFzazsKKwlfX3UzMglxcF9zdGF0ZTsKKwlfX3UzMgljdXJfcXBfc3RhdGU7CisJX191MzIJcGF0aF9tdHU7CisJX191MzIJcGF0aF9taWdfc3RhdGU7CisJX191MzIJcWtleTsKKwlfX3UzMglycV9wc247CisJX191MzIJc3FfcHNuOworCV9fdTMyCWRlc3RfcXBfbnVtOworCV9fdTMyCXFwX2FjY2Vzc19mbGFnczsKKworCXN0cnVjdCBpYl91dmVyYnNfYWhfYXR0ciBhaF9hdHRyOworCXN0cnVjdCBpYl91dmVyYnNfYWhfYXR0ciBhbHRfYWhfYXR0cjsKKworCS8qIGliX3FwX2NhcCAqLworCV9fdTMyCW1heF9zZW5kX3dyOworCV9fdTMyCW1heF9yZWN2X3dyOworCV9fdTMyCW1heF9zZW5kX3NnZTsKKwlfX3UzMgltYXhfcmVjdl9zZ2U7CisJX191MzIJbWF4X2lubGluZV9kYXRhOworCisJX191MTYJcGtleV9pbmRleDsKKwlfX3UxNglhbHRfcGtleV9pbmRleDsKKwlfX3U4CWVuX3NxZF9hc3luY19ub3RpZnk7CisJX191OAlzcV9kcmFpbmluZzsKKwlfX3U4CW1heF9yZF9hdG9taWM7CisJX191OAltYXhfZGVzdF9yZF9hdG9taWM7CisJX191OAltaW5fcm5yX3RpbWVyOworCV9fdTgJcG9ydF9udW07CisJX191OAl0aW1lb3V0OworCV9fdTgJcmV0cnlfY250OworCV9fdTgJcm5yX3JldHJ5OworCV9fdTgJYWx0X3BvcnRfbnVtOworCV9fdTgJYWx0X3RpbWVvdXQ7CisJX191OAlyZXNlcnZlZFs1XTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfY3JlYXRlX3FwIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U2NCB1c2VyX2hhbmRsZTsKKwlfX3UzMiBwZF9oYW5kbGU7CisJX191MzIgc2VuZF9jcV9oYW5kbGU7CisJX191MzIgcmVjdl9jcV9oYW5kbGU7CisJX191MzIgc3JxX2hhbmRsZTsKKwlfX3UzMiBtYXhfc2VuZF93cjsKKwlfX3UzMiBtYXhfcmVjdl93cjsKKwlfX3UzMiBtYXhfc2VuZF9zZ2U7CisJX191MzIgbWF4X3JlY3Zfc2dlOworCV9fdTMyIG1heF9pbmxpbmVfZGF0YTsKKwlfX3U4ICBzcV9zaWdfYWxsOworCV9fdTggIHFwX3R5cGU7CisJX191OCAgaXNfc3JxOworCV9fdTggIHJlc2VydmVkOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19vcGVuX3FwIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U2NCB1c2VyX2hhbmRsZTsKKwlfX3UzMiBwZF9oYW5kbGU7CisJX191MzIgcXBuOworCV9fdTggIHFwX3R5cGU7CisJX191OCAgcmVzZXJ2ZWRbN107CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCisvKiBhbHNvIHVzZWQgZm9yIG9wZW4gcmVzcG9uc2UgKi8KK3N0cnVjdCBpYl91dmVyYnNfY3JlYXRlX3FwX3Jlc3AgeworCV9fdTMyIHFwX2hhbmRsZTsKKwlfX3UzMiBxcG47CisJX191MzIgbWF4X3NlbmRfd3I7CisJX191MzIgbWF4X3JlY3Zfd3I7CisJX191MzIgbWF4X3NlbmRfc2dlOworCV9fdTMyIG1heF9yZWN2X3NnZTsKKwlfX3UzMiBtYXhfaW5saW5lX2RhdGE7CisJX191MzIgcmVzZXJ2ZWQ7Cit9OworCisvKgorICogVGhpcyBzdHJ1Y3QgbmVlZHMgdG8gcmVtYWluIGEgbXVsdGlwbGUgb2YgOCBieXRlcyB0byBrZWVwIHRoZQorICogYWxpZ25tZW50IG9mIHRoZSBtb2RpZnkgUVAgcGFyYW1ldGVycy4KKyAqLworc3RydWN0IGliX3V2ZXJic19xcF9kZXN0IHsKKwlfX3U4ICBkZ2lkWzE2XTsKKwlfX3UzMiBmbG93X2xhYmVsOworCV9fdTE2IGRsaWQ7CisJX191MTYgcmVzZXJ2ZWQ7CisJX191OCAgc2dpZF9pbmRleDsKKwlfX3U4ICBob3BfbGltaXQ7CisJX191OCAgdHJhZmZpY19jbGFzczsKKwlfX3U4ICBzbDsKKwlfX3U4ICBzcmNfcGF0aF9iaXRzOworCV9fdTggIHN0YXRpY19yYXRlOworCV9fdTggIGlzX2dsb2JhbDsKKwlfX3U4ICBwb3J0X251bTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcXVlcnlfcXAgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTMyIHFwX2hhbmRsZTsKKwlfX3UzMiBhdHRyX21hc2s7CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3FwX3Jlc3AgeworCXN0cnVjdCBpYl91dmVyYnNfcXBfZGVzdCBkZXN0OworCXN0cnVjdCBpYl91dmVyYnNfcXBfZGVzdCBhbHRfZGVzdDsKKwlfX3UzMiBtYXhfc2VuZF93cjsKKwlfX3UzMiBtYXhfcmVjdl93cjsKKwlfX3UzMiBtYXhfc2VuZF9zZ2U7CisJX191MzIgbWF4X3JlY3Zfc2dlOworCV9fdTMyIG1heF9pbmxpbmVfZGF0YTsKKwlfX3UzMiBxa2V5OworCV9fdTMyIHJxX3BzbjsKKwlfX3UzMiBzcV9wc247CisJX191MzIgZGVzdF9xcF9udW07CisJX191MzIgcXBfYWNjZXNzX2ZsYWdzOworCV9fdTE2IHBrZXlfaW5kZXg7CisJX191MTYgYWx0X3BrZXlfaW5kZXg7CisJX191OCAgcXBfc3RhdGU7CisJX191OCAgY3VyX3FwX3N0YXRlOworCV9fdTggIHBhdGhfbXR1OworCV9fdTggIHBhdGhfbWlnX3N0YXRlOworCV9fdTggIHNxX2RyYWluaW5nOworCV9fdTggIG1heF9yZF9hdG9taWM7CisJX191OCAgbWF4X2Rlc3RfcmRfYXRvbWljOworCV9fdTggIG1pbl9ybnJfdGltZXI7CisJX191OCAgcG9ydF9udW07CisJX191OCAgdGltZW91dDsKKwlfX3U4ICByZXRyeV9jbnQ7CisJX191OCAgcm5yX3JldHJ5OworCV9fdTggIGFsdF9wb3J0X251bTsKKwlfX3U4ICBhbHRfdGltZW91dDsKKwlfX3U4ICBzcV9zaWdfYWxsOworCV9fdTggIHJlc2VydmVkWzVdOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19tb2RpZnlfcXAgeworCXN0cnVjdCBpYl91dmVyYnNfcXBfZGVzdCBkZXN0OworCXN0cnVjdCBpYl91dmVyYnNfcXBfZGVzdCBhbHRfZGVzdDsKKwlfX3UzMiBxcF9oYW5kbGU7CisJX191MzIgYXR0cl9tYXNrOworCV9fdTMyIHFrZXk7CisJX191MzIgcnFfcHNuOworCV9fdTMyIHNxX3BzbjsKKwlfX3UzMiBkZXN0X3FwX251bTsKKwlfX3UzMiBxcF9hY2Nlc3NfZmxhZ3M7CisJX191MTYgcGtleV9pbmRleDsKKwlfX3UxNiBhbHRfcGtleV9pbmRleDsKKwlfX3U4ICBxcF9zdGF0ZTsKKwlfX3U4ICBjdXJfcXBfc3RhdGU7CisJX191OCAgcGF0aF9tdHU7CisJX191OCAgcGF0aF9taWdfc3RhdGU7CisJX191OCAgZW5fc3FkX2FzeW5jX25vdGlmeTsKKwlfX3U4ICBtYXhfcmRfYXRvbWljOworCV9fdTggIG1heF9kZXN0X3JkX2F0b21pYzsKKwlfX3U4ICBtaW5fcm5yX3RpbWVyOworCV9fdTggIHBvcnRfbnVtOworCV9fdTggIHRpbWVvdXQ7CisJX191OCAgcmV0cnlfY250OworCV9fdTggIHJucl9yZXRyeTsKKwlfX3U4ICBhbHRfcG9ydF9udW07CisJX191OCAgYWx0X3RpbWVvdXQ7CisJX191OCAgcmVzZXJ2ZWRbMl07CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX21vZGlmeV9xcF9yZXNwIHsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfZGVzdHJveV9xcCB7CisJX191NjQgcmVzcG9uc2U7CisJX191MzIgcXBfaGFuZGxlOworCV9fdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IGliX3V2ZXJic19kZXN0cm95X3FwX3Jlc3AgeworCV9fdTMyIGV2ZW50c19yZXBvcnRlZDsKK307CisKKy8qCisgKiBUaGUgaWJfdXZlcmJzX3NnZSBzdHJ1Y3R1cmUgaXNuJ3QgdXNlZCBhbnl3aGVyZSwgc2luY2Ugd2UgYXNzdW1lCisgKiB0aGUgaWJfc2dlIHN0cnVjdHVyZSBpcyBwYWNrZWQgdGhlIHNhbWUgd2F5IG9uIDMyLWJpdCBhbmQgNjQtYml0CisgKiBhcmNoaXRlY3R1cmVzIGluIGJvdGgga2VybmVsIGFuZCB1c2VyIHNwYWNlLiAgSXQncyBqdXN0IGhlcmUgdG8KKyAqIGRvY3VtZW50IHRoZSBBQkkuCisgKi8KK3N0cnVjdCBpYl91dmVyYnNfc2dlIHsKKwlfX3U2NCBhZGRyOworCV9fdTMyIGxlbmd0aDsKKwlfX3UzMiBsa2V5OworfTsKKworc3RydWN0IGliX3V2ZXJic19zZW5kX3dyIHsKKwlfX3U2NCB3cl9pZDsKKwlfX3UzMiBudW1fc2dlOworCV9fdTMyIG9wY29kZTsKKwlfX3UzMiBzZW5kX2ZsYWdzOworCXVuaW9uIHsKKwkJX191MzIgaW1tX2RhdGE7CisJCV9fdTMyIGludmFsaWRhdGVfcmtleTsKKwl9IGV4OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTY0IHJlbW90ZV9hZGRyOworCQkJX191MzIgcmtleTsKKwkJCV9fdTMyIHJlc2VydmVkOworCQl9IHJkbWE7CisJCXN0cnVjdCB7CisJCQlfX3U2NCByZW1vdGVfYWRkcjsKKwkJCV9fdTY0IGNvbXBhcmVfYWRkOworCQkJX191NjQgc3dhcDsKKwkJCV9fdTMyIHJrZXk7CisJCQlfX3UzMiByZXNlcnZlZDsKKwkJfSBhdG9taWM7CisJCXN0cnVjdCB7CisJCQlfX3UzMiBhaDsKKwkJCV9fdTMyIHJlbW90ZV9xcG47CisJCQlfX3UzMiByZW1vdGVfcWtleTsKKwkJCV9fdTMyIHJlc2VydmVkOworCQl9IHVkOworCX0gd3I7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3Bvc3Rfc2VuZCB7CisJX191NjQgcmVzcG9uc2U7CisJX191MzIgcXBfaGFuZGxlOworCV9fdTMyIHdyX2NvdW50OworCV9fdTMyIHNnZV9jb3VudDsKKwlfX3UzMiB3cWVfc2l6ZTsKKwlzdHJ1Y3QgaWJfdXZlcmJzX3NlbmRfd3Igc2VuZF93clswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcG9zdF9zZW5kX3Jlc3AgeworCV9fdTMyIGJhZF93cjsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcmVjdl93ciB7CisJX191NjQgd3JfaWQ7CisJX191MzIgbnVtX3NnZTsKKwlfX3UzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcG9zdF9yZWN2IHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3UzMiBxcF9oYW5kbGU7CisJX191MzIgd3JfY291bnQ7CisJX191MzIgc2dlX2NvdW50OworCV9fdTMyIHdxZV9zaXplOworCXN0cnVjdCBpYl91dmVyYnNfcmVjdl93ciByZWN2X3dyWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19wb3N0X3JlY3ZfcmVzcCB7CisJX191MzIgYmFkX3dyOworfTsKKworc3RydWN0IGliX3V2ZXJic19wb3N0X3NycV9yZWN2IHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3UzMiBzcnFfaGFuZGxlOworCV9fdTMyIHdyX2NvdW50OworCV9fdTMyIHNnZV9jb3VudDsKKwlfX3UzMiB3cWVfc2l6ZTsKKwlzdHJ1Y3QgaWJfdXZlcmJzX3JlY3Zfd3IgcmVjdlswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcG9zdF9zcnFfcmVjdl9yZXNwIHsKKwlfX3UzMiBiYWRfd3I7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV9haCB7CisJX191NjQgcmVzcG9uc2U7CisJX191NjQgdXNlcl9oYW5kbGU7CisJX191MzIgcGRfaGFuZGxlOworCV9fdTMyIHJlc2VydmVkOworCXN0cnVjdCBpYl91dmVyYnNfYWhfYXR0ciBhdHRyOworfTsKKworc3RydWN0IGliX3V2ZXJic19jcmVhdGVfYWhfcmVzcCB7CisJX191MzIgYWhfaGFuZGxlOworfTsKKworc3RydWN0IGliX3V2ZXJic19kZXN0cm95X2FoIHsKKwlfX3UzMiBhaF9oYW5kbGU7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2F0dGFjaF9tY2FzdCB7CisJX191OCAgZ2lkWzE2XTsKKwlfX3UzMiBxcF9oYW5kbGU7CisJX191MTYgbWxpZDsKKwlfX3UxNiByZXNlcnZlZDsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfZGV0YWNoX21jYXN0IHsKKwlfX3U4ICBnaWRbMTZdOworCV9fdTMyIHFwX2hhbmRsZTsKKwlfX3UxNiBtbGlkOworCV9fdTE2IHJlc2VydmVkOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19jcmVhdGVfc3JxIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U2NCB1c2VyX2hhbmRsZTsKKwlfX3UzMiBwZF9oYW5kbGU7CisJX191MzIgbWF4X3dyOworCV9fdTMyIG1heF9zZ2U7CisJX191MzIgc3JxX2xpbWl0OworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19jcmVhdGVfeHNycSB7CisJX191NjQgcmVzcG9uc2U7CisJX191NjQgdXNlcl9oYW5kbGU7CisJX191MzIgc3JxX3R5cGU7CisJX191MzIgcGRfaGFuZGxlOworCV9fdTMyIG1heF93cjsKKwlfX3UzMiBtYXhfc2dlOworCV9fdTMyIHNycV9saW1pdDsKKwlfX3UzMiByZXNlcnZlZDsKKwlfX3UzMiB4cmNkX2hhbmRsZTsKKwlfX3UzMiBjcV9oYW5kbGU7CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV9zcnFfcmVzcCB7CisJX191MzIgc3JxX2hhbmRsZTsKKwlfX3UzMiBtYXhfd3I7CisJX191MzIgbWF4X3NnZTsKKwlfX3UzMiBzcnFuOworfTsKKworc3RydWN0IGliX3V2ZXJic19tb2RpZnlfc3JxIHsKKwlfX3UzMiBzcnFfaGFuZGxlOworCV9fdTMyIGF0dHJfbWFzazsKKwlfX3UzMiBtYXhfd3I7CisJX191MzIgc3JxX2xpbWl0OworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19xdWVyeV9zcnEgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTMyIHNycV9oYW5kbGU7CisJX191MzIgcmVzZXJ2ZWQ7CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3NycV9yZXNwIHsKKwlfX3UzMiBtYXhfd3I7CisJX191MzIgbWF4X3NnZTsKKwlfX3UzMiBzcnFfbGltaXQ7CisJX191MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2Rlc3Ryb3lfc3JxIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3UzMiBzcnFfaGFuZGxlOworCV9fdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IGliX3V2ZXJic19kZXN0cm95X3NycV9yZXNwIHsKKwlfX3UzMiBldmVudHNfcmVwb3J0ZWQ7Cit9OworCisjZW5kaWYgLyogSUJfVVNFUl9WRVJCU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JkbWEvcmRtYV9uZXRsaW5rLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JkbWEvcmRtYV9uZXRsaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3OWVhOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmRtYS9yZG1hX25ldGxpbmsuaApAQCAtMCwwICsxLDM3IEBACisjaWZuZGVmIF9SRE1BX05FVExJTktfSAorI2RlZmluZSBfUkRNQV9ORVRMSU5LX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2VudW0geworCVJETUFfTkxfUkRNQV9DTSA9IDEKK307CisKKyNkZWZpbmUgUkRNQV9OTF9HRVRfQ0xJRU5UKHR5cGUpICgodHlwZSAmICgoKDEgPDwgNikgLSAxKSA8PCAxMCkpID4+IDEwKQorI2RlZmluZSBSRE1BX05MX0dFVF9PUCh0eXBlKSAodHlwZSAmICgoMSA8PCAxMCkgLSAxKSkKKyNkZWZpbmUgUkRNQV9OTF9HRVRfVFlQRShjbGllbnQsIG9wKSAoKGNsaWVudCA8PCAxMCkgKyBvcCkKKworZW51bSB7CisJUkRNQV9OTF9SRE1BX0NNX0lEX1NUQVRTID0gMCwKKwlSRE1BX05MX1JETUFfQ01fTlVNX09QUworfTsKKworZW51bSB7CisJUkRNQV9OTF9SRE1BX0NNX0FUVFJfU1JDX0FERFIgPSAxLAorCVJETUFfTkxfUkRNQV9DTV9BVFRSX0RTVF9BRERSLAorCVJETUFfTkxfUkRNQV9DTV9OVU1fQVRUUiwKK307CisKK3N0cnVjdCByZG1hX2NtX2lkX3N0YXRzIHsKKwlfX3UzMglxcF9udW07CisJX191MzIJYm91bmRfZGV2X2lmOworCV9fdTMyCXBvcnRfc3BhY2U7CisJX19zMzIJcGlkOworCV9fdTgJY21fc3RhdGU7CisJX191OAlub2RlX3R5cGU7CisJX191OAlwb3J0X251bTsKKwlfX3U4CXFwX3R5cGU7Cit9OworCisKKyNlbmRpZiAvKiBfUkRNQV9ORVRMSU5LX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmRtYS9yZG1hX3VzZXJfY20uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmRtYS9yZG1hX3VzZXJfY20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzQ4YTAwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9yZG1hL3JkbWFfdXNlcl9jbS5oCkBAIC0wLDAgKzEsMjQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgSW50ZWwgQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBSRE1BX1VTRVJfQ01fSAorI2RlZmluZSBSRE1BX1VTRVJfQ01fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxyZG1hL2liX3VzZXJfdmVyYnMuaD4KKyNpbmNsdWRlIDxyZG1hL2liX3VzZXJfc2EuaD4KKworI2RlZmluZSBSRE1BX1VTRVJfQ01fQUJJX1ZFUlNJT04JNAorCisjZGVmaW5lIFJETUFfTUFYX1BSSVZBVEVfREFUQQkJMjU2CisKK2VudW0geworCVJETUFfVVNFUl9DTV9DTURfQ1JFQVRFX0lELAorCVJETUFfVVNFUl9DTV9DTURfREVTVFJPWV9JRCwKKwlSRE1BX1VTRVJfQ01fQ01EX0JJTkRfQUREUiwKKwlSRE1BX1VTRVJfQ01fQ01EX1JFU09MVkVfQUREUiwKKwlSRE1BX1VTRVJfQ01fQ01EX1JFU09MVkVfUk9VVEUsCisJUkRNQV9VU0VSX0NNX0NNRF9RVUVSWV9ST1VURSwKKwlSRE1BX1VTRVJfQ01fQ01EX0NPTk5FQ1QsCisJUkRNQV9VU0VSX0NNX0NNRF9MSVNURU4sCisJUkRNQV9VU0VSX0NNX0NNRF9BQ0NFUFQsCisJUkRNQV9VU0VSX0NNX0NNRF9SRUpFQ1QsCisJUkRNQV9VU0VSX0NNX0NNRF9ESVNDT05ORUNULAorCVJETUFfVVNFUl9DTV9DTURfSU5JVF9RUF9BVFRSLAorCVJETUFfVVNFUl9DTV9DTURfR0VUX0VWRU5ULAorCVJETUFfVVNFUl9DTV9DTURfR0VUX09QVElPTiwKKwlSRE1BX1VTRVJfQ01fQ01EX1NFVF9PUFRJT04sCisJUkRNQV9VU0VSX0NNX0NNRF9OT1RJRlksCisJUkRNQV9VU0VSX0NNX0NNRF9KT0lOX01DQVNULAorCVJETUFfVVNFUl9DTV9DTURfTEVBVkVfTUNBU1QsCisJUkRNQV9VU0VSX0NNX0NNRF9NSUdSQVRFX0lECit9OworCisvKgorICogY29tbWFuZCBBQkkgc3RydWN0dXJlcy4KKyAqLworc3RydWN0IHJkbWFfdWNtX2NtZF9oZHIgeworCV9fdTMyIGNtZDsKKwlfX3UxNiBpbjsKKwlfX3UxNiBvdXQ7Cit9OworCitzdHJ1Y3QgcmRtYV91Y21fY3JlYXRlX2lkIHsKKwlfX3U2NCB1aWQ7CisJX191NjQgcmVzcG9uc2U7CisJX191MTYgcHM7CisJX191OCAgcXBfdHlwZTsKKwlfX3U4ICByZXNlcnZlZFs1XTsKK307CisKK3N0cnVjdCByZG1hX3VjbV9jcmVhdGVfaWRfcmVzcCB7CisJX191MzIgaWQ7Cit9OworCitzdHJ1Y3QgcmRtYV91Y21fZGVzdHJveV9pZCB7CisJX191NjQgcmVzcG9uc2U7CisJX191MzIgaWQ7CisJX191MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgcmRtYV91Y21fZGVzdHJveV9pZF9yZXNwIHsKKwlfX3UzMiBldmVudHNfcmVwb3J0ZWQ7Cit9OworCitzdHJ1Y3QgcmRtYV91Y21fYmluZF9hZGRyIHsKKwlfX3U2NCByZXNwb25zZTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IGFkZHI7CisJX191MzIgaWQ7Cit9OworCitzdHJ1Y3QgcmRtYV91Y21fcmVzb2x2ZV9hZGRyIHsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNyY19hZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgZHN0X2FkZHI7CisJX191MzIgaWQ7CisJX191MzIgdGltZW91dF9tczsKK307CisKK3N0cnVjdCByZG1hX3VjbV9yZXNvbHZlX3JvdXRlIHsKKwlfX3UzMiBpZDsKKwlfX3UzMiB0aW1lb3V0X21zOworfTsKKworc3RydWN0IHJkbWFfdWNtX3F1ZXJ5X3JvdXRlIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3UzMiBpZDsKKwlfX3UzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCByZG1hX3VjbV9xdWVyeV9yb3V0ZV9yZXNwIHsKKwlfX3U2NCBub2RlX2d1aWQ7CisJc3RydWN0IGliX3VzZXJfcGF0aF9yZWMgaWJfcm91dGVbMl07CisJc3RydWN0IHNvY2thZGRyX2luNiBzcmNfYWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IGRzdF9hZGRyOworCV9fdTMyIG51bV9wYXRoczsKKwlfX3U4IHBvcnRfbnVtOworCV9fdTggcmVzZXJ2ZWRbM107Cit9OworCitzdHJ1Y3QgcmRtYV91Y21fY29ubl9wYXJhbSB7CisJX191MzIgcXBfbnVtOworCV9fdTMyIHJlc2VydmVkOworCV9fdTggIHByaXZhdGVfZGF0YVtSRE1BX01BWF9QUklWQVRFX0RBVEFdOworCV9fdTggIHByaXZhdGVfZGF0YV9sZW47CisJX191OCAgc3JxOworCV9fdTggIHJlc3BvbmRlcl9yZXNvdXJjZXM7CisJX191OCAgaW5pdGlhdG9yX2RlcHRoOworCV9fdTggIGZsb3dfY29udHJvbDsKKwlfX3U4ICByZXRyeV9jb3VudDsKKwlfX3U4ICBybnJfcmV0cnlfY291bnQ7CisJX191OCAgdmFsaWQ7Cit9OworCitzdHJ1Y3QgcmRtYV91Y21fdWRfcGFyYW0geworCV9fdTMyIHFwX251bTsKKwlfX3UzMiBxa2V5OworCXN0cnVjdCBpYl91dmVyYnNfYWhfYXR0ciBhaF9hdHRyOworCV9fdTggIHByaXZhdGVfZGF0YVtSRE1BX01BWF9QUklWQVRFX0RBVEFdOworCV9fdTggIHByaXZhdGVfZGF0YV9sZW47CisJX191OCAgcmVzZXJ2ZWRbN107Cit9OworCitzdHJ1Y3QgcmRtYV91Y21fY29ubmVjdCB7CisJc3RydWN0IHJkbWFfdWNtX2Nvbm5fcGFyYW0gY29ubl9wYXJhbTsKKwlfX3UzMiBpZDsKKwlfX3UzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCByZG1hX3VjbV9saXN0ZW4geworCV9fdTMyIGlkOworCV9fdTMyIGJhY2tsb2c7Cit9OworCitzdHJ1Y3QgcmRtYV91Y21fYWNjZXB0IHsKKwlfX3U2NCB1aWQ7CisJc3RydWN0IHJkbWFfdWNtX2Nvbm5fcGFyYW0gY29ubl9wYXJhbTsKKwlfX3UzMiBpZDsKKwlfX3UzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCByZG1hX3VjbV9yZWplY3QgeworCV9fdTMyIGlkOworCV9fdTggIHByaXZhdGVfZGF0YV9sZW47CisJX191OCAgcmVzZXJ2ZWRbM107CisJX191OCAgcHJpdmF0ZV9kYXRhW1JETUFfTUFYX1BSSVZBVEVfREFUQV07Cit9OworCitzdHJ1Y3QgcmRtYV91Y21fZGlzY29ubmVjdCB7CisJX191MzIgaWQ7Cit9OworCitzdHJ1Y3QgcmRtYV91Y21faW5pdF9xcF9hdHRyIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3UzMiBpZDsKKwlfX3UzMiBxcF9zdGF0ZTsKK307CisKK3N0cnVjdCByZG1hX3VjbV9ub3RpZnkgeworCV9fdTMyIGlkOworCV9fdTMyIGV2ZW50OworfTsKKworc3RydWN0IHJkbWFfdWNtX2pvaW5fbWNhc3QgeworCV9fdTY0IHJlc3BvbnNlOwkJLyogcmRtYV91Y21fY3JlYXRlX2lkX3Jlc3AgKi8KKwlfX3U2NCB1aWQ7CisJc3RydWN0IHNvY2thZGRyX2luNiBhZGRyOworCV9fdTMyIGlkOworfTsKKworc3RydWN0IHJkbWFfdWNtX2dldF9ldmVudCB7CisJX191NjQgcmVzcG9uc2U7Cit9OworCitzdHJ1Y3QgcmRtYV91Y21fZXZlbnRfcmVzcCB7CisJX191NjQgdWlkOworCV9fdTMyIGlkOworCV9fdTMyIGV2ZW50OworCV9fdTMyIHN0YXR1czsKKwl1bmlvbiB7CisJCXN0cnVjdCByZG1hX3VjbV9jb25uX3BhcmFtIGNvbm47CisJCXN0cnVjdCByZG1hX3VjbV91ZF9wYXJhbSAgIHVkOworCX0gcGFyYW07Cit9OworCisvKiBPcHRpb24gbGV2ZWxzICovCitlbnVtIHsKKwlSRE1BX09QVElPTl9JRAkJPSAwLAorCVJETUFfT1BUSU9OX0lCCQk9IDEKK307CisKKy8qIE9wdGlvbiBkZXRhaWxzICovCitlbnVtIHsKKwlSRE1BX09QVElPTl9JRF9UT1MJID0gMCwKKwlSRE1BX09QVElPTl9JRF9SRVVTRUFERFIgPSAxLAorCVJETUFfT1BUSU9OX0lCX1BBVEgJID0gMQorfTsKKworc3RydWN0IHJkbWFfdWNtX3NldF9vcHRpb24geworCV9fdTY0IG9wdHZhbDsKKwlfX3UzMiBpZDsKKwlfX3UzMiBsZXZlbDsKKwlfX3UzMiBvcHRuYW1lOworCV9fdTMyIG9wdGxlbjsKK307CisKK3N0cnVjdCByZG1hX3VjbV9taWdyYXRlX2lkIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3UzMiBpZDsKKwlfX3UzMiBmZDsKK307CisKK3N0cnVjdCByZG1hX3VjbV9taWdyYXRlX3Jlc3AgeworCV9fdTMyIGV2ZW50c19yZXBvcnRlZDsKK307CisKKyNlbmRpZiAvKiBSRE1BX1VTRVJfQ01fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9yZV9jb21wLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JlX2NvbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTExNDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9yZV9jb21wLmgKQEAgLTAsMCArMSwyNiBAQAorLyogIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfUkVfQ09NUF9ICisjZGVmaW5lIF9SRV9DT01QX0gJMQorCisvKiBUaGlzIGlzIG9ubHkgYSB3cmFwcGVyIGFyb3VuZCB0aGUgPHJlZ2V4Lmg+IGZpbGUuICBYUEc0LjIgbWVudGlvbnMKKyAgIHRoaXMgbmFtZS4gICovCisjaW5jbHVkZSA8cmVnZXguaD4KKworI2VuZGlmIC8qIHJlX2NvbXAuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9yZWdleC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9yZWdleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZmRlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JlZ2V4LmgKQEAgLTAsMCArMSw1OTQgQEAKKy8qIERlZmluaXRpb25zIGZvciBkYXRhIHN0cnVjdHVyZXMgYW5kIHJvdXRpbmVzIGZvciB0aGUgcmVndWxhcgorICAgZXhwcmVzc2lvbiBsaWJyYXJ5LgorICAgQ29weXJpZ2h0IChDKSAxOTg1LDE5ODktOTMsMTk5NS05OCwyMDAwLDIwMDEsMjAwMiwyMDAzLDIwMDUsMjAwNiwyMDA4LDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9SRUdFWF9ICisjZGVmaW5lIF9SRUdFWF9IIDEKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGdudS9vcHRpb24tZ3JvdXBzLmg+CisKKy8qIEFsbG93IHRoZSB1c2UgaW4gQysrIGNvZGUuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIHR3byB0eXBlcyBoYXZlIHRvIGJlIHNpZ25lZCBhbmQgdW5zaWduZWQgaW50ZWdlciB0eXBlCisgICB3aWRlIGVub3VnaCB0byBob2xkIGEgdmFsdWUgb2YgYSBwb2ludGVyLiAgRm9yIG1vc3QgQU5TSSBjb21waWxlcnMKKyAgIHB0cmRpZmZfdCBhbmQgc2l6ZV90IHNob3VsZCBiZSBsaWtlbHkgT0suICBTdGlsbCBzaXplIG9mIHRoZXNlIHR3bworICAgdHlwZXMgaXMgMiBmb3IgTWljcm9zb2Z0IEMuICBVZ2guLi4gKi8KK3R5cGVkZWYgbG9uZyBpbnQgc19yZWdfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgYWN0aXZlX3JlZ190OworCisvKiBUaGUgZm9sbG93aW5nIGJpdHMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSByZWdleHAgc3ludGF4IHdlCisgICByZWNvZ25pemUuICBUaGUgc2V0L25vdC1zZXQgbWVhbmluZ3MgYXJlIGNob3NlbiBzbyB0aGF0IEVtYWNzIHN5bnRheAorICAgcmVtYWlucyB0aGUgdmFsdWUgMC4gIFRoZSBiaXRzIGFyZSBnaXZlbiBpbiBhbHBoYWJldGljYWwgb3JkZXIsIGFuZAorICAgdGhlIGRlZmluaXRpb25zIHNoaWZ0ZWQgYnkgb25lIGZyb20gdGhlIHByZXZpb3VzIGJpdDsgdGh1cywgd2hlbiB3ZQorICAgYWRkIG9yIHJlbW92ZSBhIGJpdCwgb25seSBvbmUgb3RoZXIgZGVmaW5pdGlvbiBuZWVkIGNoYW5nZS4gICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHJlZ19zeW50YXhfdDsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogSWYgdGhpcyBiaXQgaXMgbm90IHNldCwgdGhlbiBcIGluc2lkZSBhIGJyYWNrZXQgZXhwcmVzc2lvbiBpcyBsaXRlcmFsLgorICAgSWYgc2V0LCB0aGVuIHN1Y2ggYSBcIHF1b3RlcyB0aGUgZm9sbG93aW5nIGNoYXJhY3Rlci4gICovCisjIGRlZmluZSBSRV9CQUNLU0xBU0hfRVNDQVBFX0lOX0xJU1RTICgodW5zaWduZWQgbG9uZyBpbnQpIDEpCisKKy8qIElmIHRoaXMgYml0IGlzIG5vdCBzZXQsIHRoZW4gKyBhbmQgPyBhcmUgb3BlcmF0b3JzLCBhbmQgXCsgYW5kIFw/IGFyZQorICAgICBsaXRlcmFscy4KKyAgIElmIHNldCwgdGhlbiBcKyBhbmQgXD8gYXJlIG9wZXJhdG9ycyBhbmQgKyBhbmQgPyBhcmUgbGl0ZXJhbHMuICAqLworIyBkZWZpbmUgUkVfQktfUExVU19RTSAoUkVfQkFDS1NMQVNIX0VTQ0FQRV9JTl9MSVNUUyA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gY2hhcmFjdGVyIGNsYXNzZXMgYXJlIHN1cHBvcnRlZC4gIFRoZXkgYXJlOgorICAgICBbOmFscGhhOl0sIFs6dXBwZXI6XSwgWzpsb3dlcjpdLCAgWzpkaWdpdDpdLCBbOmFsbnVtOl0sIFs6eGRpZ2l0Ol0sCisgICAgIFs6c3BhY2U6XSwgWzpwcmludDpdLCBbOnB1bmN0Ol0sIFs6Z3JhcGg6XSwgYW5kIFs6Y250cmw6XS4KKyAgIElmIG5vdCBzZXQsIHRoZW4gY2hhcmFjdGVyIGNsYXNzZXMgYXJlIG5vdCBzdXBwb3J0ZWQuICAqLworIyBkZWZpbmUgUkVfQ0hBUl9DTEFTU0VTIChSRV9CS19QTFVTX1FNIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiBeIGFuZCAkIGFyZSBhbHdheXMgYW5jaG9ycyAob3V0c2lkZSBicmFja2V0CisgICAgIGV4cHJlc3Npb25zLCBvZiBjb3Vyc2UpLgorICAgSWYgdGhpcyBiaXQgaXMgbm90IHNldCwgdGhlbiBpdCBkZXBlbmRzOgorCV4gIGlzIGFuIGFuY2hvciBpZiBpdCBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcmVndWxhcgorCSAgIGV4cHJlc3Npb24gb3IgYWZ0ZXIgYW4gb3Blbi1ncm91cCBvciBhbiBhbHRlcm5hdGlvbiBvcGVyYXRvcjsKKwkkICBpcyBhbiBhbmNob3IgaWYgaXQgaXMgYXQgdGhlIGVuZCBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiwgb3IKKwkgICBiZWZvcmUgYSBjbG9zZS1ncm91cCBvciBhbiBhbHRlcm5hdGlvbiBvcGVyYXRvci4KKworICAgVGhpcyBiaXQgY291bGQgYmUgKHJlKWNvbWJpbmVkIHdpdGggUkVfQ09OVEVYVF9JTkRFUF9PUFMsIGJlY2F1c2UKKyAgIFBPU0lYIGRyYWZ0IDExLjIgc2F5cyB0aGF0ICogZXRjLiBpbiBsZWFkaW5nIHBvc2l0aW9ucyBpcyB1bmRlZmluZWQuCisgICBXZSBhbHJlYWR5IGltcGxlbWVudGVkIGEgcHJldmlvdXMgZHJhZnQgd2hpY2ggbWFkZSB0aG9zZSBjb25zdHJ1Y3RzCisgICBpbnZhbGlkLCB0aG91Z2gsIHNvIHdlIGhhdmVuJ3QgY2hhbmdlZCB0aGUgY29kZSBiYWNrLiAgKi8KKyMgZGVmaW5lIFJFX0NPTlRFWFRfSU5ERVBfQU5DSE9SUyAoUkVfQ0hBUl9DTEFTU0VTIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlIGFsd2F5cyBzcGVjaWFsCisgICAgIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgdGhleSBhcmUgaW4gdGhlIHBhdHRlcm4uCisgICBJZiB0aGlzIGJpdCBpcyBub3Qgc2V0LCB0aGVuIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUgc3BlY2lhbCBvbmx5IGluCisgICAgIHNvbWUgY29udGV4dHM7IG90aGVyd2lzZSB0aGV5IGFyZSBvcmRpbmFyeS4gIFNwZWNpZmljYWxseSwKKyAgICAgKiArID8gYW5kIGludGVydmFscyBhcmUgb25seSBzcGVjaWFsIHdoZW4gbm90IGFmdGVyIHRoZSBiZWdpbm5pbmcsCisgICAgIG9wZW4tZ3JvdXAsIG9yIGFsdGVybmF0aW9uIG9wZXJhdG9yLiAgKi8KKyMgZGVmaW5lIFJFX0NPTlRFWFRfSU5ERVBfT1BTIChSRV9DT05URVhUX0lOREVQX0FOQ0hPUlMgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuICosICssID8sIGFuZCB7IGNhbm5vdCBiZSBmaXJzdCBpbiBhbiByZSBvcgorICAgICBpbW1lZGlhdGVseSBhZnRlciBhbiBhbHRlcm5hdGlvbiBvciBiZWdpbi1ncm91cCBvcGVyYXRvci4gICovCisjIGRlZmluZSBSRV9DT05URVhUX0lOVkFMSURfT1BTIChSRV9DT05URVhUX0lOREVQX09QUyA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gLiBtYXRjaGVzIG5ld2xpbmUuCisgICBJZiBub3Qgc2V0LCB0aGVuIGl0IGRvZXNuJ3QuICAqLworIyBkZWZpbmUgUkVfRE9UX05FV0xJTkUgKFJFX0NPTlRFWFRfSU5WQUxJRF9PUFMgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIC4gZG9lc24ndCBtYXRjaCBOVUwuCisgICBJZiBub3Qgc2V0LCB0aGVuIGl0IGRvZXMuICAqLworIyBkZWZpbmUgUkVfRE9UX05PVF9OVUxMIChSRV9ET1RfTkVXTElORSA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIG5vbm1hdGNoaW5nIGxpc3RzIFteLi4uXSBkbyBub3QgbWF0Y2ggbmV3bGluZS4KKyAgIElmIG5vdCBzZXQsIHRoZXkgZG8uICAqLworIyBkZWZpbmUgUkVfSEFUX0xJU1RTX05PVF9ORVdMSU5FIChSRV9ET1RfTk9UX05VTEwgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCBlaXRoZXIgXHsuLi5cfSBvciB7Li4ufSBkZWZpbmVzIGFuCisgICAgIGludGVydmFsLCBkZXBlbmRpbmcgb24gUkVfTk9fQktfQlJBQ0VTLgorICAgSWYgbm90IHNldCwgXHssIFx9LCB7LCBhbmQgfSBhcmUgbGl0ZXJhbHMuICAqLworIyBkZWZpbmUgUkVfSU5URVJWQUxTIChSRV9IQVRfTElTVFNfTk9UX05FV0xJTkUgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCArLCA/IGFuZCB8IGFyZW4ndCByZWNvZ25pemVkIGFzIG9wZXJhdG9ycy4KKyAgIElmIG5vdCBzZXQsIHRoZXkgYXJlLiAgKi8KKyMgZGVmaW5lIFJFX0xJTUlURURfT1BTIChSRV9JTlRFUlZBTFMgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCBuZXdsaW5lIGlzIGFuIGFsdGVybmF0aW9uIG9wZXJhdG9yLgorICAgSWYgbm90IHNldCwgbmV3bGluZSBpcyBsaXRlcmFsLiAgKi8KKyMgZGVmaW5lIFJFX05FV0xJTkVfQUxUIChSRV9MSU1JVEVEX09QUyA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gYHsuLi59JyBkZWZpbmVzIGFuIGludGVydmFsLCBhbmQgXHsgYW5kIFx9CisgICAgIGFyZSBsaXRlcmFscy4KKyAgSWYgbm90IHNldCwgdGhlbiBgXHsuLi5cfScgZGVmaW5lcyBhbiBpbnRlcnZhbC4gICovCisjIGRlZmluZSBSRV9OT19CS19CUkFDRVMgKFJFX05FV0xJTkVfQUxUIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgKC4uLikgZGVmaW5lcyBhIGdyb3VwLCBhbmQgXCggYW5kIFwpIGFyZSBsaXRlcmFscy4KKyAgIElmIG5vdCBzZXQsIFwoLi4uXCkgZGVmaW5lcyBhIGdyb3VwLCBhbmQgKCBhbmQgKSBhcmUgbGl0ZXJhbHMuICAqLworIyBkZWZpbmUgUkVfTk9fQktfUEFSRU5TIChSRV9OT19CS19CUkFDRVMgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIFw8ZGlnaXQ+IG1hdGNoZXMgPGRpZ2l0Pi4KKyAgIElmIG5vdCBzZXQsIHRoZW4gXDxkaWdpdD4gaXMgYSBiYWNrLXJlZmVyZW5jZS4gICovCisjIGRlZmluZSBSRV9OT19CS19SRUZTIChSRV9OT19CS19QQVJFTlMgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIHwgaXMgYW4gYWx0ZXJuYXRpb24gb3BlcmF0b3IsIGFuZCBcfCBpcyBsaXRlcmFsLgorICAgSWYgbm90IHNldCwgdGhlbiBcfCBpcyBhbiBhbHRlcm5hdGlvbiBvcGVyYXRvciwgYW5kIHwgaXMgbGl0ZXJhbC4gICovCisjIGRlZmluZSBSRV9OT19CS19WQkFSIChSRV9OT19CS19SRUZTIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiBhbiBlbmRpbmcgcmFuZ2UgcG9pbnQgY29sbGF0aW5nIGhpZ2hlcgorICAgICB0aGFuIHRoZSBzdGFydGluZyByYW5nZSBwb2ludCwgYXMgaW4gW3otYV0sIGlzIGludmFsaWQuCisgICBJZiBub3Qgc2V0LCB0aGVuIHdoZW4gZW5kaW5nIHJhbmdlIHBvaW50IGNvbGxhdGVzIGhpZ2hlciB0aGFuIHRoZQorICAgICBzdGFydGluZyByYW5nZSBwb2ludCwgdGhlIHJhbmdlIGlzIGlnbm9yZWQuICAqLworIyBkZWZpbmUgUkVfTk9fRU1QVFlfUkFOR0VTIChSRV9OT19CS19WQkFSIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiBhbiB1bm1hdGNoZWQgKSBpcyBvcmRpbmFyeS4KKyAgIElmIG5vdCBzZXQsIHRoZW4gYW4gdW5tYXRjaGVkICkgaXMgaW52YWxpZC4gICovCisjIGRlZmluZSBSRV9VTk1BVENIRURfUklHSFRfUEFSRU5fT1JEIChSRV9OT19FTVBUWV9SQU5HRVMgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCBzdWNjZWVkIGFzIHNvb24gYXMgd2UgbWF0Y2ggdGhlIHdob2xlIHBhdHRlcm4sCisgICB3aXRob3V0IGZ1cnRoZXIgYmFja3RyYWNraW5nLiAgKi8KKyMgZGVmaW5lIFJFX05PX1BPU0lYX0JBQ0tUUkFDS0lORyAoUkVfVU5NQVRDSEVEX1JJR0hUX1BBUkVOX09SRCA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIGRvIG5vdCBwcm9jZXNzIHRoZSBHTlUgcmVnZXggb3BlcmF0b3JzLgorICAgSWYgbm90IHNldCwgdGhlbiB0aGUgR05VIHJlZ2V4IG9wZXJhdG9ycyBhcmUgcmVjb2duaXplZC4gKi8KKyMgZGVmaW5lIFJFX05PX0dOVV9PUFMgKFJFX05PX1BPU0lYX0JBQ0tUUkFDS0lORyA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHR1cm4gb24gaW50ZXJuYWwgcmVnZXggZGVidWdnaW5nLgorICAgSWYgbm90IHNldCwgYW5kIGRlYnVnZ2luZyB3YXMgb24sIHR1cm4gaXQgb2ZmLgorICAgVGhpcyBvbmx5IHdvcmtzIGlmIHJlZ2V4LmMgaXMgY29tcGlsZWQgLURERUJVRy4KKyAgIFdlIGRlZmluZSB0aGlzIGJpdCBhbHdheXMsIHNvIHRoYXQgYWxsIHRoYXQncyBuZWVkZWQgdG8gdHVybiBvbgorICAgZGVidWdnaW5nIGlzIHRvIHJlY29tcGlsZSByZWdleC5jOyB0aGUgY2FsbGluZyBjb2RlIGNhbiBhbHdheXMgaGF2ZQorICAgdGhpcyBiaXQgc2V0LCBhbmQgaXQgd29uJ3QgYWZmZWN0IGFueXRoaW5nIGluIHRoZSBub3JtYWwgY2FzZS4gKi8KKyMgZGVmaW5lIFJFX0RFQlVHIChSRV9OT19HTlVfT1BTIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgYSBzeW50YWN0aWNhbGx5IGludmFsaWQgaW50ZXJ2YWwgaXMgdHJlYXRlZCBhcworICAgYSBzdHJpbmcgb2Ygb3JkaW5hcnkgY2hhcmFjdGVycy4gIEZvciBleGFtcGxlLCB0aGUgRVJFICdhezEnIGlzCisgICB0cmVhdGVkIGFzICdhXHsxJy4gICovCisjIGRlZmluZSBSRV9JTlZBTElEX0lOVEVSVkFMX09SRCAoUkVfREVCVUcgPDwgMSkKKworLyogRUdMSUJDOiBPbGQgcmVnZXggaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGVzZS4gICovCisjIGlmZGVmIF9fT1BUSU9OX1BPU0lYX1JFR0VYUF9HTElCQworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIGlnbm9yZSBjYXNlIHdoZW4gbWF0Y2hpbmcuCisgICBJZiBub3Qgc2V0LCB0aGVuIGNhc2UgaXMgc2lnbmlmaWNhbnQuICAqLworIyBkZWZpbmUgUkVfSUNBU0UgKFJFX0lOVkFMSURfSU5URVJWQUxfT1JEIDw8IDEpCisKKy8qIFRoaXMgYml0IGlzIHVzZWQgaW50ZXJuYWxseSBsaWtlIFJFX0NPTlRFWFRfSU5ERVBfQU5DSE9SUyBidXQgb25seQorICAgZm9yIF4sIGJlY2F1c2UgaXQgaXMgZGlmZmljdWx0IHRvIHNjYW4gdGhlIHJlZ2V4IGJhY2t3YXJkcyB0byBmaW5kCisgICB3aGV0aGVyIF4gc2hvdWxkIGJlIHNwZWNpYWwuICAqLworIyBkZWZpbmUgUkVfQ0FSRVRfQU5DSE9SU19IRVJFIChSRV9JQ0FTRSA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gXHsgY2Fubm90IGJlIGZpcnN0IGluIGFuIGJyZSBvcgorICAgaW1tZWRpYXRlbHkgYWZ0ZXIgYW4gYWx0ZXJuYXRpb24gb3IgYmVnaW4tZ3JvdXAgb3BlcmF0b3IuICAqLworIyBkZWZpbmUgUkVfQ09OVEVYVF9JTlZBTElEX0RVUCAoUkVfQ0FSRVRfQU5DSE9SU19IRVJFIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiBub19zdWIgd2lsbCBiZSBzZXQgdG8gMSBkdXJpbmcKKyAgIHJlX2NvbXBpbGVfcGF0dGVybi4gICovCisjIGRlZmluZSBSRV9OT19TVUIgKFJFX0NPTlRFWFRfSU5WQUxJRF9EVVAgPDwgMSkKKyMgZW5kaWYgLyogX19PUFRJT05fUE9TSVhfUkVHRVhQX0dMSUJDICovCisjZW5kaWYKKworLyogVGhpcyBnbG9iYWwgdmFyaWFibGUgZGVmaW5lcyB0aGUgcGFydGljdWxhciByZWdleHAgc3ludGF4IHRvIHVzZSAoZm9yCisgICBzb21lIGludGVyZmFjZXMpLiAgV2hlbiBhIHJlZ2V4cCBpcyBjb21waWxlZCwgdGhlIHN5bnRheCB1c2VkIGlzCisgICBzdG9yZWQgaW4gdGhlIHBhdHRlcm4gYnVmZmVyLCBzbyBjaGFuZ2luZyB0aGlzIGRvZXMgbm90IGFmZmVjdAorICAgYWxyZWFkeS1jb21waWxlZCByZWdleHBzLiAgKi8KK2V4dGVybiByZWdfc3ludGF4X3QgcmVfc3ludGF4X29wdGlvbnM7CisMCisjaWZkZWYgX19VU0VfR05VCisvKiBEZWZpbmUgY29tYmluYXRpb25zIG9mIHRoZSBhYm92ZSBiaXRzIGZvciB0aGUgc3RhbmRhcmQgcG9zc2liaWxpdGllcy4KKyAgIChUaGUgW1tbIGNvbW1lbnRzIGRlbGltaXQgd2hhdCBnZXRzIHB1dCBpbnRvIHRoZSBUZXhpbmZvIGZpbGUsIHNvCisgICBkb24ndCBkZWxldGUgdGhlbSEpICAqLworLyogW1tbYmVnaW4gc3ludGF4ZXNdXV0gKi8KKyNkZWZpbmUgUkVfU1lOVEFYX0VNQUNTIDAKKworI2RlZmluZSBSRV9TWU5UQVhfQVdLCQkJCQkJCVwKKyAgKFJFX0JBQ0tTTEFTSF9FU0NBUEVfSU5fTElTVFMgICB8IFJFX0RPVF9OT1RfTlVMTAkJCVwKKyAgIHwgUkVfTk9fQktfUEFSRU5TICAgICAgICAgICAgICB8IFJFX05PX0JLX1JFRlMJCQlcCisgICB8IFJFX05PX0JLX1ZCQVIgICAgICAgICAgICAgICAgfCBSRV9OT19FTVBUWV9SQU5HRVMJCQlcCisgICB8IFJFX0RPVF9ORVdMSU5FCQkgIHwgUkVfQ09OVEVYVF9JTkRFUF9BTkNIT1JTCQlcCisgICB8IFJFX0NIQVJfQ0xBU1NFUwkJCQkJCQlcCisgICB8IFJFX1VOTUFUQ0hFRF9SSUdIVF9QQVJFTl9PUkQgfCBSRV9OT19HTlVfT1BTKQorCisjZGVmaW5lIFJFX1NZTlRBWF9HTlVfQVdLCQkJCQkJXAorICAoKFJFX1NZTlRBWF9QT1NJWF9FWFRFTkRFRCB8IFJFX0JBQ0tTTEFTSF9FU0NBUEVfSU5fTElTVFMJCVwKKyAgICB8IFJFX0lOVkFMSURfSU5URVJWQUxfT1JEKQkJCQkJCVwKKyAgICYgfihSRV9ET1RfTk9UX05VTEwgfCBSRV9DT05URVhUX0lOREVQX09QUwkJCQlcCisgICAgICB8IFJFX0NPTlRFWFRfSU5WQUxJRF9PUFMgKSkKKworI2RlZmluZSBSRV9TWU5UQVhfUE9TSVhfQVdLCQkJCQkJXAorICAoUkVfU1lOVEFYX1BPU0lYX0VYVEVOREVEIHwgUkVfQkFDS1NMQVNIX0VTQ0FQRV9JTl9MSVNUUwkJXAorICAgfCBSRV9JTlRFUlZBTFMJICAgIHwgUkVfTk9fR05VX09QUwkJCQlcCisgICB8IFJFX0lOVkFMSURfSU5URVJWQUxfT1JEKQorCisjZGVmaW5lIFJFX1NZTlRBWF9HUkVQCQkJCQkJCVwKKyAgKFJFX0JLX1BMVVNfUU0gICAgICAgICAgICAgIHwgUkVfQ0hBUl9DTEFTU0VTCQkJCVwKKyAgIHwgUkVfSEFUX0xJU1RTX05PVF9ORVdMSU5FIHwgUkVfSU5URVJWQUxTCQkJCVwKKyAgIHwgUkVfTkVXTElORV9BTFQpCisKKyNkZWZpbmUgUkVfU1lOVEFYX0VHUkVQCQkJCQkJCVwKKyAgKFJFX0NIQVJfQ0xBU1NFUyAgICAgICAgfCBSRV9DT05URVhUX0lOREVQX0FOQ0hPUlMJCQlcCisgICB8IFJFX0NPTlRFWFRfSU5ERVBfT1BTIHwgUkVfSEFUX0xJU1RTX05PVF9ORVdMSU5FCQkJXAorICAgfCBSRV9ORVdMSU5FX0FMVCAgICAgICB8IFJFX05PX0JLX1BBUkVOUwkJCQlcCisgICB8IFJFX05PX0JLX1ZCQVIpCisKKyNkZWZpbmUgUkVfU1lOVEFYX1BPU0lYX0VHUkVQCQkJCQkJXAorICAoUkVfU1lOVEFYX0VHUkVQIHwgUkVfSU5URVJWQUxTIHwgUkVfTk9fQktfQlJBQ0VTCQkJXAorICAgfCBSRV9JTlZBTElEX0lOVEVSVkFMX09SRCkKKworLyogUDEwMDMuMi9EMTEuMiwgc2VjdGlvbiA0LjIwLjcuMSwgbGluZXMgNTA3OGZmLiAgKi8KKyNkZWZpbmUgUkVfU1lOVEFYX0VEIFJFX1NZTlRBWF9QT1NJWF9CQVNJQworCisjZGVmaW5lIFJFX1NZTlRBWF9TRUQgUkVfU1lOVEFYX1BPU0lYX0JBU0lDCisKKy8qIFN5bnRheCBiaXRzIGNvbW1vbiB0byBib3RoIGJhc2ljIGFuZCBleHRlbmRlZCBQT1NJWCByZWdleCBzeW50YXguICAqLworI2RlZmluZSBfUkVfU1lOVEFYX1BPU0lYX0NPTU1PTgkJCQkJCVwKKyAgKFJFX0NIQVJfQ0xBU1NFUyB8IFJFX0RPVF9ORVdMSU5FICAgICAgfCBSRV9ET1RfTk9UX05VTEwJCVwKKyAgIHwgUkVfSU5URVJWQUxTICB8IFJFX05PX0VNUFRZX1JBTkdFUykKKworI2lmZGVmIF9fT1BUSU9OX1BPU0lYX1JFR0VYUF9HTElCQworI2RlZmluZSBSRV9TWU5UQVhfUE9TSVhfQkFTSUMJCQkJCQlcCisgIChfUkVfU1lOVEFYX1BPU0lYX0NPTU1PTiB8IFJFX0JLX1BMVVNfUU0gfCBSRV9DT05URVhUX0lOVkFMSURfRFVQKQorI2Vsc2UKKyNkZWZpbmUgUkVfU1lOVEFYX1BPU0lYX0JBU0lDCQkJCQkJXAorICAoX1JFX1NZTlRBWF9QT1NJWF9DT01NT04gfCBSRV9CS19QTFVTX1FNKQorI2VuZGlmCisKKy8qIERpZmZlcnMgZnJvbSAuLi5fUE9TSVhfQkFTSUMgb25seSBpbiB0aGF0IFJFX0JLX1BMVVNfUU0gYmVjb21lcworICAgUkVfTElNSVRFRF9PUFMsIGkuZS4sIFw/IFwrIFx8IGFyZSBub3QgcmVjb2duaXplZC4gIEFjdHVhbGx5LCB0aGlzCisgICBpc24ndCBtaW5pbWFsLCBzaW5jZSBvdGhlciBvcGVyYXRvcnMsIHN1Y2ggYXMgXGAsIGFyZW4ndCBkaXNhYmxlZC4gICovCisjZGVmaW5lIFJFX1NZTlRBWF9QT1NJWF9NSU5JTUFMX0JBU0lDCQkJCQlcCisgIChfUkVfU1lOVEFYX1BPU0lYX0NPTU1PTiB8IFJFX0xJTUlURURfT1BTKQorCisjZGVmaW5lIFJFX1NZTlRBWF9QT1NJWF9FWFRFTkRFRAkJCQkJXAorICAoX1JFX1NZTlRBWF9QT1NJWF9DT01NT04gIHwgUkVfQ09OVEVYVF9JTkRFUF9BTkNIT1JTCQkJXAorICAgfCBSRV9DT05URVhUX0lOREVQX09QUyAgIHwgUkVfTk9fQktfQlJBQ0VTCQkJCVwKKyAgIHwgUkVfTk9fQktfUEFSRU5TICAgICAgICB8IFJFX05PX0JLX1ZCQVIJCQkJXAorICAgfCBSRV9DT05URVhUX0lOVkFMSURfT1BTIHwgUkVfVU5NQVRDSEVEX1JJR0hUX1BBUkVOX09SRCkKKworLyogRGlmZmVycyBmcm9tIC4uLl9QT1NJWF9FWFRFTkRFRCBpbiB0aGF0IFJFX0NPTlRFWFRfSU5ERVBfT1BTIGlzCisgICByZW1vdmVkIGFuZCBSRV9OT19CS19SRUZTIGlzIGFkZGVkLiAgKi8KKyNkZWZpbmUgUkVfU1lOVEFYX1BPU0lYX01JTklNQUxfRVhURU5ERUQJCQkJXAorICAoX1JFX1NZTlRBWF9QT1NJWF9DT01NT04gIHwgUkVfQ09OVEVYVF9JTkRFUF9BTkNIT1JTCQkJXAorICAgfCBSRV9DT05URVhUX0lOVkFMSURfT1BTIHwgUkVfTk9fQktfQlJBQ0VTCQkJCVwKKyAgIHwgUkVfTk9fQktfUEFSRU5TICAgICAgICB8IFJFX05PX0JLX1JFRlMJCQkJXAorICAgfCBSRV9OT19CS19WQkFSCSAgICB8IFJFX1VOTUFUQ0hFRF9SSUdIVF9QQVJFTl9PUkQpCisvKiBbW1tlbmQgc3ludGF4ZXNdXV0gKi8KKwwKKy8qIE1heGltdW0gbnVtYmVyIG9mIGR1cGxpY2F0ZXMgYW4gaW50ZXJ2YWwgY2FuIGFsbG93LiAgU29tZSBzeXN0ZW1zCisgICAoZXJyb25lb3VzbHkpIGRlZmluZSB0aGlzIGluIG90aGVyIGhlYWRlciBmaWxlcywgYnV0IHdlIHdhbnQgb3VyCisgICB2YWx1ZSwgc28gcmVtb3ZlIGFueSBwcmV2aW91cyBkZWZpbmUuICAqLworIyBpZmRlZiBSRV9EVVBfTUFYCisjICB1bmRlZiBSRV9EVVBfTUFYCisjIGVuZGlmCisvKiBJZiBzaXplb2YoaW50KSA9PSAyLCB0aGVuICgoMSA8PCAxNSkgLSAxKSBvdmVyZmxvd3MuICAqLworIyBkZWZpbmUgUkVfRFVQX01BWCAoMHg3ZmZmKQorI2VuZGlmCisKKworLyogUE9TSVggYGNmbGFncycgYml0cyAoaS5lLiwgaW5mb3JtYXRpb24gZm9yIGByZWdjb21wJykuICAqLworCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gdXNlIGV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBzeW50YXguCisgICBJZiBub3Qgc2V0LCB0aGVuIHVzZSBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb24gc3ludGF4LiAgKi8KKyNkZWZpbmUgUkVHX0VYVEVOREVEIDEKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIGlnbm9yZSBjYXNlIHdoZW4gbWF0Y2hpbmcuCisgICBJZiBub3Qgc2V0LCB0aGVuIGNhc2UgaXMgc2lnbmlmaWNhbnQuICAqLworI2RlZmluZSBSRUdfSUNBU0UgKFJFR19FWFRFTkRFRCA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gYW5jaG9ycyBkbyBub3QgbWF0Y2ggYXQgbmV3bGluZQorICAgICBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcuCisgICBJZiBub3Qgc2V0LCB0aGVuIGFuY2hvcnMgZG8gbWF0Y2ggYXQgbmV3bGluZXMuICAqLworI2RlZmluZSBSRUdfTkVXTElORSAoUkVHX0lDQVNFIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiByZXBvcnQgb25seSBzdWNjZXNzIG9yIGZhaWwgaW4gcmVnZXhlYy4KKyAgIElmIG5vdCBzZXQsIHRoZW4gcmV0dXJucyBkaWZmZXIgYmV0d2VlbiBub3QgbWF0Y2hpbmcgYW5kIGVycm9ycy4gICovCisjZGVmaW5lIFJFR19OT1NVQiAoUkVHX05FV0xJTkUgPDwgMSkKKworCisvKiBQT1NJWCBgZWZsYWdzJyBiaXRzIChpLmUuLCBpbmZvcm1hdGlvbiBmb3IgcmVnZXhlYykuICAqLworCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gdGhlIGJlZ2lubmluZy1vZi1saW5lIG9wZXJhdG9yIGRvZXNuJ3QgbWF0Y2gKKyAgICAgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nIChwcmVzdW1hYmx5IGJlY2F1c2UgaXQncyBub3QgdGhlCisgICAgIGJlZ2lubmluZyBvZiBhIGxpbmUpLgorICAgSWYgbm90IHNldCwgdGhlbiB0aGUgYmVnaW5uaW5nLW9mLWxpbmUgb3BlcmF0b3IgZG9lcyBtYXRjaCB0aGUKKyAgICAgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuICAqLworI2RlZmluZSBSRUdfTk9UQk9MIDEKKworLyogTGlrZSBSRUdfTk9UQk9MLCBleGNlcHQgZm9yIHRoZSBlbmQtb2YtbGluZS4gICovCisjZGVmaW5lIFJFR19OT1RFT0wgKDEgPDwgMSkKKworI2lmZGVmIF9fT1BUSU9OX1BPU0lYX1JFR0VYUF9HTElCQworLyogVXNlIFBNQVRDSFswXSB0byBkZWxpbWl0IHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzZWFyY2ggaW4gdGhlCisgICBidWZmZXIuICAqLworI2RlZmluZSBSRUdfU1RBUlRFTkQgKDEgPDwgMikKKyNlbmRpZgorCisKKy8qIElmIGFueSBlcnJvciBjb2RlcyBhcmUgcmVtb3ZlZCwgY2hhbmdlZCwgb3IgYWRkZWQsIHVwZGF0ZSB0aGUKKyAgIGByZV9lcnJvcl9tc2cnIHRhYmxlIGluIHJlZ2V4LmMuICAqLwordHlwZWRlZiBlbnVtCit7CisjaWYgZGVmaW5lZCBfWE9QRU5fU09VUkNFIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworICBSRUdfRU5PU1lTID0gLTEsCS8qIFRoaXMgd2lsbCBuZXZlciBoYXBwZW4gZm9yIHRoaXMgaW1wbGVtZW50YXRpb24uICAqLworI2VuZGlmCisKKyAgUkVHX05PRVJST1IgPSAwLAkvKiBTdWNjZXNzLiAgKi8KKyAgUkVHX05PTUFUQ0gsCQkvKiBEaWRuJ3QgZmluZCBhIG1hdGNoIChmb3IgcmVnZXhlYykuICAqLworCisgIC8qIFBPU0lYIHJlZ2NvbXAgcmV0dXJuIGVycm9yIGNvZGVzLiAgKEluIHRoZSBvcmRlciBsaXN0ZWQgaW4gdGhlCisgICAgIHN0YW5kYXJkLikgICovCisgIFJFR19CQURQQVQsCQkvKiBJbnZhbGlkIHBhdHRlcm4uICAqLworICBSRUdfRUNPTExBVEUsCQkvKiBJbmFsaWQgY29sbGF0aW5nIGVsZW1lbnQuICAqLworICBSRUdfRUNUWVBFLAkJLyogSW52YWxpZCBjaGFyYWN0ZXIgY2xhc3MgbmFtZS4gICovCisgIFJFR19FRVNDQVBFLAkJLyogVHJhaWxpbmcgYmFja3NsYXNoLiAgKi8KKyAgUkVHX0VTVUJSRUcsCQkvKiBJbnZhbGlkIGJhY2sgcmVmZXJlbmNlLiAgKi8KKyAgUkVHX0VCUkFDSywJCS8qIFVubWF0Y2hlZCBsZWZ0IGJyYWNrZXQuICAqLworICBSRUdfRVBBUkVOLAkJLyogUGFyZW50aGVzaXMgaW1iYWxhbmNlLiAgKi8KKyAgUkVHX0VCUkFDRSwJCS8qIFVubWF0Y2hlZCBcey4gICovCisgIFJFR19CQURCUiwJCS8qIEludmFsaWQgY29udGVudHMgb2YgXHtcfS4gICovCisgIFJFR19FUkFOR0UsCQkvKiBJbnZhbGlkIHJhbmdlIGVuZC4gICovCisgIFJFR19FU1BBQ0UsCQkvKiBSYW4gb3V0IG9mIG1lbW9yeS4gICovCisgIFJFR19CQURSUFQsCQkvKiBObyBwcmVjZWRpbmcgcmUgZm9yIHJlcGV0aXRpb24gb3AuICAqLworCisgIC8qIEVycm9yIGNvZGVzIHdlJ3ZlIGFkZGVkLiAgKi8KKyAgUkVHX0VFTkQsCQkvKiBQcmVtYXR1cmUgZW5kLiAgKi8KKyAgUkVHX0VTSVpFLAkJLyogQ29tcGlsZWQgcGF0dGVybiBiaWdnZXIgdGhhbiAyXjE2IGJ5dGVzLiAgKi8KKyAgUkVHX0VSUEFSRU4JCS8qIFVubWF0Y2hlZCApIG9yIFwpOyBub3QgcmV0dXJuZWQgZnJvbSByZWdjb21wLiAgKi8KK30gcmVnX2VycmNvZGVfdDsKKwwKKy8qIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgcmVwcmVzZW50cyBhIGNvbXBpbGVkIHBhdHRlcm4uICBCZWZvcmUgY2FsbGluZworICAgdGhlIHBhdHRlcm4gY29tcGlsZXIsIHRoZSBmaWVsZHMgYGJ1ZmZlcicsIGBhbGxvY2F0ZWQnLCBgZmFzdG1hcCcsCisgICBhbmQgYHRyYW5zbGF0ZScgY2FuIGJlIHNldC4gIEFmdGVyIHRoZSBwYXR0ZXJuIGhhcyBiZWVuIGNvbXBpbGVkLAorICAgdGhlIGZpZWxkcyBgcmVfbnN1YicsIGBub3RfYm9sJyBhbmQgYG5vdF9lb2wnIGFyZSBhdmFpbGFibGUuICBBbGwKKyAgIG90aGVyIGZpZWxkcyBhcmUgcHJpdmF0ZSB0byB0aGUgcmVnZXggcm91dGluZXMuICAqLworCisjaWZuZGVmIFJFX1RSQU5TTEFURV9UWVBFCisjIGRlZmluZSBfX1JFX1RSQU5TTEFURV9UWVBFIHVuc2lnbmVkIGNoYXIgKgorIyBpZmRlZiBfX1VTRV9HTlUKKyMgIGRlZmluZSBSRV9UUkFOU0xBVEVfVFlQRSBfX1JFX1RSQU5TTEFURV9UWVBFCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgX19SRVBCX1BSRUZJWChuYW1lKSBuYW1lCisjZWxzZQorIyBkZWZpbmUgX19SRVBCX1BSRUZJWChuYW1lKSBfXyMjbmFtZQorI2VuZGlmCisKK3N0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlcgoreworICAvKiBTcGFjZSB0aGF0IGhvbGRzIHRoZSBjb21waWxlZCBwYXR0ZXJuLiAgSXQgaXMgZGVjbGFyZWQgYXMKKyAgICAgYHVuc2lnbmVkIGNoYXIgKicgYmVjYXVzZSBpdHMgZWxlbWVudHMgYXJlIHNvbWV0aW1lcyB1c2VkIGFzCisgICAgIGFycmF5IGluZGV4ZXMuICAqLworICB1bnNpZ25lZCBjaGFyICpfX1JFUEJfUFJFRklYKGJ1ZmZlcik7CisKKyAgLyogTnVtYmVyIG9mIGJ5dGVzIHRvIHdoaWNoIGBidWZmZXInIHBvaW50cy4gICovCisgIHVuc2lnbmVkIGxvbmcgaW50IF9fUkVQQl9QUkVGSVgoYWxsb2NhdGVkKTsKKworICAvKiBOdW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgdXNlZCBpbiBgYnVmZmVyJy4gICovCisgIHVuc2lnbmVkIGxvbmcgaW50IF9fUkVQQl9QUkVGSVgodXNlZCk7CisKKyAgLyogU3ludGF4IHNldHRpbmcgd2l0aCB3aGljaCB0aGUgcGF0dGVybiB3YXMgY29tcGlsZWQuICAqLworICByZWdfc3ludGF4X3QgX19SRVBCX1BSRUZJWChzeW50YXgpOworCisgIC8qIFBvaW50ZXIgdG8gYSBmYXN0bWFwLCBpZiBhbnksIG90aGVyd2lzZSB6ZXJvLiAgcmVfc2VhcmNoIHVzZXMgdGhlCisgICAgIGZhc3RtYXAsIGlmIHRoZXJlIGlzIG9uZSwgdG8gc2tpcCBvdmVyIGltcG9zc2libGUgc3RhcnRpbmcgcG9pbnRzCisgICAgIGZvciBtYXRjaGVzLiAgKi8KKyAgY2hhciAqX19SRVBCX1BSRUZJWChmYXN0bWFwKTsKKworICAvKiBFaXRoZXIgYSB0cmFuc2xhdGUgdGFibGUgdG8gYXBwbHkgdG8gYWxsIGNoYXJhY3RlcnMgYmVmb3JlCisgICAgIGNvbXBhcmluZyB0aGVtLCBvciB6ZXJvIGZvciBubyB0cmFuc2xhdGlvbi4gIFRoZSB0cmFuc2xhdGlvbiBpcworICAgICBhcHBsaWVkIHRvIGEgcGF0dGVybiB3aGVuIGl0IGlzIGNvbXBpbGVkIGFuZCB0byBhIHN0cmluZyB3aGVuIGl0CisgICAgIGlzIG1hdGNoZWQuICAqLworICBfX1JFX1RSQU5TTEFURV9UWVBFIF9fUkVQQl9QUkVGSVgodHJhbnNsYXRlKTsKKworICAvKiBOdW1iZXIgb2Ygc3ViZXhwcmVzc2lvbnMgZm91bmQgYnkgdGhlIGNvbXBpbGVyLiAgKi8KKyAgc2l6ZV90IHJlX25zdWI7CisKKyAgLyogWmVybyBpZiB0aGlzIHBhdHRlcm4gY2Fubm90IG1hdGNoIHRoZSBlbXB0eSBzdHJpbmcsIG9uZSBlbHNlLgorICAgICBXZWxsLCBpbiB0cnV0aCBpdCdzIHVzZWQgb25seSBpbiBgcmVfc2VhcmNoXzInLCB0byBzZWUgd2hldGhlciBvcgorICAgICBub3Qgd2Ugc2hvdWxkIHVzZSB0aGUgZmFzdG1hcCwgc28gd2UgZG9uJ3Qgc2V0IHRoaXMgYWJzb2x1dGVseQorICAgICBwZXJmZWN0bHk7IHNlZSBgcmVfY29tcGlsZV9mYXN0bWFwJyAodGhlIGBkdXBsaWNhdGUnIGNhc2UpLiAgKi8KKyAgdW5zaWduZWQgX19SRVBCX1BSRUZJWChjYW5fYmVfbnVsbCkgOiAxOworCisgIC8qIElmIFJFR1NfVU5BTExPQ0FURUQsIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBgcmVncycgc3RydWN0dXJlCisgICAgIGZvciBgbWF4IChSRV9OUkVHUywgcmVfbnN1YiArIDEpJyBncm91cHMuCisgICAgIElmIFJFR1NfUkVBTExPQ0FURSwgcmVhbGxvY2F0ZSBzcGFjZSBpZiBuZWNlc3NhcnkuCisgICAgIElmIFJFR1NfRklYRUQsIHVzZSB3aGF0J3MgdGhlcmUuICAqLworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgUkVHU19VTkFMTE9DQVRFRCAwCisjIGRlZmluZSBSRUdTX1JFQUxMT0NBVEUgMQorIyBkZWZpbmUgUkVHU19GSVhFRCAyCisjZW5kaWYKKyAgdW5zaWduZWQgX19SRVBCX1BSRUZJWChyZWdzX2FsbG9jYXRlZCkgOiAyOworCisgIC8qIFNldCB0byB6ZXJvIHdoZW4gYHJlZ2V4X2NvbXBpbGUnIGNvbXBpbGVzIGEgcGF0dGVybjsgc2V0IHRvIG9uZQorICAgICBieSBgcmVfY29tcGlsZV9mYXN0bWFwJyBpZiBpdCB1cGRhdGVzIHRoZSBmYXN0bWFwLiAgKi8KKyAgdW5zaWduZWQgX19SRVBCX1BSRUZJWChmYXN0bWFwX2FjY3VyYXRlKSA6IDE7CisKKyAgLyogSWYgc2V0LCBgcmVfbWF0Y2hfMicgZG9lcyBub3QgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0CisgICAgIHN1YmV4cHJlc3Npb25zLiAgKi8KKyAgdW5zaWduZWQgX19SRVBCX1BSRUZJWChub19zdWIpIDogMTsKKworICAvKiBJZiBzZXQsIGEgYmVnaW5uaW5nLW9mLWxpbmUgYW5jaG9yIGRvZXNuJ3QgbWF0Y2ggYXQgdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc3RyaW5nLiAgKi8KKyAgdW5zaWduZWQgX19SRVBCX1BSRUZJWChub3RfYm9sKSA6IDE7CisKKyAgLyogU2ltaWxhcmx5IGZvciBhbiBlbmQtb2YtbGluZSBhbmNob3IuICAqLworICB1bnNpZ25lZCBfX1JFUEJfUFJFRklYKG5vdF9lb2wpIDogMTsKKworICAvKiBJZiB0cnVlLCBhbiBhbmNob3IgYXQgYSBuZXdsaW5lIG1hdGNoZXMuICAqLworICB1bnNpZ25lZCBfX1JFUEJfUFJFRklYKG5ld2xpbmVfYW5jaG9yKSA6IDE7Cit9OworCit0eXBlZGVmIHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciByZWdleF90OworDAorLyogVHlwZSBmb3IgYnl0ZSBvZmZzZXRzIHdpdGhpbiB0aGUgc3RyaW5nLiAgUE9TSVggbWFuZGF0ZXMgdGhpcy4gICovCit0eXBlZGVmIGludCByZWdvZmZfdDsKKworCisjaWZkZWYgX19VU0VfR05VCisvKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgd2Ugc3RvcmUgcmVnaXN0ZXIgbWF0Y2ggZGF0YSBpbi4gIFNlZQorICAgcmVnZXgudGV4aW5mbyBmb3IgYSBmdWxsIGRlc2NyaXB0aW9uIG9mIHdoYXQgcmVnaXN0ZXJzIG1hdGNoLiAgKi8KK3N0cnVjdCByZV9yZWdpc3RlcnMKK3sKKyAgdW5zaWduZWQgbnVtX3JlZ3M7CisgIHJlZ29mZl90ICpzdGFydDsKKyAgcmVnb2ZmX3QgKmVuZDsKK307CisKKworLyogSWYgYHJlZ3NfYWxsb2NhdGVkJyBpcyBSRUdTX1VOQUxMT0NBVEVEIGluIHRoZSBwYXR0ZXJuIGJ1ZmZlciwKKyAgIGByZV9tYXRjaF8yJyByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGF0IGxlYXN0IHRoaXMgbWFueSByZWdpc3RlcnMKKyAgIHRoZSBmaXJzdCB0aW1lIGEgYHJlZ3MnIHN0cnVjdHVyZSBpcyBwYXNzZWQuICAqLworIyBpZm5kZWYgUkVfTlJFR1MKKyMgIGRlZmluZSBSRV9OUkVHUyAzMAorIyBlbmRpZgorI2VuZGlmCisKKworLyogUE9TSVggc3BlY2lmaWNhdGlvbiBmb3IgcmVnaXN0ZXJzLiAgQXNpZGUgZnJvbSB0aGUgZGlmZmVyZW50IG5hbWVzIHRoYW4KKyAgIGByZV9yZWdpc3RlcnMnLCBQT1NJWCB1c2VzIGFuIGFycmF5IG9mIHN0cnVjdHVyZXMsIGluc3RlYWQgb2YgYQorICAgc3RydWN0dXJlIG9mIGFycmF5cy4gICovCit0eXBlZGVmIHN0cnVjdAoreworICByZWdvZmZfdCBybV9zbzsgIC8qIEJ5dGUgb2Zmc2V0IGZyb20gc3RyaW5nJ3Mgc3RhcnQgdG8gc3Vic3RyaW5nJ3Mgc3RhcnQuICAqLworICByZWdvZmZfdCBybV9lbzsgIC8qIEJ5dGUgb2Zmc2V0IGZyb20gc3RyaW5nJ3Mgc3RhcnQgdG8gc3Vic3RyaW5nJ3MgZW5kLiAgKi8KK30gcmVnbWF0Y2hfdDsKKwwKKy8qIERlY2xhcmF0aW9ucyBmb3Igcm91dGluZXMuICAqLworCisjaWZkZWYgX19VU0VfR05VCisvKiBTZXRzIHRoZSBjdXJyZW50IGRlZmF1bHQgc3ludGF4IHRvIFNZTlRBWCwgYW5kIHJldHVybiB0aGUgb2xkIHN5bnRheC4KKyAgIFlvdSBjYW4gYWxzbyBzaW1wbHkgYXNzaWduIHRvIHRoZSBgcmVfc3ludGF4X29wdGlvbnMnIHZhcmlhYmxlLiAgKi8KK2V4dGVybiByZWdfc3ludGF4X3QgcmVfc2V0X3N5bnRheCAocmVnX3N5bnRheF90IF9fc3ludGF4KTsKKworLyogQ29tcGlsZSB0aGUgcmVndWxhciBleHByZXNzaW9uIFBBVFRFUk4sIHdpdGggbGVuZ3RoIExFTkdUSAorICAgYW5kIHN5bnRheCBnaXZlbiBieSB0aGUgZ2xvYmFsIGByZV9zeW50YXhfb3B0aW9ucycsIGludG8gdGhlIGJ1ZmZlcgorICAgQlVGRkVSLiAgUmV0dXJuIE5VTEwgaWYgc3VjY2Vzc2Z1bCwgYW5kIGFuIGVycm9yIHN0cmluZyBpZiBub3QuCisKKyAgIFRvIGZyZWUgdGhlIGFsbG9jYXRlZCBzdG9yYWdlLCB5b3UgbXVzdCBjYWxsIGByZWdmcmVlJyBvbiBCVUZGRVIuCisgICBOb3RlIHRoYXQgdGhlIHRyYW5zbGF0ZSB0YWJsZSBtdXN0IGVpdGhlciBoYXZlIGJlZW4gaW5pdGlhbGlzZWQgYnkKKyAgIGByZWdjb21wJywgd2l0aCBhIG1hbGxvYydlZCB2YWx1ZSwgb3Igc2V0IHRvIE5VTEwgYmVmb3JlIGNhbGxpbmcKKyAgIGByZWdmcmVlJy4gICovCitleHRlcm4gY29uc3QgY2hhciAqcmVfY29tcGlsZV9wYXR0ZXJuIChjb25zdCBjaGFyICpfX3BhdHRlcm4sIHNpemVfdCBfX2xlbmd0aCwKKwkJCQkgICAgICAgc3RydWN0IHJlX3BhdHRlcm5fYnVmZmVyICpfX2J1ZmZlcik7CisKKworLyogQ29tcGlsZSBhIGZhc3RtYXAgZm9yIHRoZSBjb21waWxlZCBwYXR0ZXJuIGluIEJVRkZFUjsgdXNlZCB0bworICAgYWNjZWxlcmF0ZSBzZWFyY2hlcy4gIFJldHVybiAwIGlmIHN1Y2Nlc3NmdWwgYW5kIC0yIGlmIHdhcyBhbgorICAgaW50ZXJuYWwgZXJyb3IuICAqLworZXh0ZXJuIGludCByZV9jb21waWxlX2Zhc3RtYXAgKHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqX19idWZmZXIpOworCisKKy8qIFNlYXJjaCBpbiB0aGUgc3RyaW5nIFNUUklORyAod2l0aCBsZW5ndGggTEVOR1RIKSBmb3IgdGhlIHBhdHRlcm4KKyAgIGNvbXBpbGVkIGludG8gQlVGRkVSLiAgU3RhcnQgc2VhcmNoaW5nIGF0IHBvc2l0aW9uIFNUQVJULCBmb3IgUkFOR0UKKyAgIGNoYXJhY3RlcnMuICBSZXR1cm4gdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtYXRjaCwgLTEgZm9yIG5vCisgICBtYXRjaCwgb3IgLTIgZm9yIGFuIGludGVybmFsIGVycm9yLiAgQWxzbyByZXR1cm4gcmVnaXN0ZXIKKyAgIGluZm9ybWF0aW9uIGluIFJFR1MgKGlmIFJFR1MgYW5kIEJVRkZFUi0+bm9fc3ViIGFyZSBub256ZXJvKS4gICovCitleHRlcm4gaW50IHJlX3NlYXJjaCAoc3RydWN0IHJlX3BhdHRlcm5fYnVmZmVyICpfX2J1ZmZlciwgY29uc3QgY2hhciAqX19zdHJpbmcsCisJCSAgICAgIGludCBfX2xlbmd0aCwgaW50IF9fc3RhcnQsIGludCBfX3JhbmdlLAorCQkgICAgICBzdHJ1Y3QgcmVfcmVnaXN0ZXJzICpfX3JlZ3MpOworCisKKy8qIExpa2UgYHJlX3NlYXJjaCcsIGJ1dCBzZWFyY2ggaW4gdGhlIGNvbmNhdGVuYXRpb24gb2YgU1RSSU5HMSBhbmQKKyAgIFNUUklORzIuICBBbHNvLCBzdG9wIHNlYXJjaGluZyBhdCBpbmRleCBTVEFSVCArIFNUT1AuICAqLworZXh0ZXJuIGludCByZV9zZWFyY2hfMiAoc3RydWN0IHJlX3BhdHRlcm5fYnVmZmVyICpfX2J1ZmZlciwKKwkJCWNvbnN0IGNoYXIgKl9fc3RyaW5nMSwgaW50IF9fbGVuZ3RoMSwKKwkJCWNvbnN0IGNoYXIgKl9fc3RyaW5nMiwgaW50IF9fbGVuZ3RoMiwgaW50IF9fc3RhcnQsCisJCQlpbnQgX19yYW5nZSwgc3RydWN0IHJlX3JlZ2lzdGVycyAqX19yZWdzLCBpbnQgX19zdG9wKTsKKworCisvKiBMaWtlIGByZV9zZWFyY2gnLCBidXQgcmV0dXJuIGhvdyBtYW55IGNoYXJhY3RlcnMgaW4gU1RSSU5HIHRoZSByZWdleHAKKyAgIGluIEJVRkZFUiBtYXRjaGVkLCBzdGFydGluZyBhdCBwb3NpdGlvbiBTVEFSVC4gICovCitleHRlcm4gaW50IHJlX21hdGNoIChzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgKl9fYnVmZmVyLCBjb25zdCBjaGFyICpfX3N0cmluZywKKwkJICAgICBpbnQgX19sZW5ndGgsIGludCBfX3N0YXJ0LCBzdHJ1Y3QgcmVfcmVnaXN0ZXJzICpfX3JlZ3MpOworCisKKy8qIFJlbGF0ZXMgdG8gYHJlX21hdGNoJyBhcyBgcmVfc2VhcmNoXzInIHJlbGF0ZXMgdG8gYHJlX3NlYXJjaCcuICAqLworZXh0ZXJuIGludCByZV9tYXRjaF8yIChzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgKl9fYnVmZmVyLAorCQkgICAgICAgY29uc3QgY2hhciAqX19zdHJpbmcxLCBpbnQgX19sZW5ndGgxLAorCQkgICAgICAgY29uc3QgY2hhciAqX19zdHJpbmcyLCBpbnQgX19sZW5ndGgyLCBpbnQgX19zdGFydCwKKwkJICAgICAgIHN0cnVjdCByZV9yZWdpc3RlcnMgKl9fcmVncywgaW50IF9fc3RvcCk7CisKKworLyogU2V0IFJFR1MgdG8gaG9sZCBOVU1fUkVHUyByZWdpc3RlcnMsIHN0b3JpbmcgdGhlbSBpbiBTVEFSVFMgYW5kCisgICBFTkRTLiAgU3Vic2VxdWVudCBtYXRjaGVzIHVzaW5nIEJVRkZFUiBhbmQgUkVHUyB3aWxsIHVzZSB0aGlzIG1lbW9yeQorICAgZm9yIHJlY29yZGluZyByZWdpc3RlciBpbmZvcm1hdGlvbi4gIFNUQVJUUyBhbmQgRU5EUyBtdXN0IGJlCisgICBhbGxvY2F0ZWQgd2l0aCBtYWxsb2MsIGFuZCBtdXN0IGVhY2ggYmUgYXQgbGVhc3QgYE5VTV9SRUdTICogc2l6ZW9mCisgICAocmVnb2ZmX3QpJyBieXRlcyBsb25nLgorCisgICBJZiBOVU1fUkVHUyA9PSAwLCB0aGVuIHN1YnNlcXVlbnQgbWF0Y2hlcyBzaG91bGQgYWxsb2NhdGUgdGhlaXIgb3duCisgICByZWdpc3RlciBkYXRhLgorCisgICBVbmxlc3MgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSBmaXJzdCBzZWFyY2ggb3IgbWF0Y2ggdXNpbmcKKyAgIFBBVFRFUk5fQlVGRkVSIHdpbGwgYWxsb2NhdGUgaXRzIG93biByZWdpc3RlciBkYXRhLCB3aXRob3V0CisgICBmcmVlaW5nIHRoZSBvbGQgZGF0YS4gICovCitleHRlcm4gdm9pZCByZV9zZXRfcmVnaXN0ZXJzIChzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgKl9fYnVmZmVyLAorCQkJICAgICAgc3RydWN0IHJlX3JlZ2lzdGVycyAqX19yZWdzLAorCQkJICAgICAgdW5zaWduZWQgaW50IF9fbnVtX3JlZ3MsCisJCQkgICAgICByZWdvZmZfdCAqX19zdGFydHMsIHJlZ29mZl90ICpfX2VuZHMpOworI2VuZGlmCS8qIFVzZSBHTlUgKi8KKworI2lmIGRlZmluZWQgX1JFR0VYX1JFX0NPTVAgfHwgKGRlZmluZWQgX0xJQkMgJiYgZGVmaW5lZCBfX1VTRV9CU0QpCisjIGlmbmRlZiBfQ1JBWQorLyogNC4yIGJzZCBjb21wYXRpYmlsaXR5LiAgKi8KK2V4dGVybiBjaGFyICpyZV9jb21wIChjb25zdCBjaGFyICopOworZXh0ZXJuIGludCByZV9leGVjIChjb25zdCBjaGFyICopOworIyBlbmRpZgorI2VuZGlmCisKKy8qIEdDQyAyLjk1IGFuZCBsYXRlciBoYXZlICJfX3Jlc3RyaWN0IjsgQzk5IGNvbXBpbGVycyBoYXZlCisgICAicmVzdHJpY3QiLCBhbmQgImNvbmZpZ3VyZSIgbWF5IGhhdmUgZGVmaW5lZCAicmVzdHJpY3QiLiAgKi8KKyNpZm5kZWYgX19yZXN0cmljdAorIyBpZiAhICgyIDwgX19HTlVDX18gfHwgKDIgPT0gX19HTlVDX18gJiYgOTUgPD0gX19HTlVDX01JTk9SX18pKQorIyAgaWYgZGVmaW5lZCByZXN0cmljdCB8fCAxOTk5MDFMIDw9IF9fU1REQ19WRVJTSU9OX18KKyMgICBkZWZpbmUgX19yZXN0cmljdCByZXN0cmljdAorIyAgZWxzZQorIyAgIGRlZmluZSBfX3Jlc3RyaWN0CisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisvKiBnY2MgMy4xIGFuZCB1cCBzdXBwb3J0IHRoZSBbcmVzdHJpY3RdIHN5bnRheC4gICovCisjaWZuZGVmIF9fcmVzdHJpY3RfYXJyCisjIGlmIChfX0dOVUNfXyA+IDMgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gMSkpIFwKKyAgICAgJiYgIWRlZmluZWQgX19HTlVHX18KKyMgIGRlZmluZSBfX3Jlc3RyaWN0X2FyciBfX3Jlc3RyaWN0CisjIGVsc2UKKyMgIGRlZmluZSBfX3Jlc3RyaWN0X2FycgorIyBlbmRpZgorI2VuZGlmCisKKy8qIFBPU0lYIGNvbXBhdGliaWxpdHkuICAqLworZXh0ZXJuIGludCByZWdjb21wIChyZWdleF90ICpfX3Jlc3RyaWN0IF9fcHJlZywKKwkJICAgIGNvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wYXR0ZXJuLAorCQkgICAgaW50IF9fY2ZsYWdzKTsKKworZXh0ZXJuIGludCByZWdleGVjIChjb25zdCByZWdleF90ICpfX3Jlc3RyaWN0IF9fcHJlZywKKwkJICAgIGNvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zdHJpbmcsIHNpemVfdCBfX25tYXRjaCwKKwkJICAgIHJlZ21hdGNoX3QgX19wbWF0Y2hbX19yZXN0cmljdF9hcnJdLAorCQkgICAgaW50IF9fZWZsYWdzKTsKKworZXh0ZXJuIHNpemVfdCByZWdlcnJvciAoaW50IF9fZXJyY29kZSwgY29uc3QgcmVnZXhfdCAqX19yZXN0cmljdCBfX3ByZWcsCisJCQljaGFyICpfX3Jlc3RyaWN0IF9fZXJyYnVmLCBzaXplX3QgX19lcnJidWZfc2l6ZSk7CisKK2V4dGVybiB2b2lkIHJlZ2ZyZWUgKHJlZ2V4X3QgKl9fcHJlZyk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYJLyogQysrICovCisKKyNlbmRpZiAvKiByZWdleC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JlZ2V4cC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9yZWdleHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTk3OWQyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9yZWdleHAuaApAQCAtMCwwICsxLDIyOCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDA0LCAyMDA4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9SRUdFWFBfSAorI2RlZmluZSBfUkVHRVhQX0gJMQorCisvKiBUaGUgY29udGVudHMgb2YgdGhpcyBoZWFkZXIgZmlsZSB3YXMgZmlyc3Qgc3RhbmRhcmRpemVkIGluIFgvT3BlbgorICAgU3lzdGVtIEludGVyZmFjZSBhbmQgSGVhZGVycyBJc3N1ZSAyLCBvcmlnaW5hbGx5IGNvbWluZyBmcm9tIFN5c1YuCisgICBJbiBpc3N1ZSA0LCB2ZXJzaW9uIDIsIGl0IGlzIG1hcmtlZCBhcyBUTyBCRSBXSVREUkFXTiwgYW5kIGl0IGhhcworICAgYmVlbiB3aXRoZHJhd24gaW4gU1VTdjMuCisKKyAgIFRoaXMgY29kZSBzaG91bGRuJ3QgYmUgdXNlZCBpbiBhbnkgbmV3bHkgd3JpdHRlbiBjb2RlLiAgSXQgaXMKKyAgIGluY2x1ZGVkIG9ubHkgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gIFVzZSB0aGUgUE9TSVggZGVmaW5pdGlvbgorICAgaW4gPHJlZ2V4Lmg+IGZvciBwb3J0YWJsZSBhcHBsaWNhdGlvbnMgYW5kIGEgcmVhc29uYWJsZSBpbnRlcmZhY2UuICAqLworCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNpbmNsdWRlIDxyZWdleC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKiBUaGUgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgaGVyZSBlbXVsYXRlcyB0aGUgbmVlZGVkIGZ1bmN0aW9uYWxpdHkKKyAgIGJ5IG1hcHBpbmcgdG8gdGhlIFBPU0lYIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVyLiAgVGhlIGludGVyZmFjZQorICAgZm9yIHRoZSBoZXJlIGluY2x1ZGVkIGZ1bmN0aW9uIGlzIHdlaXJkICh0aGlzIHJlYWxseSBpcyBhIGhhcm1sZXNzCisgICB3b3JkKS4KKworICAgVGhlIHVzZXIgaGFzIHRvIHByb3ZpZGUgc2l4IG1hY3JvcyBiZWZvcmUgdGhpcyBoZWFkZXIgZmlsZSBjYW4gYmUKKyAgIGluY2x1ZGVkOgorCisgICBJTklUCQlEZWNsYXJhdGlvbnMgdm9yIHZhcmlhYmxlcyB3aGljaCBjYW4gYmUgdXNlZCBieSB0aGUKKwkJb3RoZXIgbWFjcm9zLgorCisgICBHRVRDKCkJUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIHJlZ3VsYXIKKwkJZXhwcmVzc2lvbiBwYXR0ZXJuLiAgU3VjY2Vzc2l2ZSBjYWxscyBzaG91bGQgcmV0dXJuCisJCXN1Y2Nlc3NpdmUgY2hhcmFjdGVycy4KKworICAgUEVFS0MoKQlSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgcmVndWxhcgorCQlleHByZXNzaW9uIHBhdHRlcm4uICBJbW1lZGlhdGVseSBzdWNjZXNzaXZlIGNhbGxzIHRvCisJCVBFRUtDKCkgc2hvdWxkIHJldHVybiB0aGUgc2FtZSBjaGFyYWN0ZXIgd2hpY2ggc2hvdWxkCisJCWFsc28gYmUgdGhlIG5leHQgY2hhcmFjdGVyIHJldHVybmVkIGJ5IEdFVEMoKS4KKworICAgVU5HRVRDKGMpCUNhdXNlIGBjJyB0byBiZSByZXR1cm5lZCBieSB0aGUgbmV4dCBjYWxsIHRvIEdFVEMoKSBhbmQKKwkJUEVFS0MoKS4KKworICAgUkVUVVJOKHB0cikJVXNlZCBmb3Igbm9ybWFsIGV4aXQgb2YgdGhlIGBjb21waWxlJyBmdW5jdGlvbi4gIGBwdHInCisJCWlzIGEgcG9pbnRlciB0byB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciBvZgorCQl0aGUgY29tcGlsZWQgcmVndWxhciBleHByZXNzaW9uLgorCisgICBFUlJPUih2YWwpCVVzZWQgZm9yIGFibm9ybWFsIHJldHVybiBmcm9tIGBjb21waWxlJy4gIGB2YWwnIGlzIHRoZQorCQllcnJvciBudW1iZXIuICBUaGUgZXJyb3IgY29kZXMgYXJlOgorCQkxMQlSYW5nZSBlbmRwb2ludCB0b28gbGFyZ2UuCisJCTE2CUJhZCBudW1iZXIuCisJCTI1CVxkaWdpdCBvdXQgb2YgcmFuZ2UuCisJCTM2CUlsbGVnYWwgb3IgbWlzc2luZyBkZWxpbWl0ZXIuCisJCTQxCU5vIHJlbWVtYmVyZWQgc2VhcmNoIHN0cmluZy4KKwkJNDIJXCggXCkgaW1iYWxhbmNlLgorCQk0MwlUb28gbWFueSBcKC4KKwkJNDQJTW9yZSB0YW4gdHdvIG51bWJlcnMgZ2l2ZW4gaW4gXHsgXH0uCisJCTQ1CX0gZXhwZWN0ZWQgYWZ0ZXIgXC4KKwkJNDYJRmlyc3QgbnVtYmVyIGV4Y2VlZHMgc2Vjb25kIGluIFx7IFx9LgorCQk0OQlbIF0gaW1iYWxhbmNlLgorCQk1MAlSZWd1bGFyIGV4cHJlc3Npb24gb3ZlcmZsb3cuCisKKyAgKi8KKworX19CRUdJTl9ERUNMUworCisvKiBJbnRlcmZhY2UgdmFyaWFibGVzLiAgVGhleSBjb250YWluIHRoZSByZXN1bHRzIG9mIHRoZSBzdWNjZXNzZnVsCisgICBjYWxscyB0byBgc2V0cCcgYW5kIGBhZHZhbmNlJy4gICovCitleHRlcm4gY2hhciAqbG9jMTsKK2V4dGVybiBjaGFyICpsb2MyOworCisvKiBUaGUgdXNlIG9mIHRoaXMgdmFyaWFibGUgaW4gdGhlIGBhZHZhbmNlJyBmdW5jdGlvbiBpcyBub3QKKyAgIHN1cHBvcnRlZC4gICovCitleHRlcm4gY2hhciAqbG9jczsKKworCisjaWZuZGVmIF9fRE9fTk9UX0RFRklORV9DT01QSUxFCisvKiBHZXQgYW5kIGNvbXBpbGUgdGhlIHVzZXIgc3VwcGxpZWQgcGF0dGVybiB1cCB0byBlbmQgb2YgbGluZSBvcgorICAgc3RyaW5nIG9yIHVudGlsIEVPRiBpcyBzZWVuLCB3aGF0ZXZlciBoYXBwZW5zIGZpcnN0LiAgVGhlIHJlc3VsdCBpcworICAgcGxhY2VkIGluIHRoZSBidWZmZXIgc3RhcnRpbmcgYXQgRVhQQlVGIGFuZCBkZWxpbWl0ZWQgYnkgRU5EQlVGLgorCisgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBkZWZpbmVkIGluIHRoZSBsaWJjIGl0c2VsZiBzaW5jZSBpdCBkZXBlbmRzCisgICBvbiB0aGUgbWFjcm9zLiAgKi8KK2NoYXIgKgorY29tcGlsZSAoY2hhciAqX19yZXN0cmljdCBpbnN0cmluZywgY2hhciAqX19yZXN0cmljdCBleHBidWYsCisJIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBlbmRidWYsIGludCBlb2YpCit7CisgIGNoYXIgKl9faW5wdXRfYnVmZmVyID0gTlVMTDsKKyAgc2l6ZV90IF9faW5wdXRfc2l6ZSA9IDA7CisgIHNpemVfdCBfX2N1cnJlbnRfc2l6ZSA9IDA7CisgIGludCBfX2NoOworICBpbnQgX19lcnJvcjsKKyAgSU5JVAorCisgIC8qIEFsaWduIHRoZSBleHByZXNzaW9uIGJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhlIG5lZWRzIGZvciBhbiBvYmplY3QKKyAgICAgb2YgdHlwZSBgcmVnZXhfdCcuICBUaGVuIGNoZWNrIGZvciBtaW5pbXVtIHNpemUgb2YgdGhlIGJ1ZmZlciBmb3IKKyAgICAgdGhlIGNvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbi4gICovCisgIHJlZ2V4X3QgKl9fZXhwcl9wdHI7CisjIGlmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMgorICBjb25zdCBzaXplX3QgX19yZXEgPSBfX2FsaWdub2ZfXyAocmVnZXhfdCAqKTsKKyMgZWxzZQorICAvKiBIb3cgc2hhbGwgd2UgZmluZCBvdXQ/ICBXZSBzaW1wbHkgZ3Vlc3MgaXQgYW5kIGNhbiBjaGFuZ2UgaXQgaXMKKyAgICAgdGhpcyByZWFsbHkgcHJvb2ZzIHRvIGJlIHdyb25nLiAgKi8KKyAgY29uc3Qgc2l6ZV90IF9fcmVxID0gODsKKyMgZW5kaWYKKyAgZXhwYnVmICs9IF9fcmVxOworICBleHBidWYgLT0gKGV4cGJ1ZiAtICgoY2hhciAqKSAwKSkgJSBfX3JlcTsKKyAgaWYgKGVuZGJ1ZiA8IGV4cGJ1ZiArIHNpemVvZiAocmVnZXhfdCkpCisgICAgeworICAgICAgRVJST1IgKDUwKTsKKyAgICB9CisgIF9fZXhwcl9wdHIgPSAocmVnZXhfdCAqKSBleHBidWY7CisgIC8qIFRoZSByZW1haW5pbmcgc3BhY2UgaW4gdGhlIGJ1ZmZlciBjYW4gYmUgdXNlZCBmb3IgdGhlIGNvbXBpbGVkCisgICAgIHBhdHRlcm4uICAqLworICBfX2V4cHJfcHRyLT5fX1JFUEJfUFJFRklYIChidWZmZXIpID0gZXhwYnVmICsgc2l6ZW9mIChyZWdleF90KTsKKyAgX19leHByX3B0ci0+X19SRVBCX1BSRUZJWCAoYWxsb2NhdGVkKQorICAgID0gZW5kYnVmIC0gKGNoYXIgKikgX19leHByX3B0ci0+X19SRVBCX1BSRUZJWCAoYnVmZmVyKTsKKworICB3aGlsZSAoKF9fY2ggPSAoR0VUQyAoKSkpICE9IGVvZikKKyAgICB7CisgICAgICBpZiAoX19jaCA9PSAnXDAnIHx8IF9fY2ggPT0gJ1xuJykKKwl7CisJICBVTkdFVEMgKF9fY2gpOworCSAgYnJlYWs7CisJfQorCisgICAgICBpZiAoX19jdXJyZW50X3NpemUgKyAxID49IF9faW5wdXRfc2l6ZSkKKwl7CisJICBzaXplX3QgX19uZXdfc2l6ZSA9IF9faW5wdXRfc2l6ZSA/IDIgKiBfX2lucHV0X3NpemUgOiAxMjg7CisJICBjaGFyICpfX25ld19yb29tID0gKGNoYXIgKikgYWxsb2NhIChfX25ld19zaXplKTsKKwkgIC8qIFNlZSB3aGV0aGVyIHdlIGNhbiB1c2UgdGhlIG9sZCBidWZmZXIuICAqLworCSAgaWYgKF9fbmV3X3Jvb20gKyBfX25ld19zaXplID09IF9faW5wdXRfYnVmZmVyKQorCSAgICB7CisJICAgICAgX19pbnB1dF9zaXplICs9IF9fbmV3X3NpemU7CisJICAgICAgX19pbnB1dF9idWZmZXIgPSAoY2hhciAqKSBtZW1jcHkgKF9fbmV3X3Jvb20sIF9faW5wdXRfYnVmZmVyLAorCQkJCQkgICAgICAgX19jdXJyZW50X3NpemUpOworCSAgICB9CisJICBlbHNlIGlmIChfX2lucHV0X2J1ZmZlciArIF9faW5wdXRfc2l6ZSA9PSBfX25ld19yb29tKQorCSAgICBfX2lucHV0X3NpemUgKz0gX19uZXdfc2l6ZTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9faW5wdXRfc2l6ZSA9IF9fbmV3X3NpemU7CisJICAgICAgX19pbnB1dF9idWZmZXIgPSAoY2hhciAqKSBtZW1jcHkgKF9fbmV3X3Jvb20sIF9faW5wdXRfYnVmZmVyLAorCQkJCQkJX19jdXJyZW50X3NpemUpOworCSAgICB9CisJfQorICAgICAgX19pbnB1dF9idWZmZXJbX19jdXJyZW50X3NpemUrK10gPSBfX2NoOworICAgIH0KKyAgaWYgKF9fY3VycmVudF9zaXplKQorICAgIF9faW5wdXRfYnVmZmVyW19fY3VycmVudF9zaXplKytdID0gJ1wwJzsKKyAgZWxzZQorICAgIF9faW5wdXRfYnVmZmVyID0gIiI7CisKKyAgLyogTm93IGNvbXBpbGUgdGhlIHBhdHRlcm4uICAqLworICBfX2Vycm9yID0gcmVnY29tcCAoX19leHByX3B0ciwgX19pbnB1dF9idWZmZXIsIFJFR19ORVdMSU5FKTsKKyAgaWYgKF9fZXJyb3IgIT0gMCkKKyAgICAvKiBPaCB3ZWxsLCB3ZSBoYXZlIHRvIHRyYW5zbGF0ZSBQT1NJWCBlcnJvciBjb2Rlcy4gICovCisgICAgc3dpdGNoIChfX2Vycm9yKQorICAgICAgeworICAgICAgY2FzZSBSRUdfQkFEUEFUOgorICAgICAgY2FzZSBSRUdfRUNPTExBVEU6CisgICAgICBjYXNlIFJFR19FQ1RZUEU6CisgICAgICBjYXNlIFJFR19FRVNDQVBFOgorICAgICAgY2FzZSBSRUdfQkFEUlBUOgorICAgICAgY2FzZSBSRUdfRUVORDoKKyAgICAgIGNhc2UgUkVHX0VSUEFSRU46CisgICAgICBkZWZhdWx0OgorCS8qIFRoZXJlIGlzIG5vIG1hdGNoaW5nIGVycm9yIGNvZGUuICAqLworCVJFVFVSTiAoMzYpOworICAgICAgY2FzZSBSRUdfRVNVQlJFRzoKKwlSRVRVUk4gKDI1KTsKKyAgICAgIGNhc2UgUkVHX0VCUkFDSzoKKwlSRVRVUk4gKDQ5KTsKKyAgICAgIGNhc2UgUkVHX0VQQVJFTjoKKwlSRVRVUk4gKDQyKTsKKyAgICAgIGNhc2UgUkVHX0VCUkFDRToKKwlSRVRVUk4gKDQ0KTsKKyAgICAgIGNhc2UgUkVHX0JBREJSOgorCVJFVFVSTiAoNDYpOworICAgICAgY2FzZSBSRUdfRVJBTkdFOgorCVJFVFVSTiAoMTEpOworICAgICAgY2FzZSBSRUdfRVNQQUNFOgorICAgICAgY2FzZSBSRUdfRVNJWkU6CisJRVJST1IgKDUwKTsKKyAgICAgIH0KKworICAvKiBFdmVyeXRoaW5nIGlzIG9rLiAgKi8KKyAgUkVUVVJOICgoY2hhciAqKSAoX19leHByX3B0ci0+X19SRVBCX1BSRUZJWCAoYnVmZmVyKQorCQkgICAgKyBfX2V4cHJfcHRyLT5fX1JFUEJfUFJFRklYICh1c2VkKSkpOworfQorI2VuZGlmCisKKworLyogRmluZCB0aGUgbmV4dCBtYXRjaCBpbiBTVFJJTkcuICBUaGUgY29tcGlsZWQgcmVndWxhciBleHByZXNzaW9uIGlzCisgICBmb3VuZCBpbiB0aGUgYnVmZmVyIHN0YXJ0aW5nIGF0IEVYUEJVRi4gIGBsb2MxJyB3aWxsIHJldHVybiB0aGUKKyAgIGZpcnN0IGNoYXJhY3RlciBtYXRjaGVkIGFuZCBgbG9jMicgcG9pbnRzIHRvIHRoZSBuZXh0IHVubWF0Y2hlZAorICAgY2hhcmFjdGVyLiAgKi8KK2V4dGVybiBpbnQgc3RlcCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3RyaW5nLAorCQkgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZXhwYnVmKSBfX1RIUk9XOworCisvKiBNYXRjaCB0aGUgYmVnaW5uaW5nIG9mIFNUUklORyB3aXRoIHRoZSBjb21waWxlZCByZWd1bGFyIGV4cHJlc3Npb24KKyAgIGluIEVYUEJVRi4gIElmIHRoZSBtYXRjaCBpcyBzdWNjZXNzZnVsIGBsb2MyJyB3aWxsIGNvbnRhaW4gdGhlCisgICBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgdW5tYXRjaGVkIGNoYXJhY3Rlci4gICovCitleHRlcm4gaW50IGFkdmFuY2UgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3N0cmluZywKKwkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2V4cGJ1ZikgX19USFJPVzsKKworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcmVnZXhwLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmVzb2x2LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3Jlc29sdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMTVhNzAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3Jlc29sdi5oCkBAIC0wLDAgKzEsMzg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTg3LCAxOTg5CisgKiAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5Ni0xOTk5IGJ5IEludGVybmV0IFNvZnR3YXJlIENvbnNvcnRpdW0uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBJTlRFUk5FVCBTT0ZUV0FSRSBDT05TT1JUSVVNIERJU0NMQUlNUworICogQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBJTlRFUk5FVCBTT0ZUV0FSRQorICogQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTCisgKiBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLgorICovCisKKy8qCisgKglAKCMpcmVzb2x2LmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKgkkQklORElkOiByZXNvbHYuaCx2IDguMzEgMjAwMC8wMy8zMCAyMDoxNjo1MCB2aXhpZSBFeHAgJAorICovCisKKyNpZm5kZWYgX1JFU09MVl9IXworCisvKiBUaGVzZSBoZWFkZXJzIGFyZSBuZWVkZWQgZm9yIHR5cGVzIHVzZWQgaW4gdGhlIGBzdHJ1Y3QgcmVzX3N0YXRlJworICAgZGVjbGFyYXRpb24uICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2lmbmRlZiBfX25lZWRfcmVzX3N0YXRlCisjIGRlZmluZSBfUkVTT0xWX0hfCisKKyMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjIGluY2x1ZGUgPHN5cy9jZGVmcy5oPgorIyBpbmNsdWRlIDxzdGRpby5oPgorIyBpbmNsdWRlIDxhcnBhL25hbWVzZXIuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9fcmVzX3N0YXRlX2RlZmluZWQKKyMgZGVmaW5lIF9fcmVzX3N0YXRlX2RlZmluZWQKKwordHlwZWRlZiBlbnVtIHsgcmVzX2dvYWhlYWQsIHJlc19uZXh0bnMsIHJlc19tb2RpZmllZCwgcmVzX2RvbmUsIHJlc19lcnJvciB9CisJcmVzX3NlbmRob29rYWN0OworCit0eXBlZGVmIHJlc19zZW5kaG9va2FjdCAoKnJlc19zZW5kX3Fob29rKSAoc3RydWN0IHNvY2thZGRyX2luICogY29uc3QgKl9fbnMsCisJCQkJCSAgIGNvbnN0IHVfY2hhciAqKl9fcXVlcnksCisJCQkJCSAgIGludCAqX19xdWVyeWxlbiwKKwkJCQkJICAgdV9jaGFyICpfX2FucywKKwkJCQkJICAgaW50IF9fYW5zc2l6LAorCQkJCQkgICBpbnQgKl9fcmVzcGxlbik7CisKK3R5cGVkZWYgcmVzX3NlbmRob29rYWN0ICgqcmVzX3NlbmRfcmhvb2spIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKl9fbnMsCisJCQkJCSAgIGNvbnN0IHVfY2hhciAqX19xdWVyeSwKKwkJCQkJICAgaW50IF9fcXVlcnlsZW4sCisJCQkJCSAgIHVfY2hhciAqX19hbnMsCisJCQkJCSAgIGludCBfX2Fuc3NpeiwKKwkJCQkJICAgaW50ICpfX3Jlc3BsZW4pOworCisvKgorICogR2xvYmFsIGRlZmluZXMgYW5kIHZhcmlhYmxlcyBmb3IgcmVzb2x2ZXIgc3R1Yi4KKyAqLworIyBkZWZpbmUgTUFYTlMJCQkzCS8qIG1heCAjIG5hbWUgc2VydmVycyB3ZSdsbCB0cmFjayAqLworIyBkZWZpbmUgTUFYREZMU1JDSAkJMwkvKiAjIGRlZmF1bHQgZG9tYWluIGxldmVscyB0byB0cnkgKi8KKyMgZGVmaW5lIE1BWEROU1JDSAkJNgkvKiBtYXggIyBkb21haW5zIGluIHNlYXJjaCBwYXRoICovCisjIGRlZmluZSBMT0NBTERPTUFJTlBBUlRTCTIJLyogbWluIGxldmVscyBpbiBuYW1lIHRoYXQgaXMgImxvY2FsIiAqLworCisjIGRlZmluZSBSRVNfVElNRU9VVAkJNQkvKiBtaW4uIHNlY29uZHMgYmV0d2VlbiByZXRyaWVzICovCisjIGRlZmluZSBNQVhSRVNPTFZTT1JUCQkxMAkvKiBudW1iZXIgb2YgbmV0IHRvIHNvcnQgb24gKi8KKyMgZGVmaW5lIFJFU19NQVhORE9UUwkJMTUJLyogc2hvdWxkIHJlZmxlY3QgYml0IGZpZWxkIHNpemUgKi8KKyMgZGVmaW5lIFJFU19NQVhSRVRSQU5TCQkzMAkvKiBvbmx5IGZvciByZXNvbHYuY29uZi9SRVNfT1BUSU9OUyAqLworIyBkZWZpbmUgUkVTX01BWFJFVFJZCQk1CS8qIG9ubHkgZm9yIHJlc29sdi5jb25mL1JFU19PUFRJT05TICovCisjIGRlZmluZSBSRVNfREZMUkVUUlkJCTIJLyogRGVmYXVsdCAjL3RyaWVzLiAqLworIyBkZWZpbmUgUkVTX01BWFRJTUUJCTY1NTM1CS8qIEluZmluaXR5LCBpbiBtaWxsaXNlY29uZHMuICovCisKK3N0cnVjdCBfX3Jlc19zdGF0ZSB7CisJaW50CXJldHJhbnM7CQkvKiByZXRyYW5zbWl0aW9uIHRpbWUgaW50ZXJ2YWwgKi8KKwlpbnQJcmV0cnk7CQkJLyogbnVtYmVyIG9mIHRpbWVzIHRvIHJldHJhbnNtaXQgKi8KKwl1X2xvbmcJb3B0aW9uczsJCS8qIG9wdGlvbiBmbGFncyAtIHNlZSBiZWxvdy4gKi8KKwlpbnQJbnNjb3VudDsJCS8qIG51bWJlciBvZiBuYW1lIHNlcnZlcnMgKi8KKwlzdHJ1Y3Qgc29ja2FkZHJfaW4KKwkJbnNhZGRyX2xpc3RbTUFYTlNdOwkvKiBhZGRyZXNzIG9mIG5hbWUgc2VydmVyICovCisjIGRlZmluZSBuc2FkZHIJbnNhZGRyX2xpc3RbMF0JCS8qIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisJdV9zaG9ydAlpZDsJCQkvKiBjdXJyZW50IG1lc3NhZ2UgaWQgKi8KKwkvKiAyIGJ5dGUgaG9sZSBoZXJlLiAgKi8KKwljaGFyCSpkbnNyY2hbTUFYRE5TUkNIKzFdOwkvKiBjb21wb25lbnRzIG9mIGRvbWFpbiB0byBzZWFyY2ggKi8KKwljaGFyCWRlZmRuYW1lWzI1Nl07CQkvKiBkZWZhdWx0IGRvbWFpbiAoZGVwcmVjYXRlZCkgKi8KKwl1X2xvbmcJcGZjb2RlOwkJCS8qIFJFU19QUkZfIGZsYWdzIC0gc2VlIGJlbG93LiAqLworCXVuc2lnbmVkIG5kb3RzOjQ7CQkvKiB0aHJlc2hvbGQgZm9yIGluaXRpYWwgYWJzLiBxdWVyeSAqLworCXVuc2lnbmVkIG5zb3J0OjQ7CQkvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gc29ydF9saXN0W10gKi8KKwl1bnNpZ25lZCBpcHY2X3VuYXZhaWw6MTsJLyogY29ubmVjdGluZyB0byBJUHY2IHNlcnZlciBmYWlsZWQgKi8KKwl1bnNpZ25lZCB1bnVzZWQ6MjM7CisJc3RydWN0IHsKKwkJc3RydWN0IGluX2FkZHIJYWRkcjsKKwkJdV9pbnQzMl90CW1hc2s7CisJfSBzb3J0X2xpc3RbTUFYUkVTT0xWU09SVF07CisJLyogNCBieXRlIGhvbGUgaGVyZSBvbiA2NC1iaXQgYXJjaGl0ZWN0dXJlcy4gICovCisJcmVzX3NlbmRfcWhvb2sgcWhvb2s7CQkvKiBxdWVyeSBob29rICovCisJcmVzX3NlbmRfcmhvb2sgcmhvb2s7CQkvKiByZXNwb25zZSBob29rICovCisJaW50CXJlc19oX2Vycm5vOwkJLyogbGFzdCBvbmUgc2V0IGZvciB0aGlzIGNvbnRleHQgKi8KKwlpbnQJX3Zjc29jazsJCS8qIFBSSVZBVEU6IGZvciByZXNfc2VuZCBWQyBpL28gKi8KKwl1X2ludAlfZmxhZ3M7CQkJLyogUFJJVkFURTogc2VlIGJlbG93ICovCisJLyogNCBieXRlIGhvbGUgaGVyZSBvbiA2NC1iaXQgYXJjaGl0ZWN0dXJlcy4gICovCisJdW5pb24geworCQljaGFyCXBhZFs1Ml07CS8qIE9uIGFuIGkzODYgdGhpcyBtZWFucyA1MTJiIHRvdGFsLiAqLworCQlzdHJ1Y3QgeworCQkJdV9pbnQxNl90CQluc2NvdW50OworCQkJdV9pbnQxNl90CQluc21hcFtNQVhOU107CisJCQlpbnQJCQluc3NvY2tzW01BWE5TXTsKKwkJCXVfaW50MTZfdAkJbnNjb3VudDY7CisJCQl1X2ludDE2X3QJCW5zaW5pdDsKKwkJCXN0cnVjdCBzb2NrYWRkcl9pbjYJKm5zYWRkcnNbTUFYTlNdOworI2lmZGVmIF9MSUJDCisJCQl1bnNpZ25lZCBsb25nIGxvbmcgaW50CWluaXRzdGFtcAorCQkJICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKyNlbHNlCisJCQl1bnNpZ25lZCBpbnQJCV9pbml0c3RhbXBbMl07CisjZW5kaWYKKwkJfSBfZXh0OworCX0gX3U7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfX3Jlc19zdGF0ZSAqcmVzX3N0YXRlOworIyB1bmRlZiBfX25lZWRfcmVzX3N0YXRlCisjZW5kaWYKKworI2lmZGVmIF9SRVNPTFZfSF8KKy8qCisgKiBSZXZpc2lvbiBpbmZvcm1hdGlvbi4gIFRoaXMgaXMgdGhlIHJlbGVhc2UgZGF0ZSBpbiBZWVlZTU1ERCBmb3JtYXQuCisgKiBJdCBjYW4gY2hhbmdlIGV2ZXJ5IGRheSBzbyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gd2l0aCBpdCBpcyB1c2UgaXQKKyAqIGluIHByZXByb2Nlc3NvciBjb21tYW5kcyBzdWNoIGFzICIjaWYgKF9fUkVTID4gMTk5MzExMDQpIi4gIERvIG5vdAorICogY29tcGFyZSBmb3IgZXF1YWxpdHk7IHJhdGhlciwgdXNlIGl0IHRvIGRldGVybWluZSB3aGV0aGVyIHlvdXIgcmVzb2x2ZXIKKyAqIGlzIG5ldyBlbm91Z2ggdG8gY29udGFpbiBhIGNlcnRhaW4gZmVhdHVyZS4KKyAqLworCisjZGVmaW5lCV9fUkVTCTE5OTkxMDA2CisKKy8qCisgKiBSZXNvbHZlciBjb25maWd1cmF0aW9uIGZpbGUuCisgKiBOb3JtYWxseSBub3QgcHJlc2VudCwgYnV0IG1heSBjb250YWluIHRoZSBhZGRyZXNzIG9mIHRoZQorICogaW5pdGFsIG5hbWUgc2VydmVyKHMpIHRvIHF1ZXJ5IGFuZCB0aGUgZG9tYWluIHNlYXJjaCBsaXN0LgorICovCisKKyNpZm5kZWYgX1BBVEhfUkVTQ09ORgorI2RlZmluZSBfUEFUSF9SRVNDT05GICAgICAgICAiL2V0Yy9yZXNvbHYuY29uZiIKKyNlbmRpZgorCitzdHJ1Y3QgcmVzX3N5bSB7CisJaW50CW51bWJlcjsJCS8qIElkZW50aWZ5aW5nIG51bWJlciwgbGlrZSBUX01YICovCisJY2hhciAqCW5hbWU7CQkvKiBJdHMgc3ltYm9saWMgbmFtZSwgbGlrZSAiTVgiICovCisJY2hhciAqCWh1bWFubmFtZTsJLyogSXRzIGZ1biBuYW1lLCBsaWtlICJtYWlsIGV4Y2hhbmdlciIgKi8KK307CisKKy8qCisgKiBSZXNvbHZlciBmbGFncyAodXNlZCB0byBiZSBkaXNjcmV0ZSBwZXItbW9kdWxlIHN0YXRpY3MgaW50cykuCisgKi8KKyNkZWZpbmUJUkVTX0ZfVkMJMHgwMDAwMDAwMQkvKiBzb2NrZXQgaXMgVENQICovCisjZGVmaW5lCVJFU19GX0NPTk4JMHgwMDAwMDAwMgkvKiBzb2NrZXQgaXMgY29ubmVjdGVkICovCisjZGVmaW5lIFJFU19GX0VETlMwRVJSCTB4MDAwMDAwMDQJLyogRUROUzAgY2F1c2VkIGVycm9ycyAqLworCisvKiByZXNfZmluZHpvbmVjdXQoKSBvcHRpb25zICovCisjZGVmaW5lCVJFU19FWEhBVVNUSVZFCTB4MDAwMDAwMDEJLyogYWx3YXlzIGRvIGFsbCBxdWVyaWVzICovCisKKy8qCisgKiBSZXNvbHZlciBvcHRpb25zIChrZWVwIHRoZXNlIGluIHN5bmNoIHdpdGggcmVzX2RlYnVnLmMsIHBsZWFzZSkKKyAqLworI2RlZmluZSBSRVNfSU5JVAkweDAwMDAwMDAxCS8qIGFkZHJlc3MgaW5pdGlhbGl6ZWQgKi8KKyNkZWZpbmUgUkVTX0RFQlVHCTB4MDAwMDAwMDIJLyogcHJpbnQgZGVidWcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgUkVTX0FBT05MWQkweDAwMDAwMDA0CS8qIGF1dGhvcml0YXRpdmUgYW5zd2VycyBvbmx5ICghSU1QTCkqLworI2RlZmluZSBSRVNfVVNFVkMJMHgwMDAwMDAwOAkvKiB1c2UgdmlydHVhbCBjaXJjdWl0ICovCisjZGVmaW5lIFJFU19QUklNQVJZCTB4MDAwMDAwMTAJLyogcXVlcnkgcHJpbWFyeSBzZXJ2ZXIgb25seSAoIUlNUEwpICovCisjZGVmaW5lIFJFU19JR05UQwkweDAwMDAwMDIwCS8qIGlnbm9yZSB0cnVjYXRpb24gZXJyb3JzICovCisjZGVmaW5lIFJFU19SRUNVUlNFCTB4MDAwMDAwNDAJLyogcmVjdXJzaW9uIGRlc2lyZWQgKi8KKyNkZWZpbmUgUkVTX0RFRk5BTUVTCTB4MDAwMDAwODAJLyogdXNlIGRlZmF1bHQgZG9tYWluIG5hbWUgKi8KKyNkZWZpbmUgUkVTX1NUQVlPUEVOCTB4MDAwMDAxMDAJLyogS2VlcCBUQ1Agc29ja2V0IG9wZW4gKi8KKyNkZWZpbmUgUkVTX0ROU1JDSAkweDAwMDAwMjAwCS8qIHNlYXJjaCB1cCBsb2NhbCBkb21haW4gdHJlZSAqLworI2RlZmluZQlSRVNfSU5TRUNVUkUxCTB4MDAwMDA0MDAJLyogdHlwZSAxIHNlY3VyaXR5IGRpc2FibGVkICovCisjZGVmaW5lCVJFU19JTlNFQ1VSRTIJMHgwMDAwMDgwMAkvKiB0eXBlIDIgc2VjdXJpdHkgZGlzYWJsZWQgKi8KKyNkZWZpbmUJUkVTX05PQUxJQVNFUwkweDAwMDAxMDAwCS8qIHNodXRzIG9mZiBIT1NUQUxJQVNFUyBmZWF0dXJlICovCisjZGVmaW5lCVJFU19VU0VfSU5FVDYJMHgwMDAwMjAwMAkvKiB1c2UvbWFwIElQdjYgaW4gZ2V0aG9zdGJ5bmFtZSgpICovCisjZGVmaW5lIFJFU19ST1RBVEUJMHgwMDAwNDAwMAkvKiByb3RhdGUgbnMgbGlzdCBhZnRlciBlYWNoIHF1ZXJ5ICovCisjZGVmaW5lCVJFU19OT0NIRUNLTkFNRQkweDAwMDA4MDAwCS8qIGRvIG5vdCBjaGVjayBuYW1lcyBmb3Igc2FuaXR5LiAqLworI2RlZmluZQlSRVNfS0VFUFRTSUcJMHgwMDAxMDAwMAkvKiBkbyBub3Qgc3RyaXAgVFNJRyByZWNvcmRzICovCisjZGVmaW5lCVJFU19CTEFTVAkweDAwMDIwMDAwCS8qIGJsYXN0IGFsbCByZWN1cnNpdmUgc2VydmVycyAqLworI2RlZmluZSBSRVNfVVNFQlNUUklORwkweDAwMDQwMDAwCS8qIElQdjYgcmV2ZXJzZSBsb29rdXAgd2l0aCBieXRlCisJCQkJCSAgIHN0cmluZ3MgKi8KKyNkZWZpbmUgUkVTX05PSVA2RE9USU5UCTB4MDAwODAwMDAJLyogRG8gbm90IHVzZSAuaXA2LmludCBpbiBJUHY2CisJCQkJCSAgIHJldmVyc2UgbG9va3VwICovCisjZGVmaW5lIFJFU19VU0VfRUROUzAJMHgwMDEwMDAwMAkvKiBVc2UgRUROUzAuICAqLworI2RlZmluZSBSRVNfU05HTEtVUAkweDAwMjAwMDAwCS8qIG9uZSBvdXRzdGFuZGluZyByZXF1ZXN0IGF0IGEgdGltZSAqLworI2RlZmluZSBSRVNfU05HTEtVUFJFT1AJMHgwMDQwMDAwMAkvKiAtIi0sIGJ1dCBvcGVuIG5ldyBzb2NrZXQgZm9yIGVhY2gKKwkJCQkJICAgcmVxdWVzdCAqLworI2RlZmluZSBSRVNfVVNFX0ROU1NFQwkweDAwODAwMDAwCS8qIHVzZSBETlNTRUMgdXNpbmcgT0sgYml0IGluIE9QVCAqLworI2RlZmluZSBSRVNfTk9UTERRVUVSWQkweDAxMDAwMDAwCS8qIERvIG5vdCBsb29rIHVwIHVucXVhbGlmaWVkIG5hbWUKKwkJCQkJICAgYXMgYSBUTEQuICAqLworCisjZGVmaW5lIFJFU19ERUZBVUxUCShSRVNfUkVDVVJTRXxSRVNfREVGTkFNRVN8UkVTX0ROU1JDSHxSRVNfTk9JUDZET1RJTlQpCisKKy8qCisgKiBSZXNvbHZlciAicGZjb2RlIiB2YWx1ZXMuICBVc2VkIGJ5IGRpZy4KKyAqLworI2RlZmluZSBSRVNfUFJGX1NUQVRTCTB4MDAwMDAwMDEKKyNkZWZpbmUgUkVTX1BSRl9VUERBVEUJMHgwMDAwMDAwMgorI2RlZmluZSBSRVNfUFJGX0NMQVNTICAgMHgwMDAwMDAwNAorI2RlZmluZSBSRVNfUFJGX0NNRAkweDAwMDAwMDA4CisjZGVmaW5lIFJFU19QUkZfUVVFUwkweDAwMDAwMDEwCisjZGVmaW5lIFJFU19QUkZfQU5TCTB4MDAwMDAwMjAKKyNkZWZpbmUgUkVTX1BSRl9BVVRICTB4MDAwMDAwNDAKKyNkZWZpbmUgUkVTX1BSRl9BREQJMHgwMDAwMDA4MAorI2RlZmluZSBSRVNfUFJGX0hFQUQxCTB4MDAwMDAxMDAKKyNkZWZpbmUgUkVTX1BSRl9IRUFEMgkweDAwMDAwMjAwCisjZGVmaW5lIFJFU19QUkZfVFRMSUQJMHgwMDAwMDQwMAorI2RlZmluZSBSRVNfUFJGX0hFQURYCTB4MDAwMDA4MDAKKyNkZWZpbmUgUkVTX1BSRl9RVUVSWQkweDAwMDAxMDAwCisjZGVmaW5lIFJFU19QUkZfUkVQTFkJMHgwMDAwMjAwMAorI2RlZmluZSBSRVNfUFJGX0lOSVQJMHgwMDAwNDAwMAorLyoJCQkweDAwMDA4MDAwCSovCisKKy8qIFRoaW5ncyBpbnZvbHZpbmcgYW4gaW50ZXJuYWwgKHN0YXRpYykgcmVzb2x2ZXIgY29udGV4dC4gKi8KK19fQkVHSU5fREVDTFMKK2V4dGVybiBzdHJ1Y3QgX19yZXNfc3RhdGUgKl9fcmVzX3N0YXRlKHZvaWQpIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKK19fRU5EX0RFQ0xTCisjZGVmaW5lIF9yZXMgKCpfX3Jlc19zdGF0ZSgpKQorCisjaWZuZGVmIF9fQklORF9OT1NUQVRJQworI2RlZmluZSBmcF9ucXVlcnkJCV9fZnBfbnF1ZXJ5CisjZGVmaW5lIGZwX3F1ZXJ5CQlfX2ZwX3F1ZXJ5CisjZGVmaW5lIGhvc3RhbGlhcwkJX19ob3N0YWxpYXMKKyNkZWZpbmUgcF9xdWVyeQkJCV9fcF9xdWVyeQorI2RlZmluZSByZXNfY2xvc2UJCV9fcmVzX2Nsb3NlCisjZGVmaW5lIHJlc19pbml0CQlfX3Jlc19pbml0CisjZGVmaW5lIHJlc19pc291cnNlcnZlcgkJX19yZXNfaXNvdXJzZXJ2ZXIKKyNkZWZpbmUgcmVzX21rcXVlcnkJCV9fcmVzX21rcXVlcnkKKyNkZWZpbmUgcmVzX3F1ZXJ5CQlfX3Jlc19xdWVyeQorI2RlZmluZSByZXNfcXVlcnlkb21haW4JCV9fcmVzX3F1ZXJ5ZG9tYWluCisjZGVmaW5lIHJlc19zZWFyY2gJCV9fcmVzX3NlYXJjaAorI2RlZmluZSByZXNfc2VuZAkJX19yZXNfc2VuZAorCitfX0JFR0lOX0RFQ0xTCit2b2lkCQlmcF9ucXVlcnkgKGNvbnN0IHVfY2hhciAqLCBpbnQsIEZJTEUgKikgX19USFJPVzsKK3ZvaWQJCWZwX3F1ZXJ5IChjb25zdCB1X2NoYXIgKiwgRklMRSAqKSBfX1RIUk9XOworY29uc3QgY2hhciAqCWhvc3RhbGlhcyAoY29uc3QgY2hhciAqKSBfX1RIUk9XOwordm9pZAkJcF9xdWVyeSAoY29uc3QgdV9jaGFyICopIF9fVEhST1c7Cit2b2lkCQlyZXNfY2xvc2UgKHZvaWQpIF9fVEhST1c7CitpbnQJCXJlc19pbml0ICh2b2lkKSBfX1RIUk9XOworaW50CQlyZXNfaXNvdXJzZXJ2ZXIgKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBfX1RIUk9XOworaW50CQlyZXNfbWtxdWVyeSAoaW50LCBjb25zdCBjaGFyICosIGludCwgaW50LCBjb25zdCB1X2NoYXIgKiwKKwkJCSAgICAgaW50LCBjb25zdCB1X2NoYXIgKiwgdV9jaGFyICosIGludCkgX19USFJPVzsKK2ludAkJcmVzX3F1ZXJ5IChjb25zdCBjaGFyICosIGludCwgaW50LCB1X2NoYXIgKiwgaW50KSBfX1RIUk9XOworaW50CQlyZXNfcXVlcnlkb21haW4gKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQsIGludCwKKwkJCQkgdV9jaGFyICosIGludCkgX19USFJPVzsKK2ludAkJcmVzX3NlYXJjaCAoY29uc3QgY2hhciAqLCBpbnQsIGludCwgdV9jaGFyICosIGludCkgX19USFJPVzsKK2ludAkJcmVzX3NlbmQgKGNvbnN0IHVfY2hhciAqLCBpbnQsIHVfY2hhciAqLCBpbnQpIF9fVEhST1c7CitfX0VORF9ERUNMUworI2VuZGlmCisKKyNkZWZpbmUgYjY0X250b3AJCV9fYjY0X250b3AKKyNkZWZpbmUgYjY0X3B0b24JCV9fYjY0X3B0b24KKyNkZWZpbmUgZG5fY29tcAkJCV9fZG5fY29tcAorI2RlZmluZSBkbl9jb3VudF9sYWJlbHMJCV9fZG5fY291bnRfbGFiZWxzCisjZGVmaW5lIGRuX2V4cGFuZAkJX19kbl9leHBhbmQKKyNkZWZpbmUgZG5fc2tpcG5hbWUJCV9fZG5fc2tpcG5hbWUKKyNkZWZpbmUgZnBfcmVzc3RhdAkJX19mcF9yZXNzdGF0CisjZGVmaW5lIGxvY19hdG9uCQlfX2xvY19hdG9uCisjZGVmaW5lIGxvY19udG9hCQlfX2xvY19udG9hCisjZGVmaW5lIHBfY2RuYW1lCQlfX3BfY2RuYW1lCisjZGVmaW5lIHBfY2RubmFtZQkJX19wX2Nkbm5hbWUKKyNkZWZpbmUgcF9jbGFzcwkJCV9fcF9jbGFzcworI2RlZmluZSBwX2ZxbmFtZQkJX19wX2ZxbmFtZQorI2RlZmluZSBwX2Zxbm5hbWUJCV9fcF9mcW5uYW1lCisjZGVmaW5lIHBfb3B0aW9uCQlfX3Bfb3B0aW9uCisjZGVmaW5lIHBfc2Vjc3RvZGF0ZQkJX19wX3NlY3N0b2RhdGUKKyNkZWZpbmUgcF9zZWN0aW9uCQlfX3Bfc2VjdGlvbgorI2RlZmluZSBwX3RpbWUJCQlfX3BfdGltZQorI2RlZmluZSBwX3R5cGUJCQlfX3BfdHlwZQorI2RlZmluZSBwX3Jjb2RlCQkJX19wX3Jjb2RlCisjZGVmaW5lIHB1dGxvbmcJCQlfX3B1dGxvbmcKKyNkZWZpbmUgcHV0c2hvcnQJCV9fcHV0c2hvcnQKKyNkZWZpbmUgcmVzX2Rub2sJCV9fcmVzX2Rub2sKKyNkZWZpbmUgcmVzX2hub2sJCV9fcmVzX2hub2sKKyNkZWZpbmUgcmVzX2hvc3RhbGlhcwkJX19yZXNfaG9zdGFsaWFzCisjZGVmaW5lIHJlc19tYWlsb2sJCV9fcmVzX21haWxvaworI2RlZmluZSByZXNfbmFtZWlucXVlcnkJCV9fcmVzX25hbWVpbnF1ZXJ5CisjZGVmaW5lIHJlc19uY2xvc2UJCV9fcmVzX25jbG9zZQorI2RlZmluZSByZXNfbmluaXQJCV9fcmVzX25pbml0CisjZGVmaW5lIHJlc19ubWtxdWVyeQkJX19yZXNfbm1rcXVlcnkKKyNkZWZpbmUgcmVzX25wcXVlcnkJCV9fcmVzX25wcXVlcnkKKyNkZWZpbmUgcmVzX25xdWVyeQkJX19yZXNfbnF1ZXJ5CisjZGVmaW5lIHJlc19ucXVlcnlkb21haW4JX19yZXNfbnF1ZXJ5ZG9tYWluCisjZGVmaW5lIHJlc19uc2VhcmNoCQlfX3Jlc19uc2VhcmNoCisjZGVmaW5lIHJlc19uc2VuZAkJX19yZXNfbnNlbmQKKyNkZWZpbmUgcmVzX25pc291cnNlcnZlcglfX3Jlc19uaXNvdXJzZXJ2ZXIKKyNkZWZpbmUgcmVzX293bm9rCQlfX3Jlc19vd25vaworI2RlZmluZSByZXNfcXVlcmllc21hdGNoCV9fcmVzX3F1ZXJpZXNtYXRjaAorI2RlZmluZSByZXNfcmFuZG9taWQJCV9fcmVzX3JhbmRvbWlkCisjZGVmaW5lIHN5bV9udG9wCQlfX3N5bV9udG9wCisjZGVmaW5lIHN5bV9udG9zCQlfX3N5bV9udG9zCisjZGVmaW5lIHN5bV9zdG9uCQlfX3N5bV9zdG9uCitfX0JFR0lOX0RFQ0xTCitpbnQJCXJlc19obm9rIChjb25zdCBjaGFyICopIF9fVEhST1c7CitpbnQJCXJlc19vd25vayAoY29uc3QgY2hhciAqKSBfX1RIUk9XOworaW50CQlyZXNfbWFpbG9rIChjb25zdCBjaGFyICopIF9fVEhST1c7CitpbnQJCXJlc19kbm9rIChjb25zdCBjaGFyICopIF9fVEhST1c7CitpbnQJCXN5bV9zdG9uIChjb25zdCBzdHJ1Y3QgcmVzX3N5bSAqLCBjb25zdCBjaGFyICosIGludCAqKSBfX1RIUk9XOworY29uc3QgY2hhciAqCXN5bV9udG9zIChjb25zdCBzdHJ1Y3QgcmVzX3N5bSAqLCBpbnQsIGludCAqKSBfX1RIUk9XOworY29uc3QgY2hhciAqCXN5bV9udG9wIChjb25zdCBzdHJ1Y3QgcmVzX3N5bSAqLCBpbnQsIGludCAqKSBfX1RIUk9XOworaW50CQliNjRfbnRvcCAodV9jaGFyIGNvbnN0ICosIHNpemVfdCwgY2hhciAqLCBzaXplX3QpIF9fVEhST1c7CitpbnQJCWI2NF9wdG9uIChjaGFyIGNvbnN0ICosIHVfY2hhciAqLCBzaXplX3QpIF9fVEhST1c7CitpbnQJCWxvY19hdG9uIChjb25zdCBjaGFyICpfX2FzY2lpLCB1X2NoYXIgKl9fYmluYXJ5KSBfX1RIUk9XOworY29uc3QgY2hhciAqCWxvY19udG9hIChjb25zdCB1X2NoYXIgKl9fYmluYXJ5LCBjaGFyICpfX2FzY2lpKSBfX1RIUk9XOworaW50CQlkbl9za2lwbmFtZSAoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqKSBfX1RIUk9XOwordm9pZAkJcHV0bG9uZyAodV9pbnQzMl90LCB1X2NoYXIgKikgX19USFJPVzsKK3ZvaWQJCXB1dHNob3J0ICh1X2ludDE2X3QsIHVfY2hhciAqKSBfX1RIUk9XOworY29uc3QgY2hhciAqCXBfY2xhc3MgKGludCkgX19USFJPVzsKK2NvbnN0IGNoYXIgKglwX3RpbWUgKHVfaW50MzJfdCkgX19USFJPVzsKK2NvbnN0IGNoYXIgKglwX3R5cGUgKGludCkgX19USFJPVzsKK2NvbnN0IGNoYXIgKglwX3Jjb2RlIChpbnQpIF9fVEhST1c7Citjb25zdCB1X2NoYXIgKglwX2Nkbm5hbWUgKGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKiwgaW50LCBGSUxFICopCisgICAgIF9fVEhST1c7Citjb25zdCB1X2NoYXIgKglwX2NkbmFtZSAoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqLCBGSUxFICopIF9fVEhST1c7Citjb25zdCB1X2NoYXIgKglwX2Zxbm5hbWUgKGNvbnN0IHVfY2hhciAqX19jcCwgY29uc3QgdV9jaGFyICpfX21zZywKKwkJCSAgIGludCwgY2hhciAqLCBpbnQpIF9fVEhST1c7Citjb25zdCB1X2NoYXIgKglwX2ZxbmFtZSAoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqLCBGSUxFICopIF9fVEhST1c7Citjb25zdCBjaGFyICoJcF9vcHRpb24gKHVfbG9uZyBfX29wdGlvbikgX19USFJPVzsKK2NoYXIgKgkJcF9zZWNzdG9kYXRlICh1X2xvbmcpIF9fVEhST1c7CitpbnQJCWRuX2NvdW50X2xhYmVscyAoY29uc3QgY2hhciAqKSBfX1RIUk9XOworaW50CQlkbl9jb21wIChjb25zdCBjaGFyICosIHVfY2hhciAqLCBpbnQsIHVfY2hhciAqKiwgdV9jaGFyICoqKQorICAgICBfX1RIUk9XOworaW50CQlkbl9leHBhbmQgKGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICosCisJCQkgICBjaGFyICosIGludCkgX19USFJPVzsKK3VfaW50CQlyZXNfcmFuZG9taWQgKHZvaWQpIF9fVEhST1c7CitpbnQJCXJlc19uYW1laW5xdWVyeSAoY29uc3QgY2hhciAqLCBpbnQsIGludCwKKwkJCQkgY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqKSBfX1RIUk9XOworaW50CQlyZXNfcXVlcmllc21hdGNoIChjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICosCisJCQkJICBjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICopIF9fVEhST1c7Citjb25zdCBjaGFyICoJcF9zZWN0aW9uIChpbnQgX19zZWN0aW9uLCBpbnQgX19vcGNvZGUpIF9fVEhST1c7CisvKiBUaGluZ3MgaW52b2x2aW5nIGEgcmVzb2x2ZXIgY29udGV4dC4gKi8KK2ludAkJcmVzX25pbml0IChyZXNfc3RhdGUpIF9fVEhST1c7CitpbnQJCXJlc19uaXNvdXJzZXJ2ZXIgKGNvbnN0IHJlc19zdGF0ZSwKKwkJCQkgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBfX1RIUk9XOwordm9pZAkJZnBfcmVzc3RhdCAoY29uc3QgcmVzX3N0YXRlLCBGSUxFICopIF9fVEhST1c7Cit2b2lkCQlyZXNfbnBxdWVyeSAoY29uc3QgcmVzX3N0YXRlLCBjb25zdCB1X2NoYXIgKiwgaW50LCBGSUxFICopCisgICAgIF9fVEhST1c7Citjb25zdCBjaGFyICoJcmVzX2hvc3RhbGlhcyAoY29uc3QgcmVzX3N0YXRlLCBjb25zdCBjaGFyICosIGNoYXIgKiwgc2l6ZV90KQorICAgICBfX1RIUk9XOworaW50CQlyZXNfbnF1ZXJ5IChyZXNfc3RhdGUsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIHVfY2hhciAqLCBpbnQpCisgICAgIF9fVEhST1c7CitpbnQJCXJlc19uc2VhcmNoIChyZXNfc3RhdGUsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIHVfY2hhciAqLCBpbnQpCisgICAgIF9fVEhST1c7CitpbnQJCXJlc19ucXVlcnlkb21haW4gKHJlc19zdGF0ZSwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCwKKwkJCQkgIGludCwgdV9jaGFyICosIGludCkgX19USFJPVzsKK2ludAkJcmVzX25ta3F1ZXJ5IChyZXNfc3RhdGUsIGludCwgY29uc3QgY2hhciAqLCBpbnQsIGludCwKKwkJCSAgICAgIGNvbnN0IHVfY2hhciAqLCBpbnQsIGNvbnN0IHVfY2hhciAqLCB1X2NoYXIgKiwKKwkJCSAgICAgIGludCkgX19USFJPVzsKK2ludAkJcmVzX25zZW5kIChyZXNfc3RhdGUsIGNvbnN0IHVfY2hhciAqLCBpbnQsIHVfY2hhciAqLCBpbnQpCisgICAgIF9fVEhST1c7Cit2b2lkCQlyZXNfbmNsb3NlIChyZXNfc3RhdGUpIF9fVEhST1c7CitfX0VORF9ERUNMUworI2VuZGlmCisKKyNlbmRpZiAvKiAhX1JFU09MVl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvYXV0aC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvYXV0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYmVlNTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9hdXRoLmgKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBhdXRoLmgsIEF1dGhlbnRpY2F0aW9uIGludGVyZmFjZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBjb21wbGV0ZWx5IG9wYXF1ZSB0byB0aGUgY2xpZW50LiAgVGhlIGNsaWVudAorICogaXMgcmVxdWlyZWQgdG8gcGFzcyBhIEFVVEggKiB0byByb3V0aW5lcyB0aGF0IGNyZWF0ZSBycGMKKyAqICJzZXNzaW9ucyIuCisgKi8KKworI2lmbmRlZiBfUlBDX0FVVEhfSAorCisjZGVmaW5lIF9SUENfQVVUSF9ICTEKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHJwYy94ZHIuaD4KKworX19CRUdJTl9ERUNMUworCisjZGVmaW5lIE1BWF9BVVRIX0JZVEVTCTQwMAorI2RlZmluZSBNQVhORVROQU1FTEVOCTI1NQkvKiBtYXhpbXVtIGxlbmd0aCBvZiBuZXR3b3JrIHVzZXIncyBuYW1lICovCisKKy8qCisgKiBTdGF0dXMgcmV0dXJuZWQgZnJvbSBhdXRoZW50aWNhdGlvbiBjaGVjaworICovCitlbnVtIGF1dGhfc3RhdCB7CisJQVVUSF9PSz0wLAorCS8qCisJICogZmFpbGVkIGF0IHJlbW90ZSBlbmQKKwkgKi8KKwlBVVRIX0JBRENSRUQ9MSwJCQkvKiBib2d1cyBjcmVkZW50aWFscyAoc2VhbCBicm9rZW4pICovCisJQVVUSF9SRUpFQ1RFRENSRUQ9MiwJCS8qIGNsaWVudCBzaG91bGQgYmVnaW4gbmV3IHNlc3Npb24gKi8KKwlBVVRIX0JBRFZFUkY9MywJCQkvKiBib2d1cyB2ZXJpZmllciAoc2VhbCBicm9rZW4pICovCisJQVVUSF9SRUpFQ1RFRFZFUkY9NCwJCS8qIHZlcmlmaWVyIGV4cGlyZWQgb3Igd2FzIHJlcGxheWVkICovCisJQVVUSF9UT09XRUFLPTUsCQkJLyogcmVqZWN0ZWQgZHVlIHRvIHNlY3VyaXR5IHJlYXNvbnMgKi8KKwkvKgorCSAqIGZhaWxlZCBsb2NhbGx5CisJKi8KKwlBVVRIX0lOVkFMSURSRVNQPTYsCQkvKiBib2d1cyByZXNwb25zZSB2ZXJpZmllciAqLworCUFVVEhfRkFJTEVEPTcJCQkvKiBzb21lIHVua25vd24gcmVhc29uICovCit9OworCit1bmlvbiBkZXNfYmxvY2sgeworCXN0cnVjdCB7CisJCXVfaW50MzJfdCBoaWdoOworCQl1X2ludDMyX3QgbG93OworCX0ga2V5OworCWNoYXIgY1s4XTsKK307Cit0eXBlZGVmIHVuaW9uIGRlc19ibG9jayBkZXNfYmxvY2s7CitleHRlcm4gYm9vbF90IHhkcl9kZXNfYmxvY2sgKFhEUiAqX194ZHJzLCBkZXNfYmxvY2sgKl9fYmxrcCkgX19USFJPVzsKKworLyoKKyAqIEF1dGhlbnRpY2F0aW9uIGluZm8uICBPcGFxdWUgdG8gY2xpZW50LgorICovCitzdHJ1Y3Qgb3BhcXVlX2F1dGggeworCWVudW1fdAlvYV9mbGF2b3I7CQkvKiBmbGF2b3Igb2YgYXV0aCAqLworCWNhZGRyX3QJb2FfYmFzZTsJCS8qIGFkZHJlc3Mgb2YgbW9yZSBhdXRoIHN0dWZmICovCisJdV9pbnQJb2FfbGVuZ3RoOwkJLyogbm90IHRvIGV4Y2VlZCBNQVhfQVVUSF9CWVRFUyAqLworfTsKKworLyoKKyAqIEF1dGggaGFuZGxlLCBpbnRlcmZhY2UgdG8gY2xpZW50IHNpZGUgYXV0aGVudGljYXRvcnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFVVEggQVVUSDsKK3N0cnVjdCBBVVRIIHsKKyAgc3RydWN0IG9wYXF1ZV9hdXRoIGFoX2NyZWQ7CisgIHN0cnVjdCBvcGFxdWVfYXV0aCBhaF92ZXJmOworICB1bmlvbiBkZXNfYmxvY2sgYWhfa2V5OworICBzdHJ1Y3QgYXV0aF9vcHMgeworICAgIHZvaWQgKCphaF9uZXh0dmVyZikgKEFVVEggKik7CisgICAgaW50ICAoKmFoX21hcnNoYWwpIChBVVRIICosIFhEUiAqKTsJCS8qIG5leHR2ZXJmICYgc2VyaWFsaXplICovCisgICAgaW50ICAoKmFoX3ZhbGlkYXRlKSAoQVVUSCAqLCBzdHJ1Y3Qgb3BhcXVlX2F1dGggKik7CisJCQkJCQkvKiB2YWxpZGF0ZSB2ZXJpZmllciAqLworICAgIGludCAgKCphaF9yZWZyZXNoKSAoQVVUSCAqKTsJCS8qIHJlZnJlc2ggY3JlZGVudGlhbHMgKi8KKyAgICB2b2lkICgqYWhfZGVzdHJveSkgKEFVVEggKik7IAkgICAgCS8qIGRlc3Ryb3kgdGhpcyBzdHJ1Y3R1cmUgKi8KKyAgfSAqYWhfb3BzOworICBjYWRkcl90IGFoX3ByaXZhdGU7Cit9OworCisKKy8qCisgKiBBdXRoZW50aWNhdGlvbiBvcHMuCisgKiBUaGUgb3BzIGFuZCB0aGUgYXV0aCBoYW5kbGUgcHJvdmlkZSB0aGUgaW50ZXJmYWNlIHRvIHRoZSBhdXRoZW50aWNhdG9ycy4KKyAqCisgKiBBVVRICSphdXRoOworICogWERSCSp4ZHJzOworICogc3RydWN0IG9wYXF1ZV9hdXRoIHZlcmY7CisgKi8KKyNkZWZpbmUgQVVUSF9ORVhUVkVSRihhdXRoKQkJXAorCQkoKCooKGF1dGgpLT5haF9vcHMtPmFoX25leHR2ZXJmKSkoYXV0aCkpCisjZGVmaW5lIGF1dGhfbmV4dHZlcmYoYXV0aCkJCVwKKwkJKCgqKChhdXRoKS0+YWhfb3BzLT5haF9uZXh0dmVyZikpKGF1dGgpKQorCisjZGVmaW5lIEFVVEhfTUFSU0hBTEwoYXV0aCwgeGRycykJXAorCQkoKCooKGF1dGgpLT5haF9vcHMtPmFoX21hcnNoYWwpKShhdXRoLCB4ZHJzKSkKKyNkZWZpbmUgYXV0aF9tYXJzaGFsbChhdXRoLCB4ZHJzKQlcCisJCSgoKigoYXV0aCktPmFoX29wcy0+YWhfbWFyc2hhbCkpKGF1dGgsIHhkcnMpKQorCisjZGVmaW5lIEFVVEhfVkFMSURBVEUoYXV0aCwgdmVyZnApCVwKKwkJKCgqKChhdXRoKS0+YWhfb3BzLT5haF92YWxpZGF0ZSkpKChhdXRoKSwgdmVyZnApKQorI2RlZmluZSBhdXRoX3ZhbGlkYXRlKGF1dGgsIHZlcmZwKQlcCisJCSgoKigoYXV0aCktPmFoX29wcy0+YWhfdmFsaWRhdGUpKSgoYXV0aCksIHZlcmZwKSkKKworI2RlZmluZSBBVVRIX1JFRlJFU0goYXV0aCkJCVwKKwkJKCgqKChhdXRoKS0+YWhfb3BzLT5haF9yZWZyZXNoKSkoYXV0aCkpCisjZGVmaW5lIGF1dGhfcmVmcmVzaChhdXRoKQkJXAorCQkoKCooKGF1dGgpLT5haF9vcHMtPmFoX3JlZnJlc2gpKShhdXRoKSkKKworI2RlZmluZSBBVVRIX0RFU1RST1koYXV0aCkJCVwKKwkJKCgqKChhdXRoKS0+YWhfb3BzLT5haF9kZXN0cm95KSkoYXV0aCkpCisjZGVmaW5lIGF1dGhfZGVzdHJveShhdXRoKQkJXAorCQkoKCooKGF1dGgpLT5haF9vcHMtPmFoX2Rlc3Ryb3kpKShhdXRoKSkKKworCitleHRlcm4gc3RydWN0IG9wYXF1ZV9hdXRoIF9udWxsX2F1dGg7CisKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgdmFyaW91cyBpbXBsZW1lbnRhdGlvbnMgb2YgY2xpZW50IHNpZGUgYXV0aGVudGljYXRvcnMuCisgKi8KKworLyoKKyAqIFVuaXggc3R5bGUgYXV0aGVudGljYXRpb24KKyAqIEFVVEggKmF1dGh1bml4X2NyZWF0ZShtYWNobmFtZSwgdWlkLCBnaWQsIGxlbiwgYXVwX2dpZHMpCisgKgljaGFyICptYWNobmFtZTsKKyAqCWludCB1aWQ7CisgKglpbnQgZ2lkOworICoJaW50IGxlbjsKKyAqCWludCAqYXVwX2dpZHM7CisgKi8KK2V4dGVybiBBVVRIICphdXRodW5peF9jcmVhdGUgKGNoYXIgKl9fbWFjaG5hbWUsIF9fdWlkX3QgX191aWQsIF9fZ2lkX3QgX19naWQsCisJCQkgICAgICBpbnQgX19sZW4sIF9fZ2lkX3QgKl9fYXVwX2dpZHMpOworZXh0ZXJuIEFVVEggKmF1dGh1bml4X2NyZWF0ZV9kZWZhdWx0ICh2b2lkKTsKK2V4dGVybiBBVVRIICphdXRobm9uZV9jcmVhdGUgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gQVVUSCAqYXV0aGRlc19jcmVhdGUgKGNvbnN0IGNoYXIgKl9fc2VydmVybmFtZSwgdV9pbnQgX193aW5kb3csCisJCQkgICAgIHN0cnVjdCBzb2NrYWRkciAqX19zeW5jYWRkciwgZGVzX2Jsb2NrICpfX2NrZXkpCisgICAgIF9fVEhST1c7CitleHRlcm4gQVVUSCAqYXV0aGRlc19wa19jcmVhdGUgKGNvbnN0IGNoYXIgKiwgbmV0b2JqICosIHVfaW50LAorCQkJCXN0cnVjdCBzb2NrYWRkciAqLCBkZXNfYmxvY2sgKikgX19USFJPVzsKKworCisjZGVmaW5lIEFVVEhfTk9ORQkwCQkvKiBubyBhdXRoZW50aWNhdGlvbiAqLworI2RlZmluZQlBVVRIX05VTEwJMAkJLyogYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZQlBVVRIX1NZUwkxCQkvKiB1bml4IHN0eWxlICh1aWQsIGdpZHMpICovCisjZGVmaW5lCUFVVEhfVU5JWAlBVVRIX1NZUworI2RlZmluZQlBVVRIX1NIT1JUCTIJCS8qIHNob3J0IGhhbmQgdW5peCBzdHlsZSAqLworI2RlZmluZSBBVVRIX0RFUwkzCQkvKiBkZXMgc3R5bGUgKGVuY3J5cHRlZCB0aW1lc3RhbXBzKSAqLworI2RlZmluZSBBVVRIX0RICQlBVVRIX0RFUwkvKiBEaWZmaWUtSGVsbG1hbiAodGhpcyBpcyBERVMpICovCisjZGVmaW5lIEFVVEhfS0VSQiAgICAgICA0ICAgICAgICAgICAgICAgLyoga2VyYmVyb3Mgc3R5bGUgKi8KKworLyoKKyAqICBOZXRuYW1lIG1hbmlwdWxhdGluZyBmdW5jdGlvbnMKKyAqCisgKi8KK2V4dGVybiBpbnQgZ2V0bmV0bmFtZSAoY2hhciAqKSBfX1RIUk9XOworZXh0ZXJuIGludCBob3N0Mm5ldG5hbWUgKGNoYXIgKiwgX19jb25zdCBjaGFyICosIF9fY29uc3QgY2hhciAqKSBfX1RIUk9XOworZXh0ZXJuIGludCB1c2VyMm5ldG5hbWUgKGNoYXIgKiwgX19jb25zdCB1aWRfdCwgX19jb25zdCBjaGFyICopIF9fVEhST1c7CitleHRlcm4gaW50IG5ldG5hbWUydXNlciAoX19jb25zdCBjaGFyICosIHVpZF90ICosIGdpZF90ICosIGludCAqLCBnaWRfdCAqKQorICAgICBfX1RIUk9XOworZXh0ZXJuIGludCBuZXRuYW1lMmhvc3QgKF9fY29uc3QgY2hhciAqLCBjaGFyICosIF9fY29uc3QgaW50KSBfX1RIUk9XOworCisvKgorICoKKyAqIFRoZXNlIHJvdXRpbmVzIGludGVyZmFjZSB0byB0aGUga2V5c2VydiBkYWVtb24KKyAqCisgKi8KK2V4dGVybiBpbnQga2V5X2RlY3J5cHRzZXNzaW9uIChjaGFyICosIGRlc19ibG9jayAqKTsKK2V4dGVybiBpbnQga2V5X2RlY3J5cHRzZXNzaW9uX3BrIChjaGFyICosIG5ldG9iaiAqLCBkZXNfYmxvY2sgKik7CitleHRlcm4gaW50IGtleV9lbmNyeXB0c2Vzc2lvbiAoY2hhciAqLCBkZXNfYmxvY2sgKik7CitleHRlcm4gaW50IGtleV9lbmNyeXB0c2Vzc2lvbl9wayAoY2hhciAqLCBuZXRvYmogKiwgZGVzX2Jsb2NrICopOworZXh0ZXJuIGludCBrZXlfZ2VuZGVzIChkZXNfYmxvY2sgKik7CitleHRlcm4gaW50IGtleV9zZXRzZWNyZXQgKGNoYXIgKik7CitleHRlcm4gaW50IGtleV9zZWNyZXRrZXlfaXNfc2V0ICh2b2lkKTsKK2V4dGVybiBpbnQga2V5X2dldF9jb252IChjaGFyICosIGRlc19ibG9jayAqKTsKKworLyoKKyAqIFhEUiBhbiBvcGFxdWUgYXV0aGVudGljYXRpb24gc3RydWN0LgorICovCitleHRlcm4gYm9vbF90IHhkcl9vcGFxdWVfYXV0aCAoWERSICosIHN0cnVjdCBvcGFxdWVfYXV0aCAqKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcnBjL2F1dGguaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvYXV0aF9kZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL2F1dGhfZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJhZGE4NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL2F1dGhfZGVzLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfUlBDX0FVVEhfREVTX0gKKyNkZWZpbmUgX1JQQ19BVVRIX0RFU19ICTEKKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHJwYy9hdXRoLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogVGhlcmUgYXJlIHR3byBraW5kcyBvZiAibmFtZXMiOiBmdWxsbmFtZXMgYW5kIG5pY2tuYW1lcyAqLworZW51bSBhdXRoZGVzX25hbWVraW5kCisgIHsKKyAgICBBRE5fRlVMTE5BTUUsCisgICAgQUROX05JQ0tOQU1FCisgIH07CisKKy8qIEEgZnVsbG5hbWUgY29udGFpbnMgdGhlIG5ldHdvcmsgbmFtZSBvZiB0aGUgY2xpZW50LAorICAgYSBjb252ZXJzYXRpb24ga2V5IGFuZCB0aGUgd2luZG93ICovCitzdHJ1Y3QgYXV0aGRlc19mdWxsbmFtZQorICB7CisgICAgY2hhciAqbmFtZTsJCS8qIG5ldHdvcmsgbmFtZSBvZiBjbGllbnQsIHVwIHRvIE1BWE5FVE5BTUVMRU4gKi8KKyAgICBkZXNfYmxvY2sga2V5OwkvKiBjb252ZXJzYXRpb24ga2V5ICovCisgICAgdWludDMyX3Qgd2luZG93OwkvKiBhc3NvY2lhdGVkIHdpbmRvdyAqLworICB9OworCisvKiBBIGNyZWRlbnRpYWwgKi8KK3N0cnVjdCBhdXRoZGVzX2NyZWQKKyAgeworICAgIGVudW0gYXV0aGRlc19uYW1la2luZCBhZGNfbmFtZWtpbmQ7CisgICAgc3RydWN0IGF1dGhkZXNfZnVsbG5hbWUgYWRjX2Z1bGxuYW1lOworICAgIHVpbnQzMl90IGFkY19uaWNrbmFtZTsKKyAgfTsKKworLyogQSB0aW1ldmFsIHJlcGxhY2VtZW50IGZvciAhMzJiaXQgcGxhdGZvcm1zICovCitzdHJ1Y3QgcnBjX3RpbWV2YWwKKyAgeworICAgIHVpbnQzMl90IHR2X3NlYzsgICAgICAgICAgICAvKiBTZWNvbmRzLiAgKi8KKyAgICB1aW50MzJfdCB0dl91c2VjOyAgICAgICAgICAgLyogTWljcm9zZWNvbmRzLiAgKi8KKyAgfTsKKworLyogQSBkZXMgYXV0aGVudGljYXRpb24gdmVyaWZpZXIgKi8KK3N0cnVjdCBhdXRoZGVzX3ZlcmYKKyAgeworICAgIHVuaW9uCisgICAgICB7CisJc3RydWN0IHJwY190aW1ldmFsIGFkdl9jdGltZTsJLyogY2xlYXIgdGltZSAqLworCWRlc19ibG9jayBhZHZfeHRpbWU7CQkvKiBjcnlwdCB0aW1lICovCisgICAgICB9CisgICAgYWR2X3RpbWVfdTsKKyAgICB1aW50MzJfdCBhZHZfaW50X3U7CisgIH07CisKKy8qIGRlcyBhdXRoZW50aWNhdGlvbiB2ZXJpZmllcjogY2xpZW50IHZhcmlldHkKKworICAgYWR2X3RpbWVzdGFtcCBpcyB0aGUgY3VycmVudCB0aW1lLgorICAgYWR2X3dpbnZlcmYgaXMgdGhlIGNyZWRlbnRpYWwgd2luZG93ICsgMS4KKyAgIEJvdGggYXJlIGVuY3J5cHRlZCB1c2luZyB0aGUgY29udmVyc2F0aW9uIGtleS4gKi8KKyNkZWZpbmUgYWR2X3RpbWVzdGFtcCAgYWR2X3RpbWVfdS5hZHZfY3RpbWUKKyNkZWZpbmUgYWR2X3h0aW1lc3RhbXAgYWR2X3RpbWVfdS5hZHZfeHRpbWUKKyNkZWZpbmUgYWR2X3dpbnZlcmYgICAgYWR2X2ludF91CisKKy8qIGRlcyBhdXRoZW50aWNhdGlvbiB2ZXJpZmllcjogc2VydmVyIHZhcmlldHkKKworICAgYWR2X3RpbWV2ZXJmIGlzIHRoZSBjbGllbnQncyB0aW1lc3RhbXAgKyBjbGllbnQncyB3aW5kb3cKKyAgIGFkdl9uaWNrbmFtZSBpcyB0aGUgc2VydmVyJ3Mgbmlja25hbWUgZm9yIHRoZSBjbGllbnQuCisgICBhZHZfdGltZXZlcmYgaXMgZW5jcnlwdGVkIHVzaW5nIHRoZSBjb252ZXJzYXRpb24ga2V5LiAqLworI2RlZmluZSBhZHZfdGltZXZlcmYgICBhZHZfdGltZV91LmFkdl9jdGltZQorI2RlZmluZSBhZHZfeHRpbWV2ZXJmICBhZHZfdGltZV91LmFkdl94dGltZQorI2RlZmluZSBhZHZfbmlja25hbWUgICBhZHZfaW50X3UKKworLyogTWFwIGEgZGVzIGNyZWRlbnRpYWwgaW50byBhIHVuaXggY3JlZC4gKi8KK2V4dGVybiBpbnQgYXV0aGRlc19nZXR1Y3JlZCAoX19jb25zdCBzdHJ1Y3QgYXV0aGRlc19jcmVkICogX19hZGMsCisJCQkgICAgIHVpZF90ICogX191aWQsIGdpZF90ICogX19naWQsCisJCQkgICAgIHNob3J0ICpfX2dyb3VwbGVuLCBnaWRfdCAqIF9fZ3JvdXBzKSBfX1RIUk9XOworCisvKiBHZXQgdGhlIHB1YmxpYyBrZXkgZm9yIE5BTUUgYW5kIHBsYWNlIGl0IGluIEtFWS4gIE5BTUUgY2FuIG9ubHkgYmUKKyAgIHVwIHRvIE1BWE5FVE5BTUVMRU4gYnl0ZXMgbG9uZyBhbmQgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBLRVkgc2hvdWxkCisgICBoYXZlIEhFWEtFWUJZVEVTICsgMSBieXRlcyBsb25nIHRvIGZpdCBhbGwgY2hhcmFjdGVycyBmcm9tIHRoZSBrZXkuICAqLworZXh0ZXJuIGludCBnZXRwdWJsaWNrZXkgKF9fY29uc3QgY2hhciAqX19uYW1lLCBjaGFyICpfX2tleSkgX19USFJPVzsKKworLyogR2V0IHRoZSBzZWNyZXQga2V5IGZvciBOQU1FIGFuZCBwbGFjZSBpdCBpbiBLRVkuICBQQVNTV0QgaXMgdXNlZCB0bworICAgZGVjcnlwdCB0aGUgZW5jcnlwdGVkIGtleSBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLiAgTkFNRSBjYW4gb25seSBiZQorICAgdXAgdG8gTUFYTkVUTkFNRUxFTiBieXRlcyBsb25nIGFuZCB0aGUgZGVzdGluYXRpb24gYnVmZmVyIEtFWQorICAgc2hvdWxkIGhhdmUgSEVYS0VZQllURVMgKyAxIGJ5dGVzIGxvbmcgdG8gZml0IGFsbCBjaGFyYWN0ZXJzIGZyb20KKyAgIHRoZSBrZXkuICAqLworZXh0ZXJuIGludCBnZXRzZWNyZXRrZXkgKF9fY29uc3QgY2hhciAqX19uYW1lLCBjaGFyICpfX2tleSwKKwkJCSBfX2NvbnN0IGNoYXIgKl9fcGFzc3dkKSBfX1RIUk9XOworCitleHRlcm4gaW50IHJ0aW1lIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKl9fYWRkcnAsIHN0cnVjdCBycGNfdGltZXZhbCAqX190aW1lcCwKKwkJICBzdHJ1Y3QgcnBjX3RpbWV2YWwgKl9fdGltZW91dCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworCisjZW5kaWYgLyogcnBjL2F1dGhfZGVzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL2F1dGhfdW5peC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvYXV0aF91bml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY0ZWUxZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL2F1dGhfdW5peC5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBhdXRoX3VuaXguaCwgUHJvdG9jb2wgZm9yIFVOSVggc3R5bGUgYXV0aGVudGljYXRpb24gcGFyYW1ldGVycyBmb3IgUlBDCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFRoZSBzeXN0ZW0gaXMgdmVyeSB3ZWFrLiAgVGhlIGNsaWVudCB1c2VzIG5vIGVuY3J5cHRpb24gZm9yICBpdAorICogY3JlZGVudGlhbHMgYW5kIG9ubHkgc2VuZHMgbnVsbCB2ZXJpZmllcnMuICBUaGUgc2VydmVyIHNlbmRzIGJhY2tzCisgKiBudWxsIHZlcmlmaWVycyBvciBvcHRpb25hbGx5IGEgdmVyaWZpZXIgdGhhdCBzdWdnZXN0cyBhIG5ldyBzaG9ydCBoYW5kCisgKiBmb3IgdGhlIGNyZWRlbnRpYWxzLgorICovCisKKyNpZm5kZWYgX1JQQ19BVVRIX1VOSVhfSAorI2RlZmluZSBfUlBDX0FVVEhfVU5JWF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8cnBjL3R5cGVzLmg+CisjaW5jbHVkZSA8cnBjL2F1dGguaD4KKyNpbmNsdWRlIDxycGMveGRyLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogVGhlIG1hY2hpbmUgbmFtZSBpcyBwYXJ0IG9mIGEgY3JlZGVudGlhbDsgaXQgbWF5IG5vdCBleGNlZWQgMjU1IGJ5dGVzICovCisjZGVmaW5lIE1BWF9NQUNISU5FX05BTUUgMjU1CisKKy8qIGdpZHMgY29tcG9zZSBwYXJ0IG9mIGEgY3JlZGVudGlhbDsgdGhlcmUgbWF5IG5vdCBiZSBtb3JlIHRoYW4gMTYgb2YgdGhlbSAqLworI2RlZmluZSBOR1JQUyAxNgorCisvKgorICogVW5peCBzdHlsZSBjcmVkZW50aWFscy4KKyAqLworc3RydWN0IGF1dGh1bml4X3Bhcm1zCisgIHsKKyAgICB1X2xvbmcgYXVwX3RpbWU7CisgICAgY2hhciAqYXVwX21hY2huYW1lOworICAgIF9fdWlkX3QgYXVwX3VpZDsKKyAgICBfX2dpZF90IGF1cF9naWQ7CisgICAgdV9pbnQgYXVwX2xlbjsKKyAgICBfX2dpZF90ICphdXBfZ2lkczsKKyAgfTsKKworZXh0ZXJuIGJvb2xfdCB4ZHJfYXV0aHVuaXhfcGFybXMgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgYXV0aHVuaXhfcGFybXMgKl9fcCkKKyAgICAgX19USFJPVzsKKworLyoKKyAqIElmIGEgcmVzcG9uc2UgdmVyaWZpZXIgaGFzIGZsYXZvciBBVVRIX1NIT1JULAorICogdGhlbiB0aGUgYm9keSBvZiB0aGUgcmVzcG9uc2UgdmVyaWZpZXIgZW5jYXBzdWxhdGVzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOworICogYWdhaW4gaXQgaXMgc2VyaWFsaXplZCBpbiB0aGUgb2J2aW91cyBmYXNoaW9uLgorICovCitzdHJ1Y3Qgc2hvcnRfaGFuZF92ZXJmCisgIHsKKyAgICBzdHJ1Y3Qgb3BhcXVlX2F1dGggbmV3X2NyZWQ7CisgIH07CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBycGMvYXV0aF91bml4LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL2NsbnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL2NsbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTQyMjhjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvY2xudC5oCkBAIC0wLDAgKzEsNDE4IEBACisvKgorICogY2xudC5oIC0gQ2xpZW50IHNpZGUgcmVtb3RlIHByb2NlZHVyZSBjYWxsIGludGVyZmFjZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9SUENfQ0xOVF9ICisjZGVmaW5lIF9SUENfQ0xOVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8cnBjL3R5cGVzLmg+CisjaW5jbHVkZSA8cnBjL2F1dGguaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KKworX19CRUdJTl9ERUNMUworCisvKgorICogUnBjIGNhbGxzIHJldHVybiBhbiBlbnVtIGNsbnRfc3RhdC4gIFRoaXMgc2hvdWxkIGJlIGxvb2tlZCBhdCBtb3JlLAorICogc2luY2UgZWFjaCBpbXBsZW1lbnRhdGlvbiBpcyByZXF1aXJlZCB0byBsaXZlIHdpdGggdGhpcyAoaW1wbGVtZW50YXRpb24KKyAqIGluZGVwZW5kZW50KSBsaXN0IG9mIGVycm9ycy4KKyAqLworZW51bSBjbG50X3N0YXQgeworCVJQQ19TVUNDRVNTPTAsCQkJLyogY2FsbCBzdWNjZWVkZWQgKi8KKwkvKgorCSAqIGxvY2FsIGVycm9ycworCSAqLworCVJQQ19DQU5URU5DT0RFQVJHUz0xLAkJLyogY2FuJ3QgZW5jb2RlIGFyZ3VtZW50cyAqLworCVJQQ19DQU5UREVDT0RFUkVTPTIsCQkvKiBjYW4ndCBkZWNvZGUgcmVzdWx0cyAqLworCVJQQ19DQU5UU0VORD0zLAkJCS8qIGZhaWx1cmUgaW4gc2VuZGluZyBjYWxsICovCisJUlBDX0NBTlRSRUNWPTQsCQkJLyogZmFpbHVyZSBpbiByZWNlaXZpbmcgcmVzdWx0ICovCisJUlBDX1RJTUVET1VUPTUsCQkJLyogY2FsbCB0aW1lZCBvdXQgKi8KKwkvKgorCSAqIHJlbW90ZSBlcnJvcnMKKwkgKi8KKwlSUENfVkVSU01JU01BVENIPTYsCQkvKiBycGMgdmVyc2lvbnMgbm90IGNvbXBhdGlibGUgKi8KKwlSUENfQVVUSEVSUk9SPTcsCQkvKiBhdXRoZW50aWNhdGlvbiBlcnJvciAqLworCVJQQ19QUk9HVU5BVkFJTD04LAkJLyogcHJvZ3JhbSBub3QgYXZhaWxhYmxlICovCisJUlBDX1BST0dWRVJTTUlTTUFUQ0g9OSwJCS8qIHByb2dyYW0gdmVyc2lvbiBtaXNtYXRjaGVkICovCisJUlBDX1BST0NVTkFWQUlMPTEwLAkJLyogcHJvY2VkdXJlIHVuYXZhaWxhYmxlICovCisJUlBDX0NBTlRERUNPREVBUkdTPTExLAkJLyogZGVjb2RlIGFyZ3VtZW50cyBlcnJvciAqLworCVJQQ19TWVNURU1FUlJPUj0xMiwJCS8qIGdlbmVyaWMgIm90aGVyIHByb2JsZW0iICovCisJUlBDX05PQlJPQURDQVNUID0gMjEsCQkvKiBCcm9hZGNhc3Rpbmcgbm90IHN1cHBvcnRlZCAqLworCS8qCisJICogY2FsbHJwYyAmIGNsbnRfY3JlYXRlIGVycm9ycworCSAqLworCVJQQ19VTktOT1dOSE9TVD0xMywJCS8qIHVua25vd24gaG9zdCBuYW1lICovCisJUlBDX1VOS05PV05QUk9UTz0xNywJCS8qIHVua25vd24gcHJvdG9jb2wgKi8KKwlSUENfVU5LTk9XTkFERFIgPSAxOSwJCS8qIFJlbW90ZSBhZGRyZXNzIHVua25vd24gKi8KKworCS8qCisJICogcnBjYmluZCBlcnJvcnMKKwkgKi8KKwlSUENfUlBDQkZBSUxVUkU9MTQsCQkvKiBwb3J0bWFwcGVyIGZhaWxlZCBpbiBpdHMgY2FsbCAqLworI2RlZmluZSBSUENfUE1BUEZBSUxVUkUgUlBDX1JQQ0JGQUlMVVJFCisJUlBDX1BST0dOT1RSRUdJU1RFUkVEPTE1LAkvKiByZW1vdGUgcHJvZ3JhbSBpcyBub3QgcmVnaXN0ZXJlZCAqLworCVJQQ19OMkFYTEFURUZBSUxVUkUgPSAyMiwJLyogTmFtZSB0byBhZGRyIHRyYW5zbGF0aW9uIGZhaWxlZCAqLworCS8qCisJICogdW5zcGVjaWZpZWQgZXJyb3IKKwkgKi8KKwlSUENfRkFJTEVEPTE2LAorCVJQQ19JTlRSPTE4LAorCVJQQ19UTElFUlJPUj0yMCwKKwlSUENfVURFUlJPUj0yMywKKyAgICAgICAgLyoKKyAgICAgICAgICogYXN5bmNocm9ub3VzIGVycm9ycworICAgICAgICAgKi8KKyAgICAgICAgUlBDX0lOUFJPR1JFU1MgPSAyNCwKKyAgICAgICAgUlBDX1NUQUxFUkFDSEFORExFID0gMjUKK307CisKKworLyoKKyAqIEVycm9yIGluZm8uCisgKi8KK3N0cnVjdCBycGNfZXJyIHsKKyAgZW51bSBjbG50X3N0YXQgcmVfc3RhdHVzOworICB1bmlvbiB7CisgICAgaW50IFJFX2Vycm5vOwkJLyogcmVsYXRlZCBzeXN0ZW0gZXJyb3IgKi8KKyAgICBlbnVtIGF1dGhfc3RhdCBSRV93aHk7CS8qIHdoeSB0aGUgYXV0aCBlcnJvciBvY2N1cnJlZCAqLworICAgIHN0cnVjdCB7CisgICAgICB1X2xvbmcgbG93OwkJLyogbG93ZXN0IHZlcmlvbiBzdXBwb3J0ZWQgKi8KKyAgICAgIHVfbG9uZyBoaWdoOwkJLyogaGlnaGVzdCB2ZXJpb24gc3VwcG9ydGVkICovCisgICAgfSBSRV92ZXJzOworICAgIHN0cnVjdCB7CQkJLyogbWF5YmUgbWVhbmluZ2Z1bCBpZiBSUENfRkFJTEVEICovCisgICAgICBsb25nIHMxOworICAgICAgbG9uZyBzMjsKKyAgICB9IFJFX2xiOwkJCS8qIGxpZmUgYm9vdCAmIGRlYnVnZ2luZyBvbmx5ICovCisgIH0gcnU7CisjZGVmaW5lCXJlX2Vycm5vCXJ1LlJFX2Vycm5vCisjZGVmaW5lCXJlX3doeQkJcnUuUkVfd2h5CisjZGVmaW5lCXJlX3ZlcnMJCXJ1LlJFX3ZlcnMKKyNkZWZpbmUJcmVfbGIJCXJ1LlJFX2xiCit9OworCisKKy8qCisgKiBDbGllbnQgcnBjIGhhbmRsZS4KKyAqIENyZWF0ZWQgYnkgaW5kaXZpZHVhbCBpbXBsZW1lbnRhdGlvbnMsIHNlZSBlLmcuIHJwY191ZHAuYy4KKyAqIENsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGl6aW5nIGF1dGgsIHNlZSBlLmcuIGF1dGhfbm9uZS5jLgorICovCit0eXBlZGVmIHN0cnVjdCBDTElFTlQgQ0xJRU5UOworc3RydWN0IENMSUVOVCB7CisgIEFVVEgJKmNsX2F1dGg7CQkgLyogYXV0aGVudGljYXRvciAqLworICBzdHJ1Y3QgY2xudF9vcHMgeworICAgIGVudW0gY2xudF9zdGF0ICgqY2xfY2FsbCkgKENMSUVOVCAqLCB1X2xvbmcsIHhkcnByb2NfdCwgY2FkZHJfdCwgeGRycHJvY190LAorCQkJICAgICAgIGNhZGRyX3QsIHN0cnVjdCB0aW1ldmFsKTsKKwkJCSAgICAgICAJLyogY2FsbCByZW1vdGUgcHJvY2VkdXJlICovCisgICAgdm9pZCAoKmNsX2Fib3J0KSAodm9pZCk7CS8qIGFib3J0IGEgY2FsbCAqLworICAgIHZvaWQgKCpjbF9nZXRlcnIpIChDTElFTlQgKiwgc3RydWN0IHJwY19lcnIgKik7CisJCQkJLyogZ2V0IHNwZWNpZmljIGVycm9yIGNvZGUgKi8KKyAgICBib29sX3QgKCpjbF9mcmVlcmVzKSAoQ0xJRU5UICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisJCQkJLyogZnJlZXMgcmVzdWx0cyAqLworICAgIHZvaWQgKCpjbF9kZXN0cm95KSAoQ0xJRU5UICopOyAvKiBkZXN0cm95IHRoaXMgc3RydWN0dXJlICovCisgICAgYm9vbF90ICgqY2xfY29udHJvbCkgKENMSUVOVCAqLCBpbnQsIGNoYXIgKik7CisJCQkJLyogdGhlIGlvY3RsKCkgb2YgcnBjICovCisgIH0gKmNsX29wczsKKyAgY2FkZHJfdCBjbF9wcml2YXRlOwkJLyogcHJpdmF0ZSBzdHVmZiAqLworfTsKKworCisvKgorICogY2xpZW50IHNpZGUgcnBjIGludGVyZmFjZSBvcHMKKyAqCisgKiBQYXJhbWV0ZXIgdHlwZXMgYXJlOgorICoKKyAqLworCisvKgorICogZW51bSBjbG50X3N0YXQKKyAqIENMTlRfQ0FMTChyaCwgcHJvYywgeGFyZ3MsIGFyZ3NwLCB4cmVzLCByZXNwLCB0aW1lb3V0KQorICogCUNMSUVOVCAqcmg7CisgKgl1X2xvbmcgcHJvYzsKKyAqCXhkcnByb2NfdCB4YXJnczsKKyAqCWNhZGRyX3QgYXJnc3A7CisgKgl4ZHJwcm9jX3QgeHJlczsKKyAqCWNhZGRyX3QgcmVzcDsKKyAqCXN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgKi8KKyNkZWZpbmUJQ0xOVF9DQUxMKHJoLCBwcm9jLCB4YXJncywgYXJnc3AsIHhyZXMsIHJlc3AsIHNlY3MpCVwKKwkoKCoocmgpLT5jbF9vcHMtPmNsX2NhbGwpKHJoLCBwcm9jLCB4YXJncywgYXJnc3AsIHhyZXMsIHJlc3AsIHNlY3MpKQorI2RlZmluZQljbG50X2NhbGwocmgsIHByb2MsIHhhcmdzLCBhcmdzcCwgeHJlcywgcmVzcCwgc2VjcykJXAorCSgoKihyaCktPmNsX29wcy0+Y2xfY2FsbCkocmgsIHByb2MsIHhhcmdzLCBhcmdzcCwgeHJlcywgcmVzcCwgc2VjcykpCisKKy8qCisgKiB2b2lkCisgKiBDTE5UX0FCT1JUKHJoKTsKKyAqIAlDTElFTlQgKnJoOworICovCisjZGVmaW5lCUNMTlRfQUJPUlQocmgpCSgoKihyaCktPmNsX29wcy0+Y2xfYWJvcnQpKHJoKSkKKyNkZWZpbmUJY2xudF9hYm9ydChyaCkJKCgqKHJoKS0+Y2xfb3BzLT5jbF9hYm9ydCkocmgpKQorCisvKgorICogc3RydWN0IHJwY19lcnIKKyAqIENMTlRfR0VURVJSKHJoKTsKKyAqIAlDTElFTlQgKnJoOworICovCisjZGVmaW5lCUNMTlRfR0VURVJSKHJoLGVycnApCSgoKihyaCktPmNsX29wcy0+Y2xfZ2V0ZXJyKShyaCwgZXJycCkpCisjZGVmaW5lCWNsbnRfZ2V0ZXJyKHJoLGVycnApCSgoKihyaCktPmNsX29wcy0+Y2xfZ2V0ZXJyKShyaCwgZXJycCkpCisKKworLyoKKyAqIGJvb2xfdAorICogQ0xOVF9GUkVFUkVTKHJoLCB4cmVzLCByZXNwKTsKKyAqIAlDTElFTlQgKnJoOworICoJeGRycHJvY190IHhyZXM7CisgKgljYWRkcl90IHJlc3A7CisgKi8KKyNkZWZpbmUJQ0xOVF9GUkVFUkVTKHJoLHhyZXMscmVzcCkgKCgqKHJoKS0+Y2xfb3BzLT5jbF9mcmVlcmVzKShyaCx4cmVzLHJlc3ApKQorI2RlZmluZQljbG50X2ZyZWVyZXMocmgseHJlcyxyZXNwKSAoKCoocmgpLT5jbF9vcHMtPmNsX2ZyZWVyZXMpKHJoLHhyZXMscmVzcCkpCisKKy8qCisgKiBib29sX3QKKyAqIENMTlRfQ09OVFJPTChjbCwgcmVxdWVzdCwgaW5mbykKKyAqICAgICAgQ0xJRU5UICpjbDsKKyAqICAgICAgdV9pbnQgcmVxdWVzdDsKKyAqICAgICAgY2hhciAqaW5mbzsKKyAqLworI2RlZmluZQlDTE5UX0NPTlRST0woY2wscnEsaW4pICgoKihjbCktPmNsX29wcy0+Y2xfY29udHJvbCkoY2wscnEsaW4pKQorI2RlZmluZQljbG50X2NvbnRyb2woY2wscnEsaW4pICgoKihjbCktPmNsX29wcy0+Y2xfY29udHJvbCkoY2wscnEsaW4pKQorCisvKgorICogY29udHJvbCBvcGVyYXRpb25zIHRoYXQgYXBwbHkgdG8gYWxsIHRyYW5zcG9ydHMKKyAqCisgKiBOb3RlOiBvcHRpb25zIG1hcmtlZCBYWFggYXJlIG5vLW9wcyBpbiB0aGlzIGltcGxlbWVudGF0aW9uIG9mIFJQQy4KKyAqIFRoZSBhcmUgcHJlc2VudCBpbiBUSS1SUEMgYnV0IGNhbid0IGJlIGltcGxlbWVudGVkIGhlcmUgc2luY2UgdGhleQorICogZGVwZW5kIG9uIHRoZSBwcmVzZW5jZSBvZiBTVFJFQU1TL1RMSSwgd2hpY2ggd2UgZG9uJ3QgaGF2ZS4KKyAqLworI2RlZmluZSBDTFNFVF9USU1FT1VUICAgICAgICAxICAgIC8qIHNldCB0aW1lb3V0ICh0aW1ldmFsKSAqLworI2RlZmluZSBDTEdFVF9USU1FT1VUICAgICAgICAyICAgIC8qIGdldCB0aW1lb3V0ICh0aW1ldmFsKSAqLworI2RlZmluZSBDTEdFVF9TRVJWRVJfQUREUiAgICAzICAgIC8qIGdldCBzZXJ2ZXIncyBhZGRyZXNzIChzb2NrYWRkcikgKi8KKyNkZWZpbmUgQ0xHRVRfRkQgICAgICAgICAgICAgNiAgICAvKiBnZXQgY29ubmVjdGlvbnMgZmlsZSBkZXNjcmlwdG9yICovCisjZGVmaW5lIENMR0VUX1NWQ19BRERSICAgICAgIDcgICAgLyogZ2V0IHNlcnZlcidzIGFkZHJlc3MgKG5ldGJ1ZikgICAgICBYWFggKi8KKyNkZWZpbmUgQ0xTRVRfRkRfQ0xPU0UgICAgICAgOCAgICAvKiBjbG9zZSBmZCB3aGlsZSBjbG50X2Rlc3Ryb3kgKi8KKyNkZWZpbmUgQ0xTRVRfRkRfTkNMT1NFICAgICAgOSAgICAvKiBEbyBub3QgY2xvc2UgZmQgd2hpbGUgY2xudF9kZXN0cm95Ki8KKyNkZWZpbmUgQ0xHRVRfWElEICAgICAgICAgICAgMTAgICAvKiBHZXQgeGlkICovCisjZGVmaW5lIENMU0VUX1hJRCAgICAgICAgICAgIDExICAgLyogU2V0IHhpZCAqLworI2RlZmluZSBDTEdFVF9WRVJTICAgICAgICAgICAxMiAgIC8qIEdldCB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZSBDTFNFVF9WRVJTICAgICAgICAgICAxMyAgIC8qIFNldCB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZSBDTEdFVF9QUk9HICAgICAgICAgICAxNCAgIC8qIEdldCBwcm9ncmFtIG51bWJlciAqLworI2RlZmluZSBDTFNFVF9QUk9HICAgICAgICAgICAxNSAgIC8qIFNldCBwcm9ncmFtIG51bWJlciAqLworI2RlZmluZSBDTFNFVF9TVkNfQUREUiAgICAgICAxNiAgIC8qIGdldCBzZXJ2ZXIncyBhZGRyZXNzIChuZXRidWYpICAgICAgWFhYICovCisjZGVmaW5lIENMU0VUX1BVU0hfVElNT0QgICAgIDE3ICAgLyogcHVzaCB0aW1vZCBpZiBub3QgYWxyZWFkeSBwcmVzZW50ICBYWFggKi8KKyNkZWZpbmUgQ0xTRVRfUE9QX1RJTU9EICAgICAgMTggICAvKiBwb3AgdGltb2QgICAgICAgICAgICAgICAgICAgICAgICAgIFhYWCAqLworLyoKKyAqIENvbm5lY3Rpb25sZXNzIG9ubHkgY29udHJvbCBvcGVyYXRpb25zCisgKi8KKyNkZWZpbmUgQ0xTRVRfUkVUUllfVElNRU9VVAk0CS8qIHNldCByZXRyeSB0aW1lb3V0ICh0aW1ldmFsKSAqLworI2RlZmluZSBDTEdFVF9SRVRSWV9USU1FT1VUCTUJLyogZ2V0IHJldHJ5IHRpbWVvdXQgKHRpbWV2YWwpICovCisKKy8qCisgKiB2b2lkCisgKiBDTE5UX0RFU1RST1kocmgpOworICogCUNMSUVOVCAqcmg7CisgKi8KKyNkZWZpbmUJQ0xOVF9ERVNUUk9ZKHJoKQkoKCoocmgpLT5jbF9vcHMtPmNsX2Rlc3Ryb3kpKHJoKSkKKyNkZWZpbmUJY2xudF9kZXN0cm95KHJoKQkoKCoocmgpLT5jbF9vcHMtPmNsX2Rlc3Ryb3kpKHJoKSkKKworCisvKgorICogUlBDVEVTVCBpcyBhIHRlc3QgcHJvZ3JhbSB3aGljaCBpcyBhY2Nlc3NpYmxlIG9uIGV2ZXJ5IHJwYworICogdHJhbnNwb3J0L3BvcnQuICBJdCBpcyB1c2VkIGZvciB0ZXN0aW5nLCBwZXJmb3JtYW5jZSBldmFsdWF0aW9uLAorICogYW5kIG5ldHdvcmsgYWRtaW5pc3RyYXRpb24uCisgKi8KKworI2RlZmluZSBSUENURVNUX1BST0dSQU0JCSgodV9sb25nKTEpCisjZGVmaW5lIFJQQ1RFU1RfVkVSU0lPTgkJKCh1X2xvbmcpMSkKKyNkZWZpbmUgUlBDVEVTVF9OVUxMX1BST0MJKCh1X2xvbmcpMikKKyNkZWZpbmUgUlBDVEVTVF9OVUxMX0JBVENIX1BST0MJKCh1X2xvbmcpMykKKworLyoKKyAqIEJ5IGNvbnZlbnRpb24sIHByb2NlZHVyZSAwIHRha2VzIG51bGwgYXJndW1lbnRzIGFuZCByZXR1cm5zIHRoZW0KKyAqLworCisjZGVmaW5lIE5VTExQUk9DICgodV9sb25nKTApCisKKy8qCisgKiBCZWxvdyBhcmUgdGhlIGNsaWVudCBoYW5kbGUgY3JlYXRpb24gcm91dGluZXMgZm9yIHRoZSB2YXJpb3VzCisgKiBpbXBsZW1lbnRhdGlvbnMgb2YgY2xpZW50IHNpZGUgcnBjLiAgVGhleSBjYW4gcmV0dXJuIE5VTEwgaWYgYQorICogY3JlYXRpb24gZmFpbHVyZSBvY2N1cnMuCisgKi8KKworLyoKKyAqIE1lbW9yeSBiYXNlZCBycGMgKGZvciBzcGVlZCBjaGVjayBhbmQgdGVzdGluZykKKyAqIENMSUVOVCAqCisgKiBjbG50cmF3X2NyZWF0ZShwcm9nLCB2ZXJzKQorICoJdV9sb25nIHByb2c7CisgKgl1X2xvbmcgdmVyczsKKyAqLworZXh0ZXJuIENMSUVOVCAqY2xudHJhd19jcmVhdGUgKF9fY29uc3QgdV9sb25nIF9fcHJvZywgX19jb25zdCB1X2xvbmcgX192ZXJzKQorICAgICBfX1RIUk9XOworCisKKy8qCisgKiBHZW5lcmljIGNsaWVudCBjcmVhdGlvbiByb3V0aW5lLiBTdXBwb3J0ZWQgcHJvdG9jb2xzIGFyZSAidWRwIiwgInRjcCIgYW5kCisgKiAidW5peCIKKyAqIENMSUVOVCAqCisgKiBjbG50X2NyZWF0ZShob3N0LCBwcm9nLCB2ZXJzLCBwcm90KQorICoJY2hhciAqaG9zdDsgCS0tIGhvc3RuYW1lCisgKgl1X2xvbmcgcHJvZzsJLS0gcHJvZ3JhbSBudW1iZXIKKyAqCXVfb25nIHZlcnM7CS0tIHZlcnNpb24gbnVtYmVyCisgKgljaGFyICpwcm90OwktLSBwcm90b2NvbAorICovCitleHRlcm4gQ0xJRU5UICpjbG50X2NyZWF0ZSAoX19jb25zdCBjaGFyICpfX2hvc3QsIF9fY29uc3QgdV9sb25nIF9fcHJvZywKKwkJCSAgICBfX2NvbnN0IHVfbG9uZyBfX3ZlcnMsIF9fY29uc3QgY2hhciAqX19wcm90KQorICAgICBfX1RIUk9XOworCisKKy8qCisgKiBUQ1AgYmFzZWQgcnBjCisgKiBDTElFTlQgKgorICogY2xudHRjcF9jcmVhdGUocmFkZHIsIHByb2csIHZlcnMsIHNvY2twLCBzZW5kc3osIHJlY3ZzeikKKyAqCXN0cnVjdCBzb2NrYWRkcl9pbiAqcmFkZHI7CisgKgl1X2xvbmcgcHJvZzsKKyAqCXVfbG9uZyB2ZXJzaW9uOworICoJcmVnaXN0ZXIgaW50ICpzb2NrcDsKKyAqCXVfaW50IHNlbmRzejsKKyAqCXVfaW50IHJlY3ZzejsKKyAqLworZXh0ZXJuIENMSUVOVCAqY2xudHRjcF9jcmVhdGUgKHN0cnVjdCBzb2NrYWRkcl9pbiAqX19yYWRkciwgdV9sb25nIF9fcHJvZywKKwkJCSAgICAgICB1X2xvbmcgX192ZXJzaW9uLCBpbnQgKl9fc29ja3AsIHVfaW50IF9fc2VuZHN6LAorCQkJICAgICAgIHVfaW50IF9fcmVjdnN6KSBfX1RIUk9XOworCisvKgorICogVURQIGJhc2VkIHJwYy4KKyAqIENMSUVOVCAqCisgKiBjbG50dWRwX2NyZWF0ZShyYWRkciwgcHJvZ3JhbSwgdmVyc2lvbiwgd2FpdCwgc29ja3ApCisgKglzdHJ1Y3Qgc29ja2FkZHJfaW4gKnJhZGRyOworICoJdV9sb25nIHByb2dyYW07CisgKgl1X2xvbmcgdmVyc2lvbjsKKyAqCXN0cnVjdCB0aW1ldmFsIHdhaXRfcmVzZW5kOworICoJaW50ICpzb2NrcDsKKyAqCisgKiBTYW1lIGFzIGFib3ZlLCBidXQgeW91IHNwZWNpZnkgbWF4IHBhY2tldCBzaXplcy4KKyAqIENMSUVOVCAqCisgKiBjbG50dWRwX2J1ZmNyZWF0ZShyYWRkciwgcHJvZ3JhbSwgdmVyc2lvbiwgd2FpdCwgc29ja3AsIHNlbmRzeiwgcmVjdnN6KQorICoJc3RydWN0IHNvY2thZGRyX2luICpyYWRkcjsKKyAqCXVfbG9uZyBwcm9ncmFtOworICoJdV9sb25nIHZlcnNpb247CisgKglzdHJ1Y3QgdGltZXZhbCB3YWl0X3Jlc2VuZDsKKyAqCWludCAqc29ja3A7CisgKgl1X2ludCBzZW5kc3o7CisgKgl1X2ludCByZWN2c3o7CisgKi8KK2V4dGVybiBDTElFTlQgKmNsbnR1ZHBfY3JlYXRlIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKl9fcmFkZHIsIHVfbG9uZyBfX3Byb2dyYW0sCisJCQkgICAgICAgdV9sb25nIF9fdmVyc2lvbiwgc3RydWN0IHRpbWV2YWwgX193YWl0X3Jlc2VuZCwKKwkJCSAgICAgICBpbnQgKl9fc29ja3ApIF9fVEhST1c7CitleHRlcm4gQ0xJRU5UICpjbG50dWRwX2J1ZmNyZWF0ZSAoc3RydWN0IHNvY2thZGRyX2luICpfX3JhZGRyLAorCQkJCSAgdV9sb25nIF9fcHJvZ3JhbSwgdV9sb25nIF9fdmVyc2lvbiwKKwkJCQkgIHN0cnVjdCB0aW1ldmFsIF9fd2FpdF9yZXNlbmQsIGludCAqX19zb2NrcCwKKwkJCQkgIHVfaW50IF9fc2VuZHN6LCB1X2ludCBfX3JlY3ZzeikgX19USFJPVzsKKworCisKKworLyoKKyAqIEFGX1VOSVggYmFzZWQgcnBjCisgKiBDTElFTlQgKgorICogY2xudHVuaXhfY3JlYXRlKHJhZGRyLCBwcm9nLCB2ZXJzLCBzb2NrcCwgc2VuZHN6LCByZWN2c3opCisgKiAgICAgIHN0cnVjdCBzb2NrYWRkcl91biAqcmFkZHI7CisgKiAgICAgIHVfbG9uZyBwcm9nOworICogICAgICB1X2xvbmcgdmVyc2lvbjsKKyAqICAgICAgcmVnaXN0ZXIgaW50ICpzb2NrcDsKKyAqICAgICAgdV9pbnQgc2VuZHN6OworICogICAgICB1X2ludCByZWN2c3o7CisgKi8KK2V4dGVybiBDTElFTlQgKmNsbnR1bml4X2NyZWF0ZSAgKHN0cnVjdCBzb2NrYWRkcl91biAqX19yYWRkciwgdV9sb25nIF9fcHJvZ3JhbSwKKwkJCQkgdV9sb25nIF9fdmVyc2lvbiwgaW50ICpfX3NvY2twLAorCQkJCSB1X2ludCBfX3NlbmRzeiwgdV9pbnQgX19yZWN2c3opIF9fVEhST1c7CisKKworZXh0ZXJuIGludCBjYWxscnBjIChfX2NvbnN0IGNoYXIgKl9faG9zdCwgX19jb25zdCB1X2xvbmcgX19wcm9nbnVtLAorCQkgICAgX19jb25zdCB1X2xvbmcgX192ZXJzbnVtLCBfX2NvbnN0IHVfbG9uZyBfX3Byb2NudW0sCisJCSAgICBfX2NvbnN0IHhkcnByb2NfdCBfX2lucHJvYywgX19jb25zdCBjaGFyICpfX2luLAorCQkgICAgX19jb25zdCB4ZHJwcm9jX3QgX19vdXRwcm9jLCBjaGFyICpfX291dCkgX19USFJPVzsKK2V4dGVybiBpbnQgX3JwY19kdGFibGVzaXplICh2b2lkKSBfX1RIUk9XOworCisvKgorICogUHJpbnQgd2h5IGNyZWF0aW9uIGZhaWxlZAorICovCitleHRlcm4gdm9pZCBjbG50X3BjcmVhdGVlcnJvciAoX19jb25zdCBjaGFyICpfX21zZyk7CS8qIHN0ZGVyciAqLworZXh0ZXJuIGNoYXIgKmNsbnRfc3BjcmVhdGVlcnJvcihfX2NvbnN0IGNoYXIgKl9fbXNnKSBfX1RIUk9XOwkvKiBzdHJpbmcgKi8KKworLyoKKyAqIExpa2UgY2xudF9wZXJyb3IoKSwgYnV0IGlzIG1vcmUgdmVyYm9zZSBpbiBpdHMgb3V0cHV0CisgKi8KK2V4dGVybiB2b2lkIGNsbnRfcGVycm5vIChlbnVtIGNsbnRfc3RhdCBfX251bSk7CQkvKiBzdGRlcnIgKi8KKworLyoKKyAqIFByaW50IGFuIEVuZ2xpc2ggZXJyb3IgbWVzc2FnZSwgZ2l2ZW4gdGhlIGNsaWVudCBlcnJvciBjb2RlCisgKi8KK2V4dGVybiB2b2lkIGNsbnRfcGVycm9yIChDTElFTlQgKl9fY2xudCwgX19jb25zdCBjaGFyICpfX21zZyk7CisJCQkJCQkJLyogc3RkZXJyICovCitleHRlcm4gY2hhciAqY2xudF9zcGVycm9yIChDTElFTlQgKl9fY2xudCwgX19jb25zdCBjaGFyICpfX21zZykgX19USFJPVzsKKwkJCQkJCQkvKiBzdHJpbmcgKi8KKworLyoKKyAqIElmIGEgY3JlYXRpb24gZmFpbHMsIHRoZSBmb2xsb3dpbmcgYWxsb3dzIHRoZSB1c2VyIHRvIGZpZ3VyZSBvdXQgd2h5LgorICovCitzdHJ1Y3QgcnBjX2NyZWF0ZWVyciB7CisJZW51bSBjbG50X3N0YXQgY2Zfc3RhdDsKKwlzdHJ1Y3QgcnBjX2VyciBjZl9lcnJvcjsgLyogdXNlZnVsIHdoZW4gY2Zfc3RhdCA9PSBSUENfUE1BUEZBSUxVUkUgKi8KK307CisKK2V4dGVybiBzdHJ1Y3QgcnBjX2NyZWF0ZWVyciBycGNfY3JlYXRlZXJyOworCisKKworLyoKKyAqIENvcHkgZXJyb3IgbWVzc2FnZSB0byBidWZmZXIuCisgKi8KK2V4dGVybiBjaGFyICpjbG50X3NwZXJybm8gKGVudW0gY2xudF9zdGF0IF9fbnVtKSBfX1RIUk9XOwkvKiBzdHJpbmcgKi8KKworLyoKKyAqIGdldCB0aGUgcG9ydCBudW1iZXIgb24gdGhlIGhvc3QgZm9yIHRoZSBycGMgcHJvZ3JhbSx2ZXJzaW9uIGFuZCBwcm90bworICovCitleHRlcm4gaW50IGdldHJwY3BvcnQgKF9fY29uc3QgY2hhciAqIF9faG9zdCwgdV9sb25nIF9fcHJvZ251bSwKKwkJICAgICAgIHVfbG9uZyBfX3ZlcnNudW0sIHVfaW50IF9fcHJvdG8pIF9fVEhST1c7CisKKy8qCisgKiBnZXQgdGhlIGxvY2FsIGhvc3QncyBJUCBhZGRyZXNzIHdpdGhvdXQgY29uc3VsdGluZworICogbmFtZSBzZXJ2aWNlIGxpYnJhcnkgZnVuY3Rpb25zCisgKi8KK2V4dGVybiB2b2lkIGdldF9teWFkZHJlc3MgKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBfX1RIUk9XOworCisjZGVmaW5lIFVEUE1TR1NJWkUJODgwMAkvKiBycGMgaW1wb3NlZCBsaW1pdCBvbiB1ZHAgbXNnIHNpemUgKi8KKyNkZWZpbmUgUlBDU01BTExNU0dTSVpFCTQwMAkvKiBhIG1vcmUgcmVhc29uYWJsZSBwYWNrZXQgc2l6ZSAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcnBjL2NsbnQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvZGVzX2NyeXB0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9kZXNfY3J5cHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2NjYTNjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvZGVzX2NyeXB0LmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIEAoIylkZXNfY3J5cHQuaAkyLjEgODgvMDgvMTEgNC4wIFJQQ1NSQworICoKKyAqIGRlc19jcnlwdC5oLCBkZXMgbGlicmFyeSByb3V0aW5lIGludGVyZmFjZQorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfX0RFU19DUllQVF9IX18KKyNkZWZpbmUgX19ERVNfQ1JZUFRfSF9fIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2RlZmluZSBERVNfTUFYREFUQSA4MTkyCS8qIG1heCBieXRlcyBlbmNyeXB0ZWQgaW4gb25lIGNhbGwgKi8KKyNkZWZpbmUgREVTX0RJUk1BU0sgKDEgPDwgMCkKKyNkZWZpbmUgREVTX0VOQ1JZUFQgKDAqREVTX0RJUk1BU0spCS8qIEVuY3J5cHQgKi8KKyNkZWZpbmUgREVTX0RFQ1JZUFQgKDEqREVTX0RJUk1BU0spCS8qIERlY3J5cHQgKi8KKworCisjZGVmaW5lIERFU19ERVZNQVNLICgxIDw8IDEpCisjZGVmaW5lCURFU19IVyAoMCpERVNfREVWTUFTSykJLyogVXNlIGhhcmR3YXJlIGRldmljZSAqLworI2RlZmluZSBERVNfU1cgKDEqREVTX0RFVk1BU0spCS8qIFVzZSBzb2Z0d2FyZSBkZXZpY2UgKi8KKworCisjZGVmaW5lIERFU0VSUl9OT05FIDAJLyogc3VjY2VlZGVkICovCisjZGVmaW5lIERFU0VSUl9OT0hXREVWSUNFIDEJLyogc3VjY2VlZGVkLCBidXQgaHcgZGV2aWNlIG5vdCBhdmFpbGFibGUgKi8KKyNkZWZpbmUgREVTRVJSX0hXRVJST1IgMgkvKiBmYWlsZWQsIGhhcmR3YXJlL2RyaXZlciBlcnJvciAqLworI2RlZmluZSBERVNFUlJfQkFEUEFSQU0gMwkvKiBmYWlsZWQsIGJhZCBwYXJhbWV0ZXIgdG8gY2FsbCAqLworCisjZGVmaW5lIERFU19GQUlMRUQoZXJyKSBcCisJKChlcnIpID4gREVTRVJSX05PSFdERVZJQ0UpCisKKy8qCisgKiBjYmNfY3J5cHQoKQorICogZWNiX2NyeXB0KCkKKyAqCisgKiBFbmNyeXB0IChvciBkZWNyeXB0KSBsZW4gYnl0ZXMgb2YgYSBidWZmZXIgYnVmLgorICogVGhlIGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgZWlnaHQuCisgKiBUaGUga2V5IHNob3VsZCBoYXZlIG9kZCBwYXJpdHkgaW4gdGhlIGxvdyBiaXQgb2YgZWFjaCBieXRlLgorICogaXZlYyBpcyB0aGUgaW5wdXQgdmVjdG9yLCBhbmQgaXMgdXBkYXRlZCB0byB0aGUgbmV3IG9uZSAoY2JjIG9ubHkpLgorICogVGhlIG1vZGUgaXMgY3JlYXRlZCBieSBvcmluZyB0b2dldGhlciB0aGUgYXBwcm9wcmlhdGUgcGFyYW1ldGVycy4KKyAqIERFU0VSUl9OT0hXREVWSUNFIGlzIHJldHVybmVkIGlmIERFU19IVyB3YXMgc3BlY2lmaWVkIGJ1dAorICogdGhlcmUgd2FzIG5vIGhhcmR3YXJlIHRvIGRvIGl0IG9uICh0aGUgZGF0YSB3aWxsIHN0aWxsIGJlCisgKiBlbmNyeXB0ZWQgdGhvdWdoLCBpbiBzb2Z0d2FyZSkuCisgKi8KKworCisvKgorICogQ2lwaGVyIEJsb2NrIENoYWluaW5nIG1vZGUKKyAqLworZXh0ZXJuIGludCBjYmNfY3J5cHQgKGNoYXIgKl9fa2V5LCBjaGFyICpfX2J1ZiwgdW5zaWduZWQgX19sZW4sCisJCSAgICAgIHVuc2lnbmVkIF9fbW9kZSwgY2hhciAqX19pdmVjKSBfX1RIUk9XOworCisvKgorICogRWxlY3Ryb25pYyBDb2RlIEJvb2sgbW9kZQorICovCitleHRlcm4gaW50IGVjYl9jcnlwdCAoY2hhciAqX19rZXksIGNoYXIgKl9fYnVmLCB1bnNpZ25lZCBfX2xlbiwKKwkJICAgICAgdW5zaWduZWQgX19tb2RlKSBfX1RIUk9XOworCisvKgorICogU2V0IGRlcyBwYXJpdHkgZm9yIGEga2V5LgorICogREVTIHBhcml0eSBpcyBvZGQgYW5kIGluIHRoZSBsb3cgYml0IG9mIGVhY2ggYnl0ZQorICovCitleHRlcm4gdm9pZCBkZXNfc2V0cGFyaXR5IChjaGFyICpfX2tleSkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9rZXlfcHJvdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMva2V5X3Byb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDYyN2U2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMva2V5X3Byb3QuaApAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCisgKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KKyAqLworCisjaWZuZGVmIF9LRVlfUFJPVF9IX1JQQ0dFTgorI2RlZmluZSBfS0VZX1BST1RfSF9SUENHRU4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworLyogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIENvbXBpbGVkIGZyb20ga2V5X3Byb3QueCB1c2luZyBycGNnZW4uCisgKiBETyBOT1QgRURJVCBUSElTIEZJTEUhCisgKiBUaGlzIGlzIE5PVCBzb3VyY2UgY29kZSEKKyAqLworI2RlZmluZSBQUk9PVCAzCisjZGVmaW5lIEhFWE1PRFVMVVMgImQ0YTBiYTAyNTBiNmZkMmVjNjI2ZTdlZmQ2MzdkZjc2YzcxNmUyMmQwOTQ0Yjg4YiIKKyNkZWZpbmUgSEVYS0VZQllURVMgNDgKKyNkZWZpbmUgS0VZU0laRSAxOTIKKyNkZWZpbmUgS0VZQllURVMgMjQKKyNkZWZpbmUgS0VZQ0hFQ0tTVU1TSVpFIDE2CisKK2VudW0ga2V5c3RhdHVzIHsKKwlLRVlfU1VDQ0VTUyA9IDAsCisJS0VZX05PU0VDUkVUID0gMSwKKwlLRVlfVU5LTk9XTiA9IDIsCisJS0VZX1NZU1RFTUVSUiA9IDMsCit9OwordHlwZWRlZiBlbnVtIGtleXN0YXR1cyBrZXlzdGF0dXM7CisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9rZXlzdGF0dXMoWERSICosIGtleXN0YXR1cyopOworI2VsaWYgX19TVERDX18KK2V4dGVybiAgYm9vbF90IHhkcl9rZXlzdGF0dXMoWERSICosIGtleXN0YXR1cyopOworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8KK2Jvb2xfdCB4ZHJfa2V5c3RhdHVzKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8KKworCit0eXBlZGVmIGNoYXIga2V5YnVmW0hFWEtFWUJZVEVTXTsKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiBib29sX3QgeGRyX2tleWJ1ZihYRFIgKiwga2V5YnVmKTsKKyNlbGlmIF9fU1REQ19fCitleHRlcm4gIGJvb2xfdCB4ZHJfa2V5YnVmKFhEUiAqLCBrZXlidWYpOworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8KK2Jvb2xfdCB4ZHJfa2V5YnVmKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8KKworCit0eXBlZGVmIGNoYXIgKm5ldG5hbWVzdHI7CisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9uZXRuYW1lc3RyKFhEUiAqLCBuZXRuYW1lc3RyKik7CisjZWxpZiBfX1NURENfXworZXh0ZXJuICBib29sX3QgeGRyX25ldG5hbWVzdHIoWERSICosIG5ldG5hbWVzdHIqKTsKKyNlbHNlIC8qIE9sZCBTdHlsZSBDICovCitib29sX3QgeGRyX25ldG5hbWVzdHIoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLworCisKK3N0cnVjdCBjcnlwdGtleWFyZyB7CisJbmV0bmFtZXN0ciByZW1vdGVuYW1lOworCWRlc19ibG9jayBkZXNrZXk7Cit9OwordHlwZWRlZiBzdHJ1Y3QgY3J5cHRrZXlhcmcgY3J5cHRrZXlhcmc7CisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9jcnlwdGtleWFyZyhYRFIgKiwgY3J5cHRrZXlhcmcqKTsKKyNlbGlmIF9fU1REQ19fCitleHRlcm4gIGJvb2xfdCB4ZHJfY3J5cHRrZXlhcmcoWERSICosIGNyeXB0a2V5YXJnKik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLworYm9vbF90IHhkcl9jcnlwdGtleWFyZygpOworI2VuZGlmIC8qIE9sZCBTdHlsZSBDICovCisKKworc3RydWN0IGNyeXB0a2V5YXJnMiB7CisJbmV0bmFtZXN0ciByZW1vdGVuYW1lOworCW5ldG9iaiByZW1vdGVrZXk7CisJZGVzX2Jsb2NrIGRlc2tleTsKK307Cit0eXBlZGVmIHN0cnVjdCBjcnlwdGtleWFyZzIgY3J5cHRrZXlhcmcyOworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIGJvb2xfdCB4ZHJfY3J5cHRrZXlhcmcyKFhEUiAqLCBjcnlwdGtleWFyZzIqKTsKKyNlbGlmIF9fU1REQ19fCitleHRlcm4gIGJvb2xfdCB4ZHJfY3J5cHRrZXlhcmcyKFhEUiAqLCBjcnlwdGtleWFyZzIqKTsKKyNlbHNlIC8qIE9sZCBTdHlsZSBDICovCitib29sX3QgeGRyX2NyeXB0a2V5YXJnMigpOworI2VuZGlmIC8qIE9sZCBTdHlsZSBDICovCisKKworc3RydWN0IGNyeXB0a2V5cmVzIHsKKwlrZXlzdGF0dXMgc3RhdHVzOworCXVuaW9uIHsKKwkJZGVzX2Jsb2NrIGRlc2tleTsKKwl9IGNyeXB0a2V5cmVzX3U7Cit9OwordHlwZWRlZiBzdHJ1Y3QgY3J5cHRrZXlyZXMgY3J5cHRrZXlyZXM7CisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9jcnlwdGtleXJlcyhYRFIgKiwgY3J5cHRrZXlyZXMqKTsKKyNlbGlmIF9fU1REQ19fCitleHRlcm4gIGJvb2xfdCB4ZHJfY3J5cHRrZXlyZXMoWERSICosIGNyeXB0a2V5cmVzKik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLworYm9vbF90IHhkcl9jcnlwdGtleXJlcygpOworI2VuZGlmIC8qIE9sZCBTdHlsZSBDICovCisKKyNkZWZpbmUgTUFYR0lEUyAxNgorCitzdHJ1Y3QgdW5peGNyZWQgeworCXVfaW50IHVpZDsKKwl1X2ludCBnaWQ7CisJc3RydWN0IHsKKwkJdV9pbnQgZ2lkc19sZW47CisJCXVfaW50ICpnaWRzX3ZhbDsKKwl9IGdpZHM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgdW5peGNyZWQgdW5peGNyZWQ7CisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgYm9vbF90IHhkcl91bml4Y3JlZChYRFIgKiwgdW5peGNyZWQqKTsKKyNlbGlmIF9fU1REQ19fCitleHRlcm4gIGJvb2xfdCB4ZHJfdW5peGNyZWQoWERSICosIHVuaXhjcmVkKik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLworYm9vbF90IHhkcl91bml4Y3JlZCgpOworI2VuZGlmIC8qIE9sZCBTdHlsZSBDICovCisKKworc3RydWN0IGdldGNyZWRyZXMgeworCWtleXN0YXR1cyBzdGF0dXM7CisJdW5pb24geworCQl1bml4Y3JlZCBjcmVkOworCX0gZ2V0Y3JlZHJlc191OworfTsKK3R5cGVkZWYgc3RydWN0IGdldGNyZWRyZXMgZ2V0Y3JlZHJlczsKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiBib29sX3QgeGRyX2dldGNyZWRyZXMoWERSICosIGdldGNyZWRyZXMqKTsKKyNlbGlmIF9fU1REQ19fCitleHRlcm4gIGJvb2xfdCB4ZHJfZ2V0Y3JlZHJlcyhYRFIgKiwgZ2V0Y3JlZHJlcyopOworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8KK2Jvb2xfdCB4ZHJfZ2V0Y3JlZHJlcygpOworI2VuZGlmIC8qIE9sZCBTdHlsZSBDICovCisKKworc3RydWN0IGtleV9uZXRzdGFyZyB7CisJa2V5YnVmIHN0X3ByaXZfa2V5OworCWtleWJ1ZiBzdF9wdWJfa2V5OworCW5ldG5hbWVzdHIgc3RfbmV0bmFtZTsKK307Cit0eXBlZGVmIHN0cnVjdCBrZXlfbmV0c3Rhcmcga2V5X25ldHN0YXJnOworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIGJvb2xfdCB4ZHJfa2V5X25ldHN0YXJnKFhEUiAqLCBrZXlfbmV0c3RhcmcqKTsKKyNlbGlmIF9fU1REQ19fCitleHRlcm4gIGJvb2xfdCB4ZHJfa2V5X25ldHN0YXJnKFhEUiAqLCBrZXlfbmV0c3RhcmcqKTsKKyNlbHNlIC8qIE9sZCBTdHlsZSBDICovCitib29sX3QgeGRyX2tleV9uZXRzdGFyZygpOworI2VuZGlmIC8qIE9sZCBTdHlsZSBDICovCisKKworc3RydWN0IGtleV9uZXRzdHJlcyB7CisJa2V5c3RhdHVzIHN0YXR1czsKKwl1bmlvbiB7CisJCWtleV9uZXRzdGFyZyBrbmV0OworCX0ga2V5X25ldHN0cmVzX3U7Cit9OwordHlwZWRlZiBzdHJ1Y3Qga2V5X25ldHN0cmVzIGtleV9uZXRzdHJlczsKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiBib29sX3QgeGRyX2tleV9uZXRzdHJlcyhYRFIgKiwga2V5X25ldHN0cmVzKik7CisjZWxpZiBfX1NURENfXworZXh0ZXJuICBib29sX3QgeGRyX2tleV9uZXRzdHJlcyhYRFIgKiwga2V5X25ldHN0cmVzKik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLworYm9vbF90IHhkcl9rZXlfbmV0c3RyZXMoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLworCisKKyNpZm5kZWYgb3BhcXVlCisjZGVmaW5lIG9wYXF1ZSBjaGFyCisjZW5kaWYKKworCisjZGVmaW5lIEtFWV9QUk9HICgodV9sb25nKTEwMDAyOSkKKyNkZWZpbmUgS0VZX1ZFUlMgKCh1X2xvbmcpMSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIEtFWV9TRVQgKCh1X2xvbmcpMSkKK2V4dGVybiAiQyIga2V5c3RhdHVzICoga2V5X3NldF8xKG9wYXF1ZSAqLCBDTElFTlQgKik7CitleHRlcm4gIkMiIGtleXN0YXR1cyAqIGtleV9zZXRfMV9zdmMob3BhcXVlICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfRU5DUllQVCAoKHVfbG9uZykyKQorZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzEoY3J5cHRrZXlhcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzFfc3ZjKGNyeXB0a2V5YXJnICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfREVDUllQVCAoKHVfbG9uZykzKQorZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzEoY3J5cHRrZXlhcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzFfc3ZjKGNyeXB0a2V5YXJnICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfR0VOICgodV9sb25nKTQpCitleHRlcm4gIkMiIGRlc19ibG9jayAqIGtleV9nZW5fMSh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAiQyIgZGVzX2Jsb2NrICoga2V5X2dlbl8xX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfR0VUQ1JFRCAoKHVfbG9uZyk1KQorZXh0ZXJuICJDIiBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMShuZXRuYW1lc3RyICosIENMSUVOVCAqKTsKK2V4dGVybiAiQyIgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzFfc3ZjKG5ldG5hbWVzdHIgKiwgc3RydWN0IHN2Y19yZXEgKik7CisKKyNlbGlmIF9fU1REQ19fCisjZGVmaW5lIEtFWV9TRVQgKCh1X2xvbmcpMSkKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X3NldF8xKG9wYXF1ZSAqLCBDTElFTlQgKik7CitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9zZXRfMV9zdmMob3BhcXVlICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfRU5DUllQVCAoKHVfbG9uZykyKQorZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzEoY3J5cHRrZXlhcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzFfc3ZjKGNyeXB0a2V5YXJnICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfREVDUllQVCAoKHVfbG9uZykzKQorZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzEoY3J5cHRrZXlhcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzFfc3ZjKGNyeXB0a2V5YXJnICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfR0VOICgodV9sb25nKTQpCitleHRlcm4gIGRlc19ibG9jayAqIGtleV9nZW5fMSh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgZGVzX2Jsb2NrICoga2V5X2dlbl8xX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfR0VUQ1JFRCAoKHVfbG9uZyk1KQorZXh0ZXJuICBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMShuZXRuYW1lc3RyICosIENMSUVOVCAqKTsKK2V4dGVybiAgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzFfc3ZjKG5ldG5hbWVzdHIgKiwgc3RydWN0IHN2Y19yZXEgKik7CisKKyNlbHNlIC8qIE9sZCBTdHlsZSBDICovCisjZGVmaW5lIEtFWV9TRVQgKCh1X2xvbmcpMSkKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X3NldF8xKCk7CitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9zZXRfMV9zdmMoKTsKKyNkZWZpbmUgS0VZX0VOQ1JZUFQgKCh1X2xvbmcpMikKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF8xKCk7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfMV9zdmMoKTsKKyNkZWZpbmUgS0VZX0RFQ1JZUFQgKCh1X2xvbmcpMykKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF8xKCk7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfMV9zdmMoKTsKKyNkZWZpbmUgS0VZX0dFTiAoKHVfbG9uZyk0KQorZXh0ZXJuICBkZXNfYmxvY2sgKiBrZXlfZ2VuXzEoKTsKK2V4dGVybiAgZGVzX2Jsb2NrICoga2V5X2dlbl8xX3N2YygpOworI2RlZmluZSBLRVlfR0VUQ1JFRCAoKHVfbG9uZyk1KQorZXh0ZXJuICBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMSgpOworZXh0ZXJuICBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMV9zdmMoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLworI2RlZmluZSBLRVlfVkVSUzIgKCh1X2xvbmcpMikKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIGtleXN0YXR1cyAqIGtleV9zZXRfMihvcGFxdWUgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBrZXlzdGF0dXMgKiBrZXlfc2V0XzJfc3ZjKG9wYXF1ZSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiAiQyIgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF8yKGNyeXB0a2V5YXJnICosIENMSUVOVCAqKTsKK2V4dGVybiAiQyIgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF8yX3N2YyhjcnlwdGtleWFyZyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiAiQyIgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF8yKGNyeXB0a2V5YXJnICosIENMSUVOVCAqKTsKK2V4dGVybiAiQyIgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF8yX3N2YyhjcnlwdGtleWFyZyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiAiQyIgZGVzX2Jsb2NrICoga2V5X2dlbl8yKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBkZXNfYmxvY2sgKiBrZXlfZ2VuXzJfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gIkMiIGdldGNyZWRyZXMgKiBrZXlfZ2V0Y3JlZF8yKG5ldG5hbWVzdHIgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMl9zdmMobmV0bmFtZXN0ciAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgS0VZX0VOQ1JZUFRfUEsgKCh1X2xvbmcpNikKK2V4dGVybiAiQyIgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF9wa18yKGNyeXB0a2V5YXJnMiAqLCBDTElFTlQgKik7CitleHRlcm4gIkMiIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfcGtfMl9zdmMoY3J5cHRrZXlhcmcyICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfREVDUllQVF9QSyAoKHVfbG9uZyk3KQorZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0X3BrXzIoY3J5cHRrZXlhcmcyICosIENMSUVOVCAqKTsKK2V4dGVybiAiQyIgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF9wa18yX3N2YyhjcnlwdGtleWFyZzIgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9ORVRfUFVUICgodV9sb25nKTgpCitleHRlcm4gIkMiIGtleXN0YXR1cyAqIGtleV9uZXRfcHV0XzIoa2V5X25ldHN0YXJnICosIENMSUVOVCAqKTsKK2V4dGVybiAiQyIga2V5c3RhdHVzICoga2V5X25ldF9wdXRfMl9zdmMoa2V5X25ldHN0YXJnICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfTkVUX0dFVCAoKHVfbG9uZyk5KQorZXh0ZXJuICJDIiBrZXlfbmV0c3RyZXMgKiBrZXlfbmV0X2dldF8yKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBrZXlfbmV0c3RyZXMgKiBrZXlfbmV0X2dldF8yX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfR0VUX0NPTlYgKCh1X2xvbmcpMTApCitleHRlcm4gIkMiIGNyeXB0a2V5cmVzICoga2V5X2dldF9jb252XzIob3BhcXVlICosIENMSUVOVCAqKTsKK2V4dGVybiAiQyIgY3J5cHRrZXlyZXMgKiBrZXlfZ2V0X2NvbnZfMl9zdmMob3BhcXVlICosIHN0cnVjdCBzdmNfcmVxICopOworCisjZWxpZiBfX1NURENfXworZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfc2V0XzIob3BhcXVlICosIENMSUVOVCAqKTsKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X3NldF8yX3N2YyhvcGFxdWUgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfMihjcnlwdGtleWFyZyAqLCBDTElFTlQgKik7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfMl9zdmMoY3J5cHRrZXlhcmcgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfMihjcnlwdGtleWFyZyAqLCBDTElFTlQgKik7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfMl9zdmMoY3J5cHRrZXlhcmcgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gIGRlc19ibG9jayAqIGtleV9nZW5fMih2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgZGVzX2Jsb2NrICoga2V5X2dlbl8yX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuICBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMihuZXRuYW1lc3RyICosIENMSUVOVCAqKTsKK2V4dGVybiAgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzJfc3ZjKG5ldG5hbWVzdHIgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9FTkNSWVBUX1BLICgodV9sb25nKTYpCitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfcGtfMihjcnlwdGtleWFyZzIgKiwgQ0xJRU5UICopOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0X3BrXzJfc3ZjKGNyeXB0a2V5YXJnMiAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgS0VZX0RFQ1JZUFRfUEsgKCh1X2xvbmcpNykKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF9wa18yKGNyeXB0a2V5YXJnMiAqLCBDTElFTlQgKik7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfcGtfMl9zdmMoY3J5cHRrZXlhcmcyICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfTkVUX1BVVCAoKHVfbG9uZyk4KQorZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfbmV0X3B1dF8yKGtleV9uZXRzdGFyZyAqLCBDTElFTlQgKik7CitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9uZXRfcHV0XzJfc3ZjKGtleV9uZXRzdGFyZyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgS0VZX05FVF9HRVQgKCh1X2xvbmcpOSkKK2V4dGVybiAga2V5X25ldHN0cmVzICoga2V5X25ldF9nZXRfMih2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAga2V5X25ldHN0cmVzICoga2V5X25ldF9nZXRfMl9zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgS0VZX0dFVF9DT05WICgodV9sb25nKTEwKQorZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9nZXRfY29udl8yKG9wYXF1ZSAqLCBDTElFTlQgKik7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2dldF9jb252XzJfc3ZjKG9wYXF1ZSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8KK2V4dGVybiAga2V5c3RhdHVzICoga2V5X3NldF8yKCk7CitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9zZXRfMl9zdmMoKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF8yKCk7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfMl9zdmMoKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF8yKCk7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfMl9zdmMoKTsKK2V4dGVybiAgZGVzX2Jsb2NrICoga2V5X2dlbl8yKCk7CitleHRlcm4gIGRlc19ibG9jayAqIGtleV9nZW5fMl9zdmMoKTsKK2V4dGVybiAgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzIoKTsKK2V4dGVybiAgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzJfc3ZjKCk7CisjZGVmaW5lIEtFWV9FTkNSWVBUX1BLICgodV9sb25nKTYpCitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfcGtfMigpOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0X3BrXzJfc3ZjKCk7CisjZGVmaW5lIEtFWV9ERUNSWVBUX1BLICgodV9sb25nKTcpCitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfcGtfMigpOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0X3BrXzJfc3ZjKCk7CisjZGVmaW5lIEtFWV9ORVRfUFVUICgodV9sb25nKTgpCitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9uZXRfcHV0XzIoKTsKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X25ldF9wdXRfMl9zdmMoKTsKKyNkZWZpbmUgS0VZX05FVF9HRVQgKCh1X2xvbmcpOSkKK2V4dGVybiAga2V5X25ldHN0cmVzICoga2V5X25ldF9nZXRfMigpOworZXh0ZXJuICBrZXlfbmV0c3RyZXMgKiBrZXlfbmV0X2dldF8yX3N2YygpOworI2RlZmluZSBLRVlfR0VUX0NPTlYgKCh1X2xvbmcpMTApCitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2dldF9jb252XzIoKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZ2V0X2NvbnZfMl9zdmMoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLworCisjZW5kaWYgLyogIV9LRVlfUFJPVF9IX1JQQ0dFTiAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvbmV0ZGIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL25ldGRiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMwMzQ5NgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL25ldGRiLmgKQEAgLTAsMCArMSw3NCBAQAorLyogQCgjKW5ldGRiLmgJMi4xIDg4LzA3LzI5IDMuOSBSUENTUkMgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qIENsZWFuZWQgdXAgZm9yIEdOVSBDIGxpYnJhcnkgcm9sYW5kQGdudS5haS5taXQuZWR1OgorICAgYWRkZWQgbXVsdGlwbGUgaW5jbHVzaW9uIHByb3RlY3Rpb24gYW5kIHVzZSBvZiA8c3lzL2NkZWZzLmg+LgorICAgSW4gR05VIHRoaXMgZmlsZSBpcyAjaW5jbHVkZSdkIGJ5IDxuZXRkYi5oPi4gICovCisKKyNpZm5kZWYgX1JQQ19ORVREQl9ICisjZGVmaW5lIF9SUENfTkVUREJfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworX19CRUdJTl9ERUNMUworCitzdHJ1Y3QgcnBjZW50Cit7CisgIGNoYXIgKnJfbmFtZTsJCS8qIE5hbWUgb2Ygc2VydmVyIGZvciB0aGlzIHJwYyBwcm9ncmFtLiAgKi8KKyAgY2hhciAqKnJfYWxpYXNlczsJLyogQWxpYXMgbGlzdC4gICovCisgIGludCByX251bWJlcjsJCS8qIFJQQyBwcm9ncmFtIG51bWJlci4gICovCit9OworCitleHRlcm4gdm9pZCBzZXRycGNlbnQgKGludCBfX3N0YXlvcGVuKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgZW5kcnBjZW50ICh2b2lkKSBfX1RIUk9XOworZXh0ZXJuIHN0cnVjdCBycGNlbnQgKmdldHJwY2J5bmFtZSAoX19jb25zdCBjaGFyICpfX25hbWUpIF9fVEhST1c7CitleHRlcm4gc3RydWN0IHJwY2VudCAqZ2V0cnBjYnludW1iZXIgKGludCBfX251bWJlcikgX19USFJPVzsKK2V4dGVybiBzdHJ1Y3QgcnBjZW50ICpnZXRycGNlbnQgKHZvaWQpIF9fVEhST1c7CisKKyNpZmRlZiBfX1VTRV9NSVNDCitleHRlcm4gaW50IGdldHJwY2J5bmFtZV9yIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgc3RydWN0IHJwY2VudCAqX19yZXN1bHRfYnVmLAorCQkJICAgY2hhciAqX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgIHN0cnVjdCBycGNlbnQgKipfX3Jlc3VsdCkgX19USFJPVzsKKworZXh0ZXJuIGludCBnZXRycGNieW51bWJlcl9yIChpbnQgX19udW1iZXIsIHN0cnVjdCBycGNlbnQgKl9fcmVzdWx0X2J1ZiwKKwkJCSAgICAgY2hhciAqX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICAgc3RydWN0IHJwY2VudCAqKl9fcmVzdWx0KSBfX1RIUk9XOworCitleHRlcm4gaW50IGdldHJwY2VudF9yIChzdHJ1Y3QgcnBjZW50ICpfX3Jlc3VsdF9idWYsIGNoYXIgKl9fYnVmZmVyLAorCQkJc2l6ZV90IF9fYnVmbGVuLCBzdHJ1Y3QgcnBjZW50ICoqX19yZXN1bHQpIF9fVEhST1c7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHJwYy9uZXRkYi5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9wbWFwX2NsbnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3BtYXBfY2xudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NTg3YzYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9wbWFwX2NsbnQuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogcG1hcF9jbG50LmgKKyAqIFN1cHBsaWVzIEMgcm91dGluZXMgdG8gZ2V0IHRvIHBvcnRtYXAgc2VydmljZXMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfUlBDX1BNQVBfQ0xOVF9ICisjZGVmaW5lIF9SUENfUE1BUF9DTE5UX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxycGMvdHlwZXMuaD4KKyNpbmNsdWRlIDxycGMveGRyLmg+CisjaW5jbHVkZSA8cnBjL2NsbnQuaD4KKworX19CRUdJTl9ERUNMUworCit0eXBlZGVmIGJvb2xfdCAoKnJlc3VsdHByb2NfdCkgKGNhZGRyX3QgX19yZXNwLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKl9fcmFkZHIpOworCisvKgorICogVXNhZ2U6CisgKglzdWNjZXNzID0gcG1hcF9zZXQocHJvZ3JhbSwgdmVyc2lvbiwgcHJvdG9jb2wsIHBvcnQpOworICoJc3VjY2VzcyA9IHBtYXBfdW5zZXQocHJvZ3JhbSwgdmVyc2lvbik7CisgKglwb3J0ID0gcG1hcF9nZXRwb3J0KGFkZHJlc3MsIHByb2dyYW0sIHZlcnNpb24sIHByb3RvY29sKTsKKyAqCWhlYWQgPSBwbWFwX2dldG1hcHMoYWRkcmVzcyk7CisgKgljbG50X3N0YXQgPSBwbWFwX3JtdGNhbGwoYWRkcmVzcywgcHJvZ3JhbSwgdmVyc2lvbiwgcHJvY2VkdXJlLAorICoJCXhkcmFyZ3MsIGFyZ3NwLCB4ZHJyZXMsIHJlc3AsIHRvdXQsIHBvcnRfcHRyKQorICoJCSh3b3JrcyBmb3IgdWRwIG9ubHkuKQorICogCWNsbnRfc3RhdCA9IGNsbnRfYnJvYWRjYXN0KHByb2dyYW0sIHZlcnNpb24sIHByb2NlZHVyZSwKKyAqCQl4ZHJhcmdzLCBhcmdzcCwJeGRycmVzLCByZXNwLCBlYWNocmVzdWx0KQorICoJCShsaWtlIHBtYXBfcm10Y2FsbCwgZXhjZXB0IHRoZSBjYWxsIGlzIGJyb2FkY2FzdGVkIHRvIGFsbAorICoJCWxvY2FsbHkgY29ubmVjdGVkIG5ldHMuICBGb3IgZWFjaCB2YWxpZCByZXNwb25zZSByZWNlaXZlZCwKKyAqCQl0aGUgcHJvY2VkdXJlIGVhY2hyZXN1bHQgaXMgY2FsbGVkLiAgSXRzIGZvcm0gaXM6CisgKglkb25lID0gZWFjaHJlc3VsdChyZXNwLCByYWRkcikKKyAqCQlib29sX3QgZG9uZTsKKyAqCQljYWRkcl90IHJlc3A7CisgKgkJc3RydWN0IHNvY2thZGRyX2luIHJhZGRyOworICoJCXdoZXJlIHJlc3AgcG9pbnRzIHRvIHRoZSByZXN1bHRzIG9mIHRoZSBjYWxsIGFuZCByYWRkciBpcyB0aGUKKyAqCQlhZGRyZXNzIGlmIHRoZSByZXNwb25kZXIgdG8gdGhlIGJyb2FkY2FzdC4KKyAqLworCitleHRlcm4gYm9vbF90IHBtYXBfc2V0IChfX2NvbnN0IHVfbG9uZyBfX3Byb2dyYW0sIF9fY29uc3QgdV9sb25nIF9fdmVycywKKwkJCWludCBfX3Byb3RvY29sLCB1X3Nob3J0IF9fcG9ydCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgcG1hcF91bnNldCAoX19jb25zdCB1X2xvbmcgX19wcm9ncmFtLCBfX2NvbnN0IHVfbG9uZyBfX3ZlcnMpCisgICAgIF9fVEhST1c7CitleHRlcm4gc3RydWN0IHBtYXBsaXN0ICpwbWFwX2dldG1hcHMgKHN0cnVjdCBzb2NrYWRkcl9pbiAqX19hZGRyZXNzKSBfX1RIUk9XOworZXh0ZXJuIGVudW0gY2xudF9zdGF0IHBtYXBfcm10Y2FsbCAoc3RydWN0IHNvY2thZGRyX2luICpfX2FkZHIsCisJCQkJICAgIF9fY29uc3QgdV9sb25nIF9fcHJvZywKKwkJCQkgICAgX19jb25zdCB1X2xvbmcgX192ZXJzLAorCQkJCSAgICBfX2NvbnN0IHVfbG9uZyBfX3Byb2MsCisJCQkJICAgIHhkcnByb2NfdCBfX3hkcmFyZ3MsCisJCQkJICAgIGNhZGRyX3QgX19hcmdzcCwgeGRycHJvY190IF9feGRycmVzLAorCQkJCSAgICBjYWRkcl90IF9fcmVzcCwgc3RydWN0IHRpbWV2YWwgX190b3V0LAorCQkJCSAgICB1X2xvbmcgKl9fcG9ydF9wdHIpIF9fVEhST1c7CitleHRlcm4gZW51bSBjbG50X3N0YXQgY2xudF9icm9hZGNhc3QgKF9fY29uc3QgdV9sb25nIF9fcHJvZywKKwkJCQkgICAgICBfX2NvbnN0IHVfbG9uZyBfX3ZlcnMsCisJCQkJICAgICAgX19jb25zdCB1X2xvbmcgX19wcm9jLCB4ZHJwcm9jX3QgX194YXJncywKKwkJCQkgICAgICBjYWRkcl90IF9fYXJnc3AsIHhkcnByb2NfdCBfX3hyZXN1bHRzLAorCQkJCSAgICAgIGNhZGRyX3QgX19yZXN1bHRzcCwKKwkJCQkgICAgICByZXN1bHRwcm9jX3QgX19lYWNocmVzdWx0KSBfX1RIUk9XOworZXh0ZXJuIHVfc2hvcnQgcG1hcF9nZXRwb3J0IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKl9fYWRkcmVzcywKKwkJCSAgICAgX19jb25zdCB1X2xvbmcgX19wcm9ncmFtLAorCQkJICAgICBfX2NvbnN0IHVfbG9uZyBfX3ZlcnNpb24sIHVfaW50IF9fcHJvdG9jb2wpCisgICAgIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBycGMvcG1hcF9jbG50LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3BtYXBfcHJvdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvcG1hcF9wcm90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVmZDdjYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3BtYXBfcHJvdC5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogcG1hcF9wcm90LmgKKyAqIFByb3RvY29sIGZvciB0aGUgbG9jYWwgYmluZGVyIHNlcnZpY2UsIG9yIHBtYXAuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfUlBDX1BNQVBfUFJPVF9ICisjZGVmaW5lIF9SUENfUE1BUF9QUk9UX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPHJwYy94ZHIuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBUaGUgZm9sbG93aW5nIHByb2NlZHVyZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgcHJvdG9jb2w6CisgKgorICogUE1BUFBST0NfTlVMTCgpIHJldHVybnMgKCkKKyAqCXRha2VzIG5vdGhpbmcsIHJldHVybnMgbm90aGluZworICoKKyAqIFBNQVBQUk9DX1NFVChzdHJ1Y3QgcG1hcCkgcmV0dXJucyAoYm9vbF90KQorICoJVFJVRSBpcyBzdWNjZXNzLCBGQUxTRSBpcyBmYWlsdXJlLiAgUmVnaXN0ZXJzIHRoZSB0dXBsZQorICoJW3Byb2csIHZlcnMsIHByb3QsIHBvcnRdLgorICoKKyAqIFBNQVBQUk9DX1VOU0VUKHN0cnVjdCBwbWFwKSByZXR1cm5zIChib29sX3QpCisgKglUUlVFIGlzIHN1Y2Nlc3MsIEZBTFNFIGlzIGZhaWx1cmUuICBVbi1yZWdpc3RlcnMgcGFpcgorICoJW3Byb2csIHZlcnNdLiAgcHJvdCBhbmQgcG9ydCBhcmUgaWdub3JlZC4KKyAqCisgKiBQTUFQUFJPQ19HRVRQT1JUKHN0cnVjdCBwbWFwKSByZXR1cm5zIChsb25nIHVuc2lnbmVkKS4KKyAqCTAgaXMgZmFpbHVyZS4gIE90aGVyd2lzZSByZXR1cm5zIHRoZSBwb3J0IG51bWJlciB3aGVyZSB0aGUgcGFpcgorICoJW3Byb2csIHZlcnNdIGlzIHJlZ2lzdGVyZWQuICBJdCBtYXkgbGllIQorICoKKyAqIFBNQVBQUk9DX0RVTVAoKSBSRVRVUk5TIChzdHJ1Y3QgcG1hcGxpc3QgKikKKyAqCisgKiBQTUFQUFJPQ19DQUxMSVQodW5zaWduZWQsIHVuc2lnbmVkLCB1bnNpZ25lZCwgc3RyaW5nPD4pCisgKglSRVRVUk5TIChwb3J0LCBzdHJpbmc8Pik7CisgKiB1c2FnZTogZW5jYXBzdWxhdGVkcmVzdWx0cyA9IFBNQVBQUk9DX0NBTExJVChwcm9nLCB2ZXJzLCBwcm9jLCBlbmNhcHN1bGF0ZWRhcmdzKTsKKyAqCUNhbGxzIHRoZSBwcm9jZWR1cmUgb24gdGhlIGxvY2FsIG1hY2hpbmUuICBJZiBpdCBpcyBub3QgcmVnaXN0ZXJlZCwKKyAqCXRoaXMgcHJvY2VkdXJlIGlzIHF1aXRlOyBpZSBpdCBkb2VzIG5vdCByZXR1cm4gZXJyb3IgaW5mb3JtYXRpb24hISEKKyAqCVRoaXMgcHJvY2VkdXJlIG9ubHkgaXMgc3VwcG9ydGVkIG9uIHJwYy91ZHAgYW5kIGNhbGxzIHZpYQorICoJcnBjL3VkcC4gIFRoaXMgcm91dGluZSBvbmx5IHBhc3NlcyBudWxsIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnMuCisgKglUaGlzIGZpbGUgaGFzIG5vIGludGVyZmFjZSB0byB4ZHIgcm91dGluZXMgZm9yIFBNQVBQUk9DX0NBTExJVC4KKyAqCisgKiBUaGUgc2VydmljZSBzdXBwb3J0cyByZW1vdGUgcHJvY2VkdXJlIGNhbGxzIG9uIHVkcC9pcCBvciB0Y3AvaXAgc29ja2V0IDExMS4KKyAqLworCisjZGVmaW5lIFBNQVBQT1JUCQkoKHVfc2hvcnQpMTExKQorI2RlZmluZSBQTUFQUFJPRwkJKCh1X2xvbmcpMTAwMDAwKQorI2RlZmluZSBQTUFQVkVSUwkJKCh1X2xvbmcpMikKKyNkZWZpbmUgUE1BUFZFUlNfUFJPVE8JCSgodV9sb25nKTIpCisjZGVmaW5lIFBNQVBWRVJTX09SSUcJCSgodV9sb25nKTEpCisjZGVmaW5lIFBNQVBQUk9DX05VTEwJCSgodV9sb25nKTApCisjZGVmaW5lIFBNQVBQUk9DX1NFVAkJKCh1X2xvbmcpMSkKKyNkZWZpbmUgUE1BUFBST0NfVU5TRVQJCSgodV9sb25nKTIpCisjZGVmaW5lIFBNQVBQUk9DX0dFVFBPUlQJKCh1X2xvbmcpMykKKyNkZWZpbmUgUE1BUFBST0NfRFVNUAkJKCh1X2xvbmcpNCkKKyNkZWZpbmUgUE1BUFBST0NfQ0FMTElUCQkoKHVfbG9uZyk1KQorCitzdHJ1Y3QgcG1hcCB7CisJbG9uZyB1bnNpZ25lZCBwbV9wcm9nOworCWxvbmcgdW5zaWduZWQgcG1fdmVyczsKKwlsb25nIHVuc2lnbmVkIHBtX3Byb3Q7CisJbG9uZyB1bnNpZ25lZCBwbV9wb3J0OworfTsKKworZXh0ZXJuIGJvb2xfdCB4ZHJfcG1hcCAoWERSICpfX3hkcnMsIHN0cnVjdCBwbWFwICpfX3JlZ3MpIF9fVEhST1c7CisKK3N0cnVjdCBwbWFwbGlzdCB7CisJc3RydWN0IHBtYXAJcG1sX21hcDsKKwlzdHJ1Y3QgcG1hcGxpc3QgKnBtbF9uZXh0OworfTsKKworZXh0ZXJuIGJvb2xfdCB4ZHJfcG1hcGxpc3QgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgcG1hcGxpc3QgKipfX3JwKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcnBjL3BtYXBfcHJvdC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9wbWFwX3JtdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvcG1hcF9ybXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODY4MDE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvcG1hcF9ybXQuaApAQCAtMCwwICsxLDY1IEBACisvKgorICogU3RydWN0dXJlcyBhbmQgWERSIHJvdXRpbmVzIGZvciBwYXJhbWV0ZXJzIHRvIGFuZCByZXBsaWVzIGZyb20KKyAqIHRoZSBwb3J0bWFwcGVyIHJlbW90ZS1jYWxsLXNlcnZpY2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfUlBDX1BNQVBfUk1UX0gKKyNkZWZpbmUgX1JQQ19QTUFQX1JNVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8cnBjL3R5cGVzLmg+CisjaW5jbHVkZSA8cnBjL3hkci5oPgorCitfX0JFR0lOX0RFQ0xTCisKK3N0cnVjdCBybXRjYWxsYXJncyB7CisJdV9sb25nIHByb2csIHZlcnMsIHByb2MsIGFyZ2xlbjsKKwljYWRkcl90IGFyZ3NfcHRyOworCXhkcnByb2NfdCB4ZHJfYXJnczsKK307CisKK2V4dGVybiBib29sX3QgeGRyX3JtdGNhbGxfYXJncyAoWERSICpfX3hkcnMsIHN0cnVjdCBybXRjYWxsYXJncyAqX19jcnApCisgICAgIF9fVEhST1c7CisKK3N0cnVjdCBybXRjYWxscmVzIHsKKwl1X2xvbmcgKnBvcnRfcHRyOworCXVfbG9uZyByZXN1bHRzbGVuOworCWNhZGRyX3QgcmVzdWx0c19wdHI7CisJeGRycHJvY190IHhkcl9yZXN1bHRzOworfTsKKworZXh0ZXJuIGJvb2xfdCB4ZHJfcm10Y2FsbHJlcyAoWERSICpfX3hkcnMsIHN0cnVjdCBybXRjYWxscmVzICpfX2NycCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHJwYy9wbWFwX3JtdC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9ycGMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3JwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3M2E0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9ycGMuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogcnBjLmgsIEp1c3QgaW5jbHVkZXMgdGhlIGJpbGxpb25zIG9mIHJwYyBoZWFkZXIgZmlsZXMgbmVjZXNzYXJ5IHRvCisgKiBkbyByZW1vdGUgcHJvY2VkdXJlIGNhbGxpbmcuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfUlBDX1JQQ19ICisjZGVmaW5lIF9SUENfUlBDX0ggMQorCisjaW5jbHVkZSA8cnBjL3R5cGVzLmg+CQkvKiBzb21lIHR5cGVkZWZzICovCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisvKiBleHRlcm5hbCBkYXRhIHJlcHJlc2VudGF0aW9uIGludGVyZmFjZXMgKi8KKyNpbmNsdWRlIDxycGMveGRyLmg+CQkvKiBnZW5lcmljIChkZSlzZXJpYWxpemVyICovCisKKy8qIENsaWVudCBzaWRlIG9ubHkgYXV0aGVudGljYXRpb24gKi8KKyNpbmNsdWRlIDxycGMvYXV0aC5oPgkJLyogZ2VuZXJpYyBhdXRoZW50aWNhdG9yIChjbGllbnQgc2lkZSkgKi8KKworLyogQ2xpZW50IHNpZGUgKG1vc3RseSkgcmVtb3RlIHByb2NlZHVyZSBjYWxsICovCisjaW5jbHVkZSA8cnBjL2NsbnQuaD4JCS8qIGdlbmVyaWMgcnBjIHN0dWZmICovCisKKy8qIHNlbWktcHJpdmF0ZSBwcm90b2NvbCBoZWFkZXJzICovCisjaW5jbHVkZSA8cnBjL3JwY19tc2cuaD4JLyogcHJvdG9jb2wgZm9yIHJwYyBtZXNzYWdlcyAqLworI2luY2x1ZGUgPHJwYy9hdXRoX3VuaXguaD4JLyogcHJvdG9jb2wgZm9yIHVuaXggc3R5bGUgY3JlZCAqLworI2luY2x1ZGUgPHJwYy9hdXRoX2Rlcy5oPgkvKiBwcm90b2NvbCBmb3IgZGVzIHN0eWxlIGNyZWQgKi8KKworLyogU2VydmVyIHNpZGUgb25seSByZW1vdGUgcHJvY2VkdXJlIGNhbGxlZSAqLworI2luY2x1ZGUgPHJwYy9zdmMuaD4JCS8qIHNlcnZpY2UgbWFuYWdlciBhbmQgbXVsdGlwbGV4ZXIgKi8KKyNpbmNsdWRlIDxycGMvc3ZjX2F1dGguaD4JLyogc2VydmljZSBzaWRlIGF1dGhlbnRpY2F0b3IgKi8KKworLyoKKyAqIENPTU1FTlQgT1VUIFRIRSBORVhUIElOQ0xVREUgSUYgUlVOTklORyBPTiBTVU4gT1MgT1IgT04gQSBWRVJTSU9OCisgKiBPRiBVTklYIEJBU0VEIE9OIE5GU1NSQy4gIFRoZXNlIHN5c3RlbXMgd2lsbCBhbHJlYWR5IGhhdmUgdGhlIHN0cnVjdHVyZXMKKyAqIGRlZmluZWQgYnkgPHJwYy9uZXRkYi5oPiBpbmNsdWRlZCBpbiA8bmV0ZGIuaD4uCisgKi8KKy8qIHJvdXRpbmVzIGZvciBwYXJzaW5nIC9ldGMvcnBjICovCisjaW5jbHVkZSA8cnBjL25ldGRiLmg+CQkvKiBzdHJ1Y3R1cmVzIGFuZCByb3V0aW5lcyB0byBwYXJzZSAvZXRjL3JwYyAqLworCitfX0JFR0lOX0RFQ0xTCisKKy8qIEdsb2JhbCB2YXJpYWJsZXMsIHByb3RlY3RlZCBmb3IgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zLiAgKi8KK2V4dGVybiBmZF9zZXQgKl9fcnBjX3RocmVhZF9zdmNfZmRzZXQgKHZvaWQpIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKyNkZWZpbmUgc3ZjX2Zkc2V0ICgqX19ycGNfdGhyZWFkX3N2Y19mZHNldCAoKSkKKworZXh0ZXJuIHN0cnVjdCBycGNfY3JlYXRlZXJyICpfX3JwY190aHJlYWRfY3JlYXRlZXJyICh2b2lkKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisjZGVmaW5lIGdldF9ycGNfY3JlYXRlZXJyKCkgKCpfX3JwY190aHJlYWRfY3JlYXRlZXJyICgpKQorLyogVGhlIHBlb3BsZSB3aG8gImVuZ2luZWVyZWQiIFJQQyBzaG91bGQgYmVlIHB1bmlzaGVkIGZvciBuYW1pbmcgdGhlCisgICBkYXRhIHN0cnVjdHVyZSBhbmQgdGhlIHZhcmlhYmxlIHRoZSBzYW1lLiAgV2UgY2Fubm90IGFsd2F5cyBkZWZpbmUgdGhlCisgICBtYWNybyAncnBjX2NyZWF0ZWVycicgYmVjYXVzZSB0aGlzIHdvdWxkIHByZXZlbnQgcGVvcGxlIGZyb20gZGVmaW5pbmcKKyAgIG9iamVjdCBvZiB0eXBlICdzdHJ1Y3QgcnBjX2NyZWF0ZWVycicuICBTbyB3ZSBsZWF2ZSBpdCB1cCB0byB0aGUgdXNlcgorICAgdG8gc2VsZWN0IHRyYW5zcGFyZW50IHJlcGxhY2VtZW50IGFsc28gb2YgdGhpcyB2YXJpYWJsZS4gICovCisjaWZkZWYgX1JQQ19NVF9WQVJTCisjIGRlZmluZSBycGNfY3JlYXRlZXJyICgqX19ycGNfdGhyZWFkX2NyZWF0ZWVyciAoKSkKKyNlbmRpZgorCitleHRlcm4gc3RydWN0IHBvbGxmZCAqKl9fcnBjX3RocmVhZF9zdmNfcG9sbGZkICh2b2lkKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisjZGVmaW5lIHN2Y19wb2xsZmQgKCpfX3JwY190aHJlYWRfc3ZjX3BvbGxmZCAoKSkKKworZXh0ZXJuIGludCAqX19ycGNfdGhyZWFkX3N2Y19tYXhfcG9sbGZkICh2b2lkKSBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisjZGVmaW5lIHN2Y19tYXhfcG9sbGZkICgqX19ycGNfdGhyZWFkX3N2Y19tYXhfcG9sbGZkICgpKQorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcnBjL3JwYy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9ycGNfZGVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9ycGNfZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIzYzQyNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3JwY19kZXMuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogR2VuZXJpYyBERVMgZHJpdmVyIGludGVyZmFjZQorICogS2VlcCB0aGlzIGZpbGUgaGFyZHdhcmUgaW5kZXBlbmRlbnQhCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9ERVNfSAorI2RlZmluZSBfREVTX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjZGVmaW5lIERFU19NQVhMRU4JNjU1MzYJLyogbWF4aW11bSAjIG9mIGJ5dGVzIHRvIGVuY3J5cHQgICovCisjZGVmaW5lIERFU19RVUlDS0xFTgkxNgkvKiBtYXhpbXVtICMgb2YgYnl0ZXMgdG8gZW5jcnlwdCBxdWlja2x5ICovCisKK2VudW0gZGVzZGlyCisgIHsKKyAgICBFTkNSWVBULCBERUNSWVBUCisgIH07CitlbnVtIGRlc21vZGUKKyAgeworICAgIENCQywgRUNCCisgIH07CisKKy8qCisgKiBwYXJhbWV0ZXJzIHRvIGlvY3RsIGNhbGwKKyAqLworc3RydWN0IGRlc3BhcmFtcworICB7CisgICAgdV9jaGFyIGRlc19rZXlbOF07CQkvKiBrZXkgKHdpdGggbG93IGJpdCBwYXJpdHkpICovCisgICAgZW51bSBkZXNkaXIgZGVzX2RpcjsJLyogZGlyZWN0aW9uICovCisgICAgZW51bSBkZXNtb2RlIGRlc19tb2RlOwkvKiBtb2RlICovCisgICAgdV9jaGFyIGRlc19pdmVjWzhdOwkJLyogaW5wdXQgdmVjdG9yICovCisgICAgdW5zaWduZWQgZGVzX2xlbjsJCS8qIG51bWJlciBvZiBieXRlcyB0byBjcnlwdCAqLworICAgIHVuaW9uCisgICAgICB7CisJdV9jaGFyIFVERVNfZGF0YVtERVNfUVVJQ0tMRU5dOworCXVfY2hhciAqVURFU19idWY7CisgICAgICB9CisgICAgVURFUzsKKyNkZWZpbmUgZGVzX2RhdGEgVURFUy5VREVTX2RhdGEJLyogZGlyZWN0IGRhdGEgaGVyZSBpZiBxdWljayAqLworI2RlZmluZSBkZXNfYnVmCVVERVMuVURFU19idWYJLyogb3RoZXJ3aXNlLCBwb2ludGVyIHRvIGRhdGEgKi8KKyAgfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9ycGNfbXNnLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9ycGNfbXNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczYjE4NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3JwY19tc2cuaApAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIHJwY19tc2cuaAorICogcnBjIG1lc3NhZ2UgZGVmaW5pdGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1JQQ19NU0dfSAorI2RlZmluZSBfUlBDX01TR19IIDEKKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorCisjaW5jbHVkZSA8cnBjL3hkci5oPgorI2luY2x1ZGUgPHJwYy9jbG50Lmg+CisKKyNkZWZpbmUgUlBDX01TR19WRVJTSU9OCQkoKHVfbG9uZykgMikKKyNkZWZpbmUgUlBDX1NFUlZJQ0VfUE9SVAkoKHVfc2hvcnQpIDIwNDgpCisKK19fQkVHSU5fREVDTFMKKworLyoKKyAqIEJvdHRvbSB1cCBkZWZpbml0aW9uIG9mIGFuIHJwYyBtZXNzYWdlLgorICogTk9URTogY2FsbCBhbmQgcmVwbHkgdXNlIHRoZSBzYW1lIG92ZXJhbGwgc3RydWN0IGJ1dAorICogZGlmZmVyZW50IHBhcnRzIG9mIHVuaW9ucyB3aXRoaW4gaXQuCisgKi8KKworZW51bSBtc2dfdHlwZSB7CisJQ0FMTD0wLAorCVJFUExZPTEKK307CisKK2VudW0gcmVwbHlfc3RhdCB7CisJTVNHX0FDQ0VQVEVEPTAsCisJTVNHX0RFTklFRD0xCit9OworCitlbnVtIGFjY2VwdF9zdGF0IHsKKwlTVUNDRVNTPTAsCisJUFJPR19VTkFWQUlMPTEsCisJUFJPR19NSVNNQVRDSD0yLAorCVBST0NfVU5BVkFJTD0zLAorCUdBUkJBR0VfQVJHUz00LAorCVNZU1RFTV9FUlI9NQorfTsKKworZW51bSByZWplY3Rfc3RhdCB7CisJUlBDX01JU01BVENIPTAsCisJQVVUSF9FUlJPUj0xCit9OworCisvKgorICogUmVwbHkgcGFydCBvZiBhbiBycGMgZXhjaGFuZ2UKKyAqLworCisvKgorICogUmVwbHkgdG8gYW4gcnBjIHJlcXVlc3QgdGhhdCB3YXMgYWNjZXB0ZWQgYnkgdGhlIHNlcnZlci4KKyAqIE5vdGU6IHRoZXJlIGNvdWxkIGJlIGFuIGVycm9yIGV2ZW4gdGhvdWdoIHRoZSByZXF1ZXN0IHdhcworICogYWNjZXB0ZWQuCisgKi8KK3N0cnVjdCBhY2NlcHRlZF9yZXBseSB7CisJc3RydWN0IG9wYXF1ZV9hdXRoCWFyX3ZlcmY7CisJZW51bSBhY2NlcHRfc3RhdAlhcl9zdGF0OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVfbG9uZwlsb3c7CisJCQl1X2xvbmcJaGlnaDsKKwkJfSBBUl92ZXJzaW9uczsKKwkJc3RydWN0IHsKKwkJCWNhZGRyX3QJd2hlcmU7CisJCQl4ZHJwcm9jX3QgcHJvYzsKKwkJfSBBUl9yZXN1bHRzOworCQkvKiBhbmQgbWFueSBvdGhlciBudWxsIGNhc2VzICovCisJfSBydTsKKyNkZWZpbmUJYXJfcmVzdWx0cwlydS5BUl9yZXN1bHRzCisjZGVmaW5lCWFyX3ZlcnMJCXJ1LkFSX3ZlcnNpb25zCit9OworCisvKgorICogUmVwbHkgdG8gYW4gcnBjIHJlcXVlc3QgdGhhdCB3YXMgcmVqZWN0ZWQgYnkgdGhlIHNlcnZlci4KKyAqLworc3RydWN0IHJlamVjdGVkX3JlcGx5IHsKKwllbnVtIHJlamVjdF9zdGF0IHJqX3N0YXQ7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdV9sb25nIGxvdzsKKwkJCXVfbG9uZyBoaWdoOworCQl9IFJKX3ZlcnNpb25zOworCQllbnVtIGF1dGhfc3RhdCBSSl93aHk7ICAvKiB3aHkgYXV0aGVudGljYXRpb24gZGlkIG5vdCB3b3JrICovCisJfSBydTsKKyNkZWZpbmUJcmpfdmVycwlydS5SSl92ZXJzaW9ucworI2RlZmluZQlyal93aHkJcnUuUkpfd2h5Cit9OworCisvKgorICogQm9keSBvZiBhIHJlcGx5IHRvIGFuIHJwYyByZXF1ZXN0LgorICovCitzdHJ1Y3QgcmVwbHlfYm9keSB7CisJZW51bSByZXBseV9zdGF0IHJwX3N0YXQ7CisJdW5pb24geworCQlzdHJ1Y3QgYWNjZXB0ZWRfcmVwbHkgUlBfYXI7CisJCXN0cnVjdCByZWplY3RlZF9yZXBseSBSUF9kcjsKKwl9IHJ1OworI2RlZmluZQlycF9hY3B0CXJ1LlJQX2FyCisjZGVmaW5lCXJwX3JqY3QJcnUuUlBfZHIKK307CisKKy8qCisgKiBCb2R5IG9mIGFuIHJwYyByZXF1ZXN0IGNhbGwuCisgKi8KK3N0cnVjdCBjYWxsX2JvZHkgeworCXVfbG9uZyBjYl9ycGN2ZXJzOwkvKiBtdXN0IGJlIGVxdWFsIHRvIHR3byAqLworCXVfbG9uZyBjYl9wcm9nOworCXVfbG9uZyBjYl92ZXJzOworCXVfbG9uZyBjYl9wcm9jOworCXN0cnVjdCBvcGFxdWVfYXV0aCBjYl9jcmVkOworCXN0cnVjdCBvcGFxdWVfYXV0aCBjYl92ZXJmOyAvKiBwcm90b2NvbCBzcGVjaWZpYyAtIHByb3ZpZGVkIGJ5IGNsaWVudCAqLworfTsKKworLyoKKyAqIFRoZSBycGMgbWVzc2FnZQorICovCitzdHJ1Y3QgcnBjX21zZyB7CisJdV9sb25nCQkJcm1feGlkOworCWVudW0gbXNnX3R5cGUJCXJtX2RpcmVjdGlvbjsKKwl1bmlvbiB7CisJCXN0cnVjdCBjYWxsX2JvZHkgUk1fY21iOworCQlzdHJ1Y3QgcmVwbHlfYm9keSBSTV9ybWI7CisJfSBydTsKKyNkZWZpbmUJcm1fY2FsbAkJcnUuUk1fY21iCisjZGVmaW5lCXJtX3JlcGx5CXJ1LlJNX3JtYgorfTsKKyNkZWZpbmUJYWNwdGVkX3JwbHkJcnUuUk1fcm1iLnJ1LlJQX2FyCisjZGVmaW5lCXJqY3RlZF9ycGx5CXJ1LlJNX3JtYi5ydS5SUF9kcgorCisKKy8qCisgKiBYRFIgcm91dGluZSB0byBoYW5kbGUgYSBycGMgbWVzc2FnZS4KKyAqIHhkcl9jYWxsbXNnKHhkcnMsIGNtc2cpCisgKiAJWERSICp4ZHJzOworICogCXN0cnVjdCBycGNfbXNnICpjbXNnOworICovCitleHRlcm4gYm9vbF90CXhkcl9jYWxsbXNnIChYRFIgKl9feGRycywgc3RydWN0IHJwY19tc2cgKl9fY21zZykgX19USFJPVzsKKworLyoKKyAqIFhEUiByb3V0aW5lIHRvIHByZS1zZXJpYWxpemUgdGhlIHN0YXRpYyBwYXJ0IG9mIGEgcnBjIG1lc3NhZ2UuCisgKiB4ZHJfY2FsbGhkcih4ZHJzLCBjbXNnKQorICogCVhEUiAqeGRyczsKKyAqIAlzdHJ1Y3QgcnBjX21zZyAqY21zZzsKKyAqLworZXh0ZXJuIGJvb2xfdAl4ZHJfY2FsbGhkciAoWERSICpfX3hkcnMsIHN0cnVjdCBycGNfbXNnICpfX2Ntc2cpIF9fVEhST1c7CisKKy8qCisgKiBYRFIgcm91dGluZSB0byBoYW5kbGUgYSBycGMgcmVwbHkuCisgKiB4ZHJfcmVwbHltc2coeGRycywgcm1zZykKKyAqIAlYRFIgKnhkcnM7CisgKiAJc3RydWN0IHJwY19tc2cgKnJtc2c7CisgKi8KK2V4dGVybiBib29sX3QJeGRyX3JlcGx5bXNnIChYRFIgKl9feGRycywgc3RydWN0IHJwY19tc2cgKl9fcm1zZykgX19USFJPVzsKKworLyoKKyAqIEZpbGxzIGluIHRoZSBlcnJvciBwYXJ0IG9mIGEgcmVwbHkgbWVzc2FnZS4KKyAqIF9zZXRlcnJfcmVwbHkobXNnLCBlcnJvcikKKyAqIAlzdHJ1Y3QgcnBjX21zZyAqbXNnOworICogCXN0cnVjdCBycGNfZXJyICplcnJvcjsKKyAqLworZXh0ZXJuIHZvaWQJX3NldGVycl9yZXBseSAoc3RydWN0IHJwY19tc2cgKl9fbXNnLCBzdHJ1Y3QgcnBjX2VyciAqX19lcnJvcikKKyAgICAgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHJwYy9ycGNfbXNnLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3N2Yy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvc3ZjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRkMWFjMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3N2Yy5oCkBAIC0wLDAgKzEsMzE5IEBACisvKgorICogc3ZjLmgsIFNlcnZlci1zaWRlIHJlbW90ZSBwcm9jZWR1cmUgY2FsbCBpbnRlcmZhY2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfUlBDX1NWQ19ICisjZGVmaW5lIF9SUENfU1ZDX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxycGMvcnBjX21zZy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qCisgKiBUaGlzIGludGVyZmFjZSBtdXN0IG1hbmFnZSB0d28gaXRlbXMgY29uY2VybmluZyByZW1vdGUgcHJvY2VkdXJlIGNhbGxpbmc6CisgKgorICogMSkgQW4gYXJiaXRyYXJ5IG51bWJlciBvZiB0cmFuc3BvcnQgY29ubmVjdGlvbnMgdXBvbiB3aGljaCBycGMgcmVxdWVzdHMKKyAqIGFyZSByZWNlaXZlZC4gIFRoZSB0d28gbW9zdCBub3RhYmxlIHRyYW5zcG9ydHMgYXJlIFRDUCBhbmQgVURQOyAgdGhleSBhcmUKKyAqIGNyZWF0ZWQgYW5kIHJlZ2lzdGVyZWQgYnkgcm91dGluZXMgaW4gc3ZjX3RjcC5jIGFuZCBzdmNfdWRwLmMsIHJlc3BlY3RpdmVseTsKKyAqIHRoZXkgaW4gdHVybiBjYWxsIHhwcnRfcmVnaXN0ZXIgYW5kIHhwcnRfdW5yZWdpc3Rlci4KKyAqCisgKiAyKSBBbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGxvY2FsbHkgcmVnaXN0ZXJlZCBzZXJ2aWNlcy4gIFNlcnZpY2VzIGFyZQorICogZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgZm91ciBkYXRhOiBwcm9ncmFtIG51bWJlciwgdmVyc2lvbiBudW1iZXIsCisgKiAic2VydmljZSBkaXNwYXRjaCIgZnVuY3Rpb24sIGEgdHJhbnNwb3J0IGhhbmRsZSwgYW5kIGEgYm9vbGVhbiB0aGF0CisgKiBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGV4cG9ydGVkIHByb2dyYW0gc2hvdWxkIGJlIHJlZ2lzdGVyZWQgd2l0aCBhCisgKiBsb2NhbCBiaW5kZXIgc2VydmljZTsgIGlmIHRydWUgdGhlIHByb2dyYW0ncyBudW1iZXIgYW5kIHZlcnNpb24gYW5kIHRoZQorICogcG9ydCBudW1iZXIgZnJvbSB0aGUgdHJhbnNwb3J0IGhhbmRsZSBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBiaW5kZXIuCisgKiBUaGVzZSBkYXRhIGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIHJwYyBzdmMgc3lzdGVtIHZpYSBzdmNfcmVnaXN0ZXIuCisgKgorICogQSBzZXJ2aWNlJ3MgZGlzcGF0Y2ggZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIGFuIHJwYyByZXF1ZXN0IGNvbWVzIGluCisgKiBvbiBhIHRyYW5zcG9ydC4gIFRoZSByZXF1ZXN0J3MgcHJvZ3JhbSBhbmQgdmVyc2lvbiBudW1iZXJzIG11c3QgbWF0Y2gKKyAqIHRob3NlIG9mIHRoZSByZWdpc3RlcmVkIHNlcnZpY2UuICBUaGUgZGlzcGF0Y2ggZnVuY3Rpb24gaXMgcGFzc2VkIHR3bworICogcGFyYW1ldGVycywgc3RydWN0IHN2Y19yZXEgKiBhbmQgU1ZDWFBSVCAqLCBkZWZpbmVkIGJlbG93LgorICovCisKK2VudW0geHBydF9zdGF0IHsKKwlYUFJUX0RJRUQsCisJWFBSVF9NT1JFUkVRUywKKwlYUFJUX0lETEUKK307CisKKy8qCisgKiBTZXJ2ZXIgc2lkZSB0cmFuc3BvcnQgaGFuZGxlCisgKi8KK3R5cGVkZWYgc3RydWN0IFNWQ1hQUlQgU1ZDWFBSVDsKK3N0cnVjdCBTVkNYUFJUIHsKKyAgaW50IHhwX3NvY2s7CisgIHVfc2hvcnQgeHBfcG9ydDsJCS8qIGFzc29jaWF0ZWQgcG9ydCBudW1iZXIgKi8KKyAgY29uc3Qgc3RydWN0IHhwX29wcyB7CisgICAgYm9vbF90CSgqeHBfcmVjdikgKFNWQ1hQUlQgKl9feHBydCwgc3RydWN0IHJwY19tc2cgKl9fbXNnKTsKKwkJCQkvKiByZWNlaXZlIGluY29taW5nIHJlcXVlc3RzICovCisgICAgZW51bSB4cHJ0X3N0YXQgKCp4cF9zdGF0KSAoU1ZDWFBSVCAqX194cHJ0KTsKKwkJCQkvKiBnZXQgdHJhbnNwb3J0IHN0YXR1cyAqLworICAgIGJvb2xfdAkoKnhwX2dldGFyZ3MpIChTVkNYUFJUICpfX3hwcnQsIHhkcnByb2NfdCBfX3hkcl9hcmdzLAorCQkJICAgICAgIGNhZGRyX3QgX19hcmdzX3B0cik7IC8qIGdldCBhcmd1bWVudHMgKi8KKyAgICBib29sX3QJKCp4cF9yZXBseSkgKFNWQ1hQUlQgKl9feHBydCwgc3RydWN0IHJwY19tc2cgKl9fbXNnKTsKKwkJCQkvKiBzZW5kIHJlcGx5ICovCisgICAgYm9vbF90CSgqeHBfZnJlZWFyZ3MpIChTVkNYUFJUICpfX3hwcnQsIHhkcnByb2NfdCBfX3hkcl9hcmdzLAorCQkJCWNhZGRyX3QgX19hcmdzX3B0cik7CisJCQkJLyogZnJlZSBtZW0gYWxsb2NhdGVkIGZvciBhcmdzICovCisgICAgdm9pZAkoKnhwX2Rlc3Ryb3kpIChTVkNYUFJUICpfX3hwcnQpOworCQkJCS8qIGRlc3Ryb3kgdGhpcyBzdHJ1Y3QgKi8KKyAgfSAqeHBfb3BzOworICBpbnQJCXhwX2FkZHJsZW47CSAvKiBsZW5ndGggb2YgcmVtb3RlIGFkZHJlc3MgKi8KKyAgc3RydWN0IHNvY2thZGRyX2luIHhwX3JhZGRyOwkgLyogcmVtb3RlIGFkZHJlc3MgKi8KKyAgc3RydWN0IG9wYXF1ZV9hdXRoIHhwX3ZlcmY7CSAvKiByYXcgcmVzcG9uc2UgdmVyaWZpZXIgKi8KKyAgY2FkZHJfdAkJeHBfcDE7CQkgLyogcHJpdmF0ZSAqLworICBjYWRkcl90CQl4cF9wMjsJCSAvKiBwcml2YXRlICovCisgIGNoYXIJCXhwX3BhZCBbMjU2XTsJLyogcGFkZGluZywgaW50ZXJuYWwgdXNlICovCit9OworCisvKgorICogIEFwcHJvdmVkIHdheSBvZiBnZXR0aW5nIGFkZHJlc3Mgb2YgY2FsbGVyCisgKi8KKyNkZWZpbmUgc3ZjX2dldGNhbGxlcih4KSAoJih4KS0+eHBfcmFkZHIpCisKKy8qCisgKiBPcGVyYXRpb25zIGRlZmluZWQgb24gYW4gU1ZDWFBSVCBoYW5kbGUKKyAqCisgKiBTVkNYUFJUCQkqeHBydDsKKyAqIHN0cnVjdCBycGNfbXNnCSptc2c7CisgKiB4ZHJwcm9jX3QJCSB4YXJnczsKKyAqIGNhZGRyX3QJCSBhcmdzcDsKKyAqLworI2RlZmluZSBTVkNfUkVDVih4cHJ0LCBtc2cpCQkJCVwKKwkoKih4cHJ0KS0+eHBfb3BzLT54cF9yZWN2KSgoeHBydCksIChtc2cpKQorI2RlZmluZSBzdmNfcmVjdih4cHJ0LCBtc2cpCQkJCVwKKwkoKih4cHJ0KS0+eHBfb3BzLT54cF9yZWN2KSgoeHBydCksIChtc2cpKQorCisjZGVmaW5lIFNWQ19TVEFUKHhwcnQpCQkJCQlcCisJKCooeHBydCktPnhwX29wcy0+eHBfc3RhdCkoeHBydCkKKyNkZWZpbmUgc3ZjX3N0YXQoeHBydCkJCQkJCVwKKwkoKih4cHJ0KS0+eHBfb3BzLT54cF9zdGF0KSh4cHJ0KQorCisjZGVmaW5lIFNWQ19HRVRBUkdTKHhwcnQsIHhhcmdzLCBhcmdzcCkJCQlcCisJKCooeHBydCktPnhwX29wcy0+eHBfZ2V0YXJncykoKHhwcnQpLCAoeGFyZ3MpLCAoYXJnc3ApKQorI2RlZmluZSBzdmNfZ2V0YXJncyh4cHJ0LCB4YXJncywgYXJnc3ApCQkJXAorCSgqKHhwcnQpLT54cF9vcHMtPnhwX2dldGFyZ3MpKCh4cHJ0KSwgKHhhcmdzKSwgKGFyZ3NwKSkKKworI2RlZmluZSBTVkNfUkVQTFkoeHBydCwgbXNnKQkJCQlcCisJKCooeHBydCktPnhwX29wcy0+eHBfcmVwbHkpICgoeHBydCksIChtc2cpKQorI2RlZmluZSBzdmNfcmVwbHkoeHBydCwgbXNnKQkJCQlcCisJKCooeHBydCktPnhwX29wcy0+eHBfcmVwbHkpICgoeHBydCksIChtc2cpKQorCisjZGVmaW5lIFNWQ19GUkVFQVJHUyh4cHJ0LCB4YXJncywgYXJnc3ApCQlcCisJKCooeHBydCktPnhwX29wcy0+eHBfZnJlZWFyZ3MpKCh4cHJ0KSwgKHhhcmdzKSwgKGFyZ3NwKSkKKyNkZWZpbmUgc3ZjX2ZyZWVhcmdzKHhwcnQsIHhhcmdzLCBhcmdzcCkJCVwKKwkoKih4cHJ0KS0+eHBfb3BzLT54cF9mcmVlYXJncykoKHhwcnQpLCAoeGFyZ3MpLCAoYXJnc3ApKQorCisjZGVmaW5lIFNWQ19ERVNUUk9ZKHhwcnQpCQkJCVwKKwkoKih4cHJ0KS0+eHBfb3BzLT54cF9kZXN0cm95KSh4cHJ0KQorI2RlZmluZSBzdmNfZGVzdHJveSh4cHJ0KQkJCQlcCisJKCooeHBydCktPnhwX29wcy0+eHBfZGVzdHJveSkoeHBydCkKKworCisvKgorICogU2VydmljZSByZXF1ZXN0CisgKi8KK3N0cnVjdCBzdmNfcmVxIHsKKyAgcnBjcHJvZ190IHJxX3Byb2c7ICAgICAgICAgICAgLyogc2VydmljZSBwcm9ncmFtIG51bWJlciAqLworICBycGN2ZXJzX3QgcnFfdmVyczsgICAgICAgICAgICAvKiBzZXJ2aWNlIHByb3RvY29sIHZlcnNpb24gKi8KKyAgcnBjcHJvY190IHJxX3Byb2M7ICAgICAgICAgICAgLyogdGhlIGRlc2lyZWQgcHJvY2VkdXJlICovCisgIHN0cnVjdCBvcGFxdWVfYXV0aCBycV9jcmVkOyAgIC8qIHJhdyBjcmVkcyBmcm9tIHRoZSB3aXJlICovCisgIGNhZGRyX3QgcnFfY2xudGNyZWQ7ICAgICAgICAgIC8qIHJlYWQgb25seSBjb29rZWQgY3JlZCAqLworICBTVkNYUFJUICpycV94cHJ0OyAgICAgICAgICAgICAvKiBhc3NvY2lhdGVkIHRyYW5zcG9ydCAqLworfTsKKworI2lmbmRlZiBfX0RJU1BBVENIX0ZOX1QKKyNkZWZpbmUgX19ESVNQQVRDSF9GTl9UCit0eXBlZGVmIHZvaWQgKCpfX2Rpc3BhdGNoX2ZuX3QpIChzdHJ1Y3Qgc3ZjX3JlcSosIFNWQ1hQUlQqKTsKKyNlbmRpZgorCisvKgorICogU2VydmljZSByZWdpc3RyYXRpb24KKyAqCisgKiBzdmNfcmVnaXN0ZXIoeHBydCwgcHJvZywgdmVycywgZGlzcGF0Y2gsIHByb3RvY29sKQorICoJU1ZDWFBSVCAqeHBydDsKKyAqCXJwY3Byb2dfdCBwcm9nOworICoJcnBjdmVyc190IHZlcnM7CisgKgl2b2lkICgqZGlzcGF0Y2gpKHN0cnVjdCBzdmNfcmVxKiwgU1ZDWFBSVCopOworICoJcnBjcHJvdF90IHByb3RvY29sOyAgbGlrZSBUQ1Agb3IgVURQLCB6ZXJvIG1lYW5zIGRvIG5vdCByZWdpc3RlcgorICovCitleHRlcm4gYm9vbF90IHN2Y19yZWdpc3RlciAoU1ZDWFBSVCAqX194cHJ0LCBycGNwcm9nX3QgX19wcm9nLAorCQkJICAgIHJwY3ZlcnNfdCBfX3ZlcnMsIF9fZGlzcGF0Y2hfZm5fdCBfX2Rpc3BhdGNoLAorCQkJICAgIHJwY3Byb3RfdCBfX3Byb3RvY29sKSBfX1RIUk9XOworCisvKgorICogU2VydmljZSB1bi1yZWdpc3RyYXRpb24KKyAqCisgKiBzdmNfdW5yZWdpc3Rlcihwcm9nLCB2ZXJzKQorICoJcnBjcHJvZ190IHByb2c7CisgKglycGN2ZXJzX3QgdmVyczsKKyAqLworZXh0ZXJuIHZvaWQgc3ZjX3VucmVnaXN0ZXIgKHJwY3Byb2dfdCBfX3Byb2csIHJwY3ZlcnNfdCBfX3ZlcnMpIF9fVEhST1c7CisKKy8qCisgKiBUcmFuc3BvcnQgcmVnaXN0cmF0aW9uLgorICoKKyAqIHhwcnRfcmVnaXN0ZXIoeHBydCkKKyAqCVNWQ1hQUlQgKnhwcnQ7CisgKi8KK2V4dGVybiB2b2lkIHhwcnRfcmVnaXN0ZXIgKFNWQ1hQUlQgKl9feHBydCkgX19USFJPVzsKKworLyoKKyAqIFRyYW5zcG9ydCB1bi1yZWdpc3RlcgorICoKKyAqIHhwcnRfdW5yZWdpc3Rlcih4cHJ0KQorICoJU1ZDWFBSVCAqeHBydDsKKyAqLworZXh0ZXJuIHZvaWQgeHBydF91bnJlZ2lzdGVyIChTVkNYUFJUICpfX3hwcnQpIF9fVEhST1c7CisKKworLyoKKyAqIFdoZW4gdGhlIHNlcnZpY2Ugcm91dGluZSBpcyBjYWxsZWQsIGl0IG11c3QgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIGl0CisgKiBrbm93cyBhYm91dCB0aGUgcHJvY2VkdXJlOyAgaWYgbm90LCBpdCBzaG91bGQgY2FsbCBzdmNlcnJfbm9wcm9jCisgKiBhbmQgcmV0dXJuLiAgSWYgc28sIGl0IHNob3VsZCBkZXNlcmlhbGl6ZSBpdHMgYXJndW1lbnRzIHZpYQorICogU1ZDX0dFVEFSR1MgKGRlZmluZWQgYWJvdmUpLiAgSWYgdGhlIGRlc2VyaWFsaXphdGlvbiBkb2VzIG5vdCB3b3JrLAorICogc3ZjZXJyX2RlY29kZSBzaG91bGQgYmUgY2FsbGVkIGZvbGxvd2VkIGJ5IGEgcmV0dXJuLiAgU3VjY2Vzc2Z1bAorICogZGVjb2Rpbmcgb2YgdGhlIGFyZ3VtZW50cyBzaG91bGQgYmUgZm9sbG93ZWQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKKyAqIHByb2NlZHVyZSdzIGNvZGUgYW5kIGEgY2FsbCB0byBzdmNfc2VuZHJlcGx5LgorICoKKyAqIEFsc28sIGlmIHRoZSBzZXJ2aWNlIHJlZnVzZXMgdG8gZXhlY3V0ZSB0aGUgcHJvY2VkdXJlIGR1ZSB0byB0b28tCisgKiB3ZWFrIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnMsIHN2Y2Vycl93ZWFrYXV0aCBzaG91bGQgYmUgY2FsbGVkLgorICogTm90ZTogZG8gbm90IGNvbmZ1c2UgYWNjZXNzLWNvbnRyb2wgZmFpbHVyZSB3aXRoIHdlYWsgYXV0aGVudGljYXRpb24hCisgKgorICogTkI6IEluIHB1cmUgaW1wbGVtZW50YXRpb25zIG9mIHJwYywgdGhlIGNhbGxlciBhbHdheXMgd2FpdHMgZm9yIGEgcmVwbHkKKyAqIG1zZy4gIFRoaXMgbWVzc2FnZSBpcyBzZW50IHdoZW4gc3ZjX3NlbmRyZXBseSBpcyBjYWxsZWQuCisgKiBUaGVyZWZvcmUgcHVyZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9ucyBzaG91bGQgYWx3YXlzIGNhbGwKKyAqIHN2Y19zZW5kcmVwbHkgZXZlbiBpZiB0aGUgZnVuY3Rpb24gbG9naWNhbGx5IHJldHVybnMgdm9pZDsgIHVzZQorICogeGRyLmggLSB4ZHJfdm9pZCBmb3IgdGhlIHhkciByb3V0aW5lLiAgSE9XRVZFUiwgdGNwIGJhc2VkIHJwYyBhbGxvd3MKKyAqIGZvciB0aGUgYWJ1c2Ugb2YgcHVyZSBycGMgdmlhIGJhdGNoZWQgY2FsbGluZyBvciBwaXBlbGluaW5nLiAgSW4gdGhlCisgKiBjYXNlIG9mIGEgYmF0Y2hlZCBjYWxsLCBzdmNfc2VuZHJlcGx5IHNob3VsZCBOT1QgYmUgY2FsbGVkIHNpbmNlCisgKiB0aGlzIHdvdWxkIHNlbmQgYSByZXR1cm4gbWVzc2FnZSwgd2hpY2ggaXMgd2hhdCBiYXRjaGluZyB0cmllcyB0byBhdm9pZC4KKyAqIEl0IGlzIHRoZSBzZXJ2aWNlL3Byb3RvY29sIHdyaXRlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGtub3cgd2hpY2ggY2FsbHMgYXJlCisgKiBiYXRjaGVkIGFuZCB3aGljaCBhcmUgbm90LiAgV2FybmluZzogcmVzcG9uZGluZyB0byBiYXRjaCBjYWxscyBtYXkKKyAqIGRlYWRsb2NrIHRoZSBjYWxsZXIgYW5kIHNlcnZlciBwcm9jZXNzZXMhCisgKi8KKworZXh0ZXJuIGJvb2xfdAlzdmNfc2VuZHJlcGx5IChTVkNYUFJUICpfX3hwcnQsIHhkcnByb2NfdCBfX3hkcl9yZXN1bHRzLAorCQkJICAgICAgIGNhZGRyX3QgX194ZHJfbG9jYXRpb24pIF9fVEhST1c7CisKK2V4dGVybiB2b2lkCXN2Y2Vycl9kZWNvZGUgKFNWQ1hQUlQgKl9feHBydCkgX19USFJPVzsKKworZXh0ZXJuIHZvaWQJc3ZjZXJyX3dlYWthdXRoIChTVkNYUFJUICpfX3hwcnQpIF9fVEhST1c7CisKK2V4dGVybiB2b2lkCXN2Y2Vycl9ub3Byb2MgKFNWQ1hQUlQgKl9feHBydCkgX19USFJPVzsKKworZXh0ZXJuIHZvaWQJc3ZjZXJyX3Byb2d2ZXJzIChTVkNYUFJUICpfX3hwcnQsIHJwY3ZlcnNfdCBfX2xvd192ZXJzLAorCQkJCSBycGN2ZXJzX3QgX19oaWdoX3ZlcnMpIF9fVEhST1c7CisKK2V4dGVybiB2b2lkCXN2Y2Vycl9hdXRoIChTVkNYUFJUICpfX3hwcnQsIGVudW0gYXV0aF9zdGF0IF9fd2h5KSBfX1RIUk9XOworCitleHRlcm4gdm9pZAlzdmNlcnJfbm9wcm9nIChTVkNYUFJUICpfX3hwcnQpIF9fVEhST1c7CisKK2V4dGVybiB2b2lkCXN2Y2Vycl9zeXN0ZW1lcnIgKFNWQ1hQUlQgKl9feHBydCkgX19USFJPVzsKKworLyoKKyAqIExvd2VzdCBsZXZlbCBkaXNwYXRjaGluZyAtT1ItIHdobyBvd25zIHRoaXMgcHJvY2VzcyBhbnl3YXkuCisgKiBTb21lYm9keSBoYXMgdG8gd2FpdCBmb3IgaW5jb21pbmcgcmVxdWVzdHMgYW5kIHRoZW4gY2FsbCB0aGUgY29ycmVjdAorICogc2VydmljZSByb3V0aW5lLiAgVGhlIHJvdXRpbmUgc3ZjX3J1biBkb2VzIGluZmluaXRlIHdhaXRpbmc7IGkuZS4sCisgKiBzdmNfcnVuIG5ldmVyIHJldHVybnMuCisgKiBTaW5jZSBhbm90aGVyIChjb2V4aXN0ZW50KSBwYWNrYWdlIG1heSB3aXNoIHRvIHNlbGVjdGl2ZWx5IHdhaXQgZm9yCisgKiBpbmNvbWluZyBjYWxscyBvciBvdGhlciBldmVudHMgb3V0c2lkZSBvZiB0aGUgcnBjIGFyY2hpdGVjdHVyZSwgdGhlCisgKiByb3V0aW5lIHN2Y19nZXRyZXEgaXMgcHJvdmlkZWQuICBJdCBtdXN0IGJlIHBhc3NlZCByZWFkZmRzLCB0aGUKKyAqICJpbi1wbGFjZSIgcmVzdWx0cyBvZiBhIHNlbGVjdCBzeXN0ZW0gY2FsbCAoc2VlIHNlbGVjdCwgc2VjdGlvbiAyKS4KKyAqLworCisvKgorICogR2xvYmFsIGtlZXBlciBvZiBycGMgc2VydmljZSBkZXNjcmlwdG9ycyBpbiB1c2UKKyAqIGR5bmFtaWM7IG11c3QgYmUgaW5zcGVjdGVkIGJlZm9yZSBlYWNoIGNhbGwgdG8gc2VsZWN0CisgKi8KKworZXh0ZXJuIHN0cnVjdCBwb2xsZmQgKnN2Y19wb2xsZmQ7CitleHRlcm4gaW50IHN2Y19tYXhfcG9sbGZkOworZXh0ZXJuIGZkX3NldCBzdmNfZmRzZXQ7CisjZGVmaW5lIHN2Y19mZHMgc3ZjX2Zkc2V0LmZkc19iaXRzWzBdCS8qIGNvbXBhdGliaWxpdHkgKi8KKworLyoKKyAqIGEgc21hbGwgcHJvZ3JhbSBpbXBsZW1lbnRlZCBieSB0aGUgc3ZjX3JwYyBpbXBsZW1lbnRhdGlvbiBpdHNlbGY7CisgKiBhbHNvIHNlZSBjbG50LmggZm9yIHByb3RvY29sIG51bWJlcnMuCisgKi8KK2V4dGVybiB2b2lkIHN2Y19nZXRyZXEgKGludCBfX3JkZmRzKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgc3ZjX2dldHJlcV9jb21tb24gKGNvbnN0IGludCBfX2ZkKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgc3ZjX2dldHJlcXNldCAoZmRfc2V0ICpfX3JlYWRmZHMpIF9fVEhST1c7CitleHRlcm4gdm9pZCBzdmNfZ2V0cmVxX3BvbGwgKHN0cnVjdCBwb2xsZmQgKiwgY29uc3QgaW50KSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgc3ZjX2V4aXQgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gdm9pZCBzdmNfcnVuICh2b2lkKSBfX1RIUk9XOworCisvKgorICogU29ja2V0IHRvIHVzZSBvbiBzdmN4eHhfY3JlYXRlIGNhbGwgdG8gZ2V0IGRlZmF1bHQgc29ja2V0CisgKi8KKyNkZWZpbmUJUlBDX0FOWVNPQ0sJLTEKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZXhpc3Rpbmcgc2VydmljZSBzaWRlIHRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMKKyAqLworCisvKgorICogTWVtb3J5IGJhc2VkIHJwYyBmb3IgdGVzdGluZyBhbmQgdGltaW5nLgorICovCitleHRlcm4gU1ZDWFBSVCAqc3ZjcmF3X2NyZWF0ZSAodm9pZCkgX19USFJPVzsKKworLyoKKyAqIFVkcCBiYXNlZCBycGMuCisgKi8KK2V4dGVybiBTVkNYUFJUICpzdmN1ZHBfY3JlYXRlIChpbnQgX19zb2NrKSBfX1RIUk9XOworZXh0ZXJuIFNWQ1hQUlQgKnN2Y3VkcF9idWZjcmVhdGUgKGludCBfX3NvY2ssIHVfaW50IF9fc2VuZHN6LCB1X2ludCBfX3JlY3ZzeikKKyAgICAgX19USFJPVzsKKworLyoKKyAqIFRjcCBiYXNlZCBycGMuCisgKi8KK2V4dGVybiBTVkNYUFJUICpzdmN0Y3BfY3JlYXRlIChpbnQgX19zb2NrLCB1X2ludCBfX3NlbmRzaXplLCB1X2ludCBfX3JlY3ZzaXplKQorICAgICBfX1RIUk9XOworCisvKgorICogRkQgYmFzZWQgcnBjLgorICovCitleHRlcm4gU1ZDWFBSVCAqc3ZjZmRfY3JlYXRlIChpbnQgX19zb2NrLCB1X2ludCBfX3NlbmRzaXplLCB1X2ludCBfX3JlY3ZzaXplKQorICAgICBfX1RIUk9XOworCisvKgorICogVW5peCBiYXNlZCBycGMuCisgKi8KK2V4dGVybiBTVkNYUFJUICpzdmN1bml4X2NyZWF0ZSAoaW50IF9fc29jaywgdV9pbnQgX19zZW5kc2l6ZSwgdV9pbnQgX19yZWN2c2l6ZSwKKwkJCQljaGFyICpfX3BhdGgpIF9fVEhST1c7CisKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHJwYy9zdmMuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvc3ZjX2F1dGguaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3N2Y19hdXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhMjc0MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3N2Y19hdXRoLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIHN2Y19hdXRoLmgsIFNlcnZpY2Ugc2lkZSBvZiBycGMgYXV0aGVudGljYXRpb24uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfUlBDX1NWQ19BVVRIX0gKKyNkZWZpbmUgX1JQQ19TVkNfQVVUSF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8cnBjL3N2Yy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qCisgKiBTZXJ2ZXIgc2lkZSBhdXRoZW50aWNhdG9yCisgKi8KK2V4dGVybiBlbnVtIGF1dGhfc3RhdCBfYXV0aGVudGljYXRlIChzdHJ1Y3Qgc3ZjX3JlcSAqX19ycXN0LAorCQkJCSAgICAgc3RydWN0IHJwY19tc2cgKl9fbXNnKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcnBjL3N2Y19hdXRoLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3R5cGVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkY2E1YzQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy90eXBlcy5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworLyogZml4aW5jbHVkZXMgc2hvdWxkIG5vdCBhZGQgZXh0ZXJuICJDIiB0byB0aGlzIGZpbGUgKi8KKy8qCisgKiBScGMgYWRkaXRpb25zIHRvIDxzeXMvdHlwZXMuaD4KKyAqLworI2lmbmRlZiBfUlBDX1RZUEVTX0gKKyNkZWZpbmUgX1JQQ19UWVBFU19IIDEKKwordHlwZWRlZiBpbnQgYm9vbF90OwordHlwZWRlZiBpbnQgZW51bV90OworLyogVGhpcyBuZWVkcyB0byBiZSBjaGFuZ2VkIHRvIHVpbnQzMl90IGluIHRoZSBmdXR1cmUgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBycGNwcm9nX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgcnBjdmVyc190OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHJwY3Byb2NfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBycGNwcm90X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgcnBjcG9ydF90OworCisjZGVmaW5lICAgICAgICBfX2RvbnRjYXJlX18gICAgLTEKKworI2lmbmRlZiBGQUxTRQorIyAgICAgIGRlZmluZSAgRkFMU0UgICAoMCkKKyNlbmRpZgorCisjaWZuZGVmIFRSVUUKKyMgICAgICBkZWZpbmUgIFRSVUUgICAgKDEpCisjZW5kaWYKKworI2lmbmRlZiBOVUxMCisjICAgICAgZGVmaW5lICBOVUxMIDAKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CQkvKiBGb3IgbWFsbG9jIGRlY2wuICAqLworI2RlZmluZSBtZW1fYWxsb2MoYnNpemUpCW1hbGxvYyhic2l6ZSkKKy8qCisgKiBYWFg6IFRoaXMgbXVzdCBub3QgdXNlIHRoZSBzZWNvbmQgYXJndW1lbnQsIG9yIGNvZGUgaW4geGRyX2FycmF5LmMgbmVlZHMKKyAqIHRvIGJlIG1vZGlmaWVkLgorICovCisjZGVmaW5lIG1lbV9mcmVlKHB0ciwgYnNpemUpCWZyZWUocHRyKQorCisjaWZuZGVmIG1ha2VkZXYgLyogaWUsIHdlIGhhdmVuJ3QgYWxyZWFkeSBpbmNsdWRlZCBpdCAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX191X2NoYXJfZGVmaW5lZAordHlwZWRlZiBfX3VfY2hhciB1X2NoYXI7Cit0eXBlZGVmIF9fdV9zaG9ydCB1X3Nob3J0OwordHlwZWRlZiBfX3VfaW50IHVfaW50OwordHlwZWRlZiBfX3VfbG9uZyB1X2xvbmc7Cit0eXBlZGVmIF9fcXVhZF90IHF1YWRfdDsKK3R5cGVkZWYgX191X3F1YWRfdCB1X3F1YWRfdDsKK3R5cGVkZWYgX19mc2lkX3QgZnNpZF90OworIyBkZWZpbmUgX191X2NoYXJfZGVmaW5lZAorI2VuZGlmCisjaWZuZGVmIF9fZGFkZHJfdF9kZWZpbmVkCit0eXBlZGVmIF9fZGFkZHJfdCBkYWRkcl90OwordHlwZWRlZiBfX2NhZGRyX3QgY2FkZHJfdDsKKyMgZGVmaW5lIF9fZGFkZHJfdF9kZWZpbmVkCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpZm5kZWYgSU5BRERSX0xPT1BCQUNLCisjZGVmaW5lICAgICAgIElOQUREUl9MT09QQkFDSyAgICAgICAgICh1X2xvbmcpMHg3RjAwMDAwMQorI2VuZGlmCisjaWZuZGVmIE1BWEhPU1ROQU1FTEVOCisjZGVmaW5lICAgICAgICBNQVhIT1NUTkFNRUxFTiAgNjQKKyNlbmRpZgorCisjZW5kaWYgLyogcnBjL3R5cGVzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3hkci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMveGRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBmMDMzYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3hkci5oCkBAIC0wLDAgKzEsMzc3IEBACisvKgorICogeGRyLmgsIEV4dGVybmFsIERhdGEgUmVwcmVzZW50YXRpb24gU2VyaWFsaXphdGlvbiBSb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9SUENfWERSX0gKKyNkZWZpbmUgX1JQQ19YRFJfSCAxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHJwYy90eXBlcy5oPgorCisvKiBXZSBuZWVkIEZJTEUuICAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK19fQkVHSU5fREVDTFMKKworLyoKKyAqIFhEUiBwcm92aWRlcyBhIGNvbnZlbnRpb25hbCB3YXkgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBDIGRhdGEKKyAqIHR5cGVzIGFuZCBhbiBleHRlcm5hbCBiaXQtc3RyaW5nIHJlcHJlc2VudGF0aW9uLiAgTGlicmFyeSBzdXBwbGllZAorICogcm91dGluZXMgcHJvdmlkZSBmb3IgdGhlIGNvbnZlcnNpb24gb24gYnVpbHQtaW4gQyBkYXRhIHR5cGVzLiAgVGhlc2UKKyAqIHJvdXRpbmVzIGFuZCB1dGlsaXR5IHJvdXRpbmVzIGRlZmluZWQgaGVyZSBhcmUgdXNlZCB0byBoZWxwIGltcGxlbWVudAorICogYSB0eXBlIGVuY29kZS9kZWNvZGUgcm91dGluZSBmb3IgZWFjaCB1c2VyLWRlZmluZWQgdHlwZS4KKyAqCisgKiBFYWNoIGRhdGEgdHlwZSBwcm92aWRlcyBhIHNpbmdsZSBwcm9jZWR1cmUgd2hpY2ggdGFrZXMgdHdvIGFyZ3VtZW50czoKKyAqCisgKiAgICAgIGJvb2xfdAorICogICAgICB4ZHJwcm9jKHhkcnMsIGFyZ3Jlc3ApCisgKiAgICAgICAgICAgICAgWERSICp4ZHJzOworICogICAgICAgICAgICAgIDx0eXBlPiAqYXJncmVzcDsKKyAqCisgKiB4ZHJzIGlzIGFuIGluc3RhbmNlIG9mIGEgWERSIGhhbmRsZSwgdG8gd2hpY2ggb3IgZnJvbSB3aGljaCB0aGUgZGF0YQorICogdHlwZSBpcyB0byBiZSBjb252ZXJ0ZWQuICBhcmdyZXNwIGlzIGEgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIHRvIGJlCisgKiBjb252ZXJ0ZWQuICBUaGUgWERSIGhhbmRsZSBjb250YWlucyBhbiBvcGVyYXRpb24gZmllbGQgd2hpY2ggaW5kaWNhdGVzCisgKiB3aGljaCBvZiB0aGUgb3BlcmF0aW9ucyAoRU5DT0RFLCBERUNPREUgKiBvciBGUkVFKSBpcyB0byBiZSBwZXJmb3JtZWQuCisgKgorICogWERSX0RFQ09ERSBtYXkgYWxsb2NhdGUgc3BhY2UgaWYgdGhlIHBvaW50ZXIgYXJncmVzcCBpcyBudWxsLiAgVGhpcworICogZGF0YSBjYW4gYmUgZnJlZWQgd2l0aCB0aGUgWERSX0ZSRUUgb3BlcmF0aW9uLgorICoKKyAqIFdlIHdyaXRlIG9ubHkgb25lIHByb2NlZHVyZSBwZXIgZGF0YSB0eXBlIHRvIG1ha2UgaXQgZWFzeQorICogdG8ga2VlcCB0aGUgZW5jb2RlIGFuZCBkZWNvZGUgcHJvY2VkdXJlcyBmb3IgYSBkYXRhIHR5cGUgY29uc2lzdGVudC4KKyAqIEluIG1hbnkgY2FzZXMgdGhlIHNhbWUgY29kZSBwZXJmb3JtcyBhbGwgb3BlcmF0aW9ucyBvbiBhIHVzZXIgZGVmaW5lZCB0eXBlLAorICogYmVjYXVzZSBhbGwgdGhlIGhhcmQgd29yayBpcyBkb25lIGluIHRoZSBjb21wb25lbnQgdHlwZSByb3V0aW5lcy4KKyAqIGRlY29kZSBhcyBhIHNlcmllcyBvZiBjYWxscyBvbiB0aGUgbmVzdGVkIGRhdGEgdHlwZXMuCisgKi8KKworLyoKKyAqIFhkciBvcGVyYXRpb25zLiAgWERSX0VOQ09ERSBjYXVzZXMgdGhlIHR5cGUgdG8gYmUgZW5jb2RlZCBpbnRvIHRoZQorICogc3RyZWFtLiAgWERSX0RFQ09ERSBjYXVzZXMgdGhlIHR5cGUgdG8gYmUgZXh0cmFjdGVkIGZyb20gdGhlIHN0cmVhbS4KKyAqIFhEUl9GUkVFIGNhbiBiZSB1c2VkIHRvIHJlbGVhc2UgdGhlIHNwYWNlIGFsbG9jYXRlZCBieSBhbiBYRFJfREVDT0RFCisgKiByZXF1ZXN0LgorICovCitlbnVtIHhkcl9vcCB7CisgIFhEUl9FTkNPREUgPSAwLAorICBYRFJfREVDT0RFID0gMSwKKyAgWERSX0ZSRUUgPSAyCit9OworCisvKgorICogVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciB1bml0IG9mIGV4dGVybmFsIGRhdGEuCisgKi8KKyNkZWZpbmUgQllURVNfUEVSX1hEUl9VTklUCSg0KQorLyoKKyAqIFRoaXMgb25seSB3b3JrcyBpZiB0aGUgYWJvdmUgaXMgYSBwb3dlciBvZiAyLiAgQnV0IGl0J3MgZGVmaW5lZCB0byBiZQorICogNCBieSB0aGUgYXBwcm9wcmlhdGUgUkZDcy4gIFNvIGl0IHdpbGwgd29yay4gIEFuZCBpdCdzIG5vcm1hbGx5IHF1aWNrZXIKKyAqIHRoYW4gdGhlIG9sZCByb3V0aW5lLgorICovCisjaWYgMQorI2RlZmluZSBSTkRVUCh4KSAgKCgoeCkgKyBCWVRFU19QRVJfWERSX1VOSVQgLSAxKSAmIH4oQllURVNfUEVSX1hEUl9VTklUIC0gMSkpCisjZWxzZSAvKiB0aGlzIGlzIHRoZSBvbGQgcm91dGluZSAqLworI2RlZmluZSBSTkRVUCh4KSAgKCgoKHgpICsgQllURVNfUEVSX1hEUl9VTklUIC0gMSkgLyBCWVRFU19QRVJfWERSX1VOSVQpIFwKKwkJICAgICogQllURVNfUEVSX1hEUl9VTklUKQorI2VuZGlmCisKKy8qCisgKiBUaGUgWERSIGhhbmRsZS4KKyAqIENvbnRhaW5zIG9wZXJhdGlvbiB3aGljaCBpcyBiZWluZyBhcHBsaWVkIHRvIHRoZSBzdHJlYW0sCisgKiBhbiBvcGVyYXRpb25zIHZlY3RvciBmb3IgdGhlIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gKGUuZy4gc2VlIHhkcl9tZW0uYyksCisgKiBhbmQgdHdvIHByaXZhdGUgZmllbGRzIGZvciB0aGUgdXNlIG9mIHRoZSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBYRFIgWERSOworc3RydWN0IFhEUgorICB7CisgICAgZW51bSB4ZHJfb3AgeF9vcDsJCS8qIG9wZXJhdGlvbjsgZmFzdCBhZGRpdGlvbmFsIHBhcmFtICovCisgICAgc3RydWN0IHhkcl9vcHMKKyAgICAgIHsKKwlib29sX3QgKCp4X2dldGxvbmcpIChYRFIgKl9feGRycywgbG9uZyAqX19scCk7CisJLyogZ2V0IGEgbG9uZyBmcm9tIHVuZGVybHlpbmcgc3RyZWFtICovCisJYm9vbF90ICgqeF9wdXRsb25nKSAoWERSICpfX3hkcnMsIF9fY29uc3QgbG9uZyAqX19scCk7CisJLyogcHV0IGEgbG9uZyB0byAiICovCisJYm9vbF90ICgqeF9nZXRieXRlcykgKFhEUiAqX194ZHJzLCBjYWRkcl90IF9fYWRkciwgdV9pbnQgX19sZW4pOworCS8qIGdldCBzb21lIGJ5dGVzIGZyb20gIiAqLworCWJvb2xfdCAoKnhfcHV0Ynl0ZXMpIChYRFIgKl9feGRycywgX19jb25zdCBjaGFyICpfX2FkZHIsIHVfaW50IF9fbGVuKTsKKwkvKiBwdXQgc29tZSBieXRlcyB0byAiICovCisJdV9pbnQgKCp4X2dldHBvc3RuKSAoX19jb25zdCBYRFIgKl9feGRycyk7CisJLyogcmV0dXJucyBieXRlcyBvZmYgZnJvbSBiZWdpbm5pbmcgKi8KKwlib29sX3QgKCp4X3NldHBvc3RuKSAoWERSICpfX3hkcnMsIHVfaW50IF9fcG9zKTsKKwkvKiBsZXRzIHlvdSByZXBvc2l0aW9uIHRoZSBzdHJlYW0gKi8KKwlpbnQzMl90ICooKnhfaW5saW5lKSAoWERSICpfX3hkcnMsIHVfaW50IF9fbGVuKTsKKwkvKiBidWYgcXVpY2sgcHRyIHRvIGJ1ZmZlcmVkIGRhdGEgKi8KKwl2b2lkICgqeF9kZXN0cm95KSAoWERSICpfX3hkcnMpOworCS8qIGZyZWUgcHJpdmF0ZXMgb2YgdGhpcyB4ZHJfc3RyZWFtICovCisJYm9vbF90ICgqeF9nZXRpbnQzMikgKFhEUiAqX194ZHJzLCBpbnQzMl90ICpfX2lwKTsKKwkvKiBnZXQgYSBpbnQgZnJvbSB1bmRlcmx5aW5nIHN0cmVhbSAqLworCWJvb2xfdCAoKnhfcHV0aW50MzIpIChYRFIgKl9feGRycywgX19jb25zdCBpbnQzMl90ICpfX2lwKTsKKwkvKiBwdXQgYSBpbnQgdG8gIiAqLworICAgICAgfQorICAgICAqeF9vcHM7CisgICAgY2FkZHJfdCB4X3B1YmxpYzsJCS8qIHVzZXJzJyBkYXRhICovCisgICAgY2FkZHJfdCB4X3ByaXZhdGU7CQkvKiBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSAqLworICAgIGNhZGRyX3QgeF9iYXNlOwkJLyogcHJpdmF0ZSB1c2VkIGZvciBwb3NpdGlvbiBpbmZvICovCisgICAgdV9pbnQgeF9oYW5keTsJCS8qIGV4dHJhIHByaXZhdGUgd29yZCAqLworICB9OworCisvKgorICogQSB4ZHJwcm9jX3QgZXhpc3RzIGZvciBlYWNoIGRhdGEgdHlwZSB3aGljaCBpcyB0byBiZSBlbmNvZGVkIG9yIGRlY29kZWQuCisgKgorICogVGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgeGRycHJvY190IGlzIGEgcG9pbnRlciB0byBhbiBvcGFxdWUgcG9pbnRlci4KKyAqIFRoZSBvcGFxdWUgcG9pbnRlciBnZW5lcmFsbHkgcG9pbnRzIHRvIGEgc3RydWN0dXJlIG9mIHRoZSBkYXRhIHR5cGUKKyAqIHRvIGJlIGRlY29kZWQuICBJZiB0aGlzIHBvaW50ZXIgaXMgMCwgdGhlbiB0aGUgdHlwZSByb3V0aW5lcyBzaG91bGQKKyAqIGFsbG9jYXRlIGR5bmFtaWMgc3RvcmFnZSBvZiB0aGUgYXBwcm9wcmlhdGUgc2l6ZSBhbmQgcmV0dXJuIGl0LgorICogYm9vbF90ICAgICAgICgqeGRycHJvY190KShYRFIgKiwgY2FkZHJfdCAqKTsKKyAqLwordHlwZWRlZiBib29sX3QgKCp4ZHJwcm9jX3QpIChYRFIgKiwgdm9pZCAqLC4uLik7CisKKworLyoKKyAqIE9wZXJhdGlvbnMgZGVmaW5lZCBvbiBhIFhEUiBoYW5kbGUKKyAqCisgKiBYRFIgICAgICAgICAgKnhkcnM7CisgKiBpbnQzMl90ICAgICAgKmludDMycDsKKyAqIGxvbmcgICAgICAgICAqbG9uZ3A7CisgKiBjYWRkcl90ICAgICAgIGFkZHI7CisgKiB1X2ludCAgICAgICAgIGxlbjsKKyAqIHVfaW50ICAgICAgICAgcG9zOworICovCisjZGVmaW5lIFhEUl9HRVRJTlQzMih4ZHJzLCBpbnQzMnApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCooeGRycyktPnhfb3BzLT54X2dldGludDMyKSh4ZHJzLCBpbnQzMnApCisjZGVmaW5lIHhkcl9nZXRpbnQzMih4ZHJzLCBpbnQzMnApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCooeGRycyktPnhfb3BzLT54X2dldGludDMyKSh4ZHJzLCBpbnQzMnApCisKKyNkZWZpbmUgWERSX1BVVElOVDMyKHhkcnMsIGludDMycCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKih4ZHJzKS0+eF9vcHMtPnhfcHV0aW50MzIpKHhkcnMsIGludDMycCkKKyNkZWZpbmUgeGRyX3B1dGludDMyKHhkcnMsIGludDMycCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKih4ZHJzKS0+eF9vcHMtPnhfcHV0aW50MzIpKHhkcnMsIGludDMycCkKKworI2RlZmluZSBYRFJfR0VUTE9ORyh4ZHJzLCBsb25ncCkJCQlcCisJKCooeGRycyktPnhfb3BzLT54X2dldGxvbmcpKHhkcnMsIGxvbmdwKQorI2RlZmluZSB4ZHJfZ2V0bG9uZyh4ZHJzLCBsb25ncCkJCQlcCisJKCooeGRycyktPnhfb3BzLT54X2dldGxvbmcpKHhkcnMsIGxvbmdwKQorCisjZGVmaW5lIFhEUl9QVVRMT05HKHhkcnMsIGxvbmdwKQkJCVwKKwkoKih4ZHJzKS0+eF9vcHMtPnhfcHV0bG9uZykoeGRycywgbG9uZ3ApCisjZGVmaW5lIHhkcl9wdXRsb25nKHhkcnMsIGxvbmdwKQkJCVwKKwkoKih4ZHJzKS0+eF9vcHMtPnhfcHV0bG9uZykoeGRycywgbG9uZ3ApCisKKyNkZWZpbmUgWERSX0dFVEJZVEVTKHhkcnMsIGFkZHIsIGxlbikJCQlcCisJKCooeGRycyktPnhfb3BzLT54X2dldGJ5dGVzKSh4ZHJzLCBhZGRyLCBsZW4pCisjZGVmaW5lIHhkcl9nZXRieXRlcyh4ZHJzLCBhZGRyLCBsZW4pCQkJXAorCSgqKHhkcnMpLT54X29wcy0+eF9nZXRieXRlcykoeGRycywgYWRkciwgbGVuKQorCisjZGVmaW5lIFhEUl9QVVRCWVRFUyh4ZHJzLCBhZGRyLCBsZW4pCQkJXAorCSgqKHhkcnMpLT54X29wcy0+eF9wdXRieXRlcykoeGRycywgYWRkciwgbGVuKQorI2RlZmluZSB4ZHJfcHV0Ynl0ZXMoeGRycywgYWRkciwgbGVuKQkJCVwKKwkoKih4ZHJzKS0+eF9vcHMtPnhfcHV0Ynl0ZXMpKHhkcnMsIGFkZHIsIGxlbikKKworI2RlZmluZSBYRFJfR0VUUE9TKHhkcnMpCQkJCVwKKwkoKih4ZHJzKS0+eF9vcHMtPnhfZ2V0cG9zdG4pKHhkcnMpCisjZGVmaW5lIHhkcl9nZXRwb3MoeGRycykJCQkJXAorCSgqKHhkcnMpLT54X29wcy0+eF9nZXRwb3N0bikoeGRycykKKworI2RlZmluZSBYRFJfU0VUUE9TKHhkcnMsIHBvcykJCQkJXAorCSgqKHhkcnMpLT54X29wcy0+eF9zZXRwb3N0bikoeGRycywgcG9zKQorI2RlZmluZSB4ZHJfc2V0cG9zKHhkcnMsIHBvcykJCQkJXAorCSgqKHhkcnMpLT54X29wcy0+eF9zZXRwb3N0bikoeGRycywgcG9zKQorCisjZGVmaW5lCVhEUl9JTkxJTkUoeGRycywgbGVuKQkJCQlcCisJKCooeGRycyktPnhfb3BzLT54X2lubGluZSkoeGRycywgbGVuKQorI2RlZmluZQl4ZHJfaW5saW5lKHhkcnMsIGxlbikJCQkJXAorCSgqKHhkcnMpLT54X29wcy0+eF9pbmxpbmUpKHhkcnMsIGxlbikKKworI2RlZmluZQlYRFJfREVTVFJPWSh4ZHJzKQkJCQkJXAorCWRvIHsJCQkJCQkJXAorCQlpZiAoKHhkcnMpLT54X29wcy0+eF9kZXN0cm95KQkJCVwKKwkJCSgqKHhkcnMpLT54X29wcy0+eF9kZXN0cm95KSh4ZHJzKTsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lCXhkcl9kZXN0cm95KHhkcnMpCQkJCQlcCisJZG8gewkJCQkJCQlcCisJCWlmICgoeGRycyktPnhfb3BzLT54X2Rlc3Ryb3kpCQkJXAorCQkJKCooeGRycyktPnhfb3BzLT54X2Rlc3Ryb3kpKHhkcnMpOwlcCisJfSB3aGlsZSAoMCkKKworLyoKKyAqIFN1cHBvcnQgc3RydWN0IGZvciBkaXNjcmltaW5hdGVkIHVuaW9ucy4KKyAqIFlvdSBjcmVhdGUgYW4gYXJyYXkgb2YgeGRyZGlzY3JpbSBzdHJ1Y3R1cmVzLCB0ZXJtaW5hdGVkIHdpdGgKKyAqIGEgZW50cnkgd2l0aCBhIG51bGwgcHJvY2VkdXJlIHBvaW50ZXIuICBUaGUgeGRyX3VuaW9uIHJvdXRpbmUgZ2V0cworICogdGhlIGRpc2NyaW1pbmFudCB2YWx1ZSBhbmQgdGhlbiBzZWFyY2hlcyB0aGUgYXJyYXkgb2Ygc3RydWN0dXJlcworICogZm9yIGEgbWF0Y2hpbmcgdmFsdWUuICBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoZSBhc3NvY2lhdGVkIHhkciByb3V0aW5lCisgKiBpcyBjYWxsZWQgdG8gaGFuZGxlIHRoYXQgcGFydCBvZiB0aGUgdW5pb24uICBJZiB0aGVyZSBpcworICogbm8gbWF0Y2gsIHRoZW4gYSBkZWZhdWx0IHJvdXRpbmUgbWF5IGJlIGNhbGxlZC4KKyAqIElmIHRoZXJlIGlzIG5vIG1hdGNoIGFuZCBubyBkZWZhdWx0IHJvdXRpbmUgaXQgaXMgYW4gZXJyb3IuCisgKi8KKyNkZWZpbmUgTlVMTF94ZHJwcm9jX3QgKCh4ZHJwcm9jX3QpMCkKK3N0cnVjdCB4ZHJfZGlzY3JpbQoreworICBpbnQgdmFsdWU7CisgIHhkcnByb2NfdCBwcm9jOworfTsKKworLyoKKyAqIElubGluZSByb3V0aW5lcyBmb3IgZmFzdCBlbmNvZGUvZGVjb2RlIG9mIHByaW1pdGl2ZSBkYXRhIHR5cGVzLgorICogQ2F2ZWF0IGVtcHRvcjogdGhlc2UgdXNlIHNpbmdsZSBtZW1vcnkgY3ljbGVzIHRvIGdldCB0aGUKKyAqIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyBidWZmZXIsIGFuZCB3aWxsIGZhaWwgdG8gb3BlcmF0ZQorICogcHJvcGVybHkgaWYgdGhlIGRhdGEgaXMgbm90IGFsaWduZWQuICBUaGUgc3RhbmRhcmQgd2F5IHRvIHVzZSB0aGVzZQorICogaXMgdG8gc2F5OgorICogICAgICBpZiAoKGJ1ZiA9IFhEUl9JTkxJTkUoeGRycywgY291bnQpKSA9PSBOVUxMKQorICogICAgICAgICAgICAgIHJldHVybiAoRkFMU0UpOworICogICAgICA8PDwgbWFjcm8gY2FsbHMgPj4+CisgKiB3aGVyZSBgYGNvdW50JycgaXMgdGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIG9jY3VwaWVkCisgKiBieSB0aGUgcHJpbWl0aXZlIGRhdGEgdHlwZXMuCisgKgorICogTi5CLiBhbmQgZnJvemVuIGZvciBhbGwgdGltZTogZWFjaCBkYXRhIHR5cGUgaGVyZSB1c2VzIDQgYnl0ZXMKKyAqIG9mIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uLgorICovCisKKyNkZWZpbmUgSVhEUl9HRVRfSU5UMzIoYnVmKSAgICAgICAgICAgKChpbnQzMl90KW50b2hsKCh1aW50MzJfdCkqKGJ1ZikrKykpCisjZGVmaW5lIElYRFJfUFVUX0lOVDMyKGJ1ZiwgdikgICAgICAgICgqKGJ1ZikrKyA9IChpbnQzMl90KWh0b25sKCh1aW50MzJfdCkodikpKQorI2RlZmluZSBJWERSX0dFVF9VX0lOVDMyKGJ1ZikgICAgICAgICAoKHVpbnQzMl90KUlYRFJfR0VUX0lOVDMyKGJ1ZikpCisjZGVmaW5lIElYRFJfUFVUX1VfSU5UMzIoYnVmLCB2KSAgICAgIElYRFJfUFVUX0lOVDMyKGJ1ZiwgKGludDMyX3QpKHYpKQorCisvKiBXQVJOSU5HOiBUaGUgSVhEUl8qX0xPTkcgZGVmaW5lcyBhcmUgcmVtb3ZlZCBieSBTdW4gZm9yIG5ldyBwbGF0Zm9ybXMKKyAqIGFuZCBzaG91bGRuJ3QgYmUgdXNlZCBhbnkgbG9uZ2VyLiBDb2RlIHdoaWNoIHVzZSB0aGlzIGRlZmluZXMgb3IgbG9uZ3MKKyAqIGluIHRoZSBSUEMgY29kZSB3aWxsIG5vdCB3b3JrIG9uIDY0Yml0IFNvbGFyaXMgcGxhdGZvcm1zICEKKyAqLworI2RlZmluZSBJWERSX0dFVF9MT05HKGJ1ZikgKChsb25nKUlYRFJfR0VUX1VfSU5UMzIoYnVmKSkKKyNkZWZpbmUgSVhEUl9QVVRfTE9ORyhidWYsIHYpICgobG9uZylJWERSX1BVVF9JTlQzMihidWYsIChsb25nKSh2KSkpCisjZGVmaW5lIElYRFJfR0VUX1VfTE9ORyhidWYpCSAgICAgICgodV9sb25nKUlYRFJfR0VUX0xPTkcoYnVmKSkKKyNkZWZpbmUgSVhEUl9QVVRfVV9MT05HKGJ1ZiwgdikJICAgICAgSVhEUl9QVVRfTE9ORyhidWYsIChsb25nKSh2KSkKKworCisjZGVmaW5lIElYRFJfR0VUX0JPT0woYnVmKSAgICAgICAgICAgICgoYm9vbF90KUlYRFJfR0VUX0xPTkcoYnVmKSkKKyNkZWZpbmUgSVhEUl9HRVRfRU5VTShidWYsIHQpICAgICAgICAgKCh0KUlYRFJfR0VUX0xPTkcoYnVmKSkKKyNkZWZpbmUgSVhEUl9HRVRfU0hPUlQoYnVmKSAgICAgICAgICAgKChzaG9ydClJWERSX0dFVF9MT05HKGJ1ZikpCisjZGVmaW5lIElYRFJfR0VUX1VfU0hPUlQoYnVmKSAgICAgICAgICgodV9zaG9ydClJWERSX0dFVF9MT05HKGJ1ZikpCisKKyNkZWZpbmUgSVhEUl9QVVRfQk9PTChidWYsIHYpICAgICAgICAgSVhEUl9QVVRfTE9ORyhidWYsIChsb25nKSh2KSkKKyNkZWZpbmUgSVhEUl9QVVRfRU5VTShidWYsIHYpICAgICAgICAgSVhEUl9QVVRfTE9ORyhidWYsIChsb25nKSh2KSkKKyNkZWZpbmUgSVhEUl9QVVRfU0hPUlQoYnVmLCB2KSAgICAgICAgSVhEUl9QVVRfTE9ORyhidWYsIChsb25nKSh2KSkKKyNkZWZpbmUgSVhEUl9QVVRfVV9TSE9SVChidWYsIHYpICAgICAgSVhEUl9QVVRfTE9ORyhidWYsIChsb25nKSh2KSkKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgImdlbmVyaWMiIHhkciByb3V0aW5lcy4KKyAqIE5vbmUgb2YgdGhlc2UgY2FuIGhhdmUgY29uc3QgYXBwbGllZCBiZWNhdXNlIGl0J3Mgbm90IHBvc3NpYmxlIHRvCisgKiBrbm93IHdoZXRoZXIgdGhlIGNhbGwgaXMgYSByZWFkIG9yIGEgd3JpdGUgdG8gdGhlIHBhc3NlZCBwYXJhbWV0ZXIKKyAqIGFsc28sIHRoZSBYRFIgc3RydWN0dXJlIGlzIGFsd2F5cyB1cGRhdGVkIGJ5IHNvbWUgb2YgdGhlc2UgY2FsbHMuCisgKi8KK2V4dGVybiBib29sX3QgeGRyX3ZvaWQgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9zaG9ydCAoWERSICpfX3hkcnMsIHNob3J0ICpfX3NwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfdV9zaG9ydCAoWERSICpfX3hkcnMsIHVfc2hvcnQgKl9fdXNwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfaW50IChYRFIgKl9feGRycywgaW50ICpfX2lwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfdV9pbnQgKFhEUiAqX194ZHJzLCB1X2ludCAqX191cCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX2xvbmcgKFhEUiAqX194ZHJzLCBsb25nICpfX2xwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfdV9sb25nIChYRFIgKl9feGRycywgdV9sb25nICpfX3VscCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX2h5cGVyIChYRFIgKl9feGRycywgcXVhZF90ICpfX2xscCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX3VfaHlwZXIgKFhEUiAqX194ZHJzLCB1X3F1YWRfdCAqX191bGxwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfbG9uZ2xvbmdfdCAoWERSICpfX3hkcnMsIHF1YWRfdCAqX19sbHApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl91X2xvbmdsb25nX3QgKFhEUiAqX194ZHJzLCB1X3F1YWRfdCAqX191bGxwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfaW50OF90IChYRFIgKl9feGRycywgaW50OF90ICpfX2lwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfdWludDhfdCAoWERSICpfX3hkcnMsIHVpbnQ4X3QgKl9fdXApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9pbnQxNl90IChYRFIgKl9feGRycywgaW50MTZfdCAqX19pcCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX3VpbnQxNl90IChYRFIgKl9feGRycywgdWludDE2X3QgKl9fdXApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9pbnQzMl90IChYRFIgKl9feGRycywgaW50MzJfdCAqX19pcCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX3VpbnQzMl90IChYRFIgKl9feGRycywgdWludDMyX3QgKl9fdXApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9pbnQ2NF90IChYRFIgKl9feGRycywgaW50NjRfdCAqX19pcCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX3VpbnQ2NF90IChYRFIgKl9feGRycywgdWludDY0X3QgKl9fdXApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9xdWFkX3QgKFhEUiAqX194ZHJzLCBxdWFkX3QgKl9faXApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl91X3F1YWRfdCAoWERSICpfX3hkcnMsIHVfcXVhZF90ICpfX3VwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfYm9vbCAoWERSICpfX3hkcnMsIGJvb2xfdCAqX19icCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX2VudW0gKFhEUiAqX194ZHJzLCBlbnVtX3QgKl9fZXApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9hcnJheSAoWERSICogX3hkcnMsIGNhZGRyX3QgKl9fYWRkcnAsIHVfaW50ICpfX3NpemVwLAorCQkJIHVfaW50IF9fbWF4c2l6ZSwgdV9pbnQgX19lbHNpemUsIHhkcnByb2NfdCBfX2VscHJvYykKKyAgICAgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX2J5dGVzIChYRFIgKl9feGRycywgY2hhciAqKl9fY3BwLCB1X2ludCAqX19zaXplcCwKKwkJCSB1X2ludCBfX21heHNpemUpIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9vcGFxdWUgKFhEUiAqX194ZHJzLCBjYWRkcl90IF9fY3AsIHVfaW50IF9fY250KSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfc3RyaW5nIChYRFIgKl9feGRycywgY2hhciAqKl9fY3BwLCB1X2ludCBfX21heHNpemUpIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl91bmlvbiAoWERSICpfX3hkcnMsIGVudW1fdCAqX19kc2NtcCwgY2hhciAqX191bnAsCisJCQkgX19jb25zdCBzdHJ1Y3QgeGRyX2Rpc2NyaW0gKl9fY2hvaWNlcywKKwkJCSB4ZHJwcm9jX3QgX19kZmF1bHQpIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9jaGFyIChYRFIgKl9feGRycywgY2hhciAqX19jcCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX3VfY2hhciAoWERSICpfX3hkcnMsIHVfY2hhciAqX19jcCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX3ZlY3RvciAoWERSICpfX3hkcnMsIGNoYXIgKl9fYmFzZXAsIHVfaW50IF9fbmVsZW0sCisJCQkgIHVfaW50IF9fZWxlbXNpemUsIHhkcnByb2NfdCBfX3hkcl9lbGVtKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfZmxvYXQgKFhEUiAqX194ZHJzLCBmbG9hdCAqX19mcCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX2RvdWJsZSAoWERSICpfX3hkcnMsIGRvdWJsZSAqX19kcCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX3JlZmVyZW5jZSAoWERSICpfX3hkcnMsIGNhZGRyX3QgKl9feHBwLCB1X2ludCBfX3NpemUsCisJCQkgICAgIHhkcnByb2NfdCBfX3Byb2MpIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9wb2ludGVyIChYRFIgKl9feGRycywgY2hhciAqKl9fb2JqcHAsCisJCQkgICB1X2ludCBfX29ial9zaXplLCB4ZHJwcm9jX3QgX194ZHJfb2JqKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfd3JhcHN0cmluZyAoWERSICpfX3hkcnMsIGNoYXIgKipfX2NwcCkgX19USFJPVzsKK2V4dGVybiB1X2xvbmcgeGRyX3NpemVvZiAoeGRycHJvY190LCB2b2lkICopIF9fVEhST1c7CisKKy8qCisgKiBDb21tb24gb3BhcXVlIGJ5dGVzIG9iamVjdHMgdXNlZCBieSBtYW55IHJwYyBwcm90b2NvbHM7CisgKiBkZWNsYXJlZCBoZXJlIGR1ZSB0byBjb21tb25hbGl0eS4KKyAqLworI2RlZmluZSBNQVhfTkVUT0JKX1NaIDEwMjQKK3N0cnVjdCBuZXRvYmoKK3sKKyAgdV9pbnQgbl9sZW47CisgIGNoYXIgKm5fYnl0ZXM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmV0b2JqIG5ldG9iajsKK2V4dGVybiBib29sX3QgeGRyX25ldG9iaiAoWERSICpfX3hkcnMsIHN0cnVjdCBuZXRvYmogKl9fbnApIF9fVEhST1c7CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHB1YmxpYyByb3V0aW5lcyBmb3IgdGhlIHZhcmlvdXMgaW1wbGVtZW50YXRpb25zIG9mCisgKiB4ZHIgc3RyZWFtcy4KKyAqLworCisvKiBYRFIgdXNpbmcgbWVtb3J5IGJ1ZmZlcnMgKi8KK2V4dGVybiB2b2lkIHhkcm1lbV9jcmVhdGUgKFhEUiAqX194ZHJzLCBfX2NvbnN0IGNhZGRyX3QgX19hZGRyLAorCQkJICAgdV9pbnQgX19zaXplLCBlbnVtIHhkcl9vcCBfX3hvcCkgX19USFJPVzsKKworLyogWERSIHVzaW5nIHN0ZGlvIGxpYnJhcnkgKi8KK2V4dGVybiB2b2lkIHhkcnN0ZGlvX2NyZWF0ZSAoWERSICpfX3hkcnMsIEZJTEUgKl9fZmlsZSwgZW51bSB4ZHJfb3AgX194b3ApCisgICAgIF9fVEhST1c7CisKKy8qIFhEUiBwc2V1ZG8gcmVjb3JkcyBmb3IgdGNwICovCitleHRlcm4gdm9pZCB4ZHJyZWNfY3JlYXRlIChYRFIgKl9feGRycywgdV9pbnQgX19zZW5kc2l6ZSwKKwkJCSAgIHVfaW50IF9fcmVjdnNpemUsIGNhZGRyX3QgX190Y3BfaGFuZGxlLAorCQkJICAgaW50ICgqX19yZWFkaXQpIChjaGFyICosIGNoYXIgKiwgaW50KSwKKwkJCSAgIGludCAoKl9fd3JpdGVpdCkgKGNoYXIgKiwgY2hhciAqLCBpbnQpKSBfX1RIUk9XOworCisvKiBtYWtlIGVuZCBvZiB4ZHIgcmVjb3JkICovCitleHRlcm4gYm9vbF90IHhkcnJlY19lbmRvZnJlY29yZCAoWERSICpfX3hkcnMsIGJvb2xfdCBfX3NlbmRub3cpIF9fVEhST1c7CisKKy8qIG1vdmUgdG8gYmVnaW5uaW5nIG9mIG5leHQgcmVjb3JkICovCitleHRlcm4gYm9vbF90IHhkcnJlY19za2lwcmVjb3JkIChYRFIgKl9feGRycykgX19USFJPVzsKKworLyogdHJ1ZSBpZiBubyBtb3JlIGlucHV0ICovCitleHRlcm4gYm9vbF90IHhkcnJlY19lb2YgKFhEUiAqX194ZHJzKSBfX1RIUk9XOworCisvKiBmcmVlIG1lbW9yeSBidWZmZXJzIGZvciB4ZHIgKi8KK2V4dGVybiB2b2lkIHhkcl9mcmVlICh4ZHJwcm9jX3QgX19wcm9jLCBjaGFyICpfX29ianApIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBycGMveGRyLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2Jvb3RwYXJhbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvYm9vdHBhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwZmE4ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2Jvb3RwYXJhbS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfUlBDU1ZDX0JPT1RQQVJBTV9ICisjZGVmaW5lIF9SUENTVkNfQk9PVFBBUkFNX0gKKworI2luY2x1ZGUgPHJwY3N2Yy9ib290cGFyYW1fcHJvdC5oPgorCisjZW5kaWYgIC8qIF9SUENTVkNfQk9PVFBBUkFNX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvYm9vdHBhcmFtX3Byb3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2Jvb3RwYXJhbV9wcm90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJlZDQ0NgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2Jvb3RwYXJhbV9wcm90LmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLgorICogSXQgd2FzIGdlbmVyYXRlZCB1c2luZyBycGNnZW4uCisgKi8KKworI2lmbmRlZiBfQk9PVFBBUkFNX1BST1RfSF9SUENHRU4KKyNkZWZpbmUgX0JPT1RQQVJBTV9QUk9UX0hfUlBDR0VOCisKKyNpbmNsdWRlIDxycGMvcnBjLmg+CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8cnBjL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvZXJybm8uaD4KKyNpbmNsdWRlIDxuZnMvbmZzLmg+CisjZGVmaW5lIE1BWF9NQUNISU5FX05BTUUgMjU1CisjZGVmaW5lIE1BWF9QQVRIX0xFTiAxMDI0CisjZGVmaW5lIE1BWF9GSUxFSUQgMzIKKyNkZWZpbmUgSVBfQUREUl9UWVBFIDEKKwordHlwZWRlZiBjaGFyICpicF9tYWNoaW5lX25hbWVfdDsKKwordHlwZWRlZiBjaGFyICpicF9wYXRoX3Q7CisKK3R5cGVkZWYgY2hhciAqYnBfZmlsZWlkX3Q7CisKK3N0cnVjdCBpcF9hZGRyX3QgeworCWNoYXIgbmV0OworCWNoYXIgaG9zdDsKKwljaGFyIGxoOworCWNoYXIgaW1wbm87Cit9OwordHlwZWRlZiBzdHJ1Y3QgaXBfYWRkcl90IGlwX2FkZHJfdDsKKworc3RydWN0IGJwX2FkZHJlc3MgeworCWludCBhZGRyZXNzX3R5cGU7CisJdW5pb24geworCQlpcF9hZGRyX3QgaXBfYWRkcjsKKwl9IGJwX2FkZHJlc3NfdTsKK307Cit0eXBlZGVmIHN0cnVjdCBicF9hZGRyZXNzIGJwX2FkZHJlc3M7CisKK3N0cnVjdCBicF93aG9hbWlfYXJnIHsKKwlicF9hZGRyZXNzIGNsaWVudF9hZGRyZXNzOworfTsKK3R5cGVkZWYgc3RydWN0IGJwX3dob2FtaV9hcmcgYnBfd2hvYW1pX2FyZzsKKworc3RydWN0IGJwX3dob2FtaV9yZXMgeworCWJwX21hY2hpbmVfbmFtZV90IGNsaWVudF9uYW1lOworCWJwX21hY2hpbmVfbmFtZV90IGRvbWFpbl9uYW1lOworCWJwX2FkZHJlc3Mgcm91dGVyX2FkZHJlc3M7Cit9OwordHlwZWRlZiBzdHJ1Y3QgYnBfd2hvYW1pX3JlcyBicF93aG9hbWlfcmVzOworCitzdHJ1Y3QgYnBfZ2V0ZmlsZV9hcmcgeworCWJwX21hY2hpbmVfbmFtZV90IGNsaWVudF9uYW1lOworCWJwX2ZpbGVpZF90IGZpbGVfaWQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgYnBfZ2V0ZmlsZV9hcmcgYnBfZ2V0ZmlsZV9hcmc7CisKK3N0cnVjdCBicF9nZXRmaWxlX3JlcyB7CisJYnBfbWFjaGluZV9uYW1lX3Qgc2VydmVyX25hbWU7CisJYnBfYWRkcmVzcyBzZXJ2ZXJfYWRkcmVzczsKKwlicF9wYXRoX3Qgc2VydmVyX3BhdGg7Cit9OwordHlwZWRlZiBzdHJ1Y3QgYnBfZ2V0ZmlsZV9yZXMgYnBfZ2V0ZmlsZV9yZXM7CisKKyNkZWZpbmUgQk9PVFBBUkFNUFJPRyAxMDAwMjYKKyNkZWZpbmUgQk9PVFBBUkFNVkVSUyAxCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2RlZmluZSBCT09UUEFSQU1QUk9DX1dIT0FNSSAxCitleHRlcm4gIGJwX3dob2FtaV9yZXMgKiBib290cGFyYW1wcm9jX3dob2FtaV8xKGJwX3dob2FtaV9hcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICBicF93aG9hbWlfcmVzICogYm9vdHBhcmFtcHJvY193aG9hbWlfMV9zdmMoYnBfd2hvYW1pX2FyZyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgQk9PVFBBUkFNUFJPQ19HRVRGSUxFIDIKK2V4dGVybiAgYnBfZ2V0ZmlsZV9yZXMgKiBib290cGFyYW1wcm9jX2dldGZpbGVfMShicF9nZXRmaWxlX2FyZyAqLCBDTElFTlQgKik7CitleHRlcm4gIGJwX2dldGZpbGVfcmVzICogYm9vdHBhcmFtcHJvY19nZXRmaWxlXzFfc3ZjKGJwX2dldGZpbGVfYXJnICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCBib290cGFyYW1wcm9nXzFfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisjZWxzZSAvKiBLJlIgQyAqLworI2RlZmluZSBCT09UUEFSQU1QUk9DX1dIT0FNSSAxCitleHRlcm4gIGJwX3dob2FtaV9yZXMgKiBib290cGFyYW1wcm9jX3dob2FtaV8xKCk7CitleHRlcm4gIGJwX3dob2FtaV9yZXMgKiBib290cGFyYW1wcm9jX3dob2FtaV8xX3N2YygpOworI2RlZmluZSBCT09UUEFSQU1QUk9DX0dFVEZJTEUgMgorZXh0ZXJuICBicF9nZXRmaWxlX3JlcyAqIGJvb3RwYXJhbXByb2NfZ2V0ZmlsZV8xKCk7CitleHRlcm4gIGJwX2dldGZpbGVfcmVzICogYm9vdHBhcmFtcHJvY19nZXRmaWxlXzFfc3ZjKCk7CitleHRlcm4gaW50IGJvb3RwYXJhbXByb2dfMV9mcmVlcmVzdWx0ICgpOworI2VuZGlmIC8qIEsmUiBDICovCisKKy8qIHRoZSB4ZHIgZnVuY3Rpb25zICovCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICBib29sX3QgeGRyX2JwX21hY2hpbmVfbmFtZV90IChYRFIgKiwgYnBfbWFjaGluZV9uYW1lX3QqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9icF9wYXRoX3QgKFhEUiAqLCBicF9wYXRoX3QqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9icF9maWxlaWRfdCAoWERSICosIGJwX2ZpbGVpZF90Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfaXBfYWRkcl90IChYRFIgKiwgaXBfYWRkcl90Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfYnBfYWRkcmVzcyAoWERSICosIGJwX2FkZHJlc3MqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9icF93aG9hbWlfYXJnIChYRFIgKiwgYnBfd2hvYW1pX2FyZyopOworZXh0ZXJuICBib29sX3QgeGRyX2JwX3dob2FtaV9yZXMgKFhEUiAqLCBicF93aG9hbWlfcmVzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfYnBfZ2V0ZmlsZV9hcmcgKFhEUiAqLCBicF9nZXRmaWxlX2FyZyopOworZXh0ZXJuICBib29sX3QgeGRyX2JwX2dldGZpbGVfcmVzIChYRFIgKiwgYnBfZ2V0ZmlsZV9yZXMqKTsKKworI2Vsc2UgLyogSyZSIEMgKi8KK2V4dGVybiBib29sX3QgeGRyX2JwX21hY2hpbmVfbmFtZV90ICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfYnBfcGF0aF90ICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfYnBfZmlsZWlkX3QgKCk7CitleHRlcm4gYm9vbF90IHhkcl9pcF9hZGRyX3QgKCk7CitleHRlcm4gYm9vbF90IHhkcl9icF9hZGRyZXNzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfYnBfd2hvYW1pX2FyZyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2JwX3dob2FtaV9yZXMgKCk7CitleHRlcm4gYm9vbF90IHhkcl9icF9nZXRmaWxlX2FyZyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2JwX2dldGZpbGVfcmVzICgpOworCisjZW5kaWYgLyogSyZSIEMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFfQk9PVFBBUkFNX1BST1RfSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2Jvb3RwYXJhbV9wcm90LnggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ib290cGFyYW1fcHJvdC54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExN2U0MjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ib290cGFyYW1fcHJvdC54CkBAIC0wLDAgKzEsOTcgQEAKKy8qIEAoIylib290cGFyYW1fcHJvdC54CTIuMSA4OC8wOC8wMSA0LjAgUlBDU1JDICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBSUEMgZm9yIGJvb3RwYXJtcyBzZXJ2aWNlLgorICogVGhlcmUgYXJlIHR3byBwcm9jZWR1cmVzOgorICogICBXSE9BTUkgdGFrZXMgYSBuZXQgYWRkcmVzcyBhbmQgcmV0dXJucyBhIGNsaWVudCBuYW1lIGFuZCBhbHNvIGEKKyAqCWxpa2VseSBuZXQgYWRkcmVzcyBmb3Igcm91dGluZworICogICBHRVRGSUxFIHRha2VzIGEgY2xpZW50IG5hbWUgYW5kIGZpbGUgaWRlbnRpZmllciBhbmQgcmV0dXJucyB0aGUKKyAqCXNlcnZlciBuYW1lLCBzZXJ2ZXIgbmV0IGFkZHJlc3MgYW5kIHBhdGhuYW1lIGZvciB0aGUgZmlsZS4KKyAqICAgZmlsZSBpZGVudGlmaWVycyB0eXBpY2FsbHkgaW5jbHVkZSByb290LCBzd2FwLCBwdWIgYW5kIGR1bXAKKyAqLworCisjaWZkZWYgUlBDX0hEUgorJSNpbmNsdWRlIDxycGMvdHlwZXMuaD4KKyUjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyUjaW5jbHVkZSA8c3lzL2Vycm5vLmg+CislI2luY2x1ZGUgPG5mcy9uZnMuaD4KKyNlbmRpZgorCitjb25zdCBNQVhfTUFDSElORV9OQU1FICA9IDI1NTsKK2NvbnN0IE1BWF9QQVRIX0xFTgk9IDEwMjQ7Citjb25zdCBNQVhfRklMRUlECT0gMzI7Citjb25zdCBJUF9BRERSX1RZUEUJPSAxOworCit0eXBlZGVmCXN0cmluZwlicF9tYWNoaW5lX25hbWVfdDxNQVhfTUFDSElORV9OQU1FPjsKK3R5cGVkZWYJc3RyaW5nCWJwX3BhdGhfdDxNQVhfUEFUSF9MRU4+OwordHlwZWRlZglzdHJpbmcJYnBfZmlsZWlkX3Q8TUFYX0ZJTEVJRD47CisKK3N0cnVjdAlpcF9hZGRyX3QgeworCWNoYXIJbmV0OworCWNoYXIJaG9zdDsKKwljaGFyCWxoOworCWNoYXIJaW1wbm87Cit9OworCit1bmlvbiBicF9hZGRyZXNzIHN3aXRjaCAoaW50IGFkZHJlc3NfdHlwZSkgeworCWNhc2UgSVBfQUREUl9UWVBFOgorCQlpcF9hZGRyX3QJaXBfYWRkcjsKK307CisKK3N0cnVjdCBicF93aG9hbWlfYXJnIHsKKwlicF9hZGRyZXNzCQljbGllbnRfYWRkcmVzczsKK307CisKK3N0cnVjdCBicF93aG9hbWlfcmVzIHsKKwlicF9tYWNoaW5lX25hbWVfdAljbGllbnRfbmFtZTsKKwlicF9tYWNoaW5lX25hbWVfdAlkb21haW5fbmFtZTsKKwlicF9hZGRyZXNzCQlyb3V0ZXJfYWRkcmVzczsKK307CisKK3N0cnVjdCBicF9nZXRmaWxlX2FyZyB7CisJYnBfbWFjaGluZV9uYW1lX3QJY2xpZW50X25hbWU7CisJYnBfZmlsZWlkX3QJCWZpbGVfaWQ7Cit9OworCitzdHJ1Y3QgYnBfZ2V0ZmlsZV9yZXMgeworCWJwX21hY2hpbmVfbmFtZV90CXNlcnZlcl9uYW1lOworCWJwX2FkZHJlc3MJCXNlcnZlcl9hZGRyZXNzOworCWJwX3BhdGhfdAkJc2VydmVyX3BhdGg7Cit9OworCitwcm9ncmFtIEJPT1RQQVJBTVBST0cgeworCXZlcnNpb24gQk9PVFBBUkFNVkVSUyB7CisJCWJwX3dob2FtaV9yZXMJQk9PVFBBUkFNUFJPQ19XSE9BTUkoYnBfd2hvYW1pX2FyZykgPSAxOworCQlicF9nZXRmaWxlX3JlcwlCT09UUEFSQU1QUk9DX0dFVEZJTEUoYnBfZ2V0ZmlsZV9hcmcpID0gMjsKKwl9ID0gMTsKK30gPSAxMDAwMjY7CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9rZXlfcHJvdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMva2V5X3Byb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmJkYmY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMva2V5X3Byb3QuaApAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCisgKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KKyAqLworCisjaWZuZGVmIF9LRVlfUFJPVF9IX1JQQ0dFTgorI2RlZmluZSBfS0VZX1BST1RfSF9SUENHRU4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiAwCisjcHJhZ21hIGlkZW50ICJAKCMpa2V5X3Byb3QueAkxLjcJOTQvMDQvMjkgU01JIgorI2VuZGlmCisKKy8qIENvcHlyaWdodCAoYykgIDE5OTAsIDE5OTEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAqLworCisvKgorICogQ29tcGlsZWQgZnJvbSBrZXlfcHJvdC54IHVzaW5nIHJwY2dlbi4KKyAqIERPIE5PVCBFRElUIFRISVMgRklMRSEKKyAqIFRoaXMgaXMgTk9UIHNvdXJjZSBjb2RlIQorICovCisjZGVmaW5lIFBST09UIDMKKyNkZWZpbmUgSEVYTU9EVUxVUyAiZDRhMGJhMDI1MGI2ZmQyZWM2MjZlN2VmZDYzN2RmNzZjNzE2ZTIyZDA5NDRiODhiIgorI2RlZmluZSBIRVhLRVlCWVRFUyA0OAorI2RlZmluZSBLRVlTSVpFIDE5MgorI2RlZmluZSBLRVlCWVRFUyAyNAorI2RlZmluZSBLRVlDSEVDS1NVTVNJWkUgMTYKKworZW51bSBrZXlzdGF0dXMgeworCUtFWV9TVUNDRVNTID0gMCwKKwlLRVlfTk9TRUNSRVQgPSAxLAorCUtFWV9VTktOT1dOID0gMiwKKwlLRVlfU1lTVEVNRVJSID0gMywKK307Cit0eXBlZGVmIGVudW0ga2V5c3RhdHVzIGtleXN0YXR1czsKKwordHlwZWRlZiBjaGFyIGtleWJ1ZltIRVhLRVlCWVRFU107CisKK3R5cGVkZWYgY2hhciAqbmV0bmFtZXN0cjsKKworc3RydWN0IGNyeXB0a2V5YXJnIHsKKwluZXRuYW1lc3RyIHJlbW90ZW5hbWU7CisJZGVzX2Jsb2NrIGRlc2tleTsKK307Cit0eXBlZGVmIHN0cnVjdCBjcnlwdGtleWFyZyBjcnlwdGtleWFyZzsKKworc3RydWN0IGNyeXB0a2V5YXJnMiB7CisJbmV0bmFtZXN0ciByZW1vdGVuYW1lOworCW5ldG9iaiByZW1vdGVrZXk7CisJZGVzX2Jsb2NrIGRlc2tleTsKK307Cit0eXBlZGVmIHN0cnVjdCBjcnlwdGtleWFyZzIgY3J5cHRrZXlhcmcyOworCitzdHJ1Y3QgY3J5cHRrZXlyZXMgeworCWtleXN0YXR1cyBzdGF0dXM7CisJdW5pb24geworCQlkZXNfYmxvY2sgZGVza2V5OworCX0gY3J5cHRrZXlyZXNfdTsKK307Cit0eXBlZGVmIHN0cnVjdCBjcnlwdGtleXJlcyBjcnlwdGtleXJlczsKKyNkZWZpbmUgTUFYR0lEUyAxNgorCitzdHJ1Y3QgdW5peGNyZWQgeworCXVfaW50IHVpZDsKKwl1X2ludCBnaWQ7CisJc3RydWN0IHsKKwkJdV9pbnQgZ2lkc19sZW47CisJCXVfaW50ICpnaWRzX3ZhbDsKKwl9IGdpZHM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgdW5peGNyZWQgdW5peGNyZWQ7CisKK3N0cnVjdCBnZXRjcmVkcmVzIHsKKwlrZXlzdGF0dXMgc3RhdHVzOworCXVuaW9uIHsKKwkJdW5peGNyZWQgY3JlZDsKKwl9IGdldGNyZWRyZXNfdTsKK307Cit0eXBlZGVmIHN0cnVjdCBnZXRjcmVkcmVzIGdldGNyZWRyZXM7CisKK3N0cnVjdCBrZXlfbmV0c3RhcmcgeworCWtleWJ1ZiBzdF9wcml2X2tleTsKKwlrZXlidWYgc3RfcHViX2tleTsKKwluZXRuYW1lc3RyIHN0X25ldG5hbWU7Cit9OwordHlwZWRlZiBzdHJ1Y3Qga2V5X25ldHN0YXJnIGtleV9uZXRzdGFyZzsKKworc3RydWN0IGtleV9uZXRzdHJlcyB7CisJa2V5c3RhdHVzIHN0YXR1czsKKwl1bmlvbiB7CisJCWtleV9uZXRzdGFyZyBrbmV0OworCX0ga2V5X25ldHN0cmVzX3U7Cit9OwordHlwZWRlZiBzdHJ1Y3Qga2V5X25ldHN0cmVzIGtleV9uZXRzdHJlczsKKworI2lmbmRlZiBvcGFxdWUKKyNkZWZpbmUgb3BhcXVlIGNoYXIKKyNlbmRpZgorCisKKyNkZWZpbmUgS0VZX1BST0cgMTAwMDI5CisjZGVmaW5lIEtFWV9WRVJTIDEKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIEtFWV9TRVQgMQorZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfc2V0XzEoY2hhciAqLCBDTElFTlQgKik7CitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9zZXRfMV9zdmMoY2hhciAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgS0VZX0VOQ1JZUFQgMgorZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzEoY3J5cHRrZXlhcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzFfc3ZjKGNyeXB0a2V5YXJnICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfREVDUllQVCAzCitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfMShjcnlwdGtleWFyZyAqLCBDTElFTlQgKik7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfMV9zdmMoY3J5cHRrZXlhcmcgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9HRU4gNAorZXh0ZXJuICBkZXNfYmxvY2sgKiBrZXlfZ2VuXzEodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIGRlc19ibG9jayAqIGtleV9nZW5fMV9zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgS0VZX0dFVENSRUQgNQorZXh0ZXJuICBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMShuZXRuYW1lc3RyICosIENMSUVOVCAqKTsKK2V4dGVybiAgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzFfc3ZjKG5ldG5hbWVzdHIgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gaW50IGtleV9wcm9nXzFfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisjZWxzZSAvKiBLJlIgQyAqLworI2RlZmluZSBLRVlfU0VUIDEKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X3NldF8xKCk7CitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9zZXRfMV9zdmMoKTsKKyNkZWZpbmUgS0VZX0VOQ1JZUFQgMgorZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzEoKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF8xX3N2YygpOworI2RlZmluZSBLRVlfREVDUllQVCAzCitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfMSgpOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzFfc3ZjKCk7CisjZGVmaW5lIEtFWV9HRU4gNAorZXh0ZXJuICBkZXNfYmxvY2sgKiBrZXlfZ2VuXzEoKTsKK2V4dGVybiAgZGVzX2Jsb2NrICoga2V5X2dlbl8xX3N2YygpOworI2RlZmluZSBLRVlfR0VUQ1JFRCA1CitleHRlcm4gIGdldGNyZWRyZXMgKiBrZXlfZ2V0Y3JlZF8xKCk7CitleHRlcm4gIGdldGNyZWRyZXMgKiBrZXlfZ2V0Y3JlZF8xX3N2YygpOworZXh0ZXJuIGludCBrZXlfcHJvZ18xX2ZyZWVyZXN1bHQgKCk7CisjZW5kaWYgLyogSyZSIEMgKi8KKyNkZWZpbmUgS0VZX1ZFUlMyIDIKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9zZXRfMihjaGFyICosIENMSUVOVCAqKTsKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X3NldF8yX3N2YyhjaGFyICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzIoY3J5cHRrZXlhcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzJfc3ZjKGNyeXB0a2V5YXJnICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzIoY3J5cHRrZXlhcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzJfc3ZjKGNyeXB0a2V5YXJnICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuICBkZXNfYmxvY2sgKiBrZXlfZ2VuXzIodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIGRlc19ibG9jayAqIGtleV9nZW5fMl9zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiAgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzIobmV0bmFtZXN0ciAqLCBDTElFTlQgKik7CitleHRlcm4gIGdldGNyZWRyZXMgKiBrZXlfZ2V0Y3JlZF8yX3N2YyhuZXRuYW1lc3RyICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfRU5DUllQVF9QSyA2CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfcGtfMihjcnlwdGtleWFyZzIgKiwgQ0xJRU5UICopOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0X3BrXzJfc3ZjKGNyeXB0a2V5YXJnMiAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgS0VZX0RFQ1JZUFRfUEsgNworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0X3BrXzIoY3J5cHRrZXlhcmcyICosIENMSUVOVCAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF9wa18yX3N2YyhjcnlwdGtleWFyZzIgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9ORVRfUFVUIDgKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X25ldF9wdXRfMihrZXlfbmV0c3RhcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfbmV0X3B1dF8yX3N2YyhrZXlfbmV0c3RhcmcgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9ORVRfR0VUIDkKK2V4dGVybiAga2V5X25ldHN0cmVzICoga2V5X25ldF9nZXRfMih2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAga2V5X25ldHN0cmVzICoga2V5X25ldF9nZXRfMl9zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgS0VZX0dFVF9DT05WIDEwCitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2dldF9jb252XzIoY2hhciAqLCBDTElFTlQgKik7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2dldF9jb252XzJfc3ZjKGNoYXIgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gaW50IGtleV9wcm9nXzJfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisjZWxzZSAvKiBLJlIgQyAqLworZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfc2V0XzIoKTsKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X3NldF8yX3N2YygpOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzIoKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF8yX3N2YygpOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzIoKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF8yX3N2YygpOworZXh0ZXJuICBkZXNfYmxvY2sgKiBrZXlfZ2VuXzIoKTsKK2V4dGVybiAgZGVzX2Jsb2NrICoga2V5X2dlbl8yX3N2YygpOworZXh0ZXJuICBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMigpOworZXh0ZXJuICBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMl9zdmMoKTsKKyNkZWZpbmUgS0VZX0VOQ1JZUFRfUEsgNgorZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0X3BrXzIoKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF9wa18yX3N2YygpOworI2RlZmluZSBLRVlfREVDUllQVF9QSyA3CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfcGtfMigpOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0X3BrXzJfc3ZjKCk7CisjZGVmaW5lIEtFWV9ORVRfUFVUIDgKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X25ldF9wdXRfMigpOworZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfbmV0X3B1dF8yX3N2YygpOworI2RlZmluZSBLRVlfTkVUX0dFVCA5CitleHRlcm4gIGtleV9uZXRzdHJlcyAqIGtleV9uZXRfZ2V0XzIoKTsKK2V4dGVybiAga2V5X25ldHN0cmVzICoga2V5X25ldF9nZXRfMl9zdmMoKTsKKyNkZWZpbmUgS0VZX0dFVF9DT05WIDEwCitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2dldF9jb252XzIoKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZ2V0X2NvbnZfMl9zdmMoKTsKK2V4dGVybiBpbnQga2V5X3Byb2dfMl9mcmVlcmVzdWx0ICgpOworI2VuZGlmIC8qIEsmUiBDICovCisKKy8qIHRoZSB4ZHIgZnVuY3Rpb25zICovCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICBib29sX3QgeGRyX2tleXN0YXR1cyAoWERSICosIGtleXN0YXR1cyopOworZXh0ZXJuICBib29sX3QgeGRyX2tleWJ1ZiAoWERSICosIGtleWJ1Zik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbmV0bmFtZXN0ciAoWERSICosIG5ldG5hbWVzdHIqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9jcnlwdGtleWFyZyAoWERSICosIGNyeXB0a2V5YXJnKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfY3J5cHRrZXlhcmcyIChYRFIgKiwgY3J5cHRrZXlhcmcyKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfY3J5cHRrZXlyZXMgKFhEUiAqLCBjcnlwdGtleXJlcyopOworZXh0ZXJuICBib29sX3QgeGRyX3VuaXhjcmVkIChYRFIgKiwgdW5peGNyZWQqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9nZXRjcmVkcmVzIChYRFIgKiwgZ2V0Y3JlZHJlcyopOworZXh0ZXJuICBib29sX3QgeGRyX2tleV9uZXRzdGFyZyAoWERSICosIGtleV9uZXRzdGFyZyopOworZXh0ZXJuICBib29sX3QgeGRyX2tleV9uZXRzdHJlcyAoWERSICosIGtleV9uZXRzdHJlcyopOworCisjZWxzZSAvKiBLJlIgQyAqLworZXh0ZXJuIGJvb2xfdCB4ZHJfa2V5c3RhdHVzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfa2V5YnVmICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbmV0bmFtZXN0ciAoKTsKK2V4dGVybiBib29sX3QgeGRyX2NyeXB0a2V5YXJnICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfY3J5cHRrZXlhcmcyICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfY3J5cHRrZXlyZXMgKCk7CitleHRlcm4gYm9vbF90IHhkcl91bml4Y3JlZCAoKTsKK2V4dGVybiBib29sX3QgeGRyX2dldGNyZWRyZXMgKCk7CitleHRlcm4gYm9vbF90IHhkcl9rZXlfbmV0c3RhcmcgKCk7CitleHRlcm4gYm9vbF90IHhkcl9rZXlfbmV0c3RyZXMgKCk7CisKKyNlbmRpZiAvKiBLJlIgQyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIV9LRVlfUFJPVF9IX1JQQ0dFTiAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMva2V5X3Byb3QueCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2tleV9wcm90LngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhZjk0MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2tleV9wcm90LngKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBLZXkgc2VydmVyIHByb3RvY29sIGRlZmluaXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBrZXlzZXJ2ZXIgaXMgYSBwdWJsaWMga2V5IHN0b3JhZ2UvZW5jcnlwdGlvbi9kZWNyeXB0aW9uIHNlcnZpY2UKKyAqIFRoZSBlbmNyeXB0aW9uIG1ldGhvZCB1c2VkIGlzIGJhc2VkIG9uIHRoZSBEaWZmaWUtSGVsbG1hbiBleHBvbmVudGlhbAorICoga2V5IGV4Y2hhbmdlIHRlY2hub2xvZ3kuCisgKgorICogVGhlIGtleSBzZXJ2ZXIgaXMgbG9jYWwgdG8gZWFjaCBtYWNoaW5lLCBha2luIHRvIHRoZSBwb3J0bWFwcGVyLgorICogVW5kZXIgVEktUlBDLCBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGtleXNlcnZlciBpcyB0aHJvdWdoIHRoZQorICogbG9vcGJhY2sgdHJhbnNwb3J0LgorICoKKyAqIE5PVEU6IFRoaXMgLnggZmlsZSBnZW5lcmF0ZXMgdGhlIFVTRVIgbGV2ZWwgaGVhZGVycyBmb3IgdGhlIGtleXNlcnZlci4KKyAqIHRoZSBLRVJORUwgbGV2ZWwgaGVhZGVycyBhcmUgY3JlYXRlZCBieSBoYW5kIGFzIHRoZXkga2VybmVsIGhhcyBzcGVjaWFsCisgKiByZXF1aXJlbWVudHMuCisgKi8KKworJSNpZiAwCislI3ByYWdtYSBpZGVudAkiQCgjKWtleV9wcm90LngJMS43CTk0LzA0LzI5IFNNSSIKKyUjZW5kaWYKKyUKKyUvKiBDb3B5cmlnaHQgKGMpICAxOTkwLCAxOTkxIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gKi8KKyUKKyUvKgorJSAqIENvbXBpbGVkIGZyb20ga2V5X3Byb3QueCB1c2luZyBycGNnZW4uCislICogRE8gTk9UIEVESVQgVEhJUyBGSUxFIQorJSAqIFRoaXMgaXMgTk9UIHNvdXJjZSBjb2RlIQorJSAqLworCisvKgorICogUFJPT1QgYW5kIE1PRFVMVVMgZGVmaW5lIHRoZSB3YXkgdGhlIERpZmZpZS1IZWxsbWFuIGtleSBpcyBnZW5lcmF0ZWQuCisgKgorICogTU9EVUxVUyBzaG91bGQgYmUgY2hvc2VuIGFzIGEgcHJpbWUgb2YgdGhlIGZvcm06IE1PRFVMVVMgPT0gMipwICsgMSwKKyAqIHdoZXJlIHAgaXMgYWxzbyBwcmltZS4KKyAqCisgKiBQUk9PVCBzYXRpc2ZpZXMgdGhlIGZvbGxvd2luZyB0d28gY29uZGl0aW9uczoKKyAqICgxKSAoUFJPT1QgKiogMikgJSBNT0RVTFVTICE9IDEKKyAqICgyKSAoUFJPT1QgKiogcCkgJSBNT0RVTFVTICE9IDEKKyAqCisgKi8KKworY29uc3QgUFJPT1QgPSAzOworY29uc3QgSEVYTU9EVUxVUyA9ICJkNGEwYmEwMjUwYjZmZDJlYzYyNmU3ZWZkNjM3ZGY3NmM3MTZlMjJkMDk0NGI4OGIiOworCitjb25zdCBIRVhLRVlCWVRFUyA9IDQ4OwkJLyogSEVYS0VZQllURVMgPT0gc3RybGVuKEhFWE1PRFVMVVMpICovCitjb25zdCBLRVlTSVpFID0gMTkyOwkJLyogS0VZU0laRSA9PSBiaXQgbGVuZ3RoIG9mIGtleSAqLworY29uc3QgS0VZQllURVMgPSAyNDsJCS8qIGJ5dGUgbGVuZ3RoIG9mIGtleSAqLworCisvKgorICogVGhlIGZpcnN0IDE2IGhleCBkaWdpdHMgb2YgdGhlIGVuY3J5cHRlZCBzZWNyZXQga2V5IGFyZSB1c2VkIGFzCisgKiBhIGNoZWNrc3VtIGluIHRoZSBkYXRhYmFzZS4KKyAqLworY29uc3QgS0VZQ0hFQ0tTVU1TSVpFID0gMTY7CisKKy8qCisgKiBzdGF0dXMgb2Ygb3BlcmF0aW9uCisgKi8KK2VudW0ga2V5c3RhdHVzIHsKKwlLRVlfU1VDQ0VTUywJLyogbm8gcHJvYmxlbXMgKi8KKwlLRVlfTk9TRUNSRVQsCS8qIG5vIHNlY3JldCBrZXkgc3RvcmVkICovCisJS0VZX1VOS05PV04sCS8qIHVua25vd24gbmV0bmFtZSAqLworCUtFWV9TWVNURU1FUlIgCS8qIHN5c3RlbSBlcnJvciAob3V0IG9mIG1lbW9yeSwgZW5jcnlwdGlvbiBmYWlsdXJlKSAqLworfTsKKwordHlwZWRlZiBvcGFxdWUga2V5YnVmW0hFWEtFWUJZVEVTXTsJLyogc3RvcmUga2V5IGluIGhleCAqLworCit0eXBlZGVmIHN0cmluZyBuZXRuYW1lc3RyPE1BWE5FVE5BTUVMRU4+OworCisvKgorICogQXJndW1lbnQgdG8gRU5DUllQVCBvciBERUNSWVBUCisgKi8KK3N0cnVjdCBjcnlwdGtleWFyZyB7CisJbmV0bmFtZXN0ciByZW1vdGVuYW1lOworCWRlc19ibG9jayBkZXNrZXk7Cit9OworCisvKgorICogQXJndW1lbnQgdG8gRU5DUllQVF9QSyBvciBERUNSWVBUX1BLCisgKi8KK3N0cnVjdCBjcnlwdGtleWFyZzIgeworCW5ldG5hbWVzdHIgcmVtb3RlbmFtZTsKKwluZXRvYmoJcmVtb3Rla2V5OwkvKiBDb250YWlucyBhIGxlbmd0aCB1cCB0byAxMDI0IGJ5dGVzICovCisJZGVzX2Jsb2NrIGRlc2tleTsKK307CisKKworLyoKKyAqIFJlc3VsdCBvZiBFTkNSWVBULCBERUNSWVBULCBFTkNSWVBUX1BLLCBhbmQgREVDUllQVF9QSworICovCit1bmlvbiBjcnlwdGtleXJlcyBzd2l0Y2ggKGtleXN0YXR1cyBzdGF0dXMpIHsKK2Nhc2UgS0VZX1NVQ0NFU1M6CisJZGVzX2Jsb2NrIGRlc2tleTsKK2RlZmF1bHQ6CisJdm9pZDsKK307CisKK2NvbnN0IE1BWEdJRFMgID0gMTY7CS8qIG1heCBudW1iZXIgb2YgZ2lkcyBpbiBnaWQgbGlzdCAqLworCisvKgorICogVW5peCBjcmVkZW50aWFsCisgKi8KK3N0cnVjdCB1bml4Y3JlZCB7CisJdV9pbnQgdWlkOworCXVfaW50IGdpZDsKKwl1X2ludCBnaWRzPE1BWEdJRFM+OworfTsKKworLyoKKyAqIFJlc3VsdCByZXR1cm5lZCBmcm9tIEdFVENSRUQKKyAqLwordW5pb24gZ2V0Y3JlZHJlcyBzd2l0Y2ggKGtleXN0YXR1cyBzdGF0dXMpIHsKK2Nhc2UgS0VZX1NVQ0NFU1M6CisJdW5peGNyZWQgY3JlZDsKK2RlZmF1bHQ6CisJdm9pZDsKK307CisvKgorICoga2V5X25ldHN0YXJnOworICovCisKK3N0cnVjdCBrZXlfbmV0c3RhcmcgeworCWtleWJ1ZiBzdF9wcml2X2tleTsKKwlrZXlidWYgc3RfcHViX2tleTsKKwluZXRuYW1lc3RyIHN0X25ldG5hbWU7Cit9OworCit1bmlvbiBrZXlfbmV0c3RyZXMgc3dpdGNoIChrZXlzdGF0dXMgc3RhdHVzKXsKK2Nhc2UgS0VZX1NVQ0NFU1M6CisJa2V5X25ldHN0YXJnIGtuZXQ7CitkZWZhdWx0OgorCXZvaWQ7Cit9OworCisjaWZkZWYgUlBDX0hEUgorJQorJSNpZm5kZWYgb3BhcXVlCislI2RlZmluZSBvcGFxdWUgY2hhcgorJSNlbmRpZgorJQorI2VuZGlmCitwcm9ncmFtIEtFWV9QUk9HIHsKKwl2ZXJzaW9uIEtFWV9WRVJTIHsKKworCQkvKgorCQkgKiBUaGlzIGlzIG15IHNlY3JldCBrZXkuCisJIAkgKiBTdG9yZSBpdCBmb3IgbWUuCisJCSAqLworCQlrZXlzdGF0dXMKKwkJS0VZX1NFVChrZXlidWYpID0gMTsKKworCQkvKgorCQkgKiBJIHdhbnQgdG8gdGFsayB0byBYLgorCQkgKiBFbmNyeXB0IGEgY29udmVyc2F0aW9uIGtleSBmb3IgbWUuCisJIAkgKi8KKwkJY3J5cHRrZXlyZXMKKwkJS0VZX0VOQ1JZUFQoY3J5cHRrZXlhcmcpID0gMjsKKworCQkvKgorCQkgKiBYIGp1c3Qgc2VudCBtZSBhIG1lc3NhZ2UuCisJCSAqIERlY3J5cHQgdGhlIGNvbnZlcnNhdGlvbiBrZXkgZm9yIG1lLgorCQkgKi8KKwkJY3J5cHRrZXlyZXMKKwkJS0VZX0RFQ1JZUFQoY3J5cHRrZXlhcmcpID0gMzsKKworCQkvKgorCQkgKiBHZW5lcmF0ZSBhIHNlY3VyZSBjb252ZXJzYXRpb24ga2V5IGZvciBtZQorCQkgKi8KKwkJZGVzX2Jsb2NrCisJCUtFWV9HRU4odm9pZCkgPSA0OworCisJCS8qCisJCSAqIEdldCBtZSB0aGUgdWlkLCBnaWQgYW5kIGdyb3VwLWFjY2Vzcy1saXN0IGFzc29jaWF0ZWQKKwkJICogd2l0aCB0aGlzIG5ldG5hbWUgKGZvciBrZXJuZWwgd2hpY2ggY2Fubm90IHVzZSBOSVMpCisJCSAqLworCQlnZXRjcmVkcmVzCisJCUtFWV9HRVRDUkVEKG5ldG5hbWVzdHIpID0gNTsKKwl9ID0gMTsKKwl2ZXJzaW9uIEtFWV9WRVJTMiB7CisKKwkJLyoKKwkJICogIyMjIyMjIworCQkgKiBQcm9jZWR1cmVzIDEtNSBhcmUgaWRlbnRpY2FsIHRvIHZlcnNpb24gMQorCQkgKiAjIyMjIyMjCisJCSAqLworCisJCS8qCisJCSAqIFRoaXMgaXMgbXkgc2VjcmV0IGtleS4KKwkgCSAqIFN0b3JlIGl0IGZvciBtZS4KKwkJICovCisJCWtleXN0YXR1cworCQlLRVlfU0VUKGtleWJ1ZikgPSAxOworCisJCS8qCisJCSAqIEkgd2FudCB0byB0YWxrIHRvIFguCisJCSAqIEVuY3J5cHQgYSBjb252ZXJzYXRpb24ga2V5IGZvciBtZS4KKwkgCSAqLworCQljcnlwdGtleXJlcworCQlLRVlfRU5DUllQVChjcnlwdGtleWFyZykgPSAyOworCisJCS8qCisJCSAqIFgganVzdCBzZW50IG1lIGEgbWVzc2FnZS4KKwkJICogRGVjcnlwdCB0aGUgY29udmVyc2F0aW9uIGtleSBmb3IgbWUuCisJCSAqLworCQljcnlwdGtleXJlcworCQlLRVlfREVDUllQVChjcnlwdGtleWFyZykgPSAzOworCisJCS8qCisJCSAqIEdlbmVyYXRlIGEgc2VjdXJlIGNvbnZlcnNhdGlvbiBrZXkgZm9yIG1lCisJCSAqLworCQlkZXNfYmxvY2sKKwkJS0VZX0dFTih2b2lkKSA9IDQ7CisKKwkJLyoKKwkJICogR2V0IG1lIHRoZSB1aWQsIGdpZCBhbmQgZ3JvdXAtYWNjZXNzLWxpc3QgYXNzb2NpYXRlZAorCQkgKiB3aXRoIHRoaXMgbmV0bmFtZSAoZm9yIGtlcm5lbCB3aGljaCBjYW5ub3QgdXNlIE5JUykKKwkJICovCisJCWdldGNyZWRyZXMKKwkJS0VZX0dFVENSRUQobmV0bmFtZXN0cikgPSA1OworCisJCS8qCisJCSAqIEkgd2FudCB0byB0YWxrIHRvIFguIGFuZCBJIGtub3cgWCdzIHB1YmxpYyBrZXkKKwkJICogRW5jcnlwdCBhIGNvbnZlcnNhdGlvbiBrZXkgZm9yIG1lLgorCSAJICovCisJCWNyeXB0a2V5cmVzCisJCUtFWV9FTkNSWVBUX1BLKGNyeXB0a2V5YXJnMikgPSA2OworCisJCS8qCisJCSAqIFgganVzdCBzZW50IG1lIGEgbWVzc2FnZS4gYW5kIEkga25vdyBYJ3MgcHVibGljIGtleQorCQkgKiBEZWNyeXB0IHRoZSBjb252ZXJzYXRpb24ga2V5IGZvciBtZS4KKwkJICovCisJCWNyeXB0a2V5cmVzCisJCUtFWV9ERUNSWVBUX1BLKGNyeXB0a2V5YXJnMikgPSA3OworCisJCS8qCisJCSAqIFN0b3JlIG15IHB1YmxpYyBrZXksIG5ldG5hbWUgYW5kIHByaXZhdGUga2V5LgorCQkgKi8KKwkJa2V5c3RhdHVzCisJCUtFWV9ORVRfUFVUKGtleV9uZXRzdGFyZykgPSA4OworCisJCS8qCisJCSAqIFJldHJpZXZlIG15IHB1YmxpYyBrZXksIG5ldG5hbWUgYW5kIHByaXZhdGUga2V5LgorCQkgKi8KKyAJCWtleV9uZXRzdHJlcworCQlLRVlfTkVUX0dFVCh2b2lkKSA9IDk7CisKKwkJLyoKKwkJICogUmV0dXJuIG1lIHRoZSBjb252ZXJzYXRpb24ga2V5IHRoYXQgaXMgY29uc3RydWN0ZWQKKwkJICogZnJvbSBteSBzZWNyZXQga2V5IGFuZCB0aGlzIHB1YmxpY2tleS4KKwkJICovCisKKwkJY3J5cHRrZXlyZXMKKwkJS0VZX0dFVF9DT05WKGtleWJ1ZikgPSAxMDsKKworCisJfSA9IDI7Cit9ID0gMTAwMDI5OwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMva2xtX3Byb3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2tsbV9wcm90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVjMjgxZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2tsbV9wcm90LmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLgorICogSXQgd2FzIGdlbmVyYXRlZCB1c2luZyBycGNnZW4uCisgKi8KKworI2lmbmRlZiBfS0xNX1BST1RfSF9SUENHRU4KKyNkZWZpbmUgX0tMTV9QUk9UX0hfUlBDR0VOCisKKyNpbmNsdWRlIDxycGMvcnBjLmg+CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIExNX01BWFNUUkxFTiAxMDI0CisKK2VudW0ga2xtX3N0YXRzIHsKKwlrbG1fZ3JhbnRlZCA9IDAsCisJa2xtX2RlbmllZCA9IDEsCisJa2xtX2RlbmllZF9ub2xvY2tzID0gMiwKKwlrbG1fd29ya2luZyA9IDMsCit9OwordHlwZWRlZiBlbnVtIGtsbV9zdGF0cyBrbG1fc3RhdHM7CisKK3N0cnVjdCBrbG1fbG9jayB7CisJY2hhciAqc2VydmVyX25hbWU7CisJbmV0b2JqIGZoOworCWludCBwaWQ7CisJdV9pbnQgbF9vZmZzZXQ7CisJdV9pbnQgbF9sZW47Cit9OwordHlwZWRlZiBzdHJ1Y3Qga2xtX2xvY2sga2xtX2xvY2s7CisKK3N0cnVjdCBrbG1faG9sZGVyIHsKKwlib29sX3QgZXhjbHVzaXZlOworCWludCBzdmlkOworCXVfaW50IGxfb2Zmc2V0OworCXVfaW50IGxfbGVuOworfTsKK3R5cGVkZWYgc3RydWN0IGtsbV9ob2xkZXIga2xtX2hvbGRlcjsKKworc3RydWN0IGtsbV9zdGF0IHsKKwlrbG1fc3RhdHMgc3RhdDsKK307Cit0eXBlZGVmIHN0cnVjdCBrbG1fc3RhdCBrbG1fc3RhdDsKKworc3RydWN0IGtsbV90ZXN0cnBseSB7CisJa2xtX3N0YXRzIHN0YXQ7CisJdW5pb24geworCQlzdHJ1Y3Qga2xtX2hvbGRlciBob2xkZXI7CisJfSBrbG1fdGVzdHJwbHlfdTsKK307Cit0eXBlZGVmIHN0cnVjdCBrbG1fdGVzdHJwbHkga2xtX3Rlc3RycGx5OworCitzdHJ1Y3Qga2xtX2xvY2thcmdzIHsKKwlib29sX3QgYmxvY2s7CisJYm9vbF90IGV4Y2x1c2l2ZTsKKwlzdHJ1Y3Qga2xtX2xvY2sgYWxvY2s7Cit9OwordHlwZWRlZiBzdHJ1Y3Qga2xtX2xvY2thcmdzIGtsbV9sb2NrYXJnczsKKworc3RydWN0IGtsbV90ZXN0YXJncyB7CisJYm9vbF90IGV4Y2x1c2l2ZTsKKwlzdHJ1Y3Qga2xtX2xvY2sgYWxvY2s7Cit9OwordHlwZWRlZiBzdHJ1Y3Qga2xtX3Rlc3RhcmdzIGtsbV90ZXN0YXJnczsKKworc3RydWN0IGtsbV91bmxvY2thcmdzIHsKKwlzdHJ1Y3Qga2xtX2xvY2sgYWxvY2s7Cit9OwordHlwZWRlZiBzdHJ1Y3Qga2xtX3VubG9ja2FyZ3Mga2xtX3VubG9ja2FyZ3M7CisKKyNkZWZpbmUgS0xNX1BST0cgMTAwMDIwCisjZGVmaW5lIEtMTV9WRVJTIDEKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIEtMTV9URVNUIDEKK2V4dGVybiAga2xtX3Rlc3RycGx5ICoga2xtX3Rlc3RfMShzdHJ1Y3Qga2xtX3Rlc3RhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAga2xtX3Rlc3RycGx5ICoga2xtX3Rlc3RfMV9zdmMoc3RydWN0IGtsbV90ZXN0YXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgS0xNX0xPQ0sgMgorZXh0ZXJuICBrbG1fc3RhdCAqIGtsbV9sb2NrXzEoc3RydWN0IGtsbV9sb2NrYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIGtsbV9zdGF0ICoga2xtX2xvY2tfMV9zdmMoc3RydWN0IGtsbV9sb2NrYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgS0xNX0NBTkNFTCAzCitleHRlcm4gIGtsbV9zdGF0ICoga2xtX2NhbmNlbF8xKHN0cnVjdCBrbG1fbG9ja2FyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBrbG1fc3RhdCAqIGtsbV9jYW5jZWxfMV9zdmMoc3RydWN0IGtsbV9sb2NrYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgS0xNX1VOTE9DSyA0CitleHRlcm4gIGtsbV9zdGF0ICoga2xtX3VubG9ja18xKHN0cnVjdCBrbG1fdW5sb2NrYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIGtsbV9zdGF0ICoga2xtX3VubG9ja18xX3N2YyhzdHJ1Y3Qga2xtX3VubG9ja2FyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gaW50IGtsbV9wcm9nXzFfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisjZWxzZSAvKiBLJlIgQyAqLworI2RlZmluZSBLTE1fVEVTVCAxCitleHRlcm4gIGtsbV90ZXN0cnBseSAqIGtsbV90ZXN0XzEoKTsKK2V4dGVybiAga2xtX3Rlc3RycGx5ICoga2xtX3Rlc3RfMV9zdmMoKTsKKyNkZWZpbmUgS0xNX0xPQ0sgMgorZXh0ZXJuICBrbG1fc3RhdCAqIGtsbV9sb2NrXzEoKTsKK2V4dGVybiAga2xtX3N0YXQgKiBrbG1fbG9ja18xX3N2YygpOworI2RlZmluZSBLTE1fQ0FOQ0VMIDMKK2V4dGVybiAga2xtX3N0YXQgKiBrbG1fY2FuY2VsXzEoKTsKK2V4dGVybiAga2xtX3N0YXQgKiBrbG1fY2FuY2VsXzFfc3ZjKCk7CisjZGVmaW5lIEtMTV9VTkxPQ0sgNAorZXh0ZXJuICBrbG1fc3RhdCAqIGtsbV91bmxvY2tfMSgpOworZXh0ZXJuICBrbG1fc3RhdCAqIGtsbV91bmxvY2tfMV9zdmMoKTsKK2V4dGVybiBpbnQga2xtX3Byb2dfMV9mcmVlcmVzdWx0ICgpOworI2VuZGlmIC8qIEsmUiBDICovCisKKy8qIHRoZSB4ZHIgZnVuY3Rpb25zICovCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICBib29sX3QgeGRyX2tsbV9zdGF0cyAoWERSICosIGtsbV9zdGF0cyopOworZXh0ZXJuICBib29sX3QgeGRyX2tsbV9sb2NrIChYRFIgKiwga2xtX2xvY2sqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9rbG1faG9sZGVyIChYRFIgKiwga2xtX2hvbGRlciopOworZXh0ZXJuICBib29sX3QgeGRyX2tsbV9zdGF0IChYRFIgKiwga2xtX3N0YXQqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9rbG1fdGVzdHJwbHkgKFhEUiAqLCBrbG1fdGVzdHJwbHkqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9rbG1fbG9ja2FyZ3MgKFhEUiAqLCBrbG1fbG9ja2FyZ3MqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9rbG1fdGVzdGFyZ3MgKFhEUiAqLCBrbG1fdGVzdGFyZ3MqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9rbG1fdW5sb2NrYXJncyAoWERSICosIGtsbV91bmxvY2thcmdzKik7CisKKyNlbHNlIC8qIEsmUiBDICovCitleHRlcm4gYm9vbF90IHhkcl9rbG1fc3RhdHMgKCk7CitleHRlcm4gYm9vbF90IHhkcl9rbG1fbG9jayAoKTsKK2V4dGVybiBib29sX3QgeGRyX2tsbV9ob2xkZXIgKCk7CitleHRlcm4gYm9vbF90IHhkcl9rbG1fc3RhdCAoKTsKK2V4dGVybiBib29sX3QgeGRyX2tsbV90ZXN0cnBseSAoKTsKK2V4dGVybiBib29sX3QgeGRyX2tsbV9sb2NrYXJncyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2tsbV90ZXN0YXJncyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2tsbV91bmxvY2thcmdzICgpOworCisjZW5kaWYgLyogSyZSIEMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFfS0xNX1BST1RfSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2tsbV9wcm90LnggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9rbG1fcHJvdC54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZTViMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9rbG1fcHJvdC54CkBAIC0wLDAgKzEsMTMwIEBACisvKiBAKCMpa2xtX3Byb3QueAkyLjEgODgvMDgvMDEgNC4wIFJQQ1NSQyAqLworCisvKgorICogS2VybmVsL2xvY2sgbWFuYWdlciBwcm90b2NvbCBkZWZpbml0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBwcm90b2NvbCB1c2VkIGJldHdlZW4gdGhlIFVOSVgga2VybmVsICh0aGUgImNsaWVudCIpIGFuZCB0aGUKKyAqIGxvY2FsIGxvY2sgbWFuYWdlci4gIFRoZSBsb2NhbCBsb2NrIG1hbmFnZXIgaXMgYSBkZWFtb24gcnVubmluZworICogYWJvdmUgdGhlIGtlcm5lbC4KKyAqLworCitjb25zdAlMTV9NQVhTVFJMRU4gPSAxMDI0OworCisvKgorICogbG9jayBtYW5hZ2VyIHN0YXR1cyByZXR1cm5zCisgKi8KK2VudW0ga2xtX3N0YXRzIHsKKwlrbG1fZ3JhbnRlZCA9IDAsCS8qIGxvY2sgaXMgZ3JhbnRlZCAqLworCWtsbV9kZW5pZWQgPSAxLAkJLyogbG9jayBpcyBkZW5pZWQgKi8KKwlrbG1fZGVuaWVkX25vbG9ja3MgPSAyLCAvKiBubyBsb2NrIGVudHJ5IGF2YWlsYWJsZSAqLworCWtsbV93b3JraW5nID0gMwkJLyogbG9jayBpcyBiZWluZyBwcm9jZXNzZWQgKi8KK307CisKKy8qCisgKiBsb2NrIG1hbmFnZXIgbG9jayBpZGVudGlmaWVyCisgKi8KK3N0cnVjdCBrbG1fbG9jayB7CisJc3RyaW5nIHNlcnZlcl9uYW1lPExNX01BWFNUUkxFTj47CisJbmV0b2JqIGZoOwkJLyogYSBjb3VudGVkIGZpbGUgaGFuZGxlICovCisJaW50IHBpZDsJCS8qIGhvbGRlciBvZiB0aGUgbG9jayAqLworCXVuc2lnbmVkIGxfb2Zmc2V0OwkvKiBiZWdpbm5pbmcgb2Zmc2V0IG9mIHRoZSBsb2NrICovCisJdW5zaWduZWQgbF9sZW47CQkvKiBieXRlIGxlbmd0aCBvZiB0aGUgbG9jazsKKwkJCQkgKiB6ZXJvIG1lYW5zIHRocm91Z2ggZW5kIG9mIGZpbGUgKi8KK307CisKKy8qCisgKiBsb2NrIGhvbGRlciBpZGVudGlmaWVyCisgKi8KK3N0cnVjdCBrbG1faG9sZGVyIHsKKwlib29sIGV4Y2x1c2l2ZTsJCS8qIEZBTFNFIGlmIHNoYXJlZCBsb2NrICovCisJaW50IHN2aWQ7CQkvKiBob2xkZXIgb2YgdGhlIGxvY2sgKHBpZCkgKi8KKwl1bnNpZ25lZCBsX29mZnNldDsJLyogYmVnaW5uaW5nIG9mZnNldCBvZiB0aGUgbG9jayAqLworCXVuc2lnbmVkIGxfbGVuOwkJLyogYnl0ZSBsZW5ndGggb2YgdGhlIGxvY2s7CisJCQkJICogemVybyBtZWFucyB0aHJvdWdoIGVuZCBvZiBmaWxlICovCit9OworCisvKgorICogcmVwbHkgdG8gS0xNX0xPQ0sgLyBLTE1fVU5MT0NLIC8gS0xNX0NBTkNFTAorICovCitzdHJ1Y3Qga2xtX3N0YXQgeworCWtsbV9zdGF0cyBzdGF0OworfTsKKworLyoKKyAqIHJlcGx5IHRvIGEgS0xNX1RFU1QgY2FsbAorICovCit1bmlvbiBrbG1fdGVzdHJwbHkgc3dpdGNoIChrbG1fc3RhdHMgc3RhdCkgeworCWNhc2Uga2xtX2RlbmllZDoKKwkJc3RydWN0IGtsbV9ob2xkZXIgaG9sZGVyOworCWRlZmF1bHQ6IC8qIEFsbCBvdGhlciBjYXNlcyByZXR1cm4gbm8gYXJndW1lbnRzICovCisJCXZvaWQ7Cit9OworCisKKy8qCisgKiBhcmd1bWVudHMgdG8gS0xNX0xPQ0sKKyAqLworc3RydWN0IGtsbV9sb2NrYXJncyB7CisJYm9vbCBibG9jazsKKwlib29sIGV4Y2x1c2l2ZTsKKwlzdHJ1Y3Qga2xtX2xvY2sgYWxvY2s7Cit9OworCisvKgorICogYXJndW1lbnRzIHRvIEtMTV9URVNUCisgKi8KK3N0cnVjdCBrbG1fdGVzdGFyZ3MgeworCWJvb2wgZXhjbHVzaXZlOworCXN0cnVjdCBrbG1fbG9jayBhbG9jazsKK307CisKKy8qCisgKiBhcmd1bWVudHMgdG8gS0xNX1VOTE9DSworICovCitzdHJ1Y3Qga2xtX3VubG9ja2FyZ3MgeworCXN0cnVjdCBrbG1fbG9jayBhbG9jazsKK307CisKK3Byb2dyYW0gS0xNX1BST0cgeworCXZlcnNpb24gS0xNX1ZFUlMgeworCisJCWtsbV90ZXN0cnBseQlLTE1fVEVTVCAoc3RydWN0IGtsbV90ZXN0YXJncykgPQkxOworCisJCWtsbV9zdGF0CUtMTV9MT0NLIChzdHJ1Y3Qga2xtX2xvY2thcmdzKSA9CTI7CisKKwkJa2xtX3N0YXQJS0xNX0NBTkNFTCAoc3RydWN0IGtsbV9sb2NrYXJncykgPQkzOworCQkvKiBrbG1fZ3JhbnRlZD0+IHRoZSBjYW5jZWwgcmVxdWVzdCBmYWlscyBkdWUgdG8gbG9jayBpcyBhbHJlYWR5IGdyYW50ZWQgKi8KKwkJLyoga2xtX2RlbmllZD0+IHRoZSBjYW5jZWwgcmVxdWVzdCBzdWNjZXNzZnVsbHkgYWJvcnRzCitsb2NrIHJlcXVlc3QgICovCisKKwkJa2xtX3N0YXQJS0xNX1VOTE9DSyAoc3RydWN0IGtsbV91bmxvY2thcmdzKSA9CTQ7CisJfSA9IDE7Cit9ID0gMTAwMDIwOwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbW91bnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL21vdW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUyMmYyOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL21vdW50LmgKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLgorICogSXQgd2FzIGdlbmVyYXRlZCB1c2luZyBycGNnZW4uCisgKi8KKworI2lmbmRlZiBfTU9VTlRfSF9SUENHRU4KKyNkZWZpbmUgX01PVU5UX0hfUlBDR0VOCisKKyNpbmNsdWRlIDxycGMvcnBjLmg+CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIE1OVFBBVEhMRU4gMTAyNAorI2RlZmluZSBNTlROQU1MRU4gMjU1CisjZGVmaW5lIEZIU0laRSAzMgorCit0eXBlZGVmIGNoYXIgZmhhbmRsZVtGSFNJWkVdOworCitzdHJ1Y3QgZmhzdGF0dXMgeworCXVfaW50IGZoc19zdGF0dXM7CisJdW5pb24geworCQlmaGFuZGxlIGZoc19maGFuZGxlOworCX0gZmhzdGF0dXNfdTsKK307Cit0eXBlZGVmIHN0cnVjdCBmaHN0YXR1cyBmaHN0YXR1czsKKwordHlwZWRlZiBjaGFyICpkaXJwYXRoOworCit0eXBlZGVmIGNoYXIgKm5hbWU7CisKK3R5cGVkZWYgc3RydWN0IG1vdW50Ym9keSAqbW91bnRsaXN0OworCitzdHJ1Y3QgbW91bnRib2R5IHsKKwluYW1lIG1sX2hvc3RuYW1lOworCWRpcnBhdGggbWxfZGlyZWN0b3J5OworCW1vdW50bGlzdCBtbF9uZXh0OworfTsKK3R5cGVkZWYgc3RydWN0IG1vdW50Ym9keSBtb3VudGJvZHk7CisKK3R5cGVkZWYgc3RydWN0IGdyb3Vwbm9kZSAqZ3JvdXBzOworCitzdHJ1Y3QgZ3JvdXBub2RlIHsKKwluYW1lIGdyX25hbWU7CisJZ3JvdXBzIGdyX25leHQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZ3JvdXBub2RlIGdyb3Vwbm9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgZXhwb3J0bm9kZSAqZXhwb3J0czsKKworc3RydWN0IGV4cG9ydG5vZGUgeworCWRpcnBhdGggZXhfZGlyOworCWdyb3VwcyBleF9ncm91cHM7CisJZXhwb3J0cyBleF9uZXh0OworfTsKK3R5cGVkZWYgc3RydWN0IGV4cG9ydG5vZGUgZXhwb3J0bm9kZTsKKworI2RlZmluZSBNT1VOVFBST0cgMTAwMDA1CisjZGVmaW5lIE1PVU5UVkVSUyAxCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2RlZmluZSBNT1VOVFBST0NfTlVMTCAwCitleHRlcm4gIHZvaWQgKiBtb3VudHByb2NfbnVsbF8xKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbW91bnRwcm9jX251bGxfMV9zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTU9VTlRQUk9DX01OVCAxCitleHRlcm4gIGZoc3RhdHVzICogbW91bnRwcm9jX21udF8xKGRpcnBhdGggKiwgQ0xJRU5UICopOworZXh0ZXJuICBmaHN0YXR1cyAqIG1vdW50cHJvY19tbnRfMV9zdmMoZGlycGF0aCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTU9VTlRQUk9DX0RVTVAgMgorZXh0ZXJuICBtb3VudGxpc3QgKiBtb3VudHByb2NfZHVtcF8xKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICBtb3VudGxpc3QgKiBtb3VudHByb2NfZHVtcF8xX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBNT1VOVFBST0NfVU1OVCAzCitleHRlcm4gIHZvaWQgKiBtb3VudHByb2NfdW1udF8xKGRpcnBhdGggKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbW91bnRwcm9jX3VtbnRfMV9zdmMoZGlycGF0aCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTU9VTlRQUk9DX1VNTlRBTEwgNAorZXh0ZXJuICB2b2lkICogbW91bnRwcm9jX3VtbnRhbGxfMSh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIG1vdW50cHJvY191bW50YWxsXzFfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE1PVU5UUFJPQ19FWFBPUlQgNQorZXh0ZXJuICBleHBvcnRzICogbW91bnRwcm9jX2V4cG9ydF8xKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICBleHBvcnRzICogbW91bnRwcm9jX2V4cG9ydF8xX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBNT1VOVFBST0NfRVhQT1JUQUxMIDYKK2V4dGVybiAgZXhwb3J0cyAqIG1vdW50cHJvY19leHBvcnRhbGxfMSh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgZXhwb3J0cyAqIG1vdW50cHJvY19leHBvcnRhbGxfMV9zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiBpbnQgbW91bnRwcm9nXzFfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisjZWxzZSAvKiBLJlIgQyAqLworI2RlZmluZSBNT1VOVFBST0NfTlVMTCAwCitleHRlcm4gIHZvaWQgKiBtb3VudHByb2NfbnVsbF8xKCk7CitleHRlcm4gIHZvaWQgKiBtb3VudHByb2NfbnVsbF8xX3N2YygpOworI2RlZmluZSBNT1VOVFBST0NfTU5UIDEKK2V4dGVybiAgZmhzdGF0dXMgKiBtb3VudHByb2NfbW50XzEoKTsKK2V4dGVybiAgZmhzdGF0dXMgKiBtb3VudHByb2NfbW50XzFfc3ZjKCk7CisjZGVmaW5lIE1PVU5UUFJPQ19EVU1QIDIKK2V4dGVybiAgbW91bnRsaXN0ICogbW91bnRwcm9jX2R1bXBfMSgpOworZXh0ZXJuICBtb3VudGxpc3QgKiBtb3VudHByb2NfZHVtcF8xX3N2YygpOworI2RlZmluZSBNT1VOVFBST0NfVU1OVCAzCitleHRlcm4gIHZvaWQgKiBtb3VudHByb2NfdW1udF8xKCk7CitleHRlcm4gIHZvaWQgKiBtb3VudHByb2NfdW1udF8xX3N2YygpOworI2RlZmluZSBNT1VOVFBST0NfVU1OVEFMTCA0CitleHRlcm4gIHZvaWQgKiBtb3VudHByb2NfdW1udGFsbF8xKCk7CitleHRlcm4gIHZvaWQgKiBtb3VudHByb2NfdW1udGFsbF8xX3N2YygpOworI2RlZmluZSBNT1VOVFBST0NfRVhQT1JUIDUKK2V4dGVybiAgZXhwb3J0cyAqIG1vdW50cHJvY19leHBvcnRfMSgpOworZXh0ZXJuICBleHBvcnRzICogbW91bnRwcm9jX2V4cG9ydF8xX3N2YygpOworI2RlZmluZSBNT1VOVFBST0NfRVhQT1JUQUxMIDYKK2V4dGVybiAgZXhwb3J0cyAqIG1vdW50cHJvY19leHBvcnRhbGxfMSgpOworZXh0ZXJuICBleHBvcnRzICogbW91bnRwcm9jX2V4cG9ydGFsbF8xX3N2YygpOworZXh0ZXJuIGludCBtb3VudHByb2dfMV9mcmVlcmVzdWx0ICgpOworI2VuZGlmIC8qIEsmUiBDICovCisKKy8qIHRoZSB4ZHIgZnVuY3Rpb25zICovCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICBib29sX3QgeGRyX2ZoYW5kbGUgKFhEUiAqLCBmaGFuZGxlKTsKK2V4dGVybiAgYm9vbF90IHhkcl9maHN0YXR1cyAoWERSICosIGZoc3RhdHVzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZGlycGF0aCAoWERSICosIGRpcnBhdGgqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9uYW1lIChYRFIgKiwgbmFtZSopOworZXh0ZXJuICBib29sX3QgeGRyX21vdW50bGlzdCAoWERSICosIG1vdW50bGlzdCopOworZXh0ZXJuICBib29sX3QgeGRyX21vdW50Ym9keSAoWERSICosIG1vdW50Ym9keSopOworZXh0ZXJuICBib29sX3QgeGRyX2dyb3VwcyAoWERSICosIGdyb3VwcyopOworZXh0ZXJuICBib29sX3QgeGRyX2dyb3Vwbm9kZSAoWERSICosIGdyb3Vwbm9kZSopOworZXh0ZXJuICBib29sX3QgeGRyX2V4cG9ydHMgKFhEUiAqLCBleHBvcnRzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZXhwb3J0bm9kZSAoWERSICosIGV4cG9ydG5vZGUqKTsKKworI2Vsc2UgLyogSyZSIEMgKi8KK2V4dGVybiBib29sX3QgeGRyX2ZoYW5kbGUgKCk7CitleHRlcm4gYm9vbF90IHhkcl9maHN0YXR1cyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2RpcnBhdGggKCk7CitleHRlcm4gYm9vbF90IHhkcl9uYW1lICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbW91bnRsaXN0ICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbW91bnRib2R5ICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfZ3JvdXBzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfZ3JvdXBub2RlICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfZXhwb3J0cyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2V4cG9ydG5vZGUgKCk7CisKKyNlbmRpZiAvKiBLJlIgQyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIV9NT1VOVF9IX1JQQ0dFTiAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbW91bnQueCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL21vdW50LngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQzYjMzOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL21vdW50LngKQEAgLTAsMCArMSwxNjEgQEAKKy8qIEAoIyltb3VudC54CTIuMSA4OC8wOC8wMSA0LjAgUlBDU1JDICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBQcm90b2NvbCBkZXNjcmlwdGlvbiBmb3IgdGhlIG1vdW50IHByb2dyYW0KKyAqLworCisKK2NvbnN0IE1OVFBBVEhMRU4gPSAxMDI0OwkvKiBtYXhpbXVtIGJ5dGVzIGluIGEgcGF0aG5hbWUgYXJndW1lbnQgKi8KK2NvbnN0IE1OVE5BTUxFTiA9IDI1NTsJCS8qIG1heGltdW0gYnl0ZXMgaW4gYSBuYW1lIGFyZ3VtZW50ICovCitjb25zdCBGSFNJWkUgPSAzMjsJCS8qIHNpemUgaW4gYnl0ZXMgb2YgYSBmaWxlIGhhbmRsZSAqLworCisvKgorICogVGhlIGZoYW5kbGUgaXMgdGhlIGZpbGUgaGFuZGxlIHRoYXQgdGhlIHNlcnZlciBwYXNzZXMgdG8gdGhlIGNsaWVudC4KKyAqIEFsbCBmaWxlIG9wZXJhdGlvbnMgYXJlIGRvbmUgdXNpbmcgdGhlIGZpbGUgaGFuZGxlcyB0byByZWZlciB0byBhIGZpbGUKKyAqIG9yIGEgZGlyZWN0b3J5LiBUaGUgZmlsZSBoYW5kbGUgY2FuIGNvbnRhaW4gd2hhdGV2ZXIgaW5mb3JtYXRpb24gdGhlCisgKiBzZXJ2ZXIgbmVlZHMgdG8gZGlzdGluZ3Vpc2ggYW4gaW5kaXZpZHVhbCBmaWxlLgorICovCit0eXBlZGVmIG9wYXF1ZSBmaGFuZGxlW0ZIU0laRV07CisKKy8qCisgKiBJZiBhIHN0YXR1cyBvZiB6ZXJvIGlzIHJldHVybmVkLCB0aGUgY2FsbCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBhbmQKKyAqIGEgZmlsZSBoYW5kbGUgZm9yIHRoZSBkaXJlY3RvcnkgZm9sbG93cy4gQSBub24temVybyBzdGF0dXMgaW5kaWNhdGVzCisgKiBzb21lIHNvcnQgb2YgZXJyb3IuIFRoZSBzdGF0dXMgY29ycmVzcG9uZHMgd2l0aCBVTklYIGVycm9yIG51bWJlcnMuCisgKi8KK3VuaW9uIGZoc3RhdHVzIHN3aXRjaCAodW5zaWduZWQgZmhzX3N0YXR1cykgeworY2FzZSAwOgorCWZoYW5kbGUgZmhzX2ZoYW5kbGU7CitkZWZhdWx0OgorCXZvaWQ7Cit9OworCisvKgorICogVGhlIHR5cGUgZGlycGF0aCBpcyB0aGUgcGF0aG5hbWUgb2YgYSBkaXJlY3RvcnkKKyAqLwordHlwZWRlZiBzdHJpbmcgZGlycGF0aDxNTlRQQVRITEVOPjsKKworLyoKKyAqIFRoZSB0eXBlIG5hbWUgaXMgdXNlZCBmb3IgYXJiaXRyYXJ5IG5hbWVzIChob3N0bmFtZXMsIGdyb3VwbmFtZXMpCisgKi8KK3R5cGVkZWYgc3RyaW5nIG5hbWU8TU5UTkFNTEVOPjsKKworLyoKKyAqIEEgbGlzdCBvZiB3aG8gaGFzIHdoYXQgbW91bnRlZAorICovCit0eXBlZGVmIHN0cnVjdCBtb3VudGJvZHkgKm1vdW50bGlzdDsKK3N0cnVjdCBtb3VudGJvZHkgeworCW5hbWUgbWxfaG9zdG5hbWU7CisJZGlycGF0aCBtbF9kaXJlY3Rvcnk7CisJbW91bnRsaXN0IG1sX25leHQ7Cit9OworCisvKgorICogQSBsaXN0IG9mIG5ldGdyb3VwcworICovCit0eXBlZGVmIHN0cnVjdCBncm91cG5vZGUgKmdyb3VwczsKK3N0cnVjdCBncm91cG5vZGUgeworCW5hbWUgZ3JfbmFtZTsKKwlncm91cHMgZ3JfbmV4dDsKK307CisKKy8qCisgKiBBIGxpc3Qgb2Ygd2hhdCBpcyBleHBvcnRlZCBhbmQgdG8gd2hvbQorICovCit0eXBlZGVmIHN0cnVjdCBleHBvcnRub2RlICpleHBvcnRzOworc3RydWN0IGV4cG9ydG5vZGUgeworCWRpcnBhdGggZXhfZGlyOworCWdyb3VwcyBleF9ncm91cHM7CisJZXhwb3J0cyBleF9uZXh0OworfTsKKworcHJvZ3JhbSBNT1VOVFBST0cgeworCS8qCisJICogVmVyc2lvbiBvbmUgb2YgdGhlIG1vdW50IHByb3RvY29sIGNvbW11bmljYXRlcyB3aXRoIHZlcnNpb24gdHdvCisJICogb2YgdGhlIE5GUyBwcm90b2NvbC4gVGhlIG9ubHkgY29ubmVjdGluZyBwb2ludCBpcyB0aGUgZmhhbmRsZQorCSAqIHN0cnVjdHVyZSwgd2hpY2ggaXMgdGhlIHNhbWUgZm9yIGJvdGggcHJvdG9jb2xzLgorCSAqLworCXZlcnNpb24gTU9VTlRWRVJTIHsKKwkJLyoKKwkJICogRG9lcyBubyB3b3JrLiBJdCBpcyBtYWRlIGF2YWlsYWJsZSBpbiBhbGwgUlBDIHNlcnZpY2VzCisJCSAqIHRvIGFsbG93IHNlcnZlciByZXNwb25zZSB0ZXN0aW5nIGFuZCB0aW1pbmcKKwkJICovCisJCXZvaWQKKwkJTU9VTlRQUk9DX05VTEwodm9pZCkgPSAwOworCisJCS8qCisJCSAqIElmIGZoc19zdGF0dXMgaXMgMCwgdGhlbiBmaHNfZmhhbmRsZSBjb250YWlucyB0aGUKKwkJICogZmlsZSBoYW5kbGUgZm9yIHRoZSBkaXJlY3RvcnkuIFRoaXMgZmlsZSBoYW5kbGUgbWF5CisJCSAqIGJlIHVzZWQgaW4gdGhlIE5GUyBwcm90b2NvbC4gVGhpcyBwcm9jZWR1cmUgYWxzbyBhZGRzCisJCSAqIGEgbmV3IGVudHJ5IHRvIHRoZSBtb3VudCBsaXN0IGZvciB0aGlzIGNsaWVudCBtb3VudGluZworCQkgKiB0aGUgZGlyZWN0b3J5LgorCQkgKiBVbml4IGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkLgorCQkgKi8KKwkJZmhzdGF0dXMKKwkJTU9VTlRQUk9DX01OVChkaXJwYXRoKSA9IDE7CisKKwkJLyoKKwkJICogUmV0dXJucyB0aGUgbGlzdCBvZiByZW1vdGVseSBtb3VudGVkIGZpbGVzeXN0ZW1zLiBUaGUKKwkJICogbW91bnRsaXN0IGNvbnRhaW5zIG9uZSBlbnRyeSBmb3IgZWFjaCBob3N0bmFtZSBhbmQKKwkJICogZGlyZWN0b3J5IHBhaXIuCisJCSAqLworCQltb3VudGxpc3QKKwkJTU9VTlRQUk9DX0RVTVAodm9pZCkgPSAyOworCisJCS8qCisJCSAqIFJlbW92ZXMgdGhlIG1vdW50IGxpc3QgZW50cnkgZm9yIHRoZSBkaXJlY3RvcnkKKwkJICogVW5peCBhdXRoZW50aWNhdGlvbiByZXF1aXJlZC4KKwkJICovCisJCXZvaWQKKwkJTU9VTlRQUk9DX1VNTlQoZGlycGF0aCkgPSAzOworCisJCS8qCisJCSAqIFJlbW92ZXMgYWxsIG9mIHRoZSBtb3VudCBsaXN0IGVudHJpZXMgZm9yIHRoaXMgY2xpZW50CisJCSAqIFVuaXggYXV0aGVudGljYXRpb24gcmVxdWlyZWQuCisJCSAqLworCQl2b2lkCisJCU1PVU5UUFJPQ19VTU5UQUxMKHZvaWQpID0gNDsKKworCQkvKgorCQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIGV4cG9ydGVkIGZpbGVzeXN0ZW1zLCBhbmQgd2hpY2gKKwkJICogbWFjaGluZXMgYXJlIGFsbG93ZWQgdG8gaW1wb3J0IGl0LgorCQkgKi8KKwkJZXhwb3J0cworCQlNT1VOVFBST0NfRVhQT1JUKHZvaWQpICA9IDU7CisKKwkJLyoKKwkJICogSWRlbnRpY2FsIHRvIE1PVU5UUFJPQ19FWFBPUlQgYWJvdmUKKwkJICovCisJCWV4cG9ydHMKKwkJTU9VTlRQUk9DX0VYUE9SVEFMTCh2b2lkKSA9IDY7CisJfSA9IDE7Cit9ID0gMTAwMDA1OwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmZzX3Byb3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25mc19wcm90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNmNjI2YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25mc19wcm90LmgKQEAgLTAsMCArMSw0NTAgQEAKKy8qCisgKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLgorICogSXQgd2FzIGdlbmVyYXRlZCB1c2luZyBycGNnZW4uCisgKi8KKworI2lmbmRlZiBfTkZTX1BST1RfSF9SUENHRU4KKyNkZWZpbmUgX05GU19QUk9UX0hfUlBDR0VOCisKKyNpbmNsdWRlIDxycGMvcnBjLmg+CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIE5GU19QT1JUIDIwNDkKKyNkZWZpbmUgTkZTX01BWERBVEEgODE5MgorI2RlZmluZSBORlNfTUFYUEFUSExFTiAxMDI0CisjZGVmaW5lIE5GU19NQVhOQU1MRU4gMjU1CisjZGVmaW5lIE5GU19GSFNJWkUgMzIKKyNkZWZpbmUgTkZTX0NPT0tJRVNJWkUgNAorI2RlZmluZSBORlNfRklGT19ERVYgLTEKKyNkZWZpbmUgTkZTTU9ERV9GTVQgMDE3MDAwMAorI2RlZmluZSBORlNNT0RFX0RJUiAwMDQwMDAwCisjZGVmaW5lIE5GU01PREVfQ0hSIDAwMjAwMDAKKyNkZWZpbmUgTkZTTU9ERV9CTEsgMDA2MDAwMAorI2RlZmluZSBORlNNT0RFX1JFRyAwMTAwMDAwCisjZGVmaW5lIE5GU01PREVfTE5LIDAxMjAwMDAKKyNkZWZpbmUgTkZTTU9ERV9TT0NLIDAxNDAwMDAKKyNkZWZpbmUgTkZTTU9ERV9GSUZPIDAwMTAwMDAKKworZW51bSBuZnNzdGF0IHsKKwlORlNfT0sgPSAwLAorCU5GU0VSUl9QRVJNID0gMSwKKwlORlNFUlJfTk9FTlQgPSAyLAorCU5GU0VSUl9JTyA9IDUsCisJTkZTRVJSX05YSU8gPSA2LAorCU5GU0VSUl9BQ0NFUyA9IDEzLAorCU5GU0VSUl9FWElTVCA9IDE3LAorCU5GU0VSUl9OT0RFViA9IDE5LAorCU5GU0VSUl9OT1RESVIgPSAyMCwKKwlORlNFUlJfSVNESVIgPSAyMSwKKwlORlNFUlJfRkJJRyA9IDI3LAorCU5GU0VSUl9OT1NQQyA9IDI4LAorCU5GU0VSUl9ST0ZTID0gMzAsCisJTkZTRVJSX05BTUVUT09MT05HID0gNjMsCisJTkZTRVJSX05PVEVNUFRZID0gNjYsCisJTkZTRVJSX0RRVU9UID0gNjksCisJTkZTRVJSX1NUQUxFID0gNzAsCisJTkZTRVJSX1dGTFVTSCA9IDk5LAorfTsKK3R5cGVkZWYgZW51bSBuZnNzdGF0IG5mc3N0YXQ7CisKK2VudW0gZnR5cGUgeworCU5GTk9OID0gMCwKKwlORlJFRyA9IDEsCisJTkZESVIgPSAyLAorCU5GQkxLID0gMywKKwlORkNIUiA9IDQsCisJTkZMTksgPSA1LAorCU5GU09DSyA9IDYsCisJTkZCQUQgPSA3LAorCU5GRklGTyA9IDgsCit9OwordHlwZWRlZiBlbnVtIGZ0eXBlIGZ0eXBlOworCitzdHJ1Y3QgbmZzX2ZoIHsKKwljaGFyIGRhdGFbTkZTX0ZIU0laRV07Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmZzX2ZoIG5mc19maDsKKworc3RydWN0IG5mc3RpbWUgeworCXVfaW50IHNlY29uZHM7CisJdV9pbnQgdXNlY29uZHM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmZzdGltZSBuZnN0aW1lOworCitzdHJ1Y3QgZmF0dHIgeworCWZ0eXBlIHR5cGU7CisJdV9pbnQgbW9kZTsKKwl1X2ludCBubGluazsKKwl1X2ludCB1aWQ7CisJdV9pbnQgZ2lkOworCXVfaW50IHNpemU7CisJdV9pbnQgYmxvY2tzaXplOworCXVfaW50IHJkZXY7CisJdV9pbnQgYmxvY2tzOworCXVfaW50IGZzaWQ7CisJdV9pbnQgZmlsZWlkOworCW5mc3RpbWUgYXRpbWU7CisJbmZzdGltZSBtdGltZTsKKwluZnN0aW1lIGN0aW1lOworfTsKK3R5cGVkZWYgc3RydWN0IGZhdHRyIGZhdHRyOworCitzdHJ1Y3Qgc2F0dHIgeworCXVfaW50IG1vZGU7CisJdV9pbnQgdWlkOworCXVfaW50IGdpZDsKKwl1X2ludCBzaXplOworCW5mc3RpbWUgYXRpbWU7CisJbmZzdGltZSBtdGltZTsKK307Cit0eXBlZGVmIHN0cnVjdCBzYXR0ciBzYXR0cjsKKwordHlwZWRlZiBjaGFyICpmaWxlbmFtZTsKKwordHlwZWRlZiBjaGFyICpuZnNwYXRoOworCitzdHJ1Y3QgYXR0cnN0YXQgeworCW5mc3N0YXQgc3RhdHVzOworCXVuaW9uIHsKKwkJZmF0dHIgYXR0cmlidXRlczsKKwl9IGF0dHJzdGF0X3U7Cit9OwordHlwZWRlZiBzdHJ1Y3QgYXR0cnN0YXQgYXR0cnN0YXQ7CisKK3N0cnVjdCBzYXR0cmFyZ3MgeworCW5mc19maCBmaWxlOworCXNhdHRyIGF0dHJpYnV0ZXM7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgc2F0dHJhcmdzIHNhdHRyYXJnczsKKworc3RydWN0IGRpcm9wYXJncyB7CisJbmZzX2ZoIGRpcjsKKwlmaWxlbmFtZSBuYW1lOworfTsKK3R5cGVkZWYgc3RydWN0IGRpcm9wYXJncyBkaXJvcGFyZ3M7CisKK3N0cnVjdCBkaXJvcG9rcmVzIHsKKwluZnNfZmggZmlsZTsKKwlmYXR0ciBhdHRyaWJ1dGVzOworfTsKK3R5cGVkZWYgc3RydWN0IGRpcm9wb2tyZXMgZGlyb3Bva3JlczsKKworc3RydWN0IGRpcm9wcmVzIHsKKwluZnNzdGF0IHN0YXR1czsKKwl1bmlvbiB7CisJCWRpcm9wb2tyZXMgZGlyb3ByZXM7CisJfSBkaXJvcHJlc191OworfTsKK3R5cGVkZWYgc3RydWN0IGRpcm9wcmVzIGRpcm9wcmVzOworCitzdHJ1Y3QgcmVhZGxpbmtyZXMgeworCW5mc3N0YXQgc3RhdHVzOworCXVuaW9uIHsKKwkJbmZzcGF0aCBkYXRhOworCX0gcmVhZGxpbmtyZXNfdTsKK307Cit0eXBlZGVmIHN0cnVjdCByZWFkbGlua3JlcyByZWFkbGlua3JlczsKKworc3RydWN0IHJlYWRhcmdzIHsKKwluZnNfZmggZmlsZTsKKwl1X2ludCBvZmZzZXQ7CisJdV9pbnQgY291bnQ7CisJdV9pbnQgdG90YWxjb3VudDsKK307Cit0eXBlZGVmIHN0cnVjdCByZWFkYXJncyByZWFkYXJnczsKKworc3RydWN0IHJlYWRva3JlcyB7CisJZmF0dHIgYXR0cmlidXRlczsKKwlzdHJ1Y3QgeworCQl1X2ludCBkYXRhX2xlbjsKKwkJY2hhciAqZGF0YV92YWw7CisJfSBkYXRhOworfTsKK3R5cGVkZWYgc3RydWN0IHJlYWRva3JlcyByZWFkb2tyZXM7CisKK3N0cnVjdCByZWFkcmVzIHsKKwluZnNzdGF0IHN0YXR1czsKKwl1bmlvbiB7CisJCXJlYWRva3JlcyByZXBseTsKKwl9IHJlYWRyZXNfdTsKK307Cit0eXBlZGVmIHN0cnVjdCByZWFkcmVzIHJlYWRyZXM7CisKK3N0cnVjdCB3cml0ZWFyZ3MgeworCW5mc19maCBmaWxlOworCXVfaW50IGJlZ2lub2Zmc2V0OworCXVfaW50IG9mZnNldDsKKwl1X2ludCB0b3RhbGNvdW50OworCXN0cnVjdCB7CisJCXVfaW50IGRhdGFfbGVuOworCQljaGFyICpkYXRhX3ZhbDsKKwl9IGRhdGE7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgd3JpdGVhcmdzIHdyaXRlYXJnczsKKworc3RydWN0IGNyZWF0ZWFyZ3MgeworCWRpcm9wYXJncyB3aGVyZTsKKwlzYXR0ciBhdHRyaWJ1dGVzOworfTsKK3R5cGVkZWYgc3RydWN0IGNyZWF0ZWFyZ3MgY3JlYXRlYXJnczsKKworc3RydWN0IHJlbmFtZWFyZ3MgeworCWRpcm9wYXJncyBmcm9tOworCWRpcm9wYXJncyB0bzsKK307Cit0eXBlZGVmIHN0cnVjdCByZW5hbWVhcmdzIHJlbmFtZWFyZ3M7CisKK3N0cnVjdCBsaW5rYXJncyB7CisJbmZzX2ZoIGZyb207CisJZGlyb3BhcmdzIHRvOworfTsKK3R5cGVkZWYgc3RydWN0IGxpbmthcmdzIGxpbmthcmdzOworCitzdHJ1Y3Qgc3ltbGlua2FyZ3MgeworCWRpcm9wYXJncyBmcm9tOworCW5mc3BhdGggdG87CisJc2F0dHIgYXR0cmlidXRlczsKK307Cit0eXBlZGVmIHN0cnVjdCBzeW1saW5rYXJncyBzeW1saW5rYXJnczsKKwordHlwZWRlZiBjaGFyIG5mc2Nvb2tpZVtORlNfQ09PS0lFU0laRV07CisKK3N0cnVjdCByZWFkZGlyYXJncyB7CisJbmZzX2ZoIGRpcjsKKwluZnNjb29raWUgY29va2llOworCXVfaW50IGNvdW50OworfTsKK3R5cGVkZWYgc3RydWN0IHJlYWRkaXJhcmdzIHJlYWRkaXJhcmdzOworCitzdHJ1Y3QgZW50cnkgeworCXVfaW50IGZpbGVpZDsKKwlmaWxlbmFtZSBuYW1lOworCW5mc2Nvb2tpZSBjb29raWU7CisJc3RydWN0IGVudHJ5ICpuZXh0ZW50cnk7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZW50cnkgZW50cnk7CisKK3N0cnVjdCBkaXJsaXN0IHsKKwllbnRyeSAqZW50cmllczsKKwlib29sX3QgZW9mOworfTsKK3R5cGVkZWYgc3RydWN0IGRpcmxpc3QgZGlybGlzdDsKKworc3RydWN0IHJlYWRkaXJyZXMgeworCW5mc3N0YXQgc3RhdHVzOworCXVuaW9uIHsKKwkJZGlybGlzdCByZXBseTsKKwl9IHJlYWRkaXJyZXNfdTsKK307Cit0eXBlZGVmIHN0cnVjdCByZWFkZGlycmVzIHJlYWRkaXJyZXM7CisKK3N0cnVjdCBzdGF0ZnNva3JlcyB7CisJdV9pbnQgdHNpemU7CisJdV9pbnQgYnNpemU7CisJdV9pbnQgYmxvY2tzOworCXVfaW50IGJmcmVlOworCXVfaW50IGJhdmFpbDsKK307Cit0eXBlZGVmIHN0cnVjdCBzdGF0ZnNva3JlcyBzdGF0ZnNva3JlczsKKworc3RydWN0IHN0YXRmc3JlcyB7CisJbmZzc3RhdCBzdGF0dXM7CisJdW5pb24geworCQlzdGF0ZnNva3JlcyByZXBseTsKKwl9IHN0YXRmc3Jlc191OworfTsKK3R5cGVkZWYgc3RydWN0IHN0YXRmc3JlcyBzdGF0ZnNyZXM7CisKKyNkZWZpbmUgTkZTX1BST0dSQU0gMTAwMDAzCisjZGVmaW5lIE5GU19WRVJTSU9OIDIKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIE5GU1BST0NfTlVMTCAwCitleHRlcm4gIHZvaWQgKiBuZnNwcm9jX251bGxfMih2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIG5mc3Byb2NfbnVsbF8yX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX0dFVEFUVFIgMQorZXh0ZXJuICBhdHRyc3RhdCAqIG5mc3Byb2NfZ2V0YXR0cl8yKG5mc19maCAqLCBDTElFTlQgKik7CitleHRlcm4gIGF0dHJzdGF0ICogbmZzcHJvY19nZXRhdHRyXzJfc3ZjKG5mc19maCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19TRVRBVFRSIDIKK2V4dGVybiAgYXR0cnN0YXQgKiBuZnNwcm9jX3NldGF0dHJfMihzYXR0cmFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBhdHRyc3RhdCAqIG5mc3Byb2Nfc2V0YXR0cl8yX3N2YyhzYXR0cmFyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfUk9PVCAzCitleHRlcm4gIHZvaWQgKiBuZnNwcm9jX3Jvb3RfMih2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIG5mc3Byb2Nfcm9vdF8yX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX0xPT0tVUCA0CitleHRlcm4gIGRpcm9wcmVzICogbmZzcHJvY19sb29rdXBfMihkaXJvcGFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBkaXJvcHJlcyAqIG5mc3Byb2NfbG9va3VwXzJfc3ZjKGRpcm9wYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19SRUFETElOSyA1CitleHRlcm4gIHJlYWRsaW5rcmVzICogbmZzcHJvY19yZWFkbGlua18yKG5mc19maCAqLCBDTElFTlQgKik7CitleHRlcm4gIHJlYWRsaW5rcmVzICogbmZzcHJvY19yZWFkbGlua18yX3N2YyhuZnNfZmggKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfUkVBRCA2CitleHRlcm4gIHJlYWRyZXMgKiBuZnNwcm9jX3JlYWRfMihyZWFkYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIHJlYWRyZXMgKiBuZnNwcm9jX3JlYWRfMl9zdmMocmVhZGFyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfV1JJVEVDQUNIRSA3CitleHRlcm4gIHZvaWQgKiBuZnNwcm9jX3dyaXRlY2FjaGVfMih2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIG5mc3Byb2Nfd3JpdGVjYWNoZV8yX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1dSSVRFIDgKK2V4dGVybiAgYXR0cnN0YXQgKiBuZnNwcm9jX3dyaXRlXzIod3JpdGVhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgYXR0cnN0YXQgKiBuZnNwcm9jX3dyaXRlXzJfc3ZjKHdyaXRlYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19DUkVBVEUgOQorZXh0ZXJuICBkaXJvcHJlcyAqIG5mc3Byb2NfY3JlYXRlXzIoY3JlYXRlYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIGRpcm9wcmVzICogbmZzcHJvY19jcmVhdGVfMl9zdmMoY3JlYXRlYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19SRU1PVkUgMTAKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2NfcmVtb3ZlXzIoZGlyb3BhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2NfcmVtb3ZlXzJfc3ZjKGRpcm9wYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19SRU5BTUUgMTEKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2NfcmVuYW1lXzIocmVuYW1lYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3JlbmFtZV8yX3N2YyhyZW5hbWVhcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX0xJTksgMTIKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2NfbGlua18yKGxpbmthcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2NfbGlua18yX3N2YyhsaW5rYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19TWU1MSU5LIDEzCitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3N5bWxpbmtfMihzeW1saW5rYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3N5bWxpbmtfMl9zdmMoc3ltbGlua2FyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfTUtESVIgMTQKK2V4dGVybiAgZGlyb3ByZXMgKiBuZnNwcm9jX21rZGlyXzIoY3JlYXRlYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIGRpcm9wcmVzICogbmZzcHJvY19ta2Rpcl8yX3N2YyhjcmVhdGVhcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1JNRElSIDE1CitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3JtZGlyXzIoZGlyb3BhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2Nfcm1kaXJfMl9zdmMoZGlyb3BhcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1JFQURESVIgMTYKK2V4dGVybiAgcmVhZGRpcnJlcyAqIG5mc3Byb2NfcmVhZGRpcl8yKHJlYWRkaXJhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgcmVhZGRpcnJlcyAqIG5mc3Byb2NfcmVhZGRpcl8yX3N2YyhyZWFkZGlyYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19TVEFURlMgMTcKK2V4dGVybiAgc3RhdGZzcmVzICogbmZzcHJvY19zdGF0ZnNfMihuZnNfZmggKiwgQ0xJRU5UICopOworZXh0ZXJuICBzdGF0ZnNyZXMgKiBuZnNwcm9jX3N0YXRmc18yX3N2YyhuZnNfZmggKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gaW50IG5mc19wcm9ncmFtXzJfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisjZWxzZSAvKiBLJlIgQyAqLworI2RlZmluZSBORlNQUk9DX05VTEwgMAorZXh0ZXJuICB2b2lkICogbmZzcHJvY19udWxsXzIoKTsKK2V4dGVybiAgdm9pZCAqIG5mc3Byb2NfbnVsbF8yX3N2YygpOworI2RlZmluZSBORlNQUk9DX0dFVEFUVFIgMQorZXh0ZXJuICBhdHRyc3RhdCAqIG5mc3Byb2NfZ2V0YXR0cl8yKCk7CitleHRlcm4gIGF0dHJzdGF0ICogbmZzcHJvY19nZXRhdHRyXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfU0VUQVRUUiAyCitleHRlcm4gIGF0dHJzdGF0ICogbmZzcHJvY19zZXRhdHRyXzIoKTsKK2V4dGVybiAgYXR0cnN0YXQgKiBuZnNwcm9jX3NldGF0dHJfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19ST09UIDMKK2V4dGVybiAgdm9pZCAqIG5mc3Byb2Nfcm9vdF8yKCk7CitleHRlcm4gIHZvaWQgKiBuZnNwcm9jX3Jvb3RfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19MT09LVVAgNAorZXh0ZXJuICBkaXJvcHJlcyAqIG5mc3Byb2NfbG9va3VwXzIoKTsKK2V4dGVybiAgZGlyb3ByZXMgKiBuZnNwcm9jX2xvb2t1cF8yX3N2YygpOworI2RlZmluZSBORlNQUk9DX1JFQURMSU5LIDUKK2V4dGVybiAgcmVhZGxpbmtyZXMgKiBuZnNwcm9jX3JlYWRsaW5rXzIoKTsKK2V4dGVybiAgcmVhZGxpbmtyZXMgKiBuZnNwcm9jX3JlYWRsaW5rXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfUkVBRCA2CitleHRlcm4gIHJlYWRyZXMgKiBuZnNwcm9jX3JlYWRfMigpOworZXh0ZXJuICByZWFkcmVzICogbmZzcHJvY19yZWFkXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfV1JJVEVDQUNIRSA3CitleHRlcm4gIHZvaWQgKiBuZnNwcm9jX3dyaXRlY2FjaGVfMigpOworZXh0ZXJuICB2b2lkICogbmZzcHJvY193cml0ZWNhY2hlXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfV1JJVEUgOAorZXh0ZXJuICBhdHRyc3RhdCAqIG5mc3Byb2Nfd3JpdGVfMigpOworZXh0ZXJuICBhdHRyc3RhdCAqIG5mc3Byb2Nfd3JpdGVfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19DUkVBVEUgOQorZXh0ZXJuICBkaXJvcHJlcyAqIG5mc3Byb2NfY3JlYXRlXzIoKTsKK2V4dGVybiAgZGlyb3ByZXMgKiBuZnNwcm9jX2NyZWF0ZV8yX3N2YygpOworI2RlZmluZSBORlNQUk9DX1JFTU9WRSAxMAorZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19yZW1vdmVfMigpOworZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19yZW1vdmVfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19SRU5BTUUgMTEKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2NfcmVuYW1lXzIoKTsKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2NfcmVuYW1lXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfTElOSyAxMgorZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19saW5rXzIoKTsKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2NfbGlua18yX3N2YygpOworI2RlZmluZSBORlNQUk9DX1NZTUxJTksgMTMKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2Nfc3ltbGlua18yKCk7CitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3N5bWxpbmtfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19NS0RJUiAxNAorZXh0ZXJuICBkaXJvcHJlcyAqIG5mc3Byb2NfbWtkaXJfMigpOworZXh0ZXJuICBkaXJvcHJlcyAqIG5mc3Byb2NfbWtkaXJfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19STURJUiAxNQorZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19ybWRpcl8yKCk7CitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3JtZGlyXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfUkVBRERJUiAxNgorZXh0ZXJuICByZWFkZGlycmVzICogbmZzcHJvY19yZWFkZGlyXzIoKTsKK2V4dGVybiAgcmVhZGRpcnJlcyAqIG5mc3Byb2NfcmVhZGRpcl8yX3N2YygpOworI2RlZmluZSBORlNQUk9DX1NUQVRGUyAxNworZXh0ZXJuICBzdGF0ZnNyZXMgKiBuZnNwcm9jX3N0YXRmc18yKCk7CitleHRlcm4gIHN0YXRmc3JlcyAqIG5mc3Byb2Nfc3RhdGZzXzJfc3ZjKCk7CitleHRlcm4gaW50IG5mc19wcm9ncmFtXzJfZnJlZXJlc3VsdCAoKTsKKyNlbmRpZiAvKiBLJlIgQyAqLworCisvKiB0aGUgeGRyIGZ1bmN0aW9ucyAqLworCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAgYm9vbF90IHhkcl9uZnNzdGF0IChYRFIgKiwgbmZzc3RhdCopOworZXh0ZXJuICBib29sX3QgeGRyX2Z0eXBlIChYRFIgKiwgZnR5cGUqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9uZnNfZmggKFhEUiAqLCBuZnNfZmgqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9uZnN0aW1lIChYRFIgKiwgbmZzdGltZSopOworZXh0ZXJuICBib29sX3QgeGRyX2ZhdHRyIChYRFIgKiwgZmF0dHIqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9zYXR0ciAoWERSICosIHNhdHRyKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZmlsZW5hbWUgKFhEUiAqLCBmaWxlbmFtZSopOworZXh0ZXJuICBib29sX3QgeGRyX25mc3BhdGggKFhEUiAqLCBuZnNwYXRoKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfYXR0cnN0YXQgKFhEUiAqLCBhdHRyc3RhdCopOworZXh0ZXJuICBib29sX3QgeGRyX3NhdHRyYXJncyAoWERSICosIHNhdHRyYXJncyopOworZXh0ZXJuICBib29sX3QgeGRyX2Rpcm9wYXJncyAoWERSICosIGRpcm9wYXJncyopOworZXh0ZXJuICBib29sX3QgeGRyX2Rpcm9wb2tyZXMgKFhEUiAqLCBkaXJvcG9rcmVzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZGlyb3ByZXMgKFhEUiAqLCBkaXJvcHJlcyopOworZXh0ZXJuICBib29sX3QgeGRyX3JlYWRsaW5rcmVzIChYRFIgKiwgcmVhZGxpbmtyZXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9yZWFkYXJncyAoWERSICosIHJlYWRhcmdzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfcmVhZG9rcmVzIChYRFIgKiwgcmVhZG9rcmVzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfcmVhZHJlcyAoWERSICosIHJlYWRyZXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl93cml0ZWFyZ3MgKFhEUiAqLCB3cml0ZWFyZ3MqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9jcmVhdGVhcmdzIChYRFIgKiwgY3JlYXRlYXJncyopOworZXh0ZXJuICBib29sX3QgeGRyX3JlbmFtZWFyZ3MgKFhEUiAqLCByZW5hbWVhcmdzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbGlua2FyZ3MgKFhEUiAqLCBsaW5rYXJncyopOworZXh0ZXJuICBib29sX3QgeGRyX3N5bWxpbmthcmdzIChYRFIgKiwgc3ltbGlua2FyZ3MqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9uZnNjb29raWUgKFhEUiAqLCBuZnNjb29raWUpOworZXh0ZXJuICBib29sX3QgeGRyX3JlYWRkaXJhcmdzIChYRFIgKiwgcmVhZGRpcmFyZ3MqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9lbnRyeSAoWERSICosIGVudHJ5Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZGlybGlzdCAoWERSICosIGRpcmxpc3QqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9yZWFkZGlycmVzIChYRFIgKiwgcmVhZGRpcnJlcyopOworZXh0ZXJuICBib29sX3QgeGRyX3N0YXRmc29rcmVzIChYRFIgKiwgc3RhdGZzb2tyZXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9zdGF0ZnNyZXMgKFhEUiAqLCBzdGF0ZnNyZXMqKTsKKworI2Vsc2UgLyogSyZSIEMgKi8KK2V4dGVybiBib29sX3QgeGRyX25mc3N0YXQgKCk7CitleHRlcm4gYm9vbF90IHhkcl9mdHlwZSAoKTsKK2V4dGVybiBib29sX3QgeGRyX25mc19maCAoKTsKK2V4dGVybiBib29sX3QgeGRyX25mc3RpbWUgKCk7CitleHRlcm4gYm9vbF90IHhkcl9mYXR0ciAoKTsKK2V4dGVybiBib29sX3QgeGRyX3NhdHRyICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfZmlsZW5hbWUgKCk7CitleHRlcm4gYm9vbF90IHhkcl9uZnNwYXRoICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfYXR0cnN0YXQgKCk7CitleHRlcm4gYm9vbF90IHhkcl9zYXR0cmFyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9kaXJvcGFyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9kaXJvcG9rcmVzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfZGlyb3ByZXMgKCk7CitleHRlcm4gYm9vbF90IHhkcl9yZWFkbGlua3JlcyAoKTsKK2V4dGVybiBib29sX3QgeGRyX3JlYWRhcmdzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfcmVhZG9rcmVzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfcmVhZHJlcyAoKTsKK2V4dGVybiBib29sX3QgeGRyX3dyaXRlYXJncyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2NyZWF0ZWFyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9yZW5hbWVhcmdzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbGlua2FyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9zeW1saW5rYXJncyAoKTsKK2V4dGVybiBib29sX3QgeGRyX25mc2Nvb2tpZSAoKTsKK2V4dGVybiBib29sX3QgeGRyX3JlYWRkaXJhcmdzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfZW50cnkgKCk7CitleHRlcm4gYm9vbF90IHhkcl9kaXJsaXN0ICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfcmVhZGRpcnJlcyAoKTsKK2V4dGVybiBib29sX3QgeGRyX3N0YXRmc29rcmVzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfc3RhdGZzcmVzICgpOworCisjZW5kaWYgLyogSyZSIEMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFfTkZTX1BST1RfSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25mc19wcm90LnggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uZnNfcHJvdC54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOTkyZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uZnNfcHJvdC54CkBAIC0wLDAgKzEsMzUyIEBACisvKiBAKCMpbmZzX3Byb3QueAkyLjEgODgvMDgvMDEgNC4wIFJQQ1NSQyAqLworCisvKgorICogbmZzX3Byb3QueCAxLjIgODcvMTAvMTIKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitjb25zdCBORlNfUE9SVCAgICAgICAgICA9IDIwNDk7Citjb25zdCBORlNfTUFYREFUQSAgICAgICA9IDgxOTI7Citjb25zdCBORlNfTUFYUEFUSExFTiAgICA9IDEwMjQ7Citjb25zdCBORlNfTUFYTkFNTEVOCT0gMjU1OworY29uc3QgTkZTX0ZIU0laRQk9IDMyOworY29uc3QgTkZTX0NPT0tJRVNJWkUJPSA0OworY29uc3QgTkZTX0ZJRk9fREVWCT0gLTE7CS8qIHNpemUga2x1ZGdlIGZvciBuYW1lZCBwaXBlcyAqLworCisvKgorICogRmlsZSB0eXBlcworICovCitjb25zdCBORlNNT0RFX0ZNVCAgPSAwMTcwMDAwOwkvKiB0eXBlIG9mIGZpbGUgKi8KK2NvbnN0IE5GU01PREVfRElSICA9IDAwNDAwMDA7CS8qIGRpcmVjdG9yeSAqLworY29uc3QgTkZTTU9ERV9DSFIgID0gMDAyMDAwMDsJLyogY2hhcmFjdGVyIHNwZWNpYWwgKi8KK2NvbnN0IE5GU01PREVfQkxLICA9IDAwNjAwMDA7CS8qIGJsb2NrIHNwZWNpYWwgKi8KK2NvbnN0IE5GU01PREVfUkVHICA9IDAxMDAwMDA7CS8qIHJlZ3VsYXIgKi8KK2NvbnN0IE5GU01PREVfTE5LICA9IDAxMjAwMDA7CS8qIHN5bWJvbGljIGxpbmsgKi8KK2NvbnN0IE5GU01PREVfU09DSyA9IDAxNDAwMDA7CS8qIHNvY2tldCAqLworY29uc3QgTkZTTU9ERV9GSUZPID0gMDAxMDAwMDsJLyogZmlmbyAqLworCisvKgorICogRXJyb3Igc3RhdHVzCisgKi8KK2VudW0gbmZzc3RhdCB7CisJTkZTX09LPSAwLAkJLyogbm8gZXJyb3IgKi8KKwlORlNFUlJfUEVSTT0xLAkJLyogTm90IG93bmVyICovCisJTkZTRVJSX05PRU5UPTIsCQkvKiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5ICovCisJTkZTRVJSX0lPPTUsCQkvKiBJL08gZXJyb3IgKi8KKwlORlNFUlJfTlhJTz02LAkJLyogTm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcyAqLworCU5GU0VSUl9BQ0NFUz0xMywJLyogUGVybWlzc2lvbiBkZW5pZWQgKi8KKwlORlNFUlJfRVhJU1Q9MTcsCS8qIEZpbGUgZXhpc3RzICovCisJTkZTRVJSX05PREVWPTE5LAkvKiBObyBzdWNoIGRldmljZSAqLworCU5GU0VSUl9OT1RESVI9MjAsCS8qIE5vdCBhIGRpcmVjdG9yeSovCisJTkZTRVJSX0lTRElSPTIxLAkvKiBJcyBhIGRpcmVjdG9yeSAqLworCU5GU0VSUl9GQklHPTI3LAkJLyogRmlsZSB0b28gbGFyZ2UgKi8KKwlORlNFUlJfTk9TUEM9MjgsCS8qIE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlICovCisJTkZTRVJSX1JPRlM9MzAsCQkvKiBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0gKi8KKwlORlNFUlJfTkFNRVRPT0xPTkc9NjMsCS8qIEZpbGUgbmFtZSB0b28gbG9uZyAqLworCU5GU0VSUl9OT1RFTVBUWT02NiwJLyogRGlyZWN0b3J5IG5vdCBlbXB0eSAqLworCU5GU0VSUl9EUVVPVD02OSwJLyogRGlzYyBxdW90YSBleGNlZWRlZCAqLworCU5GU0VSUl9TVEFMRT03MCwJLyogU3RhbGUgTkZTIGZpbGUgaGFuZGxlICovCisJTkZTRVJSX1dGTFVTSD05OQkvKiB3cml0ZSBjYWNoZSBmbHVzaGVkICovCit9OworCisvKgorICogRmlsZSB0eXBlcworICovCitlbnVtIGZ0eXBlIHsKKwlORk5PTiA9IDAsCS8qIG5vbi1maWxlICovCisJTkZSRUcgPSAxLAkvKiByZWd1bGFyIGZpbGUgKi8KKwlORkRJUiA9IDIsCS8qIGRpcmVjdG9yeSAqLworCU5GQkxLID0gMywJLyogYmxvY2sgc3BlY2lhbCAqLworCU5GQ0hSID0gNCwJLyogY2hhcmFjdGVyIHNwZWNpYWwgKi8KKwlORkxOSyA9IDUsCS8qIHN5bWJvbGljIGxpbmsgKi8KKwlORlNPQ0sgPSA2LAkvKiB1bml4IGRvbWFpbiBzb2NrZXRzICovCisJTkZCQUQgPSA3LAkvKiB1bnVzZWQgKi8KKwlORkZJRk8gPSA4IAkvKiBuYW1lZCBwaXBlICovCit9OworCisvKgorICogRmlsZSBhY2Nlc3MgaGFuZGxlCisgKi8KK3N0cnVjdCBuZnNfZmggeworCW9wYXF1ZSBkYXRhW05GU19GSFNJWkVdOworfTsKKworLyoKKyAqIFRpbWV2YWwKKyAqLworc3RydWN0IG5mc3RpbWUgeworCXVuc2lnbmVkIHNlY29uZHM7CisJdW5zaWduZWQgdXNlY29uZHM7Cit9OworCisKKy8qCisgKiBGaWxlIGF0dHJpYnV0ZXMKKyAqLworc3RydWN0IGZhdHRyIHsKKwlmdHlwZSB0eXBlOwkJLyogZmlsZSB0eXBlICovCisJdW5zaWduZWQgbW9kZTsJCS8qIHByb3RlY3Rpb24gbW9kZSBiaXRzICovCisJdW5zaWduZWQgbmxpbms7CQkvKiAjIGhhcmQgbGlua3MgKi8KKwl1bnNpZ25lZCB1aWQ7CQkvKiBvd25lciB1c2VyIGlkICovCisJdW5zaWduZWQgZ2lkOwkJLyogb3duZXIgZ3JvdXAgaWQgKi8KKwl1bnNpZ25lZCBzaXplOwkJLyogZmlsZSBzaXplIGluIGJ5dGVzICovCisJdW5zaWduZWQgYmxvY2tzaXplOwkvKiBwcmVmZXJyZWQgYmxvY2sgc2l6ZSAqLworCXVuc2lnbmVkIHJkZXY7CQkvKiBzcGVjaWFsIGRldmljZSAjICovCisJdW5zaWduZWQgYmxvY2tzOwkvKiBLYiBvZiBkaXNrIHVzZWQgYnkgZmlsZSAqLworCXVuc2lnbmVkIGZzaWQ7CQkvKiBkZXZpY2UgIyAqLworCXVuc2lnbmVkIGZpbGVpZDsJLyogaW5vZGUgIyAqLworCW5mc3RpbWUJYXRpbWU7CQkvKiB0aW1lIG9mIGxhc3QgYWNjZXNzICovCisJbmZzdGltZQltdGltZTsJCS8qIHRpbWUgb2YgbGFzdCBtb2RpZmljYXRpb24gKi8KKwluZnN0aW1lCWN0aW1lOwkJLyogdGltZSBvZiBsYXN0IGNoYW5nZSAqLworfTsKKworLyoKKyAqIEZpbGUgYXR0cmlidXRlcyB3aGljaCBjYW4gYmUgc2V0CisgKi8KK3N0cnVjdCBzYXR0ciB7CisJdW5zaWduZWQgbW9kZTsJLyogcHJvdGVjdGlvbiBtb2RlIGJpdHMgKi8KKwl1bnNpZ25lZCB1aWQ7CS8qIG93bmVyIHVzZXIgaWQgKi8KKwl1bnNpZ25lZCBnaWQ7CS8qIG93bmVyIGdyb3VwIGlkICovCisJdW5zaWduZWQgc2l6ZTsJLyogZmlsZSBzaXplIGluIGJ5dGVzICovCisJbmZzdGltZQlhdGltZTsJLyogdGltZSBvZiBsYXN0IGFjY2VzcyAqLworCW5mc3RpbWUJbXRpbWU7CS8qIHRpbWUgb2YgbGFzdCBtb2RpZmljYXRpb24gKi8KK307CisKKwordHlwZWRlZiBzdHJpbmcgZmlsZW5hbWU8TkZTX01BWE5BTUxFTj47Cit0eXBlZGVmIHN0cmluZyBuZnNwYXRoPE5GU19NQVhQQVRITEVOPjsKKworLyoKKyAqIFJlcGx5IHN0YXR1cyB3aXRoIGZpbGUgYXR0cmlidXRlcworICovCit1bmlvbiBhdHRyc3RhdCBzd2l0Y2ggKG5mc3N0YXQgc3RhdHVzKSB7CitjYXNlIE5GU19PSzoKKwlmYXR0ciBhdHRyaWJ1dGVzOworZGVmYXVsdDoKKwl2b2lkOworfTsKKworc3RydWN0IHNhdHRyYXJncyB7CisJbmZzX2ZoIGZpbGU7CisJc2F0dHIgYXR0cmlidXRlczsKK307CisKKy8qCisgKiBBcmd1bWVudHMgZm9yIGRpcmVjdG9yeSBvcGVyYXRpb25zCisgKi8KK3N0cnVjdCBkaXJvcGFyZ3MgeworCW5mc19maAlkaXI7CS8qIGRpcmVjdG9yeSBmaWxlIGhhbmRsZSAqLworCWZpbGVuYW1lIG5hbWU7CQkvKiBuYW1lICh1cCB0byBORlNfTUFYTkFNTEVOIGJ5dGVzKSAqLworfTsKKworc3RydWN0IGRpcm9wb2tyZXMgeworCW5mc19maCBmaWxlOworCWZhdHRyIGF0dHJpYnV0ZXM7Cit9OworCisvKgorICogUmVzdWx0cyBmcm9tIGRpcmVjdG9yeSBvcGVyYXRpb24KKyAqLwordW5pb24gZGlyb3ByZXMgc3dpdGNoIChuZnNzdGF0IHN0YXR1cykgeworY2FzZSBORlNfT0s6CisJZGlyb3Bva3JlcyBkaXJvcHJlczsKK2RlZmF1bHQ6CisJdm9pZDsKK307CisKK3VuaW9uIHJlYWRsaW5rcmVzIHN3aXRjaCAobmZzc3RhdCBzdGF0dXMpIHsKK2Nhc2UgTkZTX09LOgorCW5mc3BhdGggZGF0YTsKK2RlZmF1bHQ6CisJdm9pZDsKK307CisKKy8qCisgKiBBcmd1bWVudHMgdG8gcmVtb3RlIHJlYWQKKyAqLworc3RydWN0IHJlYWRhcmdzIHsKKwluZnNfZmggZmlsZTsJCS8qIGhhbmRsZSBmb3IgZmlsZSAqLworCXVuc2lnbmVkIG9mZnNldDsJLyogYnl0ZSBvZmZzZXQgaW4gZmlsZSAqLworCXVuc2lnbmVkIGNvdW50OwkJLyogaW1tZWRpYXRlIHJlYWQgY291bnQgKi8KKwl1bnNpZ25lZCB0b3RhbGNvdW50OwkvKiB0b3RhbCByZWFkIGNvdW50IChmcm9tIHRoaXMgb2Zmc2V0KSovCit9OworCisvKgorICogU3RhdHVzIE9LIHBvcnRpb24gb2YgcmVtb3RlIHJlYWQgcmVwbHkKKyAqLworc3RydWN0IHJlYWRva3JlcyB7CisJZmF0dHIJYXR0cmlidXRlczsJLyogYXR0cmlidXRlcywgbmVlZCBmb3IgcGFnaW4qLworCW9wYXF1ZSBkYXRhPE5GU19NQVhEQVRBPjsKK307CisKK3VuaW9uIHJlYWRyZXMgc3dpdGNoIChuZnNzdGF0IHN0YXR1cykgeworY2FzZSBORlNfT0s6CisJcmVhZG9rcmVzIHJlcGx5OworZGVmYXVsdDoKKwl2b2lkOworfTsKKworLyoKKyAqIEFyZ3VtZW50cyB0byByZW1vdGUgd3JpdGUKKyAqLworc3RydWN0IHdyaXRlYXJncyB7CisJbmZzX2ZoCWZpbGU7CQkvKiBoYW5kbGUgZm9yIGZpbGUgKi8KKwl1bnNpZ25lZCBiZWdpbm9mZnNldDsJLyogYmVnaW5uaW5nIGJ5dGUgb2Zmc2V0IGluIGZpbGUgKi8KKwl1bnNpZ25lZCBvZmZzZXQ7CS8qIGN1cnJlbnQgYnl0ZSBvZmZzZXQgaW4gZmlsZSAqLworCXVuc2lnbmVkIHRvdGFsY291bnQ7CS8qIHRvdGFsIHdyaXRlIGNvdW50ICh0byB0aGlzIG9mZnNldCkqLworCW9wYXF1ZSBkYXRhPE5GU19NQVhEQVRBPjsKK307CisKK3N0cnVjdCBjcmVhdGVhcmdzIHsKKwlkaXJvcGFyZ3Mgd2hlcmU7CisJc2F0dHIgYXR0cmlidXRlczsKK307CisKK3N0cnVjdCByZW5hbWVhcmdzIHsKKwlkaXJvcGFyZ3MgZnJvbTsKKwlkaXJvcGFyZ3MgdG87Cit9OworCitzdHJ1Y3QgbGlua2FyZ3MgeworCW5mc19maCBmcm9tOworCWRpcm9wYXJncyB0bzsKK307CisKK3N0cnVjdCBzeW1saW5rYXJncyB7CisJZGlyb3BhcmdzIGZyb207CisJbmZzcGF0aCB0bzsKKwlzYXR0ciBhdHRyaWJ1dGVzOworfTsKKworCit0eXBlZGVmIG9wYXF1ZSBuZnNjb29raWVbTkZTX0NPT0tJRVNJWkVdOworCisvKgorICogQXJndW1lbnRzIHRvIHJlYWRkaXIKKyAqLworc3RydWN0IHJlYWRkaXJhcmdzIHsKKwluZnNfZmggZGlyOwkJLyogZGlyZWN0b3J5IGhhbmRsZSAqLworCW5mc2Nvb2tpZSBjb29raWU7CisJdW5zaWduZWQgY291bnQ7CQkvKiBudW1iZXIgb2YgZGlyZWN0b3J5IGJ5dGVzIHRvIHJlYWQgKi8KK307CisKK3N0cnVjdCBlbnRyeSB7CisJdW5zaWduZWQgZmlsZWlkOworCWZpbGVuYW1lIG5hbWU7CisJbmZzY29va2llIGNvb2tpZTsKKwllbnRyeSAqbmV4dGVudHJ5OworfTsKKworc3RydWN0IGRpcmxpc3QgeworCWVudHJ5ICplbnRyaWVzOworCWJvb2wgZW9mOworfTsKKwordW5pb24gcmVhZGRpcnJlcyBzd2l0Y2ggKG5mc3N0YXQgc3RhdHVzKSB7CitjYXNlIE5GU19PSzoKKwlkaXJsaXN0IHJlcGx5OworZGVmYXVsdDoKKwl2b2lkOworfTsKKworc3RydWN0IHN0YXRmc29rcmVzIHsKKwl1bnNpZ25lZCB0c2l6ZTsJLyogcHJlZmVycmVkIHRyYW5zZmVyIHNpemUgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBic2l6ZTsJLyogZnVuZGFtZW50YWwgZmlsZSBzeXN0ZW0gYmxvY2sgc2l6ZSAqLworCXVuc2lnbmVkIGJsb2NrczsJLyogdG90YWwgYmxvY2tzIGluIGZpbGUgc3lzdGVtICovCisJdW5zaWduZWQgYmZyZWU7CS8qIGZyZWUgYmxvY2tzIGluIGZzICovCisJdW5zaWduZWQgYmF2YWlsOwkvKiBmcmVlIGJsb2NrcyBhdmFpbCB0byBub24tc3VwZXJ1c2VyICovCit9OworCit1bmlvbiBzdGF0ZnNyZXMgc3dpdGNoIChuZnNzdGF0IHN0YXR1cykgeworY2FzZSBORlNfT0s6CisJc3RhdGZzb2tyZXMgcmVwbHk7CitkZWZhdWx0OgorCXZvaWQ7Cit9OworCisvKgorICogUmVtb3RlIGZpbGUgc2VydmljZSByb3V0aW5lcworICovCitwcm9ncmFtIE5GU19QUk9HUkFNIHsKKwl2ZXJzaW9uIE5GU19WRVJTSU9OIHsKKwkJdm9pZAorCQlORlNQUk9DX05VTEwodm9pZCkgPSAwOworCisJCWF0dHJzdGF0CisJCU5GU1BST0NfR0VUQVRUUihuZnNfZmgpID0JMTsKKworCQlhdHRyc3RhdAorCQlORlNQUk9DX1NFVEFUVFIoc2F0dHJhcmdzKSA9IDI7CisKKwkJdm9pZAorCQlORlNQUk9DX1JPT1Qodm9pZCkgPSAzOworCisJCWRpcm9wcmVzCisJCU5GU1BST0NfTE9PS1VQKGRpcm9wYXJncykgPSA0OworCisJCXJlYWRsaW5rcmVzCisJCU5GU1BST0NfUkVBRExJTksobmZzX2ZoKSA9IDU7CisKKwkJcmVhZHJlcworCQlORlNQUk9DX1JFQUQocmVhZGFyZ3MpID0gNjsKKworCQl2b2lkCisJCU5GU1BST0NfV1JJVEVDQUNIRSh2b2lkKSA9IDc7CisKKwkJYXR0cnN0YXQKKwkJTkZTUFJPQ19XUklURSh3cml0ZWFyZ3MpID0gODsKKworCQlkaXJvcHJlcworCQlORlNQUk9DX0NSRUFURShjcmVhdGVhcmdzKSA9IDk7CisKKwkJbmZzc3RhdAorCQlORlNQUk9DX1JFTU9WRShkaXJvcGFyZ3MpID0gMTA7CisKKwkJbmZzc3RhdAorCQlORlNQUk9DX1JFTkFNRShyZW5hbWVhcmdzKSA9IDExOworCisJCW5mc3N0YXQKKwkJTkZTUFJPQ19MSU5LKGxpbmthcmdzKSA9IDEyOworCisJCW5mc3N0YXQKKwkJTkZTUFJPQ19TWU1MSU5LKHN5bWxpbmthcmdzKSA9IDEzOworCisJCWRpcm9wcmVzCisJCU5GU1BST0NfTUtESVIoY3JlYXRlYXJncykgPSAxNDsKKworCQluZnNzdGF0CisJCU5GU1BST0NfUk1ESVIoZGlyb3BhcmdzKSA9IDE1OworCisJCXJlYWRkaXJyZXMKKwkJTkZTUFJPQ19SRUFERElSKHJlYWRkaXJhcmdzKSA9IDE2OworCisJCXN0YXRmc3JlcworCQlORlNQUk9DX1NUQVRGUyhuZnNfZmgpID0gMTc7CisJfSA9IDI7Cit9ID0gMTAwMDAzOwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzVjN2JiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzLmgKQEAgLTAsMCArMSw2MTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9SUENTVkNfTklTX0gKKyNkZWZpbmUgX1JQQ1NWQ19OSVNfSCAxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHJwYy9ycGMuaD4KKyNpbmNsdWRlIDxycGNzdmMvbmlzX3RhZ3MuaD4KKworX19CRUdJTl9ERUNMUworCisvKgorICoJbmlzLmgKKyAqCisgKglUaGlzIGZpbGUgaXMgdGhlIG1haW4gaW5jbHVkZSBmaWxlIGZvciBOSVMgY2xpZW50cy4gSXQgY29udGFpbnMKKyAqCWJvdGggdGhlIGNsaWVudCBsaWJyYXJ5IGZ1bmN0aW9uIGRlZmluZXMgYW5kIHRoZSB2YXJpb3VzIGRhdGEKKyAqCXN0cnVjdHVyZXMgdXNlZCBieSB0aGUgTklTIHNlcnZpY2UuIEl0IGluY2x1ZGVzIHRoZSBmaWxlIG5pc190YWdzLmgKKyAqCXdoaWNoIGRlZmluZXMgdGhlIHRhZyB2YWx1ZXMuIFRoaXMgYWxsb3dzIHRoZSB0YWdzIHRvIGNoYW5nZSB3aXRob3V0CisgKgloYXZpbmcgdG8gY2hhbmdlIHRoZSBuaXMueCBmaWxlLgorICoKKyAqCU5PVEUgOiBUSElTIEZJTEUgSVMgTk9UIEdFTkVSQVRFRCBXSVRIIFJQQ0dFTiAhIFNPIFlPVSBIQVZFIFRPCisgKiAgICAgICAgICAgICBBREQgQUxMIFRIRSBDSEFOR0VTIE9OIG5pc18qLnggRklMRVMgSEVSRSBBR0FJTiAhCisgKgorICogICAgICBJIGhhdmUgcmVtb3ZlZCBhbGwgdGhlIFNvbGFyaXMgaW50ZXJuYWwgc3RydWN0cyBhbmQgdmFyaWFibGVzLAorICogICAgICBiZWNhdXNlIHRoZXkgYXJlIG5vdCBzdXBwb3J0ZWQsIFN1biBjaGFuZ2VkIHRoZW0gYmV0d2VlbiB2YXJpb3VzCisgKiAgICAgIHJlbGVhc2VzIGFuZCB0aGV5IHNob3VsZG4ndCBiZSB1c2VkIGluIHVzZXIgcHJvZ3JhbXMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8a3VrdWtAc3VzZS5kZT4KKyAqLworCisKKyNpZm5kZWYgX19uaXNfb2JqZWN0X2gKKyNkZWZpbmUgX19uaXNfb2JqZWN0X2gKKworI2RlZmluZSBOSVNfTUFYU1RSSU5HTEVOIDI1NQorI2RlZmluZSBOSVNfTUFYTkFNRUxFTiAxMDI0CisjZGVmaW5lIE5JU19NQVhBVFRSTkFNRSAzMgorI2RlZmluZSBOSVNfTUFYQVRUUlZBTCAyMDQ4CisjZGVmaW5lIE5JU19NQVhDT0xVTU5TIDY0CisjZGVmaW5lIE5JU19NQVhBVFRSIDE2CisjZGVmaW5lIE5JU19NQVhQQVRIIDEwMjQKKyNkZWZpbmUgTklTX01BWFJFUExJQ0FTIDEyOAorI2RlZmluZSBOSVNfTUFYTElOS1MgMTYKKyNkZWZpbmUgTklTX1BLX05PTkUgMAorI2RlZmluZSBOSVNfUEtfREggMQorI2RlZmluZSBOSVNfUEtfUlNBIDIKKyNkZWZpbmUgTklTX1BLX0tFUkIgMworI2RlZmluZSBOSVNfUEtfREhFWFQgNAorCitzdHJ1Y3QgbmlzX2F0dHIgeworCWNoYXIgKnphdHRyX25keDsKKwlzdHJ1Y3QgeworCQl1X2ludCB6YXR0cl92YWxfbGVuOworCQljaGFyICp6YXR0cl92YWxfdmFsOworCX0gemF0dHJfdmFsOworfTsKK3R5cGVkZWYgc3RydWN0IG5pc19hdHRyIG5pc19hdHRyOworCit0eXBlZGVmIGNoYXIgKm5pc19uYW1lOworCitlbnVtIHpvdHlwZXMgeworCUJPR1VTX09CSiA9IDAsCisJTk9fT0JKID0gMSwKKwlESVJFQ1RPUllfT0JKID0gMiwKKwlHUk9VUF9PQkogPSAzLAorCVRBQkxFX09CSiA9IDQsCisJRU5UUllfT0JKID0gNSwKKwlMSU5LX09CSiA9IDYsCisJUFJJVkFURV9PQkogPSA3LAorCU5JU19CT0dVU19PQkogPSAwLAorCU5JU19OT19PQkogPSAxLAorCU5JU19ESVJFQ1RPUllfT0JKID0gMiwKKwlOSVNfR1JPVVBfT0JKID0gMywKKwlOSVNfVEFCTEVfT0JKID0gNCwKKwlOSVNfRU5UUllfT0JKID0gNSwKKwlOSVNfTElOS19PQkogPSA2LAorCU5JU19QUklWQVRFX09CSiA9IDcKK307Cit0eXBlZGVmIGVudW0gem90eXBlcyB6b3R5cGVzOworCitlbnVtIG5zdHlwZSB7CisJVU5LTk9XTiA9IDAsCisJTklTID0gMSwKKwlTVU5ZUCA9IDIsCisJSVZZID0gMywKKwlETlMgPSA0LAorCVg1MDAgPSA1LAorCUROQU5TID0gNiwKKwlYQ0hTID0gNywKKwlDRFMgPSA4LAorfTsKK3R5cGVkZWYgZW51bSBuc3R5cGUgbnN0eXBlOworCitzdHJ1Y3Qgb2FyX21hc2sgeworCXVpbnQzMl90IG9hX3JpZ2h0czsKKwl6b3R5cGVzIG9hX290eXBlOworfTsKK3R5cGVkZWYgc3RydWN0IG9hcl9tYXNrIG9hcl9tYXNrOworCitzdHJ1Y3QgZW5kcG9pbnQgeworCWNoYXIgKnVhZGRyOworCWNoYXIgKmZhbWlseTsKKwljaGFyICpwcm90bzsKK307Cit0eXBlZGVmIHN0cnVjdCBlbmRwb2ludCBlbmRwb2ludDsKKworc3RydWN0IG5pc19zZXJ2ZXIgeworCW5pc19uYW1lIG5hbWU7CisJc3RydWN0IHsKKwkJdV9pbnQgZXBfbGVuOworCQllbmRwb2ludCAqZXBfdmFsOworCX0gZXA7CisJdWludDMyX3Qga2V5X3R5cGU7CisJbmV0b2JqIHBrZXk7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmlzX3NlcnZlciBuaXNfc2VydmVyOworCitzdHJ1Y3QgZGlyZWN0b3J5X29iaiB7CisJbmlzX25hbWUgZG9fbmFtZTsKKwluc3R5cGUgZG9fdHlwZTsKKwlzdHJ1Y3QgeworCQl1X2ludCBkb19zZXJ2ZXJzX2xlbjsKKwkJbmlzX3NlcnZlciAqZG9fc2VydmVyc192YWw7CisJfSBkb19zZXJ2ZXJzOworCXVpbnQzMl90IGRvX3R0bDsKKwlzdHJ1Y3QgeworCQl1X2ludCBkb19hcm1hc2tfbGVuOworCQlvYXJfbWFzayAqZG9fYXJtYXNrX3ZhbDsKKwl9IGRvX2FybWFzazsKK307Cit0eXBlZGVmIHN0cnVjdCBkaXJlY3Rvcnlfb2JqIGRpcmVjdG9yeV9vYmo7CisKKyNkZWZpbmUgRU5fQklOQVJZIDEKKyNkZWZpbmUgRU5fQ1JZUFQgMgorI2RlZmluZSBFTl9YRFIgNAorI2RlZmluZSBFTl9NT0RJRklFRCA4CisjZGVmaW5lIEVOX0FTTjEgNjQKKworc3RydWN0IGVudHJ5X2NvbCB7CisJdWludDMyX3QgZWNfZmxhZ3M7CisJc3RydWN0IHsKKwkJdV9pbnQgZWNfdmFsdWVfbGVuOworCQljaGFyICplY192YWx1ZV92YWw7CisJfSBlY192YWx1ZTsKK307Cit0eXBlZGVmIHN0cnVjdCBlbnRyeV9jb2wgZW50cnlfY29sOworCitzdHJ1Y3QgZW50cnlfb2JqIHsKKwljaGFyICplbl90eXBlOworCXN0cnVjdCB7CisJCXVfaW50IGVuX2NvbHNfbGVuOworCQllbnRyeV9jb2wgKmVuX2NvbHNfdmFsOworCX0gZW5fY29sczsKK307Cit0eXBlZGVmIHN0cnVjdCBlbnRyeV9vYmogZW50cnlfb2JqOworCitzdHJ1Y3QgZ3JvdXBfb2JqIHsKKwl1aW50MzJfdCBncl9mbGFnczsKKwlzdHJ1Y3QgeworCQl1X2ludCBncl9tZW1iZXJzX2xlbjsKKwkJbmlzX25hbWUgKmdyX21lbWJlcnNfdmFsOworCX0gZ3JfbWVtYmVyczsKK307Cit0eXBlZGVmIHN0cnVjdCBncm91cF9vYmogZ3JvdXBfb2JqOworCitzdHJ1Y3QgbGlua19vYmogeworCXpvdHlwZXMgbGlfcnR5cGU7CisJc3RydWN0IHsKKwkJdV9pbnQgbGlfYXR0cnNfbGVuOworCQluaXNfYXR0ciAqbGlfYXR0cnNfdmFsOworCX0gbGlfYXR0cnM7CisJbmlzX25hbWUgbGlfbmFtZTsKK307Cit0eXBlZGVmIHN0cnVjdCBsaW5rX29iaiBsaW5rX29iajsKKworI2RlZmluZSBUQV9CSU5BUlkgMQorI2RlZmluZSBUQV9DUllQVCAyCisjZGVmaW5lIFRBX1hEUiA0CisjZGVmaW5lIFRBX1NFQVJDSEFCTEUgOAorI2RlZmluZSBUQV9DQVNFIDE2CisjZGVmaW5lIFRBX01PRElGSUVEIDMyCisjZGVmaW5lIFRBX0FTTjEgNjQKKworc3RydWN0IHRhYmxlX2NvbCB7CisJY2hhciAqdGNfbmFtZTsKKwl1aW50MzJfdCB0Y19mbGFnczsKKwl1aW50MzJfdCB0Y19yaWdodHM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgdGFibGVfY29sIHRhYmxlX2NvbDsKKworc3RydWN0IHRhYmxlX29iaiB7CisJY2hhciAqdGFfdHlwZTsKKwlpbnQgdGFfbWF4Y29sOworCXVfY2hhciB0YV9zZXA7CisJc3RydWN0IHsKKwkJdV9pbnQgdGFfY29sc19sZW47CisJCXRhYmxlX2NvbCAqdGFfY29sc192YWw7CisJfSB0YV9jb2xzOworCWNoYXIgKnRhX3BhdGg7Cit9OwordHlwZWRlZiBzdHJ1Y3QgdGFibGVfb2JqIHRhYmxlX29iajsKKworc3RydWN0IG9iamRhdGEgeworCXpvdHlwZXMgem9fdHlwZTsKKwl1bmlvbiB7CisJCXN0cnVjdCBkaXJlY3Rvcnlfb2JqIGRpX2RhdGE7CisJCXN0cnVjdCBncm91cF9vYmogZ3JfZGF0YTsKKwkJc3RydWN0IHRhYmxlX29iaiB0YV9kYXRhOworCQlzdHJ1Y3QgZW50cnlfb2JqIGVuX2RhdGE7CisJCXN0cnVjdCBsaW5rX29iaiBsaV9kYXRhOworCQlzdHJ1Y3QgeworCQkJdV9pbnQgcG9fZGF0YV9sZW47CisJCQljaGFyICpwb19kYXRhX3ZhbDsKKwkJfSBwb19kYXRhOworCX0gb2JqZGF0YV91OworfTsKK3R5cGVkZWYgc3RydWN0IG9iamRhdGEgb2JqZGF0YTsKKworc3RydWN0IG5pc19vaWQgeworCXVpbnQzMl90IGN0aW1lOworCXVpbnQzMl90IG10aW1lOworfTsKK3R5cGVkZWYgc3RydWN0IG5pc19vaWQgbmlzX29pZDsKKworc3RydWN0IG5pc19vYmplY3QgeworCW5pc19vaWQgem9fb2lkOworCW5pc19uYW1lIHpvX25hbWU7CisJbmlzX25hbWUgem9fb3duZXI7CisJbmlzX25hbWUgem9fZ3JvdXA7CisJbmlzX25hbWUgem9fZG9tYWluOworCXVpbnQzMl90IHpvX2FjY2VzczsKKwl1aW50MzJfdCB6b190dGw7CisJb2JqZGF0YSB6b19kYXRhOworfTsKK3R5cGVkZWYgc3RydWN0IG5pc19vYmplY3QgbmlzX29iamVjdDsKKworI2VuZGlmIC8qIGlmIF9fbmlzX29iamVjdF9oICovCisKK2VudW0gbmlzX2Vycm9yIHsKKwlOSVNfU1VDQ0VTUyA9IDAsCisJTklTX1NfU1VDQ0VTUyA9IDEsCisJTklTX05PVEZPVU5EID0gMiwKKwlOSVNfU19OT1RGT1VORCA9IDMsCisJTklTX0NBQ0hFRVhQSVJFRCA9IDQsCisJTklTX05BTUVVTlJFQUNIQUJMRSA9IDUsCisJTklTX1VOS05PV05PQkogPSA2LAorCU5JU19UUllBR0FJTiA9IDcsCisJTklTX1NZU1RFTUVSUk9SID0gOCwKKwlOSVNfQ0hBSU5CUk9LRU4gPSA5LAorCU5JU19QRVJNSVNTSU9OID0gMTAsCisJTklTX05PVE9XTkVSID0gMTEsCisJTklTX05PVF9NRSA9IDEyLAorCU5JU19OT01FTU9SWSA9IDEzLAorCU5JU19OQU1FRVhJU1RTID0gMTQsCisJTklTX05PVE1BU1RFUiA9IDE1LAorCU5JU19JTlZBTElET0JKID0gMTYsCisJTklTX0JBRE5BTUUgPSAxNywKKwlOSVNfTk9DQUxMQkFDSyA9IDE4LAorCU5JU19DQlJFU1VMVFMgPSAxOSwKKwlOSVNfTk9TVUNITkFNRSA9IDIwLAorCU5JU19OT1RVTklRVUUgPSAyMSwKKwlOSVNfSUJNT0RFUlJPUiA9IDIyLAorCU5JU19OT1NVQ0hUQUJMRSA9IDIzLAorCU5JU19UWVBFTUlTTUFUQ0ggPSAyNCwKKwlOSVNfTElOS05BTUVFUlJPUiA9IDI1LAorCU5JU19QQVJUSUFMID0gMjYsCisJTklTX1RPT01BTllBVFRSUyA9IDI3LAorCU5JU19SUENFUlJPUiA9IDI4LAorCU5JU19CQURBVFRSSUJVVEUgPSAyOSwKKwlOSVNfTk9UU0VBUkNIQUJMRSA9IDMwLAorCU5JU19DQkVSUk9SID0gMzEsCisJTklTX0ZPUkVJR05OUyA9IDMyLAorCU5JU19CQURPQkpFQ1QgPSAzMywKKwlOSVNfTk9UU0FNRU9CSiA9IDM0LAorCU5JU19NT0RGQUlMID0gMzUsCisJTklTX0JBRFJFUVVFU1QgPSAzNiwKKwlOSVNfTk9URU1QVFkgPSAzNywKKwlOSVNfQ09MRFNUQVJUX0VSUiA9IDM4LAorCU5JU19SRVNZTkMgPSAzOSwKKwlOSVNfRkFJTCA9IDQwLAorCU5JU19VTkFWQUlMID0gNDEsCisJTklTX1JFUzJCSUcgPSA0MiwKKwlOSVNfU1JWQVVUSCA9IDQzLAorCU5JU19DTE5UQVVUSCA9IDQ0LAorCU5JU19OT0ZJTEVTUEFDRSA9IDQ1LAorCU5JU19OT1BST0MgPSA0NiwKKwlOSVNfRFVNUExBVEVSID0gNDcsCit9OwordHlwZWRlZiBlbnVtIG5pc19lcnJvciBuaXNfZXJyb3I7CisKK3N0cnVjdCBuaXNfcmVzdWx0IHsKKwluaXNfZXJyb3Igc3RhdHVzOworCXN0cnVjdCB7CisJCXVfaW50IG9iamVjdHNfbGVuOworCQluaXNfb2JqZWN0ICpvYmplY3RzX3ZhbDsKKwl9IG9iamVjdHM7CisJbmV0b2JqIGNvb2tpZTsKKwl1aW50MzJfdCB6dGlja3M7CisJdWludDMyX3QgZHRpY2tzOworCXVpbnQzMl90IGF0aWNrczsKKwl1aW50MzJfdCBjdGlja3M7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmlzX3Jlc3VsdCBuaXNfcmVzdWx0OworCitzdHJ1Y3QgbnNfcmVxdWVzdCB7CisJbmlzX25hbWUgbnNfbmFtZTsKKwlzdHJ1Y3QgeworCQl1X2ludCBuc19vYmplY3RfbGVuOworCQluaXNfb2JqZWN0ICpuc19vYmplY3RfdmFsOworCX0gbnNfb2JqZWN0OworfTsKK3R5cGVkZWYgc3RydWN0IG5zX3JlcXVlc3QgbnNfcmVxdWVzdDsKKworc3RydWN0IGliX3JlcXVlc3QgeworCW5pc19uYW1lIGlicl9uYW1lOworCXN0cnVjdCB7CisJCXVfaW50IGlicl9zcmNoX2xlbjsKKwkJbmlzX2F0dHIgKmlicl9zcmNoX3ZhbDsKKwl9IGlicl9zcmNoOworCXVpbnQzMl90IGlicl9mbGFnczsKKwlzdHJ1Y3QgeworCQl1X2ludCBpYnJfb2JqX2xlbjsKKwkJbmlzX29iamVjdCAqaWJyX29ial92YWw7CisJfSBpYnJfb2JqOworCXN0cnVjdCB7CisJCXVfaW50IGlicl9jYmhvc3RfbGVuOworCQluaXNfc2VydmVyICppYnJfY2Job3N0X3ZhbDsKKwl9IGlicl9jYmhvc3Q7CisJdV9pbnQgaWJyX2J1ZnNpemU7CisJbmV0b2JqIGlicl9jb29raWU7Cit9OwordHlwZWRlZiBzdHJ1Y3QgaWJfcmVxdWVzdCBpYl9yZXF1ZXN0OworCitzdHJ1Y3QgcGluZ19hcmdzIHsKKwluaXNfbmFtZSBkaXI7CisJdWludDMyX3Qgc3RhbXA7Cit9OwordHlwZWRlZiBzdHJ1Y3QgcGluZ19hcmdzIHBpbmdfYXJnczsKKworZW51bSBsb2dfZW50cnlfdCB7CisJTE9HX05PUCA9IDAsCisJQUREX05BTUUgPSAxLAorCVJFTV9OQU1FID0gMiwKKwlNT0RfTkFNRV9PTEQgPSAzLAorCU1PRF9OQU1FX05FVyA9IDQsCisJQUREX0lCQVNFID0gNSwKKwlSRU1fSUJBU0UgPSA2LAorCU1PRF9JQkFTRSA9IDcsCisJVVBEX1NUQU1QID0gOCwKK307Cit0eXBlZGVmIGVudW0gbG9nX2VudHJ5X3QgbG9nX2VudHJ5X3Q7CisKK3N0cnVjdCBsb2dfZW50cnkgeworCXVpbnQzMl90IGxlX3RpbWU7CisJbG9nX2VudHJ5X3QgbGVfdHlwZTsKKwluaXNfbmFtZSBsZV9wcmluY3A7CisJbmlzX25hbWUgbGVfbmFtZTsKKwlzdHJ1Y3QgeworCQl1X2ludCBsZV9hdHRyc19sZW47CisJCW5pc19hdHRyICpsZV9hdHRyc192YWw7CisJfSBsZV9hdHRyczsKKwluaXNfb2JqZWN0IGxlX29iamVjdDsKK307Cit0eXBlZGVmIHN0cnVjdCBsb2dfZW50cnkgbG9nX2VudHJ5OworCitzdHJ1Y3QgbG9nX3Jlc3VsdCB7CisJbmlzX2Vycm9yIGxyX3N0YXR1czsKKwluZXRvYmogbHJfY29va2llOworCXN0cnVjdCB7CisJCXVfaW50IGxyX2VudHJpZXNfbGVuOworCQlsb2dfZW50cnkgKmxyX2VudHJpZXNfdmFsOworCX0gbHJfZW50cmllczsKK307Cit0eXBlZGVmIHN0cnVjdCBsb2dfcmVzdWx0IGxvZ19yZXN1bHQ7CisKK3N0cnVjdCBjcF9yZXN1bHQgeworCW5pc19lcnJvciBjcF9zdGF0dXM7CisJdWludDMyX3QgY3BfenRpY2tzOworCXVpbnQzMl90IGNwX2R0aWNrczsKK307Cit0eXBlZGVmIHN0cnVjdCBjcF9yZXN1bHQgY3BfcmVzdWx0OworCitzdHJ1Y3QgbmlzX3RhZyB7CisJdWludDMyX3QgdGFnX3R5cGU7CisJY2hhciAqdGFnX3ZhbDsKK307Cit0eXBlZGVmIHN0cnVjdCBuaXNfdGFnIG5pc190YWc7CisKK3N0cnVjdCBuaXNfdGFnbGlzdCB7CisJc3RydWN0IHsKKwkJdV9pbnQgdGFnc19sZW47CisJCW5pc190YWcgKnRhZ3NfdmFsOworCX0gdGFnczsKK307Cit0eXBlZGVmIHN0cnVjdCBuaXNfdGFnbGlzdCBuaXNfdGFnbGlzdDsKKworc3RydWN0IGR1bXBfYXJncyB7CisJbmlzX25hbWUgZGFfZGlyOworCXVpbnQzMl90IGRhX3RpbWU7CisJc3RydWN0IHsKKwkJdV9pbnQgZGFfY2Job3N0X2xlbjsKKwkJbmlzX3NlcnZlciAqZGFfY2Job3N0X3ZhbDsKKwl9IGRhX2NiaG9zdDsKK307Cit0eXBlZGVmIHN0cnVjdCBkdW1wX2FyZ3MgZHVtcF9hcmdzOworCitzdHJ1Y3QgZmRfYXJncyB7CisJbmlzX25hbWUgZGlyX25hbWU7CisJbmlzX25hbWUgcmVxdWVzdGVyOworfTsKK3R5cGVkZWYgc3RydWN0IGZkX2FyZ3MgZmRfYXJnczsKKworc3RydWN0IGZkX3Jlc3VsdCB7CisJbmlzX2Vycm9yIHN0YXR1czsKKwluaXNfbmFtZSBzb3VyY2U7CisJc3RydWN0IHsKKwkJdV9pbnQgZGlyX2RhdGFfbGVuOworCQljaGFyICpkaXJfZGF0YV92YWw7CisJfSBkaXJfZGF0YTsKKwlzdHJ1Y3QgeworCQl1X2ludCBzaWduYXR1cmVfbGVuOworCQljaGFyICpzaWduYXR1cmVfdmFsOworCX0gc2lnbmF0dXJlOworfTsKK3R5cGVkZWYgc3RydWN0IGZkX3Jlc3VsdCBmZF9yZXN1bHQ7CisKKy8qIEdlbmVyaWMgY2xpZW50IGNyZWF0aW5nIGZsYWdzICovCisjZGVmaW5lIFpNSF9WQwkJMQorI2RlZmluZSBaTUhfREcJCTIKKyNkZWZpbmUgWk1IX0FVVEgJNAorCisvKiBUZXN0aW5nIEFjY2VzcyByaWdodHMgZm9yIG9iamVjdHMgKi8KKworI2RlZmluZSBOSVNfUkVBRF9BQ0MJCTEKKyNkZWZpbmUgTklTX01PRElGWV9BQ0MJCTIKKyNkZWZpbmUgTklTX0NSRUFURV9BQ0MJCTQKKyNkZWZpbmUgTklTX0RFU1RST1lfQUNDCTgKKy8qIFRlc3QgbWFjcm9zLiBhID09IGFjY2VzcyByaWdodHMsIG0gPT0gZGVzaXJlZCByaWdodHMuICovCisjZGVmaW5lIE5JU19XT1JMRChhLCBtKSAgICAgICAgKCgoYSkgJiAobSkpICE9IDApCisjZGVmaW5lIE5JU19HUk9VUChhLCBtKSAgICAgICAgKCgoYSkgJiAoKG0pIDw8IDgpKSAhPSAwKQorI2RlZmluZSBOSVNfT1dORVIoYSwgbSkgICAgICAgICgoKGEpICYgKChtKSA8PCAxNikpICE9IDApCisjZGVmaW5lIE5JU19OT0JPRFkoYSwgbSkgICAgICAgKCgoYSkgJiAoKG0pIDw8IDI0KSkgIT0gMCkKKy8qCisgKiBFT0wgQWxlcnQgLSBUaGUgZm9sbG93aW5nIG5vbi1wcmVmaXhlZCB0ZXN0IG1hY3JvcyBhcmUKKyAqIGhlcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHksIGFuZCB3aWxsIGJlIG5vdCBiZSBwcmVzZW50CisgKiBpbiBmdXR1cmUgcmVsZWFzZXMgLSB1c2UgdGhlIE5JU18qKCkgbWFjcm9zIGFib3ZlLgorICovCisjZGVmaW5lIFdPUkxEKGEsIG0pCSgoKGEpICYgKG0pKSAhPSAwKQorI2RlZmluZSBHUk9VUChhLCBtKQkoKChhKSAmICgobSkgPDwgOCkpICE9IDApCisjZGVmaW5lIE9XTkVSKGEsIG0pCSgoKGEpICYgKChtKSA8PCAxNikpICE9IDApCisjZGVmaW5lIE5PQk9EWShhLCBtKQkoKChhKSAmICgobSkgPDwgMjQpKSAhPSAwKQorCisjZGVmaW5lIE9BVFlQRShkLCBuKSAoKChkKS0+ZG9fYXJtYXNrLmRvX2FybWFza192YWwrbiktPm9hX290eXBlKQorI2RlZmluZSBPQVJJR0hUUyhkLCBuKSAoKChkKS0+ZG9fYXJtYXNrLmRvX2FybWFza192YWwrbiktPm9hX3JpZ2h0cykKKyNkZWZpbmUgV09STERfREVGQVVMVCAoTklTX1JFQURfQUNDKQorI2RlZmluZSBHUk9VUF9ERUZBVUxUIChOSVNfUkVBRF9BQ0MgPDwgOCkKKyNkZWZpbmUgT1dORVJfREVGQVVMVCAoKE5JU19SRUFEX0FDQyArIE5JU19NT0RJRllfQUNDICsgTklTX0NSRUFURV9BQ0MgK1wKKwkJCU5JU19ERVNUUk9ZX0FDQykgPDwgMTYpCisjZGVmaW5lIERFRkFVTFRfUklHSFRTIChXT1JMRF9ERUZBVUxUIHwgR1JPVVBfREVGQVVMVCB8IE9XTkVSX0RFRkFVTFQpCisKKy8qIFJlc3VsdCBtYW5pcHVsYXRpb24gZGVmaW5lcyAuLi4gKi8KKyNkZWZpbmUgTklTX1JFU19OVU1PQkooeCkJKCh4KS0+b2JqZWN0cy5vYmplY3RzX2xlbikKKyNkZWZpbmUgTklTX1JFU19PQkpFQ1QoeCkJKCh4KS0+b2JqZWN0cy5vYmplY3RzX3ZhbCkKKyNkZWZpbmUgTklTX1JFU19DT09LSUUoeCkJKCh4KS0+Y29va2llKQorI2RlZmluZSBOSVNfUkVTX1NUQVRVUyh4KQkoKHgpLT5zdGF0dXMpCisKKy8qIFRoZXNlIGRlZmluZXMgbWFrZSBnZXR0aW5nIGF0IHRoZSB2YXJpYW50IHBhcnQgb2YgdGhlIG9iamVjdCBlYXNpZXIuICovCisjZGVmaW5lIFRBX2RhdGEgem9fZGF0YS5vYmpkYXRhX3UudGFfZGF0YQorI2RlZmluZSBFTl9kYXRhIHpvX2RhdGEub2JqZGF0YV91LmVuX2RhdGEKKyNkZWZpbmUgRElfZGF0YSB6b19kYXRhLm9iamRhdGFfdS5kaV9kYXRhCisjZGVmaW5lIExJX2RhdGEgem9fZGF0YS5vYmpkYXRhX3UubGlfZGF0YQorI2RlZmluZSBHUl9kYXRhIHpvX2RhdGEub2JqZGF0YV91LmdyX2RhdGEKKworI2RlZmluZSBfX3R5cGVfb2YobykgKChvKS0+em9fZGF0YS56b190eXBlKQorCisvKiBEZWNsYXJhdGlvbnMgZm9yIHRoZSBpbnRlcm5hbCBzdWJyb3V0aW5lcyBpbiBuaXNsaWIuYyAqLworZW51bSBuYW1lX3BvcyB7U0FNRV9OQU1FLCBISUdIRVJfTkFNRSwgTE9XRVJfTkFNRSwgTk9UX1NFUVVFTlRJQUwsIEJBRF9OQU1FfTsKK3R5cGVkZWYgZW51bSBuYW1lX3BvcyBuYW1lX3BvczsKKworLyoKKyAqIERlZmluZXMgZm9yIGdldHRpbmcgYXQgY29sdW1uIGRhdGEgaW4gZW50cnkgb2JqZWN0cy4gQmVjYXVzZSBSUENHRU4KKyAqIGdlbmVyYXRlcyBzb21lIHJhdGhlciB3b3JkeSBzdHJ1Y3R1cmVzLCB3ZSBjcmVhdGUgc29tZSBkZWZpbmVzIHRoYXQKKyAqIGNvbGxhcHNlIHRoZSBuZWVkZWQga2V5c3Ryb2tlcyB0byBhY2Nlc3MgYSBwYXJ0aWN1bGFyIHZhbHVlIHVzaW5nCisgKiB0aGVzZSBkZWZpbml0aW9ucyB0aGV5IHRha2UgYW4gbmlzX29iamVjdCAqLCBhbmQgYW4gaW50IGFuZCByZXR1cm4KKyAqIGEgdV9jaGFyICogZm9yIFZhbHVlLCBhbmQgYW4gaW50IGZvciBsZW5ndGguCisgKi8KKyNkZWZpbmUgRU5UUllfVkFMKG9iaiwgY29sKSAob2JqKS0+RU5fZGF0YS5lbl9jb2xzLmVuX2NvbHNfdmFsW2NvbF0uZWNfdmFsdWUuZWNfdmFsdWVfdmFsCisjZGVmaW5lIEVOVFJZX0xFTihvYmosIGNvbCkgKG9iaiktPkVOX2RhdGEuZW5fY29scy5lbl9jb2xzX3ZhbFtjb2xdLmVjX3ZhbHVlLmVjX3ZhbHVlX2xlbgorCisKKy8qIFByb3RvdHlwZXMsIGFuZCBleHRlcm4gZGVjbGFyYXRpb25zIGZvciB0aGUgTklTIGxpYnJhcnkgZnVuY3Rpb25zLiAqLworI2luY2x1ZGUgPHJwY3N2Yy9uaXNsaWIuaD4KKyNlbmRpZgorCisvKgorICogbmlzXzMuaAorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyB0aGF0IGFyZSBvbmx5IG9mIGludGVyZXN0IHRvIHRoZSBhY3R1YWwKKyAqIHNlcnZpY2UgZGFlbW9uIGFuZCBjbGllbnQgc3R1YnMuIE5vcm1hbCB1c2VycyBvZiBOSVMgd2lsbCBub3QgaW5jbHVkZQorICogdGhpcyBmaWxlLgorICoKKyAqIE5PVEUgOiBUaGlzIGluY2x1ZGUgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgYSBjb21iaW5hdGlvbgorICogb2YgcnBjZ2VuIGFuZCBzZWQuIERPIE5PVCBFRElUIElULCBjaGFuZ2UgdGhlIG5pcy54IGZpbGUgaW5zdGVhZAorICogYW5kIHRoZW4gcmVtYWtlIHRoaXMgZmlsZS4KKyAqLworI2lmbmRlZiBfX25pc18zX2gKKyNkZWZpbmUgX19uaXNfM19oCisKKyNkZWZpbmUgTklTX1BST0cgMTAwMzAwCisjZGVmaW5lIE5JU19WRVJTSU9OIDMKKworI2RlZmluZSBOSVNfTE9PS1VQIDEKK2V4dGVybiAgbmlzX3Jlc3VsdCAqIG5pc19sb29rdXBfMyAobnNfcmVxdWVzdCAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgbmlzX3Jlc3VsdCAqIG5pc19sb29rdXBfM19zdmMgKG5zX3JlcXVlc3QgKiwgc3RydWN0IHN2Y19yZXEgKikgX19USFJPVzsKKyNkZWZpbmUgTklTX0FERCAyCitleHRlcm4gIG5pc19yZXN1bHQgKiBuaXNfYWRkXzMgKG5zX3JlcXVlc3QgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIG5pc19yZXN1bHQgKiBuaXNfYWRkXzNfc3ZjIChuc19yZXF1ZXN0ICosIHN0cnVjdCBzdmNfcmVxICopIF9fVEhST1c7CisjZGVmaW5lIE5JU19NT0RJRlkgMworZXh0ZXJuICBuaXNfcmVzdWx0ICogbmlzX21vZGlmeV8zIChuc19yZXF1ZXN0ICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBuaXNfcmVzdWx0ICogbmlzX21vZGlmeV8zX3N2YyAobnNfcmVxdWVzdCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworI2RlZmluZSBOSVNfUkVNT1ZFIDQKK2V4dGVybiAgbmlzX3Jlc3VsdCAqIG5pc19yZW1vdmVfMyAobnNfcmVxdWVzdCAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgbmlzX3Jlc3VsdCAqIG5pc19yZW1vdmVfM19zdmMgKG5zX3JlcXVlc3QgKiwgc3RydWN0IHN2Y19yZXEgKikgX19USFJPVzsKKyNkZWZpbmUgTklTX0lCTElTVCA1CitleHRlcm4gIG5pc19yZXN1bHQgKiBuaXNfaWJsaXN0XzMgKGliX3JlcXVlc3QgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIG5pc19yZXN1bHQgKiBuaXNfaWJsaXN0XzNfc3ZjIChpYl9yZXF1ZXN0ICosIHN0cnVjdCBzdmNfcmVxICopIF9fVEhST1c7CisjZGVmaW5lIE5JU19JQkFERCA2CitleHRlcm4gIG5pc19yZXN1bHQgKiBuaXNfaWJhZGRfMyAoaWJfcmVxdWVzdCAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgbmlzX3Jlc3VsdCAqIG5pc19pYmFkZF8zX3N2YyAoaWJfcmVxdWVzdCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworI2RlZmluZSBOSVNfSUJNT0RJRlkgNworZXh0ZXJuICBuaXNfcmVzdWx0ICogbmlzX2libW9kaWZ5XzMgKGliX3JlcXVlc3QgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIG5pc19yZXN1bHQgKiBuaXNfaWJtb2RpZnlfM19zdmMgKGliX3JlcXVlc3QgKiwgc3RydWN0IHN2Y19yZXEgKikKKyAgICAgX19USFJPVzsKKyNkZWZpbmUgTklTX0lCUkVNT1ZFIDgKK2V4dGVybiAgbmlzX3Jlc3VsdCAqIG5pc19pYnJlbW92ZV8zIChpYl9yZXF1ZXN0ICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBuaXNfcmVzdWx0ICogbmlzX2licmVtb3ZlXzNfc3ZjIChpYl9yZXF1ZXN0ICosIHN0cnVjdCBzdmNfcmVxICopCisgICAgIF9fVEhST1c7CisjZGVmaW5lIE5JU19JQkZJUlNUIDkKK2V4dGVybiAgbmlzX3Jlc3VsdCAqIG5pc19pYmZpcnN0XzMgKGliX3JlcXVlc3QgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIG5pc19yZXN1bHQgKiBuaXNfaWJmaXJzdF8zX3N2YyAoaWJfcmVxdWVzdCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKQorICAgICBfX1RIUk9XOworI2RlZmluZSBOSVNfSUJORVhUIDEwCitleHRlcm4gIG5pc19yZXN1bHQgKiBuaXNfaWJuZXh0XzMgKGliX3JlcXVlc3QgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIG5pc19yZXN1bHQgKiBuaXNfaWJuZXh0XzNfc3ZjIChpYl9yZXF1ZXN0ICosIHN0cnVjdCBzdmNfcmVxICopIF9fVEhST1c7CisjZGVmaW5lIE5JU19GSU5ERElSRUNUT1JZIDEyCitleHRlcm4gIGZkX3Jlc3VsdCAqIG5pc19maW5kZGlyZWN0b3J5XzMgKGZkX2FyZ3MgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIGZkX3Jlc3VsdCAqIG5pc19maW5kZGlyZWN0b3J5XzNfc3ZjIChmZF9hcmdzICosCisJCQkJCSAgICAgc3RydWN0IHN2Y19yZXEgKikgX19USFJPVzsKKyNkZWZpbmUgTklTX1NUQVRVUyAxNAorZXh0ZXJuICBuaXNfdGFnbGlzdCAqIG5pc19zdGF0dXNfMyAobmlzX3RhZ2xpc3QgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIG5pc190YWdsaXN0ICogbmlzX3N0YXR1c18zX3N2YyAobmlzX3RhZ2xpc3QgKiwgc3RydWN0IHN2Y19yZXEgKikKKyAgICAgX19USFJPVzsKKyNkZWZpbmUgTklTX0RVTVBMT0cgMTUKK2V4dGVybiAgbG9nX3Jlc3VsdCAqIG5pc19kdW1wbG9nXzMgKGR1bXBfYXJncyAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgbG9nX3Jlc3VsdCAqIG5pc19kdW1wbG9nXzNfc3ZjIChkdW1wX2FyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKikgX19USFJPVzsKKyNkZWZpbmUgTklTX0RVTVAgMTYKK2V4dGVybiAgbG9nX3Jlc3VsdCAqIG5pc19kdW1wXzMgKGR1bXBfYXJncyAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgbG9nX3Jlc3VsdCAqIG5pc19kdW1wXzNfc3ZjIChkdW1wX2FyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKikgX19USFJPVzsKKyNkZWZpbmUgTklTX0NBTExCQUNLIDE3CitleHRlcm4gIGJvb2xfdCAqIG5pc19jYWxsYmFja18zIChuZXRvYmogKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIGJvb2xfdCAqIG5pc19jYWxsYmFja18zX3N2YyAobmV0b2JqICosIHN0cnVjdCBzdmNfcmVxICopIF9fVEhST1c7CisjZGVmaW5lIE5JU19DUFRJTUUgMTgKK2V4dGVybiAgdWludDMyX3QgKiBuaXNfY3B0aW1lXzMgKG5pc19uYW1lICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICB1aW50MzJfdCAqIG5pc19jcHRpbWVfM19zdmMgKG5pc19uYW1lICosIHN0cnVjdCBzdmNfcmVxICopIF9fVEhST1c7CisjZGVmaW5lIE5JU19DSEVDS1BPSU5UIDE5CitleHRlcm4gIGNwX3Jlc3VsdCAqIG5pc19jaGVja3BvaW50XzMgKG5pc19uYW1lICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBjcF9yZXN1bHQgKiBuaXNfY2hlY2twb2ludF8zX3N2YyAobmlzX25hbWUgKiwgc3RydWN0IHN2Y19yZXEgKikKKyAgICAgX19USFJPVzsKKyNkZWZpbmUgTklTX1BJTkcgMjAKK2V4dGVybiAgdm9pZCAqIG5pc19waW5nXzMgKHBpbmdfYXJncyAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgdm9pZCAqIG5pc19waW5nXzNfc3ZjIChwaW5nX2FyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKikgX19USFJPVzsKKyNkZWZpbmUgTklTX1NFUlZTVEFURSAyMQorZXh0ZXJuICBuaXNfdGFnbGlzdCAqIG5pc19zZXJ2c3RhdGVfMyAobmlzX3RhZ2xpc3QgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIG5pc190YWdsaXN0ICogbmlzX3NlcnZzdGF0ZV8zX3N2YyAobmlzX3RhZ2xpc3QgKiwKKwkJCQkJICAgc3RydWN0IHN2Y19yZXEgKikgX19USFJPVzsKKyNkZWZpbmUgTklTX01LRElSIDIyCitleHRlcm4gIG5pc19lcnJvciAqIG5pc19ta2Rpcl8zIChuaXNfbmFtZSAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgbmlzX2Vycm9yICogbmlzX21rZGlyXzNfc3ZjIChuaXNfbmFtZSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworI2RlZmluZSBOSVNfUk1ESVIgMjMKK2V4dGVybiAgbmlzX2Vycm9yICogbmlzX3JtZGlyXzMgKG5pc19uYW1lICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBuaXNfZXJyb3IgKiBuaXNfcm1kaXJfM19zdmMgKG5pc19uYW1lICosIHN0cnVjdCBzdmNfcmVxICopIF9fVEhST1c7CisjZGVmaW5lIE5JU19VUERLRVlTIDI0CitleHRlcm4gIG5pc19lcnJvciAqIG5pc191cGRrZXlzXzMgKG5pc19uYW1lICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBuaXNfZXJyb3IgKiBuaXNfdXBka2V5c18zX3N2YyAobmlzX25hbWUgKiwgc3RydWN0IHN2Y19yZXEgKikgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qICEgX1JQQ1NWQ19OSVNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzLnggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uaXMueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzE4YWYyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzLngKQEAgLTAsMCArMSw0NzQgQEAKKyUvKgorJSAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyUgKgorJSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorJSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyUgKiBtZXQ6CislICoKKyUgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorJSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyUgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCislICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyUgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyUgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCislICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworJSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorJSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyUgKgorJSAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworJSAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyUgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCislICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorJSAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorJSAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorJSAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyUgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyUgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorJSAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCislICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCislICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorJSAqLworCisjaWZkZWYgUlBDX0hEUgorJS8qCislICoJbmlzLmgKKyUgKgorJSAqCVRoaXMgZmlsZSBpcyB0aGUgbWFpbiBpbmNsdWRlIGZpbGUgZm9yIE5JUyBjbGllbnRzLiBJdCBjb250YWlucworJSAqCWJvdGggdGhlIGNsaWVudCBsaWJyYXJ5IGZ1bmN0aW9uIGRlZmluZXMgYW5kIHRoZSB2YXJpb3VzIGRhdGEKKyUgKglzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhlIE5JUyBzZXJ2aWNlLiBJdCBpbmNsdWRlcyB0aGUgZmlsZSBuaXNfdGFncy5oCislICoJd2hpY2ggZGVmaW5lcyB0aGUgdGFnIHZhbHVlcy4gVGhpcyBhbGxvd3MgdGhlIHRhZ3MgdG8gY2hhbmdlIHdpdGhvdXQKKyUgKgloYXZpbmcgdG8gY2hhbmdlIHRoZSBuaXMueCBmaWxlLgorJSAqCislICoJTk9URSA6IERPIE5PVCBFRElUIFRISVMgRklMRSEgSXQgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgd2hlbgorJSAqCSAgICAgICBycGNnZW4gaXMgcnVuIG9uIHRoZSBuaXMueCBmaWxlLiBOb3RlIHRoYXQgdGhlcmUgaXMgYQorJSAqCSAgICAgICBzaW1wbGUgc2VkIHNjcmlwdCB0byByZW1vdmUgc29tZSB1bm5lZWRlZCBsaW5lcy4gKFNlZSB0aGUKKyUgKgkgICAgICAgTWFrZWZpbGUgdGFyZ2V0IG5pcy5oKQorJSAqCislICovCislI2luY2x1ZGUgPHJwY3N2Yy9uaXNfdGFncy5oPgorI2VuZGlmCisKKy8qIFRoaXMgZ2V0cyBzdHVmZmVkIGludG8gdGhlIHNvdXJjZSBmaWxlcy4gKi8KKyNpZiBSUENfSERSCislI2luY2x1ZGUgPHJwYy94ZHIuaD4KKyNlbmRpZgorCisvKiBJbmNsdWRlIHRoZSBSUEMgTGFuZ3VhZ2UgZGVzY3JpcHRpb24gb2YgTklTIG9iamVjdHMgKi8KKyNpbmNsdWRlICJuaXNfb2JqZWN0LngiCisKKy8qIEVycm9ycyAgdGhhdCBjYW4gYmUgcmV0dXJuZWQgYnkgdGhlIHNlcnZpY2UgKi8KK2VudW0gbmlzX2Vycm9yIHsKKwlOSVNfU1VDQ0VTUyA9IDAsCS8qIEEtb2ssIGxldCdzIHJvY2sgbiByb2xsCSovCisJTklTX1NfU1VDQ0VTUyA9IDEsCS8qIE5hbWUgZm91bmQgKG1heWJlKQkJKi8KKwlOSVNfTk9URk9VTkQgPSAyLAkvKiBOYW1lIGRlZmluaXRlbHkgbm90IGZvdW5kCSovCisJTklTX1NfTk9URk9VTkQgPSAzLAkvKiBOYW1lIG1heWJlIG5vdCBmb3VuZAkJKi8KKwlOSVNfQ0FDSEVFWFBJUkVEID0gNCwJLyogTmFtZSBleGlzdHMgYnV0IGNhY2hlIG91dCBvZiBkYXRlICovCisJTklTX05BTUVVTlJFQUNIQUJMRSA9IDUsIC8qIENhbid0IGdldCB0aGVyZSBmcm9tIGhlcmUgKi8KKwlOSVNfVU5LTk9XTk9CSiA9IDYsCS8qIE9iamVjdCB0eXBlIGlzIGJvZ3VzICovCisJTklTX1RSWUFHQUlOID0gNywJLyogSSdtIGJ1c3ksIGNhbGwgYmFjayAqLworCU5JU19TWVNURU1FUlJPUiA9IDgsCS8qIEdlbmVyaWMgc3lzdGVtIGVycm9yICovCisJTklTX0NIQUlOQlJPS0VOID0gOSwJLyogRmlyc3QvTmV4dCB3YXJuaW5nICovCisJTklTX1BFUk1JU1NJT04gPSAxMCwJLyogTm90IGVub3VnaCBwZXJtaXNzaW9uIHRvIGFjY2VzcyAqLworCU5JU19OT1RPV05FUiA9IDExLAkvKiBZb3UgZG9uJ3Qgb3duIGl0LCBzb3JyeSAqLworCU5JU19OT1RfTUUgPSAxMiwJLyogSSBkb24ndCBzZXJ2ZSB0aGlzIG5hbWUgKi8KKwlOSVNfTk9NRU1PUlkgPSAxMywJLyogT3V0dGEgVk0hIEhlbHAhICovCisJTklTX05BTUVFWElTVFMgPSAxNCwJLyogQ2FuJ3QgY3JlYXRlIG92ZXIgYW5vdGhlciBuYW1lICovCisJTklTX05PVE1BU1RFUiA9IDE1LAkvKiBJJ20ganVzdGEgc2Vjb25kYXJheSwgZG9uJ3QgYXNrIG1lICovCisJTklTX0lOVkFMSURPQkogPSAxNiwJLyogT2JqZWN0IGlzIGJyb2tlbiBzb21laG93ICovCisJTklTX0JBRE5BTUUgPSAxNywJLyogVW5wYXJzYWJsZSBuYW1lICovCisJTklTX05PQ0FMTEJBQ0sgPSAxOCwJLyogQ291bGRuJ3QgdGFsayB0byBjYWxsIGJhY2sgcHJvYyAqLworCU5JU19DQlJFU1VMVFMgPSAxOSwJLyogUmVzdWx0cyBiZWluZyBjYWxsZWQgYmFjayB0byB5b3UgKi8KKwlOSVNfTk9TVUNITkFNRSA9IDIwLAkvKiBOYW1lIHVua25vd24gKi8KKwlOSVNfTk9UVU5JUVVFID0gMjEsCS8qIFZhbHVlIGlzIG5vdCB1bmlxdWVzIChlbnRyeSkgKi8KKwlOSVNfSUJNT0RFUlJPUiA9IDIyLAkvKiBJbmYuIEJhc2UuIE1vZGlmeSBlcnJvci4gKi8KKwlOSVNfTk9TVUNIVEFCTEUgPSAyMywJLyogTmFtZSBmb3IgdGFibGUgd2FzIHdyb25nICovCisJTklTX1RZUEVNSVNNQVRDSCA9IDI0LAkvKiBFbnRyeSBhbmQgdGFibGUgdHlwZSBtaXNtYXRjaCAqLworCU5JU19MSU5LTkFNRUVSUk9SID0gMjUsCS8qIExpbmsgcG9pbnRzIHRvIGJvZ3VzIG5hbWUgKi8KKwlOSVNfUEFSVElBTCA9IDI2LAkvKiBQYXJ0aWFsIHN1Y2Nlc3MsIGZvdW5kIHRhYmxlICovCisJTklTX1RPT01BTllBVFRSUyA9IDI3LAkvKiBUb28gbWFueSBhdHRyaWJ1dGVzICovCisJTklTX1JQQ0VSUk9SID0gMjgsCS8qIFJQQyBlcnJvciBlbmNvdW50ZXJlZCAqLworCU5JU19CQURBVFRSSUJVVEUgPSAyOSwJLyogQmFkIG9yIGludmFsaWQgYXR0cmlidXRlICovCisJTklTX05PVFNFQVJDSEFCTEUgPSAzMCwJLyogTm9uLXNlYXJjaGFibGUgb2JqZWN0IHNlYXJjaGVkICovCisJTklTX0NCRVJST1IgPSAzMSwJLyogRXJyb3IgZHVyaW5nIGNhbGxiYWNrIChzdmMgY3Jhc2gpICovCisJTklTX0ZPUkVJR05OUyA9IDMyLAkvKiBGb3JlaWduIE5hbWVzcGFjZSAqLworCU5JU19CQURPQkpFQ1QgPSAzMywJLyogTWFsZm9ybWVkIG9iamVjdCBzdHJ1Y3R1cmUgKi8KKwlOSVNfTk9UU0FNRU9CSiA9IDM0LAkvKiBPYmplY3Qgc3dhcHBlZCBkdXJpbmcgZGVsZXRpb24gKi8KKwlOSVNfTU9ERkFJTCA9IDM1LAkvKiBGYWlsdXJlIGR1cmluZyBhIE1vZGlmeS4gKi8KKwlOSVNfQkFEUkVRVUVTVCA9IDM2LAkvKiBJbGxlZ2FsIHF1ZXJ5IGZvciB0YWJsZSAqLworCU5JU19OT1RFTVBUWSA9IDM3LAkvKiBBdHRlbXB0IHRvIHJlbW92ZSBhIG5vbi1lbXB0eSB0YmwgKi8KKwlOSVNfQ09MRFNUQVJUX0VSUiA9IDM4LCAvKiBFcnJvciBhY2Nlc2luZyB0aGUgY29sZCBzdGFydCBmaWxlICovCisJTklTX1JFU1lOQyA9IDM5LAkvKiBUcmFuc2FjdGlvbiBsb2cgdG9vIGZhciBvdXQgb2YgZGF0ZSAqLworCU5JU19GQUlMID0gNDAsCQkvKiBOSVMgb3BlcmF0aW9uIGZhaWxlZC4gKi8KKwlOSVNfVU5BVkFJTCA9IDQxLAkvKiBOSVMrIHNlcnZpY2UgaXMgdW5hdmFpbGFibGUgKGNsaWVudCkgKi8KKwlOSVNfUkVTMkJJRyA9IDQyLAkvKiBOSVMrIHJlc3VsdCB0b28gYmlnIGZvciBkYXRhZ3JhbSAqLworCU5JU19TUlZBVVRIID0gNDMsCS8qIE5JUysgc2VydmVyIHdhc24ndCBhdXRoZW50aWNhdGVkLiAqLworCU5JU19DTE5UQVVUSCA9IDQ0LAkvKiBOSVMrIENsaWVudCB3YXNuJ3QgYXV0aGVudGljYXRlZC4gKi8KKwlOSVNfTk9GSUxFU1BBQ0UgPSA0NSwJLyogTklTKyBzZXJ2ZXIgcmFuIG91dCBvZiBkaXNrIHNwYWNlICovCisJTklTX05PUFJPQyA9IDQ2LAkvKiBOSVMrIHNlcnZlciBjb3VsZG4ndCBjcmVhdGUgbmV3IHByb2MgKi8KKwlOSVNfRFVNUExBVEVSID0gNDcJLyogTklTKyBzZXJ2ZXIgYWxyZWFkeSBoYXMgZHVtcCBjaGlsZCAqLworfTsKKworCisvKgorICogU3RydWN0dXJlIGRlZmluaXRpb25zIGZvciB0aGUgcGFyYW1ldGVycyBhbmQgcmVzdWx0cyBvZiB0aGUgYWN0dWFsCisgKiBOSVMgUlBDIGNhbGxzLgorICoKKyAqIFRoaXMgaXMgdGhlIHN0YW5kYXJkIHJlc3VsdCAoaW4gdGhlIHByb3RvY29sKSBvZiBtb3N0IG9mIHRoZSBuaXMKKyAqIHJlcXVlc3RzLgorICovCisKK3N0cnVjdCBuaXNfcmVzdWx0IHsKKwluaXNfZXJyb3IJc3RhdHVzOwkJLyogU3RhdHVzIG9mIHRoZSByZXNwb25zZSAqLworCW5pc19vYmplY3QJb2JqZWN0czw+OwkvKiBvYmplY3RzIGZvdW5kCSAgKi8KKwluZXRvYmoJCWNvb2tpZTsJCS8qIENvb2tpZSBEYXRhCQkgICovCisJdWludDMyX3QJenRpY2tzOwkJLyogc2VydmVyIHRpY2tzCQkgICovCisJdWludDMyX3QJZHRpY2tzOwkJLyogREJNIHRpY2tzLgkJICAqLworCXVpbnQzMl90CWF0aWNrczsJCS8qIENhY2hlIChhY2NlbCkgdGlja3MJICAqLworCXVpbnQzMl90CWN0aWNrczsJCS8qIENsaWVudCB0aWNrcwkJICAqLworfTsKKworLyoKKyAqIEEgTmFtZSBTZXJ2aWNlIHJlcXVlc3QKKyAqIFRoaXMgcmVxdWVzdCBpcyB1c2VkIHRvIGFjY2VzcyB0aGUgbmFtZSBzcGFjZSwgbnNfbmFtZSBpcyB0aGUgbmFtZQorICogb2YgdGhlIG9iamVjdCB3aXRoaW4gdGhlIG5hbWVzcGFjZSBhbmQgdGhlIG9iamVjdCBpcyBpdCdzIHZhbHVlLCBmb3IKKyAqIGFkZC9tb2RpZnksIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgZm9yIHJlbW92ZS4KKyAqLworCitzdHJ1Y3QgbnNfcmVxdWVzdCB7CisJbmlzX25hbWUJbnNfbmFtZTsJLyogTmFtZSBpbiB0aGUgTklTIG5hbWUgc3BhY2UJKi8KKwluaXNfb2JqZWN0CW5zX29iamVjdDwxPjsJLyogT3B0aW9uYWwgT2JqZWN0IChhZGQvcmVtb3ZlKQkqLworfTsKKworLyoKKyAqIEFuIGluZm9ybWF0aW9uIGJhc2UgcmVxdWVzdAorICogVGhpcyByZXF1ZXN0IGluY2x1ZGVzIHRoZSBOSVMgbmFtZSBvZiB0aGUgdGFibGUgd2Ugd2lzaCB0byBzZWFyY2gsIHRoZQorICogc2VhcmNoIGNyaXRlcmlhIGluIHRoZSBmb3JtIG9mIGF0dHJpYnV0ZS92YWx1ZSBwYWlycyBhbmQgYW4gb3B0aW9uYWwKKyAqIGNhbGxiYWNrIHByb2dyYW0gbnVtYmVyLiBJZiB0aGUgY2FsbGJhY2sgcHJvZ3JhbSBudW1iZXIgaXMgcHJvdmlkZWQKKyAqIHRoZSBzZXJ2ZXIgd2lsbCBzZW5kIGJhY2sgb2JqZWN0cyBvbmUgYXQgYSB0aW1lLCBvdGhlcndpc2UgaXQgd2lsbAorICogcmV0dXJuIHRoZW0gYWxsIGluIHRoZSByZXNwb25zZS4KKyAqLworCitzdHJ1Y3QgaWJfcmVxdWVzdCB7CisJbmlzX25hbWUJaWJyX25hbWU7CS8qIFRoZSBuYW1lIG9mIHRoZSBUYWJsZQkqLworCW5pc19hdHRyCWlicl9zcmNoPD47CS8qIFRoZSBzZWFyY2ggY3JpdGVyZWlhCQkqLworCXVpbnQzMl90CWlicl9mbGFnczsJLyogT3B0aW9uYWwgZmxhZ3MJCSovCisJbmlzX29iamVjdAlpYnJfb2JqPDE+OwkvKiBvcHRpb25hbCBvYmplY3QgKGFkZC9tb2RpZnkpICovCisJbmlzX3NlcnZlcglpYnJfY2Job3N0PDE+OwkvKiBPcHRpb25hbCBjYWxsYmFjayBpbmZvCSovCisJdV9pbnQJCWlicl9idWZzaXplOwkvKiBPcHRpb25hbCBmaXJzdC9uZXh0IGJ1ZnNpemUJKi8KKwluZXRvYmoJCWlicl9jb29raWU7CS8qIFRoZSBmaXJzdC9uZXh0IGNvb2tpZQkqLworfTsKKworLyoKKyAqIFRoaXMgYXJndW1lbnQgdG8gdGhlIFBJTkcgY2FsbCBub3RpZmllcyB0aGUgcmVwbGljYXMgdGhhdCBzb21ldGhpbmcgaW4KKyAqIGEgZGlyZWN0b3J5IGhhcyBjaGFuZ2VkIGFuZCB0aGlzIGlzIGl0J3MgdGltZXN0YW1wLiBUaGUgcmVwbGljYSB3aWxsIHVzZQorICogdGhlIHRpbWVzdGFtcCB0byBkZXRlcm1pbmUgaWYgaXRzIHJlc3luYyBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK3N0cnVjdCBwaW5nX2FyZ3MgeworCW5pc19uYW1lCWRpcjsJLyogRGlyZWN0b3J5IHRoYXQgaGFkIHRoZSBjaGFuZ2UgKi8KKwl1aW50MzJfdAlzdGFtcDsJLyogdGltZXN0YW1wIG9mIHRoZSB0cmFuc2FjdGlvbiAgKi8KK307CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHR5cGUgb2YgZW50cmllcyB0aGF0IGFyZSBzdG9yZWQgaW4gdGhlIHRyYW5zYWN0aW9uIGxvZywKKyAqIG5vdGUgdGhhdCBtb2RpZmljYXRpb25zIHdpbGwgYXBwZWFyIGFzIHR3byBlbnRyaWVzLCBmb3IgbmFtZXMsIHRoZXkgaGF2ZQorICogYSAiT0xEIiBlbnRyeSBmb2xsb3dlZCBieSBhICJORVciIGVudHJ5LiBGb3IgZW50cmllcyBpbiB0YWJsZXMsIHRoZXJlCisgKiBpcyBhIHJlbW92ZSBmb2xsb3dlZCBieSBhbiBhZGQuIEl0IGlzIGRvbmUgdGhpcyB3YXkgc28gdGhhdCB3ZSBjYW4gcmVhZAorICogdGhlIGxvZyBiYWNrd2FyZHMgdG8gYmFjayBvdXQgdHJhbnNhY3Rpb25zIGFuZCBmb3J3YXJkcyB0byBwcm9wb2dhdGUKKyAqIHVwZGF0ZWQuCisgKi8KK2VudW0gbG9nX2VudHJ5X3QgeworCUxPR19OT1AgPSAwLAorCUFERF9OQU1FID0gMSwJCS8qIE5hbWUgQWRkZWQgdG8gbmFtZSBzcGFjZQkJICAqLworCVJFTV9OQU1FID0gMiwJCS8qIE5hbWUgcmVtb3ZlZCBmcm9tIG5hbWUgc3BhY2UJCSAgKi8KKwlNT0RfTkFNRV9PTEQgPSAzLAkvKiBOYW1lIHdhcyBtb2RpZmllZCBpbiB0aGUgbmFtZSBzcGFjZQkgICovCisJTU9EX05BTUVfTkVXID0gNCwJLyogTmFtZSB3YXMgbW9kaWZpZWQgaW4gdGhlIG5hbWUgc3BhY2UJICAqLworCUFERF9JQkFTRSA9IDUsCQkvKiBFbnRyeSBhZGRlZCB0byBpbmZvcm1hdGlvbiBiYXNlCSAgKi8KKwlSRU1fSUJBU0UgPSA2LAkJLyogRW50cnkgcmVtb3ZlZCBmcm9tIGluZm9ybWF0aW9uIGJhc2UgICAgKi8KKwlNT0RfSUJBU0UgPSA3LAkJLyogRW50cnkgd2FzIG1vZGlmaWVkIGluIGluZm9ybWF0aW9uIGJhc2UgKi8KKwlVUERfU1RBTVAgPSA4CQkvKiBVcGRhdGUgdGltZXN0YW1wICh1c2VkIGFzIGZlbmNlcG9zdHMpICAqLworfTsKKworLyoKKyAqIFRoaXMgcmVzdWx0IGlzIHJldHVybmVkIGZyb20gdGhlIG5hbWUgc2VydmljZSB3aGVuIGl0IGlzIHJlcXVlc3RlZCB0bworICogZHVtcCBsb2dnZWQgZW50cmllcyBmcm9tIGl0cyB0cmFuc2FjdGlvbiBsb2cuIEluZm9ybWF0aW9uIGJhc2UgdXBkYXRlcworICogd2lsbCBoYXZlIHRoZSBuYW1lIG9mIHRoZSBpbmZvcm1hdGlvbiBiYXNlIGluIHRoZSBsZV9uYW1lIGZpZWxkIGFuZAorICogYSBjYW5vbmljYWwgc2V0IG9mIGF0dHJpYnV0ZS92YWx1ZSBwYWlycyB0byBmdWxseSBzcGVjaWZ5IHRoZSBlbnRyeSdzCisgKiAnbmFtZScuCisgKi8KK3N0cnVjdCBsb2dfZW50cnkgeworCXVpbnQzMl90CWxlX3RpbWU7CS8qIFRpbWUgaW4gc2Vjb25kcwkJKi8KKwlsb2dfZW50cnlfdAlsZV90eXBlOwkvKiBUeXBlIG9mIGxvZyBlbnRyeQkJKi8KKwluaXNfbmFtZQlsZV9wcmluY3A7CS8qIFByaW5jaXBhbCBtYWtpbmcgdGhlIGNoYW5nZQkqLworCW5pc19uYW1lCWxlX25hbWU7CS8qIE5hbWUgb2YgdGFibGUvZGlyIGludm9sdmVkCSovCisJbmlzX2F0dHIJbGVfYXR0cnM8PjsJLyogTGlzdCBvZiBBViBwYWlycy4JCSovCisJbmlzX29iamVjdAlsZV9vYmplY3Q7CS8qIEFjdHVhbCBvYmplY3QgdmFsdWUJCSovCit9OworCitzdHJ1Y3QgbG9nX3Jlc3VsdCB7CisJbmlzX2Vycm9yCWxyX3N0YXR1czsJLyogVGhlIHN0YXR1cyBpdHNlbGYJCSovCisJbmV0b2JqCQlscl9jb29raWU7CS8qIFVzZWQgYnkgdGhlIGR1bXAgY2FsbGJhY2sJKi8KKwlsb2dfZW50cnkJbHJfZW50cmllczw+OwkvKiB6ZXJvIG9yIG1vcmUgZW50cmllcwkqLworfTsKKworc3RydWN0IGNwX3Jlc3VsdCB7CisJbmlzX2Vycm9yCWNwX3N0YXR1czsJLyogU3RhdHVzIG9mIHRoZSBjaGVja3BvaW50CSovCisJdWludDMyX3QJY3BfenRpY2tzOwkvKiBTZXJ2aWNlICd0aWNrcycJCSovCisJdWludDMyX3QJY3BfZHRpY2tzOwkvKiBEYXRhYmFzZSAndGlja3MnCQkqLworfTsKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBnZW5lcmljIE5JUyB0YWcgbGlzdC4gVGhlIHRhZ2xpc3QgY29udGFpbnMKKyAqIHplcm8gb3IgdGFncywgZWFjaCBvZiB3aGljaCBpcyBhIHR5cGUgYW5kIGEgdmFsdWUuICh1X2ludCkuCisgKiBUaGVzZSBhcmUgdXNlZCB0byByZXBvcnQgc3RhdGlzdGljcyAoc2VlIHRhZyBkZWZpbml0aW9ucyBiZWxvdykKKyAqIGFuZCB0byBzZXQgb3IgcmVzZXQgc3RhdGUgdmFyaWFibGVzLgorICovCitzdHJ1Y3QgbmlzX3RhZyB7CisJdWludDMyX3QJdGFnX3R5cGU7CS8qIFN0YXRpc3RpYyB0YWcgKG1heSB2YXJ5KQkgKi8KKwlzdHJpbmcJCXRhZ192YWw8PjsJLyogU3RhdGlzdGljIHZhbHVlIG1heSBhbHNvIHZhcnkgKi8KK307CisKK3N0cnVjdCBuaXNfdGFnbGlzdCB7CisJbmlzX3RhZyB0YWdzPD47CQkJLyogTGlzdCBvZiB0YWdzICovCit9OworCitzdHJ1Y3QgZHVtcF9hcmdzIHsKKwluaXNfbmFtZQlkYV9kaXI7CQkvKiBEaXJlY3RvcnkgdG8gZHVtcAkqLworCXVpbnQzMl90CWRhX3RpbWU7CS8qIEZyb20gdGhpcyB0aW1lc3RhbXAJKi8KKwluaXNfc2VydmVyCWRhX2NiaG9zdDwxPjsJLyogQ2FsbGJhY2sgdG8gdXNlLgkqLworfTsKKworc3RydWN0IGZkX2FyZ3MgeworCW5pc19uYW1lCWRpcl9uYW1lOyAgLyogVGhlIGRpcmVjdG9yeSB3ZSdyZSBsb29raW5nIGZvciAqLworCW5pc19uYW1lCXJlcXVlc3RlcjsgLyogSG9zdCBwcmluY2lwYWwgbmFtZSBmb3Igc2lnbmF0dXJlICovCit9OworCitzdHJ1Y3QgZmRfcmVzdWx0IHsKKwluaXNfZXJyb3IJc3RhdHVzOwkJLyogU3RhdHVzIHJldHVybmVkIGJ5IGZ1bmN0aW9uCSovCisJbmlzX25hbWUJc291cmNlOwkJLyogU291cmNlIG9mIHRoaXMgYW5zd2VyCSovCisJb3BhcXVlCQlkaXJfZGF0YTw+OwkvKiBEaXJlY3RvcnkgRGF0YSAoWERSJ2VkKQkqLworCW9wYXF1ZQkJc2lnbmF0dXJlPD47CS8qIFNpZ25hdHVyZSBvZiB0aGUgc291cmNlCSovCit9OworCislLyoKKyUgKiBTdHJ1Y3R1cmVzIHVzZWQgZm9yIHNlcnZlciBiaW5kaW5nLgorJSAqLworc3RydWN0IG5pc19ib3VuZF9lbmRwb2ludCB7CisJZW5kcG9pbnQgZXA7CisJaW50IGdlbmVyYXRpb247CisJaW50IHJhbms7CisJdWludDMyX3QgZmxhZ3M7CisJaW50IGhvc3RudW07CisJaW50IGVwbnVtOworCW5pc19uYW1lIHVhZGRyOworCWVuZHBvaW50IGNiZXA7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmlzX2JvdW5kX2VuZHBvaW50IG5pc19ib3VuZF9lbmRwb2ludDsKKworc3RydWN0IG5pc19ib3VuZF9kaXJlY3RvcnkgeworCWludCBnZW5lcmF0aW9uOworCWludCBtaW5fcmFuazsgICAgICAgICAgIC8qIG1pbmltdW0gcmFuayBvZiBib3VuZCBlbmRwb2ludHMgKi8KKwlpbnQgb3B0aW1hbF9yYW5rOyAgICAgICAvKiBiZXN0IHBvc3NpYmxlIHJhbmsgb2YgYWxsIGVuZHBvaW50cyAqLworCWRpcmVjdG9yeV9vYmogZG9iajsKKwluaXNfYm91bmRfZW5kcG9pbnQgQkVQPD47Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmlzX2JvdW5kX2RpcmVjdG9yeSBuaXNfYm91bmRfZGlyZWN0b3J5OworJSNkZWZpbmUgYmVwX2xlbiBCRVAuQkVQX2xlbgorJSNkZWZpbmUgYmVwX3ZhbCBCRVAuQkVQX3ZhbAorCitzdHJ1Y3QgbmlzX2FjdGl2ZV9lbmRwb2ludCB7CisJZW5kcG9pbnQgZXA7CisJbmlzX25hbWUgaG9zdG5hbWU7CisJaW50IHJhbms7CisJaW50IHVhZGRyX2dlbmVyYXRpb247CisJbmlzX25hbWUgdWFkZHI7CisJaW50IGNiZXBfZ2VuZXJhdGlvbjsKKwllbmRwb2ludCBjYmVwOworfTsKK3R5cGVkZWYgc3RydWN0IG5pc19hY3RpdmVfZW5kcG9pbnQgbmlzX2FjdGl2ZV9lbmRwb2ludDsKKworJS8qIGRlZmluZXMgZm9yIG5pc19ib3VuZF9lbmRwb2ludC5mbGFncyAqLworJSNkZWZpbmUgTklTX0JPVU5EIDB4MQorJSNkZWZpbmUgTklTX1RSQU5TSUVOVF9FUlJPUlMgMHgyCisKK3Byb2dyYW0gIE5JU19QUk9HIHsKKworCS8qIFJQQyBMYW5ndWFnZSBkZXNjcmlwdGlvbiBvZiB0aGUgTklTKyBwcm90b2NvbCAqLworCXZlcnNpb24gTklTX1ZFUlNJT04geworCQkvKiBUaGUgbmFtZSBzZXJ2aWNlIGZ1bmN0aW9ucyAqLworCQluaXNfcmVzdWx0ICBOSVNfTE9PS1VQKG5zX3JlcXVlc3QpID0gMTsKKwkJbmlzX3Jlc3VsdCAgTklTX0FERChuc19yZXF1ZXN0KSA9IDI7CisJCW5pc19yZXN1bHQgIE5JU19NT0RJRlkobnNfcmVxdWVzdCkgPSAzOworCQluaXNfcmVzdWx0ICBOSVNfUkVNT1ZFKG5zX3JlcXVlc3QpID0gNDsKKworCQkvKiBUaGUgaW5mb3JtYXRpb24gYmFzZSBmdW5jdGlvbnMgKi8KKwkJbmlzX3Jlc3VsdCAgTklTX0lCTElTVChpYl9yZXF1ZXN0KSA9IDU7CisJCW5pc19yZXN1bHQgIE5JU19JQkFERChpYl9yZXF1ZXN0KSA9IDY7CisJCW5pc19yZXN1bHQgIE5JU19JQk1PRElGWShpYl9yZXF1ZXN0KSA9IDc7CisJCW5pc19yZXN1bHQgIE5JU19JQlJFTU9WRShpYl9yZXF1ZXN0KSA9IDg7CisJCW5pc19yZXN1bHQgIE5JU19JQkZJUlNUKGliX3JlcXVlc3QpID0gOTsKKwkJbmlzX3Jlc3VsdCAgTklTX0lCTkVYVChpYl9yZXF1ZXN0KSA9IDEwOworCisJCS8qIE5JUyBBZG1pbmlzdHJhdGl2ZSBmdW5jdGlvbnMgKi8KKwkJZmRfcmVzdWx0ICAgTklTX0ZJTkRESVJFQ1RPUlkoZmRfYXJncykgPSAxMjsKKworCQkvKiBJZiBmZXRjaCBhbmQgb3B0aW9uYWxseSByZXNldCBzdGF0aXN0aWNzICovCisJCW5pc190YWdsaXN0ICBOSVNfU1RBVFVTKG5pc190YWdsaXN0KSA9IDE0OworCisJCS8qIER1bXAgY2hhbmdlcyB0byBkaXJlY3Rvcnkgc2luY2UgdGltZSBpbiBkYV90aW1lICovCisJCWxvZ19yZXN1bHQgIE5JU19EVU1QTE9HKGR1bXBfYXJncykgPSAxNTsKKworCQkvKiBEdW1wIGNvbnRlbnRzIG9mIGRpcmVjdG9yeSBuYW1lZCAqLworCQlsb2dfcmVzdWx0ICBOSVNfRFVNUChkdW1wX2FyZ3MpID0gMTY7CisKKwkJLyogQ2hlY2sgc3RhdHVzIG9mIGNhbGxiYWNrIHRocmVhZCAqLworCQlib29sCSAgICBOSVNfQ0FMTEJBQ0sobmV0b2JqKSA9IDE3OworCisJCS8qIFJldHVybiBsYXN0IHVwZGF0ZSB0aW1lIGZvciBuYW1lZCBkaXIgKi8KKwkJdWludDMyX3QgICAgTklTX0NQVElNRShuaXNfbmFtZSkgPSAxODsKKworCQkvKiBDaGVja3BvaW50IGRpcmVjdG9yeSBvciB0YWJsZSBuYW1lZCAqLworCQljcF9yZXN1bHQgICBOSVNfQ0hFQ0tQT0lOVChuaXNfbmFtZSkgPSAxOTsKKworCQkvKiBTZW5kICdzdGF0dXMgY2hhbmdlZCcgcGluZyB0byByZXBsaWNhdGVzICovCisJCXZvaWQJICAgIE5JU19QSU5HKHBpbmdfYXJncykgPSAyMDsKKworCQkvKiBNb2RpZnkgc2VydmVyIGJlaGF2aW91ciAoc3VjaCBhcyBkZWJ1Z2dpbmcpICovCisJCW5pc190YWdsaXN0IE5JU19TRVJWU1RBVEUobmlzX3RhZ2xpc3QpID0gMjE7CisKKwkJLyogQ3JlYXRlIGEgRGlyZWN0b3J5ICovCisJCW5pc19lcnJvciAgIE5JU19NS0RJUihuaXNfbmFtZSkgPSAyMjsKKworCQkvKiBSZW1vdmUgYSBEaXJlY3RvcnkgKi8KKwkJbmlzX2Vycm9yICAgTklTX1JNRElSKG5pc19uYW1lKSA9IDIzOworCisJCS8qIFVwZGF0ZSBwdWJsaWMga2V5cyBvZiBhIGRpcmVjdG9yeSBvYmplY3QgKi8KKwkJbmlzX2Vycm9yICAgTklTX1VQREtFWVMobmlzX25hbWUpID0gMjQ7CisJfSA9IDM7Cit9ID0gMTAwMzAwOworCisvKgorICogSW5jbHVkZWQgYmVsb3cgYXJlIHRoZSBkZWZpbmVzIHRoYXQgYmVjb21lIHBhcnQgb2YgbmlzLmgsCisgKiB0aGV5IGFyZSB0ZWNobmljYWxseSBub3QgcGFydCBvZiB0aGUgcHJvdG9jb2wsIGJ1dCBkbyBkZWZpbmUKKyAqIGtleSBhc3BlY3RzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBhbmQgYXJlIHRoZXJlZm9yZSB1c2VmdWwKKyAqIGluIGJ1aWxkaW5nIGEgY29uZm9ybWluZyBzZXJ2ZXIgb3IgY2xpZW50LgorICovCisjaWYgUlBDX0hEUgorJS8qCislICogR2VuZXJpYyAiaGFzaCIgZGF0YXN0cnVjdHVyZXMsIHVzZWQgYnkgYWxsIHR5cGVzIG9mIGhhc2hlZCBkYXRhLgorJSAqLworJXN0cnVjdCBuaXNfaGFzaF9kYXRhIHsKKyUJbmlzX25hbWUJCW5hbWU7CSAgIC8qIE5JUyBuYW1lIG9mIGhhc2hlZCBpdGVtICAgICAgKi8KKyUJaW50CQkJa2V5Y2hhaW47ICAvKiBJdCdzIGhhc2gga2V5IChmb3IgcG9wKSAgICAgICovCislCXN0cnVjdCBuaXNfaGFzaF9kYXRhCSpuZXh0OwkgICAvKiBIYXNoIGNvbGxpc2lvbiBwb2ludGVyICAgICAgICovCislCXN0cnVjdCBuaXNfaGFzaF9kYXRhCSpwcnZfaXRlbTsgLyogQSBzZXJpYWwsIGRvdWJseSBsaW5rZWQgbGlzdCAqLworJQlzdHJ1Y3QgbmlzX2hhc2hfZGF0YQkqbnh0X2l0ZW07IC8qIG9mIGl0ZW1zIGluIHRoZSBoYXNoIHRhYmxlICAgKi8KKyV9OworJXR5cGVkZWYgc3RydWN0IG5pc19oYXNoX2RhdGEgTklTX0hBU0hfSVRFTTsKKyUKKyVzdHJ1Y3QgbmlzX2hhc2hfdGFibGUgeworJQlOSVNfSEFTSF9JVEVNCSprZXlzWzY0XTsJLyogQSBoYXNoIHRhYmxlIG9mIGl0ZW1zICAgICAgICAgICAqLworJQlOSVNfSEFTSF9JVEVNCSpmaXJzdDsJCS8qIFRoZSBmaXJzdCAiaXRlbSIgaW4gc2VyaWFsIGxpc3QgKi8KKyV9OworJXR5cGVkZWYgc3RydWN0IG5pc19oYXNoX3RhYmxlIE5JU19IQVNIX1RBQkxFOworJQorJS8qIFN0cnVjdHVyZSBmb3Igc3RvcmluZyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgc3RhdGljIGRhdGEgKi8KKyVzdHJ1Y3QgbmlzX3NkYXRhIHsKKyUJdm9pZAkqYnVmOwkvKiBNZW1vcnkgYWxsb2NhdGlvbiBwb2ludGVyCSovCislCXVfaW50CXNpemU7CS8qIEJ1ZmZlciBzaXplCQkJKi8KKyV9OworJQorJS8qIEdlbmVyaWMgY2xpZW50IGNyZWF0aW5nIGZsYWdzICovCislI2RlZmluZSBaTUhfVkMJCTEKKyUjZGVmaW5lIFpNSF9ERwkJMgorJSNkZWZpbmUgWk1IX0FVVEgJNAorJQorJS8qIFRlc3RpbmcgQWNjZXNzIHJpZ2h0cyBmb3Igb2JqZWN0cyAqLworJQorJSNkZWZpbmUgTklTX1JFQURfQUNDCQkxCislI2RlZmluZSBOSVNfTU9ESUZZX0FDQwkJMgorJSNkZWZpbmUgTklTX0NSRUFURV9BQ0MJCTQKKyUjZGVmaW5lIE5JU19ERVNUUk9ZX0FDQwk4CislLyogVGVzdCBtYWNyb3MuIGEgPT0gYWNjZXNzIHJpZ2h0cywgbSA9PSBkZXNpcmVkIHJpZ2h0cy4gKi8KKyUjZGVmaW5lIE5JU19XT1JMRChhLCBtKQkoKChhKSAmIChtKSkgIT0gMCkKKyUjZGVmaW5lIE5JU19HUk9VUChhLCBtKQkoKChhKSAmICgobSkgPDwgOCkpICE9IDApCislI2RlZmluZSBOSVNfT1dORVIoYSwgbSkJKCgoYSkgJiAoKG0pIDw8IDE2KSkgIT0gMCkKKyUjZGVmaW5lIE5JU19OT0JPRFkoYSwgbSkJKCgoYSkgJiAoKG0pIDw8IDI0KSkgIT0gMCkKKyUvKgorJSAqIEVPTCBBbGVydCAtIFRoZSBmb2xsb3dpbmcgbm9uLXByZWZpeGVkIHRlc3QgbWFjcm9zIGFyZQorJSAqIGhlcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHksIGFuZCB3aWxsIGJlIG5vdCBiZSBwcmVzZW50CislICogaW4gZnV0dXJlIHJlbGVhc2VzIC0gdXNlIHRoZSBOSVNfKigpIG1hY3JvcyBhYm92ZS4KKyUgKi8KKyUjZGVmaW5lIFdPUkxEKGEsIG0pCSgoKGEpICYgKG0pKSAhPSAwKQorJSNkZWZpbmUgR1JPVVAoYSwgbSkJKCgoYSkgJiAoKG0pIDw8IDgpKSAhPSAwKQorJSNkZWZpbmUgT1dORVIoYSwgbSkJKCgoYSkgJiAoKG0pIDw8IDE2KSkgIT0gMCkKKyUjZGVmaW5lIE5PQk9EWShhLCBtKQkoKChhKSAmICgobSkgPDwgMjQpKSAhPSAwKQorJQorJSNkZWZpbmUgT0FUWVBFKGQsIG4pICgoKGQpLT5kb19hcm1hc2suZG9fYXJtYXNrX3ZhbCtuKS0+b2Ffb3R5cGUpCislI2RlZmluZSBPQVJJR0hUUyhkLCBuKSAoKChkKS0+ZG9fYXJtYXNrLmRvX2FybWFza192YWwrbiktPm9hX3JpZ2h0cykKKyUjZGVmaW5lIFdPUkxEX0RFRkFVTFQgKE5JU19SRUFEX0FDQykKKyUjZGVmaW5lIEdST1VQX0RFRkFVTFQgKE5JU19SRUFEX0FDQyA8PCA4KQorJSNkZWZpbmUgT1dORVJfREVGQVVMVCAoKE5JU19SRUFEX0FDQyArXAorCQkJIE5JU19NT0RJRllfQUNDICtcCisJCQkgTklTX0NSRUFURV9BQ0MgK1wKKwkJCSBOSVNfREVTVFJPWV9BQ0MpIDw8IDE2KQorJSNkZWZpbmUgREVGQVVMVF9SSUdIVFMgKFdPUkxEX0RFRkFVTFQgfCBHUk9VUF9ERUZBVUxUIHwgT1dORVJfREVGQVVMVCkKKyUKKyUvKiBSZXN1bHQgbWFuaXB1bGF0aW9uIGRlZmluZXMgLi4uICovCislI2RlZmluZSBOSVNfUkVTX05VTU9CSih4KQkoKHgpLT5vYmplY3RzLm9iamVjdHNfbGVuKQorJSNkZWZpbmUgTklTX1JFU19PQkpFQ1QoeCkJKCh4KS0+b2JqZWN0cy5vYmplY3RzX3ZhbCkKKyUjZGVmaW5lIE5JU19SRVNfQ09PS0lFKHgpCSgoeCktPmNvb2tpZSkKKyUjZGVmaW5lIE5JU19SRVNfU1RBVFVTKHgpCSgoeCktPnN0YXR1cykKKyUKKyUvKiBUaGVzZSBkZWZpbmVzIG1ha2UgZ2V0dGluZyBhdCB0aGUgdmFyaWFudCBwYXJ0IG9mIHRoZSBvYmplY3QgZWFzaWVyLiAqLworJSNkZWZpbmUgVEFfZGF0YSB6b19kYXRhLm9iamRhdGFfdS50YV9kYXRhCislI2RlZmluZSBFTl9kYXRhIHpvX2RhdGEub2JqZGF0YV91LmVuX2RhdGEKKyUjZGVmaW5lIERJX2RhdGEgem9fZGF0YS5vYmpkYXRhX3UuZGlfZGF0YQorJSNkZWZpbmUgTElfZGF0YSB6b19kYXRhLm9iamRhdGFfdS5saV9kYXRhCislI2RlZmluZSBHUl9kYXRhIHpvX2RhdGEub2JqZGF0YV91LmdyX2RhdGEKKyUKKyUjZGVmaW5lIF9fdHlwZV9vZihvKSAoKG8pLT56b19kYXRhLnpvX3R5cGUpCislCislLyogRGVjbGFyYXRpb25zIGZvciB0aGUgaW50ZXJuYWwgc3Vicm91dGluZXMgaW4gbmlzbGliLmMgKi8KKyVlbnVtIG5hbWVfcG9zIHtTQU1FX05BTUUsIEhJR0hFUl9OQU1FLCBMT1dFUl9OQU1FLCBOT1RfU0VRVUVOVElBTCwgQkFEX05BTUV9OworJXR5cGVkZWYgZW51bSBuYW1lX3BvcyBuYW1lX3BvczsKKyUKKyUvKgorJSAqIERlZmluZXMgZm9yIGdldHRpbmcgYXQgY29sdW1uIGRhdGEgaW4gZW50cnkgb2JqZWN0cy4gQmVjYXVzZSBSUENHRU4KKyUgKiBnZW5lcmF0ZXMgc29tZSByYXRoZXIgd29yZHkgc3RydWN0dXJlcywgd2UgY3JlYXRlIHNvbWUgZGVmaW5lcyB0aGF0CislICogY29sbGFwc2UgdGhlIG5lZWRlZCBrZXlzdHJva2VzIHRvIGFjY2VzcyBhIHBhcnRpY3VsYXIgdmFsdWUgdXNpbmcKKyUgKiB0aGVzZSBkZWZpbml0aW9ucyB0aGV5IHRha2UgYW4gbmlzX29iamVjdCAqLCBhbmQgYW4gaW50IGFuZCByZXR1cm4KKyUgKiBhIHVfY2hhciAqIGZvciBWYWx1ZSwgYW5kIGFuIGludCBmb3IgbGVuZ3RoLgorJSAqLworJSNkZWZpbmUgRU5UUllfVkFMKG9iaiwgY29sKSBcCislCShvYmopLT5FTl9kYXRhLmVuX2NvbHMuZW5fY29sc192YWxbY29sXS5lY192YWx1ZS5lY192YWx1ZV92YWwKKyUjZGVmaW5lIEVOVFJZX0xFTihvYmosIGNvbCkgXAorJQkob2JqKS0+RU5fZGF0YS5lbl9jb2xzLmVuX2NvbHNfdmFsW2NvbF0uZWNfdmFsdWUuZWNfdmFsdWVfbGVuCislCislCislCislI2lmZGVmIF9fY3BsdXNwbHVzCislfQorJSNlbmRpZgorJQorJS8qIFByb3RvdHlwZXMsIGFuZCBleHRlcm4gZGVjbGFyYXRpb25zIGZvciB0aGUgTklTIGxpYnJhcnkgZnVuY3Rpb25zLiAqLworJSNpbmNsdWRlIDxycGNzdmMvbmlzbGliLmg+CislI2VuZGlmIC8qIF9fTklTX1JQQ0dFTl9IICovCislLyogRURJVF9TVEFSVCAqLworJQorJS8qCislICogbmlzXzMuaAorJSAqCislICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIHRoYXQgYXJlIG9ubHkgb2YgaW50ZXJlc3QgdG8gdGhlIGFjdHVhbAorJSAqIHNlcnZpY2UgZGFlbW9uIGFuZCBjbGllbnQgc3R1YnMuIE5vcm1hbCB1c2VycyBvZiBOSVMgd2lsbCBub3QgaW5jbHVkZQorJSAqIHRoaXMgZmlsZS4KKyUgKgorJSAqIE5PVEUgOiBUaGlzIGluY2x1ZGUgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgYSBjb21iaW5hdGlvbgorJSAqIG9mIHJwY2dlbiBhbmQgc2VkLiBETyBOT1QgRURJVCBJVCwgY2hhbmdlIHRoZSBuaXMueCBmaWxlIGluc3RlYWQKKyUgKiBhbmQgdGhlbiByZW1ha2UgdGhpcyBmaWxlLgorJSAqLworJSNpZm5kZWYgX19uaXNfM19oCislI2RlZmluZSBfX25pc18zX2gKKyUjaWZkZWYgX19jcGx1c3BsdXMKKyVleHRlcm4gIkMiIHsKKyUjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzX2NhbGxiYWNrLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uaXNfY2FsbGJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjA1NzI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzX2NhbGxiYWNrLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaWZuZGVmIF9SUENTVkNfTklTX0NBTExCQUNLX0gKKyNkZWZpbmUgX1JQQ1NWQ19OSVNfQ0FMTEJBQ0tfSCAxCisKKyNpbmNsdWRlIDxycGMvcnBjLmg+CisjaW5jbHVkZSA8cnBjc3ZjL25pcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgbmlzX29iamVjdCAqb2JqX3A7CisKK3N0cnVjdCBjYmFja19kYXRhIHsKKwlzdHJ1Y3QgeworCQl1X2ludCBlbnRyaWVzX2xlbjsKKwkJb2JqX3AgKmVudHJpZXNfdmFsOworCX0gZW50cmllczsKK307Cit0eXBlZGVmIHN0cnVjdCBjYmFja19kYXRhIGNiYWNrX2RhdGE7CisKKyNkZWZpbmUgQ0JfUFJPRyAxMDAzMDIKKyNkZWZpbmUgQ0JfVkVSUyAxCisKKyNkZWZpbmUgQ0JQUk9DX1JFQ0VJVkUgMQorZXh0ZXJuICBib29sX3QgKiBjYnByb2NfcmVjZWl2ZV8xIChjYmFja19kYXRhICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBib29sX3QgKiBjYnByb2NfcmVjZWl2ZV8xX3N2YyAoY2JhY2tfZGF0YSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworCisjZGVmaW5lIENCUFJPQ19GSU5JU0ggMgorZXh0ZXJuICB2b2lkICogY2Jwcm9jX2ZpbmlzaF8xICh2b2lkICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICB2b2lkICogY2Jwcm9jX2ZpbmlzaF8xX3N2YyAodm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworCisjZGVmaW5lIENCUFJPQ19FUlJPUiAzCitleHRlcm4gIHZvaWQgKiBjYnByb2NfZXJyb3JfMSAobmlzX2Vycm9yICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICB2b2lkICogY2Jwcm9jX2Vycm9yXzFfc3ZjIChuaXNfZXJyb3IgKiwgc3RydWN0IHN2Y19yZXEgKikgX19USFJPVzsKK2V4dGVybiBpbnQgY2JfcHJvZ18xX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KSBfX1RIUk9XOworCisvKiB0aGUgeGRyIGZ1bmN0aW9ucyAqLworCitleHRlcm4gIGJvb2xfdCB4ZHJfb2JqX3AgKFhEUiAqLCBvYmpfcCopIF9fVEhST1c7CitleHRlcm4gIGJvb2xfdCB4ZHJfY2JhY2tfZGF0YSAoWERSICosIGNiYWNrX2RhdGEqKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogIV9SUENWU0NfTklTX0NBTExCQUNLX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pc19jYWxsYmFjay54IGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzX2NhbGxiYWNrLngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkY2E5ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pc19jYWxsYmFjay54CkBAIC0wLDAgKzEsNjMgQEAKKyUvKgorJSAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyUgKgorJSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorJSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyUgKiBtZXQ6CislICoKKyUgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorJSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyUgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCislICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyUgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyUgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCislICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworJSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorJSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyUgKgorJSAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworJSAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyUgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCislICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorJSAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorJSAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorJSAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyUgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyUgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorJSAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCislICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCislICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorJSAqLworCisvKgorICoJbmlzX2NhbGxiYWNrLngKKyAqLworCislI3ByYWdtYSBpZGVudAkiQCgjKW5pc19jYWxsYmFjay54CTEuNwk5NC8wNS8wMyIKKworLyoKKyAqICJAKCMpem5zX2NiYWNrLnggMS4yIDkwLzA5LzEwIgorICoKKyAqIFJQQ0wgZGVzY3JpcHRpb24gb2YgdGhlIENhbGxiYWNrIFNlcnZpY2UuCisgKi8KKworI2lmZGVmIFJQQ19IRFIKKyUjaW5jbHVkZSA8cnBjc3ZjL25pcy5oPgorI2VuZGlmCisjaWZkZWYgUlBDX1hEUgorJSNpbmNsdWRlICJuaXNfY2xudC5oIgorI2VuZGlmCisKK3R5cGVkZWYgbmlzX29iamVjdAkqb2JqX3A7CisKK3N0cnVjdCBjYmFja19kYXRhIHsKKwlvYmpfcAkJZW50cmllczw+OwkvKiBMaXN0IG9mIG9iamVjdHMgKi8KK307CisKK3Byb2dyYW0gQ0JfUFJPRyB7CisJdmVyc2lvbiBDQl9WRVJTIHsKKwkJYm9vbAlDQlBST0NfUkVDRUlWRShjYmFja19kYXRhKSA9IDE7CisJCXZvaWQJQ0JQUk9DX0ZJTklTSCh2b2lkKSA9IDI7CisJCXZvaWQJQ0JQUk9DX0VSUk9SKG5pc19lcnJvcikgPSAzOworCX0gPSAxOworfSA9IDEwMDMwMjsKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pc19vYmplY3QueCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pc19vYmplY3QueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzRiMzhmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzX29iamVjdC54CkBAIC0wLDAgKzEsMzI4IEBACisvKgorICoJbmlzX29iamVjdC54CisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworJSNwcmFnbWEgaWRlbnQJIkAoIyluaXNfb2JqZWN0LngJMS4xMgk5Ny8xMS8xOSIKKworI2lmIFJQQ19IRFIKKyUKKyUjaWZuZGVmIF9fbmlzX29iamVjdF9oCislI2RlZmluZSBfX25pc19vYmplY3RfaAorJQorI2VuZGlmCisvKgorICoJVGhpcyBmaWxlIGRlZmluZXMgdGhlIGZvcm1hdCBmb3IgYSBOSVMgb2JqZWN0IGluIFJQQyBsYW5ndWFnZS4KKyAqIEl0IGlzIGluY2x1ZGVkIGJ5IHRoZSBtYWluIC54IGZpbGUgYW5kIHRoZSBkYXRhYmFzZSBhY2Nlc3MgcHJvdG9jb2wKKyAqIGZpbGUuIEl0IGlzIGNvbW1vbiBiZWNhdXNlIGJvdGggb2YgdGhlbSBuZWVkIHRvIGRlYWwgd2l0aCB0aGUgc2FtZQorICogdHlwZSBvZiBvYmplY3QuIEdlbmVyYXRpbmcgdGhlIGFjdHVhbCBjb2RlIHRob3VnaCBpcyBhIGJpdCBtZXNzeSBiZWNhdXNlCisgKiB0aGUgbmlzLnggZmlsZSBhbmQgdGhlIG5pc19kYmEueCBmaWxlIHdpbGwgZ2VuZXJhdGUgeGRyIHJvdXRpbmVzIHRvCisgKiBlbmNvZGUvZGVjb2RlIG9iamVjdHMgd2hlbiBvbmx5IG9uZSBzZXQgaXMgbmVlZGVkLiBTdWNoIGlzIGxpZmUgd2hlbgorICogb25lIGlzIHVzaW5nIHJwY2dlbi4KKyAqCisgKiBOb3RlLCB0aGUgcHJvdG9jb2wgZG9lc24ndCBzcGVjaWZ5IGFueSBsaW1pdHMgb24gc3VjaCB0aGluZ3MgYXMKKyAqIG1heGltdW0gbmFtZSBsZW5ndGgsIG51bWJlciBvZiBhdHRyaWJ1dGVzLCBldGMuIFRoZXNlIGFyZSBlbmZvcmNlZAorICogYnkgdGhlIGRhdGFiYXNlIGJhY2tlbmQuIFdoZW4geW91IGhpdCB0aGVtIHlvdSB3aWxsIG5vLiBBbHNvIHNlZQorICogdGhlIGRiX2dldGxpbWl0cygpIGZ1bmN0aW9uIGZvciBmZXRjaGluZyB0aGUgbGltaXQgdmFsdWVzLgorICoKKyAqLworCisvKiBTb21lIG1hbmlmZXN0IGNvbnN0YW50cywgY2hvc2VuIHRvIG1heGltaXplIGZsZXhpYmlsaXR5IHdpdGhvdXQKKyAqIHBsdWdnaW5nIHRoZSB3aXJlIGZ1bGwgb2YgZGF0YS4KKyAqLworY29uc3QgTklTX01BWFNUUklOR0xFTiA9IDI1NTsKK2NvbnN0IE5JU19NQVhOQU1FTEVOICAgPSAxMDI0OworY29uc3QgTklTX01BWEFUVFJOQU1FICA9IDMyOworY29uc3QgTklTX01BWEFUVFJWQUwgICA9IDIwNDg7Citjb25zdCBOSVNfTUFYQ09MVU1OUyAgID0gNjQ7Citjb25zdCBOSVNfTUFYQVRUUiAgICAgID0gMTY7Citjb25zdCBOSVNfTUFYUEFUSCAgICAgID0gMTAyNDsKK2NvbnN0IE5JU19NQVhSRVBMSUNBUyAgPSAxMjg7Citjb25zdCBOSVNfTUFYTElOS1MgICAgID0gMTY7CisKK2NvbnN0IE5JU19QS19OT05FICAgICAgPSAwOwkvKiBubyBwdWJsaWMga2V5ICh1bml4L3N5cyBhdXRoKSAqLworY29uc3QgTklTX1BLX0RICSAgICAgICA9IDE7CS8qIFB1YmxpYyBrZXkgaXMgRGlmZmllLUhlbGxtYW4gdHlwZSAqLworY29uc3QgTklTX1BLX1JTQSAgICAgICA9IDI7CS8qIFB1YmxpYyBrZXkgaWYgUlNBIHR5cGUgKi8KK2NvbnN0IE5JU19QS19LRVJCICAgICAgPSAzOwkvKiBVc2Uga2VyYmVyb3Mgc3R5bGUgYXV0aGVudGljYXRpb24gKi8KK2NvbnN0IE5JU19QS19ESEVYVCAgICAgPSA0OwkvKiBFeHRlbmRlZCBEaWZmaWUtSGVsbG1hbiBmb3IgUlBDLUdTUyAqLworCisvKgorICogVGhlIGZ1bmRhbWVudGFsIG5hbWUgdHlwZSBvZiBOSVMuIFRoZSBuYW1lIG1heSBjb25zaXN0IG9mIHR3byBwYXJ0cywKKyAqIHRoZSBmaXJzdCBiZWluZyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIGFuZCB0aGUgc2Vjb25kIGJlaW5nIGFuCisgKiBvcHRpb25hbCBzZXQgb2YgYXR0cmlidXRlL3ZhbHVlIHBhaXJzLgorICovCitzdHJ1Y3QgbmlzX2F0dHIgeworCXN0cmluZwl6YXR0cl9uZHg8PjsJLyogbmFtZSBvZiB0aGUgaW5kZXgJCSovCisJb3BhcXVlCXphdHRyX3ZhbDw+OwkvKiBWYWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZS4JKi8KK307CisKK3R5cGVkZWYgc3RyaW5nIG5pc19uYW1lPD47CS8qIFRoZSBOSVMgbmFtZSBpdHNlbGYuICovCisKKy8qIE5JUyBvYmplY3QgdHlwZXMgYXJlIGRlZmluZWQgYnkgdGhlIGZvbGxvd2luZyBlbnVtZXJhdGlvbi4gVGhlIG51bWJlcnMKKyAqIHRoZXkgdXNlIGFyZSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHNjaGVtZSA6CisgKgkJICAgICAwIC0gMTAyMyBhcmUgcmVzZXJ2ZWQgZm9yIFN1biwKKyAqCQkxMDI0IC0gMjA0NyBhcmUgZGVmaW5lZCB0byBiZSBwcml2YXRlIHRvIGEgcGFydGljdWxhciB0cmVlLgorICoJCTIwNDggLSA0MDk1IGFyZSBkZWZpbmVkIHRvIGJlIHVzZXIgZGVmaW5lZC4KKyAqCQk0MDk2IC0gLi4uICBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCisgKgorICogRU9MIEFsZXJ0IC0gVGhlIG5vbi1wcmVmaXhlZCBuYW1lcyBhcmUgcHJlc2VudCBmb3IgYmFja3dhcmQKKyAqIGNvbXBhdGFiaWxpdHkgb25seSwgYW5kIHdpbGwgbm90IGV4aXN0IGluIGZ1dHVyZSByZWxlYXNlcy4gVXNlCisgKiB0aGUgTklTXyogbmFtZXMgZm9yIGZ1dHVyZSBjb21wYXRhYmlsaXR5LgorICovCisKK2VudW0gem90eXBlcyB7CisKKwlCT0dVU19PQkoJPSAwLAkvKiBVbmluaXRpYWxpemVkIG9iamVjdCBzdHJ1Y3R1cmUJKi8KKwlOT19PQkoJCT0gMSwJLyogTlVMTCBvYmplY3QgKG5vIGRhdGEpCQkqLworCURJUkVDVE9SWV9PQkoJPSAyLAkvKiBEaXJlY3Rvcnkgb2JqZWN0IGRlc2NyaWJpbmcgZG9tYWluCSovCisJR1JPVVBfT0JKCT0gMywJLyogR3JvdXAgb2JqZWN0IChhIGxpc3Qgb2YgbmFtZXMpCSovCisJVEFCTEVfT0JKCT0gNCwJLyogVGFibGUgb2JqZWN0IChhIGRhdGFiYXNlIHNjaGVtYSkJKi8KKwlFTlRSWV9PQkoJPSA1LAkvKiBFbnRyeSBvYmplY3QgKGEgZGF0YWJhc2UgcmVjb3JkKQkqLworCUxJTktfT0JKCT0gNiwJLyogQSBuYW1lIGxpbmsuCQkJCSovCisJUFJJVkFURV9PQkoJPSA3LAkvKiBQcml2YXRlIG9iamVjdCAoYWxsIG9wYXF1ZSBkYXRhKQkqLworCisJTklTX0JPR1VTX09CSgk9IDAsCS8qIFVuaW5pdGlhbGl6ZWQgb2JqZWN0IHN0cnVjdHVyZQkqLworCU5JU19OT19PQkoJPSAxLAkvKiBOVUxMIG9iamVjdCAobm8gZGF0YSkJCSovCisJTklTX0RJUkVDVE9SWV9PQkogPSAyLCAvKiBEaXJlY3Rvcnkgb2JqZWN0IGRlc2NyaWJpbmcgZG9tYWluCSovCisJTklTX0dST1VQX09CSgk9IDMsCS8qIEdyb3VwIG9iamVjdCAoYSBsaXN0IG9mIG5hbWVzKQkqLworCU5JU19UQUJMRV9PQkoJPSA0LAkvKiBUYWJsZSBvYmplY3QgKGEgZGF0YWJhc2Ugc2NoZW1hKQkqLworCU5JU19FTlRSWV9PQkoJPSA1LAkvKiBFbnRyeSBvYmplY3QgKGEgZGF0YWJhc2UgcmVjb3JkKQkqLworCU5JU19MSU5LX09CSgk9IDYsCS8qIEEgbmFtZSBsaW5rLgkJCQkqLworCU5JU19QUklWQVRFX09CSiAgPSA3IC8qIFByaXZhdGUgb2JqZWN0IChhbGwgb3BhcXVlIGRhdGEpICovCit9OworCisvKgorICogVGhlIHR5cGVzIG9mIE5hbWUgc2VydmljZXMgTklTIGtub3dzIGFib3V0LiBUaGV5IGFyZSBlbnVtZXJhdGVkCisgKiBoZXJlLiBUaGUgQmluZGVyIGNvZGUgd2lsbCB1c2UgdGhpcyB0eXBlIHRvIGRldGVybWluZSBpZiBpdCBoYXMKKyAqIGEgc2V0IG9mIGxpYnJhcnkgcm91dGluZXMgdGhhdCB3aWxsIGFjY2VzcyB0aGUgaW5kaWNhdGVkIG5hbWUgc2VydmljZS4KKyAqLworZW51bSBuc3R5cGUgeworCVVOS05PV04gPSAwLAorCU5JUyA9IDEsCS8qIE5pcyBQbHVzIFNlcnZpY2UJCSovCisJU1VOWVAgPSAyLAkvKiBPbGQgTklTIFNlcnZpY2UJCSovCisJSVZZID0gMywJLyogTmlzIFBsdXMgUGx1cyBTZXJ2aWNlCSovCisJRE5TID0gNCwJLyogRG9tYWluIE5hbWUgU2VydmljZQkJKi8KKwlYNTAwID0gNSwJLyogSVNPL0NDQ0lUIFguNTAwIFNlcnZpY2UJKi8KKwlETkFOUyA9IDYsCS8qIERpZ2l0YWwgREVDTmV0IE5hbWUgU2VydmljZQkqLworCVhDSFMgPSA3LAkvKiBYZXJveCBDbGVhcmluZ0hvdXNlIFNlcnZpY2UJKi8KKwlDRFM9IDgKK307CisKKy8qCisgKiBESVJFQ1RPUlkgLSBUaGUgbmFtZSBzZXJ2aWNlIG9iamVjdC4gVGhlc2Ugb2JqZWN0cyBpZGVudGlmeSBvdGhlciBuYW1lCisgKiBzZXJ2ZXJzIHRoYXQgYXJlIHNlcnZpbmcgc29tZSBwb3J0aW9uIG9mIHRoZSBuYW1lIHNwYWNlLiBFYWNoIGhhcyBhCisgKiB0eXBlIGFzc29jaWF0ZWQgd2l0aCBpdC4gVGhlIHJlc29sdmVyIGxpYnJhcnkgd2lsbCBub3RlIHdoZXRoZXIgb3Igbm90CisgKiBpcyBoYXMgdGhlIG5lZWRlZCByb3V0aW5lcyB0byBhY2Nlc3MgdGhhdCB0eXBlIG9mIHNlcnZpY2UuCisgKiBUaGUgb2FybWFzayBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiBhY2Nlc3MgcmlnaHRzIG1hc2sgb24gYSBwZXIgb2JqZWN0CisgKiB0eXBlIGJhc2lzIGZvciB0aGUgbmFtZSBzcGFjZXMuIFRoZSBvbmx5IGJpdHMgY3VycmVudGx5IHVzZWQgYXJlCisgKiBjcmVhdGUgYW5kIGRlc3Ryb3kuIEJ5IGVuYWJsaW5nIG9yIGRpc2FibGluZyB0aGVzZSBhY2Nlc3MgcmlnaHRzIGZvcgorICogYSBzcGVjaWZpYyBvYmplY3QgdHlwZSBmb3IgYSBvbmUgb2YgdGhlIGFjY2Vzc29yIGVudGl0aWVzIChvd25lciwKKyAqIGdyb3VwLCB3b3JsZCkgdGhlIGFkbWluaXN0cmF0b3IgY2FuIGNvbnRyb2wgd2hhdCB0eXBlcyBvZiBvYmplY3RzCisgKiBtYXkgYmUgZnJlZWx5IGFkZGVkIHRvIHRoZSBuYW1lIHNwYWNlIGFuZCB3aGljaCByZXF1aXJlIHRoZQorICogYWRtaW5pc3RyYXRvcidzIGFwcHJvdmFsLgorICovCitzdHJ1Y3Qgb2FyX21hc2sgeworCXVpbnQzMl90CW9hX3JpZ2h0czsJLyogQWNjZXNzIHJpZ2h0cyBtYXNrCSovCisJem90eXBlcwkJb2Ffb3R5cGU7CS8qIE9iamVjdCB0eXBlCQkqLworfTsKKworc3RydWN0IGVuZHBvaW50IHsKKwlzdHJpbmcJCXVhZGRyPD47CisJc3RyaW5nCQlmYW1pbHk8PjsgICAvKiBUcmFuc3BvcnQgZmFtaWx5IChJTkVULCBPU0ksIGV0YykgKi8KKwlzdHJpbmcJCXByb3RvPD47ICAgIC8qIFByb3RvY29sIChUQ1AsIFVEUCwgQ0xOUCwgIGV0YykgICAqLworfTsKKworLyoKKyAqIE5vdGU6IHBrZXkgaXMgYSBuZXRvYmogd2hpY2ggaXMgbGltaXRlZCB0byAxMDI0IGJ5dGVzIHdoaWNoIGxpbWl0cyB0aGUKKyAqIGtleXNpemUgdG8gODE5MiBiaXRzLiBUaGlzIGlzIGNvbnNpZGVyIHRvIGJlIGEgcmVhc29uYWJsZSBsaW1pdCBmb3IKKyAqIHRoZSBleHBlY3RlZCBsaWZldGltZSBvZiB0aGlzIHNlcnZpY2UuCisgKi8KK3N0cnVjdCBuaXNfc2VydmVyIHsKKwluaXNfbmFtZQluYW1lOwkJLyogUHJpbmNpcGFsIG5hbWUgb2YgdGhlIHNlcnZlciAgKi8KKwllbmRwb2ludAllcDw+OwkJLyogVW5pdmVyc2FsIGFkZHIocykgZm9yIHNlcnZlciAgKi8KKwl1aW50MzJfdAlrZXlfdHlwZTsJLyogUHVibGljIGtleSB0eXBlCQkgKi8KKwluZXRvYmoJCXBrZXk7CQkvKiBzZXJ2ZXIncyBwdWJsaWMga2V5CQkgKi8KK307CisKK3N0cnVjdCBkaXJlY3Rvcnlfb2JqIHsKKwluaXNfbmFtZSAgIGRvX25hbWU7CSAvKiBOYW1lIG9mIHRoZSBkaXJlY3RvcnkgYmVpbmcgc2VydmVkICAgKi8KKwluc3R5cGUJICAgZG9fdHlwZTsJIC8qIG9uZSBvZiBOSVMsIEROUywgSVZZLCBZUCwgb3IgWC41MDAJICovCisJbmlzX3NlcnZlciBkb19zZXJ2ZXJzPD47IC8qIDwwPiA9PSBQcmltYXJ5IG5hbWUgc2VydmVyCQkgKi8KKwl1aW50MzJfdCAgIGRvX3R0bDsJIC8qIFRpbWUgVG8gTGl2ZSAoZm9yIGNhY2hlcykJCSAqLworCW9hcl9tYXNrICAgZG9fYXJtYXNrPD47ICAvKiBDcmVhdGUvRGVzdHJveSByaWdodHMgYnkgb2JqZWN0IHR5cGUgKi8KK307CisKKy8qCisgKiBFTlRSWSAtIFRoaXMgaXMgb25lIHJvdyBvZiBkYXRhIGZyb20gYW4gaW5mb3JtYXRpb24gYmFzZS4KKyAqIFRoZSB0eXBlIHZhbHVlIGlzIHVzZWQgYnkgdGhlIGNsaWVudCBsaWJyYXJ5IHRvIGNvbnZlcnQgdGhlIGVudHJ5IHRvCisgKiBpdCdzIGludGVybmFsIHN0cnVjdHVyZSByZXByZXNlbnRhdGlvbi4gVGhlIFRhYmxlIG5hbWUgaXMgYSBiYWNrIHBvaW50ZXIKKyAqIHRvIHRoZSB0YWJsZSB3aGVyZSB0aGUgZW50cnkgaXMgc3RvcmVkLiBUaGlzIGFsbG93cyB0aGUgY2xpZW50IGxpYnJhcnkKKyAqIHRvIGRldGVybWluZSB3aGVyZSB0byBzZW5kIGEgcmVxdWVzdCBpZiB0aGUgY2xpZW50IHdpc2hlcyB0byBjaGFuZ2UgdGhpcworICogZW50cnkgYnV0IGdvdCB0byBpdCB0aHJvdWdoIGEgTElOSyByYXRoZXIgdGhhbiBkaXJlY3RseS4KKyAqIElmIHRoZSBlbnRyeSBpcyBhICJzdGFuZGFsb25lIiBlbnRyeSB0aGVuIHRoaXMgZmllbGQgaXMgdm9pZC4KKyAqLworY29uc3QgRU5fQklOQVJZICAgPSAxOwkvKiBJbmRpY2F0ZXMgdmFsdWUgaXMgYmluYXJ5IGRhdGEJKi8KK2NvbnN0IEVOX0NSWVBUICAgID0gMjsJLyogSW5kaWNhdGVzIHRoZSB2YWx1ZSBpcyBlbmNyeXB0ZWQJKi8KK2NvbnN0IEVOX1hEUiAgICAgID0gNDsJLyogSW5kaWNhdGVzIHRoZSB2YWx1ZSBpcyBYRFIgZW5jb2RlZAkqLworY29uc3QgRU5fTU9ESUZJRUQgPSA4OwkvKiBJbmRpY2F0ZXMgZW50cnkgaXMgbW9kaWZpZWQuCSovCitjb25zdCBFTl9BU04xICAgICA9IDY0OwkvKiBNZWFucyBjb250ZW50cyB1c2UgQVNOLjEgZW5jb2RpbmcgICAgKi8KKworc3RydWN0IGVudHJ5X2NvbCB7CisJdWludDMyX3QJZWNfZmxhZ3M7CS8qIEZsYWdzIGZvciB0aGlzIHZhbHVlICovCisJb3BhcXVlCQllY192YWx1ZTw+OwkvKiBJdCdzIHRleHR1YWwgdmFsdWUJKi8KK307CisKK3N0cnVjdCBlbnRyeV9vYmogeworCXN0cmluZwllbl90eXBlPD47CS8qIFR5cGUgb2YgZW50cnkgc3VjaCBhcyAicGFzc3dkIiAqLworCWVudHJ5X2NvbCBlbl9jb2xzPD47CS8qIFZhbHVlIGZvciB0aGUgZW50cnkJCSAgKi8KK307CisKKy8qCisgKiBHUk9VUCAtIFRoZSBncm91cCBvYmplY3QgY29udGFpbnMgYSBsaXN0IG9mIE5JUyBwcmluY2lwYWwgbmFtZXMuIEdyb3VwcworICogYXJlIHVzZWQgdG8gYXV0aG9yaXplIHByaW5jaXBhbHMuIEVhY2ggb2JqZWN0IGhhcyBhIHNldCBvZiBhY2Nlc3MgcmlnaHRzCisgKiBmb3IgbWVtYmVycyBvZiBpdHMgZ3JvdXAuIFByaW5jaXBhbCBuYW1lcyBpbiBncm91cHMgYXJlIGluIHRoZSBmb3JtCisgKiBuYW1lLmRpcmVjdG9yeSBhbmQgcmVjdXJzaXZlIGdyb3VwcyBhcmUgZXhwcmVzc2VkIGFzIEBncm91cG5hbWUuZGlyZWN0b3J5CisgKi8KK3N0cnVjdCBncm91cF9vYmogeworCXVpbnQzMl90CWdyX2ZsYWdzOwkvKiBGbGFncyBjb250cm9sbGluZyBncm91cAkqLworCW5pc19uYW1lCWdyX21lbWJlcnM8PjsJLyogTGlzdCBvZiBuYW1lcyBpbiBncm91cAkqLworfTsKKworLyoKKyAqIExJTksgLSBUaGlzIGlzIHRoZSBMSU5LIG9iamVjdC4gSXQgaXMgcXVpdGUgc2ltaWxhciB0byBhIHN5bWJvbGljIGxpbmsKKyAqIGluIHRoZSBVTklYIGZpbGVzeXN0ZW0uIFRoZSBhdHRyaWJ1dGVzIGluIHRoZSBtYWluIG9iamVjdCBzdHJ1Y3R1cmUgYXJlCisgKiByZWxhdGl2ZSB0byB0aGUgTElOSyBkYXRhIGFuZCBub3Qgd2hhdCBpdCBwb2ludHMgdG8gKGxpa2UgdGhlIGZpbGUgc3lzdGVtKQorICogIm1vZGlmeSIgcHJpdmxlZ2VzIGhlcmUgaW5kaWNhdGUgdGhlIHJpZ2h0IHRvIG1vZGlmeSB3aGF0IHRoZSBsaW5rIHBvaW50cworICogYXQgYW5kIG5vdCB0byBtb2RpZnkgdGhhdCBhY3R1YWwgb2JqZWN0IHBvaW50ZWQgdG8gYnkgdGhlIGxpbmsuCisgKi8KK3N0cnVjdCBsaW5rX29iaiB7CisJem90eXBlcwkgbGlfcnR5cGU7CS8qIFJlYWwgdHlwZSBvZiB0aGUgb2JqZWN0CSovCisJbmlzX2F0dHIgbGlfYXR0cnM8PjsJLyogQXR0cmlidXRlL1ZhbHVlcyBmb3IgdGFibGVzCSovCisJbmlzX25hbWUgbGlfbmFtZTsJLyogVGhlIG9iamVjdCdzIHJlYWwgTklTIG5hbWUJKi8KK307CisKKy8qCisgKiBUQUJMRSAtIFRoaXMgaXMgdGhlIHRhYmxlIG9iamVjdC4gSXQgaW1wbGVtZW50cyBhIHNpbXBsZQorICogZGF0YSBiYXNlIHRoYXQgYXBwbGljYXRpb25zIGFuZCB1c2UgZm9yIGNvbmZpZ3VyYXRpb24gb3IKKyAqIGFkbWluaXN0cmF0aW9uIHB1cnBvc2VzLiBUaGUgcm9sZSBvZiB0aGUgdGFibGUgaXMgdG8gZ3JvdXAgdG9nZXRoZXIKKyAqIGEgc2V0IG9mIHJlbGF0ZWQgZW50cmllcy4gVGFibGVzIGFyZSB0aGUgc2ltcGxlIGRhdGFiYXNlIGNvbXBvbmVudAorICogb2YgTklTLiBMaWtlIG1hbnkgZGF0YWJhc2VzLCB0YWJsZXMgYXJlIGxvZ2ljYWxseSBkaXZpZGVkIGludG8gY29sdW1ucworICogYW5kIHJvd3MuIFRoZSBjb2x1bW5zIGFyZSBsYWJlbGVkIHdpdGggaW5kZXhlcyBhbmQgZWFjaCBFTlRSWSBtYWtlcworICogdXAgYSByb3cuIFJvd3MgbWF5IGJlIGFkZHJlc3NlZCB3aXRoaW4gdGhlIHRhYmxlIGJ5IHNlbGVjdGluZyBvbmUKKyAqIG9yIG1vcmUgaW5kZXhlcywgYW5kIHZhbHVlcyBmb3IgdGhvc2UgaW5kZXhlcy4gRWFjaCByb3cgd2hpY2ggaGFzCisgKiBhIHZhbHVlIGZvciB0aGUgZ2l2ZW4gaW5kZXggdGhhdCBtYXRjaGVzIHRoZSBkZXNpcmVkIHZhbHVlIGlzIHJldHVybmVkLgorICogV2l0aGluIHRoZSBkZWZpbml0aW9uIG9mIGVhY2ggY29sdW1uIHRoZXJlIGlzIGEgZmxhZ3MgdmFyaWFibGUsIHRoaXMKKyAqIHZhcmlhYmxlIGNvbnRhaW5zIGZsYWdzIHdoaWNoIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgY29sdW1uIGlzCisgKiBzZWFyY2hhYmxlLCBjb250YWlucyBiaW5hcnkgZGF0YSwgYW5kIGFjY2VzcyByaWdodHMgZm9yIHRoZSBlbnRyeSBvYmplY3RzCisgKiBjb2x1bW4gdmFsdWUuCisgKi8KKworY29uc3QgVEFfQklOQVJZICAgICA9IDE7CS8qIE1lYW5zIHRhYmxlIGRhdGEgaXMgYmluYXJ5CQkqLworY29uc3QgVEFfQ1JZUFQgICAgICA9IDI7CS8qIE1lYW5zIHZhbHVlIHNob3VsZCBiZSBlbmNyeXB0ZWQJKi8KK2NvbnN0IFRBX1hEUiAgICAgICAgPSA0OwkvKiBNZWFucyB2YWx1ZSBpcyBYRFIgZW5jb2RlZAkJKi8KK2NvbnN0IFRBX1NFQVJDSEFCTEUgPSA4OwkvKiBNZWFucyB0aGlzIGNvbHVtbiBpcyBzZWFyY2hhYmxlCSovCitjb25zdCBUQV9DQVNFICAgICAgID0gMTY7CS8qIE1lYW5zIHRoaXMgY29sdW1uIGlzIENhc2UgU2Vuc2l0aXZlCSovCitjb25zdCBUQV9NT0RJRklFRCAgID0gMzI7CS8qIE1lYW5zIHRoaXMgY29sdW1ucyBhdHRycyBhcmUgbW9kaWZpZWQqLworY29uc3QgVEFfQVNOMSAgICAgICA9IDY0OwkvKiBNZWFucyBjb250ZW50cyB1c2UgQVNOLjEgZW5jb2RpbmcgICAgICovCisKK3N0cnVjdCB0YWJsZV9jb2wgeworCXN0cmluZwkJdGNfbmFtZTw2ND47CS8qIENvbHVtbiBOYW1lCQkgICAqLworCXVpbnQzMl90CXRjX2ZsYWdzOwkvKiBjb250cm9sIGZsYWdzCSAgICovCisJdWludDMyX3QJdGNfcmlnaHRzOwkvKiBBY2Nlc3MgcmlnaHRzIG1hc2sJICAgKi8KK307CisKK3N0cnVjdCB0YWJsZV9vYmogeworCXN0cmluZwkgIHRhX3R5cGU8NjQ+OwkgLyogVGFibGUgdHlwZSBzdWNoIGFzICJwYXNzd2QiCSovCisJaW50CSAgdGFfbWF4Y29sOwkgLyogVG90YWwgbnVtYmVyIG9mIGNvbHVtbnMJKi8KKwl1X2NoYXIJICB0YV9zZXA7CSAvKiBTZXBhcmF0b3IgY2hhcmFjdGVyCQkqLworCXRhYmxlX2NvbCB0YV9jb2xzPD47CSAvKiBUaGUgbnVtYmVyIG9mIHRhYmxlIGluZGV4ZXMgKi8KKwlzdHJpbmcJICB0YV9wYXRoPD47CSAvKiBBIHNlYXJjaCBwYXRoIGZvciB0aGlzIHRhYmxlICovCit9OworCisvKgorICogVGhpcyB1bmlvbiBqb2lucyB0b2dldGhlciBhbGwgb2YgdGhlIGN1cnJlbnRseSBrbm93biBvYmplY3RzLgorICovCit1bmlvbiBvYmpkYXRhIHN3aXRjaCAoem90eXBlcyB6b190eXBlKSB7CisJY2FzZSBOSVNfRElSRUNUT1JZX09CSiA6CisJCXN0cnVjdCBkaXJlY3Rvcnlfb2JqIGRpX2RhdGE7CisJY2FzZSBOSVNfR1JPVVBfT0JKIDoKKwkJc3RydWN0IGdyb3VwX29iaiBncl9kYXRhOworCWNhc2UgTklTX1RBQkxFX09CSiA6CisJCXN0cnVjdCB0YWJsZV9vYmogdGFfZGF0YTsKKwljYXNlIE5JU19FTlRSWV9PQko6CisJCXN0cnVjdCBlbnRyeV9vYmogZW5fZGF0YTsKKwljYXNlIE5JU19MSU5LX09CSiA6CisJCXN0cnVjdCBsaW5rX29iaiBsaV9kYXRhOworCWNhc2UgTklTX1BSSVZBVEVfT0JKIDoKKwkJb3BhcXVlCXBvX2RhdGE8PjsKKwljYXNlIE5JU19OT19PQkogOgorCQl2b2lkOworCWNhc2UgTklTX0JPR1VTX09CSiA6CisJCXZvaWQ7CisJZGVmYXVsdCA6CisJCXZvaWQ7Cit9OworCisvKgorICogVGhpcyBpcyB0aGUgYmFzaWMgTklTIG9iamVjdCBkYXRhIHR5cGUuIEl0IGNvbnNpc3RzIG9mIGEgZ2VuZXJpYyBwYXJ0CisgKiB3aGljaCBhbGwgb2JqZWN0cyBjb250YWluLCBhbmQgYSBzcGVjaWFsaXplZCBwYXJ0IHdoaWNoIHZhcmllcyBkZXBlbmRpbmcKKyAqIG9uIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuIEFsbCBvZiB0aGUgc3BlY2lhbGl6ZWQgc2VjdGlvbnMgaGF2ZSBiZWVuCisgKiBkZXNjcmliZWQgYWJvdmUuIFlvdSBtaWdodCBoYXZlIHdvbmRlcmVkIHdoeSB0aGV5IGFsbCBzdGFydCB3aXRoIGFuCisgKiBpbnRlZ2VyIHNpemUsIGZvbGxvd2VkIGJ5IHRoZSB1c2VmdWwgZGF0YS4gVGhlIGFuc3dlciBpcywgd2hlbiB0aGUKKyAqIHNlcnZlciBkb2Vzbid0IHJlY29nbml6ZSB0aGUgdHlwZSByZXR1cm5lZCBpdCB0cmVhdHMgaXQgYXMgb3BhcXVlIGRhdGEuCisgKiBBbmQgdGhlIGRlZmluaXRpb24gZm9yIG9wYXF1ZSBkYXRhIGlzIHtpbnQgc2l6ZTsgY2hhciAqZGF0YTt9LiBJbiB0aGlzCisgKiB3YXksIHNlcnZlcnMgYW5kIHV0aWxpdHkgcm91dGluZXMgdGhhdCBkbyBub3QgdW5kZXJzdGFuZCBhIGdpdmVuIHR5cGUKKyAqIG1heSBzdGlsbCBwYXNzIGl0IGFyb3VuZC4gT25lIGhhcyB0byBiZSBjYXJlZnVsIGluIHNldHRpbmcKKyAqIHRoaXMgdmFyaWFibGUgYWNjdXJhdGVseSwgaXQgbXVzdCB0YWtlIGludG8gYWNjb3VudCBzdWNoIHRoaW5ncyBhcworICogWERSIHBhZGRpbmcgb2Ygc3RydWN0dXJlcyBldGMuIFRoZSBiZXN0IHdheSB0byBzZXQgaXQgaXMgdG8gbm90ZSBvbmUncworICogcG9zaXRpb24gaW4gdGhlIFhEUiBlbmNvZGluZyBzdHJlYW0sIGVuY29kZSB0aGUgc3RydWN0dXJlLCBsb29rIGF0IHRoZQorICogbmV3IHBvc2l0aW9uIGFuZCBjYWxjdWxhdGUgdGhlIHNpemUuCisgKi8KK3N0cnVjdCBuaXNfb2lkIHsKKwl1aW50MzJfdCBjdGltZTsJCS8qIFRpbWUgb2Ygb2JqZWN0cyBjcmVhdGlvbgkqLworCXVpbnQzMl90IG10aW1lOwkJLyogVGltZSBvZiBvYmplY3RzIG1vZGlmaWNhdGlvbiAqLworfTsKKworc3RydWN0IG5pc19vYmplY3QgeworCW5pc19vaWQJIHpvX29pZDsJLyogb2JqZWN0IGlkZW50aXR5IHZlcmlmaWVyLgkJKi8KKwluaXNfbmFtZSB6b19uYW1lOwkvKiBUaGUgTklTIG5hbWUgZm9yIHRoaXMgb2JqZWN0CQkqLworCW5pc19uYW1lIHpvX293bmVyOwkvKiBOSVMgbmFtZSBvZiBvYmplY3Qgb3duZXIuCQkqLworCW5pc19uYW1lIHpvX2dyb3VwOwkvKiBOSVMgbmFtZSBvZiBhY2Nlc3MgZ3JvdXAuCQkqLworCW5pc19uYW1lIHpvX2RvbWFpbjsJLyogVGhlIGFkbWluaXN0cmF0b3IgZm9yIHRoZSBvYmplY3QJKi8KKwl1aW50MzJfdCB6b19hY2Nlc3M7CS8qIEFjY2VzcyByaWdodHMgKG93bmVyLCBncm91cCwgd29ybGQpCSovCisJdWludDMyX3Qgem9fdHRsOwkvKiBPYmplY3QncyB0aW1lIHRvIGxpdmUgaW4gc2Vjb25kcy4JKi8KKwlvYmpkYXRhCSB6b19kYXRhOwkvKiBEYXRhIHN0cnVjdHVyZSBmb3IgdGhpcyB0eXBlCQkqLworfTsKKyNpZiBSUENfSERSCislCislI2VuZGlmIC8qIGlmIF9fbmlzX29iamVjdF9oICovCislCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pc190YWdzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uaXNfdGFncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZGM3ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uaXNfdGFncy5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqCW5pc190YWdzLmgKKyAqCisgKglUaGlzIGZpbGUgY29udGFpbnMgdGhlIHRhZ3MgYW5kIHN0YXRpc3RpY3MgZGVmaW5pdGlvbnMuIEl0IGlzCisgKglhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGJ5IG5pcy5oCisgKi8KKworI2lmbmRlZglfUlBDU1ZDX05JU19UQUdTX0gKKyNkZWZpbmUJX1JQQ1NWQ19OSVNfVEFHU19ICisKKyNpZiAwCisjcHJhZ21hIGlkZW50CSJAKCMpbmlzX3RhZ3MuaAkxLjE2CTk2LzEwLzI1IgorI2VuZGlmCisvKiBmcm9tIGZpbGU6IHpuc190YWdzLmgJMS43ICovCisKKyNpZmRlZglfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisjZGVmaW5lCU5JU19ESVIJImRhdGEiCisKKy8qIExvb2t1cCBhbmQgTGlzdCBmdW5jdGlvbiBmbGFncyAqLworI2RlZmluZQlGT0xMT1dfTElOS1MJKDE8PDApCS8qIEZvbGxvdyBsaW5rIG9iamVjdHMJCQkqLworI2RlZmluZQlGT0xMT1dfUEFUSAkoMTw8MSkJLyogRm9sbG93IHRoZSBwYXRoIGluIGEgdGFibGUJCSovCisjZGVmaW5lCUhBUkRfTE9PS1VQCSgxPDwyKQkvKiBCbG9jayB1bnRpbCBzdWNjZXNzZnVsCQkqLworI2RlZmluZQlBTExfUkVTVUxUUwkoMTw8MykJLyogUmV0cmlldmUgYWxsIHJlc3VsdHMJCQkqLworI2RlZmluZQlOT19DQUNIRQkoMTw8NCkJLyogRG8gbm90IHJldHVybiAnY2FjaGVkJyByZXN1bHRzCSovCisjZGVmaW5lCU1BU1RFUl9PTkxZCSgxPDw1KQkvKiBHZXQgdmFsdWUgb25seSBmcm9tIG1hc3RlciBzZXJ2ZXIJKi8KKyNkZWZpbmUJRVhQQU5EX05BTUUJKDE8PDYpCS8qIEV4cGFuZCBwYXJ0aXRpYWxseSBxdWFsaWZpZWQgbmFtZXMJKi8KKworLyogU2VtYW50aWMgbW9kaWZpY2F0aW9uIGZvciB0YWJsZSBvcGVyYXRpb25zIGZsYWdzICovCisjZGVmaW5lCVJFVFVSTl9SRVNVTFQJKDE8PDcpCS8qIFJldHVybiByZXN1bHRpbmcgb2JqZWN0IHRvIGNsaWVudCAgICAqLworI2RlZmluZQlBRERfT1ZFUldSSVRFCSgxPDw4KQkvKiBBbGxvdyBvdmVyd3JpdGVzIG9uIEFERAkJKi8KKyNkZWZpbmUJUkVNX01VTFRJUExFCSgxPDw5KQkvKiBBbGxvdyB3aWxkY2FyZCBkZWxldGVzCQkqLworI2RlZmluZQlNT0RfU0FNRU9CSgkoMTw8MTApCS8qIENoZWNrIG1vZGlmaWVkIG9iamVjdCBiZWZvcmUgd3JpdGUJKi8KKyNkZWZpbmUJQUREX1JFU0VSVkVECSgxPDwxMSkJLyogU3BhcmUgQUREIHNlbWFudGljCQkJKi8KKyNkZWZpbmUJUkVNX1JFU0VSVkVECSgxPDwxMikJLyogU3BhcmUgUkVNIHNlbWFudGljCQkJKi8KKyNkZWZpbmUJTU9EX0VYQ0xVU0lWRQkoMTw8MTMpCS8qIE1vZGlmeSBubyBvdmVyd3JpdGUgb24gbW9kaWZpZWQga2V5cyAqLworCisvKiBMb29rdXAgYW5kIExpc3QgZnVuY3Rpb24gZmxhZ3MgKGNvbnRpbnVlZCkgKi8KKyNkZWZpbmUJU09GVF9MT09LVVAJKDE8PDE0KQkvKiBUaGUgIm9sZCBkZWZhdWx0IiByZXR1cm4gb24gZmFpbHVyZSAgKi8KKworLyogVHJhbnNwb3J0IHNwZWNpZmljIG1vZGlmaWNhdGlvbnMgdG8gdGhlIG9wZXJhdGlvbiAqLworI2RlZmluZQlVU0VfREdSQU0JKDE8PDE2KSAvKiBVc2UgYSBkYXRhZ3JhbSB0cmFuc3BvcnQJCSovCisjZGVmaW5lCU5PX0FVVEhJTkZPCSgxPDwxNykgLyogRG9uJ3QgYm90aGVyIGF0dGFjaGluZyBhdXRoIGluZm8JKi8KKworLyoKKyAqIERlY2xhcmF0aW9ucyBmb3IgInN0YW5kYXJkIiBOSVMrIHRhZ3MKKyAqIFN0YXRlIHZhcmlhYmxlIHRhZ3MgaGF2ZSB2YWx1ZXMJMCAtIDIwNDcKKyAqIFN0YXRpc3RpYyB0YWdzIGhhdmUgdmFsdWVzCQkyMDQ4IC0gNjU1MzUKKyAqIFVzZXIgVGFncyBoYXZlIHZhbHVlcwkJPjJeMTYKKyAqLworI2RlZmluZQlUQUdfREVCVUcJMQkvKiBzZXQgZGVidWcgbGV2ZWwJCSovCisjZGVmaW5lCVRBR19TVEFUUwkyCS8qIEVuYWJsZS9kaXNhYmxlIHN0YXRpc3RpY3MJKi8KKyNkZWZpbmUJVEFHX0dDQUNIRQkzCS8qIEZsdXNoIHRoZSBHcm91cCBDYWNoZQkqLworI2RlZmluZQlUQUdfR0NBQ0hFX0FMTAlUQUdfR0NBQ0hFCisjZGVmaW5lCVRBR19EQ0FDSEUJNAkvKiBGbHVzaCB0aGUgZGlyZWN0b3J5IGNhY2hlCSovCisjZGVmaW5lCVRBR19EQ0FDSEVfT05FCVRBR19EQ0FDSEUKKyNkZWZpbmUJVEFHX09DQUNIRQk1CS8qIEZsdXNoIHRoZSBPYmplY3QgQ2FjaGUJKi8KKyNkZWZpbmUJVEFHX1NFQ1VSRQk2CS8qIFNldCB0aGUgc2VjdXJpdHkgbGV2ZWwJKi8KKyNkZWZpbmUJVEFHX1RDQUNIRV9PTkUJNwkvKiBGbHVzaCB0aGUgdGFibGUgY2FjaGUJKi8KKyNkZWZpbmUJVEFHX0RDQUNIRV9BTEwJOAkvKiBGbHVzaCBlbnRpcmUgZGlyZWN0b3J5IGNhY2hlCSovCisjZGVmaW5lCVRBR19UQ0FDSEVfQUxMCTkJLyogRmx1c2ggZW50aXJlIHRhYmxlIGNhY2hlCSovCisjZGVmaW5lCVRBR19HQ0FDSEVfT05FCTEwCS8qIEZsdXNoIG9uZSBncm91cCBvYmplY3QJKi8KKyNkZWZpbmUJVEFHX0RDQUNIRV9PTkVfUkVGUkVTSCAxMSAvKiBGbHVzaCBhbmQgcmVmcmVzaCBvbmUgRE8JKi8KKyNkZWZpbmUJVEFHX1JFQURPTkxZCTEyCS8qIFNldCByZWFkIG9ubHkgbW9kZQkJKi8KKyNkZWZpbmUJVEFHX1JFQURXUklURQkxNAkvKiBSZXNldCByZWFkLXdyaXRlIG1vZGUJKi8KKworI2RlZmluZQlUQUdfT1BTVEFUUwkyMDQ4CS8qIE5JUysgb3BlcmF0aW9ucyBzdGF0aXN0aWNzICAgKi8KKyNkZWZpbmUJVEFHX1RIUkVBRFMJMjA0OQkvKiBDaGlsZCBwcm9jZXNzL3RocmVhZCBzdGF0dXMgICovCisjZGVmaW5lCVRBR19IRUFQCTIwNTAJLyogSGVhcCB1c2FnZSBzdGF0aXN0aWNzCSovCisjZGVmaW5lCVRBR19VUERBVEVTCTIwNTEJLyogVXBkYXRlcyB0byB0aGlzIHNlcnZpY2UJKi8KKyNkZWZpbmUJVEFHX1ZJU0lCTEUJMjA1MgkvKiBGaXJzdCB1cGRhdGUgdGhhdCBpc24ndCByZXBsaWNhdGVkICovCisjZGVmaW5lCVRBR19TX0RDQUNIRQkyMDUzCS8qIERpcmVjdG9yeSBjYWNoZSBzdGF0aXN0aWNzCSovCisjZGVmaW5lCVRBR19TX09DQUNIRQkyMDU0CS8qIE9iamVjdCBjYWNoZSBzdGF0aXN0aWNzCSovCisjZGVmaW5lCVRBR19TX0dDQUNIRQkyMDU1CS8qIEdyb3VwIGNhY2hlIHN0YXRpc3RpY3MJKi8KKyNkZWZpbmUJVEFHX1NfU1RPUkFHRQkyMDU2CS8qIEdyb3VwIGNhY2hlIHN0YXRpc3RpY3MJKi8KKyNkZWZpbmUJVEFHX1VQVElNRQkyMDU3CS8qIFRpbWUgdGhhdCBzZXJ2ZXIgaGFzIGJlZW4gdXAgKi8KKyNkZWZpbmUJVEFHX0RJUkxJU1QJMjA1OAkvKiBEaXIgc2VydmVkIGJ5IHRoaXMgc2VydmVyICAgICovCisjZGVmaW5lCVRBR19OSVNDT01QQVQJMjA1OQkvKiBXaGV0aGVyIHN1cHBvcnRzIE5JUyBjb21wYXQgbW9kZSAqLworI2RlZmluZQlUQUdfRE5TRk9SV0FSRElORyAyMDYwCS8qIFdoZXRoZXIgRE5TIGZvcndhcmRpbmcgc3VwcG9ydGVkICovCisjZGVmaW5lCVRBR19TRUNVUklUWV9MRVZFTCAyMDYxCS8qIFNlY3VyaXR5IGxldmVsIG9mIHRoZSBzZXJ2ZXIJKi8KKyNkZWZpbmUJVEFHX1JPT1RTRVJWRVIJMjA2MgkvKiBXaGV0aGVyIHJvb3Qgc2VydmVyCQkqLworCisvKgorICogRGVjbGFyYXRpb25zIGZvciB0aGUgR3JvdXAgb2JqZWN0IGZsYWdzLiBDdXJyZW50bHkKKyAqIHRoZXJlIGFyZSBvbmx5IDMuCisgKi8KKyNkZWZpbmUJSU1QTUVNX0dST1VQUyAgMQkvKiBJbXBsaWNpdCBNZW1iZXJzaGlwIGFsbG93ZWQJKi8KKyNkZWZpbmUJUkVDVVJTX0dST1VQUyAgMgkvKiBSZWN1cnNpdmUgR3JvdXBzIGFsbG93ZWQJKi8KKyNkZWZpbmUJTkVHTUVNX0dST1VQUyAgNAkvKiBOZWdhdGl2ZSBHcm91cHMgYWxsb3dlZAkqLworCisjaWZkZWYJX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYJLyogX1JQQ1NWQ19OSVNfVEFHU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uaXNsaWIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pc2xpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzY2MyYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uaXNsaWIuaApAQCAtMCwwICsxLDI4OCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDA2LCAyMDA3LCAyMDA5CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgQ29udHJpYnV0ZWQgYnkgVGhvcnN0ZW4gS3VrdWsgPGt1a3VrQHN1c2UuZGU+LCAxOTk3LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfX1JQQ1NWQ19OSVNMSUJfSF9fCisjZGVmaW5lCV9fUlBDU1ZDX05JU0xJQl9IX18KKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKwordHlwZWRlZiBjb25zdCBjaGFyICpjb25zdF9uaXNfbmFtZTsKKworLyogbmlzX25hbWVzOiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gbG9jYXRlIGFuZCBtYW5pcHVsYXRlIGFsbCBOSVMrCisgKiBvYmplY3RzIGV4Y2VwdCB0aGUgTklTKyBlbnRyeSBvYmplY3RzLgorICoKKyAqIG5pc19sb29rdXAgKG5hbWUsIGZsYWdzKSByZXNvbHZlcyBhIE5JUysgbmFtZSBhbmQgcmV0dXJucyBhIGNvcHkgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IG9iamVjdCAgZnJvbSBhIE5JUysgc2VydmVyLgorICogICAgY29uc3QgbmlzX25hbWUgbmFtZTogbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGJlIHJlc29sdmVkCisgKiAgICB1bnNpZ25lZCBpbnQgZmxhZ3M6IGxvZ2ljYWxseSBPUmluZyB6ZXJvIG9yIG1vcmUgZmxhZ3MgKEZPTExPV19MSU5LUywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBIQVJEX0xPT0tVUCwgW05PX0NBQ0hFXSwgTUFTVEVSX09OTFksIEVYUEFORF9OQU1FKQorICoKKyAqIG5pc19hZGQgKG5hbWUsIG9iaikgYWRkcyBvYmplY3RzIHRvIHRoZSBOSVMrIG5hbWVzcGFjZS4KKyAqICAgIGNvbnN0IG5pc19uYW1lIG5hbWU6IGZ1bGx5IHF1YWxpZmllZCBOSVMrIG5hbWUuCisgKiAgICBjb25zdCBuaXNfb2JqZWN0ICpvYmo6IG9iamVjdCBtZW1iZXJzIHpvX25hbWUgYW5kIHpvX2RvbWFpbiB3aWxsIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdGVkIGZyb20gbmFtZS4KKyAqCisgKiBuaXNfcmVtb3ZlIChuYW1lLCBvYmopIHJlbW92ZXMgb2JqZWN0cyBmcm9tIHRoZSBOSVMrIG5hbWVzcGFjZS4KKyAqICAgIGNvbnN0IG5pc19uYW1lIG5hbWU6IGZ1bGx5IHF1YWxpZmllZCBOSVMrIG5hbWUuCisgKiAgICBjb25zdCBuaXNfb2JqZWN0ICpvYmo6IGlmIG5vdCBOVUxMLCBpdCBpcyBhc3N1bWVkIHRvIHBvaW50IHRvIGEgY29weQorICogICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgb2JqZWN0IGJlaW5nIHJlbW92ZWQuIEluIHRoaXMgY2FzZSwgaWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG9iamVjdCBvbiB0aGUgc2VydmVyIGRvZXMgbm90IGhhdmUgdGhlIHNhbWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGlkZW50aWZpZXIgYXMgdGhlICBvYmplY3QgIGJlaW5nICBwYXNzZWQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvcGVyYXRpb24gd2lsbCBmYWlsIHdpdGggdGhlIE5JU19OT1RTQU1FT0JKCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLgorICoKKyAqIG5pc19tb2RpZnkgKG5hbWUsIG9iaikgY2FuIGNoYW5nZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIG9mIGFuIG9iamVjdAorICogICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBuYW1lc3BhY2UuCisgKi8KK2V4dGVybiBuaXNfcmVzdWx0ICpuaXNfbG9va3VwIChjb25zdF9uaXNfbmFtZSBuYW1lLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCisgICAgIF9fVEhST1c7CitleHRlcm4gbmlzX3Jlc3VsdCAqbmlzX2FkZCAoY29uc3RfbmlzX25hbWUgbmFtZSwgY29uc3QgbmlzX29iamVjdCAqb2JqKQorICAgICBfX1RIUk9XOworZXh0ZXJuIG5pc19yZXN1bHQgKm5pc19yZW1vdmUgKGNvbnN0X25pc19uYW1lIG5hbWUsCisJCQkgICAgICAgY29uc3QgbmlzX29iamVjdCAqb2JqKSBfX1RIUk9XOworZXh0ZXJuIG5pc19yZXN1bHQgKm5pc19tb2RpZnkgKGNvbnN0X25pc19uYW1lIG5hbWUsCisJCQkgICAgICAgY29uc3QgbmlzX29iamVjdCAqb2JqKSBfX1RIUk9XOworCisvKiBuaXNfdGFibGVzOiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gc2VhcmNoIGFuZCBtb2RpZnkgTklTKyB0YWJsZXMuCisgKgorICogbmlzX2xpc3QgKHRhYmxlX25hbWUsIGZsYWdzLCBjYWxsYmFjayh0YWJsZV9uYW1lLCBvYmosIHVzZXJkYXRhKSwgdXNlcmRhdGEpCisgKiAgICAgICAgICAgc2VhcmNoIGEgdGFibGUgaW4gdGhlIE5JUysgbmFtZXNwYWNlLgorICogICAgY29uc3QgbmlzX25hbWUgdGFibGVfbmFtZTogaW5kZXhlZCBuYW1lIChbeHg9eXldLHRhYmxlLmRpcikKKyAqICAgIHVuc2lnbmVkIGludCBmbGFnczogbG9naWNhbGx5IE9SaW5nIG9uZSBvciBtb3JlIGZsYWdzIChGT0xMT1dfTElOS1MsCisgKiAgICAgICAgICAgICAgICAgICAgICBbRk9MTE9XX1BBVEhdLCBIQVJEX0xPT0tVUCwgW0FMTF9SRVNVTFRTXSwgW05PX0NBQ0hFXSwKKyAqICAgICAgICAgICAgICAgICAgICAgIE1BU1RFUl9PTkxZLCBFWFBBTkRfTkFNRSwgUkVUVVJOX1JFU1VMVCkKKyAqICAgIGNhbGxiYWNrKCk6IGNhbGxiYWNrIGlzIGFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IHdpbGwKKyAqICAgICAgICAgICAgICAgIHByb2Nlc3MgdGhlIEVOVFJZIHR5cGUgb2JqZWN0cyB0aGF0IGFyZSByZXR1cm5lZCBmcm9tIHRoZQorICogICAgICAgICAgICAgICAgc2VhcmNoLiBJZiB0aGlzIHBvaW50ZXIgaXMgTlVMTCwgdGhlbiBhbGwgZW50cmllcyB0aGF0IG1hdGNoCisgKiAgICAgICAgICAgICAgICB0aGUgc2VhcmNoIGNyaXRlcmlhIGFyZSByZXR1cm5lZCBpbiB0aGUgbmlzX3Jlc3VsdCBzdHJ1Y3R1cmUsCisgKiAgICAgICAgICAgICAgICBvdGhlcndpc2UgIHRoaXMgIGZ1bmN0aW9uICB3aWxsICBiZSAgY2FsbGVkIG9uY2UgZm9yIGVhY2gKKyAqICAgICAgICAgICAgICAgIGVudHJ5IHJldHVybmVkLgorICogICAgdm9pZCAqdXNlcmRhdGE6IHBhc3NlZCB0byBjYWxsYmFjayBmdW5jdGlvbiBhbG9uZyB3aXRoIHRoZSByZXR1cm5lZAorICogICAgICAgICAgICAgICAgICAgIGVudHJ5IG9iamVjdC4KKyAqCisgKiBuaXNfYWRkX2VudHJ5ICh0YWJsZV9uYW1lLCBvYmosIGZsYWdzKSB3aWxsIGFkZCB0aGUgTklTKyBvYmplY3QgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSVMrIHRhYmxlX25hbWUuCisgKiAgICBjb25zdCBuaXNfbmFtZSB0YWJsZV9uYW1lCisgKiAgICBjb25zdCBuaXNfb2JqZWN0ICpvYmoKKyAqICAgIHVuc2lnbmVkIGludCBmbGFnczogMCwgQUREX09WRVJXUklURSwgUkVUVVJOX1JFU1VMVAorICoKKyAqIG5pc19tb2RpZnlfZW50cnkgKG5hbWUsIG9iaiwgZmxhZ3MpIG1vZGlmaWVzIGFuIG9iamVjdCBpZGVudGlmaWVkIGJ5IG5hbWUuCisgKiAgICBjb25zdCBuaXNfbmFtZSBuYW1lOiBvYmplY3QgaWRlbnRpZmllcgorICogICAgY29uc3QgbmlzX29iamVjdCAqb2JqOiBzaG91bGQgcG9pbnQgdG8gYW4gZW50cnkgd2l0aCB0aGUgRU5fTU9ESUZJRUQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyBzZXQgaW4gZWFjaCBjb2x1bW4gdGhhdCBjb250YWlucyBuZXcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24uCisgKiAgICB1bnNpZ25lZCBpbnQgZmxhZ3M6IDAsIE1PRF9TQU1FT0JKLCBSRVRVUk5fUkVTVUxUCisgKgorICogbmlzX3JlbW92ZV9lbnRyeSAodGFibGVfbmFtZSwgb2JqLCBmbGFncykgcmVtb3ZlcyBhIHNldCBvZiBlbnRyaWVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZWQgYnkgdGFibGVfbmFtZSBmcm9tIHRoZSB0YWJsZS4KKyAqICAgIGNvbnN0IG5pc19uYW1lIHRhYmxlX25hbWU6IGluZGV4ZWQgTklTKyBuYW1lCisgKiAgICBjb25zdCBuaXNfb2JqZWN0ICpvYmo6IGlmIG9iaiBpcyBub24tbnVsbCwgaXQgaXMgcHJlc3VtZWQgdG8gcG9pbnQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjYWNoZWQgY29weSBvZiB0aGUgZW50cnkuIFdoZW4gdGhlIHJlbW92YWwgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdGVkLCBhbmQgdGhlIG9iamVjdCB0aGF0IHdvdWxkIGJlIHJlbW92ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBjYWNoZWQgb2JqZWN0IHBvaW50ZWQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgb2JqZWN0IHRoZW4gdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwgd2l0aCBhbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICBOSVNfTk9UU0FNRU9CSiBlcnJvcgorICogICAgdW5zaWduZWQgaW50IGZsYWdzOiAwLCBSRU1fTVVMVElQTEUKKyAqCisgKiBuaXNfZmlyc3RfZW50cnkgKHRhYmxlX25hbWUpIGZldGNoZXMgZW50cmllcyBmcm9tIGEgdGFibGUgb25lIGF0IGEgdGltZS4KKyAqICAgIGNvbnN0IG5pc19uYW1lIHRhYmxlX25hbWUKKyAqCisgKiBuaXNfbmV4dF9lbnRyeSAodGFibGVfbmFtZSwgY29va2llKSByZXRyaWV2ZXMgdGhlICJuZXh0IiBlbnRyeSBmcm9tIGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlIHNwZWNpZmllZCBieSB0YWJsZV9uYW1lLgorICogICAgY29uc3QgbmlzX25hbWUgdGFibGVfbmFtZToKKyAqICAgIGNvbnN0IG5ldG9iaiAqY29va2llOiBUaGUgdmFsdWUgb2YgY29va2llIGZyb20gdGhlIG5pc19yZXN1bHQgc3RydWN0dXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybSB0aGUgcHJldmlvdXMgY2FsbC4KKyAqLworZXh0ZXJuIG5pc19yZXN1bHQgKm5pc19saXN0IChjb25zdF9uaXNfbmFtZSBfX25hbWUsIHVuc2lnbmVkIGludCBfX2ZsYWdzLAorCQkJICAgICBpbnQgKCpfX2NhbGxiYWNrKShjb25zdF9uaXNfbmFtZSBfX3RhYmxlX25hbWUsCisJCQkJCSAgICAgICBjb25zdCBuaXNfb2JqZWN0ICpfX29iaiwKKwkJCQkJICAgICAgIGNvbnN0IHZvaWQgKl9fdXNlcmRhdGEpLAorCQkJICAgICBjb25zdCB2b2lkICpfX3VzZXJkYXRhKSBfX1RIUk9XOworZXh0ZXJuIG5pc19yZXN1bHQgKm5pc19hZGRfZW50cnkgKGNvbnN0X25pc19uYW1lIF9fdGFibGVfbmFtZSwKKwkJCQkgIGNvbnN0IG5pc19vYmplY3QgKl9fb2JqLAorCQkJCSAgdW5zaWduZWQgaW50IF9fZmxhZ3MpIF9fVEhST1c7CitleHRlcm4gbmlzX3Jlc3VsdCAqbmlzX21vZGlmeV9lbnRyeSAoY29uc3RfbmlzX25hbWUgX19uYW1lLAorCQkJCSAgICAgY29uc3QgbmlzX29iamVjdCAqX19vYmosCisJCQkJICAgICB1bnNpZ25lZCBpbnQgX19mbGFncykgX19USFJPVzsKK2V4dGVybiBuaXNfcmVzdWx0ICpuaXNfcmVtb3ZlX2VudHJ5IChjb25zdF9uaXNfbmFtZSBfX3RhYmxlX25hbWUsCisJCQkJICAgICBjb25zdCBuaXNfb2JqZWN0ICpfX29iaiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBfX2ZsYWdzKSBfX1RIUk9XOworZXh0ZXJuIG5pc19yZXN1bHQgKm5pc19maXJzdF9lbnRyeSAoY29uc3RfbmlzX25hbWUgX190YWJsZV9uYW1lKSBfX1RIUk9XOworZXh0ZXJuIG5pc19yZXN1bHQgKm5pc19uZXh0X2VudHJ5IChjb25zdF9uaXNfbmFtZSBfX3RhYmxlX25hbWUsCisJCQkJICAgY29uc3QgbmV0b2JqICpfX2Nvb2tpZSkgX19USFJPVzsKKy8qCisqKiBuaXNfc2VydmVyCisqLworZXh0ZXJuIG5pc19lcnJvciBuaXNfbWtkaXIgKGNvbnN0X25pc19uYW1lIF9fZGlybmFtZSwKKwkJCSAgICBjb25zdCBuaXNfc2VydmVyICpfX21hY2hpbmUpIF9fVEhST1c7CitleHRlcm4gbmlzX2Vycm9yIG5pc19ybWRpciAoY29uc3RfbmlzX25hbWUgX19kaXJuYW1lLAorCQkJICAgIGNvbnN0IG5pc19zZXJ2ZXIgKl9fbWFjaGluZSkgX19USFJPVzsKK2V4dGVybiBuaXNfZXJyb3IgbmlzX3NlcnZzdGF0ZSAoY29uc3QgbmlzX3NlcnZlciAqX19tYWNoaW5lLAorCQkJCWNvbnN0IG5pc190YWcgKl9fdGFncywgaW50IF9fbnVtdGFncywKKwkJCQluaXNfdGFnICoqX19yZXN1bHQpIF9fVEhST1c7CitleHRlcm4gbmlzX2Vycm9yIG5pc19zdGF0cyAoY29uc3QgbmlzX3NlcnZlciAqX19tYWNoaW5lLAorCQkJICAgIGNvbnN0IG5pc190YWcgKl9fdGFncywgaW50IF9fbnVtdGFncywKKwkJCSAgICBuaXNfdGFnICoqX19yZXN1bHQpIF9fVEhST1c7CitleHRlcm4gdm9pZCBuaXNfZnJlZXRhZ3MgKG5pc190YWcgKl9fdGFncywgaW50IF9fbnVtdGFncykgX19USFJPVzsKK2V4dGVybiBuaXNfc2VydmVyICoqbmlzX2dldHNlcnZsaXN0IChjb25zdF9uaXNfbmFtZSBfX2Rpcm5hbWUpIF9fVEhST1c7CitleHRlcm4gdm9pZCBuaXNfZnJlZXNlcnZsaXN0IChuaXNfc2VydmVyICoqX19tYWNoaW5lcykgX19USFJPVzsKKworLyoKKyoqIG5pc19zdWJyCisqLworZXh0ZXJuIG5pc19uYW1lIG5pc19sZWFmX29mIChjb25zdF9uaXNfbmFtZSBfX25hbWUpIF9fVEhST1c7CitleHRlcm4gbmlzX25hbWUgbmlzX2xlYWZfb2ZfciAoY29uc3RfbmlzX25hbWUgX19uYW1lLCBjaGFyICpfX2J1ZmZlciwKKwkJCSAgICAgICBzaXplX3QgX19idWZsZW4pIF9fVEhST1c7CitleHRlcm4gbmlzX25hbWUgbmlzX25hbWVfb2YgKGNvbnN0X25pc19uYW1lIF9fbmFtZSkgX19USFJPVzsKK2V4dGVybiBuaXNfbmFtZSBuaXNfbmFtZV9vZl9yIChjb25zdF9uaXNfbmFtZSBfX25hbWUsIGNoYXIgKl9fYnVmZmVyLAorCQkJICAgICAgIHNpemVfdCBfX2J1ZmxlbikgX19USFJPVzsKK2V4dGVybiBuaXNfbmFtZSBuaXNfZG9tYWluX29mIChjb25zdF9uaXNfbmFtZSBfX25hbWUpIF9fVEhST1c7CitleHRlcm4gbmlzX25hbWUgbmlzX2RvbWFpbl9vZl9yIChjb25zdF9uaXNfbmFtZSBfX25hbWUsIGNoYXIgKl9fYnVmZmVyLAorCQkJCSBzaXplX3QgX19idWZsZW4pIF9fVEhST1c7CitleHRlcm4gbmlzX25hbWUgKm5pc19nZXRuYW1lcyAoY29uc3RfbmlzX25hbWUgX19uYW1lKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgbmlzX2ZyZWVuYW1lcyAobmlzX25hbWUgKl9fbmFtZWxpc3QpIF9fVEhST1c7CitleHRlcm4gbmFtZV9wb3MgbmlzX2Rpcl9jbXAgKGNvbnN0X25pc19uYW1lIF9fbjEsIGNvbnN0X25pc19uYW1lIF9fbjIpIF9fVEhST1c7CitleHRlcm4gbmlzX29iamVjdCAqbmlzX2Nsb25lX29iamVjdCAoY29uc3QgbmlzX29iamVjdCAqX19zcmMsCisJCQkJICAgICBuaXNfb2JqZWN0ICpfX2Rlc3QpIF9fVEhST1c7CitleHRlcm4gdm9pZCBuaXNfZGVzdHJveV9vYmplY3QgKG5pc19vYmplY3QgKl9fb2JqKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgbmlzX3ByaW50X29iamVjdCAoY29uc3QgbmlzX29iamVjdCAqX19vYmopIF9fVEhST1c7CisKKy8qCisqKiBuaXNfbG9jYWxfbmFtZXMKKyovCitleHRlcm4gbmlzX25hbWUgbmlzX2xvY2FsX2dyb3VwICh2b2lkKSBfX1RIUk9XOworZXh0ZXJuIG5pc19uYW1lIG5pc19sb2NhbF9kaXJlY3RvcnkgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gbmlzX25hbWUgbmlzX2xvY2FsX3ByaW5jaXBhbCAodm9pZCkgX19USFJPVzsKK2V4dGVybiBuaXNfbmFtZSBuaXNfbG9jYWxfaG9zdCAodm9pZCkgX19USFJPVzsKKworLyoKKyoqIG5pc19lcnJvcgorKi8KK2V4dGVybiBjb25zdCBjaGFyICpuaXNfc3BlcnJubyAoY29uc3QgbmlzX2Vycm9yIF9fc3RhdHVzKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgbmlzX3BlcnJvciAoY29uc3QgbmlzX2Vycm9yIF9fc3RhdHVzLCBjb25zdCBjaGFyICpfX2xhYmVsKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgbmlzX2xlcnJvciAoY29uc3QgbmlzX2Vycm9yIF9fc3RhdHVzLCBjb25zdCBjaGFyICpfX2xhYmVsKSBfX1RIUk9XOworZXh0ZXJuIGNoYXIgKm5pc19zcGVycm9yIChjb25zdCBuaXNfZXJyb3Igc3RhdHVzLCBjb25zdCBjaGFyICpfX2xhYmVsKSBfX1RIUk9XOworZXh0ZXJuIGNoYXIgKm5pc19zcGVycm9yX3IgKGNvbnN0IG5pc19lcnJvciBfX3N0YXR1cywgY29uc3QgY2hhciAqX19sYWJlbCwKKwkJCSAgICBjaGFyICpfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuKSBfX1RIUk9XOworLyoKKyoqIG5pc19ncm91cHMKKyovCitleHRlcm4gYm9vbF90IG5pc19pc21lbWJlciAoY29uc3RfbmlzX25hbWUgX19wcmluY2lwYWwsCisJCQkgICAgY29uc3RfbmlzX25hbWUgX19ncm91cCkgX19USFJPVzsKK2V4dGVybiBuaXNfZXJyb3IgbmlzX2FkZG1lbWJlciAoY29uc3RfbmlzX25hbWUgX19tZW1iZXIsCisJCQkJY29uc3RfbmlzX25hbWUgX19ncm91cCkgX19USFJPVzsKK2V4dGVybiBuaXNfZXJyb3IgbmlzX3JlbW92ZW1lbWJlciAoY29uc3RfbmlzX25hbWUgX19tZW1iZXIsCisJCQkJICAgY29uc3RfbmlzX25hbWUgX19ncm91cCkgX19USFJPVzsKK2V4dGVybiBuaXNfZXJyb3IgbmlzX2NyZWF0ZWdyb3VwIChjb25zdF9uaXNfbmFtZSBfX2dyb3VwLAorCQkJCSAgdW5zaWduZWQgaW50IF9fZmxhZ3MpIF9fVEhST1c7CitleHRlcm4gbmlzX2Vycm9yIG5pc19kZXN0cm95Z3JvdXAgKGNvbnN0X25pc19uYW1lIF9fZ3JvdXApIF9fVEhST1c7CitleHRlcm4gdm9pZCBuaXNfcHJpbnRfZ3JvdXBfZW50cnkgKGNvbnN0X25pc19uYW1lIF9fZ3JvdXApIF9fVEhST1c7CitleHRlcm4gbmlzX2Vycm9yIG5pc192ZXJpZnlncm91cCAoY29uc3RfbmlzX25hbWUgX19ncm91cCkgX19USFJPVzsKKworLyoKKyoqIG5pc19waW5nCisqLworZXh0ZXJuIHZvaWQgbmlzX3BpbmcgKGNvbnN0X25pc19uYW1lIF9fZGlybmFtZSwgdWludDMyX3QgX191dGltZSwKKwkJICAgICAgY29uc3QgbmlzX29iamVjdCAqX19kaXJvYmopIF9fVEhST1c7CitleHRlcm4gbmlzX3Jlc3VsdCAqbmlzX2NoZWNrcG9pbnQgKGNvbnN0X25pc19uYW1lIF9fZGlybmFtZSkgX19USFJPVzsKKworLyoKKyoqIG5pc19wcmludCAoWFhYIElOVEVSTkFMIEZVTkNUSU9OUywgU0hPVUxEIE5PVCBCRSBVU0VEICEhKQorKi8KK2V4dGVybiB2b2lkIG5pc19wcmludF9yZXN1bHQgKGNvbnN0IG5pc19yZXN1bHQgKl9fcmVzdWx0KSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgbmlzX3ByaW50X3JpZ2h0cyAodW5zaWduZWQgaW50IF9fcmlnaHRzKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgbmlzX3ByaW50X2RpcmVjdG9yeSAoY29uc3QgZGlyZWN0b3J5X29iaiAqX19kaXJvYmopIF9fVEhST1c7CitleHRlcm4gdm9pZCBuaXNfcHJpbnRfZ3JvdXAgKGNvbnN0IGdyb3VwX29iaiAqX19ncnBvYmopIF9fVEhST1c7CitleHRlcm4gdm9pZCBuaXNfcHJpbnRfdGFibGUgKGNvbnN0IHRhYmxlX29iaiAqX190YmxvYmopIF9fVEhST1c7CitleHRlcm4gdm9pZCBuaXNfcHJpbnRfbGluayAoY29uc3QgbGlua19vYmogKl9fbG5rb2JqKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgbmlzX3ByaW50X2VudHJ5IChjb25zdCBlbnRyeV9vYmogKl9fZW5vYmopIF9fVEhST1c7CisKKy8qCisqKiBuaXNfZmlsZSAoWFhYIElOVEVSTkFMIEZVTkNUSU9OUywgU0hPVUxEIE5PVCBCRSBVU0VEICEhKQorKi8KK2V4dGVybiBkaXJlY3Rvcnlfb2JqICpyZWFkQ29sZFN0YXJ0RmlsZSAodm9pZCkgX19USFJPVzsKK2V4dGVybiBib29sX3Qgd3JpdGVDb2xkU3RhcnRGaWxlIChjb25zdCBkaXJlY3Rvcnlfb2JqICpfX2Rpcm9iaikgX19USFJPVzsKK2V4dGVybiBuaXNfb2JqZWN0ICpuaXNfcmVhZF9vYmogKGNvbnN0IGNoYXIgKl9fb2JqKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCBuaXNfd3JpdGVfb2JqIChjb25zdCBjaGFyICpfX2ZpbGUsIGNvbnN0IG5pc19vYmplY3QgKl9fb2JqKSBfX1RIUk9XOworCisvKgorKiogbmlzX2Nsb25lIC0gKFhYWCBJTlRFUk5BTCBGVU5DVElPTlMsIFNIT1VMRCBOT1QgQkUgVVNFRCAhISkKKyovCitleHRlcm4gZGlyZWN0b3J5X29iaiAqbmlzX2Nsb25lX2RpcmVjdG9yeSAoY29uc3QgZGlyZWN0b3J5X29iaiAqX19zcmMsCisJCQkJCSAgIGRpcmVjdG9yeV9vYmogKl9fZGVzdCkgX19USFJPVzsKK2V4dGVybiBuaXNfcmVzdWx0ICpuaXNfY2xvbmVfcmVzdWx0IChjb25zdCBuaXNfcmVzdWx0ICpfX3NyYywKKwkJCQkgICAgIG5pc19yZXN1bHQgKl9fZGVzdCkgX19USFJPVzsKKworLyogbmlzX2ZyZWUgLSBuaXNfZnJlZXJlc3VsdCAqLworZXh0ZXJuIHZvaWQgbmlzX2ZyZWVyZXN1bHQgKG5pc19yZXN1bHQgKl9fcmVzdWx0KSBfX1RIUk9XOworLyogKFhYWCBUSEUgRk9MTE9XSU5HIEFSRSBJTlRFUk5BTCBGVU5DVElPTlMsIFNIT1VMRCBOT1QgQkUgVVNFRCAhISkgKi8KK2V4dGVybiB2b2lkIG5pc19mcmVlX3JlcXVlc3QgKGliX3JlcXVlc3QgKl9fcmVxKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgbmlzX2ZyZWVfZGlyZWN0b3J5IChkaXJlY3Rvcnlfb2JqICpfX2Rpcm9iaikgX19USFJPVzsKK2V4dGVybiB2b2lkIG5pc19mcmVlX29iamVjdCAobmlzX29iamVjdCAqX19vYmopIF9fVEhST1c7CisKKy8qIChYWFggSU5URVJOQUwgRlVOQ1RJT05TLCBTSE9VTEQgTk9UIEJFIFVTRUQgISEpICovCitleHRlcm4gbmlzX25hbWUgX19uaXNfZGVmYXVsdF9vd25lciAoY2hhciAqKSBfX1RIUk9XOworZXh0ZXJuIG5pc19uYW1lIF9fbmlzX2RlZmF1bHRfZ3JvdXAgKGNoYXIgKikgX19USFJPVzsKK2V4dGVybiB1aW50MzJfdCBfX25pc19kZWZhdWx0X3R0bCAoY2hhciAqKSBfX1RIUk9XOworZXh0ZXJuIHVuc2lnbmVkIGludCBfX25pc19kZWZhdWx0X2FjY2VzcyAoY2hhciAqLCB1bnNpZ25lZCBpbnQpIF9fVEhST1c7CitleHRlcm4gZmRfcmVzdWx0ICpfX25pc19maW5kZGlyZWN0b3J5IChkaXJlY3Rvcnlfb2JqICosIGNvbnN0X25pc19uYW1lKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgX19mcmVlX2ZkcmVzdWx0IChmZF9yZXN1bHQgKikgX19USFJPVzsKK2V4dGVybiB1aW50MzJfdCBfX25pc19oYXNoIChjb25zdCB2b2lkICpfX2tleWFyZywgc2l6ZV90IF9fbGVuKSBfX1RIUk9XOworCisvKiBOSVMrIGNhY2hlIGxvY2tpbmcgKi8KK2V4dGVybiBpbnQgX19uaXNfbG9ja19jYWNoZSAodm9pZCkgX19USFJPVzsKK2V4dGVybiBpbnQgX19uaXNfdW5sb2NrX2NhY2hlICh2b2lkKSBfX1RIUk9XOworCisvKiAoWFhYIElOVEVSTkFMIEZVTkNUSU9OUywgT05MWSBGT1IgcnBjLm5pc2QgQU5EIGdsaWJjICEhKSAqLworI2lmIGRlZmluZWQgKE5JU19JTlRFUk5BTCkgfHwgZGVmaW5lZCAoX0xJQkMpCisKK3N0cnVjdCBkaXJfYmluZGluZworeworICBDTElFTlQgKmNsbnQ7ICAgICAgICAgICAgICAgICAgLyogUlBDIENMSUVOVCBoYW5kbGUgKi8KKyAgbmlzX3NlcnZlciAqc2VydmVyX3ZhbDsgICAgICAgIC8qIExpc3Qgb2Ygc2VydmVycyAqLworICB1bnNpZ25lZCBpbnQgc2VydmVyX2xlbjsgICAgICAgLyogIyBvZiBzZXJ2ZXJzICovCisgIHVuc2lnbmVkIGludCBzZXJ2ZXJfdXNlZDsgICAgICAvKiBXaGljaCBzZXJ2ZXIgd2UgYXJlIGJpbmQgaW4gdGhlIG1vbWVudCA/ICovCisgIHVuc2lnbmVkIGludCBjdXJyZW50X2VwOyAgICAgICAvKiBXaGljaCBlbmRwb2ludCBvZiB0aGUgc2VydmVyIGFyZSBpbiB1c2U/ICovCisgIHVuc2lnbmVkIGludCB0cnlzOyAgICAgICAgICAgICAvKiBIb3cgbWFueSBzZXJ2ZXIgaGF2ZSB3ZSB0cmllZCA/ICovCisgIHVuc2lnbmVkIGludCBjbGFzczsgICAgICAgICAgICAvKiBGcm9tIHdoaWNoIGNsYXNzIGlzIHNlcnZlcl92YWwgPyAqLworICBib29sX3QgbWFzdGVyX29ubHk7ICAgICAgICAgICAgLyogSXMgb25seSBiaW5kZWQgdG8gdGhlIG1hc3RlciAqLworICBib29sX3QgdXNlX2F1dGg7ICAgICAgICAgICAgICAgLyogRG8gd2UgdXNlIEFVVEggPyAqLworICBib29sX3QgdXNlX3VkcDsgICAgICAgICAgICAgICAgLyogRG8gd2UgdXNlIFVEUCA/ICovCisgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOyAgICAgICAvKiBTZXJ2ZXIncyBJUCBhZGRyZXNzICovCisgIGludCBzb2NrZXQ7ICAgICAgICAgICAgICAgICAgICAvKiBTZXJ2ZXIncyBsb2NhbCBzb2NrZXQgKi8KK307Cit0eXBlZGVmIHN0cnVjdCBkaXJfYmluZGluZyBkaXJfYmluZGluZzsKKworZXh0ZXJuIG5pc19lcnJvciBfX25pc2JpbmRfY3JlYXRlIChkaXJfYmluZGluZyAqLCBjb25zdCBuaXNfc2VydmVyICosCisJCQkJICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKKwkJCQkgICB1bnNpZ25lZCBpbnQpIF9fVEhST1c7CitleHRlcm4gbmlzX2Vycm9yIF9fbmlzYmluZF9jb25uZWN0IChkaXJfYmluZGluZyAqKSBfX1RIUk9XOworZXh0ZXJuIG5pc19lcnJvciBfX25pc2JpbmRfbmV4dCAoZGlyX2JpbmRpbmcgKikgX19USFJPVzsKK2V4dGVybiB2b2lkIF9fbmlzYmluZF9kZXN0cm95IChkaXJfYmluZGluZyAqKSBfX1RIUk9XOworZXh0ZXJuIG5pc19lcnJvciBfX25pc2ZpbmRfc2VydmVyIChjb25zdF9uaXNfbmFtZSwgaW50LCBkaXJlY3Rvcnlfb2JqICoqLAorCQkJCSAgIGRpcl9iaW5kaW5nICosIHVuc2lnbmVkIGludCkgX19USFJPVzsKKworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBfX1JQQ1NWQ19OSVNMSUJfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ubG1fcHJvdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmxtX3Byb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDIwYTZjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmxtX3Byb3QuaApAQCAtMCwwICsxLDMzMCBAQAorLyoKKyAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCisgKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KKyAqLworCisjaWZuZGVmIF9OTE1fUFJPVF9IX1JQQ0dFTgorI2RlZmluZSBfTkxNX1BST1RfSF9SUENHRU4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgTE1fTUFYU1RSTEVOIDEwMjQKKyNkZWZpbmUgTUFYTkFNRUxFTiBMTV9NQVhTVFJMRU4rMQorCitlbnVtIG5sbV9zdGF0cyB7CisJbmxtX2dyYW50ZWQgPSAwLAorCW5sbV9kZW5pZWQgPSAxLAorCW5sbV9kZW5pZWRfbm9sb2NrcyA9IDIsCisJbmxtX2Jsb2NrZWQgPSAzLAorCW5sbV9kZW5pZWRfZ3JhY2VfcGVyaW9kID0gNCwKK307Cit0eXBlZGVmIGVudW0gbmxtX3N0YXRzIG5sbV9zdGF0czsKKworc3RydWN0IG5sbV9ob2xkZXIgeworCWJvb2xfdCBleGNsdXNpdmU7CisJaW50IHN2aWQ7CisJbmV0b2JqIG9oOworCXVfaW50IGxfb2Zmc2V0OworCXVfaW50IGxfbGVuOworfTsKK3R5cGVkZWYgc3RydWN0IG5sbV9ob2xkZXIgbmxtX2hvbGRlcjsKKworc3RydWN0IG5sbV90ZXN0cnBseSB7CisJbmxtX3N0YXRzIHN0YXQ7CisJdW5pb24geworCQlzdHJ1Y3QgbmxtX2hvbGRlciBob2xkZXI7CisJfSBubG1fdGVzdHJwbHlfdTsKK307Cit0eXBlZGVmIHN0cnVjdCBubG1fdGVzdHJwbHkgbmxtX3Rlc3RycGx5OworCitzdHJ1Y3QgbmxtX3N0YXQgeworCW5sbV9zdGF0cyBzdGF0OworfTsKK3R5cGVkZWYgc3RydWN0IG5sbV9zdGF0IG5sbV9zdGF0OworCitzdHJ1Y3QgbmxtX3JlcyB7CisJbmV0b2JqIGNvb2tpZTsKKwlubG1fc3RhdCBzdGF0OworfTsKK3R5cGVkZWYgc3RydWN0IG5sbV9yZXMgbmxtX3JlczsKKworc3RydWN0IG5sbV90ZXN0cmVzIHsKKwluZXRvYmogY29va2llOworCW5sbV90ZXN0cnBseSBzdGF0OworfTsKK3R5cGVkZWYgc3RydWN0IG5sbV90ZXN0cmVzIG5sbV90ZXN0cmVzOworCitzdHJ1Y3QgbmxtX2xvY2sgeworCWNoYXIgKmNhbGxlcl9uYW1lOworCW5ldG9iaiBmaDsKKwluZXRvYmogb2g7CisJaW50IHN2aWQ7CisJdV9pbnQgbF9vZmZzZXQ7CisJdV9pbnQgbF9sZW47Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmxtX2xvY2sgbmxtX2xvY2s7CisKK3N0cnVjdCBubG1fbG9ja2FyZ3MgeworCW5ldG9iaiBjb29raWU7CisJYm9vbF90IGJsb2NrOworCWJvb2xfdCBleGNsdXNpdmU7CisJc3RydWN0IG5sbV9sb2NrIGFsb2NrOworCWJvb2xfdCByZWNsYWltOworCWludCBzdGF0ZTsKK307Cit0eXBlZGVmIHN0cnVjdCBubG1fbG9ja2FyZ3MgbmxtX2xvY2thcmdzOworCitzdHJ1Y3QgbmxtX2NhbmNhcmdzIHsKKwluZXRvYmogY29va2llOworCWJvb2xfdCBibG9jazsKKwlib29sX3QgZXhjbHVzaXZlOworCXN0cnVjdCBubG1fbG9jayBhbG9jazsKK307Cit0eXBlZGVmIHN0cnVjdCBubG1fY2FuY2FyZ3MgbmxtX2NhbmNhcmdzOworCitzdHJ1Y3QgbmxtX3Rlc3RhcmdzIHsKKwluZXRvYmogY29va2llOworCWJvb2xfdCBleGNsdXNpdmU7CisJc3RydWN0IG5sbV9sb2NrIGFsb2NrOworfTsKK3R5cGVkZWYgc3RydWN0IG5sbV90ZXN0YXJncyBubG1fdGVzdGFyZ3M7CisKK3N0cnVjdCBubG1fdW5sb2NrYXJncyB7CisJbmV0b2JqIGNvb2tpZTsKKwlzdHJ1Y3QgbmxtX2xvY2sgYWxvY2s7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmxtX3VubG9ja2FyZ3MgbmxtX3VubG9ja2FyZ3M7CisvKgorICogVGhlIGZvbGxvd2luZyBlbnVtcyBhcmUgYWN0dWFsbHkgYml0IGVuY29kZWQgZm9yIGVmZmljaWVudAorICogYm9vbGVhbiBhbGdlYnJhLi4uLiBET04nVCBjaGFuZ2UgdGhlbS4uLi4uCisgKi8KKworZW51bSBmc2hfbW9kZSB7CisJZnNtX0ROID0gMCwKKwlmc21fRFIgPSAxLAorCWZzbV9EVyA9IDIsCisJZnNtX0RSVyA9IDMsCit9OwordHlwZWRlZiBlbnVtIGZzaF9tb2RlIGZzaF9tb2RlOworCitlbnVtIGZzaF9hY2Nlc3MgeworCWZzYV9OT05FID0gMCwKKwlmc2FfUiA9IDEsCisJZnNhX1cgPSAyLAorCWZzYV9SVyA9IDMsCit9OwordHlwZWRlZiBlbnVtIGZzaF9hY2Nlc3MgZnNoX2FjY2VzczsKKworc3RydWN0IG5sbV9zaGFyZSB7CisJY2hhciAqY2FsbGVyX25hbWU7CisJbmV0b2JqIGZoOworCW5ldG9iaiBvaDsKKwlmc2hfbW9kZSBtb2RlOworCWZzaF9hY2Nlc3MgYWNjZXNzOworfTsKK3R5cGVkZWYgc3RydWN0IG5sbV9zaGFyZSBubG1fc2hhcmU7CisKK3N0cnVjdCBubG1fc2hhcmVhcmdzIHsKKwluZXRvYmogY29va2llOworCW5sbV9zaGFyZSBzaGFyZTsKKwlib29sX3QgcmVjbGFpbTsKK307Cit0eXBlZGVmIHN0cnVjdCBubG1fc2hhcmVhcmdzIG5sbV9zaGFyZWFyZ3M7CisKK3N0cnVjdCBubG1fc2hhcmVyZXMgeworCW5ldG9iaiBjb29raWU7CisJbmxtX3N0YXRzIHN0YXQ7CisJaW50IHNlcXVlbmNlOworfTsKK3R5cGVkZWYgc3RydWN0IG5sbV9zaGFyZXJlcyBubG1fc2hhcmVyZXM7CisKK3N0cnVjdCBubG1fbm90aWZ5IHsKKwljaGFyICpuYW1lOworCWxvbmcgc3RhdGU7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmxtX25vdGlmeSBubG1fbm90aWZ5OworCisjZGVmaW5lIE5MTV9QUk9HIDEwMDAyMQorI2RlZmluZSBOTE1fVkVSUyAxCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2RlZmluZSBOTE1fVEVTVCAxCitleHRlcm4gIG5sbV90ZXN0cmVzICogbmxtX3Rlc3RfMShzdHJ1Y3QgbmxtX3Rlc3RhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgbmxtX3Rlc3RyZXMgKiBubG1fdGVzdF8xX3N2YyhzdHJ1Y3QgbmxtX3Rlc3RhcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBOTE1fTE9DSyAyCitleHRlcm4gIG5sbV9yZXMgKiBubG1fbG9ja18xKHN0cnVjdCBubG1fbG9ja2FyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBubG1fcmVzICogbmxtX2xvY2tfMV9zdmMoc3RydWN0IG5sbV9sb2NrYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkxNX0NBTkNFTCAzCitleHRlcm4gIG5sbV9yZXMgKiBubG1fY2FuY2VsXzEoc3RydWN0IG5sbV9jYW5jYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIG5sbV9yZXMgKiBubG1fY2FuY2VsXzFfc3ZjKHN0cnVjdCBubG1fY2FuY2FyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5MTV9VTkxPQ0sgNAorZXh0ZXJuICBubG1fcmVzICogbmxtX3VubG9ja18xKHN0cnVjdCBubG1fdW5sb2NrYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIG5sbV9yZXMgKiBubG1fdW5sb2NrXzFfc3ZjKHN0cnVjdCBubG1fdW5sb2NrYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkxNX0dSQU5URUQgNQorZXh0ZXJuICBubG1fcmVzICogbmxtX2dyYW50ZWRfMShzdHJ1Y3QgbmxtX3Rlc3RhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV9ncmFudGVkXzFfc3ZjKHN0cnVjdCBubG1fdGVzdGFyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5MTV9URVNUX01TRyA2CitleHRlcm4gIHZvaWQgKiBubG1fdGVzdF9tc2dfMShzdHJ1Y3QgbmxtX3Rlc3RhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIG5sbV90ZXN0X21zZ18xX3N2YyhzdHJ1Y3QgbmxtX3Rlc3RhcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBOTE1fTE9DS19NU0cgNworZXh0ZXJuICB2b2lkICogbmxtX2xvY2tfbXNnXzEoc3RydWN0IG5sbV9sb2NrYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKiBubG1fbG9ja19tc2dfMV9zdmMoc3RydWN0IG5sbV9sb2NrYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkxNX0NBTkNFTF9NU0cgOAorZXh0ZXJuICB2b2lkICogbmxtX2NhbmNlbF9tc2dfMShzdHJ1Y3QgbmxtX2NhbmNhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIG5sbV9jYW5jZWxfbXNnXzFfc3ZjKHN0cnVjdCBubG1fY2FuY2FyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5MTV9VTkxPQ0tfTVNHIDkKK2V4dGVybiAgdm9pZCAqIG5sbV91bmxvY2tfbXNnXzEoc3RydWN0IG5sbV91bmxvY2thcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIG5sbV91bmxvY2tfbXNnXzFfc3ZjKHN0cnVjdCBubG1fdW5sb2NrYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkxNX0dSQU5URURfTVNHIDEwCitleHRlcm4gIHZvaWQgKiBubG1fZ3JhbnRlZF9tc2dfMShzdHJ1Y3QgbmxtX3Rlc3RhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIG5sbV9ncmFudGVkX21zZ18xX3N2YyhzdHJ1Y3QgbmxtX3Rlc3RhcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBOTE1fVEVTVF9SRVMgMTEKK2V4dGVybiAgdm9pZCAqIG5sbV90ZXN0X3Jlc18xKG5sbV90ZXN0cmVzICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIG5sbV90ZXN0X3Jlc18xX3N2YyhubG1fdGVzdHJlcyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkxNX0xPQ0tfUkVTIDEyCitleHRlcm4gIHZvaWQgKiBubG1fbG9ja19yZXNfMShubG1fcmVzICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIG5sbV9sb2NrX3Jlc18xX3N2YyhubG1fcmVzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBOTE1fQ0FOQ0VMX1JFUyAxMworZXh0ZXJuICB2b2lkICogbmxtX2NhbmNlbF9yZXNfMShubG1fcmVzICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIG5sbV9jYW5jZWxfcmVzXzFfc3ZjKG5sbV9yZXMgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5MTV9VTkxPQ0tfUkVTIDE0CitleHRlcm4gIHZvaWQgKiBubG1fdW5sb2NrX3Jlc18xKG5sbV9yZXMgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmxtX3VubG9ja19yZXNfMV9zdmMobmxtX3JlcyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkxNX0dSQU5URURfUkVTIDE1CitleHRlcm4gIHZvaWQgKiBubG1fZ3JhbnRlZF9yZXNfMShubG1fcmVzICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIG5sbV9ncmFudGVkX3Jlc18xX3N2YyhubG1fcmVzICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCBubG1fcHJvZ18xX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKKworI2Vsc2UgLyogSyZSIEMgKi8KKyNkZWZpbmUgTkxNX1RFU1QgMQorZXh0ZXJuICBubG1fdGVzdHJlcyAqIG5sbV90ZXN0XzEoKTsKK2V4dGVybiAgbmxtX3Rlc3RyZXMgKiBubG1fdGVzdF8xX3N2YygpOworI2RlZmluZSBOTE1fTE9DSyAyCitleHRlcm4gIG5sbV9yZXMgKiBubG1fbG9ja18xKCk7CitleHRlcm4gIG5sbV9yZXMgKiBubG1fbG9ja18xX3N2YygpOworI2RlZmluZSBOTE1fQ0FOQ0VMIDMKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV9jYW5jZWxfMSgpOworZXh0ZXJuICBubG1fcmVzICogbmxtX2NhbmNlbF8xX3N2YygpOworI2RlZmluZSBOTE1fVU5MT0NLIDQKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV91bmxvY2tfMSgpOworZXh0ZXJuICBubG1fcmVzICogbmxtX3VubG9ja18xX3N2YygpOworI2RlZmluZSBOTE1fR1JBTlRFRCA1CitleHRlcm4gIG5sbV9yZXMgKiBubG1fZ3JhbnRlZF8xKCk7CitleHRlcm4gIG5sbV9yZXMgKiBubG1fZ3JhbnRlZF8xX3N2YygpOworI2RlZmluZSBOTE1fVEVTVF9NU0cgNgorZXh0ZXJuICB2b2lkICogbmxtX3Rlc3RfbXNnXzEoKTsKK2V4dGVybiAgdm9pZCAqIG5sbV90ZXN0X21zZ18xX3N2YygpOworI2RlZmluZSBOTE1fTE9DS19NU0cgNworZXh0ZXJuICB2b2lkICogbmxtX2xvY2tfbXNnXzEoKTsKK2V4dGVybiAgdm9pZCAqIG5sbV9sb2NrX21zZ18xX3N2YygpOworI2RlZmluZSBOTE1fQ0FOQ0VMX01TRyA4CitleHRlcm4gIHZvaWQgKiBubG1fY2FuY2VsX21zZ18xKCk7CitleHRlcm4gIHZvaWQgKiBubG1fY2FuY2VsX21zZ18xX3N2YygpOworI2RlZmluZSBOTE1fVU5MT0NLX01TRyA5CitleHRlcm4gIHZvaWQgKiBubG1fdW5sb2NrX21zZ18xKCk7CitleHRlcm4gIHZvaWQgKiBubG1fdW5sb2NrX21zZ18xX3N2YygpOworI2RlZmluZSBOTE1fR1JBTlRFRF9NU0cgMTAKK2V4dGVybiAgdm9pZCAqIG5sbV9ncmFudGVkX21zZ18xKCk7CitleHRlcm4gIHZvaWQgKiBubG1fZ3JhbnRlZF9tc2dfMV9zdmMoKTsKKyNkZWZpbmUgTkxNX1RFU1RfUkVTIDExCitleHRlcm4gIHZvaWQgKiBubG1fdGVzdF9yZXNfMSgpOworZXh0ZXJuICB2b2lkICogbmxtX3Rlc3RfcmVzXzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9MT0NLX1JFUyAxMgorZXh0ZXJuICB2b2lkICogbmxtX2xvY2tfcmVzXzEoKTsKK2V4dGVybiAgdm9pZCAqIG5sbV9sb2NrX3Jlc18xX3N2YygpOworI2RlZmluZSBOTE1fQ0FOQ0VMX1JFUyAxMworZXh0ZXJuICB2b2lkICogbmxtX2NhbmNlbF9yZXNfMSgpOworZXh0ZXJuICB2b2lkICogbmxtX2NhbmNlbF9yZXNfMV9zdmMoKTsKKyNkZWZpbmUgTkxNX1VOTE9DS19SRVMgMTQKK2V4dGVybiAgdm9pZCAqIG5sbV91bmxvY2tfcmVzXzEoKTsKK2V4dGVybiAgdm9pZCAqIG5sbV91bmxvY2tfcmVzXzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9HUkFOVEVEX1JFUyAxNQorZXh0ZXJuICB2b2lkICogbmxtX2dyYW50ZWRfcmVzXzEoKTsKK2V4dGVybiAgdm9pZCAqIG5sbV9ncmFudGVkX3Jlc18xX3N2YygpOworZXh0ZXJuIGludCBubG1fcHJvZ18xX2ZyZWVyZXN1bHQgKCk7CisjZW5kaWYgLyogSyZSIEMgKi8KKyNkZWZpbmUgTkxNX1ZFUlNYIDMKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIE5MTV9TSEFSRSAyMAorZXh0ZXJuICBubG1fc2hhcmVyZXMgKiBubG1fc2hhcmVfMyhubG1fc2hhcmVhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgbmxtX3NoYXJlcmVzICogbmxtX3NoYXJlXzNfc3ZjKG5sbV9zaGFyZWFyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5MTV9VTlNIQVJFIDIxCitleHRlcm4gIG5sbV9zaGFyZXJlcyAqIG5sbV91bnNoYXJlXzMobmxtX3NoYXJlYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIG5sbV9zaGFyZXJlcyAqIG5sbV91bnNoYXJlXzNfc3ZjKG5sbV9zaGFyZWFyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5MTV9OTV9MT0NLIDIyCitleHRlcm4gIG5sbV9yZXMgKiBubG1fbm1fbG9ja18zKG5sbV9sb2NrYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIG5sbV9yZXMgKiBubG1fbm1fbG9ja18zX3N2YyhubG1fbG9ja2FyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5MTV9GUkVFX0FMTCAyMworZXh0ZXJuICB2b2lkICogbmxtX2ZyZWVfYWxsXzMobmxtX25vdGlmeSAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKiBubG1fZnJlZV9hbGxfM19zdmMobmxtX25vdGlmeSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiBpbnQgbmxtX3Byb2dfM19mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKyNlbHNlIC8qIEsmUiBDICovCisjZGVmaW5lIE5MTV9TSEFSRSAyMAorZXh0ZXJuICBubG1fc2hhcmVyZXMgKiBubG1fc2hhcmVfMygpOworZXh0ZXJuICBubG1fc2hhcmVyZXMgKiBubG1fc2hhcmVfM19zdmMoKTsKKyNkZWZpbmUgTkxNX1VOU0hBUkUgMjEKK2V4dGVybiAgbmxtX3NoYXJlcmVzICogbmxtX3Vuc2hhcmVfMygpOworZXh0ZXJuICBubG1fc2hhcmVyZXMgKiBubG1fdW5zaGFyZV8zX3N2YygpOworI2RlZmluZSBOTE1fTk1fTE9DSyAyMgorZXh0ZXJuICBubG1fcmVzICogbmxtX25tX2xvY2tfMygpOworZXh0ZXJuICBubG1fcmVzICogbmxtX25tX2xvY2tfM19zdmMoKTsKKyNkZWZpbmUgTkxNX0ZSRUVfQUxMIDIzCitleHRlcm4gIHZvaWQgKiBubG1fZnJlZV9hbGxfMygpOworZXh0ZXJuICB2b2lkICogbmxtX2ZyZWVfYWxsXzNfc3ZjKCk7CitleHRlcm4gaW50IG5sbV9wcm9nXzNfZnJlZXJlc3VsdCAoKTsKKyNlbmRpZiAvKiBLJlIgQyAqLworCisvKiB0aGUgeGRyIGZ1bmN0aW9ucyAqLworCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAgYm9vbF90IHhkcl9ubG1fc3RhdHMgKFhEUiAqLCBubG1fc3RhdHMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9ubG1faG9sZGVyIChYRFIgKiwgbmxtX2hvbGRlciopOworZXh0ZXJuICBib29sX3QgeGRyX25sbV90ZXN0cnBseSAoWERSICosIG5sbV90ZXN0cnBseSopOworZXh0ZXJuICBib29sX3QgeGRyX25sbV9zdGF0IChYRFIgKiwgbmxtX3N0YXQqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9ubG1fcmVzIChYRFIgKiwgbmxtX3JlcyopOworZXh0ZXJuICBib29sX3QgeGRyX25sbV90ZXN0cmVzIChYRFIgKiwgbmxtX3Rlc3RyZXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9ubG1fbG9jayAoWERSICosIG5sbV9sb2NrKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbmxtX2xvY2thcmdzIChYRFIgKiwgbmxtX2xvY2thcmdzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbmxtX2NhbmNhcmdzIChYRFIgKiwgbmxtX2NhbmNhcmdzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbmxtX3Rlc3RhcmdzIChYRFIgKiwgbmxtX3Rlc3RhcmdzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbmxtX3VubG9ja2FyZ3MgKFhEUiAqLCBubG1fdW5sb2NrYXJncyopOworZXh0ZXJuICBib29sX3QgeGRyX2ZzaF9tb2RlIChYRFIgKiwgZnNoX21vZGUqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9mc2hfYWNjZXNzIChYRFIgKiwgZnNoX2FjY2VzcyopOworZXh0ZXJuICBib29sX3QgeGRyX25sbV9zaGFyZSAoWERSICosIG5sbV9zaGFyZSopOworZXh0ZXJuICBib29sX3QgeGRyX25sbV9zaGFyZWFyZ3MgKFhEUiAqLCBubG1fc2hhcmVhcmdzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbmxtX3NoYXJlcmVzIChYRFIgKiwgbmxtX3NoYXJlcmVzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbmxtX25vdGlmeSAoWERSICosIG5sbV9ub3RpZnkqKTsKKworI2Vsc2UgLyogSyZSIEMgKi8KK2V4dGVybiBib29sX3QgeGRyX25sbV9zdGF0cyAoKTsKK2V4dGVybiBib29sX3QgeGRyX25sbV9ob2xkZXIgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ubG1fdGVzdHJwbHkgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ubG1fc3RhdCAoKTsKK2V4dGVybiBib29sX3QgeGRyX25sbV9yZXMgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ubG1fdGVzdHJlcyAoKTsKK2V4dGVybiBib29sX3QgeGRyX25sbV9sb2NrICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbmxtX2xvY2thcmdzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbmxtX2NhbmNhcmdzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbmxtX3Rlc3RhcmdzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbmxtX3VubG9ja2FyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9mc2hfbW9kZSAoKTsKK2V4dGVybiBib29sX3QgeGRyX2ZzaF9hY2Nlc3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ubG1fc2hhcmUgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ubG1fc2hhcmVhcmdzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbmxtX3NoYXJlcmVzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbmxtX25vdGlmeSAoKTsKKworI2VuZGlmIC8qIEsmUiBDICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhX05MTV9QUk9UX0hfUlBDR0VOICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ubG1fcHJvdC54IGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmxtX3Byb3QueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWZmMTM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmxtX3Byb3QueApAQCAtMCwwICsxLDIwMyBAQAorLyogQCgjKW5sbV9wcm90LngJMi4xIDg4LzA4LzAxIDQuMCBSUENTUkMgKi8KKworLyoKKyAqIE5ldHdvcmsgbG9jayBtYW5hZ2VyIHByb3RvY29sIGRlZmluaXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogcHJvdG9jb2wgdXNlZCBiZXR3ZWVuIGxvY2FsIGxvY2sgbWFuYWdlciBhbmQgcmVtb3RlIGxvY2sgbWFuYWdlcgorICovCisKKyNpZmRlZiBSUENfSERSCislI2RlZmluZSBMTV9NQVhTVFJMRU4JMTAyNAorJSNkZWZpbmUgTUFYTkFNRUxFTglMTV9NQVhTVFJMRU4rMQorI2VuZGlmCisKKy8qCisgKiBzdGF0dXMgb2YgYSBjYWxsIHRvIHRoZSBsb2NrIG1hbmFnZXIKKyAqLworZW51bSBubG1fc3RhdHMgeworCW5sbV9ncmFudGVkID0gMCwKKwlubG1fZGVuaWVkID0gMSwKKwlubG1fZGVuaWVkX25vbG9ja3MgPSAyLAorCW5sbV9ibG9ja2VkID0gMywKKwlubG1fZGVuaWVkX2dyYWNlX3BlcmlvZCA9IDQKK307CisKK3N0cnVjdCBubG1faG9sZGVyIHsKKwlib29sIGV4Y2x1c2l2ZTsKKwlpbnQgc3ZpZDsKKwluZXRvYmogb2g7CisJdW5zaWduZWQgbF9vZmZzZXQ7CisJdW5zaWduZWQgbF9sZW47Cit9OworCit1bmlvbiBubG1fdGVzdHJwbHkgc3dpdGNoIChubG1fc3RhdHMgc3RhdCkgeworCWNhc2UgbmxtX2RlbmllZDoKKwkJc3RydWN0IG5sbV9ob2xkZXIgaG9sZGVyOworCWRlZmF1bHQ6CisJCXZvaWQ7Cit9OworCitzdHJ1Y3QgbmxtX3N0YXQgeworCW5sbV9zdGF0cyBzdGF0OworfTsKKworc3RydWN0IG5sbV9yZXMgeworCW5ldG9iaiBjb29raWU7CisJbmxtX3N0YXQgc3RhdDsKK307CisKK3N0cnVjdCBubG1fdGVzdHJlcyB7CisJbmV0b2JqIGNvb2tpZTsKKwlubG1fdGVzdHJwbHkgc3RhdDsKK307CisKK3N0cnVjdCBubG1fbG9jayB7CisJc3RyaW5nIGNhbGxlcl9uYW1lPExNX01BWFNUUkxFTj47CisJbmV0b2JqIGZoOwkJLyogaWRlbnRpZnkgYSBmaWxlICovCisJbmV0b2JqIG9oOwkJLyogaWRlbnRpZnkgb3duZXIgb2YgYSBsb2NrICovCisJaW50IHN2aWQ7CQkvKiBnZW5lcmF0ZWQgZnJvbSBwaWQgZm9yIHN2aWQgKi8KKwl1bnNpZ25lZCBsX29mZnNldDsKKwl1bnNpZ25lZCBsX2xlbjsKK307CisKK3N0cnVjdCBubG1fbG9ja2FyZ3MgeworCW5ldG9iaiBjb29raWU7CisJYm9vbCBibG9jazsKKwlib29sIGV4Y2x1c2l2ZTsKKwlzdHJ1Y3QgbmxtX2xvY2sgYWxvY2s7CisJYm9vbCByZWNsYWltOwkJLyogdXNlZCBmb3IgcmVjb3ZlcmluZyBsb2NrcyAqLworCWludCBzdGF0ZTsJCS8qIHNwZWNpZnkgbG9jYWwgc3RhdHVzIG1vbml0b3Igc3RhdGUgKi8KK307CisKK3N0cnVjdCBubG1fY2FuY2FyZ3MgeworCW5ldG9iaiBjb29raWU7CisJYm9vbCBibG9jazsKKwlib29sIGV4Y2x1c2l2ZTsKKwlzdHJ1Y3QgbmxtX2xvY2sgYWxvY2s7Cit9OworCitzdHJ1Y3QgbmxtX3Rlc3RhcmdzIHsKKwluZXRvYmogY29va2llOworCWJvb2wgZXhjbHVzaXZlOworCXN0cnVjdCBubG1fbG9jayBhbG9jazsKK307CisKK3N0cnVjdCBubG1fdW5sb2NrYXJncyB7CisJbmV0b2JqIGNvb2tpZTsKKwlzdHJ1Y3QgbmxtX2xvY2sgYWxvY2s7Cit9OworCisKKyNpZmRlZiBSUENfSERSCislLyoKKyUgKiBUaGUgZm9sbG93aW5nIGVudW1zIGFyZSBhY3R1YWxseSBiaXQgZW5jb2RlZCBmb3IgZWZmaWNpZW50CislICogYm9vbGVhbiBhbGdlYnJhLi4uLiBET04nVCBjaGFuZ2UgdGhlbS4uLi4uCislICovCisjZW5kaWYKK2VudW0JZnNoX21vZGUgeworCWZzbV9ETiAgPSAwLAkvKiBkZW55IG5vbmUgKi8KKwlmc21fRFIgID0gMSwJLyogZGVueSByZWFkICovCisJZnNtX0RXICA9IDIsCS8qIGRlbnkgd3JpdGUgKi8KKwlmc21fRFJXID0gMwkvKiBkZW55IHJlYWQvd3JpdGUgKi8KK307CisKK2VudW0JZnNoX2FjY2VzcyB7CisJZnNhX05PTkUgPSAwLAkvKiBmb3IgY29tcGxldGVuZXNzICovCisJZnNhX1IgICAgPSAxLAkvKiByZWFkIG9ubHkgKi8KKwlmc2FfVyAgICA9IDIsCS8qIHdyaXRlIG9ubHkgKi8KKwlmc2FfUlcgICA9IDMJLyogcmVhZC93cml0ZSAqLworfTsKKworc3RydWN0CW5sbV9zaGFyZSB7CisJc3RyaW5nIGNhbGxlcl9uYW1lPExNX01BWFNUUkxFTj47CisJbmV0b2JqCWZoOworCW5ldG9iaglvaDsKKwlmc2hfbW9kZQltb2RlOworCWZzaF9hY2Nlc3MJYWNjZXNzOworfTsKKworc3RydWN0CW5sbV9zaGFyZWFyZ3MgeworCW5ldG9iagljb29raWU7CisJbmxtX3NoYXJlCXNoYXJlOworCWJvb2wJcmVjbGFpbTsKK307CisKK3N0cnVjdAlubG1fc2hhcmVyZXMgeworCW5ldG9iagljb29raWU7CisJbmxtX3N0YXRzCXN0YXQ7CisJaW50CXNlcXVlbmNlOworfTsKKworc3RydWN0CW5sbV9ub3RpZnkgeworCXN0cmluZyBuYW1lPE1BWE5BTUVMRU4+OworCWxvbmcgc3RhdGU7Cit9OworCisvKgorICogT3Zlci10aGUtd2lyZSBwcm90b2NvbCB1c2VkIGJldHdlZW4gdGhlIG5ldHdvcmsgbG9jayBtYW5hZ2VycworICovCisKK3Byb2dyYW0gTkxNX1BST0cgeworCXZlcnNpb24gTkxNX1ZFUlMgeworCisJCW5sbV90ZXN0cmVzCU5MTV9URVNUKHN0cnVjdCBubG1fdGVzdGFyZ3MpID0JMTsKKworCQlubG1fcmVzCQlOTE1fTE9DSyhzdHJ1Y3QgbmxtX2xvY2thcmdzKSA9CTI7CisKKwkJbmxtX3JlcwkJTkxNX0NBTkNFTChzdHJ1Y3QgbmxtX2NhbmNhcmdzKSA9IDM7CisJCW5sbV9yZXMJCU5MTV9VTkxPQ0soc3RydWN0IG5sbV91bmxvY2thcmdzKSA9CTQ7CisKKwkJLyoKKwkJICogcmVtb3RlIGxvY2sgbWFuYWdlciBjYWxsLWJhY2sgdG8gZ3JhbnQgbG9jaworCQkgKi8KKwkJbmxtX3JlcwkJTkxNX0dSQU5URUQoc3RydWN0IG5sbV90ZXN0YXJncyk9IDU7CisJCS8qCisJCSAqIG1lc3NhZ2UgcGFzc2luZyBzdHlsZSBvZiByZXF1ZXN0aW5nIGxvY2sKKwkJICovCisJCXZvaWQJCU5MTV9URVNUX01TRyhzdHJ1Y3QgbmxtX3Rlc3RhcmdzKSA9IDY7CisJCXZvaWQJCU5MTV9MT0NLX01TRyhzdHJ1Y3QgbmxtX2xvY2thcmdzKSA9IDc7CisJCXZvaWQJCU5MTV9DQU5DRUxfTVNHKHN0cnVjdCBubG1fY2FuY2FyZ3MpID04OworCQl2b2lkCQlOTE1fVU5MT0NLX01TRyhzdHJ1Y3QgbmxtX3VubG9ja2FyZ3MpID0gOTsKKwkJdm9pZAkJTkxNX0dSQU5URURfTVNHKHN0cnVjdCBubG1fdGVzdGFyZ3MpID0gMTA7CisJCXZvaWQJCU5MTV9URVNUX1JFUyhubG1fdGVzdHJlcykgPSAxMTsKKwkJdm9pZAkJTkxNX0xPQ0tfUkVTKG5sbV9yZXMpID0gMTI7CisJCXZvaWQJCU5MTV9DQU5DRUxfUkVTKG5sbV9yZXMpID0gMTM7CisJCXZvaWQJCU5MTV9VTkxPQ0tfUkVTKG5sbV9yZXMpID0gMTQ7CisJCXZvaWQJCU5MTV9HUkFOVEVEX1JFUyhubG1fcmVzKSA9IDE1OworCX0gPSAxOworCisJdmVyc2lvbiBOTE1fVkVSU1ggeworCQlubG1fc2hhcmVyZXMJTkxNX1NIQVJFKG5sbV9zaGFyZWFyZ3MpID0gMjA7CisJCW5sbV9zaGFyZXJlcwlOTE1fVU5TSEFSRShubG1fc2hhcmVhcmdzKSA9IDIxOworCQlubG1fcmVzCQlOTE1fTk1fTE9DSyhubG1fbG9ja2FyZ3MpID0gMjI7CisJCXZvaWQJCU5MTV9GUkVFX0FMTChubG1fbm90aWZ5KSA9IDIzOworCX0gPSAzOworCit9ID0gMTAwMDIxOwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcmV4LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9yZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzgwY2U3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcmV4LmgKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLgorICogSXQgd2FzIGdlbmVyYXRlZCB1c2luZyBycGNnZW4uCisgKi8KKworI2lmbmRlZiBfUkVYX0hfUlBDR0VOCisjZGVmaW5lIF9SRVhfSF9SUENHRU4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgU1RSSU5HU0laRSAxMDI0CisKK3R5cGVkZWYgY2hhciAqcmV4c3RyaW5nOworI2RlZmluZSBTSUdJTlQgMgorI2RlZmluZSBSRVhfSU5URVJBQ1RJVkUgMQorCitzdHJ1Y3QgcmV4X3N0YXJ0IHsKKwlzdHJ1Y3QgeworCQl1X2ludCByc3RfY21kX2xlbjsKKwkJcmV4c3RyaW5nICpyc3RfY21kX3ZhbDsKKwl9IHJzdF9jbWQ7CisJcmV4c3RyaW5nIHJzdF9ob3N0OworCXJleHN0cmluZyByc3RfZnNuYW1lOworCXJleHN0cmluZyByc3RfZGlyd2l0aGluOworCXN0cnVjdCB7CisJCXVfaW50IHJzdF9lbnZfbGVuOworCQlyZXhzdHJpbmcgKnJzdF9lbnZfdmFsOworCX0gcnN0X2VudjsKKwl1X2ludCByc3RfcG9ydDA7CisJdV9pbnQgcnN0X3BvcnQxOworCXVfaW50IHJzdF9wb3J0MjsKKwl1X2ludCByc3RfZmxhZ3M7Cit9OwordHlwZWRlZiBzdHJ1Y3QgcmV4X3N0YXJ0IHJleF9zdGFydDsKKworc3RydWN0IHJleF9yZXN1bHQgeworCWludCBybHRfc3RhdDsKKwlyZXhzdHJpbmcgcmx0X21lc3NhZ2U7Cit9OwordHlwZWRlZiBzdHJ1Y3QgcmV4X3Jlc3VsdCByZXhfcmVzdWx0OworCitzdHJ1Y3Qgc2d0dHliIHsKKwl1X2ludCBmb3VyOworCWNoYXIgY2hhcnNbNF07CisJdV9pbnQgZmxhZ3M7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgc2d0dHliIHNndHR5YjsKKyNkZWZpbmUgQjAgMAorI2RlZmluZSBCNTAgMQorI2RlZmluZSBCNzUgMgorI2RlZmluZSBCMTEwIDMKKyNkZWZpbmUgQjEzNCA0CisjZGVmaW5lIEIxNTAgNQorI2RlZmluZSBCMjAwIDYKKyNkZWZpbmUgQjMwMCA3CisjZGVmaW5lIEI2MDAgOAorI2RlZmluZSBCMTIwMCA5CisjZGVmaW5lIEIxODAwIDEwCisjZGVmaW5lIEIyNDAwIDExCisjZGVmaW5lIEI0ODAwIDEyCisjZGVmaW5lIEI5NjAwIDEzCisjZGVmaW5lIEIxOTIwMCAxNAorI2RlZmluZSBCMzg0MDAgMTUKKyNkZWZpbmUgVEFOREVNIDB4MDAwMDAwMDEKKyNkZWZpbmUgQ0JSRUFLIDB4MDAwMDAwMDIKKyNkZWZpbmUgTENBU0UgMHgwMDAwMDAwNAorI2RlZmluZSBFQ0hPIDB4MDAwMDAwMDgKKyNkZWZpbmUgQ1JNT0QgMHgwMDAwMDAxMAorI2RlZmluZSBSQVcgMHgwMDAwMDAyMAorI2RlZmluZSBPRERQIDB4MDAwMDAwNDAKKyNkZWZpbmUgRVZFTlAgMHgwMDAwMDA4MAorI2RlZmluZSBBTllQIDB4MDAwMDAwYzAKKyNkZWZpbmUgTkxERUxBWSAweDAwMDAwMzAwCisjZGVmaW5lIE5MMCAweDAwMDAwMDAwCisjZGVmaW5lIE5MMSAweDAwMDAwMTAwCisjZGVmaW5lIE5MMiAweDAwMDAwMjAwCisjZGVmaW5lIE5MMyAweDAwMDAwMzAwCisjZGVmaW5lIFRCREVMQVkgMHgwMDAwMGMwMAorI2RlZmluZSBUQUIwIDB4MDAwMDAwMDAKKyNkZWZpbmUgVEFCMSAweDAwMDAwNDAwCisjZGVmaW5lIFRBQjIgMHgwMDAwMDgwMAorI2RlZmluZSBYVEFCUyAweDAwMDAwYzAwCisjZGVmaW5lIENSREVMQVkgMHgwMDAwMzAwMAorI2RlZmluZSBDUjAgMHgwMDAwMDAwMAorI2RlZmluZSBDUjEgMHgwMDAwMTAwMAorI2RlZmluZSBDUjIgMHgwMDAwMjAwMAorI2RlZmluZSBDUjMgMHgwMDAwMzAwMAorI2RlZmluZSBWVERFTEFZIDB4MDAwMDQwMDAKKyNkZWZpbmUgRkYwIDB4MDAwMDAwMDAKKyNkZWZpbmUgRkYxIDB4MDAwMDQwMDAKKyNkZWZpbmUgQlNERUxBWSAweDAwMDA4MDAwCisjZGVmaW5lIEJTMCAweDAwMDAwMDAwCisjZGVmaW5lIEJTMSAweDAwMDA4MDAwCisjZGVmaW5lIENSVEJTIDB4MDAwMTAwMDAKKyNkZWZpbmUgUFJURVJBIDB4MDAwMjAwMDAKKyNkZWZpbmUgQ1JURVJBIDB4MDAwNDAwMDAKKyNkZWZpbmUgVElMREUgMHgwMDA4MDAwMAorI2RlZmluZSBNRE1CVUYgMHgwMDEwMDAwMAorI2RlZmluZSBMSVRPVVQgMHgwMDIwMDAwMAorI2RlZmluZSBUT1NUT1AgMHgwMDQwMDAwMAorI2RlZmluZSBGTFVTSE8gMHgwMDgwMDAwMAorI2RlZmluZSBOT0hBTkcgMHgwMTAwMDAwMAorI2RlZmluZSBMMDAxMDAwIDB4MDIwMDAwMDAKKyNkZWZpbmUgQ1JUS0lMIDB4MDQwMDAwMDAKKyNkZWZpbmUgUEFTUzggMHgwODAwMDAwMAorI2RlZmluZSBDVExFQ0ggMHgxMDAwMDAwMAorI2RlZmluZSBQRU5ESU4gMHgyMDAwMDAwMAorI2RlZmluZSBERUNDVFEgMHg0MDAwMDAwMAorI2RlZmluZSBOT0ZMU0ggMHg4MDAwMDAwMAorCitzdHJ1Y3QgdGNoYXJzIHsKKwl1X2ludCBzaXg7CisJY2hhciBjaGFyc1s2XTsKK307Cit0eXBlZGVmIHN0cnVjdCB0Y2hhcnMgdGNoYXJzOworCitzdHJ1Y3QgbHRjaGFycyB7CisJdV9pbnQgc2l4OworCWNoYXIgY2hhcnNbNl07CisJdV9pbnQgbW9kZTsKK307Cit0eXBlZGVmIHN0cnVjdCBsdGNoYXJzIGx0Y2hhcnM7CisKK3N0cnVjdCByZXhfdHR5c2l6ZSB7CisJaW50IHRzX2xpbmVzOworCWludCB0c19jb2xzOworfTsKK3R5cGVkZWYgc3RydWN0IHJleF90dHlzaXplIHJleF90dHlzaXplOworCitzdHJ1Y3QgcmV4X3R0eW1vZGUgeworCXNndHR5YiBiYXNpYzsKKwl0Y2hhcnMgbW9yZTsKKwlsdGNoYXJzIHlldG1vcmU7CisJdV9pbnQgYW5kbW9yZTsKK307Cit0eXBlZGVmIHN0cnVjdCByZXhfdHR5bW9kZSByZXhfdHR5bW9kZTsKKyNkZWZpbmUgTENSVEJTIDB4MDAwMQorI2RlZmluZSBMUFJURVJBIDB4MDAwMgorI2RlZmluZSBMQ1JURVJBIDB4MDAwNAorI2RlZmluZSBMVElMREUgMHgwMDA4CisjZGVmaW5lIExNRE1CVUYgMHgwMDEwCisjZGVmaW5lIExMSVRPVVQgMHgwMDIwCisjZGVmaW5lIExUT1NUT1AgMHgwMDQwCisjZGVmaW5lIExGTFVTSE8gMHgwMDgwCisjZGVmaW5lIExOT0hBTkcgMHgwMTAwCisjZGVmaW5lIExMMDAxMDAwIDB4MDIwMAorI2RlZmluZSBMQ1JUS0lMIDB4MDQwMAorI2RlZmluZSBMUEFTUzggMHgwODAwCisjZGVmaW5lIExDVExFQ0ggMHgxMDAwCisjZGVmaW5lIExQRU5ESU4gMHgyMDAwCisjZGVmaW5lIExERUNDVFEgMHg0MDAwCisjZGVmaW5lIExOT0ZMU0ggMHg4MDAwCisKKyNkZWZpbmUgUkVYUFJPRyAxMDAwMTcKKyNkZWZpbmUgUkVYVkVSUyAxCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2RlZmluZSBSRVhQUk9DX1NUQVJUIDEKK2V4dGVybiAgcmV4X3Jlc3VsdCAqIHJleHByb2Nfc3RhcnRfMShyZXhfc3RhcnQgKiwgQ0xJRU5UICopOworZXh0ZXJuICByZXhfcmVzdWx0ICogcmV4cHJvY19zdGFydF8xX3N2YyhyZXhfc3RhcnQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFJFWFBST0NfV0FJVCAyCitleHRlcm4gIHJleF9yZXN1bHQgKiByZXhwcm9jX3dhaXRfMSh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgcmV4X3Jlc3VsdCAqIHJleHByb2Nfd2FpdF8xX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBSRVhQUk9DX01PREVTIDMKK2V4dGVybiAgdm9pZCAqIHJleHByb2NfbW9kZXNfMShyZXhfdHR5bW9kZSAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKiByZXhwcm9jX21vZGVzXzFfc3ZjKHJleF90dHltb2RlICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBSRVhQUk9DX1dJTkNIIDQKK2V4dGVybiAgdm9pZCAqIHJleHByb2Nfd2luY2hfMShyZXhfdHR5c2l6ZSAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKiByZXhwcm9jX3dpbmNoXzFfc3ZjKHJleF90dHlzaXplICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBSRVhQUk9DX1NJR05BTCA1CitleHRlcm4gIHZvaWQgKiByZXhwcm9jX3NpZ25hbF8xKGludCAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKiByZXhwcm9jX3NpZ25hbF8xX3N2YyhpbnQgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gaW50IHJleHByb2dfMV9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKyNlbHNlIC8qIEsmUiBDICovCisjZGVmaW5lIFJFWFBST0NfU1RBUlQgMQorZXh0ZXJuICByZXhfcmVzdWx0ICogcmV4cHJvY19zdGFydF8xKCk7CitleHRlcm4gIHJleF9yZXN1bHQgKiByZXhwcm9jX3N0YXJ0XzFfc3ZjKCk7CisjZGVmaW5lIFJFWFBST0NfV0FJVCAyCitleHRlcm4gIHJleF9yZXN1bHQgKiByZXhwcm9jX3dhaXRfMSgpOworZXh0ZXJuICByZXhfcmVzdWx0ICogcmV4cHJvY193YWl0XzFfc3ZjKCk7CisjZGVmaW5lIFJFWFBST0NfTU9ERVMgMworZXh0ZXJuICB2b2lkICogcmV4cHJvY19tb2Rlc18xKCk7CitleHRlcm4gIHZvaWQgKiByZXhwcm9jX21vZGVzXzFfc3ZjKCk7CisjZGVmaW5lIFJFWFBST0NfV0lOQ0ggNAorZXh0ZXJuICB2b2lkICogcmV4cHJvY193aW5jaF8xKCk7CitleHRlcm4gIHZvaWQgKiByZXhwcm9jX3dpbmNoXzFfc3ZjKCk7CisjZGVmaW5lIFJFWFBST0NfU0lHTkFMIDUKK2V4dGVybiAgdm9pZCAqIHJleHByb2Nfc2lnbmFsXzEoKTsKK2V4dGVybiAgdm9pZCAqIHJleHByb2Nfc2lnbmFsXzFfc3ZjKCk7CitleHRlcm4gaW50IHJleHByb2dfMV9mcmVlcmVzdWx0ICgpOworI2VuZGlmIC8qIEsmUiBDICovCisKKy8qIHRoZSB4ZHIgZnVuY3Rpb25zICovCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICBib29sX3QgeGRyX3JleHN0cmluZyAoWERSICosIHJleHN0cmluZyopOworZXh0ZXJuICBib29sX3QgeGRyX3JleF9zdGFydCAoWERSICosIHJleF9zdGFydCopOworZXh0ZXJuICBib29sX3QgeGRyX3JleF9yZXN1bHQgKFhEUiAqLCByZXhfcmVzdWx0Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfc2d0dHliIChYRFIgKiwgc2d0dHliKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfdGNoYXJzIChYRFIgKiwgdGNoYXJzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbHRjaGFycyAoWERSICosIGx0Y2hhcnMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9yZXhfdHR5c2l6ZSAoWERSICosIHJleF90dHlzaXplKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfcmV4X3R0eW1vZGUgKFhEUiAqLCByZXhfdHR5bW9kZSopOworCisjZWxzZSAvKiBLJlIgQyAqLworZXh0ZXJuIGJvb2xfdCB4ZHJfcmV4c3RyaW5nICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfcmV4X3N0YXJ0ICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfcmV4X3Jlc3VsdCAoKTsKK2V4dGVybiBib29sX3QgeGRyX3NndHR5YiAoKTsKK2V4dGVybiBib29sX3QgeGRyX3RjaGFycyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2x0Y2hhcnMgKCk7CitleHRlcm4gYm9vbF90IHhkcl9yZXhfdHR5c2l6ZSAoKTsKK2V4dGVybiBib29sX3QgeGRyX3JleF90dHltb2RlICgpOworCisjZW5kaWYgLyogSyZSIEMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFfUkVYX0hfUlBDR0VOICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9yZXgueCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3JleC54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YmFmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9yZXgueApAQCAtMCwwICsxLDIyOSBAQAorLyogQCgjKXJleC54CTIuMSA4OC8wOC8wMSA0LjAgUlBDU1JDICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBSZW1vdGUgZXhlY3V0aW9uIChyZXgpIHByb3RvY29sIHNwZWNpZmljYXRpb24KKyAqLworCitjb25zdCBTVFJJTkdTSVpFID0gMTAyNDsKK3R5cGVkZWYgc3RyaW5nIHJleHN0cmluZzwxMDI0PjsKKworLyoKKyAqIHZhbHVlcyB0byBwYXNzIHRvIFJFWFBST0NfU0lHTkFMCisgKi8KK2NvbnN0IFNJR0lOVCA9IDI7CS8qIGludGVycnVwdCAqLworCisvKgorICogVmFsdWVzIGZvciByc3RfZmxhZ3MsIGJlbG93CisgKi8KK2NvbnN0IFJFWF9JTlRFUkFDVElWRSA9IDE7CS8qIGludGVyYWN0aXZlIG1vZGUgKi8KKworc3RydWN0IHJleF9zdGFydCB7CisJcmV4c3RyaW5nIHJzdF9jbWQ8PjsJLyogbGlzdCBvZiBjb21tYW5kIGFuZCBhcmdzICovCisJcmV4c3RyaW5nIHJzdF9ob3N0OwkvKiB3b3JraW5nIGRpcmVjdG9yeSBob3N0IG5hbWUgKi8KKwlyZXhzdHJpbmcgcnN0X2ZzbmFtZTsJLyogd29ya2luZyBkaXJlY3RvcnkgZmlsZSBzeXN0ZW0gbmFtZSAqLworCXJleHN0cmluZyByc3RfZGlyd2l0aGluOy8qIHdvcmtpbmcgZGlyZWN0b3J5IHdpdGhpbiBmaWxlIHN5c3RlbSAqLworCXJleHN0cmluZyByc3RfZW52PD47CS8qIGxpc3Qgb2YgZW52aXJvbm1lbnQgKi8KKwl1bnNpZ25lZCBpbnQgcnN0X3BvcnQwOwkvKiBwb3J0IGZvciBzdGRpbiAqLworCXVuc2lnbmVkIGludCByc3RfcG9ydDE7CS8qIHBvcnQgZm9yIHN0ZG91dCAqLworCXVuc2lnbmVkIGludCByc3RfcG9ydDI7CS8qIHBvcnQgZm9yIHN0ZGVyciAqLworCXVuc2lnbmVkIGludCByc3RfZmxhZ3M7CS8qIG9wdGlvbnMgLSBzZWUgY29uc3QgYWJvdmUgKi8KK307CisKK3N0cnVjdCByZXhfcmVzdWx0IHsKKyAgIAlpbnQgcmx0X3N0YXQ7CQkvKiBpbnRlZ2VyIHN0YXR1cyBjb2RlICovCisJcmV4c3RyaW5nIHJsdF9tZXNzYWdlOwkvKiBzdHJpbmcgbWVzc2FnZSBmb3IgaHVtYW4gY29uc3VtcHRpb24gKi8KK307CisKKworc3RydWN0IHNndHR5YiB7CisJdW5zaWduZWQgZm91cjsJLyogYWx3YXlzIGVxdWFscyA0ICovCisJb3BhcXVlIGNoYXJzWzRdOworCS8qIGNoYXJzWzBdID09IGlucHV0IHNwZWVkICovCisJLyogY2hhcnNbMV0gPT0gb3V0cHV0IHNwZWVkICovCisJLyogY2hhcnNbMl0gPT0ga2lsbCBjaGFyYWN0ZXIgKi8KKwkvKiBjaGFyc1szXSA9PSBlcmFzZSBjaGFyYWN0ZXIgKi8KKwl1bnNpZ25lZCBmbGFnczsKK307CisvKiB2YWx1ZXMgZm9yIHNwZWVkcyBhYm92ZSAoYmF1ZCByYXRlcykgICovCitjb25zdCBCMCAgPSAwOworY29uc3QgQjUwID0gMTsKK2NvbnN0IEI3NSA9IDI7Citjb25zdCBCMTEwID0gMzsKK2NvbnN0IEIxMzQgPSA0OworY29uc3QgQjE1MCA9IDU7Citjb25zdCBCMjAwID0gNjsKK2NvbnN0IEIzMDAgPSA3OworY29uc3QgQjYwMCA9IDg7Citjb25zdCBCMTIwMCA9IDk7Citjb25zdCBCMTgwMCA9IDEwOworY29uc3QgQjI0MDAgPSAxMTsKK2NvbnN0IEI0ODAwID0gMTI7Citjb25zdCBCOTYwMCA9IDEzOworY29uc3QgQjE5MjAwID0gMTQ7Citjb25zdCBCMzg0MDAgPSAxNTsKKworLyogdmFsdWVzIGZvciBmbGFncyBhYm92ZSAqLworY29uc3QgVEFOREVNID0gMHgwMDAwMDAwMTsgLyogc2VuZCBzdG9wYyBvbiBvdXQgcSBmdWxsICovCitjb25zdCBDQlJFQUsgPSAweDAwMDAwMDAyOyAvKiBoYWxmLWNvb2tlZCBtb2RlICovCitjb25zdCBMQ0FTRSA9IDB4MDAwMDAwMDQ7IC8qIHNpbXVsYXRlIGxvd2VyIGNhc2UgKi8KK2NvbnN0IEVDSE8gPSAweDAwMDAwMDA4OyAvKiBlY2hvIGlucHV0ICovCitjb25zdCBDUk1PRCA9IDB4MDAwMDAwMTA7IC8qIG1hcCBcciB0byBcclxuIG9uIG91dHB1dCAqLworY29uc3QgUkFXID0gMHgwMDAwMDAyMDsgLyogbm8gaS9vIHByb2Nlc3NpbmcgKi8KK2NvbnN0IE9ERFAgPSAweDAwMDAwMDQwOyAvKiBnZXQvc2VuZCBvZGQgcGFyaXR5ICovCitjb25zdCBFVkVOUCA9IDB4MDAwMDAwODA7IC8qIGdldC9zZW5kIGV2ZW4gcGFyaXR5ICovCitjb25zdCBBTllQID0gMHgwMDAwMDBjMDsgLyogZ2V0IGFueSBwYXJpdHkvc2VuZCBub25lICovCitjb25zdCBOTERFTEFZID0gMHgwMDAwMDMwMDsgLyogXG4gZGVsYXkgKi8KK2NvbnN0ICBOTDAgPSAweDAwMDAwMDAwOworY29uc3QgIE5MMSA9IDB4MDAwMDAxMDA7IC8qIHR0eSAzNyAqLworY29uc3QgIE5MMiA9IDB4MDAwMDAyMDA7IC8qIHZ0MDUgKi8KK2NvbnN0ICBOTDMgPSAweDAwMDAwMzAwOworY29uc3QgVEJERUxBWSA9IDB4MDAwMDBjMDA7IC8qIGhvcml6b250YWwgdGFiIGRlbGF5ICovCitjb25zdCAgVEFCMCA9IDB4MDAwMDAwMDA7Citjb25zdCAgVEFCMSA9IDB4MDAwMDA0MDA7IC8qIHR0eSAzNyAqLworY29uc3QgIFRBQjIgPSAweDAwMDAwODAwOworY29uc3QgWFRBQlMgPSAweDAwMDAwYzAwOyAvKiBleHBhbmQgdGFicyBvbiBvdXRwdXQgKi8KK2NvbnN0IENSREVMQVkgPSAweDAwMDAzMDAwOyAvKiBcciBkZWxheSAqLworY29uc3QgIENSMCA9IDB4MDAwMDAwMDA7Citjb25zdCAgQ1IxID0gMHgwMDAwMTAwMDsgLyogdG4gMzAwICovCitjb25zdCAgQ1IyID0gMHgwMDAwMjAwMDsgLyogdHR5IDM3ICovCitjb25zdCAgQ1IzID0gMHgwMDAwMzAwMDsgLyogY29uY2VwdCAxMDAgKi8KK2NvbnN0IFZUREVMQVkgPSAweDAwMDA0MDAwOyAvKiB2ZXJ0aWNhbCB0YWIgZGVsYXkgKi8KK2NvbnN0ICBGRjAgPSAweDAwMDAwMDAwOworY29uc3QgIEZGMSA9IDB4MDAwMDQwMDA7IC8qIHR0eSAzNyAqLworY29uc3QgQlNERUxBWSA9IDB4MDAwMDgwMDA7IC8qIFxiIGRlbGF5ICovCitjb25zdCAgQlMwID0gMHgwMDAwMDAwMDsKK2NvbnN0ICBCUzEgPSAweDAwMDA4MDAwOworY29uc3QgQ1JUQlMgPSAweDAwMDEwMDAwOyAvKiBkbyBiYWNrc3BhY2luZyBmb3IgY3J0ICovCitjb25zdCBQUlRFUkEgPSAweDAwMDIwMDAwOyAvKiBcIC4uLiAvIGVyYXNlICovCitjb25zdCBDUlRFUkEgPSAweDAwMDQwMDAwOyAvKiAiIFxiICIgdG8gd2lwZSBvdXQgY2hhciAqLworY29uc3QgVElMREUgPSAweDAwMDgwMDAwOyAvKiBoYXplbHRpbmUgdGlsZGUga2x1ZGdlICovCitjb25zdCBNRE1CVUYgPSAweDAwMTAwMDAwOyAvKiBzdGFydC9zdG9wIG91dHB1dCBvbiBjYXJyaWVyIGludHIgKi8KK2NvbnN0IExJVE9VVCA9IDB4MDAyMDAwMDA7IC8qIGxpdGVyYWwgb3V0cHV0ICovCitjb25zdCBUT1NUT1AgPSAweDAwNDAwMDAwOyAvKiBTSUdUVE9VIG9uIGJhY2tncm91bmQgb3V0cHV0ICovCitjb25zdCBGTFVTSE8gPSAweDAwODAwMDAwOyAvKiBmbHVzaCBvdXRwdXQgdG8gdGVybWluYWwgKi8KK2NvbnN0IE5PSEFORyA9IDB4MDEwMDAwMDA7IC8qIG5vIFNJR0hVUCBvbiBjYXJyaWVyIGRyb3AgKi8KK2NvbnN0IEwwMDEwMDAgPSAweDAyMDAwMDAwOworY29uc3QgQ1JUS0lMID0gMHgwNDAwMDAwMDsgLyoga2lsbCBsaW5lIHdpdGggIiBcYiAiICovCitjb25zdCBQQVNTOCA9IDB4MDgwMDAwMDA7Citjb25zdCBDVExFQ0ggPSAweDEwMDAwMDAwOyAvKiBlY2hvIGNvbnRyb2wgY2hhcnMgYXMgXlggKi8KK2NvbnN0IFBFTkRJTiA9IDB4MjAwMDAwMDA7IC8qIHRwLT50X3Jhd3EgbmVlZHMgcmVyZWFkICovCitjb25zdCBERUNDVFEgPSAweDQwMDAwMDAwOyAvKiBvbmx5IF5RIHN0YXJ0cyBhZnRlciBeUyAqLworY29uc3QgTk9GTFNIID0gMHg4MDAwMDAwMDsgLyogbm8gb3V0cHV0IGZsdXNoIG9uIHNpZ25hbCAqLworCitzdHJ1Y3QgdGNoYXJzIHsKKwl1bnNpZ25lZCBzaXg7CS8qIGFsd2F5cyBlcXVhbHMgNiAqLworCW9wYXF1ZSBjaGFyc1s2XTsKKwkvKiBjaGFyc1swXSA9PSBpbnRlcnJ1cHQgY2hhciAqLworCS8qIGNoYXJzWzFdID09IHF1aXQgY2hhciAqLworCS8qIGNoYXJzWzJdID09IHN0YXJ0IG91dHB1dCBjaGFyICovCisJLyogY2hhcnNbM10gPT0gc3RvcCBvdXRwdXQgY2hhciAqLworCS8qIGNoYXJzWzRdID09IGVuZC1vZi1maWxlIGNoYXIgKi8KKwkvKiBjaGFyc1s1XSA9PSBpbnB1dCBkZWxpbWl0ZXIgKGxpa2UgbmwpICovCit9OworCitzdHJ1Y3QgbHRjaGFycyB7CisJdW5zaWduZWQgc2l4OwkvKiBhbHdheXMgZXF1YWxzIDYgKi8KKwlvcGFxdWUgY2hhcnNbNl07CisJLyogY2hhcnNbMF0gPT0gc3RvcCBwcm9jZXNzIHNpZ25hbCAqLworCS8qIGNoYXJzWzFdID09IGRlbGF5ZWQgc3RvcCBwcm9jZXNzIHNpZ25hbCAqLworCS8qIGNoYXJzWzJdID09IHJlcHJpbnQgbGluZSAqLworCS8qIGNoYXJzWzNdID09IGZsdXNoIG91dHB1dCAqLworCS8qIGNoYXJzWzRdID09IHdvcmQgZXJhc2UgKi8KKwkvKiBjaGFyc1s1XSA9PSBsaXRlcmFsIG5leHQgY2hhcmFjdGVyICovCisJdW5zaWduZWQgbW9kZTsKK307CisKK3N0cnVjdCByZXhfdHR5c2l6ZSB7CisJaW50IHRzX2xpbmVzOworCWludCB0c19jb2xzOworfTsKKworc3RydWN0IHJleF90dHltb2RlIHsKKyAgICBzZ3R0eWIgYmFzaWM7ICAgIC8qIHN0YW5kYXJkIHVuaXggdHR5IGZsYWdzICovCisgICAgdGNoYXJzIG1vcmU7IC8qIGludGVycnVwdCwga2lsbCBjaGFyYWN0ZXJzLCBldGMuICovCisgICAgbHRjaGFycyB5ZXRtb3JlOyAvKiBzcGVjaWFsIEJlcmtlbGV5IGNoYXJhY3RlcnMgKi8KKyAgICB1bnNpZ25lZCBhbmRtb3JlOyAgICAgLyogYW5kIEJlcmtlbGV5IG1vZGVzICovCit9OworCisvKiB2YWx1ZXMgZm9yIGFuZG1vcmUgYWJvdmUgKi8KK2NvbnN0IExDUlRCUyA9IDB4MDAwMTsJLyogZG8gYmFja3NwYWNpbmcgZm9yIGNydCAqLworY29uc3QgTFBSVEVSQSA9IDB4MDAwMjsJLyogXCAuLi4gLyBlcmFzZSAqLworY29uc3QgTENSVEVSQSA9IDB4MDAwNDsJLyogIiBcYiAiIHRvIHdpcGUgb3V0IGNoYXIgKi8KK2NvbnN0IExUSUxERSA9IDB4MDAwODsJLyogaGF6ZWx0aW5lIHRpbGRlIGtsdWRnZSAqLworY29uc3QgTE1ETUJVRiA9IDB4MDAxMDsJLyogc3RhcnQvc3RvcCBvdXRwdXQgb24gY2FycmllciBpbnRyICovCitjb25zdCBMTElUT1VUID0gMHgwMDIwOwkvKiBsaXRlcmFsIG91dHB1dCAqLworY29uc3QgTFRPU1RPUCA9IDB4MDA0MDsJLyogU0lHVFRPVSBvbiBiYWNrZ3JvdW5kIG91dHB1dCAqLworY29uc3QgTEZMVVNITyA9IDB4MDA4MDsJLyogZmx1c2ggb3V0cHV0IHRvIHRlcm1pbmFsICovCitjb25zdCBMTk9IQU5HID0gMHgwMTAwOwkvKiBubyBTSUdIVVAgb24gY2FycmllciBkcm9wICovCitjb25zdCBMTDAwMTAwMCA9IDB4MDIwMDsKK2NvbnN0IExDUlRLSUwgPSAweDA0MDA7CS8qIGtpbGwgbGluZSB3aXRoICIgXGIgIiAqLworY29uc3QgTFBBU1M4ID0gMHgwODAwOworY29uc3QgTENUTEVDSCA9IDB4MTAwMDsJLyogZWNobyBjb250cm9sIGNoYXJzIGFzIF5YICovCitjb25zdCBMUEVORElOID0gMHgyMDAwOwkvKiBuZWVkcyByZXJlYWQgKi8KK2NvbnN0IExERUNDVFEgPSAweDQwMDA7CS8qIG9ubHkgXlEgc3RhcnRzIGFmdGVyIF5TICovCitjb25zdCBMTk9GTFNIID0gMHg4MDAwOwkvKiBubyBvdXRwdXQgZmx1c2ggb24gc2lnbmFsICovCisKK3Byb2dyYW0gUkVYUFJPRyB7CisJdmVyc2lvbiBSRVhWRVJTIHsKKworCQkvKgorCQkgKiBTdGFydCByZW1vdGUgZXhlY3V0aW9uCisJCSAqLworCQlyZXhfcmVzdWx0CisJCVJFWFBST0NfU1RBUlQocmV4X3N0YXJ0KSA9IDE7CisKKwkJLyoKKwkJICogV2FpdCBmb3IgcmVtb3RlIGV4ZWN1dGlvbiB0byB0ZXJtaW5hdGUKKwkJICovCisJCXJleF9yZXN1bHQKKwkJUkVYUFJPQ19XQUlUKHZvaWQpID0gMjsKKworCQkvKgorCQkgKiBTZW5kIHR0eSBtb2RlcworCQkgKi8KKwkJdm9pZAorCQlSRVhQUk9DX01PREVTKHJleF90dHltb2RlKSA9IDM7CisKKwkJLyoKKwkJICogU2VuZCB3aW5kb3cgc2l6ZSBjaGFuZ2UKKwkJICovCisJCXZvaWQKKwkJUkVYUFJPQ19XSU5DSChyZXhfdHR5c2l6ZSkgPSA0OworCisJCS8qCisJCSAqIFNlbmQgb3RoZXIgc2lnbmFsCisJCSAqLworCQl2b2lkCisJCVJFWFBST0NfU0lHTkFMKGludCkgPSA1OworCX0gPSAxOworfSA9IDEwMDAxNzsKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3JxdW90YS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcnF1b3RhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwNjQ2MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3JxdW90YS5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLgorICogSXQgd2FzIGdlbmVyYXRlZCB1c2luZyBycGNnZW4uCisgKi8KKworI2lmbmRlZiBfUlFVT1RBX0hfUlBDR0VOCisjZGVmaW5lIF9SUVVPVEFfSF9SUENHRU4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgUlFfUEFUSExFTiAxMDI0CisKK3N0cnVjdCBnZXRxdW90YV9hcmdzIHsKKwljaGFyICpncWFfcGF0aHA7CisJaW50IGdxYV91aWQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZ2V0cXVvdGFfYXJncyBnZXRxdW90YV9hcmdzOworCitzdHJ1Y3QgcnF1b3RhIHsKKwlpbnQgcnFfYnNpemU7CisJYm9vbF90IHJxX2FjdGl2ZTsKKwl1X2ludCBycV9iaGFyZGxpbWl0OworCXVfaW50IHJxX2Jzb2Z0bGltaXQ7CisJdV9pbnQgcnFfY3VyYmxvY2tzOworCXVfaW50IHJxX2ZoYXJkbGltaXQ7CisJdV9pbnQgcnFfZnNvZnRsaW1pdDsKKwl1X2ludCBycV9jdXJmaWxlczsKKwl1X2ludCBycV9idGltZWxlZnQ7CisJdV9pbnQgcnFfZnRpbWVsZWZ0OworfTsKK3R5cGVkZWYgc3RydWN0IHJxdW90YSBycXVvdGE7CisKK2VudW0gZ3FyX3N0YXR1cyB7CisJUV9PSyA9IDEsCisJUV9OT1FVT1RBID0gMiwKKwlRX0VQRVJNID0gMywKK307Cit0eXBlZGVmIGVudW0gZ3FyX3N0YXR1cyBncXJfc3RhdHVzOworCitzdHJ1Y3QgZ2V0cXVvdGFfcnNsdCB7CisJZ3FyX3N0YXR1cyBzdGF0dXM7CisJdW5pb24geworCQlycXVvdGEgZ3FyX3JxdW90YTsKKwl9IGdldHF1b3RhX3JzbHRfdTsKK307Cit0eXBlZGVmIHN0cnVjdCBnZXRxdW90YV9yc2x0IGdldHF1b3RhX3JzbHQ7CisKKyNkZWZpbmUgUlFVT1RBUFJPRyAxMDAwMTEKKyNkZWZpbmUgUlFVT1RBVkVSUyAxCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2RlZmluZSBSUVVPVEFQUk9DX0dFVFFVT1RBIDEKK2V4dGVybiAgZ2V0cXVvdGFfcnNsdCAqIHJxdW90YXByb2NfZ2V0cXVvdGFfMShnZXRxdW90YV9hcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgZ2V0cXVvdGFfcnNsdCAqIHJxdW90YXByb2NfZ2V0cXVvdGFfMV9zdmMoZ2V0cXVvdGFfYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgUlFVT1RBUFJPQ19HRVRBQ1RJVkVRVU9UQSAyCitleHRlcm4gIGdldHF1b3RhX3JzbHQgKiBycXVvdGFwcm9jX2dldGFjdGl2ZXF1b3RhXzEoZ2V0cXVvdGFfYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIGdldHF1b3RhX3JzbHQgKiBycXVvdGFwcm9jX2dldGFjdGl2ZXF1b3RhXzFfc3ZjKGdldHF1b3RhX2FyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gaW50IHJxdW90YXByb2dfMV9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKyNlbHNlIC8qIEsmUiBDICovCisjZGVmaW5lIFJRVU9UQVBST0NfR0VUUVVPVEEgMQorZXh0ZXJuICBnZXRxdW90YV9yc2x0ICogcnF1b3RhcHJvY19nZXRxdW90YV8xKCk7CitleHRlcm4gIGdldHF1b3RhX3JzbHQgKiBycXVvdGFwcm9jX2dldHF1b3RhXzFfc3ZjKCk7CisjZGVmaW5lIFJRVU9UQVBST0NfR0VUQUNUSVZFUVVPVEEgMgorZXh0ZXJuICBnZXRxdW90YV9yc2x0ICogcnF1b3RhcHJvY19nZXRhY3RpdmVxdW90YV8xKCk7CitleHRlcm4gIGdldHF1b3RhX3JzbHQgKiBycXVvdGFwcm9jX2dldGFjdGl2ZXF1b3RhXzFfc3ZjKCk7CitleHRlcm4gaW50IHJxdW90YXByb2dfMV9mcmVlcmVzdWx0ICgpOworI2VuZGlmIC8qIEsmUiBDICovCisKKy8qIHRoZSB4ZHIgZnVuY3Rpb25zICovCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICBib29sX3QgeGRyX2dldHF1b3RhX2FyZ3MgKFhEUiAqLCBnZXRxdW90YV9hcmdzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfcnF1b3RhIChYRFIgKiwgcnF1b3RhKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZ3FyX3N0YXR1cyAoWERSICosIGdxcl9zdGF0dXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9nZXRxdW90YV9yc2x0IChYRFIgKiwgZ2V0cXVvdGFfcnNsdCopOworCisjZWxzZSAvKiBLJlIgQyAqLworZXh0ZXJuIGJvb2xfdCB4ZHJfZ2V0cXVvdGFfYXJncyAoKTsKK2V4dGVybiBib29sX3QgeGRyX3JxdW90YSAoKTsKK2V4dGVybiBib29sX3QgeGRyX2dxcl9zdGF0dXMgKCk7CitleHRlcm4gYm9vbF90IHhkcl9nZXRxdW90YV9yc2x0ICgpOworCisjZW5kaWYgLyogSyZSIEMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFfUlFVT1RBX0hfUlBDR0VOICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ycXVvdGEueCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3JxdW90YS54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyODg4ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ycXVvdGEueApAQCAtMCwwICsxLDYxIEBACisvKiBAKCMpcnF1b3RhLngJMi4xIDg4LzA4LzAxIDQuMCBSUENTUkMgKi8KKy8qIEAoIylycXVvdGEueCAxLjIgODcvMDkvMjAgQ29weXIgMTk4NyBTdW4gTWljcm8gKi8KKworLyoKKyAqIFJlbW90ZSBxdW90YSBwcm90b2NvbAorICogUmVxdWlyZXMgdW5peCBhdXRoZW50aWNhdGlvbgorICovCisKK2NvbnN0IFJRX1BBVEhMRU4gPSAxMDI0OworCitzdHJ1Y3QgZ2V0cXVvdGFfYXJncyB7CisJc3RyaW5nIGdxYV9wYXRocDxSUV9QQVRITEVOPjsgIAkvKiBwYXRoIHRvIGZpbGVzeXN0ZW0gb2YgaW50ZXJlc3QgKi8KKwlpbnQgZ3FhX3VpZDsJICAgICAgICAJLyogaW5xdWlyZSBhYm91dCBxdW90YSBmb3IgdWlkICovCit9OworCisvKgorICogcmVtb3RlIHF1b3RhIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgcnF1b3RhIHsKKwlpbnQgcnFfYnNpemU7CQkJLyogYmxvY2sgc2l6ZSBmb3IgYmxvY2sgY291bnRzICovCisJYm9vbCBycV9hY3RpdmU7ICAJCS8qIGluZGljYXRlcyB3aGV0aGVyIHF1b3RhIGlzIGFjdGl2ZSAqLworCXVuc2lnbmVkIGludCBycV9iaGFyZGxpbWl0OwkvKiBhYnNvbHV0ZSBsaW1pdCBvbiBkaXNrIGJsa3MgYWxsb2MgKi8KKwl1bnNpZ25lZCBpbnQgcnFfYnNvZnRsaW1pdDsJLyogcHJlZmVycmVkIGxpbWl0IG9uIGRpc2sgYmxrcyAqLworCXVuc2lnbmVkIGludCBycV9jdXJibG9ja3M7CS8qIGN1cnJlbnQgYmxvY2sgY291bnQgKi8KKwl1bnNpZ25lZCBpbnQgcnFfZmhhcmRsaW1pdDsJLyogYWJzb2x1dGUgbGltaXQgb24gYWxsb2NhdGVkIGZpbGVzICovCisJdW5zaWduZWQgaW50IHJxX2Zzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBmaWxlIGxpbWl0ICovCisJdW5zaWduZWQgaW50IHJxX2N1cmZpbGVzOwkvKiBjdXJyZW50ICMgYWxsb2NhdGVkIGZpbGVzICovCisJdW5zaWduZWQgaW50IHJxX2J0aW1lbGVmdDsJLyogdGltZSBsZWZ0IGZvciBleGNlc3NpdmUgZGlzayB1c2UgKi8KKwl1bnNpZ25lZCBpbnQgcnFfZnRpbWVsZWZ0OwkvKiB0aW1lIGxlZnQgZm9yIGV4Y2Vzc2l2ZSBmaWxlcyAqLworfTsJCisKK2VudW0gZ3FyX3N0YXR1cyB7CisJUV9PSyA9IDEsCQkvKiBxdW90YSByZXR1cm5lZCAqLworCVFfTk9RVU9UQSA9IDIsICAJLyogbm9xdW90YSBmb3IgdWlkICovCisJUV9FUEVSTSA9IDMJCS8qIG5vIHBlcm1pc3Npb24gdG8gYWNjZXNzIHF1b3RhICovCit9OworCit1bmlvbiBnZXRxdW90YV9yc2x0IHN3aXRjaCAoZ3FyX3N0YXR1cyBzdGF0dXMpIHsKK2Nhc2UgUV9PSzoKKwlycXVvdGEgZ3FyX3JxdW90YTsJLyogdmFsaWQgaWYgc3RhdHVzID09IFFfT0sgKi8KK2Nhc2UgUV9OT1FVT1RBOgorCXZvaWQ7CitjYXNlIFFfRVBFUk06CisJdm9pZDsKK307CisKK3Byb2dyYW0gUlFVT1RBUFJPRyB7CisJdmVyc2lvbiBSUVVPVEFWRVJTIHsKKwkJLyoKKwkJICogR2V0IGFsbCBxdW90YXMKKwkJICovCisJCWdldHF1b3RhX3JzbHQKKwkJUlFVT1RBUFJPQ19HRVRRVU9UQShnZXRxdW90YV9hcmdzKSA9IDE7CisKKwkJLyoKKwkgCSAqIEdldCBhY3RpdmUgcXVvdGFzIG9ubHkKKwkJICovCisJCWdldHF1b3RhX3JzbHQKKwkJUlFVT1RBUFJPQ19HRVRBQ1RJVkVRVU9UQShnZXRxdW90YV9hcmdzKSA9IDI7CisJfSA9IDE7Cit9ID0gMTAwMDExOwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcnN0YXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3JzdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjMGJhOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3JzdGF0LmgKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLgorICogSXQgd2FzIGdlbmVyYXRlZCB1c2luZyBycGNnZW4uCisgKi8KKworI2lmbmRlZiBfUlNUQVRfSF9SUENHRU4KKyNkZWZpbmUgX1JTVEFUX0hfUlBDR0VOCisKKyNpbmNsdWRlIDxycGMvcnBjLmg+CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZuZGVmIEZTQ0FMRQorLyoKKyAqIFNjYWxlIGZhY3RvciBmb3Igc2NhbGVkIGludGVnZXJzIHVzZWQgdG8gY291bnQgbG9hZCBhdmVyYWdlcy4KKyAqLworI2RlZmluZSBGU0hJRlQgOCAvKiBiaXRzIHRvIHJpZ2h0IG9mIGZpeGVkIGJpbmFyeSBwb2ludCAqLworI2RlZmluZSBGU0NBTEUgKDE8PEZTSElGVCkKKworI2VuZGlmIC8qIG5kZWYgRlNDQUxFICovCisjZGVmaW5lIENQVVNUQVRFUyA0CisjZGVmaW5lIERLX05EUklWRSA0CisKK3N0cnVjdCByc3RhdF90aW1ldmFsIHsKKwl1X2ludCB0dl9zZWM7CisJdV9pbnQgdHZfdXNlYzsKK307Cit0eXBlZGVmIHN0cnVjdCByc3RhdF90aW1ldmFsIHJzdGF0X3RpbWV2YWw7CisKK3N0cnVjdCBzdGF0c3RpbWUgeworCWludCBjcF90aW1lW0NQVVNUQVRFU107CisJaW50IGRrX3hmZXJbREtfTkRSSVZFXTsKKwl1X2ludCB2X3BncGdpbjsKKwl1X2ludCB2X3BncGdvdXQ7CisJdV9pbnQgdl9wc3dwaW47CisJdV9pbnQgdl9wc3dwb3V0OworCXVfaW50IHZfaW50cjsKKwlpbnQgaWZfaXBhY2tldHM7CisJaW50IGlmX2llcnJvcnM7CisJaW50IGlmX29lcnJvcnM7CisJaW50IGlmX2NvbGxpc2lvbnM7CisJdV9pbnQgdl9zd3RjaDsKKwlpbnQgYXZlbnJ1blszXTsKKwlyc3RhdF90aW1ldmFsIGJvb3R0aW1lOworCXJzdGF0X3RpbWV2YWwgY3VydGltZTsKKwlpbnQgaWZfb3BhY2tldHM7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgc3RhdHN0aW1lIHN0YXRzdGltZTsKKworc3RydWN0IHN0YXRzc3d0Y2ggeworCWludCBjcF90aW1lW0NQVVNUQVRFU107CisJaW50IGRrX3hmZXJbREtfTkRSSVZFXTsKKwl1X2ludCB2X3BncGdpbjsKKwl1X2ludCB2X3BncGdvdXQ7CisJdV9pbnQgdl9wc3dwaW47CisJdV9pbnQgdl9wc3dwb3V0OworCXVfaW50IHZfaW50cjsKKwlpbnQgaWZfaXBhY2tldHM7CisJaW50IGlmX2llcnJvcnM7CisJaW50IGlmX29lcnJvcnM7CisJaW50IGlmX2NvbGxpc2lvbnM7CisJdV9pbnQgdl9zd3RjaDsKKwl1X2ludCBhdmVucnVuWzNdOworCXJzdGF0X3RpbWV2YWwgYm9vdHRpbWU7CisJaW50IGlmX29wYWNrZXRzOworfTsKK3R5cGVkZWYgc3RydWN0IHN0YXRzc3d0Y2ggc3RhdHNzd3RjaDsKKworc3RydWN0IHN0YXRzIHsKKwlpbnQgY3BfdGltZVtDUFVTVEFURVNdOworCWludCBka194ZmVyW0RLX05EUklWRV07CisJdV9pbnQgdl9wZ3BnaW47CisJdV9pbnQgdl9wZ3Bnb3V0OworCXVfaW50IHZfcHN3cGluOworCXVfaW50IHZfcHN3cG91dDsKKwl1X2ludCB2X2ludHI7CisJaW50IGlmX2lwYWNrZXRzOworCWludCBpZl9pZXJyb3JzOworCWludCBpZl9vZXJyb3JzOworCWludCBpZl9jb2xsaXNpb25zOworCWludCBpZl9vcGFja2V0czsKK307Cit0eXBlZGVmIHN0cnVjdCBzdGF0cyBzdGF0czsKKworI2RlZmluZSBSU1RBVFBST0cgMTAwMDAxCisjZGVmaW5lIFJTVEFUVkVSU19USU1FIDMKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIFJTVEFUUFJPQ19TVEFUUyAxCitleHRlcm4gIHN0YXRzdGltZSAqIHJzdGF0cHJvY19zdGF0c18zKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICBzdGF0c3RpbWUgKiByc3RhdHByb2Nfc3RhdHNfM19zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgUlNUQVRQUk9DX0hBVkVESVNLIDIKK2V4dGVybiAgdV9pbnQgKiByc3RhdHByb2NfaGF2ZWRpc2tfMyh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgdV9pbnQgKiByc3RhdHByb2NfaGF2ZWRpc2tfM19zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiBpbnQgcnN0YXRwcm9nXzNfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisjZWxzZSAvKiBLJlIgQyAqLworI2RlZmluZSBSU1RBVFBST0NfU1RBVFMgMQorZXh0ZXJuICBzdGF0c3RpbWUgKiByc3RhdHByb2Nfc3RhdHNfMygpOworZXh0ZXJuICBzdGF0c3RpbWUgKiByc3RhdHByb2Nfc3RhdHNfM19zdmMoKTsKKyNkZWZpbmUgUlNUQVRQUk9DX0hBVkVESVNLIDIKK2V4dGVybiAgdV9pbnQgKiByc3RhdHByb2NfaGF2ZWRpc2tfMygpOworZXh0ZXJuICB1X2ludCAqIHJzdGF0cHJvY19oYXZlZGlza18zX3N2YygpOworZXh0ZXJuIGludCByc3RhdHByb2dfM19mcmVlcmVzdWx0ICgpOworI2VuZGlmIC8qIEsmUiBDICovCisjZGVmaW5lIFJTVEFUVkVSU19TV1RDSCAyCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICBzdGF0c3N3dGNoICogcnN0YXRwcm9jX3N0YXRzXzIodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHN0YXRzc3d0Y2ggKiByc3RhdHByb2Nfc3RhdHNfMl9zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiAgdV9pbnQgKiByc3RhdHByb2NfaGF2ZWRpc2tfMih2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgdV9pbnQgKiByc3RhdHByb2NfaGF2ZWRpc2tfMl9zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiBpbnQgcnN0YXRwcm9nXzJfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisjZWxzZSAvKiBLJlIgQyAqLworZXh0ZXJuICBzdGF0c3N3dGNoICogcnN0YXRwcm9jX3N0YXRzXzIoKTsKK2V4dGVybiAgc3RhdHNzd3RjaCAqIHJzdGF0cHJvY19zdGF0c18yX3N2YygpOworZXh0ZXJuICB1X2ludCAqIHJzdGF0cHJvY19oYXZlZGlza18yKCk7CitleHRlcm4gIHVfaW50ICogcnN0YXRwcm9jX2hhdmVkaXNrXzJfc3ZjKCk7CitleHRlcm4gaW50IHJzdGF0cHJvZ18yX2ZyZWVyZXN1bHQgKCk7CisjZW5kaWYgLyogSyZSIEMgKi8KKyNkZWZpbmUgUlNUQVRWRVJTX09SSUcgMQorCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAgc3RhdHMgKiByc3RhdHByb2Nfc3RhdHNfMSh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgc3RhdHMgKiByc3RhdHByb2Nfc3RhdHNfMV9zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiAgdV9pbnQgKiByc3RhdHByb2NfaGF2ZWRpc2tfMSh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgdV9pbnQgKiByc3RhdHByb2NfaGF2ZWRpc2tfMV9zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiBpbnQgcnN0YXRwcm9nXzFfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisjZWxzZSAvKiBLJlIgQyAqLworZXh0ZXJuICBzdGF0cyAqIHJzdGF0cHJvY19zdGF0c18xKCk7CitleHRlcm4gIHN0YXRzICogcnN0YXRwcm9jX3N0YXRzXzFfc3ZjKCk7CitleHRlcm4gIHVfaW50ICogcnN0YXRwcm9jX2hhdmVkaXNrXzEoKTsKK2V4dGVybiAgdV9pbnQgKiByc3RhdHByb2NfaGF2ZWRpc2tfMV9zdmMoKTsKK2V4dGVybiBpbnQgcnN0YXRwcm9nXzFfZnJlZXJlc3VsdCAoKTsKKyNlbmRpZiAvKiBLJlIgQyAqLworCisvKiB0aGUgeGRyIGZ1bmN0aW9ucyAqLworCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAgYm9vbF90IHhkcl9yc3RhdF90aW1ldmFsIChYRFIgKiwgcnN0YXRfdGltZXZhbCopOworZXh0ZXJuICBib29sX3QgeGRyX3N0YXRzdGltZSAoWERSICosIHN0YXRzdGltZSopOworZXh0ZXJuICBib29sX3QgeGRyX3N0YXRzc3d0Y2ggKFhEUiAqLCBzdGF0c3N3dGNoKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfc3RhdHMgKFhEUiAqLCBzdGF0cyopOworCisjZWxzZSAvKiBLJlIgQyAqLworZXh0ZXJuIGJvb2xfdCB4ZHJfcnN0YXRfdGltZXZhbCAoKTsKK2V4dGVybiBib29sX3QgeGRyX3N0YXRzdGltZSAoKTsKK2V4dGVybiBib29sX3QgeGRyX3N0YXRzc3d0Y2ggKCk7CitleHRlcm4gYm9vbF90IHhkcl9zdGF0cyAoKTsKKworI2VuZGlmIC8qIEsmUiBDICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhX1JTVEFUX0hfUlBDR0VOICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9yc3RhdC54IGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcnN0YXQueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjdiMTAyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcnN0YXQueApAQCAtMCwwICsxLDE0NSBAQAorLyogQCgjKXJzdGF0LngJMi4yIDg4LzA4LzAxIDQuMCBSUENTUkMgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSAiT3JhY2xlIEFtZXJpY2EsIEluYy4iIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqICAgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiAgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgKiAgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIEdhdGhlciBzdGF0aXN0aWNzIG9uIHJlbW90ZSBtYWNoaW5lcworICovCisKKyNpZmRlZiBSUENfSERSCisKKyUjaWZuZGVmIEZTQ0FMRQorJS8qCislICogU2NhbGUgZmFjdG9yIGZvciBzY2FsZWQgaW50ZWdlcnMgdXNlZCB0byBjb3VudCBsb2FkIGF2ZXJhZ2VzLgorJSAqLworJSNkZWZpbmUgRlNISUZUICA4ICAgICAgICAgICAgICAgLyogYml0cyB0byByaWdodCBvZiBmaXhlZCBiaW5hcnkgcG9pbnQgKi8KKyUjZGVmaW5lIEZTQ0FMRSAgKDE8PEZTSElGVCkKKyUKKyUjZW5kaWYgLyogbmRlZiBGU0NBTEUgKi8KKworI2VuZGlmIC8qIGRlZiBSUENfSERSICovCisKK2NvbnN0IENQVVNUQVRFUyA9IDQ7Citjb25zdCBES19ORFJJVkUgPSA0OworCisvKgorICogR01UIHNpbmNlIDA6MDAsIEphbnVhcnkgMSwgMTk3MAorICovCitzdHJ1Y3QgcnN0YXRfdGltZXZhbCB7CisJdW5zaWduZWQgaW50IHR2X3NlYzsJLyogc2Vjb25kcyAqLworCXVuc2lnbmVkIGludCB0dl91c2VjOwkvKiBhbmQgbWljcm9zZWNvbmRzICovCit9OworCitzdHJ1Y3Qgc3RhdHN0aW1lIHsJCQkJLyogUlNUQVRWRVJTX1RJTUUgKi8KKwlpbnQgY3BfdGltZVtDUFVTVEFURVNdOworCWludCBka194ZmVyW0RLX05EUklWRV07CisJdW5zaWduZWQgaW50IHZfcGdwZ2luOwkvKiB0aGVzZSBhcmUgY3VtdWxhdGl2ZSBzdW0gKi8KKwl1bnNpZ25lZCBpbnQgdl9wZ3Bnb3V0OworCXVuc2lnbmVkIGludCB2X3Bzd3BpbjsKKwl1bnNpZ25lZCBpbnQgdl9wc3dwb3V0OworCXVuc2lnbmVkIGludCB2X2ludHI7CisJaW50IGlmX2lwYWNrZXRzOworCWludCBpZl9pZXJyb3JzOworCWludCBpZl9vZXJyb3JzOworCWludCBpZl9jb2xsaXNpb25zOworCXVuc2lnbmVkIGludCB2X3N3dGNoOworCWludCBhdmVucnVuWzNdOyAgICAgICAgIC8qIHNjYWxlZCBieSBGU0NBTEUgKi8KKwlyc3RhdF90aW1ldmFsIGJvb3R0aW1lOworCXJzdGF0X3RpbWV2YWwgY3VydGltZTsKKwlpbnQgaWZfb3BhY2tldHM7Cit9OworCitzdHJ1Y3Qgc3RhdHNzd3RjaCB7CQkJLyogUlNUQVRWRVJTX1NXVENIICovCisJaW50IGNwX3RpbWVbQ1BVU1RBVEVTXTsKKwlpbnQgZGtfeGZlcltES19ORFJJVkVdOworCXVuc2lnbmVkIGludCB2X3BncGdpbjsJLyogdGhlc2UgYXJlIGN1bXVsYXRpdmUgc3VtICovCisJdW5zaWduZWQgaW50IHZfcGdwZ291dDsKKwl1bnNpZ25lZCBpbnQgdl9wc3dwaW47CisJdW5zaWduZWQgaW50IHZfcHN3cG91dDsKKwl1bnNpZ25lZCBpbnQgdl9pbnRyOworCWludCBpZl9pcGFja2V0czsKKwlpbnQgaWZfaWVycm9yczsKKwlpbnQgaWZfb2Vycm9yczsKKwlpbnQgaWZfY29sbGlzaW9uczsKKwl1bnNpZ25lZCBpbnQgdl9zd3RjaDsKKwl1bnNpZ25lZCBpbnQgYXZlbnJ1blszXTsvKiBzY2FsZWQgYnkgRlNDQUxFICovCisJcnN0YXRfdGltZXZhbCBib290dGltZTsKKwlpbnQgaWZfb3BhY2tldHM7Cit9OworCitzdHJ1Y3Qgc3RhdHMgewkJCQkvKiBSU1RBVFZFUlNfT1JJRyAqLworCWludCBjcF90aW1lW0NQVVNUQVRFU107CisJaW50IGRrX3hmZXJbREtfTkRSSVZFXTsKKwl1bnNpZ25lZCBpbnQgdl9wZ3BnaW47CS8qIHRoZXNlIGFyZSBjdW11bGF0aXZlIHN1bSAqLworCXVuc2lnbmVkIGludCB2X3BncGdvdXQ7CisJdW5zaWduZWQgaW50IHZfcHN3cGluOworCXVuc2lnbmVkIGludCB2X3Bzd3BvdXQ7CisJdW5zaWduZWQgaW50IHZfaW50cjsKKwlpbnQgaWZfaXBhY2tldHM7CisJaW50IGlmX2llcnJvcnM7CisJaW50IGlmX29lcnJvcnM7CisJaW50IGlmX2NvbGxpc2lvbnM7CisJaW50IGlmX29wYWNrZXRzOworfTsKKworCitwcm9ncmFtIFJTVEFUUFJPRyB7CisJLyoKKwkgKiBOZXdlc3QgdmVyc2lvbiBpbmNsdWRlcyBjdXJyZW50IHRpbWUgYW5kIGNvbnRleHQgc3dpdGNoaW5nIGluZm8KKwkgKi8KKwl2ZXJzaW9uIFJTVEFUVkVSU19USU1FIHsKKwkJc3RhdHN0aW1lCisJCVJTVEFUUFJPQ19TVEFUUyh2b2lkKSA9IDE7CisKKwkJdW5zaWduZWQgaW50CisJCVJTVEFUUFJPQ19IQVZFRElTSyh2b2lkKSA9IDI7CisJfSA9IDM7CisJLyoKKwkgKiBEb2VzIG5vdCBoYXZlIGN1cnJlbnQgdGltZQorCSAqLworCXZlcnNpb24gUlNUQVRWRVJTX1NXVENIIHsKKwkJc3RhdHNzd3RjaAorCQlSU1RBVFBST0NfU1RBVFModm9pZCkgPSAxOworCisJCXVuc2lnbmVkIGludAorCQlSU1RBVFBST0NfSEFWRURJU0sodm9pZCkgPSAyOworCX0gPSAyOworCS8qCisJICogT2xkIHZlcnNpb24gaGFzIG5vIGluZm8gYWJvdXQgY3VycmVudCB0aW1lIG9yIGNvbnRleHQgc3dpdGNoaW5nCisJICovCisJdmVyc2lvbiBSU1RBVFZFUlNfT1JJRyB7CisJCXN0YXRzCisJCVJTVEFUUFJPQ19TVEFUUyh2b2lkKSA9IDE7CisKKwkJdW5zaWduZWQgaW50CisJCVJTVEFUUFJPQ19IQVZFRElTSyh2b2lkKSA9IDI7CisJfSA9IDE7Cit9ID0gMTAwMDAxOwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcnVzZXJzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ydXNlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzJkM2IwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcnVzZXJzLmgKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLgorICogSXQgd2FzIGdlbmVyYXRlZCB1c2luZyBycGNnZW4uCisgKi8KKworI2lmbmRlZiBfUlVTRVJTX0hfUlBDR0VOCisjZGVmaW5lIF9SVVNFUlNfSF9SUENHRU4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBGaW5kIG91dCBhYm91dCByZW1vdGUgdXNlcnMKKyAqLworI2RlZmluZSBSVVNFUlNfTUFYVVNFUkxFTiAzMgorI2RlZmluZSBSVVNFUlNfTUFYTElORUxFTiAzMgorI2RlZmluZSBSVVNFUlNfTUFYSE9TVExFTiAyNTcKKworc3RydWN0IHJ1c2Vyc191dG1wIHsKKwljaGFyICp1dF91c2VyOworCWNoYXIgKnV0X2xpbmU7CisJY2hhciAqdXRfaG9zdDsKKwlpbnQgdXRfdHlwZTsKKwlpbnQgdXRfdGltZTsKKwl1X2ludCB1dF9pZGxlOworfTsKK3R5cGVkZWYgc3RydWN0IHJ1c2Vyc191dG1wIHJ1c2Vyc191dG1wOworCit0eXBlZGVmIHN0cnVjdCB7CisJdV9pbnQgdXRtcF9hcnJheV9sZW47CisJcnVzZXJzX3V0bXAgKnV0bXBfYXJyYXlfdmFsOworfSB1dG1wX2FycmF5OworCisvKgorICogVmFsdWVzIGZvciB1dF90eXBlIGZpZWxkIGFib3ZlLgorICovCisjZGVmaW5lIFJVU0VSU19FTVBUWSAwCisjZGVmaW5lIFJVU0VSU19SVU5fTFZMIDEKKyNkZWZpbmUgUlVTRVJTX0JPT1RfVElNRSAyCisjZGVmaW5lIFJVU0VSU19PTERfVElNRSAzCisjZGVmaW5lIFJVU0VSU19ORVdfVElNRSA0CisjZGVmaW5lIFJVU0VSU19JTklUX1BST0NFU1MgNQorI2RlZmluZSBSVVNFUlNfTE9HSU5fUFJPQ0VTUyA2CisjZGVmaW5lIFJVU0VSU19VU0VSX1BST0NFU1MgNworI2RlZmluZSBSVVNFUlNfREVBRF9QUk9DRVNTIDgKKyNkZWZpbmUgUlVTRVJTX0FDQ09VTlRJTkcgOQorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHJwYy94ZHIuaD4KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlcyBhcmUgdXNlZCBieSB2ZXJzaW9uIDIgb2YgdGhlIHJ1c2Vyc2QgcHJvdG9jb2wuCisgKiBUaGV5IHdlcmUgbm90IGRldmVsb3BlZCB3aXRoIHJwY2dlbiwgc28gdGhleSBkbyBub3QgYXBwZWFyIGFzIFJQQ0wuCisgKi8KKworI2RlZmluZSBSVVNFUlNWRVJTX0lETEUgMgorI2RlZmluZSBSVVNFUlNWRVJTIDMgLyogY3VycmVudCB2ZXJzaW9uICovCisjZGVmaW5lIE1BWFVTRVJTIDEwMAorCisvKgorICogVGhpcyBpcyB0aGUgc3RydWN0dXJlIHVzZWQgaW4gdmVyc2lvbiAyIG9mIHRoZSBydXNlcnNkIFJQQyBzZXJ2aWNlLgorICogSXQgY29ycmVzcG9uZHMgdG8gdGhlIHV0bXAgc3RydWN0dXJlIGZvciBCU0Qgc3lzdGVtcy4KKyAqLworc3RydWN0IHJ1X3V0bXAgeworIGNoYXIgdXRfbGluZVs4XTsgLyogdHR5IG5hbWUgKi8KKyBjaGFyIHV0X25hbWVbOF07IC8qIHVzZXIgaWQgKi8KKyBjaGFyIHV0X2hvc3RbMTZdOyAvKiBob3N0IG5hbWUsIGlmIHJlbW90ZSAqLworIGxvbmcgaW50IHV0X3RpbWU7IC8qIHRpbWUgb24gKi8KK307CisKK3N0cnVjdCB1dG1wYXJyIHsKKyBzdHJ1Y3QgcnVfdXRtcCAqKnV0YV9hcnI7CisgaW50IHV0YV9jbnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgdXRtcGFyciB1dG1wYXJyOworCitleHRlcm4gYm9vbF90IHhkcl91dG1wYXJyIChYRFIgKnhkcnMsIHN0cnVjdCB1dG1wYXJyICpvYmpwKSBfX1RIUk9XOworCitzdHJ1Y3QgdXRtcGlkbGUgeworIHN0cnVjdCBydV91dG1wIHVpX3V0bXA7CisgdW5zaWduZWQgaW50IHVpX2lkbGU7Cit9OworCitzdHJ1Y3QgdXRtcGlkbGVhcnIgeworIHN0cnVjdCB1dG1waWRsZSAqKnVpYV9hcnI7CisgaW50IHVpYV9jbnQ7Cit9OworCitleHRlcm4gYm9vbF90IHhkcl91dG1waWRsZWFyciAoWERSICp4ZHJzLCBzdHJ1Y3QgdXRtcGlkbGVhcnIgKm9ianApIF9fVEhST1c7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNkZWZpbmUgUlVTRVJTUFJPRyAxMDAwMDIKKyNkZWZpbmUgUlVTRVJTVkVSU18zIDMKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIFJVU0VSU1BST0NfTlVNIDEKK2V4dGVybiAgaW50ICogcnVzZXJzcHJvY19udW1fMyh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgaW50ICogcnVzZXJzcHJvY19udW1fM19zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgUlVTRVJTUFJPQ19OQU1FUyAyCitleHRlcm4gIHV0bXBfYXJyYXkgKiBydXNlcnNwcm9jX25hbWVzXzModm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHV0bXBfYXJyYXkgKiBydXNlcnNwcm9jX25hbWVzXzNfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFJVU0VSU1BST0NfQUxMTkFNRVMgMworZXh0ZXJuICB1dG1wX2FycmF5ICogcnVzZXJzcHJvY19hbGxuYW1lc18zKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICB1dG1wX2FycmF5ICogcnVzZXJzcHJvY19hbGxuYW1lc18zX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCBydXNlcnNwcm9nXzNfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisjZWxzZSAvKiBLJlIgQyAqLworI2RlZmluZSBSVVNFUlNQUk9DX05VTSAxCitleHRlcm4gIGludCAqIHJ1c2Vyc3Byb2NfbnVtXzMoKTsKK2V4dGVybiAgaW50ICogcnVzZXJzcHJvY19udW1fM19zdmMoKTsKKyNkZWZpbmUgUlVTRVJTUFJPQ19OQU1FUyAyCitleHRlcm4gIHV0bXBfYXJyYXkgKiBydXNlcnNwcm9jX25hbWVzXzMoKTsKK2V4dGVybiAgdXRtcF9hcnJheSAqIHJ1c2Vyc3Byb2NfbmFtZXNfM19zdmMoKTsKKyNkZWZpbmUgUlVTRVJTUFJPQ19BTExOQU1FUyAzCitleHRlcm4gIHV0bXBfYXJyYXkgKiBydXNlcnNwcm9jX2FsbG5hbWVzXzMoKTsKK2V4dGVybiAgdXRtcF9hcnJheSAqIHJ1c2Vyc3Byb2NfYWxsbmFtZXNfM19zdmMoKTsKK2V4dGVybiBpbnQgcnVzZXJzcHJvZ18zX2ZyZWVyZXN1bHQgKCk7CisjZW5kaWYgLyogSyZSIEMgKi8KKworLyogdGhlIHhkciBmdW5jdGlvbnMgKi8KKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIGJvb2xfdCB4ZHJfcnVzZXJzX3V0bXAgKFhEUiAqLCBydXNlcnNfdXRtcCopOworZXh0ZXJuICBib29sX3QgeGRyX3V0bXBfYXJyYXkgKFhEUiAqLCB1dG1wX2FycmF5Kik7CisKKyNlbHNlIC8qIEsmUiBDICovCitleHRlcm4gYm9vbF90IHhkcl9ydXNlcnNfdXRtcCAoKTsKK2V4dGVybiBib29sX3QgeGRyX3V0bXBfYXJyYXkgKCk7CisKKyNlbmRpZiAvKiBLJlIgQyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIV9SVVNFUlNfSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3J1c2Vycy54IGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcnVzZXJzLngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2ZWQ3NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3J1c2Vycy54CkBAIC0wLDAgKzEsMjQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworJS8qCislICogRmluZCBvdXQgYWJvdXQgcmVtb3RlIHVzZXJzCislICovCisKK2NvbnN0IFJVU0VSU19NQVhVU0VSTEVOID0gMzI7Citjb25zdCBSVVNFUlNfTUFYTElORUxFTiA9IDMyOworY29uc3QgUlVTRVJTX01BWEhPU1RMRU4gPSAyNTc7CisKK3N0cnVjdCBydXNlcnNfdXRtcCB7CisJc3RyaW5nIHV0X3VzZXI8UlVTRVJTX01BWFVTRVJMRU4+OwkvKiBha2EgdXRfbmFtZSAqLworCXN0cmluZyB1dF9saW5lPFJVU0VSU19NQVhMSU5FTEVOPjsJLyogZGV2aWNlICovCisJc3RyaW5nIHV0X2hvc3Q8UlVTRVJTX01BWEhPU1RMRU4+OwkvKiBob3N0IHVzZXIgbG9nZ2VkIG9uIGZyb20gKi8KKwlpbnQgdXRfdHlwZTsJCQkJLyogdHlwZSBvZiBlbnRyeSAqLworCWludCB1dF90aW1lOwkJCQkvKiB0aW1lIGVudHJ5IHdhcyBtYWRlICovCisJdW5zaWduZWQgaW50IHV0X2lkbGU7CQkJLyogbWludXRlcyBpZGxlICovCit9OworCit0eXBlZGVmIHJ1c2Vyc191dG1wIHV0bXBfYXJyYXk8PjsKKworI2lmZGVmIFJQQ19IRFIKKyUKKyUvKgorJSAqIFZhbHVlcyBmb3IgdXRfdHlwZSBmaWVsZCBhYm92ZS4KKyUgKi8KKyNlbmRpZgorY29uc3QJUlVTRVJTX0VNUFRZID0gMDsKK2NvbnN0CVJVU0VSU19SVU5fTFZMID0gMTsKK2NvbnN0CVJVU0VSU19CT09UX1RJTUUgPSAyOworY29uc3QJUlVTRVJTX09MRF9USU1FID0gMzsKK2NvbnN0CVJVU0VSU19ORVdfVElNRSA9IDQ7Citjb25zdAlSVVNFUlNfSU5JVF9QUk9DRVNTID0gNTsKK2NvbnN0CVJVU0VSU19MT0dJTl9QUk9DRVNTID0gNjsKK2NvbnN0CVJVU0VSU19VU0VSX1BST0NFU1MgPSA3OworY29uc3QJUlVTRVJTX0RFQURfUFJPQ0VTUyA9IDg7Citjb25zdAlSVVNFUlNfQUNDT1VOVElORyA9IDk7CisKK3Byb2dyYW0gUlVTRVJTUFJPRyB7CisKKwl2ZXJzaW9uIFJVU0VSU1ZFUlNfMyB7CisJCWludAorCQlSVVNFUlNQUk9DX05VTSh2b2lkKSA9IDE7CisKKwkJdXRtcF9hcnJheQorCQlSVVNFUlNQUk9DX05BTUVTKHZvaWQpID0gMjsKKworCQl1dG1wX2FycmF5CisJCVJVU0VSU1BST0NfQUxMTkFNRVModm9pZCkgPSAzOworCX0gPSAzOworCit9ID0gMTAwMDAyOworCisjaWZkZWYgUlBDX0hEUgorJQorJQorJSNpZmRlZglfX2NwbHVzcGx1cworJWV4dGVybiAiQyIgeworJSNlbmRpZgorJQorJSNpbmNsdWRlIDxycGMveGRyLmg+CislCislLyoKKyUgKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZXMgYXJlIHVzZWQgYnkgdmVyc2lvbiAyIG9mIHRoZSBydXNlcnNkIHByb3RvY29sLgorJSAqIFRoZXkgd2VyZSBub3QgZGV2ZWxvcGVkIHdpdGggcnBjZ2VuLCBzbyB0aGV5IGRvIG5vdCBhcHBlYXIgYXMgUlBDTC4KKyUgKi8KKyUKKyUjZGVmaW5lCVJVU0VSU1ZFUlNfSURMRSAyCislI2RlZmluZQlSVVNFUlNWRVJTIDMJCS8qIGN1cnJlbnQgdmVyc2lvbiAqLworJSNkZWZpbmUJTUFYVVNFUlMgMTAwCislCislLyoKKyUgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgdXNlZCBpbiB2ZXJzaW9uIDIgb2YgdGhlIHJ1c2Vyc2QgUlBDIHNlcnZpY2UuCislICogSXQgY29ycmVzcG9uZHMgdG8gdGhlIHV0bXAgc3RydWN0dXJlIGZvciBCU0Qgc3lzdGVtcy4KKyUgKi8KKyVzdHJ1Y3QgcnVfdXRtcCB7CislCWNoYXIJdXRfbGluZVs4XTsJCS8qIHR0eSBuYW1lICovCislCWNoYXIJdXRfbmFtZVs4XTsJCS8qIHVzZXIgaWQgKi8KKyUJY2hhcgl1dF9ob3N0WzE2XTsJCS8qIGhvc3QgbmFtZSwgaWYgcmVtb3RlICovCislCWxvbmcgaW50IHV0X3RpbWU7CQkvKiB0aW1lIG9uICovCislfTsKKyUKKyVzdHJ1Y3QgdXRtcGFyciB7CislICAgICAgIHN0cnVjdCBydV91dG1wICoqdXRhX2FycjsKKyUgICAgICAgaW50IHV0YV9jbnQ7CislfTsKKyV0eXBlZGVmIHN0cnVjdCB1dG1wYXJyIHV0bXBhcnI7CislCislZXh0ZXJuIGJvb2xfdCB4ZHJfdXRtcGFyciAoWERSICp4ZHJzLCBzdHJ1Y3QgdXRtcGFyciAqb2JqcCkgX19USFJPVzsKKyUKKyVzdHJ1Y3QgdXRtcGlkbGUgeworJQlzdHJ1Y3QgcnVfdXRtcCB1aV91dG1wOworJQl1bnNpZ25lZCBpbnQgdWlfaWRsZTsKKyV9OworJQorJXN0cnVjdCB1dG1waWRsZWFyciB7CislCXN0cnVjdCB1dG1waWRsZSAqKnVpYV9hcnI7CislCWludCB1aWFfY250OworJX07CislCislZXh0ZXJuIGJvb2xfdCB4ZHJfdXRtcGlkbGVhcnIgKFhEUiAqeGRycywgc3RydWN0IHV0bXBpZGxlYXJyICpvYmpwKSBfX1RIUk9XOworJQorJSNpZmRlZglfX2NwbHVzcGx1cworJX0KKyUjZW5kaWYKKyNlbmRpZgorCisKKyNpZmRlZglSUENfWERSCislYm9vbF90IHhkcl91dG1wIChYRFIgKnhkcnMsIHN0cnVjdCBydV91dG1wICpvYmpwKTsKKyUKKyVib29sX3QKKyV4ZHJfdXRtcCh4ZHJzLCBvYmpwKQorJQlYRFIgKnhkcnM7CislCXN0cnVjdCBydV91dG1wICpvYmpwOworJXsKKyUJLyogU2luY2UgdGhlIGZpZWxkcyBhcmUgY2hhciBmb28gW3h4eF0sIHdlIHNob3VsZCBub3QgZnJlZSB0aGVtLiAqLworJQlpZiAoeGRycy0+eF9vcCAhPSBYRFJfRlJFRSkKKyUJeworJQkJY2hhciAqcHRyOworJQkJdW5zaWduZWQgaW50IHNpemU7CislCQlwdHIgPSBvYmpwLT51dF9saW5lOworJQkJc2l6ZSA9IHNpemVvZiAob2JqcC0+dXRfbGluZSk7CislCQlpZiAoIXhkcl9ieXRlcyAoeGRycywgJnB0ciwgJnNpemUsIHNpemUpKSB7CislCQkJcmV0dXJuIChGQUxTRSk7CislCQl9CislCQlwdHIgPSBvYmpwLT51dF9uYW1lOworJQkJc2l6ZSA9IHNpemVvZiAob2JqcC0+dXRfbmFtZSk7CislCQlpZiAoIXhkcl9ieXRlcyAoeGRycywgJnB0ciwgJnNpemUsIHNpemUpKSB7CislCQkJcmV0dXJuIChGQUxTRSk7CislCQl9CislCQlwdHIgPSBvYmpwLT51dF9ob3N0OworJQkJc2l6ZSA9IHNpemVvZiAob2JqcC0+dXRfaG9zdCk7CislCQlpZiAoIXhkcl9ieXRlcyAoeGRycywgJnB0ciwgJnNpemUsIHNpemUpKSB7CislCQkJcmV0dXJuIChGQUxTRSk7CislCQl9CislCX0KKyUJaWYgKCF4ZHJfbG9uZyh4ZHJzLCAmb2JqcC0+dXRfdGltZSkpIHsKKyUJCXJldHVybiAoRkFMU0UpOworJQl9CislCXJldHVybiAoVFJVRSk7CislfQorJQorJWJvb2xfdCB4ZHJfdXRtcHB0cihYRFIgKnhkcnMsIHN0cnVjdCBydV91dG1wICoqb2JqcHApOworJQorJWJvb2xfdAorJXhkcl91dG1wcHRyKHhkcnMsIG9ianBwKQorJQlYRFIgKnhkcnM7CislCXN0cnVjdCBydV91dG1wICoqb2JqcHA7CisleworJQlpZiAoIXhkcl9yZWZlcmVuY2UoeGRycywgKGNoYXIgKiopIG9ianBwLCBzaXplb2YgKHN0cnVjdCBydV91dG1wKSwKKyUJCQkgICAoeGRycHJvY190KSB4ZHJfdXRtcCkpIHsKKyUJCXJldHVybiAoRkFMU0UpOworJQl9CislCXJldHVybiAoVFJVRSk7CislfQorJQorJWJvb2xfdAorJXhkcl91dG1wYXJyKHhkcnMsIG9ianApCislCVhEUiAqeGRyczsKKyUJc3RydWN0IHV0bXBhcnIgKm9ianA7CisleworJQlpZiAoIXhkcl9hcnJheSh4ZHJzLCAoY2hhciAqKikmb2JqcC0+dXRhX2FyciwgKHVfaW50ICopJm9ianAtPnV0YV9jbnQsCislCQkgICAgICAgTUFYVVNFUlMsIHNpemVvZihzdHJ1Y3QgcnVfdXRtcCAqKSwKKyUJCSAgICAgICAoeGRycHJvY190KSB4ZHJfdXRtcHB0cikpIHsKKyUJCXJldHVybiAoRkFMU0UpOworJQl9CislCXJldHVybiAoVFJVRSk7CislfQorJQorJWJvb2xfdCB4ZHJfdXRtcGlkbGUoWERSICp4ZHJzLCBzdHJ1Y3QgdXRtcGlkbGUgKm9ianApOworJQorJWJvb2xfdAorJXhkcl91dG1waWRsZSh4ZHJzLCBvYmpwKQorJQlYRFIgKnhkcnM7CislCXN0cnVjdCB1dG1waWRsZSAqb2JqcDsKKyV7CislCWlmICgheGRyX3V0bXAoeGRycywgJm9ianAtPnVpX3V0bXApKSB7CislCQlyZXR1cm4gKEZBTFNFKTsKKyUJfQorJQlpZiAoIXhkcl91X2ludCh4ZHJzLCAmb2JqcC0+dWlfaWRsZSkpIHsKKyUJCXJldHVybiAoRkFMU0UpOworJQl9CislCXJldHVybiAoVFJVRSk7CislfQorJQorJWJvb2xfdCB4ZHJfdXRtcGlkbGVwdHIoWERSICp4ZHJzLCBzdHJ1Y3QgdXRtcGlkbGUgKipvYmpwKTsKKyUKKyVib29sX3QKKyV4ZHJfdXRtcGlkbGVwdHIoeGRycywgb2JqcHApCislCVhEUiAqeGRyczsKKyUJc3RydWN0IHV0bXBpZGxlICoqb2JqcHA7CisleworJQlpZiAoIXhkcl9yZWZlcmVuY2UoeGRycywgKGNoYXIgKiopIG9ianBwLCBzaXplb2YgKHN0cnVjdCB1dG1waWRsZSksCislCQkJICAgKHhkcnByb2NfdCkgeGRyX3V0bXBpZGxlKSkgeworJQkJcmV0dXJuIChGQUxTRSk7CislCX0KKyUJcmV0dXJuIChUUlVFKTsKKyV9CislCislYm9vbF90CisleGRyX3V0bXBpZGxlYXJyKHhkcnMsIG9ianApCislCVhEUiAqeGRyczsKKyUJc3RydWN0IHV0bXBpZGxlYXJyICpvYmpwOworJXsKKyUJaWYgKCF4ZHJfYXJyYXkoeGRycywgKGNoYXIgKiopJm9ianAtPnVpYV9hcnIsICh1X2ludCAqKSZvYmpwLT51aWFfY250LAorJQkJICAgICAgIE1BWFVTRVJTLCBzaXplb2Yoc3RydWN0IHV0bXBpZGxlICopLAorJQkJICAgICAgICh4ZHJwcm9jX3QpIHhkcl91dG1waWRsZXB0cikpIHsKKyUJCXJldHVybiAoRkFMU0UpOworJQl9CislCXJldHVybiAoVFJVRSk7CislfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9zbV9pbnRlci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvc21faW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGJjM2UxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvc21faW50ZXIuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCisgKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KKyAqLworCisjaWZuZGVmIF9TTV9JTlRFUl9IX1JQQ0dFTgorI2RlZmluZSBfU01fSU5URVJfSF9SUENHRU4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgU01fTUFYU1RSTEVOIDEwMjQKKworc3RydWN0IHNtX25hbWUgeworCWNoYXIgKm1vbl9uYW1lOworfTsKK3R5cGVkZWYgc3RydWN0IHNtX25hbWUgc21fbmFtZTsKKworc3RydWN0IG15X2lkIHsKKwljaGFyICpteV9uYW1lOworCWludCBteV9wcm9nOworCWludCBteV92ZXJzOworCWludCBteV9wcm9jOworfTsKK3R5cGVkZWYgc3RydWN0IG15X2lkIG15X2lkOworCitzdHJ1Y3QgbW9uX2lkIHsKKwljaGFyICptb25fbmFtZTsKKwlzdHJ1Y3QgbXlfaWQgbXlfaWQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbW9uX2lkIG1vbl9pZDsKKworc3RydWN0IG1vbiB7CisJc3RydWN0IG1vbl9pZCBtb25faWQ7CisJY2hhciBwcml2WzE2XTsKK307Cit0eXBlZGVmIHN0cnVjdCBtb24gbW9uOworCitzdHJ1Y3Qgc21fc3RhdCB7CisJaW50IHN0YXRlOworfTsKK3R5cGVkZWYgc3RydWN0IHNtX3N0YXQgc21fc3RhdDsKKworZW51bSByZXMgeworCXN0YXRfc3VjYyA9IDAsCisJc3RhdF9mYWlsID0gMSwKK307Cit0eXBlZGVmIGVudW0gcmVzIHJlczsKKworc3RydWN0IHNtX3N0YXRfcmVzIHsKKwlyZXMgcmVzX3N0YXQ7CisJaW50IHN0YXRlOworfTsKK3R5cGVkZWYgc3RydWN0IHNtX3N0YXRfcmVzIHNtX3N0YXRfcmVzOworCitzdHJ1Y3Qgc3RhdHVzIHsKKwljaGFyICptb25fbmFtZTsKKwlpbnQgc3RhdGU7CisJY2hhciBwcml2WzE2XTsKK307Cit0eXBlZGVmIHN0cnVjdCBzdGF0dXMgc3RhdHVzOworCisjZGVmaW5lIFNNX1BST0cgMTAwMDI0CisjZGVmaW5lIFNNX1ZFUlMgMQorCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUgU01fU1RBVCAxCitleHRlcm4gIHN0cnVjdCBzbV9zdGF0X3JlcyAqIHNtX3N0YXRfMShzdHJ1Y3Qgc21fbmFtZSAqLCBDTElFTlQgKik7CitleHRlcm4gIHN0cnVjdCBzbV9zdGF0X3JlcyAqIHNtX3N0YXRfMV9zdmMoc3RydWN0IHNtX25hbWUgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFNNX01PTiAyCitleHRlcm4gIHN0cnVjdCBzbV9zdGF0X3JlcyAqIHNtX21vbl8xKHN0cnVjdCBtb24gKiwgQ0xJRU5UICopOworZXh0ZXJuICBzdHJ1Y3Qgc21fc3RhdF9yZXMgKiBzbV9tb25fMV9zdmMoc3RydWN0IG1vbiAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgU01fVU5NT04gMworZXh0ZXJuICBzdHJ1Y3Qgc21fc3RhdCAqIHNtX3VubW9uXzEoc3RydWN0IG1vbl9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHN0cnVjdCBzbV9zdGF0ICogc21fdW5tb25fMV9zdmMoc3RydWN0IG1vbl9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgU01fVU5NT05fQUxMIDQKK2V4dGVybiAgc3RydWN0IHNtX3N0YXQgKiBzbV91bm1vbl9hbGxfMShzdHJ1Y3QgbXlfaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICBzdHJ1Y3Qgc21fc3RhdCAqIHNtX3VubW9uX2FsbF8xX3N2YyhzdHJ1Y3QgbXlfaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFNNX1NJTVVfQ1JBU0ggNQorZXh0ZXJuICB2b2lkICogc21fc2ltdV9jcmFzaF8xKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogc21fc2ltdV9jcmFzaF8xX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCBzbV9wcm9nXzFfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisjZWxzZSAvKiBLJlIgQyAqLworI2RlZmluZSBTTV9TVEFUIDEKK2V4dGVybiAgc3RydWN0IHNtX3N0YXRfcmVzICogc21fc3RhdF8xKCk7CitleHRlcm4gIHN0cnVjdCBzbV9zdGF0X3JlcyAqIHNtX3N0YXRfMV9zdmMoKTsKKyNkZWZpbmUgU01fTU9OIDIKK2V4dGVybiAgc3RydWN0IHNtX3N0YXRfcmVzICogc21fbW9uXzEoKTsKK2V4dGVybiAgc3RydWN0IHNtX3N0YXRfcmVzICogc21fbW9uXzFfc3ZjKCk7CisjZGVmaW5lIFNNX1VOTU9OIDMKK2V4dGVybiAgc3RydWN0IHNtX3N0YXQgKiBzbV91bm1vbl8xKCk7CitleHRlcm4gIHN0cnVjdCBzbV9zdGF0ICogc21fdW5tb25fMV9zdmMoKTsKKyNkZWZpbmUgU01fVU5NT05fQUxMIDQKK2V4dGVybiAgc3RydWN0IHNtX3N0YXQgKiBzbV91bm1vbl9hbGxfMSgpOworZXh0ZXJuICBzdHJ1Y3Qgc21fc3RhdCAqIHNtX3VubW9uX2FsbF8xX3N2YygpOworI2RlZmluZSBTTV9TSU1VX0NSQVNIIDUKK2V4dGVybiAgdm9pZCAqIHNtX3NpbXVfY3Jhc2hfMSgpOworZXh0ZXJuICB2b2lkICogc21fc2ltdV9jcmFzaF8xX3N2YygpOworZXh0ZXJuIGludCBzbV9wcm9nXzFfZnJlZXJlc3VsdCAoKTsKKyNlbmRpZiAvKiBLJlIgQyAqLworCisvKiB0aGUgeGRyIGZ1bmN0aW9ucyAqLworCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAgYm9vbF90IHhkcl9zbV9uYW1lIChYRFIgKiwgc21fbmFtZSopOworZXh0ZXJuICBib29sX3QgeGRyX215X2lkIChYRFIgKiwgbXlfaWQqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9tb25faWQgKFhEUiAqLCBtb25faWQqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9tb24gKFhEUiAqLCBtb24qKTsKK2V4dGVybiAgYm9vbF90IHhkcl9zbV9zdGF0IChYRFIgKiwgc21fc3RhdCopOworZXh0ZXJuICBib29sX3QgeGRyX3JlcyAoWERSICosIHJlcyopOworZXh0ZXJuICBib29sX3QgeGRyX3NtX3N0YXRfcmVzIChYRFIgKiwgc21fc3RhdF9yZXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9zdGF0dXMgKFhEUiAqLCBzdGF0dXMqKTsKKworI2Vsc2UgLyogSyZSIEMgKi8KK2V4dGVybiBib29sX3QgeGRyX3NtX25hbWUgKCk7CitleHRlcm4gYm9vbF90IHhkcl9teV9pZCAoKTsKK2V4dGVybiBib29sX3QgeGRyX21vbl9pZCAoKTsKK2V4dGVybiBib29sX3QgeGRyX21vbiAoKTsKK2V4dGVybiBib29sX3QgeGRyX3NtX3N0YXQgKCk7CitleHRlcm4gYm9vbF90IHhkcl9yZXMgKCk7CitleHRlcm4gYm9vbF90IHhkcl9zbV9zdGF0X3JlcyAoKTsKK2V4dGVybiBib29sX3QgeGRyX3N0YXR1cyAoKTsKKworI2VuZGlmIC8qIEsmUiBDICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhX1NNX0lOVEVSX0hfUlBDR0VOICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9zbV9pbnRlci54IGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvc21faW50ZXIueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjdmMGUwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvc21faW50ZXIueApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIFN0YXR1cyBtb25pdG9yIHByb3RvY29sIHNwZWNpZmljYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKworcHJvZ3JhbSBTTV9QUk9HIHsKKwl2ZXJzaW9uIFNNX1ZFUlMgIHsKKwkJLyogcmVzX3N0YXQgPSBzdGF0X3N1Y2MgaWYgc3RhdHVzIG1vbml0b3IgYWdyZWVzIHRvIG1vbml0b3IgKi8KKwkJLyogcmVzX3N0YXQgPSBzdGF0X2ZhaWwgaWYgc3RhdHVzIG1vbml0b3IgY2Fubm90IG1vbml0b3IgKi8KKwkJLyogaWYgcmVzX3N0YXQgPT0gc3RhdF9zdWNjLCBzdGF0ZSA9IHN0YXRlIG51bWJlciBvZiBzaXRlIHNtX25hbWUgKi8KKwkJc3RydWN0IHNtX3N0YXRfcmVzCQkJIFNNX1NUQVQoc3RydWN0IHNtX25hbWUpID0gMTsKKworCQkvKiByZXNfc3RhdCA9IHN0YXRfc3VjYyBpZiBzdGF0dXMgbW9uaXRvciBhZ3JlZXMgdG8gbW9uaXRvciAqLworCQkvKiByZXNfc3RhdCA9IHN0YXRfZmFpbCBpZiBzdGF0dXMgbW9uaXRvciBjYW5ub3QgbW9uaXRvciAqLworCQkvKiBzdGF0IGNvbnNpc3RzIG9mIHN0YXRlIG51bWJlciBvZiBsb2NhbCBzaXRlICovCisJCXN0cnVjdCBzbV9zdGF0X3JlcwkJCSBTTV9NT04oc3RydWN0IG1vbikgPSAyOworCisJCS8qIHN0YXQgY29uc2lzdHMgb2Ygc3RhdGUgbnVtYmVyIG9mIGxvY2FsIHNpdGUgKi8KKwkJc3RydWN0IHNtX3N0YXQJCQkJIFNNX1VOTU9OKHN0cnVjdCBtb25faWQpID0gMzsKKworCQkvKiBzdGF0IGNvbnNpc3RzIG9mIHN0YXRlIG51bWJlciBvZiBsb2NhbCBzaXRlICovCisJCXN0cnVjdCBzbV9zdGF0CQkJCSBTTV9VTk1PTl9BTEwoc3RydWN0IG15X2lkKSA9IDQ7CisKKwkJdm9pZAkJCQkJIFNNX1NJTVVfQ1JBU0godm9pZCkgPSA1OworCisJfSA9IDE7Cit9ID0gMTAwMDI0OworCitjb25zdAlTTV9NQVhTVFJMRU4gPSAxMDI0OworCitzdHJ1Y3Qgc21fbmFtZSB7CisJc3RyaW5nIG1vbl9uYW1lPFNNX01BWFNUUkxFTj47Cit9OworCitzdHJ1Y3QgbXlfaWQgeworCXN0cmluZwkgbXlfbmFtZTxTTV9NQVhTVFJMRU4+OwkJLyogbmFtZSBvZiB0aGUgc2l0ZSBpbml0aWF0aW5nIHRoZSBtb25pdG9yaW5nIHJlcXVlc3QqLworCWludAlteV9wcm9nOwkJCS8qIHJwYyBwcm9ncmFtICMgb2YgdGhlIHJlcXVlc3RpbmcgcHJvY2VzcyAqLworCWludAlteV92ZXJzOwkJCS8qIHJwYyB2ZXJzaW9uICMgb2YgdGhlIHJlcXVlc3RpbmcgcHJvY2VzcyAqLworCWludAlteV9wcm9jOwkJCS8qIHJwYyBwcm9jZWR1cmUgIyBvZiB0aGUgcmVxdWVzdGluZyBwcm9jZXNzICovCit9OworCitzdHJ1Y3QgbW9uX2lkIHsKKwlzdHJpbmcJbW9uX25hbWU8U01fTUFYU1RSTEVOPjsJCS8qIG5hbWUgb2YgdGhlIHNpdGUgdG8gYmUgbW9uaXRvcmVkICovCisJc3RydWN0IG15X2lkIG15X2lkOworfTsKKworCitzdHJ1Y3QgbW9ueworCXN0cnVjdCBtb25faWQgbW9uX2lkOworCW9wYXF1ZSBwcml2WzE2XTsgCQkvKiBwcml2YXRlIGluZm9ybWF0aW9uIHRvIHN0b3JlIGF0IG1vbml0b3IgZm9yIHJlcXVlc3RpbmcgcHJvY2VzcyAqLworfTsKKworCisvKgorICogc3RhdGUgIyBvZiBzdGF0dXMgbW9uaXRvciBtb25vdG9uaWNhbGx5IGluY3JlYXNlcyBlYWNoIHRpbWUKKyAqIHN0YXR1cyBvZiB0aGUgc2l0ZSBjaGFuZ2VzOgorICogYW4gZXZlbiBudW1iZXIgKD49IDApIGluZGljYXRlcyB0aGUgc2l0ZSBpcyBkb3duIGFuZAorICogYW4gb2RkIG51bWJlciAoPiAwKSBpbmRpY2F0ZXMgdGhlIHNpdGUgaXMgdXA7CisgKi8KK3N0cnVjdCBzbV9zdGF0IHsKKwlpbnQgc3RhdGU7CQkvKiBzdGF0ZSAjIG9mIHN0YXR1cyBtb25pdG9yICovCit9OworCitlbnVtIHJlcyB7CisJc3RhdF9zdWNjID0gMCwJCS8qIHN0YXR1cyBtb25pdG9yIGFncmVlcyB0byBtb25pdG9yICovCisJc3RhdF9mYWlsID0gMQkJLyogc3RhdHVzIG1vbml0b3IgY2Fubm90IG1vbml0b3IgKi8KK307CisKK3N0cnVjdCBzbV9zdGF0X3JlcyB7CisJcmVzIHJlc19zdGF0OworCWludCBzdGF0ZTsKK307CisKKy8qCisgKiBzdHJ1Y3R1cmUgb2YgdGhlIHN0YXR1cyBtZXNzYWdlIHNlbnQgYmFjayBieSB0aGUgc3RhdHVzIG1vbml0b3IKKyAqIHdoZW4gbW9uaXRvciBzaXRlIHN0YXR1cyBjaGFuZ2VzCisgKi8KK3N0cnVjdCBzdGF0dXMgeworCXN0cmluZyBtb25fbmFtZTxTTV9NQVhTVFJMRU4+OworCWludCBzdGF0ZTsKKwlvcGFxdWUgcHJpdlsxNl07CQkvKiBzdG9yZWQgcHJpdmF0ZSBpbmZvcm1hdGlvbiAqLworfTsKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3NwcmF5LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9zcHJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOWU0MDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9zcHJheS5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLgorICogSXQgd2FzIGdlbmVyYXRlZCB1c2luZyBycGNnZW4uCisgKi8KKworI2lmbmRlZiBfU1BSQVlfSF9SUENHRU4KKyNkZWZpbmUgX1NQUkFZX0hfUlBDR0VOCisKKyNpbmNsdWRlIDxycGMvcnBjLmg+CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFNQUkFZTUFYIDg4NDUKKworc3RydWN0IHNwcmF5dGltZXZhbCB7CisJdV9pbnQgc2VjOworCXVfaW50IHVzZWM7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgc3ByYXl0aW1ldmFsIHNwcmF5dGltZXZhbDsKKworc3RydWN0IHNwcmF5Y3VtdWwgeworCXVfaW50IGNvdW50ZXI7CisJc3ByYXl0aW1ldmFsIGNsb2NrOworfTsKK3R5cGVkZWYgc3RydWN0IHNwcmF5Y3VtdWwgc3ByYXljdW11bDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVfaW50IHNwcmF5YXJyX2xlbjsKKwljaGFyICpzcHJheWFycl92YWw7Cit9IHNwcmF5YXJyOworCisjZGVmaW5lIFNQUkFZUFJPRyAxMDAwMTIKKyNkZWZpbmUgU1BSQVlWRVJTIDEKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIFNQUkFZUFJPQ19TUFJBWSAxCitleHRlcm4gIHZvaWQgKiBzcHJheXByb2Nfc3ByYXlfMShzcHJheWFyciAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKiBzcHJheXByb2Nfc3ByYXlfMV9zdmMoc3ByYXlhcnIgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFNQUkFZUFJPQ19HRVQgMgorZXh0ZXJuICBzcHJheWN1bXVsICogc3ByYXlwcm9jX2dldF8xKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICBzcHJheWN1bXVsICogc3ByYXlwcm9jX2dldF8xX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBTUFJBWVBST0NfQ0xFQVIgMworZXh0ZXJuICB2b2lkICogc3ByYXlwcm9jX2NsZWFyXzEodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKiBzcHJheXByb2NfY2xlYXJfMV9zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiBpbnQgc3ByYXlwcm9nXzFfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisjZWxzZSAvKiBLJlIgQyAqLworI2RlZmluZSBTUFJBWVBST0NfU1BSQVkgMQorZXh0ZXJuICB2b2lkICogc3ByYXlwcm9jX3NwcmF5XzEoKTsKK2V4dGVybiAgdm9pZCAqIHNwcmF5cHJvY19zcHJheV8xX3N2YygpOworI2RlZmluZSBTUFJBWVBST0NfR0VUIDIKK2V4dGVybiAgc3ByYXljdW11bCAqIHNwcmF5cHJvY19nZXRfMSgpOworZXh0ZXJuICBzcHJheWN1bXVsICogc3ByYXlwcm9jX2dldF8xX3N2YygpOworI2RlZmluZSBTUFJBWVBST0NfQ0xFQVIgMworZXh0ZXJuICB2b2lkICogc3ByYXlwcm9jX2NsZWFyXzEoKTsKK2V4dGVybiAgdm9pZCAqIHNwcmF5cHJvY19jbGVhcl8xX3N2YygpOworZXh0ZXJuIGludCBzcHJheXByb2dfMV9mcmVlcmVzdWx0ICgpOworI2VuZGlmIC8qIEsmUiBDICovCisKKy8qIHRoZSB4ZHIgZnVuY3Rpb25zICovCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICBib29sX3QgeGRyX3NwcmF5dGltZXZhbCAoWERSICosIHNwcmF5dGltZXZhbCopOworZXh0ZXJuICBib29sX3QgeGRyX3NwcmF5Y3VtdWwgKFhEUiAqLCBzcHJheWN1bXVsKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfc3ByYXlhcnIgKFhEUiAqLCBzcHJheWFyciopOworCisjZWxzZSAvKiBLJlIgQyAqLworZXh0ZXJuIGJvb2xfdCB4ZHJfc3ByYXl0aW1ldmFsICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfc3ByYXljdW11bCAoKTsKK2V4dGVybiBib29sX3QgeGRyX3NwcmF5YXJyICgpOworCisjZW5kaWYgLyogSyZSIEMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFfU1BSQVlfSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3NwcmF5LnggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9zcHJheS54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YjdjNDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9zcHJheS54CkBAIC0wLDAgKzEsODQgQEAKKy8qIEAoIylzcHJheS54CTIuMSA4OC8wOC8wMSA0LjAgUlBDU1JDICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBTcHJheSBhIHNlcnZlciB3aXRoIHBhY2tldHMKKyAqIFVzZWZ1bCBmb3IgdGVzdGluZyBmbGFraW5lc3Mgb2YgbmV0d29yayBpbnRlcmZhY2VzCisgKi8KKworY29uc3QgU1BSQVlNQVggPSA4ODQ1OwkvKiBtYXggYW1vdW50IGNhbiBzcHJheSAqLworCisvKgorICogR01UIHNpbmNlIDA6MDAsIDEgSmFudWFyeSAxOTcwCisgKi8KK3N0cnVjdCBzcHJheXRpbWV2YWwgeworCXVuc2lnbmVkIGludCBzZWM7CisJdW5zaWduZWQgaW50IHVzZWM7Cit9OworCisvKgorICogc3ByYXkgc3RhdGlzdGljcworICovCitzdHJ1Y3Qgc3ByYXljdW11bCB7CisJdW5zaWduZWQgaW50IGNvdW50ZXI7CisJc3ByYXl0aW1ldmFsIGNsb2NrOworfTsKKworLyoKKyAqIHNwcmF5IGRhdGEKKyAqLwordHlwZWRlZiBvcGFxdWUgc3ByYXlhcnI8U1BSQVlNQVg+OworCitwcm9ncmFtIFNQUkFZUFJPRyB7CisJdmVyc2lvbiBTUFJBWVZFUlMgeworCQkvKgorCQkgKiBKdXN0IHRocm93IGF3YXkgdGhlIGRhdGEgYW5kIGluY3JlbWVudCB0aGUgY291bnRlcgorCQkgKiBUaGlzIGNhbGwgbmV2ZXIgcmV0dXJucywgc28gdGhlIGNsaWVudCBzaG91bGQgYWx3YXlzCisJCSAqIHRpbWUgaXQgb3V0LgorCQkgKi8KKwkJdm9pZAorCQlTUFJBWVBST0NfU1BSQVkoc3ByYXlhcnIpID0gMTsKKworCQkvKgorCQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBjb3VudGVyIGFuZCBlbGFwc2VkIHRpbWUgIHNpbmNlCisJCSAqIGxhc3QgQ0xFQVIuCisJCSAqLworCQlzcHJheWN1bXVsCisJCVNQUkFZUFJPQ19HRVQodm9pZCkgPSAyOworCisJCS8qCisJCSAqIENsZWFyIHRoZSBjb3VudGVyIGFuZCByZXNldCB0aGUgZWxhcHNlZCB0aW1lCisJCSAqLworCQl2b2lkCisJCVNQUkFZUFJPQ19DTEVBUih2b2lkKSA9IDM7CisJfSA9IDE7Cit9ID0gMTAwMDEyOwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3lwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4Yjc0YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3lwLmgKQEAgLTAsMCArMSwzMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBBbWVyaWNhLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9fUlBDU1ZDX1lQX0hfXworI2RlZmluZSBfX1JQQ1NWQ19ZUF9IX18KKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8cnBjL3JwYy5oPgorCisjZGVmaW5lIFlQTUFYUkVDT1JEIDEwMjQKKyNkZWZpbmUgWVBNQVhET01BSU4gNjQKKyNkZWZpbmUgWVBNQVhNQVAgNjQKKyNkZWZpbmUgWVBNQVhQRUVSIDY0CisKK2VudW0geXBzdGF0IHsKKwlZUF9UUlVFID0gMSwKKwlZUF9OT01PUkUgPSAyLAorCVlQX0ZBTFNFID0gMCwKKwlZUF9OT01BUCA9IC0xLAorCVlQX05PRE9NID0gLTIsCisJWVBfTk9LRVkgPSAtMywKKwlZUF9CQURPUCA9IC00LAorCVlQX0JBRERCID0gLTUsCisJWVBfWVBFUlIgPSAtNiwKKwlZUF9CQURBUkdTID0gLTcsCisJWVBfVkVSUyA9IC04LAorfTsKK3R5cGVkZWYgZW51bSB5cHN0YXQgeXBzdGF0OworCitlbnVtIHlweGZyc3RhdCB7CisJWVBYRlJfU1VDQyA9IDEsCisJWVBYRlJfQUdFID0gMiwKKwlZUFhGUl9OT01BUCA9IC0xLAorCVlQWEZSX05PRE9NID0gLTIsCisJWVBYRlJfUlNSQyA9IC0zLAorCVlQWEZSX1JQQyA9IC00LAorCVlQWEZSX01BRERSID0gLTUsCisJWVBYRlJfWVBFUlIgPSAtNiwKKwlZUFhGUl9CQURBUkdTID0gLTcsCisJWVBYRlJfREJNID0gLTgsCisJWVBYRlJfRklMRSA9IC05LAorCVlQWEZSX1NLRVcgPSAtMTAsCisJWVBYRlJfQ0xFQVIgPSAtMTEsCisJWVBYRlJfRk9SQ0UgPSAtMTIsCisJWVBYRlJfWEZSRVJSID0gLTEzLAorCVlQWEZSX1JFRlVTRUQgPSAtMTQsCit9OwordHlwZWRlZiBlbnVtIHlweGZyc3RhdCB5cHhmcnN0YXQ7CisKK3R5cGVkZWYgY2hhciAqZG9tYWlubmFtZTsKK3R5cGVkZWYgY2hhciAqbWFwbmFtZTsKK3R5cGVkZWYgY2hhciAqcGVlcm5hbWU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdV9pbnQga2V5ZGF0X2xlbjsKKyAgY2hhciAqa2V5ZGF0X3ZhbDsKK30ga2V5ZGF0OworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVfaW50IHZhbGRhdF9sZW47CisgIGNoYXIgKnZhbGRhdF92YWw7Cit9IHZhbGRhdDsKKworc3RydWN0IHlwbWFwX3Bhcm1zIHsKKyAgZG9tYWlubmFtZSBkb21haW47CisgIG1hcG5hbWUgbWFwOworICB1X2ludCBvcmRlcm51bTsKKyAgcGVlcm5hbWUgcGVlcjsKK307Cit0eXBlZGVmIHN0cnVjdCB5cG1hcF9wYXJtcyB5cG1hcF9wYXJtczsKKworc3RydWN0IHlwcmVxX2tleSB7CisgIGRvbWFpbm5hbWUgZG9tYWluOworICBtYXBuYW1lIG1hcDsKKyAga2V5ZGF0IGtleTsKK307Cit0eXBlZGVmIHN0cnVjdCB5cHJlcV9rZXkgeXByZXFfa2V5OworCitzdHJ1Y3QgeXByZXFfbm9rZXkgeworICBkb21haW5uYW1lIGRvbWFpbjsKKyAgbWFwbmFtZSBtYXA7Cit9OwordHlwZWRlZiBzdHJ1Y3QgeXByZXFfbm9rZXkgeXByZXFfbm9rZXk7CisKK3N0cnVjdCB5cHJlcV94ZnIgeworICB5cG1hcF9wYXJtcyBtYXBfcGFybXM7CisgIHVfaW50IHRyYW5zaWQ7CisgIHVfaW50IHByb2c7CisgIHVfaW50IHBvcnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgeXByZXFfeGZyIHlwcmVxX3hmcjsKKworc3RydWN0IHlwcmVzcF92YWwgeworICB5cHN0YXQgc3RhdDsKKyAgdmFsZGF0IHZhbDsKK307Cit0eXBlZGVmIHN0cnVjdCB5cHJlc3BfdmFsIHlwcmVzcF92YWw7CisKK3N0cnVjdCB5cHJlc3Bfa2V5X3ZhbCB7CisgIHlwc3RhdCBzdGF0OworI2lmZGVmIFNUVVBJRF9TVU5fQlVHCisgIC8qIFRoaXMgaXMgdGhlIGZvcm0gYXMgZGlzdHJpYnV0ZWQgYnkgU3VuLiAgQnV0IGV2ZW4gdGhlIFN1biBOSVMKKyAgICAgc2VydmVycyBleHBlY3QgdGhlIHZhbHVlcyBpbiB0aGUgb3RoZXIgb3JkZXIuICBTbyB0aGVpcgorICAgICBpbXBsZW1lbnRhdGlvbiBzb21laG93IG11c3QgY2hhbmdlIHRoZSBvcmRlciBpbnRlcm5hbGx5LiAgV2UKKyAgICAgZG9uJ3Qgd2FudCB0byBmb2xsb3cgdGhpcyBiYWQgZXhhbXBsZSBzaW5jZSB0aGUgdXNlciBzaG91bGQgYmUKKyAgICAgYWJsZSB0byB1c2UgcnBjZ2VuIG9uIHRoaXMgZmlsZS4gICovCisgIGtleWRhdCBrZXk7CisgIHZhbGRhdCB2YWw7CisjZWxzZQorICB2YWxkYXQgdmFsOworICBrZXlkYXQga2V5OworI2VuZGlmCit9OwordHlwZWRlZiBzdHJ1Y3QgeXByZXNwX2tleV92YWwgeXByZXNwX2tleV92YWw7CisKK3N0cnVjdCB5cHJlc3BfbWFzdGVyIHsKKyAgeXBzdGF0IHN0YXQ7CisgIHBlZXJuYW1lIHBlZXI7Cit9OwordHlwZWRlZiBzdHJ1Y3QgeXByZXNwX21hc3RlciB5cHJlc3BfbWFzdGVyOworCitzdHJ1Y3QgeXByZXNwX29yZGVyIHsKKyAgeXBzdGF0IHN0YXQ7CisgIHVfaW50IG9yZGVybnVtOworfTsKK3R5cGVkZWYgc3RydWN0IHlwcmVzcF9vcmRlciB5cHJlc3Bfb3JkZXI7CisKK3N0cnVjdCB5cHJlc3BfYWxsIHsKKyAgYm9vbF90IG1vcmU7CisgIHVuaW9uIHsKKyAgICB5cHJlc3Bfa2V5X3ZhbCB2YWw7CisgIH0geXByZXNwX2FsbF91OworfTsKK3R5cGVkZWYgc3RydWN0IHlwcmVzcF9hbGwgeXByZXNwX2FsbDsKKworc3RydWN0IHlwcmVzcF94ZnIgeworICB1X2ludCB0cmFuc2lkOworICB5cHhmcnN0YXQgeGZyc3RhdDsKK307Cit0eXBlZGVmIHN0cnVjdCB5cHJlc3BfeGZyIHlwcmVzcF94ZnI7CisKK3N0cnVjdCB5cG1hcGxpc3QgeworICBtYXBuYW1lIG1hcDsKKyAgc3RydWN0IHlwbWFwbGlzdCAqbmV4dDsKK307Cit0eXBlZGVmIHN0cnVjdCB5cG1hcGxpc3QgeXBtYXBsaXN0OworCitzdHJ1Y3QgeXByZXNwX21hcGxpc3QgeworICB5cHN0YXQgc3RhdDsKKyAgeXBtYXBsaXN0ICptYXBzOworfTsKK3R5cGVkZWYgc3RydWN0IHlwcmVzcF9tYXBsaXN0IHlwcmVzcF9tYXBsaXN0OworCitlbnVtIHlwcHVzaF9zdGF0dXMgeworICBZUFBVU0hfU1VDQyA9IDEsCisgIFlQUFVTSF9BR0UgPSAyLAorICBZUFBVU0hfTk9NQVAgPSAtMSwKKyAgWVBQVVNIX05PRE9NID0gLTIsCisgIFlQUFVTSF9SU1JDID0gLTMsCisgIFlQUFVTSF9SUEMgPSAtNCwKKyAgWVBQVVNIX01BRERSID0gLTUsCisgIFlQUFVTSF9ZUEVSUiA9IC02LAorICBZUFBVU0hfQkFEQVJHUyA9IC03LAorICBZUFBVU0hfREJNID0gLTgsCisgIFlQUFVTSF9GSUxFID0gLTksCisgIFlQUFVTSF9TS0VXID0gLTEwLAorICBZUFBVU0hfQ0xFQVIgPSAtMTEsCisgIFlQUFVTSF9GT1JDRSA9IC0xMiwKKyAgWVBQVVNIX1hGUkVSUiA9IC0xMywKKyAgWVBQVVNIX1JFRlVTRUQgPSAtMTQsCit9OwordHlwZWRlZiBlbnVtIHlwcHVzaF9zdGF0dXMgeXBwdXNoX3N0YXR1czsKKworc3RydWN0IHlwcHVzaHJlc3BfeGZyIHsKKyAgdV9pbnQgdHJhbnNpZDsKKyAgeXBwdXNoX3N0YXR1cyBzdGF0dXM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgeXBwdXNocmVzcF94ZnIgeXBwdXNocmVzcF94ZnI7CisKK2VudW0geXBiaW5kX3Jlc3B0eXBlIHsKKyAgWVBCSU5EX1NVQ0NfVkFMID0gMSwKKyAgWVBCSU5EX0ZBSUxfVkFMID0gMiwKK307Cit0eXBlZGVmIGVudW0geXBiaW5kX3Jlc3B0eXBlIHlwYmluZF9yZXNwdHlwZTsKKworc3RydWN0IHlwYmluZF9iaW5kaW5nIHsKKyAgY2hhciB5cGJpbmRfYmluZGluZ19hZGRyWzRdOworICBjaGFyIHlwYmluZF9iaW5kaW5nX3BvcnRbMl07Cit9OwordHlwZWRlZiBzdHJ1Y3QgeXBiaW5kX2JpbmRpbmcgeXBiaW5kX2JpbmRpbmc7CisKK3N0cnVjdCB5cGJpbmRfcmVzcCB7CisgIHlwYmluZF9yZXNwdHlwZSB5cGJpbmRfc3RhdHVzOworICB1bmlvbiB7CisgICAgdV9pbnQgeXBiaW5kX2Vycm9yOworICAgIHlwYmluZF9iaW5kaW5nIHlwYmluZF9iaW5kaW5mbzsKKyAgfSB5cGJpbmRfcmVzcF91OworfTsKK3R5cGVkZWYgc3RydWN0IHlwYmluZF9yZXNwIHlwYmluZF9yZXNwOworCisjZGVmaW5lIFlQQklORF9FUlJfRVJSIDEKKyNkZWZpbmUgWVBCSU5EX0VSUl9OT1NFUlYgMgorI2RlZmluZSBZUEJJTkRfRVJSX1JFU0MgMworCitzdHJ1Y3QgeXBiaW5kX3NldGRvbSB7CisgIGRvbWFpbm5hbWUgeXBzZXRkb21fZG9tYWluOworICB5cGJpbmRfYmluZGluZyB5cHNldGRvbV9iaW5kaW5nOworICB1X2ludCB5cHNldGRvbV92ZXJzOworfTsKK3R5cGVkZWYgc3RydWN0IHlwYmluZF9zZXRkb20geXBiaW5kX3NldGRvbTsKKworX19CRUdJTl9ERUNMUworCisjZGVmaW5lIFlQUFJPRyAxMDAwMDQKKyNkZWZpbmUgWVBWRVJTIDIKKworI2RlZmluZSBZUFBST0NfTlVMTCAwCitleHRlcm4gIHZvaWQgKnlwcHJvY19udWxsXzIgKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICp5cHByb2NfbnVsbF8yX3N2YyAodm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgWVBQUk9DX0RPTUFJTiAxCitleHRlcm4gIGJvb2xfdCAqeXBwcm9jX2RvbWFpbl8yIChkb21haW5uYW1lICosIENMSUVOVCAqKTsKK2V4dGVybiAgYm9vbF90ICp5cHByb2NfZG9tYWluXzJfc3ZjIChkb21haW5uYW1lICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBZUFBST0NfRE9NQUlOX05PTkFDSyAyCitleHRlcm4gIGJvb2xfdCAqeXBwcm9jX2RvbWFpbl9ub25hY2tfMiAoZG9tYWlubmFtZSAqLCBDTElFTlQgKik7CitleHRlcm4gIGJvb2xfdCAqeXBwcm9jX2RvbWFpbl9ub25hY2tfMl9zdmMgKGRvbWFpbm5hbWUgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFlQUFJPQ19NQVRDSCAzCitleHRlcm4gIHlwcmVzcF92YWwgKnlwcHJvY19tYXRjaF8yICh5cHJlcV9rZXkgKiwgQ0xJRU5UICopOworZXh0ZXJuICB5cHJlc3BfdmFsICp5cHByb2NfbWF0Y2hfMl9zdmMgKHlwcmVxX2tleSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgWVBQUk9DX0ZJUlNUIDQKK2V4dGVybiAgeXByZXNwX2tleV92YWwgKnlwcHJvY19maXJzdF8yICh5cHJlcV9rZXkgKiwgQ0xJRU5UICopOworZXh0ZXJuICB5cHJlc3Bfa2V5X3ZhbCAqeXBwcm9jX2ZpcnN0XzJfc3ZjICh5cHJlcV9rZXkgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFlQUFJPQ19ORVhUIDUKK2V4dGVybiAgeXByZXNwX2tleV92YWwgKnlwcHJvY19uZXh0XzIgKHlwcmVxX2tleSAqLCBDTElFTlQgKik7CitleHRlcm4gIHlwcmVzcF9rZXlfdmFsICp5cHByb2NfbmV4dF8yX3N2YyAoeXByZXFfa2V5ICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBZUFBST0NfWEZSIDYKK2V4dGVybiAgeXByZXNwX3hmciAqeXBwcm9jX3hmcl8yICh5cHJlcV94ZnIgKiwgQ0xJRU5UICopOworZXh0ZXJuICB5cHJlc3BfeGZyICp5cHByb2NfeGZyXzJfc3ZjICh5cHJlcV94ZnIgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFlQUFJPQ19DTEVBUiA3CitleHRlcm4gIHZvaWQgKnlwcHJvY19jbGVhcl8yICh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqeXBwcm9jX2NsZWFyXzJfc3ZjICh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBZUFBST0NfQUxMIDgKK2V4dGVybiAgeXByZXNwX2FsbCAqeXBwcm9jX2FsbF8yICh5cHJlcV9ub2tleSAqLCBDTElFTlQgKik7CitleHRlcm4gIHlwcmVzcF9hbGwgKnlwcHJvY19hbGxfMl9zdmMgKHlwcmVxX25va2V5ICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBZUFBST0NfTUFTVEVSIDkKK2V4dGVybiAgeXByZXNwX21hc3RlciAqeXBwcm9jX21hc3Rlcl8yICh5cHJlcV9ub2tleSAqLCBDTElFTlQgKik7CitleHRlcm4gIHlwcmVzcF9tYXN0ZXIgKnlwcHJvY19tYXN0ZXJfMl9zdmMgKHlwcmVxX25va2V5ICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBZUFBST0NfT1JERVIgMTAKK2V4dGVybiAgeXByZXNwX29yZGVyICp5cHByb2Nfb3JkZXJfMiAoeXByZXFfbm9rZXkgKiwgQ0xJRU5UICopOworZXh0ZXJuICB5cHJlc3Bfb3JkZXIgKnlwcHJvY19vcmRlcl8yX3N2YyAoeXByZXFfbm9rZXkgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFlQUFJPQ19NQVBMSVNUIDExCitleHRlcm4gIHlwcmVzcF9tYXBsaXN0ICp5cHByb2NfbWFwbGlzdF8yIChkb21haW5uYW1lICosIENMSUVOVCAqKTsKK2V4dGVybiAgeXByZXNwX21hcGxpc3QgKnlwcHJvY19tYXBsaXN0XzJfc3ZjIChkb21haW5uYW1lICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCB5cHByb2dfMl9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKworI2RlZmluZSBZUFBVU0hfWEZSUkVTUFBST0cgKDB4NDAwMDAwMDApCisjZGVmaW5lIFlQUFVTSF9YRlJSRVNQVkVSUyAxCisKKyNkZWZpbmUgWVBQVVNIUFJPQ19OVUxMIDAKK2V4dGVybiAgdm9pZCAqeXBwdXNocHJvY19udWxsXzEgKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICp5cHB1c2hwcm9jX251bGxfMV9zdmMgKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFlQUFVTSFBST0NfWEZSUkVTUCAxCitleHRlcm4gIHZvaWQgKnlwcHVzaHByb2NfeGZycmVzcF8xICh5cHB1c2hyZXNwX3hmciAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKnlwcHVzaHByb2NfeGZycmVzcF8xX3N2YyAoeXBwdXNocmVzcF94ZnIgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gaW50IHlwcHVzaF94ZnJyZXNwcHJvZ18xX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKKworCisjZGVmaW5lIFlQQklORFBST0cgMTAwMDA3CisjZGVmaW5lIFlQQklORFZFUlMgMgorCisjZGVmaW5lIFlQQklORFBST0NfTlVMTCAwCitleHRlcm4gIHZvaWQgKnlwYmluZHByb2NfbnVsbF8yICh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqeXBiaW5kcHJvY19udWxsXzJfc3ZjICh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBZUEJJTkRQUk9DX0RPTUFJTiAxCitleHRlcm4gIHlwYmluZF9yZXNwICp5cGJpbmRwcm9jX2RvbWFpbl8yIChkb21haW5uYW1lICosIENMSUVOVCAqKTsKK2V4dGVybiAgeXBiaW5kX3Jlc3AgKnlwYmluZHByb2NfZG9tYWluXzJfc3ZjIChkb21haW5uYW1lICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBZUEJJTkRQUk9DX1NFVERPTSAyCitleHRlcm4gIHZvaWQgKnlwYmluZHByb2Nfc2V0ZG9tXzIgKHlwYmluZF9zZXRkb20gKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICp5cGJpbmRwcm9jX3NldGRvbV8yX3N2YyAoeXBiaW5kX3NldGRvbSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiBpbnQgeXBiaW5kcHJvZ18yX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKKworCitleHRlcm4gIGJvb2xfdCB4ZHJfeXBzdGF0IChYRFIgKiwgeXBzdGF0Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfeXB4ZnJzdGF0IChYRFIgKiwgeXB4ZnJzdGF0Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZG9tYWlubmFtZSAoWERSICosIGRvbWFpbm5hbWUqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9tYXBuYW1lIChYRFIgKiwgbWFwbmFtZSopOworZXh0ZXJuICBib29sX3QgeGRyX3BlZXJuYW1lIChYRFIgKiwgcGVlcm5hbWUqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9rZXlkYXQgKFhEUiAqLCBrZXlkYXQqKTsKK2V4dGVybiAgYm9vbF90IHhkcl92YWxkYXQgKFhEUiAqLCB2YWxkYXQqKTsKK2V4dGVybiAgYm9vbF90IHhkcl95cG1hcF9wYXJtcyAoWERSICosIHlwbWFwX3Bhcm1zKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfeXByZXFfa2V5IChYRFIgKiwgeXByZXFfa2V5Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfeXByZXFfbm9rZXkgKFhEUiAqLCB5cHJlcV9ub2tleSopOworZXh0ZXJuICBib29sX3QgeGRyX3lwcmVxX3hmciAoWERSICosIHlwcmVxX3hmciopOworZXh0ZXJuICBib29sX3QgeGRyX3lwcmVzcF92YWwgKFhEUiAqLCB5cHJlc3BfdmFsKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfeXByZXNwX2tleV92YWwgKFhEUiAqLCB5cHJlc3Bfa2V5X3ZhbCopOworZXh0ZXJuICBib29sX3QgeGRyX3lwcmVzcF9tYXN0ZXIgKFhEUiAqLCB5cHJlc3BfbWFzdGVyKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfeXByZXNwX29yZGVyIChYRFIgKiwgeXByZXNwX29yZGVyKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfeXByZXNwX2FsbCAoWERSICosIHlwcmVzcF9hbGwqKTsKK2V4dGVybiAgYm9vbF90IHhkcl95cHJlc3BfeGZyIChYRFIgKiwgeXByZXNwX3hmciopOworZXh0ZXJuICBib29sX3QgeGRyX3lwbWFwbGlzdCAoWERSICosIHlwbWFwbGlzdCopOworZXh0ZXJuICBib29sX3QgeGRyX3lwcmVzcF9tYXBsaXN0IChYRFIgKiwgeXByZXNwX21hcGxpc3QqKTsKK2V4dGVybiAgYm9vbF90IHhkcl95cHB1c2hfc3RhdHVzIChYRFIgKiwgeXBwdXNoX3N0YXR1cyopOworZXh0ZXJuICBib29sX3QgeGRyX3lwcHVzaHJlc3BfeGZyIChYRFIgKiwgeXBwdXNocmVzcF94ZnIqKTsKK2V4dGVybiAgYm9vbF90IHhkcl95cGJpbmRfcmVzcHR5cGUgKFhEUiAqLCB5cGJpbmRfcmVzcHR5cGUqKTsKK2V4dGVybiAgYm9vbF90IHhkcl95cGJpbmRfYmluZGluZyAoWERSICosIHlwYmluZF9iaW5kaW5nKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfeXBiaW5kX3Jlc3AgKFhEUiAqLCB5cGJpbmRfcmVzcCopOworZXh0ZXJuICBib29sX3QgeGRyX3lwYmluZF9zZXRkb20gKFhEUiAqLCB5cGJpbmRfc2V0ZG9tKik7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiAhX19SUENTVkNfWVBfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy95cC54IGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXAueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjlhZTZmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXAueApAQCAtMCwwICsxLDMxMSBAQAorLyogQCgjKXlwLngJMi4xIDg4LzA4LzAxIDQuMCBSUENTUkMgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBQcm90b2NvbCBkZXNjcmlwdGlvbiBmaWxlIGZvciB0aGUgWWVsbG93IFBhZ2VzIFNlcnZpY2UKKyAqLworCitjb25zdCBZUE1BWFJFQ09SRCA9IDEwMjQ7Citjb25zdCBZUE1BWERPTUFJTiA9IDY0OworY29uc3QgWVBNQVhNQVAgPSA2NDsKK2NvbnN0IFlQTUFYUEVFUiA9IDY0OworCisKK2VudW0geXBzdGF0IHsKKwlZUF9UUlVFCQk9ICAxLAorCVlQX05PTU9SRQk9ICAyLAorCVlQX0ZBTFNFCT0gIDAsCisJWVBfTk9NQVAJPSAtMSwKKwlZUF9OT0RPTQk9IC0yLAorCVlQX05PS0VZCT0gLTMsCisJWVBfQkFET1AJPSAtNCwKKwlZUF9CQUREQgk9IC01LAorCVlQX1lQRVJSCT0gLTYsCisJWVBfQkFEQVJHUwk9IC03LAorCVlQX1ZFUlMJCT0gLTgKK307CisKKworZW51bSB5cHhmcnN0YXQgeworCVlQWEZSX1NVQ0MJPSAgMSwKKwlZUFhGUl9BR0UJPSAgMiwKKwlZUFhGUl9OT01BUAk9IC0xLAorCVlQWEZSX05PRE9NCT0gLTIsCisJWVBYRlJfUlNSQwk9IC0zLAorCVlQWEZSX1JQQwk9IC00LAorCVlQWEZSX01BRERSCT0gLTUsCisJWVBYRlJfWVBFUlIJPSAtNiwKKwlZUFhGUl9CQURBUkdTCT0gLTcsCisJWVBYRlJfREJNCT0gLTgsCisJWVBYRlJfRklMRQk9IC05LAorCVlQWEZSX1NLRVcJPSAtMTAsCisJWVBYRlJfQ0xFQVIJPSAtMTEsCisJWVBYRlJfRk9SQ0UJPSAtMTIsCisJWVBYRlJfWEZSRVJSCT0gLTEzLAorCVlQWEZSX1JFRlVTRUQJPSAtMTQKK307CisKKwordHlwZWRlZiBzdHJpbmcgZG9tYWlubmFtZTxZUE1BWERPTUFJTj47Cit0eXBlZGVmIHN0cmluZyBtYXBuYW1lPFlQTUFYTUFQPjsKK3R5cGVkZWYgc3RyaW5nIHBlZXJuYW1lPFlQTUFYUEVFUj47Cit0eXBlZGVmIG9wYXF1ZSBrZXlkYXQ8WVBNQVhSRUNPUkQ+OwordHlwZWRlZiBvcGFxdWUgdmFsZGF0PFlQTUFYUkVDT1JEPjsKKworCitzdHJ1Y3QgeXBtYXBfcGFybXMgeworCWRvbWFpbm5hbWUgZG9tYWluOworCW1hcG5hbWUgbWFwOworCXVuc2lnbmVkIGludCBvcmRlcm51bTsKKwlwZWVybmFtZSBwZWVyOworfTsKKworc3RydWN0IHlwcmVxX2tleSB7CisJZG9tYWlubmFtZSBkb21haW47CisJbWFwbmFtZSBtYXA7CisJa2V5ZGF0IGtleTsKK307CisKK3N0cnVjdCB5cHJlcV9ub2tleSB7CisJZG9tYWlubmFtZSBkb21haW47CisJbWFwbmFtZSBtYXA7Cit9OworCitzdHJ1Y3QgeXByZXFfeGZyIHsKKwl5cG1hcF9wYXJtcyBtYXBfcGFybXM7CisJdW5zaWduZWQgaW50IHRyYW5zaWQ7CisJdW5zaWduZWQgaW50IHByb2c7CisJdW5zaWduZWQgaW50IHBvcnQ7Cit9OworCisKK3N0cnVjdCB5cHJlc3BfdmFsIHsKKwl5cHN0YXQgc3RhdDsKKwl2YWxkYXQgdmFsOworfTsKKworc3RydWN0IHlwcmVzcF9rZXlfdmFsIHsKKwl5cHN0YXQgc3RhdDsKKyNpZmRlZiBTVFVQSURfU1VOX0JVRworCS8qIFRoaXMgaXMgdGhlIGZvcm0gYXMgZGlzdHJpYnV0ZWQgYnkgU3VuLiAgQnV0IGV2ZW4gdGhlIFN1biBOSVMKKwkgICBzZXJ2ZXJzIGV4cGVjdCB0aGUgdmFsdWVzIGluIHRoZSBvdGhlciBvcmRlci4gIFNvIHRoZWlyCisJICAgaW1wbGVtZW50YXRpb24gc29tZWhvdyBtdXN0IGNoYW5nZSB0aGUgb3JkZXIgaW50ZXJuYWxseS4gIFdlCisJICAgZG9uJ3Qgd2FudCB0byBmb2xsb3cgdGhpcyBiYWQgZXhhbXBsZSBzaW5jZSB0aGUgdXNlciBzaG91bGQgYmUKKwkgICBhYmxlIHRvIHVzZSBycGNnZW4gb24gdGhpcyBmaWxlLiAgKi8KKwlrZXlkYXQga2V5OworCXZhbGRhdCB2YWw7CisjZWxzZQorCXZhbGRhdCB2YWw7CisJa2V5ZGF0IGtleTsKKyNlbmRpZgorfTsKKworCitzdHJ1Y3QgeXByZXNwX21hc3RlciB7CisJeXBzdGF0IHN0YXQ7CisJcGVlcm5hbWUgcGVlcjsKK307CisKK3N0cnVjdCB5cHJlc3Bfb3JkZXIgeworCXlwc3RhdCBzdGF0OworCXVuc2lnbmVkIGludCBvcmRlcm51bTsKK307CisKK3VuaW9uIHlwcmVzcF9hbGwgc3dpdGNoIChib29sIG1vcmUpIHsKK2Nhc2UgVFJVRToKKwl5cHJlc3Bfa2V5X3ZhbCB2YWw7CitjYXNlIEZBTFNFOgorCXZvaWQ7Cit9OworCitzdHJ1Y3QgeXByZXNwX3hmciB7CisJdW5zaWduZWQgaW50IHRyYW5zaWQ7CisJeXB4ZnJzdGF0IHhmcnN0YXQ7Cit9OworCitzdHJ1Y3QgeXBtYXBsaXN0IHsKKwltYXBuYW1lIG1hcDsKKwl5cG1hcGxpc3QgKm5leHQ7Cit9OworCitzdHJ1Y3QgeXByZXNwX21hcGxpc3QgeworCXlwc3RhdCBzdGF0OworCXlwbWFwbGlzdCAqbWFwczsKK307CisKK2VudW0geXBwdXNoX3N0YXR1cyB7CisJWVBQVVNIX1NVQ0MJPSAgMSwJLyogU3VjY2VzcyAqLworCVlQUFVTSF9BR0UJPSAgMiwJLyogTWFzdGVyJ3MgdmVyc2lvbiBub3QgbmV3ZXIgKi8KKwlZUFBVU0hfTk9NQVAJPSAtMSwJLyogQ2FuJ3QgZmluZCBzZXJ2ZXIgZm9yIG1hcCAqLworCVlQUFVTSF9OT0RPTQk9IC0yLAkvKiBEb21haW4gbm90IHN1cHBvcnRlZCAqLworCVlQUFVTSF9SU1JDCT0gLTMsCS8qIExvY2FsIHJlc291cmNlIGFsbG9jIGZhaWx1cmUgKi8KKwlZUFBVU0hfUlBDCT0gLTQsCS8qIFJQQyBmYWlsdXJlIHRhbGtpbmcgdG8gc2VydmVyICovCisJWVBQVVNIX01BRERSCT0gLTUsCS8qIENhbid0IGdldCBtYXN0ZXIgYWRkcmVzcyAqLworCVlQUFVTSF9ZUEVSUgk9IC02LAkvKiBZUCBzZXJ2ZXIvbWFwIGRiIGVycm9yICovCisJWVBQVVNIX0JBREFSR1MJPSAtNywJLyogUmVxdWVzdCBhcmd1bWVudHMgYmFkICovCisJWVBQVVNIX0RCTQk9IC04LAkvKiBMb2NhbCBkYm0gb3BlcmF0aW9uIGZhaWxlZCAqLworCVlQUFVTSF9GSUxFCT0gLTksCS8qIExvY2FsIGZpbGUgSS9PIG9wZXJhdGlvbiBmYWlsZWQgKi8KKwlZUFBVU0hfU0tFVwk9IC0xMCwJLyogTWFwIHZlcnNpb24gc2tldyBkdXJpbmcgdHJhbnNmZXIgKi8KKwlZUFBVU0hfQ0xFQVIJPSAtMTEsCS8qIENhbid0IHNlbmQgIkNsZWFyIiByZXEgdG8gbG9jYWwgeXBzZXJ2ICovCisJWVBQVVNIX0ZPUkNFCT0gLTEyLAkvKiBObyBsb2NhbCBvcmRlciBudW1iZXIgaW4gbWFwICB1c2UgLWYgZmxhZy4gKi8KKwlZUFBVU0hfWEZSRVJSCT0gLTEzLAkvKiB5cHhmciBlcnJvciAqLworCVlQUFVTSF9SRUZVU0VECT0gLTE0CS8qIFRyYW5zZmVyIHJlcXVlc3QgcmVmdXNlZCBieSB5cHNlcnYgKi8KK307CisKK3N0cnVjdCB5cHB1c2hyZXNwX3hmciB7CisJdW5zaWduZWQgdHJhbnNpZDsKKwl5cHB1c2hfc3RhdHVzIHN0YXR1czsKK307CisKKy8qCisgKiBSZXNwb25zZSBzdHJ1Y3R1cmUgYW5kIG92ZXJhbGwgcmVzdWx0IHN0YXR1cyBjb2Rlcy4gIFN1Y2Nlc3MgYW5kIGZhaWx1cmUKKyAqIHJlcHJlc2VudCB0d28gc2VwYXJhdGUgcmVzcG9uc2UgbWVzc2FnZSB0eXBlcy4KKyAqLworCitlbnVtIHlwYmluZF9yZXNwdHlwZSB7CisJWVBCSU5EX1NVQ0NfVkFMID0gMSwKKwlZUEJJTkRfRkFJTF9WQUwgPSAyCit9OworCitzdHJ1Y3QgeXBiaW5kX2JpbmRpbmcgeworICAgIG9wYXF1ZSB5cGJpbmRfYmluZGluZ19hZGRyWzRdOyAvKiBJbiBuZXR3b3JrIG9yZGVyICovCisgICAgb3BhcXVlIHlwYmluZF9iaW5kaW5nX3BvcnRbMl07IC8qIEluIG5ldHdvcmsgb3JkZXIgKi8KK307CisKK3VuaW9uIHlwYmluZF9yZXNwIHN3aXRjaCAoeXBiaW5kX3Jlc3B0eXBlIHlwYmluZF9zdGF0dXMpIHsKK2Nhc2UgWVBCSU5EX0ZBSUxfVkFMOgorCXVuc2lnbmVkIHlwYmluZF9lcnJvcjsKK2Nhc2UgWVBCSU5EX1NVQ0NfVkFMOgorCXlwYmluZF9iaW5kaW5nIHlwYmluZF9iaW5kaW5mbzsKK307CisKKy8qIERldGFpbGVkIGZhaWx1cmUgcmVhc29uIGNvZGVzIGZvciByZXNwb25zZSBmaWVsZCB5cGJpbmRfZXJyb3IqLworCitjb25zdCBZUEJJTkRfRVJSX0VSUiAgICA9IDE7CS8qIEludGVybmFsIGVycm9yICovCitjb25zdCBZUEJJTkRfRVJSX05PU0VSViA9IDI7CS8qIE5vIGJvdW5kIHNlcnZlciBmb3IgcGFzc2VkIGRvbWFpbiAqLworY29uc3QgWVBCSU5EX0VSUl9SRVNDICAgPSAzOwkvKiBTeXN0ZW0gcmVzb3VyY2UgYWxsb2NhdGlvbiBmYWlsdXJlICovCisKKworLyoKKyAqIFJlcXVlc3QgZGF0YSBzdHJ1Y3R1cmUgZm9yIHlwYmluZCAiU2V0IGRvbWFpbiIgcHJvY2VkdXJlLgorICovCitzdHJ1Y3QgeXBiaW5kX3NldGRvbSB7CisJZG9tYWlubmFtZSB5cHNldGRvbV9kb21haW47CisJeXBiaW5kX2JpbmRpbmcgeXBzZXRkb21fYmluZGluZzsKKwl1bnNpZ25lZCB5cHNldGRvbV92ZXJzOworfTsKKworCisvKgorICogWVAgYWNjZXNzIHByb3RvY29sCisgKi8KK3Byb2dyYW0gWVBQUk9HIHsKKwl2ZXJzaW9uIFlQVkVSUyB7CisJCXZvaWQKKwkJWVBQUk9DX05VTEwodm9pZCkgPSAwOworCisJCWJvb2wKKwkJWVBQUk9DX0RPTUFJTihkb21haW5uYW1lKSA9IDE7CisKKwkJYm9vbAorCQlZUFBST0NfRE9NQUlOX05PTkFDSyhkb21haW5uYW1lKSA9IDI7CisKKwkJeXByZXNwX3ZhbAorCQlZUFBST0NfTUFUQ0goeXByZXFfa2V5KSA9IDM7CisKKwkJeXByZXNwX2tleV92YWwKKwkJWVBQUk9DX0ZJUlNUKHlwcmVxX2tleSkgPSA0OworCisJCXlwcmVzcF9rZXlfdmFsCisJCVlQUFJPQ19ORVhUKHlwcmVxX2tleSkgPSA1OworCisJCXlwcmVzcF94ZnIKKwkJWVBQUk9DX1hGUih5cHJlcV94ZnIpID0gNjsKKworCQl2b2lkCisJCVlQUFJPQ19DTEVBUih2b2lkKSA9IDc7CisKKwkJeXByZXNwX2FsbAorCQlZUFBST0NfQUxMKHlwcmVxX25va2V5KSA9IDg7CisKKwkJeXByZXNwX21hc3RlcgorCQlZUFBST0NfTUFTVEVSKHlwcmVxX25va2V5KSA9IDk7CisKKwkJeXByZXNwX29yZGVyCisJCVlQUFJPQ19PUkRFUih5cHJlcV9ub2tleSkgPSAxMDsKKworCQl5cHJlc3BfbWFwbGlzdAorCQlZUFBST0NfTUFQTElTVChkb21haW5uYW1lKSA9IDExOworCX0gPSAyOworfSA9IDEwMDAwNDsKKworCisvKgorICogWVBQVVNIUFJPQ19YRlJSRVNQIGlzIHRoZSBjYWxsYmFjayByb3V0aW5lIGZvciByZXN1bHQgb2YgWVBQUk9DX1hGUgorICovCitwcm9ncmFtIFlQUFVTSF9YRlJSRVNQUFJPRyB7CisJdmVyc2lvbiBZUFBVU0hfWEZSUkVTUFZFUlMgeworCQl2b2lkCisJCVlQUFVTSFBST0NfTlVMTCh2b2lkKSA9IDA7CisKKyNpZmRlZiBTVFVQSURfU1VOX0JVRworCQkvKiBUaGlzIGlzIHRoZSBmb3JtIGFzIGRpc3RyaWJ1dGVkIGJ5IFN1bi4gIEJ1dCBldmVuCisJCSAgIHRoZSBTdW4gTklTIHNlcnZlcnMgZXhwZWN0IHRoZSB2YWx1ZXMgaW4gdGhlIG90aGVyCisJCSAgIG9yZGVyLiAgU28gdGhlaXIgaW1wbGVtZW50YXRpb24gc29tZWhvdyBtdXN0IGNoYW5nZQorCQkgICB0aGUgb3JkZXIgaW50ZXJuYWxseS4gIFdlIGRvbid0IHdhbnQgdG8gZm9sbG93IHRoaXMKKwkJICAgYmFkIGV4YW1wbGUgc2luY2UgdGhlIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gdXNlCisJCSAgIHJwY2dlbiBvbiB0aGlzIGZpbGUuICAqLworCQl5cHB1c2hyZXNwX3hmcgorCQlZUFBVU0hQUk9DX1hGUlJFU1Aodm9pZCkgPSAxOworI2Vsc2UKKwkJdm9pZAorCQlZUFBVU0hQUk9DX1hGUlJFU1AoeXBwdXNocmVzcF94ZnIpID0gMTsKKyNlbmRpZgorCX0gPSAxOworfSA9IDB4NDAwMDAwMDA7CS8qIHRyYW5zaWVudDogY291bGQgYmUgYW55dGhpbmcgdXAgdG8gMHg1ZmZmZmZmZiAqLworCisvKgorICogWVAgYmluZGluZyBwcm90b2NvbAorICovCitwcm9ncmFtIFlQQklORFBST0cgeworCXZlcnNpb24gWVBCSU5EVkVSUyB7CisJCXZvaWQKKwkJWVBCSU5EUFJPQ19OVUxMKHZvaWQpID0gMDsKKworCQl5cGJpbmRfcmVzcAorCQlZUEJJTkRQUk9DX0RPTUFJTihkb21haW5uYW1lKSA9IDE7CisKKwkJdm9pZAorCQlZUEJJTkRQUk9DX1NFVERPTSh5cGJpbmRfc2V0ZG9tKSA9IDI7CisJfSA9IDI7Cit9ID0gMTAwMDA3OwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXBfcHJvdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXBfcHJvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMGRiMzYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy95cF9wcm90LmgKQEAgLTAsMCArMSwzNjYgQEAKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgc3ltYm9scyBhbmQgc3RydWN0dXJlcyBkZWZpbmluZyB0aGUgcnBjIHByb3RvY29sCisgKiBiZXR3ZWVuIHRoZSBOSVMgY2xpZW50cyBhbmQgdGhlIE5JUyBzZXJ2ZXJzLiAgVGhlIHNlcnZlcnMKKyAqIGFyZSB0aGUgTklTIGRhdGFiYXNlIHNlcnZlcnMsIGFuZCB0aGUgTklTIGJpbmRlcnMuCisgKi8KKworI2lmbmRlZiBfUlBDU1ZDX1lQX1BST1RfSAorI2RlZmluZSBfUlBDU1ZDX1lQX1BST1RfSAorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKyNpbmNsdWRlIDxycGNzdmMveXBjbG50Lmg+CisKK19fQkVHSU5fREVDTFMKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlcyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBwcm90b2NvbDoKKyAqCisgKiBZUFBST0NfTlVMTCgpIHJldHVybnMgKCkgdGFrZXMgbm90aGluZywgcmV0dXJucyBub3RoaW5nLiAgVGhpcyBpbmRpY2F0ZXMKKyAqIHRoYXQgdGhlIE5JUyBzZXJ2ZXIgaXMgYWxpdmUuCisgKgorICogWVBQUk9DX0RPTUFJTiAoY2hhciAqKSByZXR1cm5zIChib29sX3QpIFRSVUUuICBJbmRpY2F0ZXMgdGhhdCB0aGUKKyAqIHJlc3BvbmRpbmcgTklTIHNlcnZlciBkb2VzIHNlcnZlIHRoZSBuYW1lZCBkb21haW47IEZBTFNFIGluZGljYXRlcyBubworICogc3VwcG9ydC4KKyAqCisgKiBZUFBST0NfRE9NQUlOX05PTkFDSyAoY2hhciAqKSByZXR1cm5zIChUUlVFKSBpZiB0aGUgTklTIHNlcnZlciBkb2VzIHNlcnZlCisgKiB0aGUgbmFtZWQgZG9tYWluLCBvdGhlcndpc2UgZG9lcyBub3QgcmV0dXJuLiAgVXNlZCBpbiB0aGUgYnJvYWRjYXN0IGNhc2UuCisgKgorICogWVBQUk9DX01BVENIIChzdHJ1Y3QgeXByZXFfa2V5KSByZXR1cm5zIChzdHJ1Y3QgeXByZXNwX3ZhbCkuICBSZXR1cm5zIHRoZQorICogcmlnaHQtaGFuZCB2YWx1ZSBmb3IgYSBwYXNzZWQgbGVmdC1oYW5kIGtleSwgd2l0aGluIGEgbmFtZWQgbWFwIGFuZAorICogZG9tYWluLgorICoKKyAqIFlQUFJPQ19GSVJTVCAoc3RydWN0IHlwcmVxX25va2V5KSByZXR1cm5zIChzdHJ1Y3QgeXByZXNwX2tleV92YWwpLgorICogUmV0dXJucyB0aGUgZmlyc3Qga2V5LXZhbHVlIHBhaXIgZnJvbSBhIG5hbWVkIGRvbWFpbiBhbmQgbWFwLgorICoKKyAqIFlQUFJPQ19ORVhUIChzdHJ1Y3QgeXByZXFfa2V5KSByZXR1cm5zIChzdHJ1Y3QgeXByZXNwX2tleV92YWwpLiAgUmV0dXJucworICogdGhlIGtleS12YWx1ZSBwYWlyIGZvbGxvd2luZyBhIHBhc3NlZCBrZXktdmFsdWUgcGFpciB3aXRoaW4gYSBuYW1lZAorICogZG9tYWluIGFuZCBtYXAuCisgKgorICogWVBQUk9DX1hGUiAoc3RydWN0IHlwcmVxX3hmcikgcmV0dXJucyBub3RoaW5nLiAgSW5kaWNhdGVzIHRvIGEgc2VydmVyIHRoYXQKKyAqIGEgbWFwIHNob3VsZCBiZSB1cGRhdGVkLgorICoKKyAqIFlQUFJPQ19DTEVBUgl0YWtlcyBub3RoaW5nLCByZXR1cm5zIG5vdGhpbmcuICBJbnN0cnVjdHMgYSBOSVMgc2VydmVyIHRvCisgKiBjbG9zZSB0aGUgY3VycmVudCBtYXAsIHNvIHRoYXQgb2xkIHZlcnNpb25zIG9mIHRoZSBkaXNrIGZpbGUgZG9uJ3QgZ2V0CisgKiBoZWxkIG9wZW4uCisgKgorICogWVBQUk9DX0FMTCAoc3RydWN0IHlwcmVxX25va2V5KSwgcmV0dXJucworICogCXVuaW9uIHN3aXRjaCAoYm9vbF90IG1vcmUpIHsKKyAqCQlUUlVFOgkoc3RydWN0IHlwcmVzcF9rZXlfdmFsKTsKKyAqCQlGQUxTRToJKHN0cnVjdCkge307CisgKgl9CisgKgorICogWVBQUk9DX01BU1RFUiAoc3RydWN0IHlwcmVxX25va2V5KSwgcmV0dXJucyAoeXByZXNwX21hc3RlcikKKyAqCisgKiBZUFBST0NfT1JERVIgKHN0cnVjdCB5cHJlcV9ub2tleSksIHJldHVybnMgKHlwcmVzcF9vcmRlcikKKyAqCisgKiBZUFBST0NfTUFQTElTVCAoY2hhciAqKSwgcmV0dXJucyAoc3RydWN0IHlwbWFwbGlzdCAqKQorICovCisKKy8qIFByb2dyYW0gYW5kIHZlcnNpb24gc3ltYm9scywgbWFnaWMgbnVtYmVycyAqLworCisjZGVmaW5lIFlQUFJPRwkJMTAwMDA0CisjZGVmaW5lIFlQVkVSUwkJMgorI2RlZmluZSBZUFZFUlNfT1JJRwkxCisjZGVmaW5lIFlQTUFYUkVDT1JECTEwMjQKKyNkZWZpbmUgWVBNQVhET01BSU4JNjQgLyogWFhYIG9yaWcuIHlwX3Byb3QuaCBkZWZpbmVzIDI1NiAqLworI2RlZmluZSBZUE1BWE1BUAk2NAorI2RlZmluZSBZUE1BWFBFRVIJNjQgLyogWFhYIG9yaWcuIHlwX3Byb3QuaCBkZWZpbmVzIDI1NiAqLworCisvKiBieXRlIHNpemUgb2YgYSBsYXJnZSBOSVMgcGFja2V0ICovCisjZGVmaW5lIFlQTVNHU1oJCTE2MDAKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1X2ludCBrZXlkYXRfbGVuOworICBjaGFyICprZXlkYXRfdmFsOworfSBrZXlkYXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1X2ludCB2YWxkYXRfbGVuOworICBjaGFyICp2YWxkYXRfdmFsOworfSB2YWxkYXRfdDsKKworc3RydWN0IHlwbWFwX3Bhcm1zIHsKKyAgY2hhciAqZG9tYWluOwkJCS8qIE51bGwgc3RyaW5nIG1lYW5zIG5vdCBhdmFpbGFibGUgKi8KKyAgY2hhciAqbWFwOwkJCS8qIE51bGwgc3RyaW5nIG1lYW5zIG5vdCBhdmFpbGFibGUgKi8KKyAgdW5zaWduZWQgaW50IG9yZGVybnVtOwkvKiAwIG1lYW5zIG5vdCBhdmFpbGFibGUgKi8KKyAgY2hhciAqb3duZXI7CQkJLyogTnVsbCBzdHJpbmcgbWVhbnMgbm90IGF2YWlsYWJsZSAqLworfTsKKworLyoKKyAqIFJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZXMKKyAqLworCitzdHJ1Y3QgeXByZXFfa2V5IHsKKyAgY29uc3QgY2hhciAqZG9tYWluOworICBjb25zdCBjaGFyICptYXA7CisgIGtleWRhdF90IGtleWRhdDsKK307CisKK3N0cnVjdCB5cHJlcV9ub2tleSB7CisgIGNoYXIgKmRvbWFpbjsKKyAgY2hhciAqbWFwOworfTsKKworc3RydWN0IHlwcmVxX3hmciB7CisgIHN0cnVjdCB5cG1hcF9wYXJtcyBtYXBfcGFybXM7CisgIHVfaW50IHRyYW5zaWQ7CisgIHVfaW50IHByb3RvOworICB1X2ludCBwb3J0OworfTsKKworI2RlZmluZSB5cHhmcl9kb21haW4gbWFwX3Bhcm1zLmRvbWFpbgorI2RlZmluZSB5cHhmcl9tYXAgbWFwX3Bhcm1zLm1hcAorI2RlZmluZSB5cHhmcl9vcmRlcm51bSBtYXBfcGFybXMub3JkZXJudW0KKyNkZWZpbmUgeXB4ZnJfb3duZXIgbWFwX3Bhcm1zLm93bmVyCisKKy8qIFJldHVybiBzdGF0dXMgdmFsdWVzICovCisKK2VudW0geXBzdGF0IHsKKyAgWVBfVFJVRSA9IDEsCQkvKiBHZW5lcmFsIHB1cnBvc2Ugc3VjY2VzcyBjb2RlICovCisjZGVmaW5lIFlQX1RSVUUgWVBfVFJVRQorICBZUF9OT01PUkUgPSAyLAkvKiBObyBtb3JlIGVudHJpZXMgaW4gbWFwICovCisjZGVmaW5lIFlQX05PTU9SRSBZUF9OT01PUkUKKyAgWVBfRkFMU0UgPSAwLAkJLyogR2VuZXJhbCBwdXJwb3NlIGZhaWx1cmUgY29kZSAqLworI2RlZmluZSBZUF9GQUxTRSBZUF9GQUxTRQorICBZUF9OT01BUCA9IC0xLAkvKiBObyBzdWNoIG1hcCBpbiBkb21haW4gKi8KKyNkZWZpbmUgWVBfTk9NQVAgWVBfTk9NQVAKKyAgWVBfTk9ET00gPSAtMiwJLyogRG9tYWluIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgWVBfTk9ET00gWVBfTk9ET00KKyAgWVBfTk9LRVkgPSAtMywJLyogTm8gc3VjaCBrZXkgaW4gbWFwICovCisjZGVmaW5lIFlQX05PS0VZIFlQX05PS0VZCisgIFlQX0JBRE9QID0gLTQsCS8qIEludmFsaWQgb3BlcmF0aW9uICovCisjZGVmaW5lIFlQX0JBRE9QIFlQX0JBRE9QCisgIFlQX0JBRERCID0gLTUsCS8qIFNlcnZlciBkYXRhIGJhc2UgaXMgYmFkICovCisjZGVmaW5lIFlQX0JBRERCIFlQX0JBRERCCisgIFlQX1lQRVJSID0gLTYsCS8qIE5JUyBzZXJ2ZXIgZXJyb3IgKi8KKyNkZWZpbmUgWVBfWVBFUlIgWVBfWVBFUlIKKyAgWVBfQkFEQVJHUyA9IC03LAkvKiBSZXF1ZXN0IGFyZ3VtZW50cyBiYWQgKi8KKyNkZWZpbmUgWVBfQkFEQVJHUyBZUF9CQURBUkdTCisgIFlQX1ZFUlMgPSAtOCwJCS8qIE5JUyBzZXJ2ZXIgdmVyc2lvbiBtaXNtYXRjaCAtIHNlcnZlciBjYW4ndCBzdXBwbHkKKwkJCSAgIHJlcXVlc3RlZCBzZXJ2aWNlLiAqLworI2RlZmluZSBZUF9WRVJTIFlQX1ZFUlMKK307CisKKy8qCisgKiBSZXNwb25zZSBwYXJhbWV0ZXIgc3RydWN0dXJlcworICovCisKK3R5cGVkZWYgZW51bSB5cHN0YXQgeXBzdGF0OworCitzdHJ1Y3QgeXByZXNwX3ZhbCB7CisgIHlwc3RhdCBzdGF0dXM7CisgIHZhbGRhdF90IHZhbGRhdDsKK307CisKK3N0cnVjdCB5cHJlc3Bfa2V5X3ZhbCB7CisgIHlwc3RhdCBzdGF0dXM7CisjaWZkZWYgU1RVUElEX1NVTl9CVUcKKyAgLyogVGhpcyBpcyB0aGUgZm9ybSBhcyBkaXN0cmlidXRlZCBieSBTdW4uICBCdXQgZXZlbiB0aGUgU3VuIE5JUworICAgICBzZXJ2ZXJzIGV4cGVjdCB0aGUgdmFsdWVzIGluIHRoZSBvdGhlciBvcmRlci4gIFNvIHRoZWlyCisgICAgIGltcGxlbWVudGF0aW9uIHNvbWVob3cgbXVzdCBjaGFuZ2UgdGhlIG9yZGVyIGludGVybmFsbHkuICBXZQorICAgICBkb24ndCB3YW50IHRvIGZvbGxvdyB0aGlzIGJhZCBleGFtcGxlIHNpbmNlIHRoZSB1c2VyIHNob3VsZCBiZQorICAgICBhYmxlIHRvIHVzZSBycGNnZW4gb24gdGhpcyBmaWxlLiAgKi8KKyAga2V5ZGF0X3Qga2V5ZGF0OworICB2YWxkYXRfdCB2YWxkYXQ7CisjZWxzZQorICB2YWxkYXRfdCB2YWxkYXQ7CisgIGtleWRhdF90IGtleWRhdDsKKyNlbmRpZgorfTsKKworc3RydWN0IHlwcmVzcF9tYXN0ZXIgeworICB5cHN0YXQgc3RhdHVzOworICBjaGFyICptYXN0ZXI7Cit9OworCitzdHJ1Y3QgeXByZXNwX29yZGVyIHsKKyAgeXBzdGF0IHN0YXR1czsKKyAgdV9pbnQgb3JkZXJudW07Cit9OworCitzdHJ1Y3QgeXBtYXBsaXN0IHsKKyAgY2hhciAqbWFwOworI2RlZmluZSB5cG1sX25hbWUgbWFwCisgIHN0cnVjdCB5cG1hcGxpc3QgKm5leHQ7CisjZGVmaW5lIHlwbWxfbmV4dCBuZXh0Cit9OworCitzdHJ1Y3QgeXByZXNwX21hcGxpc3QgeworICB5cHN0YXQgc3RhdHVzOworICBzdHJ1Y3QgeXBtYXBsaXN0ICpsaXN0OworfTsKKworLyoKKyAqIFByb2NlZHVyZSBzeW1ib2xzLiAgWVBQUk9DX05VTEwsIFlQUFJPQ19ET01BSU4sIGFuZCBZUFBST0NfRE9NQUlOX05PTkFDSworICogbXVzdCBrZWVwIHRoZSBzYW1lIHZhbHVlcyAoMCwgMSwgYW5kIDIpIHRoYXQgdGhleSBoYWQgaW4gdGhlIGZpcnN0IHZlcnNpb24KKyAqIG9mIHRoZSBwcm90b2NvbC4KKyAqLworCisjZGVmaW5lIFlQUFJPQ19OVUxMCTAKKyNkZWZpbmUgWVBQUk9DX0RPTUFJTgkxCisjZGVmaW5lIFlQUFJPQ19ET01BSU5fTk9OQUNLIDIKKyNkZWZpbmUgWVBQUk9DX01BVENICTMKKyNkZWZpbmUgWVBQUk9DX0ZJUlNUCTQKKyNkZWZpbmUgWVBQUk9DX05FWFQJNQorI2RlZmluZSBZUFBST0NfWEZSCTYKKyNkZWZpbmUgWVBQUk9DX0NMRUFSCTcKKyNkZWZpbmUgWVBQUk9DX0FMTAk4CisjZGVmaW5lIFlQUFJPQ19NQVNURVIJOQorI2RlZmluZSBZUFBST0NfT1JERVIJMTAKKyNkZWZpbmUgWVBQUk9DX01BUExJU1QJMTEKKyNkZWZpbmUJWVBQUk9DX05FV1hGUgkxMgorCisvKgorICoJCVByb3RvY29sIGJldHdlZW4gY2xpZW50cyBhbmQgTklTIGJpbmRlciBzZXJ2ZXJzCisgKi8KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlcyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBwcm90b2NvbDoKKyAqCisgKiBZUEJJTkRQUk9DX05VTEwoKSByZXR1cm5zICgpCisgKiAJdGFrZXMgbm90aGluZywgcmV0dXJucyBub3RoaW5nCisgKgorICogWVBCSU5EUFJPQ19ET01BSU4gdGFrZXMgKGNoYXIgKikgcmV0dXJucyAoc3RydWN0IHlwYmluZF9yZXNwKQorICoKKyAqIFlQQklORFBST0NfU0VURE9NIHRha2VzIChzdHJ1Y3QgeXBiaW5kX3NldGRvbSkgcmV0dXJucyBub3RoaW5nCisgKi8KKworLyogUHJvZ3JhbSBhbmQgdmVyc2lvbiBzeW1ib2xzLCBtYWdpYyBudW1iZXJzICovCisKKyNkZWZpbmUgWVBCSU5EUFJPRwkJMTAwMDA3CisjZGVmaW5lIFlQQklORFZFUlMJCTIKKyNkZWZpbmUgWVBCSU5EVkVSU19PUklHCQkxCisKKy8qIFByb2NlZHVyZSBzeW1ib2xzICovCisKKyNkZWZpbmUgWVBCSU5EUFJPQ19OVUxMCQkwCisjZGVmaW5lIFlQQklORFBST0NfRE9NQUlOCTEKKyNkZWZpbmUgWVBCSU5EUFJPQ19TRVRET00JMgorLyoKKyAqIFJlc3BvbnNlIHN0cnVjdHVyZSBhbmQgb3ZlcmFsbCByZXN1bHQgc3RhdHVzIGNvZGVzLiAgU3VjY2VzcyBhbmQgZmFpbHVyZQorICogcmVwcmVzZW50IHR3byBzZXBhcmF0ZSByZXNwb25zZSBtZXNzYWdlIHR5cGVzLgorICovCisKK2VudW0geXBiaW5kX3Jlc3B0eXBlIHtZUEJJTkRfU1VDQ19WQUwgPSAxLCBZUEJJTkRfRkFJTF9WQUwgPSAyfTsKKworc3RydWN0IHlwYmluZF9iaW5kaW5nIHsKKyAgc3RydWN0IGluX2FkZHIgeXBiaW5kX2JpbmRpbmdfYWRkcjsJICAgICAgICAvKiBJbiBuZXR3b3JrIG9yZGVyICovCisgIHVuc2lnbmVkIHNob3J0IGludCB5cGJpbmRfYmluZGluZ19wb3J0OwkvKiBJbiBuZXR3b3JrIG9yZGVyICovCit9OworCitzdHJ1Y3QgeXBiaW5kX3Jlc3AgeworICBlbnVtIHlwYmluZF9yZXNwdHlwZSB5cGJpbmRfc3RhdHVzOworICB1bmlvbiB7CisgICAgdV9pbnQgeXBiaW5kX2Vycm9yOworICAgIHN0cnVjdCB5cGJpbmRfYmluZGluZyB5cGJpbmRfYmluZGluZm87CisgIH0geXBiaW5kX3Jlc3Bib2R5OworfTsKKworCisvKiBEZXRhaWxlZCBmYWlsdXJlIHJlYXNvbiBjb2RlcyBmb3IgcmVzcG9uc2UgZmllbGQgeXBiaW5kX2Vycm9yKi8KKworI2RlZmluZSBZUEJJTkRfRVJSX0VSUiAxCQkvKiBJbnRlcm5hbCBlcnJvciAqLworI2RlZmluZSBZUEJJTkRfRVJSX05PU0VSViAyCQkvKiBObyBib3VuZCBzZXJ2ZXIgZm9yIHBhc3NlZCBkb21haW4gKi8KKyNkZWZpbmUgWVBCSU5EX0VSUl9SRVNDIDMJCS8qIFN5c3RlbSByZXNvdXJjZSBhbGxvY2F0aW9uIGZhaWx1cmUgKi8KKworLyoKKyAqIFJlcXVlc3QgZGF0YSBzdHJ1Y3R1cmUgZm9yIHlwYmluZCAiU2V0IGRvbWFpbiIgcHJvY2VkdXJlLgorICovCitzdHJ1Y3QgeXBiaW5kX3NldGRvbSB7CisgIGNoYXIgKnlwc2V0ZG9tX2RvbWFpbjsKKyAgc3RydWN0IHlwYmluZF9iaW5kaW5nIHlwc2V0ZG9tX2JpbmRpbmc7CisgIHVfaW50IHlwc2V0ZG9tX3ZlcnM7Cit9OworI2RlZmluZSB5cHNldGRvbV9hZGRyIHlwc2V0ZG9tX2JpbmRpbmcueXBiaW5kX2JpbmRpbmdfYWRkcgorI2RlZmluZSB5cHNldGRvbV9wb3J0IHlwc2V0ZG9tX2JpbmRpbmcueXBiaW5kX2JpbmRpbmdfcG9ydAorCisvKgorICoJCVByb3RvY29sIGJldHdlZW4gY2xpZW50cyAoeXB4ZnIsIG9ubHkpIGFuZCB5cHB1c2gKKyAqCQl5cHB1c2ggc3BlYWtzIGEgcHJvdG9jb2wgaW4gdGhlIHRyYW5zaWVudCByYW5nZSwgd2hpY2gKKyAqCQlpcyBzdXBwbGllZCB0byB5cHhmciBhcyBhIGNvbW1hbmQtbGluZSBwYXJhbWV0ZXIgd2hlbiBpdAorICoJCWlzIGFjdGl2YXRlZCBieSB5cHNlcnYuCisgKi8KKyNkZWZpbmUgWVBQVVNIVkVSUwkJMQorI2RlZmluZSBZUFBVU0hWRVJTX09SSUcJCTEKKworLyogUHJvY2VkdXJlIHN5bWJvbHMgKi8KKworI2RlZmluZSBZUFBVU0hQUk9DX05VTEwJCTAKKyNkZWZpbmUgWVBQVVNIUFJPQ19YRlJSRVNQCTEKKworLyogU3RhdHVzIHZhbHVlcyBmb3IgeXBwdXNocmVzcF94ZnIuc3RhdHVzICovCisKK2VudW0geXBwdXNoX3N0YXR1cyB7CisgIFlQUFVTSF9TVUNDID0gMSwJCS8qIFN1Y2Nlc3MgKi8KKyNkZWZpbmUgWVBQVVNIX1NVQ0MJWVBQVVNIX1NVQ0MKKyAgWVBQVVNIX0FHRSA9IDIsCQkvKiBNYXN0ZXIncyB2ZXJzaW9uIG5vdCBuZXdlciAqLworI2RlZmluZSBZUFBVU0hfQUdFCVlQUFVTSF9BR0UKKyAgWVBQVVNIX05PTUFQID0gLTEsCQkvKiBDYW4ndCBmaW5kIHNlcnZlciBmb3IgbWFwICovCisjZGVmaW5lIFlQUFVTSF9OT01BUCAJWVBQVVNIX05PTUFQCisgIFlQUFVTSF9OT0RPTSA9IC0yLAkJLyogRG9tYWluIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgWVBQVVNIX05PRE9NIAlZUFBVU0hfTk9ET00KKyAgWVBQVVNIX1JTUkMgPSAtMywJCS8qIExvY2FsIHJlc291Y2UgYWxsb2MgZmFpbHVyZSAqLworI2RlZmluZSBZUFBVU0hfUlNSQyAJWVBQVVNIX1JTUkMKKyAgWVBQVVNIX1JQQyA9IC00LAkJLyogUlBDIGZhaWx1cmUgdGFsa2luZyB0byBzZXJ2ZXIgKi8KKyNkZWZpbmUgWVBQVVNIX1JQQyAJWVBQVVNIX1JQQworICBZUFBVU0hfTUFERFIgPSAtNSwJCS8qIENhbid0IGdldCBtYXN0ZXIgYWRkcmVzcyAqLworI2RlZmluZSBZUFBVU0hfTUFERFIJWVBQVVNIX01BRERSCisgIFlQUFVTSF9ZUEVSUiA9IC02LAkJLyogTklTIHNlcnZlci9tYXAgZGIgZXJyb3IgKi8KKyNkZWZpbmUgWVBQVVNIX1lQRVJSIAlZUFBVU0hfWVBFUlIKKyAgWVBQVVNIX0JBREFSR1MgPSAtNywJCS8qIFJlcXVlc3QgYXJndW1lbnRzIGJhZCAqLworI2RlZmluZSBZUFBVU0hfQkFEQVJHUyAJWVBQVVNIX0JBREFSR1MKKyAgWVBQVVNIX0RCTSA9IC04LAkJLyogTG9jYWwgZGJtIG9wZXJhdGlvbiBmYWlsZWQgKi8KKyNkZWZpbmUgWVBQVVNIX0RCTQlZUFBVU0hfREJNCisgIFlQUFVTSF9GSUxFID0gLTksCQkvKiBMb2NhbCBmaWxlIEkvTyBvcGVyYXRpb24gZmFpbGVkICovCisjZGVmaW5lIFlQUFVTSF9GSUxFCVlQUFVTSF9GSUxFCisgIFlQUFVTSF9TS0VXID0gLTEwLAkJLyogTWFwIHZlcnNpb24gc2tldyBkdXJpbmcgdHJhbnNmZXIgKi8KKyNkZWZpbmUgWVBQVVNIX1NLRVcJWVBQVVNIX1NLRVcKKyAgWVBQVVNIX0NMRUFSID0gLTExLAkJLyogQ2FuJ3Qgc2VuZCAiQ2xlYXIiIHJlcSB0byBsb2NhbCB5cHNlcnYgKi8KKyNkZWZpbmUgWVBQVVNIX0NMRUFSCVlQUFVTSF9DTEVBUgorICBZUFBVU0hfRk9SQ0UgPSAtMTIsCQkvKiBObyBsb2NhbCBvcmRlciBudW1iZXIgaW4gbWFwIC0gdXNlIC1mIGZsYWcqLworI2RlZmluZSBZUFBVU0hfRk9SQ0UJWVBQVVNIX0ZPUkNFCisgIFlQUFVTSF9YRlJFUlIgPSAtMTMsCQkvKiB5cHhmciBlcnJvciAqLworI2RlZmluZSBZUFBVU0hfWEZSRVJSCVlQUFVTSF9YRlJFUlIKKyAgWVBQVVNIX1JFRlVTRUQgPSAtMTQsCQkvKiBUcmFuc2ZlciByZXF1ZXN0IHJlZnVzZWQgYnkgeXBzZXJ2ICovCisjZGVmaW5lIFlQUFVTSF9SRUZVU0VECVlQUFVTSF9SRUZVU0VECisgIFlQUFVTSF9OT0FMSUFTID0gLTE1CQkvKiBBbGlhcyBub3QgZm91bmQgZm9yIG1hcCBvciBkb21haW4gKi8KKyNkZWZpbmUJWVBQVVNIX05PQUxJQVMJWVBQVVNIX05PQUxJQVMKK307Cit0eXBlZGVmIGVudW0geXBwdXNoX3N0YXR1cyB5cHB1c2hfc3RhdHVzOworCitzdHJ1Y3QgeXBwdXNocmVzcF94ZnIgeworICB1X2ludCB0cmFuc2lkOworICB5cHB1c2hfc3RhdHVzIHN0YXR1czsKK307CisKK3N0cnVjdCB5cHJlc3BfYWxsIHsKKyAgYm9vbF90IG1vcmU7CisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgeXByZXNwX2tleV92YWwgdmFsOworICB9IHlwcmVzcF9hbGxfdTsKK307CisKK2V4dGVybiBib29sX3QgeGRyX3lwcmVxX2tleSAoWERSICpfX3hkcnMsIHN0cnVjdCB5cHJlcV9rZXkgKiBfX29ianApOworZXh0ZXJuIGJvb2xfdCB4ZHJfeXByZXFfbm9rZXkgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgeXByZXFfbm9rZXkgKiBfX29ianApOworZXh0ZXJuIGJvb2xfdCB4ZHJfeXByZXFfeGZyIChYRFIgKl9feGRycywgc3RydWN0IHlwcmVxX3hmciAqIF9fb2JqcCk7CitleHRlcm4gYm9vbF90IHhkcl95cHJlc3BfdmFsIChYRFIgKl9feGRycywgc3RydWN0IHlwcmVzcF92YWwgKiBfX29ianApOworZXh0ZXJuIGJvb2xfdCB4ZHJfeXByZXNwX2tleV92YWwgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgeXByZXNwX2tleV92YWwgKiBfX29ianApOworZXh0ZXJuIGJvb2xfdCB4ZHJfeXBiaW5kX3Jlc3AgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgeXBiaW5kX3Jlc3AgKiBfX29ianApOworZXh0ZXJuIGJvb2xfdCB4ZHJfeXBiaW5kX3NldGRvbSAoWERSICpfX3hkcnMsIHN0cnVjdCB5cGJpbmRfc2V0ZG9tICogX19vYmpwKTsKK2V4dGVybiBib29sX3QgeGRyX3lwbWFwX3Bhcm1zIChYRFIgKl9feGRycywgc3RydWN0IHlwbWFwX3Bhcm1zICogX19vYmpwKTsKK2V4dGVybiBib29sX3QgeGRyX3lwcHVzaHJlc3BfeGZyIChYRFIgKl9feGRycywgc3RydWN0IHlwcHVzaHJlc3BfeGZyICogX19vYmpwKTsKK2V4dGVybiBib29sX3QgeGRyX3lwcmVzcF9vcmRlciAoWERSICpfX3hkcnMsIHN0cnVjdCB5cHJlc3Bfb3JkZXIgICogX19vYmpwKTsKK2V4dGVybiBib29sX3QgeGRyX3lwcmVzcF9tYXN0ZXIgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgeXByZXNwX21hc3RlciAqIF9fb2JqcCk7CitleHRlcm4gYm9vbF90IHhkcl95cGFsbCAoWERSICpfX3hkcnMsIHN0cnVjdCB5cGFsbF9jYWxsYmFjayAqIF9fb2JqcCk7CitleHRlcm4gYm9vbF90IHhkcl95cHJlc3BfbWFwbGlzdCAoWERSICpfX3hkcnMsIHN0cnVjdCB5cHJlc3BfbWFwbGlzdCAqIF9fb2JqcCk7CitleHRlcm4gYm9vbF90IHhkcl95cGJpbmRfYmluZGluZyAoWERSICpfX3hkcnMsIHN0cnVjdCB5cGJpbmRfYmluZGluZyAqIF9fb2JqcCk7CitleHRlcm4gYm9vbF90IHhkcl95cGJpbmRfcmVzcHR5cGUgKFhEUiAqX194ZHJzLCBlbnVtIHlwYmluZF9yZXNwdHlwZSAqIF9fb2JqcCk7CitleHRlcm4gYm9vbF90IHhkcl95cHN0YXQgKFhEUiAqX194ZHJzLCBlbnVtIHlwYmluZF9yZXNwdHlwZSAqIF9fb2JqcCk7CitleHRlcm4gYm9vbF90IHhkcl95cHJlc3BfYWxsIChYRFIgKl9feGRycywgc3RydWN0IHlwcmVzcF9hbGwgICogX19vYmpwKTsKK2V4dGVybiBib29sX3QgeGRyX2RvbWFpbm5hbWUgKFhEUiAqX194ZHJzLCBjaGFyICoqIF9fb2JqcCk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBfUlBDU1ZDX1lQX1BST1RfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXBjbG50LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy95cGNsbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTM3YTI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXBjbG50LmgKQEAgLTAsMCArMSw4OSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgICBDb250cmlidXRlZCBieSBUaG9yc3RlbiBLdWt1ayA8a3VrdWtAc3VzZS5kZT4sIDE5OTYuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisKKyNpZm5kZWYJX19SUENTVkNfWVBDTE5UX0hfXworI2RlZmluZQlfX1JQQ1NWQ19ZUENMTlRfSF9fCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBTb21lIGRlZmluZXMgKi8KKyNkZWZpbmUgWVBFUlJfU1VDQ0VTUwkwCQkvKiBUaGVyZSBpcyBubyBlcnJvciAqLworI2RlZmluZQlZUEVSUl9CQURBUkdTCTEJCS8qIEFyZ3MgdG8gZnVuY3Rpb24gYXJlIGJhZCAqLworI2RlZmluZQlZUEVSUl9SUEMgCTIJCS8qIFJQQyBmYWlsdXJlICovCisjZGVmaW5lCVlQRVJSX0RPTUFJTgkzCQkvKiBDYW4ndCBiaW5kIHRvIGEgc2VydmVyIHdpdGggdGhpcyBkb21haW4gKi8KKyNkZWZpbmUJWVBFUlJfTUFQCTQJCS8qIE5vIHN1Y2ggbWFwIGluIHNlcnZlcidzIGRvbWFpbiAqLworI2RlZmluZQlZUEVSUl9LRVkJNQkJLyogTm8gc3VjaCBrZXkgaW4gbWFwICovCisjZGVmaW5lCVlQRVJSX1lQRVJSCTYJCS8qIEludGVybmFsIHlwIHNlcnZlciBvciBjbGllbnQgZXJyb3IgKi8KKyNkZWZpbmUJWVBFUlJfUkVTUkMJNwkJLyogTG9jYWwgcmVzb3VyY2UgYWxsb2NhdGlvbiBmYWlsdXJlICovCisjZGVmaW5lCVlQRVJSX05PTU9SRQk4CQkvKiBObyBtb3JlIHJlY29yZHMgaW4gbWFwIGRhdGFiYXNlICovCisjZGVmaW5lCVlQRVJSX1BNQVAJOQkJLyogQ2FuJ3QgY29tbXVuaWNhdGUgd2l0aCBwb3J0bWFwcGVyICovCisjZGVmaW5lCVlQRVJSX1lQQklORAkxMAkJLyogQ2FuJ3QgY29tbXVuaWNhdGUgd2l0aCB5cGJpbmQgKi8KKyNkZWZpbmUJWVBFUlJfWVBTRVJWCTExCQkvKiBDYW4ndCBjb21tdW5pY2F0ZSB3aXRoIHlwc2VydiAqLworI2RlZmluZQlZUEVSUl9OT0RPTQkxMgkJLyogTG9jYWwgZG9tYWluIG5hbWUgbm90IHNldCAqLworI2RlZmluZQlZUEVSUl9CQUREQgkxMwkJLyogeXAgZGF0YSBiYXNlIGlzIGJhZCAqLworI2RlZmluZQlZUEVSUl9WRVJTCTE0CQkvKiBZUCB2ZXJzaW9uIG1pc21hdGNoICovCisjZGVmaW5lCVlQRVJSX0FDQ0VTUwkxNQkJLyogQWNjZXNzIHZpb2xhdGlvbiAqLworI2RlZmluZQlZUEVSUl9CVVNZCTE2CQkvKiBEYXRhYmFzZSBpcyBidXN5ICovCisKKy8qIFR5cGVzIG9mIHVwZGF0ZSBvcGVyYXRpb25zICovCisjZGVmaW5lCVlQT1BfQ0hBTkdFCTEJCS8qIENoYW5nZSwgZG8gbm90IGFkZCAqLworI2RlZmluZQlZUE9QX0lOU0VSVAkyCQkvKiBBZGQsIGRvIG5vdCBjaGFuZ2UgKi8KKyNkZWZpbmUJWVBPUF9ERUxFVEUJMwkJLyogRGVsZXRlIHRoaXMgZW50cnkgKi8KKyNkZWZpbmUJWVBPUF9TVE9SRQk0CQkvKiBBZGQsIG9yIGNoYW5nZSAqLworCitfX0JFR0lOX0RFQ0xTCisKKy8qIHN0cnVjdCB5cGFsbF9jYWxsYmFjayAqIGlzIHRoZSBhcmcgd2hpY2ggbXVzdCBiZSBwYXNzZWQgdG8geXBfYWxsLiAgKi8KK3N0cnVjdCB5cGFsbF9jYWxsYmFjaworICB7CisgICAgaW50ICgqZm9yZWFjaCkgKGludCBfX3N0YXR1cywgY2hhciAqX19rZXksIGludCBfX2tleWxlbiwKKwkJICAgIGNoYXIgKl9fdmFsLCBpbnQgX192YWxsZW4sIGNoYXIgKl9fZGF0YSk7CisgICAgY2hhciAqZGF0YTsKKyAgfTsKKworLyogRXh0ZXJuYWwgTklTIGNsaWVudCBmdW5jdGlvbiByZWZlcmVuY2VzLiAgKi8KK2V4dGVybiBpbnQgeXBfYmluZCAoX19jb25zdCBjaGFyICopIF9fVEhST1c7CitleHRlcm4gdm9pZCB5cF91bmJpbmQgKF9fY29uc3QgY2hhciAqKSBfX1RIUk9XOworZXh0ZXJuIGludCB5cF9nZXRfZGVmYXVsdF9kb21haW4gKGNoYXIgKiopIF9fVEhST1c7CitleHRlcm4gaW50IHlwX21hdGNoIChfX2NvbnN0IGNoYXIgKiwgX19jb25zdCBjaGFyICosIF9fY29uc3QgY2hhciAqLAorCQkgICAgIF9fY29uc3QgaW50LCBjaGFyICoqLCBpbnQgKikgX19USFJPVzsKK2V4dGVybiBpbnQgeXBfZmlyc3QgKF9fY29uc3QgY2hhciAqLCBfX2NvbnN0IGNoYXIgKiwgY2hhciAqKiwKKwkJICAgICBpbnQgKiwgY2hhciAqKiwgaW50ICopIF9fVEhST1c7CitleHRlcm4gaW50IHlwX25leHQgKF9fY29uc3QgY2hhciAqLCBfX2NvbnN0IGNoYXIgKiwgX19jb25zdCBjaGFyICosCisJCSAgICBfX2NvbnN0IGludCwgY2hhciAqKiwgaW50ICosIGNoYXIgKiosIGludCAqKSBfX1RIUk9XOworZXh0ZXJuIGludCB5cF9tYXN0ZXIgKF9fY29uc3QgY2hhciAqLCBfX2NvbnN0IGNoYXIgKiwgY2hhciAqKikgX19USFJPVzsKK2V4dGVybiBpbnQgeXBfb3JkZXIgKF9fY29uc3QgY2hhciAqLCBfX2NvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50ICopIF9fVEhST1c7CitleHRlcm4gaW50IHlwX2FsbCAoX19jb25zdCBjaGFyICosIF9fY29uc3QgY2hhciAqLAorCQkgICBfX2NvbnN0IHN0cnVjdCB5cGFsbF9jYWxsYmFjayAqKSBfX1RIUk9XOworZXh0ZXJuIF9fY29uc3QgY2hhciAqeXBlcnJfc3RyaW5nIChfX2NvbnN0IGludCkgX19USFJPVzsKK2V4dGVybiBfX2NvbnN0IGNoYXIgKnlwYmluZGVycl9zdHJpbmcgKF9fY29uc3QgaW50KSBfX1RIUk9XOworZXh0ZXJuIGludCB5cHByb3RfZXJyIChfX2NvbnN0IGludCkgX19USFJPVzsKK2V4dGVybiBpbnQgeXBfdXBkYXRlIChjaGFyICosIGNoYXIgKiwgdW5zaWduZWQgaW50LCAgY2hhciAqLAorCQkgICAgICBpbnQsIGNoYXIgKiwgaW50KSBfX1RIUk9XOworI2lmIDAKK2V4dGVybiBpbnQgeXBfbWFwbGlzdCAoX19jb25zdCBjaGFyICosIHN0cnVjdCB5cG1hcGxpc3QgKiopIF9fVEhST1c7CisjZW5kaWYKKworLyogVGhpcyBmdW5jdGlvbnMgZXhpc3RzIG9ubHkgdW5kZXIgQlNEIGFuZCBMaW51eCBzeXN0ZW1zLiAgKi8KK2V4dGVybiBpbnQgX195cF9jaGVjayAoY2hhciAqKikgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIF9fUlBDU1ZDX1lQQ0xOVF9IX18gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3lwcGFzc3dkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy95cHBhc3N3ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYmU5YjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy95cHBhc3N3ZC5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLgorICogSXQgd2FzIGdlbmVyYXRlZCB1c2luZyBycGNnZW4uCisgKi8KKworI2lmbmRlZiBfWVBQQVNTV0RfSF9SUENHRU4KKyNkZWZpbmUgX1lQUEFTU1dEX0hfUlBDR0VOCisKKyNpbmNsdWRlIDxycGMvcnBjLmg+CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKK3N0cnVjdCBwYXNzd2QgeworCWNoYXIgKnB3X25hbWU7CisJY2hhciAqcHdfcGFzc3dkOworCWludCBwd191aWQ7CisJaW50IHB3X2dpZDsKKwljaGFyICpwd19nZWNvczsKKwljaGFyICpwd19kaXI7CisJY2hhciAqcHdfc2hlbGw7Cit9OwordHlwZWRlZiBzdHJ1Y3QgcGFzc3dkIHBhc3N3ZDsKKworc3RydWN0IHlwcGFzc3dkIHsKKwljaGFyICpvbGRwYXNzOworCXBhc3N3ZCBuZXdwdzsKK307Cit0eXBlZGVmIHN0cnVjdCB5cHBhc3N3ZCB5cHBhc3N3ZDsKKworI2RlZmluZSBZUFBBU1NXRFBST0cgMTAwMDA5CisjZGVmaW5lIFlQUEFTU1dEVkVSUyAxCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2RlZmluZSBZUFBBU1NXRFBST0NfVVBEQVRFIDEKK2V4dGVybiAgaW50ICogeXBwYXNzd2Rwcm9jX3VwZGF0ZV8xKHlwcGFzc3dkICosIENMSUVOVCAqKTsKK2V4dGVybiAgaW50ICogeXBwYXNzd2Rwcm9jX3VwZGF0ZV8xX3N2Yyh5cHBhc3N3ZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiBpbnQgeXBwYXNzd2Rwcm9nXzFfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisjZWxzZSAvKiBLJlIgQyAqLworI2RlZmluZSBZUFBBU1NXRFBST0NfVVBEQVRFIDEKK2V4dGVybiAgaW50ICogeXBwYXNzd2Rwcm9jX3VwZGF0ZV8xKCk7CitleHRlcm4gIGludCAqIHlwcGFzc3dkcHJvY191cGRhdGVfMV9zdmMoKTsKK2V4dGVybiBpbnQgeXBwYXNzd2Rwcm9nXzFfZnJlZXJlc3VsdCAoKTsKKyNlbmRpZiAvKiBLJlIgQyAqLworCisvKiB0aGUgeGRyIGZ1bmN0aW9ucyAqLworCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAgYm9vbF90IHhkcl9wYXNzd2QgKFhEUiAqLCBwYXNzd2QqKTsKK2V4dGVybiAgYm9vbF90IHhkcl95cHBhc3N3ZCAoWERSICosIHlwcGFzc3dkKik7CisKKyNlbHNlIC8qIEsmUiBDICovCitleHRlcm4gYm9vbF90IHhkcl9wYXNzd2QgKCk7CitleHRlcm4gYm9vbF90IHhkcl95cHBhc3N3ZCAoKTsKKworI2VuZGlmIC8qIEsmUiBDICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhX1lQUEFTU1dEX0hfUlBDR0VOICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy95cHBhc3N3ZC54IGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXBwYXNzd2QueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGUzZWZlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXBwYXNzd2QueApAQCAtMCwwICsxLDYxIEBACisvKiBAKCMpeXBwYXNzd2QueAkyLjEgODgvMDgvMDEgNC4wIFJQQ1NSQyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgQW1lcmljYSwgSW5jLgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlICJPcmFjbGUgQW1lcmljYSwgSW5jLiIgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogICBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogWVAgcGFzc3dvcmQgdXBkYXRlIHByb3RvY29sCisgKiBSZXF1aXJlcyB1bml4IGF1dGhlbnRpY2F0aW9uCisgKi8KK3Byb2dyYW0gWVBQQVNTV0RQUk9HIHsKKwl2ZXJzaW9uIFlQUEFTU1dEVkVSUyB7CisJCS8qCisJCSAqIFVwZGF0ZSBteSBwYXNzd2QgZW50cnkKKwkJICovCisJCWludAorCQlZUFBBU1NXRFBST0NfVVBEQVRFKHlwcGFzc3dkKSA9IDE7CisJfSA9IDE7Cit9ID0gMTAwMDA5OworCisKK3N0cnVjdCBwYXNzd2QgeworCXN0cmluZyBwd19uYW1lPD47CS8qIHVzZXJuYW1lICovCisJc3RyaW5nIHB3X3Bhc3N3ZDw+OwkvKiBlbmNyeXB0ZWQgcGFzc3dvcmQgKi8KKwlpbnQgcHdfdWlkOwkJLyogdXNlciBpZCAqLworCWludCBwd19naWQ7CQkvKiBncm91cCBpZCAqLworCXN0cmluZyBwd19nZWNvczw+OwkvKiBpbiByZWFsIGxpZmUgbmFtZSAqLworCXN0cmluZyBwd19kaXI8PjsJLyogaG9tZSBkaXJlY3RvcnkgKi8KKwlzdHJpbmcgcHdfc2hlbGw8PjsJLyogZGVmYXVsdCBzaGVsbCAqLworfTsKKworc3RydWN0IHlwcGFzc3dkIHsKKwlzdHJpbmcgb2xkcGFzczw+OwkvKiB1bmVuY3J5cHRlZCBvbGQgcGFzc3dvcmQgKi8KKwlwYXNzd2QgbmV3cHc7CQkvKiBuZXcgcGFzc3dkIGVudHJ5ICovCit9OwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXB1cGQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3lwdXBkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA3ZmQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3lwdXBkLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIEFtZXJpY2EsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgIk9yYWNsZSBBbWVyaWNhLCBJbmMuIiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiAgIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisvKiBmcm9tIEAoIyl5cHVwZGF0ZV9wcm90LngJMS4zIDkxLzAzLzExIFRJUlBDIDEuMCAqLworCisjaWZuZGVmIF9fUlBDU1ZDX1lQVVBEX0hfXworI2RlZmluZSBfX1JQQ1NWQ19ZUFVQRF9IX18KKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxycGMvcnBjLmg+CisKKyNkZWZpbmUgTUFYTUFQTkFNRUxFTiAyNTUKKyNkZWZpbmUgTUFYWVBEQVRBTEVOIDEwMjMKKyNkZWZpbmUgTUFYRVJSTVNHTEVOIDI1NQorCitfX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1X2ludCB5cF9idWZfbGVuOworCWNoYXIgKnlwX2J1Zl92YWw7Cit9IHlwX2J1ZjsKKworZXh0ZXJuICBib29sX3QgeGRyX3lwX2J1ZiAoWERSICosIHlwX2J1ZiopOworCitzdHJ1Y3QgeXB1cGRhdGVfYXJncyB7CisJY2hhciAqbWFwbmFtZTsKKwl5cF9idWYga2V5OworCXlwX2J1ZiBkYXR1bTsKK307Cit0eXBlZGVmIHN0cnVjdCB5cHVwZGF0ZV9hcmdzIHlwdXBkYXRlX2FyZ3M7CisKK2V4dGVybiAgYm9vbF90IHhkcl95cHVwZGF0ZV9hcmdzIChYRFIgKiwgeXB1cGRhdGVfYXJncyopOworCitzdHJ1Y3QgeXBkZWxldGVfYXJncyB7CisJY2hhciAqbWFwbmFtZTsKKwl5cF9idWYga2V5OworfTsKK3R5cGVkZWYgc3RydWN0IHlwZGVsZXRlX2FyZ3MgeXBkZWxldGVfYXJnczsKKworZXh0ZXJuICBib29sX3QgeGRyX3lwZGVsZXRlX2FyZ3MgKFhEUiAqLCB5cGRlbGV0ZV9hcmdzKik7CisKKyNkZWZpbmUgWVBVX1BST0cgMTAwMDI4CisjZGVmaW5lIFlQVV9WRVJTIDEKKworI2RlZmluZSBZUFVfQ0hBTkdFIDEKK2V4dGVybiAgdV9pbnQgKiB5cHVfY2hhbmdlXzEgKHlwdXBkYXRlX2FyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICB1X2ludCAqIHlwdV9jaGFuZ2VfMV9zdmMgKHlwdXBkYXRlX2FyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFlQVV9JTlNFUlQgMgorZXh0ZXJuICB1X2ludCAqIHlwdV9pbnNlcnRfMSAoeXB1cGRhdGVfYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIHVfaW50ICogeXB1X2luc2VydF8xX3N2YyAoeXB1cGRhdGVfYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgWVBVX0RFTEVURSAzCitleHRlcm4gIHVfaW50ICogeXB1X2RlbGV0ZV8xICh5cGRlbGV0ZV9hcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgdV9pbnQgKiB5cHVfZGVsZXRlXzFfc3ZjICh5cGRlbGV0ZV9hcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBZUFVfU1RPUkUgNAorZXh0ZXJuICB1X2ludCAqIHlwdV9zdG9yZV8xICh5cHVwZGF0ZV9hcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgdV9pbnQgKiB5cHVfc3RvcmVfMV9zdmMgKHlwdXBkYXRlX2FyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiAhX19SUENTVkNfWVBVUERfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3NjaGVkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3NjaGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViYzQ4NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2NoZWQuaApAQCAtMCwwICsxLDEyOCBAQAorLyogRGVmaW5pdGlvbnMgZm9yIFBPU0lYIDEwMDMuMWItMTk5MyAoYWthIFBPU0lYLjQpIHNjaGVkdWxpbmcgaW50ZXJmYWNlLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LDE5OTcsMTk5OSwyMDAxLTIwMDQsMjAwNywyMDEwCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU0NIRURfSAorI2RlZmluZQlfU0NIRURfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgdHlwZSBkZWZpbml0aW9ucy4gICovCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2RlZmluZSBfX25lZWRfdGltZV90CisjZGVmaW5lIF9fbmVlZF90aW1lc3BlYworI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmbmRlZiBfX3BpZF90X2RlZmluZWQKK3R5cGVkZWYgX19waWRfdCBwaWRfdDsKKyMgZGVmaW5lIF9fcGlkX3RfZGVmaW5lZAorI2VuZGlmCisKKworLyogR2V0IHN5c3RlbSBzcGVjaWZpYyBjb25zdGFudCBhbmQgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuICAqLworI2luY2x1ZGUgPGJpdHMvc2NoZWQuaD4KKy8qIERlZmluZSB0aGUgcmVhbCBuYW1lcyBmb3IgdGhlIGVsZW1lbnRzIG9mIGBzdHJ1Y3Qgc2NoZWRfcGFyYW0nLiAgKi8KKyNkZWZpbmUgc2NoZWRfcHJpb3JpdHkJX19zY2hlZF9wcmlvcml0eQorCisKK19fQkVHSU5fREVDTFMKKworLyogU2V0IHNjaGVkdWxpbmcgcGFyYW1ldGVycyBmb3IgYSBwcm9jZXNzLiAgKi8KK2V4dGVybiBpbnQgc2NoZWRfc2V0cGFyYW0gKF9fcGlkX3QgX19waWQsIF9fY29uc3Qgc3RydWN0IHNjaGVkX3BhcmFtICpfX3BhcmFtKQorICAgICBfX1RIUk9XOworCisvKiBSZXRyaWV2ZSBzY2hlZHVsaW5nIHBhcmFtZXRlcnMgZm9yIGEgcGFydGljdWxhciBwcm9jZXNzLiAgKi8KK2V4dGVybiBpbnQgc2NoZWRfZ2V0cGFyYW0gKF9fcGlkX3QgX19waWQsIHN0cnVjdCBzY2hlZF9wYXJhbSAqX19wYXJhbSkgX19USFJPVzsKKworLyogU2V0IHNjaGVkdWxpbmcgYWxnb3JpdGhtIGFuZC9vciBwYXJhbWV0ZXJzIGZvciBhIHByb2Nlc3MuICAqLworZXh0ZXJuIGludCBzY2hlZF9zZXRzY2hlZHVsZXIgKF9fcGlkX3QgX19waWQsIGludCBfX3BvbGljeSwKKwkJCSAgICAgICBfX2NvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqX19wYXJhbSkgX19USFJPVzsKKworLyogUmV0cmlldmUgc2NoZWR1bGluZyBhbGdvcml0aG0gZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgKi8KK2V4dGVybiBpbnQgc2NoZWRfZ2V0c2NoZWR1bGVyIChfX3BpZF90IF9fcGlkKSBfX1RIUk9XOworCisvKiBZaWVsZCB0aGUgcHJvY2Vzc29yLiAgKi8KK2V4dGVybiBpbnQgc2NoZWRfeWllbGQgKHZvaWQpIF9fVEhST1c7CisKKy8qIEdldCBtYXhpbXVtIHByaW9yaXR5IHZhbHVlIGZvciBhIHNjaGVkdWxlci4gICovCitleHRlcm4gaW50IHNjaGVkX2dldF9wcmlvcml0eV9tYXggKGludCBfX2FsZ29yaXRobSkgX19USFJPVzsKKworLyogR2V0IG1pbmltdW0gcHJpb3JpdHkgdmFsdWUgZm9yIGEgc2NoZWR1bGVyLiAgKi8KK2V4dGVybiBpbnQgc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiAoaW50IF9fYWxnb3JpdGhtKSBfX1RIUk9XOworCisvKiBHZXQgdGhlIFNDSEVEX1JSIGludGVydmFsIGZvciB0aGUgbmFtZWQgcHJvY2Vzcy4gICovCitleHRlcm4gaW50IHNjaGVkX3JyX2dldF9pbnRlcnZhbCAoX19waWRfdCBfX3BpZCwgc3RydWN0IHRpbWVzcGVjICpfX3QpIF9fVEhST1c7CisKKworI2lmZGVmIF9fVVNFX0dOVQorLyogQWNjZXNzIG1hY3JvcyBmb3IgYGNwdV9zZXQnLiAgKi8KKyMgZGVmaW5lIENQVV9TRVRTSVpFIF9fQ1BVX1NFVFNJWkUKKyMgZGVmaW5lIENQVV9TRVQoY3B1LCBjcHVzZXRwKQkgX19DUFVfU0VUX1MgKGNwdSwgc2l6ZW9mIChjcHVfc2V0X3QpLCBjcHVzZXRwKQorIyBkZWZpbmUgQ1BVX0NMUihjcHUsIGNwdXNldHApCSBfX0NQVV9DTFJfUyAoY3B1LCBzaXplb2YgKGNwdV9zZXRfdCksIGNwdXNldHApCisjIGRlZmluZSBDUFVfSVNTRVQoY3B1LCBjcHVzZXRwKSBfX0NQVV9JU1NFVF9TIChjcHUsIHNpemVvZiAoY3B1X3NldF90KSwgXAorCQkJCQkJY3B1c2V0cCkKKyMgZGVmaW5lIENQVV9aRVJPKGNwdXNldHApCSBfX0NQVV9aRVJPX1MgKHNpemVvZiAoY3B1X3NldF90KSwgY3B1c2V0cCkKKyMgZGVmaW5lIENQVV9DT1VOVChjcHVzZXRwKQkgX19DUFVfQ09VTlRfUyAoc2l6ZW9mIChjcHVfc2V0X3QpLCBjcHVzZXRwKQorCisjIGRlZmluZSBDUFVfU0VUX1MoY3B1LCBzZXRzaXplLCBjcHVzZXRwKSAgIF9fQ1BVX1NFVF9TIChjcHUsIHNldHNpemUsIGNwdXNldHApCisjIGRlZmluZSBDUFVfQ0xSX1MoY3B1LCBzZXRzaXplLCBjcHVzZXRwKSAgIF9fQ1BVX0NMUl9TIChjcHUsIHNldHNpemUsIGNwdXNldHApCisjIGRlZmluZSBDUFVfSVNTRVRfUyhjcHUsIHNldHNpemUsIGNwdXNldHApIF9fQ1BVX0lTU0VUX1MgKGNwdSwgc2V0c2l6ZSwgXAorCQkJCQkJCSAgIGNwdXNldHApCisjIGRlZmluZSBDUFVfWkVST19TKHNldHNpemUsIGNwdXNldHApCSAgICBfX0NQVV9aRVJPX1MgKHNldHNpemUsIGNwdXNldHApCisjIGRlZmluZSBDUFVfQ09VTlRfUyhzZXRzaXplLCBjcHVzZXRwKQkgICAgX19DUFVfQ09VTlRfUyAoc2V0c2l6ZSwgY3B1c2V0cCkKKworIyBkZWZpbmUgQ1BVX0VRVUFMKGNwdXNldHAxLCBjcHVzZXRwMikgXAorICBfX0NQVV9FUVVBTF9TIChzaXplb2YgKGNwdV9zZXRfdCksIGNwdXNldHAxLCBjcHVzZXRwMikKKyMgZGVmaW5lIENQVV9FUVVBTF9TKHNldHNpemUsIGNwdXNldHAxLCBjcHVzZXRwMikgXAorICBfX0NQVV9FUVVBTF9TIChzZXRzaXplLCBjcHVzZXRwMSwgY3B1c2V0cDIpCisKKyMgZGVmaW5lIENQVV9BTkQoZGVzdHNldCwgc3Jjc2V0MSwgc3Jjc2V0MikgXAorICBfX0NQVV9PUF9TIChzaXplb2YgKGNwdV9zZXRfdCksIGRlc3RzZXQsIHNyY3NldDEsIHNyY3NldDIsICYpCisjIGRlZmluZSBDUFVfT1IoZGVzdHNldCwgc3Jjc2V0MSwgc3Jjc2V0MikgXAorICBfX0NQVV9PUF9TIChzaXplb2YgKGNwdV9zZXRfdCksIGRlc3RzZXQsIHNyY3NldDEsIHNyY3NldDIsIHwpCisjIGRlZmluZSBDUFVfWE9SKGRlc3RzZXQsIHNyY3NldDEsIHNyY3NldDIpIFwKKyAgX19DUFVfT1BfUyAoc2l6ZW9mIChjcHVfc2V0X3QpLCBkZXN0c2V0LCBzcmNzZXQxLCBzcmNzZXQyLCBeKQorIyBkZWZpbmUgQ1BVX0FORF9TKHNldHNpemUsIGRlc3RzZXQsIHNyY3NldDEsIHNyY3NldDIpIFwKKyAgX19DUFVfT1BfUyAoc2V0c2l6ZSwgZGVzdHNldCwgc3Jjc2V0MSwgc3Jjc2V0MiwgJikKKyMgZGVmaW5lIENQVV9PUl9TKHNldHNpemUsIGRlc3RzZXQsIHNyY3NldDEsIHNyY3NldDIpIFwKKyAgX19DUFVfT1BfUyAoc2V0c2l6ZSwgZGVzdHNldCwgc3Jjc2V0MSwgc3Jjc2V0MiwgfCkKKyMgZGVmaW5lIENQVV9YT1JfUyhzZXRzaXplLCBkZXN0c2V0LCBzcmNzZXQxLCBzcmNzZXQyKSBcCisgIF9fQ1BVX09QX1MgKHNldHNpemUsIGRlc3RzZXQsIHNyY3NldDEsIHNyY3NldDIsIF4pCisKKyMgZGVmaW5lIENQVV9BTExPQ19TSVpFKGNvdW50KSBfX0NQVV9BTExPQ19TSVpFIChjb3VudCkKKyMgZGVmaW5lIENQVV9BTExPQyhjb3VudCkgX19DUFVfQUxMT0MgKGNvdW50KQorIyBkZWZpbmUgQ1BVX0ZSRUUoY3B1c2V0KSBfX0NQVV9GUkVFIChjcHVzZXQpCisKKworLyogU2V0IHRoZSBDUFUgYWZmaW5pdHkgZm9yIGEgdGFzayAqLworZXh0ZXJuIGludCBzY2hlZF9zZXRhZmZpbml0eSAoX19waWRfdCBfX3BpZCwgc2l6ZV90IF9fY3B1c2V0c2l6ZSwKKwkJCSAgICAgIF9fY29uc3QgY3B1X3NldF90ICpfX2NwdXNldCkgX19USFJPVzsKKworLyogR2V0IHRoZSBDUFUgYWZmaW5pdHkgZm9yIGEgdGFzayAqLworZXh0ZXJuIGludCBzY2hlZF9nZXRhZmZpbml0eSAoX19waWRfdCBfX3BpZCwgc2l6ZV90IF9fY3B1c2V0c2l6ZSwKKwkJCSAgICAgIGNwdV9zZXRfdCAqX19jcHVzZXQpIF9fVEhST1c7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHNjaGVkLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2NzaS9zY3NpLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3Njc2kvc2NzaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YWI3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3Njc2kvc2NzaS5oCkBAIC0wLDAgKzEsMjI2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKiBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIHB1YmxpYyBjb25zdGFudHMgYW5kIHN0cnVjdHVyZXMgdXNlZCBieQorICogdGhlIHNjc2kgY29kZSBmb3IgbGludXguCisgKi8KKworI2lmbmRlZiBfU0NTSV9TQ1NJX0gKKyNkZWZpbmUgX1NDU0lfU0NTSV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qCisgKiAgICAgIFNDU0kgb3Bjb2RlcworICovCisKKyNkZWZpbmUgVEVTVF9VTklUX1JFQURZICAgICAgIDB4MDAKKyNkZWZpbmUgUkVaRVJPX1VOSVQgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUkVRVUVTVF9TRU5TRSAgICAgICAgIDB4MDMKKyNkZWZpbmUgRk9STUFUX1VOSVQgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgUkVBRF9CTE9DS19MSU1JVFMgICAgIDB4MDUKKyNkZWZpbmUgUkVBU1NJR05fQkxPQ0tTICAgICAgIDB4MDcKKyNkZWZpbmUgUkVBRF82ICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgV1JJVEVfNiAgICAgICAgICAgICAgIDB4MGEKKyNkZWZpbmUgU0VFS182ICAgICAgICAgICAgICAgIDB4MGIKKyNkZWZpbmUgUkVBRF9SRVZFUlNFICAgICAgICAgIDB4MGYKKyNkZWZpbmUgV1JJVEVfRklMRU1BUktTICAgICAgIDB4MTAKKyNkZWZpbmUgU1BBQ0UgICAgICAgICAgICAgICAgIDB4MTEKKyNkZWZpbmUgSU5RVUlSWSAgICAgICAgICAgICAgIDB4MTIKKyNkZWZpbmUgUkVDT1ZFUl9CVUZGRVJFRF9EQVRBIDB4MTQKKyNkZWZpbmUgTU9ERV9TRUxFQ1QgICAgICAgICAgIDB4MTUKKyNkZWZpbmUgUkVTRVJWRSAgICAgICAgICAgICAgIDB4MTYKKyNkZWZpbmUgUkVMRUFTRSAgICAgICAgICAgICAgIDB4MTcKKyNkZWZpbmUgQ09QWSAgICAgICAgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgRVJBU0UgICAgICAgICAgICAgICAgIDB4MTkKKyNkZWZpbmUgTU9ERV9TRU5TRSAgICAgICAgICAgIDB4MWEKKyNkZWZpbmUgU1RBUlRfU1RPUCAgICAgICAgICAgIDB4MWIKKyNkZWZpbmUgUkVDRUlWRV9ESUFHTk9TVElDICAgIDB4MWMKKyNkZWZpbmUgU0VORF9ESUFHTk9TVElDICAgICAgIDB4MWQKKyNkZWZpbmUgQUxMT1dfTUVESVVNX1JFTU9WQUwgIDB4MWUKKworI2RlZmluZSBTRVRfV0lORE9XICAgICAgICAgICAgMHgyNAorI2RlZmluZSBSRUFEX0NBUEFDSVRZICAgICAgICAgMHgyNQorI2RlZmluZSBSRUFEXzEwICAgICAgICAgICAgICAgMHgyOAorI2RlZmluZSBXUklURV8xMCAgICAgICAgICAgICAgMHgyYQorI2RlZmluZSBTRUVLXzEwICAgICAgICAgICAgICAgMHgyYgorI2RlZmluZSBXUklURV9WRVJJRlkgICAgICAgICAgMHgyZQorI2RlZmluZSBWRVJJRlkgICAgICAgICAgICAgICAgMHgyZgorI2RlZmluZSBTRUFSQ0hfSElHSCAgICAgICAgICAgMHgzMAorI2RlZmluZSBTRUFSQ0hfRVFVQUwgICAgICAgICAgMHgzMQorI2RlZmluZSBTRUFSQ0hfTE9XICAgICAgICAgICAgMHgzMgorI2RlZmluZSBTRVRfTElNSVRTICAgICAgICAgICAgMHgzMworI2RlZmluZSBQUkVfRkVUQ0ggICAgICAgICAgICAgMHgzNAorI2RlZmluZSBSRUFEX1BPU0lUSU9OICAgICAgICAgMHgzNAorI2RlZmluZSBTWU5DSFJPTklaRV9DQUNIRSAgICAgMHgzNQorI2RlZmluZSBMT0NLX1VOTE9DS19DQUNIRSAgICAgMHgzNgorI2RlZmluZSBSRUFEX0RFRkVDVF9EQVRBICAgICAgMHgzNworI2RlZmluZSBNRURJVU1fU0NBTiAgICAgICAgICAgMHgzOAorI2RlZmluZSBDT01QQVJFICAgICAgICAgICAgICAgMHgzOQorI2RlZmluZSBDT1BZX1ZFUklGWSAgICAgICAgICAgMHgzYQorI2RlZmluZSBXUklURV9CVUZGRVIgICAgICAgICAgMHgzYgorI2RlZmluZSBSRUFEX0JVRkZFUiAgICAgICAgICAgMHgzYworI2RlZmluZSBVUERBVEVfQkxPQ0sgICAgICAgICAgMHgzZAorI2RlZmluZSBSRUFEX0xPTkcgICAgICAgICAgICAgMHgzZQorI2RlZmluZSBXUklURV9MT05HICAgICAgICAgICAgMHgzZgorI2RlZmluZSBDSEFOR0VfREVGSU5JVElPTiAgICAgMHg0MAorI2RlZmluZSBXUklURV9TQU1FICAgICAgICAgICAgMHg0MQorI2RlZmluZSBSRUFEX1RPQyAgICAgICAgICAgICAgMHg0MworI2RlZmluZSBMT0dfU0VMRUNUICAgICAgICAgICAgMHg0YworI2RlZmluZSBMT0dfU0VOU0UgICAgICAgICAgICAgMHg0ZAorI2RlZmluZSBNT0RFX1NFTEVDVF8xMCAgICAgICAgMHg1NQorI2RlZmluZSBSRVNFUlZFXzEwICAgICAgICAgICAgMHg1NgorI2RlZmluZSBSRUxFQVNFXzEwICAgICAgICAgICAgMHg1NworI2RlZmluZSBNT0RFX1NFTlNFXzEwICAgICAgICAgMHg1YQorI2RlZmluZSBQRVJTSVNURU5UX1JFU0VSVkVfSU4gMHg1ZQorI2RlZmluZSBQRVJTSVNURU5UX1JFU0VSVkVfT1VUIDB4NWYKKyNkZWZpbmUgTU9WRV9NRURJVU0gICAgICAgICAgIDB4YTUKKyNkZWZpbmUgUkVBRF8xMiAgICAgICAgICAgICAgIDB4YTgKKyNkZWZpbmUgV1JJVEVfMTIgICAgICAgICAgICAgIDB4YWEKKyNkZWZpbmUgV1JJVEVfVkVSSUZZXzEyICAgICAgIDB4YWUKKyNkZWZpbmUgU0VBUkNIX0hJR0hfMTIgICAgICAgIDB4YjAKKyNkZWZpbmUgU0VBUkNIX0VRVUFMXzEyICAgICAgIDB4YjEKKyNkZWZpbmUgU0VBUkNIX0xPV18xMiAgICAgICAgIDB4YjIKKyNkZWZpbmUgUkVBRF9FTEVNRU5UX1NUQVRVUyAgIDB4YjgKKyNkZWZpbmUgU0VORF9WT0xVTUVfVEFHICAgICAgIDB4YjYKKyNkZWZpbmUgV1JJVEVfTE9OR18yICAgICAgICAgIDB4ZWEKKworLyoKKyAqICBTdGF0dXMgY29kZXMKKyAqLworCisjZGVmaW5lIEdPT0QgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQ0hFQ0tfQ09ORElUSU9OICAgICAgMHgwMQorI2RlZmluZSBDT05ESVRJT05fR09PRCAgICAgICAweDAyCisjZGVmaW5lIEJVU1kgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgSU5URVJNRURJQVRFX0dPT0QgICAgMHgwOAorI2RlZmluZSBJTlRFUk1FRElBVEVfQ19HT09EICAweDBhCisjZGVmaW5lIFJFU0VSVkFUSU9OX0NPTkZMSUNUIDB4MGMKKyNkZWZpbmUgQ09NTUFORF9URVJNSU5BVEVEICAgMHgxMQorI2RlZmluZSBRVUVVRV9GVUxMICAgICAgICAgICAweDE0CisKKyNkZWZpbmUgU1RBVFVTX01BU0sgICAgICAgICAgMHgzZQorCisvKgorICogIFNFTlNFIEtFWVMKKyAqLworCisjZGVmaW5lIE5PX1NFTlNFICAgICAgICAgICAgMHgwMAorI2RlZmluZSBSRUNPVkVSRURfRVJST1IgICAgIDB4MDEKKyNkZWZpbmUgTk9UX1JFQURZICAgICAgICAgICAweDAyCisjZGVmaW5lIE1FRElVTV9FUlJPUiAgICAgICAgMHgwMworI2RlZmluZSBIQVJEV0FSRV9FUlJPUiAgICAgIDB4MDQKKyNkZWZpbmUgSUxMRUdBTF9SRVFVRVNUICAgICAweDA1CisjZGVmaW5lIFVOSVRfQVRURU5USU9OICAgICAgMHgwNgorI2RlZmluZSBEQVRBX1BST1RFQ1QgICAgICAgIDB4MDcKKyNkZWZpbmUgQkxBTktfQ0hFQ0sgICAgICAgICAweDA4CisjZGVmaW5lIENPUFlfQUJPUlRFRCAgICAgICAgMHgwYQorI2RlZmluZSBBQk9SVEVEX0NPTU1BTkQgICAgIDB4MGIKKyNkZWZpbmUgVk9MVU1FX09WRVJGTE9XICAgICAweDBkCisjZGVmaW5lIE1JU0NPTVBBUkUgICAgICAgICAgMHgwZQorCisKKy8qCisgKiAgREVWSUNFIFRZUEVTCisgKi8KKworI2RlZmluZSBUWVBFX0RJU0sgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgVFlQRV9UQVBFICAgICAgICAgICAweDAxCisjZGVmaW5lIFRZUEVfUFJPQ0VTU09SICAgICAgMHgwMyAgICAvKiBIUCBzY2FubmVycyB1c2UgdGhpcyAqLworI2RlZmluZSBUWVBFX1dPUk0gICAgICAgICAgIDB4MDQgICAgLyogVHJlYXRlZCBhcyBST00gYnkgb3VyIHN5c3RlbSAqLworI2RlZmluZSBUWVBFX1JPTSAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgVFlQRV9TQ0FOTkVSICAgICAgICAweDA2CisjZGVmaW5lIFRZUEVfTU9EICAgICAgICAgICAgMHgwNyAgICAvKiBNYWduZXRvLW9wdGljYWwgZGlzayAtCisJCQkJICAgICAqIC0gdHJlYXRlZCBhcyBUWVBFX0RJU0sgKi8KKyNkZWZpbmUgVFlQRV9NRURJVU1fQ0hBTkdFUiAweDA4CisjZGVmaW5lIFRZUEVfRU5DTE9TVVJFCSAgICAweDBkICAgIC8qIEVuY2xvc3VyZSBTZXJ2aWNlcyBEZXZpY2UgKi8KKyNkZWZpbmUgVFlQRV9OT19MVU4gICAgICAgICAweDdmCisKKy8qCisgKiBzdGFuZGFyZCBtb2RlLXNlbGVjdCBoZWFkZXIgcHJlcGVuZGVkIHRvIGFsbCBtb2RlLXNlbGVjdCBjb21tYW5kcworICoKKyAqIG1vdmVkIGhlcmUgZnJvbSBjZHJvbS5oIC0tIGtyYXhlbAorICovCisKK3N0cnVjdCBjY3NfbW9kZXNlbF9oZWFkCisgIHsKKyAgICB1bnNpZ25lZCBjaGFyIF9yMTsJCQkvKiByZXNlcnZlZC4gICovCisgICAgdW5zaWduZWQgY2hhciBtZWRpdW07CQkvKiBkZXZpY2Utc3BlY2lmaWMgbWVkaXVtIHR5cGUuICAqLworICAgIHVuc2lnbmVkIGNoYXIgX3IyOwkJCS8qIHJlc2VydmVkLiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGJsb2NrX2Rlc2NfbGVuZ3RoOwkvKiBibG9jayBkZXNjcmlwdG9yIGxlbmd0aC4gICovCisgICAgdW5zaWduZWQgY2hhciBkZW5zaXR5OwkJLyogZGV2aWNlLXNwZWNpZmljIGRlbnNpdHkgY29kZS4gICovCisgICAgdW5zaWduZWQgY2hhciBudW1iZXJfYmxvY2tzX2hpOwkvKiBudW1iZXIgb2YgYmxvY2tzIGluIHRoaXMgYmxvY2sKKwkJCQkJICAgZGVzYy4gICovCisgICAgdW5zaWduZWQgY2hhciBudW1iZXJfYmxvY2tzX21lZDsKKyAgICB1bnNpZ25lZCBjaGFyIG51bWJlcl9ibG9ja3NfbG87CisgICAgdW5zaWduZWQgY2hhciBfcjM7CisgICAgdW5zaWduZWQgY2hhciBibG9ja19sZW5ndGhfaGk7CS8qIGJsb2NrIGxlbmd0aCBmb3IgYmxvY2tzIGluIHRoaXMKKwkJCQkJICAgZGVzYy4gICovCisgICAgdW5zaWduZWQgY2hhciBibG9ja19sZW5ndGhfbWVkOworICAgIHVuc2lnbmVkIGNoYXIgYmxvY2tfbGVuZ3RoX2xvOworICB9OworCisvKgorICogIE1FU1NBR0UgQ09ERVMKKyAqLworCisjZGVmaW5lIENPTU1BTkRfQ09NUExFVEUgICAgMHgwMAorI2RlZmluZSBFWFRFTkRFRF9NRVNTQUdFICAgIDB4MDEKKyNkZWZpbmUgICAgIEVYVEVOREVEX01PRElGWV9EQVRBX1BPSU5URVIgICAgMHgwMAorI2RlZmluZSAgICAgRVhURU5ERURfU0RUUiAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lICAgICBFWFRFTkRFRF9FWFRFTkRFRF9JREVOVElGWSAgICAgIDB4MDIgICAgLyogU0NTSS1JIG9ubHkgKi8KKyNkZWZpbmUgICAgIEVYVEVOREVEX1dEVFIgICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBTQVZFX1BPSU5URVJTICAgICAgIDB4MDIKKyNkZWZpbmUgUkVTVE9SRV9QT0lOVEVSUyAgICAweDAzCisjZGVmaW5lIERJU0NPTk5FQ1QgICAgICAgICAgMHgwNAorI2RlZmluZSBJTklUSUFUT1JfRVJST1IgICAgIDB4MDUKKyNkZWZpbmUgQUJPUlQgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIE1FU1NBR0VfUkVKRUNUICAgICAgMHgwNworI2RlZmluZSBOT1AgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgTVNHX1BBUklUWV9FUlJPUiAgICAweDA5CisjZGVmaW5lIExJTktFRF9DTURfQ09NUExFVEUgMHgwYQorI2RlZmluZSBMSU5LRURfRkxHX0NNRF9DT01QTEVURSAweDBiCisjZGVmaW5lIEJVU19ERVZJQ0VfUkVTRVQgICAgMHgwYworCisjZGVmaW5lIElOSVRJQVRFX1JFQ09WRVJZICAgMHgwZiAgICAgICAgICAgIC8qIFNDU0ktSUkgb25seSAqLworI2RlZmluZSBSRUxFQVNFX1JFQ09WRVJZICAgIDB4MTAgICAgICAgICAgICAvKiBTQ1NJLUlJIG9ubHkgKi8KKworI2RlZmluZSBTSU1QTEVfUVVFVUVfVEFHICAgIDB4MjAKKyNkZWZpbmUgSEVBRF9PRl9RVUVVRV9UQUcgICAweDIxCisjZGVmaW5lIE9SREVSRURfUVVFVUVfVEFHICAgMHgyMgorCisvKgorICogSGVyZSBhcmUgc29tZSBzY3NpIHNwZWNpZmljIGlvY3RsIGNvbW1hbmRzIHdoaWNoIGFyZSBzb21ldGltZXMgdXNlZnVsLgorICovCisvKiBUaGVzZSBhcmUgYSBmZXcgb3RoZXIgY29uc3RhbnRzIG9ubHkgdXNlZCBieSBzY3NpIGRldmljZXMuICAqLworCisjZGVmaW5lIFNDU0lfSU9DVExfR0VUX0lETFVOIDB4NTM4MgorCisvKiBVc2VkIHRvIHR1cm4gb24gYW5kIG9mZiB0YWdnZWQgcXVldWluZyBmb3Igc2NzaSBkZXZpY2VzLiAgKi8KKworI2RlZmluZSBTQ1NJX0lPQ1RMX1RBR0dFRF9FTkFCTEUgMHg1MzgzCisjZGVmaW5lIFNDU0lfSU9DVExfVEFHR0VEX0RJU0FCTEUgMHg1Mzg0CisKKy8qIFVzZWQgdG8gb2J0YWluIHRoZSBob3N0IG51bWJlciBvZiBhIGRldmljZS4gICovCisjZGVmaW5lIFNDU0lfSU9DVExfUFJPQkVfSE9TVCAweDUzODUKKworLyogVXNlZCB0byBnZXQgdGhlIGJ1cyBudW1iZXIgZm9yIGEgZGV2aWNlLiAgKi8KKyNkZWZpbmUgU0NTSV9JT0NUTF9HRVRfQlVTX05VTUJFUiAweDUzODYKKworI2VuZGlmIC8qIHNjc2kvc2NzaS5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3Njc2kvc2NzaV9pb2N0bC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zY3NpL3Njc2lfaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWYwMTYxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zY3NpL3Njc2lfaW9jdGwuaApAQCAtMCwwICsxLDM0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NDU0lfSU9DVExfSAorI2RlZmluZSBfU0NTSV9JT0NUTF9IIAorCisvKiBJT0NUTHMgZm9yIFNDU0kuICAqLworI2RlZmluZSBTQ1NJX0lPQ1RMX1NFTkRfQ09NTUFORAkJMQkvKiBTZW5kIGEgY29tbWFuZCB0byB0aGUgU0NTSSBob3N0LiAgKi8KKyNkZWZpbmUgU0NTSV9JT0NUTF9URVNUX1VOSVRfUkVBRFkJMgkvKiBUZXN0IGlmIHVuaXQgaXMgcmVhZHkuICAqLworI2RlZmluZSBTQ1NJX0lPQ1RMX0JFTkNITUFSS19DT01NQU5ECTMKKyNkZWZpbmUgU0NTSV9JT0NUTF9TWU5DCQkJNAkvKiBSZXF1ZXN0IHN5bmNocm9ub3VzIHBhcmFtZXRlcnMuICAqLworI2RlZmluZSBTQ1NJX0lPQ1RMX1NUQVJUX1VOSVQJCTUKKyNkZWZpbmUgU0NTSV9JT0NUTF9TVE9QX1VOSVQJCTYKKyNkZWZpbmUgU0NTSV9JT0NUTF9ET09STE9DSwkJMHg1MzgwCS8qIExvY2sgdGhlIGVqZWN0IG1lY2hhbmlzbS4gICovCisjZGVmaW5lIFNDU0lfSU9DVExfRE9PUlVOTE9DSwkJMHg1MzgxCS8qIFVubG9jayB0aGUgbWVjaGFuaXNtLiAgKi8KKworI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zY3NpL3NnLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3Njc2kvc2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGRjMGFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zY3NpL3NnLmgKQEAgLTAsMCArMSwyNzUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgICBIaXN0b3J5OgorICAgIFN0YXJ0ZWQ6IEF1ZyA5IGJ5IExhd3JlbmNlIEZvYXJkIChlbnRyb3B5QHdvcmxkLnN0ZC5jb20pLCB0byBhbGxvdyB1c2VyCisgICAgIHByb2Nlc3MgY29udHJvbCBvZiBTQ1NJIGRldmljZXMuCisgICAgRGV2ZWxvcG1lbnQgU3BvbnNvcmVkIGJ5IEtpbGx5IENvcnAuIE5ZIE5ZCisqLworCisjaWZuZGVmIF9TQ1NJX1NHX0gKKyNkZWZpbmUgX1NDU0lfU0dfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisKKy8qIE5ldyBpbnRlcmZhY2UgaW50cm9kdWNlZCBpbiB0aGUgMy54IFNHIGRyaXZlcnMgZm9sbG93cyAqLworCisvKiBTYW1lIHN0cnVjdHVyZSBhcyB1c2VkIGJ5IHJlYWR2KCkgTGludXggc3lzdGVtIGNhbGwuIEl0IGRlZmluZXMgb25lCisgICBzY2F0dGVyLWdhdGhlciBlbGVtZW50LiAqLwordHlwZWRlZiBzdHJ1Y3Qgc2dfaW92ZWMKK3sKKyAgdm9pZCAqIGlvdl9iYXNlOyAgICAgICAgICAgIC8qIFN0YXJ0aW5nIGFkZHJlc3MgICovCisgIHNpemVfdCBpb3ZfbGVuOyAgICAgICAgICAgICAvKiBMZW5ndGggaW4gYnl0ZXMgICovCit9IHNnX2lvdmVjX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc2dfaW9faGRyCit7CisgIGludCBpbnRlcmZhY2VfaWQ7ICAgICAgICAgICAvKiBbaV0gJ1MnIGZvciBTQ1NJIGdlbmVyaWMgKHJlcXVpcmVkKSAqLworICBpbnQgZHhmZXJfZGlyZWN0aW9uOyAgICAgICAgLyogW2ldIGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uICAqLworICB1bnNpZ25lZCBjaGFyIGNtZF9sZW47ICAgICAgLyogW2ldIFNDU0kgY29tbWFuZCBsZW5ndGggKCA8PSAxNiBieXRlcykgKi8KKyAgdW5zaWduZWQgY2hhciBteF9zYl9sZW47ICAgIC8qIFtpXSBtYXggbGVuZ3RoIHRvIHdyaXRlIHRvIHNicCAqLworICB1bnNpZ25lZCBzaG9ydCBpbnQgaW92ZWNfY291bnQ7IC8qIFtpXSAwIGltcGxpZXMgbm8gc2NhdHRlciBnYXRoZXIgKi8KKyAgdW5zaWduZWQgaW50IGR4ZmVyX2xlbjsgICAgIC8qIFtpXSBieXRlIGNvdW50IG9mIGRhdGEgdHJhbnNmZXIgKi8KKyAgdm9pZCAqIGR4ZmVycDsgICAgICAgICAgICAgIC8qIFtpXSwgWyppb10gcG9pbnRzIHRvIGRhdGEgdHJhbnNmZXIgbWVtb3J5CisJCQkJIG9yIHNjYXR0ZXIgZ2F0aGVyIGxpc3QgKi8KKyAgdW5zaWduZWQgY2hhciAqIGNtZHA7ICAgICAgIC8qIFtpXSwgWyppXSBwb2ludHMgdG8gY29tbWFuZCB0byBwZXJmb3JtICovCisgIHVuc2lnbmVkIGNoYXIgKiBzYnA7ICAgICAgICAvKiBbaV0sIFsqb10gcG9pbnRzIHRvIHNlbnNlX2J1ZmZlciBtZW1vcnkgKi8KKyAgdW5zaWduZWQgaW50IHRpbWVvdXQ7ICAgICAgIC8qIFtpXSBNQVhfVUlOVC0+bm8gdGltZW91dCAodW5pdDogbWlsbGlzZWMpICovCisgIHVuc2lnbmVkIGludCBmbGFnczsgICAgICAgICAvKiBbaV0gMCAtPiBkZWZhdWx0LCBzZWUgU0dfRkxBRy4uLiAqLworICBpbnQgcGFja19pZDsgICAgICAgICAgICAgICAgLyogW2ktPm9dIHVudXNlZCBpbnRlcm5hbGx5IChub3JtYWxseSkgKi8KKyAgdm9pZCAqIHVzcl9wdHI7ICAgICAgICAgICAgIC8qIFtpLT5vXSB1bnVzZWQgaW50ZXJuYWxseSAqLworICB1bnNpZ25lZCBjaGFyIHN0YXR1czsgICAgICAgLyogW29dIHNjc2kgc3RhdHVzICovCisgIHVuc2lnbmVkIGNoYXIgbWFza2VkX3N0YXR1czsvKiBbb10gc2hpZnRlZCwgbWFza2VkIHNjc2kgc3RhdHVzICovCisgIHVuc2lnbmVkIGNoYXIgbXNnX3N0YXR1czsgICAvKiBbb10gbWVzc2FnaW5nIGxldmVsIGRhdGEgKG9wdGlvbmFsKSAqLworICB1bnNpZ25lZCBjaGFyIHNiX2xlbl93cjsgICAgLyogW29dIGJ5dGUgY291bnQgYWN0dWFsbHkgd3JpdHRlbiB0byBzYnAgKi8KKyAgdW5zaWduZWQgc2hvcnQgaW50IGhvc3Rfc3RhdHVzOyAvKiBbb10gZXJyb3JzIGZyb20gaG9zdCBhZGFwdGVyICovCisgIHVuc2lnbmVkIHNob3J0IGludCBkcml2ZXJfc3RhdHVzOy8qIFtvXSBlcnJvcnMgZnJvbSBzb2Z0d2FyZSBkcml2ZXIgKi8KKyAgaW50IHJlc2lkOyAgICAgICAgICAgICAgICAgIC8qIFtvXSBkeGZlcl9sZW4gLSBhY3R1YWxfdHJhbnNmZXJyZWQgKi8KKyAgdW5zaWduZWQgaW50IGR1cmF0aW9uOyAgICAgIC8qIFtvXSB0aW1lIHRha2VuIGJ5IGNtZCAodW5pdDogbWlsbGlzZWMpICovCisgIHVuc2lnbmVkIGludCBpbmZvOyAgICAgICAgICAvKiBbb10gYXV4aWxpYXJ5IGluZm9ybWF0aW9uICovCit9IHNnX2lvX2hkcl90OworCisKKy8qIFVzZSBuZWdhdGl2ZSB2YWx1ZXMgdG8gZmxhZyBkaWZmZXJlbmNlIGZyb20gb3JpZ2luYWwgc2dfaGVhZGVyIHN0cnVjdHVyZS4gICovCisjZGVmaW5lIFNHX0RYRkVSX05PTkUgLTEgICAgICAgIC8qIGUuZy4gYSBTQ1NJIFRlc3QgVW5pdCBSZWFkeSBjb21tYW5kICovCisjZGVmaW5lIFNHX0RYRkVSX1RPX0RFViAtMiAgICAgIC8qIGUuZy4gYSBTQ1NJIFdSSVRFIGNvbW1hbmQgKi8KKyNkZWZpbmUgU0dfRFhGRVJfRlJPTV9ERVYgLTMgICAgLyogZS5nLiBhIFNDU0kgUkVBRCBjb21tYW5kICovCisjZGVmaW5lIFNHX0RYRkVSX1RPX0ZST01fREVWIC00IC8qIHRyZWF0ZWQgbGlrZSBTR19EWEZFUl9GUk9NX0RFViB3aXRoIHRoZQorCQkJCSAgIGFkZGl0aW9uYWwgcHJvcGVydHkgdGhhbiBkdXJpbmcgaW5kaXJlY3QKKwkJCQkgICBJTyB0aGUgdXNlciBidWZmZXIgaXMgY29waWVkIGludG8gdGhlCisJCQkJICAga2VybmVsIGJ1ZmZlcnMgYmVmb3JlIHRoZSB0cmFuc2ZlciAqLworCisKKy8qIGZvbGxvd2luZyBmbGFnIHZhbHVlcyBjYW4gYmUgIm9yIi1lZCB0b2dldGhlciAqLworI2RlZmluZSBTR19GTEFHX0RJUkVDVF9JTyAxICAgICAvKiBkZWZhdWx0IGlzIGluZGlyZWN0IElPICovCisjZGVmaW5lIFNHX0ZMQUdfTFVOX0lOSElCSVQgMiAgIC8qIGRlZmF1bHQgaXMgdG8gcHV0IGRldmljZSdzIGx1biBpbnRvICovCisJCQkJLyogdGhlIDJuZCBieXRlIG9mIFNDU0kgY29tbWFuZCAqLworI2RlZmluZSBTR19GTEFHX05PX0RYRkVSIDB4MTAwMDAgLyogbm8gdHJhbnNmZXIgb2Yga2VybmVsIGJ1ZmZlcnMgdG8vZnJvbSAqLworCQkJCS8qIHVzZXIgc3BhY2UgKGRlYnVnIGluZGlyZWN0IElPKSAqLworCisvKiBUaGUgZm9sbG93aW5nICdpbmZvJyB2YWx1ZXMgYXJlICJvciItZWQgdG9nZXRoZXIuICAqLworI2RlZmluZSBTR19JTkZPX09LX01BU0sJMHgxCisjZGVmaW5lIFNHX0lORk9fT0sJMHgwCS8qIG5vIHNlbnNlLCBob3N0IG5vciBkcml2ZXIgIm5vaXNlIiAqLworI2RlZmluZSBTR19JTkZPX0NIRUNLCTB4MSAgICAgLyogc29tZXRoaW5nIGFibm9ybWFsIGhhcHBlbmVkICovCisKKyNkZWZpbmUgU0dfSU5GT19ESVJFQ1RfSU9fTUFTSwkweDYKKyNkZWZpbmUgU0dfSU5GT19JTkRJUkVDVF9JTyAJMHgwCS8qIGRhdGEgeGZlciB2aWEga2VybmVsIGJ1ZmZlcnMgKG9yIG5vIHhmZXIpICovCisjZGVmaW5lIFNHX0lORk9fRElSRUNUX0lPIAkweDIJLyogZGlyZWN0IElPIHJlcXVlc3RlZCBhbmQgcGVyZm9ybWVkICovCisjZGVmaW5lIFNHX0lORk9fTUlYRURfSU8gCTB4NAkvKiBwYXJ0IGRpcmVjdCwgcGFydCBpbmRpcmVjdCBJTyAqLworCisKKy8qIFJlcXVlc3QgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBTRyBkZXZpY2UsIHVzZWQgYnkKKyAgIFNHX0dFVF9TQ1NJX0lEIGlvY3RsICgpLiAgKi8KK3N0cnVjdCBzZ19zY3NpX2lkIHsKKyAgLyogSG9zdCBudW1iZXIgYXMgaW4gInNjc2k8bj4iIHdoZXJlICduJyBpcyBvbmUgb2YgMCwgMSwgMiBldGMuICAqLworICBpbnQgaG9zdF9ubzsKKyAgaW50IGNoYW5uZWw7CisgIC8qIFNDU0kgaWQgb2YgdGFyZ2V0IGRldmljZS4gICovCisgIGludCBzY3NpX2lkOworICBpbnQgbHVuOworICAvKiBUWVBFXy4uLiBkZWZpbmVkIGluIDxzY3NpL3Njc2kuaD4uICAqLworICBpbnQgc2NzaV90eXBlOworICAvKiBIb3N0IChhZGFwdGVyKSBtYXhpbXVtIGNvbW1hbmRzIHBlciBsdW4uICAqLworICBzaG9ydCBpbnQgaF9jbWRfcGVyX2x1bjsKKyAgLyogRGV2aWNlIChvciBhZGFwdGVyKSBtYXhpbXVtIHF1ZXVlIGxlbmd0aC4gICovCisgIHNob3J0IGludCBkX3F1ZXVlX2RlcHRoOworICAvKiBVbnVzZWQsIHNldCB0byAwIGZvciBub3cuICAqLworICBpbnQgdW51c2VkWzJdOworfTsKKworLyogVXNlZCBieSBTR19HRVRfUkVRVUVTVF9UQUJMRSBpb2N0bCgpLiAgKi8KK3R5cGVkZWYgc3RydWN0IHNnX3JlcV9pbmZvIHsKKyAgICBjaGFyIHJlcV9zdGF0ZTsgICAgIC8qIDAgLT4gbm90IHVzZWQsIDEgLT4gd3JpdHRlbiwgMiAtPiByZWFkeSB0byByZWFkICovCisgICAgY2hhciBvcnBoYW47ICAgICAgICAvKiAwIC0+IG5vcm1hbCByZXF1ZXN0LCAxIC0+IGZyb20gaW50ZXJydXBlZCBTR19JTyAqLworICAgIGNoYXIgc2dfaW9fb3duZWQ7ICAgLyogMCAtPiBjb21wbGV0ZSB3aXRoIHJlYWQoKSwgMSAtPiBvd25lZCBieSBTR19JTyAqLworICAgIGNoYXIgcHJvYmxlbTsgICAgICAgLyogMCAtPiBubyBwcm9ibGVtIGRldGVjdGVkLCAxIC0+IGVycm9yIHRvIHJlcG9ydCAqLworICAgIGludCBwYWNrX2lkOyAgICAgICAgLyogcGFja19pZCBhc3NvY2lhdGVkIHdpdGggcmVxdWVzdCAqLworICAgIHZvaWQgKiB1c3JfcHRyOyAgICAgLyogdXNlciBwcm92aWRlZCBwb2ludGVyIChpbiBuZXcgaW50ZXJmYWNlKSAqLworICAgIHVuc2lnbmVkIGludCBkdXJhdGlvbjsgLyogbWlsbGlzZWNzIGVsYXBzZWQgc2luY2Ugd3JpdHRlbiAocmVxX3N0YXRlPT0xKQorCQkJICAgICAgb3IgcmVxdWVzdCBkdXJhdGlvbiAocmVxX3N0YXRlPT0yKSAqLworICAgIGludCB1bnVzZWQ7Cit9IHNnX3JlcV9pbmZvX3Q7CisKKworLyogSU9DVExzOiBUaG9zZSBpb2N0bHMgdGhhdCBhcmUgcmVsZXZhbnQgdG8gdGhlIFNHIDMueCBkcml2ZXJzIGZvbGxvdy4KKyBbVGhvc2UgdGhhdCBvbmx5IGFwcGx5IHRvIHRoZSBTRyAyLnggZHJpdmVycyBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS5dCisgKF9HRVRfcyB5aWVsZCByZXN1bHQgdmlhICdpbnQgKicgM3JkIGFyZ3VtZW50IHVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkKSAqLworCisjZGVmaW5lIFNHX0VNVUxBVEVEX0hPU1QgMHgyMjAzIC8qIHRydWUgZm9yIGVtdWxhdGVkIGhvc3QgYWRhcHRlciAoQVRBUEkpICovCisKKy8qIFVzZWQgdG8gY29uZmlndXJlIFNDU0kgY29tbWFuZCB0cmFuc2Zvcm1hdGlvbiBsYXllciBmb3IgQVRBUEkgZGV2aWNlcyAqLworLyogT25seSBzdXBwb3J0ZWQgYnkgdGhlIGlkZS1zY3NpIGRyaXZlciAqLworI2RlZmluZSBTR19TRVRfVFJBTlNGT1JNIDB4MjIwNCAvKiBOLkIuIDNyZCBhcmcgaXMgbm90IHBvaW50ZXIgYnV0IHZhbHVlOiAqLworCQkgICAgICAvKiAzcmQgYXJnID0gMCB0byBkaXNhYmxlIHRyYW5zZm9ybSwgMSB0byBlbmFibGUgaXQgKi8KKyNkZWZpbmUgU0dfR0VUX1RSQU5TRk9STSAweDIyMDUKKworI2RlZmluZSBTR19TRVRfUkVTRVJWRURfU0laRSAweDIyNzUgIC8qIHJlcXVlc3QgYSBuZXcgcmVzZXJ2ZWQgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgU0dfR0VUX1JFU0VSVkVEX1NJWkUgMHgyMjcyICAvKiBhY3R1YWwgc2l6ZSBvZiByZXNlcnZlZCBidWZmZXIgKi8KKworLyogVGhlIGZvbGxvd2luZyBpb2N0bCBoYXMgYSAnc2dfc2NzaV9pZF90IConIG9iamVjdCBhcyBpdHMgM3JkIGFyZ3VtZW50LiAqLworI2RlZmluZSBTR19HRVRfU0NTSV9JRCAweDIyNzYgICAvKiBZaWVsZHMgZmQncyBidXMsIGNoYW4sIGRldiwgbHVuICsgdHlwZSAqLworLyogU0NTSSBpZCBpbmZvcm1hdGlvbiBjYW4gYWxzbyBiZSBvYnRhaW5lZCBmcm9tIFNDU0lfSU9DVExfR0VUX0lETFVOICovCisKKy8qIE92ZXJyaWRlIGhvc3Qgc2V0dGluZyBhbmQgYWx3YXlzIERNQSB1c2luZyBsb3cgbWVtb3J5ICggPDE2TUIgb24gaTM4NikgKi8KKyNkZWZpbmUgU0dfU0VUX0ZPUkNFX0xPV19ETUEgMHgyMjc5ICAvKiAwLT4gdXNlIGFkYXB0ZXIgc2V0dGluZywgMS0+IGZvcmNlICovCisjZGVmaW5lIFNHX0dFVF9MT1dfRE1BIDB4MjI3YSAgIC8qIDAtPiB1c2UgYWxsIHJhbSBmb3IgZG1hOyAxLT4gbG93IGRtYSByYW0gKi8KKworLyogV2hlbiBTR19TRVRfRk9SQ0VfUEFDS19JRCBzZXQgdG8gMSwgcGFja19pZCBpcyBpbnB1dCB0byByZWFkKCkgd2hpY2gKKyAgIHRyaWVzIHRvIGZldGNoIGEgcGFja2V0IHdpdGggYSBtYXRjaGluZyBwYWNrX2lkLCB3YWl0cywgb3IgcmV0dXJucyBFQUdBSU4uCisgICBJZiBwYWNrX2lkIGlzIC0xIHRoZW4gcmVhZCBvbGRlc3Qgd2FpdGluZy4gV2hlbiAuLi5GT1JDRV9QQUNLX0lEIHNldCB0byAwCisgICB0aGVuIHBhY2tfaWQgaWdub3JlZCBieSByZWFkKCkgYW5kIG9sZGVzdCByZWFkYWJsZSBmZXRjaGVkLiAqLworI2RlZmluZSBTR19TRVRfRk9SQ0VfUEFDS19JRCAweDIyN2IKKyNkZWZpbmUgU0dfR0VUX1BBQ0tfSUQgMHgyMjdjIC8qIFlpZWxkcyBvbGRlc3QgcmVhZGFibGUgcGFja19pZCAob3IgLTEpICovCisKKyNkZWZpbmUgU0dfR0VUX05VTV9XQUlUSU5HIDB4MjI3ZCAvKiBOdW1iZXIgb2YgY29tbWFuZHMgYXdhaXRpbmcgcmVhZCgpICovCisKKy8qIFlpZWxkcyBtYXggc2NhdHRlciBnYXRoZXIgdGFibGVzaXplIGFsbG93ZWQgYnkgY3VycmVudCBob3N0IGFkYXB0ZXIgKi8KKyNkZWZpbmUgU0dfR0VUX1NHX1RBQkxFU0laRSAweDIyN0YgIC8qIDAgaW1wbGllcyBjYW4ndCBkbyBzY2F0dGVyIGdhdGhlciAqLworCisjZGVmaW5lIFNHX0dFVF9WRVJTSU9OX05VTSAweDIyODIgLyogRXhhbXBsZTogdmVyc2lvbiAyLjEuMzQgeWllbGRzIDIwMTM0ICovCisKKy8qIFJldHVybnMgLUVCVVNZIGlmIG9jY3VwaWVkLiAzcmQgYXJndW1lbnQgcG9pbnRlciB0byBpbnQgKHNlZSBuZXh0KSAqLworI2RlZmluZSBTR19TQ1NJX1JFU0VUIDB4MjI4NAorLyogQXNzb2NpYXRlZCB2YWx1ZXMgdGhhdCBjYW4gYmUgZ2l2ZW4gdG8gU0dfU0NTSV9SRVNFVCBmb2xsb3cgKi8KKyNkZWZpbmUgU0dfU0NTSV9SRVNFVF9OT1RISU5HCTAKKyNkZWZpbmUgU0dfU0NTSV9SRVNFVF9ERVZJQ0UJMQorI2RlZmluZSBTR19TQ1NJX1JFU0VUX0JVUwkyCisjZGVmaW5lIFNHX1NDU0lfUkVTRVRfSE9TVAkzCisKKy8qIHN5bmNocm9ub3VzIFNDU0kgY29tbWFuZCBpb2N0bCwgKG9ubHkgaW4gdmVyc2lvbiAzIGludGVyZmFjZSkgKi8KKyNkZWZpbmUgU0dfSU8gMHgyMjg1ICAgLyogc2ltaWxhciBlZmZlY3QgYXMgd3JpdGUoKSBmb2xsb3dlZCBieSByZWFkKCkgKi8KKworI2RlZmluZSBTR19HRVRfUkVRVUVTVF9UQUJMRSAweDIyODYgICAvKiB5aWVsZHMgdGFibGUgb2YgYWN0aXZlIHJlcXVlc3RzICovCisKKy8qIEhvdyB0byB0cmVhdCBFSU5UUiBkdXJpbmcgU0dfSU8gaW9jdGwoKSwgb25seSBpbiBTRyAzLnggc2VyaWVzICovCisjZGVmaW5lIFNHX1NFVF9LRUVQX09SUEhBTiAweDIyODcgLyogMSAtPiBob2xkIGZvciByZWFkKCksIDAgLT4gZHJvcCAoZGVmKSAqLworI2RlZmluZSBTR19HRVRfS0VFUF9PUlBIQU4gMHgyMjg4CisKKworI2RlZmluZSBTR19TQ0FUVEVSX1NaICg4ICogNDA5NikgIC8qIFBBR0VfU0laRSBub3QgYXZhaWxhYmxlIHRvIHVzZXIgKi8KKy8qIExhcmdlc3Qgc2l6ZSAoaW4gYnl0ZXMpIGEgc2luZ2xlIHNjYXR0ZXItZ2F0aGVyIGxpc3QgZWxlbWVudCBjYW4gaGF2ZS4KKyAgIFRoZSB2YWx1ZSBtdXN0IGJlIGEgcG93ZXIgb2YgMiBhbmQgPD0gKFBBR0VfU0laRSAqIDMyKSBbMTMxMDcyIGJ5dGVzIG9uCisgICBpMzg2XS4gVGhlIG1pbmltdW0gdmFsdWUgaXMgUEFHRV9TSVpFLiBJZiBzY2F0dGVyLWdhdGhlciBub3Qgc3VwcG9ydGVkCisgICBieSBhZGFwdGVyIHRoZW4gdGhpcyB2YWx1ZSBpcyB0aGUgbGFyZ2VzdCBkYXRhIGJsb2NrIHRoYXQgY2FuIGJlCisgICByZWFkL3dyaXR0ZW4gYnkgYSBzaW5nbGUgc2NzaSBjb21tYW5kLiBUaGUgdXNlciBjYW4gZmluZCB0aGUgdmFsdWUgb2YKKyAgIFBBR0VfU0laRSBieSBjYWxsaW5nIGdldHBhZ2VzaXplKCkgZGVmaW5lZCBpbiB1bmlzdGQuaCAuICovCisKKyNkZWZpbmUgU0dfREVGQVVMVF9SRVRSSUVTIDEKKworLyogRGVmYXVsdHMsIGNvbW1lbnRlZCBpZiB0aGV5IGRpZmZlciBmcm9tIG9yaWdpbmFsIHNnIGRyaXZlciAqLworI2RlZmluZSBTR19ERUZfRk9SQ0VfTE9XX0RNQSAwICAvKiB3YXMgMSAtPiBtZW1vcnkgYmVsb3cgMTZNQiBvbiBpMzg2ICovCisjZGVmaW5lIFNHX0RFRl9GT1JDRV9QQUNLX0lEIDAKKyNkZWZpbmUgU0dfREVGX0tFRVBfT1JQSEFOIDAKKyNkZWZpbmUgU0dfREVGX1JFU0VSVkVEX1NJWkUgU0dfU0NBVFRFUl9TWiAvKiBsb2FkIHRpbWUgb3B0aW9uICovCisKKy8qIG1heGltdW0gb3V0c3RhbmRpbmcgcmVxdWVzdHMsIHdyaXRlKCkgeWllbGRzIEVET00gaWYgZXhjZWVkZWQgKi8KKyNkZWZpbmUgU0dfTUFYX1FVRVVFIDE2CisKKyNkZWZpbmUgU0dfQklHX0JVRkYgU0dfREVGX1JFU0VSVkVEX1NJWkUgICAgLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKworLyogQWx0ZXJuYXRlIHN0eWxlIHR5cGUgbmFtZXMsICIuLi5fdCIgdmFyaWFudHMgcHJlZmVycmVkICovCit0eXBlZGVmIHN0cnVjdCBzZ19pb19oZHIgU2dfaW9faGRyOwordHlwZWRlZiBzdHJ1Y3Qgc2dfaW9fdmVjIFNnX2lvX3ZlYzsKK3R5cGVkZWYgc3RydWN0IHNnX3Njc2lfaWQgU2dfc2NzaV9pZDsKK3R5cGVkZWYgc3RydWN0IHNnX3JlcV9pbmZvIFNnX3JlcV9pbmZvOworCisKKy8qIHZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYgKi8KKy8qICAgVGhlIG9sZGVyIFNHIGludGVyZmFjZSBiYXNlZCBvbiB0aGUgJ3NnX2hlYWRlcicgc3RydWN0dXJlIGZvbGxvd3MuICAgKi8KKy8qIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4gKi8KKworI2RlZmluZSBTR19NQVhfU0VOU0UgMTYgICAvKiB0aGlzIG9ubHkgYXBwbGllcyB0byB0aGUgc2dfaGVhZGVyIGludGVyZmFjZSAqLworCitzdHJ1Y3Qgc2dfaGVhZGVyCisgeworICAgLyogTGVuZ3RoIG9mIGluY29taW5nIHBhY2tldCAoaW5jbHVkaW5nIGhlYWRlcikuICAqLworICAgaW50IHBhY2tfbGVuOworICAgLyogTWF4aW1hbCBsZW5ndGggb2YgZXhwZWN0ZWQgcmVwbHkuICAqLworICAgaW50IHJlcGx5X2xlbjsKKyAgIC8qIElkIG51bWJlciBvZiBwYWNrZXQuICAqLworICAgaW50IHBhY2tfaWQ7CisgICAvKiAwPT1vaywgb3RoZXJ3aXNlIGVycm9yIG51bWJlci4gICovCisgICBpbnQgcmVzdWx0OworICAgLyogRm9yY2UgMTIgYnl0ZSBjb21tYW5kIGxlbmd0aCBmb3IgZ3JvdXAgNiAmIDcgY29tbWFuZHMuICAqLworICAgdW5zaWduZWQgaW50IHR3ZWx2ZV9ieXRlOjE7CisgICAvKiBTQ1NJIHN0YXR1cyBmcm9tIHRhcmdldC4gICovCisgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X3N0YXR1czo1OworICAgLyogSG9zdCBzdGF0dXMgKHNlZSAiRElEIiBjb2RlcykuICAqLworICAgdW5zaWduZWQgaW50IGhvc3Rfc3RhdHVzOjg7CisgICAvKiBEcml2ZXIgc3RhdHVzK3N1Z2dlc3Rpb24uICAqLworICAgdW5zaWduZWQgaW50IGRyaXZlcl9zdGF0dXM6ODsKKyAgIC8qIFVudXNlZC4gICovCisgICB1bnNpZ25lZCBpbnQgb3RoZXJfZmxhZ3M6MTA7CisgICAvKiBPdXRwdXQgaW4gMyBjYXNlczoKKyAgICAgIHdoZW4gdGFyZ2V0X3N0YXR1cyBpcyBDSEVDS19DT05ESVRJT04gb3IKKyAgICAgIHdoZW4gdGFyZ2V0X3N0YXR1cyBpcyBDT01NQU5EX1RFUk1JTkFURUQgb3IKKyAgICAgIHdoZW4gKGRyaXZlcl9zdGF0dXMgJiBEUklWRVJfU0VOU0UpIGlzIHRydWUuICAqLworICAgdW5zaWduZWQgY2hhciBzZW5zZV9idWZmZXJbU0dfTUFYX1NFTlNFXTsKKyB9OworCisKKy8qIElPQ1RMczogVGhlIGZvbGxvd2luZyBhcmUgbm90IHJlcXVpcmVkIChvciBpZ25vcmVkKSB3aGVuIHRoZSBzZ19pb19oZHJfdAorCSAgIGludGVyZmFjZSBpcyB1c2VkLiBUaGV5IGFyZSBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGgKKwkgICB0aGUgb3JpZ2luYWwgYW5kIHZlcnNpb24gMiBkcml2ZXJzLiAqLworCisjZGVmaW5lIFNHX1NFVF9USU1FT1VUCQkweDIyMDEJLyogU2V0IHRpbWVvdXQ7ICooaW50ICopYXJnPT10aW1lb3V0LiAgKi8KKyNkZWZpbmUgU0dfR0VUX1RJTUVPVVQJCTB4MjIwMgkvKiBHZXQgdGltZW91dDsgcmV0dXJuIHRpbWVvdXQuICAqLworCisvKiBHZXQvc2V0IGNvbW1hbmQgcXVldWluZyBzdGF0ZSBwZXIgZmQgKGRlZmF1bHQgaXMgU0dfREVGX0NPTU1BTkRfUSkuICovCisjZGVmaW5lIFNHX0dFVF9DT01NQU5EX1EJMHgyMjcwCS8qIFlpZWxkcyAwIChxdWV1aW5nIG9mZikgb3IgMSAob24pLiAgKi8KKyNkZWZpbmUgU0dfU0VUX0NPTU1BTkRfUSAJMHgyMjcxCS8qIENoYW5nZSBxdWV1aW5nIHN0YXRlIHdpdGggMCBvciAxLiAgKi8KKworLyogVHVybiBvbiBlcnJvciBzZW5zZSB0cmFjZSAoMS4uOCksIGR1bXAgdGhpcyBkZXZpY2UgdG8gbG9nL2NvbnNvbGUgKDkpCisgICBvciBkdW1wIGFsbCBzZyBkZXZpY2Ugc3RhdGVzICggPjkgKSB0byBsb2cvY29uc29sZS4gICovCisjZGVmaW5lIFNHX1NFVF9ERUJVRwkJMHgyMjdlCS8qIDAgLT4gdHVybiBvZmYgZGVidWcgKi8KKworI2RlZmluZSBTR19ORVhUX0NNRF9MRU4JCTB4MjI4MwkvKiBPdmVycmlkZSBTQ1NJIGNvbW1hbmQgbGVuZ3RoIHdpdGggZ2l2ZW4KKwkJCQkJICAgbnVtYmVyIG9uIHRoZSBuZXh0IHdyaXRlKCkgb24gdGhpcyBmaWxlCisJCQkJCSAgIGRlc2NyaXB0b3IuICAqLworCisvKiBEZWZhdWx0cywgY29tbWVudGVkIGlmIHRoZXkgZGlmZmVyIGZyb20gb3JpZ2luYWwgc2cgZHJpdmVyICovCisjZGVmaW5lIFNHX0RFRkFVTFRfVElNRU9VVCAoNjAqSFopIC8qIEhaID09ICdqaWZmaWVzIGluIDEgc2Vjb25kJyAqLworI2RlZmluZSBTR19ERUZfQ09NTUFORF9RIDAgICAgIC8qIGNvbW1hbmQgcXVldWluZyBpcyBhbHdheXMgb24gd2hlbgorCQkJCSAgdGhlIG5ldyBpbnRlcmZhY2UgaXMgdXNlZCAqLworI2RlZmluZSBTR19ERUZfVU5ERVJSVU5fRkxBRyAwCisKKworI2VuZGlmCS8qIHNjc2kvc2cuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zZWFyY2guaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2VhcmNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmYmE2OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2VhcmNoLmgKQEAgLTAsMCArMSwxNzUgQEAKKy8qIERlY2xhcmF0aW9ucyBmb3IgU3lzdGVtIFYgc3R5bGUgc2VhcmNoaW5nIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TRUFSQ0hfSAorI2RlZmluZQlfU0VBUkNIX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2RlZmluZSBfX25lZWRfc2l6ZV90CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK19fQkVHSU5fREVDTFMKKworI2lmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBQcm90b3R5cGUgc3RydWN0dXJlIGZvciBhIGxpbmtlZC1saXN0IGRhdGEgc3RydWN0dXJlLgorICAgVGhpcyBpcyB0aGUgdHlwZSB1c2VkIGJ5IHRoZSBgaW5zcXVlJyBhbmQgYHJlbXF1ZScgZnVuY3Rpb25zLiAgKi8KKworIyBpZmRlZiBfX1VTRV9HTlUKK3N0cnVjdCBxZWxlbQorICB7CisgICAgc3RydWN0IHFlbGVtICpxX2Zvcnc7CisgICAgc3RydWN0IHFlbGVtICpxX2JhY2s7CisgICAgY2hhciBxX2RhdGFbMV07CisgIH07CisjIGVuZGlmCisKKworLyogSW5zZXJ0IEVMRU0gaW50byBhIGRvdWJseS1saW5rZWQgbGlzdCwgYWZ0ZXIgUFJFVi4gICovCitleHRlcm4gdm9pZCBpbnNxdWUgKHZvaWQgKl9fZWxlbSwgdm9pZCAqX19wcmV2KSBfX1RIUk9XOworCisvKiBVbmxpbmsgRUxFTSBmcm9tIHRoZSBkb3VibHktbGlua2VkIGxpc3QgdGhhdCBpdCBpcyBpbi4gICovCitleHRlcm4gdm9pZCByZW1xdWUgKHZvaWQgKl9fZWxlbSkgX19USFJPVzsKKyNlbmRpZgorCisKKy8qIEZvciB1c2Ugd2l0aCBoc2VhcmNoKDMpLiAgKi8KKyNpZm5kZWYgX19DT01QQVJfRk5fVAorIyBkZWZpbmUgX19DT01QQVJfRk5fVAordHlwZWRlZiBpbnQgKCpfX2NvbXBhcl9mbl90KSAoX19jb25zdCB2b2lkICosIF9fY29uc3Qgdm9pZCAqKTsKKworIyBpZmRlZglfX1VTRV9HTlUKK3R5cGVkZWYgX19jb21wYXJfZm5fdCBjb21wYXJpc29uX2ZuX3Q7CisjIGVuZGlmCisjZW5kaWYKKworLyogQWN0aW9uIHdoaWNoIHNoYWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgY2FsbCB0aGUgaHNlYXJjaC4gICovCit0eXBlZGVmIGVudW0KKyAgeworICAgIEZJTkQsCisgICAgRU5URVIKKyAgfQorQUNUSU9OOworCit0eXBlZGVmIHN0cnVjdCBlbnRyeQorICB7CisgICAgY2hhciAqa2V5OworICAgIHZvaWQgKmRhdGE7CisgIH0KK0VOVFJZOworCisvKiBPcGFxdWUgdHlwZSBmb3IgaW50ZXJuYWwgdXNlLiAgKi8KK3N0cnVjdCBfRU5UUlk7CisKKy8qIEZhbWlseSBvZiBoYXNoIHRhYmxlIGhhbmRsaW5nIGZ1bmN0aW9ucy4gIFRoZSBmdW5jdGlvbnMgYWxzbworICAgaGF2ZSByZWVudHJhbnQgY291bnRlcnBhcnRzIGVuZGluZyB3aXRoIF9yLiAgVGhlIG5vbi1yZWVudHJhbnQKKyAgIGZ1bmN0aW9ucyBhbGwgd29yayBvbiBhIHNpZ25sZSBpbnRlcm5hbCBoYXNoaW5nIHRhYmxlLiAgKi8KKworLyogU2VhcmNoIGZvciBlbnRyeSBtYXRjaGluZyBJVEVNLmtleSBpbiBpbnRlcm5hbCBoYXNoIHRhYmxlLiAgSWYKKyAgIEFDVElPTiBpcyBgRklORCcgcmV0dXJuIGZvdW5kIGVudHJ5IG9yIHNpZ25hbCBlcnJvciBieSByZXR1cm5pbmcKKyAgIE5VTEwuICBJZiBBQ1RJT04gaXMgYEVOVEVSJyByZXBsYWNlIGV4aXN0aW5nIGRhdGEgKGlmIGFueSkgd2l0aAorICAgSVRFTS5kYXRhLiAgKi8KK2V4dGVybiBFTlRSWSAqaHNlYXJjaCAoRU5UUlkgX19pdGVtLCBBQ1RJT04gX19hY3Rpb24pIF9fVEhST1c7CisKKy8qIENyZWF0ZSBhIG5ldyBoYXNoaW5nIHRhYmxlIHdoaWNoIHdpbGwgYXQgbW9zdCBjb250YWluIE5FTCBlbGVtZW50cy4gICovCitleHRlcm4gaW50IGhjcmVhdGUgKHNpemVfdCBfX25lbCkgX19USFJPVzsKKworLyogRGVzdHJveSBjdXJyZW50IGludGVybmFsIGhhc2hpbmcgdGFibGUuICAqLworZXh0ZXJuIHZvaWQgaGRlc3Ryb3kgKHZvaWQpIF9fVEhST1c7CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIERhdGEgdHlwZSBmb3IgcmVlbnRyYW50IGZ1bmN0aW9ucy4gICovCitzdHJ1Y3QgaHNlYXJjaF9kYXRhCisgIHsKKyAgICBzdHJ1Y3QgX0VOVFJZICp0YWJsZTsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgZmlsbGVkOworICB9OworCisvKiBSZWVudHJhbnQgdmVyc2lvbnMgd2hpY2ggY2FuIGhhbmRsZSBtdWx0aXBsZSBoYXNoaW5nIHRhYmxlcyBhdCB0aGUKKyAgIHNhbWUgdGltZS4gICovCitleHRlcm4gaW50IGhzZWFyY2hfciAoRU5UUlkgX19pdGVtLCBBQ1RJT04gX19hY3Rpb24sIEVOVFJZICoqX19yZXR2YWwsCisJCSAgICAgIHN0cnVjdCBoc2VhcmNoX2RhdGEgKl9faHRhYikgX19USFJPVzsKK2V4dGVybiBpbnQgaGNyZWF0ZV9yIChzaXplX3QgX19uZWwsIHN0cnVjdCBoc2VhcmNoX2RhdGEgKl9faHRhYikgX19USFJPVzsKK2V4dGVybiB2b2lkIGhkZXN0cm95X3IgKHN0cnVjdCBoc2VhcmNoX2RhdGEgKl9faHRhYikgX19USFJPVzsKKyNlbmRpZgorCisKKy8qIFRoZSB0c2VhcmNoIHJvdXRpbmVzIGFyZSB2ZXJ5IGludGVyZXN0aW5nLiBUaGV5IG1ha2UgbWFueQorICAgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGNvbXBpbGVyLiAgSXQgYXNzdW1lcyB0aGF0IHRoZSBmaXJzdCBmaWVsZAorICAgaW4gbm9kZSBtdXN0IGJlIHRoZSAia2V5IiBmaWVsZCwgd2hpY2ggcG9pbnRzIHRvIHRoZSBkYXR1bS4KKyAgIEV2ZXJ5dGhpbmcgZGVwZW5kcyBvbiB0aGF0LiAgKi8KKy8qIEZvciB0c2VhcmNoICovCit0eXBlZGVmIGVudW0KK3sKKyAgcHJlb3JkZXIsCisgIHBvc3RvcmRlciwKKyAgZW5kb3JkZXIsCisgIGxlYWYKK30KK1ZJU0lUOworCisvKiBTZWFyY2ggZm9yIGFuIGVudHJ5IG1hdGNoaW5nIHRoZSBnaXZlbiBLRVkgaW4gdGhlIHRyZWUgcG9pbnRlZCB0bworICAgYnkgKlJPT1RQIGFuZCBpbnNlcnQgYSBuZXcgZWxlbWVudCBpZiBub3QgZm91bmQuICAqLworZXh0ZXJuIHZvaWQgKnRzZWFyY2ggKF9fY29uc3Qgdm9pZCAqX19rZXksIHZvaWQgKipfX3Jvb3RwLAorCQkgICAgICBfX2NvbXBhcl9mbl90IF9fY29tcGFyKTsKKworLyogU2VhcmNoIGZvciBhbiBlbnRyeSBtYXRjaGluZyB0aGUgZ2l2ZW4gS0VZIGluIHRoZSB0cmVlIHBvaW50ZWQgdG8KKyAgIGJ5ICpST09UUC4gIElmIG5vIG1hdGNoaW5nIGVudHJ5IGlzIGF2YWlsYWJsZSByZXR1cm4gTlVMTC4gICovCitleHRlcm4gdm9pZCAqdGZpbmQgKF9fY29uc3Qgdm9pZCAqX19rZXksIHZvaWQgKl9fY29uc3QgKl9fcm9vdHAsCisJCSAgICBfX2NvbXBhcl9mbl90IF9fY29tcGFyKTsKKworLyogUmVtb3ZlIHRoZSBlbGVtZW50IG1hdGNoaW5nIEtFWSBmcm9tIHRoZSB0cmVlIHBvaW50ZWQgdG8gYnkgKlJPT1RQLiAgKi8KK2V4dGVybiB2b2lkICp0ZGVsZXRlIChfX2NvbnN0IHZvaWQgKl9fcmVzdHJpY3QgX19rZXksCisJCSAgICAgIHZvaWQgKipfX3Jlc3RyaWN0IF9fcm9vdHAsCisJCSAgICAgIF9fY29tcGFyX2ZuX3QgX19jb21wYXIpOworCisjaWZuZGVmIF9fQUNUSU9OX0ZOX1QKKyMgZGVmaW5lIF9fQUNUSU9OX0ZOX1QKK3R5cGVkZWYgdm9pZCAoKl9fYWN0aW9uX2ZuX3QpIChfX2NvbnN0IHZvaWQgKl9fbm9kZXAsIFZJU0lUIF9fdmFsdWUsCisJCQkgICAgICAgaW50IF9fbGV2ZWwpOworI2VuZGlmCisKKy8qIFdhbGsgdGhyb3VnaCB0aGUgd2hvbGUgdHJlZSBhbmQgY2FsbCB0aGUgQUNUSU9OIGNhbGxiYWNrIGZvciBldmVyeSBub2RlCisgICBvciBsZWFmLiAgKi8KK2V4dGVybiB2b2lkIHR3YWxrIChfX2NvbnN0IHZvaWQgKl9fcm9vdCwgX19hY3Rpb25fZm5fdCBfX2FjdGlvbik7CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIENhbGxiYWNrIHR5cGUgZm9yIGZ1bmN0aW9uIHRvIGZyZWUgYSB0cmVlIG5vZGUuICBJZiB0aGUga2V5cyBhcmUgYXRvbWljCisgICBkYXRhIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGRvIG5vdGhpbmcuICAqLwordHlwZWRlZiB2b2lkICgqX19mcmVlX2ZuX3QpICh2b2lkICpfX25vZGVwKTsKKworLyogRGVzdHJveSB0aGUgd2hvbGUgdHJlZSwgY2FsbCBGUkVFRkNUIGZvciBlYWNoIG5vZGUgb3IgbGVhZi4gICovCitleHRlcm4gdm9pZCB0ZGVzdHJveSAodm9pZCAqX19yb290LCBfX2ZyZWVfZm5fdCBfX2ZyZWVmY3QpOworI2VuZGlmCisKKworLyogUGVyZm9ybSBsaW5lYXIgc2VhcmNoIGZvciBLRVkgYnkgY29tcGFyaW5nIGJ5IENPTVBBUiBpbiBhbiBhcnJheQorICAgW0JBU0UsQkFTRStOTUVNQipTSVpFKS4gICovCitleHRlcm4gdm9pZCAqbGZpbmQgKF9fY29uc3Qgdm9pZCAqX19rZXksIF9fY29uc3Qgdm9pZCAqX19iYXNlLAorCQkgICAgc2l6ZV90ICpfX25tZW1iLCBzaXplX3QgX19zaXplLCBfX2NvbXBhcl9mbl90IF9fY29tcGFyKTsKKworLyogUGVyZm9ybSBsaW5lYXIgc2VhcmNoIGZvciBLRVkgYnkgY29tcGFyaW5nIGJ5IENPTVBBUiBmdW5jdGlvbiBpbgorICAgYXJyYXkgW0JBU0UsQkFTRStOTUVNQipTSVpFKSBhbmQgaW5zZXJ0IGVudHJ5IGlmIG5vdCBmb3VuZC4gICovCitleHRlcm4gdm9pZCAqbHNlYXJjaCAoX19jb25zdCB2b2lkICpfX2tleSwgdm9pZCAqX19iYXNlLAorCQkgICAgICBzaXplX3QgKl9fbm1lbWIsIHNpemVfdCBfX3NpemUsIF9fY29tcGFyX2ZuX3QgX19jb21wYXIpOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc2VhcmNoLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2VtYXBob3JlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3NlbWFwaG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExY2FmNjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3NlbWFwaG9yZS5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU0VNQVBIT1JFX0gKKyNkZWZpbmUgX1NFTUFQSE9SRV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgX19VU0VfWE9QRU4ySworIyBkZWZpbmUgX19uZWVkX3RpbWVzcGVjCisjIGluY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorCisvKiBHZXQgdGhlIGRlZmluaXRpb24gZm9yIHNlbV90LiAgKi8KKyNpbmNsdWRlIDxiaXRzL3NlbWFwaG9yZS5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogSW5pdGlhbGl6ZSBzZW1hcGhvcmUgb2JqZWN0IFNFTSB0byBWQUxVRS4gIElmIFBTSEFSRUQgdGhlbiBzaGFyZSBpdAorICAgd2l0aCBvdGhlciBwcm9jZXNzZXMuICAqLworZXh0ZXJuIGludCBzZW1faW5pdCAoc2VtX3QgKl9fc2VtLCBpbnQgX19wc2hhcmVkLCB1bnNpZ25lZCBpbnQgX192YWx1ZSkKKyAgICAgX19USFJPVzsKKy8qIEZyZWUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBzZW1hcGhvcmUgb2JqZWN0IFNFTS4gICovCitleHRlcm4gaW50IHNlbV9kZXN0cm95IChzZW1fdCAqX19zZW0pIF9fVEhST1c7CisKKy8qIE9wZW4gYSBuYW1lZCBzZW1hcGhvcmUgTkFNRSB3aXRoIG9wZW4gZmxhZ3MgT0ZMQUcuICAqLworZXh0ZXJuIHNlbV90ICpzZW1fb3BlbiAoX19jb25zdCBjaGFyICpfX25hbWUsIGludCBfX29mbGFnLCAuLi4pIF9fVEhST1c7CisKKy8qIENsb3NlIGRlc2NyaXB0b3IgZm9yIG5hbWVkIHNlbWFwaG9yZSBTRU0uICAqLworZXh0ZXJuIGludCBzZW1fY2xvc2UgKHNlbV90ICpfX3NlbSkgX19USFJPVzsKKworLyogUmVtb3ZlIG5hbWVkIHNlbWFwaG9yZSBOQU1FLiAgKi8KK2V4dGVybiBpbnQgc2VtX3VubGluayAoX19jb25zdCBjaGFyICpfX25hbWUpIF9fVEhST1c7CisKKy8qIFdhaXQgZm9yIFNFTSBiZWluZyBwb3N0ZWQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBzZW1fd2FpdCAoc2VtX3QgKl9fc2VtKTsKKworI2lmZGVmIF9fVVNFX1hPUEVOMksKKy8qIFNpbWlsYXIgdG8gYHNlbV93YWl0JyBidXQgd2FpdCBvbmx5IHVudGlsIEFCU1RJTUUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBzZW1fdGltZWR3YWl0IChzZW1fdCAqX19yZXN0cmljdCBfX3NlbSwKKwkJCSAgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVzdHJpY3QgX19hYnN0aW1lKTsKKyNlbmRpZgorCisvKiBUZXN0IHdoZXRoZXIgU0VNIGlzIHBvc3RlZC4gICovCitleHRlcm4gaW50IHNlbV90cnl3YWl0IChzZW1fdCAqX19zZW0pIF9fVEhST1dOTDsKKworLyogUG9zdCBTRU0uICAqLworZXh0ZXJuIGludCBzZW1fcG9zdCAoc2VtX3QgKl9fc2VtKSBfX1RIUk9XTkw7CisKKy8qIEdldCBjdXJyZW50IHZhbHVlIG9mIFNFTSBhbmQgc3RvcmUgaXQgaW4gKlNWQUwuICAqLworZXh0ZXJuIGludCBzZW1fZ2V0dmFsdWUgKHNlbV90ICpfX3Jlc3RyaWN0IF9fc2VtLCBpbnQgKl9fcmVzdHJpY3QgX19zdmFsKQorICAgICBfX1RIUk9XOworCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzZW1hcGhvcmUuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zZXRqbXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2V0am1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1N2FiNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2V0am1wLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0xOTk5LDIwMDEsMjAwMiwyMDA3LDIwMDksMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCUlTTyBDOTkgU3RhbmRhcmQ6IDcuMTMgTm9ubG9jYWwganVtcHMJPHNldGptcC5oPgorICovCisKKyNpZm5kZWYJX1NFVEpNUF9ICisjZGVmaW5lCV9TRVRKTVBfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKyNpbmNsdWRlIDxiaXRzL3NldGptcC5oPgkJLyogR2V0IGBfX2ptcF9idWYnLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3NpZ3NldC5oPgkJLyogR2V0IGBfX3NpZ3NldF90Jy4gICovCisKKworLyogQ2FsbGluZyBlbnZpcm9ubWVudCwgcGx1cyBwb3NzaWJseSBhIHNhdmVkIHNpZ25hbCBtYXNrLiAgKi8KK3N0cnVjdCBfX2ptcF9idWZfdGFnCisgIHsKKyAgICAvKiBOT1RFOiBUaGUgbWFjaGluZS1kZXBlbmRlbnQgZGVmaW5pdGlvbnMgb2YgYF9fc2lnc2V0am1wJworICAgICAgIGFzc3VtZSB0aGF0IGEgYGptcF9idWYnIGJlZ2lucyB3aXRoIGEgYF9fam1wX2J1ZicgYW5kIHRoYXQKKyAgICAgICBgX19tYXNrX3dhc19zYXZlZCcgZm9sbG93cyBpdC4gIERvIG5vdCBtb3ZlIHRoZXNlIG1lbWJlcnMKKyAgICAgICBvciBhZGQgb3RoZXJzIGJlZm9yZSBpdC4gICovCisgICAgX19qbXBfYnVmIF9fam1wYnVmOwkJLyogQ2FsbGluZyBlbnZpcm9ubWVudC4gICovCisgICAgaW50IF9fbWFza193YXNfc2F2ZWQ7CS8qIFNhdmVkIHRoZSBzaWduYWwgbWFzaz8gICovCisgICAgX19zaWdzZXRfdCBfX3NhdmVkX21hc2s7CS8qIFNhdmVkIHNpZ25hbCBtYXNrLiAgKi8KKyAgfTsKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKwordHlwZWRlZiBzdHJ1Y3QgX19qbXBfYnVmX3RhZyBqbXBfYnVmWzFdOworCisvKiBTdG9yZSB0aGUgY2FsbGluZyBlbnZpcm9ubWVudCBpbiBFTlYsIGFsc28gc2F2aW5nIHRoZSBzaWduYWwgbWFzay4KKyAgIFJldHVybiAwLiAgKi8KK2V4dGVybiBpbnQgc2V0am1wIChqbXBfYnVmIF9fZW52KSBfX1RIUk9XTkw7CisKK19fRU5EX05BTUVTUEFDRV9TVEQKKworLyogU3RvcmUgdGhlIGNhbGxpbmcgZW52aXJvbm1lbnQgaW4gRU5WLCBhbHNvIHNhdmluZyB0aGUKKyAgIHNpZ25hbCBtYXNrIGlmIFNBVkVNQVNLIGlzIG5vbnplcm8uICBSZXR1cm4gMC4KKyAgIFRoaXMgaXMgdGhlIGludGVybmFsIG5hbWUgZm9yIGBzaWdzZXRqbXAnLiAgKi8KK2V4dGVybiBpbnQgX19zaWdzZXRqbXAgKHN0cnVjdCBfX2ptcF9idWZfdGFnIF9fZW52WzFdLCBpbnQgX19zYXZlbWFzaykgX19USFJPV05MOworCisjaWZuZGVmCV9fRkFWT1JfQlNECisvKiBTdG9yZSB0aGUgY2FsbGluZyBlbnZpcm9ubWVudCBpbiBFTlYsIG5vdCBzYXZpbmcgdGhlIHNpZ25hbCBtYXNrLgorICAgUmV0dXJuIDAuICAqLworZXh0ZXJuIGludCBfc2V0am1wIChzdHJ1Y3QgX19qbXBfYnVmX3RhZyBfX2VudlsxXSkgX19USFJPV05MOworCisvKiBEbyBub3Qgc2F2ZSB0aGUgc2lnbmFsIG1hc2suICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGBfc2V0am1wJworICAgQlNEIGZ1bmN0aW9uLiAgKi8KKyMgZGVmaW5lIHNldGptcChlbnYpCV9zZXRqbXAgKGVudikKKyNlbHNlCisvKiBXZSBhcmUgaW4gNC4zIEJTRC1jb21wYXRpYmlsaXR5IG1vZGUgaW4gd2hpY2ggYHNldGptcCcKKyAgIHNhdmVzIHRoZSBzaWduYWwgbWFzayBsaWtlIGBzaWdzZXRqbXAgKEVOViwgMSknLiAgV2UgaGF2ZSB0bworICAgZGVmaW5lIGEgbWFjcm8gc2luY2UgSVNPIEMgc2F5cyBgc2V0am1wJyBpcyBvbmUuICAqLworIyBkZWZpbmUgc2V0am1wKGVudikJc2V0am1wIChlbnYpCisjZW5kaWYgLyogRmF2b3IgQlNELiAgKi8KKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKworLyogSnVtcCB0byB0aGUgZW52aXJvbm1lbnQgc2F2ZWQgaW4gRU5WLCBtYWtpbmcgdGhlCisgICBgc2V0am1wJyBjYWxsIHRoZXJlIHJldHVybiBWQUwsIG9yIDEgaWYgVkFMIGlzIDAuICAqLworZXh0ZXJuIHZvaWQgbG9uZ2ptcCAoc3RydWN0IF9fam1wX2J1Zl90YWcgX19lbnZbMV0sIGludCBfX3ZhbCkKKyAgICAgX19USFJPV05MIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorLyogU2FtZS4gIFVzdWFsbHkgYF9sb25nam1wJyBpcyB1c2VkIHdpdGggYF9zZXRqbXAnLCB3aGljaCBkb2VzIG5vdCBzYXZlCisgICB0aGUgc2lnbmFsIG1hc2suICBCdXQgaXQgaXMgaG93IEVOViB3YXMgc2F2ZWQgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIKKyAgIGBsb25nam1wJyByZXN0b3JlcyB0aGUgbWFzazsgYF9sb25nam1wJyBpcyBqdXN0IGFuIGFsaWFzLiAgKi8KK2V4dGVybiB2b2lkIF9sb25nam1wIChzdHJ1Y3QgX19qbXBfYnVmX3RhZyBfX2VudlsxXSwgaW50IF9fdmFsKQorICAgICBfX1RIUk9XTkwgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworI2VuZGlmCisKKworI2lmZGVmCV9fVVNFX1BPU0lYCisvKiBVc2UgdGhlIHNhbWUgdHlwZSBmb3IgYGptcF9idWYnIGFuZCBgc2lnam1wX2J1ZicuCisgICBUaGUgYF9fbWFza193YXNfc2F2ZWQnIGZsYWcgZGV0ZXJtaW5lcyB3aGV0aGVyCisgICBvciBub3QgYGxvbmdqbXAnIHdpbGwgcmVzdG9yZSB0aGUgc2lnbmFsIG1hc2suICAqLwordHlwZWRlZiBzdHJ1Y3QgX19qbXBfYnVmX3RhZyBzaWdqbXBfYnVmWzFdOworCisvKiBTdG9yZSB0aGUgY2FsbGluZyBlbnZpcm9ubWVudCBpbiBFTlYsIGFsc28gc2F2aW5nIHRoZQorICAgc2lnbmFsIG1hc2sgaWYgU0FWRU1BU0sgaXMgbm9uemVyby4gIFJldHVybiAwLiAgKi8KKyMgZGVmaW5lIHNpZ3NldGptcChlbnYsIHNhdmVtYXNrKQlfX3NpZ3NldGptcCAoZW52LCBzYXZlbWFzaykKKworLyogSnVtcCB0byB0aGUgZW52aXJvbm1lbnQgc2F2ZWQgaW4gRU5WLCBtYWtpbmcgdGhlCisgICBzaWdzZXRqbXAgY2FsbCB0aGVyZSByZXR1cm4gVkFMLCBvciAxIGlmIFZBTCBpcyAwLgorICAgUmVzdG9yZSB0aGUgc2lnbmFsIG1hc2sgaWYgdGhhdCBzaWdzZXRqbXAgY2FsbCBzYXZlZCBpdC4KKyAgIFRoaXMgaXMganVzdCBhbiBhbGlhcyBgbG9uZ2ptcCcuICAqLworZXh0ZXJuIHZvaWQgc2lnbG9uZ2ptcCAoc2lnam1wX2J1ZiBfX2VudiwgaW50IF9fdmFsKQorICAgICBfX1RIUk9XTkwgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworI2VuZGlmIC8qIFVzZSBQT1NJWC4gICovCisKKworLyogRGVmaW5lIGhlbHBlciBmdW5jdGlvbnMgdG8gY2F0Y2ggdW5zYWZlIGNvZGUuICAqLworI2lmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAwCisjIGluY2x1ZGUgPGJpdHMvc2V0am1wMi5oPgorI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzZXRqbXAuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2d0dHkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2d0dHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjJiYzQxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zZ3R0eS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5NiwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU0dUVFlfSAorI2RlZmluZQlfU0dUVFlfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKy8qIE9uIHNvbWUgc3lzdGVtcyB0aGlzIHR5cGUgaXMgbm90IGRlZmluZWQgYnkgPGJpdHMvaW9jdGwtdHlwZXMuaD47CisgICBpbiB0aGF0IGNhc2UsIHRoZSBmdW5jdGlvbnMgYXJlIGp1c3Qgc3R1YnMgdGhhdCByZXR1cm4gRU5PU1lTLiAgKi8KK3N0cnVjdCBzZ3R0eWI7CisKK19fQkVHSU5fREVDTFMKKworLyogRmlsbCBpbiAqUEFSQU1TIHdpdGggdGVybWluYWwgcGFyYW1ldGVycyBhc3NvY2lhdGVkIHdpdGggRkQuICAqLworZXh0ZXJuIGludCBndHR5IChpbnQgX19mZCwgc3RydWN0IHNndHR5YiAqX19wYXJhbXMpIF9fVEhST1c7CisKKy8qIFNldCB0aGUgdGVybWluYWwgcGFyYW1ldGVycyBhc3NvY2lhdGVkIHdpdGggRkQgdG8gKlBBUkFNUy4gICovCitleHRlcm4gaW50IHN0dHkgKGludCBfX2ZkLCBfX2NvbnN0IHN0cnVjdCBzZ3R0eWIgKl9fcGFyYW1zKSBfX1RIUk9XOworCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzZ3R0eS5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zaGFkb3cuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2hhZG93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc4ZGY1MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2hhZG93LmgKQEAgLTAsMCArMSwxNDkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogRGVjbGFyYXRpb24gb2YgdHlwZXMgYW5kIGZ1bmN0aW9ucyBmb3Igc2hhZG93IHBhc3N3b3JkIHN1aXRlLiAgKi8KKworI2lmbmRlZiBfU0hBRE9XX0gKKyNkZWZpbmUgX1NIQURPV19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxwYXRocy5oPgorCisjZGVmaW5lCV9fbmVlZF9GSUxFCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBQYXRocyB0byB0aGUgdXNlciBkYXRhYmFzZSBmaWxlcy4gICovCisjZGVmaW5lCVNIQURPVyBfUEFUSF9TSEFET1cKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFN0cnVjdHVyZSBvZiB0aGUgcGFzc3dvcmQgZmlsZS4gICovCitzdHJ1Y3Qgc3B3ZAorICB7CisgICAgY2hhciAqc3BfbmFtcDsJCS8qIExvZ2luIG5hbWUuICAqLworICAgIGNoYXIgKnNwX3B3ZHA7CQkvKiBFbmNyeXB0ZWQgcGFzc3dvcmQuICAqLworICAgIGxvbmcgaW50IHNwX2xzdGNoZzsJCS8qIERhdGUgb2YgbGFzdCBjaGFuZ2UuICAqLworICAgIGxvbmcgaW50IHNwX21pbjsJCS8qIE1pbmltdW0gbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBjaGFuZ2VzLiAgKi8KKyAgICBsb25nIGludCBzcF9tYXg7CQkvKiBNYXhpbXVtIG51bWJlciBvZiBkYXlzIGJldHdlZW4gY2hhbmdlcy4gICovCisgICAgbG9uZyBpbnQgc3Bfd2FybjsJCS8qIE51bWJlciBvZiBkYXlzIHRvIHdhcm4gdXNlciB0byBjaGFuZ2UKKwkJCQkgICB0aGUgcGFzc3dvcmQuICAqLworICAgIGxvbmcgaW50IHNwX2luYWN0OwkJLyogTnVtYmVyIG9mIGRheXMgdGhlIGFjY291bnQgbWF5IGJlCisJCQkJICAgaW5hY3RpdmUuICAqLworICAgIGxvbmcgaW50IHNwX2V4cGlyZTsJCS8qIE51bWJlciBvZiBkYXlzIHNpbmNlIDE5NzAtMDEtMDEgdW50aWwKKwkJCQkgICBhY2NvdW50IGV4cGlyZXMuICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHNwX2ZsYWc7CS8qIFJlc2VydmVkLiAgKi8KKyAgfTsKKworCisvKiBPcGVuIGRhdGFiYXNlIGZvciByZWFkaW5nLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBzZXRzcGVudCAodm9pZCk7CisKKy8qIENsb3NlIGRhdGFiYXNlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBlbmRzcGVudCAodm9pZCk7CisKKy8qIEdldCBuZXh0IGVudHJ5IGZyb20gZGF0YWJhc2UsIHBlcmhhcHMgYWZ0ZXIgb3BlbmluZyB0aGUgZmlsZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBzcHdkICpnZXRzcGVudCAodm9pZCk7CisKKy8qIEdldCBzaGFkb3cgZW50cnkgbWF0Y2hpbmcgTkFNRS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBzcHdkICpnZXRzcG5hbSAoX19jb25zdCBjaGFyICpfX25hbWUpOworCisvKiBSZWFkIHNoYWRvdyBlbnRyeSBmcm9tIFNUUklORy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBzcHdkICpzZ2V0c3BlbnQgKF9fY29uc3QgY2hhciAqX19zdHJpbmcpOworCisvKiBSZWFkIG5leHQgc2hhZG93IGVudHJ5IGZyb20gU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IHNwd2QgKmZnZXRzcGVudCAoRklMRSAqX19zdHJlYW0pOworCisvKiBXcml0ZSBsaW5lIGNvbnRhaW5pbmcgc2hhZG93IHBhc3N3b3JkIGVudHJ5IHRvIHN0cmVhbS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwdXRzcGVudCAoX19jb25zdCBzdHJ1Y3Qgc3B3ZCAqX19wLCBGSUxFICpfX3N0cmVhbSk7CisKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIFJlZW50cmFudCB2ZXJzaW9ucyBvZiBzb21lIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUuCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIHRoZXkgYXJlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRzcGVudF9yIChzdHJ1Y3Qgc3B3ZCAqX19yZXN1bHRfYnVmLCBjaGFyICpfX2J1ZmZlciwKKwkJICAgICAgIHNpemVfdCBfX2J1Zmxlbiwgc3RydWN0IHNwd2QgKipfX3Jlc3VsdCk7CisKK2V4dGVybiBpbnQgZ2V0c3BuYW1fciAoX19jb25zdCBjaGFyICpfX25hbWUsIHN0cnVjdCBzcHdkICpfX3Jlc3VsdF9idWYsCisJCSAgICAgICBjaGFyICpfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkgICAgICAgc3RydWN0IHNwd2QgKipfX3Jlc3VsdCk7CisKK2V4dGVybiBpbnQgc2dldHNwZW50X3IgKF9fY29uc3QgY2hhciAqX19zdHJpbmcsIHN0cnVjdCBzcHdkICpfX3Jlc3VsdF9idWYsCisJCQljaGFyICpfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkJc3RydWN0IHNwd2QgKipfX3Jlc3VsdCk7CisKK2V4dGVybiBpbnQgZmdldHNwZW50X3IgKEZJTEUgKl9fc3RyZWFtLCBzdHJ1Y3Qgc3B3ZCAqX19yZXN1bHRfYnVmLAorCQkJY2hhciAqX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCXN0cnVjdCBzcHdkICoqX19yZXN1bHQpOworI2VuZGlmCS8qIG1pc2MgKi8KKworCisvKiBUaGUgc2ltcGxlIGxvY2tpbmcgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBoZXJlIGlzIG5vdCBzdWl0YWJsZSBmb3IKKyAgIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucy4gICovCisKKy8qIFByb3RlY3QgcGFzc3dvcmQgZmlsZSBhZ2FpbnN0IG11bHRpIHdyaXRlcnMuICAqLworZXh0ZXJuIGludCBsY2twd2RmICh2b2lkKSBfX1RIUk9XOworCisvKiBVbmxvY2sgcGFzc3dvcmQgZmlsZS4gICovCitleHRlcm4gaW50IHVsY2twd2RmICh2b2lkKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc2hhZG93LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2lnbmFsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3NpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZGY2NDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3NpZ25hbC5oCkBAIC0wLDAgKzEsNDEwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtMjAwNCwgMjAwNywgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCUlTTyBDOTkgU3RhbmRhcmQ6IDcuMTQgU2lnbmFsIGhhbmRsaW5nIDxzaWduYWwuaD4KKyAqLworCisjaWZuZGVmCV9TSUdOQUxfSAorCisjaWYgIWRlZmluZWQgX19uZWVkX3NpZ19hdG9taWNfdCAmJiAhZGVmaW5lZCBfX25lZWRfc2lnc2V0X3QKKyMgZGVmaW5lIF9TSUdOQUxfSAorI2VuZGlmCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKyNpbmNsdWRlIDxiaXRzL3NpZ3NldC5oPgkJLyogX19zaWdzZXRfdCwgX19zaWdfYXRvbWljX3QuICAqLworCisvKiBBbiBpbnRlZ3JhbCB0eXBlIHRoYXQgY2FuIGJlIG1vZGlmaWVkIGF0b21pY2FsbHksIHdpdGhvdXQgdGhlCisgICBwb3NzaWJpbGl0eSBvZiBhIHNpZ25hbCBhcnJpdmluZyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBvcGVyYXRpb24uICAqLworI2lmIGRlZmluZWQgX19uZWVkX3NpZ19hdG9taWNfdCB8fCBkZWZpbmVkIF9TSUdOQUxfSAorIyBpZm5kZWYgX19zaWdfYXRvbWljX3RfZGVmaW5lZAorIyAgZGVmaW5lIF9fc2lnX2F0b21pY190X2RlZmluZWQKK19fQkVHSU5fTkFNRVNQQUNFX1NURAordHlwZWRlZiBfX3NpZ19hdG9taWNfdCBzaWdfYXRvbWljX3Q7CitfX0VORF9OQU1FU1BBQ0VfU1RECisjIGVuZGlmCisjIHVuZGVmIF9fbmVlZF9zaWdfYXRvbWljX3QKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX25lZWRfc2lnc2V0X3QgfHwgKGRlZmluZWQgX1NJR05BTF9IICYmIGRlZmluZWQgX19VU0VfUE9TSVgpCisjIGlmbmRlZiBfX3NpZ3NldF90X2RlZmluZWQKKyMgIGRlZmluZSBfX3NpZ3NldF90X2RlZmluZWQKK3R5cGVkZWYgX19zaWdzZXRfdCBzaWdzZXRfdDsKKyMgZW5kaWYKKyMgdW5kZWYgX19uZWVkX3NpZ3NldF90CisjZW5kaWYKKworI2lmZGVmIF9TSUdOQUxfSAorCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorI2luY2x1ZGUgPGJpdHMvc2lnbnVtLmg+CisKKyNpZiBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworIyBpZm5kZWYgX19waWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fcGlkX3QgcGlkX3Q7CisjICBkZWZpbmUgX19waWRfdF9kZWZpbmVkCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9YT1BFTgorIyBlbmRpZgorIyBpZm5kZWYgX191aWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fdWlkX3QgdWlkX3Q7CisjICBkZWZpbmUgX191aWRfdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYJLyogVW5peDk4ICovCisKKyNpZmRlZiBfX1VTRV9QT1NJWDE5OTMwOQorLyogV2UgbmVlZCBgc3RydWN0IHRpbWVzcGVjJyBsYXRlciBvbi4gICovCisjIGRlZmluZSBfX25lZWRfdGltZXNwZWMKKyMgaW5jbHVkZSA8dGltZS5oPgorCisvKiBHZXQgdGhlIGBzaWdpbmZvX3QnIHR5cGUgcGx1cyB0aGUgbmVlZGVkIHN5bWJvbHMuICAqLworIyBpbmNsdWRlIDxiaXRzL3NpZ2luZm8uaD4KKyNlbmRpZgorCisKKy8qIFR5cGUgb2YgYSBzaWduYWwgaGFuZGxlci4gICovCit0eXBlZGVmIHZvaWQgKCpfX3NpZ2hhbmRsZXJfdCkgKGludCk7CisKKy8qIFRoZSBYL09wZW4gZGVmaW5pdGlvbiBvZiBgc2lnbmFsJyBzcGVjaWZpZXMgdGhlIFNWSUQgc2VtYW50aWMuICBVc2UKKyAgIHRoZSBhZGRpdGlvbmFsIGZ1bmN0aW9uIGBzeXN2X3NpZ25hbCcgd2hlbiBYL09wZW4gY29tcGF0aWJpbGl0eSBpcworICAgcmVxdWVzdGVkLiAgKi8KK2V4dGVybiBfX3NpZ2hhbmRsZXJfdCBfX3N5c3Zfc2lnbmFsIChpbnQgX19zaWcsIF9fc2lnaGFuZGxlcl90IF9faGFuZGxlcikKKyAgICAgX19USFJPVzsKKyNpZmRlZiBfX1VTRV9HTlUKK2V4dGVybiBfX3NpZ2hhbmRsZXJfdCBzeXN2X3NpZ25hbCAoaW50IF9fc2lnLCBfX3NpZ2hhbmRsZXJfdCBfX2hhbmRsZXIpCisgICAgIF9fVEhST1c7CisjZW5kaWYKKworLyogU2V0IHRoZSBoYW5kbGVyIGZvciB0aGUgc2lnbmFsIFNJRyB0byBIQU5ETEVSLCByZXR1cm5pbmcgdGhlIG9sZAorICAgaGFuZGxlciwgb3IgU0lHX0VSUiBvbiBlcnJvci4KKyAgIEJ5IGRlZmF1bHQgYHNpZ25hbCcgaGFzIHRoZSBCU0Qgc2VtYW50aWMuICAqLworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisjaWZkZWYgX19VU0VfQlNECitleHRlcm4gX19zaWdoYW5kbGVyX3Qgc2lnbmFsIChpbnQgX19zaWcsIF9fc2lnaGFuZGxlcl90IF9faGFuZGxlcikKKyAgICAgX19USFJPVzsKKyNlbHNlCisvKiBNYWtlIHN1cmUgdGhlIHVzZWQgYHNpZ25hbCcgaW1wbGVtZW50YXRpb24gaXMgdGhlIFNWSUQgdmVyc2lvbi4gKi8KKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBfX3NpZ2hhbmRsZXJfdCBfX1JFRElSRUNUX05USCAoc2lnbmFsLAorCQkJCSAgICAgIChpbnQgX19zaWcsIF9fc2lnaGFuZGxlcl90IF9faGFuZGxlciksCisJCQkJICAgICAgX19zeXN2X3NpZ25hbCk7CisjIGVsc2UKKyMgIGRlZmluZSBzaWduYWwgX19zeXN2X3NpZ25hbAorIyBlbmRpZgorI2VuZGlmCitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9YT1BFTgorLyogVGhlIFgvT3BlbiBkZWZpbml0aW9uIG9mIGBzaWduYWwnIGNvbmZsaWN0cyB3aXRoIHRoZSBCU0QgdmVyc2lvbi4KKyAgIFNvIHRoZXkgZGVmaW5lZCBhbm90aGVyIGZ1bmN0aW9uIGBic2Rfc2lnbmFsJy4gICovCitleHRlcm4gX19zaWdoYW5kbGVyX3QgYnNkX3NpZ25hbCAoaW50IF9fc2lnLCBfX3NpZ2hhbmRsZXJfdCBfX2hhbmRsZXIpCisgICAgIF9fVEhST1c7CisjZW5kaWYKKworLyogU2VuZCBzaWduYWwgU0lHIHRvIHByb2Nlc3MgbnVtYmVyIFBJRC4gIElmIFBJRCBpcyB6ZXJvLAorICAgc2VuZCBTSUcgdG8gYWxsIHByb2Nlc3NlcyBpbiB0aGUgY3VycmVudCBwcm9jZXNzJ3MgcHJvY2VzcyBncm91cC4KKyAgIElmIFBJRCBpcyA8IC0xLCBzZW5kIFNJRyB0byBhbGwgcHJvY2Vzc2VzIGluIHByb2Nlc3MgZ3JvdXAgLSBQSUQuICAqLworI2lmZGVmIF9fVVNFX1BPU0lYCitleHRlcm4gaW50IGtpbGwgKF9fcGlkX3QgX19waWQsIGludCBfX3NpZykgX19USFJPVzsKKyNlbmRpZiAvKiBVc2UgUE9TSVguICAqLworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogU2VuZCBTSUcgdG8gYWxsIHByb2Nlc3NlcyBpbiBwcm9jZXNzIGdyb3VwIFBHUlAuCisgICBJZiBQR1JQIGlzIHplcm8sIHNlbmQgU0lHIHRvIGFsbCBwcm9jZXNzZXMgaW4KKyAgIHRoZSBjdXJyZW50IHByb2Nlc3MncyBwcm9jZXNzIGdyb3VwLiAgKi8KK2V4dGVybiBpbnQga2lsbHBnIChfX3BpZF90IF9fcGdycCwgaW50IF9fc2lnKSBfX1RIUk9XOworI2VuZGlmIC8qIFVzZSBCU0QgfHwgWC9PcGVuIFVuaXguICAqLworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFJhaXNlIHNpZ25hbCBTSUcsIGkuZS4sIHNlbmQgU0lHIHRvIHlvdXJzZWxmLiAgKi8KK2V4dGVybiBpbnQgcmFpc2UgKGludCBfX3NpZykgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX1NWSUQKKy8qIFNWSUQgbmFtZXMgZm9yIHRoZSBzYW1lIHRoaW5ncy4gICovCitleHRlcm4gX19zaWdoYW5kbGVyX3Qgc3NpZ25hbCAoaW50IF9fc2lnLCBfX3NpZ2hhbmRsZXJfdCBfX2hhbmRsZXIpCisgICAgIF9fVEhST1c7CitleHRlcm4gaW50IGdzaWduYWwgKGludCBfX3NpZykgX19USFJPVzsKKyNlbmRpZiAvKiBVc2UgU1ZJRC4gICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisvKiBQcmludCBhIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgbWVhbmluZyBvZiB0aGUgZ2l2ZW4gc2lnbmFsIG51bWJlci4gICovCitleHRlcm4gdm9pZCBwc2lnbmFsIChpbnQgX19zaWcsIF9fY29uc3QgY2hhciAqX19zKTsKKyNlbmRpZiAvKiBVc2UgbWlzYyBvciBQT1NJWCAyMDA4LiAgKi8KKworI2lmZGVmIF9fVVNFX1hPUEVOMksKKy8qIFByaW50IGEgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBtZWFuaW5nIG9mIHRoZSBnaXZlbiBzaWduYWwgaW5mb3JtYXRpb24uICAqLworZXh0ZXJuIHZvaWQgcHNpZ2luZm8gKF9fY29uc3Qgc2lnaW5mb190ICpfX3BpbmZvLCBfX2NvbnN0IGNoYXIgKl9fcyk7CisjZW5kaWYgLyogUE9TSVggMjAwOC4gICovCisKKworCisvKiBUaGUgYHNpZ3BhdXNlJyBmdW5jdGlvbiBoYXMgdHdvIGRpZmZlcmVudCBpbnRlcmZhY2VzLiAgVGhlIG9yaWdpbmFsCisgICBCU0QgZGVmaW5pdGlvbiBkZWZpbmVzIHRoZSBhcmd1bWVudCBhcyBhIG1hc2sgb2YgdGhlIHNpZ25hbCwgd2hpbGUKKyAgIHRoZSBtb3JlIG1vZGVybiBpbnRlcmZhY2UgaW4gWC9PcGVuIGRlZmluZXMgaXQgYXMgdGhlIHNpZ25hbAorICAgbnVtYmVyLiAgV2UgZ28gd2l0aCB0aGUgQlNEIHZlcnNpb24gdW5sZXNzIHRoZSB1c2VyIGV4cGxpY2l0bHkKKyAgIHNlbGVjdHMgdGhlIFgvT3BlbiB2ZXJzaW9uLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgX19zaWdwYXVzZSAoaW50IF9fc2lnX29yX21hc2ssIGludCBfX2lzX3NpZyk7CisKKyNpZmRlZiBfX0ZBVk9SX0JTRAorLyogU2V0IHRoZSBtYXNrIG9mIGJsb2NrZWQgc2lnbmFscyB0byBNQVNLLAorICAgd2FpdCBmb3IgYSBzaWduYWwgdG8gYXJyaXZlLCBhbmQgdGhlbiByZXN0b3JlIHRoZSBtYXNrLiAgKi8KK2V4dGVybiBpbnQgc2lncGF1c2UgKGludCBfX21hc2spIF9fVEhST1cgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fOworI2Vsc2UKKyMgaWZkZWYgX19VU0VfWE9QRU4KKyMgIGlmZGVmIF9fR05VQ19fCitleHRlcm4gaW50IHNpZ3BhdXNlIChpbnQgX19zaWcpIF9fYXNtX18gKCJfX3hwZ19zaWdwYXVzZSIpOworIyAgZWxzZQorLyogUmVtb3ZlIGEgc2lnbmFsIGZyb20gdGhlIHNpZ25hbCBtYXNrIGFuZCBzdXNwZW5kIHRoZSBwcm9jZXNzLiAgKi8KKyMgICBkZWZpbmUgc2lncGF1c2Uoc2lnKSBfX3NpZ3BhdXNlICgoc2lnKSwgMSkKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfQlNECisvKiBOb25lIG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHNob3VsZCBiZSB1c2VkIGFueW1vcmUuICBUaGV5IGFyZSBoZXJlCisgICBvbmx5IGZvciBjb21wYXRpYmlsaXR5LiAgQSBzaW5nbGUgd29yZCAoYGludCcpIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlCisgICBlbm91Z2ggdG8gaG9sZCBhIGNvbXBsZXRlIHNpZ25hbCBtYXNrIGFuZCB0aGVyZWZvcmUgdGhlc2UgZnVuY3Rpb25zCisgICBzaW1wbHkgZG8gbm90IHdvcmsgaW4gbWFueSBzaXR1YXRpb25zLiAgVXNlIGBzaWdwcm9jbWFzaycgaW5zdGVhZC4gICovCisKKy8qIENvbXB1dGUgbWFzayBmb3Igc2lnbmFsIFNJRy4gICovCisjIGRlZmluZSBzaWdtYXNrKHNpZykJX19zaWdtYXNrKHNpZykKKworLyogQmxvY2sgc2lnbmFscyBpbiBNQVNLLCByZXR1cm5pbmcgdGhlIG9sZCBtYXNrLiAgKi8KK2V4dGVybiBpbnQgc2lnYmxvY2sgKGludCBfX21hc2spIF9fVEhST1cgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fOworCisvKiBTZXQgdGhlIG1hc2sgb2YgYmxvY2tlZCBzaWduYWxzIHRvIE1BU0ssIHJldHVybmluZyB0aGUgb2xkIG1hc2suICAqLworZXh0ZXJuIGludCBzaWdzZXRtYXNrIChpbnQgX19tYXNrKSBfX1RIUk9XIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXzsKKworLyogUmV0dXJuIGN1cnJlbnRseSBzZWxlY3RlZCBzaWduYWwgbWFzay4gICovCitleHRlcm4gaW50IHNpZ2dldG1hc2sgKHZvaWQpIF9fVEhST1cgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fOworI2VuZGlmIC8qIFVzZSBCU0QuICAqLworCisKKyNpZmRlZiBfX1VTRV9NSVNDCisjIGRlZmluZSBOU0lHCV9OU0lHCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQordHlwZWRlZiBfX3NpZ2hhbmRsZXJfdCBzaWdoYW5kbGVyX3Q7CisjZW5kaWYKKworLyogNC40IEJTRCB1c2VzIHRoZSBuYW1lIGBzaWdfdCcgZm9yIHRoaXMuICAqLworI2lmZGVmIF9fVVNFX0JTRAordHlwZWRlZiBfX3NpZ2hhbmRsZXJfdCBzaWdfdDsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfUE9TSVgKKworLyogQ2xlYXIgYWxsIHNpZ25hbHMgZnJvbSBTRVQuICAqLworZXh0ZXJuIGludCBzaWdlbXB0eXNldCAoc2lnc2V0X3QgKl9fc2V0KSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogU2V0IGFsbCBzaWduYWxzIGluIFNFVC4gICovCitleHRlcm4gaW50IHNpZ2ZpbGxzZXQgKHNpZ3NldF90ICpfX3NldCkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIEFkZCBTSUdOTyB0byBTRVQuICAqLworZXh0ZXJuIGludCBzaWdhZGRzZXQgKHNpZ3NldF90ICpfX3NldCwgaW50IF9fc2lnbm8pIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBSZW1vdmUgU0lHTk8gZnJvbSBTRVQuICAqLworZXh0ZXJuIGludCBzaWdkZWxzZXQgKHNpZ3NldF90ICpfX3NldCwgaW50IF9fc2lnbm8pIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBSZXR1cm4gMSBpZiBTSUdOTyBpcyBpbiBTRVQsIDAgaWYgbm90LiAgKi8KK2V4dGVybiBpbnQgc2lnaXNtZW1iZXIgKF9fY29uc3Qgc2lnc2V0X3QgKl9fc2V0LCBpbnQgX19zaWdubykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyMgaWZkZWYgX19VU0VfR05VCisvKiBSZXR1cm4gbm9uLWVtcHR5IHZhbHVlIGlzIFNFVCBpcyBub3QgZW1wdHkuICAqLworZXh0ZXJuIGludCBzaWdpc2VtcHR5c2V0IChfX2NvbnN0IHNpZ3NldF90ICpfX3NldCkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIEJ1aWxkIG5ldyBzaWduYWwgc2V0IGJ5IGNvbWJpbmluZyB0aGUgdHdvIGlucHV0cyBzZXQgdXNpbmcgbG9naWNhbCBBTkQuICAqLworZXh0ZXJuIGludCBzaWdhbmRzZXQgKHNpZ3NldF90ICpfX3NldCwgX19jb25zdCBzaWdzZXRfdCAqX19sZWZ0LAorCQkgICAgICBfX2NvbnN0IHNpZ3NldF90ICpfX3JpZ2h0KSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIsIDMpKTsKKworLyogQnVpbGQgbmV3IHNpZ25hbCBzZXQgYnkgY29tYmluaW5nIHRoZSB0d28gaW5wdXRzIHNldCB1c2luZyBsb2dpY2FsIE9SLiAgKi8KK2V4dGVybiBpbnQgc2lnb3JzZXQgKHNpZ3NldF90ICpfX3NldCwgX19jb25zdCBzaWdzZXRfdCAqX19sZWZ0LAorCQkgICAgIF9fY29uc3Qgc2lnc2V0X3QgKl9fcmlnaHQpIF9fVEhST1cgX19ub25udWxsICgoMSwgMiwgMykpOworIyBlbmRpZiAvKiBHTlUgKi8KKworLyogR2V0IHRoZSBzeXN0ZW0tc3BlY2lmaWMgZGVmaW5pdGlvbnMgb2YgYHN0cnVjdCBzaWdhY3Rpb24nCisgICBhbmQgdGhlIGBTQV8qJyBhbmQgYFNJR18qJy4gY29uc3RhbnRzLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy9zaWdhY3Rpb24uaD4KKworLyogR2V0IGFuZC9vciBjaGFuZ2UgdGhlIHNldCBvZiBibG9ja2VkIHNpZ25hbHMuICAqLworZXh0ZXJuIGludCBzaWdwcm9jbWFzayAoaW50IF9faG93LCBfX2NvbnN0IHNpZ3NldF90ICpfX3Jlc3RyaWN0IF9fc2V0LAorCQkJc2lnc2V0X3QgKl9fcmVzdHJpY3QgX19vc2V0KSBfX1RIUk9XOworCisvKiBDaGFuZ2UgdGhlIHNldCBvZiBibG9ja2VkIHNpZ25hbHMgdG8gU0VULAorICAgd2FpdCB1bnRpbCBhIHNpZ25hbCBhcnJpdmVzLCBhbmQgcmVzdG9yZSB0aGUgc2V0IG9mIGJsb2NrZWQgc2lnbmFscy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHNpZ3N1c3BlbmQgKF9fY29uc3Qgc2lnc2V0X3QgKl9fc2V0KSBfX25vbm51bGwgKCgxKSk7CisKKy8qIEdldCBhbmQvb3Igc2V0IHRoZSBhY3Rpb24gZm9yIHNpZ25hbCBTSUcuICAqLworZXh0ZXJuIGludCBzaWdhY3Rpb24gKGludCBfX3NpZywgX19jb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICpfX3Jlc3RyaWN0IF9fYWN0LAorCQkgICAgICBzdHJ1Y3Qgc2lnYWN0aW9uICpfX3Jlc3RyaWN0IF9fb2FjdCkgX19USFJPVzsKKworLyogUHV0IGluIFNFVCBhbGwgc2lnbmFscyB0aGF0IGFyZSBibG9ja2VkIGFuZCB3YWl0aW5nIHRvIGJlIGRlbGl2ZXJlZC4gICovCitleHRlcm4gaW50IHNpZ3BlbmRpbmcgKHNpZ3NldF90ICpfX3NldCkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKworLyogU2VsZWN0IGFueSBvZiBwZW5kaW5nIHNpZ25hbHMgZnJvbSBTRVQgb3Igd2FpdCBmb3IgYW55IHRvIGFycml2ZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHNpZ3dhaXQgKF9fY29uc3Qgc2lnc2V0X3QgKl9fcmVzdHJpY3QgX19zZXQsIGludCAqX19yZXN0cmljdCBfX3NpZykKKyAgICAgX19ub25udWxsICgoMSwgMikpOworCisjIGlmZGVmIF9fVVNFX1BPU0lYMTk5MzA5CisvKiBTZWxlY3QgYW55IG9mIHBlbmRpbmcgc2lnbmFscyBmcm9tIFNFVCBhbmQgcGxhY2UgaW5mb3JtYXRpb24gaW4gSU5GTy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHNpZ3dhaXRpbmZvIChfX2NvbnN0IHNpZ3NldF90ICpfX3Jlc3RyaWN0IF9fc2V0LAorCQkJc2lnaW5mb190ICpfX3Jlc3RyaWN0IF9faW5mbykgX19ub25udWxsICgoMSkpOworCisvKiBTZWxlY3QgYW55IG9mIHBlbmRpbmcgc2lnbmFscyBmcm9tIFNFVCBhbmQgcGxhY2UgaW5mb3JtYXRpb24gaW4gSU5GTy4KKyAgIFdhaXQgdGhlIHRpbWUgc3BlY2lmaWVkIGJ5IFRJTUVPVVQgaWYgbm8gc2lnbmFsIGlzIHBlbmRpbmcuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBzaWd0aW1lZHdhaXQgKF9fY29uc3Qgc2lnc2V0X3QgKl9fcmVzdHJpY3QgX19zZXQsCisJCQkgc2lnaW5mb190ICpfX3Jlc3RyaWN0IF9faW5mbywKKwkJCSBfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX19yZXN0cmljdCBfX3RpbWVvdXQpCisgICAgIF9fbm9ubnVsbCAoKDEpKTsKKworLyogU2VuZCBzaWduYWwgU0lHIHRvIHRoZSBwcm9jZXNzIFBJRC4gIEFzc29jaWF0ZSBkYXRhIGluIFZBTCB3aXRoIHRoZQorICAgc2lnbmFsLiAgKi8KK2V4dGVybiBpbnQgc2lncXVldWUgKF9fcGlkX3QgX19waWQsIGludCBfX3NpZywgX19jb25zdCB1bmlvbiBzaWd2YWwgX192YWwpCisgICAgIF9fVEhST1c7CisjIGVuZGlmCS8qIFVzZSBQT1NJWCAxOTkzMDYuICAqLworCisjZW5kaWYgLyogVXNlIFBPU0lYLiAgKi8KKworI2lmZGVmIF9fVVNFX0JTRAorCisvKiBOYW1lcyBvZiB0aGUgc2lnbmFscy4gIFRoaXMgdmFyaWFibGUgZXhpc3RzIG9ubHkgZm9yIGNvbXBhdGliaWxpdHkuCisgICBVc2UgYHN0cnNpZ25hbCcgaW5zdGVhZCAoc2VlIDxzdHJpbmcuaD4pLiAgKi8KK2V4dGVybiBfX2NvbnN0IGNoYXIgKl9fY29uc3QgX3N5c19zaWdsaXN0W19OU0lHXTsKK2V4dGVybiBfX2NvbnN0IGNoYXIgKl9fY29uc3Qgc3lzX3NpZ2xpc3RbX05TSUddOworCisvKiBTdHJ1Y3R1cmUgcGFzc2VkIHRvIGBzaWd2ZWMnLiAgKi8KK3N0cnVjdCBzaWd2ZWMKKyAgeworICAgIF9fc2lnaGFuZGxlcl90IHN2X2hhbmRsZXI7CS8qIFNpZ25hbCBoYW5kbGVyLiAgKi8KKyAgICBpbnQgc3ZfbWFzazsJCS8qIE1hc2sgb2Ygc2lnbmFscyB0byBiZSBibG9ja2VkLiAgKi8KKworICAgIGludCBzdl9mbGFnczsJCS8qIEZsYWdzIChzZWUgYmVsb3cpLiAgKi8KKyMgZGVmaW5lIHN2X29uc3RhY2sJc3ZfZmxhZ3MgLyogNC4yIEJTRCBjb21wYXRpYmlsaXR5LiAgKi8KKyAgfTsKKworLyogQml0cyBpbiBgc3ZfZmxhZ3MnLiAgKi8KKyMgZGVmaW5lIFNWX09OU1RBQ0sJKDEgPDwgMCkvKiBUYWtlIHRoZSBzaWduYWwgb24gdGhlIHNpZ25hbCBzdGFjay4gICovCisjIGRlZmluZSBTVl9JTlRFUlJVUFQJKDEgPDwgMSkvKiBEbyBub3QgcmVzdGFydCBzeXN0ZW0gY2FsbHMuICAqLworIyBkZWZpbmUgU1ZfUkVTRVRIQU5ECSgxIDw8IDIpLyogUmVzZXQgaGFuZGxlciB0byBTSUdfREZMIG9uIHJlY2VpcHQuICAqLworCisKKy8qIElmIFZFQyBpcyBub24tTlVMTCwgc2V0IHRoZSBoYW5kbGVyIGZvciBTSUcgdG8gdGhlIGBzdl9oYW5kbGVyJyBtZW1iZXIKKyAgIG9mIFZFQy4gIFRoZSBzaWduYWxzIGluIGBzdl9tYXNrJyB3aWxsIGJlIGJsb2NrZWQgd2hpbGUgdGhlIGhhbmRsZXIgcnVucy4KKyAgIElmIHRoZSBTVl9SRVNFVEhBTkQgYml0IGlzIHNldCBpbiBgc3ZfZmxhZ3MnLCB0aGUgaGFuZGxlciBmb3IgU0lHIHdpbGwgYmUKKyAgIHJlc2V0IHRvIFNJR19ERkwgYmVmb3JlIGBzdl9oYW5kbGVyJyBpcyBlbnRlcmVkLiAgSWYgT1ZFQyBpcyBub24tTlVMTCwKKyAgIGl0IGlzIGZpbGxlZCBpbiB3aXRoIHRoZSBvbGQgaW5mb3JtYXRpb24gZm9yIFNJRy4gICovCitleHRlcm4gaW50IHNpZ3ZlYyAoaW50IF9fc2lnLCBfX2NvbnN0IHN0cnVjdCBzaWd2ZWMgKl9fdmVjLAorCQkgICBzdHJ1Y3Qgc2lndmVjICpfX292ZWMpIF9fVEhST1c7CisKKworLyogR2V0IG1hY2hpbmUtZGVwZW5kZW50IGBzdHJ1Y3Qgc2lnY29udGV4dCcgYW5kIHNpZ25hbCBzdWJjb2Rlcy4gICovCisjIGluY2x1ZGUgPGJpdHMvc2lnY29udGV4dC5oPgorCisvKiBSZXN0b3JlIHRoZSBzdGF0ZSBzYXZlZCBpbiBTQ1AuICAqLworZXh0ZXJuIGludCBzaWdyZXR1cm4gKHN0cnVjdCBzaWdjb250ZXh0ICpfX3NjcCkgX19USFJPVzsKKworI2VuZGlmIC8qICB1c2UgQlNELiAgKi8KKworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisjIGRlZmluZSBfX25lZWRfc2l6ZV90CisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBJZiBJTlRFUlJVUFQgaXMgbm9uemVybywgbWFrZSBzaWduYWwgU0lHIGludGVycnVwdCBzeXN0ZW0gY2FsbHMKKyAgIChjYXVzaW5nIHRoZW0gdG8gZmFpbCB3aXRoIEVJTlRSKTsgaWYgSU5URVJSVVBUIGlzIHplcm8sIG1ha2Ugc3lzdGVtCisgICBjYWxscyBiZSByZXN0YXJ0ZWQgYWZ0ZXIgc2lnbmFsIFNJRy4gICovCitleHRlcm4gaW50IHNpZ2ludGVycnVwdCAoaW50IF9fc2lnLCBpbnQgX19pbnRlcnJ1cHQpIF9fVEhST1c7CisKKyMgaW5jbHVkZSA8Yml0cy9zaWdzdGFjay5oPgorIyBpZiBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKy8qIFRoaXMgd2lsbCBkZWZpbmUgYHVjb250ZXh0X3QnIGFuZCBgbWNvbnRleHRfdCcuICAqLworIyAgaW5jbHVkZSA8c3lzL3Vjb250ZXh0Lmg+CisjIGVuZGlmCisKKy8qIFJ1biBzaWduYWxzIGhhbmRsZXJzIG9uIHRoZSBzdGFjayBzcGVjaWZpZWQgYnkgU1MgKGlmIG5vdCBOVUxMKS4KKyAgIElmIE9TUyBpcyBub3QgTlVMTCwgaXQgaXMgZmlsbGVkIGluIHdpdGggdGhlIG9sZCBzaWduYWwgc3RhY2sgc3RhdHVzLgorICAgVGhpcyBpbnRlcmZhY2UgaXMgb2Jzb2xldGUgYW5kIG9uIG1hbnkgcGxhdGZvcm0gbm90IGltcGxlbWVudGVkLiAgKi8KK2V4dGVybiBpbnQgc2lnc3RhY2sgKHN0cnVjdCBzaWdzdGFjayAqX19zcywgc3RydWN0IHNpZ3N0YWNrICpfX29zcykKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9kZXByZWNhdGVkX187CisKKy8qIEFsdGVybmF0ZSBzaWduYWwgaGFuZGxlciBzdGFjayBpbnRlcmZhY2UuCisgICBUaGlzIGludGVyZmFjZSBzaG91bGQgYWx3YXlzIGJlIHByZWZlcnJlZCBvdmVyIGBzaWdzdGFjaycuICAqLworZXh0ZXJuIGludCBzaWdhbHRzdGFjayAoX19jb25zdCBzdHJ1Y3Qgc2lnYWx0c3RhY2sgKl9fcmVzdHJpY3QgX19zcywKKwkJCXN0cnVjdCBzaWdhbHRzdGFjayAqX19yZXN0cmljdCBfX29zcykgX19USFJPVzsKKworI2VuZGlmIC8qIHVzZSBCU0Qgb3IgWC9PcGVuIFVuaXguICAqLworCisjaWZkZWYgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIFNpbXBsaWZpZWQgaW50ZXJmYWNlIGZvciBzaWduYWwgbWFuYWdlbWVudC4gICovCisKKy8qIEFkZCBTSUcgdG8gdGhlIGNhbGxpbmcgcHJvY2Vzcycgc2lnbmFsIG1hc2suICAqLworZXh0ZXJuIGludCBzaWdob2xkIChpbnQgX19zaWcpIF9fVEhST1c7CisKKy8qIFJlbW92ZSBTSUcgZnJvbSB0aGUgY2FsbGluZyBwcm9jZXNzJyBzaWduYWwgbWFzay4gICovCitleHRlcm4gaW50IHNpZ3JlbHNlIChpbnQgX19zaWcpIF9fVEhST1c7CisKKy8qIFNldCB0aGUgZGlzcG9zaXRpb24gb2YgU0lHIHRvIFNJR19JR04uICAqLworZXh0ZXJuIGludCBzaWdpZ25vcmUgKGludCBfX3NpZykgX19USFJPVzsKKworLyogU2V0IHRoZSBkaXNwb3NpdGlvbiBvZiBTSUcuICAqLworZXh0ZXJuIF9fc2lnaGFuZGxlcl90IHNpZ3NldCAoaW50IF9fc2lnLCBfX3NpZ2hhbmRsZXJfdCBfX2Rpc3ApIF9fVEhST1c7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfUE9TSVgxOTk1MDYgfHwgZGVmaW5lZCBfX1VTRV9VTklYOTgKKy8qIFNvbWUgb2YgdGhlIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgc2lnbmFscyBpbiB0aHJlYWRlZCBwcm9ncmFtcyBtdXN0CisgICBiZSBkZWZpbmVkIGhlcmUuICAqLworIyBpbmNsdWRlIDxiaXRzL3B0aHJlYWR0eXBlcy5oPgorIyBpbmNsdWRlIDxiaXRzL3NpZ3RocmVhZC5oPgorI2VuZGlmIC8qIHVzZSBVbml4OTggKi8KKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHVzZWQgaW50ZXJuYWxseSBpbiB0aGUgQyBsaWJyYXJ5IGFuZCBpbgorICAgb3RoZXIgY29kZSB3aGljaCBuZWVkIGRlZXAgaW5zaWdodHMuICAqLworCisvKiBSZXR1cm4gbnVtYmVyIG9mIGF2YWlsYWJsZSByZWFsLXRpbWUgc2lnbmFsIHdpdGggaGlnaGVzdCBwcmlvcml0eS4gICovCitleHRlcm4gaW50IF9fbGliY19jdXJyZW50X3NpZ3J0bWluICh2b2lkKSBfX1RIUk9XOworLyogUmV0dXJuIG51bWJlciBvZiBhdmFpbGFibGUgcmVhbC10aW1lIHNpZ25hbCB3aXRoIGxvd2VzdCBwcmlvcml0eS4gICovCitleHRlcm4gaW50IF9fbGliY19jdXJyZW50X3NpZ3J0bWF4ICh2b2lkKSBfX1RIUk9XOworCisjZW5kaWYgLyogc2lnbmFsLmggICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBub3Qgc2lnbmFsLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc291bmQvYXNlcXVlbmNlci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zb3VuZC9hc2VxdWVuY2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJlNGRhNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc291bmQvYXNlcXVlbmNlci5oCkBAIC0wLDAgKzEsNjE0IEBACisvKgorICogIE1haW4gaGVhZGVyIGZpbGUgZm9yIHRoZSBBTFNBIHNlcXVlbmNlcgorICogIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IGJ5IEZyYW5rIHZhbiBkZSBQb2wgPGZ2ZHBvbEBjb2lsLmRlbW9uLm5sPgorICogICAgICAgICAgICAoYykgMTk5OC0xOTk5IGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKyNpZm5kZWYgX19TT1VORF9BU0VRVUVOQ0VSX0gKKyNkZWZpbmUgX19TT1VORF9BU0VRVUVOQ0VSX0gKKworCisvKiogdmVyc2lvbiBvZiB0aGUgc2VxdWVuY2VyICovCisjZGVmaW5lIFNORFJWX1NFUV9WRVJTSU9OIFNORFJWX1BST1RPQ09MX1ZFUlNJT04gKDEsIDAsIDEpCisKKy8qKgorICogZGVmaW5pdGlvbiBvZiBzZXF1ZW5jZXIgZXZlbnQgdHlwZXMKKyAqLworCisvKiogc3lzdGVtIG1lc3NhZ2VzCisgKiBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9yZXN1bHQKKyAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfU1lTVEVNCQkwCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9SRVNVTFQJCTEKKworLyoqIG5vdGUgbWVzc2FnZXMgKGNoYW5uZWwgc3BlY2lmaWMpCisgKiBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9ub3RlCisgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX05PVEUJCTUKKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX05PVEVPTgkJNgorI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfTk9URU9GRgkJNworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfS0VZUFJFU1MJOAorCQorLyoqIGNvbnRyb2wgbWVzc2FnZXMgKGNoYW5uZWwgc3BlY2lmaWMpCisgKiBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9jdHJsCisgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX0NPTlRST0xMRVIJMTAKKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1BHTUNIQU5HRQkxMQorI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfQ0hBTlBSRVNTCTEyCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9QSVRDSEJFTkQJMTMJLyoqPCBmcm9tIC04MTkyIHRvIDgxOTEgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX0NPTlRST0wxNAkxNAkvKio8IDE0IGJpdCBjb250cm9sbGVyIHZhbHVlICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9OT05SRUdQQVJBTQkxNQkvKio8IDE0IGJpdCBOUlBOIGFkZHJlc3MgKyAxNCBiaXQgdW5zaWduZWQgdmFsdWUgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1JFR1BBUkFNCTE2CS8qKjwgMTQgYml0IFJQTiBhZGRyZXNzICsgMTQgYml0IHVuc2lnbmVkIHZhbHVlICovCisKKy8qKiBzeW5jaHJvbmlzYXRpb24gbWVzc2FnZXMKKyAqIGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2N0cmwKKyAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfU09OR1BPUwkJMjAJLyogU29uZyBQb3NpdGlvbiBQb2ludGVyIHdpdGggTFNCIGFuZCBNU0IgdmFsdWVzICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9TT05HU0VMCQkyMQkvKiBTb25nIFNlbGVjdCB3aXRoIHNvbmcgSUQgbnVtYmVyICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9RRlJBTUUJCTIyCS8qIG1pZGkgdGltZSBjb2RlIHF1YXJ0ZXIgZnJhbWUgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1RJTUVTSUdOCTIzCS8qIFNNRiBUaW1lIFNpZ25hdHVyZSBldmVudCAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfS0VZU0lHTgkJMjQJLyogU01GIEtleSBTaWduYXR1cmUgZXZlbnQgKi8KKwkgICAgICAgIAorLyoqIHRpbWVyIG1lc3NhZ2VzCisgKiBldmVudCBkYXRhIHR5cGUgPSBzbmRfc2VxX2V2X3F1ZXVlX2NvbnRyb2wKKyAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfU1RBUlQJCTMwCS8qIG1pZGkgUmVhbCBUaW1lIFN0YXJ0IG1lc3NhZ2UgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX0NPTlRJTlVFCTMxCS8qIG1pZGkgUmVhbCBUaW1lIENvbnRpbnVlIG1lc3NhZ2UgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1NUT1AJCTMyCS8qIG1pZGkgUmVhbCBUaW1lIFN0b3AgbWVzc2FnZSAqLwkKKyNkZWZpbmUJU05EUlZfU0VRX0VWRU5UX1NFVFBPU19USUNLCTMzCS8qIHNldCB0aWNrIHF1ZXVlIHBvc2l0aW9uICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9TRVRQT1NfVElNRQkzNAkvKiBzZXQgcmVhbHRpbWUgcXVldWUgcG9zaXRpb24gKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1RFTVBPCQkzNQkvKiAoU01GKSBUZW1wbyBldmVudCAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfQ0xPQ0sJCTM2CS8qIG1pZGkgUmVhbCBUaW1lIENsb2NrIG1lc3NhZ2UgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1RJQ0sJCTM3CS8qIG1pZGkgUmVhbCBUaW1lIFRpY2sgbWVzc2FnZSAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfUVVFVUVfU0tFVwkzOAkvKiBza2V3IHF1ZXVlIHRlbXBvICovCisKKy8qKiBvdGhlcnMKKyAqIGV2ZW50IGRhdGEgdHlwZSA9IG5vbmUKKyAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfVFVORV9SRVFVRVNUCTQwCS8qIHR1bmUgcmVxdWVzdCAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfUkVTRVQJCTQxCS8qIHJlc2V0IHRvIHBvd2VyLW9uIHN0YXRlICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9TRU5TSU5HCQk0MgkvKiAiYWN0aXZlIHNlbnNpbmciIGV2ZW50ICovCisKKy8qKiBlY2hvIGJhY2ssIGtlcm5lbCBwcml2YXRlIG1lc3NhZ2VzCisgKiBldmVudCBkYXRhIHR5cGUgPSBhbnkgdHlwZQorICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9FQ0hPCQk1MAkvKiBlY2hvIGV2ZW50ICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9PU1MJCTUxCS8qIE9TUyByYXcgZXZlbnQgKi8KKworLyoqIHN5c3RlbSBzdGF0dXMgbWVzc2FnZXMgKGJyb2FkY2FzdCBmb3Igc3Vic2NyaWJlcnMpCisgKiBldmVudCBkYXRhIHR5cGUgPSBzbmRfc2VxX2FkZHIKKyAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfQ0xJRU5UX1NUQVJUCTYwCS8qIG5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZCAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfQ0xJRU5UX0VYSVQJNjEJLyogY2xpZW50IGhhcyBsZWZ0IHRoZSBzeXN0ZW0gKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX0NMSUVOVF9DSEFOR0UJNjIJLyogY2xpZW50IHN0YXR1cy9pbmZvIGhhcyBjaGFuZ2VkICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9QT1JUX1NUQVJUCTYzCS8qIG5ldyBwb3J0IHdhcyBjcmVhdGVkICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9QT1JUX0VYSVQJNjQJLyogcG9ydCB3YXMgZGVsZXRlZCBmcm9tIHN5c3RlbSAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfUE9SVF9DSEFOR0UJNjUJLyogcG9ydCBzdGF0dXMvaW5mbyBoYXMgY2hhbmdlZCAqLworCisvKiogcG9ydCBjb25uZWN0aW9uIGNoYW5nZXMKKyAqIGV2ZW50IGRhdGEgdHlwZSA9IHNuZF9zZXFfY29ubmVjdAorICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9QT1JUX1NVQlNDUklCRUQJNjYJLyogcG9ydHMgY29ubmVjdGVkICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9QT1JUX1VOU1VCU0NSSUJFRCA2NwkvKiBwb3J0cyBkaXNjb25uZWN0ZWQgKi8KKworLyogNzAtODk6ICBzeW50aGVzaXplciBldmVudHMgLSBvYnNvbGV0ZWQgKi8KKworLyoqIHVzZXItZGVmaW5lZCBldmVudHMgd2l0aCBmaXhlZCBsZW5ndGgKKyAqIGV2ZW50IGRhdGEgdHlwZSA9IGFueQorICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9VU1IwCQk5MAorI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfVVNSMQkJOTEKKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1VTUjIJCTkyCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9VU1IzCQk5MworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfVVNSNAkJOTQKKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1VTUjUJCTk1CisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9VU1I2CQk5NgorI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfVVNSNwkJOTcKKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1VTUjgJCTk4CisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9VU1I5CQk5OQorCisvKiAxMDAtMTE4OiBpbnN0cnVtZW50IGxheWVyIC0gb2Jzb2xldGVkICovCisvKiAxMTktMTI5OiByZXNlcnZlZCAqLworCisvKiAxMzAtMTM5OiB2YXJpYWJsZSBsZW5ndGggZXZlbnRzCisgKiBldmVudCBkYXRhIHR5cGUgPSBzbmRfc2VxX2V2X2V4dAorICogKFNORFJWX1NFUV9FVkVOVF9MRU5HVEhfVkFSSUFCTEUgbXVzdCBiZSBzZXQpCisgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1NZU0VYCQkxMzAJLyogc3lzdGVtIGV4Y2x1c2l2ZSBkYXRhICh2YXJpYWJsZSBsZW5ndGgpICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9CT1VOQ0UJCTEzMQkvKiBlcnJvciBldmVudCAqLworLyogMTMyLTEzNDogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1VTUl9WQVIwCTEzNQorI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfVVNSX1ZBUjEJMTM2CisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9VU1JfVkFSMgkxMzcKKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX1VTUl9WQVIzCTEzOAorI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfVVNSX1ZBUjQJMTM5CisKKy8qIDE1MC0xNTE6IGtlcm5lbCBldmVudHMgd2l0aCBxdW90ZSAtIERPIE5PVCB1c2UgaW4gdXNlciBjbGllbnRzICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9LRVJORUxfRVJST1IJMTUwCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9LRVJORUxfUVVPVEUJMTUxCS8qIG9ic29sZXRlICovCisKKy8qIDE1Mi0xOTE6IHJlc2VydmVkICovCisKKy8qIDE5Mi0yNTQ6IGhhcmR3YXJlIHNwZWNpZmljIGV2ZW50cyAqLworCisvKiAyNTU6IHNwZWNpYWwgZXZlbnQgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX05PTkUJCTI1NQorCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBzbmRfc2VxX2V2ZW50X3R5cGVfdDsKKworLyoqIGV2ZW50IGFkZHJlc3MgKi8KK3N0cnVjdCBzbmRfc2VxX2FkZHIgeworCXVuc2lnbmVkIGNoYXIgY2xpZW50OwkvKio8IENsaWVudCBudW1iZXI6ICAgICAgICAgMC4uMjU1LCAyNTUgPSBicm9hZGNhc3QgdG8gYWxsIGNsaWVudHMgKi8KKwl1bnNpZ25lZCBjaGFyIHBvcnQ7CS8qKjwgUG9ydCB3aXRoaW4gY2xpZW50OiAgICAwLi4yNTUsIDI1NSA9IGJyb2FkY2FzdCB0byBhbGwgcG9ydHMgKi8KK307CisKKy8qKiBwb3J0IGNvbm5lY3Rpb24gKi8KK3N0cnVjdCBzbmRfc2VxX2Nvbm5lY3QgeworCXN0cnVjdCBzbmRfc2VxX2FkZHIgc2VuZGVyOworCXN0cnVjdCBzbmRfc2VxX2FkZHIgZGVzdDsKK307CisKKworI2RlZmluZSBTTkRSVl9TRVFfQUREUkVTU19VTktOT1dOCTI1MwkvKiB1bmtub3duIHNvdXJjZSAqLworI2RlZmluZSBTTkRSVl9TRVFfQUREUkVTU19TVUJTQ1JJQkVSUwkyNTQJLyogc2VuZCBldmVudCB0byBhbGwgc3Vic2NyaWJlZCBwb3J0cyAqLworI2RlZmluZSBTTkRSVl9TRVFfQUREUkVTU19CUk9BRENBU1QJMjU1CS8qIHNlbmQgZXZlbnQgdG8gYWxsIHF1ZXVlcy9jbGllbnRzL3BvcnRzL2NoYW5uZWxzICovCisjZGVmaW5lIFNORFJWX1NFUV9RVUVVRV9ESVJFQ1QJCTI1MwkvKiBkaXJlY3QgZGlzcGF0Y2ggKi8KKworCS8qIGV2ZW50IG1vZGUgZmxhZyAtIE5PVEU6IG9ubHkgOCBiaXRzIGF2YWlsYWJsZSEgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1RJTUVfU1RBTVBfVElDSwkoMDw8MCkgLyogdGltZXN0YW1wIGluIGNsb2NrIHRpY2tzICovCisjZGVmaW5lIFNORFJWX1NFUV9USU1FX1NUQU1QX1JFQUwJKDE8PDApIC8qIHRpbWVzdGFtcCBpbiByZWFsIHRpbWUgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1RJTUVfU1RBTVBfTUFTSwkoMTw8MCkKKworI2RlZmluZSBTTkRSVl9TRVFfVElNRV9NT0RFX0FCUwkJKDA8PDEpCS8qIGFic29sdXRlIHRpbWVzdGFtcCAqLworI2RlZmluZSBTTkRSVl9TRVFfVElNRV9NT0RFX1JFTAkJKDE8PDEpCS8qIHJlbGF0aXZlIHRvIGN1cnJlbnQgdGltZSAqLworI2RlZmluZSBTTkRSVl9TRVFfVElNRV9NT0RFX01BU0sJKDE8PDEpCisKKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX0xFTkdUSF9GSVhFRAkoMDw8MikJLyogZml4ZWQgZXZlbnQgc2l6ZSAqLworI2RlZmluZSBTTkRSVl9TRVFfRVZFTlRfTEVOR1RIX1ZBUklBQkxFCSgxPDwyKQkvKiB2YXJpYWJsZSBldmVudCBzaXplICovCisjZGVmaW5lIFNORFJWX1NFUV9FVkVOVF9MRU5HVEhfVkFSVVNSCSgyPDwyKQkvKiB2YXJpYWJsZSBldmVudCBzaXplIC0gdXNlciBtZW1vcnkgc3BhY2UgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0VWRU5UX0xFTkdUSF9NQVNLCSgzPDwyKQorCisjZGVmaW5lIFNORFJWX1NFUV9QUklPUklUWV9OT1JNQUwJKDA8PDQpCS8qIG5vcm1hbCBwcmlvcml0eSAqLworI2RlZmluZSBTTkRSVl9TRVFfUFJJT1JJVFlfSElHSAkJKDE8PDQpCS8qIGV2ZW50IHNob3VsZCBiZSBwcm9jZXNzZWQgYmVmb3JlIG90aGVycyAqLworI2RlZmluZSBTTkRSVl9TRVFfUFJJT1JJVFlfTUFTSwkJKDE8PDQpCisKKworCS8qIG5vdGUgZXZlbnQgKi8KK3N0cnVjdCBzbmRfc2VxX2V2X25vdGUgeworCXVuc2lnbmVkIGNoYXIgY2hhbm5lbDsKKwl1bnNpZ25lZCBjaGFyIG5vdGU7CisJdW5zaWduZWQgY2hhciB2ZWxvY2l0eTsKKwl1bnNpZ25lZCBjaGFyIG9mZl92ZWxvY2l0eTsJLyogb25seSBmb3IgU05EUlZfU0VRX0VWRU5UX05PVEUgKi8KKwl1bnNpZ25lZCBpbnQgZHVyYXRpb247CQkvKiBvbmx5IGZvciBTTkRSVl9TRVFfRVZFTlRfTk9URSAqLworfTsKKworCS8qIGNvbnRyb2xsZXIgZXZlbnQgKi8KK3N0cnVjdCBzbmRfc2VxX2V2X2N0cmwgeworCXVuc2lnbmVkIGNoYXIgY2hhbm5lbDsKKwl1bnNpZ25lZCBjaGFyIHVudXNlZDEsIHVudXNlZDIsIHVudXNlZDM7CS8qIHBhZCAqLworCXVuc2lnbmVkIGludCBwYXJhbTsKKwlzaWduZWQgaW50IHZhbHVlOworfTsKKworCS8qIGdlbmVyaWMgc2V0IG9mIGJ5dGVzICgxMng4IGJpdCkgKi8KK3N0cnVjdCBzbmRfc2VxX2V2X3JhdzggeworCXVuc2lnbmVkIGNoYXIgZFsxMl07CS8qIDggYml0IHZhbHVlICovCit9OworCisJLyogZ2VuZXJpYyBzZXQgb2YgaW50ZWdlcnMgKDN4MzIgYml0KSAqLworc3RydWN0IHNuZF9zZXFfZXZfcmF3MzIgeworCXVuc2lnbmVkIGludCBkWzNdOwkvKiAzMiBiaXQgdmFsdWUgKi8KK307CisKKwkvKiBleHRlcm5hbCBzdG9yZWQgZGF0YSAqLworc3RydWN0IHNuZF9zZXFfZXZfZXh0IHsKKwl1bnNpZ25lZCBpbnQgbGVuOwkvKiBsZW5ndGggb2YgZGF0YSAqLworCXZvaWQgKnB0cjsJCS8qIHBvaW50ZXIgdG8gZGF0YSAobm90ZTogbWF5YmUgNjQtYml0KSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNuZF9zZXFfcmVzdWx0IHsKKwlpbnQgZXZlbnQ7CQkvKiBwcm9jZXNzZWQgZXZlbnQgdHlwZSAqLworCWludCByZXN1bHQ7Cit9OworCisKK3N0cnVjdCBzbmRfc2VxX3JlYWxfdGltZSB7CisJdW5zaWduZWQgaW50IHR2X3NlYzsJLyogc2Vjb25kcyAqLworCXVuc2lnbmVkIGludCB0dl9uc2VjOwkvKiBuYW5vc2Vjb25kcyAqLworfTsKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgc25kX3NlcV90aWNrX3RpbWVfdDsJLyogbWlkaSB0aWNrcyAqLworCit1bmlvbiBzbmRfc2VxX3RpbWVzdGFtcCB7CisJc25kX3NlcV90aWNrX3RpbWVfdCB0aWNrOworCXN0cnVjdCBzbmRfc2VxX3JlYWxfdGltZSB0aW1lOworfTsKKworc3RydWN0IHNuZF9zZXFfcXVldWVfc2tldyB7CisJdW5zaWduZWQgaW50IHZhbHVlOworCXVuc2lnbmVkIGludCBiYXNlOworfTsKKworCS8qIHF1ZXVlIHRpbWVyIGNvbnRyb2wgKi8KK3N0cnVjdCBzbmRfc2VxX2V2X3F1ZXVlX2NvbnRyb2wgeworCXVuc2lnbmVkIGNoYXIgcXVldWU7CQkJLyogYWZmZWN0ZWQgcXVldWUgKi8KKwl1bnNpZ25lZCBjaGFyIHBhZFszXTsJCQkvKiByZXNlcnZlZCAqLworCXVuaW9uIHsKKwkJc2lnbmVkIGludCB2YWx1ZTsJCS8qIGFmZmVjdGVkIHZhbHVlIChlLmcuIHRlbXBvKSAqLworCQl1bmlvbiBzbmRfc2VxX3RpbWVzdGFtcCB0aW1lOwkvKiB0aW1lICovCisJCXVuc2lnbmVkIGludCBwb3NpdGlvbjsJCS8qIHN5bmMgcG9zaXRpb24gKi8KKwkJc3RydWN0IHNuZF9zZXFfcXVldWVfc2tldyBza2V3OworCQl1bnNpZ25lZCBpbnQgZDMyWzJdOworCQl1bnNpZ25lZCBjaGFyIGQ4WzhdOworCX0gcGFyYW07Cit9OworCisJLyogcXVvdGVkIGV2ZW50IC0gaW5zaWRlIHRoZSBrZXJuZWwgb25seSAqLworc3RydWN0IHNuZF9zZXFfZXZfcXVvdGUgeworCXN0cnVjdCBzbmRfc2VxX2FkZHIgb3JpZ2luOwkJLyogb3JpZ2luYWwgc2VuZGVyICovCisJdW5zaWduZWQgc2hvcnQgdmFsdWU7CQkvKiBvcHRpb25hbCBkYXRhICovCisJc3RydWN0IHNuZF9zZXFfZXZlbnQgKmV2ZW50OwkJLyogcXVvdGVkIGV2ZW50ICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKwkvKiBzZXF1ZW5jZXIgZXZlbnQgKi8KK3N0cnVjdCBzbmRfc2VxX2V2ZW50IHsKKwlzbmRfc2VxX2V2ZW50X3R5cGVfdCB0eXBlOwkvKiBldmVudCB0eXBlICovCisJdW5zaWduZWQgY2hhciBmbGFnczsJCS8qIGV2ZW50IGZsYWdzICovCisJY2hhciB0YWc7CisJCisJdW5zaWduZWQgY2hhciBxdWV1ZTsJCS8qIHNjaGVkdWxlIHF1ZXVlICovCisJdW5pb24gc25kX3NlcV90aW1lc3RhbXAgdGltZTsJLyogc2NoZWR1bGUgdGltZSAqLworCisKKwlzdHJ1Y3Qgc25kX3NlcV9hZGRyIHNvdXJjZTsJLyogc291cmNlIGFkZHJlc3MgKi8KKwlzdHJ1Y3Qgc25kX3NlcV9hZGRyIGRlc3Q7CS8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKworCXVuaW9uIHsJCQkJLyogZXZlbnQgZGF0YS4uLiAqLworCQlzdHJ1Y3Qgc25kX3NlcV9ldl9ub3RlIG5vdGU7CisJCXN0cnVjdCBzbmRfc2VxX2V2X2N0cmwgY29udHJvbDsKKwkJc3RydWN0IHNuZF9zZXFfZXZfcmF3OCByYXc4OworCQlzdHJ1Y3Qgc25kX3NlcV9ldl9yYXczMiByYXczMjsKKwkJc3RydWN0IHNuZF9zZXFfZXZfZXh0IGV4dDsKKwkJc3RydWN0IHNuZF9zZXFfZXZfcXVldWVfY29udHJvbCBxdWV1ZTsKKwkJdW5pb24gc25kX3NlcV90aW1lc3RhbXAgdGltZTsKKwkJc3RydWN0IHNuZF9zZXFfYWRkciBhZGRyOworCQlzdHJ1Y3Qgc25kX3NlcV9jb25uZWN0IGNvbm5lY3Q7CisJCXN0cnVjdCBzbmRfc2VxX3Jlc3VsdCByZXN1bHQ7CisJCXN0cnVjdCBzbmRfc2VxX2V2X3F1b3RlIHF1b3RlOworCX0gZGF0YTsKK307CisKKworLyoKKyAqIGJvdW5jZSBldmVudCAtIHN0b3JlZCBhcyB2YXJpYWJsZSBzaXplIGRhdGEKKyAqLworc3RydWN0IHNuZF9zZXFfZXZlbnRfYm91bmNlIHsKKwlpbnQgZXJyOworCXN0cnVjdCBzbmRfc2VxX2V2ZW50IGV2ZW50OworCS8qIGV4dGVybmFsIGRhdGEgZm9sbG93cyBoZXJlLiAqLworfTsKKworCisJLyogc3lzdGVtIGluZm9ybWF0aW9uICovCitzdHJ1Y3Qgc25kX3NlcV9zeXN0ZW1faW5mbyB7CisJaW50IHF1ZXVlczsJCQkvKiBtYXhpbXVtIHF1ZXVlcyBjb3VudCAqLworCWludCBjbGllbnRzOwkJCS8qIG1heGltdW0gY2xpZW50cyBjb3VudCAqLworCWludCBwb3J0czsJCQkvKiBtYXhpbXVtIHBvcnRzIHBlciBjbGllbnQgKi8KKwlpbnQgY2hhbm5lbHM7CQkJLyogbWF4aW11bSBjaGFubmVscyBwZXIgcG9ydCAqLworCWludCBjdXJfY2xpZW50czsJCS8qIGN1cnJlbnQgY2xpZW50cyAqLworCWludCBjdXJfcXVldWVzOwkJCS8qIGN1cnJlbnQgcXVldWVzICovCisJY2hhciByZXNlcnZlZFsyNF07Cit9OworCisKKwkvKiBzeXN0ZW0gcnVubmluZyBpbmZvcm1hdGlvbiAqLworc3RydWN0IHNuZF9zZXFfcnVubmluZ19pbmZvIHsKKwl1bnNpZ25lZCBjaGFyIGNsaWVudDsJCS8qIGNsaWVudCBpZCAqLworCXVuc2lnbmVkIGNoYXIgYmlnX2VuZGlhbjsJLyogMSA9IGJpZy1lbmRpYW4gKi8KKwl1bnNpZ25lZCBjaGFyIGNwdV9tb2RlOwkJLyogNCA9IDMyYml0LCA4ID0gNjRiaXQgKi8KKwl1bnNpZ25lZCBjaGFyIHBhZDsJCS8qIHJlc2VydmVkICovCisJdW5zaWduZWQgY2hhciByZXNlcnZlZFsxMl07Cit9OworCisKKwkvKiBrbm93biBjbGllbnQgbnVtYmVycyAqLworI2RlZmluZSBTTkRSVl9TRVFfQ0xJRU5UX1NZU1RFTQkJMAorCS8qIGludGVybmFsIGNsaWVudCBudW1iZXJzICovCisjZGVmaW5lIFNORFJWX1NFUV9DTElFTlRfRFVNTVkJCTE0CS8qIG1pZGkgdGhyb3VnaCAqLworI2RlZmluZSBTTkRSVl9TRVFfQ0xJRU5UX09TUwkJMTUJLyogb3NzIHNlcXVlbmNlciBlbXVsYXRvciAqLworCisKKwkvKiBjbGllbnQgdHlwZXMgKi8KK3R5cGVkZWYgaW50IF9fYml0d2lzZSBzbmRfc2VxX2NsaWVudF90eXBlX3Q7CisjZGVmaW5lCU5PX0NMSUVOVAkoKHNuZF9zZXFfY2xpZW50X3R5cGVfdCkgMCkKKyNkZWZpbmUJVVNFUl9DTElFTlQJKChzbmRfc2VxX2NsaWVudF90eXBlX3QpIDEpCisjZGVmaW5lCUtFUk5FTF9DTElFTlQJKChzbmRfc2VxX2NsaWVudF90eXBlX3QpIDIpCisgICAgICAgICAgICAgICAgICAgICAgICAKKwkvKiBldmVudCBmaWx0ZXIgZmxhZ3MgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0ZJTFRFUl9CUk9BRENBU1QJKDE8PDApCS8qIGFjY2VwdCBicm9hZGNhc3QgbWVzc2FnZXMgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0ZJTFRFUl9NVUxUSUNBU1QJKDE8PDEpCS8qIGFjY2VwdCBtdWx0aWNhc3QgbWVzc2FnZXMgKi8KKyNkZWZpbmUgU05EUlZfU0VRX0ZJTFRFUl9CT1VOQ0UJCSgxPDwyKQkvKiBhY2NlcHQgYm91bmNlIGV2ZW50IGluIGVycm9yICovCisjZGVmaW5lIFNORFJWX1NFUV9GSUxURVJfVVNFX0VWRU5UCSgxPDwzMSkJLyogdXNlIGV2ZW50IGZpbHRlciAqLworCitzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfaW5mbyB7CisJaW50IGNsaWVudDsJCQkvKiBjbGllbnQgbnVtYmVyIHRvIGlucXVpcmUgKi8KKwlzbmRfc2VxX2NsaWVudF90eXBlX3QgdHlwZTsJLyogY2xpZW50IHR5cGUgKi8KKwljaGFyIG5hbWVbNjRdOwkJCS8qIGNsaWVudCBuYW1lICovCisJdW5zaWduZWQgaW50IGZpbHRlcjsJCS8qIGZpbHRlciBmbGFncyAqLworCXVuc2lnbmVkIGNoYXIgbXVsdGljYXN0X2ZpbHRlcls4XTsgLyogbXVsdGljYXN0IGZpbHRlciBiaXRtYXAgKi8KKwl1bnNpZ25lZCBjaGFyIGV2ZW50X2ZpbHRlclszMl07CS8qIGV2ZW50IGZpbHRlciBiaXRtYXAgKi8KKwlpbnQgbnVtX3BvcnRzOwkJCS8qIFJPOiBudW1iZXIgb2YgcG9ydHMgKi8KKwlpbnQgZXZlbnRfbG9zdDsJCQkvKiBudW1iZXIgb2YgbG9zdCBldmVudHMgKi8KKwljaGFyIHJlc2VydmVkWzY0XTsJCS8qIGZvciBmdXR1cmUgdXNlICovCit9OworCisKKy8qIGNsaWVudCBwb29sIHNpemUgKi8KK3N0cnVjdCBzbmRfc2VxX2NsaWVudF9wb29sIHsKKwlpbnQgY2xpZW50OwkJCS8qIGNsaWVudCBudW1iZXIgdG8gaW5xdWlyZSAqLworCWludCBvdXRwdXRfcG9vbDsJCS8qIG91dGdvaW5nICh3cml0ZSkgcG9vbCBzaXplICovCisJaW50IGlucHV0X3Bvb2w7CQkJLyogaW5jb21pbmcgKHJlYWQpIHBvb2wgc2l6ZSAqLworCWludCBvdXRwdXRfcm9vbTsJCS8qIG1pbmltdW0gZnJlZSBwb29sIHNpemUgZm9yIHNlbGVjdC9ibG9ja2luZyBtb2RlICovCisJaW50IG91dHB1dF9mcmVlOwkJLyogdW51c2VkIHNpemUgKi8KKwlpbnQgaW5wdXRfZnJlZTsJCQkvKiB1bnVzZWQgc2l6ZSAqLworCWNoYXIgcmVzZXJ2ZWRbNjRdOworfTsKKworCisvKiBSZW1vdmUgZXZlbnRzIGJ5IHNwZWNpZmllZCBjcml0ZXJpYSAqLworCisjZGVmaW5lIFNORFJWX1NFUV9SRU1PVkVfSU5QVVQJCSgxPDwwKQkvKiBGbHVzaCBpbnB1dCBxdWV1ZXMgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1JFTU9WRV9PVVRQVVQJCSgxPDwxKQkvKiBGbHVzaCBvdXRwdXQgcXVldWVzICovCisjZGVmaW5lIFNORFJWX1NFUV9SRU1PVkVfREVTVAkJKDE8PDIpCS8qIFJlc3RyaWN0IGJ5IGRlc3RpbmF0aW9uIHE6Y2xpZW50OnBvcnQgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1JFTU9WRV9ERVNUX0NIQU5ORUwJKDE8PDMpCS8qIFJlc3RyaWN0IGJ5IGNoYW5uZWwgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1JFTU9WRV9USU1FX0JFRk9SRQkoMTw8NCkJLyogUmVzdHJpY3QgdG8gYmVmb3JlIHRpbWUgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1JFTU9WRV9USU1FX0FGVEVSCSgxPDw1KQkvKiBSZXN0cmljdCB0byB0aW1lIG9yIGFmdGVyICovCisjZGVmaW5lIFNORFJWX1NFUV9SRU1PVkVfVElNRV9USUNLCSgxPDw2KQkvKiBUaW1lIGlzIGluIHRpY2tzICovCisjZGVmaW5lIFNORFJWX1NFUV9SRU1PVkVfRVZFTlRfVFlQRQkoMTw8NykJLyogUmVzdHJpY3QgdG8gZXZlbnQgdHlwZSAqLworI2RlZmluZSBTTkRSVl9TRVFfUkVNT1ZFX0lHTk9SRV9PRkYgCSgxPDw4KQkvKiBEbyBub3QgZmx1c2ggb2ZmIGV2ZW50cyAqLworI2RlZmluZSBTTkRSVl9TRVFfUkVNT1ZFX1RBR19NQVRDSCAJKDE8PDkpCS8qIFJlc3RyaWN0IHRvIGV2ZW50cyB3aXRoIGdpdmVuIHRhZyAqLworCitzdHJ1Y3Qgc25kX3NlcV9yZW1vdmVfZXZlbnRzIHsKKwl1bnNpZ25lZCBpbnQgIHJlbW92ZV9tb2RlOwkvKiBGbGFncyB0aGF0IGRldGVybWluZSB3aGF0IGdldHMgcmVtb3ZlZCAqLworCisJdW5pb24gc25kX3NlcV90aW1lc3RhbXAgdGltZTsKKworCXVuc2lnbmVkIGNoYXIgcXVldWU7CS8qIFF1ZXVlIGZvciBSRU1PVkVfREVTVCAqLworCXN0cnVjdCBzbmRfc2VxX2FkZHIgZGVzdDsJLyogQWRkcmVzcyBmb3IgUkVNT1ZFX0RFU1QgKi8KKwl1bnNpZ25lZCBjaGFyIGNoYW5uZWw7CS8qIENoYW5uZWwgZm9yIFJFTU9WRV9ERVNUICovCisKKwlpbnQgIHR5cGU7CS8qIEZvciBSRU1PVkVfRVZFTlRfVFlQRSAqLworCWNoYXIgIHRhZzsJLyogVGFnIGZvciBSRU1PVkVfVEFHICovCisKKwlpbnQgIHJlc2VydmVkWzEwXTsJLyogVG8gYWxsb3cgZm9yIGZ1dHVyZSBiaW5hcnkgY29tcGF0aWJpbGl0eSAqLworCit9OworCisKKwkvKiBrbm93biBwb3J0IG51bWJlcnMgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfU1lTVEVNX1RJTUVSCTAKKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfU1lTVEVNX0FOTk9VTkNFCTEKKworCS8qIHBvcnQgY2FwYWJpbGl0aWVzICgzMiBiaXRzKSAqLworI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9DQVBfUkVBRAkJKDE8PDApCS8qIHJlYWRhYmxlIGZyb20gdGhpcyBwb3J0ICovCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX0NBUF9XUklURQkoMTw8MSkJLyogd3JpdGFibGUgdG8gdGhpcyBwb3J0ICovCisKKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfQ0FQX1NZTkNfUkVBRAkoMTw8MikKKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfQ0FQX1NZTkNfV1JJVEUJKDE8PDMpCisKKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfQ0FQX0RVUExFWAkoMTw8NCkKKworI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9DQVBfU1VCU19SRUFECSgxPDw1KQkvKiBhbGxvdyByZWFkIHN1YnNjcmlwdGlvbiAqLworI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9DQVBfU1VCU19XUklURQkoMTw8NikJLyogYWxsb3cgd3JpdGUgc3Vic2NyaXB0aW9uICovCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX0NBUF9OT19FWFBPUlQJKDE8PDcpCS8qIHJvdXRpbmcgbm90IGFsbG93ZWQgKi8KKworCS8qIHBvcnQgdHlwZSAqLworI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9UWVBFX1NQRUNJRklDCSgxPDwwKQkvKiBoYXJkd2FyZSBzcGVjaWZpYyAqLworI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9UWVBFX01JRElfR0VORVJJQyAoMTw8MSkJLyogZ2VuZXJpYyBNSURJIGRldmljZSAqLworI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9UWVBFX01JRElfR00JKDE8PDIpCS8qIEdlbmVyYWwgTUlESSBjb21wYXRpYmxlIGRldmljZSAqLworI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9UWVBFX01JRElfR1MJKDE8PDMpCS8qIEdTIGNvbXBhdGlibGUgZGV2aWNlICovCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX1RZUEVfTUlESV9YRwkoMTw8NCkJLyogWEcgY29tcGF0aWJsZSBkZXZpY2UgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfVFlQRV9NSURJX01UMzIJKDE8PDUpCS8qIE1ULTMyIGNvbXBhdGlibGUgZGV2aWNlICovCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX1RZUEVfTUlESV9HTTIJKDE8PDYpCS8qIEdlbmVyYWwgTUlESSAyIGNvbXBhdGlibGUgZGV2aWNlICovCisKKy8qIG90aGVyIHN0YW5kYXJkcy4uLiovCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX1RZUEVfU1lOVEgJKDE8PDEwKQkvKiBTeW50aCBkZXZpY2UgKG5vIE1JREkgY29tcGF0aWJsZSAtIGRpcmVjdCB3YXZldGFibGUpICovCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX1RZUEVfRElSRUNUX1NBTVBMRSAoMTw8MTEpCS8qIFNhbXBsaW5nIGRldmljZSAoc3VwcG9ydCBzYW1wbGUgZG93bmxvYWQpICovCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX1RZUEVfU0FNUExFCSgxPDwxMikJLyogU2FtcGxpbmcgZGV2aWNlIChzYW1wbGUgY2FuIGJlIGRvd25sb2FkZWQgYXQgYW55IHRpbWUpICovCisvKi4uLiovCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX1RZUEVfSEFSRFdBUkUJKDE8PDE2KQkvKiBkcml2ZXIgZm9yIGEgaGFyZHdhcmUgZGV2aWNlICovCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX1RZUEVfU09GVFdBUkUJKDE8PDE3KQkvKiBpbXBsZW1lbnRlZCBpbiBzb2Z0d2FyZSAqLworI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9UWVBFX1NZTlRIRVNJWkVSCSgxPDwxOCkJLyogZ2VuZXJhdGVzIHNvdW5kICovCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX1RZUEVfUE9SVAkoMTw8MTkpCS8qIGNvbm5lY3RzIHRvIG90aGVyIGRldmljZShzKSAqLworI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9UWVBFX0FQUExJQ0FUSU9OCSgxPDwyMCkJLyogYXBwbGljYXRpb24gKHNlcXVlbmNlci9lZGl0b3IpICovCisKKy8qIG1pc2MuIGNvbmRpdGlvbmluZyBmbGFncyAqLworI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9GTEdfR0lWRU5fUE9SVAkoMTw8MCkKKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfRkxHX1RJTUVTVEFNUAkoMTw8MSkKKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfRkxHX1RJTUVfUkVBTAkoMTw8MikKKworc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvIHsKKwlzdHJ1Y3Qgc25kX3NlcV9hZGRyIGFkZHI7CS8qIGNsaWVudC9wb3J0IG51bWJlcnMgKi8KKwljaGFyIG5hbWVbNjRdOwkJCS8qIHBvcnQgbmFtZSAqLworCisJdW5zaWduZWQgaW50IGNhcGFiaWxpdHk7CS8qIHBvcnQgY2FwYWJpbGl0eSBiaXRzICovCisJdW5zaWduZWQgaW50IHR5cGU7CQkvKiBwb3J0IHR5cGUgYml0cyAqLworCWludCBtaWRpX2NoYW5uZWxzOwkJLyogY2hhbm5lbHMgcGVyIE1JREkgcG9ydCAqLworCWludCBtaWRpX3ZvaWNlczsJCS8qIHZvaWNlcyBwZXIgTUlESSBwb3J0ICovCisJaW50IHN5bnRoX3ZvaWNlczsJCS8qIHZvaWNlcyBwZXIgU1lOVEggcG9ydCAqLworCisJaW50IHJlYWRfdXNlOwkJCS8qIFIvTzogc3Vic2NyaWJlcnMgZm9yIG91dHB1dCAoZnJvbSB0aGlzIHBvcnQpICovCisJaW50IHdyaXRlX3VzZTsJCQkvKiBSL086IHN1YnNjcmliZXJzIGZvciBpbnB1dCAodG8gdGhpcyBwb3J0KSAqLworCisJdm9pZCAqa2VybmVsOwkJCS8qIHJlc2VydmVkIGZvciBrZXJuZWwgdXNlIChtdXN0IGJlIE5VTEwpICovCisJdW5zaWduZWQgaW50IGZsYWdzOwkJLyogbWlzYy4gY29uZGl0aW9uaW5nICovCisJdW5zaWduZWQgY2hhciB0aW1lX3F1ZXVlOwkvKiBxdWV1ZSAjIGZvciB0aW1lc3RhbXBpbmcgKi8KKwljaGFyIHJlc2VydmVkWzU5XTsJCS8qIGZvciBmdXR1cmUgdXNlICovCit9OworCisKKy8qIHF1ZXVlIGZsYWdzICovCisjZGVmaW5lIFNORFJWX1NFUV9RVUVVRV9GTEdfU1lOQwkoMTw8MCkJLyogc3luYyBlbmFibGVkICovCisKKy8qIHF1ZXVlIGluZm9ybWF0aW9uICovCitzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9pbmZvIHsKKwlpbnQgcXVldWU7CQkvKiBxdWV1ZSBpZCAqLworCisJLyoKKwkgKiAgc2VjdXJpdHkgc2V0dGluZ3MsIG9ubHkgb3duZXIgb2YgdGhpcyBxdWV1ZSBjYW4gc3RhcnQvc3RvcCB0aW1lcgorCSAqICBldGMuIGlmIHRoZSBxdWV1ZSBpcyBsb2NrZWQgZm9yIG90aGVyIGNsaWVudHMKKwkgKi8KKwlpbnQgb3duZXI7CQkvKiBjbGllbnQgaWQgZm9yIG93bmVyIG9mIHRoZSBxdWV1ZSAqLworCXVuc2lnbmVkIGxvY2tlZDoxOwkvKiB0aW1pbmcgcXVldWUgbG9ja2VkIGZvciBvdGhlciBxdWV1ZXMgKi8KKwljaGFyIG5hbWVbNjRdOwkJLyogbmFtZSBvZiB0aGlzIHF1ZXVlICovCisJdW5zaWduZWQgaW50IGZsYWdzOwkvKiBmbGFncyAqLworCWNoYXIgcmVzZXJ2ZWRbNjBdOwkvKiBmb3IgZnV0dXJlIHVzZSAqLworCit9OworCisvKiBxdWV1ZSBpbmZvL3N0YXR1cyAqLworc3RydWN0IHNuZF9zZXFfcXVldWVfc3RhdHVzIHsKKwlpbnQgcXVldWU7CQkJLyogcXVldWUgaWQgKi8KKwlpbnQgZXZlbnRzOwkJCS8qIHJlYWQtb25seSAtIHF1ZXVlIHNpemUgKi8KKwlzbmRfc2VxX3RpY2tfdGltZV90IHRpY2s7CS8qIGN1cnJlbnQgdGljayAqLworCXN0cnVjdCBzbmRfc2VxX3JlYWxfdGltZSB0aW1lOwkvKiBjdXJyZW50IHRpbWUgKi8KKwlpbnQgcnVubmluZzsJCQkvKiBydW5uaW5nIHN0YXRlIG9mIHF1ZXVlICovCisJaW50IGZsYWdzOwkJCS8qIHZhcmlvdXMgZmxhZ3MgKi8KKwljaGFyIHJlc2VydmVkWzY0XTsJCS8qIGZvciB0aGUgZnV0dXJlICovCit9OworCisKKy8qIHF1ZXVlIHRlbXBvICovCitzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV90ZW1wbyB7CisJaW50IHF1ZXVlOwkJCS8qIHNlcXVlbmNlciBxdWV1ZSAqLworCXVuc2lnbmVkIGludCB0ZW1wbzsJCS8qIGN1cnJlbnQgdGVtcG8sIHVzL3RpY2sgKi8KKwlpbnQgcHBxOwkJCS8qIHRpbWUgcmVzb2x1dGlvbiwgdGlja3MvcXVhcnRlciAqLworCXVuc2lnbmVkIGludCBza2V3X3ZhbHVlOwkvKiBxdWV1ZSBza2V3ICovCisJdW5zaWduZWQgaW50IHNrZXdfYmFzZTsJCS8qIHF1ZXVlIHNrZXcgYmFzZSAqLworCWNoYXIgcmVzZXJ2ZWRbMjRdOwkJLyogZm9yIHRoZSBmdXR1cmUgKi8KK307CisKKworLyogc2VxdWVuY2VyIHRpbWVyIHNvdXJjZXMgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1RJTUVSX0FMU0EJCTAJLyogQUxTQSB0aW1lciAqLworI2RlZmluZSBTTkRSVl9TRVFfVElNRVJfTUlESV9DTE9DSwkxCS8qIE1pZGkgQ2xvY2sgKENMT0NLIGV2ZW50KSAqLworI2RlZmluZSBTTkRSVl9TRVFfVElNRVJfTUlESV9USUNLCTIJLyogTWlkaSBUaW1lciBUaWNrIChUSUNLIGV2ZW50KSAqLworCisvKiBxdWV1ZSB0aW1lciBpbmZvICovCitzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV90aW1lciB7CisJaW50IHF1ZXVlOwkJCS8qIHNlcXVlbmNlciBxdWV1ZSAqLworCWludCB0eXBlOwkJCS8qIHNvdXJjZSB0aW1lciB0eXBlICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHNuZF90aW1lcl9pZCBpZDsJLyogQUxTQSdzIHRpbWVyIElEICovCisJCQl1bnNpZ25lZCBpbnQgcmVzb2x1dGlvbjsJLyogcmVzb2x1dGlvbiBpbiBIeiAqLworCQl9IGFsc2E7CisJfSB1OworCWNoYXIgcmVzZXJ2ZWRbNjRdOwkJLyogZm9yIHRoZSBmdXR1cmUgdXNlICovCit9OworCisKK3N0cnVjdCBzbmRfc2VxX3F1ZXVlX2NsaWVudCB7CisJaW50IHF1ZXVlOwkJLyogc2VxdWVuY2VyIHF1ZXVlICovCisJaW50IGNsaWVudDsJCS8qIHNlcXVlbmNlciBjbGllbnQgKi8KKwlpbnQgdXNlZDsJCS8qIHF1ZXVlIGlzIHVzZWQgd2l0aCB0aGlzIGNsaWVudAorCQkJCSAgIChtdXN0IGJlIHNldCBmb3IgYWNjZXB0aW5nIGV2ZW50cykgKi8KKwkvKiBwZXIgY2xpZW50IHdhdGVybWFya3MgKi8KKwljaGFyIHJlc2VydmVkWzY0XTsJLyogZm9yIGZ1dHVyZSB1c2UgKi8KK307CisKKworI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9TVUJTX0VYQ0xVU0lWRQkoMTw8MCkJLyogZXhjbHVzaXZlIGNvbm5lY3Rpb24gKi8KKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfU1VCU19USU1FU1RBTVAJKDE8PDEpCisjZGVmaW5lIFNORFJWX1NFUV9QT1JUX1NVQlNfVElNRV9SRUFMCSgxPDwyKQorCitzdHJ1Y3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZSB7CisJc3RydWN0IHNuZF9zZXFfYWRkciBzZW5kZXI7CS8qIHNlbmRlciBhZGRyZXNzICovCisJc3RydWN0IHNuZF9zZXFfYWRkciBkZXN0OwkvKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IHZvaWNlczsJCS8qIG51bWJlciBvZiB2b2ljZXMgdG8gYmUgYWxsb2NhdGVkICgwID0gZG9uJ3QgY2FyZSkgKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CQkvKiBtb2RlcyAqLworCXVuc2lnbmVkIGNoYXIgcXVldWU7CQkvKiBpbnB1dCB0aW1lLXN0YW1wIHF1ZXVlIChvcHRpb25hbCkgKi8KKwl1bnNpZ25lZCBjaGFyIHBhZFszXTsJCS8qIHJlc2VydmVkICovCisJY2hhciByZXNlcnZlZFs2NF07Cit9OworCisvKiB0eXBlIG9mIHF1ZXJ5IHN1YnNjcmlwdGlvbiAqLworI2RlZmluZSBTTkRSVl9TRVFfUVVFUllfU1VCU19SRUFECTAKKyNkZWZpbmUgU05EUlZfU0VRX1FVRVJZX1NVQlNfV1JJVEUJMQorCitzdHJ1Y3Qgc25kX3NlcV9xdWVyeV9zdWJzIHsKKwlzdHJ1Y3Qgc25kX3NlcV9hZGRyIHJvb3Q7CS8qIGNsaWVudC9wb3J0IGlkIHRvIGJlIHNlYXJjaGVkICovCisJaW50IHR5cGU7CQkvKiBSRUFEIG9yIFdSSVRFICovCisJaW50IGluZGV4OwkJLyogMC4uTi0xICovCisJaW50IG51bV9zdWJzOwkJLyogUi9POiBudW1iZXIgb2Ygc3Vic2NyaXB0aW9ucyBvbiB0aGlzIHBvcnQgKi8KKwlzdHJ1Y3Qgc25kX3NlcV9hZGRyIGFkZHI7CS8qIFIvTzogcmVzdWx0ICovCisJdW5zaWduZWQgY2hhciBxdWV1ZTsJLyogUi9POiByZXN1bHQgKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CS8qIFIvTzogcmVzdWx0ICovCisJY2hhciByZXNlcnZlZFs2NF07CS8qIGZvciBmdXR1cmUgdXNlICovCit9OworCisKKy8qCisgKiAgSU9DVEwgY29tbWFuZHMKKyAqLworCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9QVkVSU0lPTglfSU9SICgnUycsIDB4MDAsIGludCkKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX0NMSUVOVF9JRAlfSU9SICgnUycsIDB4MDEsIGludCkKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX1NZU1RFTV9JTkZPCV9JT1dSKCdTJywgMHgwMiwgc3RydWN0IHNuZF9zZXFfc3lzdGVtX2luZm8pCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9SVU5OSU5HX01PREUJX0lPV1IoJ1MnLCAweDAzLCBzdHJ1Y3Qgc25kX3NlcV9ydW5uaW5nX2luZm8pCisKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX0dFVF9DTElFTlRfSU5GTwlfSU9XUignUycsIDB4MTAsIHN0cnVjdCBzbmRfc2VxX2NsaWVudF9pbmZvKQorI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfU0VUX0NMSUVOVF9JTkZPCV9JT1cgKCdTJywgMHgxMSwgc3RydWN0IHNuZF9zZXFfY2xpZW50X2luZm8pCisKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX0NSRUFURV9QT1JUCV9JT1dSKCdTJywgMHgyMCwgc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvKQorI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfREVMRVRFX1BPUlQJX0lPVyAoJ1MnLCAweDIxLCBzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8pCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9HRVRfUE9SVF9JTkZPCV9JT1dSKCdTJywgMHgyMiwgc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvKQorI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfU0VUX1BPUlRfSU5GTwlfSU9XICgnUycsIDB4MjMsIHN0cnVjdCBzbmRfc2VxX3BvcnRfaW5mbykKKworI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfU1VCU0NSSUJFX1BPUlQJX0lPVyAoJ1MnLCAweDMwLCBzdHJ1Y3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZSkKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX1VOU1VCU0NSSUJFX1BPUlQgX0lPVyAoJ1MnLCAweDMxLCBzdHJ1Y3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZSkKKworI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfQ1JFQVRFX1FVRVVFCV9JT1dSKCdTJywgMHgzMiwgc3RydWN0IHNuZF9zZXFfcXVldWVfaW5mbykKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX0RFTEVURV9RVUVVRQlfSU9XICgnUycsIDB4MzMsIHN0cnVjdCBzbmRfc2VxX3F1ZXVlX2luZm8pCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9HRVRfUVVFVUVfSU5GTwlfSU9XUignUycsIDB4MzQsIHN0cnVjdCBzbmRfc2VxX3F1ZXVlX2luZm8pCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9TRVRfUVVFVUVfSU5GTwlfSU9XUignUycsIDB4MzUsIHN0cnVjdCBzbmRfc2VxX3F1ZXVlX2luZm8pCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9HRVRfTkFNRURfUVVFVUUJX0lPV1IoJ1MnLCAweDM2LCBzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9pbmZvKQorI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfR0VUX1FVRVVFX1NUQVRVUyBfSU9XUignUycsIDB4NDAsIHN0cnVjdCBzbmRfc2VxX3F1ZXVlX3N0YXR1cykKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX0dFVF9RVUVVRV9URU1QTwlfSU9XUignUycsIDB4NDEsIHN0cnVjdCBzbmRfc2VxX3F1ZXVlX3RlbXBvKQorI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfU0VUX1FVRVVFX1RFTVBPCV9JT1cgKCdTJywgMHg0Miwgc3RydWN0IHNuZF9zZXFfcXVldWVfdGVtcG8pCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9HRVRfUVVFVUVfT1dORVIJX0lPV1IoJ1MnLCAweDQzLCBzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9vd25lcikKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX1NFVF9RVUVVRV9PV05FUglfSU9XICgnUycsIDB4NDQsIHN0cnVjdCBzbmRfc2VxX3F1ZXVlX293bmVyKQorI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfR0VUX1FVRVVFX1RJTUVSCV9JT1dSKCdTJywgMHg0NSwgc3RydWN0IHNuZF9zZXFfcXVldWVfdGltZXIpCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9TRVRfUVVFVUVfVElNRVIJX0lPVyAoJ1MnLCAweDQ2LCBzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV90aW1lcikKKy8qIFhYWAorI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfR0VUX1FVRVVFX1NZTkMJX0lPV1IoJ1MnLCAweDUzLCBzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9zeW5jKQorI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfU0VUX1FVRVVFX1NZTkMJX0lPVyAoJ1MnLCAweDU0LCBzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9zeW5jKQorKi8KKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX0dFVF9RVUVVRV9DTElFTlQJX0lPV1IoJ1MnLCAweDQ5LCBzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9jbGllbnQpCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9TRVRfUVVFVUVfQ0xJRU5UCV9JT1cgKCdTJywgMHg0YSwgc3RydWN0IHNuZF9zZXFfcXVldWVfY2xpZW50KQorI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfR0VUX0NMSUVOVF9QT09MCV9JT1dSKCdTJywgMHg0Yiwgc3RydWN0IHNuZF9zZXFfY2xpZW50X3Bvb2wpCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9TRVRfQ0xJRU5UX1BPT0wJX0lPVyAoJ1MnLCAweDRjLCBzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9vbCkKKyNkZWZpbmUgU05EUlZfU0VRX0lPQ1RMX1JFTU9WRV9FVkVOVFMJX0lPVyAoJ1MnLCAweDRlLCBzdHJ1Y3Qgc25kX3NlcV9yZW1vdmVfZXZlbnRzKQorI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfUVVFUllfU1VCUwlfSU9XUignUycsIDB4NGYsIHN0cnVjdCBzbmRfc2VxX3F1ZXJ5X3N1YnMpCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9HRVRfU1VCU0NSSVBUSU9OCV9JT1dSKCdTJywgMHg1MCwgc3RydWN0IHNuZF9zZXFfcG9ydF9zdWJzY3JpYmUpCisjZGVmaW5lIFNORFJWX1NFUV9JT0NUTF9RVUVSWV9ORVhUX0NMSUVOVAlfSU9XUignUycsIDB4NTEsIHN0cnVjdCBzbmRfc2VxX2NsaWVudF9pbmZvKQorI2RlZmluZSBTTkRSVl9TRVFfSU9DVExfUVVFUllfTkVYVF9QT1JUCV9JT1dSKCdTJywgMHg1Miwgc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvKQorCisjZW5kaWYgLyogX19TT1VORF9BU0VRVUVOQ0VSX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc291bmQvYXNvdW5kLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3NvdW5kL2Fzb3VuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZDkzYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3NvdW5kL2Fzb3VuZC5oCkBAIC0wLDAgKzEsOTA0IEBACisvKgorICogIEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZSAtIEFMU0EgLSBEcml2ZXIKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTQtMjAwMyBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX1NPVU5EX0FTT1VORF9ICisjZGVmaW5lIF9fU09VTkRfQVNPVU5EX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKworLyoKKyAqICBwcm90b2NvbCB2ZXJzaW9uCisgKi8KKworI2RlZmluZSBTTkRSVl9QUk9UT0NPTF9WRVJTSU9OKG1ham9yLCBtaW5vciwgc3VibWlub3IpICgoKG1ham9yKTw8MTYpfCgobWlub3IpPDw4KXwoc3VibWlub3IpKQorI2RlZmluZSBTTkRSVl9QUk9UT0NPTF9NQUpPUih2ZXJzaW9uKSAoKCh2ZXJzaW9uKT4+MTYpJjB4ZmZmZikKKyNkZWZpbmUgU05EUlZfUFJPVE9DT0xfTUlOT1IodmVyc2lvbikgKCgodmVyc2lvbik+PjgpJjB4ZmYpCisjZGVmaW5lIFNORFJWX1BST1RPQ09MX01JQ1JPKHZlcnNpb24pICgodmVyc2lvbikmMHhmZikKKyNkZWZpbmUgU05EUlZfUFJPVE9DT0xfSU5DT01QQVRJQkxFKGt2ZXJzaW9uLCB1dmVyc2lvbikgXAorCShTTkRSVl9QUk9UT0NPTF9NQUpPUihrdmVyc2lvbikgIT0gU05EUlZfUFJPVE9DT0xfTUFKT1IodXZlcnNpb24pIHx8IFwKKwkgKFNORFJWX1BST1RPQ09MX01BSk9SKGt2ZXJzaW9uKSA9PSBTTkRSVl9QUk9UT0NPTF9NQUpPUih1dmVyc2lvbikgJiYgXAorCSAgIFNORFJWX1BST1RPQ09MX01JTk9SKGt2ZXJzaW9uKSAhPSBTTkRSVl9QUk9UT0NPTF9NSU5PUih1dmVyc2lvbikpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICBEaWdpdGFsIGF1ZGlvIGludGVyZmFjZQkJCQkJICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IHNuZF9hZXNfaWVjOTU4IHsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1c1syNF07CS8qIEFFUy9JRUM5NTggY2hhbm5lbCBzdGF0dXMgYml0cyAqLworCXVuc2lnbmVkIGNoYXIgc3ViY29kZVsxNDddOwkvKiBBRVMvSUVDOTU4IHN1YmNvZGUgYml0cyAqLworCXVuc2lnbmVkIGNoYXIgcGFkOwkJLyogbm90aGluZyAqLworCXVuc2lnbmVkIGNoYXIgZGlnX3N1YmZyYW1lWzRdOwkvKiBBRVMvSUVDOTU4IHN1YmZyYW1lIGJpdHMgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICBTZWN0aW9uIGZvciBkcml2ZXIgaGFyZHdhcmUgZGVwZW5kZW50IGludGVyZmFjZSAtIC9kZXYvc25kL2h3PyAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTTkRSVl9IV0RFUF9WRVJTSU9OCQlTTkRSVl9QUk9UT0NPTF9WRVJTSU9OKDEsIDAsIDEpCisKK2VudW0geworCVNORFJWX0hXREVQX0lGQUNFX09QTDIgPSAwLAorCVNORFJWX0hXREVQX0lGQUNFX09QTDMsCisJU05EUlZfSFdERVBfSUZBQ0VfT1BMNCwKKwlTTkRSVl9IV0RFUF9JRkFDRV9TQjE2Q1NQLAkvKiBDcmVhdGl2ZSBTaWduYWwgUHJvY2Vzc29yICovCisJU05EUlZfSFdERVBfSUZBQ0VfRU1VMTBLMSwJLyogRlg4MDEwIHByb2Nlc3NvciBpbiBFTVUxMEsxIGNoaXAgKi8KKwlTTkRSVl9IV0RFUF9JRkFDRV9ZU1MyMjUsCS8qIFlhbWFoYSBGWCBwcm9jZXNzb3IgKi8KKwlTTkRSVl9IV0RFUF9JRkFDRV9JQ1MyMTE1LAkvKiBXYXZldGFibGUgc3ludGggKi8KKwlTTkRSVl9IV0RFUF9JRkFDRV9TU0NBUEUsCS8qIEVuc29uaXEgU291bmRTY2FwZSBJU0EgY2FyZCAoTUM2OEVDMDAwKSAqLworCVNORFJWX0hXREVQX0lGQUNFX1ZYLAkJLyogRGlnaWdyYW0gVlggY2FyZHMgKi8KKwlTTkRSVl9IV0RFUF9JRkFDRV9NSVhBUlQsCS8qIERpZ2lncmFtIG1pWGFydCBjYXJkcyAqLworCVNORFJWX0hXREVQX0lGQUNFX1VTWDJZLAkvKiBUYXNjYW0gVVMxMjIsIFVTMjI0ICYgVVM0MjggdXNiICovCisJU05EUlZfSFdERVBfSUZBQ0VfRU1VWF9XQVZFVEFCTEUsIC8qIEVtdVggd2F2ZXRhYmxlICovCQorCVNORFJWX0hXREVQX0lGQUNFX0JMVUVUT09USCwJLyogQmx1ZXRvb3RoIGF1ZGlvICovCisJU05EUlZfSFdERVBfSUZBQ0VfVVNYMllfUENNLAkvKiBUYXNjYW0gVVMxMjIsIFVTMjI0ICYgVVM0MjggcmF3dXNiIHBjbSAqLworCVNORFJWX0hXREVQX0lGQUNFX1BDWEhSLAkvKiBEaWdpZ3JhbSBQQ1hIUiAqLworCVNORFJWX0hXREVQX0lGQUNFX1NCX1JDLAkvKiBTQiBFeHRpZ3kvQXVkaWd5Mk5YIHJlbW90ZSBjb250cm9sICovCisJU05EUlZfSFdERVBfSUZBQ0VfSERBLAkJLyogSEQtYXVkaW8gKi8KKwlTTkRSVl9IV0RFUF9JRkFDRV9VU0JfU1RSRUFNLAkvKiBkaXJlY3QgYWNjZXNzIHRvIHVzYiBzdHJlYW0gKi8KKworCS8qIERvbid0IGZvcmdldCB0byBjaGFuZ2UgdGhlIGZvbGxvd2luZzogKi8KKwlTTkRSVl9IV0RFUF9JRkFDRV9MQVNUID0gU05EUlZfSFdERVBfSUZBQ0VfVVNCX1NUUkVBTQorfTsKKworc3RydWN0IHNuZF9od2RlcF9pbmZvIHsKKwl1bnNpZ25lZCBpbnQgZGV2aWNlOwkJLyogV1I6IGRldmljZSBudW1iZXIgKi8KKwlpbnQgY2FyZDsJCQkvKiBSOiBjYXJkIG51bWJlciAqLworCXVuc2lnbmVkIGNoYXIgaWRbNjRdOwkJLyogSUQgKHVzZXIgc2VsZWN0YWJsZSkgKi8KKwl1bnNpZ25lZCBjaGFyIG5hbWVbODBdOwkJLyogaHdkZXAgbmFtZSAqLworCWludCBpZmFjZTsJCQkvKiBod2RlcCBpbnRlcmZhY2UgKi8KKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzY0XTsJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSAqLworfTsKKworLyogZ2VuZXJpYyBEU1AgbG9hZGVyICovCitzdHJ1Y3Qgc25kX2h3ZGVwX2RzcF9zdGF0dXMgeworCXVuc2lnbmVkIGludCB2ZXJzaW9uOwkJLyogUjogZHJpdmVyLXNwZWNpZmljIHZlcnNpb24gKi8KKwl1bnNpZ25lZCBjaGFyIGlkWzMyXTsJCS8qIFI6IGRyaXZlci1zcGVjaWZpYyBJRCBzdHJpbmcgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2RzcHM7CQkvKiBSOiBudW1iZXIgb2YgRFNQIGltYWdlcyB0byB0cmFuc2ZlciAqLworCXVuc2lnbmVkIGludCBkc3BfbG9hZGVkOwkvKiBSOiBiaXQgZmxhZ3MgaW5kaWNhdGluZyB0aGUgbG9hZGVkIERTUHMgKi8KKwl1bnNpZ25lZCBpbnQgY2hpcF9yZWFkeTsJLyogUjogMSA9IGluaXRpYWxpemF0aW9uIGZpbmlzaGVkICovCisJdW5zaWduZWQgY2hhciByZXNlcnZlZFsxNl07CS8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCit9OworCitzdHJ1Y3Qgc25kX2h3ZGVwX2RzcF9pbWFnZSB7CisJdW5zaWduZWQgaW50IGluZGV4OwkJLyogVzogRFNQIGluZGV4ICovCisJdW5zaWduZWQgY2hhciBuYW1lWzY0XTsJCS8qIFc6IElEIChlLmcuIGZpbGUgbmFtZSkgKi8KKwl1bnNpZ25lZCBjaGFyICppbWFnZTsJLyogVzogYmluYXJ5IGltYWdlICovCisJc2l6ZV90IGxlbmd0aDsJCQkvKiBXOiBzaXplIG9mIGltYWdlIGluIGJ5dGVzICovCisJdW5zaWduZWQgbG9uZyBkcml2ZXJfZGF0YTsJLyogVzogZHJpdmVyLXNwZWNpZmljIGRhdGEgKi8KK307CisKKyNkZWZpbmUgU05EUlZfSFdERVBfSU9DVExfUFZFUlNJT04JX0lPUiAoJ0gnLCAweDAwLCBpbnQpCisjZGVmaW5lIFNORFJWX0hXREVQX0lPQ1RMX0lORk8JCV9JT1IgKCdIJywgMHgwMSwgc3RydWN0IHNuZF9od2RlcF9pbmZvKQorI2RlZmluZSBTTkRSVl9IV0RFUF9JT0NUTF9EU1BfU1RBVFVTCV9JT1IoJ0gnLCAweDAyLCBzdHJ1Y3Qgc25kX2h3ZGVwX2RzcF9zdGF0dXMpCisjZGVmaW5lIFNORFJWX0hXREVQX0lPQ1RMX0RTUF9MT0FECV9JT1coJ0gnLCAweDAzLCBzdHJ1Y3Qgc25kX2h3ZGVwX2RzcF9pbWFnZSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgIERpZ2l0YWwgQXVkaW8gKFBDTSkgaW50ZXJmYWNlIC0gL2Rldi9zbmQvcGNtPz8gICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU05EUlZfUENNX1ZFUlNJT04JCVNORFJWX1BST1RPQ09MX1ZFUlNJT04oMiwgMCwgMTApCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBzbmRfcGNtX3VmcmFtZXNfdDsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgc25kX3BjbV9zZnJhbWVzX3Q7CisKK2VudW0geworCVNORFJWX1BDTV9DTEFTU19HRU5FUklDID0gMCwJLyogc3RhbmRhcmQgbW9ubyBvciBzdGVyZW8gZGV2aWNlICovCisJU05EUlZfUENNX0NMQVNTX01VTFRJLAkJLyogbXVsdGljaGFubmVsIGRldmljZSAqLworCVNORFJWX1BDTV9DTEFTU19NT0RFTSwJCS8qIHNvZnR3YXJlIG1vZGVtIGNsYXNzICovCisJU05EUlZfUENNX0NMQVNTX0RJR0lUSVpFUiwJLyogZGlnaXRpemVyIGNsYXNzICovCisJLyogRG9uJ3QgZm9yZ2V0IHRvIGNoYW5nZSB0aGUgZm9sbG93aW5nOiAqLworCVNORFJWX1BDTV9DTEFTU19MQVNUID0gU05EUlZfUENNX0NMQVNTX0RJR0lUSVpFUiwKK307CisKK2VudW0geworCVNORFJWX1BDTV9TVUJDTEFTU19HRU5FUklDX01JWCA9IDAsIC8qIG1vbm8gb3Igc3RlcmVvIHN1YmRldmljZXMgYXJlIG1peGVkIHRvZ2V0aGVyICovCisJU05EUlZfUENNX1NVQkNMQVNTX01VTFRJX01JWCwJLyogbXVsdGljaGFubmVsIHN1YmRldmljZXMgYXJlIG1peGVkIHRvZ2V0aGVyICovCisJLyogRG9uJ3QgZm9yZ2V0IHRvIGNoYW5nZSB0aGUgZm9sbG93aW5nOiAqLworCVNORFJWX1BDTV9TVUJDTEFTU19MQVNUID0gU05EUlZfUENNX1NVQkNMQVNTX01VTFRJX01JWCwKK307CisKK2VudW0geworCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPSAwLAorCVNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwKKwlTTkRSVl9QQ01fU1RSRUFNX0xBU1QgPSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsCit9OworCit0eXBlZGVmIGludCBfX2JpdHdpc2Ugc25kX3BjbV9hY2Nlc3NfdDsKKyNkZWZpbmUJU05EUlZfUENNX0FDQ0VTU19NTUFQX0lOVEVSTEVBVkVECSgoc25kX3BjbV9hY2Nlc3NfdCkgMCkgLyogaW50ZXJsZWF2ZWQgbW1hcCAqLworI2RlZmluZQlTTkRSVl9QQ01fQUNDRVNTX01NQVBfTk9OSU5URVJMRUFWRUQJKChzbmRfcGNtX2FjY2Vzc190KSAxKSAvKiBub25pbnRlcmxlYXZlZCBtbWFwICovCisjZGVmaW5lCVNORFJWX1BDTV9BQ0NFU1NfTU1BUF9DT01QTEVYCQkoKHNuZF9wY21fYWNjZXNzX3QpIDIpIC8qIGNvbXBsZXggbW1hcCAqLworI2RlZmluZQlTTkRSVl9QQ01fQUNDRVNTX1JXX0lOVEVSTEVBVkVECQkoKHNuZF9wY21fYWNjZXNzX3QpIDMpIC8qIHJlYWRpL3dyaXRlaSAqLworI2RlZmluZQlTTkRSVl9QQ01fQUNDRVNTX1JXX05PTklOVEVSTEVBVkVECSgoc25kX3BjbV9hY2Nlc3NfdCkgNCkgLyogcmVhZG4vd3JpdGVuICovCisjZGVmaW5lCVNORFJWX1BDTV9BQ0NFU1NfTEFTVAkJU05EUlZfUENNX0FDQ0VTU19SV19OT05JTlRFUkxFQVZFRAorCit0eXBlZGVmIGludCBfX2JpdHdpc2Ugc25kX3BjbV9mb3JtYXRfdDsKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9TOAkoKHNuZF9wY21fZm9ybWF0X3QpIDApCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfVTgJKChzbmRfcGNtX2Zvcm1hdF90KSAxKQorI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX1MxNl9MRQkoKHNuZF9wY21fZm9ybWF0X3QpIDIpCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfUzE2X0JFCSgoc25kX3BjbV9mb3JtYXRfdCkgMykKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9VMTZfTEUJKChzbmRfcGNtX2Zvcm1hdF90KSA0KQorI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX1UxNl9CRQkoKHNuZF9wY21fZm9ybWF0X3QpIDUpCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfUzI0X0xFCSgoc25kX3BjbV9mb3JtYXRfdCkgNikgLyogbG93IHRocmVlIGJ5dGVzICovCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfUzI0X0JFCSgoc25kX3BjbV9mb3JtYXRfdCkgNykgLyogbG93IHRocmVlIGJ5dGVzICovCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfVTI0X0xFCSgoc25kX3BjbV9mb3JtYXRfdCkgOCkgLyogbG93IHRocmVlIGJ5dGVzICovCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfVTI0X0JFCSgoc25kX3BjbV9mb3JtYXRfdCkgOSkgLyogbG93IHRocmVlIGJ5dGVzICovCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfUzMyX0xFCSgoc25kX3BjbV9mb3JtYXRfdCkgMTApCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfUzMyX0JFCSgoc25kX3BjbV9mb3JtYXRfdCkgMTEpCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfVTMyX0xFCSgoc25kX3BjbV9mb3JtYXRfdCkgMTIpCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfVTMyX0JFCSgoc25kX3BjbV9mb3JtYXRfdCkgMTMpCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfRkxPQVRfTEUJKChzbmRfcGNtX2Zvcm1hdF90KSAxNCkgLyogNC1ieXRlIGZsb2F0LCBJRUVFLTc1NCAzMi1iaXQsIHJhbmdlIC0xLjAgdG8gMS4wICovCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfRkxPQVRfQkUJKChzbmRfcGNtX2Zvcm1hdF90KSAxNSkgLyogNC1ieXRlIGZsb2F0LCBJRUVFLTc1NCAzMi1iaXQsIHJhbmdlIC0xLjAgdG8gMS4wICovCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfRkxPQVQ2NF9MRQkoKHNuZF9wY21fZm9ybWF0X3QpIDE2KSAvKiA4LWJ5dGUgZmxvYXQsIElFRUUtNzU0IDY0LWJpdCwgcmFuZ2UgLTEuMCB0byAxLjAgKi8KKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9GTE9BVDY0X0JFCSgoc25kX3BjbV9mb3JtYXRfdCkgMTcpIC8qIDgtYnl0ZSBmbG9hdCwgSUVFRS03NTQgNjQtYml0LCByYW5nZSAtMS4wIHRvIDEuMCAqLworI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX0lFQzk1OF9TVUJGUkFNRV9MRSAoKHNuZF9wY21fZm9ybWF0X3QpIDE4KSAvKiBJRUMtOTU4IHN1YmZyYW1lLCBMaXR0bGUgRW5kaWFuICovCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfSUVDOTU4X1NVQkZSQU1FX0JFICgoc25kX3BjbV9mb3JtYXRfdCkgMTkpIC8qIElFQy05NTggc3ViZnJhbWUsIEJpZyBFbmRpYW4gKi8KKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9NVV9MQVcJCSgoc25kX3BjbV9mb3JtYXRfdCkgMjApCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfQV9MQVcJCSgoc25kX3BjbV9mb3JtYXRfdCkgMjEpCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfSU1BX0FEUENNCSgoc25kX3BjbV9mb3JtYXRfdCkgMjIpCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfTVBFRwkJKChzbmRfcGNtX2Zvcm1hdF90KSAyMykKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9HU00JCSgoc25kX3BjbV9mb3JtYXRfdCkgMjQpCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfU1BFQ0lBTAkoKHNuZF9wY21fZm9ybWF0X3QpIDMxKQorI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEUJKChzbmRfcGNtX2Zvcm1hdF90KSAzMikJLyogaW4gdGhyZWUgYnl0ZXMgKi8KKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9TMjRfM0JFCSgoc25kX3BjbV9mb3JtYXRfdCkgMzMpCS8qIGluIHRocmVlIGJ5dGVzICovCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfVTI0XzNMRQkoKHNuZF9wY21fZm9ybWF0X3QpIDM0KQkvKiBpbiB0aHJlZSBieXRlcyAqLworI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX1UyNF8zQkUJKChzbmRfcGNtX2Zvcm1hdF90KSAzNSkJLyogaW4gdGhyZWUgYnl0ZXMgKi8KKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9TMjBfM0xFCSgoc25kX3BjbV9mb3JtYXRfdCkgMzYpCS8qIGluIHRocmVlIGJ5dGVzICovCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfUzIwXzNCRQkoKHNuZF9wY21fZm9ybWF0X3QpIDM3KQkvKiBpbiB0aHJlZSBieXRlcyAqLworI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX1UyMF8zTEUJKChzbmRfcGNtX2Zvcm1hdF90KSAzOCkJLyogaW4gdGhyZWUgYnl0ZXMgKi8KKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9VMjBfM0JFCSgoc25kX3BjbV9mb3JtYXRfdCkgMzkpCS8qIGluIHRocmVlIGJ5dGVzICovCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfUzE4XzNMRQkoKHNuZF9wY21fZm9ybWF0X3QpIDQwKQkvKiBpbiB0aHJlZSBieXRlcyAqLworI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX1MxOF8zQkUJKChzbmRfcGNtX2Zvcm1hdF90KSA0MSkJLyogaW4gdGhyZWUgYnl0ZXMgKi8KKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9VMThfM0xFCSgoc25kX3BjbV9mb3JtYXRfdCkgNDIpCS8qIGluIHRocmVlIGJ5dGVzICovCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfVTE4XzNCRQkoKHNuZF9wY21fZm9ybWF0X3QpIDQzKQkvKiBpbiB0aHJlZSBieXRlcyAqLworI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX0c3MjNfMjQJKChzbmRfcGNtX2Zvcm1hdF90KSA0NCkgLyogOCBzYW1wbGVzIGluIDMgYnl0ZXMgKi8KKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9HNzIzXzI0XzFCCSgoc25kX3BjbV9mb3JtYXRfdCkgNDUpIC8qIDEgc2FtcGxlIGluIDEgYnl0ZSAqLworI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX0c3MjNfNDAJKChzbmRfcGNtX2Zvcm1hdF90KSA0NikgLyogOCBTYW1wbGVzIGluIDUgYnl0ZXMgKi8KKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9HNzIzXzQwXzFCCSgoc25kX3BjbV9mb3JtYXRfdCkgNDcpIC8qIDEgc2FtcGxlIGluIDEgYnl0ZSAqLworI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX0xBU1QJCVNORFJWX1BDTV9GT1JNQVRfRzcyM180MF8xQgorCisjaWZkZWYgU05EUlZfTElUVExFX0VORElBTgorI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX1MxNgkJU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9VMTYJCVNORFJWX1BDTV9GT1JNQVRfVTE2X0xFCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfUzI0CQlTTkRSVl9QQ01fRk9STUFUX1MyNF9MRQorI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX1UyNAkJU05EUlZfUENNX0ZPUk1BVF9VMjRfTEUKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9TMzIJCVNORFJWX1BDTV9GT1JNQVRfUzMyX0xFCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfVTMyCQlTTkRSVl9QQ01fRk9STUFUX1UzMl9MRQorI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX0ZMT0FUCQlTTkRSVl9QQ01fRk9STUFUX0ZMT0FUX0xFCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfRkxPQVQ2NAlTTkRSVl9QQ01fRk9STUFUX0ZMT0FUNjRfTEUKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9JRUM5NThfU1VCRlJBTUUgU05EUlZfUENNX0ZPUk1BVF9JRUM5NThfU1VCRlJBTUVfTEUKKyNlbmRpZgorI2lmZGVmIFNORFJWX0JJR19FTkRJQU4KKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9TMTYJCVNORFJWX1BDTV9GT1JNQVRfUzE2X0JFCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfVTE2CQlTTkRSVl9QQ01fRk9STUFUX1UxNl9CRQorI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX1MyNAkJU05EUlZfUENNX0ZPUk1BVF9TMjRfQkUKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9VMjQJCVNORFJWX1BDTV9GT1JNQVRfVTI0X0JFCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfUzMyCQlTTkRSVl9QQ01fRk9STUFUX1MzMl9CRQorI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX1UzMgkJU05EUlZfUENNX0ZPUk1BVF9VMzJfQkUKKyNkZWZpbmUJU05EUlZfUENNX0ZPUk1BVF9GTE9BVAkJU05EUlZfUENNX0ZPUk1BVF9GTE9BVF9CRQorI2RlZmluZQlTTkRSVl9QQ01fRk9STUFUX0ZMT0FUNjQJU05EUlZfUENNX0ZPUk1BVF9GTE9BVDY0X0JFCisjZGVmaW5lCVNORFJWX1BDTV9GT1JNQVRfSUVDOTU4X1NVQkZSQU1FIFNORFJWX1BDTV9GT1JNQVRfSUVDOTU4X1NVQkZSQU1FX0JFCisjZW5kaWYKKwordHlwZWRlZiBpbnQgX19iaXR3aXNlIHNuZF9wY21fc3ViZm9ybWF0X3Q7CisjZGVmaW5lCVNORFJWX1BDTV9TVUJGT1JNQVRfU1RECQkoKHNuZF9wY21fc3ViZm9ybWF0X3QpIDApCisjZGVmaW5lCVNORFJWX1BDTV9TVUJGT1JNQVRfTEFTVAlTTkRSVl9QQ01fU1VCRk9STUFUX1NURAorCisjZGVmaW5lIFNORFJWX1BDTV9JTkZPX01NQVAJCTB4MDAwMDAwMDEJLyogaGFyZHdhcmUgc3VwcG9ydHMgbW1hcCAqLworI2RlZmluZSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElECTB4MDAwMDAwMDIJLyogcGVyaW9kIGRhdGEgYXJlIHZhbGlkIGR1cmluZyB0cmFuc2ZlciAqLworI2RlZmluZSBTTkRSVl9QQ01fSU5GT19ET1VCTEUJCTB4MDAwMDAwMDQJLyogRG91YmxlIGJ1ZmZlcmluZyBuZWVkZWQgZm9yIFBDTSBzdGFydC9zdG9wICovCisjZGVmaW5lIFNORFJWX1BDTV9JTkZPX0JBVENICQkweDAwMDAwMDEwCS8qIGRvdWJsZSBidWZmZXJpbmcgKi8KKyNkZWZpbmUgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQJMHgwMDAwMDEwMAkvKiBjaGFubmVscyBhcmUgaW50ZXJsZWF2ZWQgKi8KKyNkZWZpbmUgU05EUlZfUENNX0lORk9fTk9OSU5URVJMRUFWRUQJMHgwMDAwMDIwMAkvKiBjaGFubmVscyBhcmUgbm90IGludGVybGVhdmVkICovCisjZGVmaW5lIFNORFJWX1BDTV9JTkZPX0NPTVBMRVgJCTB4MDAwMDA0MDAJLyogY29tcGxleCBmcmFtZSBvcmdhbml6YXRpb24gKG1tYXAgb25seSkgKi8KKyNkZWZpbmUgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIJMHgwMDAxMDAwMAkvKiBoYXJkd2FyZSB0cmFuc2ZlciBibG9jayBvZiBzYW1wbGVzICovCisjZGVmaW5lIFNORFJWX1BDTV9JTkZPX09WRVJSQU5HRQkweDAwMDIwMDAwCS8qIGhhcmR3YXJlIHN1cHBvcnRzIEFEQyAoY2FwdHVyZSkgb3ZlcnJhbmdlIGRldGVjdGlvbiAqLworI2RlZmluZSBTTkRSVl9QQ01fSU5GT19SRVNVTUUJCTB4MDAwNDAwMDAJLyogaGFyZHdhcmUgc3VwcG9ydHMgc3RyZWFtIHJlc3VtZSBhZnRlciBzdXNwZW5kICovCisjZGVmaW5lIFNORFJWX1BDTV9JTkZPX1BBVVNFCQkweDAwMDgwMDAwCS8qIHBhdXNlIGlvY3RsIGlzIHN1cHBvcnRlZCAqLworI2RlZmluZSBTTkRSVl9QQ01fSU5GT19IQUxGX0RVUExFWAkweDAwMTAwMDAwCS8qIG9ubHkgaGFsZiBkdXBsZXggKi8KKyNkZWZpbmUgU05EUlZfUENNX0lORk9fSk9JTlRfRFVQTEVYCTB4MDAyMDAwMDAJLyogcGxheWJhY2sgYW5kIGNhcHR1cmUgc3RyZWFtIGFyZSBzb21ld2hhdCBjb3JyZWxhdGVkICovCisjZGVmaW5lIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQJMHgwMDQwMDAwMAkvKiBwY20gc3VwcG9ydCBzb21lIGtpbmQgb2Ygc3luYyBnbyAqLworI2RlZmluZSBTTkRSVl9QQ01fSU5GT19OT19QRVJJT0RfV0FLRVVQCTB4MDA4MDAwMDAJLyogcGVyaW9kIHdha2V1cCBjYW4gYmUgZGlzYWJsZWQgKi8KKyNkZWZpbmUgU05EUlZfUENNX0lORk9fRklGT19JTl9GUkFNRVMJMHg4MDAwMDAwMAkvKiBpbnRlcm5hbCBrZXJuZWwgZmxhZyAtIEZJRk8gc2l6ZSBpcyBpbiBmcmFtZXMgKi8KKwordHlwZWRlZiBpbnQgX19iaXR3aXNlIHNuZF9wY21fc3RhdGVfdDsKKyNkZWZpbmUJU05EUlZfUENNX1NUQVRFX09QRU4JCSgoc25kX3BjbV9zdGF0ZV90KSAwKSAvKiBzdHJlYW0gaXMgb3BlbiAqLworI2RlZmluZQlTTkRSVl9QQ01fU1RBVEVfU0VUVVAJCSgoc25kX3BjbV9zdGF0ZV90KSAxKSAvKiBzdHJlYW0gaGFzIGEgc2V0dXAgKi8KKyNkZWZpbmUJU05EUlZfUENNX1NUQVRFX1BSRVBBUkVECSgoc25kX3BjbV9zdGF0ZV90KSAyKSAvKiBzdHJlYW0gaXMgcmVhZHkgdG8gc3RhcnQgKi8KKyNkZWZpbmUJU05EUlZfUENNX1NUQVRFX1JVTk5JTkcJCSgoc25kX3BjbV9zdGF0ZV90KSAzKSAvKiBzdHJlYW0gaXMgcnVubmluZyAqLworI2RlZmluZQlTTkRSVl9QQ01fU1RBVEVfWFJVTgkJKChzbmRfcGNtX3N0YXRlX3QpIDQpIC8qIHN0cmVhbSByZWFjaGVkIGFuIHhydW4gKi8KKyNkZWZpbmUJU05EUlZfUENNX1NUQVRFX0RSQUlOSU5HCSgoc25kX3BjbV9zdGF0ZV90KSA1KSAvKiBzdHJlYW0gaXMgZHJhaW5pbmcgKi8KKyNkZWZpbmUJU05EUlZfUENNX1NUQVRFX1BBVVNFRAkJKChzbmRfcGNtX3N0YXRlX3QpIDYpIC8qIHN0cmVhbSBpcyBwYXVzZWQgKi8KKyNkZWZpbmUJU05EUlZfUENNX1NUQVRFX1NVU1BFTkRFRAkoKHNuZF9wY21fc3RhdGVfdCkgNykgLyogaGFyZHdhcmUgaXMgc3VzcGVuZGVkICovCisjZGVmaW5lCVNORFJWX1BDTV9TVEFURV9ESVNDT05ORUNURUQJKChzbmRfcGNtX3N0YXRlX3QpIDgpIC8qIGhhcmR3YXJlIGlzIGRpc2Nvbm5lY3RlZCAqLworI2RlZmluZQlTTkRSVl9QQ01fU1RBVEVfTEFTVAkJU05EUlZfUENNX1NUQVRFX0RJU0NPTk5FQ1RFRAorCitlbnVtIHsKKwlTTkRSVl9QQ01fTU1BUF9PRkZTRVRfREFUQSA9IDB4MDAwMDAwMDAsCisJU05EUlZfUENNX01NQVBfT0ZGU0VUX1NUQVRVUyA9IDB4ODAwMDAwMDAsCisJU05EUlZfUENNX01NQVBfT0ZGU0VUX0NPTlRST0wgPSAweDgxMDAwMDAwLAorfTsKKwordW5pb24gc25kX3BjbV9zeW5jX2lkIHsKKwl1bnNpZ25lZCBjaGFyIGlkWzE2XTsKKwl1bnNpZ25lZCBzaG9ydCBpZDE2WzhdOworCXVuc2lnbmVkIGludCBpZDMyWzRdOworfTsKKworc3RydWN0IHNuZF9wY21faW5mbyB7CisJdW5zaWduZWQgaW50IGRldmljZTsJCS8qIFJPL1dSIChjb250cm9sKTogZGV2aWNlIG51bWJlciAqLworCXVuc2lnbmVkIGludCBzdWJkZXZpY2U7CQkvKiBSTy9XUiAoY29udHJvbCk6IHN1YmRldmljZSBudW1iZXIgKi8KKwlpbnQgc3RyZWFtOwkJCS8qIFJPL1dSIChjb250cm9sKTogc3RyZWFtIGRpcmVjdGlvbiAqLworCWludCBjYXJkOwkJCS8qIFI6IGNhcmQgbnVtYmVyICovCisJdW5zaWduZWQgY2hhciBpZFs2NF07CQkvKiBJRCAodXNlciBzZWxlY3RhYmxlKSAqLworCXVuc2lnbmVkIGNoYXIgbmFtZVs4MF07CQkvKiBuYW1lIG9mIHRoaXMgZGV2aWNlICovCisJdW5zaWduZWQgY2hhciBzdWJuYW1lWzMyXTsJLyogc3ViZGV2aWNlIG5hbWUgKi8KKwlpbnQgZGV2X2NsYXNzOwkJCS8qIFNORFJWX1BDTV9DTEFTU18qICovCisJaW50IGRldl9zdWJjbGFzczsJCS8qIFNORFJWX1BDTV9TVUJDTEFTU18qICovCisJdW5zaWduZWQgaW50IHN1YmRldmljZXNfY291bnQ7CisJdW5zaWduZWQgaW50IHN1YmRldmljZXNfYXZhaWw7CisJdW5pb24gc25kX3BjbV9zeW5jX2lkIHN5bmM7CS8qIGhhcmR3YXJlIHN5bmNocm9uaXphdGlvbiBJRCAqLworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbNjRdOwkvKiByZXNlcnZlZCBmb3IgZnV0dXJlLi4uICovCit9OworCit0eXBlZGVmIGludCBzbmRfcGNtX2h3X3BhcmFtX3Q7CisjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9BQ0NFU1MJMAkvKiBBY2Nlc3MgdHlwZSAqLworI2RlZmluZQlTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFUCTEJLyogRm9ybWF0ICovCisjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9TVUJGT1JNQVQJMgkvKiBTdWJmb3JtYXQgKi8KKyNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX0ZJUlNUX01BU0sJU05EUlZfUENNX0hXX1BBUkFNX0FDQ0VTUworI2RlZmluZQlTTkRSVl9QQ01fSFdfUEFSQU1fTEFTVF9NQVNLCVNORFJWX1BDTV9IV19QQVJBTV9TVUJGT1JNQVQKKworI2RlZmluZQlTTkRSVl9QQ01fSFdfUEFSQU1fU0FNUExFX0JJVFMJOAkvKiBCaXRzIHBlciBzYW1wbGUgKi8KKyNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX0ZSQU1FX0JJVFMJOQkvKiBCaXRzIHBlciBmcmFtZSAqLworI2RlZmluZQlTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMJMTAJLyogQ2hhbm5lbHMgKi8KKyNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUJCTExCS8qIEFwcHJveCByYXRlICovCisjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfVElNRQkxMgkvKiBBcHByb3ggZGlzdGFuY2UgYmV0d2VlbgorCQkJCQkJICogaW50ZXJydXB0cyBpbiB1cworCQkJCQkJICovCisjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfU0laRQkxMwkvKiBBcHByb3ggZnJhbWVzIGJldHdlZW4KKwkJCQkJCSAqIGludGVycnVwdHMKKwkJCQkJCSAqLworI2RlZmluZQlTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTCTE0CS8qIEFwcHJveCBieXRlcyBiZXR3ZWVuCisJCQkJCQkgKiBpbnRlcnJ1cHRzCisJCQkJCQkgKi8KKyNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMJMTUJLyogQXBwcm94IGludGVycnVwdHMgcGVyCisJCQkJCQkgKiBidWZmZXIKKwkJCQkJCSAqLworI2RlZmluZQlTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX1RJTUUJMTYJLyogQXBwcm94IGR1cmF0aW9uIG9mIGJ1ZmZlcgorCQkJCQkJICogaW4gdXMKKwkJCQkJCSAqLworI2RlZmluZQlTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX1NJWkUJMTcJLyogU2l6ZSBvZiBidWZmZXIgaW4gZnJhbWVzICovCisjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMJMTgJLyogU2l6ZSBvZiBidWZmZXIgaW4gYnl0ZXMgKi8KKyNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX1RJQ0tfVElNRQkxOQkvKiBBcHByb3ggdGljayBkdXJhdGlvbiBpbiB1cyAqLworI2RlZmluZQlTTkRSVl9QQ01fSFdfUEFSQU1fRklSU1RfSU5URVJWQUwJU05EUlZfUENNX0hXX1BBUkFNX1NBTVBMRV9CSVRTCisjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9MQVNUX0lOVEVSVkFMCVNORFJWX1BDTV9IV19QQVJBTV9USUNLX1RJTUUKKworI2RlZmluZSBTTkRSVl9QQ01fSFdfUEFSQU1TX05PUkVTQU1QTEUJKDE8PDApCS8qIGF2b2lkIHJhdGUgcmVzYW1wbGluZyAqLworI2RlZmluZSBTTkRSVl9QQ01fSFdfUEFSQU1TX0VYUE9SVF9CVUZGRVIJKDE8PDEpCS8qIGV4cG9ydCBidWZmZXIgKi8KKyNkZWZpbmUgU05EUlZfUENNX0hXX1BBUkFNU19OT19QRVJJT0RfV0FLRVVQCSgxPDwyKQkvKiBkaXNhYmxlIHBlcmlvZCB3YWtldXBzICovCisKK3N0cnVjdCBzbmRfaW50ZXJ2YWwgeworCXVuc2lnbmVkIGludCBtaW4sIG1heDsKKwl1bnNpZ25lZCBpbnQgb3Blbm1pbjoxLAorCQkgICAgIG9wZW5tYXg6MSwKKwkJICAgICBpbnRlZ2VyOjEsCisJCSAgICAgZW1wdHk6MTsKK307CisKKyNkZWZpbmUgU05EUlZfTUFTS19NQVgJMjU2CisKK3N0cnVjdCBzbmRfbWFzayB7CisJX191MzIgYml0c1soU05EUlZfTUFTS19NQVgrMzEpLzMyXTsKK307CisKK3N0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyB7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCBzbmRfbWFzayBtYXNrc1tTTkRSVl9QQ01fSFdfUEFSQU1fTEFTVF9NQVNLIC0gCisJCQkgICAgICAgU05EUlZfUENNX0hXX1BBUkFNX0ZJUlNUX01BU0sgKyAxXTsKKwlzdHJ1Y3Qgc25kX21hc2sgbXJlc1s1XTsJLyogcmVzZXJ2ZWQgbWFza3MgKi8KKwlzdHJ1Y3Qgc25kX2ludGVydmFsIGludGVydmFsc1tTTkRSVl9QQ01fSFdfUEFSQU1fTEFTVF9JTlRFUlZBTCAtCisJCQkJICAgICAgICBTTkRSVl9QQ01fSFdfUEFSQU1fRklSU1RfSU5URVJWQUwgKyAxXTsKKwlzdHJ1Y3Qgc25kX2ludGVydmFsIGlyZXNbOV07CS8qIHJlc2VydmVkIGludGVydmFscyAqLworCXVuc2lnbmVkIGludCBybWFzazsJCS8qIFc6IHJlcXVlc3RlZCBtYXNrcyAqLworCXVuc2lnbmVkIGludCBjbWFzazsJCS8qIFI6IGNoYW5nZWQgbWFza3MgKi8KKwl1bnNpZ25lZCBpbnQgaW5mbzsJCS8qIFI6IEluZm8gZmxhZ3MgZm9yIHJldHVybmVkIHNldHVwICovCisJdW5zaWduZWQgaW50IG1zYml0czsJCS8qIFI6IHVzZWQgbW9zdCBzaWduaWZpY2FudCBiaXRzICovCisJdW5zaWduZWQgaW50IHJhdGVfbnVtOwkJLyogUjogcmF0ZSBudW1lcmF0b3IgKi8KKwl1bnNpZ25lZCBpbnQgcmF0ZV9kZW47CQkvKiBSOiByYXRlIGRlbm9taW5hdG9yICovCisJc25kX3BjbV91ZnJhbWVzX3QgZmlmb19zaXplOwkvKiBSOiBjaGlwIEZJRk8gc2l6ZSBpbiBmcmFtZXMgKi8KKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzY0XTsJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSAqLworfTsKKworZW51bSB7CisJU05EUlZfUENNX1RTVEFNUF9OT05FID0gMCwKKwlTTkRSVl9QQ01fVFNUQU1QX0VOQUJMRSwKKwlTTkRSVl9QQ01fVFNUQU1QX0xBU1QgPSBTTkRSVl9QQ01fVFNUQU1QX0VOQUJMRSwKK307CisKK3N0cnVjdCBzbmRfcGNtX3N3X3BhcmFtcyB7CisJaW50IHRzdGFtcF9tb2RlOwkJCS8qIHRpbWVzdGFtcCBtb2RlICovCisJdW5zaWduZWQgaW50IHBlcmlvZF9zdGVwOworCXVuc2lnbmVkIGludCBzbGVlcF9taW47CQkJLyogbWluIHRpY2tzIHRvIHNsZWVwICovCisJc25kX3BjbV91ZnJhbWVzX3QgYXZhaWxfbWluOwkJLyogbWluIGF2YWlsIGZyYW1lcyBmb3Igd2FrZXVwICovCisJc25kX3BjbV91ZnJhbWVzX3QgeGZlcl9hbGlnbjsJCS8qIG9ic29sZXRlOiB4ZmVyIHNpemUgbmVlZCB0byBiZSBhIG11bHRpcGxlICovCisJc25kX3BjbV91ZnJhbWVzX3Qgc3RhcnRfdGhyZXNob2xkOwkvKiBtaW4gaHdfYXZhaWwgZnJhbWVzIGZvciBhdXRvbWF0aWMgc3RhcnQgKi8KKwlzbmRfcGNtX3VmcmFtZXNfdCBzdG9wX3RocmVzaG9sZDsJLyogbWluIGF2YWlsIGZyYW1lcyBmb3IgYXV0b21hdGljIHN0b3AgKi8KKwlzbmRfcGNtX3VmcmFtZXNfdCBzaWxlbmNlX3RocmVzaG9sZDsJLyogbWluIGRpc3RhbmNlIGZyb20gbm9pc2UgZm9yIHNpbGVuY2UgZmlsbGluZyAqLworCXNuZF9wY21fdWZyYW1lc190IHNpbGVuY2Vfc2l6ZTsJCS8qIHNpbGVuY2UgYmxvY2sgc2l6ZSAqLworCXNuZF9wY21fdWZyYW1lc190IGJvdW5kYXJ5OwkJLyogcG9pbnRlcnMgd3JhcCBwb2ludCAqLworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbNjRdOwkJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSAqLworfTsKKworc3RydWN0IHNuZF9wY21fY2hhbm5lbF9pbmZvIHsKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbDsKKwlfX2tlcm5lbF9vZmZfdCBvZmZzZXQ7CQkvKiBtbWFwIG9mZnNldCAqLworCXVuc2lnbmVkIGludCBmaXJzdDsJCS8qIG9mZnNldCB0byBmaXJzdCBzYW1wbGUgaW4gYml0cyAqLworCXVuc2lnbmVkIGludCBzdGVwOwkJLyogc2FtcGxlcyBkaXN0YW5jZSBpbiBiaXRzICovCit9OworCitzdHJ1Y3Qgc25kX3BjbV9zdGF0dXMgeworCXNuZF9wY21fc3RhdGVfdCBzdGF0ZTsJCS8qIHN0cmVhbSBzdGF0ZSAqLworCXN0cnVjdCB0aW1lc3BlYyB0cmlnZ2VyX3RzdGFtcDsJLyogdGltZSB3aGVuIHN0cmVhbSB3YXMgc3RhcnRlZC9zdG9wcGVkL3BhdXNlZCAqLworCXN0cnVjdCB0aW1lc3BlYyB0c3RhbXA7CQkvKiByZWZlcmVuY2UgdGltZXN0YW1wICovCisJc25kX3BjbV91ZnJhbWVzX3QgYXBwbF9wdHI7CS8qIGFwcGwgcHRyICovCisJc25kX3BjbV91ZnJhbWVzX3QgaHdfcHRyOwkvKiBodyBwdHIgKi8KKwlzbmRfcGNtX3NmcmFtZXNfdCBkZWxheTsJLyogY3VycmVudCBkZWxheSBpbiBmcmFtZXMgKi8KKwlzbmRfcGNtX3VmcmFtZXNfdCBhdmFpbDsJLyogbnVtYmVyIG9mIGZyYW1lcyBhdmFpbGFibGUgKi8KKwlzbmRfcGNtX3VmcmFtZXNfdCBhdmFpbF9tYXg7CS8qIG1heCBmcmFtZXMgYXZhaWxhYmxlIG9uIGh3IHNpbmNlIGxhc3Qgc3RhdHVzICovCisJc25kX3BjbV91ZnJhbWVzX3Qgb3ZlcnJhbmdlOwkvKiBjb3VudCBvZiBBREMgKGNhcHR1cmUpIG92ZXJyYW5nZSBkZXRlY3Rpb25zIGZyb20gbGFzdCBzdGF0dXMgKi8KKwlzbmRfcGNtX3N0YXRlX3Qgc3VzcGVuZGVkX3N0YXRlOyAvKiBzdXNwZW5kZWQgc3RyZWFtIHN0YXRlICovCisJdW5zaWduZWQgY2hhciByZXNlcnZlZFs2MF07CS8qIG11c3QgYmUgZmlsbGVkIHdpdGggemVybyAqLworfTsKKworc3RydWN0IHNuZF9wY21fbW1hcF9zdGF0dXMgeworCXNuZF9wY21fc3RhdGVfdCBzdGF0ZTsJCS8qIFJPOiBzdGF0ZSAtIFNORFJWX1BDTV9TVEFURV9YWFhYICovCisJaW50IHBhZDE7CQkJLyogTmVlZGVkIGZvciA2NCBiaXQgYWxpZ25tZW50ICovCisJc25kX3BjbV91ZnJhbWVzX3QgaHdfcHRyOwkvKiBSTzogaHcgcHRyICgwLi4uYm91bmRhcnktMSkgKi8KKwlzdHJ1Y3QgdGltZXNwZWMgdHN0YW1wOwkJLyogVGltZXN0YW1wICovCisJc25kX3BjbV9zdGF0ZV90IHN1c3BlbmRlZF9zdGF0ZTsgLyogUk86IHN1c3BlbmRlZCBzdHJlYW0gc3RhdGUgKi8KK307CisKK3N0cnVjdCBzbmRfcGNtX21tYXBfY29udHJvbCB7CisJc25kX3BjbV91ZnJhbWVzX3QgYXBwbF9wdHI7CS8qIFJXOiBhcHBsIHB0ciAoMC4uLmJvdW5kYXJ5LTEpICovCisJc25kX3BjbV91ZnJhbWVzX3QgYXZhaWxfbWluOwkvKiBSVzogbWluIGF2YWlsYWJsZSBmcmFtZXMgZm9yIHdha2V1cCAqLworfTsKKworI2RlZmluZSBTTkRSVl9QQ01fU1lOQ19QVFJfSFdTWU5DCSgxPDwwKQkvKiBleGVjdXRlIGh3c3luYyAqLworI2RlZmluZSBTTkRSVl9QQ01fU1lOQ19QVFJfQVBQTAkJKDE8PDEpCS8qIGdldCBhcHBsX3B0ciBmcm9tIGRyaXZlciAoci93IG9wKSAqLworI2RlZmluZSBTTkRSVl9QQ01fU1lOQ19QVFJfQVZBSUxfTUlOCSgxPDwyKQkvKiBnZXQgYXZhaWxfbWluIGZyb20gZHJpdmVyICovCisKK3N0cnVjdCBzbmRfcGNtX3N5bmNfcHRyIHsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5pb24geworCQlzdHJ1Y3Qgc25kX3BjbV9tbWFwX3N0YXR1cyBzdGF0dXM7CisJCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbNjRdOworCX0gczsKKwl1bmlvbiB7CisJCXN0cnVjdCBzbmRfcGNtX21tYXBfY29udHJvbCBjb250cm9sOworCQl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzY0XTsKKwl9IGM7Cit9OworCitzdHJ1Y3Qgc25kX3hmZXJpIHsKKwlzbmRfcGNtX3NmcmFtZXNfdCByZXN1bHQ7CisJdm9pZCAqYnVmOworCXNuZF9wY21fdWZyYW1lc190IGZyYW1lczsKK307CisKK3N0cnVjdCBzbmRfeGZlcm4geworCXNuZF9wY21fc2ZyYW1lc190IHJlc3VsdDsKKwl2b2lkICogKmJ1ZnM7CisJc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzOworfTsKKworZW51bSB7CisJU05EUlZfUENNX1RTVEFNUF9UWVBFX0dFVFRJTUVPRkRBWSA9IDAsCS8qIGdldHRpbWVvZmRheSBlcXVpdmFsZW50ICovCisJU05EUlZfUENNX1RTVEFNUF9UWVBFX01PTk9UT05JQywJLyogcG9zaXhfY2xvY2tfbW9ub3RvbmljIGVxdWl2YWxlbnQgKi8KKwlTTkRSVl9QQ01fVFNUQU1QX1RZUEVfTEFTVCA9IFNORFJWX1BDTV9UU1RBTVBfVFlQRV9NT05PVE9OSUMsCit9OworCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9QVkVSU0lPTglfSU9SKCdBJywgMHgwMCwgaW50KQorI2RlZmluZSBTTkRSVl9QQ01fSU9DVExfSU5GTwkJX0lPUignQScsIDB4MDEsIHN0cnVjdCBzbmRfcGNtX2luZm8pCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9UU1RBTVAJCV9JT1coJ0EnLCAweDAyLCBpbnQpCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9UVFNUQU1QCQlfSU9XKCdBJywgMHgwMywgaW50KQorI2RlZmluZSBTTkRSVl9QQ01fSU9DVExfSFdfUkVGSU5FCV9JT1dSKCdBJywgMHgxMCwgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zKQorI2RlZmluZSBTTkRSVl9QQ01fSU9DVExfSFdfUEFSQU1TCV9JT1dSKCdBJywgMHgxMSwgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zKQorI2RlZmluZSBTTkRSVl9QQ01fSU9DVExfSFdfRlJFRQkJX0lPKCdBJywgMHgxMikKKyNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX1NXX1BBUkFNUwlfSU9XUignQScsIDB4MTMsIHN0cnVjdCBzbmRfcGNtX3N3X3BhcmFtcykKKyNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX1NUQVRVUwkJX0lPUignQScsIDB4MjAsIHN0cnVjdCBzbmRfcGNtX3N0YXR1cykKKyNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX0RFTEFZCQlfSU9SKCdBJywgMHgyMSwgc25kX3BjbV9zZnJhbWVzX3QpCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9IV1NZTkMJCV9JTygnQScsIDB4MjIpCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9TWU5DX1BUUglfSU9XUignQScsIDB4MjMsIHN0cnVjdCBzbmRfcGNtX3N5bmNfcHRyKQorI2RlZmluZSBTTkRSVl9QQ01fSU9DVExfQ0hBTk5FTF9JTkZPCV9JT1IoJ0EnLCAweDMyLCBzdHJ1Y3Qgc25kX3BjbV9jaGFubmVsX2luZm8pCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9QUkVQQVJFCQlfSU8oJ0EnLCAweDQwKQorI2RlZmluZSBTTkRSVl9QQ01fSU9DVExfUkVTRVQJCV9JTygnQScsIDB4NDEpCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9TVEFSVAkJX0lPKCdBJywgMHg0MikKKyNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX0RST1AJCV9JTygnQScsIDB4NDMpCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9EUkFJTgkJX0lPKCdBJywgMHg0NCkKKyNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX1BBVVNFCQlfSU9XKCdBJywgMHg0NSwgaW50KQorI2RlZmluZSBTTkRSVl9QQ01fSU9DVExfUkVXSU5ECQlfSU9XKCdBJywgMHg0Niwgc25kX3BjbV91ZnJhbWVzX3QpCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9SRVNVTUUJCV9JTygnQScsIDB4NDcpCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9YUlVOCQlfSU8oJ0EnLCAweDQ4KQorI2RlZmluZSBTTkRSVl9QQ01fSU9DVExfRk9SV0FSRAkJX0lPVygnQScsIDB4NDksIHNuZF9wY21fdWZyYW1lc190KQorI2RlZmluZSBTTkRSVl9QQ01fSU9DVExfV1JJVEVJX0ZSQU1FUwlfSU9XKCdBJywgMHg1MCwgc3RydWN0IHNuZF94ZmVyaSkKKyNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX1JFQURJX0ZSQU1FUwlfSU9SKCdBJywgMHg1MSwgc3RydWN0IHNuZF94ZmVyaSkKKyNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX1dSSVRFTl9GUkFNRVMJX0lPVygnQScsIDB4NTIsIHN0cnVjdCBzbmRfeGZlcm4pCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9SRUFETl9GUkFNRVMJX0lPUignQScsIDB4NTMsIHN0cnVjdCBzbmRfeGZlcm4pCisjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9MSU5LCQlfSU9XKCdBJywgMHg2MCwgaW50KQorI2RlZmluZSBTTkRSVl9QQ01fSU9DVExfVU5MSU5LCQlfSU8oJ0EnLCAweDYxKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESSB2MS4wIGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICBSYXcgTUlESSBzZWN0aW9uIC0gL2Rldi9zbmQvbWlkaT8/CisgKi8KKworI2RlZmluZSBTTkRSVl9SQVdNSURJX1ZFUlNJT04JCVNORFJWX1BST1RPQ09MX1ZFUlNJT04oMiwgMCwgMCkKKworZW51bSB7CisJU05EUlZfUkFXTUlESV9TVFJFQU1fT1VUUFVUID0gMCwKKwlTTkRSVl9SQVdNSURJX1NUUkVBTV9JTlBVVCwKKwlTTkRSVl9SQVdNSURJX1NUUkVBTV9MQVNUID0gU05EUlZfUkFXTUlESV9TVFJFQU1fSU5QVVQsCit9OworCisjZGVmaW5lIFNORFJWX1JBV01JRElfSU5GT19PVVRQVVQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgU05EUlZfUkFXTUlESV9JTkZPX0lOUFVUCQkweDAwMDAwMDAyCisjZGVmaW5lIFNORFJWX1JBV01JRElfSU5GT19EVVBMRVgJCTB4MDAwMDAwMDQKKworc3RydWN0IHNuZF9yYXdtaWRpX2luZm8geworCXVuc2lnbmVkIGludCBkZXZpY2U7CQkvKiBSTy9XUiAoY29udHJvbCk6IGRldmljZSBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQgc3ViZGV2aWNlOwkJLyogUk8vV1IgKGNvbnRyb2wpOiBzdWJkZXZpY2UgbnVtYmVyICovCisJaW50IHN0cmVhbTsJCQkvKiBXUjogc3RyZWFtICovCisJaW50IGNhcmQ7CQkJLyogUjogY2FyZCBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CQkvKiBTTkRSVl9SQVdNSURJX0lORk9fWFhYWCAqLworCXVuc2lnbmVkIGNoYXIgaWRbNjRdOwkJLyogSUQgKHVzZXIgc2VsZWN0YWJsZSkgKi8KKwl1bnNpZ25lZCBjaGFyIG5hbWVbODBdOwkJLyogbmFtZSBvZiBkZXZpY2UgKi8KKwl1bnNpZ25lZCBjaGFyIHN1Ym5hbWVbMzJdOwkvKiBuYW1lIG9mIGFjdGl2ZSBvciBzZWxlY3RlZCBzdWJkZXZpY2UgKi8KKwl1bnNpZ25lZCBpbnQgc3ViZGV2aWNlc19jb3VudDsKKwl1bnNpZ25lZCBpbnQgc3ViZGV2aWNlc19hdmFpbDsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzY0XTsJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KK307CisKK3N0cnVjdCBzbmRfcmF3bWlkaV9wYXJhbXMgeworCWludCBzdHJlYW07CisJc2l6ZV90IGJ1ZmZlcl9zaXplOwkJLyogcXVldWUgc2l6ZSBpbiBieXRlcyAqLworCXNpemVfdCBhdmFpbF9taW47CQkvKiBtaW5pbXVtIGF2YWlsIGJ5dGVzIGZvciB3YWtldXAgKi8KKwl1bnNpZ25lZCBpbnQgbm9fYWN0aXZlX3NlbnNpbmc6IDE7IC8qIGRvIG5vdCBzZW5kIGFjdGl2ZSBzZW5zaW5nIGJ5dGUgaW4gY2xvc2UoKSAqLworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbMTZdOwkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworfTsKKworc3RydWN0IHNuZF9yYXdtaWRpX3N0YXR1cyB7CisJaW50IHN0cmVhbTsKKwlzdHJ1Y3QgdGltZXNwZWMgdHN0YW1wOwkJLyogVGltZXN0YW1wICovCisJc2l6ZV90IGF2YWlsOwkJCS8qIGF2YWlsYWJsZSBieXRlcyAqLworCXNpemVfdCB4cnVuczsJCQkvKiBjb3VudCBvZiBvdmVycnVucyBzaW5jZSBsYXN0IHN0YXR1cyAoaW4gYnl0ZXMpICovCisJdW5zaWduZWQgY2hhciByZXNlcnZlZFsxNl07CS8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCit9OworCisjZGVmaW5lIFNORFJWX1JBV01JRElfSU9DVExfUFZFUlNJT04JX0lPUignVycsIDB4MDAsIGludCkKKyNkZWZpbmUgU05EUlZfUkFXTUlESV9JT0NUTF9JTkZPCV9JT1IoJ1cnLCAweDAxLCBzdHJ1Y3Qgc25kX3Jhd21pZGlfaW5mbykKKyNkZWZpbmUgU05EUlZfUkFXTUlESV9JT0NUTF9QQVJBTVMJX0lPV1IoJ1cnLCAweDEwLCBzdHJ1Y3Qgc25kX3Jhd21pZGlfcGFyYW1zKQorI2RlZmluZSBTTkRSVl9SQVdNSURJX0lPQ1RMX1NUQVRVUwlfSU9XUignVycsIDB4MjAsIHN0cnVjdCBzbmRfcmF3bWlkaV9zdGF0dXMpCisjZGVmaW5lIFNORFJWX1JBV01JRElfSU9DVExfRFJPUAlfSU9XKCdXJywgMHgzMCwgaW50KQorI2RlZmluZSBTTkRSVl9SQVdNSURJX0lPQ1RMX0RSQUlOCV9JT1coJ1cnLCAweDMxLCBpbnQpCisKKy8qCisgKiAgVGltZXIgc2VjdGlvbiAtIC9kZXYvc25kL3RpbWVyCisgKi8KKworI2RlZmluZSBTTkRSVl9USU1FUl9WRVJTSU9OCQlTTkRSVl9QUk9UT0NPTF9WRVJTSU9OKDIsIDAsIDYpCisKK2VudW0geworCVNORFJWX1RJTUVSX0NMQVNTX05PTkUgPSAtMSwKKwlTTkRSVl9USU1FUl9DTEFTU19TTEFWRSA9IDAsCisJU05EUlZfVElNRVJfQ0xBU1NfR0xPQkFMLAorCVNORFJWX1RJTUVSX0NMQVNTX0NBUkQsCisJU05EUlZfVElNRVJfQ0xBU1NfUENNLAorCVNORFJWX1RJTUVSX0NMQVNTX0xBU1QgPSBTTkRSVl9USU1FUl9DTEFTU19QQ00sCit9OworCisvKiBzbGF2ZSB0aW1lciBjbGFzc2VzICovCitlbnVtIHsKKwlTTkRSVl9USU1FUl9TQ0xBU1NfTk9ORSA9IDAsCisJU05EUlZfVElNRVJfU0NMQVNTX0FQUExJQ0FUSU9OLAorCVNORFJWX1RJTUVSX1NDTEFTU19TRVFVRU5DRVIsCQkvKiBhbGlhcyAqLworCVNORFJWX1RJTUVSX1NDTEFTU19PU1NfU0VRVUVOQ0VSLAkvKiBhbGlhcyAqLworCVNORFJWX1RJTUVSX1NDTEFTU19MQVNUID0gU05EUlZfVElNRVJfU0NMQVNTX09TU19TRVFVRU5DRVIsCit9OworCisvKiBnbG9iYWwgdGltZXJzIChkZXZpY2UgbWVtYmVyKSAqLworI2RlZmluZSBTTkRSVl9USU1FUl9HTE9CQUxfU1lTVEVNCTAKKyNkZWZpbmUgU05EUlZfVElNRVJfR0xPQkFMX1JUQwkJMQorI2RlZmluZSBTTkRSVl9USU1FUl9HTE9CQUxfSFBFVAkJMgorI2RlZmluZSBTTkRSVl9USU1FUl9HTE9CQUxfSFJUSU1FUgkzCisKKy8qIGluZm8gZmxhZ3MgKi8KKyNkZWZpbmUgU05EUlZfVElNRVJfRkxHX1NMQVZFCQkoMTw8MCkJLyogY2Fubm90IGJlIGNvbnRyb2xsZWQgKi8KKworc3RydWN0IHNuZF90aW1lcl9pZCB7CisJaW50IGRldl9jbGFzczsKKwlpbnQgZGV2X3NjbGFzczsKKwlpbnQgY2FyZDsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7Cit9OworCitzdHJ1Y3Qgc25kX3RpbWVyX2dpbmZvIHsKKwlzdHJ1Y3Qgc25kX3RpbWVyX2lkIHRpZDsJLyogcmVxdWVzdGVkIHRpbWVyIElEICovCisJdW5zaWduZWQgaW50IGZsYWdzOwkJLyogdGltZXIgZmxhZ3MgLSBTTkRSVl9USU1FUl9GTEdfKiAqLworCWludCBjYXJkOwkJCS8qIGNhcmQgbnVtYmVyICovCisJdW5zaWduZWQgY2hhciBpZFs2NF07CQkvKiB0aW1lciBpZGVudGlmaWNhdGlvbiAqLworCXVuc2lnbmVkIGNoYXIgbmFtZVs4MF07CQkvKiB0aW1lciBuYW1lICovCisJdW5zaWduZWQgbG9uZyByZXNlcnZlZDA7CS8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisJdW5zaWduZWQgbG9uZyByZXNvbHV0aW9uOwkvKiBhdmVyYWdlIHBlcmlvZCByZXNvbHV0aW9uIGluIG5zICovCisJdW5zaWduZWQgbG9uZyByZXNvbHV0aW9uX21pbjsJLyogbWluaW1hbCBwZXJpb2QgcmVzb2x1dGlvbiBpbiBucyAqLworCXVuc2lnbmVkIGxvbmcgcmVzb2x1dGlvbl9tYXg7CS8qIG1heGltYWwgcGVyaW9kIHJlc29sdXRpb24gaW4gbnMgKi8KKwl1bnNpZ25lZCBpbnQgY2xpZW50czsJCS8qIGFjdGl2ZSB0aW1lciBjbGllbnRzICovCisJdW5zaWduZWQgY2hhciByZXNlcnZlZFszMl07Cit9OworCitzdHJ1Y3Qgc25kX3RpbWVyX2dwYXJhbXMgeworCXN0cnVjdCBzbmRfdGltZXJfaWQgdGlkOwkvKiByZXF1ZXN0ZWQgdGltZXIgSUQgKi8KKwl1bnNpZ25lZCBsb25nIHBlcmlvZF9udW07CS8qIHJlcXVlc3RlZCBwcmVjaXNlIHBlcmlvZCBkdXJhdGlvbiAoaW4gc2Vjb25kcykgLSBudW1lcmF0b3IgKi8KKwl1bnNpZ25lZCBsb25nIHBlcmlvZF9kZW47CS8qIHJlcXVlc3RlZCBwcmVjaXNlIHBlcmlvZCBkdXJhdGlvbiAoaW4gc2Vjb25kcykgLSBkZW5vbWluYXRvciAqLworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbMzJdOworfTsKKworc3RydWN0IHNuZF90aW1lcl9nc3RhdHVzIHsKKwlzdHJ1Y3Qgc25kX3RpbWVyX2lkIHRpZDsJLyogcmVxdWVzdGVkIHRpbWVyIElEICovCisJdW5zaWduZWQgbG9uZyByZXNvbHV0aW9uOwkvKiBjdXJyZW50IHBlcmlvZCByZXNvbHV0aW9uIGluIG5zICovCisJdW5zaWduZWQgbG9uZyByZXNvbHV0aW9uX251bTsJLyogcHJlY2lzZSBjdXJyZW50IHBlcmlvZCByZXNvbHV0aW9uIChpbiBzZWNvbmRzKSAtIG51bWVyYXRvciAqLworCXVuc2lnbmVkIGxvbmcgcmVzb2x1dGlvbl9kZW47CS8qIHByZWNpc2UgY3VycmVudCBwZXJpb2QgcmVzb2x1dGlvbiAoaW4gc2Vjb25kcykgLSBkZW5vbWluYXRvciAqLworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbMzJdOworfTsKKworc3RydWN0IHNuZF90aW1lcl9zZWxlY3QgeworCXN0cnVjdCBzbmRfdGltZXJfaWQgaWQ7CS8qIGJpbmQgdG8gdGltZXIgSUQgKi8KKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzMyXTsJLyogcmVzZXJ2ZWQgKi8KK307CisKK3N0cnVjdCBzbmRfdGltZXJfaW5mbyB7CisJdW5zaWduZWQgaW50IGZsYWdzOwkJLyogdGltZXIgZmxhZ3MgLSBTTkRSVl9USU1FUl9GTEdfKiAqLworCWludCBjYXJkOwkJCS8qIGNhcmQgbnVtYmVyICovCisJdW5zaWduZWQgY2hhciBpZFs2NF07CQkvKiB0aW1lciBpZGVudGlmaWNhdG9yICovCisJdW5zaWduZWQgY2hhciBuYW1lWzgwXTsJCS8qIHRpbWVyIG5hbWUgKi8KKwl1bnNpZ25lZCBsb25nIHJlc2VydmVkMDsJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKwl1bnNpZ25lZCBsb25nIHJlc29sdXRpb247CS8qIGF2ZXJhZ2UgcGVyaW9kIHJlc29sdXRpb24gaW4gbnMgKi8KKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzY0XTsJLyogcmVzZXJ2ZWQgKi8KK307CisKKyNkZWZpbmUgU05EUlZfVElNRVJfUFNGTEdfQVVUTwkJKDE8PDApCS8qIGF1dG8gc3RhcnQsIG90aGVyd2lzZSBvbmUtc2hvdCAqLworI2RlZmluZSBTTkRSVl9USU1FUl9QU0ZMR19FWENMVVNJVkUJKDE8PDEpCS8qIGV4Y2x1c2l2ZSB1c2UsIHByZWNpc2Ugc3RhcnQvc3RvcC9wYXVzZS9jb250aW51ZSAqLworI2RlZmluZSBTTkRSVl9USU1FUl9QU0ZMR19FQVJMWV9FVkVOVAkoMTw8MikJLyogd3JpdGUgZWFybHkgZXZlbnQgdG8gdGhlIHBvbGwgcXVldWUgKi8KKworc3RydWN0IHNuZF90aW1lcl9wYXJhbXMgeworCXVuc2lnbmVkIGludCBmbGFnczsJCS8qIGZsYWdzIC0gU05EUlZfTUlYRVJfUFNGTEdfKiAqLworCXVuc2lnbmVkIGludCB0aWNrczsJCS8qIHJlcXVlc3RlZCByZXNvbHV0aW9uIGluIHRpY2tzICovCisJdW5zaWduZWQgaW50IHF1ZXVlX3NpemU7CS8qIHRvdGFsIHNpemUgb2YgcXVldWUgKDMyLTEwMjQpICovCisJdW5zaWduZWQgaW50IHJlc2VydmVkMDsJCS8qIHJlc2VydmVkLCB3YXM6IGZhaWx1cmUgbG9jYXRpb25zICovCisJdW5zaWduZWQgaW50IGZpbHRlcjsJCS8qIGV2ZW50IGZpbHRlciAoYml0bWFzayBvZiBTTkRSVl9USU1FUl9FVkVOVF8qKSAqLworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbNjBdOwkvKiByZXNlcnZlZCAqLworfTsKKworc3RydWN0IHNuZF90aW1lcl9zdGF0dXMgeworCXN0cnVjdCB0aW1lc3BlYyB0c3RhbXA7CQkvKiBUaW1lc3RhbXAgLSBsYXN0IHVwZGF0ZSAqLworCXVuc2lnbmVkIGludCByZXNvbHV0aW9uOwkvKiBjdXJyZW50IHBlcmlvZCByZXNvbHV0aW9uIGluIG5zICovCisJdW5zaWduZWQgaW50IGxvc3Q7CQkvKiBjb3VudGVyIG9mIG1hc3RlciB0aWNrIGxvc3QgKi8KKwl1bnNpZ25lZCBpbnQgb3ZlcnJ1bjsJCS8qIGNvdW50IG9mIHJlYWQgcXVldWUgb3ZlcnJ1bnMgKi8KKwl1bnNpZ25lZCBpbnQgcXVldWU7CQkvKiB1c2VkIHF1ZXVlIHNpemUgKi8KKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzY0XTsJLyogcmVzZXJ2ZWQgKi8KK307CisKKyNkZWZpbmUgU05EUlZfVElNRVJfSU9DVExfUFZFUlNJT04JX0lPUignVCcsIDB4MDAsIGludCkKKyNkZWZpbmUgU05EUlZfVElNRVJfSU9DVExfTkVYVF9ERVZJQ0UJX0lPV1IoJ1QnLCAweDAxLCBzdHJ1Y3Qgc25kX3RpbWVyX2lkKQorI2RlZmluZSBTTkRSVl9USU1FUl9JT0NUTF9UUkVBRAkJX0lPVygnVCcsIDB4MDIsIGludCkKKyNkZWZpbmUgU05EUlZfVElNRVJfSU9DVExfR0lORk8JCV9JT1dSKCdUJywgMHgwMywgc3RydWN0IHNuZF90aW1lcl9naW5mbykKKyNkZWZpbmUgU05EUlZfVElNRVJfSU9DVExfR1BBUkFNUwlfSU9XKCdUJywgMHgwNCwgc3RydWN0IHNuZF90aW1lcl9ncGFyYW1zKQorI2RlZmluZSBTTkRSVl9USU1FUl9JT0NUTF9HU1RBVFVTCV9JT1dSKCdUJywgMHgwNSwgc3RydWN0IHNuZF90aW1lcl9nc3RhdHVzKQorI2RlZmluZSBTTkRSVl9USU1FUl9JT0NUTF9TRUxFQ1QJX0lPVygnVCcsIDB4MTAsIHN0cnVjdCBzbmRfdGltZXJfc2VsZWN0KQorI2RlZmluZSBTTkRSVl9USU1FUl9JT0NUTF9JTkZPCQlfSU9SKCdUJywgMHgxMSwgc3RydWN0IHNuZF90aW1lcl9pbmZvKQorI2RlZmluZSBTTkRSVl9USU1FUl9JT0NUTF9QQVJBTVMJX0lPVygnVCcsIDB4MTIsIHN0cnVjdCBzbmRfdGltZXJfcGFyYW1zKQorI2RlZmluZSBTTkRSVl9USU1FUl9JT0NUTF9TVEFUVVMJX0lPUignVCcsIDB4MTQsIHN0cnVjdCBzbmRfdGltZXJfc3RhdHVzKQorLyogVGhlIGZvbGxvd2luZyBmb3VyIGlvY3RscyBhcmUgY2hhbmdlZCBzaW5jZSAxLjAuOSBkdWUgdG8gY29uZmxpY3Rpb24gKi8KKyNkZWZpbmUgU05EUlZfVElNRVJfSU9DVExfU1RBUlQJCV9JTygnVCcsIDB4YTApCisjZGVmaW5lIFNORFJWX1RJTUVSX0lPQ1RMX1NUT1AJCV9JTygnVCcsIDB4YTEpCisjZGVmaW5lIFNORFJWX1RJTUVSX0lPQ1RMX0NPTlRJTlVFCV9JTygnVCcsIDB4YTIpCisjZGVmaW5lIFNORFJWX1RJTUVSX0lPQ1RMX1BBVVNFCQlfSU8oJ1QnLCAweGEzKQorCitzdHJ1Y3Qgc25kX3RpbWVyX3JlYWQgeworCXVuc2lnbmVkIGludCByZXNvbHV0aW9uOworCXVuc2lnbmVkIGludCB0aWNrczsKK307CisKK2VudW0geworCVNORFJWX1RJTUVSX0VWRU5UX1JFU09MVVRJT04gPSAwLAkvKiB2YWwgPSByZXNvbHV0aW9uIGluIG5zICovCisJU05EUlZfVElNRVJfRVZFTlRfVElDSywJCQkvKiB2YWwgPSB0aWNrcyAqLworCVNORFJWX1RJTUVSX0VWRU5UX1NUQVJULAkJLyogdmFsID0gcmVzb2x1dGlvbiBpbiBucyAqLworCVNORFJWX1RJTUVSX0VWRU5UX1NUT1AsCQkJLyogdmFsID0gMCAqLworCVNORFJWX1RJTUVSX0VWRU5UX0NPTlRJTlVFLAkJLyogdmFsID0gcmVzb2x1dGlvbiBpbiBucyAqLworCVNORFJWX1RJTUVSX0VWRU5UX1BBVVNFLAkJLyogdmFsID0gMCAqLworCVNORFJWX1RJTUVSX0VWRU5UX0VBUkxZLAkJLyogdmFsID0gMCwgZWFybHkgZXZlbnQgKi8KKwlTTkRSVl9USU1FUl9FVkVOVF9TVVNQRU5ELAkJLyogdmFsID0gMCAqLworCVNORFJWX1RJTUVSX0VWRU5UX1JFU1VNRSwJCS8qIHZhbCA9IHJlc29sdXRpb24gaW4gbnMgKi8KKwkvKiBtYXN0ZXIgdGltZXIgZXZlbnRzIGZvciBzbGF2ZSB0aW1lciBpbnN0YW5jZXMgKi8KKwlTTkRSVl9USU1FUl9FVkVOVF9NU1RBUlQgPSBTTkRSVl9USU1FUl9FVkVOVF9TVEFSVCArIDEwLAorCVNORFJWX1RJTUVSX0VWRU5UX01TVE9QID0gU05EUlZfVElNRVJfRVZFTlRfU1RPUCArIDEwLAorCVNORFJWX1RJTUVSX0VWRU5UX01DT05USU5VRSA9IFNORFJWX1RJTUVSX0VWRU5UX0NPTlRJTlVFICsgMTAsCisJU05EUlZfVElNRVJfRVZFTlRfTVBBVVNFID0gU05EUlZfVElNRVJfRVZFTlRfUEFVU0UgKyAxMCwKKwlTTkRSVl9USU1FUl9FVkVOVF9NU1VTUEVORCA9IFNORFJWX1RJTUVSX0VWRU5UX1NVU1BFTkQgKyAxMCwKKwlTTkRSVl9USU1FUl9FVkVOVF9NUkVTVU1FID0gU05EUlZfVElNRVJfRVZFTlRfUkVTVU1FICsgMTAsCit9OworCitzdHJ1Y3Qgc25kX3RpbWVyX3RyZWFkIHsKKwlpbnQgZXZlbnQ7CisJc3RydWN0IHRpbWVzcGVjIHRzdGFtcDsKKwl1bnNpZ25lZCBpbnQgdmFsOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgU2VjdGlvbiBmb3IgZHJpdmVyIGNvbnRyb2wgaW50ZXJmYWNlIC0gL2Rldi9zbmQvY29udHJvbD8gICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFNORFJWX0NUTF9WRVJTSU9OCQlTTkRSVl9QUk9UT0NPTF9WRVJTSU9OKDIsIDAsIDcpCisKK3N0cnVjdCBzbmRfY3RsX2NhcmRfaW5mbyB7CisJaW50IGNhcmQ7CQkJLyogY2FyZCBudW1iZXIgKi8KKwlpbnQgcGFkOwkJCS8qIHJlc2VydmVkIGZvciBmdXR1cmUgKHdhcyB0eXBlKSAqLworCXVuc2lnbmVkIGNoYXIgaWRbMTZdOwkJLyogSUQgb2YgY2FyZCAodXNlciBzZWxlY3RhYmxlKSAqLworCXVuc2lnbmVkIGNoYXIgZHJpdmVyWzE2XTsJLyogRHJpdmVyIG5hbWUgKi8KKwl1bnNpZ25lZCBjaGFyIG5hbWVbMzJdOwkJLyogU2hvcnQgbmFtZSBvZiBzb3VuZGNhcmQgKi8KKwl1bnNpZ25lZCBjaGFyIGxvbmduYW1lWzgwXTsJLyogbmFtZSArIGluZm8gdGV4dCBhYm91dCBzb3VuZGNhcmQgKi8KKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkX1sxNl07CS8qIHJlc2VydmVkIGZvciBmdXR1cmUgKHdhcyBJRCBvZiBtaXhlcikgKi8KKwl1bnNpZ25lZCBjaGFyIG1peGVybmFtZVs4MF07CS8qIHZpc3VhbCBtaXhlciBpZGVudGlmaWNhdGlvbiAqLworCXVuc2lnbmVkIGNoYXIgY29tcG9uZW50c1sxMjhdOwkvKiBjYXJkIGNvbXBvbmVudHMgLyBmaW5lIGlkZW50aWZpY2F0aW9uLCBkZWxpbWl0ZWQgd2l0aCBvbmUgc3BhY2UgKEFDOTcgZXRjLi4pICovCit9OworCit0eXBlZGVmIGludCBfX2JpdHdpc2Ugc25kX2N0bF9lbGVtX3R5cGVfdDsKKyNkZWZpbmUJU05EUlZfQ1RMX0VMRU1fVFlQRV9OT05FCSgoc25kX2N0bF9lbGVtX3R5cGVfdCkgMCkgLyogaW52YWxpZCAqLworI2RlZmluZQlTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU4JKChzbmRfY3RsX2VsZW1fdHlwZV90KSAxKSAvKiBib29sZWFuIHR5cGUgKi8KKyNkZWZpbmUJU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSCSgoc25kX2N0bF9lbGVtX3R5cGVfdCkgMikgLyogaW50ZWdlciB0eXBlICovCisjZGVmaW5lCVNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRAkoKHNuZF9jdGxfZWxlbV90eXBlX3QpIDMpIC8qIGVudW1lcmF0ZWQgdHlwZSAqLworI2RlZmluZQlTTkRSVl9DVExfRUxFTV9UWVBFX0JZVEVTCSgoc25kX2N0bF9lbGVtX3R5cGVfdCkgNCkgLyogYnl0ZSBhcnJheSAqLworI2RlZmluZQlTTkRSVl9DVExfRUxFTV9UWVBFX0lFQzk1OAkoKHNuZF9jdGxfZWxlbV90eXBlX3QpIDUpIC8qIElFQzk1OCAoUy9QRElGKSBzZXR1cCAqLworI2RlZmluZQlTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI2NAkoKHNuZF9jdGxfZWxlbV90eXBlX3QpIDYpIC8qIDY0LWJpdCBpbnRlZ2VyIHR5cGUgKi8KKyNkZWZpbmUJU05EUlZfQ1RMX0VMRU1fVFlQRV9MQVNUCVNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjY0CisKK3R5cGVkZWYgaW50IF9fYml0d2lzZSBzbmRfY3RsX2VsZW1faWZhY2VfdDsKKyNkZWZpbmUJU05EUlZfQ1RMX0VMRU1fSUZBQ0VfQ0FSRAkoKHNuZF9jdGxfZWxlbV9pZmFjZV90KSAwKSAvKiBnbG9iYWwgY29udHJvbCAqLworI2RlZmluZQlTTkRSVl9DVExfRUxFTV9JRkFDRV9IV0RFUAkoKHNuZF9jdGxfZWxlbV9pZmFjZV90KSAxKSAvKiBoYXJkd2FyZSBkZXBlbmRlbnQgZGV2aWNlICovCisjZGVmaW5lCVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSCSgoc25kX2N0bF9lbGVtX2lmYWNlX3QpIDIpIC8qIHZpcnR1YWwgbWl4ZXIgZGV2aWNlICovCisjZGVmaW5lCVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTQkoKHNuZF9jdGxfZWxlbV9pZmFjZV90KSAzKSAvKiBQQ00gZGV2aWNlICovCisjZGVmaW5lCVNORFJWX0NUTF9FTEVNX0lGQUNFX1JBV01JREkJKChzbmRfY3RsX2VsZW1faWZhY2VfdCkgNCkgLyogUmF3TWlkaSBkZXZpY2UgKi8KKyNkZWZpbmUJU05EUlZfQ1RMX0VMRU1fSUZBQ0VfVElNRVIJKChzbmRfY3RsX2VsZW1faWZhY2VfdCkgNSkgLyogdGltZXIgZGV2aWNlICovCisjZGVmaW5lCVNORFJWX0NUTF9FTEVNX0lGQUNFX1NFUVVFTkNFUgkoKHNuZF9jdGxfZWxlbV9pZmFjZV90KSA2KSAvKiBzZXF1ZW5jZXIgY2xpZW50ICovCisjZGVmaW5lCVNORFJWX0NUTF9FTEVNX0lGQUNFX0xBU1QJU05EUlZfQ1RMX0VMRU1fSUZBQ0VfU0VRVUVOQ0VSCisKKyNkZWZpbmUgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQJCSgxPDwwKQorI2RlZmluZSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfV1JJVEUJCSgxPDwxKQorI2RlZmluZSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFCQkoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUR8U05EUlZfQ1RMX0VMRU1fQUNDRVNTX1dSSVRFKQorI2RlZmluZSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUJCSgxPDwyKQkvKiBjb250cm9sIHZhbHVlIG1heSBiZSBjaGFuZ2VkIHdpdGhvdXQgYSBub3RpZmljYXRpb24gKi8KKyNkZWZpbmUgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RJTUVTVEFNUAkJKDE8PDMpCS8qIHdoZW4gd2FzIGNvbnRyb2wgY2hhbmdlZCAqLworI2RlZmluZSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQJCSgxPDw0KQkvKiBUTFYgcmVhZCBpcyBwb3NzaWJsZSAqLworI2RlZmluZSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1dSSVRFCQkoMTw8NSkJLyogVExWIHdyaXRlIGlzIHBvc3NpYmxlICovCisjZGVmaW5lIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRFdSSVRFCShTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUR8U05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9XUklURSkKKyNkZWZpbmUgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9DT01NQU5ECSgxPDw2KQkvKiBUTFYgY29tbWFuZCBpcyBwb3NzaWJsZSAqLworI2RlZmluZSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkUJCSgxPDw4KQkvKiBjb250cm9sIGRvZXMgYWN0dWFsbHkgbm90aGluZywgYnV0IG1heSBiZSB1cGRhdGVkICovCisjZGVmaW5lIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19MT0NLCQkoMTw8OSkJLyogd3JpdGUgbG9jayAqLworI2RlZmluZSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfT1dORVIJCSgxPDwxMCkJLyogd3JpdGUgbG9jayBvd25lciAqLworI2RlZmluZSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX0NBTExCQUNLCSgxPDwyOCkJLyoga2VybmVsIHVzZSBhIFRMViBjYWxsYmFjayAqLyAKKyNkZWZpbmUgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1VTRVIJCSgxPDwyOSkgLyogdXNlciBzcGFjZSBlbGVtZW50ICovCisvKiBiaXRzIDMwIGFuZCAzMSBhcmUgb2Jzb2xldGVkIChmb3IgaW5kaXJlY3QgYWNjZXNzKSAqLworCisvKiBmb3IgZnVydGhlciBkZXRhaWxzIHNlZSB0aGUgQUNQSSBhbmQgUENJIHBvd2VyIG1hbmFnZW1lbnQgc3BlY2lmaWNhdGlvbiAqLworI2RlZmluZSBTTkRSVl9DVExfUE9XRVJfRDAJCTB4MDAwMAkvKiBmdWxsIE9uICovCisjZGVmaW5lIFNORFJWX0NUTF9QT1dFUl9EMQkJMHgwMTAwCS8qIHBhcnRpYWwgT24gKi8KKyNkZWZpbmUgU05EUlZfQ1RMX1BPV0VSX0QyCQkweDAyMDAJLyogcGFydGlhbCBPbiAqLworI2RlZmluZSBTTkRSVl9DVExfUE9XRVJfRDMJCTB4MDMwMAkvKiBPZmYgKi8KKyNkZWZpbmUgU05EUlZfQ1RMX1BPV0VSX0QzaG90CQkoU05EUlZfQ1RMX1BPV0VSX0QzfDB4MDAwMCkJLyogT2ZmLCB3aXRoIHBvd2VyICovCisjZGVmaW5lIFNORFJWX0NUTF9QT1dFUl9EM2NvbGQJCShTTkRSVl9DVExfUE9XRVJfRDN8MHgwMDAxKQkvKiBPZmYsIHdpdGhvdXQgcG93ZXIgKi8KKworc3RydWN0IHNuZF9jdGxfZWxlbV9pZCB7CisJdW5zaWduZWQgaW50IG51bWlkOwkJLyogbnVtZXJpYyBpZGVudGlmaWVyLCB6ZXJvID0gaW52YWxpZCAqLworCXNuZF9jdGxfZWxlbV9pZmFjZV90IGlmYWNlOwkvKiBpbnRlcmZhY2UgaWRlbnRpZmllciAqLworCXVuc2lnbmVkIGludCBkZXZpY2U7CQkvKiBkZXZpY2UvY2xpZW50IG51bWJlciAqLworCXVuc2lnbmVkIGludCBzdWJkZXZpY2U7CQkvKiBzdWJkZXZpY2UgKHN1YnN0cmVhbSkgbnVtYmVyICovCisJdW5zaWduZWQgY2hhciBuYW1lWzQ0XTsJCS8qIEFTQ0lJIG5hbWUgb2YgaXRlbSAqLworCXVuc2lnbmVkIGludCBpbmRleDsJCS8qIGluZGV4IG9mIGl0ZW0gKi8KK307CisKK3N0cnVjdCBzbmRfY3RsX2VsZW1fbGlzdCB7CisJdW5zaWduZWQgaW50IG9mZnNldDsJCS8qIFc6IGZpcnN0IGVsZW1lbnQgSUQgdG8gZ2V0ICovCisJdW5zaWduZWQgaW50IHNwYWNlOwkJLyogVzogY291bnQgb2YgZWxlbWVudCBJRHMgdG8gZ2V0ICovCisJdW5zaWduZWQgaW50IHVzZWQ7CQkvKiBSOiBjb3VudCBvZiBlbGVtZW50IElEcyBzZXQgKi8KKwl1bnNpZ25lZCBpbnQgY291bnQ7CQkvKiBSOiBjb3VudCBvZiBhbGwgZWxlbWVudHMgKi8KKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2lkICpwaWRzOyAvKiBSOiBJRHMgKi8KKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzUwXTsKK307CisKK3N0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyB7CisJc3RydWN0IHNuZF9jdGxfZWxlbV9pZCBpZDsJLyogVzogZWxlbWVudCBJRCAqLworCXNuZF9jdGxfZWxlbV90eXBlX3QgdHlwZTsJLyogUjogdmFsdWUgdHlwZSAtIFNORFJWX0NUTF9FTEVNX1RZUEVfKiAqLworCXVuc2lnbmVkIGludCBhY2Nlc3M7CQkvKiBSOiB2YWx1ZSBhY2Nlc3MgKGJpdG1hc2spIC0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTXyogKi8KKwl1bnNpZ25lZCBpbnQgY291bnQ7CQkvKiBjb3VudCBvZiB2YWx1ZXMgKi8KKwlfX2tlcm5lbF9waWRfdCBvd25lcjsJCS8qIG93bmVyJ3MgUElEIG9mIHRoaXMgY29udHJvbCAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCWxvbmcgbWluOwkJLyogUjogbWluaW11bSB2YWx1ZSAqLworCQkJbG9uZyBtYXg7CQkvKiBSOiBtYXhpbXVtIHZhbHVlICovCisJCQlsb25nIHN0ZXA7CQkvKiBSOiBzdGVwICgwIHZhcmlhYmxlKSAqLworCQl9IGludGVnZXI7CisJCXN0cnVjdCB7CisJCQlsb25nIGxvbmcgbWluOwkJLyogUjogbWluaW11bSB2YWx1ZSAqLworCQkJbG9uZyBsb25nIG1heDsJCS8qIFI6IG1heGltdW0gdmFsdWUgKi8KKwkJCWxvbmcgbG9uZyBzdGVwOwkJLyogUjogc3RlcCAoMCB2YXJpYWJsZSkgKi8KKwkJfSBpbnRlZ2VyNjQ7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBpbnQgaXRlbXM7CS8qIFI6IG51bWJlciBvZiBpdGVtcyAqLworCQkJdW5zaWduZWQgaW50IGl0ZW07CS8qIFc6IGl0ZW0gbnVtYmVyICovCisJCQljaGFyIG5hbWVbNjRdOwkJLyogUjogdmFsdWUgbmFtZSAqLworCQkJX191NjQgbmFtZXNfcHRyOwkvKiBXOiBuYW1lcyBsaXN0IChFTEVNX0FERCBvbmx5KSAqLworCQkJdW5zaWduZWQgaW50IG5hbWVzX2xlbmd0aDsKKwkJfSBlbnVtZXJhdGVkOworCQl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzEyOF07CisJfSB2YWx1ZTsKKwl1bmlvbiB7CisJCXVuc2lnbmVkIHNob3J0IGRbNF07CQkvKiBkaW1lbnNpb25zICovCisJCXVuc2lnbmVkIHNob3J0ICpkX3B0cjsJCS8qIGluZGlyZWN0IC0gb2Jzb2xldGVkICovCisJfSBkaW1lbjsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzY0LTQqc2l6ZW9mKHVuc2lnbmVkIHNob3J0KV07Cit9OworCitzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlIHsKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2lkIGlkOwkvKiBXOiBlbGVtZW50IElEICovCisJdW5zaWduZWQgaW50IGluZGlyZWN0OiAxOwkvKiBXOiBpbmRpcmVjdCBhY2Nlc3MgLSBvYnNvbGV0ZWQgKi8KKwl1bmlvbiB7CisJCXVuaW9uIHsKKwkJCWxvbmcgdmFsdWVbMTI4XTsKKwkJCWxvbmcgKnZhbHVlX3B0cjsJLyogb2Jzb2xldGVkICovCisJCX0gaW50ZWdlcjsKKwkJdW5pb24geworCQkJbG9uZyBsb25nIHZhbHVlWzY0XTsKKwkJCWxvbmcgbG9uZyAqdmFsdWVfcHRyOwkvKiBvYnNvbGV0ZWQgKi8KKwkJfSBpbnRlZ2VyNjQ7CisJCXVuaW9uIHsKKwkJCXVuc2lnbmVkIGludCBpdGVtWzEyOF07CisJCQl1bnNpZ25lZCBpbnQgKml0ZW1fcHRyOwkvKiBvYnNvbGV0ZWQgKi8KKwkJfSBlbnVtZXJhdGVkOworCQl1bmlvbiB7CisJCQl1bnNpZ25lZCBjaGFyIGRhdGFbNTEyXTsKKwkJCXVuc2lnbmVkIGNoYXIgKmRhdGFfcHRyOwkvKiBvYnNvbGV0ZWQgKi8KKwkJfSBieXRlczsKKwkJc3RydWN0IHNuZF9hZXNfaWVjOTU4IGllYzk1ODsKKwl9IHZhbHVlOwkJLyogUk8gKi8KKwlzdHJ1Y3QgdGltZXNwZWMgdHN0YW1wOworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbMTI4LXNpemVvZihzdHJ1Y3QgdGltZXNwZWMpXTsKK307CisKK3N0cnVjdCBzbmRfY3RsX3RsdiB7CisJdW5zaWduZWQgaW50IG51bWlkOwkvKiBjb250cm9sIGVsZW1lbnQgbnVtZXJpYyBpZGVudGlmaWNhdGlvbiAqLworCXVuc2lnbmVkIGludCBsZW5ndGg7CS8qIGluIGJ5dGVzIGFsaWduZWQgdG8gNCAqLworCXVuc2lnbmVkIGludCB0bHZbMF07CS8qIGZpcnN0IFRMViAqLworfTsKKworI2RlZmluZSBTTkRSVl9DVExfSU9DVExfUFZFUlNJT04JX0lPUignVScsIDB4MDAsIGludCkKKyNkZWZpbmUgU05EUlZfQ1RMX0lPQ1RMX0NBUkRfSU5GTwlfSU9SKCdVJywgMHgwMSwgc3RydWN0IHNuZF9jdGxfY2FyZF9pbmZvKQorI2RlZmluZSBTTkRSVl9DVExfSU9DVExfRUxFTV9MSVNUCV9JT1dSKCdVJywgMHgxMCwgc3RydWN0IHNuZF9jdGxfZWxlbV9saXN0KQorI2RlZmluZSBTTkRSVl9DVExfSU9DVExfRUxFTV9JTkZPCV9JT1dSKCdVJywgMHgxMSwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvKQorI2RlZmluZSBTTkRSVl9DVExfSU9DVExfRUxFTV9SRUFECV9JT1dSKCdVJywgMHgxMiwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSkKKyNkZWZpbmUgU05EUlZfQ1RMX0lPQ1RMX0VMRU1fV1JJVEUJX0lPV1IoJ1UnLCAweDEzLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlKQorI2RlZmluZSBTTkRSVl9DVExfSU9DVExfRUxFTV9MT0NLCV9JT1coJ1UnLCAweDE0LCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2lkKQorI2RlZmluZSBTTkRSVl9DVExfSU9DVExfRUxFTV9VTkxPQ0sJX0lPVygnVScsIDB4MTUsIHN0cnVjdCBzbmRfY3RsX2VsZW1faWQpCisjZGVmaW5lIFNORFJWX0NUTF9JT0NUTF9TVUJTQ1JJQkVfRVZFTlRTIF9JT1dSKCdVJywgMHgxNiwgaW50KQorI2RlZmluZSBTTkRSVl9DVExfSU9DVExfRUxFTV9BREQJX0lPV1IoJ1UnLCAweDE3LCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8pCisjZGVmaW5lIFNORFJWX0NUTF9JT0NUTF9FTEVNX1JFUExBQ0UJX0lPV1IoJ1UnLCAweDE4LCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8pCisjZGVmaW5lIFNORFJWX0NUTF9JT0NUTF9FTEVNX1JFTU9WRQlfSU9XUignVScsIDB4MTksIHN0cnVjdCBzbmRfY3RsX2VsZW1faWQpCisjZGVmaW5lIFNORFJWX0NUTF9JT0NUTF9UTFZfUkVBRAlfSU9XUignVScsIDB4MWEsIHN0cnVjdCBzbmRfY3RsX3RsdikKKyNkZWZpbmUgU05EUlZfQ1RMX0lPQ1RMX1RMVl9XUklURQlfSU9XUignVScsIDB4MWIsIHN0cnVjdCBzbmRfY3RsX3RsdikKKyNkZWZpbmUgU05EUlZfQ1RMX0lPQ1RMX1RMVl9DT01NQU5ECV9JT1dSKCdVJywgMHgxYywgc3RydWN0IHNuZF9jdGxfdGx2KQorI2RlZmluZSBTTkRSVl9DVExfSU9DVExfSFdERVBfTkVYVF9ERVZJQ0UgX0lPV1IoJ1UnLCAweDIwLCBpbnQpCisjZGVmaW5lIFNORFJWX0NUTF9JT0NUTF9IV0RFUF9JTkZPCV9JT1IoJ1UnLCAweDIxLCBzdHJ1Y3Qgc25kX2h3ZGVwX2luZm8pCisjZGVmaW5lIFNORFJWX0NUTF9JT0NUTF9QQ01fTkVYVF9ERVZJQ0UJX0lPUignVScsIDB4MzAsIGludCkKKyNkZWZpbmUgU05EUlZfQ1RMX0lPQ1RMX1BDTV9JTkZPCV9JT1dSKCdVJywgMHgzMSwgc3RydWN0IHNuZF9wY21faW5mbykKKyNkZWZpbmUgU05EUlZfQ1RMX0lPQ1RMX1BDTV9QUkVGRVJfU1VCREVWSUNFIF9JT1coJ1UnLCAweDMyLCBpbnQpCisjZGVmaW5lIFNORFJWX0NUTF9JT0NUTF9SQVdNSURJX05FWFRfREVWSUNFIF9JT1dSKCdVJywgMHg0MCwgaW50KQorI2RlZmluZSBTTkRSVl9DVExfSU9DVExfUkFXTUlESV9JTkZPCV9JT1dSKCdVJywgMHg0MSwgc3RydWN0IHNuZF9yYXdtaWRpX2luZm8pCisjZGVmaW5lIFNORFJWX0NUTF9JT0NUTF9SQVdNSURJX1BSRUZFUl9TVUJERVZJQ0UgX0lPVygnVScsIDB4NDIsIGludCkKKyNkZWZpbmUgU05EUlZfQ1RMX0lPQ1RMX1BPV0VSCQlfSU9XUignVScsIDB4ZDAsIGludCkKKyNkZWZpbmUgU05EUlZfQ1RMX0lPQ1RMX1BPV0VSX1NUQVRFCV9JT1IoJ1UnLCAweGQxLCBpbnQpCisKKy8qCisgKiAgUmVhZCBpbnRlcmZhY2UuCisgKi8KKworZW51bSBzbmRydl9jdGxfZXZlbnRfdHlwZSB7CisJU05EUlZfQ1RMX0VWRU5UX0VMRU0gPSAwLAorCVNORFJWX0NUTF9FVkVOVF9MQVNUID0gU05EUlZfQ1RMX0VWRU5UX0VMRU0sCit9OworCisjZGVmaW5lIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFCSgxPDwwKQkvKiBlbGVtZW50IHZhbHVlIHdhcyBjaGFuZ2VkICovCisjZGVmaW5lIFNORFJWX0NUTF9FVkVOVF9NQVNLX0lORk8JKDE8PDEpCS8qIGVsZW1lbnQgaW5mbyB3YXMgY2hhbmdlZCAqLworI2RlZmluZSBTTkRSVl9DVExfRVZFTlRfTUFTS19BREQJKDE8PDIpCS8qIGVsZW1lbnQgd2FzIGFkZGVkICovCisjZGVmaW5lIFNORFJWX0NUTF9FVkVOVF9NQVNLX1RMVgkoMTw8MykJLyogZWxlbWVudCBUTFYgdHJlZSB3YXMgY2hhbmdlZCAqLworI2RlZmluZSBTTkRSVl9DVExfRVZFTlRfTUFTS19SRU1PVkUJKH4wVSkJLyogZWxlbWVudCB3YXMgcmVtb3ZlZCAqLworCitzdHJ1Y3Qgc25kX2N0bF9ldmVudCB7CisJaW50IHR5cGU7CS8qIGV2ZW50IHR5cGUgLSBTTkRSVl9DVExfRVZFTlRfKiAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGludCBtYXNrOworCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pZCBpZDsKKwkJfSBlbGVtOworCQl1bnNpZ25lZCBjaGFyIGRhdGE4WzYwXTsKKwl9IGRhdGE7Cit9OworCisvKgorICogIENvbnRyb2wgbmFtZXMKKyAqLworCisjZGVmaW5lIFNORFJWX0NUTF9OQU1FX05PTkUJCQkJIiIKKyNkZWZpbmUgU05EUlZfQ1RMX05BTUVfUExBWUJBQ0sJCQkJIlBsYXliYWNrICIKKyNkZWZpbmUgU05EUlZfQ1RMX05BTUVfQ0FQVFVSRQkJCQkiQ2FwdHVyZSAiCisKKyNkZWZpbmUgU05EUlZfQ1RMX05BTUVfSUVDOTU4X05PTkUJCQkiIgorI2RlZmluZSBTTkRSVl9DVExfTkFNRV9JRUM5NThfU1dJVENICQkJIlN3aXRjaCIKKyNkZWZpbmUgU05EUlZfQ1RMX05BTUVfSUVDOTU4X1ZPTFVNRQkJCSJWb2x1bWUiCisjZGVmaW5lIFNORFJWX0NUTF9OQU1FX0lFQzk1OF9ERUZBVUxUCQkJIkRlZmF1bHQiCisjZGVmaW5lIFNORFJWX0NUTF9OQU1FX0lFQzk1OF9NQVNLCQkJIk1hc2siCisjZGVmaW5lIFNORFJWX0NUTF9OQU1FX0lFQzk1OF9DT05fTUFTSwkJCSJDb24gTWFzayIKKyNkZWZpbmUgU05EUlZfQ1RMX05BTUVfSUVDOTU4X1BST19NQVNLCQkJIlBybyBNYXNrIgorI2RlZmluZSBTTkRSVl9DVExfTkFNRV9JRUM5NThfUENNX1NUUkVBTQkJIlBDTSBTdHJlYW0iCisjZGVmaW5lIFNORFJWX0NUTF9OQU1FX0lFQzk1OChleHBsLGRpcmVjdGlvbix3aGF0KQkiSUVDOTU4ICIgZXhwbCBTTkRSVl9DVExfTkFNRV8jI2RpcmVjdGlvbiBTTkRSVl9DVExfTkFNRV9JRUM5NThfIyN3aGF0CisKKyNlbmRpZiAvKiBfX1NPVU5EX0FTT1VORF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3NvdW5kL2Fzb3VuZF9mbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zb3VuZC9hc291bmRfZm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmE0Yjk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zb3VuZC9hc291bmRfZm0uaApAQCAtMCwwICsxLDEzNCBAQAorI2lmbmRlZiBfX1NPVU5EX0FTT1VORF9GTV9ICisjZGVmaW5lIF9fU09VTkRfQVNPVU5EX0ZNX0gKKworLyoKKyAqICBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUgLSBBTFNBCisgKgorICogIEludGVyZmFjZSBmaWxlIGJldHdlZW4gQUxTQSBkcml2ZXIgJiB1c2VyIHNwYWNlCisgKiAgQ29weXJpZ2h0IChjKSAxOTk0LTk4IGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICA0RnJvbnQgVGVjaG5vbG9naWVzCisgKgorICogIERpcmVjdCBGTSBjb250cm9sCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjZGVmaW5lIFNORFJWX0RNX0ZNX01PREVfT1BMMgkweDAwCisjZGVmaW5lIFNORFJWX0RNX0ZNX01PREVfT1BMMwkweDAxCisKK3N0cnVjdCBzbmRfZG1fZm1faW5mbyB7CisJdW5zaWduZWQgY2hhciBmbV9tb2RlOwkJLyogT1BMIG1vZGUsIHNlZSBTTkRSVl9ETV9GTV9NT0RFX1hYWCAqLworCXVuc2lnbmVkIGNoYXIgcmh5dGhtOwkJLyogcGVyY3Vzc2lvbiBtb2RlIGZsYWcgKi8KK307CisKKy8qCisgKiAgRGF0YSBzdHJ1Y3R1cmUgY29tcG9zaW5nIGFuIEZNICJub3RlIiBvciBzb3VuZCBldmVudC4KKyAqLworCitzdHJ1Y3Qgc25kX2RtX2ZtX3ZvaWNlIHsKKwl1bnNpZ25lZCBjaGFyIG9wOwkJLyogb3BlcmF0b3IgY2VsbCAoMCBvciAxKSAqLworCXVuc2lnbmVkIGNoYXIgdm9pY2U7CQkvKiBGTSB2b2ljZSAoMCB0byAxNykgKi8KKworCXVuc2lnbmVkIGNoYXIgYW07CQkvKiBhbXBsaXR1ZGUgbW9kdWxhdGlvbiAqLworCXVuc2lnbmVkIGNoYXIgdmlicmF0bzsJCS8qIHZpYnJhdG8gZWZmZWN0ICovCisJdW5zaWduZWQgY2hhciBkb19zdXN0YWluOwkvKiBzdXN0YWluIHBoYXNlICovCisJdW5zaWduZWQgY2hhciBrYmRfc2NhbGU7CS8qIGtleWJvYXJkIHNjYWxpbmcgKi8KKwl1bnNpZ25lZCBjaGFyIGhhcm1vbmljOwkJLyogNCBiaXRzOiBoYXJtb25pYyBhbmQgbXVsdGlwbGllciAqLworCXVuc2lnbmVkIGNoYXIgc2NhbGVfbGV2ZWw7CS8qIDIgYml0czogZGVjcmVhc2Ugb3V0cHV0IGZyZXEgcmlzZXMgKi8KKwl1bnNpZ25lZCBjaGFyIHZvbHVtZTsJCS8qIDYgYml0czogdm9sdW1lICovCisKKwl1bnNpZ25lZCBjaGFyIGF0dGFjazsJCS8qIDQgYml0czogYXR0YWNrIHJhdGUgKi8KKwl1bnNpZ25lZCBjaGFyIGRlY2F5OwkJLyogNCBiaXRzOiBkZWNheSByYXRlICovCisJdW5zaWduZWQgY2hhciBzdXN0YWluOwkJLyogNCBiaXRzOiBzdXN0YWluIGxldmVsICovCisJdW5zaWduZWQgY2hhciByZWxlYXNlOwkJLyogNCBiaXRzOiByZWxlYXNlIHJhdGUgKi8KKworCXVuc2lnbmVkIGNoYXIgZmVlZGJhY2s7CQkvKiAzIGJpdHM6IGZlZWRiYWNrIGZvciBvcDAgKi8KKwl1bnNpZ25lZCBjaGFyIGNvbm5lY3Rpb247CS8qIDAgZm9yIHNlcmlhbCwgMSBmb3IgcGFyYWxsZWwgKi8KKwl1bnNpZ25lZCBjaGFyIGxlZnQ7CQkvKiBzdGVyZW8gbGVmdCAqLworCXVuc2lnbmVkIGNoYXIgcmlnaHQ7CQkvKiBzdGVyZW8gcmlnaHQgKi8KKwl1bnNpZ25lZCBjaGFyIHdhdmVmb3JtOwkJLyogMyBiaXRzOiB3YXZlZm9ybSBzaGFwZSAqLworfTsKKworLyoKKyAqICBUaGlzIGRlc2NyaWJlcyBhbiBGTSBub3RlIGJ5IGl0cyB2b2ljZSwgb2N0YXZlLCBmcmVxdWVuY3kgbnVtYmVyICgxMGJpdCkKKyAqICBhbmQga2V5IG9uL29mZi4KKyAqLworCitzdHJ1Y3Qgc25kX2RtX2ZtX25vdGUgeworCXVuc2lnbmVkIGNoYXIgdm9pY2U7CS8qIDAtMTcgdm9pY2UgY2hhbm5lbCAqLworCXVuc2lnbmVkIGNoYXIgb2N0YXZlOwkvKiAzIGJpdHM6IHdoYXQgb2N0YXZlIHRvIHBsYXkgKi8KKwl1bnNpZ25lZCBpbnQgZm51bTsJLyogMTAgYml0czogZnJlcXVlbmN5IG51bWJlciAqLworCXVuc2lnbmVkIGNoYXIga2V5X29uOwkvKiBzZXQgZm9yIGFjdGl2ZSwgY2xlYXIgZm9yIHNpbGVudCAqLworfTsKKworLyoKKyAqICBGTSBwYXJhbWV0ZXJzIHRoYXQgYXBwbHkgZ2xvYmFsbHkgdG8gYWxsIHZvaWNlcywgYW5kIHRodXMgYXJlIG5vdCAibm90ZXMiCisgKi8KKworc3RydWN0IHNuZF9kbV9mbV9wYXJhbXMgeworCXVuc2lnbmVkIGNoYXIgYW1fZGVwdGg7CQkvKiBhbXBsaXR1ZGUgbW9kdWxhdGlvbiBkZXB0aCAoMT1oaSkgKi8KKwl1bnNpZ25lZCBjaGFyIHZpYl9kZXB0aDsJLyogdmlicmF0byBkZXB0aCAoMT1oaSkgKi8KKwl1bnNpZ25lZCBjaGFyIGtiZF9zcGxpdDsJLyoga2V5Ym9hcmQgc3BsaXQgKi8KKwl1bnNpZ25lZCBjaGFyIHJoeXRobTsJCS8qIHBlcmN1c3Npb24gbW9kZSBzZWxlY3QgKi8KKworCS8qIFRoaXMgYmxvY2sgaXMgdGhlIHBlcmN1c3Npb24gaW5zdHJ1bWVudCBkYXRhICovCisJdW5zaWduZWQgY2hhciBiYXNzOworCXVuc2lnbmVkIGNoYXIgc25hcmU7CisJdW5zaWduZWQgY2hhciB0b210b207CisJdW5zaWduZWQgY2hhciBjeW1iYWw7CisJdW5zaWduZWQgY2hhciBoaWhhdDsKK307CisKKy8qCisgKiAgRk0gbW9kZSBpb2N0bCBzZXR0aW5ncworICovCisKKyNkZWZpbmUgU05EUlZfRE1fRk1fSU9DVExfSU5GTwkJX0lPUignSCcsIDB4MjAsIHN0cnVjdCBzbmRfZG1fZm1faW5mbykKKyNkZWZpbmUgU05EUlZfRE1fRk1fSU9DVExfUkVTRVQJCV9JTyAoJ0gnLCAweDIxKQorI2RlZmluZSBTTkRSVl9ETV9GTV9JT0NUTF9QTEFZX05PVEUJX0lPVygnSCcsIDB4MjIsIHN0cnVjdCBzbmRfZG1fZm1fbm90ZSkKKyNkZWZpbmUgU05EUlZfRE1fRk1fSU9DVExfU0VUX1ZPSUNFCV9JT1coJ0gnLCAweDIzLCBzdHJ1Y3Qgc25kX2RtX2ZtX3ZvaWNlKQorI2RlZmluZSBTTkRSVl9ETV9GTV9JT0NUTF9TRVRfUEFSQU1TCV9JT1coJ0gnLCAweDI0LCBzdHJ1Y3Qgc25kX2RtX2ZtX3BhcmFtcykKKyNkZWZpbmUgU05EUlZfRE1fRk1fSU9DVExfU0VUX01PREUJX0lPVygnSCcsIDB4MjUsIGludCkKKy8qIGZvciBPUEwzIG9ubHkgKi8KKyNkZWZpbmUgU05EUlZfRE1fRk1fSU9DVExfU0VUX0NPTk5FQ1RJT04JX0lPVygnSCcsIDB4MjYsIGludCkKKy8qIFNCSSBwYXRjaCBtYW5hZ2VtZW50ICovCisjZGVmaW5lIFNORFJWX0RNX0ZNX0lPQ1RMX0NMRUFSX1BBVENIRVMJX0lPICgnSCcsIDB4NDApCisKKyNkZWZpbmUgU05EUlZfRE1fRk1fT1NTX0lPQ1RMX1JFU0VUCQkweDIwCisjZGVmaW5lIFNORFJWX0RNX0ZNX09TU19JT0NUTF9QTEFZX05PVEUJCTB4MjEKKyNkZWZpbmUgU05EUlZfRE1fRk1fT1NTX0lPQ1RMX1NFVF9WT0lDRQkJMHgyMgorI2RlZmluZSBTTkRSVl9ETV9GTV9PU1NfSU9DVExfU0VUX1BBUkFNUwkweDIzCisjZGVmaW5lIFNORFJWX0RNX0ZNX09TU19JT0NUTF9TRVRfTU9ERQkJMHgyNAorI2RlZmluZSBTTkRSVl9ETV9GTV9PU1NfSU9DVExfU0VUX09QTAkJMHgyNQorCisvKgorICogUGF0Y2ggUmVjb3JkIC0gZml4ZWQgc2l6ZSBmb3Igd3JpdGUKKyAqLworCisjZGVmaW5lIEZNX0tFWV9TQkkJIlNCSVwwMzIiCisjZGVmaW5lIEZNX0tFWV8yT1AJIjJPUFwwMzIiCisjZGVmaW5lIEZNX0tFWV80T1AJIjRPUFwwMzIiCisKK3N0cnVjdCBzYmlfcGF0Y2ggeworCXVuc2lnbmVkIGNoYXIgcHJvZzsKKwl1bnNpZ25lZCBjaGFyIGJhbms7CisJY2hhciBrZXlbNF07CisJY2hhciBuYW1lWzI1XTsKKwljaGFyIGV4dGVuc2lvbls3XTsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbMzJdOworfTsKKworI2VuZGlmIC8qIF9fU09VTkRfQVNPVU5EX0ZNX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc291bmQvZW11MTBrMS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zb3VuZC9lbXUxMGsxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyNGE4NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc291bmQvZW11MTBrMS5oCkBAIC0wLDAgKzEsMzcxIEBACisjaWZuZGVmIF9fU09VTkRfRU1VMTBLMV9ICisjZGVmaW5lIF9fU09VTkRfRU1VMTBLMV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogIENvcHlyaWdodCAoYykgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4sCisgKgkJICAgICBDcmVhdGl2ZSBMYWJzLCBJbmMuCisgKiAgRGVmaW5pdGlvbnMgZm9yIEVNVTEwSzEgKFNCIExpdmUhKSBjaGlwcworICoKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKworLyoKKyAqIC0tLS0gRlg4MDEwIC0tLS0KKyAqLworCisjZGVmaW5lIEVNVTEwSzFfQ0FSRF9DUkVBVElWRQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRU1VMTBLMV9DQVJEX0VNVUFQUwkJCTB4MDAwMDAwMDEKKworI2RlZmluZSBFTVUxMEsxX0ZYODAxMF9QQ01fQ09VTlQJCTgKKworLyogaW5zdHJ1Y3Rpb24gc2V0ICovCisjZGVmaW5lIGlNQUMwCSAweDAwCS8qIFIgPSBBICsgKFggKiBZID4+IDMxKSAgIDsgc2F0dXJhdGlvbiAqLworI2RlZmluZSBpTUFDMQkgMHgwMQkvKiBSID0gQSArICgtWCAqIFkgPj4gMzEpICA7IHNhdHVyYXRpb24gKi8KKyNkZWZpbmUgaU1BQzIJIDB4MDIJLyogUiA9IEEgKyAoWCAqIFkgPj4gMzEpICAgOyB3cmFwYXJvdW5kICovCisjZGVmaW5lIGlNQUMzCSAweDAzCS8qIFIgPSBBICsgKC1YICogWSA+PiAzMSkgIDsgd3JhcGFyb3VuZCAqLworI2RlZmluZSBpTUFDSU5UMCAweDA0CS8qIFIgPSBBICsgWCAqIFkJICAgOyBzYXR1cmF0aW9uICovCisjZGVmaW5lIGlNQUNJTlQxIDB4MDUJLyogUiA9IEEgKyBYICogWQkgICA7IHdyYXBhcm91bmQgKDMxLWJpdCkgKi8KKyNkZWZpbmUgaUFDQzMJIDB4MDYJLyogUiA9IEEgKyBYICsgWQkgICA7IHNhdHVyYXRpb24gKi8KKyNkZWZpbmUgaU1BQ01WICAgMHgwNwkvKiBSID0gQSwgYWNjICs9IFggKiBZID4+IDMxICovCisjZGVmaW5lIGlBTkRYT1IgIDB4MDgJLyogUiA9IChBICYgWCkgXiBZICovCisjZGVmaW5lIGlUU1RORUcgIDB4MDkJLyogUiA9IChBID49IFkpID8gWCA6IH5YICovCisjZGVmaW5lIGlMSU1JVEdFIDB4MGEJLyogUiA9IChBID49IFkpID8gWCA6IFkgKi8KKyNkZWZpbmUgaUxJTUlUTFQgMHgwYgkvKiBSID0gKEEgPCBZKSA/IFggOiBZICovCisjZGVmaW5lIGlMT0cJIDB4MGMJLyogUiA9IGxpbmVhcl9kYXRhLCBBIChsb2dfZGF0YSksIFggKG1heF9leHApLCBZIChmb3JtYXRfd29yZCkgKi8KKyNkZWZpbmUgaUVYUAkgMHgwZAkvKiBSID0gbG9nX2RhdGEsIEEgKGxpbmVhcl9kYXRhKSwgWCAobWF4X2V4cCksIFkgKGZvcm1hdF93b3JkKSAqLworI2RlZmluZSBpSU5URVJQICAweDBlCS8qIFIgPSBBICsgKFggKiAoWSAtIEEpID4+IDMxKSAgOyBzYXR1cmF0aW9uICovCisjZGVmaW5lIGlTS0lQICAgIDB4MGYJLyogUiA9IEEgKGNjX3JlZyksIFggKGNvdW50KSwgWSAoY2NfdGVzdCkgKi8KKworLyogR1BScyAqLworI2RlZmluZSBGWEJVUyh4KQkoMHgwMCArICh4KSkJLyogeCA9IDB4MDAgLSAweDBmICovCisjZGVmaW5lIEVYVElOKHgpCSgweDEwICsgKHgpKQkvKiB4ID0gMHgwMCAtIDB4MGYgKi8KKyNkZWZpbmUgRVhUT1VUKHgpCSgweDIwICsgKHgpKQkvKiB4ID0gMHgwMCAtIDB4MGYgcGh5c2ljYWwgb3V0cyAtPiBGWFdDIGxvdyAxNiBiaXRzICovCisjZGVmaW5lIEZYQlVTMih4KQkoMHgzMCArICh4KSkJLyogeCA9IDB4MDAgLSAweDBmIGNvcGllcyBvZiBmeCBidXNlcyBmb3IgY2FwdHVyZSAtPiBGWFdDIGhpZ2ggMTYgYml0cyAqLworCQkJCQkvKiBOQjogMHgzMSBhbmQgMHgzMiBhcmUgc2hhcmVkIHdpdGggQ2VudGVyL0xGRSBvbiBTQiBsaXZlIDUuMSAqLworCisjZGVmaW5lIENfMDAwMDAwMDAJMHg0MAorI2RlZmluZSBDXzAwMDAwMDAxCTB4NDEKKyNkZWZpbmUgQ18wMDAwMDAwMgkweDQyCisjZGVmaW5lIENfMDAwMDAwMDMJMHg0MworI2RlZmluZSBDXzAwMDAwMDA0CTB4NDQKKyNkZWZpbmUgQ18wMDAwMDAwOAkweDQ1CisjZGVmaW5lIENfMDAwMDAwMTAJMHg0NgorI2RlZmluZSBDXzAwMDAwMDIwCTB4NDcKKyNkZWZpbmUgQ18wMDAwMDEwMAkweDQ4CisjZGVmaW5lIENfMDAwMTAwMDAJMHg0OQorI2RlZmluZSBDXzAwMDgwMDAwCTB4NGEKKyNkZWZpbmUgQ18xMDAwMDAwMAkweDRiCisjZGVmaW5lIENfMjAwMDAwMDAJMHg0YworI2RlZmluZSBDXzQwMDAwMDAwCTB4NGQKKyNkZWZpbmUgQ184MDAwMDAwMAkweDRlCisjZGVmaW5lIENfN2ZmZmZmZmYJMHg0ZgorI2RlZmluZSBDX2ZmZmZmZmZmCTB4NTAKKyNkZWZpbmUgQ19mZmZmZmZmZQkweDUxCisjZGVmaW5lIENfYzAwMDAwMDAJMHg1MgorI2RlZmluZSBDXzRmMWJiY2RjCTB4NTMKKyNkZWZpbmUgQ181YTdlZjlkYgkweDU0CisjZGVmaW5lIENfMDAxMDAwMDAJMHg1NQkJLyogPz8gKi8KKyNkZWZpbmUgR1BSX0FDQ1UJMHg1NgkJLyogQUNDVU0sIGFjY3VtdWxhdG9yICovCisjZGVmaW5lIEdQUl9DT05ECTB4NTcJCS8qIENDUiwgY29uZGl0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIEdQUl9OT0lTRTAJMHg1OAkJLyogbm9pc2Ugc291cmNlICovCisjZGVmaW5lIEdQUl9OT0lTRTEJMHg1OQkJLyogbm9pc2Ugc291cmNlICovCisjZGVmaW5lIEdQUl9JUlEJCTB4NWEJCS8qIElSUSByZWdpc3RlciAqLworI2RlZmluZSBHUFJfREJBQwkweDViCQkvKiBUUkFNIERlbGF5IEJhc2UgQWRkcmVzcyBDb3VudGVyICovCisjZGVmaW5lIEdQUih4KQkJKEZYR1BSRUdCQVNFICsgKHgpKSAvKiBmcmVlIEdQUnM6IHggPSAweDAwIC0gMHhmZiAqLworI2RlZmluZSBJVFJBTV9EQVRBKHgpCShUQU5LTUVNREFUQVJFR0JBU0UgKyAweDAwICsgKHgpKSAvKiB4ID0gMHgwMCAtIDB4N2YgKi8KKyNkZWZpbmUgRVRSQU1fREFUQSh4KQkoVEFOS01FTURBVEFSRUdCQVNFICsgMHg4MCArICh4KSkgLyogeCA9IDB4MDAgLSAweDFmICovCisjZGVmaW5lIElUUkFNX0FERFIoeCkJKFRBTktNRU1BRERSUkVHQkFTRSArIDB4MDAgKyAoeCkpIC8qIHggPSAweDAwIC0gMHg3ZiAqLworI2RlZmluZSBFVFJBTV9BRERSKHgpCShUQU5LTUVNQUREUlJFR0JBU0UgKyAweDgwICsgKHgpKSAvKiB4ID0gMHgwMCAtIDB4MWYgKi8KKworI2RlZmluZSBBX0lUUkFNX0RBVEEoeCkJKFRBTktNRU1EQVRBUkVHQkFTRSArIDB4MDAgKyAoeCkpIC8qIHggPSAweDAwIC0gMHhiZiAqLworI2RlZmluZSBBX0VUUkFNX0RBVEEoeCkJKFRBTktNRU1EQVRBUkVHQkFTRSArIDB4YzAgKyAoeCkpIC8qIHggPSAweDAwIC0gMHgzZiAqLworI2RlZmluZSBBX0lUUkFNX0FERFIoeCkJKFRBTktNRU1BRERSUkVHQkFTRSArIDB4MDAgKyAoeCkpIC8qIHggPSAweDAwIC0gMHhiZiAqLworI2RlZmluZSBBX0VUUkFNX0FERFIoeCkJKFRBTktNRU1BRERSUkVHQkFTRSArIDB4YzAgKyAoeCkpIC8qIHggPSAweDAwIC0gMHgzZiAqLworI2RlZmluZSBBX0lUUkFNX0NUTCh4KQkoQV9UQU5LTUVNQ1RMUkVHQkFTRSArIDB4MDAgKyAoeCkpIC8qIHggPSAweDAwIC0gMHhiZiAqLworI2RlZmluZSBBX0VUUkFNX0NUTCh4KQkoQV9UQU5LTUVNQ1RMUkVHQkFTRSArIDB4YzAgKyAoeCkpIC8qIHggPSAweDAwIC0gMHgzZiAqLworCisjZGVmaW5lIEFfRlhCVVMoeCkJKDB4MDAgKyAoeCkpCS8qIHggPSAweDAwIC0gMHgzZiBGWCBidXNlcyAqLworI2RlZmluZSBBX0VYVElOKHgpCSgweDQwICsgKHgpKQkvKiB4ID0gMHgwMCAtIDB4MGYgcGh5c2ljYWwgaW5zICovCisjZGVmaW5lIEFfUDE2VklOKHgpCSgweDUwICsgKHgpKQkvKiB4ID0gMHgwMCAtIDB4MGYgcDE2diBpbnMgKEEyIG9ubHkpICJFTVUzMiBpbnB1dHMiICovCisjZGVmaW5lIEFfRVhUT1VUKHgpCSgweDYwICsgKHgpKQkvKiB4ID0gMHgwMCAtIDB4MWYgcGh5c2ljYWwgb3V0cyAtPiBBX0ZYV0MxIDB4NzktN2YgdW5rbm93biAgICovCisjZGVmaW5lIEFfRlhCVVMyKHgpCSgweDgwICsgKHgpKQkvKiB4ID0gMHgwMCAtIDB4MWYgZXh0cmEgb3V0cyB1c2VkIGZvciBFRlggY2FwdHVyZSAtPiBBX0ZYV0MyICovCisjZGVmaW5lIEFfRU1VMzJPVVRIKHgpCSgweGEwICsgKHgpKQkvKiB4ID0gMHgwMCAtIDB4MGYgIkVNVTMyX09VVF8xMCAtIF8xRiIgLSA/Pz8gKi8KKyNkZWZpbmUgQV9FTVUzMk9VVEwoeCkJKDB4YjAgKyAoeCkpCS8qIHggPSAweDAwIC0gMHgwZiAiRU1VMzJfT1VUXzEgLSBfRiIgLSA/Pz8gKi8KKyNkZWZpbmUgQTNfRU1VMzJJTih4KQkoMHgxNjAgKyAoeCkpCS8qIHggPSAweDAwIC0gMHgzZiAiRU1VMzJfSU5fMDAgLSBfM0YiIC0gT25seSB3aGVuIC5kZXZpY2UgPSAweDAwMDggKi8KKyNkZWZpbmUgQTNfRU1VMzJPVVQoeCkJKDB4MUUwICsgKHgpKQkvKiB4ID0gMHgwMCAtIDB4MGYgIkVNVTMyX09VVF8wMCAtIF8zRiIgLSBPbmx5IHdoZW4gLmRldmljZSA9IDB4MDAwOCAqLworI2RlZmluZSBBX0dQUih4KQkoQV9GWEdQUkVHQkFTRSArICh4KSkKKworLyogY2NfcmVnIGNvbnN0YW50cyAqLworI2RlZmluZSBDQ19SRUdfTk9STUFMSVpFRCBDXzAwMDAwMDAxCisjZGVmaW5lIENDX1JFR19CT1JST1cJQ18wMDAwMDAwMgorI2RlZmluZSBDQ19SRUdfTUlOVVMJQ18wMDAwMDAwNAorI2RlZmluZSBDQ19SRUdfWkVSTwlDXzAwMDAwMDA4CisjZGVmaW5lIENDX1JFR19TQVRVUkFURQlDXzAwMDAwMDEwCisjZGVmaW5lIENDX1JFR19OT05aRVJPCUNfMDAwMDAxMDAKKworLyogRlggYnVzZXMgKi8KKyNkZWZpbmUgRlhCVVNfUENNX0xFRlQJCTB4MDAKKyNkZWZpbmUgRlhCVVNfUENNX1JJR0hUCQkweDAxCisjZGVmaW5lIEZYQlVTX1BDTV9MRUZUX1JFQVIJMHgwMgorI2RlZmluZSBGWEJVU19QQ01fUklHSFRfUkVBUgkweDAzCisjZGVmaW5lIEZYQlVTX01JRElfTEVGVAkJMHgwNAorI2RlZmluZSBGWEJVU19NSURJX1JJR0hUCTB4MDUKKyNkZWZpbmUgRlhCVVNfUENNX0NFTlRFUgkweDA2CisjZGVmaW5lIEZYQlVTX1BDTV9MRkUJCTB4MDcKKyNkZWZpbmUgRlhCVVNfUENNX0xFRlRfRlJPTlQJMHgwOAorI2RlZmluZSBGWEJVU19QQ01fUklHSFRfRlJPTlQJMHgwOQorI2RlZmluZSBGWEJVU19NSURJX1JFVkVSQgkweDBjCisjZGVmaW5lIEZYQlVTX01JRElfQ0hPUlVTCTB4MGQKKyNkZWZpbmUgRlhCVVNfUENNX0xFRlRfU0lERQkweDBlCisjZGVmaW5lIEZYQlVTX1BDTV9SSUdIVF9TSURFCTB4MGYKKyNkZWZpbmUgRlhCVVNfUFRfTEVGVAkJMHgxNAorI2RlZmluZSBGWEJVU19QVF9SSUdIVAkJMHgxNQorCisvKiBJbnB1dHMgKi8KKyNkZWZpbmUgRVhUSU5fQUM5N19MCSAgIDB4MDAJLyogQUMnOTcgY2FwdHVyZSBjaGFubmVsIC0gbGVmdCAqLworI2RlZmluZSBFWFRJTl9BQzk3X1IJICAgMHgwMQkvKiBBQyc5NyBjYXB0dXJlIGNoYW5uZWwgLSByaWdodCAqLworI2RlZmluZSBFWFRJTl9TUERJRl9DRF9MICAgMHgwMgkvKiBpbnRlcm5hbCBTL1BESUYgQ0QgLSBvbmJvYXJkIC0gbGVmdCAqLworI2RlZmluZSBFWFRJTl9TUERJRl9DRF9SICAgMHgwMwkvKiBpbnRlcm5hbCBTL1BESUYgQ0QgLSBvbmJvYXJkIC0gcmlnaHQgKi8KKyNkZWZpbmUgRVhUSU5fWk9PTV9MCSAgIDB4MDQJLyogWm9vbSBWaWRlbyBJMlMgLSBsZWZ0ICovCisjZGVmaW5lIEVYVElOX1pPT01fUgkgICAweDA1CS8qIFpvb20gVmlkZW8gSTJTIC0gcmlnaHQgKi8KKyNkZWZpbmUgRVhUSU5fVE9TTElOS19MCSAgIDB4MDYJLyogTGl2ZURyaXZlIC0gVE9TTGluayBPcHRpY2FsIC0gbGVmdCAqLworI2RlZmluZSBFWFRJTl9UT1NMSU5LX1IgICAgMHgwNwkvKiBMaXZlRHJpdmUgLSBUT1NMaW5rIE9wdGljYWwgLSByaWdodCAqLworI2RlZmluZSBFWFRJTl9MSU5FMV9MCSAgIDB4MDgJLyogTGl2ZURyaXZlIC0gTGluZS9NaWMgMSAtIGxlZnQgKi8KKyNkZWZpbmUgRVhUSU5fTElORTFfUgkgICAweDA5CS8qIExpdmVEcml2ZSAtIExpbmUvTWljIDEgLSByaWdodCAqLworI2RlZmluZSBFWFRJTl9DT0FYX1NQRElGX0wgMHgwYQkvKiBMaXZlRHJpdmUgLSBDb2F4aWFsIFMvUERJRiAtIGxlZnQgKi8KKyNkZWZpbmUgRVhUSU5fQ09BWF9TUERJRl9SIDB4MGIgLyogTGl2ZURyaXZlIC0gQ29heGlhbCBTL1BESUYgLSByaWdodCAqLworI2RlZmluZSBFWFRJTl9MSU5FMl9MCSAgIDB4MGMJLyogTGl2ZURyaXZlIC0gTGluZS9NaWMgMiAtIGxlZnQgKi8KKyNkZWZpbmUgRVhUSU5fTElORTJfUgkgICAweDBkCS8qIExpdmVEcml2ZSAtIExpbmUvTWljIDIgLSByaWdodCAqLworCisvKiBPdXRwdXRzICovCisjZGVmaW5lIEVYVE9VVF9BQzk3X0wJICAgMHgwMAkvKiBBQyc5NyBwbGF5YmFjayBjaGFubmVsIC0gbGVmdCAqLworI2RlZmluZSBFWFRPVVRfQUM5N19SCSAgIDB4MDEJLyogQUMnOTcgcGxheWJhY2sgY2hhbm5lbCAtIHJpZ2h0ICovCisjZGVmaW5lIEVYVE9VVF9UT1NMSU5LX0wgICAweDAyCS8qIExpdmVEcml2ZSAtIFRPU0xpbmsgT3B0aWNhbCAtIGxlZnQgKi8KKyNkZWZpbmUgRVhUT1VUX1RPU0xJTktfUiAgIDB4MDMJLyogTGl2ZURyaXZlIC0gVE9TTGluayBPcHRpY2FsIC0gcmlnaHQgKi8KKyNkZWZpbmUgRVhUT1VUX0FDOTdfQ0VOVEVSIDB4MDQJLyogU0IgTGl2ZSA1LjEgLSBjZW50ZXIgKi8KKyNkZWZpbmUgRVhUT1VUX0FDOTdfTEZFCSAgIDB4MDUgLyogU0IgTGl2ZSA1LjEgLSBMRkUgKi8KKyNkZWZpbmUgRVhUT1VUX0hFQURQSE9ORV9MIDB4MDYJLyogTGl2ZURyaXZlIC0gSGVhZHBob25lIC0gbGVmdCAqLworI2RlZmluZSBFWFRPVVRfSEVBRFBIT05FX1IgMHgwNwkvKiBMaXZlRHJpdmUgLSBIZWFkcGhvbmUgLSByaWdodCAqLworI2RlZmluZSBFWFRPVVRfUkVBUl9MCSAgIDB4MDgJLyogUmVhciBjaGFubmVsIC0gbGVmdCAqLworI2RlZmluZSBFWFRPVVRfUkVBUl9SCSAgIDB4MDkJLyogUmVhciBjaGFubmVsIC0gcmlnaHQgKi8KKyNkZWZpbmUgRVhUT1VUX0FEQ19DQVBfTCAgIDB4MGEJLyogQURDIENhcHR1cmUgYnVmZmVyIC0gbGVmdCAqLworI2RlZmluZSBFWFRPVVRfQURDX0NBUF9SICAgMHgwYgkvKiBBREMgQ2FwdHVyZSBidWZmZXIgLSByaWdodCAqLworI2RlZmluZSBFWFRPVVRfTUlDX0NBUAkgICAweDBjCS8qIE1JQyBDYXB0dXJlIGJ1ZmZlciAqLworI2RlZmluZSBFWFRPVVRfQUM5N19SRUFSX0wgMHgwZAkvKiBTQiBMaXZlIDUuMSAoYykgMjAwMyAtIFJlYXIgTGVmdCAqLworI2RlZmluZSBFWFRPVVRfQUM5N19SRUFSX1IgMHgwZQkvKiBTQiBMaXZlIDUuMSAoYykgMjAwMyAtIFJlYXIgUmlnaHQgKi8KKyNkZWZpbmUgRVhUT1VUX0FDRU5URVIJICAgMHgxMSAvKiBBbmFsb2cgQ2VudGVyICovCisjZGVmaW5lIEVYVE9VVF9BTEZFCSAgIDB4MTIgLyogQW5hbG9nIExGRSAqLworCisvKiBBdWRpZ3kgSW5wdXRzICovCisjZGVmaW5lIEFfRVhUSU5fQUM5N19MCQkweDAwCS8qIEFDJzk3IGNhcHR1cmUgY2hhbm5lbCAtIGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRJTl9BQzk3X1IJCTB4MDEJLyogQUMnOTcgY2FwdHVyZSBjaGFubmVsIC0gcmlnaHQgKi8KKyNkZWZpbmUgQV9FWFRJTl9TUERJRl9DRF9MCTB4MDIJLyogZGlnaXRhbCBDRCBsZWZ0ICovCisjZGVmaW5lIEFfRVhUSU5fU1BESUZfQ0RfUgkweDAzCS8qIGRpZ2l0YWwgQ0QgbGVmdCAqLworI2RlZmluZSBBX0VYVElOX09QVF9TUERJRl9MICAgICAweDA0ICAgIC8qIGF1ZGlneSBkcml2ZSBPcHRpY2FsIFNQRElGIC0gbGVmdCAqLworI2RlZmluZSBBX0VYVElOX09QVF9TUERJRl9SICAgICAweDA1ICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgKi8gCisjZGVmaW5lIEFfRVhUSU5fTElORTJfTAkJMHgwOAkvKiBhdWRpZ3kgZHJpdmUgbGluZTIvbWljMiAtIGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRJTl9MSU5FMl9SCQkweDA5CS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgKi8KKyNkZWZpbmUgQV9FWFRJTl9BRENfTAkJMHgwYSAgICAvKiBQaGlsaXBzIEFEQyAtIGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRJTl9BRENfUgkJMHgwYiAgICAvKiAgICAgICAgICAgICAgIHJpZ2h0ICovCisjZGVmaW5lIEFfRVhUSU5fQVVYMl9MCQkweDBjCS8qIGF1ZGlneSBkcml2ZSBhdXgyIC0gbGVmdCAqLworI2RlZmluZSBBX0VYVElOX0FVWDJfUgkJMHgwZAkvKiAgICAgICAgICAgICAgICAgICAtIHJpZ2h0ICovCisKKy8qIEF1ZGlnaXkgT3V0cHV0cyAqLworI2RlZmluZSBBX0VYVE9VVF9GUk9OVF9MCTB4MDAJLyogZGlnaXRhbCBmcm9udCBsZWZ0ICovCisjZGVmaW5lIEFfRVhUT1VUX0ZST05UX1IJMHgwMQkvKiAgICAgICAgICAgICAgIHJpZ2h0ICovCisjZGVmaW5lIEFfRVhUT1VUX0NFTlRFUgkJMHgwMgkvKiBkaWdpdGFsIGZyb250IGNlbnRlciAqLworI2RlZmluZSBBX0VYVE9VVF9MRkUJCTB4MDMJLyogZGlnaXRhbCBmcm9udCBsZmUgKi8KKyNkZWZpbmUgQV9FWFRPVVRfSEVBRFBIT05FX0wJMHgwNAkvKiBoZWFkcGhvbmUgYXVkaWd5IGRyaXZlIGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfSEVBRFBIT05FX1IJMHgwNQkvKiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ICovCisjZGVmaW5lIEFfRVhUT1VUX1JFQVJfTAkJMHgwNgkvKiBkaWdpdGFsIHJlYXIgbGVmdCAqLworI2RlZmluZSBBX0VYVE9VVF9SRUFSX1IJCTB4MDcJLyogICAgICAgICAgICAgIHJpZ2h0ICovCisjZGVmaW5lIEFfRVhUT1VUX0FGUk9OVF9MCTB4MDgJLyogYW5hbG9nIGZyb250IGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQUZST05UX1IJMHgwOQkvKiAgICAgICAgICAgICAgcmlnaHQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQUNFTlRFUgkweDBhCS8qIGFuYWxvZyBjZW50ZXIgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQUxGRQkJMHgwYgkvKiBhbmFsb2cgTEZFICovCisjZGVmaW5lIEFfRVhUT1VUX0FTSURFX0wJMHgwYwkvKiBhbmFsb2cgc2lkZSBsZWZ0ICAtIEF1ZGlneSAyIFpTICovCisjZGVmaW5lIEFfRVhUT1VUX0FTSURFX1IJMHgwZAkvKiAgICAgICAgICAgICByaWdodCAtIEF1ZGlneSAyIFpTICovCisjZGVmaW5lIEFfRVhUT1VUX0FSRUFSX0wJMHgwZQkvKiBhbmFsb2cgcmVhciBsZWZ0ICovCisjZGVmaW5lIEFfRVhUT1VUX0FSRUFSX1IJMHgwZgkvKiAgICAgICAgICAgICByaWdodCAqLworI2RlZmluZSBBX0VYVE9VVF9BQzk3X0wJCTB4MTAJLyogQUM5NyBsZWZ0IChmcm9udCkgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQUM5N19SCQkweDExCS8qICAgICAgcmlnaHQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQURDX0NBUF9MCTB4MTYJLyogQURDIGNhcHR1cmUgYnVmZmVyIGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQURDX0NBUF9SCTB4MTcJLyogICAgICAgICAgICAgICAgICAgIHJpZ2h0ICovCisjZGVmaW5lIEFfRVhUT1VUX01JQ19DQVAJMHgxOAkvKiBNaWMgY2FwdHVyZSBidWZmZXIgKi8KKworLyogQXVkaWd5IGNvbnN0YW50cyAqLworI2RlZmluZSBBX0NfMDAwMDAwMDAJMHhjMAorI2RlZmluZSBBX0NfMDAwMDAwMDEJMHhjMQorI2RlZmluZSBBX0NfMDAwMDAwMDIJMHhjMgorI2RlZmluZSBBX0NfMDAwMDAwMDMJMHhjMworI2RlZmluZSBBX0NfMDAwMDAwMDQJMHhjNAorI2RlZmluZSBBX0NfMDAwMDAwMDgJMHhjNQorI2RlZmluZSBBX0NfMDAwMDAwMTAJMHhjNgorI2RlZmluZSBBX0NfMDAwMDAwMjAJMHhjNworI2RlZmluZSBBX0NfMDAwMDAxMDAJMHhjOAorI2RlZmluZSBBX0NfMDAwMTAwMDAJMHhjOQorI2RlZmluZSBBX0NfMDAwMDA4MDAJMHhjYQorI2RlZmluZSBBX0NfMTAwMDAwMDAJMHhjYgorI2RlZmluZSBBX0NfMjAwMDAwMDAJMHhjYworI2RlZmluZSBBX0NfNDAwMDAwMDAJMHhjZAorI2RlZmluZSBBX0NfODAwMDAwMDAJMHhjZQorI2RlZmluZSBBX0NfN2ZmZmZmZmYJMHhjZgorI2RlZmluZSBBX0NfZmZmZmZmZmYJMHhkMAorI2RlZmluZSBBX0NfZmZmZmZmZmUJMHhkMQorI2RlZmluZSBBX0NfYzAwMDAwMDAJMHhkMgorI2RlZmluZSBBX0NfNGYxYmJjZGMJMHhkMworI2RlZmluZSBBX0NfNWE3ZWY5ZGIJMHhkNAorI2RlZmluZSBBX0NfMDAxMDAwMDAJMHhkNQorI2RlZmluZSBBX0dQUl9BQ0NVCTB4ZDYJCS8qIEFDQ1VNLCBhY2N1bXVsYXRvciAqLworI2RlZmluZSBBX0dQUl9DT05ECTB4ZDcJCS8qIENDUiwgY29uZGl0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIEFfR1BSX05PSVNFMAkweGQ4CQkvKiBub2lzZSBzb3VyY2UgKi8KKyNkZWZpbmUgQV9HUFJfTk9JU0UxCTB4ZDkJCS8qIG5vaXNlIHNvdXJjZSAqLworI2RlZmluZSBBX0dQUl9JUlEJMHhkYQkJLyogSVJRIHJlZ2lzdGVyICovCisjZGVmaW5lIEFfR1BSX0RCQUMJMHhkYgkJLyogVFJBTSBEZWxheSBCYXNlIEFkZHJlc3MgQ291bnRlciAtIGludGVybmFsICovCisjZGVmaW5lIEFfR1BSX0RCQUNFCTB4ZGUJCS8qIFRSQU0gRGVsYXkgQmFzZSBBZGRyZXNzIENvdW50ZXIgLSBleHRlcm5hbCAqLworCisvKiBkZWZpbml0aW9ucyBmb3IgZGVidWcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU1VMTBLMV9EQkdfWkMJCQkweDgwMDAwMDAwCS8qIHplcm8gdHJhbSBjb3VudGVyICovCisjZGVmaW5lIEVNVTEwSzFfREJHX1NBVFVSQVRJT05fT0NDVVJFRAkweDAyMDAwMDAwCS8qIHNhdHVyYXRpb24gY29udHJvbCAqLworI2RlZmluZSBFTVUxMEsxX0RCR19TQVRVUkFUSU9OX0FERFIJMHgwMWZmMDAwMAkvKiBzYXR1cmF0aW9uIGFkZHJlc3MgKi8KKyNkZWZpbmUgRU1VMTBLMV9EQkdfU0lOR0xFX1NURVAJCTB4MDAwMDgwMDAJLyogc2luZ2xlIHN0ZXAgbW9kZSAqLworI2RlZmluZSBFTVUxMEsxX0RCR19TVEVQCQkweDAwMDA0MDAwCS8qIHN0YXJ0IHNpbmdsZSBzdGVwICovCisjZGVmaW5lIEVNVTEwSzFfREJHX0NPTkRJVElPTl9DT0RFCTB4MDAwMDNlMDAJLyogY29uZGl0aW9uIGNvZGUgKi8KKyNkZWZpbmUgRU1VMTBLMV9EQkdfU0lOR0xFX1NURVBfQUREUgkweDAwMDAwMWZmCS8qIHNpbmdsZSBzdGVwIGFkZHJlc3MgKi8KKworLyogdGFuayBtZW1vcnkgYWRkcmVzcyBsaW5lICovCisjZGVmaW5lIFRBTktNRU1BRERSUkVHX0FERFJfTUFTSyAweDAwMGZmZmZmCS8qIDIwIGJpdCB0YW5rIGFkZHJlc3MgZmllbGQJCQkqLworI2RlZmluZSBUQU5LTUVNQUREUlJFR19DTEVBUgkgMHgwMDgwMDAwMAkvKiBDbGVhciB0YW5rIG1lbW9yeQkJCQkqLworI2RlZmluZSBUQU5LTUVNQUREUlJFR19BTElHTgkgMHgwMDQwMDAwMAkvKiBBbGlnbiByZWFkIG9yIHdyaXRlIHJlbGF0aXZlIHRvIHRhbmsgYWNjZXNzCSovCisjZGVmaW5lIFRBTktNRU1BRERSUkVHX1dSSVRFCSAweDAwMjAwMDAwCS8qIFdyaXRlIHRvIHRhbmsgbWVtb3J5CQkJCSovCisjZGVmaW5lIFRBTktNRU1BRERSUkVHX1JFQUQJIDB4MDAxMDAwMDAJLyogUmVhZCBmcm9tIHRhbmsgbWVtb3J5CQkJKi8KKworc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9pbmZvIHsKKwl1bnNpZ25lZCBpbnQgaW50ZXJuYWxfdHJhbV9zaXplOwkvKiBpbiBzYW1wbGVzICovCisJdW5zaWduZWQgaW50IGV4dGVybmFsX3RyYW1fc2l6ZTsJLyogaW4gc2FtcGxlcyAqLworCWNoYXIgZnhidXNfbmFtZXNbMTZdWzMyXTsJCS8qIG5hbWVzIG9mIEZYQlVTZXMgKi8KKwljaGFyIGV4dGluX25hbWVzWzE2XVszMl07CQkvKiBuYW1lcyBvZiBleHRlcm5hbCBpbnB1dHMgKi8KKwljaGFyIGV4dG91dF9uYW1lc1szMl1bMzJdOwkJLyogbmFtZXMgb2YgZXh0ZXJuYWwgb3V0cHV0cyAqLworCXVuc2lnbmVkIGludCBncHJfY29udHJvbHM7CQkvKiBjb3VudCBvZiBHUFIgY29udHJvbHMgKi8KK307CisKKyNkZWZpbmUgRU1VMTBLMV9HUFJfVFJBTlNMQVRJT05fTk9ORQkJMAorI2RlZmluZSBFTVUxMEsxX0dQUl9UUkFOU0xBVElPTl9UQUJMRTEwMAkxCisjZGVmaW5lIEVNVTEwSzFfR1BSX1RSQU5TTEFUSU9OX0JBU1MJCTIKKyNkZWZpbmUgRU1VMTBLMV9HUFJfVFJBTlNMQVRJT05fVFJFQkxFCQkzCisjZGVmaW5lIEVNVTEwSzFfR1BSX1RSQU5TTEFUSU9OX09OT0ZGCQk0CisKK3N0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY29udHJvbF9ncHIgeworCXN0cnVjdCBzbmRfY3RsX2VsZW1faWQgaWQ7CQkvKiBmdWxsIGNvbnRyb2wgSUQgZGVmaW5pdGlvbiAqLworCXVuc2lnbmVkIGludCB2Y291bnQ7CQkvKiB2aXNpYmxlIGNvdW50ICovCisJdW5zaWduZWQgaW50IGNvdW50OwkJLyogY291bnQgb2YgR1BSICgxLi4xNikgKi8KKwl1bnNpZ25lZCBzaG9ydCBncHJbMzJdOwkJLyogR1BSIG51bWJlcihzKSAqLworCXVuc2lnbmVkIGludCB2YWx1ZVszMl07CQkvKiBpbml0aWFsIHZhbHVlcyAqLworCXVuc2lnbmVkIGludCBtaW47CQkvKiBtaW5pbXVtIHJhbmdlICovCisJdW5zaWduZWQgaW50IG1heDsJCS8qIG1heGltdW0gcmFuZ2UgKi8KKwl1bnNpZ25lZCBpbnQgdHJhbnNsYXRpb247CS8qIHRyYW5zbGF0aW9uIHR5cGUgKEVNVTEwSzFfR1BSX1RSQU5TTEFUSU9OKikgKi8KKwljb25zdCB1bnNpZ25lZCBpbnQgKnRsdjsKK307CisKKy8qIG9sZCBBQkkgd2l0aG91dCBUTFYgc3VwcG9ydCAqLworc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb250cm9sX29sZF9ncHIgeworCXN0cnVjdCBzbmRfY3RsX2VsZW1faWQgaWQ7CisJdW5zaWduZWQgaW50IHZjb3VudDsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJdW5zaWduZWQgc2hvcnQgZ3ByWzMyXTsKKwl1bnNpZ25lZCBpbnQgdmFsdWVbMzJdOworCXVuc2lnbmVkIGludCBtaW47CisJdW5zaWduZWQgaW50IG1heDsKKwl1bnNpZ25lZCBpbnQgdHJhbnNsYXRpb247Cit9OworCitzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvZGUgeworCWNoYXIgbmFtZVsxMjhdOworCisJREVDTEFSRV9CSVRNQVAoZ3ByX3ZhbGlkLCAweDIwMCk7IC8qIGJpdG1hc2sgb2YgdmFsaWQgaW5pdGlhbGl6ZXJzICovCisJX191MzIgKmdwcl9tYXA7CQkvKiBpbml0aWFsaXplcnMgKi8KKworCXVuc2lnbmVkIGludCBncHJfYWRkX2NvbnRyb2xfY291bnQ7IC8qIGNvdW50IG9mIEdQUiBjb250cm9scyB0byBhZGQvcmVwbGFjZSAqLworCXN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY29udHJvbF9ncHIgKmdwcl9hZGRfY29udHJvbHM7IC8qIEdQUiBjb250cm9scyB0byBhZGQvcmVwbGFjZSAqLworCisJdW5zaWduZWQgaW50IGdwcl9kZWxfY29udHJvbF9jb3VudDsgLyogY291bnQgb2YgR1BSIGNvbnRyb2xzIHRvIHJlbW92ZSAqLworCXN0cnVjdCBzbmRfY3RsX2VsZW1faWQgKmdwcl9kZWxfY29udHJvbHM7IC8qIElEcyBvZiBHUFIgY29udHJvbHMgdG8gcmVtb3ZlICovCisKKwl1bnNpZ25lZCBpbnQgZ3ByX2xpc3RfY29udHJvbF9jb3VudDsgLyogY291bnQgb2YgR1BSIGNvbnRyb2xzIHRvIGxpc3QgKi8KKwl1bnNpZ25lZCBpbnQgZ3ByX2xpc3RfY29udHJvbF90b3RhbDsgLyogdG90YWwgY291bnQgb2YgR1BSIGNvbnRyb2xzICovCisJc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb250cm9sX2dwciAqZ3ByX2xpc3RfY29udHJvbHM7IC8qIGxpc3RlZCBHUFIgY29udHJvbHMgKi8KKworCURFQ0xBUkVfQklUTUFQKHRyYW1fdmFsaWQsIDB4MTAwKTsgLyogYml0bWFzayBvZiB2YWxpZCBpbml0aWFsaXplcnMgKi8KKwlfX3UzMiAqdHJhbV9kYXRhX21hcDsJICAvKiBkYXRhIGluaXRpYWxpemVycyAqLworCV9fdTMyICp0cmFtX2FkZHJfbWFwOwkgIC8qIG1hcCBpbml0aWFsaXplcnMgKi8KKworCURFQ0xBUkVfQklUTUFQKGNvZGVfdmFsaWQsIDEwMjQpOyAvKiBiaXRtYXNrIG9mIHZhbGlkIGluc3RydWN0aW9ucyAqLworCV9fdTMyICpjb2RlOwkJICAvKiBvbmUgaW5zdHJ1Y3Rpb24gLSA2NCBiaXRzICovCit9OworCitzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX3RyYW0geworCXVuc2lnbmVkIGludCBhZGRyZXNzOwkJLyogMzEuYml0ID09IDEgLT4gZXh0ZXJuYWwgVFJBTSAqLworCXVuc2lnbmVkIGludCBzaXplOwkJLyogc2l6ZSBpbiBzYW1wbGVzICg0IGJ5dGVzKSAqLworCXVuc2lnbmVkIGludCAqc2FtcGxlczsJCS8qIHBvaW50ZXIgdG8gc2FtcGxlcyAoMjAtYml0KSAqLworCQkJCQkvKiBOVUxMLT5jbGVhciBtZW1vcnkgKi8KK307CisKK3N0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfcGNtX3JlYyB7CisJdW5zaWduZWQgaW50IHN1YnN0cmVhbTsJCS8qIHN1YnN0cmVhbSBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQgcmVzMTsJCS8qIHJlc2VydmVkICovCisJdW5zaWduZWQgaW50IGNoYW5uZWxzOwkJLyogMTYtYml0IGNoYW5uZWxzIGNvdW50LCB6ZXJvID0gcmVtb3ZlIHRoaXMgc3Vic3RyZWFtICovCisJdW5zaWduZWQgaW50IHRyYW1fc3RhcnQ7CS8qIHJpbmcgYnVmZmVyIHBvc2l0aW9uIGluIFRSQU0gKGluIHNhbXBsZXMpICovCisJdW5zaWduZWQgaW50IGJ1ZmZlcl9zaXplOwkvKiBjb3VudCBvZiBidWZmZXJlZCBzYW1wbGVzICovCisJdW5zaWduZWQgc2hvcnQgZ3ByX3NpemU7CQkvKiBHUFIgY29udGFpbmluZyBzaXplIG9mIHJpbmdidWZmZXIgaW4gc2FtcGxlcyAoaG9zdCkgKi8KKwl1bnNpZ25lZCBzaG9ydCBncHJfcHRyOwkJLyogR1BSIGNvbnRhaW5pbmcgY3VycmVudCBwb2ludGVyIGluIHRoZSByaW5nIGJ1ZmZlciAoaG9zdCA9IHJlc2V0LCBGWDgwMTApICovCisJdW5zaWduZWQgc2hvcnQgZ3ByX2NvdW50OwkvKiBHUFIgY29udGFpbmluZyBjb3VudCBvZiBzYW1wbGVzIGJldHdlZW4gdHdvIGludGVycnVwdHMgKGhvc3QpICovCisJdW5zaWduZWQgc2hvcnQgZ3ByX3RtcGNvdW50OwkvKiBHUFIgY29udGFpbmluZyBjdXJyZW50IGNvdW50IG9mIHNhbXBsZXMgdG8gaW50ZXJydXB0IChob3N0ID0gc2V0LCBGWDgwMTApICovCisJdW5zaWduZWQgc2hvcnQgZ3ByX3RyaWdnZXI7CS8qIEdQUiBjb250YWluaW5nIHRyaWdnZXIgKGFjdGl2YXRlKSBpbmZvcm1hdGlvbiAoaG9zdCkgKi8KKwl1bnNpZ25lZCBzaG9ydCBncHJfcnVubmluZzsJLyogR1BSIGNvbnRhaW5pbmcgaW5mbyBpZiBQQ00gaXMgcnVubmluZyAoRlg4MDEwKSAqLworCXVuc2lnbmVkIGNoYXIgcGFkOwkJLyogcmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBjaGFyIGV0cmFtWzMyXTsJLyogZXh0ZXJuYWwgVFJBTSBhZGRyZXNzICYgZGF0YSAob25lIHBlciBjaGFubmVsKSAqLworCXVuc2lnbmVkIGludCByZXMyOwkJLyogcmVzZXJ2ZWQgKi8KK307CisKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9WRVJTSU9OCQlTTkRSVl9QUk9UT0NPTF9WRVJTSU9OKDEsIDAsIDEpCisKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9JTkZPCV9JT1IgKCdIJywgMHgxMCwgc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9pbmZvKQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX0NPREVfUE9LRQlfSU9XICgnSCcsIDB4MTEsIHN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY29kZSkKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9DT0RFX1BFRUsJX0lPV1IoJ0gnLCAweDEyLCBzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvZGUpCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfVFJBTV9TRVRVUAlfSU9XICgnSCcsIDB4MjAsIGludCkKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9UUkFNX1BPS0UJX0lPVyAoJ0gnLCAweDIxLCBzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX3RyYW0pCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfVFJBTV9QRUVLCV9JT1dSKCdIJywgMHgyMiwgc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF90cmFtKQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1BDTV9QT0tFCV9JT1cgKCdIJywgMHgzMCwgc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9wY21fcmVjKQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1BDTV9QRUVLCV9JT1dSKCdIJywgMHgzMSwgc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9wY21fcmVjKQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1BWRVJTSU9OCV9JT1IgKCdIJywgMHg0MCwgaW50KQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1NUT1AJX0lPICAoJ0gnLCAweDgwKQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX0NPTlRJTlVFCV9JTyAgKCdIJywgMHg4MSkKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9aRVJPX1RSQU1fQ09VTlRFUiBfSU8gKCdIJywgMHg4MikKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9TSU5HTEVfU1RFUAlfSU9XICgnSCcsIDB4ODMsIGludCkKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9EQkdfUkVBRAlfSU9SICgnSCcsIDB4ODQsIGludCkKKworLyogdHlwZWRlZnMgZm9yIGNvbXBhdGliaWxpdHkgdG8gdXNlci1zcGFjZSAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2luZm8gZW11MTBrMV9meDgwMTBfaW5mb190OwordHlwZWRlZiBzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByIGVtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByX3Q7Cit0eXBlZGVmIHN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY29kZSBlbXUxMGsxX2Z4ODAxMF9jb2RlX3Q7Cit0eXBlZGVmIHN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfdHJhbSBlbXUxMGsxX2Z4ODAxMF90cmFtX3Q7Cit0eXBlZGVmIHN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfcGNtX3JlYyBlbXUxMGsxX2Z4ODAxMF9wY21fdDsKKworI2VuZGlmCS8qIF9fU09VTkRfRU1VMTBLMV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3NvdW5kL2hkc3AuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc291bmQvaGRzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YjExYTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3NvdW5kL2hkc3AuaApAQCAtMCwwICsxLDExMCBAQAorI2lmbmRlZiBfX1NPVU5EX0hEU1BfSAorI2RlZmluZSBfX1NPVU5EX0hEU1BfSAorCisvKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDMgVGhvbWFzIENoYXJib25uZWwgKHRob21hc0B1bmRhdGEub3JnKQorICogICAgCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgSERTUF9NQVRSSVhfTUlYRVJfU0laRSAyMDQ4CisKK2VudW0gSERTUF9JT19UeXBlIHsKKwlEaWdpZmFjZSwKKwlNdWx0aWZhY2UsCisJSDk2NTIsCisJSDk2MzIsCisJUlBNLAorCVVuZGVmaW5lZCwKK307CisKK3N0cnVjdCBoZHNwX3BlYWtfcm1zIHsKKwlfX3UzMiBpbnB1dF9wZWFrc1syNl07CisJX191MzIgcGxheWJhY2tfcGVha3NbMjZdOworCV9fdTMyIG91dHB1dF9wZWFrc1syOF07CisJX191NjQgaW5wdXRfcm1zWzI2XTsKKwlfX3U2NCBwbGF5YmFja19ybXNbMjZdOworCS8qIFRoZXNlIGFyZSBvbmx5IHVzZWQgZm9yIEg5Nnh4IGNhcmRzICovCisJX191NjQgb3V0cHV0X3Jtc1syNl07Cit9OworCisjZGVmaW5lIFNORFJWX0hEU1BfSU9DVExfR0VUX1BFQUtfUk1TIF9JT1IoJ0gnLCAweDQwLCBzdHJ1Y3QgaGRzcF9wZWFrX3JtcykKKworc3RydWN0IGhkc3BfY29uZmlnX2luZm8geworCXVuc2lnbmVkIGNoYXIgcHJlZl9zeW5jX3JlZjsKKwl1bnNpZ25lZCBjaGFyIHdvcmRjbG9ja19zeW5jX2NoZWNrOworCXVuc2lnbmVkIGNoYXIgc3BkaWZfc3luY19jaGVjazsKKwl1bnNpZ25lZCBjaGFyIGFkYXRzeW5jX3N5bmNfY2hlY2s7CisJdW5zaWduZWQgY2hhciBhZGF0X3N5bmNfY2hlY2tbM107CisJdW5zaWduZWQgY2hhciBzcGRpZl9pbjsKKwl1bnNpZ25lZCBjaGFyIHNwZGlmX291dDsKKwl1bnNpZ25lZCBjaGFyIHNwZGlmX3Byb2Zlc3Npb25hbDsKKwl1bnNpZ25lZCBjaGFyIHNwZGlmX2VtcGhhc2lzOworCXVuc2lnbmVkIGNoYXIgc3BkaWZfbm9uYXVkaW87CisJdW5zaWduZWQgaW50IHNwZGlmX3NhbXBsZV9yYXRlOworCXVuc2lnbmVkIGludCBzeXN0ZW1fc2FtcGxlX3JhdGU7CisJdW5zaWduZWQgaW50IGF1dG9zeW5jX3NhbXBsZV9yYXRlOworCXVuc2lnbmVkIGNoYXIgc3lzdGVtX2Nsb2NrX21vZGU7CisJdW5zaWduZWQgY2hhciBjbG9ja19zb3VyY2U7CisJdW5zaWduZWQgY2hhciBhdXRvc3luY19yZWY7CisJdW5zaWduZWQgY2hhciBsaW5lX291dDsKKwl1bnNpZ25lZCBjaGFyIHBhc3N0aHJ1OyAKKwl1bnNpZ25lZCBjaGFyIGRhX2dhaW47CisJdW5zaWduZWQgY2hhciBhZF9nYWluOworCXVuc2lnbmVkIGNoYXIgcGhvbmVfZ2FpbjsKKwl1bnNpZ25lZCBjaGFyIHhscl9icmVha291dF9jYWJsZTsKKwl1bnNpZ25lZCBjaGFyIGFuYWxvZ19leHRlbnNpb25fYm9hcmQ7Cit9OworCisjZGVmaW5lIFNORFJWX0hEU1BfSU9DVExfR0VUX0NPTkZJR19JTkZPIF9JT1IoJ0gnLCAweDQxLCBzdHJ1Y3QgaGRzcF9jb25maWdfaW5mbykKKworc3RydWN0IGhkc3BfZmlybXdhcmUgeworCXZvaWQgKmZpcm13YXJlX2RhdGE7CS8qIDI0NDEzIHggNCBieXRlcyAqLworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQX0lPQ1RMX1VQTE9BRF9GSVJNV0FSRSBfSU9XKCdIJywgMHg0Miwgc3RydWN0IGhkc3BfZmlybXdhcmUpCisKK3N0cnVjdCBoZHNwX3ZlcnNpb24geworCWVudW0gSERTUF9JT19UeXBlIGlvX3R5cGU7CisJdW5zaWduZWQgc2hvcnQgZmlybXdhcmVfcmV2OworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQX0lPQ1RMX0dFVF9WRVJTSU9OIF9JT1IoJ0gnLCAweDQzLCBzdHJ1Y3QgaGRzcF92ZXJzaW9uKQorCitzdHJ1Y3QgaGRzcF9taXhlciB7CisJdW5zaWduZWQgc2hvcnQgbWF0cml4W0hEU1BfTUFUUklYX01JWEVSX1NJWkVdOworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQX0lPQ1RMX0dFVF9NSVhFUiBfSU9SKCdIJywgMHg0NCwgc3RydWN0IGhkc3BfbWl4ZXIpCisKK3N0cnVjdCBoZHNwXzk2MzJfYWViIHsKKwlpbnQgYWViaTsKKwlpbnQgYWVibzsKK307CisKKyNkZWZpbmUgU05EUlZfSERTUF9JT0NUTF9HRVRfOTYzMl9BRUIgX0lPUignSCcsIDB4NDUsIHN0cnVjdCBoZHNwXzk2MzJfYWViKQorCisvKiB0eXBlZGVmcyBmb3IgY29tcGF0aWJpbGl0eSB0byB1c2VyLXNwYWNlICovCit0eXBlZGVmIGVudW0gSERTUF9JT19UeXBlIEhEU1BfSU9fVHlwZTsKK3R5cGVkZWYgc3RydWN0IGhkc3BfcGVha19ybXMgaGRzcF9wZWFrX3Jtc190OwordHlwZWRlZiBzdHJ1Y3QgaGRzcF9jb25maWdfaW5mbyBoZHNwX2NvbmZpZ19pbmZvX3Q7Cit0eXBlZGVmIHN0cnVjdCBoZHNwX2Zpcm13YXJlIGhkc3BfZmlybXdhcmVfdDsKK3R5cGVkZWYgc3RydWN0IGhkc3BfdmVyc2lvbiBoZHNwX3ZlcnNpb25fdDsKK3R5cGVkZWYgc3RydWN0IGhkc3BfbWl4ZXIgaGRzcF9taXhlcl90OwordHlwZWRlZiBzdHJ1Y3QgaGRzcF85NjMyX2FlYiBoZHNwXzk2MzJfYWViX3Q7CisKKyNlbmRpZiAvKiBfX1NPVU5EX0hEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zb3VuZC9oZHNwbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zb3VuZC9oZHNwbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNTllYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3NvdW5kL2hkc3BtLmgKQEAgLTAsMCArMSwyMjkgQEAKKyNpZm5kZWYgX19TT1VORF9IRFNQTV9ICisjZGVmaW5lIF9fU09VTkRfSERTUE1fSAorLyoKKyAqICAgQ29weXJpZ2h0IChDKSAyMDAzIFdpbmZyaWVkIFJpdHNjaCAoSUVNKQorICogICBiYXNlZCBvbiBoZHNwLmggZnJvbSBUaG9tYXMgQ2hhcmJvbm5lbCAodGhvbWFzQHVuZGF0YS5vcmcpCisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKiBNYXhpbXVtIGNoYW5uZWxzIGlzIDY0IGV2ZW4gb24gNTZNb2RlIHlvdSBoYXZlIDY0cGxheWJhY2tzIHRvIG1hdHJpeCAqLworI2RlZmluZSBIRFNQTV9NQVhfQ0hBTk5FTFMgICAgICA2NAorCitlbnVtIGhkc3BtX2lvX3R5cGUgeworCU1BREksCisJTUFESWZhY2UsCisJQUlPLAorCUFFUzMyLAorCVJheURBVAorfTsKKworZW51bSBoZHNwbV9zcGVlZCB7CisJc3MsCisJZHMsCisJcXMKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIElPQ1RMIFBlYWsvUk1TIE1ldGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgaGRzcG1fcGVha19ybXMgeworCXVpbnQzMl90IGlucHV0X3BlYWtzWzY0XTsKKwl1aW50MzJfdCBwbGF5YmFja19wZWFrc1s2NF07CisJdWludDMyX3Qgb3V0cHV0X3BlYWtzWzY0XTsKKworCXVpbnQ2NF90IGlucHV0X3Jtc1s2NF07CisJdWludDY0X3QgcGxheWJhY2tfcm1zWzY0XTsKKwl1aW50NjRfdCBvdXRwdXRfcm1zWzY0XTsKKworCXVpbnQ4X3Qgc3BlZWQ7IC8qIGVudW0ge3NzLCBkcywgcXN9ICovCisJaW50IHN0YXR1czI7Cit9OworCisjZGVmaW5lIFNORFJWX0hEU1BNX0lPQ1RMX0dFVF9QRUFLX1JNUyBcCisJX0lPUignSCcsIDB4NDIsIHN0cnVjdCBoZHNwbV9wZWFrX3JtcykKKworLyogLS0tLS0tLS0tLS0tIENPTkZJRyBibG9jayBJT0NUTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBoZHNwbV9jb25maWcgeworCXVuc2lnbmVkIGNoYXIgcHJlZl9zeW5jX3JlZjsKKwl1bnNpZ25lZCBjaGFyIHdvcmRjbG9ja19zeW5jX2NoZWNrOworCXVuc2lnbmVkIGNoYXIgbWFkaV9zeW5jX2NoZWNrOworCXVuc2lnbmVkIGludCBzeXN0ZW1fc2FtcGxlX3JhdGU7CisJdW5zaWduZWQgaW50IGF1dG9zeW5jX3NhbXBsZV9yYXRlOworCXVuc2lnbmVkIGNoYXIgc3lzdGVtX2Nsb2NrX21vZGU7CisJdW5zaWduZWQgY2hhciBjbG9ja19zb3VyY2U7CisJdW5zaWduZWQgY2hhciBhdXRvc3luY19yZWY7CisJdW5zaWduZWQgY2hhciBsaW5lX291dDsKKwl1bnNpZ25lZCBpbnQgcGFzc3RocnU7CisJdW5zaWduZWQgaW50IGFuYWxvZ19vdXQ7Cit9OworCisjZGVmaW5lIFNORFJWX0hEU1BNX0lPQ1RMX0dFVF9DT05GSUcgXAorCV9JT1IoJ0gnLCAweDQxLCBzdHJ1Y3QgaGRzcG1fY29uZmlnKQorCisvKioKKyAqIElmIHRoZXJlJ3MgYSBUQ08gKFRpbWVDb2RlIE9wdGlvbikgYm9hcmQgaW5zdGFsbGVkLAorICogdGhlcmUgYXJlIGZ1cnRoZXIgb3B0aW9ucyBhbmQgc3RhdHVzIGRhdGEgYXZhaWxhYmxlLgorICogVGhlIGhkc3BtX2x0YyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGN1cnJlbnQgU01QVEUKKyAqIHRpbWVjb2RlIGFuZCBzb21lIHN0YXR1cyBpbmZvcm1hdGlvbiBhbmQgY2FuIGJlCisgKiBvYnRhaW5lZCB2aWEgU05EUlZfSERTUE1fSU9DVExfR0VUX0xUQyBvciBpbiB0aGUKKyAqIGhkc3BtX3N0YXR1cyBzdHJ1Y3QuCisgKiovCisKK2VudW0gaGRzcG1fbHRjX2Zvcm1hdCB7CisJZm9ybWF0X2ludmFsaWQsCisJZnBzXzI0LAorCWZwc18yNSwKKwlmcHNfMjk5NywKKwlmcHNfMzAKK307CisKK2VudW0gaGRzcG1fbHRjX2ZyYW1lIHsKKwlmcmFtZV9pbnZhbGlkLAorCWRyb3BfZnJhbWUsCisJZnVsbF9mcmFtZQorfTsKKworZW51bSBoZHNwbV9sdGNfaW5wdXRfZm9ybWF0IHsKKwludHNjLAorCXBhbCwKKwlub192aWRlbworfTsKKworc3RydWN0IGhkc3BtX2x0YyB7CisJdW5zaWduZWQgaW50IGx0YzsKKworCWVudW0gaGRzcG1fbHRjX2Zvcm1hdCBmb3JtYXQ7CisJZW51bSBoZHNwbV9sdGNfZnJhbWUgZnJhbWU7CisJZW51bSBoZHNwbV9sdGNfaW5wdXRfZm9ybWF0IGlucHV0X2Zvcm1hdDsKK307CisKKyNkZWZpbmUgU05EUlZfSERTUE1fSU9DVExfR0VUX0xUQyBfSU9SKCdIJywgMHg0Niwgc3RydWN0IGhkc3BtX21peGVyX2lvY3RsKQorCisvKioKKyAqIFRoZSBzdGF0dXMgZGF0YSByZWZsZWN0cyB0aGUgZGV2aWNlJ3MgY3VycmVudCBzdGF0ZQorICogYXMgZGV0ZXJtaW5lZCBieSB0aGUgY2FyZCdzIGNvbmZpZ3VyYXRpb24gYW5kCisgKiBjb25uZWN0aW9uIHN0YXR1cy4KKyAqKi8KKworZW51bSBoZHNwbV9zeW5jIHsKKwloZHNwbV9zeW5jX25vX2xvY2sgPSAwLAorCWhkc3BtX3N5bmNfbG9jayA9IDEsCisJaGRzcG1fc3luY19zeW5jID0gMgorfTsKKworZW51bSBoZHNwbV9tYWRpX2lucHV0IHsKKwloZHNwbV9pbnB1dF9vcHRpY2FsID0gMCwKKwloZHNwbV9pbnB1dF9jb2F4ID0gMQorfTsKKworZW51bSBoZHNwbV9tYWRpX2NoYW5uZWxfZm9ybWF0IHsKKwloZHNwbV9mb3JtYXRfY2hfNjQgPSAwLAorCWhkc3BtX2Zvcm1hdF9jaF81NiA9IDEKK307CisKK2VudW0gaGRzcG1fbWFkaV9mcmFtZV9mb3JtYXQgeworCWhkc3BtX2ZyYW1lXzQ4ID0gMCwKKwloZHNwbV9mcmFtZV85NiA9IDEKK307CisKK2VudW0gaGRzcG1fc3luY3NvdXJjZSB7CisJc3luY3NvdXJjZV93YyA9IDAsCisJc3luY3NvdXJjZV9tYWRpID0gMSwKKwlzeW5jc291cmNlX3RjbyA9IDIsCisJc3luY3NvdXJjZV9zeW5jID0gMywKKwlzeW5jc291cmNlX25vbmUgPSA0Cit9OworCitzdHJ1Y3QgaGRzcG1fc3RhdHVzIHsKKwl1aW50OF90IGNhcmRfdHlwZTsgLyogZW51bSBoZHNwbV9pb190eXBlICovCisJZW51bSBoZHNwbV9zeW5jc291cmNlIGF1dG9zeW5jX3NvdXJjZTsKKworCXVpbnQ2NF90IGNhcmRfY2xvY2s7CisJdWludDMyX3QgbWFzdGVyX3BlcmlvZDsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3Qgc3luY193YzsgLyogZW51bSBoZHNwbV9zeW5jICovCisJCQl1aW50OF90IHN5bmNfbWFkaTsgLyogZW51bSBoZHNwbV9zeW5jICovCisJCQl1aW50OF90IHN5bmNfdGNvOyAvKiBlbnVtIGhkc3BtX3N5bmMgKi8KKwkJCXVpbnQ4X3Qgc3luY19pbjsgLyogZW51bSBoZHNwbV9zeW5jICovCisJCQl1aW50OF90IG1hZGlfaW5wdXQ7IC8qIGVudW0gaGRzcG1fbWFkaV9pbnB1dCAqLworCQkJdWludDhfdCBjaGFubmVsX2Zvcm1hdDsgLyogZW51bSBoZHNwbV9tYWRpX2NoYW5uZWxfZm9ybWF0ICovCisJCQl1aW50OF90IGZyYW1lX2Zvcm1hdDsgLyogZW51bSBoZHNwbV9tYWRpX2ZyYW1lX2Zvcm1hdCAqLworCQl9IG1hZGk7CisJfSBjYXJkX3NwZWNpZmljOworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQTV9JT0NUTF9HRVRfU1RBVFVTIFwKKwlfSU9SKCdIJywgMHg0Nywgc3RydWN0IGhkc3BtX3N0YXR1cykKKworLyoqCisgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhcmQgYW5kIGl0cyBhZGQtb25zLgorICoqLworCisjZGVmaW5lIEhEU1BNX0FERE9OX1RDTyAxCisKK3N0cnVjdCBoZHNwbV92ZXJzaW9uIHsKKwl1aW50OF90IGNhcmRfdHlwZTsgLyogZW51bSBoZHNwbV9pb190eXBlICovCisJY2hhciBjYXJkbmFtZVsyMF07CisJdW5zaWduZWQgaW50IHNlcmlhbDsKKwl1bnNpZ25lZCBzaG9ydCBmaXJtd2FyZV9yZXY7CisJaW50IGFkZG9uczsKK307CisKKyNkZWZpbmUgU05EUlZfSERTUE1fSU9DVExfR0VUX1ZFUlNJT04gX0lPUignSCcsIDB4NDgsIHN0cnVjdCBoZHNwbV92ZXJzaW9uKQorCisvKiAtLS0tLS0tLS0tLS0tIGdldCBNYXRyaXggTWl4ZXIgSU9DVEwgLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIE1BREkgbWl4ZXI6IDY0aW5wdXRzKzY0cGxheWJhY2sgaW4gNjRvdXRwdXRzID0gODE5MiA9PiAqNEJ5dGUgPQorICogMzI3NjggQnl0ZXMKKyAqLworCisvKiBvcmdhbmlzYXRpb24gaXMgNjQgY2hhbm5lbGZhZGVyIGluIGEgY29udGludW91cyBtZW1vcnkgYmxvY2sgKi8KKy8qIGVxdWl2YWxlbnQgdG8gaGFyZHdhcmUgZGVmaW5pdGlvbiwgbWF5YmUgZm9yIGZ1dHVyZSBmZWF0dXJlIG9mIG1tYXAgb2YKKyAqIHRoZW0KKyAqLworLyogZWFjaCBvZiA2NCBvdXRwdXRzIGhhcyA2NCBpbmZhZGVyIGFuZCA2NCBvdXRmYWRlcjoKKyAgIElucyB0byBPdXRzIG1peGVyW291dF0uaW5baW5dLCBPdXRzdHJlYW1zIHRvIE91dHMgbWl4ZXJbb3V0XS5wYltwYl0gKi8KKworI2RlZmluZSBIRFNQTV9NSVhFUl9DSEFOTkVMUyBIRFNQTV9NQVhfQ0hBTk5FTFMKKworc3RydWN0IGhkc3BtX2NoYW5uZWxmYWRlciB7CisJdW5zaWduZWQgaW50IGluW0hEU1BNX01JWEVSX0NIQU5ORUxTXTsKKwl1bnNpZ25lZCBpbnQgcGJbSERTUE1fTUlYRVJfQ0hBTk5FTFNdOworfTsKKworc3RydWN0IGhkc3BtX21peGVyIHsKKwlzdHJ1Y3QgaGRzcG1fY2hhbm5lbGZhZGVyIGNoW0hEU1BNX01JWEVSX0NIQU5ORUxTXTsKK307CisKK3N0cnVjdCBoZHNwbV9taXhlcl9pb2N0bCB7CisJc3RydWN0IGhkc3BtX21peGVyICptaXhlcjsKK307CisKKy8qIHVzZSBpbmRpcmVjdCBhY2Nlc3MgZHVlIHRvIHRoZSBsaW1pdCBvZiBpb2N0bCBiaXQgc2l6ZSAqLworI2RlZmluZSBTTkRSVl9IRFNQTV9JT0NUTF9HRVRfTUlYRVIgX0lPUignSCcsIDB4NDQsIHN0cnVjdCBoZHNwbV9taXhlcl9pb2N0bCkKKworLyogdHlwZWRlZnMgZm9yIGNvbXBhdGliaWxpdHkgdG8gdXNlci1zcGFjZSAqLwordHlwZWRlZiBzdHJ1Y3QgaGRzcG1fcGVha19ybXMgaGRzcG1fcGVha19ybXNfdDsKK3R5cGVkZWYgc3RydWN0IGhkc3BtX2NvbmZpZ19pbmZvIGhkc3BtX2NvbmZpZ19pbmZvX3Q7Cit0eXBlZGVmIHN0cnVjdCBoZHNwbV92ZXJzaW9uIGhkc3BtX3ZlcnNpb25fdDsKK3R5cGVkZWYgc3RydWN0IGhkc3BtX2NoYW5uZWxmYWRlciBzbmRfaGRzcG1fY2hhbm5lbGZhZGVyX3Q7Cit0eXBlZGVmIHN0cnVjdCBoZHNwbV9taXhlciBoZHNwbV9taXhlcl90OworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zb3VuZC9zYjE2X2NzcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zb3VuZC9zYjE2X2NzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNDJlYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3NvdW5kL3NiMTZfY3NwLmgKQEAgLTAsMCArMSwxMjIgQEAKKyNpZm5kZWYgX19TT1VORF9TQjE2X0NTUF9ICisjZGVmaW5lIF9fU09VTkRfU0IxNl9DU1BfSAorCisvKgorICogIENvcHlyaWdodCAoYykgMTk5OSBieSBVcm9zIEJpemphayA8dXJvc0Brc3MtbG9rYS5zaT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqICBTQjE2QVNQL0FXRTMyIENTUCBjb250cm9sCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworLyogQ1NQIG1vZGVzICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9NT0RFX05PTkUJCTB4MDAKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX01PREVfRFNQX1JFQUQJMHgwMQkvKiBSZWNvcmQgZnJvbSBEU1AgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX01PREVfRFNQX1dSSVRFCTB4MDIJLyogUGxheSB0byBEU1AgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX01PREVfUVNPVU5ECQkweDA0CS8qIFFTb3VuZCAqLworCisvKiBDU1AgbG9hZCBmbGFncyAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfTE9BRF9GUk9NVVNFUgkweDAxCisjZGVmaW5lIFNORFJWX1NCX0NTUF9MT0FEX0lOSVRCTE9DSwkweDAyCisKKy8qIENTUCBzYW1wbGUgd2lkdGggKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1NBTVBMRV84QklUCQkweDAxCisjZGVmaW5lIFNORFJWX1NCX0NTUF9TQU1QTEVfMTZCSVQJCTB4MDIKKworLyogQ1NQIGNoYW5uZWxzICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9NT05PCQkJMHgwMQorI2RlZmluZSBTTkRSVl9TQl9DU1BfU1RFUkVPCQkweDAyCisKKy8qIENTUCByYXRlcyAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfUkFURV84MDAwCQkweDAxCisjZGVmaW5lIFNORFJWX1NCX0NTUF9SQVRFXzExMDI1CQkweDAyCisjZGVmaW5lIFNORFJWX1NCX0NTUF9SQVRFXzIyMDUwCQkweDA0CisjZGVmaW5lIFNORFJWX1NCX0NTUF9SQVRFXzQ0MTAwCQkweDA4CisjZGVmaW5lIFNORFJWX1NCX0NTUF9SQVRFX0FMTAkJMHgwZgorCisvKiBDU1AgcnVubmluZyBzdGF0ZSAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfU1RfSURMRQkJMHgwMAorI2RlZmluZSBTTkRSVl9TQl9DU1BfU1RfTE9BREVECQkweDAxCisjZGVmaW5lIFNORFJWX1NCX0NTUF9TVF9SVU5OSU5HCQkweDAyCisjZGVmaW5lIFNORFJWX1NCX0NTUF9TVF9QQVVTRUQJCTB4MDQKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1NUX0FVVE8JCTB4MDgKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1NUX1FTT1VORAkJMHgxMAorCisvKiBtYXhpbXVtIFFTb3VuZCB2YWx1ZSAoMTgwIGRlZ3JlZXMgcmlnaHQpICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9RU09VTkRfTUFYX1JJR0hUCTB4MjAKKworLyogbWF4aW11bSBtaWNyb2NvZGUgUklGRiBmaWxlIHNpemUgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX01BWF9NSUNST0NPREVfRklMRV9TSVpFCTB4MzAwMAorCisvKiBtaWNyb2NvZGUgaGVhZGVyICovCitzdHJ1Y3Qgc25kX3NiX2NzcF9tY19oZWFkZXIgeworCWNoYXIgY29kZWNfbmFtZVsxNl07CQkvKiBpZCBuYW1lIG9mIGNvZGVjICovCisJdW5zaWduZWQgc2hvcnQgZnVuY19yZXE7CS8qIHJlcXVlc3RlZCBmdW5jdGlvbiAqLworfTsKKworLyogbWljcm9jb2RlIHRvIGJlIGxvYWRlZCAqLworc3RydWN0IHNuZF9zYl9jc3BfbWljcm9jb2RlIHsKKwlzdHJ1Y3Qgc25kX3NiX2NzcF9tY19oZWFkZXIgaW5mbzsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbU05EUlZfU0JfQ1NQX01BWF9NSUNST0NPREVfRklMRV9TSVpFXTsKK307CisKKy8qIHN0YXJ0IENTUCB3aXRoIHNhbXBsZV93aWR0aCBpbiBtb25vL3N0ZXJlbyAqLworc3RydWN0IHNuZF9zYl9jc3Bfc3RhcnQgeworCWludCBzYW1wbGVfd2lkdGg7CS8qIHNhbXBsZSB3aWR0aCwgbG9vayBhYm92ZSAqLworCWludCBjaGFubmVsczsJCS8qIGNoYW5uZWxzLCBsb29rIGFib3ZlICovCit9OworCisvKiBDU1AgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBzbmRfc2JfY3NwX2luZm8geworCWNoYXIgY29kZWNfbmFtZVsxNl07CQkvKiBpZCBuYW1lIG9mIGNvZGVjICovCisJdW5zaWduZWQgc2hvcnQgZnVuY19ucjsJCS8qIGZ1bmN0aW9uIG51bWJlciAqLworCXVuc2lnbmVkIGludCBhY2NfZm9ybWF0OwkvKiBhY2NlcHRlZCBQQ00gZm9ybWF0cyAqLworCXVuc2lnbmVkIHNob3J0IGFjY19jaGFubmVsczsJLyogYWNjZXB0ZWQgY2hhbm5lbHMgKi8KKwl1bnNpZ25lZCBzaG9ydCBhY2Nfd2lkdGg7CS8qIGFjY2VwdGVkIHNhbXBsZSB3aWR0aCAqLworCXVuc2lnbmVkIHNob3J0IGFjY19yYXRlczsJLyogYWNjZXB0ZWQgc2FtcGxlIHJhdGVzICovCisJdW5zaWduZWQgc2hvcnQgY3NwX21vZGU7CS8qIENTUCBtb2RlLCBzZWUgYWJvdmUgKi8KKwl1bnNpZ25lZCBzaG9ydCBydW5fY2hhbm5lbHM7CS8qIGN1cnJlbnQgY2hhbm5lbHMgICovCisJdW5zaWduZWQgc2hvcnQgcnVuX3dpZHRoOwkvKiBjdXJyZW50IHNhbXBsZSB3aWR0aCAqLworCXVuc2lnbmVkIHNob3J0IHZlcnNpb247CQkvKiB2ZXJzaW9uIGlkOiAweDEwIC0gMHgxZiAqLworCXVuc2lnbmVkIHNob3J0IHN0YXRlOwkJLyogc3RhdGUgYml0cyAqLworfTsKKworLyogSFdERVAgY29udHJvbHMgKi8KKy8qIGdldCBDU1AgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX0lPQ1RMX0lORk8JCV9JT1IoJ0gnLCAweDEwLCBzdHJ1Y3Qgc25kX3NiX2NzcF9pbmZvKQorLyogbG9hZCBtaWNyb2NvZGUgdG8gQ1NQICovCisvKiBOT1RFOiBzdHJ1Y3Qgc25kX3NiX2NzcF9taWNyb2NvZGUgb3ZlcmZsb3dzIHRoZSBtYXggc2l6ZSAoMTMgYml0cykKKyAqIGRlZmluZWQgZm9yIHNvbWUgYXJjaGl0ZWN0dXJlcyBsaWtlIE1JUFMsIGFuZCBpdCBsZWFkcyB0byBidWlsZCBlcnJvcnMuCisgKiAoeDg2IGFuZCBjbyBoYXZlIDE0LWJpdCBzaXplLCB0aHVzIGl0J3MgdmFsaWQsIHRob3VnaC4pCisgKiBBcyBhIHdvcmthcm91bmQgZm9yIHNraXBwaW5nIHRoZSBzaXplLWxpbWl0IGNoZWNrLCBoZXJlIHdlIGRvbid0IHVzZSB0aGUKKyAqIG5vcm1hbCBfSU9XKCkgbWFjcm8gYnV0IF9JT0MoKSB3aXRoIHRoZSBtYW51YWwgYXJndW1lbnQuCisgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX0lPQ1RMX0xPQURfQ09ERQlcCisJX0lPQyhfSU9DX1dSSVRFLCAnSCcsIDB4MTEsIHNpemVvZihzdHJ1Y3Qgc25kX3NiX2NzcF9taWNyb2NvZGUpKQorLyogdW5sb2FkIG1pY3JvY29kZSBmcm9tIENTUCAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfSU9DVExfVU5MT0FEX0NPREUJX0lPKCdIJywgMHgxMikKKy8qIHN0YXJ0IENTUCAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfSU9DVExfU1RBUlQJCV9JT1coJ0gnLCAweDEzLCBzdHJ1Y3Qgc25kX3NiX2NzcF9zdGFydCkKKy8qIHN0b3AgQ1NQICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9JT0NUTF9TVE9QCQlfSU8oJ0gnLCAweDE0KQorLyogcGF1c2UgQ1NQIGFuZCBETUEgdHJhbnNmZXIgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX0lPQ1RMX1BBVVNFCQlfSU8oJ0gnLCAweDE1KQorLyogcmVzdGFydCBDU1AgYW5kIERNQSB0cmFuc2ZlciAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfSU9DVExfUkVTVEFSVAlfSU8oJ0gnLCAweDE2KQorCisKKyNlbmRpZiAvKiBfX1NPVU5EX1NCMTZfQ1NQICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3NvdW5kL3NmbnRfaW5mby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zb3VuZC9zZm50X2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmNlN2ZkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zb3VuZC9zZm50X2luZm8uaApAQCAtMCwwICsxLDIxMiBAQAorI2lmbmRlZiBfX1NPVU5EX1NGTlRfSU5GT19ICisjZGVmaW5lIF9fU09VTkRfU0ZOVF9JTkZPX0gKKworLyoKKyAqICBQYXRjaCByZWNvcmQgY29tcGF0aWJsZSB3aXRoIEFXRSBkcml2ZXIgb24gT1NTCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OS0yMDAwIFRha2FzaGkgSXdhaQorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZC5oPgorCisvKgorICogcGF0Y2ggaW5mb3JtYXRpb24gcmVjb3JkCisgKi8KKworI2lmZGVmIFNORFJWX0JJR19FTkRJQU4KKyNkZWZpbmUgU05EUlZfT1NTX1BBVENIS0VZKGlkKSAoMHhmZDAwfGlkKQorI2Vsc2UKKyNkZWZpbmUgU05EUlZfT1NTX1BBVENIS0VZKGlkKSAoKGlkPDw4KXwweGZkKQorI2VuZGlmCisKKy8qIHBhdGNoIGludGVyZmFjZSBoZWFkZXI6IDE2IGJ5dGVzICovCitzdHJ1Y3Qgc291bmRmb250X3BhdGNoX2luZm8geworCXVuc2lnbmVkIHNob3J0IGtleTsJCS8qIHVzZSB0aGUga2V5IGJlbG93ICovCisjZGVmaW5lIFNORFJWX09TU19TT1VOREZPTlRfUEFUQ0gJCVNORFJWX09TU19QQVRDSEtFWSgweDA3KQorCisJc2hvcnQgZGV2aWNlX25vOwkJLyogc3ludGhlc2l6ZXIgbnVtYmVyICovCisJdW5zaWduZWQgc2hvcnQgc2ZfaWQ7CQkvKiBmaWxlIGlkIChzaG91bGQgYmUgemVybykgKi8KKwlzaG9ydCBvcHRhcmc7CQkJLyogb3B0aW9uYWwgYXJndW1lbnQgKi8KKwlpbnQgbGVuOwkJCS8qIGRhdGEgbGVuZ3RoICh3aXRob3V0IHRoaXMgaGVhZGVyKSAqLworCisJc2hvcnQgdHlwZTsJCQkvKiBwYXRjaCBvcGVyYXRpb24gdHlwZSAqLworI2RlZmluZSBTTkRSVl9TRk5UX0xPQURfSU5GTwkJMAkvKiBhd2Vfdm9pY2VfcmVjICovCisjZGVmaW5lIFNORFJWX1NGTlRfTE9BRF9EQVRBCQkxCS8qIGF3ZV9zYW1wbGVfaW5mbyAqLworI2RlZmluZSBTTkRSVl9TRk5UX09QRU5fUEFUQ0gJMgkvKiBhd2Vfb3Blbl9wYXJtICovCisjZGVmaW5lIFNORFJWX1NGTlRfQ0xPU0VfUEFUQ0gJMwkvKiBub25lICovCisJLyogNCBpcyBvYnNvbGV0ZSAqLworI2RlZmluZSBTTkRSVl9TRk5UX1JFUExBQ0VfREFUQQk1CS8qIGF3ZV9zYW1wbGVfaW5mbyAob3B0YXJnPSNjaGFubmVscykqLworI2RlZmluZSBTTkRSVl9TRk5UX01BUF9QUkVTRVQJNgkvKiBhd2Vfdm9pY2VfbWFwICovCisJLyogNyBpcyBub3QgdXNlZCAqLworI2RlZmluZSBTTkRSVl9TRk5UX1BST0JFX0RBVEEJCTgJLyogb3B0YXJnPXNhbXBsZSAqLworI2RlZmluZSBTTkRSVl9TRk5UX1JFTU9WRV9JTkZPCQk5CS8qIG9wdGFyZz0oYmFuazw8OCl8aW5zdHIgKi8KKworCXNob3J0IHJlc2VydmVkOwkJCS8qIHdvcmQgYWxpZ25tZW50IGRhdGEgKi8KKworCS8qIHRoZSBhY3R1YWwgcGF0Y2ggZGF0YSBiZWdpbnMgYWZ0ZXIgdGhpcyAqLworfTsKKworCisvKgorICogb3BlbiBwYXRjaAorICovCisKKyNkZWZpbmUgU05EUlZfU0ZOVF9QQVRDSF9OQU1FX0xFTgkzMgorCitzdHJ1Y3Qgc291bmRmb250X29wZW5fcGFybSB7CisJdW5zaWduZWQgc2hvcnQgdHlwZTsJCS8qIHNhbXBsZSB0eXBlICovCisjZGVmaW5lIFNORFJWX1NGTlRfUEFUX1RZUEVfTUlTQwkwCisjZGVmaW5lIFNORFJWX1NGTlRfUEFUX1RZUEVfR1VTCTYKKyNkZWZpbmUgU05EUlZfU0ZOVF9QQVRfVFlQRV9NQVAJNworI2RlZmluZSBTTkRSVl9TRk5UX1BBVF9MT0NLRUQJMHgxMDAJLyogbG9jayB0aGUgc2FtcGxlcyAqLworI2RlZmluZSBTTkRSVl9TRk5UX1BBVF9TSEFSRUQJMHgyMDAJLyogc2FtcGxlIGlzIHNoYXJlZCAqLworCisJc2hvcnQgcmVzZXJ2ZWQ7CisJY2hhciBuYW1lW1NORFJWX1NGTlRfUEFUQ0hfTkFNRV9MRU5dOworfTsKKworCisvKgorICogcmF3IHZvaWNlIGluZm9ybWF0aW9uIHJlY29yZAorICovCisKKy8qIHdhdmUgdGFibGUgZW52ZWxvcGUgJiBlZmZlY3QgcGFyYW1ldGVycyB0byBjb250cm9sIEVNVTgwMDAgKi8KK3N0cnVjdCBzb3VuZGZvbnRfdm9pY2VfcGFybSB7CisJdW5zaWduZWQgc2hvcnQgbW9kZGVsYXk7CS8qIG1vZHVsYXRpb24gZGVsYXkgKDB4ODAwMCkgKi8KKwl1bnNpZ25lZCBzaG9ydCBtb2RhdGtobGQ7CS8qIG1vZHVsYXRpb24gYXR0YWNrICYgaG9sZCB0aW1lICgweDdmN2YpICovCisJdW5zaWduZWQgc2hvcnQgbW9kZGN5c3VzOwkvKiBtb2R1bGF0aW9uIGRlY2F5ICYgc3VzdGFpbiAoMHg3ZjdmKSAqLworCXVuc2lnbmVkIHNob3J0IG1vZHJlbGVhc2U7CS8qIG1vZHVsYXRpb24gcmVsZWFzZSB0aW1lICgweDgwN2YpICovCisJc2hvcnQgbW9ka2V5aG9sZCwgbW9ka2V5ZGVjYXk7CS8qIGVudmVsb3BlIGNoYW5nZSBwZXIga2V5IChub3QgdXNlZCkgKi8KKwl1bnNpZ25lZCBzaG9ydCB2b2xkZWxheTsJLyogdm9sdW1lIGRlbGF5ICgweDgwMDApICovCisJdW5zaWduZWQgc2hvcnQgdm9sYXRraGxkOwkvKiB2b2x1bWUgYXR0YWNrICYgaG9sZCB0aW1lICgweDdmN2YpICovCisJdW5zaWduZWQgc2hvcnQgdm9sZGN5c3VzOwkvKiB2b2x1bWUgZGVjYXkgJiBzdXN0YWluICgweDdmN2YpICovCisJdW5zaWduZWQgc2hvcnQgdm9scmVsZWFzZTsJLyogdm9sdW1lIHJlbGVhc2UgdGltZSAoMHg4MDdmKSAqLworCXNob3J0IHZvbGtleWhvbGQsIHZvbGtleWRlY2F5OwkvKiBlbnZlbG9wZSBjaGFuZ2UgcGVyIGtleSAobm90IHVzZWQpICovCisJdW5zaWduZWQgc2hvcnQgbGZvMWRlbGF5OwkvKiBMRk8xIGRlbGF5ICgweDgwMDApICovCisJdW5zaWduZWQgc2hvcnQgbGZvMmRlbGF5OwkvKiBMRk8yIGRlbGF5ICgweDgwMDApICovCisJdW5zaWduZWQgc2hvcnQgcGVmZTsJCS8qIG1vZHVsYXRpb24gcGl0Y2ggJiBjdXRvZmYgKDB4MDAwMCkgKi8KKwl1bnNpZ25lZCBzaG9ydCBmbW1vZDsJCS8qIExGTzEgcGl0Y2ggJiBjdXRvZmYgKDB4MDAwMCkgKi8KKwl1bnNpZ25lZCBzaG9ydCB0cmVtZnJxOwkJLyogTEZPMSB2b2x1bWUgJiBmcmVxICgweDAwMDApICovCisJdW5zaWduZWQgc2hvcnQgZm0yZnJxMjsJCS8qIExGTzIgcGl0Y2ggJiBmcmVxICgweDAwMDApICovCisJdW5zaWduZWQgY2hhciBjdXRvZmY7CQkvKiBpbml0aWFsIGN1dG9mZiAoMHhmZikgKi8KKwl1bnNpZ25lZCBjaGFyIGZpbHRlclE7CQkvKiBpbml0aWFsIGZpbHRlciBRIFswLTE1XSAoMHgwKSAqLworCXVuc2lnbmVkIGNoYXIgY2hvcnVzOwkJLyogY2hvcnVzIHNlbmQgKDB4MDApICovCisJdW5zaWduZWQgY2hhciByZXZlcmI7CQkvKiByZXZlcmIgc2VuZCAoMHgwMCkgKi8KKwl1bnNpZ25lZCBzaG9ydCByZXNlcnZlZFs0XTsJLyogbm90IHVzZWQgKi8KK307CisKKworLyogd2F2ZSB0YWJsZSBwYXJhbWV0ZXJzOiA5MiBieXRlcyAqLworc3RydWN0IHNvdW5kZm9udF92b2ljZV9pbmZvIHsKKwl1bnNpZ25lZCBzaG9ydCBzZl9pZDsJCS8qIGZpbGUgaWQgKHNob3VsZCBiZSB6ZXJvKSAqLworCXVuc2lnbmVkIHNob3J0IHNhbXBsZTsJCS8qIHNhbXBsZSBpZCAqLworCWludCBzdGFydCwgZW5kOwkJCS8qIHNhbXBsZSBvZmZzZXQgY29ycmVjdGlvbiAqLworCWludCBsb29wc3RhcnQsIGxvb3BlbmQ7CQkvKiBsb29wIG9mZnNldCBjb3JyZWN0aW9uICovCisJc2hvcnQgcmF0ZV9vZmZzZXQ7CQkvKiBzYW1wbGUgcmF0ZSBwaXRjaCBvZmZzZXQgKi8KKwl1bnNpZ25lZCBzaG9ydCBtb2RlOwkJLyogc2FtcGxlIG1vZGUgKi8KKyNkZWZpbmUgU05EUlZfU0ZOVF9NT0RFX1JPTVNPVU5ECQkweDgwMDAKKyNkZWZpbmUgU05EUlZfU0ZOVF9NT0RFX1NURVJFTwkJMQorI2RlZmluZSBTTkRSVl9TRk5UX01PREVfTE9PUElORwkJMgorI2RlZmluZSBTTkRSVl9TRk5UX01PREVfTk9SRUxFQVNFCQk0CS8qIG9ic29sZXRlICovCisjZGVmaW5lIFNORFJWX1NGTlRfTU9ERV9JTklUX1BBUk0JCTgKKworCXNob3J0IHJvb3Q7CQkJLyogbWlkaSByb290IGtleSAqLworCXNob3J0IHR1bmU7CQkJLyogcGl0Y2ggdHVuaW5nIChpbiBjZW50cykgKi8KKwl1bnNpZ25lZCBjaGFyIGxvdywgaGlnaDsJLyoga2V5IG5vdGUgcmFuZ2UgKi8KKwl1bnNpZ25lZCBjaGFyIHZlbGxvdywgdmVsaGlnaDsJLyogdmVsb2NpdHkgcmFuZ2UgKi8KKwlzaWduZWQgY2hhciBmaXhrZXksIGZpeHZlbDsJLyogZml4ZWQga2V5LCB2ZWxvY2l0eSAqLworCXNpZ25lZCBjaGFyIHBhbiwgZml4cGFuOwkvKiBwYW5uaW5nLCBmaXhlZCBwYW5uaW5nICovCisJc2hvcnQgZXhjbHVzaXZlQ2xhc3M7CQkvKiBleGNsdXNpdmUgY2xhc3MgKDAgPSBub25lKSAqLworCXVuc2lnbmVkIGNoYXIgYW1wbGl0dWRlOwkvKiBzYW1wbGUgdm9sdW1lICgxMjcgbWF4KSAqLworCXVuc2lnbmVkIGNoYXIgYXR0ZW51YXRpb247CS8qIGF0dGVudWF0aW9uICgwLjM3NWRCKSAqLworCXNob3J0IHNjYWxlVHVuaW5nOwkJLyogcGl0Y2ggc2NhbGUgdHVuaW5nKCUpLCBub3JtYWxseSAxMDAgKi8KKwlzdHJ1Y3Qgc291bmRmb250X3ZvaWNlX3Bhcm0gcGFybTsJLyogdm9pY2UgZW52ZWxvcGUgcGFyYW1ldGVycyAqLworCXVuc2lnbmVkIHNob3J0IHNhbXBsZV9tb2RlOwkvKiBzYW1wbGUgbW9kZV9mbGFnIChzZXQgYnkgZHJpdmVyKSAqLworfTsKKworCisvKiBpbnN0cnVtZW50IGluZm8gaGVhZGVyOiA0IGJ5dGVzICovCitzdHJ1Y3Qgc291bmRmb250X3ZvaWNlX3JlY19oZHIgeworCXVuc2lnbmVkIGNoYXIgYmFuazsJCS8qIG1pZGkgYmFuayBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaGFyIGluc3RyOwkJLyogbWlkaSBwcmVzZXQgbnVtYmVyICovCisJY2hhciBudm9pY2VzOwkJCS8qIG51bWJlciBvZiB2b2ljZXMgKi8KKwljaGFyIHdyaXRlX21vZGU7CQkvKiB3cml0ZSBtb2RlOyBub3JtYWxseSAwICovCisjZGVmaW5lIFNORFJWX1NGTlRfV1JfQVBQRU5ECQkwCS8qIGFwcGVuZCBhbnl3YXkgKi8KKyNkZWZpbmUgU05EUlZfU0ZOVF9XUl9FWENMVVNJVkUJCTEJLyogc2tpcCBpZiBhbHJlYWR5IGV4aXN0cyAqLworI2RlZmluZSBTTkRSVl9TRk5UX1dSX1JFUExBQ0UJCTIJLyogcmVwbGFjZSBpZiBhbHJlYWR5IGV4aXN0cyAqLworfTsKKworCisvKgorICogc2FtcGxlIHdhdmUgaW5mb3JtYXRpb24KKyAqLworCisvKiB3YXZlIHRhYmxlIHNhbXBsZSBoZWFkZXI6IDMyIGJ5dGVzICovCitzdHJ1Y3Qgc291bmRmb250X3NhbXBsZV9pbmZvIHsKKwl1bnNpZ25lZCBzaG9ydCBzZl9pZDsJCS8qIGZpbGUgaWQgKHNob3VsZCBiZSB6ZXJvKSAqLworCXVuc2lnbmVkIHNob3J0IHNhbXBsZTsJCS8qIHNhbXBsZSBpZCAqLworCWludCBzdGFydCwgZW5kOwkJCS8qIHN0YXJ0ICYgZW5kIG9mZnNldCAqLworCWludCBsb29wc3RhcnQsIGxvb3BlbmQ7CQkvKiBsb29wIHN0YXJ0ICYgZW5kIG9mZnNldCAqLworCWludCBzaXplOwkJCS8qIHNpemUgKDAgPSBST00pICovCisJc2hvcnQgZHVtbXk7CQkJLyogbm90IHVzZWQgKi8KKwl1bnNpZ25lZCBzaG9ydCBtb2RlX2ZsYWdzOwkvKiBtb2RlIGZsYWdzICovCisjZGVmaW5lIFNORFJWX1NGTlRfU0FNUExFXzhCSVRTCQkxCS8qIHdhdmUgZGF0YSBpcyA4Yml0cyAqLworI2RlZmluZSBTTkRSVl9TRk5UX1NBTVBMRV9VTlNJR05FRAkyCS8qIHdhdmUgZGF0YSBpcyB1bnNpZ25lZCAqLworI2RlZmluZSBTTkRSVl9TRk5UX1NBTVBMRV9OT19CTEFOSwk0CS8qIG5vIGJsYW5rIGxvb3AgaXMgYXR0YWNoZWQgKi8KKyNkZWZpbmUgU05EUlZfU0ZOVF9TQU1QTEVfU0lOR0xFU0hPVAk4CS8qIHNpbmdsZS1zaG90IHcvbyBsb29wICovCisjZGVmaW5lIFNORFJWX1NGTlRfU0FNUExFX0JJRElSX0xPT1AJMTYJLyogYmlkaXJlY3Rpb25hbCBsb29waW5nICovCisjZGVmaW5lIFNORFJWX1NGTlRfU0FNUExFX1NURVJFT19MRUZUCTMyCS8qIHN0ZXJlbyBsZWZ0IHNvdW5kICovCisjZGVmaW5lIFNORFJWX1NGTlRfU0FNUExFX1NURVJFT19SSUdIVAk2NAkvKiBzdGVyZW8gcmlnaHQgc291bmQgKi8KKyNkZWZpbmUgU05EUlZfU0ZOVF9TQU1QTEVfUkVWRVJTRV9MT09QCTEyOAkvKiByZXZlcnNlIGxvb3BpbmcgKi8KKwl1bnNpZ25lZCBpbnQgdHJ1ZXNpemU7CQkvKiB1c2VkIG1lbW9yeSBzaXplIChzZXQgYnkgZHJpdmVyKSAqLworfTsKKworCisvKgorICogdm9pY2UgcHJlc2V0IG1hcHBpbmcgKGFsaWFzaW5nKQorICovCisKK3N0cnVjdCBzb3VuZGZvbnRfdm9pY2VfbWFwIHsKKwlpbnQgbWFwX2JhbmssIG1hcF9pbnN0ciwgbWFwX2tleTsJLyoga2V5ID0gLTEgbWVhbnMgYWxsIGtleXMgKi8KKwlpbnQgc3JjX2JhbmssIHNyY19pbnN0ciwgc3JjX2tleTsKK307CisKKworLyoKKyAqIGlvY3RscyBmb3IgaHdkZXAKKyAqLworCisjZGVmaW5lIFNORFJWX0VNVVhfSFdERVBfTkFNRQkiRW11eCBXYXZlVGFibGUiCisKKyNkZWZpbmUgU05EUlZfRU1VWF9WRVJTSU9OCSgoMSA8PCAxNikgfCAoMCA8PCA4KSB8IDApCS8qIDEuMC4wICovCisKK3N0cnVjdCBzbmRfZW11eF9taXNjX21vZGUgeworCWludCBwb3J0OwkvKiAtMSA9IGFsbCAqLworCWludCBtb2RlOworCWludCB2YWx1ZTsKKwlpbnQgdmFsdWUyOwkvKiByZXNlcnZlZCAqLworfTsKKworI2RlZmluZSBTTkRSVl9FTVVYX0lPQ1RMX1ZFUlNJT04JX0lPUignSCcsIDB4ODAsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgU05EUlZfRU1VWF9JT0NUTF9MT0FEX1BBVENICV9JT1dSKCdIJywgMHg4MSwgc3RydWN0IHNvdW5kZm9udF9wYXRjaF9pbmZvKQorI2RlZmluZSBTTkRSVl9FTVVYX0lPQ1RMX1JFU0VUX1NBTVBMRVMJX0lPKCdIJywgMHg4MikKKyNkZWZpbmUgU05EUlZfRU1VWF9JT0NUTF9SRU1PVkVfTEFTVF9TQU1QTEVTIF9JTygnSCcsIDB4ODMpCisjZGVmaW5lIFNORFJWX0VNVVhfSU9DVExfTUVNX0FWQUlMCV9JT1coJ0gnLCAweDg0LCBpbnQpCisjZGVmaW5lIFNORFJWX0VNVVhfSU9DVExfTUlTQ19NT0RFCV9JT1dSKCdIJywgMHg4NCwgc3RydWN0IHNuZF9lbXV4X21pc2NfbW9kZSkKKworI2VuZGlmIC8qIF9fU09VTkRfU0ZOVF9JTkZPX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3Bhd24uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3Bhd24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWVmYTBmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zcGF3bi5oCkBAIC0wLDAgKzEsMTkwIEBACisvKiBEZWZpbml0aW9ucyBmb3IgUE9TSVggc3Bhd24gaW50ZXJmYWNlLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAzLCAyMDA0LCAyMDA5LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TUEFXTl9ICisjZGVmaW5lCV9TUEFXTl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworCisvKiBEYXRhIHN0cnVjdHVyZSB0byBjb250YWluIGF0dHJpYnV0ZXMgZm9yIHRocmVhZCBjcmVhdGlvbi4gICovCit0eXBlZGVmIHN0cnVjdAoreworICBzaG9ydCBpbnQgX19mbGFnczsKKyAgcGlkX3QgX19wZ3JwOworICBzaWdzZXRfdCBfX3NkOworICBzaWdzZXRfdCBfX3NzOworICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gX19zcDsKKyAgaW50IF9fcG9saWN5OworICBpbnQgX19wYWRbMTZdOworfSBwb3NpeF9zcGF3bmF0dHJfdDsKKworCisvKiBEYXRhIHN0cnVjdHVyZSB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhY3Rpb25zIHRvIGJlCisgICBwZXJmb3JtZWQgaW4gdGhlIG5ldyBwcm9jZXNzIHdpdGggcmVzcGVjdCB0byBmaWxlIGRlc2NyaXB0b3JzLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCBfX2FsbG9jYXRlZDsKKyAgaW50IF9fdXNlZDsKKyAgc3RydWN0IF9fc3Bhd25fYWN0aW9uICpfX2FjdGlvbnM7CisgIGludCBfX3BhZFsxNl07Cit9IHBvc2l4X3NwYXduX2ZpbGVfYWN0aW9uc190OworCisKKy8qIEZsYWdzIHRvIGJlIHNldCBpbiB0aGUgYHBvc2l4X3NwYXduYXR0cl90Jy4gICovCisjZGVmaW5lIFBPU0lYX1NQQVdOX1JFU0VUSURTCQkweDAxCisjZGVmaW5lIFBPU0lYX1NQQVdOX1NFVFBHUk9VUAkJMHgwMgorI2RlZmluZSBQT1NJWF9TUEFXTl9TRVRTSUdERUYJCTB4MDQKKyNkZWZpbmUgUE9TSVhfU1BBV05fU0VUU0lHTUFTSwkJMHgwOAorI2RlZmluZSBQT1NJWF9TUEFXTl9TRVRTQ0hFRFBBUkFNCTB4MTAKKyNkZWZpbmUgUE9TSVhfU1BBV05fU0VUU0NIRURVTEVSCTB4MjAKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIFBPU0lYX1NQQVdOX1VTRVZGT1JLCQkweDQwCisjZW5kaWYKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFNwYXduIGEgbmV3IHByb2Nlc3MgZXhlY3V0aW5nIFBBVEggd2l0aCB0aGUgYXR0cmlidXRlcyBkZXNjcmliZXMgaW4gKkFUVFJQLgorICAgQmVmb3JlIHJ1bm5pbmcgdGhlIHByb2Nlc3MgcGVyZm9ybSB0aGUgYWN0aW9ucyBkZXNjcmliZWQgaW4gRklMRS1BQ1RJT05TLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAqLworZXh0ZXJuIGludCBwb3NpeF9zcGF3biAocGlkX3QgKl9fcmVzdHJpY3QgX19waWQsCisJCQlfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wYXRoLAorCQkJX19jb25zdCBwb3NpeF9zcGF3bl9maWxlX2FjdGlvbnNfdCAqX19yZXN0cmljdAorCQkJX19maWxlX2FjdGlvbnMsCisJCQlfX2NvbnN0IHBvc2l4X3NwYXduYXR0cl90ICpfX3Jlc3RyaWN0IF9fYXR0cnAsCisJCQljaGFyICpfX2NvbnN0IF9fYXJndltfX3Jlc3RyaWN0X2Fycl0sCisJCQljaGFyICpfX2NvbnN0IF9fZW52cFtfX3Jlc3RyaWN0X2Fycl0pOworCisvKiBTaW1pbGFyIHRvIGBwb3NpeF9zcGF3bicgYnV0IHNlYXJjaCBmb3IgRklMRSBpbiB0aGUgUEFUSC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHBvc2l4X3NwYXducCAocGlkX3QgKl9fcGlkLCBfX2NvbnN0IGNoYXIgKl9fZmlsZSwKKwkJCSBfX2NvbnN0IHBvc2l4X3NwYXduX2ZpbGVfYWN0aW9uc190ICpfX2ZpbGVfYWN0aW9ucywKKwkJCSBfX2NvbnN0IHBvc2l4X3NwYXduYXR0cl90ICpfX2F0dHJwLAorCQkJIGNoYXIgKl9fY29uc3QgX19hcmd2W10sIGNoYXIgKl9fY29uc3QgX19lbnZwW10pOworCisKKy8qIEluaXRpYWxpemUgZGF0YSBzdHJ1Y3R1cmUgd2l0aCBhdHRyaWJ1dGVzIGZvciBgc3Bhd24nIHRvIGRlZmF1bHQgdmFsdWVzLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25hdHRyX2luaXQgKHBvc2l4X3NwYXduYXR0cl90ICpfX2F0dHIpIF9fVEhST1c7CisKKy8qIEZyZWUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBBVFRSLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25hdHRyX2Rlc3Ryb3kgKHBvc2l4X3NwYXduYXR0cl90ICpfX2F0dHIpIF9fVEhST1c7CisKKy8qIFN0b3JlIHNpZ25hbCBtYXNrIGZvciBzaWduYWxzIHdpdGggZGVmYXVsdCBoYW5kbGluZyBmcm9tIEFUVFIgaW4KKyAgIFNJR0RFRkFVTFQuICAqLworZXh0ZXJuIGludCBwb3NpeF9zcGF3bmF0dHJfZ2V0c2lnZGVmYXVsdCAoX19jb25zdCBwb3NpeF9zcGF3bmF0dHJfdCAqCisJCQkJCSAgX19yZXN0cmljdCBfX2F0dHIsCisJCQkJCSAgc2lnc2V0X3QgKl9fcmVzdHJpY3QgX19zaWdkZWZhdWx0KQorICAgICBfX1RIUk9XOworCisvKiBTZXQgc2lnbmFsIG1hc2sgZm9yIHNpZ25hbHMgd2l0aCBkZWZhdWx0IGhhbmRsaW5nIGluIEFUVFIgdG8gU0lHREVGQVVMVC4gICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduYXR0cl9zZXRzaWdkZWZhdWx0IChwb3NpeF9zcGF3bmF0dHJfdCAqX19yZXN0cmljdCBfX2F0dHIsCisJCQkJCSAgX19jb25zdCBzaWdzZXRfdCAqX19yZXN0cmljdAorCQkJCQkgIF9fc2lnZGVmYXVsdCkKKyAgICAgX19USFJPVzsKKworLyogU3RvcmUgc2lnbmFsIG1hc2sgZm9yIHRoZSBuZXcgcHJvY2VzcyBmcm9tIEFUVFIgaW4gU0lHTUFTSy4gICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduYXR0cl9nZXRzaWdtYXNrIChfX2NvbnN0IHBvc2l4X3NwYXduYXR0cl90ICpfX3Jlc3RyaWN0CisJCQkJICAgICAgIF9fYXR0ciwKKwkJCQkgICAgICAgc2lnc2V0X3QgKl9fcmVzdHJpY3QgX19zaWdtYXNrKSBfX1RIUk9XOworCisvKiBTZXQgc2lnbmFsIG1hc2sgZm9yIHRoZSBuZXcgcHJvY2VzcyBpbiBBVFRSIHRvIFNJR01BU0suICAqLworZXh0ZXJuIGludCBwb3NpeF9zcGF3bmF0dHJfc2V0c2lnbWFzayAocG9zaXhfc3Bhd25hdHRyX3QgKl9fcmVzdHJpY3QgX19hdHRyLAorCQkJCSAgICAgICBfX2NvbnN0IHNpZ3NldF90ICpfX3Jlc3RyaWN0IF9fc2lnbWFzaykKKyAgICAgX19USFJPVzsKKworLyogR2V0IGZsYWcgd29yZCBmcm9tIHRoZSBhdHRyaWJ1dGUgc3RydWN0dXJlLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25hdHRyX2dldGZsYWdzIChfX2NvbnN0IHBvc2l4X3NwYXduYXR0cl90ICpfX3Jlc3RyaWN0CisJCQkJICAgICBfX2F0dHIsCisJCQkJICAgICBzaG9ydCBpbnQgKl9fcmVzdHJpY3QgX19mbGFncykgX19USFJPVzsKKworLyogU3RvcmUgZmxhZ3MgaW4gdGhlIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUuICAqLworZXh0ZXJuIGludCBwb3NpeF9zcGF3bmF0dHJfc2V0ZmxhZ3MgKHBvc2l4X3NwYXduYXR0cl90ICpfYXR0ciwKKwkJCQkgICAgIHNob3J0IGludCBfX2ZsYWdzKSBfX1RIUk9XOworCisvKiBHZXQgcHJvY2VzcyBncm91cCBJRCBmcm9tIHRoZSBhdHRyaWJ1dGUgc3RydWN0dXJlLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25hdHRyX2dldHBncm91cCAoX19jb25zdCBwb3NpeF9zcGF3bmF0dHJfdCAqX19yZXN0cmljdAorCQkJCSAgICAgIF9fYXR0ciwgcGlkX3QgKl9fcmVzdHJpY3QgX19wZ3JvdXApCisgICAgIF9fVEhST1c7CisKKy8qIFN0b3JlIHByb2Nlc3MgZ3JvdXAgSUQgaW4gdGhlIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUuICAqLworZXh0ZXJuIGludCBwb3NpeF9zcGF3bmF0dHJfc2V0cGdyb3VwIChwb3NpeF9zcGF3bmF0dHJfdCAqX19hdHRyLAorCQkJCSAgICAgIHBpZF90IF9fcGdyb3VwKSBfX1RIUk9XOworCisvKiBHZXQgc2NoZWR1bGluZyBwb2xpY3kgZnJvbSB0aGUgYXR0cmlidXRlIHN0cnVjdHVyZS4gICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduYXR0cl9nZXRzY2hlZHBvbGljeSAoX19jb25zdCBwb3NpeF9zcGF3bmF0dHJfdCAqCisJCQkJCSAgIF9fcmVzdHJpY3QgX19hdHRyLAorCQkJCQkgICBpbnQgKl9fcmVzdHJpY3QgX19zY2hlZHBvbGljeSkKKyAgICAgX19USFJPVzsKKworLyogU3RvcmUgc2NoZWR1bGluZyBwb2xpY3kgaW4gdGhlIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUuICAqLworZXh0ZXJuIGludCBwb3NpeF9zcGF3bmF0dHJfc2V0c2NoZWRwb2xpY3kgKHBvc2l4X3NwYXduYXR0cl90ICpfX2F0dHIsCisJCQkJCSAgIGludCBfX3NjaGVkcG9saWN5KSBfX1RIUk9XOworCisvKiBHZXQgc2NoZWR1bGluZyBwYXJhbWV0ZXJzIGZyb20gdGhlIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUuICAqLworZXh0ZXJuIGludCBwb3NpeF9zcGF3bmF0dHJfZ2V0c2NoZWRwYXJhbSAoX19jb25zdCBwb3NpeF9zcGF3bmF0dHJfdCAqCisJCQkJCSAgX19yZXN0cmljdCBfX2F0dHIsCisJCQkJCSAgc3RydWN0IHNjaGVkX3BhcmFtICpfX3Jlc3RyaWN0CisJCQkJCSAgX19zY2hlZHBhcmFtKSBfX1RIUk9XOworCisvKiBTdG9yZSBzY2hlZHVsaW5nIHBhcmFtZXRlcnMgaW4gdGhlIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUuICAqLworZXh0ZXJuIGludCBwb3NpeF9zcGF3bmF0dHJfc2V0c2NoZWRwYXJhbSAocG9zaXhfc3Bhd25hdHRyX3QgKl9fcmVzdHJpY3QgX19hdHRyLAorCQkJCQkgIGNvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqCisJCQkJCSAgX19yZXN0cmljdCBfX3NjaGVkcGFyYW0pIF9fVEhST1c7CisKKworLyogSW5pdGlhbGl6ZSBkYXRhIHN0cnVjdHVyZSBmb3IgZmlsZSBhdHRyaWJ1dGUgZm9yIGBzcGF3bicgY2FsbC4gICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduX2ZpbGVfYWN0aW9uc19pbml0IChwb3NpeF9zcGF3bl9maWxlX2FjdGlvbnNfdCAqCisJCQkJCSAgX19maWxlX2FjdGlvbnMpIF9fVEhST1c7CisKKy8qIEZyZWUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBGSUxFLUFDVElPTlMuICAqLworZXh0ZXJuIGludCBwb3NpeF9zcGF3bl9maWxlX2FjdGlvbnNfZGVzdHJveSAocG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX3QgKgorCQkJCQkgICAgIF9fZmlsZV9hY3Rpb25zKSBfX1RIUk9XOworCisvKiBBZGQgYW4gYWN0aW9uIHRvIEZJTEUtQUNUSU9OUyB3aGljaCB0ZWxscyB0aGUgaW1wbGVtZW50YXRpb24gdG8gY2FsbAorICAgYG9wZW4nIGZvciB0aGUgZ2l2ZW4gZmlsZSBkdXJpbmcgdGhlIGBzcGF3bicgY2FsbC4gICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduX2ZpbGVfYWN0aW9uc19hZGRvcGVuIChwb3NpeF9zcGF3bl9maWxlX2FjdGlvbnNfdCAqCisJCQkJCSAgICAgX19yZXN0cmljdCBfX2ZpbGVfYWN0aW9ucywKKwkJCQkJICAgICBpbnQgX19mZCwKKwkJCQkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wYXRoLAorCQkJCQkgICAgIGludCBfX29mbGFnLCBtb2RlX3QgX19tb2RlKQorICAgICBfX1RIUk9XOworCisvKiBBZGQgYW4gYWN0aW9uIHRvIEZJTEUtQUNUSU9OUyB3aGljaCB0ZWxscyB0aGUgaW1wbGVtZW50YXRpb24gdG8gY2FsbAorICAgYGNsb3NlJyBmb3IgdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvciBkdXJpbmcgdGhlIGBzcGF3bicgY2FsbC4gICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduX2ZpbGVfYWN0aW9uc19hZGRjbG9zZSAocG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX3QgKgorCQkJCQkgICAgICBfX2ZpbGVfYWN0aW9ucywgaW50IF9fZmQpCisgICAgIF9fVEhST1c7CisKKy8qIEFkZCBhbiBhY3Rpb24gdG8gRklMRS1BQ1RJT05TIHdoaWNoIHRlbGxzIHRoZSBpbXBsZW1lbnRhdGlvbiB0byBjYWxsCisgICBgZHVwMicgZm9yIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3JzIGR1cmluZyB0aGUgYHNwYXduJyBjYWxsLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX2FkZGR1cDIgKHBvc2l4X3NwYXduX2ZpbGVfYWN0aW9uc190ICoKKwkJCQkJICAgICBfX2ZpbGVfYWN0aW9ucywKKwkJCQkJICAgICBpbnQgX19mZCwgaW50IF9fbmV3ZmQpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzcGF3bi5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N0YWIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYzNjMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N0YWIuaApAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIF9fR05VX1NUQUJfXworCisvKiBJbmRpY2F0ZSB0aGUgR05VIHN0YWIuaCBpcyBpbiB1c2UuICAqLworCisjZGVmaW5lIF9fR05VX1NUQUJfXworCisjZGVmaW5lIF9fZGVmaW5lX3N0YWIoTkFNRSwgQ09ERSwgU1RSSU5HKSBOQU1FPUNPREUsCisKK2VudW0gX19zdGFiX2RlYnVnX2NvZGUKK3sKKyNpbmNsdWRlIDxiaXRzL3N0YWIuZGVmPgorTEFTVF9VTlVTRURfU1RBQl9DT0RFCit9OworCisjdW5kZWYgX19kZWZpbmVfc3RhYgorCisjZW5kaWYgLyogX19HTlVfU1RBQl8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RkYXRvbWljLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N0ZGF0b21pYy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmI3OWZiZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N0ZGF0b21pYy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2Jpb25pYy9saWJjL2luY2x1ZGUvc3RkYXRvbWljLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N0ZGludC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zdGRpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzcyOWFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zdGRpbnQuaApAQCAtMCwwICsxLDMyMCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LDE5OTgsMTk5OSwyMDAwLDIwMDEsMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCUlTTyBDOTk6IDcuMTggSW50ZWdlciB0eXBlcyA8c3RkaW50Lmg+CisgKi8KKworI2lmbmRlZiBfU1RESU5UX0gKKyNkZWZpbmUgX1NURElOVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8Yml0cy93Y2hhci5oPgorI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworLyogRXhhY3QgaW50ZWdyYWwgdHlwZXMuICAqLworCisvKiBTaWduZWQuICAqLworCisvKiBUaGVyZSBpcyBzb21lIGFtb3VudCBvZiBvdmVybGFwIHdpdGggPHN5cy90eXBlcy5oPiBhcyBrbm93biBieSBpbmV0IGNvZGUgKi8KKyNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAorIyBkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAordHlwZWRlZiBzaWduZWQgY2hhcgkJaW50OF90OwordHlwZWRlZiBzaG9ydCBpbnQJCWludDE2X3Q7Cit0eXBlZGVmIGludAkJCWludDMyX3Q7CisjIGlmIF9fV09SRFNJWkUgPT0gNjQKK3R5cGVkZWYgbG9uZyBpbnQJCWludDY0X3Q7CisjIGVsc2UKK19fZXh0ZW5zaW9uX18KK3R5cGVkZWYgbG9uZyBsb25nIGludAkJaW50NjRfdDsKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBVbnNpZ25lZC4gICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCXVpbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludAl1aW50MTZfdDsKKyNpZm5kZWYgX191aW50MzJfdF9kZWZpbmVkCit0eXBlZGVmIHVuc2lnbmVkIGludAkJdWludDMyX3Q7CisjIGRlZmluZSBfX3VpbnQzMl90X2RlZmluZWQKKyNlbmRpZgorI2lmIF9fV09SRFNJWkUgPT0gNjQKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQJdWludDY0X3Q7CisjZWxzZQorX19leHRlbnNpb25fXwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50CXVpbnQ2NF90OworI2VuZGlmCisKKworLyogU21hbGwgdHlwZXMuICAqLworCisvKiBTaWduZWQuICAqLwordHlwZWRlZiBzaWduZWQgY2hhcgkJaW50X2xlYXN0OF90OwordHlwZWRlZiBzaG9ydCBpbnQJCWludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIGludAkJCWludF9sZWFzdDMyX3Q7CisjaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiBsb25nIGludAkJaW50X2xlYXN0NjRfdDsKKyNlbHNlCitfX2V4dGVuc2lvbl9fCit0eXBlZGVmIGxvbmcgbG9uZyBpbnQJCWludF9sZWFzdDY0X3Q7CisjZW5kaWYKKworLyogVW5zaWduZWQuICAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCQl1aW50X2xlYXN0OF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQJdWludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJdWludF9sZWFzdDMyX3Q7CisjaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludAl1aW50X2xlYXN0NjRfdDsKKyNlbHNlCitfX2V4dGVuc2lvbl9fCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQJdWludF9sZWFzdDY0X3Q7CisjZW5kaWYKKworCisvKiBGYXN0IHR5cGVzLiAgKi8KKworLyogU2lnbmVkLiAgKi8KK3R5cGVkZWYgc2lnbmVkIGNoYXIJCWludF9mYXN0OF90OworI2lmIF9fV09SRFNJWkUgPT0gNjQKK3R5cGVkZWYgbG9uZyBpbnQJCWludF9mYXN0MTZfdDsKK3R5cGVkZWYgbG9uZyBpbnQJCWludF9mYXN0MzJfdDsKK3R5cGVkZWYgbG9uZyBpbnQJCWludF9mYXN0NjRfdDsKKyNlbHNlCit0eXBlZGVmIGludAkJCWludF9mYXN0MTZfdDsKK3R5cGVkZWYgaW50CQkJaW50X2Zhc3QzMl90OworX19leHRlbnNpb25fXwordHlwZWRlZiBsb25nIGxvbmcgaW50CQlpbnRfZmFzdDY0X3Q7CisjZW5kaWYKKworLyogVW5zaWduZWQuICAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCQl1aW50X2Zhc3Q4X3Q7CisjaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludAl1aW50X2Zhc3QxNl90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludAl1aW50X2Zhc3QzMl90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludAl1aW50X2Zhc3Q2NF90OworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgaW50CQl1aW50X2Zhc3QxNl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJCXVpbnRfZmFzdDMyX3Q7CitfX2V4dGVuc2lvbl9fCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQJdWludF9mYXN0NjRfdDsKKyNlbmRpZgorCisKKy8qIFR5cGVzIGZvciBgdm9pZCAqJyBwb2ludGVycy4gICovCisjaWYgX19XT1JEU0laRSA9PSA2NAorIyBpZm5kZWYgX19pbnRwdHJfdF9kZWZpbmVkCit0eXBlZGVmIGxvbmcgaW50CQlpbnRwdHJfdDsKKyMgIGRlZmluZSBfX2ludHB0cl90X2RlZmluZWQKKyMgZW5kaWYKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQJdWludHB0cl90OworI2Vsc2UKKyMgaWZuZGVmIF9faW50cHRyX3RfZGVmaW5lZAordHlwZWRlZiBpbnQJCQlpbnRwdHJfdDsKKyMgIGRlZmluZSBfX2ludHB0cl90X2RlZmluZWQKKyMgZW5kaWYKK3R5cGVkZWYgdW5zaWduZWQgaW50CQl1aW50cHRyX3Q7CisjZW5kaWYKKworCisvKiBMYXJnZXN0IGludGVncmFsIHR5cGVzLiAgKi8KKyNpZiBfX1dPUkRTSVpFID09IDY0Cit0eXBlZGVmIGxvbmcgaW50CQlpbnRtYXhfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQJdWludG1heF90OworI2Vsc2UKK19fZXh0ZW5zaW9uX18KK3R5cGVkZWYgbG9uZyBsb25nIGludAkJaW50bWF4X3Q7CitfX2V4dGVuc2lvbl9fCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQJdWludG1heF90OworI2VuZGlmCisKKworLyogVGhlIElTTyBDOTkgc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgaW4gQysrIGltcGxlbWVudGF0aW9ucyB0aGVzZQorICAgbWFjcm9zIHNob3VsZCBvbmx5IGJlIGRlZmluZWQgaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQuICAqLworI2lmICFkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX19TVERDX0xJTUlUX01BQ1JPUworCisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBfX0lOVDY0X0MoYykJYyAjIyBMCisjICBkZWZpbmUgX19VSU5UNjRfQyhjKQljICMjIFVMCisjIGVsc2UKKyMgIGRlZmluZSBfX0lOVDY0X0MoYykJYyAjIyBMTAorIyAgZGVmaW5lIF9fVUlOVDY0X0MoYykJYyAjIyBVTEwKKyMgZW5kaWYKKworLyogTGltaXRzIG9mIGludGVncmFsIHR5cGVzLiAgKi8KKworLyogTWluaW11bSBvZiBzaWduZWQgaW50ZWdyYWwgdHlwZXMuICAqLworIyBkZWZpbmUgSU5UOF9NSU4JCSgtMTI4KQorIyBkZWZpbmUgSU5UMTZfTUlOCQkoLTMyNzY3LTEpCisjIGRlZmluZSBJTlQzMl9NSU4JCSgtMjE0NzQ4MzY0Ny0xKQorIyBkZWZpbmUgSU5UNjRfTUlOCQkoLV9fSU5UNjRfQyg5MjIzMzcyMDM2ODU0Nzc1ODA3KS0xKQorLyogTWF4aW11bSBvZiBzaWduZWQgaW50ZWdyYWwgdHlwZXMuICAqLworIyBkZWZpbmUgSU5UOF9NQVgJCSgxMjcpCisjIGRlZmluZSBJTlQxNl9NQVgJCSgzMjc2NykKKyMgZGVmaW5lIElOVDMyX01BWAkJKDIxNDc0ODM2NDcpCisjIGRlZmluZSBJTlQ2NF9NQVgJCShfX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNykpCisKKy8qIE1heGltdW0gb2YgdW5zaWduZWQgaW50ZWdyYWwgdHlwZXMuICAqLworIyBkZWZpbmUgVUlOVDhfTUFYCQkoMjU1KQorIyBkZWZpbmUgVUlOVDE2X01BWAkJKDY1NTM1KQorIyBkZWZpbmUgVUlOVDMyX01BWAkJKDQyOTQ5NjcyOTVVKQorIyBkZWZpbmUgVUlOVDY0X01BWAkJKF9fVUlOVDY0X0MoMTg0NDY3NDQwNzM3MDk1NTE2MTUpKQorCisKKy8qIE1pbmltdW0gb2Ygc2lnbmVkIGludGVncmFsIHR5cGVzIGhhdmluZyBhIG1pbmltdW0gc2l6ZS4gICovCisjIGRlZmluZSBJTlRfTEVBU1Q4X01JTgkJKC0xMjgpCisjIGRlZmluZSBJTlRfTEVBU1QxNl9NSU4JKC0zMjc2Ny0xKQorIyBkZWZpbmUgSU5UX0xFQVNUMzJfTUlOCSgtMjE0NzQ4MzY0Ny0xKQorIyBkZWZpbmUgSU5UX0xFQVNUNjRfTUlOCSgtX19JTlQ2NF9DKDkyMjMzNzIwMzY4NTQ3NzU4MDcpLTEpCisvKiBNYXhpbXVtIG9mIHNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBoYXZpbmcgYSBtaW5pbXVtIHNpemUuICAqLworIyBkZWZpbmUgSU5UX0xFQVNUOF9NQVgJCSgxMjcpCisjIGRlZmluZSBJTlRfTEVBU1QxNl9NQVgJKDMyNzY3KQorIyBkZWZpbmUgSU5UX0xFQVNUMzJfTUFYCSgyMTQ3NDgzNjQ3KQorIyBkZWZpbmUgSU5UX0xFQVNUNjRfTUFYCShfX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNykpCisKKy8qIE1heGltdW0gb2YgdW5zaWduZWQgaW50ZWdyYWwgdHlwZXMgaGF2aW5nIGEgbWluaW11bSBzaXplLiAgKi8KKyMgZGVmaW5lIFVJTlRfTEVBU1Q4X01BWAkoMjU1KQorIyBkZWZpbmUgVUlOVF9MRUFTVDE2X01BWAkoNjU1MzUpCisjIGRlZmluZSBVSU5UX0xFQVNUMzJfTUFYCSg0Mjk0OTY3Mjk1VSkKKyMgZGVmaW5lIFVJTlRfTEVBU1Q2NF9NQVgJKF9fVUlOVDY0X0MoMTg0NDY3NDQwNzM3MDk1NTE2MTUpKQorCisKKy8qIE1pbmltdW0gb2YgZmFzdCBzaWduZWQgaW50ZWdyYWwgdHlwZXMgaGF2aW5nIGEgbWluaW11bSBzaXplLiAgKi8KKyMgZGVmaW5lIElOVF9GQVNUOF9NSU4JCSgtMTI4KQorIyBpZiBfX1dPUkRTSVpFID09IDY0CisjICBkZWZpbmUgSU5UX0ZBU1QxNl9NSU4JKC05MjIzMzcyMDM2ODU0Nzc1ODA3TC0xKQorIyAgZGVmaW5lIElOVF9GQVNUMzJfTUlOCSgtOTIyMzM3MjAzNjg1NDc3NTgwN0wtMSkKKyMgZWxzZQorIyAgZGVmaW5lIElOVF9GQVNUMTZfTUlOCSgtMjE0NzQ4MzY0Ny0xKQorIyAgZGVmaW5lIElOVF9GQVNUMzJfTUlOCSgtMjE0NzQ4MzY0Ny0xKQorIyBlbmRpZgorIyBkZWZpbmUgSU5UX0ZBU1Q2NF9NSU4JCSgtX19JTlQ2NF9DKDkyMjMzNzIwMzY4NTQ3NzU4MDcpLTEpCisvKiBNYXhpbXVtIG9mIGZhc3Qgc2lnbmVkIGludGVncmFsIHR5cGVzIGhhdmluZyBhIG1pbmltdW0gc2l6ZS4gICovCisjIGRlZmluZSBJTlRfRkFTVDhfTUFYCQkoMTI3KQorIyBpZiBfX1dPUkRTSVpFID09IDY0CisjICBkZWZpbmUgSU5UX0ZBU1QxNl9NQVgJKDkyMjMzNzIwMzY4NTQ3NzU4MDdMKQorIyAgZGVmaW5lIElOVF9GQVNUMzJfTUFYCSg5MjIzMzcyMDM2ODU0Nzc1ODA3TCkKKyMgZWxzZQorIyAgZGVmaW5lIElOVF9GQVNUMTZfTUFYCSgyMTQ3NDgzNjQ3KQorIyAgZGVmaW5lIElOVF9GQVNUMzJfTUFYCSgyMTQ3NDgzNjQ3KQorIyBlbmRpZgorIyBkZWZpbmUgSU5UX0ZBU1Q2NF9NQVgJCShfX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNykpCisKKy8qIE1heGltdW0gb2YgZmFzdCB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBoYXZpbmcgYSBtaW5pbXVtIHNpemUuICAqLworIyBkZWZpbmUgVUlOVF9GQVNUOF9NQVgJCSgyNTUpCisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBVSU5UX0ZBU1QxNl9NQVgJKDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwpCisjICBkZWZpbmUgVUlOVF9GQVNUMzJfTUFYCSgxODQ0Njc0NDA3MzcwOTU1MTYxNVVMKQorIyBlbHNlCisjICBkZWZpbmUgVUlOVF9GQVNUMTZfTUFYCSg0Mjk0OTY3Mjk1VSkKKyMgIGRlZmluZSBVSU5UX0ZBU1QzMl9NQVgJKDQyOTQ5NjcyOTVVKQorIyBlbmRpZgorIyBkZWZpbmUgVUlOVF9GQVNUNjRfTUFYCShfX1VJTlQ2NF9DKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSkKKworCisvKiBWYWx1ZXMgdG8gdGVzdCBmb3IgaW50ZWdyYWwgdHlwZXMgaG9sZGluZyBgdm9pZCAqJyBwb2ludGVyLiAgKi8KKyMgaWYgX19XT1JEU0laRSA9PSA2NAorIyAgZGVmaW5lIElOVFBUUl9NSU4JCSgtOTIyMzM3MjAzNjg1NDc3NTgwN0wtMSkKKyMgIGRlZmluZSBJTlRQVFJfTUFYCQkoOTIyMzM3MjAzNjg1NDc3NTgwN0wpCisjICBkZWZpbmUgVUlOVFBUUl9NQVgJCSgxODQ0Njc0NDA3MzcwOTU1MTYxNVVMKQorIyBlbHNlCisjICBkZWZpbmUgSU5UUFRSX01JTgkJKC0yMTQ3NDgzNjQ3LTEpCisjICBkZWZpbmUgSU5UUFRSX01BWAkJKDIxNDc0ODM2NDcpCisjICBkZWZpbmUgVUlOVFBUUl9NQVgJCSg0Mjk0OTY3Mjk1VSkKKyMgZW5kaWYKKworCisvKiBNaW5pbXVtIGZvciBsYXJnZXN0IHNpZ25lZCBpbnRlZ3JhbCB0eXBlLiAgKi8KKyMgZGVmaW5lIElOVE1BWF9NSU4JCSgtX19JTlQ2NF9DKDkyMjMzNzIwMzY4NTQ3NzU4MDcpLTEpCisvKiBNYXhpbXVtIGZvciBsYXJnZXN0IHNpZ25lZCBpbnRlZ3JhbCB0eXBlLiAgKi8KKyMgZGVmaW5lIElOVE1BWF9NQVgJCShfX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNykpCisKKy8qIE1heGltdW0gZm9yIGxhcmdlc3QgdW5zaWduZWQgaW50ZWdyYWwgdHlwZS4gICovCisjIGRlZmluZSBVSU5UTUFYX01BWAkJKF9fVUlOVDY0X0MoMTg0NDY3NDQwNzM3MDk1NTE2MTUpKQorCisKKy8qIExpbWl0cyBvZiBvdGhlciBpbnRlZ2VyIHR5cGVzLiAgKi8KKworLyogTGltaXRzIG9mIGBwdHJkaWZmX3QnIHR5cGUuICAqLworIyBpZiBfX1dPUkRTSVpFID09IDY0CisjICBkZWZpbmUgUFRSRElGRl9NSU4JCSgtOTIyMzM3MjAzNjg1NDc3NTgwN0wtMSkKKyMgIGRlZmluZSBQVFJESUZGX01BWAkJKDkyMjMzNzIwMzY4NTQ3NzU4MDdMKQorIyBlbHNlCisjICBkZWZpbmUgUFRSRElGRl9NSU4JCSgtMjE0NzQ4MzY0Ny0xKQorIyAgZGVmaW5lIFBUUkRJRkZfTUFYCQkoMjE0NzQ4MzY0NykKKyMgZW5kaWYKKworLyogTGltaXRzIG9mIGBzaWdfYXRvbWljX3QnLiAgKi8KKyMgZGVmaW5lIFNJR19BVE9NSUNfTUlOCQkoLTIxNDc0ODM2NDctMSkKKyMgZGVmaW5lIFNJR19BVE9NSUNfTUFYCQkoMjE0NzQ4MzY0NykKKworLyogTGltaXQgb2YgYHNpemVfdCcgdHlwZS4gICovCisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBTSVpFX01BWAkJKDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwpCisjIGVsc2UKKyMgIGRlZmluZSBTSVpFX01BWAkJKDQyOTQ5NjcyOTVVKQorIyBlbmRpZgorCisvKiBMaW1pdHMgb2YgYHdjaGFyX3QnLiAgKi8KKyMgaWZuZGVmIFdDSEFSX01JTgorLyogVGhlc2UgY29uc3RhbnRzIG1pZ2h0IGFsc28gYmUgZGVmaW5lZCBpbiA8d2NoYXIuaD4uICAqLworIyAgZGVmaW5lIFdDSEFSX01JTgkJX19XQ0hBUl9NSU4KKyMgIGRlZmluZSBXQ0hBUl9NQVgJCV9fV0NIQVJfTUFYCisjIGVuZGlmCisKKy8qIExpbWl0cyBvZiBgd2ludF90Jy4gICovCisjIGRlZmluZSBXSU5UX01JTgkJKDB1KQorIyBkZWZpbmUgV0lOVF9NQVgJCSg0Mjk0OTY3Mjk1dSkKKworI2VuZGlmCS8qIEMrKyAmJiBsaW1pdCBtYWNyb3MgKi8KKworCisvKiBUaGUgSVNPIEM5OSBzdGFuZGFyZCBzcGVjaWZpZXMgdGhhdCBpbiBDKysgaW1wbGVtZW50YXRpb25zIHRoZXNlCisgICBzaG91bGQgb25seSBiZSBkZWZpbmVkIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiAgKi8KKyNpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9fU1REQ19DT05TVEFOVF9NQUNST1MKKworLyogU2lnbmVkLiAgKi8KKyMgZGVmaW5lIElOVDhfQyhjKQljCisjIGRlZmluZSBJTlQxNl9DKGMpCWMKKyMgZGVmaW5lIElOVDMyX0MoYykJYworIyBpZiBfX1dPUkRTSVpFID09IDY0CisjICBkZWZpbmUgSU5UNjRfQyhjKQljICMjIEwKKyMgZWxzZQorIyAgZGVmaW5lIElOVDY0X0MoYykJYyAjIyBMTAorIyBlbmRpZgorCisvKiBVbnNpZ25lZC4gICovCisjIGRlZmluZSBVSU5UOF9DKGMpCWMKKyMgZGVmaW5lIFVJTlQxNl9DKGMpCWMKKyMgZGVmaW5lIFVJTlQzMl9DKGMpCWMgIyMgVQorIyBpZiBfX1dPUkRTSVpFID09IDY0CisjICBkZWZpbmUgVUlOVDY0X0MoYykJYyAjIyBVTAorIyBlbHNlCisjICBkZWZpbmUgVUlOVDY0X0MoYykJYyAjIyBVTEwKKyMgZW5kaWYKKworLyogTWF4aW1hbCB0eXBlLiAgKi8KKyMgaWYgX19XT1JEU0laRSA9PSA2NAorIyAgZGVmaW5lIElOVE1BWF9DKGMpCWMgIyMgTAorIyAgZGVmaW5lIFVJTlRNQVhfQyhjKQljICMjIFVMCisjIGVsc2UKKyMgIGRlZmluZSBJTlRNQVhfQyhjKQljICMjIExMCisjICBkZWZpbmUgVUlOVE1BWF9DKGMpCWMgIyMgVUxMCisjIGVuZGlmCisKKyNlbmRpZgkvKiBDKysgJiYgY29uc3RhbnQgbWFjcm9zICovCisKKyNlbmRpZiAvKiBzdGRpbnQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zdGRpby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zdGRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NDEyYTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N0ZGlvLmgKQEAgLTAsMCArMSw5NDQgQEAKKy8qIERlZmluZSBJU08gQyBzdGRpbyBvbiB0b3Agb2YgQysrIGlvc3RyZWFtcy4KKyAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5NC0yMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJSVNPIEM5OSBTdGFuZGFyZDogNy4xOSBJbnB1dC9vdXRwdXQJPHN0ZGlvLmg+CisgKi8KKworI2lmbmRlZiBfU1RESU9fSAorCisjaWYgIWRlZmluZWQgX19uZWVkX0ZJTEUgJiYgIWRlZmluZWQgX19uZWVkX19fRklMRQorIyBkZWZpbmUgX1NURElPX0gJMQorIyBpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKyMgZGVmaW5lIF9fbmVlZF9zaXplX3QKKyMgZGVmaW5lIF9fbmVlZF9OVUxMCisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorCisjIGluY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKyMgZGVmaW5lIF9fbmVlZF9GSUxFCisjIGRlZmluZSBfX25lZWRfX19GSUxFCisjZW5kaWYgLyogRG9uJ3QgbmVlZCBGSUxFLiAgKi8KKworCisjaWYgIWRlZmluZWQgX19GSUxFX2RlZmluZWQgJiYgZGVmaW5lZCBfX25lZWRfRklMRQorCisvKiBEZWZpbmUgb3V0c2lkZSBvZiBuYW1lc3BhY2Ugc28gdGhlIEMrKyBpcyBoYXBweS4gICovCitzdHJ1Y3QgX0lPX0ZJTEU7CisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogVGhlIG9wYXF1ZSB0eXBlIG9mIHN0cmVhbXMuICBUaGlzIGlzIHRoZSBkZWZpbml0aW9uIHVzZWQgZWxzZXdoZXJlLiAgKi8KK3R5cGVkZWYgc3RydWN0IF9JT19GSUxFIEZJTEU7CitfX0VORF9OQU1FU1BBQ0VfU1RECisjaWYgZGVmaW5lZCBfX1VTRV9MQVJHRUZJTEU2NCB8fCBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9QT1NJWCBcCisgICAgfHwgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTiBcCisgICAgfHwgZGVmaW5lZCBfX1VTRV9QT1NJWDIKK19fVVNJTkdfTkFNRVNQQUNFX1NURChGSUxFKQorI2VuZGlmCisKKyMgZGVmaW5lIF9fRklMRV9kZWZpbmVkCTEKKyNlbmRpZiAvKiBGSUxFIG5vdCBkZWZpbmVkLiAgKi8KKyN1bmRlZglfX25lZWRfRklMRQorCisKKyNpZiAhZGVmaW5lZCBfX19fRklMRV9kZWZpbmVkICYmIGRlZmluZWQgX19uZWVkX19fRklMRQorCisvKiBUaGUgb3BhcXVlIHR5cGUgb2Ygc3RyZWFtcy4gIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gdXNlZCBlbHNld2hlcmUuICAqLwordHlwZWRlZiBzdHJ1Y3QgX0lPX0ZJTEUgX19GSUxFOworCisjIGRlZmluZSBfX19fRklMRV9kZWZpbmVkCTEKKyNlbmRpZiAvKiBfX0ZJTEUgbm90IGRlZmluZWQuICAqLworI3VuZGVmCV9fbmVlZF9fX0ZJTEUKKworCisjaWZkZWYJX1NURElPX0gKKyNkZWZpbmUgX1NURElPX1VTRVNfSU9TVFJFQU0KKworI2luY2x1ZGUgPGxpYmlvLmg+CisKKyNpZiBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKyMgaWZkZWYgX19HTlVDX18KKyMgIGlmbmRlZiBfVkFfTElTVF9ERUZJTkVECit0eXBlZGVmIF9HX3ZhX2xpc3QgdmFfbGlzdDsKKyMgICBkZWZpbmUgX1ZBX0xJU1RfREVGSU5FRAorIyAgZW5kaWYKKyMgZWxzZQorIyAgaW5jbHVkZSA8c3RkYXJnLmg+CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX1hPUEVOMks4CisjIGlmbmRlZiBfX29mZl90X2RlZmluZWQKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX19vZmZfdCBvZmZfdDsKKyMgZWxzZQordHlwZWRlZiBfX29mZjY0X3Qgb2ZmX3Q7CisjIGVuZGlmCisjIGRlZmluZSBfX29mZl90X2RlZmluZWQKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZCBfX1VTRV9MQVJHRUZJTEU2NCAmJiAhZGVmaW5lZCBfX29mZjY0X3RfZGVmaW5lZAordHlwZWRlZiBfX29mZjY0X3Qgb2ZmNjRfdDsKKyMgZGVmaW5lIF9fb2ZmNjRfdF9kZWZpbmVkCisjIGVuZGlmCisKKyMgaWZuZGVmIF9fc3NpemVfdF9kZWZpbmVkCit0eXBlZGVmIF9fc3NpemVfdCBzc2l6ZV90OworIyBkZWZpbmUgX19zc2l6ZV90X2RlZmluZWQKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBUaGUgdHlwZSBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBmZ2V0cG9zJyBhbmQgYGZzZXRwb3MnLiAgKi8KK19fQkVHSU5fTkFNRVNQQUNFX1NURAorI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0Cit0eXBlZGVmIF9HX2Zwb3NfdCBmcG9zX3Q7CisjZWxzZQordHlwZWRlZiBfR19mcG9zNjRfdCBmcG9zX3Q7CisjZW5kaWYKK19fRU5EX05BTUVTUEFDRV9TVEQKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAordHlwZWRlZiBfR19mcG9zNjRfdCBmcG9zNjRfdDsKKyNlbmRpZgorCisvKiBUaGUgcG9zc2liaWxpdGllcyBmb3IgdGhlIHRoaXJkIGFyZ3VtZW50IHRvIGBzZXR2YnVmJy4gICovCisjZGVmaW5lIF9JT0ZCRiAwCQkvKiBGdWxseSBidWZmZXJlZC4gICovCisjZGVmaW5lIF9JT0xCRiAxCQkvKiBMaW5lIGJ1ZmZlcmVkLiAgKi8KKyNkZWZpbmUgX0lPTkJGIDIJCS8qIE5vIGJ1ZmZlcmluZy4gICovCisKKworLyogRGVmYXVsdCBidWZmZXIgc2l6ZS4gICovCisjaWZuZGVmIEJVRlNJWgorIyBkZWZpbmUgQlVGU0laIF9JT19CVUZTSVoKKyNlbmRpZgorCisKKy8qIEVuZCBvZiBmaWxlIGNoYXJhY3Rlci4KKyAgIFNvbWUgdGhpbmdzIHRocm91Z2hvdXQgdGhlIGxpYnJhcnkgcmVseSBvbiB0aGlzIGJlaW5nIC0xLiAgKi8KKyNpZm5kZWYgRU9GCisjIGRlZmluZSBFT0YgKC0xKQorI2VuZGlmCisKKworLyogVGhlIHBvc3NpYmlsaXRpZXMgZm9yIHRoZSB0aGlyZCBhcmd1bWVudCB0byBgZnNlZWsnLgorICAgVGhlc2UgdmFsdWVzIHNob3VsZCBub3QgYmUgY2hhbmdlZC4gICovCisjZGVmaW5lIFNFRUtfU0VUCTAJLyogU2VlayBmcm9tIGJlZ2lubmluZyBvZiBmaWxlLiAgKi8KKyNkZWZpbmUgU0VFS19DVVIJMQkvKiBTZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbi4gICovCisjZGVmaW5lIFNFRUtfRU5ECTIJLyogU2VlayBmcm9tIGVuZCBvZiBmaWxlLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIFNFRUtfREFUQQkzCS8qIFNlZWsgdG8gbmV4dCBkYXRhLiAgKi8KKyMgZGVmaW5lIFNFRUtfSE9MRQk0CS8qIFNlZWsgdG8gbmV4dCBob2xlLiAgKi8KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorLyogRGVmYXVsdCBwYXRoIHByZWZpeCBmb3IgYHRlbXBuYW0nIGFuZCBgdG1wbmFtJy4gICovCisjIGRlZmluZSBQX3RtcGRpcgkiL3RtcCIKKyNlbmRpZgorCisKKy8qIEdldCB0aGUgdmFsdWVzOgorICAgTF90bXBuYW0JSG93IGxvbmcgYW4gYXJyYXkgb2YgY2hhcnMgbXVzdCBiZSB0byBiZSBwYXNzZWQgdG8gYHRtcG5hbScuCisgICBUTVBfTUFYCVRoZSBtaW5pbXVtIG51bWJlciBvZiB1bmlxdWUgZmlsZW5hbWVzIGdlbmVyYXRlZCBieSB0bXBuYW0KKwkJKGFuZCB0ZW1wbmFtIHdoZW4gaXQgdXNlcyB0bXBuYW0ncyBuYW1lIHNwYWNlKSwKKwkJb3IgdGVtcG5hbSAodGhlIHR3byBhcmUgc2VwYXJhdGUpLgorICAgTF9jdGVybWlkCUhvdyBsb25nIGFuIGFycmF5IHRvIHBhc3MgdG8gYGN0ZXJtaWQnLgorICAgTF9jdXNlcmlkCUhvdyBsb25nIGFuIGFycmF5IHRvIHBhc3MgdG8gYGN1c2VyaWQnLgorICAgRk9QRU5fTUFYCU1pbmltdW0gbnVtYmVyIG9mIGZpbGVzIHRoYXQgY2FuIGJlIG9wZW4gYXQgb25jZS4KKyAgIEZJTEVOQU1FX01BWAlNYXhpbXVtIGxlbmd0aCBvZiBhIGZpbGVuYW1lLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3N0ZGlvX2xpbS5oPgorCisKKy8qIFN0YW5kYXJkIHN0cmVhbXMuICAqLworZXh0ZXJuIHN0cnVjdCBfSU9fRklMRSAqc3RkaW47CQkvKiBTdGFuZGFyZCBpbnB1dCBzdHJlYW0uICAqLworZXh0ZXJuIHN0cnVjdCBfSU9fRklMRSAqc3Rkb3V0OwkJLyogU3RhbmRhcmQgb3V0cHV0IHN0cmVhbS4gICovCitleHRlcm4gc3RydWN0IF9JT19GSUxFICpzdGRlcnI7CQkvKiBTdGFuZGFyZCBlcnJvciBvdXRwdXQgc3RyZWFtLiAgKi8KKy8qIEM4OS9DOTkgc2F5IHRoZXkncmUgbWFjcm9zLiAgTWFrZSB0aGVtIGhhcHB5LiAgKi8KKyNkZWZpbmUgc3RkaW4gc3RkaW4KKyNkZWZpbmUgc3Rkb3V0IHN0ZG91dAorI2RlZmluZSBzdGRlcnIgc3RkZXJyCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmVtb3ZlIGZpbGUgRklMRU5BTUUuICAqLworZXh0ZXJuIGludCByZW1vdmUgKF9fY29uc3QgY2hhciAqX19maWxlbmFtZSkgX19USFJPVzsKKy8qIFJlbmFtZSBmaWxlIE9MRCB0byBORVcuICAqLworZXh0ZXJuIGludCByZW5hbWUgKF9fY29uc3QgY2hhciAqX19vbGQsIF9fY29uc3QgY2hhciAqX19uZXcpIF9fVEhST1c7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9BVEZJTEUKKy8qIFJlbmFtZSBmaWxlIE9MRCByZWxhdGl2ZSB0byBPTERGRCB0byBORVcgcmVsYXRpdmUgdG8gTkVXRkQuICAqLworZXh0ZXJuIGludCByZW5hbWVhdCAoaW50IF9fb2xkZmQsIF9fY29uc3QgY2hhciAqX19vbGQsIGludCBfX25ld2ZkLAorCQkgICAgIF9fY29uc3QgY2hhciAqX19uZXcpIF9fVEhST1c7CisjZW5kaWYKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBDcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSBhbmQgb3BlbiBpdCByZWFkL3dyaXRlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIEZJTEUgKnRtcGZpbGUgKHZvaWQpIF9fd3VyOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIEZJTEUgKl9fUkVESVJFQ1QgKHRtcGZpbGUsICh2b2lkKSwgdG1wZmlsZTY0KSBfX3d1cjsKKyMgZWxzZQorIyAgZGVmaW5lIHRtcGZpbGUgdG1wZmlsZTY0CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gRklMRSAqdG1wZmlsZTY0ICh2b2lkKSBfX3d1cjsKKyNlbmRpZgorCisvKiBHZW5lcmF0ZSBhIHRlbXBvcmFyeSBmaWxlbmFtZS4gICovCitleHRlcm4gY2hhciAqdG1wbmFtIChjaGFyICpfX3MpIF9fVEhST1cgX193dXI7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBUaGlzIGlzIHRoZSByZWVudHJhbnQgdmFyaWFudCBvZiBgdG1wbmFtJy4gIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMKKyAgIHRoYXQgaXQgZG9lcyBub3QgYWxsb3cgUyB0byBiZSBOVUxMLiAgKi8KK2V4dGVybiBjaGFyICp0bXBuYW1fciAoY2hhciAqX19zKSBfX1RIUk9XIF9fd3VyOworI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisvKiBHZW5lcmF0ZSBhIHVuaXF1ZSB0ZW1wb3JhcnkgZmlsZW5hbWUgdXNpbmcgdXAgdG8gZml2ZSBjaGFyYWN0ZXJzIG9mIFBGWAorICAgaWYgaXQgaXMgbm90IE5VTEwuICBUaGUgZGlyZWN0b3J5IHRvIHB1dCB0aGlzIGZpbGUgaW4gaXMgc2VhcmNoZWQgZm9yCisgICBhcyBmb2xsb3dzOiBGaXJzdCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgIlRNUERJUiIgaXMgY2hlY2tlZC4KKyAgIElmIGl0IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgd3JpdGFibGUgZGlyZWN0b3J5LCB0aGF0IGRpcmVjdG9yeSBpcyB1c2VkLgorICAgSWYgbm90IGFuZCBpZiBESVIgaXMgbm90IE5VTEwsIHRoYXQgdmFsdWUgaXMgY2hlY2tlZC4gIElmIHRoYXQgZmFpbHMsCisgICBQX3RtcGRpciBpcyB0cmllZCBhbmQgZmluYWxseSAiL3RtcCIuICBUaGUgc3RvcmFnZSBmb3IgdGhlIGZpbGVuYW1lCisgICBpcyBhbGxvY2F0ZWQgYnkgYG1hbGxvYycuICAqLworZXh0ZXJuIGNoYXIgKnRlbXBuYW0gKF9fY29uc3QgY2hhciAqX19kaXIsIF9fY29uc3QgY2hhciAqX19wZngpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfbWFsbG9jX18gX193dXI7CisjZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIENsb3NlIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZjbG9zZSAoRklMRSAqX19zdHJlYW0pOworLyogRmx1c2ggU1RSRUFNLCBvciBhbGwgc3RyZWFtcyBpZiBTVFJFQU0gaXMgTlVMTC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZmbHVzaCAoRklMRSAqX19zdHJlYW0pOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYgX19VU0VfTUlTQworLyogRmFzdGVyIHZlcnNpb25zIHdoZW4gbG9ja2luZyBpcyBub3QgcmVxdWlyZWQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZmZsdXNoX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogQ2xvc2UgYWxsIHN0cmVhbXMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZmNsb3NlYWxsICh2b2lkKTsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisvKiBPcGVuIGEgZmlsZSBhbmQgY3JlYXRlIGEgbmV3IHN0cmVhbSBmb3IgaXQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIEZJTEUgKmZvcGVuIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlbmFtZSwKKwkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX21vZGVzKSBfX3d1cjsKKy8qIE9wZW4gYSBmaWxlLCByZXBsYWNpbmcgYW4gZXhpc3Rpbmcgc3RyZWFtIHdpdGggaXQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIEZJTEUgKmZyZW9wZW4gKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZpbGVuYW1lLAorCQkgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19tb2RlcywKKwkJICAgICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgX193dXI7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gRklMRSAqX19SRURJUkVDVCAoZm9wZW4sIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlbmFtZSwKKwkJCQkgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbW9kZXMpLCBmb3BlbjY0KQorICBfX3d1cjsKK2V4dGVybiBGSUxFICpfX1JFRElSRUNUIChmcmVvcGVuLCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZW5hbWUsCisJCQkJICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbW9kZXMsCisJCQkJICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksIGZyZW9wZW42NCkKKyAgX193dXI7CisjIGVsc2UKKyMgIGRlZmluZSBmb3BlbiBmb3BlbjY0CisjICBkZWZpbmUgZnJlb3BlbiBmcmVvcGVuNjQKKyMgZW5kaWYKKyNlbmRpZgorX19FTkRfTkFNRVNQQUNFX1NURAorI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gRklMRSAqZm9wZW42NCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZW5hbWUsCisJCSAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX21vZGVzKSBfX3d1cjsKK2V4dGVybiBGSUxFICpmcmVvcGVuNjQgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZpbGVuYW1lLAorCQkJX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbW9kZXMsCisJCQlGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSBfX3d1cjsKKyNlbmRpZgorCisjaWZkZWYJX19VU0VfUE9TSVgKKy8qIENyZWF0ZSBhIG5ldyBzdHJlYW0gdGhhdCByZWZlcnMgdG8gYW4gZXhpc3Rpbmcgc3lzdGVtIGZpbGUgZGVzY3JpcHRvci4gICovCitleHRlcm4gRklMRSAqZmRvcGVuIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX21vZGVzKSBfX1RIUk9XIF9fd3VyOworI2VuZGlmCisKKyNpZmRlZglfX1VTRV9HTlUKKy8qIENyZWF0ZSBhIG5ldyBzdHJlYW0gdGhhdCByZWZlcnMgdG8gdGhlIGdpdmVuIG1hZ2ljIGNvb2tpZSwKKyAgIGFuZCB1c2VzIHRoZSBnaXZlbiBmdW5jdGlvbnMgZm9yIGlucHV0IGFuZCBvdXRwdXQuICAqLworZXh0ZXJuIEZJTEUgKmZvcGVuY29va2llICh2b2lkICpfX3Jlc3RyaWN0IF9fbWFnaWNfY29va2llLAorCQkJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19tb2RlcywKKwkJCSAgX0lPX2Nvb2tpZV9pb19mdW5jdGlvbnNfdCBfX2lvX2Z1bmNzKSBfX1RIUk9XIF9fd3VyOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLOAorLyogQ3JlYXRlIGEgbmV3IHN0cmVhbSB0aGF0IHJlZmVycyB0byBhIG1lbW9yeSBidWZmZXIuICAqLworZXh0ZXJuIEZJTEUgKmZtZW1vcGVuICh2b2lkICpfX3MsIHNpemVfdCBfX2xlbiwgX19jb25zdCBjaGFyICpfX21vZGVzKQorICBfX1RIUk9XIF9fd3VyOworCisvKiBPcGVuIGEgc3RyZWFtIHRoYXQgd3JpdGVzIGludG8gYSBtYWxsb2MnZCBidWZmZXIgdGhhdCBpcyBleHBhbmRlZCBhcworICAgbmVjZXNzYXJ5LiAgKkJVRkxPQyBhbmQgKlNJWkVMT0MgYXJlIHVwZGF0ZWQgd2l0aCB0aGUgYnVmZmVyJ3MgbG9jYXRpb24KKyAgIGFuZCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiBvbiBmZmx1c2ggb3IgZmNsb3NlLiAgKi8KK2V4dGVybiBGSUxFICpvcGVuX21lbXN0cmVhbSAoY2hhciAqKl9fYnVmbG9jLCBzaXplX3QgKl9fc2l6ZWxvYykgX19USFJPVyBfX3d1cjsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogSWYgQlVGIGlzIE5VTEwsIG1ha2UgU1RSRUFNIHVuYnVmZmVyZWQuCisgICBFbHNlIG1ha2UgaXQgdXNlIGJ1ZmZlciBCVUYsIG9mIHNpemUgQlVGU0laLiAgKi8KK2V4dGVybiB2b2lkIHNldGJ1ZiAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwgY2hhciAqX19yZXN0cmljdCBfX2J1ZikgX19USFJPVzsKKy8qIE1ha2UgU1RSRUFNIHVzZSBidWZmZXJpbmcgbW9kZSBNT0RFLgorICAgSWYgQlVGIGlzIG5vdCBOVUxMLCB1c2UgTiBieXRlcyBvZiBpdCBmb3IgYnVmZmVyaW5nOworICAgZWxzZSBhbGxvY2F0ZSBhbiBpbnRlcm5hbCBidWZmZXIgTiBieXRlcyBsb25nLiAgKi8KK2V4dGVybiBpbnQgc2V0dmJ1ZiAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwgY2hhciAqX19yZXN0cmljdCBfX2J1ZiwKKwkJICAgIGludCBfX21vZGVzLCBzaXplX3QgX19uKSBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYJX19VU0VfQlNECisvKiBJZiBCVUYgaXMgTlVMTCwgbWFrZSBTVFJFQU0gdW5idWZmZXJlZC4KKyAgIEVsc2UgbWFrZSBpdCB1c2UgU0laRSBieXRlcyBvZiBCVUYgZm9yIGJ1ZmZlcmluZy4gICovCitleHRlcm4gdm9pZCBzZXRidWZmZXIgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsCisJCSAgICAgICBzaXplX3QgX19zaXplKSBfX1RIUk9XOworCisvKiBNYWtlIFNUUkVBTSBsaW5lLWJ1ZmZlcmVkLiAgKi8KK2V4dGVybiB2b2lkIHNldGxpbmVidWYgKEZJTEUgKl9fc3RyZWFtKSBfX1RIUk9XOworI2VuZGlmCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZwcmludGYgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLik7CisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIHN0ZG91dC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHByaW50ZiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pOworLyogV3JpdGUgZm9ybWF0dGVkIG91dHB1dCB0byBTLiAgKi8KK2V4dGVybiBpbnQgc3ByaW50ZiAoY2hhciAqX19yZXN0cmljdCBfX3MsCisJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikgX19USFJPV05MOworCisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIFMgZnJvbSBhcmd1bWVudCBsaXN0IEFSRy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHZmcHJpbnRmIChGSUxFICpfX3Jlc3RyaWN0IF9fcywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkgICAgIF9HX3ZhX2xpc3QgX19hcmcpOworLyogV3JpdGUgZm9ybWF0dGVkIG91dHB1dCB0byBzdGRvdXQgZnJvbSBhcmd1bWVudCBsaXN0IEFSRy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHZwcmludGYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgX0dfdmFfbGlzdCBfX2FyZyk7CisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIFMgZnJvbSBhcmd1bWVudCBsaXN0IEFSRy4gICovCitleHRlcm4gaW50IHZzcHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkgICAgIF9HX3ZhX2xpc3QgX19hcmcpIF9fVEhST1dOTDsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5IHx8IGRlZmluZWQgX19VU0VfVU5JWDk4CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIE1heGltdW0gY2hhcnMgb2Ygb3V0cHV0IHRvIHdyaXRlIGluIE1BWExFTi4gICovCitleHRlcm4gaW50IHNucHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbWF4bGVuLAorCQkgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKQorICAgICBfX1RIUk9XTkwgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDQpKSk7CisKK2V4dGVybiBpbnQgdnNucHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbWF4bGVuLAorCQkgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIF9HX3ZhX2xpc3QgX19hcmcpCisgICAgIF9fVEhST1dOTCBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgMCkpKTsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIGEgc3RyaW5nIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB3aXRoIGBtYWxsb2MnLgorICAgU3RvcmUgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0cmluZyBpbiAqUFRSLiAgKi8KK2V4dGVybiBpbnQgdmFzcHJpbnRmIChjaGFyICoqX19yZXN0cmljdCBfX3B0ciwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZiwKKwkJICAgICAgX0dfdmFfbGlzdCBfX2FyZykKKyAgICAgX19USFJPV05MIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAyLCAwKSkpIF9fd3VyOworZXh0ZXJuIGludCBfX2FzcHJpbnRmIChjaGFyICoqX19yZXN0cmljdCBfX3B0ciwKKwkJICAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKQorICAgICBfX1RIUk9XTkwgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDIsIDMpKSkgX193dXI7CitleHRlcm4gaW50IGFzcHJpbnRmIChjaGFyICoqX19yZXN0cmljdCBfX3B0ciwKKwkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikKKyAgICAgX19USFJPV05MIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAyLCAzKSkpIF9fd3VyOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLOAorLyogV3JpdGUgZm9ybWF0dGVkIG91dHB1dCB0byBhIGZpbGUgZGVzY3JpcHRvci4KKworICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gdGhleSBhcmUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHZkcHJpbnRmIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LAorCQkgICAgIF9HX3ZhX2xpc3QgX19hcmcpCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAyLCAwKSkpOworZXh0ZXJuIGludCBkcHJpbnRmIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAyLCAzKSkpOworI2VuZGlmCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBSZWFkIGZvcm1hdHRlZCBpbnB1dCBmcm9tIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZzY2FuZiAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwKKwkJICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pIF9fd3VyOworLyogUmVhZCBmb3JtYXR0ZWQgaW5wdXQgZnJvbSBzdGRpbi4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHNjYW5mIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikgX193dXI7CisvKiBSZWFkIGZvcm1hdHRlZCBpbnB1dCBmcm9tIFMuICAqLworZXh0ZXJuIGludCBzc2NhbmYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3MsCisJCSAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSBfX1RIUk9XOworCisjaWYgZGVmaW5lZCBfX1VTRV9JU09DOTkgJiYgIWRlZmluZWQgX19VU0VfR05VIFwKKyAgICAmJiAoIWRlZmluZWQgX19MREJMX0NPTVBBVCB8fCAhZGVmaW5lZCBfX1JFRElSRUNUKSBcCisgICAgJiYgKGRlZmluZWQgX19TVFJJQ1RfQU5TSV9fIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySykKKyMgaWZkZWYgX19SRURJUkVDVAorLyogRm9yIHN0cmljdCBJU08gQzk5IG9yIFBPU0lYIGNvbXBsaWFuY2UgZGlzYWxsb3cgJWFzLCAlYVMgYW5kICVhWworICAgR05VIGV4dGVuc2lvbiB3aGljaCBjb25mbGljdHMgd2l0aCB2YWxpZCAlYSBmb2xsb3dlZCBieSBsZXR0ZXIKKyAgIHMsIFMgb3IgWy4gICovCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKGZzY2FuZiwgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJCQkJX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pLAorCQkgICAgICAgX19pc29jOTlfZnNjYW5mKSBfX3d1cjsKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoc2NhbmYsIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLiksCisJCSAgICAgICBfX2lzb2M5OV9zY2FuZikgX193dXI7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChzc2NhbmYsIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zLAorCQkJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLiksCisJCQkgICBfX2lzb2M5OV9zc2NhbmYpOworIyBlbHNlCitleHRlcm4gaW50IF9faXNvYzk5X2ZzY2FuZiAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwKKwkJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikgX193dXI7CitleHRlcm4gaW50IF9faXNvYzk5X3NjYW5mIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikgX193dXI7CitleHRlcm4gaW50IF9faXNvYzk5X3NzY2FuZiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywKKwkJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikgX19USFJPVzsKKyMgIGRlZmluZSBmc2NhbmYgX19pc29jOTlfZnNjYW5mCisjICBkZWZpbmUgc2NhbmYgX19pc29jOTlfc2NhbmYKKyMgIGRlZmluZSBzc2NhbmYgX19pc29jOTlfc3NjYW5mCisjIGVuZGlmCisjZW5kaWYKKworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYJX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIFJlYWQgZm9ybWF0dGVkIGlucHV0IGZyb20gUyBpbnRvIGFyZ3VtZW50IGxpc3QgQVJHLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgdmZzY2FuZiAoRklMRSAqX19yZXN0cmljdCBfX3MsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJICAgIF9HX3ZhX2xpc3QgX19hcmcpCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3NjYW5mX18sIDIsIDApKSkgX193dXI7CisKKy8qIFJlYWQgZm9ybWF0dGVkIGlucHV0IGZyb20gc3RkaW4gaW50byBhcmd1bWVudCBsaXN0IEFSRy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHZzY2FuZiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCBfR192YV9saXN0IF9fYXJnKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19zY2FuZl9fLCAxLCAwKSkpIF9fd3VyOworCisvKiBSZWFkIGZvcm1hdHRlZCBpbnB1dCBmcm9tIFMgaW50byBhcmd1bWVudCBsaXN0IEFSRy4gICovCitleHRlcm4gaW50IHZzc2NhbmYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3MsCisJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIF9HX3ZhX2xpc3QgX19hcmcpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fc2NhbmZfXywgMiwgMCkpKTsKKworIyBpZiAhZGVmaW5lZCBfX1VTRV9HTlUgXAorICAgICAmJiAoIWRlZmluZWQgX19MREJMX0NPTVBBVCB8fCAhZGVmaW5lZCBfX1JFRElSRUNUKSBcCisgICAgICYmIChkZWZpbmVkIF9fU1RSSUNUX0FOU0lfXyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMkspCisjICBpZmRlZiBfX1JFRElSRUNUCisvKiBGb3Igc3RyaWN0IElTTyBDOTkgb3IgUE9TSVggY29tcGxpYW5jZSBkaXNhbGxvdyAlYXMsICVhUyBhbmQgJWFbCisgICBHTlUgZXh0ZW5zaW9uIHdoaWNoIGNvbmZsaWN0cyB3aXRoIHZhbGlkICVhIGZvbGxvd2VkIGJ5IGxldHRlcgorICAgcywgUyBvciBbLiAgKi8KK2V4dGVybiBpbnQgX19SRURJUkVDVCAodmZzY2FuZiwKKwkJICAgICAgIChGSUxFICpfX3Jlc3RyaWN0IF9fcywKKwkJCV9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgX0dfdmFfbGlzdCBfX2FyZyksCisJCSAgICAgICBfX2lzb2M5OV92ZnNjYW5mKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19zY2FuZl9fLCAyLCAwKSkpIF9fd3VyOworZXh0ZXJuIGludCBfX1JFRElSRUNUICh2c2NhbmYsIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkJX0dfdmFfbGlzdCBfX2FyZyksIF9faXNvYzk5X3ZzY2FuZikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fc2NhbmZfXywgMSwgMCkpKSBfX3d1cjsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHZzc2NhbmYsCisJCQkgICAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywKKwkJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgICAgX0dfdmFfbGlzdCBfX2FyZyksIF9faXNvYzk5X3Zzc2NhbmYpCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3NjYW5mX18sIDIsIDApKSk7CisjICBlbHNlCitleHRlcm4gaW50IF9faXNvYzk5X3Zmc2NhbmYgKEZJTEUgKl9fcmVzdHJpY3QgX19zLAorCQkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgICAgIF9HX3ZhX2xpc3QgX19hcmcpIF9fd3VyOworZXh0ZXJuIGludCBfX2lzb2M5OV92c2NhbmYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgICBfR192YV9saXN0IF9fYXJnKSBfX3d1cjsKK2V4dGVybiBpbnQgX19pc29jOTlfdnNzY2FuZiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywKKwkJCSAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICAgICBfR192YV9saXN0IF9fYXJnKSBfX1RIUk9XOworIyAgIGRlZmluZSB2ZnNjYW5mIF9faXNvYzk5X3Zmc2NhbmYKKyMgICBkZWZpbmUgdnNjYW5mIF9faXNvYzk5X3ZzY2FuZgorIyAgIGRlZmluZSB2c3NjYW5mIF9faXNvYzk5X3Zzc2NhbmYKKyMgIGVuZGlmCisjIGVuZGlmCisKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZiAvKiBVc2UgSVNPIEM5eC4gICovCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBSZWFkIGEgY2hhcmFjdGVyIGZyb20gU1RSRUFNLgorCisgICBUaGVzZSBmdW5jdGlvbnMgYXJlIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmZ2V0YyAoRklMRSAqX19zdHJlYW0pOworZXh0ZXJuIGludCBnZXRjIChGSUxFICpfX3N0cmVhbSk7CisKKy8qIFJlYWQgYSBjaGFyYWN0ZXIgZnJvbSBzdGRpbi4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGdldGNoYXIgKHZvaWQpOworX19FTkRfTkFNRVNQQUNFX1NURAorCisvKiBUaGUgQyBzdGFuZGFyZCBleHBsaWNpdGx5IHNheXMgdGhpcyBpcyBhIG1hY3JvLCBzbyB3ZSBhbHdheXMgZG8gdGhlCisgICBvcHRpbWl6YXRpb24gZm9yIGl0LiAgKi8KKyNkZWZpbmUgZ2V0YyhfZnApIF9JT19nZXRjIChfZnApCisKKyNpZiBkZWZpbmVkIF9fVVNFX1BPU0lYIHx8IGRlZmluZWQgX19VU0VfTUlTQworLyogVGhlc2UgYXJlIGRlZmluZWQgaW4gUE9TSVguMToxOTk2LgorCisgICBUaGVzZSBmdW5jdGlvbnMgYXJlIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRjX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSk7CitleHRlcm4gaW50IGdldGNoYXJfdW5sb2NrZWQgKHZvaWQpOworI2VuZGlmIC8qIFVzZSBQT1NJWCBvciBNSVNDLiAgKi8KKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIEZhc3RlciB2ZXJzaW9uIHdoZW4gbG9ja2luZyBpcyBub3QgbmVjZXNzYXJ5LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZnZXRjX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSk7CisjZW5kaWYgLyogVXNlIE1JU0MuICAqLworCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogV3JpdGUgYSBjaGFyYWN0ZXIgdG8gU1RSRUFNLgorCisgICBUaGVzZSBmdW5jdGlvbnMgYXJlIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZwdXRjIChpbnQgX19jLCBGSUxFICpfX3N0cmVhbSk7CitleHRlcm4gaW50IHB1dGMgKGludCBfX2MsIEZJTEUgKl9fc3RyZWFtKTsKKworLyogV3JpdGUgYSBjaGFyYWN0ZXIgdG8gc3Rkb3V0LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcHV0Y2hhciAoaW50IF9fYyk7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKy8qIFRoZSBDIHN0YW5kYXJkIGV4cGxpY2l0bHkgc2F5cyB0aGlzIGNhbiBiZSBhIG1hY3JvLAorICAgc28gd2UgYWx3YXlzIGRvIHRoZSBvcHRpbWl6YXRpb24gZm9yIGl0LiAgKi8KKyNkZWZpbmUgcHV0YyhfY2gsIF9mcCkgX0lPX3B1dGMgKF9jaCwgX2ZwKQorCisjaWZkZWYgX19VU0VfTUlTQworLyogRmFzdGVyIHZlcnNpb24gd2hlbiBsb2NraW5nIGlzIG5vdCBuZWNlc3NhcnkuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZnB1dGNfdW5sb2NrZWQgKGludCBfX2MsIEZJTEUgKl9fc3RyZWFtKTsKKyNlbmRpZiAvKiBVc2UgTUlTQy4gICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX1BPU0lYIHx8IGRlZmluZWQgX19VU0VfTUlTQworLyogVGhlc2UgYXJlIGRlZmluZWQgaW4gUE9TSVguMToxOTk2LgorCisgICBUaGVzZSBmdW5jdGlvbnMgYXJlIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwdXRjX3VubG9ja2VkIChpbnQgX19jLCBGSUxFICpfX3N0cmVhbSk7CitleHRlcm4gaW50IHB1dGNoYXJfdW5sb2NrZWQgKGludCBfX2MpOworI2VuZGlmIC8qIFVzZSBQT1NJWCBvciBNSVNDLiAgKi8KKworCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfTUlTQyBcCisgICAgfHwgKGRlZmluZWQgX19VU0VfWE9QRU4gJiYgIWRlZmluZWQgX19VU0VfWE9QRU4ySykKKy8qIEdldCBhIHdvcmQgKGludCkgZnJvbSBTVFJFQU0uICAqLworZXh0ZXJuIGludCBnZXR3IChGSUxFICpfX3N0cmVhbSk7CisKKy8qIFdyaXRlIGEgd29yZCAoaW50KSB0byBTVFJFQU0uICAqLworZXh0ZXJuIGludCBwdXR3IChpbnQgX193LCBGSUxFICpfX3N0cmVhbSk7CisjZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIEdldCBhIG5ld2xpbmUtdGVybWluYXRlZCBzdHJpbmcgb2YgZmluaXRlIGxlbmd0aCBmcm9tIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gY2hhciAqZmdldHMgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBpbnQgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKQorICAgICBfX3d1cjsKKworLyogR2V0IGEgbmV3bGluZS10ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHN0ZGluLCByZW1vdmluZyB0aGUgbmV3bGluZS4KKyAgIERPIE5PVCBVU0UgVEhJUyBGVU5DVElPTiEhICBUaGVyZSBpcyBubyBsaW1pdCBvbiBob3cgbXVjaCBpdCB3aWxsIHJlYWQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGNoYXIgKmdldHMgKGNoYXIgKl9fcykgX193dXI7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgc2FtZSBhcyBgZmdldHMnIGJ1dCBkb2VzIG5vdCBsb2NrIHRoZSBzdHJlYW0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBjaGFyICpmZ2V0c191bmxvY2tlZCAoY2hhciAqX19yZXN0cmljdCBfX3MsIGludCBfX24sCisJCQkgICAgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pIF9fd3VyOworI2VuZGlmCisKKworI2lmZGVmCV9fVVNFX1hPUEVOMks4CisvKiBSZWFkIHVwIHRvIChhbmQgaW5jbHVkaW5nKSBhIERFTElNSVRFUiBmcm9tIFNUUkVBTSBpbnRvICpMSU5FUFRSCisgICAoYW5kIG51bGwtdGVybWluYXRlIGl0KS4gKkxJTkVQVFIgaXMgYSBwb2ludGVyIHJldHVybmVkIGZyb20gbWFsbG9jIChvcgorICAgTlVMTCksIHBvaW50aW5nIHRvICpOIGNoYXJhY3RlcnMgb2Ygc3BhY2UuICBJdCBpcyByZWFsbG9jJ2QgYXMKKyAgIG5lY2Vzc2FyeS4gIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQgKG5vdCBpbmNsdWRpbmcgdGhlCisgICBudWxsIHRlcm1pbmF0b3IpLCBvciAtMSBvbiBlcnJvciBvciBFT0YuCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIHRoZXkgYXJlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIF9JT19zc2l6ZV90IF9fZ2V0ZGVsaW0gKGNoYXIgKipfX3Jlc3RyaWN0IF9fbGluZXB0ciwKKwkJCSAgICAgICBzaXplX3QgKl9fcmVzdHJpY3QgX19uLCBpbnQgX19kZWxpbWl0ZXIsCisJCQkgICAgICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgX193dXI7CitleHRlcm4gX0lPX3NzaXplX3QgZ2V0ZGVsaW0gKGNoYXIgKipfX3Jlc3RyaWN0IF9fbGluZXB0ciwKKwkJCSAgICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fbiwgaW50IF9fZGVsaW1pdGVyLAorCQkJICAgICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSBfX3d1cjsKKworLyogTGlrZSBgZ2V0ZGVsaW0nLCBidXQgcmVhZHMgdXAgdG8gYSBuZXdsaW5lLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gX0lPX3NzaXplX3QgZ2V0bGluZSAoY2hhciAqKl9fcmVzdHJpY3QgX19saW5lcHRyLAorCQkJICAgIHNpemVfdCAqX19yZXN0cmljdCBfX24sCisJCQkgICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgX193dXI7CisjZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFdyaXRlIGEgc3RyaW5nIHRvIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZwdXRzIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zLCBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKTsKKworLyogV3JpdGUgYSBzdHJpbmcsIGZvbGxvd2VkIGJ5IGEgbmV3bGluZSwgdG8gc3Rkb3V0LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcHV0cyAoX19jb25zdCBjaGFyICpfX3MpOworCisKKy8qIFB1c2ggYSBjaGFyYWN0ZXIgYmFjayBvbnRvIHRoZSBpbnB1dCBidWZmZXIgb2YgU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgdW5nZXRjIChpbnQgX19jLCBGSUxFICpfX3N0cmVhbSk7CisKKworLyogUmVhZCBjaHVua3Mgb2YgZ2VuZXJpYyBkYXRhIGZyb20gU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzaXplX3QgZnJlYWQgKHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3NpemUsCisJCSAgICAgc2l6ZV90IF9fbiwgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgX193dXI7CisvKiBXcml0ZSBjaHVua3Mgb2YgZ2VuZXJpYyBkYXRhIHRvIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc2l6ZV90IGZ3cml0ZSAoX19jb25zdCB2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19zaXplLAorCQkgICAgICBzaXplX3QgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fcyk7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgc2FtZSBhcyBgZnB1dHMnIGJ1dCBkb2VzIG5vdCBsb2NrIHRoZSBzdHJlYW0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZnB1dHNfdW5sb2NrZWQgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3MsCisJCQkgICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTUlTQworLyogRmFzdGVyIHZlcnNpb25zIHdoZW4gbG9ja2luZyBpcyBub3QgbmVjZXNzYXJ5LgorCisgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGV5IGFyZSBjYW5jZWxsYXRpb24gcG9pbnRzIGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzaXplX3QgZnJlYWRfdW5sb2NrZWQgKHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3NpemUsCisJCQkgICAgICBzaXplX3QgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSBfX3d1cjsKK2V4dGVybiBzaXplX3QgZndyaXRlX3VubG9ja2VkIChfX2NvbnN0IHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3NpemUsCisJCQkgICAgICAgc2l6ZV90IF9fbiwgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSk7CisjZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFNlZWsgdG8gYSBjZXJ0YWluIHBvc2l0aW9uIG9uIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZzZWVrIChGSUxFICpfX3N0cmVhbSwgbG9uZyBpbnQgX19vZmYsIGludCBfX3doZW5jZSk7CisvKiBSZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBsb25nIGludCBmdGVsbCAoRklMRSAqX19zdHJlYW0pIF9fd3VyOworLyogUmV3aW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIHJld2luZCAoRklMRSAqX19zdHJlYW0pOworX19FTkRfTkFNRVNQQUNFX1NURAorCisvKiBUaGUgU2luZ2xlIFVuaXggU3BlY2lmaWNhdGlvbiwgVmVyc2lvbiAyLCBzcGVjaWZpZXMgYW4gYWx0ZXJuYXRpdmUsCisgICBtb3JlIGFkZXF1YXRlIGludGVyZmFjZSBmb3IgdGhlIHR3byBmdW5jdGlvbnMgYWJvdmUgd2hpY2ggZGVhbCB3aXRoCisgICBmaWxlIG9mZnNldC4gIGBsb25nIGludCcgaXMgbm90IHRoZSByaWdodCB0eXBlLiAgVGhlc2UgZGVmaW5pdGlvbnMKKyAgIGFyZSBvcmlnaW5hbGx5IGRlZmluZWQgaW4gdGhlIExhcmdlIEZpbGUgU3VwcG9ydCBBUEkuICAqLworCisjaWYgZGVmaW5lZCBfX1VTRV9MQVJHRUZJTEUgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisvKiBTZWVrIHRvIGEgY2VydGFpbiBwb3NpdGlvbiBvbiBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmc2Vla28gKEZJTEUgKl9fc3RyZWFtLCBfX29mZl90IF9fb2ZmLCBpbnQgX193aGVuY2UpOworLyogUmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gX19vZmZfdCBmdGVsbG8gKEZJTEUgKl9fc3RyZWFtKSBfX3d1cjsKKyMgZWxzZQorIyAgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIGludCBfX1JFRElSRUNUIChmc2Vla28sCisJCSAgICAgICAoRklMRSAqX19zdHJlYW0sIF9fb2ZmNjRfdCBfX29mZiwgaW50IF9fd2hlbmNlKSwKKwkJICAgICAgIGZzZWVrbzY0KTsKK2V4dGVybiBfX29mZjY0X3QgX19SRURJUkVDVCAoZnRlbGxvLCAoRklMRSAqX19zdHJlYW0pLCBmdGVsbG82NCk7CisjICBlbHNlCisjICAgZGVmaW5lIGZzZWVrbyBmc2Vla282NAorIyAgIGRlZmluZSBmdGVsbG8gZnRlbGxvNjQKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKy8qIEdldCBTVFJFQU0ncyBwb3NpdGlvbi4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZnZXRwb3MgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIGZwb3NfdCAqX19yZXN0cmljdCBfX3Bvcyk7CisvKiBTZXQgU1RSRUFNJ3MgcG9zaXRpb24uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmc2V0cG9zIChGSUxFICpfX3N0cmVhbSwgX19jb25zdCBmcG9zX3QgKl9fcG9zKTsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoZmdldHBvcywgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJCQkJIGZwb3NfdCAqX19yZXN0cmljdCBfX3BvcyksIGZnZXRwb3M2NCk7CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKGZzZXRwb3MsCisJCSAgICAgICAoRklMRSAqX19zdHJlYW0sIF9fY29uc3QgZnBvc190ICpfX3BvcyksIGZzZXRwb3M2NCk7CisjIGVsc2UKKyMgIGRlZmluZSBmZ2V0cG9zIGZnZXRwb3M2NAorIyAgZGVmaW5lIGZzZXRwb3MgZnNldHBvczY0CisjIGVuZGlmCisjZW5kaWYKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IGZzZWVrbzY0IChGSUxFICpfX3N0cmVhbSwgX19vZmY2NF90IF9fb2ZmLCBpbnQgX193aGVuY2UpOworZXh0ZXJuIF9fb2ZmNjRfdCBmdGVsbG82NCAoRklMRSAqX19zdHJlYW0pIF9fd3VyOworZXh0ZXJuIGludCBmZ2V0cG9zNjQgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIGZwb3M2NF90ICpfX3Jlc3RyaWN0IF9fcG9zKTsKK2V4dGVybiBpbnQgZnNldHBvczY0IChGSUxFICpfX3N0cmVhbSwgX19jb25zdCBmcG9zNjRfdCAqX19wb3MpOworI2VuZGlmCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogQ2xlYXIgdGhlIGVycm9yIGFuZCBFT0YgaW5kaWNhdG9ycyBmb3IgU1RSRUFNLiAgKi8KK2V4dGVybiB2b2lkIGNsZWFyZXJyIChGSUxFICpfX3N0cmVhbSkgX19USFJPVzsKKy8qIFJldHVybiB0aGUgRU9GIGluZGljYXRvciBmb3IgU1RSRUFNLiAgKi8KK2V4dGVybiBpbnQgZmVvZiAoRklMRSAqX19zdHJlYW0pIF9fVEhST1cgX193dXI7CisvKiBSZXR1cm4gdGhlIGVycm9yIGluZGljYXRvciBmb3IgU1RSRUFNLiAgKi8KK2V4dGVybiBpbnQgZmVycm9yIChGSUxFICpfX3N0cmVhbSkgX19USFJPVyBfX3d1cjsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIEZhc3RlciB2ZXJzaW9ucyB3aGVuIGxvY2tpbmcgaXMgbm90IHJlcXVpcmVkLiAgKi8KK2V4dGVybiB2b2lkIGNsZWFyZXJyX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSkgX19USFJPVzsKK2V4dGVybiBpbnQgZmVvZl91bmxvY2tlZCAoRklMRSAqX19zdHJlYW0pIF9fVEhST1cgX193dXI7CitleHRlcm4gaW50IGZlcnJvcl91bmxvY2tlZCAoRklMRSAqX19zdHJlYW0pIF9fVEhST1cgX193dXI7CisjZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFByaW50IGEgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBtZWFuaW5nIG9mIHRoZSB2YWx1ZSBvZiBlcnJuby4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBwZXJyb3IgKF9fY29uc3QgY2hhciAqX19zKTsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworLyogUHJvdmlkZSB0aGUgZGVjbGFyYXRpb25zIGZvciBgc3lzX2Vycmxpc3QnIGFuZCBgc3lzX25lcnInIGlmIHRoZXkKKyAgIGFyZSBhdmFpbGFibGUgb24gdGhpcyBzeXN0ZW0uICBFdmVuIGlmIGF2YWlsYWJsZSwgdGhlc2UgdmFyaWFibGVzCisgICBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkuICBUaGUgYHN0cmVycm9yJyBmdW5jdGlvbiBwcm92aWRlcworICAgYWxsIHRoZSBuZWNlc3NhcnkgZnVuY3Rpb25hbGl0eS4gICovCisjaW5jbHVkZSA8Yml0cy9zeXNfZXJybGlzdC5oPgorCisKKyNpZmRlZglfX1VTRV9QT1NJWAorLyogUmV0dXJuIHRoZSBzeXN0ZW0gZmlsZSBkZXNjcmlwdG9yIGZvciBTVFJFQU0uICAqLworZXh0ZXJuIGludCBmaWxlbm8gKEZJTEUgKl9fc3RyZWFtKSBfX1RIUk9XIF9fd3VyOworI2VuZGlmIC8qIFVzZSBQT1NJWC4gICovCisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBGYXN0ZXIgdmVyc2lvbiB3aGVuIGxvY2tpbmcgaXMgbm90IHJlcXVpcmVkLiAgKi8KK2V4dGVybiBpbnQgZmlsZW5vX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSkgX19USFJPVyBfX3d1cjsKKyNlbmRpZgorCisKKyNpZiAoZGVmaW5lZCBfX1VTRV9QT1NJWDIgfHwgZGVmaW5lZCBfX1VTRV9TVklEICB8fCBkZWZpbmVkIF9fVVNFX0JTRCB8fCBcCisgICAgIGRlZmluZWQgX19VU0VfTUlTQykKKy8qIENyZWF0ZSBhIG5ldyBzdHJlYW0gY29ubmVjdGVkIHRvIGEgcGlwZSBydW5uaW5nIHRoZSBnaXZlbiBjb21tYW5kLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBGSUxFICpwb3BlbiAoX19jb25zdCBjaGFyICpfX2NvbW1hbmQsIF9fY29uc3QgY2hhciAqX19tb2RlcykgX193dXI7CisKKy8qIENsb3NlIGEgc3RyZWFtIG9wZW5lZCBieSBwb3BlbiBhbmQgcmV0dXJuIHRoZSBzdGF0dXMgb2YgaXRzIGNoaWxkLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcGNsb3NlIChGSUxFICpfX3N0cmVhbSk7CisjZW5kaWYKKworCisjaWZkZWYJX19VU0VfUE9TSVgKKy8qIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29udHJvbGxpbmcgdGVybWluYWwuICAqLworZXh0ZXJuIGNoYXIgKmN0ZXJtaWQgKGNoYXIgKl9fcykgX19USFJPVzsKKyNlbmRpZiAvKiBVc2UgUE9TSVguICAqLworCisKKyNpZmRlZiBfX1VTRV9YT1BFTgorLyogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHVzZXIuICAqLworZXh0ZXJuIGNoYXIgKmN1c2VyaWQgKGNoYXIgKl9fcyk7CisjZW5kaWYgLyogVXNlIFgvT3BlbiwgYnV0IG5vdCBpc3N1ZSA2LiAgKi8KKworCisjaWZkZWYJX19VU0VfR05VCitzdHJ1Y3Qgb2JzdGFjazsJCQkvKiBTZWUgPG9ic3RhY2suaD4uICAqLworCisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIGFuIG9ic3RhY2suICAqLworZXh0ZXJuIGludCBvYnN0YWNrX3ByaW50ZiAoc3RydWN0IG9ic3RhY2sgKl9fcmVzdHJpY3QgX19vYnN0YWNrLAorCQkJICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pCisgICAgIF9fVEhST1dOTCBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMiwgMykpKTsKK2V4dGVybiBpbnQgb2JzdGFja192cHJpbnRmIChzdHJ1Y3Qgb2JzdGFjayAqX19yZXN0cmljdCBfX29ic3RhY2ssCisJCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICAgIF9HX3ZhX2xpc3QgX19hcmdzKQorICAgICBfX1RIUk9XTkwgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDIsIDApKSk7CisjZW5kaWYgLyogVXNlIEdOVS4gICovCisKKworI2lmIGRlZmluZWQgX19VU0VfUE9TSVggfHwgZGVmaW5lZCBfX1VTRV9NSVNDCisvKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiBQT1NJWC4xOjE5OTYuICAqLworCisvKiBBY3F1aXJlIG93bmVyc2hpcCBvZiBTVFJFQU0uICAqLworZXh0ZXJuIHZvaWQgZmxvY2tmaWxlIChGSUxFICpfX3N0cmVhbSkgX19USFJPVzsKKworLyogVHJ5IHRvIGFjcXVpcmUgb3duZXJzaGlwIG9mIFNUUkVBTSBidXQgZG8gbm90IGJsb2NrIGlmIGl0IGlzIG5vdAorICAgcG9zc2libGUuICAqLworZXh0ZXJuIGludCBmdHJ5bG9ja2ZpbGUgKEZJTEUgKl9fc3RyZWFtKSBfX1RIUk9XIF9fd3VyOworCisvKiBSZWxpbnF1aXNoIHRoZSBvd25lcnNoaXAgZ3JhbnRlZCBmb3IgU1RSRUFNLiAgKi8KK2V4dGVybiB2b2lkIGZ1bmxvY2tmaWxlIChGSUxFICpfX3N0cmVhbSkgX19USFJPVzsKKyNlbmRpZiAvKiBQT1NJWCB8fCBtaXNjICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX1hPUEVOICYmICFkZWZpbmVkIF9fVVNFX1hPUEVOMksgJiYgIWRlZmluZWQgX19VU0VfR05VCisvKiBUaGUgWC9PcGVuIHN0YW5kYXJkIHJlcXVpcmVzIHNvbWUgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgdG8gYmUKKyAgIGRlY2xhcmVkIGhlcmUgd2hpY2ggZG8gbm90IGJlbG9uZyBpbnRvIHRoaXMgaGVhZGVyLiAgQnV0IHdlIGhhdmUgdG8KKyAgIGZvbGxvdy4gIEluIEdOVSBtb2RlIHdlIGRvbid0IGRvIHRoaXMgbm9uc2Vuc2UuICAqLworIyBkZWZpbmUgX19uZWVkX2dldG9wdAorIyBpbmNsdWRlIDxnZXRvcHQuaD4KKyNlbmRpZgkvKiBYL09wZW4sIGJ1dCBub3QgaXNzdWUgNiBhbmQgbm90IGZvciBHTlUuICAqLworCisvKiBJZiB3ZSBhcmUgY29tcGlsaW5nIHdpdGggb3B0aW1pemluZyByZWFkIHRoaXMgZmlsZS4gIEl0IGNvbnRhaW5zCisgICBzZXZlcmFsIG9wdGltaXppbmcgaW5saW5lIGZ1bmN0aW9ucyBhbmQgbWFjcm9zLiAgKi8KKyNpZmRlZiBfX1VTRV9FWFRFUk5fSU5MSU5FUworIyBpbmNsdWRlIDxiaXRzL3N0ZGlvLmg+CisjZW5kaWYKKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUKKyMgaW5jbHVkZSA8Yml0cy9zdGRpbzIuaD4KKyNlbmRpZgorI2lmZGVmIF9fTERCTF9DT01QQVQKKyMgaW5jbHVkZSA8Yml0cy9zdGRpby1sZGJsLmg+CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIDxzdGRpby5oPiBpbmNsdWRlZC4gICovCisKKyNlbmRpZiAvKiAhX1NURElPX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RkaW9fZXh0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N0ZGlvX2V4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZDEyZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N0ZGlvX2V4dC5oCkBAIC0wLDAgKzEsODcgQEAKKy8qIEZ1bmN0aW9ucyB0byBhY2Nlc3MgRklMRSBzdHJ1Y3R1cmUgaW50ZXJuYWxzLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBUaGlzIGhlYWRlciBjb250YWlucyB0aGUgc2FtZSBkZWZpbml0aW9ucyBhcyB0aGUgaGVhZGVyIG9mIHRoZSBzYW1lIG5hbWUKKyAgIG9uIFN1bidzIFNvbGFyaXMgT1MuICAqLworCisjaWZuZGVmIF9TVERJT19FWFRfSAorI2RlZmluZSBfU1RESU9fRVhUX0gJMQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworZW51bQoreworICAvKiBRdWVyeSBjdXJyZW50IHN0YXRlIG9mIHRoZSBsb2NraW5nIHN0YXR1cy4gICovCisgIEZTRVRMT0NLSU5HX1FVRVJZID0gMCwKKyNkZWZpbmUgRlNFVExPQ0tJTkdfUVVFUlkJRlNFVExPQ0tJTkdfUVVFUlkKKyAgLyogVGhlIGxpYnJhcnkgcHJvdGVjdHMgYWxsIHVzZXMgb2YgdGhlIHN0cmVhbSBmdW5jdGlvbnMsIGV4Y2VwdCBmb3IKKyAgICAgdXNlcyBvZiB0aGUgKl91bmxvY2tlZCBmdW5jdGlvbnMsIGJ5IGNhbGxzIGVxdWl2YWxlbnQgdG8gZmxvY2tmaWxlKCkuICAqLworICBGU0VUTE9DS0lOR19JTlRFUk5BTCwKKyNkZWZpbmUgRlNFVExPQ0tJTkdfSU5URVJOQUwJRlNFVExPQ0tJTkdfSU5URVJOQUwKKyAgLyogVGhlIHVzZXIgd2lsbCB0YWtlIGNhcmUgb2YgbG9ja2luZy4gICovCisgIEZTRVRMT0NLSU5HX0JZQ0FMTEVSCisjZGVmaW5lIEZTRVRMT0NLSU5HX0JZQ0FMTEVSCUZTRVRMT0NLSU5HX0JZQ0FMTEVSCit9OworCisKK19fQkVHSU5fREVDTFMKKworLyogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgb2YgRlAgaW4gYnl0ZXMgY3VycmVudGx5IGluIHVzZSBieQorICAgdGhlIGdpdmVuIHN0cmVhbS4gICovCitleHRlcm4gc2l6ZV90IF9fZmJ1ZnNpemUgKEZJTEUgKl9fZnApIF9fVEhST1c7CisKKworLyogUmV0dXJuIG5vbi16ZXJvIHZhbHVlIGlmZiB0aGUgc3RyZWFtIEZQIGlzIG9wZW5lZCByZWFkb25seSwgb3IgaWYgdGhlCisgICBsYXN0IG9wZXJhdGlvbiBvbiB0aGUgc3RyZWFtIHdhcyBhIHJlYWQgb3BlcmF0aW9uLiAgKi8KK2V4dGVybiBpbnQgX19mcmVhZGluZyAoRklMRSAqX19mcCkgX19USFJPVzsKKworLyogUmV0dXJuIG5vbi16ZXJvIHZhbHVlIGlmZiB0aGUgc3RyZWFtIEZQIGlzIG9wZW5lZCB3cml0ZS1vbmx5IG9yCisgICBhcHBlbmQtb25seSwgb3IgaWYgdGhlIGxhc3Qgb3BlcmF0aW9uIG9uIHRoZSBzdHJlYW0gd2FzIGEgd3JpdGUKKyAgIG9wZXJhdGlvbi4gICovCitleHRlcm4gaW50IF9fZndyaXRpbmcgKEZJTEUgKl9fZnApIF9fVEhST1c7CisKKworLyogUmV0dXJuIG5vbi16ZXJvIHZhbHVlIGlmZiBzdHJlYW0gRlAgaXMgbm90IG9wZW5lZCB3cml0ZS1vbmx5IG9yCisgICBhcHBlbmQtb25seS4gICovCitleHRlcm4gaW50IF9fZnJlYWRhYmxlIChGSUxFICpfX2ZwKSBfX1RIUk9XOworCisvKiBSZXR1cm4gbm9uLXplcm8gdmFsdWUgaWZmIHN0cmVhbSBGUCBpcyBub3Qgb3BlbmVkIHJlYWQtb25seS4gICovCitleHRlcm4gaW50IF9fZndyaXRhYmxlIChGSUxFICpfX2ZwKSBfX1RIUk9XOworCisKKy8qIFJldHVybiBub24temVybyB2YWx1ZSBpZmYgdGhlIHN0cmVhbSBGUCBpcyBsaW5lLWJ1ZmZlcmVkLiAgKi8KK2V4dGVybiBpbnQgX19mbGJmIChGSUxFICpfX2ZwKSBfX1RIUk9XOworCisKKy8qIERpc2NhcmQgYWxsIHBlbmRpbmcgYnVmZmVyZWQgSS9PIG9uIHRoZSBzdHJlYW0gRlAuICAqLworZXh0ZXJuIHZvaWQgX19mcHVyZ2UgKEZJTEUgKl9fZnApIF9fVEhST1c7CisKKy8qIFJldHVybiBhbW91bnQgb2Ygb3V0cHV0IGluIGJ5dGVzIHBlbmRpbmcgb24gYSBzdHJlYW0gRlAuICAqLworZXh0ZXJuIHNpemVfdCBfX2ZwZW5kaW5nIChGSUxFICpfX2ZwKSBfX1RIUk9XOworCisvKiBGbHVzaCBhbGwgbGluZS1idWZmZXJlZCBmaWxlcy4gICovCitleHRlcm4gdm9pZCBfZmx1c2hsYmYgKHZvaWQpOworCisKKy8qIFNldCBsb2NraW5nIHN0YXR1cyBvZiBzdHJlYW0gRlAgdG8gVFlQRS4gICovCitleHRlcm4gaW50IF9fZnNldGxvY2tpbmcgKEZJTEUgKl9fZnAsIGludCBfX3R5cGUpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzdGRpb19leHQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zdGRsaWIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RkbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkMTI4YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RkbGliLmgKQEAgLTAsMCArMSw5NjYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0yMDA3LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJSVNPIEM5OSBTdGFuZGFyZDogNy4yMCBHZW5lcmFsIHV0aWxpdGllcwk8c3RkbGliLmg+CisgKi8KKworI2lmbmRlZglfU1RETElCX0gKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIEdldCBzaXplX3QsIHdjaGFyX3QgYW5kIE5VTEwgZnJvbSA8c3RkZGVmLmg+LiAgKi8KKyNkZWZpbmUJCV9fbmVlZF9zaXplX3QKKyNpZm5kZWYgX19uZWVkX21hbGxvY19hbmRfY2FsbG9jCisjIGRlZmluZQlfX25lZWRfd2NoYXJfdAorIyBkZWZpbmUJX19uZWVkX05VTEwKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCitfX0JFR0lOX0RFQ0xTCisKKyNpZm5kZWYgX19uZWVkX21hbGxvY19hbmRfY2FsbG9jCisjZGVmaW5lCV9TVERMSUJfSAkxCisKKyNpZiAoZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4KSAmJiAhZGVmaW5lZCBfU1lTX1dBSVRfSAorLyogWFBHIHJlcXVpcmVzIGEgZmV3IHN5bWJvbHMgZnJvbSA8c3lzL3dhaXQuaD4gYmVpbmcgZGVmaW5lZC4gICovCisjIGluY2x1ZGUgPGJpdHMvd2FpdGZsYWdzLmg+CisjIGluY2x1ZGUgPGJpdHMvd2FpdHN0YXR1cy5oPgorCisjIGlmZGVmIF9fVVNFX0JTRAorCisvKiBMb3RzIG9mIGhhaXIgdG8gYWxsb3cgdHJhZGl0aW9uYWwgQlNEIHVzZSBvZiBgdW5pb24gd2FpdCcKKyAgIGFzIHdlbGwgYXMgUE9TSVguMSB1c2Ugb2YgYGludCcgZm9yIHRoZSBzdGF0dXMgd29yZC4gICovCisKKyMgIGlmIGRlZmluZWQgX19HTlVDX18gJiYgIWRlZmluZWQgX19jcGx1c3BsdXMKKyMgICBkZWZpbmUgX19XQUlUX0lOVChzdGF0dXMpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKCgodW5pb24geyBfX3R5cGVvZihzdGF0dXMpIF9faW47IGludCBfX2k7IH0pIFwKKwkJICAgeyAuX19pbiA9IChzdGF0dXMpIH0pLl9faSkpCisjICBlbHNlCisjICAgZGVmaW5lIF9fV0FJVF9JTlQoc3RhdHVzKQkoKihpbnQgKikgJihzdGF0dXMpKQorIyAgZW5kaWYKKworLyogVGhpcyBpcyB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQgdG8gYHdhaXQnLiAgVGhlIGZ1bmt5IHVuaW9uCisgICBjYXVzZXMgcmVkZWNsYXJhdGlvbnMgd2l0aCBlaXRoZXIgYGludCAqJyBvciBgdW5pb24gd2FpdCAqJyB0byBiZQorICAgYWxsb3dlZCB3aXRob3V0IGNvbXBsYWludC4gIF9fV0FJVF9TVEFUVVNfREVGTiBpcyB0aGUgdHlwZSB1c2VkIGluCisgICB0aGUgYWN0dWFsIGZ1bmN0aW9uIGRlZmluaXRpb25zLiAgKi8KKworIyAgaWYgIWRlZmluZWQgX19HTlVDX18gfHwgX19HTlVDX18gPCAyIHx8IGRlZmluZWQgX19jcGx1c3BsdXMKKyMgICBkZWZpbmUgX19XQUlUX1NUQVRVUwl2b2lkICoKKyMgICBkZWZpbmUgX19XQUlUX1NUQVRVU19ERUZOCXZvaWQgKgorIyAgZWxzZQorLyogVGhpcyB3b3JrcyBpbiBHQ0MgMi42LjEgYW5kIGxhdGVyLiAgKi8KK3R5cGVkZWYgdW5pb24KKyAgeworICAgIHVuaW9uIHdhaXQgKl9fdXB0cjsKKyAgICBpbnQgKl9faXB0cjsKKyAgfSBfX1dBSVRfU1RBVFVTIF9fYXR0cmlidXRlX18gKChfX3RyYW5zcGFyZW50X3VuaW9uX18pKTsKKyMgICBkZWZpbmUgX19XQUlUX1NUQVRVU19ERUZOCWludCAqCisjICBlbmRpZgorCisjIGVsc2UgLyogRG9uJ3QgdXNlIEJTRC4gICovCisKKyMgIGRlZmluZSBfX1dBSVRfSU5UKHN0YXR1cykJKHN0YXR1cykKKyMgIGRlZmluZSBfX1dBSVRfU1RBVFVTCQlpbnQgKgorIyAgZGVmaW5lIF9fV0FJVF9TVEFUVVNfREVGTglpbnQgKgorCisjIGVuZGlmIC8qIFVzZSBCU0QuICAqLworCisvKiBEZWZpbmUgdGhlIG1hY3JvcyA8c3lzL3dhaXQuaD4gYWxzbyB3b3VsZCBkZWZpbmUgdGhpcyB3YXkuICAqLworIyBkZWZpbmUgV0VYSVRTVEFUVVMoc3RhdHVzKQlfX1dFWElUU1RBVFVTIChfX1dBSVRfSU5UIChzdGF0dXMpKQorIyBkZWZpbmUgV1RFUk1TSUcoc3RhdHVzKQlfX1dURVJNU0lHIChfX1dBSVRfSU5UIChzdGF0dXMpKQorIyBkZWZpbmUgV1NUT1BTSUcoc3RhdHVzKQlfX1dTVE9QU0lHIChfX1dBSVRfSU5UIChzdGF0dXMpKQorIyBkZWZpbmUgV0lGRVhJVEVEKHN0YXR1cykJX19XSUZFWElURUQgKF9fV0FJVF9JTlQgKHN0YXR1cykpCisjIGRlZmluZSBXSUZTSUdOQUxFRChzdGF0dXMpCV9fV0lGU0lHTkFMRUQgKF9fV0FJVF9JTlQgKHN0YXR1cykpCisjIGRlZmluZSBXSUZTVE9QUEVEKHN0YXR1cykJX19XSUZTVE9QUEVEIChfX1dBSVRfSU5UIChzdGF0dXMpKQorIyBpZmRlZiBfX1dJRkNPTlRJTlVFRAorIyAgZGVmaW5lIFdJRkNPTlRJTlVFRChzdGF0dXMpCV9fV0lGQ09OVElOVUVEIChfX1dBSVRfSU5UIChzdGF0dXMpKQorIyBlbmRpZgorI2VuZGlmCS8qIFgvT3BlbiBvciBYUEc3IGFuZCA8c3lzL3dhaXQuaD4gbm90IGluY2x1ZGVkLiAgKi8KKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBSZXR1cm5lZCBieSBgZGl2Jy4gICovCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgaW50IHF1b3Q7CQkJLyogUXVvdGllbnQuICAqLworICAgIGludCByZW07CQkJLyogUmVtYWluZGVyLiAgKi8KKyAgfSBkaXZfdDsKKworLyogUmV0dXJuZWQgYnkgYGxkaXYnLiAgKi8KKyNpZm5kZWYgX19sZGl2X3RfZGVmaW5lZAordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIGxvbmcgaW50IHF1b3Q7CQkvKiBRdW90aWVudC4gICovCisgICAgbG9uZyBpbnQgcmVtOwkJLyogUmVtYWluZGVyLiAgKi8KKyAgfSBsZGl2X3Q7CisjIGRlZmluZSBfX2xkaXZfdF9kZWZpbmVkCTEKKyNlbmRpZgorX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWYgZGVmaW5lZCBfX1VTRV9JU09DOTkgJiYgIWRlZmluZWQgX19sbGRpdl90X2RlZmluZWQKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogUmV0dXJuZWQgYnkgYGxsZGl2Jy4gICovCitfX2V4dGVuc2lvbl9fIHR5cGVkZWYgc3RydWN0CisgIHsKKyAgICBsb25nIGxvbmcgaW50IHF1b3Q7CQkvKiBRdW90aWVudC4gICovCisgICAgbG9uZyBsb25nIGludCByZW07CQkvKiBSZW1haW5kZXIuICAqLworICB9IGxsZGl2X3Q7CisjIGRlZmluZSBfX2xsZGl2X3RfZGVmaW5lZAkxCitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworCisvKiBUaGUgbGFyZ2VzdCBudW1iZXIgcmFuZCB3aWxsIHJldHVybiAoc2FtZSBhcyBJTlRfTUFYKS4gICovCisjZGVmaW5lCVJBTkRfTUFYCTIxNDc0ODM2NDcKKworCisvKiBXZSBkZWZpbmUgdGhlc2UgdGhlIHNhbWUgZm9yIGFsbCBtYWNoaW5lcy4KKyAgIENoYW5nZXMgZnJvbSB0aGlzIHRvIHRoZSBvdXRzaWRlIHdvcmxkIHNob3VsZCBiZSBkb25lIGluIGBfZXhpdCcuICAqLworI2RlZmluZQlFWElUX0ZBSUxVUkUJMQkvKiBGYWlsaW5nIGV4aXQgc3RhdHVzLiAgKi8KKyNkZWZpbmUJRVhJVF9TVUNDRVNTCTAJLyogU3VjY2Vzc2Z1bCBleGl0IHN0YXR1cy4gICovCisKKworLyogTWF4aW11bSBsZW5ndGggb2YgYSBtdWx0aWJ5dGUgY2hhcmFjdGVyIGluIHRoZSBjdXJyZW50IGxvY2FsZS4gICovCisjZGVmaW5lCU1CX0NVUl9NQVgJKF9fY3R5cGVfZ2V0X21iX2N1cl9tYXggKCkpCitleHRlcm4gc2l6ZV90IF9fY3R5cGVfZ2V0X21iX2N1cl9tYXggKHZvaWQpIF9fVEhST1cgX193dXI7CisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLiAgKi8KK2V4dGVybiBkb3VibGUgYXRvZiAoX19jb25zdCBjaGFyICpfX25wdHIpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKy8qIENvbnZlcnQgYSBzdHJpbmcgdG8gYW4gaW50ZWdlci4gICovCitleHRlcm4gaW50IGF0b2kgKF9fY29uc3QgY2hhciAqX19ucHRyKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSkgX193dXI7CisvKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgbG9uZyBpbnRlZ2VyLiAgKi8KK2V4dGVybiBsb25nIGludCBhdG9sIChfX2NvbnN0IGNoYXIgKl9fbnB0cikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpIF9fd3VyOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWYgZGVmaW5lZCBfX1VTRV9JU09DOTkgfHwgKGRlZmluZWQgX19HTElCQ19IQVZFX0xPTkdfTE9ORyAmJiBkZWZpbmVkIF9fVVNFX01JU0MpCitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBsb25nIGxvbmcgaW50ZWdlci4gICovCitfX2V4dGVuc2lvbl9fIGV4dGVybiBsb25nIGxvbmcgaW50IGF0b2xsIChfX2NvbnN0IGNoYXIgKl9fbnB0cikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpIF9fd3VyOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogQ29udmVydCBhIHN0cmluZyB0byBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4gICovCitleHRlcm4gZG91YmxlIHN0cnRvZCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJICAgICAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYJX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIExpa2V3aXNlIGZvciBgZmxvYXQnIGFuZCBgbG9uZyBkb3VibGUnIHNpemVzIG9mIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuICAqLworZXh0ZXJuIGZsb2F0IHN0cnRvZiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJICAgICBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0cikgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisKK2V4dGVybiBsb25nIGRvdWJsZSBzdHJ0b2xkIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBsb25nIGludGVnZXIuICAqLworZXh0ZXJuIGxvbmcgaW50IHN0cnRvbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCWNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKy8qIENvbnZlcnQgYSBzdHJpbmcgdG8gYW4gdW5zaWduZWQgbG9uZyBpbnRlZ2VyLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIGludCBzdHJ0b3VsIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJCSAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWYgZGVmaW5lZCBfX0dMSUJDX0hBVkVfTE9OR19MT05HICYmIGRlZmluZWQgX19VU0VfQlNECisvKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgcXVhZHdvcmQgaW50ZWdlci4gICovCitfX2V4dGVuc2lvbl9fCitleHRlcm4gbG9uZyBsb25nIGludCBzdHJ0b3EgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCQkgICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKy8qIENvbnZlcnQgYSBzdHJpbmcgdG8gYW4gdW5zaWduZWQgcXVhZHdvcmQgaW50ZWdlci4gICovCitfX2V4dGVuc2lvbl9fCitleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIGludCBzdHJ0b3VxIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJCSAgICAgICBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisjZW5kaWYgLyogR0NDIGFuZCB1c2UgQlNELiAgKi8KKworI2lmIGRlZmluZWQgX19VU0VfSVNPQzk5IHx8IChkZWZpbmVkIF9fR0xJQkNfSEFWRV9MT05HX0xPTkcgJiYgZGVmaW5lZCBfX1VTRV9NSVNDKQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgcXVhZHdvcmQgaW50ZWdlci4gICovCitfX2V4dGVuc2lvbl9fCitleHRlcm4gbG9uZyBsb25nIGludCBzdHJ0b2xsIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJICAgICAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworLyogQ29udmVydCBhIHN0cmluZyB0byBhbiB1bnNpZ25lZCBxdWFkd29yZCBpbnRlZ2VyLiAgKi8KK19fZXh0ZW5zaW9uX18KK2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHN0cnRvdWxsIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJCQljaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYgLyogSVNPIEM5OSBvciBHQ0MgYW5kIHVzZSBNSVNDLiAgKi8KKworCisjaWZkZWYgX19VU0VfR05VCisvKiBUaGUgY29uY2VwdCBvZiBvbmUgc3RhdGljIGxvY2FsZSBwZXIgY2F0ZWdvcnkgaXMgbm90IHZlcnkgd2VsbAorICAgdGhvdWdodCBvdXQuICBNYW55IGFwcGxpY2F0aW9ucyB3aWxsIG5lZWQgdG8gcHJvY2VzcyBpdHMgZGF0YSB1c2luZworICAgaW5mb3JtYXRpb24gZnJvbSBzZXZlcmFsIGRpZmZlcmVudCBsb2NhbGVzLiAgQW5vdGhlciBwcm9ibGVtIGlzCisgICB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVybmF0aW9uYWxpemF0aW9uIGhhbmRsaW5nIGluIHRoZQorICAgSVNPIEMrKyBzdGFuZGFyZCBsaWJyYXJ5LiAgVG8gc3VwcG9ydCB0aGlzIGFub3RoZXIgc2V0IG9mCisgICB0aGUgZnVuY3Rpb25zIHVzaW5nIGxvY2FsZSBkYXRhIGV4aXN0IHdoaWNoIHRha2UgYW4gYWRkaXRpb25hbAorICAgYXJndW1lbnQuCisKKyAgIEF0dGVudGlvbjogZXZlbiB0aG91Z2ggc2V2ZXJhbCAqX2wgaW50ZXJmYWNlcyBhcmUgcGFydCBvZiBQT1NJWDoyMDA4LAorICAgdGhlc2UgYXJlIG5vdC4gICovCisKKy8qIFN0cnVjdHVyZSBmb3IgcmVlbnRyYW50IGxvY2FsZSB1c2luZyBmdW5jdGlvbnMuICBUaGlzIGlzIGFuCisgICAoYWxtb3N0KSBvcGFxdWUgdHlwZSBmb3IgdGhlIHVzZXIgbGV2ZWwgcHJvZ3JhbXMuICAqLworIyBpbmNsdWRlIDx4bG9jYWxlLmg+CisKKy8qIFNwZWNpYWwgdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3aGljaCB0YWtlIHRoZSBsb2NhbGUgdG8KKyAgIHVzZSBhcyBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlci4gICovCitleHRlcm4gbG9uZyBpbnQgc3RydG9sX2wgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCQkgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlLAorCQkJICBfX2xvY2FsZV90IF9fbG9jKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDQpKSBfX3d1cjsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IHN0cnRvdWxfbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQkgICAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCisJCQkJICAgIGludCBfX2Jhc2UsIF9fbG9jYWxlX3QgX19sb2MpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgNCkpIF9fd3VyOworCitfX2V4dGVuc2lvbl9fCitleHRlcm4gbG9uZyBsb25nIGludCBzdHJ0b2xsX2wgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCQkJY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UsCisJCQkJX19sb2NhbGVfdCBfX2xvYykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCA0KSkgX193dXI7CisKK19fZXh0ZW5zaW9uX18KK2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHN0cnRvdWxsX2wgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCQkJCSAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCisJCQkJCSAgaW50IF9fYmFzZSwgX19sb2NhbGVfdCBfX2xvYykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCA0KSkgX193dXI7CisKK2V4dGVybiBkb3VibGUgc3RydG9kX2wgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCQljaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwgX19sb2NhbGVfdCBfX2xvYykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAzKSkgX193dXI7CisKK2V4dGVybiBmbG9hdCBzdHJ0b2ZfbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJICAgICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBfX2xvY2FsZV90IF9fbG9jKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDMpKSBfX3d1cjsKKworZXh0ZXJuIGxvbmcgZG91YmxlIHN0cnRvbGRfbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCSAgICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLAorCQkJICAgICAgX19sb2NhbGVfdCBfX2xvYykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAzKSkgX193dXI7CisjZW5kaWYgLyogR05VICovCisKKworI2lmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKK19fZXh0ZXJuX2lubGluZSBkb3VibGUKK19fTlRIIChhdG9mIChfX2NvbnN0IGNoYXIgKl9fbnB0cikpCit7CisgIHJldHVybiBzdHJ0b2QgKF9fbnB0ciwgKGNoYXIgKiopIE5VTEwpOworfQorX19leHRlcm5faW5saW5lIGludAorX19OVEggKGF0b2kgKF9fY29uc3QgY2hhciAqX19ucHRyKSkKK3sKKyAgcmV0dXJuIChpbnQpIHN0cnRvbCAoX19ucHRyLCAoY2hhciAqKikgTlVMTCwgMTApOworfQorX19leHRlcm5faW5saW5lIGxvbmcgaW50CitfX05USCAoYXRvbCAoX19jb25zdCBjaGFyICpfX25wdHIpKQoreworICByZXR1cm4gc3RydG9sIChfX25wdHIsIChjaGFyICoqKSBOVUxMLCAxMCk7Cit9CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyMgaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKK19fZXh0ZW5zaW9uX18gX19leHRlcm5faW5saW5lIGxvbmcgbG9uZyBpbnQKK19fTlRIIChhdG9sbCAoX19jb25zdCBjaGFyICpfX25wdHIpKQoreworICByZXR1cm4gc3RydG9sbCAoX19ucHRyLCAoY2hhciAqKikgTlVMTCwgMTApOworfQorX19FTkRfTkFNRVNQQUNFX0M5OQorIyBlbmRpZgorI2VuZGlmIC8qIE9wdGltaXppbmcgYW5kIElubGluaW5nLiAgKi8KKworCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIENvbnZlcnQgTiB0byBiYXNlIDY0IHVzaW5nIHRoZSBkaWdpdHMgIi4vMC05QS1aYS16IiwgbGVhc3Qtc2lnbmlmaWNhbnQKKyAgIGRpZ2l0IGZpcnN0LiAgUmV0dXJucyBhIHBvaW50ZXIgdG8gc3RhdGljIHN0b3JhZ2Ugb3ZlcndyaXR0ZW4gYnkgdGhlCisgICBuZXh0IGNhbGwuICAqLworZXh0ZXJuIGNoYXIgKmw2NGEgKGxvbmcgaW50IF9fbikgX19USFJPVyBfX3d1cjsKKworLyogUmVhZCBhIG51bWJlciBmcm9tIGEgc3RyaW5nIFMgaW4gYmFzZSA2NCBhcyBhYm92ZS4gICovCitleHRlcm4gbG9uZyBpbnQgYTY0bCAoX19jb25zdCBjaGFyICpfX3MpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKworI2VuZGlmCS8qIFVzZSBTVklEIHx8IGV4dGVuZGVkIFgvT3Blbi4gICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX0JTRAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4JLyogd2UgbmVlZCBpbnQzMl90Li4uICovCisKKy8qIFRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIHRoYXQgYWN0dWFsbHkgZG8gdGhpbmdzLiAgVGhlIGByYW5kb20nLCBgc3JhbmRvbScsCisgICBgaW5pdHN0YXRlJyBhbmQgYHNldHN0YXRlJyBmdW5jdGlvbnMgYXJlIHRob3NlIGZyb20gQlNEIFVuaWNlcy4KKyAgIFRoZSBgcmFuZCcgYW5kIGBzcmFuZCcgZnVuY3Rpb25zIGFyZSByZXF1aXJlZCBieSB0aGUgQU5TSSBzdGFuZGFyZC4KKyAgIFdlIHByb3ZpZGUgYm90aCBpbnRlcmZhY2VzIHRvIHRoZSBzYW1lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiAgKi8KKy8qIFJldHVybiBhIHJhbmRvbSBsb25nIGludGVnZXIgYmV0d2VlbiAwIGFuZCBSQU5EX01BWCBpbmNsdXNpdmUuICAqLworZXh0ZXJuIGxvbmcgaW50IHJhbmRvbSAodm9pZCkgX19USFJPVzsKKworLyogU2VlZCB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyLiAgKi8KK2V4dGVybiB2b2lkIHNyYW5kb20gKHVuc2lnbmVkIGludCBfX3NlZWQpIF9fVEhST1c7CisKKy8qIEluaXRpYWxpemUgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRvIHVzZSBzdGF0ZSBidWZmZXIgU1RBVEVCVUYsCisgICBvZiBsZW5ndGggU1RBVEVMRU4sIGFuZCBzZWVkIGl0IHdpdGggU0VFRC4gIE9wdGltYWwgbGVuZ3RocyBhcmUgOCwgMTYsCisgICAzMiwgNjQsIDEyOCBhbmQgMjU2LCB0aGUgYmlnZ2VyIHRoZSBiZXR0ZXI7IHZhbHVlcyBsZXNzIHRoYW4gOCB3aWxsCisgICBjYXVzZSBhbiBlcnJvciBhbmQgdmFsdWVzIGdyZWF0ZXIgdGhhbiAyNTYgd2lsbCBiZSByb3VuZGVkIGRvd24uICAqLworZXh0ZXJuIGNoYXIgKmluaXRzdGF0ZSAodW5zaWduZWQgaW50IF9fc2VlZCwgY2hhciAqX19zdGF0ZWJ1ZiwKKwkJCXNpemVfdCBfX3N0YXRlbGVuKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKworLyogU3dpdGNoIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB0byBzdGF0ZSBidWZmZXIgU1RBVEVCVUYsCisgICB3aGljaCBzaG91bGQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgYnkgYGluaXRzdGF0ZScuICAqLworZXh0ZXJuIGNoYXIgKnNldHN0YXRlIChjaGFyICpfX3N0YXRlYnVmKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworCisjIGlmZGVmIF9fVVNFX01JU0MKKy8qIFJlZW50cmFudCB2ZXJzaW9ucyBvZiB0aGUgYHJhbmRvbScgZmFtaWx5IG9mIGZ1bmN0aW9ucy4KKyAgIFRoZXNlIGZ1bmN0aW9ucyBhbGwgdXNlIHRoZSBmb2xsb3dpbmcgZGF0YSBzdHJ1Y3R1cmUgdG8gY29udGFpbgorICAgc3RhdGUsIHJhdGhlciB0aGFuIGdsb2JhbCBzdGF0ZSB2YXJpYWJsZXMuICAqLworCitzdHJ1Y3QgcmFuZG9tX2RhdGEKKyAgeworICAgIGludDMyX3QgKmZwdHI7CQkvKiBGcm9udCBwb2ludGVyLiAgKi8KKyAgICBpbnQzMl90ICpycHRyOwkJLyogUmVhciBwb2ludGVyLiAgKi8KKyAgICBpbnQzMl90ICpzdGF0ZTsJCS8qIEFycmF5IG9mIHN0YXRlIHZhbHVlcy4gICovCisgICAgaW50IHJhbmRfdHlwZTsJCS8qIFR5cGUgb2YgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuICAqLworICAgIGludCByYW5kX2RlZzsJCS8qIERlZ3JlZSBvZiByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4gICovCisgICAgaW50IHJhbmRfc2VwOwkJLyogRGlzdGFuY2UgYmV0d2VlbiBmcm9udCBhbmQgcmVhci4gICovCisgICAgaW50MzJfdCAqZW5kX3B0cjsJCS8qIFBvaW50ZXIgYmVoaW5kIHN0YXRlIHRhYmxlLiAgKi8KKyAgfTsKKworZXh0ZXJuIGludCByYW5kb21fciAoc3RydWN0IHJhbmRvbV9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmLAorCQkgICAgIGludDMyX3QgKl9fcmVzdHJpY3QgX19yZXN1bHQpIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCitleHRlcm4gaW50IHNyYW5kb21fciAodW5zaWduZWQgaW50IF9fc2VlZCwgc3RydWN0IHJhbmRvbV9kYXRhICpfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisKK2V4dGVybiBpbnQgaW5pdHN0YXRlX3IgKHVuc2lnbmVkIGludCBfX3NlZWQsIGNoYXIgKl9fcmVzdHJpY3QgX19zdGF0ZWJ1ZiwKKwkJCXNpemVfdCBfX3N0YXRlbGVuLAorCQkJc3RydWN0IHJhbmRvbV9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDQpKTsKKworZXh0ZXJuIGludCBzZXRzdGF0ZV9yIChjaGFyICpfX3Jlc3RyaWN0IF9fc3RhdGVidWYsCisJCSAgICAgICBzdHJ1Y3QgcmFuZG9tX2RhdGEgKl9fcmVzdHJpY3QgX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworIyBlbmRpZgkvKiBVc2UgbWlzYy4gICovCisjZW5kaWYJLyogVXNlIFNWSUQgfHwgZXh0ZW5kZWQgWC9PcGVuIHx8IEJTRC4gKi8KKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFJldHVybiBhIHJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgUkFORF9NQVggaW5jbHVzaXZlLiAgKi8KK2V4dGVybiBpbnQgcmFuZCAodm9pZCkgX19USFJPVzsKKy8qIFNlZWQgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHdpdGggdGhlIGdpdmVuIG51bWJlci4gICovCitleHRlcm4gdm9pZCBzcmFuZCAodW5zaWduZWQgaW50IF9fc2VlZCkgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX1BPU0lYCisvKiBSZWVudHJhbnQgaW50ZXJmYWNlIGFjY29yZGluZyB0byBQT1NJWC4xLiAgKi8KK2V4dGVybiBpbnQgcmFuZF9yICh1bnNpZ25lZCBpbnQgKl9fc2VlZCkgX19USFJPVzsKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorLyogU3lzdGVtIFYgc3R5bGUgNDgtYml0IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGZ1bmN0aW9ucy4gICovCisKKy8qIFJldHVybiBub24tbmVnYXRpdmUsIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgaW4gWzAuMCwxLjApLiAgKi8KK2V4dGVybiBkb3VibGUgZHJhbmQ0OCAodm9pZCkgX19USFJPVzsKK2V4dGVybiBkb3VibGUgZXJhbmQ0OCAodW5zaWduZWQgc2hvcnQgaW50IF9feHN1YmlbM10pIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBSZXR1cm4gbm9uLW5lZ2F0aXZlLCBsb25nIGludGVnZXIgaW4gWzAsMl4zMSkuICAqLworZXh0ZXJuIGxvbmcgaW50IGxyYW5kNDggKHZvaWQpIF9fVEhST1c7CitleHRlcm4gbG9uZyBpbnQgbnJhbmQ0OCAodW5zaWduZWQgc2hvcnQgaW50IF9feHN1YmlbM10pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBSZXR1cm4gc2lnbmVkLCBsb25nIGludGVnZXJzIGluIFstMl4zMSwyXjMxKS4gICovCitleHRlcm4gbG9uZyBpbnQgbXJhbmQ0OCAodm9pZCkgX19USFJPVzsKK2V4dGVybiBsb25nIGludCBqcmFuZDQ4ICh1bnNpZ25lZCBzaG9ydCBpbnQgX194c3ViaVszXSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFNlZWQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuICAqLworZXh0ZXJuIHZvaWQgc3JhbmQ0OCAobG9uZyBpbnQgX19zZWVkdmFsKSBfX1RIUk9XOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGludCAqc2VlZDQ4ICh1bnNpZ25lZCBzaG9ydCBpbnQgX19zZWVkMTZ2WzNdKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiB2b2lkIGxjb25nNDggKHVuc2lnbmVkIHNob3J0IGludCBfX3BhcmFtWzddKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworIyBpZmRlZiBfX1VTRV9NSVNDCisvKiBEYXRhIHN0cnVjdHVyZSBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRocmVhZCBzYWZlIHZlcnNpb25zLiAgVGhpcworICAgdHlwZSBpcyB0byBiZSByZWdhcmRlZCBhcyBvcGFxdWUuICBJdCdzIG9ubHkgZXhwb3J0ZWQgYmVjYXVzZSB1c2VycworICAgaGF2ZSB0byBhbGxvY2F0ZSBvYmplY3RzIG9mIHRoaXMgdHlwZS4gICovCitzdHJ1Y3QgZHJhbmQ0OF9kYXRhCisgIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX194WzNdOwkvKiBDdXJyZW50IHN0YXRlLiAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX19vbGRfeFszXTsgLyogT2xkIHN0YXRlLiAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX19jOwkvKiBBZGRpdGl2ZSBjb25zdC4gaW4gY29uZ3J1ZW50aWFsIGZvcm11bGEuICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX2luaXQ7CS8qIEZsYWcgZm9yIGluaXRpYWxpemluZy4gICovCisgICAgdW5zaWduZWQgbG9uZyBsb25nIGludCBfX2E7CS8qIEZhY3RvciBpbiBjb25ncnVlbnRpYWwgZm9ybXVsYS4gICovCisgIH07CisKKy8qIFJldHVybiBub24tbmVnYXRpdmUsIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgaW4gWzAuMCwxLjApLiAgKi8KK2V4dGVybiBpbnQgZHJhbmQ0OF9yIChzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmZmVyLAorCQkgICAgICBkb3VibGUgKl9fcmVzdHJpY3QgX19yZXN1bHQpIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworZXh0ZXJuIGludCBlcmFuZDQ4X3IgKHVuc2lnbmVkIHNob3J0IGludCBfX3hzdWJpWzNdLAorCQkgICAgICBzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmZmVyLAorCQkgICAgICBkb3VibGUgKl9fcmVzdHJpY3QgX19yZXN1bHQpIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBSZXR1cm4gbm9uLW5lZ2F0aXZlLCBsb25nIGludGVnZXIgaW4gWzAsMl4zMSkuICAqLworZXh0ZXJuIGludCBscmFuZDQ4X3IgKHN0cnVjdCBkcmFuZDQ4X2RhdGEgKl9fcmVzdHJpY3QgX19idWZmZXIsCisJCSAgICAgIGxvbmcgaW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKK2V4dGVybiBpbnQgbnJhbmQ0OF9yICh1bnNpZ25lZCBzaG9ydCBpbnQgX194c3ViaVszXSwKKwkJICAgICAgc3RydWN0IGRyYW5kNDhfZGF0YSAqX19yZXN0cmljdCBfX2J1ZmZlciwKKwkJICAgICAgbG9uZyBpbnQgKl9fcmVzdHJpY3QgX19yZXN1bHQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBSZXR1cm4gc2lnbmVkLCBsb25nIGludGVnZXJzIGluIFstMl4zMSwyXjMxKS4gICovCitleHRlcm4gaW50IG1yYW5kNDhfciAoc3RydWN0IGRyYW5kNDhfZGF0YSAqX19yZXN0cmljdCBfX2J1ZmZlciwKKwkJICAgICAgbG9uZyBpbnQgKl9fcmVzdHJpY3QgX19yZXN1bHQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworZXh0ZXJuIGludCBqcmFuZDQ4X3IgKHVuc2lnbmVkIHNob3J0IGludCBfX3hzdWJpWzNdLAorCQkgICAgICBzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmZmVyLAorCQkgICAgICBsb25nIGludCAqX19yZXN0cmljdCBfX3Jlc3VsdCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNlZWQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuICAqLworZXh0ZXJuIGludCBzcmFuZDQ4X3IgKGxvbmcgaW50IF9fc2VlZHZhbCwgc3RydWN0IGRyYW5kNDhfZGF0YSAqX19idWZmZXIpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworCitleHRlcm4gaW50IHNlZWQ0OF9yICh1bnNpZ25lZCBzaG9ydCBpbnQgX19zZWVkMTZ2WzNdLAorCQkgICAgIHN0cnVjdCBkcmFuZDQ4X2RhdGEgKl9fYnVmZmVyKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworZXh0ZXJuIGludCBsY29uZzQ4X3IgKHVuc2lnbmVkIHNob3J0IGludCBfX3BhcmFtWzddLAorCQkgICAgICBzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX2J1ZmZlcikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjIGVuZGlmCS8qIFVzZSBtaXNjLiAgKi8KKyNlbmRpZgkvKiBVc2UgU1ZJRCBvciBYL09wZW4uICAqLworCisjZW5kaWYgLyogZG9uJ3QganVzdCBuZWVkIG1hbGxvYyBhbmQgY2FsbG9jICovCisKKyNpZm5kZWYgX19tYWxsb2NfYW5kX2NhbGxvY19kZWZpbmVkCisjIGRlZmluZSBfX21hbGxvY19hbmRfY2FsbG9jX2RlZmluZWQKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogQWxsb2NhdGUgU0laRSBieXRlcyBvZiBtZW1vcnkuICAqLworZXh0ZXJuIHZvaWQgKm1hbGxvYyAoc2l6ZV90IF9fc2l6ZSkgX19USFJPVyBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBfX3d1cjsKKy8qIEFsbG9jYXRlIE5NRU1CIGVsZW1lbnRzIG9mIFNJWkUgYnl0ZXMgZWFjaCwgYWxsIGluaXRpYWxpemVkIHRvIDAuICAqLworZXh0ZXJuIHZvaWQgKmNhbGxvYyAoc2l6ZV90IF9fbm1lbWIsIHNpemVfdCBfX3NpemUpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfbWFsbG9jX18gX193dXI7CitfX0VORF9OQU1FU1BBQ0VfU1RECisjZW5kaWYKKworI2lmbmRlZiBfX25lZWRfbWFsbG9jX2FuZF9jYWxsb2MKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmUtYWxsb2NhdGUgdGhlIHByZXZpb3VzbHkgYWxsb2NhdGVkIGJsb2NrCisgICBpbiBQVFIsIG1ha2luZyB0aGUgbmV3IGJsb2NrIFNJWkUgYnl0ZXMgbG9uZy4gICovCisvKiBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBpcyBub3QgdXNlZCwgYmVjYXVzZSBpZiByZWFsbG9jIHJldHVybnMKKyAgIHRoZSBzYW1lIHBvaW50ZXIgdGhhdCB3YXMgcGFzc2VkIHRvIGl0LCBhbGlhc2luZyBuZWVkcyB0byBiZSBhbGxvd2VkCisgICBiZXR3ZWVuIG9iamVjdHMgcG9pbnRlZCBieSB0aGUgb2xkIGFuZCBuZXcgcG9pbnRlcnMuICAqLworZXh0ZXJuIHZvaWQgKnJlYWxsb2MgKHZvaWQgKl9fcHRyLCBzaXplX3QgX19zaXplKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3dhcm5fdW51c2VkX3Jlc3VsdF9fOworLyogRnJlZSBhIGJsb2NrIGFsbG9jYXRlZCBieSBgbWFsbG9jJywgYHJlYWxsb2MnIG9yIGBjYWxsb2MnLiAgKi8KK2V4dGVybiB2b2lkIGZyZWUgKHZvaWQgKl9fcHRyKSBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYJX19VU0VfTUlTQworLyogRnJlZSBhIGJsb2NrLiAgQW4gYWxpYXMgZm9yIGBmcmVlJy4JKFN1biBVbmljZXMpLiAgKi8KK2V4dGVybiB2b2lkIGNmcmVlICh2b2lkICpfX3B0cikgX19USFJPVzsKKyNlbmRpZiAvKiBVc2UgbWlzYy4gICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX0dOVSB8fCBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKyMgaW5jbHVkZSA8YWxsb2NhLmg+CisjZW5kaWYgLyogVXNlIEdOVSwgQlNELCBvciBtaXNjLiAgKi8KKworI2lmIChkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEICYmICFkZWZpbmVkIF9fVVNFX1hPUEVOMkspIFwKKyAgICB8fCBkZWZpbmVkIF9fVVNFX0JTRAorLyogQWxsb2NhdGUgU0laRSBieXRlcyBvbiBhIHBhZ2UgYm91bmRhcnkuICBUaGUgc3RvcmFnZSBjYW5ub3QgYmUgZnJlZWQuICAqLworZXh0ZXJuIHZvaWQgKnZhbGxvYyAoc2l6ZV90IF9fc2l6ZSkgX19USFJPVyBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBfX3d1cjsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogQWxsb2NhdGUgbWVtb3J5IG9mIFNJWkUgYnl0ZXMgd2l0aCBhbiBhbGlnbm1lbnQgb2YgQUxJR05NRU5ULiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfbWVtYWxpZ24gKHZvaWQgKipfX21lbXB0ciwgc2l6ZV90IF9fYWxpZ25tZW50LCBzaXplX3QgX19zaXplKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKyNlbmRpZgorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIEFib3J0IGV4ZWN1dGlvbiBhbmQgZ2VuZXJhdGUgYSBjb3JlLWR1bXAuICAqLworZXh0ZXJuIHZvaWQgYWJvcnQgKHZvaWQpIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworCisKKy8qIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gYGV4aXQnIGlzIGNhbGxlZC4gICovCitleHRlcm4gaW50IGF0ZXhpdCAodm9pZCAoKl9fZnVuYykgKHZvaWQpKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmZGVmIF9fVVNFX0dOVQorLy8gWFhYIFRoZXJlIHNob3VsZCBiZSBhIG1hY3JvIHRvIHNpZ25hbCB3aXRoIEMrKyByZXZpc2lvbiBpcyB1c2VkLgorLy8gWFhYIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIEMrKzF4IHJldmlzaW9uLgorLyogUmVnaXN0ZXIgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBgcXVpY2tfZXhpdCcgaXMgY2FsbGVkLiAgKi8KKyMgaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQysrIiBpbnQgYXRfcXVpY2tfZXhpdCAodm9pZCAoKl9fZnVuYykgKHZvaWQpKQorICAgICBfX1RIUk9XIF9fYXNtICgiYXRfcXVpY2tfZXhpdCIpIF9fbm9ubnVsbCAoKDEpKTsKKyMgZWxzZQorZXh0ZXJuIGludCBhdF9xdWlja19leGl0ICh2b2lkICgqX19mdW5jKSAodm9pZCkpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworIyBlbmRpZgorI2VuZGlmCitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZglfX1VTRV9NSVNDCisvKiBSZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBzdGF0dXMKKyAgIGdpdmVuIHRvIGBleGl0JyBhbmQgdGhlIGdpdmVuIGFyZ3VtZW50LiAgKi8KK2V4dGVybiBpbnQgb25fZXhpdCAodm9pZCAoKl9fZnVuYykgKGludCBfX3N0YXR1cywgdm9pZCAqX19hcmcpLCB2b2lkICpfX2FyZykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBDYWxsIGFsbCBmdW5jdGlvbnMgcmVnaXN0ZXJlZCB3aXRoIGBhdGV4aXQnIGFuZCBgb25fZXhpdCcsCisgICBpbiB0aGUgcmV2ZXJzZSBvZiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIHJlZ2lzdGVyZWQsCisgICBwZXJmb3JtIHN0ZGlvIGNsZWFudXAsIGFuZCB0ZXJtaW5hdGUgcHJvZ3JhbSBleGVjdXRpb24gd2l0aCBTVEFUVVMuICAqLworZXh0ZXJuIHZvaWQgZXhpdCAoaW50IF9fc3RhdHVzKSBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKworI2lmZGVmIF9fVVNFX0dOVQorLy8gWFhYIFRoZXJlIHNob3VsZCBiZSBhIG1hY3JvIHRvIHNpZ25hbCB3aXRoIEMrKyByZXZpc2lvbiBpcyB1c2VkLgorLy8gWFhYIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIEMrKzF4IHJldmlzaW9uLgorLyogQ2FsbCBhbGwgZnVuY3Rpb25zIHJlZ2lzdGVyZWQgd2l0aCBgYXRfcXVpY2tfZXhpdCcgaW4gdGhlIHJldmVyc2UKKyAgIG9mIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgcmVnaXN0ZXJlZCBhbmQgdGVybWluYXRlIHByb2dyYW0KKyAgIGV4ZWN1dGlvbiB3aXRoIFNUQVRVUy4gICovCitleHRlcm4gdm9pZCBxdWlja19leGl0IChpbnQgX19zdGF0dXMpIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworI2VuZGlmCitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogVGVybWluYXRlIHRoZSBwcm9ncmFtIHdpdGggU1RBVFVTIHdpdGhvdXQgY2FsbGluZyBhbnkgb2YgdGhlCisgICBmdW5jdGlvbnMgcmVnaXN0ZXJlZCB3aXRoIGBhdGV4aXQnIG9yIGBvbl9leGl0Jy4gICovCitleHRlcm4gdm9pZCBfRXhpdCAoaW50IF9fc3RhdHVzKSBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmV0dXJuIHRoZSB2YWx1ZSBvZiBlbnZhcmlhYmxlIE5BTUUsIG9yIE5VTEwgaWYgaXQgZG9lc24ndCBleGlzdC4gICovCitleHRlcm4gY2hhciAqZ2V0ZW52IChfX2NvbnN0IGNoYXIgKl9fbmFtZSkgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byB0aGUgYWJvdmUgYnV0IHJldHVybnMgTlVMTCBpZiB0aGUKKyAgIHByb2dyYW1zIGlzIHJ1bm5pbmcgd2l0aCBTVUlEIG9yIFNHSUQgZW5hYmxlZC4gICovCitleHRlcm4gY2hhciAqX19zZWN1cmVfZ2V0ZW52IChfX2NvbnN0IGNoYXIgKl9fbmFtZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorLyogVGhlIFNWSUQgc2F5cyB0aGlzIGlzIGluIDxzdGRpby5oPiwgYnV0IHRoaXMgc2VlbXMgYSBiZXR0ZXIgcGxhY2UuCSovCisvKiBQdXQgU1RSSU5HLCB3aGljaCBpcyBvZiB0aGUgZm9ybSAiTkFNRT1WQUxVRSIsIGluIHRoZSBlbnZpcm9ubWVudC4KKyAgIElmIHRoZXJlIGlzIG5vIGA9JywgcmVtb3ZlIE5BTUUgZnJvbSB0aGUgZW52aXJvbm1lbnQuICAqLworZXh0ZXJuIGludCBwdXRlbnYgKGNoYXIgKl9fc3RyaW5nKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisvKiBTZXQgTkFNRSB0byBWQUxVRSBpbiB0aGUgZW52aXJvbm1lbnQuCisgICBJZiBSRVBMQUNFIGlzIG5vbnplcm8sIG92ZXJ3cml0ZSBhbiBleGlzdGluZyB2YWx1ZS4gICovCitleHRlcm4gaW50IHNldGVudiAoX19jb25zdCBjaGFyICpfX25hbWUsIF9fY29uc3QgY2hhciAqX192YWx1ZSwgaW50IF9fcmVwbGFjZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisKKy8qIFJlbW92ZSB0aGUgdmFyaWFibGUgTkFNRSBmcm9tIHRoZSBlbnZpcm9ubWVudC4gICovCitleHRlcm4gaW50IHVuc2V0ZW52IChfX2NvbnN0IGNoYXIgKl9fbmFtZSkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworI2lmZGVmCV9fVVNFX01JU0MKKy8qIFRoZSBgY2xlYXJlbnYnIHdhcyBwbGFubmVkIHRvIGJlIGFkZGVkIHRvIFBPU0lYLjEgYnV0IHByb2JhYmx5CisgICBuZXZlciBtYWRlIGl0LiAgTmV2ZXJ0aGVsZXNzIHRoZSBQT1NJWC45IHN0YW5kYXJkIChQT1NJWCBiaW5kaW5ncworICAgZm9yIEZvcnRyYW4gNzcpIHJlcXVpcmVzIHRoaXMgZnVuY3Rpb24uICAqLworZXh0ZXJuIGludCBjbGVhcmVudiAodm9pZCkgX19USFJPVzsKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgXAorICAgIHx8IChkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEICYmICFkZWZpbmVkIF9fVVNFX1hPUEVOMkspCisvKiBHZW5lcmF0ZSBhIHVuaXF1ZSB0ZW1wb3JhcnkgZmlsZSBuYW1lIGZyb20gVEVNUExBVEUuCisgICBUaGUgbGFzdCBzaXggY2hhcmFjdGVycyBvZiBURU1QTEFURSBtdXN0IGJlICJYWFhYWFgiOworICAgdGhleSBhcmUgcmVwbGFjZWQgd2l0aCBhIHN0cmluZyB0aGF0IG1ha2VzIHRoZSBmaWxlIG5hbWUgdW5pcXVlLgorICAgUmV0dXJucyBURU1QTEFURSwgb3IgYSBudWxsIHBvaW50ZXIgaWYgaXQgY2Fubm90IGdldCBhIHVuaXF1ZSBmaWxlIG5hbWUuICAqLworZXh0ZXJuIGNoYXIgKm1rdGVtcCAoY2hhciAqX190ZW1wbGF0ZSkgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIFwKKyAgICB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisvKiBHZW5lcmF0ZSBhIHVuaXF1ZSB0ZW1wb3JhcnkgZmlsZSBuYW1lIGZyb20gVEVNUExBVEUuCisgICBUaGUgbGFzdCBzaXggY2hhcmFjdGVycyBvZiBURU1QTEFURSBtdXN0IGJlICJYWFhYWFgiOworICAgdGhleSBhcmUgcmVwbGFjZWQgd2l0aCBhIHN0cmluZyB0aGF0IG1ha2VzIHRoZSBmaWxlbmFtZSB1bmlxdWUuCisgICBSZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIG9wZW4gb24gdGhlIGZpbGUgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcsCisgICBvciAtMSBpZiBpdCBjYW5ub3QgY3JlYXRlIGEgdW5pcXVlbHktbmFtZWQgZmlsZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IG1rc3RlbXAgKGNoYXIgKl9fdGVtcGxhdGUpIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKyMgZWxzZQorIyAgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIGludCBfX1JFRElSRUNUIChta3N0ZW1wLCAoY2hhciAqX190ZW1wbGF0ZSksIG1rc3RlbXA2NCkKKyAgICAgX19ub25udWxsICgoMSkpIF9fd3VyOworIyAgZWxzZQorIyAgIGRlZmluZSBta3N0ZW1wIG1rc3RlbXA2NAorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgbWtzdGVtcDY0IChjaGFyICpfX3RlbXBsYXRlKSBfX25vbm51bGwgKCgxKSkgX193dXI7CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIFNpbWlsYXIgdG8gbWtzdGVtcCwgYnV0IHRoZSB0ZW1wbGF0ZSBjYW4gaGF2ZSBhIHN1ZmZpeCBhZnRlciB0aGUKKyAgIFhYWFhYWC4gIFRoZSBsZW5ndGggb2YgdGhlIHN1ZmZpeCBpcyBzcGVjaWZpZWQgaW4gdGhlIHNlY29uZAorICAgcGFyYW1ldGVyLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgbWtzdGVtcHMgKGNoYXIgKl9fdGVtcGxhdGUsIGludCBfX3N1ZmZpeGxlbikgX19ub25udWxsICgoMSkpIF9fd3VyOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKG1rc3RlbXBzLCAoY2hhciAqX190ZW1wbGF0ZSwgaW50IF9fc3VmZml4bGVuKSwKKwkJICAgICAgIG1rc3RlbXBzNjQpIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKyMgIGVsc2UKKyMgICBkZWZpbmUgbWtzdGVtcHMgbWtzdGVtcHM2NAorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgbWtzdGVtcHM2NCAoY2hhciAqX190ZW1wbGF0ZSwgaW50IF9fc3VmZml4bGVuKQorICAgICBfX25vbm51bGwgKCgxKSkgX193dXI7CisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKy8qIENyZWF0ZSBhIHVuaXF1ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZyb20gVEVNUExBVEUuCisgICBUaGUgbGFzdCBzaXggY2hhcmFjdGVycyBvZiBURU1QTEFURSBtdXN0IGJlICJYWFhYWFgiOworICAgdGhleSBhcmUgcmVwbGFjZWQgd2l0aCBhIHN0cmluZyB0aGF0IG1ha2VzIHRoZSBkaXJlY3RvcnkgbmFtZSB1bmlxdWUuCisgICBSZXR1cm5zIFRFTVBMQVRFLCBvciBhIG51bGwgcG9pbnRlciBpZiBpdCBjYW5ub3QgZ2V0IGEgdW5pcXVlIG5hbWUuCisgICBUaGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQgbW9kZSA3MDAuICAqLworZXh0ZXJuIGNoYXIgKm1rZHRlbXAgKGNoYXIgKl9fdGVtcGxhdGUpIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIEdlbmVyYXRlIGEgdW5pcXVlIHRlbXBvcmFyeSBmaWxlIG5hbWUgZnJvbSBURU1QTEFURSBzaW1pbGFyIHRvCisgICBta3N0ZW1wLiAgQnV0IGFsbG93IHRoZSBjYWxsZXIgdG8gcGFzcyBhZGRpdGlvbmFsIGZsYWdzIHdoaWNoIGFyZQorICAgdXNlZCBpbiB0aGUgb3BlbiBjYWxsIHRvIGNyZWF0ZSB0aGUgZmlsZS4uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBta29zdGVtcCAoY2hhciAqX190ZW1wbGF0ZSwgaW50IF9fZmxhZ3MpIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKyMgZWxzZQorIyAgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIGludCBfX1JFRElSRUNUIChta29zdGVtcCwgKGNoYXIgKl9fdGVtcGxhdGUsIGludCBfX2ZsYWdzKSwgbWtvc3RlbXA2NCkKKyAgICAgX19ub25udWxsICgoMSkpIF9fd3VyOworIyAgZWxzZQorIyAgIGRlZmluZSBta29zdGVtcCBta29zdGVtcDY0CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBta29zdGVtcDY0IChjaGFyICpfX3RlbXBsYXRlLCBpbnQgX19mbGFncykgX19ub25udWxsICgoMSkpIF9fd3VyOworIyBlbmRpZgorCisvKiBTaW1pbGFyIHRvIG1rb3N0ZW1wLCBidXQgdGhlIHRlbXBsYXRlIGNhbiBoYXZlIGEgc3VmZml4IGFmdGVyIHRoZQorICAgWFhYWFhYLiAgVGhlIGxlbmd0aCBvZiB0aGUgc3VmZml4IGlzIHNwZWNpZmllZCBpbiB0aGUgc2Vjb25kCisgICBwYXJhbWV0ZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBta29zdGVtcHMgKGNoYXIgKl9fdGVtcGxhdGUsIGludCBfX3N1ZmZpeGxlbiwgaW50IF9fZmxhZ3MpCisgICAgIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKyMgZWxzZQorIyAgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIGludCBfX1JFRElSRUNUIChta29zdGVtcHMsIChjaGFyICpfX3RlbXBsYXRlLCBpbnQgX19zdWZmaXhsZW4sCisJCQkJICAgaW50IF9fZmxhZ3MpLCBta29zdGVtcHM2NCkKKyAgICAgX19ub25udWxsICgoMSkpIF9fd3VyOworIyAgZWxzZQorIyAgIGRlZmluZSBta29zdGVtcHMgbWtvc3RlbXBzNjQKKyMgIGVuZGlmCisjIGVuZGlmCisjIGlmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IG1rb3N0ZW1wczY0IChjaGFyICpfX3RlbXBsYXRlLCBpbnQgX19zdWZmaXhsZW4sIGludCBfX2ZsYWdzKQorICAgICBfX25vbm51bGwgKCgxKSkgX193dXI7CisjIGVuZGlmCisjZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIEV4ZWN1dGUgdGhlIGdpdmVuIGxpbmUgYXMgYSBzaGVsbCBjb21tYW5kLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgc3lzdGVtIChfX2NvbnN0IGNoYXIgKl9fY29tbWFuZCkgX193dXI7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKworI2lmZGVmCV9fVVNFX0dOVQorLyogUmV0dXJuIGEgbWFsbG9jJ2Qgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNhbm9uaWNhbCBhYnNvbHV0ZSBuYW1lIG9mIHRoZQorICAgZXhpc3RpbmcgbmFtZWQgZmlsZS4gICovCitleHRlcm4gY2hhciAqY2Fub25pY2FsaXplX2ZpbGVfbmFtZSAoX19jb25zdCBjaGFyICpfX25hbWUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBSZXR1cm4gdGhlIGNhbm9uaWNhbCBhYnNvbHV0ZSBuYW1lIG9mIGZpbGUgTkFNRS4gIElmIFJFU09MVkVEIGlzCisgICBudWxsLCB0aGUgcmVzdWx0IGlzIG1hbGxvYydkOyBvdGhlcndpc2UsIGlmIHRoZSBjYW5vbmljYWwgbmFtZSBpcworICAgUEFUSF9NQVggY2hhcnMgb3IgbW9yZSwgcmV0dXJucyBudWxsIHdpdGggYGVycm5vJyBzZXQgdG8KKyAgIEVOQU1FVE9PTE9ORzsgaWYgdGhlIG5hbWUgZml0cyBpbiBmZXdlciB0aGFuIFBBVEhfTUFYIGNoYXJzLAorICAgcmV0dXJucyB0aGUgbmFtZSBpbiBSRVNPTFZFRC4gICovCitleHRlcm4gY2hhciAqcmVhbHBhdGggKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCSAgICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fcmVzb2x2ZWQpIF9fVEhST1cgX193dXI7CisjZW5kaWYKKworCisvKiBTaG9ydGhhbmQgZm9yIHR5cGUgb2YgY29tcGFyaXNvbiBmdW5jdGlvbnMuICAqLworI2lmbmRlZiBfX0NPTVBBUl9GTl9UCisjIGRlZmluZSBfX0NPTVBBUl9GTl9UCit0eXBlZGVmIGludCAoKl9fY29tcGFyX2ZuX3QpIChfX2NvbnN0IHZvaWQgKiwgX19jb25zdCB2b2lkICopOworCisjIGlmZGVmCV9fVVNFX0dOVQordHlwZWRlZiBfX2NvbXBhcl9mbl90IGNvbXBhcmlzb25fZm5fdDsKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIF9fVVNFX0dOVQordHlwZWRlZiBpbnQgKCpfX2NvbXBhcl9kX2ZuX3QpIChfX2NvbnN0IHZvaWQgKiwgX19jb25zdCB2b2lkICosIHZvaWQgKik7CisjZW5kaWYKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBEbyBhIGJpbmFyeSBzZWFyY2ggZm9yIEtFWSBpbiBCQVNFLCB3aGljaCBjb25zaXN0cyBvZiBOTUVNQiBlbGVtZW50cworICAgb2YgU0laRSBieXRlcyBlYWNoLCB1c2luZyBDT01QQVIgdG8gcGVyZm9ybSB0aGUgY29tcGFyaXNvbnMuICAqLworZXh0ZXJuIHZvaWQgKmJzZWFyY2ggKF9fY29uc3Qgdm9pZCAqX19rZXksIF9fY29uc3Qgdm9pZCAqX19iYXNlLAorCQkgICAgICBzaXplX3QgX19ubWVtYiwgc2l6ZV90IF9fc2l6ZSwgX19jb21wYXJfZm5fdCBfX2NvbXBhcikKKyAgICAgX19ub25udWxsICgoMSwgMiwgNSkpIF9fd3VyOworCisvKiBTb3J0IE5NRU1CIGVsZW1lbnRzIG9mIEJBU0UsIG9mIFNJWkUgYnl0ZXMgZWFjaCwKKyAgIHVzaW5nIENPTVBBUiB0byBwZXJmb3JtIHRoZSBjb21wYXJpc29ucy4gICovCitleHRlcm4gdm9pZCBxc29ydCAodm9pZCAqX19iYXNlLCBzaXplX3QgX19ubWVtYiwgc2l6ZV90IF9fc2l6ZSwKKwkJICAgX19jb21wYXJfZm5fdCBfX2NvbXBhcikgX19ub25udWxsICgoMSwgNCkpOworI2lmZGVmIF9fVVNFX0dOVQorZXh0ZXJuIHZvaWQgcXNvcnRfciAodm9pZCAqX19iYXNlLCBzaXplX3QgX19ubWVtYiwgc2l6ZV90IF9fc2l6ZSwKKwkJICAgICBfX2NvbXBhcl9kX2ZuX3QgX19jb21wYXIsIHZvaWQgKl9fYXJnKQorICBfX25vbm51bGwgKCgxLCA0KSk7CisjZW5kaWYKKworCisvKiBSZXR1cm4gdGhlIGFic29sdXRlIHZhbHVlIG9mIFguICAqLworZXh0ZXJuIGludCBhYnMgKGludCBfX3gpIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpIF9fd3VyOworZXh0ZXJuIGxvbmcgaW50IGxhYnMgKGxvbmcgaW50IF9feCkgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSkgX193dXI7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9JU09DOTkKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIGxvbmcgbG9uZyBpbnQgbGxhYnMgKGxvbmcgbG9uZyBpbnQgX194KQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKSBfX3d1cjsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmV0dXJuIHRoZSBgZGl2X3QnLCBgbGRpdl90JyBvciBgbGxkaXZfdCcgcmVwcmVzZW50YXRpb24KKyAgIG9mIHRoZSB2YWx1ZSBvZiBOVU1FUiBvdmVyIERFTk9NLiAqLworLyogR0NDIG1heSBoYXZlIGJ1aWx0LWlucyBmb3IgdGhlc2Ugc29tZWRheS4gICovCitleHRlcm4gZGl2X3QgZGl2IChpbnQgX19udW1lciwgaW50IF9fZGVub20pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpIF9fd3VyOworZXh0ZXJuIGxkaXZfdCBsZGl2IChsb25nIGludCBfX251bWVyLCBsb25nIGludCBfX2Rlbm9tKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKSBfX3d1cjsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CitfX2V4dGVuc2lvbl9fIGV4dGVybiBsbGRpdl90IGxsZGl2IChsb25nIGxvbmcgaW50IF9fbnVtZXIsCisJCQkJICAgIGxvbmcgbG9uZyBpbnQgX19kZW5vbSkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSkgX193dXI7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworCisjaWYgKGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgJiYgIWRlZmluZWQgX19VU0VfWE9QRU4ySykgXAorICAgIHx8IGRlZmluZWQgX19VU0VfU1ZJRAorLyogQ29udmVydCBmbG9hdGluZyBwb2ludCBudW1iZXJzIHRvIHN0cmluZ3MuICBUaGUgcmV0dXJuZWQgdmFsdWVzIGFyZQorICAgdmFsaWQgb25seSB1bnRpbCBhbm90aGVyIGNhbGwgdG8gdGhlIHNhbWUgZnVuY3Rpb24uICAqLworCisvKiBDb252ZXJ0IFZBTFVFIHRvIGEgc3RyaW5nIHdpdGggTkRJR0lUIGRpZ2l0cyBhbmQgcmV0dXJuIGEgcG9pbnRlciB0bworICAgdGhpcy4gIFNldCAqREVDUFQgd2l0aCB0aGUgcG9zaXRpb24gb2YgdGhlIGRlY2ltYWwgY2hhcmFjdGVyIGFuZCAqU0lHTgorICAgd2l0aCB0aGUgc2lnbiBvZiB0aGUgbnVtYmVyLiAgKi8KK2V4dGVybiBjaGFyICplY3Z0IChkb3VibGUgX192YWx1ZSwgaW50IF9fbmRpZ2l0LCBpbnQgKl9fcmVzdHJpY3QgX19kZWNwdCwKKwkJICAgaW50ICpfX3Jlc3RyaWN0IF9fc2lnbikgX19USFJPVyBfX25vbm51bGwgKCgzLCA0KSkgX193dXI7CisKKy8qIENvbnZlcnQgVkFMVUUgdG8gYSBzdHJpbmcgcm91bmRlZCB0byBORElHSVQgZGVjaW1hbCBkaWdpdHMuICBTZXQgKkRFQ1BUCisgICB3aXRoIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVjaW1hbCBjaGFyYWN0ZXIgYW5kICpTSUdOIHdpdGggdGhlIHNpZ24gb2YKKyAgIHRoZSBudW1iZXIuICAqLworZXh0ZXJuIGNoYXIgKmZjdnQgKGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsIGludCAqX19yZXN0cmljdCBfX2RlY3B0LAorCQkgICBpbnQgKl9fcmVzdHJpY3QgX19zaWduKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDMsIDQpKSBfX3d1cjsKKworLyogSWYgcG9zc2libGUgY29udmVydCBWQUxVRSB0byBhIHN0cmluZyB3aXRoIE5ESUdJVCBzaWduaWZpY2FudCBkaWdpdHMuCisgICBPdGhlcndpc2UgdXNlIGV4cG9uZW50aWFsIHJlcHJlc2VudGF0aW9uLiAgVGhlIHJlc3VsdGluZyBzdHJpbmcgd2lsbAorICAgYmUgd3JpdHRlbiB0byBCVUYuICAqLworZXh0ZXJuIGNoYXIgKmdjdnQgKGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsIGNoYXIgKl9fYnVmKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDMpKSBfX3d1cjsKKworCisjIGlmZGVmIF9fVVNFX01JU0MKKy8qIExvbmcgZG91YmxlIHZlcnNpb25zIG9mIGFib3ZlIGZ1bmN0aW9ucy4gICovCitleHRlcm4gY2hhciAqcWVjdnQgKGxvbmcgZG91YmxlIF9fdmFsdWUsIGludCBfX25kaWdpdCwKKwkJICAgIGludCAqX19yZXN0cmljdCBfX2RlY3B0LCBpbnQgKl9fcmVzdHJpY3QgX19zaWduKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDMsIDQpKSBfX3d1cjsKK2V4dGVybiBjaGFyICpxZmN2dCAobG9uZyBkb3VibGUgX192YWx1ZSwgaW50IF9fbmRpZ2l0LAorCQkgICAgaW50ICpfX3Jlc3RyaWN0IF9fZGVjcHQsIGludCAqX19yZXN0cmljdCBfX3NpZ24pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMywgNCkpIF9fd3VyOworZXh0ZXJuIGNoYXIgKnFnY3Z0IChsb25nIGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsIGNoYXIgKl9fYnVmKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDMpKSBfX3d1cjsKKworCisvKiBSZWVudHJhbnQgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlIHdoaWNoIHByb3ZpZGUgdGhlaXIgb3duCisgICBidWZmZXJzLiAgKi8KK2V4dGVybiBpbnQgZWN2dF9yIChkb3VibGUgX192YWx1ZSwgaW50IF9fbmRpZ2l0LCBpbnQgKl9fcmVzdHJpY3QgX19kZWNwdCwKKwkJICAgaW50ICpfX3Jlc3RyaWN0IF9fc2lnbiwgY2hhciAqX19yZXN0cmljdCBfX2J1ZiwKKwkJICAgc2l6ZV90IF9fbGVuKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDMsIDQsIDUpKTsKK2V4dGVybiBpbnQgZmN2dF9yIChkb3VibGUgX192YWx1ZSwgaW50IF9fbmRpZ2l0LCBpbnQgKl9fcmVzdHJpY3QgX19kZWNwdCwKKwkJICAgaW50ICpfX3Jlc3RyaWN0IF9fc2lnbiwgY2hhciAqX19yZXN0cmljdCBfX2J1ZiwKKwkJICAgc2l6ZV90IF9fbGVuKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDMsIDQsIDUpKTsKKworZXh0ZXJuIGludCBxZWN2dF9yIChsb25nIGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsCisJCSAgICBpbnQgKl9fcmVzdHJpY3QgX19kZWNwdCwgaW50ICpfX3Jlc3RyaWN0IF9fc2lnbiwKKwkJICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2xlbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgzLCA0LCA1KSk7CitleHRlcm4gaW50IHFmY3Z0X3IgKGxvbmcgZG91YmxlIF9fdmFsdWUsIGludCBfX25kaWdpdCwKKwkJICAgIGludCAqX19yZXN0cmljdCBfX2RlY3B0LCBpbnQgKl9fcmVzdHJpY3QgX19zaWduLAorCQkgICAgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbGVuKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDMsIDQsIDUpKTsKKyMgZW5kaWYJLyogbWlzYyAqLworI2VuZGlmCS8qIHVzZSBNSVNDIHx8IHVzZSBYL09wZW4gVW5peCAqLworCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIG11bHRpYnl0ZSBjaGFyYWN0ZXIKKyAgIGluIFMsIHdoaWNoIGlzIG5vIGxvbmdlciB0aGFuIE4uICAqLworZXh0ZXJuIGludCBtYmxlbiAoX19jb25zdCBjaGFyICpfX3MsIHNpemVfdCBfX24pIF9fVEhST1cgX193dXI7CisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gbXVsdGlieXRlIGNoYXJhY3RlciwKKyAgIHB1dHRpbmcgaXRzIGB3Y2hhcl90JyByZXByZXNlbnRhdGlvbiBpbiAqUFdDLiAgKi8KK2V4dGVybiBpbnQgbWJ0b3djICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcHdjLAorCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uKSBfX1RIUk9XIF9fd3VyOworLyogUHV0IHRoZSBtdWx0aWJ5dGUgY2hhcmFjdGVyIHJlcHJlc2VudGVkCisgICBieSBXQ0hBUiBpbiBTLCByZXR1cm5pbmcgaXRzIGxlbmd0aC4gICovCitleHRlcm4gaW50IHdjdG9tYiAoY2hhciAqX19zLCB3Y2hhcl90IF9fd2NoYXIpIF9fVEhST1cgX193dXI7CisKKworLyogQ29udmVydCBhIG11bHRpYnl0ZSBzdHJpbmcgdG8gYSB3aWRlIGNoYXIgc3RyaW5nLiAgKi8KK2V4dGVybiBzaXplX3QgbWJzdG93Y3MgKHdjaGFyX3QgKl9fcmVzdHJpY3QgIF9fcHdjcywKKwkJCV9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24pIF9fVEhST1c7CisvKiBDb252ZXJ0IGEgd2lkZSBjaGFyIHN0cmluZyB0byBtdWx0aWJ5dGUgc3RyaW5nLiAgKi8KK2V4dGVybiBzaXplX3Qgd2NzdG9tYnMgKGNoYXIgKl9fcmVzdHJpY3QgX19zLAorCQkJX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcHdjcywgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworCisjaWZkZWYgX19VU0VfU1ZJRAorLyogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHN0cmluZyB2YWx1ZSBvZiBSRVNQT05TRSBtYXRjaGVzIHRoZSBhZmZpcm1hdGlvbgorICAgb3IgbmVnYXRpdmUgcmVzcG9uc2UgZXhwcmVzc2lvbiBhcyBzcGVjaWZpZWQgYnkgdGhlIExDX01FU1NBR0VTIGNhdGVnb3J5CisgICBpbiB0aGUgcHJvZ3JhbSdzIGN1cnJlbnQgbG9jYWxlLiAgUmV0dXJucyAxIGlmIGFmZmlybWF0aXZlLCAwIGlmCisgICBuZWdhdGl2ZSwgYW5kIC0xIGlmIG5vdCBtYXRjaGluZy4gICovCitleHRlcm4gaW50IHJwbWF0Y2ggKF9fY29uc3QgY2hhciAqX19yZXNwb25zZSkgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisvKiBQYXJzZSBjb21tYSBzZXBhcmF0ZWQgc3Vib3B0aW9uIGZyb20gKk9QVElPTlAgYW5kIG1hdGNoIGFnYWluc3QKKyAgIHN0cmluZ3MgaW4gVE9LRU5TLiAgSWYgZm91bmQgcmV0dXJuIGluZGV4IGFuZCBzZXQgKlZBTFVFUCB0bworICAgb3B0aW9uYWwgdmFsdWUgaW50cm9kdWNlZCBieSBhbiBlcXVhbCBzaWduLiAgSWYgdGhlIHN1Ym9wdGlvbiBpcworICAgbm90IHBhcnQgb2YgVE9LRU5TIHJldHVybiBpbiAqVkFMVUVQIGJlZ2lubmluZyBvZiB1bmtub3duCisgICBzdWJvcHRpb24uICBPbiBleGl0ICpPUFRJT05QIGlzIHNldCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0CisgICB0b2tlbiBvciBhdCB0aGUgdGVybWluYXRpbmcgTlVMIGNoYXJhY3Rlci4gICovCitleHRlcm4gaW50IGdldHN1Ym9wdCAoY2hhciAqKl9fcmVzdHJpY3QgX19vcHRpb25wLAorCQkgICAgICBjaGFyICpfX2NvbnN0ICpfX3Jlc3RyaWN0IF9fdG9rZW5zLAorCQkgICAgICBjaGFyICoqX19yZXN0cmljdCBfX3ZhbHVlcCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyLCAzKSkgX193dXI7CisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfWE9QRU4KKy8qIFNldHVwIERFUyB0YWJsZXMgYWNjb3JkaW5nIEtFWS4gICovCitleHRlcm4gdm9pZCBzZXRrZXkgKF9fY29uc3QgY2hhciAqX19rZXkpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKworLyogWC9PcGVuIHBzZXVkbyB0ZXJtaW5hbCBoYW5kbGluZy4gICovCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLWFNJCisvKiBSZXR1cm4gYSBtYXN0ZXIgcHNldWRvLXRlcm1pbmFsIGhhbmRsZS4gICovCitleHRlcm4gaW50IHBvc2l4X29wZW5wdCAoaW50IF9fb2ZsYWcpIF9fd3VyOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9YT1BFTgorLyogVGhlIG5leHQgZm91ciBmdW5jdGlvbnMgYWxsIHRha2UgYSBtYXN0ZXIgcHNldWRvLXR0eSBmZCBhbmQKKyAgIHBlcmZvcm0gYW4gb3BlcmF0aW9uIG9uIHRoZSBhc3NvY2lhdGVkIHNsYXZlOiAgKi8KKworLyogQ2hvd24gdGhlIHNsYXZlIHRvIHRoZSBjYWxsaW5nIHVzZXIuICAqLworZXh0ZXJuIGludCBncmFudHB0IChpbnQgX19mZCkgX19USFJPVzsKKworLyogUmVsZWFzZSBhbiBpbnRlcm5hbCBsb2NrIHNvIHRoZSBzbGF2ZSBjYW4gYmUgb3BlbmVkLgorICAgQ2FsbCBhZnRlciBncmFudHB0KCkuICAqLworZXh0ZXJuIGludCB1bmxvY2twdCAoaW50IF9fZmQpIF9fVEhST1c7CisKKy8qIFJldHVybiB0aGUgcGF0aG5hbWUgb2YgdGhlIHBzZXVkbyB0ZXJtaW5hbCBzbGF2ZSBhc3NvaWNhdGVkIHdpdGgKKyAgIHRoZSBtYXN0ZXIgRkQgaXMgb3BlbiBvbiwgb3IgTlVMTCBvbiBlcnJvcnMuCisgICBUaGUgcmV0dXJuZWQgc3RvcmFnZSBpcyBnb29kIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4gICovCitleHRlcm4gY2hhciAqcHRzbmFtZSAoaW50IF9fZmQpIF9fVEhST1cgX193dXI7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogU3RvcmUgYXQgbW9zdCBCVUZMRU4gY2hhcmFjdGVycyBvZiB0aGUgcGF0aG5hbWUgb2YgdGhlIHNsYXZlIHBzZXVkbworICAgdGVybWluYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYXN0ZXIgRkQgaXMgb3BlbiBvbiBpbiBCVUYuCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyLiAgKi8KK2V4dGVybiBpbnQgcHRzbmFtZV9yIChpbnQgX19mZCwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisKKy8qIE9wZW4gYSBtYXN0ZXIgcHNldWRvIHRlcm1pbmFsIGFuZCByZXR1cm4gaXRzIGZpbGUgZGVzY3JpcHRvci4gICovCitleHRlcm4gaW50IGdldHB0ICh2b2lkKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfQlNECisvKiBQdXQgdGhlIDEgbWludXRlLCA1IG1pbnV0ZSBhbmQgMTUgbWludXRlIGxvYWQgYXZlcmFnZXMgaW50byB0aGUgZmlyc3QKKyAgIE5FTEVNIGVsZW1lbnRzIG9mIExPQURBVkcuICBSZXR1cm4gdGhlIG51bWJlciB3cml0dGVuIChuZXZlciBtb3JlIHRoYW4KKyAgIHRocmVlLCBidXQgbWF5IGJlIGxlc3MgdGhhbiBORUxFTSksIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycmVkLiAgKi8KK2V4dGVybiBpbnQgZ2V0bG9hZGF2ZyAoZG91YmxlIF9fbG9hZGF2Z1tdLCBpbnQgX19uZWxlbSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworCisvKiBEZWZpbmUgc29tZSBtYWNyb3MgaGVscGluZyB0byBjYXRjaCBidWZmZXIgb3ZlcmZsb3dzLiAgKi8KKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUKKyMgaW5jbHVkZSA8Yml0cy9zdGRsaWIuaD4KKyNlbmRpZgorI2lmZGVmIF9fTERCTF9DT01QQVQKKyMgaW5jbHVkZSA8Yml0cy9zdGRsaWItbGRibC5oPgorI2VuZGlmCisKKyNlbmRpZiAvKiBkb24ndCBqdXN0IG5lZWQgbWFsbG9jIGFuZCBjYWxsb2MgKi8KKyN1bmRlZiBfX25lZWRfbWFsbG9jX2FuZF9jYWxsb2MKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN0ZGxpYi5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zdHJpbmcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg4NDAyMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RyaW5nLmgKQEAgLTAsMCArMSw2NDggQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0xOTkzLDE5OTUtMjAwNCwyMDA3LDIwMDksMjAxMAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglJU08gQzk5IFN0YW5kYXJkOiA3LjIxIFN0cmluZyBoYW5kbGluZwk8c3RyaW5nLmg+CisgKi8KKworI2lmbmRlZglfU1RSSU5HX0gKKyNkZWZpbmUJX1NUUklOR19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogR2V0IHNpemVfdCBhbmQgTlVMTCBmcm9tIDxzdGRkZWYuaD4uICAqLworI2RlZmluZQlfX25lZWRfc2l6ZV90CisjZGVmaW5lCV9fbmVlZF9OVUxMCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIFRlbGwgdGhlIGNhbGxlciB0aGF0IHdlIHByb3ZpZGUgY29ycmVjdCBDKysgcHJvdG90eXBlcy4gICovCisjaWYgZGVmaW5lZCBfX2NwbHVzcGx1cyAmJiBfX0dOVUNfUFJFUkVRICg0LCA0KQorIyBkZWZpbmUgX19DT1JSRUNUX0lTT19DUFBfU1RSSU5HX0hfUFJPVE8KKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogQ29weSBOIGJ5dGVzIG9mIFNSQyB0byBERVNULiAgKi8KK2V4dGVybiB2b2lkICptZW1jcHkgKHZvaWQgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkgICAgIF9fY29uc3Qgdm9pZCAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisvKiBDb3B5IE4gYnl0ZXMgb2YgU1JDIHRvIERFU1QsIGd1YXJhbnRlZWluZworICAgY29ycmVjdCBiZWhhdmlvciBmb3Igb3ZlcmxhcHBpbmcgc3RyaW5ncy4gICovCitleHRlcm4gdm9pZCAqbWVtbW92ZSAodm9pZCAqX19kZXN0LCBfX2NvbnN0IHZvaWQgKl9fc3JjLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworLyogQ29weSBubyBtb3JlIHRoYW4gTiBieXRlcyBvZiBTUkMgdG8gREVTVCwgc3RvcHBpbmcgd2hlbiBDIGlzIGZvdW5kLgorICAgUmV0dXJuIHRoZSBwb3NpdGlvbiBpbiBERVNUIG9uZSBieXRlIHBhc3Qgd2hlcmUgQyB3YXMgY29waWVkLAorICAgb3IgTlVMTCBpZiBDIHdhcyBub3QgZm91bmQgaW4gdGhlIGZpcnN0IE4gYnl0ZXMgb2YgU1JDLiAgKi8KKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorZXh0ZXJuIHZvaWQgKm1lbWNjcHkgKHZvaWQgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IHZvaWQgKl9fcmVzdHJpY3QgX19zcmMsCisJCSAgICAgIGludCBfX2MsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworI2VuZGlmIC8qIFNWSUQuICAqLworCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogU2V0IE4gYnl0ZXMgb2YgUyB0byBDLiAgKi8KK2V4dGVybiB2b2lkICptZW1zZXQgKHZvaWQgKl9fcywgaW50IF9fYywgc2l6ZV90IF9fbikgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIENvbXBhcmUgTiBieXRlcyBvZiBTMSBhbmQgUzIuICAqLworZXh0ZXJuIGludCBtZW1jbXAgKF9fY29uc3Qgdm9pZCAqX19zMSwgX19jb25zdCB2b2lkICpfX3MyLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNlYXJjaCBOIGJ5dGVzIG9mIFMgZm9yIEMuICAqLworI2lmZGVmIF9fQ09SUkVDVF9JU09fQ1BQX1NUUklOR19IX1BST1RPCitleHRlcm4gIkMrKyIKK3sKK2V4dGVybiB2b2lkICptZW1jaHIgKHZvaWQgKl9fcywgaW50IF9fYywgc2l6ZV90IF9fbikKKyAgICAgIF9fVEhST1cgX19hc20gKCJtZW1jaHIiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworZXh0ZXJuIF9fY29uc3Qgdm9pZCAqbWVtY2hyIChfX2NvbnN0IHZvaWQgKl9fcywgaW50IF9fYywgc2l6ZV90IF9fbikKKyAgICAgIF9fVEhST1cgX19hc20gKCJtZW1jaHIiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworCisjIGlmZGVmIF9fT1BUSU1JWkVfXworX19leHRlcm5fYWx3YXlzX2lubGluZSB2b2lkICoKK21lbWNociAodm9pZCAqX19zLCBpbnQgX19jLCBzaXplX3QgX19uKSBfX1RIUk9XCit7CisgIHJldHVybiBfX2J1aWx0aW5fbWVtY2hyIChfX3MsIF9fYywgX19uKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX2NvbnN0IHZvaWQgKgorbWVtY2hyIChfX2NvbnN0IHZvaWQgKl9fcywgaW50IF9fYywgc2l6ZV90IF9fbikgX19USFJPVworeworICByZXR1cm4gX19idWlsdGluX21lbWNociAoX19zLCBfX2MsIF9fbik7Cit9CisjIGVuZGlmCit9CisjZWxzZQorZXh0ZXJuIHZvaWQgKm1lbWNociAoX19jb25zdCB2b2lkICpfX3MsIGludCBfX2MsIHNpemVfdCBfX24pCisgICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX0dOVQorLyogU2VhcmNoIGluIFMgZm9yIEMuICBUaGlzIGlzIHNpbWlsYXIgdG8gYG1lbWNocicgYnV0IHRoZXJlIGlzIG5vCisgICBsZW5ndGggbGltaXQuICAqLworIyBpZmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9TVFJJTkdfSF9QUk9UTworZXh0ZXJuICJDKysiIHZvaWQgKnJhd21lbWNociAodm9pZCAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXNtICgicmF3bWVtY2hyIikgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiAiQysrIiBfX2NvbnN0IHZvaWQgKnJhd21lbWNociAoX19jb25zdCB2b2lkICpfX3MsIGludCBfX2MpCisgICAgIF9fVEhST1cgX19hc20gKCJyYXdtZW1jaHIiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworIyBlbHNlCitleHRlcm4gdm9pZCAqcmF3bWVtY2hyIChfX2NvbnN0IHZvaWQgKl9fcywgaW50IF9fYykKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworIyBlbmRpZgorCisvKiBTZWFyY2ggTiBieXRlcyBvZiBTIGZvciB0aGUgZmluYWwgb2NjdXJyZW5jZSBvZiBDLiAgKi8KKyMgaWZkZWYgX19DT1JSRUNUX0lTT19DUFBfU1RSSU5HX0hfUFJPVE8KK2V4dGVybiAiQysrIiB2b2lkICptZW1yY2hyICh2b2lkICpfX3MsIGludCBfX2MsIHNpemVfdCBfX24pCisgICAgICBfX1RIUk9XIF9fYXNtICgibWVtcmNociIpIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gIkMrKyIgX19jb25zdCB2b2lkICptZW1yY2hyIChfX2NvbnN0IHZvaWQgKl9fcywgaW50IF9fYywgc2l6ZV90IF9fbikKKyAgICAgIF9fVEhST1cgX19hc20gKCJtZW1yY2hyIikgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKKyMgZWxzZQorZXh0ZXJuIHZvaWQgKm1lbXJjaHIgKF9fY29uc3Qgdm9pZCAqX19zLCBpbnQgX19jLCBzaXplX3QgX19uKQorICAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworIyBlbmRpZgorI2VuZGlmCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBDb3B5IFNSQyB0byBERVNULiAgKi8KK2V4dGVybiBjaGFyICpzdHJjcHkgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworLyogQ29weSBubyBtb3JlIHRoYW4gTiBjaGFyYWN0ZXJzIG9mIFNSQyB0byBERVNULiAgKi8KK2V4dGVybiBjaGFyICpzdHJuY3B5IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogQXBwZW5kIFNSQyBvbnRvIERFU1QuICAqLworZXh0ZXJuIGNoYXIgKnN0cmNhdCAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisvKiBBcHBlbmQgbm8gbW9yZSB0aGFuIE4gY2hhcmFjdGVycyBmcm9tIFNSQyBvbnRvIERFU1QuICAqLworZXh0ZXJuIGNoYXIgKnN0cm5jYXQgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMsCisJCSAgICAgIHNpemVfdCBfX24pIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBDb21wYXJlIFMxIGFuZCBTMi4gICovCitleHRlcm4gaW50IHN0cmNtcCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKy8qIENvbXBhcmUgTiBjaGFyYWN0ZXJzIG9mIFMxIGFuZCBTMi4gICovCitleHRlcm4gaW50IHN0cm5jbXAgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIENvbXBhcmUgdGhlIGNvbGxhdGVkIGZvcm1zIG9mIFMxIGFuZCBTMi4gICovCitleHRlcm4gaW50IHN0cmNvbGwgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyKSk7CisvKiBQdXQgYSB0cmFuc2Zvcm1hdGlvbiBvZiBTUkMgaW50byBubyBtb3JlIHRoYW4gTiBieXRlcyBvZiBERVNULiAgKi8KK2V4dGVybiBzaXplX3Qgc3RyeGZybSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsCisJCSAgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYgX19VU0VfWE9QRU4ySzgKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBib3RoIGFib3ZlIGJ1dCB0aGV5CisgICB0YWtlIHRoZSBsb2NhbGUgdGhleSB1c2UgZm9yIHRoZSBjb2xsYXRpb24gYXMgYW4gZXh0cmEgYXJndW1lbnQuCisgICBUaGlzIGlzIG5vdCBzdGFuZGFyZHNpemVkIGJ1dCBzb21ldGhpbmcgbGlrZSB3aWxsIGNvbWUuICAqLworIyBpbmNsdWRlIDx4bG9jYWxlLmg+CisKKy8qIENvbXBhcmUgdGhlIGNvbGxhdGVkIGZvcm1zIG9mIFMxIGFuZCBTMiB1c2luZyBydWxlcyBmcm9tIEwuICAqLworZXh0ZXJuIGludCBzdHJjb2xsX2wgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyLCBfX2xvY2FsZV90IF9fbCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMiwgMykpOworLyogUHV0IGEgdHJhbnNmb3JtYXRpb24gb2YgU1JDIGludG8gbm8gbW9yZSB0aGFuIE4gYnl0ZXMgb2YgREVTVC4gICovCitleHRlcm4gc2l6ZV90IHN0cnhmcm1fbCAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fc3JjLCBzaXplX3QgX19uLAorCQkJIF9fbG9jYWxlX3QgX19sKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDQpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgXAorICAgIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKy8qIER1cGxpY2F0ZSBTLCByZXR1cm5pbmcgYW4gaWRlbnRpY2FsIG1hbGxvYydkIHN0cmluZy4gICovCitleHRlcm4gY2hhciAqc3RyZHVwIChfX2NvbnN0IGNoYXIgKl9fcykKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworLyogUmV0dXJuIGEgbWFsbG9jJ2QgY29weSBvZiBhdCBtb3N0IE4gYnl0ZXMgb2YgU1RSSU5HLiAgVGhlCisgICByZXN1bHRhbnQgc3RyaW5nIGlzIHRlcm1pbmF0ZWQgZXZlbiBpZiBubyBudWxsIHRlcm1pbmF0b3IKKyAgIGFwcGVhcnMgYmVmb3JlIFNUUklOR1tOXS4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorZXh0ZXJuIGNoYXIgKnN0cm5kdXAgKF9fY29uc3QgY2hhciAqX19zdHJpbmcsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfbWFsbG9jX18gX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0dOVSAmJiBkZWZpbmVkIF9fR05VQ19fCisvKiBEdXBsaWNhdGUgUywgcmV0dXJuaW5nIGFuIGlkZW50aWNhbCBhbGxvY2EnZCBzdHJpbmcuICAqLworIyBkZWZpbmUgc3RyZHVwYShzKQkJCQkJCQkgICAgICBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICAoewkJCQkJCQkJCSAgICAgIFwKKyAgICAgIF9fY29uc3QgY2hhciAqX19vbGQgPSAocyk7CQkJCQkgICAgICBcCisgICAgICBzaXplX3QgX19sZW4gPSBzdHJsZW4gKF9fb2xkKSArIDE7CQkJCSAgICAgIFwKKyAgICAgIGNoYXIgKl9fbmV3ID0gKGNoYXIgKikgX19idWlsdGluX2FsbG9jYSAoX19sZW4pOwkJCSAgICAgIFwKKyAgICAgIChjaGFyICopIG1lbWNweSAoX19uZXcsIF9fb2xkLCBfX2xlbik7CQkJCSAgICAgIFwKKyAgICB9KSkKKworLyogUmV0dXJuIGFuIGFsbG9jYSdkIGNvcHkgb2YgYXQgbW9zdCBOIGJ5dGVzIG9mIHN0cmluZy4gICovCisjIGRlZmluZSBzdHJuZHVwYShzLCBuKQkJCQkJCQkgICAgICBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICAoewkJCQkJCQkJCSAgICAgIFwKKyAgICAgIF9fY29uc3QgY2hhciAqX19vbGQgPSAocyk7CQkJCQkgICAgICBcCisgICAgICBzaXplX3QgX19sZW4gPSBzdHJubGVuIChfX29sZCwgKG4pKTsJCQkJICAgICAgXAorICAgICAgY2hhciAqX19uZXcgPSAoY2hhciAqKSBfX2J1aWx0aW5fYWxsb2NhIChfX2xlbiArIDEpOwkJICAgICAgXAorICAgICAgX19uZXdbX19sZW5dID0gJ1wwJzsJCQkJCQkgICAgICBcCisgICAgICAoY2hhciAqKSBtZW1jcHkgKF9fbmV3LCBfX29sZCwgX19sZW4pOwkJCQkgICAgICBcCisgICAgfSkpCisjZW5kaWYKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBGaW5kIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIEMgaW4gUy4gICovCisjaWZkZWYgX19DT1JSRUNUX0lTT19DUFBfU1RSSU5HX0hfUFJPVE8KK2V4dGVybiAiQysrIgoreworZXh0ZXJuIGNoYXIgKnN0cmNociAoY2hhciAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXNtICgic3RyY2hyIikgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBfX2NvbnN0IGNoYXIgKnN0cmNociAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpCisgICAgIF9fVEhST1cgX19hc20gKCJzdHJjaHIiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworCisjIGlmZGVmIF9fT1BUSU1JWkVfXworX19leHRlcm5fYWx3YXlzX2lubGluZSBjaGFyICoKK3N0cmNociAoY2hhciAqX19zLCBpbnQgX19jKSBfX1RIUk9XCit7CisgIHJldHVybiBfX2J1aWx0aW5fc3RyY2hyIChfX3MsIF9fYyk7Cit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX19jb25zdCBjaGFyICoKK3N0cmNociAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpIF9fVEhST1cKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zdHJjaHIgKF9fcywgX19jKTsKK30KKyMgZW5kaWYKK30KKyNlbHNlCitleHRlcm4gY2hhciAqc3RyY2hyIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworI2VuZGlmCisvKiBGaW5kIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgQyBpbiBTLiAgKi8KKyNpZmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9TVFJJTkdfSF9QUk9UTworZXh0ZXJuICJDKysiCit7CitleHRlcm4gY2hhciAqc3RycmNociAoY2hhciAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXNtICgic3RycmNociIpIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gX19jb25zdCBjaGFyICpzdHJyY2hyIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykKKyAgICAgX19USFJPVyBfX2FzbSAoInN0cnJjaHIiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworCisjIGlmZGVmIF9fT1BUSU1JWkVfXworX19leHRlcm5fYWx3YXlzX2lubGluZSBjaGFyICoKK3N0cnJjaHIgKGNoYXIgKl9fcywgaW50IF9fYykgX19USFJPVworeworICByZXR1cm4gX19idWlsdGluX3N0cnJjaHIgKF9fcywgX19jKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX2NvbnN0IGNoYXIgKgorc3RycmNociAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpIF9fVEhST1cKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zdHJyY2hyIChfX3MsIF9fYyk7Cit9CisjIGVuZGlmCit9CisjZWxzZQorZXh0ZXJuIGNoYXIgKnN0cnJjaHIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIGBzdHJjaHInLiAgQnV0IGl0IHJldHVybnMgYSBwb2ludGVyIHRvCisgICB0aGUgY2xvc2luZyBOVUwgYnl0ZSBpbiBjYXNlIEMgaXMgbm90IGZvdW5kIGluIFMuICAqLworIyBpZmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9TVFJJTkdfSF9QUk9UTworZXh0ZXJuICJDKysiIGNoYXIgKnN0cmNocm51bCAoY2hhciAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXNtICgic3RyY2hybnVsIikgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiAiQysrIiBfX2NvbnN0IGNoYXIgKnN0cmNocm51bCAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpCisgICAgIF9fVEhST1cgX19hc20gKCJzdHJjaHJudWwiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworIyBlbHNlCitleHRlcm4gY2hhciAqc3RyY2hybnVsIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworIyBlbmRpZgorI2VuZGlmCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgc2VnbWVudCBvZiBTIHdoaWNoCisgICBjb25zaXN0cyBlbnRpcmVseSBvZiBjaGFyYWN0ZXJzIG5vdCBpbiBSRUpFQ1QuICAqLworZXh0ZXJuIHNpemVfdCBzdHJjc3BuIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBjaGFyICpfX3JlamVjdCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgc2VnbWVudCBvZiBTIHdoaWNoCisgICBjb25zaXN0cyBlbnRpcmVseSBvZiBjaGFyYWN0ZXJzIGluIEFDQ0VQVC4gICovCitleHRlcm4gc2l6ZV90IHN0cnNwbiAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciAqX19hY2NlcHQpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKy8qIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2UgaW4gUyBvZiBhbnkgY2hhcmFjdGVyIGluIEFDQ0VQVC4gICovCisjaWZkZWYgX19DT1JSRUNUX0lTT19DUFBfU1RSSU5HX0hfUFJPVE8KK2V4dGVybiAiQysrIgoreworZXh0ZXJuIGNoYXIgKnN0cnBicmsgKGNoYXIgKl9fcywgX19jb25zdCBjaGFyICpfX2FjY2VwdCkKKyAgICAgX19USFJPVyBfX2FzbSAoInN0cnBicmsiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworZXh0ZXJuIF9fY29uc3QgY2hhciAqc3RycGJyayAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciAqX19hY2NlcHQpCisgICAgIF9fVEhST1cgX19hc20gKCJzdHJwYnJrIikgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworIyBpZmRlZiBfX09QVElNSVpFX18KK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgY2hhciAqCitzdHJwYnJrIChjaGFyICpfX3MsIF9fY29uc3QgY2hhciAqX19hY2NlcHQpIF9fVEhST1cKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zdHJwYnJrIChfX3MsIF9fYWNjZXB0KTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX2NvbnN0IGNoYXIgKgorc3RycGJyayAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciAqX19hY2NlcHQpIF9fVEhST1cKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9zdHJwYnJrIChfX3MsIF9fYWNjZXB0KTsKK30KKyMgZW5kaWYKK30KKyNlbHNlCitleHRlcm4gY2hhciAqc3RycGJyayAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciAqX19hY2NlcHQpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyNlbmRpZgorLyogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBORUVETEUgaW4gSEFZU1RBQ0suICAqLworI2lmZGVmIF9fQ09SUkVDVF9JU09fQ1BQX1NUUklOR19IX1BST1RPCitleHRlcm4gIkMrKyIKK3sKK2V4dGVybiBjaGFyICpzdHJzdHIgKGNoYXIgKl9faGF5c3RhY2ssIF9fY29uc3QgY2hhciAqX19uZWVkbGUpCisgICAgIF9fVEhST1cgX19hc20gKCJzdHJzdHIiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworZXh0ZXJuIF9fY29uc3QgY2hhciAqc3Ryc3RyIChfX2NvbnN0IGNoYXIgKl9faGF5c3RhY2ssCisJCQkgICAgIF9fY29uc3QgY2hhciAqX19uZWVkbGUpCisgICAgIF9fVEhST1cgX19hc20gKCJzdHJzdHIiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworCisjIGlmZGVmIF9fT1BUSU1JWkVfXworX19leHRlcm5fYWx3YXlzX2lubGluZSBjaGFyICoKK3N0cnN0ciAoY2hhciAqX19oYXlzdGFjaywgX19jb25zdCBjaGFyICpfX25lZWRsZSkgX19USFJPVworeworICByZXR1cm4gX19idWlsdGluX3N0cnN0ciAoX19oYXlzdGFjaywgX19uZWVkbGUpOworfQorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fY29uc3QgY2hhciAqCitzdHJzdHIgKF9fY29uc3QgY2hhciAqX19oYXlzdGFjaywgX19jb25zdCBjaGFyICpfX25lZWRsZSkgX19USFJPVworeworICByZXR1cm4gX19idWlsdGluX3N0cnN0ciAoX19oYXlzdGFjaywgX19uZWVkbGUpOworfQorIyBlbmRpZgorfQorI2Vsc2UKK2V4dGVybiBjaGFyICpzdHJzdHIgKF9fY29uc3QgY2hhciAqX19oYXlzdGFjaywgX19jb25zdCBjaGFyICpfX25lZWRsZSkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworI2VuZGlmCisKKworLyogRGl2aWRlIFMgaW50byB0b2tlbnMgc2VwYXJhdGVkIGJ5IGNoYXJhY3RlcnMgaW4gREVMSU0uICAqLworZXh0ZXJuIGNoYXIgKnN0cnRvayAoY2hhciAqX19yZXN0cmljdCBfX3MsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RlbGltKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworLyogRGl2aWRlIFMgaW50byB0b2tlbnMgc2VwYXJhdGVkIGJ5IGNoYXJhY3RlcnMgaW4gREVMSU0uICBJbmZvcm1hdGlvbgorICAgcGFzc2VkIGJldHdlZW4gY2FsbHMgYXJlIHN0b3JlZCBpbiBTQVZFX1BUUi4gICovCitleHRlcm4gY2hhciAqX19zdHJ0b2tfciAoY2hhciAqX19yZXN0cmljdCBfX3MsCisJCQkgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZGVsaW0sCisJCQkgY2hhciAqKl9fcmVzdHJpY3QgX19zYXZlX3B0cikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyLCAzKSk7CisjaWYgZGVmaW5lZCBfX1VTRV9QT1NJWCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKK2V4dGVybiBjaGFyICpzdHJ0b2tfciAoY2hhciAqX19yZXN0cmljdCBfX3MsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RlbGltLAorCQkgICAgICAgY2hhciAqKl9fcmVzdHJpY3QgX19zYXZlX3B0cikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyLCAzKSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogU2ltaWxhciB0byBgc3Ryc3RyJyBidXQgdGhpcyBmdW5jdGlvbiBpZ25vcmVzIHRoZSBjYXNlIG9mIGJvdGggc3RyaW5ncy4gICovCisjIGlmZGVmIF9fQ09SUkVDVF9JU09fQ1BQX1NUUklOR19IX1BST1RPCitleHRlcm4gIkMrKyIgY2hhciAqc3RyY2FzZXN0ciAoY2hhciAqX19oYXlzdGFjaywgX19jb25zdCBjaGFyICpfX25lZWRsZSkKKyAgICAgX19USFJPVyBfX2FzbSAoInN0cmNhc2VzdHIiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworZXh0ZXJuICJDKysiIF9fY29uc3QgY2hhciAqc3RyY2FzZXN0ciAoX19jb25zdCBjaGFyICpfX2hheXN0YWNrLAorCQkJCSAgICAgICBfX2NvbnN0IGNoYXIgKl9fbmVlZGxlKQorICAgICBfX1RIUk9XIF9fYXNtICgic3RyY2FzZXN0ciIpIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyKSk7CisjIGVsc2UKK2V4dGVybiBjaGFyICpzdHJjYXNlc3RyIChfX2NvbnN0IGNoYXIgKl9faGF5c3RhY2ssIF9fY29uc3QgY2hhciAqX19uZWVkbGUpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisvKiBGaW5kIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIE5FRURMRSBpbiBIQVlTVEFDSy4KKyAgIE5FRURMRSBpcyBORUVETEVMRU4gYnl0ZXMgbG9uZzsKKyAgIEhBWVNUQUNLIGlzIEhBWVNUQUNLTEVOIGJ5dGVzIGxvbmcuICAqLworZXh0ZXJuIHZvaWQgKm1lbW1lbSAoX19jb25zdCB2b2lkICpfX2hheXN0YWNrLCBzaXplX3QgX19oYXlzdGFja2xlbiwKKwkJICAgICBfX2NvbnN0IHZvaWQgKl9fbmVlZGxlLCBzaXplX3QgX19uZWVkbGVsZW4pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDMpKTsKKworLyogQ29weSBOIGJ5dGVzIG9mIFNSQyB0byBERVNULCByZXR1cm4gcG9pbnRlciB0byBieXRlcyBhZnRlciB0aGUKKyAgIGxhc3Qgd3JpdHRlbiBieXRlLiAgKi8KK2V4dGVybiB2b2lkICpfX21lbXBjcHkgKHZvaWQgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJX19jb25zdCB2b2lkICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKK2V4dGVybiB2b2lkICptZW1wY3B5ICh2b2lkICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJICAgICAgX19jb25zdCB2b2lkICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgUy4gICovCitleHRlcm4gc2l6ZV90IHN0cmxlbiAoX19jb25zdCBjaGFyICpfX3MpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmCV9fVVNFX1hPUEVOMks4CisvKiBGaW5kIHRoZSBsZW5ndGggb2YgU1RSSU5HLCBidXQgc2NhbiBhdCBtb3N0IE1BWExFTiBjaGFyYWN0ZXJzLgorICAgSWYgbm8gJ1wwJyB0ZXJtaW5hdG9yIGlzIGZvdW5kIGluIHRoYXQgbWFueSBjaGFyYWN0ZXJzLCByZXR1cm4gTUFYTEVOLiAgKi8KK2V4dGVybiBzaXplX3Qgc3RybmxlbiAoX19jb25zdCBjaGFyICpfX3N0cmluZywgc2l6ZV90IF9fbWF4bGVuKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBtZWFuaW5nIG9mIHRoZSBgZXJybm8nIGNvZGUgaW4gRVJSTlVNLiAgKi8KK2V4dGVybiBjaGFyICpzdHJlcnJvciAoaW50IF9fZXJybnVtKSBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX1NURAorI2lmIGRlZmluZWQgX19VU0VfWE9QRU4ySyB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKy8qIFJlZW50cmFudCB2ZXJzaW9uIG9mIGBzdHJlcnJvcicuCisgICBUaGVyZSBhcmUgMiBmbGF2b3JzIG9mIGBzdHJlcnJvcl9yJywgR05VIHdoaWNoIHJldHVybnMgdGhlIHN0cmluZworICAgYW5kIG1heSBvciBtYXkgbm90IHVzZSB0aGUgc3VwcGxpZWQgdGVtcG9yYXJ5IGJ1ZmZlciBhbmQgUE9TSVggb25lCisgICB3aGljaCBmaWxscyB0aGUgc3RyaW5nIGludG8gdGhlIGJ1ZmZlci4KKyAgIFRvIHVzZSB0aGUgUE9TSVggdmVyc2lvbiwgLURfWE9QRU5fU09VUkNFPTYwMCBvciAtRF9QT1NJWF9DX1NPVVJDRT0yMDAxMTJMCisgICB3aXRob3V0IC1EX0dOVV9TT1VSQ0UgaXMgbmVlZGVkLCBvdGhlcndpc2UgdGhlIEdOVSB2ZXJzaW9uIGlzCisgICBwcmVmZXJyZWQuICAqLworIyBpZiBkZWZpbmVkIF9fVVNFX1hPUEVOMksgJiYgIWRlZmluZWQgX19VU0VfR05VCisvKiBGaWxsIEJVRiB3aXRoIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIG1lYW5pbmcgb2YgdGhlIGBlcnJubycgY29kZSBpbgorICAgRVJSTlVNLiAgKi8KKyMgIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChzdHJlcnJvcl9yLAorCQkJICAgKGludCBfX2Vycm51bSwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbiksCisJCQkgICBfX3hwZ19zdHJlcnJvcl9yKSBfX25vbm51bGwgKCgyKSk7CisjICBlbHNlCitleHRlcm4gaW50IF9feHBnX3N0cmVycm9yX3IgKGludCBfX2Vycm51bSwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjICAgZGVmaW5lIHN0cmVycm9yX3IgX194cGdfc3RyZXJyb3JfcgorIyAgZW5kaWYKKyMgZWxzZQorLyogSWYgYSB0ZW1wb3JhcnkgYnVmZmVyIGlzIHJlcXVpcmVkLCBhdCBtb3N0IEJVRkxFTiBieXRlcyBvZiBCVUYgd2lsbCBiZQorICAgdXNlZC4gICovCitleHRlcm4gY2hhciAqc3RyZXJyb3JfciAoaW50IF9fZXJybnVtLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfWE9QRU4ySzgKKy8qIFRyYW5zbGF0ZSBlcnJvciBudW1iZXIgdG8gc3RyaW5nIGFjY29yZGluZyB0byB0aGUgbG9jYWxlIEwuICAqLworZXh0ZXJuIGNoYXIgKnN0cmVycm9yX2wgKGludCBfX2Vycm51bSwgX19sb2NhbGVfdCBfX2wpIF9fVEhST1c7CisjZW5kaWYKKworCisvKiBXZSBkZWZpbmUgdGhpcyBmdW5jdGlvbiBhbHdheXMgc2luY2UgYGJ6ZXJvJyBpcyBzb21ldGltZXMgbmVlZGVkIHdoZW4KKyAgIHRoZSBuYW1lc3BhY2UgcnVsZXMgZG9lcyBub3QgYWxsb3cgdGhpcy4gICovCitleHRlcm4gdm9pZCBfX2J6ZXJvICh2b2lkICpfX3MsIHNpemVfdCBfX24pIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjaWZkZWYgX19VU0VfQlNECisvKiBDb3B5IE4gYnl0ZXMgb2YgU1JDIHRvIERFU1QgKGxpa2UgbWVtbW92ZSwgYnV0IGFyZ3MgcmV2ZXJzZWQpLiAgKi8KK2V4dGVybiB2b2lkIGJjb3B5IChfX2NvbnN0IHZvaWQgKl9fc3JjLCB2b2lkICpfX2Rlc3QsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBTZXQgTiBieXRlcyBvZiBTIHRvIDAuICAqLworZXh0ZXJuIHZvaWQgYnplcm8gKHZvaWQgKl9fcywgc2l6ZV90IF9fbikgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIENvbXBhcmUgTiBieXRlcyBvZiBTMSBhbmQgUzIgKHNhbWUgYXMgbWVtY21wKS4gICovCitleHRlcm4gaW50IGJjbXAgKF9fY29uc3Qgdm9pZCAqX19zMSwgX19jb25zdCB2b2lkICpfX3MyLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgQyBpbiBTIChzYW1lIGFzIHN0cmNocikuICAqLworIyBpZmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9TVFJJTkdfSF9QUk9UTworZXh0ZXJuICJDKysiCit7CitleHRlcm4gY2hhciAqaW5kZXggKGNoYXIgKl9fcywgaW50IF9fYykKKyAgICAgX19USFJPVyBfX2FzbSAoImluZGV4IikgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBfX2NvbnN0IGNoYXIgKmluZGV4IChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykKKyAgICAgX19USFJPVyBfX2FzbSAoImluZGV4IikgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKKworIyAgaWYgZGVmaW5lZCBfX09QVElNSVpFX18gJiYgIWRlZmluZWQgX19DT1JSRUNUX0lTT19DUFBfU1RSSU5HU19IX1BST1RPCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGNoYXIgKgoraW5kZXggKGNoYXIgKl9fcywgaW50IF9fYykgX19USFJPVworeworICByZXR1cm4gX19idWlsdGluX2luZGV4IChfX3MsIF9fYyk7Cit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX19jb25zdCBjaGFyICoKK2luZGV4IChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykgX19USFJPVworeworICByZXR1cm4gX19idWlsdGluX2luZGV4IChfX3MsIF9fYyk7Cit9CisjICBlbmRpZgorfQorIyBlbHNlCitleHRlcm4gY2hhciAqaW5kZXggKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CisjIGVuZGlmCisKKy8qIEZpbmQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBDIGluIFMgKHNhbWUgYXMgc3RycmNocikuICAqLworIyBpZmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9TVFJJTkdfSF9QUk9UTworZXh0ZXJuICJDKysiCit7CitleHRlcm4gY2hhciAqcmluZGV4IChjaGFyICpfX3MsIGludCBfX2MpCisgICAgIF9fVEhST1cgX19hc20gKCJyaW5kZXgiKSBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworZXh0ZXJuIF9fY29uc3QgY2hhciAqcmluZGV4IChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykKKyAgICAgX19USFJPVyBfX2FzbSAoInJpbmRleCIpIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CisKKyMgIGlmIGRlZmluZWQgX19PUFRJTUlaRV9fICYmICFkZWZpbmVkIF9fQ09SUkVDVF9JU09fQ1BQX1NUUklOR1NfSF9QUk9UTworX19leHRlcm5fYWx3YXlzX2lubGluZSBjaGFyICoKK3JpbmRleCAoY2hhciAqX19zLCBpbnQgX19jKSBfX1RIUk9XCit7CisgIHJldHVybiBfX2J1aWx0aW5fcmluZGV4IChfX3MsIF9fYyk7Cit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX19jb25zdCBjaGFyICoKK3JpbmRleCAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpIF9fVEhST1cKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9yaW5kZXggKF9fcywgX19jKTsKK30KKyNlbmRpZgorfQorIyBlbHNlCitleHRlcm4gY2hhciAqcmluZGV4IChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworIyBlbmRpZgorCisvKiBSZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBiaXQgc2V0IGluIEksIG9yIDAgaWYgbm9uZSBhcmUgc2V0LgorICAgVGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdCBpcyBwb3NpdGlvbiAxLCB0aGUgbW9zdC1zaWduaWZpY2FudCAzMi4gICovCitleHRlcm4gaW50IGZmcyAoaW50IF9faSkgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKy8qIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBhcmUgbm9uLXN0YW5kYXJkIGJ1dCBuZWNlc3NhcnkgZm9yIG5vbi0zMiBiaXQKKyAgIHBsYXRmb3Jtcy4gICovCisjIGlmZGVmCV9fVVNFX0dOVQorZXh0ZXJuIGludCBmZnNsIChsb25nIGludCBfX2wpIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworIyAgaWZkZWYgX19HTlVDX18KK19fZXh0ZW5zaW9uX18gZXh0ZXJuIGludCBmZnNsbCAobG9uZyBsb25nIGludCBfX2xsKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKyMgIGVuZGlmCisjIGVuZGlmCisKKy8qIENvbXBhcmUgUzEgYW5kIFMyLCBpZ25vcmluZyBjYXNlLiAgKi8KK2V4dGVybiBpbnQgc3RyY2FzZWNtcCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogQ29tcGFyZSBubyBtb3JlIHRoYW4gTiBjaGFycyBvZiBTMSBhbmQgUzIsIGlnbm9yaW5nIGNhc2UuICAqLworZXh0ZXJuIGludCBzdHJuY2FzZWNtcCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyNlbmRpZiAvKiBVc2UgQlNELiAgKi8KKworI2lmZGVmCV9fVVNFX0dOVQorLyogQWdhaW4gdmVyc2lvbnMgb2YgYSBmZXcgZnVuY3Rpb25zIHdoaWNoIHVzZSB0aGUgZ2l2ZW4gbG9jYWxlIGluc3RlYWQKKyAgIG9mIHRoZSBnbG9iYWwgb25lLiAgKi8KK2V4dGVybiBpbnQgc3RyY2FzZWNtcF9sIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMiwKKwkJCSBfX2xvY2FsZV90IF9fbG9jKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyLCAzKSk7CisKK2V4dGVybiBpbnQgc3RybmNhc2VjbXBfbCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIsCisJCQkgIHNpemVfdCBfX24sIF9fbG9jYWxlX3QgX19sb2MpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIsIDQpKTsKKyNlbmRpZgorCisjaWZkZWYJX19VU0VfQlNECisvKiBSZXR1cm4gdGhlIG5leHQgREVMSU0tZGVsaW1pdGVkIHRva2VuIGZyb20gKlNUUklOR1AsCisgICB0ZXJtaW5hdGluZyBpdCB3aXRoIGEgJ1wwJywgYW5kIHVwZGF0ZSAqU1RSSU5HUCB0byBwb2ludCBwYXN0IGl0LiAgKi8KK2V4dGVybiBjaGFyICpzdHJzZXAgKGNoYXIgKipfX3Jlc3RyaWN0IF9fc3RyaW5ncCwKKwkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19kZWxpbSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjZW5kaWYKKworI2lmZGVmCV9fVVNFX1hPUEVOMks4CisvKiBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgbWVhbmluZyBvZiB0aGUgc2lnbmFsIG51bWJlciBpbiBTSUcuICAqLworZXh0ZXJuIGNoYXIgKnN0cnNpZ25hbCAoaW50IF9fc2lnKSBfX1RIUk9XOworCisvKiBDb3B5IFNSQyB0byBERVNULCByZXR1cm5pbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIHRlcm1pbmF0aW5nICdcMCcgaW4gREVTVC4gICovCitleHRlcm4gY2hhciAqX19zdHBjcHkgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworZXh0ZXJuIGNoYXIgKnN0cGNweSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIENvcHkgbm8gbW9yZSB0aGFuIE4gY2hhcmFjdGVycyBvZiBTUkMgdG8gREVTVCwgcmV0dXJuaW5nIHRoZSBhZGRyZXNzIG9mCisgICB0aGUgbGFzdCBjaGFyYWN0ZXIgd3JpdHRlbiBpbnRvIERFU1QuICAqLworZXh0ZXJuIGNoYXIgKl9fc3RwbmNweSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQlfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworZXh0ZXJuIGNoYXIgKnN0cG5jcHkgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworI2VuZGlmCisKKyNpZmRlZglfX1VTRV9HTlUKKy8qIENvbXBhcmUgUzEgYW5kIFMyIGFzIHN0cmluZ3MgaG9sZGluZyBuYW1lICYgaW5kaWNlcy92ZXJzaW9uIG51bWJlcnMuICAqLworZXh0ZXJuIGludCBzdHJ2ZXJzY21wIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworCisvKiBTYXV0ZWUgU1RSSU5HIGJyaXNrbHkuICAqLworZXh0ZXJuIGNoYXIgKnN0cmZyeSAoY2hhciAqX19zdHJpbmcpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBGcm9ibmljYXRlIE4gYnl0ZXMgb2YgUy4gICovCitleHRlcm4gdm9pZCAqbWVtZnJvYiAodm9pZCAqX19zLCBzaXplX3QgX19uKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworIyBpZm5kZWYgYmFzZW5hbWUKKy8qIFJldHVybiB0aGUgZmlsZSBuYW1lIHdpdGhpbiBkaXJlY3Rvcnkgb2YgRklMRU5BTUUuICBXZSBkb24ndAorICAgZGVjbGFyZSB0aGUgZnVuY3Rpb24gaWYgdGhlIGBiYXNlbmFtZScgbWFjcm8gaXMgYXZhaWxhYmxlIChkZWZpbmVkCisgICBpbiA8bGliZ2VuLmg+KSB3aGljaCBtYWtlcyB0aGUgWFBHIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbgorICAgYXZhaWxhYmxlLiAgKi8KKyMgIGlmZGVmIF9fQ09SUkVDVF9JU09fQ1BQX1NUUklOR19IX1BST1RPCitleHRlcm4gIkMrKyIgY2hhciAqYmFzZW5hbWUgKGNoYXIgKl9fZmlsZW5hbWUpCisgICAgIF9fVEhST1cgX19hc20gKCJiYXNlbmFtZSIpIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiAiQysrIiBfX2NvbnN0IGNoYXIgKmJhc2VuYW1lIChfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUpCisgICAgIF9fVEhST1cgX19hc20gKCJiYXNlbmFtZSIpIF9fbm9ubnVsbCAoKDEpKTsKKyMgIGVsc2UKK2V4dGVybiBjaGFyICpiYXNlbmFtZSAoX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyCisjIGlmIGRlZmluZWQgX19PUFRJTUlaRV9fICYmICFkZWZpbmVkIF9fT1BUSU1JWkVfU0laRV9fIFwKKyAgICAgJiYgIWRlZmluZWQgX19OT19JTkxJTkVfXyAmJiAhZGVmaW5lZCBfX2NwbHVzcGx1cworLyogV2hlbiB1c2luZyBHTlUgQ0Mgd2UgcHJvdmlkZSBzb21lIG9wdGltaXplZCB2ZXJzaW9ucyBvZiBzZWxlY3RlZAorICAgZnVuY3Rpb25zIGZyb20gdGhpcyBoZWFkZXIuICBUaGVyZSBhcmUgdHdvIGtpbmRzIG9mIG9wdGltaXphdGlvbnM6CisKKyAgIC0gbWFjaGluZS1kZXBlbmRlbnQgb3B0aW1pemF0aW9ucywgbW9zdCBwcm9iYWJseSB1c2luZyBpbmxpbmUKKyAgICAgYXNzZW1ibGVyIGNvZGU7IHRoZXNlIG1pZ2h0IGJlIHF1aXRlIGV4cGVuc2l2ZSBzaW5jZSB0aGUgY29kZQorICAgICBzaXplIGNhbiBpbmNyZWFzZSBzaWduaWZpY2FudGx5LgorICAgICBUaGVzZSBvcHRpbWl6YXRpb25zIGFyZSBub3QgdXNlZCB1bmxlc3MgdGhlIHN5bWJvbAorCV9fVVNFX1NUUklOR19JTkxJTkVTCisgICAgIGlzIGRlZmluZWQgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGhlYWRlci4KKworICAgLSBtYWNoaW5lLWluZGVwZW5kZW50IG9wdGltaXphdGlvbnMgd2hpY2ggZG8gbm90IGluY3JlYXNlIHRoZQorICAgICBjb2RlIHNpemUgc2lnbmlmaWNhbnRseSBhbmQgd2hpY2ggb3B0aW1pemUgbWFpbmx5IHNpdHVhdGlvbnMKKyAgICAgd2hlcmUgb25lIG9yIG1vcmUgYXJndW1lbnRzIGFyZSBjb21waWxlLXRpbWUgY29uc3RhbnRzLgorICAgICBUaGVzZSBvcHRpbWl6YXRpb25zIGFyZSB1c2VkIGFsd2F5cyB3aGVuIHRoZSBjb21waWxlciBpcworICAgICB0YXVnaHQgdG8gb3B0aW1pemUuCisKKyAgIE9uZSBjYW4gaW5oaWJpdCBhbGwgb3B0aW1pemF0aW9ucyBieSBkZWZpbmluZyBfX05PX1NUUklOR19JTkxJTkVTLiAgKi8KKworLyogR2V0IHRoZSBtYWNoaW5lLWRlcGVuZGVudCBvcHRpbWl6YXRpb25zIChpZiBhbnkpLiAgKi8KKyMgIGluY2x1ZGUgPGJpdHMvc3RyaW5nLmg+CisKKy8qIFRoZXNlIGFyZSBnZW5lcmljIG9wdGltaXphdGlvbnMgd2hpY2ggZG8gbm90IGFkZCB0b28gbXVjaCBpbmxpbmUgY29kZS4gICovCisjICBpbmNsdWRlIDxiaXRzL3N0cmluZzIuaD4KKyMgZW5kaWYKKworIyBpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUKKy8qIEZ1bmN0aW9ucyB3aXRoIHNlY3VyaXR5IGNoZWNrcy4gICovCisjICBpbmNsdWRlIDxiaXRzL3N0cmluZzMuaD4KKyMgZW5kaWYKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3RyaW5nLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N0cmluZ3MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RyaW5ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYjgzY2EKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N0cmluZ3MuaApAQCAtMCwwICsxLDE0MiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLDE5OTIsMTk5NiwxOTk3LDE5OTksMjAwMCwyMDAxLDIwMDksMjAxMAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NUUklOR1NfSAorI2RlZmluZQlfU1RSSU5HU19ICTEKKworLyogV2UgZG9uJ3QgbmVlZCBhbmQgc2hvdWxkIG5vdCByZWFkIHRoaXMgZmlsZSBpZiA8c3RyaW5nLmg+IHdhcyBhbHJlYWR5CisgICByZWFkLiBUaGUgb25lIGV4Y2VwdGlvbiBiZWluZyB0aGF0IGlmIF9fVVNFX0JTRCBpc24ndCBkZWZpbmVkLCB0aGVuCisgICB0aGVzZSBhcmVuJ3QgZGVmaW5lZCBpbiBzdHJpbmcuaCwgc28gd2UgbmVlZCB0byBkZWZpbmUgdGhlbSBoZXJlLiAgKi8KKyNpZiAhZGVmaW5lZCBfU1RSSU5HX0ggfHwgIWRlZmluZWQgX19VU0VfQlNECisKKyMgaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyMgZGVmaW5lIF9fbmVlZF9zaXplX3QKKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIFRlbGwgdGhlIGNhbGxlciB0aGF0IHdlIHByb3ZpZGUgY29ycmVjdCBDKysgcHJvdG90eXBlcy4gICovCisjIGlmIGRlZmluZWQgX19jcGx1c3BsdXMgJiYgX19HTlVDX1BSRVJFUSAoNCwgNCkKKyMgIGRlZmluZSBfX0NPUlJFQ1RfSVNPX0NQUF9TVFJJTkdTX0hfUFJPVE8KKyMgZW5kaWYKKworX19CRUdJTl9ERUNMUworCisjIGlmIGRlZmluZWQgX19VU0VfTUlTQyB8fCAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorLyogQ29tcGFyZSBOIGJ5dGVzIG9mIFMxIGFuZCBTMiAoc2FtZSBhcyBtZW1jbXApLiAgKi8KK2V4dGVybiBpbnQgYmNtcCAoX19jb25zdCB2b2lkICpfX3MxLCBfX2NvbnN0IHZvaWQgKl9fczIsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworCisvKiBDb3B5IE4gYnl0ZXMgb2YgU1JDIHRvIERFU1QgKGxpa2UgbWVtbW92ZSwgYnV0IGFyZ3MgcmV2ZXJzZWQpLiAgKi8KK2V4dGVybiB2b2lkIGJjb3B5IChfX2NvbnN0IHZvaWQgKl9fc3JjLCB2b2lkICpfX2Rlc3QsIHNpemVfdCBfX24pIF9fVEhST1c7CisKKy8qIFNldCBOIGJ5dGVzIG9mIFMgdG8gMC4gICovCitleHRlcm4gdm9pZCBiemVybyAodm9pZCAqX19zLCBzaXplX3QgX19uKSBfX1RIUk9XOworCisvKiBGaW5kIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIEMgaW4gUyAoc2FtZSBhcyBzdHJjaHIpLiAgKi8KKyMgIGlmZGVmIF9fQ09SUkVDVF9JU09fQ1BQX1NUUklOR1NfSF9QUk9UTworZXh0ZXJuICJDKysiCit7CitleHRlcm4gY2hhciAqaW5kZXggKGNoYXIgKl9fcywgaW50IF9fYykKKyAgICAgX19USFJPVyBfX2FzbSAoImluZGV4IikgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBfX2NvbnN0IGNoYXIgKmluZGV4IChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykKKyAgICAgX19USFJPVyBfX2FzbSAoImluZGV4IikgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKKworIyAgIGlmIGRlZmluZWQgX19PUFRJTUlaRV9fICYmICFkZWZpbmVkIF9fQ09SUkVDVF9JU09fQ1BQX1NUUklOR19IX1BST1RPCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGNoYXIgKgoraW5kZXggKGNoYXIgKl9fcywgaW50IF9fYykgX19USFJPVworeworICByZXR1cm4gX19idWlsdGluX2luZGV4IChfX3MsIF9fYyk7Cit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX19jb25zdCBjaGFyICoKK2luZGV4IChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykgX19USFJPVworeworICByZXR1cm4gX19idWlsdGluX2luZGV4IChfX3MsIF9fYyk7Cit9CisjICAgZW5kaWYKK30KKyMgIGVsc2UKK2V4dGVybiBjaGFyICppbmRleCAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKKyMgIGVuZGlmCisKKy8qIEZpbmQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBDIGluIFMgKHNhbWUgYXMgc3RycmNocikuICAqLworIyAgaWZkZWYgX19DT1JSRUNUX0lTT19DUFBfU1RSSU5HU19IX1BST1RPCitleHRlcm4gIkMrKyIKK3sKK2V4dGVybiBjaGFyICpyaW5kZXggKGNoYXIgKl9fcywgaW50IF9fYykKKyAgICAgX19USFJPVyBfX2FzbSAoInJpbmRleCIpIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gX19jb25zdCBjaGFyICpyaW5kZXggKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXNtICgicmluZGV4IikgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKKworIyAgIGlmIGRlZmluZWQgX19PUFRJTUlaRV9fICYmICFkZWZpbmVkIF9fQ09SUkVDVF9JU09fQ1BQX1NUUklOR19IX1BST1RPCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGNoYXIgKgorcmluZGV4IChjaGFyICpfX3MsIGludCBfX2MpIF9fVEhST1cKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9yaW5kZXggKF9fcywgX19jKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX2NvbnN0IGNoYXIgKgorcmluZGV4IChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykgX19USFJPVworeworICByZXR1cm4gX19idWlsdGluX3JpbmRleCAoX19zLCBfX2MpOworfQorIyAgIGVuZGlmCit9CisjICBlbHNlCitleHRlcm4gY2hhciAqcmluZGV4IChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworIyAgZW5kaWYKKyMgZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLOCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4WFNJCisvKiBSZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBiaXQgc2V0IGluIEksIG9yIDAgaWYgbm9uZSBhcmUgc2V0LgorICAgVGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdCBpcyBwb3NpdGlvbiAxLCB0aGUgbW9zdC1zaWduaWZpY2FudCAzMi4gICovCitleHRlcm4gaW50IGZmcyAoaW50IF9faSkgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoY29uc3QpKTsKKyNlbmRpZgorCisvKiBDb21wYXJlIFMxIGFuZCBTMiwgaWdub3JpbmcgY2FzZS4gICovCitleHRlcm4gaW50IHN0cmNhc2VjbXAgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXzsKKworLyogQ29tcGFyZSBubyBtb3JlIHRoYW4gTiBjaGFycyBvZiBTMSBhbmQgUzIsIGlnbm9yaW5nIGNhc2UuICAqLworZXh0ZXJuIGludCBzdHJuY2FzZWNtcCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworCisjaWZkZWYJX19VU0VfWE9QRU4ySzgKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBib3RoIGFib3ZlIGJ1dCB0aGV5CisgICB0YWtlIHRoZSBsb2NhbGUgdGhleSB1c2UgZm9yIHRoZSBjb2xsYXRpb24gYXMgYW4gZXh0cmEgYXJndW1lbnQuCisgICBUaGlzIGlzIG5vdCBzdGFuZGFyZHNpemVkIGJ1dCBzb21ldGhpbmcgbGlrZSB3aWxsIGNvbWUuICAqLworIyBpbmNsdWRlIDx4bG9jYWxlLmg+CisKKy8qIEFnYWluIHZlcnNpb25zIG9mIGEgZmV3IGZ1bmN0aW9ucyB3aGljaCB1c2UgdGhlIGdpdmVuIGxvY2FsZSBpbnN0ZWFkCisgICBvZiB0aGUgZ2xvYmFsIG9uZS4gICovCitleHRlcm4gaW50IHN0cmNhc2VjbXBfbCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIsCisJCQkgX19sb2NhbGVfdCBfX2xvYykKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMiwgMykpOworCitleHRlcm4gaW50IHN0cm5jYXNlY21wX2wgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyLAorCQkJICBzaXplX3QgX19uLCBfX2xvY2FsZV90IF9fbG9jKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyLCA0KSk7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHN0cmluZy5oICAqLworCisjZW5kaWYJLyogc3RyaW5ncy5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zdHJvcHRzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N0cm9wdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTJjMDliCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zdHJvcHRzLmgKQEAgLTAsMCArMSw5MiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVFJPUFRTX0gKKyNkZWZpbmUgX1NUUk9QVFNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3h0aXR5cGVzLmg+CisKKyNpZm5kZWYgX19naWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fZ2lkX3QgZ2lkX3Q7CisjIGRlZmluZSBfX2dpZF90X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fdWlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3VpZF90IHVpZF90OworIyBkZWZpbmUgX191aWRfdF9kZWZpbmVkCisjZW5kaWYKKwordHlwZWRlZiBfX3RfdXNjYWxhcl90IHRfdXNjYWxhcl90OworCisvKiBHZXQgc3lzdGVtIHNwZWNpZmljIGNvbnRhbnRzLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3N0cm9wdHMuaD4KKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRlc3Qgd2hldGhlciBGSUxERVMgaXMgYXNzb2NpYXRlZCB3aXRoIGEgU1RSRUFNLWJhc2VkIGZpbGUuICAqLworZXh0ZXJuIGludCBpc2FzdHJlYW0gKGludCBfX2ZpbGRlcykgX19USFJPVzsKKworLyogUmVjZWl2ZSBuZXh0IG1lc3NhZ2UgZnJvbSBhIFNUUkVBTVMgZmlsZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IGdldG1zZyAoaW50IF9fZmlsZGVzLCBzdHJ1Y3Qgc3RyYnVmICpfX3Jlc3RyaWN0IF9fY3RscHRyLAorCQkgICBzdHJ1Y3Qgc3RyYnVmICpfX3Jlc3RyaWN0IF9fZGF0YXB0ciwKKwkJICAgaW50ICpfX3Jlc3RyaWN0IF9fZmxhZ3NwKTsKKworLyogUmVjZWl2ZSBuZXh0IG1lc3NhZ2UgZnJvbSBhIFNUUkVBTVMgZmlsZSwgd2l0aCAqRkxBR1NQIGFsbG93aW5nIHRvCisgICBjb250cm9sIHdoaWNoIG1lc3NhZ2UuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRwbXNnIChpbnQgX19maWxkZXMsIHN0cnVjdCBzdHJidWYgKl9fcmVzdHJpY3QgX19jdGxwdHIsCisJCSAgICBzdHJ1Y3Qgc3RyYnVmICpfX3Jlc3RyaWN0IF9fZGF0YXB0ciwKKwkJICAgIGludCAqX19yZXN0cmljdCBfX2JhbmRwLCBpbnQgKl9fcmVzdHJpY3QgX19mbGFnc3ApOworCisvKiBQZXJmb3JtIHRoZSBJL08gY29udHJvbCBvcGVyYXRpb24gc3BlY2lmaWVkIGJ5IFJFUVVFU1Qgb24gRkQuCisgICBPbmUgYXJndW1lbnQgbWF5IGZvbGxvdzsgaXRzIHByZXNlbmNlIGFuZCB0eXBlIGRlcGVuZCBvbiBSRVFVRVNULgorICAgUmV0dXJuIHZhbHVlIGRlcGVuZHMgb24gUkVRVUVTVC4gIFVzdWFsbHkgLTEgaW5kaWNhdGVzIGVycm9yLiAgKi8KK2V4dGVybiBpbnQgaW9jdGwgKGludCBfX2ZkLCB1bnNpZ25lZCBsb25nIGludCBfX3JlcXVlc3QsIC4uLikgX19USFJPVzsKKworLyogU2VuZCBhIG1lc3NhZ2Ugb24gYSBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwdXRtc2cgKGludCBfX2ZpbGRlcywgX19jb25zdCBzdHJ1Y3Qgc3RyYnVmICpfX2N0bHB0ciwKKwkJICAgX19jb25zdCBzdHJ1Y3Qgc3RyYnVmICpfX2RhdGFwdHIsIGludCBfX2ZsYWdzKTsKKworLyogU2VuZCBhIG1lc3NhZ2Ugb24gYSBTVFJFQU0gdG8gdGhlIEJBTkQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwdXRwbXNnIChpbnQgX19maWxkZXMsIF9fY29uc3Qgc3RydWN0IHN0cmJ1ZiAqX19jdGxwdHIsCisJCSAgICBfX2NvbnN0IHN0cnVjdCBzdHJidWYgKl9fZGF0YXB0ciwgaW50IF9fYmFuZCwgaW50IF9fZmxhZ3MpOworCisvKiBBdHRhY2ggYSBTVFJFQU1TLWJhc2VkIGZpbGUgZGVzY3JpcHRvciBGSUxERVMgdG8gYSBmaWxlIFBBVEggaW4gdGhlCisgICBmaWxlIHN5c3RlbSBuYW1lIHNwYWNlLiAgKi8KK2V4dGVybiBpbnQgZmF0dGFjaCAoaW50IF9fZmlsZGVzLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCkgX19USFJPVzsKKworLyogRGV0YWNoIGEgbmFtZSBQQVRIIGZyb20gYSBTVFJFQU1TLWJhc2VkIGZpbGUgZGVzY3JpcHRvci4gICovCitleHRlcm4gaW50IGZkZXRhY2ggKF9fY29uc3QgY2hhciAqX19wYXRoKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3Ryb3B0cy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9hY2wuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2FjbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMzQ3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9hY2wuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAgRmlsZTogc3lzL2FjbC5oCisKKyAgKEMpIDE5OTkgQW5kcmVhcyBHcnVlbmJhY2hlciwgPGEuZ3J1ZW5iYWNoZXJAY29tcHV0ZXIub3JnPgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gICB0aGUgR05VCisgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqLworCisjaWZuZGVmIF9fU1lTX0FDTF9ICisjZGVmaW5lIF9fU1lTX0FDTF9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKj09PSBEYXRhIHR5cGVzID09PSovCisKK3N0cnVjdCBfX2FjbF9leHQ7CitzdHJ1Y3QgX19hY2xfZW50cnlfZXh0Oworc3RydWN0IF9fYWNsX3Blcm1zZXRfZXh0OworCit0eXBlZGVmIHVuc2lnbmVkIGludAkJYWNsX3R5cGVfdDsKK3R5cGVkZWYgaW50CQkJYWNsX3RhZ190OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJCWFjbF9wZXJtX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9fYWNsX2V4dAkqYWNsX3Q7Cit0eXBlZGVmIHN0cnVjdCBfX2FjbF9lbnRyeV9leHQJKmFjbF9lbnRyeV90OwordHlwZWRlZiBzdHJ1Y3QgX19hY2xfcGVybXNldF9leHQgKmFjbF9wZXJtc2V0X3Q7CisKKy8qPT09IENvbnN0YW50cyA9PT0qLworCisvKiAyMy4yLjIgYWNsX3Blcm1fdCB2YWx1ZXMgKi8KKworI2RlZmluZSBBQ0xfUkVBRAkJKDB4MDQpCisjZGVmaW5lIEFDTF9XUklURQkJKDB4MDIpCisjZGVmaW5lIEFDTF9FWEVDVVRFCQkoMHgwMSkKKy8vI2RlZmluZSBBQ0xfQURECQkoMHgwOCkKKy8vI2RlZmluZSBBQ0xfREVMRVRFCQkoMHgxMCkKKworLyogMjMuMi41IGFjbF90YWdfdCB2YWx1ZXMgKi8KKworI2RlZmluZSBBQ0xfVU5ERUZJTkVEX1RBRwkoMHgwMCkKKyNkZWZpbmUgQUNMX1VTRVJfT0JKCQkoMHgwMSkKKyNkZWZpbmUgQUNMX1VTRVIJCSgweDAyKQorI2RlZmluZSBBQ0xfR1JPVVBfT0JKCQkoMHgwNCkKKyNkZWZpbmUgQUNMX0dST1VQCQkoMHgwOCkKKyNkZWZpbmUgQUNMX01BU0sJCSgweDEwKQorI2RlZmluZSBBQ0xfT1RIRVIJCSgweDIwKQorCisvKiAyMy4zLjYgYWNsX3R5cGVfdCB2YWx1ZXMgKi8KKworI2RlZmluZSBBQ0xfVFlQRV9BQ0NFU1MJCSgweDgwMDApCisjZGVmaW5lIEFDTF9UWVBFX0RFRkFVTFQJKDB4NDAwMCkKKworLyogMjMuMi43IEFDTCBxdWFsaWZpZXIgY29uc3RhbnRzICovCisKKyNkZWZpbmUgQUNMX1VOREVGSU5FRF9JRAkoKGlkX3QpLTEpCisKKy8qIDIzLjIuOCBBQ0wgRW50cnkgQ29uc3RhbnRzICovCisKKyNkZWZpbmUgQUNMX0ZJUlNUX0VOVFJZCQkwCisjZGVmaW5lIEFDTF9ORVhUX0VOVFJZCQkxCisKKy8qPT09IEFDTCBtYW5pcHVsYXRpb24gPT09Ki8KKworZXh0ZXJuIGFjbF90IGFjbF9pbml0KGludCBjb3VudCk7CitleHRlcm4gYWNsX3QgYWNsX2R1cChhY2xfdCBhY2wpOworZXh0ZXJuIGludCBhY2xfZnJlZSh2b2lkICpvYmpfcCk7CitleHRlcm4gaW50IGFjbF92YWxpZChhY2xfdCBhY2wpOworCisvKj09PSBFbnRyeSBtYW5pcHVsYXRpb24gPT09Ki8KKworZXh0ZXJuIGludAorYWNsX2NvcHlfZW50cnkoYWNsX2VudHJ5X3QgZGVzdF9kLCBhY2xfZW50cnlfdCBzcmNfZCk7CitleHRlcm4gaW50IGFjbF9jcmVhdGVfZW50cnkoYWNsX3QgKmFjbF9wLCBhY2xfZW50cnlfdCAqZW50cnlfcCk7CitleHRlcm4gaW50IGFjbF9kZWxldGVfZW50cnkoYWNsX3QgYWNsLCBhY2xfZW50cnlfdCBlbnRyeV9kKTsKK2V4dGVybiBpbnQgYWNsX2dldF9lbnRyeShhY2xfdCBhY2wsIGludCBlbnRyeV9pZCwgYWNsX2VudHJ5X3QgKmVudHJ5X3ApOworCisvKiBNYW5pcHVsYXRlIEFDTCBlbnRyeSBwZXJtaXNzaW9ucyAqLworCitleHRlcm4gaW50IGFjbF9hZGRfcGVybShhY2xfcGVybXNldF90IHBlcm1zZXRfZCwgYWNsX3Blcm1fdCBwZXJtKTsKK2V4dGVybiBpbnQgYWNsX2NhbGNfbWFzayhhY2xfdCAqYWNsX3ApOworZXh0ZXJuIGludCBhY2xfY2xlYXJfcGVybXMoYWNsX3Blcm1zZXRfdCBwZXJtc2V0X2QpOworZXh0ZXJuIGludCBhY2xfZGVsZXRlX3Blcm0oYWNsX3Blcm1zZXRfdCBwZXJtc2V0X2QsIGFjbF9wZXJtX3QgcGVybSk7CitleHRlcm4gaW50IGFjbF9nZXRfcGVybXNldChhY2xfZW50cnlfdCBlbnRyeV9kLCBhY2xfcGVybXNldF90ICpwZXJtc2V0X3ApOworZXh0ZXJuIGludCBhY2xfc2V0X3Blcm1zZXQoYWNsX2VudHJ5X3QgZW50cnlfZCwgYWNsX3Blcm1zZXRfdCBwZXJtc2V0X2QpOworCisvKiBNYW5pcHVsYXRlIEFDTCBlbnRyeSB0YWcgdHlwZSBhbmQgcXVhbGlmaWVyICovCisKK2V4dGVybiB2b2lkICogYWNsX2dldF9xdWFsaWZpZXIoYWNsX2VudHJ5X3QgZW50cnlfZCk7CitleHRlcm4gaW50IGFjbF9nZXRfdGFnX3R5cGUoYWNsX2VudHJ5X3QgZW50cnlfZCwgYWNsX3RhZ190ICp0YWdfdHlwZV9wKTsKK2V4dGVybiBpbnQgYWNsX3NldF9xdWFsaWZpZXIoYWNsX2VudHJ5X3QgZW50cnlfZCwgY29uc3Qgdm9pZCAqdGFnX3F1YWxpZmllcl9wKTsKK2V4dGVybiBpbnQgYWNsX3NldF90YWdfdHlwZShhY2xfZW50cnlfdCBlbnRyeV9kLCBhY2xfdGFnX3QgdGFnX3R5cGUpOworCisvKj09PSBGb3JtYXQgdHJhbnNsYXRpb24gPT09Ki8KKworZXh0ZXJuIHNzaXplX3QgYWNsX2NvcHlfZXh0KHZvaWQgKmJ1Zl9wLCBhY2xfdCBhY2wsIHNzaXplX3Qgc2l6ZSk7CitleHRlcm4gYWNsX3QgYWNsX2NvcHlfaW50KGNvbnN0IHZvaWQgKmJ1Zl9wKTsKK2V4dGVybiBhY2xfdCBhY2xfZnJvbV90ZXh0KGNvbnN0IGNoYXIgKmJ1Zl9wKTsKK2V4dGVybiBzc2l6ZV90IGFjbF9zaXplKGFjbF90IGFjbCk7CitleHRlcm4gY2hhciAqYWNsX3RvX3RleHQoYWNsX3QgYWNsLCBzc2l6ZV90ICpsZW5fcCk7CisKKy8qPT09IE9iamVjdCBtYW5pcHVsYXRpb24gPT09Ki8KKworZXh0ZXJuIGludCBhY2xfZGVsZXRlX2RlZl9maWxlKGNvbnN0IGNoYXIgKnBhdGhfcCk7CitleHRlcm4gYWNsX3QgYWNsX2dldF9mZChpbnQgZmQpOworZXh0ZXJuIGFjbF90IGFjbF9nZXRfZmlsZShjb25zdCBjaGFyICpwYXRoX3AsIGFjbF90eXBlX3QgdHlwZSk7CitleHRlcm4gaW50IGFjbF9zZXRfZmQoaW50IGZkLCBhY2xfdCBhY2wpOworZXh0ZXJuIGludCBhY2xfc2V0X2ZpbGUoY29uc3QgY2hhciAqcGF0aF9wLCBhY2xfdHlwZV90IHR5cGUsIGFjbF90IGFjbCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAgLyogX19TWVNfQUNMX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvYXNvdW5kbGliLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9hc291bmRsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2Y1ODdjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvYXNvdW5kbGliLmgKQEAgLTAsMCArMSwyIEBACisjd2FybmluZyBUaGlzIGhlYWRlciBpcyBkZXByZWNhdGVkLCB1c2UgPGFsc2EvYXNvdW5kbGliLmg+IGluc3RlYWQuCisjaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2NhcGFiaWxpdHkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2NhcGFiaWxpdHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjU0YWNjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvY2FwYWJpbGl0eS5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogPHN5cy9jYXBhYmlsaXR5Lmg+CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk3ICAgQWxlcGggT25lCisgKiBDb3B5cmlnaHQgKEMpIDE5OTctOCwyMDA4IEFuZHJldyBHLiBNb3JnYW4gPG1vcmdhbkBrZXJuZWwub3JnPgorICoKKyAqIGRlZnVuY3QgUE9TSVguMWUgU3RhbmRhcmQ6IDI1LjIgQ2FwYWJpbGl0aWVzICAgICAgICAgICA8c3lzL2NhcGFiaWxpdHkuaD4KKyAqLworCisjaWZuZGVmIF9TWVNfQ0FQQUJJTElUWV9ICisjZGVmaW5lIF9TWVNfQ0FQQUJJTElUWV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoKKyAqIFRoaXMgZmlsZSBjb21wbGVtZW50cyB0aGUga2VybmVsIGZpbGUgYnkgcHJvdmlkaW5nIHByb3RvdHlwZQorICogaW5mb3JtYXRpb24gZm9yIHRoZSB1c2VyIGxpYnJhcnkuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBSZXF1aXJlZCB0byBsaW1pdCB3aGF0IGdldHMgZGVmaW5lZCBpbiB0aGUga2VybmVsIGhlYWRlciBmaWxlLgorICovCisjaWZuZGVmIF9fdXNlcgorI2RlZmluZSBfX3VzZXIKKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKworLyoKKyAqIFBPU0lYIGNhcGFiaWxpdHkgdHlwZXMKKyAqLworCisvKgorICogT3BhcXVlIGNhcGFiaWxpdHkgaGFuZGxlIChkZWZpbmVkIGludGVybmFsbHkgYnkgbGliY2FwKQorICogaW50ZXJuYWwgY2FwYWJpbGl0eSByZXByZXNlbnRhdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCBfY2FwX3N0cnVjdCAqY2FwX3Q7CisKKy8qICJleHRlcm5hbCIgY2FwYWJpbGl0eSByZXByZXNlbnRhdGlvbiBpcyBhICh2b2lkICopICovCisKKy8qCisgKiBUaGlzIGlzIHRoZSB0eXBlIHVzZWQgdG8gaWRlbnRpZnkgY2FwYWJpbGl0aWVzCisgKi8KKwordHlwZWRlZiBpbnQgY2FwX3ZhbHVlX3Q7CisKKy8qCisgKiBTZXQgaWRlbnRpZmllcnMKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBDQVBfRUZGRUNUSVZFPTAsICAgICAgICAgICAgICAgICAgICAgICAgLyogU3BlY2lmaWVzIHRoZSBlZmZlY3RpdmUgZmxhZyAqLworICAgIENBUF9QRVJNSVRURUQ9MSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBTcGVjaWZpZXMgdGhlIHBlcm1pdHRlZCBmbGFnICovCisgICAgQ0FQX0lOSEVSSVRBQkxFPTIgICAgICAgICAgICAgICAgICAgICAvKiBTcGVjaWZpZXMgdGhlIGluaGVyaXRhYmxlIGZsYWcgKi8KK30gY2FwX2ZsYWdfdDsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgc3RhdGVzIGF2YWlsYWJsZSB0byBlYWNoIGNhcGFiaWxpdHkKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBDQVBfQ0xFQVI9MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGZsYWcgaXMgY2xlYXJlZC9kaXNhYmxlZCAqLworICAgIENBUF9TRVQ9MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBmbGFnIGlzIHNldC9lbmFibGVkICovCit9IGNhcF9mbGFnX3ZhbHVlX3Q7CisKKy8qCisgKiBVc2VyLXNwYWNlIGNhcGFiaWxpdHkgbWFuaXB1bGF0aW9uIHJvdXRpbmVzCisgKi8KKworLyogbGliY2FwL2NhcF9hbGxvYy5jICovCitleHRlcm4gY2FwX3QgICBjYXBfZHVwKGNhcF90KTsKK2V4dGVybiBpbnQgICAgIGNhcF9mcmVlKHZvaWQgKik7CitleHRlcm4gY2FwX3QgICBjYXBfaW5pdCh2b2lkKTsKKworLyogbGliY2FwL2NhcF9mbGFnLmMgKi8KK2V4dGVybiBpbnQgICAgIGNhcF9nZXRfZmxhZyhjYXBfdCwgY2FwX3ZhbHVlX3QsIGNhcF9mbGFnX3QsIGNhcF9mbGFnX3ZhbHVlX3QgKik7CitleHRlcm4gaW50ICAgICBjYXBfc2V0X2ZsYWcoY2FwX3QsIGNhcF9mbGFnX3QsIGludCwgY29uc3QgY2FwX3ZhbHVlX3QgKiwKKwkJCSAgICBjYXBfZmxhZ192YWx1ZV90KTsKK2V4dGVybiBpbnQgICAgIGNhcF9jbGVhcihjYXBfdCk7CitleHRlcm4gaW50ICAgICBjYXBfY2xlYXJfZmxhZyhjYXBfdCwgY2FwX2ZsYWdfdCk7CisKKy8qIGxpYmNhcC9jYXBfZmlsZS5jICovCitleHRlcm4gY2FwX3QgICBjYXBfZ2V0X2ZkKGludCk7CitleHRlcm4gY2FwX3QgICBjYXBfZ2V0X2ZpbGUoY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgICAgIGNhcF9zZXRfZmQoaW50LCBjYXBfdCk7CitleHRlcm4gaW50ICAgICBjYXBfc2V0X2ZpbGUoY29uc3QgY2hhciAqLCBjYXBfdCk7CisKKy8qIGxpYmNhcC9jYXBfcHJvYy5jICovCitleHRlcm4gY2FwX3QgICBjYXBfZ2V0X3Byb2Modm9pZCk7CitleHRlcm4gY2FwX3QgICBjYXBfZ2V0X3BpZChwaWRfdCk7CitleHRlcm4gaW50ICAgICBjYXBfc2V0X3Byb2MoY2FwX3QpOworCitleHRlcm4gaW50ICAgICBjYXBfZ2V0X2JvdW5kKGNhcF92YWx1ZV90KTsKK2V4dGVybiBpbnQgICAgIGNhcF9kcm9wX2JvdW5kKGNhcF92YWx1ZV90KTsKKworI2RlZmluZSBDQVBfSVNfU1VQUE9SVEVEKGNhcCkgIChjYXBfZ2V0X2JvdW5kKGNhcCkgPj0gMCkKKworLyogbGliY2FwL2NhcF9leHRpbnQuYyAqLworZXh0ZXJuIHNzaXplX3QgY2FwX3NpemUoY2FwX3QpOworZXh0ZXJuIHNzaXplX3QgY2FwX2NvcHlfZXh0KHZvaWQgKiwgY2FwX3QsIHNzaXplX3QpOworZXh0ZXJuIGNhcF90ICAgY2FwX2NvcHlfaW50KGNvbnN0IHZvaWQgKik7CisKKy8qIGxpYmNhcC9jYXBfdGV4dC5jICovCitleHRlcm4gY2FwX3QgICBjYXBfZnJvbV90ZXh0KGNvbnN0IGNoYXIgKik7CitleHRlcm4gY2hhciAqICBjYXBfdG9fdGV4dChjYXBfdCwgc3NpemVfdCAqKTsKK2V4dGVybiBpbnQgICAgIGNhcF9mcm9tX25hbWUoY29uc3QgY2hhciAqLCBjYXBfdmFsdWVfdCAqKTsKK2V4dGVybiBjaGFyICogIGNhcF90b19uYW1lKGNhcF92YWx1ZV90KTsKKworI2RlZmluZSBDQVBfRElGRkVSUyhyZXN1bHQsIGZsYWcpICAoKChyZXN1bHQpICYgKDEgPDwgKGZsYWcpKSkgIT0gMCkKK2V4dGVybiBpbnQgICAgIGNhcF9jb21wYXJlKGNhcF90LCBjYXBfdCk7CisKKy8qIHN5c3RlbSBjYWxscyAtIGxvb2sgdG8gbGliYyBmb3IgZnVuY3Rpb24gdG8gc3lzdGVtIGNhbGwgbWFwcGluZyAqLworZXh0ZXJuIGludCBjYXBzZXQoY2FwX3VzZXJfaGVhZGVyX3QgaGVhZGVyLCBjYXBfdXNlcl9kYXRhX3QgZGF0YSk7CitleHRlcm4gaW50IGNhcGdldChjYXBfdXNlcl9oZWFkZXJfdCBoZWFkZXIsIGNvbnN0IGNhcF91c2VyX2RhdGFfdCBkYXRhKTsKKworLyogZGVwcmVjYXRlZCAtIHVzZSBjYXBfZ2V0X3BpZCgpICovCitleHRlcm4gaW50IGNhcGdldHAocGlkX3QgcGlkLCBjYXBfdCBjYXBfZCk7CisKKy8qIG5vdCB2YWxpZCB3aXRoIGZpbGVzeXN0ZW0gY2FwYWJpbGl0eSBzdXBwb3J0IC0gdXNlIGNhcF9zZXRfcHJvYygpICovCitleHRlcm4gaW50IGNhcHNldHAocGlkX3QgcGlkLCBjYXBfdCBjYXBfZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1lTX0NBUEFCSUxJVFlfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXNjYWxsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5c2NhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzMwNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXNjYWxsLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5c2V4aXRzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5c2V4aXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcyNDZiNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzZXhpdHMuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4NywgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylzeXNleGl0cy5oCTguMSAoQmVya2VsZXkpIDYvMi85MworICovCisKKyNpZm5kZWYJX1NZU0VYSVRTX0gKKyNkZWZpbmUJX1NZU0VYSVRTX0ggMQorCisvKgorICogIFNZU0VYSVRTLkggLS0gRXhpdCBzdGF0dXMgY29kZXMgZm9yIHN5c3RlbSBwcm9ncmFtcy4KKyAqCisgKglUaGlzIGluY2x1ZGUgZmlsZSBhdHRlbXB0cyB0byBjYXRlZ29yaXplIHBvc3NpYmxlIGVycm9yCisgKglleGl0IHN0YXR1c2VzIGZvciBzeXN0ZW0gcHJvZ3JhbXMsIG5vdGFibHkgZGVsaXZlcm1haWwKKyAqCWFuZCB0aGUgQmVya2VsZXkgbmV0d29yay4KKyAqCisgKglFcnJvciBudW1iZXJzIGJlZ2luIGF0IEVYX19CQVNFIHRvIHJlZHVjZSB0aGUgcG9zc2liaWxpdHkgb2YKKyAqCWNsYXNoaW5nIHdpdGggb3RoZXIgZXhpdCBzdGF0dXNlcyB0aGF0IHJhbmRvbSBwcm9ncmFtcyBtYXkKKyAqCWFscmVhZHkgcmV0dXJuLiAgVGhlIG1lYW5pbmcgb2YgdGhlIGNvZGVzIGlzIGFwcHJveGltYXRlbHkKKyAqCWFzIGZvbGxvd3M6CisgKgorICoJRVhfVVNBR0UgLS0gVGhlIGNvbW1hbmQgd2FzIHVzZWQgaW5jb3JyZWN0bHksIGUuZy4sIHdpdGgKKyAqCQl0aGUgd3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cywgYSBiYWQgZmxhZywgYSBiYWQKKyAqCQlzeW50YXggaW4gYSBwYXJhbWV0ZXIsIG9yIHdoYXRldmVyLgorICoJRVhfREFUQUVSUiAtLSBUaGUgaW5wdXQgZGF0YSB3YXMgaW5jb3JyZWN0IGluIHNvbWUgd2F5LgorICoJCVRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgdXNlcidzIGRhdGEgJiBub3QKKyAqCQlzeXN0ZW0gZmlsZXMuCisgKglFWF9OT0lOUFVUIC0tIEFuIGlucHV0IGZpbGUgKG5vdCBhIHN5c3RlbSBmaWxlKSBkaWQgbm90CisgKgkJZXhpc3Qgb3Igd2FzIG5vdCByZWFkYWJsZS4gIFRoaXMgY291bGQgYWxzbyBpbmNsdWRlCisgKgkJZXJyb3JzIGxpa2UgIk5vIG1lc3NhZ2UiIHRvIGEgbWFpbGVyIChpZiBpdCBjYXJlZAorICoJCXRvIGNhdGNoIGl0KS4KKyAqCUVYX05PVVNFUiAtLSBUaGUgdXNlciBzcGVjaWZpZWQgZGlkIG5vdCBleGlzdC4gIFRoaXMgbWlnaHQKKyAqCQliZSB1c2VkIGZvciBtYWlsIGFkZHJlc3NlcyBvciByZW1vdGUgbG9naW5zLgorICoJRVhfTk9IT1NUIC0tIFRoZSBob3N0IHNwZWNpZmllZCBkaWQgbm90IGV4aXN0LiAgVGhpcyBpcyB1c2VkCisgKgkJaW4gbWFpbCBhZGRyZXNzZXMgb3IgbmV0d29yayByZXF1ZXN0cy4KKyAqCUVYX1VOQVZBSUxBQkxFIC0tIEEgc2VydmljZSBpcyB1bmF2YWlsYWJsZS4gIFRoaXMgY2FuIG9jY3VyCisgKgkJaWYgYSBzdXBwb3J0IHByb2dyYW0gb3IgZmlsZSBkb2VzIG5vdCBleGlzdC4gIFRoaXMKKyAqCQljYW4gYWxzbyBiZSB1c2VkIGFzIGEgY2F0Y2hhbGwgbWVzc2FnZSB3aGVuIHNvbWV0aGluZworICoJCXlvdSB3YW50ZWQgdG8gZG8gZG9lc24ndCB3b3JrLCBidXQgeW91IGRvbid0IGtub3cKKyAqCQl3aHkuCisgKglFWF9TT0ZUV0FSRSAtLSBBbiBpbnRlcm5hbCBzb2Z0d2FyZSBlcnJvciBoYXMgYmVlbiBkZXRlY3RlZC4KKyAqCQlUaGlzIHNob3VsZCBiZSBsaW1pdGVkIHRvIG5vbi1vcGVyYXRpbmcgc3lzdGVtIHJlbGF0ZWQKKyAqCQllcnJvcnMgYXMgcG9zc2libGUuCisgKglFWF9PU0VSUiAtLSBBbiBvcGVyYXRpbmcgc3lzdGVtIGVycm9yIGhhcyBiZWVuIGRldGVjdGVkLgorICoJCVRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3Igc3VjaCB0aGluZ3MgYXMgImNhbm5vdAorICoJCWZvcmsiLCAiY2Fubm90IGNyZWF0ZSBwaXBlIiwgb3IgdGhlIGxpa2UuICBJdCBpbmNsdWRlcworICoJCXRoaW5ncyBsaWtlIGdldHVpZCByZXR1cm5pbmcgYSB1c2VyIHRoYXQgZG9lcyBub3QKKyAqCQlleGlzdCBpbiB0aGUgcGFzc3dkIGZpbGUuCisgKglFWF9PU0ZJTEUgLS0gU29tZSBzeXN0ZW0gZmlsZSAoZS5nLiwgL2V0Yy9wYXNzd2QsIC9ldGMvdXRtcCwKKyAqCQlldGMuKSBkb2VzIG5vdCBleGlzdCwgY2Fubm90IGJlIG9wZW5lZCwgb3IgaGFzIHNvbWUKKyAqCQlzb3J0IG9mIGVycm9yIChlLmcuLCBzeW50YXggZXJyb3IpLgorICoJRVhfQ0FOVENSRUFUIC0tIEEgKHVzZXIgc3BlY2lmaWVkKSBvdXRwdXQgZmlsZSBjYW5ub3QgYmUKKyAqCQljcmVhdGVkLgorICoJRVhfSU9FUlIgLS0gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZG9pbmcgSS9PIG9uIHNvbWUgZmlsZS4KKyAqCUVYX1RFTVBGQUlMIC0tIHRlbXBvcmFyeSBmYWlsdXJlLCBpbmRpY2F0aW5nIHNvbWV0aGluZyB0aGF0CisgKgkJaXMgbm90IHJlYWxseSBhbiBlcnJvci4gIEluIHNlbmRtYWlsLCB0aGlzIG1lYW5zCisgKgkJdGhhdCBhIG1haWxlciAoZS5nLikgY291bGQgbm90IGNyZWF0ZSBhIGNvbm5lY3Rpb24sCisgKgkJYW5kIHRoZSByZXF1ZXN0IHNob3VsZCBiZSByZWF0dGVtcHRlZCBsYXRlci4KKyAqCUVYX1BST1RPQ09MIC0tIHRoZSByZW1vdGUgc3lzdGVtIHJldHVybmVkIHNvbWV0aGluZyB0aGF0CisgKgkJd2FzICJub3QgcG9zc2libGUiIGR1cmluZyBhIHByb3RvY29sIGV4Y2hhbmdlLgorICoJRVhfTk9QRVJNIC0tIFlvdSBkaWQgbm90IGhhdmUgc3VmZmljaWVudCBwZXJtaXNzaW9uIHRvCisgKgkJcGVyZm9ybSB0aGUgb3BlcmF0aW9uLiAgVGhpcyBpcyBub3QgaW50ZW5kZWQgZm9yCisgKgkJZmlsZSBzeXN0ZW0gcHJvYmxlbXMsIHdoaWNoIHNob3VsZCB1c2UgTk9JTlBVVCBvcgorICoJCUNBTlRDUkVBVCwgYnV0IHJhdGhlciBmb3IgaGlnaGVyIGxldmVsIHBlcm1pc3Npb25zLgorICovCisKKyNkZWZpbmUgRVhfT0sJCTAJLyogc3VjY2Vzc2Z1bCB0ZXJtaW5hdGlvbiAqLworCisjZGVmaW5lIEVYX19CQVNFCTY0CS8qIGJhc2UgdmFsdWUgZm9yIGVycm9yIG1lc3NhZ2VzICovCisKKyNkZWZpbmUgRVhfVVNBR0UJNjQJLyogY29tbWFuZCBsaW5lIHVzYWdlIGVycm9yICovCisjZGVmaW5lIEVYX0RBVEFFUlIJNjUJLyogZGF0YSBmb3JtYXQgZXJyb3IgKi8KKyNkZWZpbmUgRVhfTk9JTlBVVAk2NgkvKiBjYW5ub3Qgb3BlbiBpbnB1dCAqLworI2RlZmluZSBFWF9OT1VTRVIJNjcJLyogYWRkcmVzc2VlIHVua25vd24gKi8KKyNkZWZpbmUgRVhfTk9IT1NUCTY4CS8qIGhvc3QgbmFtZSB1bmtub3duICovCisjZGVmaW5lIEVYX1VOQVZBSUxBQkxFCTY5CS8qIHNlcnZpY2UgdW5hdmFpbGFibGUgKi8KKyNkZWZpbmUgRVhfU09GVFdBUkUJNzAJLyogaW50ZXJuYWwgc29mdHdhcmUgZXJyb3IgKi8KKyNkZWZpbmUgRVhfT1NFUlIJNzEJLyogc3lzdGVtIGVycm9yIChlLmcuLCBjYW4ndCBmb3JrKSAqLworI2RlZmluZSBFWF9PU0ZJTEUJNzIJLyogY3JpdGljYWwgT1MgZmlsZSBtaXNzaW5nICovCisjZGVmaW5lIEVYX0NBTlRDUkVBVAk3MwkvKiBjYW4ndCBjcmVhdGUgKHVzZXIpIG91dHB1dCBmaWxlICovCisjZGVmaW5lIEVYX0lPRVJSCTc0CS8qIGlucHV0L291dHB1dCBlcnJvciAqLworI2RlZmluZSBFWF9URU1QRkFJTAk3NQkvKiB0ZW1wIGZhaWx1cmU7IHVzZXIgaXMgaW52aXRlZCB0byByZXRyeSAqLworI2RlZmluZSBFWF9QUk9UT0NPTAk3NgkvKiByZW1vdGUgZXJyb3IgaW4gcHJvdG9jb2wgKi8KKyNkZWZpbmUgRVhfTk9QRVJNCTc3CS8qIHBlcm1pc3Npb24gZGVuaWVkICovCisjZGVmaW5lIEVYX0NPTkZJRwk3OAkvKiBjb25maWd1cmF0aW9uIGVycm9yICovCisKKyNkZWZpbmUgRVhfX01BWAk3OAkvKiBtYXhpbXVtIGxpc3RlZCB2YWx1ZSAqLworCisjZW5kaWYgLyogc3lzZXhpdHMuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXNsb2cuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMwYjQ5MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzbG9nLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPHN5cy9zeXNsb2cuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGFyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3Rhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZmVmNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3Rhci5oCkBAIC0wLDAgKzEsMTA4IEBACisvKiBFeHRlbmRlZCB0YXIgZm9ybWF0IGZyb20gUE9TSVguMS4KKyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgV3JpdHRlbiBieSBEYXZpZCBKLiBNYWNLZW56aWUuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9UQVJfSAorI2RlZmluZQlfVEFSX0gJMQorCisvKiBBIHRhciBhcmNoaXZlIGNvbnNpc3RzIG9mIDUxMi1ieXRlIGJsb2Nrcy4KKyAgIEVhY2ggZmlsZSBpbiB0aGUgYXJjaGl2ZSBoYXMgYSBoZWFkZXIgYmxvY2sgZm9sbG93ZWQgYnkgMCsgZGF0YSBibG9ja3MuCisgICBUd28gYmxvY2tzIG9mIE5VTCBieXRlcyBpbmRpY2F0ZSB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLiAgKi8KKworLyogVGhlIGZpZWxkcyBvZiBoZWFkZXIgYmxvY2tzOgorICAgQWxsIHN0cmluZ3MgYXJlIHN0b3JlZCBhcyBJU08gNjQ2IChhcHByb3hpbWF0ZWx5IEFTQ0lJKSBzdHJpbmdzLgorCisgICBGaWVsZHMgYXJlIG51bWVyaWMgdW5sZXNzIG90aGVyd2lzZSBub3RlZCBiZWxvdzsgbnVtYmVycyBhcmUgSVNPIDY0NgorICAgcmVwcmVzZW50YXRpb25zIG9mIG9jdGFsIG51bWJlcnMsIHdpdGggbGVhZGluZyB6ZXJvcyBhcyBuZWVkZWQuCisKKyAgIGxpbmtuYW1lIGlzIG9ubHkgdmFsaWQgd2hlbiB0eXBlZmxhZz09TE5LVFlQRS4gIEl0IGRvZXNuJ3QgdXNlIHByZWZpeDsKKyAgIGZpbGVzIHRoYXQgYXJlIGxpbmtzIHRvIHBhdGhuYW1lcyA+MTAwIGNoYXJzIGxvbmcgY2FuIG5vdCBiZSBzdG9yZWQKKyAgIGluIGEgdGFyIGFyY2hpdmUuCisKKyAgIElmIHR5cGVmbGFnPT17TE5LVFlQRSxTWU1UWVBFLERJUlRZUEV9IHRoZW4gc2l6ZSBtdXN0IGJlIDAuCisKKyAgIGRldm1ham9yIGFuZCBkZXZtaW5vciBhcmUgb25seSB2YWxpZCBmb3IgdHlwZWZsYWc9PXtCTEtUWVBFLENIUlRZUEV9LgorCisgICBjaGtzdW0gY29udGFpbnMgdGhlIHN1bSBvZiBhbGwgNTEyIGJ5dGVzIGluIHRoZSBoZWFkZXIgYmxvY2ssCisgICB0cmVhdGluZyBlYWNoIGJ5dGUgYXMgYW4gOC1iaXQgdW5zaWduZWQgdmFsdWUgYW5kIHRyZWF0aW5nIHRoZQorICAgOCBieXRlcyBvZiBjaGtzdW0gYXMgYmxhbmsgY2hhcmFjdGVycy4KKworICAgdW5hbWUgYW5kIGduYW1lIGFyZSB1c2VkIGluIHByZWZlcmVuY2UgdG8gdWlkIGFuZCBnaWQsIGlmIHRob3NlCisgICBuYW1lcyBleGlzdCBsb2NhbGx5LgorCisgICBGaWVsZCBOYW1lCUJ5dGUgT2Zmc2V0CUxlbmd0aCBpbiBCeXRlcwlGaWVsZCBUeXBlCisgICBuYW1lCQkwCQkxMDAJCU5VTC10ZXJtaW5hdGVkIGlmIE5VTCBmaXRzCisgICBtb2RlCQkxMDAJCTgKKyAgIHVpZAkJMTA4CQk4CisgICBnaWQJCTExNgkJOAorICAgc2l6ZQkJMTI0CQkxMgorICAgbXRpbWUJMTM2CQkxMgorICAgY2hrc3VtCTE0OAkJOAorICAgdHlwZWZsYWcJMTU2CQkxCQlzZWUgYmVsb3cKKyAgIGxpbmtuYW1lCTE1NwkJMTAwCQlOVUwtdGVybWluYXRlZCBpZiBOVUwgZml0cworICAgbWFnaWMJMjU3CQk2CQltdXN0IGJlIFRNQUdJQyAoTlVMIHRlcm0uKQorICAgdmVyc2lvbgkyNjMJCTIJCW11c3QgYmUgVFZFUlNJT04KKyAgIHVuYW1lCTI2NQkJMzIJCU5VTC10ZXJtaW5hdGVkCisgICBnbmFtZQkyOTcJCTMyCQlOVUwtdGVybWluYXRlZAorICAgZGV2bWFqb3IJMzI5CQk4CisgICBkZXZtaW5vcgkzMzcJCTgKKyAgIHByZWZpeAkzNDUJCTE1NQkJTlVMLXRlcm1pbmF0ZWQgaWYgTlVMIGZpdHMKKworICAgSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBwcmVmaXggaXMgJ1wwJywgdGhlIGZpbGUgbmFtZSBpcyBuYW1lOworICAgb3RoZXJ3aXNlLCBpdCBpcyBwcmVmaXgvbmFtZS4gIEZpbGVzIHdob3NlIHBhdGhuYW1lcyBkb24ndCBmaXQgaW4gdGhhdAorICAgbGVuZ3RoIGNhbiBub3QgYmUgc3RvcmVkIGluIGEgdGFyIGFyY2hpdmUuICAqLworCisvKiBUaGUgYml0cyBpbiBtb2RlOiAqLworI2RlZmluZSBUU1VJRAkwNDAwMAorI2RlZmluZSBUU0dJRAkwMjAwMAorI2RlZmluZSBUU1ZUWAkwMTAwMAorI2RlZmluZSBUVVJFQUQJMDA0MDAKKyNkZWZpbmUgVFVXUklURQkwMDIwMAorI2RlZmluZSBUVUVYRUMJMDAxMDAKKyNkZWZpbmUgVEdSRUFECTAwMDQwCisjZGVmaW5lIFRHV1JJVEUJMDAwMjAKKyNkZWZpbmUgVEdFWEVDCTAwMDEwCisjZGVmaW5lIFRPUkVBRAkwMDAwNAorI2RlZmluZSBUT1dSSVRFCTAwMDAyCisjZGVmaW5lIFRPRVhFQwkwMDAwMQorCisvKiBUaGUgdmFsdWVzIGZvciB0eXBlZmxhZzoKKyAgIFZhbHVlcyAnQSctJ1onIGFyZSByZXNlcnZlZCBmb3IgY3VzdG9tIGltcGxlbWVudGF0aW9ucy4KKyAgIEFsbCBvdGhlciB2YWx1ZXMgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgUE9TSVguMSByZXZpc2lvbnMuICAqLworCisjZGVmaW5lIFJFR1RZUEUJCScwJwkvKiBSZWd1bGFyIGZpbGUgKHByZWZlcnJlZCBjb2RlKS4gICovCisjZGVmaW5lIEFSRUdUWVBFCSdcMCcJLyogUmVndWxhciBmaWxlIChhbHRlcm5hdGUgY29kZSkuICAqLworI2RlZmluZSBMTktUWVBFCQknMScJLyogSGFyZCBsaW5rLiAgKi8KKyNkZWZpbmUgU1lNVFlQRQkJJzInCS8qIFN5bWJvbGljIGxpbmsgKGhhcmQgaWYgbm90IHN1cHBvcnRlZCkuICAqLworI2RlZmluZSBDSFJUWVBFCQknMycJLyogQ2hhcmFjdGVyIHNwZWNpYWwuICAqLworI2RlZmluZSBCTEtUWVBFCQknNCcJLyogQmxvY2sgc3BlY2lhbC4gICovCisjZGVmaW5lIERJUlRZUEUJCSc1JwkvKiBEaXJlY3RvcnkuICAqLworI2RlZmluZSBGSUZPVFlQRQknNicJLyogTmFtZWQgcGlwZS4gICovCisjZGVmaW5lIENPTlRUWVBFCSc3JwkvKiBDb250aWd1b3VzIGZpbGUgKi8KKyAvKiAocmVndWxhciBmaWxlIGlmIG5vdCBzdXBwb3J0ZWQpLiAgKi8KKworLyogQ29udGVudHMgb2YgbWFnaWMgZmllbGQgYW5kIGl0cyBsZW5ndGguICAqLworI2RlZmluZSBUTUFHSUMJInVzdGFyIgorI2RlZmluZSBUTUFHTEVOCTYKKworLyogQ29udGVudHMgb2YgdGhlIHZlcnNpb24gZmllbGQgYW5kIGl0cyBsZW5ndGguICAqLworI2RlZmluZSBUVkVSU0lPTgkiMDAiCisjZGVmaW5lIFRWRVJTTEVOCTIKKworI2VuZGlmIC8qIHRhci5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3Rlcm0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGVybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMDZkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3Rlcm0uaApAQCAtMCwwICsxLDgzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA5LDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgICoKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgICAgICAgICAgICAqCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nICAgICAgKgorICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAgICAgICoKKyAqIGRpc3RyaWJ1dGUsIGRpc3RyaWJ1dGUgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgICAgICAqCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgICAgKgorICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAgKgorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgKgorICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiAgICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgKgorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SICAgICoKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAqCisgKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAqCisgKiBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSAgICAgKgorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuICAgICAgICoKKyAqIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBBdXRob3I6IFpleWQgTS4gQmVuLUhhbGltIDx6bWJlbmhhbEBuZXRjb20uY29tPiAxOTkyLDE5OTUgICAgICAgICAgICAgICAgKi8KKy8qICAgIGFuZDogRXJpYyBTLiBSYXltb25kIDxlc3JAc25hcmsudGh5cnN1cy5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgYW5kOiBUaG9tYXMgRS4gRGlja2V5ICAgICAgICAgICAgICAgICAgICAgICAgMTk5NS1vbiAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogJElkOiBNS3Rlcm0uaC5hd2suaW4sdiAxLjU4IDIwMTAvMDEvMDkgMTk6NTM6MjYgdG9tIEV4cCAkICovCisKKy8qCisqKgl0ZXJtLmggLS0gRGVmaW5pdGlvbiBvZiBzdHJ1Y3QgdGVybQorKi8KKworI2lmbmRlZiBOQ1VSU0VTX1RFUk1fSF9pbmNsCisjZGVmaW5lIE5DVVJTRVNfVEVSTV9IX2luY2wgMQorCisjdW5kZWYgIE5DVVJTRVNfVkVSU0lPTgorI2RlZmluZSBOQ1VSU0VTX1ZFUlNJT04gIjUuOSIKKworI2luY2x1ZGUgPG5jdXJzZXNfZGxsLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogTWFrZSB0aGlzIGZpbGUgc2VsZi1jb250YWluZWQgYnkgcHJvdmlkaW5nIGRlZmF1bHRzIGZvciB0aGUgSEFWRV9URVJNSU9bU11fSAorICogZGVmaW5pdGlvbiAoYmFzZWQgb24gdGhlIHN5c3RlbSBmb3Igd2hpY2ggdGhpcyB3YXMgY29uZmlndXJlZCkuCisgKi8KKworI3VuZGVmICBOQ1VSU0VTX0NPTlNUCisjZGVmaW5lIE5DVVJTRVNfQ09OU1QgY29uc3QKKworI3VuZGVmICBOQ1VSU0VTX1NCT09MCisjZGVmaW5lIE5DVVJTRVNfU0JPT0wgY2hhcgorCisjdW5kZWYgIE5DVVJTRVNfWE5BTUVTCisjZGVmaW5lIE5DVVJTRVNfWE5BTUVTIDEKKworLyogV2Ugd2lsbCB1c2UgdGhlc2Ugc3ltYm9scyB0byBoaWRlIGRpZmZlcmVuY2VzIGJldHdlZW4KKyAqIHRlcm1pb3MvdGVybWlvL3NndHR5YiBpbnRlcmZhY2VzLgorICovCisjdW5kZWYgIFRUWQorI3VuZGVmICBTRVRfVFRZCisjdW5kZWYgIEdFVF9UVFkKKworLyogQXNzdW1lIFBPU0lYIHRlcm1pbyBpZiB3ZSBoYXZlIHRoZSBoZWFkZXIgYW5kIGZ1bmN0aW9uICovCisvKiAjaWYgSEFWRV9URVJNSU9TX0ggJiYgSEFWRV9UQ0dFVEFUVFIgKi8KKyNpZiAxICYmIDEKKworI3VuZGVmICBURVJNSU9TCisjZGVmaW5lIFRFUk1JT1MgMQorCisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2RlZmluZSBUVFkgc3RydWN0IHRlcm1pb3MKKworI2Vsc2UgLyogIUhBVkVfVEVSTUlPU19IICovCisKKy8qICNpZiBIQVZFX1RFUk1JT19IICovCisjaWYgMQorCisjdW5kZWYgIFRFUk1JT1MKKyNkZWZpbmUgVEVSTUlPUyAxCisKKyNpbmNsdWRlIDx0ZXJtaW8uaD4KKyNkZWZpbmUgVFRZIHN0cnVjdCB0ZXJtaW8KKworLyogQWRkIGRlZmluaXRpb25zIHRvIG1ha2UgdGVybWlvIGxvb2sgbGlrZSB0ZXJtaW9zLgorICogQnV0IGlmZGVmIGl0LCBzaW5jZSB0aGVyZSBhcmUgc29tZSBpbXBsZW1lbnRhdGlvbnMKKyAqIHRoYXQgdHJ5IHRvIGRvIHRoaXMgZm9yIHVzIGluIGEgZmFrZSA8dGVybWlvLmg+LgorICovCisjaWZuZGVmIFRDU0FOT1cKKyNkZWZpbmUgVENTQU5PVyBUQ1NFVEEKKyNlbmRpZgorI2lmbmRlZiBUQ1NBRFJBSU4KKyNkZWZpbmUgVENTQURSQUlOIFRDU0VUQVcKKyNlbmRpZgorI2lmbmRlZiBUQ1NBRkxVU0gKKyNkZWZpbmUgVENTQUZMVVNIIFRDU0VUQUYKKyNlbmRpZgorI2lmbmRlZiB0Y3NldGF0dHIKKyNkZWZpbmUgdGNzZXRhdHRyKGZkLCBjbWQsIGFyZykgaW9jdGwoZmQsIGNtZCwgYXJnKQorI2VuZGlmCisjaWZuZGVmIHRjZ2V0YXR0cgorI2RlZmluZSB0Y2dldGF0dHIoZmQsIGFyZykgaW9jdGwoZmQsIFRDR0VUQSwgYXJnKQorI2VuZGlmCisjaWZuZGVmIGNmZ2V0b3NwZWVkCisjZGVmaW5lIGNmZ2V0b3NwZWVkKHQpICgodCktPmNfY2ZsYWcgJiBDQkFVRCkKKyNlbmRpZgorI2lmbmRlZiBUQ0lGTFVTSCAKKyNkZWZpbmUgVENJRkxVU0ggMAorI2VuZGlmCisjaWZuZGVmIFRDT0ZMVVNIIAorI2RlZmluZSBUQ09GTFVTSCAxCisjZW5kaWYKKyNpZm5kZWYgVENJT0ZMVVNIIAorI2RlZmluZSBUQ0lPRkxVU0ggMgorI2VuZGlmCisjaWZuZGVmIHRjZmx1c2gKKyNkZWZpbmUgdGNmbHVzaChmZCwgYXJnKSBpb2N0bChmZCwgVENGTFNILCBhcmcpCisjZW5kaWYKKworI2Vsc2UgLyogIUhBVkVfVEVSTUlPX0ggKi8KKworI2lmIF9fTUlOR1czMl9fCisjICBpbmNsdWRlIDxuY3Vyc2VzX21pbmd3Lmg+CisjICBkZWZpbmUgVFRZIHN0cnVjdCB0ZXJtaW9zCisjZWxzZQorI3VuZGVmIFRFUk1JT1MKKyNpbmNsdWRlIDxzZ3R0eS5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2RlZmluZSBUVFkgc3RydWN0IHNndHR5YgorI2VuZGlmIC8qIE1JTkdXMzIgKi8KKyNlbmRpZiAvKiBIQVZFX1RFUk1JT19IICovCisKKyNlbmRpZiAvKiBIQVZFX1RFUk1JT1NfSCAqLworCisjaWZkZWYgVEVSTUlPUworI2RlZmluZSBHRVRfVFRZKGZkLCBidWYpIHRjZ2V0YXR0cihmZCwgYnVmKQorI2RlZmluZSBTRVRfVFRZKGZkLCBidWYpIHRjc2V0YXR0cihmZCwgVENTQURSQUlOLCBidWYpCisjZWxzZQorI2RlZmluZSBHRVRfVFRZKGZkLCBidWYpIGd0dHkoZmQsIGJ1ZikKKyNkZWZpbmUgU0VUX1RUWShmZCwgYnVmKSBzdHR5KGZkLCBidWYpCisjZW5kaWYKKworI2RlZmluZSBOQU1FU0laRSAyNTYKKworI2RlZmluZSBDVVIgY3VyX3Rlcm0tPnR5cGUuCisKKyNkZWZpbmUgYXV0b19sZWZ0X21hcmdpbiAgICAgICAgICAgICAgIENVUiBCb29sZWFuc1swXQorI2RlZmluZSBhdXRvX3JpZ2h0X21hcmdpbiAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzFdCisjZGVmaW5lIG5vX2VzY19jdGxjICAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMl0KKyNkZWZpbmUgY2VvbF9zdGFuZG91dF9nbGl0Y2ggICAgICAgICAgIENVUiBCb29sZWFuc1szXQorI2RlZmluZSBlYXRfbmV3bGluZV9nbGl0Y2ggICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzRdCisjZGVmaW5lIGVyYXNlX292ZXJzdHJpa2UgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbNV0KKyNkZWZpbmUgZ2VuZXJpY190eXBlICAgICAgICAgICAgICAgICAgIENVUiBCb29sZWFuc1s2XQorI2RlZmluZSBoYXJkX2NvcHkgICAgICAgICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzddCisjZGVmaW5lIGhhc19tZXRhX2tleSAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbOF0KKyNkZWZpbmUgaGFzX3N0YXR1c19saW5lICAgICAgICAgICAgICAgIENVUiBCb29sZWFuc1s5XQorI2RlZmluZSBpbnNlcnRfbnVsbF9nbGl0Y2ggICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzEwXQorI2RlZmluZSBtZW1vcnlfYWJvdmUgICAgICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzExXQorI2RlZmluZSBtZW1vcnlfYmVsb3cgICAgICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzEyXQorI2RlZmluZSBtb3ZlX2luc2VydF9tb2RlICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzEzXQorI2RlZmluZSBtb3ZlX3N0YW5kb3V0X21vZGUgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzE0XQorI2RlZmluZSBvdmVyX3N0cmlrZSAgICAgICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzE1XQorI2RlZmluZSBzdGF0dXNfbGluZV9lc2Nfb2sgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzE2XQorI2RlZmluZSBkZXN0X3RhYnNfbWFnaWNfc21zbyAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzE3XQorI2RlZmluZSB0aWxkZV9nbGl0Y2ggICAgICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzE4XQorI2RlZmluZSB0cmFuc3BhcmVudF91bmRlcmxpbmUgICAgICAgICAgQ1VSIEJvb2xlYW5zWzE5XQorI2RlZmluZSB4b25feG9mZiAgICAgICAgICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzIwXQorI2RlZmluZSBuZWVkc194b25feG9mZiAgICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzIxXQorI2RlZmluZSBwcnRyX3NpbGVudCAgICAgICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzIyXQorI2RlZmluZSBoYXJkX2N1cnNvciAgICAgICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzIzXQorI2RlZmluZSBub25fcmV2X3JtY3VwICAgICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzI0XQorI2RlZmluZSBub19wYWRfY2hhciAgICAgICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzI1XQorI2RlZmluZSBub25fZGVzdF9zY3JvbGxfcmVnaW9uICAgICAgICAgQ1VSIEJvb2xlYW5zWzI2XQorI2RlZmluZSBjYW5fY2hhbmdlICAgICAgICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzI3XQorI2RlZmluZSBiYWNrX2NvbG9yX2VyYXNlICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzI4XQorI2RlZmluZSBodWVfbGlnaHRuZXNzX3NhdHVyYXRpb24gICAgICAgQ1VSIEJvb2xlYW5zWzI5XQorI2RlZmluZSBjb2xfYWRkcl9nbGl0Y2ggICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzMwXQorI2RlZmluZSBjcl9jYW5jZWxzX21pY3JvX21vZGUgICAgICAgICAgQ1VSIEJvb2xlYW5zWzMxXQorI2RlZmluZSBoYXNfcHJpbnRfd2hlZWwgICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzMyXQorI2RlZmluZSByb3dfYWRkcl9nbGl0Y2ggICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzMzXQorI2RlZmluZSBzZW1pX2F1dG9fcmlnaHRfbWFyZ2luICAgICAgICAgQ1VSIEJvb2xlYW5zWzM0XQorI2RlZmluZSBjcGlfY2hhbmdlc19yZXMgICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzM1XQorI2RlZmluZSBscGlfY2hhbmdlc19yZXMgICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzM2XQorI2RlZmluZSBjb2x1bW5zICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMF0KKyNkZWZpbmUgaW5pdF90YWJzICAgICAgICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzFdCisjZGVmaW5lIGxpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1syXQorI2RlZmluZSBsaW5lc19vZl9tZW1vcnkgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbM10KKyNkZWZpbmUgbWFnaWNfY29va2llX2dsaXRjaCAgICAgICAgICAgIENVUiBOdW1iZXJzWzRdCisjZGVmaW5lIHBhZGRpbmdfYmF1ZF9yYXRlICAgICAgICAgICAgICBDVVIgTnVtYmVyc1s1XQorI2RlZmluZSB2aXJ0dWFsX3Rlcm1pbmFsICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbNl0KKyNkZWZpbmUgd2lkdGhfc3RhdHVzX2xpbmUgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzddCisjZGVmaW5lIG51bV9sYWJlbHMgICAgICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1s4XQorI2RlZmluZSBsYWJlbF9oZWlnaHQgICAgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbOV0KKyNkZWZpbmUgbGFiZWxfd2lkdGggICAgICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzEwXQorI2RlZmluZSBtYXhfYXR0cmlidXRlcyAgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMTFdCisjZGVmaW5lIG1heGltdW1fd2luZG93cyAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1sxMl0KKyNkZWZpbmUgbWF4X2NvbG9ycyAgICAgICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzEzXQorI2RlZmluZSBtYXhfcGFpcnMgICAgICAgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMTRdCisjZGVmaW5lIG5vX2NvbG9yX3ZpZGVvICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1sxNV0KKyNkZWZpbmUgYnVmZmVyX2NhcGFjaXR5ICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzE2XQorI2RlZmluZSBkb3RfdmVydF9zcGFjaW5nICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMTddCisjZGVmaW5lIGRvdF9ob3J6X3NwYWNpbmcgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1sxOF0KKyNkZWZpbmUgbWF4X21pY3JvX2FkZHJlc3MgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzE5XQorI2RlZmluZSBtYXhfbWljcm9fanVtcCAgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMjBdCisjZGVmaW5lIG1pY3JvX2NvbF9zaXplICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1syMV0KKyNkZWZpbmUgbWljcm9fbGluZV9zaXplICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzIyXQorI2RlZmluZSBudW1iZXJfb2ZfcGlucyAgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMjNdCisjZGVmaW5lIG91dHB1dF9yZXNfY2hhciAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1syNF0KKyNkZWZpbmUgb3V0cHV0X3Jlc19saW5lICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzI1XQorI2RlZmluZSBvdXRwdXRfcmVzX2hvcnpfaW5jaCAgICAgICAgICAgQ1VSIE51bWJlcnNbMjZdCisjZGVmaW5lIG91dHB1dF9yZXNfdmVydF9pbmNoICAgICAgICAgICBDVVIgTnVtYmVyc1syN10KKyNkZWZpbmUgcHJpbnRfcmF0ZSAgICAgICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzI4XQorI2RlZmluZSB3aWRlX2NoYXJfc2l6ZSAgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMjldCisjZGVmaW5lIGJ1dHRvbnMgICAgICAgICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1szMF0KKyNkZWZpbmUgYml0X2ltYWdlX2VudHdpbmluZyAgICAgICAgICAgIENVUiBOdW1iZXJzWzMxXQorI2RlZmluZSBiaXRfaW1hZ2VfdHlwZSAgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMzJdCisjZGVmaW5lIGJhY2tfdGFiICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1swXQorI2RlZmluZSBiZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMV0KKyNkZWZpbmUgY2FycmlhZ2VfcmV0dXJuICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzJdCisjZGVmaW5lIGNoYW5nZV9zY3JvbGxfcmVnaW9uICAgICAgICAgICBDVVIgU3RyaW5nc1szXQorI2RlZmluZSBjbGVhcl9hbGxfdGFicyAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNF0KKyNkZWZpbmUgY2xlYXJfc2NyZWVuICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzVdCisjZGVmaW5lIGNscl9lb2wgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s2XQorI2RlZmluZSBjbHJfZW9zICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbN10KKyNkZWZpbmUgY29sdW1uX2FkZHJlc3MgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzhdCisjZGVmaW5lIGNvbW1hbmRfY2hhcmFjdGVyICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s5XQorI2RlZmluZSBjdXJzb3JfYWRkcmVzcyAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTBdCisjZGVmaW5lIGN1cnNvcl9kb3duICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMV0KKyNkZWZpbmUgY3Vyc29yX2hvbWUgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzEyXQorI2RlZmluZSBjdXJzb3JfaW52aXNpYmxlICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTNdCisjZGVmaW5lIGN1cnNvcl9sZWZ0ICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNF0KKyNkZWZpbmUgY3Vyc29yX21lbV9hZGRyZXNzICAgICAgICAgICAgIENVUiBTdHJpbmdzWzE1XQorI2RlZmluZSBjdXJzb3Jfbm9ybWFsICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTZdCisjZGVmaW5lIGN1cnNvcl9yaWdodCAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxN10KKyNkZWZpbmUgY3Vyc29yX3RvX2xsICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzE4XQorI2RlZmluZSBjdXJzb3JfdXAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTldCisjZGVmaW5lIGN1cnNvcl92aXNpYmxlICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMF0KKyNkZWZpbmUgZGVsZXRlX2NoYXJhY3RlciAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzIxXQorI2RlZmluZSBkZWxldGVfbGluZSAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjJdCisjZGVmaW5lIGRpc19zdGF0dXNfbGluZSAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syM10KKyNkZWZpbmUgZG93bl9oYWxmX2xpbmUgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzI0XQorI2RlZmluZSBlbnRlcl9hbHRfY2hhcnNldF9tb2RlICAgICAgICAgQ1VSIFN0cmluZ3NbMjVdCisjZGVmaW5lIGVudGVyX2JsaW5rX21vZGUgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNl0KKyNkZWZpbmUgZW50ZXJfYm9sZF9tb2RlICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzI3XQorI2RlZmluZSBlbnRlcl9jYV9tb2RlICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjhdCisjZGVmaW5lIGVudGVyX2RlbGV0ZV9tb2RlICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOV0KKyNkZWZpbmUgZW50ZXJfZGltX21vZGUgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzMwXQorI2RlZmluZSBlbnRlcl9pbnNlcnRfbW9kZSAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzFdCisjZGVmaW5lIGVudGVyX3NlY3VyZV9tb2RlICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMl0KKyNkZWZpbmUgZW50ZXJfcHJvdGVjdGVkX21vZGUgICAgICAgICAgIENVUiBTdHJpbmdzWzMzXQorI2RlZmluZSBlbnRlcl9yZXZlcnNlX21vZGUgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzRdCisjZGVmaW5lIGVudGVyX3N0YW5kb3V0X21vZGUgICAgICAgICAgICBDVVIgU3RyaW5nc1szNV0KKyNkZWZpbmUgZW50ZXJfdW5kZXJsaW5lX21vZGUgICAgICAgICAgIENVUiBTdHJpbmdzWzM2XQorI2RlZmluZSBlcmFzZV9jaGFycyAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzddCisjZGVmaW5lIGV4aXRfYWx0X2NoYXJzZXRfbW9kZSAgICAgICAgICBDVVIgU3RyaW5nc1szOF0KKyNkZWZpbmUgZXhpdF9hdHRyaWJ1dGVfbW9kZSAgICAgICAgICAgIENVUiBTdHJpbmdzWzM5XQorI2RlZmluZSBleGl0X2NhX21vZGUgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDBdCisjZGVmaW5lIGV4aXRfZGVsZXRlX21vZGUgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MV0KKyNkZWZpbmUgZXhpdF9pbnNlcnRfbW9kZSAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzQyXQorI2RlZmluZSBleGl0X3N0YW5kb3V0X21vZGUgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDNdCisjZGVmaW5lIGV4aXRfdW5kZXJsaW5lX21vZGUgICAgICAgICAgICBDVVIgU3RyaW5nc1s0NF0KKyNkZWZpbmUgZmxhc2hfc2NyZWVuICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzQ1XQorI2RlZmluZSBmb3JtX2ZlZWQgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDZdCisjZGVmaW5lIGZyb21fc3RhdHVzX2xpbmUgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0N10KKyNkZWZpbmUgaW5pdF8xc3RyaW5nICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzQ4XQorI2RlZmluZSBpbml0XzJzdHJpbmcgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDldCisjZGVmaW5lIGluaXRfM3N0cmluZyAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s1MF0KKyNkZWZpbmUgaW5pdF9maWxlICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzUxXQorI2RlZmluZSBpbnNlcnRfY2hhcmFjdGVyICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNTJdCisjZGVmaW5lIGluc2VydF9saW5lICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s1M10KKyNkZWZpbmUgaW5zZXJ0X3BhZGRpbmcgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzU0XQorI2RlZmluZSBrZXlfYmFja3NwYWNlICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNTVdCisjZGVmaW5lIGtleV9jYXRhYiAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s1Nl0KKyNkZWZpbmUga2V5X2NsZWFyICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzU3XQorI2RlZmluZSBrZXlfY3RhYiAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNThdCisjZGVmaW5lIGtleV9kYyAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s1OV0KKyNkZWZpbmUga2V5X2RsICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzYwXQorI2RlZmluZSBrZXlfZG93biAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNjFdCisjZGVmaW5lIGtleV9laWMgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s2Ml0KKyNkZWZpbmUga2V5X2VvbCAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzYzXQorI2RlZmluZSBrZXlfZW9zICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNjRdCisjZGVmaW5lIGtleV9mMCAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s2NV0KKyNkZWZpbmUga2V5X2YxICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzY2XQorI2RlZmluZSBrZXlfZjEwICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNjddCisjZGVmaW5lIGtleV9mMiAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s2OF0KKyNkZWZpbmUga2V5X2YzICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzY5XQorI2RlZmluZSBrZXlfZjQgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNzBdCisjZGVmaW5lIGtleV9mNSAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s3MV0KKyNkZWZpbmUga2V5X2Y2ICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzcyXQorI2RlZmluZSBrZXlfZjcgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNzNdCisjZGVmaW5lIGtleV9mOCAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s3NF0KKyNkZWZpbmUga2V5X2Y5ICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzc1XQorI2RlZmluZSBrZXlfaG9tZSAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNzZdCisjZGVmaW5lIGtleV9pYyAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s3N10KKyNkZWZpbmUga2V5X2lsICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzc4XQorI2RlZmluZSBrZXlfbGVmdCAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNzldCisjZGVmaW5lIGtleV9sbCAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s4MF0KKyNkZWZpbmUga2V5X25wYWdlICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzgxXQorI2RlZmluZSBrZXlfcHBhZ2UgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbODJdCisjZGVmaW5lIGtleV9yaWdodCAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s4M10KKyNkZWZpbmUga2V5X3NmICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzg0XQorI2RlZmluZSBrZXlfc3IgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbODVdCisjZGVmaW5lIGtleV9zdGFiICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s4Nl0KKyNkZWZpbmUga2V5X3VwICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzg3XQorI2RlZmluZSBrZXlwYWRfbG9jYWwgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbODhdCisjZGVmaW5lIGtleXBhZF94bWl0ICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s4OV0KKyNkZWZpbmUgbGFiX2YwICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzkwXQorI2RlZmluZSBsYWJfZjEgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbOTFdCisjZGVmaW5lIGxhYl9mMTAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s5Ml0KKyNkZWZpbmUgbGFiX2YyICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzkzXQorI2RlZmluZSBsYWJfZjMgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbOTRdCisjZGVmaW5lIGxhYl9mNCAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s5NV0KKyNkZWZpbmUgbGFiX2Y1ICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzk2XQorI2RlZmluZSBsYWJfZjYgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbOTddCisjZGVmaW5lIGxhYl9mNyAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s5OF0KKyNkZWZpbmUgbGFiX2Y4ICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzk5XQorI2RlZmluZSBsYWJfZjkgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTAwXQorI2RlZmluZSBtZXRhX29mZiAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTAxXQorI2RlZmluZSBtZXRhX29uICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTAyXQorI2RlZmluZSBuZXdsaW5lICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTAzXQorI2RlZmluZSBwYWRfY2hhciAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTA0XQorI2RlZmluZSBwYXJtX2RjaCAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTA1XQorI2RlZmluZSBwYXJtX2RlbGV0ZV9saW5lICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTA2XQorI2RlZmluZSBwYXJtX2Rvd25fY3Vyc29yICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTA3XQorI2RlZmluZSBwYXJtX2ljaCAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTA4XQorI2RlZmluZSBwYXJtX2luZGV4ICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTA5XQorI2RlZmluZSBwYXJtX2luc2VydF9saW5lICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTEwXQorI2RlZmluZSBwYXJtX2xlZnRfY3Vyc29yICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTExXQorI2RlZmluZSBwYXJtX3JpZ2h0X2N1cnNvciAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTEyXQorI2RlZmluZSBwYXJtX3JpbmRleCAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTEzXQorI2RlZmluZSBwYXJtX3VwX2N1cnNvciAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTE0XQorI2RlZmluZSBwa2V5X2tleSAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTE1XQorI2RlZmluZSBwa2V5X2xvY2FsICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTE2XQorI2RlZmluZSBwa2V5X3htaXQgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTE3XQorI2RlZmluZSBwcmludF9zY3JlZW4gICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTE4XQorI2RlZmluZSBwcnRyX29mZiAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTE5XQorI2RlZmluZSBwcnRyX29uICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTIwXQorI2RlZmluZSByZXBlYXRfY2hhciAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTIxXQorI2RlZmluZSByZXNldF8xc3RyaW5nICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTIyXQorI2RlZmluZSByZXNldF8yc3RyaW5nICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTIzXQorI2RlZmluZSByZXNldF8zc3RyaW5nICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTI0XQorI2RlZmluZSByZXNldF9maWxlICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTI1XQorI2RlZmluZSByZXN0b3JlX2N1cnNvciAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTI2XQorI2RlZmluZSByb3dfYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTI3XQorI2RlZmluZSBzYXZlX2N1cnNvciAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTI4XQorI2RlZmluZSBzY3JvbGxfZm9yd2FyZCAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTI5XQorI2RlZmluZSBzY3JvbGxfcmV2ZXJzZSAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTMwXQorI2RlZmluZSBzZXRfYXR0cmlidXRlcyAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTMxXQorI2RlZmluZSBzZXRfdGFiICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTMyXQorI2RlZmluZSBzZXRfd2luZG93ICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTMzXQorI2RlZmluZSB0YWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTM0XQorI2RlZmluZSB0b19zdGF0dXNfbGluZSAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTM1XQorI2RlZmluZSB1bmRlcmxpbmVfY2hhciAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTM2XQorI2RlZmluZSB1cF9oYWxmX2xpbmUgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTM3XQorI2RlZmluZSBpbml0X3Byb2cgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTM4XQorI2RlZmluZSBrZXlfYTEgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTM5XQorI2RlZmluZSBrZXlfYTMgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTQwXQorI2RlZmluZSBrZXlfYjIgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTQxXQorI2RlZmluZSBrZXlfYzEgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTQyXQorI2RlZmluZSBrZXlfYzMgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTQzXQorI2RlZmluZSBwcnRyX25vbiAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTQ0XQorI2RlZmluZSBjaGFyX3BhZGRpbmcgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTQ1XQorI2RlZmluZSBhY3NfY2hhcnMgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTQ2XQorI2RlZmluZSBwbGFiX25vcm0gICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTQ3XQorI2RlZmluZSBrZXlfYnRhYiAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTQ4XQorI2RlZmluZSBlbnRlcl94b25fbW9kZSAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTQ5XQorI2RlZmluZSBleGl0X3hvbl9tb2RlICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTUwXQorI2RlZmluZSBlbnRlcl9hbV9tb2RlICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTUxXQorI2RlZmluZSBleGl0X2FtX21vZGUgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTUyXQorI2RlZmluZSB4b25fY2hhcmFjdGVyICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTUzXQorI2RlZmluZSB4b2ZmX2NoYXJhY3RlciAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTU0XQorI2RlZmluZSBlbmFfYWNzICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTU1XQorI2RlZmluZSBsYWJlbF9vbiAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTU2XQorI2RlZmluZSBsYWJlbF9vZmYgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTU3XQorI2RlZmluZSBrZXlfYmVnICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTU4XQorI2RlZmluZSBrZXlfY2FuY2VsICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTU5XQorI2RlZmluZSBrZXlfY2xvc2UgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTYwXQorI2RlZmluZSBrZXlfY29tbWFuZCAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTYxXQorI2RlZmluZSBrZXlfY29weSAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTYyXQorI2RlZmluZSBrZXlfY3JlYXRlICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTYzXQorI2RlZmluZSBrZXlfZW5kICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTY0XQorI2RlZmluZSBrZXlfZW50ZXIgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTY1XQorI2RlZmluZSBrZXlfZXhpdCAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTY2XQorI2RlZmluZSBrZXlfZmluZCAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTY3XQorI2RlZmluZSBrZXlfaGVscCAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTY4XQorI2RlZmluZSBrZXlfbWFyayAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTY5XQorI2RlZmluZSBrZXlfbWVzc2FnZSAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTcwXQorI2RlZmluZSBrZXlfbW92ZSAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTcxXQorI2RlZmluZSBrZXlfbmV4dCAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTcyXQorI2RlZmluZSBrZXlfb3BlbiAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTczXQorI2RlZmluZSBrZXlfb3B0aW9ucyAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTc0XQorI2RlZmluZSBrZXlfcHJldmlvdXMgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTc1XQorI2RlZmluZSBrZXlfcHJpbnQgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTc2XQorI2RlZmluZSBrZXlfcmVkbyAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTc3XQorI2RlZmluZSBrZXlfcmVmZXJlbmNlICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTc4XQorI2RlZmluZSBrZXlfcmVmcmVzaCAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTc5XQorI2RlZmluZSBrZXlfcmVwbGFjZSAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTgwXQorI2RlZmluZSBrZXlfcmVzdGFydCAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTgxXQorI2RlZmluZSBrZXlfcmVzdW1lICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTgyXQorI2RlZmluZSBrZXlfc2F2ZSAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTgzXQorI2RlZmluZSBrZXlfc3VzcGVuZCAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTg0XQorI2RlZmluZSBrZXlfdW5kbyAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTg1XQorI2RlZmluZSBrZXlfc2JlZyAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTg2XQorI2RlZmluZSBrZXlfc2NhbmNlbCAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTg3XQorI2RlZmluZSBrZXlfc2NvbW1hbmQgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTg4XQorI2RlZmluZSBrZXlfc2NvcHkgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTg5XQorI2RlZmluZSBrZXlfc2NyZWF0ZSAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTkwXQorI2RlZmluZSBrZXlfc2RjICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTkxXQorI2RlZmluZSBrZXlfc2RsICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTkyXQorI2RlZmluZSBrZXlfc2VsZWN0ICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTkzXQorI2RlZmluZSBrZXlfc2VuZCAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTk0XQorI2RlZmluZSBrZXlfc2VvbCAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTk1XQorI2RlZmluZSBrZXlfc2V4aXQgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTk2XQorI2RlZmluZSBrZXlfc2ZpbmQgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTk3XQorI2RlZmluZSBrZXlfc2hlbHAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTk4XQorI2RlZmluZSBrZXlfc2hvbWUgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTk5XQorI2RlZmluZSBrZXlfc2ljICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjAwXQorI2RlZmluZSBrZXlfc2xlZnQgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjAxXQorI2RlZmluZSBrZXlfc21lc3NhZ2UgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjAyXQorI2RlZmluZSBrZXlfc21vdmUgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjAzXQorI2RlZmluZSBrZXlfc25leHQgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjA0XQorI2RlZmluZSBrZXlfc29wdGlvbnMgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjA1XQorI2RlZmluZSBrZXlfc3ByZXZpb3VzICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjA2XQorI2RlZmluZSBrZXlfc3ByaW50ICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjA3XQorI2RlZmluZSBrZXlfc3JlZG8gICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjA4XQorI2RlZmluZSBrZXlfc3JlcGxhY2UgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjA5XQorI2RlZmluZSBrZXlfc3JpZ2h0ICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjEwXQorI2RlZmluZSBrZXlfc3JzdW1lICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjExXQorI2RlZmluZSBrZXlfc3NhdmUgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjEyXQorI2RlZmluZSBrZXlfc3N1c3BlbmQgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjEzXQorI2RlZmluZSBrZXlfc3VuZG8gICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjE0XQorI2RlZmluZSByZXFfZm9yX2lucHV0ICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjE1XQorI2RlZmluZSBrZXlfZjExICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjE2XQorI2RlZmluZSBrZXlfZjEyICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjE3XQorI2RlZmluZSBrZXlfZjEzICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjE4XQorI2RlZmluZSBrZXlfZjE0ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjE5XQorI2RlZmluZSBrZXlfZjE1ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjIwXQorI2RlZmluZSBrZXlfZjE2ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjIxXQorI2RlZmluZSBrZXlfZjE3ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjIyXQorI2RlZmluZSBrZXlfZjE4ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjIzXQorI2RlZmluZSBrZXlfZjE5ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjI0XQorI2RlZmluZSBrZXlfZjIwICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjI1XQorI2RlZmluZSBrZXlfZjIxICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjI2XQorI2RlZmluZSBrZXlfZjIyICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjI3XQorI2RlZmluZSBrZXlfZjIzICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjI4XQorI2RlZmluZSBrZXlfZjI0ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjI5XQorI2RlZmluZSBrZXlfZjI1ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjMwXQorI2RlZmluZSBrZXlfZjI2ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjMxXQorI2RlZmluZSBrZXlfZjI3ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjMyXQorI2RlZmluZSBrZXlfZjI4ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjMzXQorI2RlZmluZSBrZXlfZjI5ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjM0XQorI2RlZmluZSBrZXlfZjMwICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjM1XQorI2RlZmluZSBrZXlfZjMxICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjM2XQorI2RlZmluZSBrZXlfZjMyICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjM3XQorI2RlZmluZSBrZXlfZjMzICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjM4XQorI2RlZmluZSBrZXlfZjM0ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjM5XQorI2RlZmluZSBrZXlfZjM1ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjQwXQorI2RlZmluZSBrZXlfZjM2ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjQxXQorI2RlZmluZSBrZXlfZjM3ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjQyXQorI2RlZmluZSBrZXlfZjM4ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjQzXQorI2RlZmluZSBrZXlfZjM5ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjQ0XQorI2RlZmluZSBrZXlfZjQwICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjQ1XQorI2RlZmluZSBrZXlfZjQxICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjQ2XQorI2RlZmluZSBrZXlfZjQyICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjQ3XQorI2RlZmluZSBrZXlfZjQzICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjQ4XQorI2RlZmluZSBrZXlfZjQ0ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjQ5XQorI2RlZmluZSBrZXlfZjQ1ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjUwXQorI2RlZmluZSBrZXlfZjQ2ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjUxXQorI2RlZmluZSBrZXlfZjQ3ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjUyXQorI2RlZmluZSBrZXlfZjQ4ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjUzXQorI2RlZmluZSBrZXlfZjQ5ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjU0XQorI2RlZmluZSBrZXlfZjUwICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjU1XQorI2RlZmluZSBrZXlfZjUxICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjU2XQorI2RlZmluZSBrZXlfZjUyICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjU3XQorI2RlZmluZSBrZXlfZjUzICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjU4XQorI2RlZmluZSBrZXlfZjU0ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjU5XQorI2RlZmluZSBrZXlfZjU1ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjYwXQorI2RlZmluZSBrZXlfZjU2ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjYxXQorI2RlZmluZSBrZXlfZjU3ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjYyXQorI2RlZmluZSBrZXlfZjU4ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjYzXQorI2RlZmluZSBrZXlfZjU5ICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjY0XQorI2RlZmluZSBrZXlfZjYwICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjY1XQorI2RlZmluZSBrZXlfZjYxICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjY2XQorI2RlZmluZSBrZXlfZjYyICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjY3XQorI2RlZmluZSBrZXlfZjYzICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjY4XQorI2RlZmluZSBjbHJfYm9sICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjY5XQorI2RlZmluZSBjbGVhcl9tYXJnaW5zICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjcwXQorI2RlZmluZSBzZXRfbGVmdF9tYXJnaW4gICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjcxXQorI2RlZmluZSBzZXRfcmlnaHRfbWFyZ2luICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjcyXQorI2RlZmluZSBsYWJlbF9mb3JtYXQgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjczXQorI2RlZmluZSBzZXRfY2xvY2sgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjc0XQorI2RlZmluZSBkaXNwbGF5X2Nsb2NrICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjc1XQorI2RlZmluZSByZW1vdmVfY2xvY2sgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjc2XQorI2RlZmluZSBjcmVhdGVfd2luZG93ICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjc3XQorI2RlZmluZSBnb3RvX3dpbmRvdyAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjc4XQorI2RlZmluZSBoYW5ndXAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjc5XQorI2RlZmluZSBkaWFsX3Bob25lICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjgwXQorI2RlZmluZSBxdWlja19kaWFsICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjgxXQorI2RlZmluZSB0b25lICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjgyXQorI2RlZmluZSBwdWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjgzXQorI2RlZmluZSBmbGFzaF9ob29rICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjg0XQorI2RlZmluZSBmaXhlZF9wYXVzZSAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjg1XQorI2RlZmluZSB3YWl0X3RvbmUgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjg2XQorI2RlZmluZSB1c2VyMCAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjg3XQorI2RlZmluZSB1c2VyMSAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjg4XQorI2RlZmluZSB1c2VyMiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjg5XQorI2RlZmluZSB1c2VyMyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjkwXQorI2RlZmluZSB1c2VyNCAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjkxXQorI2RlZmluZSB1c2VyNSAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjkyXQorI2RlZmluZSB1c2VyNiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjkzXQorI2RlZmluZSB1c2VyNyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjk0XQorI2RlZmluZSB1c2VyOCAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjk1XQorI2RlZmluZSB1c2VyOSAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjk2XQorI2RlZmluZSBvcmlnX3BhaXIgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjk3XQorI2RlZmluZSBvcmlnX2NvbG9ycyAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjk4XQorI2RlZmluZSBpbml0aWFsaXplX2NvbG9yICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjk5XQorI2RlZmluZSBpbml0aWFsaXplX3BhaXIgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzAwXQorI2RlZmluZSBzZXRfY29sb3JfcGFpciAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzAxXQorI2RlZmluZSBzZXRfZm9yZWdyb3VuZCAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzAyXQorI2RlZmluZSBzZXRfYmFja2dyb3VuZCAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzAzXQorI2RlZmluZSBjaGFuZ2VfY2hhcl9waXRjaCAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzA0XQorI2RlZmluZSBjaGFuZ2VfbGluZV9waXRjaCAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzA1XQorI2RlZmluZSBjaGFuZ2VfcmVzX2hvcnogICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzA2XQorI2RlZmluZSBjaGFuZ2VfcmVzX3ZlcnQgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzA3XQorI2RlZmluZSBkZWZpbmVfY2hhciAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzA4XQorI2RlZmluZSBlbnRlcl9kb3VibGV3aWRlX21vZGUgICAgICAgICAgQ1VSIFN0cmluZ3NbMzA5XQorI2RlZmluZSBlbnRlcl9kcmFmdF9xdWFsaXR5ICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzEwXQorI2RlZmluZSBlbnRlcl9pdGFsaWNzX21vZGUgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzExXQorI2RlZmluZSBlbnRlcl9sZWZ0d2FyZF9tb2RlICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzEyXQorI2RlZmluZSBlbnRlcl9taWNyb19tb2RlICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzEzXQorI2RlZmluZSBlbnRlcl9uZWFyX2xldHRlcl9xdWFsaXR5ICAgICAgQ1VSIFN0cmluZ3NbMzE0XQorI2RlZmluZSBlbnRlcl9ub3JtYWxfcXVhbGl0eSAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzE1XQorI2RlZmluZSBlbnRlcl9zaGFkb3dfbW9kZSAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzE2XQorI2RlZmluZSBlbnRlcl9zdWJzY3JpcHRfbW9kZSAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzE3XQorI2RlZmluZSBlbnRlcl9zdXBlcnNjcmlwdF9tb2RlICAgICAgICAgQ1VSIFN0cmluZ3NbMzE4XQorI2RlZmluZSBlbnRlcl91cHdhcmRfbW9kZSAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzE5XQorI2RlZmluZSBleGl0X2RvdWJsZXdpZGVfbW9kZSAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzIwXQorI2RlZmluZSBleGl0X2l0YWxpY3NfbW9kZSAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzIxXQorI2RlZmluZSBleGl0X2xlZnR3YXJkX21vZGUgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzIyXQorI2RlZmluZSBleGl0X21pY3JvX21vZGUgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzIzXQorI2RlZmluZSBleGl0X3NoYWRvd19tb2RlICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzI0XQorI2RlZmluZSBleGl0X3N1YnNjcmlwdF9tb2RlICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzI1XQorI2RlZmluZSBleGl0X3N1cGVyc2NyaXB0X21vZGUgICAgICAgICAgQ1VSIFN0cmluZ3NbMzI2XQorI2RlZmluZSBleGl0X3Vwd2FyZF9tb2RlICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzI3XQorI2RlZmluZSBtaWNyb19jb2x1bW5fYWRkcmVzcyAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzI4XQorI2RlZmluZSBtaWNyb19kb3duICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzI5XQorI2RlZmluZSBtaWNyb19sZWZ0ICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzMwXQorI2RlZmluZSBtaWNyb19yaWdodCAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzMxXQorI2RlZmluZSBtaWNyb19yb3dfYWRkcmVzcyAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzMyXQorI2RlZmluZSBtaWNyb191cCAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzMzXQorI2RlZmluZSBvcmRlcl9vZl9waW5zICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzM0XQorI2RlZmluZSBwYXJtX2Rvd25fbWljcm8gICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzM1XQorI2RlZmluZSBwYXJtX2xlZnRfbWljcm8gICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzM2XQorI2RlZmluZSBwYXJtX3JpZ2h0X21pY3JvICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzM3XQorI2RlZmluZSBwYXJtX3VwX21pY3JvICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzM4XQorI2RlZmluZSBzZWxlY3RfY2hhcl9zZXQgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzM5XQorI2RlZmluZSBzZXRfYm90dG9tX21hcmdpbiAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzQwXQorI2RlZmluZSBzZXRfYm90dG9tX21hcmdpbl9wYXJtICAgICAgICAgQ1VSIFN0cmluZ3NbMzQxXQorI2RlZmluZSBzZXRfbGVmdF9tYXJnaW5fcGFybSAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzQyXQorI2RlZmluZSBzZXRfcmlnaHRfbWFyZ2luX3Bhcm0gICAgICAgICAgQ1VSIFN0cmluZ3NbMzQzXQorI2RlZmluZSBzZXRfdG9wX21hcmdpbiAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzQ0XQorI2RlZmluZSBzZXRfdG9wX21hcmdpbl9wYXJtICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzQ1XQorI2RlZmluZSBzdGFydF9iaXRfaW1hZ2UgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzQ2XQorI2RlZmluZSBzdGFydF9jaGFyX3NldF9kZWYgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzQ3XQorI2RlZmluZSBzdG9wX2JpdF9pbWFnZSAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzQ4XQorI2RlZmluZSBzdG9wX2NoYXJfc2V0X2RlZiAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzQ5XQorI2RlZmluZSBzdWJzY3JpcHRfY2hhcmFjdGVycyAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzUwXQorI2RlZmluZSBzdXBlcnNjcmlwdF9jaGFyYWN0ZXJzICAgICAgICAgQ1VSIFN0cmluZ3NbMzUxXQorI2RlZmluZSB0aGVzZV9jYXVzZV9jciAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzUyXQorI2RlZmluZSB6ZXJvX21vdGlvbiAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzUzXQorI2RlZmluZSBjaGFyX3NldF9uYW1lcyAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzU0XQorI2RlZmluZSBrZXlfbW91c2UgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzU1XQorI2RlZmluZSBtb3VzZV9pbmZvICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzU2XQorI2RlZmluZSByZXFfbW91c2VfcG9zICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzU3XQorI2RlZmluZSBnZXRfbW91c2UgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzU4XQorI2RlZmluZSBzZXRfYV9mb3JlZ3JvdW5kICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzU5XQorI2RlZmluZSBzZXRfYV9iYWNrZ3JvdW5kICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzYwXQorI2RlZmluZSBwa2V5X3BsYWIgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzYxXQorI2RlZmluZSBkZXZpY2VfdHlwZSAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzYyXQorI2RlZmluZSBjb2RlX3NldF9pbml0ICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzYzXQorI2RlZmluZSBzZXQwX2Rlc19zZXEgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzY0XQorI2RlZmluZSBzZXQxX2Rlc19zZXEgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzY1XQorI2RlZmluZSBzZXQyX2Rlc19zZXEgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzY2XQorI2RlZmluZSBzZXQzX2Rlc19zZXEgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzY3XQorI2RlZmluZSBzZXRfbHJfbWFyZ2luICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzY4XQorI2RlZmluZSBzZXRfdGJfbWFyZ2luICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzY5XQorI2RlZmluZSBiaXRfaW1hZ2VfcmVwZWF0ICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzcwXQorI2RlZmluZSBiaXRfaW1hZ2VfbmV3bGluZSAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzcxXQorI2RlZmluZSBiaXRfaW1hZ2VfY2FycmlhZ2VfcmV0dXJuICAgICAgQ1VSIFN0cmluZ3NbMzcyXQorI2RlZmluZSBjb2xvcl9uYW1lcyAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzczXQorI2RlZmluZSBkZWZpbmVfYml0X2ltYWdlX3JlZ2lvbiAgICAgICAgQ1VSIFN0cmluZ3NbMzc0XQorI2RlZmluZSBlbmRfYml0X2ltYWdlX3JlZ2lvbiAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzc1XQorI2RlZmluZSBzZXRfY29sb3JfYmFuZCAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzc2XQorI2RlZmluZSBzZXRfcGFnZV9sZW5ndGggICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzc3XQorI2RlZmluZSBkaXNwbGF5X3BjX2NoYXIgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzc4XQorI2RlZmluZSBlbnRlcl9wY19jaGFyc2V0X21vZGUgICAgICAgICAgQ1VSIFN0cmluZ3NbMzc5XQorI2RlZmluZSBleGl0X3BjX2NoYXJzZXRfbW9kZSAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzgwXQorI2RlZmluZSBlbnRlcl9zY2FuY29kZV9tb2RlICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzgxXQorI2RlZmluZSBleGl0X3NjYW5jb2RlX21vZGUgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzgyXQorI2RlZmluZSBwY190ZXJtX29wdGlvbnMgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzgzXQorI2RlZmluZSBzY2FuY29kZV9lc2NhcGUgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzg0XQorI2RlZmluZSBhbHRfc2NhbmNvZGVfZXNjICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzg1XQorI2RlZmluZSBlbnRlcl9ob3Jpem9udGFsX2hsX21vZGUgICAgICAgQ1VSIFN0cmluZ3NbMzg2XQorI2RlZmluZSBlbnRlcl9sZWZ0X2hsX21vZGUgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzg3XQorI2RlZmluZSBlbnRlcl9sb3dfaGxfbW9kZSAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzg4XQorI2RlZmluZSBlbnRlcl9yaWdodF9obF9tb2RlICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzg5XQorI2RlZmluZSBlbnRlcl90b3BfaGxfbW9kZSAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzkwXQorI2RlZmluZSBlbnRlcl92ZXJ0aWNhbF9obF9tb2RlICAgICAgICAgQ1VSIFN0cmluZ3NbMzkxXQorI2RlZmluZSBzZXRfYV9hdHRyaWJ1dGVzICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzkyXQorI2RlZmluZSBzZXRfcGdsZW5faW5jaCAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzkzXQorCisjZGVmaW5lIEJPT0xXUklURSAzNworI2RlZmluZSBOVU1XUklURSAgMzMKKyNkZWZpbmUgU1RSV1JJVEUgIDM5NAorCisvKiBvbGRlciBzeW5vbnltcyBmb3Igc29tZSBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgYmVlaGl2ZV9nbGl0Y2gJbm9fZXNjX2N0bGMKKyNkZWZpbmUgdGVsZXJheV9nbGl0Y2gJZGVzdF90YWJzX21hZ2ljX3Ntc28KKyNkZWZpbmUgbWljcm9fY2hhcl9zaXplIG1pY3JvX2NvbF9zaXplCisKKyNpZmRlZiBfX0lOVEVSTkFMX0NBUFNfVklTSUJMRQorI2RlZmluZSB0ZXJtY2FwX2luaXQyICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzk0XQorI2RlZmluZSB0ZXJtY2FwX3Jlc2V0ICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzk1XQorI2RlZmluZSBtYWdpY19jb29raWVfZ2xpdGNoX3VsICAgICAgICAgQ1VSIE51bWJlcnNbMzNdCisjZGVmaW5lIGJhY2tzcGFjZXNfd2l0aF9icyAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMzddCisjZGVmaW5lIGNydF9ub19zY3JvbGxpbmcgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMzhdCisjZGVmaW5lIG5vX2NvcnJlY3RseV93b3JraW5nX2NyICAgICAgICBDVVIgQm9vbGVhbnNbMzldCisjZGVmaW5lIGNhcnJpYWdlX3JldHVybl9kZWxheSAgICAgICAgICBDVVIgTnVtYmVyc1szNF0KKyNkZWZpbmUgbmV3X2xpbmVfZGVsYXkgICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzM1XQorI2RlZmluZSBsaW5lZmVlZF9pZl9ub3RfbGYgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzk2XQorI2RlZmluZSBiYWNrc3BhY2VfaWZfbm90X2JzICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzk3XQorI2RlZmluZSBnbnVfaGFzX21ldGFfa2V5ICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzQwXQorI2RlZmluZSBsaW5lZmVlZF9pc19uZXdsaW5lICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzQxXQorI2RlZmluZSBiYWNrc3BhY2VfZGVsYXkgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMzZdCisjZGVmaW5lIGhvcml6b250YWxfdGFiX2RlbGF5ICAgICAgICAgICBDVVIgTnVtYmVyc1szN10KKyNkZWZpbmUgbnVtYmVyX29mX2Z1bmN0aW9uX2tleXMgICAgICAgIENVUiBOdW1iZXJzWzM4XQorI2RlZmluZSBvdGhlcl9ub25fZnVuY3Rpb25fa2V5cyAgICAgICAgQ1VSIFN0cmluZ3NbMzk4XQorI2RlZmluZSBhcnJvd19rZXlfbWFwICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzk5XQorI2RlZmluZSBoYXNfaGFyZHdhcmVfdGFicyAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzQyXQorI2RlZmluZSByZXR1cm5fZG9lc19jbHJfZW9sICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzQzXQorI2RlZmluZSBhY3NfdWxjb3JuZXIgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDAwXQorI2RlZmluZSBhY3NfbGxjb3JuZXIgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDAxXQorI2RlZmluZSBhY3NfdXJjb3JuZXIgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDAyXQorI2RlZmluZSBhY3NfbHJjb3JuZXIgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDAzXQorI2RlZmluZSBhY3NfbHRlZSAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDA0XQorI2RlZmluZSBhY3NfcnRlZSAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDA1XQorI2RlZmluZSBhY3NfYnRlZSAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDA2XQorI2RlZmluZSBhY3NfdHRlZSAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDA3XQorI2RlZmluZSBhY3NfaGxpbmUgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDA4XQorI2RlZmluZSBhY3NfdmxpbmUgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDA5XQorI2RlZmluZSBhY3NfcGx1cyAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDEwXQorI2RlZmluZSBtZW1vcnlfbG9jayAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDExXQorI2RlZmluZSBtZW1vcnlfdW5sb2NrICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDEyXQorI2RlZmluZSBib3hfY2hhcnNfMSAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDEzXQorI2VuZGlmIC8qIF9fSU5URVJOQUxfQ0FQU19WSVNJQkxFICovCisKKworLyoKKyAqIFByZWRlZmluZWQgdGVybWluZm8gYXJyYXkgc2l6ZXMKKyAqLworI2RlZmluZSBCT09MQ09VTlQgNDQKKyNkZWZpbmUgTlVNQ09VTlQgIDM5CisjZGVmaW5lIFNUUkNPVU5UICA0MTQKKworLyogdXNlZCBieSBjb2RlIGZvciBjb21wYXJpbmcgZW50cmllcyAqLworI2RlZmluZSBhY3NfY2hhcnNfaW5kZXgJIDE0NgorCit0eXBlZGVmIHN0cnVjdCB0ZXJtdHlwZSB7CS8qIGluLWNvcmUgZm9ybSBvZiB0ZXJtaW5mbyBkYXRhICovCisgICAgY2hhciAgKnRlcm1fbmFtZXM7CQkvKiBzdHJfdGFibGUgb2Zmc2V0IG9mIHRlcm0gbmFtZXMgKi8KKyAgICBjaGFyICAqc3RyX3RhYmxlOwkJLyogcG9pbnRlciB0byBzdHJpbmcgdGFibGUgKi8KKyAgICBOQ1VSU0VTX1NCT09MICAqQm9vbGVhbnM7CS8qIGFycmF5IG9mIGJvb2xlYW4gdmFsdWVzICovCisgICAgc2hvcnQgKk51bWJlcnM7CQkvKiBhcnJheSBvZiBpbnRlZ2VyIHZhbHVlcyAqLworICAgIGNoYXIgICoqU3RyaW5nczsJCS8qIGFycmF5IG9mIHN0cmluZyBvZmZzZXRzICovCisKKyNpZiBOQ1VSU0VTX1hOQU1FUworICAgIGNoYXIgICpleHRfc3RyX3RhYmxlOwkvKiBwb2ludGVyIHRvIGV4dGVuZGVkIHN0cmluZyB0YWJsZSAqLworICAgIGNoYXIgICoqZXh0X05hbWVzOwkJLyogY29ycmVzcG9uZGluZyBuYW1lcyAqLworCisgICAgdW5zaWduZWQgc2hvcnQgbnVtX0Jvb2xlYW5zOy8qIGNvdW50IHRvdGFsIEJvb2xlYW5zICovCisgICAgdW5zaWduZWQgc2hvcnQgbnVtX051bWJlcnM7CS8qIGNvdW50IHRvdGFsIE51bWJlcnMgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBudW1fU3RyaW5nczsJLyogY291bnQgdG90YWwgU3RyaW5ncyAqLworCisgICAgdW5zaWduZWQgc2hvcnQgZXh0X0Jvb2xlYW5zOy8qIGNvdW50IGV4dGVuc2lvbnMgdG8gQm9vbGVhbnMgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBleHRfTnVtYmVyczsJLyogY291bnQgZXh0ZW5zaW9ucyB0byBOdW1iZXJzICovCisgICAgdW5zaWduZWQgc2hvcnQgZXh0X1N0cmluZ3M7CS8qIGNvdW50IGV4dGVuc2lvbnMgdG8gU3RyaW5ncyAqLworI2VuZGlmIC8qIE5DVVJTRVNfWE5BTUVTICovCisKK30gVEVSTVRZUEU7CisKK3R5cGVkZWYgc3RydWN0IHRlcm0gewkJLyogZGVzY3JpYmUgYW4gYWN0dWFsIHRlcm1pbmFsICovCisgICAgVEVSTVRZUEUJdHlwZTsJCS8qIHRlcm1pbmFsIHR5cGUgZGVzY3JpcHRpb24gKi8KKyAgICBzaG9ydAlGaWxlZGVzOwkvKiBmaWxlIGRlc2NyaXB0aW9uIGJlaW5nIHdyaXR0ZW4gdG8gKi8KKyAgICBUVFkJCU90dHliLAkJLyogb3JpZ2luYWwgc3RhdGUgb2YgdGhlIHRlcm1pbmFsICovCisJCU50dHliOwkJLyogY3VycmVudCBzdGF0ZSBvZiB0aGUgdGVybWluYWwgKi8KKyAgICBpbnQJCV9iYXVkcmF0ZTsJLyogdXNlZCB0byBjb21wdXRlIHBhZGRpbmcgKi8KKyAgICBjaGFyICogICAgICBfdGVybW5hbWU7ICAgICAgLyogdXNlZCBmb3IgdGVybW5hbWUoKSAqLworfSBURVJNSU5BTDsKKworI2lmIDAgJiYgITAKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoVEVSTUlOQUwgKikgY3VyX3Rlcm07CisjZWxpZiAwCitOQ1VSU0VTX1dSQVBQRURfVkFSKFRFUk1JTkFMICosIGN1cl90ZXJtKTsKKyNkZWZpbmUgY3VyX3Rlcm0gICBOQ1VSU0VTX1BVQkxJQ19WQVIoY3VyX3Rlcm0oKSkKKyNlbHNlCitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKFRFUk1JTkFMICopIGN1cl90ZXJtOworI2VuZGlmCisKKyNpZiAwIHx8IDAKK05DVVJTRVNfV1JBUFBFRF9WQVIoTkNVUlNFU19DT05TVCBjaGFyICogY29uc3QgKiwgYm9vbG5hbWVzKTsKK05DVVJTRVNfV1JBUFBFRF9WQVIoTkNVUlNFU19DT05TVCBjaGFyICogY29uc3QgKiwgYm9vbGNvZGVzKTsKK05DVVJTRVNfV1JBUFBFRF9WQVIoTkNVUlNFU19DT05TVCBjaGFyICogY29uc3QgKiwgYm9vbGZuYW1lcyk7CitOQ1VSU0VTX1dSQVBQRURfVkFSKE5DVVJTRVNfQ09OU1QgY2hhciAqIGNvbnN0ICosIG51bW5hbWVzKTsKK05DVVJTRVNfV1JBUFBFRF9WQVIoTkNVUlNFU19DT05TVCBjaGFyICogY29uc3QgKiwgbnVtY29kZXMpOworTkNVUlNFU19XUkFQUEVEX1ZBUihOQ1VSU0VTX0NPTlNUIGNoYXIgKiBjb25zdCAqLCBudW1mbmFtZXMpOworTkNVUlNFU19XUkFQUEVEX1ZBUihOQ1VSU0VTX0NPTlNUIGNoYXIgKiBjb25zdCAqLCBzdHJuYW1lcyk7CitOQ1VSU0VTX1dSQVBQRURfVkFSKE5DVVJTRVNfQ09OU1QgY2hhciAqIGNvbnN0ICosIHN0cmNvZGVzKTsKK05DVVJTRVNfV1JBUFBFRF9WQVIoTkNVUlNFU19DT05TVCBjaGFyICogY29uc3QgKiwgc3RyZm5hbWVzKTsKKworI2RlZmluZSBib29sbmFtZXMgIE5DVVJTRVNfUFVCTElDX1ZBUihib29sbmFtZXMoKSkKKyNkZWZpbmUgYm9vbGNvZGVzICBOQ1VSU0VTX1BVQkxJQ19WQVIoYm9vbGNvZGVzKCkpCisjZGVmaW5lIGJvb2xmbmFtZXMgTkNVUlNFU19QVUJMSUNfVkFSKGJvb2xmbmFtZXMoKSkKKyNkZWZpbmUgbnVtbmFtZXMgICBOQ1VSU0VTX1BVQkxJQ19WQVIobnVtbmFtZXMoKSkKKyNkZWZpbmUgbnVtY29kZXMgICBOQ1VSU0VTX1BVQkxJQ19WQVIobnVtY29kZXMoKSkKKyNkZWZpbmUgbnVtZm5hbWVzICBOQ1VSU0VTX1BVQkxJQ19WQVIobnVtZm5hbWVzKCkpCisjZGVmaW5lIHN0cm5hbWVzICAgTkNVUlNFU19QVUJMSUNfVkFSKHN0cm5hbWVzKCkpCisjZGVmaW5lIHN0cmNvZGVzICAgTkNVUlNFU19QVUJMSUNfVkFSKHN0cmNvZGVzKCkpCisjZGVmaW5lIHN0cmZuYW1lcyAgTkNVUlNFU19QVUJMSUNfVkFSKHN0cmZuYW1lcygpKQorCisjZWxzZQorCitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKE5DVVJTRVNfQ09OU1QgY2hhciAqIGNvbnN0ICkgYm9vbG5hbWVzW107CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKE5DVVJTRVNfQ09OU1QgY2hhciAqIGNvbnN0ICkgYm9vbGNvZGVzW107CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKE5DVVJTRVNfQ09OU1QgY2hhciAqIGNvbnN0ICkgYm9vbGZuYW1lc1tdOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihOQ1VSU0VTX0NPTlNUIGNoYXIgKiBjb25zdCApIG51bW5hbWVzW107CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKE5DVVJTRVNfQ09OU1QgY2hhciAqIGNvbnN0ICkgbnVtY29kZXNbXTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoTkNVUlNFU19DT05TVCBjaGFyICogY29uc3QgKSBudW1mbmFtZXNbXTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoTkNVUlNFU19DT05TVCBjaGFyICogY29uc3QgKSBzdHJuYW1lc1tdOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihOQ1VSU0VTX0NPTlNUIGNoYXIgKiBjb25zdCApIHN0cmNvZGVzW107CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKE5DVVJTRVNfQ09OU1QgY2hhciAqIGNvbnN0ICkgc3RyZm5hbWVzW107CisKKyNlbmRpZgorCisvKiBpbnRlcm5hbHMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIF9uY19zZXRfdHR5X21vZGUgKFRUWSAqYnVmKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIF9uY19nZXRfdHR5X21vZGUgKFRUWSAqYnVmKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIF9uY19yZWFkX2VudHJ5IChjb25zdCBjaGFyICogY29uc3QsIGNoYXIgKiBjb25zdCwgVEVSTVRZUEUgKmNvbnN0KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIF9uY19yZWFkX2ZpbGVfZW50cnkgKGNvbnN0IGNoYXIgKmNvbnN0LCBURVJNVFlQRSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIF9uY19yZWFkX3Rlcm10eXBlIChURVJNVFlQRSAqLCBjaGFyICosIGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBfbmNfZmlyc3RfbmFtZSAoY29uc3QgY2hhciAqY29uc3QpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgX25jX25hbWVfbWF0Y2ggKGNvbnN0IGNoYXIgKmNvbnN0LCBjb25zdCBjaGFyICpjb25zdCwgY29uc3QgY2hhciAqY29uc3QpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNvbnN0IFRFUk1UWVBFICopIF9uY19mYWxsYmFjayAoY29uc3QgY2hhciAqKTsKKworLyogZW50cnkgcG9pbnRzICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoVEVSTUlOQUwgKikgc2V0X2N1cnRlcm0gKFRFUk1JTkFMICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZGVsX2N1cnRlcm0gKFRFUk1JTkFMICopOworCisvKiBtaXNjZWxsYW5lb3VzIGVudHJ5IHBvaW50cyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgcmVzdGFydHRlcm0gKE5DVVJTRVNfQ09OU1QgY2hhciAqLCBpbnQsIGludCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNldHVwdGVybSAoTkNVUlNFU19DT05TVCBjaGFyICosaW50LGludCAqKTsKKworLyogdGVybWluZm8gZW50cnkgcG9pbnRzLCBhbHNvIGRlY2xhcmVkIGluIGN1cnNlcy5oICovCisjaWYgIWRlZmluZWQoX19OQ1VSU0VTX0gpCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSB0aWdldHN0ciAoTkNVUlNFU19DT05TVCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihjaGFyKSB0dHl0eXBlW107CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBwdXRwIChjb25zdCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdGlnZXRmbGFnIChOQ1VSU0VTX0NPTlNUIGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB0aWdldG51bSAoTkNVUlNFU19DT05TVCBjaGFyICopOworCisjaWYgMSAvKiBOQ1VSU0VTX1RQQVJNX1ZBUkFSR1MgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIHRwYXJtIChOQ1VSU0VTX0NPTlNUIGNoYXIgKiwgLi4uKTsJLyogc3BlY2lhbCAqLworI2Vsc2UKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIHRwYXJtIChOQ1VSU0VTX0NPTlNUIGNoYXIgKiwgbG9uZyxsb25nLGxvbmcsbG9uZyxsb25nLGxvbmcsbG9uZyxsb25nLGxvbmcpOwkvKiBzcGVjaWFsICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSB0cGFybV92YXJhcmdzIChOQ1VSU0VTX0NPTlNUIGNoYXIgKiwgLi4uKTsJLyogc3BlY2lhbCAqLworI2VuZGlmCisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIHRpcGFybSAoY29uc3QgY2hhciAqLCAuLi4pOwkJLyogc3BlY2lhbCAqLworCisjZW5kaWYgLyogX19OQ1VSU0VTX0ggKi8KKworLyogdGVybWNhcCBkYXRhYmFzZSBlbXVsYXRpb24gKFhQRzQgdXNlcyBjb25zdCBvbmx5IGZvciAybmQgcGFyYW0gb2YgdGdldGVudCkgKi8KKyNpZiAhZGVmaW5lZChOQ1VSU0VTX1RFUk1DQVBfSF9pbmNsKQorZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgdGdldHN0ciAoTkNVUlNFU19DT05TVCBjaGFyICosIGNoYXIgKiopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgdGdvdG8gKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdGdldGVudCAoY2hhciAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdGdldGZsYWcgKE5DVVJTRVNfQ09OU1QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHRnZXRudW0gKE5DVVJTRVNfQ09OU1QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHRwdXRzIChjb25zdCBjaGFyICosIGludCwgaW50ICgqKShpbnQpKTsKKyNlbmRpZiAvKiBOQ1VSU0VTX1RFUk1DQVBfSF9pbmNsICovCisKKy8qCisgKiBJbmNsdWRlIGN1cnNlcy5oIGJlZm9yZSB0ZXJtLmggdG8gZW5hYmxlIHRoZXNlIGV4dGVuc2lvbnMuCisgKi8KKyNpZiBkZWZpbmVkKE5DVVJTRVNfU1BfRlVOQ1MpICYmIChOQ1VSU0VTX1NQX0ZVTkNTICE9IDApCisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopICBOQ1VSU0VTX1NQX05BTUUodGlnZXRzdHIpIChTQ1JFRU4qLCBOQ1VSU0VTX0NPTlNUIGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgTkNVUlNFU19TUF9OQU1FKHB1dHApIChTQ1JFRU4qLCBjb25zdCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgICAgIE5DVVJTRVNfU1BfTkFNRSh0aWdldGZsYWcpIChTQ1JFRU4qLCBOQ1VSU0VTX0NPTlNUIGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgTkNVUlNFU19TUF9OQU1FKHRpZ2V0bnVtKSAoU0NSRUVOKiwgTkNVUlNFU19DT05TVCBjaGFyICopOworCisjaWYgMSAvKiBOQ1VSU0VTX1RQQVJNX1ZBUkFSR1MgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopICBOQ1VSU0VTX1NQX05BTUUodHBhcm0pIChTQ1JFRU4qLCBOQ1VSU0VTX0NPTlNUIGNoYXIgKiwgLi4uKTsJLyogc3BlY2lhbCAqLworI2Vsc2UKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopICBOQ1VSU0VTX1NQX05BTUUodHBhcm0pIChTQ1JFRU4qLCBOQ1VSU0VTX0NPTlNUIGNoYXIgKiwgbG9uZyxsb25nLGxvbmcsbG9uZyxsb25nLGxvbmcsbG9uZyxsb25nLGxvbmcpOwkvKiBzcGVjaWFsICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSAgTkNVUlNFU19TUF9OQU1FKHRwYXJtX3ZhcmFyZ3MpIChTQ1JFRU4qLCBOQ1VSU0VTX0NPTlNUIGNoYXIgKiwgLi4uKTsJLyogc3BlY2lhbCAqLworI2VuZGlmCisKKy8qIHRlcm1jYXAgZGF0YWJhc2UgZW11bGF0aW9uIChYUEc0IHVzZXMgY29uc3Qgb25seSBmb3IgMm5kIHBhcmFtIG9mIHRnZXRlbnQpICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSAgTkNVUlNFU19TUF9OQU1FKHRnZXRzdHIpIChTQ1JFRU4qLCBOQ1VSU0VTX0NPTlNUIGNoYXIgKiwgY2hhciAqKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSAgTkNVUlNFU19TUF9OQU1FKHRnb3RvKSAoU0NSRUVOKiwgY29uc3QgY2hhciAqLCBpbnQsIGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgTkNVUlNFU19TUF9OQU1FKHRnZXRlbnQpIChTQ1JFRU4qLCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgTkNVUlNFU19TUF9OQU1FKHRnZXRmbGFnKSAoU0NSRUVOKiwgTkNVUlNFU19DT05TVCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgICAgIE5DVVJTRVNfU1BfTkFNRSh0Z2V0bnVtKSAoU0NSRUVOKiwgTkNVUlNFU19DT05TVCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgICAgIE5DVVJTRVNfU1BfTkFNRSh0cHV0cykgKFNDUkVFTiosIGNvbnN0IGNoYXIgKiwgaW50LCBOQ1VSU0VTX1NQX09VVEMpOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoVEVSTUlOQUwgKikgTkNVUlNFU19TUF9OQU1FKHNldF9jdXJ0ZXJtKSAoU0NSRUVOKiwgVEVSTUlOQUwgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgTkNVUlNFU19TUF9OQU1FKGRlbF9jdXJ0ZXJtKSAoU0NSRUVOKiwgVEVSTUlOQUwgKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpICAgICBOQ1VSU0VTX1NQX05BTUUocmVzdGFydHRlcm0pIChTQ1JFRU4qLCBOQ1VSU0VTX0NPTlNUIGNoYXIgKiwgaW50LCBpbnQgKik7CisjZW5kaWYgLyogTkNVUlNFU19TUF9GVU5DUyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogTkNVUlNFU19URVJNX0hfaW5jbCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS90ZXJtX2VudHJ5LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3Rlcm1fZW50cnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzcwZjg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS90ZXJtX2VudHJ5LmgKQEAgLTAsMCArMSwxNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOCwyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQXV0aG9yOiBaZXlkIE0uIEJlbi1IYWxpbSA8em1iZW5oYWxAbmV0Y29tLmNvbT4gMTk5MiwxOTk1ICAgICAgICAgICAgICAgKgorICogICAgIGFuZDogRXJpYyBTLiBSYXltb25kIDxlc3JAc25hcmsudGh5cnN1cy5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICBhbmQ6IFRob21hcyBFLiBEaWNrZXkgICAgICAgICAgICAgICAgICAgICAgICAxOTk4LW9uICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogJElkOiB0ZXJtX2VudHJ5LmgsdiAxLjM3IDIwMDkvMDcvMTEgMTY6NTI6MjkgdG9tIEV4cCAkICovCisKKy8qCisgKgl0ZXJtX2VudHJ5LmggLS0gaW50ZXJmYWNlIHRvIGVudHJ5LW1hbmlwdWxhdGlvbiBjb2RlCisgKi8KKworI2lmbmRlZiBOQ1VSU0VTX1RFUk1fRU5UUllfSF9pbmNsCisjZGVmaW5lIE5DVVJTRVNfVEVSTV9FTlRSWV9IX2luY2wgMQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDx0ZXJtLmg+CisKKyNkZWZpbmUgTUFYX1VTRVMJMzIKKyNkZWZpbmUgTUFYX0NST1NTTElOS1MJMTYKKwordHlwZWRlZiBzdHJ1Y3QgZW50cnkgeworCVRFUk1UWVBFCXR0ZXJtOworCXVuc2lnbmVkCW51c2VzOworCXN0cnVjdAorICAgICAgICB7CisJICAgIGNoYXIJCSpuYW1lOworCSAgICBzdHJ1Y3QgZW50cnkJKmxpbms7CisJICAgIGxvbmcJCWxpbmU7CisgICAgICAgIH0KKwl1c2VzW01BWF9VU0VTXTsKKwlpbnQJCW5jcm9zc2xpbmtzOworCXN0cnVjdCBlbnRyeQkqY3Jvc3NsaW5rc1tNQVhfQ1JPU1NMSU5LU107CisJbG9uZwkJY3N0YXJ0LCBjZW5kOworCWxvbmcJCXN0YXJ0bGluZTsKKwlzdHJ1Y3QgZW50cnkJKm5leHQ7CisJc3RydWN0IGVudHJ5CSpsYXN0OworfQorRU5UUlk7CisKKyNpZiBOQ1VSU0VTX1hOQU1FUworI2RlZmluZSBOVU1fQk9PTEVBTlModHApICh0cCktPm51bV9Cb29sZWFucworI2RlZmluZSBOVU1fTlVNQkVSUyh0cCkgICh0cCktPm51bV9OdW1iZXJzCisjZGVmaW5lIE5VTV9TVFJJTkdTKHRwKSAgKHRwKS0+bnVtX1N0cmluZ3MKKyNkZWZpbmUgRVhUX05BTUVTKHRwLGksbGltaXQsaW5kZXgsdGFibGUpIChpID49IGxpbWl0KSA/IHRwLT5leHRfTmFtZXNbaW5kZXhdIDogdGFibGVbaV0KKyNlbHNlCisjZGVmaW5lIE5VTV9CT09MRUFOUyh0cCkgQk9PTENPVU5UCisjZGVmaW5lIE5VTV9OVU1CRVJTKHRwKSAgTlVNQ09VTlQKKyNkZWZpbmUgTlVNX1NUUklOR1ModHApICBTVFJDT1VOVAorI2RlZmluZSBFWFRfTkFNRVModHAsaSxsaW1pdCxpbmRleCx0YWJsZSkgdGFibGVbaV0KKyNlbmRpZgorCisjZGVmaW5lIE5VTV9FWFRfTkFNRVModHApICh1bnNpZ25lZCkgKCh0cCktPmV4dF9Cb29sZWFucyArICh0cCktPmV4dF9OdW1iZXJzICsgKHRwKS0+ZXh0X1N0cmluZ3MpCisKKyNkZWZpbmUgZm9yX2VhY2hfYm9vbGVhbihuLHRwKSBmb3IobiA9IDA7IG4gPCBOVU1fQk9PTEVBTlModHApOyBuKyspCisjZGVmaW5lIGZvcl9lYWNoX251bWJlcihuLHRwKSAgZm9yKG4gPSAwOyBuIDwgTlVNX05VTUJFUlModHApOyAgbisrKQorI2RlZmluZSBmb3JfZWFjaF9zdHJpbmcobix0cCkgIGZvcihuID0gMDsgbiA8IE5VTV9TVFJJTkdTKHRwKTsgIG4rKykKKworI2lmIE5DVVJTRVNfWE5BTUVTCisjZGVmaW5lIGZvcl9lYWNoX2V4dF9ib29sZWFuKG4sdHApIGZvcihuID0gQk9PTENPVU5UOyBuIDwgTlVNX0JPT0xFQU5TKHRwKTsgbisrKQorI2RlZmluZSBmb3JfZWFjaF9leHRfbnVtYmVyKG4sdHApICBmb3IobiA9IE5VTUNPVU5UOyBuIDwgTlVNX05VTUJFUlModHApOyAgbisrKQorI2RlZmluZSBmb3JfZWFjaF9leHRfc3RyaW5nKG4sdHApICBmb3IobiA9IFNUUkNPVU5UOyBuIDwgTlVNX1NUUklOR1ModHApOyAgbisrKQorI2VuZGlmCisKKyNkZWZpbmUgRXh0Qm9vbG5hbWUodHAsaSxuYW1lcykgRVhUX05BTUVTKHRwLCBpLCBCT09MQ09VTlQsIChpIC0gKHRwLT5udW1fQm9vbGVhbnMgLSB0cC0+ZXh0X0Jvb2xlYW5zKSksIG5hbWVzKQorI2RlZmluZSBFeHROdW1uYW1lKHRwLGksbmFtZXMpICBFWFRfTkFNRVModHAsIGksIE5VTUNPVU5ULCAoaSAtICh0cC0+bnVtX051bWJlcnMgLSB0cC0+ZXh0X051bWJlcnMpKSArIHRwLT5leHRfQm9vbGVhbnMsIG5hbWVzKQorI2RlZmluZSBFeHRTdHJuYW1lKHRwLGksbmFtZXMpICBFWFRfTkFNRVModHAsIGksIFNUUkNPVU5ULCAoaSAtICh0cC0+bnVtX1N0cmluZ3MgLSB0cC0+ZXh0X1N0cmluZ3MpKSArICh0cC0+ZXh0X051bWJlcnMgKyB0cC0+ZXh0X0Jvb2xlYW5zKSwgbmFtZXMpCisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoRU5UUlkgKikgX25jX2hlYWQ7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKEVOVFJZICopIF9uY190YWlsOworI2RlZmluZSBmb3JfZW50cnlfbGlzdChxcCkJZm9yIChxcCA9IF9uY19oZWFkOyBxcDsgcXAgPSBxcC0+bmV4dCkKKworI2RlZmluZSBNQVhfTElORQkxMzIKKworI2RlZmluZSBOVUxMSE9PSyAgICAgICAgKGJvb2woKikoRU5UUlkgKikpMAorCisvKgorICogTm90ZSB0aGF0IFdBTlRFRCBhbmQgUFJFU0VOVCBhcmUgbm90IHNpbXBsZSBpbnZlcnNlcyEgIElmIGEgY2FwYWJpbGl0eQorICogaGFzIGJlZW4gZXhwbGljaXRseSBjYW5jZWxsZWQsIGl0J3Mgbm90IGNvbnNpZGVyZWQgV0FOVEVELgorICovCisjZGVmaW5lIFdBTlRFRChzKQkoKHMpID09IEFCU0VOVF9TVFJJTkcpCisjZGVmaW5lIFBSRVNFTlQocykJKCgocykgIT0gQUJTRU5UX1NUUklORykgJiYgKChzKSAhPSBDQU5DRUxMRURfU1RSSU5HKSkKKworI2RlZmluZSBBTkRNSVNTSU5HKHAscSkgXAorCQl7aWYgKFBSRVNFTlQocCkgJiYgIVBSRVNFTlQocSkpIF9uY193YXJuaW5nKCNwICIgYnV0IG5vICIgI3EpO30KKworI2RlZmluZSBQQUlSRUQocCxxKSBcCisJCXsgXAorCQlpZiAoUFJFU0VOVChxKSAmJiAhUFJFU0VOVChwKSkgXAorCQkJX25jX3dhcm5pbmcoI3EgIiBidXQgbm8gIiAjcCk7IFwKKwkJaWYgKFBSRVNFTlQocCkgJiYgIVBSRVNFTlQocSkpIFwKKwkJCV9uY193YXJuaW5nKCNwICIgYnV0IG5vICIgI3EpOyBcCisJCX0KKworLyogYWxsb2NfZW50cnkuYzogZWxlbWVudGFyeSBhbGxvY2F0aW9uIGNvZGUgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChFTlRSWSAqKSBfbmNfY29weV9lbnRyeSAoRU5UUlkgKm9sZHApOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgX25jX3NhdmVfc3RyIChjb25zdCBjaGFyICpjb25zdCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX2luaXRfZW50cnkgKFRFUk1UWVBFICpjb25zdCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX21lcmdlX2VudHJ5IChURVJNVFlQRSAqY29uc3QsIFRFUk1UWVBFICpjb25zdCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX3dyYXBfZW50cnkgKEVOVFJZICpjb25zdCwgYm9vbCk7CisKKy8qIGFsbG9jX3R0eXBlLmM6IGVsZW1lbnRhcnkgYWxsb2NhdGlvbiBjb2RlICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX2FsaWduX3Rlcm10eXBlIChURVJNVFlQRSAqLCBURVJNVFlQRSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfY29weV90ZXJtdHlwZSAoVEVSTVRZUEUgKiwgVEVSTVRZUEUgKik7CisKKy8qIGZyZWVfdHR5cGUuYzogZWxlbWVudGFyeSBhbGxvY2F0aW9uIGNvZGUgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfZnJlZV90ZXJtdHlwZSAoVEVSTVRZUEUgKik7CisKKy8qIGxpYl9hY3MuYyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY19pbml0X2FjcyAodm9pZCk7CS8qIGNvcnJlc3BvbmRzIHRvIHRyYWRpdGlvbmFsICdpbml0X2FjcygpJyAqLworCisvKiBsaWJfdGVybWNhcC5jOiB0cmltIHNncjAgc3RyaW5nIGZvciB0ZXJtY2FwIHVzZXJzICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBfbmNfdHJpbV9zZ3IwIChURVJNVFlQRSAqKTsKKworLyogcGFyc2VfZW50cnkuYzogZW50cnktcGFyc2luZyBjb2RlICovCisjaWYgTkNVUlNFU19YTkFNRVMKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoYm9vbCkgX25jX3VzZXJfZGVmaW5hYmxlOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihib29sKSBfbmNfZGlzYWJsZV9wZXJpb2Q7CisjZW5kaWYKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIF9uY19wYXJzZV9lbnRyeSAoRU5UUlkgKiwgaW50LCBib29sKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIF9uY19jYXBjbXAgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKworLyogd3JpdGVfZW50cnkuYzogd3JpdGluZyBhbiBlbnRyeSB0byB0aGUgZmlsZSBzeXN0ZW0gKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfc2V0X3dyaXRlZGlyIChjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY193cml0ZV9lbnRyeSAoVEVSTVRZUEUgKmNvbnN0KTsKKworLyogY29tcF9wYXJzZS5jOiBlbnRyeSBsaXN0IGhhbmRsaW5nICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX3JlYWRfZW50cnlfc291cmNlIChGSUxFKiwgY2hhciosIGludCwgYm9vbCwgYm9vbCAoKikoRU5UUlkqKSk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgX25jX2VudHJ5X21hdGNoIChjaGFyICosIGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBfbmNfcmVzb2x2ZV91c2VzIChib29sKTsgLyogb2JzIDIwMDQwNzA1ICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBfbmNfcmVzb2x2ZV91c2VzMiAoYm9vbCwgYm9vbCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX2ZyZWVfZW50cmllcyAoRU5UUlkgKik7CitleHRlcm4gTkNVUlNFU19JTVBFWFAgdm9pZCBOQ1VSU0VTX0FQSSAoKl9uY19jaGVja190ZXJtdHlwZSkoVEVSTVRZUEUgKik7IC8qIG9icyAyMDA0MDcwNSAqLworZXh0ZXJuIE5DVVJTRVNfSU1QRVhQIHZvaWQgTkNVUlNFU19BUEkgKCpfbmNfY2hlY2tfdGVybXR5cGUyKShURVJNVFlQRSAqLCBib29sKTsKKworLyogdHJhY2VfeG5hbWVzLmMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfdHJhY2VfeG5hbWVzIChURVJNVFlQRSAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIE5DVVJTRVNfVEVSTV9FTlRSWV9IX2luY2wgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGVybWNhcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS90ZXJtY2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3NDUxZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGVybWNhcC5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgsMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQXV0aG9yOiBaZXlkIE0uIEJlbi1IYWxpbSA8em1iZW5oYWxAbmV0Y29tLmNvbT4gMTk5MiwxOTk1ICAgICAgICAgICAgICAgKgorICogICAgIGFuZDogRXJpYyBTLiBSYXltb25kIDxlc3JAc25hcmsudGh5cnN1cy5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAkSWQ6IHRlcm1jYXAuaC5pbix2IDEuMTYgMjAwMS8wMy8yNCAyMTo1MzoyNyB0b20gRXhwICQgKi8KKworI2lmbmRlZiBOQ1VSU0VTX1RFUk1DQVBfSF9pbmNsCisjZGVmaW5lIE5DVVJTRVNfVEVSTUNBUF9IX2luY2wJMQorCisjdW5kZWYgIE5DVVJTRVNfVkVSU0lPTgorI2RlZmluZSBOQ1VSU0VTX1ZFUlNJT04gIjUuOSIKKworI2luY2x1ZGUgPG5jdXJzZXNfZGxsLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI3VuZGVmICBOQ1VSU0VTX0NPTlNUIAorI2RlZmluZSBOQ1VSU0VTX0NPTlNUIGNvbnN0IAorCisjdW5kZWYgIE5DVVJTRVNfT1NQRUVEIAorI2RlZmluZSBOQ1VSU0VTX09TUEVFRCBzaG9ydCAKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihjaGFyKSBQQzsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoY2hhciAqKSBVUDsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoY2hhciAqKSBCQzsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoTkNVUlNFU19PU1BFRUQpIG9zcGVlZDsgCisKKyNpZiAhZGVmaW5lZChOQ1VSU0VTX1RFUk1fSF9pbmNsKQorZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgdGdldHN0ciAoTkNVUlNFU19DT05TVCBjaGFyICosIGNoYXIgKiopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgdGdvdG8gKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdGdldGVudCAoY2hhciAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdGdldGZsYWcgKE5DVVJTRVNfQ09OU1QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHRnZXRudW0gKE5DVVJTRVNfQ09OU1QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHRwdXRzIChjb25zdCBjaGFyICosIGludCwgaW50ICgqKShpbnQpKTsKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogTkNVUlNFU19URVJNQ0FQX0hfaW5jbCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS90ZXJtaW8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGVybWlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2MTBmMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGVybWlvLmgKQEAgLTAsMCArMSw2IEBACisvKiBDb21wYXRpYmxlIDx0ZXJtaW8uaD4gZm9yIG9sZCBgc3RydWN0IHRlcm1pbycgaW9jdGwgaW50ZXJmYWNlLgorICAgVGhpcyBpcyBvYnNvbGV0ZTsgdXNlIHRoZSBQT1NJWC4xIGBzdHJ1Y3QgdGVybWlvcycgaW50ZXJmYWNlCisgICBkZWZpbmVkIGluIDx0ZXJtaW9zLmg+IGluc3RlYWQuICAqLworCisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS90ZXJtaW9zLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3Rlcm1pb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGRlNmQzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS90ZXJtaW9zLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0xOTk0LDE5OTYtMTk5OSwyMDAzLDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglQT1NJWCBTdGFuZGFyZDogNy4xLTIgR2VuZXJhbCBUZXJtaW5hbCBJbnRlcmZhY2UJPHRlcm1pb3MuaD4KKyAqLworCisjaWZuZGVmCV9URVJNSU9TX0gKKyNkZWZpbmUJX1RFUk1JT1NfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2lmIGRlZmluZWQgX19VU0VfVU5JWDk4IHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKy8qIFdlIG5lZWQgYHBpZF90Jy4gICovCisjIGluY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKyMgaWZuZGVmIF9fcGlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3BpZF90IHBpZF90OworIyAgZGVmaW5lIF9fcGlkX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCisKK19fQkVHSU5fREVDTFMKKworLyogR2V0IHRoZSBzeXN0ZW0tZGVwZW5kZW50IGRlZmluaXRpb25zIG9mIGBzdHJ1Y3QgdGVybWlvcycsIGB0Y2ZsYWdfdCcsCisgICBgY2NfdCcsIGBzcGVlZF90JywgYW5kIGFsbCB0aGUgbWFjcm9zIHNwZWNpZnlpbmcgdGhlIGZsYWcgYml0cy4gICovCisjaW5jbHVkZSA8Yml0cy90ZXJtaW9zLmg+CisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIENvbXBhcmUgYSBjaGFyYWN0ZXIgQyB0byBhIHZhbHVlIFZBTCBmcm9tIHRoZSBgY19jYycgYXJyYXkgaW4gYQorICAgYHN0cnVjdCB0ZXJtaW9zJy4gIElmIFZBTCBpcyBfUE9TSVhfVkRJU0FCTEUsIG5vIGNoYXJhY3RlciBjYW4gbWF0Y2ggaXQuICAqLworIyBkZWZpbmUgQ0NFUSh2YWwsIGMpCSgoYykgPT0gKHZhbCkgJiYgKHZhbCkgIT0gX1BPU0lYX1ZESVNBQkxFKQorI2VuZGlmCisKKy8qIFJldHVybiB0aGUgb3V0cHV0IGJhdWQgcmF0ZSBzdG9yZWQgaW4gKlRFUk1JT1NfUC4gICovCitleHRlcm4gc3BlZWRfdCBjZmdldG9zcGVlZCAoX19jb25zdCBzdHJ1Y3QgdGVybWlvcyAqX190ZXJtaW9zX3ApIF9fVEhST1c7CisKKy8qIFJldHVybiB0aGUgaW5wdXQgYmF1ZCByYXRlIHN0b3JlZCBpbiAqVEVSTUlPU19QLiAgKi8KK2V4dGVybiBzcGVlZF90IGNmZ2V0aXNwZWVkIChfX2NvbnN0IHN0cnVjdCB0ZXJtaW9zICpfX3Rlcm1pb3NfcCkgX19USFJPVzsKKworLyogU2V0IHRoZSBvdXRwdXQgYmF1ZCByYXRlIHN0b3JlZCBpbiAqVEVSTUlPU19QIHRvIFNQRUVELiAgKi8KK2V4dGVybiBpbnQgY2ZzZXRvc3BlZWQgKHN0cnVjdCB0ZXJtaW9zICpfX3Rlcm1pb3NfcCwgc3BlZWRfdCBfX3NwZWVkKSBfX1RIUk9XOworCisvKiBTZXQgdGhlIGlucHV0IGJhdWQgcmF0ZSBzdG9yZWQgaW4gKlRFUk1JT1NfUCB0byBTUEVFRC4gICovCitleHRlcm4gaW50IGNmc2V0aXNwZWVkIChzdHJ1Y3QgdGVybWlvcyAqX190ZXJtaW9zX3AsIHNwZWVkX3QgX19zcGVlZCkgX19USFJPVzsKKworI2lmZGVmCV9fVVNFX0JTRAorLyogU2V0IGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgYmF1ZCByYXRlcyBpbiAqVEVSTUlPU19PUCB0byBTUEVFRC4gICovCitleHRlcm4gaW50IGNmc2V0c3BlZWQgKHN0cnVjdCB0ZXJtaW9zICpfX3Rlcm1pb3NfcCwgc3BlZWRfdCBfX3NwZWVkKSBfX1RIUk9XOworI2VuZGlmCisKKworLyogUHV0IHRoZSBzdGF0ZSBvZiBGRCBpbnRvICpURVJNSU9TX1AuICAqLworZXh0ZXJuIGludCB0Y2dldGF0dHIgKGludCBfX2ZkLCBzdHJ1Y3QgdGVybWlvcyAqX190ZXJtaW9zX3ApIF9fVEhST1c7CisKKy8qIFNldCB0aGUgc3RhdGUgb2YgRkQgdG8gKlRFUk1JT1NfUC4KKyAgIFZhbHVlcyBmb3IgT1BUSU9OQUxfQUNUSU9OUyAoVENTQSopIGFyZSBpbiA8Yml0cy90ZXJtaW9zLmg+LiAgKi8KK2V4dGVybiBpbnQgdGNzZXRhdHRyIChpbnQgX19mZCwgaW50IF9fb3B0aW9uYWxfYWN0aW9ucywKKwkJICAgICAgX19jb25zdCBzdHJ1Y3QgdGVybWlvcyAqX190ZXJtaW9zX3ApIF9fVEhST1c7CisKKworI2lmZGVmCV9fVVNFX0JTRAorLyogU2V0ICpURVJNSU9TX1AgdG8gaW5kaWNhdGUgcmF3IG1vZGUuICAqLworZXh0ZXJuIHZvaWQgY2ZtYWtlcmF3IChzdHJ1Y3QgdGVybWlvcyAqX190ZXJtaW9zX3ApIF9fVEhST1c7CisjZW5kaWYKKworLyogU2VuZCB6ZXJvIGJpdHMgb24gRkQuICAqLworZXh0ZXJuIGludCB0Y3NlbmRicmVhayAoaW50IF9fZmQsIGludCBfX2R1cmF0aW9uKSBfX1RIUk9XOworCisvKiBXYWl0IGZvciBwZW5kaW5nIG91dHB1dCB0byBiZSB3cml0dGVuIG9uIEZELgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgdGNkcmFpbiAoaW50IF9fZmQpOworCisvKiBGbHVzaCBwZW5kaW5nIGRhdGEgb24gRkQuCisgICBWYWx1ZXMgZm9yIFFVRVVFX1NFTEVDVE9SIChUQ3tJLE8sSU99RkxVU0gpIGFyZSBpbiA8Yml0cy90ZXJtaW9zLmg+LiAgKi8KK2V4dGVybiBpbnQgdGNmbHVzaCAoaW50IF9fZmQsIGludCBfX3F1ZXVlX3NlbGVjdG9yKSBfX1RIUk9XOworCisvKiBTdXNwZW5kIG9yIHJlc3RhcnQgdHJhbnNtaXNzaW9uIG9uIEZELgorICAgVmFsdWVzIGZvciBBQ1RJT04gKFRDW0lPXXtPRkYsT059KSBhcmUgaW4gPGJpdHMvdGVybWlvcy5oPi4gICovCitleHRlcm4gaW50IHRjZmxvdyAoaW50IF9fZmQsIGludCBfX2FjdGlvbikgX19USFJPVzsKKworCisjaWZkZWYgX19VU0VfVU5JWDk4CisvKiBHZXQgcHJvY2VzcyBncm91cCBJRCBmb3Igc2Vzc2lvbiBsZWFkZXIgZm9yIGNvbnRyb2xsaW5nIHRlcm1pbmFsIEZELiAgKi8KK2V4dGVybiBfX3BpZF90IHRjZ2V0c2lkIChpbnQgX19mZCkgX19USFJPVzsKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9CU0QKKyMgaW5jbHVkZSA8c3lzL3R0eWRlZmF1bHRzLmg+CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHRlcm1pb3MuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGdtYXRoLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3RnbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZmRkMjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3RnbWF0aC5oCkBAIC0wLDAgKzEsNDU2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDcKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJSVNPIEM5OSBTdGFuZGFyZDogNy4yMiBUeXBlLWdlbmVyaWMgbWF0aAk8dGdtYXRoLmg+CisgKi8KKworI2lmbmRlZiBfVEdNQVRIX0gKKyNkZWZpbmUgX1RHTUFUSF9ICTEKKworLyogSW5jbHVkZSB0aGUgbmVlZGVkIGhlYWRlcnMuICAqLworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxjb21wbGV4Lmg+CisKKworLyogU2luY2UgYGNvbXBsZXgnIGlzIGN1cnJlbnRseSBub3QgcmVhbGx5IGltcGxlbWVudGVkIGluIG1vc3QgQyBjb21waWxlcnMKKyAgIGFuZCBpZiBpdCBpcyBpbXBsZW1lbnRlZCwgdGhlIGltcGxlbWVudGF0aW9ucyBkaWZmZXIuICBUaGlzIG1ha2VzIGl0CisgICBxdWl0ZSBkaWZmaWN1bHQgdG8gd3JpdGUgYSBnZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaGVhZGVyLiAgV2UKKyAgIGRvIG5vdCB0cnkgdGhpcyBmb3Igbm93IGFuZCBpbnN0ZWFkIGNvbmNlbnRyYXRlIG9ubHkgb24gR05VIENDLiAgT25jZQorICAgd2UgaGF2ZSBtb3JlIGluZm9ybWF0aW9uIHN1cHBvcnQgZm9yIG90aGVyIGNvbXBpbGVycyBtaWdodCBmb2xsb3cuICAqLworCisjaWYgX19HTlVDX1BSRVJFUSAoMiwgNykKKworIyBpZmRlZiBfX05PX0xPTkdfRE9VQkxFX01BVEgKKyMgIGRlZmluZSBfX3RnbWwoZmN0KSBmY3QKKyMgZWxzZQorIyAgZGVmaW5lIF9fdGdtbChmY3QpIGZjdCAjIyBsCisjIGVuZGlmCisKKy8qIFRoaXMgaXMgdWdseSBidXQgdW5sZXNzIGdjYyBnZXRzIGFwcHJvcHJpYXRlIGJ1aWx0aW5zIHdlIGhhdmUgdG8gZG8KKyAgIHNvbWV0aGluZyBsaWtlIHRoaXMuICBEb24ndCBhc2sgaG93IGl0IHdvcmtzLiAgKi8KKworLyogMSBpZiAndHlwZScgaXMgYSBmbG9hdGluZyB0eXBlLCAwIGlmICd0eXBlJyBpcyBhbiBpbnRlZ2VyIHR5cGUuCisgICBBbGxvd3MgZm9yIF9Cb29sLiAgRXhwYW5kcyB0byBhbiBpbnRlZ2VyIGNvbnN0YW50IGV4cHJlc3Npb24uICAqLworIyBpZiBfX0dOVUNfUFJFUkVRICgzLCAxKQorIyAgZGVmaW5lIF9fZmxvYXRpbmdfdHlwZSh0eXBlKSBcCisgIChfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoKHR5cGUpIDApID09IDggXAorICAgfHwgKF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlICgodHlwZSkgMCkgPT0gOSBcCisgICAgICAgJiYgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKF9fcmVhbF9fICgodHlwZSkgMCkpID09IDgpKQorIyBlbHNlCisjICBkZWZpbmUgX19mbG9hdGluZ190eXBlKHR5cGUpICgoKHR5cGUpIDAuMjUpICYmICgodHlwZSkgMC4yNSAtIDEpKQorIyBlbmRpZgorCisvKiBUaGUgdGdtYXRoIHJlYWwgdHlwZSBmb3IgVCwgd2hlcmUgRSBpcyAwIGlmIFQgaXMgYW4gaW50ZWdlciB0eXBlIGFuZAorICAgMSBmb3IgYSBmbG9hdGluZyB0eXBlLiAgKi8KKyMgZGVmaW5lIF9fdGdtYXRoX3JlYWxfdHlwZV9zdWIoVCwgRSkgXAorICBfX3R5cGVvZl9fICgqKDAgPyAoX190eXBlb2ZfXyAoMCA/IChkb3VibGUgKikgMCA6ICh2b2lkICopIChFKSkpIDAJICAgICAgXAorCQkgIDogKF9fdHlwZW9mX18gKDAgPyAoVCAqKSAwIDogKHZvaWQgKikgKCEoRSkpKSkgMCkpCisKKy8qIFRoZSB0Z21hdGggcmVhbCB0eXBlIG9mIEVYUFIuICAqLworIyBkZWZpbmUgX190Z21hdGhfcmVhbF90eXBlKGV4cHIpIFwKKyAgX190Z21hdGhfcmVhbF90eXBlX3N1YiAoX190eXBlb2ZfXyAoKF9fdHlwZW9mX18gKGV4cHIpKSAwKSwJCSAgICAgIFwKKwkJCSAgX19mbG9hdGluZ190eXBlIChfX3R5cGVvZl9fIChleHByKSkpCisKKworLyogV2UgaGF2ZSB0d28ga2luZHMgb2YgZ2VuZXJpYyBtYWNyb3M6IHRvIHN1cHBvcnQgZnVuY3Rpb25zIHdoaWNoIGFyZQorICAgb25seSBkZWZpbmVkIG9uIHJlYWwgdmFsdWVkIHBhcmFtZXRlcnMgYW5kIHRob3NlIHdoaWNoIGFyZSBkZWZpbmVkCisgICBmb3IgY29tcGxleCBmdW5jdGlvbnMgYXMgd2VsbC4gICovCisjIGRlZmluZSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkoVmFsLCBGY3QpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18gKChzaXplb2YgKFZhbCkgPT0gc2l6ZW9mIChkb3VibGUpCQkJICAgICAgXAorCQkgICAgICB8fCBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoVmFsKSAhPSA4KQkJICAgICAgXAorCQkgICAgID8gKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgRmN0IChWYWwpCQkgICAgICBcCisJCSAgICAgOiAoc2l6ZW9mIChWYWwpID09IHNpemVvZiAoZmxvYXQpKQkJCSAgICAgIFwKKwkJICAgICA/IChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIEZjdCMjZiAoVmFsKQkJICAgICAgXAorCQkgICAgIDogKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgX190Z21sKEZjdCkgKFZhbCkpKQorCisjIGRlZmluZSBfX1RHTUFUSF9VTkFSWV9SRUFMX1JFVF9PTkxZKFZhbCwgUmV0VHlwZSwgRmN0KSBcCisgICAgIChfX2V4dGVuc2lvbl9fICgoc2l6ZW9mIChWYWwpID09IHNpemVvZiAoZG91YmxlKQkJCSAgICAgIFwKKwkJICAgICAgfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKFZhbCkgIT0gOCkJCSAgICAgIFwKKwkJICAgICA/IChSZXRUeXBlKSBGY3QgKFZhbCkJCQkJICAgICAgXAorCQkgICAgIDogKHNpemVvZiAoVmFsKSA9PSBzaXplb2YgKGZsb2F0KSkJCQkgICAgICBcCisJCSAgICAgPyAoUmV0VHlwZSkgRmN0IyNmIChWYWwpCQkJCSAgICAgIFwKKwkJICAgICA6IChSZXRUeXBlKSBfX3RnbWwoRmN0KSAoVmFsKSkpCisKKyMgZGVmaW5lIF9fVEdNQVRIX0JJTkFSWV9GSVJTVF9SRUFMX09OTFkoVmFsMSwgVmFsMiwgRmN0KSBcCisgICAgIChfX2V4dGVuc2lvbl9fICgoc2l6ZW9mIChWYWwxKSA9PSBzaXplb2YgKGRvdWJsZSkJCQkgICAgICBcCisJCSAgICAgIHx8IF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChWYWwxKSAhPSA4KQkJICAgICAgXAorCQkgICAgID8gKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMSkpIEZjdCAoVmFsMSwgVmFsMikJICAgICAgXAorCQkgICAgIDogKHNpemVvZiAoVmFsMSkgPT0gc2l6ZW9mIChmbG9hdCkpCQkgICAgICBcCisJCSAgICAgPyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgRmN0IyNmIChWYWwxLCBWYWwyKQkgICAgICBcCisJCSAgICAgOiAoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgX190Z21sKEZjdCkgKFZhbDEsIFZhbDIpKSkKKworIyBkZWZpbmUgX19UR01BVEhfQklOQVJZX1JFQUxfT05MWShWYWwxLCBWYWwyLCBGY3QpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18gKCgoc2l6ZW9mIChWYWwxKSA+IHNpemVvZiAoZG91YmxlKQkJCSAgICAgIFwKKwkJICAgICAgIHx8IHNpemVvZiAoVmFsMikgPiBzaXplb2YgKGRvdWJsZSkpCQkgICAgICBcCisJCSAgICAgICYmIF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlICgoVmFsMSkgKyAoVmFsMikpID09IDgpICAgICAgXAorCQkgICAgID8gKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDApKQkgICAgICBcCisJCSAgICAgICBfX3RnbWwoRmN0KSAoVmFsMSwgVmFsMikJCQkJICAgICAgXAorCQkgICAgIDogKHNpemVvZiAoVmFsMSkgPT0gc2l6ZW9mIChkb3VibGUpCQkgICAgICBcCisJCQl8fCBzaXplb2YgKFZhbDIpID09IHNpemVvZiAoZG91YmxlKQkJICAgICAgXAorCQkJfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKFZhbDEpICE9IDgJCSAgICAgIFwKKwkJCXx8IF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChWYWwyKSAhPSA4KQkJICAgICAgXAorCQkgICAgID8gKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDApKQkgICAgICBcCisJCSAgICAgICBGY3QgKFZhbDEsIFZhbDIpCQkJCQkgICAgICBcCisJCSAgICAgOiAoX190eXBlb2YgKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSAwCQkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMCkpCSAgICAgIFwKKwkJICAgICAgIEZjdCMjZiAoVmFsMSwgVmFsMikpKQorCisjIGRlZmluZSBfX1RHTUFUSF9URVJOQVJZX0ZJUlNUX1NFQ09ORF9SRUFMX09OTFkoVmFsMSwgVmFsMiwgVmFsMywgRmN0KSBcCisgICAgIChfX2V4dGVuc2lvbl9fICgoKHNpemVvZiAoVmFsMSkgPiBzaXplb2YgKGRvdWJsZSkJCQkgICAgICBcCisJCSAgICAgICB8fCBzaXplb2YgKFZhbDIpID4gc2l6ZW9mIChkb3VibGUpKQkJICAgICAgXAorCQkgICAgICAmJiBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoKFZhbDEpICsgKFZhbDIpKSA9PSA4KSAgICAgIFwKKwkJICAgICA/IChfX3R5cGVvZiAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMSkpIDAJCSAgICAgIFwKKwkJCQkgICArIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDIpKSAwKSkJICAgICAgXAorCQkgICAgICAgX190Z21sKEZjdCkgKFZhbDEsIFZhbDIsIFZhbDMpCQkJICAgICAgXAorCQkgICAgIDogKHNpemVvZiAoVmFsMSkgPT0gc2l6ZW9mIChkb3VibGUpCQkgICAgICBcCisJCQl8fCBzaXplb2YgKFZhbDIpID09IHNpemVvZiAoZG91YmxlKQkJICAgICAgXAorCQkJfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKFZhbDEpICE9IDgJCSAgICAgIFwKKwkJCXx8IF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChWYWwyKSAhPSA4KQkJICAgICAgXAorCQkgICAgID8gKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDApKQkgICAgICBcCisJCSAgICAgICBGY3QgKFZhbDEsIFZhbDIsIFZhbDMpCQkJCSAgICAgIFwKKwkJICAgICA6IChfX3R5cGVvZiAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMSkpIDAJCSAgICAgIFwKKwkJCQkgICArIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDIpKSAwKSkJICAgICAgXAorCQkgICAgICAgRmN0IyNmIChWYWwxLCBWYWwyLCBWYWwzKSkpCisKKyMgZGVmaW5lIF9fVEdNQVRIX1RFUk5BUllfUkVBTF9PTkxZKFZhbDEsIFZhbDIsIFZhbDMsIEZjdCkgXAorICAgICAoX19leHRlbnNpb25fXyAoKChzaXplb2YgKFZhbDEpID4gc2l6ZW9mIChkb3VibGUpCQkJICAgICAgXAorCQkgICAgICAgfHwgc2l6ZW9mIChWYWwyKSA+IHNpemVvZiAoZG91YmxlKQkJICAgICAgXAorCQkgICAgICAgfHwgc2l6ZW9mIChWYWwzKSA+IHNpemVvZiAoZG91YmxlKSkJCSAgICAgIFwKKwkJICAgICAgJiYgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKChWYWwxKSArIChWYWwyKSArIChWYWwzKSkgICBcCisJCQkgPT0gOCkJCQkJCQkgICAgICBcCisJCSAgICAgPyAoX190eXBlb2YgKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSAwCQkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMAkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwzKSkgMCkpCSAgICAgIFwKKwkJICAgICAgIF9fdGdtbChGY3QpIChWYWwxLCBWYWwyLCBWYWwzKQkJCSAgICAgIFwKKwkJICAgICA6IChzaXplb2YgKFZhbDEpID09IHNpemVvZiAoZG91YmxlKQkJICAgICAgXAorCQkJfHwgc2l6ZW9mIChWYWwyKSA9PSBzaXplb2YgKGRvdWJsZSkJCSAgICAgIFwKKwkJCXx8IHNpemVvZiAoVmFsMykgPT0gc2l6ZW9mIChkb3VibGUpCQkgICAgICBcCisJCQl8fCBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoVmFsMSkgIT0gOAkJICAgICAgXAorCQkJfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKFZhbDIpICE9IDgJCSAgICAgIFwKKwkJCXx8IF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChWYWwzKSAhPSA4KQkJICAgICAgXAorCQkgICAgID8gKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDAJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMykpIDApKQkgICAgICBcCisJCSAgICAgICBGY3QgKFZhbDEsIFZhbDIsIFZhbDMpCQkJCSAgICAgIFwKKwkJICAgICA6IChfX3R5cGVvZiAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMSkpIDAJCSAgICAgIFwKKwkJCQkgICArIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDIpKSAwCSAgICAgIFwKKwkJCQkgICArIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDMpKSAwKSkJICAgICAgXAorCQkgICAgICAgRmN0IyNmIChWYWwxLCBWYWwyLCBWYWwzKSkpCisKKy8qIFhYWCBUaGlzIGRlZmluaXRpb24gaGFzIHRvIGJlIGNoYW5nZWQgYXMgc29vbiBhcyB0aGUgY29tcGlsZXIgdW5kZXJzdGFuZHMKKyAgIHRoZSBpbWFnaW5hcnkga2V5d29yZC4gICovCisjIGRlZmluZSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcoVmFsLCBGY3QsIENmY3QpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18gKChzaXplb2YgKF9fcmVhbF9fIChWYWwpKSA9PSBzaXplb2YgKGRvdWJsZSkJICAgICAgXAorCQkgICAgICB8fCBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoX19yZWFsX18gKFZhbCkpICE9IDgpCSAgICAgIFwKKwkJICAgICA/ICgoc2l6ZW9mIChfX3JlYWxfXyAoVmFsKSkgPT0gc2l6ZW9mIChWYWwpKQkgICAgICBcCisJCQk/IChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIEZjdCAoVmFsKQkJICAgICAgXAorCQkJOiAoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSBDZmN0IChWYWwpKQkgICAgICBcCisJCSAgICAgOiAoc2l6ZW9mIChfX3JlYWxfXyAoVmFsKSkgPT0gc2l6ZW9mIChmbG9hdCkpCSAgICAgIFwKKwkJICAgICA/ICgoc2l6ZW9mIChfX3JlYWxfXyAoVmFsKSkgPT0gc2l6ZW9mIChWYWwpKQkgICAgICBcCisJCQk/IChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIEZjdCMjZiAoVmFsKQkgICAgICBcCisJCQk6IChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIENmY3QjI2YgKFZhbCkpCSAgICAgIFwKKwkJICAgICA6ICgoc2l6ZW9mIChfX3JlYWxfXyAoVmFsKSkgPT0gc2l6ZW9mIChWYWwpKQkgICAgICBcCisJCQk/IChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIF9fdGdtbChGY3QpIChWYWwpCSAgICAgIFwKKwkJCTogKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgX190Z21sKENmY3QpIChWYWwpKSkpCisKKyMgZGVmaW5lIF9fVEdNQVRIX1VOQVJZX0lNQUcoVmFsLCBDZmN0KSBcCisgICAgIChfX2V4dGVuc2lvbl9fICgoc2l6ZW9mIChfX3JlYWxfXyAoVmFsKSkgPT0gc2l6ZW9mIChkb3VibGUpCSAgICAgIFwKKwkJICAgICAgfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKF9fcmVhbF9fIChWYWwpKSAhPSA4KQkgICAgICBcCisJCSAgICAgPyAoX190eXBlb2ZfXyAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgMAkgICAgICBcCisJCQkJICAgICsgX0NvbXBsZXhfSSkpIENmY3QgKFZhbCkJCSAgICAgIFwKKwkJICAgICA6IChzaXplb2YgKF9fcmVhbF9fIChWYWwpKSA9PSBzaXplb2YgKGZsb2F0KSkJICAgICAgXAorCQkgICAgID8gKF9fdHlwZW9mX18gKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIDAJICAgICAgXAorCQkJCSAgICArIF9Db21wbGV4X0kpKSBDZmN0IyNmIChWYWwpCSAgICAgIFwKKwkJICAgICA6IChfX3R5cGVvZl9fICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSAwCSAgICAgIFwKKwkJCQkgICAgKyBfQ29tcGxleF9JKSkgX190Z21sKENmY3QpIChWYWwpKSkKKworLyogWFhYIFRoaXMgZGVmaW5pdGlvbiBoYXMgdG8gYmUgY2hhbmdlZCBhcyBzb29uIGFzIHRoZSBjb21waWxlciB1bmRlcnN0YW5kcworICAgdGhlIGltYWdpbmFyeSBrZXl3b3JkLiAgKi8KKyMgZGVmaW5lIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BR19SRVRfUkVBTChWYWwsIEZjdCwgQ2ZjdCkgXAorICAgICAoX19leHRlbnNpb25fXyAoKHNpemVvZiAoX19yZWFsX18gKFZhbCkpID09IHNpemVvZiAoZG91YmxlKQkgICAgICBcCisJCSAgICAgIHx8IF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChfX3JlYWxfXyAoVmFsKSkgIT0gOCkJICAgICAgXAorCQkgICAgID8gKChzaXplb2YgKF9fcmVhbF9fIChWYWwpKSA9PSBzaXplb2YgKFZhbCkpCSAgICAgIFwKKwkJCT8gKF9fdHlwZW9mX18gKF9fcmVhbF9fIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIDApKVwKKwkJCSAgRmN0IChWYWwpCQkJCQkgICAgICBcCisJCQk6IChfX3R5cGVvZl9fIChfX3JlYWxfXyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSAwKSlcCisJCQkgIENmY3QgKFZhbCkpCQkJCQkgICAgICBcCisJCSAgICAgOiAoc2l6ZW9mIChfX3JlYWxfXyAoVmFsKSkgPT0gc2l6ZW9mIChmbG9hdCkpCSAgICAgIFwKKwkJICAgICA/ICgoc2l6ZW9mIChfX3JlYWxfXyAoVmFsKSkgPT0gc2l6ZW9mIChWYWwpKQkgICAgICBcCisJCQk/IChfX3R5cGVvZl9fIChfX3JlYWxfXyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSAwKSlcCisJCQkgIEZjdCMjZiAoVmFsKQkJCQkJICAgICAgXAorCQkJOiAoX190eXBlb2ZfXyAoX19yZWFsX18gKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgMCkpXAorCQkJICBDZmN0IyNmIChWYWwpKQkJCQkgICAgICBcCisJCSAgICAgOiAoKHNpemVvZiAoX19yZWFsX18gKFZhbCkpID09IHNpemVvZiAoVmFsKSkJICAgICAgXAorCQkJPyAoX190eXBlb2ZfXyAoX19yZWFsX18gKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgMCkpXAorCQkJICBfX3RnbWwoRmN0KSAoVmFsKQkJCQkgICAgICBcCisJCQk6IChfX3R5cGVvZl9fIChfX3JlYWxfXyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSAwKSlcCisJCQkgIF9fdGdtbChDZmN0KSAoVmFsKSkpKQorCisvKiBYWFggVGhpcyBkZWZpbml0aW9uIGhhcyB0byBiZSBjaGFuZ2VkIGFzIHNvb24gYXMgdGhlIGNvbXBpbGVyIHVuZGVyc3RhbmRzCisgICB0aGUgaW1hZ2luYXJ5IGtleXdvcmQuICAqLworIyBkZWZpbmUgX19UR01BVEhfQklOQVJZX1JFQUxfSU1BRyhWYWwxLCBWYWwyLCBGY3QsIENmY3QpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18gKCgoc2l6ZW9mIChfX3JlYWxfXyAoVmFsMSkpID4gc2l6ZW9mIChkb3VibGUpCSAgICAgIFwKKwkJICAgICAgIHx8IHNpemVvZiAoX19yZWFsX18gKFZhbDIpKSA+IHNpemVvZiAoZG91YmxlKSkJICAgICAgXAorCQkgICAgICAmJiBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoX19yZWFsX18gKFZhbDEpCSAgICAgIFwKKwkJCQkJCSAgKyBfX3JlYWxfXyAoVmFsMikpID09IDgpICAgIFwKKwkJICAgICA/ICgoc2l6ZW9mIChfX3JlYWxfXyAoVmFsMSkpID09IHNpemVvZiAoVmFsMSkJICAgICAgXAorCQkJICYmIHNpemVvZiAoX19yZWFsX18gKFZhbDIpKSA9PSBzaXplb2YgKFZhbDIpKQkgICAgICBcCisJCQk/IChfX3R5cGVvZiAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMSkpIDAJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDApKQkgICAgICBcCisJCQkgIF9fdGdtbChGY3QpIChWYWwxLCBWYWwyKQkJCSAgICAgIFwKKwkJCTogKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMCkpCSAgICAgIFwKKwkJCSAgX190Z21sKENmY3QpIChWYWwxLCBWYWwyKSkJCQkgICAgICBcCisJCSAgICAgOiAoc2l6ZW9mIChfX3JlYWxfXyAoVmFsMSkpID09IHNpemVvZiAoZG91YmxlKQkgICAgICBcCisJCQl8fCBzaXplb2YgKF9fcmVhbF9fIChWYWwyKSkgPT0gc2l6ZW9mIChkb3VibGUpCSAgICAgIFwKKwkJCXx8IF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChfX3JlYWxfXyAoVmFsMSkpICE9IDggICAgIFwKKwkJCXx8IF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChfX3JlYWxfXyAoVmFsMikpICE9IDgpICAgIFwKKwkJICAgICA/ICgoc2l6ZW9mIChfX3JlYWxfXyAoVmFsMSkpID09IHNpemVvZiAoVmFsMSkJICAgICAgXAorCQkJICYmIHNpemVvZiAoX19yZWFsX18gKFZhbDIpKSA9PSBzaXplb2YgKFZhbDIpKQkgICAgICBcCisJCQk/IChfX3R5cGVvZiAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMSkpIDAJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDApKQkgICAgICBcCisJCQkgIEZjdCAoVmFsMSwgVmFsMikJCQkJICAgICAgXAorCQkJOiAoX190eXBlb2YgKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSAwCSAgICAgIFwKKwkJCQkgICArIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDIpKSAwKSkJICAgICAgXAorCQkJICBDZmN0IChWYWwxLCBWYWwyKSkJCQkJICAgICAgXAorCQkgICAgIDogKChzaXplb2YgKF9fcmVhbF9fIChWYWwxKSkgPT0gc2l6ZW9mIChWYWwxKQkgICAgICBcCisJCQkgJiYgc2l6ZW9mIChfX3JlYWxfXyAoVmFsMikpID09IHNpemVvZiAoVmFsMikpCSAgICAgIFwKKwkJCT8gKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMCkpCSAgICAgIFwKKwkJCSAgRmN0IyNmIChWYWwxLCBWYWwyKQkJCQkgICAgICBcCisJCQk6IChfX3R5cGVvZiAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMSkpIDAJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDApKQkgICAgICBcCisJCQkgIENmY3QjI2YgKFZhbDEsIFZhbDIpKSkpCisjZWxzZQorIyBlcnJvciAiVW5zdXBwb3J0ZWQgY29tcGlsZXI7IHlvdSBjYW5ub3QgdXNlIDx0Z21hdGguaD4iCisjZW5kaWYKKworCisvKiBVbmFyeSBmdW5jdGlvbnMgZGVmaW5lZCBmb3IgcmVhbCBhbmQgY29tcGxleCB2YWx1ZXMuICAqLworCisKKy8qIFRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zLiAgKi8KKworLyogQXJjIGNvc2luZSBvZiBYLiAgKi8KKyNkZWZpbmUgYWNvcyhWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCBhY29zLCBjYWNvcykKKy8qIEFyYyBzaW5lIG9mIFguICAqLworI2RlZmluZSBhc2luKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHIChWYWwsIGFzaW4sIGNhc2luKQorLyogQXJjIHRhbmdlbnQgb2YgWC4gICovCisjZGVmaW5lIGF0YW4oVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgYXRhbiwgY2F0YW4pCisvKiBBcmMgdGFuZ2VudCBvZiBZL1guICAqLworI2RlZmluZSBhdGFuMihWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBhdGFuMikKKworLyogQ29zaW5lIG9mIFguICAqLworI2RlZmluZSBjb3MoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgY29zLCBjY29zKQorLyogU2luZSBvZiBYLiAgKi8KKyNkZWZpbmUgc2luKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHIChWYWwsIHNpbiwgY3NpbikKKy8qIFRhbmdlbnQgb2YgWC4gICovCisjZGVmaW5lIHRhbihWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCB0YW4sIGN0YW4pCisKKworLyogSHlwZXJib2xpYyBmdW5jdGlvbnMuICAqLworCisvKiBIeXBlcmJvbGljIGFyYyBjb3NpbmUgb2YgWC4gICovCisjZGVmaW5lIGFjb3NoKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHIChWYWwsIGFjb3NoLCBjYWNvc2gpCisvKiBIeXBlcmJvbGljIGFyYyBzaW5lIG9mIFguICAqLworI2RlZmluZSBhc2luaChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCBhc2luaCwgY2FzaW5oKQorLyogSHlwZXJib2xpYyBhcmMgdGFuZ2VudCBvZiBYLiAgKi8KKyNkZWZpbmUgYXRhbmgoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgYXRhbmgsIGNhdGFuaCkKKworLyogSHlwZXJib2xpYyBjb3NpbmUgb2YgWC4gICovCisjZGVmaW5lIGNvc2goVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgY29zaCwgY2Nvc2gpCisvKiBIeXBlcmJvbGljIHNpbmUgb2YgWC4gICovCisjZGVmaW5lIHNpbmgoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgc2luaCwgY3NpbmgpCisvKiBIeXBlcmJvbGljIHRhbmdlbnQgb2YgWC4gICovCisjZGVmaW5lIHRhbmgoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgdGFuaCwgY3RhbmgpCisKKworLyogRXhwb25lbnRpYWwgYW5kIGxvZ2FyaXRobWljIGZ1bmN0aW9ucy4gICovCisKKy8qIEV4cG9uZW50aWFsIGZ1bmN0aW9uIG9mIFguICAqLworI2RlZmluZSBleHAoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgZXhwLCBjZXhwKQorCisvKiBCcmVhayBWQUxVRSBpbnRvIGEgbm9ybWFsaXplZCBmcmFjdGlvbiBhbmQgYW4gaW50ZWdyYWwgcG93ZXIgb2YgMi4gICovCisjZGVmaW5lIGZyZXhwKFZhbDEsIFZhbDIpIF9fVEdNQVRIX0JJTkFSWV9GSVJTVF9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIGZyZXhwKQorCisvKiBYIHRpbWVzICh0d28gdG8gdGhlIEVYUCBwb3dlcikuICAqLworI2RlZmluZSBsZGV4cChWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfRklSU1RfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBsZGV4cCkKKworLyogTmF0dXJhbCBsb2dhcml0aG0gb2YgWC4gICovCisjZGVmaW5lIGxvZyhWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCBsb2csIGNsb2cpCisKKy8qIEJhc2UtdGVuIGxvZ2FyaXRobSBvZiBYLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIGxvZzEwKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHIChWYWwsIGxvZzEwLCBfX2Nsb2cxMCkKKyNlbHNlCisjIGRlZmluZSBsb2cxMChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWSAoVmFsLCBsb2cxMCkKKyNlbmRpZgorCisvKiBSZXR1cm4gZXhwKFgpIC0gMS4gICovCisjZGVmaW5lIGV4cG0xKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9PTkxZIChWYWwsIGV4cG0xKQorCisvKiBSZXR1cm4gbG9nKDEgKyBYKS4gICovCisjZGVmaW5lIGxvZzFwKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9PTkxZIChWYWwsIGxvZzFwKQorCisvKiBSZXR1cm4gdGhlIGJhc2UgMiBzaWduZWQgaW50ZWdyYWwgZXhwb25lbnQgb2YgWC4gICovCisjZGVmaW5lIGxvZ2IoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgbG9nYikKKworLyogQ29tcHV0ZSBiYXNlLTIgZXhwb25lbnRpYWwgb2YgWC4gICovCisjZGVmaW5lIGV4cDIoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgZXhwMikKKworLyogQ29tcHV0ZSBiYXNlLTIgbG9nYXJpdGhtIG9mIFguICAqLworI2RlZmluZSBsb2cyKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9PTkxZIChWYWwsIGxvZzIpCisKKworLyogUG93ZXIgZnVuY3Rpb25zLiAgKi8KKworLyogUmV0dXJuIFggdG8gdGhlIFkgcG93ZXIuICAqLworI2RlZmluZSBwb3coVmFsMSwgVmFsMikgX19UR01BVEhfQklOQVJZX1JFQUxfSU1BRyAoVmFsMSwgVmFsMiwgcG93LCBjcG93KQorCisvKiBSZXR1cm4gdGhlIHNxdWFyZSByb290IG9mIFguICAqLworI2RlZmluZSBzcXJ0KFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHIChWYWwsIHNxcnQsIGNzcXJ0KQorCisvKiBSZXR1cm4gYHNxcnQoWCpYICsgWSpZKScuICAqLworI2RlZmluZSBoeXBvdChWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBoeXBvdCkKKworLyogUmV0dXJuIHRoZSBjdWJlIHJvb3Qgb2YgWC4gICovCisjZGVmaW5lIGNicnQoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgY2JydCkKKworCisvKiBOZWFyZXN0IGludGVnZXIsIGFic29sdXRlIHZhbHVlLCBhbmQgcmVtYWluZGVyIGZ1bmN0aW9ucy4gICovCisKKy8qIFNtYWxsZXN0IGludGVncmFsIHZhbHVlIG5vdCBsZXNzIHRoYW4gWC4gICovCisjZGVmaW5lIGNlaWwoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgY2VpbCkKKworLyogQWJzb2x1dGUgdmFsdWUgb2YgWC4gICovCisjZGVmaW5lIGZhYnMoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUdfUkVUX1JFQUwgKFZhbCwgZmFicywgY2FicykKKworLyogTGFyZ2VzdCBpbnRlZ2VyIG5vdCBncmVhdGVyIHRoYW4gWC4gICovCisjZGVmaW5lIGZsb29yKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9PTkxZIChWYWwsIGZsb29yKQorCisvKiBGbG9hdGluZy1wb2ludCBtb2R1bG8gcmVtYWluZGVyIG9mIFgvWS4gICovCisjZGVmaW5lIGZtb2QoVmFsMSwgVmFsMikgX19UR01BVEhfQklOQVJZX1JFQUxfT05MWSAoVmFsMSwgVmFsMiwgZm1vZCkKKworLyogUm91bmQgWCB0byBpbnRlZ3JhbCB2YWx1ZWluIGZsb2F0aW5nLXBvaW50IGZvcm1hdCB1c2luZyBjdXJyZW50CisgICByb3VuZGluZyBkaXJlY3Rpb24sIGJ1dCBkbyBub3QgcmFpc2UgaW5leGFjdCBleGNlcHRpb24uICAqLworI2RlZmluZSBuZWFyYnlpbnQoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgbmVhcmJ5aW50KQorCisvKiBSb3VuZCBYIHRvIG5lYXJlc3QgaW50ZWdyYWwgdmFsdWUsIHJvdW5kaW5nIGhhbGZ3YXkgY2FzZXMgYXdheSBmcm9tCisgICB6ZXJvLiAgKi8KKyNkZWZpbmUgcm91bmQoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgcm91bmQpCisKKy8qIFJvdW5kIFggdG8gdGhlIGludGVncmFsIHZhbHVlIGluIGZsb2F0aW5nLXBvaW50IGZvcm1hdCBuZWFyZXN0IGJ1dAorICAgbm90IGxhcmdlciBpbiBtYWduaXR1ZGUuICAqLworI2RlZmluZSB0cnVuYyhWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWSAoVmFsLCB0cnVuYykKKworLyogQ29tcHV0ZSByZW1haW5kZXIgb2YgWCBhbmQgWSBhbmQgcHV0IGluICpRVU8gYSB2YWx1ZSB3aXRoIHNpZ24gb2YgeC95CisgICBhbmQgbWFnbml0dWRlIGNvbmdydWVudCBgbW9kIDJebicgdG8gdGhlIG1hZ25pdHVkZSBvZiB0aGUgaW50ZWdyYWwKKyAgIHF1b3RpZW50IHgveSwgd2l0aCBuID49IDMuICAqLworI2RlZmluZSByZW1xdW8oVmFsMSwgVmFsMiwgVmFsMykgXAorICAgICBfX1RHTUFUSF9URVJOQVJZX0ZJUlNUX1NFQ09ORF9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIFZhbDMsIHJlbXF1bykKKworLyogUm91bmQgWCB0byBuZWFyZXN0IGludGVncmFsIHZhbHVlIGFjY29yZGluZyB0byBjdXJyZW50IHJvdW5kaW5nCisgICBkaXJlY3Rpb24uICAqLworI2RlZmluZSBscmludChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfUkVUX09OTFkgKFZhbCwgbG9uZyBpbnQsIGxyaW50KQorI2RlZmluZSBsbHJpbnQoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX1JFVF9PTkxZIChWYWwsIGxvbmcgbG9uZyBpbnQsIGxscmludCkKKworLyogUm91bmQgWCB0byBuZWFyZXN0IGludGVncmFsIHZhbHVlLCByb3VuZGluZyBoYWxmd2F5IGNhc2VzIGF3YXkgZnJvbQorICAgemVyby4gICovCisjZGVmaW5lIGxyb3VuZChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfUkVUX09OTFkgKFZhbCwgbG9uZyBpbnQsIGxyb3VuZCkKKyNkZWZpbmUgbGxyb3VuZChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfUkVUX09OTFkgKFZhbCwgbG9uZyBsb25nIGludCwgbGxyb3VuZCkKKworCisvKiBSZXR1cm4gWCB3aXRoIGl0cyBzaWduZWQgY2hhbmdlZCB0byBZJ3MuICAqLworI2RlZmluZSBjb3B5c2lnbihWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBjb3B5c2lnbikKKworLyogRXJyb3IgYW5kIGdhbW1hIGZ1bmN0aW9ucy4gICovCisjZGVmaW5lIGVyZihWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWSAoVmFsLCBlcmYpCisjZGVmaW5lIGVyZmMoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgZXJmYykKKyNkZWZpbmUgdGdhbW1hKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9PTkxZIChWYWwsIHRnYW1tYSkKKyNkZWZpbmUgbGdhbW1hKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9PTkxZIChWYWwsIGxnYW1tYSkKKworCisvKiBSZXR1cm4gdGhlIGludGVnZXIgbmVhcmVzdCBYIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlCisgICBwcmV2YWlsaW5nIHJvdW5kaW5nIG1vZGUuICAqLworI2RlZmluZSByaW50KFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9PTkxZIChWYWwsIHJpbnQpCisKKy8qIFJldHVybiBYICsgZXBzaWxvbiBpZiBYIDwgWSwgWCAtIGVwc2lsb24gaWYgWCA+IFkuICAqLworI2RlZmluZSBuZXh0YWZ0ZXIoVmFsMSwgVmFsMikgX19UR01BVEhfQklOQVJZX1JFQUxfT05MWSAoVmFsMSwgVmFsMiwgbmV4dGFmdGVyKQorI2RlZmluZSBuZXh0dG93YXJkKFZhbDEsIFZhbDIpIFwKKyAgICAgX19UR01BVEhfQklOQVJZX0ZJUlNUX1JFQUxfT05MWSAoVmFsMSwgVmFsMiwgbmV4dHRvd2FyZCkKKworLyogUmV0dXJuIHRoZSByZW1haW5kZXIgb2YgaW50ZWdlciBkaXZpc29uIFggLyBZIHdpdGggaW5maW5pdGUgcHJlY2lzaW9uLiAgKi8KKyNkZWZpbmUgcmVtYWluZGVyKFZhbDEsIFZhbDIpIF9fVEdNQVRIX0JJTkFSWV9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIHJlbWFpbmRlcikKKworLyogUmV0dXJuIFggdGltZXMgKDIgdG8gdGhlIE50aCBwb3dlcikuICAqLworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisjIGRlZmluZSBzY2FsYihWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBzY2FsYikKKyNlbmRpZgorCisvKiBSZXR1cm4gWCB0aW1lcyAoMiB0byB0aGUgTnRoIHBvd2VyKS4gICovCisjZGVmaW5lIHNjYWxibihWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfRklSU1RfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBzY2FsYm4pCisKKy8qIFJldHVybiBYIHRpbWVzICgyIHRvIHRoZSBOdGggcG93ZXIpLiAgKi8KKyNkZWZpbmUgc2NhbGJsbihWYWwxLCBWYWwyKSBcCisgICAgIF9fVEdNQVRIX0JJTkFSWV9GSVJTVF9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIHNjYWxibG4pCisKKy8qIFJldHVybiB0aGUgYmluYXJ5IGV4cG9uZW50IG9mIFgsIHdoaWNoIG11c3QgYmUgbm9uemVyby4gICovCisjZGVmaW5lIGlsb2diKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9SRVRfT05MWSAoVmFsLCBpbnQsIGlsb2diKQorCisKKy8qIFJldHVybiBwb3NpdGl2ZSBkaWZmZXJlbmNlIGJldHdlZW4gWCBhbmQgWS4gICovCisjZGVmaW5lIGZkaW0oVmFsMSwgVmFsMikgX19UR01BVEhfQklOQVJZX1JFQUxfT05MWSAoVmFsMSwgVmFsMiwgZmRpbSkKKworLyogUmV0dXJuIG1heGltdW0gbnVtZXJpYyB2YWx1ZSBmcm9tIFggYW5kIFkuICAqLworI2RlZmluZSBmbWF4KFZhbDEsIFZhbDIpIF9fVEdNQVRIX0JJTkFSWV9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIGZtYXgpCisKKy8qIFJldHVybiBtaW5pbXVtIG51bWVyaWMgdmFsdWUgZnJvbSBYIGFuZCBZLiAgKi8KKyNkZWZpbmUgZm1pbihWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBmbWluKQorCisKKy8qIE11bHRpcGx5LWFkZCBmdW5jdGlvbiBjb21wdXRlZCBhcyBhIHRlcm5hcnkgb3BlcmF0aW9uLiAgKi8KKyNkZWZpbmUgZm1hKFZhbDEsIFZhbDIsIFZhbDMpIFwKKyAgICAgX19UR01BVEhfVEVSTkFSWV9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIFZhbDMsIGZtYSkKKworCisvKiBBYnNvbHV0ZSB2YWx1ZSwgY29uanVnYXRlcywgYW5kIHByb2plY3Rpb24uICAqLworCisvKiBBcmd1bWVudCB2YWx1ZSBvZiBaLiAgKi8KKyNkZWZpbmUgY2FyZyhWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BR19SRVRfUkVBTCAoVmFsLCBjYXJnLCBjYXJnKQorCisvKiBDb21wbGV4IGNvbmp1Z2F0ZSBvZiBaLiAgKi8KKyNkZWZpbmUgY29uaihWYWwpIF9fVEdNQVRIX1VOQVJZX0lNQUcgKFZhbCwgY29uaikKKworLyogUHJvamVjdGlvbiBvZiBaIG9udG8gdGhlIFJpZW1hbm4gc3BoZXJlLiAgKi8KKyNkZWZpbmUgY3Byb2ooVmFsKSBfX1RHTUFUSF9VTkFSWV9JTUFHIChWYWwsIGNwcm9qKQorCisKKy8qIERlY29tcG9zaW5nIGNvbXBsZXggdmFsdWVzLiAgKi8KKworLyogSW1hZ2luYXJ5IHBhcnQgb2YgWi4gICovCisjZGVmaW5lIGNpbWFnKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHX1JFVF9SRUFMIChWYWwsIGNpbWFnLCBjaW1hZykKKworLyogUmVhbCBwYXJ0IG9mIFouICAqLworI2RlZmluZSBjcmVhbChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BR19SRVRfUkVBTCAoVmFsLCBjcmVhbCwgY3JlYWwpCisKKyNlbmRpZiAvKiB0Z21hdGguaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS90aHJlYWRfZGIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGhyZWFkX2RiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMzYjU0ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGhyZWFkX2RiLmgKQEAgLTAsMCArMSw0NTkgQEAKKy8qIHRocmVhZF9kYi5oIC0tIGludGVyZmFjZSB0byBsaWJ0aHJlYWRfZGIuc28gbGlicmFyeSBmb3IgZGVidWdnaW5nIC1scHRocmVhZAorICAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDEsMjAwMiwyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9USFJFQURfREJfSAorI2RlZmluZSBfVEhSRUFEX0RCX0gJMQorCisvKiBUaGlzIGlzIHRoZSBkZWJ1Z2dlciBpbnRlcmZhY2UgZm9yIHRoZSBOUFRMIGxpYnJhcnkuICBJdCBpcworICAgbW9kZWxsZWQgY2xvc2VseSBhZnRlciB0aGUgaW50ZXJmYWNlIHdpdGggc2FtZSBuYW1lcyBpbiBTb2xhcmlzCisgICB3aXRoIHRoZSBnb2FsIHRvIHNoYXJlIHRoZSBzYW1lIGNvZGUgaW4gdGhlIGRlYnVnZ2VyLiAgKi8KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgorCisKKy8qIEVycm9yIGNvZGVzIG9mIHRoZSBsaWJyYXJ5LiAgKi8KK3R5cGVkZWYgZW51bQoreworICBURF9PSywJICAvKiBObyBlcnJvci4gICovCisgIFREX0VSUiwJICAvKiBObyBmdXJ0aGVyIHNwZWNpZmllZCBlcnJvci4gICovCisgIFREX05PVEhSLAkgIC8qIE5vIG1hdGNoaW5nIHRocmVhZCBmb3VuZC4gICovCisgIFREX05PU1YsCSAgLyogTm8gbWF0Y2hpbmcgc3luY2hyb25pemF0aW9uIGhhbmRsZSBmb3VuZC4gICovCisgIFREX05PTFdQLAkgIC8qIE5vIG1hdGNoaW5nIGxpZ2h0LXdlaWdodGVkIHByb2Nlc3MgZm91bmQuICAqLworICBURF9CQURQSCwJICAvKiBJbnZhbGlkIHByb2Nlc3MgaGFuZGxlLiAgKi8KKyAgVERfQkFEVEgsCSAgLyogSW52YWxpZCB0aHJlYWQgaGFuZGxlLiAgKi8KKyAgVERfQkFEU0gsCSAgLyogSW52YWxpZCBzeW5jaHJvbml6YXRpb24gaGFuZGxlLiAgKi8KKyAgVERfQkFEVEEsCSAgLyogSW52YWxpZCB0aHJlYWQgYWdlbnQuICAqLworICBURF9CQURLRVksCSAgLyogSW52YWxpZCBrZXkuICAqLworICBURF9OT01TRywJICAvKiBObyBldmVudCBhdmFpbGFibGUuICAqLworICBURF9OT0ZQUkVHUywJICAvKiBObyBmbG9hdGluZy1wb2ludCByZWdpc3RlciBjb250ZW50IGF2YWlsYWJsZS4gICovCisgIFREX05PTElCVEhSRUFELCAvKiBBcHBsaWNhdGlvbiBub3QgbGlua2VkIHdpdGggdGhyZWFkIGxpYnJhcnkuICAqLworICBURF9OT0VWRU5ULAkgIC8qIFJlcXVlc3RlZCBldmVudCBpcyBub3Qgc3VwcG9ydGVkLiAgKi8KKyAgVERfTk9DQVBBQiwJICAvKiBDYXBhYmlsaXR5IG5vdCBhdmFpbGFibGUuICAqLworICBURF9EQkVSUiwJICAvKiBJbnRlcm5hbCBkZWJ1ZyBsaWJyYXJ5IGVycm9yLiAgKi8KKyAgVERfTk9BUExJQywJICAvKiBPcGVyYXRpb24gaXMgbm90IGFwcGxpY2FibGUuICAqLworICBURF9OT1RTRCwJICAvKiBObyB0aHJlYWQtc3BlY2lmaWMgZGF0YSBhdmFpbGFibGUuICAqLworICBURF9NQUxMT0MsCSAgLyogT3V0IG9mIG1lbW9yeS4gICovCisgIFREX1BBUlRJQUxSRUcsICAvKiBOb3QgZW50aXJlIHJlZ2lzdGVyIHNldCB3YXMgcmVhZCBvciB3cml0dGVuLiAgKi8KKyAgVERfTk9YUkVHUywJICAvKiBYIHJlZ2lzdGVyIHNldCBub3QgYXZhaWxhYmxlIGZvciBnaXZlbiB0aHJlYWQuICAqLworICBURF9UTFNERUZFUiwJICAvKiBUaHJlYWQgaGFzIG5vdCB5ZXQgYWxsb2NhdGVkIFRMUyBmb3IgZ2l2ZW4gbW9kdWxlLiAgKi8KKyAgVERfTk9UQUxMT0MgPSBURF9UTFNERUZFUiwKKyAgVERfVkVSU0lPTiwJICAvKiBWZXJzaW9uIGlmIGxpYnB0aHJlYWQgYW5kIGxpYnRocmVhZF9kYiBkbyBub3QgbWF0Y2guICAqLworICBURF9OT1RMUwkgIC8qIFRoZXJlIGlzIG5vIFRMUyBzZWdtZW50IGluIHRoZSBnaXZlbiBtb2R1bGUuICAqLworfSB0ZF9lcnJfZTsKKworCisvKiBQb3NzaWJsZSB0aHJlYWQgc3RhdGVzLiAgVERfVEhSX0FOWV9TVEFURSBpcyBhIHBzZXVkby1zdGF0ZSB1c2VkIHRvCisgICBzZWxlY3QgdGhyZWFkcyByZWdhcmRsZXNzIG9mIHN0YXRlIGluIHRkX3RhX3Rocl9pdGVyKCkuICAqLwordHlwZWRlZiBlbnVtCit7CisgIFREX1RIUl9BTllfU1RBVEUsCisgIFREX1RIUl9VTktOT1dOLAorICBURF9USFJfU1RPUFBFRCwKKyAgVERfVEhSX1JVTiwKKyAgVERfVEhSX0FDVElWRSwKKyAgVERfVEhSX1pPTUJJRSwKKyAgVERfVEhSX1NMRUVQLAorICBURF9USFJfU1RPUFBFRF9BU0xFRVAKK30gdGRfdGhyX3N0YXRlX2U7CisKKy8qIFRocmVhZCB0eXBlOiB1c2VyIG9yIHN5c3RlbS4gIFREX1RIUl9BTllfVFlQRSBpcyBhIHBzZXVkby10eXBlIHVzZWQKKyAgIHRvIHNlbGVjdCB0aHJlYWRzIHJlZ2FyZGxlc3Mgb2YgdHlwZSBpbiB0ZF90YV90aHJfaXRlcigpLiAgKi8KK3R5cGVkZWYgZW51bQoreworICBURF9USFJfQU5ZX1RZUEUsCisgIFREX1RIUl9VU0VSLAorICBURF9USFJfU1lTVEVNCit9IHRkX3Rocl90eXBlX2U7CisKKworLyogVHlwZXMgb2YgdGhlIGRlYnVnZ2luZyBsaWJyYXJ5LiAgKi8KKworLyogSGFuZGxlIGZvciBhIHByb2Nlc3MuICBUaGlzIHR5cGUgaXMgb3BhcXVlLiAgKi8KK3R5cGVkZWYgc3RydWN0IHRkX3RocmFnZW50IHRkX3RocmFnZW50X3Q7CisKKy8qIFRoZSBhY3R1YWwgdGhyZWFkIGhhbmRsZSB0eXBlLiAgVGhpcyBpcyBhbHNvIG9wYXF1ZS4gICovCit0eXBlZGVmIHN0cnVjdCB0ZF90aHJoYW5kbGUKK3sKKyAgdGRfdGhyYWdlbnRfdCAqdGhfdGFfcDsKKyAgcHNhZGRyX3QgdGhfdW5pcXVlOworfSB0ZF90aHJoYW5kbGVfdDsKKworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGEgdHlwZSBkZWZpbmVkIGJ5IGFuZCBmb3IgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KK3N0cnVjdCBsaW5rX21hcDsKKworCisvKiBGbGFncyBmb3IgYHRkX3RhX3Rocl9pdGVyJy4gICovCisjZGVmaW5lIFREX1RIUl9BTllfVVNFUl9GTEFHUwkweGZmZmZmZmZmCisjZGVmaW5lIFREX1RIUl9MT1dFU1RfUFJJT1JJVFkJLTIwCisjZGVmaW5lIFREX1NJR05PX01BU0sJCU5VTEwKKworCisjZGVmaW5lIFREX0VWRU5UU0laRQkyCisjZGVmaW5lIEJUX1VJU0hJRlQJNSAvKiBsb2cgYmFzZSAyIG9mIEJUX05CSVBVSSwgdG8gZXh0cmFjdCB3b3JkIGluZGV4ICovCisjZGVmaW5lIEJUX05CSVBVSQkoMSA8PCBCVF9VSVNISUZUKSAgICAgICAvKiBuIGJpdHMgcGVyIHVpbnQgKi8KKyNkZWZpbmUgQlRfVUlNQVNLCShCVF9OQklQVUkgLSAxKSAgICAgICAgIC8qIHRvIGV4dHJhY3QgYml0IGluZGV4ICovCisKKy8qIEJpdG1hc2sgb2YgZW5hYmxlZCBldmVudHMuICovCit0eXBlZGVmIHN0cnVjdCB0ZF90aHJfZXZlbnRzCit7CisgIHVpbnQzMl90IGV2ZW50X2JpdHNbVERfRVZFTlRTSVpFXTsKK30gdGRfdGhyX2V2ZW50c190OworCisvKiBFdmVudCBzZXQgbWFuaXB1bGF0aW9uIG1hY3Jvcy4gKi8KKyNkZWZpbmUgX190ZF9ldmVudG1hc2sobikgXAorICAoVUlOVDMyX0MgKDEpIDw8ICgoKG4pIC0gMSkgJiBCVF9VSU1BU0spKQorI2RlZmluZSBfX3RkX2V2ZW50d29yZChuKSBcCisgICgoVUlOVDMyX0MgKChuKSAtIDEpKSA+PiBCVF9VSVNISUZUKQorCisjZGVmaW5lIHRkX2V2ZW50X2VtcHR5c2V0KHNldHApIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBpbnQgX19pOwkJCQkJCQkJICAgICAgXAorICAgIGZvciAoX19pID0gVERfRVZFTlRTSVpFOyBfX2kgPiAwOyAtLV9faSkJCQkJICAgICAgXAorICAgICAgKHNldHApLT5ldmVudF9iaXRzW19faSAtIDFdID0gMDsJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSB0ZF9ldmVudF9maWxsc2V0KHNldHApIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBpbnQgX19pOwkJCQkJCQkJICAgICAgXAorICAgIGZvciAoX19pID0gVERfRVZFTlRTSVpFOyBfX2kgPiAwOyAtLV9faSkJCQkJICAgICAgXAorICAgICAgKHNldHApLT5ldmVudF9iaXRzW19faSAtIDFdID0gVUlOVDMyX0MgKDB4ZmZmZmZmZmYpOwkJICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIHRkX2V2ZW50X2FkZHNldChzZXRwLCBuKSBcCisgICgoKHNldHApLT5ldmVudF9iaXRzW19fdGRfZXZlbnR3b3JkIChuKV0pIHw9IF9fdGRfZXZlbnRtYXNrIChuKSkKKyNkZWZpbmUgdGRfZXZlbnRfZGVsc2V0KHNldHAsIG4pIFwKKyAgKCgoc2V0cCktPmV2ZW50X2JpdHNbX190ZF9ldmVudHdvcmQgKG4pXSkgJj0gfl9fdGRfZXZlbnRtYXNrIChuKSkKKyNkZWZpbmUgdGRfZXZlbnRpc21lbWJlcihzZXRwLCBuKSBcCisgIChfX3RkX2V2ZW50bWFzayAobikgJiAoKHNldHApLT5ldmVudF9iaXRzW19fdGRfZXZlbnR3b3JkIChuKV0pKQorI2lmIFREX0VWRU5UU0laRSA9PSAyCisjIGRlZmluZSB0ZF9ldmVudGlzZW1wdHkoc2V0cCkgXAorICAoISgoc2V0cCktPmV2ZW50X2JpdHNbMF0pICYmICEoKHNldHApLT5ldmVudF9iaXRzWzFdKSkKKyNlbHNlCisjIGVycm9yICJ0ZF9ldmVudGlzZW1wdHkgbXVzdCBiZSBjaGFuZ2VkIHRvIG1hdGNoIFREX0VWRU5UU0laRSIKKyNlbmRpZgorCisvKiBFdmVudHMgcmVwb3J0YWJsZSBieSB0aGUgdGhyZWFkIGltcGxlbWVudGF0aW9uLiAgKi8KK3R5cGVkZWYgZW51bQoreworICBURF9BTExfRVZFTlRTLAkJIC8qIFBzZXVkby1ldmVudCBudW1iZXIuICAqLworICBURF9FVkVOVF9OT05FID0gVERfQUxMX0VWRU5UUywgLyogRGVwZW5kcyBvbiBjb250ZXh0LiAgKi8KKyAgVERfUkVBRFksCQkJIC8qIElzIGV4ZWN1dGFibGUgbm93LiAqLworICBURF9TTEVFUCwJCQkgLyogQmxvY2tlZCBpbiBhIHN5bmNocm9uaXphdGlvbiBvYmouICAqLworICBURF9TV0lUQ0hUTywJCQkgLyogTm93IGFzc2lnbmVkIHRvIGEgcHJvY2Vzcy4gICovCisgIFREX1NXSVRDSEZST00sCQkgLyogTm90IGFueW1vcmUgYXNzaWduZWQgdG8gYSBwcm9jZXNzLiAgKi8KKyAgVERfTE9DS19UUlksCQkJIC8qIFRyeWluZyB0byBnZXQgYW4gdW5hdmFpbGFibGUgbG9jay4gICovCisgIFREX0NBVENIU0lHLAkJCSAvKiBTaWduYWwgcG9zdGVkIHRvIHRoZSB0aHJlYWQuICAqLworICBURF9JRExFLAkJCSAvKiBQcm9jZXNzIGdldHRpbmcgaWRsZS4gICovCisgIFREX0NSRUFURSwJCQkgLyogTmV3IHRocmVhZCBjcmVhdGVkLiAgKi8KKyAgVERfREVBVEgsCQkJIC8qIFRocmVhZCB0ZXJtaW5hdGVkLiAgKi8KKyAgVERfUFJFRU1QVCwJCQkgLyogUHJlZW1wdGVkLiAgKi8KKyAgVERfUFJJX0lOSEVSSVQsCQkgLyogSW5oZXJpdGVkIGVsZXZhdGVkIHByaW9yaXR5LiAgKi8KKyAgVERfUkVBUCwJCQkgLyogUmVhcGVkLiAgKi8KKyAgVERfQ09OQ1VSUkVOQ1ksCQkgLyogTnVtYmVyIG9mIHByb2Nlc3NlcyBjaGFuZ2luZy4gICovCisgIFREX1RJTUVPVVQsCQkJIC8qIENvbmRpdGlvbmFsIHZhcmlhYmxlIHdhaXQgdGltZWQgb3V0LiAgKi8KKyAgVERfTUlOX0VWRU5UX05VTSA9IFREX1JFQURZLAorICBURF9NQVhfRVZFTlRfTlVNID0gVERfVElNRU9VVCwKKyAgVERfRVZFTlRTX0VOQUJMRSA9IDMxCQkvKiBFdmVudCByZXBvcnRpbmcgZW5hYmxlZC4gICovCit9IHRkX2V2ZW50X2U7CisKKy8qIFZhbHVlcyByZXByZXNlbnRpbmcgdGhlIGRpZmZlcmVudCB3YXlzIGV2ZW50cyBhcmUgcmVwb3J0ZWQuICAqLwordHlwZWRlZiBlbnVtCit7CisgIE5PVElGWV9CUFQsCQkJLyogVXNlciBtdXN0IGluc2VydCBicmVha3BvaW50IGF0IHUuYnB0YWRkci4gKi8KKyAgTk9USUZZX0FVVE9CUFQsCQkvKiBCcmVha3BvaW50IGF0IHUuYnB0YWRkciBpcyBhdXRvbWF0aWNhbGx5CisJCQkJICAgaW5zZXJ0ZWQuICAqLworICBOT1RJRllfU1lTQ0FMTAkJLyogU3lzdGVtIGNhbGwgdS5zeXNjYWxsbm8gd2lsbCBiZSBpbnZva2VkLiAgKi8KK30gdGRfbm90aWZ5X2U7CisKKy8qIERlc2NyaXB0aW9uIGhvdyBldmVudCB0eXBlIGlzIHJlcG9ydGVkLiAgKi8KK3R5cGVkZWYgc3RydWN0IHRkX25vdGlmeQoreworICB0ZF9ub3RpZnlfZSB0eXBlOwkJLyogV2F5IHRoZSBldmVudCBpcyByZXBvcnRlZC4gICovCisgIHVuaW9uCisgIHsKKyAgICBwc2FkZHJfdCBicHRhZGRyOwkJLyogQWRkcmVzcyBvZiBicmVha3BvaW50LiAgKi8KKyAgICBpbnQgc3lzY2FsbG5vOwkJLyogTnVtYmVyIG9mIHN5c3RlbSBjYWxsIHVzZWQuICAqLworICB9IHU7Cit9IHRkX25vdGlmeV90OworCisvKiBTdHJ1Y3R1cmUgdXNlZCB0byByZXBvcnQgZXZlbnQuICAqLwordHlwZWRlZiBzdHJ1Y3QgdGRfZXZlbnRfbXNnCit7CisgIHRkX2V2ZW50X2UgZXZlbnQ7CQkvKiBFdmVudCB0eXBlIGJlaW5nIHJlcG9ydGVkLiAgKi8KKyAgY29uc3QgdGRfdGhyaGFuZGxlX3QgKnRoX3A7CS8qIFRocmVhZCByZXBvcnRpbmcgdGhlIGV2ZW50LiAgKi8KKyAgdW5pb24KKyAgeworIyBpZiAwCisgICAgdGRfc3luY2hhbmRsZV90ICpzaDsJLyogSGFuZGxlIG9mIHN5bmNocm9uaXphdGlvbiBvYmplY3QuICAqLworI2VuZGlmCisgICAgdWludHB0cl90IGRhdGE7CQkvKiBFdmVudCBzcGVjaWZpYyBkYXRhLiAgKi8KKyAgfSBtc2c7Cit9IHRkX2V2ZW50X21zZ190OworCisvKiBTdHJ1Y3R1cmUgY29udGFpbmluZyBldmVudCBkYXRhIGF2YWlsYWJsZSBpbiBlYWNoIHRocmVhZCBzdHJ1Y3R1cmUuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdGRfdGhyX2V2ZW50c190IGV2ZW50bWFzazsJLyogTWFzayBvZiBlbmFibGVkIGV2ZW50cy4gICovCisgIHRkX2V2ZW50X2UgZXZlbnRudW07CQkvKiBOdW1iZXIgb2YgbGFzdCBldmVudC4gICovCisgIHZvaWQgKmV2ZW50ZGF0YTsJCS8qIERhdGEgYXNzb2NpYXRlZCB3aXRoIGV2ZW50LiAgKi8KK30gdGRfZXZlbnRidWZfdDsKKworCisvKiBHYXRoZXJlZCBzdGF0aXN0aWNzIGFib3V0IHRoZSBwcm9jZXNzLiAgKi8KK3R5cGVkZWYgc3RydWN0IHRkX3RhX3N0YXRzCit7CisgIGludCBudGhyZWFkczsgICAgICAgCQkvKiBUb3RhbCBudW1iZXIgb2YgdGhyZWFkcyBpbiB1c2UuICAqLworICBpbnQgcl9jb25jdXJyZW5jeTsJCS8qIENvbmN1cnJlbmN5IGxldmVsIHJlcXVlc3RlZCBieSB1c2VyLiAgKi8KKyAgaW50IG5ydW5uYWJsZV9udW07CQkvKiBBdmVyYWdlIHJ1bm5hYmxlIHRocmVhZHMsIG51bWVyYXRvci4gICovCisgIGludCBucnVubmFibGVfZGVuOwkJLyogQXZlcmFnZSBydW5uYWJsZSB0aHJlYWRzLCBkZW5vbWluYXRvci4gICovCisgIGludCBhX2NvbmN1cnJlbmN5X251bTsJLyogQWNoaWV2ZWQgY29uY3VycmVuY3kgbGV2ZWwsIG51bWVyYXRvci4gICovCisgIGludCBhX2NvbmN1cnJlbmN5X2RlbjsJLyogQWNoaWV2ZWQgY29uY3VycmVuY3kgbGV2ZWwsIGRlbm9taW5hdG9yLiAgKi8KKyAgaW50IG5sd3BzX251bTsJCS8qIEF2ZXJhZ2UgbnVtYmVyIG9mIHByb2Nlc3NlcyBpbiB1c2UsCisJCQkJICAgbnVtZXJhdG9yLiAgKi8KKyAgaW50IG5sd3BzX2RlbjsJCS8qIEF2ZXJhZ2UgbnVtYmVyIG9mIHByb2Nlc3NlcyBpbiB1c2UsCisJCQkJICAgZGVub21pbmF0b3IuICAqLworICBpbnQgbmlkbGVfbnVtOwkJLyogQXZlcmFnZSBudW1iZXIgb2YgaWRsaW5nIHByb2Nlc3NlcywKKwkJCQkgICBudW1lcmF0b3IuICAqLworICBpbnQgbmlkbGVfZGVuOwkJLyogQXZlcmFnZSBudW1iZXIgb2YgaWRsaW5nIHByb2Nlc3NlcywKKwkJCQkgICBkZW5vbWluYXRvci4gICovCit9IHRkX3RhX3N0YXRzX3Q7CisKKworLyogU2luY2UgU3VuJ3MgbGlicmFyeSBpcyBiYXNlZCBvbiBTb2xhcmlzIHRocmVhZHMgd2UgaGF2ZSB0byBkZWZpbmUgYSBmZXcKKyAgIHR5cGVzIHRvIG1hcCB0aGVtIHRvIFBPU0lYIHRocmVhZHMuICAqLwordHlwZWRlZiBwdGhyZWFkX3QgdGhyZWFkX3Q7Cit0eXBlZGVmIHB0aHJlYWRfa2V5X3QgdGhyZWFkX2tleV90OworCisKKy8qIENhbGxiYWNrIGZvciBpdGVyYXRpb24gb3ZlciB0aHJlYWRzLiAgKi8KK3R5cGVkZWYgaW50IHRkX3Rocl9pdGVyX2YgKGNvbnN0IHRkX3RocmhhbmRsZV90ICosIHZvaWQgKik7CisKKy8qIENhbGxiYWNrIGZvciBpdGVyYXRpb24gb3ZlciB0aHJlYWQgbG9jYWwgZGF0YS4gICovCit0eXBlZGVmIGludCB0ZF9rZXlfaXRlcl9mICh0aHJlYWRfa2V5X3QsIHZvaWQgKCopICh2b2lkICopLCB2b2lkICopOworCisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbi4gIFRoaXMgaGFzIHRvIGJlIGRlZmluZWQgYnkgdGhlIHVzZXIuICAqLworc3RydWN0IHBzX3Byb2NoYW5kbGU7CisKKworLyogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHRocmVhZC4gICovCit0eXBlZGVmIHN0cnVjdCB0ZF90aHJpbmZvCit7CisgIHRkX3RocmFnZW50X3QgKnRpX3RhX3A7CQkvKiBQcm9jZXNzIGhhbmRsZS4gICovCisgIHVuc2lnbmVkIGludCB0aV91c2VyX2ZsYWdzOwkJLyogVW51c2VkLiAgKi8KKyAgdGhyZWFkX3QgdGlfdGlkOwkJCS8qIFRocmVhZCBJRCByZXR1cm5lZCBieQorCQkJCQkgICBwdGhyZWFkX2NyZWF0ZSgpLiAgKi8KKyAgY2hhciAqdGlfdGxzOwkJCQkvKiBQb2ludGVyIHRvIHRocmVhZC1sb2NhbCBkYXRhLiAgKi8KKyAgcHNhZGRyX3QgdGlfc3RhcnRmdW5jOwkJLyogU3RhcnQgZnVuY3Rpb24gcGFzc2VkIHRvCisJCQkJCSAgIHB0aHJlYWRfY3JlYXRlKCkuICAqLworICBwc2FkZHJfdCB0aV9zdGtiYXNlOwkJCS8qIEJhc2Ugb2YgdGhyZWFkJ3Mgc3RhY2suICAqLworICBsb25nIGludCB0aV9zdGtzaXplOwkJCS8qIFNpemUgb2YgdGhyZWFkJ3Mgc3RhY2suICAqLworICBwc2FkZHJfdCB0aV9yb19hcmVhOwkJCS8qIFVudXNlZC4gICovCisgIGludCB0aV9yb19zaXplOwkJCS8qIFVudXNlZC4gICovCisgIHRkX3Rocl9zdGF0ZV9lIHRpX3N0YXRlOwkJLyogVGhyZWFkIHN0YXRlLiAgKi8KKyAgdW5zaWduZWQgY2hhciB0aV9kYl9zdXNwZW5kZWQ7CS8qIE5vbnplcm8gaWYgc3VzcGVuZGVkIGJ5IGRlYnVnZ2VyLiAqLworICB0ZF90aHJfdHlwZV9lIHRpX3R5cGU7CQkvKiBUeXBlIG9mIHRoZSB0aHJlYWQgKHN5c3RlbSB2cworCQkJCQkgICB1c2VyIHRocmVhZCkuICAqLworICBpbnRwdHJfdCB0aV9wYzsJCQkvKiBVbnVzZWQuICAqLworICBpbnRwdHJfdCB0aV9zcDsJCQkvKiBVbnVzZWQuICAqLworICBzaG9ydCBpbnQgdGlfZmxhZ3M7CQkJLyogVW51c2VkLiAgKi8KKyAgaW50IHRpX3ByaTsJCQkJLyogVGhyZWFkIHByaW9yaXR5LiAgKi8KKyAgbHdwaWRfdCB0aV9saWQ7CQkJLyogS2VybmVsIFBJRCBmb3IgdGhpcyB0aHJlYWQuICAqLworICBzaWdzZXRfdCB0aV9zaWdtYXNrOwkJCS8qIFNpZ25hbCBtYXNrLiAgKi8KKyAgdW5zaWduZWQgY2hhciB0aV90cmFjZW1lOwkJLyogTm9uemVybyBpZiBldmVudCByZXBvcnRpbmcKKwkJCQkJICAgZW5hYmxlZC4gICovCisgIHVuc2lnbmVkIGNoYXIgdGlfcHJlZW1wdGZsYWc7CQkvKiBVbnVzZWQuICAqLworICB1bnNpZ25lZCBjaGFyIHRpX3BpcmVjZmxhZzsJCS8qIFVudXNlZC4gICovCisgIHNpZ3NldF90IHRpX3BlbmRpbmc7CQkJLyogU2V0IG9mIHBlbmRpbmcgc2lnbmFscy4gICovCisgIHRkX3Rocl9ldmVudHNfdCB0aV9ldmVudHM7CQkvKiBTZXQgb2YgZW5hYmxlZCBldmVudHMuICAqLworfSB0ZF90aHJpbmZvX3Q7CisKKworCisvKiBQcm90b3R5cGVzIGZvciBleHBvcnRlZCBsaWJyYXJ5IGZ1bmN0aW9ucy4gICovCisKKy8qIEluaXRpYWxpemUgdGhlIHRocmVhZCBkZWJ1ZyBzdXBwb3J0IGxpYnJhcnkuICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX2luaXQgKHZvaWQpOworCisvKiBIaXN0b3JpY2FsIHJlbGljdC4gIFNob3VsZCBub3QgYmUgdXNlZCBhbnltb3JlLiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF9sb2cgKHZvaWQpOworCisvKiBSZXR1cm4gbGlzdCBvZiBzeW1ib2xzIHRoZSBsaWJyYXJ5IGNhbiByZXF1ZXN0LiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICoqdGRfc3ltYm9sX2xpc3QgKHZvaWQpOworCisvKiBHZW5lcmF0ZSBuZXcgdGhyZWFkIGRlYnVnIGxpYnJhcnkgaGFuZGxlIGZvciBwcm9jZXNzIFBTLiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90YV9uZXcgKHN0cnVjdCBwc19wcm9jaGFuZGxlICpfX3BzLCB0ZF90aHJhZ2VudF90ICoqX190YSk7CisKKy8qIEZyZWUgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgVEEuICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3RhX2RlbGV0ZSAodGRfdGhyYWdlbnRfdCAqX190YSk7CisKKy8qIEdldCBudW1iZXIgb2YgY3VycmVudGx5IHJ1bm5pbmcgdGhyZWFkcyBpbiBwcm9jZXNzIGFzc29jaWF0ZWQgd2l0aCBUQS4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGFfZ2V0X250aHJlYWRzIChjb25zdCB0ZF90aHJhZ2VudF90ICpfX3RhLCBpbnQgKl9fbnApOworCisvKiBSZXR1cm4gcHJvY2VzcyBoYW5kbGUgcGFzc2VkIGluIGB0ZF90YV9uZXcnIGZvciBwcm9jZXNzIGFzc29jaWF0ZWQgd2l0aAorICAgVEEuICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3RhX2dldF9waCAoY29uc3QgdGRfdGhyYWdlbnRfdCAqX190YSwKKwkJCSAgICAgIHN0cnVjdCBwc19wcm9jaGFuZGxlICoqX19waCk7CisKKy8qIE1hcCB0aHJlYWQgbGlicmFyeSBoYW5kbGUgUFQgdG8gdGhyZWFkIGRlYnVnIGxpYnJhcnkgaGFuZGxlIGZvciBwcm9jZXNzCisgICBhc3NvY2lhdGVkIHdpdGggVEEgYW5kIHN0b3JlIHJlc3VsdCBpbiAqVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3RhX21hcF9pZDJ0aHIgKGNvbnN0IHRkX3RocmFnZW50X3QgKl9fdGEsIHB0aHJlYWRfdCBfX3B0LAorCQkJCSAgdGRfdGhyaGFuZGxlX3QgKl9fdGgpOworCisvKiBNYXAgcHJvY2VzcyBJRCBMV1BJRCB0byB0aHJlYWQgZGVidWcgbGlicmFyeSBoYW5kbGUgZm9yIHByb2Nlc3MKKyAgIGFzc29jaWF0ZWQgd2l0aCBUQSBhbmQgc3RvcmUgcmVzdWx0IGluICpUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGFfbWFwX2x3cDJ0aHIgKGNvbnN0IHRkX3RocmFnZW50X3QgKl9fdGEsIGx3cGlkX3QgX19sd3BpZCwKKwkJCQkgICB0ZF90aHJoYW5kbGVfdCAqX190aCk7CisKKworLyogQ2FsbCBmb3IgZWFjaCB0aHJlYWQgaW4gYSBwcm9jZXNzIGFzc29jaWF0ZWQgd2l0aCBUQSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKyAgIENBTExCQUNLLiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90YV90aHJfaXRlciAoY29uc3QgdGRfdGhyYWdlbnRfdCAqX190YSwKKwkJCQl0ZF90aHJfaXRlcl9mICpfX2NhbGxiYWNrLCB2b2lkICpfX2NiZGF0YV9wLAorCQkJCXRkX3Rocl9zdGF0ZV9lIF9fc3RhdGUsIGludCBfX3RpX3ByaSwKKwkJCQlzaWdzZXRfdCAqX190aV9zaWdtYXNrX3AsCisJCQkJdW5zaWduZWQgaW50IF9fdGlfdXNlcl9mbGFncyk7CisKKy8qIENhbGwgZm9yIGVhY2ggZGVmaW5lZCB0aHJlYWQgbG9jYWwgZGF0YSBlbnRyeSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gS0kuICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3RhX3RzZF9pdGVyIChjb25zdCB0ZF90aHJhZ2VudF90ICpfX3RhLCB0ZF9rZXlfaXRlcl9mICpfX2tpLAorCQkJCXZvaWQgKl9fcCk7CisKKworLyogR2V0IGV2ZW50IGFkZHJlc3MgZm9yIEVWRU5ULiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90YV9ldmVudF9hZGRyIChjb25zdCB0ZF90aHJhZ2VudF90ICpfX3RhLAorCQkJCSAgdGRfZXZlbnRfZSBfX2V2ZW50LCB0ZF9ub3RpZnlfdCAqX19wdHIpOworCisvKiBFbmFibGUgRVZFTlQgaW4gZ2xvYmFsIG1hc2suICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3RhX3NldF9ldmVudCAoY29uc3QgdGRfdGhyYWdlbnRfdCAqX190YSwKKwkJCQkgdGRfdGhyX2V2ZW50c190ICpfX2V2ZW50KTsKKworLyogRGlzYWJsZSBFVkVOVCBpbiBnbG9iYWwgbWFzay4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGFfY2xlYXJfZXZlbnQgKGNvbnN0IHRkX3RocmFnZW50X3QgKl9fdGEsCisJCQkJICAgdGRfdGhyX2V2ZW50c190ICpfX2V2ZW50KTsKKworLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGxhc3QgZXZlbnQuICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3RhX2V2ZW50X2dldG1zZyAoY29uc3QgdGRfdGhyYWdlbnRfdCAqX190YSwKKwkJCQkgICAgdGRfZXZlbnRfbXNnX3QgKl9fbXNnKTsKKworCisvKiBTZXQgc3VnZ2VzdGVkIGNvbmN1cnJlbmN5IGxldmVsIGZvciBwcm9jZXNzIGFzc29jaWF0ZWQgd2l0aCBUQS4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGFfc2V0Y29uY3VycmVuY3kgKGNvbnN0IHRkX3RocmFnZW50X3QgKl9fdGEsIGludCBfX2xldmVsKTsKKworCisvKiBFbmFibGUgY29sbGVjdGluZyBzdGF0aXN0aWNzIGZvciBwcm9jZXNzIGFzc29jaWF0ZWQgd2l0aCBUQS4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGFfZW5hYmxlX3N0YXRzIChjb25zdCB0ZF90aHJhZ2VudF90ICpfX3RhLCBpbnQgX19lbmFibGUpOworCisvKiBSZXNldCBzdGF0aXN0aWNzLiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90YV9yZXNldF9zdGF0cyAoY29uc3QgdGRfdGhyYWdlbnRfdCAqX190YSk7CisKKy8qIFJldHJpZXZlIHN0YXRpc3RpY3MgZnJvbSBwcm9jZXNzIGFzc29jaWF0ZWQgd2l0aCBUQS4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGFfZ2V0X3N0YXRzIChjb25zdCB0ZF90aHJhZ2VudF90ICpfX3RhLAorCQkJCSB0ZF90YV9zdGF0c190ICpfX3N0YXRzcCk7CisKKworLyogVmFsaWRhdGUgdGhhdCBUSCBpcyBhIHRocmVhZCBoYW5kbGUuICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl92YWxpZGF0ZSAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgpOworCisvKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhyZWFkIFRILiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90aHJfZ2V0X2luZm8gKGNvbnN0IHRkX3RocmhhbmRsZV90ICpfX3RoLAorCQkJCSB0ZF90aHJpbmZvX3QgKl9faW5mb3ApOworCisvKiBSZXRyaWV2ZSBmbG9hdGluZy1wb2ludCByZWdpc3RlciBjb250ZW50cyBvZiBwcm9jZXNzIHJ1bm5pbmcgdGhyZWFkIFRILiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90aHJfZ2V0ZnByZWdzIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqX190aCwKKwkJCQkgIHByZnByZWdzZXRfdCAqX19yZWdzZXQpOworCisvKiBSZXRyaWV2ZSBnZW5lcmFsIHJlZ2lzdGVyIGNvbnRlbnRzIG9mIHByb2Nlc3MgcnVubmluZyB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9nZXRncmVncyAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsCisJCQkJIHByZ3JlZ3NldF90IF9fZ3JlZ3MpOworCisvKiBSZXRyaWV2ZSBleHRlbmRlZCByZWdpc3RlciBjb250ZW50cyBvZiBwcm9jZXNzIHJ1bm5pbmcgdGhyZWFkIFRILiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90aHJfZ2V0eHJlZ3MgKGNvbnN0IHRkX3RocmhhbmRsZV90ICpfX3RoLCB2b2lkICpfX3hyZWdzKTsKKworLyogR2V0IHNpemUgb2YgZXh0ZW5kZWQgcmVnaXN0ZXIgc2V0IG9mIHByb2Nlc3MgcnVubmluZyB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9nZXR4cmVnc2l6ZSAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsIGludCAqX19zaXplcCk7CisKKy8qIFNldCBmbG9hdGluZy1wb2ludCByZWdpc3RlciBjb250ZW50cyBvZiBwcm9jZXNzIHJ1bm5pbmcgdGhyZWFkIFRILiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90aHJfc2V0ZnByZWdzIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqX190aCwKKwkJCQkgIGNvbnN0IHByZnByZWdzZXRfdCAqX19mcHJlZ3MpOworCisvKiBTZXQgZ2VuZXJhbCByZWdpc3RlciBjb250ZW50cyBvZiBwcm9jZXNzIHJ1bm5pbmcgdGhyZWFkIFRILiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90aHJfc2V0Z3JlZ3MgKGNvbnN0IHRkX3RocmhhbmRsZV90ICpfX3RoLAorCQkJCSBwcmdyZWdzZXRfdCBfX2dyZWdzKTsKKworLyogU2V0IGV4dGVuZGVkIHJlZ2lzdGVyIGNvbnRlbnRzIG9mIHByb2Nlc3MgcnVubmluZyB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9zZXR4cmVncyAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsCisJCQkJIGNvbnN0IHZvaWQgKl9fYWRkcik7CisKKworLyogR2V0IGFkZHJlc3Mgb2YgdGhlIGdpdmVuIG1vZHVsZSdzIFRMUyBzdG9yYWdlIGFyZWEgZm9yIHRoZSBnaXZlbiB0aHJlYWQuICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl90bHNiYXNlIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqX190aCwKKwkJCQl1bnNpZ25lZCBsb25nIGludCBfX21vZGlkLAorCQkJCXBzYWRkcl90ICpfX2Jhc2UpOworCisvKiBHZXQgYWRkcmVzcyBvZiB0aHJlYWQgbG9jYWwgdmFyaWFibGUuICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl90bHNfZ2V0X2FkZHIgKGNvbnN0IHRkX3RocmhhbmRsZV90ICpfX3RoLAorCQkJCSAgICAgcHNhZGRyX3QgX19tYXBfYWRkcmVzcywgc2l6ZV90IF9fb2Zmc2V0LAorCQkJCSAgICAgcHNhZGRyX3QgKl9fYWRkcmVzcyk7CisKKworLyogRW5hYmxlIHJlcG9ydGluZyBmb3IgRVZFTlQgZm9yIHRocmVhZCBUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX2V2ZW50X2VuYWJsZSAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsIGludCBfX2V2ZW50KTsKKworLyogRW5hYmxlIEVWRU5UIGZvciB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9zZXRfZXZlbnQgKGNvbnN0IHRkX3RocmhhbmRsZV90ICpfX3RoLAorCQkJCSAgdGRfdGhyX2V2ZW50c190ICpfX2V2ZW50KTsKKworLyogRGlzYWJsZSBFVkVOVCBmb3IgdGhyZWFkIFRILiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90aHJfY2xlYXJfZXZlbnQgKGNvbnN0IHRkX3RocmhhbmRsZV90ICpfX3RoLAorCQkJCSAgICB0ZF90aHJfZXZlbnRzX3QgKl9fZXZlbnQpOworCisvKiBHZXQgZXZlbnQgbWVzc2FnZSBmb3IgdGhyZWFkIFRILiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90aHJfZXZlbnRfZ2V0bXNnIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqX190aCwKKwkJCQkgICAgIHRkX2V2ZW50X21zZ190ICpfX21zZyk7CisKKworLyogU2V0IHByaW9yaXR5IG9mIHRocmVhZCBUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX3NldHByaW8gKGNvbnN0IHRkX3RocmhhbmRsZV90ICpfX3RoLCBpbnQgX19wcmlvKTsKKworCisvKiBTZXQgcGVuZGluZyBzaWduYWxzIGZvciB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9zZXRzaWdwZW5kaW5nIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqX190aCwKKwkJCQkgICAgICB1bnNpZ25lZCBjaGFyIF9fbiwgY29uc3Qgc2lnc2V0X3QgKl9fc3MpOworCisvKiBTZXQgc2lnbmFsIG1hc2sgZm9yIHRocmVhZCBUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX3NpZ3NldG1hc2sgKGNvbnN0IHRkX3RocmhhbmRsZV90ICpfX3RoLAorCQkJCSAgIGNvbnN0IHNpZ3NldF90ICpfX3NzKTsKKworCisvKiBSZXR1cm4gdGhyZWFkIGxvY2FsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGtleSBUSyBpbiB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl90c2QgKGNvbnN0IHRkX3RocmhhbmRsZV90ICpfX3RoLAorCQkJICAgIGNvbnN0IHRocmVhZF9rZXlfdCBfX3RrLCB2b2lkICoqX19kYXRhKTsKKworCisvKiBTdXNwZW5kIGV4ZWN1dGlvbiBvZiB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9kYnN1c3BlbmQgKGNvbnN0IHRkX3RocmhhbmRsZV90ICpfX3RoKTsKKworLyogUmVzdW1lIGV4ZWN1dGlvbiBvZiB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9kYnJlc3VtZSAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgpOworCisjZW5kaWYJLyogdGhyZWFkX2RiLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGljLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3RpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmM2EyMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3RpYy5oCkBAIC0wLDAgKzEsMzQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDcsMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgKgorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgICoKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAqCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgKgorICogZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgICoKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAqCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAqCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAqCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAqCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgKgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgICoKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICoKKyAqIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAqCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgKgorICogYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEF1dGhvcjogWmV5ZCBNLiBCZW4tSGFsaW0gPHptYmVuaGFsQG5ldGNvbS5jb20+IDE5OTIsMTk5NSAgICAgICAgICAgICAgICoKKyAqICAgICBhbmQ6IEVyaWMgUy4gUmF5bW9uZCA8ZXNyQHNuYXJrLnRoeXJzdXMuY29tPiAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgYW5kOiBUaG9tYXMgRS4gRGlja2V5IDE5OTYgb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiAkSWQ6IHRpYy5oLHYgMS42NSAyMDA5LzA4LzA4IDE3OjUyOjQ2IHRvbSBFeHAgJAorICoJdGljLmggLSBHbG9iYWwgdmFyaWFibGVzIGFuZCBzdHJ1Y3R1cmVzIGZvciB0aGUgdGVybWluZm8KKyAqCQkJY29tcGlsZXIuCisgKi8KKworI2lmbmRlZiBfX1RJQ19ICisjZGVmaW5lIF9fVElDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8Y3Vyc2VzLmg+CS8qIGZvciB0aGUgX3RyYWNlZigpIHByb3RvdHlwZSwgRVJSL09LLCBib29sIGRlZnMgKi8KKworLyoKKyoqIFRoZSBmb3JtYXQgb2YgY29tcGlsZWQgdGVybWluZm8gZmlsZXMgaXMgYXMgZm9sbG93czoKKyoqCisqKgkJSGVhZGVyICgxMiBieXRlcyksIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gZ2l2ZW4gYmVsb3cKKyoqCQlOYW1lcyBTZWN0aW9uLCBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgdGVybWluYWwKKyoqCQlCb29sZWFuIFNlY3Rpb24sIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlCisqKgkJCQlib29sZWFuIGNhcGFiaWxpdGllcworKioJCQkJQSBudWxsIGJ5dGUgbWF5IGJlIGluc2VydGVkIGhlcmUgdG8gbWFrZQorKioJCQkJc3VyZSB0aGF0IHRoZSBOdW1iZXIgU2VjdGlvbiBiZWdpbnMgb24gYW4KKyoqCQkJCWV2ZW4gd29yZCBib3VuZGFyeS4KKyoqCQlOdW1iZXIgU2VjdGlvbiwgY29udGFpbmluZyB0aGUgdmFsdWVzIG9mIGFsbCBvZiB0aGUgbnVtZXJpYworKioJCQkJY2FwYWJpbGl0aWVzLCBlYWNoIGFzIGEgc2hvcnQgaW50ZWdlcgorKioJCVN0cmluZyBTZWN0aW9uLCBjb250YWluaW5nIHNob3J0IGludGVnZXIgb2Zmc2V0cyBpbnRvIHRoZQorKioJCQkJU3RyaW5nIFRhYmxlLCBvbmUgcGVyIHN0cmluZyBjYXBhYmlsaXR5CisqKgkJU3RyaW5nIFRhYmxlLCBjb250YWluaW5nIHRoZSBhY3R1YWwgY2hhcmFjdGVycyBvZiB0aGUgc3RyaW5nCisqKgkJCQljYXBhYmlsaXRpZXMuCisqKgorKioJTk9URSB0aGF0IGFsbCBzaG9ydCBpbnRlZ2VycyBpbiB0aGUgZmlsZSBhcmUgc3RvcmVkIHVzaW5nIFZBWC9QRFAtc3R5bGUKKyoqCWJ5dGUtb3JkZXIsIGkuZS4sIGxlYXN0LXNpZ25pZmljYW50IGJ5dGUgZmlyc3QuCisqKgorKioJVGhlcmUgaXMgbm8gc3RydWN0dXJlIGRlZmluaXRpb24gaGVyZSBiZWNhdXNlIGl0IHdvdWxkIG9ubHkgY29uZnVzZQorKioJbWF0dGVycy4gIFRlcm1pbmZvIGZvcm1hdCBpcyBhIHJhdyBieXRlIGxheW91dCwgbm90IGEgc3RydWN0dXJlCisqKglkdW1wLiAgSWYgeW91IGhhcHBlbiB0byBiZSBvbiBhIGxpdHRsZS1lbmRpYW4gbWFjaGluZSB3aXRoIDE2LWJpdAorKioJc2hvcnRzIHRoYXQgcmVxdWlyZXMgbm8gcGFkZGluZyBiZXR3ZWVuIHNob3J0IG1lbWJlcnMgaW4gYSBzdHJ1Y3QsCisqKgl0aGVuIHRoZXJlIGlzIGEgbmF0dXJhbCBDIHN0cnVjdHVyZSB0aGF0IGNhcHR1cmVzIHRoZSBoZWFkZXIsIGJ1dAorKioJbm90IHZlcnkgaGVscGZ1bGx5LgorKi8KKworI2RlZmluZSBNQUdJQwkJMDQzMgkvKiBmaXJzdCB0d28gYnl0ZXMgb2YgYSBjb21waWxlZCBlbnRyeSAqLworCisjdW5kZWYgIEJZVEUKKyNkZWZpbmUgQllURShwLG4pCSh1bnNpZ25lZCBjaGFyKSgocClbbl0pCisKKyNkZWZpbmUgSVNfTkVHMShwKQkoKEJZVEUocCwwKSA9PSAwMzc3KSAmJiAoQllURShwLDEpID09IDAzNzcpKQorI2RlZmluZSBJU19ORUcyKHApCSgoQllURShwLDApID09IDAzNzYpICYmIChCWVRFKHAsMSkgPT0gMDM3NykpCisjZGVmaW5lIExPV19NU0IocCkJKEJZVEUocCwwKSArIDI1NipCWVRFKHAsMSkpCisKKyNkZWZpbmUgSVNfVElDX01BR0lDKHApCShMT1dfTVNCKHApID09IE1BR0lDKQorCisvKgorICogVGhlICJtYXhpbXVtIiBoZXJlIGlzIG1pc2xlYWRpbmc7IFhTSSBndWFyYW50ZWVzIG1pbmltdW0gdmFsdWVzLCB3aGljaCBhCisgKiBnaXZlbiBpbXBsZW1lbnRhdGlvbiBtYXkgZXhjZWVkLgorICovCisjZGVmaW5lIE1BWF9OQU1FX1NJWkUJNTEyCS8qIG1heGltdW0gbGVnYWwgbmFtZSBmaWVsZCBzaXplIChYU0k6MTI3KSAqLworI2RlZmluZSBNQVhfRU5UUllfU0laRQk0MDk2CS8qIG1heGltdW0gbGVnYWwgZW50cnkgc2l6ZSAqLworCisvKgorICogVGhlIG1heGltdW0gc2l6ZSBvZiBpbmRpdmlkdWFsIG5hbWUgb3IgYWxpYXMgaXMgZ3VhcmFudGVlZCBpbiBYU0kgdG8gYmUgYXQKKyAqIGxlYXN0IDE0LCBzaW5jZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBvbGRlciBmaWxlbmFtZSBsZW5ndGhzLiAgTmV3ZXIKKyAqIHN5c3RlbXMgYWxsb3cgbG9uZ2VyIGFsaWFzZXMsIHRob3VnaCBub3QgbWFueSB0ZXJtaW5hbCBkZXNjcmlwdGlvbnMgYXJlCisgKiB3cml0dGVuIHRvIHVzZSB0aGVtLiAgVGhlIE1BWF9BTElBUyBzeW1ib2wgaXMgdXNlZCBmb3Igd2FybmluZ3MuCisgKi8KKyNpZiBIQVZFX0xPTkdfRklMRV9OQU1FUworI2RlZmluZSBNQVhfQUxJQVMJMzIJLyogc21hbGxlciB0aGFuIFBPU0lYIG1pbmltdW0gZm9yIFBBVEhfTUFYICovCisjZWxzZQorI2RlZmluZSBNQVhfQUxJQVMJMTQJLyogU1ZyMyBmaWxlbmFtZSBsZW5ndGggKi8KKyNlbmRpZgorCisvKiBsb2NhdGlvbiBvZiB1c2VyJ3MgcGVyc29uYWwgaW5mbyBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgUFJJVkFURV9JTkZPCSIlcy8udGVybWluZm8iCS8qIHBsdWcgZ2V0ZW52KCJIT01FIikgaW50byAlcyAqLworCisvKgorICogU29tZSB0cmFjZXMgYXJlIGRlc2lnbmVkIHRvIGJlIHVzZWQgdmlhIHRpYydzIHZlcmJvc2Ugb3B0aW9uIChhbmQgc2ltaWxhciBpbgorICogaW5mb2NtcCBhbmQgdG9lKSByYXRoZXIgdGhhbiB0aGUgJ3RyYWNlKCknIGZ1bmN0aW9uLiAgU28gd2UgdXNlIHRoZSBiaXRzCisgKiBhYm92ZSB0aGUgbm9ybWFsIHRyYWNlKCkgcGFyYW1ldGVyIGFzIGEgZGVidWctbGV2ZWwuCisgKi8KKworI2RlZmluZSBNQVhfREVCVUdfTEVWRUwgMTUKKyNkZWZpbmUgREVCVUdfTEVWRUwobikJKChuKSA8PCBUUkFDRV9TSElGVCkKKworI2RlZmluZSBzZXRfdHJhY2VfbGV2ZWwobikgXAorCV9uY190cmFjaW5nICY9IERFQlVHX0xFVkVMKE1BWF9ERUJVR19MRVZFTCksIFwKKwlfbmNfdHJhY2luZyB8PSBERUJVR19MRVZFTChuKQorCisjaWZkZWYgVFJBQ0UKKyNkZWZpbmUgREVCVUcobiwgYSkJaWYgKF9uY190cmFjaW5nID49IERFQlVHX0xFVkVMKG4pKSBfdHJhY2VmIGEKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGEpCS8qbm90aGluZyovCisjZW5kaWYKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUih1bnNpZ25lZCkgX25jX3RyYWNpbmc7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX3RyYWNlZiAoY2hhciAqLCAuLi4pIEdDQ19QUklOVEZMSUtFKDEsMik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY29uc3QgY2hhciAqKSBfbmNfdmlzYnVmIChjb25zdCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNvbnN0IGNoYXIgKikgX25jX3Zpc2J1ZjIgKGludCwgY29uc3QgY2hhciAqKTsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgdHlwZXMgb2YgdG9rZW5zIHJldHVybmVkIGJ5IHRoZSBzY2FubmVyLiAgVGhlIGZpcnN0CisgKiB0aHJlZSBhcmUgYWxzbyB1c2VkIGluIHRoZSBoYXNoIHRhYmxlIG9mIGNhcGFiaWxpdHkgbmFtZXMuICBUaGUgc2Nhbm5lcgorICogcmV0dXJucyBvbmUgb2YgdGhlc2UgdmFsdWVzIGFmdGVyIGxvYWRpbmcgdGhlIHNwZWNpZmljcyBpbnRvIHRoZSBnbG9iYWwKKyAqIHN0cnVjdHVyZSBjdXJyX3Rva2VuLgorICovCisKKyNkZWZpbmUgQk9PTEVBTiAwCQkvKiBCb29sZWFuIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgTlVNQkVSIDEJCS8qIE51bWVyaWMgY2FwYWJpbGl0eSAqLworI2RlZmluZSBTVFJJTkcgMgkJLyogU3RyaW5nLXZhbHVlZCBjYXBhYmlsaXR5ICovCisjZGVmaW5lIENBTkNFTCAzCQkvKiBDYXBhYmlsaXR5IHRvIGJlIGNhbmNlbGxlZCBpbiBmb2xsb3dpbmcgdGMncyAqLworI2RlZmluZSBOQU1FUyAgNAkJLyogVGhlIG5hbWVzIGZvciBhIHRlcm1pbmFsIHR5cGUgKi8KKyNkZWZpbmUgVU5ERUYgIDUJCS8qIFVuZGVmaW5lZCAqLworCisjZGVmaW5lIE5PX1BVU0hCQUNLCS0xCS8qIHVzZWQgaW4gcHVzaHR5cGUgdG8gaW5kaWNhdGUgbm8gcHVzaGJhY2sgKi8KKworCS8qCisJICoJVGhlIGdsb2JhbCBzdHJ1Y3R1cmUgaW4gd2hpY2ggdGhlIHNwZWNpZmljIHBhcnRzIG9mIGEKKwkgKglzY2FubmVkIHRva2VuIGFyZSByZXR1cm5lZC4KKwkgKgorCSAqLworCitzdHJ1Y3QgdG9rZW4KK3sKKwljaGFyCSp0a19uYW1lOwkJLyogbmFtZSBvZiBjYXBhYmlsaXR5ICovCisJaW50CXRrX3ZhbG51bWJlcjsJLyogdmFsdWUgb2YgY2FwYWJpbGl0eSAoaWYgYSBudW1iZXIpICovCisJY2hhcgkqdGtfdmFsc3RyaW5nOwkvKiB2YWx1ZSBvZiBjYXBhYmlsaXR5IChpZiBhIHN0cmluZykgKi8KK307CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoc3RydWN0IHRva2VuKQlfbmNfY3Vycl90b2tlbjsKKworCS8qCisJICogT2Zmc2V0cyB0byBzdHJpbmcgY2FwYWJpbGl0aWVzLCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9ua2V5CisJICogY29kZXMuCisJICovCitzdHJ1Y3QgdGluZm9fZmtleXMgeworCXVuc2lnbmVkIG9mZnNldDsKKwljaHR5cGUgY29kZTsKKwl9OworCisjaWYJQlJPS0VOX0xJTktFUgorCisjZGVmaW5lCV9uY190aW5mb19ma2V5cwlfbmNfdGluZm9fZmtleXNmKCkKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjb25zdCBzdHJ1Y3QgdGluZm9fZmtleXMgKikgX25jX3RpbmZvX2ZrZXlzZiAodm9pZCk7CisKKyNlbHNlCisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoY29uc3Qgc3RydWN0IHRpbmZvX2ZrZXlzKSBfbmNfdGluZm9fZmtleXNbXTsKKworI2VuZGlmCisKK3R5cGVkZWYgc2hvcnQgSGFzaFZhbHVlOworCisJLyoKKwkgKiBUaGUgZmlsZSBjb21wX2NhcHRhYi5jIGNvbnRhaW5zIGFuIGFycmF5IG9mIHRoZXNlIHN0cnVjdHVyZXMsIG9uZQorCSAqIHBlciBwb3NzaWJsZSBjYXBhYmlsaXR5LiAgVGhlc2UgYXJlIGluZGV4ZWQgYnkgYSBoYXNoIHRhYmxlIGFycmF5IG9mCisJICogcG9pbnRlcnMgdG8gdGhlIHNhbWUgc3RydWN0dXJlcyBmb3IgdXNlIGJ5IHRoZSBwYXJzZXIuCisJICovCisKK3N0cnVjdCBuYW1lX3RhYmxlX2VudHJ5Cit7CisJY29uc3QgY2hhciAqbnRlX25hbWU7CS8qIG5hbWUgdG8gaGFzaCBvbiAqLworCWludAludGVfdHlwZTsJLyogQk9PTEVBTiwgTlVNQkVSIG9yIFNUUklORyAqLworCUhhc2hWYWx1ZSBudGVfaW5kZXg7CS8qIGluZGV4IG9mIGFzc29jaWF0ZWQgdmFyaWFibGUgaW4gaXRzIGFycmF5ICovCisJSGFzaFZhbHVlIG50ZV9saW5rOwkvKiBpbmRleCBpbiB0YWJsZSBvZiBuZXh0IGhhc2gsIG9yIC0xICovCit9OworCisJLyoKKwkgKiBVc2UgdGhpcyBzdHJ1Y3R1cmUgdG8gaGlkZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRlcm1pbmZvIGFuZCB0ZXJtY2FwCisJICogdGFibGVzLgorCSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIHRhYmxlX3NpemU7CisJY29uc3QgSGFzaFZhbHVlICp0YWJsZV9kYXRhOworCUhhc2hWYWx1ZSAoKmhhc2hfb2YpKGNvbnN0IGNoYXIgKik7CisJaW50ICgqY29tcGFyZV9uYW1lcykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworfSBIYXNoRGF0YTsKKworc3RydWN0IGFsaWFzCit7CisJY29uc3QgY2hhcgkqZnJvbTsKKwljb25zdCBjaGFyCSp0bzsKKwljb25zdCBjaGFyCSpzb3VyY2U7Cit9OworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY29uc3Qgc3RydWN0IG5hbWVfdGFibGVfZW50cnkgKikgX25jX2dldF90YWJsZSAoYm9vbCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY29uc3QgSGFzaERhdGEgKikgX25jX2dldF9oYXNoX2luZm8gKGJvb2wpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNvbnN0IEhhc2hWYWx1ZSAqKSBfbmNfZ2V0X2hhc2hfdGFibGUgKGJvb2wpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNvbnN0IHN0cnVjdCBhbGlhcyAqKSBfbmNfZ2V0X2FsaWFzX3RhYmxlIChib29sKTsKKworI2RlZmluZSBOT1RGT1VORAkoKHN0cnVjdCBuYW1lX3RhYmxlX2VudHJ5ICopIDApCisKKy8qIG91dC1vZi1iYW5kIHZhbHVlcyBmb3IgcmVwcmVzZW50aW5nIGFic2VudCBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgQUJTRU5UX0JPT0xFQU4JCSgoc2lnbmVkIGNoYXIpLTEpCS8qIDI1NSAqLworI2RlZmluZSBBQlNFTlRfTlVNRVJJQwkJKC0xKQorI2RlZmluZSBBQlNFTlRfU1RSSU5HCQkoY2hhciAqKTAKKworLyogb3V0LW9mLWJhbmQgdmFsdWVzIGZvciByZXByZXNlbnRpbmcgY2FuY2VscyAqLworI2RlZmluZSBDQU5DRUxMRURfQk9PTEVBTgkoKHNpZ25lZCBjaGFyKS0yKQkvKiAyNTQgKi8KKyNkZWZpbmUgQ0FOQ0VMTEVEX05VTUVSSUMJKC0yKQorI2RlZmluZSBDQU5DRUxMRURfU1RSSU5HCShjaGFyICopKC0xKQorCisjZGVmaW5lIFZBTElEX0JPT0xFQU4ocykgKCh1bnNpZ25lZCBjaGFyKShzKSA8PSAxKSAvKiByZWplY3QgIi0xIiAqLworI2RlZmluZSBWQUxJRF9OVU1FUklDKHMpICgocykgPj0gMCkKKyNkZWZpbmUgVkFMSURfU1RSSU5HKHMpICAoKHMpICE9IENBTkNFTExFRF9TVFJJTkcgJiYgKHMpICE9IEFCU0VOVF9TVFJJTkcpCisKKy8qIHRlcm1jYXAgZW50cmllcyBsb25nZXIgdGhhbiB0aGlzIG1heSBicmVhayBvbGQgYmluYXJpZXMgKi8KKyNkZWZpbmUgTUFYX1RFUk1DQVBfTEVOR1RICTEwMjMKKworLyogdGhpcyBpcyBhIGRvY3VtZW50ZWQgbGltaXRhdGlvbiBvZiB0ZXJtaW5mbyAqLworI2RlZmluZSBNQVhfVEVSTUlORk9fTEVOR1RICTQwOTYKKworI2lmbmRlZiBURVJNSU5GTworI2RlZmluZSBURVJNSU5GTyAiL3Vzci9zaGFyZS90ZXJtaW5mbyIKKyNlbmRpZgorCisvKiBhY2Nlc3MuYyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHVuc2lnbmVkKSBfbmNfcGF0aGxhc3QgKGNvbnN0IGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgX25jX2lzX2Fic19wYXRoIChjb25zdCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIF9uY19pc19kaXJfcGF0aCAoY29uc3QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBfbmNfaXNfZmlsZV9wYXRoIChjb25zdCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgX25jX2Jhc2VuYW1lIChjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgX25jX3Jvb3RuYW1lIChjaGFyICopOworCisvKiBjb21wX2hhc2guYzogbmFtZSBsb29rdXAgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChzdHJ1Y3QgbmFtZV90YWJsZV9lbnRyeSBjb25zdCAqKSBfbmNfZmluZF9lbnRyeQorCShjb25zdCBjaGFyICosIGNvbnN0IEhhc2hWYWx1ZSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChzdHJ1Y3QgbmFtZV90YWJsZV9lbnRyeSBjb25zdCAqKSBfbmNfZmluZF90eXBlX2VudHJ5CisJKGNvbnN0IGNoYXIgKiwgaW50LCBib29sKTsKKworLyogY29tcF9zY2FuLmM6IGxleGljYWwgYW5hbHlzaXMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpICBfbmNfZ2V0X3Rva2VuIChib29sKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfcGFuaWNfbW9kZSAoY2hhcik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX3B1c2hfdG9rZW4gKGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX3Jlc2V0X2lucHV0IChGSUxFICosIGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGludCkgX25jX2N1cnJfY29sOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihpbnQpIF9uY19jdXJyX2xpbmU7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGludCkgX25jX3N5bnRheDsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIobG9uZykgX25jX2NvbW1lbnRfZW5kOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihsb25nKSBfbmNfY29tbWVudF9zdGFydDsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIobG9uZykgX25jX2N1cnJfZmlsZV9wb3M7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGxvbmcpIF9uY19zdGFydF9saW5lOworI2RlZmluZSBTWU5fVEVSTUlORk8JMAorI2RlZmluZSBTWU5fVEVSTUNBUAkxCisKKy8qIGNvbXBfZXJyb3IuYzogd2FybmluZyAmIGFib3J0IG1lc3NhZ2VzICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY29uc3QgY2hhciAqKSBfbmNfZ2V0X3NvdXJjZSAodm9pZCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX2Vycl9hYm9ydCAoY29uc3QgY2hhciAqY29uc3QsLi4uKSBHQ0NfUFJJTlRGTElLRSgxLDIpIEdDQ19OT1JFVFVSTjsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfZ2V0X3R5cGUgKGNoYXIgKm5hbWUpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY19zZXRfc291cmNlIChjb25zdCBjaGFyICpjb25zdCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX3NldF90eXBlIChjb25zdCBjaGFyICpjb25zdCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX3N5c2Vycl9hYm9ydCAoY29uc3QgY2hhciAqY29uc3QsLi4uKSBHQ0NfUFJJTlRGTElLRSgxLDIpIEdDQ19OT1JFVFVSTjsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfd2FybmluZyAoY29uc3QgY2hhciAqY29uc3QsLi4uKSBHQ0NfUFJJTlRGTElLRSgxLDIpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihib29sKSBfbmNfc3VwcHJlc3Nfd2FybmluZ3M7CisKKy8qIGNvbXBfZXhwYW5kLmM6IGV4cGFuZCBzdHJpbmcgaW50byByZWFkYWJsZSBmb3JtICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBfbmNfdGljX2V4cGFuZCAoY29uc3QgY2hhciAqLCBib29sLCBpbnQpOworCisvKiBjb21wX3NjYW4uYzogZGVjb2RlIHN0cmluZyBmcm9tIHJlYWRhYmxlIGZvcm0gKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIF9uY190cmFuc19zdHJpbmcgKGNoYXIgKiwgY2hhciAqKTsKKworLyogY2FwdG9pbmZvLmM6IGNhcGFiaWxpdHkgY29udmVyc2lvbiAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgX25jX2NhcHRvaW5mbyAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCBjb25zdCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBfbmNfaW5mb3RvY2FwIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50IGNvbnN0KTsKKworLyogaG9tZV90ZXJtaW5mby5jICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBfbmNfaG9tZV90ZXJtaW5mbyAodm9pZCk7CisKKy8qIGxpYl90cGFybS5jICovCisjZGVmaW5lIE5VTV9QQVJNIDkKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihpbnQpIF9uY190cGFybV9lcnI7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIF9uY190cGFybV9hbmFseXplKGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50ICopOworCisvKiBsaWJfdHB1dHMuYyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihpbnQpIF9uY19udWxsc19zZW50OwkJLyogQWRkIG9uZSBmb3IgZXZlcnkgbnVsbCBzZW50ICovCisKKy8qIGNvbXBfbWFpbi5jOiBjb21waWxlciBtYWluICovCitleHRlcm4gY29uc3QgY2hhciAqIF9uY19wcm9nbmFtZTsKKworLyogZGJfaXRlcmF0b3IuYyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBkYmRUSUMgPSAwLAorI2lmIFVTRV9EQVRBQkFTRQorICAgIGRiZEVudk9uY2UsCisgICAgZGJkSG9tZSwKKyAgICBkYmRFbnZMaXN0LAorICAgIGRiZENmZ0xpc3QsCisgICAgZGJkQ2ZnT25jZSwKKyNlbmRpZgorI2lmIFVTRV9URVJNQ0FQCisgICAgZGJkRW52T25jZTIsCisgICAgZGJkRW52TGlzdDIsCisgICAgZGJkQ2ZnTGlzdDIsCisjZW5kaWYKKyAgICBkYmRMQVNUCit9IERCRElSUzsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNvbnN0IGNoYXIgKikgX25jX25leHRfZGIoREJESVJTICosIGludCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjb25zdCBjaGFyICopIF9uY190aWNfZGlyIChjb25zdCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY19maXJzdF9kYihEQkRJUlMgKiwgaW50ICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY19sYXN0X2RiKHZvaWQpOworCisvKiB3cml0ZV9lbnRyeS5jICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBfbmNfdGljX3dyaXR0ZW4gKHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19USUNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS90aW1lLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWU4ZDI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS90aW1lLmgKQEAgLTAsMCArMSw0MjEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0yMDAzLDIwMDYsMjAwOSwyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJSVNPIEM5OSBTdGFuZGFyZDogNy4yMyBEYXRlIGFuZCB0aW1lCTx0aW1lLmg+CisgKi8KKworI2lmbmRlZglfVElNRV9ICisKKyNpZiAoISBkZWZpbmVkIF9fbmVlZF90aW1lX3QgJiYgIWRlZmluZWQgX19uZWVkX2Nsb2NrX3QgJiYgXAorICAgICAhIGRlZmluZWQgX19uZWVkX3RpbWVzcGVjKQorIyBkZWZpbmUgX1RJTUVfSAkxCisjIGluY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2VuZGlmCisKKyNpZmRlZglfVElNRV9ICisvKiBHZXQgc2l6ZV90IGFuZCBOVUxMIGZyb20gPHN0ZGRlZi5oPi4gICovCisjIGRlZmluZSBfX25lZWRfc2l6ZV90CisjIGRlZmluZSBfX25lZWRfTlVMTAorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogVGhpcyBkZWZpbmVzIENMT0NLU19QRVJfU0VDLCB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHByb2Nlc3NvciBjbG9jaworICAgdGlja3MgcGVyIHNlY29uZC4gICovCisjIGluY2x1ZGUgPGJpdHMvdGltZS5oPgorCisvKiBUaGlzIGlzIHRoZSBvYnNvbGV0ZSBQT1NJWC4xLTE5ODggbmFtZSBmb3IgdGhlIHNhbWUgY29uc3RhbnQuICAqLworIyBpZiAhZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gJiYgIWRlZmluZWQgX19VU0VfWE9QRU4ySworIyAgaWZuZGVmIENMS19UQ0sKKyMgICBkZWZpbmUgQ0xLX1RDSwlDTE9DS1NfUEVSX1NFQworIyAgZW5kaWYKKyMgZW5kaWYKKworI2VuZGlmIC8qIDx0aW1lLmg+IGluY2x1ZGVkLiAgKi8KKworI2lmICFkZWZpbmVkIF9fY2xvY2tfdF9kZWZpbmVkICYmIChkZWZpbmVkIF9USU1FX0ggfHwgZGVmaW5lZCBfX25lZWRfY2xvY2tfdCkKKyMgZGVmaW5lIF9fY2xvY2tfdF9kZWZpbmVkCTEKKworIyBpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmV0dXJuZWQgYnkgYGNsb2NrJy4gICovCit0eXBlZGVmIF9fY2xvY2tfdCBjbG9ja190OworX19FTkRfTkFNRVNQQUNFX1NURAorI2lmIGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9QT1NJWCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKK19fVVNJTkdfTkFNRVNQQUNFX1NURChjbG9ja190KQorI2VuZGlmCisKKyNlbmRpZiAvKiBjbG9ja190IG5vdCBkZWZpbmVkIGFuZCA8dGltZS5oPiBvciBuZWVkIGNsb2NrX3QuICAqLworI3VuZGVmCV9fbmVlZF9jbG9ja190CisKKyNpZiAhZGVmaW5lZCBfX3RpbWVfdF9kZWZpbmVkICYmIChkZWZpbmVkIF9USU1FX0ggfHwgZGVmaW5lZCBfX25lZWRfdGltZV90KQorIyBkZWZpbmUgX190aW1lX3RfZGVmaW5lZAkxCisKKyMgaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFJldHVybmVkIGJ5IGB0aW1lJy4gICovCit0eXBlZGVmIF9fdGltZV90IHRpbWVfdDsKK19fRU5EX05BTUVTUEFDRV9TVEQKKyNpZiBkZWZpbmVkIF9fVVNFX1BPU0lYIHx8IGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1NWSUQKK19fVVNJTkdfTkFNRVNQQUNFX1NURCh0aW1lX3QpCisjZW5kaWYKKworI2VuZGlmIC8qIHRpbWVfdCBub3QgZGVmaW5lZCBhbmQgPHRpbWUuaD4gb3IgbmVlZCB0aW1lX3QuICAqLworI3VuZGVmCV9fbmVlZF90aW1lX3QKKworI2lmICFkZWZpbmVkIF9fY2xvY2tpZF90X2RlZmluZWQgJiYgXAorICAgKChkZWZpbmVkIF9USU1FX0ggJiYgZGVmaW5lZCBfX1VTRV9QT1NJWDE5OTMwOSkgfHwgZGVmaW5lZCBfX25lZWRfY2xvY2tpZF90KQorIyBkZWZpbmUgX19jbG9ja2lkX3RfZGVmaW5lZAkxCisKKyMgaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisvKiBDbG9jayBJRCB1c2VkIGluIGNsb2NrIGFuZCB0aW1lciBmdW5jdGlvbnMuICAqLwordHlwZWRlZiBfX2Nsb2NraWRfdCBjbG9ja2lkX3Q7CisKKyNlbmRpZiAvKiBjbG9ja2lkX3Qgbm90IGRlZmluZWQgYW5kIDx0aW1lLmg+IG9yIG5lZWQgY2xvY2tpZF90LiAgKi8KKyN1bmRlZglfX2Nsb2NraWRfdGltZV90CisKKyNpZiAhZGVmaW5lZCBfX3RpbWVyX3RfZGVmaW5lZCAmJiBcCisgICAgKChkZWZpbmVkIF9USU1FX0ggJiYgZGVmaW5lZCBfX1VTRV9QT1NJWDE5OTMwOSkgfHwgZGVmaW5lZCBfX25lZWRfdGltZXJfdCkKKyMgZGVmaW5lIF9fdGltZXJfdF9kZWZpbmVkCTEKKworIyBpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKy8qIFRpbWVyIElEIHJldHVybmVkIGJ5IGB0aW1lcl9jcmVhdGUnLiAgKi8KK3R5cGVkZWYgX190aW1lcl90IHRpbWVyX3Q7CisKKyNlbmRpZiAvKiB0aW1lcl90IG5vdCBkZWZpbmVkIGFuZCA8dGltZS5oPiBvciBuZWVkIHRpbWVyX3QuICAqLworI3VuZGVmCV9fbmVlZF90aW1lcl90CisKKworI2lmICFkZWZpbmVkIF9fdGltZXNwZWNfZGVmaW5lZCAmJgkJCQlcCisgICAgKChkZWZpbmVkIF9USU1FX0ggJiYJCQkJCVwKKyAgICAgIChkZWZpbmVkIF9fVVNFX1BPU0lYMTk5MzA5IHx8IGRlZmluZWQgX19VU0VfTUlTQykpIHx8CVwKKyAgICAgIGRlZmluZWQgX19uZWVkX3RpbWVzcGVjKQorIyBkZWZpbmUgX190aW1lc3BlY19kZWZpbmVkCTEKKworIyBpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CS8qIFRoaXMgZGVmaW5lcyBfX3RpbWVfdCBmb3IgdXMuICAqLworCisvKiBQT1NJWC4xYiBzdHJ1Y3R1cmUgZm9yIGEgdGltZSB2YWx1ZS4gIFRoaXMgaXMgbGlrZSBhIGBzdHJ1Y3QgdGltZXZhbCcgYnV0CisgICBoYXMgbmFub3NlY29uZHMgaW5zdGVhZCBvZiBtaWNyb3NlY29uZHMuICAqLworc3RydWN0IHRpbWVzcGVjCisgIHsKKyAgICBfX3RpbWVfdCB0dl9zZWM7CQkvKiBTZWNvbmRzLiAgKi8KKyAgICBsb25nIGludCB0dl9uc2VjOwkJLyogTmFub3NlY29uZHMuICAqLworICB9OworCisjZW5kaWYgLyogdGltZXNwZWMgbm90IGRlZmluZWQgYW5kIDx0aW1lLmg+IG9yIG5lZWQgdGltZXNwZWMuICAqLworI3VuZGVmCV9fbmVlZF90aW1lc3BlYworCisKKyNpZmRlZglfVElNRV9ICitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFVzZWQgYnkgb3RoZXIgdGltZSBmdW5jdGlvbnMuICAqLworc3RydWN0IHRtCit7CisgIGludCB0bV9zZWM7CQkJLyogU2Vjb25kcy4JWzAtNjBdICgxIGxlYXAgc2Vjb25kKSAqLworICBpbnQgdG1fbWluOwkJCS8qIE1pbnV0ZXMuCVswLTU5XSAqLworICBpbnQgdG1faG91cjsJCQkvKiBIb3Vycy4JWzAtMjNdICovCisgIGludCB0bV9tZGF5OwkJCS8qIERheS4JCVsxLTMxXSAqLworICBpbnQgdG1fbW9uOwkJCS8qIE1vbnRoLglbMC0xMV0gKi8KKyAgaW50IHRtX3llYXI7CQkJLyogWWVhcgktIDE5MDAuICAqLworICBpbnQgdG1fd2RheTsJCQkvKiBEYXkgb2Ygd2Vlay4JWzAtNl0gKi8KKyAgaW50IHRtX3lkYXk7CQkJLyogRGF5cyBpbiB5ZWFyLlswLTM2NV0JKi8KKyAgaW50IHRtX2lzZHN0OwkJCS8qIERTVC4JCVstMS8wLzFdKi8KKworI2lmZGVmCV9fVVNFX0JTRAorICBsb25nIGludCB0bV9nbXRvZmY7CQkvKiBTZWNvbmRzIGVhc3Qgb2YgVVRDLiAgKi8KKyAgX19jb25zdCBjaGFyICp0bV96b25lOwkvKiBUaW1lem9uZSBhYmJyZXZpYXRpb24uICAqLworI2Vsc2UKKyAgbG9uZyBpbnQgX190bV9nbXRvZmY7CQkvKiBTZWNvbmRzIGVhc3Qgb2YgVVRDLiAgKi8KKyAgX19jb25zdCBjaGFyICpfX3RtX3pvbmU7CS8qIFRpbWV6b25lIGFiYnJldmlhdGlvbi4gICovCisjZW5kaWYKK307CitfX0VORF9OQU1FU1BBQ0VfU1RECisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1BPU0lYIHx8IGRlZmluZWQgX19VU0VfTUlTQworX19VU0lOR19OQU1FU1BBQ0VfU1REKHRtKQorI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX1BPU0lYMTk5MzA5CisvKiBQT1NJWC4xYiBzdHJ1Y3R1cmUgZm9yIHRpbWVyIHN0YXJ0IHZhbHVlcyBhbmQgaW50ZXJ2YWxzLiAgKi8KK3N0cnVjdCBpdGltZXJzcGVjCisgIHsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgaXRfaW50ZXJ2YWw7CisgICAgc3RydWN0IHRpbWVzcGVjIGl0X3ZhbHVlOworICB9OworCisvKiBXZSBjYW4gdXNlIGEgc2ltcGxlIGZvcndhcmQgZGVjbGFyYXRpb24uICAqLworc3RydWN0IHNpZ2V2ZW50OworCisjZW5kaWYJLyogUE9TSVguMWIgKi8KKworI2lmZGVmIF9fVVNFX1hPUEVOMksKKyMgaWZuZGVmIF9fcGlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3BpZF90IHBpZF90OworIyAgZGVmaW5lIF9fcGlkX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBUaW1lIHVzZWQgYnkgdGhlIHByb2dyYW0gc28gZmFyICh1c2VyIHRpbWUgKyBzeXN0ZW0gdGltZSkuCisgICBUaGUgcmVzdWx0IC8gQ0xPQ0tTX1BFUl9TRUNPTkQgaXMgcHJvZ3JhbSB0aW1lIGluIHNlY29uZHMuICAqLworZXh0ZXJuIGNsb2NrX3QgY2xvY2sgKHZvaWQpIF9fVEhST1c7CisKKy8qIFJldHVybiB0aGUgY3VycmVudCB0aW1lIGFuZCBwdXQgaXQgaW4gKlRJTUVSIGlmIFRJTUVSIGlzIG5vdCBOVUxMLiAgKi8KK2V4dGVybiB0aW1lX3QgdGltZSAodGltZV90ICpfX3RpbWVyKSBfX1RIUk9XOworCisvKiBSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBUSU1FMSBhbmQgVElNRTAuICAqLworZXh0ZXJuIGRvdWJsZSBkaWZmdGltZSAodGltZV90IF9fdGltZTEsIHRpbWVfdCBfX3RpbWUwKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworLyogUmV0dXJuIHRoZSBgdGltZV90JyByZXByZXNlbnRhdGlvbiBvZiBUUCBhbmQgbm9ybWFsaXplIFRQLiAgKi8KK2V4dGVybiB0aW1lX3QgbWt0aW1lIChzdHJ1Y3QgdG0gKl9fdHApIF9fVEhST1c7CisKKworLyogRm9ybWF0IFRQIGludG8gUyBhY2NvcmRpbmcgdG8gRk9STUFULgorICAgV3JpdGUgbm8gbW9yZSB0aGFuIE1BWFNJWkUgY2hhcmFjdGVycyBhbmQgcmV0dXJuIHRoZSBudW1iZXIKKyAgIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiwgb3IgMCBpZiBpdCB3b3VsZCBleGNlZWQgTUFYU0laRS4gICovCitleHRlcm4gc2l6ZV90IHN0cmZ0aW1lIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbWF4c2l6ZSwKKwkJCV9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCV9fY29uc3Qgc3RydWN0IHRtICpfX3Jlc3RyaWN0IF9fdHApIF9fVEhST1c7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyMgaWZkZWYgX19VU0VfWE9QRU4KKy8qIFBhcnNlIFMgYWNjb3JkaW5nIHRvIEZPUk1BVCBhbmQgc3RvcmUgYmluYXJ5IHRpbWUgaW5mb3JtYXRpb24gaW4gVFAuCisgICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgdW5wYXJzZWQgY2hhcmFjdGVyIGluIFMuICAqLworZXh0ZXJuIGNoYXIgKnN0cnB0aW1lIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zLAorCQkgICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCBzdHJ1Y3QgdG0gKl9fdHApCisgICAgIF9fVEhST1c7CisjIGVuZGlmCisKKyMgaWZkZWYgX19VU0VfWE9QRU4ySzgKKy8qIFNpbWlsYXIgdG8gdGhlIHR3byBmdW5jdGlvbnMgYWJvdmUgYnV0IHRha2UgdGhlIGluZm9ybWF0aW9uIGZyb20KKyAgIHRoZSBwcm92aWRlZCBsb2NhbGUgYW5kIG5vdCB0aGUgZ2xvYmFsIGxvY2FsZS4gICovCisjIGluY2x1ZGUgPHhsb2NhbGUuaD4KKworZXh0ZXJuIHNpemVfdCBzdHJmdGltZV9sIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbWF4c2l6ZSwKKwkJCSAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICBfX2NvbnN0IHN0cnVjdCB0bSAqX19yZXN0cmljdCBfX3RwLAorCQkJICBfX2xvY2FsZV90IF9fbG9jKSBfX1RIUk9XOworIyBlbmRpZgorCisjIGlmZGVmIF9fVVNFX0dOVQorZXh0ZXJuIGNoYXIgKnN0cnB0aW1lX2wgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3MsCisJCQkgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCBzdHJ1Y3QgdG0gKl9fdHAsCisJCQkgX19sb2NhbGVfdCBfX2xvYykgX19USFJPVzsKKyMgZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFJldHVybiB0aGUgYHN0cnVjdCB0bScgcmVwcmVzZW50YXRpb24gb2YgKlRJTUVSCisgICBpbiBVbml2ZXJzYWwgQ29vcmRpbmF0ZWQgVGltZSAoYWthIEdyZWVud2ljaCBNZWFuIFRpbWUpLiAgKi8KK2V4dGVybiBzdHJ1Y3QgdG0gKmdtdGltZSAoX19jb25zdCB0aW1lX3QgKl9fdGltZXIpIF9fVEhST1c7CisKKy8qIFJldHVybiB0aGUgYHN0cnVjdCB0bScgcmVwcmVzZW50YXRpb24KKyAgIG9mICpUSU1FUiBpbiB0aGUgbG9jYWwgdGltZXpvbmUuICAqLworZXh0ZXJuIHN0cnVjdCB0bSAqbG9jYWx0aW1lIChfX2NvbnN0IHRpbWVfdCAqX190aW1lcikgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworIyBpZiBkZWZpbmVkIF9fVVNFX1BPU0lYIHx8IGRlZmluZWQgX19VU0VfTUlTQworLyogUmV0dXJuIHRoZSBgc3RydWN0IHRtJyByZXByZXNlbnRhdGlvbiBvZiAqVElNRVIgaW4gVVRDLAorICAgdXNpbmcgKlRQIHRvIHN0b3JlIHRoZSByZXN1bHQuICAqLworZXh0ZXJuIHN0cnVjdCB0bSAqZ210aW1lX3IgKF9fY29uc3QgdGltZV90ICpfX3Jlc3RyaWN0IF9fdGltZXIsCisJCQkgICAgc3RydWN0IHRtICpfX3Jlc3RyaWN0IF9fdHApIF9fVEhST1c7CisKKy8qIFJldHVybiB0aGUgYHN0cnVjdCB0bScgcmVwcmVzZW50YXRpb24gb2YgKlRJTUVSIGluIGxvY2FsIHRpbWUsCisgICB1c2luZyAqVFAgdG8gc3RvcmUgdGhlIHJlc3VsdC4gICovCitleHRlcm4gc3RydWN0IHRtICpsb2NhbHRpbWVfciAoX19jb25zdCB0aW1lX3QgKl9fcmVzdHJpY3QgX190aW1lciwKKwkJCSAgICAgICBzdHJ1Y3QgdG0gKl9fcmVzdHJpY3QgX190cCkgX19USFJPVzsKKyMgZW5kaWYJLyogUE9TSVggb3IgbWlzYyAqLworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFJldHVybiBhIHN0cmluZyBvZiB0aGUgZm9ybSAiRGF5IE1vbiBkZCBoaDptbTpzcyB5eXl5XG4iCisgICB0aGF0IGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBUUCBpbiB0aGlzIGZvcm1hdC4gICovCitleHRlcm4gY2hhciAqYXNjdGltZSAoX19jb25zdCBzdHJ1Y3QgdG0gKl9fdHApIF9fVEhST1c7CisKKy8qIEVxdWl2YWxlbnQgdG8gYGFzY3RpbWUgKGxvY2FsdGltZSAodGltZXIpKScuICAqLworZXh0ZXJuIGNoYXIgKmN0aW1lIChfX2NvbnN0IHRpbWVfdCAqX190aW1lcikgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworIyBpZiBkZWZpbmVkIF9fVVNFX1BPU0lYIHx8IGRlZmluZWQgX19VU0VfTUlTQworLyogUmVlbnRyYW50IHZlcnNpb25zIG9mIHRoZSBhYm92ZSBmdW5jdGlvbnMuICAqLworCisvKiBSZXR1cm4gaW4gQlVGIGEgc3RyaW5nIG9mIHRoZSBmb3JtICJEYXkgTW9uIGRkIGhoOm1tOnNzIHl5eXlcbiIKKyAgIHRoYXQgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIFRQIGluIHRoaXMgZm9ybWF0LiAgKi8KK2V4dGVybiBjaGFyICphc2N0aW1lX3IgKF9fY29uc3Qgc3RydWN0IHRtICpfX3Jlc3RyaWN0IF9fdHAsCisJCQljaGFyICpfX3Jlc3RyaWN0IF9fYnVmKSBfX1RIUk9XOworCisvKiBFcXVpdmFsZW50IHRvIGBhc2N0aW1lX3IgKGxvY2FsdGltZV9yICh0aW1lciwgKlRNUCopLCBidWYpJy4gICovCitleHRlcm4gY2hhciAqY3RpbWVfciAoX19jb25zdCB0aW1lX3QgKl9fcmVzdHJpY3QgX190aW1lciwKKwkJICAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1ZikgX19USFJPVzsKKyMgZW5kaWYJLyogUE9TSVggb3IgbWlzYyAqLworCisKKy8qIERlZmluZWQgaW4gbG9jYWx0aW1lLmMuICAqLworZXh0ZXJuIGNoYXIgKl9fdHpuYW1lWzJdOwkvKiBDdXJyZW50IHRpbWV6b25lIG5hbWVzLiAgKi8KK2V4dGVybiBpbnQgX19kYXlsaWdodDsJCS8qIElmIGRheWxpZ2h0LXNhdmluZyB0aW1lIGlzIGV2ZXIgaW4gdXNlLiAgKi8KK2V4dGVybiBsb25nIGludCBfX3RpbWV6b25lOwkvKiBTZWNvbmRzIHdlc3Qgb2YgVVRDLiAgKi8KKworCisjIGlmZGVmCV9fVVNFX1BPU0lYCisvKiBTYW1lIGFzIGFib3ZlLiAgKi8KK2V4dGVybiBjaGFyICp0em5hbWVbMl07CisKKy8qIFNldCB0aW1lIGNvbnZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgVFogZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICBJZiBUWiBpcyBub3QgZGVmaW5lZCwgYSBsb2NhbGUtZGVwZW5kZW50IGRlZmF1bHQgaXMgdXNlZC4gICovCitleHRlcm4gdm9pZCB0enNldCAodm9pZCkgX19USFJPVzsKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorZXh0ZXJuIGludCBkYXlsaWdodDsKK2V4dGVybiBsb25nIGludCB0aW1lem9uZTsKKyMgZW5kaWYKKworIyBpZmRlZiBfX1VTRV9TVklECisvKiBTZXQgdGhlIHN5c3RlbSB0aW1lIHRvICpXSEVOLgorICAgVGhpcyBjYWxsIGlzIHJlc3RyaWN0ZWQgdG8gdGhlIHN1cGVydXNlci4gICovCitleHRlcm4gaW50IHN0aW1lIChfX2NvbnN0IHRpbWVfdCAqX193aGVuKSBfX1RIUk9XOworIyBlbmRpZgorCisKKy8qIE5vbnplcm8gaWYgWUVBUiBpcyBhIGxlYXAgeWVhciAoZXZlcnkgNCB5ZWFycywKKyAgIGV4Y2VwdCBldmVyeSAxMDB0aCBpc24ndCwgYW5kIGV2ZXJ5IDQwMHRoIGlzKS4gICovCisjIGRlZmluZSBfX2lzbGVhcCh5ZWFyKQlcCisgICgoeWVhcikgJSA0ID09IDAgJiYgKCh5ZWFyKSAlIDEwMCAhPSAwIHx8ICh5ZWFyKSAlIDQwMCA9PSAwKSkKKworCisjIGlmZGVmIF9fVVNFX01JU0MKKy8qIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zIG1hbnkgVW5pY2VzIGluaGVyaXRlZCBmcm9tIHRoZSBwdWJsaWMgZG9tYWluCisgICBsb2NhbHRpbWUgcGFja2FnZS4gIFRoZXNlIGFyZSBpbmNsdWRlZCBvbmx5IGZvciBjb21wYXRpYmlsaXR5LiAgKi8KKworLyogTGlrZSBgbWt0aW1lJywgYnV0IGZvciBUUCByZXByZXNlbnRzIFVuaXZlcnNhbCBUaW1lLCBub3QgbG9jYWwgdGltZS4gICovCitleHRlcm4gdGltZV90IHRpbWVnbSAoc3RydWN0IHRtICpfX3RwKSBfX1RIUk9XOworCisvKiBBbm90aGVyIG5hbWUgZm9yIGBta3RpbWUnLiAgKi8KK2V4dGVybiB0aW1lX3QgdGltZWxvY2FsIChzdHJ1Y3QgdG0gKl9fdHApIF9fVEhST1c7CisKKy8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGRheXMgaW4gWUVBUi4gICovCitleHRlcm4gaW50IGR5c2l6ZSAoaW50IF9feWVhcikgX19USFJPVyAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworIyBlbmRpZgorCisKKyMgaWZkZWYgX19VU0VfUE9TSVgxOTkzMDkKKy8qIFBhdXNlIGV4ZWN1dGlvbiBmb3IgYSBudW1iZXIgb2YgbmFub3NlY29uZHMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBuYW5vc2xlZXAgKF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3JlcXVlc3RlZF90aW1lLAorCQkgICAgICBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVtYWluaW5nKTsKKworCisvKiBHZXQgcmVzb2x1dGlvbiBvZiBjbG9jayBDTE9DS19JRC4gICovCitleHRlcm4gaW50IGNsb2NrX2dldHJlcyAoY2xvY2tpZF90IF9fY2xvY2tfaWQsIHN0cnVjdCB0aW1lc3BlYyAqX19yZXMpIF9fVEhST1c7CisKKy8qIEdldCBjdXJyZW50IHZhbHVlIG9mIGNsb2NrIENMT0NLX0lEIGFuZCBzdG9yZSBpdCBpbiBUUC4gICovCitleHRlcm4gaW50IGNsb2NrX2dldHRpbWUgKGNsb2NraWRfdCBfX2Nsb2NrX2lkLCBzdHJ1Y3QgdGltZXNwZWMgKl9fdHApIF9fVEhST1c7CisKKy8qIFNldCBjbG9jayBDTE9DS19JRCB0byB2YWx1ZSBUUC4gICovCitleHRlcm4gaW50IGNsb2NrX3NldHRpbWUgKGNsb2NraWRfdCBfX2Nsb2NrX2lkLCBfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX190cCkKKyAgICAgX19USFJPVzsKKworIyAgaWZkZWYgX19VU0VfWE9QRU4ySworLyogSGlnaC1yZXNvbHV0aW9uIHNsZWVwIHdpdGggdGhlIHNwZWNpZmllZCBjbG9jay4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IGNsb2NrX25hbm9zbGVlcCAoY2xvY2tpZF90IF9fY2xvY2tfaWQsIGludCBfX2ZsYWdzLAorCQkJICAgIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3JlcSwKKwkJCSAgICBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVtKTsKKworLyogUmV0dXJuIGNsb2NrIElEIGZvciBDUFUtdGltZSBjbG9jay4gICovCitleHRlcm4gaW50IGNsb2NrX2dldGNwdWNsb2NraWQgKHBpZF90IF9fcGlkLCBjbG9ja2lkX3QgKl9fY2xvY2tfaWQpIF9fVEhST1c7CisjICBlbmRpZgorCisKKy8qIENyZWF0ZSBuZXcgcGVyLXByb2Nlc3MgdGltZXIgdXNpbmcgQ0xPQ0tfSUQuICAqLworZXh0ZXJuIGludCB0aW1lcl9jcmVhdGUgKGNsb2NraWRfdCBfX2Nsb2NrX2lkLAorCQkJIHN0cnVjdCBzaWdldmVudCAqX19yZXN0cmljdCBfX2V2cCwKKwkJCSB0aW1lcl90ICpfX3Jlc3RyaWN0IF9fdGltZXJpZCkgX19USFJPVzsKKworLyogRGVsZXRlIHRpbWVyIFRJTUVSSUQuICAqLworZXh0ZXJuIGludCB0aW1lcl9kZWxldGUgKHRpbWVyX3QgX190aW1lcmlkKSBfX1RIUk9XOworCisvKiBTZXQgdGltZXIgVElNRVJJRCB0byBWQUxVRSwgcmV0dXJuaW5nIG9sZCB2YWx1ZSBpbiBPVkxBVUUuICAqLworZXh0ZXJuIGludCB0aW1lcl9zZXR0aW1lICh0aW1lcl90IF9fdGltZXJpZCwgaW50IF9fZmxhZ3MsCisJCQkgIF9fY29uc3Qgc3RydWN0IGl0aW1lcnNwZWMgKl9fcmVzdHJpY3QgX192YWx1ZSwKKwkJCSAgc3RydWN0IGl0aW1lcnNwZWMgKl9fcmVzdHJpY3QgX19vdmFsdWUpIF9fVEhST1c7CisKKy8qIEdldCBjdXJyZW50IHZhbHVlIG9mIHRpbWVyIFRJTUVSSUQgYW5kIHN0b3JlIGl0IGluIFZMQVVFLiAgKi8KK2V4dGVybiBpbnQgdGltZXJfZ2V0dGltZSAodGltZXJfdCBfX3RpbWVyaWQsIHN0cnVjdCBpdGltZXJzcGVjICpfX3ZhbHVlKQorICAgICBfX1RIUk9XOworCisvKiBHZXQgZXhwaXJhdGlvbiBvdmVycnVuIGZvciB0aW1lciBUSU1FUklELiAgKi8KK2V4dGVybiBpbnQgdGltZXJfZ2V0b3ZlcnJ1biAodGltZXJfdCBfX3RpbWVyaWQpIF9fVEhST1c7CisjIGVuZGlmCisKKworIyBpZmRlZiBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogU2V0IHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyB0byBpbmRpY2F0ZSBhbiBlcnJvci4KKyAgICAgMSAgdGhlIERBVEVNU0sgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbnVsbCBvciB1bmRlZmluZWQsCisgICAgIDIgIHRoZSB0ZW1wbGF0ZSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQgZm9yIHJlYWRpbmcsCisgICAgIDMgIGZhaWxlZCB0byBnZXQgZmlsZSBzdGF0dXMgaW5mb3JtYXRpb24sCisgICAgIDQgIHRoZSB0ZW1wbGF0ZSBmaWxlIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZSwKKyAgICAgNSAgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgd2hpbGUgcmVhZGluZyB0aGUgdGVtcGxhdGUgZmlsZSwKKyAgICAgNiAgbWVtb3J5IGFsbGljYXRpb24gZmFpbGVkIChub3QgZW5vdWdoIG1lbW9yeSBhdmFpbGFibGUpLAorICAgICA3ICB0aGVyZSBpcyBubyBsaW5lIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IG1hdGNoZXMgdGhlIGlucHV0LAorICAgICA4ICBpbnZhbGlkIGlucHV0IHNwZWNpZmljYXRpb24gRXhhbXBsZTogRmVicnVhcnkgMzEgb3IgYSB0aW1lIGlzCisJc3BlY2lmaWVkIHRoYXQgY2FuIG5vdCBiZSByZXByZXNlbnRlZCBpbiBhIHRpbWVfdCAocmVwcmVzZW50aW5nCisJdGhlIHRpbWUgaW4gc2Vjb25kcyBzaW5jZSAwMDowMDowMCBVVEMsIEphbnVhcnkgMSwgMTk3MCkgKi8KK2V4dGVybiBpbnQgZ2V0ZGF0ZV9lcnI7CisKKy8qIFBhcnNlIHRoZSBnaXZlbiBzdHJpbmcgYXMgYSBkYXRlIHNwZWNpZmljYXRpb24gYW5kIHJldHVybiBhIHZhbHVlCisgICByZXByZXNlbnRpbmcgdGhlIHZhbHVlLiAgVGhlIHRlbXBsYXRlcyBmcm9tIHRoZSBmaWxlIGlkZW50aWZpZWQgYnkKKyAgIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBEQVRFTVNLIGFyZSB1c2VkLiAgSW4gY2FzZSBvZiBhbiBlcnJvcgorICAgYGdldGRhdGVfZXJyJyBpcyBzZXQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCB0bSAqZ2V0ZGF0ZSAoX19jb25zdCBjaGFyICpfX3N0cmluZyk7CisjIGVuZGlmCisKKyMgaWZkZWYgX19VU0VfR05VCisvKiBTaW5jZSBgZ2V0ZGF0ZScgaXMgbm90IHJlZW50cmFudCBiZWNhdXNlIG9mIHRoZSB1c2Ugb2YgYGdldGRhdGVfZXJyJworICAgYW5kIHRoZSBzdGF0aWMgYnVmZmVyIHRvIHJldHVybiB0aGUgcmVzdWx0IGluLCB3ZSBwcm92aWRlIGEgdGhyZWFkLXNhZmUKKyAgIHZhcmlhbnQuICBUaGUgZnVuY3Rpb25hbGl0eSBpcyB0aGUgc2FtZS4gIFRoZSByZXN1bHQgaXMgcmV0dXJuZWQgaW4KKyAgIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBSRVNCVUZQIGFuZCBpbiBjYXNlIG9mIGFuIGVycm9yIHRoZSByZXR1cm4KKyAgIHZhbHVlIGlzICE9IDAgd2l0aCB0aGUgc2FtZSB2YWx1ZXMgYXMgZ2l2ZW4gYWJvdmUgZm9yIGBnZXRkYXRlX2VycicuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0ZGF0ZV9yIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zdHJpbmcsCisJCSAgICAgIHN0cnVjdCB0bSAqX19yZXN0cmljdCBfX3Jlc2J1ZnApOworIyBlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogPHRpbWUuaD4gaW5jbHVkZWQuICAqLworCisjZW5kaWYgLyogPHRpbWUuaD4gbm90IGFscmVhZHkgaW5jbHVkZWQuICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS90dHllbnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdHR5ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIyMjFiYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdHR5ZW50LmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl0dHllbnQuaAk4LjEgKEJlcmtlbGV5KSA2LzIvOTMKKyAqLworCisjaWZuZGVmCV9UVFlFTlRfSAorI2RlZmluZQlfVFRZRU5UX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2RlZmluZQlfUEFUSF9UVFlTCSIvZXRjL3R0eXMiCisKKyNkZWZpbmUJX1RUWVNfT0ZGCSJvZmYiCisjZGVmaW5lCV9UVFlTX09OCSJvbiIKKyNkZWZpbmUJX1RUWVNfU0VDVVJFCSJzZWN1cmUiCisjZGVmaW5lCV9UVFlTX1dJTkRPVwkid2luZG93IgorCitzdHJ1Y3QgdHR5ZW50IHsKKwljaGFyCSp0eV9uYW1lOwkvKiB0ZXJtaW5hbCBkZXZpY2UgbmFtZSAqLworCWNoYXIJKnR5X2dldHR5OwkvKiBjb21tYW5kIHRvIGV4ZWN1dGUsIHVzdWFsbHkgZ2V0dHkgKi8KKwljaGFyCSp0eV90eXBlOwkvKiB0ZXJtaW5hbCB0eXBlIGZvciB0ZXJtY2FwICovCisjZGVmaW5lCVRUWV9PTgkJMHgwMQkvKiBlbmFibGUgbG9naW5zIChzdGFydCB0eV9nZXR0eSBwcm9ncmFtKSAqLworI2RlZmluZQlUVFlfU0VDVVJFCTB4MDIJLyogYWxsb3cgdWlkIG9mIDAgdG8gbG9naW4gKi8KKwlpbnQJdHlfc3RhdHVzOwkvKiBzdGF0dXMgZmxhZ3MgKi8KKwljaGFyIAkqdHlfd2luZG93OwkvKiBjb21tYW5kIHRvIHN0YXJ0IHVwIHdpbmRvdyBtYW5hZ2VyICovCisJY2hhcgkqdHlfY29tbWVudDsJLyogY29tbWVudCBmaWVsZCAqLworfTsKKworCitfX0JFR0lOX0RFQ0xTCisKK2V4dGVybiBzdHJ1Y3QgdHR5ZW50ICpnZXR0dHllbnQgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gc3RydWN0IHR0eWVudCAqZ2V0dHR5bmFtIChfX2NvbnN0IGNoYXIgKl9fdHR5KSBfX1RIUk9XOworZXh0ZXJuIGludCBzZXR0dHllbnQgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gaW50IGVuZHR0eWVudCAodm9pZCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHR0eWVudC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3Vjb250ZXh0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3Vjb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlYjY0NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdWNvbnRleHQuaApAQCAtMCwwICsxLDUzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIFN5c3RlbSBWIEFCSSBjb21wbGlhbnQgdXNlci1sZXZlbCBjb250ZXh0IHN3aXRjaGluZyBzdXBwb3J0LiAgKi8KKworI2lmbmRlZiBfVUNPTlRFWFRfSAorI2RlZmluZSBfVUNPTlRFWFRfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgbWFjaGluZSBkZXBlbmRlbnQgZGVmaW5pdGlvbiBvZiBkYXRhIHN0cnVjdHVyZXMuICAqLworI2luY2x1ZGUgPHN5cy91Y29udGV4dC5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIEdldCB1c2VyIGNvbnRleHQgYW5kIHN0b3JlIGl0IGluIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkgVUNQLiAgKi8KK2V4dGVybiBpbnQgZ2V0Y29udGV4dCAodWNvbnRleHRfdCAqX191Y3ApIF9fVEhST1dOTDsKKworLyogU2V0IHVzZXIgY29udGV4dCBmcm9tIGluZm9ybWF0aW9uIG9mIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkgVUNQLiAgKi8KK2V4dGVybiBpbnQgc2V0Y29udGV4dCAoX19jb25zdCB1Y29udGV4dF90ICpfX3VjcCkgX19USFJPV05MOworCisvKiBTYXZlIGN1cnJlbnQgY29udGV4dCBpbiBjb250ZXh0IHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkgT1VDUCBhbmQgc2V0CisgICBjb250ZXh0IGZyb20gdmFyaWFibGUgcG9pbnRlZCB0byBieSBVQ1AuICAqLworZXh0ZXJuIGludCBzd2FwY29udGV4dCAodWNvbnRleHRfdCAqX19yZXN0cmljdCBfX291Y3AsCisJCQlfX2NvbnN0IHVjb250ZXh0X3QgKl9fcmVzdHJpY3QgX191Y3ApIF9fVEhST1dOTDsKKworLyogTWFuaXB1bGF0ZSB1c2VyIGNvbnRleHQgVUNQIHRvIGNvbnRpbnVlIHdpdGggY2FsbGluZyBmdW5jdGlvbnMgRlVOQworICAgYW5kIHRoZSBBUkdDLTEgcGFyYW1ldGVycyBmb2xsb3dpbmcgQVJHQyB3aGVuIHRoZSBjb250ZXh0IGlzIHVzZWQKKyAgIHRoZSBuZXh0IHRpbWUgaW4gYHNldGNvbnRleHQnIG9yIGBzd2FwY29udGV4dCcuCisKKyAgIFdlIGNhbm5vdCBzYXkgYW55dGhpbmcgYWJvdXQgdGhlIHBhcmFtZXRlcnMgRlVOQyB0YWtlczsgYHZvaWQnCisgICBpcyBhcyBnb29kIGFzIGFueSBvdGhlciBjaG9pY2UuICAqLworZXh0ZXJuIHZvaWQgbWFrZWNvbnRleHQgKHVjb250ZXh0X3QgKl9fdWNwLCB2b2lkICgqX19mdW5jKSAodm9pZCksCisJCQkgaW50IF9fYXJnYywgLi4uKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogdWNvbnRleHQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS91bGltaXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdWxpbWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiNWYzNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdWxpbWl0LmgKQEAgLTAsMCArMSw0OCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9VTElNSVRfSAorI2RlZmluZSBfVUxJTUlUX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogQ29uc3RhbnRzIHVzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciBmb3IgYHVsaW1pdCcuICBUaGV5IGRlbm90ZSBsaW1pdHMKKyAgIHdoaWNoIGNhbiBiZSBzZXQgb3IgcmV0cmlldmVkIHVzaW5nIHRoaXMgZnVuY3Rpb24uICAqLworZW51bQoreworICBVTF9HRVRGU0laRSA9IDEsCQkJLyogUmV0dXJuIGxpbWl0IG9uIHRoZSBzaXplIG9mIGEgZmlsZSwKKwkJCQkJICAgaW4gdW5pdHMgb2YgNTEyIGJ5dGVzLiAgKi8KKyNkZWZpbmUgVUxfR0VURlNJWkUJVUxfR0VURlNJWkUKKyAgVUxfU0VURlNJWkUsCQkJCS8qIFNldCBsaW1pdCBvbiB0aGUgc2l6ZSBvZiBhIGZpbGUgdG8KKwkJCQkJICAgc2Vjb25kIGFyZ3VtZW50LiAgKi8KKyNkZWZpbmUgVUxfU0VURlNJWkUJVUxfU0VURlNJWkUKKyAgX19VTF9HRVRNQVhCUkssCQkJLyogUmV0dXJuIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGFkZHJlc3MKKwkJCQkJICAgb2YgdGhlIGRhdGEgc2VnbWVudC4gICovCisgIF9fVUxfR0VUT1BFTk1BWAkJCS8qIFJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgZmlsZXMKKwkJCQkJICAgdGhhdCB0aGUgY2FsbGluZyBwcm9jZXNzIGNhbiBvcGVuLiovCit9OworCisKK19fQkVHSU5fREVDTFMKKworLyogQ29udHJvbCBwcm9jZXNzIGxpbWl0cyBhY2NvcmRpbmcgdG8gQ01ELiAgKi8KK2V4dGVybiBsb25nIGludCB1bGltaXQgKGludCBfX2NtZCwgLi4uKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogdWxpbWl0LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdW5jdHJsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3VuY3RybC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmODQ0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3VuY3RybC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOCwyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQXV0aG9yOiBaZXlkIE0uIEJlbi1IYWxpbSA8em1iZW5oYWxAbmV0Y29tLmNvbT4gMTk5MiwxOTk1ICAgICAgICAgICAgICAgKgorICogICAgIGFuZDogRXJpYyBTLiBSYXltb25kIDxlc3JAc25hcmsudGh5cnN1cy5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogdW5jdHJsLmgKKyAqCisgKiBEaXNwbGF5IGEgcHJpbnRhYmxlIHZlcnNpb24gb2YgYSBjb250cm9sIGNoYXJhY3Rlci4KKyAqIENvbnRyb2wgY2hhcmFjdGVycyBhcmUgZGlzcGxheWVkIGluIGNhcmV0IG5vdGF0aW9uICheeCksIERFTEVURSBpcyBkaXNwbGF5ZWQKKyAqIGFzIF4/LiBQcmludGFibGUgY2hhcmFjdGVycyBhcmUgZGlzcGxheWVkIGFzIGlzLgorICovCisKKy8qICRJZDogdW5jdHJsLmguaW4sdiAxLjExIDIwMDkvMDQvMTggMjE6MDA6NTIgdG9tIEV4cCAkICovCisKKyNpZm5kZWYgTkNVUlNFU19VTkNUUkxfSF9pbmNsCisjZGVmaW5lIE5DVVJTRVNfVU5DVFJMX0hfaW5jbAkxCisKKyN1bmRlZiAgTkNVUlNFU19WRVJTSU9OCisjZGVmaW5lIE5DVVJTRVNfVkVSU0lPTiAiNS45IgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxjdXJzZXMuaD4KKworI3VuZGVmIHVuY3RybAorTkNVUlNFU19FWFBPUlQoTkNVUlNFU19DT05TVCBjaGFyICopIHVuY3RybCAoY2h0eXBlKTsKKworI2lmIDAKK05DVVJTRVNfRVhQT1JUKE5DVVJTRVNfQ09OU1QgY2hhciAqKSBOQ1VSU0VTX1NQX05BTUUodW5jdHJsKSAoU0NSRUVOKiwgY2h0eXBlKTsKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogTkNVUlNFU19VTkNUUkxfSF9pbmNsICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3VuaXN0ZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS91bmlzdGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzk5Yjc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS91bmlzdGQuaApAQCAtMCwwICsxLDExNzYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0yMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJUE9TSVggU3RhbmRhcmQ6IDIuMTAgU3ltYm9saWMgQ29uc3RhbnRzCQk8dW5pc3RkLmg+CisgKi8KKworI2lmbmRlZglfVU5JU1REX0gKKyNkZWZpbmUJX1VOSVNURF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogVGhlc2UgbWF5IGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoYXQgZmFjaWxpdGllcyBhcmUgcHJlc2VudCBhdCBjb21waWxlIHRpbWUuCisgICBUaGVpciB2YWx1ZXMgY2FuIGJlIG9idGFpbmVkIGF0IHJ1biB0aW1lIGZyb20gYHN5c2NvbmYnLiAgKi8KKworI2lmZGVmIF9fVVNFX1hPUEVOMks4CisvKiBQT1NJWCBTdGFuZGFyZCBhcHByb3ZlZCBhcyBJU08vSUVDIDk5NDUtMSBhcyBvZiBTZXB0ZW1iZXIgMjAwOC4gICovCisjIGRlZmluZSBfUE9TSVhfVkVSU0lPTgkyMDA4MDlMCisjZWxpZiBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIFBPU0lYIFN0YW5kYXJkIGFwcHJvdmVkIGFzIElTTy9JRUMgOTk0NS0xIGFzIG9mIERlY2VtYmVyIDIwMDEuICAqLworIyBkZWZpbmUgX1BPU0lYX1ZFUlNJT04JMjAwMTEyTAorI2VsaWYgZGVmaW5lZCBfX1VTRV9QT1NJWDE5OTUwNgorLyogUE9TSVggU3RhbmRhcmQgYXBwcm92ZWQgYXMgSVNPL0lFQyA5OTQ1LTEgYXMgb2YgSnVuZSAxOTk1LiAgKi8KKyMgZGVmaW5lIF9QT1NJWF9WRVJTSU9OCTE5OTUwNkwKKyNlbGlmIGRlZmluZWQgX19VU0VfUE9TSVgxOTkzMDkKKy8qIFBPU0lYIFN0YW5kYXJkIGFwcHJvdmVkIGFzIElTTy9JRUMgOTk0NS0xIGFzIG9mIFNlcHRlbWJlciAxOTkzLiAgKi8KKyMgZGVmaW5lIF9QT1NJWF9WRVJTSU9OCTE5OTMwOUwKKyNlbHNlCisvKiBQT1NJWCBTdGFuZGFyZCBhcHByb3ZlZCBhcyBJU08vSUVDIDk5NDUtMSBhcyBvZiBTZXB0ZW1iZXIgMTk5MC4gICovCisjIGRlZmluZSBfUE9TSVhfVkVSU0lPTgkxOTkwMDlMCisjZW5kaWYKKworLyogVGhlc2UgYXJlIG5vdCAjaWZkZWYgX19VU0VfUE9TSVgyIGJlY2F1c2UgdGhleSBhcmUKKyAgIGluIHRoZSB0aGVvcmV0aWNhbGx5IGFwcGxpY2F0aW9uLW93bmVkIG5hbWVzcGFjZS4gICovCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLOAorIyBkZWZpbmUgX19QT1NJWDJfVEhJU19WRVJTSU9OCTIwMDgwOUwKKy8qIFRoZSB1dGlsaXRpZXMgb24gR05VIHN5c3RlbXMgYWxzbyBjb3JyZXNwb25kIHRvIHRoaXMgdmVyc2lvbi4gICovCisjZWxpZiBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIFRoZSB1dGlsaXRpZXMgb24gR05VIHN5c3RlbXMgYWxzbyBjb3JyZXNwb25kIHRvIHRoaXMgdmVyc2lvbi4gICovCisjIGRlZmluZSBfX1BPU0lYMl9USElTX1ZFUlNJT04JMjAwMTEyTAorI2VsaWYgZGVmaW5lZCBfX1VTRV9QT1NJWDE5OTUwNgorLyogVGhlIHV0aWxpdGllcyBvbiBHTlUgc3lzdGVtcyBhbHNvIGNvcnJlc3BvbmQgdG8gdGhpcyB2ZXJzaW9uLiAgKi8KKyMgZGVmaW5lIF9fUE9TSVgyX1RISVNfVkVSU0lPTgkxOTk1MDZMCisjZWxzZQorLyogVGhlIHV0aWxpdGllcyBvbiBHTlUgc3lzdGVtcyBhbHNvIGNvcnJlc3BvbmQgdG8gdGhpcyB2ZXJzaW9uLiAgKi8KKyMgZGVmaW5lIF9fUE9TSVgyX1RISVNfVkVSU0lPTgkxOTkyMDlMCisjZW5kaWYKKworLyogVGhlIHV0aWxpdGllcyBvbiBHTlUgc3lzdGVtcyBhbHNvIGNvcnJlc3BvbmQgdG8gdGhpcyB2ZXJzaW9uLiAgKi8KKyNkZWZpbmUgX1BPU0lYMl9WRVJTSU9OCV9fUE9TSVgyX1RISVNfVkVSU0lPTgorCisvKiBJZiBkZWZpbmVkLCB0aGUgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgdGhlCisgICBDIExhbmd1YWdlIEJpbmRpbmdzIE9wdGlvbi4gICovCisjZGVmaW5lCV9QT1NJWDJfQ19CSU5ECV9fUE9TSVgyX1RISVNfVkVSU0lPTgorCisvKiBJZiBkZWZpbmVkLCB0aGUgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgdGhlCisgICBDIExhbmd1YWdlIERldmVsb3BtZW50IFV0aWxpdGllcyBPcHRpb24uICAqLworI2RlZmluZQlfUE9TSVgyX0NfREVWCV9fUE9TSVgyX1RISVNfVkVSU0lPTgorCisvKiBJZiBkZWZpbmVkLCB0aGUgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgdGhlCisgICBTb2Z0d2FyZSBEZXZlbG9wbWVudCBVdGlsaXRpZXMgT3B0aW9uLiAgKi8KKyNkZWZpbmUJX1BPU0lYMl9TV19ERVYJX19QT1NJWDJfVEhJU19WRVJTSU9OCisKKy8qIElmIGRlZmluZWQsIHRoZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0aGUKKyAgIGNyZWF0aW9uIG9mIGxvY2FsZXMgd2l0aCB0aGUgbG9jYWxlZGVmIHV0aWxpdHkuICAqLworI2RlZmluZSBfUE9TSVgyX0xPQ0FMRURFRiAgICAgICBfX1BPU0lYMl9USElTX1ZFUlNJT04KKworLyogWC9PcGVuIHZlcnNpb24gbnVtYmVyIHRvIHdoaWNoIHRoZSBsaWJyYXJ5IGNvbmZvcm1zLiAgSXQgaXMgc2VsZWN0YWJsZS4gICovCisjaWZkZWYgX19VU0VfWE9QRU4ySzgKKyMgZGVmaW5lIF9YT1BFTl9WRVJTSU9OCTcwMAorI2VsaWYgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisjIGRlZmluZSBfWE9QRU5fVkVSU0lPTgk2MDAKKyNlbGlmIGRlZmluZWQgX19VU0VfVU5JWDk4CisjIGRlZmluZSBfWE9QRU5fVkVSU0lPTgk1MDAKKyNlbHNlCisjIGRlZmluZSBfWE9QRU5fVkVSU0lPTgk0CisjZW5kaWYKKworLyogQ29tbWFuZHMgYW5kIHV0aWxpdGllcyBmcm9tIFhQRzQgYXJlIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9YT1BFTl9YQ1VfVkVSU0lPTgk0CisKKy8qIFdlIGFyZSBjb21wYXRpYmxlIHdpdGggdGhlIG9sZCBwdWJsaXNoZWQgc3RhbmRhcmRzIGFzIHdlbGwuICAqLworI2RlZmluZSBfWE9QRU5fWFBHMgkxCisjZGVmaW5lIF9YT1BFTl9YUEczCTEKKyNkZWZpbmUgX1hPUEVOX1hQRzQJMQorCisvKiBUaGUgWC9PcGVuIFVuaXggZXh0ZW5zaW9ucyBhcmUgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1hPUEVOX1VOSVgJMQorCisvKiBFbmNyeXB0aW9uIGlzIHByZXNlbnQuICAqLworI2RlZmluZQlfWE9QRU5fQ1JZUFQJMQorCisvKiBUaGUgZW5oYW5jZWQgaW50ZXJuYXRpb25hbGl6YXRpb24gY2FwYWJpbGl0aWVzIGFjY29yZGluZyB0byBYUEc0LjIKKyAgIGFyZSBwcmVzZW50LiAgKi8KKyNkZWZpbmUJX1hPUEVOX0VOSF9JMThOCTEKKworLyogVGhlIGxlZ2FjeSBpbnRlcmZhY2VzIGFyZSBhbHNvIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9YT1BFTl9MRUdBQ1kJMQorCisKKy8qIEdldCB2YWx1ZXMgb2YgUE9TSVggb3B0aW9uczoKKworICAgSWYgdGhlc2Ugc3ltYm9scyBhcmUgZGVmaW5lZCwgdGhlIGNvcnJlc3BvbmRpbmcgZmVhdHVyZXMgYXJlCisgICBhbHdheXMgYXZhaWxhYmxlLiAgSWYgbm90LCB0aGV5IG1heSBiZSBhdmFpbGFibGUgc29tZXRpbWVzLgorICAgVGhlIGN1cnJlbnQgdmFsdWVzIGNhbiBiZSBvYnRhaW5lZCB3aXRoIGBzeXNjb25mJy4KKworICAgX1BPU0lYX0pPQl9DT05UUk9MCQlKb2IgY29udHJvbCBpcyBzdXBwb3J0ZWQuCisgICBfUE9TSVhfU0FWRURfSURTCQlQcm9jZXNzZXMgaGF2ZSBhIHNhdmVkIHNldC11c2VyLUlECisJCQkJYW5kIGEgc2F2ZWQgc2V0LWdyb3VwLUlELgorICAgX1BPU0lYX1JFQUxUSU1FX1NJR05BTFMJUmVhbC10aW1lLCBxdWV1ZWQgc2lnbmFscyBhcmUgc3VwcG9ydGVkLgorICAgX1BPU0lYX1BSSU9SSVRZX1NDSEVEVUxJTkcJUHJpb3JpdHkgc2NoZWR1bGluZyBpcyBzdXBwb3J0ZWQuCisgICBfUE9TSVhfVElNRVJTCQlQT1NJWC40IGNsb2NrcyBhbmQgdGltZXJzIGFyZSBzdXBwb3J0ZWQuCisgICBfUE9TSVhfQVNZTkNIUk9OT1VTX0lPCUFzeW5jaHJvbm91cyBJL08gaXMgc3VwcG9ydGVkLgorICAgX1BPU0lYX1BSSU9SSVRJWkVEX0lPCVByaW9yaXRpemVkIGFzeW5jaHJvbm91cyBJL08gaXMgc3VwcG9ydGVkLgorICAgX1BPU0lYX1NZTkNIUk9OSVpFRF9JTwlTeW5jaHJvbml6aW5nIGZpbGUgZGF0YSBpcyBzdXBwb3J0ZWQuCisgICBfUE9TSVhfRlNZTkMJCQlUaGUgZnN5bmMgZnVuY3Rpb24gaXMgcHJlc2VudC4KKyAgIF9QT1NJWF9NQVBQRURfRklMRVMJCU1hcHBpbmcgb2YgZmlsZXMgdG8gbWVtb3J5IGlzIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9NRU1MT0NLCQlMb2NraW5nIG9mIGFsbCBtZW1vcnkgaXMgc3VwcG9ydGVkLgorICAgX1BPU0lYX01FTUxPQ0tfUkFOR0UJCUxvY2tpbmcgb2YgcmFuZ2VzIG9mIG1lbW9yeSBpcyBzdXBwb3J0ZWQuCisgICBfUE9TSVhfTUVNT1JZX1BST1RFQ1RJT04JU2V0dGluZyBvZiBtZW1vcnkgcHJvdGVjdGlvbnMgaXMgc3VwcG9ydGVkLgorICAgX1BPU0lYX01FU1NBR0VfUEFTU0lORwlQT1NJWC40IG1lc3NhZ2UgcXVldWVzIGFyZSBzdXBwb3J0ZWQuCisgICBfUE9TSVhfU0VNQVBIT1JFUwkJUE9TSVguNCBjb3VudGluZyBzZW1hcGhvcmVzIGFyZSBzdXBwb3J0ZWQuCisgICBfUE9TSVhfU0hBUkVEX01FTU9SWV9PQkpFQ1RTCVBPU0lYLjQgc2hhcmVkIG1lbW9yeSBvYmplY3RzIGFyZSBzdXBwb3J0ZWQuCisgICBfUE9TSVhfVEhSRUFEUwkJUE9TSVguMWMgcHRocmVhZHMgYXJlIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS0FERFIJVGhyZWFkIHN0YWNrIGFkZHJlc3MgYXR0cmlidXRlIG9wdGlvbiBzdXBwb3J0ZWQuCisgICBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFCVRocmVhZCBzdGFjayBzaXplIGF0dHJpYnV0ZSBvcHRpb24gc3VwcG9ydGVkLgorICAgX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUwlUaHJlYWQtc2FmZSBmdW5jdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORworCQkJCVBPU0lYLjFjIHRocmVhZCBleGVjdXRpb24gc2NoZWR1bGluZyBzdXBwb3J0ZWQuCisgICBfUE9TSVhfVEhSRUFEX1BSSU9fSU5IRVJJVAlUaHJlYWQgcHJpb3JpdHkgaW5oZXJpdGFuY2Ugb3B0aW9uIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9USFJFQURfUFJJT19QUk9URUNUCVRocmVhZCBwcmlvcml0eSBwcm90ZWN0aW9uIG9wdGlvbiBzdXBwb3J0ZWQuCisgICBfUE9TSVhfVEhSRUFEX1BST0NFU1NfU0hBUkVECVByb2Nlc3Mtc2hhcmVkIHN5bmNocm9uaXphdGlvbiBzdXBwb3J0ZWQuCisgICBfUE9TSVhfUElJCQkJUHJvdG9jb2wtaW5kZXBlbmRlbnQgaW50ZXJmYWNlcyBhcmUgc3VwcG9ydGVkLgorICAgX1BPU0lYX1BJSV9YVEkJCVhUSSBwcm90b2NvbC1pbmRlcC4gaW50ZXJmYWNlcyBhcmUgc3VwcG9ydGVkLgorICAgX1BPU0lYX1BJSV9TT0NLRVQJCVNvY2tldCBwcm90b2NvbC1pbmRlcC4gaW50ZXJmYWNlcyBhcmUgc3VwcG9ydGVkLgorICAgX1BPU0lYX1BJSV9JTlRFUk5FVAkJSW50ZXJuZXQgZmFtaWx5IG9mIHByb3RvY29scyBzdXBwb3J0ZWQuCisgICBfUE9TSVhfUElJX0lOVEVSTkVUX1NUUkVBTQlDb25uZWN0aW9uLW1vZGUgSW50ZXJuZXQgcHJvdG9jb2wgc3VwcG9ydGVkLgorICAgX1BPU0lYX1BJSV9JTlRFUk5FVF9ER1JBTQlDb25uZWN0aW9ubGVzcyBJbnRlcm5ldCBwcm90b2NvbCBzdXBwb3J0ZWQuCisgICBfUE9TSVhfUElJX09TSQkJSVNPL09TSSBmYW1pbHkgb2YgcHJvdG9jb2xzIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9QSUlfT1NJX0NPVFMJCUNvbm5lY3Rpb24tbW9kZSBJU08vT1NJIHNlcnZpY2Ugc3VwcG9ydGVkLgorICAgX1BPU0lYX1BJSV9PU0lfQ0xUUwkJQ29ubmVjdGlvbmxlc3MgSVNPL09TSSBzZXJ2aWNlIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9QT0xMCQkJSW1wbGVtZW50YXRpb24gc3VwcG9ydHMgYHBvbGwnIGZ1bmN0aW9uLgorICAgX1BPU0lYX1NFTEVDVAkJSW1wbGVtZW50YXRpb24gc3VwcG9ydHMgYHNlbGVjdCcgYW5kIGBwc2VsZWN0Jy4KKworICAgX1hPUEVOX1JFQUxUSU1FCQlYL09wZW4gcmVhbHRpbWUgc3VwcG9ydCBpcyBhdmFpbGFibGUuCisgICBfWE9QRU5fUkVBTFRJTUVfVEhSRUFEUwlYL09wZW4gcmVhbHRpbWUgdGhyZWFkIHN1cHBvcnQgaXMgYXZhaWxhYmxlLgorICAgX1hPUEVOX1NITQkJCVNoYXJlZCBtZW1vcnkgaW50ZXJmYWNlIGFjY29yZGluZyB0byBYUEc0LjIuCisKKyAgIF9YQlM1X0lMUDMyX09GRjMyCQlJbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBlbnZpcm9ubWVudCB3aXRoIDMyLWJpdAorCQkJCWludCwgbG9uZywgcG9pbnRlciwgYW5kIG9mZl90IHR5cGVzLgorICAgX1hCUzVfSUxQMzJfT0ZGQklHCQlJbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBlbnZpcm9ubWVudCB3aXRoIDMyLWJpdAorCQkJCWludCwgbG9uZywgYW5kIHBvaW50ZXIgYW5kIG9mZl90IHdpdGggYXQgbGVhc3QKKwkJCQk2NCBiaXRzLgorICAgX1hCUzVfTFA2NF9PRkY2NAkJSW1wbGVtZW50YXRpb24gcHJvdmlkZXMgZW52aXJvbm1lbnQgd2l0aCAzMi1iaXQKKwkJCQlpbnQsIGFuZCA2NC1iaXQgbG9uZywgcG9pbnRlciwgYW5kIG9mZl90IHR5cGVzLgorICAgX1hCUzVfTFBCSUdfT0ZGQklHCQlJbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBlbnZpcm9ubWVudCB3aXRoIGF0CisJCQkJbGVhc3QgMzIgYml0cyBpbnQgYW5kIGxvbmcsIHBvaW50ZXIsIGFuZCBvZmZfdAorCQkJCXdpdGggYXQgbGVhc3QgNjQgYml0cy4KKworICAgSWYgYW55IG9mIHRoZXNlIHN5bWJvbHMgaXMgZGVmaW5lZCBhcyAtMSwgdGhlIGNvcnJlc3BvbmRpbmcgb3B0aW9uIGlzIG5vdAorICAgdHJ1ZSBmb3IgYW55IGZpbGUuICBJZiBhbnkgaXMgZGVmaW5lZCBhcyBvdGhlciB0aGFuIC0xLCB0aGUgY29ycmVzcG9uZGluZworICAgb3B0aW9uIGlzIHRydWUgZm9yIGFsbCBmaWxlcy4gIElmIGEgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGF0IGFsbCwgdGhlIHZhbHVlCisgICBmb3IgYSBzcGVjaWZpYyBmaWxlIGNhbiBiZSBvYnRhaW5lZCBmcm9tIGBwYXRoY29uZicgYW5kIGBmcGF0aGNvbmYnLgorCisgICBfUE9TSVhfQ0hPV05fUkVTVFJJQ1RFRAlPbmx5IHRoZSBzdXBlciB1c2VyIGNhbiB1c2UgYGNob3duJyB0byBjaGFuZ2UKKwkJCQl0aGUgb3duZXIgb2YgYSBmaWxlLiAgYGNob3duJyBjYW4gb25seSBiZSB1c2VkCisJCQkJdG8gY2hhbmdlIHRoZSBncm91cCBJRCBvZiBhIGZpbGUgdG8gYSBncm91cCBvZgorCQkJCXdoaWNoIHRoZSBjYWxsaW5nIHByb2Nlc3MgaXMgYSBtZW1iZXIuCisgICBfUE9TSVhfTk9fVFJVTkMJCVBhdGhuYW1lIGNvbXBvbmVudHMgbG9uZ2VyIHRoYW4KKwkJCQlOQU1FX01BWCBnZW5lcmF0ZSBhbiBlcnJvci4KKyAgIF9QT1NJWF9WRElTQUJMRQkJSWYgZGVmaW5lZCwgaWYgdGhlIHZhbHVlIG9mIGFuIGVsZW1lbnQgb2YgdGhlCisJCQkJYGNfY2MnIG1lbWJlciBvZiBgc3RydWN0IHRlcm1pb3MnIGlzCisJCQkJX1BPU0lYX1ZESVNBQkxFLCBubyBjaGFyYWN0ZXIgd2lsbCBoYXZlIHRoZQorCQkJCWVmZmVjdCBhc3NvY2lhdGVkIHdpdGggdGhhdCBlbGVtZW50LgorICAgX1BPU0lYX1NZTkNfSU8JCVN5bmNocm9ub3VzIEkvTyBtYXkgYmUgcGVyZm9ybWVkLgorICAgX1BPU0lYX0FTWU5DX0lPCQlBc3luY2hyb25vdXMgSS9PIG1heSBiZSBwZXJmb3JtZWQuCisgICBfUE9TSVhfUFJJT19JTwkJUHJpb3JpdGl6ZWQgQXN5bmNocm9ub3VzIEkvTyBtYXkgYmUgcGVyZm9ybWVkLgorCisgICBTdXBwb3J0IGZvciB0aGUgTGFyZ2UgRmlsZSBTdXBwb3J0IGludGVyZmFjZSBpcyBub3QgZ2VuZXJhbGx5IGF2YWlsYWJsZS4KKyAgIElmIGl0IGlzIGF2YWlsYWJsZSB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyBhcmUgZGVmaW5lZCB0byBvbmUuCisgICBfTEZTNjRfTEFSR0VGSUxFCQlMb3ctbGV2ZWwgSS9PIHN1cHBvcnRzIGxhcmdlIGZpbGVzLgorICAgX0xGUzY0X1NURElPCQkJU3RhbmRhcmQgSS9PIHN1cHBvcnRzIGxhcmdlIGZpbGVzLgorICAgKi8KKworI2luY2x1ZGUgPGJpdHMvcG9zaXhfb3B0Lmg+CisKKy8qIEdldCB0aGUgZW52aXJvbm1lbnQgZGVmaW5pdGlvbnMgZnJvbSBVbml4OTguICAqLworI2lmIGRlZmluZWQgX19VU0VfVU5JWDk4IHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworIyBpbmNsdWRlIDxiaXRzL2Vudmlyb25tZW50cy5oPgorI2VuZGlmCisKKy8qIFN0YW5kYXJkIGZpbGUgZGVzY3JpcHRvcnMuICAqLworI2RlZmluZQlTVERJTl9GSUxFTk8JMAkvKiBTdGFuZGFyZCBpbnB1dC4gICovCisjZGVmaW5lCVNURE9VVF9GSUxFTk8JMQkvKiBTdGFuZGFyZCBvdXRwdXQuICAqLworI2RlZmluZQlTVERFUlJfRklMRU5PCTIJLyogU3RhbmRhcmQgZXJyb3Igb3V0cHV0LiAgKi8KKworCisvKiBBbGwgZnVuY3Rpb25zIHRoYXQgYXJlIG5vdCBkZWNsYXJlZCBhbnl3aGVyZSBlbHNlLiAgKi8KKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworI2lmbmRlZglfX3NzaXplX3RfZGVmaW5lZAordHlwZWRlZiBfX3NzaXplX3Qgc3NpemVfdDsKKyMgZGVmaW5lIF9fc3NpemVfdF9kZWZpbmVkCisjZW5kaWYKKworI2RlZmluZQlfX25lZWRfc2l6ZV90CisjZGVmaW5lIF9fbmVlZF9OVUxMCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpZiBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworLyogVGhlIFNpbmdsZSBVbml4IHNwZWNpZmljYXRpb24gc2F5cyB0aGF0IHNvbWUgbW9yZSB0eXBlcyBhcmUKKyAgIGF2YWlsYWJsZSBoZXJlLiAgKi8KKyMgaWZuZGVmIF9fZ2lkX3RfZGVmaW5lZAordHlwZWRlZiBfX2dpZF90IGdpZF90OworIyAgZGVmaW5lIF9fZ2lkX3RfZGVmaW5lZAorIyBlbmRpZgorCisjIGlmbmRlZiBfX3VpZF90X2RlZmluZWQKK3R5cGVkZWYgX191aWRfdCB1aWRfdDsKKyMgIGRlZmluZSBfX3VpZF90X2RlZmluZWQKKyMgZW5kaWYKKworIyBpZm5kZWYgX19vZmZfdF9kZWZpbmVkCisjICBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAordHlwZWRlZiBfX29mZl90IG9mZl90OworIyAgZWxzZQordHlwZWRlZiBfX29mZjY0X3Qgb2ZmX3Q7CisjICBlbmRpZgorIyAgZGVmaW5lIF9fb2ZmX3RfZGVmaW5lZAorIyBlbmRpZgorIyBpZiBkZWZpbmVkIF9fVVNFX0xBUkdFRklMRTY0ICYmICFkZWZpbmVkIF9fb2ZmNjRfdF9kZWZpbmVkCit0eXBlZGVmIF9fb2ZmNjRfdCBvZmY2NF90OworIyAgZGVmaW5lIF9fb2ZmNjRfdF9kZWZpbmVkCisjIGVuZGlmCisKKyMgaWZuZGVmIF9fdXNlY29uZHNfdF9kZWZpbmVkCit0eXBlZGVmIF9fdXNlY29uZHNfdCB1c2Vjb25kc190OworIyAgZGVmaW5lIF9fdXNlY29uZHNfdF9kZWZpbmVkCisjIGVuZGlmCisKKyMgaWZuZGVmIF9fcGlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3BpZF90IHBpZF90OworIyAgZGVmaW5lIF9fcGlkX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCS8qIFgvT3BlbiAqLworCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisjIGlmbmRlZiBfX2ludHB0cl90X2RlZmluZWQKK3R5cGVkZWYgX19pbnRwdHJfdCBpbnRwdHJfdDsKKyMgIGRlZmluZSBfX2ludHB0cl90X2RlZmluZWQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorIyBpZm5kZWYgX19zb2NrbGVuX3RfZGVmaW5lZAordHlwZWRlZiBfX3NvY2tsZW5fdCBzb2NrbGVuX3Q7CisjICBkZWZpbmUgX19zb2NrbGVuX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCisKKy8qIFZhbHVlcyBmb3IgdGhlIHNlY29uZCBhcmd1bWVudCB0byBhY2Nlc3MuCisgICBUaGVzZSBtYXkgYmUgT1InZCB0b2dldGhlci4gICovCisjZGVmaW5lCVJfT0sJNAkJLyogVGVzdCBmb3IgcmVhZCBwZXJtaXNzaW9uLiAgKi8KKyNkZWZpbmUJV19PSwkyCQkvKiBUZXN0IGZvciB3cml0ZSBwZXJtaXNzaW9uLiAgKi8KKyNkZWZpbmUJWF9PSwkxCQkvKiBUZXN0IGZvciBleGVjdXRlIHBlcm1pc3Npb24uICAqLworI2RlZmluZQlGX09LCTAJCS8qIFRlc3QgZm9yIGV4aXN0ZW5jZS4gICovCisKKy8qIFRlc3QgZm9yIGFjY2VzcyB0byBOQU1FIHVzaW5nIHRoZSByZWFsIFVJRCBhbmQgcmVhbCBHSUQuICAqLworZXh0ZXJuIGludCBhY2Nlc3MgKF9fY29uc3QgY2hhciAqX19uYW1lLCBpbnQgX190eXBlKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVGVzdCBmb3IgYWNjZXNzIHRvIE5BTUUgdXNpbmcgdGhlIGVmZmVjdGl2ZSBVSUQgYW5kIEdJRAorICAgKGFzIG5vcm1hbCBmaWxlIG9wZXJhdGlvbnMgdXNlKS4gICovCitleHRlcm4gaW50IGV1aWRhY2Nlc3MgKF9fY29uc3QgY2hhciAqX19uYW1lLCBpbnQgX190eXBlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogQW4gYWxpYXMgZm9yIGBldWlkYWNjZXNzJywgdXNlZCBieSBzb21lIG90aGVyIHN5c3RlbXMuICAqLworZXh0ZXJuIGludCBlYWNjZXNzIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgaW50IF9fdHlwZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0FURklMRQorLyogVGVzdCBmb3IgYWNjZXNzIHRvIEZJTEUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBGRCBpcyBvcGVuIG9uLgorICAgSWYgQVRfRUFDQ0VTUyBpcyBzZXQgaW4gRkxBRywgdGhlbiB1c2UgZWZmZWN0aXZlIElEcyBsaWtlIGBlYWNjZXNzJywKKyAgIG90aGVyd2lzZSB1c2UgcmVhbCBJRHMgbGlrZSBgYWNjZXNzJy4gICovCitleHRlcm4gaW50IGZhY2Nlc3NhdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19maWxlLCBpbnQgX190eXBlLCBpbnQgX19mbGFnKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKSBfX3d1cjsKKyNlbmRpZiAvKiBVc2UgR05VLiAgKi8KKworCisvKiBWYWx1ZXMgZm9yIHRoZSBXSEVOQ0UgYXJndW1lbnQgdG8gbHNlZWsuICAqLworI2lmbmRlZglfU1RESU9fSAkJLyogPHN0ZGlvLmg+IGhhcyB0aGUgc2FtZSBkZWZpbml0aW9ucy4gICovCisjIGRlZmluZSBTRUVLX1NFVAkwCS8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCisjIGRlZmluZSBTRUVLX0NVUgkxCS8qIFNlZWsgZnJvbSBjdXJyZW50IHBvc2l0aW9uLiAgKi8KKyMgZGVmaW5lIFNFRUtfRU5ECTIJLyogU2VlayBmcm9tIGVuZCBvZiBmaWxlLiAgKi8KKyMgaWZkZWYgX19VU0VfR05VCisjICBkZWZpbmUgU0VFS19EQVRBCTMJLyogU2VlayB0byBuZXh0IGRhdGEuICAqLworIyAgZGVmaW5lIFNFRUtfSE9MRQk0CS8qIFNlZWsgdG8gbmV4dCBob2xlLiAgKi8KKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgJiYgIWRlZmluZWQgTF9TRVQKKy8qIE9sZCBCU0QgbmFtZXMgZm9yIHRoZSBzYW1lIGNvbnN0YW50czsganVzdCBmb3IgY29tcGF0aWJpbGl0eS4gICovCisjIGRlZmluZSBMX1NFVAkJU0VFS19TRVQKKyMgZGVmaW5lIExfSU5DUgkJU0VFS19DVVIKKyMgZGVmaW5lIExfWFRORAkJU0VFS19FTkQKKyNlbmRpZgorCisKKy8qIE1vdmUgRkQncyBmaWxlIHBvc2l0aW9uIHRvIE9GRlNFVCBieXRlcyBmcm9tIHRoZQorICAgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIChpZiBXSEVOQ0UgaXMgU0VFS19TRVQpLAorICAgdGhlIGN1cnJlbnQgcG9zaXRpb24gKGlmIFdIRU5DRSBpcyBTRUVLX0NVUiksCisgICBvciB0aGUgZW5kIG9mIHRoZSBmaWxlIChpZiBXSEVOQ0UgaXMgU0VFS19FTkQpLgorICAgUmV0dXJuIHRoZSBuZXcgZmlsZSBwb3NpdGlvbi4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBfX29mZl90IGxzZWVrIChpbnQgX19mZCwgX19vZmZfdCBfX29mZnNldCwgaW50IF9fd2hlbmNlKSBfX1RIUk9XOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBfX29mZjY0X3QgX19SRURJUkVDVF9OVEggKGxzZWVrLAorCQkJCSAoaW50IF9fZmQsIF9fb2ZmNjRfdCBfX29mZnNldCwgaW50IF9fd2hlbmNlKSwKKwkJCQkgbHNlZWs2NCk7CisjIGVsc2UKKyMgIGRlZmluZSBsc2VlayBsc2VlazY0CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIF9fb2ZmNjRfdCBsc2VlazY0IChpbnQgX19mZCwgX19vZmY2NF90IF9fb2Zmc2V0LCBpbnQgX193aGVuY2UpCisgICAgIF9fVEhST1c7CisjZW5kaWYKKworLyogQ2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRvciBGRC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IGNsb3NlIChpbnQgX19mZCk7CisKKy8qIFJlYWQgTkJZVEVTIGludG8gQlVGIGZyb20gRkQuICBSZXR1cm4gdGhlCisgICBudW1iZXIgcmVhZCwgLTEgZm9yIGVycm9ycyBvciAwIGZvciBFT0YuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3QgcmVhZCAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMpIF9fd3VyOworCisvKiBXcml0ZSBOIGJ5dGVzIG9mIEJVRiB0byBGRC4gIFJldHVybiB0aGUgbnVtYmVyIHdyaXR0ZW4sIG9yIC0xLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHdyaXRlIChpbnQgX19mZCwgX19jb25zdCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbikgX193dXI7CisKKyNpZiBkZWZpbmVkIF9fVVNFX1VOSVg5OCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisvKiBSZWFkIE5CWVRFUyBpbnRvIEJVRiBmcm9tIEZEIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBPRkZTRVQgd2l0aG91dAorICAgY2hhbmdpbmcgdGhlIGZpbGUgcG9pbnRlci4gIFJldHVybiB0aGUgbnVtYmVyIHJlYWQsIC0xIGZvciBlcnJvcnMKKyAgIG9yIDAgZm9yIEVPRi4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCBwcmVhZCAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsCisJCSAgICAgIF9fb2ZmX3QgX19vZmZzZXQpIF9fd3VyOworCisvKiBXcml0ZSBOIGJ5dGVzIG9mIEJVRiB0byBGRCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gT0ZGU0VUIHdpdGhvdXQKKyAgIGNoYW5naW5nIHRoZSBmaWxlIHBvaW50ZXIuICBSZXR1cm4gdGhlIG51bWJlciB3cml0dGVuLCBvciAtMS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCBwd3JpdGUgKGludCBfX2ZkLCBfX2NvbnN0IHZvaWQgKl9fYnVmLCBzaXplX3QgX19uLAorCQkgICAgICAgX19vZmZfdCBfX29mZnNldCkgX193dXI7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1QgKHByZWFkLCAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsCisJCQkJICAgX19vZmY2NF90IF9fb2Zmc2V0KSwKKwkJCSAgIHByZWFkNjQpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAocHdyaXRlLCAoaW50IF9fZmQsIF9fY29uc3Qgdm9pZCAqX19idWYsCisJCQkJICAgIHNpemVfdCBfX25ieXRlcywgX19vZmY2NF90IF9fb2Zmc2V0KSwKKwkJCSAgIHB3cml0ZTY0KSBfX3d1cjsKKyMgIGVsc2UKKyMgICBkZWZpbmUgcHJlYWQgcHJlYWQ2NAorIyAgIGRlZmluZSBwd3JpdGUgcHdyaXRlNjQKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKKy8qIFJlYWQgTkJZVEVTIGludG8gQlVGIGZyb20gRkQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIE9GRlNFVCB3aXRob3V0CisgICBjaGFuZ2luZyB0aGUgZmlsZSBwb2ludGVyLiAgUmV0dXJuIHRoZSBudW1iZXIgcmVhZCwgLTEgZm9yIGVycm9ycworICAgb3IgMCBmb3IgRU9GLiAgKi8KK2V4dGVybiBzc2l6ZV90IHByZWFkNjQgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzLAorCQkJX19vZmY2NF90IF9fb2Zmc2V0KSBfX3d1cjsKKy8qIFdyaXRlIE4gYnl0ZXMgb2YgQlVGIHRvIEZEIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBPRkZTRVQgd2l0aG91dAorICAgY2hhbmdpbmcgdGhlIGZpbGUgcG9pbnRlci4gIFJldHVybiB0aGUgbnVtYmVyIHdyaXR0ZW4sIG9yIC0xLiAgKi8KK2V4dGVybiBzc2l6ZV90IHB3cml0ZTY0IChpbnQgX19mZCwgX19jb25zdCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbiwKKwkJCSBfX29mZjY0X3QgX19vZmZzZXQpIF9fd3VyOworIyBlbmRpZgorI2VuZGlmCisKKy8qIENyZWF0ZSBhIG9uZS13YXkgY29tbXVuaWNhdGlvbiBjaGFubmVsIChwaXBlKS4KKyAgIElmIHN1Y2Nlc3NmdWwsIHR3byBmaWxlIGRlc2NyaXB0b3JzIGFyZSBzdG9yZWQgaW4gUElQRURFUzsKKyAgIGJ5dGVzIHdyaXR0ZW4gb24gUElQRURFU1sxXSBjYW4gYmUgcmVhZCBmcm9tIFBJUEVERVNbMF0uCisgICBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgLTEgaWYgbm90LiAgKi8KK2V4dGVybiBpbnQgcGlwZSAoaW50IF9fcGlwZWRlc1syXSkgX19USFJPVyBfX3d1cjsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogU2FtZSBhcyBwaXBlIGJ1dCBhcHBseSBmbGFncyBwYXNzZWQgaW4gRkxBR1MgdG8gdGhlIG5ldyBmaWxlCisgICBkZXNjcmlwdG9ycy4gICovCitleHRlcm4gaW50IHBpcGUyIChpbnQgX19waXBlZGVzWzJdLCBpbnQgX19mbGFncykgX19USFJPVyBfX3d1cjsKKyNlbmRpZgorCisvKiBTY2hlZHVsZSBhbiBhbGFybS4gIEluIFNFQ09ORFMgc2Vjb25kcywgdGhlIHByb2Nlc3Mgd2lsbCBnZXQgYSBTSUdBTFJNLgorICAgSWYgU0VDT05EUyBpcyB6ZXJvLCBhbnkgY3VycmVudGx5IHNjaGVkdWxlZCBhbGFybSB3aWxsIGJlIGNhbmNlbGxlZC4KKyAgIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyByZW1haW5pbmcgdW50aWwgdGhlIGxhc3QKKyAgIGFsYXJtIHNjaGVkdWxlZCB3b3VsZCBoYXZlIHNpZ25hbGVkLCBvciB6ZXJvIGlmIHRoZXJlIHdhc24ndCBvbmUuCisgICBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWUgdG8gaW5kaWNhdGUgYW4gZXJyb3IsIGJ1dCB5b3UgY2FuIHNldCBgZXJybm8nCisgICB0byAwIGFuZCBjaGVjayBpdHMgdmFsdWUgYWZ0ZXIgY2FsbGluZyBgYWxhcm0nLCBhbmQgdGhpcyBtaWdodCB0ZWxsIHlvdS4KKyAgIFRoZSBzaWduYWwgbWF5IGNvbWUgbGF0ZSBkdWUgdG8gcHJvY2Vzc29yIHNjaGVkdWxpbmcuICAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBhbGFybSAodW5zaWduZWQgaW50IF9fc2Vjb25kcykgX19USFJPVzsKKworLyogTWFrZSB0aGUgcHJvY2VzcyBzbGVlcCBmb3IgU0VDT05EUyBzZWNvbmRzLCBvciB1bnRpbCBhIHNpZ25hbCBhcnJpdmVzCisgICBhbmQgaXMgbm90IGlnbm9yZWQuICBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgbGVzcworICAgdGhhbiBTRUNPTkRTIHdoaWNoIGl0IGFjdHVhbGx5IHNsZXB0ICh0aHVzIHplcm8gaWYgaXQgc2xlcHQgdGhlIGZ1bGwgdGltZSkuCisgICBJZiBhIHNpZ25hbCBoYW5kbGVyIGRvZXMgYSBgbG9uZ2ptcCcgb3IgbW9kaWZpZXMgdGhlIGhhbmRsaW5nIG9mIHRoZQorICAgU0lHQUxSTSBzaWduYWwgd2hpbGUgaW5zaWRlIGBzbGVlcCcgY2FsbCwgdGhlIGhhbmRsaW5nIG9mIHRoZSBTSUdBTFJNCisgICBzaWduYWwgYWZ0ZXJ3YXJkcyBpcyB1bmRlZmluZWQuICBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWUgdG8gaW5kaWNhdGUKKyAgIGVycm9yLCBidXQgaWYgYHNsZWVwJyByZXR1cm5zIFNFQ09ORFMsIGl0IHByb2JhYmx5IGRpZG4ndCB3b3JrLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgc2xlZXAgKHVuc2lnbmVkIGludCBfX3NlY29uZHMpOworCisjaWYgKGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgJiYgIWRlZmluZWQgX19VU0VfWE9QRU4ySzgpIFwKKyAgICB8fCBkZWZpbmVkIF9fVVNFX0JTRAorLyogU2V0IGFuIGFsYXJtIHRvIGdvIG9mZiAoZ2VuZXJhdGluZyBhIFNJR0FMUk0gc2lnbmFsKSBpbiBWQUxVRQorICAgbWljcm9zZWNvbmRzLiAgSWYgSU5URVJWQUwgaXMgbm9uemVybywgd2hlbiB0aGUgYWxhcm0gZ29lcyBvZmYsIHRoZQorICAgdGltZXIgaXMgcmVzZXQgdG8gZ28gb2ZmIGV2ZXJ5IElOVEVSVkFMIG1pY3Jvc2Vjb25kcyB0aGVyZWFmdGVyLgorICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyByZW1haW5pbmcgYmVmb3JlIHRoZSBhbGFybS4gICovCitleHRlcm4gX191c2Vjb25kc190IHVhbGFybSAoX191c2Vjb25kc190IF9fdmFsdWUsIF9fdXNlY29uZHNfdCBfX2ludGVydmFsKQorICAgICBfX1RIUk9XOworCisvKiBTbGVlcCBVU0VDT05EUyBtaWNyb3NlY29uZHMsIG9yIHVudGlsIGEgc2lnbmFsIGFycml2ZXMgdGhhdCBpcyBub3QgYmxvY2tlZAorICAgb3IgaWdub3JlZC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHVzbGVlcCAoX191c2Vjb25kc190IF9fdXNlY29uZHMpOworI2VuZGlmCisKKworLyogU3VzcGVuZCB0aGUgcHJvY2VzcyB1bnRpbCBhIHNpZ25hbCBhcnJpdmVzLgorICAgVGhpcyBhbHdheXMgcmV0dXJucyAtMSBhbmQgc2V0cyBgZXJybm8nIHRvIEVJTlRSLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcGF1c2UgKHZvaWQpOworCisKKy8qIENoYW5nZSB0aGUgb3duZXIgYW5kIGdyb3VwIG9mIEZJTEUuICAqLworZXh0ZXJuIGludCBjaG93biAoX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fdWlkX3QgX19vd25lciwgX19naWRfdCBfX2dyb3VwKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorLyogQ2hhbmdlIHRoZSBvd25lciBhbmQgZ3JvdXAgb2YgdGhlIGZpbGUgdGhhdCBGRCBpcyBvcGVuIG9uLiAgKi8KK2V4dGVybiBpbnQgZmNob3duIChpbnQgX19mZCwgX191aWRfdCBfX293bmVyLCBfX2dpZF90IF9fZ3JvdXApIF9fVEhST1cgX193dXI7CisKKworLyogQ2hhbmdlIG93bmVyIGFuZCBncm91cCBvZiBGSUxFLCBpZiBpdCBpcyBhIHN5bWJvbGljCisgICBsaW5rIHRoZSBvd25lcnNoaXAgb2YgdGhlIHN5bWJvbGljIGxpbmsgaXMgY2hhbmdlZC4gICovCitleHRlcm4gaW50IGxjaG93biAoX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fdWlkX3QgX19vd25lciwgX19naWRfdCBfX2dyb3VwKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKworI2VuZGlmIC8qIFVzZSBCU0QgfHwgWC9PcGVuIFVuaXguICAqLworCisjaWZkZWYgX19VU0VfQVRGSUxFCisvKiBDaGFuZ2UgdGhlIG93bmVyIGFuZCBncm91cCBvZiBGSUxFIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgRkQgaXMgb3BlbgorICAgb24uICAqLworZXh0ZXJuIGludCBmY2hvd25hdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19maWxlLCBfX3VpZF90IF9fb3duZXIsCisJCSAgICAgX19naWRfdCBfX2dyb3VwLCBpbnQgX19mbGFnKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKSBfX3d1cjsKKyNlbmRpZiAvKiBVc2UgR05VLiAgKi8KKworLyogQ2hhbmdlIHRoZSBwcm9jZXNzJ3Mgd29ya2luZyBkaXJlY3RvcnkgdG8gUEFUSC4gICovCitleHRlcm4gaW50IGNoZGlyIChfX2NvbnN0IGNoYXIgKl9fcGF0aCkgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKy8qIENoYW5nZSB0aGUgcHJvY2VzcydzIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBvbmUgRkQgaXMgb3BlbiBvbi4gICovCitleHRlcm4gaW50IGZjaGRpciAoaW50IF9fZmQpIF9fVEhST1cgX193dXI7CisjZW5kaWYKKworLyogR2V0IHRoZSBwYXRobmFtZSBvZiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwKKyAgIGFuZCBwdXQgaXQgaW4gU0laRSBieXRlcyBvZiBCVUYuICBSZXR1cm5zIE5VTEwgaWYgdGhlCisgICBkaXJlY3RvcnkgY291bGRuJ3QgYmUgZGV0ZXJtaW5lZCBvciBTSVpFIHdhcyB0b28gc21hbGwuCisgICBJZiBzdWNjZXNzZnVsLCByZXR1cm5zIEJVRi4gIEluIEdOVSwgaWYgQlVGIGlzIE5VTEwsCisgICBhbiBhcnJheSBpcyBhbGxvY2F0ZWQgd2l0aCBgbWFsbG9jJzsgdGhlIGFycmF5IGlzIFNJWkUKKyAgIGJ5dGVzIGxvbmcsIHVubGVzcyBTSVpFID09IDAsIGluIHdoaWNoIGNhc2UgaXQgaXMgYXMKKyAgIGJpZyBhcyBuZWNlc3NhcnkuICAqLworZXh0ZXJuIGNoYXIgKmdldGN3ZCAoY2hhciAqX19idWYsIHNpemVfdCBfX3NpemUpIF9fVEhST1cgX193dXI7CisKKyNpZmRlZglfX1VTRV9HTlUKKy8qIFJldHVybiBhIG1hbGxvYydkIHN0cmluZyBjb250YWluaW5nIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBuYW1lLgorICAgSWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGBQV0QnIGlzIHNldCwgYW5kIGl0cyB2YWx1ZSBpcyBjb3JyZWN0LAorICAgdGhhdCB2YWx1ZSBpcyB1c2VkLiAgKi8KK2V4dGVybiBjaGFyICpnZXRfY3VycmVudF9kaXJfbmFtZSAodm9pZCkgX19USFJPVzsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgJiYgIWRlZmluZWQgX19VU0VfWE9QRU4ySzgpIFwKKyAgICB8fCBkZWZpbmVkIF9fVVNFX0JTRAorLyogUHV0IHRoZSBhYnNvbHV0ZSBwYXRobmFtZSBvZiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpbiBCVUYuCisgICBJZiBzdWNjZXNzZnVsLCByZXR1cm4gQlVGLiAgSWYgbm90LCBwdXQgYW4gZXJyb3IgbWVzc2FnZSBpbgorICAgQlVGIGFuZCByZXR1cm4gTlVMTC4gIEJVRiBzaG91bGQgYmUgYXQgbGVhc3QgUEFUSF9NQVggYnl0ZXMgbG9uZy4gICovCitleHRlcm4gY2hhciAqZ2V0d2QgKGNoYXIgKl9fYnVmKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX2F0dHJpYnV0ZV9kZXByZWNhdGVkX18gX193dXI7CisjZW5kaWYKKworCisvKiBEdXBsaWNhdGUgRkQsIHJldHVybmluZyBhIG5ldyBmaWxlIGRlc2NyaXB0b3Igb24gdGhlIHNhbWUgZmlsZS4gICovCitleHRlcm4gaW50IGR1cCAoaW50IF9fZmQpIF9fVEhST1cgX193dXI7CisKKy8qIER1cGxpY2F0ZSBGRCB0byBGRDIsIGNsb3NpbmcgRkQyIGFuZCBtYWtpbmcgaXQgb3BlbiBvbiB0aGUgc2FtZSBmaWxlLiAgKi8KK2V4dGVybiBpbnQgZHVwMiAoaW50IF9fZmQsIGludCBfX2ZkMikgX19USFJPVzsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogRHVwbGljYXRlIEZEIHRvIEZEMiwgY2xvc2luZyBGRDIgYW5kIG1ha2luZyBpdCBvcGVuIG9uIHRoZSBzYW1lCisgICBmaWxlIHdoaWxlIHNldHRpbmcgZmxhZ3MgYWNjb3JkaW5nIHRvIEZMQUdTLiAgKi8KK2V4dGVybiBpbnQgZHVwMyAoaW50IF9fZmQsIGludCBfX2ZkMiwgaW50IF9fZmxhZ3MpIF9fVEhST1c7CisjZW5kaWYKKworLyogTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mICJOQU1FPVZBTFVFIiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICAqLworZXh0ZXJuIGNoYXIgKipfX2Vudmlyb247CisjaWZkZWYgX19VU0VfR05VCitleHRlcm4gY2hhciAqKmVudmlyb247CisjZW5kaWYKKworCisvKiBSZXBsYWNlIHRoZSBjdXJyZW50IHByb2Nlc3MsIGV4ZWN1dGluZyBQQVRIIHdpdGggYXJndW1lbnRzIEFSR1YgYW5kCisgICBlbnZpcm9ubWVudCBFTlZQLiAgQVJHViBhbmQgRU5WUCBhcmUgdGVybWluYXRlZCBieSBOVUxMIHBvaW50ZXJzLiAgKi8KK2V4dGVybiBpbnQgZXhlY3ZlIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgY2hhciAqX19jb25zdCBfX2FyZ3ZbXSwKKwkJICAgY2hhciAqX19jb25zdCBfX2VudnBbXSkgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLOAorLyogRXhlY3V0ZSB0aGUgZmlsZSBGRCByZWZlcnMgdG8sIG92ZXJsYXlpbmcgdGhlIHJ1bm5pbmcgcHJvZ3JhbSBpbWFnZS4KKyAgIEFSR1YgYW5kIEVOVlAgYXJlIHBhc3NlZCB0byB0aGUgbmV3IHByb2dyYW0sIGFzIGZvciBgZXhlY3ZlJy4gICovCitleHRlcm4gaW50IGZleGVjdmUgKGludCBfX2ZkLCBjaGFyICpfX2NvbnN0IF9fYXJndltdLCBjaGFyICpfX2NvbnN0IF9fZW52cFtdKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbmRpZgorCisKKy8qIEV4ZWN1dGUgUEFUSCB3aXRoIGFyZ3VtZW50cyBBUkdWIGFuZCBlbnZpcm9ubWVudCBmcm9tIGBlbnZpcm9uJy4gICovCitleHRlcm4gaW50IGV4ZWN2IChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgY2hhciAqX19jb25zdCBfX2FyZ3ZbXSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIEV4ZWN1dGUgUEFUSCB3aXRoIGFsbCBhcmd1bWVudHMgYWZ0ZXIgUEFUSCB1bnRpbCBhIE5VTEwgcG9pbnRlciwKKyAgIGFuZCB0aGUgYXJndW1lbnQgYWZ0ZXIgdGhhdCBmb3IgZW52aXJvbm1lbnQuICAqLworZXh0ZXJuIGludCBleGVjbGUgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX2NvbnN0IGNoYXIgKl9fYXJnLCAuLi4pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBFeGVjdXRlIFBBVEggd2l0aCBhbGwgYXJndW1lbnRzIGFmdGVyIFBBVEggdW50aWwKKyAgIGEgTlVMTCBwb2ludGVyIGFuZCBlbnZpcm9ubWVudCBmcm9tIGBlbnZpcm9uJy4gICovCitleHRlcm4gaW50IGV4ZWNsIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19jb25zdCBjaGFyICpfX2FyZywgLi4uKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogRXhlY3V0ZSBGSUxFLCBzZWFyY2hpbmcgaW4gdGhlIGBQQVRIJyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBpdCBjb250YWlucworICAgbm8gc2xhc2hlcywgd2l0aCBhcmd1bWVudHMgQVJHViBhbmQgZW52aXJvbm1lbnQgZnJvbSBgZW52aXJvbicuICAqLworZXh0ZXJuIGludCBleGVjdnAgKF9fY29uc3QgY2hhciAqX19maWxlLCBjaGFyICpfX2NvbnN0IF9fYXJndltdKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogRXhlY3V0ZSBGSUxFLCBzZWFyY2hpbmcgaW4gdGhlIGBQQVRIJyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZgorICAgaXQgY29udGFpbnMgbm8gc2xhc2hlcywgd2l0aCBhbGwgYXJndW1lbnRzIGFmdGVyIEZJTEUgdW50aWwgYQorICAgTlVMTCBwb2ludGVyIGFuZCBlbnZpcm9ubWVudCBmcm9tIGBlbnZpcm9uJy4gICovCitleHRlcm4gaW50IGV4ZWNscCAoX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fY29uc3QgY2hhciAqX19hcmcsIC4uLikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIEV4ZWN1dGUgRklMRSwgc2VhcmNoaW5nIGluIHRoZSBgUEFUSCcgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgaXQgY29udGFpbnMKKyAgIG5vIHNsYXNoZXMsIHdpdGggYXJndW1lbnRzIEFSR1YgYW5kIGVudmlyb25tZW50IGZyb20gYGVudmlyb24nLiAgKi8KK2V4dGVybiBpbnQgZXhlY3ZwZSAoX19jb25zdCBjaGFyICpfX2ZpbGUsIGNoYXIgKl9fY29uc3QgX19hcmd2W10sCisJCSAgICBjaGFyICpfX2NvbnN0IF9fZW52cFtdKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorLyogQWRkIElOQyB0byBwcmlvcml0eSBvZiB0aGUgY3VycmVudCBwcm9jZXNzLiAgKi8KK2V4dGVybiBpbnQgbmljZSAoaW50IF9faW5jKSBfX1RIUk9XIF9fd3VyOworI2VuZGlmCisKKworLyogVGVybWluYXRlIHByb2dyYW0gZXhlY3V0aW9uIHdpdGggdGhlIGxvdy1vcmRlciA4IGJpdHMgb2YgU1RBVFVTLiAgKi8KK2V4dGVybiB2b2lkIF9leGl0IChpbnQgX19zdGF0dXMpIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKworCisvKiBHZXQgdGhlIGBfUENfKicgc3ltYm9scyBmb3IgdGhlIE5BTUUgYXJndW1lbnQgdG8gYHBhdGhjb25mJyBhbmQgYGZwYXRoY29uZic7CisgICB0aGUgYF9TQ18qJyBzeW1ib2xzIGZvciB0aGUgTkFNRSBhcmd1bWVudCB0byBgc3lzY29uZic7CisgICBhbmQgdGhlIGBfQ1NfKicgc3ltYm9scyBmb3IgdGhlIE5BTUUgYXJndW1lbnQgdG8gYGNvbmZzdHInLiAgKi8KKyNpbmNsdWRlIDxiaXRzL2NvbmZuYW1lLmg+CisKKy8qIEdldCBmaWxlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgUEFUSC4gICovCitleHRlcm4gbG9uZyBpbnQgcGF0aGNvbmYgKF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19uYW1lKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogR2V0IGZpbGUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBhYm91dCBkZXNjcmlwdG9yIEZELiAgKi8KK2V4dGVybiBsb25nIGludCBmcGF0aGNvbmYgKGludCBfX2ZkLCBpbnQgX19uYW1lKSBfX1RIUk9XOworCisvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzeXN0ZW0gdmFyaWFibGUgTkFNRS4gICovCitleHRlcm4gbG9uZyBpbnQgc3lzY29uZiAoaW50IF9fbmFtZSkgX19USFJPVzsKKworI2lmZGVmCV9fVVNFX1BPU0lYMgorLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nLXZhbHVlZCBzeXN0ZW0gdmFyaWFibGUgTkFNRS4gICovCitleHRlcm4gc2l6ZV90IGNvbmZzdHIgKGludCBfX25hbWUsIGNoYXIgKl9fYnVmLCBzaXplX3QgX19sZW4pIF9fVEhST1c7CisjZW5kaWYKKworCisvKiBHZXQgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIGNhbGxpbmcgcHJvY2Vzcy4gICovCitleHRlcm4gX19waWRfdCBnZXRwaWQgKHZvaWQpIF9fVEhST1c7CisKKy8qIEdldCB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzJ3MgcGFyZW50LiAgKi8KK2V4dGVybiBfX3BpZF90IGdldHBwaWQgKHZvaWQpIF9fVEhST1c7CisKKy8qIEdldCB0aGUgcHJvY2VzcyBncm91cCBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLgorICAgVGhpcyBmdW5jdGlvbiBpcyBkaWZmZXJlbnQgb24gb2xkIEJTRC4gKi8KKyNpZm5kZWYgX19GQVZPUl9CU0QKK2V4dGVybiBfX3BpZF90IGdldHBncnAgKHZvaWQpIF9fVEhST1c7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIF9fcGlkX3QgX19SRURJUkVDVF9OVEggKGdldHBncnAsIChfX3BpZF90IF9fcGlkKSwgX19nZXRwZ2lkKTsKKyMgZWxzZQorIyAgZGVmaW5lIGdldHBncnAgX19nZXRwZ2lkCisjIGVuZGlmCisjZW5kaWYKKworLyogR2V0IHRoZSBwcm9jZXNzIGdyb3VwIElEIG9mIHByb2Nlc3MgUElELiAgKi8KK2V4dGVybiBfX3BpZF90IF9fZ2V0cGdpZCAoX19waWRfdCBfX3BpZCkgX19USFJPVzsKKyNpZiBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKK2V4dGVybiBfX3BpZF90IGdldHBnaWQgKF9fcGlkX3QgX19waWQpIF9fVEhST1c7CisjZW5kaWYKKworCisvKiBTZXQgdGhlIHByb2Nlc3MgZ3JvdXAgSUQgb2YgdGhlIHByb2Nlc3MgbWF0Y2hpbmcgUElEIHRvIFBHSUQuCisgICBJZiBQSUQgaXMgemVybywgdGhlIGN1cnJlbnQgcHJvY2VzcydzIHByb2Nlc3MgZ3JvdXAgSUQgaXMgc2V0LgorICAgSWYgUEdJRCBpcyB6ZXJvLCB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgcHJvY2VzcyBpcyB1c2VkLiAgKi8KK2V4dGVybiBpbnQgc2V0cGdpZCAoX19waWRfdCBfX3BpZCwgX19waWRfdCBfX3BnaWQpIF9fVEhST1c7CisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogQm90aCBTeXN0ZW0gViBhbmQgQlNEIGhhdmUgYHNldHBncnAnIGZ1bmN0aW9ucywgYnV0IHdpdGggZGlmZmVyZW50CisgICBjYWxsaW5nIGNvbnZlbnRpb25zLiAgVGhlIEJTRCBmdW5jdGlvbiBpcyB0aGUgc2FtZSBhcyBQT1NJWC4xIGBzZXRwZ2lkJworICAgKGFib3ZlKS4gIFRoZSBTeXN0ZW0gViBmdW5jdGlvbiB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHB1dHMgdGhlIGNhbGxpbmcKKyAgIHByb2Nlc3MgaW4gaXRzIG9uIGdyb3VwIGxpa2UgYHNldHBnaWQgKDAsIDApJy4KKworICAgTmV3IHByb2dyYW1zIHNob3VsZCBhbHdheXMgdXNlIGBzZXRwZ2lkJyBpbnN0ZWFkLgorCisgICBUaGUgZGVmYXVsdCBpbiBHTlUgaXMgdG8gcHJvdmlkZSB0aGUgU3lzdGVtIFYgZnVuY3Rpb24uICBUaGUgQlNECisgICBmdW5jdGlvbiBpcyBhdmFpbGFibGUgdW5kZXIgLURfQlNEX1NPVVJDRS4gICovCisKKyMgaWZuZGVmIF9fRkFWT1JfQlNECisKKy8qIFNldCB0aGUgcHJvY2VzcyBncm91cCBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzIHRvIGl0cyBvd24gUElELgorICAgVGhpcyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIGBzZXRwZ2lkICgwLCAwKScuICAqLworZXh0ZXJuIGludCBzZXRwZ3JwICh2b2lkKSBfX1RIUk9XOworCisjIGVsc2UKKworLyogQW5vdGhlciBuYW1lIGZvciBgc2V0cGdpZCcgKGFib3ZlKS4gICovCisjICBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoc2V0cGdycCwgKF9fcGlkX3QgX19waWQsIF9fcGlkX3QgX19wZ3JwKSwgc2V0cGdpZCk7CisjICBlbHNlCisjICAgZGVmaW5lIHNldHBncnAgc2V0cGdpZAorIyAgZW5kaWYKKworIyBlbmRpZgkvKiBGYXZvciBCU0QuICAqLworI2VuZGlmCS8qIFVzZSBTVklEIG9yIEJTRC4gICovCisKKy8qIENyZWF0ZSBhIG5ldyBzZXNzaW9uIHdpdGggdGhlIGNhbGxpbmcgcHJvY2VzcyBhcyBpdHMgbGVhZGVyLgorICAgVGhlIHByb2Nlc3MgZ3JvdXAgSURzIG9mIHRoZSBzZXNzaW9uIGFuZCB0aGUgY2FsbGluZyBwcm9jZXNzCisgICBhcmUgc2V0IHRvIHRoZSBwcm9jZXNzIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MsIHdoaWNoIGlzIHJldHVybmVkLiAgKi8KK2V4dGVybiBfX3BpZF90IHNldHNpZCAodm9pZCkgX19USFJPVzsKKworI2lmIGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorLyogUmV0dXJuIHRoZSBzZXNzaW9uIElEIG9mIHRoZSBnaXZlbiBwcm9jZXNzLiAgKi8KK2V4dGVybiBfX3BpZF90IGdldHNpZCAoX19waWRfdCBfX3BpZCkgX19USFJPVzsKKyNlbmRpZgorCisvKiBHZXQgdGhlIHJlYWwgdXNlciBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLiAgKi8KK2V4dGVybiBfX3VpZF90IGdldHVpZCAodm9pZCkgX19USFJPVzsKKworLyogR2V0IHRoZSBlZmZlY3RpdmUgdXNlciBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLiAgKi8KK2V4dGVybiBfX3VpZF90IGdldGV1aWQgKHZvaWQpIF9fVEhST1c7CisKKy8qIEdldCB0aGUgcmVhbCBncm91cCBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLiAgKi8KK2V4dGVybiBfX2dpZF90IGdldGdpZCAodm9pZCkgX19USFJPVzsKKworLyogR2V0IHRoZSBlZmZlY3RpdmUgZ3JvdXAgSUQgb2YgdGhlIGNhbGxpbmcgcHJvY2Vzcy4gICovCitleHRlcm4gX19naWRfdCBnZXRlZ2lkICh2b2lkKSBfX1RIUk9XOworCisvKiBJZiBTSVpFIGlzIHplcm8sIHJldHVybiB0aGUgbnVtYmVyIG9mIHN1cHBsZW1lbnRhcnkgZ3JvdXBzCisgICB0aGUgY2FsbGluZyBwcm9jZXNzIGlzIGluLiAgT3RoZXJ3aXNlLCBmaWxsIGluIHRoZSBncm91cCBJRHMKKyAgIG9mIGl0cyBzdXBwbGVtZW50YXJ5IGdyb3VwcyBpbiBMSVNUIGFuZCByZXR1cm4gdGhlIG51bWJlciB3cml0dGVuLiAgKi8KK2V4dGVybiBpbnQgZ2V0Z3JvdXBzIChpbnQgX19zaXplLCBfX2dpZF90IF9fbGlzdFtdKSBfX1RIUk9XIF9fd3VyOworCisjaWZkZWYJX19VU0VfR05VCisvKiBSZXR1cm4gbm9uemVybyBpZmYgdGhlIGNhbGxpbmcgcHJvY2VzcyBpcyBpbiBncm91cCBHSUQuICAqLworZXh0ZXJuIGludCBncm91cF9tZW1iZXIgKF9fZ2lkX3QgX19naWQpIF9fVEhST1c7CisjZW5kaWYKKworLyogU2V0IHRoZSB1c2VyIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MgdG8gVUlELgorICAgSWYgdGhlIGNhbGxpbmcgcHJvY2VzcyBpcyB0aGUgc3VwZXItdXNlciwgc2V0IHRoZSByZWFsCisgICBhbmQgZWZmZWN0aXZlIHVzZXIgSURzLCBhbmQgdGhlIHNhdmVkIHNldC11c2VyLUlEIHRvIFVJRDsKKyAgIGlmIG5vdCwgdGhlIGVmZmVjdGl2ZSB1c2VyIElEIGlzIHNldCB0byBVSUQuICAqLworZXh0ZXJuIGludCBzZXR1aWQgKF9fdWlkX3QgX191aWQpIF9fVEhST1c7CisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBTZXQgdGhlIHJlYWwgdXNlciBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzIHRvIFJVSUQsCisgICBhbmQgdGhlIGVmZmVjdGl2ZSB1c2VyIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MgdG8gRVVJRC4gICovCitleHRlcm4gaW50IHNldHJldWlkIChfX3VpZF90IF9fcnVpZCwgX191aWRfdCBfX2V1aWQpIF9fVEhST1c7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworLyogU2V0IHRoZSBlZmZlY3RpdmUgdXNlciBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzIHRvIFVJRC4gICovCitleHRlcm4gaW50IHNldGV1aWQgKF9fdWlkX3QgX191aWQpIF9fVEhST1c7CisjZW5kaWYgLyogVXNlIEJTRC4gICovCisKKy8qIFNldCB0aGUgZ3JvdXAgSUQgb2YgdGhlIGNhbGxpbmcgcHJvY2VzcyB0byBHSUQuCisgICBJZiB0aGUgY2FsbGluZyBwcm9jZXNzIGlzIHRoZSBzdXBlci11c2VyLCBzZXQgdGhlIHJlYWwKKyAgIGFuZCBlZmZlY3RpdmUgZ3JvdXAgSURzLCBhbmQgdGhlIHNhdmVkIHNldC1ncm91cC1JRCB0byBHSUQ7CisgICBpZiBub3QsIHRoZSBlZmZlY3RpdmUgZ3JvdXAgSUQgaXMgc2V0IHRvIEdJRC4gICovCitleHRlcm4gaW50IHNldGdpZCAoX19naWRfdCBfX2dpZCkgX19USFJPVzsKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIFNldCB0aGUgcmVhbCBncm91cCBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzIHRvIFJHSUQsCisgICBhbmQgdGhlIGVmZmVjdGl2ZSBncm91cCBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzIHRvIEVHSUQuICAqLworZXh0ZXJuIGludCBzZXRyZWdpZCAoX19naWRfdCBfX3JnaWQsIF9fZ2lkX3QgX19lZ2lkKSBfX1RIUk9XOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIFNldCB0aGUgZWZmZWN0aXZlIGdyb3VwIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MgdG8gR0lELiAgKi8KK2V4dGVybiBpbnQgc2V0ZWdpZCAoX19naWRfdCBfX2dpZCkgX19USFJPVzsKKyNlbmRpZiAvKiBVc2UgQlNELiAgKi8KKworI2lmZGVmIF9fVVNFX0dOVQorLyogRmV0Y2ggdGhlIHJlYWwgdXNlciBJRCwgZWZmZWN0aXZlIHVzZXIgSUQsIGFuZCBzYXZlZC1zZXQgdXNlciBJRCwKKyAgIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuICAqLworZXh0ZXJuIGludCBnZXRyZXN1aWQgKF9fdWlkX3QgKl9fcnVpZCwgX191aWRfdCAqX19ldWlkLCBfX3VpZF90ICpfX3N1aWQpCisgICAgIF9fVEhST1c7CisKKy8qIEZldGNoIHRoZSByZWFsIGdyb3VwIElELCBlZmZlY3RpdmUgZ3JvdXAgSUQsIGFuZCBzYXZlZC1zZXQgZ3JvdXAgSUQsCisgICBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLiAgKi8KK2V4dGVybiBpbnQgZ2V0cmVzZ2lkIChfX2dpZF90ICpfX3JnaWQsIF9fZ2lkX3QgKl9fZWdpZCwgX19naWRfdCAqX19zZ2lkKQorICAgICBfX1RIUk9XOworCisvKiBTZXQgdGhlIHJlYWwgdXNlciBJRCwgZWZmZWN0aXZlIHVzZXIgSUQsIGFuZCBzYXZlZC1zZXQgdXNlciBJRCwKKyAgIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MgdG8gUlVJRCwgRVVJRCwgYW5kIFNVSUQsIHJlc3BlY3RpdmVseS4gICovCitleHRlcm4gaW50IHNldHJlc3VpZCAoX191aWRfdCBfX3J1aWQsIF9fdWlkX3QgX19ldWlkLCBfX3VpZF90IF9fc3VpZCkKKyAgICAgX19USFJPVzsKKworLyogU2V0IHRoZSByZWFsIGdyb3VwIElELCBlZmZlY3RpdmUgZ3JvdXAgSUQsIGFuZCBzYXZlZC1zZXQgZ3JvdXAgSUQsCisgICBvZiB0aGUgY2FsbGluZyBwcm9jZXNzIHRvIFJHSUQsIEVHSUQsIGFuZCBTR0lELCByZXNwZWN0aXZlbHkuICAqLworZXh0ZXJuIGludCBzZXRyZXNnaWQgKF9fZ2lkX3QgX19yZ2lkLCBfX2dpZF90IF9fZWdpZCwgX19naWRfdCBfX3NnaWQpCisgICAgIF9fVEhST1c7CisjZW5kaWYKKworCisvKiBDbG9uZSB0aGUgY2FsbGluZyBwcm9jZXNzLCBjcmVhdGluZyBhbiBleGFjdCBjb3B5LgorICAgUmV0dXJuIC0xIGZvciBlcnJvcnMsIDAgdG8gdGhlIG5ldyBwcm9jZXNzLAorICAgYW5kIHRoZSBwcm9jZXNzIElEIG9mIHRoZSBuZXcgcHJvY2VzcyB0byB0aGUgb2xkIHByb2Nlc3MuICAqLworZXh0ZXJuIF9fcGlkX3QgZm9yayAodm9pZCkgX19USFJPV05MOworCisjaWYgKGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgJiYgIWRlZmluZWQgX19VU0VfWE9QRU4ySzgpIFwKKyAgICB8fCBkZWZpbmVkIF9fVVNFX0JTRAorLyogQ2xvbmUgdGhlIGNhbGxpbmcgcHJvY2VzcywgYnV0IHdpdGhvdXQgY29weWluZyB0aGUgd2hvbGUgYWRkcmVzcyBzcGFjZS4KKyAgIFRoZSBjYWxsaW5nIHByb2Nlc3MgaXMgc3VzcGVuZGVkIHVudGlsIHRoZSBuZXcgcHJvY2VzcyBleGl0cyBvciBpcworICAgcmVwbGFjZWQgYnkgYSBjYWxsIHRvIGBleGVjdmUnLiAgUmV0dXJuIC0xIGZvciBlcnJvcnMsIDAgdG8gdGhlIG5ldyBwcm9jZXNzLAorICAgYW5kIHRoZSBwcm9jZXNzIElEIG9mIHRoZSBuZXcgcHJvY2VzcyB0byB0aGUgb2xkIHByb2Nlc3MuICAqLworZXh0ZXJuIF9fcGlkX3QgdmZvcmsgKHZvaWQpIF9fVEhST1c7CisjZW5kaWYgLyogVXNlIEJTRCBvciBYUEcgPCA3LiAqLworCisKKy8qIFJldHVybiB0aGUgcGF0aG5hbWUgb2YgdGhlIHRlcm1pbmFsIEZEIGlzIG9wZW4gb24sIG9yIE5VTEwgb24gZXJyb3JzLgorICAgVGhlIHJldHVybmVkIHN0b3JhZ2UgaXMgZ29vZCBvbmx5IHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4gICovCitleHRlcm4gY2hhciAqdHR5bmFtZSAoaW50IF9fZmQpIF9fVEhST1c7CisKKy8qIFN0b3JlIGF0IG1vc3QgQlVGTEVOIGNoYXJhY3RlcnMgb2YgdGhlIHBhdGhuYW1lIG9mIHRoZSB0ZXJtaW5hbCBGRCBpcworICAgb3BlbiBvbiBpbiBCVUYuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyLiAgKi8KK2V4dGVybiBpbnQgdHR5bmFtZV9yIChpbnQgX19mZCwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSkgX193dXI7CisKKy8qIFJldHVybiAxIGlmIEZEIGlzIGEgdmFsaWQgZGVzY3JpcHRvciBhc3NvY2lhdGVkCisgICB3aXRoIGEgdGVybWluYWwsIHplcm8gaWYgbm90LiAgKi8KK2V4dGVybiBpbnQgaXNhdHR5IChpbnQgX19mZCkgX19USFJPVzsKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIFwKKyAgICB8fCAoZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCAmJiAhZGVmaW5lZCBfX1VTRV9VTklYOTgpCisvKiBSZXR1cm4gdGhlIGluZGV4IGludG8gdGhlIGFjdGl2ZS1sb2dpbnMgZmlsZSAodXRtcCkgZm9yCisgICB0aGUgY29udHJvbGxpbmcgdGVybWluYWwuICAqLworZXh0ZXJuIGludCB0dHlzbG90ICh2b2lkKSBfX1RIUk9XOworI2VuZGlmCisKKworLyogTWFrZSBhIGxpbmsgdG8gRlJPTSBuYW1lZCBUTy4gICovCitleHRlcm4gaW50IGxpbmsgKF9fY29uc3QgY2hhciAqX19mcm9tLCBfX2NvbnN0IGNoYXIgKl9fdG8pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpIF9fd3VyOworCisjaWZkZWYgX19VU0VfQVRGSUxFCisvKiBMaWtlIGxpbmsgYnV0IHJlbGF0aXZlIHBhdGhzIGluIFRPIGFuZCBGUk9NIGFyZSBpbnRlcnByZXRlZCByZWxhdGl2ZQorICAgdG8gRlJPTUZEIGFuZCBUT0ZEIHJlc3BlY3RpdmVseS4gICovCitleHRlcm4gaW50IGxpbmthdCAoaW50IF9fZnJvbWZkLCBfX2NvbnN0IGNoYXIgKl9fZnJvbSwgaW50IF9fdG9mZCwKKwkJICAgX19jb25zdCBjaGFyICpfX3RvLCBpbnQgX19mbGFncykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyLCA0KSkgX193dXI7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisvKiBNYWtlIGEgc3ltYm9saWMgbGluayB0byBGUk9NIG5hbWVkIFRPLiAgKi8KK2V4dGVybiBpbnQgc3ltbGluayAoX19jb25zdCBjaGFyICpfX2Zyb20sIF9fY29uc3QgY2hhciAqX190bykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSkgX193dXI7CisKKy8qIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzeW1ib2xpYyBsaW5rIFBBVEggaW50byBubyBtb3JlIHRoYW4KKyAgIExFTiBieXRlcyBvZiBCVUYuICBUaGUgY29udGVudHMgYXJlIG5vdCBudWxsLXRlcm1pbmF0ZWQuCisgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBvciAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBzc2l6ZV90IHJlYWRsaW5rIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wYXRoLAorCQkJIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2xlbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSkgX193dXI7CisjZW5kaWYgLyogVXNlIEJTRC4gICovCisKKyNpZmRlZiBfX1VTRV9BVEZJTEUKKy8qIExpa2Ugc3ltbGluayBidXQgYSByZWxhdGl2ZSBwYXRoIGluIFRPIGlzIGludGVycHJldGVkIHJlbGF0aXZlIHRvIFRPRkQuICAqLworZXh0ZXJuIGludCBzeW1saW5rYXQgKF9fY29uc3QgY2hhciAqX19mcm9tLCBpbnQgX190b2ZkLAorCQkgICAgICBfX2NvbnN0IGNoYXIgKl9fdG8pIF9fVEhST1cgX19ub25udWxsICgoMSwgMykpIF9fd3VyOworCisvKiBMaWtlIHJlYWRsaW5rIGJ1dCBhIHJlbGF0aXZlIFBBVEggaXMgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gRkQuICAqLworZXh0ZXJuIHNzaXplX3QgcmVhZGxpbmthdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsCisJCQkgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19sZW4pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMiwgMykpIF9fd3VyOworI2VuZGlmCisKKy8qIFJlbW92ZSB0aGUgbGluayBOQU1FLiAgKi8KK2V4dGVybiBpbnQgdW5saW5rIChfX2NvbnN0IGNoYXIgKl9fbmFtZSkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyNpZmRlZiBfX1VTRV9BVEZJTEUKKy8qIFJlbW92ZSB0aGUgbGluayBOQU1FIHJlbGF0aXZlIHRvIEZELiAgKi8KK2V4dGVybiBpbnQgdW5saW5rYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fbmFtZSwgaW50IF9fZmxhZykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZW5kaWYKKworLyogUmVtb3ZlIHRoZSBkaXJlY3RvcnkgUEFUSC4gICovCitleHRlcm4gaW50IHJtZGlyIChfX2NvbnN0IGNoYXIgKl9fcGF0aCkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKworLyogUmV0dXJuIHRoZSBmb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXAgSUQgb2YgRkQuICAqLworZXh0ZXJuIF9fcGlkX3QgdGNnZXRwZ3JwIChpbnQgX19mZCkgX19USFJPVzsKKworLyogU2V0IHRoZSBmb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXAgSUQgb2YgRkQgc2V0IFBHUlBfSUQuICAqLworZXh0ZXJuIGludCB0Y3NldHBncnAgKGludCBfX2ZkLCBfX3BpZF90IF9fcGdycF9pZCkgX19USFJPVzsKKworCisvKiBSZXR1cm4gdGhlIGxvZ2luIG5hbWUgb2YgdGhlIHVzZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGNoYXIgKmdldGxvZ2luICh2b2lkKTsKKyNpZiBkZWZpbmVkIF9fVVNFX1JFRU5UUkFOVCB8fCBkZWZpbmVkIF9fVVNFX1BPU0lYMTk5NTA2CisvKiBSZXR1cm4gYXQgbW9zdCBOQU1FX0xFTiBjaGFyYWN0ZXJzIG9mIHRoZSBsb2dpbiBuYW1lIG9mIHRoZSB1c2VyIGluIE5BTUUuCisgICBJZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBvciBzb21lIG90aGVyIGVycm9yIG9jY3VycmVkLCByZXR1cm4gdGhlIGVycm9yCisgICBjb2RlLiAgT3RoZXJ3aXNlIHJldHVybiAwLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0bG9naW5fciAoY2hhciAqX19uYW1lLCBzaXplX3QgX19uYW1lX2xlbikgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKyNpZmRlZglfX1VTRV9CU0QKKy8qIFNldCB0aGUgbG9naW4gbmFtZSByZXR1cm5lZCBieSBgZ2V0bG9naW4nLiAgKi8KK2V4dGVybiBpbnQgc2V0bG9naW4gKF9fY29uc3QgY2hhciAqX19uYW1lKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisKKyNpZmRlZglfX1VTRV9QT1NJWDIKKy8qIEdldCBkZWZpbml0aW9ucyBhbmQgcHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zIHRvIHByb2Nlc3MgdGhlCisgICBhcmd1bWVudHMgaW4gQVJHViAoQVJHQyBvZiB0aGVtLCBtaW51cyB0aGUgcHJvZ3JhbSBuYW1lKSBmb3IKKyAgIG9wdGlvbnMgZ2l2ZW4gaW4gT1BUUy4gICovCisjIGRlZmluZSBfX25lZWRfZ2V0b3B0CisjIGluY2x1ZGUgPGdldG9wdC5oPgorI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfVU5JWDk4IHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworLyogUHV0IHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGhvc3QgaW4gbm8gbW9yZSB0aGFuIExFTiBieXRlcyBvZiBOQU1FLgorICAgVGhlIHJlc3VsdCBpcyBudWxsLXRlcm1pbmF0ZWQgaWYgTEVOIGlzIGxhcmdlIGVub3VnaCBmb3IgdGhlIGZ1bGwKKyAgIG5hbWUgYW5kIHRoZSB0ZXJtaW5hdG9yLiAgKi8KK2V4dGVybiBpbnQgZ2V0aG9zdG5hbWUgKGNoYXIgKl9fbmFtZSwgc2l6ZV90IF9fbGVuKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCAoZGVmaW5lZCBfX1VTRV9YT1BFTiAmJiAhZGVmaW5lZCBfX1VTRV9VTklYOTgpCisvKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgaG9zdCB0byBOQU1FLCB3aGljaCBpcyBMRU4gYnl0ZXMgbG9uZy4KKyAgIFRoaXMgY2FsbCBpcyByZXN0cmljdGVkIHRvIHRoZSBzdXBlci11c2VyLiAgKi8KK2V4dGVybiBpbnQgc2V0aG9zdG5hbWUgKF9fY29uc3QgY2hhciAqX19uYW1lLCBzaXplX3QgX19sZW4pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworCisvKiBTZXQgdGhlIGN1cnJlbnQgbWFjaGluZSdzIEludGVybmV0IG51bWJlciB0byBJRC4KKyAgIFRoaXMgY2FsbCBpcyByZXN0cmljdGVkIHRvIHRoZSBzdXBlci11c2VyLiAgKi8KK2V4dGVybiBpbnQgc2V0aG9zdGlkIChsb25nIGludCBfX2lkKSBfX1RIUk9XIF9fd3VyOworCisKKy8qIEdldCBhbmQgc2V0IHRoZSBOSVMgKGFrYSBZUCkgZG9tYWluIG5hbWUsIGlmIGFueS4KKyAgIENhbGxlZCBqdXN0IGxpa2UgYGdldGhvc3RuYW1lJyBhbmQgYHNldGhvc3RuYW1lJy4KKyAgIFRoZSBOSVMgZG9tYWluIG5hbWUgaXMgdXN1YWxseSB0aGUgZW1wdHkgc3RyaW5nIHdoZW4gbm90IHVzaW5nIE5JUy4gICovCitleHRlcm4gaW50IGdldGRvbWFpbm5hbWUgKGNoYXIgKl9fbmFtZSwgc2l6ZV90IF9fbGVuKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKK2V4dGVybiBpbnQgc2V0ZG9tYWlubmFtZSAoX19jb25zdCBjaGFyICpfX25hbWUsIHNpemVfdCBfX2xlbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisKKworLyogUmV2b2tlIGFjY2VzcyBwZXJtaXNzaW9ucyB0byBhbGwgcHJvY2Vzc2VzIGN1cnJlbnRseSBjb21tdW5pY2F0aW5nCisgICB3aXRoIHRoZSBjb250cm9sIHRlcm1pbmFsLCBhbmQgdGhlbiBzZW5kIGEgU0lHSFVQIHNpZ25hbCB0byB0aGUgcHJvY2VzcworICAgZ3JvdXAgb2YgdGhlIGNvbnRyb2wgdGVybWluYWwuICAqLworZXh0ZXJuIGludCB2aGFuZ3VwICh2b2lkKSBfX1RIUk9XOworCisvKiBSZXZva2UgdGhlIGFjY2VzcyBvZiBhbGwgZGVzY3JpcHRvcnMgY3VycmVudGx5IG9wZW4gb24gRklMRS4gICovCitleHRlcm4gaW50IHJldm9rZSAoX19jb25zdCBjaGFyICpfX2ZpbGUpIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworCisKKy8qIEVuYWJsZSBzdGF0aXN0aWNhbCBwcm9maWxpbmcsIHdyaXRpbmcgc2FtcGxlcyBvZiB0aGUgUEMgaW50byBhdCBtb3N0CisgICBTSVpFIGJ5dGVzIG9mIFNBTVBMRV9CVUZGRVI7IGV2ZXJ5IHByb2Nlc3NvciBjbG9jayB0aWNrIHdoaWxlIHByb2ZpbGluZworICAgaXMgZW5hYmxlZCwgdGhlIHN5c3RlbSBleGFtaW5lcyB0aGUgdXNlciBQQyBhbmQgaW5jcmVtZW50cworICAgU0FNUExFX0JVRkZFUlsoKFBDIC0gT0ZGU0VUKSAvIDIpICogU0NBTEUgLyA2NTUzNl0uICBJZiBTQ0FMRSBpcyB6ZXJvLAorICAgZGlzYWJsZSBwcm9maWxpbmcuICBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgLTEgb24gZXJyb3IuICAqLworZXh0ZXJuIGludCBwcm9maWwgKHVuc2lnbmVkIHNob3J0IGludCAqX19zYW1wbGVfYnVmZmVyLCBzaXplX3QgX19zaXplLAorCQkgICBzaXplX3QgX19vZmZzZXQsIHVuc2lnbmVkIGludCBfX3NjYWxlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworCisvKiBUdXJuIGFjY291bnRpbmcgb24gaWYgTkFNRSBpcyBhbiBleGlzdGluZyBmaWxlLiAgVGhlIHN5c3RlbSB3aWxsIHRoZW4gd3JpdGUKKyAgIGEgcmVjb3JkIGZvciBlYWNoIHByb2Nlc3MgYXMgaXQgdGVybWluYXRlcywgdG8gdGhpcyBmaWxlLiAgSWYgTkFNRSBpcyBOVUxMLAorICAgdHVybiBhY2NvdW50aW5nIG9mZi4gIFRoaXMgY2FsbCBpcyByZXN0cmljdGVkIHRvIHRoZSBzdXBlci11c2VyLiAgKi8KK2V4dGVybiBpbnQgYWNjdCAoX19jb25zdCBjaGFyICpfX25hbWUpIF9fVEhST1c7CisKKworLyogU3VjY2Vzc2l2ZSBjYWxscyByZXR1cm4gdGhlIHNoZWxscyBsaXN0ZWQgaW4gYC9ldGMvc2hlbGxzJy4gICovCitleHRlcm4gY2hhciAqZ2V0dXNlcnNoZWxsICh2b2lkKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgZW5kdXNlcnNoZWxsICh2b2lkKSBfX1RIUk9XOyAvKiBEaXNjYXJkIGNhY2hlZCBpbmZvLiAgKi8KK2V4dGVybiB2b2lkIHNldHVzZXJzaGVsbCAodm9pZCkgX19USFJPVzsgLyogUmV3aW5kIGFuZCByZS1yZWFkIHRoZSBmaWxlLiAgKi8KKworCisvKiBQdXQgdGhlIHByb2dyYW0gaW4gdGhlIGJhY2tncm91bmQsIGFuZCBkaXNzb2NpYXRlIGZyb20gdGhlIGNvbnRyb2xsaW5nCisgICB0ZXJtaW5hbC4gIElmIE5PQ0hESVIgaXMgemVybywgZG8gYGNoZGlyICgiLyIpJy4gIElmIE5PQ0xPU0UgaXMgemVybywKKyAgIHJlZGlyZWN0cyBzdGRpbiwgc3Rkb3V0LCBhbmQgc3RkZXJyIHRvIC9kZXYvbnVsbC4gICovCitleHRlcm4gaW50IGRhZW1vbiAoaW50IF9fbm9jaGRpciwgaW50IF9fbm9jbG9zZSkgX19USFJPVyBfX3d1cjsKKyNlbmRpZiAvKiBVc2UgQlNEIHx8IFgvT3Blbi4gICovCisKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IChkZWZpbmVkIF9fVVNFX1hPUEVOICYmICFkZWZpbmVkIF9fVVNFX1hPUEVOMkspCisvKiBNYWtlIFBBVEggYmUgdGhlIHJvb3QgZGlyZWN0b3J5ICh0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGFic29sdXRlIHBhdGhzKS4KKyAgIFRoaXMgY2FsbCBpcyByZXN0cmljdGVkIHRvIHRoZSBzdXBlci11c2VyLiAgKi8KK2V4dGVybiBpbnQgY2hyb290IChfX2NvbnN0IGNoYXIgKl9fcGF0aCkgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisKKy8qIFByb21wdCB3aXRoIFBST01QVCBhbmQgcmVhZCBhIHN0cmluZyBmcm9tIHRoZSB0ZXJtaW5hbCB3aXRob3V0IGVjaG9pbmcuCisgICBVc2VzIC9kZXYvdHR5IGlmIHBvc3NpYmxlOyBvdGhlcndpc2Ugc3RkZXJyIGFuZCBzdGRpbi4gICovCitleHRlcm4gY2hhciAqZ2V0cGFzcyAoX19jb25zdCBjaGFyICpfX3Byb21wdCkgX19ub25udWxsICgoMSkpOworI2VuZGlmIC8qIFVzZSBCU0QgfHwgWC9PcGVuLiAgKi8KKworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIE1ha2UgYWxsIGNoYW5nZXMgZG9uZSB0byBGRCBhY3R1YWxseSBhcHBlYXIgb24gZGlzay4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IGZzeW5jIChpbnQgX19mZCk7CisjZW5kaWYgLyogVXNlIEJTRCB8fCBYL09wZW4gfHwgVW5peDk4LiAgKi8KKworCisjaWZkZWYgX19VU0VfR05VCisvKiBNYWtlIGFsbCBjaGFuZ2VzIGRvbmUgdG8gYWxsIGZpbGVzIG9uIHRoZSBmaWxlIHN5c3RlbSBhc3NvY2lhdGVkCisgICB3aXRoIEZEIGFjdHVhbGx5IGFwcGVhciBvbiBkaXNrLiAgKi8KK2V4dGVybiBpbnQgc3luY2ZzIChpbnQgX19mZCkgX19USFJPVzsKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisKKy8qIFJldHVybiBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCBob3N0LiAgKi8KK2V4dGVybiBsb25nIGludCBnZXRob3N0aWQgKHZvaWQpOworCisvKiBNYWtlIGFsbCBjaGFuZ2VzIGRvbmUgdG8gYWxsIGZpbGVzIGFjdHVhbGx5IGFwcGVhciBvbiBkaXNrLiAgKi8KK2V4dGVybiB2b2lkIHN5bmMgKHZvaWQpIF9fVEhST1c7CisKKworIyBpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBpbiBhIHBhZ2UuICBUaGlzIGlzIHRoZSBzeXN0ZW0ncyBwYWdlIHNpemUsCisgICB3aGljaCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIGhhcmR3YXJlIHBhZ2Ugc2l6ZS4gICovCitleHRlcm4gaW50IGdldHBhZ2VzaXplICh2b2lkKSAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKworLyogUmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzCisgICB0aGUgY3VycmVudCBwcm9jZXNzIGNvdWxkIHBvc3NpYmx5IGhhdmUuICAqLworZXh0ZXJuIGludCBnZXRkdGFibGVzaXplICh2b2lkKSBfX1RIUk9XOworIyBlbmRpZgorCisjZW5kaWYgLyogVXNlIEJTRCB8fCBYL09wZW4gVW5peC4gICovCisKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorCisvKiBUcnVuY2F0ZSBGSUxFIHRvIExFTkdUSCBieXRlcy4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IHRydW5jYXRlIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX19vZmZfdCBfX2xlbmd0aCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIICh0cnVuY2F0ZSwKKwkJCSAgIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX19vZmY2NF90IF9fbGVuZ3RoKSwKKwkJCSAgIHRydW5jYXRlNjQpIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKyMgIGVsc2UKKyMgICBkZWZpbmUgdHJ1bmNhdGUgdHJ1bmNhdGU2NAorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgdHJ1bmNhdGU2NCAoX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fb2ZmNjRfdCBfX2xlbmd0aCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisjIGVuZGlmCisKKyNlbmRpZiAvKiBVc2UgQlNEIHx8IFgvT3BlbiBVbml4IHx8IFBPU0lYIDIwMDguICAqLworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKworLyogVHJ1bmNhdGUgdGhlIGZpbGUgRkQgaXMgb3BlbiBvbiB0byBMRU5HVEggYnl0ZXMuICAqLworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBmdHJ1bmNhdGUgKGludCBfX2ZkLCBfX29mZl90IF9fbGVuZ3RoKSBfX1RIUk9XIF9fd3VyOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoZnRydW5jYXRlLCAoaW50IF9fZmQsIF9fb2ZmNjRfdCBfX2xlbmd0aCksCisJCQkgICBmdHJ1bmNhdGU2NCkgX193dXI7CisjICBlbHNlCisjICAgZGVmaW5lIGZ0cnVuY2F0ZSBmdHJ1bmNhdGU2NAorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgZnRydW5jYXRlNjQgKGludCBfX2ZkLCBfX29mZjY0X3QgX19sZW5ndGgpIF9fVEhST1cgX193dXI7CisjIGVuZGlmCisKKyNlbmRpZiAvKiBVc2UgQlNEIHx8IFgvT3BlbiBVbml4IHx8IFBPU0lYIDIwMDMuICAqLworCisKKyNpZiAoZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCAmJiAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLKSBcCisgICAgfHwgZGVmaW5lZCBfX1VTRV9NSVNDCisKKy8qIFNldCB0aGUgZW5kIG9mIGFjY2Vzc2libGUgZGF0YSBzcGFjZSAoYWthICJ0aGUgYnJlYWsiKSB0byBBRERSLgorICAgUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MgYW5kIC0xIGZvciBlcnJvcnMgKHdpdGggZXJybm8gc2V0KS4gICovCitleHRlcm4gaW50IGJyayAodm9pZCAqX19hZGRyKSBfX1RIUk9XIF9fd3VyOworCisvKiBJbmNyZWFzZSBvciBkZWNyZWFzZSB0aGUgZW5kIG9mIGFjY2Vzc2libGUgZGF0YSBzcGFjZSBieSBERUxUQSBieXRlcy4KKyAgIElmIHN1Y2Nlc3NmdWwsIHJldHVybnMgdGhlIGFkZHJlc3MgdGhlIHByZXZpb3VzIGVuZCBvZiBkYXRhIHNwYWNlCisgICAoaS5lLiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXcgc3BhY2UsIGlmIERFTFRBID4gMCk7CisgICByZXR1cm5zICh2b2lkICopIC0xIGZvciBlcnJvcnMgKHdpdGggZXJybm8gc2V0KS4gICovCitleHRlcm4gdm9pZCAqc2JyayAoaW50cHRyX3QgX19kZWx0YSkgX19USFJPVzsKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBJbnZva2UgYHN5c3RlbSBjYWxsJyBudW1iZXIgU1lTTk8sIHBhc3NpbmcgaXQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMuCisgICBUaGlzIGlzIGNvbXBsZXRlbHkgc3lzdGVtLWRlcGVuZGVudCwgYW5kIG5vdCBvZnRlbiB1c2VmdWwuCisKKyAgIEluIFVuaXgsIGBzeXNjYWxsJyBzZXRzIGBlcnJubycgZm9yIGFsbCBlcnJvcnMgYW5kIG1vc3QgY2FsbHMgcmV0dXJuIC0xCisgICBmb3IgZXJyb3JzOyBpbiBtYW55IHN5c3RlbXMgeW91IGNhbm5vdCBwYXNzIGFyZ3VtZW50cyBvciBnZXQgcmV0dXJuCisgICB2YWx1ZXMgZm9yIGFsbCBzeXN0ZW0gY2FsbHMgKGBwaXBlJywgYGZvcmsnLCBhbmQgYGdldHBwaWQnIHR5cGljYWxseQorICAgYW1vbmcgdGhlbSkuCisKKyAgIEluIE1hY2gsIGFsbCBzeXN0ZW0gY2FsbHMgdGFrZSBub3JtYWwgYXJndW1lbnRzIGFuZCBhbHdheXMgcmV0dXJuIGFuCisgICBlcnJvciBjb2RlICh6ZXJvIGZvciBzdWNjZXNzKS4gICovCitleHRlcm4gbG9uZyBpbnQgc3lzY2FsbCAobG9uZyBpbnQgX19zeXNubywgLi4uKSBfX1RIUk9XOworCisjZW5kaWYJLyogVXNlIG1pc2MuICAqLworCisKKyNpZiAoZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQpICYmICFkZWZpbmVkIEZfTE9DSworLyogTk9URTogVGhlc2UgZGVjbGFyYXRpb25zIGFsc28gYXBwZWFyIGluIDxmY250bC5oPjsgYmUgc3VyZSB0byBrZWVwIGJvdGgKKyAgIGZpbGVzIGNvbnNpc3RlbnQuICBTb21lIHN5c3RlbXMgaGF2ZSB0aGVtIHRoZXJlIGFuZCBzb21lIGhlcmUsIGFuZCBzb21lCisgICBzb2Z0d2FyZSBkZXBlbmRzIG9uIHRoZSBtYWNyb3MgYmVpbmcgZGVmaW5lZCB3aXRob3V0IGluY2x1ZGluZyBib3RoLiAgKi8KKworLyogYGxvY2tmJyBpcyBhIHNpbXBsZXIgaW50ZXJmYWNlIHRvIHRoZSBsb2NraW5nIGZhY2lsaXRpZXMgb2YgYGZjbnRsJy4KKyAgIExFTiBpcyBhbHdheXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbi4KKyAgIFRoZSBDTUQgYXJndW1lbnQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworCisjIGRlZmluZSBGX1VMT0NLIDAJLyogVW5sb2NrIGEgcHJldmlvdXNseSBsb2NrZWQgcmVnaW9uLiAgKi8KKyMgZGVmaW5lIEZfTE9DSyAgMQkvKiBMb2NrIGEgcmVnaW9uIGZvciBleGNsdXNpdmUgdXNlLiAgKi8KKyMgZGVmaW5lIEZfVExPQ0sgMgkvKiBUZXN0IGFuZCBsb2NrIGEgcmVnaW9uIGZvciBleGNsdXNpdmUgdXNlLiAgKi8KKyMgZGVmaW5lIEZfVEVTVCAgMwkvKiBUZXN0IGEgcmVnaW9uIGZvciBvdGhlciBwcm9jZXNzZXMgbG9ja3MuICAqLworCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IGxvY2tmIChpbnQgX19mZCwgaW50IF9fY21kLCBfX29mZl90IF9fbGVuKSBfX3d1cjsKKyMgZWxzZQorIyAgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIGludCBfX1JFRElSRUNUIChsb2NrZiwgKGludCBfX2ZkLCBpbnQgX19jbWQsIF9fb2ZmNjRfdCBfX2xlbiksCisJCSAgICAgICBsb2NrZjY0KSBfX3d1cjsKKyMgIGVsc2UKKyMgICBkZWZpbmUgbG9ja2YgbG9ja2Y2NAorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgbG9ja2Y2NCAoaW50IF9fZmQsIGludCBfX2NtZCwgX19vZmY2NF90IF9fbGVuKSBfX3d1cjsKKyMgZW5kaWYKKyNlbmRpZiAvKiBVc2UgbWlzYyBhbmQgRl9MT0NLIG5vdCBhbHJlYWR5IGRlZmluZWQuICAqLworCisKKyNpZmRlZiBfX1VTRV9HTlUKKworLyogRXZhbHVhdGUgRVhQUkVTU0lPTiwgYW5kIHJlcGVhdCBhcyBsb25nIGFzIGl0IHJldHVybnMgLTEgd2l0aCBgZXJybm8nCisgICBzZXQgdG8gRUlOVFIuICAqLworCisjIGRlZmluZSBURU1QX0ZBSUxVUkVfUkVUUlkoZXhwcmVzc2lvbikgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAgKHsgbG9uZyBpbnQgX19yZXN1bHQ7CQkJCQkJICAgICAgXAorICAgICAgIGRvIF9fcmVzdWx0ID0gKGxvbmcgaW50KSAoZXhwcmVzc2lvbik7CQkJCSAgICAgIFwKKyAgICAgICB3aGlsZSAoX19yZXN1bHQgPT0gLTFMICYmIGVycm5vID09IEVJTlRSKTsJCQkgICAgICBcCisgICAgICAgX19yZXN1bHQ7IH0pKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX1BPU0lYMTk5MzA5IHx8IGRlZmluZWQgX19VU0VfVU5JWDk4CisvKiBTeW5jaHJvbml6ZSBhdCBsZWFzdCB0aGUgZGF0YSBwYXJ0IG9mIGEgZmlsZSB3aXRoIHRoZSB1bmRlcmx5aW5nCisgICBtZWRpYS4gICovCitleHRlcm4gaW50IGZkYXRhc3luYyAoaW50IF9fZmlsZGVzKTsKKyNlbmRpZiAvKiBVc2UgUE9TSVgxOTkzMDkgKi8KKworCisvKiBYUEc0LjIgc3BlY2lmaWVzIHRoYXQgcHJvdG90eXBlcyBmb3IgdGhlIGVuY3J5cHRpb24gZnVuY3Rpb25zIG11c3QKKyAgIGJlIGRlZmluZWQgaGVyZS4gICovCisjaWZkZWYJX19VU0VfWE9QRU4KKy8qIEVuY3J5cHQgYXQgbW9zdCA4IGNoYXJhY3RlcnMgZnJvbSBLRVkgdXNpbmcgc2FsdCB0byBwZXJ0dXJiIERFUy4gICovCitleHRlcm4gY2hhciAqY3J5cHQgKF9fY29uc3QgY2hhciAqX19rZXksIF9fY29uc3QgY2hhciAqX19zYWx0KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogRW5jcnlwdCBkYXRhIGluIEJMT0NLIGluIHBsYWNlIGlmIEVERkxBRyBpcyB6ZXJvOyBvdGhlcndpc2UgZGVjcnlwdAorICAgYmxvY2sgaW4gcGxhY2UuICAqLworZXh0ZXJuIHZvaWQgZW5jcnlwdCAoY2hhciAqX19saWJjX2Jsb2NrLCBpbnQgX19lZGZsYWcpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisKKy8qIFN3YWIgcGFpcnMgYnl0ZXMgaW4gdGhlIGZpcnN0IE4gYnl0ZXMgb2YgdGhlIGFyZWEgcG9pbnRlZCB0byBieQorICAgRlJPTSBhbmQgY29weSB0aGUgcmVzdWx0IHRvIFRPLiAgVGhlIHZhbHVlIG9mIFRPIG11c3Qgbm90IGJlIGluIHRoZQorICAgcmFuZ2UgW0ZST00gLSBOICsgMSwgRlJPTSAtIDFdLiAgSWYgTiBpcyBvZGQgdGhlIGZpcnN0IGJ5dGUgaW4gRlJPTQorICAgaXMgd2l0aG91dCBwYXJ0bmVyLiAgKi8KK2V4dGVybiB2b2lkIHN3YWIgKF9fY29uc3Qgdm9pZCAqX19yZXN0cmljdCBfX2Zyb20sIHZvaWQgKl9fcmVzdHJpY3QgX190bywKKwkJICBzc2l6ZV90IF9fbikgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjZW5kaWYKKworCisvKiBUaGUgU2luZ2xlIFVuaXggc3BlY2lmaWNhdGlvbiBkZW1hbmRzIHRoaXMgcHJvdG90eXBlIHRvIGJlIGhlcmUuCisgICBJdCBpcyBhbHNvIGZvdW5kIGluIDxzdGRpby5oPi4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisvKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsLiAgKi8KK2V4dGVybiBjaGFyICpjdGVybWlkIChjaGFyICpfX3MpIF9fVEhST1c7CisjZW5kaWYKKworCisvKiBEZWZpbmUgc29tZSBtYWNyb3MgaGVscGluZyB0byBjYXRjaCBidWZmZXIgb3ZlcmZsb3dzLiAgKi8KKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUKKyMgaW5jbHVkZSA8Yml0cy91bmlzdGQuaD4KKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogdW5pc3RkLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3VzdGF0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3VzdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhMTUwZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdXN0YXQuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8c3lzL3VzdGF0Lmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3V0aW1lLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3V0aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ1ZDI2NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdXRpbWUuaApAQCAtMCwwICsxLDUyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5NiwgOTcsIDk4LCA5OSwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCVBPU0lYIFN0YW5kYXJkOiA1LjYuNiBTZXQgRmlsZSBBY2Nlc3MgYW5kIE1vZGlmaWNhdGlvbiBUaW1lcyAgPHV0aW1lLmg+CisgKi8KKworI2lmbmRlZglfVVRJTUVfSAorI2RlZmluZQlfVVRJTUVfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKyNpZiBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworIyBkZWZpbmUgX19uZWVkX3RpbWVfdAorIyBpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYKKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgZmlsZSB0aW1lcy4gICovCitzdHJ1Y3QgdXRpbWJ1ZgorICB7CisgICAgX190aW1lX3QgYWN0aW1lOwkJLyogQWNjZXNzIHRpbWUuICAqLworICAgIF9fdGltZV90IG1vZHRpbWU7CQkvKiBNb2RpZmljYXRpb24gdGltZS4gICovCisgIH07CisKKy8qIFNldCB0aGUgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gdGltZXMgb2YgRklMRSB0byB0aG9zZSBnaXZlbiBpbgorICAgKkZJTEVfVElNRVMuICBJZiBGSUxFX1RJTUVTIGlzIE5VTEwsIHNldCB0aGVtIHRvIHRoZSBjdXJyZW50IHRpbWUuICAqLworZXh0ZXJuIGludCB1dGltZSAoX19jb25zdCBjaGFyICpfX2ZpbGUsCisJCSAgX19jb25zdCBzdHJ1Y3QgdXRpbWJ1ZiAqX19maWxlX3RpbWVzKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHV0aW1lLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdXRtcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS91dG1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiMTA4OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdXRtcC5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MywgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfVVRNUF9ICisjZGVmaW5lCV9VVE1QX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogR2V0IHN5c3RlbSBkZXBlbmRlbnQgdmFsdWVzIGFuZCBkYXRhIHN0cnVjdHVyZXMuICAqLworI2luY2x1ZGUgPGJpdHMvdXRtcC5oPgorCisvKiBDb21wYXRpYmlsaXR5IG5hbWVzIGZvciB0aGUgc3RyaW5ncyBvZiB0aGUgY2Fub25pY2FsIGZpbGUgbmFtZXMuICAqLworI2RlZmluZSBVVE1QX0ZJTEUJX1BBVEhfVVRNUAorI2RlZmluZSBVVE1QX0ZJTEVOQU1FCV9QQVRIX1VUTVAKKyNkZWZpbmUgV1RNUF9GSUxFCV9QQVRIX1dUTVAKKyNkZWZpbmUgV1RNUF9GSUxFTkFNRQlfUEFUSF9XVE1QCisKKworCisvKiBNYWtlIEZEIGJlIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbCwgc3RkaW4sIHN0ZG91dCwgYW5kIHN0ZGVycjsKKyAgIHRoZW4gY2xvc2UgRkQuICBSZXR1cm5zIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBlcnJvci4gICovCitleHRlcm4gaW50IGxvZ2luX3R0eSAoaW50IF9fZmQpIF9fVEhST1c7CisKKworLyogV3JpdGUgdGhlIGdpdmVuIGVudHJ5IGludG8gdXRtcCBhbmQgd3RtcC4gICovCitleHRlcm4gdm9pZCBsb2dpbiAoX19jb25zdCBzdHJ1Y3QgdXRtcCAqX19lbnRyeSkgX19USFJPVzsKKworLyogV3JpdGUgdGhlIHV0bXAgZW50cnkgdG8gc2F5IHRoZSB1c2VyIG9uIFVUX0xJTkUgaGFzIGxvZ2dlZCBvdXQuICAqLworZXh0ZXJuIGludCBsb2dvdXQgKF9fY29uc3QgY2hhciAqX191dF9saW5lKSBfX1RIUk9XOworCisvKiBBcHBlbmQgdG8gd3RtcCBhbiBlbnRyeSBmb3IgdGhlIGN1cnJlbnQgdGltZSBhbmQgdGhlIGdpdmVuIGluZm8uICAqLworZXh0ZXJuIHZvaWQgbG9nd3RtcCAoX19jb25zdCBjaGFyICpfX3V0X2xpbmUsIF9fY29uc3QgY2hhciAqX191dF9uYW1lLAorCQkgICAgIF9fY29uc3QgY2hhciAqX191dF9ob3N0KSBfX1RIUk9XOworCisvKiBBcHBlbmQgZW50cnkgVVRNUCB0byB0aGUgd3RtcC1saWtlIGZpbGUgV1RNUF9GSUxFLiAgKi8KK2V4dGVybiB2b2lkIHVwZHd0bXAgKF9fY29uc3QgY2hhciAqX193dG1wX2ZpbGUsIF9fY29uc3Qgc3RydWN0IHV0bXAgKl9fdXRtcCkKKyAgICAgX19USFJPVzsKKworLyogQ2hhbmdlIG5hbWUgb2YgdGhlIHV0bXAgZmlsZSB0byBiZSBleGFtaW5lZC4gICovCitleHRlcm4gaW50IHV0bXBuYW1lIChfX2NvbnN0IGNoYXIgKl9fZmlsZSkgX19USFJPVzsKKworLyogUmVhZCBuZXh0IGVudHJ5IGZyb20gYSB1dG1wLWxpa2UgZmlsZS4gICovCitleHRlcm4gc3RydWN0IHV0bXAgKmdldHV0ZW50ICh2b2lkKSBfX1RIUk9XOworCisvKiBSZXNldCB0aGUgaW5wdXQgc3RyZWFtIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuICAqLworZXh0ZXJuIHZvaWQgc2V0dXRlbnQgKHZvaWQpIF9fVEhST1c7CisKKy8qIENsb3NlIHRoZSBjdXJyZW50IG9wZW4gZmlsZS4gICovCitleHRlcm4gdm9pZCBlbmR1dGVudCAodm9pZCkgX19USFJPVzsKKworLyogU2VhcmNoIGZvcndhcmQgZnJvbSB0aGUgY3VycmVudCBwb2ludCBpbiB0aGUgdXRtcCBmaWxlIHVudGlsIHRoZQorICAgbmV4dCBlbnRyeSB3aXRoIGEgdXRfdHlwZSBtYXRjaGluZyBJRC0+dXRfdHlwZS4gICovCitleHRlcm4gc3RydWN0IHV0bXAgKmdldHV0aWQgKF9fY29uc3Qgc3RydWN0IHV0bXAgKl9faWQpIF9fVEhST1c7CisKKy8qIFNlYXJjaCBmb3J3YXJkIGZyb20gdGhlIGN1cnJlbnQgcG9pbnQgaW4gdGhlIHV0bXAgZmlsZSB1bnRpbCB0aGUKKyAgIG5leHQgZW50cnkgd2l0aCBhIHV0X2xpbmUgbWF0Y2hpbmcgTElORS0+dXRfbGluZS4gICovCitleHRlcm4gc3RydWN0IHV0bXAgKmdldHV0bGluZSAoX19jb25zdCBzdHJ1Y3QgdXRtcCAqX19saW5lKSBfX1RIUk9XOworCisvKiBXcml0ZSBvdXQgZW50cnkgcG9pbnRlZCB0byBieSBVVE1QX1BUUiBpbnRvIHRoZSB1dG1wIGZpbGUuICAqLworZXh0ZXJuIHN0cnVjdCB1dG1wICpwdXR1dGxpbmUgKF9fY29uc3Qgc3RydWN0IHV0bXAgKl9fdXRtcF9wdHIpIF9fVEhST1c7CisKKworI2lmZGVmCV9fVVNFX01JU0MKKy8qIFJlZW50cmFudCB2ZXJzaW9ucyBvZiB0aGUgZmlsZSBmb3IgaGFuZGxpbmcgdXRtcCBmaWxlcy4gICovCitleHRlcm4gaW50IGdldHV0ZW50X3IgKHN0cnVjdCB1dG1wICpfX2J1ZmZlciwgc3RydWN0IHV0bXAgKipfX3Jlc3VsdCkgX19USFJPVzsKKworZXh0ZXJuIGludCBnZXR1dGlkX3IgKF9fY29uc3Qgc3RydWN0IHV0bXAgKl9faWQsIHN0cnVjdCB1dG1wICpfX2J1ZmZlciwKKwkJICAgICAgc3RydWN0IHV0bXAgKipfX3Jlc3VsdCkgX19USFJPVzsKKworZXh0ZXJuIGludCBnZXR1dGxpbmVfciAoX19jb25zdCBzdHJ1Y3QgdXRtcCAqX19saW5lLAorCQkJc3RydWN0IHV0bXAgKl9fYnVmZmVyLCBzdHJ1Y3QgdXRtcCAqKl9fcmVzdWx0KSBfX1RIUk9XOworCisjZW5kaWYJLyogVXNlIG1pc2MuICAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogdXRtcC5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS91dG1weC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS91dG1weC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MjI5MTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3V0bXB4LmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfVVRNUFhfSAorI2RlZmluZQlfVVRNUFhfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKy8qIFJlcXVpcmVkIGFjY29yZGluZyB0byBVbml4OTguICAqLworI2lmbmRlZiBfX3BpZF90X2RlZmluZWQKK3R5cGVkZWYgX19waWRfdCBwaWRfdDsKKyMgZGVmaW5lIF9fcGlkX3RfZGVmaW5lZAorI2VuZGlmCisKKy8qIEdldCBzeXN0ZW0gZGVwZW5kZW50IHZhbHVlcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3V0bXB4Lmg+CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIENvbXBhdGliaWxpdHkgbmFtZXMgZm9yIHRoZSBzdHJpbmdzIG9mIHRoZSBjYW5vbmljYWwgZmlsZSBuYW1lcy4gICovCisjIGRlZmluZSBVVE1QWF9GSUxFCV9QQVRIX1VUTVBYCisjIGRlZmluZSBVVE1QWF9GSUxFTkFNRQlfUEFUSF9VVE1QWAorIyBkZWZpbmUgV1RNUFhfRklMRQlfUEFUSF9XVE1QWAorIyBkZWZpbmUgV1RNUFhfRklMRU5BTUUJX1BBVEhfV1RNUFgKKyNlbmRpZgorCisvKiBGb3IgdGhlIGdldHV0bXB7LHh9IGZ1bmN0aW9ucyB3ZSBuZWVkIHRoZSBgc3RydWN0IHV0bXAnLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKK3N0cnVjdCB1dG1wOworI2VuZGlmCisKKworX19CRUdJTl9ERUNMUworCisvKiBPcGVuIHVzZXIgYWNjb3VudGluZyBkYXRhYmFzZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBzZXR1dHhlbnQgKHZvaWQpOworCisvKiBDbG9zZSB1c2VyIGFjY291bnRpbmcgZGF0YWJhc2UuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgZW5kdXR4ZW50ICh2b2lkKTsKKworLyogR2V0IHRoZSBuZXh0IGVudHJ5IGZyb20gdGhlIHVzZXIgYWNjb3VudGluZyBkYXRhYmFzZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IHV0bXB4ICpnZXR1dHhlbnQgKHZvaWQpOworCisvKiBHZXQgdGhlIHVzZXIgYWNjb3VudGluZyBkYXRhYmFzZSBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIElELgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgdXRtcHggKmdldHV0eGlkIChfX2NvbnN0IHN0cnVjdCB1dG1weCAqX19pZCk7CisKKy8qIEdldCB0aGUgdXNlciBhY2NvdW50aW5nIGRhdGFiYXNlIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gTElORS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IHV0bXB4ICpnZXR1dHhsaW5lIChfX2NvbnN0IHN0cnVjdCB1dG1weCAqX19saW5lKTsKKworLyogV3JpdGUgdGhlIGVudHJ5IFVUTVBYIGludG8gdGhlIHVzZXIgYWNjb3VudGluZyBkYXRhYmFzZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IHV0bXB4ICpwdXR1dHhsaW5lIChfX2NvbnN0IHN0cnVjdCB1dG1weCAqX191dG1weCk7CisKKworI2lmZGVmIF9fVVNFX0dOVQorLyogQ2hhbmdlIG5hbWUgb2YgdGhlIHV0bXB4IGZpbGUgdG8gYmUgZXhhbWluZWQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgdXRtcHhuYW1lIChfX2NvbnN0IGNoYXIgKl9fZmlsZSk7CisKKy8qIEFwcGVuZCBlbnRyeSBVVE1QIHRvIHRoZSB3dG1weC1saWtlIGZpbGUgV1RNUFhfRklMRS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgdXBkd3RtcHggKF9fY29uc3QgY2hhciAqX193dG1weF9maWxlLAorCQkgICAgICBfX2NvbnN0IHN0cnVjdCB1dG1weCAqX191dG1weCk7CisKKworLyogQ29weSB0aGUgaW5mb3JtYXRpb24gaW4gVVRNUFggdG8gVVRNUC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgZ2V0dXRtcCAoX19jb25zdCBzdHJ1Y3QgdXRtcHggKl9fdXRtcHgsCisJCSAgICAgc3RydWN0IHV0bXAgKl9fdXRtcCk7CisKKy8qIENvcHkgdGhlIGluZm9ybWF0aW9uIGluIFVUTVAgdG8gVVRNUFguCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIGdldHV0bXB4IChfX2NvbnN0IHN0cnVjdCB1dG1wICpfX3V0bXAsCisJCSAgICAgIHN0cnVjdCB1dG1weCAqX191dG1weCk7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHV0bXB4LmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3ZhbHVlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS92YWx1ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGIzNzZmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS92YWx1ZXMuaApAQCAtMCwwICsxLDY5IEBACisvKiBPbGQgY29tcGF0aWJpbGl0eSBuYW1lcyBmb3IgPGxpbWl0cy5oPiBhbmQgPGZsb2F0Lmg+IGNvbnN0YW50cy4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogVGhpcyBpbnRlcmZhY2UgaXMgb2Jzb2xldGUuICBOZXcgcHJvZ3JhbXMgc2hvdWxkIHVzZQorICAgPGxpbWl0cy5oPiBhbmQvb3IgPGZsb2F0Lmg+IGluc3RlYWQgb2YgPHZhbHVlcy5oPi4gICovCisKKyNpZm5kZWYJX1ZBTFVFU19ICisjZGVmaW5lCV9WQUxVRVNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNkZWZpbmUgX1RZUEVCSVRTKHR5cGUpCShzaXplb2YgKHR5cGUpICogQ0hBUl9CSVQpCisKKyNkZWZpbmUgQ0hBUkJJVFMJX1RZUEVCSVRTIChjaGFyKQorI2RlZmluZSBTSE9SVEJJVFMJX1RZUEVCSVRTIChzaG9ydCBpbnQpCisjZGVmaW5lIElOVEJJVFMJCV9UWVBFQklUUyAoaW50KQorI2RlZmluZSBMT05HQklUUwlfVFlQRUJJVFMgKGxvbmcgaW50KQorI2RlZmluZSBQVFJCSVRTCQlfVFlQRUJJVFMgKGNoYXIgKikKKyNkZWZpbmUgRE9VQkxFQklUUwlfVFlQRUJJVFMgKGRvdWJsZSkKKyNkZWZpbmUgRkxPQVRCSVRTCV9UWVBFQklUUyAoZmxvYXQpCisKKyNkZWZpbmUgTUlOU0hPUlQJU0hSVF9NSU4KKyNkZWZpbmUJTUlOSU5UCQlJTlRfTUlOCisjZGVmaW5lCU1JTkxPTkcJCUxPTkdfTUlOCisKKyNkZWZpbmUJTUFYU0hPUlQJU0hSVF9NQVgKKyNkZWZpbmUJTUFYSU5UCQlJTlRfTUFYCisjZGVmaW5lCU1BWExPTkcJCUxPTkdfTUFYCisKKyNkZWZpbmUgSElCSVRTCQlNSU5TSE9SVAorI2RlZmluZSBISUJJVEwJCU1JTkxPTkcKKworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKworI2RlZmluZQlNQVhET1VCTEUJREJMX01BWAorI2RlZmluZQlNQVhGTE9BVAlGTFRfTUFYCisjZGVmaW5lCU1JTkRPVUJMRQlEQkxfTUlOCisjZGVmaW5lCU1JTkZMT0FUCUZMVF9NSU4KKyNkZWZpbmUJRE1JTkVYUAkJREJMX01JTl9FWFAKKyNkZWZpbmUJRk1JTkVYUAkJRkxUX01JTl9FWFAKKyNkZWZpbmUJRE1BWEVYUAkJREJMX01BWF9FWFAKKyNkZWZpbmUJRk1BWEVYUAkJRkxUX01BWF9FWFAKKworCisjaWZkZWYgX19VU0VfTUlTQworLyogU29tZSBzeXN0ZW1zIGRlZmluZSB0aGlzIG5hbWUgaW5zdGVhZCBvZiBDSEFSX0JJVCBvciBDSEFSQklUUy4gICovCisjIGRlZmluZSBCSVRTUEVSQllURQlDSEFSX0JJVAorI2VuZGlmCisKKyNlbmRpZgkvKiB2YWx1ZXMuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS92aWRlby9lZGlkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3ZpZGVvL2VkaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTkxMWE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS92aWRlby9lZGlkLmgKQEAgLTAsMCArMSwxMSBAQAorI2lmbmRlZiBfX2xpbnV4X3ZpZGVvX2VkaWRfaF9fCisjZGVmaW5lIF9fbGludXhfdmlkZW9fZWRpZF9oX18KKworCitzdHJ1Y3QgZWRpZF9pbmZvIHsKKwl1bnNpZ25lZCBjaGFyIGR1bW15WzEyOF07Cit9OworCisKKworI2VuZGlmIC8qIF9fbGludXhfdmlkZW9fZWRpZF9oX18gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdmlkZW8vc2lzZmIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdmlkZW8vc2lzZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmI3YjNkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS92aWRlby9zaXNmYi5oCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogc2lzZmIuaCAtIGRlZmluaXRpb25zIGZvciB0aGUgU2lTIGZyYW1lYnVmZmVyIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IGJ5IFRob21hcyBXaW5pc2NoaG9mZXIsIFZpZW5uYSwgQXVzdHJpYS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIG5hbWVkIExpY2Vuc2UsCisgKiBvciBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisjaWZuZGVmIF9MSU5VWF9TSVNGQl9IXworI2RlZmluZSBfTElOVVhfU0lTRkJfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lvY3RsLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgUFVCTElDICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogdmJmbGFncywgcHVibGljIChvdGhlcnMgaW4gc2lzLmgpICovCisjZGVmaW5lIENSVDJfREVGQVVMVAkJMHgwMDAwMDAwMQorI2RlZmluZSBDUlQyX0xDRAkJMHgwMDAwMDAwMgorI2RlZmluZSBDUlQyX1RWCQkJMHgwMDAwMDAwNAorI2RlZmluZSBDUlQyX1ZHQQkJMHgwMDAwMDAwOAorI2RlZmluZSBUVl9OVFNDCQkJMHgwMDAwMDAxMAorI2RlZmluZSBUVl9QQUwJCQkweDAwMDAwMDIwCisjZGVmaW5lIFRWX0hJVklTSU9OCQkweDAwMDAwMDQwCisjZGVmaW5lIFRWX1lQQlBSCQkweDAwMDAwMDgwCisjZGVmaW5lIFRWX0FWSURFTwkJMHgwMDAwMDEwMAorI2RlZmluZSBUVl9TVklERU8JCTB4MDAwMDAyMDAKKyNkZWZpbmUgVFZfU0NBUlQJCTB4MDAwMDA0MDAKKyNkZWZpbmUgVFZfUEFMTQkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgVFZfUEFMTgkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgVFZfTlRTQ0oJCTB4MDAwMDEwMDAKKyNkZWZpbmUgVFZfQ0hTQ0FSVAkJMHgwMDAwODAwMAorI2RlZmluZSBUVl9DSFlQQlBSNTI1SQkJMHgwMDAxMDAwMAorI2RlZmluZSBDUlQxX1ZHQQkJMHgwMDAwMDAwMAorI2RlZmluZSBDUlQxX0xDREEJCTB4MDAwMjAwMDAKKyNkZWZpbmUgVkdBMl9DT05ORUNURUQgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBWQl9ESVNQVFlQRV9DUlQxCTB4MDAwODAwMDAJLyogQ1JUMSBjb25uZWN0ZWQgYW5kIHVzZWQgKi8KKyNkZWZpbmUgVkJfU0lOR0xFX01PREUJCTB4MjAwMDAwMDAJLyogQ1JUMSBvciBDUlQyOyBkZXRlcm1pbmVkIGJ5IERJU1BUWVBFX0NSVHggKi8KKyNkZWZpbmUgVkJfTUlSUk9SX01PREUJCTB4NDAwMDAwMDAJLyogQ1JUMSArIENSVDIgaWRlbnRpY2FsIChtaXJyb3IgbW9kZSkgKi8KKyNkZWZpbmUgVkJfRFVBTFZJRVdfTU9ERQkweDgwMDAwMDAwCS8qIENSVDEgKyBDUlQyIGluZGVwZW5kZW50IChkdWFsIGhlYWQgbW9kZSkgKi8KKworLyogQWxpYXNlczogKi8KKyNkZWZpbmUgQ1JUMl9FTkFCTEUJCShDUlQyX0xDRCB8IENSVDJfVFYgfCBDUlQyX1ZHQSkKKyNkZWZpbmUgVFZfU1RBTkRBUkQJCShUVl9OVFNDIHwgVFZfUEFMIHwgVFZfUEFMTSB8IFRWX1BBTE4gfCBUVl9OVFNDSikKKyNkZWZpbmUgVFZfSU5URVJGQUNFCQkoVFZfQVZJREVPfFRWX1NWSURFT3xUVl9TQ0FSVHxUVl9ISVZJU0lPTnxUVl9ZUEJQUnxUVl9DSFNDQVJUfFRWX0NIWVBCUFI1MjVJKQorCisvKiBPbmx5IGlmIFRWX1lQQlBSIGlzIHNldDogKi8KKyNkZWZpbmUgVFZfWVBCUFI1MjVJCQlUVl9OVFNDCisjZGVmaW5lIFRWX1lQQlBSNTI1UAkJVFZfUEFMCisjZGVmaW5lIFRWX1lQQlBSNzUwUAkJVFZfUEFMTQorI2RlZmluZSBUVl9ZUEJQUjEwODBJCQlUVl9QQUxOCisjZGVmaW5lIFRWX1lQQlBSQUxMIAkJKFRWX1lQQlBSNTI1SSB8IFRWX1lQQlBSNTI1UCB8IFRWX1lQQlBSNzUwUCB8IFRWX1lQQlBSMTA4MEkpCisKKyNkZWZpbmUgVkJfRElTUFRZUEVfRElTUDIJQ1JUMl9FTkFCTEUKKyNkZWZpbmUgVkJfRElTUFRZUEVfQ1JUMglDUlQyX0VOQUJMRQorI2RlZmluZSBWQl9ESVNQVFlQRV9ESVNQMQlWQl9ESVNQVFlQRV9DUlQxCisjZGVmaW5lIFZCX0RJU1BNT0RFX1NJTkdMRQlWQl9TSU5HTEVfTU9ERQorI2RlZmluZSBWQl9ESVNQTU9ERV9NSVJST1IJVkJfTUlSUk9SX01PREUKKyNkZWZpbmUgVkJfRElTUE1PREVfRFVBTAlWQl9EVUFMVklFV19NT0RFCisjZGVmaW5lIFZCX0RJU1BMQVlfTU9ERQkJKFNJTkdMRV9NT0RFIHwgTUlSUk9SX01PREUgfCBEVUFMVklFV19NT0RFKQorCisvKiBTdHJ1Y3R1cmUgYXJndW1lbnQgZm9yIFNJU0ZCX0dFVF9JTkZPIGlvY3RsICAqLworc3RydWN0IHNpc2ZiX2luZm8geworCV9fdTMyCXNpc2ZiX2lkOwkJLyogZm9yIGlkZW50aWZ5aW5nIHNpc2ZiICovCisjaWZuZGVmIFNJU0ZCX0lECisjZGVmaW5lIFNJU0ZCX0lECSAgMHg1MzQ5NTM0NiAgICAvKiBJZGVudGlmeSBteXNlbGYgd2l0aCAnU0lTRicgKi8KKyNlbmRpZgorCV9fdTMyICAgY2hpcF9pZDsJCS8qIFBDSS1JRCBvZiBkZXRlY3RlZCBjaGlwICovCisJX191MzIgICBtZW1vcnk7CQkJLyogdG90YWwgdmlkZW8gbWVtb3J5IGluIEtCICovCisJX191MzIgICBoZWFwc3RhcnQ7CQkvKiBoZWFwIHN0YXJ0IG9mZnNldCBpbiBLQiAqLworCV9fdTggICAgZmJ2aWRtb2RlOwkJLyogY3VycmVudCBzaXNmYiBtb2RlICovCisKKwlfX3U4CXNpc2ZiX3ZlcnNpb247CisJX191OAlzaXNmYl9yZXZpc2lvbjsKKwlfX3U4CXNpc2ZiX3BhdGNobGV2ZWw7CisKKwlfX3U4CXNpc2ZiX2NhcHM7CQkvKiBzaXNmYiBjYXBhYmlsaXRpZXMgKi8KKworCV9fdTMyCXNpc2ZiX3RxbGVuOwkJLyogdHVyYm8gcXVldWUgbGVuZ3RoIChpbiBLQikgKi8KKworCV9fdTMyCXNpc2ZiX3BjaWJ1czsJCS8qIFRoZSBjYXJkJ3MgUENJIElEICovCisJX191MzIJc2lzZmJfcGNpc2xvdDsKKwlfX3UzMglzaXNmYl9wY2lmdW5jOworCisJX191OAlzaXNmYl9sY2RwZGM7CQkvKiBQYW5lbERlbGF5Q29tcGVuc2F0aW9uICovCisKKwlfX3U4CXNpc2ZiX2xjZGE7CQkvKiBEZXRlY3RlZCBzdGF0dXMgb2YgTENEQSBmb3IgbG93IHJlcy90ZXh0IG1vZGVzICovCisKKwlfX3UzMglzaXNmYl92YmZsYWdzOworCV9fdTMyCXNpc2ZiX2N1cnJlbnR2YmZsYWdzOworCisJX191MzIJc2lzZmJfc2NhbGVsY2Q7CisJX191MzIJc2lzZmJfc3BlY2lhbHRpbWluZzsKKworCV9fdTgJc2lzZmJfaGF2ZWVtaTsKKwlfX3U4CXNpc2ZiX2VtaTMwLHNpc2ZiX2VtaTMxLHNpc2ZiX2VtaTMyLHNpc2ZiX2VtaTMzOworCV9fdTgJc2lzZmJfaGF2ZWVtaWxjZDsKKworCV9fdTgJc2lzZmJfbGNkcGRjYTsJCS8qIFBhbmVsRGVsYXlDb21wZW5zYXRpb24gZm9yIExDRC12aWEtQ1JUMSAqLworCisJX191MTYJc2lzZmJfdHZ4cG9zLCBzaXNmYl90dnlwb3M7CS8qIFdhcm5pbmc6IFZhbHVlcyArIDMyICEgKi8KKworCV9fdTMyCXNpc2ZiX2hlYXBzaXplOwkJLyogaGVhcCBzaXplIChpbiBLQikgKi8KKwlfX3UzMglzaXNmYl92aWRlb29mZnNldDsJLyogT2Zmc2V0IG9mIHZpZXdwb3J0IGluIHZpZGVvIG1lbW9yeSAoaW4gYnl0ZXMpICovCisKKwlfX3UzMglzaXNmYl9jdXJmc3RuOwkJLyogY3VycmVudGx5IHJ1bm5pbmcgRlNUTi9EU1ROIG1vZGUgKi8KKwlfX3UzMglzaXNmYl9jdXJkc3RuOworCisJX191MTYJc2lzZmJfcGNpX3ZlbmRvcjsJLyogUENJIHZlbmRvciAoU2lTIG9yIFhHSSkgKi8KKworCV9fdTMyCXNpc2ZiX3ZiZmxhZ3MyOwkJLyogaXZpZGVvLT52YmZsYWdzMiAqLworCisJX191OAlzaXNmYl9jYW5fcG9zdDsJCS8qIHNpc2ZiIGNhbiBQT1NUIHRoaXMgY2FyZCAqLworCV9fdTgJc2lzZmJfY2FyZF9wb3N0ZWQ7CS8qIGNhcmQgaXMgUE9TVEVEICovCisJX191OAlzaXNmYl93YXNfYm9vdF9kZXZpY2U7CS8qIFRoaXMgY2FyZCB3YXMgdGhlIGJvb3QgdmlkZW8gZGV2aWNlIChpZSBpcyBwcmltYXJ5KSAqLworCisJX191OAlyZXNlcnZlZFsxODNdOwkJLyogZm9yIGZ1dHVyZSB1c2UgKi8KK307CisKKyNkZWZpbmUgU0lTRkJfQ01EX0dFVFZCRkxBR1MJMHg1NUFBMDAwMQkvKiBubyBhcmc7IHJlc3VsdFsxXSA9IHZiZmxhZ3MgKi8KKyNkZWZpbmUgU0lTRkJfQ01EX1NXSVRDSENSVDEJMHg1NUFBMDAxMAkvKiBhcmdbMF06IDk5ID0gcXVlcnksIDAgPSBvZmYsIDEgPSBvbiAqLworLyogbW9yZSB0byBjb21lICovCisKKyNkZWZpbmUgU0lTRkJfQ01EX0VSUl9PSwkweDgwMDAwMDAwCS8qIGNvbW1hbmQgc3VjY2VlZGVkICovCisjZGVmaW5lIFNJU0ZCX0NNRF9FUlJfTE9DS0VECTB4ODAwMDAwMDEJLyogc2lzZmIgaXMgbG9ja2VkICovCisjZGVmaW5lIFNJU0ZCX0NNRF9FUlJfRUFSTFkJMHg4MDAwMDAwMgkvKiByZXF1ZXN0IGJlZm9yZSBzaXNmYiB0b29rIG92ZXIgZ2Z4IHN5c3RlbSAqLworI2RlZmluZSBTSVNGQl9DTURfRVJSX05PVkIJMHg4MDAwMDAwMwkvKiBObyB2aWRlbyBicmlkZ2UgKi8KKyNkZWZpbmUgU0lTRkJfQ01EX0VSUl9OT0NSVDIJMHg4MDAwMDAwNAkvKiBjYW4ndCBjaGFuZ2UgQ1JUMSBzdGF0dXMsIENSVDIgZGlzYWJsZWQgKi8KKy8qIG1vcmUgdG8gY29tZSAqLworI2RlZmluZSBTSVNGQl9DTURfRVJSX1VOS05PV04gICAweDgwMDBmZmZmCS8qIFVua25vd24gY29tbWFuZCAqLworI2RlZmluZSBTSVNGQl9DTURfRVJSX09USEVSCTB4ODAwMTAwMDAJLyogT3RoZXIgZXJyb3IgKi8KKworLyogQXJndW1lbnQgZm9yIFNJU0ZCX0NNRCBpb2N0bCAqLworc3RydWN0IHNpc2ZiX2NtZCB7CisJX191MzIgIHNpc2ZiX2NtZDsKKwlfX3UzMiAgc2lzZmJfYXJnWzE2XTsKKwlfX3UzMiAgc2lzZmJfcmVzdWx0WzRdOworfTsKKworLyogQWRkaXRpb25hbCBJT0NUTHMgZm9yIGNvbW11bmljYXRpb24gc2lzZmIgPD4gWCBkcml2ZXIgICAgICAgICAgICAgICAgKi8KKy8qIElmIGNoYW5naW5nIHRoaXMsIHZnYXR5cGVzLmggbXVzdCBhbHNvIGJlIGNoYW5nZWQgKGZvciBYIGRyaXZlcikgICAgKi8KKworLyogaW9jdGwgZm9yIGlkZW50aWZ5aW5nIGFuZCBnaXZpbmcgc29tZSBpbmZvIChlc3AuIG1lbW9yeSBoZWFwIHN0YXJ0KSAqLworI2RlZmluZSBTSVNGQl9HRVRfSU5GT19TSVpFCV9JT1IoMHhGMywweDAwLF9fdTMyKQorI2RlZmluZSBTSVNGQl9HRVRfSU5GTwkJX0lPUigweEYzLDB4MDEsc3RydWN0IHNpc2ZiX2luZm8pCisKKy8qIGlvY3RybCB0byBnZXQgY3VycmVudCB2ZXJ0aWNhbCByZXRyYWNlIHN0YXR1cyAqLworI2RlZmluZSBTSVNGQl9HRVRfVkJSU1RBVFVTCV9JT1IoMHhGMywweDAyLF9fdTMyKQorCisvKiBpb2N0bCB0byBlbmFibGUvZGlzYWJsZSBwYW5uaW5nIGF1dG8tbWF4aW1pemUgKGxpa2Ugbm9tYXggcGFyYW1ldGVyKSAqLworI2RlZmluZSBTSVNGQl9HRVRfQVVUT01BWElNSVpFCV9JT1IoMHhGMywweDAzLF9fdTMyKQorI2RlZmluZSBTSVNGQl9TRVRfQVVUT01BWElNSVpFCV9JT1coMHhGMywweDAzLF9fdTMyKQorCisvKiBpb2N0bHMgdG8gcmVsb2NhdGUgVFYgb3V0cHV0ICh4PURbMzE6MTZdLCB5PURbMTU6MF0sICsgMzIpKi8KKyNkZWZpbmUgU0lTRkJfR0VUX1RWUE9TT0ZGU0VUCV9JT1IoMHhGMywweDA0LF9fdTMyKQorI2RlZmluZSBTSVNGQl9TRVRfVFZQT1NPRkZTRVQJX0lPVygweEYzLDB4MDQsX191MzIpCisKKy8qIGlvY3RsIGZvciBpbnRlcm5hbCBzaXNmYiBjb21tYW5kcyAoc2lzZmJjdHJsKSAqLworI2RlZmluZSBTSVNGQl9DT01NQU5ECQlfSU9XUigweEYzLDB4MDUsc3RydWN0IHNpc2ZiX2NtZCkKKworLyogaW9jdGwgZm9yIGxvY2tpbmcgc2lzZmIgKG5vIHJlZ2lzdGVyIGFjY2VzcyBkdXJpbmcgbG9jaykgKi8KKy8qIEFzIG9mIG5vdywgb25seSB1c2VkIHRvIGF2b2lkIHJlZ2lzdGVyIGFjY2VzcyBkdXJpbmcKKyAqIHRoZSBpb2N0bHMgbGlzdGVkIGFib3ZlLgorICovCisjZGVmaW5lIFNJU0ZCX1NFVF9MT0NLCQlfSU9XKDB4RjMsMHgwNixfX3UzMikKKworLyogaW9jdGxzIDB4RjMgdXAgdG8gMHgzRiByZXNlcnZlZCBmb3Igc2lzZmIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaGUgZm9sbG93aW5nIGFyZSBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYW55bW9yZTogKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogaW9jdGwgZm9yIGlkZW50aWZ5aW5nIGFuZCBnaXZpbmcgc29tZSBpbmZvIChlc3AuIG1lbW9yeSBoZWFwIHN0YXJ0KSAqLworI2RlZmluZSBTSVNGQl9HRVRfSU5GT19PTEQJICAgX0lPUignbicsMHhGOCxfX3UzMikKKy8qIGlvY3RybCB0byBnZXQgY3VycmVudCB2ZXJ0aWNhbCByZXRyYWNlIHN0YXR1cyAqLworI2RlZmluZSBTSVNGQl9HRVRfVkJSU1RBVFVTX09MRAkgICBfSU9SKCduJywweEY5LF9fdTMyKQorLyogaW9jdGwgdG8gZW5hYmxlL2Rpc2FibGUgcGFubmluZyBhdXRvLW1heGltaXplIChsaWtlIG5vbWF4IHBhcmFtZXRlcikgKi8KKyNkZWZpbmUgU0lTRkJfR0VUX0FVVE9NQVhJTUlaRV9PTEQgX0lPUignbicsMHhGQSxfX3UzMikKKyNkZWZpbmUgU0lTRkJfU0VUX0FVVE9NQVhJTUlaRV9PTEQgX0lPVygnbicsMHhGQSxfX3UzMikKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICBFbmQgb2YgZGVwcmVjYXRlZCBpb2N0bCBudW1iZXJzICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRm9yIGZiIG1lbW9yeSBtYW5hZ2VyIChGQklPX0FMTE9DLCBGQklPX0ZSRUUpICovCitzdHJ1Y3Qgc2lzX21lbXJlcSB7CisJX191MzIJb2Zmc2V0OworCV9fdTMyCXNpemU7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgUFJJVkFURSAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAoZm9yIElOLUtFUk5FTCB1c2FnZSBvbmx5KSAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdmlkZW8vdXZlc2FmYi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS92aWRlby91dmVzYWZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllMjgxYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdmlkZW8vdXZlc2FmYi5oCkBAIC0wLDAgKzEsNjAgQEAKKyNpZm5kZWYgX1VWRVNBRkJfSAorI2RlZmluZSBfVVZFU0FGQl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3Qgdjg2X3JlZ3MgeworCV9fdTMyIGVieDsKKwlfX3UzMiBlY3g7CisJX191MzIgZWR4OworCV9fdTMyIGVzaTsKKwlfX3UzMiBlZGk7CisJX191MzIgZWJwOworCV9fdTMyIGVheDsKKwlfX3UzMiBlaXA7CisJX191MzIgZWZsYWdzOworCV9fdTMyIGVzcDsKKwlfX3UxNiBjczsKKwlfX3UxNiBzczsKKwlfX3UxNiBlczsKKwlfX3UxNiBkczsKKwlfX3UxNiBmczsKKwlfX3UxNiBnczsKK307CisKKy8qIFRhc2sgZmxhZ3MgKi8KKyNkZWZpbmUgVEZfVkJFSUIJMHgwMQorI2RlZmluZSBURl9CVUZfRVNESQkweDAyCisjZGVmaW5lIFRGX0JVRl9FU0JYCTB4MDQKKyNkZWZpbmUgVEZfQlVGX1JFVAkweDA4CisjZGVmaW5lIFRGX0VYSVQJCTB4MTAKKworc3RydWN0IHV2ZXNhZmJfdGFzayB7CisJX191OCBmbGFnczsKKwlpbnQgYnVmX2xlbjsKKwlzdHJ1Y3Qgdjg2X3JlZ3MgcmVnczsKK307CisKKy8qIENvbnN0YW50cyBmb3IgdGhlIGNhcGFiaWxpdGllcyBmaWVsZAorICogaW4gdmJlX2liICovCisjZGVmaW5lIFZCRV9DQVBfQ0FOX1NXSVRDSF9EQUMJMHgwMQorI2RlZmluZSBWQkVfQ0FQX1ZHQUNPTVBBVAkweDAyCisKKy8qIFRoZSBWQkUgSW5mbyBCbG9jayAqLworc3RydWN0IHZiZV9pYiB7CisJY2hhciAgdmJlX3NpZ25hdHVyZVs0XTsKKwlfX3UxNiB2YmVfdmVyc2lvbjsKKwlfX3UzMiBvZW1fc3RyaW5nX3B0cjsKKwlfX3UzMiBjYXBhYmlsaXRpZXM7CisJX191MzIgbW9kZV9saXN0X3B0cjsKKwlfX3UxNiB0b3RhbF9tZW1vcnk7CisJX191MTYgb2VtX3NvZnR3YXJlX3JldjsKKwlfX3UzMiBvZW1fdmVuZG9yX25hbWVfcHRyOworCV9fdTMyIG9lbV9wcm9kdWN0X25hbWVfcHRyOworCV9fdTMyIG9lbV9wcm9kdWN0X3Jldl9wdHI7CisJX191OCAgcmVzZXJ2ZWRbMjIyXTsKKwljaGFyICBvZW1fZGF0YVsyNTZdOworCWNoYXIgIG1pc2NfZGF0YVs1MTJdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNlbmRpZiAvKiBfVVZFU0FGQl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3dhaXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvd2FpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMWI4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3dhaXQuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvd2NoYXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvd2NoYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQ3YWUyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS93Y2hhci5oCkBAIC0wLDAgKzEsODk3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqICAgICAgSVNPIEM5OSBTdGFuZGFyZDogNy4yNAorICoJRXh0ZW5kZWQgbXVsdGlieXRlIGFuZCB3aWRlIGNoYXJhY3RlciB1dGlsaXRpZXMJPHdjaGFyLmg+CisgKi8KKworI2lmbmRlZiBfV0NIQVJfSAorCisjaWYgIWRlZmluZWQgX19uZWVkX21ic3RhdGVfdCAmJiAhZGVmaW5lZCBfX25lZWRfd2ludF90CisjIGRlZmluZSBfV0NIQVJfSCAxCisjIGluY2x1ZGUgPGZlYXR1cmVzLmg+CisjZW5kaWYKKworI2lmZGVmIF9XQ0hBUl9ICisvKiBHZXQgRklMRSBkZWZpbml0aW9uLiAgKi8KKyMgZGVmaW5lIF9fbmVlZF9fX0ZJTEUKKyMgaWYgZGVmaW5lZCBfX1VTRV9VTklYOTggfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisjICBkZWZpbmUgX19uZWVkX0ZJTEUKKyMgZW5kaWYKKyMgaW5jbHVkZSA8c3RkaW8uaD4KKy8qIEdldCB2YV9saXN0IGRlZmluaXRpb24uICAqLworIyBkZWZpbmUgX19uZWVkX19fdmFfbGlzdAorIyBpbmNsdWRlIDxzdGRhcmcuaD4KKworIyBpbmNsdWRlIDxiaXRzL3djaGFyLmg+CisKKy8qIEdldCBzaXplX3QsIHdjaGFyX3QsIHdpbnRfdCBhbmQgTlVMTCBmcm9tIDxzdGRkZWYuaD4uICAqLworIyBkZWZpbmUgX19uZWVkX3NpemVfdAorIyBkZWZpbmUgX19uZWVkX3djaGFyX3QKKyMgZGVmaW5lIF9fbmVlZF9OVUxMCisjZW5kaWYKKyNpZiBkZWZpbmVkIF9XQ0hBUl9IIHx8IGRlZmluZWQgX19uZWVkX3dpbnRfdCB8fCAhZGVmaW5lZCBfX1dJTlRfVFlQRV9fCisjIHVuZGVmIF9fbmVlZF93aW50X3QKKyMgZGVmaW5lIF9fbmVlZF93aW50X3QKKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIFdlIHRyeSB0byBnZXQgd2ludF90IGZyb20gPHN0ZGRlZi5oPiwgYnV0IG5vdCBhbGwgR0NDIHZlcnNpb25zIGRlZmluZSBpdAorICAgdGhlcmUuICBTbyBkZWZpbmUgaXQgb3Vyc2VsdmVzIGlmIGl0IHJlbWFpbnMgdW5kZWZpbmVkLiAgKi8KKyMgaWZuZGVmIF9XSU5UX1QKKy8qIEludGVncmFsIHR5cGUgdW5jaGFuZ2VkIGJ5IGRlZmF1bHQgYXJndW1lbnQgcHJvbW90aW9ucyB0aGF0IGNhbgorICAgaG9sZCBhbnkgdmFsdWUgY29ycmVzcG9uZGluZyB0byBtZW1iZXJzIG9mIHRoZSBleHRlbmRlZCBjaGFyYWN0ZXIKKyAgIHNldCwgYXMgd2VsbCBhcyBhdCBsZWFzdCBvbmUgdmFsdWUgdGhhdCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFueQorICAgbWVtYmVyIG9mIHRoZSBleHRlbmRlZCBjaGFyYWN0ZXIgc2V0LiAgKi8KKyMgIGRlZmluZSBfV0lOVF9UCit0eXBlZGVmIHVuc2lnbmVkIGludCB3aW50X3Q7CisjIGVsc2UKKy8qIFdvcmsgYXJvdW5kIHByb2JsZW1zIHdpdGggdGhlIDxzdGRkZWYuaD4gZmlsZSB3aGljaCBkb2Vzbid0IHB1dAorICAgd2ludF90IGluIHRoZSBzdGQgbmFtZXNwYWNlLiAgKi8KKyMgIGlmIGRlZmluZWQgX19jcGx1c3BsdXMgJiYgZGVmaW5lZCBfR0xJQkNQUF9VU0VfTkFNRVNQQUNFUyBcCisgICAgICAmJiBkZWZpbmVkIF9fV0lOVF9UWVBFX18KK19fQkVHSU5fTkFNRVNQQUNFX1NURAordHlwZWRlZiBfX1dJTlRfVFlQRV9fIHdpbnRfdDsKK19fRU5EX05BTUVTUEFDRV9TVEQKKyMgIGVuZGlmCisjIGVuZGlmCisKKy8qIFRlbGwgdGhlIGNhbGxlciB0aGF0IHdlIHByb3ZpZGUgY29ycmVjdCBDKysgcHJvdG90eXBlcy4gICovCisjIGlmIGRlZmluZWQgX19jcGx1c3BsdXMgJiYgX19HTlVDX1BSRVJFUSAoNCwgNCkKKyMgIGRlZmluZSBfX0NPUlJFQ1RfSVNPX0NQUF9XQ0hBUl9IX1BST1RPCisjIGVuZGlmCisjZW5kaWYKKworI2lmIChkZWZpbmVkIF9XQ0hBUl9IIHx8IGRlZmluZWQgX19uZWVkX21ic3RhdGVfdCkgJiYgIWRlZmluZWQgX19tYnN0YXRlX3RfZGVmaW5lZAorIyBkZWZpbmUgX19tYnN0YXRlX3RfZGVmaW5lZAkxCisvKiBDb252ZXJzaW9uIHN0YXRlIGluZm9ybWF0aW9uLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCBfX2NvdW50OworICB1bmlvbgorICB7CisjIGlmZGVmIF9fV0lOVF9UWVBFX18KKyAgICBfX1dJTlRfVFlQRV9fIF9fd2NoOworIyBlbHNlCisgICAgd2ludF90IF9fd2NoOworIyBlbmRpZgorICAgIGNoYXIgX193Y2hiWzRdOworICB9IF9fdmFsdWU7CQkvKiBWYWx1ZSBzbyBmYXIuICAqLworfSBfX21ic3RhdGVfdDsKKyNlbmRpZgorI3VuZGVmIF9fbmVlZF9tYnN0YXRlX3QKKworCisvKiBUaGUgcmVzdCBvZiB0aGUgZmlsZSBpcyBvbmx5IHVzZWQgaWYgdXNlZCBpZiBfX25lZWRfbWJzdGF0ZV90IGlzIG5vdAorICAgZGVmaW5lZC4gICovCisjaWZkZWYgX1dDSEFSX0gKKworX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBQdWJsaWMgdHlwZS4gICovCit0eXBlZGVmIF9fbWJzdGF0ZV90IG1ic3RhdGVfdDsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNpZmRlZiBfX1VTRV9HTlUKK19fVVNJTkdfTkFNRVNQQUNFX0M5OShtYnN0YXRlX3QpCisjZW5kaWYKKworI2lmbmRlZiBXQ0hBUl9NSU4KKy8qIFRoZXNlIGNvbnN0YW50cyBtaWdodCBhbHNvIGJlIGRlZmluZWQgaW4gPGludHR5cGVzLmg+LiAgKi8KKyMgZGVmaW5lIFdDSEFSX01JTiBfX1dDSEFSX01JTgorIyBkZWZpbmUgV0NIQVJfTUFYIF9fV0NIQVJfTUFYCisjZW5kaWYKKworI2lmbmRlZiBXRU9GCisjIGRlZmluZSBXRU9GICgweGZmZmZmZmZmdSkKKyNlbmRpZgorCisvKiBGb3IgWFBHNCBjb21wbGlhbmNlIHdlIGhhdmUgdG8gZGVmaW5lIHRoZSBzdHVmZiBmcm9tIDx3Y3R5cGUuaD4gaGVyZQorICAgYXMgd2VsbC4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiAmJiAhZGVmaW5lZCBfX1VTRV9VTklYOTgKKyMgaW5jbHVkZSA8d2N0eXBlLmg+CisjZW5kaWYKKworCitfX0JFR0lOX0RFQ0xTCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogVGhpcyBpbmNvbXBsZXRlIHR5cGUgaXMgZGVmaW5lZCBpbiA8dGltZS5oPiBidXQgbmVlZGVkIGhlcmUgYmVjYXVzZQorICAgb2YgYHdjc2Z0aW1lJy4gICovCitzdHJ1Y3QgdG07CitfX0VORF9OQU1FU1BBQ0VfU1RECisvKiBYWFggV2UgaGF2ZSB0byBjbGVhbiB0aGlzIHVwIGF0IHNvbWUgcG9pbnQuICBTaW5jZSB0bSBpcyBpbiB0aGUgc3RkCisgICBuYW1lc3BhY2UgYnV0IHdjc2Z0aW1lIGlzIGluIF9fYzk5IHRoZSB0eXBlIHdvdWxkbid0IGJlIGZvdW5kCisgICB3aXRob3V0IGluc2VydGluZyBpdCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gICovCitfX1VTSU5HX05BTUVTUEFDRV9TVEQodG0pCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBDb3B5IFNSQyB0byBERVNULiAgKi8KK2V4dGVybiB3Y2hhcl90ICp3Y3NjcHkgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjKSBfX1RIUk9XOworLyogQ29weSBubyBtb3JlIHRoYW4gTiB3aWRlLWNoYXJhY3RlcnMgb2YgU1JDIHRvIERFU1QuICAqLworZXh0ZXJuIHdjaGFyX3QgKndjc25jcHkgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVzsKKworLyogQXBwZW5kIFNSQyBvbnRvIERFU1QuICAqLworZXh0ZXJuIHdjaGFyX3QgKndjc2NhdCAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQlfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMpIF9fVEhST1c7CisvKiBBcHBlbmQgbm8gbW9yZSB0aGFuIE4gd2lkZS1jaGFyYWN0ZXJzIG9mIFNSQyBvbnRvIERFU1QuICAqLworZXh0ZXJuIHdjaGFyX3QgKndjc25jYXQgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVzsKKworLyogQ29tcGFyZSBTMSBhbmQgUzIuICAqLworZXh0ZXJuIGludCB3Y3NjbXAgKF9fY29uc3Qgd2NoYXJfdCAqX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3MyKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXzsKKy8qIENvbXBhcmUgTiB3aWRlLWNoYXJhY3RlcnMgb2YgUzEgYW5kIFMyLiAgKi8KK2V4dGVybiBpbnQgd2NzbmNtcCAoX19jb25zdCB3Y2hhcl90ICpfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fczIsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYgX19VU0VfWE9QRU4ySzgKKy8qIENvbXBhcmUgUzEgYW5kIFMyLCBpZ25vcmluZyBjYXNlLiAgKi8KK2V4dGVybiBpbnQgd2NzY2FzZWNtcCAoX19jb25zdCB3Y2hhcl90ICpfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fczIpIF9fVEhST1c7CisKKy8qIENvbXBhcmUgbm8gbW9yZSB0aGFuIE4gY2hhcnMgb2YgUzEgYW5kIFMyLCBpZ25vcmluZyBjYXNlLiAgKi8KK2V4dGVybiBpbnQgd2NzbmNhc2VjbXAgKF9fY29uc3Qgd2NoYXJfdCAqX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3MyLAorCQkJc2l6ZV90IF9fbikgX19USFJPVzsKKworLyogU2ltaWxhciB0byB0aGUgdHdvIGZ1bmN0aW9ucyBhYm92ZSBidXQgdGFrZSB0aGUgaW5mb3JtYXRpb24gZnJvbQorICAgdGhlIHByb3ZpZGVkIGxvY2FsZSBhbmQgbm90IHRoZSBnbG9iYWwgbG9jYWxlLiAgKi8KKyMgaW5jbHVkZSA8eGxvY2FsZS5oPgorCitleHRlcm4gaW50IHdjc2Nhc2VjbXBfbCAoX19jb25zdCB3Y2hhcl90ICpfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fczIsCisJCQkgX19sb2NhbGVfdCBfX2xvYykgX19USFJPVzsKKworZXh0ZXJuIGludCB3Y3NuY2FzZWNtcF9sIChfX2NvbnN0IHdjaGFyX3QgKl9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19zMiwKKwkJCSAgc2l6ZV90IF9fbiwgX19sb2NhbGVfdCBfX2xvYykgX19USFJPVzsKKyNlbmRpZgorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIENvbXBhcmUgUzEgYW5kIFMyLCBib3RoIGludGVycHJldGVkIGFzIGFwcHJvcHJpYXRlIHRvIHRoZQorICAgTENfQ09MTEFURSBjYXRlZ29yeSBvZiB0aGUgY3VycmVudCBsb2NhbGUuICAqLworZXh0ZXJuIGludCB3Y3Njb2xsIChfX2NvbnN0IHdjaGFyX3QgKl9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19zMikgX19USFJPVzsKKy8qIFRyYW5zZm9ybSBTMiBpbnRvIGFycmF5IHBvaW50ZWQgdG8gYnkgUzEgc3VjaCB0aGF0IGlmIHdjc2NtcCBpcworICAgYXBwbGllZCB0byB0d28gdHJhbnNmb3JtZWQgc3RyaW5ncyB0aGUgcmVzdWx0IGlzIHRoZSBhcyBhcHBseWluZworICAgYHdjc2NvbGwnIHRvIHRoZSBvcmlnaW5hbCBzdHJpbmdzLiAgKi8KK2V4dGVybiBzaXplX3Qgd2NzeGZybSAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLAorCQkgICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczIsIHNpemVfdCBfX24pIF9fVEhST1c7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLOAorLyogU2ltaWxhciB0byB0aGUgdHdvIGZ1bmN0aW9ucyBhYm92ZSBidXQgdGFrZSB0aGUgaW5mb3JtYXRpb24gZnJvbQorICAgdGhlIHByb3ZpZGVkIGxvY2FsZSBhbmQgbm90IHRoZSBnbG9iYWwgbG9jYWxlLiAgKi8KKworLyogQ29tcGFyZSBTMSBhbmQgUzIsIGJvdGggaW50ZXJwcmV0ZWQgYXMgYXBwcm9wcmlhdGUgdG8gdGhlCisgICBMQ19DT0xMQVRFIGNhdGVnb3J5IG9mIHRoZSBnaXZlbiBsb2NhbGUuICAqLworZXh0ZXJuIGludCB3Y3Njb2xsX2wgKF9fY29uc3Qgd2NoYXJfdCAqX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3MyLAorCQkgICAgICBfX2xvY2FsZV90IF9fbG9jKSBfX1RIUk9XOworCisvKiBUcmFuc2Zvcm0gUzIgaW50byBhcnJheSBwb2ludGVkIHRvIGJ5IFMxIHN1Y2ggdGhhdCBpZiB3Y3NjbXAgaXMKKyAgIGFwcGxpZWQgdG8gdHdvIHRyYW5zZm9ybWVkIHN0cmluZ3MgdGhlIHJlc3VsdCBpcyB0aGUgYXMgYXBwbHlpbmcKKyAgIGB3Y3Njb2xsJyB0byB0aGUgb3JpZ2luYWwgc3RyaW5ncy4gICovCitleHRlcm4gc2l6ZV90IHdjc3hmcm1fbCAod2NoYXJfdCAqX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3MyLAorCQkJIHNpemVfdCBfX24sIF9fbG9jYWxlX3QgX19sb2MpIF9fVEhST1c7CisKKy8qIER1cGxpY2F0ZSBTLCByZXR1cm5pbmcgYW4gaWRlbnRpY2FsIG1hbGxvYydkIHN0cmluZy4gICovCitleHRlcm4gd2NoYXJfdCAqd2NzZHVwIChfX2NvbnN0IHdjaGFyX3QgKl9fcykgX19USFJPVyBfX2F0dHJpYnV0ZV9tYWxsb2NfXzsKKyNlbmRpZgorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgV0MgaW4gV0NTLiAgKi8KKyNpZmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9XQ0hBUl9IX1BST1RPCitleHRlcm4gIkMrKyIgd2NoYXJfdCAqd2NzY2hyICh3Y2hhcl90ICpfX3djcywgd2NoYXJfdCBfX3djKQorICAgICBfX1RIUk9XIF9fYXNtICgid2NzY2hyIikgX19hdHRyaWJ1dGVfcHVyZV9fOworZXh0ZXJuICJDKysiIF9fY29uc3Qgd2NoYXJfdCAqd2NzY2hyIChfX2NvbnN0IHdjaGFyX3QgKl9fd2NzLCB3Y2hhcl90IF9fd2MpCisgICAgIF9fVEhST1cgX19hc20gKCJ3Y3NjaHIiKSBfX2F0dHJpYnV0ZV9wdXJlX187CisjZWxzZQorZXh0ZXJuIHdjaGFyX3QgKndjc2NociAoX19jb25zdCB3Y2hhcl90ICpfX3djcywgd2NoYXJfdCBfX3djKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXzsKKyNlbmRpZgorLyogRmluZCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIFdDIGluIFdDUy4gICovCisjaWZkZWYgX19DT1JSRUNUX0lTT19DUFBfV0NIQVJfSF9QUk9UTworZXh0ZXJuICJDKysiIHdjaGFyX3QgKndjc3JjaHIgKHdjaGFyX3QgKl9fd2NzLCB3Y2hhcl90IF9fd2MpCisgICAgIF9fVEhST1cgX19hc20gKCJ3Y3NyY2hyIikgX19hdHRyaWJ1dGVfcHVyZV9fOworZXh0ZXJuICJDKysiIF9fY29uc3Qgd2NoYXJfdCAqd2NzcmNociAoX19jb25zdCB3Y2hhcl90ICpfX3djcywgd2NoYXJfdCBfX3djKQorICAgICBfX1RIUk9XIF9fYXNtICgid2NzcmNociIpIF9fYXR0cmlidXRlX3B1cmVfXzsKKyNlbHNlCitleHRlcm4gd2NoYXJfdCAqd2NzcmNociAoX19jb25zdCB3Y2hhcl90ICpfX3djcywgd2NoYXJfdCBfX3djKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXzsKKyNlbmRpZgorX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYgX19VU0VfR05VCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gYHdjc2NocicuICBCdXQgaXQgcmV0dXJucyBhIHBvaW50ZXIgdG8KKyAgIHRoZSBjbG9zaW5nIE5VTCB3aWRlIGNoYXJhY3RlciBpbiBjYXNlIEMgaXMgbm90IGZvdW5kIGluIFMuICAqLworZXh0ZXJuIHdjaGFyX3QgKndjc2Nocm51bCAoX19jb25zdCB3Y2hhcl90ICpfX3MsIHdjaGFyX3QgX193YykKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CisjZW5kaWYKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW5pdGlhbCBzZWdtZXQgb2YgV0NTIHdoaWNoCisgICBjb25zaXN0cyBlbnRpcmVseSBvZiB3aWRlIGNoYXJhY3RlcnMgbm90IGluIFJFSkVDVC4gICovCitleHRlcm4gc2l6ZV90IHdjc2NzcG4gKF9fY29uc3Qgd2NoYXJfdCAqX193Y3MsIF9fY29uc3Qgd2NoYXJfdCAqX19yZWplY3QpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgc2VnbWV0IG9mIFdDUyB3aGljaAorICAgY29uc2lzdHMgZW50aXJlbHkgb2Ygd2lkZSBjaGFyYWN0ZXJzIGluICBBQ0NFUFQuICAqLworZXh0ZXJuIHNpemVfdCB3Y3NzcG4gKF9fY29uc3Qgd2NoYXJfdCAqX193Y3MsIF9fY29uc3Qgd2NoYXJfdCAqX19hY2NlcHQpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworLyogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBpbiBXQ1Mgb2YgYW55IGNoYXJhY3RlciBpbiBBQ0NFUFQuICAqLworI2lmZGVmIF9fQ09SUkVDVF9JU09fQ1BQX1dDSEFSX0hfUFJPVE8KK2V4dGVybiAiQysrIiB3Y2hhcl90ICp3Y3NwYnJrICh3Y2hhcl90ICpfX3djcywgX19jb25zdCB3Y2hhcl90ICpfX2FjY2VwdCkKKyAgICAgX19USFJPVyBfX2FzbSAoIndjc3BicmsiKSBfX2F0dHJpYnV0ZV9wdXJlX187CitleHRlcm4gIkMrKyIgX19jb25zdCB3Y2hhcl90ICp3Y3NwYnJrIChfX2NvbnN0IHdjaGFyX3QgKl9fd2NzLAorCQkJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fYWNjZXB0KQorICAgICBfX1RIUk9XIF9fYXNtICgid2NzcGJyayIpIF9fYXR0cmlidXRlX3B1cmVfXzsKKyNlbHNlCitleHRlcm4gd2NoYXJfdCAqd2NzcGJyayAoX19jb25zdCB3Y2hhcl90ICpfX3djcywgX19jb25zdCB3Y2hhcl90ICpfX2FjY2VwdCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CisjZW5kaWYKKy8qIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgTkVFRExFIGluIEhBWVNUQUNLLiAgKi8KKyNpZmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9XQ0hBUl9IX1BST1RPCitleHRlcm4gIkMrKyIgd2NoYXJfdCAqd2Nzc3RyICh3Y2hhcl90ICpfX2hheXN0YWNrLCBfX2NvbnN0IHdjaGFyX3QgKl9fbmVlZGxlKQorICAgICBfX1RIUk9XIF9fYXNtICgid2Nzc3RyIikgX19hdHRyaWJ1dGVfcHVyZV9fOworZXh0ZXJuICJDKysiIF9fY29uc3Qgd2NoYXJfdCAqd2Nzc3RyIChfX2NvbnN0IHdjaGFyX3QgKl9faGF5c3RhY2ssCisJCQkJICAgICAgX19jb25zdCB3Y2hhcl90ICpfX25lZWRsZSkKKyAgICAgX19USFJPVyBfX2FzbSAoIndjc3N0ciIpIF9fYXR0cmlidXRlX3B1cmVfXzsKKyNlbHNlCitleHRlcm4gd2NoYXJfdCAqd2Nzc3RyIChfX2NvbnN0IHdjaGFyX3QgKl9faGF5c3RhY2ssIF9fY29uc3Qgd2NoYXJfdCAqX19uZWVkbGUpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworI2VuZGlmCisKKy8qIERpdmlkZSBXQ1MgaW50byB0b2tlbnMgc2VwYXJhdGVkIGJ5IGNoYXJhY3RlcnMgaW4gREVMSU0uICAqLworZXh0ZXJuIHdjaGFyX3QgKndjc3RvayAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsCisJCQlfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZWxpbSwKKwkJCXdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fcHRyKSBfX1RIUk9XOworCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiB3aWRlIGNoYXJhY3RlcnMgaW4gUy4gICovCitleHRlcm4gc2l6ZV90IHdjc2xlbiAoX19jb25zdCB3Y2hhcl90ICpfX3MpIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYgX19VU0VfWE9QRU4KKy8qIEFub3RoZXIgbmFtZSBmb3IgYHdjc3N0cicgZnJvbSBYUEc0LiAgKi8KKyMgaWZkZWYgX19DT1JSRUNUX0lTT19DUFBfV0NIQVJfSF9QUk9UTworZXh0ZXJuICJDKysiIHdjaGFyX3QgKndjc3djcyAod2NoYXJfdCAqX19oYXlzdGFjaywgX19jb25zdCB3Y2hhcl90ICpfX25lZWRsZSkKKyAgICAgX19USFJPVyBfX2FzbSAoIndjc3djcyIpIF9fYXR0cmlidXRlX3B1cmVfXzsKK2V4dGVybiAiQysrIiBfX2NvbnN0IHdjaGFyX3QgKndjc3djcyAoX19jb25zdCB3Y2hhcl90ICpfX2hheXN0YWNrLAorCQkJCSAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19uZWVkbGUpCisgICAgIF9fVEhST1cgX19hc20gKCJ3Y3N3Y3MiKSBfX2F0dHJpYnV0ZV9wdXJlX187CisjIGVsc2UKK2V4dGVybiB3Y2hhcl90ICp3Y3N3Y3MgKF9fY29uc3Qgd2NoYXJfdCAqX19oYXlzdGFjaywgX19jb25zdCB3Y2hhcl90ICpfX25lZWRsZSkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX1hPUEVOMks4CisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiB3aWRlIGNoYXJhY3RlcnMgaW4gUywgYnV0IGF0IG1vc3QgTUFYTEVOLiAgKi8KK2V4dGVybiBzaXplX3Qgd2NzbmxlbiAoX19jb25zdCB3Y2hhcl90ICpfX3MsIHNpemVfdCBfX21heGxlbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CisjZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFNlYXJjaCBOIHdpZGUgY2hhcmFjdGVycyBvZiBTIGZvciBDLiAgKi8KKyNpZmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9XQ0hBUl9IX1BST1RPCitleHRlcm4gIkMrKyIgd2NoYXJfdCAqd21lbWNociAod2NoYXJfdCAqX19zLCB3Y2hhcl90IF9fYywgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX2FzbSAoIndtZW1jaHIiKSBfX2F0dHJpYnV0ZV9wdXJlX187CitleHRlcm4gIkMrKyIgX19jb25zdCB3Y2hhcl90ICp3bWVtY2hyIChfX2NvbnN0IHdjaGFyX3QgKl9fcywgd2NoYXJfdCBfX2MsCisJCQkJICAgICAgIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19hc20gKCJ3bWVtY2hyIikgX19hdHRyaWJ1dGVfcHVyZV9fOworI2Vsc2UKK2V4dGVybiB3Y2hhcl90ICp3bWVtY2hyIChfX2NvbnN0IHdjaGFyX3QgKl9fcywgd2NoYXJfdCBfX2MsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworI2VuZGlmCisKKy8qIENvbXBhcmUgTiB3aWRlIGNoYXJhY3RlcnMgb2YgUzEgYW5kIFMyLiAgKi8KK2V4dGVybiBpbnQgd21lbWNtcCAoX19jb25zdCB3Y2hhcl90ICpfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fczIsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworCisvKiBDb3B5IE4gd2lkZSBjaGFyYWN0ZXJzIG9mIFNSQyB0byBERVNULiAgKi8KK2V4dGVybiB3Y2hhcl90ICp3bWVtY3B5ICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczEsCisJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczIsIHNpemVfdCBfX24pIF9fVEhST1c7CisKKy8qIENvcHkgTiB3aWRlIGNoYXJhY3RlcnMgb2YgU1JDIHRvIERFU1QsIGd1YXJhbnRlZWluZworICAgY29ycmVjdCBiZWhhdmlvciBmb3Igb3ZlcmxhcHBpbmcgc3RyaW5ncy4gICovCitleHRlcm4gd2NoYXJfdCAqd21lbW1vdmUgKHdjaGFyX3QgKl9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19zMiwgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVzsKKworLyogU2V0IE4gd2lkZSBjaGFyYWN0ZXJzIG9mIFMgdG8gQy4gICovCitleHRlcm4gd2NoYXJfdCAqd21lbXNldCAod2NoYXJfdCAqX19zLCB3Y2hhcl90IF9fYywgc2l6ZV90IF9fbikgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX0dOVQorLyogQ29weSBOIHdpZGUgY2hhcmFjdGVycyBvZiBTUkMgdG8gREVTVCBhbmQgcmV0dXJuIHBvaW50ZXIgdG8gZm9sbG93aW5nCisgICB3aWRlIGNoYXJhY3Rlci4gICovCitleHRlcm4gd2NoYXJfdCAqd21lbXBjcHkgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMSwKKwkJCSAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczIsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1c7CisjZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIERldGVybWluZSB3aGV0aGVyIEMgY29uc3RpdHV0ZXMgYSB2YWxpZCAob25lLWJ5dGUpIG11bHRpYnl0ZQorICAgY2hhcmFjdGVyLiAgKi8KK2V4dGVybiB3aW50X3QgYnRvd2MgKGludCBfX2MpIF9fVEhST1c7CisKKy8qIERldGVybWluZSB3aGV0aGVyIEMgY29ycmVzcG9uZHMgdG8gYSBtZW1iZXIgb2YgdGhlIGV4dGVuZGVkCisgICBjaGFyYWN0ZXIgc2V0IHdob3NlIG11bHRpYnl0ZSByZXByZXNlbnRhdGlvbiBpcyBhIHNpbmdsZSBieXRlLiAgKi8KK2V4dGVybiBpbnQgd2N0b2IgKHdpbnRfdCBfX2MpIF9fVEhST1c7CisKKy8qIERldGVybWluZSB3aGV0aGVyIFBTIHBvaW50cyB0byBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBpbml0aWFsCisgICBzdGF0ZS4gICovCitleHRlcm4gaW50IG1ic2luaXQgKF9fY29uc3QgbWJzdGF0ZV90ICpfX3BzKSBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXzsKKworLyogV3JpdGUgd2lkZSBjaGFyYWN0ZXIgcmVwcmVzZW50YXRpb24gb2YgbXVsdGlieXRlIGNoYXJhY3RlciBwb2ludGVkCisgICB0byBieSBTIHRvIFBXQy4gICovCitleHRlcm4gc2l6ZV90IG1icnRvd2MgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19wd2MsCisJCSAgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLAorCQkgICAgICAgbWJzdGF0ZV90ICpfX3ApIF9fVEhST1c7CisKKy8qIFdyaXRlIG11bHRpYnl0ZSByZXByZXNlbnRhdGlvbiBvZiB3aWRlIGNoYXJhY3RlciBXQyB0byBTLiAgKi8KK2V4dGVybiBzaXplX3Qgd2NydG9tYiAoY2hhciAqX19yZXN0cmljdCBfX3MsIHdjaGFyX3QgX193YywKKwkJICAgICAgIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSBfX1RIUk9XOworCisvKiBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGluIG11bHRpYnl0ZSBjaGFyYWN0ZXIgcG9pbnRlZCB0byBieSBTLiAgKi8KK2V4dGVybiBzaXplX3QgX19tYnJsZW4gKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJCQltYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykgX19USFJPVzsKK2V4dGVybiBzaXplX3QgbWJybGVuIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLAorCQkgICAgICBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCisvKiBEZWZpbmUgaW5saW5lIGZ1bmN0aW9uIGFzIG9wdGltaXphdGlvbi4gICovCisKKy8qIFdlIGNhbiB1c2UgdGhlIEJUT1dDIGFuZCBXQ1RPQiBvcHRpbWl6YXRpb25zIHNpbmNlIHdlIGtub3cgdGhhdCBhbGwKKyAgIGxvY2FsZXMgbXVzdCB1c2UgQVNDSUkgZW5jb2RpbmcgZm9yIHRoZSB2YWx1ZXMgaW4gdGhlIEFTQ0lJIHJhbmdlCisgICBhbmQgYmVjYXVzZSB0aGUgd2NoYXJfdCBlbmNvZGluZyBpcyBhbHdheXMgSVNPIDEwNjQ2LiAgKi8KK2V4dGVybiB3aW50X3QgX19idG93Y19hbGlhcyAoaW50IF9fYykgX19hc20gKCJidG93YyIpOworX19leHRlcm5faW5saW5lIHdpbnRfdAorX19OVEggKGJ0b3djIChpbnQgX19jKSkKK3sgcmV0dXJuIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19jKSAmJiBfX2MgPj0gJ1wwJyAmJiBfX2MgPD0gJ1x4N2YnCisJICA/ICh3aW50X3QpIF9fYyA6IF9fYnRvd2NfYWxpYXMgKF9fYykpOyB9CisKK2V4dGVybiBpbnQgX193Y3RvYl9hbGlhcyAod2ludF90IF9fYykgX19hc20gKCJ3Y3RvYiIpOworX19leHRlcm5faW5saW5lIGludAorX19OVEggKHdjdG9iICh3aW50X3QgX193YykpCit7IHJldHVybiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9fd2MpICYmIF9fd2MgPj0gTCdcMCcgJiYgX193YyA8PSBMJ1x4N2YnCisJICA/IChpbnQpIF9fd2MgOiBfX3djdG9iX2FsaWFzIChfX3djKSk7IH0KKworX19leHRlcm5faW5saW5lIHNpemVfdAorX19OVEggKG1icmxlbiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwKKwkgICAgICAgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpKQoreyByZXR1cm4gKF9fcHMgIT0gTlVMTAorCSAgPyBtYnJ0b3djIChOVUxMLCBfX3MsIF9fbiwgX19wcykgOiBfX21icmxlbiAoX19zLCBfX24sIE5VTEwpKTsgfQorI2VuZGlmCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogV3JpdGUgd2lkZSBjaGFyYWN0ZXIgcmVwcmVzZW50YXRpb24gb2YgbXVsdGlieXRlIGNoYXJhY3RlciBzdHJpbmcKKyAgIFNSQyB0byBEU1QuICAqLworZXh0ZXJuIHNpemVfdCBtYnNydG93Y3MgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgX19jb25zdCBjaGFyICoqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbGVuLAorCQkJIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSBfX1RIUk9XOworCisvKiBXcml0ZSBtdWx0aWJ5dGUgY2hhcmFjdGVyIHJlcHJlc2VudGF0aW9uIG9mIHdpZGUgY2hhcmFjdGVyIHN0cmluZworICAgU1JDIHRvIERTVC4gICovCitleHRlcm4gc2l6ZV90IHdjc3J0b21icyAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSBfX2NvbnN0IHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19sZW4sCisJCQkgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpIF9fVEhST1c7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKworI2lmZGVmCV9fVVNFX1hPUEVOMks4CisvKiBXcml0ZSB3aWRlIGNoYXJhY3RlciByZXByZXNlbnRhdGlvbiBvZiBhdCBtb3N0IE5NQyBieXRlcyBvZiB0aGUKKyAgIG11bHRpYnl0ZSBjaGFyYWN0ZXIgc3RyaW5nIFNSQyB0byBEU1QuICAqLworZXh0ZXJuIHNpemVfdCBtYnNucnRvd2NzICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICBfX2NvbnN0IGNoYXIgKipfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19ubWMsCisJCQkgIHNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpIF9fVEhST1c7CisKKy8qIFdyaXRlIG11bHRpYnl0ZSBjaGFyYWN0ZXIgcmVwcmVzZW50YXRpb24gb2YgYXQgbW9zdCBOV0MgY2hhcmFjdGVycworICAgZnJvbSB0aGUgd2lkZSBjaGFyYWN0ZXIgc3RyaW5nIFNSQyB0byBEU1QuICAqLworZXh0ZXJuIHNpemVfdCB3Y3NucnRvbWJzIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICBfX2NvbnN0IHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICBzaXplX3QgX19ud2MsIHNpemVfdCBfX2xlbiwKKwkJCSAgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpIF9fVEhST1c7CisjZW5kaWYJLyogdXNlIFBPU0lYIDIwMDggKi8KKworCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZXh0ZW5zaW9ucyBmb3VuZCBpbiBYL09wZW4gQ0FFLiAgKi8KKyNpZmRlZiBfX1VTRV9YT1BFTgorLyogRGV0ZXJtaW5lIG51bWJlciBvZiBjb2x1bW4gcG9zaXRpb25zIHJlcXVpcmVkIGZvciBDLiAgKi8KK2V4dGVybiBpbnQgd2N3aWR0aCAod2NoYXJfdCBfX2MpIF9fVEhST1c7CisKKy8qIERldGVybWluZSBudW1iZXIgb2YgY29sdW1uIHBvc2l0aW9ucyByZXF1aXJlZCBmb3IgZmlyc3QgTiB3aWRlCisgICBjaGFyYWN0ZXJzIChvciBmZXdlciBpZiBTIGVuZHMgYmVmb3JlIHRoaXMpIGluIFMuICAqLworZXh0ZXJuIGludCB3Y3N3aWR0aCAoX19jb25zdCB3Y2hhcl90ICpfX3MsIHNpemVfdCBfX24pIF9fVEhST1c7CisjZW5kaWYJLyogVXNlIFgvT3Blbi4gICovCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBDb252ZXJ0IGluaXRpYWwgcG9ydGlvbiBvZiB0aGUgd2lkZSBzdHJpbmcgTlBUUiB0byBgZG91YmxlJworICAgcmVwcmVzZW50YXRpb24uICAqLworZXh0ZXJuIGRvdWJsZSB3Y3N0b2QgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsCisJCSAgICAgIHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyKSBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIExpa2V3aXNlIGZvciBgZmxvYXQnIGFuZCBgbG9uZyBkb3VibGUnIHNpemVzIG9mIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuICAqLworZXh0ZXJuIGZsb2F0IHdjc3RvZiAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJICAgICB3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0cikgX19USFJPVzsKK2V4dGVybiBsb25nIGRvdWJsZSB3Y3N0b2xkIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJICAgIHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyKSBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmIC8qIEM5OSAqLworCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogQ29udmVydCBpbml0aWFsIHBvcnRpb24gb2Ygd2lkZSBzdHJpbmcgTlBUUiB0byBgbG9uZyBpbnQnCisgICByZXByZXNlbnRhdGlvbi4gICovCitleHRlcm4gbG9uZyBpbnQgd2NzdG9sIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpIF9fVEhST1c7CisKKy8qIENvbnZlcnQgaW5pdGlhbCBwb3J0aW9uIG9mIHdpZGUgc3RyaW5nIE5QVFIgdG8gYHVuc2lnbmVkIGxvbmcgaW50JworICAgcmVwcmVzZW50YXRpb24uICAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IHdjc3RvdWwgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsCisJCQkJICB3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSkKKyAgICAgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmIGRlZmluZWQgX19VU0VfSVNPQzk5IHx8IChkZWZpbmVkIF9fR05VQ19fICYmIGRlZmluZWQgX19VU0VfR05VKQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBDb252ZXJ0IGluaXRpYWwgcG9ydGlvbiBvZiB3aWRlIHN0cmluZyBOUFRSIHRvIGBsb25nIGxvbmcgaW50JworICAgcmVwcmVzZW50YXRpb24uICAqLworX19leHRlbnNpb25fXworZXh0ZXJuIGxvbmcgbG9uZyBpbnQgd2NzdG9sbCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCSAgICAgIHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlKQorICAgICBfX1RIUk9XOworCisvKiBDb252ZXJ0IGluaXRpYWwgcG9ydGlvbiBvZiB3aWRlIHN0cmluZyBOUFRSIHRvIGB1bnNpZ25lZCBsb25nIGxvbmcgaW50JworICAgcmVwcmVzZW50YXRpb24uICAqLworX19leHRlbnNpb25fXworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgd2NzdG91bGwgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsCisJCQkJCXdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLAorCQkJCQlpbnQgX19iYXNlKSBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmIC8qIElTTyBDOTkgb3IgR0NDIGFuZCBHTlUuICAqLworCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBkZWZpbmVkIF9fVVNFX0dOVQorLyogQ29udmVydCBpbml0aWFsIHBvcnRpb24gb2Ygd2lkZSBzdHJpbmcgTlBUUiB0byBgbG9uZyBsb25nIGludCcKKyAgIHJlcHJlc2VudGF0aW9uLiAgKi8KK19fZXh0ZW5zaW9uX18KK2V4dGVybiBsb25nIGxvbmcgaW50IHdjc3RvcSAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCSAgICAgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpCisgICAgIF9fVEhST1c7CisKKy8qIENvbnZlcnQgaW5pdGlhbCBwb3J0aW9uIG9mIHdpZGUgc3RyaW5nIE5QVFIgdG8gYHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQnCisgICByZXByZXNlbnRhdGlvbi4gICovCitfX2V4dGVuc2lvbl9fCitleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIGludCB3Y3N0b3VxIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJCSAgICAgICB3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwKKwkJCQkgICAgICAgaW50IF9fYmFzZSkgX19USFJPVzsKKyNlbmRpZiAvKiBHQ0MgYW5kIHVzZSBHTlUuICAqLworCisjaWZkZWYgX19VU0VfR05VCisvKiBUaGUgY29uY2VwdCBvZiBvbmUgc3RhdGljIGxvY2FsZSBwZXIgY2F0ZWdvcnkgaXMgbm90IHZlcnkgd2VsbAorICAgdGhvdWdodCBvdXQuICBNYW55IGFwcGxpY2F0aW9ucyB3aWxsIG5lZWQgdG8gcHJvY2VzcyBpdHMgZGF0YSB1c2luZworICAgaW5mb3JtYXRpb24gZnJvbSBzZXZlcmFsIGRpZmZlcmVudCBsb2NhbGVzLiAgQW5vdGhlciBhcHBsaWNhdGlvbiBpcworICAgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hdGlvbmFsaXphdGlvbiBoYW5kbGluZyBpbiB0aGUKKyAgIHVwY29taW5nIElTTyBDKysgc3RhbmRhcmQgbGlicmFyeS4gIFRvIHN1cHBvcnQgdGhpcyBhbm90aGVyIHNldCBvZgorICAgdGhlIGZ1bmN0aW9ucyB1c2luZyBsb2NhbGUgZGF0YSBleGlzdCB3aGljaCBoYXZlIGFuIGFkZGl0aW9uYWwKKyAgIGFyZ3VtZW50LgorCisgICBBdHRlbnRpb246IGFsbCB0aGVzZSBmdW5jdGlvbnMgYXJlICpub3QqIHN0YW5kYXJkaXplZCBpbiBhbnkgZm9ybS4KKyAgIFRoaXMgaXMgYSBwcm9vZi1vZi1jb25jZXB0IGltcGxlbWVudGF0aW9uLiAgKi8KKworLyogU3RydWN0dXJlIGZvciByZWVudHJhbnQgbG9jYWxlIHVzaW5nIGZ1bmN0aW9ucy4gIFRoaXMgaXMgYW4KKyAgIChhbG1vc3QpIG9wYXF1ZSB0eXBlIGZvciB0aGUgdXNlciBsZXZlbCBwcm9ncmFtcy4gICovCisjIGluY2x1ZGUgPHhsb2NhbGUuaD4KKworLyogU3BlY2lhbCB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlIHdoaWNoIHRha2UgdGhlIGxvY2FsZSB0bworICAgdXNlIGFzIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyLiAgKi8KK2V4dGVybiBsb25nIGludCB3Y3N0b2xfbCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCSAgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UsCisJCQkgIF9fbG9jYWxlX3QgX19sb2MpIF9fVEhST1c7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIGludCB3Y3N0b3VsX2wgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsCisJCQkJICAgIHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLAorCQkJCSAgICBpbnQgX19iYXNlLCBfX2xvY2FsZV90IF9fbG9jKSBfX1RIUk9XOworCitfX2V4dGVuc2lvbl9fCitleHRlcm4gbG9uZyBsb25nIGludCB3Y3N0b2xsX2wgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsCisJCQkJd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCisJCQkJaW50IF9fYmFzZSwgX19sb2NhbGVfdCBfX2xvYykgX19USFJPVzsKKworX19leHRlbnNpb25fXworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgd2NzdG91bGxfbCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQkJICB3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwKKwkJCQkJICBpbnQgX19iYXNlLCBfX2xvY2FsZV90IF9fbG9jKQorICAgICBfX1RIUk9XOworCitleHRlcm4gZG91YmxlIHdjc3RvZF9sIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIF9fbG9jYWxlX3QgX19sb2MpCisgICAgIF9fVEhST1c7CisKK2V4dGVybiBmbG9hdCB3Y3N0b2ZfbCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJICAgICAgIHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBfX2xvY2FsZV90IF9fbG9jKQorICAgICBfX1RIUk9XOworCitleHRlcm4gbG9uZyBkb3VibGUgd2NzdG9sZF9sIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJICAgICAgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCisJCQkgICAgICBfX2xvY2FsZV90IF9fbG9jKSBfX1RIUk9XOworI2VuZGlmCS8qIHVzZSBHTlUgKi8KKworCisjaWZkZWYgX19VU0VfWE9QRU4ySzgKKy8qIENvcHkgU1JDIHRvIERFU1QsIHJldHVybmluZyB0aGUgYWRkcmVzcyBvZiB0aGUgdGVybWluYXRpbmcgTCdcMCcgaW4KKyAgIERFU1QuICAqLworZXh0ZXJuIHdjaGFyX3QgKndjcGNweSAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQlfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMpIF9fVEhST1c7CisKKy8qIENvcHkgbm8gbW9yZSB0aGFuIE4gY2hhcmFjdGVycyBvZiBTUkMgdG8gREVTVCwgcmV0dXJuaW5nIHRoZSBhZGRyZXNzIG9mCisgICB0aGUgbGFzdCBjaGFyYWN0ZXIgd3JpdHRlbiBpbnRvIERFU1QuICAqLworZXh0ZXJuIHdjaGFyX3QgKndjcG5jcHkgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVzsKKworCisvKiBXaWRlIGNoYXJhY3RlciBJL08gZnVuY3Rpb25zLiAgKi8KKworLyogTGlrZSBPUEVOX01FTVNUUkVBTSwgYnV0IHRoZSBzdHJlYW0gaXMgd2lkZSBvcmllbnRlZCBhbmQgcHJvZHVjZXMKKyAgIGEgd2lkZSBjaGFyYWN0ZXIgc3RyaW5nLiAgKi8KK2V4dGVybiBfX0ZJTEUgKm9wZW5fd21lbXN0cmVhbSAod2NoYXJfdCAqKl9fYnVmbG9jLCBzaXplX3QgKl9fc2l6ZWxvYykgX19USFJPVzsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9JU09DOTUgfHwgZGVmaW5lZCBfX1VTRV9VTklYOTgKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorCisvKiBTZWxlY3Qgb3JpZW50YXRpb24gZm9yIHN0cmVhbS4gICovCitleHRlcm4gaW50IGZ3aWRlIChfX0ZJTEUgKl9fZnAsIGludCBfX21vZGUpIF9fVEhST1c7CisKKworLyogV3JpdGUgZm9ybWF0dGVkIG91dHB1dCB0byBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmd3ByaW50ZiAoX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCQkgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKQorICAgICAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193cHJpbnRmX18sIDIsIDMpKSkgKi87CisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIHN0ZG91dC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHdwcmludGYgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKQorICAgICAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193cHJpbnRmX18sIDEsIDIpKSkgKi87CisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IG9mIGF0IG1vc3QgTiBjaGFyYWN0ZXJzIHRvIFMuICAqLworZXh0ZXJuIGludCBzd3ByaW50ZiAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJCSAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pCisgICAgIF9fVEhST1cgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3ByaW50Zl9fLCAzLCA0KSkpICovOworCisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIFMgZnJvbSBhcmd1bWVudCBsaXN0IEFSRy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHZmd3ByaW50ZiAoX19GSUxFICpfX3Jlc3RyaWN0IF9fcywKKwkJICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkgICAgICBfX2dudWNfdmFfbGlzdCBfX2FyZykKKyAgICAgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3ByaW50Zl9fLCAyLCAwKSkpICovOworLyogV3JpdGUgZm9ybWF0dGVkIG91dHB1dCB0byBzdGRvdXQgZnJvbSBhcmd1bWVudCBsaXN0IEFSRy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHZ3cHJpbnRmIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCSAgICAgX19nbnVjX3ZhX2xpc3QgX19hcmcpCisgICAgIC8qIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3dwcmludGZfXywgMSwgMCkpKSAqLzsKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgb2YgYXQgbW9zdCBOIGNoYXJhY3RlciB0byBTIGZyb20gYXJndW1lbnQKKyAgIGxpc3QgQVJHLiAgKi8KK2V4dGVybiBpbnQgdnN3cHJpbnRmICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwKKwkJICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkgICAgICBfX2dudWNfdmFfbGlzdCBfX2FyZykKKyAgICAgX19USFJPVyAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193cHJpbnRmX18sIDMsIDApKSkgKi87CisKKworLyogUmVhZCBmb3JtYXR0ZWQgaW5wdXQgZnJvbSBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmd3NjYW5mIChfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJCSAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikKKyAgICAgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3NjYW5mX18sIDIsIDMpKSkgKi87CisvKiBSZWFkIGZvcm1hdHRlZCBpbnB1dCBmcm9tIHN0ZGluLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgd3NjYW5mIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikKKyAgICAgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3NjYW5mX18sIDEsIDIpKSkgKi87CisvKiBSZWFkIGZvcm1hdHRlZCBpbnB1dCBmcm9tIFMuICAqLworZXh0ZXJuIGludCBzd3NjYW5mIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLAorCQkgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pCisgICAgIF9fVEhST1cgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3NjYW5mX18sIDIsIDMpKSkgKi87CisKKyMgaWYgZGVmaW5lZCBfX1VTRV9JU09DOTkgJiYgIWRlZmluZWQgX19VU0VfR05VIFwKKyAgICAgJiYgKCFkZWZpbmVkIF9fTERCTF9DT01QQVQgfHwgIWRlZmluZWQgX19SRURJUkVDVCkgXAorICAgICAmJiAoZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLKQorIyAgaWZkZWYgX19SRURJUkVDVAorLyogRm9yIHN0cmljdCBJU08gQzk5IG9yIFBPU0lYIGNvbXBsaWFuY2UgZGlzYWxsb3cgJWFzLCAlYVMgYW5kICVhWworICAgR05VIGV4dGVuc2lvbiB3aGljaCBjb25mbGljdHMgd2l0aCB2YWxpZCAlYSBmb2xsb3dlZCBieSBsZXR0ZXIKKyAgIHMsIFMgb3IgWy4gICovCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKGZ3c2NhbmYsIChfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSwKKwkJICAgICAgIF9faXNvYzk5X2Z3c2NhbmYpCisgICAgIC8qIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3dzY2FuZl9fLCAyLCAzKSkpICovOworZXh0ZXJuIGludCBfX1JFRElSRUNUICh3c2NhbmYsIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLiksCisJCSAgICAgICBfX2lzb2M5OV93c2NhbmYpCisgICAgIC8qIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3dzY2FuZl9fLCAxLCAyKSkpICovOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoc3dzY2FuZiwgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MsCisJCQkJICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkJICAgICAuLi4pLCBfX2lzb2M5OV9zd3NjYW5mKQorICAgICAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193c2NhbmZfXywgMiwgMykpKSAqLzsKKyMgIGVsc2UKK2V4dGVybiBpbnQgX19pc29jOTlfZndzY2FuZiAoX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCQkJICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLik7CitleHRlcm4gaW50IF9faXNvYzk5X3dzY2FuZiAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pOworZXh0ZXJuIGludCBfX2lzb2M5OV9zd3NjYW5mIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLAorCQkJICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikKKyAgICAgX19USFJPVzsKKyMgICBkZWZpbmUgZndzY2FuZiBfX2lzb2M5OV9md3NjYW5mCisjICAgZGVmaW5lIHdzY2FuZiBfX2lzb2M5OV93c2NhbmYKKyMgICBkZWZpbmUgc3dzY2FuZiBfX2lzb2M5OV9zd3NjYW5mCisjICBlbmRpZgorIyBlbmRpZgorCitfX0VORF9OQU1FU1BBQ0VfU1RECisjZW5kaWYgLyogVXNlIElTTyBDOTUsIEM5OSBhbmQgVW5peDk4LiAqLworCisjaWZkZWYgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIFJlYWQgZm9ybWF0dGVkIGlucHV0IGZyb20gUyBpbnRvIGFyZ3VtZW50IGxpc3QgQVJHLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgdmZ3c2NhbmYgKF9fRklMRSAqX19yZXN0cmljdCBfX3MsCisJCSAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkgICAgIF9fZ251Y192YV9saXN0IF9fYXJnKQorICAgICAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193c2NhbmZfXywgMiwgMCkpKSAqLzsKKy8qIFJlYWQgZm9ybWF0dGVkIGlucHV0IGZyb20gc3RkaW4gaW50byBhcmd1bWVudCBsaXN0IEFSRy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHZ3c2NhbmYgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJICAgIF9fZ251Y192YV9saXN0IF9fYXJnKQorICAgICAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193c2NhbmZfXywgMSwgMCkpKSAqLzsKKy8qIFJlYWQgZm9ybWF0dGVkIGlucHV0IGZyb20gUyBpbnRvIGFyZ3VtZW50IGxpc3QgQVJHLiAgKi8KK2V4dGVybiBpbnQgdnN3c2NhbmYgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MsCisJCSAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkgICAgIF9fZ251Y192YV9saXN0IF9fYXJnKQorICAgICBfX1RIUk9XIC8qIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3dzY2FuZl9fLCAyLCAwKSkpICovOworCisjIGlmICFkZWZpbmVkIF9fVVNFX0dOVSBcCisgICAgICYmICghZGVmaW5lZCBfX0xEQkxfQ09NUEFUIHx8ICFkZWZpbmVkIF9fUkVESVJFQ1QpIFwKKyAgICAgJiYgKGRlZmluZWQgX19TVFJJQ1RfQU5TSV9fIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySykKKyMgIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBpbnQgX19SRURJUkVDVCAodmZ3c2NhbmYsIChfX0ZJTEUgKl9fcmVzdHJpY3QgX19zLAorCQkJCSAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJCSAgX19nbnVjX3ZhX2xpc3QgX19hcmcpLCBfX2lzb2M5OV92ZndzY2FuZikKKyAgICAgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3NjYW5mX18sIDIsIDApKSkgKi87CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKHZ3c2NhbmYsIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkJIF9fZ251Y192YV9saXN0IF9fYXJnKSwgX19pc29jOTlfdndzY2FuZikKKyAgICAgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3NjYW5mX18sIDEsIDApKSkgKi87CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIICh2c3dzY2FuZiwgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MsCisJCQkJICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJCSAgICAgIF9fZ251Y192YV9saXN0IF9fYXJnKSwgX19pc29jOTlfdnN3c2NhbmYpCisgICAgIC8qIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3dzY2FuZl9fLCAyLCAwKSkpICovOworIyAgZWxzZQorZXh0ZXJuIGludCBfX2lzb2M5OV92ZndzY2FuZiAoX19GSUxFICpfX3Jlc3RyaWN0IF9fcywKKwkJCSAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgICAgIF9fZ251Y192YV9saXN0IF9fYXJnKTsKK2V4dGVybiBpbnQgX19pc29jOTlfdndzY2FuZiAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICAgICBfX2dudWNfdmFfbGlzdCBfX2FyZyk7CitleHRlcm4gaW50IF9faXNvYzk5X3Zzd3NjYW5mIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLAorCQkJICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICAgICAgX19nbnVjX3ZhX2xpc3QgX19hcmcpIF9fVEhST1c7CisjICAgZGVmaW5lIHZmd3NjYW5mIF9faXNvYzk5X3Zmd3NjYW5mCisjICAgZGVmaW5lIHZ3c2NhbmYgX19pc29jOTlfdndzY2FuZgorIyAgIGRlZmluZSB2c3dzY2FuZiBfX2lzb2M5OV92c3dzY2FuZgorIyAgZW5kaWYKKyMgZW5kaWYKKworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmIC8qIFVzZSBJU08gQzk5LiAqLworCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmVhZCBhIGNoYXJhY3RlciBmcm9tIFNUUkVBTS4KKworICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnRzIGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB3aW50X3QgZmdldHdjIChfX0ZJTEUgKl9fc3RyZWFtKTsKK2V4dGVybiB3aW50X3QgZ2V0d2MgKF9fRklMRSAqX19zdHJlYW0pOworCisvKiBSZWFkIGEgY2hhcmFjdGVyIGZyb20gc3RkaW4uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHdpbnRfdCBnZXR3Y2hhciAodm9pZCk7CisKKworLyogV3JpdGUgYSBjaGFyYWN0ZXIgdG8gU1RSRUFNLgorCisgICBUaGVzZSBmdW5jdGlvbnMgYXJlIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHdpbnRfdCBmcHV0d2MgKHdjaGFyX3QgX193YywgX19GSUxFICpfX3N0cmVhbSk7CitleHRlcm4gd2ludF90IHB1dHdjICh3Y2hhcl90IF9fd2MsIF9fRklMRSAqX19zdHJlYW0pOworCisvKiBXcml0ZSBhIGNoYXJhY3RlciB0byBzdGRvdXQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHdpbnRfdCBwdXR3Y2hhciAod2NoYXJfdCBfX3djKTsKKworCisvKiBHZXQgYSBuZXdsaW5lLXRlcm1pbmF0ZWQgd2lkZSBjaGFyYWN0ZXIgc3RyaW5nIG9mIGZpbml0ZSBsZW5ndGgKKyAgIGZyb20gU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB3Y2hhcl90ICpmZ2V0d3MgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX193cywgaW50IF9fbiwKKwkJCV9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSk7CisKKy8qIFdyaXRlIGEgc3RyaW5nIHRvIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZwdXR3cyAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fd3MsCisJCSAgIF9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSk7CisKKworLyogUHVzaCBhIGNoYXJhY3RlciBiYWNrIG9udG8gdGhlIGlucHV0IGJ1ZmZlciBvZiBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHdpbnRfdCB1bmdldHdjICh3aW50X3QgX193YywgX19GSUxFICpfX3N0cmVhbSk7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVGhlc2UgYXJlIGRlZmluZWQgdG8gYmUgZXF1aXZhbGVudCB0byB0aGUgYGNoYXInIGZ1bmN0aW9ucyBkZWZpbmVkCisgICBpbiBQT1NJWC4xOjE5OTYuCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIHRoZXkgYXJlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHdpbnRfdCBnZXR3Y191bmxvY2tlZCAoX19GSUxFICpfX3N0cmVhbSk7CitleHRlcm4gd2ludF90IGdldHdjaGFyX3VubG9ja2VkICh2b2lkKTsKKworLyogVGhpcyBpcyB0aGUgd2lkZSBjaGFyYWN0ZXIgdmVyc2lvbiBvZiBhIEdOVSBleHRlbnNpb24uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB3aW50X3QgZmdldHdjX3VubG9ja2VkIChfX0ZJTEUgKl9fc3RyZWFtKTsKKworLyogRmFzdGVyIHZlcnNpb24gd2hlbiBsb2NraW5nIGlzIG5vdCBuZWNlc3NhcnkuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB3aW50X3QgZnB1dHdjX3VubG9ja2VkICh3Y2hhcl90IF9fd2MsIF9fRklMRSAqX19zdHJlYW0pOworCisvKiBUaGVzZSBhcmUgZGVmaW5lZCB0byBiZSBlcXVpdmFsZW50IHRvIHRoZSBgY2hhcicgZnVuY3Rpb25zIGRlZmluZWQKKyAgIGluIFBPU0lYLjE6MTk5Ni4KKworICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gdGhleSBhcmUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gd2ludF90IHB1dHdjX3VubG9ja2VkICh3Y2hhcl90IF9fd2MsIF9fRklMRSAqX19zdHJlYW0pOworZXh0ZXJuIHdpbnRfdCBwdXR3Y2hhcl91bmxvY2tlZCAod2NoYXJfdCBfX3djKTsKKworCisvKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHNhbWUgYXMgYGZnZXR3cycgYnV0IGRvZXMgbm90IGxvY2sgdGhlIHN0cmVhbS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHdjaGFyX3QgKmZnZXR3c191bmxvY2tlZCAod2NoYXJfdCAqX19yZXN0cmljdCBfX3dzLCBpbnQgX19uLAorCQkJCSBfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pOworCisvKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHNhbWUgYXMgYGZwdXR3cycgYnV0IGRvZXMgbm90IGxvY2sgdGhlIHN0cmVhbS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmcHV0d3NfdW5sb2NrZWQgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3dzLAorCQkJICAgIF9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSk7CisjZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIEZvcm1hdCBUUCBpbnRvIFMgYWNjb3JkaW5nIHRvIEZPUk1BVC4KKyAgIFdyaXRlIG5vIG1vcmUgdGhhbiBNQVhTSVpFIHdpZGUgY2hhcmFjdGVycyBhbmQgcmV0dXJuIHRoZSBudW1iZXIKKyAgIG9mIHdpZGUgY2hhcmFjdGVycyB3cml0dGVuLCBvciAwIGlmIGl0IHdvdWxkIGV4Y2VlZCBNQVhTSVpFLiAgKi8KK2V4dGVybiBzaXplX3Qgd2NzZnRpbWUgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19tYXhzaXplLAorCQkJX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJX19jb25zdCBzdHJ1Y3QgdG0gKl9fcmVzdHJpY3QgX190cCkgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9DOTkKKworIyBpZmRlZiBfX1VTRV9HTlUKKyMgaW5jbHVkZSA8eGxvY2FsZS5oPgorCisvKiBTaW1pbGFyIHRvIGB3Y3NmdGltZScgYnV0IHRha2VzIHRoZSBpbmZvcm1hdGlvbiBmcm9tCisgICB0aGUgcHJvdmlkZWQgbG9jYWxlIGFuZCBub3QgdGhlIGdsb2JhbCBsb2NhbGUuICAqLworZXh0ZXJuIHNpemVfdCB3Y3NmdGltZV9sICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbWF4c2l6ZSwKKwkJCSAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICBfX2NvbnN0IHN0cnVjdCB0bSAqX19yZXN0cmljdCBfX3RwLAorCQkJICBfX2xvY2FsZV90IF9fbG9jKSBfX1RIUk9XOworIyBlbmRpZgorCisvKiBUaGUgWC9PcGVuIHN0YW5kYXJkIGRlbWFuZHMgdGhhdCBtb3N0IG9mIHRoZSBmdW5jdGlvbnMgZGVmaW5lZCBpbgorICAgdGhlIDx3Y3R5cGUuaD4gaGVhZGVyIG11c3QgYWxzbyBhcHBlYXIgaGVyZS4gIFRoaXMgaXMgcHJvYmFibHkKKyAgIGJlY2F1c2Ugc29tZSBYL09wZW4gbWVtYmVycyB3cm90ZSB0aGVpciBpbXBsZW1lbnRhdGlvbiBiZWZvcmUgdGhlCisgICBJU08gQyBzdGFuZGFyZCB3YXMgcHVibGlzaGVkIGFuZCBpbnRyb2R1Y2VkIHRoZSBiZXR0ZXIgc29sdXRpb24uCisgICBXZSBoYXZlIHRvIHByb3ZpZGUgdGhlc2UgZGVmaW5pdGlvbnMgZm9yIGNvbXBsaWFuY2UgcmVhc29ucyBidXQgd2UKKyAgIGRvIHRoaXMgbm9uc2Vuc2Ugb25seSBpZiByZWFsbHkgbmVjZXNzYXJ5LiAgKi8KKyNpZiBkZWZpbmVkIF9fVVNFX1VOSVg5OCAmJiAhZGVmaW5lZCBfX1VTRV9HTlUKKyMgZGVmaW5lIF9fbmVlZF9pc3d4eHgKKyMgaW5jbHVkZSA8d2N0eXBlLmg+CisjZW5kaWYKKworLyogRGVmaW5lIHNvbWUgbWFjcm9zIGhlbHBpbmcgdG8gY2F0Y2ggYnVmZmVyIG92ZXJmbG93cy4gICovCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDAgJiYgZGVmaW5lZCBfX2V4dGVybl9hbHdheXNfaW5saW5lCisjIGluY2x1ZGUgPGJpdHMvd2NoYXIyLmg+CisjZW5kaWYKKworI2lmZGVmIF9fTERCTF9DT01QQVQKKyMgaW5jbHVkZSA8Yml0cy93Y2hhci1sZGJsLmg+CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIF9XQ0hBUl9IIGRlZmluZWQgKi8KKworI2VuZGlmIC8qIHdjaGFyLmggICovCisKKy8qIFVuZGVmaW5lIGFsbCBfX25lZWRfKiBjb25zdGFudHMgaW4gY2FzZSB3ZSBhcmUgaW5jbHVkZWQgdG8gZ2V0IHRob3NlCisgICBjb25zdGFudHMgYnV0IHRoZSB3aG9sZSBmaWxlIHdhcyBhbHJlYWR5IHJlYWQuICAqLworI3VuZGVmIF9fbmVlZF9tYnN0YXRlX3QKKyN1bmRlZiBfX25lZWRfd2ludF90CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3djdHlwZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS93Y3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTJmYmY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS93Y3R5cGUuaApAQCAtMCwwICsxLDMxOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDIsMjAwNSwyMDA3LTIwMDksMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCUlTTyBDOTkgU3RhbmRhcmQ6IDcuMjUKKyAqCVdpZGUgY2hhcmFjdGVyIGNsYXNzaWZpY2F0aW9uIGFuZCBtYXBwaW5nIHV0aWxpdGllcyAgPHdjdHlwZS5oPgorICovCisKKyNpZm5kZWYgX1dDVFlQRV9ICisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworI2lmbmRlZiBfX25lZWRfaXN3eHh4CisjIGRlZmluZSBfV0NUWVBFX0gJMQorCisvKiBHZXQgd2ludF90IGZyb20gPHdjaGFyLmg+LiAgKi8KKyMgZGVmaW5lIF9fbmVlZF93aW50X3QKKyMgaW5jbHVkZSA8d2NoYXIuaD4KKworLyogQ29uc3RhbnQgZXhwcmVzc2lvbiBvZiB0eXBlIGB3aW50X3QnIHdob3NlIHZhbHVlIGRvZXMgbm90IGNvcnJlc3BvbmQKKyAgIHRvIGFueSBtZW1iZXIgb2YgdGhlIGV4dGVuZGVkIGNoYXJhY3RlciBzZXQuICAqLworIyBpZm5kZWYgV0VPRgorIyAgZGVmaW5lIFdFT0YgKDB4ZmZmZmZmZmZ1KQorIyBlbmRpZgorI2VuZGlmCisjdW5kZWYgX19uZWVkX2lzd3h4eAorCisKKy8qIFRoZSBmb2xsb3dpbmcgcGFydCBpcyBhbHNvIHVzZWQgaW4gdGhlIDx3Y3NtYnMuaD4gaGVhZGVyIHdoZW4gY29tcGlsZWQKKyAgIGluIHRoZSBVbml4OTggY29tcGF0aWJpbGl0eSBtb2RlLiAgKi8KKyNpZm5kZWYgX19pc3d4eHhfZGVmaW5lZAorIyBkZWZpbmUgX19pc3d4eHhfZGVmaW5lZAkxCisKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogU2NhbGFyIHR5cGUgdGhhdCBjYW4gaG9sZCB2YWx1ZXMgd2hpY2ggcmVwcmVzZW50IGxvY2FsZS1zcGVjaWZpYworICAgY2hhcmFjdGVyIGNsYXNzaWZpY2F0aW9ucy4gICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHdjdHlwZV90OworX19FTkRfTkFNRVNQQUNFX0M5OQorCisjIGlmbmRlZiBfSVN3Yml0CisvKiBUaGUgY2hhcmFjdGVyaXN0aWNzIGFyZSBzdG9yZWQgYWx3YXlzIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAoYmlnCisgICBlbmRpYW4pLiAgV2UgZGVmaW5lIHRoZSBiaXQgdmFsdWUgaW50ZXJwcmV0YXRpb25zIGhlcmUgZGVwZW5kZW50IG9uIHRoZQorICAgbWFjaGluZSdzIGJ5dGUgb3JkZXIuICAqLworCisjICBpbmNsdWRlIDxlbmRpYW4uaD4KKyMgIGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyMgICBkZWZpbmUgX0lTd2JpdChiaXQpCSgxIDw8IChiaXQpKQorIyAgZWxzZSAvKiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOICovCisjICAgZGVmaW5lIF9JU3diaXQoYml0KQlcCisJKChiaXQpIDwgOCA/IChpbnQpICgoMVVMIDw8IChiaXQpKSA8PCAyNCkJCQkgICAgICBcCisJIDogKChiaXQpIDwgMTYgPyAoaW50KSAoKDFVTCA8PCAoYml0KSkgPDwgOCkJCQkgICAgICBcCisJICAgIDogKChiaXQpIDwgMjQgPyAoaW50KSAoKDFVTCA8PCAoYml0KSkgPj4gOCkJCQkgICAgICBcCisJICAgICAgIDogKGludCkgKCgxVUwgPDwgKGJpdCkpID4+IDI0KSkpKQorIyAgZW5kaWYKKworZW51bQoreworICBfX0lTd3VwcGVyID0gMCwJCQkvKiBVUFBFUkNBU0UuICAqLworICBfX0lTd2xvd2VyID0gMSwJCQkvKiBsb3dlcmNhc2UuICAqLworICBfX0lTd2FscGhhID0gMiwJCQkvKiBBbHBoYWJldGljLiAgKi8KKyAgX19JU3dkaWdpdCA9IDMsCQkJLyogTnVtZXJpYy4gICovCisgIF9fSVN3eGRpZ2l0ID0gNCwJCQkvKiBIZXhhZGVjaW1hbCBudW1lcmljLiAgKi8KKyAgX19JU3dzcGFjZSA9IDUsCQkJLyogV2hpdGVzcGFjZS4gICovCisgIF9fSVN3cHJpbnQgPSA2LAkJCS8qIFByaW50aW5nLiAgKi8KKyAgX19JU3dncmFwaCA9IDcsCQkJLyogR3JhcGhpY2FsLiAgKi8KKyAgX19JU3dibGFuayA9IDgsCQkJLyogQmxhbmsgKHVzdWFsbHkgU1BDIGFuZCBUQUIpLiAgKi8KKyAgX19JU3djbnRybCA9IDksCQkJLyogQ29udHJvbCBjaGFyYWN0ZXIuICAqLworICBfX0lTd3B1bmN0ID0gMTAsCQkJLyogUHVuY3R1YXRpb24uICAqLworICBfX0lTd2FsbnVtID0gMTEsCQkJLyogQWxwaGFudW1lcmljLiAgKi8KKworICBfSVN3dXBwZXIgPSBfSVN3Yml0IChfX0lTd3VwcGVyKSwJLyogVVBQRVJDQVNFLiAgKi8KKyAgX0lTd2xvd2VyID0gX0lTd2JpdCAoX19JU3dsb3dlciksCS8qIGxvd2VyY2FzZS4gICovCisgIF9JU3dhbHBoYSA9IF9JU3diaXQgKF9fSVN3YWxwaGEpLAkvKiBBbHBoYWJldGljLiAgKi8KKyAgX0lTd2RpZ2l0ID0gX0lTd2JpdCAoX19JU3dkaWdpdCksCS8qIE51bWVyaWMuICAqLworICBfSVN3eGRpZ2l0ID0gX0lTd2JpdCAoX19JU3d4ZGlnaXQpLAkvKiBIZXhhZGVjaW1hbCBudW1lcmljLiAgKi8KKyAgX0lTd3NwYWNlID0gX0lTd2JpdCAoX19JU3dzcGFjZSksCS8qIFdoaXRlc3BhY2UuICAqLworICBfSVN3cHJpbnQgPSBfSVN3Yml0IChfX0lTd3ByaW50KSwJLyogUHJpbnRpbmcuICAqLworICBfSVN3Z3JhcGggPSBfSVN3Yml0IChfX0lTd2dyYXBoKSwJLyogR3JhcGhpY2FsLiAgKi8KKyAgX0lTd2JsYW5rID0gX0lTd2JpdCAoX19JU3dibGFuayksCS8qIEJsYW5rICh1c3VhbGx5IFNQQyBhbmQgVEFCKS4gICovCisgIF9JU3djbnRybCA9IF9JU3diaXQgKF9fSVN3Y250cmwpLAkvKiBDb250cm9sIGNoYXJhY3Rlci4gICovCisgIF9JU3dwdW5jdCA9IF9JU3diaXQgKF9fSVN3cHVuY3QpLAkvKiBQdW5jdHVhdGlvbi4gICovCisgIF9JU3dhbG51bSA9IF9JU3diaXQgKF9fSVN3YWxudW0pCS8qIEFscGhhbnVtZXJpYy4gICovCit9OworIyBlbmRpZiAvKiBOb3QgX0lTd2JpdCAgKi8KKworCitfX0JFR0lOX0RFQ0xTCisKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyoKKyAqIFdpZGUtY2hhcmFjdGVyIGNsYXNzaWZpY2F0aW9uIGZ1bmN0aW9uczogNy4xNS4yLjEuCisgKi8KKworLyogVGVzdCBmb3IgYW55IHdpZGUgY2hhcmFjdGVyIGZvciB3aGljaCBgaXN3YWxwaGEnIG9yIGBpc3dkaWdpdCcgaXMKKyAgIHRydWUuICAqLworZXh0ZXJuIGludCBpc3dhbG51bSAod2ludF90IF9fd2MpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSB3aWRlIGNoYXJhY3RlciBmb3Igd2hpY2ggYGlzd3VwcGVyJyBvciAnaXN3bG93ZXInIGlzCisgICB0cnVlLCBvciBhbnkgd2lkZSBjaGFyYWN0ZXIgdGhhdCBpcyBvbmUgb2YgYSBsb2NhbGUtc3BlY2lmaWMgc2V0IG9mCisgICB3aWRlLWNoYXJhY3RlcnMgZm9yIHdoaWNoIG5vbmUgb2YgYGlzd2NudHJsJywgYGlzd2RpZ2l0JywKKyAgIGBpc3dwdW5jdCcsIG9yIGBpc3dzcGFjZScgaXMgdHJ1ZS4gICovCitleHRlcm4gaW50IGlzd2FscGhhICh3aW50X3QgX193YykgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IGNvbnRyb2wgd2lkZSBjaGFyYWN0ZXIuICAqLworZXh0ZXJuIGludCBpc3djbnRybCAod2ludF90IF9fd2MpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSB3aWRlIGNoYXJhY3RlciB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgZGVjaW1hbC1kaWdpdAorICAgY2hhcmFjdGVyLiAgKi8KK2V4dGVybiBpbnQgaXN3ZGlnaXQgKHdpbnRfdCBfX3djKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgd2lkZSBjaGFyYWN0ZXIgZm9yIHdoaWNoIGBpc3dwcmludCcgaXMgdHJ1ZSBhbmQKKyAgIGBpc3dzcGFjZScgaXMgZmFsc2UuICAqLworZXh0ZXJuIGludCBpc3dncmFwaCAod2ludF90IF9fd2MpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSB3aWRlIGNoYXJhY3RlciB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgbG93ZXJjYXNlIGxldHRlcgorICAgb3IgaXMgb25lIG9mIGEgbG9jYWxlLXNwZWNpZmljIHNldCBvZiB3aWRlIGNoYXJhY3RlcnMgZm9yIHdoaWNoCisgICBub25lIG9mIGBpc3djbnRybCcsIGBpc3dkaWdpdCcsIGBpc3dwdW5jdCcsIG9yIGBpc3dzcGFjZScgaXMgdHJ1ZS4gICovCitleHRlcm4gaW50IGlzd2xvd2VyICh3aW50X3QgX193YykgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IHByaW50aW5nIHdpZGUgY2hhcmFjdGVyLiAgKi8KK2V4dGVybiBpbnQgaXN3cHJpbnQgKHdpbnRfdCBfX3djKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgcHJpbnRpbmcgd2lkZSBjaGFyYWN0ZXIgdGhhdCBpcyBvbmUgb2YgYQorICAgbG9jYWxlLXNwZWNpZmljIGV0IG9mIHdpZGUgY2hhcmFjdGVycyBmb3Igd2hpY2ggbmVpdGhlciBgaXN3c3BhY2UnCisgICBub3IgYGlzd2FsbnVtJyBpcyB0cnVlLiAgKi8KK2V4dGVybiBpbnQgaXN3cHVuY3QgKHdpbnRfdCBfX3djKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgd2lkZSBjaGFyYWN0ZXIgdGhhdCBjb3JyZXNwb25kcyB0byBhIGxvY2FsZS1zcGVjaWZpYworICAgc2V0IG9mIHdpZGUgY2hhcmFjdGVycyBmb3Igd2hpY2ggbm9uZSBvZiBgaXN3YWxudW0nLCBgaXN3Z3JhcGgnLCBvcgorICAgYGlzd3B1bmN0JyBpcyB0cnVlLiAgKi8KK2V4dGVybiBpbnQgaXN3c3BhY2UgKHdpbnRfdCBfX3djKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgd2lkZSBjaGFyYWN0ZXIgdGhhdCBjb3JyZXNwb25kcyB0byBhbiB1cHBlcmNhc2UgbGV0dGVyCisgICBvciBpcyBvbmUgb2YgYSBsb2NhbGUtc3BlY2lmaWMgc2V0IG9mIHdpZGUgY2hhcmFjdGVyIGZvciB3aGljaCBub25lCisgICBvZiBgaXN3Y250cmwnLCBgaXN3ZGlnaXQnLCBgaXN3cHVuY3QnLCBvciBgaXN3c3BhY2UnIGlzIHRydWUuICAqLworZXh0ZXJuIGludCBpc3d1cHBlciAod2ludF90IF9fd2MpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSB3aWRlIGNoYXJhY3RlciB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgaGV4YWRlY2ltYWwtZGlnaXQKKyAgIGNoYXJhY3RlciBlcXVpdmFsZW50IHRvIHRoYXQgcGVyZm9ybWVkIGJlIHRoZSBmdW5jdGlvbnMgZGVzY3JpYmVkCisgICBpbiB0aGUgcHJldmlvdXMgc3ViY2xhdXNlLiAgKi8KK2V4dGVybiBpbnQgaXN3eGRpZ2l0ICh3aW50X3QgX193YykgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IHdpZGUgY2hhcmFjdGVyIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBzdGFuZGFyZCBibGFuaworICAgd2lkZSBjaGFyYWN0ZXIgb3IgYSBsb2NhbGUtc3BlY2lmaWMgc2V0IG9mIHdpZGUgY2hhcmFjdGVycyBmb3IKKyAgIHdoaWNoIGBpc3dhbG51bScgaXMgZmFsc2UuICAqLworIyBpZmRlZiBfX1VTRV9JU09DOTkKK2V4dGVybiBpbnQgaXN3YmxhbmsgKHdpbnRfdCBfX3djKSBfX1RIUk9XOworIyBlbmRpZgorCisvKgorICogRXh0ZW5zaWJsZSB3aWRlLWNoYXJhY3RlciBjbGFzc2lmaWNhdGlvbiBmdW5jdGlvbnM6IDcuMTUuMi4yLgorICovCisKKy8qIENvbnN0cnVjdCB2YWx1ZSB0aGF0IGRlc2NyaWJlcyBhIGNsYXNzIG9mIHdpZGUgY2hhcmFjdGVycyBpZGVudGlmaWVkCisgICBieSB0aGUgc3RyaW5nIGFyZ3VtZW50IFBST1BFUlRZLiAgKi8KK2V4dGVybiB3Y3R5cGVfdCB3Y3R5cGUgKF9fY29uc3QgY2hhciAqX19wcm9wZXJ0eSkgX19USFJPVzsKKworLyogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHdpZGUtY2hhcmFjdGVyIFdDIGhhcyB0aGUgcHJvcGVydHkgZGVzY3JpYmVkIGJ5CisgICBERVNDLiAgKi8KK2V4dGVybiBpbnQgaXN3Y3R5cGUgKHdpbnRfdCBfX3djLCB3Y3R5cGVfdCBfX2Rlc2MpIF9fVEhST1c7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisKKworLyoKKyAqIFdpZGUtY2hhcmFjdGVyIGNhc2UtbWFwcGluZyBmdW5jdGlvbnM6IDcuMTUuMy4xLgorICovCisKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogU2NhbGFyIHR5cGUgdGhhdCBjYW4gaG9sZCB2YWx1ZXMgd2hpY2ggcmVwcmVzZW50IGxvY2FsZS1zcGVjaWZpYworICAgY2hhcmFjdGVyIG1hcHBpbmdzLiAgKi8KK3R5cGVkZWYgX19jb25zdCBfX2ludDMyX3QgKndjdHJhbnNfdDsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNpZmRlZiBfX1VTRV9HTlUKK19fVVNJTkdfTkFNRVNQQUNFX0M5OSh3Y3RyYW5zX3QpCisjZW5kaWYKKworX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBDb252ZXJ0cyBhbiB1cHBlcmNhc2UgbGV0dGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIGxvd2VyY2FzZSBsZXR0ZXIuICAqLworZXh0ZXJuIHdpbnRfdCB0b3dsb3dlciAod2ludF90IF9fd2MpIF9fVEhST1c7CisKKy8qIENvbnZlcnRzIGFuIGxvd2VyY2FzZSBsZXR0ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdXBwZXJjYXNlIGxldHRlci4gICovCitleHRlcm4gd2ludF90IHRvd3VwcGVyICh3aW50X3QgX193YykgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9DOTkKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIG5lZWQgaXN3eHh4LiAgKi8KKworCisvKiBUaGUgcmVtYWluaW5nIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgbXVzdCBub3QgYXBwZWFyIGluIHRoZQorICAgPHdjaGFyLmg+IGhlYWRlci4gICovCisjaWZkZWYgX1dDVFlQRV9ICisKKy8qCisgKiBFeHRlbnNpYmxlIHdpZGUtY2hhcmFjdGVyIG1hcHBpbmcgZnVuY3Rpb25zOiA3LjE1LjMuMi4KKyAqLworCitfX0JFR0lOX0RFQ0xTCisKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogQ29uc3RydWN0IHZhbHVlIHRoYXQgZGVzY3JpYmVzIGEgbWFwcGluZyBiZXR3ZWVuIHdpZGUgY2hhcmFjdGVycworICAgaWRlbnRpZmllZCBieSB0aGUgc3RyaW5nIGFyZ3VtZW50IFBST1BFUlRZLiAgKi8KK2V4dGVybiB3Y3RyYW5zX3Qgd2N0cmFucyAoX19jb25zdCBjaGFyICpfX3Byb3BlcnR5KSBfX1RIUk9XOworCisvKiBNYXAgdGhlIHdpZGUgY2hhcmFjdGVyIFdDIHVzaW5nIHRoZSBtYXBwaW5nIGRlc2NyaWJlZCBieSBERVNDLiAgKi8KK2V4dGVybiB3aW50X3QgdG93Y3RyYW5zICh3aW50X3QgX193Yywgd2N0cmFuc190IF9fZGVzYykgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9DOTkKKworIyBpZmRlZiBfX1VTRV9YT1BFTjJLOAorLyogRGVjbGFyZSB0aGUgaW50ZXJmYWNlIHRvIGV4dGVuZGVkIGxvY2FsZSBtb2RlbC4gICovCisjICBpbmNsdWRlIDx4bG9jYWxlLmg+CisKKy8qIFRlc3QgZm9yIGFueSB3aWRlIGNoYXJhY3RlciBmb3Igd2hpY2ggYGlzd2FscGhhJyBvciBgaXN3ZGlnaXQnIGlzCisgICB0cnVlLiAgKi8KK2V4dGVybiBpbnQgaXN3YWxudW1fbCAod2ludF90IF9fd2MsIF9fbG9jYWxlX3QgX19sb2NhbGUpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSB3aWRlIGNoYXJhY3RlciBmb3Igd2hpY2ggYGlzd3VwcGVyJyBvciAnaXN3bG93ZXInIGlzCisgICB0cnVlLCBvciBhbnkgd2lkZSBjaGFyYWN0ZXIgdGhhdCBpcyBvbmUgb2YgYSBsb2NhbGUtc3BlY2lmaWMgc2V0IG9mCisgICB3aWRlLWNoYXJhY3RlcnMgZm9yIHdoaWNoIG5vbmUgb2YgYGlzd2NudHJsJywgYGlzd2RpZ2l0JywKKyAgIGBpc3dwdW5jdCcsIG9yIGBpc3dzcGFjZScgaXMgdHJ1ZS4gICovCitleHRlcm4gaW50IGlzd2FscGhhX2wgKHdpbnRfdCBfX3djLCBfX2xvY2FsZV90IF9fbG9jYWxlKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgY29udHJvbCB3aWRlIGNoYXJhY3Rlci4gICovCitleHRlcm4gaW50IGlzd2NudHJsX2wgKHdpbnRfdCBfX3djLCBfX2xvY2FsZV90IF9fbG9jYWxlKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgd2lkZSBjaGFyYWN0ZXIgdGhhdCBjb3JyZXNwb25kcyB0byBhIGRlY2ltYWwtZGlnaXQKKyAgIGNoYXJhY3Rlci4gICovCitleHRlcm4gaW50IGlzd2RpZ2l0X2wgKHdpbnRfdCBfX3djLCBfX2xvY2FsZV90IF9fbG9jYWxlKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgd2lkZSBjaGFyYWN0ZXIgZm9yIHdoaWNoIGBpc3dwcmludCcgaXMgdHJ1ZSBhbmQKKyAgIGBpc3dzcGFjZScgaXMgZmFsc2UuICAqLworZXh0ZXJuIGludCBpc3dncmFwaF9sICh3aW50X3QgX193YywgX19sb2NhbGVfdCBfX2xvY2FsZSkgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IHdpZGUgY2hhcmFjdGVyIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBsb3dlcmNhc2UgbGV0dGVyCisgICBvciBpcyBvbmUgb2YgYSBsb2NhbGUtc3BlY2lmaWMgc2V0IG9mIHdpZGUgY2hhcmFjdGVycyBmb3Igd2hpY2gKKyAgIG5vbmUgb2YgYGlzd2NudHJsJywgYGlzd2RpZ2l0JywgYGlzd3B1bmN0Jywgb3IgYGlzd3NwYWNlJyBpcyB0cnVlLiAgKi8KK2V4dGVybiBpbnQgaXN3bG93ZXJfbCAod2ludF90IF9fd2MsIF9fbG9jYWxlX3QgX19sb2NhbGUpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSBwcmludGluZyB3aWRlIGNoYXJhY3Rlci4gICovCitleHRlcm4gaW50IGlzd3ByaW50X2wgKHdpbnRfdCBfX3djLCBfX2xvY2FsZV90IF9fbG9jYWxlKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgcHJpbnRpbmcgd2lkZSBjaGFyYWN0ZXIgdGhhdCBpcyBvbmUgb2YgYQorICAgbG9jYWxlLXNwZWNpZmljIGV0IG9mIHdpZGUgY2hhcmFjdGVycyBmb3Igd2hpY2ggbmVpdGhlciBgaXN3c3BhY2UnCisgICBub3IgYGlzd2FsbnVtJyBpcyB0cnVlLiAgKi8KK2V4dGVybiBpbnQgaXN3cHVuY3RfbCAod2ludF90IF9fd2MsIF9fbG9jYWxlX3QgX19sb2NhbGUpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSB3aWRlIGNoYXJhY3RlciB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgbG9jYWxlLXNwZWNpZmljCisgICBzZXQgb2Ygd2lkZSBjaGFyYWN0ZXJzIGZvciB3aGljaCBub25lIG9mIGBpc3dhbG51bScsIGBpc3dncmFwaCcsIG9yCisgICBgaXN3cHVuY3QnIGlzIHRydWUuICAqLworZXh0ZXJuIGludCBpc3dzcGFjZV9sICh3aW50X3QgX193YywgX19sb2NhbGVfdCBfX2xvY2FsZSkgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IHdpZGUgY2hhcmFjdGVyIHRoYXQgY29ycmVzcG9uZHMgdG8gYW4gdXBwZXJjYXNlIGxldHRlcgorICAgb3IgaXMgb25lIG9mIGEgbG9jYWxlLXNwZWNpZmljIHNldCBvZiB3aWRlIGNoYXJhY3RlciBmb3Igd2hpY2ggbm9uZQorICAgb2YgYGlzd2NudHJsJywgYGlzd2RpZ2l0JywgYGlzd3B1bmN0Jywgb3IgYGlzd3NwYWNlJyBpcyB0cnVlLiAgKi8KK2V4dGVybiBpbnQgaXN3dXBwZXJfbCAod2ludF90IF9fd2MsIF9fbG9jYWxlX3QgX19sb2NhbGUpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSB3aWRlIGNoYXJhY3RlciB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgaGV4YWRlY2ltYWwtZGlnaXQKKyAgIGNoYXJhY3RlciBlcXVpdmFsZW50IHRvIHRoYXQgcGVyZm9ybWVkIGJlIHRoZSBmdW5jdGlvbnMgZGVzY3JpYmVkCisgICBpbiB0aGUgcHJldmlvdXMgc3ViY2xhdXNlLiAgKi8KK2V4dGVybiBpbnQgaXN3eGRpZ2l0X2wgKHdpbnRfdCBfX3djLCBfX2xvY2FsZV90IF9fbG9jYWxlKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgd2lkZSBjaGFyYWN0ZXIgdGhhdCBjb3JyZXNwb25kcyB0byBhIHN0YW5kYXJkIGJsYW5rCisgICB3aWRlIGNoYXJhY3RlciBvciBhIGxvY2FsZS1zcGVjaWZpYyBzZXQgb2Ygd2lkZSBjaGFyYWN0ZXJzIGZvcgorICAgd2hpY2ggYGlzd2FsbnVtJyBpcyBmYWxzZS4gICovCitleHRlcm4gaW50IGlzd2JsYW5rX2wgKHdpbnRfdCBfX3djLCBfX2xvY2FsZV90IF9fbG9jYWxlKSBfX1RIUk9XOworCisvKiBDb25zdHJ1Y3QgdmFsdWUgdGhhdCBkZXNjcmliZXMgYSBjbGFzcyBvZiB3aWRlIGNoYXJhY3RlcnMgaWRlbnRpZmllZAorICAgYnkgdGhlIHN0cmluZyBhcmd1bWVudCBQUk9QRVJUWS4gICovCitleHRlcm4gd2N0eXBlX3Qgd2N0eXBlX2wgKF9fY29uc3QgY2hhciAqX19wcm9wZXJ0eSwgX19sb2NhbGVfdCBfX2xvY2FsZSkKKyAgICAgX19USFJPVzsKKworLyogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHdpZGUtY2hhcmFjdGVyIFdDIGhhcyB0aGUgcHJvcGVydHkgZGVzY3JpYmVkIGJ5CisgICBERVNDLiAgKi8KK2V4dGVybiBpbnQgaXN3Y3R5cGVfbCAod2ludF90IF9fd2MsIHdjdHlwZV90IF9fZGVzYywgX19sb2NhbGVfdCBfX2xvY2FsZSkKKyAgICAgX19USFJPVzsKKworCisvKgorICogV2lkZS1jaGFyYWN0ZXIgY2FzZS1tYXBwaW5nIGZ1bmN0aW9ucy4KKyAqLworCisvKiBDb252ZXJ0cyBhbiB1cHBlcmNhc2UgbGV0dGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIGxvd2VyY2FzZSBsZXR0ZXIuICAqLworZXh0ZXJuIHdpbnRfdCB0b3dsb3dlcl9sICh3aW50X3QgX193YywgX19sb2NhbGVfdCBfX2xvY2FsZSkgX19USFJPVzsKKworLyogQ29udmVydHMgYW4gbG93ZXJjYXNlIGxldHRlciB0byB0aGUgY29ycmVzcG9uZGluZyB1cHBlcmNhc2UgbGV0dGVyLiAgKi8KK2V4dGVybiB3aW50X3QgdG93dXBwZXJfbCAod2ludF90IF9fd2MsIF9fbG9jYWxlX3QgX19sb2NhbGUpIF9fVEhST1c7CisKKy8qIENvbnN0cnVjdCB2YWx1ZSB0aGF0IGRlc2NyaWJlcyBhIG1hcHBpbmcgYmV0d2VlbiB3aWRlIGNoYXJhY3RlcnMKKyAgIGlkZW50aWZpZWQgYnkgdGhlIHN0cmluZyBhcmd1bWVudCBQUk9QRVJUWS4gICovCitleHRlcm4gd2N0cmFuc190IHdjdHJhbnNfbCAoX19jb25zdCBjaGFyICpfX3Byb3BlcnR5LCBfX2xvY2FsZV90IF9fbG9jYWxlKQorICAgICBfX1RIUk9XOworCisvKiBNYXAgdGhlIHdpZGUgY2hhcmFjdGVyIFdDIHVzaW5nIHRoZSBtYXBwaW5nIGRlc2NyaWJlZCBieSBERVNDLiAgKi8KK2V4dGVybiB3aW50X3QgdG93Y3RyYW5zX2wgKHdpbnRfdCBfX3djLCB3Y3RyYW5zX3QgX19kZXNjLAorCQkJICAgX19sb2NhbGVfdCBfX2xvY2FsZSkgX19USFJPVzsKKworIyBlbmRpZiAvKiBVc2UgUE9TSVggMjAwOC4gICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBfX1dDVFlQRV9IIGRlZmluZWQuICAqLworCisjZW5kaWYgLyogd2N0eXBlLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3dvcmRleHAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvd29yZGV4cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNDBlNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3dvcmRleHAuaApAQCAtMCwwICsxLDcxIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCAxOTk2LTE5OTksIDIwMDEsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1dPUkRFWFBfSAorI2RlZmluZQlfV09SREVYUF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBCaXRzIHNldCBpbiB0aGUgRkxBR1MgYXJndW1lbnQgdG8gYHdvcmRleHAnLiAgKi8KK2VudW0KKyAgeworICAgIFdSREVfRE9PRkZTID0gKDEgPDwgMCksCS8qIEluc2VydCBQV09SREVYUC0+d2Vfb2ZmcyBOVUxMcy4gICovCisgICAgV1JERV9BUFBFTkQgPSAoMSA8PCAxKSwJLyogQXBwZW5kIHRvIHJlc3VsdHMgb2YgYSBwcmV2aW91cyBjYWxsLiAgKi8KKyAgICBXUkRFX05PQ01EID0gKDEgPDwgMiksCS8qIERvbid0IGRvIGNvbW1hbmQgc3Vic3RpdHV0aW9uLiAgKi8KKyAgICBXUkRFX1JFVVNFID0gKDEgPDwgMyksCS8qIFJldXNlIHN0b3JhZ2UgaW4gUFdPUkRFWFAuICAqLworICAgIFdSREVfU0hPV0VSUiA9ICgxIDw8IDQpLAkvKiBEb24ndCByZWRpcmVjdCBzdGRlcnIgdG8gL2Rldi9udWxsLiAgKi8KKyAgICBXUkRFX1VOREVGID0gKDEgPDwgNSksCS8qIEVycm9yIGZvciBleHBhbmRpbmcgdW5kZWZpbmVkIHZhcmlhYmxlcy4gICovCisgICAgX19XUkRFX0ZMQUdTID0gKFdSREVfRE9PRkZTIHwgV1JERV9BUFBFTkQgfCBXUkRFX05PQ01EIHwKKwkJICAgIFdSREVfUkVVU0UgfCBXUkRFX1NIT1dFUlIgfCBXUkRFX1VOREVGKQorICB9OworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHdvcmQtZXhwYW5zaW9uIHJ1bi4gICovCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgc2l6ZV90IHdlX3dvcmRjOwkJLyogQ291bnQgb2Ygd29yZHMgbWF0Y2hlZC4gICovCisgICAgY2hhciAqKndlX3dvcmR2OwkJLyogTGlzdCBvZiBleHBhbmRlZCB3b3Jkcy4gICovCisgICAgc2l6ZV90IHdlX29mZnM7CQkvKiBTbG90cyB0byByZXNlcnZlIGluIGB3ZV93b3JkdicuICAqLworICB9IHdvcmRleHBfdDsKKworLyogUG9zc2libGUgbm9uemVybyByZXR1cm4gdmFsdWVzIGZyb20gYHdvcmRleHAnLiAgKi8KK2VudW0KKyAgeworI2lmZGVmIF9fVVNFX1hPUEVOCisgICAgV1JERV9OT1NZUyA9IC0xLAkJLyogTmV2ZXIgdXNlZCBzaW5jZSB3ZSBzdXBwb3J0IGB3b3JkZXhwJy4gICovCisjZW5kaWYKKyAgICBXUkRFX05PU1BBQ0UgPSAxLAkJLyogUmFuIG91dCBvZiBtZW1vcnkuICAqLworICAgIFdSREVfQkFEQ0hBUiwJCS8qIEEgbWV0YWNoYXIgYXBwZWFycyBpbiB0aGUgd3JvbmcgcGxhY2UuICAqLworICAgIFdSREVfQkFEVkFMLAkJLyogVW5kZWZpbmVkIHZhciByZWZlcmVuY2Ugd2l0aCBXUkRFX1VOREVGLiAgKi8KKyAgICBXUkRFX0NNRFNVQiwJCS8qIENvbW1hbmQgc3Vic3RpdHV0aW9uIHdpdGggV1JERV9OT0NNRC4gICovCisgICAgV1JERV9TWU5UQVgJCQkvKiBTaGVsbCBzeW50YXggZXJyb3IuICAqLworICB9OworCisvKiBEbyB3b3JkIGV4cGFuc2lvbiBvZiBXT1JEUyBpbnRvIFBXT1JERVhQLiAgKi8KK2V4dGVybiBpbnQgd29yZGV4cCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fd29yZHMsCisJCSAgICB3b3JkZXhwX3QgKl9fcmVzdHJpY3QgX19wd29yZGV4cCwgaW50IF9fZmxhZ3MpOworCisvKiBGcmVlIHRoZSBzdG9yYWdlIGFsbG9jYXRlZCBieSBhIGB3b3JkZXhwJyBjYWxsLiAgKi8KK2V4dGVybiB2b2lkIHdvcmRmcmVlICh3b3JkZXhwX3QgKl9fd29yZGV4cCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHdvcmRleHAuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vYS5vdXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vYS5vdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njg0Zjk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9hLm91dC5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX0FTTV9YODZfQV9PVVRfSAorI2RlZmluZSBfQVNNX1g4Nl9BX09VVF9ICisKK3N0cnVjdCBleGVjCit7CisJdW5zaWduZWQgaW50IGFfaW5mbzsJLyogVXNlIG1hY3JvcyBOX01BR0lDLCBldGMgZm9yIGFjY2VzcyAqLworCXVuc2lnbmVkIGFfdGV4dDsJLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICovCisJdW5zaWduZWQgYV9kYXRhOwkvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBhX2JzczsJCS8qIGxlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBmb3IgZmlsZSwgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBhX3N5bXM7CS8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgZGF0YSBpbiBmaWxlLCBpbiBieXRlcyAqLworCXVuc2lnbmVkIGFfZW50cnk7CS8qIHN0YXJ0IGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBhX3Ryc2l6ZTsJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgdGV4dCwgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBhX2Ryc2l6ZTsJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgZGF0YSwgaW4gYnl0ZXMgKi8KK307CisKKyNkZWZpbmUgTl9UUlNJWkUoYSkJKChhKS5hX3Ryc2l6ZSkKKyNkZWZpbmUgTl9EUlNJWkUoYSkJKChhKS5hX2Ryc2l6ZSkKKyNkZWZpbmUgTl9TWU1TSVpFKGEpCSgoYSkuYV9zeW1zKQorCisjZW5kaWYgLyogX0FTTV9YODZfQV9PVVRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9hdXh2ZWMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vYXV4dmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMxNmI0YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vYXV4dmVjLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfQVNNX1g4Nl9BVVhWRUNfSAorI2RlZmluZSBfQVNNX1g4Nl9BVVhWRUNfSAorLyoKKyAqIEFyY2hpdGVjdHVyZS1uZXV0cmFsIEFUXyB2YWx1ZXMgaW4gMC0xNywgbGVhdmUgc29tZSByb29tCisgKiBmb3IgbW9yZSBvZiB0aGVtLCBzdGFydCB0aGUgeDg2LXNwZWNpZmljIG9uZXMgYXQgMzIuCisgKi8KKyNpZmRlZiBfX2kzODZfXworI2RlZmluZSBBVF9TWVNJTkZPCQkzMgorI2VuZGlmCisjZGVmaW5lIEFUX1NZU0lORk9fRUhEUgkJMzMKKworI2VuZGlmIC8qIF9BU01fWDg2X0FVWFZFQ19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2JpdHNwZXJsb25nLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2JpdHNwZXJsb25nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBhZTFjNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vYml0c3BlcmxvbmcuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9fQVNNX1g4Nl9CSVRTUEVSTE9OR19ICisjZGVmaW5lIF9fQVNNX1g4Nl9CSVRTUEVSTE9OR19ICisKKyNpZmRlZiBfX3g4Nl82NF9fCisjIGRlZmluZSBfX0JJVFNfUEVSX0xPTkcgNjQKKyNlbHNlCisjIGRlZmluZSBfX0JJVFNfUEVSX0xPTkcgMzIKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0c3BlcmxvbmcuaD4KKworI2VuZGlmIC8qIF9fQVNNX1g4Nl9CSVRTUEVSTE9OR19IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vYm9vdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9ib290LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyMDBhYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vYm9vdC5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX0FTTV9YODZfQk9PVF9ICisjZGVmaW5lIF9BU01fWDg2X0JPT1RfSAorCisvKiBJbnRlcm5hbCBzdmdhIHN0YXJ0dXAgY29uc3RhbnRzICovCisjZGVmaW5lIE5PUk1BTF9WR0EJMHhmZmZmCQkvKiA4MHgyNSBtb2RlICovCisjZGVmaW5lIEVYVEVOREVEX1ZHQQkweGZmZmUJCS8qIDgweDUwIG1vZGUgKi8KKyNkZWZpbmUgQVNLX1ZHQQkJMHhmZmZkCQkvKiBhc2sgZm9yIGl0IGF0IGJvb3R1cCAqLworCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9CT09UX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vYm9vdHBhcmFtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2Jvb3RwYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMjBkODgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2Jvb3RwYXJhbS5oCkBAIC0wLDAgKzEsMTM0IEBACisjaWZuZGVmIF9BU01fWDg2X0JPT1RQQVJBTV9ICisjZGVmaW5lIF9BU01fWDg2X0JPT1RQQVJBTV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjcmVlbl9pbmZvLmg+CisjaW5jbHVkZSA8bGludXgvYXBtX2Jpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9lZGQuaD4KKyNpbmNsdWRlIDxhc20vZTgyMC5oPgorI2luY2x1ZGUgPGFzbS9pc3QuaD4KKyNpbmNsdWRlIDx2aWRlby9lZGlkLmg+CisKKy8qIHNldHVwIGRhdGEgdHlwZXMgKi8KKyNkZWZpbmUgU0VUVVBfTk9ORQkJCTAKKyNkZWZpbmUgU0VUVVBfRTgyMF9FWFQJCQkxCisjZGVmaW5lIFNFVFVQX0RUQgkJCTIKKworLyogZXh0ZW5zaWJsZSBzZXR1cCBkYXRhIGxpc3Qgbm9kZSAqLworc3RydWN0IHNldHVwX2RhdGEgeworCV9fdTY0IG5leHQ7CisJX191MzIgdHlwZTsKKwlfX3UzMiBsZW47CisJX191OCBkYXRhWzBdOworfTsKKworc3RydWN0IHNldHVwX2hlYWRlciB7CisJX191OAlzZXR1cF9zZWN0czsKKwlfX3UxNglyb290X2ZsYWdzOworCV9fdTMyCXN5c3NpemU7CisJX191MTYJcmFtX3NpemU7CisjZGVmaW5lIFJBTURJU0tfSU1BR0VfU1RBUlRfTUFTSwkweDA3RkYKKyNkZWZpbmUgUkFNRElTS19QUk9NUFRfRkxBRwkJMHg4MDAwCisjZGVmaW5lIFJBTURJU0tfTE9BRF9GTEFHCQkweDQwMDAKKwlfX3UxNgl2aWRfbW9kZTsKKwlfX3UxNglyb290X2RldjsKKwlfX3UxNglib290X2ZsYWc7CisJX191MTYJanVtcDsKKwlfX3UzMgloZWFkZXI7CisJX191MTYJdmVyc2lvbjsKKwlfX3UzMglyZWFsbW9kZV9zd3RjaDsKKwlfX3UxNglzdGFydF9zeXM7CisJX191MTYJa2VybmVsX3ZlcnNpb247CisJX191OAl0eXBlX29mX2xvYWRlcjsKKwlfX3U4CWxvYWRmbGFnczsKKyNkZWZpbmUgTE9BREVEX0hJR0gJKDE8PDApCisjZGVmaW5lIFFVSUVUX0ZMQUcJKDE8PDUpCisjZGVmaW5lIEtFRVBfU0VHTUVOVFMJKDE8PDYpCisjZGVmaW5lIENBTl9VU0VfSEVBUAkoMTw8NykKKwlfX3UxNglzZXR1cF9tb3ZlX3NpemU7CisJX191MzIJY29kZTMyX3N0YXJ0OworCV9fdTMyCXJhbWRpc2tfaW1hZ2U7CisJX191MzIJcmFtZGlza19zaXplOworCV9fdTMyCWJvb3RzZWN0X2tsdWRnZTsKKwlfX3UxNgloZWFwX2VuZF9wdHI7CisJX191OAlleHRfbG9hZGVyX3ZlcjsKKwlfX3U4CWV4dF9sb2FkZXJfdHlwZTsKKwlfX3UzMgljbWRfbGluZV9wdHI7CisJX191MzIJaW5pdHJkX2FkZHJfbWF4OworCV9fdTMyCWtlcm5lbF9hbGlnbm1lbnQ7CisJX191OAlyZWxvY2F0YWJsZV9rZXJuZWw7CisJX191OAlfcGFkMlszXTsKKwlfX3UzMgljbWRsaW5lX3NpemU7CisJX191MzIJaGFyZHdhcmVfc3ViYXJjaDsKKwlfX3U2NAloYXJkd2FyZV9zdWJhcmNoX2RhdGE7CisJX191MzIJcGF5bG9hZF9vZmZzZXQ7CisJX191MzIJcGF5bG9hZF9sZW5ndGg7CisJX191NjQJc2V0dXBfZGF0YTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzeXNfZGVzY190YWJsZSB7CisJX191MTYgbGVuZ3RoOworCV9fdTggIHRhYmxlWzE0XTsKK307CisKKy8qIEdsZWFuZWQgZnJvbSBPRlcncyBzZXQtcGFyYW1ldGVycyBpbiBjcHUveDg2L3BjL2xpbnV4LmZ0aCAqLworc3RydWN0IG9scGNfb2Z3X2hlYWRlciB7CisJX191MzIgb2Z3X21hZ2ljOwkvKiBPRlcgc2lnbmF0dXJlICovCisJX191MzIgb2Z3X3ZlcnNpb247CisJX191MzIgY2lmX2hhbmRsZXI7CS8qIGNhbGxiYWNrIGludG8gT0ZXICovCisJX191MzIgaXJxX2Rlc2NfdGFibGU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZWZpX2luZm8geworCV9fdTMyIGVmaV9sb2FkZXJfc2lnbmF0dXJlOworCV9fdTMyIGVmaV9zeXN0YWI7CisJX191MzIgZWZpX21lbWRlc2Nfc2l6ZTsKKwlfX3UzMiBlZmlfbWVtZGVzY192ZXJzaW9uOworCV9fdTMyIGVmaV9tZW1tYXA7CisJX191MzIgZWZpX21lbW1hcF9zaXplOworCV9fdTMyIGVmaV9zeXN0YWJfaGk7CisJX191MzIgZWZpX21lbW1hcF9oaTsKK307CisKKy8qIFRoZSBzby1jYWxsZWQgInplcm9wYWdlIiAqLworc3RydWN0IGJvb3RfcGFyYW1zIHsKKwlzdHJ1Y3Qgc2NyZWVuX2luZm8gc2NyZWVuX2luZm87CQkJLyogMHgwMDAgKi8KKwlzdHJ1Y3QgYXBtX2Jpb3NfaW5mbyBhcG1fYmlvc19pbmZvOwkJLyogMHgwNDAgKi8KKwlfX3U4ICBfcGFkMls0XTsJCQkJCS8qIDB4MDU0ICovCisJX191NjQgIHRib290X2FkZHI7CQkJCS8qIDB4MDU4ICovCisJc3RydWN0IGlzdF9pbmZvIGlzdF9pbmZvOwkJCS8qIDB4MDYwICovCisJX191OCAgX3BhZDNbMTZdOwkJCQkvKiAweDA3MCAqLworCV9fdTggIGhkMF9pbmZvWzE2XTsJLyogb2Jzb2xldGUhICovCQkvKiAweDA4MCAqLworCV9fdTggIGhkMV9pbmZvWzE2XTsJLyogb2Jzb2xldGUhICovCQkvKiAweDA5MCAqLworCXN0cnVjdCBzeXNfZGVzY190YWJsZSBzeXNfZGVzY190YWJsZTsJCS8qIDB4MGEwICovCisJc3RydWN0IG9scGNfb2Z3X2hlYWRlciBvbHBjX29md19oZWFkZXI7CQkvKiAweDBiMCAqLworCV9fdTggIF9wYWQ0WzEyOF07CQkJCS8qIDB4MGMwICovCisJc3RydWN0IGVkaWRfaW5mbyBlZGlkX2luZm87CQkJLyogMHgxNDAgKi8KKwlzdHJ1Y3QgZWZpX2luZm8gZWZpX2luZm87CQkJLyogMHgxYzAgKi8KKwlfX3UzMiBhbHRfbWVtX2s7CQkJCS8qIDB4MWUwICovCisJX191MzIgc2NyYXRjaDsJCS8qIFNjcmF0Y2ggZmllbGQhICovCS8qIDB4MWU0ICovCisJX191OCAgZTgyMF9lbnRyaWVzOwkJCQkvKiAweDFlOCAqLworCV9fdTggIGVkZGJ1Zl9lbnRyaWVzOwkJCQkvKiAweDFlOSAqLworCV9fdTggIGVkZF9tYnJfc2lnX2J1Zl9lbnRyaWVzOwkJCS8qIDB4MWVhICovCisJX191OCAgX3BhZDZbNl07CQkJCQkvKiAweDFlYiAqLworCXN0cnVjdCBzZXR1cF9oZWFkZXIgaGRyOyAgICAvKiBzZXR1cCBoZWFkZXIgKi8JLyogMHgxZjEgKi8KKwlfX3U4ICBfcGFkN1sweDI5MC0weDFmMS1zaXplb2Yoc3RydWN0IHNldHVwX2hlYWRlcildOworCV9fdTMyIGVkZF9tYnJfc2lnX2J1ZmZlcltFRERfTUJSX1NJR19NQVhdOwkvKiAweDI5MCAqLworCXN0cnVjdCBlODIwZW50cnkgZTgyMF9tYXBbRTgyME1BWF07CQkvKiAweDJkMCAqLworCV9fdTggIF9wYWQ4WzQ4XTsJCQkJLyogMHhjZDAgKi8KKwlzdHJ1Y3QgZWRkX2luZm8gZWRkYnVmW0VERE1BWE5SXTsJCS8qIDB4ZDAwICovCisJX191OCAgX3BhZDlbMjc2XTsJCQkJLyogMHhlZWMgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK2VudW0geworCVg4Nl9TVUJBUkNIX1BDID0gMCwKKwlYODZfU1VCQVJDSF9MR1VFU1QsCisJWDg2X1NVQkFSQ0hfWEVOLAorCVg4Nl9TVUJBUkNIX01SU1QsCisJWDg2X1NVQkFSQ0hfQ0U0MTAwLAorCVg4Nl9OUl9TVUJBUkNIUywKK307CisKKworCisjZW5kaWYgLyogX0FTTV9YODZfQk9PVFBBUkFNX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vYnl0ZW9yZGVyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2J5dGVvcmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxM2E3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2J5dGVvcmRlci5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfQVNNX1g4Nl9CWVRFT1JERVJfSAorI2RlZmluZSBfQVNNX1g4Nl9CWVRFT1JERVJfSAorCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaD4KKworI2VuZGlmIC8qIF9BU01fWDg2X0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2RlYnVncmVnLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2RlYnVncmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNkOWJkMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vZGVidWdyZWcuaApAQCAtMCwwICsxLDgwIEBACisjaWZuZGVmIF9BU01fWDg2X0RFQlVHUkVHX0gKKyNkZWZpbmUgX0FTTV9YODZfREVCVUdSRUdfSAorCisKKy8qIEluZGljYXRlIHRoZSByZWdpc3RlciBudW1iZXJzIGZvciBhIG51bWJlciBvZiB0aGUgc3BlY2lmaWMKKyAgIGRlYnVnIHJlZ2lzdGVycy4gIFJlZ2lzdGVycyAwLTMgY29udGFpbiB0aGUgYWRkcmVzc2VzIHdlIHdpc2ggdG8gdHJhcCBvbiAqLworI2RlZmluZSBEUl9GSVJTVEFERFIgMCAgICAgICAgLyogdV9kZWJ1Z3JlZ1tEUl9GSVJTVEFERFJdICovCisjZGVmaW5lIERSX0xBU1RBRERSIDMgICAgICAgICAvKiB1X2RlYnVncmVnW0RSX0xBU1RBRERSXSAgKi8KKworI2RlZmluZSBEUl9TVEFUVVMgNiAgICAgICAgICAgLyogdV9kZWJ1Z3JlZ1tEUl9TVEFUVVNdICAgICAqLworI2RlZmluZSBEUl9DT05UUk9MIDcgICAgICAgICAgLyogdV9kZWJ1Z3JlZ1tEUl9DT05UUk9MXSAqLworCisvKiBEZWZpbmUgYSBmZXcgdGhpbmdzIGZvciB0aGUgc3RhdHVzIHJlZ2lzdGVyLiAgV2UgY2FuIHVzZSB0aGlzIHRvIGRldGVybWluZQorICAgd2hpY2ggZGVidWdnaW5nIHJlZ2lzdGVyIHdhcyByZXNwb25zaWJsZSBmb3IgdGhlIHRyYXAuICBUaGUgb3RoZXIgYml0cworICAgYXJlIGVpdGhlciByZXNlcnZlZCBvciBub3Qgb2YgaW50ZXJlc3QgdG8gdXMuICovCisKKy8qIERlZmluZSByZXNlcnZlZCBiaXRzIGluIERSNiB3aGljaCBhcmUgYWx3YXlzIHNldCB0byAxICovCisjZGVmaW5lIERSNl9SRVNFUlZFRAkoMHhGRkZGMEZGMCkKKworI2RlZmluZSBEUl9UUkFQMAkoMHgxKQkJLyogZGIwICovCisjZGVmaW5lIERSX1RSQVAxCSgweDIpCQkvKiBkYjEgKi8KKyNkZWZpbmUgRFJfVFJBUDIJKDB4NCkJCS8qIGRiMiAqLworI2RlZmluZSBEUl9UUkFQMwkoMHg4KQkJLyogZGIzICovCisjZGVmaW5lIERSX1RSQVBfQklUUwkoRFJfVFJBUDB8RFJfVFJBUDF8RFJfVFJBUDJ8RFJfVFJBUDMpCisKKyNkZWZpbmUgRFJfU1RFUAkJKDB4NDAwMCkJLyogc2luZ2xlLXN0ZXAgKi8KKyNkZWZpbmUgRFJfU1dJVENICSgweDgwMDApCS8qIHRhc2sgc3dpdGNoICovCisKKy8qIE5vdyBkZWZpbmUgYSBidW5jaCBvZiB0aGluZ3MgZm9yIG1hbmlwdWxhdGluZyB0aGUgY29udHJvbCByZWdpc3Rlci4KKyAgIFRoZSB0b3AgdHdvIGJ5dGVzIG9mIHRoZSBjb250cm9sIHJlZ2lzdGVyIGNvbnNpc3Qgb2YgNCBmaWVsZHMgb2YgNAorICAgYml0cyAtIGVhY2ggZmllbGQgY29ycmVzcG9uZHMgdG8gb25lIG9mIHRoZSBmb3VyIGRlYnVnIHJlZ2lzdGVycywKKyAgIGFuZCBpbmRpY2F0ZXMgd2hhdCB0eXBlcyBvZiBhY2Nlc3Mgd2UgdHJhcCBvbiwgYW5kIGhvdyBsYXJnZSB0aGUgZGF0YQorICAgZmllbGQgaXMgdGhhdCB3ZSBhcmUgbG9va2luZyBhdCAqLworCisjZGVmaW5lIERSX0NPTlRST0xfU0hJRlQgMTYgLyogU2tpcCB0aGlzIG1hbnkgYml0cyBpbiBjdGwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRFJfQ09OVFJPTF9TSVpFIDQgICAvKiA0IGNvbnRyb2wgYml0cyBwZXIgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBEUl9SV19FWEVDVVRFICgweDApICAgLyogU2V0dGluZ3MgZm9yIHRoZSBhY2Nlc3MgdHlwZXMgdG8gdHJhcCBvbiAqLworI2RlZmluZSBEUl9SV19XUklURSAoMHgxKQorI2RlZmluZSBEUl9SV19SRUFEICgweDMpCisKKyNkZWZpbmUgRFJfTEVOXzEgKDB4MCkgLyogU2V0dGluZ3MgZm9yIGRhdGEgbGVuZ3RoIHRvIHRyYXAgb24gKi8KKyNkZWZpbmUgRFJfTEVOXzIgKDB4NCkKKyNkZWZpbmUgRFJfTEVOXzQgKDB4QykKKyNkZWZpbmUgRFJfTEVOXzggKDB4OCkKKworLyogVGhlIGxvdyBieXRlIHRvIHRoZSBjb250cm9sIHJlZ2lzdGVyIGRldGVybWluZSB3aGljaCByZWdpc3RlcnMgYXJlCisgICBlbmFibGVkLiAgVGhlcmUgYXJlIDQgZmllbGRzIG9mIHR3byBiaXRzLiAgT25lIGJpdCBpcyAibG9jYWwiLCBtZWFuaW5nCisgICB0aGF0IHRoZSBwcm9jZXNzb3Igd2lsbCByZXNldCB0aGUgYml0IGFmdGVyIGEgdGFzayBzd2l0Y2ggYW5kIHRoZSBvdGhlcgorICAgaXMgZ2xvYmFsIG1lYW5pbmcgdGhhdCB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgcmVzZXQgdGhlIGJpdC4gIFdpdGggbGludXgsCisgICB5b3UgY2FuIHVzZSBlaXRoZXIgb25lLCBzaW5jZSB3ZSBleHBsaWNpdGx5IHplcm8gdGhlIHJlZ2lzdGVyIHdoZW4gd2UgZW50ZXIKKyAgIGtlcm5lbCBtb2RlLiAqLworCisjZGVmaW5lIERSX0xPQ0FMX0VOQUJMRV9TSElGVCAwICAgIC8qIEV4dHJhIHNoaWZ0IHRvIHRoZSBsb2NhbCBlbmFibGUgYml0ICovCisjZGVmaW5lIERSX0dMT0JBTF9FTkFCTEVfU0hJRlQgMSAgIC8qIEV4dHJhIHNoaWZ0IHRvIHRoZSBnbG9iYWwgZW5hYmxlIGJpdCAqLworI2RlZmluZSBEUl9MT0NBTF9FTkFCTEUgKDB4MSkgICAgICAvKiBMb2NhbCBlbmFibGUgZm9yIHJlZyAwICovCisjZGVmaW5lIERSX0dMT0JBTF9FTkFCTEUgKDB4MikgICAgIC8qIEdsb2JhbCBlbmFibGUgZm9yIHJlZyAwICovCisjZGVmaW5lIERSX0VOQUJMRV9TSVpFIDIgICAgICAgICAgIC8qIDIgZW5hYmxlIGJpdHMgcGVyIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgRFJfTE9DQUxfRU5BQkxFX01BU0sgKDB4NTUpICAvKiBTZXQgIGxvY2FsIGJpdHMgZm9yIGFsbCA0IHJlZ3MgKi8KKyNkZWZpbmUgRFJfR0xPQkFMX0VOQUJMRV9NQVNLICgweEFBKSAvKiBTZXQgZ2xvYmFsIGJpdHMgZm9yIGFsbCA0IHJlZ3MgKi8KKworLyogVGhlIHNlY29uZCBieXRlIHRvIHRoZSBjb250cm9sIHJlZ2lzdGVyIGhhcyBhIGZldyBzcGVjaWFsIHRoaW5ncy4KKyAgIFdlIGNhbiBzbG93IHRoZSBpbnN0cnVjdGlvbiBwaXBlbGluZSBmb3IgaW5zdHJ1Y3Rpb25zIGNvbWluZyB2aWEgdGhlCisgICBnZHQgb3IgdGhlIGxkdCBpZiB3ZSB3YW50IHRvLiAgSSBhbSBub3Qgc3VyZSB3aHkgdGhpcyBpcyBhbiBhZHZhbnRhZ2UgKi8KKworI2lmZGVmIF9faTM4Nl9fCisjZGVmaW5lIERSX0NPTlRST0xfUkVTRVJWRUQgKDB4RkMwMCkgLyogUmVzZXJ2ZWQgYnkgSW50ZWwgKi8KKyNlbHNlCisjZGVmaW5lIERSX0NPTlRST0xfUkVTRVJWRUQgKDB4RkZGRkZGRkYwMDAwRkMwMFVMKSAvKiBSZXNlcnZlZCAqLworI2VuZGlmCisKKyNkZWZpbmUgRFJfTE9DQUxfU0xPV0RPV04gKDB4MTAwKSAgIC8qIExvY2FsIHNsb3cgdGhlIHBpcGVsaW5lICovCisjZGVmaW5lIERSX0dMT0JBTF9TTE9XRE9XTiAoMHgyMDApICAvKiBHbG9iYWwgc2xvdyB0aGUgcGlwZWxpbmUgKi8KKworLyoKKyAqIEhXIGJyZWFrcG9pbnQgYWRkaXRpb25zCisgKi8KKworI2VuZGlmIC8qIF9BU01fWDg2X0RFQlVHUkVHX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vZTgyMC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9lODIwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJlZTU1OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vZTgyMC5oCkBAIC0wLDAgKzEsNzIgQEAKKyNpZm5kZWYgX0FTTV9YODZfRTgyMF9ICisjZGVmaW5lIF9BU01fWDg2X0U4MjBfSAorI2RlZmluZSBFODIwTUFQCTB4MmQwCQkvKiBvdXIgbWFwICovCisjZGVmaW5lIEU4MjBNQVgJMTI4CQkvKiBudW1iZXIgb2YgZW50cmllcyBpbiBFODIwTUFQICovCisKKy8qCisgKiBMZWdhY3kgRTgyMCBCSU9TIGxpbWl0cyB1cyB0byAxMjggKEU4MjBNQVgpIG5vZGVzIGR1ZSB0byB0aGUKKyAqIGNvbnN0cmFpbmVkIHNwYWNlIGluIHRoZSB6ZXJvcGFnZS4gIElmIHdlIGhhdmUgbW9yZSBub2RlcyB0aGFuCisgKiB0aGF0LCBhbmQgaWYgd2UndmUgYm9vdGVkIG9mZiBFRkkgZmlybXdhcmUsIHRoZW4gdGhlIEVGSSB0YWJsZXMKKyAqIHBhc3NlZCB1cyBmcm9tIHRoZSBFRkkgZmlybXdhcmUgY2FuIGxpc3QgbW9yZSBub2Rlcy4gIFNpemUgb3VyCisgKiBpbnRlcm5hbCBtZW1vcnkgbWFwIHRhYmxlcyB0byBoYXZlIHJvb20gZm9yIHRoZXNlIGFkZGl0aW9uYWwKKyAqIG5vZGVzLCBiYXNlZCBvbiB1cCB0byB0aHJlZSBlbnRyaWVzIHBlciBub2RlIGZvciB3aGljaCB0aGUKKyAqIGtlcm5lbCB3YXMgYnVpbHQ6IE1BWF9OVU1OT0RFUyA9PSAoMSA8PCBDT05GSUdfTk9ERVNfU0hJRlQpLAorICogcGx1cyBFODIwTUFYLCBhbGxvd2luZyBzcGFjZSBmb3IgdGhlIHBvc3NpYmxlIGR1cGxpY2F0ZSBFODIwCisgKiBlbnRyaWVzIHRoYXQgbWlnaHQgbmVlZCByb29tIGluIHRoZSBzYW1lIGFycmF5cywgcHJpb3IgdG8gdGhlCisgKiBjYWxsIHRvIHNhbml0aXplX2U4MjBfbWFwKCkgdG8gcmVtb3ZlIGR1cGxpY2F0ZXMuICBUaGUgYWxsb3dhbmNlCisgKiBvZiB0aHJlZSBtZW1vcnkgbWFwIGVudHJpZXMgcGVyIG5vZGUgaXMgImVub3VnaCIgZW50cmllcyBmb3IKKyAqIHRoZSBpbml0aWFsIGhhcmR3YXJlIHBsYXRmb3JtIG1vdGl2YXRpbmcgdGhpcyBtZWNoYW5pc20gdG8gbWFrZQorICogdXNlIG9mIGFkZGl0aW9uYWwgRUZJIG1hcCBlbnRyaWVzLiAgRnV0dXJlIHBsYXRmb3JtcyBtYXkgd2FudAorICogdG8gYWxsb3cgbW9yZSB0aGFuIHRocmVlIGVudHJpZXMgcGVyIG5vZGUgb3Igb3RoZXJ3aXNlIHJlZmluZQorICogdGhpcyBzaXplLgorICovCisKKy8qCisgKiBPZGQ6ICdtYWtlIGhlYWRlcnNfY2hlY2snIGNvbXBsYWlucyBhYm91dCBudW1hLmggaWYgSSB0cnkKKyAqIHRvIGNvbGxhcHNlIHRoZSBuZXh0IHR3byAjaWZkZWYgbGluZXMgdG8gYSBzaW5nbGUgbGluZToKKyAqCSNpZiBkZWZpbmVkKF9fS0VSTkVMX18pICYmIGRlZmluZWQoQ09ORklHX0VGSSkKKyAqLworI2RlZmluZSBFODIwX1hfTUFYIEU4MjBNQVgKKworI2RlZmluZSBFODIwTlIJMHgxZTgJCS8qICMgZW50cmllcyBpbiBFODIwTUFQICovCisKKyNkZWZpbmUgRTgyMF9SQU0JMQorI2RlZmluZSBFODIwX1JFU0VSVkVECTIKKyNkZWZpbmUgRTgyMF9BQ1BJCTMKKyNkZWZpbmUgRTgyMF9OVlMJNAorI2RlZmluZSBFODIwX1VOVVNBQkxFCTUKKworLyoKKyAqIHJlc2VydmVkIFJBTSB1c2VkIGJ5IGtlcm5lbCBpdHNlbGYKKyAqIGlmIENPTkZJR19JTlRFTF9UWFQgaXMgZW5hYmxlZCwgbWVtb3J5IG9mIHRoaXMgdHlwZSB3aWxsIGJlCisgKiBpbmNsdWRlZCBpbiB0aGUgUzMgaW50ZWdyaXR5IGNhbGN1bGF0aW9uIGFuZCBzbyBzaG91bGQgbm90IGluY2x1ZGUKKyAqIGFueSBtZW1vcnkgdGhhdCBCSU9TIG1pZ2h0IGFsdGVyIG92ZXIgdGhlIFMzIHRyYW5zaXRpb24KKyAqLworI2RlZmluZSBFODIwX1JFU0VSVkVEX0tFUk4gICAgICAgIDEyOAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CitzdHJ1Y3QgZTgyMGVudHJ5IHsKKwlfX3U2NCBhZGRyOwkvKiBzdGFydCBvZiBtZW1vcnkgc2VnbWVudCAqLworCV9fdTY0IHNpemU7CS8qIHNpemUgb2YgbWVtb3J5IHNlZ21lbnQgKi8KKwlfX3UzMiB0eXBlOwkvKiB0eXBlIG9mIG1lbW9yeSBzZWdtZW50ICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZTgyMG1hcCB7CisJX191MzIgbnJfbWFwOworCXN0cnVjdCBlODIwZW50cnkgbWFwW0U4MjBfWF9NQVhdOworfTsKKworI2RlZmluZSBJU0FfU1RBUlRfQUREUkVTUwkweGEwMDAwCisjZGVmaW5lIElTQV9FTkRfQUREUkVTUwkJMHgxMDAwMDAKKworI2RlZmluZSBCSU9TX0JFR0lOCQkweDAwMGEwMDAwCisjZGVmaW5lIEJJT1NfRU5ECQkweDAwMTAwMDAwCisKKyNkZWZpbmUgQklPU19ST01fQkFTRQkJMHhmZmUwMDAwMAorI2RlZmluZSBCSU9TX1JPTV9FTkQJCTB4ZmZmZmZmZmYKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9FODIwX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vZXJybm8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vZXJybm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzgyYjUwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9lcnJuby5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9lcnJuby5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9mY250bC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9mY250bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YWIxMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2ZjbnRsLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ZjbnRsLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2h3X2JyZWFrcG9pbnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vaHdfYnJlYWtwb2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNjRlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2h3X2JyZWFrcG9pbnQuaApAQCAtMCwwICsxLDUgQEAKKyNpZm5kZWYJX0kzODZfSFdfQlJFQUtQT0lOVF9ICisjZGVmaW5lCV9JMzg2X0hXX0JSRUFLUE9JTlRfSAorCisjZW5kaWYJLyogX0kzODZfSFdfQlJFQUtQT0lOVF9IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vaHlwZXJ2LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2h5cGVydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MDQyMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2h5cGVydi5oCkBAIC0wLDAgKzEsMTk0IEBACisjaWZuZGVmIF9BU01fWDg2X0hZUEVSVl9ICisjZGVmaW5lIF9BU01fWDg2X0hZUEVSVl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogVGhlIGJlbG93IENQVUlEIGxlYXZlcyBhcmUgcHJlc2VudCBpZiBWZXJzaW9uQW5kRmVhdHVyZXMuSHlwZXJ2aXNvclByZXNlbnQKKyAqIGlzIHNldCBieSBDUFVJRChIdkNwdUlkRnVuY3Rpb25WZXJzaW9uQW5kRmVhdHVyZXMpLgorICovCisjZGVmaW5lIEhZUEVSVl9DUFVJRF9WRU5ET1JfQU5EX01BWF9GVU5DVElPTlMJMHg0MDAwMDAwMAorI2RlZmluZSBIWVBFUlZfQ1BVSURfSU5URVJGQUNFCQkJMHg0MDAwMDAwMQorI2RlZmluZSBIWVBFUlZfQ1BVSURfVkVSU0lPTgkJCTB4NDAwMDAwMDIKKyNkZWZpbmUgSFlQRVJWX0NQVUlEX0ZFQVRVUkVTCQkJMHg0MDAwMDAwMworI2RlZmluZSBIWVBFUlZfQ1BVSURfRU5MSUdIVE1FTlRfSU5GTwkJMHg0MDAwMDAwNAorI2RlZmluZSBIWVBFUlZfQ1BVSURfSU1QTEVNRU5UX0xJTUlUUwkJMHg0MDAwMDAwNQorCisjZGVmaW5lIEhZUEVSVl9IWVBFUlZJU09SX1BSRVNFTlRfQklUCQkweDgwMDAwMDAwCisjZGVmaW5lIEhZUEVSVl9DUFVJRF9NSU4JCQkweDQwMDAwMDA1CisjZGVmaW5lIEhZUEVSVl9DUFVJRF9NQVgJCQkweDQwMDBmZmZmCisKKy8qCisgKiBGZWF0dXJlIGlkZW50aWZpY2F0aW9uLiBFQVggaW5kaWNhdGVzIHdoaWNoIGZlYXR1cmVzIGFyZSBhdmFpbGFibGUKKyAqIHRvIHRoZSBwYXJ0aXRpb24gYmFzZWQgdXBvbiB0aGUgY3VycmVudCBwYXJ0aXRpb24gcHJpdmlsZWdlcy4KKyAqLworCisvKiBWUCBSdW50aW1lIChIVl9YNjRfTVNSX1ZQX1JVTlRJTUUpIGF2YWlsYWJsZSAqLworI2RlZmluZSBIVl9YNjRfTVNSX1ZQX1JVTlRJTUVfQVZBSUxBQkxFCQkoMSA8PCAwKQorLyogUGFydGl0aW9uIFJlZmVyZW5jZSBDb3VudGVyIChIVl9YNjRfTVNSX1RJTUVfUkVGX0NPVU5UKSBhdmFpbGFibGUqLworI2RlZmluZSBIVl9YNjRfTVNSX1RJTUVfUkVGX0NPVU5UX0FWQUlMQUJMRQkoMSA8PCAxKQorLyoKKyAqIEJhc2ljIFN5bklDIE1TUnMgKEhWX1g2NF9NU1JfU0NPTlRST0wgdGhyb3VnaCBIVl9YNjRfTVNSX0VPTQorICogYW5kIEhWX1g2NF9NU1JfU0lOVDAgdGhyb3VnaCBIVl9YNjRfTVNSX1NJTlQxNSkgYXZhaWxhYmxlCisgKi8KKyNkZWZpbmUgSFZfWDY0X01TUl9TWU5JQ19BVkFJTEFCTEUJCSgxIDw8IDIpCisvKgorICogU3ludGhldGljIFRpbWVyIE1TUnMgKEhWX1g2NF9NU1JfU1RJTUVSMF9DT05GSUcgdGhyb3VnaAorICogSFZfWDY0X01TUl9TVElNRVIzX0NPVU5UKSBhdmFpbGFibGUKKyAqLworI2RlZmluZSBIVl9YNjRfTVNSX1NZTlRJTUVSX0FWQUlMQUJMRQkJKDEgPDwgMykKKy8qCisgKiBBUElDIGFjY2VzcyBNU1JzIChIVl9YNjRfTVNSX0VPSSwgSFZfWDY0X01TUl9JQ1IgYW5kIEhWX1g2NF9NU1JfVFBSKQorICogYXJlIGF2YWlsYWJsZQorICovCisjZGVmaW5lIEhWX1g2NF9NU1JfQVBJQ19BQ0NFU1NfQVZBSUxBQkxFCSgxIDw8IDQpCisvKiBIeXBlcmNhbGwgTVNScyAoSFZfWDY0X01TUl9HVUVTVF9PU19JRCBhbmQgSFZfWDY0X01TUl9IWVBFUkNBTEwpIGF2YWlsYWJsZSovCisjZGVmaW5lIEhWX1g2NF9NU1JfSFlQRVJDQUxMX0FWQUlMQUJMRQkJKDEgPDwgNSkKKy8qIEFjY2VzcyB2aXJ0dWFsIHByb2Nlc3NvciBpbmRleCBNU1IgKEhWX1g2NF9NU1JfVlBfSU5ERVgpIGF2YWlsYWJsZSovCisjZGVmaW5lIEhWX1g2NF9NU1JfVlBfSU5ERVhfQVZBSUxBQkxFCQkoMSA8PCA2KQorLyogVmlydHVhbCBzeXN0ZW0gcmVzZXQgTVNSIChIVl9YNjRfTVNSX1JFU0VUKSBpcyBhdmFpbGFibGUqLworI2RlZmluZSBIVl9YNjRfTVNSX1JFU0VUX0FWQUlMQUJMRQkJKDEgPDwgNykKKyAvKgorICAqIEFjY2VzcyBzdGF0aXN0aWNzIHBhZ2VzIE1TUnMgKEhWX1g2NF9NU1JfU1RBVFNfUEFSVElUSU9OX1JFVEFJTF9QQUdFLAorICAqIEhWX1g2NF9NU1JfU1RBVFNfUEFSVElUSU9OX0lOVEVSTkFMX1BBR0UsIEhWX1g2NF9NU1JfU1RBVFNfVlBfUkVUQUlMX1BBR0UsCisgICogSFZfWDY0X01TUl9TVEFUU19WUF9JTlRFUk5BTF9QQUdFKSBhdmFpbGFibGUKKyAgKi8KKyNkZWZpbmUgSFZfWDY0X01TUl9TVEFUX1BBR0VTX0FWQUlMQUJMRQkJKDEgPDwgOCkKKworLyoKKyAqIEZlYXR1cmUgaWRlbnRpZmljYXRpb246IEVCWCBpbmRpY2F0ZXMgd2hpY2ggZmxhZ3Mgd2VyZSBzcGVjaWZpZWQgYXQKKyAqIHBhcnRpdGlvbiBjcmVhdGlvbi4gVGhlIGZvcm1hdCBpcyB0aGUgc2FtZSBhcyB0aGUgcGFydGl0aW9uIGNyZWF0aW9uCisgKiBmbGFnIHN0cnVjdHVyZSBkZWZpbmVkIGluIHNlY3Rpb24gUGFydGl0aW9uIENyZWF0aW9uIEZsYWdzLgorICovCisjZGVmaW5lIEhWX1g2NF9DUkVBVEVfUEFSVElUSU9OUwkJKDEgPDwgMCkKKyNkZWZpbmUgSFZfWDY0X0FDQ0VTU19QQVJUSVRJT05fSUQJCSgxIDw8IDEpCisjZGVmaW5lIEhWX1g2NF9BQ0NFU1NfTUVNT1JZX1BPT0wJCSgxIDw8IDIpCisjZGVmaW5lIEhWX1g2NF9BREpVU1RfTUVTU0FHRV9CVUZGRVJTCQkoMSA8PCAzKQorI2RlZmluZSBIVl9YNjRfUE9TVF9NRVNTQUdFUwkJCSgxIDw8IDQpCisjZGVmaW5lIEhWX1g2NF9TSUdOQUxfRVZFTlRTCQkJKDEgPDwgNSkKKyNkZWZpbmUgSFZfWDY0X0NSRUFURV9QT1JUCQkJKDEgPDwgNikKKyNkZWZpbmUgSFZfWDY0X0NPTk5FQ1RfUE9SVAkJCSgxIDw8IDcpCisjZGVmaW5lIEhWX1g2NF9BQ0NFU1NfU1RBVFMJCQkoMSA8PCA4KQorI2RlZmluZSBIVl9YNjRfREVCVUdHSU5HCQkJKDEgPDwgMTEpCisjZGVmaW5lIEhWX1g2NF9DUFVfUE9XRVJfTUFOQUdFTUVOVAkJKDEgPDwgMTIpCisjZGVmaW5lIEhWX1g2NF9DT05GSUdVUkVfUFJPRklMRVIJCSgxIDw8IDEzKQorCisvKgorICogRmVhdHVyZSBpZGVudGlmaWNhdGlvbi4gRURYIGluZGljYXRlcyB3aGljaCBtaXNjZWxsYW5lb3VzIGZlYXR1cmVzCisgKiBhcmUgYXZhaWxhYmxlIHRvIHRoZSBwYXJ0aXRpb24uCisgKi8KKy8qIFRoZSBNV0FJVCBpbnN0cnVjdGlvbiBpcyBhdmFpbGFibGUgKHBlciBzZWN0aW9uIE1PTklUT1IgLyBNV0FJVCkgKi8KKyNkZWZpbmUgSFZfWDY0X01XQUlUX0FWQUlMQUJMRQkJCQkoMSA8PCAwKQorLyogR3Vlc3QgZGVidWdnaW5nIHN1cHBvcnQgaXMgYXZhaWxhYmxlICovCisjZGVmaW5lIEhWX1g2NF9HVUVTVF9ERUJVR0dJTkdfQVZBSUxBQkxFCQkoMSA8PCAxKQorLyogUGVyZm9ybWFuY2UgTW9uaXRvciBzdXBwb3J0IGlzIGF2YWlsYWJsZSovCisjZGVmaW5lIEhWX1g2NF9QRVJGX01PTklUT1JfQVZBSUxBQkxFCQkJKDEgPDwgMikKKy8qIFN1cHBvcnQgZm9yIHBoeXNpY2FsIENQVSBkeW5hbWljIHBhcnRpdGlvbmluZyBldmVudHMgaXMgYXZhaWxhYmxlKi8KKyNkZWZpbmUgSFZfWDY0X0NQVV9EWU5BTUlDX1BBUlRJVElPTklOR19BVkFJTEFCTEUJKDEgPDwgMykKKy8qCisgKiBTdXBwb3J0IGZvciBwYXNzaW5nIGh5cGVyY2FsbCBpbnB1dCBwYXJhbWV0ZXIgYmxvY2sgdmlhIFhNTQorICogcmVnaXN0ZXJzIGlzIGF2YWlsYWJsZQorICovCisjZGVmaW5lIEhWX1g2NF9IWVBFUkNBTExfUEFSQU1TX1hNTV9BVkFJTEFCTEUJCSgxIDw8IDQpCisvKiBTdXBwb3J0IGZvciBhIHZpcnR1YWwgZ3Vlc3QgaWRsZSBzdGF0ZSBpcyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgSFZfWDY0X0dVRVNUX0lETEVfU1RBVEVfQVZBSUxBQkxFCQkoMSA8PCA1KQorCisvKgorICogSW1wbGVtZW50YXRpb24gcmVjb21tZW5kYXRpb25zLiBJbmRpY2F0ZXMgd2hpY2ggYmVoYXZpb3JzIHRoZSBoeXBlcnZpc29yCisgKiByZWNvbW1lbmRzIHRoZSBPUyBpbXBsZW1lbnQgZm9yIG9wdGltYWwgcGVyZm9ybWFuY2UuCisgKi8KKyAvKgorICAqIFJlY29tbWVuZCB1c2luZyBoeXBlcmNhbGwgZm9yIGFkZHJlc3Mgc3BhY2Ugc3dpdGNoZXMgcmF0aGVyCisgICogdGhhbiBNT1YgdG8gQ1IzIGluc3RydWN0aW9uCisgICovCisjZGVmaW5lIEhWX1g2NF9NV0FJVF9SRUNPTU1FTkRFRAkJKDEgPDwgMCkKKy8qIFJlY29tbWVuZCB1c2luZyBoeXBlcmNhbGwgZm9yIGxvY2FsIFRMQiBmbHVzaGVzIHJhdGhlcgorICogdGhhbiBJTlZMUEcgb3IgTU9WIHRvIENSMyBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgSFZfWDY0X0xPQ0FMX1RMQl9GTFVTSF9SRUNPTU1FTkRFRAkoMSA8PCAxKQorLyoKKyAqIFJlY29tbWVuZCB1c2luZyBoeXBlcmNhbGwgZm9yIHJlbW90ZSBUTEIgZmx1c2hlcyByYXRoZXIKKyAqIHRoYW4gaW50ZXItcHJvY2Vzc29yIGludGVycnVwdHMKKyAqLworI2RlZmluZSBIVl9YNjRfUkVNT1RFX1RMQl9GTFVTSF9SRUNPTU1FTkRFRAkoMSA8PCAyKQorLyoKKyAqIFJlY29tbWVuZCB1c2luZyBNU1JzIGZvciBhY2Nlc3NpbmcgQVBJQyByZWdpc3RlcnMKKyAqIEVPSSwgSUNSIGFuZCBUUFIgcmF0aGVyIHRoYW4gdGhlaXIgbWVtb3J5LW1hcHBlZCBjb3VudGVycGFydHMKKyAqLworI2RlZmluZSBIVl9YNjRfQVBJQ19BQ0NFU1NfUkVDT01NRU5ERUQJCSgxIDw8IDMpCisvKiBSZWNvbW1lbmQgdXNpbmcgdGhlIGh5cGVydmlzb3ItcHJvdmlkZWQgTVNSIHRvIGluaXRpYXRlIGEgc3lzdGVtIFJFU0VUICovCisjZGVmaW5lIEhWX1g2NF9TWVNURU1fUkVTRVRfUkVDT01NRU5ERUQJCSgxIDw8IDQpCisvKgorICogUmVjb21tZW5kIHVzaW5nIHJlbGF4ZWQgdGltaW5nIGZvciB0aGlzIHBhcnRpdGlvbi4gSWYgdXNlZCwKKyAqIHRoZSBWTSBzaG91bGQgZGlzYWJsZSBhbnkgd2F0Y2hkb2cgdGltZW91dHMgdGhhdCByZWx5IG9uIHRoZQorICogdGltZWx5IGRlbGl2ZXJ5IG9mIGV4dGVybmFsIGludGVycnVwdHMKKyAqLworI2RlZmluZSBIVl9YNjRfUkVMQVhFRF9USU1JTkdfUkVDT01NRU5ERUQJKDEgPDwgNSkKKworLyogTVNSIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGd1ZXN0IE9TLiAqLworI2RlZmluZSBIVl9YNjRfTVNSX0dVRVNUX09TX0lECQkJMHg0MDAwMDAwMAorCisvKiBNU1IgdXNlZCB0byBzZXR1cCBwYWdlcyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGh5cGVydmlzb3IuICovCisjZGVmaW5lIEhWX1g2NF9NU1JfSFlQRVJDQUxMCQkJMHg0MDAwMDAwMQorCisvKiBNU1IgdXNlZCB0byBwcm92aWRlIHZjcHUgaW5kZXggKi8KKyNkZWZpbmUgSFZfWDY0X01TUl9WUF9JTkRFWAkJCTB4NDAwMDAwMDIKKworLyogTVNSIHVzZWQgdG8gcmVhZCB0aGUgcGVyLXBhcnRpdGlvbiB0aW1lIHJlZmVyZW5jZSBjb3VudGVyICovCisjZGVmaW5lIEhWX1g2NF9NU1JfVElNRV9SRUZfQ09VTlQJCTB4NDAwMDAwMjAKKworLyogRGVmaW5lIHRoZSB2aXJ0dWFsIEFQSUMgcmVnaXN0ZXJzICovCisjZGVmaW5lIEhWX1g2NF9NU1JfRU9JCQkJCTB4NDAwMDAwNzAKKyNkZWZpbmUgSFZfWDY0X01TUl9JQ1IJCQkJMHg0MDAwMDA3MQorI2RlZmluZSBIVl9YNjRfTVNSX1RQUgkJCQkweDQwMDAwMDcyCisjZGVmaW5lIEhWX1g2NF9NU1JfQVBJQ19BU1NJU1RfUEFHRQkJMHg0MDAwMDA3MworCisvKiBEZWZpbmUgc3ludGhldGljIGludGVycnVwdCBjb250cm9sbGVyIG1vZGVsIHNwZWNpZmljIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgSFZfWDY0X01TUl9TQ09OVFJPTAkJCTB4NDAwMDAwODAKKyNkZWZpbmUgSFZfWDY0X01TUl9TVkVSU0lPTgkJCTB4NDAwMDAwODEKKyNkZWZpbmUgSFZfWDY0X01TUl9TSUVGUAkJCTB4NDAwMDAwODIKKyNkZWZpbmUgSFZfWDY0X01TUl9TSU1QCQkJCTB4NDAwMDAwODMKKyNkZWZpbmUgSFZfWDY0X01TUl9FT00JCQkJMHg0MDAwMDA4NAorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQwCQkJMHg0MDAwMDA5MAorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQxCQkJMHg0MDAwMDA5MQorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQyCQkJMHg0MDAwMDA5MgorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQzCQkJMHg0MDAwMDA5MworI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQ0CQkJMHg0MDAwMDA5NAorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQ1CQkJMHg0MDAwMDA5NQorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQ2CQkJMHg0MDAwMDA5NgorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQ3CQkJMHg0MDAwMDA5NworI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQ4CQkJMHg0MDAwMDA5OAorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQ5CQkJMHg0MDAwMDA5OQorI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQxMAkJCTB4NDAwMDAwOUEKKyNkZWZpbmUgSFZfWDY0X01TUl9TSU5UMTEJCQkweDQwMDAwMDlCCisjZGVmaW5lIEhWX1g2NF9NU1JfU0lOVDEyCQkJMHg0MDAwMDA5QworI2RlZmluZSBIVl9YNjRfTVNSX1NJTlQxMwkJCTB4NDAwMDAwOUQKKyNkZWZpbmUgSFZfWDY0X01TUl9TSU5UMTQJCQkweDQwMDAwMDlFCisjZGVmaW5lIEhWX1g2NF9NU1JfU0lOVDE1CQkJMHg0MDAwMDA5RgorCisKKyNkZWZpbmUgSFZfWDY0X01TUl9IWVBFUkNBTExfRU5BQkxFCQkweDAwMDAwMDAxCisjZGVmaW5lIEhWX1g2NF9NU1JfSFlQRVJDQUxMX1BBR0VfQUREUkVTU19TSElGVAkxMgorI2RlZmluZSBIVl9YNjRfTVNSX0hZUEVSQ0FMTF9QQUdFX0FERFJFU1NfTUFTSwlcCisJCSh+KCgxdWxsIDw8IEhWX1g2NF9NU1JfSFlQRVJDQUxMX1BBR0VfQUREUkVTU19TSElGVCkgLSAxKSkKKworLyogRGVjbGFyZSB0aGUgdmFyaW91cyBoeXBlcmNhbGwgb3BlcmF0aW9ucy4gKi8KKyNkZWZpbmUgSFZfWDY0X0hWX05PVElGWV9MT05HX1NQSU5fV0FJVAkJMHgwMDA4CisKKyNkZWZpbmUgSFZfWDY0X01TUl9BUElDX0FTU0lTVF9QQUdFX0VOQUJMRQkJMHgwMDAwMDAwMQorI2RlZmluZSBIVl9YNjRfTVNSX0FQSUNfQVNTSVNUX1BBR0VfQUREUkVTU19TSElGVAkxMgorI2RlZmluZSBIVl9YNjRfTVNSX0FQSUNfQVNTSVNUX1BBR0VfQUREUkVTU19NQVNLCVwKKwkJKH4oKDF1bGwgPDwgSFZfWDY0X01TUl9BUElDX0FTU0lTVF9QQUdFX0FERFJFU1NfU0hJRlQpIC0gMSkpCisKKyNkZWZpbmUgSFZfUFJPQ0VTU09SX1BPV0VSX1NUQVRFX0MwCQkwCisjZGVmaW5lIEhWX1BST0NFU1NPUl9QT1dFUl9TVEFURV9DMQkJMQorI2RlZmluZSBIVl9QUk9DRVNTT1JfUE9XRVJfU1RBVEVfQzIJCTIKKyNkZWZpbmUgSFZfUFJPQ0VTU09SX1BPV0VSX1NUQVRFX0MzCQkzCisKKy8qIGh5cGVyY2FsbCBzdGF0dXMgY29kZSAqLworI2RlZmluZSBIVl9TVEFUVVNfU1VDQ0VTUwkJCTAKKyNkZWZpbmUgSFZfU1RBVFVTX0lOVkFMSURfSFlQRVJDQUxMX0NPREUJMgorI2RlZmluZSBIVl9TVEFUVVNfSU5WQUxJRF9IWVBFUkNBTExfSU5QVVQJMworI2RlZmluZSBIVl9TVEFUVVNfSU5WQUxJRF9BTElHTk1FTlQJCTQKKyNkZWZpbmUgSFZfU1RBVFVTX0lOU1VGRklDSUVOVF9CVUZGRVJTCQkxOQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vaW9jdGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjc5ZmUwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9pb2N0bC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pb2N0bC5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9pb2N0bHMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vaW9jdGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMzNGM3NgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vaW9jdGxzLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2lvY3Rscy5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9pcGNidWYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vaXBjYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjN2U1MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vaXBjYnVmLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2lwY2J1Zi5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9pc3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUxNTY0YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vaXN0LmgKQEAgLTAsMCArMSwyOSBAQAorI2lmbmRlZiBfQVNNX1g4Nl9JU1RfSAorI2RlZmluZSBfQVNNX1g4Nl9JU1RfSAorCisvKgorICogSW5jbHVkZSBmaWxlIGZvciB0aGUgaW50ZXJmYWNlIHRvIElTVCBCSU9TCisgKiBDb3B5cmlnaHQgMjAwMiBBbmR5IEdyb3ZlciA8YW5kcmV3Lmdyb3ZlckBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBpc3RfaW5mbyB7CisJX191MzIgc2lnbmF0dXJlOworCV9fdTMyIGNvbW1hbmQ7CisJX191MzIgZXZlbnQ7CisJX191MzIgcGVyZl9sZXZlbDsKK307CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9JU1RfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9rdm0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20va3ZtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4ZGNiZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20va3ZtLmgKQEAgLTAsMCArMSwzMjQgQEAKKyNpZm5kZWYgX0FTTV9YODZfS1ZNX0gKKyNkZWZpbmUgX0FTTV9YODZfS1ZNX0gKKworLyoKKyAqIEtWTSB4ODYgc3BlY2lmaWMgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworLyogU2VsZWN0IHg4NiBzcGVjaWZpYyBmZWF0dXJlcyBpbiA8bGludXgva3ZtLmg+ICovCisjZGVmaW5lIF9fS1ZNX0hBVkVfUElUCisjZGVmaW5lIF9fS1ZNX0hBVkVfSU9BUElDCisjZGVmaW5lIF9fS1ZNX0hBVkVfREVWSUNFX0FTU0lHTk1FTlQKKyNkZWZpbmUgX19LVk1fSEFWRV9NU0kKKyNkZWZpbmUgX19LVk1fSEFWRV9VU0VSX05NSQorI2RlZmluZSBfX0tWTV9IQVZFX0dVRVNUX0RFQlVHCisjZGVmaW5lIF9fS1ZNX0hBVkVfTVNJWAorI2RlZmluZSBfX0tWTV9IQVZFX01DRQorI2RlZmluZSBfX0tWTV9IQVZFX1BJVF9TVEFURTIKKyNkZWZpbmUgX19LVk1fSEFWRV9YRU5fSFZNCisjZGVmaW5lIF9fS1ZNX0hBVkVfVkNQVV9FVkVOVFMKKyNkZWZpbmUgX19LVk1fSEFWRV9ERUJVR1JFR1MKKyNkZWZpbmUgX19LVk1fSEFWRV9YU0FWRQorI2RlZmluZSBfX0tWTV9IQVZFX1hDUlMKKworLyogQXJjaGl0ZWN0dXJhbCBpbnRlcnJ1cHQgbGluZSBjb3VudC4gKi8KKyNkZWZpbmUgS1ZNX05SX0lOVEVSUlVQVFMgMjU2CisKK3N0cnVjdCBrdm1fbWVtb3J5X2FsaWFzIHsKKwlfX3UzMiBzbG90OyAgLyogdGhpcyBoYXMgYSBkaWZmZXJlbnQgbmFtZXNwYWNlIHRoYW4gbWVtb3J5IHNsb3RzICovCisJX191MzIgZmxhZ3M7CisJX191NjQgZ3Vlc3RfcGh5c19hZGRyOworCV9fdTY0IG1lbW9yeV9zaXplOworCV9fdTY0IHRhcmdldF9waHlzX2FkZHI7Cit9OworCisvKiBmb3IgS1ZNX0dFVF9JUlFDSElQIGFuZCBLVk1fU0VUX0lSUUNISVAgKi8KK3N0cnVjdCBrdm1fcGljX3N0YXRlIHsKKwlfX3U4IGxhc3RfaXJyOwkvKiBlZGdlIGRldGVjdGlvbiAqLworCV9fdTggaXJyOwkJLyogaW50ZXJydXB0IHJlcXVlc3QgcmVnaXN0ZXIgKi8KKwlfX3U4IGltcjsJCS8qIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCisJX191OCBpc3I7CQkvKiBpbnRlcnJ1cHQgc2VydmljZSByZWdpc3RlciAqLworCV9fdTggcHJpb3JpdHlfYWRkOwkvKiBoaWdoZXN0IGlycSBwcmlvcml0eSAqLworCV9fdTggaXJxX2Jhc2U7CisJX191OCByZWFkX3JlZ19zZWxlY3Q7CisJX191OCBwb2xsOworCV9fdTggc3BlY2lhbF9tYXNrOworCV9fdTggaW5pdF9zdGF0ZTsKKwlfX3U4IGF1dG9fZW9pOworCV9fdTggcm90YXRlX29uX2F1dG9fZW9pOworCV9fdTggc3BlY2lhbF9mdWxseV9uZXN0ZWRfbW9kZTsKKwlfX3U4IGluaXQ0OwkJLyogdHJ1ZSBpZiA0IGJ5dGUgaW5pdCAqLworCV9fdTggZWxjcjsJCS8qIFBJSVggZWRnZS90cmlnZ2VyIHNlbGVjdGlvbiAqLworCV9fdTggZWxjcl9tYXNrOworfTsKKworI2RlZmluZSBLVk1fSU9BUElDX05VTV9QSU5TICAyNAorc3RydWN0IGt2bV9pb2FwaWNfc3RhdGUgeworCV9fdTY0IGJhc2VfYWRkcmVzczsKKwlfX3UzMiBpb3JlZ3NlbDsKKwlfX3UzMiBpZDsKKwlfX3UzMiBpcnI7CisJX191MzIgcGFkOworCXVuaW9uIHsKKwkJX191NjQgYml0czsKKwkJc3RydWN0IHsKKwkJCV9fdTggdmVjdG9yOworCQkJX191OCBkZWxpdmVyeV9tb2RlOjM7CisJCQlfX3U4IGRlc3RfbW9kZToxOworCQkJX191OCBkZWxpdmVyeV9zdGF0dXM6MTsKKwkJCV9fdTggcG9sYXJpdHk6MTsKKwkJCV9fdTggcmVtb3RlX2lycjoxOworCQkJX191OCB0cmlnX21vZGU6MTsKKwkJCV9fdTggbWFzazoxOworCQkJX191OCByZXNlcnZlOjc7CisJCQlfX3U4IHJlc2VydmVkWzRdOworCQkJX191OCBkZXN0X2lkOworCQl9IGZpZWxkczsKKwl9IHJlZGlydGJsW0tWTV9JT0FQSUNfTlVNX1BJTlNdOworfTsKKworI2RlZmluZSBLVk1fSVJRQ0hJUF9QSUNfTUFTVEVSICAgMAorI2RlZmluZSBLVk1fSVJRQ0hJUF9QSUNfU0xBVkUgICAgMQorI2RlZmluZSBLVk1fSVJRQ0hJUF9JT0FQSUMgICAgICAgMgorI2RlZmluZSBLVk1fTlJfSVJRQ0hJUFMgICAgICAgICAgMworCisvKiBmb3IgS1ZNX0dFVF9SRUdTIGFuZCBLVk1fU0VUX1JFR1MgKi8KK3N0cnVjdCBrdm1fcmVncyB7CisJLyogb3V0IChLVk1fR0VUX1JFR1MpIC8gaW4gKEtWTV9TRVRfUkVHUykgKi8KKwlfX3U2NCByYXgsIHJieCwgcmN4LCByZHg7CisJX191NjQgcnNpLCByZGksIHJzcCwgcmJwOworCV9fdTY0IHI4LCAgcjksICByMTAsIHIxMTsKKwlfX3U2NCByMTIsIHIxMywgcjE0LCByMTU7CisJX191NjQgcmlwLCByZmxhZ3M7Cit9OworCisvKiBmb3IgS1ZNX0dFVF9MQVBJQyBhbmQgS1ZNX1NFVF9MQVBJQyAqLworI2RlZmluZSBLVk1fQVBJQ19SRUdfU0laRSAweDQwMAorc3RydWN0IGt2bV9sYXBpY19zdGF0ZSB7CisJY2hhciByZWdzW0tWTV9BUElDX1JFR19TSVpFXTsKK307CisKK3N0cnVjdCBrdm1fc2VnbWVudCB7CisJX191NjQgYmFzZTsKKwlfX3UzMiBsaW1pdDsKKwlfX3UxNiBzZWxlY3RvcjsKKwlfX3U4ICB0eXBlOworCV9fdTggIHByZXNlbnQsIGRwbCwgZGIsIHMsIGwsIGcsIGF2bDsKKwlfX3U4ICB1bnVzYWJsZTsKKwlfX3U4ICBwYWRkaW5nOworfTsKKworc3RydWN0IGt2bV9kdGFibGUgeworCV9fdTY0IGJhc2U7CisJX191MTYgbGltaXQ7CisJX191MTYgcGFkZGluZ1szXTsKK307CisKKworLyogZm9yIEtWTV9HRVRfU1JFR1MgYW5kIEtWTV9TRVRfU1JFR1MgKi8KK3N0cnVjdCBrdm1fc3JlZ3MgeworCS8qIG91dCAoS1ZNX0dFVF9TUkVHUykgLyBpbiAoS1ZNX1NFVF9TUkVHUykgKi8KKwlzdHJ1Y3Qga3ZtX3NlZ21lbnQgY3MsIGRzLCBlcywgZnMsIGdzLCBzczsKKwlzdHJ1Y3Qga3ZtX3NlZ21lbnQgdHIsIGxkdDsKKwlzdHJ1Y3Qga3ZtX2R0YWJsZSBnZHQsIGlkdDsKKwlfX3U2NCBjcjAsIGNyMiwgY3IzLCBjcjQsIGNyODsKKwlfX3U2NCBlZmVyOworCV9fdTY0IGFwaWNfYmFzZTsKKwlfX3U2NCBpbnRlcnJ1cHRfYml0bWFwWyhLVk1fTlJfSU5URVJSVVBUUyArIDYzKSAvIDY0XTsKK307CisKKy8qIGZvciBLVk1fR0VUX0ZQVSBhbmQgS1ZNX1NFVF9GUFUgKi8KK3N0cnVjdCBrdm1fZnB1IHsKKwlfX3U4ICBmcHJbOF1bMTZdOworCV9fdTE2IGZjdzsKKwlfX3UxNiBmc3c7CisJX191OCAgZnR3eDsgIC8qIGluIGZ4c2F2ZSBmb3JtYXQgKi8KKwlfX3U4ICBwYWQxOworCV9fdTE2IGxhc3Rfb3Bjb2RlOworCV9fdTY0IGxhc3RfaXA7CisJX191NjQgbGFzdF9kcDsKKwlfX3U4ICB4bW1bMTZdWzE2XTsKKwlfX3UzMiBteGNzcjsKKwlfX3UzMiBwYWQyOworfTsKKworc3RydWN0IGt2bV9tc3JfZW50cnkgeworCV9fdTMyIGluZGV4OworCV9fdTMyIHJlc2VydmVkOworCV9fdTY0IGRhdGE7Cit9OworCisvKiBmb3IgS1ZNX0dFVF9NU1JTIGFuZCBLVk1fU0VUX01TUlMgKi8KK3N0cnVjdCBrdm1fbXNycyB7CisJX191MzIgbm1zcnM7IC8qIG51bWJlciBvZiBtc3JzIGluIGVudHJpZXMgKi8KKwlfX3UzMiBwYWQ7CisKKwlzdHJ1Y3Qga3ZtX21zcl9lbnRyeSBlbnRyaWVzWzBdOworfTsKKworLyogZm9yIEtWTV9HRVRfTVNSX0lOREVYX0xJU1QgKi8KK3N0cnVjdCBrdm1fbXNyX2xpc3QgeworCV9fdTMyIG5tc3JzOyAvKiBudW1iZXIgb2YgbXNycyBpbiBlbnRyaWVzICovCisJX191MzIgaW5kaWNlc1swXTsKK307CisKKworc3RydWN0IGt2bV9jcHVpZF9lbnRyeSB7CisJX191MzIgZnVuY3Rpb247CisJX191MzIgZWF4OworCV9fdTMyIGVieDsKKwlfX3UzMiBlY3g7CisJX191MzIgZWR4OworCV9fdTMyIHBhZGRpbmc7Cit9OworCisvKiBmb3IgS1ZNX1NFVF9DUFVJRCAqLworc3RydWN0IGt2bV9jcHVpZCB7CisJX191MzIgbmVudDsKKwlfX3UzMiBwYWRkaW5nOworCXN0cnVjdCBrdm1fY3B1aWRfZW50cnkgZW50cmllc1swXTsKK307CisKK3N0cnVjdCBrdm1fY3B1aWRfZW50cnkyIHsKKwlfX3UzMiBmdW5jdGlvbjsKKwlfX3UzMiBpbmRleDsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBlYXg7CisJX191MzIgZWJ4OworCV9fdTMyIGVjeDsKKwlfX3UzMiBlZHg7CisJX191MzIgcGFkZGluZ1szXTsKK307CisKKyNkZWZpbmUgS1ZNX0NQVUlEX0ZMQUdfU0lHTklGQ0FOVF9JTkRFWCAxCisjZGVmaW5lIEtWTV9DUFVJRF9GTEFHX1NUQVRFRlVMX0ZVTkMgICAgMgorI2RlZmluZSBLVk1fQ1BVSURfRkxBR19TVEFURV9SRUFEX05FWFQgIDQKKworLyogZm9yIEtWTV9TRVRfQ1BVSUQyICovCitzdHJ1Y3Qga3ZtX2NwdWlkMiB7CisJX191MzIgbmVudDsKKwlfX3UzMiBwYWRkaW5nOworCXN0cnVjdCBrdm1fY3B1aWRfZW50cnkyIGVudHJpZXNbMF07Cit9OworCisvKiBmb3IgS1ZNX0dFVF9QSVQgYW5kIEtWTV9TRVRfUElUICovCitzdHJ1Y3Qga3ZtX3BpdF9jaGFubmVsX3N0YXRlIHsKKwlfX3UzMiBjb3VudDsgLyogY2FuIGJlIDY1NTM2ICovCisJX191MTYgbGF0Y2hlZF9jb3VudDsKKwlfX3U4IGNvdW50X2xhdGNoZWQ7CisJX191OCBzdGF0dXNfbGF0Y2hlZDsKKwlfX3U4IHN0YXR1czsKKwlfX3U4IHJlYWRfc3RhdGU7CisJX191OCB3cml0ZV9zdGF0ZTsKKwlfX3U4IHdyaXRlX2xhdGNoOworCV9fdTggcndfbW9kZTsKKwlfX3U4IG1vZGU7CisJX191OCBiY2Q7CisJX191OCBnYXRlOworCV9fczY0IGNvdW50X2xvYWRfdGltZTsKK307CisKK3N0cnVjdCBrdm1fZGVidWdfZXhpdF9hcmNoIHsKKwlfX3UzMiBleGNlcHRpb247CisJX191MzIgcGFkOworCV9fdTY0IHBjOworCV9fdTY0IGRyNjsKKwlfX3U2NCBkcjc7Cit9OworCisjZGVmaW5lIEtWTV9HVUVTVERCR19VU0VfU1dfQlAJCTB4MDAwMTAwMDAKKyNkZWZpbmUgS1ZNX0dVRVNUREJHX1VTRV9IV19CUAkJMHgwMDAyMDAwMAorI2RlZmluZSBLVk1fR1VFU1REQkdfSU5KRUNUX0RCCQkweDAwMDQwMDAwCisjZGVmaW5lIEtWTV9HVUVTVERCR19JTkpFQ1RfQlAJCTB4MDAwODAwMDAKKworLyogZm9yIEtWTV9TRVRfR1VFU1RfREVCVUcgKi8KK3N0cnVjdCBrdm1fZ3Vlc3RfZGVidWdfYXJjaCB7CisJX191NjQgZGVidWdyZWdbOF07Cit9OworCitzdHJ1Y3Qga3ZtX3BpdF9zdGF0ZSB7CisJc3RydWN0IGt2bV9waXRfY2hhbm5lbF9zdGF0ZSBjaGFubmVsc1szXTsKK307CisKKyNkZWZpbmUgS1ZNX1BJVF9GTEFHU19IUEVUX0xFR0FDWSAgMHgwMDAwMDAwMQorCitzdHJ1Y3Qga3ZtX3BpdF9zdGF0ZTIgeworCXN0cnVjdCBrdm1fcGl0X2NoYW5uZWxfc3RhdGUgY2hhbm5lbHNbM107CisJX191MzIgZmxhZ3M7CisJX191MzIgcmVzZXJ2ZWRbOV07Cit9OworCitzdHJ1Y3Qga3ZtX3JlaW5qZWN0X2NvbnRyb2wgeworCV9fdTggcGl0X3JlaW5qZWN0OworCV9fdTggcmVzZXJ2ZWRbMzFdOworfTsKKworLyogV2hlbiBzZXQgaW4gZmxhZ3MsIGluY2x1ZGUgY29ycmVzcG9uZGluZyBmaWVsZHMgb24gS1ZNX1NFVF9WQ1BVX0VWRU5UUyAqLworI2RlZmluZSBLVk1fVkNQVUVWRU5UX1ZBTElEX05NSV9QRU5ESU5HCTB4MDAwMDAwMDEKKyNkZWZpbmUgS1ZNX1ZDUFVFVkVOVF9WQUxJRF9TSVBJX1ZFQ1RPUgkweDAwMDAwMDAyCisjZGVmaW5lIEtWTV9WQ1BVRVZFTlRfVkFMSURfU0hBRE9XCTB4MDAwMDAwMDQKKworLyogSW50ZXJydXB0IHNoYWRvdyBzdGF0ZXMgKi8KKyNkZWZpbmUgS1ZNX1g4Nl9TSEFET1dfSU5UX01PVl9TUwkweDAxCisjZGVmaW5lIEtWTV9YODZfU0hBRE9XX0lOVF9TVEkJCTB4MDIKKworLyogZm9yIEtWTV9HRVQvU0VUX1ZDUFVfRVZFTlRTICovCitzdHJ1Y3Qga3ZtX3ZjcHVfZXZlbnRzIHsKKwlzdHJ1Y3QgeworCQlfX3U4IGluamVjdGVkOworCQlfX3U4IG5yOworCQlfX3U4IGhhc19lcnJvcl9jb2RlOworCQlfX3U4IHBhZDsKKwkJX191MzIgZXJyb3JfY29kZTsKKwl9IGV4Y2VwdGlvbjsKKwlzdHJ1Y3QgeworCQlfX3U4IGluamVjdGVkOworCQlfX3U4IG5yOworCQlfX3U4IHNvZnQ7CisJCV9fdTggc2hhZG93OworCX0gaW50ZXJydXB0OworCXN0cnVjdCB7CisJCV9fdTggaW5qZWN0ZWQ7CisJCV9fdTggcGVuZGluZzsKKwkJX191OCBtYXNrZWQ7CisJCV9fdTggcGFkOworCX0gbm1pOworCV9fdTMyIHNpcGlfdmVjdG9yOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHJlc2VydmVkWzEwXTsKK307CisKKy8qIGZvciBLVk1fR0VUL1NFVF9ERUJVR1JFR1MgKi8KK3N0cnVjdCBrdm1fZGVidWdyZWdzIHsKKwlfX3U2NCBkYls0XTsKKwlfX3U2NCBkcjY7CisJX191NjQgZHI3OworCV9fdTY0IGZsYWdzOworCV9fdTY0IHJlc2VydmVkWzldOworfTsKKworLyogZm9yIEtWTV9DQVBfWFNBVkUgKi8KK3N0cnVjdCBrdm1feHNhdmUgeworCV9fdTMyIHJlZ2lvblsxMDI0XTsKK307CisKKyNkZWZpbmUgS1ZNX01BWF9YQ1JTCTE2CisKK3N0cnVjdCBrdm1feGNyIHsKKwlfX3UzMiB4Y3I7CisJX191MzIgcmVzZXJ2ZWQ7CisJX191NjQgdmFsdWU7Cit9OworCitzdHJ1Y3Qga3ZtX3hjcnMgeworCV9fdTMyIG5yX3hjcnM7CisJX191MzIgZmxhZ3M7CisJc3RydWN0IGt2bV94Y3IgeGNyc1tLVk1fTUFYX1hDUlNdOworCV9fdTY0IHBhZGRpbmdbMTZdOworfTsKKworI2VuZGlmIC8qIF9BU01fWDg2X0tWTV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2t2bV9wYXJhLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL2t2bV9wYXJhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJhYzQ2YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20va3ZtX3BhcmEuaApAQCAtMCwwICsxLDkzIEBACisjaWZuZGVmIF9BU01fWDg2X0tWTV9QQVJBX0gKKyNkZWZpbmUgX0FTTV9YODZfS1ZNX1BBUkFfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaHlwZXJ2Lmg+CisKKy8qIFRoaXMgQ1BVSUQgcmV0dXJucyB0aGUgc2lnbmF0dXJlICdLVk1LVk1LVk0nIGluIGVieCwgZWN4LCBhbmQgZWR4LiAgSXQKKyAqIHNob3VsZCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGF0IGEgVk0gaXMgcnVubmluZyB1bmRlciBLVk0uCisgKi8KKyNkZWZpbmUgS1ZNX0NQVUlEX1NJR05BVFVSRQkweDQwMDAwMDAwCisKKy8qIFRoaXMgQ1BVSUQgcmV0dXJucyBhIGZlYXR1cmUgYml0bWFwIGluIGVheC4gIEJlZm9yZSBlbmFibGluZyBhIHBhcnRpY3VsYXIKKyAqIHBhcmF2aXJ0dWFsaXphdGlvbiwgdGhlIGFwcHJvcHJpYXRlIGZlYXR1cmUgYml0IHNob3VsZCBiZSBjaGVja2VkLgorICovCisjZGVmaW5lIEtWTV9DUFVJRF9GRUFUVVJFUwkweDQwMDAwMDAxCisjZGVmaW5lIEtWTV9GRUFUVVJFX0NMT0NLU09VUkNFCQkwCisjZGVmaW5lIEtWTV9GRUFUVVJFX05PUF9JT19ERUxBWQkxCisjZGVmaW5lIEtWTV9GRUFUVVJFX01NVV9PUAkJMgorLyogVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgbmV3IHNldCBvZiBrdm1jbG9jayBtc3JzCisgKiBhcmUgYXZhaWxhYmxlLiBUaGUgdXNlIG9mIDB4MTEgYW5kIDB4MTIgaXMgZGVwcmVjYXRlZAorICovCisjZGVmaW5lIEtWTV9GRUFUVVJFX0NMT0NLU09VUkNFMiAgICAgICAgMworI2RlZmluZSBLVk1fRkVBVFVSRV9BU1lOQ19QRgkJNAorI2RlZmluZSBLVk1fRkVBVFVSRV9TVEVBTF9USU1FCQk1CisKKy8qIFRoZSBsYXN0IDggYml0cyBhcmUgdXNlZCB0byBpbmRpY2F0ZSBob3cgdG8gaW50ZXJwcmV0IHRoZSBmbGFncyBmaWVsZAorICogaW4gcHZjbG9jayBzdHJ1Y3R1cmUuIElmIG5vIGJpdHMgYXJlIHNldCwgYWxsIGZsYWdzIGFyZSBpZ25vcmVkLgorICovCisjZGVmaW5lIEtWTV9GRUFUVVJFX0NMT0NLU09VUkNFX1NUQUJMRV9CSVQJMjQKKworI2RlZmluZSBNU1JfS1ZNX1dBTExfQ0xPQ0sgIDB4MTEKKyNkZWZpbmUgTVNSX0tWTV9TWVNURU1fVElNRSAweDEyCisKKyNkZWZpbmUgS1ZNX01TUl9FTkFCTEVEIDEKKy8qIEN1c3RvbSBNU1JzIGZhbGxzIGluIHRoZSByYW5nZSAweDRiNTY0ZDAwLTB4NGI1NjRkZmYgKi8KKyNkZWZpbmUgTVNSX0tWTV9XQUxMX0NMT0NLX05FVyAgMHg0YjU2NGQwMAorI2RlZmluZSBNU1JfS1ZNX1NZU1RFTV9USU1FX05FVyAweDRiNTY0ZDAxCisjZGVmaW5lIE1TUl9LVk1fQVNZTkNfUEZfRU4gMHg0YjU2NGQwMgorI2RlZmluZSBNU1JfS1ZNX1NURUFMX1RJTUUgIDB4NGI1NjRkMDMKKworc3RydWN0IGt2bV9zdGVhbF90aW1lIHsKKwlfX3U2NCBzdGVhbDsKKwlfX3UzMiB2ZXJzaW9uOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHBhZFsxMl07Cit9OworCisjZGVmaW5lIEtWTV9TVEVBTF9BTElHTk1FTlRfQklUUyA1CisjZGVmaW5lIEtWTV9TVEVBTF9WQUxJRF9CSVRTICgoLTFVTEwgPDwgKEtWTV9TVEVBTF9BTElHTk1FTlRfQklUUyArIDEpKSkKKyNkZWZpbmUgS1ZNX1NURUFMX1JFU0VSVkVEX01BU0sgKCgoMSA8PCBLVk1fU1RFQUxfQUxJR05NRU5UX0JJVFMpIC0gMSApIDw8IDEpCisKKyNkZWZpbmUgS1ZNX01BWF9NTVVfT1BfQkFUQ0ggICAgICAgICAgIDMyCisKKyNkZWZpbmUgS1ZNX0FTWU5DX1BGX0VOQUJMRUQJCQkoMSA8PCAwKQorI2RlZmluZSBLVk1fQVNZTkNfUEZfU0VORF9BTFdBWVMJCSgxIDw8IDEpCisKKy8qIE9wZXJhdGlvbnMgZm9yIEtWTV9IQ19NTVVfT1AgKi8KKyNkZWZpbmUgS1ZNX01NVV9PUF9XUklURV9QVEUgICAgICAgICAgICAxCisjZGVmaW5lIEtWTV9NTVVfT1BfRkxVU0hfVExCCSAgICAgICAgMgorI2RlZmluZSBLVk1fTU1VX09QX1JFTEVBU0VfUFQJICAgICAgICAzCisKKy8qIFBheWxvYWQgZm9yIEtWTV9IQ19NTVVfT1AgKi8KK3N0cnVjdCBrdm1fbW11X29wX2hlYWRlciB7CisJX191MzIgb3A7CisJX191MzIgcGFkOworfTsKKworc3RydWN0IGt2bV9tbXVfb3Bfd3JpdGVfcHRlIHsKKwlzdHJ1Y3Qga3ZtX21tdV9vcF9oZWFkZXIgaGVhZGVyOworCV9fdTY0IHB0ZV9waHlzOworCV9fdTY0IHB0ZV92YWw7Cit9OworCitzdHJ1Y3Qga3ZtX21tdV9vcF9mbHVzaF90bGIgeworCXN0cnVjdCBrdm1fbW11X29wX2hlYWRlciBoZWFkZXI7Cit9OworCitzdHJ1Y3Qga3ZtX21tdV9vcF9yZWxlYXNlX3B0IHsKKwlzdHJ1Y3Qga3ZtX21tdV9vcF9oZWFkZXIgaGVhZGVyOworCV9fdTY0IHB0X3BoeXM7Cit9OworCisjZGVmaW5lIEtWTV9QVl9SRUFTT05fUEFHRV9OT1RfUFJFU0VOVCAxCisjZGVmaW5lIEtWTV9QVl9SRUFTT05fUEFHRV9SRUFEWSAyCisKK3N0cnVjdCBrdm1fdmNwdV9wdl9hcGZfZGF0YSB7CisJX191MzIgcmVhc29uOworCV9fdTggcGFkWzYwXTsKKwlfX3UzMiBlbmFibGVkOworfTsKKworCisjZW5kaWYgLyogX0FTTV9YODZfS1ZNX1BBUkFfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9sZHQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vbGR0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3MjdlYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vbGR0LmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIGxkdC5oCisgKgorICogRGVmaW5pdGlvbnMgb2Ygc3RydWN0dXJlcyB1c2VkIHdpdGggdGhlIG1vZGlmeV9sZHQgc3lzdGVtIGNhbGwuCisgKi8KKyNpZm5kZWYgX0FTTV9YODZfTERUX0gKKyNkZWZpbmUgX0FTTV9YODZfTERUX0gKKworLyogTWF4aW11bSBudW1iZXIgb2YgTERUIGVudHJpZXMgc3VwcG9ydGVkLiAqLworI2RlZmluZSBMRFRfRU5UUklFUwk4MTkyCisvKiBUaGUgc2l6ZSBvZiBlYWNoIExEVCBlbnRyeS4gKi8KKyNkZWZpbmUgTERUX0VOVFJZX1NJWkUJOAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworLyoKKyAqIE5vdGUgb24gNjRiaXQgYmFzZSBhbmQgbGltaXQgaXMgaWdub3JlZCBhbmQgeW91IGNhbm5vdCBzZXQgRFMvRVMvQ1MKKyAqIG5vdCB0byB0aGUgZGVmYXVsdCB2YWx1ZXMgaWYgeW91IHN0aWxsIHdhbnQgdG8gZG8gc3lzY2FsbHMuIFRoaXMKKyAqIGNhbGwgaXMgbW9yZSBmb3IgMzJiaXQgbW9kZSB0aGVyZWZvcmUuCisgKi8KK3N0cnVjdCB1c2VyX2Rlc2MgeworCXVuc2lnbmVkIGludCAgZW50cnlfbnVtYmVyOworCXVuc2lnbmVkIGludCAgYmFzZV9hZGRyOworCXVuc2lnbmVkIGludCAgbGltaXQ7CisJdW5zaWduZWQgaW50ICBzZWdfMzJiaXQ6MTsKKwl1bnNpZ25lZCBpbnQgIGNvbnRlbnRzOjI7CisJdW5zaWduZWQgaW50ICByZWFkX2V4ZWNfb25seToxOworCXVuc2lnbmVkIGludCAgbGltaXRfaW5fcGFnZXM6MTsKKwl1bnNpZ25lZCBpbnQgIHNlZ19ub3RfcHJlc2VudDoxOworCXVuc2lnbmVkIGludCAgdXNlYWJsZToxOworI2lmZGVmIF9feDg2XzY0X18KKwl1bnNpZ25lZCBpbnQgIGxtOjE7CisjZW5kaWYKK307CisKKyNkZWZpbmUgTU9ESUZZX0xEVF9DT05URU5UU19EQVRBCTAKKyNkZWZpbmUgTU9ESUZZX0xEVF9DT05URU5UU19TVEFDSwkxCisjZGVmaW5lIE1PRElGWV9MRFRfQ09OVEVOVFNfQ09ERQkyCisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisjZW5kaWYgLyogX0FTTV9YODZfTERUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vbWNlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL21jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MGIyZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL21jZS5oCkBAIC0wLDAgKzEsMTIzIEBACisjaWZuZGVmIF9BU01fWDg2X01DRV9ICisjZGVmaW5lIF9BU01fWDg2X01DRV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKworLyoKKyAqIE1hY2hpbmUgQ2hlY2sgc3VwcG9ydCBmb3IgeDg2CisgKi8KKworLyogTUNHX0NBUCByZWdpc3RlciBkZWZpbmVzICovCisjZGVmaW5lIE1DR19CQU5LQ05UX01BU0sJMHhmZiAgICAgICAgIC8qIE51bWJlciBvZiBCYW5rcyAqLworI2RlZmluZSBNQ0dfQ1RMX1AJCSgxVUxMPDw4KSAgICAvKiBNQ0dfQ1RMIHJlZ2lzdGVyIGF2YWlsYWJsZSAqLworI2RlZmluZSBNQ0dfRVhUX1AJCSgxVUxMPDw5KSAgICAvKiBFeHRlbmRlZCByZWdpc3RlcnMgYXZhaWxhYmxlICovCisjZGVmaW5lIE1DR19DTUNJX1AJCSgxVUxMPDwxMCkgICAvKiBDTUNJIHN1cHBvcnRlZCAqLworI2RlZmluZSBNQ0dfRVhUX0NOVF9NQVNLCTB4ZmYwMDAwICAgICAvKiBOdW1iZXIgb2YgRXh0ZW5kZWQgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1DR19FWFRfQ05UX1NISUZUCTE2CisjZGVmaW5lIE1DR19FWFRfQ05UKGMpCQkoKChjKSAmIE1DR19FWFRfQ05UX01BU0spID4+IE1DR19FWFRfQ05UX1NISUZUKQorI2RlZmluZSBNQ0dfU0VSX1AJIAkoMVVMTDw8MjQpICAgLyogTUNBIHJlY292ZXJ5L25ldyBzdGF0dXMgYml0cyAqLworCisvKiBNQ0dfU1RBVFVTIHJlZ2lzdGVyIGRlZmluZXMgKi8KKyNkZWZpbmUgTUNHX1NUQVRVU19SSVBWICAoMVVMTDw8MCkgICAvKiByZXN0YXJ0IGlwIHZhbGlkICovCisjZGVmaW5lIE1DR19TVEFUVVNfRUlQViAgKDFVTEw8PDEpICAgLyogaXAgcG9pbnRzIHRvIGNvcnJlY3QgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgTUNHX1NUQVRVU19NQ0lQICAoMVVMTDw8MikgICAvKiBtYWNoaW5lIGNoZWNrIGluIHByb2dyZXNzICovCisKKy8qIE1DaV9TVEFUVVMgcmVnaXN0ZXIgZGVmaW5lcyAqLworI2RlZmluZSBNQ0lfU1RBVFVTX1ZBTCAgICgxVUxMPDw2MykgIC8qIHZhbGlkIGVycm9yICovCisjZGVmaW5lIE1DSV9TVEFUVVNfT1ZFUiAgKDFVTEw8PDYyKSAgLyogcHJldmlvdXMgZXJyb3JzIGxvc3QgKi8KKyNkZWZpbmUgTUNJX1NUQVRVU19VQyAgICAoMVVMTDw8NjEpICAvKiB1bmNvcnJlY3RlZCBlcnJvciAqLworI2RlZmluZSBNQ0lfU1RBVFVTX0VOICAgICgxVUxMPDw2MCkgIC8qIGVycm9yIGVuYWJsZWQgKi8KKyNkZWZpbmUgTUNJX1NUQVRVU19NSVNDViAoMVVMTDw8NTkpICAvKiBtaXNjIGVycm9yIHJlZy4gdmFsaWQgKi8KKyNkZWZpbmUgTUNJX1NUQVRVU19BRERSViAoMVVMTDw8NTgpICAvKiBhZGRyIHJlZy4gdmFsaWQgKi8KKyNkZWZpbmUgTUNJX1NUQVRVU19QQ0MgICAoMVVMTDw8NTcpICAvKiBwcm9jZXNzb3IgY29udGV4dCBjb3JydXB0ICovCisjZGVmaW5lIE1DSV9TVEFUVVNfUwkgKDFVTEw8PDU2KSAgLyogU2lnbmFsZWQgbWFjaGluZSBjaGVjayAqLworI2RlZmluZSBNQ0lfU1RBVFVTX0FSCSAoMVVMTDw8NTUpICAvKiBBY3Rpb24gcmVxdWlyZWQgKi8KKworLyogTUNpX01JU0MgcmVnaXN0ZXIgZGVmaW5lcyAqLworI2RlZmluZSBNQ0lfTUlTQ19BRERSX0xTQihtKQkoKG0pICYgMHgzZikKKyNkZWZpbmUgTUNJX01JU0NfQUREUl9NT0RFKG0pCSgoKG0pID4+IDYpICYgNykKKyNkZWZpbmUgIE1DSV9NSVNDX0FERFJfU0VHT0ZGCTAJLyogc2VnbWVudCBvZmZzZXQgKi8KKyNkZWZpbmUgIE1DSV9NSVNDX0FERFJfTElORUFSCTEJLyogbGluZWFyIGFkZHJlc3MgKi8KKyNkZWZpbmUgIE1DSV9NSVNDX0FERFJfUEhZUwkyCS8qIHBoeXNpY2FsIGFkZHJlc3MgKi8KKyNkZWZpbmUgIE1DSV9NSVNDX0FERFJfTUVNCTMJLyogbWVtb3J5IGFkZHJlc3MgKi8KKyNkZWZpbmUgIE1DSV9NSVNDX0FERFJfR0VORVJJQwk3CS8qIGdlbmVyaWMgKi8KKworLyogQ1RMMiByZWdpc3RlciBkZWZpbmVzICovCisjZGVmaW5lIE1DSV9DVEwyX0NNQ0lfRU4JCSgxVUxMIDw8IDMwKQorI2RlZmluZSBNQ0lfQ1RMMl9DTUNJX1RIUkVTSE9MRF9NQVNLCTB4N2ZmZlVMTAorCisjZGVmaW5lIE1DSl9DVFhfTUFTSwkJMworI2RlZmluZSBNQ0pfQ1RYKGZsYWdzKQkJKChmbGFncykgJiBNQ0pfQ1RYX01BU0spCisjZGVmaW5lIE1DSl9DVFhfUkFORE9NCQkwICAgIC8qIGluamVjdCBjb250ZXh0OiByYW5kb20gKi8KKyNkZWZpbmUgTUNKX0NUWF9QUk9DRVNTCQkxICAgIC8qIGluamVjdCBjb250ZXh0OiBwcm9jZXNzICovCisjZGVmaW5lIE1DSl9DVFhfSVJRCQkyICAgIC8qIGluamVjdCBjb250ZXh0OiBJUlEgKi8KKyNkZWZpbmUgTUNKX05NSV9CUk9BRENBU1QJNCAgICAvKiBkbyBOTUkgYnJvYWRjYXN0aW5nICovCisjZGVmaW5lIE1DSl9FWENFUFRJT04JCTggICAgLyogcmFpc2UgYXMgZXhjZXB0aW9uICovCisKKy8qIEZpZWxkcyBhcmUgemVybyB3aGVuIG5vdCBhdmFpbGFibGUgKi8KK3N0cnVjdCBtY2UgeworCV9fdTY0IHN0YXR1czsKKwlfX3U2NCBtaXNjOworCV9fdTY0IGFkZHI7CisJX191NjQgbWNnc3RhdHVzOworCV9fdTY0IGlwOworCV9fdTY0IHRzYzsJLyogY3B1IHRpbWUgc3RhbXAgY291bnRlciAqLworCV9fdTY0IHRpbWU7CS8qIHdhbGwgdGltZV90IHdoZW4gZXJyb3Igd2FzIGRldGVjdGVkICovCisJX191OCAgY3B1dmVuZG9yOwkvKiBjcHUgdmVuZG9yIGFzIGVuY29kZWQgaW4gc3lzdGVtLmggKi8KKwlfX3U4ICBpbmplY3RfZmxhZ3M7CS8qIHNvZnR3YXJlIGluamVjdCBmbGFncyAqLworCV9fdTE2ICBwYWQ7CisJX191MzIgY3B1aWQ7CS8qIENQVUlEIDEgRUFYICovCisJX191OCAgY3M7CQkvKiBjb2RlIHNlZ21lbnQgKi8KKwlfX3U4ICBiYW5rOwkvKiBtYWNoaW5lIGNoZWNrIGJhbmsgKi8KKwlfX3U4ICBjcHU7CS8qIGNwdSBudW1iZXI7IG9ic29sZXRlOyB1c2UgZXh0Y3B1IG5vdyAqLworCV9fdTggIGZpbmlzaGVkOyAgIC8qIGVudHJ5IGlzIHZhbGlkICovCisJX191MzIgZXh0Y3B1OwkvKiBsaW51eCBjcHUgbnVtYmVyIHRoYXQgZGV0ZWN0ZWQgdGhlIGVycm9yICovCisJX191MzIgc29ja2V0aWQ7CS8qIENQVSBzb2NrZXQgSUQgKi8KKwlfX3UzMiBhcGljaWQ7CS8qIENQVSBpbml0aWFsIGFwaWMgSUQgKi8KKwlfX3U2NCBtY2djYXA7CS8qIE1DR0NBUCBNU1I6IG1hY2hpbmUgY2hlY2sgY2FwYWJpbGl0aWVzIG9mIENQVSAqLworCV9fdTY0IGF1eDA7CS8qIG1vZGVsIHNwZWNpZmljICovCisJX191NjQgYXV4MTsJLyogbW9kZWwgc3BlY2lmaWMgKi8KK307CisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBhbGwgZGF0YSByZWxhdGVkIHRvIHRoZSBNQ0UgbG9nLiAgQWxzbworICogY2FycmllcyBhIHNpZ25hdHVyZSB0byBtYWtlIGl0IGVhc2llciB0byBmaW5kIGZyb20gZXh0ZXJuYWwKKyAqIGRlYnVnZ2luZyB0b29scy4gIEVhY2ggZW50cnkgaXMgb25seSB2YWxpZCB3aGVuIGl0cyBmaW5pc2hlZCBmbGFnCisgKiBpcyBzZXQuCisgKi8KKworI2RlZmluZSBNQ0VfTE9HX0xFTiAzMgorCitzdHJ1Y3QgbWNlX2xvZyB7CisJY2hhciBzaWduYXR1cmVbMTJdOyAvKiAiTUFDSElORUNIRUNLIiAqLworCXVuc2lnbmVkIGxlbjsJICAgIC8qID0gTUNFX0xPR19MRU4gKi8KKwl1bnNpZ25lZCBuZXh0OworCXVuc2lnbmVkIGZsYWdzOworCXVuc2lnbmVkIHJlY29yZGxlbjsJLyogbGVuZ3RoIG9mIHN0cnVjdCBtY2UgKi8KKwlzdHJ1Y3QgbWNlIGVudHJ5W01DRV9MT0dfTEVOXTsKK307CisKKyNkZWZpbmUgTUNFX09WRVJGTE9XIDAJCS8qIGJpdCAwIGluIGZsYWdzIG1lYW5zIG92ZXJmbG93ICovCisKKyNkZWZpbmUgTUNFX0xPR19TSUdOQVRVUkUJIk1BQ0hJTkVDSEVDSyIKKworI2RlZmluZSBNQ0VfR0VUX1JFQ09SRF9MRU4gICBfSU9SKCdNJywgMSwgaW50KQorI2RlZmluZSBNQ0VfR0VUX0xPR19MRU4gICAgICBfSU9SKCdNJywgMiwgaW50KQorI2RlZmluZSBNQ0VfR0VUQ0xFQVJfRkxBR1MgICBfSU9SKCdNJywgMywgaW50KQorCisvKiBTb2Z0d2FyZSBkZWZpbmVkIGJhbmtzICovCisjZGVmaW5lIE1DRV9FWFRFTkRFRF9CQU5LCTEyOAorI2RlZmluZSBNQ0VfVEhFUk1BTF9CQU5LCU1DRV9FWFRFTkRFRF9CQU5LICsgMAorCisjZGVmaW5lIEs4X01DRV9USFJFU0hPTERfQkFTRSAgICAgIChNQ0VfRVhURU5ERURfQkFOSyArIDEpICAgICAgLyogTUNFX0FNRCAqLworI2RlZmluZSBLOF9NQ0VfVEhSRVNIT0xEX0JBTktfMCAgICAoTUNFX1RIUkVTSE9MRF9CQVNFICsgMCAqIDkpCisjZGVmaW5lIEs4X01DRV9USFJFU0hPTERfQkFOS18xICAgIChNQ0VfVEhSRVNIT0xEX0JBU0UgKyAxICogOSkKKyNkZWZpbmUgSzhfTUNFX1RIUkVTSE9MRF9CQU5LXzIgICAgKE1DRV9USFJFU0hPTERfQkFTRSArIDIgKiA5KQorI2RlZmluZSBLOF9NQ0VfVEhSRVNIT0xEX0JBTktfMyAgICAoTUNFX1RIUkVTSE9MRF9CQVNFICsgMyAqIDkpCisjZGVmaW5lIEs4X01DRV9USFJFU0hPTERfQkFOS180ICAgIChNQ0VfVEhSRVNIT0xEX0JBU0UgKyA0ICogOSkKKyNkZWZpbmUgSzhfTUNFX1RIUkVTSE9MRF9CQU5LXzUgICAgKE1DRV9USFJFU0hPTERfQkFTRSArIDUgKiA5KQorI2RlZmluZSBLOF9NQ0VfVEhSRVNIT0xEX0RSQU1fRUNDICAoTUNFX1RIUkVTSE9MRF9CQU5LXzQgKyAwKQorCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9NQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9tbWFuLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTNlNTFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9tbWFuLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9BU01fWDg2X01NQU5fSAorI2RlZmluZSBfQVNNX1g4Nl9NTUFOX0gKKworI2RlZmluZSBNQVBfMzJCSVQJMHg0MAkJLyogb25seSBnaXZlIG91dCAzMmJpdCBhZGRyZXNzZXMgKi8KKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL21tYW4uaD4KKworI2VuZGlmIC8qIF9BU01fWDg2X01NQU5fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9tc2didWYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vbXNnYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5MTM0YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vbXNnYnVmLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL21zZ2J1Zi5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9tc3ItaW5kZXguaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vbXNyLWluZGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY5NjJkOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vbXNyLWluZGV4LmgKQEAgLTAsMCArMSw0NjUgQEAKKyNpZm5kZWYgX0FTTV9YODZfTVNSX0lOREVYX0gKKyNkZWZpbmUgX0FTTV9YODZfTVNSX0lOREVYX0gKKworLyogQ1BVIG1vZGVsIHNwZWNpZmljIHJlZ2lzdGVyIChNU1IpIG51bWJlcnMgKi8KKworLyogeDg2LTY0IHNwZWNpZmljIE1TUnMgKi8KKyNkZWZpbmUgTVNSX0VGRVIJCTB4YzAwMDAwODAgLyogZXh0ZW5kZWQgZmVhdHVyZSByZWdpc3RlciAqLworI2RlZmluZSBNU1JfU1RBUgkJMHhjMDAwMDA4MSAvKiBsZWdhY3kgbW9kZSBTWVNDQUxMIHRhcmdldCAqLworI2RlZmluZSBNU1JfTFNUQVIJCTB4YzAwMDAwODIgLyogbG9uZyBtb2RlIFNZU0NBTEwgdGFyZ2V0ICovCisjZGVmaW5lIE1TUl9DU1RBUgkJMHhjMDAwMDA4MyAvKiBjb21wYXQgbW9kZSBTWVNDQUxMIHRhcmdldCAqLworI2RlZmluZSBNU1JfU1lTQ0FMTF9NQVNLCTB4YzAwMDAwODQgLyogRUZMQUdTIG1hc2sgZm9yIHN5c2NhbGwgKi8KKyNkZWZpbmUgTVNSX0ZTX0JBU0UJCTB4YzAwMDAxMDAgLyogNjRiaXQgRlMgYmFzZSAqLworI2RlZmluZSBNU1JfR1NfQkFTRQkJMHhjMDAwMDEwMSAvKiA2NGJpdCBHUyBiYXNlICovCisjZGVmaW5lIE1TUl9LRVJORUxfR1NfQkFTRQkweGMwMDAwMTAyIC8qIFN3YXBHUyBHUyBzaGFkb3cgKi8KKyNkZWZpbmUgTVNSX1RTQ19BVVgJCTB4YzAwMDAxMDMgLyogQXV4aWxpYXJ5IFRTQyAqLworCisvKiBFRkVSIGJpdHM6ICovCisjZGVmaW5lIF9FRkVSX1NDRQkJMCAgLyogU1lTQ0FMTC9TWVNSRVQgKi8KKyNkZWZpbmUgX0VGRVJfTE1FCQk4ICAvKiBMb25nIG1vZGUgZW5hYmxlICovCisjZGVmaW5lIF9FRkVSX0xNQQkJMTAgLyogTG9uZyBtb2RlIGFjdGl2ZSAocmVhZC1vbmx5KSAqLworI2RlZmluZSBfRUZFUl9OWAkJMTEgLyogTm8gZXhlY3V0ZSBlbmFibGUgKi8KKyNkZWZpbmUgX0VGRVJfU1ZNRQkJMTIgLyogRW5hYmxlIHZpcnR1YWxpemF0aW9uICovCisjZGVmaW5lIF9FRkVSX0xNU0xFCQkxMyAvKiBMb25nIE1vZGUgU2VnbWVudCBMaW1pdCBFbmFibGUgKi8KKyNkZWZpbmUgX0VGRVJfRkZYU1IJCTE0IC8qIEVuYWJsZSBGYXN0IEZYU0FWRS9GWFJTVE9SICovCisKKyNkZWZpbmUgRUZFUl9TQ0UJCSgxPDxfRUZFUl9TQ0UpCisjZGVmaW5lIEVGRVJfTE1FCQkoMTw8X0VGRVJfTE1FKQorI2RlZmluZSBFRkVSX0xNQQkJKDE8PF9FRkVSX0xNQSkKKyNkZWZpbmUgRUZFUl9OWAkJCSgxPDxfRUZFUl9OWCkKKyNkZWZpbmUgRUZFUl9TVk1FCQkoMTw8X0VGRVJfU1ZNRSkKKyNkZWZpbmUgRUZFUl9MTVNMRQkJKDE8PF9FRkVSX0xNU0xFKQorI2RlZmluZSBFRkVSX0ZGWFNSCQkoMTw8X0VGRVJfRkZYU1IpCisKKy8qIEludGVsIE1TUnMuIFNvbWUgYWxzbyBhdmFpbGFibGUgb24gb3RoZXIgQ1BVcyAqLworI2RlZmluZSBNU1JfSUEzMl9QRVJGQ1RSMAkJMHgwMDAwMDBjMQorI2RlZmluZSBNU1JfSUEzMl9QRVJGQ1RSMQkJMHgwMDAwMDBjMgorI2RlZmluZSBNU1JfRlNCX0ZSRVEJCQkweDAwMDAwMGNkCisKKyNkZWZpbmUgTVNSX05ITV9TTkJfUEtHX0NTVF9DRkdfQ1RMCTB4MDAwMDAwZTIKKyNkZWZpbmUgTkhNX0MzX0FVVE9fREVNT1RFCQkoMVVMIDw8IDI1KQorI2RlZmluZSBOSE1fQzFfQVVUT19ERU1PVEUJCSgxVUwgPDwgMjYpCisjZGVmaW5lIEFUTV9MTkNfQzZfQVVUT19ERU1PVEUJCSgxVUwgPDwgMjUpCisKKyNkZWZpbmUgTVNSX01UUlJjYXAJCQkweDAwMDAwMGZlCisjZGVmaW5lIE1TUl9JQTMyX0JCTF9DUl9DVEwJCTB4MDAwMDAxMTkKKyNkZWZpbmUgTVNSX0lBMzJfQkJMX0NSX0NUTDMJCTB4MDAwMDAxMWUKKworI2RlZmluZSBNU1JfSUEzMl9TWVNFTlRFUl9DUwkJMHgwMDAwMDE3NAorI2RlZmluZSBNU1JfSUEzMl9TWVNFTlRFUl9FU1AJCTB4MDAwMDAxNzUKKyNkZWZpbmUgTVNSX0lBMzJfU1lTRU5URVJfRUlQCQkweDAwMDAwMTc2CisKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX0NBUAkJMHgwMDAwMDE3OQorI2RlZmluZSBNU1JfSUEzMl9NQ0dfU1RBVFVTCQkweDAwMDAwMTdhCisjZGVmaW5lIE1TUl9JQTMyX01DR19DVEwJCTB4MDAwMDAxN2IKKworI2RlZmluZSBNU1JfT0ZGQ09SRV9SU1BfMAkJMHgwMDAwMDFhNgorI2RlZmluZSBNU1JfT0ZGQ09SRV9SU1BfMQkJMHgwMDAwMDFhNworCisjZGVmaW5lIE1TUl9JQTMyX1BFQlNfRU5BQkxFCQkweDAwMDAwM2YxCisjZGVmaW5lIE1TUl9JQTMyX0RTX0FSRUEJCTB4MDAwMDA2MDAKKyNkZWZpbmUgTVNSX0lBMzJfUEVSRl9DQVBBQklMSVRJRVMJMHgwMDAwMDM0NQorCisjZGVmaW5lIE1TUl9NVFJSZml4NjRLXzAwMDAwCQkweDAwMDAwMjUwCisjZGVmaW5lIE1TUl9NVFJSZml4MTZLXzgwMDAwCQkweDAwMDAwMjU4CisjZGVmaW5lIE1TUl9NVFJSZml4MTZLX0EwMDAwCQkweDAwMDAwMjU5CisjZGVmaW5lIE1TUl9NVFJSZml4NEtfQzAwMDAJCTB4MDAwMDAyNjgKKyNkZWZpbmUgTVNSX01UUlJmaXg0S19DODAwMAkJMHgwMDAwMDI2OQorI2RlZmluZSBNU1JfTVRSUmZpeDRLX0QwMDAwCQkweDAwMDAwMjZhCisjZGVmaW5lIE1TUl9NVFJSZml4NEtfRDgwMDAJCTB4MDAwMDAyNmIKKyNkZWZpbmUgTVNSX01UUlJmaXg0S19FMDAwMAkJMHgwMDAwMDI2YworI2RlZmluZSBNU1JfTVRSUmZpeDRLX0U4MDAwCQkweDAwMDAwMjZkCisjZGVmaW5lIE1TUl9NVFJSZml4NEtfRjAwMDAJCTB4MDAwMDAyNmUKKyNkZWZpbmUgTVNSX01UUlJmaXg0S19GODAwMAkJMHgwMDAwMDI2ZgorI2RlZmluZSBNU1JfTVRSUmRlZlR5cGUJCQkweDAwMDAwMmZmCisKKyNkZWZpbmUgTVNSX0lBMzJfQ1JfUEFUCQkJMHgwMDAwMDI3NworCisjZGVmaW5lIE1TUl9JQTMyX0RFQlVHQ1RMTVNSCQkweDAwMDAwMWQ5CisjZGVmaW5lIE1TUl9JQTMyX0xBU1RCUkFOQ0hGUk9NSVAJMHgwMDAwMDFkYgorI2RlZmluZSBNU1JfSUEzMl9MQVNUQlJBTkNIVE9JUAkJMHgwMDAwMDFkYworI2RlZmluZSBNU1JfSUEzMl9MQVNUSU5URlJPTUlQCQkweDAwMDAwMWRkCisjZGVmaW5lIE1TUl9JQTMyX0xBU1RJTlRUT0lQCQkweDAwMDAwMWRlCisKKy8qIERFQlVHQ1RMTVNSIGJpdHMgKG90aGVycyB2YXJ5IGJ5IG1vZGVsKTogKi8KKyNkZWZpbmUgREVCVUdDVExNU1JfTEJSCQkJKDFVTCA8PCAgMCkgLyogbGFzdCBicmFuY2ggcmVjb3JkaW5nICovCisjZGVmaW5lIERFQlVHQ1RMTVNSX0JURgkJCSgxVUwgPDwgIDEpIC8qIHNpbmdsZS1zdGVwIG9uIGJyYW5jaGVzICovCisjZGVmaW5lIERFQlVHQ1RMTVNSX1RSCQkJKDFVTCA8PCAgNikKKyNkZWZpbmUgREVCVUdDVExNU1JfQlRTCQkJKDFVTCA8PCAgNykKKyNkZWZpbmUgREVCVUdDVExNU1JfQlRJTlQJCSgxVUwgPDwgIDgpCisjZGVmaW5lIERFQlVHQ1RMTVNSX0JUU19PRkZfT1MJCSgxVUwgPDwgIDkpCisjZGVmaW5lIERFQlVHQ1RMTVNSX0JUU19PRkZfVVNSCQkoMVVMIDw8IDEwKQorI2RlZmluZSBERUJVR0NUTE1TUl9GUkVFWkVfTEJSU19PTl9QTUkJKDFVTCA8PCAxMSkKKworI2RlZmluZSBNU1JfSUEzMl9NQzBfQ1RMCQkweDAwMDAwNDAwCisjZGVmaW5lIE1TUl9JQTMyX01DMF9TVEFUVVMJCTB4MDAwMDA0MDEKKyNkZWZpbmUgTVNSX0lBMzJfTUMwX0FERFIJCTB4MDAwMDA0MDIKKyNkZWZpbmUgTVNSX0lBMzJfTUMwX01JU0MJCTB4MDAwMDA0MDMKKworI2RlZmluZSBNU1JfQU1ENjRfTUMwX01BU0sJCTB4YzAwMTAwNDQKKworI2RlZmluZSBNU1JfSUEzMl9NQ3hfQ1RMKHgpCQkoTVNSX0lBMzJfTUMwX0NUTCArIDQqKHgpKQorI2RlZmluZSBNU1JfSUEzMl9NQ3hfU1RBVFVTKHgpCQkoTVNSX0lBMzJfTUMwX1NUQVRVUyArIDQqKHgpKQorI2RlZmluZSBNU1JfSUEzMl9NQ3hfQUREUih4KQkJKE1TUl9JQTMyX01DMF9BRERSICsgNCooeCkpCisjZGVmaW5lIE1TUl9JQTMyX01DeF9NSVNDKHgpCQkoTVNSX0lBMzJfTUMwX01JU0MgKyA0Kih4KSkKKworI2RlZmluZSBNU1JfQU1ENjRfTUN4X01BU0soeCkJCShNU1JfQU1ENjRfTUMwX01BU0sgKyAoeCkpCisKKy8qIFRoZXNlIGFyZSBjb25zZWN1dGl2ZSBhbmQgbm90IGluIHRoZSBub3JtYWwgNGVyIE1DRSBiYW5rIGJsb2NrICovCisjZGVmaW5lIE1TUl9JQTMyX01DMF9DVEwyCQkweDAwMDAwMjgwCisjZGVmaW5lIE1TUl9JQTMyX01DeF9DVEwyKHgpCQkoTVNSX0lBMzJfTUMwX0NUTDIgKyAoeCkpCisKKyNkZWZpbmUgTVNSX1A2X1BFUkZDVFIwCQkJMHgwMDAwMDBjMQorI2RlZmluZSBNU1JfUDZfUEVSRkNUUjEJCQkweDAwMDAwMGMyCisjZGVmaW5lIE1TUl9QNl9FVk5UU0VMMAkJCTB4MDAwMDAxODYKKyNkZWZpbmUgTVNSX1A2X0VWTlRTRUwxCQkJMHgwMDAwMDE4NworCisvKiBBTUQ2NCBNU1JzLiBOb3QgY29tcGxldGUuIFNlZSB0aGUgYXJjaGl0ZWN0dXJlIG1hbnVhbCBmb3IgYSBtb3JlCisgICBjb21wbGV0ZSBsaXN0LiAqLworCisjZGVmaW5lIE1TUl9BTUQ2NF9QQVRDSF9MRVZFTAkJMHgwMDAwMDA4YgorI2RlZmluZSBNU1JfQU1ENjRfVFNDX1JBVElPCQkweGMwMDAwMTA0CisjZGVmaW5lIE1TUl9BTUQ2NF9OQl9DRkcJCTB4YzAwMTAwMWYKKyNkZWZpbmUgTVNSX0FNRDY0X1BBVENIX0xPQURFUgkJMHhjMDAxMDAyMAorI2RlZmluZSBNU1JfQU1ENjRfT1NWV19JRF9MRU5HVEgJMHhjMDAxMDE0MAorI2RlZmluZSBNU1JfQU1ENjRfT1NWV19TVEFUVVMJCTB4YzAwMTAxNDEKKyNkZWZpbmUgTVNSX0FNRDY0X0RDX0NGRwkJMHhjMDAxMTAyMgorI2RlZmluZSBNU1JfQU1ENjRfSUJTRkVUQ0hDVEwJCTB4YzAwMTEwMzAKKyNkZWZpbmUgTVNSX0FNRDY0X0lCU0ZFVENITElOQUQJCTB4YzAwMTEwMzEKKyNkZWZpbmUgTVNSX0FNRDY0X0lCU0ZFVENIUEhZU0FECTB4YzAwMTEwMzIKKyNkZWZpbmUgTVNSX0FNRDY0X0lCU09QQ1RMCQkweGMwMDExMDMzCisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNPUFJJUAkJMHhjMDAxMTAzNAorI2RlZmluZSBNU1JfQU1ENjRfSUJTT1BEQVRBCQkweGMwMDExMDM1CisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNPUERBVEEyCQkweGMwMDExMDM2CisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNPUERBVEEzCQkweGMwMDExMDM3CisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNEQ0xJTkFECQkweGMwMDExMDM4CisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNEQ1BIWVNBRAkJMHhjMDAxMTAzOQorI2RlZmluZSBNU1JfQU1ENjRfSUJTQ1RMCQkweGMwMDExMDNhCisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNCUlRBUkdFVAkJMHhjMDAxMTAzYgorCisvKiBGYW0gMTVoIE1TUnMgKi8KKyNkZWZpbmUgTVNSX0YxNUhfUEVSRl9DVEwJCTB4YzAwMTAyMDAKKyNkZWZpbmUgTVNSX0YxNUhfUEVSRl9DVFIJCTB4YzAwMTAyMDEKKworLyogRmFtIDEwaCBNU1JzICovCisjZGVmaW5lIE1TUl9GQU0xMEhfTU1JT19DT05GX0JBU0UJMHhjMDAxMDA1OAorI2RlZmluZSBGQU0xMEhfTU1JT19DT05GX0VOQUJMRQkJKDE8PDApCisjZGVmaW5lIEZBTTEwSF9NTUlPX0NPTkZfQlVTUkFOR0VfTUFTSwkweGYKKyNkZWZpbmUgRkFNMTBIX01NSU9fQ09ORl9CVVNSQU5HRV9TSElGVCAyCisjZGVmaW5lIEZBTTEwSF9NTUlPX0NPTkZfQkFTRV9NQVNLCTB4ZmZmZmZmZlVMTAorI2RlZmluZSBGQU0xMEhfTU1JT19DT05GX0JBU0VfU0hJRlQJMjAKKyNkZWZpbmUgTVNSX0ZBTTEwSF9OT0RFX0lECQkweGMwMDExMDBjCisKKy8qIEs4IE1TUnMgKi8KKyNkZWZpbmUgTVNSX0s4X1RPUF9NRU0xCQkJMHhjMDAxMDAxYQorI2RlZmluZSBNU1JfSzhfVE9QX01FTTIJCQkweGMwMDEwMDFkCisjZGVmaW5lIE1TUl9LOF9TWVNDRkcJCQkweGMwMDEwMDEwCisjZGVmaW5lIE1TUl9LOF9JTlRfUEVORElOR19NU0cJCTB4YzAwMTAwNTUKKy8qIEMxRSBhY3RpdmUgYml0cyBpbiBpbnQgcGVuZGluZyBtZXNzYWdlICovCisjZGVmaW5lIEs4X0lOVFBfQzFFX0FDVElWRV9NQVNLCQkweDE4MDAwMDAwCisjZGVmaW5lIE1TUl9LOF9UU0VHX0FERFIJCTB4YzAwMTAxMTIKKyNkZWZpbmUgSzhfTVRSUkZJWFJBTkdFX0RSQU1fRU5BQkxFCTB4MDAwNDAwMDAgLyogTXRyckZpeERyYW1FbiBiaXQgICAgKi8KKyNkZWZpbmUgSzhfTVRSUkZJWFJBTkdFX0RSQU1fTU9ESUZZCTB4MDAwODAwMDAgLyogTXRyckZpeERyYW1Nb2RFbiBiaXQgKi8KKyNkZWZpbmUgSzhfTVRSUl9SRE1FTV9XUk1FTV9NQVNLCTB4MTgxODE4MTggLyogTWFzazogUmRNZW18V3JNZW0gICAgKi8KKworLyogSzcgTVNScyAqLworI2RlZmluZSBNU1JfSzdfRVZOVFNFTDAJCQkweGMwMDEwMDAwCisjZGVmaW5lIE1TUl9LN19QRVJGQ1RSMAkJCTB4YzAwMTAwMDQKKyNkZWZpbmUgTVNSX0s3X0VWTlRTRUwxCQkJMHhjMDAxMDAwMQorI2RlZmluZSBNU1JfSzdfUEVSRkNUUjEJCQkweGMwMDEwMDA1CisjZGVmaW5lIE1TUl9LN19FVk5UU0VMMgkJCTB4YzAwMTAwMDIKKyNkZWZpbmUgTVNSX0s3X1BFUkZDVFIyCQkJMHhjMDAxMDAwNgorI2RlZmluZSBNU1JfSzdfRVZOVFNFTDMJCQkweGMwMDEwMDAzCisjZGVmaW5lIE1TUl9LN19QRVJGQ1RSMwkJCTB4YzAwMTAwMDcKKyNkZWZpbmUgTVNSX0s3X0NMS19DVEwJCQkweGMwMDEwMDFiCisjZGVmaW5lIE1TUl9LN19IV0NSCQkJMHhjMDAxMDAxNQorI2RlZmluZSBNU1JfSzdfRklEX1ZJRF9DVEwJCTB4YzAwMTAwNDEKKyNkZWZpbmUgTVNSX0s3X0ZJRF9WSURfU1RBVFVTCQkweGMwMDEwMDQyCisKKy8qIEs2IE1TUnMgKi8KKyNkZWZpbmUgTVNSX0s2X1dIQ1IJCQkweGMwMDAwMDgyCisjZGVmaW5lIE1TUl9LNl9VV0NDUgkJCTB4YzAwMDAwODUKKyNkZWZpbmUgTVNSX0s2X0VQTVIJCQkweGMwMDAwMDg2CisjZGVmaW5lIE1TUl9LNl9QU09SCQkJMHhjMDAwMDA4NworI2RlZmluZSBNU1JfSzZfUEZJUgkJCTB4YzAwMDAwODgKKworLyogQ2VudGF1ci1IYXVscy9JRFQgZGVmaW5lZCBNU1JzLiAqLworI2RlZmluZSBNU1JfSURUX0ZDUjEJCQkweDAwMDAwMTA3CisjZGVmaW5lIE1TUl9JRFRfRkNSMgkJCTB4MDAwMDAxMDgKKyNkZWZpbmUgTVNSX0lEVF9GQ1IzCQkJMHgwMDAwMDEwOQorI2RlZmluZSBNU1JfSURUX0ZDUjQJCQkweDAwMDAwMTBhCisKKyNkZWZpbmUgTVNSX0lEVF9NQ1IwCQkJMHgwMDAwMDExMAorI2RlZmluZSBNU1JfSURUX01DUjEJCQkweDAwMDAwMTExCisjZGVmaW5lIE1TUl9JRFRfTUNSMgkJCTB4MDAwMDAxMTIKKyNkZWZpbmUgTVNSX0lEVF9NQ1IzCQkJMHgwMDAwMDExMworI2RlZmluZSBNU1JfSURUX01DUjQJCQkweDAwMDAwMTE0CisjZGVmaW5lIE1TUl9JRFRfTUNSNQkJCTB4MDAwMDAxMTUKKyNkZWZpbmUgTVNSX0lEVF9NQ1I2CQkJMHgwMDAwMDExNgorI2RlZmluZSBNU1JfSURUX01DUjcJCQkweDAwMDAwMTE3CisjZGVmaW5lIE1TUl9JRFRfTUNSX0NUUkwJCTB4MDAwMDAxMjAKKworLyogVklBIEN5cml4IGRlZmluZWQgTVNScyovCisjZGVmaW5lIE1TUl9WSUFfRkNSCQkJMHgwMDAwMTEwNworI2RlZmluZSBNU1JfVklBX0xPTkdIQVVMCQkweDAwMDAxMTBhCisjZGVmaW5lIE1TUl9WSUFfUk5HCQkJMHgwMDAwMTEwYgorI2RlZmluZSBNU1JfVklBX0JDUjIJCQkweDAwMDAxMTQ3CisKKy8qIFRyYW5zbWV0YSBkZWZpbmVkIE1TUnMgKi8KKyNkZWZpbmUgTVNSX1RNVEFfTE9OR1JVTl9DVFJMCQkweDgwODY4MDEwCisjZGVmaW5lIE1TUl9UTVRBX0xPTkdSVU5fRkxBR1MJCTB4ODA4NjgwMTEKKyNkZWZpbmUgTVNSX1RNVEFfTFJUSV9SRUFET1VUCQkweDgwODY4MDE4CisjZGVmaW5lIE1TUl9UTVRBX0xSVElfVk9MVF9NSFoJCTB4ODA4NjgwMWEKKworLyogSW50ZWwgZGVmaW5lZCBNU1JzLiAqLworI2RlZmluZSBNU1JfSUEzMl9QNV9NQ19BRERSCQkweDAwMDAwMDAwCisjZGVmaW5lIE1TUl9JQTMyX1A1X01DX1RZUEUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTVNSX0lBMzJfVFNDCQkJMHgwMDAwMDAxMAorI2RlZmluZSBNU1JfSUEzMl9QTEFURk9STV9JRAkJMHgwMDAwMDAxNworI2RlZmluZSBNU1JfSUEzMl9FQkxfQ1JfUE9XRVJPTgkJMHgwMDAwMDAyYQorI2RlZmluZSBNU1JfRUJDX0ZSRVFVRU5DWV9JRAkJMHgwMDAwMDAyYworI2RlZmluZSBNU1JfSUEzMl9GRUFUVVJFX0NPTlRST0wgICAgICAgIDB4MDAwMDAwM2EKKworI2RlZmluZSBGRUFUVVJFX0NPTlRST0xfTE9DS0VECQkJCSgxPDwwKQorI2RlZmluZSBGRUFUVVJFX0NPTlRST0xfVk1YT05fRU5BQkxFRF9JTlNJREVfU01YCSgxPDwxKQorI2RlZmluZSBGRUFUVVJFX0NPTlRST0xfVk1YT05fRU5BQkxFRF9PVVRTSURFX1NNWAkoMTw8MikKKworI2RlZmluZSBNU1JfSUEzMl9BUElDQkFTRQkJMHgwMDAwMDAxYgorI2RlZmluZSBNU1JfSUEzMl9BUElDQkFTRV9CU1AJCSgxPDw4KQorI2RlZmluZSBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUJKDE8PDExKQorI2RlZmluZSBNU1JfSUEzMl9BUElDQkFTRV9CQVNFCQkoMHhmZmZmZjw8MTIpCisKKyNkZWZpbmUgTVNSX0lBMzJfVFNDREVBRExJTkUJCTB4MDAwMDA2ZTAKKworI2RlZmluZSBNU1JfSUEzMl9VQ09ERV9XUklURQkJMHgwMDAwMDA3OQorI2RlZmluZSBNU1JfSUEzMl9VQ09ERV9SRVYJCTB4MDAwMDAwOGIKKworI2RlZmluZSBNU1JfSUEzMl9QRVJGX1NUQVRVUwkJMHgwMDAwMDE5OAorI2RlZmluZSBNU1JfSUEzMl9QRVJGX0NUTAkJMHgwMDAwMDE5OQorCisjZGVmaW5lIE1TUl9JQTMyX01QRVJGCQkJMHgwMDAwMDBlNworI2RlZmluZSBNU1JfSUEzMl9BUEVSRgkJCTB4MDAwMDAwZTgKKworI2RlZmluZSBNU1JfSUEzMl9USEVSTV9DT05UUk9MCQkweDAwMDAwMTlhCisjZGVmaW5lIE1TUl9JQTMyX1RIRVJNX0lOVEVSUlVQVAkweDAwMDAwMTliCisKKyNkZWZpbmUgVEhFUk1fSU5UX0hJR0hfRU5BQkxFCQkoMSA8PCAwKQorI2RlZmluZSBUSEVSTV9JTlRfTE9XX0VOQUJMRQkJKDEgPDwgMSkKKyNkZWZpbmUgVEhFUk1fSU5UX1BMTl9FTkFCTEUJCSgxIDw8IDI0KQorCisjZGVmaW5lIE1TUl9JQTMyX1RIRVJNX1NUQVRVUwkJMHgwMDAwMDE5YworCisjZGVmaW5lIFRIRVJNX1NUQVRVU19QUk9DSE9UCQkoMSA8PCAwKQorI2RlZmluZSBUSEVSTV9TVEFUVVNfUE9XRVJfTElNSVQJKDEgPDwgMTApCisKKyNkZWZpbmUgTVNSX1RIRVJNMl9DVEwJCQkweDAwMDAwMTlkCisKKyNkZWZpbmUgTVNSX1RIRVJNMl9DVExfVE1fU0VMRUNUCSgxVUxMIDw8IDE2KQorCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFCQkweDAwMDAwMWEwCisKKyNkZWZpbmUgTVNSX0lBMzJfVEVNUEVSQVRVUkVfVEFSR0VUCTB4MDAwMDAxYTIKKworI2RlZmluZSBNU1JfSUEzMl9FTkVSR1lfUEVSRl9CSUFTCTB4MDAwMDAxYjAKKyNkZWZpbmUgRU5FUkdZX1BFUkZfQklBU19QRVJGT1JNQU5DRQkwCisjZGVmaW5lIEVORVJHWV9QRVJGX0JJQVNfTk9STUFMCQk2CisjZGVmaW5lIEVORVJHWV9QRVJGX0JJQVNfUE9XRVJTQVZFCTE1CisKKyNkZWZpbmUgTVNSX0lBMzJfUEFDS0FHRV9USEVSTV9TVEFUVVMJCTB4MDAwMDAxYjEKKworI2RlZmluZSBQQUNLQUdFX1RIRVJNX1NUQVRVU19QUk9DSE9UCQkoMSA8PCAwKQorI2RlZmluZSBQQUNLQUdFX1RIRVJNX1NUQVRVU19QT1dFUl9MSU1JVAkoMSA8PCAxMCkKKworI2RlZmluZSBNU1JfSUEzMl9QQUNLQUdFX1RIRVJNX0lOVEVSUlVQVAkweDAwMDAwMWIyCisKKyNkZWZpbmUgUEFDS0FHRV9USEVSTV9JTlRfSElHSF9FTkFCTEUJCSgxIDw8IDApCisjZGVmaW5lIFBBQ0tBR0VfVEhFUk1fSU5UX0xPV19FTkFCTEUJCSgxIDw8IDEpCisjZGVmaW5lIFBBQ0tBR0VfVEhFUk1fSU5UX1BMTl9FTkFCTEUJCSgxIDw8IDI0KQorCisvKiBUaGVybWFsIFRocmVzaG9sZHMgU3VwcG9ydCAqLworI2RlZmluZSBUSEVSTV9JTlRfVEhSRVNIT0xEMF9FTkFCTEUgICAgKDEgPDwgMTUpCisjZGVmaW5lIFRIRVJNX1NISUZUX1RIUkVTSE9MRDAgICAgICAgIDgKKyNkZWZpbmUgVEhFUk1fTUFTS19USFJFU0hPTEQwICAgICAgICAgICgweDdmIDw8IFRIRVJNX1NISUZUX1RIUkVTSE9MRDApCisjZGVmaW5lIFRIRVJNX0lOVF9USFJFU0hPTEQxX0VOQUJMRSAgICAoMSA8PCAyMykKKyNkZWZpbmUgVEhFUk1fU0hJRlRfVEhSRVNIT0xEMSAgICAgICAgMTYKKyNkZWZpbmUgVEhFUk1fTUFTS19USFJFU0hPTEQxICAgICAgICAgICgweDdmIDw8IFRIRVJNX1NISUZUX1RIUkVTSE9MRDEpCisjZGVmaW5lIFRIRVJNX1NUQVRVU19USFJFU0hPTEQwICAgICAgICAoMSA8PCA2KQorI2RlZmluZSBUSEVSTV9MT0dfVEhSRVNIT0xEMCAgICAgICAgICAgKDEgPDwgNykKKyNkZWZpbmUgVEhFUk1fU1RBVFVTX1RIUkVTSE9MRDEgICAgICAgICgxIDw8IDgpCisjZGVmaW5lIFRIRVJNX0xPR19USFJFU0hPTEQxICAgICAgICAgICAoMSA8PCA5KQorCisvKiBNSVNDX0VOQUJMRSBiaXRzOiBhcmNoaXRlY3R1cmFsICovCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0ZBU1RfU1RSSU5HCSgxVUxMIDw8IDApCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1RDQwkJKDFVTEwgPDwgMSkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRU1PTgkJKDFVTEwgPDwgNykKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfQlRTX1VOQVZBSUwJKDFVTEwgPDwgMTEpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1BFQlNfVU5BVkFJTAkoMVVMTCA8PCAxMikKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfRU5IQU5DRURfU1BFRURTVEVQCSgxVUxMIDw8IDE2KQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9NV0FJVAkJKDFVTEwgPDwgMTgpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0xJTUlUX0NQVUlECSgxVUxMIDw8IDIyKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9YVFBSX0RJU0FCTEUJKDFVTEwgPDwgMjMpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1hEX0RJU0FCTEUJCSgxVUxMIDw8IDM0KQorCisvKiBNSVNDX0VOQUJMRSBiaXRzOiBtb2RlbC1zcGVjaWZpYywgbWVhbmluZyBtYXkgdmFyeSBmcm9tIGNvcmUgdG8gY29yZSAqLworI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9YODdfQ09NUEFUCQkoMVVMTCA8PCAyKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9UTTEJCSgxVUxMIDw8IDMpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX1NQTElUX0xPQ0tfRElTQUJMRQkoMVVMTCA8PCA0KQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9MM0NBQ0hFX0RJU0FCTEUJKDFVTEwgPDwgNikKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfU1VQUFJFU1NfTE9DSwkoMVVMTCA8PCA4KQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9QUkVGRVRDSF9ESVNBQkxFCSgxVUxMIDw8IDkpCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0ZFUlIJCSgxVUxMIDw8IDEwKQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9GRVJSX01VTFRJUExFWAkoMVVMTCA8PCAxMCkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfVE0yCQkoMVVMTCA8PCAxMykKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfQURKX1BSRUZfRElTQUJMRQkoMVVMTCA8PCAxOSkKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVfU1BFRURTVEVQX0xPQ0sJKDFVTEwgPDwgMjApCisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFX0wxRF9DT05URVhUCSgxVUxMIDw8IDI0KQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9EQ1VfUFJFRl9ESVNBQkxFCSgxVUxMIDw8IDM3KQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9UVVJCT19ESVNBQkxFCSgxVUxMIDw8IDM4KQorI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9JUF9QUkVGX0RJU0FCTEUJKDFVTEwgPDwgMzkpCisKKy8qIFA0L1hlb24rIHNwZWNpZmljICovCisjZGVmaW5lIE1TUl9JQTMyX01DR19FQVgJCTB4MDAwMDAxODAKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX0VCWAkJMHgwMDAwMDE4MQorI2RlZmluZSBNU1JfSUEzMl9NQ0dfRUNYCQkweDAwMDAwMTgyCisjZGVmaW5lIE1TUl9JQTMyX01DR19FRFgJCTB4MDAwMDAxODMKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX0VTSQkJMHgwMDAwMDE4NAorI2RlZmluZSBNU1JfSUEzMl9NQ0dfRURJCQkweDAwMDAwMTg1CisjZGVmaW5lIE1TUl9JQTMyX01DR19FQlAJCTB4MDAwMDAxODYKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX0VTUAkJMHgwMDAwMDE4NworI2RlZmluZSBNU1JfSUEzMl9NQ0dfRUZMQUdTCQkweDAwMDAwMTg4CisjZGVmaW5lIE1TUl9JQTMyX01DR19FSVAJCTB4MDAwMDAxODkKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX1JFU0VSVkVECQkweDAwMDAwMThhCisKKy8qIFBlbnRpdW0gSVYgcGVyZm9ybWFuY2UgY291bnRlciBNU1JzICovCisjZGVmaW5lIE1TUl9QNF9CUFVfUEVSRkNUUjAJCTB4MDAwMDAzMDAKKyNkZWZpbmUgTVNSX1A0X0JQVV9QRVJGQ1RSMQkJMHgwMDAwMDMwMQorI2RlZmluZSBNU1JfUDRfQlBVX1BFUkZDVFIyCQkweDAwMDAwMzAyCisjZGVmaW5lIE1TUl9QNF9CUFVfUEVSRkNUUjMJCTB4MDAwMDAzMDMKKyNkZWZpbmUgTVNSX1A0X01TX1BFUkZDVFIwCQkweDAwMDAwMzA0CisjZGVmaW5lIE1TUl9QNF9NU19QRVJGQ1RSMQkJMHgwMDAwMDMwNQorI2RlZmluZSBNU1JfUDRfTVNfUEVSRkNUUjIJCTB4MDAwMDAzMDYKKyNkZWZpbmUgTVNSX1A0X01TX1BFUkZDVFIzCQkweDAwMDAwMzA3CisjZGVmaW5lIE1TUl9QNF9GTEFNRV9QRVJGQ1RSMAkJMHgwMDAwMDMwOAorI2RlZmluZSBNU1JfUDRfRkxBTUVfUEVSRkNUUjEJCTB4MDAwMDAzMDkKKyNkZWZpbmUgTVNSX1A0X0ZMQU1FX1BFUkZDVFIyCQkweDAwMDAwMzBhCisjZGVmaW5lIE1TUl9QNF9GTEFNRV9QRVJGQ1RSMwkJMHgwMDAwMDMwYgorI2RlZmluZSBNU1JfUDRfSVFfUEVSRkNUUjAJCTB4MDAwMDAzMGMKKyNkZWZpbmUgTVNSX1A0X0lRX1BFUkZDVFIxCQkweDAwMDAwMzBkCisjZGVmaW5lIE1TUl9QNF9JUV9QRVJGQ1RSMgkJMHgwMDAwMDMwZQorI2RlZmluZSBNU1JfUDRfSVFfUEVSRkNUUjMJCTB4MDAwMDAzMGYKKyNkZWZpbmUgTVNSX1A0X0lRX1BFUkZDVFI0CQkweDAwMDAwMzEwCisjZGVmaW5lIE1TUl9QNF9JUV9QRVJGQ1RSNQkJMHgwMDAwMDMxMQorI2RlZmluZSBNU1JfUDRfQlBVX0NDQ1IwCQkweDAwMDAwMzYwCisjZGVmaW5lIE1TUl9QNF9CUFVfQ0NDUjEJCTB4MDAwMDAzNjEKKyNkZWZpbmUgTVNSX1A0X0JQVV9DQ0NSMgkJMHgwMDAwMDM2MgorI2RlZmluZSBNU1JfUDRfQlBVX0NDQ1IzCQkweDAwMDAwMzYzCisjZGVmaW5lIE1TUl9QNF9NU19DQ0NSMAkJCTB4MDAwMDAzNjQKKyNkZWZpbmUgTVNSX1A0X01TX0NDQ1IxCQkJMHgwMDAwMDM2NQorI2RlZmluZSBNU1JfUDRfTVNfQ0NDUjIJCQkweDAwMDAwMzY2CisjZGVmaW5lIE1TUl9QNF9NU19DQ0NSMwkJCTB4MDAwMDAzNjcKKyNkZWZpbmUgTVNSX1A0X0ZMQU1FX0NDQ1IwCQkweDAwMDAwMzY4CisjZGVmaW5lIE1TUl9QNF9GTEFNRV9DQ0NSMQkJMHgwMDAwMDM2OQorI2RlZmluZSBNU1JfUDRfRkxBTUVfQ0NDUjIJCTB4MDAwMDAzNmEKKyNkZWZpbmUgTVNSX1A0X0ZMQU1FX0NDQ1IzCQkweDAwMDAwMzZiCisjZGVmaW5lIE1TUl9QNF9JUV9DQ0NSMAkJCTB4MDAwMDAzNmMKKyNkZWZpbmUgTVNSX1A0X0lRX0NDQ1IxCQkJMHgwMDAwMDM2ZAorI2RlZmluZSBNU1JfUDRfSVFfQ0NDUjIJCQkweDAwMDAwMzZlCisjZGVmaW5lIE1TUl9QNF9JUV9DQ0NSMwkJCTB4MDAwMDAzNmYKKyNkZWZpbmUgTVNSX1A0X0lRX0NDQ1I0CQkJMHgwMDAwMDM3MAorI2RlZmluZSBNU1JfUDRfSVFfQ0NDUjUJCQkweDAwMDAwMzcxCisjZGVmaW5lIE1TUl9QNF9BTEZfRVNDUjAJCTB4MDAwMDAzY2EKKyNkZWZpbmUgTVNSX1A0X0FMRl9FU0NSMQkJMHgwMDAwMDNjYgorI2RlZmluZSBNU1JfUDRfQlBVX0VTQ1IwCQkweDAwMDAwM2IyCisjZGVmaW5lIE1TUl9QNF9CUFVfRVNDUjEJCTB4MDAwMDAzYjMKKyNkZWZpbmUgTVNSX1A0X0JTVV9FU0NSMAkJMHgwMDAwMDNhMAorI2RlZmluZSBNU1JfUDRfQlNVX0VTQ1IxCQkweDAwMDAwM2ExCisjZGVmaW5lIE1TUl9QNF9DUlVfRVNDUjAJCTB4MDAwMDAzYjgKKyNkZWZpbmUgTVNSX1A0X0NSVV9FU0NSMQkJMHgwMDAwMDNiOQorI2RlZmluZSBNU1JfUDRfQ1JVX0VTQ1IyCQkweDAwMDAwM2NjCisjZGVmaW5lIE1TUl9QNF9DUlVfRVNDUjMJCTB4MDAwMDAzY2QKKyNkZWZpbmUgTVNSX1A0X0NSVV9FU0NSNAkJMHgwMDAwMDNlMAorI2RlZmluZSBNU1JfUDRfQ1JVX0VTQ1I1CQkweDAwMDAwM2UxCisjZGVmaW5lIE1TUl9QNF9EQUNfRVNDUjAJCTB4MDAwMDAzYTgKKyNkZWZpbmUgTVNSX1A0X0RBQ19FU0NSMQkJMHgwMDAwMDNhOQorI2RlZmluZSBNU1JfUDRfRklSTV9FU0NSMAkJMHgwMDAwMDNhNAorI2RlZmluZSBNU1JfUDRfRklSTV9FU0NSMQkJMHgwMDAwMDNhNQorI2RlZmluZSBNU1JfUDRfRkxBTUVfRVNDUjAJCTB4MDAwMDAzYTYKKyNkZWZpbmUgTVNSX1A0X0ZMQU1FX0VTQ1IxCQkweDAwMDAwM2E3CisjZGVmaW5lIE1TUl9QNF9GU0JfRVNDUjAJCTB4MDAwMDAzYTIKKyNkZWZpbmUgTVNSX1A0X0ZTQl9FU0NSMQkJMHgwMDAwMDNhMworI2RlZmluZSBNU1JfUDRfSVFfRVNDUjAJCQkweDAwMDAwM2JhCisjZGVmaW5lIE1TUl9QNF9JUV9FU0NSMQkJCTB4MDAwMDAzYmIKKyNkZWZpbmUgTVNSX1A0X0lTX0VTQ1IwCQkJMHgwMDAwMDNiNAorI2RlZmluZSBNU1JfUDRfSVNfRVNDUjEJCQkweDAwMDAwM2I1CisjZGVmaW5lIE1TUl9QNF9JVExCX0VTQ1IwCQkweDAwMDAwM2I2CisjZGVmaW5lIE1TUl9QNF9JVExCX0VTQ1IxCQkweDAwMDAwM2I3CisjZGVmaW5lIE1TUl9QNF9JWF9FU0NSMAkJCTB4MDAwMDAzYzgKKyNkZWZpbmUgTVNSX1A0X0lYX0VTQ1IxCQkJMHgwMDAwMDNjOQorI2RlZmluZSBNU1JfUDRfTU9CX0VTQ1IwCQkweDAwMDAwM2FhCisjZGVmaW5lIE1TUl9QNF9NT0JfRVNDUjEJCTB4MDAwMDAzYWIKKyNkZWZpbmUgTVNSX1A0X01TX0VTQ1IwCQkJMHgwMDAwMDNjMAorI2RlZmluZSBNU1JfUDRfTVNfRVNDUjEJCQkweDAwMDAwM2MxCisjZGVmaW5lIE1TUl9QNF9QTUhfRVNDUjAJCTB4MDAwMDAzYWMKKyNkZWZpbmUgTVNSX1A0X1BNSF9FU0NSMQkJMHgwMDAwMDNhZAorI2RlZmluZSBNU1JfUDRfUkFUX0VTQ1IwCQkweDAwMDAwM2JjCisjZGVmaW5lIE1TUl9QNF9SQVRfRVNDUjEJCTB4MDAwMDAzYmQKKyNkZWZpbmUgTVNSX1A0X1NBQVRfRVNDUjAJCTB4MDAwMDAzYWUKKyNkZWZpbmUgTVNSX1A0X1NBQVRfRVNDUjEJCTB4MDAwMDAzYWYKKyNkZWZpbmUgTVNSX1A0X1NTVV9FU0NSMAkJMHgwMDAwMDNiZQorI2RlZmluZSBNU1JfUDRfU1NVX0VTQ1IxCQkweDAwMDAwM2JmIC8qIGd1ZXNzOiBub3QgaW4gbWFudWFsICovCisKKyNkZWZpbmUgTVNSX1A0X1RCUFVfRVNDUjAJCTB4MDAwMDAzYzIKKyNkZWZpbmUgTVNSX1A0X1RCUFVfRVNDUjEJCTB4MDAwMDAzYzMKKyNkZWZpbmUgTVNSX1A0X1RDX0VTQ1IwCQkJMHgwMDAwMDNjNAorI2RlZmluZSBNU1JfUDRfVENfRVNDUjEJCQkweDAwMDAwM2M1CisjZGVmaW5lIE1TUl9QNF9VMkxfRVNDUjAJCTB4MDAwMDAzYjAKKyNkZWZpbmUgTVNSX1A0X1UyTF9FU0NSMQkJMHgwMDAwMDNiMQorCisjZGVmaW5lIE1TUl9QNF9QRUJTX01BVFJJWF9WRVJUCQkweDAwMDAwM2YyCisKKy8qIEludGVsIENvcmUtYmFzZWQgQ1BVIHBlcmZvcm1hbmNlIGNvdW50ZXJzICovCisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfRklYRURfQ1RSMAkweDAwMDAwMzA5CisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfRklYRURfQ1RSMQkweDAwMDAwMzBhCisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfRklYRURfQ1RSMgkweDAwMDAwMzBiCisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfRklYRURfQ1RSX0NUUkwJMHgwMDAwMDM4ZAorI2RlZmluZSBNU1JfQ09SRV9QRVJGX0dMT0JBTF9TVEFUVVMJMHgwMDAwMDM4ZQorI2RlZmluZSBNU1JfQ09SRV9QRVJGX0dMT0JBTF9DVFJMCTB4MDAwMDAzOGYKKyNkZWZpbmUgTVNSX0NPUkVfUEVSRl9HTE9CQUxfT1ZGX0NUUkwJMHgwMDAwMDM5MAorCisvKiBHZW9kZSBkZWZpbmVkIE1TUnMgKi8KKyNkZWZpbmUgTVNSX0dFT0RFX0JVU0NPTlRfQ09ORjAJCTB4MDAwMDE5MDAKKworLyogSW50ZWwgVlQgTVNScyAqLworI2RlZmluZSBNU1JfSUEzMl9WTVhfQkFTSUMgICAgICAgICAgICAgIDB4MDAwMDA0ODAKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX1BJTkJBU0VEX0NUTFMgICAgICAweDAwMDAwNDgxCisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9QUk9DQkFTRURfQ1RMUyAgICAgMHgwMDAwMDQ4MgorI2RlZmluZSBNU1JfSUEzMl9WTVhfRVhJVF9DVExTICAgICAgICAgIDB4MDAwMDA0ODMKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX0VOVFJZX0NUTFMgICAgICAgICAweDAwMDAwNDg0CisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9NSVNDICAgICAgICAgICAgICAgMHgwMDAwMDQ4NQorI2RlZmluZSBNU1JfSUEzMl9WTVhfQ1IwX0ZJWEVEMCAgICAgICAgIDB4MDAwMDA0ODYKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX0NSMF9GSVhFRDEgICAgICAgICAweDAwMDAwNDg3CisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9DUjRfRklYRUQwICAgICAgICAgMHgwMDAwMDQ4OAorI2RlZmluZSBNU1JfSUEzMl9WTVhfQ1I0X0ZJWEVEMSAgICAgICAgIDB4MDAwMDA0ODkKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX1ZNQ1NfRU5VTSAgICAgICAgICAweDAwMDAwNDhhCisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9QUk9DQkFTRURfQ1RMUzIgICAgMHgwMDAwMDQ4YgorI2RlZmluZSBNU1JfSUEzMl9WTVhfRVBUX1ZQSURfQ0FQICAgICAgIDB4MDAwMDA0OGMKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX1RSVUVfUElOQkFTRURfQ1RMUyAgMHgwMDAwMDQ4ZAorI2RlZmluZSBNU1JfSUEzMl9WTVhfVFJVRV9QUk9DQkFTRURfQ1RMUyAweDAwMDAwNDhlCisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9UUlVFX0VYSVRfQ1RMUyAgICAgIDB4MDAwMDA0OGYKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX1RSVUVfRU5UUllfQ1RMUyAgICAgMHgwMDAwMDQ5MAorCisvKiBWTVhfQkFTSUMgYml0cyBhbmQgYml0bWFza3MgKi8KKyNkZWZpbmUgVk1YX0JBU0lDX1ZNQ1NfU0laRV9TSElGVAkzMgorI2RlZmluZSBWTVhfQkFTSUNfNjQJCTB4MDAwMTAwMDAwMDAwMDAwMExMVQorI2RlZmluZSBWTVhfQkFTSUNfTUVNX1RZUEVfU0hJRlQJNTAKKyNkZWZpbmUgVk1YX0JBU0lDX01FTV9UWVBFX01BU0sJMHgwMDNjMDAwMDAwMDAwMDAwTExVCisjZGVmaW5lIFZNWF9CQVNJQ19NRU1fVFlQRV9XQgk2TExVCisjZGVmaW5lIFZNWF9CQVNJQ19JTk9VVAkJMHgwMDQwMDAwMDAwMDAwMDAwTExVCisKKy8qIEFNRC1WIE1TUnMgKi8KKworI2RlZmluZSBNU1JfVk1fQ1IgICAgICAgICAgICAgICAgICAgICAgIDB4YzAwMTAxMTQKKyNkZWZpbmUgTVNSX1ZNX0lHTk5FICAgICAgICAgICAgICAgICAgICAweGMwMDEwMTE1CisjZGVmaW5lIE1TUl9WTV9IU0FWRV9QQSAgICAgICAgICAgICAgICAgMHhjMDAxMDExNworCisjZW5kaWYgLyogX0FTTV9YODZfTVNSX0lOREVYX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vbXNyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL21zci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYWVhZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL21zci5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX0FTTV9YODZfTVNSX0gKKyNkZWZpbmUgX0FTTV9YODZfTVNSX0gKKworI2luY2x1ZGUgPGFzbS9tc3ItaW5kZXguaD4KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2RlZmluZSBYODZfSU9DX1JETVNSX1JFR1MJX0lPV1IoJ2MnLCAweEEwLCBfX3UzMls4XSkKKyNkZWZpbmUgWDg2X0lPQ19XUk1TUl9SRUdTCV9JT1dSKCdjJywgMHhBMSwgX191MzJbOF0pCisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKyNlbmRpZiAvKiBfQVNNX1g4Nl9NU1JfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9tdHJyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL210cnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGY4ZjJmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9tdHJyLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qICBHZW5lcmljIE1UUlIgKE1lbW9yeSBUeXBlIFJhbmdlIFJlZ2lzdGVyKSBpb2N0bHMuCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMTk5OSAgUmljaGFyZCBHb29jaAorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAgICBSaWNoYXJkIEdvb2NoIG1heSBiZSByZWFjaGVkIGJ5IGVtYWlsIGF0ICByZ29vY2hAYXRuZi5jc2lyby5hdQorICAgIFRoZSBwb3N0YWwgYWRkcmVzcyBpczoKKyAgICAgIFJpY2hhcmQgR29vY2gsIGMvbyBBVE5GLCBQLiBPLiBCb3ggNzYsIEVwcGluZywgTi5TLlcuLCAyMTIxLCBBdXN0cmFsaWEuCisqLworI2lmbmRlZiBfQVNNX1g4Nl9NVFJSX0gKKyNkZWZpbmUgX0FTTV9YODZfTVRSUl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworI2RlZmluZQlNVFJSX0lPQ1RMX0JBU0UJJ00nCisKK3N0cnVjdCBtdHJyX3NlbnRyeSB7CisgICAgdW5zaWduZWQgbG9uZyBiYXNlOyAgICAvKiAgQmFzZSBhZGRyZXNzICAgICAqLworICAgIHVuc2lnbmVkIGludCBzaXplOyAgICAvKiAgU2l6ZSBvZiByZWdpb24gICAqLworICAgIHVuc2lnbmVkIGludCB0eXBlOyAgICAgLyogIFR5cGUgb2YgcmVnaW9uICAgKi8KK307CisKKy8qIFdhcm5pbmc6IHRoaXMgc3RydWN0dXJlIGhhcyBhIGRpZmZlcmVudCBvcmRlciBmcm9tIGkzODYKKyAgIG9uIHg4Ni02NC4gVGhlIDMyYml0IGVtdWxhdGlvbiBjb2RlIHRha2VzIGNhcmUgb2YgdGhhdC4KKyAgIEJ1dCB5b3UgbmVlZCB0byB1c2UgdGhpcyBmb3IgNjRiaXQsIG90aGVyd2lzZSB5b3VyIFggc2VydmVyCisgICB3aWxsIGJyZWFrLiAqLworCisjaWZkZWYgX19pMzg2X18KK3N0cnVjdCBtdHJyX2dlbnRyeSB7CisgICAgdW5zaWduZWQgaW50IHJlZ251bTsgICAvKiAgUmVnaXN0ZXIgbnVtYmVyICAqLworICAgIHVuc2lnbmVkIGxvbmcgYmFzZTsgICAgLyogIEJhc2UgYWRkcmVzcyAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsgICAgLyogIFNpemUgb2YgcmVnaW9uICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgdHlwZTsgICAgIC8qICBUeXBlIG9mIHJlZ2lvbiAgICovCit9OworCisjZWxzZSAvKiBfX2kzODZfXyAqLworCitzdHJ1Y3QgbXRycl9nZW50cnkgeworICAgIHVuc2lnbmVkIGxvbmcgYmFzZTsgICAgLyogIEJhc2UgYWRkcmVzcyAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsgICAgLyogIFNpemUgb2YgcmVnaW9uICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgcmVnbnVtOyAgIC8qICBSZWdpc3RlciBudW1iZXIgICovCisgICAgdW5zaWduZWQgaW50IHR5cGU7ICAgICAvKiAgVHlwZSBvZiByZWdpb24gICAqLworfTsKKyNlbmRpZiAvKiAhX19pMzg2X18gKi8KKworc3RydWN0IG10cnJfdmFyX3JhbmdlIHsKKwlfX3UzMiBiYXNlX2xvOworCV9fdTMyIGJhc2VfaGk7CisJX191MzIgbWFza19sbzsKKwlfX3UzMiBtYXNrX2hpOworfTsKKworLyogSW4gdGhlIEludGVsIHByb2Nlc3NvcidzIE1UUlIgaW50ZXJmYWNlLCB0aGUgTVRSUiB0eXBlIGlzIGFsd2F5cyBoZWxkIGluCisgICBhbiA4IGJpdCBmaWVsZDogKi8KK3R5cGVkZWYgX191OCBtdHJyX3R5cGU7CisKKyNkZWZpbmUgTVRSUl9OVU1fRklYRURfUkFOR0VTIDg4CisjZGVmaW5lIE1UUlJfTUFYX1ZBUl9SQU5HRVMgMjU2CisKK3N0cnVjdCBtdHJyX3N0YXRlX3R5cGUgeworCXN0cnVjdCBtdHJyX3Zhcl9yYW5nZSB2YXJfcmFuZ2VzW01UUlJfTUFYX1ZBUl9SQU5HRVNdOworCW10cnJfdHlwZSBmaXhlZF9yYW5nZXNbTVRSUl9OVU1fRklYRURfUkFOR0VTXTsKKwl1bnNpZ25lZCBjaGFyIGVuYWJsZWQ7CisJdW5zaWduZWQgY2hhciBoYXZlX2ZpeGVkOworCW10cnJfdHlwZSBkZWZfdHlwZTsKK307CisKKyNkZWZpbmUgTVRSUnBoeXNCYXNlX01TUihyZWcpICgweDIwMCArIDIgKiAocmVnKSkKKyNkZWZpbmUgTVRSUnBoeXNNYXNrX01TUihyZWcpICgweDIwMCArIDIgKiAocmVnKSArIDEpCisKKy8qICBUaGVzZSBhcmUgdGhlIHZhcmlvdXMgaW9jdGxzICAqLworI2RlZmluZSBNVFJSSU9DX0FERF9FTlRSWSAgICAgICAgX0lPVyhNVFJSX0lPQ1RMX0JBU0UsICAwLCBzdHJ1Y3QgbXRycl9zZW50cnkpCisjZGVmaW5lIE1UUlJJT0NfU0VUX0VOVFJZICAgICAgICBfSU9XKE1UUlJfSU9DVExfQkFTRSwgIDEsIHN0cnVjdCBtdHJyX3NlbnRyeSkKKyNkZWZpbmUgTVRSUklPQ19ERUxfRU5UUlkgICAgICAgIF9JT1coTVRSUl9JT0NUTF9CQVNFLCAgMiwgc3RydWN0IG10cnJfc2VudHJ5KQorI2RlZmluZSBNVFJSSU9DX0dFVF9FTlRSWSAgICAgICAgX0lPV1IoTVRSUl9JT0NUTF9CQVNFLCAzLCBzdHJ1Y3QgbXRycl9nZW50cnkpCisjZGVmaW5lIE1UUlJJT0NfS0lMTF9FTlRSWSAgICAgICBfSU9XKE1UUlJfSU9DVExfQkFTRSwgIDQsIHN0cnVjdCBtdHJyX3NlbnRyeSkKKyNkZWZpbmUgTVRSUklPQ19BRERfUEFHRV9FTlRSWSAgIF9JT1coTVRSUl9JT0NUTF9CQVNFLCAgNSwgc3RydWN0IG10cnJfc2VudHJ5KQorI2RlZmluZSBNVFJSSU9DX1NFVF9QQUdFX0VOVFJZICAgX0lPVyhNVFJSX0lPQ1RMX0JBU0UsICA2LCBzdHJ1Y3QgbXRycl9zZW50cnkpCisjZGVmaW5lIE1UUlJJT0NfREVMX1BBR0VfRU5UUlkgICBfSU9XKE1UUlJfSU9DVExfQkFTRSwgIDcsIHN0cnVjdCBtdHJyX3NlbnRyeSkKKyNkZWZpbmUgTVRSUklPQ19HRVRfUEFHRV9FTlRSWSAgIF9JT1dSKE1UUlJfSU9DVExfQkFTRSwgOCwgc3RydWN0IG10cnJfZ2VudHJ5KQorI2RlZmluZSBNVFJSSU9DX0tJTExfUEFHRV9FTlRSWSAgX0lPVyhNVFJSX0lPQ1RMX0JBU0UsICA5LCBzdHJ1Y3QgbXRycl9zZW50cnkpCisKKy8qICBUaGVzZSBhcmUgdGhlIHJlZ2lvbiB0eXBlcyAgKi8KKyNkZWZpbmUgTVRSUl9UWVBFX1VOQ0FDSEFCTEUgMAorI2RlZmluZSBNVFJSX1RZUEVfV1JDT01CICAgICAxCisvKiNkZWZpbmUgTVRSUl9UWVBFXyAgICAgICAgIDIqLworLyojZGVmaW5lIE1UUlJfVFlQRV8gICAgICAgICAzKi8KKyNkZWZpbmUgTVRSUl9UWVBFX1dSVEhST1VHSCAgNAorI2RlZmluZSBNVFJSX1RZUEVfV1JQUk9UICAgICA1CisjZGVmaW5lIE1UUlJfVFlQRV9XUkJBQ0sgICAgIDYKKyNkZWZpbmUgTVRSUl9OVU1fVFlQRVMgICAgICAgNworCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9NVFJSX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vcGFyYW0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vcGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjVkNDU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wYXJhbS5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wYXJhbS5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wb2xsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3BvbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTg1MDlkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wb2xsLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BvbGwuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vcG9zaXhfdHlwZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vcG9zaXhfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmRjZmYwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wb3NpeF90eXBlcy5oCkBAIC0wLDAgKzEsNSBAQAorIyBpZmRlZiBfX2kzODZfXworIyAgaW5jbHVkZSA8YXNtL3Bvc2l4X3R5cGVzXzMyLmg+CisjIGVsc2UKKyMgIGluY2x1ZGUgPGFzbS9wb3NpeF90eXBlc182NC5oPgorIyBlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wb3NpeF90eXBlc18zMi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wb3NpeF90eXBlc18zMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZTQ1NjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3Bvc2l4X3R5cGVzXzMyLmgKQEAgLTAsMCArMSw0NiBAQAorI2lmbmRlZiBfQVNNX1g4Nl9QT1NJWF9UWVBFU18zMl9ICisjZGVmaW5lIF9BU01fWDg2X1BPU0lYX1RZUEVTXzMyX0gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBnZW5lcmFsbHkgdXNlZCBieSB1c2VyLWxldmVsIHNvZnR3YXJlLCBzbyB5b3UgbmVlZCB0bworICogYmUgYSBsaXR0bGUgY2FyZWZ1bCBhYm91dCBuYW1lc3BhY2UgcG9sbHV0aW9uIGV0Yy4gIEFsc28sIHdlIGNhbm5vdAorICogYXNzdW1lIEdDQyBpcyBiZWluZyB1c2VkLgorICovCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlfX2tlcm5lbF9pbm9fdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfbW9kZV90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9ubGlua190OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF9vZmZfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9waWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfaXBjX3BpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF91aWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfZ2lkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlfX2tlcm5lbF9zaXplX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfc3NpemVfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9wdHJkaWZmX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX3RpbWVfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfc3VzZWNvbmRzX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX2Nsb2NrX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfdGltZXJfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9jbG9ja2lkX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfZGFkZHJfdDsKK3R5cGVkZWYgY2hhciAqCQlfX2tlcm5lbF9jYWRkcl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF91aWQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9naWQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJX19rZXJuZWxfdWlkMzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX2dpZDMyX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfb2xkX3VpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9vbGRfZ2lkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX29sZF9kZXZfdDsKKworI2lmZGVmIF9fR05VQ19fCit0eXBlZGVmIGxvbmcgbG9uZwlfX2tlcm5lbF9sb2ZmX3Q7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludAl2YWxbMl07Cit9IF9fa2VybmVsX2ZzaWRfdDsKKworCisjZW5kaWYgLyogX0FTTV9YODZfUE9TSVhfVFlQRVNfMzJfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wb3NpeF90eXBlc182NC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wb3NpeF90eXBlc182NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NzYzYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3Bvc2l4X3R5cGVzXzY0LmgKQEAgLTAsMCArMSw0NyBAQAorI2lmbmRlZiBfQVNNX1g4Nl9QT1NJWF9UWVBFU182NF9ICisjZGVmaW5lIF9BU01fWDg2X1BPU0lYX1RZUEVTXzY0X0gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBnZW5lcmFsbHkgdXNlZCBieSB1c2VyLWxldmVsIHNvZnR3YXJlLCBzbyB5b3UgbmVlZCB0bworICogYmUgYSBsaXR0bGUgY2FyZWZ1bCBhYm91dCBuYW1lc3BhY2UgcG9sbHV0aW9uIGV0Yy4gIEFsc28sIHdlIGNhbm5vdAorICogYXNzdW1lIEdDQyBpcyBiZWluZyB1c2VkLgorICovCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlfX2tlcm5lbF9pbm9fdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX21vZGVfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlfX2tlcm5lbF9ubGlua190OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF9vZmZfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9waWRfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9pcGNfcGlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlfX2tlcm5lbF91aWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX2dpZF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nCV9fa2VybmVsX3NpemVfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfc3NpemVfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfcHRyZGlmZl90OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF90aW1lX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX3N1c2Vjb25kc190OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF9jbG9ja190OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX3RpbWVyX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfY2xvY2tpZF90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX2RhZGRyX3Q7Cit0eXBlZGVmIGNoYXIgKgkJX19rZXJuZWxfY2FkZHJfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfdWlkMTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfZ2lkMTZfdDsKKworI2lmZGVmIF9fR05VQ19fCit0eXBlZGVmIGxvbmcgbG9uZwlfX2tlcm5lbF9sb2ZmX3Q7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludAl2YWxbMl07Cit9IF9fa2VybmVsX2ZzaWRfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBfX2tlcm5lbF9vbGRfdWlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IF9fa2VybmVsX29sZF9naWRfdDsKK3R5cGVkZWYgX19rZXJuZWxfdWlkX3QgX19rZXJuZWxfdWlkMzJfdDsKK3R5cGVkZWYgX19rZXJuZWxfZ2lkX3QgX19rZXJuZWxfZ2lkMzJfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nCV9fa2VybmVsX29sZF9kZXZfdDsKKworCisjZW5kaWYgLyogX0FTTV9YODZfUE9TSVhfVFlQRVNfNjRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wcmN0bC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wcmN0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYzUwMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3ByY3RsLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9BU01fWDg2X1BSQ1RMX0gKKyNkZWZpbmUgX0FTTV9YODZfUFJDVExfSAorCisjZGVmaW5lIEFSQ0hfU0VUX0dTIDB4MTAwMQorI2RlZmluZSBBUkNIX1NFVF9GUyAweDEwMDIKKyNkZWZpbmUgQVJDSF9HRVRfRlMgMHgxMDAzCisjZGVmaW5lIEFSQ0hfR0VUX0dTIDB4MTAwNAorCisjZW5kaWYgLyogX0FTTV9YODZfUFJDVExfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wcm9jZXNzb3ItZmxhZ3MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vcHJvY2Vzc29yLWZsYWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJlMTM5YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vcHJvY2Vzc29yLWZsYWdzLmgKQEAgLTAsMCArMSw5NSBAQAorI2lmbmRlZiBfQVNNX1g4Nl9QUk9DRVNTT1JfRkxBR1NfSAorI2RlZmluZSBfQVNNX1g4Nl9QUk9DRVNTT1JfRkxBR1NfSAorLyogVmFyaW91cyBmbGFncyBkZWZpbmVkOiBjYW4gYmUgaW5jbHVkZWQgZnJvbSBhc3NlbWJsZXIuICovCisKKy8qCisgKiBFRkxBR1MgYml0cworICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfQ0YJMHgwMDAwMDAwMSAvKiBDYXJyeSBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfUEYJMHgwMDAwMDAwNCAvKiBQYXJpdHkgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX0FGCTB4MDAwMDAwMTAgLyogQXV4aWxpYXJ5IGNhcnJ5IEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19aRgkweDAwMDAwMDQwIC8qIFplcm8gRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX1NGCTB4MDAwMDAwODAgLyogU2lnbiBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfVEYJMHgwMDAwMDEwMCAvKiBUcmFwIEZsYWcgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19JRgkweDAwMDAwMjAwIC8qIEludGVycnVwdCBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfREYJMHgwMDAwMDQwMCAvKiBEaXJlY3Rpb24gRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX09GCTB4MDAwMDA4MDAgLyogT3ZlcmZsb3cgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX0lPUEwJMHgwMDAwMzAwMCAvKiBJT1BMIG1hc2sgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19OVAkweDAwMDA0MDAwIC8qIE5lc3RlZCBUYXNrICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfUkYJMHgwMDAxMDAwMCAvKiBSZXN1bWUgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX1ZNCTB4MDAwMjAwMDAgLyogVmlydHVhbCBNb2RlICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfQUMJMHgwMDA0MDAwMCAvKiBBbGlnbm1lbnQgQ2hlY2sgKi8KKyNkZWZpbmUgWDg2X0VGTEFHU19WSUYJMHgwMDA4MDAwMCAvKiBWaXJ0dWFsIEludGVycnVwdCBGbGFnICovCisjZGVmaW5lIFg4Nl9FRkxBR1NfVklQCTB4MDAxMDAwMDAgLyogVmlydHVhbCBJbnRlcnJ1cHQgUGVuZGluZyAqLworI2RlZmluZSBYODZfRUZMQUdTX0lECTB4MDAyMDAwMDAgLyogQ1BVSUQgZGV0ZWN0aW9uIGZsYWcgKi8KKworLyoKKyAqIEJhc2ljIENQVSBjb250cm9sIGluIENSMAorICovCisjZGVmaW5lIFg4Nl9DUjBfUEUJMHgwMDAwMDAwMSAvKiBQcm90ZWN0aW9uIEVuYWJsZSAqLworI2RlZmluZSBYODZfQ1IwX01QCTB4MDAwMDAwMDIgLyogTW9uaXRvciBDb3Byb2Nlc3NvciAqLworI2RlZmluZSBYODZfQ1IwX0VNCTB4MDAwMDAwMDQgLyogRW11bGF0aW9uICovCisjZGVmaW5lIFg4Nl9DUjBfVFMJMHgwMDAwMDAwOCAvKiBUYXNrIFN3aXRjaGVkICovCisjZGVmaW5lIFg4Nl9DUjBfRVQJMHgwMDAwMDAxMCAvKiBFeHRlbnNpb24gVHlwZSAqLworI2RlZmluZSBYODZfQ1IwX05FCTB4MDAwMDAwMjAgLyogTnVtZXJpYyBFcnJvciAqLworI2RlZmluZSBYODZfQ1IwX1dQCTB4MDAwMTAwMDAgLyogV3JpdGUgUHJvdGVjdCAqLworI2RlZmluZSBYODZfQ1IwX0FNCTB4MDAwNDAwMDAgLyogQWxpZ25tZW50IE1hc2sgKi8KKyNkZWZpbmUgWDg2X0NSMF9OVwkweDIwMDAwMDAwIC8qIE5vdCBXcml0ZS10aHJvdWdoICovCisjZGVmaW5lIFg4Nl9DUjBfQ0QJMHg0MDAwMDAwMCAvKiBDYWNoZSBEaXNhYmxlICovCisjZGVmaW5lIFg4Nl9DUjBfUEcJMHg4MDAwMDAwMCAvKiBQYWdpbmcgKi8KKworLyoKKyAqIFBhZ2luZyBvcHRpb25zIGluIENSMworICovCisjZGVmaW5lIFg4Nl9DUjNfUFdUCTB4MDAwMDAwMDggLyogUGFnZSBXcml0ZSBUaHJvdWdoICovCisjZGVmaW5lIFg4Nl9DUjNfUENECTB4MDAwMDAwMTAgLyogUGFnZSBDYWNoZSBEaXNhYmxlICovCisKKy8qCisgKiBJbnRlbCBDUFUgZmVhdHVyZXMgaW4gQ1I0CisgKi8KKyNkZWZpbmUgWDg2X0NSNF9WTUUJMHgwMDAwMDAwMSAvKiBlbmFibGUgdm04NiBleHRlbnNpb25zICovCisjZGVmaW5lIFg4Nl9DUjRfUFZJCTB4MDAwMDAwMDIgLyogdmlydHVhbCBpbnRlcnJ1cHRzIGZsYWcgZW5hYmxlICovCisjZGVmaW5lIFg4Nl9DUjRfVFNECTB4MDAwMDAwMDQgLyogZGlzYWJsZSB0aW1lIHN0YW1wIGF0IGlwbCAzICovCisjZGVmaW5lIFg4Nl9DUjRfREUJMHgwMDAwMDAwOCAvKiBlbmFibGUgZGVidWdnaW5nIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0NSNF9QU0UJMHgwMDAwMDAxMCAvKiBlbmFibGUgcGFnZSBzaXplIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0NSNF9QQUUJMHgwMDAwMDAyMCAvKiBlbmFibGUgcGh5c2ljYWwgYWRkcmVzcyBleHRlbnNpb25zICovCisjZGVmaW5lIFg4Nl9DUjRfTUNFCTB4MDAwMDAwNDAgLyogTWFjaGluZSBjaGVjayBlbmFibGUgKi8KKyNkZWZpbmUgWDg2X0NSNF9QR0UJMHgwMDAwMDA4MCAvKiBlbmFibGUgZ2xvYmFsIHBhZ2VzICovCisjZGVmaW5lIFg4Nl9DUjRfUENFCTB4MDAwMDAxMDAgLyogZW5hYmxlIHBlcmZvcm1hbmNlIGNvdW50ZXJzIGF0IGlwbCAzICovCisjZGVmaW5lIFg4Nl9DUjRfT1NGWFNSCTB4MDAwMDAyMDAgLyogZW5hYmxlIGZhc3QgRlBVIHNhdmUgYW5kIHJlc3RvcmUgKi8KKyNkZWZpbmUgWDg2X0NSNF9PU1hNTUVYQ1BUIDB4MDAwMDA0MDAgLyogZW5hYmxlIHVubWFza2VkIFNTRSBleGNlcHRpb25zICovCisjZGVmaW5lIFg4Nl9DUjRfVk1YRQkweDAwMDAyMDAwIC8qIGVuYWJsZSBWTVggdmlydHVhbGl6YXRpb24gKi8KKyNkZWZpbmUgWDg2X0NSNF9SRFdSR1NGUyAweDAwMDEwMDAwIC8qIGVuYWJsZSBSRFdSR1NGUyBzdXBwb3J0ICovCisjZGVmaW5lIFg4Nl9DUjRfT1NYU0FWRSAweDAwMDQwMDAwIC8qIGVuYWJsZSB4c2F2ZSBhbmQgeHJlc3RvcmUgKi8KKyNkZWZpbmUgWDg2X0NSNF9TTUVQCTB4MDAxMDAwMDAgLyogZW5hYmxlIFNNRVAgc3VwcG9ydCAqLworCisvKgorICogeDg2LTY0IFRhc2sgUHJpb3JpdHkgUmVnaXN0ZXIsIENSOAorICovCisjZGVmaW5lIFg4Nl9DUjhfVFBSCTB4MDAwMDAwMEYgLyogdGFzayBwcmlvcml0eSByZWdpc3RlciAqLworCisvKgorICogQU1EIGFuZCBUcmFuc21ldGEgdXNlIE1TUnMgZm9yIGNvbmZpZ3VyYXRpb247IHNlZSA8YXNtL21zci1pbmRleC5oPgorICovCisKKy8qCisgKiAgICAgIE5TQy9DeXJpeCBDUFUgY29uZmlndXJhdGlvbiByZWdpc3RlciBpbmRleGVzCisgKi8KKyNkZWZpbmUgQ1g4Nl9QQ1IwCTB4MjAKKyNkZWZpbmUgQ1g4Nl9HQ1IJMHhiOAorI2RlZmluZSBDWDg2X0NDUjAJMHhjMAorI2RlZmluZSBDWDg2X0NDUjEJMHhjMQorI2RlZmluZSBDWDg2X0NDUjIJMHhjMgorI2RlZmluZSBDWDg2X0NDUjMJMHhjMworI2RlZmluZSBDWDg2X0NDUjQJMHhlOAorI2RlZmluZSBDWDg2X0NDUjUJMHhlOQorI2RlZmluZSBDWDg2X0NDUjYJMHhlYQorI2RlZmluZSBDWDg2X0NDUjcJMHhlYgorI2RlZmluZSBDWDg2X1BDUjEJMHhmMAorI2RlZmluZSBDWDg2X0RJUjAJMHhmZQorI2RlZmluZSBDWDg2X0RJUjEJMHhmZgorI2RlZmluZSBDWDg2X0FSUl9CQVNFCTB4YzQKKyNkZWZpbmUgQ1g4Nl9SQ1JfQkFTRQkweGRjCisKKworI2VuZGlmIC8qIF9BU01fWDg2X1BST0NFU1NPUl9GTEFHU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3B0cmFjZS1hYmkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vcHRyYWNlLWFiaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMGE1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3B0cmFjZS1hYmkuaApAQCAtMCwwICsxLDg3IEBACisjaWZuZGVmIF9BU01fWDg2X1BUUkFDRV9BQklfSAorI2RlZmluZSBfQVNNX1g4Nl9QVFJBQ0VfQUJJX0gKKworI2lmZGVmIF9faTM4Nl9fCisKKyNkZWZpbmUgRUJYIDAKKyNkZWZpbmUgRUNYIDEKKyNkZWZpbmUgRURYIDIKKyNkZWZpbmUgRVNJIDMKKyNkZWZpbmUgRURJIDQKKyNkZWZpbmUgRUJQIDUKKyNkZWZpbmUgRUFYIDYKKyNkZWZpbmUgRFMgNworI2RlZmluZSBFUyA4CisjZGVmaW5lIEZTIDkKKyNkZWZpbmUgR1MgMTAKKyNkZWZpbmUgT1JJR19FQVggMTEKKyNkZWZpbmUgRUlQIDEyCisjZGVmaW5lIENTICAxMworI2RlZmluZSBFRkwgMTQKKyNkZWZpbmUgVUVTUCAxNQorI2RlZmluZSBTUyAgIDE2CisjZGVmaW5lIEZSQU1FX1NJWkUgMTcKKworI2Vsc2UgLyogX19pMzg2X18gKi8KKworI2lmIGRlZmluZWQoX19BU1NFTUJMWV9fKSB8fCBkZWZpbmVkKF9fRlJBTUVfT0ZGU0VUUykKKyNkZWZpbmUgUjE1IDAKKyNkZWZpbmUgUjE0IDgKKyNkZWZpbmUgUjEzIDE2CisjZGVmaW5lIFIxMiAyNAorI2RlZmluZSBSQlAgMzIKKyNkZWZpbmUgUkJYIDQwCisvKiBhcmd1bWVudHM6IGludGVycnVwdHMvbm9uIHRyYWNpbmcgc3lzY2FsbHMgb25seSBzYXZlIHVwIHRvIGhlcmUqLworI2RlZmluZSBSMTEgNDgKKyNkZWZpbmUgUjEwIDU2CisjZGVmaW5lIFI5IDY0CisjZGVmaW5lIFI4IDcyCisjZGVmaW5lIFJBWCA4MAorI2RlZmluZSBSQ1ggODgKKyNkZWZpbmUgUkRYIDk2CisjZGVmaW5lIFJTSSAxMDQKKyNkZWZpbmUgUkRJIDExMgorI2RlZmluZSBPUklHX1JBWCAxMjAgICAgICAgLyogPSBFUlJPUiAqLworLyogZW5kIG9mIGFyZ3VtZW50cyAqLworLyogY3B1IGV4Y2VwdGlvbiBmcmFtZSBvciB1bmRlZmluZWQgaW4gY2FzZSBvZiBmYXN0IHN5c2NhbGwuICovCisjZGVmaW5lIFJJUCAxMjgKKyNkZWZpbmUgQ1MgMTM2CisjZGVmaW5lIEVGTEFHUyAxNDQKKyNkZWZpbmUgUlNQIDE1MgorI2RlZmluZSBTUyAxNjAKKyNkZWZpbmUgQVJHT0ZGU0VUIFIxMQorI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisvKiB0b3Agb2Ygc3RhY2sgcGFnZSAqLworI2RlZmluZSBGUkFNRV9TSVpFIDE2OAorCisjZW5kaWYgLyogIV9faTM4Nl9fICovCisKKy8qIEFyYml0cmFyaWx5IGNob29zZSB0aGUgc2FtZSBwdHJhY2UgbnVtYmVycyBhcyB1c2VkIGJ5IHRoZSBTcGFyYyBjb2RlLiAqLworI2RlZmluZSBQVFJBQ0VfR0VUUkVHUyAgICAgICAgICAgIDEyCisjZGVmaW5lIFBUUkFDRV9TRVRSRUdTICAgICAgICAgICAgMTMKKyNkZWZpbmUgUFRSQUNFX0dFVEZQUkVHUyAgICAgICAgICAxNAorI2RlZmluZSBQVFJBQ0VfU0VURlBSRUdTICAgICAgICAgIDE1CisjZGVmaW5lIFBUUkFDRV9HRVRGUFhSRUdTICAgICAgICAgMTgKKyNkZWZpbmUgUFRSQUNFX1NFVEZQWFJFR1MgICAgICAgICAxOQorCisjZGVmaW5lIFBUUkFDRV9PTERTRVRPUFRJT05TICAgICAgMjEKKworLyogb25seSB1c2VmdWwgZm9yIGFjY2VzcyAzMmJpdCBwcm9ncmFtcyAvIGtlcm5lbHMgKi8KKyNkZWZpbmUgUFRSQUNFX0dFVF9USFJFQURfQVJFQSAgICAyNQorI2RlZmluZSBQVFJBQ0VfU0VUX1RIUkVBRF9BUkVBICAgIDI2CisKKyNpZmRlZiBfX3g4Nl82NF9fCisjIGRlZmluZSBQVFJBQ0VfQVJDSF9QUkNUTAkgIDMwCisjZW5kaWYKKworI2RlZmluZSBQVFJBQ0VfU1lTRU1VCQkgIDMxCisjZGVmaW5lIFBUUkFDRV9TWVNFTVVfU0lOR0xFU1RFUCAgMzIKKworI2RlZmluZSBQVFJBQ0VfU0lOR0xFQkxPQ0sJMzMJLyogcmVzdW1lIGV4ZWN1dGlvbiB1bnRpbCBuZXh0IGJyYW5jaCAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjZW5kaWYKKworI2VuZGlmIC8qIF9BU01fWDg2X1BUUkFDRV9BQklfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9wdHJhY2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vcHRyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjMThlOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vcHRyYWNlLmgKQEAgLTAsMCArMSw3NCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9QVFJBQ0VfSAorI2RlZmluZSBfQVNNX1g4Nl9QVFJBQ0VfSAorCisJLyogRm9yICovCisjaW5jbHVkZSA8YXNtL3B0cmFjZS1hYmkuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLWZsYWdzLmg+CisKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2lmZGVmIF9faTM4Nl9fCisvKiB0aGlzIHN0cnVjdCBkZWZpbmVzIHRoZSB3YXkgdGhlIHJlZ2lzdGVycyBhcmUgc3RvcmVkIG9uIHRoZQorICAgc3RhY2sgZHVyaW5nIGEgc3lzdGVtIGNhbGwuICovCisKKworc3RydWN0IHB0X3JlZ3MgeworCWxvbmcgZWJ4OworCWxvbmcgZWN4OworCWxvbmcgZWR4OworCWxvbmcgZXNpOworCWxvbmcgZWRpOworCWxvbmcgZWJwOworCWxvbmcgZWF4OworCWludCAgeGRzOworCWludCAgeGVzOworCWludCAgeGZzOworCWludCAgeGdzOworCWxvbmcgb3JpZ19lYXg7CisJbG9uZyBlaXA7CisJaW50ICB4Y3M7CisJbG9uZyBlZmxhZ3M7CisJbG9uZyBlc3A7CisJaW50ICB4c3M7Cit9OworCisKKyNlbHNlIC8qIF9faTM4Nl9fICovCisKKworc3RydWN0IHB0X3JlZ3MgeworCXVuc2lnbmVkIGxvbmcgcjE1OworCXVuc2lnbmVkIGxvbmcgcjE0OworCXVuc2lnbmVkIGxvbmcgcjEzOworCXVuc2lnbmVkIGxvbmcgcjEyOworCXVuc2lnbmVkIGxvbmcgcmJwOworCXVuc2lnbmVkIGxvbmcgcmJ4OworLyogYXJndW1lbnRzOiBub24gaW50ZXJydXB0cy9ub24gdHJhY2luZyBzeXNjYWxscyBvbmx5IHNhdmUgdXAgdG8gaGVyZSovCisJdW5zaWduZWQgbG9uZyByMTE7CisJdW5zaWduZWQgbG9uZyByMTA7CisJdW5zaWduZWQgbG9uZyByOTsKKwl1bnNpZ25lZCBsb25nIHI4OworCXVuc2lnbmVkIGxvbmcgcmF4OworCXVuc2lnbmVkIGxvbmcgcmN4OworCXVuc2lnbmVkIGxvbmcgcmR4OworCXVuc2lnbmVkIGxvbmcgcnNpOworCXVuc2lnbmVkIGxvbmcgcmRpOworCXVuc2lnbmVkIGxvbmcgb3JpZ19yYXg7CisvKiBlbmQgb2YgYXJndW1lbnRzICovCisvKiBjcHUgZXhjZXB0aW9uIGZyYW1lIG9yIHVuZGVmaW5lZCAqLworCXVuc2lnbmVkIGxvbmcgcmlwOworCXVuc2lnbmVkIGxvbmcgY3M7CisJdW5zaWduZWQgbG9uZyBlZmxhZ3M7CisJdW5zaWduZWQgbG9uZyByc3A7CisJdW5zaWduZWQgbG9uZyBzczsKKy8qIHRvcCBvZiBzdGFjayBwYWdlICovCit9OworCisjZW5kaWYgLyogIV9faTM4Nl9fICovCisKKworCisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYgLyogX0FTTV9YODZfUFRSQUNFX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vcmVzb3VyY2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vcmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGJjNGRiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9yZXNvdXJjZS5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9yZXNvdXJjZS5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zZW1idWYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc2VtYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1MGM4MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc2VtYnVmLmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9TRU1CVUZfSAorI2RlZmluZSBfQVNNX1g4Nl9TRU1CVUZfSAorCisvKgorICogVGhlIHNlbWlkNjRfZHMgc3RydWN0dXJlIGZvciB4ODYgYXJjaGl0ZWN0dXJlLgorICogTm90ZSBleHRyYSBwYWRkaW5nIGJlY2F1c2UgdGhpcyBzdHJ1Y3R1cmUgaXMgcGFzc2VkIGJhY2sgYW5kIGZvcnRoCisgKiBiZXR3ZWVuIGtlcm5lbCBhbmQgdXNlciBzcGFjZS4KKyAqCisgKiBQYWQgc3BhY2UgaXMgbGVmdCBmb3I6CisgKiAtIDY0LWJpdCB0aW1lX3QgdG8gc29sdmUgeTIwMzggcHJvYmxlbQorICogLSAyIG1pc2NlbGxhbmVvdXMgMzItYml0IHZhbHVlcworICovCitzdHJ1Y3Qgc2VtaWQ2NF9kcyB7CisJc3RydWN0IGlwYzY0X3Blcm0gc2VtX3Blcm07CS8qIHBlcm1pc3Npb25zIC4uIHNlZSBpcGMuaCAqLworCV9fa2VybmVsX3RpbWVfdAlzZW1fb3RpbWU7CS8qIGxhc3Qgc2Vtb3AgdGltZSAqLworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQxOworCV9fa2VybmVsX3RpbWVfdAlzZW1fY3RpbWU7CS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkMjsKKwl1bnNpZ25lZCBsb25nCXNlbV9uc2VtczsJLyogbm8uIG9mIHNlbWFwaG9yZXMgaW4gYXJyYXkgKi8KKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkMzsKKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkNDsKK307CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9TRU1CVUZfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zZXR1cC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zZXR1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YWVmNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3NldHVwLmgKQEAgLTAsMCArMSw1IEBACisjaWZuZGVmIF9BU01fWDg2X1NFVFVQX0gKKyNkZWZpbmUgX0FTTV9YODZfU0VUVVBfSAorCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9TRVRVUF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3NobWJ1Zi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zaG1idWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2MwNWZjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zaG1idWYuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2htYnVmLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3NpZ2NvbnRleHQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc2lnY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOGM4Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3NpZ2NvbnRleHQuaApAQCAtMCwwICsxLDIxNCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9TSUdDT05URVhUX0gKKyNkZWZpbmUgX0FTTV9YODZfU0lHQ09OVEVYVF9ICisKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgRlBfWFNUQVRFX01BR0lDMQkweDQ2NTA1ODUzVQorI2RlZmluZSBGUF9YU1RBVEVfTUFHSUMyCTB4NDY1MDU4NDVVCisjZGVmaW5lIEZQX1hTVEFURV9NQUdJQzJfU0laRQlzaXplb2YoRlBfWFNUQVRFX01BR0lDMikKKworLyoKKyAqIGJ5dGVzIDQ2NC4uNTExIGluIHRoZSBjdXJyZW50IDUxMmJ5dGUgbGF5b3V0IG9mIGZ4c2F2ZS9meHJzdG9yIGZyYW1lCisgKiBhcmUgcmVzZXJ2ZWQgZm9yIFNXIHVzYWdlLiBPbiBjcHUncyBzdXBwb3J0aW5nIHhzYXZlL3hyc3RvciwgdGhlc2UgYnl0ZXMKKyAqIGFyZSB1c2VkIHRvIGV4dGVuZGVkIHRoZSBmcHN0YXRlIHBvaW50ZXIgaW4gdGhlIHNpZ2NvbnRleHQsIHdoaWNoIG5vdworICogaW5jbHVkZXMgdGhlIGV4dGVuZGVkIHN0YXRlIGluZm9ybWF0aW9uIGFsb25nIHdpdGggZnBzdGF0ZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBQcmVzZW5jZSBvZiBGUF9YU1RBVEVfTUFHSUMxIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBTVyByZXNlcnZlZAorICogYXJlYSBhbmQgRlBfWFNUQVRFX01BR0lDMiBhdCB0aGUgZW5kIG9mIG1lbW9yeSBsYXlvdXQKKyAqIChleHRlbmRlZF9zaXplIC0gRlBfWFNUQVRFX01BR0lDMl9TSVpFKSBpbmRpY2F0ZXMgdGhlIHByZXNlbmNlIG9mIHRoZQorICogZXh0ZW5kZWQgc3RhdGUgaW5mb3JtYXRpb24gaW4gdGhlIG1lbW9yeSBsYXlvdXQgcG9pbnRlZCBieSB0aGUgZnBzdGF0ZQorICogcG9pbnRlciBpbiBzaWdjb250ZXh0LgorICovCitzdHJ1Y3QgX2ZweF9zd19ieXRlcyB7CisJX191MzIgbWFnaWMxOwkJLyogRlBfWFNUQVRFX01BR0lDMSAqLworCV9fdTMyIGV4dGVuZGVkX3NpemU7CS8qIHRvdGFsIHNpemUgb2YgdGhlIGxheW91dCByZWZlcnJlZCBieQorCQkJCSAqIGZwc3RhdGUgcG9pbnRlciBpbiB0aGUgc2lnY29udGV4dC4KKwkJCQkgKi8KKwlfX3U2NCB4c3RhdGVfYnY7CisJCQkJLyogZmVhdHVyZSBiaXQgbWFzayAoaW5jbHVkaW5nIGZwL3NzZS9leHRlbmRlZAorCQkJCSAqIHN0YXRlKSB0aGF0IGlzIHByZXNlbnQgaW4gdGhlIG1lbW9yeQorCQkJCSAqIGxheW91dC4KKwkJCQkgKi8KKwlfX3UzMiB4c3RhdGVfc2l6ZTsJLyogYWN0dWFsIHhzYXZlIHN0YXRlIHNpemUsIGJhc2VkIG9uIHRoZQorCQkJCSAqIGZlYXR1cmVzIHNhdmVkIGluIHRoZSBsYXlvdXQuCisJCQkJICogJ2V4dGVuZGVkX3NpemUnIHdpbGwgYmUgZ3JlYXRlciB0aGFuCisJCQkJICogJ3hzdGF0ZV9zaXplJy4KKwkJCQkgKi8KKwlfX3UzMiBwYWRkaW5nWzddOwkvKiAgZm9yIGZ1dHVyZSB1c2UuICovCit9OworCisjaWZkZWYgX19pMzg2X18KKy8qCisgKiBBcyBkb2N1bWVudGVkIGluIHRoZSBpQkNTMiBzdGFuZGFyZC4uCisgKgorICogVGhlIGZpcnN0IHBhcnQgb2YgInN0cnVjdCBfZnBzdGF0ZSIgaXMganVzdCB0aGUgbm9ybWFsIGkzODcKKyAqIGhhcmR3YXJlIHNldHVwLCB0aGUgZXh0cmEgInN0YXR1cyIgd29yZCBpcyB1c2VkIHRvIHNhdmUgdGhlCisgKiBjb3Byb2Nlc3NvciBzdGF0dXMgd29yZCBiZWZvcmUgZW50ZXJpbmcgdGhlIGhhbmRsZXIuCisgKgorICogUGVudGl1bSBJSUkgRlhTUiwgU1NFIHN1cHBvcnQKKyAqCUdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4sIE1heSAyMDAwCisgKgorICogVGhlIEZQVSBzdGF0ZSBkYXRhIHN0cnVjdHVyZSBoYXMgaGFkIHRvIGdyb3cgdG8gYWNjb21tb2RhdGUgdGhlCisgKiBleHRlbmRlZCBGUFUgc3RhdGUgcmVxdWlyZWQgYnkgdGhlIFN0cmVhbWluZyBTSU1EIEV4dGVuc2lvbnMuCisgKiBUaGVyZSBpcyBubyBkb2N1bWVudGVkIHN0YW5kYXJkIHRvIGFjY29tcGxpc2ggdGhpcyBhdCB0aGUgbW9tZW50LgorICovCitzdHJ1Y3QgX2ZwcmVnIHsKKwl1bnNpZ25lZCBzaG9ydCBzaWduaWZpY2FuZFs0XTsKKwl1bnNpZ25lZCBzaG9ydCBleHBvbmVudDsKK307CisKK3N0cnVjdCBfZnB4cmVnIHsKKwl1bnNpZ25lZCBzaG9ydCBzaWduaWZpY2FuZFs0XTsKKwl1bnNpZ25lZCBzaG9ydCBleHBvbmVudDsKKwl1bnNpZ25lZCBzaG9ydCBwYWRkaW5nWzNdOworfTsKKworc3RydWN0IF94bW1yZWcgeworCXVuc2lnbmVkIGxvbmcgZWxlbWVudFs0XTsKK307CisKK3N0cnVjdCBfZnBzdGF0ZSB7CisJLyogUmVndWxhciBGUFUgZW52aXJvbm1lbnQgKi8KKwl1bnNpZ25lZCBsb25nCWN3OworCXVuc2lnbmVkIGxvbmcJc3c7CisJdW5zaWduZWQgbG9uZwl0YWc7CisJdW5zaWduZWQgbG9uZwlpcG9mZjsKKwl1bnNpZ25lZCBsb25nCWNzc2VsOworCXVuc2lnbmVkIGxvbmcJZGF0YW9mZjsKKwl1bnNpZ25lZCBsb25nCWRhdGFzZWw7CisJc3RydWN0IF9mcHJlZwlfc3RbOF07CisJdW5zaWduZWQgc2hvcnQJc3RhdHVzOworCXVuc2lnbmVkIHNob3J0CW1hZ2ljOwkJLyogMHhmZmZmID0gcmVndWxhciBGUFUgZGF0YSBvbmx5ICovCisKKwkvKiBGWFNSIEZQVSBlbnZpcm9ubWVudCAqLworCXVuc2lnbmVkIGxvbmcJX2Z4c3JfZW52WzZdOwkvKiBGWFNSIEZQVSBlbnYgaXMgaWdub3JlZCAqLworCXVuc2lnbmVkIGxvbmcJbXhjc3I7CisJdW5zaWduZWQgbG9uZwlyZXNlcnZlZDsKKwlzdHJ1Y3QgX2ZweHJlZwlfZnhzcl9zdFs4XTsJLyogRlhTUiBGUFUgcmVnIGRhdGEgaXMgaWdub3JlZCAqLworCXN0cnVjdCBfeG1tcmVnCV94bW1bOF07CisJdW5zaWduZWQgbG9uZwlwYWRkaW5nMVs0NF07CisKKwl1bmlvbiB7CisJCXVuc2lnbmVkIGxvbmcJcGFkZGluZzJbMTJdOworCQlzdHJ1Y3QgX2ZweF9zd19ieXRlcyBzd19yZXNlcnZlZDsgLyogcmVwcmVzZW50cyB0aGUgZXh0ZW5kZWQKKwkJCQkJCSAgICogc3RhdGUgaW5mbyAqLworCX07Cit9OworCisjZGVmaW5lIFg4Nl9GWFNSX01BR0lDCQkweDAwMDAKKworLyoKKyAqIFVzZXItc3BhY2UgbWlnaHQgc3RpbGwgcmVseSBvbiB0aGUgb2xkIGRlZmluaXRpb246CisgKi8KK3N0cnVjdCBzaWdjb250ZXh0IHsKKwl1bnNpZ25lZCBzaG9ydCBncywgX19nc2g7CisJdW5zaWduZWQgc2hvcnQgZnMsIF9fZnNoOworCXVuc2lnbmVkIHNob3J0IGVzLCBfX2VzaDsKKwl1bnNpZ25lZCBzaG9ydCBkcywgX19kc2g7CisJdW5zaWduZWQgbG9uZyBlZGk7CisJdW5zaWduZWQgbG9uZyBlc2k7CisJdW5zaWduZWQgbG9uZyBlYnA7CisJdW5zaWduZWQgbG9uZyBlc3A7CisJdW5zaWduZWQgbG9uZyBlYng7CisJdW5zaWduZWQgbG9uZyBlZHg7CisJdW5zaWduZWQgbG9uZyBlY3g7CisJdW5zaWduZWQgbG9uZyBlYXg7CisJdW5zaWduZWQgbG9uZyB0cmFwbm87CisJdW5zaWduZWQgbG9uZyBlcnI7CisJdW5zaWduZWQgbG9uZyBlaXA7CisJdW5zaWduZWQgc2hvcnQgY3MsIF9fY3NoOworCXVuc2lnbmVkIGxvbmcgZWZsYWdzOworCXVuc2lnbmVkIGxvbmcgZXNwX2F0X3NpZ25hbDsKKwl1bnNpZ25lZCBzaG9ydCBzcywgX19zc2g7CisJc3RydWN0IF9mcHN0YXRlICpmcHN0YXRlOworCXVuc2lnbmVkIGxvbmcgb2xkbWFzazsKKwl1bnNpZ25lZCBsb25nIGNyMjsKK307CisKKyNlbHNlIC8qIF9faTM4Nl9fICovCisKKy8qIEZYU0FWRSBmcmFtZSAqLworLyogTm90ZTogcmVzZXJ2ZWQxLzIgbWF5IHNvbWVkYXkgY29udGFpbiB2YWx1YWJsZSBkYXRhLiBBbHdheXMgc2F2ZS9yZXN0b3JlCisgICB0aGVtIHdoZW4geW91IGNoYW5nZSBzaWduYWwgZnJhbWVzLiAqLworc3RydWN0IF9mcHN0YXRlIHsKKwlfX3UxNgljd2Q7CisJX191MTYJc3dkOworCV9fdTE2CXR3ZDsJCS8qIE5vdGUgdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlCisJCQkJICAgMzJiaXQveDg3L0ZTQVZFIHR3ZCAqLworCV9fdTE2CWZvcDsKKwlfX3U2NAlyaXA7CisJX191NjQJcmRwOworCV9fdTMyCW14Y3NyOworCV9fdTMyCW14Y3NyX21hc2s7CisJX191MzIJc3Rfc3BhY2VbMzJdOwkvKiA4KjE2IGJ5dGVzIGZvciBlYWNoIEZQLXJlZyAqLworCV9fdTMyCXhtbV9zcGFjZVs2NF07CS8qIDE2KjE2IGJ5dGVzIGZvciBlYWNoIFhNTS1yZWcgICovCisJX191MzIJcmVzZXJ2ZWQyWzEyXTsKKwl1bmlvbiB7CisJCV9fdTMyCXJlc2VydmVkM1sxMl07CisJCXN0cnVjdCBfZnB4X3N3X2J5dGVzIHN3X3Jlc2VydmVkOyAvKiByZXByZXNlbnRzIHRoZSBleHRlbmRlZAorCQkJCQkJICAgKiBzdGF0ZSBpbmZvcm1hdGlvbiAqLworCX07Cit9OworCisvKgorICogVXNlci1zcGFjZSBtaWdodCBzdGlsbCByZWx5IG9uIHRoZSBvbGQgZGVmaW5pdGlvbjoKKyAqLworc3RydWN0IHNpZ2NvbnRleHQgeworCXVuc2lnbmVkIGxvbmcgcjg7CisJdW5zaWduZWQgbG9uZyByOTsKKwl1bnNpZ25lZCBsb25nIHIxMDsKKwl1bnNpZ25lZCBsb25nIHIxMTsKKwl1bnNpZ25lZCBsb25nIHIxMjsKKwl1bnNpZ25lZCBsb25nIHIxMzsKKwl1bnNpZ25lZCBsb25nIHIxNDsKKwl1bnNpZ25lZCBsb25nIHIxNTsKKwl1bnNpZ25lZCBsb25nIHJkaTsKKwl1bnNpZ25lZCBsb25nIHJzaTsKKwl1bnNpZ25lZCBsb25nIHJicDsKKwl1bnNpZ25lZCBsb25nIHJieDsKKwl1bnNpZ25lZCBsb25nIHJkeDsKKwl1bnNpZ25lZCBsb25nIHJheDsKKwl1bnNpZ25lZCBsb25nIHJjeDsKKwl1bnNpZ25lZCBsb25nIHJzcDsKKwl1bnNpZ25lZCBsb25nIHJpcDsKKwl1bnNpZ25lZCBsb25nIGVmbGFnczsJCS8qIFJGTEFHUyAqLworCXVuc2lnbmVkIHNob3J0IGNzOworCXVuc2lnbmVkIHNob3J0IGdzOworCXVuc2lnbmVkIHNob3J0IGZzOworCXVuc2lnbmVkIHNob3J0IF9fcGFkMDsKKwl1bnNpZ25lZCBsb25nIGVycjsKKwl1bnNpZ25lZCBsb25nIHRyYXBubzsKKwl1bnNpZ25lZCBsb25nIG9sZG1hc2s7CisJdW5zaWduZWQgbG9uZyBjcjI7CisJc3RydWN0IF9mcHN0YXRlICpmcHN0YXRlOwkvKiB6ZXJvIHdoZW4gbm8gRlBVIGNvbnRleHQgKi8KKwl1bnNpZ25lZCBsb25nIHJlc2VydmVkMVs4XTsKK307CisKKyNlbmRpZiAvKiAhX19pMzg2X18gKi8KKworc3RydWN0IF94c2F2ZV9oZHIgeworCV9fdTY0IHhzdGF0ZV9idjsKKwlfX3U2NCByZXNlcnZlZDFbMl07CisJX191NjQgcmVzZXJ2ZWQyWzVdOworfTsKKworc3RydWN0IF95bW1oX3N0YXRlIHsKKwkvKiAxNiAqIDE2IGJ5dGVzIGZvciBlYWNoIFlNTUgtcmVnICovCisJX191MzIgeW1taF9zcGFjZVs2NF07Cit9OworCisvKgorICogRXh0ZW5kZWQgc3RhdGUgcG9pbnRlZCBieSB0aGUgZnBzdGF0ZSBwb2ludGVyIGluIHRoZSBzaWdjb250ZXh0LgorICogSW4gYWRkaXRpb24gdG8gdGhlIGZwc3RhdGUsIGluZm9ybWF0aW9uIGVuY29kZWQgaW4gdGhlIHhzdGF0ZV9oZHIKKyAqIGluZGljYXRlcyB0aGUgcHJlc2VuY2Ugb2Ygb3RoZXIgZXh0ZW5kZWQgc3RhdGUgaW5mb3JtYXRpb24KKyAqIHN1cHBvcnRlZCBieSB0aGUgcHJvY2Vzc29yIGFuZCBPUy4KKyAqLworc3RydWN0IF94c3RhdGUgeworCXN0cnVjdCBfZnBzdGF0ZSBmcHN0YXRlOworCXN0cnVjdCBfeHNhdmVfaGRyIHhzdGF0ZV9oZHI7CisJc3RydWN0IF95bW1oX3N0YXRlIHltbWg7CisJLyogbmV3IHByb2Nlc3NvciBzdGF0ZSBleHRlbnNpb25zIGdvIGhlcmUgKi8KK307CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9TSUdDT05URVhUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc2lnY29udGV4dDMyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3NpZ2NvbnRleHQzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMTQ3OGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3NpZ2NvbnRleHQzMi5oCkBAIC0wLDAgKzEsNzcgQEAKKyNpZm5kZWYgX0FTTV9YODZfU0lHQ09OVEVYVDMyX0gKKyNkZWZpbmUgX0FTTV9YODZfU0lHQ09OVEVYVDMyX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIHNpZ25hbCBjb250ZXh0IGZvciAzMmJpdCBwcm9ncmFtcy4gKi8KKworI2RlZmluZSBYODZfRlhTUl9NQUdJQwkJMHgwMDAwCisKK3N0cnVjdCBfZnByZWcgeworCXVuc2lnbmVkIHNob3J0IHNpZ25pZmljYW5kWzRdOworCXVuc2lnbmVkIHNob3J0IGV4cG9uZW50OworfTsKKworc3RydWN0IF9mcHhyZWcgeworCXVuc2lnbmVkIHNob3J0IHNpZ25pZmljYW5kWzRdOworCXVuc2lnbmVkIHNob3J0IGV4cG9uZW50OworCXVuc2lnbmVkIHNob3J0IHBhZGRpbmdbM107Cit9OworCitzdHJ1Y3QgX3htbXJlZyB7CisJX191MzIJZWxlbWVudFs0XTsKK307CisKKy8qIEZTQVZFIGZyYW1lIHdpdGggZXh0ZW5zaW9ucyAqLworc3RydWN0IF9mcHN0YXRlX2lhMzIgeworCS8qIFJlZ3VsYXIgRlBVIGVudmlyb25tZW50ICovCisJX191MzIgCWN3OworCV9fdTMyCXN3OworCV9fdTMyCXRhZzsJLyogbm90IGNvbXBhdGlibGUgdG8gNjRiaXQgdHdkICovCisJX191MzIJaXBvZmY7CisJX191MzIJY3NzZWw7CisJX191MzIJZGF0YW9mZjsKKwlfX3UzMglkYXRhc2VsOworCXN0cnVjdCBfZnByZWcJX3N0WzhdOworCXVuc2lnbmVkIHNob3J0CXN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydAltYWdpYzsJCS8qIDB4ZmZmZiA9IHJlZ3VsYXIgRlBVIGRhdGEgb25seSAqLworCisJLyogRlhTUiBGUFUgZW52aXJvbm1lbnQgKi8KKwlfX3UzMglfZnhzcl9lbnZbNl07CisJX191MzIJbXhjc3I7CisJX191MzIJcmVzZXJ2ZWQ7CisJc3RydWN0IF9mcHhyZWcJX2Z4c3Jfc3RbOF07CisJc3RydWN0IF94bW1yZWcJX3htbVs4XTsJLyogSXQncyBhY3R1YWxseSAxNiAqLworCV9fdTMyCXBhZGRpbmdbNDRdOworCXVuaW9uIHsKKwkJX191MzIgcGFkZGluZzJbMTJdOworCQlzdHJ1Y3QgX2ZweF9zd19ieXRlcyBzd19yZXNlcnZlZDsKKwl9OworfTsKKworc3RydWN0IHNpZ2NvbnRleHRfaWEzMiB7CisgICAgICAgdW5zaWduZWQgc2hvcnQgZ3MsIF9fZ3NoOworICAgICAgIHVuc2lnbmVkIHNob3J0IGZzLCBfX2ZzaDsKKyAgICAgICB1bnNpZ25lZCBzaG9ydCBlcywgX19lc2g7CisgICAgICAgdW5zaWduZWQgc2hvcnQgZHMsIF9fZHNoOworICAgICAgIHVuc2lnbmVkIGludCBkaTsKKyAgICAgICB1bnNpZ25lZCBpbnQgc2k7CisgICAgICAgdW5zaWduZWQgaW50IGJwOworICAgICAgIHVuc2lnbmVkIGludCBzcDsKKyAgICAgICB1bnNpZ25lZCBpbnQgYng7CisgICAgICAgdW5zaWduZWQgaW50IGR4OworICAgICAgIHVuc2lnbmVkIGludCBjeDsKKyAgICAgICB1bnNpZ25lZCBpbnQgYXg7CisgICAgICAgdW5zaWduZWQgaW50IHRyYXBubzsKKyAgICAgICB1bnNpZ25lZCBpbnQgZXJyOworICAgICAgIHVuc2lnbmVkIGludCBpcDsKKyAgICAgICB1bnNpZ25lZCBzaG9ydCBjcywgX19jc2g7CisgICAgICAgdW5zaWduZWQgaW50IGZsYWdzOworICAgICAgIHVuc2lnbmVkIGludCBzcF9hdF9zaWduYWw7CisgICAgICAgdW5zaWduZWQgc2hvcnQgc3MsIF9fc3NoOworICAgICAgIHVuc2lnbmVkIGludCBmcHN0YXRlOwkJLyogcmVhbGx5IChzdHJ1Y3QgX2Zwc3RhdGVfaWEzMiAqKSAqLworICAgICAgIHVuc2lnbmVkIGludCBvbGRtYXNrOworICAgICAgIHVuc2lnbmVkIGludCBjcjI7Cit9OworCisjZW5kaWYgLyogX0FTTV9YODZfU0lHQ09OVEVYVDMyX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc2lnaW5mby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zaWdpbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMxYWE1NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc2lnaW5mby5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX0FTTV9YODZfU0lHSU5GT19ICisjZGVmaW5lIF9BU01fWDg2X1NJR0lORk9fSAorCisjaWZkZWYgX194ODZfNjRfXworIyBkZWZpbmUgX19BUkNIX1NJX1BSRUFNQkxFX1NJWkUJKDQgKiBzaXplb2YoaW50KSkKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2lnaW5mby5oPgorCisjZW5kaWYgLyogX0FTTV9YODZfU0lHSU5GT19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3NpZ25hbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzNhMWU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zaWduYWwuaApAQCAtMCwwICsxLDE0MCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9TSUdOQUxfSAorI2RlZmluZSBfQVNNX1g4Nl9TSUdOQUxfSAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisKKy8qIEF2b2lkIHRvbyBtYW55IGhlYWRlciBvcmRlcmluZyBwcm9ibGVtcy4gICovCitzdHJ1Y3Qgc2lnaW5mbzsKKworLyogSGVyZSB3ZSBtdXN0IGNhdGVyIHRvIGxpYmNzIHRoYXQgcG9rZSBhYm91dCBpbiBrZXJuZWwgaGVhZGVycy4gICovCisKKyNkZWZpbmUgTlNJRwkJMzIKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBzaWdzZXRfdDsKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisjZGVmaW5lIFNJR0hVUAkJIDEKKyNkZWZpbmUgU0lHSU5UCQkgMgorI2RlZmluZSBTSUdRVUlUCQkgMworI2RlZmluZSBTSUdJTEwJCSA0CisjZGVmaW5lIFNJR1RSQVAJCSA1CisjZGVmaW5lIFNJR0FCUlQJCSA2CisjZGVmaW5lIFNJR0lPVAkJIDYKKyNkZWZpbmUgU0lHQlVTCQkgNworI2RlZmluZSBTSUdGUEUJCSA4CisjZGVmaW5lIFNJR0tJTEwJCSA5CisjZGVmaW5lIFNJR1VTUjEJCTEwCisjZGVmaW5lIFNJR1NFR1YJCTExCisjZGVmaW5lIFNJR1VTUjIJCTEyCisjZGVmaW5lIFNJR1BJUEUJCTEzCisjZGVmaW5lIFNJR0FMUk0JCTE0CisjZGVmaW5lIFNJR1RFUk0JCTE1CisjZGVmaW5lIFNJR1NUS0ZMVAkxNgorI2RlZmluZSBTSUdDSExECQkxNworI2RlZmluZSBTSUdDT05UCQkxOAorI2RlZmluZSBTSUdTVE9QCQkxOQorI2RlZmluZSBTSUdUU1RQCQkyMAorI2RlZmluZSBTSUdUVElOCQkyMQorI2RlZmluZSBTSUdUVE9VCQkyMgorI2RlZmluZSBTSUdVUkcJCTIzCisjZGVmaW5lIFNJR1hDUFUJCTI0CisjZGVmaW5lIFNJR1hGU1oJCTI1CisjZGVmaW5lIFNJR1ZUQUxSTQkyNgorI2RlZmluZSBTSUdQUk9GCQkyNworI2RlZmluZSBTSUdXSU5DSAkyOAorI2RlZmluZSBTSUdJTwkJMjkKKyNkZWZpbmUgU0lHUE9MTAkJU0lHSU8KKy8qCisjZGVmaW5lIFNJR0xPU1QJCTI5CisqLworI2RlZmluZSBTSUdQV1IJCTMwCisjZGVmaW5lIFNJR1NZUwkJMzEKKyNkZWZpbmUJU0lHVU5VU0VECTMxCisKKy8qIFRoZXNlIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBjb25zdGFudHMgZnJvbSB1c2VybGFuZC4gICovCisjZGVmaW5lIFNJR1JUTUlOCTMyCisjZGVmaW5lIFNJR1JUTUFYCV9OU0lHCisKKy8qCisgKiBTQV9GTEFHUyB2YWx1ZXM6CisgKgorICogU0FfT05TVEFDSyBpbmRpY2F0ZXMgdGhhdCBhIHJlZ2lzdGVyZWQgc3RhY2tfdCB3aWxsIGJlIHVzZWQuCisgKiBTQV9SRVNUQVJUIGZsYWcgdG8gZ2V0IHJlc3RhcnRpbmcgc2lnbmFscyAod2hpY2ggd2VyZSB0aGUgZGVmYXVsdCBsb25nIGFnbykKKyAqIFNBX05PQ0xEU1RPUCBmbGFnIHRvIHR1cm4gb2ZmIFNJR0NITEQgd2hlbiBjaGlsZHJlbiBzdG9wLgorICogU0FfUkVTRVRIQU5EIGNsZWFycyB0aGUgaGFuZGxlciB3aGVuIHRoZSBzaWduYWwgaXMgZGVsaXZlcmVkLgorICogU0FfTk9DTERXQUlUIGZsYWcgb24gU0lHQ0hMRCB0byBpbmhpYml0IHpvbWJpZXMuCisgKiBTQV9OT0RFRkVSIHByZXZlbnRzIHRoZSBjdXJyZW50IHNpZ25hbCBmcm9tIGJlaW5nIG1hc2tlZCBpbiB0aGUgaGFuZGxlci4KKyAqCisgKiBTQV9PTkVTSE9UIGFuZCBTQV9OT01BU0sgYXJlIHRoZSBoaXN0b3JpY2FsIExpbnV4IG5hbWVzIGZvciB0aGUgU2luZ2xlCisgKiBVbml4IG5hbWVzIFJFU0VUSEFORCBhbmQgTk9ERUZFUiByZXNwZWN0aXZlbHkuCisgKi8KKyNkZWZpbmUgU0FfTk9DTERTVE9QCTB4MDAwMDAwMDF1CisjZGVmaW5lIFNBX05PQ0xEV0FJVAkweDAwMDAwMDAydQorI2RlZmluZSBTQV9TSUdJTkZPCTB4MDAwMDAwMDR1CisjZGVmaW5lIFNBX09OU1RBQ0sJMHgwODAwMDAwMHUKKyNkZWZpbmUgU0FfUkVTVEFSVAkweDEwMDAwMDAwdQorI2RlZmluZSBTQV9OT0RFRkVSCTB4NDAwMDAwMDB1CisjZGVmaW5lIFNBX1JFU0VUSEFORAkweDgwMDAwMDAwdQorCisjZGVmaW5lIFNBX05PTUFTSwlTQV9OT0RFRkVSCisjZGVmaW5lIFNBX09ORVNIT1QJU0FfUkVTRVRIQU5ECisKKyNkZWZpbmUgU0FfUkVTVE9SRVIJMHgwNDAwMDAwMAorCisvKgorICogc2lnYWx0c3RhY2sgY29udHJvbHMKKyAqLworI2RlZmluZSBTU19PTlNUQUNLCTEKKyNkZWZpbmUgU1NfRElTQUJMRQkyCisKKyNkZWZpbmUgTUlOU0lHU1RLU1oJMjA0OAorI2RlZmluZSBTSUdTVEtTWgk4MTkyCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zaWduYWwtZGVmcy5oPgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisKKyNpZmRlZiBfX2kzODZfXworLyogSGVyZSB3ZSBtdXN0IGNhdGVyIHRvIGxpYmNzIHRoYXQgcG9rZSBhYm91dCBpbiBrZXJuZWwgaGVhZGVycy4gICovCisKK3N0cnVjdCBzaWdhY3Rpb24geworCXVuaW9uIHsKKwkgIF9fc2lnaGFuZGxlcl90IF9zYV9oYW5kbGVyOworCSAgdm9pZCAoKl9zYV9zaWdhY3Rpb24pKGludCwgc3RydWN0IHNpZ2luZm8gKiwgdm9pZCAqKTsKKwl9IF91OworCXNpZ3NldF90IHNhX21hc2s7CisJdW5zaWduZWQgbG9uZyBzYV9mbGFnczsKKwl2b2lkICgqc2FfcmVzdG9yZXIpKHZvaWQpOworfTsKKworI2RlZmluZSBzYV9oYW5kbGVyCV91Ll9zYV9oYW5kbGVyCisjZGVmaW5lIHNhX3NpZ2FjdGlvbglfdS5fc2Ffc2lnYWN0aW9uCisKKyNlbHNlIC8qIF9faTM4Nl9fICovCisKK3N0cnVjdCBzaWdhY3Rpb24geworCV9fc2lnaGFuZGxlcl90IHNhX2hhbmRsZXI7CisJdW5zaWduZWQgbG9uZyBzYV9mbGFnczsKKwlfX3NpZ3Jlc3RvcmVfdCBzYV9yZXN0b3JlcjsKKwlzaWdzZXRfdCBzYV9tYXNrOwkJLyogbWFzayBsYXN0IGZvciBleHRlbnNpYmlsaXR5ICovCit9OworCitzdHJ1Y3Qga19zaWdhY3Rpb24geworCXN0cnVjdCBzaWdhY3Rpb24gc2E7Cit9OworCisjZW5kaWYgLyogIV9faTM4Nl9fICovCisKK3R5cGVkZWYgc3RydWN0IHNpZ2FsdHN0YWNrIHsKKwl2b2lkICpzc19zcDsKKwlpbnQgc3NfZmxhZ3M7CisJc2l6ZV90IHNzX3NpemU7Cit9IHN0YWNrX3Q7CisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIF9BU01fWDg2X1NJR05BTF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3NvY2tldC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjcxMzg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zb2NrZXQuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc29ja2V0Lmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3NvY2tpb3MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc29ja2lvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZjZkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3NvY2tpb3MuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc29ja2lvcy5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zdGF0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3N0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGIxZDliCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zdGF0LmgKQEAgLTAsMCArMSwxMTQgQEAKKyNpZm5kZWYgX0FTTV9YODZfU1RBVF9ICisjZGVmaW5lIF9BU01fWDg2X1NUQVRfSAorCisjZGVmaW5lIFNUQVRfSEFWRV9OU0VDIDEKKworI2lmZGVmIF9faTM4Nl9fCitzdHJ1Y3Qgc3RhdCB7CisJdW5zaWduZWQgbG9uZyAgc3RfZGV2OworCXVuc2lnbmVkIGxvbmcgIHN0X2lubzsKKwl1bnNpZ25lZCBzaG9ydCBzdF9tb2RlOworCXVuc2lnbmVkIHNob3J0IHN0X25saW5rOworCXVuc2lnbmVkIHNob3J0IHN0X3VpZDsKKwl1bnNpZ25lZCBzaG9ydCBzdF9naWQ7CisJdW5zaWduZWQgbG9uZyAgc3RfcmRldjsKKwl1bnNpZ25lZCBsb25nICBzdF9zaXplOworCXVuc2lnbmVkIGxvbmcgIHN0X2Jsa3NpemU7CisJdW5zaWduZWQgbG9uZyAgc3RfYmxvY2tzOworCXVuc2lnbmVkIGxvbmcgIHN0X2F0aW1lOworCXVuc2lnbmVkIGxvbmcgIHN0X2F0aW1lX25zZWM7CisJdW5zaWduZWQgbG9uZyAgc3RfbXRpbWU7CisJdW5zaWduZWQgbG9uZyAgc3RfbXRpbWVfbnNlYzsKKwl1bnNpZ25lZCBsb25nICBzdF9jdGltZTsKKwl1bnNpZ25lZCBsb25nICBzdF9jdGltZV9uc2VjOworCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkNDsKKwl1bnNpZ25lZCBsb25nICBfX3VudXNlZDU7Cit9OworCisjZGVmaW5lIFNUQVQ2NF9IQVNfQlJPS0VOX1NUX0lOTwkxCisKKy8qIFRoaXMgbWF0Y2hlcyBzdHJ1Y3Qgc3RhdDY0IGluIGdsaWJjMi4xLCBoZW5jZSB0aGUgYWJzb2x1dGVseQorICogaW5zYW5lIGFtb3VudHMgb2YgcGFkZGluZyBhcm91bmQgZGV2X3Qncy4KKyAqLworc3RydWN0IHN0YXQ2NCB7CisJdW5zaWduZWQgbG9uZyBsb25nCXN0X2RldjsKKwl1bnNpZ25lZCBjaGFyCV9fcGFkMFs0XTsKKworCXVuc2lnbmVkIGxvbmcJX19zdF9pbm87CisKKwl1bnNpZ25lZCBpbnQJc3RfbW9kZTsKKwl1bnNpZ25lZCBpbnQJc3Rfbmxpbms7CisKKwl1bnNpZ25lZCBsb25nCXN0X3VpZDsKKwl1bnNpZ25lZCBsb25nCXN0X2dpZDsKKworCXVuc2lnbmVkIGxvbmcgbG9uZwlzdF9yZGV2OworCXVuc2lnbmVkIGNoYXIJX19wYWQzWzRdOworCisJbG9uZyBsb25nCXN0X3NpemU7CisJdW5zaWduZWQgbG9uZwlzdF9ibGtzaXplOworCisJLyogTnVtYmVyIDUxMi1ieXRlIGJsb2NrcyBhbGxvY2F0ZWQuICovCisJdW5zaWduZWQgbG9uZyBsb25nCXN0X2Jsb2NrczsKKworCXVuc2lnbmVkIGxvbmcJc3RfYXRpbWU7CisJdW5zaWduZWQgbG9uZwlzdF9hdGltZV9uc2VjOworCisJdW5zaWduZWQgbG9uZwlzdF9tdGltZTsKKwl1bnNpZ25lZCBpbnQJc3RfbXRpbWVfbnNlYzsKKworCXVuc2lnbmVkIGxvbmcJc3RfY3RpbWU7CisJdW5zaWduZWQgbG9uZwlzdF9jdGltZV9uc2VjOworCisJdW5zaWduZWQgbG9uZyBsb25nCXN0X2lubzsKK307CisKKyNlbHNlIC8qIF9faTM4Nl9fICovCisKK3N0cnVjdCBzdGF0IHsKKwl1bnNpZ25lZCBsb25nCXN0X2RldjsKKwl1bnNpZ25lZCBsb25nCXN0X2lubzsKKwl1bnNpZ25lZCBsb25nCXN0X25saW5rOworCisJdW5zaWduZWQgaW50CXN0X21vZGU7CisJdW5zaWduZWQgaW50CXN0X3VpZDsKKwl1bnNpZ25lZCBpbnQJc3RfZ2lkOworCXVuc2lnbmVkIGludAlfX3BhZDA7CisJdW5zaWduZWQgbG9uZwlzdF9yZGV2OworCWxvbmcJCXN0X3NpemU7CisJbG9uZwkJc3RfYmxrc2l6ZTsKKwlsb25nCQlzdF9ibG9ja3M7CS8qIE51bWJlciA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAqLworCisJdW5zaWduZWQgbG9uZwlzdF9hdGltZTsKKwl1bnNpZ25lZCBsb25nCXN0X2F0aW1lX25zZWM7CisJdW5zaWduZWQgbG9uZwlzdF9tdGltZTsKKwl1bnNpZ25lZCBsb25nCXN0X210aW1lX25zZWM7CisJdW5zaWduZWQgbG9uZwlzdF9jdGltZTsKKwl1bnNpZ25lZCBsb25nICAgc3RfY3RpbWVfbnNlYzsKKwlsb25nCQlfX3VudXNlZFszXTsKK307CisjZW5kaWYKKworLyogZm9yIDMyYml0IGVtdWxhdGlvbiBhbmQgMzIgYml0IGtlcm5lbHMgKi8KK3N0cnVjdCBfX29sZF9rZXJuZWxfc3RhdCB7CisJdW5zaWduZWQgc2hvcnQgc3RfZGV2OworCXVuc2lnbmVkIHNob3J0IHN0X2lubzsKKwl1bnNpZ25lZCBzaG9ydCBzdF9tb2RlOworCXVuc2lnbmVkIHNob3J0IHN0X25saW5rOworCXVuc2lnbmVkIHNob3J0IHN0X3VpZDsKKwl1bnNpZ25lZCBzaG9ydCBzdF9naWQ7CisJdW5zaWduZWQgc2hvcnQgc3RfcmRldjsKKyNpZmRlZiBfX2kzODZfXworCXVuc2lnbmVkIGxvbmcgIHN0X3NpemU7CisJdW5zaWduZWQgbG9uZyAgc3RfYXRpbWU7CisJdW5zaWduZWQgbG9uZyAgc3RfbXRpbWU7CisJdW5zaWduZWQgbG9uZyAgc3RfY3RpbWU7CisjZWxzZQorCXVuc2lnbmVkIGludCAgc3Rfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgIHN0X2F0aW1lOworCXVuc2lnbmVkIGludCAgc3RfbXRpbWU7CisJdW5zaWduZWQgaW50ICBzdF9jdGltZTsKKyNlbmRpZgorfTsKKworI2VuZGlmIC8qIF9BU01fWDg2X1NUQVRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS9zdGF0ZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc3RhdGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQwYWRiZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc3RhdGZzLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfQVNNX1g4Nl9TVEFURlNfSAorI2RlZmluZSBfQVNNX1g4Nl9TVEFURlNfSAorCisvKgorICogV2UgbmVlZCBjb21wYXRfc3RhdGZzNjQgdG8gYmUgcGFja2VkLCBiZWNhdXNlIHRoZSBpMzg2IEFCSSB3b24ndAorICogYWRkIHBhZGRpbmcgYXQgdGhlIGVuZCB0byBicmluZyBpdCB0byBhIG11bHRpcGxlIG9mIDggYnl0ZXMsIGJ1dAorICogdGhlIHg4Nl82NCBBQkkgd2lsbC4KKyAqLworI2RlZmluZSBBUkNIX1BBQ0tfQ09NUEFUX1NUQVRGUzY0IF9fYXR0cmlidXRlX18oKHBhY2tlZCxhbGlnbmVkKDQpKSkKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3N0YXRmcy5oPgorI2VuZGlmIC8qIF9BU01fWDg2X1NUQVRGU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3N3YWIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MzY1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3N3YWIuaApAQCAtMCwwICsxLDYxIEBACisjaWZuZGVmIF9BU01fWDg2X1NXQUJfSAorI2RlZmluZSBfQVNNX1g4Nl9TV0FCX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKworc3RhdGljIF9faW5saW5lX18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB2YWwpCit7CisjaWZkZWYgX19pMzg2X18KKyMgaWZkZWYgQ09ORklHX1g4Nl9CU1dBUAorCV9fYXNtX18oImJzd2FwICUwIiA6ICI9ciIgKHZhbCkgOiAiMCIgKHZhbCkpOworIyBlbHNlCisJX19hc21fXygieGNoZ2IgJWIwLCVoMFxuXHQiCS8qIHN3YXAgbG93ZXIgYnl0ZXMJKi8KKwkgICAgInJvcmwgJDE2LCUwXG5cdCIJLyogc3dhcCB3b3JkcwkJKi8KKwkgICAgInhjaGdiICViMCwlaDAiCS8qIHN3YXAgaGlnaGVyIGJ5dGVzCSovCisJICAgIDogIj1xIiAodmFsKQorCSAgICA6ICIwIiAodmFsKSk7CisjIGVuZGlmCisKKyNlbHNlIC8qIF9faTM4Nl9fICovCisJX19hc21fXygiYnN3YXBsICUwIgorCSAgICA6ICI9ciIgKHZhbCkKKwkgICAgOiAiMCIgKHZhbCkpOworI2VuZGlmCisJcmV0dXJuIHZhbDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTY0IF9fYXJjaF9zd2FiNjQoX191NjQgdmFsKQoreworI2lmZGVmIF9faTM4Nl9fCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191MzIgYTsKKwkJCV9fdTMyIGI7CisJCX0gczsKKwkJX191NjQgdTsKKwl9IHY7CisJdi51ID0gdmFsOworIyBpZmRlZiBDT05GSUdfWDg2X0JTV0FQCisJX19hc21fXygiYnN3YXBsICUwIDsgYnN3YXBsICUxIDsgeGNoZ2wgJTAsJTEiCisJICAgIDogIj1yIiAodi5zLmEpLCAiPXIiICh2LnMuYikKKwkgICAgOiAiMCIgKHYucy5hKSwgIjEiICh2LnMuYikpOworIyBlbHNlCisJdi5zLmEgPSBfX2FyY2hfc3dhYjMyKHYucy5hKTsKKwl2LnMuYiA9IF9fYXJjaF9zd2FiMzIodi5zLmIpOworCV9fYXNtX18oInhjaGdsICUwLCUxIgorCSAgICA6ICI9ciIgKHYucy5hKSwgIj1yIiAodi5zLmIpCisJICAgIDogIjAiICh2LnMuYSksICIxIiAodi5zLmIpKTsKKyMgZW5kaWYKKwlyZXR1cm4gdi51OworI2Vsc2UgLyogX19pMzg2X18gKi8KKwlfX2FzbV9fKCJic3dhcHEgJTAiCisJICAgIDogIj1yIiAodmFsKQorCSAgICA6ICIwIiAodmFsKSk7CisJcmV0dXJuIHZhbDsKKyNlbmRpZgorfQorI2RlZmluZSBfX2FyY2hfc3dhYjY0IF9fYXJjaF9zd2FiNjQKKworI2VuZGlmIC8qIF9BU01fWDg2X1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS90ZXJtYml0cy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS90ZXJtYml0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MzViMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3Rlcm1iaXRzLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3Rlcm1iaXRzLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3Rlcm1pb3MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vdGVybWlvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MGQ3OGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3Rlcm1pb3MuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdGVybWlvcy5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS90eXBlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOGMyM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3R5cGVzLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIF9BU01fWDg2X1RZUEVTX0gKKyNkZWZpbmUgX0FTTV9YODZfVFlQRVNfSAorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdHlwZXMuaD4KKworI2VuZGlmIC8qIF9BU01fWDg2X1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vdWNvbnRleHQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vdWNvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2MyOWM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS91Y29udGV4dC5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9YODZfVUNPTlRFWFRfSAorI2RlZmluZSBfQVNNX1g4Nl9VQ09OVEVYVF9ICisKKyNkZWZpbmUgVUNfRlBfWFNUQVRFCTB4MQkvKiBpbmRpY2F0ZXMgdGhlIHByZXNlbmNlIG9mIGV4dGVuZGVkIHN0YXRlCisJCQkJICogaW5mb3JtYXRpb24gaW4gdGhlIG1lbW9yeSBsYXlvdXQgcG9pbnRlZAorCQkJCSAqIGJ5IHRoZSBmcHN0YXRlIHBvaW50ZXIgaW4gdGhlIHVjb250ZXh0J3MKKwkJCQkgKiBzaWdjb250ZXh0IHN0cnVjdCAodWNfbWNvbnRleHQpLgorCQkJCSAqLworCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdWNvbnRleHQuaD4KKworI2VuZGlmIC8qIF9BU01fWDg2X1VDT05URVhUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vdW5pc3RkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3VuaXN0ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZWQ5MTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3VuaXN0ZC5oCkBAIC0wLDAgKzEsNSBAQAorIyBpZmRlZiBfX2kzODZfXworIyAgaW5jbHVkZSA8YXNtL3VuaXN0ZF8zMi5oPgorIyBlbHNlCisjICBpbmNsdWRlIDxhc20vdW5pc3RkXzY0Lmg+CisjIGVuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3VuaXN0ZF8zMi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS91bmlzdGRfMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjk3OTgwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS91bmlzdGRfMzIuaApAQCAtMCwwICsxLDM1OCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9VTklTVERfMzJfSAorI2RlZmluZSBfQVNNX1g4Nl9VTklTVERfMzJfSAorCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzeXN0ZW0gY2FsbCBudW1iZXJzLgorICovCisKKyNkZWZpbmUgX19OUl9yZXN0YXJ0X3N5c2NhbGwgICAgICAwCisjZGVmaW5lIF9fTlJfZXhpdAkJICAxCisjZGVmaW5lIF9fTlJfZm9yawkJICAyCisjZGVmaW5lIF9fTlJfcmVhZAkJICAzCisjZGVmaW5lIF9fTlJfd3JpdGUJCSAgNAorI2RlZmluZSBfX05SX29wZW4JCSAgNQorI2RlZmluZSBfX05SX2Nsb3NlCQkgIDYKKyNkZWZpbmUgX19OUl93YWl0cGlkCQkgIDcKKyNkZWZpbmUgX19OUl9jcmVhdAkJICA4CisjZGVmaW5lIF9fTlJfbGluawkJICA5CisjZGVmaW5lIF9fTlJfdW5saW5rCQkgMTAKKyNkZWZpbmUgX19OUl9leGVjdmUJCSAxMQorI2RlZmluZSBfX05SX2NoZGlyCQkgMTIKKyNkZWZpbmUgX19OUl90aW1lCQkgMTMKKyNkZWZpbmUgX19OUl9ta25vZAkJIDE0CisjZGVmaW5lIF9fTlJfY2htb2QJCSAxNQorI2RlZmluZSBfX05SX2xjaG93bgkJIDE2CisjZGVmaW5lIF9fTlJfYnJlYWsJCSAxNworI2RlZmluZSBfX05SX29sZHN0YXQJCSAxOAorI2RlZmluZSBfX05SX2xzZWVrCQkgMTkKKyNkZWZpbmUgX19OUl9nZXRwaWQJCSAyMAorI2RlZmluZSBfX05SX21vdW50CQkgMjEKKyNkZWZpbmUgX19OUl91bW91bnQJCSAyMgorI2RlZmluZSBfX05SX3NldHVpZAkJIDIzCisjZGVmaW5lIF9fTlJfZ2V0dWlkCQkgMjQKKyNkZWZpbmUgX19OUl9zdGltZQkJIDI1CisjZGVmaW5lIF9fTlJfcHRyYWNlCQkgMjYKKyNkZWZpbmUgX19OUl9hbGFybQkJIDI3CisjZGVmaW5lIF9fTlJfb2xkZnN0YXQJCSAyOAorI2RlZmluZSBfX05SX3BhdXNlCQkgMjkKKyNkZWZpbmUgX19OUl91dGltZQkJIDMwCisjZGVmaW5lIF9fTlJfc3R0eQkJIDMxCisjZGVmaW5lIF9fTlJfZ3R0eQkJIDMyCisjZGVmaW5lIF9fTlJfYWNjZXNzCQkgMzMKKyNkZWZpbmUgX19OUl9uaWNlCQkgMzQKKyNkZWZpbmUgX19OUl9mdGltZQkJIDM1CisjZGVmaW5lIF9fTlJfc3luYwkJIDM2CisjZGVmaW5lIF9fTlJfa2lsbAkJIDM3CisjZGVmaW5lIF9fTlJfcmVuYW1lCQkgMzgKKyNkZWZpbmUgX19OUl9ta2RpcgkJIDM5CisjZGVmaW5lIF9fTlJfcm1kaXIJCSA0MAorI2RlZmluZSBfX05SX2R1cAkJIDQxCisjZGVmaW5lIF9fTlJfcGlwZQkJIDQyCisjZGVmaW5lIF9fTlJfdGltZXMJCSA0MworI2RlZmluZSBfX05SX3Byb2YJCSA0NAorI2RlZmluZSBfX05SX2JyawkJIDQ1CisjZGVmaW5lIF9fTlJfc2V0Z2lkCQkgNDYKKyNkZWZpbmUgX19OUl9nZXRnaWQJCSA0NworI2RlZmluZSBfX05SX3NpZ25hbAkJIDQ4CisjZGVmaW5lIF9fTlJfZ2V0ZXVpZAkJIDQ5CisjZGVmaW5lIF9fTlJfZ2V0ZWdpZAkJIDUwCisjZGVmaW5lIF9fTlJfYWNjdAkJIDUxCisjZGVmaW5lIF9fTlJfdW1vdW50MgkJIDUyCisjZGVmaW5lIF9fTlJfbG9jawkJIDUzCisjZGVmaW5lIF9fTlJfaW9jdGwJCSA1NAorI2RlZmluZSBfX05SX2ZjbnRsCQkgNTUKKyNkZWZpbmUgX19OUl9tcHgJCSA1NgorI2RlZmluZSBfX05SX3NldHBnaWQJCSA1NworI2RlZmluZSBfX05SX3VsaW1pdAkJIDU4CisjZGVmaW5lIF9fTlJfb2xkb2xkdW5hbWUJIDU5CisjZGVmaW5lIF9fTlJfdW1hc2sJCSA2MAorI2RlZmluZSBfX05SX2Nocm9vdAkJIDYxCisjZGVmaW5lIF9fTlJfdXN0YXQJCSA2MgorI2RlZmluZSBfX05SX2R1cDIJCSA2MworI2RlZmluZSBfX05SX2dldHBwaWQJCSA2NAorI2RlZmluZSBfX05SX2dldHBncnAJCSA2NQorI2RlZmluZSBfX05SX3NldHNpZAkJIDY2CisjZGVmaW5lIF9fTlJfc2lnYWN0aW9uCQkgNjcKKyNkZWZpbmUgX19OUl9zZ2V0bWFzawkJIDY4CisjZGVmaW5lIF9fTlJfc3NldG1hc2sJCSA2OQorI2RlZmluZSBfX05SX3NldHJldWlkCQkgNzAKKyNkZWZpbmUgX19OUl9zZXRyZWdpZAkJIDcxCisjZGVmaW5lIF9fTlJfc2lnc3VzcGVuZAkJIDcyCisjZGVmaW5lIF9fTlJfc2lncGVuZGluZwkJIDczCisjZGVmaW5lIF9fTlJfc2V0aG9zdG5hbWUJIDc0CisjZGVmaW5lIF9fTlJfc2V0cmxpbWl0CQkgNzUKKyNkZWZpbmUgX19OUl9nZXRybGltaXQJCSA3NiAgIC8qIEJhY2sgY29tcGF0aWJsZSAyR2lnIGxpbWl0ZWQgcmxpbWl0ICovCisjZGVmaW5lIF9fTlJfZ2V0cnVzYWdlCQkgNzcKKyNkZWZpbmUgX19OUl9nZXR0aW1lb2ZkYXkJIDc4CisjZGVmaW5lIF9fTlJfc2V0dGltZW9mZGF5CSA3OQorI2RlZmluZSBfX05SX2dldGdyb3VwcwkJIDgwCisjZGVmaW5lIF9fTlJfc2V0Z3JvdXBzCQkgODEKKyNkZWZpbmUgX19OUl9zZWxlY3QJCSA4MgorI2RlZmluZSBfX05SX3N5bWxpbmsJCSA4MworI2RlZmluZSBfX05SX29sZGxzdGF0CQkgODQKKyNkZWZpbmUgX19OUl9yZWFkbGluawkJIDg1CisjZGVmaW5lIF9fTlJfdXNlbGliCQkgODYKKyNkZWZpbmUgX19OUl9zd2Fwb24JCSA4NworI2RlZmluZSBfX05SX3JlYm9vdAkJIDg4CisjZGVmaW5lIF9fTlJfcmVhZGRpcgkJIDg5CisjZGVmaW5lIF9fTlJfbW1hcAkJIDkwCisjZGVmaW5lIF9fTlJfbXVubWFwCQkgOTEKKyNkZWZpbmUgX19OUl90cnVuY2F0ZQkJIDkyCisjZGVmaW5lIF9fTlJfZnRydW5jYXRlCQkgOTMKKyNkZWZpbmUgX19OUl9mY2htb2QJCSA5NAorI2RlZmluZSBfX05SX2ZjaG93bgkJIDk1CisjZGVmaW5lIF9fTlJfZ2V0cHJpb3JpdHkJIDk2CisjZGVmaW5lIF9fTlJfc2V0cHJpb3JpdHkJIDk3CisjZGVmaW5lIF9fTlJfcHJvZmlsCQkgOTgKKyNkZWZpbmUgX19OUl9zdGF0ZnMJCSA5OQorI2RlZmluZSBfX05SX2ZzdGF0ZnMJCTEwMAorI2RlZmluZSBfX05SX2lvcGVybQkJMTAxCisjZGVmaW5lIF9fTlJfc29ja2V0Y2FsbAkJMTAyCisjZGVmaW5lIF9fTlJfc3lzbG9nCQkxMDMKKyNkZWZpbmUgX19OUl9zZXRpdGltZXIJCTEwNAorI2RlZmluZSBfX05SX2dldGl0aW1lcgkJMTA1CisjZGVmaW5lIF9fTlJfc3RhdAkJMTA2CisjZGVmaW5lIF9fTlJfbHN0YXQJCTEwNworI2RlZmluZSBfX05SX2ZzdGF0CQkxMDgKKyNkZWZpbmUgX19OUl9vbGR1bmFtZQkJMTA5CisjZGVmaW5lIF9fTlJfaW9wbAkJMTEwCisjZGVmaW5lIF9fTlJfdmhhbmd1cAkJMTExCisjZGVmaW5lIF9fTlJfaWRsZQkJMTEyCisjZGVmaW5lIF9fTlJfdm04Nm9sZAkJMTEzCisjZGVmaW5lIF9fTlJfd2FpdDQJCTExNAorI2RlZmluZSBfX05SX3N3YXBvZmYJCTExNQorI2RlZmluZSBfX05SX3N5c2luZm8JCTExNgorI2RlZmluZSBfX05SX2lwYwkJMTE3CisjZGVmaW5lIF9fTlJfZnN5bmMJCTExOAorI2RlZmluZSBfX05SX3NpZ3JldHVybgkJMTE5CisjZGVmaW5lIF9fTlJfY2xvbmUJCTEyMAorI2RlZmluZSBfX05SX3NldGRvbWFpbm5hbWUJMTIxCisjZGVmaW5lIF9fTlJfdW5hbWUJCTEyMgorI2RlZmluZSBfX05SX21vZGlmeV9sZHQJCTEyMworI2RlZmluZSBfX05SX2FkanRpbWV4CQkxMjQKKyNkZWZpbmUgX19OUl9tcHJvdGVjdAkJMTI1CisjZGVmaW5lIF9fTlJfc2lncHJvY21hc2sJMTI2CisjZGVmaW5lIF9fTlJfY3JlYXRlX21vZHVsZQkxMjcKKyNkZWZpbmUgX19OUl9pbml0X21vZHVsZQkxMjgKKyNkZWZpbmUgX19OUl9kZWxldGVfbW9kdWxlCTEyOQorI2RlZmluZSBfX05SX2dldF9rZXJuZWxfc3ltcwkxMzAKKyNkZWZpbmUgX19OUl9xdW90YWN0bAkJMTMxCisjZGVmaW5lIF9fTlJfZ2V0cGdpZAkJMTMyCisjZGVmaW5lIF9fTlJfZmNoZGlyCQkxMzMKKyNkZWZpbmUgX19OUl9iZGZsdXNoCQkxMzQKKyNkZWZpbmUgX19OUl9zeXNmcwkJMTM1CisjZGVmaW5lIF9fTlJfcGVyc29uYWxpdHkJMTM2CisjZGVmaW5lIF9fTlJfYWZzX3N5c2NhbGwJMTM3IC8qIFN5c2NhbGwgZm9yIEFuZHJldyBGaWxlIFN5c3RlbSAqLworI2RlZmluZSBfX05SX3NldGZzdWlkCQkxMzgKKyNkZWZpbmUgX19OUl9zZXRmc2dpZAkJMTM5CisjZGVmaW5lIF9fTlJfX2xsc2VlawkJMTQwCisjZGVmaW5lIF9fTlJfZ2V0ZGVudHMJCTE0MQorI2RlZmluZSBfX05SX19uZXdzZWxlY3QJCTE0MgorI2RlZmluZSBfX05SX2Zsb2NrCQkxNDMKKyNkZWZpbmUgX19OUl9tc3luYwkJMTQ0CisjZGVmaW5lIF9fTlJfcmVhZHYJCTE0NQorI2RlZmluZSBfX05SX3dyaXRldgkJMTQ2CisjZGVmaW5lIF9fTlJfZ2V0c2lkCQkxNDcKKyNkZWZpbmUgX19OUl9mZGF0YXN5bmMJCTE0OAorI2RlZmluZSBfX05SX19zeXNjdGwJCTE0OQorI2RlZmluZSBfX05SX21sb2NrCQkxNTAKKyNkZWZpbmUgX19OUl9tdW5sb2NrCQkxNTEKKyNkZWZpbmUgX19OUl9tbG9ja2FsbAkJMTUyCisjZGVmaW5lIF9fTlJfbXVubG9ja2FsbAkJMTUzCisjZGVmaW5lIF9fTlJfc2NoZWRfc2V0cGFyYW0JCTE1NAorI2RlZmluZSBfX05SX3NjaGVkX2dldHBhcmFtCQkxNTUKKyNkZWZpbmUgX19OUl9zY2hlZF9zZXRzY2hlZHVsZXIJCTE1NgorI2RlZmluZSBfX05SX3NjaGVkX2dldHNjaGVkdWxlcgkJMTU3CisjZGVmaW5lIF9fTlJfc2NoZWRfeWllbGQJCTE1OAorI2RlZmluZSBfX05SX3NjaGVkX2dldF9wcmlvcml0eV9tYXgJMTU5CisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbgkxNjAKKyNkZWZpbmUgX19OUl9zY2hlZF9ycl9nZXRfaW50ZXJ2YWwJMTYxCisjZGVmaW5lIF9fTlJfbmFub3NsZWVwCQkxNjIKKyNkZWZpbmUgX19OUl9tcmVtYXAJCTE2MworI2RlZmluZSBfX05SX3NldHJlc3VpZAkJMTY0CisjZGVmaW5lIF9fTlJfZ2V0cmVzdWlkCQkxNjUKKyNkZWZpbmUgX19OUl92bTg2CQkxNjYKKyNkZWZpbmUgX19OUl9xdWVyeV9tb2R1bGUJMTY3CisjZGVmaW5lIF9fTlJfcG9sbAkJMTY4CisjZGVmaW5lIF9fTlJfbmZzc2VydmN0bAkJMTY5CisjZGVmaW5lIF9fTlJfc2V0cmVzZ2lkCQkxNzAKKyNkZWZpbmUgX19OUl9nZXRyZXNnaWQJCTE3MQorI2RlZmluZSBfX05SX3ByY3RsICAgICAgICAgICAgICAxNzIKKyNkZWZpbmUgX19OUl9ydF9zaWdyZXR1cm4JMTczCisjZGVmaW5lIF9fTlJfcnRfc2lnYWN0aW9uCTE3NAorI2RlZmluZSBfX05SX3J0X3NpZ3Byb2NtYXNrCTE3NQorI2RlZmluZSBfX05SX3J0X3NpZ3BlbmRpbmcJMTc2CisjZGVmaW5lIF9fTlJfcnRfc2lndGltZWR3YWl0CTE3NworI2RlZmluZSBfX05SX3J0X3NpZ3F1ZXVlaW5mbwkxNzgKKyNkZWZpbmUgX19OUl9ydF9zaWdzdXNwZW5kCTE3OQorI2RlZmluZSBfX05SX3ByZWFkNjQJCTE4MAorI2RlZmluZSBfX05SX3B3cml0ZTY0CQkxODEKKyNkZWZpbmUgX19OUl9jaG93bgkJMTgyCisjZGVmaW5lIF9fTlJfZ2V0Y3dkCQkxODMKKyNkZWZpbmUgX19OUl9jYXBnZXQJCTE4NAorI2RlZmluZSBfX05SX2NhcHNldAkJMTg1CisjZGVmaW5lIF9fTlJfc2lnYWx0c3RhY2sJMTg2CisjZGVmaW5lIF9fTlJfc2VuZGZpbGUJCTE4NworI2RlZmluZSBfX05SX2dldHBtc2cJCTE4OAkvKiBzb21lIHBlb3BsZSBhY3R1YWxseSB3YW50IHN0cmVhbXMgKi8KKyNkZWZpbmUgX19OUl9wdXRwbXNnCQkxODkJLyogc29tZSBwZW9wbGUgYWN0dWFsbHkgd2FudCBzdHJlYW1zICovCisjZGVmaW5lIF9fTlJfdmZvcmsJCTE5MAorI2RlZmluZSBfX05SX3VnZXRybGltaXQJCTE5MQkvKiBTdVMgY29tcGxpYW50IGdldHJsaW1pdCAqLworI2RlZmluZSBfX05SX21tYXAyCQkxOTIKKyNkZWZpbmUgX19OUl90cnVuY2F0ZTY0CQkxOTMKKyNkZWZpbmUgX19OUl9mdHJ1bmNhdGU2NAkxOTQKKyNkZWZpbmUgX19OUl9zdGF0NjQJCTE5NQorI2RlZmluZSBfX05SX2xzdGF0NjQJCTE5NgorI2RlZmluZSBfX05SX2ZzdGF0NjQJCTE5NworI2RlZmluZSBfX05SX2xjaG93bjMyCQkxOTgKKyNkZWZpbmUgX19OUl9nZXR1aWQzMgkJMTk5CisjZGVmaW5lIF9fTlJfZ2V0Z2lkMzIJCTIwMAorI2RlZmluZSBfX05SX2dldGV1aWQzMgkJMjAxCisjZGVmaW5lIF9fTlJfZ2V0ZWdpZDMyCQkyMDIKKyNkZWZpbmUgX19OUl9zZXRyZXVpZDMyCQkyMDMKKyNkZWZpbmUgX19OUl9zZXRyZWdpZDMyCQkyMDQKKyNkZWZpbmUgX19OUl9nZXRncm91cHMzMgkyMDUKKyNkZWZpbmUgX19OUl9zZXRncm91cHMzMgkyMDYKKyNkZWZpbmUgX19OUl9mY2hvd24zMgkJMjA3CisjZGVmaW5lIF9fTlJfc2V0cmVzdWlkMzIJMjA4CisjZGVmaW5lIF9fTlJfZ2V0cmVzdWlkMzIJMjA5CisjZGVmaW5lIF9fTlJfc2V0cmVzZ2lkMzIJMjEwCisjZGVmaW5lIF9fTlJfZ2V0cmVzZ2lkMzIJMjExCisjZGVmaW5lIF9fTlJfY2hvd24zMgkJMjEyCisjZGVmaW5lIF9fTlJfc2V0dWlkMzIJCTIxMworI2RlZmluZSBfX05SX3NldGdpZDMyCQkyMTQKKyNkZWZpbmUgX19OUl9zZXRmc3VpZDMyCQkyMTUKKyNkZWZpbmUgX19OUl9zZXRmc2dpZDMyCQkyMTYKKyNkZWZpbmUgX19OUl9waXZvdF9yb290CQkyMTcKKyNkZWZpbmUgX19OUl9taW5jb3JlCQkyMTgKKyNkZWZpbmUgX19OUl9tYWR2aXNlCQkyMTkKKyNkZWZpbmUgX19OUl9tYWR2aXNlMQkJMjE5CS8qIGRlbGV0ZSB3aGVuIEMgbGliIHN0dWIgaXMgcmVtb3ZlZCAqLworI2RlZmluZSBfX05SX2dldGRlbnRzNjQJCTIyMAorI2RlZmluZSBfX05SX2ZjbnRsNjQJCTIyMQorLyogMjIzIGlzIHVudXNlZCAqLworI2RlZmluZSBfX05SX2dldHRpZAkJMjI0CisjZGVmaW5lIF9fTlJfcmVhZGFoZWFkCQkyMjUKKyNkZWZpbmUgX19OUl9zZXR4YXR0cgkJMjI2CisjZGVmaW5lIF9fTlJfbHNldHhhdHRyCQkyMjcKKyNkZWZpbmUgX19OUl9mc2V0eGF0dHIJCTIyOAorI2RlZmluZSBfX05SX2dldHhhdHRyCQkyMjkKKyNkZWZpbmUgX19OUl9sZ2V0eGF0dHIJCTIzMAorI2RlZmluZSBfX05SX2ZnZXR4YXR0cgkJMjMxCisjZGVmaW5lIF9fTlJfbGlzdHhhdHRyCQkyMzIKKyNkZWZpbmUgX19OUl9sbGlzdHhhdHRyCQkyMzMKKyNkZWZpbmUgX19OUl9mbGlzdHhhdHRyCQkyMzQKKyNkZWZpbmUgX19OUl9yZW1vdmV4YXR0cgkyMzUKKyNkZWZpbmUgX19OUl9scmVtb3ZleGF0dHIJMjM2CisjZGVmaW5lIF9fTlJfZnJlbW92ZXhhdHRyCTIzNworI2RlZmluZSBfX05SX3RraWxsCQkyMzgKKyNkZWZpbmUgX19OUl9zZW5kZmlsZTY0CQkyMzkKKyNkZWZpbmUgX19OUl9mdXRleAkJMjQwCisjZGVmaW5lIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkJMjQxCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkJMjQyCisjZGVmaW5lIF9fTlJfc2V0X3RocmVhZF9hcmVhCTI0MworI2RlZmluZSBfX05SX2dldF90aHJlYWRfYXJlYQkyNDQKKyNkZWZpbmUgX19OUl9pb19zZXR1cAkJMjQ1CisjZGVmaW5lIF9fTlJfaW9fZGVzdHJveQkJMjQ2CisjZGVmaW5lIF9fTlJfaW9fZ2V0ZXZlbnRzCTI0NworI2RlZmluZSBfX05SX2lvX3N1Ym1pdAkJMjQ4CisjZGVmaW5lIF9fTlJfaW9fY2FuY2VsCQkyNDkKKyNkZWZpbmUgX19OUl9mYWR2aXNlNjQJCTI1MAorLyogMjUxIGlzIGF2YWlsYWJsZSBmb3IgcmV1c2UgKHdhcyBicmllZmx5IHN5c19zZXRfem9uZV9yZWNsYWltKSAqLworI2RlZmluZSBfX05SX2V4aXRfZ3JvdXAJCTI1MgorI2RlZmluZSBfX05SX2xvb2t1cF9kY29va2llCTI1MworI2RlZmluZSBfX05SX2Vwb2xsX2NyZWF0ZQkyNTQKKyNkZWZpbmUgX19OUl9lcG9sbF9jdGwJCTI1NQorI2RlZmluZSBfX05SX2Vwb2xsX3dhaXQJCTI1NgorI2RlZmluZSBfX05SX3JlbWFwX2ZpbGVfcGFnZXMJMjU3CisjZGVmaW5lIF9fTlJfc2V0X3RpZF9hZGRyZXNzCTI1OAorI2RlZmluZSBfX05SX3RpbWVyX2NyZWF0ZQkyNTkKKyNkZWZpbmUgX19OUl90aW1lcl9zZXR0aW1lCShfX05SX3RpbWVyX2NyZWF0ZSsxKQorI2RlZmluZSBfX05SX3RpbWVyX2dldHRpbWUJKF9fTlJfdGltZXJfY3JlYXRlKzIpCisjZGVmaW5lIF9fTlJfdGltZXJfZ2V0b3ZlcnJ1bgkoX19OUl90aW1lcl9jcmVhdGUrMykKKyNkZWZpbmUgX19OUl90aW1lcl9kZWxldGUJKF9fTlJfdGltZXJfY3JlYXRlKzQpCisjZGVmaW5lIF9fTlJfY2xvY2tfc2V0dGltZQkoX19OUl90aW1lcl9jcmVhdGUrNSkKKyNkZWZpbmUgX19OUl9jbG9ja19nZXR0aW1lCShfX05SX3RpbWVyX2NyZWF0ZSs2KQorI2RlZmluZSBfX05SX2Nsb2NrX2dldHJlcwkoX19OUl90aW1lcl9jcmVhdGUrNykKKyNkZWZpbmUgX19OUl9jbG9ja19uYW5vc2xlZXAJKF9fTlJfdGltZXJfY3JlYXRlKzgpCisjZGVmaW5lIF9fTlJfc3RhdGZzNjQJCTI2OAorI2RlZmluZSBfX05SX2ZzdGF0ZnM2NAkJMjY5CisjZGVmaW5lIF9fTlJfdGdraWxsCQkyNzAKKyNkZWZpbmUgX19OUl91dGltZXMJCTI3MQorI2RlZmluZSBfX05SX2ZhZHZpc2U2NF82NAkyNzIKKyNkZWZpbmUgX19OUl92c2VydmVyCQkyNzMKKyNkZWZpbmUgX19OUl9tYmluZAkJMjc0CisjZGVmaW5lIF9fTlJfZ2V0X21lbXBvbGljeQkyNzUKKyNkZWZpbmUgX19OUl9zZXRfbWVtcG9saWN5CTI3NgorI2RlZmluZSBfX05SX21xX29wZW4gCQkyNzcKKyNkZWZpbmUgX19OUl9tcV91bmxpbmsJCShfX05SX21xX29wZW4rMSkKKyNkZWZpbmUgX19OUl9tcV90aW1lZHNlbmQJKF9fTlJfbXFfb3BlbisyKQorI2RlZmluZSBfX05SX21xX3RpbWVkcmVjZWl2ZQkoX19OUl9tcV9vcGVuKzMpCisjZGVmaW5lIF9fTlJfbXFfbm90aWZ5CQkoX19OUl9tcV9vcGVuKzQpCisjZGVmaW5lIF9fTlJfbXFfZ2V0c2V0YXR0cgkoX19OUl9tcV9vcGVuKzUpCisjZGVmaW5lIF9fTlJfa2V4ZWNfbG9hZAkJMjgzCisjZGVmaW5lIF9fTlJfd2FpdGlkCQkyODQKKy8qICNkZWZpbmUgX19OUl9zeXNfc2V0YWx0cm9vdAkyODUgKi8KKyNkZWZpbmUgX19OUl9hZGRfa2V5CQkyODYKKyNkZWZpbmUgX19OUl9yZXF1ZXN0X2tleQkyODcKKyNkZWZpbmUgX19OUl9rZXljdGwJCTI4OAorI2RlZmluZSBfX05SX2lvcHJpb19zZXQJCTI4OQorI2RlZmluZSBfX05SX2lvcHJpb19nZXQJCTI5MAorI2RlZmluZSBfX05SX2lub3RpZnlfaW5pdAkyOTEKKyNkZWZpbmUgX19OUl9pbm90aWZ5X2FkZF93YXRjaAkyOTIKKyNkZWZpbmUgX19OUl9pbm90aWZ5X3JtX3dhdGNoCTI5MworI2RlZmluZSBfX05SX21pZ3JhdGVfcGFnZXMJMjk0CisjZGVmaW5lIF9fTlJfb3BlbmF0CQkyOTUKKyNkZWZpbmUgX19OUl9ta2RpcmF0CQkyOTYKKyNkZWZpbmUgX19OUl9ta25vZGF0CQkyOTcKKyNkZWZpbmUgX19OUl9mY2hvd25hdAkJMjk4CisjZGVmaW5lIF9fTlJfZnV0aW1lc2F0CQkyOTkKKyNkZWZpbmUgX19OUl9mc3RhdGF0NjQJCTMwMAorI2RlZmluZSBfX05SX3VubGlua2F0CQkzMDEKKyNkZWZpbmUgX19OUl9yZW5hbWVhdAkJMzAyCisjZGVmaW5lIF9fTlJfbGlua2F0CQkzMDMKKyNkZWZpbmUgX19OUl9zeW1saW5rYXQJCTMwNAorI2RlZmluZSBfX05SX3JlYWRsaW5rYXQJCTMwNQorI2RlZmluZSBfX05SX2ZjaG1vZGF0CQkzMDYKKyNkZWZpbmUgX19OUl9mYWNjZXNzYXQJCTMwNworI2RlZmluZSBfX05SX3BzZWxlY3Q2CQkzMDgKKyNkZWZpbmUgX19OUl9wcG9sbAkJMzA5CisjZGVmaW5lIF9fTlJfdW5zaGFyZQkJMzEwCisjZGVmaW5lIF9fTlJfc2V0X3JvYnVzdF9saXN0CTMxMQorI2RlZmluZSBfX05SX2dldF9yb2J1c3RfbGlzdAkzMTIKKyNkZWZpbmUgX19OUl9zcGxpY2UJCTMxMworI2RlZmluZSBfX05SX3N5bmNfZmlsZV9yYW5nZQkzMTQKKyNkZWZpbmUgX19OUl90ZWUJCTMxNQorI2RlZmluZSBfX05SX3Ztc3BsaWNlCQkzMTYKKyNkZWZpbmUgX19OUl9tb3ZlX3BhZ2VzCQkzMTcKKyNkZWZpbmUgX19OUl9nZXRjcHUJCTMxOAorI2RlZmluZSBfX05SX2Vwb2xsX3B3YWl0CTMxOQorI2RlZmluZSBfX05SX3V0aW1lbnNhdAkJMzIwCisjZGVmaW5lIF9fTlJfc2lnbmFsZmQJCTMyMQorI2RlZmluZSBfX05SX3RpbWVyZmRfY3JlYXRlCTMyMgorI2RlZmluZSBfX05SX2V2ZW50ZmQJCTMyMworI2RlZmluZSBfX05SX2ZhbGxvY2F0ZQkJMzI0CisjZGVmaW5lIF9fTlJfdGltZXJmZF9zZXR0aW1lCTMyNQorI2RlZmluZSBfX05SX3RpbWVyZmRfZ2V0dGltZQkzMjYKKyNkZWZpbmUgX19OUl9zaWduYWxmZDQJCTMyNworI2RlZmluZSBfX05SX2V2ZW50ZmQyCQkzMjgKKyNkZWZpbmUgX19OUl9lcG9sbF9jcmVhdGUxCTMyOQorI2RlZmluZSBfX05SX2R1cDMJCTMzMAorI2RlZmluZSBfX05SX3BpcGUyCQkzMzEKKyNkZWZpbmUgX19OUl9pbm90aWZ5X2luaXQxCTMzMgorI2RlZmluZSBfX05SX3ByZWFkdgkJMzMzCisjZGVmaW5lIF9fTlJfcHdyaXRldgkJMzM0CisjZGVmaW5lIF9fTlJfcnRfdGdzaWdxdWV1ZWluZm8JMzM1CisjZGVmaW5lIF9fTlJfcGVyZl9ldmVudF9vcGVuCTMzNgorI2RlZmluZSBfX05SX3JlY3ZtbXNnCQkzMzcKKyNkZWZpbmUgX19OUl9mYW5vdGlmeV9pbml0CTMzOAorI2RlZmluZSBfX05SX2Zhbm90aWZ5X21hcmsJMzM5CisjZGVmaW5lIF9fTlJfcHJsaW1pdDY0CQkzNDAKKyNkZWZpbmUgX19OUl9uYW1lX3RvX2hhbmRsZV9hdAkzNDEKKyNkZWZpbmUgX19OUl9vcGVuX2J5X2hhbmRsZV9hdCAgMzQyCisjZGVmaW5lIF9fTlJfY2xvY2tfYWRqdGltZQkzNDMKKyNkZWZpbmUgX19OUl9zeW5jZnMgICAgICAgICAgICAgMzQ0CisjZGVmaW5lIF9fTlJfc2VuZG1tc2cJCTM0NQorI2RlZmluZSBfX05SX3NldG5zCQkzNDYKKyNkZWZpbmUgX19OUl9wcm9jZXNzX3ZtX3JlYWR2CTM0NworI2RlZmluZSBfX05SX3Byb2Nlc3Nfdm1fd3JpdGV2CTM0OAorCisjZW5kaWYgLyogX0FTTV9YODZfVU5JU1REXzMyX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vdW5pc3RkXzY0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3VuaXN0ZF82NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZTBjZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3VuaXN0ZF82NC5oCkBAIC0wLDAgKzEsNzE3IEBACisjaWZuZGVmIF9BU01fWDg2X1VOSVNURF82NF9ICisjZGVmaW5lIF9BU01fWDg2X1VOSVNURF82NF9ICisKKyNpZm5kZWYgX19TWVNDQUxMCisjZGVmaW5lIF9fU1lTQ0FMTChhLCBiKQorI2VuZGlmCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN5c3RlbSBjYWxsIG51bWJlcnMuCisgKgorICogTm90ZTogaG9sZXMgYXJlIG5vdCBhbGxvd2VkLgorICovCisKKy8qIGF0IGxlYXN0IDggc3lzY2FsbCBwZXIgY2FjaGVsaW5lICovCisjZGVmaW5lIF9fTlJfcmVhZAkJCQkwCitfX1NZU0NBTEwoX19OUl9yZWFkLCBzeXNfcmVhZCkKKyNkZWZpbmUgX19OUl93cml0ZQkJCQkxCitfX1NZU0NBTEwoX19OUl93cml0ZSwgc3lzX3dyaXRlKQorI2RlZmluZSBfX05SX29wZW4JCQkJMgorX19TWVNDQUxMKF9fTlJfb3Blbiwgc3lzX29wZW4pCisjZGVmaW5lIF9fTlJfY2xvc2UJCQkJMworX19TWVNDQUxMKF9fTlJfY2xvc2UsIHN5c19jbG9zZSkKKyNkZWZpbmUgX19OUl9zdGF0CQkJCTQKK19fU1lTQ0FMTChfX05SX3N0YXQsIHN5c19uZXdzdGF0KQorI2RlZmluZSBfX05SX2ZzdGF0CQkJCTUKK19fU1lTQ0FMTChfX05SX2ZzdGF0LCBzeXNfbmV3ZnN0YXQpCisjZGVmaW5lIF9fTlJfbHN0YXQJCQkJNgorX19TWVNDQUxMKF9fTlJfbHN0YXQsIHN5c19uZXdsc3RhdCkKKyNkZWZpbmUgX19OUl9wb2xsCQkJCTcKK19fU1lTQ0FMTChfX05SX3BvbGwsIHN5c19wb2xsKQorCisjZGVmaW5lIF9fTlJfbHNlZWsJCQkJOAorX19TWVNDQUxMKF9fTlJfbHNlZWssIHN5c19sc2VlaykKKyNkZWZpbmUgX19OUl9tbWFwCQkJCTkKK19fU1lTQ0FMTChfX05SX21tYXAsIHN5c19tbWFwKQorI2RlZmluZSBfX05SX21wcm90ZWN0CQkJCTEwCitfX1NZU0NBTEwoX19OUl9tcHJvdGVjdCwgc3lzX21wcm90ZWN0KQorI2RlZmluZSBfX05SX211bm1hcAkJCQkxMQorX19TWVNDQUxMKF9fTlJfbXVubWFwLCBzeXNfbXVubWFwKQorI2RlZmluZSBfX05SX2JyawkJCQkxMgorX19TWVNDQUxMKF9fTlJfYnJrLCBzeXNfYnJrKQorI2RlZmluZSBfX05SX3J0X3NpZ2FjdGlvbgkJCTEzCitfX1NZU0NBTEwoX19OUl9ydF9zaWdhY3Rpb24sIHN5c19ydF9zaWdhY3Rpb24pCisjZGVmaW5lIF9fTlJfcnRfc2lncHJvY21hc2sJCQkxNAorX19TWVNDQUxMKF9fTlJfcnRfc2lncHJvY21hc2ssIHN5c19ydF9zaWdwcm9jbWFzaykKKyNkZWZpbmUgX19OUl9ydF9zaWdyZXR1cm4JCQkxNQorX19TWVNDQUxMKF9fTlJfcnRfc2lncmV0dXJuLCBzdHViX3J0X3NpZ3JldHVybikKKworI2RlZmluZSBfX05SX2lvY3RsCQkJCTE2CitfX1NZU0NBTEwoX19OUl9pb2N0bCwgc3lzX2lvY3RsKQorI2RlZmluZSBfX05SX3ByZWFkNjQJCQkJMTcKK19fU1lTQ0FMTChfX05SX3ByZWFkNjQsIHN5c19wcmVhZDY0KQorI2RlZmluZSBfX05SX3B3cml0ZTY0CQkJCTE4CitfX1NZU0NBTEwoX19OUl9wd3JpdGU2NCwgc3lzX3B3cml0ZTY0KQorI2RlZmluZSBfX05SX3JlYWR2CQkJCTE5CitfX1NZU0NBTEwoX19OUl9yZWFkdiwgc3lzX3JlYWR2KQorI2RlZmluZSBfX05SX3dyaXRldgkJCQkyMAorX19TWVNDQUxMKF9fTlJfd3JpdGV2LCBzeXNfd3JpdGV2KQorI2RlZmluZSBfX05SX2FjY2VzcwkJCQkyMQorX19TWVNDQUxMKF9fTlJfYWNjZXNzLCBzeXNfYWNjZXNzKQorI2RlZmluZSBfX05SX3BpcGUJCQkJMjIKK19fU1lTQ0FMTChfX05SX3BpcGUsIHN5c19waXBlKQorI2RlZmluZSBfX05SX3NlbGVjdAkJCQkyMworX19TWVNDQUxMKF9fTlJfc2VsZWN0LCBzeXNfc2VsZWN0KQorCisjZGVmaW5lIF9fTlJfc2NoZWRfeWllbGQJCQkyNAorX19TWVNDQUxMKF9fTlJfc2NoZWRfeWllbGQsIHN5c19zY2hlZF95aWVsZCkKKyNkZWZpbmUgX19OUl9tcmVtYXAJCQkJMjUKK19fU1lTQ0FMTChfX05SX21yZW1hcCwgc3lzX21yZW1hcCkKKyNkZWZpbmUgX19OUl9tc3luYwkJCQkyNgorX19TWVNDQUxMKF9fTlJfbXN5bmMsIHN5c19tc3luYykKKyNkZWZpbmUgX19OUl9taW5jb3JlCQkJCTI3CitfX1NZU0NBTEwoX19OUl9taW5jb3JlLCBzeXNfbWluY29yZSkKKyNkZWZpbmUgX19OUl9tYWR2aXNlCQkJCTI4CitfX1NZU0NBTEwoX19OUl9tYWR2aXNlLCBzeXNfbWFkdmlzZSkKKyNkZWZpbmUgX19OUl9zaG1nZXQJCQkJMjkKK19fU1lTQ0FMTChfX05SX3NobWdldCwgc3lzX3NobWdldCkKKyNkZWZpbmUgX19OUl9zaG1hdAkJCQkzMAorX19TWVNDQUxMKF9fTlJfc2htYXQsIHN5c19zaG1hdCkKKyNkZWZpbmUgX19OUl9zaG1jdGwJCQkJMzEKK19fU1lTQ0FMTChfX05SX3NobWN0bCwgc3lzX3NobWN0bCkKKworI2RlZmluZSBfX05SX2R1cAkJCQkzMgorX19TWVNDQUxMKF9fTlJfZHVwLCBzeXNfZHVwKQorI2RlZmluZSBfX05SX2R1cDIJCQkJMzMKK19fU1lTQ0FMTChfX05SX2R1cDIsIHN5c19kdXAyKQorI2RlZmluZSBfX05SX3BhdXNlCQkJCTM0CitfX1NZU0NBTEwoX19OUl9wYXVzZSwgc3lzX3BhdXNlKQorI2RlZmluZSBfX05SX25hbm9zbGVlcAkJCQkzNQorX19TWVNDQUxMKF9fTlJfbmFub3NsZWVwLCBzeXNfbmFub3NsZWVwKQorI2RlZmluZSBfX05SX2dldGl0aW1lcgkJCQkzNgorX19TWVNDQUxMKF9fTlJfZ2V0aXRpbWVyLCBzeXNfZ2V0aXRpbWVyKQorI2RlZmluZSBfX05SX2FsYXJtCQkJCTM3CitfX1NZU0NBTEwoX19OUl9hbGFybSwgc3lzX2FsYXJtKQorI2RlZmluZSBfX05SX3NldGl0aW1lcgkJCQkzOAorX19TWVNDQUxMKF9fTlJfc2V0aXRpbWVyLCBzeXNfc2V0aXRpbWVyKQorI2RlZmluZSBfX05SX2dldHBpZAkJCQkzOQorX19TWVNDQUxMKF9fTlJfZ2V0cGlkLCBzeXNfZ2V0cGlkKQorCisjZGVmaW5lIF9fTlJfc2VuZGZpbGUJCQkJNDAKK19fU1lTQ0FMTChfX05SX3NlbmRmaWxlLCBzeXNfc2VuZGZpbGU2NCkKKyNkZWZpbmUgX19OUl9zb2NrZXQJCQkJNDEKK19fU1lTQ0FMTChfX05SX3NvY2tldCwgc3lzX3NvY2tldCkKKyNkZWZpbmUgX19OUl9jb25uZWN0CQkJCTQyCitfX1NZU0NBTEwoX19OUl9jb25uZWN0LCBzeXNfY29ubmVjdCkKKyNkZWZpbmUgX19OUl9hY2NlcHQJCQkJNDMKK19fU1lTQ0FMTChfX05SX2FjY2VwdCwgc3lzX2FjY2VwdCkKKyNkZWZpbmUgX19OUl9zZW5kdG8JCQkJNDQKK19fU1lTQ0FMTChfX05SX3NlbmR0bywgc3lzX3NlbmR0bykKKyNkZWZpbmUgX19OUl9yZWN2ZnJvbQkJCQk0NQorX19TWVNDQUxMKF9fTlJfcmVjdmZyb20sIHN5c19yZWN2ZnJvbSkKKyNkZWZpbmUgX19OUl9zZW5kbXNnCQkJCTQ2CitfX1NZU0NBTEwoX19OUl9zZW5kbXNnLCBzeXNfc2VuZG1zZykKKyNkZWZpbmUgX19OUl9yZWN2bXNnCQkJCTQ3CitfX1NZU0NBTEwoX19OUl9yZWN2bXNnLCBzeXNfcmVjdm1zZykKKworI2RlZmluZSBfX05SX3NodXRkb3duCQkJCTQ4CitfX1NZU0NBTEwoX19OUl9zaHV0ZG93biwgc3lzX3NodXRkb3duKQorI2RlZmluZSBfX05SX2JpbmQJCQkJNDkKK19fU1lTQ0FMTChfX05SX2JpbmQsIHN5c19iaW5kKQorI2RlZmluZSBfX05SX2xpc3RlbgkJCQk1MAorX19TWVNDQUxMKF9fTlJfbGlzdGVuLCBzeXNfbGlzdGVuKQorI2RlZmluZSBfX05SX2dldHNvY2tuYW1lCQkJNTEKK19fU1lTQ0FMTChfX05SX2dldHNvY2tuYW1lLCBzeXNfZ2V0c29ja25hbWUpCisjZGVmaW5lIF9fTlJfZ2V0cGVlcm5hbWUJCQk1MgorX19TWVNDQUxMKF9fTlJfZ2V0cGVlcm5hbWUsIHN5c19nZXRwZWVybmFtZSkKKyNkZWZpbmUgX19OUl9zb2NrZXRwYWlyCQkJCTUzCitfX1NZU0NBTEwoX19OUl9zb2NrZXRwYWlyLCBzeXNfc29ja2V0cGFpcikKKyNkZWZpbmUgX19OUl9zZXRzb2Nrb3B0CQkJCTU0CitfX1NZU0NBTEwoX19OUl9zZXRzb2Nrb3B0LCBzeXNfc2V0c29ja29wdCkKKyNkZWZpbmUgX19OUl9nZXRzb2Nrb3B0CQkJCTU1CitfX1NZU0NBTEwoX19OUl9nZXRzb2Nrb3B0LCBzeXNfZ2V0c29ja29wdCkKKworI2RlZmluZSBfX05SX2Nsb25lCQkJCTU2CitfX1NZU0NBTEwoX19OUl9jbG9uZSwgc3R1Yl9jbG9uZSkKKyNkZWZpbmUgX19OUl9mb3JrCQkJCTU3CitfX1NZU0NBTEwoX19OUl9mb3JrLCBzdHViX2ZvcmspCisjZGVmaW5lIF9fTlJfdmZvcmsJCQkJNTgKK19fU1lTQ0FMTChfX05SX3Zmb3JrLCBzdHViX3Zmb3JrKQorI2RlZmluZSBfX05SX2V4ZWN2ZQkJCQk1OQorX19TWVNDQUxMKF9fTlJfZXhlY3ZlLCBzdHViX2V4ZWN2ZSkKKyNkZWZpbmUgX19OUl9leGl0CQkJCTYwCitfX1NZU0NBTEwoX19OUl9leGl0LCBzeXNfZXhpdCkKKyNkZWZpbmUgX19OUl93YWl0NAkJCQk2MQorX19TWVNDQUxMKF9fTlJfd2FpdDQsIHN5c193YWl0NCkKKyNkZWZpbmUgX19OUl9raWxsCQkJCTYyCitfX1NZU0NBTEwoX19OUl9raWxsLCBzeXNfa2lsbCkKKyNkZWZpbmUgX19OUl91bmFtZQkJCQk2MworX19TWVNDQUxMKF9fTlJfdW5hbWUsIHN5c19uZXd1bmFtZSkKKworI2RlZmluZSBfX05SX3NlbWdldAkJCQk2NAorX19TWVNDQUxMKF9fTlJfc2VtZ2V0LCBzeXNfc2VtZ2V0KQorI2RlZmluZSBfX05SX3NlbW9wCQkJCTY1CitfX1NZU0NBTEwoX19OUl9zZW1vcCwgc3lzX3NlbW9wKQorI2RlZmluZSBfX05SX3NlbWN0bAkJCQk2NgorX19TWVNDQUxMKF9fTlJfc2VtY3RsLCBzeXNfc2VtY3RsKQorI2RlZmluZSBfX05SX3NobWR0CQkJCTY3CitfX1NZU0NBTEwoX19OUl9zaG1kdCwgc3lzX3NobWR0KQorI2RlZmluZSBfX05SX21zZ2dldAkJCQk2OAorX19TWVNDQUxMKF9fTlJfbXNnZ2V0LCBzeXNfbXNnZ2V0KQorI2RlZmluZSBfX05SX21zZ3NuZAkJCQk2OQorX19TWVNDQUxMKF9fTlJfbXNnc25kLCBzeXNfbXNnc25kKQorI2RlZmluZSBfX05SX21zZ3JjdgkJCQk3MAorX19TWVNDQUxMKF9fTlJfbXNncmN2LCBzeXNfbXNncmN2KQorI2RlZmluZSBfX05SX21zZ2N0bAkJCQk3MQorX19TWVNDQUxMKF9fTlJfbXNnY3RsLCBzeXNfbXNnY3RsKQorCisjZGVmaW5lIF9fTlJfZmNudGwJCQkJNzIKK19fU1lTQ0FMTChfX05SX2ZjbnRsLCBzeXNfZmNudGwpCisjZGVmaW5lIF9fTlJfZmxvY2sJCQkJNzMKK19fU1lTQ0FMTChfX05SX2Zsb2NrLCBzeXNfZmxvY2spCisjZGVmaW5lIF9fTlJfZnN5bmMJCQkJNzQKK19fU1lTQ0FMTChfX05SX2ZzeW5jLCBzeXNfZnN5bmMpCisjZGVmaW5lIF9fTlJfZmRhdGFzeW5jCQkJCTc1CitfX1NZU0NBTEwoX19OUl9mZGF0YXN5bmMsIHN5c19mZGF0YXN5bmMpCisjZGVmaW5lIF9fTlJfdHJ1bmNhdGUJCQkJNzYKK19fU1lTQ0FMTChfX05SX3RydW5jYXRlLCBzeXNfdHJ1bmNhdGUpCisjZGVmaW5lIF9fTlJfZnRydW5jYXRlCQkJCTc3CitfX1NZU0NBTEwoX19OUl9mdHJ1bmNhdGUsIHN5c19mdHJ1bmNhdGUpCisjZGVmaW5lIF9fTlJfZ2V0ZGVudHMJCQkJNzgKK19fU1lTQ0FMTChfX05SX2dldGRlbnRzLCBzeXNfZ2V0ZGVudHMpCisjZGVmaW5lIF9fTlJfZ2V0Y3dkCQkJCTc5CitfX1NZU0NBTEwoX19OUl9nZXRjd2QsIHN5c19nZXRjd2QpCisKKyNkZWZpbmUgX19OUl9jaGRpcgkJCQk4MAorX19TWVNDQUxMKF9fTlJfY2hkaXIsIHN5c19jaGRpcikKKyNkZWZpbmUgX19OUl9mY2hkaXIJCQkJODEKK19fU1lTQ0FMTChfX05SX2ZjaGRpciwgc3lzX2ZjaGRpcikKKyNkZWZpbmUgX19OUl9yZW5hbWUJCQkJODIKK19fU1lTQ0FMTChfX05SX3JlbmFtZSwgc3lzX3JlbmFtZSkKKyNkZWZpbmUgX19OUl9ta2RpcgkJCQk4MworX19TWVNDQUxMKF9fTlJfbWtkaXIsIHN5c19ta2RpcikKKyNkZWZpbmUgX19OUl9ybWRpcgkJCQk4NAorX19TWVNDQUxMKF9fTlJfcm1kaXIsIHN5c19ybWRpcikKKyNkZWZpbmUgX19OUl9jcmVhdAkJCQk4NQorX19TWVNDQUxMKF9fTlJfY3JlYXQsIHN5c19jcmVhdCkKKyNkZWZpbmUgX19OUl9saW5rCQkJCTg2CitfX1NZU0NBTEwoX19OUl9saW5rLCBzeXNfbGluaykKKyNkZWZpbmUgX19OUl91bmxpbmsJCQkJODcKK19fU1lTQ0FMTChfX05SX3VubGluaywgc3lzX3VubGluaykKKworI2RlZmluZSBfX05SX3N5bWxpbmsJCQkJODgKK19fU1lTQ0FMTChfX05SX3N5bWxpbmssIHN5c19zeW1saW5rKQorI2RlZmluZSBfX05SX3JlYWRsaW5rCQkJCTg5CitfX1NZU0NBTEwoX19OUl9yZWFkbGluaywgc3lzX3JlYWRsaW5rKQorI2RlZmluZSBfX05SX2NobW9kCQkJCTkwCitfX1NZU0NBTEwoX19OUl9jaG1vZCwgc3lzX2NobW9kKQorI2RlZmluZSBfX05SX2ZjaG1vZAkJCQk5MQorX19TWVNDQUxMKF9fTlJfZmNobW9kLCBzeXNfZmNobW9kKQorI2RlZmluZSBfX05SX2Nob3duCQkJCTkyCitfX1NZU0NBTEwoX19OUl9jaG93biwgc3lzX2Nob3duKQorI2RlZmluZSBfX05SX2ZjaG93bgkJCQk5MworX19TWVNDQUxMKF9fTlJfZmNob3duLCBzeXNfZmNob3duKQorI2RlZmluZSBfX05SX2xjaG93bgkJCQk5NAorX19TWVNDQUxMKF9fTlJfbGNob3duLCBzeXNfbGNob3duKQorI2RlZmluZSBfX05SX3VtYXNrCQkJCTk1CitfX1NZU0NBTEwoX19OUl91bWFzaywgc3lzX3VtYXNrKQorCisjZGVmaW5lIF9fTlJfZ2V0dGltZW9mZGF5CQkJOTYKK19fU1lTQ0FMTChfX05SX2dldHRpbWVvZmRheSwgc3lzX2dldHRpbWVvZmRheSkKKyNkZWZpbmUgX19OUl9nZXRybGltaXQJCQkJOTcKK19fU1lTQ0FMTChfX05SX2dldHJsaW1pdCwgc3lzX2dldHJsaW1pdCkKKyNkZWZpbmUgX19OUl9nZXRydXNhZ2UJCQkJOTgKK19fU1lTQ0FMTChfX05SX2dldHJ1c2FnZSwgc3lzX2dldHJ1c2FnZSkKKyNkZWZpbmUgX19OUl9zeXNpbmZvCQkJCTk5CitfX1NZU0NBTEwoX19OUl9zeXNpbmZvLCBzeXNfc3lzaW5mbykKKyNkZWZpbmUgX19OUl90aW1lcwkJCQkxMDAKK19fU1lTQ0FMTChfX05SX3RpbWVzLCBzeXNfdGltZXMpCisjZGVmaW5lIF9fTlJfcHRyYWNlCQkJCTEwMQorX19TWVNDQUxMKF9fTlJfcHRyYWNlLCBzeXNfcHRyYWNlKQorI2RlZmluZSBfX05SX2dldHVpZAkJCQkxMDIKK19fU1lTQ0FMTChfX05SX2dldHVpZCwgc3lzX2dldHVpZCkKKyNkZWZpbmUgX19OUl9zeXNsb2cJCQkJMTAzCitfX1NZU0NBTEwoX19OUl9zeXNsb2csIHN5c19zeXNsb2cpCisKKy8qIGF0IHRoZSB2ZXJ5IGVuZCB0aGUgc3R1ZmYgdGhhdCBuZXZlciBydW5zIGR1cmluZyB0aGUgYmVuY2htYXJrcyAqLworI2RlZmluZSBfX05SX2dldGdpZAkJCQkxMDQKK19fU1lTQ0FMTChfX05SX2dldGdpZCwgc3lzX2dldGdpZCkKKyNkZWZpbmUgX19OUl9zZXR1aWQJCQkJMTA1CitfX1NZU0NBTEwoX19OUl9zZXR1aWQsIHN5c19zZXR1aWQpCisjZGVmaW5lIF9fTlJfc2V0Z2lkCQkJCTEwNgorX19TWVNDQUxMKF9fTlJfc2V0Z2lkLCBzeXNfc2V0Z2lkKQorI2RlZmluZSBfX05SX2dldGV1aWQJCQkJMTA3CitfX1NZU0NBTEwoX19OUl9nZXRldWlkLCBzeXNfZ2V0ZXVpZCkKKyNkZWZpbmUgX19OUl9nZXRlZ2lkCQkJCTEwOAorX19TWVNDQUxMKF9fTlJfZ2V0ZWdpZCwgc3lzX2dldGVnaWQpCisjZGVmaW5lIF9fTlJfc2V0cGdpZAkJCQkxMDkKK19fU1lTQ0FMTChfX05SX3NldHBnaWQsIHN5c19zZXRwZ2lkKQorI2RlZmluZSBfX05SX2dldHBwaWQJCQkJMTEwCitfX1NZU0NBTEwoX19OUl9nZXRwcGlkLCBzeXNfZ2V0cHBpZCkKKyNkZWZpbmUgX19OUl9nZXRwZ3JwCQkJCTExMQorX19TWVNDQUxMKF9fTlJfZ2V0cGdycCwgc3lzX2dldHBncnApCisKKyNkZWZpbmUgX19OUl9zZXRzaWQJCQkJMTEyCitfX1NZU0NBTEwoX19OUl9zZXRzaWQsIHN5c19zZXRzaWQpCisjZGVmaW5lIF9fTlJfc2V0cmV1aWQJCQkJMTEzCitfX1NZU0NBTEwoX19OUl9zZXRyZXVpZCwgc3lzX3NldHJldWlkKQorI2RlZmluZSBfX05SX3NldHJlZ2lkCQkJCTExNAorX19TWVNDQUxMKF9fTlJfc2V0cmVnaWQsIHN5c19zZXRyZWdpZCkKKyNkZWZpbmUgX19OUl9nZXRncm91cHMJCQkJMTE1CitfX1NZU0NBTEwoX19OUl9nZXRncm91cHMsIHN5c19nZXRncm91cHMpCisjZGVmaW5lIF9fTlJfc2V0Z3JvdXBzCQkJCTExNgorX19TWVNDQUxMKF9fTlJfc2V0Z3JvdXBzLCBzeXNfc2V0Z3JvdXBzKQorI2RlZmluZSBfX05SX3NldHJlc3VpZAkJCQkxMTcKK19fU1lTQ0FMTChfX05SX3NldHJlc3VpZCwgc3lzX3NldHJlc3VpZCkKKyNkZWZpbmUgX19OUl9nZXRyZXN1aWQJCQkJMTE4CitfX1NZU0NBTEwoX19OUl9nZXRyZXN1aWQsIHN5c19nZXRyZXN1aWQpCisjZGVmaW5lIF9fTlJfc2V0cmVzZ2lkCQkJCTExOQorX19TWVNDQUxMKF9fTlJfc2V0cmVzZ2lkLCBzeXNfc2V0cmVzZ2lkKQorCisjZGVmaW5lIF9fTlJfZ2V0cmVzZ2lkCQkJCTEyMAorX19TWVNDQUxMKF9fTlJfZ2V0cmVzZ2lkLCBzeXNfZ2V0cmVzZ2lkKQorI2RlZmluZSBfX05SX2dldHBnaWQJCQkJMTIxCitfX1NZU0NBTEwoX19OUl9nZXRwZ2lkLCBzeXNfZ2V0cGdpZCkKKyNkZWZpbmUgX19OUl9zZXRmc3VpZAkJCQkxMjIKK19fU1lTQ0FMTChfX05SX3NldGZzdWlkLCBzeXNfc2V0ZnN1aWQpCisjZGVmaW5lIF9fTlJfc2V0ZnNnaWQJCQkJMTIzCitfX1NZU0NBTEwoX19OUl9zZXRmc2dpZCwgc3lzX3NldGZzZ2lkKQorI2RlZmluZSBfX05SX2dldHNpZAkJCQkxMjQKK19fU1lTQ0FMTChfX05SX2dldHNpZCwgc3lzX2dldHNpZCkKKyNkZWZpbmUgX19OUl9jYXBnZXQJCQkJMTI1CitfX1NZU0NBTEwoX19OUl9jYXBnZXQsIHN5c19jYXBnZXQpCisjZGVmaW5lIF9fTlJfY2Fwc2V0CQkJCTEyNgorX19TWVNDQUxMKF9fTlJfY2Fwc2V0LCBzeXNfY2Fwc2V0KQorCisjZGVmaW5lIF9fTlJfcnRfc2lncGVuZGluZwkJCTEyNworX19TWVNDQUxMKF9fTlJfcnRfc2lncGVuZGluZywgc3lzX3J0X3NpZ3BlbmRpbmcpCisjZGVmaW5lIF9fTlJfcnRfc2lndGltZWR3YWl0CQkJMTI4CitfX1NZU0NBTEwoX19OUl9ydF9zaWd0aW1lZHdhaXQsIHN5c19ydF9zaWd0aW1lZHdhaXQpCisjZGVmaW5lIF9fTlJfcnRfc2lncXVldWVpbmZvCQkJMTI5CitfX1NZU0NBTEwoX19OUl9ydF9zaWdxdWV1ZWluZm8sIHN5c19ydF9zaWdxdWV1ZWluZm8pCisjZGVmaW5lIF9fTlJfcnRfc2lnc3VzcGVuZAkJCTEzMAorX19TWVNDQUxMKF9fTlJfcnRfc2lnc3VzcGVuZCwgc3lzX3J0X3NpZ3N1c3BlbmQpCisjZGVmaW5lIF9fTlJfc2lnYWx0c3RhY2sJCQkxMzEKK19fU1lTQ0FMTChfX05SX3NpZ2FsdHN0YWNrLCBzdHViX3NpZ2FsdHN0YWNrKQorI2RlZmluZSBfX05SX3V0aW1lCQkJCTEzMgorX19TWVNDQUxMKF9fTlJfdXRpbWUsIHN5c191dGltZSkKKyNkZWZpbmUgX19OUl9ta25vZAkJCQkxMzMKK19fU1lTQ0FMTChfX05SX21rbm9kLCBzeXNfbWtub2QpCisKKy8qIE9ubHkgbmVlZGVkIGZvciBhLm91dCAqLworI2RlZmluZSBfX05SX3VzZWxpYgkJCQkxMzQKK19fU1lTQ0FMTChfX05SX3VzZWxpYiwgc3lzX25pX3N5c2NhbGwpCisjZGVmaW5lIF9fTlJfcGVyc29uYWxpdHkJCQkxMzUKK19fU1lTQ0FMTChfX05SX3BlcnNvbmFsaXR5LCBzeXNfcGVyc29uYWxpdHkpCisKKyNkZWZpbmUgX19OUl91c3RhdAkJCQkxMzYKK19fU1lTQ0FMTChfX05SX3VzdGF0LCBzeXNfdXN0YXQpCisjZGVmaW5lIF9fTlJfc3RhdGZzCQkJCTEzNworX19TWVNDQUxMKF9fTlJfc3RhdGZzLCBzeXNfc3RhdGZzKQorI2RlZmluZSBfX05SX2ZzdGF0ZnMJCQkJMTM4CitfX1NZU0NBTEwoX19OUl9mc3RhdGZzLCBzeXNfZnN0YXRmcykKKyNkZWZpbmUgX19OUl9zeXNmcwkJCQkxMzkKK19fU1lTQ0FMTChfX05SX3N5c2ZzLCBzeXNfc3lzZnMpCisKKyNkZWZpbmUgX19OUl9nZXRwcmlvcml0eQkJCTE0MAorX19TWVNDQUxMKF9fTlJfZ2V0cHJpb3JpdHksIHN5c19nZXRwcmlvcml0eSkKKyNkZWZpbmUgX19OUl9zZXRwcmlvcml0eQkJCTE0MQorX19TWVNDQUxMKF9fTlJfc2V0cHJpb3JpdHksIHN5c19zZXRwcmlvcml0eSkKKyNkZWZpbmUgX19OUl9zY2hlZF9zZXRwYXJhbQkJCTE0MgorX19TWVNDQUxMKF9fTlJfc2NoZWRfc2V0cGFyYW0sIHN5c19zY2hlZF9zZXRwYXJhbSkKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRwYXJhbQkJCTE0MworX19TWVNDQUxMKF9fTlJfc2NoZWRfZ2V0cGFyYW0sIHN5c19zY2hlZF9nZXRwYXJhbSkKKyNkZWZpbmUgX19OUl9zY2hlZF9zZXRzY2hlZHVsZXIJCQkxNDQKK19fU1lTQ0FMTChfX05SX3NjaGVkX3NldHNjaGVkdWxlciwgc3lzX3NjaGVkX3NldHNjaGVkdWxlcikKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRzY2hlZHVsZXIJCQkxNDUKK19fU1lTQ0FMTChfX05SX3NjaGVkX2dldHNjaGVkdWxlciwgc3lzX3NjaGVkX2dldHNjaGVkdWxlcikKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRfcHJpb3JpdHlfbWF4CQkxNDYKK19fU1lTQ0FMTChfX05SX3NjaGVkX2dldF9wcmlvcml0eV9tYXgsIHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWF4KQorI2RlZmluZSBfX05SX3NjaGVkX2dldF9wcmlvcml0eV9taW4JCTE0NworX19TWVNDQUxMKF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiwgc3lzX3NjaGVkX2dldF9wcmlvcml0eV9taW4pCisjZGVmaW5lIF9fTlJfc2NoZWRfcnJfZ2V0X2ludGVydmFsCQkxNDgKK19fU1lTQ0FMTChfX05SX3NjaGVkX3JyX2dldF9pbnRlcnZhbCwgc3lzX3NjaGVkX3JyX2dldF9pbnRlcnZhbCkKKworI2RlZmluZSBfX05SX21sb2NrCQkJCTE0OQorX19TWVNDQUxMKF9fTlJfbWxvY2ssIHN5c19tbG9jaykKKyNkZWZpbmUgX19OUl9tdW5sb2NrCQkJCTE1MAorX19TWVNDQUxMKF9fTlJfbXVubG9jaywgc3lzX211bmxvY2spCisjZGVmaW5lIF9fTlJfbWxvY2thbGwJCQkJMTUxCitfX1NZU0NBTEwoX19OUl9tbG9ja2FsbCwgc3lzX21sb2NrYWxsKQorI2RlZmluZSBfX05SX211bmxvY2thbGwJCQkJMTUyCitfX1NZU0NBTEwoX19OUl9tdW5sb2NrYWxsLCBzeXNfbXVubG9ja2FsbCkKKworI2RlZmluZSBfX05SX3ZoYW5ndXAJCQkJMTUzCitfX1NZU0NBTEwoX19OUl92aGFuZ3VwLCBzeXNfdmhhbmd1cCkKKworI2RlZmluZSBfX05SX21vZGlmeV9sZHQJCQkJMTU0CitfX1NZU0NBTEwoX19OUl9tb2RpZnlfbGR0LCBzeXNfbW9kaWZ5X2xkdCkKKworI2RlZmluZSBfX05SX3Bpdm90X3Jvb3QJCQkJMTU1CitfX1NZU0NBTEwoX19OUl9waXZvdF9yb290LCBzeXNfcGl2b3Rfcm9vdCkKKworI2RlZmluZSBfX05SX19zeXNjdGwJCQkJMTU2CitfX1NZU0NBTEwoX19OUl9fc3lzY3RsLCBzeXNfc3lzY3RsKQorCisjZGVmaW5lIF9fTlJfcHJjdGwJCQkJMTU3CitfX1NZU0NBTEwoX19OUl9wcmN0bCwgc3lzX3ByY3RsKQorI2RlZmluZSBfX05SX2FyY2hfcHJjdGwJCQkJMTU4CitfX1NZU0NBTEwoX19OUl9hcmNoX3ByY3RsLCBzeXNfYXJjaF9wcmN0bCkKKworI2RlZmluZSBfX05SX2FkanRpbWV4CQkJCTE1OQorX19TWVNDQUxMKF9fTlJfYWRqdGltZXgsIHN5c19hZGp0aW1leCkKKworI2RlZmluZSBfX05SX3NldHJsaW1pdAkJCQkxNjAKK19fU1lTQ0FMTChfX05SX3NldHJsaW1pdCwgc3lzX3NldHJsaW1pdCkKKworI2RlZmluZSBfX05SX2Nocm9vdAkJCQkxNjEKK19fU1lTQ0FMTChfX05SX2Nocm9vdCwgc3lzX2Nocm9vdCkKKworI2RlZmluZSBfX05SX3N5bmMJCQkJMTYyCitfX1NZU0NBTEwoX19OUl9zeW5jLCBzeXNfc3luYykKKworI2RlZmluZSBfX05SX2FjY3QJCQkJMTYzCitfX1NZU0NBTEwoX19OUl9hY2N0LCBzeXNfYWNjdCkKKworI2RlZmluZSBfX05SX3NldHRpbWVvZmRheQkJCTE2NAorX19TWVNDQUxMKF9fTlJfc2V0dGltZW9mZGF5LCBzeXNfc2V0dGltZW9mZGF5KQorCisjZGVmaW5lIF9fTlJfbW91bnQJCQkJMTY1CitfX1NZU0NBTEwoX19OUl9tb3VudCwgc3lzX21vdW50KQorI2RlZmluZSBfX05SX3Vtb3VudDIJCQkJMTY2CitfX1NZU0NBTEwoX19OUl91bW91bnQyLCBzeXNfdW1vdW50KQorCisjZGVmaW5lIF9fTlJfc3dhcG9uCQkJCTE2NworX19TWVNDQUxMKF9fTlJfc3dhcG9uLCBzeXNfc3dhcG9uKQorI2RlZmluZSBfX05SX3N3YXBvZmYJCQkJMTY4CitfX1NZU0NBTEwoX19OUl9zd2Fwb2ZmLCBzeXNfc3dhcG9mZikKKworI2RlZmluZSBfX05SX3JlYm9vdAkJCQkxNjkKK19fU1lTQ0FMTChfX05SX3JlYm9vdCwgc3lzX3JlYm9vdCkKKworI2RlZmluZSBfX05SX3NldGhvc3RuYW1lCQkJMTcwCitfX1NZU0NBTEwoX19OUl9zZXRob3N0bmFtZSwgc3lzX3NldGhvc3RuYW1lKQorI2RlZmluZSBfX05SX3NldGRvbWFpbm5hbWUJCQkxNzEKK19fU1lTQ0FMTChfX05SX3NldGRvbWFpbm5hbWUsIHN5c19zZXRkb21haW5uYW1lKQorCisjZGVmaW5lIF9fTlJfaW9wbAkJCQkxNzIKK19fU1lTQ0FMTChfX05SX2lvcGwsIHN0dWJfaW9wbCkKKyNkZWZpbmUgX19OUl9pb3Blcm0JCQkJMTczCitfX1NZU0NBTEwoX19OUl9pb3Blcm0sIHN5c19pb3Blcm0pCisKKyNkZWZpbmUgX19OUl9jcmVhdGVfbW9kdWxlCQkJMTc0CitfX1NZU0NBTEwoX19OUl9jcmVhdGVfbW9kdWxlLCBzeXNfbmlfc3lzY2FsbCkKKyNkZWZpbmUgX19OUl9pbml0X21vZHVsZQkJCTE3NQorX19TWVNDQUxMKF9fTlJfaW5pdF9tb2R1bGUsIHN5c19pbml0X21vZHVsZSkKKyNkZWZpbmUgX19OUl9kZWxldGVfbW9kdWxlCQkJMTc2CitfX1NZU0NBTEwoX19OUl9kZWxldGVfbW9kdWxlLCBzeXNfZGVsZXRlX21vZHVsZSkKKyNkZWZpbmUgX19OUl9nZXRfa2VybmVsX3N5bXMJCQkxNzcKK19fU1lTQ0FMTChfX05SX2dldF9rZXJuZWxfc3ltcywgc3lzX25pX3N5c2NhbGwpCisjZGVmaW5lIF9fTlJfcXVlcnlfbW9kdWxlCQkJMTc4CitfX1NZU0NBTEwoX19OUl9xdWVyeV9tb2R1bGUsIHN5c19uaV9zeXNjYWxsKQorCisjZGVmaW5lIF9fTlJfcXVvdGFjdGwJCQkJMTc5CitfX1NZU0NBTEwoX19OUl9xdW90YWN0bCwgc3lzX3F1b3RhY3RsKQorCisjZGVmaW5lIF9fTlJfbmZzc2VydmN0bAkJCQkxODAKK19fU1lTQ0FMTChfX05SX25mc3NlcnZjdGwsIHN5c19uaV9zeXNjYWxsKQorCisvKiByZXNlcnZlZCBmb3IgTGlTL1NUUkVBTVMgKi8KKyNkZWZpbmUgX19OUl9nZXRwbXNnCQkJCTE4MQorX19TWVNDQUxMKF9fTlJfZ2V0cG1zZywgc3lzX25pX3N5c2NhbGwpCisjZGVmaW5lIF9fTlJfcHV0cG1zZwkJCQkxODIKK19fU1lTQ0FMTChfX05SX3B1dHBtc2csIHN5c19uaV9zeXNjYWxsKQorCisvKiByZXNlcnZlZCBmb3IgQUZTICovCisjZGVmaW5lIF9fTlJfYWZzX3N5c2NhbGwJCQkxODMKK19fU1lTQ0FMTChfX05SX2Fmc19zeXNjYWxsLCBzeXNfbmlfc3lzY2FsbCkKKworLyogcmVzZXJ2ZWQgZm9yIHR1eCAqLworI2RlZmluZSBfX05SX3R1eGNhbGwJCQkJMTg0CitfX1NZU0NBTEwoX19OUl90dXhjYWxsLCBzeXNfbmlfc3lzY2FsbCkKKworI2RlZmluZSBfX05SX3NlY3VyaXR5CQkJCTE4NQorX19TWVNDQUxMKF9fTlJfc2VjdXJpdHksIHN5c19uaV9zeXNjYWxsKQorCisjZGVmaW5lIF9fTlJfZ2V0dGlkCQkJCTE4NgorX19TWVNDQUxMKF9fTlJfZ2V0dGlkLCBzeXNfZ2V0dGlkKQorCisjZGVmaW5lIF9fTlJfcmVhZGFoZWFkCQkJCTE4NworX19TWVNDQUxMKF9fTlJfcmVhZGFoZWFkLCBzeXNfcmVhZGFoZWFkKQorI2RlZmluZSBfX05SX3NldHhhdHRyCQkJCTE4OAorX19TWVNDQUxMKF9fTlJfc2V0eGF0dHIsIHN5c19zZXR4YXR0cikKKyNkZWZpbmUgX19OUl9sc2V0eGF0dHIJCQkJMTg5CitfX1NZU0NBTEwoX19OUl9sc2V0eGF0dHIsIHN5c19sc2V0eGF0dHIpCisjZGVmaW5lIF9fTlJfZnNldHhhdHRyCQkJCTE5MAorX19TWVNDQUxMKF9fTlJfZnNldHhhdHRyLCBzeXNfZnNldHhhdHRyKQorI2RlZmluZSBfX05SX2dldHhhdHRyCQkJCTE5MQorX19TWVNDQUxMKF9fTlJfZ2V0eGF0dHIsIHN5c19nZXR4YXR0cikKKyNkZWZpbmUgX19OUl9sZ2V0eGF0dHIJCQkJMTkyCitfX1NZU0NBTEwoX19OUl9sZ2V0eGF0dHIsIHN5c19sZ2V0eGF0dHIpCisjZGVmaW5lIF9fTlJfZmdldHhhdHRyCQkJCTE5MworX19TWVNDQUxMKF9fTlJfZmdldHhhdHRyLCBzeXNfZmdldHhhdHRyKQorI2RlZmluZSBfX05SX2xpc3R4YXR0cgkJCQkxOTQKK19fU1lTQ0FMTChfX05SX2xpc3R4YXR0ciwgc3lzX2xpc3R4YXR0cikKKyNkZWZpbmUgX19OUl9sbGlzdHhhdHRyCQkJCTE5NQorX19TWVNDQUxMKF9fTlJfbGxpc3R4YXR0ciwgc3lzX2xsaXN0eGF0dHIpCisjZGVmaW5lIF9fTlJfZmxpc3R4YXR0cgkJCQkxOTYKK19fU1lTQ0FMTChfX05SX2ZsaXN0eGF0dHIsIHN5c19mbGlzdHhhdHRyKQorI2RlZmluZSBfX05SX3JlbW92ZXhhdHRyCQkJMTk3CitfX1NZU0NBTEwoX19OUl9yZW1vdmV4YXR0ciwgc3lzX3JlbW92ZXhhdHRyKQorI2RlZmluZSBfX05SX2xyZW1vdmV4YXR0cgkJCTE5OAorX19TWVNDQUxMKF9fTlJfbHJlbW92ZXhhdHRyLCBzeXNfbHJlbW92ZXhhdHRyKQorI2RlZmluZSBfX05SX2ZyZW1vdmV4YXR0cgkJCTE5OQorX19TWVNDQUxMKF9fTlJfZnJlbW92ZXhhdHRyLCBzeXNfZnJlbW92ZXhhdHRyKQorI2RlZmluZSBfX05SX3RraWxsCQkJCTIwMAorX19TWVNDQUxMKF9fTlJfdGtpbGwsIHN5c190a2lsbCkKKyNkZWZpbmUgX19OUl90aW1lCQkJCTIwMQorX19TWVNDQUxMKF9fTlJfdGltZSwgc3lzX3RpbWUpCisjZGVmaW5lIF9fTlJfZnV0ZXgJCQkJMjAyCitfX1NZU0NBTEwoX19OUl9mdXRleCwgc3lzX2Z1dGV4KQorI2RlZmluZSBfX05SX3NjaGVkX3NldGFmZmluaXR5CQkJMjAzCitfX1NZU0NBTEwoX19OUl9zY2hlZF9zZXRhZmZpbml0eSwgc3lzX3NjaGVkX3NldGFmZmluaXR5KQorI2RlZmluZSBfX05SX3NjaGVkX2dldGFmZmluaXR5CQkJMjA0CitfX1NZU0NBTEwoX19OUl9zY2hlZF9nZXRhZmZpbml0eSwgc3lzX3NjaGVkX2dldGFmZmluaXR5KQorI2RlZmluZSBfX05SX3NldF90aHJlYWRfYXJlYQkJCTIwNQorX19TWVNDQUxMKF9fTlJfc2V0X3RocmVhZF9hcmVhLCBzeXNfbmlfc3lzY2FsbCkJLyogdXNlIGFyY2hfcHJjdGwgKi8KKyNkZWZpbmUgX19OUl9pb19zZXR1cAkJCQkyMDYKK19fU1lTQ0FMTChfX05SX2lvX3NldHVwLCBzeXNfaW9fc2V0dXApCisjZGVmaW5lIF9fTlJfaW9fZGVzdHJveQkJCQkyMDcKK19fU1lTQ0FMTChfX05SX2lvX2Rlc3Ryb3ksIHN5c19pb19kZXN0cm95KQorI2RlZmluZSBfX05SX2lvX2dldGV2ZW50cwkJCTIwOAorX19TWVNDQUxMKF9fTlJfaW9fZ2V0ZXZlbnRzLCBzeXNfaW9fZ2V0ZXZlbnRzKQorI2RlZmluZSBfX05SX2lvX3N1Ym1pdAkJCQkyMDkKK19fU1lTQ0FMTChfX05SX2lvX3N1Ym1pdCwgc3lzX2lvX3N1Ym1pdCkKKyNkZWZpbmUgX19OUl9pb19jYW5jZWwJCQkJMjEwCitfX1NZU0NBTEwoX19OUl9pb19jYW5jZWwsIHN5c19pb19jYW5jZWwpCisjZGVmaW5lIF9fTlJfZ2V0X3RocmVhZF9hcmVhCQkJMjExCitfX1NZU0NBTEwoX19OUl9nZXRfdGhyZWFkX2FyZWEsIHN5c19uaV9zeXNjYWxsKQkvKiB1c2UgYXJjaF9wcmN0bCAqLworI2RlZmluZSBfX05SX2xvb2t1cF9kY29va2llCQkJMjEyCitfX1NZU0NBTEwoX19OUl9sb29rdXBfZGNvb2tpZSwgc3lzX2xvb2t1cF9kY29va2llKQorI2RlZmluZSBfX05SX2Vwb2xsX2NyZWF0ZQkJCTIxMworX19TWVNDQUxMKF9fTlJfZXBvbGxfY3JlYXRlLCBzeXNfZXBvbGxfY3JlYXRlKQorI2RlZmluZSBfX05SX2Vwb2xsX2N0bF9vbGQJCQkyMTQKK19fU1lTQ0FMTChfX05SX2Vwb2xsX2N0bF9vbGQsIHN5c19uaV9zeXNjYWxsKQorI2RlZmluZSBfX05SX2Vwb2xsX3dhaXRfb2xkCQkJMjE1CitfX1NZU0NBTEwoX19OUl9lcG9sbF93YWl0X29sZCwgc3lzX25pX3N5c2NhbGwpCisjZGVmaW5lIF9fTlJfcmVtYXBfZmlsZV9wYWdlcwkJCTIxNgorX19TWVNDQUxMKF9fTlJfcmVtYXBfZmlsZV9wYWdlcywgc3lzX3JlbWFwX2ZpbGVfcGFnZXMpCisjZGVmaW5lIF9fTlJfZ2V0ZGVudHM2NAkJCQkyMTcKK19fU1lTQ0FMTChfX05SX2dldGRlbnRzNjQsIHN5c19nZXRkZW50czY0KQorI2RlZmluZSBfX05SX3NldF90aWRfYWRkcmVzcwkJCTIxOAorX19TWVNDQUxMKF9fTlJfc2V0X3RpZF9hZGRyZXNzLCBzeXNfc2V0X3RpZF9hZGRyZXNzKQorI2RlZmluZSBfX05SX3Jlc3RhcnRfc3lzY2FsbAkJCTIxOQorX19TWVNDQUxMKF9fTlJfcmVzdGFydF9zeXNjYWxsLCBzeXNfcmVzdGFydF9zeXNjYWxsKQorI2RlZmluZSBfX05SX3NlbXRpbWVkb3AJCQkJMjIwCitfX1NZU0NBTEwoX19OUl9zZW10aW1lZG9wLCBzeXNfc2VtdGltZWRvcCkKKyNkZWZpbmUgX19OUl9mYWR2aXNlNjQJCQkJMjIxCitfX1NZU0NBTEwoX19OUl9mYWR2aXNlNjQsIHN5c19mYWR2aXNlNjQpCisjZGVmaW5lIF9fTlJfdGltZXJfY3JlYXRlCQkJMjIyCitfX1NZU0NBTEwoX19OUl90aW1lcl9jcmVhdGUsIHN5c190aW1lcl9jcmVhdGUpCisjZGVmaW5lIF9fTlJfdGltZXJfc2V0dGltZQkJCTIyMworX19TWVNDQUxMKF9fTlJfdGltZXJfc2V0dGltZSwgc3lzX3RpbWVyX3NldHRpbWUpCisjZGVmaW5lIF9fTlJfdGltZXJfZ2V0dGltZQkJCTIyNAorX19TWVNDQUxMKF9fTlJfdGltZXJfZ2V0dGltZSwgc3lzX3RpbWVyX2dldHRpbWUpCisjZGVmaW5lIF9fTlJfdGltZXJfZ2V0b3ZlcnJ1bgkJCTIyNQorX19TWVNDQUxMKF9fTlJfdGltZXJfZ2V0b3ZlcnJ1biwgc3lzX3RpbWVyX2dldG92ZXJydW4pCisjZGVmaW5lIF9fTlJfdGltZXJfZGVsZXRlCQkJMjI2CitfX1NZU0NBTEwoX19OUl90aW1lcl9kZWxldGUsIHN5c190aW1lcl9kZWxldGUpCisjZGVmaW5lIF9fTlJfY2xvY2tfc2V0dGltZQkJCTIyNworX19TWVNDQUxMKF9fTlJfY2xvY2tfc2V0dGltZSwgc3lzX2Nsb2NrX3NldHRpbWUpCisjZGVmaW5lIF9fTlJfY2xvY2tfZ2V0dGltZQkJCTIyOAorX19TWVNDQUxMKF9fTlJfY2xvY2tfZ2V0dGltZSwgc3lzX2Nsb2NrX2dldHRpbWUpCisjZGVmaW5lIF9fTlJfY2xvY2tfZ2V0cmVzCQkJMjI5CitfX1NZU0NBTEwoX19OUl9jbG9ja19nZXRyZXMsIHN5c19jbG9ja19nZXRyZXMpCisjZGVmaW5lIF9fTlJfY2xvY2tfbmFub3NsZWVwCQkJMjMwCitfX1NZU0NBTEwoX19OUl9jbG9ja19uYW5vc2xlZXAsIHN5c19jbG9ja19uYW5vc2xlZXApCisjZGVmaW5lIF9fTlJfZXhpdF9ncm91cAkJCQkyMzEKK19fU1lTQ0FMTChfX05SX2V4aXRfZ3JvdXAsIHN5c19leGl0X2dyb3VwKQorI2RlZmluZSBfX05SX2Vwb2xsX3dhaXQJCQkJMjMyCitfX1NZU0NBTEwoX19OUl9lcG9sbF93YWl0LCBzeXNfZXBvbGxfd2FpdCkKKyNkZWZpbmUgX19OUl9lcG9sbF9jdGwJCQkJMjMzCitfX1NZU0NBTEwoX19OUl9lcG9sbF9jdGwsIHN5c19lcG9sbF9jdGwpCisjZGVmaW5lIF9fTlJfdGdraWxsCQkJCTIzNAorX19TWVNDQUxMKF9fTlJfdGdraWxsLCBzeXNfdGdraWxsKQorI2RlZmluZSBfX05SX3V0aW1lcwkJCQkyMzUKK19fU1lTQ0FMTChfX05SX3V0aW1lcywgc3lzX3V0aW1lcykKKyNkZWZpbmUgX19OUl92c2VydmVyCQkJCTIzNgorX19TWVNDQUxMKF9fTlJfdnNlcnZlciwgc3lzX25pX3N5c2NhbGwpCisjZGVmaW5lIF9fTlJfbWJpbmQJCQkJMjM3CitfX1NZU0NBTEwoX19OUl9tYmluZCwgc3lzX21iaW5kKQorI2RlZmluZSBfX05SX3NldF9tZW1wb2xpY3kJCQkyMzgKK19fU1lTQ0FMTChfX05SX3NldF9tZW1wb2xpY3ksIHN5c19zZXRfbWVtcG9saWN5KQorI2RlZmluZSBfX05SX2dldF9tZW1wb2xpY3kJCQkyMzkKK19fU1lTQ0FMTChfX05SX2dldF9tZW1wb2xpY3ksIHN5c19nZXRfbWVtcG9saWN5KQorI2RlZmluZSBfX05SX21xX29wZW4JCQkJMjQwCitfX1NZU0NBTEwoX19OUl9tcV9vcGVuLCBzeXNfbXFfb3BlbikKKyNkZWZpbmUgX19OUl9tcV91bmxpbmsJCQkJMjQxCitfX1NZU0NBTEwoX19OUl9tcV91bmxpbmssIHN5c19tcV91bmxpbmspCisjZGVmaW5lIF9fTlJfbXFfdGltZWRzZW5kCQkJMjQyCitfX1NZU0NBTEwoX19OUl9tcV90aW1lZHNlbmQsIHN5c19tcV90aW1lZHNlbmQpCisjZGVmaW5lIF9fTlJfbXFfdGltZWRyZWNlaXZlCQkJMjQzCitfX1NZU0NBTEwoX19OUl9tcV90aW1lZHJlY2VpdmUsIHN5c19tcV90aW1lZHJlY2VpdmUpCisjZGVmaW5lIF9fTlJfbXFfbm90aWZ5CQkJCTI0NAorX19TWVNDQUxMKF9fTlJfbXFfbm90aWZ5LCBzeXNfbXFfbm90aWZ5KQorI2RlZmluZSBfX05SX21xX2dldHNldGF0dHIJCQkyNDUKK19fU1lTQ0FMTChfX05SX21xX2dldHNldGF0dHIsIHN5c19tcV9nZXRzZXRhdHRyKQorI2RlZmluZSBfX05SX2tleGVjX2xvYWQJCQkJMjQ2CitfX1NZU0NBTEwoX19OUl9rZXhlY19sb2FkLCBzeXNfa2V4ZWNfbG9hZCkKKyNkZWZpbmUgX19OUl93YWl0aWQJCQkJMjQ3CitfX1NZU0NBTEwoX19OUl93YWl0aWQsIHN5c193YWl0aWQpCisjZGVmaW5lIF9fTlJfYWRkX2tleQkJCQkyNDgKK19fU1lTQ0FMTChfX05SX2FkZF9rZXksIHN5c19hZGRfa2V5KQorI2RlZmluZSBfX05SX3JlcXVlc3Rfa2V5CQkJMjQ5CitfX1NZU0NBTEwoX19OUl9yZXF1ZXN0X2tleSwgc3lzX3JlcXVlc3Rfa2V5KQorI2RlZmluZSBfX05SX2tleWN0bAkJCQkyNTAKK19fU1lTQ0FMTChfX05SX2tleWN0bCwgc3lzX2tleWN0bCkKKyNkZWZpbmUgX19OUl9pb3ByaW9fc2V0CQkJCTI1MQorX19TWVNDQUxMKF9fTlJfaW9wcmlvX3NldCwgc3lzX2lvcHJpb19zZXQpCisjZGVmaW5lIF9fTlJfaW9wcmlvX2dldAkJCQkyNTIKK19fU1lTQ0FMTChfX05SX2lvcHJpb19nZXQsIHN5c19pb3ByaW9fZ2V0KQorI2RlZmluZSBfX05SX2lub3RpZnlfaW5pdAkJCTI1MworX19TWVNDQUxMKF9fTlJfaW5vdGlmeV9pbml0LCBzeXNfaW5vdGlmeV9pbml0KQorI2RlZmluZSBfX05SX2lub3RpZnlfYWRkX3dhdGNoCQkJMjU0CitfX1NZU0NBTEwoX19OUl9pbm90aWZ5X2FkZF93YXRjaCwgc3lzX2lub3RpZnlfYWRkX3dhdGNoKQorI2RlZmluZSBfX05SX2lub3RpZnlfcm1fd2F0Y2gJCQkyNTUKK19fU1lTQ0FMTChfX05SX2lub3RpZnlfcm1fd2F0Y2gsIHN5c19pbm90aWZ5X3JtX3dhdGNoKQorI2RlZmluZSBfX05SX21pZ3JhdGVfcGFnZXMJCQkyNTYKK19fU1lTQ0FMTChfX05SX21pZ3JhdGVfcGFnZXMsIHN5c19taWdyYXRlX3BhZ2VzKQorI2RlZmluZSBfX05SX29wZW5hdAkJCQkyNTcKK19fU1lTQ0FMTChfX05SX29wZW5hdCwgc3lzX29wZW5hdCkKKyNkZWZpbmUgX19OUl9ta2RpcmF0CQkJCTI1OAorX19TWVNDQUxMKF9fTlJfbWtkaXJhdCwgc3lzX21rZGlyYXQpCisjZGVmaW5lIF9fTlJfbWtub2RhdAkJCQkyNTkKK19fU1lTQ0FMTChfX05SX21rbm9kYXQsIHN5c19ta25vZGF0KQorI2RlZmluZSBfX05SX2ZjaG93bmF0CQkJCTI2MAorX19TWVNDQUxMKF9fTlJfZmNob3duYXQsIHN5c19mY2hvd25hdCkKKyNkZWZpbmUgX19OUl9mdXRpbWVzYXQJCQkJMjYxCitfX1NZU0NBTEwoX19OUl9mdXRpbWVzYXQsIHN5c19mdXRpbWVzYXQpCisjZGVmaW5lIF9fTlJfbmV3ZnN0YXRhdAkJCQkyNjIKK19fU1lTQ0FMTChfX05SX25ld2ZzdGF0YXQsIHN5c19uZXdmc3RhdGF0KQorI2RlZmluZSBfX05SX3VubGlua2F0CQkJCTI2MworX19TWVNDQUxMKF9fTlJfdW5saW5rYXQsIHN5c191bmxpbmthdCkKKyNkZWZpbmUgX19OUl9yZW5hbWVhdAkJCQkyNjQKK19fU1lTQ0FMTChfX05SX3JlbmFtZWF0LCBzeXNfcmVuYW1lYXQpCisjZGVmaW5lIF9fTlJfbGlua2F0CQkJCTI2NQorX19TWVNDQUxMKF9fTlJfbGlua2F0LCBzeXNfbGlua2F0KQorI2RlZmluZSBfX05SX3N5bWxpbmthdAkJCQkyNjYKK19fU1lTQ0FMTChfX05SX3N5bWxpbmthdCwgc3lzX3N5bWxpbmthdCkKKyNkZWZpbmUgX19OUl9yZWFkbGlua2F0CQkJCTI2NworX19TWVNDQUxMKF9fTlJfcmVhZGxpbmthdCwgc3lzX3JlYWRsaW5rYXQpCisjZGVmaW5lIF9fTlJfZmNobW9kYXQJCQkJMjY4CitfX1NZU0NBTEwoX19OUl9mY2htb2RhdCwgc3lzX2ZjaG1vZGF0KQorI2RlZmluZSBfX05SX2ZhY2Nlc3NhdAkJCQkyNjkKK19fU1lTQ0FMTChfX05SX2ZhY2Nlc3NhdCwgc3lzX2ZhY2Nlc3NhdCkKKyNkZWZpbmUgX19OUl9wc2VsZWN0NgkJCQkyNzAKK19fU1lTQ0FMTChfX05SX3BzZWxlY3Q2LCBzeXNfcHNlbGVjdDYpCisjZGVmaW5lIF9fTlJfcHBvbGwJCQkJMjcxCitfX1NZU0NBTEwoX19OUl9wcG9sbCwJc3lzX3Bwb2xsKQorI2RlZmluZSBfX05SX3Vuc2hhcmUJCQkJMjcyCitfX1NZU0NBTEwoX19OUl91bnNoYXJlLAlzeXNfdW5zaGFyZSkKKyNkZWZpbmUgX19OUl9zZXRfcm9idXN0X2xpc3QJCQkyNzMKK19fU1lTQ0FMTChfX05SX3NldF9yb2J1c3RfbGlzdCwgc3lzX3NldF9yb2J1c3RfbGlzdCkKKyNkZWZpbmUgX19OUl9nZXRfcm9idXN0X2xpc3QJCQkyNzQKK19fU1lTQ0FMTChfX05SX2dldF9yb2J1c3RfbGlzdCwgc3lzX2dldF9yb2J1c3RfbGlzdCkKKyNkZWZpbmUgX19OUl9zcGxpY2UJCQkJMjc1CitfX1NZU0NBTEwoX19OUl9zcGxpY2UsIHN5c19zcGxpY2UpCisjZGVmaW5lIF9fTlJfdGVlCQkJCTI3NgorX19TWVNDQUxMKF9fTlJfdGVlLCBzeXNfdGVlKQorI2RlZmluZSBfX05SX3N5bmNfZmlsZV9yYW5nZQkJCTI3NworX19TWVNDQUxMKF9fTlJfc3luY19maWxlX3JhbmdlLCBzeXNfc3luY19maWxlX3JhbmdlKQorI2RlZmluZSBfX05SX3Ztc3BsaWNlCQkJCTI3OAorX19TWVNDQUxMKF9fTlJfdm1zcGxpY2UsIHN5c192bXNwbGljZSkKKyNkZWZpbmUgX19OUl9tb3ZlX3BhZ2VzCQkJCTI3OQorX19TWVNDQUxMKF9fTlJfbW92ZV9wYWdlcywgc3lzX21vdmVfcGFnZXMpCisjZGVmaW5lIF9fTlJfdXRpbWVuc2F0CQkJCTI4MAorX19TWVNDQUxMKF9fTlJfdXRpbWVuc2F0LCBzeXNfdXRpbWVuc2F0KQorI2RlZmluZSBfX05SX2Vwb2xsX3B3YWl0CQkJMjgxCitfX1NZU0NBTEwoX19OUl9lcG9sbF9wd2FpdCwgc3lzX2Vwb2xsX3B3YWl0KQorI2RlZmluZSBfX05SX3NpZ25hbGZkCQkJCTI4MgorX19TWVNDQUxMKF9fTlJfc2lnbmFsZmQsIHN5c19zaWduYWxmZCkKKyNkZWZpbmUgX19OUl90aW1lcmZkX2NyZWF0ZQkJCTI4MworX19TWVNDQUxMKF9fTlJfdGltZXJmZF9jcmVhdGUsIHN5c190aW1lcmZkX2NyZWF0ZSkKKyNkZWZpbmUgX19OUl9ldmVudGZkCQkJCTI4NAorX19TWVNDQUxMKF9fTlJfZXZlbnRmZCwgc3lzX2V2ZW50ZmQpCisjZGVmaW5lIF9fTlJfZmFsbG9jYXRlCQkJCTI4NQorX19TWVNDQUxMKF9fTlJfZmFsbG9jYXRlLCBzeXNfZmFsbG9jYXRlKQorI2RlZmluZSBfX05SX3RpbWVyZmRfc2V0dGltZQkJCTI4NgorX19TWVNDQUxMKF9fTlJfdGltZXJmZF9zZXR0aW1lLCBzeXNfdGltZXJmZF9zZXR0aW1lKQorI2RlZmluZSBfX05SX3RpbWVyZmRfZ2V0dGltZQkJCTI4NworX19TWVNDQUxMKF9fTlJfdGltZXJmZF9nZXR0aW1lLCBzeXNfdGltZXJmZF9nZXR0aW1lKQorI2RlZmluZSBfX05SX2FjY2VwdDQJCQkJMjg4CitfX1NZU0NBTEwoX19OUl9hY2NlcHQ0LCBzeXNfYWNjZXB0NCkKKyNkZWZpbmUgX19OUl9zaWduYWxmZDQJCQkJMjg5CitfX1NZU0NBTEwoX19OUl9zaWduYWxmZDQsIHN5c19zaWduYWxmZDQpCisjZGVmaW5lIF9fTlJfZXZlbnRmZDIJCQkJMjkwCitfX1NZU0NBTEwoX19OUl9ldmVudGZkMiwgc3lzX2V2ZW50ZmQyKQorI2RlZmluZSBfX05SX2Vwb2xsX2NyZWF0ZTEJCQkyOTEKK19fU1lTQ0FMTChfX05SX2Vwb2xsX2NyZWF0ZTEsIHN5c19lcG9sbF9jcmVhdGUxKQorI2RlZmluZSBfX05SX2R1cDMJCQkJMjkyCitfX1NZU0NBTEwoX19OUl9kdXAzLCBzeXNfZHVwMykKKyNkZWZpbmUgX19OUl9waXBlMgkJCQkyOTMKK19fU1lTQ0FMTChfX05SX3BpcGUyLCBzeXNfcGlwZTIpCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9pbml0MQkJCTI5NAorX19TWVNDQUxMKF9fTlJfaW5vdGlmeV9pbml0MSwgc3lzX2lub3RpZnlfaW5pdDEpCisjZGVmaW5lIF9fTlJfcHJlYWR2CQkJCTI5NQorX19TWVNDQUxMKF9fTlJfcHJlYWR2LCBzeXNfcHJlYWR2KQorI2RlZmluZSBfX05SX3B3cml0ZXYJCQkJMjk2CitfX1NZU0NBTEwoX19OUl9wd3JpdGV2LCBzeXNfcHdyaXRldikKKyNkZWZpbmUgX19OUl9ydF90Z3NpZ3F1ZXVlaW5mbwkJCTI5NworX19TWVNDQUxMKF9fTlJfcnRfdGdzaWdxdWV1ZWluZm8sIHN5c19ydF90Z3NpZ3F1ZXVlaW5mbykKKyNkZWZpbmUgX19OUl9wZXJmX2V2ZW50X29wZW4JCQkyOTgKK19fU1lTQ0FMTChfX05SX3BlcmZfZXZlbnRfb3Blbiwgc3lzX3BlcmZfZXZlbnRfb3BlbikKKyNkZWZpbmUgX19OUl9yZWN2bW1zZwkJCQkyOTkKK19fU1lTQ0FMTChfX05SX3JlY3ZtbXNnLCBzeXNfcmVjdm1tc2cpCisjZGVmaW5lIF9fTlJfZmFub3RpZnlfaW5pdAkJCTMwMAorX19TWVNDQUxMKF9fTlJfZmFub3RpZnlfaW5pdCwgc3lzX2Zhbm90aWZ5X2luaXQpCisjZGVmaW5lIF9fTlJfZmFub3RpZnlfbWFyawkJCTMwMQorX19TWVNDQUxMKF9fTlJfZmFub3RpZnlfbWFyaywgc3lzX2Zhbm90aWZ5X21hcmspCisjZGVmaW5lIF9fTlJfcHJsaW1pdDY0CQkJCTMwMgorX19TWVNDQUxMKF9fTlJfcHJsaW1pdDY0LCBzeXNfcHJsaW1pdDY0KQorI2RlZmluZSBfX05SX25hbWVfdG9faGFuZGxlX2F0CQkJMzAzCitfX1NZU0NBTEwoX19OUl9uYW1lX3RvX2hhbmRsZV9hdCwgc3lzX25hbWVfdG9faGFuZGxlX2F0KQorI2RlZmluZSBfX05SX29wZW5fYnlfaGFuZGxlX2F0CQkJMzA0CitfX1NZU0NBTEwoX19OUl9vcGVuX2J5X2hhbmRsZV9hdCwgc3lzX29wZW5fYnlfaGFuZGxlX2F0KQorI2RlZmluZSBfX05SX2Nsb2NrX2FkanRpbWUJCQkzMDUKK19fU1lTQ0FMTChfX05SX2Nsb2NrX2FkanRpbWUsIHN5c19jbG9ja19hZGp0aW1lKQorI2RlZmluZSBfX05SX3N5bmNmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA2CitfX1NZU0NBTEwoX19OUl9zeW5jZnMsIHN5c19zeW5jZnMpCisjZGVmaW5lIF9fTlJfc2VuZG1tc2cJCQkJMzA3CitfX1NZU0NBTEwoX19OUl9zZW5kbW1zZywgc3lzX3NlbmRtbXNnKQorI2RlZmluZSBfX05SX3NldG5zCQkJCTMwOAorX19TWVNDQUxMKF9fTlJfc2V0bnMsIHN5c19zZXRucykKKyNkZWZpbmUgX19OUl9nZXRjcHUJCQkJMzA5CitfX1NZU0NBTEwoX19OUl9nZXRjcHUsIHN5c19nZXRjcHUpCisjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV9yZWFkdgkJCTMxMAorX19TWVNDQUxMKF9fTlJfcHJvY2Vzc192bV9yZWFkdiwgc3lzX3Byb2Nlc3Nfdm1fcmVhZHYpCisjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV93cml0ZXYJCQkzMTEKK19fU1lTQ0FMTChfX05SX3Byb2Nlc3Nfdm1fd3JpdGV2LCBzeXNfcHJvY2Vzc192bV93cml0ZXYpCisKKyNpZm5kZWYgX19OT19TVFVCUworI2RlZmluZSBfX0FSQ0hfV0FOVF9PTERfUkVBRERJUgorI2RlZmluZSBfX0FSQ0hfV0FOVF9PTERfU1RBVAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfQUxBUk0KKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX0dFVEhPU1ROQU1FCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19QQVVTRQorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0dFVE1BU0sKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NJR05BTAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfVVRJTUUKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1dBSVRQSUQKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NPQ0tFVENBTEwKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX0ZBRFZJU0U2NAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfR0VUUEdSUAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfTExTRUVLCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19OSUNFCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19PTERfR0VUUkxJTUlUCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19PTERfVU5BTUUKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX09MRFVNT1VOVAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHUEVORElORworI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHUFJPQ01BU0sKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1JUX1NJR0FDVElPTgorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfUlRfU0lHU1VTUEVORAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfVElNRQorI2RlZmluZSBfX0FSQ0hfV0FOVF9DT01QQVRfU1lTX1RJTUUKKyNlbmRpZgkvKiBfX05PX1NUVUJTICovCisKKworI2VuZGlmIC8qIF9BU01fWDg2X1VOSVNURF82NF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3ZtODYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vdm04Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMWRhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYXNtL3ZtODYuaApAQCAtMCwwICsxLDEyOSBAQAorI2lmbmRlZiBfQVNNX1g4Nl9WTTg2X0gKKyNkZWZpbmUgX0FTTV9YODZfVk04Nl9ICisKKy8qCisgKiBJJ20gZ3Vlc3NpbmcgYXQgdGhlIFZJRi9WSVAgZmxhZyB1c2FnZSwgYnV0IGhvcGUgdGhhdCB0aGlzIGlzIGhvdworICogdGhlIFBlbnRpdW0gdXNlcyB0aGVtLiBMaW51eCB3aWxsIHJldHVybiBmcm9tIHZtODYgbW9kZSB3aGVuIGJvdGgKKyAqIFZJRiBhbmQgVklQIGlzIHNldC4KKyAqCisgKiBPbiBhIFBlbnRpdW0sIHdlIGNvdWxkIHByb2JhYmx5IG9wdGltaXplIHRoZSB2aXJ0dWFsIGZsYWdzIGRpcmVjdGx5CisgKiBpbiB0aGUgZWZsYWdzIHJlZ2lzdGVyIGluc3RlYWQgb2YgZG9pbmcgaXQgImJ5IGhhbmQiIGluIHZmbGFncy4uLgorICoKKyAqIExpbnVzCisgKi8KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3ItZmxhZ3MuaD4KKworI2RlZmluZSBCSU9TU0VHCQkweDBmMDAwCisKKyNkZWZpbmUgQ1BVXzA4NgkJMAorI2RlZmluZSBDUFVfMTg2CQkxCisjZGVmaW5lIENQVV8yODYJCTIKKyNkZWZpbmUgQ1BVXzM4NgkJMworI2RlZmluZSBDUFVfNDg2CQk0CisjZGVmaW5lIENQVV81ODYJCTUKKworLyoKKyAqIFJldHVybiB2YWx1ZXMgZm9yIHRoZSAndm04NigpJyBzeXN0ZW0gY2FsbAorICovCisjZGVmaW5lIFZNODZfVFlQRShyZXR2YWwpCSgocmV0dmFsKSAmIDB4ZmYpCisjZGVmaW5lIFZNODZfQVJHKHJldHZhbCkJKChyZXR2YWwpID4+IDgpCisKKyNkZWZpbmUgVk04Nl9TSUdOQUwJMAkvKiByZXR1cm4gZHVlIHRvIHNpZ25hbCAqLworI2RlZmluZSBWTTg2X1VOS05PV04JMQkvKiB1bmhhbmRsZWQgR1AgZmF1bHQKKwkJCQkgICAtIElPLWluc3RydWN0aW9uIG9yIHNpbWlsYXIgKi8KKyNkZWZpbmUgVk04Nl9JTlR4CTIJLyogaW50My9pbnQgeCBpbnN0cnVjdGlvbiAoQVJHID0geCkgKi8KKyNkZWZpbmUgVk04Nl9TVEkJMwkvKiBzdGkvcG9wZi9pcmV0IGluc3RydWN0aW9uIGVuYWJsZWQKKwkJCQkgICB2aXJ0dWFsIGludGVycnVwdHMgKi8KKworLyoKKyAqIEFkZGl0aW9uYWwgcmV0dXJuIHZhbHVlcyB3aGVuIGludm9raW5nIG5ldyB2bTg2KCkKKyAqLworI2RlZmluZSBWTTg2X1BJQ1JFVFVSTgk0CS8qIHJldHVybiBkdWUgdG8gcGVuZGluZyBQSUMgcmVxdWVzdCAqLworI2RlZmluZSBWTTg2X1RSQVAJNgkvKiByZXR1cm4gZHVlIHRvIERPUy1kZWJ1Z2dlciByZXF1ZXN0ICovCisKKy8qCisgKiBmdW5jdGlvbiBjb2RlcyB3aGVuIGludm9raW5nIG5ldyB2bTg2KCkKKyAqLworI2RlZmluZSBWTTg2X1BMVVNfSU5TVEFMTF9DSEVDSwkwCisjZGVmaW5lIFZNODZfRU5URVIJCTEKKyNkZWZpbmUgVk04Nl9FTlRFUl9OT19CWVBBU1MJMgorI2RlZmluZQlWTTg2X1JFUVVFU1RfSVJRCTMKKyNkZWZpbmUgVk04Nl9GUkVFX0lSUQkJNAorI2RlZmluZSBWTTg2X0dFVF9JUlFfQklUUwk1CisjZGVmaW5lIFZNODZfR0VUX0FORF9SRVNFVF9JUlEJNgorCisvKgorICogVGhpcyBpcyB0aGUgc3RhY2stbGF5b3V0IHNlZW4gYnkgdGhlIHVzZXIgc3BhY2UgcHJvZ3JhbSB3aGVuIHdlIGhhdmUKKyAqIGRvbmUgYSB0cmFuc2xhdGlvbiBvZiAiU0FWRV9BTEwiIGZyb20gdm04NiBtb2RlLiBUaGUgcmVhbCBrZXJuZWwgbGF5b3V0CisgKiBpcyAna2VybmVsX3ZtODZfcmVncycgKHNlZSBiZWxvdykuCisgKi8KKworc3RydWN0IHZtODZfcmVncyB7CisvKgorICogbm9ybWFsIHJlZ3MsIHdpdGggc3BlY2lhbCBtZWFuaW5nIGZvciB0aGUgc2VnbWVudCBkZXNjcmlwdG9ycy4uCisgKi8KKwlsb25nIGVieDsKKwlsb25nIGVjeDsKKwlsb25nIGVkeDsKKwlsb25nIGVzaTsKKwlsb25nIGVkaTsKKwlsb25nIGVicDsKKwlsb25nIGVheDsKKwlsb25nIF9fbnVsbF9kczsKKwlsb25nIF9fbnVsbF9lczsKKwlsb25nIF9fbnVsbF9mczsKKwlsb25nIF9fbnVsbF9nczsKKwlsb25nIG9yaWdfZWF4OworCWxvbmcgZWlwOworCXVuc2lnbmVkIHNob3J0IGNzLCBfX2NzaDsKKwlsb25nIGVmbGFnczsKKwlsb25nIGVzcDsKKwl1bnNpZ25lZCBzaG9ydCBzcywgX19zc2g7CisvKgorICogdGhlc2UgYXJlIHNwZWNpZmljIHRvIHY4NiBtb2RlOgorICovCisJdW5zaWduZWQgc2hvcnQgZXMsIF9fZXNoOworCXVuc2lnbmVkIHNob3J0IGRzLCBfX2RzaDsKKwl1bnNpZ25lZCBzaG9ydCBmcywgX19mc2g7CisJdW5zaWduZWQgc2hvcnQgZ3MsIF9fZ3NoOworfTsKKworc3RydWN0IHJldmVjdG9yZWRfc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIF9fbWFwWzhdOwkJCS8qIDI1NiBiaXRzICovCit9OworCitzdHJ1Y3Qgdm04Nl9zdHJ1Y3QgeworCXN0cnVjdCB2bTg2X3JlZ3MgcmVnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgc2NyZWVuX2JpdG1hcDsKKwl1bnNpZ25lZCBsb25nIGNwdV90eXBlOworCXN0cnVjdCByZXZlY3RvcmVkX3N0cnVjdCBpbnRfcmV2ZWN0b3JlZDsKKwlzdHJ1Y3QgcmV2ZWN0b3JlZF9zdHJ1Y3QgaW50MjFfcmV2ZWN0b3JlZDsKK307CisKKy8qCisgKiBmbGFncyBtYXNrcworICovCisjZGVmaW5lIFZNODZfU0NSRUVOX0JJVE1BUAkweDAwMDEKKworc3RydWN0IHZtODZwbHVzX2luZm9fc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGZvcmNlX3JldHVybl9mb3JfcGljOjE7CisJdW5zaWduZWQgbG9uZyB2bTg2ZGJnX2FjdGl2ZToxOyAgICAgICAvKiBmb3IgZGVidWdnZXIgKi8KKwl1bnNpZ25lZCBsb25nIHZtODZkYmdfVEZwZW5kaWc6MTsgICAgIC8qIGZvciBkZWJ1Z2dlciAqLworCXVuc2lnbmVkIGxvbmcgdW51c2VkOjI4OworCXVuc2lnbmVkIGxvbmcgaXNfdm04NnB1czoxOwkgICAgICAvKiBmb3Igdm04NiBpbnRlcm5hbCB1c2UgKi8KKwl1bnNpZ25lZCBjaGFyIHZtODZkYmdfaW50eHh0YWJbMzJdOyAgIC8qIGZvciBkZWJ1Z2dlciAqLworfTsKK3N0cnVjdCB2bTg2cGx1c19zdHJ1Y3QgeworCXN0cnVjdCB2bTg2X3JlZ3MgcmVnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgc2NyZWVuX2JpdG1hcDsKKwl1bnNpZ25lZCBsb25nIGNwdV90eXBlOworCXN0cnVjdCByZXZlY3RvcmVkX3N0cnVjdCBpbnRfcmV2ZWN0b3JlZDsKKwlzdHJ1Y3QgcmV2ZWN0b3JlZF9zdHJ1Y3QgaW50MjFfcmV2ZWN0b3JlZDsKKwlzdHJ1Y3Qgdm04NnBsdXNfaW5mb19zdHJ1Y3Qgdm04NnBsdXM7Cit9OworCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9WTTg2X0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vdnN5c2NhbGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9hc20vdnN5c2NhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTY1YmIxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2FzbS92c3lzY2FsbC5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgX0FTTV9YODZfVlNZU0NBTExfSAorI2RlZmluZSBfQVNNX1g4Nl9WU1lTQ0FMTF9ICisKK2VudW0gdnN5c2NhbGxfbnVtIHsKKwlfX05SX3ZnZXR0aW1lb2ZkYXksCisJX19OUl92dGltZSwKKwlfX05SX3ZnZXRjcHUsCit9OworCisjZGVmaW5lIFZTWVNDQUxMX1NUQVJUICgtMTBVTCA8PCAyMCkKKyNkZWZpbmUgVlNZU0NBTExfU0laRSAxMDI0CisjZGVmaW5lIFZTWVNDQUxMX0VORCAoLTJVTCA8PCAyMCkKKyNkZWZpbmUgVlNZU0NBTExfTUFQUEVEX1BBR0VTIDEKKyNkZWZpbmUgVlNZU0NBTExfQUREUih2c3lzY2FsbF9ucikgKFZTWVNDQUxMX1NUQVJUK1ZTWVNDQUxMX1NJWkUqKHZzeXNjYWxsX25yKSkKKworCisjZW5kaWYgLyogX0FTTV9YODZfVlNZU0NBTExfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvYS5vdXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2Eub3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI4YThkNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2Eub3V0LmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfX0FfT1VUX0dOVV9IX18KKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9hLm91dC5oPiBkaXJlY3RseTsgaW5jbHVkZSA8YS5vdXQuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworI2lmIF9fV09SRFNJWkUgPT0gNjQKKworLyogU2lnbmFsIHRvIHVzZXJzIG9mIHRoaXMgaGVhZGVyIHRoYXQgdGhpcyBhcmNoaXRlY3R1cmUgcmVhbGx5IGRvZXNuJ3QKKyAgIHN1cHBvcnQgYS5vdXQgYmluYXJ5IGZvcm1hdC4gICovCisjZGVmaW5lIF9fTk9fQV9PVVRfU1VQUE9SVCAxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvYnl0ZXN3YXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2J5dGVzd2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkYjkzYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2J5dGVzd2FwLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8qIE1hY3JvcyB0byBzd2FwIHRoZSBvcmRlciBvZiBieXRlcyBpbiBpbnRlZ2VyIHZhbHVlcy4KKyAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMjAwMCwgMjAwMiwgMjAwMywgMjAwNywgMjAwOCwgMjAxMCwgMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCBfQllURVNXQVBfSCAmJiAhZGVmaW5lZCBfTkVUSU5FVF9JTl9IICYmICFkZWZpbmVkIF9FTkRJQU5fSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2J5dGVzd2FwLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxieXRlc3dhcC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9CSVRTX0JZVEVTV0FQX0gKKyNkZWZpbmUgX0JJVFNfQllURVNXQVBfSCAxCisKKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKy8qIFN3YXAgYnl0ZXMgaW4gMTYgYml0IHZhbHVlLiAgKi8KKyNkZWZpbmUgX19ic3dhcF9jb25zdGFudF8xNih4KSBcCisgICAgICgodW5zaWduZWQgc2hvcnQgaW50KSAoKCgoeCkgPj4gOCkgJiAweGZmKSB8ICgoKHgpICYgMHhmZikgPDwgOCkpKQorCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyCisjIGRlZmluZSBfX2Jzd2FwXzE2KHgpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgICAgKHsgcmVnaXN0ZXIgdW5zaWduZWQgc2hvcnQgaW50IF9fdiwgX194ID0gKHVuc2lnbmVkIHNob3J0IGludCkgKHgpOyAgICAgXAorCSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9feCkpCQkJCSAgICAgIFwKKwkgICBfX3YgPSBfX2Jzd2FwX2NvbnN0YW50XzE2IChfX3gpOwkJCQkgICAgICBcCisJIGVsc2UJCQkJCQkJCSAgICAgIFwKKwkgICBfX2FzbV9fICgicm9ydyAkOCwgJXcwIgkJCQkJICAgICAgXAorCQkgICAgOiAiPXIiIChfX3YpCQkJCQkgICAgICBcCisJCSAgICA6ICIwIiAoX194KQkJCQkJCSAgICAgIFwKKwkJICAgIDogImNjIik7CQkJCQkJICAgICAgXAorCSBfX3Y7IH0pKQorI2Vsc2UKKy8qIFRoaXMgaXMgYmV0dGVyIHRoYW4gbm90aGluZy4gICovCisjIGRlZmluZSBfX2Jzd2FwXzE2KHgpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgICAgKHsgcmVnaXN0ZXIgdW5zaWduZWQgc2hvcnQgaW50IF9feCA9ICh1bnNpZ25lZCBzaG9ydCBpbnQpICh4KTsgICAgICAgICAgXAorCSBfX2Jzd2FwX2NvbnN0YW50XzE2IChfX3gpOyB9KSkKKyNlbmRpZgorCisKKy8qIFN3YXAgYnl0ZXMgaW4gMzIgYml0IHZhbHVlLiAgKi8KKyNkZWZpbmUgX19ic3dhcF9jb25zdGFudF8zMih4KSBcCisgICAgICgoKCh4KSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8ICgoKHgpICYgMHgwMGZmMDAwMCkgPj4gIDgpIHwJCSAgICAgIFwKKyAgICAgICgoKHgpICYgMHgwMDAwZmYwMCkgPDwgIDgpIHwgKCgoeCkgJiAweDAwMDAwMGZmKSA8PCAyNCkpCisKKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIKKyMgaWYgX19XT1JEU0laRSA9PSA2NCB8fCAoZGVmaW5lZCBfX2k0ODZfXyB8fCBkZWZpbmVkIF9fcGVudGl1bV9fCSAgICAgIFwKKwkJCSAgfHwgZGVmaW5lZCBfX3BlbnRpdW1wcm9fXyB8fCBkZWZpbmVkIF9fcGVudGl1bTRfXyAgIFwKKwkJCSAgfHwgZGVmaW5lZCBfX2s4X18gfHwgZGVmaW5lZCBfX2F0aGxvbl9fCSAgICAgIFwKKwkJCSAgfHwgZGVmaW5lZCBfX2s2X18gfHwgZGVmaW5lZCBfX25vY29uYV9fCSAgICAgIFwKKwkJCSAgfHwgZGVmaW5lZCBfX2NvcmUyX18gfHwgZGVmaW5lZCBfX2dlb2RlX18JICAgICAgXAorCQkJICB8fCBkZWZpbmVkIF9fYW1kZmFtMTBfXykKKy8qIFRvIHN3YXAgdGhlIGJ5dGVzIGluIGEgd29yZCB0aGUgaTQ4NiBwcm9jZXNzb3JzIGFuZCB1cCBwcm92aWRlIHRoZQorICAgYGJzd2FwJyBvcGNvZGUuICBPbiBpMzg2IHdlIGhhdmUgdG8gdXNlIHRocmVlIGluc3RydWN0aW9ucy4gICovCisjICBkZWZpbmUgX19ic3dhcF8zMih4KSBcCisgICAgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICAgICh7IHJlZ2lzdGVyIHVuc2lnbmVkIGludCBfX3YsIF9feCA9ICh4KTsJCQkJICAgICAgXAorCSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9feCkpCQkJCSAgICAgIFwKKwkgICBfX3YgPSBfX2Jzd2FwX2NvbnN0YW50XzMyIChfX3gpOwkJCQkgICAgICBcCisJIGVsc2UJCQkJCQkJCSAgICAgIFwKKwkgICBfX2FzbV9fICgiYnN3YXAgJTAiIDogIj1yIiAoX192KSA6ICIwIiAoX194KSk7CQkgICAgICBcCisJIF9fdjsgfSkpCisjIGVsc2UKKyMgIGRlZmluZSBfX2Jzd2FwXzMyKHgpCQkJCQkJCSAgICAgIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgICAgKHsgcmVnaXN0ZXIgdW5zaWduZWQgaW50IF9fdiwgX194ID0gKHgpOwkJCQkgICAgICBcCisJIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX194KSkJCQkJICAgICAgXAorCSAgIF9fdiA9IF9fYnN3YXBfY29uc3RhbnRfMzIgKF9feCk7CQkJCSAgICAgIFwKKwkgZWxzZQkJCQkJCQkJICAgICAgXAorCSAgIF9fYXNtX18gKCJyb3J3ICQ4LCAldzA7IgkJCQkJICAgICAgXAorCQkgICAgInJvcmwgJDE2LCAlMDsiCQkJCQkgICAgICBcCisJCSAgICAicm9ydyAkOCwgJXcwIgkJCQkJICAgICAgXAorCQkgICAgOiAiPXIiIChfX3YpCQkJCQkgICAgICBcCisJCSAgICA6ICIwIiAoX194KQkJCQkJCSAgICAgIFwKKwkJICAgIDogImNjIik7CQkJCQkJICAgICAgXAorCSBfX3Y7IH0pKQorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIF9fYnN3YXBfMzIoeCkgXAorICAgICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAgICAoeyByZWdpc3RlciB1bnNpZ25lZCBpbnQgX194ID0gKHgpOyBfX2Jzd2FwX2NvbnN0YW50XzMyIChfX3gpOyB9KSkKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIKKy8qIFN3YXAgYnl0ZXMgaW4gNjQgYml0IHZhbHVlLiAgKi8KKyMgZGVmaW5lIF9fYnN3YXBfY29uc3RhbnRfNjQoeCkgXAorICAgICAoX19leHRlbnNpb25fXyAoKCgoeCkgJiAweGZmMDAwMDAwMDAwMDAwMDB1bGwpID4+IDU2KQkJICAgICAgXAorCQkgICAgIHwgKCgoeCkgJiAweDAwZmYwMDAwMDAwMDAwMDB1bGwpID4+IDQwKQkJICAgICAgXAorCQkgICAgIHwgKCgoeCkgJiAweDAwMDBmZjAwMDAwMDAwMDB1bGwpID4+IDI0KQkJICAgICAgXAorCQkgICAgIHwgKCgoeCkgJiAweDAwMDAwMGZmMDAwMDAwMDB1bGwpID4+IDgpCQkgICAgICBcCisJCSAgICAgfCAoKCh4KSAmIDB4MDAwMDAwMDBmZjAwMDAwMHVsbCkgPDwgOCkJCSAgICAgIFwKKwkJICAgICB8ICgoKHgpICYgMHgwMDAwMDAwMDAwZmYwMDAwdWxsKSA8PCAyNCkJCSAgICAgIFwKKwkJICAgICB8ICgoKHgpICYgMHgwMDAwMDAwMDAwMDBmZjAwdWxsKSA8PCA0MCkJCSAgICAgIFwKKwkJICAgICB8ICgoKHgpICYgMHgwMDAwMDAwMDAwMDAwMGZmdWxsKSA8PCA1NikpKQorCisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBfX2Jzd2FwXzY0KHgpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgICAgKHsgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3YsIF9feCA9ICh4KTsJCQkJICAgICAgXAorCSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9feCkpCQkJCSAgICAgIFwKKwkgICBfX3YgPSBfX2Jzd2FwX2NvbnN0YW50XzY0IChfX3gpOwkJCQkgICAgICBcCisJIGVsc2UJCQkJCQkJCSAgICAgIFwKKwkgICBfX2FzbV9fICgiYnN3YXAgJXEwIiA6ICI9ciIgKF9fdikgOiAiMCIgKF9feCkpOwkJICAgICAgXAorCSBfX3Y7IH0pKQorIyBlbHNlCisjICBkZWZpbmUgX19ic3dhcF82NCh4KSBcCisgICAgIChfX2V4dGVuc2lvbl9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoeyB1bmlvbiB7IF9fZXh0ZW5zaW9uX18gdW5zaWduZWQgbG9uZyBsb25nIGludCBfX2xsOyAgICAgICAgICAgICAgICAgICBcCisJCSB1bnNpZ25lZCBpbnQgX19sWzJdOyB9IF9fdywgX19yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKHgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgX19yLl9fbGwgPSBfX2Jzd2FwX2NvbnN0YW50XzY0ICh4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICBfX3cuX19sbCA9ICh4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIF9fci5fX2xbMF0gPSBfX2Jzd2FwXzMyIChfX3cuX19sWzFdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgX19yLl9fbFsxXSA9IF9fYnN3YXBfMzIgKF9fdy5fX2xbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgX19yLl9fbGw7IH0pKQorIyBlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBfQklUU19CWVRFU1dBUF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9jbWF0aGNhbGxzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9jbWF0aGNhbGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM3ZmRiZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2NtYXRoY2FsbHMuaApAQCAtMCwwICsxLDE1OSBAQAorLyogUHJvdG90eXBlIGRlY2xhcmF0aW9ucyBmb3IgY29tcGxleCBtYXRoIGZ1bmN0aW9uczsKKyAgIGhlbHBlciBmaWxlIGZvciA8Y29tcGxleC5oPi4KKyAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMjAwMSwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogTk9URTogQmVjYXVzZSBvZiB0aGUgc3BlY2lhbCB3YXkgdGhpcyBmaWxlIGlzIHVzZWQgYnkgPGNvbXBsZXguaD4sIHRoaXMKKyAgIGZpbGUgbXVzdCBOT1QgYmUgcHJvdGVjdGVkIGZyb20gbXVsdGlwbGUgaW5jbHVzaW9uIGFzIGhlYWRlciBmaWxlcworICAgdXN1YWxseSBhcmUuCisKKyAgIFRoaXMgZmlsZSBwcm92aWRlcyBwcm90b3R5cGUgZGVjbGFyYXRpb25zIGZvciB0aGUgbWF0aCBmdW5jdGlvbnMuCisgICBNb3N0IGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQgdXNpbmcgdGhlIG1hY3JvOgorCisgICBfX01BVEhDQUxMIChOQU1FLCAoQVJHUy4uLikpOworCisgICBUaGlzIG1lYW5zIHRoZXJlIGlzIGEgZnVuY3Rpb24gYE5BTUUnIHJldHVybmluZyBgZG91YmxlJyBhbmQgYSBmdW5jdGlvbgorICAgYE5BTUVmJyByZXR1cm5pbmcgYGZsb2F0Jy4gIEVhY2ggcGxhY2UgYF9NZG91YmxlXycgYXBwZWFycyBpbiB0aGUKKyAgIHByb3RvdHlwZSwgdGhhdCBpcyBhY3R1YWxseSBgZG91YmxlJyBpbiB0aGUgcHJvdG90eXBlIGZvciBgTkFNRScgYW5kCisgICBgZmxvYXQnIGluIHRoZSBwcm90b3R5cGUgZm9yIGBOQU1FZicuICBSZWVudHJhbnQgdmFyaWFudCBmdW5jdGlvbnMgYXJlCisgICBjYWxsZWQgYE5BTUVfcicgYW5kIGBOQU1FZl9yJy4KKworICAgRnVuY3Rpb25zIHJldHVybmluZyBvdGhlciB0eXBlcyBsaWtlIGBpbnQnIGFyZSBkZWNsYXJlZCB1c2luZyB0aGUgbWFjcm86CisKKyAgIF9fTUFUSERFQ0wgKFRZUEUsIE5BTUUsIChBUkdTLi4uKSk7CisKKyAgIFRoaXMgaXMganVzdCBsaWtlIF9fTUFUSENBTEwgYnV0IGZvciBhIGZ1bmN0aW9uIHJldHVybmluZyBgVFlQRScKKyAgIGluc3RlYWQgb2YgYF9NZG91YmxlXycuICBJbiBhbGwgb2YgdGhlc2UgY2FzZXMsIHRoZXJlIGlzIHN0aWxsCisgICBib3RoIGEgYE5BTUUnIGFuZCBhIGBOQU1FZicgdGhhdCB0YWtlcyBgZmxvYXQnIGFyZ3VtZW50cy4gICovCisKKyNpZm5kZWYgX0NPTVBMRVhfSAorI2Vycm9yICJOZXZlciB1c2UgPGJpdHMvY21hdGhjYWxscy5oPiBkaXJlY3RseTsgaW5jbHVkZSA8Y29tcGxleC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjZGVmaW5lIF9NZG91YmxlX2NvbXBsZXhfIF9NZG91YmxlXyBfQ29tcGxleAorCisKKy8qIFRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zLiAgKi8KKworLyogQXJjIGNvc2luZSBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNhY29zLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisvKiBBcmMgc2luZSBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNhc2luLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisvKiBBcmMgdGFuZ2VudCBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNhdGFuLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKy8qIENvc2luZSBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNjb3MsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKy8qIFNpbmUgb2YgWi4gICovCitfX01BVEhDQUxMIChjc2luLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisvKiBUYW5nZW50IG9mIFouICAqLworX19NQVRIQ0FMTCAoY3RhbiwgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworCisKKy8qIEh5cGVyYm9saWMgZnVuY3Rpb25zLiAgKi8KKworLyogSHlwZXJib2xpYyBhcmMgY29zaW5lIG9mIFouICAqLworX19NQVRIQ0FMTCAoY2Fjb3NoLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisvKiBIeXBlcmJvbGljIGFyYyBzaW5lIG9mIFouICAqLworX19NQVRIQ0FMTCAoY2FzaW5oLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisvKiBIeXBlcmJvbGljIGFyYyB0YW5nZW50IG9mIFouICAqLworX19NQVRIQ0FMTCAoY2F0YW5oLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKy8qIEh5cGVyYm9saWMgY29zaW5lIG9mIFouICAqLworX19NQVRIQ0FMTCAoY2Nvc2gsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKy8qIEh5cGVyYm9saWMgc2luZSBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNzaW5oLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisvKiBIeXBlcmJvbGljIHRhbmdlbnQgb2YgWi4gICovCitfX01BVEhDQUxMIChjdGFuaCwgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworCisKKy8qIEV4cG9uZW50aWFsIGFuZCBsb2dhcml0aG1pYyBmdW5jdGlvbnMuICAqLworCisvKiBFeHBvbmVudGlhbCBmdW5jdGlvbiBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNleHAsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworLyogTmF0dXJhbCBsb2dhcml0aG0gb2YgWi4gICovCitfX01BVEhDQUxMIChjbG9nLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRoZSBiYXNlIDEwIGxvZ2FyaXRobSBpcyBub3QgZGVmaW5lZCBieSB0aGUgc3RhbmRhcmQgYnV0IHRvIGltcGxlbWVudAorICAgdGhlIHN0YW5kYXJkIEMrKyBsaWJyYXJ5IGl0IGlzIGhhbmR5LiAgKi8KK19fTUFUSENBTEwgKGNsb2cxMCwgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworI2VuZGlmCisKKy8qIFBvd2VyIGZ1bmN0aW9ucy4gICovCisKKy8qIFJldHVybiBYIHRvIHRoZSBZIHBvd2VyLiAgKi8KK19fTUFUSENBTEwgKGNwb3csIChfTWRvdWJsZV9jb21wbGV4XyBfX3gsIF9NZG91YmxlX2NvbXBsZXhfIF9feSkpOworCisvKiBSZXR1cm4gdGhlIHNxdWFyZSByb290IG9mIFouICAqLworX19NQVRIQ0FMTCAoY3NxcnQsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworCisvKiBBYnNvbHV0ZSB2YWx1ZSwgY29uanVnYXRlcywgYW5kIHByb2plY3Rpb24uICAqLworCisvKiBBYnNvbHV0ZSB2YWx1ZSBvZiBaLiAgKi8KK19fTUFUSERFQ0wgKF9NZG91YmxlXyxjYWJzLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKy8qIEFyZ3VtZW50IHZhbHVlIG9mIFouICAqLworX19NQVRIREVDTCAoX01kb3VibGVfLGNhcmcsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworLyogQ29tcGxleCBjb25qdWdhdGUgb2YgWi4gICovCitfX01BVEhDQUxMIChjb25qLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKy8qIFByb2plY3Rpb24gb2YgWiBvbnRvIHRoZSBSaWVtYW5uIHNwaGVyZS4gICovCitfX01BVEhDQUxMIChjcHJvaiwgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworCisKKy8qIERlY29tcG9zaW5nIGNvbXBsZXggdmFsdWVzLiAgKi8KKworLyogSW1hZ2luYXJ5IHBhcnQgb2YgWi4gICovCitfX01BVEhERUNMIChfTWRvdWJsZV8sY2ltYWcsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworLyogUmVhbCBwYXJ0IG9mIFouICAqLworX19NQVRIREVDTCAoX01kb3VibGVfLGNyZWFsLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKworLyogTm93IHNvbWUgb3B0aW1pemVkIHZlcnNpb25zLiAgR0NDIGhhcyBoYW5keSBub3RhdGlvbnMgZm9yIHRoZXNlCisgICBmdW5jdGlvbnMuICBSZWNlbnQgR0NDIGhhbmRsZXMgdGhlc2UgYXMgYnVpbHRpbiBmdW5jdGlvbnMgc28gZG9lcworICAgbm90IG5lZWQgaW5saW5lcy4gICovCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiAhX19HTlVDX1BSRVJFUSAoMiwgOTcpICYmIGRlZmluZWQgX19PUFRJTUlaRV9fIFwKKyAgICAmJiBkZWZpbmVkIF9fZXh0ZXJuX2lubGluZQorCisvKiBJbWFnaW5hcnkgcGFydCBvZiBaLiAgKi8KK19fZXh0ZXJuX2lubGluZSBfTWRvdWJsZV8KK19fTUFUSF9QUkVDTkFNRShjaW1hZykgKF9NZG91YmxlX2NvbXBsZXhfIF9feikgX19USFJPVworeworICByZXR1cm4gX19pbWFnX18gX196OworfQorCisvKiBSZWFsIHBhcnQgb2YgWi4gICovCitfX2V4dGVybl9pbmxpbmUgX01kb3VibGVfCitfX01BVEhfUFJFQ05BTUUoY3JlYWwpIChfTWRvdWJsZV9jb21wbGV4XyBfX3opIF9fVEhST1cKK3sKKyAgcmV0dXJuIF9fcmVhbF9fIF9fejsKK30KKworLyogQ29tcGxleCBjb25qdWdhdGUgb2YgWi4gICovCitfX2V4dGVybl9pbmxpbmUgX01kb3VibGVfY29tcGxleF8KK19fTUFUSF9QUkVDTkFNRShjb25qKSAoX01kb3VibGVfY29tcGxleF8gX196KSBfX1RIUk9XCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIH5fX3o7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvY29uZm5hbWUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2NvbmZuYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmY2FmYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2NvbmZuYW1lLmgKQEAgLTAsMCArMSw2NzcgQEAKKy8qIGBzeXNjb25mJywgYHBhdGhjb25mJywgYW5kIGBjb25mc3RyJyBOQU1FIHZhbHVlcy4gIEdlbmVyaWMgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5MywxOTk1LTE5OTgsMjAwMCwyMDAxLDIwMDMsMjAwNCwyMDA3LDIwMDksMjAxMAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1VOSVNURF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvY29uZm5hbWUuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHVuaXN0ZC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBWYWx1ZXMgZm9yIHRoZSBOQU1FIGFyZ3VtZW50IHRvIGBwYXRoY29uZicgYW5kIGBmcGF0aGNvbmYnLiAgKi8KK2VudW0KKyAgeworICAgIF9QQ19MSU5LX01BWCwKKyNkZWZpbmUJX1BDX0xJTktfTUFYCQkJX1BDX0xJTktfTUFYCisgICAgX1BDX01BWF9DQU5PTiwKKyNkZWZpbmUJX1BDX01BWF9DQU5PTgkJCV9QQ19NQVhfQ0FOT04KKyAgICBfUENfTUFYX0lOUFVULAorI2RlZmluZQlfUENfTUFYX0lOUFVUCQkJX1BDX01BWF9JTlBVVAorICAgIF9QQ19OQU1FX01BWCwKKyNkZWZpbmUJX1BDX05BTUVfTUFYCQkJX1BDX05BTUVfTUFYCisgICAgX1BDX1BBVEhfTUFYLAorI2RlZmluZQlfUENfUEFUSF9NQVgJCQlfUENfUEFUSF9NQVgKKyAgICBfUENfUElQRV9CVUYsCisjZGVmaW5lCV9QQ19QSVBFX0JVRgkJCV9QQ19QSVBFX0JVRgorICAgIF9QQ19DSE9XTl9SRVNUUklDVEVELAorI2RlZmluZQlfUENfQ0hPV05fUkVTVFJJQ1RFRAkJX1BDX0NIT1dOX1JFU1RSSUNURUQKKyAgICBfUENfTk9fVFJVTkMsCisjZGVmaW5lCV9QQ19OT19UUlVOQwkJCV9QQ19OT19UUlVOQworICAgIF9QQ19WRElTQUJMRSwKKyNkZWZpbmUgX1BDX1ZESVNBQkxFCQkJX1BDX1ZESVNBQkxFCisgICAgX1BDX1NZTkNfSU8sCisjZGVmaW5lCV9QQ19TWU5DX0lPCQkJX1BDX1NZTkNfSU8KKyAgICBfUENfQVNZTkNfSU8sCisjZGVmaW5lCV9QQ19BU1lOQ19JTwkJCV9QQ19BU1lOQ19JTworICAgIF9QQ19QUklPX0lPLAorI2RlZmluZQlfUENfUFJJT19JTwkJCV9QQ19QUklPX0lPCisgICAgX1BDX1NPQ0tfTUFYQlVGLAorI2RlZmluZQlfUENfU09DS19NQVhCVUYJCQlfUENfU09DS19NQVhCVUYKKyAgICBfUENfRklMRVNJWkVCSVRTLAorI2RlZmluZSBfUENfRklMRVNJWkVCSVRTCQlfUENfRklMRVNJWkVCSVRTCisgICAgX1BDX1JFQ19JTkNSX1hGRVJfU0laRSwKKyNkZWZpbmUgX1BDX1JFQ19JTkNSX1hGRVJfU0laRQkJX1BDX1JFQ19JTkNSX1hGRVJfU0laRQorICAgIF9QQ19SRUNfTUFYX1hGRVJfU0laRSwKKyNkZWZpbmUgX1BDX1JFQ19NQVhfWEZFUl9TSVpFCQlfUENfUkVDX01BWF9YRkVSX1NJWkUKKyAgICBfUENfUkVDX01JTl9YRkVSX1NJWkUsCisjZGVmaW5lIF9QQ19SRUNfTUlOX1hGRVJfU0laRQkJX1BDX1JFQ19NSU5fWEZFUl9TSVpFCisgICAgX1BDX1JFQ19YRkVSX0FMSUdOLAorI2RlZmluZSBfUENfUkVDX1hGRVJfQUxJR04JCV9QQ19SRUNfWEZFUl9BTElHTgorICAgIF9QQ19BTExPQ19TSVpFX01JTiwKKyNkZWZpbmUgX1BDX0FMTE9DX1NJWkVfTUlOCQlfUENfQUxMT0NfU0laRV9NSU4KKyAgICBfUENfU1lNTElOS19NQVgsCisjZGVmaW5lIF9QQ19TWU1MSU5LX01BWAkJCV9QQ19TWU1MSU5LX01BWAorICAgIF9QQ18yX1NZTUxJTktTCisjZGVmaW5lIF9QQ18yX1NZTUxJTktTCQkJX1BDXzJfU1lNTElOS1MKKyAgfTsKKworLyogVmFsdWVzIGZvciB0aGUgYXJndW1lbnQgdG8gYHN5c2NvbmYnLiAgKi8KK2VudW0KKyAgeworICAgIF9TQ19BUkdfTUFYLAorI2RlZmluZQlfU0NfQVJHX01BWAkJCV9TQ19BUkdfTUFYCisgICAgX1NDX0NISUxEX01BWCwKKyNkZWZpbmUJX1NDX0NISUxEX01BWAkJCV9TQ19DSElMRF9NQVgKKyAgICBfU0NfQ0xLX1RDSywKKyNkZWZpbmUJX1NDX0NMS19UQ0sJCQlfU0NfQ0xLX1RDSworICAgIF9TQ19OR1JPVVBTX01BWCwKKyNkZWZpbmUJX1NDX05HUk9VUFNfTUFYCQkJX1NDX05HUk9VUFNfTUFYCisgICAgX1NDX09QRU5fTUFYLAorI2RlZmluZQlfU0NfT1BFTl9NQVgJCQlfU0NfT1BFTl9NQVgKKyAgICBfU0NfU1RSRUFNX01BWCwKKyNkZWZpbmUJX1NDX1NUUkVBTV9NQVgJCQlfU0NfU1RSRUFNX01BWAorICAgIF9TQ19UWk5BTUVfTUFYLAorI2RlZmluZQlfU0NfVFpOQU1FX01BWAkJCV9TQ19UWk5BTUVfTUFYCisgICAgX1NDX0pPQl9DT05UUk9MLAorI2RlZmluZQlfU0NfSk9CX0NPTlRST0wJCQlfU0NfSk9CX0NPTlRST0wKKyAgICBfU0NfU0FWRURfSURTLAorI2RlZmluZQlfU0NfU0FWRURfSURTCQkJX1NDX1NBVkVEX0lEUworICAgIF9TQ19SRUFMVElNRV9TSUdOQUxTLAorI2RlZmluZQlfU0NfUkVBTFRJTUVfU0lHTkFMUwkJX1NDX1JFQUxUSU1FX1NJR05BTFMKKyAgICBfU0NfUFJJT1JJVFlfU0NIRURVTElORywKKyNkZWZpbmUJX1NDX1BSSU9SSVRZX1NDSEVEVUxJTkcJCV9TQ19QUklPUklUWV9TQ0hFRFVMSU5HCisgICAgX1NDX1RJTUVSUywKKyNkZWZpbmUJX1NDX1RJTUVSUwkJCV9TQ19USU1FUlMKKyAgICBfU0NfQVNZTkNIUk9OT1VTX0lPLAorI2RlZmluZQlfU0NfQVNZTkNIUk9OT1VTX0lPCQlfU0NfQVNZTkNIUk9OT1VTX0lPCisgICAgX1NDX1BSSU9SSVRJWkVEX0lPLAorI2RlZmluZQlfU0NfUFJJT1JJVElaRURfSU8JCV9TQ19QUklPUklUSVpFRF9JTworICAgIF9TQ19TWU5DSFJPTklaRURfSU8sCisjZGVmaW5lCV9TQ19TWU5DSFJPTklaRURfSU8JCV9TQ19TWU5DSFJPTklaRURfSU8KKyAgICBfU0NfRlNZTkMsCisjZGVmaW5lCV9TQ19GU1lOQwkJCV9TQ19GU1lOQworICAgIF9TQ19NQVBQRURfRklMRVMsCisjZGVmaW5lCV9TQ19NQVBQRURfRklMRVMJCV9TQ19NQVBQRURfRklMRVMKKyAgICBfU0NfTUVNTE9DSywKKyNkZWZpbmUJX1NDX01FTUxPQ0sJCQlfU0NfTUVNTE9DSworICAgIF9TQ19NRU1MT0NLX1JBTkdFLAorI2RlZmluZQlfU0NfTUVNTE9DS19SQU5HRQkJX1NDX01FTUxPQ0tfUkFOR0UKKyAgICBfU0NfTUVNT1JZX1BST1RFQ1RJT04sCisjZGVmaW5lCV9TQ19NRU1PUllfUFJPVEVDVElPTgkJX1NDX01FTU9SWV9QUk9URUNUSU9OCisgICAgX1NDX01FU1NBR0VfUEFTU0lORywKKyNkZWZpbmUJX1NDX01FU1NBR0VfUEFTU0lORwkJX1NDX01FU1NBR0VfUEFTU0lORworICAgIF9TQ19TRU1BUEhPUkVTLAorI2RlZmluZQlfU0NfU0VNQVBIT1JFUwkJCV9TQ19TRU1BUEhPUkVTCisgICAgX1NDX1NIQVJFRF9NRU1PUllfT0JKRUNUUywKKyNkZWZpbmUJX1NDX1NIQVJFRF9NRU1PUllfT0JKRUNUUwlfU0NfU0hBUkVEX01FTU9SWV9PQkpFQ1RTCisgICAgX1NDX0FJT19MSVNUSU9fTUFYLAorI2RlZmluZQlfU0NfQUlPX0xJU1RJT19NQVgJCV9TQ19BSU9fTElTVElPX01BWAorICAgIF9TQ19BSU9fTUFYLAorI2RlZmluZQlfU0NfQUlPX01BWAkJCV9TQ19BSU9fTUFYCisgICAgX1NDX0FJT19QUklPX0RFTFRBX01BWCwKKyNkZWZpbmUJX1NDX0FJT19QUklPX0RFTFRBX01BWAkJX1NDX0FJT19QUklPX0RFTFRBX01BWAorICAgIF9TQ19ERUxBWVRJTUVSX01BWCwKKyNkZWZpbmUJX1NDX0RFTEFZVElNRVJfTUFYCQlfU0NfREVMQVlUSU1FUl9NQVgKKyAgICBfU0NfTVFfT1BFTl9NQVgsCisjZGVmaW5lCV9TQ19NUV9PUEVOX01BWAkJCV9TQ19NUV9PUEVOX01BWAorICAgIF9TQ19NUV9QUklPX01BWCwKKyNkZWZpbmUJX1NDX01RX1BSSU9fTUFYCQkJX1NDX01RX1BSSU9fTUFYCisgICAgX1NDX1ZFUlNJT04sCisjZGVmaW5lCV9TQ19WRVJTSU9OCQkJX1NDX1ZFUlNJT04KKyAgICBfU0NfUEFHRVNJWkUsCisjZGVmaW5lCV9TQ19QQUdFU0laRQkJCV9TQ19QQUdFU0laRQorI2RlZmluZQlfU0NfUEFHRV9TSVpFCQkJX1NDX1BBR0VTSVpFCisgICAgX1NDX1JUU0lHX01BWCwKKyNkZWZpbmUJX1NDX1JUU0lHX01BWAkJCV9TQ19SVFNJR19NQVgKKyAgICBfU0NfU0VNX05TRU1TX01BWCwKKyNkZWZpbmUJX1NDX1NFTV9OU0VNU19NQVgJCV9TQ19TRU1fTlNFTVNfTUFYCisgICAgX1NDX1NFTV9WQUxVRV9NQVgsCisjZGVmaW5lCV9TQ19TRU1fVkFMVUVfTUFYCQlfU0NfU0VNX1ZBTFVFX01BWAorICAgIF9TQ19TSUdRVUVVRV9NQVgsCisjZGVmaW5lCV9TQ19TSUdRVUVVRV9NQVgJCV9TQ19TSUdRVUVVRV9NQVgKKyAgICBfU0NfVElNRVJfTUFYLAorI2RlZmluZQlfU0NfVElNRVJfTUFYCQkJX1NDX1RJTUVSX01BWAorCisgICAgLyogVmFsdWVzIGZvciB0aGUgYXJndW1lbnQgdG8gYHN5c2NvbmYnCisgICAgICAgY29ycmVzcG9uZGluZyB0byBfUE9TSVgyXyogc3ltYm9scy4gICovCisgICAgX1NDX0JDX0JBU0VfTUFYLAorI2RlZmluZQlfU0NfQkNfQkFTRV9NQVgJCQlfU0NfQkNfQkFTRV9NQVgKKyAgICBfU0NfQkNfRElNX01BWCwKKyNkZWZpbmUJX1NDX0JDX0RJTV9NQVgJCQlfU0NfQkNfRElNX01BWAorICAgIF9TQ19CQ19TQ0FMRV9NQVgsCisjZGVmaW5lCV9TQ19CQ19TQ0FMRV9NQVgJCV9TQ19CQ19TQ0FMRV9NQVgKKyAgICBfU0NfQkNfU1RSSU5HX01BWCwKKyNkZWZpbmUJX1NDX0JDX1NUUklOR19NQVgJCV9TQ19CQ19TVFJJTkdfTUFYCisgICAgX1NDX0NPTExfV0VJR0hUU19NQVgsCisjZGVmaW5lCV9TQ19DT0xMX1dFSUdIVFNfTUFYCQlfU0NfQ09MTF9XRUlHSFRTX01BWAorICAgIF9TQ19FUVVJVl9DTEFTU19NQVgsCisjZGVmaW5lCV9TQ19FUVVJVl9DTEFTU19NQVgJCV9TQ19FUVVJVl9DTEFTU19NQVgKKyAgICBfU0NfRVhQUl9ORVNUX01BWCwKKyNkZWZpbmUJX1NDX0VYUFJfTkVTVF9NQVgJCV9TQ19FWFBSX05FU1RfTUFYCisgICAgX1NDX0xJTkVfTUFYLAorI2RlZmluZQlfU0NfTElORV9NQVgJCQlfU0NfTElORV9NQVgKKyAgICBfU0NfUkVfRFVQX01BWCwKKyNkZWZpbmUJX1NDX1JFX0RVUF9NQVgJCQlfU0NfUkVfRFVQX01BWAorICAgIF9TQ19DSEFSQ0xBU1NfTkFNRV9NQVgsCisjZGVmaW5lCV9TQ19DSEFSQ0xBU1NfTkFNRV9NQVgJCV9TQ19DSEFSQ0xBU1NfTkFNRV9NQVgKKworICAgIF9TQ18yX1ZFUlNJT04sCisjZGVmaW5lCV9TQ18yX1ZFUlNJT04JCQlfU0NfMl9WRVJTSU9OCisgICAgX1NDXzJfQ19CSU5ELAorI2RlZmluZQlfU0NfMl9DX0JJTkQJCQlfU0NfMl9DX0JJTkQKKyAgICBfU0NfMl9DX0RFViwKKyNkZWZpbmUJX1NDXzJfQ19ERVYJCQlfU0NfMl9DX0RFVgorICAgIF9TQ18yX0ZPUlRfREVWLAorI2RlZmluZQlfU0NfMl9GT1JUX0RFVgkJCV9TQ18yX0ZPUlRfREVWCisgICAgX1NDXzJfRk9SVF9SVU4sCisjZGVmaW5lCV9TQ18yX0ZPUlRfUlVOCQkJX1NDXzJfRk9SVF9SVU4KKyAgICBfU0NfMl9TV19ERVYsCisjZGVmaW5lCV9TQ18yX1NXX0RFVgkJCV9TQ18yX1NXX0RFVgorICAgIF9TQ18yX0xPQ0FMRURFRiwKKyNkZWZpbmUJX1NDXzJfTE9DQUxFREVGCQkJX1NDXzJfTE9DQUxFREVGCisKKyAgICBfU0NfUElJLAorI2RlZmluZQlfU0NfUElJCQkJCV9TQ19QSUkKKyAgICBfU0NfUElJX1hUSSwKKyNkZWZpbmUJX1NDX1BJSV9YVEkJCQlfU0NfUElJX1hUSQorICAgIF9TQ19QSUlfU09DS0VULAorI2RlZmluZQlfU0NfUElJX1NPQ0tFVAkJCV9TQ19QSUlfU09DS0VUCisgICAgX1NDX1BJSV9JTlRFUk5FVCwKKyNkZWZpbmUJX1NDX1BJSV9JTlRFUk5FVAkJX1NDX1BJSV9JTlRFUk5FVAorICAgIF9TQ19QSUlfT1NJLAorI2RlZmluZQlfU0NfUElJX09TSQkJCV9TQ19QSUlfT1NJCisgICAgX1NDX1BPTEwsCisjZGVmaW5lCV9TQ19QT0xMCQkJX1NDX1BPTEwKKyAgICBfU0NfU0VMRUNULAorI2RlZmluZQlfU0NfU0VMRUNUCQkJX1NDX1NFTEVDVAorICAgIF9TQ19VSU9fTUFYSU9WLAorI2RlZmluZQlfU0NfVUlPX01BWElPVgkJCV9TQ19VSU9fTUFYSU9WCisgICAgX1NDX0lPVl9NQVggPSBfU0NfVUlPX01BWElPViwKKyNkZWZpbmUgX1NDX0lPVl9NQVgJCQlfU0NfSU9WX01BWAorICAgIF9TQ19QSUlfSU5URVJORVRfU1RSRUFNLAorI2RlZmluZQlfU0NfUElJX0lOVEVSTkVUX1NUUkVBTQkJX1NDX1BJSV9JTlRFUk5FVF9TVFJFQU0KKyAgICBfU0NfUElJX0lOVEVSTkVUX0RHUkFNLAorI2RlZmluZQlfU0NfUElJX0lOVEVSTkVUX0RHUkFNCQlfU0NfUElJX0lOVEVSTkVUX0RHUkFNCisgICAgX1NDX1BJSV9PU0lfQ09UUywKKyNkZWZpbmUJX1NDX1BJSV9PU0lfQ09UUwkJX1NDX1BJSV9PU0lfQ09UUworICAgIF9TQ19QSUlfT1NJX0NMVFMsCisjZGVmaW5lCV9TQ19QSUlfT1NJX0NMVFMJCV9TQ19QSUlfT1NJX0NMVFMKKyAgICBfU0NfUElJX09TSV9NLAorI2RlZmluZQlfU0NfUElJX09TSV9NCQkJX1NDX1BJSV9PU0lfTQorICAgIF9TQ19UX0lPVl9NQVgsCisjZGVmaW5lCV9TQ19UX0lPVl9NQVgJCQlfU0NfVF9JT1ZfTUFYCisKKyAgICAvKiBWYWx1ZXMgYWNjb3JkaW5nIHRvIFBPU0lYIDEwMDMuMWMgKFBPU0lYIHRocmVhZHMpLiAgKi8KKyAgICBfU0NfVEhSRUFEUywKKyNkZWZpbmUJX1NDX1RIUkVBRFMJCQlfU0NfVEhSRUFEUworICAgIF9TQ19USFJFQURfU0FGRV9GVU5DVElPTlMsCisjZGVmaW5lIF9TQ19USFJFQURfU0FGRV9GVU5DVElPTlMJX1NDX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUworICAgIF9TQ19HRVRHUl9SX1NJWkVfTUFYLAorI2RlZmluZQlfU0NfR0VUR1JfUl9TSVpFX01BWAkJX1NDX0dFVEdSX1JfU0laRV9NQVgKKyAgICBfU0NfR0VUUFdfUl9TSVpFX01BWCwKKyNkZWZpbmUJX1NDX0dFVFBXX1JfU0laRV9NQVgJCV9TQ19HRVRQV19SX1NJWkVfTUFYCisgICAgX1NDX0xPR0lOX05BTUVfTUFYLAorI2RlZmluZQlfU0NfTE9HSU5fTkFNRV9NQVgJCV9TQ19MT0dJTl9OQU1FX01BWAorICAgIF9TQ19UVFlfTkFNRV9NQVgsCisjZGVmaW5lCV9TQ19UVFlfTkFNRV9NQVgJCV9TQ19UVFlfTkFNRV9NQVgKKyAgICBfU0NfVEhSRUFEX0RFU1RSVUNUT1JfSVRFUkFUSU9OUywKKyNkZWZpbmUJX1NDX1RIUkVBRF9ERVNUUlVDVE9SX0lURVJBVElPTlMgX1NDX1RIUkVBRF9ERVNUUlVDVE9SX0lURVJBVElPTlMKKyAgICBfU0NfVEhSRUFEX0tFWVNfTUFYLAorI2RlZmluZQlfU0NfVEhSRUFEX0tFWVNfTUFYCQlfU0NfVEhSRUFEX0tFWVNfTUFYCisgICAgX1NDX1RIUkVBRF9TVEFDS19NSU4sCisjZGVmaW5lCV9TQ19USFJFQURfU1RBQ0tfTUlOCQlfU0NfVEhSRUFEX1NUQUNLX01JTgorICAgIF9TQ19USFJFQURfVEhSRUFEU19NQVgsCisjZGVmaW5lCV9TQ19USFJFQURfVEhSRUFEU19NQVgJCV9TQ19USFJFQURfVEhSRUFEU19NQVgKKyAgICBfU0NfVEhSRUFEX0FUVFJfU1RBQ0tBRERSLAorI2RlZmluZQlfU0NfVEhSRUFEX0FUVFJfU1RBQ0tBRERSCV9TQ19USFJFQURfQVRUUl9TVEFDS0FERFIKKyAgICBfU0NfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFLAorI2RlZmluZQlfU0NfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFCV9TQ19USFJFQURfQVRUUl9TVEFDS1NJWkUKKyAgICBfU0NfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcsCisjZGVmaW5lCV9TQ19USFJFQURfUFJJT1JJVFlfU0NIRURVTElORwlfU0NfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcKKyAgICBfU0NfVEhSRUFEX1BSSU9fSU5IRVJJVCwKKyNkZWZpbmUJX1NDX1RIUkVBRF9QUklPX0lOSEVSSVQJCV9TQ19USFJFQURfUFJJT19JTkhFUklUCisgICAgX1NDX1RIUkVBRF9QUklPX1BST1RFQ1QsCisjZGVmaW5lCV9TQ19USFJFQURfUFJJT19QUk9URUNUCQlfU0NfVEhSRUFEX1BSSU9fUFJPVEVDVAorICAgIF9TQ19USFJFQURfUFJPQ0VTU19TSEFSRUQsCisjZGVmaW5lCV9TQ19USFJFQURfUFJPQ0VTU19TSEFSRUQJX1NDX1RIUkVBRF9QUk9DRVNTX1NIQVJFRAorCisgICAgX1NDX05QUk9DRVNTT1JTX0NPTkYsCisjZGVmaW5lIF9TQ19OUFJPQ0VTU09SU19DT05GCQlfU0NfTlBST0NFU1NPUlNfQ09ORgorICAgIF9TQ19OUFJPQ0VTU09SU19PTkxOLAorI2RlZmluZSBfU0NfTlBST0NFU1NPUlNfT05MTgkJX1NDX05QUk9DRVNTT1JTX09OTE4KKyAgICBfU0NfUEhZU19QQUdFUywKKyNkZWZpbmUgX1NDX1BIWVNfUEFHRVMJCQlfU0NfUEhZU19QQUdFUworICAgIF9TQ19BVlBIWVNfUEFHRVMsCisjZGVmaW5lIF9TQ19BVlBIWVNfUEFHRVMJCV9TQ19BVlBIWVNfUEFHRVMKKyAgICBfU0NfQVRFWElUX01BWCwKKyNkZWZpbmUgX1NDX0FURVhJVF9NQVgJCQlfU0NfQVRFWElUX01BWAorICAgIF9TQ19QQVNTX01BWCwKKyNkZWZpbmUgX1NDX1BBU1NfTUFYCQkJX1NDX1BBU1NfTUFYCisKKyAgICBfU0NfWE9QRU5fVkVSU0lPTiwKKyNkZWZpbmUgX1NDX1hPUEVOX1ZFUlNJT04JCV9TQ19YT1BFTl9WRVJTSU9OCisgICAgX1NDX1hPUEVOX1hDVV9WRVJTSU9OLAorI2RlZmluZSBfU0NfWE9QRU5fWENVX1ZFUlNJT04JCV9TQ19YT1BFTl9YQ1VfVkVSU0lPTgorICAgIF9TQ19YT1BFTl9VTklYLAorI2RlZmluZSBfU0NfWE9QRU5fVU5JWAkJCV9TQ19YT1BFTl9VTklYCisgICAgX1NDX1hPUEVOX0NSWVBULAorI2RlZmluZSBfU0NfWE9QRU5fQ1JZUFQJCQlfU0NfWE9QRU5fQ1JZUFQKKyAgICBfU0NfWE9QRU5fRU5IX0kxOE4sCisjZGVmaW5lIF9TQ19YT1BFTl9FTkhfSTE4TgkJX1NDX1hPUEVOX0VOSF9JMThOCisgICAgX1NDX1hPUEVOX1NITSwKKyNkZWZpbmUgX1NDX1hPUEVOX1NITQkJCV9TQ19YT1BFTl9TSE0KKworICAgIF9TQ18yX0NIQVJfVEVSTSwKKyNkZWZpbmUgX1NDXzJfQ0hBUl9URVJNCQkJX1NDXzJfQ0hBUl9URVJNCisgICAgX1NDXzJfQ19WRVJTSU9OLAorI2RlZmluZSBfU0NfMl9DX1ZFUlNJT04JCQlfU0NfMl9DX1ZFUlNJT04KKyAgICBfU0NfMl9VUEUsCisjZGVmaW5lIF9TQ18yX1VQRQkJCV9TQ18yX1VQRQorCisgICAgX1NDX1hPUEVOX1hQRzIsCisjZGVmaW5lIF9TQ19YT1BFTl9YUEcyCQkJX1NDX1hPUEVOX1hQRzIKKyAgICBfU0NfWE9QRU5fWFBHMywKKyNkZWZpbmUgX1NDX1hPUEVOX1hQRzMJCQlfU0NfWE9QRU5fWFBHMworICAgIF9TQ19YT1BFTl9YUEc0LAorI2RlZmluZSBfU0NfWE9QRU5fWFBHNAkJCV9TQ19YT1BFTl9YUEc0CisKKyAgICBfU0NfQ0hBUl9CSVQsCisjZGVmaW5lCV9TQ19DSEFSX0JJVAkJCV9TQ19DSEFSX0JJVAorICAgIF9TQ19DSEFSX01BWCwKKyNkZWZpbmUJX1NDX0NIQVJfTUFYCQkJX1NDX0NIQVJfTUFYCisgICAgX1NDX0NIQVJfTUlOLAorI2RlZmluZQlfU0NfQ0hBUl9NSU4JCQlfU0NfQ0hBUl9NSU4KKyAgICBfU0NfSU5UX01BWCwKKyNkZWZpbmUJX1NDX0lOVF9NQVgJCQlfU0NfSU5UX01BWAorICAgIF9TQ19JTlRfTUlOLAorI2RlZmluZQlfU0NfSU5UX01JTgkJCV9TQ19JTlRfTUlOCisgICAgX1NDX0xPTkdfQklULAorI2RlZmluZQlfU0NfTE9OR19CSVQJCQlfU0NfTE9OR19CSVQKKyAgICBfU0NfV09SRF9CSVQsCisjZGVmaW5lCV9TQ19XT1JEX0JJVAkJCV9TQ19XT1JEX0JJVAorICAgIF9TQ19NQl9MRU5fTUFYLAorI2RlZmluZQlfU0NfTUJfTEVOX01BWAkJCV9TQ19NQl9MRU5fTUFYCisgICAgX1NDX05aRVJPLAorI2RlZmluZQlfU0NfTlpFUk8JCQlfU0NfTlpFUk8KKyAgICBfU0NfU1NJWkVfTUFYLAorI2RlZmluZQlfU0NfU1NJWkVfTUFYCQkJX1NDX1NTSVpFX01BWAorICAgIF9TQ19TQ0hBUl9NQVgsCisjZGVmaW5lCV9TQ19TQ0hBUl9NQVgJCQlfU0NfU0NIQVJfTUFYCisgICAgX1NDX1NDSEFSX01JTiwKKyNkZWZpbmUJX1NDX1NDSEFSX01JTgkJCV9TQ19TQ0hBUl9NSU4KKyAgICBfU0NfU0hSVF9NQVgsCisjZGVmaW5lCV9TQ19TSFJUX01BWAkJCV9TQ19TSFJUX01BWAorICAgIF9TQ19TSFJUX01JTiwKKyNkZWZpbmUJX1NDX1NIUlRfTUlOCQkJX1NDX1NIUlRfTUlOCisgICAgX1NDX1VDSEFSX01BWCwKKyNkZWZpbmUJX1NDX1VDSEFSX01BWAkJCV9TQ19VQ0hBUl9NQVgKKyAgICBfU0NfVUlOVF9NQVgsCisjZGVmaW5lCV9TQ19VSU5UX01BWAkJCV9TQ19VSU5UX01BWAorICAgIF9TQ19VTE9OR19NQVgsCisjZGVmaW5lCV9TQ19VTE9OR19NQVgJCQlfU0NfVUxPTkdfTUFYCisgICAgX1NDX1VTSFJUX01BWCwKKyNkZWZpbmUJX1NDX1VTSFJUX01BWAkJCV9TQ19VU0hSVF9NQVgKKworICAgIF9TQ19OTF9BUkdNQVgsCisjZGVmaW5lCV9TQ19OTF9BUkdNQVgJCQlfU0NfTkxfQVJHTUFYCisgICAgX1NDX05MX0xBTkdNQVgsCisjZGVmaW5lCV9TQ19OTF9MQU5HTUFYCQkJX1NDX05MX0xBTkdNQVgKKyAgICBfU0NfTkxfTVNHTUFYLAorI2RlZmluZQlfU0NfTkxfTVNHTUFYCQkJX1NDX05MX01TR01BWAorICAgIF9TQ19OTF9OTUFYLAorI2RlZmluZQlfU0NfTkxfTk1BWAkJCV9TQ19OTF9OTUFYCisgICAgX1NDX05MX1NFVE1BWCwKKyNkZWZpbmUJX1NDX05MX1NFVE1BWAkJCV9TQ19OTF9TRVRNQVgKKyAgICBfU0NfTkxfVEVYVE1BWCwKKyNkZWZpbmUJX1NDX05MX1RFWFRNQVgJCQlfU0NfTkxfVEVYVE1BWAorCisgICAgX1NDX1hCUzVfSUxQMzJfT0ZGMzIsCisjZGVmaW5lIF9TQ19YQlM1X0lMUDMyX09GRjMyCQlfU0NfWEJTNV9JTFAzMl9PRkYzMgorICAgIF9TQ19YQlM1X0lMUDMyX09GRkJJRywKKyNkZWZpbmUgX1NDX1hCUzVfSUxQMzJfT0ZGQklHCQlfU0NfWEJTNV9JTFAzMl9PRkZCSUcKKyAgICBfU0NfWEJTNV9MUDY0X09GRjY0LAorI2RlZmluZSBfU0NfWEJTNV9MUDY0X09GRjY0CQlfU0NfWEJTNV9MUDY0X09GRjY0CisgICAgX1NDX1hCUzVfTFBCSUdfT0ZGQklHLAorI2RlZmluZSBfU0NfWEJTNV9MUEJJR19PRkZCSUcJCV9TQ19YQlM1X0xQQklHX09GRkJJRworCisgICAgX1NDX1hPUEVOX0xFR0FDWSwKKyNkZWZpbmUgX1NDX1hPUEVOX0xFR0FDWQkJX1NDX1hPUEVOX0xFR0FDWQorICAgIF9TQ19YT1BFTl9SRUFMVElNRSwKKyNkZWZpbmUgX1NDX1hPUEVOX1JFQUxUSU1FCQlfU0NfWE9QRU5fUkVBTFRJTUUKKyAgICBfU0NfWE9QRU5fUkVBTFRJTUVfVEhSRUFEUywKKyNkZWZpbmUgX1NDX1hPUEVOX1JFQUxUSU1FX1RIUkVBRFMJX1NDX1hPUEVOX1JFQUxUSU1FX1RIUkVBRFMKKworICAgIF9TQ19BRFZJU09SWV9JTkZPLAorI2RlZmluZSBfU0NfQURWSVNPUllfSU5GTwkJX1NDX0FEVklTT1JZX0lORk8KKyAgICBfU0NfQkFSUklFUlMsCisjZGVmaW5lIF9TQ19CQVJSSUVSUwkJCV9TQ19CQVJSSUVSUworICAgIF9TQ19CQVNFLAorI2RlZmluZSBfU0NfQkFTRQkJCV9TQ19CQVNFCisgICAgX1NDX0NfTEFOR19TVVBQT1JULAorI2RlZmluZSBfU0NfQ19MQU5HX1NVUFBPUlQJCV9TQ19DX0xBTkdfU1VQUE9SVAorICAgIF9TQ19DX0xBTkdfU1VQUE9SVF9SLAorI2RlZmluZSBfU0NfQ19MQU5HX1NVUFBPUlRfUgkJX1NDX0NfTEFOR19TVVBQT1JUX1IKKyAgICBfU0NfQ0xPQ0tfU0VMRUNUSU9OLAorI2RlZmluZSBfU0NfQ0xPQ0tfU0VMRUNUSU9OCQlfU0NfQ0xPQ0tfU0VMRUNUSU9OCisgICAgX1NDX0NQVVRJTUUsCisjZGVmaW5lIF9TQ19DUFVUSU1FCQkJX1NDX0NQVVRJTUUKKyAgICBfU0NfVEhSRUFEX0NQVVRJTUUsCisjZGVmaW5lIF9TQ19USFJFQURfQ1BVVElNRQkJX1NDX1RIUkVBRF9DUFVUSU1FCisgICAgX1NDX0RFVklDRV9JTywKKyNkZWZpbmUgX1NDX0RFVklDRV9JTwkJCV9TQ19ERVZJQ0VfSU8KKyAgICBfU0NfREVWSUNFX1NQRUNJRklDLAorI2RlZmluZSBfU0NfREVWSUNFX1NQRUNJRklDCQlfU0NfREVWSUNFX1NQRUNJRklDCisgICAgX1NDX0RFVklDRV9TUEVDSUZJQ19SLAorI2RlZmluZSBfU0NfREVWSUNFX1NQRUNJRklDX1IJCV9TQ19ERVZJQ0VfU1BFQ0lGSUNfUgorICAgIF9TQ19GRF9NR01ULAorI2RlZmluZSBfU0NfRkRfTUdNVAkJCV9TQ19GRF9NR01UCisgICAgX1NDX0ZJRk8sCisjZGVmaW5lIF9TQ19GSUZPCQkJX1NDX0ZJRk8KKyAgICBfU0NfUElQRSwKKyNkZWZpbmUgX1NDX1BJUEUJCQlfU0NfUElQRQorICAgIF9TQ19GSUxFX0FUVFJJQlVURVMsCisjZGVmaW5lIF9TQ19GSUxFX0FUVFJJQlVURVMJCV9TQ19GSUxFX0FUVFJJQlVURVMKKyAgICBfU0NfRklMRV9MT0NLSU5HLAorI2RlZmluZSBfU0NfRklMRV9MT0NLSU5HCQlfU0NfRklMRV9MT0NLSU5HCisgICAgX1NDX0ZJTEVfU1lTVEVNLAorI2RlZmluZSBfU0NfRklMRV9TWVNURU0JCQlfU0NfRklMRV9TWVNURU0KKyAgICBfU0NfTU9OT1RPTklDX0NMT0NLLAorI2RlZmluZSBfU0NfTU9OT1RPTklDX0NMT0NLCQlfU0NfTU9OT1RPTklDX0NMT0NLCisgICAgX1NDX01VTFRJX1BST0NFU1MsCisjZGVmaW5lIF9TQ19NVUxUSV9QUk9DRVNTCQlfU0NfTVVMVElfUFJPQ0VTUworICAgIF9TQ19TSU5HTEVfUFJPQ0VTUywKKyNkZWZpbmUgX1NDX1NJTkdMRV9QUk9DRVNTCQlfU0NfU0lOR0xFX1BST0NFU1MKKyAgICBfU0NfTkVUV09SS0lORywKKyNkZWZpbmUgX1NDX05FVFdPUktJTkcJCQlfU0NfTkVUV09SS0lORworICAgIF9TQ19SRUFERVJfV1JJVEVSX0xPQ0tTLAorI2RlZmluZSBfU0NfUkVBREVSX1dSSVRFUl9MT0NLUwkJX1NDX1JFQURFUl9XUklURVJfTE9DS1MKKyAgICBfU0NfU1BJTl9MT0NLUywKKyNkZWZpbmUgX1NDX1NQSU5fTE9DS1MJCQlfU0NfU1BJTl9MT0NLUworICAgIF9TQ19SRUdFWFAsCisjZGVmaW5lIF9TQ19SRUdFWFAJCQlfU0NfUkVHRVhQCisgICAgX1NDX1JFR0VYX1ZFUlNJT04sCisjZGVmaW5lIF9TQ19SRUdFWF9WRVJTSU9OCQlfU0NfUkVHRVhfVkVSU0lPTgorICAgIF9TQ19TSEVMTCwKKyNkZWZpbmUgX1NDX1NIRUxMCQkJX1NDX1NIRUxMCisgICAgX1NDX1NJR05BTFMsCisjZGVmaW5lIF9TQ19TSUdOQUxTCQkJX1NDX1NJR05BTFMKKyAgICBfU0NfU1BBV04sCisjZGVmaW5lIF9TQ19TUEFXTgkJCV9TQ19TUEFXTgorICAgIF9TQ19TUE9SQURJQ19TRVJWRVIsCisjZGVmaW5lIF9TQ19TUE9SQURJQ19TRVJWRVIJCV9TQ19TUE9SQURJQ19TRVJWRVIKKyAgICBfU0NfVEhSRUFEX1NQT1JBRElDX1NFUlZFUiwKKyNkZWZpbmUgX1NDX1RIUkVBRF9TUE9SQURJQ19TRVJWRVIJX1NDX1RIUkVBRF9TUE9SQURJQ19TRVJWRVIKKyAgICBfU0NfU1lTVEVNX0RBVEFCQVNFLAorI2RlZmluZSBfU0NfU1lTVEVNX0RBVEFCQVNFCQlfU0NfU1lTVEVNX0RBVEFCQVNFCisgICAgX1NDX1NZU1RFTV9EQVRBQkFTRV9SLAorI2RlZmluZSBfU0NfU1lTVEVNX0RBVEFCQVNFX1IJCV9TQ19TWVNURU1fREFUQUJBU0VfUgorICAgIF9TQ19USU1FT1VUUywKKyNkZWZpbmUgX1NDX1RJTUVPVVRTCQkJX1NDX1RJTUVPVVRTCisgICAgX1NDX1RZUEVEX01FTU9SWV9PQkpFQ1RTLAorI2RlZmluZSBfU0NfVFlQRURfTUVNT1JZX09CSkVDVFMJX1NDX1RZUEVEX01FTU9SWV9PQkpFQ1RTCisgICAgX1NDX1VTRVJfR1JPVVBTLAorI2RlZmluZSBfU0NfVVNFUl9HUk9VUFMJCQlfU0NfVVNFUl9HUk9VUFMKKyAgICBfU0NfVVNFUl9HUk9VUFNfUiwKKyNkZWZpbmUgX1NDX1VTRVJfR1JPVVBTX1IJCV9TQ19VU0VSX0dST1VQU19SCisgICAgX1NDXzJfUEJTLAorI2RlZmluZSBfU0NfMl9QQlMJCQlfU0NfMl9QQlMKKyAgICBfU0NfMl9QQlNfQUNDT1VOVElORywKKyNkZWZpbmUgX1NDXzJfUEJTX0FDQ09VTlRJTkcJCV9TQ18yX1BCU19BQ0NPVU5USU5HCisgICAgX1NDXzJfUEJTX0xPQ0FURSwKKyNkZWZpbmUgX1NDXzJfUEJTX0xPQ0FURQkJX1NDXzJfUEJTX0xPQ0FURQorICAgIF9TQ18yX1BCU19NRVNTQUdFLAorI2RlZmluZSBfU0NfMl9QQlNfTUVTU0FHRQkJX1NDXzJfUEJTX01FU1NBR0UKKyAgICBfU0NfMl9QQlNfVFJBQ0ssCisjZGVmaW5lIF9TQ18yX1BCU19UUkFDSwkJCV9TQ18yX1BCU19UUkFDSworICAgIF9TQ19TWU1MT09QX01BWCwKKyNkZWZpbmUgX1NDX1NZTUxPT1BfTUFYCQkJX1NDX1NZTUxPT1BfTUFYCisgICAgX1NDX1NUUkVBTVMsCisjZGVmaW5lIF9TQ19TVFJFQU1TCQkJX1NDX1NUUkVBTVMKKyAgICBfU0NfMl9QQlNfQ0hFQ0tQT0lOVCwKKyNkZWZpbmUgX1NDXzJfUEJTX0NIRUNLUE9JTlQJCV9TQ18yX1BCU19DSEVDS1BPSU5UCisKKyAgICBfU0NfVjZfSUxQMzJfT0ZGMzIsCisjZGVmaW5lIF9TQ19WNl9JTFAzMl9PRkYzMgkJX1NDX1Y2X0lMUDMyX09GRjMyCisgICAgX1NDX1Y2X0lMUDMyX09GRkJJRywKKyNkZWZpbmUgX1NDX1Y2X0lMUDMyX09GRkJJRwkJX1NDX1Y2X0lMUDMyX09GRkJJRworICAgIF9TQ19WNl9MUDY0X09GRjY0LAorI2RlZmluZSBfU0NfVjZfTFA2NF9PRkY2NAkJX1NDX1Y2X0xQNjRfT0ZGNjQKKyAgICBfU0NfVjZfTFBCSUdfT0ZGQklHLAorI2RlZmluZSBfU0NfVjZfTFBCSUdfT0ZGQklHCQlfU0NfVjZfTFBCSUdfT0ZGQklHCisKKyAgICBfU0NfSE9TVF9OQU1FX01BWCwKKyNkZWZpbmUgX1NDX0hPU1RfTkFNRV9NQVgJCV9TQ19IT1NUX05BTUVfTUFYCisgICAgX1NDX1RSQUNFLAorI2RlZmluZSBfU0NfVFJBQ0UJCQlfU0NfVFJBQ0UKKyAgICBfU0NfVFJBQ0VfRVZFTlRfRklMVEVSLAorI2RlZmluZSBfU0NfVFJBQ0VfRVZFTlRfRklMVEVSCQlfU0NfVFJBQ0VfRVZFTlRfRklMVEVSCisgICAgX1NDX1RSQUNFX0lOSEVSSVQsCisjZGVmaW5lIF9TQ19UUkFDRV9JTkhFUklUCQlfU0NfVFJBQ0VfSU5IRVJJVAorICAgIF9TQ19UUkFDRV9MT0csCisjZGVmaW5lIF9TQ19UUkFDRV9MT0cJCQlfU0NfVFJBQ0VfTE9HCisKKyAgICBfU0NfTEVWRUwxX0lDQUNIRV9TSVpFLAorI2RlZmluZSBfU0NfTEVWRUwxX0lDQUNIRV9TSVpFCQlfU0NfTEVWRUwxX0lDQUNIRV9TSVpFCisgICAgX1NDX0xFVkVMMV9JQ0FDSEVfQVNTT0MsCisjZGVmaW5lIF9TQ19MRVZFTDFfSUNBQ0hFX0FTU09DCQlfU0NfTEVWRUwxX0lDQUNIRV9BU1NPQworICAgIF9TQ19MRVZFTDFfSUNBQ0hFX0xJTkVTSVpFLAorI2RlZmluZSBfU0NfTEVWRUwxX0lDQUNIRV9MSU5FU0laRQlfU0NfTEVWRUwxX0lDQUNIRV9MSU5FU0laRQorICAgIF9TQ19MRVZFTDFfRENBQ0hFX1NJWkUsCisjZGVmaW5lIF9TQ19MRVZFTDFfRENBQ0hFX1NJWkUJCV9TQ19MRVZFTDFfRENBQ0hFX1NJWkUKKyAgICBfU0NfTEVWRUwxX0RDQUNIRV9BU1NPQywKKyNkZWZpbmUgX1NDX0xFVkVMMV9EQ0FDSEVfQVNTT0MJCV9TQ19MRVZFTDFfRENBQ0hFX0FTU09DCisgICAgX1NDX0xFVkVMMV9EQ0FDSEVfTElORVNJWkUsCisjZGVmaW5lIF9TQ19MRVZFTDFfRENBQ0hFX0xJTkVTSVpFCV9TQ19MRVZFTDFfRENBQ0hFX0xJTkVTSVpFCisgICAgX1NDX0xFVkVMMl9DQUNIRV9TSVpFLAorI2RlZmluZSBfU0NfTEVWRUwyX0NBQ0hFX1NJWkUJCV9TQ19MRVZFTDJfQ0FDSEVfU0laRQorICAgIF9TQ19MRVZFTDJfQ0FDSEVfQVNTT0MsCisjZGVmaW5lIF9TQ19MRVZFTDJfQ0FDSEVfQVNTT0MJCV9TQ19MRVZFTDJfQ0FDSEVfQVNTT0MKKyAgICBfU0NfTEVWRUwyX0NBQ0hFX0xJTkVTSVpFLAorI2RlZmluZSBfU0NfTEVWRUwyX0NBQ0hFX0xJTkVTSVpFCV9TQ19MRVZFTDJfQ0FDSEVfTElORVNJWkUKKyAgICBfU0NfTEVWRUwzX0NBQ0hFX1NJWkUsCisjZGVmaW5lIF9TQ19MRVZFTDNfQ0FDSEVfU0laRQkJX1NDX0xFVkVMM19DQUNIRV9TSVpFCisgICAgX1NDX0xFVkVMM19DQUNIRV9BU1NPQywKKyNkZWZpbmUgX1NDX0xFVkVMM19DQUNIRV9BU1NPQwkJX1NDX0xFVkVMM19DQUNIRV9BU1NPQworICAgIF9TQ19MRVZFTDNfQ0FDSEVfTElORVNJWkUsCisjZGVmaW5lIF9TQ19MRVZFTDNfQ0FDSEVfTElORVNJWkUJX1NDX0xFVkVMM19DQUNIRV9MSU5FU0laRQorICAgIF9TQ19MRVZFTDRfQ0FDSEVfU0laRSwKKyNkZWZpbmUgX1NDX0xFVkVMNF9DQUNIRV9TSVpFCQlfU0NfTEVWRUw0X0NBQ0hFX1NJWkUKKyAgICBfU0NfTEVWRUw0X0NBQ0hFX0FTU09DLAorI2RlZmluZSBfU0NfTEVWRUw0X0NBQ0hFX0FTU09DCQlfU0NfTEVWRUw0X0NBQ0hFX0FTU09DCisgICAgX1NDX0xFVkVMNF9DQUNIRV9MSU5FU0laRSwKKyNkZWZpbmUgX1NDX0xFVkVMNF9DQUNIRV9MSU5FU0laRQlfU0NfTEVWRUw0X0NBQ0hFX0xJTkVTSVpFCisgICAgLyogTGVhdmUgcm9vbSBoZXJlLCBtYXliZSB3ZSBuZWVkIGEgZmV3IG1vcmUgY2FjaGUgbGV2ZWxzIHNvbWUgZGF5LiAgKi8KKworICAgIF9TQ19JUFY2ID0gX1NDX0xFVkVMMV9JQ0FDSEVfU0laRSArIDUwLAorI2RlZmluZSBfU0NfSVBWNgkJCV9TQ19JUFY2CisgICAgX1NDX1JBV19TT0NLRVRTLAorI2RlZmluZSBfU0NfUkFXX1NPQ0tFVFMJCQlfU0NfUkFXX1NPQ0tFVFMKKworICAgIF9TQ19WN19JTFAzMl9PRkYzMiwKKyNkZWZpbmUgX1NDX1Y3X0lMUDMyX09GRjMyCQlfU0NfVjdfSUxQMzJfT0ZGMzIKKyAgICBfU0NfVjdfSUxQMzJfT0ZGQklHLAorI2RlZmluZSBfU0NfVjdfSUxQMzJfT0ZGQklHCQlfU0NfVjdfSUxQMzJfT0ZGQklHCisgICAgX1NDX1Y3X0xQNjRfT0ZGNjQsCisjZGVmaW5lIF9TQ19WN19MUDY0X09GRjY0CQlfU0NfVjdfTFA2NF9PRkY2NAorICAgIF9TQ19WN19MUEJJR19PRkZCSUcsCisjZGVmaW5lIF9TQ19WN19MUEJJR19PRkZCSUcJCV9TQ19WN19MUEJJR19PRkZCSUcKKworICAgIF9TQ19TU19SRVBMX01BWCwKKyNkZWZpbmUgX1NDX1NTX1JFUExfTUFYCQkJX1NDX1NTX1JFUExfTUFYCisKKyAgICBfU0NfVFJBQ0VfRVZFTlRfTkFNRV9NQVgsCisjZGVmaW5lIF9TQ19UUkFDRV9FVkVOVF9OQU1FX01BWAlfU0NfVFJBQ0VfRVZFTlRfTkFNRV9NQVgKKyAgICBfU0NfVFJBQ0VfTkFNRV9NQVgsCisjZGVmaW5lIF9TQ19UUkFDRV9OQU1FX01BWAkJX1NDX1RSQUNFX05BTUVfTUFYCisgICAgX1NDX1RSQUNFX1NZU19NQVgsCisjZGVmaW5lIF9TQ19UUkFDRV9TWVNfTUFYCQlfU0NfVFJBQ0VfU1lTX01BWAorICAgIF9TQ19UUkFDRV9VU0VSX0VWRU5UX01BWCwKKyNkZWZpbmUgX1NDX1RSQUNFX1VTRVJfRVZFTlRfTUFYCV9TQ19UUkFDRV9VU0VSX0VWRU5UX01BWAorCisgICAgX1NDX1hPUEVOX1NUUkVBTVMsCisjZGVmaW5lIF9TQ19YT1BFTl9TVFJFQU1TCQlfU0NfWE9QRU5fU1RSRUFNUworCisgICAgX1NDX1RIUkVBRF9ST0JVU1RfUFJJT19JTkhFUklULAorI2RlZmluZSBfU0NfVEhSRUFEX1JPQlVTVF9QUklPX0lOSEVSSVQJX1NDX1RIUkVBRF9ST0JVU1RfUFJJT19JTkhFUklUCisgICAgX1NDX1RIUkVBRF9ST0JVU1RfUFJJT19QUk9URUNUCisjZGVmaW5lIF9TQ19USFJFQURfUk9CVVNUX1BSSU9fUFJPVEVDVAlfU0NfVEhSRUFEX1JPQlVTVF9QUklPX1BST1RFQ1QKKyAgfTsKKworLyogVmFsdWVzIGZvciB0aGUgTkFNRSBhcmd1bWVudCB0byBgY29uZnN0cicuICAqLworZW51bQorICB7CisgICAgX0NTX1BBVEgsCQkJLyogVGhlIGRlZmF1bHQgc2VhcmNoIHBhdGguICAqLworI2RlZmluZSBfQ1NfUEFUSAkJX0NTX1BBVEgKKworICAgIF9DU19WNl9XSURUSF9SRVNUUklDVEVEX0VOVlMsCisjZGVmaW5lIF9DU19WNl9XSURUSF9SRVNUUklDVEVEX0VOVlMJX0NTX1Y2X1dJRFRIX1JFU1RSSUNURURfRU5WUworI2RlZmluZSBfQ1NfUE9TSVhfVjZfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTCV9DU19WNl9XSURUSF9SRVNUUklDVEVEX0VOVlMKKworICAgIF9DU19HTlVfTElCQ19WRVJTSU9OLAorI2RlZmluZSBfQ1NfR05VX0xJQkNfVkVSU0lPTglfQ1NfR05VX0xJQkNfVkVSU0lPTgorICAgIF9DU19HTlVfTElCUFRIUkVBRF9WRVJTSU9OLAorI2RlZmluZSBfQ1NfR05VX0xJQlBUSFJFQURfVkVSU0lPTglfQ1NfR05VX0xJQlBUSFJFQURfVkVSU0lPTgorCisgICAgX0NTX1Y1X1dJRFRIX1JFU1RSSUNURURfRU5WUywKKyNkZWZpbmUgX0NTX1Y1X1dJRFRIX1JFU1RSSUNURURfRU5WUwlfQ1NfVjVfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTCisjZGVmaW5lIF9DU19QT1NJWF9WNV9XSURUSF9SRVNUUklDVEVEX0VOVlMJX0NTX1Y1X1dJRFRIX1JFU1RSSUNURURfRU5WUworCisgICAgX0NTX1Y3X1dJRFRIX1JFU1RSSUNURURfRU5WUywKKyNkZWZpbmUgX0NTX1Y3X1dJRFRIX1JFU1RSSUNURURfRU5WUwlfQ1NfVjdfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTCisjZGVmaW5lIF9DU19QT1NJWF9WN19XSURUSF9SRVNUUklDVEVEX0VOVlMJX0NTX1Y3X1dJRFRIX1JFU1RSSUNURURfRU5WUworCisgICAgX0NTX0xGU19DRkxBR1MgPSAxMDAwLAorI2RlZmluZSBfQ1NfTEZTX0NGTEFHUwlfQ1NfTEZTX0NGTEFHUworICAgIF9DU19MRlNfTERGTEFHUywKKyNkZWZpbmUgX0NTX0xGU19MREZMQUdTCV9DU19MRlNfTERGTEFHUworICAgIF9DU19MRlNfTElCUywKKyNkZWZpbmUgX0NTX0xGU19MSUJTCQlfQ1NfTEZTX0xJQlMKKyAgICBfQ1NfTEZTX0xJTlRGTEFHUywKKyNkZWZpbmUgX0NTX0xGU19MSU5URkxBR1MJX0NTX0xGU19MSU5URkxBR1MKKyAgICBfQ1NfTEZTNjRfQ0ZMQUdTLAorI2RlZmluZSBfQ1NfTEZTNjRfQ0ZMQUdTCV9DU19MRlM2NF9DRkxBR1MKKyAgICBfQ1NfTEZTNjRfTERGTEFHUywKKyNkZWZpbmUgX0NTX0xGUzY0X0xERkxBR1MJX0NTX0xGUzY0X0xERkxBR1MKKyAgICBfQ1NfTEZTNjRfTElCUywKKyNkZWZpbmUgX0NTX0xGUzY0X0xJQlMJX0NTX0xGUzY0X0xJQlMKKyAgICBfQ1NfTEZTNjRfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfTEZTNjRfTElOVEZMQUdTCV9DU19MRlM2NF9MSU5URkxBR1MKKworICAgIF9DU19YQlM1X0lMUDMyX09GRjMyX0NGTEFHUyA9IDExMDAsCisjZGVmaW5lIF9DU19YQlM1X0lMUDMyX09GRjMyX0NGTEFHUyBfQ1NfWEJTNV9JTFAzMl9PRkYzMl9DRkxBR1MKKyAgICBfQ1NfWEJTNV9JTFAzMl9PRkYzMl9MREZMQUdTLAorI2RlZmluZSBfQ1NfWEJTNV9JTFAzMl9PRkYzMl9MREZMQUdTIF9DU19YQlM1X0lMUDMyX09GRjMyX0xERkxBR1MKKyAgICBfQ1NfWEJTNV9JTFAzMl9PRkYzMl9MSUJTLAorI2RlZmluZSBfQ1NfWEJTNV9JTFAzMl9PRkYzMl9MSUJTIF9DU19YQlM1X0lMUDMyX09GRjMyX0xJQlMKKyAgICBfQ1NfWEJTNV9JTFAzMl9PRkYzMl9MSU5URkxBR1MsCisjZGVmaW5lIF9DU19YQlM1X0lMUDMyX09GRjMyX0xJTlRGTEFHUyBfQ1NfWEJTNV9JTFAzMl9PRkYzMl9MSU5URkxBR1MKKyAgICBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfQ0ZMQUdTLAorI2RlZmluZSBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfQ0ZMQUdTIF9DU19YQlM1X0lMUDMyX09GRkJJR19DRkxBR1MKKyAgICBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfTERGTEFHUywKKyNkZWZpbmUgX0NTX1hCUzVfSUxQMzJfT0ZGQklHX0xERkxBR1MgX0NTX1hCUzVfSUxQMzJfT0ZGQklHX0xERkxBR1MKKyAgICBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfTElCUywKKyNkZWZpbmUgX0NTX1hCUzVfSUxQMzJfT0ZGQklHX0xJQlMgX0NTX1hCUzVfSUxQMzJfT0ZGQklHX0xJQlMKKyAgICBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfTElOVEZMQUdTIF9DU19YQlM1X0lMUDMyX09GRkJJR19MSU5URkxBR1MKKyAgICBfQ1NfWEJTNV9MUDY0X09GRjY0X0NGTEFHUywKKyNkZWZpbmUgX0NTX1hCUzVfTFA2NF9PRkY2NF9DRkxBR1MgX0NTX1hCUzVfTFA2NF9PRkY2NF9DRkxBR1MKKyAgICBfQ1NfWEJTNV9MUDY0X09GRjY0X0xERkxBR1MsCisjZGVmaW5lIF9DU19YQlM1X0xQNjRfT0ZGNjRfTERGTEFHUyBfQ1NfWEJTNV9MUDY0X09GRjY0X0xERkxBR1MKKyAgICBfQ1NfWEJTNV9MUDY0X09GRjY0X0xJQlMsCisjZGVmaW5lIF9DU19YQlM1X0xQNjRfT0ZGNjRfTElCUyBfQ1NfWEJTNV9MUDY0X09GRjY0X0xJQlMKKyAgICBfQ1NfWEJTNV9MUDY0X09GRjY0X0xJTlRGTEFHUywKKyNkZWZpbmUgX0NTX1hCUzVfTFA2NF9PRkY2NF9MSU5URkxBR1MgX0NTX1hCUzVfTFA2NF9PRkY2NF9MSU5URkxBR1MKKyAgICBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfQ0ZMQUdTLAorI2RlZmluZSBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfQ0ZMQUdTIF9DU19YQlM1X0xQQklHX09GRkJJR19DRkxBR1MKKyAgICBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfTERGTEFHUywKKyNkZWZpbmUgX0NTX1hCUzVfTFBCSUdfT0ZGQklHX0xERkxBR1MgX0NTX1hCUzVfTFBCSUdfT0ZGQklHX0xERkxBR1MKKyAgICBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfTElCUywKKyNkZWZpbmUgX0NTX1hCUzVfTFBCSUdfT0ZGQklHX0xJQlMgX0NTX1hCUzVfTFBCSUdfT0ZGQklHX0xJQlMKKyAgICBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfTElOVEZMQUdTIF9DU19YQlM1X0xQQklHX09GRkJJR19MSU5URkxBR1MKKworICAgIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9DRkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9DRkxBR1MgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRjMyX0NGTEFHUworICAgIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9MREZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGMzJfTERGTEFHUyBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGMzJfTERGTEFHUworICAgIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9MSUJTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGMzJfTElCUyBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGMzJfTElCUworICAgIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9MSU5URkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9MSU5URkxBR1MgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRjMyX0xJTlRGTEFHUworICAgIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfQ0ZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGQklHX0NGTEFHUyBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGQklHX0NGTEFHUworICAgIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfTERGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRkJJR19MREZMQUdTIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfTERGTEFHUworICAgIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfTElCUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRkJJR19MSUJTIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfTElCUworICAgIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGQklHX0xJTlRGTEFHUyBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGQklHX0xJTlRGTEFHUworICAgIF9DU19QT1NJWF9WNl9MUDY0X09GRjY0X0NGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfQ0ZMQUdTIF9DU19QT1NJWF9WNl9MUDY0X09GRjY0X0NGTEFHUworICAgIF9DU19QT1NJWF9WNl9MUDY0X09GRjY0X0xERkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9MUDY0X09GRjY0X0xERkxBR1MgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfTERGTEFHUworICAgIF9DU19QT1NJWF9WNl9MUDY0X09GRjY0X0xJQlMsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9MUDY0X09GRjY0X0xJQlMgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfTElCUworICAgIF9DU19QT1NJWF9WNl9MUDY0X09GRjY0X0xJTlRGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0xQNjRfT0ZGNjRfTElOVEZMQUdTIF9DU19QT1NJWF9WNl9MUDY0X09GRjY0X0xJTlRGTEFHUworICAgIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfQ0ZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfTFBCSUdfT0ZGQklHX0NGTEFHUyBfQ1NfUE9TSVhfVjZfTFBCSUdfT0ZGQklHX0NGTEFHUworICAgIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfTERGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0xQQklHX09GRkJJR19MREZMQUdTIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfTERGTEFHUworICAgIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfTElCUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0xQQklHX09GRkJJR19MSUJTIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfTElCUworICAgIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfTFBCSUdfT0ZGQklHX0xJTlRGTEFHUyBfQ1NfUE9TSVhfVjZfTFBCSUdfT0ZGQklHX0xJTlRGTEFHUworCisgICAgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRjMyX0NGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRjMyX0NGTEFHUyBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGMzJfQ0ZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRjMyX0xERkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WN19JTFAzMl9PRkYzMl9MREZMQUdTIF9DU19QT1NJWF9WN19JTFAzMl9PRkYzMl9MREZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRjMyX0xJQlMsCisjZGVmaW5lIF9DU19QT1NJWF9WN19JTFAzMl9PRkYzMl9MSUJTIF9DU19QT1NJWF9WN19JTFAzMl9PRkYzMl9MSUJTCisgICAgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRjMyX0xJTlRGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRjMyX0xJTlRGTEFHUyBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGMzJfTElOVEZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRkJJR19DRkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WN19JTFAzMl9PRkZCSUdfQ0ZMQUdTIF9DU19QT1NJWF9WN19JTFAzMl9PRkZCSUdfQ0ZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRkJJR19MREZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGQklHX0xERkxBR1MgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRkJJR19MREZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRkJJR19MSUJTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjdfSUxQMzJfT0ZGQklHX0xJQlMgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRkJJR19MSUJTCisgICAgX0NTX1BPU0lYX1Y3X0lMUDMyX09GRkJJR19MSU5URkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WN19JTFAzMl9PRkZCSUdfTElOVEZMQUdTIF9DU19QT1NJWF9WN19JTFAzMl9PRkZCSUdfTElOVEZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0xQNjRfT0ZGNjRfQ0ZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9DRkxBR1MgX0NTX1BPU0lYX1Y3X0xQNjRfT0ZGNjRfQ0ZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0xQNjRfT0ZGNjRfTERGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X0xQNjRfT0ZGNjRfTERGTEFHUyBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9MREZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0xQNjRfT0ZGNjRfTElCUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y3X0xQNjRfT0ZGNjRfTElCUyBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9MSUJTCisgICAgX0NTX1BPU0lYX1Y3X0xQNjRfT0ZGNjRfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjdfTFA2NF9PRkY2NF9MSU5URkxBR1MgX0NTX1BPU0lYX1Y3X0xQNjRfT0ZGNjRfTElOVEZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0xQQklHX09GRkJJR19DRkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WN19MUEJJR19PRkZCSUdfQ0ZMQUdTIF9DU19QT1NJWF9WN19MUEJJR19PRkZCSUdfQ0ZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0xQQklHX09GRkJJR19MREZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjdfTFBCSUdfT0ZGQklHX0xERkxBR1MgX0NTX1BPU0lYX1Y3X0xQQklHX09GRkJJR19MREZMQUdTCisgICAgX0NTX1BPU0lYX1Y3X0xQQklHX09GRkJJR19MSUJTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjdfTFBCSUdfT0ZGQklHX0xJQlMgX0NTX1BPU0lYX1Y3X0xQQklHX09GRkJJR19MSUJTCisgICAgX0NTX1BPU0lYX1Y3X0xQQklHX09GRkJJR19MSU5URkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WN19MUEJJR19PRkZCSUdfTElOVEZMQUdTIF9DU19QT1NJWF9WN19MUEJJR19PRkZCSUdfTElOVEZMQUdTCisKKyAgICBfQ1NfVjZfRU5WLAorI2RlZmluZSBfQ1NfVjZfRU5WCQkJX0NTX1Y2X0VOVgorICAgIF9DU19WN19FTlYKKyNkZWZpbmUgX0NTX1Y3X0VOVgkJCV9DU19WN19FTlYKKyAgfTsKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2RpcmVudC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZGlyZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY3OTRiMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2RpcmVudC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfRElSRU5UX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9kaXJlbnQuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGRpcmVudC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCitzdHJ1Y3QgZGlyZW50CisgIHsKKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorICAgIF9faW5vX3QgZF9pbm87CisgICAgX19vZmZfdCBkX29mZjsKKyNlbHNlCisgICAgX19pbm82NF90IGRfaW5vOworICAgIF9fb2ZmNjRfdCBkX29mZjsKKyNlbmRpZgorICAgIHVuc2lnbmVkIHNob3J0IGludCBkX3JlY2xlbjsKKyAgICB1bnNpZ25lZCBjaGFyIGRfdHlwZTsKKyAgICBjaGFyIGRfbmFtZVsyNTZdOwkJLyogV2UgbXVzdCBub3QgaW5jbHVkZSBsaW1pdHMuaCEgKi8KKyAgfTsKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitzdHJ1Y3QgZGlyZW50NjQKKyAgeworICAgIF9faW5vNjRfdCBkX2lubzsKKyAgICBfX29mZjY0X3QgZF9vZmY7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IGRfcmVjbGVuOworICAgIHVuc2lnbmVkIGNoYXIgZF90eXBlOworICAgIGNoYXIgZF9uYW1lWzI1Nl07CQkvKiBXZSBtdXN0IG5vdCBpbmNsdWRlIGxpbWl0cy5oISAqLworICB9OworI2VuZGlmCisKKyNkZWZpbmUgZF9maWxlbm8JZF9pbm8JLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICAqLworCisjdW5kZWYgIF9ESVJFTlRfSEFWRV9EX05BTUxFTgorI2RlZmluZSBfRElSRU5UX0hBVkVfRF9SRUNMRU4KKyNkZWZpbmUgX0RJUkVOVF9IQVZFX0RfT0ZGCisjZGVmaW5lIF9ESVJFTlRfSEFWRV9EX1RZUEUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2RsZmNuLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9kbGZjbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZmQ5NmEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9kbGZjbi5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qIFN5c3RlbSBkZXBlbmRlbnQgZGVmaW5pdGlvbnMgZm9yIHJ1bi10aW1lIGR5bmFtaWMgbG9hZGluZy4KKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDAxLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9ETEZDTl9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvZGxmY24uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGRsZmNuLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIFRoZSBNT0RFIGFyZ3VtZW50IHRvIGBkbG9wZW4nIGNvbnRhaW5zIG9uZSBvZiB0aGUgZm9sbG93aW5nOiAqLworI2RlZmluZSBSVExEX0xBWlkJMHgwMDAwMQkvKiBMYXp5IGZ1bmN0aW9uIGNhbGwgYmluZGluZy4gICovCisjZGVmaW5lIFJUTERfTk9XCTB4MDAwMDIJLyogSW1tZWRpYXRlIGZ1bmN0aW9uIGNhbGwgYmluZGluZy4gICovCisjZGVmaW5lCVJUTERfQklORElOR19NQVNLICAgMHgzCS8qIE1hc2sgb2YgYmluZGluZyB0aW1lIHZhbHVlLiAgKi8KKyNkZWZpbmUgUlRMRF9OT0xPQUQJMHgwMDAwNAkvKiBEbyBub3QgbG9hZCB0aGUgb2JqZWN0LiAgKi8KKyNkZWZpbmUgUlRMRF9ERUVQQklORAkweDAwMDA4CS8qIFVzZSBkZWVwIGJpbmRpbmcuICAqLworCisvKiBJZiB0aGUgZm9sbG93aW5nIGJpdCBpcyBzZXQgaW4gdGhlIE1PREUgYXJndW1lbnQgdG8gYGRsb3BlbicsCisgICB0aGUgc3ltYm9scyBvZiB0aGUgbG9hZGVkIG9iamVjdCBhbmQgaXRzIGRlcGVuZGVuY2llcyBhcmUgbWFkZQorICAgdmlzaWJsZSBhcyBpZiB0aGUgb2JqZWN0IHdlcmUgbGlua2VkIGRpcmVjdGx5IGludG8gdGhlIHByb2dyYW0uICAqLworI2RlZmluZSBSVExEX0dMT0JBTAkweDAwMTAwCisKKy8qIFVuaXg5OCBkZW1hbmRzIHRoZSBmb2xsb3dpbmcgZmxhZyB3aGljaCBpcyB0aGUgaW52ZXJzZSB0byBSVExEX0dMT0JBTC4KKyAgIFRoZSBpbXBsZW1lbnRhdGlvbiBkb2VzIHRoaXMgYnkgZGVmYXVsdCBhbmQgc28gd2UgY2FuIGRlZmluZSB0aGUKKyAgIHZhbHVlIHRvIHplcm8uICAqLworI2RlZmluZSBSVExEX0xPQ0FMCTAKKworLyogRG8gbm90IGRlbGV0ZSBvYmplY3Qgd2hlbiBjbG9zZWQuICAqLworI2RlZmluZSBSVExEX05PREVMRVRFCTB4MDEwMDAKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVG8gc3VwcG9ydCBwcm9maWxpbmcgb2Ygc2hhcmVkIG9iamVjdHMgaXQgaXMgYSBnb29kIGlkZWEgdG8gY2FsbAorICAgdGhlIGZ1bmN0aW9uIGZvdW5kIHVzaW5nIGBkbHN5bScgdXNpbmcgdGhlIGZvbGxvd2luZyBtYWNybyBzaW5jZQorICAgdGhlc2UgY2FsbHMgZG8gbm90IHVzZSB0aGUgUExULiAgQnV0IHRoaXMgd291bGQgbWVhbiB0aGUgZHluYW1pYworICAgbG9hZGVyIGhhcyBubyBjaGFuY2UgdG8gZmluZCBvdXQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLiAgVGhlCisgICBtYWNybyBhcHBsaWVzIHRoZSBuZWNlc3NhcnkgbWFnaWMgc28gdGhhdCBwcm9maWxpbmcgaXMgcG9zc2libGUuCisgICBSZXdyaXRlCisJZm9vID0gKCpmY3RwKSAoYXJnMSwgYXJnMik7CisgICBpbnRvCisgICAgICAgIGZvbyA9IERMX0NBTExfRkNUIChmY3RwLCAoYXJnMSwgYXJnMikpOworKi8KKyMgZGVmaW5lIERMX0NBTExfRkNUKGZjdHAsIGFyZ3MpIFwKKyAgKF9kbF9tY291bnRfd3JhcHBlcl9jaGVjayAoKHZvaWQgKikgKGZjdHApKSwgKCooZmN0cCkpIGFyZ3MpCisKK19fQkVHSU5fREVDTFMKKworLyogVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgcHJvZmlsaW5nIGZ1bmN0aW9ucy4gICovCitleHRlcm4gdm9pZCBfZGxfbWNvdW50X3dyYXBwZXJfY2hlY2sgKHZvaWQgKl9fc2VsZnBjKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2VsZmNsYXNzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9lbGZjbGFzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MDIyN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9lbGZjbGFzcy5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qIFRoaXMgZmlsZSBzcGVjaWZpZXMgdGhlIG5hdGl2ZSB3b3JkIHNpemUgb2YgdGhlIG1hY2hpbmUsIHdoaWNoIGluZGljYXRlcworICAgdGhlIEVMRiBmaWxlIGNsYXNzIHVzZWQgZm9yIGV4ZWN1dGFibGVzIGFuZCBzaGFyZWQgb2JqZWN0cyBvbiB0aGlzCisgICBtYWNoaW5lLiAgKi8KKworI2lmbmRlZiBfTElOS19ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvZWxmY2xhc3MuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGxpbmsuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworI2RlZmluZSBfX0VMRl9OQVRJVkVfQ0xBU1MgX19XT1JEU0laRQorCisvKiBUaGUgZW50cmllcyBpbiB0aGUgLmhhc2ggdGFibGUgYWx3YXlzIGhhdmUgYSBzaXplIG9mIDMyIGJpdHMuICAqLwordHlwZWRlZiB1aW50MzJfdCBFbGZfU3ltbmR4OwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZW5kaWFuLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9lbmRpYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjU5ZWFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZW5kaWFuLmgKQEAgLTAsMCArMSw3IEBACisvKiB4ODZfNjQgaXMgbGl0dGxlLWVuZGlhbi4gICovCisKKyNpZm5kZWYgX0VORElBTl9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvZW5kaWFuLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxlbmRpYW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2RlZmluZSBfX0JZVEVfT1JERVIgX19MSVRUTEVfRU5ESUFOCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9lbnZpcm9ubWVudHMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2Vudmlyb25tZW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NzVlY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9lbnZpcm9ubWVudHMuaApAQCAtMCwwICsxLDk3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDEsIDIwMDQsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1VOSVNURF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseS4gIFVzZSA8dW5pc3RkLmg+IGluc3RlYWQiCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworLyogVGhpcyBoZWFkZXIgc2hvdWxkIGRlZmluZSB0aGUgZm9sbG93aW5nIHN5bWJvbHMgdW5kZXIgdGhlIGRlc2NyaWJlZAorICAgc2l0dWF0aW9ucy4gIEEgdmFsdWUgYDEnIG1lYW5zIHRoYXQgdGhlIG1vZGVsIGlzIGFsd2F5cyBzdXBwb3J0ZWQsCisgICBgLTEnIG1lYW5zIGl0IGlzIG5ldmVyIHN1cHBvcnRlZC4gIFVuZGVmaW5lZCBtZWFucyBpdCBjYW5ub3QgYmUKKyAgIHN0YXRpY2FsbHkgZGVjaWRlZC4KKworICAgX1BPU0lYX1Y3X0lMUDMyX09GRjMyICAgMzJiaXQgaW50LCBsb25nLCBwb2ludGVycywgYW5kIG9mZl90IHR5cGUKKyAgIF9QT1NJWF9WN19JTFAzMl9PRkZCSUcgIDMyYml0IGludCwgbG9uZywgYW5kIHBvaW50ZXJzIGFuZCBsYXJnZXIgb2ZmX3QgdHlwZQorCisgICBfUE9TSVhfVjdfTFA2NF9PRkYzMgkgICA2NGJpdCBsb25nIGFuZCBwb2ludGVycyBhbmQgMzJiaXQgb2ZmX3QgdHlwZQorICAgX1BPU0lYX1Y3X0xQQklHX09GRkJJRyAgNjRiaXQgbG9uZyBhbmQgcG9pbnRlcnMgYW5kIGxhcmdlIG9mZl90IHR5cGUKKworICAgVGhlIG1hY3JvcyBfUE9TSVhfVjZfSUxQMzJfT0ZGMzIsIF9QT1NJWF9WNl9JTFAzMl9PRkZCSUcsCisgICBfUE9TSVhfVjZfTFA2NF9PRkYzMiwgX1BPU0lYX1Y2X0xQQklHX09GRkJJRywgX1hCUzVfSUxQMzJfT0ZGMzIsCisgICBfWEJTNV9JTFAzMl9PRkZCSUcsIF9YQlM1X0xQNjRfT0ZGMzIsIGFuZCBfWEJTNV9MUEJJR19PRkZCSUcgd2VyZQorICAgdXNlZCBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGUgVW5peCBzdGFuZGFyZCBhbmQgYXJlIGF2YWlsYWJsZQorICAgb25seSBmb3IgY29tcGF0aWJpbGl0eS4KKyovCisKKyNpZiBfX1dPUkRTSVpFID09IDY0CisKKy8qIEVudmlyb25tZW50cyB3aXRoIDMyLWJpdCB3aWRlIHBvaW50ZXJzIGFyZSBvcHRpb25hbGx5IHByb3ZpZGVkLgorICAgVGhlcmVmb3JlIGZvbGxvd2luZyBtYWNyb3MgYXJlbid0IGRlZmluZWQ6CisgICAjIHVuZGVmIF9QT1NJWF9WN19JTFAzMl9PRkYzMgorICAgIyB1bmRlZiBfUE9TSVhfVjdfSUxQMzJfT0ZGQklHCisgICAjIHVuZGVmIF9QT1NJWF9WNl9JTFAzMl9PRkYzMgorICAgIyB1bmRlZiBfUE9TSVhfVjZfSUxQMzJfT0ZGQklHCisgICAjIHVuZGVmIF9YQlM1X0lMUDMyX09GRjMyCisgICAjIHVuZGVmIF9YQlM1X0lMUDMyX09GRkJJRworICAgYW5kIHVzZXJzIG5lZWQgdG8gY2hlY2sgYXQgcnVudGltZS4gICovCisKKy8qIFdlIGFsc28gaGF2ZSBubyB1c2UgKGZvciBub3cpIGZvciBhbiBlbnZpcm9ubWVudCB3aXRoIGJpZ2dlciBwb2ludGVycworICAgYW5kIG9mZnNldHMuICAqLworIyBkZWZpbmUgX1BPU0lYX1Y3X0xQQklHX09GRkJJRwktMQorIyBkZWZpbmUgX1BPU0lYX1Y2X0xQQklHX09GRkJJRwktMQorIyBkZWZpbmUgX1hCUzVfTFBCSUdfT0ZGQklHCS0xCisKKy8qIEJ5IGRlZmF1bHQgd2UgaGF2ZSA2NC1iaXQgd2lkZSBgbG9uZyBpbnQnLCBwb2ludGVycyBhbmQgYG9mZl90Jy4gICovCisjIGRlZmluZSBfUE9TSVhfVjdfTFA2NF9PRkY2NAkxCisjIGRlZmluZSBfUE9TSVhfVjZfTFA2NF9PRkY2NAkxCisjIGRlZmluZSBfWEJTNV9MUDY0X09GRjY0CTEKKworI2Vsc2UgLyogX19XT1JEU0laRSA9PSAzMiAqLworCisvKiBCeSBkZWZhdWx0IHdlIGhhdmUgMzItYml0IHdpZGUgYGludCcsIGBsb25nIGludCcsIHBvaW50ZXJzIGFuZCBgb2ZmX3QnCisgICBhbmQgYWxsIHBsYXRmb3JtcyBzdXBwb3J0IExGUy4gICovCisjIGRlZmluZSBfUE9TSVhfVjdfSUxQMzJfT0ZGMzIJMQorIyBkZWZpbmUgX1BPU0lYX1Y3X0lMUDMyX09GRkJJRwkxCisjIGRlZmluZSBfUE9TSVhfVjZfSUxQMzJfT0ZGMzIJMQorIyBkZWZpbmUgX1BPU0lYX1Y2X0lMUDMyX09GRkJJRwkxCisjIGRlZmluZSBfWEJTNV9JTFAzMl9PRkYzMgkxCisjIGRlZmluZSBfWEJTNV9JTFAzMl9PRkZCSUcJMQorCisvKiBXZSBvcHRpb25hbGx5IHByb3ZpZGUgYW4gZW52aXJvbm1lbnQgd2l0aCB0aGUgYWJvdmUgc2l6ZSBidXQgYW4gNjQtYml0CisgICBzaWRlIGBvZmZfdCcuICBUaGVyZWZvcmUgd2UgZG9uJ3QgZGVmaW5lIF9QT1NJWF9WN19JTFAzMl9PRkZCSUcuICAqLworCisvKiBFbnZpcm9ubWVudHMgd2l0aCA2NC1iaXQgd2lkZSBwb2ludGVycyBjYW4gYmUgcHJvdmlkZWQsCisgICBzbyB0aGVzZSBtYWNyb3MgYXJlbid0IGRlZmluZWQ6CisgICAjIHVuZGVmIF9QT1NJWF9WN19MUDY0X09GRjY0CisgICAjIHVuZGVmIF9QT1NJWF9WN19MUEJJR19PRkZCSUcKKyAgICMgdW5kZWYgX1BPU0lYX1Y2X0xQNjRfT0ZGNjQKKyAgICMgdW5kZWYgX1BPU0lYX1Y2X0xQQklHX09GRkJJRworICAgIyB1bmRlZiBfWEJTNV9MUDY0X09GRjY0CisgICAjIHVuZGVmIF9YQlM1X0xQQklHX09GRkJJRworICAgYW5kIHN5c2NvbmYgdGVzdHMgZm9yIGl0IGF0IHJ1bnRpbWUuICAqLworCisjZW5kaWYgLyogX19XT1JEU0laRSA9PSAzMiAqLworCisjZGVmaW5lIF9fSUxQMzJfT0ZGMzJfQ0ZMQUdTCSItbTMyIgorI2RlZmluZSBfX0lMUDMyX09GRkJJR19DRkxBR1MJIi1tMzIgLURfTEFSR0VGSUxFX1NPVVJDRSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IgorI2RlZmluZSBfX0lMUDMyX09GRjMyX0xERkxBR1MJIi1tMzIiCisjZGVmaW5lIF9fSUxQMzJfT0ZGQklHX0xERkxBR1MJIi1tMzIiCisjZGVmaW5lIF9fTFA2NF9PRkY2NF9DRkxBR1MJIi1tNjQiCisjZGVmaW5lIF9fTFA2NF9PRkY2NF9MREZMQUdTCSItbTY0IgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZXJybm8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2Vycm5vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYzZDdhZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2Vycm5vLmgKQEAgLTAsMCArMSw2MyBAQAorLyogRXJyb3IgY29uc3RhbnRzLiAgTGludXggc3BlY2lmaWMgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5LCAyMDA1LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZkZWYgX0VSUk5PX0gKKworIyB1bmRlZiBFRE9NCisjIHVuZGVmIEVJTFNFUQorIyB1bmRlZiBFUkFOR0UKKyMgaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworLyogTGludXggaGFzIG5vIEVOT1RTVVAgZXJyb3IgY29kZS4gICovCisjIGRlZmluZSBFTk9UU1VQIEVPUE5PVFNVUFAKKworLyogT2xkZXIgTGludXggdmVyc2lvbnMgYWxzbyBoYWQgbm8gRUNBTkNFTEVEIGVycm9yIGNvZGUuICAqLworIyBpZm5kZWYgRUNBTkNFTEVECisjICBkZWZpbmUgRUNBTkNFTEVECTEyNQorIyBlbmRpZgorCisvKiBTdXBwb3J0IGZvciBlcnJvciBjb2RlcyB0byBzdXBwb3J0IHJvYnVzdCBtdXRleGVzIHdhcyBhZGRlZCBsYXRlciwgdG9vLiAgKi8KKyMgaWZuZGVmIEVPV05FUkRFQUQKKyMgIGRlZmluZSBFT1dORVJERUFECQkxMzAKKyMgIGRlZmluZSBFTk9UUkVDT1ZFUkFCTEUJMTMxCisjIGVuZGlmCisKKyMgaWZuZGVmIEVSRktJTEwKKyMgIGRlZmluZSBFUkZLSUxMCQkxMzIKKyMgZW5kaWYKKworIyBpZm5kZWYgX19BU1NFTUJMRVJfXworLyogRnVuY3Rpb24gdG8gZ2V0IGFkZHJlc3Mgb2YgZ2xvYmFsIGBlcnJubycgdmFyaWFibGUuICAqLworZXh0ZXJuIGludCAqX19lcnJub19sb2NhdGlvbiAodm9pZCkgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKyMgIGlmICFkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgX0xJQkNfUkVFTlRSQU5UCisvKiBXaGVuIHVzaW5nIHRocmVhZHMsIGVycm5vIGlzIGEgcGVyLXRocmVhZCB2YWx1ZS4gICovCisjICAgZGVmaW5lIGVycm5vICgqX19lcnJub19sb2NhdGlvbiAoKSkKKyMgIGVuZGlmCisjIGVuZGlmIC8qICFfX0FTU0VNQkxFUl9fICovCisjZW5kaWYgLyogX0VSUk5PX0ggKi8KKworI2lmICFkZWZpbmVkIF9FUlJOT19IICYmIGRlZmluZWQgX19uZWVkX0VtYXRoCisvKiBUaGlzIGlzIHVnbHkgYnV0IHRoZSBrZXJuZWwgaGVhZGVyIGlzIG5vdCBjbGVhbiBlbm91Z2guICBXZSBtdXN0CisgICBkZWZpbmUgb25seSB0aGUgdmFsdWVzIEVET00sIEVJTFNFUSBhbmQgRVJBTkdFIGluIGNhc2UgX19uZWVkX0VtYXRoIGlzCisgICBkZWZpbmVkLiAgKi8KKyMgZGVmaW5lIEVET00JMzMJLyogTWF0aCBhcmd1bWVudCBvdXQgb2YgZG9tYWluIG9mIGZ1bmN0aW9uLiAgKi8KKyMgZGVmaW5lIEVJTFNFUQk4NAkvKiBJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UuICAqLworIyBkZWZpbmUgRVJBTkdFCTM0CS8qIE1hdGggcmVzdWx0IG5vdCByZXByZXNlbnRhYmxlLiAgKi8KKyNlbmRpZiAvKiAhX0VSUk5PX0ggJiYgX19uZWVkX0VtYXRoICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9lcnJvci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTlhM2YxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZXJyb3IuaApAQCAtMCwwICsxLDc0IEBACisvKiBTcGVjaWFsaXphdGlvbnMgZm9yIGVycm9yIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfRVJST1JfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9lcnJvci5oPiBkaXJlY3RseTsgdXNlIDxlcnJvci5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisKK2V4dGVybiB2b2lkIF9fUkVESVJFQ1QgKF9fZXJyb3JfYWxpYXMsIChpbnQgX19zdGF0dXMsIGludCBfX2Vycm51bSwKKwkJCQkJX19jb25zdCBjaGFyICpfX2Zvcm1hdCwgLi4uKSwKKwkJCWVycm9yKQorICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgNCkpKTsKK2V4dGVybiB2b2lkIF9fUkVESVJFQ1QgKF9fZXJyb3Jfbm9yZXR1cm4sIChpbnQgX19zdGF0dXMsIGludCBfX2Vycm51bSwKKwkJCQkJICAgX19jb25zdCBjaGFyICpfX2Zvcm1hdCwgLi4uKSwKKwkJCWVycm9yKQorICBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fLCBfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCA0KSkpOworCisKKy8qIElmIHdlIGtub3cgdGhlIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgcmV0dXJuIG1ha2Ugc3VyZSB0aGUgY29tcGlsZXIKKyAgIHJlYWxpemVzIHRoYXQsIHRvby4gICovCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHZvaWQKK2Vycm9yIChpbnQgX19zdGF0dXMsIGludCBfX2Vycm51bSwgX19jb25zdCBjaGFyICpfX2Zvcm1hdCwgLi4uKQoreworICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9fc3RhdHVzKSAmJiBfX3N0YXR1cyAhPSAwKQorICAgIF9fZXJyb3Jfbm9yZXR1cm4gKF9fc3RhdHVzLCBfX2Vycm51bSwgX19mb3JtYXQsIF9fdmFfYXJnX3BhY2sgKCkpOworICBlbHNlCisgICAgX19lcnJvcl9hbGlhcyAoX19zdGF0dXMsIF9fZXJybnVtLCBfX2Zvcm1hdCwgX192YV9hcmdfcGFjayAoKSk7Cit9CisKKworZXh0ZXJuIHZvaWQgX19SRURJUkVDVCAoX19lcnJvcl9hdF9saW5lX2FsaWFzLCAoaW50IF9fc3RhdHVzLCBpbnQgX19lcnJudW0sCisJCQkJCQlfX2NvbnN0IGNoYXIgKl9fZm5hbWUsCisJCQkJCQl1bnNpZ25lZCBpbnQgX19saW5lLAorCQkJCQkJX19jb25zdCBjaGFyICpfX2Zvcm1hdCwgLi4uKSwKKwkJCWVycm9yX2F0X2xpbmUpCisgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCA1LCA2KSkpOworZXh0ZXJuIHZvaWQgX19SRURJUkVDVCAoX19lcnJvcl9hdF9saW5lX25vcmV0dXJuLCAoaW50IF9fc3RhdHVzLCBpbnQgX19lcnJudW0sCisJCQkJCQkgICBfX2NvbnN0IGNoYXIgKl9fZm5hbWUsCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgX19saW5lLAorCQkJCQkJICAgX19jb25zdCBjaGFyICpfX2Zvcm1hdCwKKwkJCQkJCSAgIC4uLiksCisJCQllcnJvcl9hdF9saW5lKQorICBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fLCBfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCA1LCA2KSkpOworCisKKy8qIElmIHdlIGtub3cgdGhlIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgcmV0dXJuIG1ha2Ugc3VyZSB0aGUgY29tcGlsZXIKKyAgIHJlYWxpemVzIHRoYXQsIHRvby4gICovCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHZvaWQKK2Vycm9yX2F0X2xpbmUgKGludCBfX3N0YXR1cywgaW50IF9fZXJybnVtLCBfX2NvbnN0IGNoYXIgKl9fZm5hbWUsCisJICAgICAgIHVuc2lnbmVkIGludCBfX2xpbmUsX19jb25zdCBjaGFyICpfX2Zvcm1hdCwgLi4uKQoreworICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9fc3RhdHVzKSAmJiBfX3N0YXR1cyAhPSAwKQorICAgIF9fZXJyb3JfYXRfbGluZV9ub3JldHVybiAoX19zdGF0dXMsIF9fZXJybnVtLCBfX2ZuYW1lLCBfX2xpbmUsIF9fZm9ybWF0LAorCQkJICAgICAgX192YV9hcmdfcGFjayAoKSk7CisgIGVsc2UKKyAgICBfX2Vycm9yX2F0X2xpbmVfYWxpYXMgKF9fc3RhdHVzLCBfX2Vycm51bSwgX19mbmFtZSwgX19saW5lLAorCQkJICAgX19mb3JtYXQsIF9fdmFfYXJnX3BhY2sgKCkpOworfQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZmNudGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2ZjbnRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmYzNjNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2ZjbnRsLmgKQEAgLTAsMCArMSwzNTUgQEAKKy8qIE9fKiwgRl8qLCBGRF8qIGJpdCB2YWx1ZXMgZm9yIExpbnV4L3g4Ni02NC4KKyAgIENvcHlyaWdodCAoQykgMjAwMSwyMDAyLDIwMDQsMjAwNiwyMDA3LDIwMDksMjAxMCwyMDExCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfRkNOVExfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2ZjbnRsLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxmY250bC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorI2lmZGVmIF9fVVNFX0dOVQorIyBpbmNsdWRlIDxiaXRzL3Vpby5oPgorI2VuZGlmCisKKworLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcworICAgbG9jYXRlZCBvbiBhIGZldyBmaWxlIHN5c3RlbXMuICAqLworI2RlZmluZSBPX0FDQ01PREUJICAgMDAwMworI2RlZmluZSBPX1JET05MWQkgICAgIDAwCisjZGVmaW5lIE9fV1JPTkxZCSAgICAgMDEKKyNkZWZpbmUgT19SRFdSCQkgICAgIDAyCisjZGVmaW5lIE9fQ1JFQVQJCSAgIDAxMDAJLyogbm90IGZjbnRsICovCisjZGVmaW5lIE9fRVhDTAkJICAgMDIwMAkvKiBub3QgZmNudGwgKi8KKyNkZWZpbmUgT19OT0NUVFkJICAgMDQwMAkvKiBub3QgZmNudGwgKi8KKyNkZWZpbmUgT19UUlVOQwkJICAwMTAwMAkvKiBub3QgZmNudGwgKi8KKyNkZWZpbmUgT19BUFBFTkQJICAwMjAwMAorI2RlZmluZSBPX05PTkJMT0NLCSAgMDQwMDAKKyNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSworI2RlZmluZSBPX1NZTkMJICAgICAgIDA0MDEwMDAwCisjZGVmaW5lIE9fRlNZTkMJCSBPX1NZTkMKKyNkZWZpbmUgT19BU1lOQwkJIDAyMDAwMAorCisjaWZkZWYgX19VU0VfWE9QRU4ySzgKKyMgZGVmaW5lIE9fRElSRUNUT1JZCTAyMDAwMDAJLyogTXVzdCBiZSBhIGRpcmVjdG9yeS4JICovCisjIGRlZmluZSBPX05PRk9MTE9XCTA0MDAwMDAJLyogRG8gbm90IGZvbGxvdyBsaW5rcy4JICovCisjIGRlZmluZSBPX0NMT0VYRUMgICAgIDAyMDAwMDAwIC8qIFNldCBjbG9zZV9vbl9leGVjLiAgKi8KKyNlbmRpZgorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgT19ESVJFQ1QJIDA0MDAwMAkvKiBEaXJlY3QgZGlzayBhY2Nlc3MuCSovCisjIGRlZmluZSBPX05PQVRJTUUgICAgIDAxMDAwMDAwIC8qIERvIG5vdCBzZXQgYXRpbWUuICAqLworIyBkZWZpbmUgT19QQVRICSAgICAgIDAxMDAwMDAwMCAvKiBSZXNvbHZlIHBhdGhuYW1lIGJ1dCBkbyBub3Qgb3BlbiBmaWxlLiAgKi8KKyNlbmRpZgorCisvKiBGb3Igbm93IExpbnV4IGhhcyBzeW5jaHJvbmlzaXR5IG9wdGlvbnMgZm9yIGRhdGEgYW5kIHJlYWQgb3BlcmF0aW9ucy4KKyAgIFdlIGRlZmluZSB0aGUgc3ltYm9scyBoZXJlIGJ1dCBsZXQgdGhlbSBkbyB0aGUgc2FtZSBhcyBPX1NZTkMgc2luY2UKKyAgIHRoaXMgaXMgYSBzdXBlcnNldC4JKi8KKyNpZiBkZWZpbmVkIF9fVVNFX1BPU0lYMTk5MzA5IHx8IGRlZmluZWQgX19VU0VfVU5JWDk4CisjIGRlZmluZSBPX0RTWU5DCTAxMDAwMAkvKiBTeW5jaHJvbml6ZSBkYXRhLiAgKi8KKyMgZGVmaW5lIE9fUlNZTkMJT19TWU5DCS8qIFN5bmNocm9uaXplIHJlYWQgb3BlcmF0aW9ucy4JICovCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBPX0xBUkdFRklMRQkwCisjIGVsc2UKKyMgIGRlZmluZSBPX0xBUkdFRklMRQkwMTAwMDAwCisjIGVuZGlmCisjZW5kaWYKKworLyogVmFsdWVzIGZvciB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBmY250bCcuICAqLworI2RlZmluZSBGX0RVUEZECQkwCS8qIER1cGxpY2F0ZSBmaWxlIGRlc2NyaXB0b3IuICAqLworI2RlZmluZSBGX0dFVEZECQkxCS8qIEdldCBmaWxlIGRlc2NyaXB0b3IgZmxhZ3MuICAqLworI2RlZmluZSBGX1NFVEZECQkyCS8qIFNldCBmaWxlIGRlc2NyaXB0b3IgZmxhZ3MuICAqLworI2RlZmluZSBGX0dFVEZMCQkzCS8qIEdldCBmaWxlIHN0YXR1cyBmbGFncy4gICovCisjZGVmaW5lIEZfU0VURkwJCTQJLyogU2V0IGZpbGUgc3RhdHVzIGZsYWdzLiAgKi8KKyNpZiBfX1dPUkRTSVpFID09IDY0CisjIGRlZmluZSBGX0dFVExLCTUJLyogR2V0IHJlY29yZCBsb2NraW5nIGluZm8uICAqLworIyBkZWZpbmUgRl9TRVRMSwk2CS8qIFNldCByZWNvcmQgbG9ja2luZyBpbmZvIChub24tYmxvY2tpbmcpLiAgKi8KKyMgZGVmaW5lIEZfU0VUTEtXCTcJLyogU2V0IHJlY29yZCBsb2NraW5nIGluZm8gKGJsb2NraW5nKS4JKi8KKy8qIE5vdCBuZWNlc3NhcnksIHdlIGFsd2F5cyBoYXZlIDY0LWJpdCBvZmZzZXRzLiAgKi8KKyMgZGVmaW5lIEZfR0VUTEs2NAk1CS8qIEdldCByZWNvcmQgbG9ja2luZyBpbmZvLiAgKi8KKyMgZGVmaW5lIEZfU0VUTEs2NAk2CS8qIFNldCByZWNvcmQgbG9ja2luZyBpbmZvIChub24tYmxvY2tpbmcpLiAgKi8KKyMgZGVmaW5lIEZfU0VUTEtXNjQJNwkvKiBTZXQgcmVjb3JkIGxvY2tpbmcgaW5mbyAoYmxvY2tpbmcpLgkqLworI2Vsc2UKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyMgIGRlZmluZSBGX0dFVExLCTUJLyogR2V0IHJlY29yZCBsb2NraW5nIGluZm8uICAqLworIyAgZGVmaW5lIEZfU0VUTEsJNgkvKiBTZXQgcmVjb3JkIGxvY2tpbmcgaW5mbyAobm9uLWJsb2NraW5nKS4gICovCisjICBkZWZpbmUgRl9TRVRMS1cJNwkvKiBTZXQgcmVjb3JkIGxvY2tpbmcgaW5mbyAoYmxvY2tpbmcpLgkqLworIyBlbHNlCisjICBkZWZpbmUgRl9HRVRMSwlGX0dFVExLNjQgIC8qIEdldCByZWNvcmQgbG9ja2luZyBpbmZvLgkqLworIyAgZGVmaW5lIEZfU0VUTEsJRl9TRVRMSzY0ICAvKiBTZXQgcmVjb3JkIGxvY2tpbmcgaW5mbyAobm9uLWJsb2NraW5nKS4qLworIyAgZGVmaW5lIEZfU0VUTEtXCUZfU0VUTEtXNjQgLyogU2V0IHJlY29yZCBsb2NraW5nIGluZm8gKGJsb2NraW5nKS4gICovCisjIGVuZGlmCisjIGRlZmluZSBGX0dFVExLNjQJMTIJLyogR2V0IHJlY29yZCBsb2NraW5nIGluZm8uICAqLworIyBkZWZpbmUgRl9TRVRMSzY0CTEzCS8qIFNldCByZWNvcmQgbG9ja2luZyBpbmZvIChub24tYmxvY2tpbmcpLiAgKi8KKyMgZGVmaW5lIEZfU0VUTEtXNjQJMTQJLyogU2V0IHJlY29yZCBsb2NraW5nIGluZm8gKGJsb2NraW5nKS4JKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9VTklYOTggfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorIyBkZWZpbmUgRl9TRVRPV04JOAkvKiBHZXQgb3duZXIgKHByb2Nlc3MgcmVjZWl2aW5nIFNJR0lPKS4gICovCisjIGRlZmluZSBGX0dFVE9XTgk5CS8qIFNldCBvd25lciAocHJvY2VzcyByZWNlaXZpbmcgU0lHSU8pLiAgKi8KKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBGX1NFVFNJRwkxMAkvKiBTZXQgbnVtYmVyIG9mIHNpZ25hbCB0byBiZSBzZW50LiAgKi8KKyMgZGVmaW5lIEZfR0VUU0lHCTExCS8qIEdldCBudW1iZXIgb2Ygc2lnbmFsIHRvIGJlIHNlbnQuICAqLworIyBkZWZpbmUgRl9TRVRPV05fRVgJMTUJLyogR2V0IG93bmVyICh0aHJlYWQgcmVjZWl2aW5nIFNJR0lPKS4gICovCisjIGRlZmluZSBGX0dFVE9XTl9FWAkxNgkvKiBTZXQgb3duZXIgKHRocmVhZCByZWNlaXZpbmcgU0lHSU8pLiAgKi8KKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBGX1NFVExFQVNFCTEwMjQJLyogU2V0IGEgbGVhc2UuCSAqLworIyBkZWZpbmUgRl9HRVRMRUFTRQkxMDI1CS8qIEVucXVpcmUgd2hhdCBsZWFzZSBpcyBhY3RpdmUuICAqLworIyBkZWZpbmUgRl9OT1RJRlkJMTAyNgkvKiBSZXF1ZXN0IG5vdGZpY2F0aW9ucyBvbiBhIGRpcmVjdG9yeS4JICovCisjIGRlZmluZSBGX1NFVFBJUEVfU1oJMTAzMQkvKiBTZXQgcGlwZSBwYWdlIHNpemUgYXJyYXkuICAqLworIyBkZWZpbmUgRl9HRVRQSVBFX1NaCTEwMzIJLyogU2V0IHBpcGUgcGFnZSBzaXplIGFycmF5LiAgKi8KKyNlbmRpZgorI2lmZGVmIF9fVVNFX1hPUEVOMks4CisjIGRlZmluZSBGX0RVUEZEX0NMT0VYRUMgMTAzMAkvKiBEdXBsaWNhdGUgZmlsZSBkZXNjcmlwdG9yIHdpdGgKKwkJCQkgICBjbG9zZS1vbi1leGl0IHNldC4gICovCisjZW5kaWYKKworLyogRm9yIEZfW0dFVHxTRVRdRkQuICAqLworI2RlZmluZSBGRF9DTE9FWEVDCTEJLyogYWN0dWFsbHkgYW55dGhpbmcgd2l0aCBsb3cgYml0IHNldCBnb2VzICovCisKKy8qIEZvciBwb3NpeCBmY250bCgpIGFuZCBgbF90eXBlJyBmaWVsZCBvZiBhIGBzdHJ1Y3QgZmxvY2snIGZvciBsb2NrZigpLiAgKi8KKyNkZWZpbmUgRl9SRExDSwkJMAkvKiBSZWFkIGxvY2suICAqLworI2RlZmluZSBGX1dSTENLCQkxCS8qIFdyaXRlIGxvY2suCSovCisjZGVmaW5lIEZfVU5MQ0sJCTIJLyogUmVtb3ZlIGxvY2suCSAqLworCisvKiBGb3Igb2xkIGltcGxlbWVudGF0aW9uIG9mIGJzZCBmbG9jaygpLiAgKi8KKyNkZWZpbmUgRl9FWExDSwkJNAkvKiBvciAzICovCisjZGVmaW5lIEZfU0hMQ0sJCTgJLyogb3IgNCAqLworCisjaWZkZWYgX19VU0VfQlNECisvKiBPcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24uCSovCisjIGRlZmluZSBMT0NLX1NICTEJLyogc2hhcmVkIGxvY2sgKi8KKyMgZGVmaW5lIExPQ0tfRVgJMgkvKiBleGNsdXNpdmUgbG9jayAqLworIyBkZWZpbmUgTE9DS19OQgk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKKwkJCQkgICBibG9ja2luZyAqLworIyBkZWZpbmUgTE9DS19VTgk4CS8qIHJlbW92ZSBsb2NrICovCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgTE9DS19NQU5ECTMyCS8qIFRoaXMgaXMgYSBtYW5kYXRvcnkgZmxvY2s6CSovCisjIGRlZmluZSBMT0NLX1JFQUQJNjQJLyogLi4uIHdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucy4JICovCisjIGRlZmluZSBMT0NLX1dSSVRFCTEyOAkvKiAuLi4gd2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucy4gICovCisjIGRlZmluZSBMT0NLX1JXCTE5MgkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCAmIHdyaXRlIG9wZXJhdGlvbnMuCSAqLworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFR5cGVzIG9mIGRpcmVjdG9yeSBub3RpZmljYXRpb25zIHRoYXQgbWF5IGJlIHJlcXVlc3RlZCB3aXRoIEZfTk9USUZZLiAgKi8KKyMgZGVmaW5lIEROX0FDQ0VTUwkweDAwMDAwMDAxCS8qIEZpbGUgYWNjZXNzZWQuICAqLworIyBkZWZpbmUgRE5fTU9ESUZZCTB4MDAwMDAwMDIJLyogRmlsZSBtb2RpZmllZC4gICovCisjIGRlZmluZSBETl9DUkVBVEUJMHgwMDAwMDAwNAkvKiBGaWxlIGNyZWF0ZWQuICAqLworIyBkZWZpbmUgRE5fREVMRVRFCTB4MDAwMDAwMDgJLyogRmlsZSByZW1vdmVkLiAgKi8KKyMgZGVmaW5lIEROX1JFTkFNRQkweDAwMDAwMDEwCS8qIEZpbGUgcmVuYW1lZC4gICovCisjIGRlZmluZSBETl9BVFRSSUIJMHgwMDAwMDAyMAkvKiBGaWxlIGNoYW5nZWQgYXR0aWJ1dGVzLiAgKi8KKyMgZGVmaW5lIEROX01VTFRJU0hPVAkweDgwMDAwMDAwCS8qIERvbid0IHJlbW92ZSBub3RpZmllci4gICovCisjZW5kaWYKKworc3RydWN0IGZsb2NrCisgIHsKKyAgICBzaG9ydCBpbnQgbF90eXBlOwkvKiBUeXBlIG9mIGxvY2s6IEZfUkRMQ0ssIEZfV1JMQ0ssIG9yIEZfVU5MQ0suCSovCisgICAgc2hvcnQgaW50IGxfd2hlbmNlOwkvKiBXaGVyZSBgbF9zdGFydCcgaXMgcmVsYXRpdmUgdG8gKGxpa2UgYGxzZWVrJykuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisgICAgX19vZmZfdCBsX3N0YXJ0OwkvKiBPZmZzZXQgd2hlcmUgdGhlIGxvY2sgYmVnaW5zLiAgKi8KKyAgICBfX29mZl90IGxfbGVuOwkvKiBTaXplIG9mIHRoZSBsb2NrZWQgYXJlYTsgemVybyBtZWFucyB1bnRpbCBFT0YuICAqLworI2Vsc2UKKyAgICBfX29mZjY0X3QgbF9zdGFydDsJLyogT2Zmc2V0IHdoZXJlIHRoZSBsb2NrIGJlZ2lucy4gICovCisgICAgX19vZmY2NF90IGxfbGVuOwkvKiBTaXplIG9mIHRoZSBsb2NrZWQgYXJlYTsgemVybyBtZWFucyB1bnRpbCBFT0YuICAqLworI2VuZGlmCisgICAgX19waWRfdCBsX3BpZDsJLyogUHJvY2VzcyBob2xkaW5nIHRoZSBsb2NrLiAgKi8KKyAgfTsKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitzdHJ1Y3QgZmxvY2s2NAorICB7CisgICAgc2hvcnQgaW50IGxfdHlwZTsJLyogVHlwZSBvZiBsb2NrOiBGX1JETENLLCBGX1dSTENLLCBvciBGX1VOTENLLgkqLworICAgIHNob3J0IGludCBsX3doZW5jZTsJLyogV2hlcmUgYGxfc3RhcnQnIGlzIHJlbGF0aXZlIHRvIChsaWtlIGBsc2VlaycpLiAgKi8KKyAgICBfX29mZjY0X3QgbF9zdGFydDsJLyogT2Zmc2V0IHdoZXJlIHRoZSBsb2NrIGJlZ2lucy4gICovCisgICAgX19vZmY2NF90IGxfbGVuOwkvKiBTaXplIG9mIHRoZSBsb2NrZWQgYXJlYTsgemVybyBtZWFucyB1bnRpbCBFT0YuICAqLworICAgIF9fcGlkX3QgbF9waWQ7CS8qIFByb2Nlc3MgaG9sZGluZyB0aGUgbG9jay4gICovCisgIH07CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogT3duZXIgdHlwZXMuICAqLworZW51bSBfX3BpZF90eXBlCisgIHsKKyAgICBGX09XTkVSX1RJRCA9IDAsCQkvKiBLZXJuZWwgdGhyZWFkLiAgKi8KKyAgICBGX09XTkVSX1BJRCwJCS8qIFByb2Nlc3MuICAqLworICAgIEZfT1dORVJfUEdSUCwJCS8qIFByb2Nlc3MgZ3JvdXAuICAqLworICAgIEZfT1dORVJfR0lEID0gRl9PV05FUl9QR1JQCS8qIEFsdGVybmF0aXZlLCBvYnNvbGV0ZSBuYW1lLiAgKi8KKyAgfTsKKworLyogU3RydWN0dXJlIHRvIHVzZSB3aXRoIEZfR0VUT1dOX0VYIGFuZCBGX1NFVE9XTl9FWC4gICovCitzdHJ1Y3QgZl9vd25lcl9leAorICB7CisgICAgZW51bSBfX3BpZF90eXBlIHR5cGU7CS8qIE93bmVyIHR5cGUgb2YgSUQuICAqLworICAgIF9fcGlkX3QgcGlkOwkJLyogSUQgb2Ygb3duZXIuICAqLworICB9OworI2VuZGlmCisKKy8qIERlZmluZSBzb21lIG1vcmUgY29tcGF0aWJpbGl0eSBtYWNyb3MgdG8gYmUgYmFja3dhcmQgY29tcGF0aWJsZSB3aXRoCisgICBCU0Qgc3lzdGVtcyB3aGljaCBkaWQgbm90IG1hbmFnZWQgdG8gaGlkZSB0aGVzZSBrZXJuZWwgbWFjcm9zLiAgKi8KKyNpZmRlZglfX1VTRV9CU0QKKyMgZGVmaW5lIEZBUFBFTkQJT19BUFBFTkQKKyMgZGVmaW5lIEZGU1lOQwkJT19GU1lOQworIyBkZWZpbmUgRkFTWU5DCQlPX0FTWU5DCisjIGRlZmluZSBGTk9OQkxPQ0sJT19OT05CTE9DSworIyBkZWZpbmUgRk5ERUxBWQlPX05ERUxBWQorI2VuZGlmIC8qIFVzZSBCU0QuICAqLworCisvKiBBZHZpc2UgdG8gYHBvc2l4X2ZhZHZpc2UnLiAgKi8KKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisjIGRlZmluZSBQT1NJWF9GQURWX05PUk1BTAkwIC8qIE5vIGZ1cnRoZXIgc3BlY2lhbCB0cmVhdG1lbnQuICAqLworIyBkZWZpbmUgUE9TSVhfRkFEVl9SQU5ET00JMSAvKiBFeHBlY3QgcmFuZG9tIHBhZ2UgcmVmZXJlbmNlcy4gICovCisjIGRlZmluZSBQT1NJWF9GQURWX1NFUVVFTlRJQUwJMiAvKiBFeHBlY3Qgc2VxdWVudGlhbCBwYWdlIHJlZmVyZW5jZXMuCSAqLworIyBkZWZpbmUgUE9TSVhfRkFEVl9XSUxMTkVFRAkzIC8qIFdpbGwgbmVlZCB0aGVzZSBwYWdlcy4gICovCisjIGRlZmluZSBQT1NJWF9GQURWX0RPTlRORUVECTQgLyogRG9uJ3QgbmVlZCB0aGVzZSBwYWdlcy4gICovCisjIGRlZmluZSBQT1NJWF9GQURWX05PUkVVU0UJNSAvKiBEYXRhIHdpbGwgYmUgYWNjZXNzZWQgb25jZS4gICovCisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfR05VCisvKiBGbGFncyBmb3IgU1lOQ19GSUxFX1JBTkdFLiAgKi8KKyMgZGVmaW5lIFNZTkNfRklMRV9SQU5HRV9XQUlUX0JFRk9SRQkxIC8qIFdhaXQgdXBvbiB3cml0ZW91dCBvZiBhbGwgcGFnZXMKKwkJCQkJICAgICBpbiB0aGUgcmFuZ2UgYmVmb3JlIHBlcmZvcm1pbmcgdGhlCisJCQkJCSAgICAgd3JpdGUuICAqLworIyBkZWZpbmUgU1lOQ19GSUxFX1JBTkdFX1dSSVRFCQkyIC8qIEluaXRpYXRlIHdyaXRlb3V0IG9mIGFsbCB0aG9zZQorCQkJCQkgICAgIGRpcnR5IHBhZ2VzIGluIHRoZSByYW5nZSB3aGljaCBhcmUKKwkJCQkJICAgICBub3QgcHJlc2VudGx5IHVuZGVyIHdyaXRlYmFjay4gICovCisjIGRlZmluZSBTWU5DX0ZJTEVfUkFOR0VfV0FJVF9BRlRFUgk0IC8qIFdhaXQgdXBvbiB3cml0ZW91dCBvZiBhbGwgcGFnZXMgaW4KKwkJCQkJICAgICB0aGUgcmFuZ2UgYWZ0ZXIgcGVyZm9ybWluZyB0aGUKKwkJCQkJICAgICB3cml0ZS4gICovCisKKy8qIEZsYWdzIGZvciBTUExJQ0UgYW5kIFZNU1BMSUNFLiAgKi8KKyMgZGVmaW5lIFNQTElDRV9GX01PVkUJCTEJLyogTW92ZSBwYWdlcyBpbnN0ZWFkIG9mIGNvcHlpbmcuICAqLworIyBkZWZpbmUgU1BMSUNFX0ZfTk9OQkxPQ0sJMgkvKiBEb24ndCBibG9jayBvbiB0aGUgcGlwZSBzcGxpY2luZworCQkJCQkgICAoYnV0IHdlIG1heSBzdGlsbCBibG9jayBvbiB0aGUgZmQKKwkJCQkJICAgd2Ugc3BsaWNlIGZyb20vdG8pLiAgKi8KKyMgZGVmaW5lIFNQTElDRV9GX01PUkUJCTQJLyogRXhwZWN0IG1vcmUgZGF0YS4gICovCisjIGRlZmluZSBTUExJQ0VfRl9HSUZUCQk4CS8qIFBhZ2VzIHBhc3NlZCBpbiBhcmUgYSBnaWZ0LiAgKi8KKworCisvKiBGaWxlIGhhbmRsZSBzdHJ1Y3R1cmUuICAqLworc3RydWN0IGZpbGVfaGFuZGxlCit7CisgIHVuc2lnbmVkIGludCBoYW5kbGVfYnl0ZXM7CisgIGludCBoYW5kbGVfdHlwZTsKKyAgLyogRmlsZSBpZGVudGlmaWVyLiAgKi8KKyAgdW5zaWduZWQgY2hhciBmX2hhbmRsZVswXTsKK307CisKKy8qIE1heGltdW0gaGFuZGxlIHNpemUgKGZvciBub3cpLiAgKi8KKyMgZGVmaW5lIE1BWF9IQU5ETEVfU1oJMTI4CisjZW5kaWYKKworLyogVmFsdWVzIGZvciBgKmF0JyBmdW5jdGlvbnMuICAqLworI2lmZGVmIF9fVVNFX0FURklMRQorIyBkZWZpbmUgQVRfRkRDV0QJCS0xMDAJLyogU3BlY2lhbCB2YWx1ZSB1c2VkIHRvIGluZGljYXRlCisJCQkJCSAgIHRoZSAqYXQgZnVuY3Rpb25zIHNob3VsZCB1c2UgdGhlCisJCQkJCSAgIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuICovCisjIGRlZmluZSBBVF9TWU1MSU5LX05PRk9MTE9XCTB4MTAwCS8qIERvIG5vdCBmb2xsb3cgc3ltYm9saWMgbGlua3MuICAqLworIyBkZWZpbmUgQVRfUkVNT1ZFRElSCQkweDIwMAkvKiBSZW1vdmUgZGlyZWN0b3J5IGluc3RlYWQgb2YKKwkJCQkJICAgdW5saW5raW5nIGZpbGUuICAqLworIyBkZWZpbmUgQVRfU1lNTElOS19GT0xMT1cJMHg0MDAJLyogRm9sbG93IHN5bWJvbGljIGxpbmtzLiAgKi8KKyMgZGVmaW5lIEFUX05PX0FVVE9NT1VOVAkweDgwMAkvKiBTdXBwcmVzcyB0ZXJtaW5hbCBhdXRvbW91bnQKKwkJCQkJICAgdHJhdmVyc2FsLiAgKi8KKyMgZGVmaW5lIEFUX0VBQ0NFU1MJCTB4MjAwCS8qIFRlc3QgYWNjZXNzIHBlcm1pdHRlZCBmb3IKKwkJCQkJICAgZWZmZWN0aXZlIElEcywgbm90IHJlYWwgSURzLiAgKi8KKyNlbmRpZgorCitfX0JFR0lOX0RFQ0xTCisKKyNpZmRlZiBfX1VTRV9HTlUKKworLyogUHJvdmlkZSBrZXJuZWwgaGludCB0byByZWFkIGFoZWFkLiAgKi8KK2V4dGVybiBzc2l6ZV90IHJlYWRhaGVhZCAoaW50IF9fZmQsIF9fb2ZmNjRfdCBfX29mZnNldCwgc2l6ZV90IF9fY291bnQpCisgICAgX19USFJPVzsKKworCisvKiBTZWxlY3RpdmUgZmlsZSBjb250ZW50IHN5bmNoJ2luZy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHN5bmNfZmlsZV9yYW5nZSAoaW50IF9fZmQsIF9fb2ZmNjRfdCBfX29mZnNldCwgX19vZmY2NF90IF9fY291bnQsCisJCQkgICAgdW5zaWduZWQgaW50IF9fZmxhZ3MpOworCisKKy8qIFNwbGljZSBhZGRyZXNzIHJhbmdlIGludG8gYSBwaXBlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHZtc3BsaWNlIChpbnQgX19mZG91dCwgY29uc3Qgc3RydWN0IGlvdmVjICpfX2lvdiwKKwkJCSBzaXplX3QgX19jb3VudCwgdW5zaWduZWQgaW50IF9fZmxhZ3MpOworCisvKiBTcGxpY2UgdHdvIGZpbGVzIHRvZ2V0aGVyLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHNwbGljZSAoaW50IF9fZmRpbiwgX19vZmY2NF90ICpfX29mZmluLCBpbnQgX19mZG91dCwKKwkJICAgICAgIF9fb2ZmNjRfdCAqX19vZmZvdXQsIHNpemVfdCBfX2xlbiwKKwkJICAgICAgIHVuc2lnbmVkIGludCBfX2ZsYWdzKTsKKworLyogSW4ta2VybmVsIGltcGxlbWVudGF0aW9uIG9mIHRlZSBmb3IgcGlwZSBidWZmZXJzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHRlZSAoaW50IF9fZmRpbiwgaW50IF9fZmRvdXQsIHNpemVfdCBfX2xlbiwKKwkJICAgIHVuc2lnbmVkIGludCBfX2ZsYWdzKTsKKworLyogUmVzZXJ2ZSBzdG9yYWdlIGZvciB0aGUgZGF0YSBvZiB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggRkQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBmYWxsb2NhdGUgKGludCBfX2ZkLCBpbnQgX19tb2RlLCBfX29mZl90IF9fb2Zmc2V0LCBfX29mZl90IF9fbGVuKTsKKyMgZWxzZQorIyAgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIGludCBfX1JFRElSRUNUIChmYWxsb2NhdGUsIChpbnQgX19mZCwgaW50IF9fbW9kZSwgX19vZmY2NF90IF9fb2Zmc2V0LAorCQkJCSAgIF9fb2ZmNjRfdCBfX2xlbiksCisJCSAgICAgICBmYWxsb2NhdGU2NCk7CisjICBlbHNlCisjICAgZGVmaW5lIGZhbGxvY2F0ZSBmYWxsb2NhdGU2NAorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgZmFsbG9jYXRlNjQgKGludCBfX2ZkLCBpbnQgX19tb2RlLCBfX29mZjY0X3QgX19vZmZzZXQsCisJCQlfX29mZjY0X3QgX19sZW4pOworIyBlbmRpZgorCisKKy8qIE1hcCBmaWxlIG5hbWUgdG8gZmlsZSBoYW5kbGUuICAqLworZXh0ZXJuIGludCBuYW1lX3RvX2hhbmRsZV9hdCAoaW50IF9fZGZkLCBjb25zdCBjaGFyICpfX25hbWUsCisJCQkgICAgICBzdHJ1Y3QgZmlsZV9oYW5kbGUgKl9faGFuZGxlLCBpbnQgKl9fbW50X2lkLAorCQkJICAgICAgaW50IF9fZmxhZ3MpIF9fVEhST1c7CisKKy8qIE9wZW4gZmlsZSB1c2luZyB0aGUgZmlsZSBoYW5kbGUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBvcGVuX2J5X2hhbmRsZV9hdCAoaW50IF9fbW91bnRkaXJmZCwgc3RydWN0IGZpbGVfaGFuZGxlICpfX2hhbmRsZSwKKwkJCSAgICAgIGludCBfX2ZsYWdzKTsKKworI2VuZGlmCS8qIHVzZSBHTlUgKi8KKworX19FTkRfREVDTFMKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2ZjbnRsMi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZmNudGwyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJlODU4NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2ZjbnRsMi5oCkBAIC0wLDAgKzEsMTczIEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIGZjbnRsIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfRkNOVExfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9mY250bDIuaD4gZGlyZWN0bHk7IHVzZSA8ZmNudGwuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogQ2hlY2sgdGhhdCBjYWxscyB0byBvcGVuIGFuZCBvcGVuYXQgd2l0aCBPX0NSRUFUIHNldCBoYXZlIGFuCisgICBhcHByb3ByaWF0ZSB0aGlyZC9mb3VydGggcGFyYW1ldGVyLiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBfX29wZW5fMiAoX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnKSBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKF9fb3Blbl9hbGlhcywgKF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19vZmxhZywgLi4uKSwKKwkJICAgICAgIG9wZW4pIF9fbm9ubnVsbCAoKDEpKTsKKyNlbHNlCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKF9fb3Blbl8yLCAoX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnKSwKKwkJICAgICAgIF9fb3BlbjY0XzIpIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoX19vcGVuX2FsaWFzLCAoX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnLCAuLi4pLAorCQkgICAgICAgb3BlbjY0KSBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKK19fZXJyb3JkZWNsIChfX29wZW5fdG9vX21hbnlfYXJncywKKwkgICAgICJvcGVuIGNhbiBiZSBjYWxsZWQgZWl0aGVyIHdpdGggMiBvciAzIGFyZ3VtZW50cywgbm90IG1vcmUiKTsKK19fZXJyb3JkZWNsIChfX29wZW5fbWlzc2luZ19tb2RlLAorCSAgICAgIm9wZW4gd2l0aCBPX0NSRUFUIGluIHNlY29uZCBhcmd1bWVudCBuZWVkcyAzIGFyZ3VtZW50cyIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorb3BlbiAoX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnLCAuLi4pCit7CisgIGlmIChfX3ZhX2FyZ19wYWNrX2xlbiAoKSA+IDEpCisgICAgX19vcGVuX3Rvb19tYW55X2FyZ3MgKCk7CisKKyAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX29mbGFnKSkKKyAgICB7CisgICAgICBpZiAoKF9fb2ZsYWcgJiBPX0NSRUFUKSAhPSAwICYmIF9fdmFfYXJnX3BhY2tfbGVuICgpIDwgMSkKKwl7CisJICBfX29wZW5fbWlzc2luZ19tb2RlICgpOworCSAgcmV0dXJuIF9fb3Blbl8yIChfX3BhdGgsIF9fb2ZsYWcpOworCX0KKyAgICAgIHJldHVybiBfX29wZW5fYWxpYXMgKF9fcGF0aCwgX19vZmxhZywgX192YV9hcmdfcGFjayAoKSk7CisgICAgfQorCisgIGlmIChfX3ZhX2FyZ19wYWNrX2xlbiAoKSA8IDEpCisgICAgcmV0dXJuIF9fb3Blbl8yIChfX3BhdGgsIF9fb2ZsYWcpOworCisgIHJldHVybiBfX29wZW5fYWxpYXMgKF9fcGF0aCwgX19vZmxhZywgX192YV9hcmdfcGFjayAoKSk7Cit9CisKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IF9fb3BlbjY0XzIgKF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19vZmxhZykgX19ub25udWxsICgoMSkpOworZXh0ZXJuIGludCBfX1JFRElSRUNUIChfX29wZW42NF9hbGlhcywgKF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19vZmxhZywKKwkJCQkJLi4uKSwgb3BlbjY0KSBfX25vbm51bGwgKCgxKSk7CitfX2Vycm9yZGVjbCAoX19vcGVuNjRfdG9vX21hbnlfYXJncywKKwkgICAgICJvcGVuNjQgY2FuIGJlIGNhbGxlZCBlaXRoZXIgd2l0aCAyIG9yIDMgYXJndW1lbnRzLCBub3QgbW9yZSIpOworX19lcnJvcmRlY2wgKF9fb3BlbjY0X21pc3NpbmdfbW9kZSwKKwkgICAgICJvcGVuNjQgd2l0aCBPX0NSRUFUIGluIHNlY29uZCBhcmd1bWVudCBuZWVkcyAzIGFyZ3VtZW50cyIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorb3BlbjY0IChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fb2ZsYWcsIC4uLikKK3sKKyAgaWYgKF9fdmFfYXJnX3BhY2tfbGVuICgpID4gMSkKKyAgICBfX29wZW42NF90b29fbWFueV9hcmdzICgpOworCisgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19vZmxhZykpCisgICAgeworICAgICAgaWYgKChfX29mbGFnICYgT19DUkVBVCkgIT0gMCAmJiBfX3ZhX2FyZ19wYWNrX2xlbiAoKSA8IDEpCisJeworCSAgX19vcGVuNjRfbWlzc2luZ19tb2RlICgpOworCSAgcmV0dXJuIF9fb3BlbjY0XzIgKF9fcGF0aCwgX19vZmxhZyk7CisJfQorICAgICAgcmV0dXJuIF9fb3BlbjY0X2FsaWFzIChfX3BhdGgsIF9fb2ZsYWcsIF9fdmFfYXJnX3BhY2sgKCkpOworICAgIH0KKworICBpZiAoX192YV9hcmdfcGFja19sZW4gKCkgPCAxKQorICAgIHJldHVybiBfX29wZW42NF8yIChfX3BhdGgsIF9fb2ZsYWcpOworCisgIHJldHVybiBfX29wZW42NF9hbGlhcyAoX19wYXRoLCBfX29mbGFnLCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9BVEZJTEUKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgX19vcGVuYXRfMiAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19vZmxhZykKKyAgICAgX19ub25udWxsICgoMikpOworZXh0ZXJuIGludCBfX1JFRElSRUNUIChfX29wZW5hdF9hbGlhcywgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwKKwkJCQkJaW50IF9fb2ZsYWcsIC4uLiksIG9wZW5hdCkKKyAgICAgX19ub25udWxsICgoMikpOworIyBlbHNlCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKF9fb3BlbmF0XzIsIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsCisJCQkJICAgIGludCBfX29mbGFnKSwgX19vcGVuYXQ2NF8yKQorICAgICBfX25vbm51bGwgKCgyKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKF9fb3BlbmF0X2FsaWFzLCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLAorCQkJCQlpbnQgX19vZmxhZywgLi4uKSwgb3BlbmF0NjQpCisgICAgIF9fbm9ubnVsbCAoKDIpKTsKKyMgZW5kaWYKK19fZXJyb3JkZWNsIChfX29wZW5hdF90b29fbWFueV9hcmdzLAorCSAgICAgIm9wZW5hdCBjYW4gYmUgY2FsbGVkIGVpdGhlciB3aXRoIDMgb3IgNCBhcmd1bWVudHMsIG5vdCBtb3JlIik7CitfX2Vycm9yZGVjbCAoX19vcGVuYXRfbWlzc2luZ19tb2RlLAorCSAgICAgIm9wZW5hdCB3aXRoIE9fQ1JFQVQgaW4gdGhpcmQgYXJndW1lbnQgbmVlZHMgNCBhcmd1bWVudHMiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK29wZW5hdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19vZmxhZywgLi4uKQoreworICBpZiAoX192YV9hcmdfcGFja19sZW4gKCkgPiAxKQorICAgIF9fb3BlbmF0X3Rvb19tYW55X2FyZ3MgKCk7CisKKyAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX29mbGFnKSkKKyAgICB7CisgICAgICBpZiAoKF9fb2ZsYWcgJiBPX0NSRUFUKSAhPSAwICYmIF9fdmFfYXJnX3BhY2tfbGVuICgpIDwgMSkKKwl7CisJICBfX29wZW5hdF9taXNzaW5nX21vZGUgKCk7CisJICByZXR1cm4gX19vcGVuYXRfMiAoX19mZCwgX19wYXRoLCBfX29mbGFnKTsKKwl9CisgICAgICByZXR1cm4gX19vcGVuYXRfYWxpYXMgKF9fZmQsIF9fcGF0aCwgX19vZmxhZywgX192YV9hcmdfcGFjayAoKSk7CisgICAgfQorCisgIGlmIChfX3ZhX2FyZ19wYWNrX2xlbiAoKSA8IDEpCisgICAgcmV0dXJuIF9fb3BlbmF0XzIgKF9fZmQsIF9fcGF0aCwgX19vZmxhZyk7CisKKyAgcmV0dXJuIF9fb3BlbmF0X2FsaWFzIChfX2ZkLCBfX3BhdGgsIF9fb2ZsYWcsIF9fdmFfYXJnX3BhY2sgKCkpOworfQorCisKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgX19vcGVuYXQ2NF8yIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnKQorICAgICBfX25vbm51bGwgKCgyKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKF9fb3BlbmF0NjRfYWxpYXMsIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsCisJCQkJCSAgaW50IF9fb2ZsYWcsIC4uLiksIG9wZW5hdDY0KQorICAgICBfX25vbm51bGwgKCgyKSk7CitfX2Vycm9yZGVjbCAoX19vcGVuYXQ2NF90b29fbWFueV9hcmdzLAorCSAgICAgIm9wZW5hdDY0IGNhbiBiZSBjYWxsZWQgZWl0aGVyIHdpdGggMyBvciA0IGFyZ3VtZW50cywgbm90IG1vcmUiKTsKK19fZXJyb3JkZWNsIChfX29wZW5hdDY0X21pc3NpbmdfbW9kZSwKKwkgICAgICJvcGVuYXQ2NCB3aXRoIE9fQ1JFQVQgaW4gdGhpcmQgYXJndW1lbnQgbmVlZHMgNCBhcmd1bWVudHMiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK29wZW5hdDY0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnLCAuLi4pCit7CisgIGlmIChfX3ZhX2FyZ19wYWNrX2xlbiAoKSA+IDEpCisgICAgX19vcGVuYXQ2NF90b29fbWFueV9hcmdzICgpOworCisgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19vZmxhZykpCisgICAgeworICAgICAgaWYgKChfX29mbGFnICYgT19DUkVBVCkgIT0gMCAmJiBfX3ZhX2FyZ19wYWNrX2xlbiAoKSA8IDEpCisJeworCSAgX19vcGVuYXQ2NF9taXNzaW5nX21vZGUgKCk7CisJICByZXR1cm4gX19vcGVuYXQ2NF8yIChfX2ZkLCBfX3BhdGgsIF9fb2ZsYWcpOworCX0KKyAgICAgIHJldHVybiBfX29wZW5hdDY0X2FsaWFzIChfX2ZkLCBfX3BhdGgsIF9fb2ZsYWcsIF9fdmFfYXJnX3BhY2sgKCkpOworICAgIH0KKworICBpZiAoX192YV9hcmdfcGFja19sZW4gKCkgPCAxKQorICAgIHJldHVybiBfX29wZW5hdDY0XzIgKF9fZmQsIF9fcGF0aCwgX19vZmxhZyk7CisKKyAgcmV0dXJuIF9fb3BlbmF0NjRfYWxpYXMgKF9fZmQsIF9fcGF0aCwgX19vZmxhZywgX192YV9hcmdfcGFjayAoKSk7Cit9CisjIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2ZlbnYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2ZlbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmMyNDUwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZmVudi5oCkBAIC0wLDAgKzEsMTM1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMSwyMDA0LDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0ZFTlZfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2ZlbnYuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGZlbnYuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworCisvKiBEZWZpbmUgYml0cyByZXByZXNlbnRpbmcgdGhlIGV4Y2VwdGlvbi4gIFdlIHVzZSB0aGUgYml0IHBvc2l0aW9ucworICAgb2YgdGhlIGFwcHJvcHJpYXRlIGJpdHMgaW4gdGhlIEZQVSBjb250cm9sIHdvcmQuICAqLworZW51bQorICB7CisgICAgRkVfSU5WQUxJRCA9IDB4MDEsCisjZGVmaW5lIEZFX0lOVkFMSUQJRkVfSU5WQUxJRAorICAgIF9fRkVfREVOT1JNID0gMHgwMiwKKyAgICBGRV9ESVZCWVpFUk8gPSAweDA0LAorI2RlZmluZSBGRV9ESVZCWVpFUk8JRkVfRElWQllaRVJPCisgICAgRkVfT1ZFUkZMT1cgPSAweDA4LAorI2RlZmluZSBGRV9PVkVSRkxPVwlGRV9PVkVSRkxPVworICAgIEZFX1VOREVSRkxPVyA9IDB4MTAsCisjZGVmaW5lIEZFX1VOREVSRkxPVwlGRV9VTkRFUkZMT1cKKyAgICBGRV9JTkVYQUNUID0gMHgyMAorI2RlZmluZSBGRV9JTkVYQUNUCUZFX0lORVhBQ1QKKyAgfTsKKworI2RlZmluZSBGRV9BTExfRVhDRVBUIFwKKwkoRkVfSU5FWEFDVCB8IEZFX0RJVkJZWkVSTyB8IEZFX1VOREVSRkxPVyB8IEZFX09WRVJGTE9XIHwgRkVfSU5WQUxJRCkKKworLyogVGhlIGl4ODcgRlBVIHN1cHBvcnRzIGFsbCBvZiB0aGUgZm91ciBkZWZpbmVkIHJvdW5kaW5nIG1vZGVzLiAgV2UKKyAgIHVzZSBhZ2FpbiB0aGUgYml0IHBvc2l0aW9ucyBpbiB0aGUgRlBVIGNvbnRyb2wgd29yZCBhcyB0aGUgdmFsdWVzCisgICBmb3IgdGhlIGFwcHJvcHJpYXRlIG1hY3Jvcy4gICovCitlbnVtCisgIHsKKyAgICBGRV9UT05FQVJFU1QgPSAwLAorI2RlZmluZSBGRV9UT05FQVJFU1QJRkVfVE9ORUFSRVNUCisgICAgRkVfRE9XTldBUkQgPSAweDQwMCwKKyNkZWZpbmUgRkVfRE9XTldBUkQJRkVfRE9XTldBUkQKKyAgICBGRV9VUFdBUkQgPSAweDgwMCwKKyNkZWZpbmUgRkVfVVBXQVJECUZFX1VQV0FSRAorICAgIEZFX1RPV0FSRFpFUk8gPSAweGMwMAorI2RlZmluZSBGRV9UT1dBUkRaRVJPCUZFX1RPV0FSRFpFUk8KKyAgfTsKKworCisvKiBUeXBlIHJlcHJlc2VudGluZyBleGNlcHRpb24gZmxhZ3MuICAqLwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgZmV4Y2VwdF90OworCisKKy8qIFR5cGUgcmVwcmVzZW50aW5nIGZsb2F0aW5nLXBvaW50IGVudmlyb25tZW50LiAgVGhpcyBzdHJ1Y3R1cmUKKyAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsYXlvdXQgb2YgdGhlIGJsb2NrIHdyaXR0ZW4gYnkgdGhlIGBmc3RlbnYnCisgICBpbnN0cnVjdGlvbiBhbmQgaGFzIGFkZGl0aW9uYWwgZmllbGRzIGZvciB0aGUgY29udGVudHMgb2YgdGhlIE1YQ1NSCisgICByZWdpc3RlciBhcyB3cml0dGVuIGJ5IHRoZSBgc3RteGNzcicgaW5zdHJ1Y3Rpb24uICAqLwordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX2NvbnRyb2xfd29yZDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX191bnVzZWQxOworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3N0YXR1c193b3JkOworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3VudXNlZDI7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fdGFnczsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX191bnVzZWQzOworICAgIHVuc2lnbmVkIGludCBfX2VpcDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX19jc19zZWxlY3RvcjsKKyAgICB1bnNpZ25lZCBpbnQgX19vcGNvZGU6MTE7CisgICAgdW5zaWduZWQgaW50IF9fdW51c2VkNDo1OworICAgIHVuc2lnbmVkIGludCBfX2RhdGFfb2Zmc2V0OworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX2RhdGFfc2VsZWN0b3I7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fdW51c2VkNTsKKyNpZiBfX1dPUkRTSVpFID09IDY0CisgICAgdW5zaWduZWQgaW50IF9fbXhjc3I7CisjZW5kaWYKKyAgfQorZmVudl90OworCisvKiBJZiB0aGUgZGVmYXVsdCBhcmd1bWVudCBpcyB1c2VkIHdlIHVzZSB0aGlzIHZhbHVlLiAgKi8KKyNkZWZpbmUgRkVfREZMX0VOVgkoKF9fY29uc3QgZmVudl90ICopIC0xKQorCisjaWZkZWYgX19VU0VfR05VCisvKiBGbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCB3aGVyZSBub25lIG9mIHRoZSBleGNlcHRpb24gaXMgbWFza2VkLiAgKi8KKyMgZGVmaW5lIEZFX05PTUFTS19FTlYJKChfX2NvbnN0IGZlbnZfdCAqKSAtMikKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9FWFRFUk5fSU5MSU5FUworX19CRUdJTl9ERUNMUworCisvKiBPcHRpbWl6ZWQgdmVyc2lvbnMuICAqLworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX19mZXJhaXNlZXhjZXB0X3JlbmFtZWQsIChpbnQpLCBmZXJhaXNlZXhjZXB0KTsKK19fZXh0ZXJuX2lubGluZSBpbnQKK19fTlRIIChmZXJhaXNlZXhjZXB0IChpbnQgX19leGNlcHRzKSkKK3sKKyAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX2V4Y2VwdHMpCisgICAgICAmJiAoX19leGNlcHRzICYgfihGRV9JTlZBTElEIHwgRkVfRElWQllaRVJPKSkgPT0gMCkKKyAgICB7CisgICAgICBpZiAoKEZFX0lOVkFMSUQgJiBfX2V4Y2VwdHMpICE9IDApCisJeworCSAgLyogT25lIGV4YW1wbGUgb2YgYSBpbnZhbGlkIG9wZXJhdGlvbiBpcyAwLjAgLyAwLjAuICAqLworCSAgZmxvYXQgX19mID0gMC4wOworCisJICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImRpdnNzICUwLCAlMCAiIDogOiAieCIgKF9fZikpOworCSAgKHZvaWQpICZfX2Y7CisJfQorICAgICAgaWYgKChGRV9ESVZCWVpFUk8gJiBfX2V4Y2VwdHMpICE9IDApCisJeworCSAgZmxvYXQgX19mID0gMS4wOworCSAgZmxvYXQgX19nID0gMC4wOworCisJICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImRpdnNzICUxLCAlMCIgOiA6ICJ4IiAoX19mKSwgIngiIChfX2cpKTsKKwkgICh2b2lkKSAmX19mOworCX0KKworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHJldHVybiBfX2ZlcmFpc2VleGNlcHRfcmVuYW1lZCAoX19leGNlcHRzKTsKK30KKworX19FTkRfREVDTFMKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZmVudmlubGluZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvZmVudmlubGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZjc3YjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9mZW52aW5saW5lLmgKQEAgLTAsMCArMSw4IEBACisvKiBUaGlzIGZpbGUgcHJvdmlkZXMgaW5saW5lIHZlcnNpb25zIG9mIGZsb2F0aW5nLXBpbnQgZW52aXJvbm1lbnQKKyAgIGhhbmRsaW5nIGZ1bmN0aW9ucy4gIElmIHRoZXJlIHdlcmUgYW55LiAgKi8KKworI2lmbmRlZiBfX05PX01BVEhfSU5MSU5FUworCisvKiBIZXJlIGlzIHdoZXJlIHRoZSBjb2RlIHdvdWxkIGdvLiAgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9odWdlX3ZhbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvaHVnZV92YWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWNhMTFmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvaHVnZV92YWwuaApAQCAtMCwwICsxLDU1IEBACisvKiBgSFVHRV9WQUwnIGNvbnN0YW50IGZvciBJRUVFIDc1NCBtYWNoaW5lcyAod2hlcmUgaXQgaXMgaW5maW5pdHkpLgorICAgVXNlZCBieSA8c3RkbGliLmg+IGFuZCA8bWF0aC5oPiBmdW5jdGlvbnMgZm9yIG92ZXJmbG93LgorICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk5LCAyMDAwLCAyMDA0CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTUFUSF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvaHVnZV92YWwuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPG1hdGguaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogSUVFRSBwb3NpdGl2ZSBpbmZpbml0eSAoLUhVR0VfVkFMIGlzIG5lZ2F0aXZlIGluZmluaXR5KS4gICovCisKKyNpZiBfX0dOVUNfUFJFUkVRKDMsMykKKyMgZGVmaW5lIEhVR0VfVkFMCShfX2J1aWx0aW5faHVnZV92YWwoKSkKKyNlbGlmIF9fR05VQ19QUkVSRVEoMiw5NikKKyMgZGVmaW5lIEhVR0VfVkFMCShfX2V4dGVuc2lvbl9fIDB4MS4wcDIwNDcpCisjZWxpZiBkZWZpbmVkIF9fR05VQ19fCisKKyMgZGVmaW5lIEhVR0VfVkFMIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKCh1bmlvbiB7IHVuc2lnbmVkIF9fbCBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX0RJX18pKSk7IGRvdWJsZSBfX2Q7IH0pICAgXAorICAgIHsgX19sOiAweDdmZjAwMDAwMDAwMDAwMDBVTEwgfSkuX19kKQorCisjZWxzZSAvKiBub3QgR0NDICovCisKKyMgaW5jbHVkZSA8ZW5kaWFuLmg+CisKK3R5cGVkZWYgdW5pb24geyB1bnNpZ25lZCBjaGFyIF9fY1s4XTsgZG91YmxlIF9fZDsgfSBfX2h1Z2VfdmFsX3Q7CisKKyMgaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorIyAgZGVmaW5lIF9fSFVHRV9WQUxfYnl0ZXMJeyAweDdmLCAweGYwLCAwLCAwLCAwLCAwLCAwLCAwIH0KKyMgZW5kaWYKKyMgaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorIyAgZGVmaW5lIF9fSFVHRV9WQUxfYnl0ZXMJeyAwLCAwLCAwLCAwLCAwLCAwLCAweGYwLCAweDdmIH0KKyMgZW5kaWYKKworc3RhdGljIF9faHVnZV92YWxfdCBfX2h1Z2VfdmFsID0geyBfX0hVR0VfVkFMX2J5dGVzIH07CisjIGRlZmluZSBIVUdFX1ZBTAkoX19odWdlX3ZhbC5fX2QpCisKKyNlbmRpZgkvKiBHQ0MuICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvaHVnZV92YWxmLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9odWdlX3ZhbGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzg1MzQyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvaHVnZV92YWxmLmgKQEAgLTAsMCArMSw1MyBAQAorLyogYEhVR0VfVkFMRicgY29uc3RhbnQgZm9yIElFRUUgNzU0IG1hY2hpbmVzICh3aGVyZSBpdCBpcyBpbmZpbml0eSkuCisgICBVc2VkIGJ5IDxzdGRsaWIuaD4gYW5kIDxtYXRoLmg+IGZ1bmN0aW9ucyBmb3Igb3ZlcmZsb3cuCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTksIDIwMDAsIDIwMDQKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9NQVRIX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9odWdlX3ZhbGYuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPG1hdGguaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogSUVFRSBwb3NpdGl2ZSBpbmZpbml0eSAoLUhVR0VfVkFMIGlzIG5lZ2F0aXZlIGluZmluaXR5KS4gICovCisKKyNpZiBfX0dOVUNfUFJFUkVRKDMsMykKKyMgZGVmaW5lIEhVR0VfVkFMRgkoX19idWlsdGluX2h1Z2VfdmFsZigpKQorI2VsaWYgX19HTlVDX1BSRVJFUSgyLDk2KQorIyBkZWZpbmUgSFVHRV9WQUxGCShfX2V4dGVuc2lvbl9fIDB4MS4wcDI1NWYpCisjZWxpZiBkZWZpbmVkIF9fR05VQ19fCisKKyMgICBkZWZpbmUgSFVHRV9WQUxGIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKCh1bmlvbiB7IHVuc2lnbmVkIF9fbCBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1NJX18pKSk7IGZsb2F0IF9fZDsgfSkgICAgXAorICAgIHsgX19sOiAweDdmODAwMDAwVUwgfSkuX19kKQorCisjZWxzZSAvKiBub3QgR0NDICovCisKK3R5cGVkZWYgdW5pb24geyB1bnNpZ25lZCBjaGFyIF9fY1s0XTsgZmxvYXQgX19mOyB9IF9faHVnZV92YWxmX3Q7CisKKyMgaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorIyAgZGVmaW5lIF9fSFVHRV9WQUxGX2J5dGVzCXsgMHg3ZiwgMHg4MCwgMCwgMCB9CisjIGVuZGlmCisjIGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgIGRlZmluZSBfX0hVR0VfVkFMRl9ieXRlcwl7IDAsIDAsIDB4ODAsIDB4N2YgfQorIyBlbmRpZgorCitzdGF0aWMgX19odWdlX3ZhbGZfdCBfX2h1Z2VfdmFsZiA9IHsgX19IVUdFX1ZBTEZfYnl0ZXMgfTsKKyMgZGVmaW5lIEhVR0VfVkFMRgkoX19odWdlX3ZhbGYuX19mKQorCisjZW5kaWYJLyogR0NDLiAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2h1Z2VfdmFsbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvaHVnZV92YWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVlOGUyMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2h1Z2VfdmFsbC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIERlZmF1bHQgYEhVR0VfVkFMTCcgY29uc3RhbnQuCisgICBVc2VkIGJ5IDxzdGRsaWIuaD4gYW5kIDxtYXRoLmg+IGZ1bmN0aW9ucyBmb3Igb3ZlcmZsb3cuCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTYsIDE5OTcsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01BVEhfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2h1Z2VfdmFsbC5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bWF0aC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWYgX19HTlVDX1BSRVJFUSgzLDMpCisjIGRlZmluZSBIVUdFX1ZBTEwJKF9fYnVpbHRpbl9odWdlX3ZhbGwoKSkKKyNlbHNlCisjIGRlZmluZSBIVUdFX1ZBTEwJKChsb25nIGRvdWJsZSkgSFVHRV9WQUwpCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2luLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9pbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NWUxNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9pbi5oCkBAIC0wLDAgKzEsMTg5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtMjAwMCwyMDA0LDIwMDgsMjAxMCwyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBMaW51eCB2ZXJzaW9uLiAgKi8KKworI2lmbmRlZiBfTkVUSU5FVF9JTl9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPG5ldGluZXQvaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogT3B0aW9ucyBmb3IgdXNlIHdpdGggYGdldHNvY2tvcHQnIGFuZCBgc2V0c29ja29wdCcgYXQgdGhlIElQIGxldmVsLgorICAgVGhlIGZpcnN0IHdvcmQgaW4gdGhlIGNvbW1lbnQgYXQgdGhlIHJpZ2h0IGlzIHRoZSBkYXRhIHR5cGUgdXNlZDsKKyAgICJib29sIiBtZWFucyBhIGJvb2xlYW4gdmFsdWUgc3RvcmVkIGluIGFuIGBpbnQnLiAgKi8KKyNkZWZpbmUgICAgICAgIElQX09QVElPTlMgICAgICA0ICAgICAgIC8qIGlwX29wdHM7IElQIHBlci1wYWNrZXQgb3B0aW9ucy4gICovCisjZGVmaW5lICAgICAgICBJUF9IRFJJTkNMICAgICAgMyAgICAgICAvKiBpbnQ7IEhlYWRlciBpcyBpbmNsdWRlZCB3aXRoIGRhdGEuICAqLworI2RlZmluZSAgICAgICAgSVBfVE9TICAgICAgICAgIDEgICAgICAgLyogaW50OyBJUCB0eXBlIG9mIHNlcnZpY2UgYW5kIHByZWNlZGVuY2UuICAqLworI2RlZmluZSAgICAgICAgSVBfVFRMICAgICAgICAgIDIgICAgICAgLyogaW50OyBJUCB0aW1lIHRvIGxpdmUuICAqLworI2RlZmluZSAgICAgICAgSVBfUkVDVk9QVFMgICAgIDYgICAgICAgLyogYm9vbDsgUmVjZWl2ZSBhbGwgSVAgb3B0aW9ucyB3L2RhdGFncmFtLiAgKi8KKy8qIEZvciBCU0QgY29tcGF0aWJpbGl0eS4gICovCisjZGVmaW5lICAgICAgICBJUF9SRUNWUkVUT1BUUyAgSVBfUkVUT1BUUyAgICAgICAvKiBib29sOyBSZWNlaXZlIElQIG9wdGlvbnMgZm9yIHJlc3BvbnNlLiAgKi8KKyNkZWZpbmUgICAgICAgIElQX1JFVE9QVFMgICAgICA3ICAgICAgIC8qIGlwX29wdHM7IFNldC9nZXQgSVAgcGVyLXBhY2tldCBvcHRpb25zLiAgKi8KKyNkZWZpbmUgSVBfTVVMVElDQVNUX0lGIDMyCS8qIGluX2FkZHI7IHNldC9nZXQgSVAgbXVsdGljYXN0IGkvZiAqLworI2RlZmluZSBJUF9NVUxUSUNBU1RfVFRMIDMzCS8qIHVfY2hhcjsgc2V0L2dldCBJUCBtdWx0aWNhc3QgdHRsICovCisjZGVmaW5lIElQX01VTFRJQ0FTVF9MT09QIDM0CS8qIGlfY2hhcjsgc2V0L2dldCBJUCBtdWx0aWNhc3QgbG9vcGJhY2sgKi8KKyNkZWZpbmUgSVBfQUREX01FTUJFUlNISVAgMzUJLyogaXBfbXJlcTsgYWRkIGFuIElQIGdyb3VwIG1lbWJlcnNoaXAgKi8KKyNkZWZpbmUgSVBfRFJPUF9NRU1CRVJTSElQIDM2CS8qIGlwX21yZXE7IGRyb3AgYW4gSVAgZ3JvdXAgbWVtYmVyc2hpcCAqLworI2RlZmluZSBJUF9VTkJMT0NLX1NPVVJDRSAzNwkvKiBpcF9tcmVxX3NvdXJjZTogdW5ibG9jayBkYXRhIGZyb20gc291cmNlICovCisjZGVmaW5lIElQX0JMT0NLX1NPVVJDRSAzOAkvKiBpcF9tcmVxX3NvdXJjZTogYmxvY2sgZGF0YSBmcm9tIHNvdXJjZSAqLworI2RlZmluZSBJUF9BRERfU09VUkNFX01FTUJFUlNISVAgMzkgLyogaXBfbXJlcV9zb3VyY2U6IGpvaW4gc291cmNlIGdyb3VwICovCisjZGVmaW5lIElQX0RST1BfU09VUkNFX01FTUJFUlNISVAgNDAgLyogaXBfbXJlcV9zb3VyY2U6IGxlYXZlIHNvdXJjZSBncm91cCAqLworI2RlZmluZSBJUF9NU0ZJTFRFUiA0MQorI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX0dOVQorIyBkZWZpbmUgTUNBU1RfSk9JTl9HUk9VUCA0MgkvKiBncm91cF9yZXE6IGpvaW4gYW55LXNvdXJjZSBncm91cCAqLworIyBkZWZpbmUgTUNBU1RfQkxPQ0tfU09VUkNFIDQzCS8qIGdyb3VwX3NvdXJjZV9yZXE6IGJsb2NrIGZyb20gZ2l2ZW4gZ3JvdXAgKi8KKyMgZGVmaW5lIE1DQVNUX1VOQkxPQ0tfU09VUkNFIDQ0IC8qIGdyb3VwX3NvdXJjZV9yZXE6IHVuYmxvY2sgZnJvbSBnaXZlbiBncm91cCovCisjIGRlZmluZSBNQ0FTVF9MRUFWRV9HUk9VUCA0NQkvKiBncm91cF9yZXE6IGxlYXZlIGFueS1zb3VyY2UgZ3JvdXAgKi8KKyMgZGVmaW5lIE1DQVNUX0pPSU5fU09VUkNFX0dST1VQIDQ2IC8qIGdyb3VwX3NvdXJjZV9yZXE6IGpvaW4gc291cmNlLXNwZWMgZ3IgKi8KKyMgZGVmaW5lIE1DQVNUX0xFQVZFX1NPVVJDRV9HUk9VUCA0NyAvKiBncm91cF9zb3VyY2VfcmVxOiBsZWF2ZSBzb3VyY2Utc3BlYyBnciovCisjIGRlZmluZSBNQ0FTVF9NU0ZJTFRFUiA0OAorCisjIGRlZmluZSBNQ0FTVF9FWENMVURFICAgMAorIyBkZWZpbmUgTUNBU1RfSU5DTFVERSAgIDEKKyNlbmRpZgorCisjZGVmaW5lIElQX1JPVVRFUl9BTEVSVAk1CS8qIGJvb2wgKi8KKyNkZWZpbmUgSVBfUEtUSU5GTwk4CS8qIGJvb2wgKi8KKyNkZWZpbmUgSVBfUEtUT1BUSU9OUwk5CisjZGVmaW5lIElQX1BNVFVESVNDCTEwCS8qIG9ic29sZXRlIG5hbWU/ICovCisjZGVmaW5lIElQX01UVV9ESVNDT1ZFUgkxMAkvKiBpbnQ7IHNlZSBiZWxvdyAqLworI2RlZmluZSBJUF9SRUNWRVJSCTExCS8qIGJvb2wgKi8KKyNkZWZpbmUgSVBfUkVDVlRUTAkxMgkvKiBib29sICovCisjZGVmaW5lIElQX1JFQ1ZUT1MJMTMJLyogYm9vbCAqLworI2RlZmluZSBJUF9NVFUJCTE0CS8qIGludCAqLworI2RlZmluZSBJUF9GUkVFQklORAkxNQorI2RlZmluZSBJUF9JUFNFQ19QT0xJQ1kgMTYKKyNkZWZpbmUgSVBfWEZSTV9QT0xJQ1kJMTcKKyNkZWZpbmUgSVBfUEFTU1NFQwkxOAorI2RlZmluZSBJUF9UUkFOU1BBUkVOVAkxOQorI2RlZmluZSBJUF9NVUxUSUNBU1RfQUxMIDQ5CS8qIGJvb2wgKi8KKworLyogVFByb3h5IG9yaWdpbmFsIGFkZHJlc3NlcyAqLworI2RlZmluZSBJUF9PUklHRFNUQUREUiAgICAgICAyMAorI2RlZmluZSBJUF9SRUNWT1JJR0RTVEFERFIgICBJUF9PUklHRFNUQUREUgorCisjZGVmaW5lIElQX01JTlRUTCAgICAgICAyMQorCisKKy8qIElQX01UVV9ESVNDT1ZFUiBhcmd1bWVudHMuICAqLworI2RlZmluZSBJUF9QTVRVRElTQ19ET05UICAgMAkvKiBOZXZlciBzZW5kIERGIGZyYW1lcy4gICovCisjZGVmaW5lIElQX1BNVFVESVNDX1dBTlQgICAxCS8qIFVzZSBwZXIgcm91dGUgaGludHMuICAqLworI2RlZmluZSBJUF9QTVRVRElTQ19ETyAgICAgMgkvKiBBbHdheXMgREYuICAqLworI2RlZmluZSBJUF9QTVRVRElTQ19QUk9CRSAgMwkvKiBJZ25vcmUgZHN0IHBtdHUuICAqLworCisvKiBUbyBzZWxlY3QgdGhlIElQIGxldmVsLiAgKi8KKyNkZWZpbmUgU09MX0lQCTAKKworI2RlZmluZSBJUF9ERUZBVUxUX01VTFRJQ0FTVF9UVEwgICAgICAgIDEKKyNkZWZpbmUgSVBfREVGQVVMVF9NVUxUSUNBU1RfTE9PUCAgICAgICAxCisjZGVmaW5lIElQX01BWF9NRU1CRVJTSElQUyAgICAgICAgICAgICAgMjAKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX0dOVQorLyogU3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgSVAgb3B0aW9ucyBmb3IgSVBfT1BUSU9OUyBhbmQgSVBfUkVUT1BUUy4KKyAgIFRoZSBgaXBfZHN0JyBmaWVsZCBpcyB1c2VkIGZvciB0aGUgZmlyc3QtaG9wIGdhdGV3YXkgd2hlbiB1c2luZyBhCisgICBzb3VyY2Ugcm91dGUgKHRoaXMgZ2V0cyBwdXQgaW50byB0aGUgaGVhZGVyIHByb3BlcikuICAqLworc3RydWN0IGlwX29wdHMKKyAgeworICAgIHN0cnVjdCBpbl9hZGRyIGlwX2RzdDsJLyogRmlyc3QgaG9wOyB6ZXJvIHdpdGhvdXQgc291cmNlIHJvdXRlLiAgKi8KKyAgICBjaGFyIGlwX29wdHNbNDBdOwkJLyogQWN0dWFsbHkgdmFyaWFibGUgaW4gc2l6ZS4gICovCisgIH07CisKKy8qIExpa2UgYHN0cnVjdCBpcF9tcmVxJyBidXQgaW5jbHVkaW5nIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uIGJ5IGluZGV4LiAgKi8KK3N0cnVjdCBpcF9tcmVxbgorICB7CisgICAgc3RydWN0IGluX2FkZHIgaW1yX211bHRpYWRkcjsJLyogSVAgbXVsdGljYXN0IGFkZHJlc3Mgb2YgZ3JvdXAgKi8KKyAgICBzdHJ1Y3QgaW5fYWRkciBpbXJfYWRkcmVzczsJCS8qIGxvY2FsIElQIGFkZHJlc3Mgb2YgaW50ZXJmYWNlICovCisgICAgaW50CWltcl9pZmluZGV4OwkJCS8qIEludGVyZmFjZSBpbmRleCAqLworICB9OworCisvKiBTdHJ1Y3R1cmUgdXNlZCBmb3IgSVBfUEtUSU5GTy4gICovCitzdHJ1Y3QgaW5fcGt0aW5mbworICB7CisgICAgaW50IGlwaV9pZmluZGV4OwkJCS8qIEludGVyZmFjZSBpbmRleCAgKi8KKyAgICBzdHJ1Y3QgaW5fYWRkciBpcGlfc3BlY19kc3Q7CS8qIFJvdXRpbmcgZGVzdGluYXRpb24gYWRkcmVzcyAgKi8KKyAgICBzdHJ1Y3QgaW5fYWRkciBpcGlfYWRkcjsJCS8qIEhlYWRlciBkZXN0aW5hdGlvbiBhZGRyZXNzICAqLworICB9OworI2VuZGlmCisKKy8qIE9wdGlvbnMgZm9yIHVzZSB3aXRoIGBnZXRzb2Nrb3B0JyBhbmQgYHNldHNvY2tvcHQnIGF0IHRoZSBJUHY2IGxldmVsLgorICAgVGhlIGZpcnN0IHdvcmQgaW4gdGhlIGNvbW1lbnQgYXQgdGhlIHJpZ2h0IGlzIHRoZSBkYXRhIHR5cGUgdXNlZDsKKyAgICJib29sIiBtZWFucyBhIGJvb2xlYW4gdmFsdWUgc3RvcmVkIGluIGFuIGBpbnQnLiAgKi8KKyNkZWZpbmUgSVBWNl9BRERSRk9STQkJMQorI2RlZmluZSBJUFY2XzIyOTJQS1RJTkZPCTIKKyNkZWZpbmUgSVBWNl8yMjkySE9QT1BUUwkzCisjZGVmaW5lIElQVjZfMjI5MkRTVE9QVFMJNAorI2RlZmluZSBJUFY2XzIyOTJSVEhEUgkJNQorI2RlZmluZSBJUFY2XzIyOTJQS1RPUFRJT05TCTYKKyNkZWZpbmUgSVBWNl9DSEVDS1NVTQkJNworI2RlZmluZSBJUFY2XzIyOTJIT1BMSU1JVAk4CisKKyNkZWZpbmUgU0NNX1NSQ1JUCQlJUFY2X1JYU1JDUlQKKworI2RlZmluZSBJUFY2X05FWFRIT1AJCTkKKyNkZWZpbmUgSVBWNl9BVVRISERSCQkxMAorI2RlZmluZSBJUFY2X1VOSUNBU1RfSE9QUwkxNgorI2RlZmluZSBJUFY2X01VTFRJQ0FTVF9JRgkxNworI2RlZmluZSBJUFY2X01VTFRJQ0FTVF9IT1BTCTE4CisjZGVmaW5lIElQVjZfTVVMVElDQVNUX0xPT1AJMTkKKyNkZWZpbmUgSVBWNl9KT0lOX0dST1VQCQkyMAorI2RlZmluZSBJUFY2X0xFQVZFX0dST1VQCTIxCisjZGVmaW5lIElQVjZfUk9VVEVSX0FMRVJUCTIyCisjZGVmaW5lIElQVjZfTVRVX0RJU0NPVkVSCTIzCisjZGVmaW5lIElQVjZfTVRVCQkyNAorI2RlZmluZSBJUFY2X1JFQ1ZFUlIJCTI1CisjZGVmaW5lIElQVjZfVjZPTkxZCQkyNgorI2RlZmluZSBJUFY2X0pPSU5fQU5ZQ0FTVAkyNworI2RlZmluZSBJUFY2X0xFQVZFX0FOWUNBU1QJMjgKKyNkZWZpbmUgSVBWNl9JUFNFQ19QT0xJQ1kJMzQKKyNkZWZpbmUgSVBWNl9YRlJNX1BPTElDWQkzNQorCisjZGVmaW5lIElQVjZfUkVDVlBLVElORk8JNDkKKyNkZWZpbmUgSVBWNl9QS1RJTkZPCQk1MAorI2RlZmluZSBJUFY2X1JFQ1ZIT1BMSU1JVAk1MQorI2RlZmluZSBJUFY2X0hPUExJTUlUCQk1MgorI2RlZmluZSBJUFY2X1JFQ1ZIT1BPUFRTCTUzCisjZGVmaW5lIElQVjZfSE9QT1BUUwkJNTQKKyNkZWZpbmUgSVBWNl9SVEhEUkRTVE9QVFMJNTUKKyNkZWZpbmUgSVBWNl9SRUNWUlRIRFIJCTU2CisjZGVmaW5lIElQVjZfUlRIRFIJCTU3CisjZGVmaW5lIElQVjZfUkVDVkRTVE9QVFMJNTgKKyNkZWZpbmUgSVBWNl9EU1RPUFRTCQk1OQorCisjZGVmaW5lIElQVjZfUkVDVlRDTEFTUwkJNjYKKyNkZWZpbmUgSVBWNl9UQ0xBU1MJCTY3CisKKy8qIE9ic29sZXRlIHN5bm9ueW1zIGZvciB0aGUgYWJvdmUuICAqLworI2RlZmluZSBJUFY2X0FERF9NRU1CRVJTSElQCUlQVjZfSk9JTl9HUk9VUAorI2RlZmluZSBJUFY2X0RST1BfTUVNQkVSU0hJUAlJUFY2X0xFQVZFX0dST1VQCisjZGVmaW5lIElQVjZfUlhIT1BPUFRTCQlJUFY2X0hPUE9QVFMKKyNkZWZpbmUgSVBWNl9SWERTVE9QVFMJCUlQVjZfRFNUT1BUUworCisvKiBJUFY2X01UVV9ESVNDT1ZFUiB2YWx1ZXMuICAqLworI2RlZmluZSBJUFY2X1BNVFVESVNDX0RPTlQJMAkvKiBOZXZlciBzZW5kIERGIGZyYW1lcy4gICovCisjZGVmaW5lIElQVjZfUE1UVURJU0NfV0FOVAkxCS8qIFVzZSBwZXIgcm91dGUgaGludHMuICAqLworI2RlZmluZSBJUFY2X1BNVFVESVNDX0RPCTIJLyogQWx3YXlzIERGLiAgKi8KKyNkZWZpbmUgSVBWNl9QTVRVRElTQ19QUk9CRQkzCS8qIElnbm9yZSBkc3QgcG10dS4gICovCisKKy8qIFNvY2tldCBsZXZlbCB2YWx1ZXMgZm9yIElQdjYuICAqLworI2RlZmluZSBTT0xfSVBWNiAgICAgICAgNDEKKyNkZWZpbmUgU09MX0lDTVBWNiAgICAgIDU4CisKKy8qIFJvdXRpbmcgaGVhZGVyIG9wdGlvbnMgZm9yIElQdjYuICAqLworI2RlZmluZSBJUFY2X1JUSERSX0xPT1NFCTAJLyogSG9wIGRvZXNuJ3QgbmVlZCB0byBiZSBuZWlnaGJvdXIuICovCisjZGVmaW5lIElQVjZfUlRIRFJfU1RSSUNUCTEJLyogSG9wIG11c3QgYmUgYSBuZWlnaGJvdXIuICAqLworCisjZGVmaW5lIElQVjZfUlRIRFJfVFlQRV8wCTAJLyogSVB2NiBSb3V0aW5nIGhlYWRlciB0eXBlIDAuICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvaW5mLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9pbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjE5Zjc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvaW5mLmgKQEAgLTAsMCArMSwzMCBAQAorLyogYElORklOSVRZJyBjb25zdGFudCBmb3IgSUVFRSA3NTQgbWFjaGluZXMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01BVEhfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2luZi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bWF0aC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBJRUVFIHBvc2l0aXZlIGluZmluaXR5LiAgKi8KKworI2lmIF9fR05VQ19QUkVSRVEoMywzKQorIyBkZWZpbmUgSU5GSU5JVFkJKF9fYnVpbHRpbl9pbmZmKCkpCisjZWxzZQorIyBkZWZpbmUgSU5GSU5JVFkJSFVHRV9WQUxGCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2luaXRzcGluLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9pbml0c3Bpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNmYxNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9pbml0c3Bpbi5oCkBAIC0wLDAgKzEgQEAKKy8qIE5vIHRocmVhZCBzdXBwb3J0LiAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvaW9jdGwtdHlwZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2lvY3RsLXR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1NmEwNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2lvY3RsLXR5cGVzLmgKQEAgLTAsMCArMSw3OCBAQAorLyogU3RydWN0dXJlIHR5cGVzIGZvciBwcmUtdGVybWlvcyB0ZXJtaW5hbCBpb2N0bHMuICBMaW51eCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5LCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfSU9DVExfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2lvY3RsLXR5cGVzLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzeXMvaW9jdGwuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogR2V0IGRlZmluaXRpb24gb2YgY29uc3RhbnRzIGZvciB1c2Ugd2l0aCBgaW9jdGwnLiAgKi8KKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisKKworc3RydWN0IHdpbnNpemUKKyAgeworICAgIHVuc2lnbmVkIHNob3J0IGludCB3c19yb3c7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IHdzX2NvbDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgd3NfeHBpeGVsOworICAgIHVuc2lnbmVkIHNob3J0IGludCB3c195cGl4ZWw7CisgIH07CisKKyNkZWZpbmUgTkNDIDgKK3N0cnVjdCB0ZXJtaW8KKyAgeworICAgIHVuc2lnbmVkIHNob3J0IGludCBjX2lmbGFnOwkJLyogaW5wdXQgbW9kZSBmbGFncyAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgY19jZmxhZzsJCS8qIGNvbnRyb2wgbW9kZSBmbGFncyAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBjX2xmbGFnOwkJLyogbG9jYWwgbW9kZSBmbGFncyAqLworICAgIHVuc2lnbmVkIGNoYXIgY19saW5lOwkJLyogbGluZSBkaXNjaXBsaW5lICovCisgICAgdW5zaWduZWQgY2hhciBjX2NjW05DQ107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KK307CisKKy8qIG1vZGVtIGxpbmVzICovCisjZGVmaW5lIFRJT0NNX0xFCTB4MDAxCisjZGVmaW5lIFRJT0NNX0RUUgkweDAwMgorI2RlZmluZSBUSU9DTV9SVFMJMHgwMDQKKyNkZWZpbmUgVElPQ01fU1QJMHgwMDgKKyNkZWZpbmUgVElPQ01fU1IJMHgwMTAKKyNkZWZpbmUgVElPQ01fQ1RTCTB4MDIwCisjZGVmaW5lIFRJT0NNX0NBUgkweDA0MAorI2RlZmluZSBUSU9DTV9STkcJMHgwODAKKyNkZWZpbmUgVElPQ01fRFNSCTB4MTAwCisjZGVmaW5lIFRJT0NNX0NECVRJT0NNX0NBUgorI2RlZmluZSBUSU9DTV9SSQlUSU9DTV9STkcKKworLyogaW9jdGwgKGZkLCBUSU9DU0VSR0VUTFNSLCAmcmVzdWx0KSB3aGVyZSByZXN1bHQgbWF5IGJlIGFzIGJlbG93ICovCisKKy8qIGxpbmUgZGlzY2lwbGluZXMgKi8KKyNkZWZpbmUgTl9UVFkJCTAKKyNkZWZpbmUgTl9TTElQCQkxCisjZGVmaW5lIE5fTU9VU0UJCTIKKyNkZWZpbmUgTl9QUFAJCTMKKyNkZWZpbmUgTl9TVFJJUAkJNAorI2RlZmluZSBOX0FYMjUJCTUKKyNkZWZpbmUgTl9YMjUJCTYJLyogWC4yNSBhc3luYyAgKi8KKyNkZWZpbmUgTl82UEFDSwkJNworI2RlZmluZSBOX01BU0MJCTgJLyogTW9iaXRleCBtb2R1bGUgICovCisjZGVmaW5lIE5fUjM5NjQJCTkJLyogU2ltYXRpYyBSMzk2NCBtb2R1bGUgICovCisjZGVmaW5lIE5fUFJPRklCVVNfRkRMCTEwCS8qIFByb2ZpYnVzICAqLworI2RlZmluZSBOX0lSREEJCTExCS8qIExpbnV4IElSICAqLworI2RlZmluZSBOX1NNU0JMT0NLCTEyCS8qIFNNUyBibG9jayBtb2RlICAqLworI2RlZmluZSBOX0hETEMJCTEzCS8qIHN5bmNocm9ub3VzIEhETEMgICovCisjZGVmaW5lIE5fU1lOQ19QUFAJMTQJLyogc3luY2hyb25vdXMgUFBQICAqLworI2RlZmluZQlOX0hDSQkJMTUJLyogQmx1ZXRvb3RoIEhDSSBVQVJUICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvaW9jdGxzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9pb2N0bHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWJiNGM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvaW9jdGxzLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX0lPQ1RMX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9pb2N0bHMuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHN5cy9pb2N0bC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBVc2UgdGhlIGRlZmluaXRpb25zIGZyb20gdGhlIGtlcm5lbCBoZWFkZXIgZmlsZXMuICAqLworI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKworLyogUm91dGluZyB0YWJsZSBjYWxscy4gICovCisjZGVmaW5lIFNJT0NBRERSVAkweDg5MEIJCS8qIGFkZCByb3V0aW5nIHRhYmxlIGVudHJ5CSovCisjZGVmaW5lIFNJT0NERUxSVAkweDg5MEMJCS8qIGRlbGV0ZSByb3V0aW5nIHRhYmxlIGVudHJ5CSovCisjZGVmaW5lIFNJT0NSVE1TRwkweDg5MEQJCS8qIGNhbGwgdG8gcm91dGluZyBzeXN0ZW0JKi8KKworLyogU29ja2V0IGNvbmZpZ3VyYXRpb24gY29udHJvbHMuICovCisjZGVmaW5lIFNJT0NHSUZOQU1FCTB4ODkxMAkJLyogZ2V0IGlmYWNlIG5hbWUJCSovCisjZGVmaW5lIFNJT0NTSUZMSU5LCTB4ODkxMQkJLyogc2V0IGlmYWNlIGNoYW5uZWwJCSovCisjZGVmaW5lIFNJT0NHSUZDT05GCTB4ODkxMgkJLyogZ2V0IGlmYWNlIGxpc3QJCSovCisjZGVmaW5lIFNJT0NHSUZGTEFHUwkweDg5MTMJCS8qIGdldCBmbGFncwkJCSovCisjZGVmaW5lIFNJT0NTSUZGTEFHUwkweDg5MTQJCS8qIHNldCBmbGFncwkJCSovCisjZGVmaW5lIFNJT0NHSUZBRERSCTB4ODkxNQkJLyogZ2V0IFBBIGFkZHJlc3MJCSovCisjZGVmaW5lIFNJT0NTSUZBRERSCTB4ODkxNgkJLyogc2V0IFBBIGFkZHJlc3MJCSovCisjZGVmaW5lIFNJT0NHSUZEU1RBRERSCTB4ODkxNwkJLyogZ2V0IHJlbW90ZSBQQSBhZGRyZXNzCSovCisjZGVmaW5lIFNJT0NTSUZEU1RBRERSCTB4ODkxOAkJLyogc2V0IHJlbW90ZSBQQSBhZGRyZXNzCSovCisjZGVmaW5lIFNJT0NHSUZCUkRBRERSCTB4ODkxOQkJLyogZ2V0IGJyb2FkY2FzdCBQQSBhZGRyZXNzCSovCisjZGVmaW5lIFNJT0NTSUZCUkRBRERSCTB4ODkxYQkJLyogc2V0IGJyb2FkY2FzdCBQQSBhZGRyZXNzCSovCisjZGVmaW5lIFNJT0NHSUZORVRNQVNLCTB4ODkxYgkJLyogZ2V0IG5ldHdvcmsgUEEgbWFzawkJKi8KKyNkZWZpbmUgU0lPQ1NJRk5FVE1BU0sJMHg4OTFjCQkvKiBzZXQgbmV0d29yayBQQSBtYXNrCQkqLworI2RlZmluZSBTSU9DR0lGTUVUUklDCTB4ODkxZAkJLyogZ2V0IG1ldHJpYwkJCSovCisjZGVmaW5lIFNJT0NTSUZNRVRSSUMJMHg4OTFlCQkvKiBzZXQgbWV0cmljCQkJKi8KKyNkZWZpbmUgU0lPQ0dJRk1FTQkweDg5MWYJCS8qIGdldCBtZW1vcnkgYWRkcmVzcyAoQlNEKQkqLworI2RlZmluZSBTSU9DU0lGTUVNCTB4ODkyMAkJLyogc2V0IG1lbW9yeSBhZGRyZXNzIChCU0QpCSovCisjZGVmaW5lIFNJT0NHSUZNVFUJMHg4OTIxCQkvKiBnZXQgTVRVIHNpemUJCQkqLworI2RlZmluZSBTSU9DU0lGTVRVCTB4ODkyMgkJLyogc2V0IE1UVSBzaXplCQkJKi8KKyNkZWZpbmUgU0lPQ1NJRk5BTUUJMHg4OTIzCQkvKiBzZXQgaW50ZXJmYWNlIG5hbWUJCSovCisjZGVmaW5lCVNJT0NTSUZIV0FERFIJMHg4OTI0CQkvKiBzZXQgaGFyZHdhcmUgYWRkcmVzcyAJKi8KKyNkZWZpbmUgU0lPQ0dJRkVOQ0FQCTB4ODkyNQkJLyogZ2V0L3NldCBlbmNhcHN1bGF0aW9ucyAgICAgICAqLworI2RlZmluZSBTSU9DU0lGRU5DQVAJMHg4OTI2CisjZGVmaW5lIFNJT0NHSUZIV0FERFIJMHg4OTI3CQkvKiBHZXQgaGFyZHdhcmUgYWRkcmVzcwkJKi8KKyNkZWZpbmUgU0lPQ0dJRlNMQVZFCTB4ODkyOQkJLyogRHJpdmVyIHNsYXZpbmcgc3VwcG9ydAkqLworI2RlZmluZSBTSU9DU0lGU0xBVkUJMHg4OTMwCisjZGVmaW5lIFNJT0NBRERNVUxUSQkweDg5MzEJCS8qIE11bHRpY2FzdCBhZGRyZXNzIGxpc3RzCSovCisjZGVmaW5lIFNJT0NERUxNVUxUSQkweDg5MzIKKyNkZWZpbmUgU0lPQ0dJRklOREVYCTB4ODkzMwkJLyogbmFtZSAtPiBpZl9pbmRleCBtYXBwaW5nCSovCisjZGVmaW5lIFNJT0dJRklOREVYCVNJT0NHSUZJTkRFWAkvKiBtaXNwcmludCBjb21wYXRpYmlsaXR5IDotKQkqLworI2RlZmluZSBTSU9DU0lGUEZMQUdTCTB4ODkzNAkJLyogc2V0L2dldCBleHRlbmRlZCBmbGFncyBzZXQJKi8KKyNkZWZpbmUgU0lPQ0dJRlBGTEFHUwkweDg5MzUKKyNkZWZpbmUgU0lPQ0RJRkFERFIJMHg4OTM2CQkvKiBkZWxldGUgUEEgYWRkcmVzcwkJKi8KKyNkZWZpbmUJU0lPQ1NJRkhXQlJPQURDQVNUCTB4ODkzNwkvKiBzZXQgaGFyZHdhcmUgYnJvYWRjYXN0IGFkZHIJKi8KKyNkZWZpbmUgU0lPQ0dJRkNPVU5UCTB4ODkzOAkJLyogZ2V0IG51bWJlciBvZiBkZXZpY2VzICovCisKKyNkZWZpbmUgU0lPQ0dJRkJSCTB4ODk0MAkJLyogQnJpZGdpbmcgc3VwcG9ydAkJKi8KKyNkZWZpbmUgU0lPQ1NJRkJSCTB4ODk0MQkJLyogU2V0IGJyaWRnaW5nIG9wdGlvbnMgCSovCisKKyNkZWZpbmUgU0lPQ0dJRlRYUUxFTgkweDg5NDIJCS8qIEdldCB0aGUgdHggcXVldWUgbGVuZ3RoCSovCisjZGVmaW5lIFNJT0NTSUZUWFFMRU4JMHg4OTQzCQkvKiBTZXQgdGhlIHR4IHF1ZXVlIGxlbmd0aCAJKi8KKworCisvKiBBUlAgY2FjaGUgY29udHJvbCBjYWxscy4gKi8KKwkJICAgIC8qICAweDg5NTAgLSAweDg5NTIgICogb2Jzb2xldGUgY2FsbHMsIGRvbid0IHJlLXVzZSAqLworI2RlZmluZSBTSU9DREFSUAkweDg5NTMJCS8qIGRlbGV0ZSBBUlAgdGFibGUgZW50cnkJKi8KKyNkZWZpbmUgU0lPQ0dBUlAJMHg4OTU0CQkvKiBnZXQgQVJQIHRhYmxlIGVudHJ5CQkqLworI2RlZmluZSBTSU9DU0FSUAkweDg5NTUJCS8qIHNldCBBUlAgdGFibGUgZW50cnkJCSovCisKKy8qIFJBUlAgY2FjaGUgY29udHJvbCBjYWxscy4gKi8KKyNkZWZpbmUgU0lPQ0RSQVJQCTB4ODk2MAkJLyogZGVsZXRlIFJBUlAgdGFibGUgZW50cnkJKi8KKyNkZWZpbmUgU0lPQ0dSQVJQCTB4ODk2MQkJLyogZ2V0IFJBUlAgdGFibGUgZW50cnkJCSovCisjZGVmaW5lIFNJT0NTUkFSUAkweDg5NjIJCS8qIHNldCBSQVJQIHRhYmxlIGVudHJ5CQkqLworCisvKiBEcml2ZXIgY29uZmlndXJhdGlvbiBjYWxscyAqLworCisjZGVmaW5lIFNJT0NHSUZNQVAJMHg4OTcwCQkvKiBHZXQgZGV2aWNlIHBhcmFtZXRlcnMJKi8KKyNkZWZpbmUgU0lPQ1NJRk1BUAkweDg5NzEJCS8qIFNldCBkZXZpY2UgcGFyYW1ldGVycwkqLworCisvKiBETENJIGNvbmZpZ3VyYXRpb24gY2FsbHMgKi8KKworI2RlZmluZSBTSU9DQURERExDSQkweDg5ODAJCS8qIENyZWF0ZSBuZXcgRExDSSBkZXZpY2UJKi8KKyNkZWZpbmUgU0lPQ0RFTERMQ0kJMHg4OTgxCQkvKiBEZWxldGUgRExDSSBkZXZpY2UJCSovCisKKy8qIERldmljZSBwcml2YXRlIGlvY3RsIGNhbGxzLiAgKi8KKworLyogVGhlc2UgMTYgaW9jdGxzIGFyZSBhdmFpbGFibGUgdG8gZGV2aWNlcyB2aWEgdGhlIGRvX2lvY3RsKCkgZGV2aWNlCisgICB2ZWN0b3IuICBFYWNoIGRldmljZSBzaG91bGQgaW5jbHVkZSB0aGlzIGZpbGUgYW5kIHJlZGVmaW5lIHRoZXNlCisgICBuYW1lcyBhcyB0aGVpciBvd24uIEJlY2F1c2UgdGhlc2UgYXJlIGRldmljZSBkZXBlbmRlbnQgaXQgaXMgYSBnb29kCisgICBpZGVhIF9OT1RfIHRvIGlzc3VlIHRoZW0gdG8gcmFuZG9tIG9iamVjdHMgYW5kIGhvcGUuICAqLworCisjZGVmaW5lIFNJT0NERVZQUklWQVRFIAkJMHg4OUYwCS8qIHRvIDg5RkYgKi8KKworLyoKKyAqCVRoZXNlIDE2IGlvY3RsIGNhbGxzIGFyZSBwcm90b2NvbCBwcml2YXRlCisgKi8KKworI2RlZmluZSBTSU9DUFJPVE9QUklWQVRFIDB4ODlFMCAvKiB0byA4OUVGICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9pcGMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2lwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYTA0M2YKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9pcGMuaApAQCAtMCwwICsxLDU2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX0lQQ19ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvaXBjLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzeXMvaXBjLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKy8qIE1vZGUgYml0cyBmb3IgYG1zZ2dldCcsIGBzZW1nZXQnLCBhbmQgYHNobWdldCcuICAqLworI2RlZmluZSBJUENfQ1JFQVQJMDEwMDAJCS8qIENyZWF0ZSBrZXkgaWYga2V5IGRvZXMgbm90IGV4aXN0LiAqLworI2RlZmluZSBJUENfRVhDTAkwMjAwMAkJLyogRmFpbCBpZiBrZXkgZXhpc3RzLiAgKi8KKyNkZWZpbmUgSVBDX05PV0FJVAkwNDAwMAkJLyogUmV0dXJuIGVycm9yIG9uIHdhaXQuICAqLworCisvKiBDb250cm9sIGNvbW1hbmRzIGZvciBgbXNnY3RsJywgYHNlbWN0bCcsIGFuZCBgc2htY3RsJy4gICovCisjZGVmaW5lIElQQ19STUlECTAJCS8qIFJlbW92ZSBpZGVudGlmaWVyLiAgKi8KKyNkZWZpbmUgSVBDX1NFVAkJMQkJLyogU2V0IGBpcGNfcGVybScgb3B0aW9ucy4gICovCisjZGVmaW5lIElQQ19TVEFUCTIJCS8qIEdldCBgaXBjX3Blcm0nIG9wdGlvbnMuICAqLworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgSVBDX0lORk8JMwkJLyogU2VlIGlwY3MuICAqLworI2VuZGlmCisKKy8qIFNwZWNpYWwga2V5IHZhbHVlcy4gICovCisjZGVmaW5lIElQQ19QUklWQVRFCSgoX19rZXlfdCkgMCkJLyogUHJpdmF0ZSBrZXkuICAqLworCisKKy8qIERhdGEgc3RydWN0dXJlIHVzZWQgdG8gcGFzcyBwZXJtaXNzaW9uIGluZm9ybWF0aW9uIHRvIElQQyBvcGVyYXRpb25zLiAgKi8KK3N0cnVjdCBpcGNfcGVybQorICB7CisgICAgX19rZXlfdCBfX2tleTsJCQkvKiBLZXkuICAqLworICAgIF9fdWlkX3QgdWlkOwkJCS8qIE93bmVyJ3MgdXNlciBJRC4gICovCisgICAgX19naWRfdCBnaWQ7CQkJLyogT3duZXIncyBncm91cCBJRC4gICovCisgICAgX191aWRfdCBjdWlkOwkJCS8qIENyZWF0b3IncyB1c2VyIElELiAgKi8KKyAgICBfX2dpZF90IGNnaWQ7CQkJLyogQ3JlYXRvcidzIGdyb3VwIElELiAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgbW9kZTsJCS8qIFJlYWQvd3JpdGUgcGVybWlzc2lvbi4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fcGFkMTsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX19zZXE7CQkvKiBTZXF1ZW5jZSBudW1iZXIuICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3BhZDI7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQxOworICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMjsKKyAgfTsKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2lwY3R5cGVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9pcGN0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OGNhMWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9pcGN0eXBlcy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIGJpdHMvaXBjdHlwZXMuaCAtLSBEZWZpbmUgc29tZSB0eXBlcyB1c2VkIGJ5IFN5c1YgSVBDL01TRy9TSE0uICBHZW5lcmljLgorICAgQ29weXJpZ2h0IChDKSAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICogTmV2ZXIgaW5jbHVkZSA8Yml0cy9pcGN0eXBlcy5oPiBkaXJlY3RseS4KKyAqLworCisjaWZuZGVmIF9CSVRTX0lQQ1RZUEVTX0gKKyNkZWZpbmUgX0JJVFNfSVBDVFlQRVNfSAkxCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKy8qIFVzZWQgaW4gYHN0cnVjdCBzaG1pZF9kcycuICAqLworIyBpZiBfX1dPUkRTSVpFID09IDMyCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBfX2lwY19waWRfdDsKKyMgZWxzZQordHlwZWRlZiBpbnQgX19pcGNfcGlkX3Q7CisjIGVuZGlmCisKKworI2VuZGlmIC8qIGJpdHMvaXBjdHlwZXMuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbGliYy1sb2NrLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9saWJjLWxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzhmOTU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbGliYy1sb2NrLmgKQEAgLTAsMCArMSw2NTkgQEAKKy8qIGxpYmMtaW50ZXJuYWwgaW50ZXJmYWNlIGZvciBtdXRleCBsb2Nrcy4gIE5QVEwgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDAzLCAyMDA1LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCisgICB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgX0JJVFNfTElCQ19MT0NLX0gKKyNkZWZpbmUgX0JJVFNfTElCQ19MT0NLX0ggMQorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2RlZmluZSBfX25lZWRfTlVMTAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisKKy8qIEZvcnR1bmF0ZWx5IExpbnV4IG5vdyBoYXMgYSBtZWFuIHRvIGRvIGxvY2tpbmcgd2hpY2ggaXMgcmVhbHRpbWUKKyAgIHNhZmUgd2l0aG91dCB0aGUgYWlkIG9mIHRoZSB0aHJlYWQgbGlicmFyeS4gIFdlIGFsc28gbmVlZCBubyBmYW5jeQorICAgb3B0aW9ucyBsaWtlIGVycm9yIGNoZWNraW5nIG11dGV4ZXMgZXRjLiAgV2Ugb25seSBuZWVkIHNpbXBsZQorICAgbG9ja3MsIG1heWJlIHJlY3Vyc2l2ZS4gIFRoaXMgY2FuIGJlIGVhc2lseSBhbmQgY2hlYXBseSBpbXBsZW1lbnRlZAorICAgdXNpbmcgZnV0ZXhlcy4gIFdlIHdpbGwgdXNlIHRoZW0gZXZlcnl3aGVyZSBleGNlcHQgaW4gbGQuc28gc2luY2UKKyAgIGxkLnNvIG1pZ2h0IGJlIHVzZWQgb24gb2xkIGtlcm5lbHMgd2l0aCBhIGRpZmZlcmVudCBsaWJjLnNvLiAgKi8KKyNpZmRlZiBfTElCQworIyBpbmNsdWRlIDxsb3dsZXZlbGxvY2suaD4KKyMgaW5jbHVkZSA8dGxzLmg+CisjIGluY2x1ZGUgPHB0aHJlYWQtZnVuY3Rpb25zLmg+CisjIGluY2x1ZGUgPGVycm5vLmg+IC8qIEZvciBFQlVTWS4gICovCisjIGluY2x1ZGUgPGdudS9vcHRpb24tZ3JvdXBzLmg+IC8qIEZvciBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUy4gICovCisjZW5kaWYKKworLyogTXV0ZXggdHlwZS4gICovCisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIF9JT19NVFNBRkVfSU8KKyMgaWYgKGRlZmluZWQgTk9UX0lOX2xpYmMgJiYgIWRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkgfHwgIWRlZmluZWQgX0xJQkMKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90IF9fbGliY19sb2NrX3Q7Cit0eXBlZGVmIHN0cnVjdCB7IHB0aHJlYWRfbXV0ZXhfdCBtdXRleDsgfSBfX2xpYmNfbG9ja19yZWN1cnNpdmVfdDsKKyMgZWxzZQordHlwZWRlZiBpbnQgX19saWJjX2xvY2tfdDsKK3R5cGVkZWYgc3RydWN0IHsgaW50IGxvY2s7IGludCBjbnQ7IHZvaWQgKm93bmVyOyB9IF9fbGliY19sb2NrX3JlY3Vyc2l2ZV90OworIyBlbmRpZgordHlwZWRlZiBzdHJ1Y3QgeyBwdGhyZWFkX211dGV4X3QgbXV0ZXg7IH0gX19ydGxkX2xvY2tfcmVjdXJzaXZlX3Q7CisjIGlmZGVmIF9fVVNFX1VOSVg5OAordHlwZWRlZiBwdGhyZWFkX3J3bG9ja190IF9fbGliY19yd2xvY2tfdDsKKyMgZWxzZQordHlwZWRlZiBzdHJ1Y3QgX19saWJjX3J3bG9ja19vcGFxdWVfXyBfX2xpYmNfcndsb2NrX3Q7CisjIGVuZGlmCisjZWxzZQordHlwZWRlZiBzdHJ1Y3QgX19saWJjX2xvY2tfb3BhcXVlX18gX19saWJjX2xvY2tfdDsKK3R5cGVkZWYgc3RydWN0IF9fbGliY19sb2NrX3JlY3Vyc2l2ZV9vcGFxdWVfXyBfX2xpYmNfbG9ja19yZWN1cnNpdmVfdDsKK3R5cGVkZWYgc3RydWN0IF9fbGliY19yd2xvY2tfb3BhcXVlX18gX19saWJjX3J3bG9ja190OworI2VuZGlmCisKKy8qIFR5cGUgZm9yIGtleSB0byB0aHJlYWQtc3BlY2lmaWMgZGF0YS4gICovCit0eXBlZGVmIHB0aHJlYWRfa2V5X3QgX19saWJjX2tleV90OworCisvKiBEZWZpbmUgYSBsb2NrIHZhcmlhYmxlIE5BTUUgd2l0aCBzdG9yYWdlIGNsYXNzIENMQVNTLiAgVGhlIGxvY2sgbXVzdCBiZQorICAgaW5pdGlhbGl6ZWQgd2l0aCBfX2xpYmNfbG9ja19pbml0IGJlZm9yZSBpdCBjYW4gYmUgdXNlZCAob3IgZGVmaW5lIGl0CisgICB3aXRoIF9fbGliY19sb2NrX2RlZmluZV9pbml0aWFsaXplZCwgYmVsb3cpLiAgVXNlIGBleHRlcm4nIGZvciBDTEFTUyB0bworICAgZGVjbGFyZSBhIGxvY2sgZGVmaW5lZCBpbiBhbm90aGVyIG1vZHVsZS4gIEluIHB1YmxpYyBzdHJ1Y3R1cmUKKyAgIGRlZmluaXRpb25zIHlvdSBtdXN0IHVzZSBhIHBvaW50ZXIgdG8gdGhlIGxvY2sgc3RydWN0dXJlIChpLmUuLCBOQU1FCisgICBiZWdpbnMgd2l0aCBhIGAqJyksIGJlY2F1c2UgaXRzIHN0b3JhZ2Ugc2l6ZSB3aWxsIG5vdCBiZSBrbm93biBvdXRzaWRlCisgICBvZiBsaWJjLiAgKi8KKyNkZWZpbmUgX19saWJjX2xvY2tfZGVmaW5lKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX2xvY2tfdCBOQU1FOworI2RlZmluZSBfX2xpYmNfcndsb2NrX2RlZmluZShDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fbGliY19yd2xvY2tfdCBOQU1FOworI2RlZmluZSBfX2xpYmNfbG9ja19kZWZpbmVfcmVjdXJzaXZlKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX2xvY2tfcmVjdXJzaXZlX3QgTkFNRTsKKyNkZWZpbmUgX19ydGxkX2xvY2tfZGVmaW5lX3JlY3Vyc2l2ZShDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fcnRsZF9sb2NrX3JlY3Vyc2l2ZV90IE5BTUU7CisKKy8qIERlZmluZSBhbiBpbml0aWFsaXplZCBsb2NrIHZhcmlhYmxlIE5BTUUgd2l0aCBzdG9yYWdlIGNsYXNzIENMQVNTLgorCisgICBGb3IgdGhlIEMgbGlicmFyeSB3ZSB0YWtlIGEgZGVlcGVyIGxvb2sgYXQgdGhlIGluaXRpYWxpemVyLiAgRm9yCisgICB0aGlzIGltcGxlbWVudGF0aW9uIGFsbCBmaWVsZHMgYXJlIGluaXRpYWxpemVkIHRvIHplcm8uICBUaGVyZWZvcmUKKyAgIHdlIGRvbid0IGluaXRpYWxpemUgdGhlIHZhcmlhYmxlIHdoaWNoIGFsbG93cyBwdXR0aW5nIGl0IGludG8gdGhlCisgICBCU1Mgc2VjdGlvbi4gIChFeGNlcHQgb24gUEEtUklTQyBhbmQgb3RoZXIgb2RkIGFyY2hpdGVjdHVyZXMsIHdoZXJlCisgICBpbml0aWFsaXplZCBsb2NrcyBtdXN0IGJlIHNldCB0byBvbmUgZHVlIHRvIHRoZSBsYWNrIG9mIG5vcm1hbAorICAgYXRvbWljIG9wZXJhdGlvbnMuKSAqLworCisjaWYgZGVmaW5lZCBfTElCQyAmJiAoIWRlZmluZWQgTk9UX0lOX2xpYmMgfHwgZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKQorIyBpZiBMTExfTE9DS19JTklUSUFMSVpFUiA9PSAwCisjICBkZWZpbmUgX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX2xvY2tfdCBOQU1FOworIyBlbHNlCisjICBkZWZpbmUgX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX2xvY2tfdCBOQU1FID0gTExMX0xPQ0tfSU5JVElBTElaRVI7CisjIGVuZGlmCisjZWxzZQorIyBpZiBfX0xUX1NQSU5MT0NLX0lOSVQgPT0gMAorIyAgZGVmaW5lIF9fbGliY19sb2NrX2RlZmluZV9pbml0aWFsaXplZChDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fbGliY19sb2NrX3QgTkFNRTsKKyMgZWxzZQorIyAgZGVmaW5lIF9fbGliY19sb2NrX2RlZmluZV9pbml0aWFsaXplZChDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fbGliY19sb2NrX3QgTkFNRSA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisjIGVuZGlmCisjZW5kaWYKKworI2RlZmluZSBfX2xpYmNfcndsb2NrX2RlZmluZV9pbml0aWFsaXplZChDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fbGliY19yd2xvY2tfdCBOQU1FID0gUFRIUkVBRF9SV0xPQ0tfSU5JVElBTElaRVI7CisKKy8qIERlZmluZSBhbiBpbml0aWFsaXplZCByZWN1cnNpdmUgbG9jayB2YXJpYWJsZSBOQU1FIHdpdGggc3RvcmFnZQorICAgY2xhc3MgQ0xBU1MuICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgaWYgTExMX0xPQ0tfSU5JVElBTElaRVIgPT0gMAorIyAgZGVmaW5lIF9fbGliY19sb2NrX2RlZmluZV9pbml0aWFsaXplZF9yZWN1cnNpdmUoQ0xBU1MsTkFNRSkgXAorICBDTEFTUyBfX2xpYmNfbG9ja19yZWN1cnNpdmVfdCBOQU1FOworIyBlbHNlCisjICBkZWZpbmUgX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkX3JlY3Vyc2l2ZShDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fbGliY19sb2NrX3JlY3Vyc2l2ZV90IE5BTUUgPSBfTElCQ19MT0NLX1JFQ1VSU0lWRV9JTklUSUFMSVpFUjsKKyMgZW5kaWYKKyMgZGVmaW5lIF9MSUJDX0xPQ0tfUkVDVVJTSVZFX0lOSVRJQUxJWkVSIFwKKyAgeyBMTExfTE9DS19JTklUSUFMSVpFUiwgMCwgTlVMTCB9CisjZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkX3JlY3Vyc2l2ZShDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fbGliY19sb2NrX3JlY3Vyc2l2ZV90IE5BTUUgPSBfTElCQ19MT0NLX1JFQ1VSU0lWRV9JTklUSUFMSVpFUjsKKyMgZGVmaW5lIF9MSUJDX0xPQ0tfUkVDVVJTSVZFX0lOSVRJQUxJWkVSIFwKKyAge1BUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QfQorI2VuZGlmCisKKyNkZWZpbmUgX19ydGxkX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkX3JlY3Vyc2l2ZShDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fcnRsZF9sb2NrX3JlY3Vyc2l2ZV90IE5BTUUgPSBfUlRMRF9MT0NLX1JFQ1VSU0lWRV9JTklUSUFMSVpFUjsKKyNkZWZpbmUgX1JUTERfTE9DS19SRUNVUlNJVkVfSU5JVElBTElaRVIgXAorICB7UFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlB9CisKKyNkZWZpbmUgX19ydGxkX2xvY2tfaW5pdGlhbGl6ZShOQU1FKSBcCisgICh2b2lkKSAoKE5BTUUpID0gKF9fcnRsZF9sb2NrX3JlY3Vyc2l2ZV90KSBfUlRMRF9MT0NLX1JFQ1VSU0lWRV9JTklUSUFMSVpFUikKKworLyogSWYgd2UgY2hlY2sgZm9yIGEgd2Vha2x5IHJlZmVyZW5jZWQgc3ltYm9sIGFuZCB0aGVuIHBlcmZvcm0gYQorICAgbm9ybWFsIGp1bXAgdG8gaXQgdGUgY29kZSBnZW5lcmF0ZWQgZm9yIHNvbWUgcGxhdGZvcm1zIGluIGNhc2Ugb2YKKyAgIFBJQyBpcyB1bm5lY2Vzc2FyaWx5IHNsb3cuICBXaGF0IHdvdWxkIGhhcHBlbiBpcyB0aGF0IHRoZSBmdW5jdGlvbgorICAgaXMgZmlyc3QgcmVmZXJlbmNlZCBhcyBkYXRhIGFuZCB0aGVuIGl0IGlzIGNhbGxlZCBpbmRpcmVjdGx5CisgICB0aHJvdWdoIHRoZSBQTFQuICBXZSBjYW4gbWFrZSB0aGlzIGEgZGlyZWN0IGp1bXAuICAqLworI2lmZGVmIF9fUElDX18KKyMgZGVmaW5lIF9fbGliY19tYXliZV9jYWxsKEZVTkMsIEFSR1MsIEVMU0UpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgX190eXBlb2YgKEZVTkMpICpfZm4gPSAoRlVOQyk7IFwKKyAgICAgICAgICAgICAgICAgICAgX2ZuICE9IE5VTEwgPyAoKl9mbikgQVJHUyA6IEVMU0U7IH0pKQorI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19tYXliZV9jYWxsKEZVTkMsIEFSR1MsIEVMU0UpIFwKKyAgKEZVTkMgIT0gTlVMTCA/IEZVTkMgQVJHUyA6IEVMU0UpCisjZW5kaWYKKworLyogQ2FsbCB0aHJlYWQgZnVuY3Rpb25zIHRocm91Z2ggdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdGFibGUuICAqLworI2lmIGRlZmluZWQgU0hBUkVEICYmICFkZWZpbmVkIE5PVF9JTl9saWJjCisjIGRlZmluZSBQVEZBVkFJTChOQU1FKSBfX2xpYmNfcHRocmVhZF9mdW5jdGlvbnNfaW5pdAorIyBkZWZpbmUgX19saWJjX3B0Zl9jYWxsKEZVTkMsIEFSR1MsIEVMU0UpIFwKKyAgKF9fbGliY19wdGhyZWFkX2Z1bmN0aW9uc19pbml0ID8gUFRIRkNUX0NBTEwgKHB0cl8jI0ZVTkMsIEFSR1MpIDogRUxTRSkKKyMgZGVmaW5lIF9fbGliY19wdGZfY2FsbF9hbHdheXMoRlVOQywgQVJHUykgXAorICBQVEhGQ1RfQ0FMTCAocHRyXyMjRlVOQywgQVJHUykKKyNlbHNlCisjIGRlZmluZSBQVEZBVkFJTChOQU1FKSAoTkFNRSAhPSBOVUxMKQorIyBkZWZpbmUgX19saWJjX3B0Zl9jYWxsKEZVTkMsIEFSR1MsIEVMU0UpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKEZVTkMsIEFSR1MsIEVMU0UpCisjIGRlZmluZSBfX2xpYmNfcHRmX2NhbGxfYWx3YXlzKEZVTkMsIEFSR1MpIFwKKyAgRlVOQyBBUkdTCisjZW5kaWYKKworCisvKiBJbml0aWFsaXplIHRoZSBuYW1lZCBsb2NrIHZhcmlhYmxlLCBsZWF2aW5nIGl0IGluIGEgY29uc2lzdGVudCwgdW5sb2NrZWQKKyAgIHN0YXRlLiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDICYmICghZGVmaW5lZCBOT1RfSU5fbGliYyB8fCBkZWZpbmVkIElTX0lOX2xpYnB0aHJlYWQpCisjIGRlZmluZSBfX2xpYmNfbG9ja19pbml0KE5BTUUpICgoTkFNRSkgPSBMTExfTE9DS19JTklUSUFMSVpFUiwgMCkKKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja19pbml0KE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF9pbml0LCAoJihOQU1FKSwgTlVMTCksIDApCisjZW5kaWYKKyNpZiBkZWZpbmVkIFNIQVJFRCAmJiAhZGVmaW5lZCBOT1RfSU5fbGliYworLyogKChOQU1FKSA9IChfX2xpYmNfcndsb2NrX3QpIFBUSFJFQURfUldMT0NLX0lOSVRJQUxJWkVSLCAwKSBpcworICAgaW5lZmZpY2llbnQuICAqLworIyBkZWZpbmUgX19saWJjX3J3bG9ja19pbml0KE5BTUUpIFwKKyAgKF9fYnVpbHRpbl9tZW1zZXQgKCYoTkFNRSksICdcMCcsIHNpemVvZiAoTkFNRSkpLCAwKQorI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfaW5pdChOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfcndsb2NrX2luaXQsICgmKE5BTUUpLCBOVUxMKSwgMCkKKyNlbmRpZgorCisvKiBTYW1lIGFzIGxhc3QgYnV0IHRoaXMgdGltZSB3ZSBpbml0aWFsaXplIGEgcmVjdXJzaXZlIG11dGV4LiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDICYmICghZGVmaW5lZCBOT1RfSU5fbGliYyB8fCBkZWZpbmVkIElTX0lOX2xpYnB0aHJlYWQpCisjIGRlZmluZSBfX2xpYmNfbG9ja19pbml0X3JlY3Vyc2l2ZShOQU1FKSBcCisgICgoTkFNRSkgPSAoX19saWJjX2xvY2tfcmVjdXJzaXZlX3QpIF9MSUJDX0xPQ0tfUkVDVVJTSVZFX0lOSVRJQUxJWkVSLCAwKQorI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX2luaXRfcmVjdXJzaXZlKE5BTUUpIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBpZiAoX19wdGhyZWFkX211dGV4X2luaXQgIT0gTlVMTCkJCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisJcHRocmVhZF9tdXRleGF0dHJfdCBfX2F0dHI7CQkJCQkgICAgICBcCisJX19wdGhyZWFkX211dGV4YXR0cl9pbml0ICgmX19hdHRyKTsJCQkJICAgICAgXAorCV9fcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSAoJl9fYXR0ciwgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlApOyAgICBcCisJX19wdGhyZWFkX211dGV4X2luaXQgKCYoTkFNRSkubXV0ZXgsICZfX2F0dHIpOwkJCSAgICAgIFwKKwlfX3B0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kgKCZfX2F0dHIpOwkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUgX19ydGxkX2xvY2tfaW5pdF9yZWN1cnNpdmUoTkFNRSkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIGlmIChfX3B0aHJlYWRfbXV0ZXhfaW5pdCAhPSBOVUxMKQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKwlwdGhyZWFkX211dGV4YXR0cl90IF9fYXR0cjsJCQkJCSAgICAgIFwKKwlfX3B0aHJlYWRfbXV0ZXhhdHRyX2luaXQgKCZfX2F0dHIpOwkJCQkgICAgICBcCisJX19wdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlICgmX19hdHRyLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUCk7ICAgIFwKKwlfX3B0aHJlYWRfbXV0ZXhfaW5pdCAoJihOQU1FKS5tdXRleCwgJl9fYXR0cik7CQkJICAgICAgXAorCV9fcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSAoJl9fYXR0cik7CQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKy8qIEZpbmFsaXplIHRoZSBuYW1lZCBsb2NrIHZhcmlhYmxlLCB3aGljaCBtdXN0IGJlIGxvY2tlZC4gIEl0IGNhbm5vdCBiZQorICAgdXNlZCBhZ2FpbiB1bnRpbCBfX2xpYmNfbG9ja19pbml0IGlzIGNhbGxlZCBhZ2FpbiBvbiBpdC4gIFRoaXMgbXVzdCBiZQorICAgY2FsbGVkIG9uIGEgbG9jayB2YXJpYWJsZSBiZWZvcmUgdGhlIGNvbnRhaW5pbmcgc3RvcmFnZSBpcyByZXVzZWQuICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgZGVmaW5lIF9fbGliY19sb2NrX2ZpbmkoTkFNRSkgKCh2b2lkKSAwKQorI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX2ZpbmkoTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX211dGV4X2Rlc3Ryb3ksICgmKE5BTUUpKSwgMCkKKyNlbmRpZgorI2lmIGRlZmluZWQgU0hBUkVEICYmICFkZWZpbmVkIE5PVF9JTl9saWJjCisjIGRlZmluZSBfX2xpYmNfcndsb2NrX2ZpbmkoTkFNRSkgKCh2b2lkKSAwKQorI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfZmluaShOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfcndsb2NrX2Rlc3Ryb3ksICgmKE5BTUUpKSwgMCkKKyNlbmRpZgorCisvKiBGaW5hbGl6ZSByZWN1cnNpdmUgbmFtZWQgbG9jay4gICovCisjaWYgZGVmaW5lZCBfTElCQyAmJiAoIWRlZmluZWQgTk9UX0lOX2xpYmMgfHwgZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKQorIyBkZWZpbmUgX19saWJjX2xvY2tfZmluaV9yZWN1cnNpdmUoTkFNRSkgKCh2b2lkKSAwKQorI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX2ZpbmlfcmVjdXJzaXZlKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF9kZXN0cm95LCAoJihOQU1FKSksIDApCisjZW5kaWYKKworLyogTG9jayB0aGUgbmFtZWQgbG9jayB2YXJpYWJsZS4gICovCisjaWYgZGVmaW5lZCBfTElCQyAmJiAoIWRlZmluZWQgTk9UX0lOX2xpYmMgfHwgZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKQorIyBpZiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAhPSAxCisvKiBFR0xJQkM6IERlY2xhcmUgd3JhcHBlciBmdW5jdGlvbiBmb3IgYSBiaWcgbWFjcm8gaWYgZWl0aGVyCisgICAhX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1Mgb3Igd2UgYXJlIHVzaW5nIGEgYmFjayBkb29yIGZyb20KKyAgIHNtYWxsLW1hY3Jvcy1mbnMuYyAoX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgPT0gMikuICAqLworZXh0ZXJuIHZvaWQgX19saWJjX2xvY2tfbG9ja19mbiAoX19saWJjX2xvY2tfdCAqKTsKK2xpYmNfaGlkZGVuX3Byb3RvIChfX2xpYmNfbG9ja19sb2NrX2ZuKTsKKyMgZW5kaWYgLyogX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgIT0gMSAqLworIyBpZiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUworIyBkZWZpbmUgX19saWJjX2xvY2tfbG9jayhOQU1FKSBcCisgICh7IGxsbF9sb2NrIChOQU1FLCBMTExfUFJJVkFURSk7IDA7IH0pCisjIGVsc2UKKyMgIGRlZmluZSBfX2xpYmNfbG9ja19sb2NrKE5BTUUpCQlcCisgIF9fbGliY19sb2NrX2xvY2tfZm4gKCYoTkFNRSkpCisjIGVuZGlmIC8qIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICovCisjZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfbG9jayhOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfbXV0ZXhfbG9jaywgKCYoTkFNRSkpLCAwKQorI2VuZGlmCisjZGVmaW5lIF9fbGliY19yd2xvY2tfcmRsb2NrKE5BTUUpIFwKKyAgX19saWJjX3B0Zl9jYWxsIChfX3B0aHJlYWRfcndsb2NrX3JkbG9jaywgKCYoTkFNRSkpLCAwKQorI2RlZmluZSBfX2xpYmNfcndsb2NrX3dybG9jayhOQU1FKSBcCisgIF9fbGliY19wdGZfY2FsbCAoX19wdGhyZWFkX3J3bG9ja193cmxvY2ssICgmKE5BTUUpKSwgMCkKKworLyogTG9jayB0aGUgcmVjdXJzaXZlIG5hbWVkIGxvY2sgdmFyaWFibGUuICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgaWYgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgIT0gMQorLyogRUdMSUJDOiBEZWNsYXJlIHdyYXBwZXIgZnVuY3Rpb24gZm9yIGEgYmlnIG1hY3JvIGlmIGVpdGhlcgorICAgIV9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TIG9yIHdlIGFyZSB1c2luZyBhIGJhY2sgZG9vciBmcm9tCisgICBzbWFsbC1tYWNyb3MtZm5zLmMgKF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TID09IDIpLiAgKi8KK2V4dGVybiB2b2lkIF9fbGliY19sb2NrX2xvY2tfcmVjdXJzaXZlX2ZuIChfX2xpYmNfbG9ja19yZWN1cnNpdmVfdCAqKTsKK2xpYmNfaGlkZGVuX3Byb3RvIChfX2xpYmNfbG9ja19sb2NrX3JlY3Vyc2l2ZV9mbik7CisjIGVuZGlmIC8qIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICE9IDEgKi8KKyMgaWYgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MKKyMgZGVmaW5lIF9fbGliY19sb2NrX2xvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICB2b2lkICpzZWxmID0gVEhSRUFEX1NFTEY7CQkJCQkJICAgICAgXAorICAgIGlmICgoTkFNRSkub3duZXIgIT0gc2VsZikJCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorCWxsbF9sb2NrICgoTkFNRSkubG9jaywgTExMX1BSSVZBVEUpOwkJCQkgICAgICBcCisJKE5BTUUpLm93bmVyID0gc2VsZjsJCQkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICAgICsrKE5BTUUpLmNudDsJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorIyBlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja19sb2NrX3JlY3Vyc2l2ZShOQU1FKQkJCQlcCisgIF9fbGliY19sb2NrX2xvY2tfcmVjdXJzaXZlX2ZuICgmKE5BTUUpKQorIyBlbmRpZiAvKiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAqLworI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX2xvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF9sb2NrLCAoJihOQU1FKS5tdXRleCksIDApCisjZW5kaWYKKworLyogVHJ5IHRvIGxvY2sgdGhlIG5hbWVkIGxvY2sgdmFyaWFibGUuICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgaWYgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgIT0gMQorLyogRUdMSUJDOiBEZWNsYXJlIHdyYXBwZXIgZnVuY3Rpb24gZm9yIGEgYmlnIG1hY3JvIGlmIGVpdGhlcgorICAgIV9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TIG9yIHdlIGFyZSB1c2luZyBhIGJhY2sgZG9vciBmcm9tCisgICBzbWFsbC1tYWNyb3MtZm5zLmMgKF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TID09IDIpLiAgKi8KK2V4dGVybiBpbnQgX19saWJjX2xvY2tfdHJ5bG9ja19mbiAoX19saWJjX2xvY2tfdCAqKTsKK2xpYmNfaGlkZGVuX3Byb3RvIChfX2xpYmNfbG9ja190cnlsb2NrX2ZuKTsKKyMgZW5kaWYgLyogX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgIT0gMSAqLworIyBpZiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUworIyBkZWZpbmUgX19saWJjX2xvY2tfdHJ5bG9jayhOQU1FKSBcCisgIGxsbF90cnlsb2NrIChOQU1FKQorIyBlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja190cnlsb2NrKE5BTUUpIFwKKyAgX19saWJjX2xvY2tfdHJ5bG9ja19mbiAoJihOQU1FKSkKKyMgZW5kaWYgLyogX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgKi8KKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja190cnlsb2NrKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF90cnlsb2NrLCAoJihOQU1FKSksIDApCisjZW5kaWYKKyNkZWZpbmUgX19saWJjX3J3bG9ja190cnlyZGxvY2soTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX3J3bG9ja190cnlyZGxvY2ssICgmKE5BTUUpKSwgMCkKKyNkZWZpbmUgX19saWJjX3J3bG9ja190cnl3cmxvY2soTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX3J3bG9ja190cnl3cmxvY2ssICgmKE5BTUUpKSwgMCkKKworLyogVHJ5IHRvIGxvY2sgdGhlIHJlY3Vyc2l2ZSBuYW1lZCBsb2NrIHZhcmlhYmxlLiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDICYmICghZGVmaW5lZCBOT1RfSU5fbGliYyB8fCBkZWZpbmVkIElTX0lOX2xpYnB0aHJlYWQpCisjIGlmIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICE9IDEKKy8qIEVHTElCQzogRGVjbGFyZSB3cmFwcGVyIGZ1bmN0aW9uIGZvciBhIGJpZyBtYWNybyBpZiBlaXRoZXIKKyAgICFfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyBvciB3ZSBhcmUgdXNpbmcgYSBiYWNrIGRvb3IgZnJvbQorICAgc21hbGwtbWFjcm9zLWZucy5jIChfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyA9PSAyKS4gICovCitleHRlcm4gaW50IF9fbGliY19sb2NrX3RyeWxvY2tfcmVjdXJzaXZlX2ZuIChfX2xpYmNfbG9ja19yZWN1cnNpdmVfdCAqKTsKK2xpYmNfaGlkZGVuX3Byb3RvIChfX2xpYmNfbG9ja190cnlsb2NrX3JlY3Vyc2l2ZV9mbik7CisjIGVuZGlmIC8qIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICE9IDEgKi8KKyMgaWYgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MKKyMgZGVmaW5lIF9fbGliY19sb2NrX3RyeWxvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgKHsJCQkJCQkJCQkgICAgICBcCisgICAgaW50IHJlc3VsdCA9IDA7CQkJCQkJCSAgICAgIFwKKyAgICB2b2lkICpzZWxmID0gVEhSRUFEX1NFTEY7CQkJCQkJICAgICAgXAorICAgIGlmICgoTkFNRSkub3duZXIgIT0gc2VsZikJCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorCWlmIChsbGxfdHJ5bG9jayAoKE5BTUUpLmxvY2spID09IDApCQkJCSAgICAgIFwKKwkgIHsJCQkJCQkJCSAgICAgIFwKKwkgICAgKE5BTUUpLm93bmVyID0gc2VsZjsJCQkJCSAgICAgIFwKKwkgICAgKE5BTUUpLmNudCA9IDE7CQkJCQkJICAgICAgXAorCSAgfQkJCQkJCQkJICAgICAgXAorCWVsc2UJCQkJCQkJCSAgICAgIFwKKwkgIHJlc3VsdCA9IEVCVVNZOwkJCQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgICAgZWxzZQkJCQkJCQkJICAgICAgXAorICAgICAgKysoTkFNRSkuY250OwkJCQkJCQkgICAgICBcCisgICAgcmVzdWx0OwkJCQkJCQkJICAgICAgXAorICB9KQorIyBlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja190cnlsb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIF9fbGliY19sb2NrX3RyeWxvY2tfcmVjdXJzaXZlX2ZuICgmKE5BTUUpKQorIyBlbmRpZiAvKiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyAqLworI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX3RyeWxvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF90cnlsb2NrLCAoJihOQU1FKSksIDApCisjZW5kaWYKKworI2RlZmluZSBfX3J0bGRfbG9ja190cnlsb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jaywgKCYoTkFNRSkubXV0ZXgpLCAwKQorCisvKiBVbmxvY2sgdGhlIG5hbWVkIGxvY2sgdmFyaWFibGUuICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgaWYgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgIT0gMQorLyogRUdMSUJDOiBEZWNsYXJlIHdyYXBwZXIgZnVuY3Rpb24gZm9yIGEgYmlnIG1hY3JvIGlmIGVpdGhlcgorICAgIV9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TLCBvciB3ZSBhcmUgdXNpbmcgYSBiYWNrIGRvb3IgZnJvbQorICAgc21hbGwtbWFjcm9zLWZucy5jIChfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUyA9PSAyKS4gICovCitleHRlcm4gdm9pZCBfX2xpYmNfbG9ja191bmxvY2tfZm4gKF9fbGliY19sb2NrX3QgKik7CitsaWJjX2hpZGRlbl9wcm90byAoX19saWJjX2xvY2tfdW5sb2NrX2ZuKTsKKyMgZW5kaWYgLyogX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgIT0gMSAqLworIyBpZiBfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUworIyBkZWZpbmUgX19saWJjX2xvY2tfdW5sb2NrKE5BTUUpIFwKKyAgbGxsX3VubG9jayAoTkFNRSwgTExMX1BSSVZBVEUpCisjIGVsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX3VubG9jayhOQU1FKSBcCisgIF9fbGliY19sb2NrX3VubG9ja19mbiAoJihOQU1FKSkKKyMgZW5kaWYgLyogX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgKi8KKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja191bmxvY2soTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX211dGV4X3VubG9jaywgKCYoTkFNRSkpLCAwKQorI2VuZGlmCisjZGVmaW5lIF9fbGliY19yd2xvY2tfdW5sb2NrKE5BTUUpIFwKKyAgX19saWJjX3B0Zl9jYWxsIChfX3B0aHJlYWRfcndsb2NrX3VubG9jaywgKCYoTkFNRSkpLCAwKQorCisvKiBVbmxvY2sgdGhlIHJlY3Vyc2l2ZSBuYW1lZCBsb2NrIHZhcmlhYmxlLiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDICYmICghZGVmaW5lZCBOT1RfSU5fbGliYyB8fCBkZWZpbmVkIElTX0lOX2xpYnB0aHJlYWQpCisjIGlmIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICE9IDEKKy8qIEVHTElCQzogRGVjbGFyZSB3cmFwcGVyIGZ1bmN0aW9uIGZvciBhIGJpZyBtYWNybyBpZiBlaXRoZXIKKyAgICFfX09QVElPTl9FR0xJQkNfQklHX01BQ1JPUywgb3Igd2UgYXJlIHVzaW5nIGEgYmFjayBkb29yIGZyb20KKyAgIHNtYWxsLW1hY3Jvcy1mbnMuYyAoX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgPT0gMikuICAqLworZXh0ZXJuIHZvaWQgX19saWJjX2xvY2tfdW5sb2NrX3JlY3Vyc2l2ZV9mbiAoX19saWJjX2xvY2tfcmVjdXJzaXZlX3QgKik7CitsaWJjX2hpZGRlbl9wcm90byAoX19saWJjX2xvY2tfdW5sb2NrX3JlY3Vyc2l2ZV9mbik7CisjIGVuZGlmIC8qIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICE9IDEgKi8KKyMgaWYgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MKKy8qIFdlIGRvIG5vIGVycm9yIGNoZWNraW5nIGhlcmUuICAqLworIyBkZWZpbmUgX19saWJjX2xvY2tfdW5sb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgaWYgKC0tKE5BTUUpLmNudCA9PSAwKQkJCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisJKE5BTUUpLm93bmVyID0gTlVMTDsJCQkJCQkgICAgICBcCisJbGxsX3VubG9jayAoKE5BTUUpLmxvY2ssIExMTF9QUklWQVRFKTsJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyMgZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfdW5sb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIF9fbGliY19sb2NrX3VubG9ja19yZWN1cnNpdmVfZm4gKCYoTkFNRSkpCisjIGVuZGlmIC8qIF9fT1BUSU9OX0VHTElCQ19CSUdfTUFDUk9TICovCisjZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfdW5sb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrLCAoJihOQU1FKSksIDApCisjZW5kaWYKKworI2lmIGRlZmluZWQgX0xJQkMgJiYgZGVmaW5lZCBTSEFSRUQKKyMgZGVmaW5lIF9fcnRsZF9sb2NrX2RlZmF1bHRfbG9ja19yZWN1cnNpdmUobG9jaykgXAorICArKygocHRocmVhZF9tdXRleF90ICopKGxvY2spKS0+X19kYXRhLl9fY291bnQ7CisKKyMgZGVmaW5lIF9fcnRsZF9sb2NrX2RlZmF1bHRfdW5sb2NrX3JlY3Vyc2l2ZShsb2NrKSBcCisgIC0tKChwdGhyZWFkX211dGV4X3QgKikobG9jaykpLT5fX2RhdGEuX19jb3VudDsKKworIyBkZWZpbmUgX19ydGxkX2xvY2tfbG9ja19yZWN1cnNpdmUoTkFNRSkgXAorICBHTChkbF9ydGxkX2xvY2tfcmVjdXJzaXZlKSAoJihOQU1FKS5tdXRleCkKKworIyBkZWZpbmUgX19ydGxkX2xvY2tfdW5sb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIEdMKGRsX3J0bGRfdW5sb2NrX3JlY3Vyc2l2ZSkgKCYoTkFNRSkubXV0ZXgpCisjZWxzZQorIyBkZWZpbmUgX19ydGxkX2xvY2tfbG9ja19yZWN1cnNpdmUoTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX211dGV4X2xvY2ssICgmKE5BTUUpLm11dGV4KSwgMCkKKworIyBkZWZpbmUgX19ydGxkX2xvY2tfdW5sb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrLCAoJihOQU1FKS5tdXRleCksIDApCisjZW5kaWYKKworLyogRGVmaW5lIG9uY2UgY29udHJvbCB2YXJpYWJsZS4gICovCisjaWYgUFRIUkVBRF9PTkNFX0lOSVQgPT0gMAorLyogU3BlY2lhbCBjYXNlIGZvciBzdGF0aWMgdmFyaWFibGVzIHdoZXJlIHdlIGNhbiBhdm9pZCB0aGUgaW5pdGlhbGl6YXRpb24KKyAgIGlmIGl0IGlzIHplcm8uICAqLworIyBkZWZpbmUgX19saWJjX29uY2VfZGVmaW5lKENMQVNTLCBOQU1FKSBcCisgIENMQVNTIHB0aHJlYWRfb25jZV90IE5BTUUKKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfb25jZV9kZWZpbmUoQ0xBU1MsIE5BTUUpIFwKKyAgQ0xBU1MgcHRocmVhZF9vbmNlX3QgTkFNRSA9IFBUSFJFQURfT05DRV9JTklUCisjZW5kaWYKKworLyogQ2FsbCBoYW5kbGVyIGlmZiB0aGUgZmlyc3QgY2FsbC4gICovCisjZGVmaW5lIF9fbGliY19vbmNlKE9OQ0VfQ09OVFJPTCwgSU5JVF9GVU5DVElPTikgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIGlmIChQVEZBVkFJTCAoX19wdGhyZWFkX29uY2UpKQkJCQkJICAgICAgXAorICAgICAgX19saWJjX3B0Zl9jYWxsX2Fsd2F5cyAoX19wdGhyZWFkX29uY2UsICgmKE9OQ0VfQ09OVFJPTCksCQkgICAgICBcCisJCQkJCSAgICAgICBJTklUX0ZVTkNUSU9OKSk7CQkgICAgICBcCisgICAgZWxzZSBpZiAoKE9OQ0VfQ09OVFJPTCkgPT0gUFRIUkVBRF9PTkNFX0lOSVQpIHsJCQkgICAgICBcCisgICAgICBJTklUX0ZVTkNUSU9OICgpOwkJCQkJCQkgICAgICBcCisgICAgICAoT05DRV9DT05UUk9MKSB8PSAyOwkJCQkJCSAgICAgIFwKKyAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorCisKKy8qIE5vdGUgdGhhdCBmb3IgSS9PIGNsZWFudXAgaGFuZGxpbmcgd2UgYXJlIHVzaW5nIHRoZSBvbGQtc3R5bGUKKyAgIGNhbmNlbCBoYW5kbGluZy4gIEl0IGRvZXMgbm90IGhhdmUgdG8gYmUgaW50ZWdyYXRlZCB3aXRoIEMrKyBzbmNlCisgICBubyBDKysgY29kZSBpcyBjYWxsZWQgaW4gdGhlIG1pZGRsZS4gIFRoZSBvbGQtc3R5bGUgaGFuZGxpbmcgaXMKKyAgIGZhc3RlciBhbmQgdGhlIHN1cHBvcnQgaXMgbm90IGdvaW5nIGF3YXkuICAqLworZXh0ZXJuIHZvaWQgX3B0aHJlYWRfY2xlYW51cF9wdXNoIChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKnJvdXRpbmUpICh2b2lkICopLCB2b2lkICphcmcpOworZXh0ZXJuIHZvaWQgX3B0aHJlYWRfY2xlYW51cF9wb3AgKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleGVjdXRlKTsKK2V4dGVybiB2b2lkIF9wdGhyZWFkX2NsZWFudXBfcHVzaF9kZWZlciAoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpyb3V0aW5lKSAodm9pZCAqKSwgdm9pZCAqYXJnKTsKK2V4dGVybiB2b2lkIF9wdGhyZWFkX2NsZWFudXBfcG9wX3Jlc3RvcmUgKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4ZWN1dGUpOworCisvKiBTdGFydCBjcml0aWNhbCByZWdpb24gd2l0aCBjbGVhbnVwLiAgKi8KKyNkZWZpbmUgX19saWJjX2NsZWFudXBfcmVnaW9uX3N0YXJ0KERPSVQsIEZDVCwgQVJHKSBcCisgIHsgc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyIF9idWZmZXI7CQkJCSAgICAgIFwKKyAgICBpbnQgX2F2YWlsOwkJCQkJCQkJICAgICAgXAorICAgIGlmIChET0lUKSB7CQkJCQkJCQkgICAgICBcCisgICAgICBfYXZhaWwgPSBQVEZBVkFJTCAoX3B0aHJlYWRfY2xlYW51cF9wdXNoX2RlZmVyKTsJCQkgICAgICBcCisgICAgICBpZiAoX2F2YWlsKSB7CQkJCQkJCSAgICAgIFwKKwlfX2xpYmNfcHRmX2NhbGxfYWx3YXlzIChfcHRocmVhZF9jbGVhbnVwX3B1c2hfZGVmZXIsICgmX2J1ZmZlciwgRkNULCAgXAorCQkJCQkJCSAgICAgIEFSRykpOwkgICAgICBcCisgICAgICB9IGVsc2UgewkJCQkJCQkJICAgICAgXAorCV9idWZmZXIuX19yb3V0aW5lID0gKEZDVCk7CQkJCQkgICAgICBcCisJX2J1ZmZlci5fX2FyZyA9IChBUkcpOwkJCQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgICAgfSBlbHNlIHsJCQkJCQkJCSAgICAgIFwKKyAgICAgIF9hdmFpbCA9IDA7CQkJCQkJCSAgICAgIFwKKyAgICB9CisKKy8qIEVuZCBjcml0aWNhbCByZWdpb24gd2l0aCBjbGVhbnVwLiAgKi8KKyNkZWZpbmUgX19saWJjX2NsZWFudXBfcmVnaW9uX2VuZChET0lUKSBcCisgICAgaWYgKF9hdmFpbCkgewkJCQkJCQkgICAgICBcCisgICAgICBfX2xpYmNfcHRmX2NhbGxfYWx3YXlzIChfcHRocmVhZF9jbGVhbnVwX3BvcF9yZXN0b3JlLCAoJl9idWZmZXIsIERPSVQpKTtcCisgICAgfSBlbHNlIGlmIChET0lUKQkJCQkJCQkgICAgICBcCisgICAgICBfYnVmZmVyLl9fcm91dGluZSAoX2J1ZmZlci5fX2FyZyk7CQkJCSAgICAgIFwKKyAgfQorCisvKiBTb21ldGltZXMgd2UgaGF2ZSB0byBleGl0IHRoZSBibG9jayBpbiB0aGUgbWlkZGxlLiAgKi8KKyNkZWZpbmUgX19saWJjX2NsZWFudXBfZW5kKERPSVQpIFwKKyAgICBpZiAoX2F2YWlsKSB7CQkJCQkJCSAgICAgIFwKKyAgICAgIF9fbGliY19wdGZfY2FsbF9hbHdheXMgKF9wdGhyZWFkX2NsZWFudXBfcG9wX3Jlc3RvcmUsICgmX2J1ZmZlciwgRE9JVCkpO1wKKyAgICB9IGVsc2UgaWYgKERPSVQpCQkJCQkJCSAgICAgIFwKKyAgICAgIF9idWZmZXIuX19yb3V0aW5lIChfYnVmZmVyLl9fYXJnKQorCisKKy8qIE5vcm1hbCBjbGVhbnVwIGhhbmRsaW5nLCBiYXNlZCBvbiBDIGNsZWFudXAgYXR0cmlidXRlLiAgKi8KK19fZXh0ZXJuX2lubGluZSB2b2lkCitfX2xpYmNfY2xlYW51cF9yb3V0aW5lIChzdHJ1Y3QgX19wdGhyZWFkX2NsZWFudXBfZnJhbWUgKmYpCit7CisgIGlmIChmLT5fX2RvX2l0KQorICAgIGYtPl9fY2FuY2VsX3JvdXRpbmUgKGYtPl9fY2FuY2VsX2FyZyk7Cit9CisKKyNkZWZpbmUgX19saWJjX2NsZWFudXBfcHVzaChmY3QsIGFyZykgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIHN0cnVjdCBfX3B0aHJlYWRfY2xlYW51cF9mcmFtZSBfX2NsZnJhbWUJCQkJICAgICAgXAorICAgICAgX19hdHRyaWJ1dGVfXyAoKF9fY2xlYW51cF9fIChfX2xpYmNfY2xlYW51cF9yb3V0aW5lKSkpCQkgICAgICBcCisgICAgICA9IHsgLl9fY2FuY2VsX3JvdXRpbmUgPSAoZmN0KSwgLl9fY2FuY2VsX2FyZyA9IChhcmcpLAkJICAgICAgXAorICAgICAgICAgIC5fX2RvX2l0ID0gMSB9OworCisjZGVmaW5lIF9fbGliY19jbGVhbnVwX3BvcChleGVjdXRlKSBcCisgICAgX19jbGZyYW1lLl9fZG9faXQgPSAoZXhlY3V0ZSk7CQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKworLyogQ3JlYXRlIHRocmVhZC1zcGVjaWZpYyBrZXkuICAqLworI2RlZmluZSBfX2xpYmNfa2V5X2NyZWF0ZShLRVksIERFU1RSVUNUT1IpIFwKKyAgX19saWJjX3B0Zl9jYWxsIChfX3B0aHJlYWRfa2V5X2NyZWF0ZSwgKEtFWSwgREVTVFJVQ1RPUiksIDEpCisKKy8qIEdldCB0aHJlYWQtc3BlY2lmaWMgZGF0YS4gICovCisjZGVmaW5lIF9fbGliY19nZXRzcGVjaWZpYyhLRVkpIFwKKyAgX19saWJjX3B0Zl9jYWxsIChfX3B0aHJlYWRfZ2V0c3BlY2lmaWMsIChLRVkpLCBOVUxMKQorCisvKiBTZXQgdGhyZWFkLXNwZWNpZmljIGRhdGEuICAqLworI2RlZmluZSBfX2xpYmNfc2V0c3BlY2lmaWMoS0VZLCBWQUxVRSkgXAorICBfX2xpYmNfcHRmX2NhbGwgKF9fcHRocmVhZF9zZXRzcGVjaWZpYywgKEtFWSwgVkFMVUUpLCAwKQorCisKKy8qIFJlZ2lzdGVyIGhhbmRsZXJzIHRvIGV4ZWN1dGUgYmVmb3JlIGFuZCBhZnRlciBgZm9yaycuICBOb3RlIHRoYXQgdGhlCisgICBsYXN0IHBhcmFtZXRlciBpcyBOVUxMLiAgVGhlIGhhbmRsZXJzIHJlZ2lzdGVyZWQgYnkgdGhlIGxpYmMgYXJlCisgICBuZXZlciByZW1vdmVkIHNvIHRoaXMgaXMgT0suICAqLworI2RlZmluZSBfX2xpYmNfYXRmb3JrKFBSRVBBUkUsIFBBUkVOVCwgQ0hJTEQpIFwKKyAgX19yZWdpc3Rlcl9hdGZvcmsgKFBSRVBBUkUsIFBBUkVOVCwgQ0hJTEQsIE5VTEwpCitleHRlcm4gaW50IF9fcmVnaXN0ZXJfYXRmb3JrICh2b2lkICgqX19wcmVwYXJlKSAodm9pZCksCisJCQkgICAgICB2b2lkICgqX19wYXJlbnQpICh2b2lkKSwKKwkJCSAgICAgIHZvaWQgKCpfX2NoaWxkKSAodm9pZCksCisJCQkgICAgICB2b2lkICpfX2Rzb19oYW5kbGUpOworCisvKiBGdW5jdGlvbnMgdGhhdCBhcmUgdXNlZCBieSB0aGlzIGZpbGUgYW5kIGFyZSBpbnRlcm5hbCB0byB0aGUgR05VIEMKKyAgIGxpYnJhcnkuICAqLworCitleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF9pbml0IChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgsCisJCQkJIF9fY29uc3QgcHRocmVhZF9tdXRleGF0dHJfdCAqX19tdXRleF9hdHRyKTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSAocHRocmVhZF9tdXRleF90ICpfX211dGV4KTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jayAocHRocmVhZF9tdXRleF90ICpfX211dGV4KTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfbXV0ZXhfbG9jayAocHRocmVhZF9tdXRleF90ICpfX211dGV4KTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrIChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpOworCitleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleGF0dHJfaW5pdCAocHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyKTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kgKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fYXR0cik7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlIChwdGhyZWFkX211dGV4YXR0cl90ICpfX2F0dHIsCisJCQkJCWludCBfX2tpbmQpOworCisjaWZkZWYgX19VU0VfVU5JWDk4CitleHRlcm4gaW50IF9fcHRocmVhZF9yd2xvY2tfaW5pdCAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2ssCisJCQkJICBfX2NvbnN0IHB0aHJlYWRfcndsb2NrYXR0cl90ICpfX2F0dHIpOworCitleHRlcm4gaW50IF9fcHRocmVhZF9yd2xvY2tfZGVzdHJveSAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2spOworCitleHRlcm4gaW50IF9fcHRocmVhZF9yd2xvY2tfcmRsb2NrIChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jayk7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX3J3bG9ja190cnlyZGxvY2sgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfcndsb2NrX3dybG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2spOworCitleHRlcm4gaW50IF9fcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrIChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jayk7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX3J3bG9ja191bmxvY2sgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKTsKKyNlbmRpZgorCitleHRlcm4gaW50IF9fcHRocmVhZF9rZXlfY3JlYXRlIChwdGhyZWFkX2tleV90ICpfX2tleSwKKwkJCQkgdm9pZCAoKl9fZGVzdHJfZnVuY3Rpb24pICh2b2lkICopKTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfc2V0c3BlY2lmaWMgKHB0aHJlYWRfa2V5X3QgX19rZXksCisJCQkJICBfX2NvbnN0IHZvaWQgKl9fcG9pbnRlcik7CisKK2V4dGVybiB2b2lkICpfX3B0aHJlYWRfZ2V0c3BlY2lmaWMgKHB0aHJlYWRfa2V5X3QgX19rZXkpOworCitleHRlcm4gaW50IF9fcHRocmVhZF9vbmNlIChwdGhyZWFkX29uY2VfdCAqX19vbmNlX2NvbnRyb2wsCisJCQkgICB2b2lkICgqX19pbml0X3JvdXRpbmUpICh2b2lkKSk7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX2F0Zm9yayAodm9pZCAoKl9fcHJlcGFyZSkgKHZvaWQpLAorCQkJICAgICB2b2lkICgqX19wYXJlbnQpICh2b2lkKSwKKwkJCSAgICAgdm9pZCAoKl9fY2hpbGQpICh2b2lkKSk7CisKKworCisvKiBNYWtlIHRoZSBwdGhyZWFkIGZ1bmN0aW9ucyB3ZWFrIHNvIHRoYXQgd2UgY2FuIGVsaWRlIHRoZW0gZnJvbQorICAgc2luZ2xlLXRocmVhZGVkIHByb2Nlc3Nlcy4gICovCisjaWZuZGVmIF9fTk9fV0VBS19QVEhSRUFEX0FMSUFTRVMKKyMgaWZkZWYgd2Vha19leHRlcm4KKyMgIGlmIF9MSUJDCisjICAgaW5jbHVkZSA8YnAtc3ltLmg+CisjICBlbHNlCisjICAgZGVmaW5lIEJQX1NZTShzeW0pIHN5bQorIyAgZW5kaWYKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9tdXRleF9pbml0KSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9tdXRleF9kZXN0cm95KSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9tdXRleF9sb2NrKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9tdXRleF90cnlsb2NrKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9tdXRleF91bmxvY2spKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX211dGV4YXR0cl9pbml0KSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSkpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUpKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX3J3bG9ja19pbml0KSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9yd2xvY2tfZGVzdHJveSkpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfcndsb2NrX3JkbG9jaykpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jaykpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfcndsb2NrX3dybG9jaykpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jaykpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfcndsb2NrX3VubG9jaykpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfa2V5X2NyZWF0ZSkpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfc2V0c3BlY2lmaWMpKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX2dldHNwZWNpZmljKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9vbmNlKSkKK3dlYWtfZXh0ZXJuIChfX3B0aHJlYWRfaW5pdGlhbGl6ZSkKK3dlYWtfZXh0ZXJuIChfX3B0aHJlYWRfYXRmb3JrKQord2Vha19leHRlcm4gKEJQX1NZTSAoX3B0aHJlYWRfY2xlYW51cF9wdXNoX2RlZmVyKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9wdGhyZWFkX2NsZWFudXBfcG9wX3Jlc3RvcmUpKQord2Vha19leHRlcm4gKEJQX1NZTSAocHRocmVhZF9zZXRjYW5jZWxzdGF0ZSkpCisjIGVsc2UKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9tdXRleF9pbml0CisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfbXV0ZXhfZGVzdHJveQorIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX211dGV4X2xvY2sKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9tdXRleF90cnlsb2NrCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfbXV0ZXhhdHRyX2luaXQKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveQorIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfcndsb2NrX2Rlc3Ryb3kKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9yd2xvY2tfcmRsb2NrCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jaworIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX3J3bG9ja193cmxvY2sKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfcndsb2NrX3VubG9jaworIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX2tleV9jcmVhdGUKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9zZXRzcGVjaWZpYworIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX2dldHNwZWNpZmljCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfb25jZQorIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX2luaXRpYWxpemUKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9hdGZvcmsKKyMgIHByYWdtYSB3ZWFrIF9wdGhyZWFkX2NsZWFudXBfcHVzaF9kZWZlcgorIyAgcHJhZ21hIHdlYWsgX3B0aHJlYWRfY2xlYW51cF9wb3BfcmVzdG9yZQorIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9zZXRjYW5jZWxzdGF0ZQorIyBlbmRpZgorI2VuZGlmCisKKyNlbmRpZgkvKiBiaXRzL2xpYmMtbG9jay5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9saWJpby1sZGJsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9saWJpby1sZGJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3NGJjYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2xpYmlvLWxkYmwuaApAQCAtMCwwICsxLDI1IEBACisvKiAtbWxvbmctZG91YmxlLTY0IGNvbXBhdGliaWxpdHkgbW9kZSBmb3IgbGliaW8gZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9JT19TVERJT19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL2xpYmlvLWxkYmwuaD4gZGlyZWN0bHk7IHVzZSA8bGliaW8uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworX19MREJMX1JFRElSX0RFQ0wgKF9JT192ZnNjYW5mKQorX19MREJMX1JFRElSX0RFQ0wgKF9JT192ZnByaW50ZikKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2xpbmsuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2xpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGNjOTJiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbGluay5oCkBAIC0wLDAgKzEsMTMwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDksIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX0xJTktfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9saW5rLmg+IGRpcmVjdGx5OyB1c2UgPGxpbmsuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCisjaWYgX19FTEZfTkFUSVZFX0NMQVNTID09IDMyCisvKiBSZWdpc3RlcnMgZm9yIGVudHJ5IGludG8gUExUIG9uIElBLTMyLiAgKi8KK3R5cGVkZWYgc3RydWN0IExhX2k4Nl9yZWdzCit7CisgIHVpbnQzMl90IGxyX2VkeDsKKyAgdWludDMyX3QgbHJfZWN4OworICB1aW50MzJfdCBscl9lYXg7CisgIHVpbnQzMl90IGxyX2VicDsKKyAgdWludDMyX3QgbHJfZXNwOworfSBMYV9pODZfcmVnczsKKworLyogUmV0dXJuIHZhbHVlcyBmb3IgY2FsbHMgZnJvbSBQTFQgb24gSUEtMzIuICAqLwordHlwZWRlZiBzdHJ1Y3QgTGFfaTg2X3JldHZhbAoreworICB1aW50MzJfdCBscnZfZWF4OworICB1aW50MzJfdCBscnZfZWR4OworICBsb25nIGRvdWJsZSBscnZfc3QwOworICBsb25nIGRvdWJsZSBscnZfc3QxOworfSBMYV9pODZfcmV0dmFsOworCisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIEVsZjMyX0FkZHIgbGFfaTg2X2dudV9wbHRlbnRlciAoRWxmMzJfU3ltICpfX3N5bSwgdW5zaWduZWQgaW50IF9fbmR4LAorCQkJCSAgICAgICB1aW50cHRyX3QgKl9fcmVmY29vaywKKwkJCQkgICAgICAgdWludHB0cl90ICpfX2RlZmNvb2ssCisJCQkJICAgICAgIExhX2k4Nl9yZWdzICpfX3JlZ3MsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCAqX19mbGFncywKKwkJCQkgICAgICAgY29uc3QgY2hhciAqX19zeW1uYW1lLAorCQkJCSAgICAgICBsb25nIGludCAqX19mcmFtZXNpemVwKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbGFfaTg2X2dudV9wbHRleGl0IChFbGYzMl9TeW0gKl9fc3ltLCB1bnNpZ25lZCBpbnQgX19uZHgsCisJCQkJCXVpbnRwdHJfdCAqX19yZWZjb29rLAorCQkJCQl1aW50cHRyX3QgKl9fZGVmY29vaywKKwkJCQkJY29uc3QgTGFfaTg2X3JlZ3MgKl9faW5yZWdzLAorCQkJCQlMYV9pODZfcmV0dmFsICpfX291dHJlZ3MsCisJCQkJCWNvbnN0IGNoYXIgKnN5bW5hbWUpOworCitfX0VORF9ERUNMUworCisjZWxzZQorCisvKiBSZWdpc3RlcnMgZm9yIGVudHJ5IGludG8gUExUIG9uIHg4Ni02NC4gICovCisjIGlmIF9fR05VQ19QUkVSRVEgKDQsMCkKK3R5cGVkZWYgZmxvYXQgTGFfeDg2XzY0X3htbSBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgxNikpKTsKK3R5cGVkZWYgZmxvYXQgTGFfeDg2XzY0X3ltbQorICAgIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDMyKSwgX19hbGlnbmVkX18gKDE2KSkpOworIyBlbHNlCit0eXBlZGVmIGZsb2F0IExhX3g4Nl82NF94bW0gX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX1Y0U0ZfXykpKTsKKyMgZW5kaWYKKwordHlwZWRlZiB1bmlvbgoreworIyBpZiBfX0dOVUNfUFJFUkVRICg0LDApCisgIExhX3g4Nl82NF95bW0geW1tWzJdOworIyBlbmRpZgorICBMYV94ODZfNjRfeG1tIHhtbVs0XTsKK30gTGFfeDg2XzY0X3ZlY3RvciBfX2F0dHJpYnV0ZV9fICgoX19hbGlnbmVkX18gKDE2KSkpOworCit0eXBlZGVmIHN0cnVjdCBMYV94ODZfNjRfcmVncworeworICB1aW50NjRfdCBscl9yZHg7CisgIHVpbnQ2NF90IGxyX3I4OworICB1aW50NjRfdCBscl9yOTsKKyAgdWludDY0X3QgbHJfcmN4OworICB1aW50NjRfdCBscl9yc2k7CisgIHVpbnQ2NF90IGxyX3JkaTsKKyAgdWludDY0X3QgbHJfcmJwOworICB1aW50NjRfdCBscl9yc3A7CisgIExhX3g4Nl82NF94bW0gbHJfeG1tWzhdOworICBMYV94ODZfNjRfdmVjdG9yIGxyX3ZlY3Rvcls4XTsKK30gTGFfeDg2XzY0X3JlZ3M7CisKKy8qIFJldHVybiB2YWx1ZXMgZm9yIGNhbGxzIGZyb20gUExUIG9uIHg4Ni02NC4gICovCit0eXBlZGVmIHN0cnVjdCBMYV94ODZfNjRfcmV0dmFsCit7CisgIHVpbnQ2NF90IGxydl9yYXg7CisgIHVpbnQ2NF90IGxydl9yZHg7CisgIExhX3g4Nl82NF94bW0gbHJ2X3htbTA7CisgIExhX3g4Nl82NF94bW0gbHJ2X3htbTE7CisgIGxvbmcgZG91YmxlIGxydl9zdDA7CisgIGxvbmcgZG91YmxlIGxydl9zdDE7CisgIExhX3g4Nl82NF92ZWN0b3IgbHJ2X3ZlY3RvcjA7CisgIExhX3g4Nl82NF92ZWN0b3IgbHJ2X3ZlY3RvcjE7Cit9IExhX3g4Nl82NF9yZXR2YWw7CisKKworX19CRUdJTl9ERUNMUworCitleHRlcm4gRWxmNjRfQWRkciBsYV94ODZfNjRfZ251X3BsdGVudGVyIChFbGY2NF9TeW0gKl9fc3ltLAorCQkJCQkgIHVuc2lnbmVkIGludCBfX25keCwKKwkJCQkJICB1aW50cHRyX3QgKl9fcmVmY29vaywKKwkJCQkJICB1aW50cHRyX3QgKl9fZGVmY29vaywKKwkJCQkJICBMYV94ODZfNjRfcmVncyAqX19yZWdzLAorCQkJCQkgIHVuc2lnbmVkIGludCAqX19mbGFncywKKwkJCQkJICBjb25zdCBjaGFyICpfX3N5bW5hbWUsCisJCQkJCSAgbG9uZyBpbnQgKl9fZnJhbWVzaXplcCk7CitleHRlcm4gdW5zaWduZWQgaW50IGxhX3g4Nl82NF9nbnVfcGx0ZXhpdCAoRWxmNjRfU3ltICpfX3N5bSwKKwkJCQkJICAgdW5zaWduZWQgaW50IF9fbmR4LAorCQkJCQkgICB1aW50cHRyX3QgKl9fcmVmY29vaywKKwkJCQkJICAgdWludHB0cl90ICpfX2RlZmNvb2ssCisJCQkJCSAgIGNvbnN0IExhX3g4Nl82NF9yZWdzICpfX2lucmVncywKKwkJCQkJICAgTGFfeDg2XzY0X3JldHZhbCAqX19vdXRyZWdzLAorCQkJCQkgICBjb25zdCBjaGFyICpfX3N5bW5hbWUpOworCitfX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2xvY2FsX2xpbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbG9jYWxfbGltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYwZGY0ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL2xvY2FsX2xpbS5oCkBAIC0wLDAgKzEsMTAwIEBACisvKiBNaW5pbXVtIGd1YXJhbnRlZWQgbWF4aW11bSB2YWx1ZXMgZm9yIHN5c3RlbSBsaW1pdHMuICBMaW51eCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTgsMjAwMCwyMDAyLTIwMDQsMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUKKyAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAorICAgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGUga2VybmVsIGhlYWRlciBwb2xsdXRlcyB0aGUgbmFtZXNwYWNlIHdpdGggdGhlIE5SX09QRU4gc3ltYm9sCisgICBhbmQgZGVmaW5lcyBMSU5LX01BWCBhbHRob3VnaCBmaWxlc3lzdGVtcyBoYXZlIGRpZmZlcmVudCBtYXhpbWEuICBBCisgICBzaW1pbGFyIHRoaW5nIGlzIHRydWUgZm9yIE9QRU5fTUFYOiB0aGUgbGltaXQgY2FuIGJlIGNoYW5nZWQgYXQKKyAgIHJ1bnRpbWUgYW5kIHRoZXJlZm9yZSB0aGUgbWFjcm8gbXVzdCBub3QgYmUgZGVmaW5lZC4gIFJlbW92ZSB0aGlzCisgICBhZnRlciBpbmNsdWRpbmcgdGhlIGhlYWRlciBpZiBuZWNlc3NhcnkuICAqLworI2lmbmRlZiBOUl9PUEVOCisjIGRlZmluZSBfX3VuZGVmX05SX09QRU4KKyNlbmRpZgorI2lmbmRlZiBMSU5LX01BWAorIyBkZWZpbmUgX191bmRlZl9MSU5LX01BWAorI2VuZGlmCisjaWZuZGVmIE9QRU5fTUFYCisjIGRlZmluZSBfX3VuZGVmX09QRU5fTUFYCisjZW5kaWYKKyNpZm5kZWYgQVJHX01BWAorIyBkZWZpbmUgX191bmRlZl9BUkdfTUFYCisjZW5kaWYKKworLyogVGhlIGtlcm5lbCBzb3VyY2VzIGNvbnRhaW4gYSBmaWxlIHdpdGggYWxsIHRoZSBuZWVkZWQgaW5mb3JtYXRpb24uICAqLworI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgorCisvKiBIYXZlIHRvIHJlbW92ZSBOUl9PUEVOPyAgKi8KKyNpZmRlZiBfX3VuZGVmX05SX09QRU4KKyMgdW5kZWYgTlJfT1BFTgorIyB1bmRlZiBfX3VuZGVmX05SX09QRU4KKyNlbmRpZgorLyogSGF2ZSB0byByZW1vdmUgTElOS19NQVg/ICAqLworI2lmZGVmIF9fdW5kZWZfTElOS19NQVgKKyMgdW5kZWYgTElOS19NQVgKKyMgdW5kZWYgX191bmRlZl9MSU5LX01BWAorI2VuZGlmCisvKiBIYXZlIHRvIHJlbW92ZSBPUEVOX01BWD8gICovCisjaWZkZWYgX191bmRlZl9PUEVOX01BWAorIyB1bmRlZiBPUEVOX01BWAorIyB1bmRlZiBfX3VuZGVmX09QRU5fTUFYCisjZW5kaWYKKy8qIEhhdmUgdG8gcmVtb3ZlIEFSR19NQVg/ICAqLworI2lmZGVmIF9fdW5kZWZfQVJHX01BWAorIyB1bmRlZiBBUkdfTUFYCisjIHVuZGVmIF9fdW5kZWZfQVJHX01BWAorI2VuZGlmCisKKy8qIFRoZSBudW1iZXIgb2YgZGF0YSBrZXlzIHBlciBwcm9jZXNzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9LRVlTX01BWAkxMjgKKy8qIFRoaXMgaXMgdGhlIHZhbHVlIHRoaXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMuICAqLworI2RlZmluZSBQVEhSRUFEX0tFWVNfTUFYCTEwMjQKKworLyogQ29udHJvbGxpbmcgdGhlIGl0ZXJhdGlvbnMgb2YgZGVzdHJ1Y3RvcnMgZm9yIHRocmVhZC1zcGVjaWZpYyBkYXRhLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9ERVNUUlVDVE9SX0lURVJBVElPTlMJNAorLyogTnVtYmVyIG9mIGl0ZXJhdGlvbnMgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzLiAgKi8KKyNkZWZpbmUgUFRIUkVBRF9ERVNUUlVDVE9SX0lURVJBVElPTlMJX1BPU0lYX1RIUkVBRF9ERVNUUlVDVE9SX0lURVJBVElPTlMKKworLyogVGhlIG51bWJlciBvZiB0aHJlYWRzIHBlciBwcm9jZXNzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9USFJFQURTX01BWAk2NAorLyogV2UgaGF2ZSBubyBwcmVkZWZpbmVkIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgdGhyZWFkcy4gICovCisjdW5kZWYgUFRIUkVBRF9USFJFQURTX01BWAorCisvKiBNYXhpbXVtIGFtb3VudCBieSB3aGljaCBhIHByb2Nlc3MgY2FuIGRlc2NyZWFzZSBpdHMgYXN5bmNocm9ub3VzIEkvTworICAgcHJpb3JpdHkgbGV2ZWwuICAqLworI2RlZmluZSBBSU9fUFJJT19ERUxUQV9NQVgJMjAKKworLyogTWluaW11bSBzaXplIGZvciBhIHRocmVhZC4gIFdlIGFyZSBmcmVlIHRvIGNob29zZSBhIHJlYXNvbmFibGUgdmFsdWUuICAqLworI2RlZmluZSBQVEhSRUFEX1NUQUNLX01JTgkxNjM4NAorCisvKiBNYXhpbXVtIG51bWJlciBvZiB0aW1lciBleHBpcmF0aW9uIG92ZXJydW5zLiAgKi8KKyNkZWZpbmUgREVMQVlUSU1FUl9NQVgJMjE0NzQ4MzY0NworCisvKiBNYXhpbXVtIHR0eSBuYW1lIGxlbmd0aC4gICovCisjZGVmaW5lIFRUWV9OQU1FX01BWAkJMzIKKworLyogTWF4aW11bSBsb2dpbiBuYW1lIGxlbmd0aC4gIFRoaXMgaXMgYXJiaXRyYXJ5LiAgKi8KKyNkZWZpbmUgTE9HSU5fTkFNRV9NQVgJCTI1NgorCisvKiBNYXhpbXVtIGhvc3QgbmFtZSBsZW5ndGguICAqLworI2RlZmluZSBIT1NUX05BTUVfTUFYCQk2NAorCisvKiBNYXhpbXVtIG1lc3NhZ2UgcXVldWUgcHJpb3JpdHkgbGV2ZWwuICAqLworI2RlZmluZSBNUV9QUklPX01BWAkJMzI3NjgKKworLyogTWF4aW11bSB2YWx1ZSB0aGUgc2VtYXBob3JlIGNhbiBoYXZlLiAgKi8KKyNkZWZpbmUgU0VNX1ZBTFVFX01BWCAgICgyMTQ3NDgzNjQ3KQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbG9jYWxlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9sb2NhbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDA2NGI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbG9jYWxlLmgKQEAgLTAsMCArMSw0NCBAQAorLyogRGVmaW5pdGlvbiBvZiBsb2NhbGUgY2F0ZWdvcnkgc3ltYm9sIHZhbHVlcy4KKyAgIENvcHlyaWdodCAoQykgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIF9MT0NBTEVfSCAmJiAhZGVmaW5lZCBfTEFOR0lORk9fSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2xvY2FsZS5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bG9jYWxlLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX0JJVFNfTE9DQUxFX0gKKyNkZWZpbmUgX0JJVFNfTE9DQUxFX0gJMQorCitlbnVtCit7CisgIF9fTENfQ1RZUEUgPSAwLAorICBfX0xDX05VTUVSSUMgPSAxLAorICBfX0xDX1RJTUUgPSAyLAorICBfX0xDX0NPTExBVEUgPSAzLAorICBfX0xDX01PTkVUQVJZID0gNCwKKyAgX19MQ19NRVNTQUdFUyA9IDUsCisgIF9fTENfQUxMID0gNiwKKyAgX19MQ19QQVBFUiA9IDcsCisgIF9fTENfTkFNRSA9IDgsCisgIF9fTENfQUREUkVTUyA9IDksCisgIF9fTENfVEVMRVBIT05FID0gMTAsCisgIF9fTENfTUVBU1VSRU1FTlQgPSAxMSwKKyAgX19MQ19JREVOVElGSUNBVElPTiA9IDEyCit9OworCisjZW5kaWYJLyogYml0cy9sb2NhbGUuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbWF0aC1maW5pdGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL21hdGgtZmluaXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNmNDI3YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL21hdGgtZmluaXRlLmgKQEAgLTAsMCArMSwzMjkgQEAKKy8qIEVudHJ5IHBvaW50cyB0byBmaW5pdGUtbWF0aC1vbmx5IGNvbXBpbGVyIHJ1bnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01BVEhfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL21hdGgtZmluaXRlLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxtYXRoLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIGFjb3MuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoYWNvcywgKGRvdWJsZSksIF9fYWNvc19maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChhY29zZiwgKGZsb2F0KSwgX19hY29zZl9maW5pdGUpOworI2lmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoYWNvc2wsIChsb25nIGRvdWJsZSksIF9fYWNvc2xfZmluaXRlKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKKy8qIGFjb3NoLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGFjb3NoLCAoZG91YmxlKSwgX19hY29zaF9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChhY29zaGYsIChmbG9hdCksIF9fYWNvc2hmX2Zpbml0ZSk7CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoYWNvc2hsLCAobG9uZyBkb3VibGUpLCBfX2Fjb3NobF9maW5pdGUpOworIyBlbmRpZgorI2VuZGlmCisKKy8qIGFzaW4uICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoYXNpbiwgKGRvdWJsZSksIF9fYXNpbl9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChhc2luZiwgKGZsb2F0KSwgX19hc2luZl9maW5pdGUpOworI2lmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoYXNpbmwsIChsb25nIGRvdWJsZSksIF9fYXNpbmxfZmluaXRlKTsKKyNlbmRpZgorCisvKiBhdGFuMi4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChhdGFuMiwgKGRvdWJsZSwgZG91YmxlKSwgX19hdGFuMl9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChhdGFuMmYsIChmbG9hdCwgZmxvYXQpLCBfX2F0YW4yZl9maW5pdGUpOworI2lmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoYXRhbjJsLCAobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKSwKKwkJCQkgICBfX2F0YW4ybF9maW5pdGUpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorLyogYXRhbmguICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoYXRhbmgsIChkb3VibGUpLCBfX2F0YW5oX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGF0YW5oZiwgKGZsb2F0KSwgX19hdGFuaGZfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChhdGFuaGwsIChsb25nIGRvdWJsZSksIF9fYXRhbmhsX2Zpbml0ZSk7CisjIGVuZGlmCisjZW5kaWYKKworLyogY29zaC4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChjb3NoLCAoZG91YmxlKSwgX19jb3NoX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGNvc2hmLCAoZmxvYXQpLCBfX2Nvc2hmX2Zpbml0ZSk7CisjaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChjb3NobCwgKGxvbmcgZG91YmxlKSwgX19jb3NobF9maW5pdGUpOworI2VuZGlmCisKKy8qIGV4cC4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChleHAsIChkb3VibGUpLCBfX2V4cF9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChleHBmLCAoZmxvYXQpLCBfX2V4cGZfZmluaXRlKTsKKyNpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGV4cGwsIChsb25nIGRvdWJsZSksIF9fZXhwbF9maW5pdGUpOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIGV4cDEwLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGV4cDEwLCAoZG91YmxlKSwgX19leHAxMF9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChleHAxMGYsIChmbG9hdCksIF9fZXhwMTBmX2Zpbml0ZSk7CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoZXhwMTBsLCAobG9uZyBkb3VibGUpLCBfX2V4cDEwbF9maW5pdGUpOworIyBlbmRpZgorCisvKiBwb3cxMC4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChwb3cxMCwgKGRvdWJsZSksIF9fZXhwMTBfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAocG93MTBmLCAoZmxvYXQpLCBfX2V4cDEwZl9maW5pdGUpOworIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKHBvdzEwbCwgKGxvbmcgZG91YmxlKSwgX19leHAxMGxfZmluaXRlKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfSVNPQzk5CisvKiBleHAyLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGV4cDIsIChkb3VibGUpLCBfX2V4cDJfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoZXhwMmYsIChmbG9hdCksIF9fZXhwMmZfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChleHAybCwgKGxvbmcgZG91YmxlKSwgX19leHAybF9maW5pdGUpOworIyBlbmRpZgorI2VuZGlmCisKKy8qIGZtb2QuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoZm1vZCwgKGRvdWJsZSwgZG91YmxlKSwgX19mbW9kX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGZtb2RmLCAoZmxvYXQsIGZsb2F0KSwgX19mbW9kZl9maW5pdGUpOworI2lmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoZm1vZGwsIChsb25nIGRvdWJsZSwgbG9uZyBkb3VibGUpLAorCQkJCSAgIF9fZm1vZGxfZmluaXRlKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfSVNPQzk5CisvKiBoeXBvdC4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChoeXBvdCwgKGRvdWJsZSwgZG91YmxlKSwgX19oeXBvdF9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChoeXBvdGYsIChmbG9hdCwgZmxvYXQpLCBfX2h5cG90Zl9maW5pdGUpOworIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGh5cG90bCwgKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSksCisJCQkJICAgX19oeXBvdGxfZmluaXRlKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKy8qIGowLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGowLCAoZG91YmxlKSwgX19qMF9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChqMGYsIChmbG9hdCksIF9fajBmX2Zpbml0ZSk7CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoajBsLCAobG9uZyBkb3VibGUpLCBfX2owbF9maW5pdGUpOworIyBlbmRpZgorCisvKiB5MC4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIICh5MCwgKGRvdWJsZSksIF9feTBfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoeTBmLCAoZmxvYXQpLCBfX3kwZl9maW5pdGUpOworIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKHkwbCwgKGxvbmcgZG91YmxlKSwgX195MGxfZmluaXRlKTsKKyMgZW5kaWYKKworLyogajEuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoajEsIChkb3VibGUpLCBfX2oxX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGoxZiwgKGZsb2F0KSwgX19qMWZfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChqMWwsIChsb25nIGRvdWJsZSksIF9fajFsX2Zpbml0ZSk7CisjIGVuZGlmCisKKy8qIHkxLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKHkxLCAoZG91YmxlKSwgX195MV9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIICh5MWYsIChmbG9hdCksIF9feTFmX2Zpbml0ZSk7CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoeTFsLCAobG9uZyBkb3VibGUpLCBfX3kxbF9maW5pdGUpOworIyBlbmRpZgorCisvKiBqbi4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChqbiwgKGludCwgZG91YmxlKSwgX19qbl9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChqbmYsIChpbnQsIGZsb2F0KSwgX19qbmZfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChqbmwsIChpbnQsIGxvbmcgZG91YmxlKSwgX19qbmxfZmluaXRlKTsKKyMgZW5kaWYKKworLyogeW4uICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoeW4sIChpbnQsIGRvdWJsZSksIF9feW5fZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoeW5mLCAoaW50LCBmbG9hdCksIF9feW5mX2Zpbml0ZSk7CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoeW5sLCAoaW50LCBsb25nIGRvdWJsZSksIF9feW5sX2Zpbml0ZSk7CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIGxnYW1tYV9yLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGxnYW1tYV9yLCAoZG91YmxlLCBpbnQgKiksIF9fbGdhbW1hX3JfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAobGdhbW1hZl9yLCAoZmxvYXQsIGludCAqKSwgX19sZ2FtbWFmX3JfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChsZ2FtbWFsX3IsIChsb25nIGRvdWJsZSwgaW50ICopLAorCQkJCSAgIF9fbGdhbW1hbF9yX2Zpbml0ZSk7CisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CisvKiBsZ2FtbWEuICAqLworX19leHRlcm5fYWx3YXlzX2lubGluZSBkb3VibGUgX19OVEggKGxnYW1tYSAoZG91YmxlIF9fZCkpCit7CisjIGlmZGVmIF9fVVNFX0lTT0M5OQorICBpbnQgX19sb2NhbF9zaWduZ2FtID0gMDsKKyAgcmV0dXJuIGxnYW1tYV9yIChfX2QsICZfX2xvY2FsX3NpZ25nYW0pOworIyBlbHNlCisgIHJldHVybiBsZ2FtbWFfciAoX19kLCAmc2lnbmdhbSk7CisjIGVuZGlmCit9CitfX2V4dGVybl9hbHdheXNfaW5saW5lIGZsb2F0IF9fTlRIIChsZ2FtbWFmIChmbG9hdCBfX2QpKQoreworIyBpZmRlZiBfX1VTRV9JU09DOTkKKyAgaW50IF9fbG9jYWxfc2lnbmdhbSA9IDA7CisgIHJldHVybiBsZ2FtbWFmX3IgKF9fZCwgJl9fbG9jYWxfc2lnbmdhbSk7CisjIGVsc2UKKyAgcmV0dXJuIGxnYW1tYWZfciAoX19kLCAmc2lnbmdhbSk7CisjIGVuZGlmCit9CisjIGlmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgbG9uZyBkb3VibGUgX19OVEggKGxnYW1tYWwgKGxvbmcgZG91YmxlIF9fZCkpCit7CisjIGlmZGVmIF9fVVNFX0lTT0M5OQorICBpbnQgX19sb2NhbF9zaWduZ2FtID0gMDsKKyAgcmV0dXJuIGxnYW1tYWxfciAoX19kLCAmX19sb2NhbF9zaWduZ2FtKTsKKyMgZWxzZQorICByZXR1cm4gbGdhbW1hbF9yIChfX2QsICZzaWduZ2FtKTsKKyMgZW5kaWYKK30KKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKy8qIGdhbW1hLiAgKi8KK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgZG91YmxlIF9fTlRIIChnYW1tYSAoZG91YmxlIF9fZCkpCit7CisjIGlmZGVmIF9fVVNFX0lTT0M5OQorICBpbnQgX19sb2NhbF9zaWduZ2FtID0gMDsKKyAgcmV0dXJuIGxnYW1tYV9yIChfX2QsICZfX2xvY2FsX3NpZ25nYW0pOworIyBlbHNlCisgIHJldHVybiBsZ2FtbWFfciAoX19kLCAmc2lnbmdhbSk7CisjIGVuZGlmCit9CitfX2V4dGVybl9hbHdheXNfaW5saW5lIGZsb2F0IF9fTlRIIChnYW1tYWYgKGZsb2F0IF9fZCkpCit7CisjIGlmZGVmIF9fVVNFX0lTT0M5OQorICBpbnQgX19sb2NhbF9zaWduZ2FtID0gMDsKKyAgcmV0dXJuIGxnYW1tYWZfciAoX19kLCAmX19sb2NhbF9zaWduZ2FtKTsKKyMgZWxzZQorICByZXR1cm4gbGdhbW1hZl9yIChfX2QsICZzaWduZ2FtKTsKKyMgZW5kaWYKK30KKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorX19leHRlcm5fYWx3YXlzX2lubGluZSBsb25nIGRvdWJsZSBfX05USCAoZ2FtbWFsIChsb25nIGRvdWJsZSBfX2QpKQoreworIyAgaWZkZWYgX19VU0VfSVNPQzk5CisgIGludCBfX2xvY2FsX3NpZ25nYW0gPSAwOworICByZXR1cm4gbGdhbW1hbF9yIChfX2QsICZfX2xvY2FsX3NpZ25nYW0pOworIyAgZWxzZQorICByZXR1cm4gbGdhbW1hbF9yIChfX2QsICZzaWduZ2FtKTsKKyMgIGVuZGlmCit9CisjIGVuZGlmCisjZW5kaWYKKworLyogbG9nLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGxvZywgKGRvdWJsZSksIF9fbG9nX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGxvZ2YsIChmbG9hdCksIF9fbG9nZl9maW5pdGUpOworI2lmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAobG9nbCwgKGxvbmcgZG91YmxlKSwgX19sb2dsX2Zpbml0ZSk7CisjZW5kaWYKKworLyogbG9nMTAuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAobG9nMTAsIChkb3VibGUpLCBfX2xvZzEwX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKGxvZzEwZiwgKGZsb2F0KSwgX19sb2cxMGZfZmluaXRlKTsKKyNpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKGxvZzEwbCwgKGxvbmcgZG91YmxlKSwgX19sb2cxMGxfZmluaXRlKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfSVNPQzk5CisvKiBsb2cyLiAgKi8KK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKGxvZzIsIChkb3VibGUpLCBfX2xvZzJfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAobG9nMmYsIChmbG9hdCksIF9fbG9nMmZfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChsb2cybCwgKGxvbmcgZG91YmxlKSwgX19sb2cybF9maW5pdGUpOworIyBlbmRpZgorI2VuZGlmCisKKy8qIHBvdy4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChwb3csIChkb3VibGUsIGRvdWJsZSksIF9fcG93X2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKHBvd2YsIChmbG9hdCwgZmxvYXQpLCBfX3Bvd2ZfZmluaXRlKTsKKyNpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKHBvd2wsIChsb25nIGRvdWJsZSwgbG9uZyBkb3VibGUpLAorCQkJCSAgIF9fcG93bF9maW5pdGUpOworI2VuZGlmCisKKy8qIHJlbWFpbmRlci4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChyZW1haW5kZXIsIChkb3VibGUsIGRvdWJsZSksIF9fcmVtYWluZGVyX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKHJlbWFpbmRlcmYsIChmbG9hdCwgZmxvYXQpLCBfX3JlbWFpbmRlcmZfZmluaXRlKTsKKyNpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKHJlbWFpbmRlcmwsIChsb25nIGRvdWJsZSwgbG9uZyBkb3VibGUpLAorCQkJCSAgIF9fcmVtYWluZGVybF9maW5pdGUpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogc2NhbGIuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoc2NhbGIsIChkb3VibGUsIGRvdWJsZSksIF9fc2NhbGJfZmluaXRlKTsKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAoc2NhbGJmLCAoZmxvYXQsIGZsb2F0KSwgX19zY2FsYmZfZmluaXRlKTsKKyMgaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChzY2FsYmwsIChsb25nIGRvdWJsZSwgbG9uZyBkb3VibGUpLAorCQkJCSAgIF9fc2NhbGJsX2Zpbml0ZSk7CisjIGVuZGlmCisjZW5kaWYKKworLyogc2luaC4gICovCitleHRlcm4gZG91YmxlIF9fUkVESVJFQ1RfTlRIIChzaW5oLCAoZG91YmxlKSwgX19zaW5oX2Zpbml0ZSk7CitleHRlcm4gZmxvYXQgX19SRURJUkVDVF9OVEggKHNpbmhmLCAoZmxvYXQpLCBfX3NpbmhmX2Zpbml0ZSk7CisjaWZkZWYgX19NQVRIX0RFQ0xBUkVfTERPVUJMRQorZXh0ZXJuIGxvbmcgZG91YmxlIF9fUkVESVJFQ1RfTlRIIChzaW5obCwgKGxvbmcgZG91YmxlKSwgX19zaW5obF9maW5pdGUpOworI2VuZGlmCisKKy8qIHNxcnQuICAqLworZXh0ZXJuIGRvdWJsZSBfX1JFRElSRUNUX05USCAoc3FydCwgKGRvdWJsZSksIF9fc3FydF9maW5pdGUpOworZXh0ZXJuIGZsb2F0IF9fUkVESVJFQ1RfTlRIIChzcXJ0ZiwgKGZsb2F0KSwgX19zcXJ0Zl9maW5pdGUpOworI2lmZGVmIF9fTUFUSF9ERUNMQVJFX0xET1VCTEUKK2V4dGVybiBsb25nIGRvdWJsZSBfX1JFRElSRUNUX05USCAoc3FydGwsIChsb25nIGRvdWJsZSksIF9fc3FydGxfZmluaXRlKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfSVNPQzk5CisvKiB0Z2FtbWEuICAqLworZXh0ZXJuIGRvdWJsZSBfX2dhbW1hX3JfZmluaXRlIChkb3VibGUsIGludCAqKTsKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgZG91YmxlIF9fTlRIICh0Z2FtbWEgKGRvdWJsZSBfX2QpKQoreworICBpbnQgX19sb2NhbF9zaWduZ2FtID0gMDsKKyAgZG91YmxlIF9fcmVzID0gX19nYW1tYV9yX2Zpbml0ZSAoX19kLCAmX19sb2NhbF9zaWduZ2FtKTsKKyAgcmV0dXJuIF9fbG9jYWxfc2lnbmdhbSA8IDAgPyAtX19yZXMgOiBfX3JlczsKK30KK2V4dGVybiBmbG9hdCBfX2dhbW1hZl9yX2Zpbml0ZSAoZmxvYXQsIGludCAqKTsKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgZmxvYXQgX19OVEggKHRnYW1tYWYgKGZsb2F0IF9fZCkpCit7CisgIGludCBfX2xvY2FsX3NpZ25nYW0gPSAwOworICBmbG9hdCBfX3JlcyA9IF9fZ2FtbWFmX3JfZmluaXRlIChfX2QsICZfX2xvY2FsX3NpZ25nYW0pOworICByZXR1cm4gX19sb2NhbF9zaWduZ2FtIDwgMCA/IC1fX3JlcyA6IF9fcmVzOworfQorIyBpZmRlZiBfX01BVEhfREVDTEFSRV9MRE9VQkxFCitleHRlcm4gbG9uZyBkb3VibGUgX19nYW1tYWxfcl9maW5pdGUgKGxvbmcgZG91YmxlLCBpbnQgKik7CitfX2V4dGVybl9hbHdheXNfaW5saW5lIGxvbmcgZG91YmxlIF9fTlRIICh0Z2FtbWFsIChsb25nIGRvdWJsZSBfX2QpKQoreworICBpbnQgX19sb2NhbF9zaWduZ2FtID0gMDsKKyAgbG9uZyBkb3VibGUgX19yZXMgPSBfX2dhbW1hbF9yX2Zpbml0ZSAoX19kLCAmX19sb2NhbF9zaWduZ2FtKTsKKyAgcmV0dXJuIF9fbG9jYWxfc2lnbmdhbSA8IDAgPyAtX19yZXMgOiBfX3JlczsKK30KKyMgZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbWF0aGNhbGxzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9tYXRoY2FsbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjIyYWJmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbWF0aGNhbGxzLmgKQEAgLTAsMCArMSwzNjYgQEAKKy8qIFByb3RvdHlwZSBkZWNsYXJhdGlvbnMgZm9yIG1hdGggZnVuY3Rpb25zOyBoZWxwZXIgZmlsZSBmb3IgPG1hdGguaD4uCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMiwgMjAwMywgMjAwNiwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogTk9URTogQmVjYXVzZSBvZiB0aGUgc3BlY2lhbCB3YXkgdGhpcyBmaWxlIGlzIHVzZWQgYnkgPG1hdGguaD4sIHRoaXMKKyAgIGZpbGUgbXVzdCBOT1QgYmUgcHJvdGVjdGVkIGZyb20gbXVsdGlwbGUgaW5jbHVzaW9uIGFzIGhlYWRlciBmaWxlcworICAgdXN1YWxseSBhcmUuCisKKyAgIFRoaXMgZmlsZSBwcm92aWRlcyBwcm90b3R5cGUgZGVjbGFyYXRpb25zIGZvciB0aGUgbWF0aCBmdW5jdGlvbnMuCisgICBNb3N0IGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQgdXNpbmcgdGhlIG1hY3JvOgorCisgICBfX01BVEhDQUxMIChOQU1FLFtfcl0sIChBUkdTLi4uKSk7CisKKyAgIFRoaXMgbWVhbnMgdGhlcmUgaXMgYSBmdW5jdGlvbiBgTkFNRScgcmV0dXJuaW5nIGBkb3VibGUnIGFuZCBhIGZ1bmN0aW9uCisgICBgTkFNRWYnIHJldHVybmluZyBgZmxvYXQnLiAgRWFjaCBwbGFjZSBgX01kb3VibGVfJyBhcHBlYXJzIGluIHRoZQorICAgcHJvdG90eXBlLCB0aGF0IGlzIGFjdHVhbGx5IGBkb3VibGUnIGluIHRoZSBwcm90b3R5cGUgZm9yIGBOQU1FJyBhbmQKKyAgIGBmbG9hdCcgaW4gdGhlIHByb3RvdHlwZSBmb3IgYE5BTUVmJy4gIFJlZW50cmFudCB2YXJpYW50IGZ1bmN0aW9ucyBhcmUKKyAgIGNhbGxlZCBgTkFNRV9yJyBhbmQgYE5BTUVmX3InLgorCisgICBGdW5jdGlvbnMgcmV0dXJuaW5nIG90aGVyIHR5cGVzIGxpa2UgYGludCcgYXJlIGRlY2xhcmVkIHVzaW5nIHRoZSBtYWNybzoKKworICAgX19NQVRIREVDTCAoVFlQRSwgTkFNRSxbX3JdLCAoQVJHUy4uLikpOworCisgICBUaGlzIGlzIGp1c3QgbGlrZSBfX01BVEhDQUxMIGJ1dCBmb3IgYSBmdW5jdGlvbiByZXR1cm5pbmcgYFRZUEUnCisgICBpbnN0ZWFkIG9mIGBfTWRvdWJsZV8nLiAgSW4gYWxsIG9mIHRoZXNlIGNhc2VzLCB0aGVyZSBpcyBzdGlsbAorICAgYm90aCBhIGBOQU1FJyBhbmQgYSBgTkFNRWYnIHRoYXQgdGFrZXMgYGZsb2F0JyBhcmd1bWVudHMuCisKKyAgIE5vdGUgdGhhdCB0aGVyZSBtdXN0IGJlIG5vIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBhcmd1bWVudCBwYXNzZWQgZm9yCisgICBOQU1FLCB0byBtYWtlIHRva2VuIHBhc3Rpbmcgd29yayB3aXRoIC10cmFkaXRpb25hbC4gICovCisKKyNpZm5kZWYgX01BVEhfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9tYXRoY2FsbHMuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPG1hdGguaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCisvKiBUcmlnb25vbWV0cmljIGZ1bmN0aW9ucy4gICovCisKK19NZG91YmxlX0JFR0lOX05BTUVTUEFDRQorLyogQXJjIGNvc2luZSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGFjb3MsLCAoX01kb3VibGVfIF9feCkpOworLyogQXJjIHNpbmUgb2YgWC4gICovCitfX01BVEhDQUxMIChhc2luLCwgKF9NZG91YmxlXyBfX3gpKTsKKy8qIEFyYyB0YW5nZW50IG9mIFguICAqLworX19NQVRIQ0FMTCAoYXRhbiwsIChfTWRvdWJsZV8gX194KSk7CisvKiBBcmMgdGFuZ2VudCBvZiBZL1guICAqLworX19NQVRIQ0FMTCAoYXRhbjIsLCAoX01kb3VibGVfIF9feSwgX01kb3VibGVfIF9feCkpOworCisvKiBDb3NpbmUgb2YgWC4gICovCitfX01BVEhDQUxMIChjb3MsLCAoX01kb3VibGVfIF9feCkpOworLyogU2luZSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKHNpbiwsIChfTWRvdWJsZV8gX194KSk7CisvKiBUYW5nZW50IG9mIFguICAqLworX19NQVRIQ0FMTCAodGFuLCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogSHlwZXJib2xpYyBmdW5jdGlvbnMuICAqLworCisvKiBIeXBlcmJvbGljIGNvc2luZSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGNvc2gsLCAoX01kb3VibGVfIF9feCkpOworLyogSHlwZXJib2xpYyBzaW5lIG9mIFguICAqLworX19NQVRIQ0FMTCAoc2luaCwsIChfTWRvdWJsZV8gX194KSk7CisvKiBIeXBlcmJvbGljIHRhbmdlbnQgb2YgWC4gICovCitfX01BVEhDQUxMICh0YW5oLCwgKF9NZG91YmxlXyBfX3gpKTsKK19NZG91YmxlX0VORF9OQU1FU1BBQ0UKKworI2lmZGVmIF9fVVNFX0dOVQorLyogQ29zaW5lIGFuZCBzaW5lIG9mIFguICAqLworX19NQVRIREVDTCAodm9pZCxzaW5jb3MsLAorCSAgICAoX01kb3VibGVfIF9feCwgX01kb3VibGVfICpfX3NpbngsIF9NZG91YmxlXyAqX19jb3N4KSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIEh5cGVyYm9saWMgYXJjIGNvc2luZSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGFjb3NoLCwgKF9NZG91YmxlXyBfX3gpKTsKKy8qIEh5cGVyYm9saWMgYXJjIHNpbmUgb2YgWC4gICovCitfX01BVEhDQUxMIChhc2luaCwsIChfTWRvdWJsZV8gX194KSk7CisvKiBIeXBlcmJvbGljIGFyYyB0YW5nZW50IG9mIFguICAqLworX19NQVRIQ0FMTCAoYXRhbmgsLCAoX01kb3VibGVfIF9feCkpOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKy8qIEV4cG9uZW50aWFsIGFuZCBsb2dhcml0aG1pYyBmdW5jdGlvbnMuICAqLworCitfTWRvdWJsZV9CRUdJTl9OQU1FU1BBQ0UKKy8qIEV4cG9uZW50aWFsIGZ1bmN0aW9uIG9mIFguICAqLworX19NQVRIQ0FMTCAoZXhwLCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogQnJlYWsgVkFMVUUgaW50byBhIG5vcm1hbGl6ZWQgZnJhY3Rpb24gYW5kIGFuIGludGVncmFsIHBvd2VyIG9mIDIuICAqLworX19NQVRIQ0FMTCAoZnJleHAsLCAoX01kb3VibGVfIF9feCwgaW50ICpfX2V4cG9uZW50KSk7CisKKy8qIFggdGltZXMgKHR3byB0byB0aGUgRVhQIHBvd2VyKS4gICovCitfX01BVEhDQUxMIChsZGV4cCwsIChfTWRvdWJsZV8gX194LCBpbnQgX19leHBvbmVudCkpOworCisvKiBOYXR1cmFsIGxvZ2FyaXRobSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGxvZywsIChfTWRvdWJsZV8gX194KSk7CisKKy8qIEJhc2UtdGVuIGxvZ2FyaXRobSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGxvZzEwLCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogQnJlYWsgVkFMVUUgaW50byBpbnRlZ3JhbCBhbmQgZnJhY3Rpb25hbCBwYXJ0cy4gICovCitfX01BVEhDQUxMIChtb2RmLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyAqX19pcHRyKSkKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fbm9ubnVsbF9fICgyKSkpOworX01kb3VibGVfRU5EX05BTUVTUEFDRQorCisjaWZkZWYgX19VU0VfR05VCisvKiBBIGZ1bmN0aW9uIG1pc3NpbmcgaW4gYWxsIHN0YW5kYXJkczogY29tcHV0ZSBleHBvbmVudCB0byBiYXNlIHRlbi4gICovCitfX01BVEhDQUxMIChleHAxMCwsIChfTWRvdWJsZV8gX194KSk7CisvKiBBbm90aGVyIG5hbWUgb2NjYXNpb25hbGx5IHVzZWQuICAqLworX19NQVRIQ0FMTCAocG93MTAsLCAoX01kb3VibGVfIF9feCkpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBSZXR1cm4gZXhwKFgpIC0gMS4gICovCitfX01BVEhDQUxMIChleHBtMSwsIChfTWRvdWJsZV8gX194KSk7CisKKy8qIFJldHVybiBsb2coMSArIFgpLiAgKi8KK19fTUFUSENBTEwgKGxvZzFwLCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogUmV0dXJuIHRoZSBiYXNlIDIgc2lnbmVkIGludGVncmFsIGV4cG9uZW50IG9mIFguICAqLworX19NQVRIQ0FMTCAobG9nYiwsIChfTWRvdWJsZV8gX194KSk7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBDb21wdXRlIGJhc2UtMiBleHBvbmVudGlhbCBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGV4cDIsLCAoX01kb3VibGVfIF9feCkpOworCisvKiBDb21wdXRlIGJhc2UtMiBsb2dhcml0aG0gb2YgWC4gICovCitfX01BVEhDQUxMIChsb2cyLCwgKF9NZG91YmxlXyBfX3gpKTsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisKKy8qIFBvd2VyIGZ1bmN0aW9ucy4gICovCisKK19NZG91YmxlX0JFR0lOX05BTUVTUEFDRQorLyogUmV0dXJuIFggdG8gdGhlIFkgcG93ZXIuICAqLworX19NQVRIQ0FMTCAocG93LCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3kpKTsKKworLyogUmV0dXJuIHRoZSBzcXVhcmUgcm9vdCBvZiBYLiAgKi8KK19fTUFUSENBTEwgKHNxcnQsLCAoX01kb3VibGVfIF9feCkpOworX01kb3VibGVfRU5EX05BTUVTUEFDRQorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogUmV0dXJuIGBzcXJ0KFgqWCArIFkqWSknLiAgKi8KK19fTUFUSENBTEwgKGh5cG90LCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3kpKTsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogUmV0dXJuIHRoZSBjdWJlIHJvb3Qgb2YgWC4gICovCitfX01BVEhDQUxMIChjYnJ0LCwgKF9NZG91YmxlXyBfX3gpKTsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisKKy8qIE5lYXJlc3QgaW50ZWdlciwgYWJzb2x1dGUgdmFsdWUsIGFuZCByZW1haW5kZXIgZnVuY3Rpb25zLiAgKi8KKworX01kb3VibGVfQkVHSU5fTkFNRVNQQUNFCisvKiBTbWFsbGVzdCBpbnRlZ3JhbCB2YWx1ZSBub3QgbGVzcyB0aGFuIFguICAqLworX19NQVRIQ0FMTFggKGNlaWwsLCAoX01kb3VibGVfIF9feCksIChfX2NvbnN0X18pKTsKKworLyogQWJzb2x1dGUgdmFsdWUgb2YgWC4gICovCitfX01BVEhDQUxMWCAoZmFicywsIChfTWRvdWJsZV8gX194KSwgKF9fY29uc3RfXykpOworCisvKiBMYXJnZXN0IGludGVnZXIgbm90IGdyZWF0ZXIgdGhhbiBYLiAgKi8KK19fTUFUSENBTExYIChmbG9vciwsIChfTWRvdWJsZV8gX194KSwgKF9fY29uc3RfXykpOworCisvKiBGbG9hdGluZy1wb2ludCBtb2R1bG8gcmVtYWluZGVyIG9mIFgvWS4gICovCitfX01BVEhDQUxMIChmbW9kLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3kpKTsKKworCisvKiBSZXR1cm4gMCBpZiBWQUxVRSBpcyBmaW5pdGUgb3IgTmFOLCArMSBpZiBpdAorICAgaXMgK0luZmluaXR5LCAtMSBpZiBpdCBpcyAtSW5maW5pdHkuICAqLworX19NQVRIREVDTF8xIChpbnQsX19pc2luZiwsIChfTWRvdWJsZV8gX192YWx1ZSkpIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworLyogUmV0dXJuIG5vbnplcm8gaWYgVkFMVUUgaXMgZmluaXRlIGFuZCBub3QgTmFOLiAgKi8KK19fTUFUSERFQ0xfMSAoaW50LF9fZmluaXRlLCwgKF9NZG91YmxlXyBfX3ZhbHVlKSkgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworX01kb3VibGVfRU5EX05BTUVTUEFDRQorCisjaWZkZWYgX19VU0VfTUlTQworLyogUmV0dXJuIDAgaWYgVkFMVUUgaXMgZmluaXRlIG9yIE5hTiwgKzEgaWYgaXQKKyAgIGlzICtJbmZpbml0eSwgLTEgaWYgaXQgaXMgLUluZmluaXR5LiAgKi8KK19fTUFUSERFQ0xfMSAoaW50LGlzaW5mLCwgKF9NZG91YmxlXyBfX3ZhbHVlKSkgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisvKiBSZXR1cm4gbm9uemVybyBpZiBWQUxVRSBpcyBmaW5pdGUgYW5kIG5vdCBOYU4uICAqLworX19NQVRIREVDTF8xIChpbnQsZmluaXRlLCwgKF9NZG91YmxlXyBfX3ZhbHVlKSkgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisvKiBSZXR1cm4gdGhlIHJlbWFpbmRlciBvZiBYL1kuICAqLworX19NQVRIQ0FMTCAoZHJlbSwsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gX195KSk7CisKKworLyogUmV0dXJuIHRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgWCBhZnRlciBkaXZpZGluZyBvdXQgYGlsb2diIChYKScuICAqLworX19NQVRIQ0FMTCAoc2lnbmlmaWNhbmQsLCAoX01kb3VibGVfIF9feCkpOworI2VuZGlmIC8qIFVzZSBtaXNjLiAgKi8KKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBSZXR1cm4gWCB3aXRoIGl0cyBzaWduZWQgY2hhbmdlZCB0byBZJ3MuICAqLworX19NQVRIQ0FMTFggKGNvcHlzaWduLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3kpLCAoX19jb25zdF9fKSk7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBSZXR1cm4gcmVwcmVzZW50YXRpb24gb2YgTmFOIGZvciBkb3VibGUgdHlwZS4gICovCitfX01BVEhDQUxMWCAobmFuLCwgKF9fY29uc3QgY2hhciAqX190YWdiKSwgKF9fY29uc3RfXykpOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKworLyogUmV0dXJuIG5vbnplcm8gaWYgVkFMVUUgaXMgbm90IGEgbnVtYmVyLiAgKi8KK19fTUFUSERFQ0xfMSAoaW50LF9faXNuYW4sLCAoX01kb3VibGVfIF9fdmFsdWUpKSBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorLyogUmV0dXJuIG5vbnplcm8gaWYgVkFMVUUgaXMgbm90IGEgbnVtYmVyLiAgKi8KK19fTUFUSERFQ0xfMSAoaW50LGlzbmFuLCwgKF9NZG91YmxlXyBfX3ZhbHVlKSkgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisvKiBCZXNzZWwgZnVuY3Rpb25zLiAgKi8KK19fTUFUSENBTEwgKGowLCwgKF9NZG91YmxlXykpOworX19NQVRIQ0FMTCAoajEsLCAoX01kb3VibGVfKSk7CitfX01BVEhDQUxMIChqbiwsIChpbnQsIF9NZG91YmxlXykpOworX19NQVRIQ0FMTCAoeTAsLCAoX01kb3VibGVfKSk7CitfX01BVEhDQUxMICh5MSwsIChfTWRvdWJsZV8pKTsKK19fTUFUSENBTEwgKHluLCwgKGludCwgX01kb3VibGVfKSk7CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogRXJyb3IgYW5kIGdhbW1hIGZ1bmN0aW9ucy4gICovCitfX01BVEhDQUxMIChlcmYsLCAoX01kb3VibGVfKSk7CitfX01BVEhDQUxMIChlcmZjLCwgKF9NZG91YmxlXykpOworX19NQVRIQ0FMTCAobGdhbW1hLCwgKF9NZG91YmxlXykpOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogVHJ1ZSBnYW1tYSBmdW5jdGlvbi4gICovCitfX01BVEhDQUxMICh0Z2FtbWEsLCAoX01kb3VibGVfKSk7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisvKiBPYnNvbGV0ZSBhbGlhcyBmb3IgYGxnYW1tYScuICAqLworX19NQVRIQ0FMTCAoZ2FtbWEsLCAoX01kb3VibGVfKSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIFJlZW50cmFudCB2ZXJzaW9uIG9mIGxnYW1tYS4gIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgZ2xvYmFsIHZhcmlhYmxlCisgICBgc2lnbmdhbScuICBUaGUgcmVlbnRyYW50IHZlcnNpb24gaW5zdGVhZCB0YWtlcyBhIHBvaW50ZXIgYW5kIHN0b3JlcworICAgdGhlIHZhbHVlIHRocm91Z2ggaXQuICAqLworX19NQVRIQ0FMTCAobGdhbW1hLF9yLCAoX01kb3VibGVfLCBpbnQgKl9fc2lnbmdhbXApKTsKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBSZXR1cm4gdGhlIGludGVnZXIgbmVhcmVzdCBYIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlCisgICBwcmV2YWlsaW5nIHJvdW5kaW5nIG1vZGUuICAqLworX19NQVRIQ0FMTCAocmludCwsIChfTWRvdWJsZV8gX194KSk7CisKKy8qIFJldHVybiBYICsgZXBzaWxvbiBpZiBYIDwgWSwgWCAtIGVwc2lsb24gaWYgWCA+IFkuICAqLworX19NQVRIQ0FMTFggKG5leHRhZnRlciwsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gX195KSwgKF9fY29uc3RfXykpOworIyBpZiBkZWZpbmVkIF9fVVNFX0lTT0M5OSAmJiAhZGVmaW5lZCBfX0xEQkxfQ09NUEFUCitfX01BVEhDQUxMWCAobmV4dHRvd2FyZCwsIChfTWRvdWJsZV8gX194LCBsb25nIGRvdWJsZSBfX3kpLCAoX19jb25zdF9fKSk7CisjIGVuZGlmCisKKy8qIFJldHVybiB0aGUgcmVtYWluZGVyIG9mIGludGVnZXIgZGl2aXNvbiBYIC8gWSB3aXRoIGluZmluaXRlIHByZWNpc2lvbi4gICovCitfX01BVEhDQUxMIChyZW1haW5kZXIsLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9feSkpOworCisjIGlmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorLyogUmV0dXJuIFggdGltZXMgKDIgdG8gdGhlIE50aCBwb3dlcikuICAqLworX19NQVRIQ0FMTCAoc2NhbGJuLCwgKF9NZG91YmxlXyBfX3gsIGludCBfX24pKTsKKyMgZW5kaWYKKworLyogUmV0dXJuIHRoZSBiaW5hcnkgZXhwb25lbnQgb2YgWCwgd2hpY2ggbXVzdCBiZSBub256ZXJvLiAgKi8KK19fTUFUSERFQ0wgKGludCxpbG9nYiwsIChfTWRvdWJsZV8gX194KSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0lTT0M5OQorLyogUmV0dXJuIFggdGltZXMgKDIgdG8gdGhlIE50aCBwb3dlcikuICAqLworX19NQVRIQ0FMTCAoc2NhbGJsbiwsIChfTWRvdWJsZV8gX194LCBsb25nIGludCBfX24pKTsKKworLyogUm91bmQgWCB0byBpbnRlZ3JhbCB2YWx1ZSBpbiBmbG9hdGluZy1wb2ludCBmb3JtYXQgdXNpbmcgY3VycmVudAorICAgcm91bmRpbmcgZGlyZWN0aW9uLCBidXQgZG8gbm90IHJhaXNlIGluZXhhY3QgZXhjZXB0aW9uLiAgKi8KK19fTUFUSENBTEwgKG5lYXJieWludCwsIChfTWRvdWJsZV8gX194KSk7CisKKy8qIFJvdW5kIFggdG8gbmVhcmVzdCBpbnRlZ3JhbCB2YWx1ZSwgcm91bmRpbmcgaGFsZndheSBjYXNlcyBhd2F5IGZyb20KKyAgIHplcm8uICAqLworX19NQVRIQ0FMTFggKHJvdW5kLCwgKF9NZG91YmxlXyBfX3gpLCAoX19jb25zdF9fKSk7CisKKy8qIFJvdW5kIFggdG8gdGhlIGludGVncmFsIHZhbHVlIGluIGZsb2F0aW5nLXBvaW50IGZvcm1hdCBuZWFyZXN0IGJ1dAorICAgbm90IGxhcmdlciBpbiBtYWduaXR1ZGUuICAqLworX19NQVRIQ0FMTFggKHRydW5jLCwgKF9NZG91YmxlXyBfX3gpLCAoX19jb25zdF9fKSk7CisKKy8qIENvbXB1dGUgcmVtYWluZGVyIG9mIFggYW5kIFkgYW5kIHB1dCBpbiAqUVVPIGEgdmFsdWUgd2l0aCBzaWduIG9mIHgveQorICAgYW5kIG1hZ25pdHVkZSBjb25ncnVlbnQgYG1vZCAyXm4nIHRvIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGludGVncmFsCisgICBxdW90aWVudCB4L3ksIHdpdGggbiA+PSAzLiAgKi8KK19fTUFUSENBTEwgKHJlbXF1bywsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gX195LCBpbnQgKl9fcXVvKSk7CisKKworLyogQ29udmVyc2lvbiBmdW5jdGlvbnMuICAqLworCisvKiBSb3VuZCBYIHRvIG5lYXJlc3QgaW50ZWdyYWwgdmFsdWUgYWNjb3JkaW5nIHRvIGN1cnJlbnQgcm91bmRpbmcKKyAgIGRpcmVjdGlvbi4gICovCitfX01BVEhERUNMIChsb25nIGludCxscmludCwsIChfTWRvdWJsZV8gX194KSk7CitfX01BVEhERUNMIChsb25nIGxvbmcgaW50LGxscmludCwsIChfTWRvdWJsZV8gX194KSk7CisKKy8qIFJvdW5kIFggdG8gbmVhcmVzdCBpbnRlZ3JhbCB2YWx1ZSwgcm91bmRpbmcgaGFsZndheSBjYXNlcyBhd2F5IGZyb20KKyAgIHplcm8uICAqLworX19NQVRIREVDTCAobG9uZyBpbnQsbHJvdW5kLCwgKF9NZG91YmxlXyBfX3gpKTsKK19fTUFUSERFQ0wgKGxvbmcgbG9uZyBpbnQsbGxyb3VuZCwsIChfTWRvdWJsZV8gX194KSk7CisKKworLyogUmV0dXJuIHBvc2l0aXZlIGRpZmZlcmVuY2UgYmV0d2VlbiBYIGFuZCBZLiAgKi8KK19fTUFUSENBTEwgKGZkaW0sLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9feSkpOworCisvKiBSZXR1cm4gbWF4aW11bSBudW1lcmljIHZhbHVlIGZyb20gWCBhbmQgWS4gICovCitfX01BVEhDQUxMIChmbWF4LCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3kpKTsKKworLyogUmV0dXJuIG1pbmltdW0gbnVtZXJpYyB2YWx1ZSBmcm9tIFggYW5kIFkuICAqLworX19NQVRIQ0FMTCAoZm1pbiwsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gX195KSk7CisKKworLyogQ2xhc3NpZnkgZ2l2ZW4gbnVtYmVyLiAgKi8KK19fTUFUSERFQ0xfMSAoaW50LCBfX2ZwY2xhc3NpZnksLCAoX01kb3VibGVfIF9fdmFsdWUpKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKy8qIFRlc3QgZm9yIG5lZ2F0aXZlIG51bWJlci4gICovCitfX01BVEhERUNMXzEgKGludCwgX19zaWduYml0LCwgKF9NZG91YmxlXyBfX3ZhbHVlKSkKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisKKy8qIE11bHRpcGx5LWFkZCBmdW5jdGlvbiBjb21wdXRlZCBhcyBhIHRlcm5hcnkgb3BlcmF0aW9uLiAgKi8KK19fTUFUSENBTEwgKGZtYSwsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gX195LCBfTWRvdWJsZV8gX196KSk7CisjZW5kaWYgLyogVXNlIElTTyBDOTkuICAqLworCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIFJldHVybiBYIHRpbWVzICgyIHRvIHRoZSBOdGggcG93ZXIpLiAgKi8KK19fTUFUSENBTEwgKHNjYWxiLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX24pKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbWF0aGRlZi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbWF0aGRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNDYzOTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9tYXRoZGVmLmgKQEAgLTAsMCArMSw2MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDA0LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWYgIWRlZmluZWQgX01BVEhfSCAmJiAhZGVmaW5lZCBfQ09NUExFWF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvbWF0aGRlZi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bWF0aC5oPiBpbnN0ZWFkIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0lTT0M5OSAmJiBkZWZpbmVkIF9NQVRIX0ggJiYgIWRlZmluZWQgX01BVEhfSF9NQVRIREVGCisjIGRlZmluZSBfTUFUSF9IX01BVEhERUYJMQorCisjIGluY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworIyBpZiBfX1dPUkRTSVpFID09IDY0IHx8IChkZWZpbmVkIF9fRkxUX0VWQUxfTUVUSE9EX18gJiYgX19GTFRfRVZBTF9NRVRIT0RfXyA9PSAwKQorLyogVGhlIHg4Ni02NCBhcmNoaXRlY3R1cmUgY29tcHV0ZXMgdmFsdWVzIHdpdGggdGhlIHByZWNpc3Npb24gb2YgdGhlCisgICB1c2VkIHR5cGUuICBTaW1pbGFybHkgZm9yIC1tMzIgLW1mcG1hdGg9c3NlLiAgKi8KK3R5cGVkZWYgZmxvYXQgZmxvYXRfdDsJCS8qIGBmbG9hdCcgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBhcyBgZmxvYXQnLiAgKi8KK3R5cGVkZWYgZG91YmxlIGRvdWJsZV90OwkvKiBgZG91YmxlJyBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkCisJCQkJICAgYXMgYGRvdWJsZScuICAqLworIyBlbHNlCisvKiBUaGUgaXg4NyBGUFVzIGV2YWx1YXRlIGFsbCB2YWx1ZXMgaW4gdGhlIDgwIGJpdCBmbG9hdGluZy1wb2ludCBmb3JtYXQKKyAgIHdoaWNoIGlzIGFsc28gYXZhaWxhYmxlIGZvciB0aGUgdXNlciBhcyBgbG9uZyBkb3VibGUnLiAgVGhlcmVmb3JlIHdlCisgICBkZWZpbmU6ICAqLwordHlwZWRlZiBsb25nIGRvdWJsZSBmbG9hdF90OwkvKiBgZmxvYXQnIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgYXMKKwkJCQkgICBgbG9uZyBkb3VibGUnLiAgKi8KK3R5cGVkZWYgbG9uZyBkb3VibGUgZG91YmxlX3Q7CS8qIGBkb3VibGUnIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgYXMKKwkJCQkgICBgbG9uZyBkb3VibGUnLiAgKi8KKyMgZW5kaWYKKworLyogVGhlIHZhbHVlcyByZXR1cm5lZCBieSBgaWxvZ2InIGZvciAwIGFuZCBOYU4gcmVzcGVjdGl2ZWx5LiAgKi8KKyMgZGVmaW5lIEZQX0lMT0dCMAkoLTIxNDc0ODM2NDcgLSAxKQorIyBkZWZpbmUgRlBfSUxPR0JOQU4JKC0yMTQ3NDgzNjQ3IC0gMSkKKworLyogVGhlIEdDQyA0LjYgY29tcGlsZXIgd2lsbCBkZWZpbmUgX19GUF9GQVNUX0ZNQXssRixMfSBpZiB0aGUgZm1heyxmLGx9CisgICBidWlsdGlucyBhcmUgc3VwcG9ydGVkLiAgKi8KKyMgaWYgX19GUF9GQVNUX0ZNQQorIyAgZGVmaW5lIEZQX0ZBU1RfRk1BIDEKKyMgZW5kaWYKKworIyBpZiBfX0ZQX0ZBU1RfRk1BRgorIyAgZGVmaW5lIEZQX0ZBU1RfRk1BRiAxCisjIGVuZGlmCisKKyMgaWYgX19GUF9GQVNUX0ZNQUwKKyMgIGRlZmluZSBGUF9GQVNUX0ZNQUwgMQorIyBlbmRpZgorCisjZW5kaWYJLyogSVNPIEM5OSAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbWF0aGlubGluZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbWF0aGlubGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMmMxZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9tYXRoaW5saW5lLmgKQEAgLTAsMCArMSwyMzQgQEAKKy8qIElubGluZSBtYXRoIGZ1bmN0aW9ucyBmb3IgeDg2LTY0LgorICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQsIDIwMDcsIDIwMDksIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01BVEhfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL21hdGhpbmxpbmUuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPG1hdGguaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworI2lmbmRlZiBfX2V4dGVybl9hbHdheXNfaW5saW5lCisjIGRlZmluZSBfX01BVEhfSU5MSU5FIF9faW5saW5lCisjZWxzZQorIyBkZWZpbmUgX19NQVRIX0lOTElORSBfX2V4dGVybl9hbHdheXNfaW5saW5lCisjZW5kaWYKKworCisvKiBUaGUgZ2NjLCB2ZXJzaW9uIDIuNyBvciBiZWxvdywgaGFzIHByb2JsZW1zIHdpdGggYWxsIHRoaXMgaW5saW5pbmcKKyAgIGNvZGUuICBTbyBkaXNhYmxlIGl0IGZvciB0aGlzIHZlcnNpb24gb2YgdGhlIGNvbXBpbGVyLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICgyLCA4KSAmJiBkZWZpbmVkIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisKKy8qIFRlc3QgZm9yIG5lZ2F0aXZlIG51bWJlci4gIFVzZWQgaW4gdGhlIHNpZ25iaXQoKSBtYWNyby4gICovCitfX01BVEhfSU5MSU5FIGludAorX19OVEggKF9fc2lnbmJpdGYgKGZsb2F0IF9feCkpCit7CisjIGlmIF9fV09SRFNJWkUgPT0gMzIKKyAgX19leHRlbnNpb25fXyB1bmlvbiB7IGZsb2F0IF9fZjsgaW50IF9faTsgfSBfX3UgPSB7IF9fZjogX194IH07CisgIHJldHVybiBfX3UuX19pIDwgMDsKKyMgZWxzZQorICBpbnQgX19tOworICBfX2FzbSAoInBtb3Ztc2tiICUxLCAlMCIgOiAiPXIiIChfX20pIDogIngiIChfX3gpKTsKKyAgcmV0dXJuIF9fbSAmIDB4ODsKKyMgZW5kaWYKK30KK19fTUFUSF9JTkxJTkUgaW50CitfX05USCAoX19zaWduYml0IChkb3VibGUgX194KSkKK3sKKyMgaWYgX19XT1JEU0laRSA9PSAzMgorICBfX2V4dGVuc2lvbl9fIHVuaW9uIHsgZG91YmxlIF9fZDsgaW50IF9faVsyXTsgfSBfX3UgPSB7IF9fZDogX194IH07CisgIHJldHVybiBfX3UuX19pWzFdIDwgMDsKKyMgZWxzZQorICBpbnQgX19tOworICBfX2FzbSAoInBtb3Ztc2tiICUxLCAlMCIgOiAiPXIiIChfX20pIDogIngiIChfX3gpKTsKKyAgcmV0dXJuIF9fbSAmIDB4ODA7CisjIGVuZGlmCit9CitfX01BVEhfSU5MSU5FIGludAorX19OVEggKF9fc2lnbmJpdGwgKGxvbmcgZG91YmxlIF9feCkpCit7CisgIF9fZXh0ZW5zaW9uX18gdW5pb24geyBsb25nIGRvdWJsZSBfX2w7IGludCBfX2lbM107IH0gX191ID0geyBfX2w6IF9feCB9OworICByZXR1cm4gKF9fdS5fX2lbMl0gJiAweDgwMDApICE9IDA7Cit9CisKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisKKyNpZiAoX19HTlVDX1BSRVJFUSAoMiwgOCkgJiYgIWRlZmluZWQgX19OT19NQVRIX0lOTElORVMgXAorICAgICAmJiBkZWZpbmVkIF9fT1BUSU1JWkVfXykKKworIyBpZmRlZiBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorCisvKiBSb3VuZCB0byBuZWFyZXN0IGludGVnZXIuICAqLworIyAgaWYgX19XT1JEU0laRSA9PSA2NCB8fCBkZWZpbmVkIF9fU1NFX01BVEhfXworX19NQVRIX0lOTElORSBsb25nIGludAorX19OVEggKGxyaW50ZiAoZmxvYXQgX194KSkKK3sKKyAgbG9uZyBpbnQgX19yZXM7CisgIF9fYXNtICgiY3Z0c3Myc2kgJTEsICUwIiA6ICI9ciIgKF9fcmVzKSA6ICJ4bSIgKF9feCkpOworICByZXR1cm4gX19yZXM7Cit9CisjICBlbmRpZgorIyAgaWYgX19XT1JEU0laRSA9PSA2NCB8fCBkZWZpbmVkIF9fU1NFMl9NQVRIX18KK19fTUFUSF9JTkxJTkUgbG9uZyBpbnQKK19fTlRIIChscmludCAoZG91YmxlIF9feCkpCit7CisgIGxvbmcgaW50IF9fcmVzOworICBfX2FzbSAoImN2dHNkMnNpICUxLCAlMCIgOiAiPXIiIChfX3JlcykgOiAieG0iIChfX3gpKTsKKyAgcmV0dXJuIF9fcmVzOworfQorIyAgZW5kaWYKKyMgIGlmIF9fV09SRFNJWkUgPT0gNjQKK19fTUFUSF9JTkxJTkUgbG9uZyBsb25nIGludAorX19OVEggKGxscmludGYgKGZsb2F0IF9feCkpCit7CisgIGxvbmcgbG9uZyBpbnQgX19yZXM7CisgIF9fYXNtICgiY3Z0c3Myc2kgJTEsICUwIiA6ICI9ciIgKF9fcmVzKSA6ICJ4bSIgKF9feCkpOworICByZXR1cm4gX19yZXM7Cit9CitfX01BVEhfSU5MSU5FIGxvbmcgbG9uZyBpbnQKK19fTlRIIChsbHJpbnQgKGRvdWJsZSBfX3gpKQoreworICBsb25nIGxvbmcgaW50IF9fcmVzOworICBfX2FzbSAoImN2dHNkMnNpICUxLCAlMCIgOiAiPXIiIChfX3JlcykgOiAieG0iIChfX3gpKTsKKyAgcmV0dXJuIF9fcmVzOworfQorIyAgZW5kaWYKKworIyAgaWYgZGVmaW5lZCBfX0ZJTklURV9NQVRIX09OTFlfXyAmJiBfX0ZJTklURV9NQVRIX09OTFlfXyA+IDAgXAorICAgICAgJiYgKF9fV09SRFNJWkUgPT0gNjQgfHwgZGVmaW5lZCBfX1NTRTJfTUFUSF9fKQorLyogRGV0ZXJtaW5lIG1heGltdW0gb2YgdHdvIHZhbHVlcy4gICovCitfX01BVEhfSU5MSU5FIGZsb2F0CitfX05USCAoZm1heGYgKGZsb2F0IF9feCwgZmxvYXQgX195KSkKK3sKKyAgX19hc20gKCJtYXhzcyAlMSwgJTAiIDogIit4IiAoX194KSA6ICJ4bSIgKF9feSkpOworICByZXR1cm4gX194OworfQorX19NQVRIX0lOTElORSBkb3VibGUKK19fTlRIIChmbWF4IChkb3VibGUgX194LCBkb3VibGUgX195KSkKK3sKKyAgX19hc20gKCJtYXhzZCAlMSwgJTAiIDogIit4IiAoX194KSA6ICJ4bSIgKF9feSkpOworICByZXR1cm4gX194OworfQorCisvKiBEZXRlcm1pbmUgbWluaW11bSBvZiB0d28gdmFsdWVzLiAgKi8KK19fTUFUSF9JTkxJTkUgZmxvYXQKK19fTlRIIChmbWluZiAoZmxvYXQgX194LCBmbG9hdCBfX3kpKQoreworICBfX2FzbSAoIm1pbnNzICUxLCAlMCIgOiAiK3giIChfX3gpIDogInhtIiAoX195KSk7CisgIHJldHVybiBfX3g7Cit9CitfX01BVEhfSU5MSU5FIGRvdWJsZQorX19OVEggKGZtaW4gKGRvdWJsZSBfX3gsIGRvdWJsZSBfX3kpKQoreworICBfX2FzbSAoIm1pbnNkICUxLCAlMCIgOiAiK3giIChfX3gpIDogInhtIiAoX195KSk7CisgIHJldHVybiBfX3g7Cit9CisjICBlbmRpZgorCitfX0VORF9OQU1FU1BBQ0VfQzk5CisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZCBfX1NTRTRfMV9fICYmIChfX1dPUkRTSVpFID09IDY0IHx8IGRlZmluZWQgX19TU0UyX01BVEhfXykKKyMgIGlmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKworLyogUm91bmQgdG8gbmVhcmVzdCBpbnRlZ2VyLiAgKi8KK19fTUFUSF9JTkxJTkUgZG91YmxlCitfX05USCAocmludCAoZG91YmxlIF9feCkpCit7CisgIGRvdWJsZSBfX3JlczsKKyAgX19hc20gKCJyb3VuZHNkICQ0LCAlMSwgJTAiIDogIj14IiAoX19yZXMpIDogInhtIiAoX194KSk7CisgIHJldHVybiBfX3JlczsKK30KK19fTUFUSF9JTkxJTkUgZmxvYXQKK19fTlRIIChyaW50ZiAoZmxvYXQgX194KSkKK3sKKyAgZmxvYXQgX19yZXM7CisgIF9fYXNtICgicm91bmRzcyAkNCwgJTEsICUwIiA6ICI9eCIgKF9fcmVzKSA6ICJ4bSIgKF9feCkpOworICByZXR1cm4gX19yZXM7Cit9CisKKyMgICBpZmRlZiBfX1VTRV9JU09DOTkKKy8qIFJvdW5kIHRvIG5lYXJlc3QgaW50ZWdlciB3aXRob3V0IHJhaXNpbmcgaW5leGFjdCBleGNlcHRpb24uICAqLworX19NQVRIX0lOTElORSBkb3VibGUKK19fTlRIIChuZWFyYnlpbnQgKGRvdWJsZSBfX3gpKQoreworICBkb3VibGUgX19yZXM7CisgIF9fYXNtICgicm91bmRzZCAkMHhjLCAlMSwgJTAiIDogIj14IiAoX19yZXMpIDogInhtIiAoX194KSk7CisgIHJldHVybiBfX3JlczsKK30KK19fTUFUSF9JTkxJTkUgZmxvYXQKK19fTlRIIChuZWFyYnlpbnRmIChmbG9hdCBfX3gpKQoreworICBmbG9hdCBfX3JlczsKKyAgX19hc20gKCJyb3VuZHNzICQweGMsICUxLCAlMCIgOiAiPXgiIChfX3JlcykgOiAieG0iIChfX3gpKTsKKyAgcmV0dXJuIF9fcmVzOworfQorIyAgIGVuZGlmCisKK19fRU5EX05BTUVTUEFDRV9DOTkKKyMgIGVuZGlmCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogU21hbGxlc3QgaW50ZWdyYWwgdmFsdWUgbm90IGxlc3MgdGhhbiBYLiAgKi8KK19fTUFUSF9JTkxJTkUgZG91YmxlCitfX05USCAoY2VpbCAoZG91YmxlIF9feCkpCit7CisgIGRvdWJsZSBfX3JlczsKKyAgX19hc20gKCJyb3VuZHNkICQyLCAlMSwgJTAiIDogIj14IiAoX19yZXMpIDogInhtIiAoX194KSk7CisgIHJldHVybiBfX3JlczsKK30KK19fRU5EX05BTUVTUEFDRV9TVEQKKworX19CRUdJTl9OQU1FU1BBQ0VfQzk5CitfX01BVEhfSU5MSU5FIGZsb2F0CitfX05USCAoY2VpbGYgKGZsb2F0IF9feCkpCit7CisgIGZsb2F0IF9fcmVzOworICBfX2FzbSAoInJvdW5kc3MgJDIsICUxLCAlMCIgOiAiPXgiIChfX3JlcykgOiAieG0iIChfX3gpKTsKKyAgcmV0dXJuIF9fcmVzOworfQorX19FTkRfTkFNRVNQQUNFX0M5OQorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIExhcmdlc3QgaW50ZWdlciBub3QgZ3JlYXRlciB0aGFuIFguICAqLworX19NQVRIX0lOTElORSBkb3VibGUKK19fTlRIIChmbG9vciAoZG91YmxlIF9feCkpCit7CisgIGRvdWJsZSBfX3JlczsKKyAgX19hc20gKCJyb3VuZHNkICQxLCAlMSwgJTAiIDogIj14IiAoX19yZXMpIDogInhtIiAoX194KSk7CisgIHJldHVybiBfX3JlczsKK30KK19fRU5EX05BTUVTUEFDRV9TVEQKKworX19CRUdJTl9OQU1FU1BBQ0VfQzk5CitfX01BVEhfSU5MSU5FIGZsb2F0CitfX05USCAoZmxvb3JmIChmbG9hdCBfX3gpKQoreworICBmbG9hdCBfX3JlczsKKyAgX19hc20gKCJyb3VuZHNzICQxLCAlMSwgJTAiIDogIj14IiAoX19yZXMpIDogInhtIiAoX194KSk7CisgIHJldHVybiBfX3JlczsKK30KK19fRU5EX05BTUVTUEFDRV9DOTkKKyMgZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9tbWFuLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyOTcxMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL21tYW4uaApAQCAtMCwwICsxLDExMiBAQAorLyogRGVmaW5pdGlvbnMgZm9yIFBPU0lYIG1lbW9yeSBtYXAgaW50ZXJmYWNlLiAgTGludXgveDg2XzY0IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMywyMDA1LDIwMDYsMjAwOSwyMDEwLDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfTU1BTl9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvbW1hbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8c3lzL21tYW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBiYXNpY2FsbHkgY29tZSBmcm9tIHRoZSBrZXJuZWwgaGVhZGVycy4KKyAgIEJ1dCB0aGUga2VybmVsIGhlYWRlciBpcyBub3QgbmFtZXNwYWNlIGNsZWFuLiAgKi8KKworCisvKiBQcm90ZWN0aW9ucyBhcmUgY2hvc2VuIGZyb20gdGhlc2UgYml0cywgT1InZCB0b2dldGhlci4gIFRoZQorICAgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgbmVjZXNzYXJpbHkgc3VwcG9ydCBQUk9UX0VYRUMgb3IgUFJPVF9XUklURQorICAgd2l0aG91dCBQUk9UX1JFQUQuICBUaGUgb25seSBndWFyYW50ZWVzIGFyZSB0aGF0IG5vIHdyaXRpbmcgd2lsbCBiZQorICAgYWxsb3dlZCB3aXRob3V0IFBST1RfV1JJVEUgYW5kIG5vIGFjY2VzcyB3aWxsIGJlIGFsbG93ZWQgZm9yIFBST1RfTk9ORS4gKi8KKworI2RlZmluZSBQUk9UX1JFQUQJMHgxCQkvKiBQYWdlIGNhbiBiZSByZWFkLiAgKi8KKyNkZWZpbmUgUFJPVF9XUklURQkweDIJCS8qIFBhZ2UgY2FuIGJlIHdyaXR0ZW4uICAqLworI2RlZmluZSBQUk9UX0VYRUMJMHg0CQkvKiBQYWdlIGNhbiBiZSBleGVjdXRlZC4gICovCisjZGVmaW5lIFBST1RfTk9ORQkweDAJCS8qIFBhZ2UgY2FuIG5vdCBiZSBhY2Nlc3NlZC4gICovCisjZGVmaW5lIFBST1RfR1JPV1NET1dOCTB4MDEwMDAwMDAJLyogRXh0ZW5kIGNoYW5nZSB0byBzdGFydCBvZgorCQkJCQkgICBncm93c2Rvd24gdm1hIChtcHJvdGVjdCBvbmx5KS4gICovCisjZGVmaW5lIFBST1RfR1JPV1NVUAkweDAyMDAwMDAwCS8qIEV4dGVuZCBjaGFuZ2UgdG8gc3RhcnQgb2YKKwkJCQkJICAgZ3Jvd3N1cCB2bWEgKG1wcm90ZWN0IG9ubHkpLiAgKi8KKworLyogU2hhcmluZyB0eXBlcyAobXVzdCBjaG9vc2Ugb25lIGFuZCBvbmx5IG9uZSBvZiB0aGVzZSkuICAqLworI2RlZmluZSBNQVBfU0hBUkVECTB4MDEJCS8qIFNoYXJlIGNoYW5nZXMuICAqLworI2RlZmluZSBNQVBfUFJJVkFURQkweDAyCQkvKiBDaGFuZ2VzIGFyZSBwcml2YXRlLiAgKi8KKyNpZmRlZiBfX1VTRV9NSVNDCisjIGRlZmluZSBNQVBfVFlQRQkweDBmCQkvKiBNYXNrIGZvciB0eXBlIG9mIG1hcHBpbmcuICAqLworI2VuZGlmCisKKy8qIE90aGVyIGZsYWdzLiAgKi8KKyNkZWZpbmUgTUFQX0ZJWEVECTB4MTAJCS8qIEludGVycHJldCBhZGRyIGV4YWN0bHkuICAqLworI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIE1BUF9GSUxFCTAKKyMgZGVmaW5lIE1BUF9BTk9OWU1PVVMJMHgyMAkJLyogRG9uJ3QgdXNlIGEgZmlsZS4gICovCisjIGRlZmluZSBNQVBfQU5PTglNQVBfQU5PTllNT1VTCisjIGRlZmluZSBNQVBfMzJCSVQJMHg0MAkJLyogT25seSBnaXZlIG91dCAzMi1iaXQgYWRkcmVzc2VzLiAgKi8KKyNlbmRpZgorCisvKiBUaGVzZSBhcmUgTGludXgtc3BlY2lmaWMuICAqLworI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIE1BUF9HUk9XU0RPV04JMHgwMDEwMAkJLyogU3RhY2stbGlrZSBzZWdtZW50LiAgKi8KKyMgZGVmaW5lIE1BUF9ERU5ZV1JJVEUJMHgwMDgwMAkJLyogRVRYVEJTWSAqLworIyBkZWZpbmUgTUFQX0VYRUNVVEFCTEUJMHgwMTAwMAkJLyogTWFyayBpdCBhcyBhbiBleGVjdXRhYmxlLiAgKi8KKyMgZGVmaW5lIE1BUF9MT0NLRUQJMHgwMjAwMAkJLyogTG9jayB0aGUgbWFwcGluZy4gICovCisjIGRlZmluZSBNQVBfTk9SRVNFUlZFCTB4MDQwMDAJCS8qIERvbid0IGNoZWNrIGZvciByZXNlcnZhdGlvbnMuICAqLworIyBkZWZpbmUgTUFQX1BPUFVMQVRFCTB4MDgwMDAJCS8qIFBvcHVsYXRlIChwcmVmYXVsdCkgcGFnZXRhYmxlcy4gICovCisjIGRlZmluZSBNQVBfTk9OQkxPQ0sJMHgxMDAwMAkJLyogRG8gbm90IGJsb2NrIG9uIElPLiAgKi8KKyMgZGVmaW5lIE1BUF9TVEFDSwkweDIwMDAwCQkvKiBBbGxvY2F0aW9uIGlzIGZvciBhIHN0YWNrLiAgKi8KKyMgZGVmaW5lIE1BUF9IVUdFVExCCTB4NDAwMDAJCS8qIENyZWF0ZSBodWdlIHBhZ2UgbWFwcGluZy4gICovCisjZW5kaWYKKworLyogRmxhZ3MgdG8gYG1zeW5jJy4gICovCisjZGVmaW5lIE1TX0FTWU5DCTEJCS8qIFN5bmMgbWVtb3J5IGFzeW5jaHJvbm91c2x5LiAgKi8KKyNkZWZpbmUgTVNfU1lOQwkJNAkJLyogU3luY2hyb25vdXMgbWVtb3J5IHN5bmMuICAqLworI2RlZmluZSBNU19JTlZBTElEQVRFCTIJCS8qIEludmFsaWRhdGUgdGhlIGNhY2hlcy4gICovCisKKy8qIEZsYWdzIGZvciBgbWxvY2thbGwnLiAgKi8KKyNkZWZpbmUgTUNMX0NVUlJFTlQJMQkJLyogTG9jayBhbGwgY3VycmVudGx5IG1hcHBlZCBwYWdlcy4gICovCisjZGVmaW5lIE1DTF9GVVRVUkUJMgkJLyogTG9jayBhbGwgYWRkaXRpb25zIHRvIGFkZHJlc3MKKwkJCQkJICAgc3BhY2UuICAqLworCisvKiBGbGFncyBmb3IgYG1yZW1hcCcuICAqLworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgTVJFTUFQX01BWU1PVkUJMQorIyBkZWZpbmUgTVJFTUFQX0ZJWEVECTIKKyNlbmRpZgorCisvKiBBZHZpY2UgdG8gYG1hZHZpc2UnLiAgKi8KKyNpZmRlZiBfX1VTRV9CU0QKKyMgZGVmaW5lIE1BRFZfTk9STUFMCSAgMAkvKiBObyBmdXJ0aGVyIHNwZWNpYWwgdHJlYXRtZW50LiAgKi8KKyMgZGVmaW5lIE1BRFZfUkFORE9NCSAgMQkvKiBFeHBlY3QgcmFuZG9tIHBhZ2UgcmVmZXJlbmNlcy4gICovCisjIGRlZmluZSBNQURWX1NFUVVFTlRJQUwgIDIJLyogRXhwZWN0IHNlcXVlbnRpYWwgcGFnZSByZWZlcmVuY2VzLiAgKi8KKyMgZGVmaW5lIE1BRFZfV0lMTE5FRUQJICAzCS8qIFdpbGwgbmVlZCB0aGVzZSBwYWdlcy4gICovCisjIGRlZmluZSBNQURWX0RPTlRORUVECSAgNAkvKiBEb24ndCBuZWVkIHRoZXNlIHBhZ2VzLiAgKi8KKyMgZGVmaW5lIE1BRFZfUkVNT1ZFCSAgOQkvKiBSZW1vdmUgdGhlc2UgcGFnZXMgYW5kIHJlc291cmNlcy4gICovCisjIGRlZmluZSBNQURWX0RPTlRGT1JLCSAgMTAJLyogRG8gbm90IGluaGVyaXQgYWNyb3NzIGZvcmsuICAqLworIyBkZWZpbmUgTUFEVl9ET0ZPUksJICAxMQkvKiBEbyBpbmhlcml0IGFjcm9zcyBmb3JrLiAgKi8KKyMgZGVmaW5lIE1BRFZfTUVSR0VBQkxFCSAgMTIJLyogS1NNIG1heSBtZXJnZSBpZGVudGljYWwgcGFnZXMuICAqLworIyBkZWZpbmUgTUFEVl9VTk1FUkdFQUJMRSAxMwkvKiBLU00gbWF5IG5vdCBtZXJnZSBpZGVudGljYWwgcGFnZXMuICAqLworIyBkZWZpbmUgTUFEVl9IVUdFUEFHRQkgIDE0CS8qIFdvcnRoIGJhY2tpbmcgd2l0aCBodWdlcGFnZXMuICAqLworIyBkZWZpbmUgTUFEVl9OT0hVR0VQQUdFICAxNQkvKiBOb3Qgd29ydGggYmFja2luZyB3aXRoIGh1Z2VwYWdlcy4gICovCisjIGRlZmluZSBNQURWX0hXUE9JU09OCSAgMTAwCS8qIFBvaXNvbiBhIHBhZ2UgZm9yIHRlc3RpbmcuICAqLworI2VuZGlmCisKKy8qIFRoZSBQT1NJWCBwZW9wbGUgaGFkIHRvIGludmVudCBzaW1pbGFyIG5hbWVzIGZvciB0aGUgc2FtZSB0aGluZ3MuICAqLworI2lmZGVmIF9fVVNFX1hPUEVOMksKKyMgZGVmaW5lIFBPU0lYX01BRFZfTk9STUFMCTAgLyogTm8gZnVydGhlciBzcGVjaWFsIHRyZWF0bWVudC4gICovCisjIGRlZmluZSBQT1NJWF9NQURWX1JBTkRPTQkxIC8qIEV4cGVjdCByYW5kb20gcGFnZSByZWZlcmVuY2VzLiAgKi8KKyMgZGVmaW5lIFBPU0lYX01BRFZfU0VRVUVOVElBTAkyIC8qIEV4cGVjdCBzZXF1ZW50aWFsIHBhZ2UgcmVmZXJlbmNlcy4gICovCisjIGRlZmluZSBQT1NJWF9NQURWX1dJTExORUVECTMgLyogV2lsbCBuZWVkIHRoZXNlIHBhZ2VzLiAgKi8KKyMgZGVmaW5lIFBPU0lYX01BRFZfRE9OVE5FRUQJNCAvKiBEb24ndCBuZWVkIHRoZXNlIHBhZ2VzLiAgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbW9uZXRhcnktbGRibC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbW9uZXRhcnktbGRibC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMDgwZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9tb25ldGFyeS1sZGJsLmgKQEAgLTAsMCArMSwyOCBAQAorLyogLW1sb25nLWRvdWJsZS02NCBjb21wYXRpYmlsaXR5IG1vZGUgZm9yIG1vbmV0YXJ5IGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTU9ORVRBUllfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9tb25ldGFyeS1sZGJsLmg+IGRpcmVjdGx5OyB1c2UgPG1vbmV0YXJ5Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKK19fTERCTF9SRURJUl9ERUNMIChzdHJmbW9uKQorCisjaWZkZWYgX19VU0VfR05VCitfX0xEQkxfUkVESVJfREVDTCAoc3RyZm1vbl9sKQorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9tcXVldWUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL21xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTI4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9tcXVldWUuaApAQCAtMCwwICsxLDMyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01RVUVVRV9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvbXF1ZXVlLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxtcXVldWUuaD4gaW5zdGVhZC4iCisjZW5kaWYKKwordHlwZWRlZiBpbnQgbXFkX3Q7CisKK3N0cnVjdCBtcV9hdHRyCit7CisgIGxvbmcgaW50IG1xX2ZsYWdzOwkvKiBNZXNzYWdlIHF1ZXVlIGZsYWdzLiAgKi8KKyAgbG9uZyBpbnQgbXFfbWF4bXNnOwkvKiBNYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcy4gICovCisgIGxvbmcgaW50IG1xX21zZ3NpemU7CS8qIE1heGltdW0gbWVzc2FnZSBzaXplLiAgKi8KKyAgbG9uZyBpbnQgbXFfY3VybXNnczsJLyogTnVtYmVyIG9mIG1lc3NhZ2VzIGN1cnJlbnRseSBxdWV1ZWQuICAqLworICBsb25nIGludCBfX3BhZFs0XTsKK307CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9tcXVldWUyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9tcXVldWUyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZkMDgxNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL21xdWV1ZTIuaApAQCAtMCwwICsxLDU4IEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIG1xIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNywgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfRkNOVExfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9tcXVldWUyLmg+IGRpcmVjdGx5OyB1c2UgPG1xdWV1ZS5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBDaGVjayB0aGF0IGNhbGxzIHRvIG1xX29wZW4gd2l0aCBPX0NSRUFUIHNldCBoYXZlIGFuIGFwcHJvcHJpYXRlIHRoaXJkIGFuZCBmb3VydGgKKyAgIHBhcmFtZXRlci4gICovCitleHRlcm4gbXFkX3QgbXFfb3BlbiAoX19jb25zdCBjaGFyICpfX25hbWUsIGludCBfX29mbGFnLCAuLi4pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworZXh0ZXJuIG1xZF90IF9fbXFfb3Blbl8yIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgaW50IF9fb2ZsYWcpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworZXh0ZXJuIG1xZF90IF9fUkVESVJFQ1RfTlRIIChfX21xX29wZW5fYWxpYXMsIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwKKwkJCQkJICAgICAgIGludCBfX29mbGFnLCAuLi4pLCBtcV9vcGVuKQorICAgICBfX25vbm51bGwgKCgxKSk7CitfX2Vycm9yZGVjbCAoX19tcV9vcGVuX3dyb25nX251bWJlcl9vZl9hcmdzLAorCSAgICAgIm1xX29wZW4gY2FuIGJlIGNhbGxlZCBlaXRoZXIgd2l0aCAyIG9yIDQgYXJndW1lbnRzIik7CitfX2Vycm9yZGVjbCAoX19tcV9vcGVuX21pc3NpbmdfbW9kZV9hbmRfYXR0ciwKKwkgICAgICJtcV9vcGVuIHdpdGggT19DUkVBVCBpbiBzZWNvbmQgYXJndW1lbnQgbmVlZHMgNCBhcmd1bWVudHMiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBtcWRfdAorX19OVEggKG1xX29wZW4gKF9fY29uc3QgY2hhciAqX19uYW1lLCBpbnQgX19vZmxhZywgLi4uKSkKK3sKKyAgaWYgKF9fdmFfYXJnX3BhY2tfbGVuICgpICE9IDAgJiYgX192YV9hcmdfcGFja19sZW4gKCkgIT0gMikKKyAgICBfX21xX29wZW5fd3JvbmdfbnVtYmVyX29mX2FyZ3MgKCk7CisKKyAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX29mbGFnKSkKKyAgICB7CisgICAgICBpZiAoKF9fb2ZsYWcgJiBPX0NSRUFUKSAhPSAwICYmIF9fdmFfYXJnX3BhY2tfbGVuICgpID09IDApCisJeworCSAgX19tcV9vcGVuX21pc3NpbmdfbW9kZV9hbmRfYXR0ciAoKTsKKwkgIHJldHVybiBfX21xX29wZW5fMiAoX19uYW1lLCBfX29mbGFnKTsKKwl9CisgICAgICByZXR1cm4gX19tcV9vcGVuX2FsaWFzIChfX25hbWUsIF9fb2ZsYWcsIF9fdmFfYXJnX3BhY2sgKCkpOworICAgIH0KKworICBpZiAoX192YV9hcmdfcGFja19sZW4gKCkgPT0gMCkKKyAgICByZXR1cm4gX19tcV9vcGVuXzIgKF9fbmFtZSwgX19vZmxhZyk7CisKKyAgcmV0dXJuIF9fbXFfb3Blbl9hbGlhcyAoX19uYW1lLCBfX29mbGFnLCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL21zcS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbXNxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIyMjE4YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL21zcS5oCkBAIC0wLDAgKzEsODMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMjAwMCwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX01TR19ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvbXNxLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzeXMvbXNnLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisvKiBEZWZpbmUgb3B0aW9ucyBmb3IgbWVzc2FnZSBxdWV1ZSBmdW5jdGlvbnMuICAqLworI2RlZmluZSBNU0dfTk9FUlJPUgkwMTAwMDAJLyogbm8gZXJyb3IgaWYgbWVzc2FnZSBpcyB0b28gYmlnICovCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBNU0dfRVhDRVBUCTAyMDAwMAkvKiByZWN2IGFueSBtc2cgZXhjZXB0IG9mIHNwZWNpZmllZCB0eXBlICovCisjZW5kaWYKKworLyogVHlwZXMgdXNlZCBpbiB0aGUgc3RydWN0dXJlIGRlZmluaXRpb24uICAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBtc2dxbnVtX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IG1zZ2xlbl90OworCisvKiBTdHJ1Y3R1cmUgb2YgcmVjb3JkIGZvciBvbmUgbWVzc2FnZSBpbnNpZGUgdGhlIGtlcm5lbC4KKyAgIFRoZSB0eXBlIGBzdHJ1Y3QgbXNnJyBpcyBvcGFxdWUuICAqLworc3RydWN0IG1zcWlkX2RzCit7CisgIHN0cnVjdCBpcGNfcGVybSBtc2dfcGVybTsJLyogc3RydWN0dXJlIGRlc2NyaWJpbmcgb3BlcmF0aW9uIHBlcm1pc3Npb24gKi8KKyAgX190aW1lX3QgbXNnX3N0aW1lOwkJLyogdGltZSBvZiBsYXN0IG1zZ3NuZCBjb21tYW5kICovCisjaWYgX19XT1JEU0laRSA9PSAzMgorICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDE7CisjZW5kaWYKKyAgX190aW1lX3QgbXNnX3J0aW1lOwkJLyogdGltZSBvZiBsYXN0IG1zZ3JjdiBjb21tYW5kICovCisjaWYgX19XT1JEU0laRSA9PSAzMgorICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDI7CisjZW5kaWYKKyAgX190aW1lX3QgbXNnX2N0aW1lOwkJLyogdGltZSBvZiBsYXN0IGNoYW5nZSAqLworI2lmIF9fV09SRFNJWkUgPT0gMzIKKyAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQzOworI2VuZGlmCisgIHVuc2lnbmVkIGxvbmcgaW50IF9fbXNnX2NieXRlczsgLyogY3VycmVudCBudW1iZXIgb2YgYnl0ZXMgb24gcXVldWUgKi8KKyAgbXNncW51bV90IG1zZ19xbnVtOwkJLyogbnVtYmVyIG9mIG1lc3NhZ2VzIGN1cnJlbnRseSBvbiBxdWV1ZSAqLworICBtc2dsZW5fdCBtc2dfcWJ5dGVzOwkJLyogbWF4IG51bWJlciBvZiBieXRlcyBhbGxvd2VkIG9uIHF1ZXVlICovCisgIF9fcGlkX3QgbXNnX2xzcGlkOwkJLyogcGlkIG9mIGxhc3QgbXNnc25kKCkgKi8KKyAgX19waWRfdCBtc2dfbHJwaWQ7CQkvKiBwaWQgb2YgbGFzdCBtc2dyY3YoKSAqLworICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDQ7CisgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkNTsKK307CisKKyNpZmRlZiBfX1VTRV9NSVNDCisKKyMgZGVmaW5lIG1zZ19jYnl0ZXMJX19tc2dfY2J5dGVzCisKKy8qIGlwY3MgY3RsIGNvbW1hbmRzICovCisjIGRlZmluZSBNU0dfU1RBVCAxMQorIyBkZWZpbmUgTVNHX0lORk8gMTIKKworLyogYnVmZmVyIGZvciBtc2djdGwgY2FsbHMgSVBDX0lORk8sIE1TR19JTkZPICovCitzdHJ1Y3QgbXNnaW5mbworICB7CisgICAgaW50IG1zZ3Bvb2w7CisgICAgaW50IG1zZ21hcDsKKyAgICBpbnQgbXNnbWF4OworICAgIGludCBtc2dtbmI7CisgICAgaW50IG1zZ21uaTsKKyAgICBpbnQgbXNnc3N6OworICAgIGludCBtc2d0cWw7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IG1zZ3NlZzsKKyAgfTsKKworI2VuZGlmIC8qIF9fVVNFX01JU0MgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL25hbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbmFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlOTdmMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL25hbi5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIGBOQU4nIGNvbnN0YW50IGZvciBJRUVFIDc1NCBtYWNoaW5lcy4KKyAgIENvcHlyaWdodCAoQykgMTk5MiwxOTk2LDE5OTcsMTk5OSwyMDA0LDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01BVEhfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL25hbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bWF0aC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisKKy8qIElFRUUgTm90IEEgTnVtYmVyLiAgKi8KKworI2lmIF9fR05VQ19QUkVSRVEoMywzKQorCisjIGRlZmluZSBOQU4JKF9fYnVpbHRpbl9uYW5mICgiIikpCisKKyNlbGlmIGRlZmluZWQgX19HTlVDX18KKworIyBkZWZpbmUgTkFOIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKCh1bmlvbiB7IHVuc2lnbmVkIF9fbCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fU0lfXykpKTsgZmxvYXQgX19kOyB9KSAgXAorICAgIHsgX19sOiAweDdmYzAwMDAwVUwgfSkuX19kKQorCisjZWxzZQorCisjIGluY2x1ZGUgPGVuZGlhbi5oPgorCisjIGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyMgIGRlZmluZSBfX25hbl9ieXRlcwkJeyAweDdmLCAweGMwLCAwLCAwIH0KKyMgZW5kaWYKKyMgaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorIyAgZGVmaW5lIF9fbmFuX2J5dGVzCQl7IDAsIDAsIDB4YzAsIDB4N2YgfQorIyBlbmRpZgorCitzdGF0aWMgdW5pb24geyB1bnNpZ25lZCBjaGFyIF9fY1s0XTsgZmxvYXQgX19kOyB9IF9fbmFuX3VuaW9uCisgICAgX19hdHRyaWJ1dGVfdXNlZF9fID0geyBfX25hbl9ieXRlcyB9OworIyBkZWZpbmUgTkFOCShfX25hbl91bmlvbi5fX2QpCisKKyNlbmRpZgkvKiBHQ0MuICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvbmV0ZGIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL25ldGRiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFkYzczMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL25ldGRiLmgKQEAgLTAsMCArMSwzMyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9ORVREQl9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL25ldGRiLmg+IGRpcmVjdGx5OyB1c2UgPG5ldGRiLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKworLyogRGVzY3JpcHRpb24gb2YgZGF0YSBiYXNlIGVudHJ5IGZvciBhIHNpbmdsZSBuZXR3b3JrLiAgTk9URTogaGVyZSBhCisgICBwb29yIGFzc3VtcHRpb24gaXMgbWFkZS4gIFRoZSBuZXR3b3JrIG51bWJlciBpcyBleHBlY3RlZCB0byBmaXQKKyAgIGludG8gYW4gdW5zaWduZWQgbG9uZyBpbnQgdmFyaWFibGUuICAqLworc3RydWN0IG5ldGVudAoreworICBjaGFyICpuX25hbWU7CQkJLyogT2ZmaWNpYWwgbmFtZSBvZiBuZXR3b3JrLiAgKi8KKyAgY2hhciAqKm5fYWxpYXNlczsJCS8qIEFsaWFzIGxpc3QuICAqLworICBpbnQgbl9hZGRydHlwZTsJCS8qIE5ldCBhZGRyZXNzIHR5cGUuICAqLworICB1aW50MzJfdCBuX25ldDsJCS8qIE5ldHdvcmsgbnVtYmVyLiAgKi8KK307CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9wb2xsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9wb2xsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkNzVjYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3BvbGwuaApAQCAtMCwwICsxLDUwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDIwMDEsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19QT0xMX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9wb2xsLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzeXMvcG9sbC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBFdmVudCB0eXBlcyB0aGF0IGNhbiBiZSBwb2xsZWQgZm9yLiAgVGhlc2UgYml0cyBtYXkgYmUgc2V0IGluIGBldmVudHMnCisgICB0byBpbmRpY2F0ZSB0aGUgaW50ZXJlc3RpbmcgZXZlbnQgdHlwZXM7IHRoZXkgd2lsbCBhcHBlYXIgaW4gYHJldmVudHMnCisgICB0byBpbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IuICAqLworI2RlZmluZSBQT0xMSU4JCTB4MDAxCQkvKiBUaGVyZSBpcyBkYXRhIHRvIHJlYWQuICAqLworI2RlZmluZSBQT0xMUFJJCQkweDAwMgkJLyogVGhlcmUgaXMgdXJnZW50IGRhdGEgdG8gcmVhZC4gICovCisjZGVmaW5lIFBPTExPVVQJCTB4MDA0CQkvKiBXcml0aW5nIG5vdyB3aWxsIG5vdCBibG9jay4gICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKy8qIFRoZXNlIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiBYUEc0LjIuICAqLworIyBkZWZpbmUgUE9MTFJETk9STQkweDA0MAkJLyogTm9ybWFsIGRhdGEgbWF5IGJlIHJlYWQuICAqLworIyBkZWZpbmUgUE9MTFJEQkFORAkweDA4MAkJLyogUHJpb3JpdHkgZGF0YSBtYXkgYmUgcmVhZC4gICovCisjIGRlZmluZSBQT0xMV1JOT1JNCTB4MTAwCQkvKiBXcml0aW5nIG5vdyB3aWxsIG5vdCBibG9jay4gICovCisjIGRlZmluZSBQT0xMV1JCQU5ECTB4MjAwCQkvKiBQcmlvcml0eSBkYXRhIG1heSBiZSB3cml0dGVuLiAgKi8KKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisvKiBUaGVzZSBhcmUgZXh0ZW5zaW9ucyBmb3IgTGludXguICAqLworIyBkZWZpbmUgUE9MTE1TRwkweDQwMAorIyBkZWZpbmUgUE9MTFJFTU9WRQkweDEwMDAKKyMgZGVmaW5lIFBPTExSREhVUAkweDIwMDAKKyNlbmRpZgorCisvKiBFdmVudCB0eXBlcyBhbHdheXMgaW1wbGljaXRseSBwb2xsZWQgZm9yLiAgVGhlc2UgYml0cyBuZWVkIG5vdCBiZSBzZXQgaW4KKyAgIGBldmVudHMnLCBidXQgdGhleSB3aWxsIGFwcGVhciBpbiBgcmV2ZW50cycgdG8gaW5kaWNhdGUgdGhlIHN0YXR1cyBvZgorICAgdGhlIGZpbGUgZGVzY3JpcHRvci4gICovCisjZGVmaW5lIFBPTExFUlIJCTB4MDA4CQkvKiBFcnJvciBjb25kaXRpb24uICAqLworI2RlZmluZSBQT0xMSFVQCQkweDAxMAkJLyogSHVuZyB1cC4gICovCisjZGVmaW5lIFBPTExOVkFMCTB4MDIwCQkvKiBJbnZhbGlkIHBvbGxpbmcgcmVxdWVzdC4gICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9wb3NpeDFfbGltLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9wb3NpeDFfbGltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlYjQzMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3Bvc2l4MV9saW0uaApAQCAtMCwwICsxLDE3MiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTMsOTYsOTgsMjAwMC0yMDAzLDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglQT1NJWCBTdGFuZGFyZDogMi45LjIgTWluaW11bSBWYWx1ZXMJQWRkZWQgdG8gPGxpbWl0cy5oPgorICoKKyAqCU5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5OyB1c2UgPGxpbWl0cy5oPiBpbnN0ZWFkLgorICovCisKKyNpZm5kZWYJX0JJVFNfUE9TSVgxX0xJTV9ICisjZGVmaW5lCV9CSVRTX1BPU0lYMV9MSU1fSAkxCisKKworLyogVGhlc2UgYXJlIHRoZSBzdGFuZGFyZC1tYW5kYXRlZCBtaW5pbXVtIHZhbHVlcy4gICovCisKKy8qIE1pbmltdW0gbnVtYmVyIG9mIG9wZXJhdGlvbnMgaW4gb25lIGxpc3QgSS9PIGNhbGwuICAqLworI2RlZmluZSBfUE9TSVhfQUlPX0xJU1RJT19NQVgJMgorCisvKiBNaW5pbWFsIG51bWJlciBvZiBvdXRzdGFuZGluZyBhc3luY2hyb25vdXMgSS9PIG9wZXJhdGlvbnMuICAqLworI2RlZmluZSBfUE9TSVhfQUlPX01BWAkJMQorCisvKiBNYXhpbXVtIGxlbmd0aCBvZiBhcmd1bWVudHMgdG8gYGV4ZWN2ZScsIGluY2x1ZGluZyBlbnZpcm9ubWVudC4gICovCisjZGVmaW5lCV9QT1NJWF9BUkdfTUFYCQk0MDk2CisKKy8qIE1heGltdW0gc2ltdWx0YW5lb3VzIHByb2Nlc3NlcyBwZXIgcmVhbCB1c2VyIElELiAgKi8KKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisjIGRlZmluZSBfUE9TSVhfQ0hJTERfTUFYCTI1CisjZWxzZQorIyBkZWZpbmUgX1BPU0lYX0NISUxEX01BWAk2CisjZW5kaWYKKworLyogTWluaW1hbCBudW1iZXIgb2YgdGltZXIgZXhwaXJhdGlvbiBvdmVycnVucy4gICovCisjZGVmaW5lIF9QT1NJWF9ERUxBWVRJTUVSX01BWAkzMgorCisvKiBNYXhpbXVtIGxlbmd0aCBvZiBhIGhvc3QgbmFtZSAobm90IGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgbnVsbCkKKyAgIGFzIHJldHVybmVkIGZyb20gdGhlIEdFVEhPU1ROQU1FIGZ1bmN0aW9uLiAgKi8KKyNkZWZpbmUgX1BPU0lYX0hPU1RfTkFNRV9NQVgJMjU1CisKKy8qIE1heGltdW0gbGluayBjb3VudCBvZiBhIGZpbGUuICAqLworI2RlZmluZQlfUE9TSVhfTElOS19NQVgJCTgKKworLyogTWF4aW11bSBsZW5ndGggb2YgbG9naW4gbmFtZS4gICovCisjZGVmaW5lCV9QT1NJWF9MT0dJTl9OQU1FX01BWAk5CisKKy8qIE51bWJlciBvZiBieXRlcyBpbiBhIHRlcm1pbmFsIGNhbm9uaWNhbCBpbnB1dCBxdWV1ZS4gICovCisjZGVmaW5lCV9QT1NJWF9NQVhfQ0FOT04JMjU1CisKKy8qIE51bWJlciBvZiBieXRlcyBmb3Igd2hpY2ggc3BhY2Ugd2lsbCBiZQorICAgYXZhaWxhYmxlIGluIGEgdGVybWluYWwgaW5wdXQgcXVldWUuICAqLworI2RlZmluZQlfUE9TSVhfTUFYX0lOUFVUCTI1NQorCisvKiBNYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlIHF1ZXVlcyBvcGVuIGZvciBhIHByb2Nlc3MuICAqLworI2RlZmluZSBfUE9TSVhfTVFfT1BFTl9NQVgJOAorCisvKiBNYXhpbXVtIG51bWJlciBvZiBzdXBwb3J0ZWQgbWVzc2FnZSBwcmlvcml0aWVzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX01RX1BSSU9fTUFYCTMyCisKKy8qIE51bWJlciBvZiBieXRlcyBpbiBhIGZpbGVuYW1lLiAgKi8KKyNkZWZpbmUJX1BPU0lYX05BTUVfTUFYCQkxNAorCisvKiBOdW1iZXIgb2Ygc2ltdWx0YW5lb3VzIHN1cHBsZW1lbnRhcnkgZ3JvdXAgSURzIHBlciBwcm9jZXNzLiAgKi8KKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisjIGRlZmluZSBfUE9TSVhfTkdST1VQU19NQVgJOAorI2Vsc2UKKyMgZGVmaW5lIF9QT1NJWF9OR1JPVVBTX01BWAkwCisjZW5kaWYKKworLyogTnVtYmVyIG9mIGZpbGVzIG9uZSBwcm9jZXNzIGNhbiBoYXZlIG9wZW4gYXQgb25jZS4gICovCisjaWZkZWYgX19VU0VfWE9QRU4ySworIyBkZWZpbmUgX1BPU0lYX09QRU5fTUFYCTIwCisjZWxzZQorIyBkZWZpbmUgX1BPU0lYX09QRU5fTUFYCTE2CisjZW5kaWYKKworI2lmICFkZWZpbmVkIF9fVVNFX1hPUEVOMksgfHwgZGVmaW5lZCBfX1VTRV9HTlUKKy8qIE51bWJlciBvZiBkZXNjcmlwdG9ycyB0aGF0IGEgcHJvY2VzcyBtYXkgZXhhbWluZSB3aXRoIGBwc2VsZWN0JyBvcgorICAgYHNlbGVjdCcuICAqLworIyBkZWZpbmUgX1BPU0lYX0ZEX1NFVFNJWkUJX1BPU0lYX09QRU5fTUFYCisjZW5kaWYKKworLyogTnVtYmVyIG9mIGJ5dGVzIGluIGEgcGF0aG5hbWUuICAqLworI2RlZmluZQlfUE9TSVhfUEFUSF9NQVgJCTI1NgorCisvKiBOdW1iZXIgb2YgYnl0ZXMgdGhhbiBjYW4gYmUgd3JpdHRlbiBhdG9taWNhbGx5IHRvIGEgcGlwZS4gICovCisjZGVmaW5lCV9QT1NJWF9QSVBFX0JVRgkJNTEyCisKKy8qIFRoZSBudW1iZXIgb2YgcmVwZWF0ZWQgb2NjdXJyZW5jZXMgb2YgYSBCUkUgcGVybWl0dGVkIGJ5IHRoZQorICAgUkVHRVhFQyBhbmQgUkVHQ09NUCBmdW5jdGlvbnMgd2hlbiB1c2luZyB0aGUgaW50ZXJ2YWwgbm90YXRpb24uICAqLworI2RlZmluZSBfUE9TSVhfUkVfRFVQX01BWAkyNTUKKworLyogTWluaW1hbCBudW1iZXIgb2YgcmVhbHRpbWUgc2lnbmFscyByZXNlcnZlZCBmb3IgdGhlIGFwcGxpY2F0aW9uLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1JUU0lHX01BWAk4CisKKy8qIE51bWJlciBvZiBzZW1hcGhvcmVzIGEgcHJvY2VzcyBjYW4gaGF2ZS4gICovCisjZGVmaW5lIF9QT1NJWF9TRU1fTlNFTVNfTUFYCTI1NgorCisvKiBNYXhpbWFsIHZhbHVlIG9mIGEgc2VtYXBob3JlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1NFTV9WQUxVRV9NQVgJMzI3NjcKKworLyogTnVtYmVyIG9mIHBlbmRpbmcgcmVhbHRpbWUgc2lnbmFscy4gICovCisjZGVmaW5lIF9QT1NJWF9TSUdRVUVVRV9NQVgJMzIKKworLyogTGFyZ2VzdCB2YWx1ZSBvZiBhIGBzc2l6ZV90Jy4gICovCisjZGVmaW5lCV9QT1NJWF9TU0laRV9NQVgJMzI3NjcKKworLyogTnVtYmVyIG9mIHN0cmVhbXMgYSBwcm9jZXNzIGNhbiBoYXZlIG9wZW4gYXQgb25jZS4gICovCisjZGVmaW5lCV9QT1NJWF9TVFJFQU1fTUFYCTgKKworLyogVGhlIG51bWJlciBvZiBieXRlcyBpbiBhIHN5bWJvbGljIGxpbmsuICAqLworI2RlZmluZSBfUE9TSVhfU1lNTElOS19NQVgJMjU1CisKKy8qIFRoZSBudW1iZXIgb2Ygc3ltYm9saWMgbGlua3MgdGhhdCBjYW4gYmUgdHJhdmVyc2VkIGluIHRoZQorICAgcmVzb2x1dGlvbiBvZiBhIHBhdGhuYW1lIGluIHRoZSBhYnNlbmNlIG9mIGEgbG9vcC4gICovCisjZGVmaW5lIF9QT1NJWF9TWU1MT09QX01BWAk4CisKKy8qIE51bWJlciBvZiB0aW1lciBmb3IgYSBwcm9jZXNzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RJTUVSX01BWAkzMgorCisvKiBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGEgdHR5IG5hbWUuICAqLworI2RlZmluZQlfUE9TSVhfVFRZX05BTUVfTUFYCTkKKworLyogTWF4aW11bSBsZW5ndGggb2YgYSB0aW1lem9uZSBuYW1lIChlbGVtZW50IG9mIGB0em5hbWUnKS4gICovCisjZGVmaW5lCV9QT1NJWF9UWk5BTUVfTUFYCTYKKworI2lmICFkZWZpbmVkIF9fVVNFX1hPUEVOMksgfHwgZGVmaW5lZCBfX1VTRV9HTlUKKy8qIE1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgY2FuIGJlIHF1ZXVlZCBvbiBhIHNvY2tldC4gICovCisjIGRlZmluZSBfUE9TSVhfUUxJTUlUCQkxCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIGJ1ZmZlcmVkIG9uIGEgc29ja2V0IGZvciBzZW5kCisgICBvciByZWNlaXZlLiAgKi8KKyMgZGVmaW5lIF9QT1NJWF9ISVdBVAkJX1BPU0lYX1BJUEVfQlVGCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFuIGBpb3ZlYycgYXJyYXkuICAqLworIyBkZWZpbmUgX1BPU0lYX1VJT19NQVhJT1YJMTYKKyNlbmRpZgorCisvKiBNYXhpbXVtIGNsb2NrIHJlc29sdXRpb24gaW4gbmFub3NlY29uZHMuICAqLworI2RlZmluZSBfUE9TSVhfQ0xPQ0tSRVNfTUlOCTIwMDAwMDAwCisKKworLyogR2V0IHRoZSBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyB2YWx1ZXMgZm9yIHRoZSBhYm92ZS4gICovCisjaW5jbHVkZSA8Yml0cy9sb2NhbF9saW0uaD4KKworCisjaWZuZGVmCVNTSVpFX01BWAorIyBkZWZpbmUgU1NJWkVfTUFYCUxPTkdfTUFYCisjZW5kaWYKKworCisvKiBUaGlzIHZhbHVlIGlzIGEgZ3VhcmFudGVlZCBtaW5pbXVtIG1heGltdW0uCisgICBUaGUgY3VycmVudCBtYXhpbXVtIGNhbiBiZSBnb3QgZnJvbSBgc3lzY29uZicuICAqLworCisjaWZuZGVmCU5HUk9VUFNfTUFYCisjIGRlZmluZSBOR1JPVVBTX01BWAk4CisjZW5kaWYKKworI2VuZGlmCS8qIGJpdHMvcG9zaXgxX2xpbS5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvcG9zaXgyX2xpbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvcG9zaXgyX2xpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NDgzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9wb3NpeDJfbGltLmgKQEAgLTAsMCArMSw5MSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk2LCAxOTk5LCAyMDAwLCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICogTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHk7IGluY2x1ZGUgPGxpbWl0cy5oPiBpbnN0ZWFkLgorICovCisKKyNpZm5kZWYJX0JJVFNfUE9TSVgyX0xJTV9ICisjZGVmaW5lCV9CSVRTX1BPU0lYMl9MSU1fSAkxCisKKworLyogVGhlIG1heGltdW0gYGliYXNlJyBhbmQgYG9iYXNlJyB2YWx1ZXMgYWxsb3dlZCBieSB0aGUgYGJjJyB1dGlsaXR5LiAgKi8KKyNkZWZpbmUJX1BPU0lYMl9CQ19CQVNFX01BWAkJOTkKKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIGFsbG93ZWQgaW4gYW4gYXJyYXkgYnkgdGhlIGBiYycgdXRpbGl0eS4gICovCisjZGVmaW5lCV9QT1NJWDJfQkNfRElNX01BWAkJMjA0OAorCisvKiBUaGUgbWF4aW11bSBgc2NhbGUnIHZhbHVlIGFsbG93ZWQgYnkgdGhlIGBiYycgdXRpbGl0eS4gICovCisjZGVmaW5lCV9QT1NJWDJfQkNfU0NBTEVfTUFYCQk5OQorCisvKiBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSBzdHJpbmcgY29uc3RhbnQgYWNjZXB0ZWQgYnkgdGhlIGBiYycgdXRpbGl0eS4gICovCisjZGVmaW5lCV9QT1NJWDJfQkNfU1RSSU5HX01BWAkJMTAwMAorCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygd2VpZ2h0cyB0aGF0IGNhbiBiZSBhc3NpZ25lZCB0byBhbiBlbnRyeSBvZgorICAgdGhlIExDX0NPTExBVEUgYG9yZGVyJyBrZXl3b3JkIGluIHRoZSBsb2NhbGUgZGVmaW5pdGlvbiBmaWxlLiAgKi8KKyNkZWZpbmUJX1BPU0lYMl9DT0xMX1dFSUdIVFNfTUFYCTIKKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGV4cHJlc3Npb25zIHRoYXQgY2FuIGJlIG5lc3RlZAorICAgd2l0aGluIHBhcmVudGhlc2VzIGJ5IHRoZSBgZXhwcicgdXRpbGl0eS4gICovCisjZGVmaW5lCV9QT1NJWDJfRVhQUl9ORVNUX01BWAkJMzIKKworLyogVGhlIG1heGltdW0gbGVuZ3RoLCBpbiBieXRlcywgb2YgYW4gaW5wdXQgbGluZS4gICovCisjZGVmaW5lCV9QT1NJWDJfTElORV9NQVgJCTIwNDgKKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlcGVhdGVkIG9jY3VycmVuY2VzIG9mIGEgcmVndWxhciBleHByZXNzaW9uCisgICBwZXJtaXR0ZWQgd2hlbiB1c2luZyB0aGUgaW50ZXJ2YWwgbm90YXRpb24gYFx7TSxOXH0nLiAgKi8KKyNkZWZpbmUJX1BPU0lYMl9SRV9EVVBfTUFYCQkyNTUKKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGluIGEgY2hhcmFjdGVyIGNsYXNzIG5hbWUuICBXZSBoYXZlIG5vCisgICBmaXhlZCBsaW1pdCwgMjA0OCBpcyBhIGhpZ2ggbnVtYmVyLiAgKi8KKyNkZWZpbmUJX1BPU0lYMl9DSEFSQ0xBU1NfTkFNRV9NQVgJMTQKKworCisvKiBUaGVzZSB2YWx1ZXMgYXJlIGltcGxlbWVudGF0aW9uLXNwZWNpZmljLAorICAgYW5kIG1heSB2YXJ5IHdpdGhpbiB0aGUgaW1wbGVtZW50YXRpb24uCisgICBUaGVpciBwcmVjaXNlIHZhbHVlcyBjYW4gYmUgb2J0YWluZWQgZnJvbSBzeXNjb25mLiAgKi8KKworI2lmbmRlZglCQ19CQVNFX01BWAorI2RlZmluZQlCQ19CQVNFX01BWAkJX1BPU0lYMl9CQ19CQVNFX01BWAorI2VuZGlmCisjaWZuZGVmCUJDX0RJTV9NQVgKKyNkZWZpbmUJQkNfRElNX01BWAkJX1BPU0lYMl9CQ19ESU1fTUFYCisjZW5kaWYKKyNpZm5kZWYJQkNfU0NBTEVfTUFYCisjZGVmaW5lCUJDX1NDQUxFX01BWAkJX1BPU0lYMl9CQ19TQ0FMRV9NQVgKKyNlbmRpZgorI2lmbmRlZglCQ19TVFJJTkdfTUFYCisjZGVmaW5lCUJDX1NUUklOR19NQVgJCV9QT1NJWDJfQkNfU1RSSU5HX01BWAorI2VuZGlmCisjaWZuZGVmCUNPTExfV0VJR0hUU19NQVgKKyNkZWZpbmUJQ09MTF9XRUlHSFRTX01BWAkyNTUKKyNlbmRpZgorI2lmbmRlZglFWFBSX05FU1RfTUFYCisjZGVmaW5lCUVYUFJfTkVTVF9NQVgJCV9QT1NJWDJfRVhQUl9ORVNUX01BWAorI2VuZGlmCisjaWZuZGVmCUxJTkVfTUFYCisjZGVmaW5lCUxJTkVfTUFYCQlfUE9TSVgyX0xJTkVfTUFYCisjZW5kaWYKKyNpZm5kZWYJQ0hBUkNMQVNTX05BTUVfTUFYCisjZGVmaW5lCUNIQVJDTEFTU19OQU1FX01BWAkyMDQ4CisjZW5kaWYKKworLyogVGhpcyB2YWx1ZSBpcyBkZWZpbmVkIGxpa2UgdGhpcyBpbiByZWdleC5oLiAgKi8KKyNkZWZpbmUJUkVfRFVQX01BWCAoMHg3ZmZmKQorCisjZW5kaWYJLyogYml0cy9wb3NpeDJfbGltLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3Bvc2l4X29wdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvcG9zaXhfb3B0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1MDM1NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3Bvc2l4X29wdC5oCkBAIC0wLDAgKzEsMTkyIEBACisvKiBEZWZpbmUgUE9TSVggb3B0aW9ucyBmb3IgTGludXguCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwNCwgMjAwNiwgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUKKyAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAorICAgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmCV9CSVRTX1BPU0lYX09QVF9ICisjZGVmaW5lCV9CSVRTX1BPU0lYX09QVF9ICTEKKworLyogSm9iIGNvbnRyb2wgaXMgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUJX1BPU0lYX0pPQl9DT05UUk9MCTEKKworLyogUHJvY2Vzc2VzIGhhdmUgYSBzYXZlZCBzZXQtdXNlci1JRCBhbmQgYSBzYXZlZCBzZXQtZ3JvdXAtSUQuICAqLworI2RlZmluZQlfUE9TSVhfU0FWRURfSURTCTEKKworLyogUHJpb3JpdHkgc2NoZWR1bGluZyBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZQlfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORwkyMDA4MDlMCisKKy8qIFN5bmNocm9uaXppbmcgZmlsZSBkYXRhIGlzIHN1cHBvcnRlZC4gICovCisjZGVmaW5lCV9QT1NJWF9TWU5DSFJPTklaRURfSU8JMjAwODA5TAorCisvKiBUaGUgZnN5bmMgZnVuY3Rpb24gaXMgcHJlc2VudC4gICovCisjZGVmaW5lCV9QT1NJWF9GU1lOQwkyMDA4MDlMCisKKy8qIE1hcHBpbmcgb2YgZmlsZXMgdG8gbWVtb3J5IGlzIHN1cHBvcnRlZC4gICovCisjZGVmaW5lCV9QT1NJWF9NQVBQRURfRklMRVMJMjAwODA5TAorCisvKiBMb2NraW5nIG9mIGFsbCBtZW1vcnkgaXMgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUJX1BPU0lYX01FTUxPQ0sJMjAwODA5TAorCisvKiBMb2NraW5nIG9mIHJhbmdlcyBvZiBtZW1vcnkgaXMgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUJX1BPU0lYX01FTUxPQ0tfUkFOR0UJMjAwODA5TAorCisvKiBTZXR0aW5nIG9mIG1lbW9yeSBwcm90ZWN0aW9ucyBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZQlfUE9TSVhfTUVNT1JZX1BST1RFQ1RJT04JMjAwODA5TAorCisvKiBTb21lIGZpbGVzeXN0ZW1zIGFsbG93IGFsbCB1c2VycyB0byBjaGFuZ2UgZmlsZSBvd25lcnNoaXAuICAqLworI2RlZmluZQlfUE9TSVhfQ0hPV05fUkVTVFJJQ1RFRAkwCisKKy8qIGBjX2NjJyBtZW1iZXIgb2YgJ3N0cnVjdCB0ZXJtaW9zJyBzdHJ1Y3R1cmUgY2FuIGJlIGRpc2FibGVkIGJ5CisgICB1c2luZyB0aGUgdmFsdWUgX1BPU0lYX1ZESVNBQkxFLiAgKi8KKyNkZWZpbmUJX1BPU0lYX1ZESVNBQkxFCSdcMCcKKworLyogRmlsZW5hbWVzIGFyZSBub3Qgc2lsZW50bHkgdHJ1bmNhdGVkLiAgKi8KKyNkZWZpbmUJX1BPU0lYX05PX1RSVU5DCTEKKworLyogWC9PcGVuIHJlYWx0aW1lIHN1cHBvcnQgaXMgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1hPUEVOX1JFQUxUSU1FCTEKKworLyogWC9PcGVuIHRocmVhZCByZWFsdGltZSBzdXBwb3J0IGlzIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9YT1BFTl9SRUFMVElNRV9USFJFQURTCTEKKworLyogWFBHNC4yIHNoYXJlZCBtZW1vcnkgaXMgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUJX1hPUEVOX1NITQkxCisKKy8qIFRlbGwgd2UgaGF2ZSBQT1NJWCB0aHJlYWRzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRFMJMjAwODA5TAorCisvKiBXZSBoYXZlIHRoZSByZWVudHJhbnQgZnVuY3Rpb25zIGRlc2NyaWJlZCBpbiBQT1NJWC4gICovCisjZGVmaW5lIF9QT1NJWF9SRUVOVFJBTlRfRlVOQ1RJT05TICAgICAgMQorI2RlZmluZSBfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TCTIwMDgwOUwKKworLyogV2UgcHJvdmlkZSBwcmlvcml0eSBzY2hlZHVsaW5nIGZvciB0aHJlYWRzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCTIwMDgwOUwKKworLyogV2Ugc3VwcG9ydCB1c2VyLWRlZmluZWQgc3RhY2sgc2l6ZXMuICAqLworI2RlZmluZSBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFCTIwMDgwOUwKKworLyogV2Ugc3VwcG9ydCB1c2VyLWRlZmluZWQgc3RhY2tzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLQUREUgkyMDA4MDlMCisKKy8qIFdlIHN1cHBvcnQgcHJpb3JpdHkgaW5oZXJpdGVuY2UuICAqLworI2RlZmluZSBfUE9TSVhfVEhSRUFEX1BSSU9fSU5IRVJJVAkyMDA4MDlMCisKKy8qIFdlIHN1cHBvcnQgcHJpb3JpdHkgcHJvdGVjdGlvbiwgdGhvdWdoIG9ubHkgZm9yIG5vbi1yb2J1c3QKKyAgIG11dGV4ZXMuICAqLworI2RlZmluZSBfUE9TSVhfVEhSRUFEX1BSSU9fUFJPVEVDVAkyMDA4MDlMCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLOAorLyogV2Ugc3VwcG9ydCBwcmlvcml0eSBpbmhlcml0ZW5jZSBmb3Igcm9idXN0IG11dGV4ZXMuICAqLworIyBkZWZpbmUgX1BPU0lYX1RIUkVBRF9ST0JVU1RfUFJJT19JTkhFUklUCTIwMDgwOUwKKworLyogV2UgZG8gbm90IHN1cHBvcnQgcHJpb3JpdHkgcHJvdGVjdGlvbiBmb3Igcm9idXN0IG11dGV4ZXMuICAqLworIyBkZWZpbmUgX1BPU0lYX1RIUkVBRF9ST0JVU1RfUFJJT19QUk9URUNUCS0xCisjZW5kaWYKKworLyogV2Ugc3VwcG9ydCBQT1NJWC4xYiBzZW1hcGhvcmVzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1NFTUFQSE9SRVMJMjAwODA5TAorCisvKiBSZWFsLXRpbWUgc2lnbmFscyBhcmUgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1JFQUxUSU1FX1NJR05BTFMJMjAwODA5TAorCisvKiBXZSBzdXBwb3J0IGFzeW5jaHJvbm91cyBJL08uICAqLworI2RlZmluZSBfUE9TSVhfQVNZTkNIUk9OT1VTX0lPCTIwMDgwOUwKKyNkZWZpbmUgX1BPU0lYX0FTWU5DX0lPCQkxCisvKiBBbHRlcm5hdGl2ZSBuYW1lIGZvciBVbml4OTguICAqLworI2RlZmluZSBfTEZTX0FTWU5DSFJPTk9VU19JTwkxCisvKiBTdXBwb3J0IGZvciBwcmlvcml0aXphdGlvbiBpcyBhbHNvIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9QT1NJWF9QUklPUklUSVpFRF9JTwkyMDA4MDlMCisKKy8qIFRoZSBMRlMgc3VwcG9ydCBpbiBhc3luY2hyb25vdXMgSS9PIGlzIGFsc28gYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX0xGUzY0X0FTWU5DSFJPTk9VU19JTwkxCisKKy8qIFRoZSByZXN0IG9mIHRoZSBMRlMgaXMgYWxzbyBhdmFpbGFibGUuICAqLworI2RlZmluZSBfTEZTX0xBUkdFRklMRQkJMQorI2RlZmluZSBfTEZTNjRfTEFSR0VGSUxFCTEKKyNkZWZpbmUgX0xGUzY0X1NURElPCQkxCisKKy8qIFBPU0lYIHNoYXJlZCBtZW1vcnkgb2JqZWN0cyBhcmUgaW1wbGVtZW50ZWQuICAqLworI2RlZmluZSBfUE9TSVhfU0hBUkVEX01FTU9SWV9PQkpFQ1RTCTIwMDgwOUwKKworLyogQ1BVLXRpbWUgY2xvY2tzIHN1cHBvcnQgbmVlZHMgdG8gYmUgY2hlY2tlZCBhdCBydW50aW1lLiAgKi8KKyNkZWZpbmUgX1BPU0lYX0NQVVRJTUUJMAorCisvKiBDbG9jayBzdXBwb3J0IGluIHRocmVhZHMgbXVzdCBiZSBhbHNvIGNoZWNrZWQgYXQgcnVudGltZS4gICovCisjZGVmaW5lIF9QT1NJWF9USFJFQURfQ1BVVElNRQkwCisKKy8qIEdOVSBsaWJjIHByb3ZpZGVzIHJlZ3VsYXIgZXhwcmVzc2lvbiBoYW5kbGluZy4gICovCisjZGVmaW5lIF9QT1NJWF9SRUdFWFAJMQorCisvKiBSZWFkZXIvV3JpdGVyIGxvY2tzIGFyZSBhdmFpbGFibGUuICAqLworI2RlZmluZSBfUE9TSVhfUkVBREVSX1dSSVRFUl9MT0NLUwkyMDA4MDlMCisKKy8qIFdlIGhhdmUgYSBQT1NJWCBzaGVsbC4gICovCisjZGVmaW5lIF9QT1NJWF9TSEVMTAkxCisKKy8qIFdlIHN1cHBvcnQgdGhlIFRpbWVvdXRzIG9wdGlvbi4gICovCisjZGVmaW5lIF9QT1NJWF9USU1FT1VUUwkyMDA4MDlMCisKKy8qIFdlIHN1cHBvcnQgc3BpbmxvY2tzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1NQSU5fTE9DS1MJMjAwODA5TAorCisvKiBUaGUgYHNwYXduJyBmdW5jdGlvbiBmYW1pbHkgaXMgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1NQQVdOCTIwMDgwOUwKKworLyogV2UgaGF2ZSBQT1NJWCB0aW1lcnMuICAqLworI2RlZmluZSBfUE9TSVhfVElNRVJTCTIwMDgwOUwKKworLyogVGhlIGJhcnJpZXIgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUuICAqLworI2RlZmluZSBfUE9TSVhfQkFSUklFUlMJMjAwODA5TAorCisvKiBQT1NJWCBtZXNzYWdlIHF1ZXVlcyBhcmUgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUJX1BPU0lYX01FU1NBR0VfUEFTU0lORwkyMDA4MDlMCisKKy8qIFRocmVhZCBwcm9jZXNzLXNoYXJlZCBzeW5jaHJvbml6YXRpb24gaXMgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9QUk9DRVNTX1NIQVJFRAkyMDA4MDlMCisKKy8qIFRoZSBtb25vdG9uaWMgY2xvY2sgbWlnaHQgYmUgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX01PTk9UT05JQ19DTE9DSwkwCisKKy8qIFRoZSBjbG9jayBzZWxlY3Rpb24gaW50ZXJmYWNlcyBhcmUgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX0NMT0NLX1NFTEVDVElPTgkyMDA4MDlMCisKKy8qIEFkdmlzb3J5IGluZm9ybWF0aW9uIGludGVyZmFjZXMgYXJlIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9QT1NJWF9BRFZJU09SWV9JTkZPCTIwMDgwOUwKKworLyogSVB2NiBzdXBwb3J0IGlzIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9QT1NJWF9JUFY2CTIwMDgwOUwKKworLyogUmF3IHNvY2tldCBzdXBwb3J0IGlzIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9QT1NJWF9SQVdfU09DS0VUUwkyMDA4MDlMCisKKy8qIFdlIGhhdmUgYXQgbGVhc3Qgb25lIHRlcm1pbmFsLiAgKi8KKyNkZWZpbmUgX1BPU0lYMl9DSEFSX1RFUk0JMjAwODA5TAorCisvKiBOZWl0aGVyIHByb2Nlc3Mgbm9yIHRocmVhZCBzcG9yYWRpYyBzZXJ2ZXIgaW50ZXJmYWNlcyBpcyBhdmFpbGFibGUuICAqLworI2RlZmluZSBfUE9TSVhfU1BPUkFESUNfU0VSVkVSCS0xCisjZGVmaW5lIF9QT1NJWF9USFJFQURfU1BPUkFESUNfU0VSVkVSCS0xCisKKy8qIHRyYWNlLmggaXMgbm90IGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9QT1NJWF9UUkFDRQktMQorI2RlZmluZSBfUE9TSVhfVFJBQ0VfRVZFTlRfRklMVEVSCS0xCisjZGVmaW5lIF9QT1NJWF9UUkFDRV9JTkhFUklUCS0xCisjZGVmaW5lIF9QT1NJWF9UUkFDRV9MT0cJLTEKKworLyogVHlwZWQgbWVtb3J5IG9iamVjdHMgYXJlIG5vdCBhdmFpbGFibGUuICAqLworI2RlZmluZSBfUE9TSVhfVFlQRURfTUVNT1JZX09CSkVDVFMJLTEKKworI2VuZGlmIC8qIGJpdHMvcG9zaXhfb3B0LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3ByZWRlZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3ByZWRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjA0ODRhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvcHJlZGVmcy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfRkVBVFVSRVNfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL3ByZWRlZnMuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGZlYXR1cmVzLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX1BSRURFRlNfSAorI2RlZmluZSBfUFJFREVGU19ICisKKy8qIFdlIGRvIHN1cHBvcnQgdGhlIElFQyA1NTkgbWF0aCBmdW5jdGlvbmFsaXR5LCByZWFsIGFuZCBjb21wbGV4LiAgKi8KKyNkZWZpbmUgX19TVERDX0lFQ181NTlfXwkJMQorI2RlZmluZSBfX1NURENfSUVDXzU1OV9DT01QTEVYX18JMQorCisjZW5kaWYgLyogcHJlZGVmcy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9wcmludGYtbGRibC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvcHJpbnRmLWxkYmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmRjM2YxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvcHJpbnRmLWxkYmwuaApAQCAtMCwwICsxLDI0IEBACisvKiAtbWxvbmctZG91YmxlLTY0IGNvbXBhdGliaWxpdHkgbW9kZSBmb3IgPHByaW50Zi5oPiBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1BSSU5URl9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3ByaW50Zi1sZGJsLmg+IGRpcmVjdGx5OyB1c2UgPHByaW50Zi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCitfX0xEQkxfUkVESVJfREVDTCAocHJpbnRmX3NpemUpCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9wdGhyZWFkdHlwZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3B0aHJlYWR0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMDljODEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9wdGhyZWFkdHlwZXMuaApAQCAtMCwwICsxLDIyNSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLDIwMDMsMjAwNCwyMDA1LDIwMDYsMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9CSVRTX1BUSFJFQURUWVBFU19ICisjZGVmaW5lIF9CSVRTX1BUSFJFQURUWVBFU19ICTEKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworI2lmIF9fV09SRFNJWkUgPT0gNjQKKyMgZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfQVRUUl9UIDU2CisjIGRlZmluZSBfX1NJWkVPRl9QVEhSRUFEX01VVEVYX1QgNDAKKyMgZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfTVVURVhBVFRSX1QgNAorIyBkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9DT05EX1QgNDgKKyMgZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfQ09OREFUVFJfVCA0CisjIGRlZmluZSBfX1NJWkVPRl9QVEhSRUFEX1JXTE9DS19UIDU2CisjIGRlZmluZSBfX1NJWkVPRl9QVEhSRUFEX1JXTE9DS0FUVFJfVCA4CisjIGRlZmluZSBfX1NJWkVPRl9QVEhSRUFEX0JBUlJJRVJfVCAzMgorIyBkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9CQVJSSUVSQVRUUl9UIDQKKyNlbHNlCisjIGRlZmluZSBfX1NJWkVPRl9QVEhSRUFEX0FUVFJfVCAzNgorIyBkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9NVVRFWF9UIDI0CisjIGRlZmluZSBfX1NJWkVPRl9QVEhSRUFEX01VVEVYQVRUUl9UIDQKKyMgZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfQ09ORF9UIDQ4CisjIGRlZmluZSBfX1NJWkVPRl9QVEhSRUFEX0NPTkRBVFRSX1QgNAorIyBkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9SV0xPQ0tfVCAzMgorIyBkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9SV0xPQ0tBVFRSX1QgOAorIyBkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9CQVJSSUVSX1QgMjAKKyMgZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfQkFSUklFUkFUVFJfVCA0CisjZW5kaWYKKworCisvKiBUaHJlYWQgaWRlbnRpZmllcnMuICBUaGUgc3RydWN0dXJlIG9mIHRoZSBhdHRyaWJ1dGUgdHlwZSBpcyBub3QKKyAgIGV4cG9zZWQgb24gcHVycG9zZS4gICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHB0aHJlYWRfdDsKKworCit0eXBlZGVmIHVuaW9uCit7CisgIGNoYXIgX19zaXplW19fU0laRU9GX1BUSFJFQURfQVRUUl9UXTsKKyAgbG9uZyBpbnQgX19hbGlnbjsKK30gcHRocmVhZF9hdHRyX3Q7CisKKworI2lmIF9fV09SRFNJWkUgPT0gNjQKK3R5cGVkZWYgc3RydWN0IF9fcHRocmVhZF9pbnRlcm5hbF9saXN0Cit7CisgIHN0cnVjdCBfX3B0aHJlYWRfaW50ZXJuYWxfbGlzdCAqX19wcmV2OworICBzdHJ1Y3QgX19wdGhyZWFkX2ludGVybmFsX2xpc3QgKl9fbmV4dDsKK30gX19wdGhyZWFkX2xpc3RfdDsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCBfX3B0aHJlYWRfaW50ZXJuYWxfc2xpc3QKK3sKKyAgc3RydWN0IF9fcHRocmVhZF9pbnRlcm5hbF9zbGlzdCAqX19uZXh0OworfSBfX3B0aHJlYWRfc2xpc3RfdDsKKyNlbmRpZgorCisKKy8qIERhdGEgc3RydWN0dXJlcyBmb3IgbXV0ZXggaGFuZGxpbmcuICBUaGUgc3RydWN0dXJlIG9mIHRoZSBhdHRyaWJ1dGUKKyAgIHR5cGUgaXMgbm90IGV4cG9zZWQgb24gcHVycG9zZS4gICovCit0eXBlZGVmIHVuaW9uCit7CisgIHN0cnVjdCBfX3B0aHJlYWRfbXV0ZXhfcworICB7CisgICAgaW50IF9fbG9jazsKKyAgICB1bnNpZ25lZCBpbnQgX19jb3VudDsKKyAgICBpbnQgX19vd25lcjsKKyNpZiBfX1dPUkRTSVpFID09IDY0CisgICAgdW5zaWduZWQgaW50IF9fbnVzZXJzOworI2VuZGlmCisgICAgLyogS0lORCBtdXN0IHN0YXkgYXQgdGhpcyBwb3NpdGlvbiBpbiB0aGUgc3RydWN0dXJlIHRvIG1haW50YWluCisgICAgICAgYmluYXJ5IGNvbXBhdGliaWxpdHkuICAqLworICAgIGludCBfX2tpbmQ7CisjaWYgX19XT1JEU0laRSA9PSA2NAorICAgIGludCBfX3NwaW5zOworICAgIF9fcHRocmVhZF9saXN0X3QgX19saXN0OworIyBkZWZpbmUgX19QVEhSRUFEX01VVEVYX0hBVkVfUFJFVgkxCisjZWxzZQorICAgIHVuc2lnbmVkIGludCBfX251c2VyczsKKyAgICBfX2V4dGVuc2lvbl9fIHVuaW9uCisgICAgeworICAgICAgaW50IF9fc3BpbnM7CisgICAgICBfX3B0aHJlYWRfc2xpc3RfdCBfX2xpc3Q7CisgICAgfTsKKyNlbmRpZgorICB9IF9fZGF0YTsKKyAgY2hhciBfX3NpemVbX19TSVpFT0ZfUFRIUkVBRF9NVVRFWF9UXTsKKyAgbG9uZyBpbnQgX19hbGlnbjsKK30gcHRocmVhZF9tdXRleF90OworCit0eXBlZGVmIHVuaW9uCit7CisgIGNoYXIgX19zaXplW19fU0laRU9GX1BUSFJFQURfTVVURVhBVFRSX1RdOworICBpbnQgX19hbGlnbjsKK30gcHRocmVhZF9tdXRleGF0dHJfdDsKKworCisvKiBEYXRhIHN0cnVjdHVyZSBmb3IgY29uZGl0aW9uYWwgdmFyaWFibGUgaGFuZGxpbmcuICBUaGUgc3RydWN0dXJlIG9mCisgICB0aGUgYXR0cmlidXRlIHR5cGUgaXMgbm90IGV4cG9zZWQgb24gcHVycG9zZS4gICovCit0eXBlZGVmIHVuaW9uCit7CisgIHN0cnVjdAorICB7CisgICAgaW50IF9fbG9jazsKKyAgICB1bnNpZ25lZCBpbnQgX19mdXRleDsKKyAgICBfX2V4dGVuc2lvbl9fIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX190b3RhbF9zZXE7CisgICAgX19leHRlbnNpb25fXyB1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fd2FrZXVwX3NlcTsKKyAgICBfX2V4dGVuc2lvbl9fIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX193b2tlbl9zZXE7CisgICAgdm9pZCAqX19tdXRleDsKKyAgICB1bnNpZ25lZCBpbnQgX19ud2FpdGVyczsKKyAgICB1bnNpZ25lZCBpbnQgX19icm9hZGNhc3Rfc2VxOworICB9IF9fZGF0YTsKKyAgY2hhciBfX3NpemVbX19TSVpFT0ZfUFRIUkVBRF9DT05EX1RdOworICBfX2V4dGVuc2lvbl9fIGxvbmcgbG9uZyBpbnQgX19hbGlnbjsKK30gcHRocmVhZF9jb25kX3Q7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgY2hhciBfX3NpemVbX19TSVpFT0ZfUFRIUkVBRF9DT05EQVRUUl9UXTsKKyAgaW50IF9fYWxpZ247Cit9IHB0aHJlYWRfY29uZGF0dHJfdDsKKworCisvKiBLZXlzIGZvciB0aHJlYWQtc3BlY2lmaWMgZGF0YSAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcHRocmVhZF9rZXlfdDsKKworCisvKiBPbmNlLW9ubHkgZXhlY3V0aW9uICovCit0eXBlZGVmIGludCBwdGhyZWFkX29uY2VfdDsKKworCisjaWYgZGVmaW5lZCBfX1VTRV9VTklYOTggfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisvKiBEYXRhIHN0cnVjdHVyZSBmb3IgcmVhZC13cml0ZSBsb2NrIHZhcmlhYmxlIGhhbmRsaW5nLiAgVGhlCisgICBzdHJ1Y3R1cmUgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlIGlzIG5vdCBleHBvc2VkIG9uIHB1cnBvc2UuICAqLwordHlwZWRlZiB1bmlvbgoreworIyBpZiBfX1dPUkRTSVpFID09IDY0CisgIHN0cnVjdAorICB7CisgICAgaW50IF9fbG9jazsKKyAgICB1bnNpZ25lZCBpbnQgX19ucl9yZWFkZXJzOworICAgIHVuc2lnbmVkIGludCBfX3JlYWRlcnNfd2FrZXVwOworICAgIHVuc2lnbmVkIGludCBfX3dyaXRlcl93YWtldXA7CisgICAgdW5zaWduZWQgaW50IF9fbnJfcmVhZGVyc19xdWV1ZWQ7CisgICAgdW5zaWduZWQgaW50IF9fbnJfd3JpdGVyc19xdWV1ZWQ7CisgICAgaW50IF9fd3JpdGVyOworICAgIGludCBfX3NoYXJlZDsKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3BhZDE7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX19wYWQyOworICAgIC8qIEZMQUdTIG11c3Qgc3RheSBhdCB0aGlzIHBvc2l0aW9uIGluIHRoZSBzdHJ1Y3R1cmUgdG8gbWFpbnRhaW4KKyAgICAgICBiaW5hcnkgY29tcGF0aWJpbGl0eS4gICovCisgICAgdW5zaWduZWQgaW50IF9fZmxhZ3M7CisgIH0gX19kYXRhOworIyBlbHNlCisgIHN0cnVjdAorICB7CisgICAgaW50IF9fbG9jazsKKyAgICB1bnNpZ25lZCBpbnQgX19ucl9yZWFkZXJzOworICAgIHVuc2lnbmVkIGludCBfX3JlYWRlcnNfd2FrZXVwOworICAgIHVuc2lnbmVkIGludCBfX3dyaXRlcl93YWtldXA7CisgICAgdW5zaWduZWQgaW50IF9fbnJfcmVhZGVyc19xdWV1ZWQ7CisgICAgdW5zaWduZWQgaW50IF9fbnJfd3JpdGVyc19xdWV1ZWQ7CisgICAgLyogRkxBR1MgbXVzdCBzdGF5IGF0IHRoaXMgcG9zaXRpb24gaW4gdGhlIHN0cnVjdHVyZSB0byBtYWludGFpbgorICAgICAgIGJpbmFyeSBjb21wYXRpYmlsaXR5LiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIF9fZmxhZ3M7CisgICAgdW5zaWduZWQgY2hhciBfX3NoYXJlZDsKKyAgICB1bnNpZ25lZCBjaGFyIF9fcGFkMTsKKyAgICB1bnNpZ25lZCBjaGFyIF9fcGFkMjsKKyAgICBpbnQgX193cml0ZXI7CisgIH0gX19kYXRhOworIyBlbmRpZgorICBjaGFyIF9fc2l6ZVtfX1NJWkVPRl9QVEhSRUFEX1JXTE9DS19UXTsKKyAgbG9uZyBpbnQgX19hbGlnbjsKK30gcHRocmVhZF9yd2xvY2tfdDsKKwordHlwZWRlZiB1bmlvbgoreworICBjaGFyIF9fc2l6ZVtfX1NJWkVPRl9QVEhSRUFEX1JXTE9DS0FUVFJfVF07CisgIGxvbmcgaW50IF9fYWxpZ247Cit9IHB0aHJlYWRfcndsb2NrYXR0cl90OworI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX1hPUEVOMksKKy8qIFBPU0lYIHNwaW5sb2NrIGRhdGEgdHlwZS4gICovCit0eXBlZGVmIHZvbGF0aWxlIGludCBwdGhyZWFkX3NwaW5sb2NrX3Q7CisKKworLyogUE9TSVggYmFycmllcnMgZGF0YSB0eXBlLiAgVGhlIHN0cnVjdHVyZSBvZiB0aGUgdHlwZSBpcworICAgZGVsaWJlcmF0ZWx5IG5vdCBleHBvc2VkLiAgKi8KK3R5cGVkZWYgdW5pb24KK3sKKyAgY2hhciBfX3NpemVbX19TSVpFT0ZfUFRIUkVBRF9CQVJSSUVSX1RdOworICBsb25nIGludCBfX2FsaWduOworfSBwdGhyZWFkX2JhcnJpZXJfdDsKKwordHlwZWRlZiB1bmlvbgoreworICBjaGFyIF9fc2l6ZVtfX1NJWkVPRl9QVEhSRUFEX0JBUlJJRVJBVFRSX1RdOworICBpbnQgX19hbGlnbjsKK30gcHRocmVhZF9iYXJyaWVyYXR0cl90OworI2VuZGlmCisKKworI2lmIF9fV09SRFNJWkUgPT0gMzIKKy8qIEV4dHJhIGF0dHJpYnV0ZXMgZm9yIHRoZSBjbGVhbnVwIGZ1bmN0aW9ucy4gICovCisjIGRlZmluZSBfX2NsZWFudXBfZmN0X2F0dHJpYnV0ZSBfX2F0dHJpYnV0ZV9fICgoX19yZWdwYXJtX18gKDEpKSkKKyNlbmRpZgorCisjZW5kaWYJLyogYml0cy9wdGhyZWFkdHlwZXMuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvcmVzb3VyY2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3Jlc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM2YzE5MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3Jlc291cmNlLmgKQEAgLTAsMCArMSwyNjggQEAKKy8qIEJpdCB2YWx1ZXMgJiBzdHJ1Y3R1cmVzIGZvciByZXNvdXJjZSBsaW1pdHMuICBMaW51eCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk2LTIwMDAsIDIwMDQsIDIwMDUsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfUkVTT1VSQ0VfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL3Jlc291cmNlLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworLyogVHJhbnNtdXRlIGRlZmluZXMgdG8gZW51bWVyYXRpb25zLiAgVGhlIG1hY3JvIHJlLWRlZmluaXRpb25zIGFyZQorICAgbmVjZXNzYXJ5IGJlY2F1c2Ugc29tZSBwcm9ncmFtcyB3YW50IHRvIHRlc3QgZm9yIG9wZXJhdGluZyBzeXN0ZW0KKyAgIGZlYXR1cmVzIHdpdGggI2lmZGVmIFJVU0FHRV9TRUxGLiAgSW4gSVNPIEMgdGhlIHJlZmxleGl2ZQorICAgZGVmaW5pdGlvbiBpcyBhIG5vLW9wLiAgKi8KKworLyogS2luZHMgb2YgcmVzb3VyY2UgbGltaXQuICAqLworZW51bSBfX3JsaW1pdF9yZXNvdXJjZQoreworICAvKiBQZXItcHJvY2VzcyBDUFUgbGltaXQsIGluIHNlY29uZHMuICAqLworICBSTElNSVRfQ1BVID0gMCwKKyNkZWZpbmUgUkxJTUlUX0NQVSBSTElNSVRfQ1BVCisKKyAgLyogTGFyZ2VzdCBmaWxlIHRoYXQgY2FuIGJlIGNyZWF0ZWQsIGluIGJ5dGVzLiAgKi8KKyAgUkxJTUlUX0ZTSVpFID0gMSwKKyNkZWZpbmUJUkxJTUlUX0ZTSVpFIFJMSU1JVF9GU0laRQorCisgIC8qIE1heGltdW0gc2l6ZSBvZiBkYXRhIHNlZ21lbnQsIGluIGJ5dGVzLiAgKi8KKyAgUkxJTUlUX0RBVEEgPSAyLAorI2RlZmluZQlSTElNSVRfREFUQSBSTElNSVRfREFUQQorCisgIC8qIE1heGltdW0gc2l6ZSBvZiBzdGFjayBzZWdtZW50LCBpbiBieXRlcy4gICovCisgIFJMSU1JVF9TVEFDSyA9IDMsCisjZGVmaW5lCVJMSU1JVF9TVEFDSyBSTElNSVRfU1RBQ0sKKworICAvKiBMYXJnZXN0IGNvcmUgZmlsZSB0aGF0IGNhbiBiZSBjcmVhdGVkLCBpbiBieXRlcy4gICovCisgIFJMSU1JVF9DT1JFID0gNCwKKyNkZWZpbmUJUkxJTUlUX0NPUkUgUkxJTUlUX0NPUkUKKworICAvKiBMYXJnZXN0IHJlc2lkZW50IHNldCBzaXplLCBpbiBieXRlcy4KKyAgICAgVGhpcyBhZmZlY3RzIHN3YXBwaW5nOyBwcm9jZXNzZXMgdGhhdCBhcmUgZXhjZWVkaW5nIHRoZWlyCisgICAgIHJlc2lkZW50IHNldCBzaXplIHdpbGwgYmUgbW9yZSBsaWtlbHkgdG8gaGF2ZSBwaHlzaWNhbCBtZW1vcnkKKyAgICAgdGFrZW4gZnJvbSB0aGVtLiAgKi8KKyAgX19STElNSVRfUlNTID0gNSwKKyNkZWZpbmUJUkxJTUlUX1JTUyBfX1JMSU1JVF9SU1MKKworICAvKiBOdW1iZXIgb2Ygb3BlbiBmaWxlcy4gICovCisgIFJMSU1JVF9OT0ZJTEUgPSA3LAorICBfX1JMSU1JVF9PRklMRSA9IFJMSU1JVF9OT0ZJTEUsIC8qIEJTRCBuYW1lIGZvciBzYW1lLiAgKi8KKyNkZWZpbmUgUkxJTUlUX05PRklMRSBSTElNSVRfTk9GSUxFCisjZGVmaW5lIFJMSU1JVF9PRklMRSBfX1JMSU1JVF9PRklMRQorCisgIC8qIEFkZHJlc3Mgc3BhY2UgbGltaXQuICAqLworICBSTElNSVRfQVMgPSA5LAorI2RlZmluZSBSTElNSVRfQVMgUkxJTUlUX0FTCisKKyAgLyogTnVtYmVyIG9mIHByb2Nlc3Nlcy4gICovCisgIF9fUkxJTUlUX05QUk9DID0gNiwKKyNkZWZpbmUgUkxJTUlUX05QUk9DIF9fUkxJTUlUX05QUk9DCisKKyAgLyogTG9ja2VkLWluLW1lbW9yeSBhZGRyZXNzIHNwYWNlLiAgKi8KKyAgX19STElNSVRfTUVNTE9DSyA9IDgsCisjZGVmaW5lIFJMSU1JVF9NRU1MT0NLIF9fUkxJTUlUX01FTUxPQ0sKKworICAvKiBNYXhpbXVtIG51bWJlciBvZiBmaWxlIGxvY2tzLiAgKi8KKyAgX19STElNSVRfTE9DS1MgPSAxMCwKKyNkZWZpbmUgUkxJTUlUX0xPQ0tTIF9fUkxJTUlUX0xPQ0tTCisKKyAgLyogTWF4aW11bSBudW1iZXIgb2YgcGVuZGluZyBzaWduYWxzLiAgKi8KKyAgX19STElNSVRfU0lHUEVORElORyA9IDExLAorI2RlZmluZSBSTElNSVRfU0lHUEVORElORyBfX1JMSU1JVF9TSUdQRU5ESU5HCisKKyAgLyogTWF4aW11bSBieXRlcyBpbiBQT1NJWCBtZXNzYWdlIHF1ZXVlcy4gICovCisgIF9fUkxJTUlUX01TR1FVRVVFID0gMTIsCisjZGVmaW5lIFJMSU1JVF9NU0dRVUVVRSBfX1JMSU1JVF9NU0dRVUVVRQorCisgIC8qIE1heGltdW0gbmljZSBwcmlvcml0eSBhbGxvd2VkIHRvIHJhaXNlIHRvLgorICAgICBOaWNlIGxldmVscyAxOSAuLiAtMjAgY29ycmVzcG9uZCB0byAwIC4uIDM5CisgICAgIHZhbHVlcyBvZiB0aGlzIHJlc291cmNlIGxpbWl0LiAgKi8KKyAgX19STElNSVRfTklDRSA9IDEzLAorI2RlZmluZSBSTElNSVRfTklDRSBfX1JMSU1JVF9OSUNFCisKKyAgLyogTWF4aW11bSByZWFsdGltZSBwcmlvcml0eSBhbGxvd2VkIGZvciBub24tcHJpdmlsZWRnZWQKKyAgICAgcHJvY2Vzc2VzLiAgKi8KKyAgX19STElNSVRfUlRQUklPID0gMTQsCisjZGVmaW5lIFJMSU1JVF9SVFBSSU8gX19STElNSVRfUlRQUklPCisKKyAgLyogTWF4aW11bSBDUFUgdGltZSBpbiDCtXMgdGhhdCBhIHByb2Nlc3Mgc2NoZWR1bGVkIHVuZGVyIGEgcmVhbC10aW1lCisgICAgIHNjaGVkdWxpbmcgcG9saWN5IG1heSBjb25zdW1lIHdpdGhvdXQgbWFraW5nIGEgYmxvY2tpbmcgc3lzdGVtCisgICAgIGNhbGwgYmVmb3JlIGJlaW5nIGZvcmNpYmx5IGRlc2NoZWR1bGVkLiAgKi8KKyAgX19STElNSVRfUlRUSU1FID0gMTUsCisjZGVmaW5lIFJMSU1JVF9SVFRJTUUgX19STElNSVRfUlRUSU1FCisKKyAgX19STElNSVRfTkxJTUlUUyA9IDE2LAorICBfX1JMSU1fTkxJTUlUUyA9IF9fUkxJTUlUX05MSU1JVFMKKyNkZWZpbmUgUkxJTUlUX05MSU1JVFMgX19STElNSVRfTkxJTUlUUworI2RlZmluZSBSTElNX05MSU1JVFMgX19STElNX05MSU1JVFMKK307CisKKy8qIFZhbHVlIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgbm8gbGltaXQuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisjIGRlZmluZSBSTElNX0lORklOSVRZICgodW5zaWduZWQgbG9uZyBpbnQpKH4wVUwpKQorI2Vsc2UKKyMgZGVmaW5lIFJMSU1fSU5GSU5JVFkgMHhmZmZmZmZmZmZmZmZmZmZmdUxMCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CisjIGRlZmluZSBSTElNNjRfSU5GSU5JVFkgMHhmZmZmZmZmZmZmZmZmZmZmdUxMCisjZW5kaWYKKworLyogV2UgY2FuIHJlcHJlc2VudCBhbGwgbGltaXRzLiAgKi8KKyNkZWZpbmUgUkxJTV9TQVZFRF9NQVgJUkxJTV9JTkZJTklUWQorI2RlZmluZSBSTElNX1NBVkVEX0NVUglSTElNX0lORklOSVRZCisKKworLyogVHlwZSBmb3IgcmVzb3VyY2UgcXVhbnRpdHkgbWVhc3VyZW1lbnQuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0Cit0eXBlZGVmIF9fcmxpbV90IHJsaW1fdDsKKyNlbHNlCit0eXBlZGVmIF9fcmxpbTY0X3QgcmxpbV90OworI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK3R5cGVkZWYgX19ybGltNjRfdCBybGltNjRfdDsKKyNlbmRpZgorCitzdHJ1Y3QgcmxpbWl0CisgIHsKKyAgICAvKiBUaGUgY3VycmVudCAoc29mdCkgbGltaXQuICAqLworICAgIHJsaW1fdCBybGltX2N1cjsKKyAgICAvKiBUaGUgaGFyZCBsaW1pdC4gICovCisgICAgcmxpbV90IHJsaW1fbWF4OworICB9OworCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK3N0cnVjdCBybGltaXQ2NAorICB7CisgICAgLyogVGhlIGN1cnJlbnQgKHNvZnQpIGxpbWl0LiAgKi8KKyAgICBybGltNjRfdCBybGltX2N1cjsKKyAgICAvKiBUaGUgaGFyZCBsaW1pdC4gICovCisgICAgcmxpbTY0X3QgcmxpbV9tYXg7CisgfTsKKyNlbmRpZgorCisvKiBXaG9zZSB1c2FnZSBzdGF0aXN0aWNzIGRvIHlvdSB3YW50PyAgKi8KK2VudW0gX19ydXNhZ2Vfd2hvCit7CisgIC8qIFRoZSBjYWxsaW5nIHByb2Nlc3MuICAqLworICBSVVNBR0VfU0VMRiA9IDAsCisjZGVmaW5lIFJVU0FHRV9TRUxGIFJVU0FHRV9TRUxGCisKKyAgLyogQWxsIG9mIGl0cyB0ZXJtaW5hdGVkIGNoaWxkIHByb2Nlc3Nlcy4gICovCisgIFJVU0FHRV9DSElMRFJFTiA9IC0xCisjZGVmaW5lIFJVU0FHRV9DSElMRFJFTiBSVVNBR0VfQ0hJTERSRU4KKworI2lmZGVmIF9fVVNFX0dOVQorICAsCisgIC8qIFRoZSBjYWxsaW5nIHRocmVhZC4gICovCisgIFJVU0FHRV9USFJFQUQgPSAxCisjIGRlZmluZSBSVVNBR0VfVEhSRUFEIFJVU0FHRV9USFJFQUQKKyAgLyogTmFtZSBmb3IgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBvbiBTb2xhcmlzLiAgKi8KKyMgZGVmaW5lIFJVU0FHRV9MV1AgUlVTQUdFX1RIUkVBRAorI2VuZGlmCit9OworCisjZGVmaW5lIF9fbmVlZF90aW1ldmFsCisjaW5jbHVkZSA8Yml0cy90aW1lLmg+CQkvKiBGb3IgYHN0cnVjdCB0aW1ldmFsJy4gICovCisKKy8qIFN0cnVjdHVyZSB3aGljaCBzYXlzIGhvdyBtdWNoIG9mIGVhY2ggcmVzb3VyY2UgaGFzIGJlZW4gdXNlZC4gICovCitzdHJ1Y3QgcnVzYWdlCisgIHsKKyAgICAvKiBUb3RhbCBhbW91bnQgb2YgdXNlciB0aW1lIHVzZWQuICAqLworICAgIHN0cnVjdCB0aW1ldmFsIHJ1X3V0aW1lOworICAgIC8qIFRvdGFsIGFtb3VudCBvZiBzeXN0ZW0gdGltZSB1c2VkLiAgKi8KKyAgICBzdHJ1Y3QgdGltZXZhbCBydV9zdGltZTsKKyAgICAvKiBNYXhpbXVtIHJlc2lkZW50IHNldCBzaXplIChpbiBraWxvYnl0ZXMpLiAgKi8KKyAgICBsb25nIGludCBydV9tYXhyc3M7CisgICAgLyogQW1vdW50IG9mIHNoYXJpbmcgb2YgdGV4dCBzZWdtZW50IG1lbW9yeQorICAgICAgIHdpdGggb3RoZXIgcHJvY2Vzc2VzIChraWxvYnl0ZS1zZWNvbmRzKS4gICovCisgICAgbG9uZyBpbnQgcnVfaXhyc3M7CisgICAgLyogQW1vdW50IG9mIGRhdGEgc2VnbWVudCBtZW1vcnkgdXNlZCAoa2lsb2J5dGUtc2Vjb25kcykuICAqLworICAgIGxvbmcgaW50IHJ1X2lkcnNzOworICAgIC8qIEFtb3VudCBvZiBzdGFjayBtZW1vcnkgdXNlZCAoa2lsb2J5dGUtc2Vjb25kcykuICAqLworICAgIGxvbmcgaW50IHJ1X2lzcnNzOworICAgIC8qIE51bWJlciBvZiBzb2Z0IHBhZ2UgZmF1bHRzIChpLmUuIHRob3NlIHNlcnZpY2VkIGJ5IHJlY2xhaW1pbmcKKyAgICAgICBhIHBhZ2UgZnJvbSB0aGUgbGlzdCBvZiBwYWdlcyBhd2FpdGluZyByZWFsbG9jYXRpb24uICAqLworICAgIGxvbmcgaW50IHJ1X21pbmZsdDsKKyAgICAvKiBOdW1iZXIgb2YgaGFyZCBwYWdlIGZhdWx0cyAoaS5lLiB0aG9zZSB0aGF0IHJlcXVpcmVkIEkvTykuICAqLworICAgIGxvbmcgaW50IHJ1X21hamZsdDsKKyAgICAvKiBOdW1iZXIgb2YgdGltZXMgYSBwcm9jZXNzIHdhcyBzd2FwcGVkIG91dCBvZiBwaHlzaWNhbCBtZW1vcnkuICAqLworICAgIGxvbmcgaW50IHJ1X25zd2FwOworICAgIC8qIE51bWJlciBvZiBpbnB1dCBvcGVyYXRpb25zIHZpYSB0aGUgZmlsZSBzeXN0ZW0uICBOb3RlOiBUaGlzCisgICAgICAgYW5kIGBydV9vdWJsb2NrJyBkbyBub3QgaW5jbHVkZSBvcGVyYXRpb25zIHdpdGggdGhlIGNhY2hlLiAgKi8KKyAgICBsb25nIGludCBydV9pbmJsb2NrOworICAgIC8qIE51bWJlciBvZiBvdXRwdXQgb3BlcmF0aW9ucyB2aWEgdGhlIGZpbGUgc3lzdGVtLiAgKi8KKyAgICBsb25nIGludCBydV9vdWJsb2NrOworICAgIC8qIE51bWJlciBvZiBJUEMgbWVzc2FnZXMgc2VudC4gICovCisgICAgbG9uZyBpbnQgcnVfbXNnc25kOworICAgIC8qIE51bWJlciBvZiBJUEMgbWVzc2FnZXMgcmVjZWl2ZWQuICAqLworICAgIGxvbmcgaW50IHJ1X21zZ3JjdjsKKyAgICAvKiBOdW1iZXIgb2Ygc2lnbmFscyBkZWxpdmVyZWQuICAqLworICAgIGxvbmcgaW50IHJ1X25zaWduYWxzOworICAgIC8qIE51bWJlciBvZiB2b2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlcywgaS5lLiBiZWNhdXNlIHRoZSBwcm9jZXNzCisgICAgICAgZ2F2ZSB1cCB0aGUgcHJvY2VzcyBiZWZvcmUgaXQgaGFkIHRvICh1c3VhbGx5IHRvIHdhaXQgZm9yIHNvbWUKKyAgICAgICByZXNvdXJjZSB0byBiZSBhdmFpbGFibGUpLiAgKi8KKyAgICBsb25nIGludCBydV9udmNzdzsKKyAgICAvKiBOdW1iZXIgb2YgaW52b2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlcywgaS5lLiBhIGhpZ2hlciBwcmlvcml0eSBwcm9jZXNzCisgICAgICAgYmVjYW1lIHJ1bm5hYmxlIG9yIHRoZSBjdXJyZW50IHByb2Nlc3MgdXNlZCB1cCBpdHMgdGltZSBzbGljZS4gICovCisgICAgbG9uZyBpbnQgcnVfbml2Y3N3OworICB9OworCisvKiBQcmlvcml0eSBsaW1pdHMuICAqLworI2RlZmluZSBQUklPX01JTgktMjAJLyogTWluaW11bSBwcmlvcml0eSBhIHByb2Nlc3MgY2FuIGhhdmUuICAqLworI2RlZmluZSBQUklPX01BWAkyMAkvKiBNYXhpbXVtIHByaW9yaXR5IGEgcHJvY2VzcyBjYW4gaGF2ZS4gICovCisKKy8qIFRoZSB0eXBlIG9mIHRoZSBXSElDSCBhcmd1bWVudCB0byBgZ2V0cHJpb3JpdHknIGFuZCBgc2V0cHJpb3JpdHknLAorICAgaW5kaWNhdGluZyB3aGF0IGZsYXZvciBvZiBlbnRpdHkgdGhlIFdITyBhcmd1bWVudCBzcGVjaWZpZXMuICAqLworZW51bSBfX3ByaW9yaXR5X3doaWNoCit7CisgIFBSSU9fUFJPQ0VTUyA9IDAsCQkvKiBXSE8gaXMgYSBwcm9jZXNzIElELiAgKi8KKyNkZWZpbmUgUFJJT19QUk9DRVNTIFBSSU9fUFJPQ0VTUworICBQUklPX1BHUlAgPSAxLAkJLyogV0hPIGlzIGEgcHJvY2VzcyBncm91cCBJRC4gICovCisjZGVmaW5lIFBSSU9fUEdSUCBQUklPX1BHUlAKKyAgUFJJT19VU0VSID0gMgkJCS8qIFdITyBpcyBhIHVzZXIgSUQuICAqLworI2RlZmluZSBQUklPX1VTRVIgUFJJT19VU0VSCit9OworCisKK19fQkVHSU5fREVDTFMKKworI2lmZGVmIF9fVVNFX0dOVQorLyogTW9kaWZ5IGFuZCByZXR1cm4gcmVzb3VyY2UgbGltaXRzIG9mIGEgcHJvY2VzcyBhdG9taWNhbGx5LiAgKi8KKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgcHJsaW1pdCAoX19waWRfdCBfX3BpZCwgZW51bSBfX3JsaW1pdF9yZXNvdXJjZSBfX3Jlc291cmNlLAorCQkgICAgX19jb25zdCBzdHJ1Y3QgcmxpbWl0ICpfX25ld19saW1pdCwKKwkJICAgIHN0cnVjdCBybGltaXQgKl9fb2xkX2xpbWl0KSBfX1RIUk9XOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAocHJsaW1pdCwgKF9fcGlkX3QgX19waWQsCisJCQkJICAgICBlbnVtIF9fcmxpbWl0X3Jlc291cmNlIF9fcmVzb3VyY2UsCisJCQkJICAgICBfX2NvbnN0IHN0cnVjdCBybGltaXQgKl9fbmV3X2xpbWl0LAorCQkJCSAgICAgc3RydWN0IHJsaW1pdCAqX19vbGRfbGltaXQpLCBwcmxpbWl0NjQpOworIyAgZWxzZQorIyAgIGRlZmluZSBwcmxpbWl0IHBybGltaXQ2NAorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgcHJsaW1pdDY0IChfX3BpZF90IF9fcGlkLCBlbnVtIF9fcmxpbWl0X3Jlc291cmNlIF9fcmVzb3VyY2UsCisJCSAgICAgIF9fY29uc3Qgc3RydWN0IHJsaW1pdDY0ICpfX25ld19saW1pdCwKKwkJICAgICAgc3RydWN0IHJsaW1pdDY0ICpfX29sZF9saW1pdCkgX19USFJPVzsKKyMgZW5kaWYKKyNlbmRpZgorCitfX0VORF9ERUNMUwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2NoZWQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NjaGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIxNDMxZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NjaGVkLmgKQEAgLTAsMCArMSwyMTIgQEAKKy8qIERlZmluaXRpb25zIG9mIGNvbnN0YW50cyBhbmQgZGF0YSBzdHJ1Y3R1cmUgZm9yIFBPU0lYIDEwMDMuMWItMTk5MworICAgc2NoZWR1bGluZyBpbnRlcmZhY2UuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSwyMDAxLTIwMDMsMjAwNSwyMDA2LDIwMDcsMjAwOCwyMDA5LDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9fbmVlZF9zY2hlZHBhcmFtCisKKyNpZm5kZWYgX1NDSEVEX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc2NoZWQuaD4gZGlyZWN0bHk7IHVzZSA8c2NoZWQuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCisvKiBTY2hlZHVsaW5nIGFsZ29yaXRobXMuICAqLworI2RlZmluZSBTQ0hFRF9PVEhFUgkJMAorI2RlZmluZSBTQ0hFRF9GSUZPCQkxCisjZGVmaW5lIFNDSEVEX1JSCQkyCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBTQ0hFRF9CQVRDSAkJMworIyBkZWZpbmUgU0NIRURfSURMRQkJNQorCisjIGRlZmluZSBTQ0hFRF9SRVNFVF9PTl9GT1JLCTB4NDAwMDAwMDAKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisvKiBDbG9uaW5nIGZsYWdzLiAgKi8KKyMgZGVmaW5lIENTSUdOQUwgICAgICAgMHgwMDAwMDBmZiAvKiBTaWduYWwgbWFzayB0byBiZSBzZW50IGF0IGV4aXQuICAqLworIyBkZWZpbmUgQ0xPTkVfVk0gICAgICAweDAwMDAwMTAwIC8qIFNldCBpZiBWTSBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMuICAqLworIyBkZWZpbmUgQ0xPTkVfRlMgICAgICAweDAwMDAwMjAwIC8qIFNldCBpZiBmcyBpbmZvIHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3Nlcy4gICovCisjIGRlZmluZSBDTE9ORV9GSUxFUyAgIDB4MDAwMDA0MDAgLyogU2V0IGlmIG9wZW4gZmlsZXMgc2hhcmVkIGJldHdlZW4gcHJvY2Vzc2VzLiAgKi8KKyMgZGVmaW5lIENMT05FX1NJR0hBTkQgMHgwMDAwMDgwMCAvKiBTZXQgaWYgc2lnbmFsIGhhbmRsZXJzIHNoYXJlZC4gICovCisjIGRlZmluZSBDTE9ORV9QVFJBQ0UgIDB4MDAwMDIwMDAgLyogU2V0IGlmIHRyYWNpbmcgY29udGludWVzIG9uIHRoZSBjaGlsZC4gICovCisjIGRlZmluZSBDTE9ORV9WRk9SSyAgIDB4MDAwMDQwMDAgLyogU2V0IGlmIHRoZSBwYXJlbnQgd2FudHMgdGhlIGNoaWxkIHRvCisJCQkJICAgICB3YWtlIGl0IHVwIG9uIG1tX3JlbGVhc2UuICAqLworIyBkZWZpbmUgQ0xPTkVfUEFSRU5UICAweDAwMDA4MDAwIC8qIFNldCBpZiB3ZSB3YW50IHRvIGhhdmUgdGhlIHNhbWUKKwkJCQkgICAgIHBhcmVudCBhcyB0aGUgY2xvbmVyLiAgKi8KKyMgZGVmaW5lIENMT05FX1RIUkVBRCAgMHgwMDAxMDAwMCAvKiBTZXQgdG8gYWRkIHRvIHNhbWUgdGhyZWFkIGdyb3VwLiAgKi8KKyMgZGVmaW5lIENMT05FX05FV05TICAgMHgwMDAyMDAwMCAvKiBTZXQgdG8gY3JlYXRlIG5ldyBuYW1lc3BhY2UuICAqLworIyBkZWZpbmUgQ0xPTkVfU1lTVlNFTSAweDAwMDQwMDAwIC8qIFNldCB0byBzaGFyZWQgU1ZJRCBTRU1fVU5ETyBzZW1hbnRpY3MuICAqLworIyBkZWZpbmUgQ0xPTkVfU0VUVExTICAweDAwMDgwMDAwIC8qIFNldCBUTFMgaW5mby4gICovCisjIGRlZmluZSBDTE9ORV9QQVJFTlRfU0VUVElEIDB4MDAxMDAwMDAgLyogU3RvcmUgVElEIGluIHVzZXJsZXZlbCBidWZmZXIKKwkJCQkJICAgYmVmb3JlIE1NIGNvcHkuICAqLworIyBkZWZpbmUgQ0xPTkVfQ0hJTERfQ0xFQVJUSUQgMHgwMDIwMDAwMCAvKiBSZWdpc3RlciBleGl0IGZ1dGV4IGFuZCBtZW1vcnkKKwkJCQkJICAgIGxvY2F0aW9uIHRvIGNsZWFyLiAgKi8KKyMgZGVmaW5lIENMT05FX0RFVEFDSEVEIDB4MDA0MDAwMDAgLyogQ3JlYXRlIGNsb25lIGRldGFjaGVkLiAgKi8KKyMgZGVmaW5lIENMT05FX1VOVFJBQ0VEIDB4MDA4MDAwMDAgLyogU2V0IGlmIHRoZSB0cmFjaW5nIHByb2Nlc3MgY2FuJ3QKKwkJCQkgICAgICBmb3JjZSBDTE9ORV9QVFJBQ0Ugb24gdGhpcyBjbG9uZS4gICovCisjIGRlZmluZSBDTE9ORV9DSElMRF9TRVRUSUQgMHgwMTAwMDAwMCAvKiBTdG9yZSBUSUQgaW4gdXNlcmxldmVsIGJ1ZmZlciBpbgorCQkJCQkgIHRoZSBjaGlsZC4gICovCisjIGRlZmluZSBDTE9ORV9ORVdVVFMJMHgwNDAwMDAwMAkvKiBOZXcgdXRzbmFtZSBncm91cC4gICovCisjIGRlZmluZSBDTE9ORV9ORVdJUEMJMHgwODAwMDAwMAkvKiBOZXcgaXBjcy4gICovCisjIGRlZmluZSBDTE9ORV9ORVdVU0VSCTB4MTAwMDAwMDAJLyogTmV3IHVzZXIgbmFtZXNwYWNlLiAgKi8KKyMgZGVmaW5lIENMT05FX05FV1BJRAkweDIwMDAwMDAwCS8qIE5ldyBwaWQgbmFtZXNwYWNlLiAgKi8KKyMgZGVmaW5lIENMT05FX05FV05FVAkweDQwMDAwMDAwCS8qIE5ldyBuZXR3b3JrIG5hbWVzcGFjZS4gICovCisjIGRlZmluZSBDTE9ORV9JTwkweDgwMDAwMDAwCS8qIENsb25lIEkvTyBjb250ZXh0LiAgKi8KKyNlbmRpZgorCisvKiBUaGUgb2ZmaWNpYWwgZGVmaW5pdGlvbi4gICovCitzdHJ1Y3Qgc2NoZWRfcGFyYW0KKyAgeworICAgIGludCBfX3NjaGVkX3ByaW9yaXR5OworICB9OworCitfX0JFR0lOX0RFQ0xTCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIENsb25lIGN1cnJlbnQgcHJvY2Vzcy4gICovCitleHRlcm4gaW50IGNsb25lIChpbnQgKCpfX2ZuKSAodm9pZCAqX19hcmcpLCB2b2lkICpfX2NoaWxkX3N0YWNrLAorCQkgIGludCBfX2ZsYWdzLCB2b2lkICpfX2FyZywgLi4uKSBfX1RIUk9XOworCisvKiBVbnNoYXJlIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2VzLiAgKi8KK2V4dGVybiBpbnQgdW5zaGFyZSAoaW50IF9fZmxhZ3MpIF9fVEhST1c7CisKKy8qIEdldCBpbmRleCBvZiBjdXJyZW50bHkgdXNlZCBDUFUuICAqLworZXh0ZXJuIGludCBzY2hlZF9nZXRjcHUgKHZvaWQpIF9fVEhST1c7CisKKy8qIFN3aXRjaCBwcm9jZXNzIHRvIG5hbWVzcGFjZSBvZiB0eXBlIE5TVFlQRSBpbmRpY2F0ZWQgYnkgRkQuICAqLworZXh0ZXJuIGludCBzZXRucyAoaW50IF9fZmQsIGludCBfX25zdHlwZSkgX19USFJPVzsKKyNlbmRpZgorCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBuZWVkIHNjaGVkcGFyYW0gKi8KKworI2lmICFkZWZpbmVkIF9fZGVmaW5lZF9zY2hlZHBhcmFtIFwKKyAgICAmJiAoZGVmaW5lZCBfX25lZWRfc2NoZWRwYXJhbSB8fCBkZWZpbmVkIF9TQ0hFRF9IKQorIyBkZWZpbmUgX19kZWZpbmVkX3NjaGVkcGFyYW0JMQorLyogRGF0YSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYSBwcm9jZXNzJyBzY2hlZHVsYWJpbGl0eS4gICovCitzdHJ1Y3QgX19zY2hlZF9wYXJhbQorICB7CisgICAgaW50IF9fc2NoZWRfcHJpb3JpdHk7CisgIH07CisjIHVuZGVmIF9fbmVlZF9zY2hlZHBhcmFtCisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfU0NIRURfSCAmJiAhZGVmaW5lZCBfX2NwdV9zZXRfdF9kZWZpbmVkCisjIGRlZmluZSBfX2NwdV9zZXRfdF9kZWZpbmVkCisvKiBTaXplIGRlZmluaXRpb24gZm9yIENQVSBzZXRzLiAgKi8KKyMgZGVmaW5lIF9fQ1BVX1NFVFNJWkUJMTAyNAorIyBkZWZpbmUgX19OQ1BVQklUUwkoOCAqIHNpemVvZiAoX19jcHVfbWFzaykpCisKKy8qIFR5cGUgZm9yIGFycmF5IGVsZW1lbnRzIGluICdjcHVfc2V0X3QnLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgX19jcHVfbWFzazsKKworLyogQmFzaWMgYWNjZXNzIGZ1bmN0aW9ucy4gICovCisjIGRlZmluZSBfX0NQVUVMVChjcHUpCSgoY3B1KSAvIF9fTkNQVUJJVFMpCisjIGRlZmluZSBfX0NQVU1BU0soY3B1KQkoKF9fY3B1X21hc2spIDEgPDwgKChjcHUpICUgX19OQ1BVQklUUykpCisKKy8qIERhdGEgc3RydWN0dXJlIHRvIGRlc2NyaWJlIENQVSBtYXNrLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIF9fY3B1X21hc2sgX19iaXRzW19fQ1BVX1NFVFNJWkUgLyBfX05DUFVCSVRTXTsKK30gY3B1X3NldF90OworCisvKiBBY2Nlc3MgZnVuY3Rpb25zIGZvciBDUFUgbWFza3MuICAqLworIyBpZiBfX0dOVUNfUFJFUkVRICgyLCA5MSkKKyMgIGRlZmluZSBfX0NQVV9aRVJPX1Moc2V0c2l6ZSwgY3B1c2V0cCkgXAorICBkbyBfX2J1aWx0aW5fbWVtc2V0IChjcHVzZXRwLCAnXDAnLCBzZXRzaXplKTsgd2hpbGUgKDApCisjIGVsc2UKKyMgIGRlZmluZSBfX0NQVV9aRVJPX1Moc2V0c2l6ZSwgY3B1c2V0cCkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIHNpemVfdCBfX2k7CQkJCQkJCQkgICAgICBcCisgICAgc2l6ZV90IF9faW1heCA9IChzZXRzaXplKSAvIHNpemVvZiAoX19jcHVfbWFzayk7CQkJICAgICAgXAorICAgIF9fY3B1X21hc2sgKl9fYml0cyA9IChjcHVzZXRwKS0+X19iaXRzOwkJCQkgICAgICBcCisgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ltYXg7ICsrX19pKQkJCQkJICAgICAgXAorICAgICAgX19iaXRzW19faV0gPSAwOwkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisjIGVuZGlmCisjIGRlZmluZSBfX0NQVV9TRVRfUyhjcHUsIHNldHNpemUsIGNwdXNldHApIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKHsgc2l6ZV90IF9fY3B1ID0gKGNwdSk7CQkJCQkJICAgICAgXAorICAgICAgX19jcHUgPCA4ICogKHNldHNpemUpCQkJCQkJICAgICAgXAorICAgICAgPyAoKChfX2NwdV9tYXNrICopICgoY3B1c2V0cCktPl9fYml0cykpW19fQ1BVRUxUIChfX2NwdSldCQkgICAgICBcCisJIHw9IF9fQ1BVTUFTSyAoX19jcHUpKQkJCQkJCSAgICAgIFwKKyAgICAgIDogMDsgfSkpCisjIGRlZmluZSBfX0NQVV9DTFJfUyhjcHUsIHNldHNpemUsIGNwdXNldHApIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKHsgc2l6ZV90IF9fY3B1ID0gKGNwdSk7CQkJCQkJICAgICAgXAorICAgICAgX19jcHUgPCA4ICogKHNldHNpemUpCQkJCQkJICAgICAgXAorICAgICAgPyAoKChfX2NwdV9tYXNrICopICgoY3B1c2V0cCktPl9fYml0cykpW19fQ1BVRUxUIChfX2NwdSldCQkgICAgICBcCisJICY9IH5fX0NQVU1BU0sgKF9fY3B1KSkJCQkJCQkgICAgICBcCisgICAgICA6IDA7IH0pKQorIyBkZWZpbmUgX19DUFVfSVNTRVRfUyhjcHUsIHNldHNpemUsIGNwdXNldHApIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKHsgc2l6ZV90IF9fY3B1ID0gKGNwdSk7CQkJCQkJICAgICAgXAorICAgICAgX19jcHUgPCA4ICogKHNldHNpemUpCQkJCQkJICAgICAgXAorICAgICAgPyAoKCgoX19jb25zdCBfX2NwdV9tYXNrICopICgoY3B1c2V0cCktPl9fYml0cykpW19fQ1BVRUxUIChfX2NwdSldICAgICAgXAorCSAgJiBfX0NQVU1BU0sgKF9fY3B1KSkpICE9IDAJCQkJCSAgICAgIFwKKyAgICAgIDogMDsgfSkpCisKKyMgZGVmaW5lIF9fQ1BVX0NPVU5UX1Moc2V0c2l6ZSwgY3B1c2V0cCkgXAorICBfX3NjaGVkX2NwdWNvdW50IChzZXRzaXplLCBjcHVzZXRwKQorCisjIGlmIF9fR05VQ19QUkVSRVEgKDIsIDkxKQorIyAgZGVmaW5lIF9fQ1BVX0VRVUFMX1Moc2V0c2l6ZSwgY3B1c2V0cDEsIGNwdXNldHAyKSBcCisgIChfX2J1aWx0aW5fbWVtY21wIChjcHVzZXRwMSwgY3B1c2V0cDIsIHNldHNpemUpID09IDApCisjIGVsc2UKKyMgIGRlZmluZSBfX0NQVV9FUVVBTF9TKHNldHNpemUsIGNwdXNldHAxLCBjcHVzZXRwMikgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBfX2NvbnN0IF9fY3B1X21hc2sgKl9fYXJyMSA9IChjcHVzZXRwMSktPl9fYml0czsJCQkgICAgICBcCisgICAgICBfX2NvbnN0IF9fY3B1X21hc2sgKl9fYXJyMiA9IChjcHVzZXRwMiktPl9fYml0czsJCQkgICAgICBcCisgICAgICBzaXplX3QgX19pbWF4ID0gKHNldHNpemUpIC8gc2l6ZW9mIChfX2NwdV9tYXNrKTsJCQkgICAgICBcCisgICAgICBzaXplX3QgX19pOwkJCQkJCQkgICAgICBcCisgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9faW1heDsgKytfX2kpCQkJCSAgICAgIFwKKwlpZiAoX19hcnIxW19faV0gIT0gX19hcnIyW19faV0pCQkJCQkgICAgICBcCisJICBicmVhazsJCQkJCQkJICAgICAgXAorICAgICAgX19pID09IF9faW1heDsgfSkpCisjIGVuZGlmCisKKyMgZGVmaW5lIF9fQ1BVX09QX1Moc2V0c2l6ZSwgZGVzdHNldCwgc3Jjc2V0MSwgc3Jjc2V0Miwgb3ApIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKHsgY3B1X3NldF90ICpfX2Rlc3QgPSAoZGVzdHNldCk7CQkJCQkgICAgICBcCisgICAgICBfX2NvbnN0IF9fY3B1X21hc2sgKl9fYXJyMSA9IChzcmNzZXQxKS0+X19iaXRzOwkJCSAgICAgIFwKKyAgICAgIF9fY29uc3QgX19jcHVfbWFzayAqX19hcnIyID0gKHNyY3NldDIpLT5fX2JpdHM7CQkJICAgICAgXAorICAgICAgc2l6ZV90IF9faW1heCA9IChzZXRzaXplKSAvIHNpemVvZiAoX19jcHVfbWFzayk7CQkJICAgICAgXAorICAgICAgc2l6ZV90IF9faTsJCQkJCQkJICAgICAgXAorICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ltYXg7ICsrX19pKQkJCQkgICAgICBcCisJKChfX2NwdV9tYXNrICopIF9fZGVzdC0+X19iaXRzKVtfX2ldID0gX19hcnIxW19faV0gb3AgX19hcnIyW19faV07ICAgIFwKKyAgICAgIF9fZGVzdDsgfSkpCisKKyMgZGVmaW5lIF9fQ1BVX0FMTE9DX1NJWkUoY291bnQpIFwKKyAgKCgoKGNvdW50KSArIF9fTkNQVUJJVFMgLSAxKSAvIF9fTkNQVUJJVFMpICogc2l6ZW9mIChfX2NwdV9tYXNrKSkKKyMgZGVmaW5lIF9fQ1BVX0FMTE9DKGNvdW50KSBfX3NjaGVkX2NwdWFsbG9jIChjb3VudCkKKyMgZGVmaW5lIF9fQ1BVX0ZSRUUoY3B1c2V0KSBfX3NjaGVkX2NwdWZyZWUgKGNwdXNldCkKKworX19CRUdJTl9ERUNMUworCitleHRlcm4gaW50IF9fc2NoZWRfY3B1Y291bnQgKHNpemVfdCBfX3NldHNpemUsIGNvbnN0IGNwdV9zZXRfdCAqX19zZXRwKQorICBfX1RIUk9XOworZXh0ZXJuIGNwdV9zZXRfdCAqX19zY2hlZF9jcHVhbGxvYyAoc2l6ZV90IF9fY291bnQpIF9fVEhST1cgX193dXI7CitleHRlcm4gdm9pZCBfX3NjaGVkX2NwdWZyZWUgKGNwdV9zZXRfdCAqX19zZXQpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2VsZWN0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zZWxlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWJkZDdjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2VsZWN0LmgKQEAgLTAsMCArMSw2NCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LTE5OTksMjAwMSwyMDA4LDIwMDksMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NFTEVDVF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvc2VsZWN0Lmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMgorCisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBfX0ZEX1pFUk9fU1RPUyAic3Rvc3EiCisjIGVsc2UKKyMgIGRlZmluZSBfX0ZEX1pFUk9fU1RPUyAic3Rvc2wiCisjIGVuZGlmCisKKyMgZGVmaW5lIF9fRkRfWkVSTyhmZHNwKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgaW50IF9fZDAsIF9fZDE7CQkJCQkJCSAgICAgIFwKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNsZDsgcmVwOyAiIF9fRkRfWkVST19TVE9TCQkJICAgICAgXAorCQkJICA6ICI9YyIgKF9fZDApLCAiPUQiIChfX2QxKQkJCSAgICAgIFwKKwkJCSAgOiAiYSIgKDApLCAiMCIgKHNpemVvZiAoZmRfc2V0KQkJICAgICAgXAorCQkJCQkgIC8gc2l6ZW9mIChfX2ZkX21hc2spKSwJICAgICAgXAorCQkJICAgICIxIiAoJl9fRkRTX0JJVFMgKGZkc3ApWzBdKQkJCSAgICAgIFwKKwkJCSAgOiAibWVtb3J5Iik7CQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNlbHNlCS8qICEgR05VIENDICovCisKKy8qIFdlIGRvbid0IHVzZSBgbWVtc2V0JyBiZWNhdXNlIHRoaXMgd291bGQgcmVxdWlyZSBhIHByb3RvdHlwZSBhbmQKKyAgIHRoZSBhcnJheSBpc24ndCB0b28gYmlnLiAgKi8KKyMgZGVmaW5lIF9fRkRfWkVSTyhzZXQpICBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgdW5zaWduZWQgaW50IF9faTsJCQkJCQkJICAgICAgXAorICAgIGZkX3NldCAqX19hcnIgPSAoc2V0KTsJCQkJCQkgICAgICBcCisgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBzaXplb2YgKGZkX3NldCkgLyBzaXplb2YgKF9fZmRfbWFzayk7ICsrX19pKQkgICAgICBcCisgICAgICBfX0ZEU19CSVRTIChfX2FycilbX19pXSA9IDA7CQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNlbmRpZgkvKiBHTlUgQ0MgKi8KKworI2RlZmluZSBfX0ZEX1NFVChkLCBzZXQpIFwKKyAgKCh2b2lkKSAoX19GRFNfQklUUyAoc2V0KVtfX0ZEX0VMVCAoZCldIHw9IF9fRkRfTUFTSyAoZCkpKQorI2RlZmluZSBfX0ZEX0NMUihkLCBzZXQpIFwKKyAgKCh2b2lkKSAoX19GRFNfQklUUyAoc2V0KVtfX0ZEX0VMVCAoZCldICY9IH5fX0ZEX01BU0sgKGQpKSkKKyNkZWZpbmUgX19GRF9JU1NFVChkLCBzZXQpIFwKKyAgKChfX0ZEU19CSVRTIChzZXQpW19fRkRfRUxUIChkKV0gJiBfX0ZEX01BU0sgKGQpKSAhPSAwKQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2VsZWN0Mi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2VsZWN0Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Y2UxYjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zZWxlY3QyLmgKQEAgLTAsMCArMSwzNSBAQAorLyogQ2hlY2tpbmcgbWFjcm9zIGZvciBzZWxlY3QgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU0VMRUNUX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc2VsZWN0Mi5oPiBkaXJlY3RseTsgdXNlIDxzeXMvc2VsZWN0Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIEhlbHBlciBmdW5jdGlvbnMgdG8gaXNzdWUgd2FybmluZ3MgYW5kIGVycm9ycyB3aGVuIG5lZWRlZC4gICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQgX19mZGVsdF9jaGsgKHVuc2lnbmVkIGxvbmcgaW50IF9fZCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQgX19mZGVsdF93YXJuICh1bnNpZ25lZCBsb25nIGludCBfX2QpCisgIF9fd2FybmF0dHIgKCJiaXQgb3V0c2lkZSBvZiBmZF9zZXQgc2VsZWN0ZWQiKTsKKyN1bmRlZiBfX0ZEX0VMVAorI2RlZmluZQlfX0ZEX0VMVChkKSBcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCSAgICBcCisgICh7IHVuc2lnbmVkIGxvbmcgaW50IF9fZCA9IChkKTsJCQkJCSAgICBcCisgICAgIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19kKQkJCQkJICAgIFwKKyAgICAgID8gKF9fZCA+PSBfX0ZEX1NFVFNJWkUJCQkJCQkgICAgXAorCSA/IF9fZmRlbHRfd2FybiAoX19kKSA6IChfX2QgLyBfX05GREJJVFMpKQkJCSAgICBcCisgICAgICA6IF9fZmRlbHRfY2hrIChfX2QpKTsgfSkKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NlbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2VtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg2YzM1NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NlbS5oCkBAIC0wLDAgKzEsODcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMiwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NFTV9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3NlbS5oPiBkaXJlY3RseTsgdXNlIDxzeXMvc2VtLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogRmxhZ3MgZm9yIGBzZW1vcCcuICAqLworI2RlZmluZSBTRU1fVU5ETwkweDEwMDAJCS8qIHVuZG8gdGhlIG9wZXJhdGlvbiBvbiBleGl0ICovCisKKy8qIENvbW1hbmRzIGZvciBgc2VtY3RsJy4gICovCisjZGVmaW5lIEdFVFBJRAkJMTEJCS8qIGdldCBzZW1waWQgKi8KKyNkZWZpbmUgR0VUVkFMCQkxMgkJLyogZ2V0IHNlbXZhbCAqLworI2RlZmluZSBHRVRBTEwJCTEzCQkvKiBnZXQgYWxsIHNlbXZhbCdzICovCisjZGVmaW5lIEdFVE5DTlQJCTE0CQkvKiBnZXQgc2VtbmNudCAqLworI2RlZmluZSBHRVRaQ05UCQkxNQkJLyogZ2V0IHNlbXpjbnQgKi8KKyNkZWZpbmUgU0VUVkFMCQkxNgkJLyogc2V0IHNlbXZhbCAqLworI2RlZmluZSBTRVRBTEwJCTE3CQkvKiBzZXQgYWxsIHNlbXZhbCdzICovCisKKworLyogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHNldCBvZiBzZW1hcGhvcmVzLiAgKi8KK3N0cnVjdCBzZW1pZF9kcworeworICBzdHJ1Y3QgaXBjX3Blcm0gc2VtX3Blcm07CQkvKiBvcGVyYXRpb24gcGVybWlzc2lvbiBzdHJ1Y3QgKi8KKyAgX190aW1lX3Qgc2VtX290aW1lOwkJCS8qIGxhc3Qgc2Vtb3AoKSB0aW1lICovCisgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMTsKKyAgX190aW1lX3Qgc2VtX2N0aW1lOwkJCS8qIGxhc3QgdGltZSBjaGFuZ2VkIGJ5IHNlbWN0bCgpICovCisgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMjsKKyAgdW5zaWduZWQgbG9uZyBpbnQgc2VtX25zZW1zOwkJLyogbnVtYmVyIG9mIHNlbWFwaG9yZXMgaW4gc2V0ICovCisgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMzsKKyAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQ0OworfTsKKworLyogVGhlIHVzZXIgc2hvdWxkIGRlZmluZSBhIHVuaW9uIGxpa2UgdGhlIGZvbGxvd2luZyB0byB1c2UgaXQgZm9yIGFyZ3VtZW50cworICAgZm9yIGBzZW1jdGwnLgorCisgICB1bmlvbiBzZW11bgorICAgeworICAgICBpbnQgdmFsOwkJCQk8PSB2YWx1ZSBmb3IgU0VUVkFMCisgICAgIHN0cnVjdCBzZW1pZF9kcyAqYnVmOwkJPD0gYnVmZmVyIGZvciBJUENfU1RBVCAmIElQQ19TRVQKKyAgICAgdW5zaWduZWQgc2hvcnQgaW50ICphcnJheTsJCTw9IGFycmF5IGZvciBHRVRBTEwgJiBTRVRBTEwKKyAgICAgc3RydWN0IHNlbWluZm8gKl9fYnVmOwkJPD0gYnVmZmVyIGZvciBJUENfSU5GTworICAgfTsKKworICAgUHJldmlvdXMgdmVyc2lvbnMgb2YgdGhpcyBmaWxlIHVzZWQgdG8gZGVmaW5lIHRoaXMgdW5pb24gYnV0IHRoaXMgaXMKKyAgIGluY29ycmVjdC4gIE9uZSBjYW4gdGVzdCB0aGUgbWFjcm8gX1NFTV9TRU1VTl9VTkRFRklORUQgdG8gc2VlIHdoZXRoZXIKKyAgIG9uZSBtdXN0IGRlZmluZSB0aGUgdW5pb24gb3Igbm90LiAgKi8KKyNkZWZpbmUgX1NFTV9TRU1VTl9VTkRFRklORUQJMQorCisjaWZkZWYgX19VU0VfTUlTQworCisvKiBpcGNzIGN0bCBjbWRzICovCisjIGRlZmluZSBTRU1fU1RBVCAxOAorIyBkZWZpbmUgU0VNX0lORk8gMTkKKworc3RydWN0ICBzZW1pbmZvCit7CisgIGludCBzZW1tYXA7CisgIGludCBzZW1tbmk7CisgIGludCBzZW1tbnM7CisgIGludCBzZW1tbnU7CisgIGludCBzZW1tc2w7CisgIGludCBzZW1vcG07CisgIGludCBzZW11bWU7CisgIGludCBzZW11c3o7CisgIGludCBzZW12bXg7CisgIGludCBzZW1hZW07Cit9OworCisjZW5kaWYgLyogX19VU0VfTUlTQyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2VtYXBob3JlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zZW1hcGhvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTczYmM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2VtYXBob3JlLmgKQEAgLTAsMCArMSw0MSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NFTUFQSE9SRV9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvc2VtYXBob3JlLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzZW1hcGhvcmUuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworI2lmIF9fV09SRFNJWkUgPT0gNjQKKyMgZGVmaW5lIF9fU0laRU9GX1NFTV9UCTMyCisjZWxzZQorIyBkZWZpbmUgX19TSVpFT0ZfU0VNX1QJMTYKKyNlbmRpZgorCisKKy8qIFZhbHVlIHJldHVybmVkIGlmIGBzZW1fb3BlbicgZmFpbGVkLiAgKi8KKyNkZWZpbmUgU0VNX0ZBSUxFRCAgICAgICgoc2VtX3QgKikgMCkKKworCit0eXBlZGVmIHVuaW9uCit7CisgIGNoYXIgX19zaXplW19fU0laRU9GX1NFTV9UXTsKKyAgbG9uZyBpbnQgX19hbGlnbjsKK30gc2VtX3Q7CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zZXRqbXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NldGptcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5Yjk4YjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zZXRqbXAuaApAQCAtMCwwICsxLDM5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiwyMDAzLDIwMDUsMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogRGVmaW5lIHRoZSBtYWNoaW5lLWRlcGVuZGVudCB0eXBlIGBqbXBfYnVmJy4gIHg4Ni02NCB2ZXJzaW9uLiAgKi8KKyNpZm5kZWYgX0JJVFNfU0VUSk1QX0gKKyNkZWZpbmUgX0JJVFNfU0VUSk1QX0ggIDEKKworI2lmICFkZWZpbmVkIF9TRVRKTVBfSCAmJiAhZGVmaW5lZCBfUFRIUkVBRF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3NldGptcC5oPiBkaXJlY3RseTsgdXNlIDxzZXRqbXAuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworI2lmbmRlZiBfQVNNCisKKyMgaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiBsb25nIGludCBfX2ptcF9idWZbOF07CisjIGVsc2UKK3R5cGVkZWYgaW50IF9fam1wX2J1Zls2XTsKKyMgZW5kaWYKKworI2VuZGlmCisKKyNlbmRpZiAgLyogYml0cy9zZXRqbXAuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2V0am1wMi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2V0am1wMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNjVkMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zZXRqbXAyLmgKQEAgLTAsMCArMSw0MSBAQAorLyogQ2hlY2tpbmcgbWFjcm9zIGZvciBzZXRqbXAgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA5LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TRVRKTVBfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zZXRqbXAyLmg+IGRpcmVjdGx5OyB1c2UgPHNldGptcC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBWYXJpYW50IG9mIHRoZSBsb25nam1wIGZ1bmN0aW9ucyB3aGljaCBwZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNraW5nLiAgKi8KKyNpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIHZvaWQgX19SRURJUkVDVF9OVEhOTCAobG9uZ2ptcCwKKwkJCSAgICAgIChzdHJ1Y3QgX19qbXBfYnVmX3RhZyBfX2VudlsxXSwgaW50IF9fdmFsKSwKKwkJCSAgICAgIF9fbG9uZ2ptcF9jaGspIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKK2V4dGVybiB2b2lkIF9fUkVESVJFQ1RfTlRITkwgKF9sb25nam1wLAorCQkJICAgICAgKHN0cnVjdCBfX2ptcF9idWZfdGFnIF9fZW52WzFdLCBpbnQgX192YWwpLAorCQkJICAgICAgX19sb25nam1wX2NoaykgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworZXh0ZXJuIHZvaWQgX19SRURJUkVDVF9OVEhOTCAoc2lnbG9uZ2ptcCwKKwkJCSAgICAgIChzdHJ1Y3QgX19qbXBfYnVmX3RhZyBfX2VudlsxXSwgaW50IF9fdmFsKSwKKwkJCSAgICAgIF9fbG9uZ2ptcF9jaGspIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKyNlbHNlCitleHRlcm4gdm9pZCBfX2xvbmdqbXBfY2hrIChzdHJ1Y3QgX19qbXBfYnVmX3RhZyBfX2VudlsxXSwgaW50IF9fdmFsKSwKKyAgICAgX19USFJPV05MIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKyMgZGVmaW5lIGxvbmdqbXAgX19sb25nam1wX2NoaworIyBkZWZpbmUgX2xvbmdqbXAgX19sb25nam1wX2NoaworIyBkZWZpbmUgc2lnbG9uZ2ptcCBfX2xvbmdqbXBfY2hrCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NobS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2htLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmNWNjNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NobS5oCkBAIC0wLDAgKzEsMTExIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDIwMDAsIDIwMDIsIDIwMDQsIDIwMDkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU0hNX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc2htLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zaG0uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworLyogUGVybWlzc2lvbiBmbGFnIGZvciBzaG1nZXQuICAqLworI2RlZmluZSBTSE1fUgkJMDQwMAkJLyogb3IgU19JUlVHTyBmcm9tIDxsaW51eC9zdGF0Lmg+ICovCisjZGVmaW5lIFNITV9XCQkwMjAwCQkvKiBvciBTX0lXVUdPIGZyb20gPGxpbnV4L3N0YXQuaD4gKi8KKworLyogRmxhZ3MgZm9yIGBzaG1hdCcuICAqLworI2RlZmluZSBTSE1fUkRPTkxZCTAxMDAwMAkJLyogYXR0YWNoIHJlYWQtb25seSBlbHNlIHJlYWQtd3JpdGUgKi8KKyNkZWZpbmUgU0hNX1JORAkJMDIwMDAwCQkvKiByb3VuZCBhdHRhY2ggYWRkcmVzcyB0byBTSE1MQkEgKi8KKyNkZWZpbmUgU0hNX1JFTUFQCTA0MDAwMAkJLyogdGFrZS1vdmVyIHJlZ2lvbiBvbiBhdHRhY2ggKi8KKyNkZWZpbmUgU0hNX0VYRUMJMDEwMDAwMAkJLyogZXhlY3V0aW9uIGFjY2VzcyAqLworCisvKiBDb21tYW5kcyBmb3IgYHNobWN0bCcuICAqLworI2RlZmluZSBTSE1fTE9DSwkxMQkJLyogbG9jayBzZWdtZW50IChyb290IG9ubHkpICovCisjZGVmaW5lIFNITV9VTkxPQ0sJMTIJCS8qIHVubG9jayBzZWdtZW50IChyb290IG9ubHkpICovCisKK19fQkVHSU5fREVDTFMKKworLyogU2VnbWVudCBsb3cgYm91bmRhcnkgYWRkcmVzcyBtdWx0aXBsZS4gICovCisjZGVmaW5lIFNITUxCQQkJKF9fZ2V0cGFnZXNpemUgKCkpCitleHRlcm4gaW50IF9fZ2V0cGFnZXNpemUgKHZvaWQpIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisKKy8qIFR5cGUgdG8gY291bnQgbnVtYmVyIG9mIGF0dGFjaGVzLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgc2htYXR0X3Q7CisKKy8qIERhdGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgYSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQuICAqLworc3RydWN0IHNobWlkX2RzCisgIHsKKyAgICBzdHJ1Y3QgaXBjX3Blcm0gc2htX3Blcm07CQkvKiBvcGVyYXRpb24gcGVybWlzc2lvbiBzdHJ1Y3QgKi8KKyAgICBzaXplX3Qgc2htX3NlZ3N6OwkJCS8qIHNpemUgb2Ygc2VnbWVudCBpbiBieXRlcyAqLworICAgIF9fdGltZV90IHNobV9hdGltZTsJCQkvKiB0aW1lIG9mIGxhc3Qgc2htYXQoKSAqLworI2lmIF9fV09SRFNJWkUgPT0gMzIKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDE7CisjZW5kaWYKKyAgICBfX3RpbWVfdCBzaG1fZHRpbWU7CQkJLyogdGltZSBvZiBsYXN0IHNobWR0KCkgKi8KKyNpZiBfX1dPUkRTSVpFID09IDMyCisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQyOworI2VuZGlmCisgICAgX190aW1lX3Qgc2htX2N0aW1lOwkJCS8qIHRpbWUgb2YgbGFzdCBjaGFuZ2UgYnkgc2htY3RsKCkgKi8KKyNpZiBfX1dPUkRTSVpFID09IDMyCisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQzOworI2VuZGlmCisgICAgX19waWRfdCBzaG1fY3BpZDsJCQkvKiBwaWQgb2YgY3JlYXRvciAqLworICAgIF9fcGlkX3Qgc2htX2xwaWQ7CQkJLyogcGlkIG9mIGxhc3Qgc2htb3AgKi8KKyAgICBzaG1hdHRfdCBzaG1fbmF0dGNoOwkJLyogbnVtYmVyIG9mIGN1cnJlbnQgYXR0YWNoZXMgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDQ7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQ1OworICB9OworCisjaWZkZWYgX19VU0VfTUlTQworCisvKiBpcGNzIGN0bCBjb21tYW5kcyAqLworIyBkZWZpbmUgU0hNX1NUQVQgCTEzCisjIGRlZmluZSBTSE1fSU5GTyAJMTQKKworLyogc2htX21vZGUgdXBwZXIgYnl0ZSBmbGFncyAqLworIyBkZWZpbmUgU0hNX0RFU1QJMDEwMDAJLyogc2VnbWVudCB3aWxsIGJlIGRlc3Ryb3llZCBvbiBsYXN0IGRldGFjaCAqLworIyBkZWZpbmUgU0hNX0xPQ0tFRAkwMjAwMCAgIC8qIHNlZ21lbnQgd2lsbCBub3QgYmUgc3dhcHBlZCAqLworIyBkZWZpbmUgU0hNX0hVR0VUTEIJMDQwMDAJLyogc2VnbWVudCBpcyBtYXBwZWQgdmlhIGh1Z2V0bGIgKi8KKyMgZGVmaW5lIFNITV9OT1JFU0VSVkUJMDEwMDAwCS8qIGRvbid0IGNoZWNrIGZvciByZXNlcnZhdGlvbnMgKi8KKworc3RydWN0CXNobWluZm8KKyAgeworICAgIHVuc2lnbmVkIGxvbmcgaW50IHNobW1heDsKKyAgICB1bnNpZ25lZCBsb25nIGludCBzaG1taW47CisgICAgdW5zaWduZWQgbG9uZyBpbnQgc2htbW5pOworICAgIHVuc2lnbmVkIGxvbmcgaW50IHNobXNlZzsKKyAgICB1bnNpZ25lZCBsb25nIGludCBzaG1hbGw7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQxOworICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMjsKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDM7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQ0OworICB9OworCitzdHJ1Y3Qgc2htX2luZm8KKyAgeworICAgIGludCB1c2VkX2lkczsKKyAgICB1bnNpZ25lZCBsb25nIGludCBzaG1fdG90OwkvKiB0b3RhbCBhbGxvY2F0ZWQgc2htICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgc2htX3JzczsJLyogdG90YWwgcmVzaWRlbnQgc2htICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgc2htX3N3cDsJLyogdG90YWwgc3dhcHBlZCBzaG0gKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBzd2FwX2F0dGVtcHRzOworICAgIHVuc2lnbmVkIGxvbmcgaW50IHN3YXBfc3VjY2Vzc2VzOworICB9OworCisjZW5kaWYgLyogX19VU0VfTUlTQyAqLworCitfX0VORF9ERUNMUwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2lnYWN0aW9uLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zaWdhY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmJlMDY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2lnYWN0aW9uLmgKQEAgLTAsMCArMSw3OSBAQAorLyogVGhlIHByb3BlciBkZWZpbml0aW9ucyBmb3IgTGludXgncyBzaWdhY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5OSwgMjAwMCwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU0lHTkFMX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc2lnYWN0aW9uLmg+IGRpcmVjdGx5OyB1c2UgPHNpZ25hbC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgYWN0aW9uIHRvIGJlIHRha2VuIHdoZW4gYSBzaWduYWwgYXJyaXZlcy4gICovCitzdHJ1Y3Qgc2lnYWN0aW9uCisgIHsKKyAgICAvKiBTaWduYWwgaGFuZGxlci4gICovCisjaWZkZWYgX19VU0VfUE9TSVgxOTkzMDkKKyAgICB1bmlvbgorICAgICAgeworCS8qIFVzZWQgaWYgU0FfU0lHSU5GTyBpcyBub3Qgc2V0LiAgKi8KKwlfX3NpZ2hhbmRsZXJfdCBzYV9oYW5kbGVyOworCS8qIFVzZWQgaWYgU0FfU0lHSU5GTyBpcyBzZXQuICAqLworCXZvaWQgKCpzYV9zaWdhY3Rpb24pIChpbnQsIHNpZ2luZm9fdCAqLCB2b2lkICopOworICAgICAgfQorICAgIF9fc2lnYWN0aW9uX2hhbmRsZXI7CisjIGRlZmluZSBzYV9oYW5kbGVyCV9fc2lnYWN0aW9uX2hhbmRsZXIuc2FfaGFuZGxlcgorIyBkZWZpbmUgc2Ffc2lnYWN0aW9uCV9fc2lnYWN0aW9uX2hhbmRsZXIuc2Ffc2lnYWN0aW9uCisjZWxzZQorICAgIF9fc2lnaGFuZGxlcl90IHNhX2hhbmRsZXI7CisjZW5kaWYKKworICAgIC8qIEFkZGl0aW9uYWwgc2V0IG9mIHNpZ25hbHMgdG8gYmUgYmxvY2tlZC4gICovCisgICAgX19zaWdzZXRfdCBzYV9tYXNrOworCisgICAgLyogU3BlY2lhbCBmbGFncy4gICovCisgICAgaW50IHNhX2ZsYWdzOworCisgICAgLyogUmVzdG9yZSBoYW5kbGVyLiAgKi8KKyAgICB2b2lkICgqc2FfcmVzdG9yZXIpICh2b2lkKTsKKyAgfTsKKworLyogQml0cyBpbiBgc2FfZmxhZ3MnLiAgKi8KKyNkZWZpbmUJU0FfTk9DTERTVE9QICAxCQkgLyogRG9uJ3Qgc2VuZCBTSUdDSExEIHdoZW4gY2hpbGRyZW4gc3RvcC4gICovCisjZGVmaW5lIFNBX05PQ0xEV0FJVCAgMgkJIC8qIERvbid0IGNyZWF0ZSB6b21iaWUgb24gY2hpbGQgZGVhdGguICAqLworI2RlZmluZSBTQV9TSUdJTkZPICAgIDQJCSAvKiBJbnZva2Ugc2lnbmFsLWNhdGNoaW5nIGZ1bmN0aW9uIHdpdGgKKwkJCQkgICAgdGhyZWUgYXJndW1lbnRzIGluc3RlYWQgb2Ygb25lLiAgKi8KKyNpZiBkZWZpbmVkIF9fVVNFX1VOSVg5OCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKyMgZGVmaW5lIFNBX09OU1RBQ0sgICAweDA4MDAwMDAwIC8qIFVzZSBzaWduYWwgc3RhY2sgYnkgdXNpbmcgYHNhX3Jlc3RvcmVyJy4gKi8KKyNlbmRpZgorI2lmIGRlZmluZWQgX19VU0VfVU5JWDk4IHx8IGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisjIGRlZmluZSBTQV9SRVNUQVJUICAgMHgxMDAwMDAwMCAvKiBSZXN0YXJ0IHN5c2NhbGwgb24gc2lnbmFsIHJldHVybi4gICovCisjIGRlZmluZSBTQV9OT0RFRkVSICAgMHg0MDAwMDAwMCAvKiBEb24ndCBhdXRvbWF0aWNhbGx5IGJsb2NrIHRoZSBzaWduYWwgd2hlbgorCQkJCSAgICBpdHMgaGFuZGxlciBpcyBiZWluZyBleGVjdXRlZC4gICovCisjIGRlZmluZSBTQV9SRVNFVEhBTkQgMHg4MDAwMDAwMCAvKiBSZXNldCB0byBTSUdfREZMIG9uIGVudHJ5IHRvIGhhbmRsZXIuICAqLworI2VuZGlmCisjaWZkZWYgX19VU0VfTUlTQworIyBkZWZpbmUgU0FfSU5URVJSVVBUIDB4MjAwMDAwMDAgLyogSGlzdG9yaWNhbCBuby1vcC4gICovCisKKy8qIFNvbWUgYWxpYXNlcyBmb3IgdGhlIFNBXyBjb25zdGFudHMuICAqLworIyBkZWZpbmUgU0FfTk9NQVNLICAgIFNBX05PREVGRVIKKyMgZGVmaW5lIFNBX09ORVNIT1QgICBTQV9SRVNFVEhBTkQKKyMgZGVmaW5lIFNBX1NUQUNLICAgICBTQV9PTlNUQUNLCisjZW5kaWYKKworLyogVmFsdWVzIGZvciB0aGUgSE9XIGFyZ3VtZW50IHRvIGBzaWdwcm9jbWFzaycuICAqLworI2RlZmluZQlTSUdfQkxPQ0sgICAgIDAJCSAvKiBCbG9jayBzaWduYWxzLiAgKi8KKyNkZWZpbmUJU0lHX1VOQkxPQ0sgICAxCQkgLyogVW5ibG9jayBzaWduYWxzLiAgKi8KKyNkZWZpbmUJU0lHX1NFVE1BU0sgICAyCQkgLyogU2V0IHRoZSBzZXQgb2YgYmxvY2tlZCBzaWduYWxzLiAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NpZ2NvbnRleHQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NpZ2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGQ1ZmU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2lnY29udGV4dC5oCkBAIC0wLDAgKzEsMTU5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0JJVFNfU0lHQ09OVEVYVF9ICisjZGVmaW5lIF9CSVRTX1NJR0NPTlRFWFRfSCAgMQorCisjaWYgIWRlZmluZWQgX1NJR05BTF9IICYmICFkZWZpbmVkIF9TWVNfVUNPTlRFWFRfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL3NpZ2NvbnRleHQuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHNpZ25hbC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCitzdHJ1Y3QgX2ZwcmVnCit7CisgIHVuc2lnbmVkIHNob3J0IHNpZ25pZmljYW5kWzRdOworICB1bnNpZ25lZCBzaG9ydCBleHBvbmVudDsKK307CisKK3N0cnVjdCBfZnB4cmVnCit7CisgIHVuc2lnbmVkIHNob3J0IHNpZ25pZmljYW5kWzRdOworICB1bnNpZ25lZCBzaG9ydCBleHBvbmVudDsKKyAgdW5zaWduZWQgc2hvcnQgcGFkZGluZ1szXTsKK307CisKK3N0cnVjdCBfeG1tcmVnCit7CisgIF9fdWludDMyX3QJZWxlbWVudFs0XTsKK307CisKKworCisjaWYgX19XT1JEU0laRSA9PSAzMgorCitzdHJ1Y3QgX2Zwc3RhdGUKK3sKKyAgLyogUmVndWxhciBGUFUgZW52aXJvbm1lbnQuICAqLworICBfX3VpbnQzMl90CWN3OworICBfX3VpbnQzMl90CQlzdzsKKyAgX191aW50MzJfdAkJdGFnOworICBfX3VpbnQzMl90CQlpcG9mZjsKKyAgX191aW50MzJfdAkJY3NzZWw7CisgIF9fdWludDMyX3QJCWRhdGFvZmY7CisgIF9fdWludDMyX3QJCWRhdGFzZWw7CisgIHN0cnVjdCBfZnByZWcJX3N0WzhdOworICB1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisgIHVuc2lnbmVkIHNob3J0IG1hZ2ljOworCisgIC8qIEZYU1IgRlBVIGVudmlyb25tZW50LiAgKi8KKyAgX191aW50MzJfdAkJX2Z4c3JfZW52WzZdOworICBfX3VpbnQzMl90CQlteGNzcjsKKyAgX191aW50MzJfdAkJcmVzZXJ2ZWQ7CisgIHN0cnVjdCBfZnB4cmVnCV9meHNyX3N0WzhdOworICBzdHJ1Y3QgX3htbXJlZwlfeG1tWzhdOworICBfX3VpbnQzMl90CQlwYWRkaW5nWzU2XTsKK307CisKKyNpZm5kZWYgc2lnY29udGV4dF9zdHJ1Y3QKKy8qIEtlcm5lbCBoZWFkZXJzIGJlZm9yZSAyLjEuMSBkZWZpbmUgYSBzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QsIGJ1dAorICAgd2UgbmVlZCBzaWdjb250ZXh0LiAgU29tZSBwYWNrYWdlcyBoYXZlIGNvbWUgdG8gcmVseSBvbgorICAgc2lnY29udGV4dF9zdHJ1Y3QgYmVpbmcgZGVmaW5lZCBvbiAzMi1iaXQgeDg2LCBzbyBkZWZpbmUgdGhpcyBmb3IKKyAgIHRoZWlyIGJlbmVmaXQuICAqLworIyBkZWZpbmUgc2lnY29udGV4dF9zdHJ1Y3Qgc2lnY29udGV4dAorI2VuZGlmCisKK3N0cnVjdCBzaWdjb250ZXh0Cit7CisgIHVuc2lnbmVkIHNob3J0IGdzLCBfX2dzaDsKKyAgdW5zaWduZWQgc2hvcnQgZnMsIF9fZnNoOworICB1bnNpZ25lZCBzaG9ydCBlcywgX19lc2g7CisgIHVuc2lnbmVkIHNob3J0IGRzLCBfX2RzaDsKKyAgdW5zaWduZWQgbG9uZyBlZGk7CisgIHVuc2lnbmVkIGxvbmcgZXNpOworICB1bnNpZ25lZCBsb25nIGVicDsKKyAgdW5zaWduZWQgbG9uZyBlc3A7CisgIHVuc2lnbmVkIGxvbmcgZWJ4OworICB1bnNpZ25lZCBsb25nIGVkeDsKKyAgdW5zaWduZWQgbG9uZyBlY3g7CisgIHVuc2lnbmVkIGxvbmcgZWF4OworICB1bnNpZ25lZCBsb25nIHRyYXBubzsKKyAgdW5zaWduZWQgbG9uZyBlcnI7CisgIHVuc2lnbmVkIGxvbmcgZWlwOworICB1bnNpZ25lZCBzaG9ydCBjcywgX19jc2g7CisgIHVuc2lnbmVkIGxvbmcgZWZsYWdzOworICB1bnNpZ25lZCBsb25nIGVzcF9hdF9zaWduYWw7CisgIHVuc2lnbmVkIHNob3J0IHNzLCBfX3NzaDsKKyAgc3RydWN0IF9mcHN0YXRlICogZnBzdGF0ZTsKKyAgdW5zaWduZWQgbG9uZyBvbGRtYXNrOworICB1bnNpZ25lZCBsb25nIGNyMjsKK307CisKKyNlbHNlIC8qIF9fV09SRFNJWkUgPT0gNjQgKi8KKworc3RydWN0IF9mcHN0YXRlCit7CisgIC8qIEZQVSBlbnZpcm9ubWVudCBtYXRjaGluZyB0aGUgNjQtYml0IEZYU0FWRSBsYXlvdXQuICAqLworICBfX3VpbnQxNl90CQljd2Q7CisgIF9fdWludDE2X3QJCXN3ZDsKKyAgX191aW50MTZfdAkJZnR3OworICBfX3VpbnQxNl90CQlmb3A7CisgIF9fdWludDY0X3QJCXJpcDsKKyAgX191aW50NjRfdAkJcmRwOworICBfX3VpbnQzMl90CQlteGNzcjsKKyAgX191aW50MzJfdAkJbXhjcl9tYXNrOworICBzdHJ1Y3QgX2ZweHJlZwlfc3RbOF07CisgIHN0cnVjdCBfeG1tcmVnCV94bW1bMTZdOworICBfX3VpbnQzMl90CQlwYWRkaW5nWzI0XTsKK307CisKK3N0cnVjdCBzaWdjb250ZXh0Cit7CisgIHVuc2lnbmVkIGxvbmcgcjg7CisgIHVuc2lnbmVkIGxvbmcgcjk7CisgIHVuc2lnbmVkIGxvbmcgcjEwOworICB1bnNpZ25lZCBsb25nIHIxMTsKKyAgdW5zaWduZWQgbG9uZyByMTI7CisgIHVuc2lnbmVkIGxvbmcgcjEzOworICB1bnNpZ25lZCBsb25nIHIxNDsKKyAgdW5zaWduZWQgbG9uZyByMTU7CisgIHVuc2lnbmVkIGxvbmcgcmRpOworICB1bnNpZ25lZCBsb25nIHJzaTsKKyAgdW5zaWduZWQgbG9uZyByYnA7CisgIHVuc2lnbmVkIGxvbmcgcmJ4OworICB1bnNpZ25lZCBsb25nIHJkeDsKKyAgdW5zaWduZWQgbG9uZyByYXg7CisgIHVuc2lnbmVkIGxvbmcgcmN4OworICB1bnNpZ25lZCBsb25nIHJzcDsKKyAgdW5zaWduZWQgbG9uZyByaXA7CisgIHVuc2lnbmVkIGxvbmcgZWZsYWdzOworICB1bnNpZ25lZCBzaG9ydCBjczsKKyAgdW5zaWduZWQgc2hvcnQgZ3M7CisgIHVuc2lnbmVkIHNob3J0IGZzOworICB1bnNpZ25lZCBzaG9ydCBfX3BhZDA7CisgIHVuc2lnbmVkIGxvbmcgZXJyOworICB1bnNpZ25lZCBsb25nIHRyYXBubzsKKyAgdW5zaWduZWQgbG9uZyBvbGRtYXNrOworICB1bnNpZ25lZCBsb25nIGNyMjsKKyAgc3RydWN0IF9mcHN0YXRlICogZnBzdGF0ZTsKKyAgdW5zaWduZWQgbG9uZyBfX3Jlc2VydmVkMSBbOF07Cit9OworCisjZW5kaWYgLyogX19XT1JEU0laRSA9PSA2NCAqLworCisjZW5kaWYgLyogX0JJVFNfU0lHQ09OVEVYVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zaWdpbmZvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zaWdpbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNkZDRjMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NpZ2luZm8uaApAQCAtMCwwICsxLDMxMyBAQAorLyogc2lnaW5mb190LCBzaWdldmVudCBhbmQgY29uc3RhbnRzLiAgTGludXggdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAyLCAyMDAzLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWYgIWRlZmluZWQgX1NJR05BTF9IICYmICFkZWZpbmVkIF9fbmVlZF9zaWdpbmZvX3QgXAorICAgICYmICFkZWZpbmVkIF9fbmVlZF9zaWdldmVudF90CisjIGVycm9yICJOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseS4gIFVzZSA8c2lnbmFsLmg+IGluc3RlYWQiCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworI2lmICghZGVmaW5lZCBfX2hhdmVfc2lndmFsX3QgXAorICAgICAmJiAoZGVmaW5lZCBfU0lHTkFMX0ggfHwgZGVmaW5lZCBfX25lZWRfc2lnaW5mb190IFwKKwkgfHwgZGVmaW5lZCBfX25lZWRfc2lnZXZlbnRfdCkpCisjIGRlZmluZSBfX2hhdmVfc2lndmFsX3QJMQorCisvKiBUeXBlIGZvciBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIHNpZ25hbC4gICovCit0eXBlZGVmIHVuaW9uIHNpZ3ZhbAorICB7CisgICAgaW50IHNpdmFsX2ludDsKKyAgICB2b2lkICpzaXZhbF9wdHI7CisgIH0gc2lndmFsX3Q7CisjZW5kaWYKKworI2lmICghZGVmaW5lZCBfX2hhdmVfc2lnaW5mb190IFwKKyAgICAgJiYgKGRlZmluZWQgX1NJR05BTF9IIHx8IGRlZmluZWQgX19uZWVkX3NpZ2luZm9fdCkpCisjIGRlZmluZSBfX2hhdmVfc2lnaW5mb190CTEKKworIyBkZWZpbmUgX19TSV9NQVhfU0laRSAgICAgMTI4CisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBfX1NJX1BBRF9TSVpFICAgICAoKF9fU0lfTUFYX1NJWkUgLyBzaXplb2YgKGludCkpIC0gNCkKKyMgZWxzZQorIyAgZGVmaW5lIF9fU0lfUEFEX1NJWkUgICAgICgoX19TSV9NQVhfU0laRSAvIHNpemVvZiAoaW50KSkgLSAzKQorIyBlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBzaWdpbmZvCisgIHsKKyAgICBpbnQgc2lfc2lnbm87CQkvKiBTaWduYWwgbnVtYmVyLiAgKi8KKyAgICBpbnQgc2lfZXJybm87CQkvKiBJZiBub24temVybywgYW4gZXJybm8gdmFsdWUgYXNzb2NpYXRlZCB3aXRoCisJCQkJICAgdGhpcyBzaWduYWwsIGFzIGRlZmluZWQgaW4gPGVycm5vLmg+LiAgKi8KKyAgICBpbnQgc2lfY29kZTsJCS8qIFNpZ25hbCBjb2RlLiAgKi8KKworICAgIHVuaW9uCisgICAgICB7CisJaW50IF9wYWRbX19TSV9QQURfU0laRV07CisKKwkgLyoga2lsbCgpLiAgKi8KKwlzdHJ1Y3QKKwkgIHsKKwkgICAgX19waWRfdCBzaV9waWQ7CS8qIFNlbmRpbmcgcHJvY2VzcyBJRC4gICovCisJICAgIF9fdWlkX3Qgc2lfdWlkOwkvKiBSZWFsIHVzZXIgSUQgb2Ygc2VuZGluZyBwcm9jZXNzLiAgKi8KKwkgIH0gX2tpbGw7CisKKwkvKiBQT1NJWC4xYiB0aW1lcnMuICAqLworCXN0cnVjdAorCSAgeworCSAgICBpbnQgc2lfdGlkOwkJLyogVGltZXIgSUQuICAqLworCSAgICBpbnQgc2lfb3ZlcnJ1bjsJLyogT3ZlcnJ1biBjb3VudC4gICovCisJICAgIHNpZ3ZhbF90IHNpX3NpZ3ZhbDsJLyogU2lnbmFsIHZhbHVlLiAgKi8KKwkgIH0gX3RpbWVyOworCisJLyogUE9TSVguMWIgc2lnbmFscy4gICovCisJc3RydWN0CisJICB7CisJICAgIF9fcGlkX3Qgc2lfcGlkOwkvKiBTZW5kaW5nIHByb2Nlc3MgSUQuICAqLworCSAgICBfX3VpZF90IHNpX3VpZDsJLyogUmVhbCB1c2VyIElEIG9mIHNlbmRpbmcgcHJvY2Vzcy4gICovCisJICAgIHNpZ3ZhbF90IHNpX3NpZ3ZhbDsJLyogU2lnbmFsIHZhbHVlLiAgKi8KKwkgIH0gX3J0OworCisJLyogU0lHQ0hMRC4gICovCisJc3RydWN0CisJICB7CisJICAgIF9fcGlkX3Qgc2lfcGlkOwkvKiBXaGljaCBjaGlsZC4gICovCisJICAgIF9fdWlkX3Qgc2lfdWlkOwkvKiBSZWFsIHVzZXIgSUQgb2Ygc2VuZGluZyBwcm9jZXNzLiAgKi8KKwkgICAgaW50IHNpX3N0YXR1czsJLyogRXhpdCB2YWx1ZSBvciBzaWduYWwuICAqLworCSAgICBfX2Nsb2NrX3Qgc2lfdXRpbWU7CisJICAgIF9fY2xvY2tfdCBzaV9zdGltZTsKKwkgIH0gX3NpZ2NobGQ7CisKKwkvKiBTSUdJTEwsIFNJR0ZQRSwgU0lHU0VHViwgU0lHQlVTLiAgKi8KKwlzdHJ1Y3QKKwkgIHsKKwkgICAgdm9pZCAqc2lfYWRkcjsJLyogRmF1bHRpbmcgaW5zbi9tZW1vcnkgcmVmLiAgKi8KKwkgIH0gX3NpZ2ZhdWx0OworCisJLyogU0lHUE9MTC4gICovCisJc3RydWN0CisJICB7CisJICAgIGxvbmcgaW50IHNpX2JhbmQ7CS8qIEJhbmQgZXZlbnQgZm9yIFNJR1BPTEwuICAqLworCSAgICBpbnQgc2lfZmQ7CisJICB9IF9zaWdwb2xsOworICAgICAgfSBfc2lmaWVsZHM7CisgIH0gc2lnaW5mb190OworCisKKy8qIFgvT3BlbiByZXF1aXJlcyBzb21lIG1vcmUgZmllbGRzIHdpdGggZml4ZWQgbmFtZXMuICAqLworIyBkZWZpbmUgc2lfcGlkCQlfc2lmaWVsZHMuX2tpbGwuc2lfcGlkCisjIGRlZmluZSBzaV91aWQJCV9zaWZpZWxkcy5fa2lsbC5zaV91aWQKKyMgZGVmaW5lIHNpX3RpbWVyaWQJX3NpZmllbGRzLl90aW1lci5zaV90aWQKKyMgZGVmaW5lIHNpX292ZXJydW4JX3NpZmllbGRzLl90aW1lci5zaV9vdmVycnVuCisjIGRlZmluZSBzaV9zdGF0dXMJX3NpZmllbGRzLl9zaWdjaGxkLnNpX3N0YXR1cworIyBkZWZpbmUgc2lfdXRpbWUJX3NpZmllbGRzLl9zaWdjaGxkLnNpX3V0aW1lCisjIGRlZmluZSBzaV9zdGltZQlfc2lmaWVsZHMuX3NpZ2NobGQuc2lfc3RpbWUKKyMgZGVmaW5lIHNpX3ZhbHVlCV9zaWZpZWxkcy5fcnQuc2lfc2lndmFsCisjIGRlZmluZSBzaV9pbnQJCV9zaWZpZWxkcy5fcnQuc2lfc2lndmFsLnNpdmFsX2ludAorIyBkZWZpbmUgc2lfcHRyCQlfc2lmaWVsZHMuX3J0LnNpX3NpZ3ZhbC5zaXZhbF9wdHIKKyMgZGVmaW5lIHNpX2FkZHIJX3NpZmllbGRzLl9zaWdmYXVsdC5zaV9hZGRyCisjIGRlZmluZSBzaV9iYW5kCV9zaWZpZWxkcy5fc2lncG9sbC5zaV9iYW5kCisjIGRlZmluZSBzaV9mZAkJX3NpZmllbGRzLl9zaWdwb2xsLnNpX2ZkCisKKworLyogVmFsdWVzIGZvciBgc2lfY29kZScuICBQb3NpdGl2ZSB2YWx1ZXMgYXJlIHJlc2VydmVkIGZvciBrZXJuZWwtZ2VuZXJhdGVkCisgICBzaWduYWxzLiAgKi8KK2VudW0KK3sKKyAgU0lfQVNZTkNOTCA9IC02MCwJCS8qIFNlbnQgYnkgYXN5bmNoIG5hbWUgbG9va3VwIGNvbXBsZXRpb24uICAqLworIyBkZWZpbmUgU0lfQVNZTkNOTAlTSV9BU1lOQ05MCisgIFNJX1RLSUxMID0gLTYsCQkvKiBTZW50IGJ5IHRraWxsLiAgKi8KKyMgZGVmaW5lIFNJX1RLSUxMCVNJX1RLSUxMCisgIFNJX1NJR0lPLAkJCS8qIFNlbnQgYnkgcXVldWVkIFNJR0lPLiAqLworIyBkZWZpbmUgU0lfU0lHSU8JU0lfU0lHSU8KKyAgU0lfQVNZTkNJTywJCQkvKiBTZW50IGJ5IEFJTyBjb21wbGV0aW9uLiAgKi8KKyMgZGVmaW5lIFNJX0FTWU5DSU8JU0lfQVNZTkNJTworICBTSV9NRVNHUSwJCQkvKiBTZW50IGJ5IHJlYWwgdGltZSBtZXNxIHN0YXRlIGNoYW5nZS4gICovCisjIGRlZmluZSBTSV9NRVNHUQlTSV9NRVNHUQorICBTSV9USU1FUiwJCQkvKiBTZW50IGJ5IHRpbWVyIGV4cGlyYXRpb24uICAqLworIyBkZWZpbmUgU0lfVElNRVIJU0lfVElNRVIKKyAgU0lfUVVFVUUsCQkJLyogU2VudCBieSBzaWdxdWV1ZS4gICovCisjIGRlZmluZSBTSV9RVUVVRQlTSV9RVUVVRQorICBTSV9VU0VSLAkJCS8qIFNlbnQgYnkga2lsbCwgc2lnc2VuZC4gICovCisjIGRlZmluZSBTSV9VU0VSCVNJX1VTRVIKKyAgU0lfS0VSTkVMID0gMHg4MAkJLyogU2VuZCBieSBrZXJuZWwuICAqLworI2RlZmluZSBTSV9LRVJORUwJU0lfS0VSTkVMCit9OworCisKKy8qIGBzaV9jb2RlJyB2YWx1ZXMgZm9yIFNJR0lMTCBzaWduYWwuICAqLworZW51bQoreworICBJTExfSUxMT1BDID0gMSwJCS8qIElsbGVnYWwgb3Bjb2RlLiAgKi8KKyMgZGVmaW5lIElMTF9JTExPUEMJSUxMX0lMTE9QQworICBJTExfSUxMT1BOLAkJCS8qIElsbGVnYWwgb3BlcmFuZC4gICovCisjIGRlZmluZSBJTExfSUxMT1BOCUlMTF9JTExPUE4KKyAgSUxMX0lMTEFEUiwJCQkvKiBJbGxlZ2FsIGFkZHJlc3NpbmcgbW9kZS4gICovCisjIGRlZmluZSBJTExfSUxMQURSCUlMTF9JTExBRFIKKyAgSUxMX0lMTFRSUCwJCQkvKiBJbGxlZ2FsIHRyYXAuICovCisjIGRlZmluZSBJTExfSUxMVFJQCUlMTF9JTExUUlAKKyAgSUxMX1BSVk9QQywJCQkvKiBQcml2aWxlZ2VkIG9wY29kZS4gICovCisjIGRlZmluZSBJTExfUFJWT1BDCUlMTF9QUlZPUEMKKyAgSUxMX1BSVlJFRywJCQkvKiBQcml2aWxlZ2VkIHJlZ2lzdGVyLiAgKi8KKyMgZGVmaW5lIElMTF9QUlZSRUcJSUxMX1BSVlJFRworICBJTExfQ09QUk9DLAkJCS8qIENvcHJvY2Vzc29yIGVycm9yLiAgKi8KKyMgZGVmaW5lIElMTF9DT1BST0MJSUxMX0NPUFJPQworICBJTExfQkFEU1RLCQkJLyogSW50ZXJuYWwgc3RhY2sgZXJyb3IuICAqLworIyBkZWZpbmUgSUxMX0JBRFNUSwlJTExfQkFEU1RLCit9OworCisvKiBgc2lfY29kZScgdmFsdWVzIGZvciBTSUdGUEUgc2lnbmFsLiAgKi8KK2VudW0KK3sKKyAgRlBFX0lOVERJViA9IDEsCQkvKiBJbnRlZ2VyIGRpdmlkZSBieSB6ZXJvLiAgKi8KKyMgZGVmaW5lIEZQRV9JTlRESVYJRlBFX0lOVERJVgorICBGUEVfSU5UT1ZGLAkJCS8qIEludGVnZXIgb3ZlcmZsb3cuICAqLworIyBkZWZpbmUgRlBFX0lOVE9WRglGUEVfSU5UT1ZGCisgIEZQRV9GTFRESVYsCQkJLyogRmxvYXRpbmcgcG9pbnQgZGl2aWRlIGJ5IHplcm8uICAqLworIyBkZWZpbmUgRlBFX0ZMVERJVglGUEVfRkxURElWCisgIEZQRV9GTFRPVkYsCQkJLyogRmxvYXRpbmcgcG9pbnQgb3ZlcmZsb3cuICAqLworIyBkZWZpbmUgRlBFX0ZMVE9WRglGUEVfRkxUT1ZGCisgIEZQRV9GTFRVTkQsCQkJLyogRmxvYXRpbmcgcG9pbnQgdW5kZXJmbG93LiAgKi8KKyMgZGVmaW5lIEZQRV9GTFRVTkQJRlBFX0ZMVFVORAorICBGUEVfRkxUUkVTLAkJCS8qIEZsb2F0aW5nIHBvaW50IGluZXhhY3QgcmVzdWx0LiAgKi8KKyMgZGVmaW5lIEZQRV9GTFRSRVMJRlBFX0ZMVFJFUworICBGUEVfRkxUSU5WLAkJCS8qIEZsb2F0aW5nIHBvaW50IGludmFsaWQgb3BlcmF0aW9uLiAgKi8KKyMgZGVmaW5lIEZQRV9GTFRJTlYJRlBFX0ZMVElOVgorICBGUEVfRkxUU1VCCQkJLyogU3Vic2NyaXB0IG91dCBvZiByYW5nZS4gICovCisjIGRlZmluZSBGUEVfRkxUU1VCCUZQRV9GTFRTVUIKK307CisKKy8qIGBzaV9jb2RlJyB2YWx1ZXMgZm9yIFNJR1NFR1Ygc2lnbmFsLiAgKi8KK2VudW0KK3sKKyAgU0VHVl9NQVBFUlIgPSAxLAkJLyogQWRkcmVzcyBub3QgbWFwcGVkIHRvIG9iamVjdC4gICovCisjIGRlZmluZSBTRUdWX01BUEVSUglTRUdWX01BUEVSUgorICBTRUdWX0FDQ0VSUgkJCS8qIEludmFsaWQgcGVybWlzc2lvbnMgZm9yIG1hcHBlZCBvYmplY3QuICAqLworIyBkZWZpbmUgU0VHVl9BQ0NFUlIJU0VHVl9BQ0NFUlIKK307CisKKy8qIGBzaV9jb2RlJyB2YWx1ZXMgZm9yIFNJR0JVUyBzaWduYWwuICAqLworZW51bQoreworICBCVVNfQURSQUxOID0gMSwJCS8qIEludmFsaWQgYWRkcmVzcyBhbGlnbm1lbnQuICAqLworIyBkZWZpbmUgQlVTX0FEUkFMTglCVVNfQURSQUxOCisgIEJVU19BRFJFUlIsCQkJLyogTm9uLWV4aXN0YW50IHBoeXNpY2FsIGFkZHJlc3MuICAqLworIyBkZWZpbmUgQlVTX0FEUkVSUglCVVNfQURSRVJSCisgIEJVU19PQkpFUlIJCQkvKiBPYmplY3Qgc3BlY2lmaWMgaGFyZHdhcmUgZXJyb3IuICAqLworIyBkZWZpbmUgQlVTX09CSkVSUglCVVNfT0JKRVJSCit9OworCisvKiBgc2lfY29kZScgdmFsdWVzIGZvciBTSUdUUkFQIHNpZ25hbC4gICovCitlbnVtCit7CisgIFRSQVBfQlJLUFQgPSAxLAkJLyogUHJvY2VzcyBicmVha3BvaW50LiAgKi8KKyMgZGVmaW5lIFRSQVBfQlJLUFQJVFJBUF9CUktQVAorICBUUkFQX1RSQUNFCQkJLyogUHJvY2VzcyB0cmFjZSB0cmFwLiAgKi8KKyMgZGVmaW5lIFRSQVBfVFJBQ0UJVFJBUF9UUkFDRQorfTsKKworLyogYHNpX2NvZGUnIHZhbHVlcyBmb3IgU0lHQ0hMRCBzaWduYWwuICAqLworZW51bQoreworICBDTERfRVhJVEVEID0gMSwJCS8qIENoaWxkIGhhcyBleGl0ZWQuICAqLworIyBkZWZpbmUgQ0xEX0VYSVRFRAlDTERfRVhJVEVECisgIENMRF9LSUxMRUQsCQkJLyogQ2hpbGQgd2FzIGtpbGxlZC4gICovCisjIGRlZmluZSBDTERfS0lMTEVECUNMRF9LSUxMRUQKKyAgQ0xEX0RVTVBFRCwJCQkvKiBDaGlsZCB0ZXJtaW5hdGVkIGFibm9ybWFsbHkuICAqLworIyBkZWZpbmUgQ0xEX0RVTVBFRAlDTERfRFVNUEVECisgIENMRF9UUkFQUEVELAkJCS8qIFRyYWNlZCBjaGlsZCBoYXMgdHJhcHBlZC4gICovCisjIGRlZmluZSBDTERfVFJBUFBFRAlDTERfVFJBUFBFRAorICBDTERfU1RPUFBFRCwJCQkvKiBDaGlsZCBoYXMgc3RvcHBlZC4gICovCisjIGRlZmluZSBDTERfU1RPUFBFRAlDTERfU1RPUFBFRAorICBDTERfQ09OVElOVUVECQkJLyogU3RvcHBlZCBjaGlsZCBoYXMgY29udGludWVkLiAgKi8KKyMgZGVmaW5lIENMRF9DT05USU5VRUQJQ0xEX0NPTlRJTlVFRAorfTsKKworLyogYHNpX2NvZGUnIHZhbHVlcyBmb3IgU0lHUE9MTCBzaWduYWwuICAqLworZW51bQoreworICBQT0xMX0lOID0gMSwJCQkvKiBEYXRhIGlucHV0IGF2YWlsYWJsZS4gICovCisjIGRlZmluZSBQT0xMX0lOCVBPTExfSU4KKyAgUE9MTF9PVVQsCQkJLyogT3V0cHV0IGJ1ZmZlcnMgYXZhaWxhYmxlLiAgKi8KKyMgZGVmaW5lIFBPTExfT1VUCVBPTExfT1VUCisgIFBPTExfTVNHLAkJCS8qIElucHV0IG1lc3NhZ2UgYXZhaWxhYmxlLiAgICovCisjIGRlZmluZSBQT0xMX01TRwlQT0xMX01TRworICBQT0xMX0VSUiwJCQkvKiBJL08gZXJyb3IuICAqLworIyBkZWZpbmUgUE9MTF9FUlIJUE9MTF9FUlIKKyAgUE9MTF9QUkksCQkJLyogSGlnaCBwcmlvcml0eSBpbnB1dCBhdmFpbGFibGUuICAqLworIyBkZWZpbmUgUE9MTF9QUkkJUE9MTF9QUkkKKyAgUE9MTF9IVVAJCQkvKiBEZXZpY2UgZGlzY29ubmVjdGVkLiAgKi8KKyMgZGVmaW5lIFBPTExfSFVQCVBPTExfSFVQCit9OworCisjIHVuZGVmIF9fbmVlZF9zaWdpbmZvX3QKKyNlbmRpZgkvKiAhaGF2ZSBzaWdpbmZvX3QgJiYgKGhhdmUgX1NJR05BTF9IIHx8IG5lZWQgc2lnaW5mb190KS4gICovCisKKworI2lmIChkZWZpbmVkIF9TSUdOQUxfSCB8fCBkZWZpbmVkIF9fbmVlZF9zaWdldmVudF90KSBcCisgICAgJiYgIWRlZmluZWQgX19oYXZlX3NpZ2V2ZW50X3QKKyMgZGVmaW5lIF9faGF2ZV9zaWdldmVudF90CTEKKworLyogU3RydWN0dXJlIHRvIHRyYW5zcG9ydCBhcHBsaWNhdGlvbi1kZWZpbmVkIHZhbHVlcyB3aXRoIHNpZ25hbHMuICAqLworIyBkZWZpbmUgX19TSUdFVl9NQVhfU0laRQk2NAorIyBpZiBfX1dPUkRTSVpFID09IDY0CisjICBkZWZpbmUgX19TSUdFVl9QQURfU0laRQkoKF9fU0lHRVZfTUFYX1NJWkUgLyBzaXplb2YgKGludCkpIC0gNCkKKyMgZWxzZQorIyAgZGVmaW5lIF9fU0lHRVZfUEFEX1NJWkUJKChfX1NJR0VWX01BWF9TSVpFIC8gc2l6ZW9mIChpbnQpKSAtIDMpCisjIGVuZGlmCisKK3R5cGVkZWYgc3RydWN0IHNpZ2V2ZW50CisgIHsKKyAgICBzaWd2YWxfdCBzaWdldl92YWx1ZTsKKyAgICBpbnQgc2lnZXZfc2lnbm87CisgICAgaW50IHNpZ2V2X25vdGlmeTsKKworICAgIHVuaW9uCisgICAgICB7CisJaW50IF9wYWRbX19TSUdFVl9QQURfU0laRV07CisKKwkvKiBXaGVuIFNJR0VWX1NJR05BTCBhbmQgU0lHRVZfVEhSRUFEX0lEIHNldCwgTFdQIElEIG9mIHRoZQorCSAgIHRocmVhZCB0byByZWNlaXZlIHRoZSBzaWduYWwuICAqLworCV9fcGlkX3QgX3RpZDsKKworCXN0cnVjdAorCSAgeworCSAgICB2b2lkICgqX2Z1bmN0aW9uKSAoc2lndmFsX3QpOwkvKiBGdW5jdGlvbiB0byBzdGFydC4gICovCisJICAgIHZvaWQgKl9hdHRyaWJ1dGU7CQkJLyogUmVhbGx5IHB0aHJlYWRfYXR0cl90LiAgKi8KKwkgIH0gX3NpZ2V2X3RocmVhZDsKKyAgICAgIH0gX3NpZ2V2X3VuOworICB9IHNpZ2V2ZW50X3Q7CisKKy8qIFBPU0lYIG5hbWVzIHRvIGFjY2VzcyBzb21lIG9mIHRoZSBtZW1iZXJzLiAgKi8KKyMgZGVmaW5lIHNpZ2V2X25vdGlmeV9mdW5jdGlvbiAgIF9zaWdldl91bi5fc2lnZXZfdGhyZWFkLl9mdW5jdGlvbgorIyBkZWZpbmUgc2lnZXZfbm90aWZ5X2F0dHJpYnV0ZXMgX3NpZ2V2X3VuLl9zaWdldl90aHJlYWQuX2F0dHJpYnV0ZQorCisvKiBgc2lnZXZfbm90aWZ5JyB2YWx1ZXMuICAqLworZW51bQoreworICBTSUdFVl9TSUdOQUwgPSAwLAkJLyogTm90aWZ5IHZpYSBzaWduYWwuICAqLworIyBkZWZpbmUgU0lHRVZfU0lHTkFMCVNJR0VWX1NJR05BTAorICBTSUdFVl9OT05FLAkJCS8qIE90aGVyIG5vdGlmaWNhdGlvbjogbWVhbmluZ2xlc3MuICAqLworIyBkZWZpbmUgU0lHRVZfTk9ORQlTSUdFVl9OT05FCisgIFNJR0VWX1RIUkVBRCwJCQkvKiBEZWxpdmVyIHZpYSB0aHJlYWQgY3JlYXRpb24uICAqLworIyBkZWZpbmUgU0lHRVZfVEhSRUFECVNJR0VWX1RIUkVBRAorCisgIFNJR0VWX1RIUkVBRF9JRCA9IDQJCS8qIFNlbmQgc2lnbmFsIHRvIHNwZWNpZmljIHRocmVhZC4gICovCisjZGVmaW5lIFNJR0VWX1RIUkVBRF9JRAlTSUdFVl9USFJFQURfSUQKK307CisKKyNlbmRpZgkvKiBoYXZlIF9TSUdOQUxfSC4gICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zaWdudW0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NpZ251bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOGFjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zaWdudW0uaApAQCAtMCwwICsxLDgwIEBACisvKiBTaWduYWwgbnVtYmVyIGRlZmluaXRpb25zLiAgTGludXggdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwxOTk2LDE5OTcsMTk5OCwxOTk5LDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZmRlZglfU0lHTkFMX0gKKworLyogRmFrZSBzaWduYWwgZnVuY3Rpb25zLiAgKi8KKyNkZWZpbmUgU0lHX0VSUgkoKF9fc2lnaGFuZGxlcl90KSAtMSkJCS8qIEVycm9yIHJldHVybi4gICovCisjZGVmaW5lIFNJR19ERkwJKChfX3NpZ2hhbmRsZXJfdCkgMCkJCS8qIERlZmF1bHQgYWN0aW9uLiAgKi8KKyNkZWZpbmUgU0lHX0lHTgkoKF9fc2lnaGFuZGxlcl90KSAxKQkJLyogSWdub3JlIHNpZ25hbC4gICovCisKKyNpZmRlZiBfX1VTRV9VTklYOTgKKyMgZGVmaW5lIFNJR19IT0xECSgoX19zaWdoYW5kbGVyX3QpIDIpCS8qIEFkZCBzaWduYWwgdG8gaG9sZCBtYXNrLiAgKi8KKyNlbmRpZgorCisKKy8qIFNpZ25hbHMuICAqLworI2RlZmluZQlTSUdIVVAJCTEJLyogSGFuZ3VwIChQT1NJWCkuICAqLworI2RlZmluZQlTSUdJTlQJCTIJLyogSW50ZXJydXB0IChBTlNJKS4gICovCisjZGVmaW5lCVNJR1FVSVQJCTMJLyogUXVpdCAoUE9TSVgpLiAgKi8KKyNkZWZpbmUJU0lHSUxMCQk0CS8qIElsbGVnYWwgaW5zdHJ1Y3Rpb24gKEFOU0kpLiAgKi8KKyNkZWZpbmUJU0lHVFJBUAkJNQkvKiBUcmFjZSB0cmFwIChQT1NJWCkuICAqLworI2RlZmluZQlTSUdBQlJUCQk2CS8qIEFib3J0IChBTlNJKS4gICovCisjZGVmaW5lCVNJR0lPVAkJNgkvKiBJT1QgdHJhcCAoNC4yIEJTRCkuICAqLworI2RlZmluZQlTSUdCVVMJCTcJLyogQlVTIGVycm9yICg0LjIgQlNEKS4gICovCisjZGVmaW5lCVNJR0ZQRQkJOAkvKiBGbG9hdGluZy1wb2ludCBleGNlcHRpb24gKEFOU0kpLiAgKi8KKyNkZWZpbmUJU0lHS0lMTAkJOQkvKiBLaWxsLCB1bmJsb2NrYWJsZSAoUE9TSVgpLiAgKi8KKyNkZWZpbmUJU0lHVVNSMQkJMTAJLyogVXNlci1kZWZpbmVkIHNpZ25hbCAxIChQT1NJWCkuICAqLworI2RlZmluZQlTSUdTRUdWCQkxMQkvKiBTZWdtZW50YXRpb24gdmlvbGF0aW9uIChBTlNJKS4gICovCisjZGVmaW5lCVNJR1VTUjIJCTEyCS8qIFVzZXItZGVmaW5lZCBzaWduYWwgMiAoUE9TSVgpLiAgKi8KKyNkZWZpbmUJU0lHUElQRQkJMTMJLyogQnJva2VuIHBpcGUgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR0FMUk0JCTE0CS8qIEFsYXJtIGNsb2NrIChQT1NJWCkuICAqLworI2RlZmluZQlTSUdURVJNCQkxNQkvKiBUZXJtaW5hdGlvbiAoQU5TSSkuICAqLworI2RlZmluZQlTSUdTVEtGTFQJMTYJLyogU3RhY2sgZmF1bHQuICAqLworI2RlZmluZQlTSUdDTEQJCVNJR0NITEQJLyogU2FtZSBhcyBTSUdDSExEIChTeXN0ZW0gVikuICAqLworI2RlZmluZQlTSUdDSExECQkxNwkvKiBDaGlsZCBzdGF0dXMgaGFzIGNoYW5nZWQgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR0NPTlQJCTE4CS8qIENvbnRpbnVlIChQT1NJWCkuICAqLworI2RlZmluZQlTSUdTVE9QCQkxOQkvKiBTdG9wLCB1bmJsb2NrYWJsZSAoUE9TSVgpLiAgKi8KKyNkZWZpbmUJU0lHVFNUUAkJMjAJLyogS2V5Ym9hcmQgc3RvcCAoUE9TSVgpLiAgKi8KKyNkZWZpbmUJU0lHVFRJTgkJMjEJLyogQmFja2dyb3VuZCByZWFkIGZyb20gdHR5IChQT1NJWCkuICAqLworI2RlZmluZQlTSUdUVE9VCQkyMgkvKiBCYWNrZ3JvdW5kIHdyaXRlIHRvIHR0eSAoUE9TSVgpLiAgKi8KKyNkZWZpbmUJU0lHVVJHCQkyMwkvKiBVcmdlbnQgY29uZGl0aW9uIG9uIHNvY2tldCAoNC4yIEJTRCkuICAqLworI2RlZmluZQlTSUdYQ1BVCQkyNAkvKiBDUFUgbGltaXQgZXhjZWVkZWQgKDQuMiBCU0QpLiAgKi8KKyNkZWZpbmUJU0lHWEZTWgkJMjUJLyogRmlsZSBzaXplIGxpbWl0IGV4Y2VlZGVkICg0LjIgQlNEKS4gICovCisjZGVmaW5lCVNJR1ZUQUxSTQkyNgkvKiBWaXJ0dWFsIGFsYXJtIGNsb2NrICg0LjIgQlNEKS4gICovCisjZGVmaW5lCVNJR1BST0YJCTI3CS8qIFByb2ZpbGluZyBhbGFybSBjbG9jayAoNC4yIEJTRCkuICAqLworI2RlZmluZQlTSUdXSU5DSAkyOAkvKiBXaW5kb3cgc2l6ZSBjaGFuZ2UgKDQuMyBCU0QsIFN1bikuICAqLworI2RlZmluZQlTSUdQT0xMCQlTSUdJTwkvKiBQb2xsYWJsZSBldmVudCBvY2N1cnJlZCAoU3lzdGVtIFYpLiAgKi8KKyNkZWZpbmUJU0lHSU8JCTI5CS8qIEkvTyBub3cgcG9zc2libGUgKDQuMiBCU0QpLiAgKi8KKyNkZWZpbmUJU0lHUFdSCQkzMAkvKiBQb3dlciBmYWlsdXJlIHJlc3RhcnQgKFN5c3RlbSBWKS4gICovCisjZGVmaW5lIFNJR1NZUwkJMzEJLyogQmFkIHN5c3RlbSBjYWxsLiAgKi8KKyNkZWZpbmUgU0lHVU5VU0VECTMxCisKKyNkZWZpbmUJX05TSUcJCTY1CS8qIEJpZ2dlc3Qgc2lnbmFsIG51bWJlciArIDEKKwkJCQkgICAoaW5jbHVkaW5nIHJlYWwtdGltZSBzaWduYWxzKS4gICovCisKKyNkZWZpbmUgU0lHUlRNSU4gICAgICAgIChfX2xpYmNfY3VycmVudF9zaWdydG1pbiAoKSkKKyNkZWZpbmUgU0lHUlRNQVggICAgICAgIChfX2xpYmNfY3VycmVudF9zaWdydG1heCAoKSkKKworLyogVGhlc2UgYXJlIHRoZSBoYXJkIGxpbWl0cyBvZiB0aGUga2VybmVsLiAgVGhlc2UgdmFsdWVzIHNob3VsZCBub3QgYmUKKyAgIHVzZWQgZGlyZWN0bHkgYXQgdXNlciBsZXZlbC4gICovCisjZGVmaW5lIF9fU0lHUlRNSU4JMzIKKyNkZWZpbmUgX19TSUdSVE1BWAkoX05TSUcgLSAxKQorCisjZW5kaWYJLyogPHNpZ25hbC5oPiBpbmNsdWRlZC4gICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zaWdzZXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NpZ3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZWM4YWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zaWdzZXQuaApAQCAtMCwwICsxLDEyNiBAQAorLyogX19zaWdfYXRvbWljX3QsIF9fc2lnc2V0X3QsIGFuZCByZWxhdGVkIGRlZmluaXRpb25zLiAgTGludXggdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5NCwgMTk5NiwgMTk5NywgMjAwNworICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NJR1NFVF9IX3R5cGVzCisjIGRlZmluZSBfU0lHU0VUX0hfdHlwZXMJMQorCit0eXBlZGVmIGludCBfX3NpZ19hdG9taWNfdDsKKworLyogQSBgc2lnc2V0X3QnIGhhcyBhIGJpdCBmb3IgZWFjaCBzaWduYWwuICAqLworCisjIGRlZmluZSBfU0lHU0VUX05XT1JEUwkoMTAyNCAvICg4ICogc2l6ZW9mICh1bnNpZ25lZCBsb25nIGludCkpKQordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdmFsW19TSUdTRVRfTldPUkRTXTsKKyAgfSBfX3NpZ3NldF90OworCisjZW5kaWYKKworCisvKiBXZSBvbmx5IHdhbnQgdG8gZGVmaW5lIHRoZXNlIGZ1bmN0aW9ucyBpZiA8c2lnbmFsLmg+IHdhcyBhY3R1YWxseQorICAgaW5jbHVkZWQ7IG90aGVyd2lzZSB3ZSB3ZXJlIGluY2x1ZGVkIGp1c3QgdG8gZGVmaW5lIHRoZSB0eXBlcy4gIFNpbmNlIHdlCisgICBhcmUgbmFtZXNwYWNlLWNsZWFuLCBpdCB3b3VsZG4ndCBodXJ0IHRvIGRlZmluZSBleHRyYSBtYWNyb3MuICBCdXQKKyAgIHRyb3VibGUgY2FuIGJlIGNhdXNlZCBieSBmdW5jdGlvbnMgYmVpbmcgZGVmaW5lZCAoZS5nLiwgYW55IGdsb2JhbAorICAgcmVnaXN0ZXIgdmFycyBkZWNsYXJlZCBsYXRlciB3aWxsIGNhdXNlIGNvbXBpbGF0aW9uIGVycm9ycykuICAqLworCisjaWYgIWRlZmluZWQgX1NJR1NFVF9IX2ZucyAmJiBkZWZpbmVkIF9TSUdOQUxfSAorIyBkZWZpbmUgX1NJR1NFVF9IX2ZucyAxCisKKyMgaWZuZGVmIF9FWFRFUk5fSU5MSU5FCisjICBkZWZpbmUgX0VYVEVSTl9JTkxJTkUgX19leHRlcm5faW5saW5lCisjIGVuZGlmCisKKy8qIFJldHVybiBhIG1hc2sgdGhhdCBpbmNsdWRlcyB0aGUgYml0IGZvciBTSUcgb25seS4gICovCisjIGRlZmluZSBfX3NpZ21hc2soc2lnKSBcCisgICgoKHVuc2lnbmVkIGxvbmcgaW50KSAxKSA8PCAoKChzaWcpIC0gMSkgJSAoOCAqIHNpemVvZiAodW5zaWduZWQgbG9uZyBpbnQpKSkpCisKKy8qIFJldHVybiB0aGUgd29yZCBpbmRleCBmb3IgU0lHLiAgKi8KKyMgZGVmaW5lIF9fc2lnd29yZChzaWcpCSgoKHNpZykgLSAxKSAvICg4ICogc2l6ZW9mICh1bnNpZ25lZCBsb25nIGludCkpKQorCisjIGlmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMgorIyAgZGVmaW5lIF9fc2lnZW1wdHlzZXQoc2V0KSBcCisgIChfX2V4dGVuc2lvbl9fICh7IGludCBfX2NudCA9IF9TSUdTRVRfTldPUkRTOwkJCQkgICAgICBcCisJCSAgICBzaWdzZXRfdCAqX19zZXQgPSAoc2V0KTsJCQkJICAgICAgXAorCQkgICAgd2hpbGUgKC0tX19jbnQgPj0gMCkgX19zZXQtPl9fdmFsW19fY250XSA9IDA7CSAgICAgIFwKKwkJICAgIDA7IH0pKQorIyAgZGVmaW5lIF9fc2lnZmlsbHNldChzZXQpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgaW50IF9fY250ID0gX1NJR1NFVF9OV09SRFM7CQkJCSAgICAgIFwKKwkJICAgIHNpZ3NldF90ICpfX3NldCA9IChzZXQpOwkJCQkgICAgICBcCisJCSAgICB3aGlsZSAoLS1fX2NudCA+PSAwKSBfX3NldC0+X192YWxbX19jbnRdID0gfjBVTDsJICAgICAgXAorCQkgICAgMDsgfSkpCisKKyMgIGlmZGVmIF9fVVNFX0dOVQorLyogVGhlIFBPU0lYIGRvZXMgbm90IHNwZWNpZnkgZm9yIGhhbmRsaW5nIHRoZSB3aG9sZSBzaWduYWwgc2V0IGluIG9uZQorICAgY29tbWFuZC4gIFRoaXMgaXMgb2Z0ZW4gd2FudGVkIGFuZCBzbyB3ZSBkZWZpbmUgdGhyZWUgbW9yZSBmdW5jdGlvbnMKKyAgIGhlcmUuICAqLworIyAgIGRlZmluZSBfX3NpZ2lzZW1wdHlzZXQoc2V0KSBcCisgIChfX2V4dGVuc2lvbl9fICh7IGludCBfX2NudCA9IF9TSUdTRVRfTldPUkRTOwkJCQkgICAgICBcCisJCSAgICBjb25zdCBzaWdzZXRfdCAqX19zZXQgPSAoc2V0KTsJCQkgICAgICBcCisJCSAgICBpbnQgX19yZXQgPSBfX3NldC0+X192YWxbLS1fX2NudF07CQkJICAgICAgXAorCQkgICAgd2hpbGUgKCFfX3JldCAmJiAtLV9fY250ID49IDApCQkJICAgICAgXAorCQkJX19yZXQgPSBfX3NldC0+X192YWxbX19jbnRdOwkJCSAgICAgIFwKKwkJICAgIF9fcmV0ID09IDA7IH0pKQorIyAgIGRlZmluZSBfX3NpZ2FuZHNldChkZXN0LCBsZWZ0LCByaWdodCkgXAorICAoX19leHRlbnNpb25fXyAoeyBpbnQgX19jbnQgPSBfU0lHU0VUX05XT1JEUzsJCQkJICAgICAgXAorCQkgICAgc2lnc2V0X3QgKl9fZGVzdCA9IChkZXN0KTsJCQkJICAgICAgXAorCQkgICAgY29uc3Qgc2lnc2V0X3QgKl9fbGVmdCA9IChsZWZ0KTsJCQkgICAgICBcCisJCSAgICBjb25zdCBzaWdzZXRfdCAqX19yaWdodCA9IChyaWdodCk7CQkJICAgICAgXAorCQkgICAgd2hpbGUgKC0tX19jbnQgPj0gMCkJCQkJICAgICAgXAorCQkgICAgICBfX2Rlc3QtPl9fdmFsW19fY250XSA9IChfX2xlZnQtPl9fdmFsW19fY250XQkgICAgICBcCisJCQkJCSAgICAgICYgX19yaWdodC0+X192YWxbX19jbnRdKTsJICAgICAgXAorCQkgICAgMDsgfSkpCisjICAgZGVmaW5lIF9fc2lnb3JzZXQoZGVzdCwgbGVmdCwgcmlnaHQpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgaW50IF9fY250ID0gX1NJR1NFVF9OV09SRFM7CQkJCSAgICAgIFwKKwkJICAgIHNpZ3NldF90ICpfX2Rlc3QgPSAoZGVzdCk7CQkJCSAgICAgIFwKKwkJICAgIGNvbnN0IHNpZ3NldF90ICpfX2xlZnQgPSAobGVmdCk7CQkJICAgICAgXAorCQkgICAgY29uc3Qgc2lnc2V0X3QgKl9fcmlnaHQgPSAocmlnaHQpOwkJCSAgICAgIFwKKwkJICAgIHdoaWxlICgtLV9fY250ID49IDApCQkJCSAgICAgIFwKKwkJICAgICAgX19kZXN0LT5fX3ZhbFtfX2NudF0gPSAoX19sZWZ0LT5fX3ZhbFtfX2NudF0JICAgICAgXAorCQkJCQkgICAgICB8IF9fcmlnaHQtPl9fdmFsW19fY250XSk7CSAgICAgIFwKKwkJICAgIDA7IH0pKQorIyAgZW5kaWYKKyMgZW5kaWYKKworLyogVGhlc2UgZnVuY3Rpb25zIG5lZWRuJ3QgY2hlY2sgZm9yIGEgYm9ndXMgc2lnbmFsIG51bWJlciAtLSBlcnJvcgorICAgY2hlY2tpbmcgaXMgZG9uZSBpbiB0aGUgbm9uIF9fIHZlcnNpb25zLiAgKi8KKworZXh0ZXJuIGludCBfX3NpZ2lzbWVtYmVyIChfX2NvbnN0IF9fc2lnc2V0X3QgKiwgaW50KTsKK2V4dGVybiBpbnQgX19zaWdhZGRzZXQgKF9fc2lnc2V0X3QgKiwgaW50KTsKK2V4dGVybiBpbnQgX19zaWdkZWxzZXQgKF9fc2lnc2V0X3QgKiwgaW50KTsKKworIyBpZmRlZiBfX1VTRV9FWFRFUk5fSU5MSU5FUworIyAgZGVmaW5lIF9fU0lHU0VURk4oTkFNRSwgQk9EWSwgQ09OU1QpCQkJCQkgICAgICBcCisgIF9FWFRFUk5fSU5MSU5FIGludAkJCQkJCQkgICAgICBcCisgIE5BTUUgKENPTlNUIF9fc2lnc2V0X3QgKl9fc2V0LCBpbnQgX19zaWcpCQkJCSAgICAgIFwKKyAgewkJCQkJCQkJCSAgICAgIFwKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX21hc2sgPSBfX3NpZ21hc2sgKF9fc2lnKTsJCQkgICAgICBcCisgICAgdW5zaWduZWQgbG9uZyBpbnQgX193b3JkID0gX19zaWd3b3JkIChfX3NpZyk7CQkJICAgICAgXAorICAgIHJldHVybiBCT0RZOwkJCQkJCQkgICAgICBcCisgIH0KKworX19TSUdTRVRGTiAoX19zaWdpc21lbWJlciwgKF9fc2V0LT5fX3ZhbFtfX3dvcmRdICYgX19tYXNrKSA/IDEgOiAwLCBfX2NvbnN0KQorX19TSUdTRVRGTiAoX19zaWdhZGRzZXQsICgoX19zZXQtPl9fdmFsW19fd29yZF0gfD0gX19tYXNrKSwgMCksICkKK19fU0lHU0VURk4gKF9fc2lnZGVsc2V0LCAoKF9fc2V0LT5fX3ZhbFtfX3dvcmRdICY9IH5fX21hc2spLCAwKSwgKQorCisjICB1bmRlZiBfX1NJR1NFVEZOCisjIGVuZGlmCisKKworI2VuZGlmIC8qICEgX1NJR1NFVF9IX2Zucy4gICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zaWdzdGFjay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2lnc3RhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjI2MDM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc2lnc3RhY2suaApAQCAtMCwwICsxLDU1IEBACisvKiBzaWdzdGFjaywgc2lnYWx0c3RhY2sgZGVmaW5pdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NJR05BTF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseS4gIFVzZSA8c2lnbmFsLmg+IGluc3RlYWQiCisjZW5kaWYKKworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHNpZ25hbCBzdGFjayAob2Jzb2xldGUpLiAgKi8KK3N0cnVjdCBzaWdzdGFjaworICB7CisgICAgdm9pZCAqc3Nfc3A7CQkvKiBTaWduYWwgc3RhY2sgcG9pbnRlci4gICovCisgICAgaW50IHNzX29uc3RhY2s7CQkvKiBOb256ZXJvIGlmIGV4ZWN1dGluZyBvbiB0aGlzIHN0YWNrLiAgKi8KKyAgfTsKKworCisvKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIGBzc19mbGFncy4nLiAgKi8KK2VudW0KK3sKKyAgU1NfT05TVEFDSyA9IDEsCisjZGVmaW5lIFNTX09OU1RBQ0sJU1NfT05TVEFDSworICBTU19ESVNBQkxFCisjZGVmaW5lIFNTX0RJU0FCTEUJU1NfRElTQUJMRQorfTsKKworLyogTWluaW11bSBzdGFjayBzaXplIGZvciBhIHNpZ25hbCBoYW5kbGVyLiAgKi8KKyNkZWZpbmUgTUlOU0lHU1RLU1oJMjA0OAorCisvKiBTeXN0ZW0gZGVmYXVsdCBzdGFjayBzaXplLiAgKi8KKyNkZWZpbmUgU0lHU1RLU1oJODE5MgorCisKKy8qIEFsdGVybmF0ZSwgcHJlZmVycmVkIGludGVyZmFjZS4gICovCit0eXBlZGVmIHN0cnVjdCBzaWdhbHRzdGFjaworICB7CisgICAgdm9pZCAqc3Nfc3A7CisgICAgaW50IHNzX2ZsYWdzOworICAgIHNpemVfdCBzc19zaXplOworICB9IHN0YWNrX3Q7CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zaWd0aHJlYWQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3NpZ3RocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNTI0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zaWd0aHJlYWQuaApAQCAtMCwwICsxLDQ0IEBACisvKiBTaWduYWwgaGFuZGxpbmcgZnVuY3Rpb24gZm9yIHRocmVhZGVkIHByb2dyYW1zLgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCisgICB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgX0JJVFNfU0lHVEhSRUFEX0gKKyNkZWZpbmUgX0JJVFNfU0lHVEhSRUFEX0gJMQorCisjaWYgIWRlZmluZWQgX1NJR05BTF9IICYmICFkZWZpbmVkIF9QVEhSRUFEX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LiAgVXNlIDxwdGhyZWFkLmg+IGluc3RlYWQiCisjZW5kaWYKKworLyogRnVuY3Rpb25zIGZvciBoYW5kbGluZyBzaWduYWxzLiAqLworCisvKiBNb2RpZnkgdGhlIHNpZ25hbCBtYXNrIGZvciB0aGUgY2FsbGluZyB0aHJlYWQuICBUaGUgYXJndW1lbnRzIGhhdmUKKyAgIHRoZSBzYW1lIG1lYW5pbmcgYXMgZm9yIHNpZ3Byb2NtYXNrKDIpLiAqLworZXh0ZXJuIGludCBwdGhyZWFkX3NpZ21hc2sgKGludCBfX2hvdywKKwkJCSAgICBfX2NvbnN0IF9fc2lnc2V0X3QgKl9fcmVzdHJpY3QgX19uZXdtYXNrLAorCQkJICAgIF9fc2lnc2V0X3QgKl9fcmVzdHJpY3QgX19vbGRtYXNrKV9fVEhST1c7CisKKy8qIFNlbmQgc2lnbmFsIFNJR05PIHRvIHRoZSBnaXZlbiB0aHJlYWQuICovCitleHRlcm4gaW50IHB0aHJlYWRfa2lsbCAocHRocmVhZF90IF9fdGhyZWFkaWQsIGludCBfX3NpZ25vKSBfX1RIUk9XOworCisjaWZkZWYgX19VU0VfR05VCisvKiBRdWV1ZSBzaWduYWwgYW5kIGRhdGEgdG8gYSB0aHJlYWQuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3NpZ3F1ZXVlIChwdGhyZWFkX3QgX190aHJlYWRpZCwgaW50IF9fc2lnbm8sCisJCQkgICAgIGNvbnN0IHVuaW9uIHNpZ3ZhbCBfX3ZhbHVlKSBfX1RIUk9XOworI2VuZGlmCisKKyNlbmRpZgkvKiBiaXRzL3NpZ3RocmVhZC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zb2NrYWRkci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc29ja2FkZHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTFkMTMxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc29ja2FkZHIuaApAQCAtMCwwICsxLDQwIEBACisvKiBEZWZpbml0aW9uIG9mIGBzdHJ1Y3Qgc29ja2FkZHJfKicgY29tbW9uIG1lbWJlcnMuICBHZW5lcmljLzQuMiBCU0QgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwxOTk2LDE5OTcsMTk5OCwyMDAwLDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKiBOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseTsgdXNlIDxzeXMvc29ja2V0Lmg+IGluc3RlYWQuCisgKi8KKworI2lmbmRlZiBfQklUU19TT0NLQUREUl9ICisjZGVmaW5lIF9CSVRTX1NPQ0tBRERSX0gJMQorCisKKy8qIFBPU0lYLjFnIHNwZWNpZmllcyB0aGlzIHR5cGUgbmFtZSBmb3IgdGhlIGBzYV9mYW1pbHknIG1lbWJlci4gICovCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBzYV9mYW1pbHlfdDsKKworLyogVGhpcyBtYWNybyBpcyB1c2VkIHRvIGRlY2xhcmUgdGhlIGluaXRpYWwgY29tbW9uIG1lbWJlcnMKKyAgIG9mIHRoZSBkYXRhIHR5cGVzIHVzZWQgZm9yIHNvY2tldCBhZGRyZXNzZXMsIGBzdHJ1Y3Qgc29ja2FkZHInLAorICAgYHN0cnVjdCBzb2NrYWRkcl9pbicsIGBzdHJ1Y3Qgc29ja2FkZHJfdW4nLCBldGMuICAqLworCisjZGVmaW5lCV9fU09DS0FERFJfQ09NTU9OKHNhX3ByZWZpeCkgXAorICBzYV9mYW1pbHlfdCBzYV9wcmVmaXgjI2ZhbWlseQorCisjZGVmaW5lIF9fU09DS0FERFJfQ09NTU9OX1NJWkUJKHNpemVvZiAodW5zaWduZWQgc2hvcnQgaW50KSkKKworI2VuZGlmCS8qIGJpdHMvc29ja2FkZHIuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc29ja2V0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWUwOTBiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc29ja2V0LmgKQEAgLTAsMCArMSw0NDQgQEAKKy8qIFN5c3RlbS1zcGVjaWZpYyBzb2NrZXQgY29uc3RhbnRzIGFuZCB0eXBlcy4gIExpbnV4IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTQtMjAwMSwgMjAwNCwgMjAwNi0yMDEwLCAyMDExCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfX0JJVFNfU09DS0VUX0gKKyNkZWZpbmUgX19CSVRTX1NPQ0tFVF9ICisKKyNpZm5kZWYgX1NZU19TT0NLRVRfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zb2NrZXQuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3NvY2tldC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjZGVmaW5lCV9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKiBUeXBlIGZvciBsZW5ndGggYXJndW1lbnRzIGluIHNvY2tldCBjYWxscy4gICovCisjaWZuZGVmIF9fc29ja2xlbl90X2RlZmluZWQKK3R5cGVkZWYgX19zb2NrbGVuX3Qgc29ja2xlbl90OworIyBkZWZpbmUgX19zb2NrbGVuX3RfZGVmaW5lZAorI2VuZGlmCisKKy8qIFR5cGVzIG9mIHNvY2tldHMuICAqLworZW51bSBfX3NvY2tldF90eXBlCit7CisgIFNPQ0tfU1RSRUFNID0gMSwJCS8qIFNlcXVlbmNlZCwgcmVsaWFibGUsIGNvbm5lY3Rpb24tYmFzZWQKKwkJCQkgICBieXRlIHN0cmVhbXMuICAqLworI2RlZmluZSBTT0NLX1NUUkVBTSBTT0NLX1NUUkVBTQorICBTT0NLX0RHUkFNID0gMiwJCS8qIENvbm5lY3Rpb25sZXNzLCB1bnJlbGlhYmxlIGRhdGFncmFtcworCQkJCSAgIG9mIGZpeGVkIG1heGltdW0gbGVuZ3RoLiAgKi8KKyNkZWZpbmUgU09DS19ER1JBTSBTT0NLX0RHUkFNCisgIFNPQ0tfUkFXID0gMywJCQkvKiBSYXcgcHJvdG9jb2wgaW50ZXJmYWNlLiAgKi8KKyNkZWZpbmUgU09DS19SQVcgU09DS19SQVcKKyAgU09DS19SRE0gPSA0LAkJCS8qIFJlbGlhYmx5LWRlbGl2ZXJlZCBtZXNzYWdlcy4gICovCisjZGVmaW5lIFNPQ0tfUkRNIFNPQ0tfUkRNCisgIFNPQ0tfU0VRUEFDS0VUID0gNSwJCS8qIFNlcXVlbmNlZCwgcmVsaWFibGUsIGNvbm5lY3Rpb24tYmFzZWQsCisJCQkJICAgZGF0YWdyYW1zIG9mIGZpeGVkIG1heGltdW0gbGVuZ3RoLiAgKi8KKyNkZWZpbmUgU09DS19TRVFQQUNLRVQgU09DS19TRVFQQUNLRVQKKyAgU09DS19EQ0NQID0gNiwJCS8qIERhdGFncmFtIENvbmdlc3Rpb24gQ29udHJvbCBQcm90b2NvbC4gICovCisjZGVmaW5lIFNPQ0tfRENDUCBTT0NLX0RDQ1AKKyAgU09DS19QQUNLRVQgPSAxMCwJCS8qIExpbnV4IHNwZWNpZmljIHdheSBvZiBnZXR0aW5nIHBhY2tldHMKKwkJCQkgICBhdCB0aGUgZGV2IGxldmVsLiAgRm9yIHdyaXRpbmcgcmFycCBhbmQKKwkJCQkgICBvdGhlciBzaW1pbGFyIHRoaW5ncyBvbiB0aGUgdXNlciBsZXZlbC4gKi8KKyNkZWZpbmUgU09DS19QQUNLRVQgU09DS19QQUNLRVQKKworICAvKiBGbGFncyB0byBiZSBPUmVkIGludG8gdGhlIHR5cGUgcGFyYW1ldGVyIG9mIHNvY2tldCBhbmQgc29ja2V0cGFpciBhbmQKKyAgICAgdXNlZCBmb3IgdGhlIGZsYWdzIHBhcmFtZXRlciBvZiBwYWNjZXB0LiAgKi8KKworICBTT0NLX0NMT0VYRUMgPSAwMjAwMDAwMCwJLyogQXRvbWljYWxseSBzZXQgY2xvc2Utb24tZXhlYyBmbGFnIGZvciB0aGUKKwkJCQkgICBuZXcgZGVzY3JpcHRvcihzKS4gICovCisjZGVmaW5lIFNPQ0tfQ0xPRVhFQyBTT0NLX0NMT0VYRUMKKyAgU09DS19OT05CTE9DSyA9IDA0MDAwCQkvKiBBdG9taWNhbGx5IG1hcmsgZGVzY3JpcHRvcihzKSBhcworCQkJCSAgIG5vbi1ibG9ja2luZy4gICovCisjZGVmaW5lIFNPQ0tfTk9OQkxPQ0sgU09DS19OT05CTE9DSworfTsKKworLyogUHJvdG9jb2wgZmFtaWxpZXMuICAqLworI2RlZmluZQlQRl9VTlNQRUMJMAkvKiBVbnNwZWNpZmllZC4gICovCisjZGVmaW5lCVBGX0xPQ0FMCTEJLyogTG9jYWwgdG8gaG9zdCAocGlwZXMgYW5kIGZpbGUtZG9tYWluKS4gICovCisjZGVmaW5lCVBGX1VOSVgJCVBGX0xPQ0FMIC8qIFBPU0lYIG5hbWUgZm9yIFBGX0xPQ0FMLiAgKi8KKyNkZWZpbmUJUEZfRklMRQkJUEZfTE9DQUwgLyogQW5vdGhlciBub24tc3RhbmRhcmQgbmFtZSBmb3IgUEZfTE9DQUwuICAqLworI2RlZmluZQlQRl9JTkVUCQkyCS8qIElQIHByb3RvY29sIGZhbWlseS4gICovCisjZGVmaW5lCVBGX0FYMjUJCTMJLyogQW1hdGV1ciBSYWRpbyBBWC4yNS4gICovCisjZGVmaW5lCVBGX0lQWAkJNAkvKiBOb3ZlbGwgSW50ZXJuZXQgUHJvdG9jb2wuICAqLworI2RlZmluZQlQRl9BUFBMRVRBTEsJNQkvKiBBcHBsZXRhbGsgRERQLiAgKi8KKyNkZWZpbmUJUEZfTkVUUk9NCTYJLyogQW1hdGV1ciByYWRpbyBOZXRST00uICAqLworI2RlZmluZQlQRl9CUklER0UJNwkvKiBNdWx0aXByb3RvY29sIGJyaWRnZS4gICovCisjZGVmaW5lCVBGX0FUTVBWQwk4CS8qIEFUTSBQVkNzLiAgKi8KKyNkZWZpbmUJUEZfWDI1CQk5CS8qIFJlc2VydmVkIGZvciBYLjI1IHByb2plY3QuICAqLworI2RlZmluZQlQRl9JTkVUNgkxMAkvKiBJUCB2ZXJzaW9uIDYuICAqLworI2RlZmluZQlQRl9ST1NFCQkxMQkvKiBBbWF0ZXVyIFJhZGlvIFguMjUgUExQLiAgKi8KKyNkZWZpbmUJUEZfREVDbmV0CTEyCS8qIFJlc2VydmVkIGZvciBERUNuZXQgcHJvamVjdC4gICovCisjZGVmaW5lCVBGX05FVEJFVUkJMTMJLyogUmVzZXJ2ZWQgZm9yIDgwMi4yTExDIHByb2plY3QuICAqLworI2RlZmluZQlQRl9TRUNVUklUWQkxNAkvKiBTZWN1cml0eSBjYWxsYmFjayBwc2V1ZG8gQUYuICAqLworI2RlZmluZQlQRl9LRVkJCTE1CS8qIFBGX0tFWSBrZXkgbWFuYWdlbWVudCBBUEkuICAqLworI2RlZmluZQlQRl9ORVRMSU5LCTE2CisjZGVmaW5lCVBGX1JPVVRFCVBGX05FVExJTksgLyogQWxpYXMgdG8gZW11bGF0ZSA0LjRCU0QuICAqLworI2RlZmluZQlQRl9QQUNLRVQJMTcJLyogUGFja2V0IGZhbWlseS4gICovCisjZGVmaW5lCVBGX0FTSAkJMTgJLyogQXNoLiAgKi8KKyNkZWZpbmUJUEZfRUNPTkVUCTE5CS8qIEFjb3JuIEVjb25ldC4gICovCisjZGVmaW5lCVBGX0FUTVNWQwkyMAkvKiBBVE0gU1ZDcy4gICovCisjZGVmaW5lIFBGX1JEUwkJMjEJLyogUkRTIHNvY2tldHMuICAqLworI2RlZmluZQlQRl9TTkEJCTIyCS8qIExpbnV4IFNOQSBQcm9qZWN0ICovCisjZGVmaW5lCVBGX0lSREEJCTIzCS8qIElSREEgc29ja2V0cy4gICovCisjZGVmaW5lCVBGX1BQUE9YCTI0CS8qIFBQUG9YIHNvY2tldHMuICAqLworI2RlZmluZQlQRl9XQU5QSVBFCTI1CS8qIFdhbnBpcGUgQVBJIHNvY2tldHMuICAqLworI2RlZmluZSBQRl9MTEMJCTI2CS8qIExpbnV4IExMQy4gICovCisjZGVmaW5lIFBGX0NBTgkJMjkJLyogQ29udHJvbGxlciBBcmVhIE5ldHdvcmsuICAqLworI2RlZmluZSBQRl9USVBDCQkzMAkvKiBUSVBDIHNvY2tldHMuICAqLworI2RlZmluZQlQRl9CTFVFVE9PVEgJMzEJLyogQmx1ZXRvb3RoIHNvY2tldHMuICAqLworI2RlZmluZQlQRl9JVUNWCQkzMgkvKiBJVUNWIHNvY2tldHMuICAqLworI2RlZmluZSBQRl9SWFJQQwkzMwkvKiBSeFJQQyBzb2NrZXRzLiAgKi8KKyNkZWZpbmUgUEZfSVNETgkJMzQJLyogbUlTRE4gc29ja2V0cy4gICovCisjZGVmaW5lIFBGX1BIT05FVAkzNQkvKiBQaG9uZXQgc29ja2V0cy4gICovCisjZGVmaW5lIFBGX0lFRUU4MDIxNTQJMzYJLyogSUVFRSA4MDIuMTUuNCBzb2NrZXRzLiAgKi8KKyNkZWZpbmUgUEZfQ0FJRgkJMzcJLyogQ0FJRiBzb2NrZXRzLiAgKi8KKyNkZWZpbmUgUEZfQUxHCQkzOAkvKiBBbGdvcml0aG0gc29ja2V0cy4gICovCisjZGVmaW5lIFBGX05GQwkJMzkJLyogTkZDIHNvY2tldHMuICAqLworI2RlZmluZQlQRl9NQVgJCTQwCS8qIEZvciBub3cuLiAgKi8KKworLyogQWRkcmVzcyBmYW1pbGllcy4gICovCisjZGVmaW5lCUFGX1VOU1BFQwlQRl9VTlNQRUMKKyNkZWZpbmUJQUZfTE9DQUwJUEZfTE9DQUwKKyNkZWZpbmUJQUZfVU5JWAkJUEZfVU5JWAorI2RlZmluZQlBRl9GSUxFCQlQRl9GSUxFCisjZGVmaW5lCUFGX0lORVQJCVBGX0lORVQKKyNkZWZpbmUJQUZfQVgyNQkJUEZfQVgyNQorI2RlZmluZQlBRl9JUFgJCVBGX0lQWAorI2RlZmluZQlBRl9BUFBMRVRBTEsJUEZfQVBQTEVUQUxLCisjZGVmaW5lCUFGX05FVFJPTQlQRl9ORVRST00KKyNkZWZpbmUJQUZfQlJJREdFCVBGX0JSSURHRQorI2RlZmluZQlBRl9BVE1QVkMJUEZfQVRNUFZDCisjZGVmaW5lCUFGX1gyNQkJUEZfWDI1CisjZGVmaW5lCUFGX0lORVQ2CVBGX0lORVQ2CisjZGVmaW5lCUFGX1JPU0UJCVBGX1JPU0UKKyNkZWZpbmUJQUZfREVDbmV0CVBGX0RFQ25ldAorI2RlZmluZQlBRl9ORVRCRVVJCVBGX05FVEJFVUkKKyNkZWZpbmUJQUZfU0VDVVJJVFkJUEZfU0VDVVJJVFkKKyNkZWZpbmUJQUZfS0VZCQlQRl9LRVkKKyNkZWZpbmUJQUZfTkVUTElOSwlQRl9ORVRMSU5LCisjZGVmaW5lCUFGX1JPVVRFCVBGX1JPVVRFCisjZGVmaW5lCUFGX1BBQ0tFVAlQRl9QQUNLRVQKKyNkZWZpbmUJQUZfQVNICQlQRl9BU0gKKyNkZWZpbmUJQUZfRUNPTkVUCVBGX0VDT05FVAorI2RlZmluZQlBRl9BVE1TVkMJUEZfQVRNU1ZDCisjZGVmaW5lIEFGX1JEUwkJUEZfUkRTCisjZGVmaW5lCUFGX1NOQQkJUEZfU05BCisjZGVmaW5lCUFGX0lSREEJCVBGX0lSREEKKyNkZWZpbmUJQUZfUFBQT1gJUEZfUFBQT1gKKyNkZWZpbmUJQUZfV0FOUElQRQlQRl9XQU5QSVBFCisjZGVmaW5lIEFGX0xMQwkJUEZfTExDCisjZGVmaW5lIEFGX0NBTgkJUEZfQ0FOCisjZGVmaW5lIEFGX1RJUEMJCVBGX1RJUEMKKyNkZWZpbmUJQUZfQkxVRVRPT1RICVBGX0JMVUVUT09USAorI2RlZmluZQlBRl9JVUNWCQlQRl9JVUNWCisjZGVmaW5lIEFGX1JYUlBDCVBGX1JYUlBDCisjZGVmaW5lIEFGX0lTRE4JCVBGX0lTRE4KKyNkZWZpbmUgQUZfUEhPTkVUCVBGX1BIT05FVAorI2RlZmluZSBBRl9JRUVFODAyMTU0CVBGX0lFRUU4MDIxNTQKKyNkZWZpbmUgQUZfQ0FJRgkJUEZfQ0FJRgorI2RlZmluZSBBRl9BTEcJCVBGX0FMRworI2RlZmluZSBBRl9ORkMJCVBGX05GQworI2RlZmluZQlBRl9NQVgJCVBGX01BWAorCisvKiBTb2NrZXQgbGV2ZWwgdmFsdWVzLiAgT3RoZXJzIGFyZSBkZWZpbmVkIGluIHRoZSBhcHByb3ByaWF0ZSBoZWFkZXJzLgorCisgICBYWFggVGhlc2UgZGVmaW5pdGlvbnMgYWxzbyBzaG91bGQgZ28gaW50byB0aGUgYXBwcm9wcmlhdGUgaGVhZGVycyBhcworICAgZmFyIGFzIHRoZXkgYXJlIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIFNPTF9SQVcJCTI1NQorI2RlZmluZSBTT0xfREVDTkVUICAgICAgMjYxCisjZGVmaW5lIFNPTF9YMjUgICAgICAgICAyNjIKKyNkZWZpbmUgU09MX1BBQ0tFVAkyNjMKKyNkZWZpbmUgU09MX0FUTQkJMjY0CS8qIEFUTSBsYXllciAoY2VsbCBsZXZlbCkuICAqLworI2RlZmluZSBTT0xfQUFMCQkyNjUJLyogQVRNIEFkYXB0aW9uIExheWVyIChwYWNrZXQgbGV2ZWwpLiAgKi8KKyNkZWZpbmUgU09MX0lSREEJMjY2CisKKy8qIE1heGltdW0gcXVldWUgbGVuZ3RoIHNwZWNpZmlhYmxlIGJ5IGxpc3Rlbi4gICovCisjZGVmaW5lIFNPTUFYQ09OTgkxMjgKKworLyogR2V0IHRoZSBkZWZpbml0aW9uIG9mIHRoZSBtYWNybyB0byBkZWZpbmUgdGhlIGNvbW1vbiBzb2NrYWRkciBtZW1iZXJzLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3NvY2thZGRyLmg+CisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIGEgZ2VuZXJpYyBzb2NrZXQgYWRkcmVzcy4gICovCitzdHJ1Y3Qgc29ja2FkZHIKKyAgeworICAgIF9fU09DS0FERFJfQ09NTU9OIChzYV8pOwkvKiBDb21tb24gZGF0YTogYWRkcmVzcyBmYW1pbHkgYW5kIGxlbmd0aC4gICovCisgICAgY2hhciBzYV9kYXRhWzE0XTsJCS8qIEFkZHJlc3MgZGF0YS4gICovCisgIH07CisKKworLyogU3RydWN0dXJlIGxhcmdlIGVub3VnaCB0byBob2xkIGFueSBzb2NrZXQgYWRkcmVzcyAod2l0aCB0aGUgaGlzdG9yaWNhbAorICAgZXhjZXB0aW9uIG9mIEFGX1VOSVgpLiAgV2UgcmVzZXJ2ZSAxMjggYnl0ZXMuICAqLworI2RlZmluZSBfX3NzX2FsaWdudHlwZQl1bnNpZ25lZCBsb25nIGludAorI2RlZmluZSBfU1NfU0laRQkxMjgKKyNkZWZpbmUgX1NTX1BBRFNJWkUJKF9TU19TSVpFIC0gKDIgKiBzaXplb2YgKF9fc3NfYWxpZ250eXBlKSkpCisKK3N0cnVjdCBzb2NrYWRkcl9zdG9yYWdlCisgIHsKKyAgICBfX1NPQ0tBRERSX0NPTU1PTiAoc3NfKTsJLyogQWRkcmVzcyBmYW1pbHksIGV0Yy4gICovCisgICAgX19zc19hbGlnbnR5cGUgX19zc19hbGlnbjsJLyogRm9yY2UgZGVzaXJlZCBhbGlnbm1lbnQuICAqLworICAgIGNoYXIgX19zc19wYWRkaW5nW19TU19QQURTSVpFXTsKKyAgfTsKKworCisvKiBCaXRzIGluIHRoZSBGTEFHUyBhcmd1bWVudCB0byBgc2VuZCcsIGByZWN2JywgZXQgYWwuICAqLworZW51bQorICB7CisgICAgTVNHX09PQgkJPSAweDAxLAkvKiBQcm9jZXNzIG91dC1vZi1iYW5kIGRhdGEuICAqLworI2RlZmluZSBNU0dfT09CCQlNU0dfT09CCisgICAgTVNHX1BFRUsJCT0gMHgwMiwJLyogUGVlayBhdCBpbmNvbWluZyBtZXNzYWdlcy4gICovCisjZGVmaW5lIE1TR19QRUVLCU1TR19QRUVLCisgICAgTVNHX0RPTlRST1VURQk9IDB4MDQsCS8qIERvbid0IHVzZSBsb2NhbCByb3V0aW5nLiAgKi8KKyNkZWZpbmUgTVNHX0RPTlRST1VURQlNU0dfRE9OVFJPVVRFCisjaWZkZWYgX19VU0VfR05VCisgICAgLyogREVDbmV0IHVzZXMgYSBkaWZmZXJlbnQgbmFtZS4gICovCisgICAgTVNHX1RSWUhBUkQJCT0gTVNHX0RPTlRST1VURSwKKyMgZGVmaW5lIE1TR19UUllIQVJECU1TR19ET05UUk9VVEUKKyNlbmRpZgorICAgIE1TR19DVFJVTkMJCT0gMHgwOCwJLyogQ29udHJvbCBkYXRhIGxvc3QgYmVmb3JlIGRlbGl2ZXJ5LiAgKi8KKyNkZWZpbmUgTVNHX0NUUlVOQwlNU0dfQ1RSVU5DCisgICAgTVNHX1BST1hZCQk9IDB4MTAsCS8qIFN1cHBseSBvciBhc2sgc2Vjb25kIGFkZHJlc3MuICAqLworI2RlZmluZSBNU0dfUFJPWFkJTVNHX1BST1hZCisgICAgTVNHX1RSVU5DCQk9IDB4MjAsCisjZGVmaW5lCU1TR19UUlVOQwlNU0dfVFJVTkMKKyAgICBNU0dfRE9OVFdBSVQJPSAweDQwLCAvKiBOb25ibG9ja2luZyBJTy4gICovCisjZGVmaW5lCU1TR19ET05UV0FJVAlNU0dfRE9OVFdBSVQKKyAgICBNU0dfRU9SCQk9IDB4ODAsIC8qIEVuZCBvZiByZWNvcmQuICAqLworI2RlZmluZQlNU0dfRU9SCQlNU0dfRU9SCisgICAgTVNHX1dBSVRBTEwJCT0gMHgxMDAsIC8qIFdhaXQgZm9yIGEgZnVsbCByZXF1ZXN0LiAgKi8KKyNkZWZpbmUJTVNHX1dBSVRBTEwJTVNHX1dBSVRBTEwKKyAgICBNU0dfRklOCQk9IDB4MjAwLAorI2RlZmluZQlNU0dfRklOCQlNU0dfRklOCisgICAgTVNHX1NZTgkJPSAweDQwMCwKKyNkZWZpbmUJTVNHX1NZTgkJTVNHX1NZTgorICAgIE1TR19DT05GSVJNCQk9IDB4ODAwLCAvKiBDb25maXJtIHBhdGggdmFsaWRpdHkuICAqLworI2RlZmluZQlNU0dfQ09ORklSTQlNU0dfQ09ORklSTQorICAgIE1TR19SU1QJCT0gMHgxMDAwLAorI2RlZmluZQlNU0dfUlNUCQlNU0dfUlNUCisgICAgTVNHX0VSUlFVRVVFCT0gMHgyMDAwLCAvKiBGZXRjaCBtZXNzYWdlIGZyb20gZXJyb3IgcXVldWUuICAqLworI2RlZmluZQlNU0dfRVJSUVVFVUUJTVNHX0VSUlFVRVVFCisgICAgTVNHX05PU0lHTkFMCT0gMHg0MDAwLCAvKiBEbyBub3QgZ2VuZXJhdGUgU0lHUElQRS4gICovCisjZGVmaW5lCU1TR19OT1NJR05BTAlNU0dfTk9TSUdOQUwKKyAgICBNU0dfTU9SRQkJPSAweDgwMDAsICAvKiBTZW5kZXIgd2lsbCBzZW5kIG1vcmUuICAqLworI2RlZmluZQlNU0dfTU9SRQlNU0dfTU9SRQorICAgIE1TR19XQUlURk9ST05FCT0gMHgxMDAwMCwgLyogV2FpdCBmb3IgYXQgbGVhc3Qgb25lIHBhY2tldCB0byByZXR1cm4uKi8KKyNkZWZpbmUgTVNHX1dBSVRGT1JPTkUJTVNHX1dBSVRGT1JPTkUKKworICAgIE1TR19DTVNHX0NMT0VYRUMJPSAweDQwMDAwMDAwCS8qIFNldCBjbG9zZV9vbl9leGl0IGZvciBmaWxlCisJCQkJCSAgIGRlc2NyaXB0b3IgcmVjZWl2ZWQgdGhyb3VnaAorCQkJCQkgICBTQ01fUklHSFRTLiAgKi8KKyNkZWZpbmUgTVNHX0NNU0dfQ0xPRVhFQyBNU0dfQ01TR19DTE9FWEVDCisgIH07CisKKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgbWVzc2FnZXMgc2VudCBieQorICAgYHNlbmRtc2cnIGFuZCByZWNlaXZlZCBieSBgcmVjdm1zZycuICAqLworc3RydWN0IG1zZ2hkcgorICB7CisgICAgdm9pZCAqbXNnX25hbWU7CQkvKiBBZGRyZXNzIHRvIHNlbmQgdG8vcmVjZWl2ZSBmcm9tLiAgKi8KKyAgICBzb2NrbGVuX3QgbXNnX25hbWVsZW47CS8qIExlbmd0aCBvZiBhZGRyZXNzIGRhdGEuICAqLworCisgICAgc3RydWN0IGlvdmVjICptc2dfaW92OwkvKiBWZWN0b3Igb2YgZGF0YSB0byBzZW5kL3JlY2VpdmUgaW50by4gICovCisgICAgc2l6ZV90IG1zZ19pb3ZsZW47CQkvKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4gICovCisKKyAgICB2b2lkICptc2dfY29udHJvbDsJCS8qIEFuY2lsbGFyeSBkYXRhIChlZyBCU0QgZmlsZWRlc2MgcGFzc2luZykuICovCisgICAgc2l6ZV90IG1zZ19jb250cm9sbGVuOwkvKiBBbmNpbGxhcnkgZGF0YSBidWZmZXIgbGVuZ3RoLgorCQkJCSAgICEhIFRoZSB0eXBlIHNob3VsZCBiZSBzb2NrbGVuX3QgYnV0IHRoZQorCQkJCSAgIGRlZmluaXRpb24gb2YgdGhlIGtlcm5lbCBpcyBpbmNvbXBhdGlibGUKKwkJCQkgICB3aXRoIHRoaXMuICAqLworCisgICAgaW50IG1zZ19mbGFnczsJCS8qIEZsYWdzIG9uIHJlY2VpdmVkIG1lc3NhZ2UuICAqLworICB9OworCisjaWZkZWYgX19VU0VfR05VCisvKiBGb3IgYHJlY3ZtbXNnJy4gICovCitzdHJ1Y3QgbW1zZ2hkcgorICB7CisgICAgc3RydWN0IG1zZ2hkciBtc2dfaGRyOwkvKiBBY3R1YWwgbWVzc2FnZSBoZWFkZXIuICAqLworICAgIHVuc2lnbmVkIGludCBtc2dfbGVuOwkvKiBOdW1iZXIgb2YgcmVjZWl2ZWQgYnl0ZXMgZm9yIHRoZSBlbnRyeS4gICovCisgIH07CisjZW5kaWYKKworLyogU3RydWN0dXJlIHVzZWQgZm9yIHN0b3JhZ2Ugb2YgYW5jaWxsYXJ5IGRhdGEgb2JqZWN0IGluZm9ybWF0aW9uLiAgKi8KK3N0cnVjdCBjbXNnaGRyCisgIHsKKyAgICBzaXplX3QgY21zZ19sZW47CQkvKiBMZW5ndGggb2YgZGF0YSBpbiBjbXNnX2RhdGEgcGx1cyBsZW5ndGgKKwkJCQkgICBvZiBjbXNnaGRyIHN0cnVjdHVyZS4KKwkJCQkgICAhISBUaGUgdHlwZSBzaG91bGQgYmUgc29ja2xlbl90IGJ1dCB0aGUKKwkJCQkgICBkZWZpbml0aW9uIG9mIHRoZSBrZXJuZWwgaXMgaW5jb21wYXRpYmxlCisJCQkJICAgd2l0aCB0aGlzLiAgKi8KKyAgICBpbnQgY21zZ19sZXZlbDsJCS8qIE9yaWdpbmF0aW5nIHByb3RvY29sLiAgKi8KKyAgICBpbnQgY21zZ190eXBlOwkJLyogUHJvdG9jb2wgc3BlY2lmaWMgdHlwZS4gICovCisjaWYgKCFkZWZpbmVkIF9fU1RSSUNUX0FOU0lfXyAmJiBfX0dOVUNfXyA+PSAyKSB8fCBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyAgICBfX2V4dGVuc2lvbl9fIHVuc2lnbmVkIGNoYXIgX19jbXNnX2RhdGEgX19mbGV4YXJyOyAvKiBBbmNpbGxhcnkgZGF0YS4gICovCisjZW5kaWYKKyAgfTsKKworLyogQW5jaWxsYXJ5IGRhdGEgb2JqZWN0IG1hbmlwdWxhdGlvbiBtYWNyb3MuICAqLworI2lmICghZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gJiYgX19HTlVDX18gPj0gMikgfHwgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjIGRlZmluZSBDTVNHX0RBVEEoY21zZykgKChjbXNnKS0+X19jbXNnX2RhdGEpCisjZWxzZQorIyBkZWZpbmUgQ01TR19EQVRBKGNtc2cpICgodW5zaWduZWQgY2hhciAqKSAoKHN0cnVjdCBjbXNnaGRyICopIChjbXNnKSArIDEpKQorI2VuZGlmCisjZGVmaW5lIENNU0dfTlhUSERSKG1oZHIsIGNtc2cpIF9fY21zZ19ueHRoZHIgKG1oZHIsIGNtc2cpCisjZGVmaW5lIENNU0dfRklSU1RIRFIobWhkcikgXAorICAoKHNpemVfdCkgKG1oZHIpLT5tc2dfY29udHJvbGxlbiA+PSBzaXplb2YgKHN0cnVjdCBjbXNnaGRyKQkJICAgICAgXAorICAgPyAoc3RydWN0IGNtc2doZHIgKikgKG1oZHIpLT5tc2dfY29udHJvbCA6IChzdHJ1Y3QgY21zZ2hkciAqKSAwKQorI2RlZmluZSBDTVNHX0FMSUdOKGxlbikgKCgobGVuKSArIHNpemVvZiAoc2l6ZV90KSAtIDEpIFwKKwkJCSAmIChzaXplX3QpIH4oc2l6ZW9mIChzaXplX3QpIC0gMSkpCisjZGVmaW5lIENNU0dfU1BBQ0UobGVuKSAoQ01TR19BTElHTiAobGVuKSBcCisJCQkgKyBDTVNHX0FMSUdOIChzaXplb2YgKHN0cnVjdCBjbXNnaGRyKSkpCisjZGVmaW5lIENNU0dfTEVOKGxlbikgICAoQ01TR19BTElHTiAoc2l6ZW9mIChzdHJ1Y3QgY21zZ2hkcikpICsgKGxlbikpCisKK2V4dGVybiBzdHJ1Y3QgY21zZ2hkciAqX19jbXNnX254dGhkciAoc3RydWN0IG1zZ2hkciAqX19taGRyLAorCQkJCSAgICAgIHN0cnVjdCBjbXNnaGRyICpfX2Ntc2cpIF9fVEhST1c7CisjaWZkZWYgX19VU0VfRVhURVJOX0lOTElORVMKKyMgaWZuZGVmIF9FWFRFUk5fSU5MSU5FCisjICBkZWZpbmUgX0VYVEVSTl9JTkxJTkUgX19leHRlcm5faW5saW5lCisjIGVuZGlmCitfRVhURVJOX0lOTElORSBzdHJ1Y3QgY21zZ2hkciAqCitfX05USCAoX19jbXNnX254dGhkciAoc3RydWN0IG1zZ2hkciAqX19taGRyLCBzdHJ1Y3QgY21zZ2hkciAqX19jbXNnKSkKK3sKKyAgaWYgKChzaXplX3QpIF9fY21zZy0+Y21zZ19sZW4gPCBzaXplb2YgKHN0cnVjdCBjbXNnaGRyKSkKKyAgICAvKiBUaGUga2VybmVsIGhlYWRlciBkb2VzIHRoaXMgc28gdGhlcmUgbWF5IGJlIGEgcmVhc29uLiAgKi8KKyAgICByZXR1cm4gKHN0cnVjdCBjbXNnaGRyICopIDA7CisKKyAgX19jbXNnID0gKHN0cnVjdCBjbXNnaGRyICopICgodW5zaWduZWQgY2hhciAqKSBfX2Ntc2cKKwkJCSAgICAgICArIENNU0dfQUxJR04gKF9fY21zZy0+Y21zZ19sZW4pKTsKKyAgaWYgKCh1bnNpZ25lZCBjaGFyICopIChfX2Ntc2cgKyAxKSA+ICgodW5zaWduZWQgY2hhciAqKSBfX21oZHItPm1zZ19jb250cm9sCisJCQkJCSsgX19taGRyLT5tc2dfY29udHJvbGxlbikKKyAgICAgIHx8ICgodW5zaWduZWQgY2hhciAqKSBfX2Ntc2cgKyBDTVNHX0FMSUdOIChfX2Ntc2ctPmNtc2dfbGVuKQorCSAgPiAoKHVuc2lnbmVkIGNoYXIgKikgX19taGRyLT5tc2dfY29udHJvbCArIF9fbWhkci0+bXNnX2NvbnRyb2xsZW4pKSkKKyAgICAvKiBObyBtb3JlIGVudHJpZXMuICAqLworICAgIHJldHVybiAoc3RydWN0IGNtc2doZHIgKikgMDsKKyAgcmV0dXJuIF9fY21zZzsKK30KKyNlbmRpZgkvKiBVc2UgYGV4dGVybiBpbmxpbmUnLiAgKi8KKworLyogU29ja2V0IGxldmVsIG1lc3NhZ2UgdHlwZXMuICBUaGlzIG11c3QgbWF0Y2ggdGhlIGRlZmluaXRpb25zIGluCisgICA8bGludXgvc29ja2V0Lmg+LiAgKi8KK2VudW0KKyAgeworICAgIFNDTV9SSUdIVFMgPSAweDAxCQkvKiBUcmFuc2ZlciBmaWxlIGRlc2NyaXB0b3JzLiAgKi8KKyNkZWZpbmUgU0NNX1JJR0hUUyBTQ01fUklHSFRTCisjaWZkZWYgX19VU0VfR05VCisgICAgLCBTQ01fQ1JFREVOVElBTFMgPSAweDAyCS8qIENyZWRlbnRpYWxzIHBhc3NpbmcuICAqLworIyBkZWZpbmUgU0NNX0NSRURFTlRJQUxTIFNDTV9DUkVERU5USUFMUworI2VuZGlmCisgIH07CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFVzZXIgdmlzaWJsZSBzdHJ1Y3R1cmUgZm9yIFNDTV9DUkVERU5USUFMUyBtZXNzYWdlICovCitzdHJ1Y3QgdWNyZWQKK3sKKyAgcGlkX3QgcGlkOwkJCS8qIFBJRCBvZiBzZW5kaW5nIHByb2Nlc3MuICAqLworICB1aWRfdCB1aWQ7CQkJLyogVUlEIG9mIHNlbmRpbmcgcHJvY2Vzcy4gICovCisgIGdpZF90IGdpZDsJCQkvKiBHSUQgb2Ygc2VuZGluZyBwcm9jZXNzLiAgKi8KK307CisjZW5kaWYKKworLyogVWdseSB3b3JrYXJvdW5kIGZvciB1bmNsZWFuIGtlcm5lbCBoZWFkZXJzLiAgKi8KKyNpZiAhZGVmaW5lZCBfX1VTRV9NSVNDICYmICFkZWZpbmVkIF9fVVNFX0dOVQorIyBpZm5kZWYgRklPR0VUT1dOCisjICBkZWZpbmUgX19TWVNfU09DS0VUX0hfdW5kZWZfRklPR0VUT1dOCisjIGVuZGlmCisjIGlmbmRlZiBGSU9TRVRPV04KKyMgIGRlZmluZSBfX1NZU19TT0NLRVRfSF91bmRlZl9GSU9TRVRPV04KKyMgZW5kaWYKKyMgaWZuZGVmIFNJT0NBVE1BUksKKyMgIGRlZmluZSBfX1NZU19TT0NLRVRfSF91bmRlZl9TSU9DQVRNQVJLCisjIGVuZGlmCisjIGlmbmRlZiBTSU9DR1BHUlAKKyMgIGRlZmluZSBfX1NZU19TT0NLRVRfSF91bmRlZl9TSU9DR1BHUlAKKyMgZW5kaWYKKyMgaWZuZGVmIFNJT0NHU1RBTVAKKyMgIGRlZmluZSBfX1NZU19TT0NLRVRfSF91bmRlZl9TSU9DR1NUQU1QCisjIGVuZGlmCisjIGlmbmRlZiBTSU9DR1NUQU1QTlMKKyMgIGRlZmluZSBfX1NZU19TT0NLRVRfSF91bmRlZl9TSU9DR1NUQU1QTlMKKyMgZW5kaWYKKyMgaWZuZGVmIFNJT0NTUEdSUAorIyAgZGVmaW5lIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NTUEdSUAorIyBlbmRpZgorI2VuZGlmCisKKy8qIEdldCBzb2NrZXQgbWFuaXB1bGF0aW9uIHJlbGF0ZWQgaW5mb3JtYXRpb25zIGZyb20ga2VybmVsIGhlYWRlcnMuICAqLworI2luY2x1ZGUgPGFzbS9zb2NrZXQuaD4KKworI2lmICFkZWZpbmVkIF9fVVNFX01JU0MgJiYgIWRlZmluZWQgX19VU0VfR05VCisjIGlmZGVmIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX0ZJT0dFVE9XTgorIyAgdW5kZWYgX19TWVNfU09DS0VUX0hfdW5kZWZfRklPR0VUT1dOCisjICB1bmRlZiBGSU9HRVRPV04KKyMgZW5kaWYKKyMgaWZkZWYgX19TWVNfU09DS0VUX0hfdW5kZWZfRklPU0VUT1dOCisjICB1bmRlZiBfX1NZU19TT0NLRVRfSF91bmRlZl9GSU9TRVRPV04KKyMgIHVuZGVmIEZJT1NFVE9XTgorIyBlbmRpZgorIyBpZmRlZiBfX1NZU19TT0NLRVRfSF91bmRlZl9TSU9DQVRNQVJLCisjICB1bmRlZiBfX1NZU19TT0NLRVRfSF91bmRlZl9TSU9DQVRNQVJLCisjICB1bmRlZiBTSU9DQVRNQVJLCisjIGVuZGlmCisjIGlmZGVmIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NHUEdSUAorIyAgdW5kZWYgX19TWVNfU09DS0VUX0hfdW5kZWZfU0lPQ0dQR1JQCisjICB1bmRlZiBTSU9DR1BHUlAKKyMgZW5kaWYKKyMgaWZkZWYgX19TWVNfU09DS0VUX0hfdW5kZWZfU0lPQ0dTVEFNUAorIyAgdW5kZWYgX19TWVNfU09DS0VUX0hfdW5kZWZfU0lPQ0dTVEFNUAorIyAgdW5kZWYgU0lPQ0dTVEFNUAorIyBlbmRpZgorIyBpZmRlZiBfX1NZU19TT0NLRVRfSF91bmRlZl9TSU9DR1NUQU1QTlMKKyMgIHVuZGVmIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NHU1RBTVBOUworIyAgdW5kZWYgU0lPQ0dTVEFNUE5TCisjIGVuZGlmCisjIGlmZGVmIF9fU1lTX1NPQ0tFVF9IX3VuZGVmX1NJT0NTUEdSUAorIyAgdW5kZWYgX19TWVNfU09DS0VUX0hfdW5kZWZfU0lPQ1NQR1JQCisjICB1bmRlZiBTSU9DU1BHUlAKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBTdHJ1Y3R1cmUgdXNlZCB0byBtYW5pcHVsYXRlIHRoZSBTT19MSU5HRVIgb3B0aW9uLiAgKi8KK3N0cnVjdCBsaW5nZXIKKyAgeworICAgIGludCBsX29ub2ZmOwkJLyogTm9uemVybyB0byBsaW5nZXIgb24gY2xvc2UuICAqLworICAgIGludCBsX2xpbmdlcjsJCS8qIFRpbWUgdG8gbGluZ2VyLiAgKi8KKyAgfTsKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJlY2VpdmUgdXAgdG8gVkxFTiBtZXNzYWdlcyBhcyBkZXNjcmliZWQgYnkgVk1FU1NBR0VTIGZyb20gc29ja2V0IEZELgorICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgLTEgZm9yIGVycm9ycy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHJlY3ZtbXNnIChpbnQgX19mZCwgc3RydWN0IG1tc2doZHIgKl9fdm1lc3NhZ2VzLAorCQkgICAgIHVuc2lnbmVkIGludCBfX3ZsZW4sIGludCBfX2ZsYWdzLAorCQkgICAgIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3Rtbyk7CisKKy8qIFNlbmQgYSBWTEVOIG1lc3NhZ2VzIGFzIGRlc2NyaWJlZCBieSBWTUVTU0FHRVMgdG8gc29ja2V0IEZELgorICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgZGF0YWdyYW1zIHN1Y2Nlc3NmdWxseSB3cml0dGVuIG9yIC0xIGZvciBlcnJvcnMuCitUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgc2VuZG1tc2cgKGludCBfX2ZkLCBzdHJ1Y3QgbW1zZ2hkciAqX192bWVzc2FnZXMsCisJCSAgICAgdW5zaWduZWQgaW50IF9fdmxlbiwgaW50IF9fZmxhZ3MpOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogYml0cy9zb2NrZXQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc29ja2V0Mi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc29ja2V0Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNGNiNDcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zb2NrZXQyLmgKQEAgLTAsMCArMSw3OCBAQAorLyogQ2hlY2tpbmcgbWFjcm9zIGZvciBzb2NrZXQgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU09DS0VUX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc29ja2V0Mi5oPiBkaXJlY3RseTsgdXNlIDxzeXMvc29ja2V0Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKK2V4dGVybiBzc2l6ZV90IF9fcmVjdl9jaGsgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbiwgc2l6ZV90IF9fYnVmbGVuLAorCQkJICAgaW50IF9fZmxhZ3MpOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAoX19yZWN2X2FsaWFzLCAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uLAorCQkJCQkgIGludCBfX2ZsYWdzKSwgcmVjdik7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChfX3JlY3ZfY2hrX3dhcm4sCisJCQkgICAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uLCBzaXplX3QgX19idWZsZW4sCisJCQkgICAgaW50IF9fZmxhZ3MpLCBfX3JlY3ZfY2hrKQorICAgICBfX3dhcm5hdHRyICgicmVjdiBjYWxsZWQgd2l0aCBiaWdnZXIgbGVuZ3RoIHRoYW4gc2l6ZSBvZiBkZXN0aW5hdGlvbiAiCisJCSAiYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgc3NpemVfdAorcmVjdiAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uLCBpbnQgX19mbGFncykKK3sKKyAgaWYgKF9fYm9zMCAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbikpCisJcmV0dXJuIF9fcmVjdl9jaGsgKF9fZmQsIF9fYnVmLCBfX24sIF9fYm9zMCAoX19idWYpLCBfX2ZsYWdzKTsKKworICAgICAgaWYgKF9fbiA+IF9fYm9zMCAoX19idWYpKQorCXJldHVybiBfX3JlY3ZfY2hrX3dhcm4gKF9fZmQsIF9fYnVmLCBfX24sIF9fYm9zMCAoX19idWYpLCBfX2ZsYWdzKTsKKyAgICB9CisgIHJldHVybiBfX3JlY3ZfYWxpYXMgKF9fZmQsIF9fYnVmLCBfX24sIF9fZmxhZ3MpOworfQorCitleHRlcm4gc3NpemVfdCBfX3JlY3Zmcm9tX2NoayAoaW50IF9fZmQsIHZvaWQgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX24sCisJCQkgICAgICAgc2l6ZV90IF9fYnVmbGVuLCBpbnQgX19mbGFncywKKwkJCSAgICAgICBfX1NPQ0tBRERSX0FSRyBfX2FkZHIsCisJCQkgICAgICAgc29ja2xlbl90ICpfX3Jlc3RyaWN0IF9fYWRkcl9sZW4pOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAoX19yZWN2ZnJvbV9hbGlhcywKKwkJCSAgIChpbnQgX19mZCwgdm9pZCAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbiwKKwkJCSAgICBpbnQgX19mbGFncywgX19TT0NLQUREUl9BUkcgX19hZGRyLAorCQkJICAgIHNvY2tsZW5fdCAqX19yZXN0cmljdCBfX2FkZHJfbGVuKSwgcmVjdmZyb20pOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAoX19yZWN2ZnJvbV9jaGtfd2FybiwKKwkJCSAgIChpbnQgX19mZCwgdm9pZCAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbiwKKwkJCSAgICBzaXplX3QgX19idWZsZW4sIGludCBfX2ZsYWdzLAorCQkJICAgIF9fU09DS0FERFJfQVJHIF9fYWRkciwKKwkJCSAgICBzb2NrbGVuX3QgKl9fcmVzdHJpY3QgX19hZGRyX2xlbiksIF9fcmVjdmZyb21fY2hrKQorICAgICBfX3dhcm5hdHRyICgicmVjdmZyb20gY2FsbGVkIHdpdGggYmlnZ2VyIGxlbmd0aCB0aGFuIHNpemUgb2YgIgorCQkgImRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHNzaXplX3QKK3JlY3Zmcm9tIChpbnQgX19mZCwgdm9pZCAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbiwgaW50IF9fZmxhZ3MsCisJICBfX1NPQ0tBRERSX0FSRyBfX2FkZHIsIHNvY2tsZW5fdCAqX19yZXN0cmljdCBfX2FkZHJfbGVuKQoreworICBpZiAoX19ib3MwIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSkKKwlyZXR1cm4gX19yZWN2ZnJvbV9jaGsgKF9fZmQsIF9fYnVmLCBfX24sIF9fYm9zMCAoX19idWYpLCBfX2ZsYWdzLAorCQkJICAgICAgIF9fYWRkciwgX19hZGRyX2xlbik7CisgICAgICBpZiAoX19uID4gX19ib3MwIChfX2J1ZikpCisJcmV0dXJuIF9fcmVjdmZyb21fY2hrX3dhcm4gKF9fZmQsIF9fYnVmLCBfX24sIF9fYm9zMCAoX19idWYpLCBfX2ZsYWdzLAorCQkJCSAgICBfX2FkZHIsIF9fYWRkcl9sZW4pOworICAgIH0KKyAgcmV0dXJuIF9fcmVjdmZyb21fYWxpYXMgKF9fZmQsIF9fYnVmLCBfX24sIF9fZmxhZ3MsIF9fYWRkciwgX19hZGRyX2xlbik7Cit9CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGFiLmRlZiBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0YWIuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNTQ3NzQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGFiLmRlZgpAQCAtMCwwICsxLDIzNCBAQAorLyogVGFibGUgb2YgREJYIHN5bWJvbCBjb2RlcyBmb3IgdGhlIEdOVSBzeXN0ZW0uCisgICBDb3B5cmlnaHQgKEMpIDE5ODgsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIFRoaXMgY29udGFpbnMgY29udHJpYnV0aW9uIGZyb20gQ3lnbnVzIFN1cHBvcnQuICAqLworDAorLyogR2xvYmFsIHZhcmlhYmxlLiAgT25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4KKyAgIFRvIGZpbmQgdGhlIGFkZHJlc3MsIGxvb2sgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZXh0ZXJuYWwgc3ltYm9sLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fR1NZTSwgMHgyMCwgIkdTWU0iKQorCisvKiBGdW5jdGlvbiBuYW1lIGZvciBCU0QgRm9ydHJhbi4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQuCisgICBUbyBmaW5kIHRoZSBhZGRyZXNzLCBsb29rIGluIHRoZSBjb3JyZXNwb25kaW5nIGV4dGVybmFsIHN5bWJvbC4gICovCitfX2RlZmluZV9zdGFiIChOX0ZOQU1FLCAweDIyLCAiRk5BTUUiKQorCisvKiBGdW5jdGlvbiBuYW1lIG9yIHRleHQtc2VnbWVudCB2YXJpYWJsZSBmb3IgQy4gIFZhbHVlIGlzIGl0cyBhZGRyZXNzLgorICAgRGVzYyBpcyBzdXBwb3NlZGx5IHN0YXJ0aW5nIGxpbmUgbnVtYmVyLCBidXQgR0NDIGRvZXNuJ3Qgc2V0IGl0CisgICBhbmQgREJYIHNlZW1zIG5vdCB0byBtaXNzIGl0LiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRlVOLCAweDI0LCAiRlVOIikKKworLyogRGF0YS1zZWdtZW50IHZhcmlhYmxlIHdpdGggaW50ZXJuYWwgbGlua2FnZS4gIFZhbHVlIGlzIGl0cyBhZGRyZXNzLgorICAgIlN0YXRpYyBTeW0iLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fU1RTWU0sIDB4MjYsICJTVFNZTSIpCisKKy8qIEJTUy1zZWdtZW50IHZhcmlhYmxlIHdpdGggaW50ZXJuYWwgbGlua2FnZS4gIFZhbHVlIGlzIGl0cyBhZGRyZXNzLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fTENTWU0sIDB4MjgsICJMQ1NZTSIpCisKKy8qIE5hbWUgb2YgbWFpbiByb3V0aW5lLiAgT25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4KKyAgIFRoaXMgaXMgbm90IHVzZWQgaW4gQy4gICovCitfX2RlZmluZV9zdGFiIChOX01BSU4sIDB4MmEsICJNQUlOIikKKworLyogR2xvYmFsIHN5bWJvbCBpbiBQYXNjYWwuCisgICBTdXBwb3NlZGx5IHRoZSB2YWx1ZSBpcyBpdHMgbGluZSBudW1iZXI7IEknbSBza2VwdGljYWwuICAqLworX19kZWZpbmVfc3RhYiAoTl9QQywgMHgzMCwgIlBDIikKKworLyogTnVtYmVyIG9mIHN5bWJvbHM6ICAwLCBmaWxlcywsZnVuY3MsbGluZXMgYWNjb3JkaW5nIHRvIFVsdHJpeCBWNC4wLiAqLworX19kZWZpbmVfc3RhYiAoTl9OU1lNUywgMHgzMiwgIk5TWU1TIikKKworLyogIk5vIERTVCBtYXAgZm9yIHN5bTogbmFtZSwgLDAsdHlwZSxpZ25vcmVkIiAgYWNjb3JkaW5nIHRvIFVsdHJpeCBWNC4wLiAqLworX19kZWZpbmVfc3RhYiAoTl9OT01BUCwgMHgzNCwgIk5PTUFQIikKKworLyogTmV3IHN0YWIgZnJvbSBTb2xhcmlzLiAgSSBkb24ndCBrbm93IHdoYXQgaXQgbWVhbnMsIGJ1dCBpdAorICAgZG9uJ3Qgc2VlbSB0byBjb250YWluIHVzZWZ1bCBpbmZvcm1hdGlvbi4gICovCitfX2RlZmluZV9zdGFiIChOX09CSiwgMHgzOCwgIk9CSiIpCisKKy8qIE5ldyBzdGFiIGZyb20gU29sYXJpcy4gIEkgZG9uJ3Qga25vdyB3aGF0IGl0IG1lYW5zLCBidXQgaXQKKyAgIGRvbid0IHNlZW0gdG8gY29udGFpbiB1c2VmdWwgaW5mb3JtYXRpb24uICBQb3NzaWJseSByZWxhdGVkIHRvIHRoZQorICAgb3B0aW1pemF0aW9uIGZsYWdzIHVzZWQgaW4gdGhpcyBtb2R1bGUuICAqLworX19kZWZpbmVfc3RhYiAoTl9PUFQsIDB4M2MsICJPUFQiKQorCisvKiBSZWdpc3RlciB2YXJpYWJsZS4gIFZhbHVlIGlzIG51bWJlciBvZiByZWdpc3Rlci4gICovCitfX2RlZmluZV9zdGFiIChOX1JTWU0sIDB4NDAsICJSU1lNIikKKworLyogTW9kdWxhLTIgY29tcGlsYXRpb24gdW5pdC4gIENhbiBzb21lb25lIHNheSB3aGF0IGluZm8gaXQgY29udGFpbnM/ICAqLworX19kZWZpbmVfc3RhYiAoTl9NMkMsIDB4NDIsICJNMkMiKQorCisvKiBMaW5lIG51bWJlciBpbiB0ZXh0IHNlZ21lbnQuICBEZXNjIGlzIHRoZSBsaW5lIG51bWJlcjsKKyAgIHZhbHVlIGlzIGNvcnJlc3BvbmRpbmcgYWRkcmVzcy4gICovCitfX2RlZmluZV9zdGFiIChOX1NMSU5FLCAweDQ0LCAiU0xJTkUiKQorCisvKiBTaW1pbGFyLCBmb3IgZGF0YSBzZWdtZW50LiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRFNMSU5FLCAweDQ2LCAiRFNMSU5FIikKKworLyogU2ltaWxhciwgZm9yIGJzcyBzZWdtZW50LiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fQlNMSU5FLCAweDQ4LCAiQlNMSU5FIikKKworLyogU3VuJ3Mgc291cmNlLWNvZGUgYnJvd3NlciBzdGFicy4gID8/IERvbid0IGtub3cgd2hhdCB0aGUgZmllbGRzIGFyZS4KKyAgIFN1cHBvc2VkbHkgdGhlIGZpZWxkIGlzICJwYXRoIHRvIGFzc29jaWF0ZWQgLmNiIGZpbGUiLiAgVEhJUyBWQUxVRQorICAgT1ZFUkxBUFMgV0lUSCBOX0JTTElORSEgICovCitfX2RlZmluZV9zdGFiIChOX0JST1dTLCAweDQ4LCAiQlJPV1MiKQorCisvKiBHTlUgTW9kdWxhLTIgZGVmaW5pdGlvbiBtb2R1bGUgZGVwZW5kZW5jeS4gIFZhbHVlIGlzIHRoZSBtb2RpZmljYXRpb24gdGltZQorICAgb2YgdGhlIGRlZmluaXRpb24gZmlsZS4gIE90aGVyIGlzIG5vbi16ZXJvIGlmIGl0IGlzIGltcG9ydGVkIHdpdGggdGhlCisgICBHTlUgTTIga2V5d29yZCAlSU5JVElBTElaRS4gIFBlcmhhcHMgTl9NMkMgY2FuIGJlIHVzZWQgaWYgdGhlcmUKKyAgIGFyZSBlbm91Z2ggZW1wdHkgZmllbGRzPyAqLworX19kZWZpbmVfc3RhYihOX0RFRkQsIDB4NGEsICJERUZEIikKKworLyogVEhFIEZPTExPV0lORyBUV08gU1RBQiBWQUxVRVMgQ09ORkxJQ1QuICBIYXBwaWx5LCBvbmUgaXMgZm9yIE1vZHVsYS0yCisgICBhbmQgb25lIGlzIGZvciBDKysuICAgU3RpbGwsLi4uICovCisvKiBHTlUgQysrIGV4Y2VwdGlvbiB2YXJpYWJsZS4gIE5hbWUgaXMgdmFyaWFibGUgbmFtZS4gICovCitfX2RlZmluZV9zdGFiIChOX0VIREVDTCwgMHg1MCwgIkVIREVDTCIpCisvKiBNb2R1bGEyIGluZm8gImZvciBpbWMiOiAgbmFtZSwsMCwwLDAgIGFjY29yZGluZyB0byBVbHRyaXggVjQuMC4gICovCitfX2RlZmluZV9zdGFiIChOX01PRDIsIDB4NTAsICJNT0QyIikKKworLyogR05VIEMrKyBgY2F0Y2gnIGNsYXVzZS4gIFZhbHVlIGlzIGl0cyBhZGRyZXNzLiAgRGVzYyBpcyBub256ZXJvIGlmCisgICB0aGlzIGVudHJ5IGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgQ0FVR0hUIHN0YWIgc2F5aW5nIHdoYXQgZXhjZXB0aW9uCisgICB3YXMgY2F1Z2h0LiAgTXVsdGlwbGUgQ0FVR0hUIHN0YWJzIG1lYW5zIHRoYXQgbXVsdGlwbGUgZXhjZXB0aW9ucworICAgY2FuIGJlIGNhdWdodCBoZXJlLiAgSWYgRGVzYyBpcyAwLCBpdCBtZWFucyBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0CisgICBoZXJlLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fQ0FUQ0gsIDB4NTQsICJDQVRDSCIpCisKKy8qIFN0cnVjdHVyZSBvciB1bmlvbiBlbGVtZW50LiAgVmFsdWUgaXMgb2Zmc2V0IGluIHRoZSBzdHJ1Y3R1cmUuICAqLworX19kZWZpbmVfc3RhYiAoTl9TU1lNLCAweDYwLCAiU1NZTSIpCisKKy8qIE5hbWUgb2YgbWFpbiBzb3VyY2UgZmlsZS4KKyAgIFZhbHVlIGlzIHN0YXJ0aW5nIHRleHQgYWRkcmVzcyBvZiB0aGUgY29tcGlsYXRpb24uICAqLworX19kZWZpbmVfc3RhYiAoTl9TTywgMHg2NCwgIlNPIikKKworLyogQXV0b21hdGljIHZhcmlhYmxlIGluIHRoZSBzdGFjay4gIFZhbHVlIGlzIG9mZnNldCBmcm9tIGZyYW1lIHBvaW50ZXIuCisgICBBbHNvIHVzZWQgZm9yIHR5cGUgZGVzY3JpcHRpb25zLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fTFNZTSwgMHg4MCwgIkxTWU0iKQorCisvKiBCZWdpbm5pbmcgb2YgYW4gaW5jbHVkZSBmaWxlLiAgT25seSBTdW4gdXNlcyB0aGlzLgorICAgSW4gYW4gb2JqZWN0IGZpbGUsIG9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQuCisgICBUaGUgU3VuIGxpbmtlciBwdXRzIGRhdGEgaW50byBzb21lIG9mIHRoZSBvdGhlciBmaWVsZHMuICAqLworX19kZWZpbmVfc3RhYiAoTl9CSU5DTCwgMHg4MiwgIkJJTkNMIikKKworLyogTmFtZSBvZiBzdWItc291cmNlIGZpbGUgKCNpbmNsdWRlIGZpbGUpLgorICAgVmFsdWUgaXMgc3RhcnRpbmcgdGV4dCBhZGRyZXNzIG9mIHRoZSBjb21waWxhdGlvbi4gICovCitfX2RlZmluZV9zdGFiIChOX1NPTCwgMHg4NCwgIlNPTCIpCisKKy8qIFBhcmFtZXRlciB2YXJpYWJsZS4gIFZhbHVlIGlzIG9mZnNldCBmcm9tIGFyZ3VtZW50IHBvaW50ZXIuCisgICAoT24gbW9zdCBtYWNoaW5lcyB0aGUgYXJndW1lbnQgcG9pbnRlciBpcyB0aGUgc2FtZSBhcyB0aGUgZnJhbWUgcG9pbnRlci4gICovCitfX2RlZmluZV9zdGFiIChOX1BTWU0sIDB4YTAsICJQU1lNIikKKworLyogRW5kIG9mIGFuIGluY2x1ZGUgZmlsZS4gIE5vIG5hbWUuCisgICBUaGlzIGFuZCBOX0JJTkNMIGFjdCBhcyBicmFja2V0cyBhcm91bmQgdGhlIGZpbGUncyBvdXRwdXQuCisgICBJbiBhbiBvYmplY3QgZmlsZSwgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgZGF0YSBpbiB0aGlzIGVudHJ5LgorICAgVGhlIFN1biBsaW5rZXIgcHV0cyBkYXRhIGludG8gc29tZSBvZiB0aGUgZmllbGRzLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRUlOQ0wsIDB4YTIsICJFSU5DTCIpCisKKy8qIEFsdGVybmF0ZSBlbnRyeSBwb2ludC4gIFZhbHVlIGlzIGl0cyBhZGRyZXNzLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRU5UUlksIDB4YTQsICJFTlRSWSIpCisKKy8qIEJlZ2lubmluZyBvZiBsZXhpY2FsIGJsb2NrLgorICAgVGhlIGRlc2MgaXMgdGhlIG5lc3RpbmcgbGV2ZWwgaW4gbGV4aWNhbCBibG9ja3MuCisgICBUaGUgdmFsdWUgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IGZvciB0aGUgYmxvY2suCisgICBUaGUgdmFyaWFibGVzIGRlY2xhcmVkIGluc2lkZSB0aGUgYmxvY2sgKnByZWNlZGUqIHRoZSBOX0xCUkFDIHN5bWJvbC4gICovCitfX2RlZmluZV9zdGFiIChOX0xCUkFDLCAweGMwLCAiTEJSQUMiKQorCisvKiBQbGFjZSBob2xkZXIgZm9yIGRlbGV0ZWQgaW5jbHVkZSBmaWxlLiAgUmVwbGFjZXMgYSBOX0JJTkNMIGFuZCBldmVyeXRoaW5nCisgICB1cCB0byB0aGUgY29ycmVzcG9uZGluZyBOX0VJTkNMLiAgVGhlIFN1biBsaW5rZXIgZ2VuZXJhdGVzIHRoZXNlIHdoZW4KKyAgIGl0IGZpbmRzIG11bHRpcGxlIGlkZW50aWNhbCBjb3BpZXMgb2YgdGhlIHN5bWJvbHMgZnJvbSBhbiBpbmNsdWRlIGZpbGUuCisgICBUaGlzIGFwcGVhcnMgb25seSBpbiBvdXRwdXQgZnJvbSB0aGUgU3VuIGxpbmtlci4gICovCitfX2RlZmluZV9zdGFiIChOX0VYQ0wsIDB4YzIsICJFWENMIikKKworLyogTW9kdWxhLTIgc2NvcGUgaW5mb3JtYXRpb24uICBDYW4gc29tZW9uZSBzYXkgd2hhdCBpbmZvIGl0IGNvbnRhaW5zPyAgKi8KK19fZGVmaW5lX3N0YWIgKE5fU0NPUEUsIDB4YzQsICJTQ09QRSIpCisKKy8qIEVuZCBvZiBhIGxleGljYWwgYmxvY2suICBEZXNjIG1hdGNoZXMgdGhlIE5fTEJSQUMncyBkZXNjLgorICAgVGhlIHZhbHVlIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlIHRleHQgZm9yIHRoZSBibG9jay4gICovCitfX2RlZmluZV9zdGFiIChOX1JCUkFDLCAweGUwLCAiUkJSQUMiKQorCisvKiBCZWdpbiBuYW1lZCBjb21tb24gYmxvY2suICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fQkNPTU0sIDB4ZTIsICJCQ09NTSIpCisKKy8qIEVuZCBuYW1lZCBjb21tb24gYmxvY2suICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50CisgICAoYW5kIGl0IHNob3VsZCBtYXRjaCB0aGUgTl9CQ09NTSkuICAqLworX19kZWZpbmVfc3RhYiAoTl9FQ09NTSwgMHhlNCwgIkVDT01NIikKKworLyogRW5kIGNvbW1vbiAobG9jYWwgbmFtZSk6IHZhbHVlIGlzIGFkZHJlc3MuCisgICBJJ20gbm90IHN1cmUgaG93IHRoaXMgaXMgdXNlZC4gICovCitfX2RlZmluZV9zdGFiIChOX0VDT01MLCAweGU4LCAiRUNPTUwiKQorCisvKiBUaGVzZSBTVEFCJ3MgYXJlIHVzZWQgb24gR291bGQgc3lzdGVtcyBmb3IgTm9uLUJhc2UgcmVnaXN0ZXIgc3ltYm9scworICAgb3Igc29tZXRoaW5nIGxpa2UgdGhhdC4gIEZJWE1FLiAgSSBoYXZlIGFzc2lnbmVkIHRoZSB2YWx1ZXMgYXQgcmFuZG9tCisgICBzaW5jZSBJIGRvbid0IGhhdmUgYSBHb3VsZCBoZXJlLiAgRml4dXBzIGZyb20gR291bGQgZm9sayB3ZWxjb21lLi4uICovCitfX2RlZmluZV9zdGFiIChOX05CVEVYVCwgMHhGMCwgIk5CVEVYVCIpCitfX2RlZmluZV9zdGFiIChOX05CREFUQSwgMHhGMiwgIk5CREFUQSIpCitfX2RlZmluZV9zdGFiIChOX05CQlNTLCAgMHhGNCwgIk5CQlNTIikKK19fZGVmaW5lX3N0YWIgKE5fTkJTVFMsICAweEY2LCAiTkJTVFMiKQorX19kZWZpbmVfc3RhYiAoTl9OQkxDUywgIDB4RjgsICJOQkxDUyIpCisKKy8qIFNlY29uZCBzeW1ib2wgZW50cnkgY29udGFpbmluZyBhIGxlbmd0aC12YWx1ZSBmb3IgdGhlIHByZWNlZGluZyBlbnRyeS4KKyAgIFRoZSB2YWx1ZSBpcyB0aGUgbGVuZ3RoLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fTEVORywgMHhmZSwgIkxFTkciKQorDAorLyogVGhlIGFib3ZlIGluZm9ybWF0aW9uLCBpbiBtYXRyaXggZm9ybWF0LgorCisJCQlTVEFCIE1BVFJJWAorCV9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKwl8IDAwIC0gMUYgYXJlIG5vdCBkYnggc3RhYiBzeW1ib2xzCQl8CisJfCBJbiBtb3N0IGNhc2VzLCB0aGUgbG93IGJpdCBpcyB0aGUgRVhUZXJuYWwgYml0fAorCisJfCAwMCBVTkRFRiAgfCAwMiBBQlMJfCAwNCBURVhUICAgfCAwNiBEQVRBCXwKKwl8IDAxICB8RVhUICB8IDAzICB8RVhUCXwgMDUgIHxFWFQgIHwgMDcgIHxFWFQJfAorCisJfCAwOCBCU1MgICAgfCAwQSBJTkRSCXwgMEMgRk5fU0VRIHwgMEUgICAJfAorCXwgMDkgIHxFWFQgIHwgMEIgCXwgMEQJICAgIHwgMEYJfAorCisJfCAxMCAJICAgIHwgMTIgQ09NTQl8IDE0IFNFVEEgICB8IDE2IFNFVFQJfAorCXwgMTEJICAgIHwgMTMJfCAxNSAJICAgIHwgMTcJfAorCisJfCAxOCBTRVREICAgfCAxQSBTRVRCCXwgMUMgU0VUViAgIHwgMUUgV0FSTklOR3wKKwl8IDE5CSAgICB8IDFCCXwgMUQgCSAgICB8IDFGIEZOCXwKKworCXxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKwl8IERlYnVnIGVudHJpZXMgd2l0aCBiaXQgMDEgc2V0IGFyZSB1bnVzZWQuCXwKKwl8IDIwIEdTWU0gICB8IDIyIEZOQU1FCXwgMjQgRlVOICAgIHwgMjYgU1RTWU0JfAorCXwgMjggTENTWU0gIHwgMkEgTUFJTgl8IDJDCSAgICB8IDJFCXwKKwl8IDMwIFBDCSAgICB8IDMyIE5TWU1TCXwgMzQgTk9NQVAgIHwgMzYJfAorCXwgMzggT0JKICAgIHwgM0EJfCAzQyBPUFQgICAgfCAzRQl8CisJfCA0MCBSU1lNICAgfCA0MiBNMkMJfCA0NCBTTElORSAgfCA0NiBEU0xJTkUgfAorCXwgNDggQlNMSU5FKnwgNEEgREVGRAl8IDRDICAgICAgICB8IDRFCXwKKwl8IDUwIEVIREVDTCp8IDUyCXwgNTQgQ0FUQ0ggIHwgNTYgICAgICAgIHwKKwl8IDU4ICAgICAgICB8IDVBICAgICAgICB8IDVDICAgICAgICB8IDVFCXwKKwl8IDYwIFNTWU0gICB8IDYyCXwgNjQgU08JICAgIHwgNjYgCXwKKwl8IDY4IAkgICAgfCA2QQl8IDZDCSAgICB8IDZFCXwKKwl8IDcwCSAgICB8IDcyCXwgNzQJICAgIHwgNzYJfAorCXwgNzgJICAgIHwgN0EJfCA3QwkgICAgfCA3RQl8CisJfCA4MCBMU1lNICAgfCA4MiBCSU5DTAl8IDg0IFNPTCAgICB8IDg2CXwKKwl8IDg4CSAgICB8IDhBCXwgOEMJICAgIHwgOEUJfAorCXwgOTAJICAgIHwgOTIJfCA5NAkgICAgfCA5Ngl8CisJfCA5OAkgICAgfCA5QQl8IDlDCSAgICB8IDlFCXwKKwl8IEEwIFBTWU0gICB8IEEyIEVJTkNMCXwgQTQgRU5UUlkgIHwgQTYJfAorCXwgQTgJICAgIHwgQUEJfCBBQwkgICAgfCBBRQl8CisJfCBCMAkgICAgfCBCMgl8IEI0CSAgICB8IEI2CXwKKwl8IEI4CSAgICB8IEJBCXwgQkMJICAgIHwgQkUJfAorCXwgQzAgTEJSQUMgIHwgQzIgRVhDTAl8IEM0IFNDT1BFICB8IEM2CXwKKwl8IEM4CSAgICB8IENBCXwgQ0MJICAgIHwgQ0UJfAorCXwgRDAJICAgIHwgRDIJfCBENAkgICAgfCBENgl8CisJfCBEOAkgICAgfCBEQQl8IERDCSAgICB8IERFCXwKKwl8IEUwIFJCUkFDICB8IEUyIEJDT01NCXwgRTQgRUNPTU0gIHwgRTYJfAorCXwgRTggRUNPTUwgIHwgRUEJfCBFQwkgICAgfCBFRQl8CisJfCBGMAkgICAgfCBGMgl8IEY0CSAgICB8IEY2CXwKKwl8IEY4CSAgICB8IEZBCXwgRkMJICAgIHwgRkUgTEVORwl8CisJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogNTAgRUhERUNMIGlzIGFsc28gTU9EMi4KKyAqIDQ4IEJTTElORSBpcyBhbHNvIEJST1dTLgorICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGF0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlNGUxZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0YXQuaApAQCAtMCwwICsxLDIxMyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDMsMjAwOSwyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWYgIWRlZmluZWQgX1NZU19TVEFUX0ggJiYgIWRlZmluZWQgX0ZDTlRMX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3RhdC5oPiBkaXJlY3RseTsgdXNlIDxzeXMvc3RhdC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9CSVRTX1NUQVRfSAorI2RlZmluZSBfQklUU19TVEFUX0gJMQorCisvKiBWZXJzaW9ucyBvZiB0aGUgYHN0cnVjdCBzdGF0JyBkYXRhIHN0cnVjdHVyZS4gICovCisjZGVmaW5lIF9TVEFUX1ZFUl9LRVJORUwJMAorCisjaWYgX19XT1JEU0laRSA9PSAzMgorIyBkZWZpbmUgX1NUQVRfVkVSX1NWUjQJCTIKKyMgZGVmaW5lIF9TVEFUX1ZFUl9MSU5VWAkzCisKKy8qIGkzODYgdmVyc2lvbnMgb2YgdGhlIGB4bWtub2QnIGludGVyZmFjZS4gICovCisjIGRlZmluZSBfTUtOT0RfVkVSX0xJTlVYCTEKKyMgZGVmaW5lIF9NS05PRF9WRVJfU1ZSNAkyCisjIGRlZmluZSBfTUtOT0RfVkVSCQlfTUtOT0RfVkVSX0xJTlVYIC8qIFRoZSBiaXRzIGRlZmluZWQgYmVsb3cuICAqLworI2Vsc2UKKyMgZGVmaW5lIF9TVEFUX1ZFUl9MSU5VWAkxCisKKy8qIHg4Ni02NCB2ZXJzaW9ucyBvZiB0aGUgYHhta25vZCcgaW50ZXJmYWNlLiAgKi8KKyMgZGVmaW5lIF9NS05PRF9WRVJfTElOVVgJMAorI2VuZGlmCisKKyNkZWZpbmUgX1NUQVRfVkVSCQlfU1RBVF9WRVJfTElOVVgKKworc3RydWN0IHN0YXQKKyAgeworICAgIF9fZGV2X3Qgc3RfZGV2OwkJLyogRGV2aWNlLiAgKi8KKyNpZiBfX1dPUkRTSVpFID09IDMyCisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fcGFkMTsKKyNlbmRpZgorI2lmIF9fV09SRFNJWkUgPT0gNjQgfHwgIWRlZmluZWQgX19VU0VfRklMRV9PRkZTRVQ2NAorICAgIF9faW5vX3Qgc3RfaW5vOwkJLyogRmlsZSBzZXJpYWwgbnVtYmVyLgkqLworI2Vsc2UKKyAgICBfX2lub190IF9fc3RfaW5vOwkJCS8qIDMyYml0IGZpbGUgc2VyaWFsIG51bWJlci4JKi8KKyNlbmRpZgorI2lmIF9fV09SRFNJWkUgPT0gMzIKKyAgICBfX21vZGVfdCBzdF9tb2RlOwkJCS8qIEZpbGUgbW9kZS4gICovCisgICAgX19ubGlua190IHN0X25saW5rOwkJCS8qIExpbmsgY291bnQuICAqLworI2Vsc2UKKyAgICBfX25saW5rX3Qgc3Rfbmxpbms7CQkvKiBMaW5rIGNvdW50LiAgKi8KKyAgICBfX21vZGVfdCBzdF9tb2RlOwkJLyogRmlsZSBtb2RlLiAgKi8KKyNlbmRpZgorICAgIF9fdWlkX3Qgc3RfdWlkOwkJLyogVXNlciBJRCBvZiB0aGUgZmlsZSdzIG93bmVyLgkqLworICAgIF9fZ2lkX3Qgc3RfZ2lkOwkJLyogR3JvdXAgSUQgb2YgdGhlIGZpbGUncyBncm91cC4qLworI2lmIF9fV09SRFNJWkUgPT0gNjQKKyAgICBpbnQgX19wYWQwOworI2VuZGlmCisgICAgX19kZXZfdCBzdF9yZGV2OwkJLyogRGV2aWNlIG51bWJlciwgaWYgZGV2aWNlLiAgKi8KKyNpZiBfX1dPUkRTSVpFID09IDMyCisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fcGFkMjsKKyNlbmRpZgorI2lmIF9fV09SRFNJWkUgPT0gNjQgfHwgIWRlZmluZWQgX19VU0VfRklMRV9PRkZTRVQ2NAorICAgIF9fb2ZmX3Qgc3Rfc2l6ZTsJCQkvKiBTaXplIG9mIGZpbGUsIGluIGJ5dGVzLiAgKi8KKyNlbHNlCisgICAgX19vZmY2NF90IHN0X3NpemU7CQkJLyogU2l6ZSBvZiBmaWxlLCBpbiBieXRlcy4gICovCisjZW5kaWYKKyAgICBfX2Jsa3NpemVfdCBzdF9ibGtzaXplOwkvKiBPcHRpbWFsIGJsb2NrIHNpemUgZm9yIEkvTy4gICovCisjaWYgX19XT1JEU0laRSA9PSA2NCB8fCAhZGVmaW5lZCBfX1VTRV9GSUxFX09GRlNFVDY0CisgICAgX19ibGtjbnRfdCBzdF9ibG9ja3M7CQkvKiBOdW1iZXIgNTEyLWJ5dGUgYmxvY2tzIGFsbG9jYXRlZC4gKi8KKyNlbHNlCisgICAgX19ibGtjbnQ2NF90IHN0X2Jsb2NrczsJCS8qIE51bWJlciA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAqLworI2VuZGlmCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKyAgICAvKiBOYW5vc2Vjb25kIHJlc29sdXRpb24gdGltZXN0YW1wcyBhcmUgc3RvcmVkIGluIGEgZm9ybWF0CisgICAgICAgZXF1aXZhbGVudCB0byAnc3RydWN0IHRpbWVzcGVjJy4gIFRoaXMgaXMgdGhlIHR5cGUgdXNlZAorICAgICAgIHdoZW5ldmVyIHBvc3NpYmxlIGJ1dCB0aGUgVW5peCBuYW1lc3BhY2UgcnVsZXMgZG8gbm90IGFsbG93IHRoZQorICAgICAgIGlkZW50aWZpZXIgJ3RpbWVzcGVjJyB0byBhcHBlYXIgaW4gdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIuCisgICAgICAgVGhlcmVmb3JlIHdlIGhhdmUgdG8gaGFuZGxlIHRoZSB1c2Ugb2YgdGhpcyBoZWFkZXIgaW4gc3RyaWN0bHkKKyAgICAgICBzdGFuZGFyZC1jb21wbGlhbnQgc291cmNlcyBzcGVjaWFsLiAgKi8KKyAgICBzdHJ1Y3QgdGltZXNwZWMgc3RfYXRpbTsJCS8qIFRpbWUgb2YgbGFzdCBhY2Nlc3MuICAqLworICAgIHN0cnVjdCB0aW1lc3BlYyBzdF9tdGltOwkJLyogVGltZSBvZiBsYXN0IG1vZGlmaWNhdGlvbi4gICovCisgICAgc3RydWN0IHRpbWVzcGVjIHN0X2N0aW07CQkvKiBUaW1lIG9mIGxhc3Qgc3RhdHVzIGNoYW5nZS4gICovCisjIGRlZmluZSBzdF9hdGltZSBzdF9hdGltLnR2X3NlYwkvKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgKi8KKyMgZGVmaW5lIHN0X210aW1lIHN0X210aW0udHZfc2VjCisjIGRlZmluZSBzdF9jdGltZSBzdF9jdGltLnR2X3NlYworI2Vsc2UKKyAgICBfX3RpbWVfdCBzdF9hdGltZTsJCQkvKiBUaW1lIG9mIGxhc3QgYWNjZXNzLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBzdF9hdGltZW5zZWM7CS8qIE5zY2VjcyBvZiBsYXN0IGFjY2Vzcy4gICovCisgICAgX190aW1lX3Qgc3RfbXRpbWU7CQkJLyogVGltZSBvZiBsYXN0IG1vZGlmaWNhdGlvbi4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgc3RfbXRpbWVuc2VjOwkvKiBOc2VjcyBvZiBsYXN0IG1vZGlmaWNhdGlvbi4gICovCisgICAgX190aW1lX3Qgc3RfY3RpbWU7CQkJLyogVGltZSBvZiBsYXN0IHN0YXR1cyBjaGFuZ2UuICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHN0X2N0aW1lbnNlYzsJLyogTnNlY3Mgb2YgbGFzdCBzdGF0dXMgY2hhbmdlLiAgKi8KKyNlbmRpZgorI2lmIF9fV09SRFNJWkUgPT0gNjQKKyAgICBsb25nIGludCBfX3VudXNlZFszXTsKKyNlbHNlCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQ0OworICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkNTsKKyMgZWxzZQorICAgIF9faW5vNjRfdCBzdF9pbm87CQkJLyogRmlsZSBzZXJpYWwgbnVtYmVyLgkqLworIyBlbmRpZgorI2VuZGlmCisgIH07CisKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorLyogTm90ZSBzdGF0NjQgaGFzIHRoZSBzYW1lIHNoYXBlIGFzIHN0YXQgZm9yIHg4Ni02NC4gICovCitzdHJ1Y3Qgc3RhdDY0CisgIHsKKyAgICBfX2Rldl90IHN0X2RldjsJCS8qIERldmljZS4gICovCisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyAgICBfX2lubzY0X3Qgc3RfaW5vOwkJLyogRmlsZSBzZXJpYWwgbnVtYmVyLiAgKi8KKyAgICBfX25saW5rX3Qgc3Rfbmxpbms7CQkvKiBMaW5rIGNvdW50LiAgKi8KKyAgICBfX21vZGVfdCBzdF9tb2RlOwkJLyogRmlsZSBtb2RlLiAgKi8KKyMgZWxzZQorICAgIHVuc2lnbmVkIGludCBfX3BhZDE7CisgICAgX19pbm9fdCBfX3N0X2lubzsJCQkvKiAzMmJpdCBmaWxlIHNlcmlhbCBudW1iZXIuCSovCisgICAgX19tb2RlX3Qgc3RfbW9kZTsJCQkvKiBGaWxlIG1vZGUuICAqLworICAgIF9fbmxpbmtfdCBzdF9ubGluazsJCQkvKiBMaW5rIGNvdW50LiAgKi8KKyMgZW5kaWYKKyAgICBfX3VpZF90IHN0X3VpZDsJCS8qIFVzZXIgSUQgb2YgdGhlIGZpbGUncyBvd25lci4JKi8KKyAgICBfX2dpZF90IHN0X2dpZDsJCS8qIEdyb3VwIElEIG9mIHRoZSBmaWxlJ3MgZ3JvdXAuKi8KKyMgaWYgX19XT1JEU0laRSA9PSA2NAorICAgIGludCBfX3BhZDA7CisgICAgX19kZXZfdCBzdF9yZGV2OwkJLyogRGV2aWNlIG51bWJlciwgaWYgZGV2aWNlLiAgKi8KKyAgICBfX29mZl90IHN0X3NpemU7CQkvKiBTaXplIG9mIGZpbGUsIGluIGJ5dGVzLiAgKi8KKyMgZWxzZQorICAgIF9fZGV2X3Qgc3RfcmRldjsJCQkvKiBEZXZpY2UgbnVtYmVyLCBpZiBkZXZpY2UuICAqLworICAgIHVuc2lnbmVkIGludCBfX3BhZDI7CisgICAgX19vZmY2NF90IHN0X3NpemU7CQkJLyogU2l6ZSBvZiBmaWxlLCBpbiBieXRlcy4gICovCisjIGVuZGlmCisgICAgX19ibGtzaXplX3Qgc3RfYmxrc2l6ZTsJLyogT3B0aW1hbCBibG9jayBzaXplIGZvciBJL08uICAqLworICAgIF9fYmxrY250NjRfdCBzdF9ibG9ja3M7CS8qIE5yLiA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAgKi8KKyMgaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySzgKKyAgICAvKiBOYW5vc2Vjb25kIHJlc29sdXRpb24gdGltZXN0YW1wcyBhcmUgc3RvcmVkIGluIGEgZm9ybWF0CisgICAgICAgZXF1aXZhbGVudCB0byAnc3RydWN0IHRpbWVzcGVjJy4gIFRoaXMgaXMgdGhlIHR5cGUgdXNlZAorICAgICAgIHdoZW5ldmVyIHBvc3NpYmxlIGJ1dCB0aGUgVW5peCBuYW1lc3BhY2UgcnVsZXMgZG8gbm90IGFsbG93IHRoZQorICAgICAgIGlkZW50aWZpZXIgJ3RpbWVzcGVjJyB0byBhcHBlYXIgaW4gdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIuCisgICAgICAgVGhlcmVmb3JlIHdlIGhhdmUgdG8gaGFuZGxlIHRoZSB1c2Ugb2YgdGhpcyBoZWFkZXIgaW4gc3RyaWN0bHkKKyAgICAgICBzdGFuZGFyZC1jb21wbGlhbnQgc291cmNlcyBzcGVjaWFsLiAgKi8KKyAgICBzdHJ1Y3QgdGltZXNwZWMgc3RfYXRpbTsJCS8qIFRpbWUgb2YgbGFzdCBhY2Nlc3MuICAqLworICAgIHN0cnVjdCB0aW1lc3BlYyBzdF9tdGltOwkJLyogVGltZSBvZiBsYXN0IG1vZGlmaWNhdGlvbi4gICovCisgICAgc3RydWN0IHRpbWVzcGVjIHN0X2N0aW07CQkvKiBUaW1lIG9mIGxhc3Qgc3RhdHVzIGNoYW5nZS4gICovCisjICBkZWZpbmUgc3RfYXRpbWUgc3RfYXRpbS50dl9zZWMJLyogQmFja3dhcmQgY29tcGF0aWJpbGl0eS4gICovCisjICBkZWZpbmUgc3RfbXRpbWUgc3RfbXRpbS50dl9zZWMKKyMgIGRlZmluZSBzdF9jdGltZSBzdF9jdGltLnR2X3NlYworIyBlbHNlCisgICAgX190aW1lX3Qgc3RfYXRpbWU7CQkJLyogVGltZSBvZiBsYXN0IGFjY2Vzcy4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgc3RfYXRpbWVuc2VjOwkvKiBOc2NlY3Mgb2YgbGFzdCBhY2Nlc3MuICAqLworICAgIF9fdGltZV90IHN0X210aW1lOwkJCS8qIFRpbWUgb2YgbGFzdCBtb2RpZmljYXRpb24uICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHN0X210aW1lbnNlYzsJLyogTnNlY3Mgb2YgbGFzdCBtb2RpZmljYXRpb24uICAqLworICAgIF9fdGltZV90IHN0X2N0aW1lOwkJCS8qIFRpbWUgb2YgbGFzdCBzdGF0dXMgY2hhbmdlLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBzdF9jdGltZW5zZWM7CS8qIE5zZWNzIG9mIGxhc3Qgc3RhdHVzIGNoYW5nZS4gICovCisjIGVuZGlmCisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyAgICBsb25nIGludCBfX3VudXNlZFszXTsKKyMgZWxzZQorICAgIF9faW5vNjRfdCBzdF9pbm87CQkJLyogRmlsZSBzZXJpYWwgbnVtYmVyLgkJKi8KKyMgZW5kaWYKKyAgfTsKKyNlbmRpZgorCisvKiBUZWxsIGNvZGUgd2UgaGF2ZSB0aGVzZSBtZW1iZXJzLiAgKi8KKyNkZWZpbmUJX1NUQVRCVUZfU1RfQkxLU0laRQorI2RlZmluZSBfU1RBVEJVRl9TVF9SREVWCisvKiBOYW5vc2Vjb25kIHJlc29sdXRpb24gdGltZSB2YWx1ZXMgYXJlIHN1cHBvcnRlZC4gICovCisjZGVmaW5lIF9TVEFUQlVGX1NUX05TRUMKKworLyogRW5jb2Rpbmcgb2YgdGhlIGZpbGUgbW9kZS4gICovCisKKyNkZWZpbmUJX19TX0lGTVQJMDE3MDAwMAkvKiBUaGVzZSBiaXRzIGRldGVybWluZSBmaWxlIHR5cGUuICAqLworCisvKiBGaWxlIHR5cGVzLiAgKi8KKyNkZWZpbmUJX19TX0lGRElSCTAwNDAwMDAJLyogRGlyZWN0b3J5LiAgKi8KKyNkZWZpbmUJX19TX0lGQ0hSCTAwMjAwMDAJLyogQ2hhcmFjdGVyIGRldmljZS4gICovCisjZGVmaW5lCV9fU19JRkJMSwkwMDYwMDAwCS8qIEJsb2NrIGRldmljZS4gICovCisjZGVmaW5lCV9fU19JRlJFRwkwMTAwMDAwCS8qIFJlZ3VsYXIgZmlsZS4gICovCisjZGVmaW5lCV9fU19JRklGTwkwMDEwMDAwCS8qIEZJRk8uICAqLworI2RlZmluZQlfX1NfSUZMTksJMDEyMDAwMAkvKiBTeW1ib2xpYyBsaW5rLiAgKi8KKyNkZWZpbmUJX19TX0lGU09DSwkwMTQwMDAwCS8qIFNvY2tldC4gICovCisKKy8qIFBPU0lYLjFiIG9iamVjdHMuICBOb3RlIHRoYXQgdGhlc2UgbWFjcm9zIGFsd2F5cyBldmFsdWF0ZSB0byB6ZXJvLiAgQnV0CisgICB0aGV5IGRvIGl0IGJ5IGVuZm9yY2luZyB0aGUgY29ycmVjdCB1c2Ugb2YgdGhlIG1hY3Jvcy4gICovCisjZGVmaW5lIF9fU19UWVBFSVNNUShidWYpICAoKGJ1ZiktPnN0X21vZGUgLSAoYnVmKS0+c3RfbW9kZSkKKyNkZWZpbmUgX19TX1RZUEVJU1NFTShidWYpICgoYnVmKS0+c3RfbW9kZSAtIChidWYpLT5zdF9tb2RlKQorI2RlZmluZSBfX1NfVFlQRUlTU0hNKGJ1ZikgKChidWYpLT5zdF9tb2RlIC0gKGJ1ZiktPnN0X21vZGUpCisKKy8qIFByb3RlY3Rpb24gYml0cy4gICovCisKKyNkZWZpbmUJX19TX0lTVUlECTA0MDAwCS8qIFNldCB1c2VyIElEIG9uIGV4ZWN1dGlvbi4gICovCisjZGVmaW5lCV9fU19JU0dJRAkwMjAwMAkvKiBTZXQgZ3JvdXAgSUQgb24gZXhlY3V0aW9uLiAgKi8KKyNkZWZpbmUJX19TX0lTVlRYCTAxMDAwCS8qIFNhdmUgc3dhcHBlZCB0ZXh0IGFmdGVyIHVzZSAoc3RpY2t5KS4gICovCisjZGVmaW5lCV9fU19JUkVBRAkwNDAwCS8qIFJlYWQgYnkgb3duZXIuICAqLworI2RlZmluZQlfX1NfSVdSSVRFCTAyMDAJLyogV3JpdGUgYnkgb3duZXIuICAqLworI2RlZmluZQlfX1NfSUVYRUMJMDEwMAkvKiBFeGVjdXRlIGJ5IG93bmVyLiAgKi8KKworI2lmZGVmIF9fVVNFX0FURklMRQorIyBkZWZpbmUgVVRJTUVfTk9XCSgoMWwgPDwgMzApIC0gMWwpCisjIGRlZmluZSBVVElNRV9PTUlUCSgoMWwgPDwgMzApIC0gMmwpCisjZW5kaWYKKworI2VuZGlmCS8qIGJpdHMvc3RhdC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGF0ZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0YXRmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZDkwZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGF0ZnMuaApAQCAtMCwwICsxLDcwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwyMDAwLDIwMDIsMjAwMywyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU1RBVEZTX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3RhdGZzLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zdGF0ZnMuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworc3RydWN0IHN0YXRmcworICB7CisgICAgX19TV09SRF9UWVBFIGZfdHlwZTsKKyAgICBfX1NXT1JEX1RZUEUgZl9ic2l6ZTsKKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorICAgIF9fZnNibGtjbnRfdCBmX2Jsb2NrczsKKyAgICBfX2ZzYmxrY250X3QgZl9iZnJlZTsKKyAgICBfX2ZzYmxrY250X3QgZl9iYXZhaWw7CisgICAgX19mc2ZpbGNudF90IGZfZmlsZXM7CisgICAgX19mc2ZpbGNudF90IGZfZmZyZWU7CisjZWxzZQorICAgIF9fZnNibGtjbnQ2NF90IGZfYmxvY2tzOworICAgIF9fZnNibGtjbnQ2NF90IGZfYmZyZWU7CisgICAgX19mc2Jsa2NudDY0X3QgZl9iYXZhaWw7CisgICAgX19mc2ZpbGNudDY0X3QgZl9maWxlczsKKyAgICBfX2ZzZmlsY250NjRfdCBmX2ZmcmVlOworI2VuZGlmCisgICAgX19mc2lkX3QgZl9mc2lkOworICAgIF9fU1dPUkRfVFlQRSBmX25hbWVsZW47CisgICAgX19TV09SRF9UWVBFIGZfZnJzaXplOworICAgIF9fU1dPUkRfVFlQRSBmX2ZsYWdzOworICAgIF9fU1dPUkRfVFlQRSBmX3NwYXJlWzRdOworICB9OworCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK3N0cnVjdCBzdGF0ZnM2NAorICB7CisgICAgX19TV09SRF9UWVBFIGZfdHlwZTsKKyAgICBfX1NXT1JEX1RZUEUgZl9ic2l6ZTsKKyAgICBfX2ZzYmxrY250NjRfdCBmX2Jsb2NrczsKKyAgICBfX2ZzYmxrY250NjRfdCBmX2JmcmVlOworICAgIF9fZnNibGtjbnQ2NF90IGZfYmF2YWlsOworICAgIF9fZnNmaWxjbnQ2NF90IGZfZmlsZXM7CisgICAgX19mc2ZpbGNudDY0X3QgZl9mZnJlZTsKKyAgICBfX2ZzaWRfdCBmX2ZzaWQ7CisgICAgX19TV09SRF9UWVBFIGZfbmFtZWxlbjsKKyAgICBfX1NXT1JEX1RZUEUgZl9mcnNpemU7CisgICAgX19TV09SRF9UWVBFIGZfZmxhZ3M7CisgICAgX19TV09SRF9UWVBFIGZfc3BhcmVbNF07CisgIH07CisjZW5kaWYKKworLyogVGVsbCBjb2RlIHdlIGhhdmUgdGhlc2UgbWVtYmVycy4gICovCisjZGVmaW5lIF9TVEFURlNfRl9OQU1FTEVOCisjZGVmaW5lIF9TVEFURlNfRl9GUlNJWkUKKyNkZWZpbmUgX1NUQVRGU19GX0ZMQUdTCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGF0dmZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGF0dmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3MTdjMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0YXR2ZnMuaApAQCAtMCwwICsxLDEwOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LDE5OTgsMjAwMCwyMDAxLDIwMDIsMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NUQVRWRlNfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zdGF0dmZzLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zdGF0dmZzLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+ICAvKiBGb3IgX19mc2Jsa2NudF90IGFuZCBfX2ZzZmlsY250X3QuICAqLworCisjaWYgX19XT1JEU0laRSA9PSAzMgorI2RlZmluZSBfU1RBVFZGU0JVRl9GX1VOVVNFRAorI2VuZGlmCisKK3N0cnVjdCBzdGF0dmZzCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCBmX2JzaXplOworICAgIHVuc2lnbmVkIGxvbmcgaW50IGZfZnJzaXplOworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisgICAgX19mc2Jsa2NudF90IGZfYmxvY2tzOworICAgIF9fZnNibGtjbnRfdCBmX2JmcmVlOworICAgIF9fZnNibGtjbnRfdCBmX2JhdmFpbDsKKyAgICBfX2ZzZmlsY250X3QgZl9maWxlczsKKyAgICBfX2ZzZmlsY250X3QgZl9mZnJlZTsKKyAgICBfX2ZzZmlsY250X3QgZl9mYXZhaWw7CisjZWxzZQorICAgIF9fZnNibGtjbnQ2NF90IGZfYmxvY2tzOworICAgIF9fZnNibGtjbnQ2NF90IGZfYmZyZWU7CisgICAgX19mc2Jsa2NudDY0X3QgZl9iYXZhaWw7CisgICAgX19mc2ZpbGNudDY0X3QgZl9maWxlczsKKyAgICBfX2ZzZmlsY250NjRfdCBmX2ZmcmVlOworICAgIF9fZnNmaWxjbnQ2NF90IGZfZmF2YWlsOworI2VuZGlmCisgICAgdW5zaWduZWQgbG9uZyBpbnQgZl9mc2lkOworI2lmZGVmIF9TVEFUVkZTQlVGX0ZfVU5VU0VECisgICAgaW50IF9fZl91bnVzZWQ7CisjZW5kaWYKKyAgICB1bnNpZ25lZCBsb25nIGludCBmX2ZsYWc7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgZl9uYW1lbWF4OworICAgIGludCBfX2Zfc3BhcmVbNl07CisgIH07CisKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorc3RydWN0IHN0YXR2ZnM2NAorICB7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgZl9ic2l6ZTsKKyAgICB1bnNpZ25lZCBsb25nIGludCBmX2Zyc2l6ZTsKKyAgICBfX2ZzYmxrY250NjRfdCBmX2Jsb2NrczsKKyAgICBfX2ZzYmxrY250NjRfdCBmX2JmcmVlOworICAgIF9fZnNibGtjbnQ2NF90IGZfYmF2YWlsOworICAgIF9fZnNmaWxjbnQ2NF90IGZfZmlsZXM7CisgICAgX19mc2ZpbGNudDY0X3QgZl9mZnJlZTsKKyAgICBfX2ZzZmlsY250NjRfdCBmX2ZhdmFpbDsKKyAgICB1bnNpZ25lZCBsb25nIGludCBmX2ZzaWQ7CisjaWZkZWYgX1NUQVRWRlNCVUZfRl9VTlVTRUQKKyAgICBpbnQgX19mX3VudXNlZDsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGxvbmcgaW50IGZfZmxhZzsKKyAgICB1bnNpZ25lZCBsb25nIGludCBmX25hbWVtYXg7CisgICAgaW50IF9fZl9zcGFyZVs2XTsKKyAgfTsKKyNlbmRpZgorCisvKiBEZWZpbml0aW9ucyBmb3IgdGhlIGZsYWcgaW4gYGZfZmxhZycuICBUaGVzZSBkZWZpbml0aW9ucyBzaG91bGQgYmUKKyAgIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBkZWZpbml0aW9ucyBpbiA8c3lzL21vdW50Lmg+LiAgKi8KK2VudW0KK3sKKyAgU1RfUkRPTkxZID0gMSwJCS8qIE1vdW50IHJlYWQtb25seS4gICovCisjZGVmaW5lIFNUX1JET05MWQlTVF9SRE9OTFkKKyAgU1RfTk9TVUlEID0gMgkJCS8qIElnbm9yZSBzdWlkIGFuZCBzZ2lkIGJpdHMuICAqLworI2RlZmluZSBTVF9OT1NVSUQJU1RfTk9TVUlECisjaWZkZWYgX19VU0VfR05VCisgICwKKyAgU1RfTk9ERVYgPSA0LAkJCS8qIERpc2FsbG93IGFjY2VzcyB0byBkZXZpY2Ugc3BlY2lhbCBmaWxlcy4gICovCisjIGRlZmluZSBTVF9OT0RFVglTVF9OT0RFVgorICBTVF9OT0VYRUMgPSA4LAkJLyogRGlzYWxsb3cgcHJvZ3JhbSBleGVjdXRpb24uICAqLworIyBkZWZpbmUgU1RfTk9FWEVDCVNUX05PRVhFQworICBTVF9TWU5DSFJPTk9VUyA9IDE2LAkJLyogV3JpdGVzIGFyZSBzeW5jZWQgYXQgb25jZS4gICovCisjIGRlZmluZSBTVF9TWU5DSFJPTk9VUwlTVF9TWU5DSFJPTk9VUworICBTVF9NQU5ETE9DSyA9IDY0LAkJLyogQWxsb3cgbWFuZGF0b3J5IGxvY2tzIG9uIGFuIEZTLiAgKi8KKyMgZGVmaW5lIFNUX01BTkRMT0NLCVNUX01BTkRMT0NLCisgIFNUX1dSSVRFID0gMTI4LAkJLyogV3JpdGUgb24gZmlsZS9kaXJlY3Rvcnkvc3ltbGluay4gICovCisjIGRlZmluZSBTVF9XUklURQlTVF9XUklURQorICBTVF9BUFBFTkQgPSAyNTYsCQkvKiBBcHBlbmQtb25seSBmaWxlLiAgKi8KKyMgZGVmaW5lIFNUX0FQUEVORAlTVF9BUFBFTkQKKyAgU1RfSU1NVVRBQkxFID0gNTEyLAkJLyogSW1tdXRhYmxlIGZpbGUuICAqLworIyBkZWZpbmUgU1RfSU1NVVRBQkxFCVNUX0lNTVVUQUJMRQorICBTVF9OT0FUSU1FID0gMTAyNCwJCS8qIERvIG5vdCB1cGRhdGUgYWNjZXNzIHRpbWVzLiAgKi8KKyMgZGVmaW5lIFNUX05PQVRJTUUJU1RfTk9BVElNRQorICBTVF9OT0RJUkFUSU1FID0gMjA0OCwJCS8qIERvIG5vdCB1cGRhdGUgZGlyZWN0b3J5IGFjY2VzcyB0aW1lcy4gICovCisjIGRlZmluZSBTVF9OT0RJUkFUSU1FCVNUX05PRElSQVRJTUUKKyAgU1RfUkVMQVRJTUUgPSA0MDk2CQkvKiBVcGRhdGUgYXRpbWUgcmVsYXRpdmUgdG8gbXRpbWUvY3RpbWUuICAqLworIyBkZWZpbmUgU1RfUkVMQVRJTUUJU1RfUkVMQVRJTUUKKyNlbmRpZgkvKiBVc2UgR05VLiAgKi8KK307CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGRpby1sZGJsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGRpby1sZGJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwZjExMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0ZGlvLWxkYmwuaApAQCAtMCwwICsxLDk3IEBACisvKiAtbWxvbmctZG91YmxlLTY0IGNvbXBhdGliaWxpdHkgbW9kZSBmb3Igc3RkaW8gZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVERJT19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3N0ZGlvLWxkYmwuaD4gZGlyZWN0bHk7IHVzZSA8c3RkaW8uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECitfX0xEQkxfUkVESVJfREVDTCAoZnByaW50ZikKK19fTERCTF9SRURJUl9ERUNMIChwcmludGYpCitfX0xEQkxfUkVESVJfREVDTCAoc3ByaW50ZikKK19fTERCTF9SRURJUl9ERUNMICh2ZnByaW50ZikKK19fTERCTF9SRURJUl9ERUNMICh2cHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKHZzcHJpbnRmKQorI2lmIGRlZmluZWQgX19VU0VfSVNPQzk5ICYmICFkZWZpbmVkIF9fVVNFX0dOVSBcCisgICAgJiYgIWRlZmluZWQgX19SRURJUkVDVCBcCisgICAgJiYgKGRlZmluZWQgX19TVFJJQ1RfQU5TSV9fIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySykKK19fTERCTF9SRURJUjFfREVDTCAoZnNjYW5mLCBfX25sZGJsX19faXNvYzk5X2ZzY2FuZikKK19fTERCTF9SRURJUjFfREVDTCAoc2NhbmYsIF9fbmxkYmxfX19pc29jOTlfc2NhbmYpCitfX0xEQkxfUkVESVIxX0RFQ0wgKHNzY2FuZiwgX19ubGRibF9fX2lzb2M5OV9zc2NhbmYpCisjZWxzZQorX19MREJMX1JFRElSX0RFQ0wgKGZzY2FuZikKK19fTERCTF9SRURJUl9ERUNMIChzY2FuZikKK19fTERCTF9SRURJUl9ERUNMIChzc2NhbmYpCisjZW5kaWYKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5IHx8IGRlZmluZWQgX19VU0VfVU5JWDk4CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKK19fTERCTF9SRURJUl9ERUNMIChzbnByaW50ZikKK19fTERCTF9SRURJUl9ERUNMICh2c25wcmludGYpCitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmZGVmCV9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisjIGlmICFkZWZpbmVkIF9fVVNFX0dOVSAmJiAhZGVmaW5lZCBfX1JFRElSRUNUIFwKKyAgICAgJiYgKGRlZmluZWQgX19TVFJJQ1RfQU5TSV9fIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySykKK19fTERCTF9SRURJUjFfREVDTCAodmZzY2FuZiwgX19ubGRibF9fX2lzb2M5OV92ZnNjYW5mKQorX19MREJMX1JFRElSMV9ERUNMICh2c2NhbmYsIF9fbmxkYmxfX19pc29jOTlfdnNjYW5mKQorX19MREJMX1JFRElSMV9ERUNMICh2c3NjYW5mLCBfX25sZGJsX19faXNvYzk5X3Zzc2NhbmYpCisjIGVsc2UKK19fTERCTF9SRURJUl9ERUNMICh2ZnNjYW5mKQorX19MREJMX1JFRElSX0RFQ0wgKHZzc2NhbmYpCitfX0xEQkxfUkVESVJfREVDTCAodnNjYW5mKQorIyBlbmRpZgorX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKK19fTERCTF9SRURJUl9ERUNMICh2ZHByaW50ZikKK19fTERCTF9SRURJUl9ERUNMIChkcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKHZhc3ByaW50ZikKK19fTERCTF9SRURJUl9ERUNMIChfX2FzcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKGFzcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKG9ic3RhY2tfcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKG9ic3RhY2tfdnByaW50ZikKKyNlbmRpZgorCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDAgJiYgZGVmaW5lZCBfX2V4dGVybl9hbHdheXNfaW5saW5lCitfX0xEQkxfUkVESVJfREVDTCAoX19zcHJpbnRmX2NoaykKK19fTERCTF9SRURJUl9ERUNMIChfX3ZzcHJpbnRmX2NoaykKKyMgaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkgfHwgZGVmaW5lZCBfX1VTRV9VTklYOTgKK19fTERCTF9SRURJUl9ERUNMIChfX3NucHJpbnRmX2NoaykKK19fTERCTF9SRURJUl9ERUNMIChfX3ZzbnByaW50Zl9jaGspCisjIGVuZGlmCisjIGlmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAxCitfX0xEQkxfUkVESVJfREVDTCAoX19mcHJpbnRmX2NoaykKK19fTERCTF9SRURJUl9ERUNMIChfX3ByaW50Zl9jaGspCitfX0xEQkxfUkVESVJfREVDTCAoX192ZnByaW50Zl9jaGspCitfX0xEQkxfUkVESVJfREVDTCAoX192cHJpbnRmX2NoaykKKyMgIGlmZGVmIF9fVVNFX0dOVQorX19MREJMX1JFRElSX0RFQ0wgKF9fYXNwcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fdmFzcHJpbnRmX2NoaykKK19fTERCTF9SRURJUl9ERUNMIChfX2RwcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fdmRwcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fb2JzdGFja19wcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fb2JzdGFja192cHJpbnRmX2NoaykKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0ZGlvLWxvY2suaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0ZGlvLWxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGVmZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RkaW8tbG9jay5oCkBAIC0wLDAgKzEsMTExIEBACisvKiBUaHJlYWQgcGFja2FnZSBzcGVjaWZpYyBkZWZpbml0aW9ucyBvZiBzdHJlYW0gbG9jayB0eXBlLiAgTlBUTCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9CSVRTX1NURElPX0xPQ0tfSAorI2RlZmluZSBfQklUU19TVERJT19MT0NLX0ggMQorCisjaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KKyNpbmNsdWRlIDxsb3dsZXZlbGxvY2suaD4KKworCisvKiBUaGUgbG9ja2luZyBoZXJlIGlzIHZlcnkgaW5leHBlbnNpdmUsIGV2ZW4gZm9yIGlubGluaW5nLiAgKi8KKyNkZWZpbmUgX0lPX2xvY2tfaW5leHBlbnNpdmUJMQorCit0eXBlZGVmIHN0cnVjdCB7IGludCBsb2NrOyBpbnQgY250OyB2b2lkICpvd25lcjsgfSBfSU9fbG9ja190OworCisjZGVmaW5lIF9JT19sb2NrX2luaXRpYWxpemVyIHsgTExMX0xPQ0tfSU5JVElBTElaRVIsIDAsIE5VTEwgfQorCisjZGVmaW5lIF9JT19sb2NrX2luaXQoX25hbWUpIFwKKyAgKChfbmFtZSkgPSAoX0lPX2xvY2tfdCkgX0lPX2xvY2tfaW5pdGlhbGl6ZXIgLCAwKQorCisjZGVmaW5lIF9JT19sb2NrX2ZpbmkoX25hbWUpIFwKKyAgKCh2b2lkKSAwKQorCisjZGVmaW5lIF9JT19sb2NrX2xvY2soX25hbWUpIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICB2b2lkICpfX3NlbGYgPSBUSFJFQURfU0VMRjsJCQkJCQkgICAgICBcCisgICAgaWYgKChfbmFtZSkub3duZXIgIT0gX19zZWxmKQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKwlsbGxfbG9jayAoKF9uYW1lKS5sb2NrLCBMTExfUFJJVkFURSk7CQkJCSAgICAgIFwKKyAgICAgICAgKF9uYW1lKS5vd25lciA9IF9fc2VsZjsJCQkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICAgICsrKF9uYW1lKS5jbnQ7CQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfSU9fbG9ja190cnlsb2NrKF9uYW1lKSBcCisgICh7CQkJCQkJCQkJICAgICAgXAorICAgIGludCBfX3Jlc3VsdCA9IDA7CQkJCQkJCSAgICAgIFwKKyAgICB2b2lkICpfX3NlbGYgPSBUSFJFQURfU0VMRjsJCQkJCQkgICAgICBcCisgICAgaWYgKChfbmFtZSkub3duZXIgIT0gX19zZWxmKQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKyAgICAgICAgaWYgKGxsbF90cnlsb2NrICgoX25hbWUpLmxvY2spID09IDApCQkJCSAgICAgIFwKKyAgICAgICAgICB7CQkJCQkJCQkgICAgICBcCisgICAgICAgICAgICAoX25hbWUpLm93bmVyID0gX19zZWxmOwkJCQkJICAgICAgXAorICAgICAgICAgICAgKF9uYW1lKS5jbnQgPSAxOwkJCQkJCSAgICAgIFwKKyAgICAgICAgICB9CQkJCQkJCQkgICAgICBcCisgICAgICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKKyAgICAgICAgICBfX3Jlc3VsdCA9IEVCVVNZOwkJCQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgICAgZWxzZQkJCQkJCQkJICAgICAgXAorICAgICAgKysoX25hbWUpLmNudDsJCQkJCQkJICAgICAgXAorICAgIF9fcmVzdWx0OwkJCQkJCQkJICAgICAgXAorICB9KQorCisjZGVmaW5lIF9JT19sb2NrX3VubG9jayhfbmFtZSkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIGlmICgtLShfbmFtZSkuY250ID09IDApCQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKyAgICAgICAgKF9uYW1lKS5vd25lciA9IE5VTEw7CQkJCQkJICAgICAgXAorCWxsbF91bmxvY2sgKChfbmFtZSkubG9jaywgTExMX1BSSVZBVEUpOwkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorCisKKworI2RlZmluZSBfSU9fY2xlYW51cF9yZWdpb25fc3RhcnQoX2ZjdCwgX2ZwKSBcCisgIF9fbGliY19jbGVhbnVwX3JlZ2lvbl9zdGFydCAoKChfZnApLT5fZmxhZ3MgJiBfSU9fVVNFUl9MT0NLKSA9PSAwLCBfZmN0LCBfZnApCisjZGVmaW5lIF9JT19jbGVhbnVwX3JlZ2lvbl9zdGFydF9ub2FyZyhfZmN0KSBcCisgIF9fbGliY19jbGVhbnVwX3JlZ2lvbl9zdGFydCAoMSwgX2ZjdCwgTlVMTCkKKyNkZWZpbmUgX0lPX2NsZWFudXBfcmVnaW9uX2VuZChfZG9pdCkgXAorICBfX2xpYmNfY2xlYW51cF9yZWdpb25fZW5kIChfZG9pdCkKKworI2lmIGRlZmluZWQgX0xJQkMgJiYgIWRlZmluZWQgTk9UX0lOX2xpYmMKKworIyBpZmRlZiBfX0VYQ0VQVElPTlMKKyMgIGRlZmluZSBfSU9fYWNxdWlyZV9sb2NrKF9mcCkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIF9JT19GSUxFICpfSU9fYWNxdWlyZV9sb2NrX2ZpbGUJCQkJCSAgICAgIFwKKwlfX2F0dHJpYnV0ZV9fKChjbGVhbnVwIChfSU9fYWNxdWlyZV9sb2NrX2ZjdCkpKQkJCSAgICAgIFwKKwk9IChfZnApOwkJCQkJCQkgICAgICBcCisgICAgX0lPX2Zsb2NrZmlsZSAoX0lPX2FjcXVpcmVfbG9ja19maWxlKTsKKyMgIGRlZmluZSBfSU9fYWNxdWlyZV9sb2NrX2NsZWFyX2ZsYWdzMihfZnApIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBfSU9fRklMRSAqX0lPX2FjcXVpcmVfbG9ja19maWxlCQkJCQkgICAgICBcCisJX19hdHRyaWJ1dGVfXygoY2xlYW51cCAoX0lPX2FjcXVpcmVfbG9ja19jbGVhcl9mbGFnczJfZmN0KSkpCSAgICAgIFwKKwk9IChfZnApOwkJCQkJCQkgICAgICBcCisgICAgX0lPX2Zsb2NrZmlsZSAoX0lPX2FjcXVpcmVfbG9ja19maWxlKTsKKyMgZWxzZQorIyAgZGVmaW5lIF9JT19hY3F1aXJlX2xvY2soX2ZwKSBfSU9fYWNxdWlyZV9sb2NrX25lZWRzX2V4Y2VwdGlvbnNfZW5hYmxlZAorIyAgZGVmaW5lIF9JT19hY3F1aXJlX2xvY2tfY2xlYXJfZmxhZ3MyKF9mcCkgX0lPX2FjcXVpcmVfbG9jayAoX2ZwKQorIyBlbmRpZgorIyBkZWZpbmUgX0lPX3JlbGVhc2VfbG9jayhfZnApIDsgfSB3aGlsZSAoMCkKKworI2VuZGlmCisKKyNlbmRpZiAvKiBiaXRzL3N0ZGlvLWxvY2suaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RkaW8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzMDNjNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0ZGlvLmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qIE9wdGltaXppbmcgbWFjcm9zIGFuZCBpbmxpbmUgZnVuY3Rpb25zIGZvciBzdGRpbyBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDIwMDAsIDIwMDEsIDIwMDQsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NURElPX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3RkaW8uaD4gZGlyZWN0bHk7IHVzZSA8c3RkaW8uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfX2V4dGVybl9pbmxpbmUKKyMgZGVmaW5lIF9fU1RESU9fSU5MSU5FIGlubGluZQorI2Vsc2UKKyMgZGVmaW5lIF9fU1RESU9fSU5MSU5FIF9fZXh0ZXJuX2lubGluZQorI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCisvKiBGb3IgLURfRk9SVElGWV9TT1VSQ0V7LD0yfSBiaXRzL3N0ZGlvMi5oIHdpbGwgZGVmaW5lIGEgZGlmZmVyZW50CisgICBpbmxpbmUuICAqLworIyBpZiAhKF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAwICYmIGRlZmluZWQgX19leHRlcm5fYWx3YXlzX2lubGluZSkKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gc3Rkb3V0IGZyb20gYXJndW1lbnQgbGlzdCBBUkcuICAqLworX19TVERJT19JTkxJTkUgaW50Cit2cHJpbnRmIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIF9HX3ZhX2xpc3QgX19hcmcpCit7CisgIHJldHVybiB2ZnByaW50ZiAoc3Rkb3V0LCBfX2ZtdCwgX19hcmcpOworfQorIyBlbmRpZgorCisvKiBSZWFkIGEgY2hhcmFjdGVyIGZyb20gc3RkaW4uICAqLworX19TVERJT19JTkxJTkUgaW50CitnZXRjaGFyICh2b2lkKQoreworICByZXR1cm4gX0lPX2dldGMgKHN0ZGluKTsKK30KKworCisjIGlmZGVmIF9fVVNFX01JU0MKKy8qIEZhc3RlciB2ZXJzaW9uIHdoZW4gbG9ja2luZyBpcyBub3QgbmVjZXNzYXJ5LiAgKi8KK19fU1RESU9fSU5MSU5FIGludAorZmdldGNfdW5sb2NrZWQgKEZJTEUgKl9fZnApCit7CisgIHJldHVybiBfSU9fZ2V0Y191bmxvY2tlZCAoX19mcCk7Cit9CisjIGVuZGlmIC8qIG1pc2MgKi8KKworCisjIGlmIGRlZmluZWQgX19VU0VfUE9TSVggfHwgZGVmaW5lZCBfX1VTRV9NSVNDCisvKiBUaGlzIGlzIGRlZmluZWQgaW4gUE9TSVguMToxOTk2LiAgKi8KK19fU1RESU9fSU5MSU5FIGludAorZ2V0Y191bmxvY2tlZCAoRklMRSAqX19mcCkKK3sKKyAgcmV0dXJuIF9JT19nZXRjX3VubG9ja2VkIChfX2ZwKTsKK30KKworLyogVGhpcyBpcyBkZWZpbmVkIGluIFBPU0lYLjE6MTk5Ni4gICovCitfX1NURElPX0lOTElORSBpbnQKK2dldGNoYXJfdW5sb2NrZWQgKHZvaWQpCit7CisgIHJldHVybiBfSU9fZ2V0Y191bmxvY2tlZCAoc3RkaW4pOworfQorIyBlbmRpZgkvKiBQT1NJWCB8fCBtaXNjICovCisKKworLyogV3JpdGUgYSBjaGFyYWN0ZXIgdG8gc3Rkb3V0LiAgKi8KK19fU1RESU9fSU5MSU5FIGludAorcHV0Y2hhciAoaW50IF9fYykKK3sKKyAgcmV0dXJuIF9JT19wdXRjIChfX2MsIHN0ZG91dCk7Cit9CisKKworIyBpZmRlZiBfX1VTRV9NSVNDCisvKiBGYXN0ZXIgdmVyc2lvbiB3aGVuIGxvY2tpbmcgaXMgbm90IG5lY2Vzc2FyeS4gICovCitfX1NURElPX0lOTElORSBpbnQKK2ZwdXRjX3VubG9ja2VkIChpbnQgX19jLCBGSUxFICpfX3N0cmVhbSkKK3sKKyAgcmV0dXJuIF9JT19wdXRjX3VubG9ja2VkIChfX2MsIF9fc3RyZWFtKTsKK30KKyMgZW5kaWYgLyogbWlzYyAqLworCisKKyMgaWYgZGVmaW5lZCBfX1VTRV9QT1NJWCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKy8qIFRoaXMgaXMgZGVmaW5lZCBpbiBQT1NJWC4xOjE5OTYuICAqLworX19TVERJT19JTkxJTkUgaW50CitwdXRjX3VubG9ja2VkIChpbnQgX19jLCBGSUxFICpfX3N0cmVhbSkKK3sKKyAgcmV0dXJuIF9JT19wdXRjX3VubG9ja2VkIChfX2MsIF9fc3RyZWFtKTsKK30KKworLyogVGhpcyBpcyBkZWZpbmVkIGluIFBPU0lYLjE6MTk5Ni4gICovCitfX1NURElPX0lOTElORSBpbnQKK3B1dGNoYXJfdW5sb2NrZWQgKGludCBfX2MpCit7CisgIHJldHVybiBfSU9fcHV0Y191bmxvY2tlZCAoX19jLCBzdGRvdXQpOworfQorIyBlbmRpZgkvKiBQT1NJWCB8fCBtaXNjICovCisKKworIyBpZmRlZglfX1VTRV9HTlUKKy8qIExpa2UgYGdldGRlbGltJywgYnV0IHJlYWRzIHVwIHRvIGEgbmV3bGluZS4gICovCitfX1NURElPX0lOTElORSBfSU9fc3NpemVfdAorZ2V0bGluZSAoY2hhciAqKl9fbGluZXB0ciwgc2l6ZV90ICpfX24sIEZJTEUgKl9fc3RyZWFtKQoreworICByZXR1cm4gX19nZXRkZWxpbSAoX19saW5lcHRyLCBfX24sICdcbicsIF9fc3RyZWFtKTsKK30KKyMgZW5kaWYgLyogR05VICovCisKKworIyBpZmRlZiBfX1VTRV9NSVNDCisvKiBGYXN0ZXIgdmVyc2lvbnMgd2hlbiBsb2NraW5nIGlzIG5vdCByZXF1aXJlZC4gICovCitfX1NURElPX0lOTElORSBpbnQKK19fTlRIIChmZW9mX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSkpCit7CisgIHJldHVybiBfSU9fZmVvZl91bmxvY2tlZCAoX19zdHJlYW0pOworfQorCisvKiBGYXN0ZXIgdmVyc2lvbnMgd2hlbiBsb2NraW5nIGlzIG5vdCByZXF1aXJlZC4gICovCitfX1NURElPX0lOTElORSBpbnQKK19fTlRIIChmZXJyb3JfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFtKSkKK3sKKyAgcmV0dXJuIF9JT19mZXJyb3JfdW5sb2NrZWQgKF9fc3RyZWFtKTsKK30KKyMgZW5kaWYgLyogbWlzYyAqLworCisjZW5kaWYgLyogVXNlIGV4dGVybiBpbmxpbmVzLiAgKi8KKworCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDICYmIGRlZmluZWQgX19HTlVDX18gJiYgZGVmaW5lZCBfX09QVElNSVpFX18gXAorICAgICYmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisvKiBQZXJmb3JtIHNvbWUgc2ltcGxlIG9wdGltaXphdGlvbnMuICAqLworIyBkZWZpbmUgZnJlYWRfdW5sb2NrZWQocHRyLCBzaXplLCBuLCBzdHJlYW0pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc2l6ZSkgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKG4pICAgIFwKKwkJICAgJiYgKHNpemVfdCkgKHNpemUpICogKHNpemVfdCkgKG4pIDw9IDgJCSAgICAgIFwKKwkJICAgJiYgKHNpemVfdCkgKHNpemUpICE9IDApCQkJCSAgICAgIFwKKwkJICA/ICh7IGNoYXIgKl9fcHRyID0gKGNoYXIgKikgKHB0cik7CQkJICAgICAgXAorCQkgICAgICAgRklMRSAqX19zdHJlYW0gPSAoc3RyZWFtKTsJCQkgICAgICBcCisJCSAgICAgICBzaXplX3QgX19jbnQ7CQkJCQkgICAgICBcCisJCSAgICAgICBmb3IgKF9fY250ID0gKHNpemVfdCkgKHNpemUpICogKHNpemVfdCkgKG4pOwkgICAgICBcCisJCQkgICAgX19jbnQgPiAwOyAtLV9fY250KQkJCQkgICAgICBcCisJCQkgewkJCQkJCSAgICAgIFwKKwkJCSAgIGludCBfX2MgPSBfSU9fZ2V0Y191bmxvY2tlZCAoX19zdHJlYW0pOwkgICAgICBcCisJCQkgICBpZiAoX19jID09IEVPRikJCQkJICAgICAgXAorCQkJICAgICBicmVhazsJCQkJCSAgICAgIFwKKwkJCSAgICpfX3B0cisrID0gX19jOwkJCQkgICAgICBcCisJCQkgfQkJCQkJCSAgICAgIFwKKwkJICAgICAgICgoc2l6ZV90KSAoc2l6ZSkgKiAoc2l6ZV90KSAobikgLSBfX2NudCkJCSAgICAgIFwKKwkJCS8gKHNpemVfdCkgKHNpemUpOyB9KQkJCQkgICAgICBcCisJCSAgOiAoKChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc2l6ZSkgJiYgKHNpemVfdCkgKHNpemUpID09IDApICAgXAorCQkgICAgICB8fCAoX19idWlsdGluX2NvbnN0YW50X3AgKG4pICYmIChzaXplX3QpIChuKSA9PSAwKSkgICAgIFwKKwkJCS8qIEV2YWx1YXRlIGFsbCBwYXJhbWV0ZXJzIG9uY2UuICAqLwkJICAgICAgXAorCQkgICAgID8gKCh2b2lkKSAocHRyKSwgKHZvaWQpIChzdHJlYW0pLCAodm9pZCkgKHNpemUpLAkgICAgICBcCisJCQkodm9pZCkgKG4pLCAoc2l6ZV90KSAwKQkJCQkgICAgICBcCisJCSAgICAgOiBmcmVhZF91bmxvY2tlZCAocHRyLCBzaXplLCBuLCBzdHJlYW0pKSkpCisKKyMgZGVmaW5lIGZ3cml0ZV91bmxvY2tlZChwdHIsIHNpemUsIG4sIHN0cmVhbSkgXAorICAoX19leHRlbnNpb25fXyAoKF9fYnVpbHRpbl9jb25zdGFudF9wIChzaXplKSAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAobikgICAgXAorCQkgICAmJiAoc2l6ZV90KSAoc2l6ZSkgKiAoc2l6ZV90KSAobikgPD0gOAkJICAgICAgXAorCQkgICAmJiAoc2l6ZV90KSAoc2l6ZSkgIT0gMCkJCQkJICAgICAgXAorCQkgID8gKHsgY29uc3QgY2hhciAqX19wdHIgPSAoY29uc3QgY2hhciAqKSAocHRyKTsJICAgICAgXAorCQkgICAgICAgRklMRSAqX19zdHJlYW0gPSAoc3RyZWFtKTsJCQkgICAgICBcCisJCSAgICAgICBzaXplX3QgX19jbnQ7CQkJCQkgICAgICBcCisJCSAgICAgICBmb3IgKF9fY250ID0gKHNpemVfdCkgKHNpemUpICogKHNpemVfdCkgKG4pOwkgICAgICBcCisJCQkgICAgX19jbnQgPiAwOyAtLV9fY250KQkJCQkgICAgICBcCisJCQkgaWYgKF9JT19wdXRjX3VubG9ja2VkICgqX19wdHIrKywgX19zdHJlYW0pID09IEVPRikgICBcCisJCQkgICBicmVhazsJCQkJCSAgICAgIFwKKwkJICAgICAgICgoc2l6ZV90KSAoc2l6ZSkgKiAoc2l6ZV90KSAobikgLSBfX2NudCkJCSAgICAgIFwKKwkJCS8gKHNpemVfdCkgKHNpemUpOyB9KQkJCQkgICAgICBcCisJCSAgOiAoKChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc2l6ZSkgJiYgKHNpemVfdCkgKHNpemUpID09IDApICAgXAorCQkgICAgICB8fCAoX19idWlsdGluX2NvbnN0YW50X3AgKG4pICYmIChzaXplX3QpIChuKSA9PSAwKSkgICAgIFwKKwkJCS8qIEV2YWx1YXRlIGFsbCBwYXJhbWV0ZXJzIG9uY2UuICAqLwkJICAgICAgXAorCQkgICAgID8gKCh2b2lkKSAocHRyKSwgKHZvaWQpIChzdHJlYW0pLCAodm9pZCkgKHNpemUpLAkgICAgICBcCisJCQkodm9pZCkgKG4pLCAoc2l6ZV90KSAwKQkJCQkgICAgICBcCisJCSAgICAgOiBmd3JpdGVfdW5sb2NrZWQgKHB0ciwgc2l6ZSwgbiwgc3RyZWFtKSkpKQorI2VuZGlmCisKKy8qIERlZmluZSBoZWxwZXIgbWFjcm8uICAqLworI3VuZGVmIF9fU1RESU9fSU5MSU5FCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGRpbzIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0ZGlvMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjVhYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGRpbzIuaApAQCAtMCwwICsxLDM3NCBAQAorLyogQ2hlY2tpbmcgbWFjcm9zIGZvciBzdGRpbyBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NURElPX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3RkaW8yLmg+IGRpcmVjdGx5OyB1c2UgPHN0ZGlvLmg+IGluc3RlYWQuIgorI2VuZGlmCisKK2V4dGVybiBpbnQgX19zcHJpbnRmX2NoayAoY2hhciAqX19yZXN0cmljdCBfX3MsIGludCBfX2ZsYWcsIHNpemVfdCBfX3NsZW4sCisJCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSBfX1RIUk9XOworZXh0ZXJuIGludCBfX3ZzcHJpbnRmX2NoayAoY2hhciAqX19yZXN0cmljdCBfX3MsIGludCBfX2ZsYWcsIHNpemVfdCBfX3NsZW4sCisJCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgICBfR192YV9saXN0IF9fYXApIF9fVEhST1c7CisKKyNpZmRlZiBfX3ZhX2FyZ19wYWNrCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKHNwcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19zcHJpbnRmX2NoayAoX19zLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwKKwkJCQkgIF9fYm9zIChfX3MpLCBfX2ZtdCwgX192YV9hcmdfcGFjayAoKSk7Cit9CisjZWxpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cworIyBkZWZpbmUgc3ByaW50ZihzdHIsIC4uLikgXAorICBfX2J1aWx0aW5fX19zcHJpbnRmX2NoayAoc3RyLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19ib3MgKHN0ciksIFwKKwkJCSAgIF9fVkFfQVJHU19fKQorI2VuZGlmCisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAodnNwcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsCisJCSBfR192YV9saXN0IF9fYXApKQoreworICByZXR1cm4gX19idWlsdGluX19fdnNwcmludGZfY2hrIChfX3MsIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLAorCQkJCSAgIF9fYm9zIChfX3MpLCBfX2ZtdCwgX19hcCk7Cit9CisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OSB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OAorCitleHRlcm4gaW50IF9fc25wcmludGZfY2hrIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwgaW50IF9fZmxhZywKKwkJCSAgIHNpemVfdCBfX3NsZW4sIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgIC4uLikgX19USFJPVzsKK2V4dGVybiBpbnQgX192c25wcmludGZfY2hrIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwgaW50IF9fZmxhZywKKwkJCSAgICBzaXplX3QgX19zbGVuLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgICAgX0dfdmFfbGlzdCBfX2FwKSBfX1RIUk9XOworCisjIGlmZGVmIF9fdmFfYXJnX3BhY2sKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAoc25wcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLAorCQkgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pKQoreworICByZXR1cm4gX19idWlsdGluX19fc25wcmludGZfY2hrIChfX3MsIF9fbiwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsCisJCQkJICAgX19ib3MgKF9fcyksIF9fZm10LCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKyMgZWxpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cworIyAgZGVmaW5lIHNucHJpbnRmKHN0ciwgbGVuLCAuLi4pIFwKKyAgX19idWlsdGluX19fc25wcmludGZfY2hrIChzdHIsIGxlbiwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fYm9zIChzdHIpLCBcCisJCQkgICAgX19WQV9BUkdTX18pCisjIGVuZGlmCisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAodnNucHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwKKwkJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIF9HX3ZhX2xpc3QgX19hcCkpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX192c25wcmludGZfY2hrIChfX3MsIF9fbiwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsCisJCQkJICAgIF9fYm9zIChfX3MpLCBfX2ZtdCwgX19hcCk7Cit9CisKKyNlbmRpZgorCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDEKKworZXh0ZXJuIGludCBfX2ZwcmludGZfY2hrIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBpbnQgX19mbGFnLAorCQkJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLik7CitleHRlcm4gaW50IF9fcHJpbnRmX2NoayAoaW50IF9fZmxhZywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pOworZXh0ZXJuIGludCBfX3ZmcHJpbnRmX2NoayAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwgaW50IF9fZmxhZywKKwkJCSAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgX0dfdmFfbGlzdCBfX2FwKTsKK2V4dGVybiBpbnQgX192cHJpbnRmX2NoayAoaW50IF9fZmxhZywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICBfR192YV9saXN0IF9fYXApOworCisjIGlmZGVmIF9fdmFfYXJnX3BhY2sKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitmcHJpbnRmIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikKK3sKKyAgcmV0dXJuIF9fZnByaW50Zl9jaGsgKF9fc3RyZWFtLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsCisJCQlfX3ZhX2FyZ19wYWNrICgpKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK3ByaW50ZiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pCit7CisgIHJldHVybiBfX3ByaW50Zl9jaGsgKF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwgX192YV9hcmdfcGFjayAoKSk7Cit9CisjIGVsaWYgIWRlZmluZWQgX19jcGx1c3BsdXMKKyMgIGRlZmluZSBwcmludGYoLi4uKSBcCisgIF9fcHJpbnRmX2NoayAoX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fVkFfQVJHU19fKQorIyAgZGVmaW5lIGZwcmludGYoc3RyZWFtLCAuLi4pIFwKKyAgX19mcHJpbnRmX2NoayAoc3RyZWFtLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19WQV9BUkdTX18pCisjIGVuZGlmCisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50Cit2cHJpbnRmIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIF9HX3ZhX2xpc3QgX19hcCkKK3sKKyNpZmRlZiBfX1VTRV9FWFRFUk5fSU5MSU5FUworICByZXR1cm4gX192ZnByaW50Zl9jaGsgKHN0ZG91dCwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX2FwKTsKKyNlbHNlCisgIHJldHVybiBfX3ZwcmludGZfY2hrIChfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsIF9fYXApOworI2VuZGlmCit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50Cit2ZnByaW50ZiAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwKKwkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgX0dfdmFfbGlzdCBfX2FwKQoreworICByZXR1cm4gX192ZnByaW50Zl9jaGsgKF9fc3RyZWFtLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsIF9fYXApOworfQorCisjIGlmZGVmIF9fVVNFX0dOVQorCitleHRlcm4gaW50IF9fYXNwcmludGZfY2hrIChjaGFyICoqX19yZXN0cmljdCBfX3B0ciwgaW50IF9fZmxhZywKKwkJCSAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCA0KSkpIF9fd3VyOworZXh0ZXJuIGludCBfX3Zhc3ByaW50Zl9jaGsgKGNoYXIgKipfX3Jlc3RyaWN0IF9fcHRyLCBpbnQgX19mbGFnLAorCQkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgX0dfdmFfbGlzdCBfX2FyZykKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgMCkpKSBfX3d1cjsKK2V4dGVybiBpbnQgX19kcHJpbnRmX2NoayAoaW50IF9fZmQsIGludCBfX2ZsYWcsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwKKwkJCSAgLi4uKSBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgNCkpKTsKK2V4dGVybiBpbnQgX192ZHByaW50Zl9jaGsgKGludCBfX2ZkLCBpbnQgX19mbGFnLAorCQkJICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCBfR192YV9saXN0IF9fYXJnKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgMCkpKTsKK2V4dGVybiBpbnQgX19vYnN0YWNrX3ByaW50Zl9jaGsgKHN0cnVjdCBvYnN0YWNrICpfX3Jlc3RyaWN0IF9fb2JzdGFjaywKKwkJCQkgaW50IF9fZmxhZywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJCSAuLi4pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDQpKSk7CitleHRlcm4gaW50IF9fb2JzdGFja192cHJpbnRmX2NoayAoc3RydWN0IG9ic3RhY2sgKl9fcmVzdHJpY3QgX19vYnN0YWNrLAorCQkJCSAgaW50IF9fZmxhZywKKwkJCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCQkgIF9HX3ZhX2xpc3QgX19hcmdzKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCAwKSkpOworCisjICBpZmRlZiBfX3ZhX2FyZ19wYWNrCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKGFzcHJpbnRmIChjaGFyICoqX19yZXN0cmljdCBfX3B0ciwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pKQoreworICByZXR1cm4gX19hc3ByaW50Zl9jaGsgKF9fcHRyLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsCisJCQkgX192YV9hcmdfcGFjayAoKSk7Cit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAoX19hc3ByaW50ZiAoY2hhciAqKl9fcmVzdHJpY3QgX19wdHIsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwKKwkJICAgLi4uKSkKK3sKKyAgcmV0dXJuIF9fYXNwcmludGZfY2hrIChfX3B0ciwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LAorCQkJIF9fdmFfYXJnX3BhY2sgKCkpOworfQorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorZHByaW50ZiAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKQoreworICByZXR1cm4gX19kcHJpbnRmX2NoayAoX19mZCwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LAorCQkJX192YV9hcmdfcGFjayAoKSk7Cit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAob2JzdGFja19wcmludGYgKHN0cnVjdCBvYnN0YWNrICpfX3Jlc3RyaWN0IF9fb2JzdGFjaywKKwkJICAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKSkKK3sKKyAgcmV0dXJuIF9fb2JzdGFja19wcmludGZfY2hrIChfX29ic3RhY2ssIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwKKwkJCSAgICAgICBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKyMgIGVsaWYgIWRlZmluZWQgX19jcGx1c3BsdXMKKyMgICBkZWZpbmUgYXNwcmludGYocHRyLCAuLi4pIFwKKyAgX19hc3ByaW50Zl9jaGsgKHB0ciwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fVkFfQVJHU19fKQorIyAgIGRlZmluZSBfX2FzcHJpbnRmKHB0ciwgLi4uKSBcCisgIF9fYXNwcmludGZfY2hrIChwdHIsIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX1ZBX0FSR1NfXykKKyMgICBkZWZpbmUgZHByaW50ZihmZCwgLi4uKSBcCisgIF9fZHByaW50Zl9jaGsgKGZkLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19WQV9BUkdTX18pCisjICAgZGVmaW5lIG9ic3RhY2tfcHJpbnRmKG9ic3RhY2ssIC4uLikgXAorICBfX29ic3RhY2tfcHJpbnRmX2NoayAob2JzdGFjaywgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fVkFfQVJHU19fKQorIyAgZW5kaWYKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIICh2YXNwcmludGYgKGNoYXIgKipfX3Jlc3RyaWN0IF9fcHRyLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsCisJCSAgX0dfdmFfbGlzdCBfX2FwKSkKK3sKKyAgcmV0dXJuIF9fdmFzcHJpbnRmX2NoayAoX19wdHIsIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwgX19hcCk7Cit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50Cit2ZHByaW50ZiAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgX0dfdmFfbGlzdCBfX2FwKQoreworICByZXR1cm4gX192ZHByaW50Zl9jaGsgKF9fZmQsIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwgX19hcCk7Cit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAob2JzdGFja192cHJpbnRmIChzdHJ1Y3Qgb2JzdGFjayAqX19yZXN0cmljdCBfX29ic3RhY2ssCisJCQlfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIF9HX3ZhX2xpc3QgX19hcCkpCit7CisgIHJldHVybiBfX29ic3RhY2tfdnByaW50Zl9jaGsgKF9fb2JzdGFjaywgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LAorCQkJCV9fYXApOworfQorCisjIGVuZGlmCisKKyNlbmRpZgorCitleHRlcm4gY2hhciAqX19nZXRzX2NoayAoY2hhciAqX19zdHIsIHNpemVfdCkgX193dXI7CitleHRlcm4gY2hhciAqX19SRURJUkVDVCAoX19nZXRzX3dhcm4sIChjaGFyICpfX3N0ciksIGdldHMpCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJwbGVhc2UgdXNlIGZnZXRzIG9yIGdldGxpbmUgaW5zdGVhZCwgZ2V0cyBjYW4ndCAiCisJCSAgICAgICAic3BlY2lmeSBidWZmZXIgc2l6ZSIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIGNoYXIgKgorZ2V0cyAoY2hhciAqX19zdHIpCit7CisgIGlmIChfX2JvcyAoX19zdHIpICE9IChzaXplX3QpIC0xKQorICAgIHJldHVybiBfX2dldHNfY2hrIChfX3N0ciwgX19ib3MgKF9fc3RyKSk7CisgIHJldHVybiBfX2dldHNfd2FybiAoX19zdHIpOworfQorCitleHRlcm4gY2hhciAqX19mZ2V0c19jaGsgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19zaXplLCBpbnQgX19uLAorCQkJICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUIChfX2ZnZXRzX2FsaWFzLAorCQkJIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgaW50IF9fbiwKKwkJCSAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksIGZnZXRzKSBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUIChfX2ZnZXRzX2Noa193YXJuLAorCQkJIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fc2l6ZSwgaW50IF9fbiwKKwkJCSAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksIF9fZmdldHNfY2hrKQorICAgICBfX3d1ciBfX3dhcm5hdHRyICgiZmdldHMgY2FsbGVkIHdpdGggYmlnZ2VyIHNpemUgdGhhbiBsZW5ndGggIgorCQkgICAgICAgIm9mIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIGNoYXIgKgorZmdldHMgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBpbnQgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKQoreworICBpZiAoX19ib3MgKF9fcykgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSB8fCBfX24gPD0gMCkKKwlyZXR1cm4gX19mZ2V0c19jaGsgKF9fcywgX19ib3MgKF9fcyksIF9fbiwgX19zdHJlYW0pOworCisgICAgICBpZiAoKHNpemVfdCkgX19uID4gX19ib3MgKF9fcykpCisJcmV0dXJuIF9fZmdldHNfY2hrX3dhcm4gKF9fcywgX19ib3MgKF9fcyksIF9fbiwgX19zdHJlYW0pOworICAgIH0KKyAgcmV0dXJuIF9fZmdldHNfYWxpYXMgKF9fcywgX19uLCBfX3N0cmVhbSk7Cit9CisKK2V4dGVybiBzaXplX3QgX19mcmVhZF9jaGsgKHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3B0cmxlbiwKKwkJCSAgIHNpemVfdCBfX3NpemUsIHNpemVfdCBfX24sCisJCQkgICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSBfX3d1cjsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVCAoX19mcmVhZF9hbGlhcywKKwkJCSAgKHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3NpemUsCisJCQkgICBzaXplX3QgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSwKKwkJCSAgZnJlYWQpIF9fd3VyOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUIChfX2ZyZWFkX2Noa193YXJuLAorCQkJICAodm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fcHRybGVuLAorCQkJICAgc2l6ZV90IF9fc2l6ZSwgc2l6ZV90IF9fbiwKKwkJCSAgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLAorCQkJICBfX2ZyZWFkX2NoaykKKyAgICAgX193dXIgX193YXJuYXR0ciAoImZyZWFkIGNhbGxlZCB3aXRoIGJpZ2dlciBzaXplICogbm1lbWIgdGhhbiBsZW5ndGggIgorCQkgICAgICAgIm9mIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIHNpemVfdAorZnJlYWQgKHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3NpemUsIHNpemVfdCBfX24sCisgICAgICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkKK3sKKyAgaWYgKF9fYm9zMCAoX19wdHIpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fc2l6ZSkKKwkgIHx8ICFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKQorCSAgfHwgKF9fc2l6ZSB8IF9fbikgPj0gKCgoc2l6ZV90KSAxKSA8PCAoOCAqIHNpemVvZiAoc2l6ZV90KSAvIDIpKSkKKwlyZXR1cm4gX19mcmVhZF9jaGsgKF9fcHRyLCBfX2JvczAgKF9fcHRyKSwgX19zaXplLCBfX24sIF9fc3RyZWFtKTsKKworICAgICAgaWYgKF9fc2l6ZSAqIF9fbiA+IF9fYm9zMCAoX19wdHIpKQorCXJldHVybiBfX2ZyZWFkX2Noa193YXJuIChfX3B0ciwgX19ib3MwIChfX3B0ciksIF9fc2l6ZSwgX19uLCBfX3N0cmVhbSk7CisgICAgfQorICByZXR1cm4gX19mcmVhZF9hbGlhcyAoX19wdHIsIF9fc2l6ZSwgX19uLCBfX3N0cmVhbSk7Cit9CisKKyNpZmRlZiBfX1VTRV9HTlUKK2V4dGVybiBjaGFyICpfX2ZnZXRzX3VubG9ja2VkX2NoayAoY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX3NpemUsCisJCQkJICAgaW50IF9fbiwgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgX193dXI7CitleHRlcm4gY2hhciAqX19SRURJUkVDVCAoX19mZ2V0c191bmxvY2tlZF9hbGlhcywKKwkJCSAoY2hhciAqX19yZXN0cmljdCBfX3MsIGludCBfX24sCisJCQkgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLCBmZ2V0c191bmxvY2tlZCkgX193dXI7CitleHRlcm4gY2hhciAqX19SRURJUkVDVCAoX19mZ2V0c191bmxvY2tlZF9jaGtfd2FybiwKKwkJCSAoY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX3NpemUsIGludCBfX24sCisJCQkgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLCBfX2ZnZXRzX3VubG9ja2VkX2NoaykKKyAgICAgX193dXIgX193YXJuYXR0ciAoImZnZXRzX3VubG9ja2VkIGNhbGxlZCB3aXRoIGJpZ2dlciBzaXplIHRoYW4gbGVuZ3RoICIKKwkJICAgICAgICJvZiBkZXN0aW5hdGlvbiBidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX3d1ciBjaGFyICoKK2ZnZXRzX3VubG9ja2VkIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgaW50IF9fbiwgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkKK3sKKyAgaWYgKF9fYm9zIChfX3MpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbikgfHwgX19uIDw9IDApCisJcmV0dXJuIF9fZmdldHNfdW5sb2NrZWRfY2hrIChfX3MsIF9fYm9zIChfX3MpLCBfX24sIF9fc3RyZWFtKTsKKworICAgICAgaWYgKChzaXplX3QpIF9fbiA+IF9fYm9zIChfX3MpKQorCXJldHVybiBfX2ZnZXRzX3VubG9ja2VkX2Noa193YXJuIChfX3MsIF9fYm9zIChfX3MpLCBfX24sIF9fc3RyZWFtKTsKKyAgICB9CisgIHJldHVybiBfX2ZnZXRzX3VubG9ja2VkX2FsaWFzIChfX3MsIF9fbiwgX19zdHJlYW0pOworfQorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9NSVNDCisjIHVuZGVmIGZyZWFkX3VubG9ja2VkCitleHRlcm4gc2l6ZV90IF9fZnJlYWRfdW5sb2NrZWRfY2hrICh2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19wdHJsZW4sCisJCQkJICAgIHNpemVfdCBfX3NpemUsIHNpemVfdCBfX24sCisJCQkJICAgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pIF9fd3VyOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUIChfX2ZyZWFkX3VubG9ja2VkX2FsaWFzLAorCQkJICAodm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fc2l6ZSwKKwkJCSAgIHNpemVfdCBfX24sIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLAorCQkJICBmcmVhZF91bmxvY2tlZCkgX193dXI7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1QgKF9fZnJlYWRfdW5sb2NrZWRfY2hrX3dhcm4sCisJCQkgICh2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19wdHJsZW4sCisJCQkgICBzaXplX3QgX19zaXplLCBzaXplX3QgX19uLAorCQkJICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksCisJCQkgIF9fZnJlYWRfdW5sb2NrZWRfY2hrKQorICAgICBfX3d1ciBfX3dhcm5hdHRyICgiZnJlYWRfdW5sb2NrZWQgY2FsbGVkIHdpdGggYmlnZ2VyIHNpemUgKiBubWVtYiB0aGFuICIKKwkJICAgICAgICJsZW5ndGggb2YgZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgc2l6ZV90CitmcmVhZF91bmxvY2tlZCAodm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fc2l6ZSwgc2l6ZV90IF9fbiwKKwkJRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkKK3sKKyAgaWYgKF9fYm9zMCAoX19wdHIpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fc2l6ZSkKKwkgIHx8ICFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKQorCSAgfHwgKF9fc2l6ZSB8IF9fbikgPj0gKCgoc2l6ZV90KSAxKSA8PCAoOCAqIHNpemVvZiAoc2l6ZV90KSAvIDIpKSkKKwlyZXR1cm4gX19mcmVhZF91bmxvY2tlZF9jaGsgKF9fcHRyLCBfX2JvczAgKF9fcHRyKSwgX19zaXplLCBfX24sCisJCQkJICAgICBfX3N0cmVhbSk7CisKKyAgICAgIGlmIChfX3NpemUgKiBfX24gPiBfX2JvczAgKF9fcHRyKSkKKwlyZXR1cm4gX19mcmVhZF91bmxvY2tlZF9jaGtfd2FybiAoX19wdHIsIF9fYm9zMCAoX19wdHIpLCBfX3NpemUsIF9fbiwKKwkJCQkJICBfX3N0cmVhbSk7CisgICAgfQorCisjIGlmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCisgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19zaXplKQorICAgICAgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKF9fbikKKyAgICAgICYmIChfX3NpemUgfCBfX24pIDwgKCgoc2l6ZV90KSAxKSA8PCAoOCAqIHNpemVvZiAoc2l6ZV90KSAvIDIpKQorICAgICAgJiYgX19zaXplICogX19uIDw9IDgpCisgICAgeworICAgICAgc2l6ZV90IF9fY250ID0gX19zaXplICogX19uOworICAgICAgY2hhciAqX19jcHRyID0gKGNoYXIgKikgX19wdHI7CisgICAgICBpZiAoX19jbnQgPT0gMCkKKwlyZXR1cm4gMDsKKworICAgICAgZm9yICg7IF9fY250ID4gMDsgLS1fX2NudCkKKwl7CisJICBpbnQgX19jID0gX0lPX2dldGNfdW5sb2NrZWQgKF9fc3RyZWFtKTsKKwkgIGlmIChfX2MgPT0gRU9GKQorCSAgICBicmVhazsKKwkgICpfX2NwdHIrKyA9IF9fYzsKKwl9CisgICAgICByZXR1cm4gKF9fY3B0ciAtIChjaGFyICopIF9fcHRyKSAvIF9fc2l6ZTsKKyAgICB9CisjIGVuZGlmCisgIHJldHVybiBfX2ZyZWFkX3VubG9ja2VkX2FsaWFzIChfX3B0ciwgX19zaXplLCBfX24sIF9fc3RyZWFtKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RkaW9fbGltLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGRpb19saW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGVmNmI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RkaW9fbGltLmgKQEAgLTAsMCArMSw0MyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWYgIWRlZmluZWQgX1NURElPX0ggJiYgIWRlZmluZWQgX19uZWVkX0ZPUEVOX01BWCAmJiAhZGVmaW5lZCBfX25lZWRfSU9WX01BWAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zdGRpb19saW0uaD4gZGlyZWN0bHk7IHVzZSA8c3RkaW8uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmZGVmIF9TVERJT19ICisjIGRlZmluZSBMX3RtcG5hbSAyMAorIyBkZWZpbmUgVE1QX01BWCAyMzgzMjgKKyMgZGVmaW5lIEZJTEVOQU1FX01BWCA0MDk2CisKKyMgaWZkZWYgX19VU0VfUE9TSVgKKyMgIGRlZmluZSBMX2N0ZXJtaWQgOQorIyAgaWYgIWRlZmluZWQgX19VU0VfWE9QRU4ySyB8fCBkZWZpbmVkIF9fVVNFX0dOVQorIyAgIGRlZmluZSBMX2N1c2VyaWQgOQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX25lZWRfRk9QRU5fTUFYIHx8IGRlZmluZWQgX1NURElPX0gKKyMgdW5kZWYgIEZPUEVOX01BWAorIyBkZWZpbmUgRk9QRU5fTUFYIDE2CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19uZWVkX0lPVl9NQVggJiYgIWRlZmluZWQgSU9WX01BWAorIyBkZWZpbmUgSU9WX01BWCAxMDI0CisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0ZGxpYi1sZGJsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGRsaWItbGRibC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OGUxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGRsaWItbGRibC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qIC1tbG9uZy1kb3VibGUtNjQgY29tcGF0aWJpbGl0eSBtb2RlIGZvciA8c3RkbGliLmg+IGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1RETElCX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3RkbGliLWxkYmwuaD4gZGlyZWN0bHk7IHVzZSA8c3RkbGliLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZmRlZglfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorX19MREJMX1JFRElSMV9ERUNMIChzdHJ0b2xkLCBzdHJ0b2QpCitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorX19MREJMX1JFRElSMV9ERUNMIChzdHJ0b2xkX2wsIHN0cnRvZF9sKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorIyBpZmRlZiBfX1VTRV9NSVNDCitfX0xEQkxfUkVESVIxX0RFQ0wgKHFlY3Z0LCBlY3Z0KQorX19MREJMX1JFRElSMV9ERUNMIChxZmN2dCwgZmN2dCkKK19fTERCTF9SRURJUjFfREVDTCAocWdjdnQsIGdjdnQpCitfX0xEQkxfUkVESVIxX0RFQ0wgKHFlY3Z0X3IsIGVjdnRfcikKK19fTERCTF9SRURJUjFfREVDTCAocWZjdnRfciwgZmN2dF9yKQorIyBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGRsaWIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0ZGxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YWY1ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdGRsaWIuaApAQCAtMCwwICsxLDE1NiBAQAorLyogQ2hlY2tpbmcgbWFjcm9zIGZvciBzdGRsaWIgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVERMSUJfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zdGRsaWIuaD4gZGlyZWN0bHk7IHVzZSA8c3RkbGliLmg+IGluc3RlYWQuIgorI2VuZGlmCisKK2V4dGVybiBjaGFyICpfX3JlYWxwYXRoX2NoayAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSwKKwkJCSAgICAgY2hhciAqX19yZXN0cmljdCBfX3Jlc29sdmVkLAorCQkJICAgICBzaXplX3QgX19yZXNvbHZlZGxlbikgX19USFJPVyBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUX05USCAoX19yZWFscGF0aF9hbGlhcywKKwkJCSAgICAgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCQkgICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fcmVzb2x2ZWQpLCByZWFscGF0aCkgX193dXI7CitleHRlcm4gY2hhciAqX19SRURJUkVDVF9OVEggKF9fcmVhbHBhdGhfY2hrX3dhcm4sCisJCQkgICAgIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLAorCQkJICAgICAgY2hhciAqX19yZXN0cmljdCBfX3Jlc29sdmVkLAorCQkJICAgICAgc2l6ZV90IF9fcmVzb2x2ZWRsZW4pLCBfX3JlYWxwYXRoX2NoaykgX193dXIKKyAgICAgX193YXJuYXR0ciAoInNlY29uZCBhcmd1bWVudCBvZiByZWFscGF0aCBtdXN0IGJlIGVpdGhlciBOVUxMIG9yIGF0ICIKKwkJICJsZWFzdCBQQVRIX01BWCBieXRlcyBsb25nIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIGNoYXIgKgorX19OVEggKHJlYWxwYXRoIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLCBjaGFyICpfX3Jlc3RyaWN0IF9fcmVzb2x2ZWQpKQoreworICBpZiAoX19ib3MgKF9fcmVzb2x2ZWQpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyNpZiBkZWZpbmVkIF9MSUJDX0xJTUlUU19IXyAmJiBkZWZpbmVkIFBBVEhfTUFYCisgICAgICBpZiAoX19ib3MgKF9fcmVzb2x2ZWQpIDwgUEFUSF9NQVgpCisJcmV0dXJuIF9fcmVhbHBhdGhfY2hrX3dhcm4gKF9fbmFtZSwgX19yZXNvbHZlZCwgX19ib3MgKF9fcmVzb2x2ZWQpKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIF9fcmVhbHBhdGhfY2hrIChfX25hbWUsIF9fcmVzb2x2ZWQsIF9fYm9zIChfX3Jlc29sdmVkKSk7CisgICAgfQorCisgIHJldHVybiBfX3JlYWxwYXRoX2FsaWFzIChfX25hbWUsIF9fcmVzb2x2ZWQpOworfQorCisKK2V4dGVybiBpbnQgX19wdHNuYW1lX3JfY2hrIChpbnQgX19mZCwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICBzaXplX3QgX19ucmVhbCkgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX3B0c25hbWVfcl9hbGlhcywgKGludCBfX2ZkLCBjaGFyICpfX2J1ZiwKKwkJCQkJICAgICAgIHNpemVfdCBfX2J1ZmxlbiksIHB0c25hbWVfcikKKyAgICAgX19ub25udWxsICgoMikpOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX19wdHNuYW1lX3JfY2hrX3dhcm4sCisJCQkgICAoaW50IF9fZmQsIGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4sCisJCQkgICAgc2l6ZV90IF9fbnJlYWwpLCBfX3B0c25hbWVfcl9jaGspCisgICAgIF9fbm9ubnVsbCAoKDIpKSBfX3dhcm5hdHRyICgicHRzbmFtZV9yIGNhbGxlZCB3aXRoIGJ1ZmxlbiBiaWdnZXIgdGhhbiAiCisJCQkJICJzaXplIG9mIGJ1ZiIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKHB0c25hbWVfciAoaW50IF9fZmQsIGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4pKQoreworICBpZiAoX19ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2J1ZmxlbikpCisJcmV0dXJuIF9fcHRzbmFtZV9yX2NoayAoX19mZCwgX19idWYsIF9fYnVmbGVuLCBfX2JvcyAoX19idWYpKTsKKyAgICAgIGlmIChfX2J1ZmxlbiA+IF9fYm9zIChfX2J1ZikpCisJcmV0dXJuIF9fcHRzbmFtZV9yX2Noa193YXJuIChfX2ZkLCBfX2J1ZiwgX19idWZsZW4sIF9fYm9zIChfX2J1ZikpOworICAgIH0KKyAgcmV0dXJuIF9fcHRzbmFtZV9yX2FsaWFzIChfX2ZkLCBfX2J1ZiwgX19idWZsZW4pOworfQorCisKK2V4dGVybiBpbnQgX193Y3RvbWJfY2hrIChjaGFyICpfX3MsIHdjaGFyX3QgX193Y2hhciwgc2l6ZV90IF9fYnVmbGVuKQorICBfX1RIUk9XIF9fd3VyOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX193Y3RvbWJfYWxpYXMsIChjaGFyICpfX3MsIHdjaGFyX3QgX193Y2hhciksCisJCQkgICB3Y3RvbWIpIF9fd3VyOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIGludAorX19OVEggKHdjdG9tYiAoY2hhciAqX19zLCB3Y2hhcl90IF9fd2NoYXIpKQoreworICAvKiBXZSB3b3VsZCBoYXZlIHRvIGluY2x1ZGUgPGxpbWl0cy5oPiB0byBnZXQgYSBkZWZpbml0aW9uIG9mIE1CX0xFTl9NQVguCisgICAgIEJ1dCB0aGlzIHdvdWxkIG9ubHkgZGlzdHVyYiB0aGUgbmFtZXNwYWNlLiAgU28gd2UgZGVmaW5lIG91ciBvd24KKyAgICAgdmVyc2lvbiBoZXJlLiAgKi8KKyNkZWZpbmUgX19TVERMSUJfTUJfTEVOX01BWAkxNgorI2lmIGRlZmluZWQgTUJfTEVOX01BWCAmJiBNQl9MRU5fTUFYICE9IF9fU1RETElCX01CX0xFTl9NQVgKKyMgZXJyb3IgIkFzc3VtZWQgdmFsdWUgb2YgTUJfTEVOX01BWCB3cm9uZyIKKyNlbmRpZgorICBpZiAoX19ib3MgKF9fcykgIT0gKHNpemVfdCkgLTEgJiYgX19TVERMSUJfTUJfTEVOX01BWCA+IF9fYm9zIChfX3MpKQorICAgIHJldHVybiBfX3djdG9tYl9jaGsgKF9fcywgX193Y2hhciwgX19ib3MgKF9fcykpOworICByZXR1cm4gX193Y3RvbWJfYWxpYXMgKF9fcywgX193Y2hhcik7Cit9CisKKworZXh0ZXJuIHNpemVfdCBfX21ic3Rvd2NzX2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgIHNpemVfdCBfX2xlbiwgc2l6ZV90IF9fZHN0bGVuKSBfX1RIUk9XOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX19tYnN0b3djc19hbGlhcywKKwkJCSAgICAgICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgICBzaXplX3QgX19sZW4pLCBtYnN0b3djcyk7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX21ic3Rvd2NzX2Noa193YXJuLAorCQkJICAgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiwgc2l6ZV90IF9fZHN0bGVuKSwgX19tYnN0b3djc19jaGspCisgICAgIF9fd2FybmF0dHIgKCJtYnN0b3djcyBjYWxsZWQgd2l0aCBkc3QgYnVmZmVyIHNtYWxsZXIgdGhhbiBsZW4gIgorCQkgIiogc2l6ZW9mICh3Y2hhcl90KSIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHNpemVfdAorX19OVEggKG1ic3Rvd2NzICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMsCisJCSBzaXplX3QgX19sZW4pKQoreworICBpZiAoX19ib3MgKF9fZHN0KSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2xlbikpCisJcmV0dXJuIF9fbWJzdG93Y3NfY2hrIChfX2RzdCwgX19zcmMsIF9fbGVuLAorCQkJICAgICAgIF9fYm9zIChfX2RzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKworICAgICAgaWYgKF9fbGVuID4gX19ib3MgKF9fZHN0KSAvIHNpemVvZiAod2NoYXJfdCkpCisJcmV0dXJuIF9fbWJzdG93Y3NfY2hrX3dhcm4gKF9fZHN0LCBfX3NyYywgX19sZW4sCisJCQkJICAgICBfX2JvcyAoX19kc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX19tYnN0b3djc19hbGlhcyAoX19kc3QsIF9fc3JjLCBfX2xlbik7Cit9CisKKworZXh0ZXJuIHNpemVfdCBfX3djc3RvbWJzX2NoayAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgIHNpemVfdCBfX2xlbiwgc2l6ZV90IF9fZHN0bGVuKSBfX1RIUk9XOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX193Y3N0b21ic19hbGlhcywKKwkJCSAgICAgIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgICBzaXplX3QgX19sZW4pLCB3Y3N0b21icyk7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3djc3RvbWJzX2Noa193YXJuLAorCQkJICAgICAgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiwgc2l6ZV90IF9fZHN0bGVuKSwgX193Y3N0b21ic19jaGspCisgICAgIF9fd2FybmF0dHIgKCJ3Y3N0b21icyBjYWxsZWQgd2l0aCBkc3QgYnVmZmVyIHNtYWxsZXIgdGhhbiBsZW4iKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBzaXplX3QKK19fTlRIICh3Y3N0b21icyAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkgc2l6ZV90IF9fbGVuKSkKK3sKKyAgaWYgKF9fYm9zIChfX2RzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19sZW4pKQorCXJldHVybiBfX3djc3RvbWJzX2NoayAoX19kc3QsIF9fc3JjLCBfX2xlbiwgX19ib3MgKF9fZHN0KSk7CisgICAgICBpZiAoX19sZW4gPiBfX2JvcyAoX19kc3QpKQorCXJldHVybiBfX3djc3RvbWJzX2Noa193YXJuIChfX2RzdCwgX19zcmMsIF9fbGVuLCBfX2JvcyAoX19kc3QpKTsKKyAgICB9CisgIHJldHVybiBfX3djc3RvbWJzX2FsaWFzIChfX2RzdCwgX19zcmMsIF9fbGVuKTsKK30KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0cmluZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA4Y2U3OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0cmluZy5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIE9wdGltaXplZCwgaW5saW5lZCBzdHJpbmcgZnVuY3Rpb25zLiAgQU1EIHg4Ni02NCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVFJJTkdfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL3N0cmluZy5oPiBkaXJlY3RseTsgaW5jbHVkZSA8c3RyaW5nLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIEN1cnJlbnRseSB0aGUgb25seSBwdXJwb3NlIG9mIHRoaXMgZmlsZSBpcyB0byB0ZWxsIHRoZSBnZW5lcmljIGlubGluZQorICAgbWFjcm9zIHRoYXQgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgaXMgcG9zc2libGUgZm9yIHg4Ni02NC4gICovCisjZGVmaW5lIF9TVFJJTkdfQVJDSF91bmFsaWduZWQJMQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RyaW5nMi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3RyaW5nMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OThhY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdHJpbmcyLmgKQEAgLTAsMCArMSwxMzU0IEBACisvKiBNYWNoaW5lLWluZGVwZW5kYW50IHN0cmluZyBmdW5jdGlvbiBvcHRpbWl6YXRpb25zLgorICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDMsIDIwMDQsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk3LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1RSSU5HX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9zdHJpbmcyLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzdHJpbmcuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmICFkZWZpbmVkIF9fTk9fU1RSSU5HX0lOTElORVMgJiYgIWRlZmluZWQgX19CT1VOREVEX1BPSU5URVJTX18KKworLyogVW5saWtlIHRoZSBkZWZpbml0aW9ucyBpbiB0aGUgaGVhZGVyIDxiaXRzL3N0cmluZy5oPiB0aGUKKyAgIGRlZmluaXRpb25zIGNvbnRhaW5lZCBoZXJlIGFyZSBub3Qgb3B0aW1pemVkIGRvd24gdG8gYXNzZW1ibGVyCisgICBsZXZlbC4gIFRob3NlIG9wdGltaXphdGlvbnMgYXJlIG5vdCBhbHdheXMgYSBnb29kIGlkZWEgc2luY2UgdGhpcworICAgbWVhbnMgdGhlIGNvZGUgc2l6ZSBpbmNyZWFzZXMgYSBsb3QuICBJbnN0ZWFkIHRoZSBkZWZpbml0aW9ucyBoZXJlCisgICBvcHRpbWl6ZSBzb21lIGZ1bmN0aW9ucyBpbiBhIHdheSB3aGljaCBkbyBub3QgZHJhbWF0aWNhbGx5CisgICBpbmNyZWFzZSB0aGUgY29kZSBzaXplIGFuZCB3aGljaCBkbyBub3QgdXNlIGFzc2VtYmxlci4gIFRoZSBtYWluCisgICB0cmljayBpcyB0byB1c2UgR0NDJ3MgYF9fYnVpbHRpbl9jb25zdGFudF9wJyBmdW5jdGlvbi4KKworICAgRXZlcnkgZnVuY3Rpb24gWFhYIHdoaWNoIGhhcyBhIGRlZmluZWQgdmVyc2lvbiBpbgorICAgPGJpdHMvc3RyaW5nLmg+IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBzeW1ib2wgX0hBVkVfU1RSSU5HX0FSQ0hfWFhYCisgICB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IHJlZGVmaW5pdGlvbnMuCisKKyAgIFdlIG11c3QgdXNlIGhlcmUgbWFjcm9zIGluc3RlYWQgb2YgaW5saW5lIGZ1bmN0aW9ucyBzaW5jZSB0aGUKKyAgIHRyaWNrIHdvbid0IHdvcmsgd2l0aCB0aGUgbGF0dGVyLiAgKi8KKworI2lmbmRlZiBfX1NUUklOR19JTkxJTkUKKyMgaWZkZWYgX19jcGx1c3BsdXMKKyMgIGRlZmluZSBfX1NUUklOR19JTkxJTkUgaW5saW5lCisjIGVsc2UKKyMgIGRlZmluZSBfX1NUUklOR19JTkxJTkUgX19leHRlcm5faW5saW5lCisjIGVuZGlmCisjZW5kaWYKKworI2lmIF9TVFJJTkdfQVJDSF91bmFsaWduZWQKKy8qIElmIHdlIGNhbiBkbyB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzIHdlIG11c3Qga25vdyB0aGUgZW5kaWFuZXNzLiAgKi8KKyMgaW5jbHVkZSA8ZW5kaWFuLmg+CisjIGluY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworIyBpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjICBkZWZpbmUgX19TVFJJTkcyX1NNQUxMX0dFVDE2KHNyYywgaWR4KSBcCisgICAgICgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHggKyAxXSA8PCA4CSAgICAgIFwKKyAgICAgIHwgKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbaWR4XSkKKyMgIGRlZmluZSBfX1NUUklORzJfU01BTExfR0VUMzIoc3JjLCBpZHgpIFwKKyAgICAgKCgoKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbaWR4ICsgM10gPDwgOCAgICAgIFwKKwl8ICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHNyYykpW2lkeCArIDJdKSA8PCA4ICAgXAorICAgICAgIHwgKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbaWR4ICsgMV0pIDw8IDggICAgXAorICAgICAgfCAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHhdKQorIyBlbHNlCisjICBkZWZpbmUgX19TVFJJTkcyX1NNQUxMX0dFVDE2KHNyYywgaWR4KSBcCisgICAgICgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHhdIDw8IDgJICAgICAgXAorICAgICAgfCAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHggKyAxXSkKKyMgIGRlZmluZSBfX1NUUklORzJfU01BTExfR0VUMzIoc3JjLCBpZHgpIFwKKyAgICAgKCgoKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbaWR4XSA8PCA4CSAgICAgIFwKKwl8ICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHNyYykpW2lkeCArIDFdKSA8PCA4ICAgXAorICAgICAgIHwgKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbaWR4ICsgMl0pIDw8IDggICAgXAorICAgICAgfCAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHggKyAzXSkKKyMgZW5kaWYKKyNlbHNlCisvKiBUaGVzZSBhcmUgYSBmZXcgdHlwZXMgd2UgbmVlZCBmb3IgdGhlIG9wdGltaXphdGlvbnMgaWYgd2UgY2Fubm90CisgICB1c2UgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3Nlcy4gICovCisjIGRlZmluZSBfX1NUUklORzJfQ09QWV9UWVBFKE4pIFwKKyAgdHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBjaGFyIF9fYXJyW05dOyB9CQkJCSAgICAgIFwKKyAgICBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIF9fU1RSSU5HMl9DT1BZX0FSUiMjTgorX19TVFJJTkcyX0NPUFlfVFlQRSAoMik7CitfX1NUUklORzJfQ09QWV9UWVBFICgzKTsKK19fU1RSSU5HMl9DT1BZX1RZUEUgKDQpOworX19TVFJJTkcyX0NPUFlfVFlQRSAoNSk7CitfX1NUUklORzJfQ09QWV9UWVBFICg2KTsKK19fU1RSSU5HMl9DT1BZX1RZUEUgKDcpOworX19TVFJJTkcyX0NPUFlfVFlQRSAoOCk7CisjIHVuZGVmIF9fU1RSSU5HMl9DT1BZX1RZUEUKKyNlbmRpZgorCisvKiBEZXJlZmVyZW5jaW5nIGEgcG9pbnRlciBhcmcgdG8gcnVuIHNpemVvZiBvbiBpdCBmYWlscyBmb3IgdGhlIHZvaWQKKyAgIHBvaW50ZXIgY2FzZSwgc28gd2UgdXNlIHRoaXMgaW5zdGVhZC4KKyAgIE5vdGUgdGhhdCBfX3ggaXMgZXZhbHVhdGVkIHR3aWNlLiAqLworI2RlZmluZSBfX3N0cmluZzJfMWJwdHJfcChfX3gpIFwKKyAgKChzaXplX3QpKGNvbnN0IHZvaWQgKikoKF9feCkgKyAxKSAtIChzaXplX3QpKGNvbnN0IHZvaWQgKikoX194KSA9PSAxKQorCisvKiBTZXQgTiBieXRlcyBvZiBTIHRvIEMuICAqLworI2lmICFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX21lbXNldAorIyBpZiAhX19HTlVDX1BSRVJFUSAoMywgMCkKKyMgIGlmIF9TVFJJTkdfQVJDSF91bmFsaWduZWQKKyMgICBkZWZpbmUgbWVtc2V0KHMsIGMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChuKSAmJiAobikgPD0gMTYJCQkgICAgICBcCisJCSAgPyAoKG4pID09IDEJCQkJCQkgICAgICBcCisJCSAgICAgPyBfX21lbXNldF8xIChzLCBjKQkJCQkgICAgICBcCisJCSAgICAgOiBfX21lbXNldF9nYyAocywgYywgbikpCQkJCSAgICAgIFwKKwkJICA6IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYykgJiYgKGMpID09ICdcMCcJCSAgICAgIFwKKwkJICAgICA/ICh7IHZvaWQgKl9fcyA9IChzKTsgX19iemVybyAoX19zLCBuKTsgX19zOyB9KQkgICAgICBcCisJCSAgICAgOiBtZW1zZXQgKHMsIGMsIG4pKSkpCisKKyMgICBkZWZpbmUgX19tZW1zZXRfMShzLCBjKSAoeyB2b2lkICpfX3MgPSAocyk7CQkJCSAgICAgIFwKKwkJCSAgICAqKChfX3VpbnQ4X3QgKikgX19zKSA9IChfX3VpbnQ4X3QpIGM7IF9fczsgfSkKKworIyAgIGRlZmluZSBfX21lbXNldF9nYyhzLCBjLCBuKSBcCisgICh7IHZvaWQgKl9fcyA9IChzKTsJCQkJCQkJICAgICAgXAorICAgICB1bmlvbiB7CQkJCQkJCQkgICAgICBcCisgICAgICAgdW5zaWduZWQgaW50IF9fdWk7CQkJCQkJICAgICAgXAorICAgICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3VzaTsJCQkJCSAgICAgIFwKKyAgICAgICB1bnNpZ25lZCBjaGFyIF9fdWM7CQkJCQkJICAgICAgXAorICAgICB9ICpfX3UgPSBfX3M7CQkJCQkJCSAgICAgIFwKKyAgICAgX191aW50OF90IF9fYyA9IChfX3VpbnQ4X3QpIChjKTsJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKyAgICAgLyogVGhpcyBgc3dpdGNoJyBzdGF0ZW1lbnQgd2lsbCBiZSByZW1vdmVkIGF0IGNvbXBpbGUtdGltZS4gICovCSAgICAgIFwKKyAgICAgc3dpdGNoICgodW5zaWduZWQgaW50KSAobikpCQkJCQkgICAgICBcCisgICAgICAgewkJCQkJCQkJICAgICAgXAorICAgICAgIGNhc2UgMTU6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDExOgkJCQkJCQkJICAgICAgXAorCSBfX3UtPl9fdWkgPSBfX2MgKiAweDAxMDEwMTAxOwkJCQkJICAgICAgXAorCSBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsJCQkgICAgICBcCisgICAgICAgY2FzZSA3OgkJCQkJCQkJICAgICAgXAorCSBfX3UtPl9fdWkgPSBfX2MgKiAweDAxMDEwMTAxOwkJCQkJICAgICAgXAorCSBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsJCQkgICAgICBcCisgICAgICAgY2FzZSAzOgkJCQkJCQkJICAgICAgXAorCSBfX3UtPl9fdXNpID0gKHVuc2lnbmVkIHNob3J0IGludCkgX19jICogMHgwMTAxOwkJICAgICAgXAorCSBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAyKTsJCQkgICAgICBcCisJIF9fdS0+X191YyA9ICh1bnNpZ25lZCBjaGFyKSBfX2M7CQkJCSAgICAgIFwKKwkgYnJlYWs7CQkJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgICAgY2FzZSAxNDoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgMTA6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDY6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDI6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191c2kgPSAodW5zaWduZWQgc2hvcnQgaW50KSBfX2MgKiAweDAxMDE7CQkgICAgICBcCisJIGJyZWFrOwkJCQkJCQkJICAgICAgXAorCQkJCQkJCQkJICAgICAgXAorICAgICAgIGNhc2UgMTM6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDk6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDU6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDE6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191YyA9ICh1bnNpZ25lZCBjaGFyKSBfX2M7CQkJCSAgICAgIFwKKwkgYnJlYWs7CQkJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgICAgY2FzZSAxNjoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgMTI6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDg6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDQ6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisgICAgICAgY2FzZSAwOgkJCQkJCQkJICAgICAgXAorCSBicmVhazsJCQkJCQkJCSAgICAgIFwKKyAgICAgICB9CQkJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgIF9fczsgfSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgbWVtc2V0KHMsIGMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChjKSAmJiAoYykgPT0gJ1wwJwkJICAgICAgXAorCQkgID8gKHsgdm9pZCAqX19zID0gKHMpOyBfX2J6ZXJvIChfX3MsIG4pOyBfX3M7IH0pCSAgICAgIFwKKwkJICA6IG1lbXNldCAocywgYywgbikpKQorIyAgZW5kaWYKKyMgZW5kaWYKKworLyogR0NDIDwgMy4wIG9wdGltaXplcyBtZW1zZXQocywgMCwgbikgYnV0IG5vdCBiemVybyhzLCBuKS4KKyAgIFRoZSBvcHRpbWl6YXRpb24gaXMgYnJva2VuIGJlZm9yZSBFR0NTIDEuMS4KKyAgIEdDQyAzLjArIGhhcyBfX2J1aWx0aW5fYnplcm8gYXMgd2VsbCwgYnV0IGF0IGxlYXN0IHRpbGwgR0NDIDMuNAorICAgaWYgaXQgZGVjaWRlcyB0byBjYWxsIHRoZSBsaWJyYXJ5IGZ1bmN0aW9uLCBpdCBjYWxscyBtZW1zZXQKKyAgIGFuZCBub3QgYnplcm8uICAqLworIyBpZiBfX0dOVUNfUFJFUkVRICgyLCA5MSkKKyMgIGRlZmluZSBfX2J6ZXJvKHMsIG4pIF9fYnVpbHRpbl9tZW1zZXQgKHMsICdcMCcsIG4pCisjIGVuZGlmCisKKyNlbmRpZgorCisKKy8qIENvcHkgTiBieXRlcyBmcm9tIFNSQyB0byBERVNULCByZXR1cm5pbmcgcG9pbnRlciB0byBieXRlIGZvbGxvd2luZyB0aGUKKyAgIGxhc3QgY29waWVkLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgaWYgIWRlZmluZWQgX0hBVkVfU1RSSU5HX0FSQ0hfbWVtcGNweSB8fCBkZWZpbmVkIF9GT1JDRV9JTkxJTkVTCisjICBpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfbWVtcGNweQorIyAgIGlmIF9fR05VQ19QUkVSRVEgKDMsIDQpCisjICAgIGRlZmluZSBfX21lbXBjcHkoZGVzdCwgc3JjLCBuKSBfX2J1aWx0aW5fbWVtcGNweSAoZGVzdCwgc3JjLCBuKQorIyAgIGVsaWYgX19HTlVDX1BSRVJFUSAoMywgMCkKKyMgICAgZGVmaW5lIF9fbWVtcGNweShkZXN0LCBzcmMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzcmMpICYmIF9fYnVpbHRpbl9jb25zdGFudF9wIChuKSAgICAgIFwKKwkJICAmJiBfX3N0cmluZzJfMWJwdHJfcCAoc3JjKSAmJiBuIDw9IDgJCQkgICAgICBcCisJCSAgPyBfX2J1aWx0aW5fbWVtY3B5IChkZXN0LCBzcmMsIG4pICsgKG4pCQkgICAgICBcCisJCSAgOiBfX21lbXBjcHkgKGRlc3QsIHNyYywgbikpKQorIyAgIGVsc2UKKyMgICAgZGVmaW5lIF9fbWVtcGNweShkZXN0LCBzcmMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzcmMpICYmIF9fYnVpbHRpbl9jb25zdGFudF9wIChuKSAgICAgIFwKKwkJICAmJiBfX3N0cmluZzJfMWJwdHJfcCAoc3JjKSAmJiBuIDw9IDgJCQkgICAgICBcCisJCSAgPyBfX21lbXBjcHlfc21hbGwgKGRlc3QsIF9fbWVtcGNweV9hcmdzIChzcmMpLCBuKQkgICAgICBcCisJCSAgOiBfX21lbXBjcHkgKGRlc3QsIHNyYywgbikpKQorIyAgIGVuZGlmCisvKiBJbiBnbGliYyB3ZSB1c2UgdGhpcyBmdW5jdGlvbiBmcmVxdWVudGx5IGJ1dCBmb3IgbmFtZXNwYWNlIHJlYXNvbnMKKyAgIHdlIGhhdmUgdG8gdXNlIHRoZSBuYW1lIGBfX21lbXBjcHknLiAgKi8KKyMgICBkZWZpbmUgbWVtcGNweShkZXN0LCBzcmMsIG4pIF9fbWVtcGNweSAoZGVzdCwgc3JjLCBuKQorIyAgZW5kaWYKKworIyAgaWYgIV9fR05VQ19QUkVSRVEgKDMsIDApIHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgICBpZiBfU1RSSU5HX0FSQ0hfdW5hbGlnbmVkCisjICAgIGlmbmRlZiBfRk9SQ0VfSU5MSU5FUworIyAgICAgZGVmaW5lIF9fbWVtcGNweV9hcmdzKHNyYykgXAorICAgICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwJCSAgICAgIFwKKyAgICAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzRdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNl0sCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDE2IChzcmMsIDApLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyBfX1NUUklORzJfU01BTExfR0VUMTYgKHNyYywgNCksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fIF9fU1RSSU5HMl9TTUFMTF9HRVQzMiAoc3JjLCAwKSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDMyIChzcmMsIDQpCisjICAgIGVuZGlmCitfX1NUUklOR19JTkxJTkUgdm9pZCAqX19tZW1wY3B5X3NtYWxsICh2b2lkICosIGNoYXIsIGNoYXIsIGNoYXIsIGNoYXIsCisJCQkJICAgICAgIF9fdWludDE2X3QsIF9fdWludDE2X3QsIF9fdWludDMyX3QsCisJCQkJICAgICAgIF9fdWludDMyX3QsIHNpemVfdCk7CitfX1NUUklOR19JTkxJTkUgdm9pZCAqCitfX21lbXBjcHlfc21hbGwgKHZvaWQgKl9fZGVzdDEsCisJCSBjaGFyIF9fc3JjMF8xLCBjaGFyIF9fc3JjMl8xLCBjaGFyIF9fc3JjNF8xLCBjaGFyIF9fc3JjNl8xLAorCQkgX191aW50MTZfdCBfX3NyYzBfMiwgX191aW50MTZfdCBfX3NyYzRfMiwKKwkJIF9fdWludDMyX3QgX19zcmMwXzQsIF9fdWludDMyX3QgX19zcmM0XzQsCisJCSBzaXplX3QgX19zcmNsZW4pCit7CisgIHVuaW9uIHsKKyAgICBfX3VpbnQzMl90IF9fdWk7CisgICAgX191aW50MTZfdCBfX3VzaTsKKyAgICB1bnNpZ25lZCBjaGFyIF9fdWM7CisgICAgdW5zaWduZWQgY2hhciBfX2M7CisgIH0gKl9fdSA9IF9fZGVzdDE7CisgIHN3aXRjaCAoKHVuc2lnbmVkIGludCkgX19zcmNsZW4pCisgICAgeworICAgIGNhc2UgMToKKyAgICAgIF9fdS0+X19jID0gX19zcmMwXzE7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIF9fdS0+X191c2kgPSBfX3NyYzBfMjsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgX191LT5fX3VzaSA9IF9fc3JjMF8yOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMik7CisgICAgICBfX3UtPl9fYyA9IF9fc3JjMl8xOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X19jID0gX19zcmM0XzE7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBfX3UtPl9fdXNpID0gX19zcmM0XzI7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBfX3UtPl9fdXNpID0gX19zcmM0XzI7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAyKTsKKyAgICAgIF9fdS0+X19jID0gX19zcmM2XzE7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzRfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gKHZvaWQgKikgX191OworfQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIF9GT1JDRV9JTkxJTkVTCisjICAgICBkZWZpbmUgX19tZW1wY3B5X2FyZ3Moc3JjKSBcCisgICAgICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwJCQkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjIpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSB9IH0pLCAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjMpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdIH0gfSksCQkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjQpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbM10gfSB9KSwgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI1KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0gfSB9KSwJCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSNikJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzRdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNV0gfSB9KSwgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI3KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVs1XSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzZdIH0gfSksCQkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjgpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbM10sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVs0XSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzVdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVs3XSB9IH0pCisjICAgIGVuZGlmCitfX1NUUklOR19JTkxJTkUgdm9pZCAqX19tZW1wY3B5X3NtYWxsICh2b2lkICosIGNoYXIsIF9fU1RSSU5HMl9DT1BZX0FSUjIsCisJCQkJICAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjMsCisJCQkJICAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjQsCisJCQkJICAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjUsCisJCQkJICAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjYsCisJCQkJICAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjcsCisJCQkJICAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjgsIHNpemVfdCk7CitfX1NUUklOR19JTkxJTkUgdm9pZCAqCitfX21lbXBjcHlfc21hbGwgKHZvaWQgKl9fZGVzdCwgY2hhciBfX3NyYzEsCisJCSBfX1NUUklORzJfQ09QWV9BUlIyIF9fc3JjMiwgX19TVFJJTkcyX0NPUFlfQVJSMyBfX3NyYzMsCisJCSBfX1NUUklORzJfQ09QWV9BUlI0IF9fc3JjNCwgX19TVFJJTkcyX0NPUFlfQVJSNSBfX3NyYzUsCisJCSBfX1NUUklORzJfQ09QWV9BUlI2IF9fc3JjNiwgX19TVFJJTkcyX0NPUFlfQVJSNyBfX3NyYzcsCisJCSBfX1NUUklORzJfQ09QWV9BUlI4IF9fc3JjOCwgc2l6ZV90IF9fc3JjbGVuKQoreworICB1bmlvbiB7CisgICAgY2hhciBfX2M7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSMiBfX3NjYTI7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSMyBfX3NjYTM7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSNCBfX3NjYTQ7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSNSBfX3NjYTU7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSNiBfX3NjYTY7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSNyBfX3NjYTc7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSOCBfX3NjYTg7CisgIH0gKl9fdSA9IF9fZGVzdDsKKyAgc3dpdGNoICgodW5zaWduZWQgaW50KSBfX3NyY2xlbikKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgX191LT5fX2MgPSBfX3NyYzE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2EyID0gX19zcmMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhMyA9IF9fc3JjMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTQgPSBfX3NyYzQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E1ID0gX19zcmM1OworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNiA9IF9fc3JjNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTcgPSBfX3NyYzc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E4ID0gX19zcmM4OworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgX19zcmNsZW4pOworfQorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKworLyogUmV0dXJuIHBvaW50ZXIgdG8gQyBpbiBTLiAgKi8KKyNpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfc3RyY2hyCitleHRlcm4gdm9pZCAqX19yYXdtZW1jaHIgKGNvbnN0IHZvaWQgKl9fcywgaW50IF9fYyk7CisjIGlmIF9fR05VQ19QUkVSRVEgKDMsIDIpCisjICBkZWZpbmUgc3RyY2hyKHMsIGMpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChjKSAmJiAhX19idWlsdGluX2NvbnN0YW50X3AgKHMpCSAgICAgIFwKKwkJICAmJiAoYykgPT0gJ1wwJwkJCQkJICAgICAgXAorCQkgID8gKGNoYXIgKikgX19yYXdtZW1jaHIgKHMsIGMpCQkJCSAgICAgIFwKKwkJICA6IF9fYnVpbHRpbl9zdHJjaHIgKHMsIGMpKSkKKyMgZWxzZQorIyAgZGVmaW5lIHN0cmNocihzLCBjKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYykgJiYgKGMpID09ICdcMCcJCSAgICAgIFwKKwkJICA/IChjaGFyICopIF9fcmF3bWVtY2hyIChzLCBjKQkJCQkgICAgICBcCisJCSAgOiBzdHJjaHIgKHMsIGMpKSkKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIENvcHkgU1JDIHRvIERFU1QuICAqLworI2lmICghZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJjcHkgJiYgIV9fR05VQ19QUkVSRVEgKDMsIDApKSBcCisgICAgfHwgZGVmaW5lZCBfRk9SQ0VfSU5MSU5FUworIyBpZiAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJjcHkgJiYgIV9fR05VQ19QUkVSRVEgKDMsIDApCisjICBkZWZpbmUgc3RyY3B5KGRlc3QsIHNyYykgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHNyYykJCQkJICAgICAgXAorCQkgID8gKF9fc3RyaW5nMl8xYnB0cl9wIChzcmMpICYmIHN0cmxlbiAoc3JjKSArIDEgPD0gOAkgICAgICBcCisJCSAgICAgPyBfX3N0cmNweV9zbWFsbCAoZGVzdCwgX19zdHJjcHlfYXJncyAoc3JjKSwJICAgICAgXAorCQkJCSAgICAgICBzdHJsZW4gKHNyYykgKyAxKQkJICAgICAgXAorCQkgICAgIDogKGNoYXIgKikgbWVtY3B5IChkZXN0LCBzcmMsIHN0cmxlbiAoc3JjKSArIDEpKQkgICAgICBcCisJCSAgOiBzdHJjcHkgKGRlc3QsIHNyYykpKQorIyBlbmRpZgorCisjIGlmIF9TVFJJTkdfQVJDSF91bmFsaWduZWQKKyMgIGlmbmRlZiBfRk9SQ0VfSU5MSU5FUworIyAgIGRlZmluZSBfX3N0cmNweV9hcmdzKHNyYykgXAorICAgICBfX2V4dGVuc2lvbl9fIF9fU1RSSU5HMl9TTUFMTF9HRVQxNiAoc3JjLCAwKSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDE2IChzcmMsIDQpLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyBfX1NUUklORzJfU01BTExfR0VUMzIgKHNyYywgMCksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fIF9fU1RSSU5HMl9TTUFMTF9HRVQzMiAoc3JjLCA0KQorIyAgZW5kaWYKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cmNweV9zbWFsbCAoY2hhciAqLCBfX3VpbnQxNl90LCBfX3VpbnQxNl90LAorCQkJCSAgICAgIF9fdWludDMyX3QsIF9fdWludDMyX3QsIHNpemVfdCk7CitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cmNweV9zbWFsbCAoY2hhciAqX19kZXN0LAorCQlfX3VpbnQxNl90IF9fc3JjMF8yLCBfX3VpbnQxNl90IF9fc3JjNF8yLAorCQlfX3VpbnQzMl90IF9fc3JjMF80LCBfX3VpbnQzMl90IF9fc3JjNF80LAorCQlzaXplX3QgX19zcmNsZW4pCit7CisgIHVuaW9uIHsKKyAgICBfX3VpbnQzMl90IF9fdWk7CisgICAgX191aW50MTZfdCBfX3VzaTsKKyAgICB1bnNpZ25lZCBjaGFyIF9fdWM7CisgIH0gKl9fdSA9ICh2b2lkICopIF9fZGVzdDsKKyAgc3dpdGNoICgodW5zaWduZWQgaW50KSBfX3NyY2xlbikKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgX191LT5fX3VjID0gJ1wwJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIF9fdS0+X191c2kgPSBfX3NyYzBfMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIF9fdS0+X191c2kgPSBfX3NyYzBfMjsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOworICAgICAgX191LT5fX3VjID0gJ1wwJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X191YyA9ICdcMCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgX191LT5fX3VzaSA9IF9fc3JjNF8yOworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X191c2kgPSBfX3NyYzRfMjsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOworICAgICAgX191LT5fX3VjID0gJ1wwJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzRfNDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIF9fZGVzdDsKK30KKyMgZWxzZQorIyAgaWZuZGVmIF9GT1JDRV9JTkxJTkVTCisjICAgZGVmaW5lIF9fc3RyY3B5X2FyZ3Moc3JjKSBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlIyKQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAnXDAnIH0gfSksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSMykJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAnXDAnIH0gfSksCQkJCQkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjQpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAnXDAnIH0gfSksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSNSkJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSwJICAgICAgXAorCSAgJ1wwJyB9IH0pLAkJCQkJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI2KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICdcMCcgfSB9KSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI3KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVs1XSwJICAgICAgXAorCSAgJ1wwJyB9IH0pLAkJCQkJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI4KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVs1XSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzZdLCAnXDAnIH0gfSkKKyMgIGVuZGlmCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJjcHlfc21hbGwgKGNoYXIgKiwgX19TVFJJTkcyX0NPUFlfQVJSMiwKKwkJCQkgICAgICBfX1NUUklORzJfQ09QWV9BUlIzLAorCQkJCSAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjQsCisJCQkJICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNSwKKwkJCQkgICAgICBfX1NUUklORzJfQ09QWV9BUlI2LAorCQkJCSAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjcsCisJCQkJICAgICAgX19TVFJJTkcyX0NPUFlfQVJSOCwgc2l6ZV90KTsKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RyY3B5X3NtYWxsIChjaGFyICpfX2Rlc3QsCisJCV9fU1RSSU5HMl9DT1BZX0FSUjIgX19zcmMyLCBfX1NUUklORzJfQ09QWV9BUlIzIF9fc3JjMywKKwkJX19TVFJJTkcyX0NPUFlfQVJSNCBfX3NyYzQsIF9fU1RSSU5HMl9DT1BZX0FSUjUgX19zcmM1LAorCQlfX1NUUklORzJfQ09QWV9BUlI2IF9fc3JjNiwgX19TVFJJTkcyX0NPUFlfQVJSNyBfX3NyYzcsCisJCV9fU1RSSU5HMl9DT1BZX0FSUjggX19zcmM4LCBzaXplX3QgX19zcmNsZW4pCit7CisgIHVuaW9uIHsKKyAgICBjaGFyIF9fYzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlIyIF9fc2NhMjsKKyAgICBfX1NUUklORzJfQ09QWV9BUlIzIF9fc2NhMzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI0IF9fc2NhNDsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI1IF9fc2NhNTsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI2IF9fc2NhNjsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI3IF9fc2NhNzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI4IF9fc2NhODsKKyAgfSAqX191ID0gKHZvaWQgKikgX19kZXN0OworICBzd2l0Y2ggKCh1bnNpZ25lZCBpbnQpIF9fc3JjbGVuKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBfX3UtPl9fYyA9ICdcMCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2EyID0gX19zcmMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhMyA9IF9fc3JjMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTQgPSBfX3NyYzQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E1ID0gX19zcmM1OworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNiA9IF9fc3JjNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTcgPSBfX3NyYzc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E4ID0gX19zcmM4OworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIF9fZGVzdDsKK30KKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIENvcHkgU1JDIHRvIERFU1QsIHJldHVybmluZyBwb2ludGVyIHRvIGZpbmFsIE5VTCBieXRlLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgaWYgIWRlZmluZWQgX0hBVkVfU1RSSU5HX0FSQ0hfc3RwY3B5IHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgIGlmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHBjcHkKKyMgICBpZiBfX0dOVUNfUFJFUkVRICgzLCA0KQorIyAgICBkZWZpbmUgX19zdHBjcHkoZGVzdCwgc3JjKSBfX2J1aWx0aW5fc3RwY3B5IChkZXN0LCBzcmMpCisjICAgZWxpZiBfX0dOVUNfUFJFUkVRICgzLCAwKQorIyAgICBkZWZpbmUgX19zdHBjcHkoZGVzdCwgc3JjKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc3JjKQkJCQkgICAgICBcCisJCSAgPyAoX19zdHJpbmcyXzFicHRyX3AgKHNyYykgJiYgc3RybGVuIChzcmMpICsgMSA8PSA4CSAgICAgIFwKKwkJICAgICA/IF9fYnVpbHRpbl9zdHJjcHkgKGRlc3QsIHNyYykgKyBzdHJsZW4gKHNyYykJICAgICAgXAorCQkgICAgIDogKChjaGFyICopIChfX21lbXBjcHkpIChkZXN0LCBzcmMsIHN0cmxlbiAoc3JjKSArIDEpICAgIFwKKwkJCS0gMSkpCQkJCQkJICAgICAgXAorCQkgIDogX19zdHBjcHkgKGRlc3QsIHNyYykpKQorIyAgIGVsc2UKKyMgICAgZGVmaW5lIF9fc3RwY3B5KGRlc3QsIHNyYykgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHNyYykJCQkJICAgICAgXAorCQkgID8gKF9fc3RyaW5nMl8xYnB0cl9wIChzcmMpICYmIHN0cmxlbiAoc3JjKSArIDEgPD0gOAkgICAgICBcCisJCSAgICAgPyBfX3N0cGNweV9zbWFsbCAoZGVzdCwgX19zdHBjcHlfYXJncyAoc3JjKSwJICAgICAgXAorCQkJCSAgICAgICBzdHJsZW4gKHNyYykgKyAxKQkJICAgICAgXAorCQkgICAgIDogKChjaGFyICopIChfX21lbXBjcHkpIChkZXN0LCBzcmMsIHN0cmxlbiAoc3JjKSArIDEpICAgIFwKKwkJCS0gMSkpCQkJCQkJICAgICAgXAorCQkgIDogX19zdHBjcHkgKGRlc3QsIHNyYykpKQorIyAgIGVuZGlmCisvKiBJbiBnbGliYyB3ZSB1c2UgdGhpcyBmdW5jdGlvbiBmcmVxdWVudGx5IGJ1dCBmb3IgbmFtZXNwYWNlIHJlYXNvbnMKKyAgIHdlIGhhdmUgdG8gdXNlIHRoZSBuYW1lIGBfX3N0cGNweScuICAqLworIyAgIGRlZmluZSBzdHBjcHkoZGVzdCwgc3JjKSBfX3N0cGNweSAoZGVzdCwgc3JjKQorIyAgZW5kaWYKKworIyAgaWYgIV9fR05VQ19QUkVSRVEgKDMsIDApIHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgICBpZiBfU1RSSU5HX0FSQ0hfdW5hbGlnbmVkCisjICAgIGlmbmRlZiBfRk9SQ0VfSU5MSU5FUworIyAgICAgZGVmaW5lIF9fc3RwY3B5X2FyZ3Moc3JjKSBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDE2IChzcmMsIDApLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyBfX1NUUklORzJfU01BTExfR0VUMTYgKHNyYywgNCksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fIF9fU1RSSU5HMl9TTUFMTF9HRVQzMiAoc3JjLCAwKSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDMyIChzcmMsIDQpCisjICAgIGVuZGlmCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHBjcHlfc21hbGwgKGNoYXIgKiwgX191aW50MTZfdCwgX191aW50MTZfdCwKKwkJCQkgICAgICBfX3VpbnQzMl90LCBfX3VpbnQzMl90LCBzaXplX3QpOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHBjcHlfc21hbGwgKGNoYXIgKl9fZGVzdCwKKwkJX191aW50MTZfdCBfX3NyYzBfMiwgX191aW50MTZfdCBfX3NyYzRfMiwKKwkJX191aW50MzJfdCBfX3NyYzBfNCwgX191aW50MzJfdCBfX3NyYzRfNCwKKwkJc2l6ZV90IF9fc3JjbGVuKQoreworICB1bmlvbiB7CisgICAgdW5zaWduZWQgaW50IF9fdWk7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fdXNpOworICAgIHVuc2lnbmVkIGNoYXIgX191YzsKKyAgICBjaGFyIF9fYzsKKyAgfSAqX191ID0gKHZvaWQgKikgX19kZXN0OworICBzd2l0Y2ggKCh1bnNpZ25lZCBpbnQpIF9fc3JjbGVuKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBfX3UtPl9fdWMgPSAnXDAnOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgX191LT5fX3VzaSA9IF9fc3JjMF8yOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBfX3UtPl9fdXNpID0gX19zcmMwXzI7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAyKTsKKyAgICAgIF9fdS0+X191YyA9ICdcMCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X191YyA9ICdcMCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgX191LT5fX3VzaSA9IF9fc3JjNF8yOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgX191LT5fX3VzaSA9IF9fc3JjNF8yOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMik7CisgICAgICBfX3UtPl9fdWMgPSAnXDAnOworICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjNF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMyk7CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAmX191LT5fX2M7Cit9CisjICAgZWxzZQorIyAgICBpZm5kZWYgX0ZPUkNFX0lOTElORVMKKyMgICAgIGRlZmluZSBfX3N0cGNweV9hcmdzKHNyYykgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSMikJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgJ1wwJyB9IH0pLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjMpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgJ1wwJyB9IH0pLAkJCQkJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI0KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgJ1wwJyB9IH0pLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjUpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbM10sCSAgICAgIFwKKwkgICdcMCcgfSB9KSwJCQkJCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSNikJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzRdLCAnXDAnIH0gfSksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSNykJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzRdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNV0sCSAgICAgIFwKKwkgICdcMCcgfSB9KSwJCQkJCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSOCkJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzRdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVs2XSwgJ1wwJyB9IH0pCisjICAgIGVuZGlmCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHBjcHlfc21hbGwgKGNoYXIgKiwgX19TVFJJTkcyX0NPUFlfQVJSMiwKKwkJCQkgICAgICBfX1NUUklORzJfQ09QWV9BUlIzLAorCQkJCSAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjQsCisJCQkJICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNSwKKwkJCQkgICAgICBfX1NUUklORzJfQ09QWV9BUlI2LAorCQkJCSAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjcsCisJCQkJICAgICAgX19TVFJJTkcyX0NPUFlfQVJSOCwgc2l6ZV90KTsKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RwY3B5X3NtYWxsIChjaGFyICpfX2Rlc3QsCisJCV9fU1RSSU5HMl9DT1BZX0FSUjIgX19zcmMyLCBfX1NUUklORzJfQ09QWV9BUlIzIF9fc3JjMywKKwkJX19TVFJJTkcyX0NPUFlfQVJSNCBfX3NyYzQsIF9fU1RSSU5HMl9DT1BZX0FSUjUgX19zcmM1LAorCQlfX1NUUklORzJfQ09QWV9BUlI2IF9fc3JjNiwgX19TVFJJTkcyX0NPUFlfQVJSNyBfX3NyYzcsCisJCV9fU1RSSU5HMl9DT1BZX0FSUjggX19zcmM4LCBzaXplX3QgX19zcmNsZW4pCit7CisgIHVuaW9uIHsKKyAgICBjaGFyIF9fYzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlIyIF9fc2NhMjsKKyAgICBfX1NUUklORzJfQ09QWV9BUlIzIF9fc2NhMzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI0IF9fc2NhNDsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI1IF9fc2NhNTsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI2IF9fc2NhNjsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI3IF9fc2NhNzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI4IF9fc2NhODsKKyAgfSAqX191ID0gKHZvaWQgKikgX19kZXN0OworICBzd2l0Y2ggKCh1bnNpZ25lZCBpbnQpIF9fc3JjbGVuKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBfX3UtPl9fYyA9ICdcMCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2EyID0gX19zcmMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhMyA9IF9fc3JjMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTQgPSBfX3NyYzQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E1ID0gX19zcmM1OworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNiA9IF9fc3JjNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTcgPSBfX3NyYzc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E4ID0gX19zcmM4OworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIF9fZGVzdCArIF9fc3JjbGVuIC0gMTsKK30KKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIENvcHkgbm8gbW9yZSB0aGFuIE4gY2hhcmFjdGVycyBvZiBTUkMgdG8gREVTVC4gICovCisjaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cm5jcHkKKyMgaWYgX19HTlVDX1BSRVJFUSAoMywgMikKKyMgIGRlZmluZSBzdHJuY3B5KGRlc3QsIHNyYywgbikgX19idWlsdGluX3N0cm5jcHkgKGRlc3QsIHNyYywgbikKKyMgZWxzZQorIyAgZGVmaW5lIHN0cm5jcHkoZGVzdCwgc3JjLCBuKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc3JjKSAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAobikgICAgICBcCisJCSAgPyAoc3RybGVuIChzcmMpICsgMSA+PSAoKHNpemVfdCkgKG4pKQkJCSAgICAgIFwKKwkJICAgICA/IChjaGFyICopIG1lbWNweSAoZGVzdCwgc3JjLCBuKQkJCSAgICAgIFwKKwkJICAgICA6IHN0cm5jcHkgKGRlc3QsIHNyYywgbikpCQkJCSAgICAgIFwKKwkJICA6IHN0cm5jcHkgKGRlc3QsIHNyYywgbikpKQorIyBlbmRpZgorI2VuZGlmCisKKworLyogQXBwZW5kIG5vIG1vcmUgdGhhbiBOIGNoYXJhY3RlcnMgZnJvbSBTUkMgb250byBERVNULiAgKi8KKyNpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfc3RybmNhdAorIyBpZmRlZiBfVVNFX1NUUklOR19BUkNIX3N0cmNocgorIyAgZGVmaW5lIHN0cm5jYXQoZGVzdCwgc3JjLCBuKSBcCisgIChfX2V4dGVuc2lvbl9fICh7IGNoYXIgKl9fZGVzdCA9IChkZXN0KTsJCQkJICAgICAgXAorCQkgICAgX19idWlsdGluX2NvbnN0YW50X3AgKHNyYykgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKG4pICAgIFwKKwkJICAgID8gKHN0cmxlbiAoc3JjKSA8ICgoc2l6ZV90KSAobikpCQkJICAgICAgXAorCQkgICAgICAgPyBzdHJjYXQgKF9fZGVzdCwgc3JjKQkJCQkgICAgICBcCisJCSAgICAgICA6ICgqKChjaGFyICopIF9fbWVtcGNweSAoc3RyY2hyIChfX2Rlc3QsICdcMCcpLAkgICAgICBcCisJCQkJCQlzcmMsIG4pKSA9ICdcMCcsIF9fZGVzdCkpICAgICBcCisJCSAgICA6IHN0cm5jYXQgKGRlc3QsIHNyYywgbik7IH0pKQorIyBlbGlmIF9fR05VQ19QUkVSRVEgKDMsIDIpCisjICBkZWZpbmUgc3RybmNhdChkZXN0LCBzcmMsIG4pIF9fYnVpbHRpbl9zdHJuY2F0IChkZXN0LCBzcmMsIG4pCisjIGVsc2UKKyMgIGRlZmluZSBzdHJuY2F0KGRlc3QsIHNyYywgbikgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHNyYykgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKG4pICAgICAgXAorCQkgID8gKHN0cmxlbiAoc3JjKSA8ICgoc2l6ZV90KSAobikpCQkJICAgICAgXAorCQkgICAgID8gc3RyY2F0IChkZXN0LCBzcmMpCQkJCSAgICAgIFwKKwkJICAgICA6IHN0cm5jYXQgKGRlc3QsIHNyYywgbikpCQkJCSAgICAgIFwKKwkJICA6IHN0cm5jYXQgKGRlc3QsIHNyYywgbikpKQorIyBlbmRpZgorI2VuZGlmCisKKworLyogQ29tcGFyZSBjaGFyYWN0ZXJzIG9mIFMxIGFuZCBTMi4gICovCisjaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cmNtcAorIyBpZiBfX0dOVUNfUFJFUkVRICgzLCAyKQorIyAgZGVmaW5lIHN0cmNtcChzMSwgczIpIFwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJICAgICAgXAorICAoeyBzaXplX3QgX19zMV9sZW4sIF9fczJfbGVuOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMSkgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKHMyKQkJICAgICAgXAorICAgICAgJiYgKF9fczFfbGVuID0gX19idWlsdGluX3N0cmxlbiAoczEpLCBfX3MyX2xlbiA9IF9fYnVpbHRpbl9zdHJsZW4gKHMyKSwgXAorCSAgKCFfX3N0cmluZzJfMWJwdHJfcCAoczEpIHx8IF9fczFfbGVuID49IDQpCQkJICAgICAgXAorCSAgJiYgKCFfX3N0cmluZzJfMWJwdHJfcCAoczIpIHx8IF9fczJfbGVuID49IDQpKQkJICAgICAgXAorICAgICAgPyBfX2J1aWx0aW5fc3RyY21wIChzMSwgczIpCQkJCQkgICAgICBcCisgICAgICA6IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczEpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzMSkJCSAgICAgIFwKKwkgJiYgKF9fczFfbGVuID0gX19idWlsdGluX3N0cmxlbiAoczEpLCBfX3MxX2xlbiA8IDQpCQkgICAgICBcCisJID8gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMikgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMyKQkJICAgICAgXAorCSAgICA/IF9fYnVpbHRpbl9zdHJjbXAgKHMxLCBzMikJCQkJCSAgICAgIFwKKwkgICAgOiBfX3N0cmNtcF9jZyAoczEsIHMyLCBfX3MxX2xlbikpCQkJCSAgICAgIFwKKwkgOiAoX19idWlsdGluX2NvbnN0YW50X3AgKHMyKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoczIpCQkgICAgICBcCisJICAgICYmIChfX3MyX2xlbiA9IF9fYnVpbHRpbl9zdHJsZW4gKHMyKSwgX19zMl9sZW4gPCA0KQkJICAgICAgXAorCSAgICA/IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczEpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzMSkJICAgICAgXAorCSAgICAgICA/IF9fYnVpbHRpbl9zdHJjbXAgKHMxLCBzMikJCQkJICAgICAgXAorCSAgICAgICA6IF9fc3RyY21wX2djIChzMSwgczIsIF9fczJfbGVuKSkJCQkgICAgICBcCisJICAgIDogX19idWlsdGluX3N0cmNtcCAoczEsIHMyKSkpKTsgfSkKKyMgZWxzZQorIyAgZGVmaW5lIHN0cmNtcChzMSwgczIpIFwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJICAgICAgXAorICAoeyBzaXplX3QgX19zMV9sZW4sIF9fczJfbGVuOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMSkgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKHMyKQkJICAgICAgXAorICAgICAgJiYgKF9fczFfbGVuID0gc3RybGVuIChzMSksIF9fczJfbGVuID0gc3RybGVuIChzMiksCQkgICAgICBcCisJICAoIV9fc3RyaW5nMl8xYnB0cl9wIChzMSkgfHwgX19zMV9sZW4gPj0gNCkJCQkgICAgICBcCisJICAmJiAoIV9fc3RyaW5nMl8xYnB0cl9wIChzMikgfHwgX19zMl9sZW4gPj0gNCkpCQkgICAgICBcCisgICAgICA/IG1lbWNtcCAoKF9fY29uc3QgY2hhciAqKSAoczEpLCAoX19jb25zdCBjaGFyICopIChzMiksCQkgICAgICBcCisJCShfX3MxX2xlbiA8IF9fczJfbGVuID8gX19zMV9sZW4gOiBfX3MyX2xlbikgKyAxKQkgICAgICBcCisgICAgICA6IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczEpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzMSkJCSAgICAgIFwKKwkgJiYgKF9fczFfbGVuID0gc3RybGVuIChzMSksIF9fczFfbGVuIDwgNCkJCQkgICAgICBcCisJID8gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMikgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMyKQkJICAgICAgXAorCSAgICA/IF9fc3RyY21wX2NjIChzMSwgczIsIF9fczFfbGVuKQkJCQkgICAgICBcCisJICAgIDogX19zdHJjbXBfY2cgKHMxLCBzMiwgX19zMV9sZW4pKQkJCQkgICAgICBcCisJIDogKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMikgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMyKQkJICAgICAgXAorCSAgICAmJiAoX19zMl9sZW4gPSBzdHJsZW4gKHMyKSwgX19zMl9sZW4gPCA0KQkJCSAgICAgIFwKKwkgICAgPyAoX19idWlsdGluX2NvbnN0YW50X3AgKHMxKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoczEpCSAgICAgIFwKKwkgICAgICAgPyBfX3N0cmNtcF9jYyAoczEsIHMyLCBfX3MyX2xlbikJCQkJICAgICAgXAorCSAgICAgICA6IF9fc3RyY21wX2djIChzMSwgczIsIF9fczJfbGVuKSkJCQkgICAgICBcCisJICAgIDogc3RyY21wIChzMSwgczIpKSkpOyB9KQorIyBlbmRpZgorCisjIGRlZmluZSBfX3N0cmNtcF9jYyhzMSwgczIsIGwpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgcmVnaXN0ZXIgaW50IF9fcmVzdWx0ID0JCQkJICAgICAgXAorCQkgICAgICAoKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoczEpKVswXSAgIFwKKwkJICAgICAgIC0gKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKShzMikpWzBdKTtcCisJCSAgICBpZiAobCA+IDAgJiYgX19yZXN1bHQgPT0gMCkJCQkJICAgICAgXAorCQkgICAgICB7CQkJCQkJCSAgICAgIFwKKwkJCV9fcmVzdWx0ID0gKCgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopCQkgICAgICBcCisJCQkJICAgICAoX19jb25zdCBjaGFyICopIChzMSkpWzFdCQkgICAgICBcCisJCQkJICAgIC0gKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJICAgICAgXAorCQkJCSAgICAgICAoX19jb25zdCBjaGFyICopIChzMikpWzFdKTsJICAgICAgXAorCQkJaWYgKGwgPiAxICYmIF9fcmVzdWx0ID09IDApCQkJICAgICAgXAorCQkJICB7CQkJCQkJICAgICAgXAorCQkJICAgIF9fcmVzdWx0ID0JCQkJCSAgICAgIFwKKwkJCSAgICAgICgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkJICAgICAgXAorCQkJCShfX2NvbnN0IGNoYXIgKikgKHMxKSlbMl0JCSAgICAgIFwKKwkJCSAgICAgICAtICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopCQkgICAgICBcCisJCQkJICAoX19jb25zdCBjaGFyICopIChzMikpWzJdKTsJCSAgICAgIFwKKwkJCSAgICBpZiAobCA+IDIgJiYgX19yZXN1bHQgPT0gMCkJCQkgICAgICBcCisJCQkgICAgICBfX3Jlc3VsdCA9CQkJCSAgICAgIFwKKwkJCQkoKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJCSAgICAgIFwKKwkJCQkgIChfX2NvbnN0IGNoYXIgKikgKHMxKSlbM10JCSAgICAgIFwKKwkJCQkgLSAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkJICAgICAgXAorCQkJCSAgICAoX19jb25zdCBjaGFyICopIChzMikpWzNdKTsJCSAgICAgIFwKKwkJCSAgfQkJCQkJCSAgICAgIFwKKwkJICAgICAgfQkJCQkJCQkgICAgICBcCisJCSAgICBfX3Jlc3VsdDsgfSkpCisKKyMgZGVmaW5lIF9fc3RyY21wX2NnKHMxLCBzMiwgbDEpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgX19jb25zdCB1bnNpZ25lZCBjaGFyICpfX3MyID0JCQkgICAgICBcCisJCSAgICAgIChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoczIpOwkgICAgICBcCisJCSAgICByZWdpc3RlciBpbnQgX19yZXN1bHQgPQkJCQkgICAgICBcCisJCSAgICAgICgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzMSkpWzBdICAgXAorCQkgICAgICAgLSBfX3MyWzBdKTsJCQkJCSAgICAgIFwKKwkJICAgIGlmIChsMSA+IDAgJiYgX19yZXN1bHQgPT0gMCkJCQkgICAgICBcCisJCSAgICAgIHsJCQkJCQkJICAgICAgXAorCQkJX19yZXN1bHQgPSAoKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJCSAgICAgIFwKKwkJCQkgICAgIChfX2NvbnN0IGNoYXIgKikgKHMxKSlbMV0gLSBfX3MyWzFdKTsgICAgXAorCQkJaWYgKGwxID4gMSAmJiBfX3Jlc3VsdCA9PSAwKQkJCSAgICAgIFwKKwkJCSAgewkJCQkJCSAgICAgIFwKKwkJCSAgICBfX3Jlc3VsdCA9ICgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkgICAgICBcCisJCQkJCSAoX19jb25zdCBjaGFyICopIChzMSkpWzJdIC0gX19zMlsyXSk7XAorCQkJICAgIGlmIChsMSA+IDIgJiYgX19yZXN1bHQgPT0gMCkJCSAgICAgIFwKKwkJCSAgICAgIF9fcmVzdWx0ID0gKCgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopCSAgICAgIFwKKwkJCQkJICAoX19jb25zdCBjaGFyICopICAoczEpKVszXQkgICAgICBcCisJCQkJCSAgLSBfX3MyWzNdKTsJCQkgICAgICBcCisJCQkgIH0JCQkJCQkgICAgICBcCisJCSAgICAgIH0JCQkJCQkJICAgICAgXAorCQkgICAgX19yZXN1bHQ7IH0pKQorCisjIGRlZmluZSBfX3N0cmNtcF9nYyhzMSwgczIsIGwyKSBcCisgIChfX2V4dGVuc2lvbl9fICh7IF9fY29uc3QgdW5zaWduZWQgY2hhciAqX19zMSA9CQkJICAgICAgXAorCQkgICAgICAoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHMxKTsJICAgICAgXAorCQkgICAgcmVnaXN0ZXIgaW50IF9fcmVzdWx0ID0JCQkJICAgICAgXAorCQkgICAgICBfX3MxWzBdIC0gKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJCSAgICAgIFwKKwkJCQkgKF9fY29uc3QgY2hhciAqKSAoczIpKVswXTsJCSAgICAgIFwKKwkJICAgIGlmIChsMiA+IDAgJiYgX19yZXN1bHQgPT0gMCkJCQkgICAgICBcCisJCSAgICAgIHsJCQkJCQkJICAgICAgXAorCQkJX19yZXN1bHQgPSAoX19zMVsxXQkJCQkgICAgICBcCisJCQkJICAgIC0gKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJICAgICAgXAorCQkJCSAgICAgICAoX19jb25zdCBjaGFyICopIChzMikpWzFdKTsJICAgICAgXAorCQkJaWYgKGwyID4gMSAmJiBfX3Jlc3VsdCA9PSAwKQkJCSAgICAgIFwKKwkJCSAgewkJCQkJCSAgICAgIFwKKwkJCSAgICBfX3Jlc3VsdCA9CQkJCQkgICAgICBcCisJCQkgICAgICAoX19zMVsyXSAtICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopCSAgICAgIFwKKwkJCQkJICAoX19jb25zdCBjaGFyICopIChzMikpWzJdKTsJICAgICAgXAorCQkJICAgIGlmIChsMiA+IDIgJiYgX19yZXN1bHQgPT0gMCkJCSAgICAgIFwKKwkJCSAgICAgIF9fcmVzdWx0ID0JCQkJICAgICAgXAorCQkJCShfX3MxWzNdCQkJCSAgICAgIFwKKwkJCQkgLSAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkJICAgICAgXAorCQkJCSAgICAoX19jb25zdCBjaGFyICopIChzMikpWzNdKTsJCSAgICAgIFwKKwkJCSAgfQkJCQkJCSAgICAgIFwKKwkJICAgICAgfQkJCQkJCQkgICAgICBcCisJCSAgICBfX3Jlc3VsdDsgfSkpCisjZW5kaWYKKworCisvKiBDb21wYXJlIE4gY2hhcmFjdGVycyBvZiBTMSBhbmQgUzIuICAqLworI2lmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHJuY21wCisjIGRlZmluZSBzdHJuY21wKHMxLCBzMiwgbikJCQkJCQkgICAgICBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAobikJCQkJICAgICAgXAorCQkgICYmICgoX19idWlsdGluX2NvbnN0YW50X3AgKHMxKQkJCSAgICAgIFwKKwkJICAgICAgICYmIHN0cmxlbiAoczEpIDwgKChzaXplX3QpIChuKSkpCQkJICAgICAgXAorCQkgICAgICB8fCAoX19idWlsdGluX2NvbnN0YW50X3AgKHMyKQkJCSAgICAgIFwKKwkJCSAgJiYgc3RybGVuIChzMikgPCAoKHNpemVfdCkgKG4pKSkpCQkgICAgICBcCisJCSAgPyBzdHJjbXAgKHMxLCBzMikgOiBzdHJuY21wIChzMSwgczIsIG4pKSkKKyNlbmRpZgorCisKKy8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbml0aWFsIHNlZ21lbnQgb2YgUyB3aGljaAorICAgY29uc2lzdHMgZW50aXJlbHkgb2YgY2hhcmFjdGVycyBub3QgaW4gUkVKRUNULiAgKi8KKyNpZiAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJjc3BuIHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cmNzcG4KKyMgIGlmIF9fR05VQ19QUkVSRVEgKDMsIDIpCisjICAgZGVmaW5lIHN0cmNzcG4ocywgcmVqZWN0KSBcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCSAgICAgIFwKKyAgKHsgY2hhciBfX3IwLCBfX3IxLCBfX3IyOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChyZWplY3QpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChyZWplY3QpCSAgICAgIFwKKyAgICAgID8gKChfX2J1aWx0aW5fY29uc3RhbnRfcCAocykgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMpKQkJICAgICAgXAorCSA/IF9fYnVpbHRpbl9zdHJjc3BuIChzLCByZWplY3QpCQkJCSAgICAgIFwKKwkgOiAoKF9fcjAgPSAoKF9fY29uc3QgY2hhciAqKSAocmVqZWN0KSlbMF0sIF9fcjAgPT0gJ1wwJykJICAgICAgXAorCSAgICA/IHN0cmxlbiAocykJCQkJCQkgICAgICBcCisJICAgIDogKChfX3IxID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzFdLCBfX3IxID09ICdcMCcpCSAgICAgIFwKKwkgICAgICAgPyBfX3N0cmNzcG5fYzEgKHMsIF9fcjApCQkJCQkgICAgICBcCisJICAgICAgIDogKChfX3IyID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzJdLCBfX3IyID09ICdcMCcpCSAgICAgIFwKKwkJICA/IF9fc3RyY3Nwbl9jMiAocywgX19yMCwgX19yMSkJCQkgICAgICBcCisJCSAgOiAoKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzNdID09ICdcMCcJCSAgICAgIFwKKwkJICAgICA/IF9fc3RyY3Nwbl9jMyAocywgX19yMCwgX19yMSwgX19yMikJCSAgICAgIFwKKwkJICAgICA6IF9fYnVpbHRpbl9zdHJjc3BuIChzLCByZWplY3QpKSkpKSkJCSAgICAgIFwKKyAgICAgIDogX19idWlsdGluX3N0cmNzcG4gKHMsIHJlamVjdCkpOyB9KQorIyAgZWxzZQorIyAgIGRlZmluZSBzdHJjc3BuKHMsIHJlamVjdCkgXAorICBfX2V4dGVuc2lvbl9fCQkJCQkJCQkgICAgICBcCisgICh7IGNoYXIgX19yMCwgX19yMSwgX19yMjsJCQkJCQkgICAgICBcCisgICAgIChfX2J1aWx0aW5fY29uc3RhbnRfcCAocmVqZWN0KSAmJiBfX3N0cmluZzJfMWJwdHJfcCAocmVqZWN0KQkgICAgICBcCisgICAgICA/ICgoX19yMCA9ICgoX19jb25zdCBjaGFyICopIChyZWplY3QpKVswXSwgX19yMCA9PSAnXDAnKQkJICAgICAgXAorCSA/IHN0cmxlbiAocykJCQkJCQkJICAgICAgXAorCSA6ICgoX19yMSA9ICgoX19jb25zdCBjaGFyICopIChyZWplY3QpKVsxXSwgX19yMSA9PSAnXDAnKQkgICAgICBcCisJICAgID8gX19zdHJjc3BuX2MxIChzLCBfX3IwKQkJCQkJICAgICAgXAorCSAgICA6ICgoX19yMiA9ICgoX19jb25zdCBjaGFyICopIChyZWplY3QpKVsyXSwgX19yMiA9PSAnXDAnKQkgICAgICBcCisJICAgICAgID8gX19zdHJjc3BuX2MyIChzLCBfX3IwLCBfX3IxKQkJCQkgICAgICBcCisJICAgICAgIDogKCgoX19jb25zdCBjaGFyICopIChyZWplY3QpKVszXSA9PSAnXDAnCQkgICAgICBcCisJCSAgPyBfX3N0cmNzcG5fYzMgKHMsIF9fcjAsIF9fcjEsIF9fcjIpCQkJICAgICAgXAorCQkgIDogc3RyY3NwbiAocywgcmVqZWN0KSkpKSkJCQkJICAgICAgXAorICAgICAgOiBzdHJjc3BuIChzLCByZWplY3QpKTsgfSkKKyMgIGVuZGlmCisjIGVuZGlmCisKK19fU1RSSU5HX0lOTElORSBzaXplX3QgX19zdHJjc3BuX2MxIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fcmVqZWN0KTsKK19fU1RSSU5HX0lOTElORSBzaXplX3QKK19fc3RyY3Nwbl9jMSAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX3JlamVjdCkKK3sKKyAgcmVnaXN0ZXIgc2l6ZV90IF9fcmVzdWx0ID0gMDsKKyAgd2hpbGUgKF9fc1tfX3Jlc3VsdF0gIT0gJ1wwJyAmJiBfX3NbX19yZXN1bHRdICE9IF9fcmVqZWN0KQorICAgICsrX19yZXN1bHQ7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKworX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cmNzcG5fYzIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19yZWplY3QxLAorCQkJCSAgICAgaW50IF9fcmVqZWN0Mik7CitfX1NUUklOR19JTkxJTkUgc2l6ZV90CitfX3N0cmNzcG5fYzIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19yZWplY3QxLCBpbnQgX19yZWplY3QyKQoreworICByZWdpc3RlciBzaXplX3QgX19yZXN1bHQgPSAwOworICB3aGlsZSAoX19zW19fcmVzdWx0XSAhPSAnXDAnICYmIF9fc1tfX3Jlc3VsdF0gIT0gX19yZWplY3QxCisJICYmIF9fc1tfX3Jlc3VsdF0gIT0gX19yZWplY3QyKQorICAgICsrX19yZXN1bHQ7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKworX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cmNzcG5fYzMgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19yZWplY3QxLAorCQkJCSAgICAgaW50IF9fcmVqZWN0MiwgaW50IF9fcmVqZWN0Myk7CitfX1NUUklOR19JTkxJTkUgc2l6ZV90CitfX3N0cmNzcG5fYzMgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19yZWplY3QxLCBpbnQgX19yZWplY3QyLAorCSAgICAgIGludCBfX3JlamVjdDMpCit7CisgIHJlZ2lzdGVyIHNpemVfdCBfX3Jlc3VsdCA9IDA7CisgIHdoaWxlIChfX3NbX19yZXN1bHRdICE9ICdcMCcgJiYgX19zW19fcmVzdWx0XSAhPSBfX3JlamVjdDEKKwkgJiYgX19zW19fcmVzdWx0XSAhPSBfX3JlamVjdDIgJiYgX19zW19fcmVzdWx0XSAhPSBfX3JlamVjdDMpCisgICAgKytfX3Jlc3VsdDsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorI2VuZGlmCisKKworLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgc2VnbWVudCBvZiBTIHdoaWNoCisgICBjb25zaXN0cyBlbnRpcmVseSBvZiBjaGFyYWN0ZXJzIGluIEFDQ0VQVC4gICovCisjaWYgIWRlZmluZWQgX0hBVkVfU1RSSU5HX0FSQ0hfc3Ryc3BuIHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cnNwbgorIyAgaWYgX19HTlVDX1BSRVJFUSAoMywgMikKKyMgICBkZWZpbmUgc3Ryc3BuKHMsIGFjY2VwdCkgXAorICBfX2V4dGVuc2lvbl9fCQkJCQkJCQkgICAgICBcCisgICh7IGNoYXIgX19hMCwgX19hMSwgX19hMjsJCQkJCQkgICAgICBcCisgICAgIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYWNjZXB0KSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoYWNjZXB0KQkgICAgICBcCisgICAgICA/ICgoX19idWlsdGluX2NvbnN0YW50X3AgKHMpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzKSkJCSAgICAgIFwKKwkgPyBfX2J1aWx0aW5fc3Ryc3BuIChzLCBhY2NlcHQpCQkJCQkgICAgICBcCisJIDogKChfX2EwID0gKChfX2NvbnN0IGNoYXIgKikgKGFjY2VwdCkpWzBdLCBfX2EwID09ICdcMCcpCSAgICAgIFwKKwkgICAgPyAoKHZvaWQpIChzKSwgMCkJCQkJCQkgICAgICBcCisJICAgIDogKChfX2ExID0gKChfX2NvbnN0IGNoYXIgKikgKGFjY2VwdCkpWzFdLCBfX2ExID09ICdcMCcpCSAgICAgIFwKKwkgICAgICAgPyBfX3N0cnNwbl9jMSAocywgX19hMCkJCQkJCSAgICAgIFwKKwkgICAgICAgOiAoKF9fYTIgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMl0sIF9fYTIgPT0gJ1wwJykJICAgICAgXAorCQkgID8gX19zdHJzcG5fYzIgKHMsIF9fYTAsIF9fYTEpCQkJCSAgICAgIFwKKwkJICA6ICgoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbM10gPT0gJ1wwJwkJICAgICAgXAorCQkgICAgID8gX19zdHJzcG5fYzMgKHMsIF9fYTAsIF9fYTEsIF9fYTIpCQkgICAgICBcCisJCSAgICAgOiBfX2J1aWx0aW5fc3Ryc3BuIChzLCBhY2NlcHQpKSkpKSkJCSAgICAgIFwKKyAgICAgIDogX19idWlsdGluX3N0cnNwbiAocywgYWNjZXB0KSk7IH0pCisjICBlbHNlCisjICAgZGVmaW5lIHN0cnNwbihzLCBhY2NlcHQpIFwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJICAgICAgXAorICAoeyBjaGFyIF9fYTAsIF9fYTEsIF9fYTI7CQkJCQkJICAgICAgXAorICAgICAoX19idWlsdGluX2NvbnN0YW50X3AgKGFjY2VwdCkgJiYgX19zdHJpbmcyXzFicHRyX3AgKGFjY2VwdCkJICAgICAgXAorICAgICAgPyAoKF9fYTAgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMF0sIF9fYTAgPT0gJ1wwJykJCSAgICAgIFwKKwkgPyAoKHZvaWQpIChzKSwgMCkJCQkJCQkgICAgICBcCisJIDogKChfX2ExID0gKChfX2NvbnN0IGNoYXIgKikgKGFjY2VwdCkpWzFdLCBfX2ExID09ICdcMCcpCSAgICAgIFwKKwkgICAgPyBfX3N0cnNwbl9jMSAocywgX19hMCkJCQkJCSAgICAgIFwKKwkgICAgOiAoKF9fYTIgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMl0sIF9fYTIgPT0gJ1wwJykJICAgICAgXAorCSAgICAgICA/IF9fc3Ryc3BuX2MyIChzLCBfX2EwLCBfX2ExKQkJCQkgICAgICBcCisJICAgICAgIDogKCgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVszXSA9PSAnXDAnCQkgICAgICBcCisJCSAgPyBfX3N0cnNwbl9jMyAocywgX19hMCwgX19hMSwgX19hMikJCQkgICAgICBcCisJCSAgOiBzdHJzcG4gKHMsIGFjY2VwdCkpKSkpCQkJCSAgICAgIFwKKyAgICAgIDogc3Ryc3BuIChzLCBhY2NlcHQpKTsgfSkKKyMgIGVuZGlmCisjIGVuZGlmCisKK19fU1RSSU5HX0lOTElORSBzaXplX3QgX19zdHJzcG5fYzEgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQpOworX19TVFJJTkdfSU5MSU5FIHNpemVfdAorX19zdHJzcG5fYzEgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQpCit7CisgIHJlZ2lzdGVyIHNpemVfdCBfX3Jlc3VsdCA9IDA7CisgIC8qIFBsZWFzZSBub3RlIHRoYXQgX19hY2NlcHQgbmV2ZXIgY2FuIGJlICdcMCcuICAqLworICB3aGlsZSAoX19zW19fcmVzdWx0XSA9PSBfX2FjY2VwdCkKKyAgICArK19fcmVzdWx0OworICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK19fU1RSSU5HX0lOTElORSBzaXplX3QgX19zdHJzcG5fYzIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLAorCQkJCSAgICBpbnQgX19hY2NlcHQyKTsKK19fU1RSSU5HX0lOTElORSBzaXplX3QKK19fc3Ryc3BuX2MyIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYWNjZXB0MSwgaW50IF9fYWNjZXB0MikKK3sKKyAgcmVnaXN0ZXIgc2l6ZV90IF9fcmVzdWx0ID0gMDsKKyAgLyogUGxlYXNlIG5vdGUgdGhhdCBfX2FjY2VwdDEgYW5kIF9fYWNjZXB0MiBuZXZlciBjYW4gYmUgJ1wwJy4gICovCisgIHdoaWxlIChfX3NbX19yZXN1bHRdID09IF9fYWNjZXB0MSB8fCBfX3NbX19yZXN1bHRdID09IF9fYWNjZXB0MikKKyAgICArK19fcmVzdWx0OworICByZXR1cm4gX19yZXN1bHQ7Cit9CisKK19fU1RSSU5HX0lOTElORSBzaXplX3QgX19zdHJzcG5fYzMgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLAorCQkJCSAgICBpbnQgX19hY2NlcHQyLCBpbnQgX19hY2NlcHQzKTsKK19fU1RSSU5HX0lOTElORSBzaXplX3QKK19fc3Ryc3BuX2MzIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYWNjZXB0MSwgaW50IF9fYWNjZXB0MiwgaW50IF9fYWNjZXB0MykKK3sKKyAgcmVnaXN0ZXIgc2l6ZV90IF9fcmVzdWx0ID0gMDsKKyAgLyogUGxlYXNlIG5vdGUgdGhhdCBfX2FjY2VwdDEgdG8gX19hY2NlcHQzIG5ldmVyIGNhbiBiZSAnXDAnLiAgKi8KKyAgd2hpbGUgKF9fc1tfX3Jlc3VsdF0gPT0gX19hY2NlcHQxIHx8IF9fc1tfX3Jlc3VsdF0gPT0gX19hY2NlcHQyCisJIHx8IF9fc1tfX3Jlc3VsdF0gPT0gX19hY2NlcHQzKQorICAgICsrX19yZXN1bHQ7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKyNlbmRpZgorCisKKy8qIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2UgaW4gUyBvZiBhbnkgY2hhcmFjdGVyIGluIEFDQ0VQVC4gICovCisjaWYgIWRlZmluZWQgX0hBVkVfU1RSSU5HX0FSQ0hfc3RycGJyayB8fCBkZWZpbmVkIF9GT1JDRV9JTkxJTkVTCisjIGlmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHJwYnJrCisjICBpZiBfX0dOVUNfUFJFUkVRICgzLCAyKQorIyAgIGRlZmluZSBzdHJwYnJrKHMsIGFjY2VwdCkgXAorICBfX2V4dGVuc2lvbl9fCQkJCQkJCQkgICAgICBcCisgICh7IGNoYXIgX19hMCwgX19hMSwgX19hMjsJCQkJCQkgICAgICBcCisgICAgIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYWNjZXB0KSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoYWNjZXB0KQkgICAgICBcCisgICAgICA/ICgoX19idWlsdGluX2NvbnN0YW50X3AgKHMpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzKSkJCSAgICAgIFwKKwkgPyBfX2J1aWx0aW5fc3RycGJyayAocywgYWNjZXB0KQkJCQkgICAgICBcCisJIDogKChfX2EwID0gKChfX2NvbnN0IGNoYXIgICopIChhY2NlcHQpKVswXSwgX19hMCA9PSAnXDAnKQkgICAgICBcCisJICAgID8gKCh2b2lkKSAocyksIChjaGFyICopIE5VTEwpCQkJCSAgICAgIFwKKwkgICAgOiAoKF9fYTEgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMV0sIF9fYTEgPT0gJ1wwJykJICAgICAgXAorCSAgICAgICA/IF9fYnVpbHRpbl9zdHJjaHIgKHMsIF9fYTApCQkJCSAgICAgIFwKKwkgICAgICAgOiAoKF9fYTIgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMl0sIF9fYTIgPT0gJ1wwJykJICAgICAgXAorCQkgID8gX19zdHJwYnJrX2MyIChzLCBfX2EwLCBfX2ExKQkJCSAgICAgIFwKKwkJICA6ICgoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbM10gPT0gJ1wwJwkJICAgICAgXAorCQkgICAgID8gX19zdHJwYnJrX2MzIChzLCBfX2EwLCBfX2ExLCBfX2EyKQkJICAgICAgXAorCQkgICAgIDogX19idWlsdGluX3N0cnBicmsgKHMsIGFjY2VwdCkpKSkpKQkJICAgICAgXAorICAgICAgOiBfX2J1aWx0aW5fc3RycGJyayAocywgYWNjZXB0KSk7IH0pCisjICBlbHNlCisjICAgZGVmaW5lIHN0cnBicmsocywgYWNjZXB0KSBcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCSAgICAgIFwKKyAgKHsgY2hhciBfX2EwLCBfX2ExLCBfX2EyOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChhY2NlcHQpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChhY2NlcHQpCSAgICAgIFwKKyAgICAgID8gKChfX2EwID0gKChfX2NvbnN0IGNoYXIgICopIChhY2NlcHQpKVswXSwgX19hMCA9PSAnXDAnKQkJICAgICAgXAorCSA/ICgodm9pZCkgKHMpLCAoY2hhciAqKSBOVUxMKQkJCQkJICAgICAgXAorCSA6ICgoX19hMSA9ICgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVsxXSwgX19hMSA9PSAnXDAnKQkgICAgICBcCisJICAgID8gc3RyY2hyIChzLCBfX2EwKQkJCQkJCSAgICAgIFwKKwkgICAgOiAoKF9fYTIgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMl0sIF9fYTIgPT0gJ1wwJykJICAgICAgXAorCSAgICAgICA/IF9fc3RycGJya19jMiAocywgX19hMCwgX19hMSkJCQkJICAgICAgXAorCSAgICAgICA6ICgoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbM10gPT0gJ1wwJwkJICAgICAgXAorCQkgID8gX19zdHJwYnJrX2MzIChzLCBfX2EwLCBfX2ExLCBfX2EyKQkJCSAgICAgIFwKKwkJICA6IHN0cnBicmsgKHMsIGFjY2VwdCkpKSkpCQkJCSAgICAgIFwKKyAgICAgIDogc3RycGJyayAocywgYWNjZXB0KSk7IH0pCisjICBlbmRpZgorIyBlbmRpZgorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJwYnJrX2MyIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYWNjZXB0MSwKKwkJCQkgICAgIGludCBfX2FjY2VwdDIpOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJwYnJrX2MyIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYWNjZXB0MSwgaW50IF9fYWNjZXB0MikKK3sKKyAgLyogUGxlYXNlIG5vdGUgdGhhdCBfX2FjY2VwdDEgYW5kIF9fYWNjZXB0MiBuZXZlciBjYW4gYmUgJ1wwJy4gICovCisgIHdoaWxlICgqX19zICE9ICdcMCcgJiYgKl9fcyAhPSBfX2FjY2VwdDEgJiYgKl9fcyAhPSBfX2FjY2VwdDIpCisgICAgKytfX3M7CisgIHJldHVybiAqX19zID09ICdcMCcgPyBOVUxMIDogKGNoYXIgKikgKHNpemVfdCkgX19zOworfQorCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJwYnJrX2MzIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYWNjZXB0MSwKKwkJCQkgICAgIGludCBfX2FjY2VwdDIsIGludCBfX2FjY2VwdDMpOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJwYnJrX2MzIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYWNjZXB0MSwgaW50IF9fYWNjZXB0MiwKKwkgICAgICBpbnQgX19hY2NlcHQzKQoreworICAvKiBQbGVhc2Ugbm90ZSB0aGF0IF9fYWNjZXB0MSB0byBfX2FjY2VwdDMgbmV2ZXIgY2FuIGJlICdcMCcuICAqLworICB3aGlsZSAoKl9fcyAhPSAnXDAnICYmICpfX3MgIT0gX19hY2NlcHQxICYmICpfX3MgIT0gX19hY2NlcHQyCisJICYmICpfX3MgIT0gX19hY2NlcHQzKQorICAgICsrX19zOworICByZXR1cm4gKl9fcyA9PSAnXDAnID8gTlVMTCA6IChjaGFyICopIChzaXplX3QpIF9fczsKK30KKyNlbmRpZgorCisKKy8qIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgTkVFRExFIGluIEhBWVNUQUNLLiAgTmV3ZXIgZ2NjIHZlcnNpb25zCisgICBkbyB0aGlzIGl0c2VsZi4gICovCisjaWYgIWRlZmluZWQgX0hBVkVfU1RSSU5HX0FSQ0hfc3Ryc3RyICYmICFfX0dOVUNfUFJFUkVRICgyLCA5NykKKyMgZGVmaW5lIHN0cnN0cihoYXlzdGFjaywgbmVlZGxlKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAobmVlZGxlKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAobmVlZGxlKSBcCisJCSAgPyAoKChfX2NvbnN0IGNoYXIgKikgKG5lZWRsZSkpWzBdID09ICdcMCcJCSAgICAgIFwKKwkJICAgICA/IChjaGFyICopIChzaXplX3QpIChoYXlzdGFjaykJCQkgICAgICBcCisJCSAgICAgOiAoKChfX2NvbnN0IGNoYXIgKikgKG5lZWRsZSkpWzFdID09ICdcMCcJCSAgICAgIFwKKwkJCT8gc3RyY2hyIChoYXlzdGFjaywJCQkJICAgICAgXAorCQkJCSAgKChfX2NvbnN0IGNoYXIgKikgKG5lZWRsZSkpWzBdKSAJICAgICAgXAorCQkJOiBzdHJzdHIgKGhheXN0YWNrLCBuZWVkbGUpKSkJCQkgICAgICBcCisJCSAgOiBzdHJzdHIgKGhheXN0YWNrLCBuZWVkbGUpKSkKKyNlbmRpZgorCisKKyNpZiAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJ0b2tfciB8fCBkZWZpbmVkIF9GT1JDRV9JTkxJTkVTCisjIGlmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHJ0b2tfcgorIyAgZGVmaW5lIF9fc3RydG9rX3Iocywgc2VwLCBuZXh0cCkgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHNlcCkgJiYgX19zdHJpbmcyXzFicHRyX3AgKHNlcCkJICAgICAgXAorCQkgICYmICgoX19jb25zdCBjaGFyICopIChzZXApKVswXSAhPSAnXDAnCQkgICAgICBcCisJCSAgJiYgKChfX2NvbnN0IGNoYXIgKikgKHNlcCkpWzFdID09ICdcMCcJCSAgICAgIFwKKwkJICA/IF9fc3RydG9rX3JfMWMgKHMsICgoX19jb25zdCBjaGFyICopIChzZXApKVswXSwgbmV4dHApICAgICBcCisJCSAgOiBfX3N0cnRva19yIChzLCBzZXAsIG5leHRwKSkpCisjIGVuZGlmCisKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cnRva19yXzFjIChjaGFyICpfX3MsIGNoYXIgX19zZXAsIGNoYXIgKipfX25leHRwKTsKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RydG9rX3JfMWMgKGNoYXIgKl9fcywgY2hhciBfX3NlcCwgY2hhciAqKl9fbmV4dHApCit7CisgIGNoYXIgKl9fcmVzdWx0OworICBpZiAoX19zID09IE5VTEwpCisgICAgX19zID0gKl9fbmV4dHA7CisgIHdoaWxlICgqX19zID09IF9fc2VwKQorICAgICsrX19zOworICBfX3Jlc3VsdCA9IE5VTEw7CisgIGlmICgqX19zICE9ICdcMCcpCisgICAgeworICAgICAgX19yZXN1bHQgPSBfX3MrKzsKKyAgICAgIHdoaWxlICgqX19zICE9ICdcMCcpCisJaWYgKCpfX3MrKyA9PSBfX3NlcCkKKwkgIHsKKwkgICAgX19zWy0xXSA9ICdcMCc7CisJICAgIGJyZWFrOworCSAgfQorICAgIH0KKyAgKl9fbmV4dHAgPSBfX3M7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKyMgaWYgZGVmaW5lZCBfX1VTRV9QT1NJWCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKyMgIGRlZmluZSBzdHJ0b2tfcihzLCBzZXAsIG5leHRwKSBfX3N0cnRva19yIChzLCBzZXAsIG5leHRwKQorIyBlbmRpZgorI2VuZGlmCisKKworI2lmICFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX3N0cnNlcCB8fCBkZWZpbmVkIF9GT1JDRV9JTkxJTkVTCisjIGlmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHJzZXAKKworZXh0ZXJuIGNoYXIgKl9fc3Ryc2VwX2cgKGNoYXIgKipfX3N0cmluZ3AsIF9fY29uc3QgY2hhciAqX19kZWxpbSk7CisjICBkZWZpbmUgX19zdHJzZXAocywgcmVqZWN0KSBcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCSAgICAgIFwKKyAgKHsgY2hhciBfX3IwLCBfX3IxLCBfX3IyOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChyZWplY3QpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChyZWplY3QpCSAgICAgIFwKKyAgICAgICYmIChfX3IwID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzBdLAkJCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChyZWplY3QpKVswXSAhPSAnXDAnKQkJCSAgICAgIFwKKyAgICAgID8gKChfX3IxID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzFdLAkJCSAgICAgIFwKKwkgKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzFdID09ICdcMCcpCQkJICAgICAgXAorCSA/IF9fc3Ryc2VwXzFjIChzLCBfX3IwKQkJCQkJICAgICAgXAorCSA6ICgoX19yMiA9ICgoX19jb25zdCBjaGFyICopIChyZWplY3QpKVsyXSwgX19yMiA9PSAnXDAnKQkgICAgICBcCisJICAgID8gX19zdHJzZXBfMmMgKHMsIF9fcjAsIF9fcjEpCQkJCSAgICAgIFwKKwkgICAgOiAoKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzNdID09ICdcMCcJCQkgICAgICBcCisJICAgICAgID8gX19zdHJzZXBfM2MgKHMsIF9fcjAsIF9fcjEsIF9fcjIpCQkJICAgICAgXAorCSAgICAgICA6IF9fc3Ryc2VwX2cgKHMsIHJlamVjdCkpKSkJCQkJICAgICAgXAorICAgICAgOiBfX3N0cnNlcF9nIChzLCByZWplY3QpKTsgfSkKKyMgZW5kaWYKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3Ryc2VwXzFjIChjaGFyICoqX19zLCBjaGFyIF9fcmVqZWN0KTsKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3Ryc2VwXzFjIChjaGFyICoqX19zLCBjaGFyIF9fcmVqZWN0KQoreworICByZWdpc3RlciBjaGFyICpfX3JldHZhbCA9ICpfX3M7CisgIGlmIChfX3JldHZhbCAhPSBOVUxMICYmICgqX19zID0gc3RyY2hyIChfX3JldHZhbCwgX19yZWplY3QpKSAhPSBOVUxMKQorICAgICooKl9fcykrKyA9ICdcMCc7CisgIHJldHVybiBfX3JldHZhbDsKK30KKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3Ryc2VwXzJjIChjaGFyICoqX19zLCBjaGFyIF9fcmVqZWN0MSwgY2hhciBfX3JlamVjdDIpOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJzZXBfMmMgKGNoYXIgKipfX3MsIGNoYXIgX19yZWplY3QxLCBjaGFyIF9fcmVqZWN0MikKK3sKKyAgcmVnaXN0ZXIgY2hhciAqX19yZXR2YWwgPSAqX19zOworICBpZiAoX19yZXR2YWwgIT0gTlVMTCkKKyAgICB7CisgICAgICByZWdpc3RlciBjaGFyICpfX2NwID0gX19yZXR2YWw7CisgICAgICB3aGlsZSAoMSkKKwl7CisJICBpZiAoKl9fY3AgPT0gJ1wwJykKKwkgICAgeworCSAgICAgIF9fY3AgPSBOVUxMOworCSAgYnJlYWs7CisJICAgIH0KKwkgIGlmICgqX19jcCA9PSBfX3JlamVjdDEgfHwgKl9fY3AgPT0gX19yZWplY3QyKQorCSAgICB7CisJICAgICAgKl9fY3ArKyA9ICdcMCc7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICsrX19jcDsKKwl9CisgICAgICAqX19zID0gX19jcDsKKyAgICB9CisgIHJldHVybiBfX3JldHZhbDsKK30KKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3Ryc2VwXzNjIChjaGFyICoqX19zLCBjaGFyIF9fcmVqZWN0MSwgY2hhciBfX3JlamVjdDIsCisJCQkJICAgY2hhciBfX3JlamVjdDMpOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJzZXBfM2MgKGNoYXIgKipfX3MsIGNoYXIgX19yZWplY3QxLCBjaGFyIF9fcmVqZWN0MiwgY2hhciBfX3JlamVjdDMpCit7CisgIHJlZ2lzdGVyIGNoYXIgKl9fcmV0dmFsID0gKl9fczsKKyAgaWYgKF9fcmV0dmFsICE9IE5VTEwpCisgICAgeworICAgICAgcmVnaXN0ZXIgY2hhciAqX19jcCA9IF9fcmV0dmFsOworICAgICAgd2hpbGUgKDEpCisJeworCSAgaWYgKCpfX2NwID09ICdcMCcpCisJICAgIHsKKwkgICAgICBfX2NwID0gTlVMTDsKKwkgIGJyZWFrOworCSAgICB9CisJICBpZiAoKl9fY3AgPT0gX19yZWplY3QxIHx8ICpfX2NwID09IF9fcmVqZWN0MiB8fCAqX19jcCA9PSBfX3JlamVjdDMpCisJICAgIHsKKwkgICAgICAqX19jcCsrID0gJ1wwJzsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgKytfX2NwOworCX0KKyAgICAgICpfX3MgPSBfX2NwOworICAgIH0KKyAgcmV0dXJuIF9fcmV0dmFsOworfQorIyBpZmRlZiBfX1VTRV9CU0QKKyMgIGRlZmluZSBzdHJzZXAocywgcmVqZWN0KSBfX3N0cnNlcCAocywgcmVqZWN0KQorIyBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG5lZWQgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBmb3IgaW5saW5lIHN0cmR1cCgpLgorICAgUmVmZXJyaW5nIHRvIHN0ZGxpYi5oIChldmVuIG1pbmltYWxseSkgaXMgbm90IGFsbG93ZWQKKyAgIGluIGFueSBvZiB0aGUgdGlnaHQgc3RhbmRhcmRzIGNvbXBsaWFudCBtb2Rlcy4gICovCisjaWZkZWYgX19VU0VfTUlTQworCisjIGlmICFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX3N0cmR1cCB8fCAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJuZHVwCisjICBkZWZpbmUgX19uZWVkX21hbGxvY19hbmRfY2FsbG9jCisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgZW5kaWYKKworIyBpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfc3RyZHVwCisKK2V4dGVybiBjaGFyICpfX3N0cmR1cCAoX19jb25zdCBjaGFyICpfX3N0cmluZykgX19USFJPVyBfX2F0dHJpYnV0ZV9tYWxsb2NfXzsKKyMgIGRlZmluZSBfX3N0cmR1cChzKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAocykgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMpCSAgICAgIFwKKwkJICA/ICgoKF9fY29uc3QgY2hhciAqKSAocykpWzBdID09ICdcMCcJCQkgICAgICBcCisJCSAgICAgPyAoY2hhciAqKSBjYWxsb2MgKChzaXplX3QpIDEsIChzaXplX3QpIDEpCQkgICAgICBcCisJCSAgICAgOiAoeyBzaXplX3QgX19sZW4gPSBzdHJsZW4gKHMpICsgMTsJCSAgICAgIFwKKwkJCSAgY2hhciAqX19yZXR2YWwgPSAoY2hhciAqKSBtYWxsb2MgKF9fbGVuKTsJICAgICAgXAorCQkJICBpZiAoX19yZXR2YWwgIT0gTlVMTCkJCQkJICAgICAgXAorCQkJICAgIF9fcmV0dmFsID0gKGNoYXIgKikgbWVtY3B5IChfX3JldHZhbCwgcywgX19sZW4pOyAgXAorCQkJICBfX3JldHZhbDsgfSkpCQkJCQkgICAgICBcCisJCSAgOiBfX3N0cmR1cCAocykpKQorCisjICBpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorIyAgIGRlZmluZSBzdHJkdXAocykgX19zdHJkdXAgKHMpCisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHJuZHVwCisKK2V4dGVybiBjaGFyICpfX3N0cm5kdXAgKF9fY29uc3QgY2hhciAqX19zdHJpbmcsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfbWFsbG9jX187CisjICBkZWZpbmUgX19zdHJuZHVwKHMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAocykJICAgICAgXAorCQkgID8gKCgoX19jb25zdCBjaGFyICopIChzKSlbMF0gPT0gJ1wwJwkJCSAgICAgIFwKKwkJICAgICA/IChjaGFyICopIGNhbGxvYyAoKHNpemVfdCkgMSwgKHNpemVfdCkgMSkJCSAgICAgIFwKKwkJICAgICA6ICh7IHNpemVfdCBfX2xlbiA9IHN0cmxlbiAocykgKyAxOwkJICAgICAgXAorCQkJICBzaXplX3QgX19uID0gKG4pOwkJCQkgICAgICBcCisJCQkgIGNoYXIgKl9fcmV0dmFsOwkJCQkgICAgICBcCisJCQkgIGlmIChfX24gPCBfX2xlbikJCQkJICAgICAgXAorCQkJICAgIF9fbGVuID0gX19uICsgMTsJCQkJICAgICAgXAorCQkJICBfX3JldHZhbCA9IChjaGFyICopIG1hbGxvYyAoX19sZW4pOwkJICAgICAgXAorCQkJICBpZiAoX19yZXR2YWwgIT0gTlVMTCkJCQkJICAgICAgXAorCQkJICAgIHsJCQkJCQkgICAgICBcCisJCQkgICAgICBfX3JldHZhbFtfX2xlbiAtIDFdID0gJ1wwJzsJCSAgICAgIFwKKwkJCSAgICAgIF9fcmV0dmFsID0gKGNoYXIgKikgbWVtY3B5IChfX3JldHZhbCwgcywJICAgICAgXAorCQkJCQkJCSAgX19sZW4gLSAxKTsJICAgICAgXAorCQkJICAgIH0JCQkJCQkgICAgICBcCisJCQkgIF9fcmV0dmFsOyB9KSkJCQkJCSAgICAgIFwKKwkJICA6IF9fc3RybmR1cCAocywgbikpKQorCisjICBpZmRlZiBfX1VTRV9HTlUKKyMgICBkZWZpbmUgc3RybmR1cChzLCBuKSBfX3N0cm5kdXAgKHMsIG4pCisjICBlbmRpZgorIyBlbmRpZgorCisjZW5kaWYgLyogVXNlIG1pc2MuIG9yIHVzZSBHTlUuICAqLworCisjaWZuZGVmIF9GT1JDRV9JTkxJTkVTCisjIHVuZGVmIF9fU1RSSU5HX0lOTElORQorI2VuZGlmCisKKyNlbmRpZiAvKiBObyBzdHJpbmcgaW5saW5lcy4gICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdHJpbmczLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdHJpbmczLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY0NzcyNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N0cmluZzMuaApAQCAtMCwwICsxLDE1MyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVFJJTkdfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL3N0cmluZzMuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHN0cmluZy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCitfX3dhcm5kZWNsIChfX3dhcm5fbWVtc2V0X3plcm9fbGVuLAorCSAgICAibWVtc2V0IHVzZWQgd2l0aCBjb25zdGFudCB6ZXJvIGxlbmd0aCBwYXJhbWV0ZXI7IHRoaXMgY291bGQgYmUgZHVlIHRvIHRyYW5zcG9zZWQgcGFyYW1ldGVycyIpOworCisjaWZuZGVmIF9fY3BsdXNwbHVzCisvKiBYWFggVGhpcyBpcyB0ZW1wb3JhcmlseS4gIFdlIHNob3VsZCBub3QgcmVkZWZpbmUgYW55IG9mIHRoZSBzeW1ib2xzCisgICBhbmQgaW5zdGVhZCBpbnRlZ3JhdGUgdGhlIGVycm9yIGNoZWNraW5nIGludG8gdGhlIG9yaWdpbmFsCisgICBkZWZpbml0aW9ucy4gICovCisjIHVuZGVmIG1lbWNweQorIyB1bmRlZiBtZW1tb3ZlCisjIHVuZGVmIG1lbXNldAorIyB1bmRlZiBzdHJjYXQKKyMgdW5kZWYgc3RyY3B5CisjIHVuZGVmIHN0cm5jYXQKKyMgdW5kZWYgc3RybmNweQorIyBpZmRlZiBfX1VTRV9HTlUKKyMgIHVuZGVmIG1lbXBjcHkKKyMgIHVuZGVmIHN0cGNweQorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9CU0QKKyMgIHVuZGVmIGJjb3B5CisjICB1bmRlZiBiemVybworIyBlbmRpZgorI2VuZGlmCisKKworX19leHRlcm5fYWx3YXlzX2lubGluZSB2b2lkICoKK19fTlRIIChtZW1jcHkgKHZvaWQgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IHZvaWQgKl9fcmVzdHJpY3QgX19zcmMsCisJICAgICAgIHNpemVfdCBfX2xlbikpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19tZW1jcHlfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2xlbiwgX19ib3MwIChfX2Rlc3QpKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSB2b2lkICoKK19fTlRIIChtZW1tb3ZlICh2b2lkICpfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqX19zcmMsIHNpemVfdCBfX2xlbikpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19tZW1tb3ZlX2NoayAoX19kZXN0LCBfX3NyYywgX19sZW4sIF9fYm9zMCAoX19kZXN0KSk7Cit9CisKKyNpZmRlZiBfX1VTRV9HTlUKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgdm9pZCAqCitfX05USCAobWVtcGNweSAodm9pZCAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqX19yZXN0cmljdCBfX3NyYywKKwkJc2l6ZV90IF9fbGVuKSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX21lbXBjcHlfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2xlbiwgX19ib3MwIChfX2Rlc3QpKTsKK30KKyNlbmRpZgorCisKKy8qIFRoZSBmaXJzdCB0d28gdGVzdHMgaGVyZSBoZWxwIHRvIGNhdGNoIGEgc29tZXdoYXQgY29tbW9uIHByb2JsZW0KKyAgIHdoZXJlIHRoZSBzZWNvbmQgYW5kIHRoaXJkIHBhcmFtZXRlciBhcmUgdHJhbnNwb3NlZC4gIFRoaXMgaXMKKyAgIGVzcGVjaWFsbHkgcHJvYmxlbWF0aWMgaWYgdGhlIGludGVuZGVkIGZpbGwgdmFsdWUgaXMgemVyby4gIEluIHRoaXMKKyAgIGNhc2Ugbm8gd29yayBpcyBkb25lIGF0IGFsbC4gIFdlIGRldGVjdCB0aGVzZSBwcm9ibGVtcyBieSByZWZlcnJpbmcKKyAgIG5vbi1leGlzdGluZyBmdW5jdGlvbnMuICAqLworX19leHRlcm5fYWx3YXlzX2lubGluZSB2b2lkICoKK19fTlRIIChtZW1zZXQgKHZvaWQgKl9fZGVzdCwgaW50IF9fY2gsIHNpemVfdCBfX2xlbikpCit7CisgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19sZW4pICYmIF9fbGVuID09IDAKKyAgICAgICYmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fY2gpIHx8IF9fY2ggIT0gMCkpCisgICAgeworICAgICAgX193YXJuX21lbXNldF96ZXJvX2xlbiAoKTsKKyAgICAgIHJldHVybiBfX2Rlc3Q7CisgICAgfQorICByZXR1cm4gX19idWlsdGluX19fbWVtc2V0X2NoayAoX19kZXN0LCBfX2NoLCBfX2xlbiwgX19ib3MwIChfX2Rlc3QpKTsKK30KKworI2lmZGVmIF9fVVNFX0JTRAorX19leHRlcm5fYWx3YXlzX2lubGluZSB2b2lkCitfX05USCAoYmNvcHkgKF9fY29uc3Qgdm9pZCAqX19zcmMsIHZvaWQgKl9fZGVzdCwgc2l6ZV90IF9fbGVuKSkKK3sKKyAgKHZvaWQpIF9fYnVpbHRpbl9fX21lbW1vdmVfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2xlbiwgX19ib3MwIChfX2Rlc3QpKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSB2b2lkCitfX05USCAoYnplcm8gKHZvaWQgKl9fZGVzdCwgc2l6ZV90IF9fbGVuKSkKK3sKKyAgKHZvaWQpIF9fYnVpbHRpbl9fX21lbXNldF9jaGsgKF9fZGVzdCwgJ1wwJywgX19sZW4sIF9fYm9zMCAoX19kZXN0KSk7Cit9CisjZW5kaWYKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBjaGFyICoKK19fTlRIIChzdHJjcHkgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMpKQoreworICByZXR1cm4gX19idWlsdGluX19fc3RyY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19ib3MgKF9fZGVzdCkpOworfQorCisjaWZkZWYgX19VU0VfR05VCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGNoYXIgKgorX19OVEggKHN0cGNweSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYykpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19zdHBjcHlfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2JvcyAoX19kZXN0KSk7Cit9CisjZW5kaWYKKworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGNoYXIgKgorX19OVEggKHN0cm5jcHkgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMsCisJCXNpemVfdCBfX2xlbikpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19zdHJuY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19sZW4sIF9fYm9zIChfX2Rlc3QpKTsKK30KKworLy8gWFhYIFdlIGhhdmUgbm8gY29ycmVzcG9uZGluZyBidWlsdGluIHlldC4KK2V4dGVybiBjaGFyICpfX3N0cG5jcHlfY2hrIChjaGFyICpfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19zcmMsIHNpemVfdCBfX24sCisJCQkgICAgc2l6ZV90IF9fZGVzdGxlbikgX19USFJPVzsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUX05USCAoX19zdHBuY3B5X2FsaWFzLCAoY2hhciAqX19kZXN0LAorCQkJCQkgICAgICAgX19jb25zdCBjaGFyICpfX3NyYywKKwkJCQkJICAgICAgIHNpemVfdCBfX24pLCBzdHBuY3B5KTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBjaGFyICoKK19fTlRIIChzdHBuY3B5IChjaGFyICpfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19zcmMsIHNpemVfdCBfX24pKQoreworICBpZiAoX19ib3MgKF9fZGVzdCkgIT0gKHNpemVfdCkgLTEKKyAgICAgICYmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbikgfHwgX19uIDw9IF9fYm9zIChfX2Rlc3QpKSkKKyAgICByZXR1cm4gX19zdHBuY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19uLCBfX2JvcyAoX19kZXN0KSk7CisgIHJldHVybiBfX3N0cG5jcHlfYWxpYXMgKF9fZGVzdCwgX19zcmMsIF9fbik7Cit9CisKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBjaGFyICoKK19fTlRIIChzdHJjYXQgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMpKQoreworICByZXR1cm4gX19idWlsdGluX19fc3RyY2F0X2NoayAoX19kZXN0LCBfX3NyYywgX19ib3MgKF9fZGVzdCkpOworfQorCisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgY2hhciAqCitfX05USCAoc3RybmNhdCAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywKKwkJc2l6ZV90IF9fbGVuKSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX3N0cm5jYXRfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2xlbiwgX19ib3MgKF9fZGVzdCkpOworfQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3Ryb3B0cy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3Ryb3B0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZTJjMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zdHJvcHRzLmgKQEAgLTAsMCArMSwyMzEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1RST1BUU19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3N0cm9wdHMuaD4gZGlyZWN0bHk7IHVzZSA8c3Ryb3B0cy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9CSVRTX1NUUk9QVFNfSAorI2RlZmluZSBfQklUU19TVFJPUFRTX0gJMQorCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisvKiBNYWNyb3MgdXNlZCBhcyBgcmVxdWVzdCcgYXJndW1lbnQgdG8gYGlvY3RsJy4gICovCisjZGVmaW5lIF9fU0lECQkoJ1MnIDw8IDgpCisKKyNkZWZpbmUgSV9OUkVBRAkgICAgKF9fU0lEIHwgMSkJLyogQ291bnRzIHRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyBpbiB0aGUgZGF0YQorCQkJCSAgIGJsb2NrIGluIHRoZSBmaXJzdCBtZXNzYWdlLiAgKi8KKyNkZWZpbmUgSV9QVVNICSAgICAoX19TSUQgfCAyKQkvKiBQdXNoIFNUUkVBTVMgbW9kdWxlIG9udG8gdG9wIG9mIHRoZSBjdXJyZW50CisJCQkJICAgU1RSRUFNLCBqdXN0IGJlbG93IHRoZSBTVFJFQU0gaGVhZC4gICovCisjZGVmaW5lIElfUE9QCSAgICAoX19TSUQgfCAzKQkvKiBSZW1vdmUgU1RSRUFNUyBtb2R1bGUgZnJvbSBqdXN0IGJlbG93IHRoZQorCQkJCSAgIFNUUkVBTSBoZWFkLiAgKi8KKyNkZWZpbmUgSV9MT09LCSAgICAoX19TSUQgfCA0KQkvKiBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIGp1c3QgYmVsb3cKKwkJCQkgICB0aGUgU1RSRUFNIGhlYWQgYW5kIHBsYWNlIGl0IGluIGEgY2hhcmFjdGVyCisJCQkJICAgc3RyaW5nLiAgKi8KKyNkZWZpbmUgSV9GTFVTSAkgICAgKF9fU0lEIHwgNSkJLyogRmx1c2ggYWxsIGlucHV0IGFuZC9vciBvdXRwdXQuICAqLworI2RlZmluZSBJX1NSRE9QVCAgICAoX19TSUQgfCA2KQkvKiBTZXRzIHRoZSByZWFkIG1vZGUuICAqLworI2RlZmluZSBJX0dSRE9QVCAgICAoX19TSUQgfCA3KQkvKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJlYWQgbW9kZSBzZXR0aW5nLiAgKi8KKyNkZWZpbmUgSV9TVFIJICAgIChfX1NJRCB8IDgpCS8qIENvbnN0cnVjdCBhbiBpbnRlcm5hbCBTVFJFQU1TIGBpb2N0bCcKKwkJCQkgICBtZXNzYWdlIGFuZCBzZW5kIHRoYXQgbWVzc2FnZSBkb3duc3RyZWFtLiAqLworI2RlZmluZSBJX1NFVFNJRyAgICAoX19TSUQgfCA5KQkvKiBJbmZvcm0gdGhlIFNUUkVBTSBoZWFkIHRoYXQgdGhlIHByb2Nlc3MKKwkJCQkgICB3YW50cyB0aGUgU0lHUE9MTCBzaWduYWwgaXNzdWVkLiAgKi8KKyNkZWZpbmUgSV9HRVRTSUcgICAgKF9fU0lEIHwxMCkgLyogUmV0dXJuIHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZSBjYWxsaW5nCisJCQkJICAgcHJvY2VzcyBpcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCB0byBiZSBzZW50CisJCQkJICAgYSBTSUdQT0xMIHNpZ25hbC4gICovCisjZGVmaW5lIElfRklORAkgICAgKF9fU0lEIHwxMSkgLyogQ29tcGFyZXMgdGhlIG5hbWVzIG9mIGFsbCBtb2R1bGVzIGN1cnJlbnRseQorCQkJCSAgIHByZXNlbnQgaW4gdGhlIFNUUkVBTSB0byB0aGUgbmFtZSBwb2ludGVkIHRvCisJCQkJICAgYnkgYGFyZycuICAqLworI2RlZmluZSBJX0xJTksJICAgIChfX1NJRCB8MTIpIC8qIENvbm5lY3QgdHdvIFNUUkVBTXMuICAqLworI2RlZmluZSBJX1VOTElOSyAgICAoX19TSUQgfDEzKSAvKiBEaXNjb25uZWN0cyB0aGUgdHdvIFNUUkVBTXMuICAqLworI2RlZmluZSBJX1BFRUsJICAgIChfX1NJRCB8MTUpIC8qIEFsbG93cyBhIHByb2Nlc3MgdG8gcmV0cmlldmUgdGhlIGluZm9ybWF0aW9uCisJCQkJICAgaW4gdGhlIGZpcnN0IG1lc3NhZ2Ugb24gdGhlIFNUUkVBTSBoZWFkIHJlYWQKKwkJCQkgICBxdWV1ZSB3aXRob3V0IHRha2luZyB0aGUgbWVzc2FnZSBvZmYgdGhlCisJCQkJICAgcXVldWUuICAqLworI2RlZmluZSBJX0ZESU5TRVJUICAoX19TSUQgfDE2KSAvKiBDcmVhdGUgYSBtZXNzYWdlIGZyb20gdGhlIHNwZWNpZmllZAorCQkJCSAgIGJ1ZmZlcihzKSwgYWRkcyBpbmZvcm1hdGlvbiBhYm91dCBhbm90aGVyCisJCQkJICAgU1RSRUFNLCBhbmQgc2VuZCB0aGUgbWVzc2FnZSBkb3duc3RyZWFtLiAgKi8KKyNkZWZpbmUgSV9TRU5ERkQgICAgKF9fU0lEIHwxNykgLyogUmVxdWVzdHMgdGhlIFNUUkVBTSBhc3NvY2lhdGVkIHdpdGggYGZpbGRlcycKKwkJCQkgICB0byBzZW5kIGEgbWVzc2FnZSwgY29udGFpbmluZyBhIGZpbGUKKwkJCQkgICBwb2ludGVyLCB0byB0aGUgU1RSRUFNIGhlYWQgYXQgdGhlIG90aGVyIGVuZAorCQkJCSAgIG9mIGEgU1RSRUFNUyBwaXBlLiAgKi8KKyNkZWZpbmUgSV9SRUNWRkQgICAgKF9fU0lEIHwxNCkgLyogTm9uLUVGVCBkZWZpbml0aW9uLiAgKi8KKyNkZWZpbmUgSV9TV1JPUFQgICAgKF9fU0lEIHwxOSkgLyogU2V0IHRoZSB3cml0ZSBtb2RlLiAgKi8KKyNkZWZpbmUgSV9HV1JPUFQgICAgKF9fU0lEIHwyMCkgLyogUmV0dXJuIHRoZSBjdXJyZW50IHdyaXRlIG1vZGUgc2V0dGluZy4gICovCisjZGVmaW5lIElfTElTVAkgICAgKF9fU0lEIHwyMSkgLyogTGlzdCBhbGwgdGhlIG1vZHVsZSBuYW1lcyBvbiB0aGUgU1RSRUFNLCB1cAorCQkJCSAgIHRvIGFuZCBpbmNsdWRpbmcgdGhlIHRvcG1vc3QgZHJpdmVyIG5hbWUuICovCisjZGVmaW5lIElfUExJTksJICAgIChfX1NJRCB8MjIpIC8qIENvbm5lY3QgdHdvIFNUUkVBTXMgd2l0aCBhIHBlcnNpc3RlbnQKKwkJCQkgICBsaW5rLiAgKi8KKyNkZWZpbmUgSV9QVU5MSU5LICAgKF9fU0lEIHwyMykgLyogRGlzY29ubmVjdCB0aGUgdHdvIFNUUkVBTXMgdGhhdCB3ZXJlCisJCQkJICAgY29ubmVjdGVkIHdpdGggYSBwZXJzaXN0ZW50IGxpbmsuICAqLworI2RlZmluZSBJX0ZMVVNIQkFORCAoX19TSUQgfDI4KSAvKiBGbHVzaCBvbmx5IGJhbmQgc3BlY2lmaWVkLiAgKi8KKyNkZWZpbmUgSV9DS0JBTkQgICAgKF9fU0lEIHwyOSkgLyogQ2hlY2sgaWYgdGhlIG1lc3NhZ2Ugb2YgYSBnaXZlbiBwcmlvcml0eQorCQkJCSAgIGJhbmQgZXhpc3RzIG9uIHRoZSBTVFJFQU0gaGVhZCByZWFkCisJCQkJICAgcXVldWUuICAqLworI2RlZmluZSBJX0dFVEJBTkQgICAoX19TSUQgfDMwKSAvKiBSZXR1cm4gdGhlIHByaW9yaXR5IGJhbmQgb2YgdGhlIGZpcnN0CisJCQkJICAgbWVzc2FnZSBvbiB0aGUgU1RSRUFNIGhlYWQgcmVhZCBxdWV1ZS4gICovCisjZGVmaW5lIElfQVRNQVJLICAgIChfX1NJRCB8MzEpIC8qIFNlZSBpZiB0aGUgY3VycmVudCBtZXNzYWdlIG9uIHRoZSBTVFJFQU0KKwkJCQkgICBoZWFkIHJlYWQgcXVldWUgaXMgIm1hcmtlZCIgYnkgc29tZSBtb2R1bGUKKwkJCQkgICBkb3duc3RyZWFtLiAgKi8KKyNkZWZpbmUgSV9TRVRDTFRJTUUgKF9fU0lEIHwzMikgLyogU2V0IHRoZSB0aW1lIHRoZSBTVFJFQU0gaGVhZCB3aWxsIGRlbGF5IHdoZW4KKwkJCQkgICBhIFNUUkVBTSBpcyBjbG9zaW5nIGFuZCB0aGVyZSBpcyBkYXRhIG9uCisJCQkJICAgdGhlIHdyaXRlIHF1ZXVlcy4gICovCisjZGVmaW5lIElfR0VUQ0xUSU1FIChfX1NJRCB8MzMpIC8qIEdldCBjdXJyZW50IHZhbHVlIGZvciBjbG9zaW5nIHRpbWVvdXQuICAqLworI2RlZmluZSBJX0NBTlBVVCAgICAoX19TSUQgfDM0KSAvKiBDaGVjayBpZiBhIGNlcnRhaW4gYmFuZCBpcyB3cml0YWJsZS4gICovCisKKworLyogVXNlZCBpbiBgSV9MT09LJyByZXF1ZXN0LiAgKi8KKyNkZWZpbmUgRk1OQU1FU1oJOAkvKiBjb21wYXRpYmlsaXR5IHcvVW5peFdhcmUvU29sYXJpcy4gICovCisKKy8qIEZsdXNoIG9wdGlvbnMuICAqLworI2RlZmluZSBGTFVTSFIJCTB4MDEJLyogRmx1c2ggcmVhZCBxdWV1ZXMuICAqLworI2RlZmluZSBGTFVTSFcJCTB4MDIJLyogRmx1c2ggd3JpdGUgcXVldWVzLiAgKi8KKyNkZWZpbmUgRkxVU0hSVwkJMHgwMwkvKiBGbHVzaCByZWFkIGFuZCB3cml0ZSBxdWV1ZXMuICAqLworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgRkxVU0hCQU5ECTB4MDQJLyogRmx1c2ggb25seSBzcGVjaWZpZWQgYmFuZC4gICovCisjZW5kaWYKKworLyogUG9zc2libGUgYXJndW1lbnRzIGZvciBgSV9TRVRTSUcnLiAgKi8KKyNkZWZpbmUgU19JTlBVVAkJMHgwMDAxCS8qIEEgbWVzc2FnZSwgb3RoZXIgdGhhbiBhIGhpZ2gtcHJpb3JpdHkKKwkJCQkgICBtZXNzYWdlLCBoYXMgYXJyaXZlZC4gICovCisjZGVmaW5lIFNfSElQUkkJCTB4MDAwMgkvKiBBIGhpZ2gtcHJpb3JpdHkgbWVzc2FnZSBpcyBwcmVzZW50LiAgKi8KKyNkZWZpbmUgU19PVVRQVVQJMHgwMDA0CS8qIFRoZSB3cml0ZSBxdWV1ZSBmb3Igbm9ybWFsIGRhdGEgaXMgbm8gbG9uZ2VyCisJCQkJICAgZnVsbC4gICovCisjZGVmaW5lIFNfTVNHCQkweDAwMDgJLyogQSBTVFJFQU1TIHNpZ25hbCBtZXNzYWdlIHRoYXQgY29udGFpbnMgdGhlCisJCQkJICAgU0lHUE9MTCBzaWduYWwgcmVhY2hlcyB0aGUgZnJvbnQgb2YgdGhlCisJCQkJICAgU1RSRUFNIGhlYWQgcmVhZCBxdWV1ZS4gICovCisjZGVmaW5lIFNfRVJST1IJCTB4MDAxMAkvKiBOb3RpZmljYXRpb24gb2YgYW4gZXJyb3IgY29uZGl0aW9uLiAgKi8KKyNkZWZpbmUgU19IQU5HVVAJMHgwMDIwCS8qIE5vdGlmaWNhdGlvbiBvZiBhIGhhbmd1cC4gICovCisjZGVmaW5lIFNfUkROT1JNCTB4MDA0MAkvKiBBIG5vcm1hbCBtZXNzYWdlIGhhcyBhcnJpdmVkLiAgKi8KKyNkZWZpbmUgU19XUk5PUk0JU19PVVRQVVQKKyNkZWZpbmUgU19SREJBTkQJMHgwMDgwCS8qIEEgbWVzc2FnZSB3aXRoIGEgbm9uLXplcm8gcHJpb3JpdHkgaGFzCisJCQkJICAgYXJyaXZlZC4gICovCisjZGVmaW5lIFNfV1JCQU5ECTB4MDEwMAkvKiBUaGUgd3JpdGUgcXVldWUgZm9yIGEgbm9uLXplcm8gcHJpb3JpdHkKKwkJCQkgICBiYW5kIGlzIG5vIGxvbmdlciBmdWxsLiAgKi8KKyNkZWZpbmUgU19CQU5EVVJHCTB4MDIwMAkvKiBXaGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTX1JEQkFORCwKKwkJCQkgICBTSUdVUkcgaXMgZ2VuZXJhdGVkIGluc3RlYWQgb2YgU0lHUE9MTCB3aGVuCisJCQkJICAgYSBwcmlvcml0eSBtZXNzYWdlIHJlYWNoZXMgdGhlIGZyb250IG9mIHRoZQorCQkJCSAgIFNUUkVBTSBoZWFkIHJlYWQgcXVldWUuICAqLworCisvKiBPcHRpb24gZm9yIGBJX1BFRUsnLiAgKi8KKyNkZWZpbmUgUlNfSElQUkkJMHgwMQkvKiBPbmx5IGxvb2sgZm9yIGhpZ2gtcHJpb3JpdHkgbWVzc2FnZXMuICAqLworCisvKiBPcHRpb25zIGZvciBgSV9TUkRPUFQnLiAgKi8KKyNkZWZpbmUgUk5PUk0JCTB4MDAwMAkvKiBCeXRlLVNUUkVBTSBtb2RlLCB0aGUgZGVmYXVsdC4gICovCisjZGVmaW5lIFJNU0dECQkweDAwMDEJLyogTWVzc2FnZS1kaXNjYXJkIG1vZGUuICAgKi8KKyNkZWZpbmUgUk1TR04JCTB4MDAwMgkvKiBNZXNzYWdlLW5vbmRpc2NhcmQgbW9kZS4gICAqLworI2RlZmluZSBSUFJPVERBVAkweDAwMDQJLyogRGVsaXZlciB0aGUgY29udHJvbCBwYXJ0IG9mIGEgbWVzc2FnZSBhcworCQkJCSAgIGRhdGEuICAqLworI2RlZmluZSBSUFJPVERJUwkweDAwMDgJLyogRGlzY2FyZCB0aGUgY29udHJvbCBwYXJ0IG9mIGEgbWVzc2FnZSwKKwkJCQkgICBkZWxpdmVyaW5nIGFueSBkYXRhIHBhcnQuICAqLworI2RlZmluZSBSUFJPVE5PUk0JMHgwMDEwCS8qIEZhaWwgYHJlYWQnIHdpdGggRUJBRE1TRyBpZiBhIG1lc3NhZ2UKKwkJCQkgICBjb250YWluaW5nIGEgY29udHJvbCBwYXJ0IGlzIGF0IHRoZSBmcm9udAorCQkJCSAgIG9mIHRoZSBTVFJFQU0gaGVhZCByZWFkIHF1ZXVlLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIFJQUk9UTUFTSwkweDAwMUMJLyogVGhlIFJQUk9UIGJpdHMgKi8KKyNlbmRpZgorCisvKiBQb3NzaWJsZSBtb2RlIGZvciBgSV9TV1JPUFQnLiAgKi8KKyNkZWZpbmUgU05EWkVSTwkJMHgwMDEJLyogU2VuZCBhIHplcm8tbGVuZ3RoIG1lc3NhZ2UgZG93bnN0cmVhbSB3aGVuIGEKKwkJCQkgICBgd3JpdGUnIG9mIDAgYnl0ZXMgb2NjdXJzLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIFNORFBJUEUJMHgwMDIJLyogU2VuZCBTSUdQSVBFIG9uIHdyaXRlIGFuZCBwdXRtc2cgaWYKKwkJCQkgICBzZF93ZXJyb3IgaXMgc2V0LiAgKi8KKyNlbmRpZgorCisvKiBBcmd1bWVudHMgZm9yIGBJX0FUTUFSSycuICAqLworI2RlZmluZSBBTllNQVJLCQkweDAxCS8qIENoZWNrIGlmIHRoZSBtZXNzYWdlIGlzIG1hcmtlZC4gICovCisjZGVmaW5lIExBU1RNQVJLCTB4MDIJLyogQ2hlY2sgaWYgdGhlIG1lc3NhZ2UgaXMgdGhlIGxhc3Qgb25lIG1hcmtlZAorCQkJCSAgIG9uIHRoZSBxdWV1ZS4gICovCisKKy8qIEFyZ3VtZW50IGZvciBgSV9VTkxJTksnLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIE1VWElEX0FMTAkoLTEpCS8qIFVubGluayBhbGwgU1RSRUFNcyBsaW5rZWQgdG8gdGhlIFNUUkVBTQorCQkJCSAgIGFzc29jaWF0ZWQgd2l0aCBgZmlsZGVzJy4gICovCisjZW5kaWYKKworCisvKiBNYWNyb3MgZm9yIGBnZXRtc2cnLCBgZ2V0cG1zZycsIGBwdXRtc2cnIGFuZCBgcHV0cG1zZycuICAqLworI2RlZmluZSBNU0dfSElQUkkJMHgwMQkvKiBTZW5kL3JlY2VpdmUgaGlnaCBwcmlvcml0eSBtZXNzYWdlLiAgKi8KKyNkZWZpbmUgTVNHX0FOWQkJMHgwMgkvKiBSZWNlaXZlIGFueSBtZXNzYWdlLiAgKi8KKyNkZWZpbmUgTVNHX0JBTkQJMHgwNAkvKiBSZWNlaXZlIG1lc3NhZ2UgZnJvbSBzcGVjaWZpZWQgYmFuZC4gICovCisKKy8qIFZhbHVlcyByZXR1cm5lZCBieSBnZXRtc2cgYW5kIGdldHBtc2cgKi8KKyNkZWZpbmUgTU9SRUNUTAkJMQkvKiBNb3JlIGNvbnRyb2wgaW5mb3JtYXRpb24gaXMgbGVmdCBpbgorCQkJCSAgIG1lc3NhZ2UuICAqLworI2RlZmluZSBNT1JFREFUQQkyCS8qIE1vcmUgZGF0YSBpcyBsZWZ0IGluIG1lc3NhZ2UuICAqLworCisKKy8qIFN0cnVjdHVyZSB1c2VkIGZvciB0aGUgSV9GTFVTSEJBTkQgaW9jdGwgb24gc3RyZWFtcy4gICovCitzdHJ1Y3QgYmFuZGluZm8KKyAgeworICAgIHVuc2lnbmVkIGNoYXIgYmlfcHJpOworICAgIGludCBiaV9mbGFnOworICB9OworCitzdHJ1Y3Qgc3RyYnVmCisgIHsKKyAgICBpbnQgbWF4bGVuOwkJLyogTWF4aW11bSBidWZmZXIgbGVuZ3RoLiAgKi8KKyAgICBpbnQgbGVuOwkJLyogTGVuZ3RoIG9mIGRhdGEuICAqLworICAgIGNoYXIgKmJ1ZjsJCS8qIFBvaW50ZXIgdG8gYnVmZmVyLiAgKi8KKyAgfTsKKworc3RydWN0IHN0cnBlZWsKKyAgeworICAgIHN0cnVjdCBzdHJidWYgY3RsYnVmOworICAgIHN0cnVjdCBzdHJidWYgZGF0YWJ1ZjsKKyAgICB0X3VzY2FsYXJfdCBmbGFnczsJCQkvKiBVbml4V2FyZS9Tb2xhcmlzIGNvbXBhdGliaWxpdHkuICAqLworICB9OworCitzdHJ1Y3Qgc3RyZmRpbnNlcnQKKyAgeworICAgIHN0cnVjdCBzdHJidWYgY3RsYnVmOworICAgIHN0cnVjdCBzdHJidWYgZGF0YWJ1ZjsKKyAgICB0X3VzY2FsYXJfdCBmbGFnczsJCQkvKiBVbml4V2FyZS9Tb2xhcmlzIGNvbXBhdGliaWxpdHkuICAqLworICAgIGludCBmaWxkZXM7CisgICAgaW50IG9mZnNldDsKKyAgfTsKKworc3RydWN0IHN0cmlvY3RsCisgIHsKKyAgICBpbnQgaWNfY21kOworICAgIGludCBpY190aW1vdXQ7CisgICAgaW50IGljX2xlbjsKKyAgICBjaGFyICppY19kcDsKKyAgfTsKKworc3RydWN0IHN0cnJlY3ZmZAorICB7CisgICAgaW50IGZkOworICAgIHVpZF90IHVpZDsKKyAgICBnaWRfdCBnaWQ7CisgICAgY2hhciBfX2ZpbGxbOF07CQkJLyogVW5peFdhcmUvU29sYXJpcyBjb21wYXRpYmlsaXR5ICovCisgIH07CisKKworc3RydWN0IHN0cl9tbGlzdAorICB7CisgICAgY2hhciBsX25hbWVbRk1OQU1FU1ogKyAxXTsKKyAgfTsKKworc3RydWN0IHN0cl9saXN0CisgIHsKKyAgICBpbnQgc2xfbm1vZHM7CisgICAgc3RydWN0IHN0cl9tbGlzdCAqc2xfbW9kbGlzdDsKKyAgfTsKKworI2VuZGlmIC8qIGJpdHMvc3Ryb3B0cy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zeXNfZXJybGlzdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3lzX2Vycmxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTU1NmU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3lzX2Vycmxpc3QuaApAQCAtMCwwICsxLDMzIEBACisvKiBEZWNsYXJlIHN5c19lcnJsaXN0IGFuZCBzeXNfbmVyciwgb3IgZG9uJ3QuICBDb21wYXRpYmlsaXR5IChkbykgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1RESU9fSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zeXNfZXJybGlzdC5oPiBkaXJlY3RseTsgdXNlIDxzdGRpby5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBzeXNfZXJybGlzdCBhbmQgc3lzX25lcnIgYXJlIGRlcHJlY2F0ZWQuICBVc2Ugc3RyZXJyb3IgaW5zdGVhZC4gICovCisKKyNpZmRlZiAgX19VU0VfQlNECitleHRlcm4gaW50IHN5c19uZXJyOworZXh0ZXJuIF9fY29uc3QgY2hhciAqX19jb25zdCBzeXNfZXJybGlzdFtdOworI2VuZGlmCisjaWZkZWYgIF9fVVNFX0dOVQorZXh0ZXJuIGludCBfc3lzX25lcnI7CitleHRlcm4gX19jb25zdCBjaGFyICpfX2NvbnN0IF9zeXNfZXJybGlzdFtdOworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zeXNjYWxsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zeXNjYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYxNDFkYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N5c2NhbGwuaApAQCAtMCwwICsxLDY3MCBAQAorLyogR2VuZXJhdGVkIGF0IGxpYmMgYnVpbGQgdGltZSBmcm9tIGtlcm5lbCBzeXNjYWxsIGxpc3QuICAqLworCisjaWZuZGVmIF9TWVNDQUxMX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9zeXNjYWxsLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjaWYgX19XT1JEU0laRSA9PSAzMgorI2RlZmluZSBTWVNfX2xsc2VlayBfX05SX19sbHNlZWsKKyNkZWZpbmUgU1lTX19uZXdzZWxlY3QgX19OUl9fbmV3c2VsZWN0CisjZGVmaW5lIFNZU19fc3lzY3RsIF9fTlJfX3N5c2N0bAorI2RlZmluZSBTWVNfYWNjZXNzIF9fTlJfYWNjZXNzCisjZGVmaW5lIFNZU19hY2N0IF9fTlJfYWNjdAorI2RlZmluZSBTWVNfYWRkX2tleSBfX05SX2FkZF9rZXkKKyNkZWZpbmUgU1lTX2FkanRpbWV4IF9fTlJfYWRqdGltZXgKKyNkZWZpbmUgU1lTX2Fmc19zeXNjYWxsIF9fTlJfYWZzX3N5c2NhbGwKKyNkZWZpbmUgU1lTX2FsYXJtIF9fTlJfYWxhcm0KKyNkZWZpbmUgU1lTX2JkZmx1c2ggX19OUl9iZGZsdXNoCisjZGVmaW5lIFNZU19icmVhayBfX05SX2JyZWFrCisjZGVmaW5lIFNZU19icmsgX19OUl9icmsKKyNkZWZpbmUgU1lTX2NhcGdldCBfX05SX2NhcGdldAorI2RlZmluZSBTWVNfY2Fwc2V0IF9fTlJfY2Fwc2V0CisjZGVmaW5lIFNZU19jaGRpciBfX05SX2NoZGlyCisjZGVmaW5lIFNZU19jaG1vZCBfX05SX2NobW9kCisjZGVmaW5lIFNZU19jaG93biBfX05SX2Nob3duCisjZGVmaW5lIFNZU19jaG93bjMyIF9fTlJfY2hvd24zMgorI2RlZmluZSBTWVNfY2hyb290IF9fTlJfY2hyb290CisjZGVmaW5lIFNZU19jbG9ja19hZGp0aW1lIF9fTlJfY2xvY2tfYWRqdGltZQorI2RlZmluZSBTWVNfY2xvY2tfZ2V0cmVzIF9fTlJfY2xvY2tfZ2V0cmVzCisjZGVmaW5lIFNZU19jbG9ja19nZXR0aW1lIF9fTlJfY2xvY2tfZ2V0dGltZQorI2RlZmluZSBTWVNfY2xvY2tfbmFub3NsZWVwIF9fTlJfY2xvY2tfbmFub3NsZWVwCisjZGVmaW5lIFNZU19jbG9ja19zZXR0aW1lIF9fTlJfY2xvY2tfc2V0dGltZQorI2RlZmluZSBTWVNfY2xvbmUgX19OUl9jbG9uZQorI2RlZmluZSBTWVNfY2xvc2UgX19OUl9jbG9zZQorI2RlZmluZSBTWVNfY3JlYXQgX19OUl9jcmVhdAorI2RlZmluZSBTWVNfY3JlYXRlX21vZHVsZSBfX05SX2NyZWF0ZV9tb2R1bGUKKyNkZWZpbmUgU1lTX2RlbGV0ZV9tb2R1bGUgX19OUl9kZWxldGVfbW9kdWxlCisjZGVmaW5lIFNZU19kdXAgX19OUl9kdXAKKyNkZWZpbmUgU1lTX2R1cDIgX19OUl9kdXAyCisjZGVmaW5lIFNZU19kdXAzIF9fTlJfZHVwMworI2RlZmluZSBTWVNfZXBvbGxfY3JlYXRlIF9fTlJfZXBvbGxfY3JlYXRlCisjZGVmaW5lIFNZU19lcG9sbF9jcmVhdGUxIF9fTlJfZXBvbGxfY3JlYXRlMQorI2RlZmluZSBTWVNfZXBvbGxfY3RsIF9fTlJfZXBvbGxfY3RsCisjZGVmaW5lIFNZU19lcG9sbF9wd2FpdCBfX05SX2Vwb2xsX3B3YWl0CisjZGVmaW5lIFNZU19lcG9sbF93YWl0IF9fTlJfZXBvbGxfd2FpdAorI2RlZmluZSBTWVNfZXZlbnRmZCBfX05SX2V2ZW50ZmQKKyNkZWZpbmUgU1lTX2V2ZW50ZmQyIF9fTlJfZXZlbnRmZDIKKyNkZWZpbmUgU1lTX2V4ZWN2ZSBfX05SX2V4ZWN2ZQorI2RlZmluZSBTWVNfZXhpdCBfX05SX2V4aXQKKyNkZWZpbmUgU1lTX2V4aXRfZ3JvdXAgX19OUl9leGl0X2dyb3VwCisjZGVmaW5lIFNZU19mYWNjZXNzYXQgX19OUl9mYWNjZXNzYXQKKyNkZWZpbmUgU1lTX2ZhZHZpc2U2NCBfX05SX2ZhZHZpc2U2NAorI2RlZmluZSBTWVNfZmFkdmlzZTY0XzY0IF9fTlJfZmFkdmlzZTY0XzY0CisjZGVmaW5lIFNZU19mYWxsb2NhdGUgX19OUl9mYWxsb2NhdGUKKyNkZWZpbmUgU1lTX2Zhbm90aWZ5X2luaXQgX19OUl9mYW5vdGlmeV9pbml0CisjZGVmaW5lIFNZU19mYW5vdGlmeV9tYXJrIF9fTlJfZmFub3RpZnlfbWFyaworI2RlZmluZSBTWVNfZmNoZGlyIF9fTlJfZmNoZGlyCisjZGVmaW5lIFNZU19mY2htb2QgX19OUl9mY2htb2QKKyNkZWZpbmUgU1lTX2ZjaG1vZGF0IF9fTlJfZmNobW9kYXQKKyNkZWZpbmUgU1lTX2ZjaG93biBfX05SX2ZjaG93bgorI2RlZmluZSBTWVNfZmNob3duMzIgX19OUl9mY2hvd24zMgorI2RlZmluZSBTWVNfZmNob3duYXQgX19OUl9mY2hvd25hdAorI2RlZmluZSBTWVNfZmNudGwgX19OUl9mY250bAorI2RlZmluZSBTWVNfZmNudGw2NCBfX05SX2ZjbnRsNjQKKyNkZWZpbmUgU1lTX2ZkYXRhc3luYyBfX05SX2ZkYXRhc3luYworI2RlZmluZSBTWVNfZmdldHhhdHRyIF9fTlJfZmdldHhhdHRyCisjZGVmaW5lIFNZU19mbGlzdHhhdHRyIF9fTlJfZmxpc3R4YXR0cgorI2RlZmluZSBTWVNfZmxvY2sgX19OUl9mbG9jaworI2RlZmluZSBTWVNfZm9yayBfX05SX2ZvcmsKKyNkZWZpbmUgU1lTX2ZyZW1vdmV4YXR0ciBfX05SX2ZyZW1vdmV4YXR0cgorI2RlZmluZSBTWVNfZnNldHhhdHRyIF9fTlJfZnNldHhhdHRyCisjZGVmaW5lIFNZU19mc3RhdCBfX05SX2ZzdGF0CisjZGVmaW5lIFNZU19mc3RhdDY0IF9fTlJfZnN0YXQ2NAorI2RlZmluZSBTWVNfZnN0YXRhdDY0IF9fTlJfZnN0YXRhdDY0CisjZGVmaW5lIFNZU19mc3RhdGZzIF9fTlJfZnN0YXRmcworI2RlZmluZSBTWVNfZnN0YXRmczY0IF9fTlJfZnN0YXRmczY0CisjZGVmaW5lIFNZU19mc3luYyBfX05SX2ZzeW5jCisjZGVmaW5lIFNZU19mdGltZSBfX05SX2Z0aW1lCisjZGVmaW5lIFNZU19mdHJ1bmNhdGUgX19OUl9mdHJ1bmNhdGUKKyNkZWZpbmUgU1lTX2Z0cnVuY2F0ZTY0IF9fTlJfZnRydW5jYXRlNjQKKyNkZWZpbmUgU1lTX2Z1dGV4IF9fTlJfZnV0ZXgKKyNkZWZpbmUgU1lTX2Z1dGltZXNhdCBfX05SX2Z1dGltZXNhdAorI2RlZmluZSBTWVNfZ2V0X2tlcm5lbF9zeW1zIF9fTlJfZ2V0X2tlcm5lbF9zeW1zCisjZGVmaW5lIFNZU19nZXRfbWVtcG9saWN5IF9fTlJfZ2V0X21lbXBvbGljeQorI2RlZmluZSBTWVNfZ2V0X3JvYnVzdF9saXN0IF9fTlJfZ2V0X3JvYnVzdF9saXN0CisjZGVmaW5lIFNZU19nZXRfdGhyZWFkX2FyZWEgX19OUl9nZXRfdGhyZWFkX2FyZWEKKyNkZWZpbmUgU1lTX2dldGNwdSBfX05SX2dldGNwdQorI2RlZmluZSBTWVNfZ2V0Y3dkIF9fTlJfZ2V0Y3dkCisjZGVmaW5lIFNZU19nZXRkZW50cyBfX05SX2dldGRlbnRzCisjZGVmaW5lIFNZU19nZXRkZW50czY0IF9fTlJfZ2V0ZGVudHM2NAorI2RlZmluZSBTWVNfZ2V0ZWdpZCBfX05SX2dldGVnaWQKKyNkZWZpbmUgU1lTX2dldGVnaWQzMiBfX05SX2dldGVnaWQzMgorI2RlZmluZSBTWVNfZ2V0ZXVpZCBfX05SX2dldGV1aWQKKyNkZWZpbmUgU1lTX2dldGV1aWQzMiBfX05SX2dldGV1aWQzMgorI2RlZmluZSBTWVNfZ2V0Z2lkIF9fTlJfZ2V0Z2lkCisjZGVmaW5lIFNZU19nZXRnaWQzMiBfX05SX2dldGdpZDMyCisjZGVmaW5lIFNZU19nZXRncm91cHMgX19OUl9nZXRncm91cHMKKyNkZWZpbmUgU1lTX2dldGdyb3VwczMyIF9fTlJfZ2V0Z3JvdXBzMzIKKyNkZWZpbmUgU1lTX2dldGl0aW1lciBfX05SX2dldGl0aW1lcgorI2RlZmluZSBTWVNfZ2V0cGdpZCBfX05SX2dldHBnaWQKKyNkZWZpbmUgU1lTX2dldHBncnAgX19OUl9nZXRwZ3JwCisjZGVmaW5lIFNZU19nZXRwaWQgX19OUl9nZXRwaWQKKyNkZWZpbmUgU1lTX2dldHBtc2cgX19OUl9nZXRwbXNnCisjZGVmaW5lIFNZU19nZXRwcGlkIF9fTlJfZ2V0cHBpZAorI2RlZmluZSBTWVNfZ2V0cHJpb3JpdHkgX19OUl9nZXRwcmlvcml0eQorI2RlZmluZSBTWVNfZ2V0cmVzZ2lkIF9fTlJfZ2V0cmVzZ2lkCisjZGVmaW5lIFNZU19nZXRyZXNnaWQzMiBfX05SX2dldHJlc2dpZDMyCisjZGVmaW5lIFNZU19nZXRyZXN1aWQgX19OUl9nZXRyZXN1aWQKKyNkZWZpbmUgU1lTX2dldHJlc3VpZDMyIF9fTlJfZ2V0cmVzdWlkMzIKKyNkZWZpbmUgU1lTX2dldHJsaW1pdCBfX05SX2dldHJsaW1pdAorI2RlZmluZSBTWVNfZ2V0cnVzYWdlIF9fTlJfZ2V0cnVzYWdlCisjZGVmaW5lIFNZU19nZXRzaWQgX19OUl9nZXRzaWQKKyNkZWZpbmUgU1lTX2dldHRpZCBfX05SX2dldHRpZAorI2RlZmluZSBTWVNfZ2V0dGltZW9mZGF5IF9fTlJfZ2V0dGltZW9mZGF5CisjZGVmaW5lIFNZU19nZXR1aWQgX19OUl9nZXR1aWQKKyNkZWZpbmUgU1lTX2dldHVpZDMyIF9fTlJfZ2V0dWlkMzIKKyNkZWZpbmUgU1lTX2dldHhhdHRyIF9fTlJfZ2V0eGF0dHIKKyNkZWZpbmUgU1lTX2d0dHkgX19OUl9ndHR5CisjZGVmaW5lIFNZU19pZGxlIF9fTlJfaWRsZQorI2RlZmluZSBTWVNfaW5pdF9tb2R1bGUgX19OUl9pbml0X21vZHVsZQorI2RlZmluZSBTWVNfaW5vdGlmeV9hZGRfd2F0Y2ggX19OUl9pbm90aWZ5X2FkZF93YXRjaAorI2RlZmluZSBTWVNfaW5vdGlmeV9pbml0IF9fTlJfaW5vdGlmeV9pbml0CisjZGVmaW5lIFNZU19pbm90aWZ5X2luaXQxIF9fTlJfaW5vdGlmeV9pbml0MQorI2RlZmluZSBTWVNfaW5vdGlmeV9ybV93YXRjaCBfX05SX2lub3RpZnlfcm1fd2F0Y2gKKyNkZWZpbmUgU1lTX2lvX2NhbmNlbCBfX05SX2lvX2NhbmNlbAorI2RlZmluZSBTWVNfaW9fZGVzdHJveSBfX05SX2lvX2Rlc3Ryb3kKKyNkZWZpbmUgU1lTX2lvX2dldGV2ZW50cyBfX05SX2lvX2dldGV2ZW50cworI2RlZmluZSBTWVNfaW9fc2V0dXAgX19OUl9pb19zZXR1cAorI2RlZmluZSBTWVNfaW9fc3VibWl0IF9fTlJfaW9fc3VibWl0CisjZGVmaW5lIFNZU19pb2N0bCBfX05SX2lvY3RsCisjZGVmaW5lIFNZU19pb3Blcm0gX19OUl9pb3Blcm0KKyNkZWZpbmUgU1lTX2lvcGwgX19OUl9pb3BsCisjZGVmaW5lIFNZU19pb3ByaW9fZ2V0IF9fTlJfaW9wcmlvX2dldAorI2RlZmluZSBTWVNfaW9wcmlvX3NldCBfX05SX2lvcHJpb19zZXQKKyNkZWZpbmUgU1lTX2lwYyBfX05SX2lwYworI2RlZmluZSBTWVNfa2V4ZWNfbG9hZCBfX05SX2tleGVjX2xvYWQKKyNkZWZpbmUgU1lTX2tleWN0bCBfX05SX2tleWN0bAorI2RlZmluZSBTWVNfa2lsbCBfX05SX2tpbGwKKyNkZWZpbmUgU1lTX2xjaG93biBfX05SX2xjaG93bgorI2RlZmluZSBTWVNfbGNob3duMzIgX19OUl9sY2hvd24zMgorI2RlZmluZSBTWVNfbGdldHhhdHRyIF9fTlJfbGdldHhhdHRyCisjZGVmaW5lIFNZU19saW5rIF9fTlJfbGluaworI2RlZmluZSBTWVNfbGlua2F0IF9fTlJfbGlua2F0CisjZGVmaW5lIFNZU19saXN0eGF0dHIgX19OUl9saXN0eGF0dHIKKyNkZWZpbmUgU1lTX2xsaXN0eGF0dHIgX19OUl9sbGlzdHhhdHRyCisjZGVmaW5lIFNZU19sb2NrIF9fTlJfbG9jaworI2RlZmluZSBTWVNfbG9va3VwX2Rjb29raWUgX19OUl9sb29rdXBfZGNvb2tpZQorI2RlZmluZSBTWVNfbHJlbW92ZXhhdHRyIF9fTlJfbHJlbW92ZXhhdHRyCisjZGVmaW5lIFNZU19sc2VlayBfX05SX2xzZWVrCisjZGVmaW5lIFNZU19sc2V0eGF0dHIgX19OUl9sc2V0eGF0dHIKKyNkZWZpbmUgU1lTX2xzdGF0IF9fTlJfbHN0YXQKKyNkZWZpbmUgU1lTX2xzdGF0NjQgX19OUl9sc3RhdDY0CisjZGVmaW5lIFNZU19tYWR2aXNlIF9fTlJfbWFkdmlzZQorI2RlZmluZSBTWVNfbWFkdmlzZTEgX19OUl9tYWR2aXNlMQorI2RlZmluZSBTWVNfbWJpbmQgX19OUl9tYmluZAorI2RlZmluZSBTWVNfbWlncmF0ZV9wYWdlcyBfX05SX21pZ3JhdGVfcGFnZXMKKyNkZWZpbmUgU1lTX21pbmNvcmUgX19OUl9taW5jb3JlCisjZGVmaW5lIFNZU19ta2RpciBfX05SX21rZGlyCisjZGVmaW5lIFNZU19ta2RpcmF0IF9fTlJfbWtkaXJhdAorI2RlZmluZSBTWVNfbWtub2QgX19OUl9ta25vZAorI2RlZmluZSBTWVNfbWtub2RhdCBfX05SX21rbm9kYXQKKyNkZWZpbmUgU1lTX21sb2NrIF9fTlJfbWxvY2sKKyNkZWZpbmUgU1lTX21sb2NrYWxsIF9fTlJfbWxvY2thbGwKKyNkZWZpbmUgU1lTX21tYXAgX19OUl9tbWFwCisjZGVmaW5lIFNZU19tbWFwMiBfX05SX21tYXAyCisjZGVmaW5lIFNZU19tb2RpZnlfbGR0IF9fTlJfbW9kaWZ5X2xkdAorI2RlZmluZSBTWVNfbW91bnQgX19OUl9tb3VudAorI2RlZmluZSBTWVNfbW92ZV9wYWdlcyBfX05SX21vdmVfcGFnZXMKKyNkZWZpbmUgU1lTX21wcm90ZWN0IF9fTlJfbXByb3RlY3QKKyNkZWZpbmUgU1lTX21weCBfX05SX21weAorI2RlZmluZSBTWVNfbXFfZ2V0c2V0YXR0ciBfX05SX21xX2dldHNldGF0dHIKKyNkZWZpbmUgU1lTX21xX25vdGlmeSBfX05SX21xX25vdGlmeQorI2RlZmluZSBTWVNfbXFfb3BlbiBfX05SX21xX29wZW4KKyNkZWZpbmUgU1lTX21xX3RpbWVkcmVjZWl2ZSBfX05SX21xX3RpbWVkcmVjZWl2ZQorI2RlZmluZSBTWVNfbXFfdGltZWRzZW5kIF9fTlJfbXFfdGltZWRzZW5kCisjZGVmaW5lIFNZU19tcV91bmxpbmsgX19OUl9tcV91bmxpbmsKKyNkZWZpbmUgU1lTX21yZW1hcCBfX05SX21yZW1hcAorI2RlZmluZSBTWVNfbXN5bmMgX19OUl9tc3luYworI2RlZmluZSBTWVNfbXVubG9jayBfX05SX211bmxvY2sKKyNkZWZpbmUgU1lTX211bmxvY2thbGwgX19OUl9tdW5sb2NrYWxsCisjZGVmaW5lIFNZU19tdW5tYXAgX19OUl9tdW5tYXAKKyNkZWZpbmUgU1lTX25hbWVfdG9faGFuZGxlX2F0IF9fTlJfbmFtZV90b19oYW5kbGVfYXQKKyNkZWZpbmUgU1lTX25hbm9zbGVlcCBfX05SX25hbm9zbGVlcAorI2RlZmluZSBTWVNfbmZzc2VydmN0bCBfX05SX25mc3NlcnZjdGwKKyNkZWZpbmUgU1lTX25pY2UgX19OUl9uaWNlCisjZGVmaW5lIFNZU19vbGRmc3RhdCBfX05SX29sZGZzdGF0CisjZGVmaW5lIFNZU19vbGRsc3RhdCBfX05SX29sZGxzdGF0CisjZGVmaW5lIFNZU19vbGRvbGR1bmFtZSBfX05SX29sZG9sZHVuYW1lCisjZGVmaW5lIFNZU19vbGRzdGF0IF9fTlJfb2xkc3RhdAorI2RlZmluZSBTWVNfb2xkdW5hbWUgX19OUl9vbGR1bmFtZQorI2RlZmluZSBTWVNfb3BlbiBfX05SX29wZW4KKyNkZWZpbmUgU1lTX29wZW5fYnlfaGFuZGxlX2F0IF9fTlJfb3Blbl9ieV9oYW5kbGVfYXQKKyNkZWZpbmUgU1lTX29wZW5hdCBfX05SX29wZW5hdAorI2RlZmluZSBTWVNfcGF1c2UgX19OUl9wYXVzZQorI2RlZmluZSBTWVNfcGVyZl9ldmVudF9vcGVuIF9fTlJfcGVyZl9ldmVudF9vcGVuCisjZGVmaW5lIFNZU19wZXJzb25hbGl0eSBfX05SX3BlcnNvbmFsaXR5CisjZGVmaW5lIFNZU19waXBlIF9fTlJfcGlwZQorI2RlZmluZSBTWVNfcGlwZTIgX19OUl9waXBlMgorI2RlZmluZSBTWVNfcGl2b3Rfcm9vdCBfX05SX3Bpdm90X3Jvb3QKKyNkZWZpbmUgU1lTX3BvbGwgX19OUl9wb2xsCisjZGVmaW5lIFNZU19wcG9sbCBfX05SX3Bwb2xsCisjZGVmaW5lIFNZU19wcmN0bCBfX05SX3ByY3RsCisjZGVmaW5lIFNZU19wcmVhZDY0IF9fTlJfcHJlYWQ2NAorI2RlZmluZSBTWVNfcHJlYWR2IF9fTlJfcHJlYWR2CisjZGVmaW5lIFNZU19wcmxpbWl0NjQgX19OUl9wcmxpbWl0NjQKKyNkZWZpbmUgU1lTX3Byb2Nlc3Nfdm1fcmVhZHYgX19OUl9wcm9jZXNzX3ZtX3JlYWR2CisjZGVmaW5lIFNZU19wcm9jZXNzX3ZtX3dyaXRldiBfX05SX3Byb2Nlc3Nfdm1fd3JpdGV2CisjZGVmaW5lIFNZU19wcm9mIF9fTlJfcHJvZgorI2RlZmluZSBTWVNfcHJvZmlsIF9fTlJfcHJvZmlsCisjZGVmaW5lIFNZU19wc2VsZWN0NiBfX05SX3BzZWxlY3Q2CisjZGVmaW5lIFNZU19wdHJhY2UgX19OUl9wdHJhY2UKKyNkZWZpbmUgU1lTX3B1dHBtc2cgX19OUl9wdXRwbXNnCisjZGVmaW5lIFNZU19wd3JpdGU2NCBfX05SX3B3cml0ZTY0CisjZGVmaW5lIFNZU19wd3JpdGV2IF9fTlJfcHdyaXRldgorI2RlZmluZSBTWVNfcXVlcnlfbW9kdWxlIF9fTlJfcXVlcnlfbW9kdWxlCisjZGVmaW5lIFNZU19xdW90YWN0bCBfX05SX3F1b3RhY3RsCisjZGVmaW5lIFNZU19yZWFkIF9fTlJfcmVhZAorI2RlZmluZSBTWVNfcmVhZGFoZWFkIF9fTlJfcmVhZGFoZWFkCisjZGVmaW5lIFNZU19yZWFkZGlyIF9fTlJfcmVhZGRpcgorI2RlZmluZSBTWVNfcmVhZGxpbmsgX19OUl9yZWFkbGluaworI2RlZmluZSBTWVNfcmVhZGxpbmthdCBfX05SX3JlYWRsaW5rYXQKKyNkZWZpbmUgU1lTX3JlYWR2IF9fTlJfcmVhZHYKKyNkZWZpbmUgU1lTX3JlYm9vdCBfX05SX3JlYm9vdAorI2RlZmluZSBTWVNfcmVjdm1tc2cgX19OUl9yZWN2bW1zZworI2RlZmluZSBTWVNfcmVtYXBfZmlsZV9wYWdlcyBfX05SX3JlbWFwX2ZpbGVfcGFnZXMKKyNkZWZpbmUgU1lTX3JlbW92ZXhhdHRyIF9fTlJfcmVtb3ZleGF0dHIKKyNkZWZpbmUgU1lTX3JlbmFtZSBfX05SX3JlbmFtZQorI2RlZmluZSBTWVNfcmVuYW1lYXQgX19OUl9yZW5hbWVhdAorI2RlZmluZSBTWVNfcmVxdWVzdF9rZXkgX19OUl9yZXF1ZXN0X2tleQorI2RlZmluZSBTWVNfcmVzdGFydF9zeXNjYWxsIF9fTlJfcmVzdGFydF9zeXNjYWxsCisjZGVmaW5lIFNZU19ybWRpciBfX05SX3JtZGlyCisjZGVmaW5lIFNZU19ydF9zaWdhY3Rpb24gX19OUl9ydF9zaWdhY3Rpb24KKyNkZWZpbmUgU1lTX3J0X3NpZ3BlbmRpbmcgX19OUl9ydF9zaWdwZW5kaW5nCisjZGVmaW5lIFNZU19ydF9zaWdwcm9jbWFzayBfX05SX3J0X3NpZ3Byb2NtYXNrCisjZGVmaW5lIFNZU19ydF9zaWdxdWV1ZWluZm8gX19OUl9ydF9zaWdxdWV1ZWluZm8KKyNkZWZpbmUgU1lTX3J0X3NpZ3JldHVybiBfX05SX3J0X3NpZ3JldHVybgorI2RlZmluZSBTWVNfcnRfc2lnc3VzcGVuZCBfX05SX3J0X3NpZ3N1c3BlbmQKKyNkZWZpbmUgU1lTX3J0X3NpZ3RpbWVkd2FpdCBfX05SX3J0X3NpZ3RpbWVkd2FpdAorI2RlZmluZSBTWVNfcnRfdGdzaWdxdWV1ZWluZm8gX19OUl9ydF90Z3NpZ3F1ZXVlaW5mbworI2RlZmluZSBTWVNfc2NoZWRfZ2V0X3ByaW9yaXR5X21heCBfX05SX3NjaGVkX2dldF9wcmlvcml0eV9tYXgKKyNkZWZpbmUgU1lTX3NjaGVkX2dldF9wcmlvcml0eV9taW4gX19OUl9zY2hlZF9nZXRfcHJpb3JpdHlfbWluCisjZGVmaW5lIFNZU19zY2hlZF9nZXRhZmZpbml0eSBfX05SX3NjaGVkX2dldGFmZmluaXR5CisjZGVmaW5lIFNZU19zY2hlZF9nZXRwYXJhbSBfX05SX3NjaGVkX2dldHBhcmFtCisjZGVmaW5lIFNZU19zY2hlZF9nZXRzY2hlZHVsZXIgX19OUl9zY2hlZF9nZXRzY2hlZHVsZXIKKyNkZWZpbmUgU1lTX3NjaGVkX3JyX2dldF9pbnRlcnZhbCBfX05SX3NjaGVkX3JyX2dldF9pbnRlcnZhbAorI2RlZmluZSBTWVNfc2NoZWRfc2V0YWZmaW5pdHkgX19OUl9zY2hlZF9zZXRhZmZpbml0eQorI2RlZmluZSBTWVNfc2NoZWRfc2V0cGFyYW0gX19OUl9zY2hlZF9zZXRwYXJhbQorI2RlZmluZSBTWVNfc2NoZWRfc2V0c2NoZWR1bGVyIF9fTlJfc2NoZWRfc2V0c2NoZWR1bGVyCisjZGVmaW5lIFNZU19zY2hlZF95aWVsZCBfX05SX3NjaGVkX3lpZWxkCisjZGVmaW5lIFNZU19zZWxlY3QgX19OUl9zZWxlY3QKKyNkZWZpbmUgU1lTX3NlbmRmaWxlIF9fTlJfc2VuZGZpbGUKKyNkZWZpbmUgU1lTX3NlbmRmaWxlNjQgX19OUl9zZW5kZmlsZTY0CisjZGVmaW5lIFNZU19zZW5kbW1zZyBfX05SX3NlbmRtbXNnCisjZGVmaW5lIFNZU19zZXRfbWVtcG9saWN5IF9fTlJfc2V0X21lbXBvbGljeQorI2RlZmluZSBTWVNfc2V0X3JvYnVzdF9saXN0IF9fTlJfc2V0X3JvYnVzdF9saXN0CisjZGVmaW5lIFNZU19zZXRfdGhyZWFkX2FyZWEgX19OUl9zZXRfdGhyZWFkX2FyZWEKKyNkZWZpbmUgU1lTX3NldF90aWRfYWRkcmVzcyBfX05SX3NldF90aWRfYWRkcmVzcworI2RlZmluZSBTWVNfc2V0ZG9tYWlubmFtZSBfX05SX3NldGRvbWFpbm5hbWUKKyNkZWZpbmUgU1lTX3NldGZzZ2lkIF9fTlJfc2V0ZnNnaWQKKyNkZWZpbmUgU1lTX3NldGZzZ2lkMzIgX19OUl9zZXRmc2dpZDMyCisjZGVmaW5lIFNZU19zZXRmc3VpZCBfX05SX3NldGZzdWlkCisjZGVmaW5lIFNZU19zZXRmc3VpZDMyIF9fTlJfc2V0ZnN1aWQzMgorI2RlZmluZSBTWVNfc2V0Z2lkIF9fTlJfc2V0Z2lkCisjZGVmaW5lIFNZU19zZXRnaWQzMiBfX05SX3NldGdpZDMyCisjZGVmaW5lIFNZU19zZXRncm91cHMgX19OUl9zZXRncm91cHMKKyNkZWZpbmUgU1lTX3NldGdyb3VwczMyIF9fTlJfc2V0Z3JvdXBzMzIKKyNkZWZpbmUgU1lTX3NldGhvc3RuYW1lIF9fTlJfc2V0aG9zdG5hbWUKKyNkZWZpbmUgU1lTX3NldGl0aW1lciBfX05SX3NldGl0aW1lcgorI2RlZmluZSBTWVNfc2V0bnMgX19OUl9zZXRucworI2RlZmluZSBTWVNfc2V0cGdpZCBfX05SX3NldHBnaWQKKyNkZWZpbmUgU1lTX3NldHByaW9yaXR5IF9fTlJfc2V0cHJpb3JpdHkKKyNkZWZpbmUgU1lTX3NldHJlZ2lkIF9fTlJfc2V0cmVnaWQKKyNkZWZpbmUgU1lTX3NldHJlZ2lkMzIgX19OUl9zZXRyZWdpZDMyCisjZGVmaW5lIFNZU19zZXRyZXNnaWQgX19OUl9zZXRyZXNnaWQKKyNkZWZpbmUgU1lTX3NldHJlc2dpZDMyIF9fTlJfc2V0cmVzZ2lkMzIKKyNkZWZpbmUgU1lTX3NldHJlc3VpZCBfX05SX3NldHJlc3VpZAorI2RlZmluZSBTWVNfc2V0cmVzdWlkMzIgX19OUl9zZXRyZXN1aWQzMgorI2RlZmluZSBTWVNfc2V0cmV1aWQgX19OUl9zZXRyZXVpZAorI2RlZmluZSBTWVNfc2V0cmV1aWQzMiBfX05SX3NldHJldWlkMzIKKyNkZWZpbmUgU1lTX3NldHJsaW1pdCBfX05SX3NldHJsaW1pdAorI2RlZmluZSBTWVNfc2V0c2lkIF9fTlJfc2V0c2lkCisjZGVmaW5lIFNZU19zZXR0aW1lb2ZkYXkgX19OUl9zZXR0aW1lb2ZkYXkKKyNkZWZpbmUgU1lTX3NldHVpZCBfX05SX3NldHVpZAorI2RlZmluZSBTWVNfc2V0dWlkMzIgX19OUl9zZXR1aWQzMgorI2RlZmluZSBTWVNfc2V0eGF0dHIgX19OUl9zZXR4YXR0cgorI2RlZmluZSBTWVNfc2dldG1hc2sgX19OUl9zZ2V0bWFzaworI2RlZmluZSBTWVNfc2lnYWN0aW9uIF9fTlJfc2lnYWN0aW9uCisjZGVmaW5lIFNZU19zaWdhbHRzdGFjayBfX05SX3NpZ2FsdHN0YWNrCisjZGVmaW5lIFNZU19zaWduYWwgX19OUl9zaWduYWwKKyNkZWZpbmUgU1lTX3NpZ25hbGZkIF9fTlJfc2lnbmFsZmQKKyNkZWZpbmUgU1lTX3NpZ25hbGZkNCBfX05SX3NpZ25hbGZkNAorI2RlZmluZSBTWVNfc2lncGVuZGluZyBfX05SX3NpZ3BlbmRpbmcKKyNkZWZpbmUgU1lTX3NpZ3Byb2NtYXNrIF9fTlJfc2lncHJvY21hc2sKKyNkZWZpbmUgU1lTX3NpZ3JldHVybiBfX05SX3NpZ3JldHVybgorI2RlZmluZSBTWVNfc2lnc3VzcGVuZCBfX05SX3NpZ3N1c3BlbmQKKyNkZWZpbmUgU1lTX3NvY2tldGNhbGwgX19OUl9zb2NrZXRjYWxsCisjZGVmaW5lIFNZU19zcGxpY2UgX19OUl9zcGxpY2UKKyNkZWZpbmUgU1lTX3NzZXRtYXNrIF9fTlJfc3NldG1hc2sKKyNkZWZpbmUgU1lTX3N0YXQgX19OUl9zdGF0CisjZGVmaW5lIFNZU19zdGF0NjQgX19OUl9zdGF0NjQKKyNkZWZpbmUgU1lTX3N0YXRmcyBfX05SX3N0YXRmcworI2RlZmluZSBTWVNfc3RhdGZzNjQgX19OUl9zdGF0ZnM2NAorI2RlZmluZSBTWVNfc3RpbWUgX19OUl9zdGltZQorI2RlZmluZSBTWVNfc3R0eSBfX05SX3N0dHkKKyNkZWZpbmUgU1lTX3N3YXBvZmYgX19OUl9zd2Fwb2ZmCisjZGVmaW5lIFNZU19zd2Fwb24gX19OUl9zd2Fwb24KKyNkZWZpbmUgU1lTX3N5bWxpbmsgX19OUl9zeW1saW5rCisjZGVmaW5lIFNZU19zeW1saW5rYXQgX19OUl9zeW1saW5rYXQKKyNkZWZpbmUgU1lTX3N5bmMgX19OUl9zeW5jCisjZGVmaW5lIFNZU19zeW5jX2ZpbGVfcmFuZ2UgX19OUl9zeW5jX2ZpbGVfcmFuZ2UKKyNkZWZpbmUgU1lTX3N5bmNmcyBfX05SX3N5bmNmcworI2RlZmluZSBTWVNfc3lzZnMgX19OUl9zeXNmcworI2RlZmluZSBTWVNfc3lzaW5mbyBfX05SX3N5c2luZm8KKyNkZWZpbmUgU1lTX3N5c2xvZyBfX05SX3N5c2xvZworI2RlZmluZSBTWVNfdGVlIF9fTlJfdGVlCisjZGVmaW5lIFNZU190Z2tpbGwgX19OUl90Z2tpbGwKKyNkZWZpbmUgU1lTX3RpbWUgX19OUl90aW1lCisjZGVmaW5lIFNZU190aW1lcl9jcmVhdGUgX19OUl90aW1lcl9jcmVhdGUKKyNkZWZpbmUgU1lTX3RpbWVyX2RlbGV0ZSBfX05SX3RpbWVyX2RlbGV0ZQorI2RlZmluZSBTWVNfdGltZXJfZ2V0b3ZlcnJ1biBfX05SX3RpbWVyX2dldG92ZXJydW4KKyNkZWZpbmUgU1lTX3RpbWVyX2dldHRpbWUgX19OUl90aW1lcl9nZXR0aW1lCisjZGVmaW5lIFNZU190aW1lcl9zZXR0aW1lIF9fTlJfdGltZXJfc2V0dGltZQorI2RlZmluZSBTWVNfdGltZXJmZF9jcmVhdGUgX19OUl90aW1lcmZkX2NyZWF0ZQorI2RlZmluZSBTWVNfdGltZXJmZF9nZXR0aW1lIF9fTlJfdGltZXJmZF9nZXR0aW1lCisjZGVmaW5lIFNZU190aW1lcmZkX3NldHRpbWUgX19OUl90aW1lcmZkX3NldHRpbWUKKyNkZWZpbmUgU1lTX3RpbWVzIF9fTlJfdGltZXMKKyNkZWZpbmUgU1lTX3RraWxsIF9fTlJfdGtpbGwKKyNkZWZpbmUgU1lTX3RydW5jYXRlIF9fTlJfdHJ1bmNhdGUKKyNkZWZpbmUgU1lTX3RydW5jYXRlNjQgX19OUl90cnVuY2F0ZTY0CisjZGVmaW5lIFNZU191Z2V0cmxpbWl0IF9fTlJfdWdldHJsaW1pdAorI2RlZmluZSBTWVNfdWxpbWl0IF9fTlJfdWxpbWl0CisjZGVmaW5lIFNZU191bWFzayBfX05SX3VtYXNrCisjZGVmaW5lIFNZU191bW91bnQgX19OUl91bW91bnQKKyNkZWZpbmUgU1lTX3Vtb3VudDIgX19OUl91bW91bnQyCisjZGVmaW5lIFNZU191bmFtZSBfX05SX3VuYW1lCisjZGVmaW5lIFNZU191bmxpbmsgX19OUl91bmxpbmsKKyNkZWZpbmUgU1lTX3VubGlua2F0IF9fTlJfdW5saW5rYXQKKyNkZWZpbmUgU1lTX3Vuc2hhcmUgX19OUl91bnNoYXJlCisjZGVmaW5lIFNZU191c2VsaWIgX19OUl91c2VsaWIKKyNkZWZpbmUgU1lTX3VzdGF0IF9fTlJfdXN0YXQKKyNkZWZpbmUgU1lTX3V0aW1lIF9fTlJfdXRpbWUKKyNkZWZpbmUgU1lTX3V0aW1lbnNhdCBfX05SX3V0aW1lbnNhdAorI2RlZmluZSBTWVNfdXRpbWVzIF9fTlJfdXRpbWVzCisjZGVmaW5lIFNZU192Zm9yayBfX05SX3Zmb3JrCisjZGVmaW5lIFNZU192aGFuZ3VwIF9fTlJfdmhhbmd1cAorI2RlZmluZSBTWVNfdm04NiBfX05SX3ZtODYKKyNkZWZpbmUgU1lTX3ZtODZvbGQgX19OUl92bTg2b2xkCisjZGVmaW5lIFNZU192bXNwbGljZSBfX05SX3Ztc3BsaWNlCisjZGVmaW5lIFNZU192c2VydmVyIF9fTlJfdnNlcnZlcgorI2RlZmluZSBTWVNfd2FpdDQgX19OUl93YWl0NAorI2RlZmluZSBTWVNfd2FpdGlkIF9fTlJfd2FpdGlkCisjZGVmaW5lIFNZU193YWl0cGlkIF9fTlJfd2FpdHBpZAorI2RlZmluZSBTWVNfd3JpdGUgX19OUl93cml0ZQorI2RlZmluZSBTWVNfd3JpdGV2IF9fTlJfd3JpdGV2CisjZW5kaWYKKyNpZiBfX1dPUkRTSVpFID09IDY0CisjZGVmaW5lIFNZU19fc3lzY3RsIF9fTlJfX3N5c2N0bAorI2RlZmluZSBTWVNfYWNjZXB0IF9fTlJfYWNjZXB0CisjZGVmaW5lIFNZU19hY2NlcHQ0IF9fTlJfYWNjZXB0NAorI2RlZmluZSBTWVNfYWNjZXNzIF9fTlJfYWNjZXNzCisjZGVmaW5lIFNZU19hY2N0IF9fTlJfYWNjdAorI2RlZmluZSBTWVNfYWRkX2tleSBfX05SX2FkZF9rZXkKKyNkZWZpbmUgU1lTX2FkanRpbWV4IF9fTlJfYWRqdGltZXgKKyNkZWZpbmUgU1lTX2Fmc19zeXNjYWxsIF9fTlJfYWZzX3N5c2NhbGwKKyNkZWZpbmUgU1lTX2FsYXJtIF9fTlJfYWxhcm0KKyNkZWZpbmUgU1lTX2FyY2hfcHJjdGwgX19OUl9hcmNoX3ByY3RsCisjZGVmaW5lIFNZU19iaW5kIF9fTlJfYmluZAorI2RlZmluZSBTWVNfYnJrIF9fTlJfYnJrCisjZGVmaW5lIFNZU19jYXBnZXQgX19OUl9jYXBnZXQKKyNkZWZpbmUgU1lTX2NhcHNldCBfX05SX2NhcHNldAorI2RlZmluZSBTWVNfY2hkaXIgX19OUl9jaGRpcgorI2RlZmluZSBTWVNfY2htb2QgX19OUl9jaG1vZAorI2RlZmluZSBTWVNfY2hvd24gX19OUl9jaG93bgorI2RlZmluZSBTWVNfY2hyb290IF9fTlJfY2hyb290CisjZGVmaW5lIFNZU19jbG9ja19hZGp0aW1lIF9fTlJfY2xvY2tfYWRqdGltZQorI2RlZmluZSBTWVNfY2xvY2tfZ2V0cmVzIF9fTlJfY2xvY2tfZ2V0cmVzCisjZGVmaW5lIFNZU19jbG9ja19nZXR0aW1lIF9fTlJfY2xvY2tfZ2V0dGltZQorI2RlZmluZSBTWVNfY2xvY2tfbmFub3NsZWVwIF9fTlJfY2xvY2tfbmFub3NsZWVwCisjZGVmaW5lIFNZU19jbG9ja19zZXR0aW1lIF9fTlJfY2xvY2tfc2V0dGltZQorI2RlZmluZSBTWVNfY2xvbmUgX19OUl9jbG9uZQorI2RlZmluZSBTWVNfY2xvc2UgX19OUl9jbG9zZQorI2RlZmluZSBTWVNfY29ubmVjdCBfX05SX2Nvbm5lY3QKKyNkZWZpbmUgU1lTX2NyZWF0IF9fTlJfY3JlYXQKKyNkZWZpbmUgU1lTX2NyZWF0ZV9tb2R1bGUgX19OUl9jcmVhdGVfbW9kdWxlCisjZGVmaW5lIFNZU19kZWxldGVfbW9kdWxlIF9fTlJfZGVsZXRlX21vZHVsZQorI2RlZmluZSBTWVNfZHVwIF9fTlJfZHVwCisjZGVmaW5lIFNZU19kdXAyIF9fTlJfZHVwMgorI2RlZmluZSBTWVNfZHVwMyBfX05SX2R1cDMKKyNkZWZpbmUgU1lTX2Vwb2xsX2NyZWF0ZSBfX05SX2Vwb2xsX2NyZWF0ZQorI2RlZmluZSBTWVNfZXBvbGxfY3JlYXRlMSBfX05SX2Vwb2xsX2NyZWF0ZTEKKyNkZWZpbmUgU1lTX2Vwb2xsX2N0bCBfX05SX2Vwb2xsX2N0bAorI2RlZmluZSBTWVNfZXBvbGxfY3RsX29sZCBfX05SX2Vwb2xsX2N0bF9vbGQKKyNkZWZpbmUgU1lTX2Vwb2xsX3B3YWl0IF9fTlJfZXBvbGxfcHdhaXQKKyNkZWZpbmUgU1lTX2Vwb2xsX3dhaXQgX19OUl9lcG9sbF93YWl0CisjZGVmaW5lIFNZU19lcG9sbF93YWl0X29sZCBfX05SX2Vwb2xsX3dhaXRfb2xkCisjZGVmaW5lIFNZU19ldmVudGZkIF9fTlJfZXZlbnRmZAorI2RlZmluZSBTWVNfZXZlbnRmZDIgX19OUl9ldmVudGZkMgorI2RlZmluZSBTWVNfZXhlY3ZlIF9fTlJfZXhlY3ZlCisjZGVmaW5lIFNZU19leGl0IF9fTlJfZXhpdAorI2RlZmluZSBTWVNfZXhpdF9ncm91cCBfX05SX2V4aXRfZ3JvdXAKKyNkZWZpbmUgU1lTX2ZhY2Nlc3NhdCBfX05SX2ZhY2Nlc3NhdAorI2RlZmluZSBTWVNfZmFkdmlzZTY0IF9fTlJfZmFkdmlzZTY0CisjZGVmaW5lIFNZU19mYWxsb2NhdGUgX19OUl9mYWxsb2NhdGUKKyNkZWZpbmUgU1lTX2Zhbm90aWZ5X2luaXQgX19OUl9mYW5vdGlmeV9pbml0CisjZGVmaW5lIFNZU19mYW5vdGlmeV9tYXJrIF9fTlJfZmFub3RpZnlfbWFyaworI2RlZmluZSBTWVNfZmNoZGlyIF9fTlJfZmNoZGlyCisjZGVmaW5lIFNZU19mY2htb2QgX19OUl9mY2htb2QKKyNkZWZpbmUgU1lTX2ZjaG1vZGF0IF9fTlJfZmNobW9kYXQKKyNkZWZpbmUgU1lTX2ZjaG93biBfX05SX2ZjaG93bgorI2RlZmluZSBTWVNfZmNob3duYXQgX19OUl9mY2hvd25hdAorI2RlZmluZSBTWVNfZmNudGwgX19OUl9mY250bAorI2RlZmluZSBTWVNfZmRhdGFzeW5jIF9fTlJfZmRhdGFzeW5jCisjZGVmaW5lIFNZU19mZ2V0eGF0dHIgX19OUl9mZ2V0eGF0dHIKKyNkZWZpbmUgU1lTX2ZsaXN0eGF0dHIgX19OUl9mbGlzdHhhdHRyCisjZGVmaW5lIFNZU19mbG9jayBfX05SX2Zsb2NrCisjZGVmaW5lIFNZU19mb3JrIF9fTlJfZm9yaworI2RlZmluZSBTWVNfZnJlbW92ZXhhdHRyIF9fTlJfZnJlbW92ZXhhdHRyCisjZGVmaW5lIFNZU19mc2V0eGF0dHIgX19OUl9mc2V0eGF0dHIKKyNkZWZpbmUgU1lTX2ZzdGF0IF9fTlJfZnN0YXQKKyNkZWZpbmUgU1lTX2ZzdGF0ZnMgX19OUl9mc3RhdGZzCisjZGVmaW5lIFNZU19mc3luYyBfX05SX2ZzeW5jCisjZGVmaW5lIFNZU19mdHJ1bmNhdGUgX19OUl9mdHJ1bmNhdGUKKyNkZWZpbmUgU1lTX2Z1dGV4IF9fTlJfZnV0ZXgKKyNkZWZpbmUgU1lTX2Z1dGltZXNhdCBfX05SX2Z1dGltZXNhdAorI2RlZmluZSBTWVNfZ2V0X2tlcm5lbF9zeW1zIF9fTlJfZ2V0X2tlcm5lbF9zeW1zCisjZGVmaW5lIFNZU19nZXRfbWVtcG9saWN5IF9fTlJfZ2V0X21lbXBvbGljeQorI2RlZmluZSBTWVNfZ2V0X3JvYnVzdF9saXN0IF9fTlJfZ2V0X3JvYnVzdF9saXN0CisjZGVmaW5lIFNZU19nZXRfdGhyZWFkX2FyZWEgX19OUl9nZXRfdGhyZWFkX2FyZWEKKyNkZWZpbmUgU1lTX2dldGNwdSBfX05SX2dldGNwdQorI2RlZmluZSBTWVNfZ2V0Y3dkIF9fTlJfZ2V0Y3dkCisjZGVmaW5lIFNZU19nZXRkZW50cyBfX05SX2dldGRlbnRzCisjZGVmaW5lIFNZU19nZXRkZW50czY0IF9fTlJfZ2V0ZGVudHM2NAorI2RlZmluZSBTWVNfZ2V0ZWdpZCBfX05SX2dldGVnaWQKKyNkZWZpbmUgU1lTX2dldGV1aWQgX19OUl9nZXRldWlkCisjZGVmaW5lIFNZU19nZXRnaWQgX19OUl9nZXRnaWQKKyNkZWZpbmUgU1lTX2dldGdyb3VwcyBfX05SX2dldGdyb3VwcworI2RlZmluZSBTWVNfZ2V0aXRpbWVyIF9fTlJfZ2V0aXRpbWVyCisjZGVmaW5lIFNZU19nZXRwZWVybmFtZSBfX05SX2dldHBlZXJuYW1lCisjZGVmaW5lIFNZU19nZXRwZ2lkIF9fTlJfZ2V0cGdpZAorI2RlZmluZSBTWVNfZ2V0cGdycCBfX05SX2dldHBncnAKKyNkZWZpbmUgU1lTX2dldHBpZCBfX05SX2dldHBpZAorI2RlZmluZSBTWVNfZ2V0cG1zZyBfX05SX2dldHBtc2cKKyNkZWZpbmUgU1lTX2dldHBwaWQgX19OUl9nZXRwcGlkCisjZGVmaW5lIFNZU19nZXRwcmlvcml0eSBfX05SX2dldHByaW9yaXR5CisjZGVmaW5lIFNZU19nZXRyZXNnaWQgX19OUl9nZXRyZXNnaWQKKyNkZWZpbmUgU1lTX2dldHJlc3VpZCBfX05SX2dldHJlc3VpZAorI2RlZmluZSBTWVNfZ2V0cmxpbWl0IF9fTlJfZ2V0cmxpbWl0CisjZGVmaW5lIFNZU19nZXRydXNhZ2UgX19OUl9nZXRydXNhZ2UKKyNkZWZpbmUgU1lTX2dldHNpZCBfX05SX2dldHNpZAorI2RlZmluZSBTWVNfZ2V0c29ja25hbWUgX19OUl9nZXRzb2NrbmFtZQorI2RlZmluZSBTWVNfZ2V0c29ja29wdCBfX05SX2dldHNvY2tvcHQKKyNkZWZpbmUgU1lTX2dldHRpZCBfX05SX2dldHRpZAorI2RlZmluZSBTWVNfZ2V0dGltZW9mZGF5IF9fTlJfZ2V0dGltZW9mZGF5CisjZGVmaW5lIFNZU19nZXR1aWQgX19OUl9nZXR1aWQKKyNkZWZpbmUgU1lTX2dldHhhdHRyIF9fTlJfZ2V0eGF0dHIKKyNkZWZpbmUgU1lTX2luaXRfbW9kdWxlIF9fTlJfaW5pdF9tb2R1bGUKKyNkZWZpbmUgU1lTX2lub3RpZnlfYWRkX3dhdGNoIF9fTlJfaW5vdGlmeV9hZGRfd2F0Y2gKKyNkZWZpbmUgU1lTX2lub3RpZnlfaW5pdCBfX05SX2lub3RpZnlfaW5pdAorI2RlZmluZSBTWVNfaW5vdGlmeV9pbml0MSBfX05SX2lub3RpZnlfaW5pdDEKKyNkZWZpbmUgU1lTX2lub3RpZnlfcm1fd2F0Y2ggX19OUl9pbm90aWZ5X3JtX3dhdGNoCisjZGVmaW5lIFNZU19pb19jYW5jZWwgX19OUl9pb19jYW5jZWwKKyNkZWZpbmUgU1lTX2lvX2Rlc3Ryb3kgX19OUl9pb19kZXN0cm95CisjZGVmaW5lIFNZU19pb19nZXRldmVudHMgX19OUl9pb19nZXRldmVudHMKKyNkZWZpbmUgU1lTX2lvX3NldHVwIF9fTlJfaW9fc2V0dXAKKyNkZWZpbmUgU1lTX2lvX3N1Ym1pdCBfX05SX2lvX3N1Ym1pdAorI2RlZmluZSBTWVNfaW9jdGwgX19OUl9pb2N0bAorI2RlZmluZSBTWVNfaW9wZXJtIF9fTlJfaW9wZXJtCisjZGVmaW5lIFNZU19pb3BsIF9fTlJfaW9wbAorI2RlZmluZSBTWVNfaW9wcmlvX2dldCBfX05SX2lvcHJpb19nZXQKKyNkZWZpbmUgU1lTX2lvcHJpb19zZXQgX19OUl9pb3ByaW9fc2V0CisjZGVmaW5lIFNZU19rZXhlY19sb2FkIF9fTlJfa2V4ZWNfbG9hZAorI2RlZmluZSBTWVNfa2V5Y3RsIF9fTlJfa2V5Y3RsCisjZGVmaW5lIFNZU19raWxsIF9fTlJfa2lsbAorI2RlZmluZSBTWVNfbGNob3duIF9fTlJfbGNob3duCisjZGVmaW5lIFNZU19sZ2V0eGF0dHIgX19OUl9sZ2V0eGF0dHIKKyNkZWZpbmUgU1lTX2xpbmsgX19OUl9saW5rCisjZGVmaW5lIFNZU19saW5rYXQgX19OUl9saW5rYXQKKyNkZWZpbmUgU1lTX2xpc3RlbiBfX05SX2xpc3RlbgorI2RlZmluZSBTWVNfbGlzdHhhdHRyIF9fTlJfbGlzdHhhdHRyCisjZGVmaW5lIFNZU19sbGlzdHhhdHRyIF9fTlJfbGxpc3R4YXR0cgorI2RlZmluZSBTWVNfbG9va3VwX2Rjb29raWUgX19OUl9sb29rdXBfZGNvb2tpZQorI2RlZmluZSBTWVNfbHJlbW92ZXhhdHRyIF9fTlJfbHJlbW92ZXhhdHRyCisjZGVmaW5lIFNZU19sc2VlayBfX05SX2xzZWVrCisjZGVmaW5lIFNZU19sc2V0eGF0dHIgX19OUl9sc2V0eGF0dHIKKyNkZWZpbmUgU1lTX2xzdGF0IF9fTlJfbHN0YXQKKyNkZWZpbmUgU1lTX21hZHZpc2UgX19OUl9tYWR2aXNlCisjZGVmaW5lIFNZU19tYmluZCBfX05SX21iaW5kCisjZGVmaW5lIFNZU19taWdyYXRlX3BhZ2VzIF9fTlJfbWlncmF0ZV9wYWdlcworI2RlZmluZSBTWVNfbWluY29yZSBfX05SX21pbmNvcmUKKyNkZWZpbmUgU1lTX21rZGlyIF9fTlJfbWtkaXIKKyNkZWZpbmUgU1lTX21rZGlyYXQgX19OUl9ta2RpcmF0CisjZGVmaW5lIFNZU19ta25vZCBfX05SX21rbm9kCisjZGVmaW5lIFNZU19ta25vZGF0IF9fTlJfbWtub2RhdAorI2RlZmluZSBTWVNfbWxvY2sgX19OUl9tbG9jaworI2RlZmluZSBTWVNfbWxvY2thbGwgX19OUl9tbG9ja2FsbAorI2RlZmluZSBTWVNfbW1hcCBfX05SX21tYXAKKyNkZWZpbmUgU1lTX21vZGlmeV9sZHQgX19OUl9tb2RpZnlfbGR0CisjZGVmaW5lIFNZU19tb3VudCBfX05SX21vdW50CisjZGVmaW5lIFNZU19tb3ZlX3BhZ2VzIF9fTlJfbW92ZV9wYWdlcworI2RlZmluZSBTWVNfbXByb3RlY3QgX19OUl9tcHJvdGVjdAorI2RlZmluZSBTWVNfbXFfZ2V0c2V0YXR0ciBfX05SX21xX2dldHNldGF0dHIKKyNkZWZpbmUgU1lTX21xX25vdGlmeSBfX05SX21xX25vdGlmeQorI2RlZmluZSBTWVNfbXFfb3BlbiBfX05SX21xX29wZW4KKyNkZWZpbmUgU1lTX21xX3RpbWVkcmVjZWl2ZSBfX05SX21xX3RpbWVkcmVjZWl2ZQorI2RlZmluZSBTWVNfbXFfdGltZWRzZW5kIF9fTlJfbXFfdGltZWRzZW5kCisjZGVmaW5lIFNZU19tcV91bmxpbmsgX19OUl9tcV91bmxpbmsKKyNkZWZpbmUgU1lTX21yZW1hcCBfX05SX21yZW1hcAorI2RlZmluZSBTWVNfbXNnY3RsIF9fTlJfbXNnY3RsCisjZGVmaW5lIFNZU19tc2dnZXQgX19OUl9tc2dnZXQKKyNkZWZpbmUgU1lTX21zZ3JjdiBfX05SX21zZ3JjdgorI2RlZmluZSBTWVNfbXNnc25kIF9fTlJfbXNnc25kCisjZGVmaW5lIFNZU19tc3luYyBfX05SX21zeW5jCisjZGVmaW5lIFNZU19tdW5sb2NrIF9fTlJfbXVubG9jaworI2RlZmluZSBTWVNfbXVubG9ja2FsbCBfX05SX211bmxvY2thbGwKKyNkZWZpbmUgU1lTX211bm1hcCBfX05SX211bm1hcAorI2RlZmluZSBTWVNfbmFtZV90b19oYW5kbGVfYXQgX19OUl9uYW1lX3RvX2hhbmRsZV9hdAorI2RlZmluZSBTWVNfbmFub3NsZWVwIF9fTlJfbmFub3NsZWVwCisjZGVmaW5lIFNZU19uZXdmc3RhdGF0IF9fTlJfbmV3ZnN0YXRhdAorI2RlZmluZSBTWVNfbmZzc2VydmN0bCBfX05SX25mc3NlcnZjdGwKKyNkZWZpbmUgU1lTX29wZW4gX19OUl9vcGVuCisjZGVmaW5lIFNZU19vcGVuX2J5X2hhbmRsZV9hdCBfX05SX29wZW5fYnlfaGFuZGxlX2F0CisjZGVmaW5lIFNZU19vcGVuYXQgX19OUl9vcGVuYXQKKyNkZWZpbmUgU1lTX3BhdXNlIF9fTlJfcGF1c2UKKyNkZWZpbmUgU1lTX3BlcmZfZXZlbnRfb3BlbiBfX05SX3BlcmZfZXZlbnRfb3BlbgorI2RlZmluZSBTWVNfcGVyc29uYWxpdHkgX19OUl9wZXJzb25hbGl0eQorI2RlZmluZSBTWVNfcGlwZSBfX05SX3BpcGUKKyNkZWZpbmUgU1lTX3BpcGUyIF9fTlJfcGlwZTIKKyNkZWZpbmUgU1lTX3Bpdm90X3Jvb3QgX19OUl9waXZvdF9yb290CisjZGVmaW5lIFNZU19wb2xsIF9fTlJfcG9sbAorI2RlZmluZSBTWVNfcHBvbGwgX19OUl9wcG9sbAorI2RlZmluZSBTWVNfcHJjdGwgX19OUl9wcmN0bAorI2RlZmluZSBTWVNfcHJlYWQ2NCBfX05SX3ByZWFkNjQKKyNkZWZpbmUgU1lTX3ByZWFkdiBfX05SX3ByZWFkdgorI2RlZmluZSBTWVNfcHJsaW1pdDY0IF9fTlJfcHJsaW1pdDY0CisjZGVmaW5lIFNZU19wcm9jZXNzX3ZtX3JlYWR2IF9fTlJfcHJvY2Vzc192bV9yZWFkdgorI2RlZmluZSBTWVNfcHJvY2Vzc192bV93cml0ZXYgX19OUl9wcm9jZXNzX3ZtX3dyaXRldgorI2RlZmluZSBTWVNfcHNlbGVjdDYgX19OUl9wc2VsZWN0NgorI2RlZmluZSBTWVNfcHRyYWNlIF9fTlJfcHRyYWNlCisjZGVmaW5lIFNZU19wdXRwbXNnIF9fTlJfcHV0cG1zZworI2RlZmluZSBTWVNfcHdyaXRlNjQgX19OUl9wd3JpdGU2NAorI2RlZmluZSBTWVNfcHdyaXRldiBfX05SX3B3cml0ZXYKKyNkZWZpbmUgU1lTX3F1ZXJ5X21vZHVsZSBfX05SX3F1ZXJ5X21vZHVsZQorI2RlZmluZSBTWVNfcXVvdGFjdGwgX19OUl9xdW90YWN0bAorI2RlZmluZSBTWVNfcmVhZCBfX05SX3JlYWQKKyNkZWZpbmUgU1lTX3JlYWRhaGVhZCBfX05SX3JlYWRhaGVhZAorI2RlZmluZSBTWVNfcmVhZGxpbmsgX19OUl9yZWFkbGluaworI2RlZmluZSBTWVNfcmVhZGxpbmthdCBfX05SX3JlYWRsaW5rYXQKKyNkZWZpbmUgU1lTX3JlYWR2IF9fTlJfcmVhZHYKKyNkZWZpbmUgU1lTX3JlYm9vdCBfX05SX3JlYm9vdAorI2RlZmluZSBTWVNfcmVjdmZyb20gX19OUl9yZWN2ZnJvbQorI2RlZmluZSBTWVNfcmVjdm1tc2cgX19OUl9yZWN2bW1zZworI2RlZmluZSBTWVNfcmVjdm1zZyBfX05SX3JlY3Ztc2cKKyNkZWZpbmUgU1lTX3JlbWFwX2ZpbGVfcGFnZXMgX19OUl9yZW1hcF9maWxlX3BhZ2VzCisjZGVmaW5lIFNZU19yZW1vdmV4YXR0ciBfX05SX3JlbW92ZXhhdHRyCisjZGVmaW5lIFNZU19yZW5hbWUgX19OUl9yZW5hbWUKKyNkZWZpbmUgU1lTX3JlbmFtZWF0IF9fTlJfcmVuYW1lYXQKKyNkZWZpbmUgU1lTX3JlcXVlc3Rfa2V5IF9fTlJfcmVxdWVzdF9rZXkKKyNkZWZpbmUgU1lTX3Jlc3RhcnRfc3lzY2FsbCBfX05SX3Jlc3RhcnRfc3lzY2FsbAorI2RlZmluZSBTWVNfcm1kaXIgX19OUl9ybWRpcgorI2RlZmluZSBTWVNfcnRfc2lnYWN0aW9uIF9fTlJfcnRfc2lnYWN0aW9uCisjZGVmaW5lIFNZU19ydF9zaWdwZW5kaW5nIF9fTlJfcnRfc2lncGVuZGluZworI2RlZmluZSBTWVNfcnRfc2lncHJvY21hc2sgX19OUl9ydF9zaWdwcm9jbWFzaworI2RlZmluZSBTWVNfcnRfc2lncXVldWVpbmZvIF9fTlJfcnRfc2lncXVldWVpbmZvCisjZGVmaW5lIFNZU19ydF9zaWdyZXR1cm4gX19OUl9ydF9zaWdyZXR1cm4KKyNkZWZpbmUgU1lTX3J0X3NpZ3N1c3BlbmQgX19OUl9ydF9zaWdzdXNwZW5kCisjZGVmaW5lIFNZU19ydF9zaWd0aW1lZHdhaXQgX19OUl9ydF9zaWd0aW1lZHdhaXQKKyNkZWZpbmUgU1lTX3J0X3Rnc2lncXVldWVpbmZvIF9fTlJfcnRfdGdzaWdxdWV1ZWluZm8KKyNkZWZpbmUgU1lTX3NjaGVkX2dldF9wcmlvcml0eV9tYXggX19OUl9zY2hlZF9nZXRfcHJpb3JpdHlfbWF4CisjZGVmaW5lIFNZU19zY2hlZF9nZXRfcHJpb3JpdHlfbWluIF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbgorI2RlZmluZSBTWVNfc2NoZWRfZ2V0YWZmaW5pdHkgX19OUl9zY2hlZF9nZXRhZmZpbml0eQorI2RlZmluZSBTWVNfc2NoZWRfZ2V0cGFyYW0gX19OUl9zY2hlZF9nZXRwYXJhbQorI2RlZmluZSBTWVNfc2NoZWRfZ2V0c2NoZWR1bGVyIF9fTlJfc2NoZWRfZ2V0c2NoZWR1bGVyCisjZGVmaW5lIFNZU19zY2hlZF9ycl9nZXRfaW50ZXJ2YWwgX19OUl9zY2hlZF9ycl9nZXRfaW50ZXJ2YWwKKyNkZWZpbmUgU1lTX3NjaGVkX3NldGFmZmluaXR5IF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkKKyNkZWZpbmUgU1lTX3NjaGVkX3NldHBhcmFtIF9fTlJfc2NoZWRfc2V0cGFyYW0KKyNkZWZpbmUgU1lTX3NjaGVkX3NldHNjaGVkdWxlciBfX05SX3NjaGVkX3NldHNjaGVkdWxlcgorI2RlZmluZSBTWVNfc2NoZWRfeWllbGQgX19OUl9zY2hlZF95aWVsZAorI2RlZmluZSBTWVNfc2VjdXJpdHkgX19OUl9zZWN1cml0eQorI2RlZmluZSBTWVNfc2VsZWN0IF9fTlJfc2VsZWN0CisjZGVmaW5lIFNZU19zZW1jdGwgX19OUl9zZW1jdGwKKyNkZWZpbmUgU1lTX3NlbWdldCBfX05SX3NlbWdldAorI2RlZmluZSBTWVNfc2Vtb3AgX19OUl9zZW1vcAorI2RlZmluZSBTWVNfc2VtdGltZWRvcCBfX05SX3NlbXRpbWVkb3AKKyNkZWZpbmUgU1lTX3NlbmRmaWxlIF9fTlJfc2VuZGZpbGUKKyNkZWZpbmUgU1lTX3NlbmRtbXNnIF9fTlJfc2VuZG1tc2cKKyNkZWZpbmUgU1lTX3NlbmRtc2cgX19OUl9zZW5kbXNnCisjZGVmaW5lIFNZU19zZW5kdG8gX19OUl9zZW5kdG8KKyNkZWZpbmUgU1lTX3NldF9tZW1wb2xpY3kgX19OUl9zZXRfbWVtcG9saWN5CisjZGVmaW5lIFNZU19zZXRfcm9idXN0X2xpc3QgX19OUl9zZXRfcm9idXN0X2xpc3QKKyNkZWZpbmUgU1lTX3NldF90aHJlYWRfYXJlYSBfX05SX3NldF90aHJlYWRfYXJlYQorI2RlZmluZSBTWVNfc2V0X3RpZF9hZGRyZXNzIF9fTlJfc2V0X3RpZF9hZGRyZXNzCisjZGVmaW5lIFNZU19zZXRkb21haW5uYW1lIF9fTlJfc2V0ZG9tYWlubmFtZQorI2RlZmluZSBTWVNfc2V0ZnNnaWQgX19OUl9zZXRmc2dpZAorI2RlZmluZSBTWVNfc2V0ZnN1aWQgX19OUl9zZXRmc3VpZAorI2RlZmluZSBTWVNfc2V0Z2lkIF9fTlJfc2V0Z2lkCisjZGVmaW5lIFNZU19zZXRncm91cHMgX19OUl9zZXRncm91cHMKKyNkZWZpbmUgU1lTX3NldGhvc3RuYW1lIF9fTlJfc2V0aG9zdG5hbWUKKyNkZWZpbmUgU1lTX3NldGl0aW1lciBfX05SX3NldGl0aW1lcgorI2RlZmluZSBTWVNfc2V0bnMgX19OUl9zZXRucworI2RlZmluZSBTWVNfc2V0cGdpZCBfX05SX3NldHBnaWQKKyNkZWZpbmUgU1lTX3NldHByaW9yaXR5IF9fTlJfc2V0cHJpb3JpdHkKKyNkZWZpbmUgU1lTX3NldHJlZ2lkIF9fTlJfc2V0cmVnaWQKKyNkZWZpbmUgU1lTX3NldHJlc2dpZCBfX05SX3NldHJlc2dpZAorI2RlZmluZSBTWVNfc2V0cmVzdWlkIF9fTlJfc2V0cmVzdWlkCisjZGVmaW5lIFNZU19zZXRyZXVpZCBfX05SX3NldHJldWlkCisjZGVmaW5lIFNZU19zZXRybGltaXQgX19OUl9zZXRybGltaXQKKyNkZWZpbmUgU1lTX3NldHNpZCBfX05SX3NldHNpZAorI2RlZmluZSBTWVNfc2V0c29ja29wdCBfX05SX3NldHNvY2tvcHQKKyNkZWZpbmUgU1lTX3NldHRpbWVvZmRheSBfX05SX3NldHRpbWVvZmRheQorI2RlZmluZSBTWVNfc2V0dWlkIF9fTlJfc2V0dWlkCisjZGVmaW5lIFNZU19zZXR4YXR0ciBfX05SX3NldHhhdHRyCisjZGVmaW5lIFNZU19zaG1hdCBfX05SX3NobWF0CisjZGVmaW5lIFNZU19zaG1jdGwgX19OUl9zaG1jdGwKKyNkZWZpbmUgU1lTX3NobWR0IF9fTlJfc2htZHQKKyNkZWZpbmUgU1lTX3NobWdldCBfX05SX3NobWdldAorI2RlZmluZSBTWVNfc2h1dGRvd24gX19OUl9zaHV0ZG93bgorI2RlZmluZSBTWVNfc2lnYWx0c3RhY2sgX19OUl9zaWdhbHRzdGFjaworI2RlZmluZSBTWVNfc2lnbmFsZmQgX19OUl9zaWduYWxmZAorI2RlZmluZSBTWVNfc2lnbmFsZmQ0IF9fTlJfc2lnbmFsZmQ0CisjZGVmaW5lIFNZU19zb2NrZXQgX19OUl9zb2NrZXQKKyNkZWZpbmUgU1lTX3NvY2tldHBhaXIgX19OUl9zb2NrZXRwYWlyCisjZGVmaW5lIFNZU19zcGxpY2UgX19OUl9zcGxpY2UKKyNkZWZpbmUgU1lTX3N0YXQgX19OUl9zdGF0CisjZGVmaW5lIFNZU19zdGF0ZnMgX19OUl9zdGF0ZnMKKyNkZWZpbmUgU1lTX3N3YXBvZmYgX19OUl9zd2Fwb2ZmCisjZGVmaW5lIFNZU19zd2Fwb24gX19OUl9zd2Fwb24KKyNkZWZpbmUgU1lTX3N5bWxpbmsgX19OUl9zeW1saW5rCisjZGVmaW5lIFNZU19zeW1saW5rYXQgX19OUl9zeW1saW5rYXQKKyNkZWZpbmUgU1lTX3N5bmMgX19OUl9zeW5jCisjZGVmaW5lIFNZU19zeW5jX2ZpbGVfcmFuZ2UgX19OUl9zeW5jX2ZpbGVfcmFuZ2UKKyNkZWZpbmUgU1lTX3N5bmNmcyBfX05SX3N5bmNmcworI2RlZmluZSBTWVNfc3lzZnMgX19OUl9zeXNmcworI2RlZmluZSBTWVNfc3lzaW5mbyBfX05SX3N5c2luZm8KKyNkZWZpbmUgU1lTX3N5c2xvZyBfX05SX3N5c2xvZworI2RlZmluZSBTWVNfdGVlIF9fTlJfdGVlCisjZGVmaW5lIFNZU190Z2tpbGwgX19OUl90Z2tpbGwKKyNkZWZpbmUgU1lTX3RpbWUgX19OUl90aW1lCisjZGVmaW5lIFNZU190aW1lcl9jcmVhdGUgX19OUl90aW1lcl9jcmVhdGUKKyNkZWZpbmUgU1lTX3RpbWVyX2RlbGV0ZSBfX05SX3RpbWVyX2RlbGV0ZQorI2RlZmluZSBTWVNfdGltZXJfZ2V0b3ZlcnJ1biBfX05SX3RpbWVyX2dldG92ZXJydW4KKyNkZWZpbmUgU1lTX3RpbWVyX2dldHRpbWUgX19OUl90aW1lcl9nZXR0aW1lCisjZGVmaW5lIFNZU190aW1lcl9zZXR0aW1lIF9fTlJfdGltZXJfc2V0dGltZQorI2RlZmluZSBTWVNfdGltZXJmZF9jcmVhdGUgX19OUl90aW1lcmZkX2NyZWF0ZQorI2RlZmluZSBTWVNfdGltZXJmZF9nZXR0aW1lIF9fTlJfdGltZXJmZF9nZXR0aW1lCisjZGVmaW5lIFNZU190aW1lcmZkX3NldHRpbWUgX19OUl90aW1lcmZkX3NldHRpbWUKKyNkZWZpbmUgU1lTX3RpbWVzIF9fTlJfdGltZXMKKyNkZWZpbmUgU1lTX3RraWxsIF9fTlJfdGtpbGwKKyNkZWZpbmUgU1lTX3RydW5jYXRlIF9fTlJfdHJ1bmNhdGUKKyNkZWZpbmUgU1lTX3R1eGNhbGwgX19OUl90dXhjYWxsCisjZGVmaW5lIFNZU191bWFzayBfX05SX3VtYXNrCisjZGVmaW5lIFNZU191bW91bnQyIF9fTlJfdW1vdW50MgorI2RlZmluZSBTWVNfdW5hbWUgX19OUl91bmFtZQorI2RlZmluZSBTWVNfdW5saW5rIF9fTlJfdW5saW5rCisjZGVmaW5lIFNZU191bmxpbmthdCBfX05SX3VubGlua2F0CisjZGVmaW5lIFNZU191bnNoYXJlIF9fTlJfdW5zaGFyZQorI2RlZmluZSBTWVNfdXNlbGliIF9fTlJfdXNlbGliCisjZGVmaW5lIFNZU191c3RhdCBfX05SX3VzdGF0CisjZGVmaW5lIFNZU191dGltZSBfX05SX3V0aW1lCisjZGVmaW5lIFNZU191dGltZW5zYXQgX19OUl91dGltZW5zYXQKKyNkZWZpbmUgU1lTX3V0aW1lcyBfX05SX3V0aW1lcworI2RlZmluZSBTWVNfdmZvcmsgX19OUl92Zm9yaworI2RlZmluZSBTWVNfdmhhbmd1cCBfX05SX3ZoYW5ndXAKKyNkZWZpbmUgU1lTX3Ztc3BsaWNlIF9fTlJfdm1zcGxpY2UKKyNkZWZpbmUgU1lTX3ZzZXJ2ZXIgX19OUl92c2VydmVyCisjZGVmaW5lIFNZU193YWl0NCBfX05SX3dhaXQ0CisjZGVmaW5lIFNZU193YWl0aWQgX19OUl93YWl0aWQKKyNkZWZpbmUgU1lTX3dyaXRlIF9fTlJfd3JpdGUKKyNkZWZpbmUgU1lTX3dyaXRldiBfX05SX3dyaXRldgorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zeXNsb2ctbGRibC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3lzbG9nLWxkYmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTRlNzBjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3lzbG9nLWxkYmwuaApAQCAtMCwwICsxLDM2IEBACisvKiAtbWxvbmctZG91YmxlLTY0IGNvbXBhdGliaWxpdHkgbW9kZSBmb3Igc3lzbG9nIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NZU0xPR19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3N5c2xvZy1sZGJsLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zeXNsb2cuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworX19MREJMX1JFRElSX0RFQ0wgKHN5c2xvZykKKworI2lmZGVmIF9fVVNFX0JTRAorX19MREJMX1JFRElSX0RFQ0wgKHZzeXNsb2cpCisjZW5kaWYKKworI2lmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAwICYmIGRlZmluZWQgX19leHRlcm5fYWx3YXlzX2lubGluZQorX19MREJMX1JFRElSX0RFQ0wgKF9fc3lzbG9nX2NoaykKKworIyBpZmRlZiBfX1VTRV9CU0QKK19fTERCTF9SRURJUl9ERUNMIChfX3ZzeXNsb2dfY2hrKQorIyBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy9zeXNsb2ctcGF0aC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3lzbG9nLXBhdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWJiZDZiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3lzbG9nLXBhdGguaApAQCAtMCwwICsxLDI5IEBACisvKiA8Yml0cy9zeXNsb2ctcGF0aC5oPiAtLSBfUEFUSF9MT0cgZGVmaW5pdGlvbgorICAgQ29weXJpZ2h0IChDKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU1lTTE9HX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LiAgVXNlIDxzeXMvc3lzbG9nLmg+IGluc3RlYWQiCisjZW5kaWYKKworI2lmbmRlZiBfQklUU19TWVNMT0dfUEFUSF9ICisjZGVmaW5lIF9CSVRTX1NZU0xPR19QQVRIX0ggMQorCisjZGVmaW5lCV9QQVRIX0xPRwkiL2Rldi9sb2ciCisKKyNlbmRpZiAvKiBiaXRzL3N5c2xvZy1wYXRoLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N5c2xvZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvc3lzbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ2NGQ3YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3N5c2xvZy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qIENoZWNraW5nIG1hY3JvcyBmb3Igc3lzbG9nIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNywgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NZU0xPR19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3N5c2xvZy5oPiBkaXJlY3RseTsgdXNlIDxzeXMvc3lzbG9nLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKworZXh0ZXJuIHZvaWQgX19zeXNsb2dfY2hrIChpbnQgX19wcmksIGludCBfX2ZsYWcsIF9fY29uc3QgY2hhciAqX19mbXQsIC4uLikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDQpKSk7CisKKyNpZmRlZiBfX3ZhX2FyZ19wYWNrCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHZvaWQKK3N5c2xvZyAoaW50IF9fcHJpLCBfX2NvbnN0IGNoYXIgKl9fZm10LCAuLi4pCit7CisgIF9fc3lzbG9nX2NoayAoX19wcmksIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwgX192YV9hcmdfcGFjayAoKSk7Cit9CisjZWxpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cworIyBkZWZpbmUgc3lzbG9nKHByaSwgLi4uKSBcCisgIF9fc3lzbG9nX2NoayAocHJpLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19WQV9BUkdTX18pCisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfQlNECitleHRlcm4gdm9pZCBfX3ZzeXNsb2dfY2hrIChpbnQgX19wcmksIGludCBfX2ZsYWcsIF9fY29uc3QgY2hhciAqX19mbXQsCisJCQkgICBfX2dudWNfdmFfbGlzdCBfX2FwKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgMCkpKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSB2b2lkCit2c3lzbG9nIChpbnQgX19wcmksIF9fY29uc3QgY2hhciAqX19mbXQsIF9fZ251Y192YV9saXN0IF9fYXApCit7CisgIF9fdnN5c2xvZ19jaGsgKF9fcHJpLCAgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX2FwKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdGVybWlvcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdGVybWlvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YjRjZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy90ZXJtaW9zLmgKQEAgLTAsMCArMSwyMjAgQEAKKy8qIHRlcm1pb3MgdHlwZSBhbmQgbWFjcm8gZGVmaW5pdGlvbnMuICBMaW51eCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTksIDIwMDMsIDIwMDUsIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1RFUk1JT1NfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy90ZXJtaW9zLmg+IGRpcmVjdGx5OyB1c2UgPHRlcm1pb3MuaD4gaW5zdGVhZC4iCisjZW5kaWYKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCWNjX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlzcGVlZF90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJdGNmbGFnX3Q7CisKKyNkZWZpbmUgTkNDUyAzMgorc3RydWN0IHRlcm1pb3MKKyAgeworICAgIHRjZmxhZ190IGNfaWZsYWc7CQkvKiBpbnB1dCBtb2RlIGZsYWdzICovCisgICAgdGNmbGFnX3QgY19vZmxhZzsJCS8qIG91dHB1dCBtb2RlIGZsYWdzICovCisgICAgdGNmbGFnX3QgY19jZmxhZzsJCS8qIGNvbnRyb2wgbW9kZSBmbGFncyAqLworICAgIHRjZmxhZ190IGNfbGZsYWc7CQkvKiBsb2NhbCBtb2RlIGZsYWdzICovCisgICAgY2NfdCBjX2xpbmU7CQkJLyogbGluZSBkaXNjaXBsaW5lICovCisgICAgY2NfdCBjX2NjW05DQ1NdOwkJLyogY29udHJvbCBjaGFyYWN0ZXJzICovCisgICAgc3BlZWRfdCBjX2lzcGVlZDsJCS8qIGlucHV0IHNwZWVkICovCisgICAgc3BlZWRfdCBjX29zcGVlZDsJCS8qIG91dHB1dCBzcGVlZCAqLworI2RlZmluZSBfSEFWRV9TVFJVQ1RfVEVSTUlPU19DX0lTUEVFRCAxCisjZGVmaW5lIF9IQVZFX1NUUlVDVF9URVJNSU9TX0NfT1NQRUVEIDEKKyAgfTsKKworLyogY19jYyBjaGFyYWN0ZXJzICovCisjZGVmaW5lIFZJTlRSIDAKKyNkZWZpbmUgVlFVSVQgMQorI2RlZmluZSBWRVJBU0UgMgorI2RlZmluZSBWS0lMTCAzCisjZGVmaW5lIFZFT0YgNAorI2RlZmluZSBWVElNRSA1CisjZGVmaW5lIFZNSU4gNgorI2RlZmluZSBWU1dUQyA3CisjZGVmaW5lIFZTVEFSVCA4CisjZGVmaW5lIFZTVE9QIDkKKyNkZWZpbmUgVlNVU1AgMTAKKyNkZWZpbmUgVkVPTCAxMQorI2RlZmluZSBWUkVQUklOVCAxMgorI2RlZmluZSBWRElTQ0FSRCAxMworI2RlZmluZSBWV0VSQVNFIDE0CisjZGVmaW5lIFZMTkVYVCAxNQorI2RlZmluZSBWRU9MMiAxNgorCisvKiBjX2lmbGFnIGJpdHMgKi8KKyNkZWZpbmUgSUdOQlJLCTAwMDAwMDEKKyNkZWZpbmUgQlJLSU5UCTAwMDAwMDIKKyNkZWZpbmUgSUdOUEFSCTAwMDAwMDQKKyNkZWZpbmUgUEFSTVJLCTAwMDAwMTAKKyNkZWZpbmUgSU5QQ0sJMDAwMDAyMAorI2RlZmluZSBJU1RSSVAJMDAwMDA0MAorI2RlZmluZSBJTkxDUgkwMDAwMTAwCisjZGVmaW5lIElHTkNSCTAwMDAyMDAKKyNkZWZpbmUgSUNSTkwJMDAwMDQwMAorI2RlZmluZSBJVUNMQwkwMDAxMDAwCisjZGVmaW5lIElYT04JMDAwMjAwMAorI2RlZmluZSBJWEFOWQkwMDA0MDAwCisjZGVmaW5lIElYT0ZGCTAwMTAwMDAKKyNkZWZpbmUgSU1BWEJFTAkwMDIwMDAwCisjZGVmaW5lIElVVEY4CTAwNDAwMDAKKworLyogY19vZmxhZyBiaXRzICovCisjZGVmaW5lIE9QT1NUCTAwMDAwMDEKKyNkZWZpbmUgT0xDVUMJMDAwMDAwMgorI2RlZmluZSBPTkxDUgkwMDAwMDA0CisjZGVmaW5lIE9DUk5MCTAwMDAwMTAKKyNkZWZpbmUgT05PQ1IJMDAwMDAyMAorI2RlZmluZSBPTkxSRVQJMDAwMDA0MAorI2RlZmluZSBPRklMTAkwMDAwMTAwCisjZGVmaW5lIE9GREVMCTAwMDAyMDAKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorIyBkZWZpbmUgTkxETFkJMDAwMDQwMAorIyBkZWZpbmUgICBOTDAJMDAwMDAwMAorIyBkZWZpbmUgICBOTDEJMDAwMDQwMAorIyBkZWZpbmUgQ1JETFkJMDAwMzAwMAorIyBkZWZpbmUgICBDUjAJMDAwMDAwMAorIyBkZWZpbmUgICBDUjEJMDAwMTAwMAorIyBkZWZpbmUgICBDUjIJMDAwMjAwMAorIyBkZWZpbmUgICBDUjMJMDAwMzAwMAorIyBkZWZpbmUgVEFCRExZCTAwMTQwMDAKKyMgZGVmaW5lICAgVEFCMAkwMDAwMDAwCisjIGRlZmluZSAgIFRBQjEJMDAwNDAwMAorIyBkZWZpbmUgICBUQUIyCTAwMTAwMDAKKyMgZGVmaW5lICAgVEFCMwkwMDE0MDAwCisjIGRlZmluZSBCU0RMWQkwMDIwMDAwCisjIGRlZmluZSAgIEJTMAkwMDAwMDAwCisjIGRlZmluZSAgIEJTMQkwMDIwMDAwCisjIGRlZmluZSBGRkRMWQkwMTAwMDAwCisjIGRlZmluZSAgIEZGMAkwMDAwMDAwCisjIGRlZmluZSAgIEZGMQkwMTAwMDAwCisjZW5kaWYKKworI2RlZmluZSBWVERMWQkwMDQwMDAwCisjZGVmaW5lICAgVlQwCTAwMDAwMDAKKyNkZWZpbmUgICBWVDEJMDA0MDAwMAorCisjaWZkZWYgX19VU0VfTUlTQworIyBkZWZpbmUgWFRBQlMJMDAxNDAwMAorI2VuZGlmCisKKy8qIGNfY2ZsYWcgYml0IG1lYW5pbmcgKi8KKyNpZmRlZiBfX1VTRV9NSVNDCisjIGRlZmluZSBDQkFVRAkwMDEwMDE3CisjZW5kaWYKKyNkZWZpbmUgIEIwCTAwMDAwMDAJCS8qIGhhbmcgdXAgKi8KKyNkZWZpbmUgIEI1MAkwMDAwMDAxCisjZGVmaW5lICBCNzUJMDAwMDAwMgorI2RlZmluZSAgQjExMAkwMDAwMDAzCisjZGVmaW5lICBCMTM0CTAwMDAwMDQKKyNkZWZpbmUgIEIxNTAJMDAwMDAwNQorI2RlZmluZSAgQjIwMAkwMDAwMDA2CisjZGVmaW5lICBCMzAwCTAwMDAwMDcKKyNkZWZpbmUgIEI2MDAJMDAwMDAxMAorI2RlZmluZSAgQjEyMDAJMDAwMDAxMQorI2RlZmluZSAgQjE4MDAJMDAwMDAxMgorI2RlZmluZSAgQjI0MDAJMDAwMDAxMworI2RlZmluZSAgQjQ4MDAJMDAwMDAxNAorI2RlZmluZSAgQjk2MDAJMDAwMDAxNQorI2RlZmluZSAgQjE5MjAwCTAwMDAwMTYKKyNkZWZpbmUgIEIzODQwMAkwMDAwMDE3CisjaWZkZWYgX19VU0VfTUlTQworIyBkZWZpbmUgRVhUQSBCMTkyMDAKKyMgZGVmaW5lIEVYVEIgQjM4NDAwCisjZW5kaWYKKyNkZWZpbmUgQ1NJWkUJMDAwMDA2MAorI2RlZmluZSAgIENTNQkwMDAwMDAwCisjZGVmaW5lICAgQ1M2CTAwMDAwMjAKKyNkZWZpbmUgICBDUzcJMDAwMDA0MAorI2RlZmluZSAgIENTOAkwMDAwMDYwCisjZGVmaW5lIENTVE9QQgkwMDAwMTAwCisjZGVmaW5lIENSRUFECTAwMDAyMDAKKyNkZWZpbmUgUEFSRU5CCTAwMDA0MDAKKyNkZWZpbmUgUEFST0RECTAwMDEwMDAKKyNkZWZpbmUgSFVQQ0wJMDAwMjAwMAorI2RlZmluZSBDTE9DQUwJMDAwNDAwMAorI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIENCQVVERVggMDAxMDAwMAorI2VuZGlmCisjZGVmaW5lICBCNTc2MDAgICAwMDEwMDAxCisjZGVmaW5lICBCMTE1MjAwICAwMDEwMDAyCisjZGVmaW5lICBCMjMwNDAwICAwMDEwMDAzCisjZGVmaW5lICBCNDYwODAwICAwMDEwMDA0CisjZGVmaW5lICBCNTAwMDAwICAwMDEwMDA1CisjZGVmaW5lICBCNTc2MDAwICAwMDEwMDA2CisjZGVmaW5lICBCOTIxNjAwICAwMDEwMDA3CisjZGVmaW5lICBCMTAwMDAwMCAwMDEwMDEwCisjZGVmaW5lICBCMTE1MjAwMCAwMDEwMDExCisjZGVmaW5lICBCMTUwMDAwMCAwMDEwMDEyCisjZGVmaW5lICBCMjAwMDAwMCAwMDEwMDEzCisjZGVmaW5lICBCMjUwMDAwMCAwMDEwMDE0CisjZGVmaW5lICBCMzAwMDAwMCAwMDEwMDE1CisjZGVmaW5lICBCMzUwMDAwMCAwMDEwMDE2CisjZGVmaW5lICBCNDAwMDAwMCAwMDEwMDE3CisjZGVmaW5lIF9fTUFYX0JBVUQgQjQwMDAwMDAKKyNpZmRlZiBfX1VTRV9NSVNDCisjIGRlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJCS8qIGlucHV0IGJhdWQgcmF0ZSAobm90IHVzZWQpICovCisjIGRlZmluZSBDTVNQQVIgICAwMTAwMDAwMDAwMDAJCS8qIG1hcmsgb3Igc3BhY2UgKHN0aWNrKSBwYXJpdHkgKi8KKyMgZGVmaW5lIENSVFNDVFMgIDAyMDAwMDAwMDAwMAkJLyogZmxvdyBjb250cm9sICovCisjZW5kaWYKKworLyogY19sZmxhZyBiaXRzICovCisjZGVmaW5lIElTSUcJMDAwMDAwMQorI2RlZmluZSBJQ0FOT04JMDAwMDAwMgorI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisjIGRlZmluZSBYQ0FTRQkwMDAwMDA0CisjZW5kaWYKKyNkZWZpbmUgRUNITwkwMDAwMDEwCisjZGVmaW5lIEVDSE9FCTAwMDAwMjAKKyNkZWZpbmUgRUNIT0sJMDAwMDA0MAorI2RlZmluZSBFQ0hPTkwJMDAwMDEwMAorI2RlZmluZSBOT0ZMU0gJMDAwMDIwMAorI2RlZmluZSBUT1NUT1AJMDAwMDQwMAorI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIEVDSE9DVEwgMDAwMTAwMAorIyBkZWZpbmUgRUNIT1BSVCAwMDAyMDAwCisjIGRlZmluZSBFQ0hPS0UJIDAwMDQwMDAKKyMgZGVmaW5lIEZMVVNITwkgMDAxMDAwMAorIyBkZWZpbmUgUEVORElOCSAwMDQwMDAwCisjZW5kaWYKKyNkZWZpbmUgSUVYVEVOCTAxMDAwMDAKKyNpZmRlZiBfX1VTRV9CU0QKKyMgZGVmaW5lIEVYVFBST0MgMDIwMDAwMAorI2VuZGlmCisKKy8qIHRjZmxvdygpIGFuZCBUQ1hPTkMgdXNlIHRoZXNlICovCisjZGVmaW5lCVRDT09GRgkJMAorI2RlZmluZQlUQ09PTgkJMQorI2RlZmluZQlUQ0lPRkYJCTIKKyNkZWZpbmUJVENJT04JCTMKKworLyogdGNmbHVzaCgpIGFuZCBUQ0ZMU0ggdXNlIHRoZXNlICovCisjZGVmaW5lCVRDSUZMVVNICTAKKyNkZWZpbmUJVENPRkxVU0gJMQorI2RlZmluZQlUQ0lPRkxVU0gJMgorCisvKiB0Y3NldGF0dHIgdXNlcyB0aGVzZSAqLworI2RlZmluZQlUQ1NBTk9XCQkwCisjZGVmaW5lCVRDU0FEUkFJTgkxCisjZGVmaW5lCVRDU0FGTFVTSAkyCisKKworI2RlZmluZSBfSU9UX3Rlcm1pb3MgLyogSHVyZCBpb2N0bCB0eXBlIGZpZWxkLiAgKi8gXAorICBfSU9UIChfSU9UUyAoY2ZsYWdfdCksIDQsIF9JT1RTIChjY190KSwgTkNDUywgX0lPVFMgKHNwZWVkX3QpLCAyKQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdGltZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZjlhNjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy90aW1lLmgKQEAgLTAsMCArMSw5OSBAQAorLyogU3lzdGVtLWRlcGVuZGVudCB0aW1pbmcgZGVmaW5pdGlvbnMuICBMaW51eCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LDE5OTcsMTk5OS0yMDAzLDIwMTAsMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqIE5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5OyB1c2UgPHRpbWUuaD4gaW5zdGVhZC4KKyAqLworCisjaWYgZGVmaW5lZCBfX25lZWRfdGltZXZhbCB8fCBkZWZpbmVkIF9fVVNFX0dOVQorIyBpZm5kZWYgX1NUUlVDVF9USU1FVkFMCisjICBkZWZpbmUgX1NUUlVDVF9USU1FVkFMCTEKKyMgIGluY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworLyogQSB0aW1lIHZhbHVlIHRoYXQgaXMgYWNjdXJhdGUgdG8gdGhlIG5lYXJlc3QKKyAgIG1pY3Jvc2Vjb25kIGJ1dCBhbHNvIGhhcyBhIHJhbmdlIG9mIHllYXJzLiAgKi8KK3N0cnVjdCB0aW1ldmFsCisgIHsKKyAgICBfX3RpbWVfdCB0dl9zZWM7CQkvKiBTZWNvbmRzLiAgKi8KKyAgICBfX3N1c2Vjb25kc190IHR2X3VzZWM7CS8qIE1pY3Jvc2Vjb25kcy4gICovCisgIH07CisjIGVuZGlmCS8qIHN0cnVjdCB0aW1ldmFsICovCisjZW5kaWYKKworI2lmbmRlZiBfX25lZWRfdGltZXZhbAorIyBpZm5kZWYgX0JJVFNfVElNRV9ICisjICBkZWZpbmUgX0JJVFNfVElNRV9ICTEKKworLyogSVNPL0lFQyA5ODk5OjE5OTAgNy4xMi4xOiA8dGltZS5oPgorICAgVGhlIG1hY3JvIGBDTE9DS1NfUEVSX1NFQycgaXMgdGhlIG51bWJlciBwZXIgc2Vjb25kIG9mIHRoZSB2YWx1ZQorICAgcmV0dXJuZWQgYnkgdGhlIGBjbG9jaycgZnVuY3Rpb24uICovCisvKiBDQUUgWFNILCBJc3N1ZSA0LCBWZXJzaW9uIDI6IDx0aW1lLmg+CisgICBUaGUgdmFsdWUgb2YgQ0xPQ0tTX1BFUl9TRUMgaXMgcmVxdWlyZWQgdG8gYmUgMSBtaWxsaW9uIG9uIGFsbAorICAgWFNJLWNvbmZvcm1hbnQgc3lzdGVtcy4gKi8KKyMgIGRlZmluZSBDTE9DS1NfUEVSX1NFQyAgMTAwMDAwMGwKKworIyAgaWYgIWRlZmluZWQgX19TVFJJQ1RfQU5TSV9fICYmICFkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIEV2ZW4gdGhvdWdoIENMT0NLU19QRVJfU0VDIGhhcyBzdWNoIGEgc3RyYW5nZSB2YWx1ZSBDTEtfVENLCisgICBwcmVzZW50cyB0aGUgcmVhbCB2YWx1ZSBmb3IgY2xvY2sgdGlja3MgcGVyIHNlY29uZCBmb3IgdGhlIHN5c3RlbS4gICovCisjICAgaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorZXh0ZXJuIGxvbmcgaW50IF9fc3lzY29uZiAoaW50KTsKKyMgICBkZWZpbmUgQ0xLX1RDSyAoKF9fY2xvY2tfdCkgX19zeXNjb25mICgyKSkJLyogMiBpcyBfU0NfQ0xLX1RDSyAqLworIyAgZW5kaWYKKworIyAgaWZkZWYgX19VU0VfUE9TSVgxOTkzMDkKKy8qIElkZW50aWZpZXIgZm9yIHN5c3RlbS13aWRlIHJlYWx0aW1lIGNsb2NrLiAgKi8KKyMgICBkZWZpbmUgQ0xPQ0tfUkVBTFRJTUUJCTAKKy8qIE1vbm90b25pYyBzeXN0ZW0td2lkZSBjbG9jay4gICovCisjICAgZGVmaW5lIENMT0NLX01PTk9UT05JQwkJMQorLyogSGlnaC1yZXNvbHV0aW9uIHRpbWVyIGZyb20gdGhlIENQVS4gICovCisjICAgZGVmaW5lIENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRAkyCisvKiBUaHJlYWQtc3BlY2lmaWMgQ1BVLXRpbWUgY2xvY2suICAqLworIyAgIGRlZmluZSBDTE9DS19USFJFQURfQ1BVVElNRV9JRAkzCisvKiBNb25vdG9uaWMgc3lzdGVtLXdpZGUgY2xvY2ssIG5vdCBhZGp1c3RlZCBmb3IgZnJlcXVlbmN5IHNjYWxpbmcuICAqLworIyAgIGRlZmluZSBDTE9DS19NT05PVE9OSUNfUkFXCQk0CisvKiBJZGVudGlmaWVyIGZvciBzeXN0ZW0td2lkZSByZWFsdGltZSBjbG9jaywgdXBkYXRlZCBvbmx5IG9uIHRpY2tzLiAgKi8KKyMgICBkZWZpbmUgQ0xPQ0tfUkVBTFRJTUVfQ09BUlNFCTUKKy8qIE1vbm90b25pYyBzeXN0ZW0td2lkZSBjbG9jaywgdXBkYXRlZCBvbmx5IG9uIHRpY2tzLiAgKi8KKyMgICBkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX0NPQVJTRQk2CisvKiBNb25vdG9uaWMgc3lzdGVtLXdpZGUgY2xvY2sgdGhhdCBpbmNsdWRlcyB0aW1lIHNwZW50IGluIHN1c3BlbnNpb24uICAqLworIyAgIGRlZmluZSBDTE9DS19CT09UVElNRQkJNworLyogTGlrZSBDTE9DS19SRUFMVElNRSBidXQgYWxzbyB3YWtlcyBzdXNwZW5kZWQgc3lzdGVtLiAgKi8KKyMgICBkZWZpbmUgQ0xPQ0tfUkVBTFRJTUVfQUxBUk0JCTgKKy8qIExpa2UgQ0xPQ0tfQk9PVFRJTUUgYnV0IGFsc28gd2FrZXMgc3VzcGVuZGVkIHN5c3RlbS4gICovCisjICAgZGVmaW5lIENMT0NLX0JPT1RUSU1FX0FMQVJNCQk5CisKKy8qIEZsYWcgdG8gaW5kaWNhdGUgdGltZSBpcyBhYnNvbHV0ZS4gICovCisjICAgZGVmaW5lIFRJTUVSX0FCU1RJTUUJCTEKKyMgIGVuZGlmCisKKyMgIGlmZGVmIF9fVVNFX0dOVQorIyAgIGluY2x1ZGUgPGJpdHMvdGltZXguaD4KKworX19CRUdJTl9ERUNMUworCisvKiBUdW5lIGEgUE9TSVggY2xvY2suICAqLworZXh0ZXJuIGludCBjbG9ja19hZGp0aW1lIChfX2Nsb2NraWRfdCBfX2Nsb2NrX2lkLCBzdHJ1Y3QgdGltZXggKl9fdXR4KSBfX1RIUk9XOworCitfX0VORF9ERUNMUworIyAgZW5kaWYgLyogdXNlIEdOVSAqLworCisjIGVuZGlmCS8qIGJpdHMvdGltZS5oICovCisjZW5kaWYKKworI3VuZGVmIF9fbmVlZF90aW1ldmFsCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy90aW1leC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdGltZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2RlNjdlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdGltZXguaApAQCAtMCwwICsxLDEwOCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsMTk5OSwyMDA3LDIwMDksMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfQklUU19USU1FWF9ICisjZGVmaW5lCV9CSVRTX1RJTUVYX0gJMQorCisvKiBUaGVzZSBkZWZpbml0aW9ucyBmcm9tIGxpbnV4L3RpbWV4LmggYXMgb2YgMi42LjMwLiAgKi8KKworc3RydWN0IHRpbWV4Cit7CisgIHVuc2lnbmVkIGludCBtb2RlczsJLyogbW9kZSBzZWxlY3RvciAqLworICBsb25nIGludCBvZmZzZXQ7CS8qIHRpbWUgb2Zmc2V0ICh1c2VjKSAqLworICBsb25nIGludCBmcmVxOwkvKiBmcmVxdWVuY3kgb2Zmc2V0IChzY2FsZWQgcHBtKSAqLworICBsb25nIGludCBtYXhlcnJvcjsJLyogbWF4aW11bSBlcnJvciAodXNlYykgKi8KKyAgbG9uZyBpbnQgZXN0ZXJyb3I7CS8qIGVzdGltYXRlZCBlcnJvciAodXNlYykgKi8KKyAgaW50IHN0YXR1czsJCS8qIGNsb2NrIGNvbW1hbmQvc3RhdHVzICovCisgIGxvbmcgaW50IGNvbnN0YW50OwkvKiBwbGwgdGltZSBjb25zdGFudCAqLworICBsb25nIGludCBwcmVjaXNpb247CS8qIGNsb2NrIHByZWNpc2lvbiAodXNlYykgKHJlYWQgb25seSkgKi8KKyAgbG9uZyBpbnQgdG9sZXJhbmNlOwkvKiBjbG9jayBmcmVxdWVuY3kgdG9sZXJhbmNlIChwcG0pIChyZWFkIG9ubHkpICovCisgIHN0cnVjdCB0aW1ldmFsIHRpbWU7CS8qIChyZWFkIG9ubHkpICovCisgIGxvbmcgaW50IHRpY2s7CS8qIChtb2RpZmllZCkgdXNlY3MgYmV0d2VlbiBjbG9jayB0aWNrcyAqLworCisgIGxvbmcgaW50IHBwc2ZyZXE7CS8qIHBwcyBmcmVxdWVuY3kgKHNjYWxlZCBwcG0pIChybykgKi8KKyAgbG9uZyBpbnQgaml0dGVyOwkvKiBwcHMgaml0dGVyICh1cykgKHJvKSAqLworICBpbnQgc2hpZnQ7CQkvKiBpbnRlcnZhbCBkdXJhdGlvbiAocykgKHNoaWZ0KSAocm8pICovCisgIGxvbmcgaW50IHN0YWJpbDsJLyogcHBzIHN0YWJpbGl0eSAoc2NhbGVkIHBwbSkgKHJvKSAqLworICBsb25nIGludCBqaXRjbnQ7CS8qIGppdHRlciBsaW1pdCBleGNlZWRlZCAocm8pICovCisgIGxvbmcgaW50IGNhbGNudDsJLyogY2FsaWJyYXRpb24gaW50ZXJ2YWxzIChybykgKi8KKyAgbG9uZyBpbnQgZXJyY250OwkvKiBjYWxpYnJhdGlvbiBlcnJvcnMgKHJvKSAqLworICBsb25nIGludCBzdGJjbnQ7CS8qIHN0YWJpbGl0eSBsaW1pdCBleGNlZWRlZCAocm8pICovCisKKyAgaW50IHRhaTsJCS8qIFRBSSBvZmZzZXQgKHJvKSAqLworCisgIC8qID8/PyAqLworICBpbnQgIDozMjsgaW50ICA6MzI7IGludCAgOjMyOyBpbnQgIDozMjsKKyAgaW50ICA6MzI7IGludCAgOjMyOyBpbnQgIDozMjsgaW50ICA6MzI7CisgIGludCAgOjMyOyBpbnQgIDozMjsgaW50ICA6MzI7Cit9OworCisvKiBNb2RlIGNvZGVzICh0aW1leC5tb2RlKSAqLworI2RlZmluZSBBREpfT0ZGU0VUCQkweDAwMDEJLyogdGltZSBvZmZzZXQgKi8KKyNkZWZpbmUgQURKX0ZSRVFVRU5DWQkJMHgwMDAyCS8qIGZyZXF1ZW5jeSBvZmZzZXQgKi8KKyNkZWZpbmUgQURKX01BWEVSUk9SCQkweDAwMDQJLyogbWF4aW11bSB0aW1lIGVycm9yICovCisjZGVmaW5lIEFESl9FU1RFUlJPUgkJMHgwMDA4CS8qIGVzdGltYXRlZCB0aW1lIGVycm9yICovCisjZGVmaW5lIEFESl9TVEFUVVMJCTB4MDAxMAkvKiBjbG9jayBzdGF0dXMgKi8KKyNkZWZpbmUgQURKX1RJTUVDT05TVAkJMHgwMDIwCS8qIHBsbCB0aW1lIGNvbnN0YW50ICovCisjZGVmaW5lIEFESl9UQUkJCQkweDAwODAJLyogc2V0IFRBSSBvZmZzZXQgKi8KKyNkZWZpbmUgQURKX01JQ1JPCQkweDEwMDAJLyogc2VsZWN0IG1pY3Jvc2Vjb25kIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgQURKX05BTk8JCTB4MjAwMAkvKiBzZWxlY3QgbmFub3NlY29uZCByZXNvbHV0aW9uICovCisjZGVmaW5lIEFESl9USUNLCQkweDQwMDAJLyogdGljayB2YWx1ZSAqLworI2RlZmluZSBBREpfT0ZGU0VUX1NJTkdMRVNIT1QJMHg4MDAxCS8qIG9sZC1mYXNoaW9uZWQgYWRqdGltZSAqLworI2RlZmluZSBBREpfT0ZGU0VUX1NTX1JFQUQJMHhhMDAxCS8qIHJlYWQtb25seSBhZGp0aW1lICovCisKKy8qIHhudHAgMy40IGNvbXBhdGliaWxpdHkgbmFtZXMgKi8KKyNkZWZpbmUgTU9EX09GRlNFVAlBREpfT0ZGU0VUCisjZGVmaW5lIE1PRF9GUkVRVUVOQ1kJQURKX0ZSRVFVRU5DWQorI2RlZmluZSBNT0RfTUFYRVJST1IJQURKX01BWEVSUk9SCisjZGVmaW5lIE1PRF9FU1RFUlJPUglBREpfRVNURVJST1IKKyNkZWZpbmUgTU9EX1NUQVRVUwlBREpfU1RBVFVTCisjZGVmaW5lIE1PRF9USU1FQ09OU1QJQURKX1RJTUVDT05TVAorI2RlZmluZSBNT0RfQ0xLQglBREpfVElDSworI2RlZmluZSBNT0RfQ0xLQQlBREpfT0ZGU0VUX1NJTkdMRVNIT1QgLyogMHg4MDAwIGluIG9yaWdpbmFsICovCisjZGVmaW5lIE1PRF9UQUkJCUFESl9UQUkKKyNkZWZpbmUgTU9EX01JQ1JPCUFESl9NSUNSTworI2RlZmluZSBNT0RfTkFOTwlBREpfTkFOTworCisKKy8qIFN0YXR1cyBjb2RlcyAodGltZXguc3RhdHVzKSAqLworI2RlZmluZSBTVEFfUExMCQkweDAwMDEJLyogZW5hYmxlIFBMTCB1cGRhdGVzIChydykgKi8KKyNkZWZpbmUgU1RBX1BQU0ZSRVEJMHgwMDAyCS8qIGVuYWJsZSBQUFMgZnJlcSBkaXNjaXBsaW5lIChydykgKi8KKyNkZWZpbmUgU1RBX1BQU1RJTUUJMHgwMDA0CS8qIGVuYWJsZSBQUFMgdGltZSBkaXNjaXBsaW5lIChydykgKi8KKyNkZWZpbmUgU1RBX0ZMTAkJMHgwMDA4CS8qIHNlbGVjdCBmcmVxdWVuY3ktbG9jayBtb2RlIChydykgKi8KKworI2RlZmluZSBTVEFfSU5TCQkweDAwMTAJLyogaW5zZXJ0IGxlYXAgKHJ3KSAqLworI2RlZmluZSBTVEFfREVMCQkweDAwMjAJLyogZGVsZXRlIGxlYXAgKHJ3KSAqLworI2RlZmluZSBTVEFfVU5TWU5DCTB4MDA0MAkvKiBjbG9jayB1bnN5bmNocm9uaXplZCAocncpICovCisjZGVmaW5lIFNUQV9GUkVRSE9MRAkweDAwODAJLyogaG9sZCBmcmVxdWVuY3kgKHJ3KSAqLworCisjZGVmaW5lIFNUQV9QUFNTSUdOQUwJMHgwMTAwCS8qIFBQUyBzaWduYWwgcHJlc2VudCAocm8pICovCisjZGVmaW5lIFNUQV9QUFNKSVRURVIJMHgwMjAwCS8qIFBQUyBzaWduYWwgaml0dGVyIGV4Y2VlZGVkIChybykgKi8KKyNkZWZpbmUgU1RBX1BQU1dBTkRFUgkweDA0MDAJLyogUFBTIHNpZ25hbCB3YW5kZXIgZXhjZWVkZWQgKHJvKSAqLworI2RlZmluZSBTVEFfUFBTRVJST1IJMHgwODAwCS8qIFBQUyBzaWduYWwgY2FsaWJyYXRpb24gZXJyb3IgKHJvKSAqLworCisjZGVmaW5lIFNUQV9DTE9DS0VSUgkweDEwMDAJLyogY2xvY2sgaGFyZHdhcmUgZmF1bHQgKHJvKSAqLworI2RlZmluZSBTVEFfTkFOTwkweDIwMDAJLyogcmVzb2x1dGlvbiAoMCA9IHVzLCAxID0gbnMpIChybykgKi8KKyNkZWZpbmUgU1RBX01PREUJMHg0MDAwCS8qIG1vZGUgKDAgPSBQTEwsIDEgPSBGTEwpIChybykgKi8KKyNkZWZpbmUgU1RBX0NMSwkJMHg4MDAwCS8qIGNsb2NrIHNvdXJjZSAoMCA9IEEsIDEgPSBCKSAocm8pICovCisKKy8qIFJlYWQtb25seSBiaXRzICovCisjZGVmaW5lIFNUQV9ST05MWSAoU1RBX1BQU1NJR05BTCB8IFNUQV9QUFNKSVRURVIgfCBTVEFfUFBTV0FOREVSIHwgXAorICAgIFNUQV9QUFNFUlJPUiB8IFNUQV9DTE9DS0VSUiB8IFNUQV9OQU5PIHwgU1RBX01PREUgfCBTVEFfQ0xLKQorCisjZW5kaWYgLyogYml0cy90aW1leC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy90eXBlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWJlODJmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdHlwZXMuaApAQCAtMCwwICsxLDE5NyBAQAorLyogYml0cy90eXBlcy5oIC0tIGRlZmluaXRpb25zIG9mIF9fKl90IHR5cGVzIHVuZGVybHlpbmcgKl90IHR5cGVzLgorICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICogTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHk7IHVzZSA8c3lzL3R5cGVzLmg+IGluc3RlYWQuCisgKi8KKworI2lmbmRlZglfQklUU19UWVBFU19ICisjZGVmaW5lCV9CSVRTX1RZUEVTX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKy8qIENvbnZlbmllbmNlIHR5cGVzLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBfX3VfY2hhcjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IF9fdV9zaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IF9fdV9pbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IF9fdV9sb25nOworCisvKiBGaXhlZC1zaXplIHR5cGVzLCB1bmRlcmx5aW5nIHR5cGVzIGRlcGVuZCBvbiB3b3JkIHNpemUgYW5kIGNvbXBpbGVyLiAgKi8KK3R5cGVkZWYgc2lnbmVkIGNoYXIgX19pbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX191aW50OF90OwordHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IF9faW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IF9fdWludDE2X3Q7Cit0eXBlZGVmIHNpZ25lZCBpbnQgX19pbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgX191aW50MzJfdDsKKyNpZiBfX1dPUkRTSVpFID09IDY0Cit0eXBlZGVmIHNpZ25lZCBsb25nIGludCBfX2ludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IF9fdWludDY0X3Q7CisjZWxpZiBkZWZpbmVkIF9fR0xJQkNfSEFWRV9MT05HX0xPTkcKK19fZXh0ZW5zaW9uX18gdHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIGludCBfX2ludDY0X3Q7CitfX2V4dGVuc2lvbl9fIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCBfX3VpbnQ2NF90OworI2VuZGlmCisKKy8qIHF1YWRfdCBpcyBhbHNvIDY0IGJpdHMuICAqLworI2lmIF9fV09SRFNJWkUgPT0gNjQKK3R5cGVkZWYgbG9uZyBpbnQgX19xdWFkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IF9fdV9xdWFkX3Q7CisjZWxpZiBkZWZpbmVkIF9fR0xJQkNfSEFWRV9MT05HX0xPTkcKK19fZXh0ZW5zaW9uX18gdHlwZWRlZiBsb25nIGxvbmcgaW50IF9fcXVhZF90OworX19leHRlbnNpb25fXyB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX191X3F1YWRfdDsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAoreworICBsb25nIF9fdmFsWzJdOworfSBfX3F1YWRfdDsKK3R5cGVkZWYgc3RydWN0Cit7CisgIF9fdV9sb25nIF9fdmFsWzJdOworfSBfX3VfcXVhZF90OworI2VuZGlmCisKKworLyogVGhlIG1hY2hpbmUtZGVwZW5kZW50IGZpbGUgPGJpdHMvdHlwZXNpemVzLmg+IGRlZmluZXMgX18qX1RfVFlQRQorICAgbWFjcm9zIGZvciBlYWNoIG9mIHRoZSBPUyB0eXBlcyB3ZSBkZWZpbmUgYmVsb3cuICBUaGUgZGVmaW5pdGlvbnMKKyAgIG9mIHRob3NlIG1hY3JvcyBtdXN0IHVzZSB0aGUgZm9sbG93aW5nIG1hY3JvcyBmb3IgdW5kZXJseWluZyB0eXBlcy4KKyAgIFdlIGRlZmluZSBfX1M8U0laRT5fVFlQRSBhbmQgX19VPFNJWkU+X1RZUEUgZm9yIHRoZSBzaWduZWQgYW5kIHVuc2lnbmVkCisgICB2YXJpYW50cyBvZiBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgaW50ZWdlciB0eXBlcyBvbiB0aGlzIG1hY2hpbmUuCisKKwkxNgkJLS0gIm5hdHVyYWwiIDE2LWJpdCB0eXBlIChhbHdheXMgc2hvcnQpCisJMzIJCS0tICJuYXR1cmFsIiAzMi1iaXQgdHlwZSAoYWx3YXlzIGludCkKKwk2NAkJLS0gIm5hdHVyYWwiIDY0LWJpdCB0eXBlIChsb25nIG9yIGxvbmcgbG9uZykKKwlMT05HMzIJCS0tIDMyLWJpdCB0eXBlLCB0cmFkaXRpb25hbGx5IGxvbmcKKwlRVUFECQktLSA2NC1iaXQgdHlwZSwgYWx3YXlzIGxvbmcgbG9uZworCVdPUkQJCS0tIG5hdHVyYWwgdHlwZSBvZiBfX1dPUkRTSVpFIGJpdHMgKGludCBvciBsb25nKQorCUxPTkdXT1JECS0tIHR5cGUgb2YgX19XT1JEU0laRSBiaXRzLCB0cmFkaXRpb25hbGx5IGxvbmcKKworICAgV2UgZGlzdGluZ3Vpc2ggV09SRC9MT05HV09SRCwgMzIvTE9ORzMyLCBhbmQgNjQvUVVBRCBzbyB0aGF0IHRoZQorICAgY29udmVudGlvbmFsIHVzZXMgb2YgYGxvbmcnIG9yIGBsb25nIGxvbmcnIHR5cGUgbW9kaWZpZXJzIG1hdGNoIHRoZQorICAgdHlwZXMgd2UgZGVmaW5lLCBldmVuIHdoZW4gYSBsZXNzLWFkb3JuZWQgdHlwZSB3b3VsZCBiZSB0aGUgc2FtZSBzaXplLgorICAgVGhpcyBtYXR0ZXJzIGZvciAoc29tZXdoYXQpIHBvcnRhYmx5IHdyaXRpbmcgcHJpbnRmL3NjYW5mIGZvcm1hdHMgZm9yCisgICB0aGVzZSB0eXBlcywgd2hlcmUgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGwgb3IgbGwgZm9ybWF0IG1vZGlmaWVycyBjYW4KKyAgIG1ha2UgdGhlIHR5cGVkZWZzIGFuZCB0aGUgZm9ybWF0cyBtYXRjaCB1cCBhY3Jvc3MgYWxsIEdOVSBwbGF0Zm9ybXMuICBJZgorICAgd2UgdXNlZCBgbG9uZycgd2hlbiBpdCdzIDY0IGJpdHMgd2hlcmUgYGxvbmcgbG9uZycgaXMgZXhwZWN0ZWQsIHRoZW4gdGhlCisgICBjb21waWxlciB3b3VsZCB3YXJuIGFib3V0IHRoZSBmb3JtYXRzIG5vdCBtYXRjaGluZyB0aGUgYXJndW1lbnQgdHlwZXMsCisgICBhbmQgdGhlIHByb2dyYW1tZXIgY2hhbmdpbmcgdGhlbSB0byBzaHV0IHVwIHRoZSBjb21waWxlciB3b3VsZCBicmVhayB0aGUKKyAgIHByb2dyYW0ncyBwb3J0YWJpbGl0eS4KKworICAgSGVyZSB3ZSBhc3N1bWUgd2hhdCBpcyBwcmVzZW50bHkgdGhlIGNhc2UgaW4gYWxsIHRoZSBHQ0MgY29uZmlndXJhdGlvbnMKKyAgIHdlIHN1cHBvcnQ6IGxvbmcgbG9uZyBpcyBhbHdheXMgNjQgYml0cywgbG9uZyBpcyBhbHdheXMgd29yZC9hZGRyZXNzIHNpemUsCisgICBhbmQgaW50IGlzIGFsd2F5cyAzMiBiaXRzLiAgKi8KKworI2RlZmluZQlfX1MxNl9UWVBFCQlzaG9ydCBpbnQKKyNkZWZpbmUgX19VMTZfVFlQRQkJdW5zaWduZWQgc2hvcnQgaW50CisjZGVmaW5lCV9fUzMyX1RZUEUJCWludAorI2RlZmluZSBfX1UzMl9UWVBFCQl1bnNpZ25lZCBpbnQKKyNkZWZpbmUgX19TTE9OR1dPUkRfVFlQRQlsb25nIGludAorI2RlZmluZSBfX1VMT05HV09SRF9UWVBFCXVuc2lnbmVkIGxvbmcgaW50CisjaWYgX19XT1JEU0laRSA9PSAzMgorIyBkZWZpbmUgX19TUVVBRF9UWVBFCQlfX3F1YWRfdAorIyBkZWZpbmUgX19VUVVBRF9UWVBFCQlfX3VfcXVhZF90CisjIGRlZmluZSBfX1NXT1JEX1RZUEUJCWludAorIyBkZWZpbmUgX19VV09SRF9UWVBFCQl1bnNpZ25lZCBpbnQKKyMgZGVmaW5lIF9fU0xPTkczMl9UWVBFCQlsb25nIGludAorIyBkZWZpbmUgX19VTE9ORzMyX1RZUEUJCXVuc2lnbmVkIGxvbmcgaW50CisjIGRlZmluZSBfX1M2NF9UWVBFCQlfX3F1YWRfdAorIyBkZWZpbmUgX19VNjRfVFlQRQkJX191X3F1YWRfdAorLyogV2Ugd2FudCBfX2V4dGVuc2lvbl9fIGJlZm9yZSB0eXBlZGVmJ3MgdGhhdCB1c2Ugbm9uc3RhbmRhcmQgYmFzZSB0eXBlcworICAgc3VjaCBhcyBgbG9uZyBsb25nJyBpbiBDODkgbW9kZS4gICovCisjIGRlZmluZSBfX1NURF9UWVBFCQlfX2V4dGVuc2lvbl9fIHR5cGVkZWYKKyNlbGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgZGVmaW5lIF9fU1FVQURfVFlQRQkJbG9uZyBpbnQKKyMgZGVmaW5lIF9fVVFVQURfVFlQRQkJdW5zaWduZWQgbG9uZyBpbnQKKyMgZGVmaW5lIF9fU1dPUkRfVFlQRQkJbG9uZyBpbnQKKyMgZGVmaW5lIF9fVVdPUkRfVFlQRQkJdW5zaWduZWQgbG9uZyBpbnQKKyMgZGVmaW5lIF9fU0xPTkczMl9UWVBFCQlpbnQKKyMgZGVmaW5lIF9fVUxPTkczMl9UWVBFCQl1bnNpZ25lZCBpbnQKKyMgZGVmaW5lIF9fUzY0X1RZUEUJCWxvbmcgaW50CisjIGRlZmluZSBfX1U2NF9UWVBFCQl1bnNpZ25lZCBsb25nIGludAorLyogTm8gbmVlZCB0byBtYXJrIHRoZSB0eXBlZGVmIHdpdGggX19leHRlbnNpb25fXy4gICAqLworIyBkZWZpbmUgX19TVERfVFlQRQkJdHlwZWRlZgorI2Vsc2UKKyMgZXJyb3IKKyNlbmRpZgorI2luY2x1ZGUgPGJpdHMvdHlwZXNpemVzLmg+CS8qIERlZmluZXMgX18qX1RfVFlQRSBtYWNyb3MuICAqLworCisKK19fU1REX1RZUEUgX19ERVZfVF9UWVBFIF9fZGV2X3Q7CS8qIFR5cGUgb2YgZGV2aWNlIG51bWJlcnMuICAqLworX19TVERfVFlQRSBfX1VJRF9UX1RZUEUgX191aWRfdDsJLyogVHlwZSBvZiB1c2VyIGlkZW50aWZpY2F0aW9ucy4gICovCitfX1NURF9UWVBFIF9fR0lEX1RfVFlQRSBfX2dpZF90OwkvKiBUeXBlIG9mIGdyb3VwIGlkZW50aWZpY2F0aW9ucy4gICovCitfX1NURF9UWVBFIF9fSU5PX1RfVFlQRSBfX2lub190OwkvKiBUeXBlIG9mIGZpbGUgc2VyaWFsIG51bWJlcnMuICAqLworX19TVERfVFlQRSBfX0lOTzY0X1RfVFlQRSBfX2lubzY0X3Q7CS8qIFR5cGUgb2YgZmlsZSBzZXJpYWwgbnVtYmVycyAoTEZTKS4qLworX19TVERfVFlQRSBfX01PREVfVF9UWVBFIF9fbW9kZV90OwkvKiBUeXBlIG9mIGZpbGUgYXR0cmlidXRlIGJpdG1hc2tzLiAgKi8KK19fU1REX1RZUEUgX19OTElOS19UX1RZUEUgX19ubGlua190OwkvKiBUeXBlIG9mIGZpbGUgbGluayBjb3VudHMuICAqLworX19TVERfVFlQRSBfX09GRl9UX1RZUEUgX19vZmZfdDsJLyogVHlwZSBvZiBmaWxlIHNpemVzIGFuZCBvZmZzZXRzLiAgKi8KK19fU1REX1RZUEUgX19PRkY2NF9UX1RZUEUgX19vZmY2NF90OwkvKiBUeXBlIG9mIGZpbGUgc2l6ZXMgYW5kIG9mZnNldHMgKExGUykuICAqLworX19TVERfVFlQRSBfX1BJRF9UX1RZUEUgX19waWRfdDsJLyogVHlwZSBvZiBwcm9jZXNzIGlkZW50aWZpY2F0aW9ucy4gICovCitfX1NURF9UWVBFIF9fRlNJRF9UX1RZUEUgX19mc2lkX3Q7CS8qIFR5cGUgb2YgZmlsZSBzeXN0ZW0gSURzLiAgKi8KK19fU1REX1RZUEUgX19DTE9DS19UX1RZUEUgX19jbG9ja190OwkvKiBUeXBlIG9mIENQVSB1c2FnZSBjb3VudHMuICAqLworX19TVERfVFlQRSBfX1JMSU1fVF9UWVBFIF9fcmxpbV90OwkvKiBUeXBlIGZvciByZXNvdXJjZSBtZWFzdXJlbWVudC4gICovCitfX1NURF9UWVBFIF9fUkxJTTY0X1RfVFlQRSBfX3JsaW02NF90OwkvKiBUeXBlIGZvciByZXNvdXJjZSBtZWFzdXJlbWVudCAoTEZTKS4gICovCitfX1NURF9UWVBFIF9fSURfVF9UWVBFIF9faWRfdDsJCS8qIEdlbmVyYWwgdHlwZSBmb3IgSURzLiAgKi8KK19fU1REX1RZUEUgX19USU1FX1RfVFlQRSBfX3RpbWVfdDsJLyogU2Vjb25kcyBzaW5jZSB0aGUgRXBvY2guICAqLworX19TVERfVFlQRSBfX1VTRUNPTkRTX1RfVFlQRSBfX3VzZWNvbmRzX3Q7IC8qIENvdW50IG9mIG1pY3Jvc2Vjb25kcy4gICovCitfX1NURF9UWVBFIF9fU1VTRUNPTkRTX1RfVFlQRSBfX3N1c2Vjb25kc190OyAvKiBTaWduZWQgY291bnQgb2YgbWljcm9zZWNvbmRzLiAgKi8KKworX19TVERfVFlQRSBfX0RBRERSX1RfVFlQRSBfX2RhZGRyX3Q7CS8qIFRoZSB0eXBlIG9mIGEgZGlzayBhZGRyZXNzLiAgKi8KK19fU1REX1RZUEUgX19TV0JMS19UX1RZUEUgX19zd2Jsa190OwkvKiBUeXBlIG9mIGEgc3dhcCBibG9jayBtYXliZT8gICovCitfX1NURF9UWVBFIF9fS0VZX1RfVFlQRSBfX2tleV90OwkvKiBUeXBlIG9mIGFuIElQQyBrZXkuICAqLworCisvKiBDbG9jayBJRCB1c2VkIGluIGNsb2NrIGFuZCB0aW1lciBmdW5jdGlvbnMuICAqLworX19TVERfVFlQRSBfX0NMT0NLSURfVF9UWVBFIF9fY2xvY2tpZF90OworCisvKiBUaW1lciBJRCByZXR1cm5lZCBieSBgdGltZXJfY3JlYXRlJy4gICovCitfX1NURF9UWVBFIF9fVElNRVJfVF9UWVBFIF9fdGltZXJfdDsKKworLyogVHlwZSB0byByZXByZXNlbnQgYmxvY2sgc2l6ZS4gICovCitfX1NURF9UWVBFIF9fQkxLU0laRV9UX1RZUEUgX19ibGtzaXplX3Q7CisKKy8qIFR5cGVzIGZyb20gdGhlIExhcmdlIEZpbGUgU3VwcG9ydCBpbnRlcmZhY2UuICAqLworCisvKiBUeXBlIHRvIGNvdW50IG51bWJlciBvZiBkaXNrIGJsb2Nrcy4gICovCitfX1NURF9UWVBFIF9fQkxLQ05UX1RfVFlQRSBfX2Jsa2NudF90OworX19TVERfVFlQRSBfX0JMS0NOVDY0X1RfVFlQRSBfX2Jsa2NudDY0X3Q7CisKKy8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gYmxvY2tzLiAgKi8KK19fU1REX1RZUEUgX19GU0JMS0NOVF9UX1RZUEUgX19mc2Jsa2NudF90OworX19TVERfVFlQRSBfX0ZTQkxLQ05UNjRfVF9UWVBFIF9fZnNibGtjbnQ2NF90OworCisvKiBUeXBlIHRvIGNvdW50IGZpbGUgc3lzdGVtIG5vZGVzLiAgKi8KK19fU1REX1RZUEUgX19GU0ZJTENOVF9UX1RZUEUgX19mc2ZpbGNudF90OworX19TVERfVFlQRSBfX0ZTRklMQ05UNjRfVF9UWVBFIF9fZnNmaWxjbnQ2NF90OworCitfX1NURF9UWVBFIF9fU1NJWkVfVF9UWVBFIF9fc3NpemVfdDsgLyogVHlwZSBvZiBhIGJ5dGUgY291bnQsIG9yIGVycm9yLiAgKi8KKworLyogVGhlc2UgZmV3IGRvbid0IHJlYWxseSB2YXJ5IGJ5IHN5c3RlbSwgdGhleSBhbHdheXMgY29ycmVzcG9uZAorICAgdG8gb25lIG9mIHRoZSBvdGhlciBkZWZpbmVkIHR5cGVzLiAgKi8KK3R5cGVkZWYgX19vZmY2NF90IF9fbG9mZl90OwkvKiBUeXBlIG9mIGZpbGUgc2l6ZXMgYW5kIG9mZnNldHMgKExGUykuICAqLwordHlwZWRlZiBfX3F1YWRfdCAqX19xYWRkcl90OwordHlwZWRlZiBjaGFyICpfX2NhZGRyX3Q7CisKKy8qIER1cGxpY2F0ZXMgaW5mbyBmcm9tIHN0ZGludC5oIGJ1dCB0aGlzIGlzIHVzZWQgaW4gdW5pc3RkLmguICAqLworX19TVERfVFlQRSBfX1NXT1JEX1RZUEUgX19pbnRwdHJfdDsKKworLyogRHVwbGljYXRlIGluZm8gZnJvbSBzeXMvc29ja2V0LmguICAqLworX19TVERfVFlQRSBfX1UzMl9UWVBFIF9fc29ja2xlbl90OworCisKKyN1bmRlZiBfX1NURF9UWVBFCisKKyNlbmRpZiAvKiBiaXRzL3R5cGVzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3R5cGVzaXplcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdHlwZXNpemVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyMjZjNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3R5cGVzaXplcy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qIGJpdHMvdHlwZXNpemVzLmggLS0gdW5kZXJseWluZyB0eXBlcyBmb3IgKl90LiAgR2VuZXJpYyB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9CSVRTX1RZUEVTX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvdHlwZXNpemVzLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy90eXBlcy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmCV9CSVRTX1RZUEVTSVpFU19ICisjZGVmaW5lCV9CSVRTX1RZUEVTSVpFU19ICTEKKworLyogU2VlIDxiaXRzL3R5cGVzLmg+IGZvciB0aGUgbWVhbmluZyBvZiB0aGVzZSBtYWNyb3MuICBUaGlzIGZpbGUgZXhpc3RzIHNvCisgICB0aGF0IDxiaXRzL3R5cGVzLmg+IG5lZWQgbm90IHZhcnkgYWNyb3NzIGRpZmZlcmVudCBHTlUgcGxhdGZvcm1zLiAgKi8KKworI2RlZmluZSBfX0RFVl9UX1RZUEUJCV9fVVFVQURfVFlQRQorI2RlZmluZSBfX1VJRF9UX1RZUEUJCV9fVTMyX1RZUEUKKyNkZWZpbmUgX19HSURfVF9UWVBFCQlfX1UzMl9UWVBFCisjZGVmaW5lIF9fSU5PX1RfVFlQRQkJX19VTE9OR1dPUkRfVFlQRQorI2RlZmluZSBfX0lOTzY0X1RfVFlQRQkJX19VUVVBRF9UWVBFCisjZGVmaW5lIF9fTU9ERV9UX1RZUEUJCV9fVTMyX1RZUEUKKyNkZWZpbmUgX19OTElOS19UX1RZUEUJCV9fVVdPUkRfVFlQRQorI2RlZmluZSBfX09GRl9UX1RZUEUJCV9fU0xPTkdXT1JEX1RZUEUKKyNkZWZpbmUgX19PRkY2NF9UX1RZUEUJCV9fU1FVQURfVFlQRQorI2RlZmluZSBfX1BJRF9UX1RZUEUJCV9fUzMyX1RZUEUKKyNkZWZpbmUgX19STElNX1RfVFlQRQkJX19VTE9OR1dPUkRfVFlQRQorI2RlZmluZSBfX1JMSU02NF9UX1RZUEUJCV9fVVFVQURfVFlQRQorI2RlZmluZQlfX0JMS0NOVF9UX1RZUEUJCV9fU0xPTkdXT1JEX1RZUEUKKyNkZWZpbmUJX19CTEtDTlQ2NF9UX1RZUEUJX19TUVVBRF9UWVBFCisjZGVmaW5lCV9fRlNCTEtDTlRfVF9UWVBFCV9fVUxPTkdXT1JEX1RZUEUKKyNkZWZpbmUJX19GU0JMS0NOVDY0X1RfVFlQRQlfX1VRVUFEX1RZUEUKKyNkZWZpbmUJX19GU0ZJTENOVF9UX1RZUEUJX19VTE9OR1dPUkRfVFlQRQorI2RlZmluZQlfX0ZTRklMQ05UNjRfVF9UWVBFCV9fVVFVQURfVFlQRQorI2RlZmluZQlfX0lEX1RfVFlQRQkJX19VMzJfVFlQRQorI2RlZmluZSBfX0NMT0NLX1RfVFlQRQkJX19TTE9OR1dPUkRfVFlQRQorI2RlZmluZSBfX1RJTUVfVF9UWVBFCQlfX1NMT05HV09SRF9UWVBFCisjZGVmaW5lIF9fVVNFQ09ORFNfVF9UWVBFCV9fVTMyX1RZUEUKKyNkZWZpbmUgX19TVVNFQ09ORFNfVF9UWVBFCV9fU0xPTkdXT1JEX1RZUEUKKyNkZWZpbmUgX19EQUREUl9UX1RZUEUJCV9fUzMyX1RZUEUKKyNkZWZpbmUgX19TV0JMS19UX1RZUEUJCV9fU0xPTkdXT1JEX1RZUEUKKyNkZWZpbmUgX19LRVlfVF9UWVBFCQlfX1MzMl9UWVBFCisjZGVmaW5lIF9fQ0xPQ0tJRF9UX1RZUEUJX19TMzJfVFlQRQorI2RlZmluZSBfX1RJTUVSX1RfVFlQRQkJdm9pZCAqCisjZGVmaW5lIF9fQkxLU0laRV9UX1RZUEUJX19TTE9OR1dPUkRfVFlQRQorI2RlZmluZSBfX0ZTSURfVF9UWVBFCQlzdHJ1Y3QgeyBpbnQgX192YWxbMl07IH0KKyNkZWZpbmUgX19TU0laRV9UX1RZUEUJCV9fU1dPUkRfVFlQRQorCisvKiBOdW1iZXIgb2YgZGVzY3JpcHRvcnMgdGhhdCBjYW4gZml0IGluIGFuIGBmZF9zZXQnLiAgKi8KKyNkZWZpbmUJX19GRF9TRVRTSVpFCQkxMDI0CisKKworI2VuZGlmIC8qIGJpdHMvdHlwZXNpemVzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3Vpby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdWlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJkNzcxOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3Vpby5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMjAwNiwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIF9TWVNfVUlPX0ggJiYgIWRlZmluZWQgX0ZDTlRMX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvdWlvLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy91aW8uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfQklUU19VSU9fSAorI2RlZmluZSBfQklUU19VSU9fSAkxCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworCisvKiBXZSBzaG91bGQgbm9ybWFsbHkgdXNlIHRoZSBMaW51eCBrZXJuZWwgaGVhZGVyIGZpbGUgdG8gZGVmaW5lIHRoaXMKKyAgIHR5cGUgYW5kIG1hY3JvcyBidXQgdGhpcyBjYWxscyBmb3IgdHJvdWJsZSBiZWNhdXNlIG9mIHRoZSBoZWFkZXIKKyAgIGluY2x1ZGVzIG90aGVyIGtlcm5lbCBoZWFkZXJzLiAgKi8KKworLyogU2l6ZSBvZiBvYmplY3Qgd2hpY2ggY2FuIGJlIHdyaXR0ZW4gYXRvbWljYWxseS4KKworICAgVGhpcyBtYWNybyBoYXMgZGlmZmVyZW50IHZhbHVlcyBpbiBkaWZmZXJlbnQga2VybmVsIHZlcnNpb25zLiAgVGhlCisgICBsYXRlc3QgdmVyc2lvbnMgb2YgdGhlIGtlcm5lbCB1c2UgMTAyNCBhbmQgdGhpcyBpcyBnb29kIGNob2ljZS4gIFNpbmNlCisgICB0aGUgQyBsaWJyYXJ5IGltcGxlbWVudGF0aW9uIG9mIHJlYWR2L3dyaXRldiBpcyBhYmxlIHRvIGVtdWxhdGUgdGhlCisgICBmdW5jdGlvbmFsaXR5IGV2ZW4gaWYgdGhlIGN1cnJlbnRseSBydW5uaW5nIGtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0CisgICB0aGlzIGxhcmdlIHZhbHVlIHRoZSByZWFkdi93cml0ZXYgY2FsbCB3aWxsIG5vdCBmYWlsIGJlY2F1c2Ugb2YgdGhpcy4gICovCisjZGVmaW5lIFVJT19NQVhJT1YJMTAyNAorCisKKy8qIFN0cnVjdHVyZSBmb3Igc2NhdHRlci9nYXRoZXIgSS9PLiAgKi8KK3N0cnVjdCBpb3ZlYworICB7CisgICAgdm9pZCAqaW92X2Jhc2U7CS8qIFBvaW50ZXIgdG8gZGF0YS4gICovCisgICAgc2l6ZV90IGlvdl9sZW47CS8qIExlbmd0aCBvZiBkYXRhLiAgKi8KKyAgfTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9TWVNfVUlPX0ggJiYgIWRlZmluZWQgX0JJVFNfVUlPX0hfRk9SX1NZU19VSU9fSAorI2RlZmluZSBfQklUU19VSU9fSF9GT1JfU1lTX1VJT19IIDEKKworX19CRUdJTl9ERUNMUworCisvKiBSZWFkIGZyb20gYW5vdGhlciBwcm9jZXNzJyBhZGRyZXNzIHNwYWNlLiAgKi8KK2V4dGVybiBzc2l6ZV90IHByb2Nlc3Nfdm1fcmVhZHYgKHBpZF90IF9fcGlkLCBfX2NvbnN0IHN0cnVjdCBpb3ZlYyAqX19sdmVjLAorCQkJCSB1bnNpZ25lZCBsb25nIGludCBfX2xpb3ZjbnQsCisJCQkJIF9fY29uc3Qgc3RydWN0IGlvdmVjICpfX3J2ZWMsCisJCQkJIHVuc2lnbmVkIGxvbmcgaW50IF9fcmlvdmNudCwKKwkJCQkgdW5zaWduZWQgbG9uZyBpbnQgX19mbGFncykKKyAgX19USFJPVzsKKworLyogV3JpdGUgdG8gYW5vdGhlciBwcm9jZXNzJyBhZGRyZXNzIHNwYWNlLiAgKi8KK2V4dGVybiBzc2l6ZV90IHByb2Nlc3Nfdm1fd3JpdGV2IChwaWRfdCBfX3BpZCwgX19jb25zdCBzdHJ1Y3QgaW92ZWMgKl9fbHZlYywKKwkJCQkgIHVuc2lnbmVkIGxvbmcgaW50IF9fbGlvdmNudCwKKwkJCQkgIF9fY29uc3Qgc3RydWN0IGlvdmVjICpfX3J2ZWMsCisJCQkJICB1bnNpZ25lZCBsb25nIGludCBfX3Jpb3ZjbnQsCisJCQkJICB1bnNpZ25lZCBsb25nIGludCBfX2ZsYWdzKQorICBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3VuaXN0ZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdW5pc3RkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI5YjRjYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3VuaXN0ZC5oCkBAIC0wLDAgKzEsMzg2IEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHVuaXN0ZCBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1VOSVNURF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3VuaXN0ZC5oPiBkaXJlY3RseTsgdXNlIDx1bmlzdGQuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworZXh0ZXJuIHNzaXplX3QgX19yZWFkX2NoayAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsCisJCQkgICBzaXplX3QgX19idWZsZW4pIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAoX19yZWFkX2FsaWFzLCAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLAorCQkJCQkgIHNpemVfdCBfX25ieXRlcyksIHJlYWQpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAoX19yZWFkX2Noa193YXJuLAorCQkJICAgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzLAorCQkJICAgIHNpemVfdCBfX2J1ZmxlbiksIF9fcmVhZF9jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJyZWFkIGNhbGxlZCB3aXRoIGJpZ2dlciBsZW5ndGggdGhhbiBzaXplIG9mICIKKwkJICAgICAgICJ0aGUgZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgc3NpemVfdAorcmVhZCAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMpCit7CisgIGlmIChfX2JvczAgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX25ieXRlcykpCisJcmV0dXJuIF9fcmVhZF9jaGsgKF9fZmQsIF9fYnVmLCBfX25ieXRlcywgX19ib3MwIChfX2J1ZikpOworCisgICAgICBpZiAoX19uYnl0ZXMgPiBfX2JvczAgKF9fYnVmKSkKKwlyZXR1cm4gX19yZWFkX2Noa193YXJuIChfX2ZkLCBfX2J1ZiwgX19uYnl0ZXMsIF9fYm9zMCAoX19idWYpKTsKKyAgICB9CisgIHJldHVybiBfX3JlYWRfYWxpYXMgKF9fZmQsIF9fYnVmLCBfX25ieXRlcyk7Cit9CisKKyNpZmRlZiBfX1VTRV9VTklYOTgKK2V4dGVybiBzc2l6ZV90IF9fcHJlYWRfY2hrIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcywKKwkJCSAgICBfX29mZl90IF9fb2Zmc2V0LCBzaXplX3QgX19idWZzaXplKSBfX3d1cjsKK2V4dGVybiBzc2l6ZV90IF9fcHJlYWQ2NF9jaGsgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzLAorCQkJICAgICAgX19vZmY2NF90IF9fb2Zmc2V0LCBzaXplX3QgX19idWZzaXplKSBfX3d1cjsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1QgKF9fcHJlYWRfYWxpYXMsCisJCQkgICAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsCisJCQkgICAgX19vZmZfdCBfX29mZnNldCksIHByZWFkKSBfX3d1cjsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1QgKF9fcHJlYWQ2NF9hbGlhcywKKwkJCSAgIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcywKKwkJCSAgICBfX29mZjY0X3QgX19vZmZzZXQpLCBwcmVhZDY0KSBfX3d1cjsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1QgKF9fcHJlYWRfY2hrX3dhcm4sCisJCQkgICAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsCisJCQkgICAgX19vZmZfdCBfX29mZnNldCwgc2l6ZV90IF9fYnVmc2l6ZSksIF9fcHJlYWRfY2hrKQorICAgICBfX3d1ciBfX3dhcm5hdHRyICgicHJlYWQgY2FsbGVkIHdpdGggYmlnZ2VyIGxlbmd0aCB0aGFuIHNpemUgb2YgIgorCQkgICAgICAgInRoZSBkZXN0aW5hdGlvbiBidWZmZXIiKTsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1QgKF9fcHJlYWQ2NF9jaGtfd2FybiwKKwkJCSAgIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcywKKwkJCSAgICBfX29mZjY0X3QgX19vZmZzZXQsIHNpemVfdCBfX2J1ZnNpemUpLAorCQkJICAgIF9fcHJlYWQ2NF9jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJwcmVhZDY0IGNhbGxlZCB3aXRoIGJpZ2dlciBsZW5ndGggdGhhbiBzaXplIG9mICIKKwkJICAgICAgICJ0aGUgZGVzdGluYXRpb24gYnVmZmVyIik7CisKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgc3NpemVfdAorcHJlYWQgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzLCBfX29mZl90IF9fb2Zmc2V0KQoreworICBpZiAoX19ib3MwIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uYnl0ZXMpKQorCXJldHVybiBfX3ByZWFkX2NoayAoX19mZCwgX19idWYsIF9fbmJ5dGVzLCBfX29mZnNldCwgX19ib3MwIChfX2J1ZikpOworCisgICAgICBpZiAoIF9fbmJ5dGVzID4gX19ib3MwIChfX2J1ZikpCisJcmV0dXJuIF9fcHJlYWRfY2hrX3dhcm4gKF9fZmQsIF9fYnVmLCBfX25ieXRlcywgX19vZmZzZXQsCisJCQkJIF9fYm9zMCAoX19idWYpKTsKKyAgICB9CisgIHJldHVybiBfX3ByZWFkX2FsaWFzIChfX2ZkLCBfX2J1ZiwgX19uYnl0ZXMsIF9fb2Zmc2V0KTsKK30KKyMgZWxzZQorX19leHRlcm5fYWx3YXlzX2lubGluZSBfX3d1ciBzc2l6ZV90CitwcmVhZCAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsIF9fb2ZmNjRfdCBfX29mZnNldCkKK3sKKyAgaWYgKF9fYm9zMCAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbmJ5dGVzKSkKKwlyZXR1cm4gX19wcmVhZDY0X2NoayAoX19mZCwgX19idWYsIF9fbmJ5dGVzLCBfX29mZnNldCwgX19ib3MwIChfX2J1ZikpOworCisgICAgICBpZiAoIF9fbmJ5dGVzID4gX19ib3MwIChfX2J1ZikpCisJcmV0dXJuIF9fcHJlYWQ2NF9jaGtfd2FybiAoX19mZCwgX19idWYsIF9fbmJ5dGVzLCBfX29mZnNldCwKKwkJCQkgICBfX2JvczAgKF9fYnVmKSk7CisgICAgfQorCisgIHJldHVybiBfX3ByZWFkNjRfYWxpYXMgKF9fZmQsIF9fYnVmLCBfX25ieXRlcywgX19vZmZzZXQpOworfQorIyBlbmRpZgorCisjIGlmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIHNzaXplX3QKK3ByZWFkNjQgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzLCBfX29mZjY0X3QgX19vZmZzZXQpCit7CisgIGlmIChfX2JvczAgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX25ieXRlcykpCisJcmV0dXJuIF9fcHJlYWQ2NF9jaGsgKF9fZmQsIF9fYnVmLCBfX25ieXRlcywgX19vZmZzZXQsIF9fYm9zMCAoX19idWYpKTsKKworICAgICAgaWYgKCBfX25ieXRlcyA+IF9fYm9zMCAoX19idWYpKQorCXJldHVybiBfX3ByZWFkNjRfY2hrX3dhcm4gKF9fZmQsIF9fYnVmLCBfX25ieXRlcywgX19vZmZzZXQsCisJCQkJICAgX19ib3MwIChfX2J1ZikpOworICAgIH0KKworICByZXR1cm4gX19wcmVhZDY0X2FsaWFzIChfX2ZkLCBfX2J1ZiwgX19uYnl0ZXMsIF9fb2Zmc2V0KTsKK30KKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKK2V4dGVybiBzc2l6ZV90IF9fcmVhZGxpbmtfY2hrIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wYXRoLAorCQkJICAgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2xlbiwKKwkJCSAgICAgICBzaXplX3QgX19idWZsZW4pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVF9OVEggKF9fcmVhZGxpbmtfYWxpYXMsCisJCQkgICAgICAgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsCisJCQkJY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbGVuKSwgcmVhZGxpbmspCisgICAgIF9fbm9ubnVsbCAoKDEsIDIpKSBfX3d1cjsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3JlYWRsaW5rX2Noa193YXJuLAorCQkJICAgICAgIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wYXRoLAorCQkJCWNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2xlbiwKKwkJCQlzaXplX3QgX19idWZsZW4pLCBfX3JlYWRsaW5rX2NoaykKKyAgICAgX19ub25udWxsICgoMSwgMikpIF9fd3VyIF9fd2FybmF0dHIgKCJyZWFkbGluayBjYWxsZWQgd2l0aCBiaWdnZXIgbGVuZ3RoICIKKwkJCQkJICAidGhhbiBzaXplIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fbm9ubnVsbCAoKDEsIDIpKSBfX3d1ciBzc2l6ZV90CitfX05USCAocmVhZGxpbmsgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsCisJCSBzaXplX3QgX19sZW4pKQoreworICBpZiAoX19ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2xlbikpCisJcmV0dXJuIF9fcmVhZGxpbmtfY2hrIChfX3BhdGgsIF9fYnVmLCBfX2xlbiwgX19ib3MgKF9fYnVmKSk7CisKKyAgICAgIGlmICggX19sZW4gPiBfX2JvcyAoX19idWYpKQorCXJldHVybiBfX3JlYWRsaW5rX2Noa193YXJuIChfX3BhdGgsIF9fYnVmLCBfX2xlbiwgX19ib3MgKF9fYnVmKSk7CisgICAgfQorICByZXR1cm4gX19yZWFkbGlua19hbGlhcyAoX19wYXRoLCBfX2J1ZiwgX19sZW4pOworfQorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9BVEZJTEUKK2V4dGVybiBzc2l6ZV90IF9fcmVhZGxpbmthdF9jaGsgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wYXRoLAorCQkJCSBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19sZW4sCisJCQkJIHNpemVfdCBfX2J1ZmxlbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyLCAzKSkgX193dXI7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUX05USCAoX19yZWFkbGlua2F0X2FsaWFzLAorCQkJICAgICAgIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGF0aCwKKwkJCQljaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19sZW4pLAorCQkJICAgICAgIHJlYWRsaW5rYXQpCisgICAgIF9fbm9ubnVsbCAoKDIsIDMpKSBfX3d1cjsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3JlYWRsaW5rYXRfY2hrX3dhcm4sCisJCQkgICAgICAgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wYXRoLAorCQkJCWNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2xlbiwKKwkJCQlzaXplX3QgX19idWZsZW4pLCBfX3JlYWRsaW5rYXRfY2hrKQorICAgICBfX25vbm51bGwgKCgyLCAzKSkgX193dXIgX193YXJuYXR0ciAoInJlYWRsaW5rYXQgY2FsbGVkIHdpdGggYmlnZ2VyICIKKwkJCQkJICAibGVuZ3RoIHRoYW4gc2l6ZSBvZiBkZXN0aW5hdGlvbiAiCisJCQkJCSAgImJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fbm9ubnVsbCAoKDIsIDMpKSBfX3d1ciBzc2l6ZV90CitfX05USCAocmVhZGxpbmthdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsCisJCSAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2xlbikpCit7CisgIGlmIChfX2JvcyAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbGVuKSkKKwlyZXR1cm4gX19yZWFkbGlua2F0X2NoayAoX19mZCwgX19wYXRoLCBfX2J1ZiwgX19sZW4sIF9fYm9zIChfX2J1ZikpOworCisgICAgICBpZiAoX19sZW4gPiBfX2JvcyAoX19idWYpKQorCXJldHVybiBfX3JlYWRsaW5rYXRfY2hrX3dhcm4gKF9fZmQsIF9fcGF0aCwgX19idWYsIF9fbGVuLAorCQkJCSAgICAgIF9fYm9zIChfX2J1ZikpOworICAgIH0KKyAgcmV0dXJuIF9fcmVhZGxpbmthdF9hbGlhcyAoX19mZCwgX19wYXRoLCBfX2J1ZiwgX19sZW4pOworfQorI2VuZGlmCisKK2V4dGVybiBjaGFyICpfX2dldGN3ZF9jaGsgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19zaXplLCBzaXplX3QgX19idWZsZW4pCisgICAgIF9fVEhST1cgX193dXI7CitleHRlcm4gY2hhciAqX19SRURJUkVDVF9OVEggKF9fZ2V0Y3dkX2FsaWFzLAorCQkJICAgICAoY2hhciAqX19idWYsIHNpemVfdCBfX3NpemUpLCBnZXRjd2QpIF9fd3VyOworZXh0ZXJuIGNoYXIgKl9fUkVESVJFQ1RfTlRIIChfX2dldGN3ZF9jaGtfd2FybiwKKwkJCSAgICAgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19zaXplLCBzaXplX3QgX19idWZsZW4pLAorCQkJICAgICBfX2dldGN3ZF9jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJnZXRjd2QgY2FsbGVyIHdpdGggYmlnZ2VyIGxlbmd0aCB0aGFuIHNpemUgb2YgIgorCQkgICAgICAgImRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIGNoYXIgKgorX19OVEggKGdldGN3ZCAoY2hhciAqX19idWYsIHNpemVfdCBfX3NpemUpKQoreworICBpZiAoX19ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX3NpemUpKQorCXJldHVybiBfX2dldGN3ZF9jaGsgKF9fYnVmLCBfX3NpemUsIF9fYm9zIChfX2J1ZikpOworCisgICAgICBpZiAoX19zaXplID4gX19ib3MgKF9fYnVmKSkKKwlyZXR1cm4gX19nZXRjd2RfY2hrX3dhcm4gKF9fYnVmLCBfX3NpemUsIF9fYm9zIChfX2J1ZikpOworICAgIH0KKyAgcmV0dXJuIF9fZ2V0Y3dkX2FsaWFzIChfX2J1ZiwgX19zaXplKTsKK30KKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKK2V4dGVybiBjaGFyICpfX2dldHdkX2NoayAoY2hhciAqX19idWYsIHNpemVfdCBidWZsZW4pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworZXh0ZXJuIGNoYXIgKl9fUkVESVJFQ1RfTlRIIChfX2dldHdkX3dhcm4sIChjaGFyICpfX2J1ZiksIGdldHdkKQorICAgICBfX25vbm51bGwgKCgxKSkgX193dXIgX193YXJuYXR0ciAoInBsZWFzZSB1c2UgZ2V0Y3dkIGluc3RlYWQsIGFzIGdldHdkICIKKwkJCQkgICAgICAgImRvZXNuJ3Qgc3BlY2lmeSBidWZmZXIgc2l6ZSIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fbm9ubnVsbCAoKDEpKSBfX2F0dHJpYnV0ZV9kZXByZWNhdGVkX18gX193dXIgY2hhciAqCitfX05USCAoZ2V0d2QgKGNoYXIgKl9fYnVmKSkKK3sKKyAgaWYgKF9fYm9zIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgcmV0dXJuIF9fZ2V0d2RfY2hrIChfX2J1ZiwgX19ib3MgKF9fYnVmKSk7CisgIHJldHVybiBfX2dldHdkX3dhcm4gKF9fYnVmKTsKK30KKyNlbmRpZgorCitleHRlcm4gc2l6ZV90IF9fY29uZnN0cl9jaGsgKGludCBfX25hbWUsIGNoYXIgKl9fYnVmLCBzaXplX3QgX19sZW4sCisJCQkgICAgIHNpemVfdCBfX2J1ZmxlbikgX19USFJPVzsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fY29uZnN0cl9hbGlhcywgKGludCBfX25hbWUsIGNoYXIgKl9fYnVmLAorCQkJCQkJc2l6ZV90IF9fbGVuKSwgY29uZnN0cik7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX2NvbmZzdHJfY2hrX3dhcm4sCisJCQkgICAgICAoaW50IF9fbmFtZSwgY2hhciAqX19idWYsIHNpemVfdCBfX2xlbiwKKwkJCSAgICAgICBzaXplX3QgX19idWZsZW4pLCBfX2NvbmZzdHJfY2hrKQorICAgICBfX3dhcm5hdHRyICgiY29uZnN0ciBjYWxsZWQgd2l0aCBiaWdnZXIgbGVuZ3RoIHRoYW4gc2l6ZSBvZiBkZXN0aW5hdGlvbiAiCisJCSAiYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgc2l6ZV90CitfX05USCAoY29uZnN0ciAoaW50IF9fbmFtZSwgY2hhciAqX19idWYsIHNpemVfdCBfX2xlbikpCit7CisgIGlmIChfX2JvcyAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbGVuKSkKKwlyZXR1cm4gX19jb25mc3RyX2NoayAoX19uYW1lLCBfX2J1ZiwgX19sZW4sIF9fYm9zIChfX2J1ZikpOworCisgICAgICBpZiAoX19ib3MgKF9fYnVmKSA8IF9fbGVuKQorCXJldHVybiBfX2NvbmZzdHJfY2hrX3dhcm4gKF9fbmFtZSwgX19idWYsIF9fbGVuLCBfX2JvcyAoX19idWYpKTsKKyAgICB9CisgIHJldHVybiBfX2NvbmZzdHJfYWxpYXMgKF9fbmFtZSwgX19idWYsIF9fbGVuKTsKK30KKworCitleHRlcm4gaW50IF9fZ2V0Z3JvdXBzX2NoayAoaW50IF9fc2l6ZSwgX19naWRfdCBfX2xpc3RbXSwgc2l6ZV90IF9fbGlzdGxlbikKKyAgICAgX19USFJPVyBfX3d1cjsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fZ2V0Z3JvdXBzX2FsaWFzLCAoaW50IF9fc2l6ZSwgX19naWRfdCBfX2xpc3RbXSksCisJCQkgICBnZXRncm91cHMpIF9fd3VyOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX19nZXRncm91cHNfY2hrX3dhcm4sCisJCQkgICAoaW50IF9fc2l6ZSwgX19naWRfdCBfX2xpc3RbXSwgc2l6ZV90IF9fbGlzdGxlbiksCisJCQkgICBfX2dldGdyb3Vwc19jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJnZXRncm91cHMgY2FsbGVkIHdpdGggYmlnZ2VyIGdyb3VwIGNvdW50IHRoYW4gd2hhdCAiCisJCSAgICAgICAiY2FuIGZpdCBpbnRvIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKGdldGdyb3VwcyAoaW50IF9fc2l6ZSwgX19naWRfdCBfX2xpc3RbXSkpCit7CisgIGlmIChfX2JvcyAoX19saXN0KSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX3NpemUpIHx8IF9fc2l6ZSA8IDApCisJcmV0dXJuIF9fZ2V0Z3JvdXBzX2NoayAoX19zaXplLCBfX2xpc3QsIF9fYm9zIChfX2xpc3QpKTsKKworICAgICAgaWYgKF9fc2l6ZSAqIHNpemVvZiAoX19naWRfdCkgPiBfX2JvcyAoX19saXN0KSkKKwlyZXR1cm4gX19nZXRncm91cHNfY2hrX3dhcm4gKF9fc2l6ZSwgX19saXN0LCBfX2JvcyAoX19saXN0KSk7CisgICAgfQorICByZXR1cm4gX19nZXRncm91cHNfYWxpYXMgKF9fc2l6ZSwgX19saXN0KTsKK30KKworCitleHRlcm4gaW50IF9fdHR5bmFtZV9yX2NoayAoaW50IF9fZmQsIGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4sCisJCQkgICAgc2l6ZV90IF9fbnJlYWwpIF9fVEhST1cgX19ub25udWxsICgoMikpOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX190dHluYW1lX3JfYWxpYXMsIChpbnQgX19mZCwgY2hhciAqX19idWYsCisJCQkJCSAgICAgICBzaXplX3QgX19idWZsZW4pLCB0dHluYW1lX3IpCisgICAgIF9fbm9ubnVsbCAoKDIpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fdHR5bmFtZV9yX2Noa193YXJuLAorCQkJICAgKGludCBfX2ZkLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLAorCQkJICAgIHNpemVfdCBfX25yZWFsKSwgX190dHluYW1lX3JfY2hrKQorICAgICBfX25vbm51bGwgKCgyKSkgX193YXJuYXR0ciAoInR0eW5hbWVfciBjYWxsZWQgd2l0aCBiaWdnZXIgYnVmbGVuIHRoYW4gIgorCQkJCSAic2l6ZSBvZiBkZXN0aW5hdGlvbiBidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIICh0dHluYW1lX3IgKGludCBfX2ZkLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKSkKK3sKKyAgaWYgKF9fYm9zIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19idWZsZW4pKQorCXJldHVybiBfX3R0eW5hbWVfcl9jaGsgKF9fZmQsIF9fYnVmLCBfX2J1ZmxlbiwgX19ib3MgKF9fYnVmKSk7CisKKyAgICAgIGlmIChfX2J1ZmxlbiA+IF9fYm9zIChfX2J1ZikpCisJcmV0dXJuIF9fdHR5bmFtZV9yX2Noa193YXJuIChfX2ZkLCBfX2J1ZiwgX19idWZsZW4sIF9fYm9zIChfX2J1ZikpOworICAgIH0KKyAgcmV0dXJuIF9fdHR5bmFtZV9yX2FsaWFzIChfX2ZkLCBfX2J1ZiwgX19idWZsZW4pOworfQorCisKKyNpZiBkZWZpbmVkIF9fVVNFX1JFRU5UUkFOVCB8fCBkZWZpbmVkIF9fVVNFX1BPU0lYMTk5NTA2CitleHRlcm4gaW50IF9fZ2V0bG9naW5fcl9jaGsgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4sIHNpemVfdCBfX25yZWFsKQorICAgICBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKF9fZ2V0bG9naW5fcl9hbGlhcywgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4pLAorCQkgICAgICAgZ2V0bG9naW5fcikgX19ub25udWxsICgoMSkpOworZXh0ZXJuIGludCBfX1JFRElSRUNUIChfX2dldGxvZ2luX3JfY2hrX3dhcm4sCisJCSAgICAgICAoY2hhciAqX19idWYsIHNpemVfdCBfX2J1Zmxlbiwgc2l6ZV90IF9fbnJlYWwpLAorCQkgICAgICAgX19nZXRsb2dpbl9yX2NoaykKKyAgICAgX19ub25udWxsICgoMSkpIF9fd2FybmF0dHIgKCJnZXRsb2dpbl9yIGNhbGxlZCB3aXRoIGJpZ2dlciBidWZsZW4gdGhhbiAiCisJCQkJICJzaXplIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorZ2V0bG9naW5fciAoY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbikKK3sKKyAgaWYgKF9fYm9zIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19idWZsZW4pKQorCXJldHVybiBfX2dldGxvZ2luX3JfY2hrIChfX2J1ZiwgX19idWZsZW4sIF9fYm9zIChfX2J1ZikpOworCisgICAgICBpZiAoX19idWZsZW4gPiBfX2JvcyAoX19idWYpKQorCXJldHVybiBfX2dldGxvZ2luX3JfY2hrX3dhcm4gKF9fYnVmLCBfX2J1ZmxlbiwgX19ib3MgKF9fYnVmKSk7CisgICAgfQorICByZXR1cm4gX19nZXRsb2dpbl9yX2FsaWFzIChfX2J1ZiwgX19idWZsZW4pOworfQorI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfVU5JWDk4CitleHRlcm4gaW50IF9fZ2V0aG9zdG5hbWVfY2hrIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLCBzaXplX3QgX19ucmVhbCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX2dldGhvc3RuYW1lX2FsaWFzLCAoY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbiksCisJCQkgICBnZXRob3N0bmFtZSkgX19ub25udWxsICgoMSkpOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX19nZXRob3N0bmFtZV9jaGtfd2FybiwKKwkJCSAgIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLCBzaXplX3QgX19ucmVhbCksCisJCQkgICBfX2dldGhvc3RuYW1lX2NoaykKKyAgICAgX19ub25udWxsICgoMSkpIF9fd2FybmF0dHIgKCJnZXRob3N0bmFtZSBjYWxsZWQgd2l0aCBiaWdnZXIgYnVmbGVuIHRoYW4gIgorCQkJCSAic2l6ZSBvZiBkZXN0aW5hdGlvbiBidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIIChnZXRob3N0bmFtZSAoY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbikpCit7CisgIGlmIChfX2JvcyAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fYnVmbGVuKSkKKwlyZXR1cm4gX19nZXRob3N0bmFtZV9jaGsgKF9fYnVmLCBfX2J1ZmxlbiwgX19ib3MgKF9fYnVmKSk7CisKKyAgICAgIGlmIChfX2J1ZmxlbiA+IF9fYm9zIChfX2J1ZikpCisJcmV0dXJuIF9fZ2V0aG9zdG5hbWVfY2hrX3dhcm4gKF9fYnVmLCBfX2J1ZmxlbiwgX19ib3MgKF9fYnVmKSk7CisgICAgfQorICByZXR1cm4gX19nZXRob3N0bmFtZV9hbGlhcyAoX19idWYsIF9fYnVmbGVuKTsKK30KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCAoZGVmaW5lZCBfX1VTRV9YT1BFTiAmJiAhZGVmaW5lZCBfX1VTRV9VTklYOTgpCitleHRlcm4gaW50IF9fZ2V0ZG9tYWlubmFtZV9jaGsgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4sIHNpemVfdCBfX25yZWFsKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fZ2V0ZG9tYWlubmFtZV9hbGlhcywgKGNoYXIgKl9fYnVmLAorCQkJCQkJICAgc2l6ZV90IF9fYnVmbGVuKSwKKwkJCSAgIGdldGRvbWFpbm5hbWUpIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fZ2V0ZG9tYWlubmFtZV9jaGtfd2FybiwKKwkJCSAgIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLCBzaXplX3QgX19ucmVhbCksCisJCQkgICBfX2dldGRvbWFpbm5hbWVfY2hrKQorICAgICBfX25vbm51bGwgKCgxKSkgX193dXIgX193YXJuYXR0ciAoImdldGRvbWFpbm5hbWUgY2FsbGVkIHdpdGggYmlnZ2VyICIKKwkJCQkgICAgICAgImJ1ZmxlbiB0aGFuIHNpemUgb2YgZGVzdGluYXRpb24gIgorCQkJCSAgICAgICAiYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAoZ2V0ZG9tYWlubmFtZSAoY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbikpCit7CisgIGlmIChfX2JvcyAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fYnVmbGVuKSkKKwlyZXR1cm4gX19nZXRkb21haW5uYW1lX2NoayAoX19idWYsIF9fYnVmbGVuLCBfX2JvcyAoX19idWYpKTsKKworICAgICAgaWYgKF9fYnVmbGVuID4gX19ib3MgKF9fYnVmKSkKKwlyZXR1cm4gX19nZXRkb21haW5uYW1lX2Noa193YXJuIChfX2J1ZiwgX19idWZsZW4sIF9fYm9zIChfX2J1ZikpOworICAgIH0KKyAgcmV0dXJuIF9fZ2V0ZG9tYWlubmFtZV9hbGlhcyAoX19idWYsIF9fYnVmbGVuKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdXN0YXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3VzdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjljNmI3MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3VzdGF0LmgKQEAgLTAsMCArMSwzMSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfVVNUQVRfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy91c3RhdC5oPiBkaXJlY3RseTsgdXNlIDxzeXMvdXN0YXQuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitzdHJ1Y3QgdXN0YXQKKyAgeworICAgIF9fZGFkZHJfdCBmX3RmcmVlOwkJLyogTnVtYmVyIG9mIGZyZWUgYmxvY2tzLiAgKi8KKyAgICBfX2lub190IGZfdGlub2RlOwkJLyogTnVtYmVyIG9mIGZyZWUgaW5vZGVzLiAgKi8KKyAgICBjaGFyIGZfZm5hbWVbNl07CisgICAgY2hhciBmX2ZwYWNrWzZdOworICB9OwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdXRtcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdXRtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NTVhZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy91dG1wLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qIFRoZSBgc3RydWN0IHV0bXAnIHR5cGUsIGRlc2NyaWJpbmcgZW50cmllcyBpbiB0aGUgdXRtcCBmaWxlLiAgR05VIHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDIKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9VVE1QX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvdXRtcC5oPiBkaXJlY3RseTsgdXNlIDx1dG1wLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxwYXRocy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisKKyNkZWZpbmUgVVRfTElORVNJWkUJMzIKKyNkZWZpbmUgVVRfTkFNRVNJWkUJMzIKKyNkZWZpbmUgVVRfSE9TVFNJWkUJMjU2CisKKworLyogVGhlIHN0cnVjdHVyZSBkZXNjcmliaW5nIGFuIGVudHJ5IGluIHRoZSBkYXRhYmFzZSBvZgorICAgcHJldmlvdXMgbG9naW5zLiAgKi8KK3N0cnVjdCBsYXN0bG9nCisgIHsKKyNpZiBfX1dPUkRTSVpFID09IDY0ICYmIGRlZmluZWQgX19XT1JEU0laRV9DT01QQVQzMgorICAgIGludDMyX3QgbGxfdGltZTsKKyNlbHNlCisgICAgX190aW1lX3QgbGxfdGltZTsKKyNlbmRpZgorICAgIGNoYXIgbGxfbGluZVtVVF9MSU5FU0laRV07CisgICAgY2hhciBsbF9ob3N0W1VUX0hPU1RTSVpFXTsKKyAgfTsKKworCisvKiBUaGUgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIHN0YXR1cyBvZiBhIHRlcm1pbmF0ZWQgcHJvY2Vzcy4gIFRoaXMKKyAgIHR5cGUgaXMgdXNlZCBpbiBgc3RydWN0IHV0bXAnIGJlbG93LiAgKi8KK3N0cnVjdCBleGl0X3N0YXR1cworICB7CisgICAgc2hvcnQgaW50IGVfdGVybWluYXRpb247CS8qIFByb2Nlc3MgdGVybWluYXRpb24gc3RhdHVzLiAgKi8KKyAgICBzaG9ydCBpbnQgZV9leGl0OwkJLyogUHJvY2VzcyBleGl0IHN0YXR1cy4gICovCisgIH07CisKKworLyogVGhlIHN0cnVjdHVyZSBkZXNjcmliaW5nIGFuIGVudHJ5IGluIHRoZSB1c2VyIGFjY291bnRpbmcgZGF0YWJhc2UuICAqLworc3RydWN0IHV0bXAKK3sKKyAgc2hvcnQgaW50IHV0X3R5cGU7CQkvKiBUeXBlIG9mIGxvZ2luLiAgKi8KKyAgcGlkX3QgdXRfcGlkOwkJCS8qIFByb2Nlc3MgSUQgb2YgbG9naW4gcHJvY2Vzcy4gICovCisgIGNoYXIgdXRfbGluZVtVVF9MSU5FU0laRV07CS8qIERldmljZW5hbWUuICAqLworICBjaGFyIHV0X2lkWzRdOwkJLyogSW5pdHRhYiBJRC4gICovCisgIGNoYXIgdXRfdXNlcltVVF9OQU1FU0laRV07CS8qIFVzZXJuYW1lLiAgKi8KKyAgY2hhciB1dF9ob3N0W1VUX0hPU1RTSVpFXTsJLyogSG9zdG5hbWUgZm9yIHJlbW90ZSBsb2dpbi4gICovCisgIHN0cnVjdCBleGl0X3N0YXR1cyB1dF9leGl0OwkvKiBFeGl0IHN0YXR1cyBvZiBhIHByb2Nlc3MgbWFya2VkCisJCQkJICAgYXMgREVBRF9QUk9DRVNTLiAgKi8KKy8qIFRoZSB1dF9zZXNzaW9uIGFuZCB1dF90diBmaWVsZHMgbXVzdCBiZSB0aGUgc2FtZSBzaXplIHdoZW4gY29tcGlsZWQKKyAgIDMyLSBhbmQgNjQtYml0LiAgVGhpcyBhbGxvd3MgZGF0YSBmaWxlcyBhbmQgc2hhcmVkIG1lbW9yeSB0byBiZQorICAgc2hhcmVkIGJldHdlZW4gMzItIGFuZCA2NC1iaXQgYXBwbGljYXRpb25zLiAgKi8KKyNpZiBfX1dPUkRTSVpFID09IDY0ICYmIGRlZmluZWQgX19XT1JEU0laRV9DT01QQVQzMgorICBpbnQzMl90IHV0X3Nlc3Npb247CQkvKiBTZXNzaW9uIElELCB1c2VkIGZvciB3aW5kb3dpbmcuICAqLworICBzdHJ1Y3QKKyAgeworICAgIGludDMyX3QgdHZfc2VjOwkJLyogU2Vjb25kcy4gICovCisgICAgaW50MzJfdCB0dl91c2VjOwkJLyogTWljcm9zZWNvbmRzLiAgKi8KKyAgfSB1dF90djsJCQkvKiBUaW1lIGVudHJ5IHdhcyBtYWRlLiAgKi8KKyNlbHNlCisgIGxvbmcgaW50IHV0X3Nlc3Npb247CQkvKiBTZXNzaW9uIElELCB1c2VkIGZvciB3aW5kb3dpbmcuICAqLworICBzdHJ1Y3QgdGltZXZhbCB1dF90djsJCS8qIFRpbWUgZW50cnkgd2FzIG1hZGUuICAqLworI2VuZGlmCisKKyAgaW50MzJfdCB1dF9hZGRyX3Y2WzRdOwkvKiBJbnRlcm5ldCBhZGRyZXNzIG9mIHJlbW90ZSBob3N0LiAgKi8KKyAgY2hhciBfX3VudXNlZFsyMF07CQkvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gICovCit9OworCisvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBoYWNrcy4gICovCisjZGVmaW5lIHV0X25hbWUJCXV0X3VzZXIKKyNpZm5kZWYgX05PX1VUX1RJTUUKKy8qIFdlIGhhdmUgYSBwcm9ibGVtIGhlcmU6IGB1dF90aW1lJyBpcyBhbHNvIHVzZWQgb3RoZXJ3aXNlLiAgRGVmaW5lCisgICBfTk9fVVRfVElNRSBpZiB0aGUgY29tcGlsZXIgY29tcGxhaW5zLiAgKi8KKyMgZGVmaW5lIHV0X3RpbWUJdXRfdHYudHZfc2VjCisjZW5kaWYKKyNkZWZpbmUgdXRfeHRpbWUJdXRfdHYudHZfc2VjCisjZGVmaW5lIHV0X2FkZHIJCXV0X2FkZHJfdjZbMF0KKworCisvKiBWYWx1ZXMgZm9yIHRoZSBgdXRfdHlwZScgZmllbGQgb2YgYSBgc3RydWN0IHV0bXAnLiAgKi8KKyNkZWZpbmUgRU1QVFkJCTAJLyogTm8gdmFsaWQgdXNlciBhY2NvdW50aW5nIGluZm9ybWF0aW9uLiAgKi8KKworI2RlZmluZSBSVU5fTFZMCQkxCS8qIFRoZSBzeXN0ZW0ncyBydW5sZXZlbC4gICovCisjZGVmaW5lIEJPT1RfVElNRQkyCS8qIFRpbWUgb2Ygc3lzdGVtIGJvb3QuICAqLworI2RlZmluZSBORVdfVElNRQkzCS8qIFRpbWUgYWZ0ZXIgc3lzdGVtIGNsb2NrIGNoYW5nZWQuICAqLworI2RlZmluZSBPTERfVElNRQk0CS8qIFRpbWUgd2hlbiBzeXN0ZW0gY2xvY2sgY2hhbmdlZC4gICovCisKKyNkZWZpbmUgSU5JVF9QUk9DRVNTCTUJLyogUHJvY2VzcyBzcGF3bmVkIGJ5IHRoZSBpbml0IHByb2Nlc3MuICAqLworI2RlZmluZSBMT0dJTl9QUk9DRVNTCTYJLyogU2Vzc2lvbiBsZWFkZXIgb2YgYSBsb2dnZWQgaW4gdXNlci4gICovCisjZGVmaW5lIFVTRVJfUFJPQ0VTUwk3CS8qIE5vcm1hbCBwcm9jZXNzLiAgKi8KKyNkZWZpbmUgREVBRF9QUk9DRVNTCTgJLyogVGVybWluYXRlZCBwcm9jZXNzLiAgKi8KKworI2RlZmluZSBBQ0NPVU5USU5HCTkKKworLyogT2xkIExpbnV4IG5hbWUgZm9yIHRoZSBFTVBUWSB0eXBlLiAgKi8KKyNkZWZpbmUgVVRfVU5LTk9XTglFTVBUWQorCisKKy8qIFRlbGwgdGhlIHVzZXIgdGhhdCB3ZSBoYXZlIGEgbW9kZXJuIHN5c3RlbSB3aXRoIFVUX0hPU1QsIFVUX1BJRCwKKyAgIFVUX1RZUEUsIFVUX0lEIGFuZCBVVF9UViBmaWVsZHMuICAqLworI2RlZmluZSBfSEFWRV9VVF9UWVBFCTEKKyNkZWZpbmUgX0hBVkVfVVRfUElECTEKKyNkZWZpbmUgX0hBVkVfVVRfSUQJMQorI2RlZmluZSBfSEFWRV9VVF9UVgkxCisjZGVmaW5lIF9IQVZFX1VUX0hPU1QJMQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvdXRtcHguaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3V0bXB4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0Y2RhNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3V0bXB4LmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qIFN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zIGZvciB0aGUgdXNlciBhY2NvdW50aW5nIGRhdGFiYXNlLiAgR05VIHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDIwMDAsIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1VUTVBYX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvdXRtcHguaD4gZGlyZWN0bHk7IHVzZSA8dXRtcHguaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworCisjaWZkZWYgX19VU0VfR05VCisjIGluY2x1ZGUgPHBhdGhzLmg+CisjIGRlZmluZSBfUEFUSF9VVE1QWAlfUEFUSF9VVE1QCisjIGRlZmluZSBfUEFUSF9XVE1QWAlfUEFUSF9XVE1QCisjZW5kaWYKKworCisjZGVmaW5lIF9fVVRfTElORVNJWkUJMzIKKyNkZWZpbmUgX19VVF9OQU1FU0laRQkzMgorI2RlZmluZSBfX1VUX0hPU1RTSVpFCTI1NgorCisKKy8qIFRoZSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgc3RhdHVzIG9mIGEgdGVybWluYXRlZCBwcm9jZXNzLiAgVGhpcworICAgdHlwZSBpcyB1c2VkIGluIGBzdHJ1Y3QgdXRtcHgnIGJlbG93LiAgKi8KK3N0cnVjdCBfX2V4aXRfc3RhdHVzCisgIHsKKyNpZmRlZiBfX1VTRV9HTlUKKyAgICBzaG9ydCBpbnQgZV90ZXJtaW5hdGlvbjsJLyogUHJvY2VzcyB0ZXJtaW5hdGlvbiBzdGF0dXMuICAqLworICAgIHNob3J0IGludCBlX2V4aXQ7CQkvKiBQcm9jZXNzIGV4aXQgc3RhdHVzLiAgKi8KKyNlbHNlCisgICAgc2hvcnQgaW50IF9fZV90ZXJtaW5hdGlvbjsJLyogUHJvY2VzcyB0ZXJtaW5hdGlvbiBzdGF0dXMuICAqLworICAgIHNob3J0IGludCBfX2VfZXhpdDsJCS8qIFByb2Nlc3MgZXhpdCBzdGF0dXMuICAqLworI2VuZGlmCisgIH07CisKKworLyogVGhlIHN0cnVjdHVyZSBkZXNjcmliaW5nIGFuIGVudHJ5IGluIHRoZSB1c2VyIGFjY291bnRpbmcgZGF0YWJhc2UuICAqLworc3RydWN0IHV0bXB4Cit7CisgIHNob3J0IGludCB1dF90eXBlOwkJLyogVHlwZSBvZiBsb2dpbi4gICovCisgIF9fcGlkX3QgdXRfcGlkOwkJLyogUHJvY2VzcyBJRCBvZiBsb2dpbiBwcm9jZXNzLiAgKi8KKyAgY2hhciB1dF9saW5lW19fVVRfTElORVNJWkVdOwkvKiBEZXZpY2VuYW1lLiAgKi8KKyAgY2hhciB1dF9pZFs0XTsJCS8qIEluaXR0YWIgSUQuICovCisgIGNoYXIgdXRfdXNlcltfX1VUX05BTUVTSVpFXTsJLyogVXNlcm5hbWUuICAqLworICBjaGFyIHV0X2hvc3RbX19VVF9IT1NUU0laRV07CS8qIEhvc3RuYW1lIGZvciByZW1vdGUgbG9naW4uICAqLworICBzdHJ1Y3QgX19leGl0X3N0YXR1cyB1dF9leGl0OwkvKiBFeGl0IHN0YXR1cyBvZiBhIHByb2Nlc3MgbWFya2VkCisJCQkJICAgYXMgREVBRF9QUk9DRVNTLiAgKi8KKworLyogVGhlIGZpZWxkcyB1dF9zZXNzaW9uIGFuZCB1dF90diBtdXN0IGJlIHRoZSBzYW1lIHNpemUgd2hlbiBjb21waWxlZAorICAgMzItIGFuZCA2NC1iaXQuICBUaGlzIGFsbG93cyBmaWxlcyBhbmQgc2hhcmVkIG1lbW9yeSB0byBiZSBzaGFyZWQKKyAgIGJldHdlZW4gMzItIGFuZCA2NC1iaXQgYXBwbGljYXRpb25zLiAgKi8KKyNpZiBfX1dPUkRTSVpFID09IDY0ICYmIGRlZmluZWQgX19XT1JEU0laRV9DT01QQVQzMgorICBfX2ludDMyX3QgdXRfc2Vzc2lvbjsJCS8qIFNlc3Npb24gSUQsIHVzZWQgZm9yIHdpbmRvd2luZy4gICovCisgIHN0cnVjdAorICB7CisgICAgX19pbnQzMl90IHR2X3NlYzsJCS8qIFNlY29uZHMuICAqLworICAgIF9faW50MzJfdCB0dl91c2VjOwkJLyogTWljcm9zZWNvbmRzLiAgKi8KKyAgfSB1dF90djsJCQkvKiBUaW1lIGVudHJ5IHdhcyBtYWRlLiAgKi8KKyNlbHNlCisgIGxvbmcgaW50IHV0X3Nlc3Npb247CQkvKiBTZXNzaW9uIElELCB1c2VkIGZvciB3aW5kb3dpbmcuICAqLworICBzdHJ1Y3QgdGltZXZhbCB1dF90djsJCS8qIFRpbWUgZW50cnkgd2FzIG1hZGUuICAqLworI2VuZGlmCisgIF9faW50MzJfdCB1dF9hZGRyX3Y2WzRdOwkvKiBJbnRlcm5ldCBhZGRyZXNzIG9mIHJlbW90ZSBob3N0LiAgKi8KKyAgY2hhciBfX3VudXNlZFsyMF07CQkvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gICovCit9OworCisKKy8qIFZhbHVlcyBmb3IgdGhlIGB1dF90eXBlJyBmaWVsZCBvZiBhIGBzdHJ1Y3QgdXRtcHgnLiAgKi8KKyNkZWZpbmUgRU1QVFkJCTAJLyogTm8gdmFsaWQgdXNlciBhY2NvdW50aW5nIGluZm9ybWF0aW9uLiAgKi8KKworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgUlVOX0xWTAkxCS8qIFRoZSBzeXN0ZW0ncyBydW5sZXZlbC4gICovCisjZW5kaWYKKyNkZWZpbmUgQk9PVF9USU1FCTIJLyogVGltZSBvZiBzeXN0ZW0gYm9vdC4gICovCisjZGVmaW5lIE5FV19USU1FCTMJLyogVGltZSBhZnRlciBzeXN0ZW0gY2xvY2sgY2hhbmdlZC4gICovCisjZGVmaW5lIE9MRF9USU1FCTQJLyogVGltZSB3aGVuIHN5c3RlbSBjbG9jayBjaGFuZ2VkLiAgKi8KKworI2RlZmluZSBJTklUX1BST0NFU1MJNQkvKiBQcm9jZXNzIHNwYXduZWQgYnkgdGhlIGluaXQgcHJvY2Vzcy4gICovCisjZGVmaW5lIExPR0lOX1BST0NFU1MJNgkvKiBTZXNzaW9uIGxlYWRlciBvZiBhIGxvZ2dlZCBpbiB1c2VyLiAgKi8KKyNkZWZpbmUgVVNFUl9QUk9DRVNTCTcJLyogTm9ybWFsIHByb2Nlc3MuICAqLworI2RlZmluZSBERUFEX1BST0NFU1MJOAkvKiBUZXJtaW5hdGVkIHByb2Nlc3MuICAqLworCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBBQ0NPVU5USU5HCTkJLyogU3lzdGVtIGFjY291bnRpbmcuICAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy91dHNuYW1lLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy91dHNuYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVlNzFlMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3V0c25hbWUuaApAQCAtMCwwICsxLDI5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19VVFNOQU1FX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvdXRzbmFtZS5oPiBkaXJlY3RseTsgdXNlIDxzeXMvdXRzbmFtZS5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBMZW5ndGggb2YgdGhlIGVudHJpZXMgaW4gYHN0cnVjdCB1dHNuYW1lJyBpcyA2NS4gICovCisjZGVmaW5lIF9VVFNOQU1FX0xFTkdUSCA2NQorCisvKiBMaW51eCBwcm92aWRlcyBhcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZSBgc3RydWN0IHV0c25hbWUnCisgICB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBkb21haW4uICBEZWZpbmUgX1VUU05BTUVfRE9NQUlOX0xFTkdUSAorICAgdG8gYSB2YWx1ZSAhPSAwIHRvIGFjdGl2YXRlIHRoaXMgZW50cnkuICAqLworI2RlZmluZSBfVVRTTkFNRV9ET01BSU5fTEVOR1RIIF9VVFNOQU1FX0xFTkdUSApkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvd2FpdGZsYWdzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy93YWl0ZmxhZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjRjZWRiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvd2FpdGZsYWdzLmgKQEAgLTAsMCArMSwzOCBAQAorLyogRGVmaW5pdGlvbnMgb2YgZmxhZyBiaXRzIGZvciBgd2FpdHBpZCcgZXQgYWwuCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5NiwxOTk3LDIwMDAsMjAwNCwyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWYgIWRlZmluZWQgX1NZU19XQUlUX0ggJiYgIWRlZmluZWQgX1NURExJQl9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3dhaXRmbGFncy5oPiBkaXJlY3RseTsgdXNlIDxzeXMvd2FpdC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisKKy8qIEJpdHMgaW4gdGhlIHRoaXJkIGFyZ3VtZW50IHRvIGB3YWl0cGlkJy4gICovCisjZGVmaW5lCVdOT0hBTkcJCTEJLyogRG9uJ3QgYmxvY2sgd2FpdGluZy4gICovCisjZGVmaW5lCVdVTlRSQUNFRAkyCS8qIFJlcG9ydCBzdGF0dXMgb2Ygc3RvcHBlZCBjaGlsZHJlbi4gICovCisKKy8qIEJpdHMgaW4gdGhlIGZvdXJ0aCBhcmd1bWVudCB0byBgd2FpdGlkJy4gICovCisjZGVmaW5lIFdTVE9QUEVECTIJLyogUmVwb3J0IHN0b3BwZWQgY2hpbGQgKHNhbWUgYXMgV1VOVFJBQ0VEKS4gKi8KKyNkZWZpbmUgV0VYSVRFRAkJNAkvKiBSZXBvcnQgZGVhZCBjaGlsZC4gICovCisjZGVmaW5lIFdDT05USU5VRUQJOAkvKiBSZXBvcnQgY29udGludWVkIGNoaWxkLiAgKi8KKyNkZWZpbmUgV05PV0FJVAkJMHgwMTAwMDAwMCAvKiBEb24ndCByZWFwLCBqdXN0IHBvbGwgc3RhdHVzLiAgKi8KKworI2RlZmluZSBfX1dOT1RIUkVBRCAgICAgMHgyMDAwMDAwMCAvKiBEb24ndCB3YWl0IG9uIGNoaWxkcmVuIG9mIG90aGVyIHRocmVhZHMKKwkJCQkgICAgICBpbiB0aGlzIGdyb3VwICovCisjZGVmaW5lIF9fV0FMTAkJMHg0MDAwMDAwMCAvKiBXYWl0IGZvciBhbnkgY2hpbGQuICAqLworI2RlZmluZSBfX1dDTE9ORQkweDgwMDAwMDAwIC8qIFdhaXQgZm9yIGNsb25lZCBwcm9jZXNzLiAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3dhaXRzdGF0dXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3dhaXRzdGF0dXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTljMjI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvd2FpdHN0YXR1cy5oCkBAIC0wLDAgKzEsMTA2IEBACisvKiBEZWZpbml0aW9ucyBvZiBzdGF0dXMgYml0cyBmb3IgYHdhaXQnIGV0IGFsLgorICAgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTQsMTk5NiwxOTk3LDIwMDAsMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIF9TWVNfV0FJVF9IICYmICFkZWZpbmVkIF9TVERMSUJfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy93YWl0c3RhdHVzLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy93YWl0Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKKworLyogRXZlcnl0aGluZyBleHRhbnQgc28gZmFyIHVzZXMgdGhlc2Ugc2FtZSBiaXRzLiAgKi8KKworCisvKiBJZiBXSUZFWElURUQoU1RBVFVTKSwgdGhlIGxvdy1vcmRlciA4IGJpdHMgb2YgdGhlIHN0YXR1cy4gICovCisjZGVmaW5lCV9fV0VYSVRTVEFUVVMoc3RhdHVzKQkoKChzdGF0dXMpICYgMHhmZjAwKSA+PiA4KQorCisvKiBJZiBXSUZTSUdOQUxFRChTVEFUVVMpLCB0aGUgdGVybWluYXRpbmcgc2lnbmFsLiAgKi8KKyNkZWZpbmUJX19XVEVSTVNJRyhzdGF0dXMpCSgoc3RhdHVzKSAmIDB4N2YpCisKKy8qIElmIFdJRlNUT1BQRUQoU1RBVFVTKSwgdGhlIHNpZ25hbCB0aGF0IHN0b3BwZWQgdGhlIGNoaWxkLiAgKi8KKyNkZWZpbmUJX19XU1RPUFNJRyhzdGF0dXMpCV9fV0VYSVRTVEFUVVMoc3RhdHVzKQorCisvKiBOb256ZXJvIGlmIFNUQVRVUyBpbmRpY2F0ZXMgbm9ybWFsIHRlcm1pbmF0aW9uLiAgKi8KKyNkZWZpbmUJX19XSUZFWElURUQoc3RhdHVzKQkoX19XVEVSTVNJRyhzdGF0dXMpID09IDApCisKKy8qIE5vbnplcm8gaWYgU1RBVFVTIGluZGljYXRlcyB0ZXJtaW5hdGlvbiBieSBhIHNpZ25hbC4gICovCisjZGVmaW5lIF9fV0lGU0lHTkFMRUQoc3RhdHVzKSBcCisgICgoKHNpZ25lZCBjaGFyKSAoKChzdGF0dXMpICYgMHg3ZikgKyAxKSA+PiAxKSA+IDApCisKKy8qIE5vbnplcm8gaWYgU1RBVFVTIGluZGljYXRlcyB0aGUgY2hpbGQgaXMgc3RvcHBlZC4gICovCisjZGVmaW5lCV9fV0lGU1RPUFBFRChzdGF0dXMpCSgoKHN0YXR1cykgJiAweGZmKSA9PSAweDdmKQorCisvKiBOb256ZXJvIGlmIFNUQVRVUyBpbmRpY2F0ZXMgdGhlIGNoaWxkIGNvbnRpbnVlZCBhZnRlciBhIHN0b3AuICBXZSBvbmx5CisgICBkZWZpbmUgdGhpcyBpZiA8Yml0cy93YWl0ZmxhZ3MuaD4gcHJvdmlkZXMgdGhlIFdDT05USU5VRUQgZmxhZyBiaXQuICAqLworI2lmZGVmIFdDT05USU5VRUQKKyMgZGVmaW5lIF9fV0lGQ09OVElOVUVEKHN0YXR1cykJKChzdGF0dXMpID09IF9fV19DT05USU5VRUQpCisjZW5kaWYKKworLyogTm9uemVybyBpZiBTVEFUVVMgaW5kaWNhdGVzIHRoZSBjaGlsZCBkdW1wZWQgY29yZS4gICovCisjZGVmaW5lCV9fV0NPUkVEVU1QKHN0YXR1cykJKChzdGF0dXMpICYgX19XQ09SRUZMQUcpCisKKy8qIE1hY3JvcyBmb3IgY29uc3RydWN0aW5nIHN0YXR1cyB2YWx1ZXMuICAqLworI2RlZmluZQlfX1dfRVhJVENPREUocmV0LCBzaWcpCSgocmV0KSA8PCA4IHwgKHNpZykpCisjZGVmaW5lCV9fV19TVE9QQ09ERShzaWcpCSgoc2lnKSA8PCA4IHwgMHg3ZikKKyNkZWZpbmUgX19XX0NPTlRJTlVFRAkJMHhmZmZmCisjZGVmaW5lCV9fV0NPUkVGTEFHCQkweDgwCisKKworI2lmZGVmCV9fVVNFX0JTRAorCisjIGluY2x1ZGUgPGVuZGlhbi5oPgorCit1bmlvbiB3YWl0CisgIHsKKyAgICBpbnQgd19zdGF0dXM7CisgICAgc3RydWN0CisgICAgICB7CisjIGlmCV9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwl1bnNpZ25lZCBpbnQgX193X3Rlcm1zaWc6NzsgLyogVGVybWluYXRpbmcgc2lnbmFsLiAgKi8KKwl1bnNpZ25lZCBpbnQgX193X2NvcmVkdW1wOjE7IC8qIFNldCBpZiBkdW1wZWQgY29yZS4gICovCisJdW5zaWduZWQgaW50IF9fd19yZXRjb2RlOjg7IC8qIFJldHVybiBjb2RlIGlmIGV4aXRlZCBub3JtYWxseS4gICovCisJdW5zaWduZWQgaW50OjE2OworIyBlbmRpZgkJCQkvKiBMaXR0bGUgZW5kaWFuLiAgKi8KKyMgaWYJX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVuc2lnbmVkIGludDoxNjsKKwl1bnNpZ25lZCBpbnQgX193X3JldGNvZGU6ODsKKwl1bnNpZ25lZCBpbnQgX193X2NvcmVkdW1wOjE7CisJdW5zaWduZWQgaW50IF9fd190ZXJtc2lnOjc7CisjIGVuZGlmCQkJCS8qIEJpZyBlbmRpYW4uICAqLworICAgICAgfSBfX3dhaXRfdGVybWluYXRlZDsKKyAgICBzdHJ1Y3QKKyAgICAgIHsKKyMgaWYJX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCXVuc2lnbmVkIGludCBfX3dfc3RvcHZhbDo4OyAvKiBXX1NUT1BQRUQgaWYgc3RvcHBlZC4gICovCisJdW5zaWduZWQgaW50IF9fd19zdG9wc2lnOjg7IC8qIFN0b3BwaW5nIHNpZ25hbC4gICovCisJdW5zaWduZWQgaW50OjE2OworIyBlbmRpZgkJCQkvKiBMaXR0bGUgZW5kaWFuLiAgKi8KKyMgaWYJX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVuc2lnbmVkIGludDoxNjsKKwl1bnNpZ25lZCBpbnQgX193X3N0b3BzaWc6ODsgLyogU3RvcHBpbmcgc2lnbmFsLiAgKi8KKwl1bnNpZ25lZCBpbnQgX193X3N0b3B2YWw6ODsgLyogV19TVE9QUEVEIGlmIHN0b3BwZWQuICAqLworIyBlbmRpZgkJCQkvKiBCaWcgZW5kaWFuLiAgKi8KKyAgICAgIH0gX193YWl0X3N0b3BwZWQ7CisgIH07CisKKyMgZGVmaW5lIHdfdGVybXNpZwlfX3dhaXRfdGVybWluYXRlZC5fX3dfdGVybXNpZworIyBkZWZpbmUgd19jb3JlZHVtcAlfX3dhaXRfdGVybWluYXRlZC5fX3dfY29yZWR1bXAKKyMgZGVmaW5lIHdfcmV0Y29kZQlfX3dhaXRfdGVybWluYXRlZC5fX3dfcmV0Y29kZQorIyBkZWZpbmUgd19zdG9wc2lnCV9fd2FpdF9zdG9wcGVkLl9fd19zdG9wc2lnCisjIGRlZmluZSB3X3N0b3B2YWwJX193YWl0X3N0b3BwZWQuX193X3N0b3B2YWwKKworI2VuZGlmCS8qIFVzZSBCU0QuICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvd2NoYXItbGRibC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvd2NoYXItbGRibC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYTZhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy93Y2hhci1sZGJsLmgKQEAgLTAsMCArMSw3NSBAQAorLyogLW1sb25nLWRvdWJsZS02NCBjb21wYXRpYmlsaXR5IG1vZGUgZm9yIDx3Y2hhci5oPiBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1dDSEFSX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvd2NoYXItbGRibC5oPiBkaXJlY3RseTsgdXNlIDx3Y2hhci5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9JU09DOTUgfHwgZGVmaW5lZCBfX1VTRV9VTklYOTgKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorX19MREJMX1JFRElSX0RFQ0wgKGZ3cHJpbnRmKTsKK19fTERCTF9SRURJUl9ERUNMICh3cHJpbnRmKTsKK19fTERCTF9SRURJUl9ERUNMIChzd3ByaW50Zik7CitfX0xEQkxfUkVESVJfREVDTCAodmZ3cHJpbnRmKTsKK19fTERCTF9SRURJUl9ERUNMICh2d3ByaW50Zik7CitfX0xEQkxfUkVESVJfREVDTCAodnN3cHJpbnRmKTsKKyMgaWYgZGVmaW5lZCBfX1VTRV9JU09DOTkgJiYgIWRlZmluZWQgX19VU0VfR05VIFwKKyAgICAgJiYgIWRlZmluZWQgX19SRURJUkVDVCBcCisgICAgICYmIChkZWZpbmVkIF9fU1RSSUNUX0FOU0lfXyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMkspCitfX0xEQkxfUkVESVIxX0RFQ0wgKGZ3c2NhbmYsIF9fbmxkYmxfX19pc29jOTlfZndzY2FuZikKK19fTERCTF9SRURJUjFfREVDTCAod3NjYW5mLCBfX25sZGJsX19faXNvYzk5X3dzY2FuZikgIAorX19MREJMX1JFRElSMV9ERUNMIChzd3NjYW5mLCBfX25sZGJsX19faXNvYzk5X3N3c2NhbmYpCisjIGVsc2UKK19fTERCTF9SRURJUl9ERUNMIChmd3NjYW5mKTsKK19fTERCTF9SRURJUl9ERUNMICh3c2NhbmYpOworX19MREJMX1JFRElSX0RFQ0wgKHN3c2NhbmYpOworIyBlbmRpZgorX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorX19MREJMX1JFRElSMV9ERUNMICh3Y3N0b2xkLCB3Y3N0b2QpOworIyBpZiAhZGVmaW5lZCBfX1VTRV9HTlUgJiYgIWRlZmluZWQgX19SRURJUkVDVCBcCisgICAgICYmIChkZWZpbmVkIF9fU1RSSUNUX0FOU0lfXyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMkspCitfX0xEQkxfUkVESVIxX0RFQ0wgKHZmd3NjYW5mLCBfX25sZGJsX19faXNvYzk5X3Zmd3NjYW5mKQorX19MREJMX1JFRElSMV9ERUNMICh2d3NjYW5mLCBfX25sZGJsX19faXNvYzk5X3Z3c2NhbmYpICAKK19fTERCTF9SRURJUjFfREVDTCAodnN3c2NhbmYsIF9fbmxkYmxfX19pc29jOTlfdnN3c2NhbmYpCisjIGVsc2UKK19fTERCTF9SRURJUl9ERUNMICh2ZndzY2FuZik7CitfX0xEQkxfUkVESVJfREVDTCAodndzY2FuZik7CitfX0xEQkxfUkVESVJfREVDTCAodnN3c2NhbmYpOworIyBlbmRpZgorX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKK19fTERCTF9SRURJUjFfREVDTCAod2NzdG9sZF9sLCB3Y3N0b2RfbCk7CisjZW5kaWYKKworI2lmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAwICYmIGRlZmluZWQgX19leHRlcm5fYWx3YXlzX2lubGluZQorX19MREJMX1JFRElSX0RFQ0wgKF9fc3dwcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fdnN3cHJpbnRmX2NoaykKKyMgaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDEKK19fTERCTF9SRURJUl9ERUNMIChfX2Z3cHJpbnRmX2NoaykKK19fTERCTF9SRURJUl9ERUNMIChfX3dwcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fdmZ3cHJpbnRmX2NoaykKK19fTERCTF9SRURJUl9ERUNMIChfX3Z3cHJpbnRmX2NoaykKKyMgZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvd2NoYXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3djaGFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyM2ZlMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3djaGFyLmgKQEAgLTAsMCArMSw0MyBAQAorLyogd2NoYXJfdCB0eXBlIHJlbGF0ZWQgZGVmaW5pdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0JJVFNfV0NIQVJfSAorI2RlZmluZSBfQklUU19XQ0hBUl9ICTEKKworLyogVXNlIEdDQydzIF9fV0NIQVJfTUFYX18gd2hlbiBhdmFpbGFibGUuICAqLworI2lmZGVmIF9fV0NIQVJfTUFYX18KKyNkZWZpbmUgX19XQ0hBUl9NQVgJX19XQ0hBUl9NQVhfXworI2Vsc2UKKyNkZWZpbmUgX19XQ0hBUl9NQVgJKDIxNDc0ODM2NDcpCisjZW5kaWYKKworLyogR0NDIG1heSBhbHNvIGRlZmluZSBfX1dDSEFSX1VOU0lHTkVEX18uCisgICBVc2UgTCdcMCcgdG8gZ2l2ZSB0aGUgZXhwcmVzc2lvbiB0aGUgY29ycmVjdCAodW5zaWduZWQpIHR5cGUuICAqLworI2lmZGVmIF9fV0NIQVJfVU5TSUdORURfXworI2RlZmluZSBfX1dDSEFSX01JTiAgICAgICBMJ1wwJworCisvKiBGYWlsaW5nIHRoYXQsIHJlbHkgb24gdGhlIHByZXByb2Nlc3NvcidzIGtub3dsZWRnZSBvZiB0aGUKKyAgIHNpZ25lZG5lc3Mgb2Ygd2NoYXJfdC4gICovCisjZWxpZiBMJ1wwJyAtIDEgPiAwCisjZGVmaW5lIF9fV0NIQVJfTUlOICAgICAgIEwnXDAnCisjZWxzZQorI2RlZmluZSBfX1dDSEFSX01JTiAgICAgICAoLV9fV0NIQVJfTUFYIC0gMSkKKyNlbmRpZgorCisjZW5kaWYJLyogYml0cy93Y2hhci5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy93Y2hhcjIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3djaGFyMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzOGVhYTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy93Y2hhcjIuaApAQCAtMCwwICsxLDU5NCBAQAorLyogQ2hlY2tpbmcgbWFjcm9zIGZvciB3Y2hhciBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1dDSEFSX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvd2NoYXIyLmg+IGRpcmVjdGx5OyB1c2UgPHdjaGFyLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKworZXh0ZXJuIHdjaGFyX3QgKl9fd21lbWNweV9jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMSwKKwkJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwgc2l6ZV90IF9fbiwKKwkJCSAgICAgICBzaXplX3QgX19uczEpIF9fVEhST1c7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd21lbWNweV9hbGlhcywKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwgc2l6ZV90IF9fbiksCisJCQkJd21lbWNweSk7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd21lbWNweV9jaGtfd2FybiwKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwgc2l6ZV90IF9fbiwKKwkJCQkgc2l6ZV90IF9fbnMxKSwgX193bWVtY3B5X2NoaykKKyAgICAgX193YXJuYXR0ciAoIndtZW1jcHkgY2FsbGVkIHdpdGggbGVuZ3RoIGJpZ2dlciB0aGFuIHNpemUgb2YgZGVzdGluYXRpb24gIgorCQkgImJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHdjaGFyX3QgKgorX19OVEggKHdtZW1jcHkgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczIsCisJCXNpemVfdCBfX24pKQoreworICBpZiAoX19ib3MwIChfX3MxKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pKQorCXJldHVybiBfX3dtZW1jcHlfY2hrIChfX3MxLCBfX3MyLCBfX24sCisJCQkgICAgICBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisKKyAgICAgIGlmIChfX24gPiBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSkKKwlyZXR1cm4gX193bWVtY3B5X2Noa193YXJuIChfX3MxLCBfX3MyLCBfX24sCisJCQkJICAgX19ib3MwIChfX3MxKSAvIHNpemVvZiAod2NoYXJfdCkpOworICAgIH0KKyAgcmV0dXJuIF9fd21lbWNweV9hbGlhcyAoX19zMSwgX19zMiwgX19uKTsKK30KKworCitleHRlcm4gd2NoYXJfdCAqX193bWVtbW92ZV9jaGsgKHdjaGFyX3QgKl9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19zMiwKKwkJCQlzaXplX3QgX19uLCBzaXplX3QgX19uczEpIF9fVEhST1c7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd21lbW1vdmVfYWxpYXMsICh3Y2hhcl90ICpfX3MxLAorCQkJCQkJICAgX19jb25zdCB3Y2hhcl90ICpfX3MyLAorCQkJCQkJICAgc2l6ZV90IF9fbiksIHdtZW1tb3ZlKTsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193bWVtbW92ZV9jaGtfd2FybiwKKwkJCQkod2NoYXJfdCAqX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3MyLAorCQkJCSBzaXplX3QgX19uLCBzaXplX3QgX19uczEpLCBfX3dtZW1tb3ZlX2NoaykKKyAgICAgX193YXJuYXR0ciAoIndtZW1tb3ZlIGNhbGxlZCB3aXRoIGxlbmd0aCBiaWdnZXIgdGhhbiBzaXplIG9mIGRlc3RpbmF0aW9uICIKKwkJICJidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSB3Y2hhcl90ICoKK19fTlRIICh3bWVtbW92ZSAod2NoYXJfdCAqX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3MyLCBzaXplX3QgX19uKSkKK3sKKyAgaWYgKF9fYm9zMCAoX19zMSkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSkKKwlyZXR1cm4gX193bWVtbW92ZV9jaGsgKF9fczEsIF9fczIsIF9fbiwKKwkJCSAgICAgICBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisKKyAgICAgIGlmIChfX24gPiBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSkKKwlyZXR1cm4gX193bWVtbW92ZV9jaGtfd2FybiAoX19zMSwgX19zMiwgX19uLAorCQkJCSAgICBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX193bWVtbW92ZV9hbGlhcyAoX19zMSwgX19zMiwgX19uKTsKK30KKworCisjaWZkZWYgX19VU0VfR05VCitleHRlcm4gd2NoYXJfdCAqX193bWVtcGNweV9jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMSwKKwkJCQlfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwgc2l6ZV90IF9fbiwKKwkJCQlzaXplX3QgX19uczEpIF9fVEhST1c7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd21lbXBjcHlfYWxpYXMsCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMSwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczIsCisJCQkJIHNpemVfdCBfX24pLCB3bWVtcGNweSk7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd21lbXBjcHlfY2hrX3dhcm4sCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMSwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczIsIHNpemVfdCBfX24sCisJCQkJIHNpemVfdCBfX25zMSksIF9fd21lbXBjcHlfY2hrKQorICAgICBfX3dhcm5hdHRyICgid21lbXBjcHkgY2FsbGVkIHdpdGggbGVuZ3RoIGJpZ2dlciB0aGFuIHNpemUgb2YgZGVzdGluYXRpb24gIgorCQkgImJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHdjaGFyX3QgKgorX19OVEggKHdtZW1wY3B5ICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MyLAorCQkgc2l6ZV90IF9fbikpCit7CisgIGlmIChfX2JvczAgKF9fczEpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbikpCisJcmV0dXJuIF9fd21lbXBjcHlfY2hrIChfX3MxLCBfX3MyLCBfX24sCisJCQkgICAgICAgX19ib3MwIChfX3MxKSAvIHNpemVvZiAod2NoYXJfdCkpOworCisgICAgICBpZiAoX19uID4gX19ib3MwIChfX3MxKSAvIHNpemVvZiAod2NoYXJfdCkpCisJcmV0dXJuIF9fd21lbXBjcHlfY2hrX3dhcm4gKF9fczEsIF9fczIsIF9fbiwKKwkJCQkgICAgX19ib3MwIChfX3MxKSAvIHNpemVvZiAod2NoYXJfdCkpOworICAgIH0KKyAgcmV0dXJuIF9fd21lbXBjcHlfYWxpYXMgKF9fczEsIF9fczIsIF9fbik7Cit9CisjZW5kaWYKKworCitleHRlcm4gd2NoYXJfdCAqX193bWVtc2V0X2NoayAod2NoYXJfdCAqX19zLCB3Y2hhcl90IF9fYywgc2l6ZV90IF9fbiwKKwkJCSAgICAgICBzaXplX3QgX19ucykgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193bWVtc2V0X2FsaWFzLCAod2NoYXJfdCAqX19zLCB3Y2hhcl90IF9fYywKKwkJCQkJCSAgc2l6ZV90IF9fbiksIHdtZW1zZXQpOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1RfTlRIIChfX3dtZW1zZXRfY2hrX3dhcm4sCisJCQkJKHdjaGFyX3QgKl9fcywgd2NoYXJfdCBfX2MsIHNpemVfdCBfX24sCisJCQkJIHNpemVfdCBfX25zKSwgX193bWVtc2V0X2NoaykKKyAgICAgX193YXJuYXR0ciAoIndtZW1zZXQgY2FsbGVkIHdpdGggbGVuZ3RoIGJpZ2dlciB0aGFuIHNpemUgb2YgZGVzdGluYXRpb24gIgorCQkgImJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHdjaGFyX3QgKgorX19OVEggKHdtZW1zZXQgKHdjaGFyX3QgKl9fcywgd2NoYXJfdCBfX2MsIHNpemVfdCBfX24pKQoreworICBpZiAoX19ib3MwIChfX3MpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbikpCisJcmV0dXJuIF9fd21lbXNldF9jaGsgKF9fcywgX19jLCBfX24sIF9fYm9zMCAoX19zKSAvIHNpemVvZiAod2NoYXJfdCkpOworCisgICAgICBpZiAoX19uID4gX19ib3MwIChfX3MpIC8gc2l6ZW9mICh3Y2hhcl90KSkKKwlyZXR1cm4gX193bWVtc2V0X2Noa193YXJuIChfX3MsIF9fYywgX19uLAorCQkJCSAgIF9fYm9zMCAoX19zKSAvIHNpemVvZiAod2NoYXJfdCkpOworICAgIH0KKyAgcmV0dXJuIF9fd21lbXNldF9hbGlhcyAoX19zLCBfX2MsIF9fbik7Cit9CisKKworZXh0ZXJuIHdjaGFyX3QgKl9fd2NzY3B5X2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICBzaXplX3QgX19uKSBfX1RIUk9XOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1RfTlRIIChfX3djc2NweV9hbGlhcywKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYyksIHdjc2NweSk7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgd2NoYXJfdCAqCitfX05USCAod2NzY3B5ICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjKSkKK3sKKyAgaWYgKF9fYm9zIChfX2Rlc3QpICE9IChzaXplX3QpIC0xKQorICAgIHJldHVybiBfX3djc2NweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fYm9zIChfX2Rlc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgIHJldHVybiBfX3djc2NweV9hbGlhcyAoX19kZXN0LCBfX3NyYyk7Cit9CisKKworZXh0ZXJuIHdjaGFyX3QgKl9fd2NwY3B5X2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICBzaXplX3QgX19kZXN0bGVuKSBfX1RIUk9XOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1RfTlRIIChfX3djcGNweV9hbGlhcywKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYyksIHdjcGNweSk7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgd2NoYXJfdCAqCitfX05USCAod2NwY3B5ICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjKSkKK3sKKyAgaWYgKF9fYm9zIChfX2Rlc3QpICE9IChzaXplX3QpIC0xKQorICAgIHJldHVybiBfX3djcGNweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fYm9zIChfX2Rlc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgIHJldHVybiBfX3djcGNweV9hbGlhcyAoX19kZXN0LCBfX3NyYyk7Cit9CisKKworZXh0ZXJuIHdjaGFyX3QgKl9fd2NzbmNweV9jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbiwKKwkJCSAgICAgICBzaXplX3QgX19kZXN0bGVuKSBfX1RIUk9XOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1RfTlRIIChfX3djc25jcHlfYWxpYXMsCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCQkJIHNpemVfdCBfX24pLCB3Y3NuY3B5KTsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193Y3NuY3B5X2Noa193YXJuLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJCSBzaXplX3QgX19uLCBzaXplX3QgX19kZXN0bGVuKSwgX193Y3NuY3B5X2NoaykKKyAgICAgX193YXJuYXR0ciAoIndjc25jcHkgY2FsbGVkIHdpdGggbGVuZ3RoIGJpZ2dlciB0aGFuIHNpemUgb2YgZGVzdGluYXRpb24gIgorCQkgImJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHdjaGFyX3QgKgorX19OVEggKHdjc25jcHkgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCXNpemVfdCBfX24pKQoreworICBpZiAoX19ib3MgKF9fZGVzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSkKKwlyZXR1cm4gX193Y3NuY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19uLAorCQkJICAgICAgX19ib3MgKF9fZGVzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgICAgIGlmIChfX24gPiBfX2JvcyAoX19kZXN0KSAvIHNpemVvZiAod2NoYXJfdCkpCisJcmV0dXJuIF9fd2NzbmNweV9jaGtfd2FybiAoX19kZXN0LCBfX3NyYywgX19uLAorCQkJCSAgIF9fYm9zIChfX2Rlc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX193Y3NuY3B5X2FsaWFzIChfX2Rlc3QsIF9fc3JjLCBfX24pOworfQorCisKK2V4dGVybiB3Y2hhcl90ICpfX3djcG5jcHlfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX24sCisJCQkgICAgICAgc2l6ZV90IF9fZGVzdGxlbikgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193Y3BuY3B5X2FsaWFzLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJCSBzaXplX3QgX19uKSwgd2NwbmNweSk7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd2NwbmNweV9jaGtfd2FybiwKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCQkgc2l6ZV90IF9fbiwgc2l6ZV90IF9fZGVzdGxlbiksIF9fd2NwbmNweV9jaGspCisgICAgIF9fd2FybmF0dHIgKCJ3Y3BuY3B5IGNhbGxlZCB3aXRoIGxlbmd0aCBiaWdnZXIgdGhhbiBzaXplIG9mIGRlc3RpbmF0aW9uICIKKwkJICJidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSB3Y2hhcl90ICoKK19fTlRIICh3Y3BuY3B5ICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQlzaXplX3QgX19uKSkKK3sKKyAgaWYgKF9fYm9zIChfX2Rlc3QpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbikpCisJcmV0dXJuIF9fd2NwbmNweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbiwKKwkJCSAgICAgIF9fYm9zIChfX2Rlc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgICBpZiAoX19uID4gX19ib3MgKF9fZGVzdCkgLyBzaXplb2YgKHdjaGFyX3QpKQorCXJldHVybiBfX3djcG5jcHlfY2hrX3dhcm4gKF9fZGVzdCwgX19zcmMsIF9fbiwKKwkJCQkgICBfX2JvcyAoX19kZXN0KSAvIHNpemVvZiAod2NoYXJfdCkpOworICAgIH0KKyAgcmV0dXJuIF9fd2NwbmNweV9hbGlhcyAoX19kZXN0LCBfX3NyYywgX19uKTsKK30KKworCitleHRlcm4gd2NoYXJfdCAqX193Y3NjYXRfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCSAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgIHNpemVfdCBfX2Rlc3RsZW4pIF9fVEhST1c7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd2NzY2F0X2FsaWFzLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjKSwgd2NzY2F0KTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSB3Y2hhcl90ICoKK19fTlRIICh3Y3NjYXQgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMpKQoreworICBpZiAoX19ib3MgKF9fZGVzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgcmV0dXJuIF9fd2NzY2F0X2NoayAoX19kZXN0LCBfX3NyYywgX19ib3MgKF9fZGVzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgcmV0dXJuIF9fd2NzY2F0X2FsaWFzIChfX2Rlc3QsIF9fc3JjKTsKK30KKworCitleHRlcm4gd2NoYXJfdCAqX193Y3NuY2F0X2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkgICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX24sIHNpemVfdCBfX2Rlc3RsZW4pIF9fVEhST1c7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd2NzbmNhdF9hbGlhcywKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCQkgc2l6ZV90IF9fbiksIHdjc25jYXQpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHdjaGFyX3QgKgorX19OVEggKHdjc25jYXQgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCXNpemVfdCBfX24pKQoreworICBpZiAoX19ib3MgKF9fZGVzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgcmV0dXJuIF9fd2NzbmNhdF9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbiwKKwkJCSAgX19ib3MgKF9fZGVzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgcmV0dXJuIF9fd2NzbmNhdF9hbGlhcyAoX19kZXN0LCBfX3NyYywgX19uKTsKK30KKworCitleHRlcm4gaW50IF9fc3dwcmludGZfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwKKwkJCSAgIGludCBfX2ZsYWcsIHNpemVfdCBfX3NfbGVuLAorCQkJICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pCisgICAgIF9fVEhST1cgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3ByaW50Zl9fLCA1LCA2KSkpICovOworCitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIX0xEQkwgKF9fc3dwcmludGZfYWxpYXMsCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mbXQsIC4uLiksCisJCQkJc3dwcmludGYpOworCisjaWZkZWYgX192YV9hcmdfcGFjaworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIIChzd3ByaW50ZiAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikpCit7CisgIGlmIChfX2JvcyAoX19zKSAhPSAoc2l6ZV90KSAtMSB8fCBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMSkKKyAgICByZXR1cm4gX19zd3ByaW50Zl9jaGsgKF9fcywgX19uLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwKKwkJCSAgIF9fYm9zIChfX3MpIC8gc2l6ZW9mICh3Y2hhcl90KSwKKwkJCSAgIF9fZm10LCBfX3ZhX2FyZ19wYWNrICgpKTsKKyAgcmV0dXJuIF9fc3dwcmludGZfYWxpYXMgKF9fcywgX19uLCBfX2ZtdCwgX192YV9hcmdfcGFjayAoKSk7Cit9CisjZWxpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cworLyogWFhYIFdlIG1pZ2h0IHdhbnQgdG8gaGF2ZSBzdXBwb3J0IGluIGdjYyBmb3Igc3dwcmludGYuICAqLworIyBkZWZpbmUgc3dwcmludGYocywgbiwgLi4uKSBcCisgIChfX2JvcyAocykgIT0gKHNpemVfdCkgLTEgfHwgX19VU0VfRk9SVElGWV9MRVZFTCA+IDEJCQkgICAgICBcCisgICA/IF9fc3dwcmludGZfY2hrIChzLCBuLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwJCQkgICAgICBcCisJCSAgICAgX19ib3MgKHMpIC8gc2l6ZW9mICh3Y2hhcl90KSwgX19WQV9BUkdTX18pCQkgICAgICBcCisgICA6IHN3cHJpbnRmIChzLCBuLCBfX1ZBX0FSR1NfXykpCisjZW5kaWYKKworZXh0ZXJuIGludCBfX3Zzd3ByaW50Zl9jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLAorCQkJICAgIGludCBfX2ZsYWcsIHNpemVfdCBfX3NfbGVuLAorCQkJICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgICBfX2dudWNfdmFfbGlzdCBfX2FyZykKKyAgICAgX19USFJPVyAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193cHJpbnRmX18sIDUsIDApKSkgKi87CisKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEhfTERCTCAoX192c3dwcmludGZfYWxpYXMsCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mbXQsCisJCQkJIF9fZ251Y192YV9saXN0IF9fYXApLCB2c3dwcmludGYpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKHZzd3ByaW50ZiAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJCSAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm10LCBfX2dudWNfdmFfbGlzdCBfX2FwKSkKK3sKKyAgaWYgKF9fYm9zIChfX3MpICE9IChzaXplX3QpIC0xIHx8IF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAxKQorICAgIHJldHVybiBfX3Zzd3ByaW50Zl9jaGsgKF9fcywgX19uLCAgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsCisJCQkgICAgX19ib3MgKF9fcykgLyBzaXplb2YgKHdjaGFyX3QpLCBfX2ZtdCwgX19hcCk7CisgIHJldHVybiBfX3Zzd3ByaW50Zl9hbGlhcyAoX19zLCBfX24sIF9fZm10LCBfX2FwKTsKK30KKworCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDEKKworZXh0ZXJuIGludCBfX2Z3cHJpbnRmX2NoayAoX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBpbnQgX19mbGFnLAorCQkJICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pOworZXh0ZXJuIGludCBfX3dwcmludGZfY2hrIChpbnQgX19mbGFnLCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgIC4uLik7CitleHRlcm4gaW50IF9fdmZ3cHJpbnRmX2NoayAoX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBpbnQgX19mbGFnLAorCQkJICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgICBfX2dudWNfdmFfbGlzdCBfX2FwKTsKK2V4dGVybiBpbnQgX192d3ByaW50Zl9jaGsgKGludCBfX2ZsYWcsIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgIF9fZ251Y192YV9saXN0IF9fYXApOworCisjIGlmZGVmIF9fdmFfYXJnX3BhY2sKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50Cit3cHJpbnRmIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikKK3sKKyAgcmV0dXJuIF9fd3ByaW50Zl9jaGsgKF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwgX192YV9hcmdfcGFjayAoKSk7Cit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50Citmd3ByaW50ZiAoX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikKK3sKKyAgcmV0dXJuIF9fZndwcmludGZfY2hrIChfX3N0cmVhbSwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LAorCQkJIF9fdmFfYXJnX3BhY2sgKCkpOworfQorIyBlbGlmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgd3ByaW50ZiguLi4pIFwKKyAgX193cHJpbnRmX2NoayAoX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fVkFfQVJHU19fKQorIyAgZGVmaW5lIGZ3cHJpbnRmKHN0cmVhbSwgLi4uKSBcCisgIF9fZndwcmludGZfY2hrIChzdHJlYW0sIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX1ZBX0FSR1NfXykKKyMgZW5kaWYKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK3Z3cHJpbnRmIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mbXQsIF9fZ251Y192YV9saXN0IF9fYXApCit7CisgIHJldHVybiBfX3Z3cHJpbnRmX2NoayAoX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX2FwKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK3Zmd3ByaW50ZiAoX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCSAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2ZtdCwgX19nbnVjX3ZhX2xpc3QgX19hcCkKK3sKKyAgcmV0dXJuIF9fdmZ3cHJpbnRmX2NoayAoX19zdHJlYW0sIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwgX19hcCk7Cit9CisKKyNlbmRpZgorCitleHRlcm4gd2NoYXJfdCAqX19mZ2V0d3NfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fc2l6ZSwgaW50IF9fbiwKKwkJCSAgICAgIF9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgX193dXI7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVCAoX19mZ2V0d3NfYWxpYXMsCisJCQkgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBpbnQgX19uLAorCQkJICAgICBfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLCBmZ2V0d3MpIF9fd3VyOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1QgKF9fZmdldHdzX2Noa193YXJuLAorCQkJICAgICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fc2l6ZSwgaW50IF9fbiwKKwkJCSAgICAgX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSwgX19mZ2V0d3NfY2hrKQorICAgICBfX3d1ciBfX3dhcm5hdHRyICgiZmdldHdzIGNhbGxlZCB3aXRoIGJpZ2dlciBzaXplIHRoYW4gbGVuZ3RoICIKKwkJICAgICAgICJvZiBkZXN0aW5hdGlvbiBidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX3d1ciB3Y2hhcl90ICoKK2ZnZXR3cyAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIGludCBfX24sIF9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkKK3sKKyAgaWYgKF9fYm9zIChfX3MpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbikgfHwgX19uIDw9IDApCisJcmV0dXJuIF9fZmdldHdzX2NoayAoX19zLCBfX2JvcyAoX19zKSAvIHNpemVvZiAod2NoYXJfdCksCisJCQkgICAgIF9fbiwgX19zdHJlYW0pOworCisgICAgICBpZiAoKHNpemVfdCkgX19uID4gX19ib3MgKF9fcykgLyBzaXplb2YgKHdjaGFyX3QpKQorCXJldHVybiBfX2ZnZXR3c19jaGtfd2FybiAoX19zLCBfX2JvcyAoX19zKSAvIHNpemVvZiAod2NoYXJfdCksCisJCQkJICBfX24sIF9fc3RyZWFtKTsKKyAgICB9CisgIHJldHVybiBfX2ZnZXR3c19hbGlhcyAoX19zLCBfX24sIF9fc3RyZWFtKTsKK30KKworI2lmZGVmIF9fVVNFX0dOVQorZXh0ZXJuIHdjaGFyX3QgKl9fZmdldHdzX3VubG9ja2VkX2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX3NpemUsCisJCQkJICAgICAgIGludCBfX24sIF9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkKKyAgX193dXI7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVCAoX19mZ2V0d3NfdW5sb2NrZWRfYWxpYXMsCisJCQkgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBpbnQgX19uLAorCQkJICAgICBfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLCBmZ2V0d3NfdW5sb2NrZWQpCisgIF9fd3VyOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1QgKF9fZmdldHdzX3VubG9ja2VkX2Noa193YXJuLAorCQkJICAgICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fc2l6ZSwgaW50IF9fbiwKKwkJCSAgICAgX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSwKKwkJCSAgICBfX2ZnZXR3c191bmxvY2tlZF9jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJmZ2V0d3NfdW5sb2NrZWQgY2FsbGVkIHdpdGggYmlnZ2VyIHNpemUgdGhhbiBsZW5ndGggIgorCQkgICAgICAgIm9mIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIHdjaGFyX3QgKgorZmdldHdzX3VubG9ja2VkICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgaW50IF9fbiwgX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKQoreworICBpZiAoX19ib3MgKF9fcykgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSB8fCBfX24gPD0gMCkKKwlyZXR1cm4gX19mZ2V0d3NfdW5sb2NrZWRfY2hrIChfX3MsIF9fYm9zIChfX3MpIC8gc2l6ZW9mICh3Y2hhcl90KSwKKwkJCQkgICAgICBfX24sIF9fc3RyZWFtKTsKKworICAgICAgaWYgKChzaXplX3QpIF9fbiA+IF9fYm9zIChfX3MpIC8gc2l6ZW9mICh3Y2hhcl90KSkKKwlyZXR1cm4gX19mZ2V0d3NfdW5sb2NrZWRfY2hrX3dhcm4gKF9fcywgX19ib3MgKF9fcykgLyBzaXplb2YgKHdjaGFyX3QpLAorCQkJCQkgICBfX24sIF9fc3RyZWFtKTsKKyAgICB9CisgIHJldHVybiBfX2ZnZXR3c191bmxvY2tlZF9hbGlhcyAoX19zLCBfX24sIF9fc3RyZWFtKTsKK30KKyNlbmRpZgorCisKK2V4dGVybiBzaXplX3QgX193Y3J0b21iX2NoayAoY2hhciAqX19yZXN0cmljdCBfX3MsIHdjaGFyX3QgX193Y2hhciwKKwkJCSAgICAgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcCwKKwkJCSAgICAgc2l6ZV90IF9fYnVmbGVuKSBfX1RIUk9XIF9fd3VyOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX193Y3J0b21iX2FsaWFzLAorCQkJICAgICAgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCB3Y2hhcl90IF9fd2NoYXIsCisJCQkgICAgICAgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpLCB3Y3J0b21iKSBfX3d1cjsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX3d1ciBzaXplX3QKK19fTlRIICh3Y3J0b21iIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgd2NoYXJfdCBfX3djaGFyLAorCQltYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykpCit7CisgIC8qIFdlIHdvdWxkIGhhdmUgdG8gaW5jbHVkZSA8bGltaXRzLmg+IHRvIGdldCBhIGRlZmluaXRpb24gb2YgTUJfTEVOX01BWC4KKyAgICAgQnV0IHRoaXMgd291bGQgb25seSBkaXN0dXJiIHRoZSBuYW1lc3BhY2UuICBTbyB3ZSBkZWZpbmUgb3VyIG93bgorICAgICB2ZXJzaW9uIGhlcmUuICAqLworI2RlZmluZSBfX1dDSEFSX01CX0xFTl9NQVgJMTYKKyNpZiBkZWZpbmVkIE1CX0xFTl9NQVggJiYgTUJfTEVOX01BWCAhPSBfX1dDSEFSX01CX0xFTl9NQVgKKyMgZXJyb3IgIkFzc3VtZWQgdmFsdWUgb2YgTUJfTEVOX01BWCB3cm9uZyIKKyNlbmRpZgorICBpZiAoX19ib3MgKF9fcykgIT0gKHNpemVfdCkgLTEgJiYgX19XQ0hBUl9NQl9MRU5fTUFYID4gX19ib3MgKF9fcykpCisgICAgcmV0dXJuIF9fd2NydG9tYl9jaGsgKF9fcywgX193Y2hhciwgX19wcywgX19ib3MgKF9fcykpOworICByZXR1cm4gX193Y3J0b21iX2FsaWFzIChfX3MsIF9fd2NoYXIsIF9fcHMpOworfQorCisKK2V4dGVybiBzaXplX3QgX19tYnNydG93Y3NfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3QgY2hhciAqKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICAgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcywKKwkJCSAgICAgICBzaXplX3QgX19kc3RsZW4pIF9fVEhST1c7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX21ic3J0b3djc19hbGlhcywKKwkJCSAgICAgICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3QgY2hhciAqKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICAgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcyksCisJCQkgICAgICBtYnNydG93Y3MpOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX19tYnNydG93Y3NfY2hrX3dhcm4sCisJCQkgICAgICAod2NoYXJfdCAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IGNoYXIgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMsCisJCQkgICAgICAgc2l6ZV90IF9fZHN0bGVuKSwgX19tYnNydG93Y3NfY2hrKQorICAgICBfX3dhcm5hdHRyICgibWJzcnRvd2NzIGNhbGxlZCB3aXRoIGRzdCBidWZmZXIgc21hbGxlciB0aGFuIGxlbiAiCisJCSAiKiBzaXplb2YgKHdjaGFyX3QpIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgc2l6ZV90CitfX05USCAobWJzcnRvd2NzICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LCBfX2NvbnN0IGNoYXIgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkgIHNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpKQoreworICBpZiAoX19ib3MgKF9fZHN0KSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2xlbikpCisJcmV0dXJuIF9fbWJzcnRvd2NzX2NoayAoX19kc3QsIF9fc3JjLCBfX2xlbiwgX19wcywKKwkJCQlfX2JvcyAoX19kc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisKKyAgICAgIGlmIChfX2xlbiA+IF9fYm9zIChfX2RzdCkgLyBzaXplb2YgKHdjaGFyX3QpKQorCXJldHVybiBfX21ic3J0b3djc19jaGtfd2FybiAoX19kc3QsIF9fc3JjLCBfX2xlbiwgX19wcywKKwkJCQkgICAgIF9fYm9zIChfX2RzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgICB9CisgIHJldHVybiBfX21ic3J0b3djc19hbGlhcyAoX19kc3QsIF9fc3JjLCBfX2xlbiwgX19wcyk7Cit9CisKKworZXh0ZXJuIHNpemVfdCBfX3djc3J0b21ic19jaGsgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCB3Y2hhcl90ICoqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgICBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzLAorCQkJICAgICAgIHNpemVfdCBfX2RzdGxlbikgX19USFJPVzsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fd2NzcnRvbWJzX2FsaWFzLAorCQkJICAgICAgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCB3Y2hhcl90ICoqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgICBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSwKKwkJCSAgICAgIHdjc3J0b21icyk7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3djc3J0b21ic19jaGtfd2FybiwKKwkJCSAgICAgIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICAgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcywKKwkJCSAgICAgICBzaXplX3QgX19kc3RsZW4pLCBfX3djc3J0b21ic19jaGspCisgICAgX193YXJuYXR0ciAoIndjc3J0b21icyBjYWxsZWQgd2l0aCBkc3QgYnVmZmVyIHNtYWxsZXIgdGhhbiBsZW4iKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBzaXplX3QKK19fTlRIICh3Y3NydG9tYnMgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsIF9fY29uc3Qgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19zcmMsCisJCSAgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykpCit7CisgIGlmIChfX2JvcyAoX19kc3QpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbGVuKSkKKwlyZXR1cm4gX193Y3NydG9tYnNfY2hrIChfX2RzdCwgX19zcmMsIF9fbGVuLCBfX3BzLCBfX2JvcyAoX19kc3QpKTsKKworICAgICAgaWYgKF9fbGVuID4gX19ib3MgKF9fZHN0KSkKKwlyZXR1cm4gX193Y3NydG9tYnNfY2hrX3dhcm4gKF9fZHN0LCBfX3NyYywgX19sZW4sIF9fcHMsIF9fYm9zIChfX2RzdCkpOworICAgIH0KKyAgcmV0dXJuIF9fd2NzcnRvbWJzX2FsaWFzIChfX2RzdCwgX19zcmMsIF9fbGVuLCBfX3BzKTsKK30KKworCisjaWZkZWYgX19VU0VfR05VCitleHRlcm4gc2l6ZV90IF9fbWJzbnJ0b3djc19jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkJX19jb25zdCBjaGFyICoqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbm1jLAorCQkJCXNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMsCisJCQkJc2l6ZV90IF9fZHN0bGVuKSBfX1RIUk9XOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX19tYnNucnRvd2NzX2FsaWFzLAorCQkJICAgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCBjaGFyICoqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbm1jLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpLAorCQkJICAgICAgbWJzbnJ0b3djcyk7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX21ic25ydG93Y3NfY2hrX3dhcm4sCisJCQkgICAgICAod2NoYXJfdCAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IGNoYXIgKipfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19ubWMsCisJCQkgICAgICAgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcywKKwkJCSAgICAgICBzaXplX3QgX19kc3RsZW4pLCBfX21ic25ydG93Y3NfY2hrKQorICAgICBfX3dhcm5hdHRyICgibWJzbnJ0b3djcyBjYWxsZWQgd2l0aCBkc3QgYnVmZmVyIHNtYWxsZXIgdGhhbiBsZW4gIgorCQkgIiogc2l6ZW9mICh3Y2hhcl90KSIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHNpemVfdAorX19OVEggKG1ic25ydG93Y3MgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsIF9fY29uc3QgY2hhciAqKl9fcmVzdHJpY3QgX19zcmMsCisJCSAgIHNpemVfdCBfX25tYywgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykpCit7CisgIGlmIChfX2JvcyAoX19kc3QpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbGVuKSkKKwlyZXR1cm4gX19tYnNucnRvd2NzX2NoayAoX19kc3QsIF9fc3JjLCBfX25tYywgX19sZW4sIF9fcHMsCisJCQkJIF9fYm9zIChfX2RzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKworICAgICAgaWYgKF9fbGVuID4gX19ib3MgKF9fZHN0KSAvIHNpemVvZiAod2NoYXJfdCkpCisJcmV0dXJuIF9fbWJzbnJ0b3djc19jaGtfd2FybiAoX19kc3QsIF9fc3JjLCBfX25tYywgX19sZW4sIF9fcHMsCisJCQkJICAgICAgX19ib3MgKF9fZHN0KSAvIHNpemVvZiAod2NoYXJfdCkpOworICAgIH0KKyAgcmV0dXJuIF9fbWJzbnJ0b3djc19hbGlhcyAoX19kc3QsIF9fc3JjLCBfX25tYywgX19sZW4sIF9fcHMpOworfQorCisKK2V4dGVybiBzaXplX3QgX193Y3NucnRvbWJzX2NoayAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwKKwkJCQlfX2NvbnN0IHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkJCXNpemVfdCBfX253Yywgc2l6ZV90IF9fbGVuLAorCQkJCW1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzLCBzaXplX3QgX19kc3RsZW4pCisgICAgIF9fVEhST1c7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3djc25ydG9tYnNfYWxpYXMsCisJCQkgICAgICAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX253Yywgc2l6ZV90IF9fbGVuLAorCQkJICAgICAgIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSwgd2NzbnJ0b21icyk7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3djc25ydG9tYnNfY2hrX3dhcm4sCisJCQkgICAgICAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX253Yywgc2l6ZV90IF9fbGVuLAorCQkJICAgICAgIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzLAorCQkJICAgICAgIHNpemVfdCBfX2RzdGxlbiksIF9fd2NzbnJ0b21ic19jaGspCisgICAgIF9fd2FybmF0dHIgKCJ3Y3NucnRvbWJzIGNhbGxlZCB3aXRoIGRzdCBidWZmZXIgc21hbGxlciB0aGFuIGxlbiIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHNpemVfdAorX19OVEggKHdjc25ydG9tYnMgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsIF9fY29uc3Qgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19zcmMsCisJCSAgIHNpemVfdCBfX253Yywgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykpCit7CisgIGlmIChfX2JvcyAoX19kc3QpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbGVuKSkKKwlyZXR1cm4gX193Y3NucnRvbWJzX2NoayAoX19kc3QsIF9fc3JjLCBfX253YywgX19sZW4sIF9fcHMsCisJCQkJIF9fYm9zIChfX2RzdCkpOworCisgICAgICBpZiAoX19sZW4gPiBfX2JvcyAoX19kc3QpKQorCXJldHVybiBfX3djc25ydG9tYnNfY2hrX3dhcm4gKF9fZHN0LCBfX3NyYywgX19ud2MsIF9fbGVuLCBfX3BzLAorCQkJCSAgICAgIF9fYm9zIChfX2RzdCkpOworICAgIH0KKyAgcmV0dXJuIF9fd2NzbnJ0b21ic19hbGlhcyAoX19kc3QsIF9fc3JjLCBfX253YywgX19sZW4sIF9fcHMpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy93b3Jkc2l6ZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvd29yZHNpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDBhMGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMvd29yZHNpemUuaApAQCAtMCwwICsxLDggQEAKKy8qIERldGVybWluZSB0aGUgd29yZHNpemUgZnJvbSB0aGUgcHJlcHJvY2Vzc29yIGRlZmluZXMuICAqLworCisjaWYgZGVmaW5lZCBfX3g4Nl82NF9fCisjIGRlZmluZSBfX1dPUkRTSVpFCTY0CisjIGRlZmluZSBfX1dPUkRTSVpFX0NPTVBBVDMyCTEKKyNlbHNlCisjIGRlZmluZSBfX1dPUkRTSVpFCTMyCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3hvcGVuX2xpbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMveG9wZW5fbGltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YzNjExOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9iaXRzL3hvcGVuX2xpbS5oCkBAIC0wLDAgKzEsMTQ0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTksIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKiBOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseTsgdXNlIDxsaW1pdHMuaD4gaW5zdGVhZC4KKyAqLworCisvKiBBZGRpdGlvbmFsIGRlZmluaXRpb25zIGZyb20gWC9PcGVuIFBvcnRhYmlsaXR5IEd1aWRlLCBJc3N1ZSA0LCBWZXJzaW9uIDIKKyAgIFN5c3RlbSBJbnRlcmZhY2VzIGFuZCBIZWFkZXJzLCA0LjE2IDxsaW1pdHMuaD4KKworICAgUGxlYXNlIG5vdGUgb25seSB0aGUgdmFsdWVzIHdoaWNoIGFyZSBub3QgZ3JlYXRlciB0aGFuIHRoZSBtaW5pbXVtCisgICBzdGF0ZWQgaW4gdGhlIHN0YW5kYXJkIGRvY3VtZW50IGFyZSBsaXN0ZWQuICBUaGUgYHN5c2NvbmYnIGZ1bmN0aW9ucworICAgc2hvdWxkIGJlIHVzZWQgdG8gb2J0YWluIHRoZSBhY3R1YWwgdmFsdWUuICAqLworCisjaWZuZGVmIF9YT1BFTl9MSU1fSAorI2RlZmluZSBfWE9QRU5fTElNX0gJMQorCisjZGVmaW5lIF9fbmVlZF9JT1ZfTUFYCisjaW5jbHVkZSA8Yml0cy9zdGRpb19saW0uaD4KKworLyogV2UgZG8gbm90IHByb3ZpZGUgZml4ZWQgdmFsdWVzIGZvcgorCisgICBBUkdfTUFYCU1heGltdW0gbGVuZ3RoIG9mIGFyZ3VtZW50IHRvIHRoZSBgZXhlYycgZnVuY3Rpb24KKwkJaW5jbHVkaW5nIGVudmlyb25tZW50IGRhdGEuCisKKyAgIEFURVhJVF9NQVgJTWF4aW11bSBudW1iZXIgb2YgZnVuY3Rpb25zIHRoYXQgbWF5IGJlIHJlZ2lzdGVyZWQKKwkJd2l0aCBgYXRleGl0Jy4KKworICAgQ0hJTERfTUFYCU1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBwcm9jZXNzZXMgcGVyIHJlYWwKKwkJdXNlciBJRC4KKworICAgT1BFTl9NQVgJTWF4aW11bSBudW1iZXIgb2YgZmlsZXMgdGhhdCBvbmUgcHJvY2VzcyBjYW4gaGF2ZSBvcGVuCisJCWF0IGFueW9uZSB0aW1lLgorCisgICBQQUdFU0laRQorICAgUEFHRV9TSVpFCVNpemUgb2YgYnl0ZXMgb2YgYSBwYWdlLgorCisgICBQQVNTX01BWAlNYXhpbXVtIG51bWJlciBvZiBzaWduaWZpY2FudCBieXRlcyBpbiBhIHBhc3N3b3JkLgorCisgICBXZSBvbmx5IHByb3ZpZGUgYSBmaXhlZCBsaW1pdCBmb3IKKworICAgSU9WX01BWAlNYXhpbXVtIG51bWJlciBvZiBgaW92ZWMnIHN0cnVjdHVyZXMgdGhhdCBvbmUgcHJvY2VzcyBoYXMKKwkJYXZhaWxhYmxlIGZvciB1c2Ugd2l0aCBgcmVhZHYnIG9yIHdyaXRldicuCisKKyAgIGlmIHRoaXMgaXMgaW5kZWVkIGZpeGVkIGJ5IHRoZSB1bmRlcmx5aW5nIHN5c3RlbS4KKyovCisKKworLyogTWF4aW11bSBudW1iZXIgb2YgYGlvdmVjJyBzdHJ1Y3R1cmVzIHRoYXQgb25lIHByb2Nlc3MgaGFzIGF2YWlsYWJsZQorICAgZm9yIHVzZSB3aXRoIGByZWFkdicgb3Igd3JpdGV2Jy4gICovCisjZGVmaW5lCV9YT1BFTl9JT1ZfTUFYCV9QT1NJWF9VSU9fTUFYSU9WCisKKworLyogTWF4aW11bSB2YWx1ZSBvZiBgZGlnaXQnIGluIGNhbGxzIHRvIHRoZSBgcHJpbnRmJyBhbmQgYHNjYW5mJworICAgZnVuY3Rpb25zLiAgV2UgaGF2ZSBubyBsaW1pdCwgc28gcmV0dXJuIGEgcmVhc29uYWJsZSB2YWx1ZS4gICovCisjZGVmaW5lIE5MX0FSR01BWAlfUE9TSVhfQVJHX01BWAorCisvKiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyBpbiBhIGBMQU5HJyBuYW1lLiAgV2UgaGF2ZSBubyBsaW1pdC4gICovCisjZGVmaW5lIE5MX0xBTkdNQVgJX1BPU0lYMl9MSU5FX01BWAorCisvKiBNYXhpbXVtIG1lc3NhZ2UgbnVtYmVyLiAgV2UgaGF2ZSBubyBsaW1pdC4gICovCisjZGVmaW5lIE5MX01TR01BWAlJTlRfTUFYCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGluIE4tdG8tMSBjb2xsYXRpb24gbWFwcGluZy4gIFdlIGhhdmUgbm8KKyAgIGxpbWl0LiAgKi8KKyNkZWZpbmUgTkxfTk1BWAkJSU5UX01BWAorCisvKiBNYXhpbXVtIHNldCBudW1iZXIuICBXZSBoYXZlIG5vIGxpbWl0LiAgKi8KKyNkZWZpbmUgTkxfU0VUTUFYCUlOVF9NQVgKKworLyogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBtZXNzYWdlLiAgV2UgaGF2ZSBubyBsaW1pdC4gICovCisjZGVmaW5lIE5MX1RFWFRNQVgJSU5UX01BWAorCisvKiBEZWZhdWx0IHByb2Nlc3MgcHJpb3JpdHkuICAqLworI2RlZmluZSBOWkVSTwkJMjAKKworCisvKiBOdW1iZXIgb2YgYml0cyBpbiBhIHdvcmQgb2YgdHlwZSBgaW50Jy4gICovCisjaWZkZWYgSU5UX01BWAorIyBpZiBJTlRfTUFYID09IDMyNzY3CisjICBkZWZpbmUgV09SRF9CSVQJMTYKKyMgZWxzZQorIyAgaWYgSU5UX01BWCA9PSAyMTQ3NDgzNjQ3CisjICAgZGVmaW5lIFdPUkRfQklUCTMyCisjICBlbHNlCisvKiBTYWZlIGFzc3VtcHRpb24uICAqLworIyAgIGRlZmluZSBXT1JEX0JJVAk2NAorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbGlmIGRlZmluZWQgX19JTlRfTUFYX18KKyMgaWYgX19JTlRfTUFYX18gPT0gMzI3NjcKKyMgIGRlZmluZSBXT1JEX0JJVAkxNgorIyBlbHNlCisjICBpZiBfX0lOVF9NQVhfXyA9PSAyMTQ3NDgzNjQ3CisjICAgZGVmaW5lIFdPUkRfQklUCTMyCisjICBlbHNlCisvKiBTYWZlIGFzc3VtcHRpb24uICAqLworIyAgIGRlZmluZSBXT1JEX0JJVAk2NAorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBXT1JEX0JJVAkzMgorI2VuZGlmCisKKy8qIE51bWJlciBvZiBiaXRzIGluIGEgd29yZCBvZiB0eXBlIGBsb25nIGludCcuICAqLworI2lmZGVmIExPTkdfTUFYCisjIGlmIExPTkdfTUFYID09IDIxNDc0ODM2NDcKKyMgIGRlZmluZSBMT05HX0JJVAkzMgorIyBlbHNlCisvKiBTYWZlIGFzc3VtcHRpb24uICAqLworIyAgZGVmaW5lIExPTkdfQklUCTY0CisjIGVuZGlmCisjZWxpZiBkZWZpbmVkIF9fTE9OR19NQVhfXworIyBpZiBfX0xPTkdfTUFYX18gPT0gMjE0NzQ4MzY0NworIyAgZGVmaW5lIExPTkdfQklUCTMyCisjIGVsc2UKKy8qIFNhZmUgYXNzdW1wdGlvbi4gICovCisjICBkZWZpbmUgTE9OR19CSVQJNjQKKyMgZW5kaWYKKyNlbHNlCisjIGluY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKyMgaWYgX19XT1JEU0laRSA9PSA2NAorIyAgZGVmaW5lIExPTkdfQklUCTY0CisjIGVsc2UKKyMgIGRlZmluZSBMT05HX0JJVAkzMgorIyBlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBiaXRzL3hvcGVuX2xpbS5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYml0cy94dGl0eXBlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMveHRpdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjhiNjk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2JpdHMveHRpdHlwZXMuaApAQCAtMCwwICsxLDM0IEBACisvKiBiaXRzL3h0aXR5cGVzLmggLS0gRGVmaW5lIHNvbWUgdHlwZXMgdXNlZCBieSA8Yml0cy9zdHJvcHRzLmg+LiAgeDg2LTY0LgorICAgQ29weXJpZ2h0IChDKSAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVFJPUFRTX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMveHRpdHlwZXMuaD4gZGlyZWN0bHk7IHVzZSA8c3Ryb3B0cy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9CSVRTX1hUSVRZUEVTX0gKKyNkZWZpbmUgX0JJVFNfWFRJVFlQRVNfSAkxCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKy8qIFRoaXMgdHlwZSBpcyB1c2VkIGJ5IHNvbWUgc3RydWN0cyBpbiA8Yml0cy9zdHJvcHRzLmg+LiAgKi8KK3R5cGVkZWYgX19TTE9ORzMyX1RZUEUgX190X3NjYWxhcl90OwordHlwZWRlZiBfX1VMT05HMzJfVFlQRSBfX3RfdXNjYWxhcl90OworCisKKyNlbmRpZiAvKiBiaXRzL3h0aXR5cGVzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9mcHVfY29udHJvbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2ZwdV9jb250cm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VhZTQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9mcHVfY29udHJvbC5oCkBAIC0wLDAgKzEsMTAxIEBACisvKiBGUFUgY29udHJvbCB3b3JkIGJpdHMuICB4ODYtNjQgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5MywxOTk1LDE5OTYsMTk5NywxOTk4LDIwMDAsMjAwMSwyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgICBDb250cmlidXRlZCBieSBPbGFmIEZsZWJiZS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0ZQVV9DT05UUk9MX0gKKyNkZWZpbmUgX0ZQVV9DT05UUk9MX0gJMQorCisvKiBOb3RlIHRoYXQgdGhpcyBmaWxlIHNldHMgb24geDg2LTY0IG9ubHkgdGhlIHg4NyBGUFUsIGl0IGRvZXMgbm90CisgICB0b3VjaCB0aGUgU1NFIHVuaXQuICAqLworCisvKiBIZXJlIGlzIHRoZSBkaXJ0eSBwYXJ0LiBTZXQgdXAgeW91ciAzODcgdGhyb3VnaCB0aGUgY29udHJvbCB3b3JkCisgKiAoY3cpIHJlZ2lzdGVyLgorICoKKyAqICAgICAxNS0xMyAgICAxMiAgMTEtMTAgIDktOCAgICAgNy02ICAgICA1ICAgIDQgICAgMyAgICAyICAgIDEgICAgMAorICogfCByZXNlcnZlZCB8IElDIHwgUkMgIHwgUEMgfCByZXNlcnZlZCB8IFBNIHwgVU0gfCBPTSB8IFpNIHwgRE0gfCBJTQorICoKKyAqIElNOiBJbnZhbGlkIG9wZXJhdGlvbiBtYXNrCisgKiBETTogRGVub3JtYWxpemVkIG9wZXJhbmQgbWFzaworICogWk06IFplcm8tZGl2aWRlIG1hc2sKKyAqIE9NOiBPdmVyZmxvdyBtYXNrCisgKiBVTTogVW5kZXJmbG93IG1hc2sKKyAqIFBNOiBQcmVjaXNpb24gKGluZXhhY3QgcmVzdWx0KSBtYXNrCisgKgorICogTWFzayBiaXQgaXMgMSBtZWFucyBubyBpbnRlcnJ1cHQuCisgKgorICogUEM6IFByZWNpc2lvbiBjb250cm9sCisgKiAxMSAtIHJvdW5kIHRvIGV4dGVuZGVkIHByZWNpc2lvbgorICogMTAgLSByb3VuZCB0byBkb3VibGUgcHJlY2lzaW9uCisgKiAwMCAtIHJvdW5kIHRvIHNpbmdsZSBwcmVjaXNpb24KKyAqCisgKiBSQzogUm91bmRpbmcgY29udHJvbAorICogMDAgLSByb3VuZGluZyB0byBuZWFyZXN0CisgKiAwMSAtIHJvdW5kaW5nIGRvd24gKHRvd2FyZCAtIGluZmluaXR5KQorICogMTAgLSByb3VuZGluZyB1cCAodG93YXJkICsgaW5maW5pdHkpCisgKiAxMSAtIHJvdW5kaW5nIHRvd2FyZCB6ZXJvCisgKgorICogSUM6IEluZmluaXR5IGNvbnRyb2wKKyAqIFRoYXQgaXMgZm9yIDgwODcgYW5kIDgwMjg3IG9ubHkuCisgKgorICogVGhlIGhhcmR3YXJlIGRlZmF1bHQgaXMgMHgwMzdmIHdoaWNoIHdlIHVzZS4KKyAqLworCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogbWFza2luZyBvZiBpbnRlcnJ1cHRzICovCisjZGVmaW5lIF9GUFVfTUFTS19JTSAgMHgwMQorI2RlZmluZSBfRlBVX01BU0tfRE0gIDB4MDIKKyNkZWZpbmUgX0ZQVV9NQVNLX1pNICAweDA0CisjZGVmaW5lIF9GUFVfTUFTS19PTSAgMHgwOAorI2RlZmluZSBfRlBVX01BU0tfVU0gIDB4MTAKKyNkZWZpbmUgX0ZQVV9NQVNLX1BNICAweDIwCisKKy8qIHByZWNpc2lvbiBjb250cm9sICovCisjZGVmaW5lIF9GUFVfRVhURU5ERUQgMHgzMDAJLyogbGlibSByZXF1aXJlcyBkb3VibGUgZXh0ZW5kZWQgcHJlY2lzaW9uLiAgKi8KKyNkZWZpbmUgX0ZQVV9ET1VCTEUgICAweDIwMAorI2RlZmluZSBfRlBVX1NJTkdMRSAgIDB4MAorCisvKiByb3VuZGluZyBjb250cm9sICovCisjZGVmaW5lIF9GUFVfUkNfTkVBUkVTVCAweDAgICAgLyogUkVDT01NRU5ERUQgKi8KKyNkZWZpbmUgX0ZQVV9SQ19ET1dOICAgIDB4NDAwCisjZGVmaW5lIF9GUFVfUkNfVVAgICAgICAweDgwMAorI2RlZmluZSBfRlBVX1JDX1pFUk8gICAgMHhDMDAKKworI2RlZmluZSBfRlBVX1JFU0VSVkVEIDB4RjBDMCAgLyogUmVzZXJ2ZWQgYml0cyBpbiBjdyAqLworCisKKy8qIFRoZSBmZGxpYm0gY29kZSByZXF1aXJlcyBzdHJpY3QgSUVFRSBkb3VibGUgcHJlY2lzaW9uIGFyaXRobWV0aWMsCisgICBhbmQgbm8gaW50ZXJydXB0cyBmb3IgZXhjZXB0aW9ucywgcm91bmRpbmcgdG8gbmVhcmVzdC4gICovCisKKyNkZWZpbmUgX0ZQVV9ERUZBVUxUICAweDAzN2YKKworLyogSUVFRTogIHNhbWUgYXMgYWJvdmUuICAqLworI2RlZmluZSBfRlBVX0lFRUUgICAgIDB4MDM3ZgorCisvKiBUeXBlIG9mIHRoZSBjb250cm9sIHdvcmQuICAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgZnB1X2NvbnRyb2xfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fSElfXykpKTsKKworLyogTWFjcm9zIGZvciBhY2Nlc3NpbmcgdGhlIGhhcmR3YXJlIGNvbnRyb2wgd29yZC4gICovCisjZGVmaW5lIF9GUFVfR0VUQ1coY3cpIF9fYXNtX18gKCJmbnN0Y3cgJTAiIDogIj1tIiAoKiZjdykpCisjZGVmaW5lIF9GUFVfU0VUQ1coY3cpIF9fYXNtX18gKCJmbGRjdyAlMCIgOiA6ICJtIiAoKiZjdykpCisKKy8qIERlZmF1bHQgY29udHJvbCB3b3JkIHNldCBhdCBzdGFydHVwLiAgKi8KK2V4dGVybiBmcHVfY29udHJvbF90IF9fZnB1X2NvbnRyb2w7CisKKyNlbmRpZgkvKiBmcHVfY29udHJvbC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvZ251L2xpYi1uYW1lcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2dudS9saWItbmFtZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODcyZjIwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2dudS9saWItbmFtZXMuaApAQCAtMCwwICsxLDYxIEBACisvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuCisgICBJdCBkZWZpbmVzIG1hY3JvcyB0byBhbGxvdyB1c2VyIHByb2dyYW0gdG8gZmluZCB0aGUgc2hhcmVkCisgICBsaWJyYXJ5IGZpbGVzIHdoaWNoIGNvbWUgYXMgcGFydCBvZiBHTlUgbGliYy4gICovCisjaWZuZGVmIF9fR05VX0xJQl9OQU1FU19ICisjZGVmaW5lIF9fR05VX0xJQl9OQU1FU19ICTEKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworI2lmIF9fV09SRFNJWkUgPT0gMzIKKyMgZGVmaW5lIExEX0xJTlVYX1NPICAgICAgICAgICAgICAgICAgICAibGQtbGludXguc28uMiIKKyMgZGVmaW5lIExEX1NPICAgICAgICAgICAgICAgICAgICAgICAgICAibGQtbGludXguc28uMiIKKyMgZGVmaW5lIExJQkFOTF9TTyAgICAgICAgICAgICAgICAgICAgICAibGliYW5sLnNvLjEiCisjIGRlZmluZSBMSUJCUk9LRU5MT0NBTEVfU08gICAgICAgICAgICAgImxpYkJyb2tlbkxvY2FsZS5zby4xIgorIyBkZWZpbmUgTElCQ0lETl9TTyAgICAgICAgICAgICAgICAgICAgICJsaWJjaWRuLnNvLjEiCisjIGRlZmluZSBMSUJDUllQVF9TTyAgICAgICAgICAgICAgICAgICAgImxpYmNyeXB0LnNvLjEiCisjIGRlZmluZSBMSUJDX1NPICAgICAgICAgICAgICAgICAgICAgICAgImxpYmMuc28uNiIKKyMgZGVmaW5lIExJQkRMX1NPICAgICAgICAgICAgICAgICAgICAgICAibGliZGwuc28uMiIKKyMgZGVmaW5lIExJQk1fU08gICAgICAgICAgICAgICAgICAgICAgICAibGlibS5zby42IgorIyBkZWZpbmUgTElCTlNMX1NPICAgICAgICAgICAgICAgICAgICAgICJsaWJuc2wuc28uMSIKKyMgZGVmaW5lIExJQk5TU19DT01QQVRfU08gICAgICAgICAgICAgICAibGlibnNzX2NvbXBhdC5zby4yIgorIyBkZWZpbmUgTElCTlNTX0RCX1NPICAgICAgICAgICAgICAgICAgICJsaWJuc3NfZGIuc28uMiIKKyMgZGVmaW5lIExJQk5TU19ETlNfU08gICAgICAgICAgICAgICAgICAibGlibnNzX2Rucy5zby4yIgorIyBkZWZpbmUgTElCTlNTX0ZJTEVTX1NPICAgICAgICAgICAgICAgICJsaWJuc3NfZmlsZXMuc28uMiIKKyMgZGVmaW5lIExJQk5TU19IRVNJT0RfU08gICAgICAgICAgICAgICAibGlibnNzX2hlc2lvZC5zby4yIgorIyBkZWZpbmUgTElCTlNTX0xEQVBfU08gICAgICAgICAgICAgICAgICJsaWJuc3NfbGRhcC5zby4yIgorIyBkZWZpbmUgTElCTlNTX05JU1BMVVNfU08gICAgICAgICAgICAgICJsaWJuc3NfbmlzcGx1cy5zby4yIgorIyBkZWZpbmUgTElCTlNTX05JU19TTyAgICAgICAgICAgICAgICAgICJsaWJuc3NfbmlzLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfVEVTVDFfU08gICAgICAgICAgICAgICAgImxpYm5zc190ZXN0MS5zby4yIgorIyBkZWZpbmUgTElCUFRIUkVBRF9TTyAgICAgICAgICAgICAgICAgICJsaWJwdGhyZWFkLnNvLjAiCisjIGRlZmluZSBMSUJSRVNPTFZfU08gICAgICAgICAgICAgICAgICAgImxpYnJlc29sdi5zby4yIgorIyBkZWZpbmUgTElCUlRfU08gICAgICAgICAgICAgICAgICAgICAgICJsaWJydC5zby4xIgorIyBkZWZpbmUgTElCVEhSRUFEX0RCX1NPICAgICAgICAgICAgICAgICJsaWJ0aHJlYWRfZGIuc28uMSIKKyMgZGVmaW5lIExJQlVUSUxfU08gICAgICAgICAgICAgICAgICAgICAibGlidXRpbC5zby4xIgorI2Vsc2UKKyMgZGVmaW5lIExEX0xJTlVYX1g4Nl82NF9TTyAgICAgICAgICAgICAibGQtbGludXgteDg2LTY0LnNvLjIiCisjIGRlZmluZSBMRF9TTyAgICAgICAgICAgICAgICAgICAgICAgICAgImxkLWxpbnV4LXg4Ni02NC5zby4yIgorIyBkZWZpbmUgTElCQU5MX1NPICAgICAgICAgICAgICAgICAgICAgICJsaWJhbmwuc28uMSIKKyMgZGVmaW5lIExJQkJST0tFTkxPQ0FMRV9TTyAgICAgICAgICAgICAibGliQnJva2VuTG9jYWxlLnNvLjEiCisjIGRlZmluZSBMSUJDSUROX1NPICAgICAgICAgICAgICAgICAgICAgImxpYmNpZG4uc28uMSIKKyMgZGVmaW5lIExJQkNSWVBUX1NPICAgICAgICAgICAgICAgICAgICAibGliY3J5cHQuc28uMSIKKyMgZGVmaW5lIExJQkNfU08gICAgICAgICAgICAgICAgICAgICAgICAibGliYy5zby42IgorIyBkZWZpbmUgTElCRExfU08gICAgICAgICAgICAgICAgICAgICAgICJsaWJkbC5zby4yIgorIyBkZWZpbmUgTElCTV9TTyAgICAgICAgICAgICAgICAgICAgICAgICJsaWJtLnNvLjYiCisjIGRlZmluZSBMSUJOU0xfU08gICAgICAgICAgICAgICAgICAgICAgImxpYm5zbC5zby4xIgorIyBkZWZpbmUgTElCTlNTX0NPTVBBVF9TTyAgICAgICAgICAgICAgICJsaWJuc3NfY29tcGF0LnNvLjIiCisjIGRlZmluZSBMSUJOU1NfREJfU08gICAgICAgICAgICAgICAgICAgImxpYm5zc19kYi5zby4yIgorIyBkZWZpbmUgTElCTlNTX0ROU19TTyAgICAgICAgICAgICAgICAgICJsaWJuc3NfZG5zLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfRklMRVNfU08gICAgICAgICAgICAgICAgImxpYm5zc19maWxlcy5zby4yIgorIyBkZWZpbmUgTElCTlNTX0hFU0lPRF9TTyAgICAgICAgICAgICAgICJsaWJuc3NfaGVzaW9kLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfTERBUF9TTyAgICAgICAgICAgICAgICAgImxpYm5zc19sZGFwLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfTklTUExVU19TTyAgICAgICAgICAgICAgImxpYm5zc19uaXNwbHVzLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfTklTX1NPICAgICAgICAgICAgICAgICAgImxpYm5zc19uaXMuc28uMiIKKyMgZGVmaW5lIExJQk5TU19URVNUMV9TTyAgICAgICAgICAgICAgICAibGlibnNzX3Rlc3QxLnNvLjIiCisjIGRlZmluZSBMSUJQVEhSRUFEX1NPICAgICAgICAgICAgICAgICAgImxpYnB0aHJlYWQuc28uMCIKKyMgZGVmaW5lIExJQlJFU09MVl9TTyAgICAgICAgICAgICAgICAgICAibGlicmVzb2x2LnNvLjIiCisjIGRlZmluZSBMSUJSVF9TTyAgICAgICAgICAgICAgICAgICAgICAgImxpYnJ0LnNvLjEiCisjIGRlZmluZSBMSUJUSFJFQURfREJfU08gICAgICAgICAgICAgICAgImxpYnRocmVhZF9kYi5zby4xIgorIyBkZWZpbmUgTElCVVRJTF9TTyAgICAgICAgICAgICAgICAgICAgICJsaWJ1dGlsLnNvLjEiCisjZW5kaWYKKworI2VuZGlmCS8qIGdudS9saWItbmFtZXMuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2dudS9saWJjLXZlcnNpb24uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9nbnUvbGliYy12ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcwNzFmZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9nbnUvbGliYy12ZXJzaW9uLmgKQEAgLTAsMCArMSwzNSBAQAorLyogSW50ZXJmYWNlIHRvIEdOVSBsaWJjIHNwZWNpZmljIGZ1bmN0aW9ucyBmb3IgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfR05VX0xJQkNfVkVSU0lPTl9ICisjZGVmaW5lCV9HTlVfTElCQ19WRVJTSU9OX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBSZXR1cm4gc3RyaW5nIGRlc2NyaWJpbmcgcmVsZWFzZSBzdGF0dXMgb2YgY3VycmVudGx5IHJ1bm5pbmcgR05VIGxpYmMuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmdudV9nZXRfbGliY19yZWxlYXNlICh2b2lkKSBfX1RIUk9XOworCisvKiBSZXR1cm4gc3RyaW5nIGRlc2NyaWJpbmcgdmVyc2lvbiBvZiBjdXJyZW50bHkgcnVubmluZyBHTlUgbGliYy4gICovCitleHRlcm4gY29uc3QgY2hhciAqZ251X2dldF9saWJjX3ZlcnNpb24gKHZvaWQpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBnbnUvbGliYy12ZXJzaW9uLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9nbnUvb3B0aW9uLWdyb3Vwcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2dudS9vcHRpb24tZ3JvdXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkNmQ0OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9nbnUvb3B0aW9uLWdyb3Vwcy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBzY3JpcHRzL29wdGlvbi1ncm91cHMuYXdrCisgICBpbiB0aGUgRUdMSUJDIHNvdXJjZSB0cmVlLgorCisgICBJdCBkZWZpbmVzIG1hY3JvcyB0aGF0IGluZGljYXRlIHdoaWNoIEVHTElCQyBvcHRpb24gZ3JvdXBzIHdlcmUKKyAgIGNvbmZpZ3VyZWQgaW4gJ29wdGlvbi1ncm91cHMuY29uZmlnJyB3aGVuIHRoaXMgQyBsaWJyYXJ5IHdhcworICAgYnVpbHQuICBGb3IgZWFjaCBvcHRpb24gZ3JvdXAgbmFtZWQgT1BUSU9OX2ZvbywgaXQgI2RlZmluZXMKKyAgIF9fT1BUSU9OX2ZvbyB0byBiZSAxIGlmIHRoZSBncm91cCBpcyBlbmFibGVkLCBvciBsZWF2ZXMgdGhhdAorICAgc3ltYm9sIHVuZGVmaW5lZCBpZiB0aGUgZ3JvdXAgaXMgZGlzYWJsZWQuICAqLworCisjaWZuZGVmIF9fR05VX09QVElPTl9HUk9VUFNfSAorI2RlZmluZSBfX0dOVV9PUFRJT05fR1JPVVBTX0gKKworI2RlZmluZSBfX09QVElPTl9FR0xJQkNfQURWQU5DRURfSU5FVDYgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfQkFDS1RSQUNFIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0JJR19NQUNST1MgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfQlNEIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0NBVEdFVFMgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfQ0hBUlNFVFMgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfQ1JZUFQgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfQ1JZUFRfVUZDIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0NYWF9URVNUUyAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19EQl9BTElBU0VTIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0VOVlogMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfRkNWVCAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19GTVRNU0cgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfRlNUQUIgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfRlRSQVZFUlNFIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0dFVExPR0lOIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0lETiAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19JTkVUIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0lORVRfQU5MIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX0xJQk0gMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfTElCTV9CSUcgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfTE9DQUxFUyAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19MT0NBTEVfQ09ERSAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19NRU1VU0FHRSAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19OSVMgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfTlNTV0lUQ0ggMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfUkNNRCAxCisjZGVmaW5lIF9fT1BUSU9OX0VHTElCQ19SVExEX0RFQlVHIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX1NQQVdOIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX1NUUkVBTVMgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfU1VOUlBDIDEKKyNkZWZpbmUgX19PUFRJT05fRUdMSUJDX1VUTVAgMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfVVRNUFggMQorI2RlZmluZSBfX09QVElPTl9FR0xJQkNfV09SREVYUCAxCisjZGVmaW5lIF9fT1BUSU9OX1BPU0lYX0NfTEFOR19XSURFX0NIQVIgMQorI2RlZmluZSBfX09QVElPTl9QT1NJWF9SRUdFWFAgMQorI2RlZmluZSBfX09QVElPTl9QT1NJWF9SRUdFWFBfR0xJQkMgMQorI2RlZmluZSBfX09QVElPTl9QT1NJWF9XSURFX0NIQVJfREVWSUNFX0lPIDEKKworI2VuZGlmIC8qIF9fR05VX09QVElPTl9HUk9VUFNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2dudS9zdHVicy02NC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2dudS9zdHVicy02NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZTRlNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvZ251L3N0dWJzLTY0LmgKQEAgLTAsMCArMSwyMyBAQAorLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLgorICAgSXQgZGVmaW5lcyBhIHN5bWJvbCBgX19zdHViX0ZVTkNUSU9OJyBmb3IgZWFjaCBmdW5jdGlvbgorICAgaW4gdGhlIEMgbGlicmFyeSB3aGljaCBpcyBhIHN0dWIsIG1lYW5pbmcgaXQgd2lsbCBmYWlsCisgICBldmVyeSB0aW1lIGNhbGxlZCwgdXN1YWxseSBzZXR0aW5nIGVycm5vIHRvIEVOT1NZUy4gICovCisKKyNpZmRlZiBfTElCQworIyBlcnJvciBBcHBsaWNhdGlvbnMgbWF5IG5vdCBkZWZpbmUgdGhlIG1hY3JvIF9MSUJDCisjZW5kaWYKKworI2RlZmluZSBfX3N0dWJfYmRmbHVzaAorI2RlZmluZSBfX3N0dWJfY2hmbGFncworI2RlZmluZSBfX3N0dWJfZmF0dGFjaAorI2RlZmluZSBfX3N0dWJfZmNoZmxhZ3MKKyNkZWZpbmUgX19zdHViX2ZkZXRhY2gKKyNkZWZpbmUgX19zdHViX2dldG1zZworI2RlZmluZSBfX3N0dWJfZ3R0eQorI2RlZmluZSBfX3N0dWJfbGNobW9kCisjZGVmaW5lIF9fc3R1Yl9wdXRtc2cKKyNkZWZpbmUgX19zdHViX3Jldm9rZQorI2RlZmluZSBfX3N0dWJfc2V0bG9naW4KKyNkZWZpbmUgX19zdHViX3NpZ3JldHVybgorI2RlZmluZSBfX3N0dWJfc3N0aworI2RlZmluZSBfX3N0dWJfc3R0eQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2dudS9zdHVicy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L2dudS9zdHVicy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMDg2YmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvZ251L3N0dWJzLmgKQEAgLTAsMCArMSwxMiBAQAorLyogVGhpcyBmaWxlIHNlbGVjdHMgdGhlIHJpZ2h0IGdlbmVyYXRlZCBmaWxlIG9mIGBfX3N0dWJfRlVOQ1RJT04nIG1hY3JvcworICAgYmFzZWQgb24gdGhlIGFyY2hpdGVjdHVyZSBiZWluZyBjb21waWxlZCBmb3IuICAqLworCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjaWYgX19XT1JEU0laRSA9PSAzMgorIyBpbmNsdWRlIDxnbnUvc3R1YnMtMzIuaD4KKyNlbGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgaW5jbHVkZSA8Z251L3N0dWJzLTY0Lmg+CisjZWxzZQorIyBlcnJvciAidW5leHBlY3RlZCB2YWx1ZSBmb3IgX19XT1JEU0laRSBtYWNybyIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9hY2N0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2FjY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2M2M2ViCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9hY2N0LmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX0FDQ1RfSAorI2RlZmluZSBfU1lTX0FDQ1RfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8ZW5kaWFuLmg+CisjZGVmaW5lCV9fbmVlZF90aW1lX3QKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2RlZmluZSBBQ0NUX0NPTU0gMTYKKworLyoKKyAgY29tcF90IGlzIGEgMTYtYml0ICJmbG9hdGluZyIgcG9pbnQgbnVtYmVyIHdpdGggYSAzLWJpdCBiYXNlIDgKKyAgZXhwb25lbnQgYW5kIGEgMTMtYml0IGZyYWN0aW9uLiBTZWUgbGludXgva2VybmVsL2FjY3QuYyBmb3IgdGhlCisgIHNwZWNpZmljIGVuY29kaW5nIHN5c3RlbSB1c2VkLgorKi8KKwordHlwZWRlZiB1X2ludDE2X3QgY29tcF90OworCitzdHJ1Y3QgYWNjdAoreworICBjaGFyIGFjX2ZsYWc7CQkJLyogRmxhZ3MuICAqLworICB1X2ludDE2X3QgYWNfdWlkOwkJLyogUmVhbCB1c2VyIElELiAgKi8KKyAgdV9pbnQxNl90IGFjX2dpZDsJCS8qIFJlYWwgZ3JvdXAgSUQuICAqLworICB1X2ludDE2X3QgYWNfdHR5OwkJLyogQ29udHJvbGxpbmcgdGVybWluYWwuICAqLworICB1X2ludDMyX3QgYWNfYnRpbWU7CQkvKiBCZWdpbm5pbmcgdGltZS4gICovCisgIGNvbXBfdCBhY191dGltZTsJCS8qIFVzZXIgdGltZS4gICovCisgIGNvbXBfdCBhY19zdGltZTsJCS8qIFN5c3RlbSB0aW1lLiAgKi8KKyAgY29tcF90IGFjX2V0aW1lOwkJLyogRWxhcHNlZCB0aW1lLiAgKi8KKyAgY29tcF90IGFjX21lbTsJCS8qIEF2ZXJhZ2UgbWVtb3J5IHVzYWdlLiAgKi8KKyAgY29tcF90IGFjX2lvOwkJCS8qIENoYXJzIHRyYW5zZmVycmVkLiAgKi8KKyAgY29tcF90IGFjX3J3OwkJCS8qIEJsb2NrcyByZWFkIG9yIHdyaXR0ZW4uICAqLworICBjb21wX3QgYWNfbWluZmx0OwkJLyogTWlub3IgcGFnZWZhdWx0cy4gICovCisgIGNvbXBfdCBhY19tYWpmbHQ7CQkvKiBNYWpvciBwYWdlZmF1bHRzLiAgKi8KKyAgY29tcF90IGFjX3N3YXBzOwkJLyogTnVtYmVyIG9mIHN3YXBzLiAgKi8KKyAgdV9pbnQzMl90IGFjX2V4aXRjb2RlOwkvKiBQcm9jZXNzIGV4aXRjb2RlLiAgKi8KKyAgY2hhciBhY19jb21tW0FDQ1RfQ09NTSsxXTsJLyogQ29tbWFuZCBuYW1lLiAgKi8KKyAgY2hhciBhY19wYWRbMTBdOwkJLyogUGFkZGluZyBieXRlcy4gICovCit9OworCisKK3N0cnVjdCBhY2N0X3YzCit7CisgIGNoYXIgYWNfZmxhZzsJCQkvKiBGbGFncyAqLworICBjaGFyIGFjX3ZlcnNpb247CQkvKiBBbHdheXMgc2V0IHRvIEFDQ1RfVkVSU0lPTiAqLworICB1X2ludDE2X3QgYWNfdHR5OwkJLyogQ29udHJvbCBUZXJtaW5hbCAqLworICB1X2ludDMyX3QgYWNfZXhpdGNvZGU7CS8qIEV4aXRjb2RlICovCisgIHVfaW50MzJfdCBhY191aWQ7CQkvKiBSZWFsIFVzZXIgSUQgKi8KKyAgdV9pbnQzMl90IGFjX2dpZDsJCS8qIFJlYWwgR3JvdXAgSUQgKi8KKyAgdV9pbnQzMl90IGFjX3BpZDsJCS8qIFByb2Nlc3MgSUQgKi8KKyAgdV9pbnQzMl90IGFjX3BwaWQ7CQkvKiBQYXJlbnQgUHJvY2VzcyBJRCAqLworICB1X2ludDMyX3QgYWNfYnRpbWU7CQkvKiBQcm9jZXNzIENyZWF0aW9uIFRpbWUgKi8KKyAgZmxvYXQgYWNfZXRpbWU7CQkvKiBFbGFwc2VkIFRpbWUgKi8KKyAgY29tcF90IGFjX3V0aW1lOwkJLyogVXNlciBUaW1lICovCisgIGNvbXBfdCBhY19zdGltZTsJCS8qIFN5c3RlbSBUaW1lICovCisgIGNvbXBfdCBhY19tZW07CQkvKiBBdmVyYWdlIE1lbW9yeSBVc2FnZSAqLworICBjb21wX3QgYWNfaW87CQkJLyogQ2hhcnMgVHJhbnNmZXJyZWQgKi8KKyAgY29tcF90IGFjX3J3OwkJCS8qIEJsb2NrcyBSZWFkIG9yIFdyaXR0ZW4gKi8KKyAgY29tcF90IGFjX21pbmZsdDsJCS8qIE1pbm9yIFBhZ2VmYXVsdHMgKi8KKyAgY29tcF90IGFjX21hamZsdDsJCS8qIE1ham9yIFBhZ2VmYXVsdHMgKi8KKyAgY29tcF90IGFjX3N3YXBzOwkJLyogTnVtYmVyIG9mIFN3YXBzICovCisgIGNoYXIgYWNfY29tbVtBQ0NUX0NPTU1dOwkvKiBDb21tYW5kIE5hbWUgKi8KK307CisKKworZW51bQorICB7CisgICAgQUZPUksgPSAweDAxLAkJLyogSGFzIGV4ZWN1dGVkIGZvcmssIGJ1dCBubyBleGVjLiAgKi8KKyAgICBBU1UgPSAweDAyLAkJCS8qIFVzZWQgc3VwZXItdXNlciBwcml2aWxlZ2VzLiAgKi8KKyAgICBBQ09SRSA9IDB4MDgsCQkvKiBEdW1wZWQgY29yZS4gICovCisgICAgQVhTSUcgPSAweDEwCQkvKiBLaWxsZWQgYnkgYSBzaWduYWwuICAqLworICB9OworCisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorIyBkZWZpbmUgQUNDVF9CWVRFT1JERVIgMHg4MAkvKiBBY2NvdW50aW5nIGZpbGUgaXMgYmlnIGVuZGlhbi4gICovCisjZWxzZQorIyBkZWZpbmUgQUNDVF9CWVRFT1JERVIgMHgwMAkvKiBBY2NvdW50aW5nIGZpbGUgaXMgbGl0dGxlIGVuZGlhbi4gICovCisjZW5kaWYKKworI2RlZmluZSBBSFogICAgIDEwMAorCisKKy8qIFN3aXRjaCBwcm9jZXNzIGFjY291bnRpbmcgb24gYW5kIG9mZi4gICovCitleHRlcm4gaW50IGFjY3QgKF9fY29uc3QgY2hhciAqX19maWxlbmFtZSkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHN5cy9hY2N0LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvYml0eXBlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9iaXR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5ODYwZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvYml0eXBlcy5oCkBAIC0wLDAgKzEsMyBAQAorLyogVGhlIEdOVSA8c3lzL3R5cGVzLmg+IGRlZmluZXMgYWxsIHRoZSBuZWNlc3NhcnkgdHlwZXMuICAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2NkZWZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2NkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg1NmU4NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvY2RlZnMuaApAQCAtMCwwICsxLDQxMiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkyLTIwMDEsIDIwMDIsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfQ0RFRlNfSAorI2RlZmluZQlfU1lTX0NERUZTX0gJMQorCisvKiBXZSBhcmUgYWxtb3N0IGFsd2F5cyBpbmNsdWRlZCBmcm9tIGZlYXR1cmVzLmguICovCisjaWZuZGVmIF9GRUFUVVJFU19ICisjIGluY2x1ZGUgPGZlYXR1cmVzLmg+CisjZW5kaWYKKworLyogVGhlIEdOVSBsaWJjIGRvZXMgbm90IHN1cHBvcnQgYW55IEsmUiBjb21waWxlcnMgb3IgdGhlIHRyYWRpdGlvbmFsIG1vZGUKKyAgIG9mIElTTyBDIGNvbXBpbGVycyBhbnltb3JlLiAgQ2hlY2sgZm9yIHNvbWUgb2YgdGhlIGNvbWJpbmF0aW9ucyBub3QKKyAgIGFueW1vcmUgc3VwcG9ydGVkLiAgKi8KKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmICFkZWZpbmVkIF9fU1REQ19fCisjIGVycm9yICJZb3UgbmVlZCBhIElTTyBDIGNvbmZvcm1pbmcgY29tcGlsZXIgdG8gdXNlIHRoZSBnbGliYyBoZWFkZXJzIgorI2VuZGlmCisKKy8qIFNvbWUgdXNlciBoZWFkZXIgZmlsZSBtaWdodCBoYXZlIGRlZmluZWQgdGhpcyBiZWZvcmUuICAqLworI3VuZGVmCV9fUAorI3VuZGVmCV9fUE1UCisKKyNpZmRlZiBfX0dOVUNfXworCisvKiBBbGwgZnVuY3Rpb25zLCBleGNlcHQgdGhvc2Ugd2l0aCBjYWxsYmFja3Mgb3IgdGhvc2UgdGhhdAorICAgc3luY2hyb25pemUgbWVtb3J5LCBhcmUgbGVhZiBmdW5jdGlvbnMuICAqLworIyBpZiBfX0dOVUNfUFJFUkVRICg0LCA2KSAmJiAhZGVmaW5lZCBfTElCQworIyAgZGVmaW5lIF9fTEVBRiAsIF9fbGVhZl9fCisjICBkZWZpbmUgX19MRUFGX0FUVFIgX19hdHRyaWJ1dGVfXyAoKF9fbGVhZl9fKSkKKyMgZWxzZQorIyAgZGVmaW5lIF9fTEVBRgorIyAgZGVmaW5lIF9fTEVBRl9BVFRSCisjIGVuZGlmCisKKy8qIEdDQyBjYW4gYWx3YXlzIGdyb2sgcHJvdG90eXBlcy4gIEZvciBDKysgcHJvZ3JhbXMgd2UgYWRkIHRocm93KCkKKyAgIHRvIGhlbHAgaXQgb3B0aW1pemUgdGhlIGZ1bmN0aW9uIGNhbGxzLiAgQnV0IHRoaXMgd29ya3Mgb25seSB3aXRoCisgICBnY2MgMi44LnggYW5kIGVnY3MuICBGb3IgZ2NjIDMuMiBhbmQgdXAgd2UgZXZlbiBtYXJrIEMgZnVuY3Rpb25zCisgICBhcyBub24tdGhyb3dpbmcgdXNpbmcgYSBmdW5jdGlvbiBhdHRyaWJ1dGUgc2luY2UgcHJvZ3JhbXMgY2FuIHVzZQorICAgdGhlIC1mZXhjZXB0aW9ucyBvcHRpb25zIGZvciBDIGNvZGUgYXMgd2VsbC4gICovCisjIGlmICFkZWZpbmVkIF9fY3BsdXNwbHVzICYmIF9fR05VQ19QUkVSRVEgKDMsIDMpCisjICBkZWZpbmUgX19USFJPVwlfX2F0dHJpYnV0ZV9fICgoX19ub3Rocm93X18gX19MRUFGKSkKKyMgIGRlZmluZSBfX1RIUk9XTkwJX19hdHRyaWJ1dGVfXyAoKF9fbm90aHJvd19fKSkKKyMgIGRlZmluZSBfX05USChmY3QpCV9fYXR0cmlidXRlX18gKChfX25vdGhyb3dfXyBfX0xFQUYpKSBmY3QKKyMgZWxzZQorIyAgaWYgZGVmaW5lZCBfX2NwbHVzcGx1cyAmJiBfX0dOVUNfUFJFUkVRICgyLDgpCisjICAgZGVmaW5lIF9fVEhST1cJdGhyb3cgKCkKKyMgICBkZWZpbmUgX19USFJPV05MCXRocm93ICgpCisjICAgZGVmaW5lIF9fTlRIKGZjdCkJX19MRUFGX0FUVFIgZmN0IHRocm93ICgpCisjICBlbHNlCisjICAgZGVmaW5lIF9fVEhST1cKKyMgICBkZWZpbmUgX19USFJPV05MCisjICAgZGVmaW5lIF9fTlRIKGZjdCkJZmN0CisjICBlbmRpZgorIyBlbmRpZgorCisjZWxzZQkvKiBOb3QgR0NDLiAgKi8KKworIyBkZWZpbmUgX19pbmxpbmUJCS8qIE5vIGlubGluZSBmdW5jdGlvbnMuICAqLworCisjIGRlZmluZSBfX1RIUk9XCisjIGRlZmluZSBfX1RIUk9XTkwKKyMgZGVmaW5lIF9fTlRIKGZjdCkJZmN0CisKKyMgZGVmaW5lIF9fY29uc3QJY29uc3QKKyMgZGVmaW5lIF9fc2lnbmVkCXNpZ25lZAorIyBkZWZpbmUgX192b2xhdGlsZQl2b2xhdGlsZQorCisjZW5kaWYJLyogR0NDLiAgKi8KKworLyogVGhlc2UgdHdvIG1hY3JvcyBhcmUgbm90IHVzZWQgaW4gZ2xpYmMgYW55bW9yZS4gIFRoZXkgYXJlIGtlcHQgaGVyZQorICAgb25seSBiZWNhdXNlIHNvbWUgb3RoZXIgcHJvamVjdHMgZXhwZWN0IHRoZSBtYWNyb3MgdG8gYmUgZGVmaW5lZC4gICovCisjZGVmaW5lIF9fUChhcmdzKQlhcmdzCisjZGVmaW5lIF9fUE1UKGFyZ3MpCWFyZ3MKKworLyogRm9yIHRoZXNlIHRoaW5ncywgR0NDIGJlaGF2ZXMgdGhlIEFOU0kgd2F5IG5vcm1hbGx5LAorICAgYW5kIHRoZSBub24tQU5TSSB3YXkgdW5kZXIgLXRyYWRpdGlvbmFsLiAgKi8KKworI2RlZmluZSBfX0NPTkNBVCh4LHkpCXggIyMgeQorI2RlZmluZSBfX1NUUklORyh4KQkjeAorCisvKiBUaGlzIGlzIG5vdCBhIHR5cGVkZWYgc28gYGNvbnN0IF9fcHRyX3QnIGRvZXMgdGhlIHJpZ2h0IHRoaW5nLiAgKi8KKyNkZWZpbmUgX19wdHJfdCB2b2lkICoKKyNkZWZpbmUgX19sb25nX2RvdWJsZV90ICBsb25nIGRvdWJsZQorCisKKy8qIEMrKyBuZWVkcyB0byBrbm93IHRoYXQgdHlwZXMgYW5kIGRlY2xhcmF0aW9ucyBhcmUgQywgbm90IEMrKy4gICovCisjaWZkZWYJX19jcGx1c3BsdXMKKyMgZGVmaW5lIF9fQkVHSU5fREVDTFMJZXh0ZXJuICJDIiB7CisjIGRlZmluZSBfX0VORF9ERUNMUwl9CisjZWxzZQorIyBkZWZpbmUgX19CRUdJTl9ERUNMUworIyBkZWZpbmUgX19FTkRfREVDTFMKKyNlbmRpZgorCisKKy8qIFRoZSBzdGFuZGFyZCBsaWJyYXJ5IG5lZWRzIHRoZSBmdW5jdGlvbnMgZnJvbSB0aGUgSVNPIEM5MCBzdGFuZGFyZAorICAgaW4gdGhlIHN0ZCBuYW1lc3BhY2UuICBBdCB0aGUgc2FtZSB0aW1lIHdlIHdhbnQgdG8gYmUgc2FmZSBmb3IKKyAgIGZ1dHVyZSBjaGFuZ2VzIGFuZCB3ZSBpbmNsdWRlIHRoZSBJU08gQzk5IGNvZGUgaW4gdGhlIG5vbi1zdGFuZGFyZAorICAgbmFtZXNwYWNlIF9fYzk5LiAgVGhlIEMrKyB3cmFwcGVyIGhlYWRlciB0YWtlIGNhc2Ugb2YgYWRkaW5nIHRoZQorICAgZGVmaW5pdGlvbnMgdG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICAqLworI2lmIGRlZmluZWQgX19jcGx1c3BsdXMgJiYgZGVmaW5lZCBfR0xJQkNQUF9VU0VfTkFNRVNQQUNFUworIyBkZWZpbmUgX19CRUdJTl9OQU1FU1BBQ0VfU1RECW5hbWVzcGFjZSBzdGQgeworIyBkZWZpbmUgX19FTkRfTkFNRVNQQUNFX1NURAl9CisjIGRlZmluZSBfX1VTSU5HX05BTUVTUEFDRV9TVEQobmFtZSkgdXNpbmcgc3RkOjpuYW1lOworIyBkZWZpbmUgX19CRUdJTl9OQU1FU1BBQ0VfQzk5CW5hbWVzcGFjZSBfX2M5OSB7CisjIGRlZmluZSBfX0VORF9OQU1FU1BBQ0VfQzk5CX0KKyMgZGVmaW5lIF9fVVNJTkdfTkFNRVNQQUNFX0M5OShuYW1lKSB1c2luZyBfX2M5OTo6bmFtZTsKKyNlbHNlCisvKiBGb3IgY29tcGF0aWJpbGl0eSB3ZSBkbyBub3QgYWRkIHRoZSBkZWNsYXJhdGlvbnMgaW50byBhbnkKKyAgIG5hbWVzcGFjZS4gIFRoZXkgd2lsbCBlbmQgdXAgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2Ugd2hpY2ggaXMgd2hhdAorICAgb2xkIGNvZGUgZXhwZWN0cy4gICovCisjIGRlZmluZSBfX0JFR0lOX05BTUVTUEFDRV9TVEQKKyMgZGVmaW5lIF9fRU5EX05BTUVTUEFDRV9TVEQKKyMgZGVmaW5lIF9fVVNJTkdfTkFNRVNQQUNFX1NURChuYW1lKQorIyBkZWZpbmUgX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisjIGRlZmluZSBfX0VORF9OQU1FU1BBQ0VfQzk5CisjIGRlZmluZSBfX1VTSU5HX05BTUVTUEFDRV9DOTkobmFtZSkKKyNlbmRpZgorCisKKy8qIFN1cHBvcnQgZm9yIGJvdW5kZWQgcG9pbnRlcnMuICAqLworI2lmbmRlZiBfX0JPVU5ERURfUE9JTlRFUlNfXworIyBkZWZpbmUgX19ib3VuZGVkCS8qIG5vdGhpbmcgKi8KKyMgZGVmaW5lIF9fdW5ib3VuZGVkCS8qIG5vdGhpbmcgKi8KKyMgZGVmaW5lIF9fcHRydmFsdWUJLyogbm90aGluZyAqLworI2VuZGlmCisKKworLyogRm9ydGlmeSBzdXBwb3J0LiAgKi8KKyNkZWZpbmUgX19ib3MocHRyKSBfX2J1aWx0aW5fb2JqZWN0X3NpemUgKHB0ciwgX19VU0VfRk9SVElGWV9MRVZFTCA+IDEpCisjZGVmaW5lIF9fYm9zMChwdHIpIF9fYnVpbHRpbl9vYmplY3Rfc2l6ZSAocHRyLCAwKQorCisjaWYgX19HTlVDX1BSRVJFUSAoNCwzKQorIyBkZWZpbmUgX193YXJuZGVjbChuYW1lLCBtc2cpIFwKKyAgZXh0ZXJuIHZvaWQgbmFtZSAodm9pZCkgX19hdHRyaWJ1dGVfXygoX193YXJuaW5nX18gKG1zZykpKQorIyBkZWZpbmUgX193YXJuYXR0cihtc2cpIF9fYXR0cmlidXRlX18oKF9fd2FybmluZ19fIChtc2cpKSkKKyMgZGVmaW5lIF9fZXJyb3JkZWNsKG5hbWUsIG1zZykgXAorICBleHRlcm4gdm9pZCBuYW1lICh2b2lkKSBfX2F0dHJpYnV0ZV9fKChfX2Vycm9yX18gKG1zZykpKQorI2Vsc2UKKyMgZGVmaW5lIF9fd2FybmRlY2wobmFtZSwgbXNnKSBleHRlcm4gdm9pZCBuYW1lICh2b2lkKQorIyBkZWZpbmUgX193YXJuYXR0cihtc2cpCisjIGRlZmluZSBfX2Vycm9yZGVjbChuYW1lLCBtc2cpIGV4dGVybiB2b2lkIG5hbWUgKHZvaWQpCisjZW5kaWYKKworLyogU3VwcG9ydCBmb3IgZmxleGlibGUgYXJyYXlzLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICgyLDk3KQorLyogR0NDIDIuOTcgc3VwcG9ydHMgQzk5IGZsZXhpYmxlIGFycmF5IG1lbWJlcnMuICAqLworIyBkZWZpbmUgX19mbGV4YXJyCVtdCisjZWxzZQorIyBpZmRlZiBfX0dOVUNfXworIyAgZGVmaW5lIF9fZmxleGFycglbMF0KKyMgZWxzZQorIyAgaWYgZGVmaW5lZCBfX1NURENfVkVSU0lPTl9fICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorIyAgIGRlZmluZSBfX2ZsZXhhcnIJW10KKyMgIGVsc2UKKy8qIFNvbWUgb3RoZXIgbm9uLUM5OSBjb21waWxlci4gIEFwcHJveGltYXRlIHdpdGggWzFdLiAgKi8KKyMgICBkZWZpbmUgX19mbGV4YXJyCVsxXQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIF9fYXNtX18gKCJ4eXoiKSBpcyB1c2VkIHRocm91Z2hvdXQgdGhlIGhlYWRlcnMgdG8gcmVuYW1lIGZ1bmN0aW9ucworICAgYXQgdGhlIGFzc2VtYmx5IGxhbmd1YWdlIGxldmVsLiAgVGhpcyBpcyB3cmFwcGVkIGJ5IHRoZSBfX1JFRElSRUNUCisgICBtYWNybywgaW4gb3JkZXIgdG8gc3VwcG9ydCBjb21waWxlcnMgdGhhdCBjYW4gZG8gdGhpcyBzb21lIG90aGVyCisgICB3YXkuICBXaGVuIGNvbXBpbGVycyBkb24ndCBzdXBwb3J0IGFzbS1uYW1lcyBhdCBhbGwsIHdlIGhhdmUgdG8gZG8KKyAgIHByZXByb2Nlc3NvciB0cmlja3MgaW5zdGVhZCAod2hpY2ggZG9uJ3QgaGF2ZSBleGFjdGx5IHRoZSByaWdodAorICAgc2VtYW50aWNzLCBidXQgaXQncyB0aGUgYmVzdCB3ZSBjYW4gZG8pLgorCisgICBFeGFtcGxlOgorICAgaW50IF9fUkVESVJFQ1Qoc2V0cGdycCwgKF9fcGlkX3QgcGlkLCBfX3BpZF90IHBncnApLCBzZXRwZ2lkKTsgKi8KKworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMgorCisjIGRlZmluZSBfX1JFRElSRUNUKG5hbWUsIHByb3RvLCBhbGlhcykgbmFtZSBwcm90byBfX2FzbV9fIChfX0FTTU5BTUUgKCNhbGlhcykpCisjIGlmZGVmIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgX19SRURJUkVDVF9OVEgobmFtZSwgcHJvdG8sIGFsaWFzKSBcCisgICAgIG5hbWUgcHJvdG8gX19USFJPVyBfX2FzbV9fIChfX0FTTU5BTUUgKCNhbGlhcykpCisjICBkZWZpbmUgX19SRURJUkVDVF9OVEhOTChuYW1lLCBwcm90bywgYWxpYXMpIFwKKyAgICAgbmFtZSBwcm90byBfX1RIUk9XTkwgX19hc21fXyAoX19BU01OQU1FICgjYWxpYXMpKQorIyBlbHNlCisjICBkZWZpbmUgX19SRURJUkVDVF9OVEgobmFtZSwgcHJvdG8sIGFsaWFzKSBcCisgICAgIG5hbWUgcHJvdG8gX19hc21fXyAoX19BU01OQU1FICgjYWxpYXMpKSBfX1RIUk9XCisjICBkZWZpbmUgX19SRURJUkVDVF9OVEhOTChuYW1lLCBwcm90bywgYWxpYXMpIFwKKyAgICAgbmFtZSBwcm90byBfX2FzbV9fIChfX0FTTU5BTUUgKCNhbGlhcykpIF9fVEhST1dOTAorIyBlbmRpZgorIyBkZWZpbmUgX19BU01OQU1FKGNuYW1lKSAgX19BU01OQU1FMiAoX19VU0VSX0xBQkVMX1BSRUZJWF9fLCBjbmFtZSkKKyMgZGVmaW5lIF9fQVNNTkFNRTIocHJlZml4LCBjbmFtZSkgX19TVFJJTkcgKHByZWZpeCkgY25hbWUKKworLyoKKyNlbGlmIF9fU09NRV9PVEhFUl9DT01QSUxFUl9fCisKKyMgZGVmaW5lIF9fUkVESVJFQ1QobmFtZSwgcHJvdG8sIGFsaWFzKSBuYW1lIHByb3RvOyBcCisJX1ByYWdtYSgibGV0ICIgI25hbWUgIiA9ICIgI2FsaWFzKQorKi8KKyNlbmRpZgorCisvKiBHQ0MgaGFzIHZhcmlvdXMgdXNlZnVsIGRlY2xhcmF0aW9ucyB0aGF0IGNhbiBiZSBtYWRlIHdpdGggdGhlCisgICBgX19hdHRyaWJ1dGVfXycgc3ludGF4LiAgQWxsIG9mIHRoZSB3YXlzIHdlIHVzZSB0aGlzIGRvIGZpbmUgaWYKKyAgIHRoZXkgYXJlIG9taXR0ZWQgZm9yIGNvbXBpbGVycyB0aGF0IGRvbid0IHVuZGVyc3RhbmQgaXQuICovCisjaWYgIWRlZmluZWQgX19HTlVDX18gfHwgX19HTlVDX18gPCAyCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9fKHh5eikJLyogSWdub3JlICovCisjZW5kaWYKKworLyogQXQgc29tZSBwb2ludCBkdXJpbmcgdGhlIGdjYyAyLjk2IGRldmVsb3BtZW50IHRoZSBgbWFsbG9jJyBhdHRyaWJ1dGUKKyAgIGZvciBmdW5jdGlvbnMgd2FzIGludHJvZHVjZWQuICBXZSBkb24ndCB3YW50IHRvIHVzZSBpdCB1bmNvbmRpdGlvbmFsbHkKKyAgIChhbHRob3VnaCB0aGlzIHdvdWxkIGJlIHBvc3NpYmxlKSBzaW5jZSBpdCBnZW5lcmF0ZXMgd2FybmluZ3MuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDIsOTYpCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBfX2F0dHJpYnV0ZV9fICgoX19tYWxsb2NfXykpCisjZWxzZQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfbWFsbG9jX18gLyogSWdub3JlICovCisjZW5kaWYKKworLyogQXQgc29tZSBwb2ludCBkdXJpbmcgdGhlIGdjYyAyLjk2IGRldmVsb3BtZW50IHRoZSBgcHVyZScgYXR0cmlidXRlCisgICBmb3IgZnVuY3Rpb25zIHdhcyBpbnRyb2R1Y2VkLiAgV2UgZG9uJ3Qgd2FudCB0byB1c2UgaXQgdW5jb25kaXRpb25hbGx5CisgICAoYWx0aG91Z2ggdGhpcyB3b3VsZCBiZSBwb3NzaWJsZSkgc2luY2UgaXQgZ2VuZXJhdGVzIHdhcm5pbmdzLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICgyLDk2KQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfcHVyZV9fIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCisjZWxzZQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfcHVyZV9fIC8qIElnbm9yZSAqLworI2VuZGlmCisKKy8qIFRoaXMgZGVjbGFyYXRpb24gdGVsbHMgdGhlIGNvbXBpbGVyIHRoYXQgdGhlIHZhbHVlIGlzIGNvbnN0YW50LiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICgyLDUpCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKQorI2Vsc2UKKyMgZGVmaW5lIF9fYXR0cmlidXRlX2NvbnN0X18gLyogSWdub3JlICovCisjZW5kaWYKKworLyogQXQgc29tZSBwb2ludCBkdXJpbmcgdGhlIGdjYyAzLjEgZGV2ZWxvcG1lbnQgdGhlIGB1c2VkJyBhdHRyaWJ1dGUKKyAgIGZvciBmdW5jdGlvbnMgd2FzIGludHJvZHVjZWQuICBXZSBkb24ndCB3YW50IHRvIHVzZSBpdCB1bmNvbmRpdGlvbmFsbHkKKyAgIChhbHRob3VnaCB0aGlzIHdvdWxkIGJlIHBvc3NpYmxlKSBzaW5jZSBpdCBnZW5lcmF0ZXMgd2FybmluZ3MuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDMsMSkKKyMgZGVmaW5lIF9fYXR0cmlidXRlX3VzZWRfXyBfX2F0dHJpYnV0ZV9fICgoX191c2VkX18pKQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfbm9pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fICgoX19ub2lubGluZV9fKSkKKyNlbHNlCisjIGRlZmluZSBfX2F0dHJpYnV0ZV91c2VkX18gX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfbm9pbmxpbmVfXyAvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBnY2MgYWxsb3dzIG1hcmtpbmcgZGVwcmVjYXRlZCBmdW5jdGlvbnMuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDMsMikKKyMgZGVmaW5lIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXyBfX2F0dHJpYnV0ZV9fICgoX19kZXByZWNhdGVkX18pKQorI2Vsc2UKKyMgZGVmaW5lIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXyAvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgZ2NjIDIuOCBkZXZlbG9wbWVudCB0aGUgYGZvcm1hdF9hcmcnIGF0dHJpYnV0ZQorICAgZm9yIGZ1bmN0aW9ucyB3YXMgaW50cm9kdWNlZC4gIFdlIGRvbid0IHdhbnQgdG8gdXNlIGl0IHVuY29uZGl0aW9uYWxseQorICAgKGFsdGhvdWdoIHRoaXMgd291bGQgYmUgcG9zc2libGUpIHNpbmNlIGl0IGdlbmVyYXRlcyB3YXJuaW5ncy4KKyAgIElmIHNldmVyYWwgYGZvcm1hdF9hcmcnIGF0dHJpYnV0ZXMgYXJlIGdpdmVuIGZvciB0aGUgc2FtZSBmdW5jdGlvbiwgaW4KKyAgIGdjYy0zLjAgYW5kIG9sZGVyLCBhbGwgYnV0IHRoZSBsYXN0IG9uZSBhcmUgaWdub3JlZC4gIEluIG5ld2VyIGdjY3MsCisgICBhbGwgZGVzaWduYXRlZCBhcmd1bWVudHMgYXJlIGNvbnNpZGVyZWQuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDIsOCkKKyMgZGVmaW5lIF9fYXR0cmlidXRlX2Zvcm1hdF9hcmdfXyh4KSBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfYXJnX18gKHgpKSkKKyNlbHNlCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9mb3JtYXRfYXJnX18oeCkgLyogSWdub3JlICovCisjZW5kaWYKKworLyogQXQgc29tZSBwb2ludCBkdXJpbmcgdGhlIGdjYyAyLjk3IGRldmVsb3BtZW50IHRoZSBgc3RyZm1vbicgZm9ybWF0CisgICBhdHRyaWJ1dGUgZm9yIGZ1bmN0aW9ucyB3YXMgaW50cm9kdWNlZC4gIFdlIGRvbid0IHdhbnQgdG8gdXNlIGl0CisgICB1bmNvbmRpdGlvbmFsbHkgKGFsdGhvdWdoIHRoaXMgd291bGQgYmUgcG9zc2libGUpIHNpbmNlIGl0CisgICBnZW5lcmF0ZXMgd2FybmluZ3MuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDIsOTcpCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9mb3JtYXRfc3RyZm1vbl9fKGEsYikgXAorICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19zdHJmbW9uX18sIGEsIGIpKSkKKyNlbHNlCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9mb3JtYXRfc3RyZm1vbl9fKGEsYikgLyogSWdub3JlICovCisjZW5kaWYKKworLyogVGhlIG5vbnVsbCBmdW5jdGlvbiBhdHRyaWJ1dGUgYWxsb3dzIHRvIG1hcmsgcG9pbnRlciBwYXJhbWV0ZXJzIHdoaWNoCisgICBtdXN0IG5vdCBiZSBOVUxMLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICgzLDMpCisjIGRlZmluZSBfX25vbm51bGwocGFyYW1zKSBfX2F0dHJpYnV0ZV9fICgoX19ub25udWxsX18gcGFyYW1zKSkKKyNlbHNlCisjIGRlZmluZSBfX25vbm51bGwocGFyYW1zKQorI2VuZGlmCisKKy8qIElmIGZvcnRpZmljYXRpb24gbW9kZSwgd2Ugd2FybiBhYm91dCB1bnVzZWQgcmVzdWx0cyBvZiBjZXJ0YWluCisgICBmdW5jdGlvbiBjYWxscyB3aGljaCBjYW4gbGVhZCB0byBwcm9ibGVtcy4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMyw0KQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfd2Fybl91bnVzZWRfcmVzdWx0X18gXAorICAgX19hdHRyaWJ1dGVfXyAoKF9fd2Fybl91bnVzZWRfcmVzdWx0X18pKQorIyBpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMAorIyAgZGVmaW5lIF9fd3VyIF9fYXR0cmlidXRlX3dhcm5fdW51c2VkX3Jlc3VsdF9fCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfd2Fybl91bnVzZWRfcmVzdWx0X18gLyogZW1wdHkgKi8KKyNlbmRpZgorI2lmbmRlZiBfX3d1cgorIyBkZWZpbmUgX193dXIgLyogSWdub3JlICovCisjZW5kaWYKKworLyogRm9yY2VzIGEgZnVuY3Rpb24gdG8gYmUgYWx3YXlzIGlubGluZWQuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDMsMikKKyMgZGVmaW5lIF9fYWx3YXlzX2lubGluZSBfX2lubGluZSBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18pKQorI2Vsc2UKKyMgZGVmaW5lIF9fYWx3YXlzX2lubGluZSBfX2lubGluZQorI2VuZGlmCisKKy8qIEdDQyA0LjMgYW5kIGFib3ZlIHdpdGggLXN0ZD1jOTkgb3IgLXN0ZD1nbnU5OSBpbXBsZW1lbnRzIElTTyBDOTkKKyAgIGlubGluZSBzZW1hbnRpY3MsIHVubGVzcyAtZmdudTg5LWlubGluZSBpcyB1c2VkLiAgKi8KKyNpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBfX0dOVUNfUFJFUkVRICg0LDMpCisjIGlmIGRlZmluZWQgX19HTlVDX1NURENfSU5MSU5FX18gfHwgZGVmaW5lZCBfX2NwbHVzcGx1cworIyAgZGVmaW5lIF9fZXh0ZXJuX2lubGluZSBleHRlcm4gX19pbmxpbmUgX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fKSkKKyMgIGlmIF9fR05VQ19QUkVSRVEgKDQsMykKKyMgICBkZWZpbmUgX19leHRlcm5fYWx3YXlzX2lubGluZSBcCisgIGV4dGVybiBfX2Fsd2F5c19pbmxpbmUgX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCisjICBlbHNlCisjICAgZGVmaW5lIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgXAorICBleHRlcm4gX19hbHdheXNfaW5saW5lIF9fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXykpCisjICBlbmRpZgorIyBlbHNlCisjICBkZWZpbmUgX19leHRlcm5faW5saW5lIGV4dGVybiBfX2lubGluZQorIyAgaWYgX19HTlVDX1BSRVJFUSAoNCwzKQorIyAgIGRlZmluZSBfX2V4dGVybl9hbHdheXNfaW5saW5lIFwKKyAgZXh0ZXJuIF9fYWx3YXlzX2lubGluZSBfX2F0dHJpYnV0ZV9fICgoX19hcnRpZmljaWFsX18pKQorIyAgZWxzZQorIyAgIGRlZmluZSBfX2V4dGVybl9hbHdheXNfaW5saW5lIGV4dGVybiBfX2Fsd2F5c19pbmxpbmUKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworLyogR0NDIDQuMyBhbmQgYWJvdmUgYWxsb3cgcGFzc2luZyBhbGwgYW5vbnltb3VzIGFyZ3VtZW50cyBvZiBhbgorICAgX19leHRlcm5fYWx3YXlzX2lubGluZSBmdW5jdGlvbiB0byBzb21lIG90aGVyIHZhcmFyZyBmdW5jdGlvbi4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoNCwzKQorIyBkZWZpbmUgX192YV9hcmdfcGFjaygpIF9fYnVpbHRpbl92YV9hcmdfcGFjayAoKQorIyBkZWZpbmUgX192YV9hcmdfcGFja19sZW4oKSBfX2J1aWx0aW5fdmFfYXJnX3BhY2tfbGVuICgpCisjZW5kaWYKKworLyogSXQgaXMgcG9zc2libGUgdG8gY29tcGlsZSBjb250YWluaW5nIEdDQyBleHRlbnNpb25zIGV2ZW4gaWYgR0NDIGlzCisgICBydW4gaW4gcGVkYW50aWMgbW9kZSBpZiB0aGUgdXNlcyBhcmUgY2FyZWZ1bGx5IG1hcmtlZCB1c2luZyB0aGUKKyAgIGBfX2V4dGVuc2lvbl9fJyBrZXl3b3JkLiAgQnV0IHRoaXMgaXMgbm90IGdlbmVyYWxseSBhdmFpbGFibGUgYmVmb3JlCisgICB2ZXJzaW9uIDIuOC4gICovCisjaWYgIV9fR05VQ19QUkVSRVEgKDIsOCkKKyMgZGVmaW5lIF9fZXh0ZW5zaW9uX18JCS8qIElnbm9yZSAqLworI2VuZGlmCisKKy8qIF9fcmVzdHJpY3QgaXMga25vd24gaW4gRUdDUyAxLjIgYW5kIGFib3ZlLiAqLworI2lmICFfX0dOVUNfUFJFUkVRICgyLDkyKQorIyBkZWZpbmUgX19yZXN0cmljdAkvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBJU08gQzk5IGFsc28gYWxsb3dzIHRvIGRlY2xhcmUgYXJyYXlzIGFzIG5vbi1vdmVybGFwcGluZy4gIFRoZSBzeW50YXggaXMKKyAgICAgYXJyYXlfbmFtZVtyZXN0cmljdF0KKyAgIEdDQyAzLjEgc3VwcG9ydHMgdGhpcy4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMywxKSAmJiAhZGVmaW5lZCBfX0dOVUdfXworIyBkZWZpbmUgX19yZXN0cmljdF9hcnIJX19yZXN0cmljdAorI2Vsc2UKKyMgaWZkZWYgX19HTlVDX18KKyMgIGRlZmluZSBfX3Jlc3RyaWN0X2FycgkvKiBOb3Qgc3VwcG9ydGVkIGluIG9sZCBHQ0MuICAqLworIyBlbHNlCisjICBpZiBkZWZpbmVkIF9fU1REQ19WRVJTSU9OX18gJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjICAgZGVmaW5lIF9fcmVzdHJpY3RfYXJyCXJlc3RyaWN0CisjICBlbHNlCisvKiBTb21lIG90aGVyIG5vbi1DOTkgY29tcGlsZXIuICAqLworIyAgIGRlZmluZSBfX3Jlc3RyaWN0X2FycgkvKiBOb3Qgc3VwcG9ydGVkLiAgKi8KKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworI2lmIGRlZmluZWQgX19MT05HX0RPVUJMRV9NQVRIX09QVElPTkFMICYmIGRlZmluZWQgX19OT19MT05HX0RPVUJMRV9NQVRICisjIGRlZmluZSBfX0xEQkxfQ09NUEFUIDEKKyMgaWZkZWYgX19SRURJUkVDVAorIyAgZGVmaW5lIF9fTERCTF9SRURJUjEobmFtZSwgcHJvdG8sIGFsaWFzKSBfX1JFRElSRUNUIChuYW1lLCBwcm90bywgYWxpYXMpCisjICBkZWZpbmUgX19MREJMX1JFRElSKG5hbWUsIHByb3RvKSBcCisgIF9fTERCTF9SRURJUjEgKG5hbWUsIHByb3RvLCBfX25sZGJsXyMjbmFtZSkKKyMgIGRlZmluZSBfX0xEQkxfUkVESVIxX05USChuYW1lLCBwcm90bywgYWxpYXMpIF9fUkVESVJFQ1RfTlRIIChuYW1lLCBwcm90bywgYWxpYXMpCisjICBkZWZpbmUgX19MREJMX1JFRElSX05USChuYW1lLCBwcm90bykgXAorICBfX0xEQkxfUkVESVIxX05USCAobmFtZSwgcHJvdG8sIF9fbmxkYmxfIyNuYW1lKQorIyAgZGVmaW5lIF9fTERCTF9SRURJUjFfREVDTChuYW1lLCBhbGlhcykgXAorICBleHRlcm4gX190eXBlb2YgKG5hbWUpIG5hbWUgX19hc20gKF9fQVNNTkFNRSAoI2FsaWFzKSk7CisjICBkZWZpbmUgX19MREJMX1JFRElSX0RFQ0wobmFtZSkgXAorICBleHRlcm4gX190eXBlb2YgKG5hbWUpIG5hbWUgX19hc20gKF9fQVNNTkFNRSAoIl9fbmxkYmxfIiAjbmFtZSkpOworIyAgZGVmaW5lIF9fUkVESVJFQ1RfTERCTChuYW1lLCBwcm90bywgYWxpYXMpIFwKKyAgX19MREJMX1JFRElSMSAobmFtZSwgcHJvdG8sIF9fbmxkYmxfIyNhbGlhcykKKyMgIGRlZmluZSBfX1JFRElSRUNUX05USF9MREJMKG5hbWUsIHByb3RvLCBhbGlhcykgXAorICBfX0xEQkxfUkVESVIxX05USCAobmFtZSwgcHJvdG8sIF9fbmxkYmxfIyNhbGlhcykKKyMgZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkIF9fTERCTF9DT01QQVQgfHwgIWRlZmluZWQgX19SRURJUkVDVAorIyBkZWZpbmUgX19MREJMX1JFRElSMShuYW1lLCBwcm90bywgYWxpYXMpIG5hbWUgcHJvdG8KKyMgZGVmaW5lIF9fTERCTF9SRURJUihuYW1lLCBwcm90bykgbmFtZSBwcm90bworIyBkZWZpbmUgX19MREJMX1JFRElSMV9OVEgobmFtZSwgcHJvdG8sIGFsaWFzKSBuYW1lIHByb3RvIF9fVEhST1cKKyMgZGVmaW5lIF9fTERCTF9SRURJUl9OVEgobmFtZSwgcHJvdG8pIG5hbWUgcHJvdG8gX19USFJPVworIyBkZWZpbmUgX19MREJMX1JFRElSX0RFQ0wobmFtZSkKKyMgaWZkZWYgX19SRURJUkVDVAorIyAgZGVmaW5lIF9fUkVESVJFQ1RfTERCTChuYW1lLCBwcm90bywgYWxpYXMpIF9fUkVESVJFQ1QgKG5hbWUsIHByb3RvLCBhbGlhcykKKyMgIGRlZmluZSBfX1JFRElSRUNUX05USF9MREJMKG5hbWUsIHByb3RvLCBhbGlhcykgXAorICBfX1JFRElSRUNUX05USCAobmFtZSwgcHJvdG8sIGFsaWFzKQorIyBlbmRpZgorI2VuZGlmCisKKyNlbmRpZgkgLyogc3lzL2NkZWZzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZGVidWdyZWcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZGVidWdyZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWJiZjc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9kZWJ1Z3JlZy5oCkBAIC0wLDAgKzEsODggQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX0RFQlVHUkVHX0gKKyNkZWZpbmUgX1NZU19ERUJVR1JFR19ICTEKKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKy8qIEluZGljYXRlIHRoZSByZWdpc3RlciBudW1iZXJzIGZvciBhIG51bWJlciBvZiB0aGUgc3BlY2lmaWMKKyAgIGRlYnVnIHJlZ2lzdGVycy4gIFJlZ2lzdGVycyAwLTMgY29udGFpbiB0aGUgYWRkcmVzc2VzIHdlIHdpc2ggdG8gdHJhcCBvbiAqLworI2RlZmluZSBEUl9GSVJTVEFERFIgMCAgICAgICAgLyogdV9kZWJ1Z3JlZ1tEUl9GSVJTVEFERFJdICovCisjZGVmaW5lIERSX0xBU1RBRERSIDMgICAgICAgICAvKiB1X2RlYnVncmVnW0RSX0xBU1RBRERSXSAgKi8KKworI2RlZmluZSBEUl9TVEFUVVMgNiAgICAgICAgICAgLyogdV9kZWJ1Z3JlZ1tEUl9TVEFUVVNdICAgICAqLworI2RlZmluZSBEUl9DT05UUk9MIDcgICAgICAgICAgLyogdV9kZWJ1Z3JlZ1tEUl9DT05UUk9MXSAqLworCisvKiBEZWZpbmUgYSBmZXcgdGhpbmdzIGZvciB0aGUgc3RhdHVzIHJlZ2lzdGVyLiAgV2UgY2FuIHVzZSB0aGlzIHRvIGRldGVybWluZQorICAgd2hpY2ggZGVidWdnaW5nIHJlZ2lzdGVyIHdhcyByZXNwb25zaWJsZSBmb3IgdGhlIHRyYXAuICBUaGUgb3RoZXIgYml0cworICAgYXJlIGVpdGhlciByZXNlcnZlZCBvciBub3Qgb2YgaW50ZXJlc3QgdG8gdXMuICovCisKKyNkZWZpbmUgRFJfVFJBUDAJKDB4MSkJCS8qIGRiMCAqLworI2RlZmluZSBEUl9UUkFQMQkoMHgyKQkJLyogZGIxICovCisjZGVmaW5lIERSX1RSQVAyCSgweDQpCQkvKiBkYjIgKi8KKyNkZWZpbmUgRFJfVFJBUDMJKDB4OCkJCS8qIGRiMyAqLworCisjZGVmaW5lIERSX1NURVAJCSgweDQwMDApCS8qIHNpbmdsZS1zdGVwICovCisjZGVmaW5lIERSX1NXSVRDSAkoMHg4MDAwKQkvKiB0YXNrIHN3aXRjaCAqLworCisvKiBOb3cgZGVmaW5lIGEgYnVuY2ggb2YgdGhpbmdzIGZvciBtYW5pcHVsYXRpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIuCisgICBUaGUgdG9wIHR3byBieXRlcyBvZiB0aGUgY29udHJvbCByZWdpc3RlciBjb25zaXN0IG9mIDQgZmllbGRzIG9mIDQKKyAgIGJpdHMgLSBlYWNoIGZpZWxkIGNvcnJlc3BvbmRzIHRvIG9uZSBvZiB0aGUgZm91ciBkZWJ1ZyByZWdpc3RlcnMsCisgICBhbmQgaW5kaWNhdGVzIHdoYXQgdHlwZXMgb2YgYWNjZXNzIHdlIHRyYXAgb24sIGFuZCBob3cgbGFyZ2UgdGhlIGRhdGEKKyAgIGZpZWxkIGlzIHRoYXQgd2UgYXJlIGxvb2tpbmcgYXQgKi8KKworI2RlZmluZSBEUl9DT05UUk9MX1NISUZUIDE2ICAgLyogU2tpcCB0aGlzIG1hbnkgYml0cyBpbiBjdGwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRFJfQ09OVFJPTF9TSVpFICA0ICAgIC8qIDQgY29udHJvbCBiaXRzIHBlciByZWdpc3RlciAqLworCisjZGVmaW5lIERSX1JXX0VYRUNVVEUJKDB4MCkgLyogU2V0dGluZ3MgZm9yIHRoZSBhY2Nlc3MgdHlwZXMgdG8gdHJhcCBvbiAqLworI2RlZmluZSBEUl9SV19XUklURQkoMHgxKQorI2RlZmluZSBEUl9SV19SRUFECSgweDMpCisKKyNkZWZpbmUgRFJfTEVOXzEgKDB4MCkJICAgICAgLyogU2V0dGluZ3MgZm9yIGRhdGEgbGVuZ3RoIHRvIHRyYXAgb24gKi8KKyNkZWZpbmUgRFJfTEVOXzIgKDB4NCkKKyNkZWZpbmUgRFJfTEVOXzQgKDB4QykKKyNkZWZpbmUgRFJfTEVOXzggKDB4OCkKKworLyogVGhlIGxvdyBieXRlIHRvIHRoZSBjb250cm9sIHJlZ2lzdGVyIGRldGVybWluZSB3aGljaCByZWdpc3RlcnMgYXJlCisgICBlbmFibGVkLiAgVGhlcmUgYXJlIDQgZmllbGRzIG9mIHR3byBiaXRzLiAgT25lIGJpdCBpcyAibG9jYWwiLCBtZWFuaW5nCisgICB0aGF0IHRoZSBwcm9jZXNzb3Igd2lsbCByZXNldCB0aGUgYml0IGFmdGVyIGEgdGFzayBzd2l0Y2ggYW5kIHRoZSBvdGhlcgorICAgaXMgZ2xvYmFsIG1lYW5pbmcgdGhhdCB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgcmVzZXQgdGhlIGJpdC4gIFdpdGggbGludXgsCisgICB5b3UgY2FuIHVzZSBlaXRoZXIgb25lLCBzaW5jZSB3ZSBleHBsaWNpdGx5IHplcm8gdGhlIHJlZ2lzdGVyIHdoZW4gd2UgZW50ZXIKKyAgIGtlcm5lbCBtb2RlLiAqLworCisjZGVmaW5lIERSX0xPQ0FMX0VOQUJMRV9TSElGVCAgMCAgIC8qIEV4dHJhIHNoaWZ0IHRvIHRoZSBsb2NhbCBlbmFibGUgYml0ICovCisjZGVmaW5lIERSX0dMT0JBTF9FTkFCTEVfU0hJRlQgMSAgIC8qIEV4dHJhIHNoaWZ0IHRvIHRoZSBnbG9iYWwgZW5hYmxlIGJpdCAqLworI2RlZmluZSBEUl9FTkFCTEVfU0laRQkgICAgICAgMiAgIC8qIDIgZW5hYmxlIGJpdHMgcGVyIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgRFJfTE9DQUxfRU5BQkxFX01BU0sgICgweDU1KSAvKiBTZXQgIGxvY2FsIGJpdHMgZm9yIGFsbCA0IHJlZ3MgKi8KKyNkZWZpbmUgRFJfR0xPQkFMX0VOQUJMRV9NQVNLICgweEFBKSAvKiBTZXQgZ2xvYmFsIGJpdHMgZm9yIGFsbCA0IHJlZ3MgKi8KKworLyogVGhlIHNlY29uZCBieXRlIHRvIHRoZSBjb250cm9sIHJlZ2lzdGVyIGhhcyBhIGZldyBzcGVjaWFsCisgICB0aGluZ3MuICAqLworCisKKworI2lmIF9fV09SRFNJWkUgPT0gNjQKKyMgZGVmaW5lIERSX0NPTlRST0xfUkVTRVJWRUQgKDB4RkZGRkZGRkYwMDAwRkMwMFVMKSAvKiBSZXNlcnZlZCAqLworI2Vsc2UKKyMgZGVmaW5lIERSX0NPTlRST0xfUkVTRVJWRUQgKDB4MDBGQzAwVSkgLyogUmVzZXJ2ZWQgKi8KKyNlbmRpZgorI2RlZmluZSBEUl9MT0NBTF9TTE9XRE9XTiAgICgweDEwMCkgIC8qIExvY2FsIHNsb3cgdGhlIHBpcGVsaW5lICovCisjZGVmaW5lIERSX0dMT0JBTF9TTE9XRE9XTiAgKDB4MjAwKSAgLyogR2xvYmFsIHNsb3cgdGhlIHBpcGVsaW5lICovCisKKyNlbmRpZgkvKiBzeXMvZGVidWdyZWcuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9kaXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZGlyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxMWQ2YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZGlyLmgKQEAgLTAsMCArMSwyOCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfRElSX0gKKyNkZWZpbmUJX1NZU19ESVJfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisKKyNkZWZpbmUJZGlyZWN0CWRpcmVudAorCisjZW5kaWYJLyogc3lzL2Rpci5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9lcG9sbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9lcG9sbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNWVmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2Vwb2xsLmgKQEAgLTAsMCArMSwxNDQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA4LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfRVBPTExfSAorI2RlZmluZQlfU1lTX0VQT0xMX0gJMQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qIEdldCBfX3NpZ3NldF90LiAgKi8KKyNpbmNsdWRlIDxiaXRzL3NpZ3NldC5oPgorCisjaWZuZGVmIF9fc2lnc2V0X3RfZGVmaW5lZAorIyBkZWZpbmUgX19zaWdzZXRfdF9kZWZpbmVkCit0eXBlZGVmIF9fc2lnc2V0X3Qgc2lnc2V0X3Q7CisjZW5kaWYKKworCisvKiBGbGFncyB0byBiZSBwYXNzZWQgdG8gZXBvbGxfY3JlYXRlMS4gICovCitlbnVtCisgIHsKKyAgICBFUE9MTF9DTE9FWEVDID0gMDIwMDAwMDAsCisjZGVmaW5lIEVQT0xMX0NMT0VYRUMgRVBPTExfQ0xPRVhFQworICAgIEVQT0xMX05PTkJMT0NLID0gMDQwMDAKKyNkZWZpbmUgRVBPTExfTk9OQkxPQ0sgRVBPTExfTk9OQkxPQ0sKKyAgfTsKKworCitlbnVtIEVQT0xMX0VWRU5UUworICB7CisgICAgRVBPTExJTiA9IDB4MDAxLAorI2RlZmluZSBFUE9MTElOIEVQT0xMSU4KKyAgICBFUE9MTFBSSSA9IDB4MDAyLAorI2RlZmluZSBFUE9MTFBSSSBFUE9MTFBSSQorICAgIEVQT0xMT1VUID0gMHgwMDQsCisjZGVmaW5lIEVQT0xMT1VUIEVQT0xMT1VUCisgICAgRVBPTExSRE5PUk0gPSAweDA0MCwKKyNkZWZpbmUgRVBPTExSRE5PUk0gRVBPTExSRE5PUk0KKyAgICBFUE9MTFJEQkFORCA9IDB4MDgwLAorI2RlZmluZSBFUE9MTFJEQkFORCBFUE9MTFJEQkFORAorICAgIEVQT0xMV1JOT1JNID0gMHgxMDAsCisjZGVmaW5lIEVQT0xMV1JOT1JNIEVQT0xMV1JOT1JNCisgICAgRVBPTExXUkJBTkQgPSAweDIwMCwKKyNkZWZpbmUgRVBPTExXUkJBTkQgRVBPTExXUkJBTkQKKyAgICBFUE9MTE1TRyA9IDB4NDAwLAorI2RlZmluZSBFUE9MTE1TRyBFUE9MTE1TRworICAgIEVQT0xMRVJSID0gMHgwMDgsCisjZGVmaW5lIEVQT0xMRVJSIEVQT0xMRVJSCisgICAgRVBPTExIVVAgPSAweDAxMCwKKyNkZWZpbmUgRVBPTExIVVAgRVBPTExIVVAKKyAgICBFUE9MTFJESFVQID0gMHgyMDAwLAorI2RlZmluZSBFUE9MTFJESFVQIEVQT0xMUkRIVVAKKyAgICBFUE9MTE9ORVNIT1QgPSAxdSA8PCAzMCwKKyNkZWZpbmUgRVBPTExPTkVTSE9UIEVQT0xMT05FU0hPVAorICAgIEVQT0xMRVQgPSAxdSA8PCAzMQorI2RlZmluZSBFUE9MTEVUIEVQT0xMRVQKKyAgfTsKKworCisvKiBWYWxpZCBvcGNvZGVzICggIm9wIiBwYXJhbWV0ZXIgKSB0byBpc3N1ZSB0byBlcG9sbF9jdGwoKS4gICovCisjZGVmaW5lIEVQT0xMX0NUTF9BREQgMQkvKiBBZGQgYSBmaWxlIGRlY3JpcHRvciB0byB0aGUgaW50ZXJmYWNlLiAgKi8KKyNkZWZpbmUgRVBPTExfQ1RMX0RFTCAyCS8qIFJlbW92ZSBhIGZpbGUgZGVjcmlwdG9yIGZyb20gdGhlIGludGVyZmFjZS4gICovCisjZGVmaW5lIEVQT0xMX0NUTF9NT0QgMwkvKiBDaGFuZ2UgZmlsZSBkZWNyaXB0b3IgZXBvbGxfZXZlbnQgc3RydWN0dXJlLiAgKi8KKworCit0eXBlZGVmIHVuaW9uIGVwb2xsX2RhdGEKK3sKKyAgdm9pZCAqcHRyOworICBpbnQgZmQ7CisgIHVpbnQzMl90IHUzMjsKKyAgdWludDY0X3QgdTY0OworfSBlcG9sbF9kYXRhX3Q7CisKK3N0cnVjdCBlcG9sbF9ldmVudAoreworICB1aW50MzJfdCBldmVudHM7CS8qIEVwb2xsIGV2ZW50cyAqLworICBlcG9sbF9kYXRhX3QgZGF0YTsJLyogVXNlciBkYXRhIHZhcmlhYmxlICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKworX19CRUdJTl9ERUNMUworCisvKiBDcmVhdGVzIGFuIGVwb2xsIGluc3RhbmNlLiAgUmV0dXJucyBhbiBmZCBmb3IgdGhlIG5ldyBpbnN0YW5jZS4KKyAgIFRoZSAic2l6ZSIgcGFyYW1ldGVyIGlzIGEgaGludCBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgZmlsZQorICAgZGVzY3JpcHRvcnMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgaW5zdGFuY2UuICBUaGUgZmQKKyAgIHJldHVybmVkIGJ5IGVwb2xsX2NyZWF0ZSgpIHNob3VsZCBiZSBjbG9zZWQgd2l0aCBjbG9zZSgpLiAgKi8KK2V4dGVybiBpbnQgZXBvbGxfY3JlYXRlIChpbnQgX19zaXplKSBfX1RIUk9XOworCisvKiBTYW1lIGFzIGVwb2xsX2NyZWF0ZSBidXQgd2l0aCBhbiBGTEFHUyBwYXJhbWV0ZXIuICBUaGUgdW51c2VkIFNJWkUKKyAgIHBhcmFtZXRlciBoYXMgYmVlbiBkcm9wcGVkLiAgKi8KK2V4dGVybiBpbnQgZXBvbGxfY3JlYXRlMSAoaW50IF9fZmxhZ3MpIF9fVEhST1c7CisKKworLyogTWFuaXB1bGF0ZSBhbiBlcG9sbCBpbnN0YW5jZSAiZXBmZCIuIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsCisgICAtMSBpbiBjYXNlIG9mIGVycm9yICggdGhlICJlcnJubyIgdmFyaWFibGUgd2lsbCBjb250YWluIHRoZQorICAgc3BlY2lmaWMgZXJyb3IgY29kZSApIFRoZSAib3AiIHBhcmFtZXRlciBpcyBvbmUgb2YgdGhlIEVQT0xMX0NUTF8qCisgICBjb25zdGFudHMgZGVmaW5lZCBhYm92ZS4gVGhlICJmZCIgcGFyYW1ldGVyIGlzIHRoZSB0YXJnZXQgb2YgdGhlCisgICBvcGVyYXRpb24uIFRoZSAiZXZlbnQiIHBhcmFtZXRlciBkZXNjcmliZXMgd2hpY2ggZXZlbnRzIHRoZSBjYWxsZXIKKyAgIGlzIGludGVyZXN0ZWQgaW4gYW5kIGFueSBhc3NvY2lhdGVkIHVzZXIgZGF0YS4gICovCitleHRlcm4gaW50IGVwb2xsX2N0bCAoaW50IF9fZXBmZCwgaW50IF9fb3AsIGludCBfX2ZkLAorCQkgICAgICBzdHJ1Y3QgZXBvbGxfZXZlbnQgKl9fZXZlbnQpIF9fVEhST1c7CisKKworLyogV2FpdCBmb3IgZXZlbnRzIG9uIGFuIGVwb2xsIGluc3RhbmNlICJlcGZkIi4gUmV0dXJucyB0aGUgbnVtYmVyIG9mCisgICB0cmlnZ2VyZWQgZXZlbnRzIHJldHVybmVkIGluICJldmVudHMiIGJ1ZmZlci4gT3IgLTEgaW4gY2FzZSBvZgorICAgZXJyb3Igd2l0aCB0aGUgImVycm5vIiB2YXJpYWJsZSBzZXQgdG8gdGhlIHNwZWNpZmljIGVycm9yIGNvZGUuIFRoZQorICAgImV2ZW50cyIgcGFyYW1ldGVyIGlzIGEgYnVmZmVyIHRoYXQgd2lsbCBjb250YWluIHRyaWdnZXJlZAorICAgZXZlbnRzLiBUaGUgIm1heGV2ZW50cyIgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGV2ZW50cyB0byBiZQorICAgcmV0dXJuZWQgKCB1c3VhbGx5IHNpemUgb2YgImV2ZW50cyIgKS4gVGhlICJ0aW1lb3V0IiBwYXJhbWV0ZXIKKyAgIHNwZWNpZmllcyB0aGUgbWF4aW11bSB3YWl0IHRpbWUgaW4gbWlsbGlzZWNvbmRzICgtMSA9PSBpbmZpbml0ZSkuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBlcG9sbF93YWl0IChpbnQgX19lcGZkLCBzdHJ1Y3QgZXBvbGxfZXZlbnQgKl9fZXZlbnRzLAorCQkgICAgICAgaW50IF9fbWF4ZXZlbnRzLCBpbnQgX190aW1lb3V0KTsKKworCisvKiBTYW1lIGFzIGVwb2xsX3dhaXQsIGJ1dCB0aGUgdGhyZWFkJ3Mgc2lnbmFsIG1hc2sgaXMgdGVtcG9yYXJpbHkKKyAgIGFuZCBhdG9taWNhbGx5IHJlcGxhY2VkIHdpdGggdGhlIG9uZSBwcm92aWRlZCBhcyBwYXJhbWV0ZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBlcG9sbF9wd2FpdCAoaW50IF9fZXBmZCwgc3RydWN0IGVwb2xsX2V2ZW50ICpfX2V2ZW50cywKKwkJCWludCBfX21heGV2ZW50cywgaW50IF9fdGltZW91dCwKKwkJCV9fY29uc3QgX19zaWdzZXRfdCAqX19zcyk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvZXBvbGwuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9lcnJuby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9lcnJuby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOWY0ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2Vycm5vLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGVycm5vLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2V2ZW50ZmQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZXZlbnRmZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NDJkZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2V2ZW50ZmQuaApAQCAtMCwwICsxLDU0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19FVkVOVEZEX0gKKyNkZWZpbmUJX1NZU19FVkVOVEZEX0gJMQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKworLyogVHlwZSBmb3IgZXZlbnQgY291bnRlci4gICovCit0eXBlZGVmIHVpbnQ2NF90IGV2ZW50ZmRfdDsKKworLyogRmxhZ3MgZm9yIHNpZ25hbGZkLiAgKi8KK2VudW0KKyAgeworICAgIEVGRF9TRU1BUEhPUkUgPSAxLAorI2RlZmluZSBFRkRfU0VNQVBIT1JFIEVGRF9TRU1BUEhPUkUKKyAgICBFRkRfQ0xPRVhFQyA9IDAyMDAwMDAwLAorI2RlZmluZSBFRkRfQ0xPRVhFQyBFRkRfQ0xPRVhFQworICAgIEVGRF9OT05CTE9DSyA9IDA0MDAwCisjZGVmaW5lIEVGRF9OT05CTE9DSyBFRkRfTk9OQkxPQ0sKKyAgfTsKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJldHVybiBmaWxlIGRlc2NyaXB0b3IgZm9yIGdlbmVyaWMgZXZlbnQgY2hhbm5lbC4gIFNldCBpbml0aWFsCisgICB2YWx1ZSB0byBDT1VOVC4gICovCitleHRlcm4gaW50IGV2ZW50ZmQgKGludCBfX2NvdW50LCBpbnQgX19mbGFncykgX19USFJPVzsKKworLyogUmVhZCBldmVudCBjb3VudGVyIGFuZCBwb3NzaWJseSB3YWl0IGZvciBldmVudHMuICAqLworZXh0ZXJuIGludCBldmVudGZkX3JlYWQgKGludCBfX2ZkLCBldmVudGZkX3QgKl9fdmFsdWUpOworCisvKiBJbmNyZW1lbnQgZXZlbnQgY291bnRlci4gICovCitleHRlcm4gaW50IGV2ZW50ZmRfd3JpdGUgKGludCBfX2ZkLCBldmVudGZkX3QgX192YWx1ZSk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvZXZlbnRmZC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2Zhbm90aWZ5LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2Zhbm90aWZ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4NTAwYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZmFub3RpZnkuaApAQCAtMCwwICsxLDM5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19GQU5PVElGWV9ICisjZGVmaW5lCV9TWVNfRkFOT1RJRllfSAkxCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9mYW5vdGlmeS5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGZhbm90aWZ5IGdyb3VwLiAgKi8KK2V4dGVybiBpbnQgZmFub3RpZnlfaW5pdCAodW5zaWduZWQgaW50IF9fZmxhZ3MsIHVuc2lnbmVkIGludCBfX2V2ZW50X2ZfZmxhZ3MpCisgIF9fVEhST1c7CisKKy8qIEFkZCwgcmVtb3ZlLCBvciBtb2RpZnkgYW4gZmFub3RpZnkgbWFyayBvbiBhIGZpbGVzeXN0ZW0gb2JqZWN0LiAgKi8KK2V4dGVybiBpbnQgZmFub3RpZnlfbWFyayAoaW50IF9fZmFub3RpZnlfZmQsIHVuc2lnbmVkIGludCBfX2ZsYWdzLAorCQkJICB1aW50NjRfdCBfX21hc2ssIGludCBfX2RmZCwgY29uc3QgY2hhciAqX19wYXRobmFtZSkKKyAgICAgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9mYW5vdGlmeS5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2ZjbnRsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2ZjbnRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzMDQ1NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZmNudGwuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8ZmNudGwuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZmlsZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiMzYzNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZmlsZS5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDk2LCA5NywgOTgsIDk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfRklMRV9ICisjZGVmaW5lCV9TWVNfRklMRV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpZm5kZWYJX0ZDTlRMX0gKKyMgaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZgorCitfX0JFR0lOX0RFQ0xTCisKKworLyogQWx0ZXJuYXRlIG5hbWVzIGZvciB2YWx1ZXMgZm9yIHRoZSBXSEVOQ0UgYXJndW1lbnQgdG8gYGxzZWVrJy4KKyAgIFRoZXNlIGFyZSB0aGUgc2FtZSBhcyBTRUVLX1NFVCwgU0VFS19DVVIsIGFuZCBTRUVLX0VORCwgcmVzcGVjdGl2ZWx5LiAgKi8KKyNpZm5kZWYgTF9TRVQKKyMgZGVmaW5lIExfU0VUCTAJLyogU2VlayBmcm9tIGJlZ2lubmluZyBvZiBmaWxlLiAgKi8KKyMgZGVmaW5lIExfSU5DUgkxCS8qIFNlZWsgZnJvbSBjdXJyZW50IHBvc2l0aW9uLiAgKi8KKyMgZGVmaW5lIExfWFRORAkyCS8qIFNlZWsgZnJvbSBlbmQgb2YgZmlsZS4gICovCisjZW5kaWYKKworCisvKiBPcGVyYXRpb25zIGZvciB0aGUgYGZsb2NrJyBjYWxsLiAgKi8KKyNkZWZpbmUJTE9DS19TSAkxCS8qIFNoYXJlZCBsb2NrLiAgKi8KKyNkZWZpbmUJTE9DS19FWAkyIAkvKiBFeGNsdXNpdmUgbG9jay4gICovCisjZGVmaW5lCUxPQ0tfVU4JOAkvKiBVbmxvY2suICAqLworCisvKiBDYW4gYmUgT1InZCBpbiB0byBvbmUgb2YgdGhlIGFib3ZlLiAgKi8KKyNkZWZpbmUJTE9DS19OQgk0CS8qIERvbid0IGJsb2NrIHdoZW4gbG9ja2luZy4gICovCisKKworLyogQXBwbHkgb3IgcmVtb3ZlIGFuIGFkdmlzb3J5IGxvY2ssIGFjY29yZGluZyB0byBPUEVSQVRJT04sCisgICBvbiB0aGUgZmlsZSBGRCByZWZlcnMgdG8uICAqLworZXh0ZXJuIGludCBmbG9jayAoaW50IF9fZmQsIGludCBfX29wZXJhdGlvbikgX19USFJPVzsKKworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL2ZpbGUuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZnN1aWQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZnN1aWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWNiMTk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9mc3VpZC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX0ZTVUlEX0gKKyNkZWZpbmUgX1NZU19GU1VJRF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogQ2hhbmdlIHVpZCB1c2VkIGZvciBmaWxlIGFjY2VzcyBjb250cm9sIHRvIFVJRCwgd2l0aG91dCBhZmZlY3RpbmcKKyAgIG90aGVyIHByaXZpbGVnZXMgKHN1Y2ggYXMgd2hvIGNhbiBzZW5kIHNpZ25hbHMgYXQgdGhlIHByb2Nlc3MpLiAgKi8KK2V4dGVybiBpbnQgc2V0ZnN1aWQgKF9fdWlkX3QgX191aWQpIF9fVEhST1c7CisKKy8qIERpdHRvIGZvciBncm91cCBpZC4gKi8KK2V4dGVybiBpbnQgc2V0ZnNnaWQgKF9fZ2lkX3QgX19naWQpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBmc3VpZC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2dtb24uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZ21vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMmY4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2dtb24uaApAQCAtMCwwICsxLDIwMSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTIsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpZ21vbi5oCTguMiAoQmVya2VsZXkpIDEvNC85NAorICovCisKKyNpZm5kZWYJX1NZU19HTU9OX0gKKyNkZWZpbmUJX1NZU19HTU9OX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKgorICogU2VlIGdtb25fb3V0LmggZm9yIGdtb24ub3V0IGZvcm1hdC4KKyAqLworCisvKiBzdHJ1Y3R1cmUgZW1pdHRlZCBieSAiZ2NjIC1hIi4gIFRoaXMgbXVzdCBtYXRjaCBzdHJ1Y3QgYmIgaW4KKyAgIGdjYy9saWJnY2MyLmMuICBJdCBpcyBPSyBmb3IgZ2NjIHRvIGRlY2xhcmUgYSBsb25nZXIgc3RydWN0dXJlIGFzCisgICBsb25nIGFzIHRoZSBtZW1iZXJzIGJlbG93IGFyZSBwcmVzZW50LiAgKi8KK3N0cnVjdCBfX2JiCit7CisgIGxvbmcJCQl6ZXJvX3dvcmQ7CisgIGNvbnN0IGNoYXIJCSpmaWxlbmFtZTsKKyAgbG9uZwkJCSpjb3VudHM7CisgIGxvbmcJCQluY291bnRzOworICBzdHJ1Y3QgX19iYgkJKm5leHQ7CisgIGNvbnN0IHVuc2lnbmVkIGxvbmcJKmFkZHJlc3NlczsKK307CisKK2V4dGVybiBzdHJ1Y3QgX19iYiAqX19iYl9oZWFkOworCisvKgorICogaGlzdG9ncmFtIGNvdW50ZXJzIGFyZSB1bnNpZ25lZCBzaG9ydHMgKGFjY29yZGluZyB0byB0aGUga2VybmVsKS4KKyAqLworI2RlZmluZQlISVNUQ09VTlRFUgl1bnNpZ25lZCBzaG9ydAorCisvKgorICogZnJhY3Rpb24gb2YgdGV4dCBzcGFjZSB0byBhbGxvY2F0ZSBmb3IgaGlzdG9ncmFtIGNvdW50ZXJzIGhlcmUsIDEvMgorICovCisjZGVmaW5lCUhJU1RGUkFDVElPTgkyCisKKy8qCisgKiBGcmFjdGlvbiBvZiB0ZXh0IHNwYWNlIHRvIGFsbG9jYXRlIGZvciBmcm9tIGhhc2ggYnVja2V0cy4KKyAqIFRoZSB2YWx1ZSBvZiBIQVNIRlJBQ1RJT04gaXMgYmFzZWQgb24gdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzCisgKiBvZiBzZXBhcmF0aW9uIGJldHdlZW4gdHdvIHN1YnJvdXRpbmUgY2FsbCBwb2ludHMgaW4gdGhlIG9iamVjdCBjb2RlLgorICogR2l2ZW4gTUlOX1NVQlJfU0VQQVJBVElPTiBieXRlcyBvZiBzZXBhcmF0aW9uIHRoZSB2YWx1ZSBvZgorICogSEFTSEZSQUNUSU9OIGlzIGNhbGN1bGF0ZWQgYXM6CisgKgorICoJSEFTSEZSQUNUSU9OID0gTUlOX1NVQlJfU0VQQVJBVElPTiAvICgyICogc2l6ZW9mKHNob3J0KSAtIDEpOworICoKKyAqIEZvciBleGFtcGxlLCBvbiB0aGUgVkFYLCB0aGUgc2hvcnRlc3QgdHdvIGNhbGwgc2VxdWVuY2UgaXM6CisgKgorICoJY2FsbHMJJDAsKHIwKQorICoJY2FsbHMJJDAsKHIwKQorICoKKyAqIHdoaWNoIGlzIHNlcGFyYXRlZCBieSBvbmx5IHRocmVlIGJ5dGVzLCB0aHVzIEhBU0hGUkFDVElPTiBpcworICogY2FsY3VsYXRlZCBhczoKKyAqCisgKglIQVNIRlJBQ1RJT04gPSAzIC8gKDIgKiAyIC0gMSkgPSAxCisgKgorICogTm90ZSB0aGF0IHRoZSBkaXZpc2lvbiBhYm92ZSByb3VuZHMgZG93biwgdGh1cyBpZiBNSU5fU1VCUl9GUkFDVElPTgorICogaXMgbGVzcyB0aGFuIHRocmVlLCB0aGlzIGFsZ29yaXRobSB3aWxsIG5vdCB3b3JrIQorICoKKyAqIEluIHByYWN0aWNlLCBob3dldmVyLCBjYWxsIGluc3RydWN0aW9ucyBhcmUgcmFyZWx5IGF0IGEgbWluaW1hbAorICogZGlzdGFuY2UuICBIZW5jZSwgd2Ugd2lsbCBkZWZpbmUgSEFTSEZSQUNUSU9OIHRvIGJlIDIgYWNyb3NzIGFsbAorICogYXJjaGl0ZWN0dXJlcy4gIFRoaXMgc2F2ZXMgYSByZWFzb25hYmxlIGFtb3VudCBvZiBzcGFjZSBmb3IKKyAqIHByb2ZpbGluZyBkYXRhIHN0cnVjdHVyZXMgd2l0aG91dCAoaW4gcHJhY3RpY2UpIHNhY3JpZmljaW5nCisgKiBhbnkgZ3JhbnVsYXJpdHkuCisgKi8KKyNkZWZpbmUJSEFTSEZSQUNUSU9OCTIKKworLyoKKyAqIFBlcmNlbnQgb2YgdGV4dCBzcGFjZSB0byBhbGxvY2F0ZSBmb3IgdG9zdHJ1Y3RzLgorICogVGhpcyBpcyBhIGhldXJpc3RpYzsgd2Ugd2lsbCBmYWlsIHdpdGggYSB3YXJuaW5nIHdoZW4gcHJvZmlsaW5nIHByb2dyYW1zCisgKiB3aXRoIGEgdmVyeSBsYXJnZSBudW1iZXIgb2YgdmVyeSBzbWFsbCBmdW5jdGlvbnMsIGJ1dCB0aGF0J3MKKyAqIG5vcm1hbGx5IE9LLgorICogMiBpcyBwcm9iYWJseSBzdGlsbCBhIGdvb2QgdmFsdWUgZm9yIG5vcm1hbCBwcm9ncmFtcy4KKyAqIFByb2ZpbGluZyBhIHRlc3QgY2FzZSB3aXRoIDY0MDAwIHNtYWxsIGZ1bmN0aW9ucyB3aWxsIHdvcmsgaWYKKyAqIHlvdSByYWlzZSB0aGlzIHZhbHVlIHRvIDMgYW5kIGxpbmsgc3RhdGljYWxseSAod2hpY2ggYmxvYXRzIHRoZQorICogdGV4dCBzaXplLCB0aHVzIHJhaXNpbmcgdGhlIG51bWJlciBvZiBhcmNzIGV4cGVjdGVkIGJ5IHRoZSBoZXVyaXN0aWMpLgorICovCisjZGVmaW5lIEFSQ0RFTlNJVFkJMworCisvKgorICogQWx3YXlzIGFsbG9jYXRlIGF0IGxlYXN0IHRoaXMgbWFueSB0b3N0cnVjdHMuICBUaGlzCisgKiBoaWRlcyB0aGUgaW5hZGVxdWFjeSBvZiB0aGUgQVJDREVOU0lUWSBoZXVyaXN0aWMsIGF0IGxlYXN0CisgKiBmb3Igc21hbGwgcHJvZ3JhbXMuCisgKi8KKyNkZWZpbmUgTUlOQVJDUwkJNTAKKworLyoKKyAqIFRoZSB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IGluZGljZXMgaW50byBnbW9ucGFyYW0udG9zW10uCisgKi8KKyNkZWZpbmUJQVJDSU5ERVgJdV9sb25nCisKKy8qIAorICogTWF4aW11bSBudW1iZXIgb2YgYXJjcyB3ZSB3YW50IHRvIGFsbG93LgorICogVXNlZCB0byBiZSBtYXggcmVwcmVzZW50YWJsZSB2YWx1ZSBvZiBBUkNJTkRFWCBtaW51cyAyLCBidXQgbm93IAorICogdGhhdCBBUkNJTkRFWCBpcyBhIGxvbmcsIHRoYXQncyB0b28gbGFyZ2U7IHdlIGRvbid0IHJlYWxseSB3YW50IAorICogdG8gYWxsb3cgYSA0OCBnaWdhYnl0ZSB0YWJsZS4KKyAqIFRoZSBvbGQgdmFsdWUgb2YgMTw8MTYgd2Fzbid0IGhpZ2ggZW5vdWdoIGluIHByYWN0aWNlIGZvciBsYXJnZSBDKysKKyAqIHByb2dyYW1zOyB3aWxsIDE8PDIwIGJlIGFkZXF1YXRlIGZvciBsb25nPyAgRklYTUUKKyAqLworI2RlZmluZSBNQVhBUkNTCQkoMSA8PCAyMCkKKworc3RydWN0IHRvc3RydWN0IHsKKwl1X2xvbmcJCXNlbGZwYzsKKwlsb25nCQljb3VudDsKKwlBUkNJTkRFWAlsaW5rOworfTsKKworLyoKKyAqIGEgcmF3IGFyYywgd2l0aCBwb2ludGVycyB0byB0aGUgY2FsbGluZyBzaXRlIGFuZAorICogdGhlIGNhbGxlZCBzaXRlIGFuZCBhIGNvdW50LgorICovCitzdHJ1Y3QgcmF3YXJjIHsKKwl1X2xvbmcJcmF3X2Zyb21wYzsKKwl1X2xvbmcJcmF3X3NlbGZwYzsKKwlsb25nCXJhd19jb3VudDsKK307CisKKy8qCisgKiBnZW5lcmFsIHJvdW5kaW5nIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZSBST1VORERPV04oeCx5KQkoKCh4KS8oeSkpKih5KSkKKyNkZWZpbmUgUk9VTkRVUCh4LHkpCSgoKCh4KSsoeSktMSkvKHkpKSooeSkpCisKKy8qCisgKiBUaGUgcHJvZmlsaW5nIGRhdGEgc3RydWN0dXJlcyBhcmUgaG91c2VkIGluIHRoaXMgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgZ21vbnBhcmFtIHsKKwlsb25nIGludAlzdGF0ZTsKKwl1X3Nob3J0CQkqa2NvdW50OworCXVfbG9uZwkJa2NvdW50c2l6ZTsKKwlBUkNJTkRFWAkqZnJvbXM7CisJdV9sb25nCQlmcm9tc3NpemU7CisJc3RydWN0IHRvc3RydWN0CSp0b3M7CisJdV9sb25nCQl0b3NzaXplOworCWxvbmcJCXRvbGltaXQ7CisJdV9sb25nCQlsb3dwYzsKKwl1X2xvbmcJCWhpZ2hwYzsKKwl1X2xvbmcJCXRleHRzaXplOworCXVfbG9uZwkJaGFzaGZyYWN0aW9uOworCWxvbmcJCWxvZ19oYXNoZnJhY3Rpb247Cit9OworCisvKgorICogUG9zc2libGUgc3RhdGVzIG9mIHByb2ZpbGluZy4KKyAqLworI2RlZmluZQlHTU9OX1BST0ZfT04JMAorI2RlZmluZQlHTU9OX1BST0ZfQlVTWQkxCisjZGVmaW5lCUdNT05fUFJPRl9FUlJPUgkyCisjZGVmaW5lCUdNT05fUFJPRl9PRkYJMworCisvKgorICogU3lzY3RsIGRlZmluaXRpb25zIGZvciBleHRyYWN0aW5nIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBrZXJuZWwuCisgKi8KKyNkZWZpbmUJR1BST0ZfU1RBVEUJMAkvKiBpbnQ6IHByb2ZpbGluZyBlbmFibGluZyB2YXJpYWJsZSAqLworI2RlZmluZQlHUFJPRl9DT1VOVAkxCS8qIHN0cnVjdDogcHJvZmlsZSB0aWNrIGNvdW50IGJ1ZmZlciAqLworI2RlZmluZQlHUFJPRl9GUk9NUwkyCS8qIHN0cnVjdDogZnJvbSBsb2NhdGlvbiBoYXNoIGJ1Y2tldCAqLworI2RlZmluZQlHUFJPRl9UT1MJMwkvKiBzdHJ1Y3Q6IGRlc3RpbmF0aW9uL2NvdW50IHN0cnVjdHVyZSAqLworI2RlZmluZQlHUFJPRl9HTU9OUEFSQU0JNAkvKiBzdHJ1Y3Q6IHByb2ZpbGluZyBwYXJhbWV0ZXJzIChzZWUgYWJvdmUpICovCisKK19fQkVHSU5fREVDTFMKKworLyogU2V0IHVwIGRhdGEgc3RydWN0dXJlcyBhbmQgc3RhcnQgcHJvZmlsaW5nLiAgKi8KK2V4dGVybiB2b2lkIF9fbW9uc3RhcnR1cCAodV9sb25nIF9fbG93cGMsIHVfbG9uZyBfX2hpZ2hwYykgX19USFJPVzsKK2V4dGVybiB2b2lkIG1vbnN0YXJ0dXAgKHVfbG9uZyBfX2xvd3BjLCB1X2xvbmcgX19oaWdocGMpIF9fVEhST1c7CisKKy8qIENsZWFuIHVwIHByb2ZpbGluZyBhbmQgd3JpdGUgb3V0IGdtb24ub3V0LiAgKi8KK2V4dGVybiB2b2lkIF9tY2xlYW51cCAodm9pZCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9nbW9uLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZ21vbl9vdXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvZ21vbl9vdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmEwOWU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9nbW9uX291dC5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgTW9zYmVyZ2VyIDxkYXZpZG1AY3MuYXJpem9uYS5lZHU+LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIHNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIGdtb24ub3V0IGZpbGVzLiAgSXQgc2hvdWxkIGhhdmUKKyAgIGFzIGZldyBleHRlcm5hbCBkZXBlbmRlbmNpZXMgYXMgcG9zc2libGUgYXMgaXQgaXMgZ29pbmcgdG8gYmUgaW5jbHVkZWQKKyAgIGluIG1hbnkgZGlmZmVyZW50IHByb2dyYW1zLiAgVGhhdCBpcywgbWluaW1pemUgdGhlIG51bWJlciBvZiAjaW5jbHVkZSdzLgorCisgICBBIGdtb24ub3V0IGZpbGUgY29uc2lzdHMgb2YgYSBoZWFkZXIgKGRlZmluZWQgYnkgZ21vbl9oZHIpIGZvbGxvd2VkIGJ5CisgICBhIHNlcXVlbmNlIG9mIHJlY29yZHMuICBFYWNoIHJlY29yZCBzdGFydHMgd2l0aCBhIG9uZS1ieXRlIHRhZworICAgaWRlbnRpZnlpbmcgdGhlIHR5cGUgb2YgcmVjb3JkcywgZm9sbG93ZWQgYnkgcmVjb3JkcyBzcGVjaWZpYyBkYXRhLiAqLworCisjaWZuZGVmIF9TWVNfR01PTl9PVVRfSAorI2RlZmluZSBfU1lTX0dNT05fT1VUX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2RlZmluZQlHTU9OX01BR0lDCSJnbW9uIgkvKiBtYWdpYyBjb29raWUgKi8KKyNkZWZpbmUgR01PTl9WRVJTSU9OCTEJLyogdmVyc2lvbiBudW1iZXIgKi8KKworLyogRm9yIHByb2ZpbGluZyBzaGFyZWQgb2JqZWN0IHdlIG5lZWQgYSBuZXcgZm9ybWF0LiAgKi8KKyNkZWZpbmUgR01PTl9TSE9CSl9WRVJTSU9OCTB4MWZmZmYKKworX19CRUdJTl9ERUNMUworCisvKgorICogUmF3IGhlYWRlciBhcyBpdCBhcHBlYXJzIG9uIGZpbGUgKHdpdGhvdXQgcGFkZGluZykuICBUaGlzIGhlYWRlcgorICogYWx3YXlzIGNvbWVzIGZpcnN0IGluIGdtb24ub3V0IGFuZCBpcyB0aGVuIGZvbGxvd2VkIGJ5IGEgc2VyaWVzCisgKiByZWNvcmRzIGRlZmluZWQgYmVsb3cuCisgKi8KK3N0cnVjdCBnbW9uX2hkcgorICB7CisgICAgY2hhciBjb29raWVbNF07CisgICAgY2hhciB2ZXJzaW9uWzRdOworICAgIGNoYXIgc3BhcmVbMyAqIDRdOworICB9OworCisvKiB0eXBlcyBvZiByZWNvcmRzIGluIHRoaXMgZmlsZTogKi8KK3R5cGVkZWYgZW51bQorICB7CisgICAgR01PTl9UQUdfVElNRV9ISVNUID0gMCwKKyAgICBHTU9OX1RBR19DR19BUkMgPSAxLAorICAgIEdNT05fVEFHX0JCX0NPVU5UID0gMgorICB9IEdNT05fUmVjb3JkX1RhZzsKKworc3RydWN0IGdtb25faGlzdF9oZHIKKyAgeworICAgIGNoYXIgbG93X3BjW3NpemVvZiAoY2hhciAqKV07CS8qIGJhc2UgcGMgYWRkcmVzcyBvZiBzYW1wbGUgYnVmZmVyICovCisgICAgY2hhciBoaWdoX3BjW3NpemVvZiAoY2hhciAqKV07CS8qIG1heCBwYyBhZGRyZXNzIG9mIHNhbXBsZWQgYnVmZmVyICovCisgICAgY2hhciBoaXN0X3NpemVbNF07CQkJLyogc2l6ZSBvZiBzYW1wbGUgYnVmZmVyICovCisgICAgY2hhciBwcm9mX3JhdGVbNF07CQkJLyogcHJvZmlsaW5nIGNsb2NrIHJhdGUgKi8KKyAgICBjaGFyIGRpbWVuWzE1XTsJCQkvKiBwaHlzLiBkaW0uLCB1c3VhbGx5ICJzZWNvbmRzIiAqLworICAgIGNoYXIgZGltZW5fYWJicmV2OwkJCS8qIHVzdWFsbHkgJ3MnIGZvciAic2Vjb25kcyIgKi8KKyAgfTsKKworc3RydWN0IGdtb25fY2dfYXJjX3JlY29yZAorICB7CisgICAgY2hhciBmcm9tX3BjW3NpemVvZiAoY2hhciAqKV07CS8qIGFkZHJlc3Mgd2l0aGluIGNhbGxlcidzIGJvZHkgKi8KKyAgICBjaGFyIHNlbGZfcGNbc2l6ZW9mIChjaGFyICopXTsJLyogYWRkcmVzcyB3aXRoaW4gY2FsbGVlJ3MgYm9keSAqLworICAgIGNoYXIgY291bnRbNF07CQkJLyogbnVtYmVyIG9mIGFyYyB0cmF2ZXJzYWxzICovCisgIH07CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvZ21vbl9vdXQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9pbm90aWZ5LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2lub3RpZnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWU5OTlhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9pbm90aWZ5LmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX0lOT1RJRllfSAorI2RlZmluZQlfU1lTX0lOT1RJRllfSAkxCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworCisvKiBGbGFncyBmb3IgdGhlIHBhcmFtZXRlciBvZiBpbm90aWZ5X2luaXQxLiAgKi8KK2VudW0KKyAgeworICAgIElOX0NMT0VYRUMgPSAwMjAwMDAwMCwKKyNkZWZpbmUgSU5fQ0xPRVhFQyBJTl9DTE9FWEVDCisgICAgSU5fTk9OQkxPQ0sgPSAwNDAwMAorI2RlZmluZSBJTl9OT05CTE9DSyBJTl9OT05CTE9DSworICB9OworCisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIGFuIGlub3RpZnkgZXZlbnQuICAqLworc3RydWN0IGlub3RpZnlfZXZlbnQKK3sKKyAgaW50IHdkOwkJLyogV2F0Y2ggZGVzY3JpcHRvci4gICovCisgIHVpbnQzMl90IG1hc2s7CS8qIFdhdGNoIG1hc2suICAqLworICB1aW50MzJfdCBjb29raWU7CS8qIENvb2tpZSB0byBzeW5jaHJvbml6ZSB0d28gZXZlbnRzLiAgKi8KKyAgdWludDMyX3QgbGVuOwkJLyogTGVuZ3RoIChpbmNsdWRpbmcgTlVMcykgb2YgbmFtZS4gICovCisgIGNoYXIgbmFtZSBfX2ZsZXhhcnI7CS8qIE5hbWUuICAqLworfTsKKworCisvKiBTdXBwb3J0ZWQgZXZlbnRzIHN1aXRhYmxlIGZvciBNQVNLIHBhcmFtZXRlciBvZiBJTk9USUZZX0FERF9XQVRDSC4gICovCisjZGVmaW5lIElOX0FDQ0VTUwkgMHgwMDAwMDAwMQkvKiBGaWxlIHdhcyBhY2Nlc3NlZC4gICovCisjZGVmaW5lIElOX01PRElGWQkgMHgwMDAwMDAwMgkvKiBGaWxlIHdhcyBtb2RpZmllZC4gICovCisjZGVmaW5lIElOX0FUVFJJQgkgMHgwMDAwMDAwNAkvKiBNZXRhZGF0YSBjaGFuZ2VkLiAgKi8KKyNkZWZpbmUgSU5fQ0xPU0VfV1JJVEUJIDB4MDAwMDAwMDgJLyogV3JpdHRhYmxlIGZpbGUgd2FzIGNsb3NlZC4gICovCisjZGVmaW5lIElOX0NMT1NFX05PV1JJVEUgMHgwMDAwMDAxMAkvKiBVbndyaXR0YWJsZSBmaWxlIGNsb3NlZC4gICovCisjZGVmaW5lIElOX0NMT1NFCSAoSU5fQ0xPU0VfV1JJVEUgfCBJTl9DTE9TRV9OT1dSSVRFKSAvKiBDbG9zZS4gICovCisjZGVmaW5lIElOX09QRU4JCSAweDAwMDAwMDIwCS8qIEZpbGUgd2FzIG9wZW5lZC4gICovCisjZGVmaW5lIElOX01PVkVEX0ZST00JIDB4MDAwMDAwNDAJLyogRmlsZSB3YXMgbW92ZWQgZnJvbSBYLiAgKi8KKyNkZWZpbmUgSU5fTU9WRURfVE8gICAgICAweDAwMDAwMDgwCS8qIEZpbGUgd2FzIG1vdmVkIHRvIFkuICAqLworI2RlZmluZSBJTl9NT1ZFCQkgKElOX01PVkVEX0ZST00gfCBJTl9NT1ZFRF9UTykgLyogTW92ZXMuICAqLworI2RlZmluZSBJTl9DUkVBVEUJIDB4MDAwMDAxMDAJLyogU3ViZmlsZSB3YXMgY3JlYXRlZC4gICovCisjZGVmaW5lIElOX0RFTEVURQkgMHgwMDAwMDIwMAkvKiBTdWJmaWxlIHdhcyBkZWxldGVkLiAgKi8KKyNkZWZpbmUgSU5fREVMRVRFX1NFTEYJIDB4MDAwMDA0MDAJLyogU2VsZiB3YXMgZGVsZXRlZC4gICovCisjZGVmaW5lIElOX01PVkVfU0VMRgkgMHgwMDAwMDgwMAkvKiBTZWxmIHdhcyBtb3ZlZC4gICovCisKKy8qIEV2ZW50cyBzZW50IGJ5IHRoZSBrZXJuZWwuICAqLworI2RlZmluZSBJTl9VTk1PVU5UCSAweDAwMDAyMDAwCS8qIEJhY2tpbmcgZnMgd2FzIHVubW91bnRlZC4gICovCisjZGVmaW5lIElOX1FfT1ZFUkZMT1cJIDB4MDAwMDQwMDAJLyogRXZlbnQgcXVldWVkIG92ZXJmbG93ZWQuICAqLworI2RlZmluZSBJTl9JR05PUkVECSAweDAwMDA4MDAwCS8qIEZpbGUgd2FzIGlnbm9yZWQuICAqLworCisvKiBIZWxwZXIgZXZlbnRzLiAgKi8KKyNkZWZpbmUgSU5fQ0xPU0UJIChJTl9DTE9TRV9XUklURSB8IElOX0NMT1NFX05PV1JJVEUpCS8qIENsb3NlLiAgKi8KKyNkZWZpbmUgSU5fTU9WRQkJIChJTl9NT1ZFRF9GUk9NIHwgSU5fTU9WRURfVE8pCQkvKiBNb3Zlcy4gICovCisKKy8qIFNwZWNpYWwgZmxhZ3MuICAqLworI2RlZmluZSBJTl9PTkxZRElSCSAweDAxMDAwMDAwCS8qIE9ubHkgd2F0Y2ggdGhlIHBhdGggaWYgaXQgaXMgYQorCQkJCQkgICBkaXJlY3RvcnkuICAqLworI2RlZmluZSBJTl9ET05UX0ZPTExPVwkgMHgwMjAwMDAwMAkvKiBEbyBub3QgZm9sbG93IGEgc3ltIGxpbmsuICAqLworI2RlZmluZSBJTl9FWENMX1VOTElOSwkgMHgwNDAwMDAwMAkvKiBFeGNsdWRlIGV2ZW50cyBvbiB1bmxpbmtlZAorCQkJCQkgICBvYmplY3RzLiAgKi8KKyNkZWZpbmUgSU5fTUFTS19BREQJIDB4MjAwMDAwMDAJLyogQWRkIHRvIHRoZSBtYXNrIG9mIGFuIGFscmVhZHkKKwkJCQkJICAgZXhpc3Rpbmcgd2F0Y2guICAqLworI2RlZmluZSBJTl9JU0RJUgkgMHg0MDAwMDAwMAkvKiBFdmVudCBvY2N1cnJlZCBhZ2FpbnN0IGRpci4gICovCisjZGVmaW5lIElOX09ORVNIT1QJIDB4ODAwMDAwMDAJLyogT25seSBzZW5kIGV2ZW50IG9uY2UuICAqLworCisvKiBBbGwgZXZlbnRzIHdoaWNoIGEgcHJvZ3JhbSBjYW4gd2FpdCBvbi4gICovCisjZGVmaW5lIElOX0FMTF9FVkVOVFMJIChJTl9BQ0NFU1MgfCBJTl9NT0RJRlkgfCBJTl9BVFRSSUIgfCBJTl9DTE9TRV9XUklURSAgXAorCQkJICB8IElOX0NMT1NFX05PV1JJVEUgfCBJTl9PUEVOIHwgSU5fTU9WRURfRlJPTQkgICAgICBcCisJCQkgIHwgSU5fTU9WRURfVE8gfCBJTl9DUkVBVEUgfCBJTl9ERUxFVEUJCSAgICAgIFwKKwkJCSAgfCBJTl9ERUxFVEVfU0VMRiB8IElOX01PVkVfU0VMRikKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBpbm90aWZ5IGluc3RhbmNlLiAgKi8KK2V4dGVybiBpbnQgaW5vdGlmeV9pbml0ICh2b2lkKSBfX1RIUk9XOworCisvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgaW5vdGlmeSBpbnN0YW5jZS4gICovCitleHRlcm4gaW50IGlub3RpZnlfaW5pdDEgKGludCBfX2ZsYWdzKSBfX1RIUk9XOworCisvKiBBZGQgd2F0Y2ggb2Ygb2JqZWN0IE5BTUUgdG8gaW5vdGlmeSBpbnN0YW5jZSBGRC4gIE5vdGlmeSBhYm91dAorICAgZXZlbnRzIHNwZWNpZmllZCBieSBNQVNLLiAgKi8KK2V4dGVybiBpbnQgaW5vdGlmeV9hZGRfd2F0Y2ggKGludCBfX2ZkLCBjb25zdCBjaGFyICpfX25hbWUsIHVpbnQzMl90IF9fbWFzaykKKyAgX19USFJPVzsKKworLyogUmVtb3ZlIHRoZSB3YXRjaCBzcGVjaWZpZWQgYnkgV0QgZnJvbSB0aGUgaW5vdGlmeSBpbnN0YW5jZSBGRC4gICovCitleHRlcm4gaW50IGlub3RpZnlfcm1fd2F0Y2ggKGludCBfX2ZkLCBpbnQgX193ZCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9pbm90aWZ5LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvaW8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjg1MzdmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9pby5oCkBAIC0wLDAgKzEsMTgxIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDIwMDAsIDIwMDIsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19JT19ICisjZGVmaW5lCV9TWVNfSU9fSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIElmIFRVUk5fT04gaXMgVFJVRSwgcmVxdWVzdCBmb3IgcGVybWlzc2lvbiB0byBkbyBkaXJlY3QgaS9vIG9uIHRoZQorICAgcG9ydCBudW1iZXJzIGluIHRoZSByYW5nZSBbRlJPTSxGUk9NK05VTS0xXS4gIE90aGVyd2lzZSwgdHVybiBJL08KKyAgIHBlcm1pc3Npb24gb2ZmIGZvciB0aGF0IHJhbmdlLiAgVGhpcyBjYWxsIHJlcXVpcmVzIHJvb3QgcHJpdmlsZWdlcy4KKworICAgUG9ydGFiaWxpdHkgbm90ZTogbm90IGFsbCBMaW51eCBwbGF0Zm9ybXMgc3VwcG9ydCB0aGlzIGNhbGwuICBNb3N0CisgICBwbGF0Zm9ybXMgYmFzZWQgb24gdGhlIFBDIEkvTyBhcmNoaXRlY3R1cmUgcHJvYmFibHkgd2lsbCwgaG93ZXZlci4KKyAgIEUuZy4sIExpbnV4L0FscGhhIGZvciBBbHBoYSBQQ3Mgc3VwcG9ydHMgdGhpcy4gICovCitleHRlcm4gaW50IGlvcGVybSAodW5zaWduZWQgbG9uZyBpbnQgX19mcm9tLCB1bnNpZ25lZCBsb25nIGludCBfX251bSwKKyAgICAgICAgICAgICAgICAgICBpbnQgX190dXJuX29uKSBfX1RIUk9XOworCisvKiBTZXQgdGhlIEkvTyBwcml2aWxlZ2UgbGV2ZWwgdG8gTEVWRUwuICBJZiBMRVZFTD4zLCBwZXJtaXNzaW9uIHRvCisgICBhY2Nlc3MgYW55IEkvTyBwb3J0IGlzIGdyYW50ZWQuICBUaGlzIGNhbGwgcmVxdWlyZXMgcm9vdAorICAgcHJpdmlsZWdlcy4gKi8KK2V4dGVybiBpbnQgaW9wbCAoaW50IF9fbGV2ZWwpIF9fVEhST1c7CisKKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIKKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGNoYXIKK2luYiAodW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCkKK3sKKyAgdW5zaWduZWQgY2hhciBfdjsKKworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImluYiAldzEsJTAiOiI9YSIgKF92KToiTmQiIChfX3BvcnQpKTsKKyAgcmV0dXJuIF92OworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgY2hhcgoraW5iX3AgKHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQpCit7CisgIHVuc2lnbmVkIGNoYXIgX3Y7CisKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpbmIgJXcxLCUwXG5vdXRiICUlYWwsJDB4ODAiOiI9YSIgKF92KToiTmQiIChfX3BvcnQpKTsKKyAgcmV0dXJuIF92OworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50CitpbncgKHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQpCit7CisgIHVuc2lnbmVkIHNob3J0IF92OworCisgIF9fYXNtX18gX192b2xhdGlsZV9fICgiaW53ICV3MSwlMCI6Ij1hIiAoX3YpOiJOZCIgKF9fcG9ydCkpOworICByZXR1cm4gX3Y7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBzaG9ydCBpbnQKK2lud19wICh1bnNpZ25lZCBzaG9ydCBpbnQgX19wb3J0KQoreworICB1bnNpZ25lZCBzaG9ydCBpbnQgX3Y7CisKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpbncgJXcxLCUwXG5vdXRiICUlYWwsJDB4ODAiOiI9YSIgKF92KToiTmQiIChfX3BvcnQpKTsKKyAgcmV0dXJuIF92OworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitpbmwgKHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQpCit7CisgIHVuc2lnbmVkIGludCBfdjsKKworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImlubCAldzEsJTAiOiI9YSIgKF92KToiTmQiIChfX3BvcnQpKTsKKyAgcmV0dXJuIF92OworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitpbmxfcCAodW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCkKK3sKKyAgdW5zaWduZWQgaW50IF92OworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImlubCAldzEsJTBcbm91dGIgJSVhbCwkMHg4MCI6Ij1hIiAoX3YpOiJOZCIgKF9fcG9ydCkpOworICByZXR1cm4gX3Y7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitvdXRiICh1bnNpZ25lZCBjaGFyIF9fdmFsdWUsIHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgib3V0YiAlYjAsJXcxIjogOiJhIiAoX192YWx1ZSksICJOZCIgKF9fcG9ydCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorb3V0Yl9wICh1bnNpZ25lZCBjaGFyIF9fdmFsdWUsIHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgib3V0YiAlYjAsJXcxXG5vdXRiICUlYWwsJDB4ODAiOiA6ImEiIChfX3ZhbHVlKSwKKwkJCSJOZCIgKF9fcG9ydCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorb3V0dyAodW5zaWduZWQgc2hvcnQgaW50IF9fdmFsdWUsIHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgib3V0dyAldzAsJXcxIjogOiJhIiAoX192YWx1ZSksICJOZCIgKF9fcG9ydCkpOworCit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitvdXR3X3AgKHVuc2lnbmVkIHNob3J0IGludCBfX3ZhbHVlLCB1bnNpZ25lZCBzaG9ydCBpbnQgX19wb3J0KQoreworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm91dHcgJXcwLCV3MVxub3V0YiAlJWFsLCQweDgwIjogOiJhIiAoX192YWx1ZSksCisJCQkiTmQiIChfX3BvcnQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK291dGwgKHVuc2lnbmVkIGludCBfX3ZhbHVlLCB1bnNpZ25lZCBzaG9ydCBpbnQgX19wb3J0KQoreworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm91dGwgJTAsJXcxIjogOiJhIiAoX192YWx1ZSksICJOZCIgKF9fcG9ydCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorb3V0bF9wICh1bnNpZ25lZCBpbnQgX192YWx1ZSwgdW5zaWduZWQgc2hvcnQgaW50IF9fcG9ydCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJvdXRsICUwLCV3MVxub3V0YiAlJWFsLCQweDgwIjogOiJhIiAoX192YWx1ZSksCisJCQkiTmQiIChfX3BvcnQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2luc2IgKHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgaW50IF9fY291bnQpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgiY2xkIDsgcmVwIDsgaW5zYiI6Ij1EIiAoYWRkciksICI9YyIgKF9fY291bnQpCisJCQk6ImQiIChfX3BvcnQpLCAiMCIgKGFkZHIpLCAiMSIgKF9fY291bnQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2luc3cgKHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgaW50IF9fY291bnQpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgiY2xkIDsgcmVwIDsgaW5zdyI6Ij1EIiAoYWRkciksICI9YyIgKF9fY291bnQpCisJCQk6ImQiIChfX3BvcnQpLCAiMCIgKGFkZHIpLCAiMSIgKF9fY291bnQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2luc2wgKHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgaW50IF9fY291bnQpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgiY2xkIDsgcmVwIDsgaW5zbCI6Ij1EIiAoYWRkciksICI9YyIgKF9fY291bnQpCisJCQk6ImQiIChfX3BvcnQpLCAiMCIgKGFkZHIpLCAiMSIgKF9fY291bnQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK291dHNiICh1bnNpZ25lZCBzaG9ydCBpbnQgX19wb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGludCBfX2NvdW50KQoreworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNsZCA7IHJlcCA7IG91dHNiIjoiPVMiIChhZGRyKSwgIj1jIiAoX19jb3VudCkKKwkJCToiZCIgKF9fcG9ydCksICIwIiAoYWRkciksICIxIiAoX19jb3VudCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorb3V0c3cgKHVuc2lnbmVkIHNob3J0IGludCBfX3BvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgaW50IF9fY291bnQpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgiY2xkIDsgcmVwIDsgb3V0c3ciOiI9UyIgKGFkZHIpLCAiPWMiIChfX2NvdW50KQorICAJCQk6ImQiIChfX3BvcnQpLCAiMCIgKGFkZHIpLCAiMSIgKF9fY291bnQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK291dHNsICh1bnNpZ25lZCBzaG9ydCBpbnQgX19wb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGludCBfX2NvdW50KQoreworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNsZCA7IHJlcCA7IG91dHNsIjoiPVMiIChhZGRyKSwgIj1jIiAoX19jb3VudCkKKwkJCToiZCIgKF9fcG9ydCksICIwIiAoYWRkciksICIxIiAoX19jb3VudCkpOworfQorCisjZW5kaWYJLyogR05VIEMgKi8KKworX19FTkRfREVDTFMKKyNlbmRpZiAvKiBfU1lTX0lPX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvaW9jdGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDhhMGY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9pb2N0bC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTYsIDk4LCA5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX0lPQ1RMX0gKKyNkZWZpbmUJX1NZU19JT0NUTF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogR2V0IHRoZSBsaXN0IG9mIGBpb2N0bCcgcmVxdWVzdHMgYW5kIHJlbGF0ZWQgY29uc3RhbnRzLiAgKi8KKyNpbmNsdWRlIDxiaXRzL2lvY3Rscy5oPgorCisvKiBEZWZpbmUgc29tZSB0eXBlcyB1c2VkIGJ5IGBpb2N0bCcgcmVxdWVzdHMuICAqLworI2luY2x1ZGUgPGJpdHMvaW9jdGwtdHlwZXMuaD4KKworLyogT24gYSBVbml4IHN5c3RlbSwgdGhlIHN5c3RlbSA8c3lzL2lvY3RsLmg+IHByb2JhYmx5IGRlZmluZXMgc29tZSBvZgorICAgdGhlIHN5bWJvbHMgd2UgZGVmaW5lIGluIDxzeXMvdHR5ZGVmYXVsdHMuaD4gKHVzdWFsbHkgd2l0aCB0aGUgc2FtZQorICAgdmFsdWVzKS4gIFRoZSBjb2RlIHRvIGdlbmVyYXRlIDxiaXRzL2lvY3Rscy5oPiBoYXMgb21pdHRlZCB0aGVzZQorICAgc3ltYm9scyB0byBhdm9pZCB0aGUgY29uZmxpY3QsIGJ1dCBhIFVuaXggcHJvZ3JhbSBleHBlY3RzIDxzeXMvaW9jdGwuaD4KKyAgIHRvIGRlZmluZSB0aGVtLCBzbyB3ZSBtdXN0IGluY2x1ZGUgPHN5cy90dHlkZWZhdWx0cy5oPiBoZXJlLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHR5ZGVmYXVsdHMuaD4KKworLyogUGVyZm9ybSB0aGUgSS9PIGNvbnRyb2wgb3BlcmF0aW9uIHNwZWNpZmllZCBieSBSRVFVRVNUIG9uIEZELgorICAgT25lIGFyZ3VtZW50IG1heSBmb2xsb3c7IGl0cyBwcmVzZW5jZSBhbmQgdHlwZSBkZXBlbmQgb24gUkVRVUVTVC4KKyAgIFJldHVybiB2YWx1ZSBkZXBlbmRzIG9uIFJFUVVFU1QuICBVc3VhbGx5IC0xIGluZGljYXRlcyBlcnJvci4gICovCitleHRlcm4gaW50IGlvY3RsIChpbnQgX19mZCwgdW5zaWduZWQgbG9uZyBpbnQgX19yZXF1ZXN0LCAuLi4pIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvaW9jdGwuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9pcGMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvaXBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU4YzA5ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvaXBjLmgKQEAgLTAsMCArMSw1OSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NywxOTk5LDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19JUENfSAorI2RlZmluZSBfU1lTX0lQQ19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpZiAhZGVmaW5lZCBfX1VTRV9TVklEICYmICFkZWZpbmVkIF9fVVNFX1hPUEVOICYmIF9fR05VQ19fID49IDIKKyMgd2FybmluZyAiRmlsZXMgdXNpbmcgdGhpcyBoZWFkZXIgbXVzdCBiZSBjb21waWxlZCB3aXRoIF9TVklEX1NPVVJDRSBvciBfWE9QRU5fU09VUkNFIgorI2VuZGlmCisKKy8qIEdldCBzeXN0ZW0gZGVwZW5kZW50IGRlZmluaXRpb24gb2YgYHN0cnVjdCBpcGNfcGVybScgYW5kIG1vcmUuICAqLworI2luY2x1ZGUgPGJpdHMvaXBjdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL2lwYy5oPgorCisjaWZuZGVmIF9fdWlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3VpZF90IHVpZF90OworIyBkZWZpbmUgX191aWRfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX2dpZF90X2RlZmluZWQKK3R5cGVkZWYgX19naWRfdCBnaWRfdDsKKyMgZGVmaW5lIF9fZ2lkX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX19tb2RlX3RfZGVmaW5lZAordHlwZWRlZiBfX21vZGVfdCBtb2RlX3Q7CisjIGRlZmluZSBfX21vZGVfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX2tleV90X2RlZmluZWQKK3R5cGVkZWYgX19rZXlfdCBrZXlfdDsKKyMgZGVmaW5lIF9fa2V5X3RfZGVmaW5lZAorI2VuZGlmCisKK19fQkVHSU5fREVDTFMKKworLyogR2VuZXJhdGVzIGtleSBmb3IgU3lzdGVtIFYgc3R5bGUgSVBDLiAgKi8KK2V4dGVybiBrZXlfdCBmdG9rIChfX2NvbnN0IGNoYXIgKl9fcGF0aG5hbWUsIGludCBfX3Byb2pfaWQpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvaXBjLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMva2QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMva2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDU5YzA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9rZC5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX0tEX0gKKyNkZWZpbmUgX1NZU19LRF9ICTEKKworLyogTWFrZSBzdXJlIHRoZSA8bGludXgvdHlwZXMuaD4gaGVhZGVyIGlzIG5vdCBsb2FkZWQuICAqLworI2lmbmRlZiBfTElOVVhfVFlQRVNfSAorIyBkZWZpbmUgX0xJTlVYX1RZUEVTX0gJCTEKKyMgZGVmaW5lIF9fdW5kZWZfTElOVVhfVFlQRVNfSAorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9rZC5oPgorCisjaWZkZWYgX191bmRlZl9MSU5VWF9UWVBFU19ICisjIHVuZGVmIF9MSU5VWF9UWVBFU19ICisjIHVuZGVmIF9fdW5kZWZfTElOVVhfVFlQRVNfSAorI2VuZGlmCisKKyNlbmRpZgkvKiBzeXMva2QuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9rZGFlbW9uLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL2tkYWVtb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTQ5MWY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9rZGFlbW9uLmgKQEAgLTAsMCArMSwzMyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBJbnRlcmZhY2VzIHRvIGNvbnRyb2wgdGhlIHZhcmlvdXMga2VybmVsIGRhZW1vbnMuICAqLworCisjaWZuZGVmIF9TWVNfS0RBRU1PTl9ICisKKyNkZWZpbmUgX1NZU19LREFFTU9OX0gJMQorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogU3RhcnQsIGZsdXNoLCBvciB0dW5lIHRoZSBrZXJuZWwncyBidWZmZXIgZmx1c2hpbmcgZGFlbW9uLiAgKi8KK2V4dGVybiBpbnQgYmRmbHVzaCAoaW50IF9fZnVuYywgbG9uZyBpbnQgX19kYXRhKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogX1NZU19LREFFTU9OX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMva2xvZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9rbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmNWZlNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMva2xvZy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX0tMT0dfSAorCisjZGVmaW5lCV9TWVNfS0xPR19ICTEKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIENvbnRyb2wgdGhlIGtlcm5lbCdzIGxvZ2dpbmcgZmFjaWxpdHkuICBUaGlzIGNvcnJlc3BvbmRzIGV4YWN0bHkgdG8KKyAgIHRoZSBrZXJuZWwncyBzeXNsb2cgc3lzdGVtIGNhbGwsIGJ1dCB0aGF0IG5hbWUgaXMgZWFzaWx5IGNvbmZ1c2VkCisgICB3aXRoIHRoZSB1c2VyLWxldmVsIHN5c2xvZyBmYWNpbGl0eSwgd2hpY2ggaXMgc29tZXRoaW5nIGNvbXBsZXRlbHkKKyAgIGRpZmZlcmVudC4gICovCitleHRlcm4gaW50IGtsb2djdGwgKGludCBfX3R5cGUsIGNoYXIgKl9fYnVmcCwgaW50IF9fbGVuKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogX1NZU19LTE9HX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvbW1hbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNkOGEzZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvbW1hbi5oCkBAIC0wLDAgKzEsMTUyIEBACisvKiBEZWZpbml0aW9ucyBmb3IgQlNELXN0eWxlIG1lbW9yeSBtYW5hZ2VtZW50LgorICAgQ29weXJpZ2h0IChDKSAxOTk0LTIwMDAsIDIwMDMsIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19NTUFOX0gKKyNkZWZpbmUJX1NZU19NTUFOX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmbmRlZiBfX29mZl90X2RlZmluZWQKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX19vZmZfdCBvZmZfdDsKKyMgZWxzZQordHlwZWRlZiBfX29mZjY0X3Qgb2ZmX3Q7CisjIGVuZGlmCisjIGRlZmluZSBfX29mZl90X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fbW9kZV90X2RlZmluZWQKK3R5cGVkZWYgX19tb2RlX3QgbW9kZV90OworIyBkZWZpbmUgX19tb2RlX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL21tYW4uaD4KKworLyogUmV0dXJuIHZhbHVlIG9mIGBtbWFwJyBpbiBjYXNlIG9mIGFuIGVycm9yLiAgKi8KKyNkZWZpbmUgTUFQX0ZBSUxFRAkoKHZvaWQgKikgLTEpCisKK19fQkVHSU5fREVDTFMKKy8qIE1hcCBhZGRyZXNzZXMgc3RhcnRpbmcgbmVhciBBRERSIGFuZCBleHRlbmRpbmcgZm9yIExFTiBieXRlcy4gIGZyb20KKyAgIE9GRlNFVCBpbnRvIHRoZSBmaWxlIEZEIGRlc2NyaWJlcyBhY2NvcmRpbmcgdG8gUFJPVCBhbmQgRkxBR1MuICBJZiBBRERSCisgICBpcyBub256ZXJvLCBpdCBpcyB0aGUgZGVzaXJlZCBtYXBwaW5nIGFkZHJlc3MuICBJZiB0aGUgTUFQX0ZJWEVEIGJpdCBpcworICAgc2V0IGluIEZMQUdTLCB0aGUgbWFwcGluZyB3aWxsIGJlIGF0IEFERFIgZXhhY3RseSAod2hpY2ggbXVzdCBiZQorICAgcGFnZS1hbGlnbmVkKTsgb3RoZXJ3aXNlIHRoZSBzeXN0ZW0gY2hvb3NlcyBhIGNvbnZlbmllbnQgbmVhcmJ5IGFkZHJlc3MuCisgICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBhY3R1YWwgbWFwcGluZyBhZGRyZXNzIGNob3NlbiBvciBNQVBfRkFJTEVECisgICBmb3IgZXJyb3JzIChpbiB3aGljaCBjYXNlIGBlcnJubycgaXMgc2V0KS4gIEEgc3VjY2Vzc2Z1bCBgbW1hcCcgY2FsbAorICAgZGVhbGxvY2F0ZXMgYW55IHByZXZpb3VzIG1hcHBpbmcgZm9yIHRoZSBhZmZlY3RlZCByZWdpb24uICAqLworCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiB2b2lkICptbWFwICh2b2lkICpfX2FkZHIsIHNpemVfdCBfX2xlbiwgaW50IF9fcHJvdCwKKwkJICAgaW50IF9fZmxhZ3MsIGludCBfX2ZkLCBfX29mZl90IF9fb2Zmc2V0KSBfX1RIUk9XOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiB2b2lkICogX19SRURJUkVDVF9OVEggKG1tYXAsCisJCQkgICAgICAodm9pZCAqX19hZGRyLCBzaXplX3QgX19sZW4sIGludCBfX3Byb3QsCisJCQkgICAgICAgaW50IF9fZmxhZ3MsIGludCBfX2ZkLCBfX29mZjY0X3QgX19vZmZzZXQpLAorCQkJICAgICAgbW1hcDY0KTsKKyMgZWxzZQorIyAgZGVmaW5lIG1tYXAgbW1hcDY0CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIHZvaWQgKm1tYXA2NCAodm9pZCAqX19hZGRyLCBzaXplX3QgX19sZW4sIGludCBfX3Byb3QsCisJCSAgICAgaW50IF9fZmxhZ3MsIGludCBfX2ZkLCBfX29mZjY0X3QgX19vZmZzZXQpIF9fVEhST1c7CisjZW5kaWYKKworLyogRGVhbGxvY2F0ZSBhbnkgbWFwcGluZyBmb3IgdGhlIHJlZ2lvbiBzdGFydGluZyBhdCBBRERSIGFuZCBleHRlbmRpbmcgTEVOCisgICBieXRlcy4gIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCAtMSBmb3IgZXJyb3JzIChhbmQgc2V0cyBlcnJubykuICAqLworZXh0ZXJuIGludCBtdW5tYXAgKHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fbGVuKSBfX1RIUk9XOworCisvKiBDaGFuZ2UgdGhlIG1lbW9yeSBwcm90ZWN0aW9uIG9mIHRoZSByZWdpb24gc3RhcnRpbmcgYXQgQUREUiBhbmQKKyAgIGV4dGVuZGluZyBMRU4gYnl0ZXMgdG8gUFJPVC4gIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCAtMSBmb3IgZXJyb3JzCisgICAoYW5kIHNldHMgZXJybm8pLiAgKi8KK2V4dGVybiBpbnQgbXByb3RlY3QgKHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fbGVuLCBpbnQgX19wcm90KSBfX1RIUk9XOworCisvKiBTeW5jaHJvbml6ZSB0aGUgcmVnaW9uIHN0YXJ0aW5nIGF0IEFERFIgYW5kIGV4dGVuZGluZyBMRU4gYnl0ZXMgd2l0aCB0aGUKKyAgIGZpbGUgaXQgbWFwcy4gIEZpbGVzeXN0ZW0gb3BlcmF0aW9ucyBvbiBhIGZpbGUgYmVpbmcgbWFwcGVkIGFyZQorICAgdW5wcmVkaWN0YWJsZSBiZWZvcmUgdGhpcyBpcyBkb25lLiAgRmxhZ3MgYXJlIGZyb20gdGhlIE1TXyogc2V0LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgbXN5bmMgKHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fbGVuLCBpbnQgX19mbGFncyk7CisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIEFkdmlzZSB0aGUgc3lzdGVtIGFib3V0IHBhcnRpY3VsYXIgdXNhZ2UgcGF0dGVybnMgdGhlIHByb2dyYW0gZm9sbG93cworICAgZm9yIHRoZSByZWdpb24gc3RhcnRpbmcgYXQgQUREUiBhbmQgZXh0ZW5kaW5nIExFTiBieXRlcy4gICovCitleHRlcm4gaW50IG1hZHZpc2UgKHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fbGVuLCBpbnQgX19hZHZpY2UpIF9fVEhST1c7CisjZW5kaWYKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBUaGlzIGlzIHRoZSBQT1NJWCBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfbWFkdmlzZSAodm9pZCAqX19hZGRyLCBzaXplX3QgX19sZW4sIGludCBfX2FkdmljZSkgX19USFJPVzsKKyNlbmRpZgorCisvKiBHdWFyYW50ZWUgYWxsIHdob2xlIHBhZ2VzIG1hcHBlZCBieSB0aGUgcmFuZ2UgW0FERFIsQUREUitMRU4pIHRvCisgICBiZSBtZW1vcnkgcmVzaWRlbnQuICAqLworZXh0ZXJuIGludCBtbG9jayAoX19jb25zdCB2b2lkICpfX2FkZHIsIHNpemVfdCBfX2xlbikgX19USFJPVzsKKworLyogVW5sb2NrIHdob2xlIHBhZ2VzIHByZXZpb3VzbHkgbWFwcGVkIGJ5IHRoZSByYW5nZSBbQUREUixBRERSK0xFTikuICAqLworZXh0ZXJuIGludCBtdW5sb2NrIChfX2NvbnN0IHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fbGVuKSBfX1RIUk9XOworCisvKiBDYXVzZSBhbGwgY3VycmVudGx5IG1hcHBlZCBwYWdlcyBvZiB0aGUgcHJvY2VzcyB0byBiZSBtZW1vcnkgcmVzaWRlbnQKKyAgIHVudGlsIHVubG9ja2VkIGJ5IGEgY2FsbCB0byB0aGUgYG11bmxvY2thbGwnLCB1bnRpbCB0aGUgcHJvY2VzcyBleGl0cywKKyAgIG9yIHVudGlsIHRoZSBwcm9jZXNzIGNhbGxzIGBleGVjdmUnLiAgKi8KK2V4dGVybiBpbnQgbWxvY2thbGwgKGludCBfX2ZsYWdzKSBfX1RIUk9XOworCisvKiBBbGwgY3VycmVudGx5IG1hcHBlZCBwYWdlcyBvZiB0aGUgcHJvY2VzcycgYWRkcmVzcyBzcGFjZSBiZWNvbWUKKyAgIHVubG9ja2VkLiAgKi8KK2V4dGVybiBpbnQgbXVubG9ja2FsbCAodm9pZCkgX19USFJPVzsKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIG1pbmNvcmUgcmV0dXJucyB0aGUgbWVtb3J5IHJlc2lkZW5jeSBzdGF0dXMgb2YgdGhlIHBhZ2VzIGluIHRoZQorICAgY3VycmVudCBwcm9jZXNzJ3MgYWRkcmVzcyBzcGFjZSBzcGVjaWZpZWQgYnkgW3N0YXJ0LCBzdGFydCArIGxlbikuCisgICBUaGUgc3RhdHVzIGlzIHJldHVybmVkIGluIGEgdmVjdG9yIG9mIGJ5dGVzLiAgVGhlIGxlYXN0IHNpZ25pZmljYW50CisgICBiaXQgb2YgZWFjaCBieXRlIGlzIDEgaWYgdGhlIHJlZmVyZW5jZWQgcGFnZSBpcyBpbiBtZW1vcnksIG90aGVyd2lzZQorICAgaXQgaXMgemVyby4gICovCitleHRlcm4gaW50IG1pbmNvcmUgKHZvaWQgKl9fc3RhcnQsIHNpemVfdCBfX2xlbiwgdW5zaWduZWQgY2hhciAqX192ZWMpCisgICAgIF9fVEhST1c7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogUmVtYXAgcGFnZXMgbWFwcGVkIGJ5IHRoZSByYW5nZSBbQUREUixBRERSK09MRF9MRU4pIHRvIG5ldyBsZW5ndGgKKyAgIE5FV19MRU4uICBJZiBNUkVNQVBfTUFZTU9WRSBpcyBzZXQgaW4gRkxBR1MgdGhlIHJldHVybmVkIGFkZHJlc3MKKyAgIG1heSBkaWZmZXIgZnJvbSBBRERSLiAgSWYgTVJFTUFQX0ZJWEVEIGlzIHNldCBpbiBGTEFHUyB0aGUgZnVuY3Rpb24KKyAgIHRha2VzIGFub3RoZXIgcGFyYW10ZXIgd2hpY2ggaXMgYSBmaXhlZCBhZGRyZXNzIGF0IHdoaWNoIHRoZSBibG9jaworICAgcmVzaWRlcyBhZnRlciBhIHN1Y2Nlc3NmdWwgY2FsbC4gICovCitleHRlcm4gdm9pZCAqbXJlbWFwICh2b2lkICpfX2FkZHIsIHNpemVfdCBfX29sZF9sZW4sIHNpemVfdCBfX25ld19sZW4sCisJCSAgICAgaW50IF9fZmxhZ3MsIC4uLikgX19USFJPVzsKKworLyogUmVtYXAgYXJiaXRyYXJ5IHBhZ2VzIG9mIGEgc2hhcmVkIGJhY2tpbmcgc3RvcmUgd2l0aGluIGFuIGV4aXN0aW5nCisgICBWTUEuICAqLworZXh0ZXJuIGludCByZW1hcF9maWxlX3BhZ2VzICh2b2lkICpfX3N0YXJ0LCBzaXplX3QgX19zaXplLCBpbnQgX19wcm90LAorCQkJICAgICBzaXplX3QgX19wZ29mZiwgaW50IF9fZmxhZ3MpIF9fVEhST1c7CisjZW5kaWYKKworCisvKiBPcGVuIHNoYXJlZCBtZW1vcnkgc2VnbWVudC4gICovCitleHRlcm4gaW50IHNobV9vcGVuIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgaW50IF9fb2ZsYWcsIG1vZGVfdCBfX21vZGUpOworCisvKiBSZW1vdmUgc2hhcmVkIG1lbW9yeSBzZWdtZW50LiAgKi8KK2V4dGVybiBpbnQgc2htX3VubGluayAoX19jb25zdCBjaGFyICpfX25hbWUpOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3lzL21tYW4uaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9tb3VudC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9tb3VudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyM2I0NjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL21vdW50LmgKQEAgLTAsMCArMSwxNDggQEAKKy8qIEhlYWRlciBmaWxlIGZvciBtb3VudGluZy91bm1vdW50IExpbnV4IGZpbGVzeXN0ZW1zLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDAsIDIwMDQsIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIFRoaXMgaXMgdGFrZW4gZnJvbSAvdXNyL2luY2x1ZGUvbGludXgvZnMuaC4gICovCisKKyNpZm5kZWYgX1NZU19NT1VOVF9ICisjZGVmaW5lIF9TWVNfTU9VTlRfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjZGVmaW5lIEJMT0NLX1NJWkUJMTAyNAorI2RlZmluZSBCTE9DS19TSVpFX0JJVFMJMTAKKworCisvKiBUaGVzZSBhcmUgdGhlIGZzLWluZGVwZW5kZW50IG1vdW50LWZsYWdzOiB1cCB0byAxNiBmbGFncyBhcmUKKyAgIHN1cHBvcnRlZCAgKi8KK2VudW0KK3sKKyAgTVNfUkRPTkxZID0gMSwJCS8qIE1vdW50IHJlYWQtb25seS4gICovCisjZGVmaW5lIE1TX1JET05MWQlNU19SRE9OTFkKKyAgTVNfTk9TVUlEID0gMiwJCS8qIElnbm9yZSBzdWlkIGFuZCBzZ2lkIGJpdHMuICAqLworI2RlZmluZSBNU19OT1NVSUQJTVNfTk9TVUlECisgIE1TX05PREVWID0gNCwJCQkvKiBEaXNhbGxvdyBhY2Nlc3MgdG8gZGV2aWNlIHNwZWNpYWwgZmlsZXMuICAqLworI2RlZmluZSBNU19OT0RFVglNU19OT0RFVgorICBNU19OT0VYRUMgPSA4LAkJLyogRGlzYWxsb3cgcHJvZ3JhbSBleGVjdXRpb24uICAqLworI2RlZmluZSBNU19OT0VYRUMJTVNfTk9FWEVDCisgIE1TX1NZTkNIUk9OT1VTID0gMTYsCQkvKiBXcml0ZXMgYXJlIHN5bmNlZCBhdCBvbmNlLiAgKi8KKyNkZWZpbmUgTVNfU1lOQ0hST05PVVMJTVNfU1lOQ0hST05PVVMKKyAgTVNfUkVNT1VOVCA9IDMyLAkJLyogQWx0ZXIgZmxhZ3Mgb2YgYSBtb3VudGVkIEZTLiAgKi8KKyNkZWZpbmUgTVNfUkVNT1VOVAlNU19SRU1PVU5UCisgIE1TX01BTkRMT0NLID0gNjQsCQkvKiBBbGxvdyBtYW5kYXRvcnkgbG9ja3Mgb24gYW4gRlMuICAqLworI2RlZmluZSBNU19NQU5ETE9DSwlNU19NQU5ETE9DSworICBNU19ESVJTWU5DID0gMTI4LAkJLyogRGlyZWN0b3J5IG1vZGlmaWNhdGlvbnMgYXJlIHN5bmNocm9ub3VzLiAgKi8KKyNkZWZpbmUgTVNfRElSU1lOQwlNU19ESVJTWU5DCisgIE1TX05PQVRJTUUgPSAxMDI0LAkJLyogRG8gbm90IHVwZGF0ZSBhY2Nlc3MgdGltZXMuICAqLworI2RlZmluZSBNU19OT0FUSU1FCU1TX05PQVRJTUUKKyAgTVNfTk9ESVJBVElNRSA9IDIwNDgsCQkvKiBEbyBub3QgdXBkYXRlIGRpcmVjdG9yeSBhY2Nlc3MgdGltZXMuICAqLworI2RlZmluZSBNU19OT0RJUkFUSU1FCU1TX05PRElSQVRJTUUKKyAgTVNfQklORCA9IDQwOTYsCQkvKiBCaW5kIGRpcmVjdG9yeSBhdCBkaWZmZXJlbnQgcGxhY2UuICAqLworI2RlZmluZSBNU19CSU5ECQlNU19CSU5ECisgIE1TX01PVkUgPSA4MTkyLAorI2RlZmluZSBNU19NT1ZFCQlNU19NT1ZFCisgIE1TX1JFQyA9IDE2Mzg0LAorI2RlZmluZSBNU19SRUMJCU1TX1JFQworICBNU19TSUxFTlQgPSAzMjc2OCwKKyNkZWZpbmUgTVNfU0lMRU5UCU1TX1NJTEVOVAorICBNU19QT1NJWEFDTCA9IDEgPDwgMTYsCS8qIFZGUyBkb2VzIG5vdCBhcHBseSB0aGUgdW1hc2suICAqLworI2RlZmluZSBNU19QT1NJWEFDTAlNU19QT1NJWEFDTAorICBNU19VTkJJTkRBQkxFID0gMSA8PCAxNywJLyogQ2hhbmdlIHRvIHVuYmluZGFibGUuICAqLworI2RlZmluZSBNU19VTkJJTkRBQkxFCU1TX1VOQklOREFCTEUKKyAgTVNfUFJJVkFURSA9IDEgPDwgMTgsCQkvKiBDaGFuZ2UgdG8gcHJpdmF0ZS4gICovCisjZGVmaW5lIE1TX1BSSVZBVEUJTVNfUFJJVkFURQorICBNU19TTEFWRSA9IDEgPDwgMTksCQkvKiBDaGFuZ2UgdG8gc2xhdmUuICAqLworI2RlZmluZSBNU19TTEFWRQlNU19TTEFWRQorICBNU19TSEFSRUQgPSAxIDw8IDIwLAkJLyogQ2hhbmdlIHRvIHNoYXJlZC4gICovCisjZGVmaW5lIE1TX1NIQVJFRAlNU19TSEFSRUQKKyAgTVNfUkVMQVRJTUUgPSAxIDw8IDIxLAkvKiBVcGRhdGUgYXRpbWUgcmVsYXRpdmUgdG8gbXRpbWUvY3RpbWUuICAqLworI2RlZmluZSBNU19SRUxBVElNRQlNU19SRUxBVElNRQorICBNU19LRVJOTU9VTlQgPSAxIDw8IDIyLAkvKiBUaGlzIGlzIGEga2Vybl9tb3VudCBjYWxsLiAgKi8KKyNkZWZpbmUgTVNfS0VSTk1PVU5UCU1TX0tFUk5NT1VOVAorICBNU19JX1ZFUlNJT04gPSAgMSA8PCAyMywJLyogVXBkYXRlIGlub2RlIElfdmVyc2lvbiBmaWVsZC4gICovCisjZGVmaW5lIE1TX0lfVkVSU0lPTglNU19JX1ZFUlNJT04KKyAgTVNfU1RSSUNUQVRJTUUgPSAxIDw8IDI0LAkvKiBBbHdheXMgcGVyZm9ybSBhdGltZSB1cGRhdGVzLiAgKi8KKyNkZWZpbmUgTVNfU1RSSUNUQVRJTUUJTVNfU1RSSUNUQVRJTUUKKyAgTVNfQUNUSVZFID0gMSA8PCAzMCwKKyNkZWZpbmUgTVNfQUNUSVZFCU1TX0FDVElWRQorICBNU19OT1VTRVIgPSAxIDw8IDMxCisjZGVmaW5lIE1TX05PVVNFUglNU19OT1VTRVIKK307CisKKy8qIEZsYWdzIHRoYXQgY2FuIGJlIGFsdGVyZWQgYnkgTVNfUkVNT1VOVCAgKi8KKyNkZWZpbmUgTVNfUk1UX01BU0sgKE1TX1JET05MWXxNU19TWU5DSFJPTk9VU3xNU19NQU5ETE9DS3xNU19JX1ZFUlNJT04pCisKKworLyogTWFnaWMgbW91bnQgZmxhZyBudW1iZXIuIEhhcyB0byBiZSBvci1lZCB0byB0aGUgZmxhZyB2YWx1ZXMuICAqLworCisjZGVmaW5lIE1TX01HQ19WQUwgMHhjMGVkMDAwMAkvKiBNYWdpYyBmbGFnIG51bWJlciB0byBpbmRpY2F0ZSAibmV3IiBmbGFncyAqLworI2RlZmluZSBNU19NR0NfTVNLIDB4ZmZmZjAwMDAJLyogTWFnaWMgZmxhZyBudW1iZXIgbWFzayAqLworCisKKy8qIFRoZSByZWFkLW9ubHkgc3R1ZmYgZG9lc24ndCByZWFsbHkgYmVsb25nIGhlcmUsIGJ1dCBhbnkgb3RoZXIgcGxhY2UKKyAgIGlzIHByb2JhYmx5IGFzIGJhZCBhbmQgSSBkb24ndCB3YW50IHRvIGNyZWF0ZSB5ZXQgYW5vdGhlciBpbmNsdWRlCisgICBmaWxlLiAgKi8KKworI2RlZmluZSBCTEtST1NFVCAgIF9JTygweDEyLCA5MykgLyogU2V0IGRldmljZSByZWFkLW9ubHkgKDAgPSByZWFkLXdyaXRlKS4gICovCisjZGVmaW5lIEJMS1JPR0VUICAgX0lPKDB4MTIsIDk0KSAvKiBHZXQgcmVhZC1vbmx5IHN0YXR1cyAoMCA9IHJlYWRfd3JpdGUpLiAgKi8KKyNkZWZpbmUgQkxLUlJQQVJUICBfSU8oMHgxMiwgOTUpIC8qIFJlLXJlYWQgcGFydGl0aW9uIHRhYmxlLiAgKi8KKyNkZWZpbmUgQkxLR0VUU0laRSBfSU8oMHgxMiwgOTYpIC8qIFJldHVybiBkZXZpY2Ugc2l6ZS4gICovCisjZGVmaW5lIEJMS0ZMU0JVRiAgX0lPKDB4MTIsIDk3KSAvKiBGbHVzaCBidWZmZXIgY2FjaGUuICAqLworI2RlZmluZSBCTEtSQVNFVCAgIF9JTygweDEyLCA5OCkgLyogU2V0IHJlYWQgYWhlYWQgZm9yIGJsb2NrIGRldmljZS4gICovCisjZGVmaW5lIEJMS1JBR0VUICAgX0lPKDB4MTIsIDk5KSAvKiBHZXQgY3VycmVudCByZWFkIGFoZWFkIHNldHRpbmcuICAqLworI2RlZmluZSBCTEtGUkFTRVQgIF9JTygweDEyLDEwMCkgLyogU2V0IGZpbGVzeXN0ZW0gcmVhZC1haGVhZC4gICovCisjZGVmaW5lIEJMS0ZSQUdFVCAgX0lPKDB4MTIsMTAxKSAvKiBHZXQgZmlsZXN5c3RlbSByZWFkLWFoZWFkLiAgKi8KKyNkZWZpbmUgQkxLU0VDVFNFVCBfSU8oMHgxMiwxMDIpIC8qIFNldCBtYXggc2VjdG9ycyBwZXIgcmVxdWVzdC4gICovCisjZGVmaW5lIEJMS1NFQ1RHRVQgX0lPKDB4MTIsMTAzKSAvKiBHZXQgbWF4IHNlY3RvcnMgcGVyIHJlcXVlc3QuICAqLworI2RlZmluZSBCTEtTU1pHRVQgIF9JTygweDEyLDEwNCkgLyogR2V0IGJsb2NrIGRldmljZSBzZWN0b3Igc2l6ZS4gICovCisjZGVmaW5lIEJMS0JTWkdFVCAgX0lPUigweDEyLDExMixzaXplX3QpCisjZGVmaW5lIEJMS0JTWlNFVCAgX0lPVygweDEyLDExMyxzaXplX3QpCisjZGVmaW5lIEJMS0dFVFNJWkU2NCBfSU9SKDB4MTIsMTE0LHNpemVfdCkgLyogcmV0dXJuIGRldmljZSBzaXplLiAgKi8KKworCisvKiBQb3NzaWJsZSB2YWx1ZSBmb3IgRkxBR1MgcGFyYW1ldGVyIG9mIGB1bW91bnQyJy4gICovCitlbnVtCit7CisgIE1OVF9GT1JDRSA9IDEsCQkvKiBGb3JjZSB1bm1vdW50aW5nLiAgKi8KKyNkZWZpbmUgTU5UX0ZPUkNFIE1OVF9GT1JDRQorICBNTlRfREVUQUNIID0gMiwJCS8qIEp1c3QgZGV0YWNoIGZyb20gdGhlIHRyZWUuICAqLworI2RlZmluZSBNTlRfREVUQUNIIE1OVF9ERVRBQ0gKKyAgTU5UX0VYUElSRSA9IDQsCQkvKiBNYXJrIGZvciBleHBpcnkuICAqLworI2RlZmluZSBNTlRfRVhQSVJFIE1OVF9FWFBJUkUKKyAgVU1PVU5UX05PRk9MTE9XID0gOAkJLyogRG9uJ3QgZm9sbG93IHN5bWxpbmsgb24gdW1vdW50LiAgKi8KKyNkZWZpbmUgVU1PVU5UX05PRk9MTE9XIFVNT1VOVF9OT0ZPTExPVworfTsKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIE1vdW50IGEgZmlsZXN5c3RlbS4gICovCitleHRlcm4gaW50IG1vdW50IChfX2NvbnN0IGNoYXIgKl9fc3BlY2lhbF9maWxlLCBfX2NvbnN0IGNoYXIgKl9fZGlyLAorCQkgIF9fY29uc3QgY2hhciAqX19mc3R5cGUsIHVuc2lnbmVkIGxvbmcgaW50IF9fcndmbGFnLAorCQkgIF9fY29uc3Qgdm9pZCAqX19kYXRhKSBfX1RIUk9XOworCisvKiBVbm1vdW50IGEgZmlsZXN5c3RlbS4gICovCitleHRlcm4gaW50IHVtb3VudCAoX19jb25zdCBjaGFyICpfX3NwZWNpYWxfZmlsZSkgX19USFJPVzsKKworLyogVW5tb3VudCBhIGZpbGVzeXN0ZW0uICBGb3JjZSB1bm1vdW50aW5nIGlmIEZMQUdTIGlzIHNldCB0byBNTlRfRk9SQ0UuICAqLworZXh0ZXJuIGludCB1bW91bnQyIChfX2NvbnN0IGNoYXIgKl9fc3BlY2lhbF9maWxlLCBpbnQgX19mbGFncykgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9TWVNfTU9VTlRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9tc2cuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvbXNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjOTZiZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvbXNnLmgKQEAgLTAsMCArMSw4NSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsMTk5OSwyMDAwLDIwMDMsMjAwNiwyMDA3CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX01TR19ICisjZGVmaW5lIF9TWVNfTVNHX0gKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBHZXQgY29tbW9uIGRlZmluaXRpb24gb2YgU3lzdGVtIFYgc3R5bGUgSVBDLiAgKi8KKyNpbmNsdWRlIDxzeXMvaXBjLmg+CisKKy8qIEdldCBzeXN0ZW0gZGVwZW5kZW50IGRlZmluaXRpb24gb2YgYHN0cnVjdCBtc3FpZF9kcycgYW5kIG1vcmUuICAqLworI2luY2x1ZGUgPGJpdHMvbXNxLmg+CisKKy8qIERlZmluZSB0eXBlcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQuICAqLworI2RlZmluZQlfX25lZWRfdGltZV90CisjaW5jbHVkZSA8dGltZS5oPgorCisjaWZuZGVmIF9fcGlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3BpZF90IHBpZF90OworIyBkZWZpbmUgX19waWRfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX3NzaXplX3RfZGVmaW5lZAordHlwZWRlZiBfX3NzaXplX3Qgc3NpemVfdDsKKyMgZGVmaW5lIF9fc3NpemVfdF9kZWZpbmVkCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBTeXN0ZW0gViBzdHlsZSBJUEMgZnVuY3Rpb25zIGltcGxlbWVudCBhIG1lc3NhZ2UgcXVldWUKKyAgIHN5c3RlbS4gIFRoZSBkZWZpbml0aW9uIGlzIGZvdW5kIGluIFhQRzIuICAqLworCisjaWZkZWYgX19VU0VfR05VCisvKiBUZW1wbGF0ZSBmb3Igc3RydWN0IHRvIGJlIHVzZWQgYXMgYXJndW1lbnQgZm9yIGBtc2dzbmQnIGFuZCBgbXNncmN2Jy4gICovCitzdHJ1Y3QgbXNnYnVmCisgIHsKKyAgICBsb25nIGludCBtdHlwZTsJCS8qIHR5cGUgb2YgcmVjZWl2ZWQvc2VudCBtZXNzYWdlICovCisgICAgY2hhciBtdGV4dFsxXTsJCS8qIHRleHQgb2YgdGhlIG1lc3NhZ2UgKi8KKyAgfTsKKyNlbmRpZgorCisKK19fQkVHSU5fREVDTFMKKworLyogTWVzc2FnZSBxdWV1ZSBjb250cm9sIG9wZXJhdGlvbi4gICovCitleHRlcm4gaW50IG1zZ2N0bCAoaW50IF9fbXNxaWQsIGludCBfX2NtZCwgc3RydWN0IG1zcWlkX2RzICpfX2J1ZikgX19USFJPVzsKKworLyogR2V0IG1lc3NhZ2VzIHF1ZXVlLiAgKi8KK2V4dGVybiBpbnQgbXNnZ2V0IChrZXlfdCBfX2tleSwgaW50IF9fbXNnZmxnKSBfX1RIUk9XOworCisvKiBSZWNlaXZlIG1lc3NhZ2UgZnJvbSBtZXNzYWdlIHF1ZXVlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IG1zZ3JjdiAoaW50IF9fbXNxaWQsIHZvaWQgKl9fbXNncCwgc2l6ZV90IF9fbXNnc3osCisJCSAgICAgICBsb25nIGludCBfX21zZ3R5cCwgaW50IF9fbXNnZmxnKTsKKworLyogU2VuZCBtZXNzYWdlIHRvIG1lc3NhZ2UgcXVldWUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBtc2dzbmQgKGludCBfX21zcWlkLCBfX2NvbnN0IHZvaWQgKl9fbXNncCwgc2l6ZV90IF9fbXNnc3osCisJCSAgIGludCBfX21zZ2ZsZyk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvbXNnLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvbXRpby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9tdGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFmYTU1MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvbXRpby5oCkBAIC0wLDAgKzEsMjc3IEBACisvKiBTdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucyBmb3IgbWFnbmV0aWMgdGFwZSBJL08gY29udHJvbCBjb21tYW5kcy4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogV3JpdHRlbiBieSBILiBCZXJnbWFuIDxoZW5udXNAY3liZXJjb21tLm5sPi4gICovCisKKyNpZm5kZWYgX1NZU19NVElPX0gKKyNkZWZpbmUgX1NZU19NVElPX0gJMQorCisvKiBHZXQgbmVjZXNzYXJ5IGRlZmluaXRpb25zIGZyb20gc3lzdGVtIGFuZCBrZXJuZWwgaGVhZGVycy4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKworLyogU3RydWN0dXJlIGZvciBNVElPQ1RPUCAtIG1hZ25ldGljIHRhcGUgb3BlcmF0aW9uIGNvbW1hbmQuICAqLworc3RydWN0IG10b3AKKyAgeworICAgIHNob3J0IGludCBtdF9vcDsJCS8qIE9wZXJhdGlvbnMgZGVmaW5lZCBiZWxvdy4gICovCisgICAgaW50IG10X2NvdW50OwkJLyogSG93IG1hbnkgb2YgdGhlbS4gICovCisgIH07CisjZGVmaW5lIF9JT1RfbXRvcCAvKiBIdXJkIGlvY3RsIHR5cGUgZmllbGQuICAqLyBcCisgIF9JT1QgKF9JT1RTIChzaG9ydCksIDEsIF9JT1RTIChpbnQpLCAxLCAwLCAwKQorCisvKiBNYWduZXRpYyBUYXBlIG9wZXJhdGlvbnMgW05vdCBhbGwgb3BlcmF0aW9ucyBzdXBwb3J0ZWQgYnkgYWxsIGRyaXZlcnNdLiAgKi8KKyNkZWZpbmUgTVRSRVNFVCAwCS8qICtyZXNldCBkcml2ZSBpbiBjYXNlIG9mIHByb2JsZW1zLiAgKi8KKyNkZWZpbmUgTVRGU0YJMQkvKiBGb3J3YXJkIHNwYWNlIG92ZXIgRmlsZU1hcmssCisJCQkgKiBwb3NpdGlvbiBhdCBmaXJzdCByZWNvcmQgb2YgbmV4dCBmaWxlLiAgKi8KKyNkZWZpbmUgTVRCU0YJMgkvKiBCYWNrd2FyZCBzcGFjZSBGaWxlTWFyayAocG9zaXRpb24gYmVmb3JlIEZNKS4gICovCisjZGVmaW5lIE1URlNSCTMJLyogRm9yd2FyZCBzcGFjZSByZWNvcmQuICAqLworI2RlZmluZSBNVEJTUgk0CS8qIEJhY2t3YXJkIHNwYWNlIHJlY29yZC4gICovCisjZGVmaW5lIE1UV0VPRgk1CS8qIFdyaXRlIGFuIGVuZC1vZi1maWxlIHJlY29yZCAobWFyaykuICAqLworI2RlZmluZSBNVFJFVwk2CS8qIFJld2luZC4gICovCisjZGVmaW5lIE1UT0ZGTAk3CS8qIFJld2luZCBhbmQgcHV0IHRoZSBkcml2ZSBvZmZsaW5lIChlamVjdD8pLiAgKi8KKyNkZWZpbmUgTVROT1AJOAkvKiBObyBvcCwgc2V0IHN0YXR1cyBvbmx5IChyZWFkIHdpdGggTVRJT0NHRVQpLiAgKi8KKyNkZWZpbmUgTVRSRVRFTiA5CS8qIFJldGVuc2lvbiB0YXBlLiAgKi8KKyNkZWZpbmUgTVRCU0ZNCTEwCS8qICtiYWNrd2FyZCBzcGFjZSBGaWxlTWFyaywgcG9zaXRpb24gYXQgRk0uICAqLworI2RlZmluZSBNVEZTRk0gIDExCS8qICtmb3J3YXJkIHNwYWNlIEZpbGVNYXJrLCBwb3NpdGlvbiBhdCBGTS4gICovCisjZGVmaW5lIE1URU9NCTEyCS8qIEdvdG8gZW5kIG9mIHJlY29yZGVkIG1lZGlhIChmb3IgYXBwZW5kaW5nIGZpbGVzKS4KKwkJCSAgIE1URU9NIHBvc2l0aW9ucyBhZnRlciB0aGUgbGFzdCBGTSwgcmVhZHkgZm9yCisJCQkgICBhcHBlbmRpbmcgYW5vdGhlciBmaWxlLiAgKi8KKyNkZWZpbmUgTVRFUkFTRSAxMwkvKiBFcmFzZSB0YXBlIC0tIGJlIGNhcmVmdWwhICAqLworCisjZGVmaW5lIE1UUkFTMSAgMTQJLyogUnVuIHNlbGYgdGVzdCAxIChub25kZXN0cnVjdGl2ZSkuICAqLworI2RlZmluZSBNVFJBUzIJMTUJLyogUnVuIHNlbGYgdGVzdCAyIChkZXN0cnVjdGl2ZSkuICAqLworI2RlZmluZSBNVFJBUzMgIDE2CS8qIFJlc2VydmVkIGZvciBzZWxmIHRlc3QgMy4gICovCisKKyNkZWZpbmUgTVRTRVRCTEsgMjAJLyogU2V0IGJsb2NrIGxlbmd0aCAoU0NTSSkuICAqLworI2RlZmluZSBNVFNFVERFTlNJVFkgMjEJLyogU2V0IHRhcGUgZGVuc2l0eSAoU0NTSSkuICAqLworI2RlZmluZSBNVFNFRUsJMjIJLyogU2VlayB0byBibG9jayAoVGFuZGJlcmcsIGV0Yy4pLiAgKi8KKyNkZWZpbmUgTVRURUxMCTIzCS8qIFRlbGwgYmxvY2sgKFRhbmRiZXJnLCBldGMuKS4gICovCisjZGVmaW5lIE1UU0VURFJWQlVGRkVSIDI0IC8qIFNldCB0aGUgZHJpdmUgYnVmZmVyaW5nIGFjY29yZGluZyB0byBTQ1NJLTIuCisJCQkgICAgIE9yZGluYXJ5IGJ1ZmZlcmVkIG9wZXJhdGlvbiB3aXRoIGNvZGUgMS4gICovCisjZGVmaW5lIE1URlNTCTI1CS8qIFNwYWNlIGZvcndhcmQgb3ZlciBzZXRtYXJrcy4gICovCisjZGVmaW5lIE1UQlNTCTI2CS8qIFNwYWNlIGJhY2t3YXJkIG92ZXIgc2V0bWFya3MuICAqLworI2RlZmluZSBNVFdTTQkyNwkvKiBXcml0ZSBzZXRtYXJrcy4gICovCisKKyNkZWZpbmUgTVRMT0NLICAyOAkvKiBMb2NrIHRoZSBkcml2ZSBkb29yLiAgKi8KKyNkZWZpbmUgTVRVTkxPQ0sgMjkJLyogVW5sb2NrIHRoZSBkcml2ZSBkb29yLiAgKi8KKyNkZWZpbmUgTVRMT0FEICAzMAkvKiBFeGVjdXRlIHRoZSBTQ1NJIGxvYWQgY29tbWFuZC4gICovCisjZGVmaW5lIE1UVU5MT0FEIDMxCS8qIEV4ZWN1dGUgdGhlIFNDU0kgdW5sb2FkIGNvbW1hbmQuICAqLworI2RlZmluZSBNVENPTVBSRVNTSU9OIDMyLyogQ29udHJvbCBjb21wcmVzc2lvbiB3aXRoIFNDU0kgbW9kZSBwYWdlIDE1LiAgKi8KKyNkZWZpbmUgTVRTRVRQQVJUIDMzCS8qIENoYW5nZSB0aGUgYWN0aXZlIHRhcGUgcGFydGl0aW9uLiAgKi8KKyNkZWZpbmUgTVRNS1BBUlQgIDM0CS8qIEZvcm1hdCB0aGUgdGFwZSB3aXRoIG9uZSBvciB0d28gcGFydGl0aW9ucy4gICovCisKKy8qIHN0cnVjdHVyZSBmb3IgTVRJT0NHRVQgLSBtYWcgdGFwZSBnZXQgc3RhdHVzIGNvbW1hbmQgKi8KKworc3RydWN0IG10Z2V0CisgIHsKKyAgICBsb25nIGludCBtdF90eXBlOwkJLyogVHlwZSBvZiBtYWd0YXBlIGRldmljZS4gICovCisgICAgbG9uZyBpbnQgbXRfcmVzaWQ7CQkvKiBSZXNpZHVhbCBjb3VudDogKG5vdCBzdXJlKQorCQkJCSAgIG51bWJlciBvZiBieXRlcyBpZ25vcmVkLCBvcgorCQkJCSAgIG51bWJlciBvZiBmaWxlcyBub3Qgc2tpcHBlZCwgb3IKKwkJCQkgICBudW1iZXIgb2YgcmVjb3JkcyBub3Qgc2tpcHBlZC4gICovCisgICAgLyogVGhlIGZvbGxvd2luZyByZWdpc3RlcnMgYXJlIGRldmljZSBkZXBlbmRlbnQuICAqLworICAgIGxvbmcgaW50IG10X2RzcmVnOwkJLyogU3RhdHVzIHJlZ2lzdGVyLiAgKi8KKyAgICBsb25nIGludCBtdF9nc3RhdDsJCS8qIEdlbmVyaWMgKGRldmljZSBpbmRlcGVuZGVudCkgc3RhdHVzLiAgKi8KKyAgICBsb25nIGludCBtdF9lcnJlZzsJCS8qIEVycm9yIHJlZ2lzdGVyLiAgKi8KKyAgICAvKiBUaGUgbmV4dCB0d28gZmllbGRzIGFyZSBub3QgYWx3YXlzIHVzZWQuICAqLworICAgIF9fZGFkZHJfdCBtdF9maWxlbm87CS8qIE51bWJlciBvZiBjdXJyZW50IGZpbGUgb24gdGFwZS4gICovCisgICAgX19kYWRkcl90IG10X2Jsa25vOwkJLyogQ3VycmVudCBibG9jayBudW1iZXIuICAqLworICB9OworI2RlZmluZSBfSU9UX210Z2V0IC8qIEh1cmQgaW9jdGwgdHlwZSBmaWVsZC4gICovIFwKKyAgX0lPVCAoX0lPVFMgKGxvbmcpLCA3LCAwLCAwLCAwLCAwKQorCisKKy8qIENvbnN0YW50cyBmb3IgbXRfdHlwZS4gTm90IGFsbCBvZiB0aGVzZSBhcmUgc3VwcG9ydGVkLCBhbmQKKyAgIHRoZXNlIGFyZSBub3QgYWxsIG9mIHRoZSBvbmVzIHRoYXQgYXJlIHN1cHBvcnRlZC4gICovCisjZGVmaW5lIE1UX0lTVU5LTk9XTgkJMHgwMQorI2RlZmluZSBNVF9JU1FJQzAyCQkweDAyCS8qIEdlbmVyaWMgUUlDLTAyIHRhcGUgc3RyZWFtZXIuICAqLworI2RlZmluZSBNVF9JU1dUNTE1MAkJMHgwMwkvKiBXYW5ndGVrIDUxNTBFUSwgUUlDLTE1MCwgUUlDLTAyLiAgKi8KKyNkZWZpbmUgTVRfSVNBUkNISVZFXzU5NDVMMgkweDA0CS8qIEFyY2hpdmUgNTk0NUwtMiwgUUlDLTI0LCBRSUMtMDI/LiAqLworI2RlZmluZSBNVF9JU0NNU0o1MDAJCTB4MDUJLyogQ01TIEp1bWJvIDUwMCAoUUlDLTAyPykuICAqLworI2RlZmluZSBNVF9JU1REQzM2MTAJCTB4MDYJLyogVGFuZGJlcmcgNjMxMCwgUUlDLTI0LiAgKi8KKyNkZWZpbmUgTVRfSVNBUkNISVZFX1ZQNjBJCTB4MDcJLyogQXJjaGl2ZSBWUDYwaSwgUUlDLTAyLiAgKi8KKyNkZWZpbmUgTVRfSVNBUkNISVZFXzIxNTBMCTB4MDgJLyogQXJjaGl2ZSBWaXBlciAyMTUwTC4gICovCisjZGVmaW5lIE1UX0lTQVJDSElWRV8yMDYwTAkweDA5CS8qIEFyY2hpdmUgVmlwZXIgMjA2MEwuICAqLworI2RlZmluZSBNVF9JU0FSQ0hJVkVTQzQ5OQkweDBBCS8qIEFyY2hpdmUgU0MtNDk5IFFJQy0zNiBjb250cm9sbGVyLiAqLworI2RlZmluZSBNVF9JU1FJQzAyX0FMTF9GRUFUVVJFUwkweDBGCS8qIEdlbmVyaWMgUUlDLTAyIHdpdGggYWxsIGZlYXR1cmVzLiAqLworI2RlZmluZSBNVF9JU1dUNTA5OUVFTjI0CTB4MTEJLyogV2FuZ3RlayA1MDk5LWVlbjI0LCA2ME1CLCBRSUMtMjQuICovCisjZGVmaW5lIE1UX0lTVEVBQ19NVDJTVAkJMHgxMgkvKiBUZWFjIE1ULTJTVCAxNTVtYiBkcml2ZSwKKwkJCQkJICAgVGVhYyBEQy0xIGNhcmQgKFdhbmd0ZWsgdHlwZSkuICAqLworI2RlZmluZSBNVF9JU0VWRVJFWF9GVDQwQQkweDMyCS8qIEV2ZXJleCBGVDQwQSAoUUlDLTQwKS4gICovCisjZGVmaW5lIE1UX0lTRERTMQkJMHg1MQkvKiBERFMgZGV2aWNlIHdpdGhvdXQgcGFydGl0aW9ucy4gICovCisjZGVmaW5lIE1UX0lTRERTMgkJMHg1MgkvKiBERFMgZGV2aWNlIHdpdGggcGFydGl0aW9ucy4gICovCisjZGVmaW5lIE1UX0lTU0NTSTEJCTB4NzEJLyogR2VuZXJpYyBBTlNJIFNDU0ktMSB0YXBlIHVuaXQuICAqLworI2RlZmluZSBNVF9JU1NDU0kyCQkweDcyCS8qIEdlbmVyaWMgQU5TSSBTQ1NJLTIgdGFwZSB1bml0LiAgKi8KKworLyogUUlDLTQwLzgwLzMwMTAvMzAyMCBmdGFwZSBzdXBwb3J0ZWQgZHJpdmVzLgorICAgMjBiaXQgdmVuZG9yIElEICsgMHg4MDAwMDAgKHNlZSB2ZW5kb3JzLmggaW4gZnRhcGUgZGlzdHJpYnV0aW9uKS4gICovCisjZGVmaW5lIE1UX0lTRlRBUEVfVU5LTk9XTgkweDgwMDAwMCAvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBNVF9JU0ZUQVBFX0ZMQUcJCTB4ODAwMDAwCisKK3N0cnVjdCBtdF90YXBlX2luZm8KKyAgeworICAgIGxvbmcgaW50IHRfdHlwZTsJCS8qIERldmljZSB0eXBlIGlkIChtdF90eXBlKS4gICovCisgICAgY2hhciAqdF9uYW1lOwkJLyogRGVzY3JpcHRpdmUgbmFtZS4gICovCisgIH07CisKKyNkZWZpbmUgTVRfVEFQRV9JTkZPIFwKKyAgewkJCQkJCQkJCSAgICAgIFwKKwl7TVRfSVNVTktOT1dOLAkJIlVua25vd24gdHlwZSBvZiB0YXBlIGRldmljZSJ9LAkJICAgICAgXAorCXtNVF9JU1FJQzAyLAkJIkdlbmVyaWMgUUlDLTAyIHRhcGUgc3RyZWFtZXIifSwJICAgICAgXAorCXtNVF9JU1dUNTE1MCwJCSJXYW5ndGVrIDUxNTAsIFFJQy0xNTAifSwJCSAgICAgIFwKKwl7TVRfSVNBUkNISVZFXzU5NDVMMiwJIkFyY2hpdmUgNTk0NUwtMiJ9LAkJCSAgICAgIFwKKwl7TVRfSVNDTVNKNTAwLAkJIkNNUyBKdW1ibyA1MDAifSwJCQkgICAgICBcCisJe01UX0lTVERDMzYxMCwJCSJUYW5kYmVyZyBUREMgMzYxMCwgUUlDLTI0In0sCQkgICAgICBcCisJe01UX0lTQVJDSElWRV9WUDYwSSwJIkFyY2hpdmUgVlA2MGksIFFJQy0wMiJ9LAkJICAgICAgXAorCXtNVF9JU0FSQ0hJVkVfMjE1MEwsCSJBcmNoaXZlIFZpcGVyIDIxNTBMIn0sCQkJICAgICAgXAorCXtNVF9JU0FSQ0hJVkVfMjA2MEwsCSJBcmNoaXZlIFZpcGVyIDIwNjBMIn0sCQkJICAgICAgXAorCXtNVF9JU0FSQ0hJVkVTQzQ5OSwJIkFyY2hpdmUgU0MtNDk5IFFJQy0zNiBjb250cm9sbGVyIn0sCSAgICAgIFwKKwl7TVRfSVNRSUMwMl9BTExfRkVBVFVSRVMsICJHZW5lcmljIFFJQy0wMiB0YXBlLCBhbGwgZmVhdHVyZXMifSwJICAgICAgXAorCXtNVF9JU1dUNTA5OUVFTjI0LAkiV2FuZ3RlayA1MDk5LWVlbjI0LCA2ME1CIn0sCQkgICAgICBcCisJe01UX0lTVEVBQ19NVDJTVCwJIlRlYWMgTVQtMlNUIDE1NW1iIGRhdGEgY2Fzc2V0dGUgZHJpdmUifSwgICAgIFwKKwl7TVRfSVNFVkVSRVhfRlQ0MEEsCSJFdmVyZXggRlQ0MEEsIFFJQy00MCJ9LAkJICAgICAgXAorCXtNVF9JU1NDU0kxLAkJIkdlbmVyaWMgU0NTSS0xIHRhcGUifSwJCQkgICAgICBcCisJe01UX0lTU0NTSTIsCQkiR2VuZXJpYyBTQ1NJLTIgdGFwZSJ9LAkJCSAgICAgIFwKKwl7MCwgTlVMTH0JCQkJCQkJICAgICAgXAorICB9CisKKworLyogU3RydWN0dXJlIGZvciBNVElPQ1BPUyAtIG1hZyB0YXBlIGdldCBwb3NpdGlvbiBjb21tYW5kLiAgKi8KKworc3RydWN0IG10cG9zCisgIHsKKyAgICBsb25nIGludCBtdF9ibGtubzsJLyogQ3VycmVudCBibG9jayBudW1iZXIuICAqLworICB9OworI2RlZmluZSBfSU9UX210cG9zIC8qIEh1cmQgaW9jdGwgdHlwZSBmaWVsZC4gICovIFwKKyAgX0lPVF9TSU1QTEUgKGxvbmcpCisKKworLyogU3RydWN0dXJlIGZvciBNVElPQ0dFVENPTkZJRy9NVElPQ1NFVENPTkZJRyBwcmltYXJpbHkgaW50ZW5kZWQKKyAgIGFzIGFuIGludGVyaW0gc29sdXRpb24gZm9yIFFJQy0wMiB1bnRpbCBEREkgaXMgZnVsbHkgaW1wbGVtZW50ZWQuICAqLworc3RydWN0IG10Y29uZmlnaW5mbworICB7CisgICAgbG9uZyBpbnQgbXRfdHlwZTsJCS8qIERyaXZlIHR5cGUuICAqLworICAgIGxvbmcgaW50IGlmY190eXBlOwkJLyogSW50ZXJmYWNlIGNhcmQgdHlwZS4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IGlycW5yOwkvKiBJUlEgbnVtYmVyIHRvIHVzZS4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IGRtYW5yOwkvKiBETUEgY2hhbm5lbCB0byB1c2UuICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBwb3J0OwkvKiBJTyBwb3J0IGJhc2UgYWRkcmVzcy4gICovCisKKyAgICB1bnNpZ25lZCBsb25nIGludCBkZWJ1ZzsJLyogRGVidWdnaW5nIGZsYWdzLiAgKi8KKworICAgIHVuc2lnbmVkIGhhdmVfZGVuczoxOworICAgIHVuc2lnbmVkIGhhdmVfYnNmOjE7CisgICAgdW5zaWduZWQgaGF2ZV9mc3I6MTsKKyAgICB1bnNpZ25lZCBoYXZlX2JzcjoxOworICAgIHVuc2lnbmVkIGhhdmVfZW9kOjE7CisgICAgdW5zaWduZWQgaGF2ZV9zZWVrOjE7CisgICAgdW5zaWduZWQgaGF2ZV90ZWxsOjE7CisgICAgdW5zaWduZWQgaGF2ZV9yYXMxOjE7CisgICAgdW5zaWduZWQgaGF2ZV9yYXMyOjE7CisgICAgdW5zaWduZWQgaGF2ZV9yYXMzOjE7CisgICAgdW5zaWduZWQgaGF2ZV9xZmE6MTsKKworICAgIHVuc2lnbmVkIHBhZDE6NTsKKyAgICBjaGFyIHJlc2VydmVkWzEwXTsKKyAgfTsKKyNkZWZpbmUgX0lPVF9tdGNvbmZpZ2luZm8gLyogSHVyZCBpb2N0bCB0eXBlIGZpZWxkLiAgKi8gXAorICBfSU9UIChfSU9UUyAobG9uZyksIDIsIF9JT1RTIChzaG9ydCksIDMsIF9JT1RTIChsb25nKSwgMSkgLyogWFhYIHdyb25nICovCisKKworLyogTWFnbmV0aWMgdGFwZSBJL08gY29udHJvbCBjb21tYW5kcy4gICovCisjZGVmaW5lCU1USU9DVE9QCV9JT1coJ20nLCAxLCBzdHJ1Y3QgbXRvcCkJLyogRG8gYSBtYWcgdGFwZSBvcC4gKi8KKyNkZWZpbmUJTVRJT0NHRVQJX0lPUignbScsIDIsIHN0cnVjdCBtdGdldCkJLyogR2V0IHRhcGUgc3RhdHVzLiAgKi8KKyNkZWZpbmUJTVRJT0NQT1MJX0lPUignbScsIDMsIHN0cnVjdCBtdHBvcykJLyogR2V0IHRhcGUgcG9zaXRpb24uKi8KKworLyogVGhlIG5leHQgdHdvIGFyZSB1c2VkIGJ5IHRoZSBRSUMtMDIgZHJpdmVyIGZvciBydW50aW1lIHJlY29uZmlndXJhdGlvbi4KKyAgIFNlZSB0cHFpYzAyLmggZm9yIHN0cnVjdCBtdGNvbmZpZ2luZm8uICAqLworI2RlZmluZQlNVElPQ0dFVENPTkZJRwlfSU9SKCdtJywgNCwgc3RydWN0IG10Y29uZmlnaW5mbykgLyogR2V0IHRhcGUgY29uZmlnLiovCisjZGVmaW5lCU1USU9DU0VUQ09ORklHCV9JT1coJ20nLCA1LCBzdHJ1Y3QgbXRjb25maWdpbmZvKSAvKiBTZXQgdGFwZSBjb25maWcuKi8KKworLyogR2VuZXJpYyBNYWcgVGFwZSAoZGV2aWNlIGluZGVwZW5kZW50KSBzdGF0dXMgbWFjcm9zIGZvciBleGFtaW5pbmcKKyAgIG10X2dzdGF0IC0tIEhQLVVYIGNvbXBhdGlibGUuCisgICBUaGVyZSBpcyByb29tIGZvciBtb3JlIGdlbmVyaWMgc3RhdHVzIGJpdHMgaGVyZSwgYnV0IEkgZG9uJ3QKKyAgIGtub3cgd2hpY2ggb2YgdGhlbSBhcmUgcmVzZXJ2ZWQuIEF0IGxlYXN0IHRocmVlIG9yIHNvIHNob3VsZAorICAgYmUgYWRkZWQgdG8gbWFrZSB0aGlzIHJlYWxseSB1c2VmdWwuICAqLworI2RlZmluZSBHTVRfRU9GKHgpICAgICAgICAgICAgICAoKHgpICYgMHg4MDAwMDAwMCkKKyNkZWZpbmUgR01UX0JPVCh4KSAgICAgICAgICAgICAgKCh4KSAmIDB4NDAwMDAwMDApCisjZGVmaW5lIEdNVF9FT1QoeCkgICAgICAgICAgICAgICgoeCkgJiAweDIwMDAwMDAwKQorI2RlZmluZSBHTVRfU00oeCkgICAgICAgICAgICAgICAoKHgpICYgMHgxMDAwMDAwMCkgIC8qIEREUyBzZXRtYXJrICovCisjZGVmaW5lIEdNVF9FT0QoeCkgICAgICAgICAgICAgICgoeCkgJiAweDA4MDAwMDAwKSAgLyogRERTIEVPRCAqLworI2RlZmluZSBHTVRfV1JfUFJPVCh4KSAgICAgICAgICAoKHgpICYgMHgwNDAwMDAwMCkKKy8qICNkZWZpbmUgR01UXyA/IAkJKCh4KSAmIDB4MDIwMDAwMDApICovCisjZGVmaW5lIEdNVF9PTkxJTkUoeCkgICAgICAgICAgICgoeCkgJiAweDAxMDAwMDAwKQorI2RlZmluZSBHTVRfRF82MjUwKHgpICAgICAgICAgICAoKHgpICYgMHgwMDgwMDAwMCkKKyNkZWZpbmUgR01UX0RfMTYwMCh4KSAgICAgICAgICAgKCh4KSAmIDB4MDA0MDAwMDApCisjZGVmaW5lIEdNVF9EXzgwMCh4KSAgICAgICAgICAgICgoeCkgJiAweDAwMjAwMDAwKQorLyogI2RlZmluZSBHTVRfID8gCQkoKHgpICYgMHgwMDEwMDAwMCkgKi8KKy8qICNkZWZpbmUgR01UXyA/IAkJKCh4KSAmIDB4MDAwODAwMDApICovCisjZGVmaW5lIEdNVF9EUl9PUEVOKHgpICAgICAgICAgICgoeCkgJiAweDAwMDQwMDAwKSAgLyogRG9vciBvcGVuIChubyB0YXBlKS4gICovCisvKiAjZGVmaW5lIEdNVF8gPyAJCSgoeCkgJiAweDAwMDIwMDAwKSAqLworI2RlZmluZSBHTVRfSU1fUkVQX0VOKHgpICAgICAgICAoKHgpICYgMHgwMDAxMDAwMCkgIC8qIEltbWVkaWF0ZSByZXBvcnQgbW9kZS4qLworLyogMTYgZ2VuZXJpYyBzdGF0dXMgYml0cyB1bnVzZWQuICAqLworCisKKy8qIFNDU0ktdGFwZSBzcGVjaWZpYyBkZWZpbml0aW9ucy4gIEJpdGZpZWxkIHNoaWZ0cyBpbiB0aGUgc3RhdHVzICAqLworI2RlZmluZSBNVF9TVF9CTEtTSVpFX1NISUZUCTAKKyNkZWZpbmUgTVRfU1RfQkxLU0laRV9NQVNLCTB4ZmZmZmZmCisjZGVmaW5lIE1UX1NUX0RFTlNJVFlfU0hJRlQJMjQKKyNkZWZpbmUgTVRfU1RfREVOU0lUWV9NQVNLCTB4ZmYwMDAwMDAKKworI2RlZmluZSBNVF9TVF9TT0ZURVJSX1NISUZUCTAKKyNkZWZpbmUgTVRfU1RfU09GVEVSUl9NQVNLCTB4ZmZmZgorCisvKiBCaXRmaWVsZHMgZm9yIHRoZSBNVFNFVERSVkJVRkZFUiBpb2N0bC4gICovCisjZGVmaW5lIE1UX1NUX09QVElPTlMJCTB4ZjAwMDAwMDAKKyNkZWZpbmUgTVRfU1RfQk9PTEVBTlMJCTB4MTAwMDAwMDAKKyNkZWZpbmUgTVRfU1RfU0VUQk9PTEVBTlMJMHgzMDAwMDAwMAorI2RlZmluZSBNVF9TVF9DTEVBUkJPT0xFQU5TCTB4NDAwMDAwMDAKKyNkZWZpbmUgTVRfU1RfV1JJVEVfVEhSRVNIT0xECTB4MjAwMDAwMDAKKyNkZWZpbmUgTVRfU1RfREVGX0JMS1NJWkUJMHg1MDAwMDAwMAorI2RlZmluZSBNVF9TVF9ERUZfT1BUSU9OUwkweDYwMDAwMDAwCisKKyNkZWZpbmUgTVRfU1RfQlVGRkVSX1dSSVRFUwkweDEKKyNkZWZpbmUgTVRfU1RfQVNZTkNfV1JJVEVTCTB4MgorI2RlZmluZSBNVF9TVF9SRUFEX0FIRUFECTB4NAorI2RlZmluZSBNVF9TVF9ERUJVR0dJTkcJCTB4OAorI2RlZmluZSBNVF9TVF9UV09fRk0JCTB4MTAKKyNkZWZpbmUgTVRfU1RfRkFTVF9NVEVPTQkweDIwCisjZGVmaW5lIE1UX1NUX0FVVE9fTE9DSwkJMHg0MAorI2RlZmluZSBNVF9TVF9ERUZfV1JJVEVTCTB4ODAKKyNkZWZpbmUgTVRfU1RfQ0FOX0JTUgkJMHgxMDAKKyNkZWZpbmUgTVRfU1RfTk9fQkxLTElNUwkweDIwMAorI2RlZmluZSBNVF9TVF9DQU5fUEFSVElUSU9OUyAgICAweDQwMAorI2RlZmluZSBNVF9TVF9TQ1NJMkxPR0lDQUwgICAgICAweDgwMAorCisvKiBUaGUgbW9kZSBwYXJhbWV0ZXJzIHRvIGJlIGNvbnRyb2xsZWQuIFBhcmFtZXRlciBjaG9zZW4gd2l0aCBiaXRzIDIwLTI4LiAgKi8KKyNkZWZpbmUgTVRfU1RfQ0xFQVJfREVGQVVMVAkweGZmZmZmCisjZGVmaW5lIE1UX1NUX0RFRl9ERU5TSVRZCShNVF9TVF9ERUZfT1BUSU9OUyB8IDB4MTAwMDAwKQorI2RlZmluZSBNVF9TVF9ERUZfQ09NUFJFU1NJT04JKE1UX1NUX0RFRl9PUFRJT05TIHwgMHgyMDAwMDApCisjZGVmaW5lIE1UX1NUX0RFRl9EUlZCVUZGRVIJKE1UX1NUX0RFRl9PUFRJT05TIHwgMHgzMDAwMDApCisKKy8qIFRoZSBvZmZzZXQgZm9yIHRoZSBhcmd1bWVudHMgZm9yIHRoZSBzcGVjaWFsIEhQIGNoYW5nZXIgbG9hZCBjb21tYW5kLiAgKi8KKyNkZWZpbmUgTVRfU1RfSFBMT0FERVJfT0ZGU0VUIDEwMDAwCisKKworLyogU3BlY2lmeSBkZWZhdWx0IHRhcGUgZGV2aWNlLiAgKi8KKyNpZm5kZWYgREVGVEFQRQorIyBkZWZpbmUgREVGVEFQRQkiL2Rldi90YXBlIgorI2VuZGlmCisKKyNlbmRpZiAvKiBtdGlvLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcGFyYW0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYThmNWU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9wYXJhbS5oCkBAIC0wLDAgKzEsODMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LDIwMDAsMjAwMSwyMDAzLDIwMDgsMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19QQVJBTV9ICisjZGVmaW5lIF9TWVNfUEFSQU1fSAkxCisKKyNpZm5kZWYgQVJHX01BWAorIyBkZWZpbmUgX191bmRlZl9BUkdfTUFYCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisKKy8qIFRoZSBrZXJuZWwgaGVhZGVycyBkZWZpbmVzIEFSR19NQVguICBUaGUgdmFsdWUgaXMgd3JvbmcsIHRob3VnaC4gICovCisjaWZkZWYgX191bmRlZl9BUkdfTUFYCisjIHVuZGVmIEFSR19NQVgKKyMgdW5kZWYgX191bmRlZl9BUkdfTUFYCisjZW5kaWYKKworLyogQlNEIG5hbWVzIGZvciBzb21lIDxsaW1pdHMuaD4gdmFsdWVzLiAgKi8KKworI2RlZmluZQlOQkJZCQlDSEFSX0JJVAorI2lmbmRlZglOR1JPVVBTCisjIGRlZmluZSBOR1JPVVBTCU5HUk9VUFNfTUFYCisjZW5kaWYKKyNkZWZpbmUJTUFYU1lNTElOS1MJMjAKKyNkZWZpbmUJQ0FOQlNJWgkJTUFYX0NBTk9OCisjZGVmaW5lIE1BWFBBVEhMRU4JUEFUSF9NQVgKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIG5vdCByZWFsbHkgY29ycmVjdCBidXQgaXQgaXMgYSB2YWx1ZSB3ZSB1c2VkIGZvciBhCisgICBsb25nIHRpbWUgYW5kIHdoaWNoIHNlZW1zIHRvIGJlIHVzYWJsZS4gIFBlb3BsZSBzaG91bGQgbm90IHVzZSBOT0ZJTEUKKyAgIGFuZCBOQ0FSR1MgYW55d2F5LiAgKi8KKyNkZWZpbmUgTk9GSUxFCQkyNTYKKyNkZWZpbmUJTkNBUkdTCQkxMzEwNzIKKworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qIEJpdCBtYXAgcmVsYXRlZCBtYWNyb3MuICAqLworI2RlZmluZQlzZXRiaXQoYSxpKQkoKGEpWyhpKS9OQkJZXSB8PSAxPDwoKGkpJU5CQlkpKQorI2RlZmluZQljbHJiaXQoYSxpKQkoKGEpWyhpKS9OQkJZXSAmPSB+KDE8PCgoaSklTkJCWSkpKQorI2RlZmluZQlpc3NldChhLGkpCSgoYSlbKGkpL05CQlldICYgKDE8PCgoaSklTkJCWSkpKQorI2RlZmluZQlpc2NscihhLGkpCSgoKGEpWyhpKS9OQkJZXSAmICgxPDwoKGkpJU5CQlkpKSkgPT0gMCkKKworLyogTWFjcm9zIGZvciBjb3VudGluZyBhbmQgcm91bmRpbmcuICAqLworI2lmbmRlZiBob3dtYW55CisjIGRlZmluZSBob3dtYW55KHgsIHkpCSgoKHgpICsgKCh5KSAtIDEpKSAvICh5KSkKKyNlbmRpZgorI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSByb3VuZHVwKHgsIHkpCShfX2J1aWx0aW5fY29uc3RhbnRfcCAoeSkgJiYgcG93ZXJvZjIgKHkpCSAgICAgIFwKKwkJCSA/ICgoKHgpICsgKHkpIC0gMSkgJiB+KCh5KSAtIDEpKQkJICAgICAgXAorCQkJIDogKCgoKHgpICsgKCh5KSAtIDEpKSAvICh5KSkgKiAoeSkpKQorI2Vsc2UKKyMgZGVmaW5lIHJvdW5kdXAoeCwgeSkJKCgoKHgpICsgKCh5KSAtIDEpKSAvICh5KSkgKiAoeSkpCisjZW5kaWYKKyNkZWZpbmUgcG93ZXJvZjIoeCkJKCgoKHgpIC0gMSkgJiAoeCkpID09IDApCisKKy8qIE1hY3JvcyBmb3IgbWluL21heC4gICovCisjZGVmaW5lCU1JTihhLGIpICgoKGEpPChiKSk/KGEpOihiKSkKKyNkZWZpbmUJTUFYKGEsYikgKCgoYSk+KGIpKT8oYSk6KGIpKQorCisKKy8qIFVuaXQgb2YgYHN0X2Jsb2NrcycuICAqLworI2RlZmluZSBERVZfQlNJWkUgICAgICAgNTEyCisKKworI2VuZGlmCS8qIHN5cy9wYXJhbS5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3BjaS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjI2MjY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9wY2kuaApAQCAtMCwwICsxLDI1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19QQ0lfSAorI2RlZmluZSBfU1lTX1BDSV9ICTEKKworLyogV2UgdXNlIHRoZSBjb25zdGFudHMgZnJvbSB0aGUga2VybmVsLiAgKi8KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2VuZGlmIC8qIHN5cy9wY2kuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9wZXJtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Blcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODJmYTkyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9wZXJtLmgKQEAgLTAsMCArMSwzNiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5LCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfUEVSTV9ICisKKyNkZWZpbmUgX1NZU19QRVJNX0gJMQorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogU2V0IHBvcnQgaW5wdXQvb3V0cHV0IHBlcm1pc3Npb25zLiAgKi8KK2V4dGVybiBpbnQgaW9wZXJtICh1bnNpZ25lZCBsb25nIGludCBfX2Zyb20sIHVuc2lnbmVkIGxvbmcgaW50IF9fbnVtLAorCQkgICBpbnQgX190dXJuX29uKSBfX1RIUk9XOworCisKKy8qIENoYW5nZSBJL08gcHJpdmlsZWdlIGxldmVsLiAgKi8KK2V4dGVybiBpbnQgaW9wbCAoaW50IF9fbGV2ZWwpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBfU1lTX1BFUk1fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9wZXJzb25hbGl0eS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9wZXJzb25hbGl0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1M2E0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3BlcnNvbmFsaXR5LmgKQEAgLTAsMCArMSw3OCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBUYWtlbiB2ZXJiYXRpbSBmcm9tIExpbnV4IDIuNiAoaW5jbHVkZS9saW51eC9wZXJzb25hbGl0eS5oKS4gICovCisKKyNpZm5kZWYgX1NZU19QRVJTT05BTElUWV9ICisjZGVmaW5lIF9TWVNfUEVSU09OQUxJVFlfSCAxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBGbGFncyBmb3IgYnVnIGVtdWxhdGlvbi4KKyAgIFRoZXNlIG9jY3VweSB0aGUgdG9wIHRocmVlIGJ5dGVzLiAgKi8KK2VudW0KKyAgeworICAgIEFERFJfTk9fUkFORE9NSVpFID0gMHgwMDQwMDAwLAorICAgIE1NQVBfUEFHRV9aRVJPID0gMHgwMTAwMDAwLAorICAgIEFERFJfQ09NUEFUX0xBWU9VVCA9IDB4MDIwMDAwMCwKKyAgICBSRUFEX0lNUExJRVNfRVhFQyA9IDB4MDQwMDAwMCwKKyAgICBBRERSX0xJTUlUXzMyQklUID0gMHgwODAwMDAwLAorICAgIFNIT1JUX0lOT0RFID0gMHgxMDAwMDAwLAorICAgIFdIT0xFX1NFQ09ORFMgPSAweDIwMDAwMDAsCisgICAgU1RJQ0tZX1RJTUVPVVRTID0gMHg0MDAwMDAwLAorICAgIEFERFJfTElNSVRfM0dCID0gCTB4ODAwMDAwMAorICB9OworCisvKiBQZXJzb25hbGl0eSB0eXBlcy4KKworICAgVGhlc2UgZ28gaW4gdGhlIGxvdyBieXRlLiAgQXZvaWQgdXNpbmcgdGhlIHRvcCBiaXQsIGl0IHdpbGwKKyAgIGNvbmZsaWN0IHdpdGggZXJyb3IgcmV0dXJucy4gICovCitlbnVtIAorICB7CisgICAgUEVSX0xJTlVYID0gMHgwMDAwLAorICAgIFBFUl9MSU5VWF8zMkJJVCA9IDB4MDAwMCB8IEFERFJfTElNSVRfMzJCSVQsCisgICAgUEVSX1NWUjQgPSAweDAwMDEgfCBTVElDS1lfVElNRU9VVFMgfCBNTUFQX1BBR0VfWkVSTywKKyAgICBQRVJfU1ZSMyA9IDB4MDAwMiB8IFNUSUNLWV9USU1FT1VUUyB8IFNIT1JUX0lOT0RFLAorICAgIFBFUl9TQ09TVlIzID0gMHgwMDAzIHwgU1RJQ0tZX1RJTUVPVVRTIHwgV0hPTEVfU0VDT05EUyB8IFNIT1JUX0lOT0RFLAorICAgIFBFUl9PU1I1ID0gMHgwMDAzIHwgU1RJQ0tZX1RJTUVPVVRTIHwgV0hPTEVfU0VDT05EUywKKyAgICBQRVJfV1lTRVYzODYgPSAweDAwMDQgfCBTVElDS1lfVElNRU9VVFMgfCBTSE9SVF9JTk9ERSwKKyAgICBQRVJfSVNDUjQgPSAweDAwMDUgfCBTVElDS1lfVElNRU9VVFMsCisgICAgUEVSX0JTRCA9IDB4MDAwNiwKKyAgICBQRVJfU1VOT1MgPSAweDAwMDYgfCBTVElDS1lfVElNRU9VVFMsCisgICAgUEVSX1hFTklYID0gMHgwMDA3IHwgU1RJQ0tZX1RJTUVPVVRTIHwgU0hPUlRfSU5PREUsCisgICAgUEVSX0xJTlVYMzIgPSAweDAwMDgsCisgICAgUEVSX0xJTlVYMzJfM0dCID0gMHgwMDA4IHwgQUREUl9MSU1JVF8zR0IsCisgICAgUEVSX0lSSVgzMiA9IDB4MDAwOSB8IFNUSUNLWV9USU1FT1VUUywJLyogSVJJWDUgMzItYml0ICovCisgICAgUEVSX0lSSVhOMzIgPSAweDAwMGEgfCBTVElDS1lfVElNRU9VVFMsCS8qIElSSVg2IG5ldyAzMi1iaXQgKi8KKyAgICBQRVJfSVJJWDY0ID0gMHgwMDBiIHwgU1RJQ0tZX1RJTUVPVVRTLAkvKiBJUklYNiA2NC1iaXQgKi8KKyAgICBQRVJfUklTQ09TID0gMHgwMDBjLAorICAgIFBFUl9TT0xBUklTID0gMHgwMDBkIHwgU1RJQ0tZX1RJTUVPVVRTLAorICAgIFBFUl9VVzcgPSAweDAwMGUgfCBTVElDS1lfVElNRU9VVFMgfCBNTUFQX1BBR0VfWkVSTywKKyAgICBQRVJfT1NGNCA9IDB4MDAwZiwKKyAgICBQRVJfSFBVWCA9IDB4MDAxMCwKKyAgICBQRVJfTUFTSyA9IDB4MDBmZiwKKyAgfTsKKworX19CRUdJTl9ERUNMUworCisvKiBTZXQgZGlmZmVyZW50IEFCSXMgKHBlcnNvbmFsaXRpZXMpLiAgKi8KK2V4dGVybiBpbnQgcGVyc29uYWxpdHkgKHVuc2lnbmVkIGxvbmcgaW50IF9fcGVyc29uYSkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9wZXJzb25hbGl0eS5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3BvbGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcG9sbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwODViNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3BvbGwuaApAQCAtMCwwICsxLDc0IEBACisvKiBDb21wYXRpYmlsaXR5IGRlZmluaXRpb25zIGZvciBTeXN0ZW0gViBgcG9sbCcgaW50ZXJmYWNlLgorICAgQ29weXJpZ2h0IChDKSAxOTk0LDE5OTYtMjAwMSwyMDA0LDIwMDUsMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX1BPTExfSAorI2RlZmluZQlfU1lTX1BPTExfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgdGhlIHBsYXRmb3JtIGRlcGVuZGVudCBiaXRzIG9mIGBwb2xsJy4gICovCisjaW5jbHVkZSA8Yml0cy9wb2xsLmg+CisjaWZkZWYgX19VU0VfR05VCisvKiBHZXQgdGhlIF9fc2lnc2V0X3QgZGVmaW5pdGlvbi4gICovCisjIGluY2x1ZGUgPGJpdHMvc2lnc2V0Lmg+CisvKiBHZXQgdGhlIHRpbWVzcGVjIGRlZmluaXRpb24uICAqLworIyBkZWZpbmUgX19uZWVkX3RpbWVzcGVjCisjIGluY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorCisKKy8qIFR5cGUgdXNlZCBmb3IgdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgbmZkc190OworCisvKiBEYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIGEgcG9sbGluZyByZXF1ZXN0LiAgKi8KK3N0cnVjdCBwb2xsZmQKKyAgeworICAgIGludCBmZDsJCQkvKiBGaWxlIGRlc2NyaXB0b3IgdG8gcG9sbC4gICovCisgICAgc2hvcnQgaW50IGV2ZW50czsJCS8qIFR5cGVzIG9mIGV2ZW50cyBwb2xsZXIgY2FyZXMgYWJvdXQuICAqLworICAgIHNob3J0IGludCByZXZlbnRzOwkJLyogVHlwZXMgb2YgZXZlbnRzIHRoYXQgYWN0dWFsbHkgb2NjdXJyZWQuICAqLworICB9OworCisKK19fQkVHSU5fREVDTFMKKworLyogUG9sbCB0aGUgZmlsZSBkZXNjcmlwdG9ycyBkZXNjcmliZWQgYnkgdGhlIE5GRFMgc3RydWN0dXJlcyBzdGFydGluZyBhdAorICAgRkRTLiAgSWYgVElNRU9VVCBpcyBub256ZXJvIGFuZCBub3QgLTEsIGFsbG93IFRJTUVPVVQgbWlsbGlzZWNvbmRzIGZvcgorICAgYW4gZXZlbnQgdG8gb2NjdXI7IGlmIFRJTUVPVVQgaXMgLTEsIGJsb2NrIHVudGlsIGFuIGV2ZW50IG9jY3Vycy4KKyAgIFJldHVybnMgdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIHdpdGggZXZlbnRzLCB6ZXJvIGlmIHRpbWVkIG91dCwKKyAgIG9yIC0xIGZvciBlcnJvcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwb2xsIChzdHJ1Y3QgcG9sbGZkICpfX2ZkcywgbmZkc190IF9fbmZkcywgaW50IF9fdGltZW91dCk7CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIExpa2UgcG9sbCwgYnV0IGJlZm9yZSB3YWl0aW5nIHRoZSB0aHJlYWRzIHNpZ25hbCBtYXNrIGlzIHJlcGxhY2VkCisgICB3aXRoIHRoYXQgc3BlY2lmaWVkIGluIHRoZSBmb3VydGggcGFyYW1ldGVyLiAgRm9yIGJldHRlciB1c2FiaWxpdHksCisgICB0aGUgdGltZW91dCB2YWx1ZSBpcyBzcGVjaWZpZWQgdXNpbmcgYSBUSU1FU1BFQyBvYmplY3QuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwcG9sbCAoc3RydWN0IHBvbGxmZCAqX19mZHMsIG5mZHNfdCBfX25mZHMsCisJCSAgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fdGltZW91dCwKKwkJICBfX2NvbnN0IF9fc2lnc2V0X3QgKl9fc3MpOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvcG9sbC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3ByY3RsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3ByY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U5YjcyZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcHJjdGwuaApAQCAtMCwwICsxLDMyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19QUkNUTF9ICisjZGVmaW5lIF9TWVNfUFJDVExfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ByY3RsLmg+ICAvKiAgVGhlIG1hZ2ljIHZhbHVlcyBjb21lIGZyb20gaGVyZSAgKi8KKworX19CRUdJTl9ERUNMUworCisvKiBDb250cm9sIHByb2Nlc3MgZXhlY3V0aW9uLiAgKi8KK2V4dGVybiBpbnQgcHJjdGwgKGludCBfX29wdGlvbiwgLi4uKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgIC8qIHN5cy9wcmN0bC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Byb2Nmcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9wcm9jZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTNkN2RiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9wcm9jZnMuaApAQCAtMCwwICsxLDE0MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfUFJPQ0ZTX0gKKyNkZWZpbmUgX1NZU19QUk9DRlNfSAkxCisKKy8qIFRoaXMgaXMgc29tZXdoYXQgbW9kZWxsZWQgYWZ0ZXIgdGhlIGZpbGUgb2YgdGhlIHNhbWUgbmFtZSBvbiBTVlI0CisgICBzeXN0ZW1zLiAgSXQgcHJvdmlkZXMgYSBkZWZpbml0aW9uIG9mIHRoZSBjb3JlIGZpbGUgZm9ybWF0IGZvciBFTEYKKyAgIHVzZWQgb24gTGludXguICBJdCBkb2Vzbid0IGhhdmUgYW55dGhpbmcgdG8gZG8gd2l0aCB0aGUgL3Byb2MgZmlsZQorICAgc3lzdGVtLCBldmVuIHRob3VnaCBMaW51eCBoYXMgb25lLgorCisgICBBbnl3YXksIHRoZSB3aG9sZSBwdXJwb3NlIG9mIHRoaXMgZmlsZSBpcyBmb3IgR0RCIGFuZCBHREIgb25seS4KKyAgIERvbid0IHJlYWQgdG9vIG11Y2ggaW50byBpdC4gIERvbid0IHVzZSBpdCBmb3IgYW55dGhpbmcgb3RoZXIgdGhhbgorICAgR0RCIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuICAqLworCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy91c2VyLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogVHlwZSBmb3IgYSBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXIuICAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGVsZl9ncmVnX3Q7CisKKy8qIEFuZCB0aGUgd2hvbGUgYnVuY2ggb2YgdGhlbS4gIFdlIGNvdWxkIGhhdmUgdXNlZCBgc3RydWN0CisgICB1c2VyX3JlZ3Nfc3RydWN0JyBkaXJlY3RseSBpbiB0aGUgdHlwZWRlZiwgYnV0IHRyYWRpdGlvbiBzYXlzIHRoYXQKKyAgIHRoZSByZWdpc3RlciBzZXQgaXMgYW4gYXJyYXksIHdoaWNoIGRvZXMgaGF2ZSBzb21lIHBlY3VsaWFyCisgICBzZW1hbnRpY3MsIHNvIGxlYXZlIGl0IHRoYXQgd2F5LiAgKi8KKyNkZWZpbmUgRUxGX05HUkVHIChzaXplb2YgKHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0KSAvIHNpemVvZihlbGZfZ3JlZ190KSkKK3R5cGVkZWYgZWxmX2dyZWdfdCBlbGZfZ3JlZ3NldF90W0VMRl9OR1JFR107CisKKyNpZiBfX1dPUkRTSVpFID09IDMyCisvKiBSZWdpc3RlciBzZXQgZm9yIHRoZSBmbG9hdGluZy1wb2ludCByZWdpc3RlcnMuICAqLwordHlwZWRlZiBzdHJ1Y3QgdXNlcl9mcHJlZ3Nfc3RydWN0IGVsZl9mcHJlZ3NldF90OworCisvKiBSZWdpc3RlciBzZXQgZm9yIHRoZSBleHRlbmRlZCBmbG9hdGluZy1wb2ludCByZWdpc3RlcnMuICBJbmNsdWRlcworICAgdGhlIFBlbnRpdW0gSUlJIFNTRSByZWdpc3RlcnMgaW4gYWRkaXRpb24gdG8gdGhlIGNsYXNzaWMKKyAgIGZsb2F0aW5nLXBvaW50IHN0dWZmLiAgKi8KK3R5cGVkZWYgc3RydWN0IHVzZXJfZnB4cmVnc19zdHJ1Y3QgZWxmX2ZweHJlZ3NldF90OworI2Vsc2UKKy8qIFJlZ2lzdGVyIHNldCBmb3IgdGhlIGV4dGVuZGVkIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVycy4gIEluY2x1ZGVzCisgICB0aGUgUGVudGl1bSBJSUkgU1NFIHJlZ2lzdGVycyBpbiBhZGRpdGlvbiB0byB0aGUgY2xhc3NpYworICAgZmxvYXRpbmctcG9pbnQgc3R1ZmYuICAqLwordHlwZWRlZiBzdHJ1Y3QgdXNlcl9mcHJlZ3Nfc3RydWN0IGVsZl9mcHJlZ3NldF90OworI2VuZGlmCisKKy8qIFNpZ25hbCBpbmZvLiAgKi8KK3N0cnVjdCBlbGZfc2lnaW5mbworICB7CisgICAgaW50IHNpX3NpZ25vOwkJCS8qIFNpZ25hbCBudW1iZXIuICAqLworICAgIGludCBzaV9jb2RlOwkJCS8qIEV4dHJhIGNvZGUuICAqLworICAgIGludCBzaV9lcnJubzsJCQkvKiBFcnJuby4gICovCisgIH07CisKKworLyogRGVmaW5pdGlvbnMgdG8gZ2VuZXJhdGUgSW50ZWwgU1ZSNC1saWtlIGNvcmUgZmlsZXMuICBUaGVzZSBtb3N0bHkKKyAgIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIFNWUjQgdHlwZXMgd2l0aCAiZWxmXyIgdGFja2VkIG9uIHRoZQorICAgZnJvbnQgdG8gcHJldmVudCBjbGFzaGVzIHdpdGggTGludXggZGVmaW5pdGlvbnMsIGFuZCB0aGUgdHlwZWRlZgorICAgZm9ybXMgaGF2ZSBiZWVuIGF2b2lkZWQuICBUaGlzIGlzIG1vc3RseSBsaWtlIHRoZSBTVlI0IHN0cnVjdHVyZSwKKyAgIGJ1dCBtb3JlIExpbnV4eSwgd2l0aCB0aGluZ3MgdGhhdCBMaW51eCBkb2VzIG5vdCBzdXBwb3J0IGFuZCB3aGljaAorICAgR0RCIGRvZXNuJ3QgcmVhbGx5IHVzZSBleGNsdWRlZC4gICovCisKK3N0cnVjdCBlbGZfcHJzdGF0dXMKKyAgeworICAgIHN0cnVjdCBlbGZfc2lnaW5mbyBwcl9pbmZvOwkJLyogSW5mbyBhc3NvY2lhdGVkIHdpdGggc2lnbmFsLiAgKi8KKyAgICBzaG9ydCBpbnQgcHJfY3Vyc2lnOwkJLyogQ3VycmVudCBzaWduYWwuICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHByX3NpZ3BlbmQ7CS8qIFNldCBvZiBwZW5kaW5nIHNpZ25hbHMuICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHByX3NpZ2hvbGQ7CS8qIFNldCBvZiBoZWxkIHNpZ25hbHMuICAqLworICAgIF9fcGlkX3QgcHJfcGlkOworICAgIF9fcGlkX3QgcHJfcHBpZDsKKyAgICBfX3BpZF90IHByX3BncnA7CisgICAgX19waWRfdCBwcl9zaWQ7CisgICAgc3RydWN0IHRpbWV2YWwgcHJfdXRpbWU7CQkvKiBVc2VyIHRpbWUuICAqLworICAgIHN0cnVjdCB0aW1ldmFsIHByX3N0aW1lOwkJLyogU3lzdGVtIHRpbWUuICAqLworICAgIHN0cnVjdCB0aW1ldmFsIHByX2N1dGltZTsJCS8qIEN1bXVsYXRpdmUgdXNlciB0aW1lLiAgKi8KKyAgICBzdHJ1Y3QgdGltZXZhbCBwcl9jc3RpbWU7CQkvKiBDdW11bGF0aXZlIHN5c3RlbSB0aW1lLiAgKi8KKyAgICBlbGZfZ3JlZ3NldF90IHByX3JlZzsJCS8qIEdQIHJlZ2lzdGVycy4gICovCisgICAgaW50IHByX2ZwdmFsaWQ7CQkJLyogVHJ1ZSBpZiBtYXRoIGNvcHJvIGJlaW5nIHVzZWQuICAqLworICB9OworCisKKyNkZWZpbmUgRUxGX1BSQVJHU1ogICAgICg4MCkgICAgLyogTnVtYmVyIG9mIGNoYXJzIGZvciBhcmdzLiAgKi8KKworc3RydWN0IGVsZl9wcnBzaW5mbworICB7CisgICAgY2hhciBwcl9zdGF0ZTsJCQkvKiBOdW1lcmljIHByb2Nlc3Mgc3RhdGUuICAqLworICAgIGNoYXIgcHJfc25hbWU7CQkJLyogQ2hhciBmb3IgcHJfc3RhdGUuICAqLworICAgIGNoYXIgcHJfem9tYjsJCQkvKiBab21iaWUuICAqLworICAgIGNoYXIgcHJfbmljZTsJCQkvKiBOaWNlIHZhbC4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgcHJfZmxhZzsJCS8qIEZsYWdzLiAgKi8KKyNpZiBfX1dPUkRTSVpFID09IDMyCisgICAgdW5zaWduZWQgc2hvcnQgaW50IHByX3VpZDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgcHJfZ2lkOworI2Vsc2UKKyAgICB1bnNpZ25lZCBpbnQgcHJfdWlkOworICAgIHVuc2lnbmVkIGludCBwcl9naWQ7CisjZW5kaWYKKyAgICBpbnQgcHJfcGlkLCBwcl9wcGlkLCBwcl9wZ3JwLCBwcl9zaWQ7CisgICAgLyogTG90cyBtaXNzaW5nICovCisgICAgY2hhciBwcl9mbmFtZVsxNl07CQkJLyogRmlsZW5hbWUgb2YgZXhlY3V0YWJsZS4gICovCisgICAgY2hhciBwcl9wc2FyZ3NbRUxGX1BSQVJHU1pdOwkvKiBJbml0aWFsIHBhcnQgb2YgYXJnIGxpc3QuICAqLworICB9OworCisKKy8qIFRoZSByZXN0IG9mIHRoaXMgZmlsZSBwcm92aWRlcyB0aGUgdHlwZXMgZm9yIGVtdWxhdGlvbiBvZiB0aGUKKyAgIFNvbGFyaXMgPHByb2Nfc2VydmljZS5oPiBpbnRlcmZhY2VzIHRoYXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5CisgICB1c2VycyBvZiBsaWJ0aHJlYWRfZGIuICAqLworCisvKiBBZGRyZXNzZXMuICAqLwordHlwZWRlZiB2b2lkICpwc2FkZHJfdDsKKworLyogUmVnaXN0ZXIgc2V0cy4gIExpbnV4IGhhcyBkaWZmZXJlbnQgbmFtZXMuICAqLwordHlwZWRlZiBlbGZfZ3JlZ3NldF90IHByZ3JlZ3NldF90OwordHlwZWRlZiBlbGZfZnByZWdzZXRfdCBwcmZwcmVnc2V0X3Q7CisKKy8qIFdlIGRvbid0IGhhdmUgYW55IGRpZmZlcmVuY2VzIGJldHdlZW4gcHJvY2Vzc2VzIGFuZCB0aHJlYWRzLAorICAgdGhlcmVmb3JlIGhhdmUgb25seSBvbmUgUElEIHR5cGUuICAqLwordHlwZWRlZiBfX3BpZF90IGx3cGlkX3Q7CisKKy8qIFByb2Nlc3Mgc3RhdHVzIGFuZCBpbmZvLiAgSW4gdGhlIGVuZCB3ZSBkbyBwcm92aWRlIHR5cGVkZWZzIGZvciB0aGVtLiAgKi8KK3R5cGVkZWYgc3RydWN0IGVsZl9wcnN0YXR1cyBwcnN0YXR1c190OwordHlwZWRlZiBzdHJ1Y3QgZWxmX3BycHNpbmZvIHBycHNpbmZvX3Q7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvcHJvY2ZzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcHJvZmlsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Byb2ZpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDhlYzcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Byb2ZpbC5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfUFJPRklMX0gKKyNkZWZpbmUgX1BST0ZJTF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKiBUaGlzIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBmb2xsb3cgdGhlIHNwcm9maWwoKSBzeXN0ZW0gY2FsbHMgYXMKKyAgIGRlc2NyaWJlZCBieSB0aGUgc3Byb2ZpbCgyKSBtYW4gcGFnZSBvZiBJcml4IHY2LjUsIGV4Y2VwdCB0aGF0OgorCisJLSB0aGVyZSBpcyBubyBhIHByaW9yaSBsaW1pdCBvbiBudW1iZXIgb2YgdGV4dCBzZWN0aW9ucworCS0gcHJfc2NhbGUgaXMgZGVjbGFyZWQgYXMgdW5zaWduZWQgbG9uZyAoaW5zdGVhZCBvZiAidW5zaWduZWQgaW50IikKKwktIHByX3NpemUgaXMgZGVjbGFyZWQgYXMgc2l6ZV90IChpbnN0ZWFkIG9mICJ1bnNpZ25lZCBpbnQiKQorCS0gcHJfb2ZmIGlzIGRlY2xhcmVkIGFzIHZvaWQgKiAoaW5zdGVhZCBvZiAiX19wc3Vuc2lnbmVkX3QiKQorCS0gdGhlIG92ZXJmbG93IGJpbiAocHJfYmFzZT09MCwgcHJfc2NhbGU9PTIpIGNhbiBhcHBlYXIgYW55d2hlcmUKKwkgIGluIHRoZSBwcm9mcCBhcnJheQorCS0gUFJPRl9GQVNUIGhhcyBubyBlZmZlY3QgICovCisKK3N0cnVjdCBwcm9mCisgIHsKKyAgICB2b2lkICpwcl9iYXNlOwkJLyogYnVmZmVyIGJhc2UgKi8KKyAgICBzaXplX3QgcHJfc2l6ZTsJCS8qIGJ1ZmZlciBzaXplICovCisgICAgc2l6ZV90IHByX29mZjsJCS8qIHBjIG9mZnNldCAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHByX3NjYWxlOwkvKiBwYyBzY2FsaW5nIChmaXhlZC1wb2ludCBudW1iZXIpICovCisgIH07CisKK2VudW0KKyAgeworICAgIFBST0ZfVVNIT1JUCT0gMCwJCS8qIHVzZSAxNi1iaXQgY291bnRlcnMgKGRlZmF1bHQpICovCisgICAgUFJPRl9VSU5UCT0gMSA8PCAwLAkvKiB1c2UgMzItYml0IGNvdW50ZXJzICovCisgICAgUFJPRl9GQVNUICAgPSAxIDw8IDEJLyogcHJvZmlsZSBmYXN0ZXIgdGhhbiB1c3VhbCAqLworICB9OworCisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIGludCBzcHJvZmlsIChzdHJ1Y3QgcHJvZiAqX19wcm9mcCwgaW50IF9fcHJvZmNudCwKKwkJICAgIHN0cnVjdCB0aW1ldmFsICpfX3R2cCwgdW5zaWduZWQgaW50IF9fZmxhZ3MpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBwcm9maWwuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9wdHJhY2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcHRyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwZjI5NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcHRyYWNlLmgKQEAgLTAsMCArMSwxOTYgQEAKKy8qIGBwdHJhY2UnIGRlYnVnZ2VyIHN1cHBvcnQgaW50ZXJmYWNlLiAgTGludXggdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5LDIwMDAsMjAwNiwyMDA3LDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19QVFJBQ0VfSAorI2RlZmluZSBfU1lTX1BUUkFDRV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogVHlwZSBvZiB0aGUgUkVRVUVTVCBhcmd1bWVudCB0byBgcHRyYWNlLicgICovCitlbnVtIF9fcHRyYWNlX3JlcXVlc3QKK3sKKyAgLyogSW5kaWNhdGUgdGhhdCB0aGUgcHJvY2VzcyBtYWtpbmcgdGhpcyByZXF1ZXN0IHNob3VsZCBiZSB0cmFjZWQuCisgICAgIEFsbCBzaWduYWxzIHJlY2VpdmVkIGJ5IHRoaXMgcHJvY2VzcyBjYW4gYmUgaW50ZXJjZXB0ZWQgYnkgaXRzCisgICAgIHBhcmVudCwgYW5kIGl0cyBwYXJlbnQgY2FuIHVzZSB0aGUgb3RoZXIgYHB0cmFjZScgcmVxdWVzdHMuICAqLworICBQVFJBQ0VfVFJBQ0VNRSA9IDAsCisjZGVmaW5lIFBUX1RSQUNFX01FIFBUUkFDRV9UUkFDRU1FCisKKyAgLyogUmV0dXJuIHRoZSB3b3JkIGluIHRoZSBwcm9jZXNzJ3MgdGV4dCBzcGFjZSBhdCBhZGRyZXNzIEFERFIuICAqLworICBQVFJBQ0VfUEVFS1RFWFQgPSAxLAorI2RlZmluZSBQVF9SRUFEX0kgUFRSQUNFX1BFRUtURVhUCisKKyAgLyogUmV0dXJuIHRoZSB3b3JkIGluIHRoZSBwcm9jZXNzJ3MgZGF0YSBzcGFjZSBhdCBhZGRyZXNzIEFERFIuICAqLworICBQVFJBQ0VfUEVFS0RBVEEgPSAyLAorI2RlZmluZSBQVF9SRUFEX0QgUFRSQUNFX1BFRUtEQVRBCisKKyAgLyogUmV0dXJuIHRoZSB3b3JkIGluIHRoZSBwcm9jZXNzJ3MgdXNlciBhcmVhIGF0IG9mZnNldCBBRERSLiAgKi8KKyAgUFRSQUNFX1BFRUtVU0VSID0gMywKKyNkZWZpbmUgUFRfUkVBRF9VIFBUUkFDRV9QRUVLVVNFUgorCisgIC8qIFdyaXRlIHRoZSB3b3JkIERBVEEgaW50byB0aGUgcHJvY2VzcydzIHRleHQgc3BhY2UgYXQgYWRkcmVzcyBBRERSLiAgKi8KKyAgUFRSQUNFX1BPS0VURVhUID0gNCwKKyNkZWZpbmUgUFRfV1JJVEVfSSBQVFJBQ0VfUE9LRVRFWFQKKworICAvKiBXcml0ZSB0aGUgd29yZCBEQVRBIGludG8gdGhlIHByb2Nlc3MncyBkYXRhIHNwYWNlIGF0IGFkZHJlc3MgQUREUi4gICovCisgIFBUUkFDRV9QT0tFREFUQSA9IDUsCisjZGVmaW5lIFBUX1dSSVRFX0QgUFRSQUNFX1BPS0VEQVRBCisKKyAgLyogV3JpdGUgdGhlIHdvcmQgREFUQSBpbnRvIHRoZSBwcm9jZXNzJ3MgdXNlciBhcmVhIGF0IG9mZnNldCBBRERSLiAgKi8KKyAgUFRSQUNFX1BPS0VVU0VSID0gNiwKKyNkZWZpbmUgUFRfV1JJVEVfVSBQVFJBQ0VfUE9LRVVTRVIKKworICAvKiBDb250aW51ZSB0aGUgcHJvY2Vzcy4gICovCisgIFBUUkFDRV9DT05UID0gNywKKyNkZWZpbmUgUFRfQ09OVElOVUUgUFRSQUNFX0NPTlQKKworICAvKiBLaWxsIHRoZSBwcm9jZXNzLiAgKi8KKyAgUFRSQUNFX0tJTEwgPSA4LAorI2RlZmluZSBQVF9LSUxMIFBUUkFDRV9LSUxMCisKKyAgLyogU2luZ2xlIHN0ZXAgdGhlIHByb2Nlc3MuCisgICAgIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBvbiBhbGwgbWFjaGluZXMuICAqLworICBQVFJBQ0VfU0lOR0xFU1RFUCA9IDksCisjZGVmaW5lIFBUX1NURVAgUFRSQUNFX1NJTkdMRVNURVAKKworICAvKiBHZXQgYWxsIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgdXNlZCBieSBhIHByb2Nlc3Nlcy4KKyAgICAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBtYWNoaW5lcy4gICovCisgICBQVFJBQ0VfR0VUUkVHUyA9IDEyLAorI2RlZmluZSBQVF9HRVRSRUdTIFBUUkFDRV9HRVRSRUdTCisKKyAgLyogU2V0IGFsbCBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIHVzZWQgYnkgYSBwcm9jZXNzZXMuCisgICAgIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBvbiBhbGwgbWFjaGluZXMuICAqLworICAgUFRSQUNFX1NFVFJFR1MgPSAxMywKKyNkZWZpbmUgUFRfU0VUUkVHUyBQVFJBQ0VfU0VUUkVHUworCisgIC8qIEdldCBhbGwgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIHVzZWQgYnkgYSBwcm9jZXNzZXMuCisgICAgIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBvbiBhbGwgbWFjaGluZXMuICAqLworICAgUFRSQUNFX0dFVEZQUkVHUyA9IDE0LAorI2RlZmluZSBQVF9HRVRGUFJFR1MgUFRSQUNFX0dFVEZQUkVHUworCisgIC8qIFNldCBhbGwgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIHVzZWQgYnkgYSBwcm9jZXNzZXMuCisgICAgIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBvbiBhbGwgbWFjaGluZXMuICAqLworICAgUFRSQUNFX1NFVEZQUkVHUyA9IDE1LAorI2RlZmluZSBQVF9TRVRGUFJFR1MgUFRSQUNFX1NFVEZQUkVHUworCisgIC8qIEF0dGFjaCB0byBhIHByb2Nlc3MgdGhhdCBpcyBhbHJlYWR5IHJ1bm5pbmcuICovCisgIFBUUkFDRV9BVFRBQ0ggPSAxNiwKKyNkZWZpbmUgUFRfQVRUQUNIIFBUUkFDRV9BVFRBQ0gKKworICAvKiBEZXRhY2ggZnJvbSBhIHByb2Nlc3MgYXR0YWNoZWQgdG8gd2l0aCBQVFJBQ0VfQVRUQUNILiAgKi8KKyAgUFRSQUNFX0RFVEFDSCA9IDE3LAorI2RlZmluZSBQVF9ERVRBQ0ggUFRSQUNFX0RFVEFDSAorCisgIC8qIEdldCBhbGwgZXh0ZW5kZWQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIHVzZWQgYnkgYSBwcm9jZXNzZXMuCisgICAgIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBvbiBhbGwgbWFjaGluZXMuICAqLworICAgUFRSQUNFX0dFVEZQWFJFR1MgPSAxOCwKKyNkZWZpbmUgUFRfR0VURlBYUkVHUyBQVFJBQ0VfR0VURlBYUkVHUworCisgIC8qIFNldCBhbGwgZXh0ZW5kZWQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIHVzZWQgYnkgYSBwcm9jZXNzZXMuCisgICAgIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBvbiBhbGwgbWFjaGluZXMuICAqLworICAgUFRSQUNFX1NFVEZQWFJFR1MgPSAxOSwKKyNkZWZpbmUgUFRfU0VURlBYUkVHUyBQVFJBQ0VfU0VURlBYUkVHUworCisgIC8qIENvbnRpbnVlIGFuZCBzdG9wIGF0IHRoZSBuZXh0IChyZXR1cm4gZnJvbSkgc3lzY2FsbC4gICovCisgIFBUUkFDRV9TWVNDQUxMID0gMjQsCisjZGVmaW5lIFBUX1NZU0NBTEwgUFRSQUNFX1NZU0NBTEwKKworICAvKiBTZXQgcHRyYWNlIGZpbHRlciBvcHRpb25zLiAgKi8KKyAgUFRSQUNFX1NFVE9QVElPTlMgPSAweDQyMDAsCisjZGVmaW5lIFBUX1NFVE9QVElPTlMgUFRSQUNFX1NFVE9QVElPTlMKKworICAvKiBHZXQgbGFzdCBwdHJhY2UgbWVzc2FnZS4gICovCisgIFBUUkFDRV9HRVRFVkVOVE1TRyA9IDB4NDIwMSwKKyNkZWZpbmUgUFRfR0VURVZFTlRNU0cgUFRSQUNFX0dFVEVWRU5UTVNHCisKKyAgLyogR2V0IHNpZ2luZm8gZm9yIHByb2Nlc3MuICAqLworICBQVFJBQ0VfR0VUU0lHSU5GTyA9IDB4NDIwMiwKKyNkZWZpbmUgUFRfR0VUU0lHSU5GTyBQVFJBQ0VfR0VUU0lHSU5GTworCisgIC8qIFNldCBuZXcgc2lnaW5mbyBmb3IgcHJvY2Vzcy4gICovCisgIFBUUkFDRV9TRVRTSUdJTkZPID0gMHg0MjAzLAorI2RlZmluZSBQVF9TRVRTSUdJTkZPIFBUUkFDRV9TRVRTSUdJTkZPCisKKyAgLyogR2V0IHJlZ2lzdGVyIGNvbnRlbnQuICAqLworICBQVFJBQ0VfR0VUUkVHU0VUID0gMHg0MjA0LAorI2RlZmluZSBQVFJBQ0VfR0VUUkVHU0VUIFBUUkFDRV9HRVRSRUdTRVQKKworICAvKiBTZXQgcmVnaXN0ZXIgY29udGVudC4gICovCisgIFBUUkFDRV9TRVRSRUdTRVQgPSAweDQyMDUsCisjZGVmaW5lIFBUUkFDRV9TRVRSRUdTRVQgUFRSQUNFX1NFVFJFR1NFVAorCisgIC8qIExpa2UgUFRSQUNFX0FUVEFDSCwgYnV0IGRvIG5vdCBmb3JjZSB0cmFjZWUgdG8gdHJhcCBhbmQgZG8gbm90IGFmZmVjdAorICAgICBzaWduYWwgb3IgZ3JvdXAgc3RvcCBzdGF0ZS4gICovCisgIFBUUkFDRV9TRUlaRSA9IDB4NDIwNiwKKyNkZWZpbmUgUFRSQUNFX1NFSVpFIFBUUkFDRV9TRUlaRQorCisgIC8qIFRyYXAgc2VpemVkIHRyYWNlZS4gICovCisgIFBUUkFDRV9JTlRFUlJVUFQgPSAweDQyMDcsCisjZGVmaW5lIFBUUkFDRV9JTlRFUlJVUFQgUFRSQUNFX0lOVEVSUlVQVAorCisgIC8qIFdhaXQgZm9yIG5leHQgZ3JvdXAgZXZlbnQuICAqLworICBQVFJBQ0VfTElTVEVOID0gMHg0MjA4Cit9OworCisKKy8qIEZsYWcgZm9yIFBUUkFDRV9MSVNURU4uICAqLworZW51bSBfX3B0cmFjZV9mbGFncworeworICBQVFJBQ0VfU0VJWkVfREVWRUwgPSAweDgwMDAwMDAwCit9OworCisvKiBPcHRpb25zIHNldCB1c2luZyBQVFJBQ0VfU0VUT1BUSU9OUy4gICovCitlbnVtIF9fcHRyYWNlX3NldG9wdGlvbnMKK3sKKyAgUFRSQUNFX09fVFJBQ0VTWVNHT09ECT0gMHgwMDAwMDAwMSwKKyAgUFRSQUNFX09fVFJBQ0VGT1JLCT0gMHgwMDAwMDAwMiwKKyAgUFRSQUNFX09fVFJBQ0VWRk9SSyAgID0gMHgwMDAwMDAwNCwKKyAgUFRSQUNFX09fVFJBQ0VDTE9ORQk9IDB4MDAwMDAwMDgsCisgIFBUUkFDRV9PX1RSQUNFRVhFQwk9IDB4MDAwMDAwMTAsCisgIFBUUkFDRV9PX1RSQUNFVkZPUktET05FID0gMHgwMDAwMDAyMCwKKyAgUFRSQUNFX09fVFJBQ0VFWElUCT0gMHgwMDAwMDA0MCwKKyAgUFRSQUNFX09fTUFTSwkJPSAweDAwMDAwMDdmCit9OworCisvKiBXYWl0IGV4dGVuZGVkIHJlc3VsdCBjb2RlcyBmb3IgdGhlIGFib3ZlIHRyYWNlIG9wdGlvbnMuICAqLworZW51bSBfX3B0cmFjZV9ldmVudGNvZGVzCit7CisgIFBUUkFDRV9FVkVOVF9GT1JLCT0gMSwKKyAgUFRSQUNFX0VWRU5UX1ZGT1JLCT0gMiwKKyAgUFRSQUNFX0VWRU5UX0NMT05FCT0gMywKKyAgUFRSQUNFX0VWRU5UX0VYRUMJPSA0LAorICBQVFJBQ0VfRVZFTlRfVkZPUktfRE9ORSA9IDUsCisgIFBUUkFDRV9FVkVOVF9FWElUCT0gNgorfTsKKworLyogUGVyZm9ybSBwcm9jZXNzIHRyYWNpbmcgZnVuY3Rpb25zLiAgUkVRVUVTVCBpcyBvbmUgb2YgdGhlIHZhbHVlcworICAgYWJvdmUsIGFuZCBkZXRlcm1pbmVzIHRoZSBhY3Rpb24gdG8gYmUgdGFrZW4uCisgICBGb3IgYWxsIHJlcXVlc3RzIGV4Y2VwdCBQVFJBQ0VfVFJBQ0VNRSwgUElEIHNwZWNpZmllcyB0aGUgcHJvY2VzcyB0byBiZQorICAgdHJhY2VkLgorCisgICBQSUQgYW5kIHRoZSBvdGhlciBhcmd1bWVudHMgZGVzY3JpYmVkIGFib3ZlIGZvciB0aGUgdmFyaW91cyByZXF1ZXN0cyBzaG91bGQKKyAgIGFwcGVhciAodGhvc2UgdGhhdCBhcmUgdXNlZCBmb3IgdGhlIHBhcnRpY3VsYXIgcmVxdWVzdCkgYXM6CisgICAgIHBpZF90IFBJRCwgdm9pZCAqQUREUiwgaW50IERBVEEsIHZvaWQgKkFERFIyCisgICBhZnRlciBSRVFVRVNULiAgKi8KK2V4dGVybiBsb25nIGludCBwdHJhY2UgKGVudW0gX19wdHJhY2VfcmVxdWVzdCBfX3JlcXVlc3QsIC4uLikgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9TWVNfUFRSQUNFX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcXVldWUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWY0NTUzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9xdWV1ZS5oCkBAIC0wLDAgKzEsNTc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXF1ZXVlLmgJOC41IChCZXJrZWxleSkgOC8yMC85NAorICovCisKKyNpZm5kZWYJX1NZU19RVUVVRV9IXworI2RlZmluZQlfU1lTX1FVRVVFX0hfCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBmaXZlIHR5cGVzIG9mIGRhdGEgc3RydWN0dXJlczogc2luZ2x5LWxpbmtlZCBsaXN0cywKKyAqIGxpc3RzLCBzaW1wbGUgcXVldWVzLCB0YWlsIHF1ZXVlcywgYW5kIGNpcmN1bGFyIHF1ZXVlcy4KKyAqCisgKiBBIHNpbmdseS1saW5rZWQgbGlzdCBpcyBoZWFkZWQgYnkgYSBzaW5nbGUgZm9yd2FyZCBwb2ludGVyLiBUaGUKKyAqIGVsZW1lbnRzIGFyZSBzaW5nbHkgbGlua2VkIGZvciBtaW5pbXVtIHNwYWNlIGFuZCBwb2ludGVyIG1hbmlwdWxhdGlvbgorICogb3ZlcmhlYWQgYXQgdGhlIGV4cGVuc2Ugb2YgTyhuKSByZW1vdmFsIGZvciBhcmJpdHJhcnkgZWxlbWVudHMuIE5ldworICogZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGFmdGVyIGFuIGV4aXN0aW5nIGVsZW1lbnQgb3IgYXQgdGhlCisgKiBoZWFkIG9mIHRoZSBsaXN0LiAgRWxlbWVudHMgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBoZWFkIG9mIHRoZSBsaXN0CisgKiBzaG91bGQgdXNlIHRoZSBleHBsaWNpdCBtYWNybyBmb3IgdGhpcyBwdXJwb3NlIGZvciBvcHRpbXVtCisgKiBlZmZpY2llbmN5LiBBIHNpbmdseS1saW5rZWQgbGlzdCBtYXkgb25seSBiZSB0cmF2ZXJzZWQgaW4gdGhlIGZvcndhcmQKKyAqIGRpcmVjdGlvbi4gIFNpbmdseS1saW5rZWQgbGlzdHMgYXJlIGlkZWFsIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsYXJnZQorICogZGF0YXNldHMgYW5kIGZldyBvciBubyByZW1vdmFscyBvciBmb3IgaW1wbGVtZW50aW5nIGEgTElGTyBxdWV1ZS4KKyAqCisgKiBBIGxpc3QgaXMgaGVhZGVkIGJ5IGEgc2luZ2xlIGZvcndhcmQgcG9pbnRlciAob3IgYW4gYXJyYXkgb2YgZm9yd2FyZAorICogcG9pbnRlcnMgZm9yIGEgaGFzaCB0YWJsZSBoZWFkZXIpLiBUaGUgZWxlbWVudHMgYXJlIGRvdWJseSBsaW5rZWQKKyAqIHNvIHRoYXQgYW4gYXJiaXRyYXJ5IGVsZW1lbnQgY2FuIGJlIHJlbW92ZWQgd2l0aG91dCBhIG5lZWQgdG8KKyAqIHRyYXZlcnNlIHRoZSBsaXN0LiBOZXcgZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGJlZm9yZQorICogb3IgYWZ0ZXIgYW4gZXhpc3RpbmcgZWxlbWVudCBvciBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gQSBsaXN0CisgKiBtYXkgb25seSBiZSB0cmF2ZXJzZWQgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLgorICoKKyAqIEEgc2ltcGxlIHF1ZXVlIGlzIGhlYWRlZCBieSBhIHBhaXIgb2YgcG9pbnRlcnMsIG9uZSB0aGUgaGVhZCBvZiB0aGUKKyAqIGxpc3QgYW5kIHRoZSBvdGhlciB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdC4gVGhlIGVsZW1lbnRzIGFyZSBzaW5nbHkKKyAqIGxpbmtlZCB0byBzYXZlIHNwYWNlLCBzbyBlbGVtZW50cyBjYW4gb25seSBiZSByZW1vdmVkIGZyb20gdGhlCisgKiBoZWFkIG9mIHRoZSBsaXN0LiBOZXcgZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGFmdGVyCisgKiBhbiBleGlzdGluZyBlbGVtZW50LCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgb3IgYXQgdGhlIGVuZCBvZiB0aGUKKyAqIGxpc3QuIEEgc2ltcGxlIHF1ZXVlIG1heSBvbmx5IGJlIHRyYXZlcnNlZCBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24uCisgKgorICogQSB0YWlsIHF1ZXVlIGlzIGhlYWRlZCBieSBhIHBhaXIgb2YgcG9pbnRlcnMsIG9uZSB0byB0aGUgaGVhZCBvZiB0aGUKKyAqIGxpc3QgYW5kIHRoZSBvdGhlciB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdC4gVGhlIGVsZW1lbnRzIGFyZSBkb3VibHkKKyAqIGxpbmtlZCBzbyB0aGF0IGFuIGFyYml0cmFyeSBlbGVtZW50IGNhbiBiZSByZW1vdmVkIHdpdGhvdXQgYSBuZWVkIHRvCisgKiB0cmF2ZXJzZSB0aGUgbGlzdC4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBiZWZvcmUgb3IKKyAqIGFmdGVyIGFuIGV4aXN0aW5nIGVsZW1lbnQsIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBvciBhdCB0aGUgZW5kIG9mCisgKiB0aGUgbGlzdC4gQSB0YWlsIHF1ZXVlIG1heSBiZSB0cmF2ZXJzZWQgaW4gZWl0aGVyIGRpcmVjdGlvbi4KKyAqCisgKiBBIGNpcmNsZSBxdWV1ZSBpcyBoZWFkZWQgYnkgYSBwYWlyIG9mIHBvaW50ZXJzLCBvbmUgdG8gdGhlIGhlYWQgb2YgdGhlCisgKiBsaXN0IGFuZCB0aGUgb3RoZXIgdG8gdGhlIHRhaWwgb2YgdGhlIGxpc3QuIFRoZSBlbGVtZW50cyBhcmUgZG91Ymx5CisgKiBsaW5rZWQgc28gdGhhdCBhbiBhcmJpdHJhcnkgZWxlbWVudCBjYW4gYmUgcmVtb3ZlZCB3aXRob3V0IGEgbmVlZCB0bworICogdHJhdmVyc2UgdGhlIGxpc3QuIE5ldyBlbGVtZW50cyBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3QgYmVmb3JlIG9yIGFmdGVyCisgKiBhbiBleGlzdGluZyBlbGVtZW50LCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgb3IgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyAqIEEgY2lyY2xlIHF1ZXVlIG1heSBiZSB0cmF2ZXJzZWQgaW4gZWl0aGVyIGRpcmVjdGlvbiwgYnV0IGhhcyBhIG1vcmUKKyAqIGNvbXBsZXggZW5kIG9mIGxpc3QgZGV0ZWN0aW9uLgorICoKKyAqIEZvciBkZXRhaWxzIG9uIHRoZSB1c2Ugb2YgdGhlc2UgbWFjcm9zLCBzZWUgdGhlIHF1ZXVlKDMpIG1hbnVhbCBwYWdlLgorICovCisKKy8qCisgKiBMaXN0IGRlZmluaXRpb25zLgorICovCisjZGVmaW5lCUxJU1RfSEVBRChuYW1lLCB0eXBlKQkJCQkJCVwKK3N0cnVjdCBuYW1lIHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqbGhfZmlyc3Q7CS8qIGZpcnN0IGVsZW1lbnQgKi8JCQlcCit9CisKKyNkZWZpbmUJTElTVF9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpCQkJCQlcCisJeyBOVUxMIH0KKworI2RlZmluZQlMSVNUX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqbGVfbmV4dDsJLyogbmV4dCBlbGVtZW50ICovCQkJXAorCXN0cnVjdCB0eXBlICoqbGVfcHJldjsJLyogYWRkcmVzcyBvZiBwcmV2aW91cyBuZXh0IGVsZW1lbnQgKi8JXAorfQorCisvKgorICogTGlzdCBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUJTElTVF9JTklUKGhlYWQpIGRvIHsJCQkJCQlcCisJKGhlYWQpLT5saF9maXJzdCA9IE5VTEw7CQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlMSVNUX0lOU0VSVF9BRlRFUihsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoKGVsbSktPmZpZWxkLmxlX25leHQgPSAobGlzdGVsbSktPmZpZWxkLmxlX25leHQpICE9IE5VTEwpCVwKKwkJKGxpc3RlbG0pLT5maWVsZC5sZV9uZXh0LT5maWVsZC5sZV9wcmV2ID0JCVwKKwkJICAgICYoZWxtKS0+ZmllbGQubGVfbmV4dDsJCQkJXAorCShsaXN0ZWxtKS0+ZmllbGQubGVfbmV4dCA9IChlbG0pOwkJCQlcCisJKGVsbSktPmZpZWxkLmxlX3ByZXYgPSAmKGxpc3RlbG0pLT5maWVsZC5sZV9uZXh0OwkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJTElTVF9JTlNFUlRfQkVGT1JFKGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLmxlX3ByZXYgPSAobGlzdGVsbSktPmZpZWxkLmxlX3ByZXY7CQlcCisJKGVsbSktPmZpZWxkLmxlX25leHQgPSAobGlzdGVsbSk7CQkJCVwKKwkqKGxpc3RlbG0pLT5maWVsZC5sZV9wcmV2ID0gKGVsbSk7CQkJCVwKKwkobGlzdGVsbSktPmZpZWxkLmxlX3ByZXYgPSAmKGVsbSktPmZpZWxkLmxlX25leHQ7CQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlMSVNUX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQkJXAorCWlmICgoKGVsbSktPmZpZWxkLmxlX25leHQgPSAoaGVhZCktPmxoX2ZpcnN0KSAhPSBOVUxMKQkJXAorCQkoaGVhZCktPmxoX2ZpcnN0LT5maWVsZC5sZV9wcmV2ID0gJihlbG0pLT5maWVsZC5sZV9uZXh0O1wKKwkoaGVhZCktPmxoX2ZpcnN0ID0gKGVsbSk7CQkJCQlcCisJKGVsbSktPmZpZWxkLmxlX3ByZXYgPSAmKGhlYWQpLT5saF9maXJzdDsJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlMSVNUX1JFTU9WRShlbG0sIGZpZWxkKSBkbyB7CQkJCQlcCisJaWYgKChlbG0pLT5maWVsZC5sZV9uZXh0ICE9IE5VTEwpCQkJCVwKKwkJKGVsbSktPmZpZWxkLmxlX25leHQtPmZpZWxkLmxlX3ByZXYgPSAJCQlcCisJCSAgICAoZWxtKS0+ZmllbGQubGVfcHJldjsJCQkJXAorCSooZWxtKS0+ZmllbGQubGVfcHJldiA9IChlbG0pLT5maWVsZC5sZV9uZXh0OwkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCUxJU1RfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQkJXAorCWZvciAoKHZhcikgPSAoKGhlYWQpLT5saF9maXJzdCk7CQkJCVwKKwkJKHZhcik7CQkJCQkJCVwKKwkJKHZhcikgPSAoKHZhciktPmZpZWxkLmxlX25leHQpKQorCisvKgorICogTGlzdCBhY2Nlc3MgbWV0aG9kcy4KKyAqLworI2RlZmluZQlMSVNUX0VNUFRZKGhlYWQpCQkoKGhlYWQpLT5saF9maXJzdCA9PSBOVUxMKQorI2RlZmluZQlMSVNUX0ZJUlNUKGhlYWQpCQkoKGhlYWQpLT5saF9maXJzdCkKKyNkZWZpbmUJTElTVF9ORVhUKGVsbSwgZmllbGQpCQkoKGVsbSktPmZpZWxkLmxlX25leHQpCisKKworLyoKKyAqIFNpbmdseS1saW5rZWQgTGlzdCBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZQlTTElTVF9IRUFEKG5hbWUsIHR5cGUpCQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpzbGhfZmlyc3Q7CS8qIGZpcnN0IGVsZW1lbnQgKi8JCQlcCit9CisKKyNkZWZpbmUJU0xJU1RfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgTlVMTCB9CisKKyNkZWZpbmUJU0xJU1RfRU5UUlkodHlwZSkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpzbGVfbmV4dDsJLyogbmV4dCBlbGVtZW50ICovCQkJXAorfQorCisvKgorICogU2luZ2x5LWxpbmtlZCBMaXN0IGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlTTElTVF9JTklUKGhlYWQpIGRvIHsJCQkJCQlcCisJKGhlYWQpLT5zbGhfZmlyc3QgPSBOVUxMOwkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU0xJU1RfSU5TRVJUX0FGVEVSKHNsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC5zbGVfbmV4dCA9IChzbGlzdGVsbSktPmZpZWxkLnNsZV9uZXh0OwkJXAorCShzbGlzdGVsbSktPmZpZWxkLnNsZV9uZXh0ID0gKGVsbSk7CQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNMSVNUX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLnNsZV9uZXh0ID0gKGhlYWQpLT5zbGhfZmlyc3Q7CQkJXAorCShoZWFkKS0+c2xoX2ZpcnN0ID0gKGVsbSk7CQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTTElTVF9SRU1PVkVfSEVBRChoZWFkLCBmaWVsZCkgZG8gewkJCQlcCisJKGhlYWQpLT5zbGhfZmlyc3QgPSAoaGVhZCktPnNsaF9maXJzdC0+ZmllbGQuc2xlX25leHQ7CQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTTElTVF9SRU1PVkUoaGVhZCwgZWxtLCB0eXBlLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKGhlYWQpLT5zbGhfZmlyc3QgPT0gKGVsbSkpIHsJCQkJXAorCQlTTElTVF9SRU1PVkVfSEVBRCgoaGVhZCksIGZpZWxkKTsJCQlcCisJfQkJCQkJCQkJXAorCWVsc2UgewkJCQkJCQkJXAorCQlzdHJ1Y3QgdHlwZSAqY3VyZWxtID0gKGhlYWQpLT5zbGhfZmlyc3Q7CQlcCisJCXdoaWxlKGN1cmVsbS0+ZmllbGQuc2xlX25leHQgIT0gKGVsbSkpCQkJXAorCQkJY3VyZWxtID0gY3VyZWxtLT5maWVsZC5zbGVfbmV4dDsJCVwKKwkJY3VyZWxtLT5maWVsZC5zbGVfbmV4dCA9CQkJCVwKKwkJICAgIGN1cmVsbS0+ZmllbGQuc2xlX25leHQtPmZpZWxkLnNsZV9uZXh0OwkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNMSVNUX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJCVwKKwlmb3IoKHZhcikgPSAoaGVhZCktPnNsaF9maXJzdDsgKHZhcik7ICh2YXIpID0gKHZhciktPmZpZWxkLnNsZV9uZXh0KQorCisvKgorICogU2luZ2x5LWxpbmtlZCBMaXN0IGFjY2VzcyBtZXRob2RzLgorICovCisjZGVmaW5lCVNMSVNUX0VNUFRZKGhlYWQpCSgoaGVhZCktPnNsaF9maXJzdCA9PSBOVUxMKQorI2RlZmluZQlTTElTVF9GSVJTVChoZWFkKQkoKGhlYWQpLT5zbGhfZmlyc3QpCisjZGVmaW5lCVNMSVNUX05FWFQoZWxtLCBmaWVsZCkJKChlbG0pLT5maWVsZC5zbGVfbmV4dCkKKworCisvKgorICogU2luZ2x5LWxpbmtlZCBUYWlsIHF1ZXVlIGRlY2xhcmF0aW9ucy4KKyAqLworI2RlZmluZQlTVEFJTFFfSEVBRChuYW1lLCB0eXBlKQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpzdHFoX2ZpcnN0OwkvKiBmaXJzdCBlbGVtZW50ICovCQkJXAorCXN0cnVjdCB0eXBlICoqc3RxaF9sYXN0OwkvKiBhZGRyIG9mIGxhc3QgbmV4dCBlbGVtZW50ICovCQlcCit9CisKKyNkZWZpbmUJU1RBSUxRX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJCVwKKwl7IE5VTEwsICYoaGVhZCkuc3RxaF9maXJzdCB9CisKKyNkZWZpbmUJU1RBSUxRX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc3RxZV9uZXh0OwkvKiBuZXh0IGVsZW1lbnQgKi8JCQlcCit9CisKKy8qCisgKiBTaW5nbHktbGlua2VkIFRhaWwgcXVldWUgZnVuY3Rpb25zLgorICovCisjZGVmaW5lCVNUQUlMUV9JTklUKGhlYWQpIGRvIHsJCQkJCQlcCisJKGhlYWQpLT5zdHFoX2ZpcnN0ID0gTlVMTDsJCQkJCVwKKwkoaGVhZCktPnN0cWhfbGFzdCA9ICYoaGVhZCktPnN0cWhfZmlyc3Q7CQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNUQUlMUV9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoKGVsbSktPmZpZWxkLnN0cWVfbmV4dCA9IChoZWFkKS0+c3RxaF9maXJzdCkgPT0gTlVMTCkJXAorCQkoaGVhZCktPnN0cWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQuc3RxZV9uZXh0OwkJXAorCShoZWFkKS0+c3RxaF9maXJzdCA9IChlbG0pOwkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU1RBSUxRX0lOU0VSVF9UQUlMKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLnN0cWVfbmV4dCA9IE5VTEw7CQkJCQlcCisJKihoZWFkKS0+c3RxaF9sYXN0ID0gKGVsbSk7CQkJCQlcCisJKGhlYWQpLT5zdHFoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnN0cWVfbmV4dDsJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTVEFJTFFfSU5TRVJUX0FGVEVSKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCVwKKwlpZiAoKChlbG0pLT5maWVsZC5zdHFlX25leHQgPSAobGlzdGVsbSktPmZpZWxkLnN0cWVfbmV4dCkgPT0gTlVMTClcCisJCShoZWFkKS0+c3RxaF9sYXN0ID0gJihlbG0pLT5maWVsZC5zdHFlX25leHQ7CQlcCisJKGxpc3RlbG0pLT5maWVsZC5zdHFlX25leHQgPSAoZWxtKTsJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU1RBSUxRX1JFTU9WRV9IRUFEKGhlYWQsIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoKChoZWFkKS0+c3RxaF9maXJzdCA9IChoZWFkKS0+c3RxaF9maXJzdC0+ZmllbGQuc3RxZV9uZXh0KSA9PSBOVUxMKSBcCisJCShoZWFkKS0+c3RxaF9sYXN0ID0gJihoZWFkKS0+c3RxaF9maXJzdDsJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTVEFJTFFfUkVNT1ZFKGhlYWQsIGVsbSwgdHlwZSwgZmllbGQpIGRvIHsJCQlcCisJaWYgKChoZWFkKS0+c3RxaF9maXJzdCA9PSAoZWxtKSkgewkJCQlcCisJCVNUQUlMUV9SRU1PVkVfSEVBRCgoaGVhZCksIGZpZWxkKTsJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQlzdHJ1Y3QgdHlwZSAqY3VyZWxtID0gKGhlYWQpLT5zdHFoX2ZpcnN0OwkJXAorCQl3aGlsZSAoY3VyZWxtLT5maWVsZC5zdHFlX25leHQgIT0gKGVsbSkpCQkJXAorCQkJY3VyZWxtID0gY3VyZWxtLT5maWVsZC5zdHFlX25leHQ7CQlcCisJCWlmICgoY3VyZWxtLT5maWVsZC5zdHFlX25leHQgPQkJCQlcCisJCQljdXJlbG0tPmZpZWxkLnN0cWVfbmV4dC0+ZmllbGQuc3RxZV9uZXh0KSA9PSBOVUxMKSBcCisJCQkgICAgKGhlYWQpLT5zdHFoX2xhc3QgPSAmKGN1cmVsbSktPmZpZWxkLnN0cWVfbmV4dDsgXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNUQUlMUV9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkJCVwKKwlmb3IgKCh2YXIpID0gKChoZWFkKS0+c3RxaF9maXJzdCk7CQkJCVwKKwkJKHZhcik7CQkJCQkJCVwKKwkJKHZhcikgPSAoKHZhciktPmZpZWxkLnN0cWVfbmV4dCkpCisKKyNkZWZpbmUJU1RBSUxRX0NPTkNBVChoZWFkMSwgaGVhZDIpIGRvIHsJCQkJXAorCWlmICghU1RBSUxRX0VNUFRZKChoZWFkMikpKSB7CQkJCQlcCisJCSooaGVhZDEpLT5zdHFoX2xhc3QgPSAoaGVhZDIpLT5zdHFoX2ZpcnN0OwkJXAorCQkoaGVhZDEpLT5zdHFoX2xhc3QgPSAoaGVhZDIpLT5zdHFoX2xhc3Q7CQlcCisJCVNUQUlMUV9JTklUKChoZWFkMikpOwkJCQkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisvKgorICogU2luZ2x5LWxpbmtlZCBUYWlsIHF1ZXVlIGFjY2VzcyBtZXRob2RzLgorICovCisjZGVmaW5lCVNUQUlMUV9FTVBUWShoZWFkKQkoKGhlYWQpLT5zdHFoX2ZpcnN0ID09IE5VTEwpCisjZGVmaW5lCVNUQUlMUV9GSVJTVChoZWFkKQkoKGhlYWQpLT5zdHFoX2ZpcnN0KQorI2RlZmluZQlTVEFJTFFfTkVYVChlbG0sIGZpZWxkKQkoKGVsbSktPmZpZWxkLnN0cWVfbmV4dCkKKworCisvKgorICogU2ltcGxlIHF1ZXVlIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lCVNJTVBMRVFfSEVBRChuYW1lLCB0eXBlKQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpzcWhfZmlyc3Q7CS8qIGZpcnN0IGVsZW1lbnQgKi8JCQlcCisJc3RydWN0IHR5cGUgKipzcWhfbGFzdDsJLyogYWRkciBvZiBsYXN0IG5leHQgZWxlbWVudCAqLwkJXAorfQorCisjZGVmaW5lCVNJTVBMRVFfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgTlVMTCwgJihoZWFkKS5zcWhfZmlyc3QgfQorCisjZGVmaW5lCVNJTVBMRVFfRU5UUlkodHlwZSkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpzcWVfbmV4dDsJLyogbmV4dCBlbGVtZW50ICovCQkJXAorfQorCisvKgorICogU2ltcGxlIHF1ZXVlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlTSU1QTEVRX0lOSVQoaGVhZCkgZG8gewkJCQkJCVwKKwkoaGVhZCktPnNxaF9maXJzdCA9IE5VTEw7CQkJCQlcCisJKGhlYWQpLT5zcWhfbGFzdCA9ICYoaGVhZCktPnNxaF9maXJzdDsJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU0lNUExFUV9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoKGVsbSktPmZpZWxkLnNxZV9uZXh0ID0gKGhlYWQpLT5zcWhfZmlyc3QpID09IE5VTEwpCVwKKwkJKGhlYWQpLT5zcWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQuc3FlX25leHQ7CQlcCisJKGhlYWQpLT5zcWhfZmlyc3QgPSAoZWxtKTsJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNJTVBMRVFfSU5TRVJUX1RBSUwoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwkoZWxtKS0+ZmllbGQuc3FlX25leHQgPSBOVUxMOwkJCQkJXAorCSooaGVhZCktPnNxaF9sYXN0ID0gKGVsbSk7CQkJCQlcCisJKGhlYWQpLT5zcWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQuc3FlX25leHQ7CQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU0lNUExFUV9JTlNFUlRfQUZURVIoaGVhZCwgbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJXAorCWlmICgoKGVsbSktPmZpZWxkLnNxZV9uZXh0ID0gKGxpc3RlbG0pLT5maWVsZC5zcWVfbmV4dCkgPT0gTlVMTClcCisJCShoZWFkKS0+c3FoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnNxZV9uZXh0OwkJXAorCShsaXN0ZWxtKS0+ZmllbGQuc3FlX25leHQgPSAoZWxtKTsJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU0lNUExFUV9SRU1PVkVfSEVBRChoZWFkLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKCgoaGVhZCktPnNxaF9maXJzdCA9IChoZWFkKS0+c3FoX2ZpcnN0LT5maWVsZC5zcWVfbmV4dCkgPT0gTlVMTCkgXAorCQkoaGVhZCktPnNxaF9sYXN0ID0gJihoZWFkKS0+c3FoX2ZpcnN0OwkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNJTVBMRVFfUkVNT1ZFKGhlYWQsIGVsbSwgdHlwZSwgZmllbGQpIGRvIHsJCQlcCisJaWYgKChoZWFkKS0+c3FoX2ZpcnN0ID09IChlbG0pKSB7CQkJCVwKKwkJU0lNUExFUV9SRU1PVkVfSEVBRCgoaGVhZCksIGZpZWxkKTsJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQlzdHJ1Y3QgdHlwZSAqY3VyZWxtID0gKGhlYWQpLT5zcWhfZmlyc3Q7CQlcCisJCXdoaWxlIChjdXJlbG0tPmZpZWxkLnNxZV9uZXh0ICE9IChlbG0pKQkJCVwKKwkJCWN1cmVsbSA9IGN1cmVsbS0+ZmllbGQuc3FlX25leHQ7CQlcCisJCWlmICgoY3VyZWxtLT5maWVsZC5zcWVfbmV4dCA9CQkJCVwKKwkJCWN1cmVsbS0+ZmllbGQuc3FlX25leHQtPmZpZWxkLnNxZV9uZXh0KSA9PSBOVUxMKSBcCisJCQkgICAgKGhlYWQpLT5zcWhfbGFzdCA9ICYoY3VyZWxtKS0+ZmllbGQuc3FlX25leHQ7IFwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTSU1QTEVRX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJXAorCWZvciAoKHZhcikgPSAoKGhlYWQpLT5zcWhfZmlyc3QpOwkJCQlcCisJCSh2YXIpOwkJCQkJCQlcCisJCSh2YXIpID0gKCh2YXIpLT5maWVsZC5zcWVfbmV4dCkpCisKKy8qCisgKiBTaW1wbGUgcXVldWUgYWNjZXNzIG1ldGhvZHMuCisgKi8KKyNkZWZpbmUJU0lNUExFUV9FTVBUWShoZWFkKQkJKChoZWFkKS0+c3FoX2ZpcnN0ID09IE5VTEwpCisjZGVmaW5lCVNJTVBMRVFfRklSU1QoaGVhZCkJCSgoaGVhZCktPnNxaF9maXJzdCkKKyNkZWZpbmUJU0lNUExFUV9ORVhUKGVsbSwgZmllbGQpCSgoZWxtKS0+ZmllbGQuc3FlX25leHQpCisKKworLyoKKyAqIFRhaWwgcXVldWUgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUJX1RBSUxRX0hFQUQobmFtZSwgdHlwZSwgcXVhbCkJCQkJCVwKK3N0cnVjdCBuYW1lIHsJCQkJCQkJCVwKKwlxdWFsIHR5cGUgKnRxaF9maXJzdDsJCS8qIGZpcnN0IGVsZW1lbnQgKi8JCVwKKwlxdWFsIHR5cGUgKnF1YWwgKnRxaF9sYXN0OwkvKiBhZGRyIG9mIGxhc3QgbmV4dCBlbGVtZW50ICovCVwKK30KKyNkZWZpbmUgVEFJTFFfSEVBRChuYW1lLCB0eXBlKQlfVEFJTFFfSEVBRChuYW1lLCBzdHJ1Y3QgdHlwZSwpCisKKyNkZWZpbmUJVEFJTFFfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgTlVMTCwgJihoZWFkKS50cWhfZmlyc3QgfQorCisjZGVmaW5lCV9UQUlMUV9FTlRSWSh0eXBlLCBxdWFsKQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlxdWFsIHR5cGUgKnRxZV9uZXh0OwkJLyogbmV4dCBlbGVtZW50ICovCQlcCisJcXVhbCB0eXBlICpxdWFsICp0cWVfcHJldjsJLyogYWRkcmVzcyBvZiBwcmV2aW91cyBuZXh0IGVsZW1lbnQgKi9cCit9CisjZGVmaW5lIFRBSUxRX0VOVFJZKHR5cGUpCV9UQUlMUV9FTlRSWShzdHJ1Y3QgdHlwZSwpCisKKy8qCisgKiBUYWlsIHF1ZXVlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlUQUlMUV9JTklUKGhlYWQpIGRvIHsJCQkJCQlcCisJKGhlYWQpLT50cWhfZmlyc3QgPSBOVUxMOwkJCQkJXAorCShoZWFkKS0+dHFoX2xhc3QgPSAmKGhlYWQpLT50cWhfZmlyc3Q7CQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVRBSUxRX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJaWYgKCgoZWxtKS0+ZmllbGQudHFlX25leHQgPSAoaGVhZCktPnRxaF9maXJzdCkgIT0gTlVMTCkJXAorCQkoaGVhZCktPnRxaF9maXJzdC0+ZmllbGQudHFlX3ByZXYgPQkJCVwKKwkJICAgICYoZWxtKS0+ZmllbGQudHFlX25leHQ7CQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCShoZWFkKS0+dHFoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJXAorCShoZWFkKS0+dHFoX2ZpcnN0ID0gKGVsbSk7CQkJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gJihoZWFkKS0+dHFoX2ZpcnN0OwkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVRBSUxRX0lOU0VSVF9UQUlMKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9uZXh0ID0gTlVMTDsJCQkJCVwKKwkoZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAoaGVhZCktPnRxaF9sYXN0OwkJCVwKKwkqKGhlYWQpLT50cWhfbGFzdCA9IChlbG0pOwkJCQkJXAorCShoZWFkKS0+dHFoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVRBSUxRX0lOU0VSVF9BRlRFUihoZWFkLCBsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQlcCisJaWYgKCgoZWxtKS0+ZmllbGQudHFlX25leHQgPSAobGlzdGVsbSktPmZpZWxkLnRxZV9uZXh0KSAhPSBOVUxMKVwKKwkJKGVsbSktPmZpZWxkLnRxZV9uZXh0LT5maWVsZC50cWVfcHJldiA9IAkJXAorCQkgICAgJihlbG0pLT5maWVsZC50cWVfbmV4dDsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGhlYWQpLT50cWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQudHFlX25leHQ7CQlcCisJKGxpc3RlbG0pLT5maWVsZC50cWVfbmV4dCA9IChlbG0pOwkJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gJihsaXN0ZWxtKS0+ZmllbGQudHFlX25leHQ7CQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlUQUlMUV9JTlNFUlRfQkVGT1JFKGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gKGxpc3RlbG0pLT5maWVsZC50cWVfcHJldjsJCVwKKwkoZWxtKS0+ZmllbGQudHFlX25leHQgPSAobGlzdGVsbSk7CQkJCVwKKwkqKGxpc3RlbG0pLT5maWVsZC50cWVfcHJldiA9IChlbG0pOwkJCQlcCisJKGxpc3RlbG0pLT5maWVsZC50cWVfcHJldiA9ICYoZWxtKS0+ZmllbGQudHFlX25leHQ7CQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlUQUlMUV9SRU1PVkUoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKCgoZWxtKS0+ZmllbGQudHFlX25leHQpICE9IE5VTEwpCQkJCVwKKwkJKGVsbSktPmZpZWxkLnRxZV9uZXh0LT5maWVsZC50cWVfcHJldiA9IAkJXAorCQkgICAgKGVsbSktPmZpZWxkLnRxZV9wcmV2OwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gKGVsbSktPmZpZWxkLnRxZV9wcmV2OwkJXAorCSooZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAoZWxtKS0+ZmllbGQudHFlX25leHQ7CQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJVEFJTFFfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQkJXAorCWZvciAoKHZhcikgPSAoKGhlYWQpLT50cWhfZmlyc3QpOwkJCQlcCisJCSh2YXIpOwkJCQkJCQlcCisJCSh2YXIpID0gKCh2YXIpLT5maWVsZC50cWVfbmV4dCkpCisKKyNkZWZpbmUJVEFJTFFfRk9SRUFDSF9SRVZFUlNFKHZhciwgaGVhZCwgaGVhZG5hbWUsIGZpZWxkKQkJXAorCWZvciAoKHZhcikgPSAoKigoKHN0cnVjdCBoZWFkbmFtZSAqKSgoaGVhZCktPnRxaF9sYXN0KSktPnRxaF9sYXN0KSk7CVwKKwkJKHZhcik7CQkJCQkJCVwKKwkJKHZhcikgPSAoKigoKHN0cnVjdCBoZWFkbmFtZSAqKSgodmFyKS0+ZmllbGQudHFlX3ByZXYpKS0+dHFoX2xhc3QpKSkKKworI2RlZmluZQlUQUlMUV9DT05DQVQoaGVhZDEsIGhlYWQyLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKCFUQUlMUV9FTVBUWShoZWFkMikpIHsJCQkJCVwKKwkJKihoZWFkMSktPnRxaF9sYXN0ID0gKGhlYWQyKS0+dHFoX2ZpcnN0OwkJXAorCQkoaGVhZDIpLT50cWhfZmlyc3QtPmZpZWxkLnRxZV9wcmV2ID0gKGhlYWQxKS0+dHFoX2xhc3Q7CVwKKwkJKGhlYWQxKS0+dHFoX2xhc3QgPSAoaGVhZDIpLT50cWhfbGFzdDsJCQlcCisJCVRBSUxRX0lOSVQoKGhlYWQyKSk7CQkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKy8qCisgKiBUYWlsIHF1ZXVlIGFjY2VzcyBtZXRob2RzLgorICovCisjZGVmaW5lCVRBSUxRX0VNUFRZKGhlYWQpCQkoKGhlYWQpLT50cWhfZmlyc3QgPT0gTlVMTCkKKyNkZWZpbmUJVEFJTFFfRklSU1QoaGVhZCkJCSgoaGVhZCktPnRxaF9maXJzdCkKKyNkZWZpbmUJVEFJTFFfTkVYVChlbG0sIGZpZWxkKQkJKChlbG0pLT5maWVsZC50cWVfbmV4dCkKKworI2RlZmluZQlUQUlMUV9MQVNUKGhlYWQsIGhlYWRuYW1lKSBcCisJKCooKChzdHJ1Y3QgaGVhZG5hbWUgKikoKGhlYWQpLT50cWhfbGFzdCkpLT50cWhfbGFzdCkpCisjZGVmaW5lCVRBSUxRX1BSRVYoZWxtLCBoZWFkbmFtZSwgZmllbGQpIFwKKwkoKigoKHN0cnVjdCBoZWFkbmFtZSAqKSgoZWxtKS0+ZmllbGQudHFlX3ByZXYpKS0+dHFoX2xhc3QpKQorCisKKy8qCisgKiBDaXJjdWxhciBxdWV1ZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZQlDSVJDTEVRX0hFQUQobmFtZSwgdHlwZSkJCQkJCVwKK3N0cnVjdCBuYW1lIHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqY3FoX2ZpcnN0OwkJLyogZmlyc3QgZWxlbWVudCAqLwkJXAorCXN0cnVjdCB0eXBlICpjcWhfbGFzdDsJCS8qIGxhc3QgZWxlbWVudCAqLwkJXAorfQorCisjZGVmaW5lCUNJUkNMRVFfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgKHZvaWQgKikmaGVhZCwgKHZvaWQgKikmaGVhZCB9CisKKyNkZWZpbmUJQ0lSQ0xFUV9FTlRSWSh0eXBlKQkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKmNxZV9uZXh0OwkJLyogbmV4dCBlbGVtZW50ICovCQlcCisJc3RydWN0IHR5cGUgKmNxZV9wcmV2OwkJLyogcHJldmlvdXMgZWxlbWVudCAqLwkJXAorfQorCisvKgorICogQ2lyY3VsYXIgcXVldWUgZnVuY3Rpb25zLgorICovCisjZGVmaW5lCUNJUkNMRVFfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAorCShoZWFkKS0+Y3FoX2ZpcnN0ID0gKHZvaWQgKikoaGVhZCk7CQkJCVwKKwkoaGVhZCktPmNxaF9sYXN0ID0gKHZvaWQgKikoaGVhZCk7CQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCUNJUkNMRVFfSU5TRVJUX0FGVEVSKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX25leHQgPSAobGlzdGVsbSktPmZpZWxkLmNxZV9uZXh0OwkJXAorCShlbG0pLT5maWVsZC5jcWVfcHJldiA9IChsaXN0ZWxtKTsJCQkJXAorCWlmICgobGlzdGVsbSktPmZpZWxkLmNxZV9uZXh0ID09ICh2b2lkICopKGhlYWQpKQkJXAorCQkoaGVhZCktPmNxaF9sYXN0ID0gKGVsbSk7CQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCShsaXN0ZWxtKS0+ZmllbGQuY3FlX25leHQtPmZpZWxkLmNxZV9wcmV2ID0gKGVsbSk7CVwKKwkobGlzdGVsbSktPmZpZWxkLmNxZV9uZXh0ID0gKGVsbSk7CQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCUNJUkNMRVFfSU5TRVJUX0JFRk9SRShoZWFkLCBsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQlcCisJKGVsbSktPmZpZWxkLmNxZV9uZXh0ID0gKGxpc3RlbG0pOwkJCQlcCisJKGVsbSktPmZpZWxkLmNxZV9wcmV2ID0gKGxpc3RlbG0pLT5maWVsZC5jcWVfcHJldjsJCVwKKwlpZiAoKGxpc3RlbG0pLT5maWVsZC5jcWVfcHJldiA9PSAodm9pZCAqKShoZWFkKSkJCVwKKwkJKGhlYWQpLT5jcWhfZmlyc3QgPSAoZWxtKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGxpc3RlbG0pLT5maWVsZC5jcWVfcHJldi0+ZmllbGQuY3FlX25leHQgPSAoZWxtKTsJXAorCShsaXN0ZWxtKS0+ZmllbGQuY3FlX3ByZXYgPSAoZWxtKTsJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJQ0lSQ0xFUV9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC5jcWVfbmV4dCA9IChoZWFkKS0+Y3FoX2ZpcnN0OwkJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX3ByZXYgPSAodm9pZCAqKShoZWFkKTsJCQkJXAorCWlmICgoaGVhZCktPmNxaF9sYXN0ID09ICh2b2lkICopKGhlYWQpKQkJCQlcCisJCShoZWFkKS0+Y3FoX2xhc3QgPSAoZWxtKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGhlYWQpLT5jcWhfZmlyc3QtPmZpZWxkLmNxZV9wcmV2ID0gKGVsbSk7CQlcCisJKGhlYWQpLT5jcWhfZmlyc3QgPSAoZWxtKTsJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCUNJUkNMRVFfSU5TRVJUX1RBSUwoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX25leHQgPSAodm9pZCAqKShoZWFkKTsJCQkJXAorCShlbG0pLT5maWVsZC5jcWVfcHJldiA9IChoZWFkKS0+Y3FoX2xhc3Q7CQkJXAorCWlmICgoaGVhZCktPmNxaF9maXJzdCA9PSAodm9pZCAqKShoZWFkKSkJCQlcCisJCShoZWFkKS0+Y3FoX2ZpcnN0ID0gKGVsbSk7CQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCShoZWFkKS0+Y3FoX2xhc3QtPmZpZWxkLmNxZV9uZXh0ID0gKGVsbSk7CQlcCisJKGhlYWQpLT5jcWhfbGFzdCA9IChlbG0pOwkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJQ0lSQ0xFUV9SRU1PVkUoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKChlbG0pLT5maWVsZC5jcWVfbmV4dCA9PSAodm9pZCAqKShoZWFkKSkJCQlcCisJCShoZWFkKS0+Y3FoX2xhc3QgPSAoZWxtKS0+ZmllbGQuY3FlX3ByZXY7CQlcCisJZWxzZQkJCQkJCQkJXAorCQkoZWxtKS0+ZmllbGQuY3FlX25leHQtPmZpZWxkLmNxZV9wcmV2ID0JCQlcCisJCSAgICAoZWxtKS0+ZmllbGQuY3FlX3ByZXY7CQkJCVwKKwlpZiAoKGVsbSktPmZpZWxkLmNxZV9wcmV2ID09ICh2b2lkICopKGhlYWQpKQkJCVwKKwkJKGhlYWQpLT5jcWhfZmlyc3QgPSAoZWxtKS0+ZmllbGQuY3FlX25leHQ7CQlcCisJZWxzZQkJCQkJCQkJXAorCQkoZWxtKS0+ZmllbGQuY3FlX3ByZXYtPmZpZWxkLmNxZV9uZXh0ID0JCQlcCisJCSAgICAoZWxtKS0+ZmllbGQuY3FlX25leHQ7CQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCUNJUkNMRVFfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQlcCisJZm9yICgodmFyKSA9ICgoaGVhZCktPmNxaF9maXJzdCk7CQkJCVwKKwkJKHZhcikgIT0gKGNvbnN0IHZvaWQgKikoaGVhZCk7CQkJCVwKKwkJKHZhcikgPSAoKHZhciktPmZpZWxkLmNxZV9uZXh0KSkKKworI2RlZmluZQlDSVJDTEVRX0ZPUkVBQ0hfUkVWRVJTRSh2YXIsIGhlYWQsIGZpZWxkKQkJCVwKKwlmb3IgKCh2YXIpID0gKChoZWFkKS0+Y3FoX2xhc3QpOwkJCQlcCisJCSh2YXIpICE9IChjb25zdCB2b2lkICopKGhlYWQpOwkJCQlcCisJCSh2YXIpID0gKCh2YXIpLT5maWVsZC5jcWVfcHJldikpCisKKy8qCisgKiBDaXJjdWxhciBxdWV1ZSBhY2Nlc3MgbWV0aG9kcy4KKyAqLworI2RlZmluZQlDSVJDTEVRX0VNUFRZKGhlYWQpCQkoKGhlYWQpLT5jcWhfZmlyc3QgPT0gKHZvaWQgKikoaGVhZCkpCisjZGVmaW5lCUNJUkNMRVFfRklSU1QoaGVhZCkJCSgoaGVhZCktPmNxaF9maXJzdCkKKyNkZWZpbmUJQ0lSQ0xFUV9MQVNUKGhlYWQpCQkoKGhlYWQpLT5jcWhfbGFzdCkKKyNkZWZpbmUJQ0lSQ0xFUV9ORVhUKGVsbSwgZmllbGQpCSgoZWxtKS0+ZmllbGQuY3FlX25leHQpCisjZGVmaW5lCUNJUkNMRVFfUFJFVihlbG0sIGZpZWxkKQkoKGVsbSktPmZpZWxkLmNxZV9wcmV2KQorCisjZGVmaW5lIENJUkNMRVFfTE9PUF9ORVhUKGhlYWQsIGVsbSwgZmllbGQpCQkJCVwKKwkoKChlbG0pLT5maWVsZC5jcWVfbmV4dCA9PSAodm9pZCAqKShoZWFkKSkJCQlcCisJICAgID8gKChoZWFkKS0+Y3FoX2ZpcnN0KQkJCQkJXAorCSAgICA6IChlbG0tPmZpZWxkLmNxZV9uZXh0KSkKKyNkZWZpbmUgQ0lSQ0xFUV9MT09QX1BSRVYoaGVhZCwgZWxtLCBmaWVsZCkJCQkJXAorCSgoKGVsbSktPmZpZWxkLmNxZV9wcmV2ID09ICh2b2lkICopKGhlYWQpKQkJCVwKKwkgICAgPyAoKGhlYWQpLT5jcWhfbGFzdCkJCQkJCVwKKwkgICAgOiAoZWxtLT5maWVsZC5jcWVfcHJldikpCisKKyNlbmRpZgkvKiBzeXMvcXVldWUuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9xdW90YS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9xdW90YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYTBlYzAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3F1b3RhLmgKQEAgLTAsMCArMSwyMjUgQEAKKy8qIFRoaXMganVzdCByZXByZXNlbnRzIHRoZSBub24ta2VybmVsIHBhcnRzIG9mIDxsaW51eC9xdW90YS5oPi4KKyAqCisgKiBoZXJlJ3MgdGhlIGNvcnJlc3BvbmRpbmcgY29weXJpZ2h0OgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogUm9iZXJ0IEVseiBhdCBUaGUgVW5pdmVyc2l0eSBvZiBNZWxib3VybmUuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1NZU19RVU9UQV9ICisjZGVmaW5lIF9TWVNfUVVPVEFfSCAxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKgorICogU2VsZWN0IGJldHdlZW4gZGlmZmVyZW50IGluY29tcGF0aWJsZSBxdW90YSB2ZXJzaW9ucy4KKyAqIERlZmF1bHQgdG8gdGhlIHZlcnNpb24gdXNlZCBieSBMaW51eCBrZXJuZWwgdmVyc2lvbiAyLjQuMjIKKyAqIG9yIGxhdGVyLiAgKi8KKyNpZm5kZWYgX0xJTlVYX1FVT1RBX1ZFUlNJT04KKyMgZGVmaW5lIF9MSU5VWF9RVU9UQV9WRVJTSU9OIDIKKyNlbmRpZgorCisvKgorICogQ29udmVydCBkaXNrYmxvY2tzIHRvIGJsb2NrcyBhbmQgdGhlIG90aGVyIHdheSBhcm91bmQuCisgKiBjdXJyZW50bHkgb25seSB0byBmb29sIHRoZSBCU0Qgc291cmNlLiA6LSkKKyAqLworI2RlZmluZSBkYnRvYihudW0pICgobnVtKSA8PCAxMCkKKyNkZWZpbmUgYnRvZGIobnVtKSAoKG51bSkgPj4gMTApCisKKy8qCisgKiBDb252ZXJ0IGNvdW50IG9mIGZpbGVzeXN0ZW0gYmxvY2tzIHRvIGRpc2txdW90YSBibG9ja3MsIG1lYW50CisgKiBmb3IgZmlsZXN5c3RlbXMgd2hlcmUgaV9ibGtzaXplICE9IEJMT0NLX1NJWkUKKyAqLworI2RlZmluZSBmc190b19kcV9ibG9ja3MobnVtLCBibGtzaXplKSAoKChudW0pICogKGJsa3NpemUpKSAvIEJMT0NLX1NJWkUpCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgZGlzayBxdW90YXMgaW1wb3NlZCBvbiB0aGUgYXZlcmFnZSB1c2VyCisgKiAoYmlnIGJyb3RoZXIgZmluYWxseSBoaXRzIExpbnV4KS4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBkZWZpbmUgdGhlIGFtb3VudCBvZiB0aW1lIGdpdmVuIGEgdXNlcgorICogYmVmb3JlIHRoZSBzb2Z0IGxpbWl0cyBhcmUgdHJlYXRlZCBhcyBoYXJkIGxpbWl0cyAodXN1YWxseSByZXN1bHRpbmcKKyAqIGluIGFuIGFsbG9jYXRpb24gZmFpbHVyZSkuIFRoZSB0aW1lciBpcyBzdGFydGVkIHdoZW4gdGhlIHVzZXIgY3Jvc3NlcworICogdGhlaXIgc29mdCBsaW1pdCwgaXQgaXMgcmVzZXQgd2hlbiB0aGV5IGdvIGJlbG93IHRoZWlyIHNvZnQgbGltaXQuCisgKi8KKyNkZWZpbmUgTUFYX0lRX1RJTUUgIDYwNDgwMAkvKiAoNyoyNCo2MCo2MCkgMSB3ZWVrICovCisjZGVmaW5lIE1BWF9EUV9USU1FICA2MDQ4MDAJLyogKDcqMjQqNjAqNjApIDEgd2VlayAqLworCisjZGVmaW5lIE1BWFFVT1RBUyAyCisjZGVmaW5lIFVTUlFVT1RBICAwCQkvKiBlbGVtZW50IHVzZWQgZm9yIHVzZXIgcXVvdGFzICovCisjZGVmaW5lIEdSUFFVT1RBICAxCQkvKiBlbGVtZW50IHVzZWQgZm9yIGdyb3VwIHF1b3RhcyAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBkZWZhdWx0IG5hbWVzIG9mIHRoZSBxdW90YXMgZmlsZXMuCisgKi8KKyNkZWZpbmUgSU5JVFFGTkFNRVMgeyBcCisgICAidXNlciIsICAgICAgLyogVVNSUVVPVEEgKi8gXAorICAgImdyb3VwIiwgICAvKiBHUlBRVU9UQSAqLyBcCisgICAidW5kZWZpbmVkIiwgXAorfTsKKworI2RlZmluZSBRVU9UQUZJTEVOQU1FICJxdW90YSIKKyNkZWZpbmUgUVVPVEFHUk9VUCAic3RhZmYiCisKKyNkZWZpbmUgTlJfRFFIQVNIIDQzICAgICAgICAgIC8qIEp1c3QgYW4gYXJiaXRyYXJ5IG51bWJlciBhbnkgc3VnZ2VzdGlvbnMgPyAqLworI2RlZmluZSBOUl9EUVVPVFMgMjU2ICAgICAgICAgLyogTnVtYmVyIG9mIHF1b3RhcyBhY3RpdmUgYXQgb25lIHRpbWUgKi8KKworLyoKKyAqIENvbW1hbmQgZGVmaW5pdGlvbnMgZm9yIHRoZSAncXVvdGFjdGwnIHN5c3RlbSBjYWxsLgorICogVGhlIGNvbW1hbmRzIGFyZSBicm9rZW4gaW50byBhIG1haW4gY29tbWFuZCBkZWZpbmVkIGJlbG93CisgKiBhbmQgYSBzdWJjb21tYW5kIHRoYXQgaXMgdXNlZCB0byBjb252ZXkgdGhlIHR5cGUgb2YKKyAqIHF1b3RhIHRoYXQgaXMgYmVpbmcgbWFuaXB1bGF0ZWQgKHNlZSBhYm92ZSkuCisgKi8KKyNkZWZpbmUgU1VCQ01ETUFTSyAgMHgwMGZmCisjZGVmaW5lIFNVQkNNRFNISUZUIDgKKyNkZWZpbmUgUUNNRChjbWQsIHR5cGUpICAoKChjbWQpIDw8IFNVQkNNRFNISUZUKSB8ICgodHlwZSkgJiBTVUJDTURNQVNLKSkKKworI2lmIF9MSU5VWF9RVU9UQV9WRVJTSU9OIDwgMgorIyBkZWZpbmUgUV9RVU9UQU9OICAweDAxMDAJLyogZW5hYmxlIHF1b3RhcyAqLworIyBkZWZpbmUgUV9RVU9UQU9GRiAweDAyMDAJLyogZGlzYWJsZSBxdW90YXMgKi8KKyMgZGVmaW5lIFFfR0VUUVVPVEEgMHgwMzAwCS8qIGdldCBsaW1pdHMgYW5kIHVzYWdlICovCisjIGRlZmluZSBRX1NFVFFVT1RBIDB4MDQwMAkvKiBzZXQgbGltaXRzIGFuZCB1c2FnZSAqLworIyBkZWZpbmUgUV9TRVRVU0UgICAweDA1MDAJLyogc2V0IHVzYWdlICovCisjIGRlZmluZSBRX1NZTkMgICAgIDB4MDYwMAkvKiBzeW5jIGRpc2sgY29weSBvZiBhIGZpbGVzeXN0ZW1zIHF1b3RhcyAqLworIyBkZWZpbmUgUV9TRVRRTElNICAweDA3MDAJLyogc2V0IGxpbWl0cyAqLworIyBkZWZpbmUgUV9HRVRTVEFUUyAweDA4MDAJLyogZ2V0IGNvbGxlY3RlZCBzdGF0cyAqLworIyBkZWZpbmUgUV9SU1FVQVNIICAweDEwMDAJLyogc2V0IHJvb3Rfc3F1YXNoIG9wdGlvbiAqLworI2Vsc2UKKyMgZGVmaW5lIFFfU1lOQyAgICAgMHg4MDAwMDEJLyogc3luYyBkaXNrIGNvcHkgb2YgYSBmaWxlc3lzdGVtcyBxdW90YXMgKi8KKyMgZGVmaW5lIFFfUVVPVEFPTiAgMHg4MDAwMDIJLyogdHVybiBxdW90YXMgb24gKi8KKyMgZGVmaW5lIFFfUVVPVEFPRkYgMHg4MDAwMDMJLyogdHVybiBxdW90YXMgb2ZmICovCisjIGRlZmluZSBRX0dFVEZNVCAgIDB4ODAwMDA0CS8qIGdldCBxdW90YSBmb3JtYXQgdXNlZCBvbiBnaXZlbiBmaWxlc3lzdGVtICovCisjIGRlZmluZSBRX0dFVElORk8gIDB4ODAwMDA1CS8qIGdldCBpbmZvcm1hdGlvbiBhYm91dCBxdW90YSBmaWxlcyAqLworIyBkZWZpbmUgUV9TRVRJTkZPICAweDgwMDAwNgkvKiBzZXQgaW5mb3JtYXRpb24gYWJvdXQgcXVvdGEgZmlsZXMgKi8KKyMgZGVmaW5lIFFfR0VUUVVPVEEgMHg4MDAwMDcJLyogZ2V0IHVzZXIgcXVvdGEgc3RydWN0dXJlICovCisjIGRlZmluZSBRX1NFVFFVT1RBIDB4ODAwMDA4CS8qIHNldCB1c2VyIHF1b3RhIHN0cnVjdHVyZSAqLworI2VuZGlmCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBmb3JtYXQgb2YgdGhlIGRpc2sgcXVvdGEgZmlsZQorICogKGFzIGl0IGFwcGVhcnMgb24gZGlzaykgLSB0aGUgZmlsZSBpcyBhbiBhcnJheSBvZiB0aGVzZSBzdHJ1Y3R1cmVzCisgKiBpbmRleGVkIGJ5IHVzZXIgb3IgZ3JvdXAgbnVtYmVyLgorICovCisjaWYgX0xJTlVYX1FVT1RBX1ZFUlNJT04gPCAyCitzdHJ1Y3QgZHFibGsKKyAgeworICAgIHVfaW50MzJfdCBkcWJfYmhhcmRsaW1pdDsJLyogYWJzb2x1dGUgbGltaXQgb24gZGlzayBibGtzIGFsbG9jICovCisgICAgdV9pbnQzMl90IGRxYl9ic29mdGxpbWl0OwkvKiBwcmVmZXJyZWQgbGltaXQgb24gZGlzayBibGtzICovCisgICAgdV9pbnQzMl90IGRxYl9jdXJibG9ja3M7CS8qIGN1cnJlbnQgYmxvY2sgY291bnQgKi8KKyAgICB1X2ludDMyX3QgZHFiX2loYXJkbGltaXQ7CS8qIG1heGltdW0gIyBhbGxvY2F0ZWQgaW5vZGVzICovCisgICAgdV9pbnQzMl90IGRxYl9pc29mdGxpbWl0OwkvKiBwcmVmZXJyZWQgaW5vZGUgbGltaXQgKi8KKyAgICB1X2ludDMyX3QgZHFiX2N1cmlub2RlczsJLyogY3VycmVudCAjIGFsbG9jYXRlZCBpbm9kZXMgKi8KKyAgICB0aW1lX3QgZHFiX2J0aW1lOwkJLyogdGltZSBsaW1pdCBmb3IgZXhjZXNzaXZlIGRpc2sgdXNlICovCisgICAgdGltZV90IGRxYl9pdGltZTsJCS8qIHRpbWUgbGltaXQgZm9yIGV4Y2Vzc2l2ZSBmaWxlcyAqLworICB9OworI2Vsc2UKKworLyogRmxhZ3MgdGhhdCBpbmRpY2F0ZSB3aGljaCBmaWVsZHMgaW4gZHFibGsgc3RydWN0dXJlIGFyZSB2YWxpZC4gICovCisjZGVmaW5lIFFJRl9CTElNSVRTCTEKKyNkZWZpbmUgUUlGX1NQQUNFCTIKKyNkZWZpbmUgUUlGX0lMSU1JVFMJNAorI2RlZmluZSBRSUZfSU5PREVTCTgKKyNkZWZpbmUgUUlGX0JUSU1FCTE2CisjZGVmaW5lIFFJRl9JVElNRQkzMgorI2RlZmluZSBRSUZfTElNSVRTCShRSUZfQkxJTUlUUyB8IFFJRl9JTElNSVRTKQorI2RlZmluZSBRSUZfVVNBR0UJKFFJRl9TUEFDRSB8IFFJRl9JTk9ERVMpCisjZGVmaW5lIFFJRl9USU1FUwkoUUlGX0JUSU1FIHwgUUlGX0lUSU1FKQorI2RlZmluZSBRSUZfQUxMCQkoUUlGX0xJTUlUUyB8IFFJRl9VU0FHRSB8IFFJRl9USU1FUykKKworc3RydWN0IGRxYmxrCisgIHsKKyAgICB1X2ludDY0X3QgZHFiX2JoYXJkbGltaXQ7CS8qIGFic29sdXRlIGxpbWl0IG9uIGRpc2sgcXVvdGEgYmxvY2tzIGFsbG9jICovCisgICAgdV9pbnQ2NF90IGRxYl9ic29mdGxpbWl0OwkvKiBwcmVmZXJyZWQgbGltaXQgb24gZGlzayBxdW90YSBibG9ja3MgKi8KKyAgICB1X2ludDY0X3QgZHFiX2N1cnNwYWNlOwkvKiBjdXJyZW50IHF1b3RhIGJsb2NrIGNvdW50ICovCisgICAgdV9pbnQ2NF90IGRxYl9paGFyZGxpbWl0OwkvKiBtYXhpbXVtICMgYWxsb2NhdGVkIGlub2RlcyAqLworICAgIHVfaW50NjRfdCBkcWJfaXNvZnRsaW1pdDsJLyogcHJlZmVycmVkIGlub2RlIGxpbWl0ICovCisgICAgdV9pbnQ2NF90IGRxYl9jdXJpbm9kZXM7CS8qIGN1cnJlbnQgIyBhbGxvY2F0ZWQgaW5vZGVzICovCisgICAgdV9pbnQ2NF90IGRxYl9idGltZTsJLyogdGltZSBsaW1pdCBmb3IgZXhjZXNzaXZlIGRpc2sgdXNlICovCisgICAgdV9pbnQ2NF90IGRxYl9pdGltZTsJLyogdGltZSBsaW1pdCBmb3IgZXhjZXNzaXZlIGZpbGVzICovCisgICAgdV9pbnQzMl90IGRxYl92YWxpZDsJLyogYml0bWFzayBvZiBRSUZfKiBjb25zdGFudHMgKi8KKyAgfTsKKyNlbmRpZgorCisvKgorICogU2hvcnRoYW5kIG5vdGF0aW9uLgorICovCisjZGVmaW5lCWRxX2JoYXJkbGltaXQJZHFfZHFiLmRxYl9iaGFyZGxpbWl0CisjZGVmaW5lCWRxX2Jzb2Z0bGltaXQJZHFfZHFiLmRxYl9ic29mdGxpbWl0CisjaWYgX0xJTlVYX1FVT1RBX1ZFUlNJT04gPCAyCisjIGRlZmluZSBkcV9jdXJibG9ja3MJZHFfZHFiLmRxYl9jdXJibG9ja3MKKyNlbHNlCisjIGRlZmluZSBkcV9jdXJzcGFjZQlkcV9kcWIuZHFiX2N1cnNwYWNlCisjIGRlZmluZSBkcV92YWxpZAlkcV9kcWIuZHFiX3ZhbGlkCisjZW5kaWYKKyNkZWZpbmUJZHFfaWhhcmRsaW1pdAlkcV9kcWIuZHFiX2loYXJkbGltaXQKKyNkZWZpbmUJZHFfaXNvZnRsaW1pdAlkcV9kcWIuZHFiX2lzb2Z0bGltaXQKKyNkZWZpbmUJZHFfY3VyaW5vZGVzCWRxX2RxYi5kcWJfY3VyaW5vZGVzCisjZGVmaW5lCWRxX2J0aW1lCWRxX2RxYi5kcWJfYnRpbWUKKyNkZWZpbmUJZHFfaXRpbWUJZHFfZHFiLmRxYl9pdGltZQorCisjZGVmaW5lIGRxb2ZmKFVJRCkgICAgICAoKGxvZmZfdCkoKFVJRCkgKiBzaXplb2YgKHN0cnVjdCBkcWJsaykpKQorCisjaWYgX0xJTlVYX1FVT1RBX1ZFUlNJT04gPCAyCitzdHJ1Y3QgZHFzdGF0cworICB7CisgICAgdV9pbnQzMl90IGxvb2t1cHM7CisgICAgdV9pbnQzMl90IGRyb3BzOworICAgIHVfaW50MzJfdCByZWFkczsKKyAgICB1X2ludDMyX3Qgd3JpdGVzOworICAgIHVfaW50MzJfdCBjYWNoZV9oaXRzOworICAgIHVfaW50MzJfdCBwYWdlc19hbGxvY2F0ZWQ7CisgICAgdV9pbnQzMl90IGFsbG9jYXRlZF9kcXVvdHM7CisgICAgdV9pbnQzMl90IGZyZWVfZHF1b3RzOworICAgIHVfaW50MzJfdCBzeW5jczsKKyAgfTsKKyNlbHNlCisKKy8qIEZsYWdzIHRoYXQgaW5kaWNhdGUgd2hpY2ggZmllbGRzIGluIGRxaW5mbyBzdHJ1Y3R1cmUgYXJlIHZhbGlkLiAgKi8KKyMgZGVmaW5lIElJRl9CR1JBQ0UJMQorIyBkZWZpbmUgSUlGX0lHUkFDRQkyCisjIGRlZmluZSBJSUZfRkxBR1MJNAorIyBkZWZpbmUgSUlGX0FMTAkoSUlGX0JHUkFDRSB8IElJRl9JR1JBQ0UgfCBJSUZfRkxBR1MpCisKK3N0cnVjdCBkcWluZm8KKyAgeworICAgIHVfaW50NjRfdCBkcWlfYmdyYWNlOworICAgIHVfaW50NjRfdCBkcWlfaWdyYWNlOworICAgIHVfaW50MzJfdCBkcWlfZmxhZ3M7CisgICAgdV9pbnQzMl90IGRxaV92YWxpZDsKKyAgfTsKKyNlbmRpZgorCitfX0JFR0lOX0RFQ0xTCisKK2V4dGVybiBpbnQgcXVvdGFjdGwgKGludCBfX2NtZCwgY29uc3QgY2hhciAqX19zcGVjaWFsLCBpbnQgX19pZCwKKwkJICAgICBjYWRkcl90IF9fYWRkcikgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9xdW90YS5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Jhdy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9yYXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDJmNzhjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9yYXcuaApAQCAtMCwwICsxLDM5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19SQVdfSAorI2RlZmluZSBfU1lTX1JBV19ICTEKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisvKiBUaGUgbWFqb3IgZGV2aWNlIG51bWJlciBmb3IgcmF3IGRldmljZXMuICAqLworI2RlZmluZSBSQVdfTUFKT1IJMTYyCisKKy8qIGBpb2N0bCcgY29tbWFuZHMgZm9yIHJhdyBkZXZpY2VzLiAgKi8KKyNkZWZpbmUgUkFXX1NFVEJJTkQgICAgIF9JTygweGFjLCAwKQorI2RlZmluZSBSQVdfR0VUQklORCAgICAgX0lPKDB4YWMsIDEpCisKK3N0cnVjdCByYXdfY29uZmlnX3JlcXVlc3QKK3sKKyAgaW50IHJhd19taW5vcjsKKyAgdWludDY0X3QgYmxvY2tfbWFqb3I7CisgIHVpbnQ2NF90IGJsb2NrX21pbm9yOworfTsKKworI2VuZGlmIC8qIHN5cy9yYXcuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9yZWJvb3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcmVib290LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE3MTljNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcmVib290LmgKQEAgLTAsMCArMSw0OSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBUaGlzIGZpbGUgc2hvdWxkIGRlZmluZSBSQl8qIG1hY3JvcyB0byBiZSB1c2VkIGFzIGZsYWcKKyAgIGJpdHMgaW4gdGhlIGFyZ3VtZW50IHRvIHRoZSBgcmVib290JyBzeXN0ZW0gY2FsbC4gICovCisKKyNpZm5kZWYgX1NZU19SRUJPT1RfSAorI2RlZmluZSBfU1lTX1JFQk9PVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIFBlcmZvcm0gYSBoYXJkIHJlc2V0IG5vdy4gICovCisjZGVmaW5lIFJCX0FVVE9CT09UCTB4MDEyMzQ1NjcKKworLyogSGFsdCB0aGUgc3lzdGVtLiAgKi8KKyNkZWZpbmUgUkJfSEFMVF9TWVNURU0JMHhjZGVmMDEyMworCisvKiBFbmFibGUgcmVib290IHVzaW5nIEN0cmwtQWx0LURlbGV0ZSBrZXlzdHJva2UuICAqLworI2RlZmluZSBSQl9FTkFCTEVfQ0FECTB4ODlhYmNkZWYKKworLyogRGlzYWJsZSByZWJvb3QgdXNpbmcgQ3RybC1BbHQtRGVsZXRlIGtleXN0cm9rZS4gICovCisjZGVmaW5lIFJCX0RJU0FCTEVfQ0FECTAKKworLyogU3RvcCBzeXN0ZW0gYW5kIHN3aXRjaCBwb3dlciBvZmYgaWYgcG9zc2libGUuICAqLworI2RlZmluZSBSQl9QT1dFUl9PRkYJMHg0MzIxZmVkYworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJlYm9vdCBvciBoYWx0IHRoZSBzeXN0ZW0uICAqLworZXh0ZXJuIGludCByZWJvb3QgKGludCBfX2hvd3RvKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogX1NZU19SRUJPT1RfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9yZWcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiNzFhMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcmVnLmgKQEAgLTAsMCArMSw3OSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfUkVHX0gKKyNkZWZpbmUgX1NZU19SRUdfSAkxCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisKKyNpZiBfX1dPUkRTSVpFID09IDY0CisvKiBJbmRleCBpbnRvIGFuIGFycmF5IG9mIDggYnl0ZSBsb25ncyByZXR1cm5lZCBmcm9tIHB0cmFjZSBmb3IKKyAgIGxvY2F0aW9uIG9mIHRoZSB1c2Vycycgc3RvcmVkIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMuICAqLworCisjIGRlZmluZSBSMTUJMAorIyBkZWZpbmUgUjE0CTEKKyMgZGVmaW5lIFIxMwkyCisjIGRlZmluZSBSMTIJMworIyBkZWZpbmUgUkJQCTQKKyMgZGVmaW5lIFJCWAk1CisjIGRlZmluZSBSMTEJNgorIyBkZWZpbmUgUjEwCTcKKyMgZGVmaW5lIFI5CTgKKyMgZGVmaW5lIFI4CTkKKyMgZGVmaW5lIFJBWAkxMAorIyBkZWZpbmUgUkNYCTExCisjIGRlZmluZSBSRFgJMTIKKyMgZGVmaW5lIFJTSQkxMworIyBkZWZpbmUgUkRJCTE0CisjIGRlZmluZSBPUklHX1JBWCAxNQorIyBkZWZpbmUgUklQCTE2CisjIGRlZmluZSBDUwkxNworIyBkZWZpbmUgRUZMQUdTCTE4CisjIGRlZmluZSBSU1AJMTkKKyMgZGVmaW5lIFNTCTIwCisjIGRlZmluZSBGU19CQVNFIDIxCisjIGRlZmluZSBHU19CQVNFIDIyCisjIGRlZmluZSBEUwkyMworIyBkZWZpbmUgRVMJMjQKKyMgZGVmaW5lIEZTCTI1CisjIGRlZmluZSBHUwkyNgorI2Vsc2UKKworLyogSW5kZXggaW50byBhbiBhcnJheSBvZiA0IGJ5dGUgaW50ZWdlcnMgcmV0dXJuZWQgZnJvbSBwdHJhY2UgZm9yCisgKiBsb2NhdGlvbiBvZiB0aGUgdXNlcnMnIHN0b3JlZCBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzLiAqLworCisjIGRlZmluZSBFQlggMAorIyBkZWZpbmUgRUNYIDEKKyMgZGVmaW5lIEVEWCAyCisjIGRlZmluZSBFU0kgMworIyBkZWZpbmUgRURJIDQKKyMgZGVmaW5lIEVCUCA1CisjIGRlZmluZSBFQVggNgorIyBkZWZpbmUgRFMgNworIyBkZWZpbmUgRVMgOAorIyBkZWZpbmUgRlMgOQorIyBkZWZpbmUgR1MgMTAKKyMgZGVmaW5lIE9SSUdfRUFYIDExCisjIGRlZmluZSBFSVAgMTIKKyMgZGVmaW5lIENTICAxMworIyBkZWZpbmUgRUZMIDE0CisjIGRlZmluZSBVRVNQIDE1CisjIGRlZmluZSBTUyAgIDE2CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Jlc291cmNlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Jlc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxMjc0MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvcmVzb3VyY2UuaApAQCAtMCwwICsxLDEwMyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkyLDk0LDE5OTYtMjAwMCwyMDAyLDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19SRVNPVVJDRV9ICisjZGVmaW5lCV9TWVNfUkVTT1VSQ0VfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVmaW5pdGlvbnMgb2Ygc3RydWN0dXJlcyBhbmQgYml0IHZhbHVlcy4gICovCisjaW5jbHVkZSA8Yml0cy9yZXNvdXJjZS5oPgorCisjaWZuZGVmIF9faWRfdF9kZWZpbmVkCit0eXBlZGVmIF9faWRfdCBpZF90OworIyBkZWZpbmUgX19pZF90X2RlZmluZWQKKyNlbmRpZgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoZSBYL09wZW4gc3RhbmRhcmQgZGVmaW5lcyB0aGF0IGFsbCB0aGUgZnVuY3Rpb25zIGJlbG93IG11c3QgdXNlCisgICBgaW50JyBhcyB0aGUgdHlwZSBmb3IgdGhlIGZpcnN0IGFyZ3VtZW50LiAgV2hlbiB3ZSBhcmUgY29tcGlsaW5nIHdpdGgKKyAgIEdOVSBleHRlbnNpb25zIHdlIGNoYW5nZSB0aGlzIHNsaWdodGx5IHRvIHByb3ZpZGUgYmV0dGVyIGVycm9yCisgICBjaGVja2luZy4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9HTlUgJiYgIWRlZmluZWQgX19jcGx1c3BsdXMKK3R5cGVkZWYgZW51bSBfX3JsaW1pdF9yZXNvdXJjZSBfX3JsaW1pdF9yZXNvdXJjZV90OwordHlwZWRlZiBlbnVtIF9fcnVzYWdlX3dobyBfX3J1c2FnZV93aG9fdDsKK3R5cGVkZWYgZW51bSBfX3ByaW9yaXR5X3doaWNoIF9fcHJpb3JpdHlfd2hpY2hfdDsKKyNlbHNlCit0eXBlZGVmIGludCBfX3JsaW1pdF9yZXNvdXJjZV90OwordHlwZWRlZiBpbnQgX19ydXNhZ2Vfd2hvX3Q7Cit0eXBlZGVmIGludCBfX3ByaW9yaXR5X3doaWNoX3Q7CisjZW5kaWYKKworLyogUHV0IHRoZSBzb2Z0IGFuZCBoYXJkIGxpbWl0cyBmb3IgUkVTT1VSQ0UgaW4gKlJMSU1JVFMuCisgICBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgLTEgaWYgbm90IChhbmQgc2V0cyBlcnJubykuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IGdldHJsaW1pdCAoX19ybGltaXRfcmVzb3VyY2VfdCBfX3Jlc291cmNlLAorCQkgICAgICBzdHJ1Y3QgcmxpbWl0ICpfX3JsaW1pdHMpIF9fVEhST1c7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoZ2V0cmxpbWl0LCAoX19ybGltaXRfcmVzb3VyY2VfdCBfX3Jlc291cmNlLAorCQkJCSAgICAgICBzdHJ1Y3QgcmxpbWl0ICpfX3JsaW1pdHMpLCBnZXRybGltaXQ2NCk7CisjIGVsc2UKKyMgIGRlZmluZSBnZXRybGltaXQgZ2V0cmxpbWl0NjQKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IGdldHJsaW1pdDY0IChfX3JsaW1pdF9yZXNvdXJjZV90IF9fcmVzb3VyY2UsCisJCQlzdHJ1Y3QgcmxpbWl0NjQgKl9fcmxpbWl0cykgX19USFJPVzsKKyNlbmRpZgorCisvKiBTZXQgdGhlIHNvZnQgYW5kIGhhcmQgbGltaXRzIGZvciBSRVNPVVJDRSB0byAqUkxJTUlUUy4KKyAgIE9ubHkgdGhlIHN1cGVyLXVzZXIgY2FuIGluY3JlYXNlIGhhcmQgbGltaXRzLgorICAgUmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bCwgLTEgaWYgbm90IChhbmQgc2V0cyBlcnJubykuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IHNldHJsaW1pdCAoX19ybGltaXRfcmVzb3VyY2VfdCBfX3Jlc291cmNlLAorCQkgICAgICBfX2NvbnN0IHN0cnVjdCBybGltaXQgKl9fcmxpbWl0cykgX19USFJPVzsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChzZXRybGltaXQsIChfX3JsaW1pdF9yZXNvdXJjZV90IF9fcmVzb3VyY2UsCisJCQkJICAgICAgIF9fY29uc3Qgc3RydWN0IHJsaW1pdCAqX19ybGltaXRzKSwKKwkJCSAgIHNldHJsaW1pdDY0KTsKKyMgZWxzZQorIyAgZGVmaW5lIHNldHJsaW1pdCBzZXRybGltaXQ2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgc2V0cmxpbWl0NjQgKF9fcmxpbWl0X3Jlc291cmNlX3QgX19yZXNvdXJjZSwKKwkJCV9fY29uc3Qgc3RydWN0IHJsaW1pdDY0ICpfX3JsaW1pdHMpIF9fVEhST1c7CisjZW5kaWYKKworLyogUmV0dXJuIHJlc291cmNlIHVzYWdlIGluZm9ybWF0aW9uIG9uIHByb2Nlc3MgaW5kaWNhdGVkIGJ5IFdITworICAgYW5kIHB1dCBpdCBpbiAqVVNBR0UuICBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIC0xIGZvciBmYWlsdXJlLiAgKi8KK2V4dGVybiBpbnQgZ2V0cnVzYWdlIChfX3J1c2FnZV93aG9fdCBfX3dobywgc3RydWN0IHJ1c2FnZSAqX191c2FnZSkgX19USFJPVzsKKworLyogUmV0dXJuIHRoZSBoaWdoZXN0IHByaW9yaXR5IG9mIGFueSBwcm9jZXNzIHNwZWNpZmllZCBieSBXSElDSCBhbmQgV0hPCisgICAoc2VlIGFib3ZlKTsgaWYgV0hPIGlzIHplcm8sIHRoZSBjdXJyZW50IHByb2Nlc3MsIHByb2Nlc3MgZ3JvdXAsIG9yIHVzZXIKKyAgIChhcyBzcGVjaWZpZWQgYnkgV0hPKSBpcyB1c2VkLiAgQSBsb3dlciBwcmlvcml0eSBudW1iZXIgbWVhbnMgaGlnaGVyCisgICBwcmlvcml0eS4gIFByaW9yaXRpZXMgcmFuZ2UgZnJvbSBQUklPX01JTiB0byBQUklPX01BWCAoYWJvdmUpLiAgKi8KK2V4dGVybiBpbnQgZ2V0cHJpb3JpdHkgKF9fcHJpb3JpdHlfd2hpY2hfdCBfX3doaWNoLCBpZF90IF9fd2hvKSBfX1RIUk9XOworCisvKiBTZXQgdGhlIHByaW9yaXR5IG9mIGFsbCBwcm9jZXNzZXMgc3BlY2lmaWVkIGJ5IFdISUNIIGFuZCBXSE8gKHNlZSBhYm92ZSkKKyAgIHRvIFBSSU8uICBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgc2V0cHJpb3JpdHkgKF9fcHJpb3JpdHlfd2hpY2hfdCBfX3doaWNoLCBpZF90IF9fd2hvLCBpbnQgX19wcmlvKQorICAgICBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3lzL3Jlc291cmNlLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3NlbGVjdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zZWxlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2YyYjNkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zZWxlY3QuaApAQCAtMCwwICsxLDEzNCBAQAorLyogYGZkX3NldCcgdHlwZSBhbmQgcmVsYXRlZCBtYWNyb3MsIGFuZCBgc2VsZWN0Jy9gcHNlbGVjdCcgZGVjbGFyYXRpb25zLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDMsIDIwMDksIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCVBPU0lYIDEwMDMuMWc6IDYuMiBTZWxlY3QgZnJvbSBGaWxlIERlc2NyaXB0b3IgU2V0cyA8c3lzL3NlbGVjdC5oPiAgKi8KKworI2lmbmRlZiBfU1lTX1NFTEVDVF9ICisjZGVmaW5lIF9TWVNfU0VMRUNUX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogR2V0IGRlZmluaXRpb24gb2YgbmVlZGVkIGJhc2ljIHR5cGVzLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKy8qIEdldCBfX0ZEXyogZGVmaW5pdGlvbnMuICAqLworI2luY2x1ZGUgPGJpdHMvc2VsZWN0Lmg+CisKKy8qIEdldCBfX3NpZ3NldF90LiAgKi8KKyNpbmNsdWRlIDxiaXRzL3NpZ3NldC5oPgorCisjaWZuZGVmIF9fc2lnc2V0X3RfZGVmaW5lZAorIyBkZWZpbmUgX19zaWdzZXRfdF9kZWZpbmVkCit0eXBlZGVmIF9fc2lnc2V0X3Qgc2lnc2V0X3Q7CisjZW5kaWYKKworLyogR2V0IGRlZmluaXRpb24gb2YgdGltZXIgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmVzLiAgKi8KKyNkZWZpbmUgX19uZWVkX3RpbWVfdAorI2RlZmluZSBfX25lZWRfdGltZXNwZWMKKyNpbmNsdWRlIDx0aW1lLmg+CisjZGVmaW5lIF9fbmVlZF90aW1ldmFsCisjaW5jbHVkZSA8Yml0cy90aW1lLmg+CisKKyNpZm5kZWYgX19zdXNlY29uZHNfdF9kZWZpbmVkCit0eXBlZGVmIF9fc3VzZWNvbmRzX3Qgc3VzZWNvbmRzX3Q7CisjIGRlZmluZSBfX3N1c2Vjb25kc190X2RlZmluZWQKKyNlbmRpZgorCisKKy8qIFRoZSBmZF9zZXQgbWVtYmVyIGlzIHJlcXVpcmVkIHRvIGJlIGFuIGFycmF5IG9mIGxvbmdzLiAgKi8KK3R5cGVkZWYgbG9uZyBpbnQgX19mZF9tYXNrOworCisvKiBTb21lIHZlcnNpb25zIG9mIDxsaW51eC9wb3NpeF90eXBlcy5oPiBkZWZpbmUgdGhpcyBtYWNyb3MuICAqLworI3VuZGVmCV9fTkZEQklUUworLyogSXQncyBlYXNpZXIgdG8gYXNzdW1lIDgtYml0IGJ5dGVzIHRoYW4gdG8gZ2V0IENIQVJfQklULiAgKi8KKyNkZWZpbmUgX19ORkRCSVRTCSg4ICogKGludCkgc2l6ZW9mIChfX2ZkX21hc2spKQorI2RlZmluZQlfX0ZEX0VMVChkKQkoKGQpIC8gX19ORkRCSVRTKQorI2RlZmluZQlfX0ZEX01BU0soZCkJKChfX2ZkX21hc2spIDEgPDwgKChkKSAlIF9fTkZEQklUUykpCisKKy8qIGZkX3NldCBmb3Igc2VsZWN0IGFuZCBwc2VsZWN0LiAgKi8KK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICAvKiBYUEc0LjIgcmVxdWlyZXMgdGhpcyBtZW1iZXIgbmFtZS4gIE90aGVyd2lzZSBhdm9pZCB0aGUgbmFtZQorICAgICAgIGZyb20gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICAqLworI2lmZGVmIF9fVVNFX1hPUEVOCisgICAgX19mZF9tYXNrIGZkc19iaXRzW19fRkRfU0VUU0laRSAvIF9fTkZEQklUU107CisjIGRlZmluZSBfX0ZEU19CSVRTKHNldCkgKChzZXQpLT5mZHNfYml0cykKKyNlbHNlCisgICAgX19mZF9tYXNrIF9fZmRzX2JpdHNbX19GRF9TRVRTSVpFIC8gX19ORkRCSVRTXTsKKyMgZGVmaW5lIF9fRkRTX0JJVFMoc2V0KSAoKHNldCktPl9fZmRzX2JpdHMpCisjZW5kaWYKKyAgfSBmZF9zZXQ7CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgaW4gYGZkX3NldCcuICAqLworI2RlZmluZQlGRF9TRVRTSVpFCQlfX0ZEX1NFVFNJWkUKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIFNvbWV0aW1lcyB0aGUgZmRfc2V0IG1lbWJlciBpcyBhc3N1bWVkIHRvIGhhdmUgdGhpcyB0eXBlLiAgKi8KK3R5cGVkZWYgX19mZF9tYXNrIGZkX21hc2s7CisKKy8qIE51bWJlciBvZiBiaXRzIHBlciB3b3JkIG9mIGBmZF9zZXQnIChzb21lIGNvZGUgYXNzdW1lcyB0aGlzIGlzIDMyKS4gICovCisjIGRlZmluZSBORkRCSVRTCQlfX05GREJJVFMKKyNlbmRpZgorCisKKy8qIEFjY2VzcyBtYWNyb3MgZm9yIGBmZF9zZXQnLiAgKi8KKyNkZWZpbmUJRkRfU0VUKGZkLCBmZHNldHApCV9fRkRfU0VUIChmZCwgZmRzZXRwKQorI2RlZmluZQlGRF9DTFIoZmQsIGZkc2V0cCkJX19GRF9DTFIgKGZkLCBmZHNldHApCisjZGVmaW5lCUZEX0lTU0VUKGZkLCBmZHNldHApCV9fRkRfSVNTRVQgKGZkLCBmZHNldHApCisjZGVmaW5lCUZEX1pFUk8oZmRzZXRwKQkJX19GRF9aRVJPIChmZHNldHApCisKKworX19CRUdJTl9ERUNMUworCisvKiBDaGVjayB0aGUgZmlyc3QgTkZEUyBkZXNjcmlwdG9ycyBlYWNoIGluIFJFQURGRFMgKGlmIG5vdCBOVUxMKSBmb3IgcmVhZAorICAgcmVhZGluZXNzLCBpbiBXUklURUZEUyAoaWYgbm90IE5VTEwpIGZvciB3cml0ZSByZWFkaW5lc3MsIGFuZCBpbiBFWENFUFRGRFMKKyAgIChpZiBub3QgTlVMTCkgZm9yIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbnMuICBJZiBUSU1FT1VUIGlzIG5vdCBOVUxMLCB0aW1lIG91dAorICAgYWZ0ZXIgd2FpdGluZyB0aGUgaW50ZXJ2YWwgc3BlY2lmaWVkIHRoZXJlaW4uICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVhZHkKKyAgIGRlc2NyaXB0b3JzLCBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgc2VsZWN0IChpbnQgX19uZmRzLCBmZF9zZXQgKl9fcmVzdHJpY3QgX19yZWFkZmRzLAorCQkgICBmZF9zZXQgKl9fcmVzdHJpY3QgX193cml0ZWZkcywKKwkJICAgZmRfc2V0ICpfX3Jlc3RyaWN0IF9fZXhjZXB0ZmRzLAorCQkgICBzdHJ1Y3QgdGltZXZhbCAqX19yZXN0cmljdCBfX3RpbWVvdXQpOworCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogU2FtZSBhcyBhYm92ZSBvbmx5IHRoYXQgdGhlIFRJTUVPVVQgdmFsdWUgaXMgZ2l2ZW4gd2l0aCBoaWdoZXIKKyAgIHJlc29sdXRpb24gYW5kIGEgc2lnbWFzayB3aGljaCBpcyBiZWVuIHNldCB0ZW1wb3JhcmlseS4gIFRoaXMgdmVyc2lvbgorICAgc2hvdWxkIGJlIHVzZWQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwc2VsZWN0IChpbnQgX19uZmRzLCBmZF9zZXQgKl9fcmVzdHJpY3QgX19yZWFkZmRzLAorCQkgICAgZmRfc2V0ICpfX3Jlc3RyaWN0IF9fd3JpdGVmZHMsCisJCSAgICBmZF9zZXQgKl9fcmVzdHJpY3QgX19leGNlcHRmZHMsCisJCSAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVzdHJpY3QgX190aW1lb3V0LAorCQkgICAgY29uc3QgX19zaWdzZXRfdCAqX19yZXN0cmljdCBfX3NpZ21hc2spOworI2VuZGlmCisKKworLyogRGVmaW5lIHNvbWUgaW5saW5lcyBoZWxwaW5nIHRvIGNhdGNoIGNvbW1vbiBwcm9ibGVtcy4gICovCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDAgJiYgZGVmaW5lZCBfX0dOVUNfXworIyBpbmNsdWRlIDxiaXRzL3NlbGVjdDIuaD4KKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3NlbGVjdC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3NlbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGE1N2ZjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zZW0uaApAQCAtMCwwICsxLDY5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMCwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NFTV9ICisjZGVmaW5lIF9TWVNfU0VNX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2RlZmluZSBfX25lZWRfc2l6ZV90CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIEdldCBjb21tb24gZGVmaW5pdGlvbiBvZiBTeXN0ZW0gViBzdHlsZSBJUEMuICAqLworI2luY2x1ZGUgPHN5cy9pcGMuaD4KKworLyogR2V0IHN5c3RlbSBkZXBlbmRlbnQgZGVmaW5pdGlvbiBvZiBgc3RydWN0IHNlbWlkX2RzJyBhbmQgbW9yZS4gICovCisjaW5jbHVkZSA8Yml0cy9zZW0uaD4KKworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgX19uZWVkX3RpbWVzcGVjCisjIGluY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIFN5c3RlbSBWIHN0eWxlIElQQyBmdW5jdGlvbnMgaW1wbGVtZW50IGEgc2VtYXBob3JlCisgICBoYW5kbGluZy4gIFRoZSBkZWZpbml0aW9uIGlzIGZvdW5kIGluIFhQRzIuICAqLworCisvKiBTdHJ1Y3R1cmUgdXNlZCBmb3IgYXJndW1lbnQgdG8gYHNlbW9wJyB0byBkZXNjcmliZSBvcGVyYXRpb25zLiAgKi8KK3N0cnVjdCBzZW1idWYKK3sKKyAgdW5zaWduZWQgc2hvcnQgaW50IHNlbV9udW07CS8qIHNlbWFwaG9yZSBudW1iZXIgKi8KKyAgc2hvcnQgaW50IHNlbV9vcDsJCS8qIHNlbWFwaG9yZSBvcGVyYXRpb24gKi8KKyAgc2hvcnQgaW50IHNlbV9mbGc7CQkvKiBvcGVyYXRpb24gZmxhZyAqLworfTsKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFNlbWFwaG9yZSBjb250cm9sIG9wZXJhdGlvbi4gICovCitleHRlcm4gaW50IHNlbWN0bCAoaW50IF9fc2VtaWQsIGludCBfX3NlbW51bSwgaW50IF9fY21kLCAuLi4pIF9fVEhST1c7CisKKy8qIEdldCBzZW1hcGhvcmUuICAqLworZXh0ZXJuIGludCBzZW1nZXQgKGtleV90IF9fa2V5LCBpbnQgX19uc2VtcywgaW50IF9fc2VtZmxnKSBfX1RIUk9XOworCisvKiBPcGVyYXRlIG9uIHNlbWFwaG9yZS4gICovCitleHRlcm4gaW50IHNlbW9wIChpbnQgX19zZW1pZCwgc3RydWN0IHNlbWJ1ZiAqX19zb3BzLCBzaXplX3QgX19uc29wcykgX19USFJPVzsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogT3BlcmF0ZSBvbiBzZW1hcGhvcmUgd2l0aCB0aW1lb3V0LiAgKi8KK2V4dGVybiBpbnQgc2VtdGltZWRvcCAoaW50IF9fc2VtaWQsIHN0cnVjdCBzZW1idWYgKl9fc29wcywgc2l6ZV90IF9fbnNvcHMsCisJCSAgICAgICBfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX190aW1lb3V0KSBfX1RIUk9XOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvc2VtLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc2VuZGZpbGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc2VuZGZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzEzNjdiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zZW5kZmlsZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIHNlbmRmaWxlIC0tIGNvcHkgZGF0YSBkaXJlY3RseSBmcm9tIG9uZSBmaWxlIGRlc2NyaXB0b3IgdG8gYW5vdGhlcgorICAgQ29weXJpZ2h0IChDKSAxOTk4LDk5LDAxLDIwMDIsMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NFTkRGSUxFX0gKKyNkZWZpbmUgX1NZU19TRU5ERklMRV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogU2VuZCB1cCB0byBDT1VOVCBieXRlcyBmcm9tIGZpbGUgYXNzb2NpYXRlZCB3aXRoIElOX0ZEIHN0YXJ0aW5nIGF0CisgICAqT0ZGU0VUIHRvIGRlc2NyaXB0b3IgT1VUX0ZELiAgU2V0ICpPRkZTRVQgdG8gdGhlIElOX0ZEJ3MgZmlsZSBwb3NpdGlvbgorICAgZm9sbG93aW5nIHRoZSByZWFkIGJ5dGVzLiAgSWYgT0ZGU0VUIGlzIGEgbnVsbCBwb2ludGVyLCB1c2UgdGhlIG5vcm1hbAorICAgZmlsZSBwb3NpdGlvbiBpbnN0ZWFkLiAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygd3JpdHRlbiBieXRlcywgb3IgLTEgaW4KKyAgIGNhc2Ugb2YgZXJyb3IuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gc3NpemVfdCBzZW5kZmlsZSAoaW50IF9fb3V0X2ZkLCBpbnQgX19pbl9mZCwgb2ZmX3QgKl9fb2Zmc2V0LAorCQkJIHNpemVfdCBfX2NvdW50KSBfX1RIUk9XOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChzZW5kZmlsZSwKKwkJCSAgICAgICAoaW50IF9fb3V0X2ZkLCBpbnQgX19pbl9mZCwgX19vZmY2NF90ICpfX29mZnNldCwKKwkJCQlzaXplX3QgX19jb3VudCksIHNlbmRmaWxlNjQpOworIyBlbHNlCisjICBkZWZpbmUgc2VuZGZpbGUgc2VuZGZpbGU2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBzc2l6ZV90IHNlbmRmaWxlNjQgKGludCBfX291dF9mZCwgaW50IF9faW5fZmQsIF9fb2ZmNjRfdCAqX19vZmZzZXQsCisJCQkgICBzaXplX3QgX19jb3VudCkgX19USFJPVzsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3lzL3NlbmRmaWxlLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc2htLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3NobS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NmNlNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3NobS5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU0hNX0gKKyNkZWZpbmUgX1NZU19TSE1fSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogR2V0IGNvbW1vbiBkZWZpbml0aW9uIG9mIFN5c3RlbSBWIHN0eWxlIElQQy4gICovCisjaW5jbHVkZSA8c3lzL2lwYy5oPgorCisvKiBHZXQgc3lzdGVtIGRlcGVuZGVudCBkZWZpbml0aW9uIG9mIGBzdHJ1Y3Qgc2htaWRfZHMnIGFuZCBtb3JlLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3NobS5oPgorCisvKiBEZWZpbmUgdHlwZXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkLiAgKi8KKyNkZWZpbmUgX19uZWVkX3RpbWVfdAorI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmZGVmIF9fVVNFX1hPUEVOCisjIGlmbmRlZiBfX3BpZF90X2RlZmluZWQKK3R5cGVkZWYgX19waWRfdCBwaWRfdDsKKyMgIGRlZmluZSBfX3BpZF90X2RlZmluZWQKKyMgZW5kaWYKKyNlbmRpZgkvKiBYL09wZW4gKi8KKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoZSBmb2xsb3dpbmcgU3lzdGVtIFYgc3R5bGUgSVBDIGZ1bmN0aW9ucyBpbXBsZW1lbnQgYSBzaGFyZWQgbWVtb3J5CisgICBmYWNpbGl0eS4gIFRoZSBkZWZpbml0aW9uIGlzIGZvdW5kIGluIFhQRzQuMi4gICovCisKKy8qIFNoYXJlZCBtZW1vcnkgY29udHJvbCBvcGVyYXRpb24uICAqLworZXh0ZXJuIGludCBzaG1jdGwgKGludCBfX3NobWlkLCBpbnQgX19jbWQsIHN0cnVjdCBzaG1pZF9kcyAqX19idWYpIF9fVEhST1c7CisKKy8qIEdldCBzaGFyZWQgbWVtb3J5IHNlZ21lbnQuICAqLworZXh0ZXJuIGludCBzaG1nZXQgKGtleV90IF9fa2V5LCBzaXplX3QgX19zaXplLCBpbnQgX19zaG1mbGcpIF9fVEhST1c7CisKKy8qIEF0dGFjaCBzaGFyZWQgbWVtb3J5IHNlZ21lbnQuICAqLworZXh0ZXJuIHZvaWQgKnNobWF0IChpbnQgX19zaG1pZCwgX19jb25zdCB2b2lkICpfX3NobWFkZHIsIGludCBfX3NobWZsZykKKyAgICAgX19USFJPVzsKKworLyogRGV0YWNoIHNoYXJlZCBtZW1vcnkgc2VnbWVudC4gICovCitleHRlcm4gaW50IHNobWR0IChfX2NvbnN0IHZvaWQgKl9fc2htYWRkcikgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9zaG0uaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zaWduYWwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU2MDJkYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc2lnbmFsLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPHNpZ25hbC5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zaWduYWxmZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zaWduYWxmZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYjI3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3NpZ25hbGZkLmgKQEAgLTAsMCArMSw2NiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfU0lHTkFMRkRfSAorI2RlZmluZQlfU1lTX1NJR05BTEZEX0gJMQorCisjZGVmaW5lIF9fbmVlZF9zaWdzZXRfdAorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisKK3N0cnVjdCBzaWduYWxmZF9zaWdpbmZvCit7CisgIHVpbnQzMl90IHNzaV9zaWdubzsKKyAgaW50MzJfdCBzc2lfZXJybm87CisgIGludDMyX3Qgc3NpX2NvZGU7CisgIHVpbnQzMl90IHNzaV9waWQ7CisgIHVpbnQzMl90IHNzaV91aWQ7CisgIGludDMyX3Qgc3NpX2ZkOworICB1aW50MzJfdCBzc2lfdGlkOworICB1aW50MzJfdCBzc2lfYmFuZDsKKyAgdWludDMyX3Qgc3NpX292ZXJydW47CisgIHVpbnQzMl90IHNzaV90cmFwbm87CisgIGludDMyX3Qgc3NpX3N0YXR1czsKKyAgaW50MzJfdCBzc2lfaW50OworICB1aW50NjRfdCBzc2lfcHRyOworICB1aW50NjRfdCBzc2lfdXRpbWU7CisgIHVpbnQ2NF90IHNzaV9zdGltZTsKKyAgdWludDY0X3Qgc3NpX2FkZHI7CisgIHVpbnQ4X3QgX19wYWRbNDhdOworfTsKKworLyogRmxhZ3MgZm9yIHNpZ25hbGZkLiAgKi8KK2VudW0KKyAgeworICAgIFNGRF9DTE9FWEVDID0gMDIwMDAwMDAsCisjZGVmaW5lIFNGRF9DTE9FWEVDIFNGRF9DTE9FWEVDCisgICAgU0ZEX05PTkJMT0NLID0gMDQwMDAKKyNkZWZpbmUgU0ZEX05PTkJMT0NLIFNGRF9OT05CTE9DSworICB9OworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJlcXVlc3Qgbm90aWZpY2F0aW9uIGZvciBkZWxpdmVyeSBvZiBzaWduYWxzIGluIE1BU0sgdG8gYmUKKyAgIHBlcmZvcm1lZCB1c2luZyBkZXNjcmlwdG9yIEZELiovCitleHRlcm4gaW50IHNpZ25hbGZkIChpbnQgX19mZCwgY29uc3Qgc2lnc2V0X3QgKl9fbWFzaywgaW50IF9fZmxhZ3MpCisgIF9fVEhST1cgX19ub25udWxsICgoMikpOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3NpZ25hbGZkLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc29ja2V0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMWY1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3NvY2tldC5oCkBAIC0wLDAgKzEsMjU2IEBACisvKiBEZWNsYXJhdGlvbnMgb2Ygc29ja2V0IGNvbnN0YW50cywgdHlwZXMsIGFuZCBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTEsOTIsMTk5NC0yMDAxLDIwMDMsMjAwNSwyMDA3LDIwMDgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfU09DS0VUX0gKKyNkZWZpbmUJX1NZU19TT0NLRVRfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjZGVmaW5lCV9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpZmRlZiBfX1VTRV9HTlUKKy8qIEdldCB0aGUgX19zaWdzZXRfdCBkZWZpbml0aW9uLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy9zaWdzZXQuaD4KKyNlbmRpZgorCisKKy8qIFRoaXMgb3BlcmF0aW5nIHN5c3RlbS1zcGVjaWZpYyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBTT0NLXyosIFBGXyosCisgICBBRl8qLCBNU0dfKiwgU09MXyosIGFuZCBTT18qIGNvbnN0YW50cywgYW5kIHRoZSBgc3RydWN0IHNvY2thZGRyJywKKyAgIGBzdHJ1Y3QgbXNnaGRyJywgYW5kIGBzdHJ1Y3QgbGluZ2VyJyB0eXBlcy4gICovCisjaW5jbHVkZSA8Yml0cy9zb2NrZXQuaD4KKworI2lmZGVmIF9fVVNFX0JTRAorLyogVGhpcyBpcyB0aGUgNC4zIEJTRCBgc3RydWN0IHNvY2thZGRyJyBmb3JtYXQsIHdoaWNoIGlzIHVzZWQgYXMgd2lyZQorICAgZm9ybWF0IGluIHRoZSBncm90dHkgb2xkIDQuMyBgdGFsaycgcHJvdG9jb2wuICAqLworc3RydWN0IG9zb2NrYWRkcgorICB7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IHNhX2ZhbWlseTsKKyAgICB1bnNpZ25lZCBjaGFyIHNhX2RhdGFbMTRdOworICB9OworI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZgorICAgYHNodXRkb3duJy4gICovCitlbnVtCit7CisgIFNIVVRfUkQgPSAwLAkJLyogTm8gbW9yZSByZWNlcHRpb25zLiAgKi8KKyNkZWZpbmUgU0hVVF9SRAkJU0hVVF9SRAorICBTSFVUX1dSLAkJLyogTm8gbW9yZSB0cmFuc21pc3Npb25zLiAgKi8KKyNkZWZpbmUgU0hVVF9XUgkJU0hVVF9XUgorICBTSFVUX1JEV1IJCS8qIE5vIG1vcmUgcmVjZXB0aW9ucyBvciB0cmFuc21pc3Npb25zLiAgKi8KKyNkZWZpbmUgU0hVVF9SRFdSCVNIVVRfUkRXUgorfTsKKworLyogVGhpcyBpcyB0aGUgdHlwZSB3ZSB1c2UgZm9yIGdlbmVyaWMgc29ja2V0IGFkZHJlc3MgYXJndW1lbnRzLgorCisgICBXaXRoIEdDQyAyLjcgYW5kIGxhdGVyLCB0aGUgZnVua3kgdW5pb24gY2F1c2VzIHJlZGVjbGFyYXRpb25zIG9yCisgICB1c2VzIHdpdGggYW55IG9mIHRoZSBsaXN0ZWQgdHlwZXMgdG8gYmUgYWxsb3dlZCB3aXRob3V0IGNvbXBsYWludC4KKyAgIEcrKyAyLjcgZG9lcyBub3Qgc3VwcG9ydCB0cmFuc3BhcmVudCB1bmlvbnMgc28gdGhlcmUgd2Ugd2FudCB0aGUKKyAgIG9sZC1zdHlsZSBkZWNsYXJhdGlvbiwgdG9vLiAgKi8KKyNpZiBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8ICFfX0dOVUNfUFJFUkVRICgyLCA3KSB8fCAhZGVmaW5lZCBfX1VTRV9HTlUKKyMgZGVmaW5lIF9fU09DS0FERFJfQVJHCQlzdHJ1Y3Qgc29ja2FkZHIgKl9fcmVzdHJpY3QKKyMgZGVmaW5lIF9fQ09OU1RfU09DS0FERFJfQVJHCV9fY29uc3Qgc3RydWN0IHNvY2thZGRyICoKKyNlbHNlCisvKiBBZGQgbW9yZSBgc3RydWN0IHNvY2thZGRyX0FGJyB0eXBlcyBoZXJlIGFzIG5lY2Vzc2FyeS4KKyAgIFRoZXNlIGFyZSBhbGwgdGhlIG9uZXMgSSBmb3VuZCBvbiBOZXRCU0QgYW5kIExpbnV4LiAgKi8KKyMgZGVmaW5lIF9fU09DS0FERFJfQUxMVFlQRVMgXAorICBfX1NPQ0tBRERSX09ORVRZUEUgKHNvY2thZGRyKSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfYXQpIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl9heDI1KSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfZGwpIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl9lb24pIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl9pbikgXAorICBfX1NPQ0tBRERSX09ORVRZUEUgKHNvY2thZGRyX2luNikgXAorICBfX1NPQ0tBRERSX09ORVRZUEUgKHNvY2thZGRyX2luYXJwKSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfaXB4KSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfaXNvKSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfbnMpIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl91bikgXAorICBfX1NPQ0tBRERSX09ORVRZUEUgKHNvY2thZGRyX3gyNSkKKworIyBkZWZpbmUgX19TT0NLQUREUl9PTkVUWVBFKHR5cGUpIHN0cnVjdCB0eXBlICpfX3Jlc3RyaWN0IF9fIyN0eXBlIyNfXzsKK3R5cGVkZWYgdW5pb24geyBfX1NPQ0tBRERSX0FMTFRZUEVTCisJICAgICAgfSBfX1NPQ0tBRERSX0FSRyBfX2F0dHJpYnV0ZV9fICgoX190cmFuc3BhcmVudF91bmlvbl9fKSk7CisjIHVuZGVmIF9fU09DS0FERFJfT05FVFlQRQorIyBkZWZpbmUgX19TT0NLQUREUl9PTkVUWVBFKHR5cGUpIF9fY29uc3Qgc3RydWN0IHR5cGUgKl9fcmVzdHJpY3QgX18jI3R5cGUjI19fOwordHlwZWRlZiB1bmlvbiB7IF9fU09DS0FERFJfQUxMVFlQRVMKKwkgICAgICB9IF9fQ09OU1RfU09DS0FERFJfQVJHIF9fYXR0cmlidXRlX18gKChfX3RyYW5zcGFyZW50X3VuaW9uX18pKTsKKyMgdW5kZWYgX19TT0NLQUREUl9PTkVUWVBFCisjZW5kaWYKKworCisvKiBDcmVhdGUgYSBuZXcgc29ja2V0IG9mIHR5cGUgVFlQRSBpbiBkb21haW4gRE9NQUlOLCB1c2luZworICAgcHJvdG9jb2wgUFJPVE9DT0wuICBJZiBQUk9UT0NPTCBpcyB6ZXJvLCBvbmUgaXMgY2hvc2VuIGF1dG9tYXRpY2FsbHkuCisgICBSZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgbmV3IHNvY2tldCwgb3IgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IHNvY2tldCAoaW50IF9fZG9tYWluLCBpbnQgX190eXBlLCBpbnQgX19wcm90b2NvbCkgX19USFJPVzsKKworLyogQ3JlYXRlIHR3byBuZXcgc29ja2V0cywgb2YgdHlwZSBUWVBFIGluIGRvbWFpbiBET01BSU4gYW5kIHVzaW5nCisgICBwcm90b2NvbCBQUk9UT0NPTCwgd2hpY2ggYXJlIGNvbm5lY3RlZCB0byBlYWNoIG90aGVyLCBhbmQgcHV0IGZpbGUKKyAgIGRlc2NyaXB0b3JzIGZvciB0aGVtIGluIEZEU1swXSBhbmQgRkRTWzFdLiAgSWYgUFJPVE9DT0wgaXMgemVybywKKyAgIG9uZSB3aWxsIGJlIGNob3NlbiBhdXRvbWF0aWNhbGx5LiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIGludCBzb2NrZXRwYWlyIChpbnQgX19kb21haW4sIGludCBfX3R5cGUsIGludCBfX3Byb3RvY29sLAorCQkgICAgICAgaW50IF9fZmRzWzJdKSBfX1RIUk9XOworCisvKiBHaXZlIHRoZSBzb2NrZXQgRkQgdGhlIGxvY2FsIGFkZHJlc3MgQUREUiAod2hpY2ggaXMgTEVOIGJ5dGVzIGxvbmcpLiAgKi8KK2V4dGVybiBpbnQgYmluZCAoaW50IF9fZmQsIF9fQ09OU1RfU09DS0FERFJfQVJHIF9fYWRkciwgc29ja2xlbl90IF9fbGVuKQorICAgICBfX1RIUk9XOworCisvKiBQdXQgdGhlIGxvY2FsIGFkZHJlc3Mgb2YgRkQgaW50byAqQUREUiBhbmQgaXRzIGxlbmd0aCBpbiAqTEVOLiAgKi8KK2V4dGVybiBpbnQgZ2V0c29ja25hbWUgKGludCBfX2ZkLCBfX1NPQ0tBRERSX0FSRyBfX2FkZHIsCisJCQlzb2NrbGVuX3QgKl9fcmVzdHJpY3QgX19sZW4pIF9fVEhST1c7CisKKy8qIE9wZW4gYSBjb25uZWN0aW9uIG9uIHNvY2tldCBGRCB0byBwZWVyIGF0IEFERFIgKHdoaWNoIExFTiBieXRlcyBsb25nKS4KKyAgIEZvciBjb25uZWN0aW9ubGVzcyBzb2NrZXQgdHlwZXMsIGp1c3Qgc2V0IHRoZSBkZWZhdWx0IGFkZHJlc3MgdG8gc2VuZCB0bworICAgYW5kIHRoZSBvbmx5IGFkZHJlc3MgZnJvbSB3aGljaCB0byBhY2NlcHQgdHJhbnNtaXNzaW9ucy4KKyAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBjb25uZWN0IChpbnQgX19mZCwgX19DT05TVF9TT0NLQUREUl9BUkcgX19hZGRyLCBzb2NrbGVuX3QgX19sZW4pOworCisvKiBQdXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHBlZXIgY29ubmVjdGVkIHRvIHNvY2tldCBGRCBpbnRvICpBRERSCisgICAod2hpY2ggaXMgKkxFTiBieXRlcyBsb25nKSwgYW5kIGl0cyBhY3R1YWwgbGVuZ3RoIGludG8gKkxFTi4gICovCitleHRlcm4gaW50IGdldHBlZXJuYW1lIChpbnQgX19mZCwgX19TT0NLQUREUl9BUkcgX19hZGRyLAorCQkJc29ja2xlbl90ICpfX3Jlc3RyaWN0IF9fbGVuKSBfX1RIUk9XOworCisKKy8qIFNlbmQgTiBieXRlcyBvZiBCVUYgdG8gc29ja2V0IEZELiAgUmV0dXJucyB0aGUgbnVtYmVyIHNlbnQgb3IgLTEuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3Qgc2VuZCAoaW50IF9fZmQsIF9fY29uc3Qgdm9pZCAqX19idWYsIHNpemVfdCBfX24sIGludCBfX2ZsYWdzKTsKKworLyogUmVhZCBOIGJ5dGVzIGludG8gQlVGIGZyb20gc29ja2V0IEZELgorICAgUmV0dXJucyB0aGUgbnVtYmVyIHJlYWQgb3IgLTEgZm9yIGVycm9ycy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCByZWN2IChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX24sIGludCBfX2ZsYWdzKTsKKworLyogU2VuZCBOIGJ5dGVzIG9mIEJVRiBvbiBzb2NrZXQgRkQgdG8gcGVlciBhdCBhZGRyZXNzIEFERFIgKHdoaWNoIGlzCisgICBBRERSX0xFTiBieXRlcyBsb25nKS4gIFJldHVybnMgdGhlIG51bWJlciBzZW50LCBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHNlbmR0byAoaW50IF9fZmQsIF9fY29uc3Qgdm9pZCAqX19idWYsIHNpemVfdCBfX24sCisJCSAgICAgICBpbnQgX19mbGFncywgX19DT05TVF9TT0NLQUREUl9BUkcgX19hZGRyLAorCQkgICAgICAgc29ja2xlbl90IF9fYWRkcl9sZW4pOworCisvKiBSZWFkIE4gYnl0ZXMgaW50byBCVUYgdGhyb3VnaCBzb2NrZXQgRkQuCisgICBJZiBBRERSIGlzIG5vdCBOVUxMLCBmaWxsIGluICpBRERSX0xFTiBieXRlcyBvZiBpdCB3aXRoIHRoYSBhZGRyZXNzIG9mCisgICB0aGUgc2VuZGVyLCBhbmQgc3RvcmUgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBhZGRyZXNzIGluICpBRERSX0xFTi4KKyAgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xIGZvciBlcnJvcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3QgcmVjdmZyb20gKGludCBfX2ZkLCB2b2lkICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19uLAorCQkJIGludCBfX2ZsYWdzLCBfX1NPQ0tBRERSX0FSRyBfX2FkZHIsCisJCQkgc29ja2xlbl90ICpfX3Jlc3RyaWN0IF9fYWRkcl9sZW4pOworCisKKy8qIFNlbmQgYSBtZXNzYWdlIGRlc2NyaWJlZCBNRVNTQUdFIG9uIHNvY2tldCBGRC4KKyAgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBzZW50LCBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHNlbmRtc2cgKGludCBfX2ZkLCBfX2NvbnN0IHN0cnVjdCBtc2doZHIgKl9fbWVzc2FnZSwKKwkJCWludCBfX2ZsYWdzKTsKKworLyogUmVjZWl2ZSBhIG1lc3NhZ2UgYXMgZGVzY3JpYmVkIGJ5IE1FU1NBR0UgZnJvbSBzb2NrZXQgRkQuCisgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHJlY3Ztc2cgKGludCBfX2ZkLCBzdHJ1Y3QgbXNnaGRyICpfX21lc3NhZ2UsIGludCBfX2ZsYWdzKTsKKworCisvKiBQdXQgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHNvY2tldCBGRCdzIG9wdGlvbiBPUFROQU1FIGF0IHByb3RvY29sIGxldmVsIExFVkVMCisgICBpbnRvIE9QVFZBTCAod2hpY2ggaXMgKk9QVExFTiBieXRlcyBsb25nKSwgYW5kIHNldCAqT1BUTEVOIHRvIHRoZSB2YWx1ZSdzCisgICBhY3R1YWwgbGVuZ3RoLiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIGludCBnZXRzb2Nrb3B0IChpbnQgX19mZCwgaW50IF9fbGV2ZWwsIGludCBfX29wdG5hbWUsCisJCSAgICAgICB2b2lkICpfX3Jlc3RyaWN0IF9fb3B0dmFsLAorCQkgICAgICAgc29ja2xlbl90ICpfX3Jlc3RyaWN0IF9fb3B0bGVuKSBfX1RIUk9XOworCisvKiBTZXQgc29ja2V0IEZEJ3Mgb3B0aW9uIE9QVE5BTUUgYXQgcHJvdG9jb2wgbGV2ZWwgTEVWRUwKKyAgIHRvICpPUFRWQUwgKHdoaWNoIGlzIE9QVExFTiBieXRlcyBsb25nKS4KKyAgIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgc2V0c29ja29wdCAoaW50IF9fZmQsIGludCBfX2xldmVsLCBpbnQgX19vcHRuYW1lLAorCQkgICAgICAgX19jb25zdCB2b2lkICpfX29wdHZhbCwgc29ja2xlbl90IF9fb3B0bGVuKSBfX1RIUk9XOworCisKKy8qIFByZXBhcmUgdG8gYWNjZXB0IGNvbm5lY3Rpb25zIG9uIHNvY2tldCBGRC4KKyAgIE4gY29ubmVjdGlvbiByZXF1ZXN0cyB3aWxsIGJlIHF1ZXVlZCBiZWZvcmUgZnVydGhlciByZXF1ZXN0cyBhcmUgcmVmdXNlZC4KKyAgIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgbGlzdGVuIChpbnQgX19mZCwgaW50IF9fbikgX19USFJPVzsKKworLyogQXdhaXQgYSBjb25uZWN0aW9uIG9uIHNvY2tldCBGRC4KKyAgIFdoZW4gYSBjb25uZWN0aW9uIGFycml2ZXMsIG9wZW4gYSBuZXcgc29ja2V0IHRvIGNvbW11bmljYXRlIHdpdGggaXQsCisgICBzZXQgKkFERFIgKHdoaWNoIGlzICpBRERSX0xFTiBieXRlcyBsb25nKSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgY29ubmVjdGluZworICAgcGVlciBhbmQgKkFERFJfTEVOIHRvIHRoZSBhZGRyZXNzJ3MgYWN0dWFsIGxlbmd0aCwgYW5kIHJldHVybiB0aGUKKyAgIG5ldyBzb2NrZXQncyBkZXNjcmlwdG9yLCBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgYWNjZXB0IChpbnQgX19mZCwgX19TT0NLQUREUl9BUkcgX19hZGRyLAorCQkgICBzb2NrbGVuX3QgKl9fcmVzdHJpY3QgX19hZGRyX2xlbik7CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFNpbWlsYXIgdG8gJ2FjY2VwdCcgYnV0IHRha2VzIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIHRvIHNwZWNpZnkgZmxhZ3MuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBhY2NlcHQ0IChpbnQgX19mZCwgX19TT0NLQUREUl9BUkcgX19hZGRyLAorCQkgICAgc29ja2xlbl90ICpfX3Jlc3RyaWN0IF9fYWRkcl9sZW4sIGludCBfX2ZsYWdzKTsKKyNlbmRpZgorCisvKiBTaHV0IGRvd24gYWxsIG9yIHBhcnQgb2YgdGhlIGNvbm5lY3Rpb24gb3BlbiBvbiBzb2NrZXQgRkQuCisgICBIT1cgZGV0ZXJtaW5lcyB3aGF0IHRvIHNodXQgZG93bjoKKyAgICAgU0hVVF9SRCAgID0gTm8gbW9yZSByZWNlcHRpb25zOworICAgICBTSFVUX1dSICAgPSBObyBtb3JlIHRyYW5zbWlzc2lvbnM7CisgICAgIFNIVVRfUkRXUiA9IE5vIG1vcmUgcmVjZXB0aW9ucyBvciB0cmFuc21pc3Npb25zLgorICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIGludCBzaHV0ZG93biAoaW50IF9fZmQsIGludCBfX2hvdykgX19USFJPVzsKKworCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogRGV0ZXJtaW5lIHdoZXRlciBzb2NrZXQgaXMgYXQgYSBvdXQtb2YtYmFuZCBtYXJrLiAgKi8KK2V4dGVybiBpbnQgc29ja2F0bWFyayAoaW50IF9fZmQpIF9fVEhST1c7CisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfTUlTQworLyogRkRUWVBFIGlzIFNfSUZTT0NLIG9yIGFub3RoZXIgU19JRiogbWFjcm8gZGVmaW5lZCBpbiA8c3lzL3N0YXQuaD47CisgICByZXR1cm5zIDEgaWYgRkQgaXMgb3BlbiBvbiBhbiBvYmplY3Qgb2YgdGhlIGluZGljYXRlZCB0eXBlLCAwIGlmIG5vdCwKKyAgIG9yIC0xIGZvciBlcnJvcnMgKHNldHRpbmcgZXJybm8pLiAgKi8KK2V4dGVybiBpbnQgaXNmZHR5cGUgKGludCBfX2ZkLCBpbnQgX19mZHR5cGUpIF9fVEhST1c7CisjZW5kaWYKKworCisvKiBEZWZpbmUgc29tZSBtYWNyb3MgaGVscGluZyB0byBjYXRjaCBidWZmZXIgb3ZlcmZsb3dzLiAgKi8KKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUKKyMgaW5jbHVkZSA8Yml0cy9zb2NrZXQyLmg+CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9zb2NrZXQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zb2NrZXR2YXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc29ja2V0dmFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE3NzE1OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc29ja2V0dmFyLmgKQEAgLTAsMCArMSwzIEBACisvKiBUaGlzIGhlYWRlciBpcyB1c2VkIG9uIG1hbnkgc3lzdGVtcyBidXQgZm9yIEdOVSB3ZSBoYXZlIGV2ZXJ5dGhpbmcKKyAgIGFscmVhZHkgZGVmaW5lZCBpbiB0aGUgc3RhbmRhcmQgaGVhZGVyLiAgKi8KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3NvdW5kY2FyZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zb3VuZGNhcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWRlOTg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zb3VuZGNhcmQuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3N0YXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMzg5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3N0YXQuaApAQCAtMCwwICsxLDUzOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTk1LTIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJUE9TSVggU3RhbmRhcmQ6IDUuNiBGaWxlIENoYXJhY3RlcmlzdGljcwk8c3lzL3N0YXQuaD4KKyAqLworCisjaWZuZGVmCV9TWVNfU1RBVF9ICisjZGVmaW5lCV9TWVNfU1RBVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CQkvKiBGb3IgX19tb2RlX3QgYW5kIF9fZGV2X3QuICAqLworCisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksgfHwgZGVmaW5lZCBfX1VTRV9NSVNDIFwKKwkgfHwgZGVmaW5lZCBfX1VTRV9BVEZJTEUKKyMgaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKyMgIGRlZmluZSBfX25lZWRfdGltZV90CisjIGVuZGlmCisjIGlmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX0FURklMRQorIyAgZGVmaW5lIF9fbmVlZF90aW1lc3BlYworIyBlbmRpZgorIyBpbmNsdWRlIDx0aW1lLmg+CQkvKiBGb3IgdGltZV90IHJlc3AuIHRpbWVzcGVjLiAgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIFRoZSBTaW5nbGUgVW5peCBzcGVjaWZpY2F0aW9uIHNheXMgdGhhdCBzb21lIG1vcmUgdHlwZXMgYXJlCisgICBhdmFpbGFibGUgaGVyZS4gICovCisjIGlmbmRlZiBfX2Rldl90X2RlZmluZWQKK3R5cGVkZWYgX19kZXZfdCBkZXZfdDsKKyMgIGRlZmluZSBfX2Rldl90X2RlZmluZWQKKyMgZW5kaWYKKworIyBpZm5kZWYgX19naWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fZ2lkX3QgZ2lkX3Q7CisjICBkZWZpbmUgX19naWRfdF9kZWZpbmVkCisjIGVuZGlmCisKKyMgaWZuZGVmIF9faW5vX3RfZGVmaW5lZAorIyAgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX19pbm9fdCBpbm9fdDsKKyMgIGVsc2UKK3R5cGVkZWYgX19pbm82NF90IGlub190OworIyAgZW5kaWYKKyMgIGRlZmluZSBfX2lub190X2RlZmluZWQKKyMgZW5kaWYKKworIyBpZm5kZWYgX19tb2RlX3RfZGVmaW5lZAordHlwZWRlZiBfX21vZGVfdCBtb2RlX3Q7CisjICBkZWZpbmUgX19tb2RlX3RfZGVmaW5lZAorIyBlbmRpZgorCisjIGlmbmRlZiBfX25saW5rX3RfZGVmaW5lZAordHlwZWRlZiBfX25saW5rX3QgbmxpbmtfdDsKKyMgIGRlZmluZSBfX25saW5rX3RfZGVmaW5lZAorIyBlbmRpZgorCisjIGlmbmRlZiBfX29mZl90X2RlZmluZWQKKyMgIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0Cit0eXBlZGVmIF9fb2ZmX3Qgb2ZmX3Q7CisjICBlbHNlCit0eXBlZGVmIF9fb2ZmNjRfdCBvZmZfdDsKKyMgIGVuZGlmCisjICBkZWZpbmUgX19vZmZfdF9kZWZpbmVkCisjIGVuZGlmCisKKyMgaWZuZGVmIF9fdWlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3VpZF90IHVpZF90OworIyAgZGVmaW5lIF9fdWlkX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCS8qIFgvT3BlbiAqLworCisjaWZkZWYgX19VU0VfVU5JWDk4CisjIGlmbmRlZiBfX2Jsa2NudF90X2RlZmluZWQKKyMgIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0Cit0eXBlZGVmIF9fYmxrY250X3QgYmxrY250X3Q7CisjICBlbHNlCit0eXBlZGVmIF9fYmxrY250NjRfdCBibGtjbnRfdDsKKyMgIGVuZGlmCisjICBkZWZpbmUgX19ibGtjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisKKyMgaWZuZGVmIF9fYmxrc2l6ZV90X2RlZmluZWQKK3R5cGVkZWYgX19ibGtzaXplX3QgYmxrc2l6ZV90OworIyAgZGVmaW5lIF9fYmxrc2l6ZV90X2RlZmluZWQKKyMgZW5kaWYKKyNlbmRpZgkvKiBVbml4OTggKi8KKworX19CRUdJTl9ERUNMUworCisjaW5jbHVkZSA8Yml0cy9zdGF0Lmg+CisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorIyBkZWZpbmUgU19JRk1UCQlfX1NfSUZNVAorIyBkZWZpbmUgU19JRkRJUglfX1NfSUZESVIKKyMgZGVmaW5lIFNfSUZDSFIJX19TX0lGQ0hSCisjIGRlZmluZSBTX0lGQkxLCV9fU19JRkJMSworIyBkZWZpbmUgU19JRlJFRwlfX1NfSUZSRUcKKyMgaWZkZWYgX19TX0lGSUZPCisjICBkZWZpbmUgU19JRklGTwlfX1NfSUZJRk8KKyMgZW5kaWYKKyMgaWZkZWYgX19TX0lGTE5LCisjICBkZWZpbmUgU19JRkxOSwlfX1NfSUZMTksKKyMgZW5kaWYKKyMgaWYgKGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OCkgXAorICAgICAmJiBkZWZpbmVkIF9fU19JRlNPQ0sKKyMgIGRlZmluZSBTX0lGU09DSwlfX1NfSUZTT0NLCisjIGVuZGlmCisjZW5kaWYKKworLyogVGVzdCBtYWNyb3MgZm9yIGZpbGUgdHlwZXMuCSovCisKKyNkZWZpbmUJX19TX0lTVFlQRShtb2RlLCBtYXNrKQkoKChtb2RlKSAmIF9fU19JRk1UKSA9PSAobWFzaykpCisKKyNkZWZpbmUJU19JU0RJUihtb2RlKQkgX19TX0lTVFlQRSgobW9kZSksIF9fU19JRkRJUikKKyNkZWZpbmUJU19JU0NIUihtb2RlKQkgX19TX0lTVFlQRSgobW9kZSksIF9fU19JRkNIUikKKyNkZWZpbmUJU19JU0JMSyhtb2RlKQkgX19TX0lTVFlQRSgobW9kZSksIF9fU19JRkJMSykKKyNkZWZpbmUJU19JU1JFRyhtb2RlKQkgX19TX0lTVFlQRSgobW9kZSksIF9fU19JRlJFRykKKyNpZmRlZiBfX1NfSUZJRk8KKyMgZGVmaW5lIFNfSVNGSUZPKG1vZGUpCSBfX1NfSVNUWVBFKChtb2RlKSwgX19TX0lGSUZPKQorI2VuZGlmCisjaWZkZWYgX19TX0lGTE5LCisjIGRlZmluZSBTX0lTTE5LKG1vZGUpCSBfX1NfSVNUWVBFKChtb2RlKSwgX19TX0lGTE5LKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCAmJiAhZGVmaW5lZCBfX1NfSUZMTksKKyMgZGVmaW5lIFNfSVNMTksobW9kZSkgIDAKKyNlbmRpZgorCisjaWYgKGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfVU5JWDk4IHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySykgXAorICAgICYmIGRlZmluZWQgX19TX0lGU09DSworIyBkZWZpbmUgU19JU1NPQ0sobW9kZSkgX19TX0lTVFlQRSgobW9kZSksIF9fU19JRlNPQ0spCisjZWxpZiBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKyMgZGVmaW5lIFNfSVNTT0NLKG1vZGUpIDAKKyNlbmRpZgorCisvKiBUaGVzZSBhcmUgZnJvbSBQT1NJWC4xYi4gIElmIHRoZSBvYmplY3RzIGFyZSBub3QgaW1wbGVtZW50ZWQgdXNpbmcgc2VwYXJhdGUKKyAgIGRpc3RpbmN0IGZpbGUgdHlwZXMsIHRoZSBtYWNyb3MgYWx3YXlzIHdpbGwgZXZhbHVhdGUgdG8gemVyby4gIFVubGlrZSB0aGUKKyAgIG90aGVyIFNfKiBtYWNyb3MgdGhlIGZvbGxvd2luZyB0aHJlZSB0YWtlIGEgcG9pbnRlciB0byBhIGBzdHJ1Y3Qgc3RhdCcKKyAgIG9iamVjdCBhcyB0aGUgYXJndW1lbnQuICAqLworI2lmZGVmCV9fVVNFX1BPU0lYMTk5MzA5CisjIGRlZmluZSBTX1RZUEVJU01RKGJ1ZikgX19TX1RZUEVJU01RKGJ1ZikKKyMgZGVmaW5lIFNfVFlQRUlTU0VNKGJ1ZikgX19TX1RZUEVJU1NFTShidWYpCisjIGRlZmluZSBTX1RZUEVJU1NITShidWYpIF9fU19UWVBFSVNTSE0oYnVmKQorI2VuZGlmCisKKworLyogUHJvdGVjdGlvbiBiaXRzLiAgKi8KKworI2RlZmluZQlTX0lTVUlEIF9fU19JU1VJRAkvKiBTZXQgdXNlciBJRCBvbiBleGVjdXRpb24uICAqLworI2RlZmluZQlTX0lTR0lECV9fU19JU0dJRAkvKiBTZXQgZ3JvdXAgSUQgb24gZXhlY3V0aW9uLiAgKi8KKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisvKiBTYXZlIHN3YXBwZWQgdGV4dCBhZnRlciB1c2UgKHN0aWNreSBiaXQpLiAgVGhpcyBpcyBwcmV0dHkgd2VsbCBvYnNvbGV0ZS4gICovCisjIGRlZmluZSBTX0lTVlRYCV9fU19JU1ZUWAorI2VuZGlmCisKKyNkZWZpbmUJU19JUlVTUglfX1NfSVJFQUQJLyogUmVhZCBieSBvd25lci4gICovCisjZGVmaW5lCVNfSVdVU1IJX19TX0lXUklURQkvKiBXcml0ZSBieSBvd25lci4gICovCisjZGVmaW5lCVNfSVhVU1IJX19TX0lFWEVDCS8qIEV4ZWN1dGUgYnkgb3duZXIuICAqLworLyogUmVhZCwgd3JpdGUsIGFuZCBleGVjdXRlIGJ5IG93bmVyLiAgKi8KKyNkZWZpbmUJU19JUldYVQkoX19TX0lSRUFEfF9fU19JV1JJVEV8X19TX0lFWEVDKQorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDICYmIGRlZmluZWQgX19VU0VfQlNECisjIGRlZmluZSBTX0lSRUFECVNfSVJVU1IKKyMgZGVmaW5lIFNfSVdSSVRFCVNfSVdVU1IKKyMgZGVmaW5lIFNfSUVYRUMJU19JWFVTUgorI2VuZGlmCisKKyNkZWZpbmUJU19JUkdSUAkoU19JUlVTUiA+PiAzKQkvKiBSZWFkIGJ5IGdyb3VwLiAgKi8KKyNkZWZpbmUJU19JV0dSUAkoU19JV1VTUiA+PiAzKQkvKiBXcml0ZSBieSBncm91cC4gICovCisjZGVmaW5lCVNfSVhHUlAJKFNfSVhVU1IgPj4gMykJLyogRXhlY3V0ZSBieSBncm91cC4gICovCisvKiBSZWFkLCB3cml0ZSwgYW5kIGV4ZWN1dGUgYnkgZ3JvdXAuICAqLworI2RlZmluZQlTX0lSV1hHCShTX0lSV1hVID4+IDMpCisKKyNkZWZpbmUJU19JUk9USAkoU19JUkdSUCA+PiAzKQkvKiBSZWFkIGJ5IG90aGVycy4gICovCisjZGVmaW5lCVNfSVdPVEgJKFNfSVdHUlAgPj4gMykJLyogV3JpdGUgYnkgb3RoZXJzLiAgKi8KKyNkZWZpbmUJU19JWE9USAkoU19JWEdSUCA+PiAzKQkvKiBFeGVjdXRlIGJ5IG90aGVycy4gICovCisvKiBSZWFkLCB3cml0ZSwgYW5kIGV4ZWN1dGUgYnkgb3RoZXJzLiAgKi8KKyNkZWZpbmUJU19JUldYTwkoU19JUldYRyA+PiAzKQorCisKKyNpZmRlZglfX1VTRV9CU0QKKy8qIE1hY3JvcyBmb3IgY29tbW9uIG1vZGUgYml0IG1hc2tzLiAgKi8KKyMgZGVmaW5lIEFDQ0VTU1BFUk1TIChTX0lSV1hVfFNfSVJXWEd8U19JUldYTykgLyogMDc3NyAqLworIyBkZWZpbmUgQUxMUEVSTVMgKFNfSVNVSUR8U19JU0dJRHxTX0lTVlRYfFNfSVJXWFV8U19JUldYR3xTX0lSV1hPKS8qIDA3Nzc3ICovCisjIGRlZmluZSBERUZGSUxFTU9ERSAoU19JUlVTUnxTX0lXVVNSfFNfSVJHUlB8U19JV0dSUHxTX0lST1RIfFNfSVdPVEgpLyogMDY2NiovCisKKyMgZGVmaW5lIFNfQkxLU0laRQk1MTIJLyogQmxvY2sgc2l6ZSBmb3IgYHN0X2Jsb2NrcycuICAqLworI2VuZGlmCisKKworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisvKiBHZXQgZmlsZSBhdHRyaWJ1dGVzIGZvciBGSUxFIGFuZCBwdXQgdGhlbSBpbiBCVUYuICAqLworZXh0ZXJuIGludCBzdGF0IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkgc3RydWN0IHN0YXQgKl9fcmVzdHJpY3QgX19idWYpIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBHZXQgZmlsZSBhdHRyaWJ1dGVzIGZvciB0aGUgZmlsZSwgZGV2aWNlLCBwaXBlLCBvciBzb2NrZXQKKyAgIHRoYXQgZmlsZSBkZXNjcmlwdG9yIEZEIGlzIG9wZW4gb24gYW5kIHB1dCB0aGVtIGluIEJVRi4gICovCitleHRlcm4gaW50IGZzdGF0IChpbnQgX19mZCwgc3RydWN0IHN0YXQgKl9fYnVmKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChzdGF0LCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJCQkgIHN0cnVjdCBzdGF0ICpfX3Jlc3RyaWN0IF9fYnVmKSwgc3RhdDY0KQorICAgICBfX25vbm51bGwgKCgxLCAyKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChmc3RhdCwgKGludCBfX2ZkLCBzdHJ1Y3Qgc3RhdCAqX19idWYpLCBmc3RhdDY0KQorICAgICBfX25vbm51bGwgKCgyKSk7CisjIGVsc2UKKyMgIGRlZmluZSBzdGF0IHN0YXQ2NAorIyAgZGVmaW5lIGZzdGF0IGZzdGF0NjQKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IHN0YXQ2NCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJICAgc3RydWN0IHN0YXQ2NCAqX19yZXN0cmljdCBfX2J1ZikgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CitleHRlcm4gaW50IGZzdGF0NjQgKGludCBfX2ZkLCBzdHJ1Y3Qgc3RhdDY0ICpfX2J1ZikgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0FURklMRQorLyogU2ltaWxhciB0byBzdGF0LCBnZXQgdGhlIGF0dHJpYnV0ZXMgZm9yIEZJTEUgYW5kIHB1dCB0aGVtIGluIEJVRi4KKyAgIFJlbGF0aXZlIHBhdGggbmFtZXMgYXJlIGludGVycHJldGVkIHJlbGF0aXZlIHRvIEZEIHVubGVzcyBGRCBpcworICAgQVRfRkRDV0QuICAqLworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBmc3RhdGF0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJICAgIHN0cnVjdCBzdGF0ICpfX3Jlc3RyaWN0IF9fYnVmLCBpbnQgX19mbGFnKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDMpKTsKKyMgZWxzZQorIyAgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKGZzdGF0YXQsIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJCQkgICAgIHN0cnVjdCBzdGF0ICpfX3Jlc3RyaWN0IF9fYnVmLAorCQkJCSAgICAgaW50IF9fZmxhZyksCisJCQkgICBmc3RhdGF0NjQpIF9fbm9ubnVsbCAoKDIsIDMpKTsKKyMgIGVsc2UKKyMgICBkZWZpbmUgZnN0YXRhdCBmc3RhdGF0NjQKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgZnN0YXRhdDY0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJICAgICAgc3RydWN0IHN0YXQ2NCAqX19yZXN0cmljdCBfX2J1ZiwgaW50IF9fZmxhZykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyLCAzKSk7CisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisvKiBHZXQgZmlsZSBhdHRyaWJ1dGVzIGFib3V0IEZJTEUgYW5kIHB1dCB0aGVtIGluIEJVRi4KKyAgIElmIEZJTEUgaXMgYSBzeW1ib2xpYyBsaW5rLCBkbyBub3QgZm9sbG93IGl0LiAgKi8KK2V4dGVybiBpbnQgbHN0YXQgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZpbGUsCisJCSAgc3RydWN0IHN0YXQgKl9fcmVzdHJpY3QgX19idWYpIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAobHN0YXQsCisJCQkgICAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJCSAgICBzdHJ1Y3Qgc3RhdCAqX19yZXN0cmljdCBfX2J1ZiksIGxzdGF0NjQpCisgICAgIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgIGVsc2UKKyMgICBkZWZpbmUgbHN0YXQgbHN0YXQ2NAorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgbHN0YXQ2NCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJICAgIHN0cnVjdCBzdGF0NjQgKl9fcmVzdHJpY3QgX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworIyBlbmRpZgorI2VuZGlmCisKKy8qIFNldCBmaWxlIGFjY2VzcyBwZXJtaXNzaW9ucyBmb3IgRklMRSB0byBNT0RFLgorICAgSWYgRklMRSBpcyBhIHN5bWJvbGljIGxpbmssIHRoaXMgYWZmZWN0cyBpdHMgdGFyZ2V0IGluc3RlYWQuICAqLworZXh0ZXJuIGludCBjaG1vZCAoX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fbW9kZV90IF9fbW9kZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIFNldCBmaWxlIGFjY2VzcyBwZXJtaXNzaW9ucyBmb3IgRklMRSB0byBNT0RFLgorICAgSWYgRklMRSBpcyBhIHN5bWJvbGljIGxpbmssIHRoaXMgYWZmZWN0cyB0aGUgbGluayBpdHNlbGYKKyAgIHJhdGhlciB0aGFuIGl0cyB0YXJnZXQuICAqLworZXh0ZXJuIGludCBsY2htb2QgKF9fY29uc3QgY2hhciAqX19maWxlLCBfX21vZGVfdCBfX21vZGUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKy8qIFNldCBmaWxlIGFjY2VzcyBwZXJtaXNzaW9ucyBvZiB0aGUgZmlsZSBGRCBpcyBvcGVuIG9uIHRvIE1PREUuICAqLworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorZXh0ZXJuIGludCBmY2htb2QgKGludCBfX2ZkLCBfX21vZGVfdCBfX21vZGUpIF9fVEhST1c7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0FURklMRQorLyogU2V0IGZpbGUgYWNjZXNzIHBlcm1pc3Npb25zIG9mIEZJTEUgcmVsYXRpdmUgdG8KKyAgIHRoZSBkaXJlY3RvcnkgRkQgaXMgb3BlbiBvbi4gICovCitleHRlcm4gaW50IGZjaG1vZGF0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fbW9kZV90IF9fbW9kZSwKKwkJICAgICBpbnQgX19mbGFnKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKSBfX3d1cjsKKyNlbmRpZiAvKiBVc2UgQVRGSUxFLiAgKi8KKworCisKKy8qIFNldCB0aGUgZmlsZSBjcmVhdGlvbiBtYXNrIG9mIHRoZSBjdXJyZW50IHByb2Nlc3MgdG8gTUFTSywKKyAgIGFuZCByZXR1cm4gdGhlIG9sZCBjcmVhdGlvbiBtYXNrLiAgKi8KK2V4dGVybiBfX21vZGVfdCB1bWFzayAoX19tb2RlX3QgX19tYXNrKSBfX1RIUk9XOworCisjaWZkZWYJX19VU0VfR05VCisvKiBHZXQgdGhlIGN1cnJlbnQgYHVtYXNrJyB2YWx1ZSB3aXRob3V0IGNoYW5naW5nIGl0LgorICAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIEh1cmQuICAqLworZXh0ZXJuIF9fbW9kZV90IGdldHVtYXNrICh2b2lkKSBfX1RIUk9XOworI2VuZGlmCisKKy8qIENyZWF0ZSBhIG5ldyBkaXJlY3RvcnkgbmFtZWQgUEFUSCwgd2l0aCBwZXJtaXNzaW9uIGJpdHMgTU9ERS4gICovCitleHRlcm4gaW50IG1rZGlyIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19tb2RlX3QgX19tb2RlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmZGVmIF9fVVNFX0FURklMRQorLyogTGlrZSBta2RpciwgY3JlYXRlIGEgbmV3IGRpcmVjdG9yeSB3aXRoIHBlcm1pc3Npb24gYml0cyBNT0RFLiAgQnV0CisgICBpbnRlcnByZXQgcmVsYXRpdmUgUEFUSCBuYW1lcyByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGFzc29jaWF0ZWQKKyAgIHdpdGggRkQuICAqLworZXh0ZXJuIGludCBta2RpcmF0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsIF9fbW9kZV90IF9fbW9kZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZW5kaWYKKworLyogQ3JlYXRlIGEgZGV2aWNlIGZpbGUgbmFtZWQgUEFUSCwgd2l0aCBwZXJtaXNzaW9uIGFuZCBzcGVjaWFsIGJpdHMgTU9ERQorICAgYW5kIGRldmljZSBudW1iZXIgREVWICh3aGljaCBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSBtYWpvciBhbmQgbWlub3IKKyAgIGRldmljZSBudW1iZXJzIHdpdGggdGhlIGBtYWtlZGV2JyBtYWNybyBhYm92ZSkuICAqLworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECitleHRlcm4gaW50IG1rbm9kIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19tb2RlX3QgX19tb2RlLCBfX2Rldl90IF9fZGV2KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworIyBpZmRlZiBfX1VTRV9BVEZJTEUKKy8qIExpa2UgbWtub2QsIGNyZWF0ZSBhIG5ldyBkZXZpY2UgZmlsZSB3aXRoIHBlcm1pc3Npb24gYml0cyBNT0RFIGFuZAorICAgZGV2aWNlIG51bWJlciBERVYuICBCdXQgaW50ZXJwcmV0IHJlbGF0aXZlIFBBVEggbmFtZXMgcmVsYXRpdmUgdG8KKyAgIHRoZSBkaXJlY3RvcnkgYXNzb2NpYXRlZCB3aXRoIEZELiAgKi8KK2V4dGVybiBpbnQgbWtub2RhdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUsCisJCSAgICBfX2Rldl90IF9fZGV2KSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIENyZWF0ZSBhIG5ldyBGSUZPIG5hbWVkIFBBVEgsIHdpdGggcGVybWlzc2lvbiBiaXRzIE1PREUuICAqLworZXh0ZXJuIGludCBta2ZpZm8gKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjaWZkZWYgX19VU0VfQVRGSUxFCisvKiBMaWtlIG1rZmlmbywgY3JlYXRlIGEgbmV3IEZJRk8gd2l0aCBwZXJtaXNzaW9uIGJpdHMgTU9ERS4gIEJ1dAorICAgaW50ZXJwcmV0IHJlbGF0aXZlIFBBVEggbmFtZXMgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBhc3NvY2lhdGVkCisgICB3aXRoIEZELiAgKi8KK2V4dGVybiBpbnQgbWtmaWZvYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19tb2RlX3QgX19tb2RlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbmRpZgorDAorI2lmZGVmIF9fVVNFX0FURklMRQorLyogU2V0IGZpbGUgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gdGltZXMgcmVsYXRpdmUgdG8gZGlyZWN0b3J5IGZpbGUKKyAgIGRlc2NyaXB0b3IuICAqLworZXh0ZXJuIGludCB1dGltZW5zYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwKKwkJICAgICAgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgX190aW1lc1syXSwKKwkJICAgICAgaW50IF9fZmxhZ3MpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLOAorLyogU2V0IGZpbGUgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gdGltZXMgb2YgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIEZELiAgKi8KK2V4dGVybiBpbnQgZnV0aW1lbnMgKGludCBfX2ZkLCBfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyBfX3RpbWVzWzJdKSBfX1RIUk9XOworI2VuZGlmCisMCisvKiBUbyBhbGxvdyB0aGUgYHN0cnVjdCBzdGF0JyBzdHJ1Y3R1cmUgYW5kIHRoZSBmaWxlIHR5cGUgYG1vZGVfdCcKKyAgIGJpdHMgdG8gdmFyeSB3aXRob3V0IGNoYW5naW5nIHNoYXJlZCBsaWJyYXJ5IG1ham9yIHZlcnNpb24gbnVtYmVyLAorICAgdGhlIGBzdGF0JyBmYW1pbHkgb2YgZnVuY3Rpb25zIGFuZCBgbWtub2QnIGFyZSBpbiBmYWN0IGlubGluZQorICAgd3JhcHBlcnMgYXJvdW5kIGNhbGxzIHRvIGB4c3RhdCcsIGBmeHN0YXQnLCBgbHhzdGF0JywgYW5kIGB4bWtub2QnLAorICAgd2hpY2ggYWxsIHRha2UgYSBsZWFkaW5nIHZlcnNpb24tbnVtYmVyIGFyZ3VtZW50IGRlc2lnbmF0aW5nIHRoZQorICAgZGF0YSBzdHJ1Y3R1cmUgYW5kIGJpdHMgdXNlZC4gIDxiaXRzL3N0YXQuaD4gZGVmaW5lcyBfU1RBVF9WRVIgd2l0aAorICAgdGhlIHZlcnNpb24gbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gYHN0cnVjdCBzdGF0JyBhcyBkZWZpbmVkIGluCisgICB0aGF0IGZpbGU7IGFuZCBfTUtOT0RfVkVSIHdpdGggdGhlIHZlcnNpb24gbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8KKyAgIHRoZSBTX0lGKiBtYWNyb3MgZGVmaW5lZCB0aGVyZWluLiAgSXQgaXMgYXJyYW5nZWQgdGhhdCB3aGVuIG5vdAorICAgaW5saW5lZCB0aGVzZSBmdW5jdGlvbiBhcmUgYWx3YXlzIHN0YXRpY2FsbHkgbGlua2VkOyB0aGF0IHdheSBhCisgICBkeW5hbWljYWxseS1saW5rZWQgZXhlY3V0YWJsZSBhbHdheXMgZW5jb2RlcyB0aGUgdmVyc2lvbiBudW1iZXIKKyAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRhdGEgc3RydWN0dXJlcyBpdCB1c2VzLCBzbyB0aGUgYHgnIGZ1bmN0aW9ucworICAgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5IGNhbiBhZGFwdCB3aXRob3V0IG5lZWRpbmcgdG8gcmVjb21waWxlIGFsbAorICAgY2FsbGVycy4gICovCisKKyNpZm5kZWYgX1NUQVRfVkVSCisjIGRlZmluZSBfU1RBVF9WRVIJMAorI2VuZGlmCisjaWZuZGVmIF9NS05PRF9WRVIKKyMgZGVmaW5lIF9NS05PRF9WRVIJMAorI2VuZGlmCisKKy8qIFdyYXBwZXJzIGZvciBzdGF0IGFuZCBta25vZCBzeXN0ZW0gY2FsbHMuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IF9fZnhzdGF0IChpbnQgX192ZXIsIGludCBfX2ZpbGRlcywgc3RydWN0IHN0YXQgKl9fc3RhdF9idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMykpOworZXh0ZXJuIGludCBfX3hzdGF0IChpbnQgX192ZXIsIF9fY29uc3QgY2hhciAqX19maWxlbmFtZSwKKwkJICAgIHN0cnVjdCBzdGF0ICpfX3N0YXRfYnVmKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDMpKTsKK2V4dGVybiBpbnQgX19seHN0YXQgKGludCBfX3ZlciwgX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkgICAgIHN0cnVjdCBzdGF0ICpfX3N0YXRfYnVmKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDMpKTsKK2V4dGVybiBpbnQgX19meHN0YXRhdCAoaW50IF9fdmVyLCBpbnQgX19maWxkZXMsIF9fY29uc3QgY2hhciAqX19maWxlbmFtZSwKKwkJICAgICAgIHN0cnVjdCBzdGF0ICpfX3N0YXRfYnVmLCBpbnQgX19mbGFnKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDMsIDQpKTsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX2Z4c3RhdCwgKGludCBfX3ZlciwgaW50IF9fZmlsZGVzLAorCQkJCSAgICAgIHN0cnVjdCBzdGF0ICpfX3N0YXRfYnVmKSwgX19meHN0YXQ2NCkKKyAgICAgX19ub25udWxsICgoMykpOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX194c3RhdCwgKGludCBfX3ZlciwgX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkJCSAgICAgc3RydWN0IHN0YXQgKl9fc3RhdF9idWYpLCBfX3hzdGF0NjQpCisgICAgIF9fbm9ubnVsbCAoKDIsIDMpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fbHhzdGF0LCAoaW50IF9fdmVyLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsCisJCQkJICAgICAgc3RydWN0IHN0YXQgKl9fc3RhdF9idWYpLCBfX2x4c3RhdDY0KQorICAgICBfX25vbm51bGwgKCgyLCAzKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX2Z4c3RhdGF0LCAoaW50IF9fdmVyLCBpbnQgX19maWxkZXMsCisJCQkJCV9fY29uc3QgY2hhciAqX19maWxlbmFtZSwKKwkJCQkJc3RydWN0IHN0YXQgKl9fc3RhdF9idWYsIGludCBfX2ZsYWcpLAorCQkJICAgX19meHN0YXRhdDY0KSBfX25vbm51bGwgKCgzLCA0KSk7CisKKyMgZWxzZQorIyAgZGVmaW5lIF9fZnhzdGF0IF9fZnhzdGF0NjQKKyMgIGRlZmluZSBfX3hzdGF0IF9feHN0YXQ2NAorIyAgZGVmaW5lIF9fbHhzdGF0IF9fbHhzdGF0NjQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgX19meHN0YXQ2NCAoaW50IF9fdmVyLCBpbnQgX19maWxkZXMsIHN0cnVjdCBzdGF0NjQgKl9fc3RhdF9idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMykpOworZXh0ZXJuIGludCBfX3hzdGF0NjQgKGludCBfX3ZlciwgX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkgICAgICBzdHJ1Y3Qgc3RhdDY0ICpfX3N0YXRfYnVmKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDMpKTsKK2V4dGVybiBpbnQgX19seHN0YXQ2NCAoaW50IF9fdmVyLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsCisJCSAgICAgICBzdHJ1Y3Qgc3RhdDY0ICpfX3N0YXRfYnVmKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDMpKTsKK2V4dGVybiBpbnQgX19meHN0YXRhdDY0IChpbnQgX192ZXIsIGludCBfX2ZpbGRlcywgX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkJIHN0cnVjdCBzdGF0NjQgKl9fc3RhdF9idWYsIGludCBfX2ZsYWcpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMywgNCkpOworI2VuZGlmCitleHRlcm4gaW50IF9feG1rbm9kIChpbnQgX192ZXIsIF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUsCisJCSAgICAgX19kZXZfdCAqX19kZXYpIF9fVEhST1cgX19ub25udWxsICgoMiwgNCkpOworCitleHRlcm4gaW50IF9feG1rbm9kYXQgKGludCBfX3ZlciwgaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLAorCQkgICAgICAgX19tb2RlX3QgX19tb2RlLCBfX2Rldl90ICpfX2RldikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgzLCA1KSk7CisKKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIgJiYgZGVmaW5lZCBfX1VTRV9FWFRFUk5fSU5MSU5FU19JTl9MSUJDCisvKiBJbmxpbmVkIHZlcnNpb25zIG9mIHRoZSByZWFsIHN0YXQgYW5kIG1rbm9kIGZ1bmN0aW9ucy4gICovCisKK19fZXh0ZXJuX2lubGluZSBpbnQKK19fTlRIIChzdGF0IChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgc3RydWN0IHN0YXQgKl9fc3RhdGJ1ZikpCit7CisgIHJldHVybiBfX3hzdGF0IChfU1RBVF9WRVIsIF9fcGF0aCwgX19zdGF0YnVmKTsKK30KKworIyBpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAobHN0YXQgKF9fY29uc3QgY2hhciAqX19wYXRoLCBzdHJ1Y3Qgc3RhdCAqX19zdGF0YnVmKSkKK3sKKyAgcmV0dXJuIF9fbHhzdGF0IChfU1RBVF9WRVIsIF9fcGF0aCwgX19zdGF0YnVmKTsKK30KKyMgZW5kaWYKKworX19leHRlcm5faW5saW5lIGludAorX19OVEggKGZzdGF0IChpbnQgX19mZCwgc3RydWN0IHN0YXQgKl9fc3RhdGJ1ZikpCit7CisgIHJldHVybiBfX2Z4c3RhdCAoX1NUQVRfVkVSLCBfX2ZkLCBfX3N0YXRidWYpOworfQorCisjIGlmZGVmIF9fVVNFX0FURklMRQorX19leHRlcm5faW5saW5lIGludAorX19OVEggKGZzdGF0YXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsIHN0cnVjdCBzdGF0ICpfX3N0YXRidWYsCisJCWludCBfX2ZsYWcpKQoreworICByZXR1cm4gX19meHN0YXRhdCAoX1NUQVRfVkVSLCBfX2ZkLCBfX2ZpbGVuYW1lLCBfX3N0YXRidWYsIF9fZmxhZyk7Cit9CisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfQlNECitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAobWtub2QgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUsIF9fZGV2X3QgX19kZXYpKQoreworICByZXR1cm4gX194bWtub2QgKF9NS05PRF9WRVIsIF9fcGF0aCwgX19tb2RlLCAmX19kZXYpOworfQorIyBlbmRpZgorCisjIGlmZGVmIF9fVVNFX0FURklMRQorX19leHRlcm5faW5saW5lIGludAorX19OVEggKG1rbm9kYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19tb2RlX3QgX19tb2RlLAorCQlfX2Rldl90IF9fZGV2KSkKK3sKKyAgcmV0dXJuIF9feG1rbm9kYXQgKF9NS05PRF9WRVIsIF9fZmQsIF9fcGF0aCwgX19tb2RlLCAmX19kZXYpOworfQorIyBlbmRpZgorCisjIGlmIGRlZmluZWQgX19VU0VfTEFSR0VGSUxFNjQgXAorICAmJiAoISBkZWZpbmVkIF9fVVNFX0ZJTEVfT0ZGU0VUNjQgXAorICAgICAgfHwgKGRlZmluZWQgX19SRURJUkVDVF9OVEggJiYgZGVmaW5lZCBfX09QVElNSVpFX18pKQorX19leHRlcm5faW5saW5lIGludAorX19OVEggKHN0YXQ2NCAoX19jb25zdCBjaGFyICpfX3BhdGgsIHN0cnVjdCBzdGF0NjQgKl9fc3RhdGJ1ZikpCit7CisgIHJldHVybiBfX3hzdGF0NjQgKF9TVEFUX1ZFUiwgX19wYXRoLCBfX3N0YXRidWYpOworfQorCisjICBpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAobHN0YXQ2NCAoX19jb25zdCBjaGFyICpfX3BhdGgsIHN0cnVjdCBzdGF0NjQgKl9fc3RhdGJ1ZikpCit7CisgIHJldHVybiBfX2x4c3RhdDY0IChfU1RBVF9WRVIsIF9fcGF0aCwgX19zdGF0YnVmKTsKK30KKyMgIGVuZGlmCisKK19fZXh0ZXJuX2lubGluZSBpbnQKK19fTlRIIChmc3RhdDY0IChpbnQgX19mZCwgc3RydWN0IHN0YXQ2NCAqX19zdGF0YnVmKSkKK3sKKyAgcmV0dXJuIF9fZnhzdGF0NjQgKF9TVEFUX1ZFUiwgX19mZCwgX19zdGF0YnVmKTsKK30KKworIyAgaWZkZWYgX19VU0VfQVRGSUxFCitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAoZnN0YXRhdDY0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdDY0ICpfX3N0YXRidWYsCisJCSAgaW50IF9fZmxhZykpCit7CisgIHJldHVybiBfX2Z4c3RhdGF0NjQgKF9TVEFUX1ZFUiwgX19mZCwgX19maWxlbmFtZSwgX19zdGF0YnVmLCBfX2ZsYWcpOworfQorIyAgZW5kaWYKKworIyBlbmRpZgorCisjZW5kaWYKKworX19FTkRfREVDTFMKKworCisjZW5kaWYgLyogc3lzL3N0YXQuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3RhdGZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3N0YXRmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMjIyNmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3N0YXRmcy5oCkBAIC0wLDAgKzEsNjggQEAKKy8qIERlZmluaXRpb25zIGZvciBnZXR0aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgZmlsZXN5c3RlbS4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX1NUQVRGU19ICisjZGVmaW5lCV9TWVNfU1RBVEZTX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogR2V0IHRoZSBzeXN0ZW0tc3BlY2lmaWMgZGVmaW5pdGlvbiBvZiBgc3RydWN0IHN0YXRmcycuICAqLworI2luY2x1ZGUgPGJpdHMvc3RhdGZzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWxlc3lzdGVtIG9uIHdoaWNoIEZJTEUgcmVzaWRlcy4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgc3RhdGZzIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgc3RydWN0IHN0YXRmcyAqX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHN0YXRmcywKKwkJCSAgIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgc3RydWN0IHN0YXRmcyAqX19idWYpLAorCQkJICAgc3RhdGZzNjQpIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgZWxzZQorIyAgZGVmaW5lIHN0YXRmcyBzdGF0ZnM2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgc3RhdGZzNjQgKF9fY29uc3QgY2hhciAqX19maWxlLCBzdHJ1Y3Qgc3RhdGZzNjQgKl9fYnVmKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyNlbmRpZgorCisvKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbGVzeXN0ZW0gY29udGFpbmluZyB0aGUgZmlsZSBGSUxERVMKKyAgIHJlZmVycyB0by4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgZnN0YXRmcyAoaW50IF9fZmlsZGVzLCBzdHJ1Y3Qgc3RhdGZzICpfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoZnN0YXRmcywgKGludCBfX2ZpbGRlcywgc3RydWN0IHN0YXRmcyAqX19idWYpLAorCQkJICAgZnN0YXRmczY0KSBfX25vbm51bGwgKCgyKSk7CisjIGVsc2UKKyMgIGRlZmluZSBmc3RhdGZzIGZzdGF0ZnM2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgZnN0YXRmczY0IChpbnQgX19maWxkZXMsIHN0cnVjdCBzdGF0ZnM2NCAqX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvc3RhdGZzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3RhdHZmcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zdGF0dmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5NjYyYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3RhdHZmcy5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qIERlZmluaXRpb25zIGZvciBnZXR0aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgZmlsZXN5c3RlbS4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX1NUQVRWRlNfSAorI2RlZmluZQlfU1lTX1NUQVRWRlNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgdGhlIHN5c3RlbS1zcGVjaWZpYyBkZWZpbml0aW9uIG9mIGBzdHJ1Y3Qgc3RhdGZzJy4gICovCisjaW5jbHVkZSA8Yml0cy9zdGF0dmZzLmg+CisKKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorIyBpZm5kZWYgX19mc2Jsa2NudF90X2RlZmluZWQKK3R5cGVkZWYgX19mc2Jsa2NudF90IGZzYmxrY250X3Q7IC8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gYmxvY2tzLiAgKi8KKyMgIGRlZmluZSBfX2ZzYmxrY250X3RfZGVmaW5lZAorIyBlbmRpZgorIyBpZm5kZWYgX19mc2ZpbGNudF90X2RlZmluZWQKK3R5cGVkZWYgX19mc2ZpbGNudF90IGZzZmlsY250X3Q7IC8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gaW5vZGVzLiAgKi8KKyMgIGRlZmluZSBfX2ZzZmlsY250X3RfZGVmaW5lZAorIyBlbmRpZgorI2Vsc2UKKyMgaWZuZGVmIF9fZnNibGtjbnRfdF9kZWZpbmVkCit0eXBlZGVmIF9fZnNibGtjbnQ2NF90IGZzYmxrY250X3Q7IC8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gYmxvY2tzLiAgKi8KKyMgIGRlZmluZSBfX2ZzYmxrY250X3RfZGVmaW5lZAorIyBlbmRpZgorIyBpZm5kZWYgX19mc2ZpbGNudF90X2RlZmluZWQKK3R5cGVkZWYgX19mc2ZpbGNudDY0X3QgZnNmaWxjbnRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBpbm9kZXMuICAqLworIyAgZGVmaW5lIF9fZnNmaWxjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYKKworX19CRUdJTl9ERUNMUworCisvKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbGVzeXN0ZW0gb24gd2hpY2ggRklMRSByZXNpZGVzLiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBzdGF0dmZzIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkgICAgc3RydWN0IHN0YXR2ZnMgKl9fcmVzdHJpY3QgX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHN0YXR2ZnMsCisJCQkgICAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJCSAgICBzdHJ1Y3Qgc3RhdHZmcyAqX19yZXN0cmljdCBfX2J1ZiksIHN0YXR2ZnM2NCkKKyAgICAgX19ub25udWxsICgoMSwgMikpOworIyBlbHNlCisjICBkZWZpbmUgc3RhdHZmcyBzdGF0dmZzNjQKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IHN0YXR2ZnM2NCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJICAgICAgc3RydWN0IHN0YXR2ZnM2NCAqX19yZXN0cmljdCBfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjZW5kaWYKKworLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWxlc3lzdGVtIGNvbnRhaW5pbmcgdGhlIGZpbGUgRklMREVTCisgICByZWZlcnMgdG8uICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IGZzdGF0dmZzIChpbnQgX19maWxkZXMsIHN0cnVjdCBzdGF0dmZzICpfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoZnN0YXR2ZnMsIChpbnQgX19maWxkZXMsIHN0cnVjdCBzdGF0dmZzICpfX2J1ZiksCisJCQkgICBmc3RhdHZmczY0KSBfX25vbm51bGwgKCgyKSk7CisjIGVsc2UKKyMgIGRlZmluZSBmc3RhdHZmcyBmc3RhdHZmczY0CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBmc3RhdHZmczY0IChpbnQgX19maWxkZXMsIHN0cnVjdCBzdGF0dmZzNjQgKl9fYnVmKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3lzL3N0YXR2ZnMuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zdHJvcHRzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3N0cm9wdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjViYzAyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zdHJvcHRzLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPHN0cm9wdHMuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3dhcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zd2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYxMDA2YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3dhcC5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qIENhbGxzIHRvIGVuYWJsZSBhbmQgZGlzYWJsZSBzd2FwcGluZyBvbiBzcGVjaWZpZWQgbG9jYXRpb25zLiAgTGludXggdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMTk5OSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NXQVBfSAorCisjZGVmaW5lIF9TWVNfU1dBUF9ICTEKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBUaGUgc3dhcCBwcmlvcml0eSBpcyBlbmNvZGVkIGFzOgorICAgKHByaW8gPDwgU1dBUF9GTEFHX1BSSU9fU0hJRlQpICYgU1dBUF9GTEFHX1BSSU9fTUFTSworKi8KKyNkZWZpbmUJU1dBUF9GTEFHX1BSRUZFUgkweDgwMDAJLyogU2V0IGlmIHN3YXAgcHJpb3JpdHkgaXMgc3BlY2lmaWVkLiAqLworI2RlZmluZQlTV0FQX0ZMQUdfUFJJT19NQVNLCTB4N2ZmZgorI2RlZmluZQlTV0FQX0ZMQUdfUFJJT19TSElGVAkwCisjZGVmaW5lIFNXQVBfRkxBR19ESVNDQVJECTB4MTAwMDAJLyogRGlzY2FyZCBzd2FwIGNsdXN0ZXIgYWZ0ZXIgdXNlLiAgKi8KKworX19CRUdJTl9ERUNMUworCisvKiBNYWtlIHRoZSBibG9jayBzcGVjaWFsIGRldmljZSBQQVRIIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtIGZvciBzd2FwcGluZy4KKyAgIFRoaXMgY2FsbCBpcyByZXN0cmljdGVkIHRvIHRoZSBzdXBlci11c2VyLiAgKi8KK2V4dGVybiBpbnQgc3dhcG9uIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fZmxhZ3MpIF9fVEhST1c7CisKKy8qIFN0b3AgdXNpbmcgYmxvY2sgc3BlY2lhbCBkZXZpY2UgUEFUSCBmb3Igc3dhcHBpbmcuICAqLworZXh0ZXJuIGludCBzd2Fwb2ZmIChfX2NvbnN0IGNoYXIgKl9fcGF0aCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9TWVNfU1dBUF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3N5c2NhbGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3lzY2FsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZDcyZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3N5c2NhbGwuaApAQCAtMCwwICsxLDM1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU0NBTExfSAorI2RlZmluZSBfU1lTQ0FMTF9ICTEKKworLyogVGhpcyBmaWxlIHNob3VsZCBsaXN0IHRoZSBudW1iZXJzIG9mIHRoZSBzeXN0ZW0gY2FsbHMgdGhlIHN5c3RlbSBrbm93cy4KKyAgIEJ1dCBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIHRoaXMgd2UgdXNlIHRoZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUKKyAgIGZyb20gdGhlIGtlcm5lbCBzb3VyY2VzLiAgKi8KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKKyNpZm5kZWYgX0xJQkMKKy8qIFRoZSBMaW51eCBrZXJuZWwgaGVhZGVyIGZpbGUgZGVmaW5lcyBtYWNyb3MgYF9fTlJfPG5hbWU+JywgYnV0IHNvbWUKKyAgIHByb2dyYW1zIGV4cGVjdCB0aGUgdHJhZGl0aW9uYWwgZm9ybSBgU1lTXzxuYW1lPicuICBTbyBpbiBidWlsZGluZyBsaWJjCisgICB3ZSBzY2FuIHRoZSBrZXJuZWwncyBsaXN0IGFuZCBwcm9kdWNlIDxiaXRzL3N5c2NhbGwuaD4gd2l0aCBtYWNyb3MgZm9yCisgICBhbGwgdGhlIGBTWVNfJyBuYW1lcy4gICovCisjIGluY2x1ZGUgPGJpdHMvc3lzY2FsbC5oPgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zeXNjdGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3lzY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwZWZhYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3lzY3RsLmgKQEAgLTAsMCArMSw3MiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5LCAyMDAyLCAyMDAzLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfU1lTQ1RMX0gKKyNkZWZpbmUJX1NZU19TWVNDVExfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2RlZmluZSBfX25lZWRfc2l6ZV90CisjaW5jbHVkZSA8c3RkZGVmLmg+CisvKiBQcmV2ZW50IG1vcmUga2VybmVsIGhlYWRlcnMgdGhhbiBuZWNlc3NhcnkgdG8gYmUgaW5jbHVkZWQuICAqLworI2lmbmRlZiBfTElOVVhfS0VSTkVMX0gKKyMgZGVmaW5lIF9MSU5VWF9LRVJORUxfSAkxCisjIGRlZmluZSBfX3VuZGVmX0xJTlVYX0tFUk5FTF9ICisjZW5kaWYKKyNpZm5kZWYgX0xJTlVYX1RZUEVTX0gKKyMgZGVmaW5lIF9MSU5VWF9UWVBFU19ICQkxCisjIGRlZmluZSBfX3VuZGVmX0xJTlVYX1RZUEVTX0gKKyNlbmRpZgorI2lmbmRlZiBfTElOVVhfTElTVF9ICisjIGRlZmluZSBfTElOVVhfTElTVF9ICQkxCisjIGRlZmluZSBfX3VuZGVmX0xJTlVYX0xJU1RfSAorI2VuZGlmCisjaWZuZGVmIF9fTElOVVhfQ09NUElMRVJfSAorIyBkZWZpbmUgX19MSU5VWF9DT01QSUxFUl9ICTEKKyMgZGVmaW5lIF9fdXNlcgorIyBkZWZpbmUgX191bmRlZl9fTElOVVhfQ09NUElMRVJfSAorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKworI2lmZGVmIF9fdW5kZWZfTElOVVhfS0VSTkVMX0gKKyMgdW5kZWYgX0xJTlVYX0tFUk5FTF9ICisjIHVuZGVmIF9fdW5kZWZfTElOVVhfS0VSTkVMX0gKKyNlbmRpZgorI2lmZGVmIF9fdW5kZWZfTElOVVhfVFlQRVNfSAorIyB1bmRlZiBfTElOVVhfVFlQRVNfSAorIyB1bmRlZiBfX3VuZGVmX0xJTlVYX1RZUEVTX0gKKyNlbmRpZgorI2lmZGVmIF9fdW5kZWZfTElOVVhfTElTVF9ICisjIHVuZGVmIF9MSU5VWF9MSVNUX0gKKyMgdW5kZWYgX191bmRlZl9MSU5VWF9MSVNUX0gKKyNlbmRpZgorI2lmZGVmIF9fdW5kZWZfX0xJTlVYX0NPTVBJTEVSX0gKKyMgdW5kZWYgX19MSU5VWF9DT01QSUxFUl9ICisjIHVuZGVmIF9fdXNlcgorIyB1bmRlZiBfX3VuZGVmX19MSU5VWF9DT01QSUxFUl9ICisjZW5kaWYKKworX19CRUdJTl9ERUNMUworCisvKiBSZWFkIG9yIHdyaXRlIHN5c3RlbSBwYXJhbWV0ZXJzLiAgKi8KK2V4dGVybiBpbnQgc3lzY3RsIChpbnQgKl9fbmFtZSwgaW50IF9fbmxlbiwgdm9pZCAqX19vbGR2YWwsCisJCSAgIHNpemVfdCAqX19vbGRsZW5wLCB2b2lkICpfX25ld3ZhbCwgc2l6ZV90IF9fbmV3bGVuKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogX1NZU19TWVNDVExfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zeXNpbmZvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3N5c2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjcyN2IyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy9zeXNpbmZvLmgKQEAgLTAsMCArMSw0OCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5LCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU1lTSU5GT19ICisjZGVmaW5lIF9TWVNfU1lTSU5GT19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIEdldCBzeXNpbmZvIHN0cnVjdHVyZSBmcm9tIGtlcm5lbCBoZWFkZXIuICAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJldHVybnMgaW5mb3JtYXRpb24gb24gb3ZlcmFsbCBzeXN0ZW0gc3RhdGlzdGljcy4gICovCitleHRlcm4gaW50IHN5c2luZm8gKHN0cnVjdCBzeXNpbmZvICpfX2luZm8pIF9fVEhST1c7CisKKworLyogUmV0dXJuIG51bWJlciBvZiBjb25maWd1cmVkIHByb2Nlc3NvcnMuICAqLworZXh0ZXJuIGludCBnZXRfbnByb2NzX2NvbmYgKHZvaWQpIF9fVEhST1c7CisKKy8qIFJldHVybiBudW1iZXIgb2YgYXZhaWxhYmxlIHByb2Nlc3NvcnMuICAqLworZXh0ZXJuIGludCBnZXRfbnByb2NzICh2b2lkKSBfX1RIUk9XOworCisKKy8qIFJldHVybiBudW1iZXIgb2YgcGh5c2ljYWwgcGFnZXMgb2YgbWVtb3J5IGluIHRoZSBzeXN0ZW0uICAqLworZXh0ZXJuIGxvbmcgaW50IGdldF9waHlzX3BhZ2VzICh2b2lkKSBfX1RIUk9XOworCisvKiBSZXR1cm4gbnVtYmVyIG9mIGF2YWlsYWJsZSBwaHlzaWNhbCBwYWdlcyBvZiBtZW1vcnkgaW4gdGhlIHN5c3RlbS4gICovCitleHRlcm4gbG9uZyBpbnQgZ2V0X2F2cGh5c19wYWdlcyAodm9pZCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHN5cy9zeXNpbmZvLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3lzbG9nLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3N5c2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZGExY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3N5c2xvZy5oCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTg4LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXN5c2xvZy5oCTguMSAoQmVya2VsZXkpIDYvMi85MworICovCisKKyNpZm5kZWYgX1NZU19TWVNMT0dfSAorI2RlZmluZSBfU1lTX1NZU0xPR19IIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjZGVmaW5lIF9fbmVlZF9fX3ZhX2xpc3QKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyogVGhpcyBmaWxlIGRlZmluZXMgX1BBVEhfTE9HLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3N5c2xvZy1wYXRoLmg+CisKKy8qCisgKiBwcmlvcml0aWVzL2ZhY2lsaXRpZXMgYXJlIGVuY29kZWQgaW50byBhIHNpbmdsZSAzMi1iaXQgcXVhbnRpdHksIHdoZXJlIHRoZQorICogYm90dG9tIDMgYml0cyBhcmUgdGhlIHByaW9yaXR5ICgwLTcpIGFuZCB0aGUgdG9wIDI4IGJpdHMgYXJlIHRoZSBmYWNpbGl0eQorICogKDAtYmlnIG51bWJlcikuICBCb3RoIHRoZSBwcmlvcml0aWVzIGFuZCB0aGUgZmFjaWxpdGllcyBtYXAgcm91Z2hseQorICogb25lLXRvLW9uZSB0byBzdHJpbmdzIGluIHRoZSBzeXNsb2dkKDgpIHNvdXJjZSBjb2RlLiAgVGhpcyBtYXBwaW5nIGlzCisgKiBpbmNsdWRlZCBpbiB0aGlzIGZpbGUuCisgKgorICogcHJpb3JpdGllcyAodGhlc2UgYXJlIG9yZGVyZWQpCisgKi8KKyNkZWZpbmUJTE9HX0VNRVJHCTAJLyogc3lzdGVtIGlzIHVudXNhYmxlICovCisjZGVmaW5lCUxPR19BTEVSVAkxCS8qIGFjdGlvbiBtdXN0IGJlIHRha2VuIGltbWVkaWF0ZWx5ICovCisjZGVmaW5lCUxPR19DUklUCTIJLyogY3JpdGljYWwgY29uZGl0aW9ucyAqLworI2RlZmluZQlMT0dfRVJSCQkzCS8qIGVycm9yIGNvbmRpdGlvbnMgKi8KKyNkZWZpbmUJTE9HX1dBUk5JTkcJNAkvKiB3YXJuaW5nIGNvbmRpdGlvbnMgKi8KKyNkZWZpbmUJTE9HX05PVElDRQk1CS8qIG5vcm1hbCBidXQgc2lnbmlmaWNhbnQgY29uZGl0aW9uICovCisjZGVmaW5lCUxPR19JTkZPCTYJLyogaW5mb3JtYXRpb25hbCAqLworI2RlZmluZQlMT0dfREVCVUcJNwkvKiBkZWJ1Zy1sZXZlbCBtZXNzYWdlcyAqLworCisjZGVmaW5lCUxPR19QUklNQVNLCTB4MDcJLyogbWFzayB0byBleHRyYWN0IHByaW9yaXR5IHBhcnQgKGludGVybmFsKSAqLworCQkJCS8qIGV4dHJhY3QgcHJpb3JpdHkgKi8KKyNkZWZpbmUJTE9HX1BSSShwKQkoKHApICYgTE9HX1BSSU1BU0spCisjZGVmaW5lCUxPR19NQUtFUFJJKGZhYywgcHJpKQkoKChmYWMpIDw8IDMpIHwgKHByaSkpCisKKyNpZmRlZiBTWVNMT0dfTkFNRVMKKyNkZWZpbmUJSU5URVJOQUxfTk9QUkkJMHgxMAkvKiB0aGUgIm5vIHByaW9yaXR5IiBwcmlvcml0eSAqLworCQkJCS8qIG1hcmsgImZhY2lsaXR5IiAqLworI2RlZmluZQlJTlRFUk5BTF9NQVJLCUxPR19NQUtFUFJJKExPR19ORkFDSUxJVElFUywgMCkKK3R5cGVkZWYgc3RydWN0IF9jb2RlIHsKKwljaGFyCSpjX25hbWU7CisJaW50CWNfdmFsOworfSBDT0RFOworCitDT0RFIHByaW9yaXR5bmFtZXNbXSA9CisgIHsKKyAgICB7ICJhbGVydCIsIExPR19BTEVSVCB9LAorICAgIHsgImNyaXQiLCBMT0dfQ1JJVCB9LAorICAgIHsgImRlYnVnIiwgTE9HX0RFQlVHIH0sCisgICAgeyAiZW1lcmciLCBMT0dfRU1FUkcgfSwKKyAgICB7ICJlcnIiLCBMT0dfRVJSIH0sCisgICAgeyAiZXJyb3IiLCBMT0dfRVJSIH0sCQkvKiBERVBSRUNBVEVEICovCisgICAgeyAiaW5mbyIsIExPR19JTkZPIH0sCisgICAgeyAibm9uZSIsIElOVEVSTkFMX05PUFJJIH0sCQkvKiBJTlRFUk5BTCAqLworICAgIHsgIm5vdGljZSIsIExPR19OT1RJQ0UgfSwKKyAgICB7ICJwYW5pYyIsIExPR19FTUVSRyB9LAkJLyogREVQUkVDQVRFRCAqLworICAgIHsgIndhcm4iLCBMT0dfV0FSTklORyB9LAkJLyogREVQUkVDQVRFRCAqLworICAgIHsgIndhcm5pbmciLCBMT0dfV0FSTklORyB9LAorICAgIHsgTlVMTCwgLTEgfQorICB9OworI2VuZGlmCisKKy8qIGZhY2lsaXR5IGNvZGVzICovCisjZGVmaW5lCUxPR19LRVJOCSgwPDwzKQkvKiBrZXJuZWwgbWVzc2FnZXMgKi8KKyNkZWZpbmUJTE9HX1VTRVIJKDE8PDMpCS8qIHJhbmRvbSB1c2VyLWxldmVsIG1lc3NhZ2VzICovCisjZGVmaW5lCUxPR19NQUlMCSgyPDwzKQkvKiBtYWlsIHN5c3RlbSAqLworI2RlZmluZQlMT0dfREFFTU9OCSgzPDwzKQkvKiBzeXN0ZW0gZGFlbW9ucyAqLworI2RlZmluZQlMT0dfQVVUSAkoNDw8MykJLyogc2VjdXJpdHkvYXV0aG9yaXphdGlvbiBtZXNzYWdlcyAqLworI2RlZmluZQlMT0dfU1lTTE9HCSg1PDwzKQkvKiBtZXNzYWdlcyBnZW5lcmF0ZWQgaW50ZXJuYWxseSBieSBzeXNsb2dkICovCisjZGVmaW5lCUxPR19MUFIJCSg2PDwzKQkvKiBsaW5lIHByaW50ZXIgc3Vic3lzdGVtICovCisjZGVmaW5lCUxPR19ORVdTCSg3PDwzKQkvKiBuZXR3b3JrIG5ld3Mgc3Vic3lzdGVtICovCisjZGVmaW5lCUxPR19VVUNQCSg4PDwzKQkvKiBVVUNQIHN1YnN5c3RlbSAqLworI2RlZmluZQlMT0dfQ1JPTgkoOTw8MykJLyogY2xvY2sgZGFlbW9uICovCisjZGVmaW5lCUxPR19BVVRIUFJJVgkoMTA8PDMpCS8qIHNlY3VyaXR5L2F1dGhvcml6YXRpb24gbWVzc2FnZXMgKHByaXZhdGUpICovCisjZGVmaW5lCUxPR19GVFAJCSgxMTw8MykJLyogZnRwIGRhZW1vbiAqLworCisJLyogb3RoZXIgY29kZXMgdGhyb3VnaCAxNSByZXNlcnZlZCBmb3Igc3lzdGVtIHVzZSAqLworI2RlZmluZQlMT0dfTE9DQUwwCSgxNjw8MykJLyogcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZSAqLworI2RlZmluZQlMT0dfTE9DQUwxCSgxNzw8MykJLyogcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZSAqLworI2RlZmluZQlMT0dfTE9DQUwyCSgxODw8MykJLyogcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZSAqLworI2RlZmluZQlMT0dfTE9DQUwzCSgxOTw8MykJLyogcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZSAqLworI2RlZmluZQlMT0dfTE9DQUw0CSgyMDw8MykJLyogcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZSAqLworI2RlZmluZQlMT0dfTE9DQUw1CSgyMTw8MykJLyogcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZSAqLworI2RlZmluZQlMT0dfTE9DQUw2CSgyMjw8MykJLyogcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZSAqLworI2RlZmluZQlMT0dfTE9DQUw3CSgyMzw8MykJLyogcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZSAqLworCisjZGVmaW5lCUxPR19ORkFDSUxJVElFUwkyNAkvKiBjdXJyZW50IG51bWJlciBvZiBmYWNpbGl0aWVzICovCisjZGVmaW5lCUxPR19GQUNNQVNLCTB4MDNmOAkvKiBtYXNrIHRvIGV4dHJhY3QgZmFjaWxpdHkgcGFydCAqLworCQkJCS8qIGZhY2lsaXR5IG9mIHByaSAqLworI2RlZmluZQlMT0dfRkFDKHApCSgoKHApICYgTE9HX0ZBQ01BU0spID4+IDMpCisKKyNpZmRlZiBTWVNMT0dfTkFNRVMKK0NPREUgZmFjaWxpdHluYW1lc1tdID0KKyAgeworICAgIHsgImF1dGgiLCBMT0dfQVVUSCB9LAorICAgIHsgImF1dGhwcml2IiwgTE9HX0FVVEhQUklWIH0sCisgICAgeyAiY3JvbiIsIExPR19DUk9OIH0sCisgICAgeyAiZGFlbW9uIiwgTE9HX0RBRU1PTiB9LAorICAgIHsgImZ0cCIsIExPR19GVFAgfSwKKyAgICB7ICJrZXJuIiwgTE9HX0tFUk4gfSwKKyAgICB7ICJscHIiLCBMT0dfTFBSIH0sCisgICAgeyAibWFpbCIsIExPR19NQUlMIH0sCisgICAgeyAibWFyayIsIElOVEVSTkFMX01BUksgfSwJCS8qIElOVEVSTkFMICovCisgICAgeyAibmV3cyIsIExPR19ORVdTIH0sCisgICAgeyAic2VjdXJpdHkiLCBMT0dfQVVUSCB9LAkJLyogREVQUkVDQVRFRCAqLworICAgIHsgInN5c2xvZyIsIExPR19TWVNMT0cgfSwKKyAgICB7ICJ1c2VyIiwgTE9HX1VTRVIgfSwKKyAgICB7ICJ1dWNwIiwgTE9HX1VVQ1AgfSwKKyAgICB7ICJsb2NhbDAiLCBMT0dfTE9DQUwwIH0sCisgICAgeyAibG9jYWwxIiwgTE9HX0xPQ0FMMSB9LAorICAgIHsgImxvY2FsMiIsIExPR19MT0NBTDIgfSwKKyAgICB7ICJsb2NhbDMiLCBMT0dfTE9DQUwzIH0sCisgICAgeyAibG9jYWw0IiwgTE9HX0xPQ0FMNCB9LAorICAgIHsgImxvY2FsNSIsIExPR19MT0NBTDUgfSwKKyAgICB7ICJsb2NhbDYiLCBMT0dfTE9DQUw2IH0sCisgICAgeyAibG9jYWw3IiwgTE9HX0xPQ0FMNyB9LAorICAgIHsgTlVMTCwgLTEgfQorICB9OworI2VuZGlmCisKKy8qCisgKiBhcmd1bWVudHMgdG8gc2V0bG9nbWFzay4KKyAqLworI2RlZmluZQlMT0dfTUFTSyhwcmkpCSgxIDw8IChwcmkpKQkJLyogbWFzayBmb3Igb25lIHByaW9yaXR5ICovCisjZGVmaW5lCUxPR19VUFRPKHByaSkJKCgxIDw8ICgocHJpKSsxKSkgLSAxKQkvKiBhbGwgcHJpb3JpdGllcyB0aHJvdWdoIHByaSAqLworCisvKgorICogT3B0aW9uIGZsYWdzIGZvciBvcGVubG9nLgorICoKKyAqIExPR19PREVMQVkgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuCisgKiBMT0dfTkRFTEFZIGlzIHRoZSBpbnZlcnNlIG9mIHdoYXQgaXQgdXNlZCB0byBiZS4KKyAqLworI2RlZmluZQlMT0dfUElECQkweDAxCS8qIGxvZyB0aGUgcGlkIHdpdGggZWFjaCBtZXNzYWdlICovCisjZGVmaW5lCUxPR19DT05TCTB4MDIJLyogbG9nIG9uIHRoZSBjb25zb2xlIGlmIGVycm9ycyBpbiBzZW5kaW5nICovCisjZGVmaW5lCUxPR19PREVMQVkJMHgwNAkvKiBkZWxheSBvcGVuIHVudGlsIGZpcnN0IHN5c2xvZygpIChkZWZhdWx0KSAqLworI2RlZmluZQlMT0dfTkRFTEFZCTB4MDgJLyogZG9uJ3QgZGVsYXkgb3BlbiAqLworI2RlZmluZQlMT0dfTk9XQUlUCTB4MTAJLyogZG9uJ3Qgd2FpdCBmb3IgY29uc29sZSBmb3JrczogREVQUkVDQVRFRCAqLworI2RlZmluZQlMT0dfUEVSUk9SCTB4MjAJLyogbG9nIHRvIHN0ZGVyciBhcyB3ZWxsICovCisKK19fQkVHSU5fREVDTFMKKworLyogQ2xvc2UgZGVzY3JpcHRvciB1c2VkIHRvIHdyaXRlIHRvIHN5c3RlbSBsb2dnZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgY2xvc2Vsb2cgKHZvaWQpOworCisvKiBPcGVuIGNvbm5lY3Rpb24gdG8gc3lzdGVtIGxvZ2dlci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBvcGVubG9nIChfX2NvbnN0IGNoYXIgKl9faWRlbnQsIGludCBfX29wdGlvbiwgaW50IF9fZmFjaWxpdHkpOworCisvKiBTZXQgdGhlIGxvZyBtYXNrIGxldmVsLiAgKi8KK2V4dGVybiBpbnQgc2V0bG9nbWFzayAoaW50IF9fbWFzaykgX19USFJPVzsKKworLyogR2VuZXJhdGUgYSBsb2cgbWVzc2FnZSB1c2luZyBGTVQgc3RyaW5nIGFuZCBvcHRpb24gYXJndW1lbnRzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIHN5c2xvZyAoaW50IF9fcHJpLCBfX2NvbnN0IGNoYXIgKl9fZm10LCAuLi4pCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAyLCAzKSkpOworCisjaWZkZWYgX19VU0VfQlNECisvKiBHZW5lcmF0ZSBhIGxvZyBtZXNzYWdlIHVzaW5nIEZNVCBhbmQgdXNpbmcgYXJndW1lbnRzIHBvaW50ZWQgdG8gYnkgQVAuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIHZzeXNsb2cgKGludCBfX3ByaSwgX19jb25zdCBjaGFyICpfX2ZtdCwgX19nbnVjX3ZhX2xpc3QgX19hcCkKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDIsIDApKSk7CisjZW5kaWYKKworCisvKiBEZWZpbmUgc29tZSBtYWNyb3MgaGVscGluZyB0byBjYXRjaCBidWZmZXIgb3ZlcmZsb3dzLiAgKi8KKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUKKyMgaW5jbHVkZSA8Yml0cy9zeXNsb2cuaD4KKyNlbmRpZgorI2lmZGVmIF9fTERCTF9DT01QQVQKKyMgaW5jbHVkZSA8Yml0cy9zeXNsb2ctbGRibC5oPgorI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvc3lzbG9nLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvc3lzbWFjcm9zLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3N5c21hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDBjOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3N5c21hY3Jvcy5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIERlZmluaXRpb25zIG9mIG1hY3JvcyB0byBhY2Nlc3MgYGRldl90JyB2YWx1ZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTksIDIwMDMsIDIwMDQsIDIwMDcsIDIwMTEKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU1lTTUFDUk9TX0gKKyNkZWZpbmUgX1NZU19TWVNNQUNST1NfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBJZiB0aGUgY29tcGlsZXIgZG9lcyBub3Qga25vdyBsb25nIGxvbmcgaXQgaXMgb3V0IG9mIGx1Y2suICBXZSBhcmUKKyAgIG5vdCBnb2luZyB0byBoYWNrIHdlaXJkIGhhY2tzIHRvIHN1cHBvcnQgdGhlIGRldl90IHJlcHJlc2VudGF0aW9uCisgICB0aGV5IG5lZWQuICAqLworI2lmZGVmIF9fR0xJQkNfSEFWRV9MT05HX0xPTkcKK19fQkVHSU5fREVDTFMKKworX19leHRlbnNpb25fXworZXh0ZXJuIHVuc2lnbmVkIGludCBnbnVfZGV2X21ham9yICh1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fZGV2KQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2NvbnN0X187CitfX2V4dGVuc2lvbl9fCitleHRlcm4gdW5zaWduZWQgaW50IGdudV9kZXZfbWlub3IgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX19kZXYpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfY29uc3RfXzsKK19fZXh0ZW5zaW9uX18KK2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IGdudV9kZXZfbWFrZWRldiAodW5zaWduZWQgaW50IF9fbWFqb3IsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgX19taW5vcikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9jb25zdF9fOworCisjIGlmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMiAmJiBkZWZpbmVkIF9fVVNFX0VYVEVSTl9JTkxJTkVTCitfX2V4dGVuc2lvbl9fIF9fZXh0ZXJuX2lubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIHVuc2lnbmVkIGludAorX19OVEggKGdudV9kZXZfbWFqb3IgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX19kZXYpKQoreworICByZXR1cm4gKChfX2RldiA+PiA4KSAmIDB4ZmZmKSB8ICgodW5zaWduZWQgaW50KSAoX19kZXYgPj4gMzIpICYgfjB4ZmZmKTsKK30KKworX19leHRlbnNpb25fXyBfX2V4dGVybl9pbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyB1bnNpZ25lZCBpbnQKK19fTlRIIChnbnVfZGV2X21pbm9yICh1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fZGV2KSkKK3sKKyAgcmV0dXJuIChfX2RldiAmIDB4ZmYpIHwgKCh1bnNpZ25lZCBpbnQpIChfX2RldiA+PiAxMikgJiB+MHhmZik7Cit9CisKK19fZXh0ZW5zaW9uX18gX19leHRlcm5faW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gdW5zaWduZWQgbG9uZyBsb25nIGludAorX19OVEggKGdudV9kZXZfbWFrZWRldiAodW5zaWduZWQgaW50IF9fbWFqb3IsIHVuc2lnbmVkIGludCBfX21pbm9yKSkKK3sKKyAgcmV0dXJuICgoX19taW5vciAmIDB4ZmYpIHwgKChfX21ham9yICYgMHhmZmYpIDw8IDgpCisJICB8ICgoKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIChfX21pbm9yICYgfjB4ZmYpKSA8PCAxMikKKwkgIHwgKCgodW5zaWduZWQgbG9uZyBsb25nIGludCkgKF9fbWFqb3IgJiB+MHhmZmYpKSA8PCAzMikpOworfQorIyBlbmRpZgorX19FTkRfREVDTFMKKworLyogQWNjZXNzIHRoZSBmdW5jdGlvbnMgd2l0aCB0aGVpciB0cmFkaXRpb25hbCBuYW1lcy4gICovCisjIGRlZmluZSBtYWpvcihkZXYpIGdudV9kZXZfbWFqb3IgKGRldikKKyMgZGVmaW5lIG1pbm9yKGRldikgZ251X2Rldl9taW5vciAoZGV2KQorIyBkZWZpbmUgbWFrZWRldihtYWosIG1pbikgZ251X2Rldl9tYWtlZGV2IChtYWosIG1pbikKKyNlbmRpZgorCisjZW5kaWYgLyogc3lzL3N5c21hY3Jvcy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Rlcm1pb3MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdGVybWlvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMTg4MDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Rlcm1pb3MuaApAQCAtMCwwICsxLDQgQEAKKyNpZm5kZWYgX1NZU19URVJNSU9TX0gKKyNkZWZpbmUgX1NZU19URVJNSU9TX0gKKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdGltZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy90aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlY2Y2MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdGltZS5oCkBAIC0wLDAgKzEsMTkzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NCwxOTk2LTIwMDMsMjAwNSwyMDA2LDIwMDkKKwlGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1RJTUVfSAorI2RlZmluZSBfU1lTX1RJTUVfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorI2RlZmluZSBfX25lZWRfdGltZV90CisjaW5jbHVkZSA8dGltZS5oPgorI2RlZmluZSBfX25lZWRfdGltZXZhbAorI2luY2x1ZGUgPGJpdHMvdGltZS5oPgorCisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorCisjaWZuZGVmIF9fc3VzZWNvbmRzX3RfZGVmaW5lZAordHlwZWRlZiBfX3N1c2Vjb25kc190IHN1c2Vjb25kc190OworIyBkZWZpbmUgX19zdXNlY29uZHNfdF9kZWZpbmVkCisjZW5kaWYKKworCitfX0JFR0lOX0RFQ0xTCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIE1hY3JvcyBmb3IgY29udmVydGluZyBiZXR3ZWVuIGBzdHJ1Y3QgdGltZXZhbCcgYW5kIGBzdHJ1Y3QgdGltZXNwZWMnLiAgKi8KKyMgZGVmaW5lIFRJTUVWQUxfVE9fVElNRVNQRUModHYsIHRzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh0cyktPnR2X3NlYyA9ICh0diktPnR2X3NlYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh0cyktPnR2X25zZWMgPSAodHYpLT50dl91c2VjICogMTAwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjIGRlZmluZSBUSU1FU1BFQ19UT19USU1FVkFMKHR2LCB0cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAodHYpLT50dl9zZWMgPSAodHMpLT50dl9zZWM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAodHYpLT50dl91c2VjID0gKHRzKS0+dHZfbnNlYyAvIDEwMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0JTRAorLyogU3RydWN0dXJlIGNydWRlbHkgcmVwcmVzZW50aW5nIGEgdGltZXpvbmUuCisgICBUaGlzIGlzIG9ic29sZXRlIGFuZCBzaG91bGQgbmV2ZXIgYmUgdXNlZC4gICovCitzdHJ1Y3QgdGltZXpvbmUKKyAgeworICAgIGludCB0el9taW51dGVzd2VzdDsJCS8qIE1pbnV0ZXMgd2VzdCBvZiBHTVQuICAqLworICAgIGludCB0el9kc3R0aW1lOwkJLyogTm9uemVybyBpZiBEU1QgaXMgZXZlciBpbiBlZmZlY3QuICAqLworICB9OworCit0eXBlZGVmIHN0cnVjdCB0aW1lem9uZSAqX19yZXN0cmljdCBfX3RpbWV6b25lX3B0cl90OworI2Vsc2UKK3R5cGVkZWYgdm9pZCAqX19yZXN0cmljdCBfX3RpbWV6b25lX3B0cl90OworI2VuZGlmCisKKy8qIEdldCB0aGUgY3VycmVudCB0aW1lIG9mIGRheSBhbmQgdGltZXpvbmUgaW5mb3JtYXRpb24sCisgICBwdXR0aW5nIGl0IGludG8gKlRWIGFuZCAqVFouICBJZiBUWiBpcyBOVUxMLCAqVFogaXMgbm90IGZpbGxlZC4KKyAgIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcnMuCisgICBOT1RFOiBUaGlzIGZvcm0gb2YgdGltZXpvbmUgaW5mb3JtYXRpb24gaXMgb2Jzb2xldGUuCisgICBVc2UgdGhlIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGRlY2xhcmVkIGluIDx0aW1lLmg+IGluc3RlYWQuICAqLworZXh0ZXJuIGludCBnZXR0aW1lb2ZkYXkgKHN0cnVjdCB0aW1ldmFsICpfX3Jlc3RyaWN0IF9fdHYsCisJCQkgX190aW1lem9uZV9wdHJfdCBfX3R6KSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmZGVmIF9fVVNFX0JTRAorLyogU2V0IHRoZSBjdXJyZW50IHRpbWUgb2YgZGF5IGFuZCB0aW1lem9uZSBpbmZvcm1hdGlvbi4KKyAgIFRoaXMgY2FsbCBpcyByZXN0cmljdGVkIHRvIHRoZSBzdXBlci11c2VyLiAgKi8KK2V4dGVybiBpbnQgc2V0dGltZW9mZGF5IChfX2NvbnN0IHN0cnVjdCB0aW1ldmFsICpfX3R2LAorCQkJIF9fY29uc3Qgc3RydWN0IHRpbWV6b25lICpfX3R6KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogQWRqdXN0IHRoZSBjdXJyZW50IHRpbWUgb2YgZGF5IGJ5IHRoZSBhbW91bnQgaW4gREVMVEEuCisgICBJZiBPTERERUxUQSBpcyBub3QgTlVMTCwgaXQgaXMgZmlsbGVkIGluIHdpdGggdGhlIGFtb3VudAorICAgb2YgdGltZSBhZGp1c3RtZW50IHJlbWFpbmluZyB0byBiZSBkb25lIGZyb20gdGhlIGxhc3QgYGFkanRpbWUnIGNhbGwuCisgICBUaGlzIGNhbGwgaXMgcmVzdHJpY3RlZCB0byB0aGUgc3VwZXItdXNlci4gICovCitleHRlcm4gaW50IGFkanRpbWUgKF9fY29uc3Qgc3RydWN0IHRpbWV2YWwgKl9fZGVsdGEsCisJCSAgICBzdHJ1Y3QgdGltZXZhbCAqX19vbGRkZWx0YSkgX19USFJPVzsKKyNlbmRpZgorCisKKy8qIFZhbHVlcyBmb3IgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGBnZXRpdGltZXInIGFuZCBgc2V0aXRpbWVyJy4gICovCitlbnVtIF9faXRpbWVyX3doaWNoCisgIHsKKyAgICAvKiBUaW1lcnMgcnVuIGluIHJlYWwgdGltZS4gICovCisgICAgSVRJTUVSX1JFQUwgPSAwLAorI2RlZmluZSBJVElNRVJfUkVBTCBJVElNRVJfUkVBTAorICAgIC8qIFRpbWVycyBydW4gb25seSB3aGVuIHRoZSBwcm9jZXNzIGlzIGV4ZWN1dGluZy4gICovCisgICAgSVRJTUVSX1ZJUlRVQUwgPSAxLAorI2RlZmluZSBJVElNRVJfVklSVFVBTCBJVElNRVJfVklSVFVBTAorICAgIC8qIFRpbWVycyBydW4gd2hlbiB0aGUgcHJvY2VzcyBpcyBleGVjdXRpbmcgYW5kIHdoZW4KKyAgICAgICB0aGUgc3lzdGVtIGlzIGV4ZWN1dGluZyBvbiBiZWhhbGYgb2YgdGhlIHByb2Nlc3MuICAqLworICAgIElUSU1FUl9QUk9GID0gMgorI2RlZmluZSBJVElNRVJfUFJPRiBJVElNRVJfUFJPRgorICB9OworCisvKiBUeXBlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGdldGl0aW1lcicgYW5kCisgICB0aGUgc2Vjb25kIGFuZCB0aGlyZCBhcmd1bWVudHMgYHNldGl0aW1lcicuICAqLworc3RydWN0IGl0aW1lcnZhbAorICB7CisgICAgLyogVmFsdWUgdG8gcHV0IGludG8gYGl0X3ZhbHVlJyB3aGVuIHRoZSB0aW1lciBleHBpcmVzLiAgKi8KKyAgICBzdHJ1Y3QgdGltZXZhbCBpdF9pbnRlcnZhbDsKKyAgICAvKiBUaW1lIHRvIHRoZSBuZXh0IHRpbWVyIGV4cGlyYXRpb24uICAqLworICAgIHN0cnVjdCB0aW1ldmFsIGl0X3ZhbHVlOworICB9OworCisjaWYgZGVmaW5lZCBfX1VTRV9HTlUgJiYgIWRlZmluZWQgX19jcGx1c3BsdXMKKy8qIFVzZSB0aGUgbmljZXIgcGFyYW1ldGVyIHR5cGUgb25seSBpbiBHTlUgbW9kZSBhbmQgbm90IGZvciBDKysgc2luY2UgdGhlCisgICBzdHJpY3QgQysrIHJ1bGVzIHByZXZlbnQgdGhlIGF1dG9tYXRpYyBwcm9tb3Rpb24uICAqLwordHlwZWRlZiBlbnVtIF9faXRpbWVyX3doaWNoIF9faXRpbWVyX3doaWNoX3Q7CisjZWxzZQordHlwZWRlZiBpbnQgX19pdGltZXJfd2hpY2hfdDsKKyNlbmRpZgorCisvKiBTZXQgKlZBTFVFIHRvIHRoZSBjdXJyZW50IHNldHRpbmcgb2YgdGltZXIgV0hJQ0guCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcnMuICAqLworZXh0ZXJuIGludCBnZXRpdGltZXIgKF9faXRpbWVyX3doaWNoX3QgX193aGljaCwKKwkJICAgICAgc3RydWN0IGl0aW1lcnZhbCAqX192YWx1ZSkgX19USFJPVzsKKworLyogU2V0IHRoZSB0aW1lciBXSElDSCB0byAqTkVXLiAgSWYgT0xEIGlzIG5vdCBOVUxMLAorICAgc2V0ICpPTEQgdG8gdGhlIG9sZCB2YWx1ZSBvZiB0aW1lciBXSElDSC4KKyAgIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcnMuICAqLworZXh0ZXJuIGludCBzZXRpdGltZXIgKF9faXRpbWVyX3doaWNoX3QgX193aGljaCwKKwkJICAgICAgX19jb25zdCBzdHJ1Y3QgaXRpbWVydmFsICpfX3Jlc3RyaWN0IF9fbmV3LAorCQkgICAgICBzdHJ1Y3QgaXRpbWVydmFsICpfX3Jlc3RyaWN0IF9fb2xkKSBfX1RIUk9XOworCisvKiBDaGFuZ2UgdGhlIGFjY2VzcyB0aW1lIG9mIEZJTEUgdG8gVFZQWzBdIGFuZCB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YKKyAgIEZJTEUgdG8gVFZQWzFdLiAgSWYgVFZQIGlzIGEgbnVsbCBwb2ludGVyLCB1c2UgdGhlIGN1cnJlbnQgdGltZSBpbnN0ZWFkLgorICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9ycy4gICovCitleHRlcm4gaW50IHV0aW1lcyAoX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fY29uc3Qgc3RydWN0IHRpbWV2YWwgX190dnBbMl0pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjaWZkZWYgX19VU0VfQlNECisvKiBTYW1lIGFzIGB1dGltZXMnLCBidXQgZG9lcyBub3QgZm9sbG93IHN5bWJvbGljIGxpbmtzLiAgKi8KK2V4dGVybiBpbnQgbHV0aW1lcyAoX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fY29uc3Qgc3RydWN0IHRpbWV2YWwgX190dnBbMl0pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBTYW1lIGFzIGB1dGltZXMnLCBidXQgdGFrZXMgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IgaW5zdGVhZCBvZiBhIG5hbWUuICAqLworZXh0ZXJuIGludCBmdXRpbWVzIChpbnQgX19mZCwgX19jb25zdCBzdHJ1Y3QgdGltZXZhbCBfX3R2cFsyXSkgX19USFJPVzsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisvKiBDaGFuZ2UgdGhlIGFjY2VzcyB0aW1lIG9mIEZJTEUgcmVsYXRpdmUgdG8gRkQgdG8gVFZQWzBdIGFuZCB0aGUKKyAgIG1vZGlmaWNhdGlvbiB0aW1lIG9mIEZJTEUgdG8gVFZQWzFdLiAgSWYgVFZQIGlzIGEgbnVsbCBwb2ludGVyLCB1c2UKKyAgIHRoZSBjdXJyZW50IHRpbWUgaW5zdGVhZC4gIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcnMuICAqLworZXh0ZXJuIGludCBmdXRpbWVzYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fZmlsZSwKKwkJICAgICAgX19jb25zdCBzdHJ1Y3QgdGltZXZhbCBfX3R2cFsyXSkgX19USFJPVzsKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIENvbnZlbmllbmNlIG1hY3JvcyBmb3Igb3BlcmF0aW9ucyBvbiB0aW1ldmFscy4KKyAgIE5PVEU6IGB0aW1lcmNtcCcgZG9lcyBub3Qgd29yayBmb3IgPj0gb3IgPD0uICAqLworIyBkZWZpbmUgdGltZXJpc3NldCh0dnApCSgodHZwKS0+dHZfc2VjIHx8ICh0dnApLT50dl91c2VjKQorIyBkZWZpbmUgdGltZXJjbGVhcih0dnApCSgodHZwKS0+dHZfc2VjID0gKHR2cCktPnR2X3VzZWMgPSAwKQorIyBkZWZpbmUgdGltZXJjbXAoYSwgYiwgQ01QKSAJCQkJCQkgICAgICBcCisgICgoKGEpLT50dl9zZWMgPT0gKGIpLT50dl9zZWMpID8gCQkJCQkgICAgICBcCisgICAoKGEpLT50dl91c2VjIENNUCAoYiktPnR2X3VzZWMpIDogCQkJCQkgICAgICBcCisgICAoKGEpLT50dl9zZWMgQ01QIChiKS0+dHZfc2VjKSkKKyMgZGVmaW5lIHRpbWVyYWRkKGEsIGIsIHJlc3VsdCkJCQkJCQkgICAgICBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgKHJlc3VsdCktPnR2X3NlYyA9IChhKS0+dHZfc2VjICsgKGIpLT50dl9zZWM7CQkJICAgICAgXAorICAgIChyZXN1bHQpLT50dl91c2VjID0gKGEpLT50dl91c2VjICsgKGIpLT50dl91c2VjOwkJCSAgICAgIFwKKyAgICBpZiAoKHJlc3VsdCktPnR2X3VzZWMgPj0gMTAwMDAwMCkJCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisJKysocmVzdWx0KS0+dHZfc2VjOwkJCQkJCSAgICAgIFwKKwkocmVzdWx0KS0+dHZfdXNlYyAtPSAxMDAwMDAwOwkJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIHRpbWVyc3ViKGEsIGIsIHJlc3VsdCkJCQkJCQkgICAgICBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgKHJlc3VsdCktPnR2X3NlYyA9IChhKS0+dHZfc2VjIC0gKGIpLT50dl9zZWM7CQkJICAgICAgXAorICAgIChyZXN1bHQpLT50dl91c2VjID0gKGEpLT50dl91c2VjIC0gKGIpLT50dl91c2VjOwkJCSAgICAgIFwKKyAgICBpZiAoKHJlc3VsdCktPnR2X3VzZWMgPCAwKSB7CQkJCQkgICAgICBcCisgICAgICAtLShyZXN1bHQpLT50dl9zZWM7CQkJCQkJICAgICAgXAorICAgICAgKHJlc3VsdCktPnR2X3VzZWMgKz0gMTAwMDAwMDsJCQkJCSAgICAgIFwKKyAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorI2VuZGlmCS8qIEJTRCAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3RpbWUuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy90aW1lYi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy90aW1lYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZGJmNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3RpbWViLmgKQEAgLTAsMCArMSw0NiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfVElNRUJfSAorI2RlZmluZSBfU1lTX1RJTUVCX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2RlZmluZSBfX25lZWRfdGltZV90CisjaW5jbHVkZSA8dGltZS5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogU3RydWN0dXJlIHJldHVybmVkIGJ5IHRoZSBgZnRpbWUnIGZ1bmN0aW9uLiAgKi8KKworc3RydWN0IHRpbWViCisgIHsKKyAgICB0aW1lX3QgdGltZTsJCS8qIFNlY29uZHMgc2luY2UgZXBvY2gsIGFzIGZyb20gYHRpbWUnLiAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgbWlsbGl0bTsJLyogQWRkaXRpb25hbCBtaWxsaXNlY29uZHMuICAqLworICAgIHNob3J0IGludCB0aW1lem9uZTsJCS8qIE1pbnV0ZXMgd2VzdCBvZiBHTVQuICAqLworICAgIHNob3J0IGludCBkc3RmbGFnOwkJLyogTm9uemVybyBpZiBEYXlsaWdodCBTYXZpbmdzIFRpbWUgdXNlZC4gICovCisgIH07CisKKy8qIEZpbGwgaW4gVElNRUJVRiB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHRpbWUuICAqLworCitleHRlcm4gaW50IGZ0aW1lIChzdHJ1Y3QgdGltZWIgKl9fdGltZWJ1Zik7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvdGltZWIuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy90aW1lcmZkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3RpbWVyZmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWJiMDZmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy90aW1lcmZkLmgKQEAgLTAsMCArMSw2MCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfVElNRVJGRF9ICisjZGVmaW5lCV9TWVNfVElNRVJGRF9ICTEKKworI2luY2x1ZGUgPHRpbWUuaD4KKworCisvKiBCaXRzIHRvIGJlIHNldCBpbiB0aGUgRkxBR1MgcGFyYW1ldGVyIG9mIGB0aW1lcmZkX2NyZWF0ZScuICAqLworZW51bQorICB7CisgICAgVEZEX0NMT0VYRUMgPSAwMjAwMDAwMCwKKyNkZWZpbmUgVEZEX0NMT0VYRUMgVEZEX0NMT0VYRUMKKyAgICBURkRfTk9OQkxPQ0sgPSAwNDAwMAorI2RlZmluZSBURkRfTk9OQkxPQ0sgVEZEX05PTkJMT0NLCisgIH07CisKKworLyogQml0cyB0byBiZSBzZXQgaW4gdGhlIEZMQUdTIHBhcmFtZXRlciBvZiBgdGltZXJmZF9zZXR0aW1lJy4gICovCitlbnVtCisgIHsKKyAgICBURkRfVElNRVJfQUJTVElNRSA9IDEgPDwgMAorI2RlZmluZSBURkRfVElNRVJfQUJTVElNRSBURkRfVElNRVJfQUJTVElNRQorICB9OworCisKK19fQkVHSU5fREVDTFMKKworLyogUmV0dXJuIGZpbGUgZGVzY3JpcHRvciBmb3IgbmV3IGludGVydmFsIHRpbWVyIHNvdXJjZS4gICovCitleHRlcm4gaW50IHRpbWVyZmRfY3JlYXRlIChjbG9ja2lkX3QgX19jbG9ja19pZCwgaW50IF9fZmxhZ3MpIF9fVEhST1c7CisKKy8qIFNldCBuZXh0IGV4cGlyYXRpb24gdGltZSBvZiBpbnRlcnZhbCB0aW1lciBzb3VyY2UgVUZEIHRvIFVUTVIuICBJZgorICAgRkxBR1MgaGFzIHRoZSBURkRfVElNRVJfQUJTVElNRSBmbGFnIHNldCB0aGUgdGltZW91dCB2YWx1ZSBpcworICAgYWJzb2x1dGUuICBPcHRpb25hbGx5IHJldHVybiB0aGUgb2xkIGV4cGlyYXRpb24gdGltZSBpbiBPVE1SLiAgKi8KK2V4dGVybiBpbnQgdGltZXJmZF9zZXR0aW1lIChpbnQgX191ZmQsIGludCBfX2ZsYWdzLAorCQkJICAgIF9fY29uc3Qgc3RydWN0IGl0aW1lcnNwZWMgKl9fdXRtciwKKwkJCSAgICBzdHJ1Y3QgaXRpbWVyc3BlYyAqX19vdG1yKSBfX1RIUk9XOworCisvKiBSZXR1cm4gdGhlIG5leHQgZXhwaXJhdGlvbiB0aW1lIG9mIFVGRC4gICovCitleHRlcm4gaW50IHRpbWVyZmRfZ2V0dGltZSAoaW50IF9fdWZkLCBzdHJ1Y3QgaXRpbWVyc3BlYyAqX19vdG1yKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3RpbWVyZmQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy90aW1lcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy90aW1lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMjJmMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3RpbWVzLmgKQEAgLTAsMCArMSw1MyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTk2LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJUE9TSVggU3RhbmRhcmQ6IDQuNS4yIFByb2Nlc3MgVGltZXMJPHN5cy90aW1lcy5oPgorICovCisKKyNpZm5kZWYJX1NZU19USU1FU19ICisjZGVmaW5lCV9TWVNfVElNRVNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZGVmaW5lCV9fbmVlZF9jbG9ja190CisjaW5jbHVkZSA8dGltZS5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgQ1BVIHRpbWUgdXNlZCBieSBhIHByb2Nlc3MgYW5kIGl0cyBjaGlsZHJlbi4gICovCitzdHJ1Y3QgdG1zCisgIHsKKyAgICBjbG9ja190IHRtc191dGltZTsJCS8qIFVzZXIgQ1BVIHRpbWUuICAqLworICAgIGNsb2NrX3QgdG1zX3N0aW1lOwkJLyogU3lzdGVtIENQVSB0aW1lLiAgKi8KKworICAgIGNsb2NrX3QgdG1zX2N1dGltZTsJCS8qIFVzZXIgQ1BVIHRpbWUgb2YgZGVhZCBjaGlsZHJlbi4gICovCisgICAgY2xvY2tfdCB0bXNfY3N0aW1lOwkJLyogU3lzdGVtIENQVSB0aW1lIG9mIGRlYWQgY2hpbGRyZW4uICAqLworICB9OworCisKKy8qIFN0b3JlIHRoZSBDUFUgdGltZSB1c2VkIGJ5IHRoaXMgcHJvY2VzcyBhbmQgYWxsIGl0cworICAgZGVhZCBjaGlsZHJlbiAoYW5kIHRoZWlyIGRlYWQgY2hpbGRyZW4pIGluIEJVRkZFUi4KKyAgIFJldHVybiB0aGUgZWxhcHNlZCByZWFsIHRpbWUsIG9yIChjbG9ja190KSAtMSBmb3IgZXJyb3JzLgorICAgQWxsIHRpbWVzIGFyZSBpbiBDTEtfVENLdGhzIG9mIGEgc2Vjb25kLiAgKi8KK2V4dGVybiBjbG9ja190IHRpbWVzIChzdHJ1Y3QgdG1zICpfX2J1ZmZlcikgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy90aW1lcy5oCSovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3RpbWV4LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3RpbWV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU2MWJiNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdGltZXguaApAQCAtMCwwICsxLDcyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywxOTk5LDIwMDcsMjAwOSwyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfVElNRVhfSAorI2RlZmluZQlfU1lTX1RJTUVYX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisvKiBUaGVzZSBkZWZpbml0aW9ucyBmcm9tIGxpbnV4L3RpbWV4LmggYXMgb2YgMi42LjMwLiAgKi8KKworI2luY2x1ZGUgPGJpdHMvdGltZXguaD4KKworI2RlZmluZSBOVFBfQVBJCTQJLyogTlRQIEFQSSB2ZXJzaW9uICovCisKK3N0cnVjdCBudHB0aW1ldmFsCit7CisgIHN0cnVjdCB0aW1ldmFsIHRpbWU7CS8qIGN1cnJlbnQgdGltZSAocm8pICovCisgIGxvbmcgaW50IG1heGVycm9yOwkvKiBtYXhpbXVtIGVycm9yICh1cykgKHJvKSAqLworICBsb25nIGludCBlc3RlcnJvcjsJLyogZXN0aW1hdGVkIGVycm9yICh1cykgKHJvKSAqLworICBsb25nIGludCB0YWk7CQkvKiBUQUkgb2Zmc2V0IChybykgKi8KKworICBsb25nIGludCBfX3VudXNlZDE7CisgIGxvbmcgaW50IF9fdW51c2VkMjsKKyAgbG9uZyBpbnQgX191bnVzZWQzOworICBsb25nIGludCBfX3VudXNlZDQ7Cit9OworCisvKiBDbG9jayBzdGF0ZXMgKHRpbWVfc3RhdGUpICovCisjZGVmaW5lIFRJTUVfT0sJCTAJLyogY2xvY2sgc3luY2hyb25pemVkLCBubyBsZWFwIHNlY29uZCAqLworI2RlZmluZSBUSU1FX0lOUwkxCS8qIGluc2VydCBsZWFwIHNlY29uZCAqLworI2RlZmluZSBUSU1FX0RFTAkyCS8qIGRlbGV0ZSBsZWFwIHNlY29uZCAqLworI2RlZmluZSBUSU1FX09PUAkzCS8qIGxlYXAgc2Vjb25kIGluIHByb2dyZXNzICovCisjZGVmaW5lIFRJTUVfV0FJVAk0CS8qIGxlYXAgc2Vjb25kIGhhcyBvY2N1cnJlZCAqLworI2RlZmluZSBUSU1FX0VSUk9SCTUJLyogY2xvY2sgbm90IHN5bmNocm9uaXplZCAqLworI2RlZmluZSBUSU1FX0JBRAlUSU1FX0VSUk9SIC8qIGJ3IGNvbXBhdCAqLworCisvKiBNYXhpbXVtIHRpbWUgY29uc3RhbnQgb2YgdGhlIFBMTC4gICovCisjZGVmaW5lIE1BWFRDCQk2CisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIGludCBfX2FkanRpbWV4IChzdHJ1Y3QgdGltZXggKl9fbnR4KSBfX1RIUk9XOworZXh0ZXJuIGludCBhZGp0aW1leCAoc3RydWN0IHRpbWV4ICpfX250eCkgX19USFJPVzsKKworI2lmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChudHBfZ2V0dGltZSwgKHN0cnVjdCBudHB0aW1ldmFsICpfX250diksCisJCQkgICBudHBfZ2V0dGltZXgpOworI2Vsc2UKK2V4dGVybiBpbnQgbnRwX2dldHRpbWV4IChzdHJ1Y3QgbnRwdGltZXZhbCAqX19udHYpIF9fVEhST1c7CisjIGRlZmluZSBudHBfZ2V0dGltZSBudHBfZ2V0dGltZXgKKyNlbmRpZgorZXh0ZXJuIGludCBudHBfYWRqdGltZSAoc3RydWN0IHRpbWV4ICpfX3RudHgpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvdGltZXguaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy90dHljaGFycy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy90dHljaGFycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNDNmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3R0eWNoYXJzLmgKQEAgLTAsMCArMSw2MSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTAsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdHR5Y2hhcnMuaAk4LjIgKEJlcmtlbGV5KSAxLzQvOTQKKyAqLworCisvKgorICogNC4zIENPTVBBVElCSUxJVFkgRklMRQorICoKKyAqIFVzZXIgdmlzaWJsZSBzdHJ1Y3R1cmVzIGFuZCBjb25zdGFudHMgcmVsYXRlZCB0byB0ZXJtaW5hbCBoYW5kbGluZy4KKyAqLworI2lmbmRlZiBfU1lTX1RUWUNIQVJTX0gKKyNkZWZpbmUJX1NZU19UVFlDSEFSU19IIDEKKworc3RydWN0IHR0eWNoYXJzIHsKKwljaGFyCXRjX2VyYXNlOwkvKiBlcmFzZSBsYXN0IGNoYXJhY3RlciAqLworCWNoYXIJdGNfa2lsbDsJLyogZXJhc2UgZW50aXJlIGxpbmUgKi8KKwljaGFyCXRjX2ludHJjOwkvKiBpbnRlcnJ1cHQgKi8KKwljaGFyCXRjX3F1aXRjOwkvKiBxdWl0ICovCisJY2hhcgl0Y19zdGFydGM7CS8qIHN0YXJ0IG91dHB1dCAqLworCWNoYXIJdGNfc3RvcGM7CS8qIHN0b3Agb3V0cHV0ICovCisJY2hhcgl0Y19lb2ZjOwkvKiBlbmQtb2YtZmlsZSAqLworCWNoYXIJdGNfYnJrYzsJLyogaW5wdXQgZGVsaW1pdGVyIChsaWtlIG5sKSAqLworCWNoYXIJdGNfc3VzcGM7CS8qIHN0b3AgcHJvY2VzcyBzaWduYWwgKi8KKwljaGFyCXRjX2RzdXNwYzsJLyogZGVsYXllZCBzdG9wIHByb2Nlc3Mgc2lnbmFsICovCisJY2hhcgl0Y19ycHJudGM7CS8qIHJlcHJpbnQgbGluZSAqLworCWNoYXIJdGNfZmx1c2hjOwkvKiBmbHVzaCBvdXRwdXQgKHRvZ2dsZXMpICovCisJY2hhcgl0Y193ZXJhc2M7CS8qIHdvcmQgZXJhc2UgKi8KKwljaGFyCXRjX2xuZXh0YzsJLyogbGl0ZXJhbCBuZXh0IGNoYXJhY3RlciAqLworfTsKKworI2lmZGVmIF9fVVNFX09MRF9UVFkKKyNpbmNsdWRlIDxzeXMvdHR5ZGVmYXVsdHMuaD4JLyogdG8gcGljayB1cCBjaGFyYWN0ZXIgZGVmYXVsdHMgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogc3lzL3R0eWNoYXJzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdHR5ZGVmYXVsdHMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdHR5ZGVmYXVsdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmUxNjhiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy90dHlkZWZhdWx0cy5oCkBAIC0wLDAgKzEsMTAwIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAoYykgVU5JWCBTeXN0ZW0gTGFib3JhdG9yaWVzLCBJbmMuCisgKiBBbGwgb3Igc29tZSBwb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSBtYXRlcmlhbCBsaWNlbnNlZAorICogdG8gdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBieSBBbWVyaWNhbiBUZWxlcGhvbmUgYW5kIFRlbGVncmFwaAorICogQ28uIG9yIFVuaXggU3lzdGVtIExhYm9yYXRvcmllcywgSW5jLiBhbmQgYXJlIHJlcHJvZHVjZWQgaGVyZWluIHdpdGgKKyAqIHRoZSBwZXJtaXNzaW9uIG9mIFVOSVggU3lzdGVtIExhYm9yYXRvcmllcywgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdHR5ZGVmYXVsdHMuaAk4LjQgKEJlcmtlbGV5KSAxLzIxLzk0CisgKi8KKworLyoKKyAqIFN5c3RlbSB3aWRlIGRlZmF1bHRzIGZvciB0ZXJtaW5hbCBzdGF0ZS4gIExpbnV4IHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX1NZU19UVFlERUZBVUxUU19IXworI2RlZmluZQlfU1lTX1RUWURFRkFVTFRTX0hfCisKKy8qCisgKiBEZWZhdWx0cyBvbiAiZmlyc3QiIG9wZW4uCisgKi8KKyNkZWZpbmUJVFRZREVGX0lGTEFHCShCUktJTlQgfCBJU1RSSVAgfCBJQ1JOTCB8IElNQVhCRUwgfCBJWE9OIHwgSVhBTlkpCisjZGVmaW5lIFRUWURFRl9PRkxBRwkoT1BPU1QgfCBPTkxDUiB8IFhUQUJTKQorI2RlZmluZSBUVFlERUZfTEZMQUcJKEVDSE8gfCBJQ0FOT04gfCBJU0lHIHwgSUVYVEVOIHwgRUNIT0V8RUNIT0tFfEVDSE9DVEwpCisjZGVmaW5lIFRUWURFRl9DRkxBRwkoQ1JFQUQgfCBDUzcgfCBQQVJFTkIgfCBIVVBDTCkKKyNkZWZpbmUgVFRZREVGX1NQRUVECShCOTYwMCkKKworLyoKKyAqIENvbnRyb2wgQ2hhcmFjdGVyIERlZmF1bHRzCisgKi8KKyNkZWZpbmUgQ1RSTCh4KQkoeCYwMzcpCisjZGVmaW5lCUNFT0YJCUNUUkwoJ2QnKQorI2lmZGVmIF9QT1NJWF9WRElTQUJMRQorIyBkZWZpbmUgQ0VPTAkJX1BPU0lYX1ZESVNBQkxFCisjZWxzZQorIyBkZWZpbmUgQ0VPTAkJJ1wwJwkJLyogWFhYIGF2b2lkIF9QT1NJWF9WRElTQUJMRSAqLworI2VuZGlmCisjZGVmaW5lCUNFUkFTRQkJMDE3NworI2RlZmluZQlDSU5UUgkJQ1RSTCgnYycpCisjaWZkZWYgX1BPU0lYX1ZESVNBQkxFCisjIGRlZmluZSBDU1RBVFVTCV9QT1NJWF9WRElTQUJMRQorI2Vsc2UKKyMgZGVmaW5lIENTVEFUVVMJJ1wwJwkJLyogWFhYIGF2b2lkIF9QT1NJWF9WRElTQUJMRSAqLworI2VuZGlmCisjZGVmaW5lCUNLSUxMCQlDVFJMKCd1JykKKyNkZWZpbmUJQ01JTgkJMQorI2RlZmluZQlDUVVJVAkJMDM0CQkvKiBGUywgXlwgKi8KKyNkZWZpbmUJQ1NVU1AJCUNUUkwoJ3onKQorI2RlZmluZQlDVElNRQkJMAorI2RlZmluZQlDRFNVU1AJCUNUUkwoJ3knKQorI2RlZmluZQlDU1RBUlQJCUNUUkwoJ3EnKQorI2RlZmluZQlDU1RPUAkJQ1RSTCgncycpCisjZGVmaW5lCUNMTkVYVAkJQ1RSTCgndicpCisjZGVmaW5lCUNESVNDQVJEIAlDVFJMKCdvJykKKyNkZWZpbmUJQ1dFUkFTRSAJQ1RSTCgndycpCisjZGVmaW5lCUNSRVBSSU5UIAlDVFJMKCdyJykKKyNkZWZpbmUJQ0VPVAkJQ0VPRgorLyogY29tcGF0ICovCisjZGVmaW5lCUNCUksJCUNFT0wKKyNkZWZpbmUgQ1JQUk5UCQlDUkVQUklOVAorI2RlZmluZQlDRkxVU0gJCUNESVNDQVJECisKKy8qIFBST1RFQ1RFRCBJTkNMVVNJT04gRU5EUyBIRVJFICovCisjZW5kaWYgLyogIV9TWVNfVFRZREVGQVVMVFNfSF8gKi8KKworLyoKKyAqICNkZWZpbmUgVFRZREVGQ0hBUlMgdG8gaW5jbHVkZSBhbiBhcnJheSBvZiBkZWZhdWx0IGNvbnRyb2wgY2hhcmFjdGVycy4KKyAqLworI2lmZGVmIFRUWURFRkNIQVJTCitjY190CXR0eWRlZmNoYXJzW05DQ1NdID0geworCUNFT0YsCUNFT0wsCUNFT0wsCUNFUkFTRSwgQ1dFUkFTRSwgQ0tJTEwsIENSRVBSSU5ULAorCV9QT1NJWF9WRElTQUJMRSwgQ0lOVFIsCUNRVUlULAlDU1VTUCwJQ0RTVVNQLAlDU1RBUlQsCUNTVE9QLAlDTE5FWFQsCisJQ0RJU0NBUkQsIENNSU4sCUNUSU1FLCAgQ1NUQVRVUywgX1BPU0lYX1ZESVNBQkxFCit9OworI3VuZGVmIFRUWURFRkNIQVJTCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdHlwZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2U5MDg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy90eXBlcy5oCkBAIC0wLDAgKzEsMjc2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsMTk5MiwxOTk0LTIwMDIsMjAwNiwyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJUE9TSVggU3RhbmRhcmQ6IDIuNiBQcmltaXRpdmUgU3lzdGVtIERhdGEgVHlwZXMJPHN5cy90eXBlcy5oPgorICovCisKKyNpZm5kZWYJX1NZU19UWVBFU19ICisjZGVmaW5lCV9TWVNfVFlQRVNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKyNpZmRlZglfX1VTRV9CU0QKKyMgaWZuZGVmIF9fdV9jaGFyX2RlZmluZWQKK3R5cGVkZWYgX191X2NoYXIgdV9jaGFyOwordHlwZWRlZiBfX3Vfc2hvcnQgdV9zaG9ydDsKK3R5cGVkZWYgX191X2ludCB1X2ludDsKK3R5cGVkZWYgX191X2xvbmcgdV9sb25nOwordHlwZWRlZiBfX3F1YWRfdCBxdWFkX3Q7Cit0eXBlZGVmIF9fdV9xdWFkX3QgdV9xdWFkX3Q7Cit0eXBlZGVmIF9fZnNpZF90IGZzaWRfdDsKKyMgIGRlZmluZSBfX3VfY2hhcl9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYKKwordHlwZWRlZiBfX2xvZmZfdCBsb2ZmX3Q7CisKKyNpZm5kZWYgX19pbm9fdF9kZWZpbmVkCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0Cit0eXBlZGVmIF9faW5vX3QgaW5vX3Q7CisjIGVsc2UKK3R5cGVkZWYgX19pbm82NF90IGlub190OworIyBlbmRpZgorIyBkZWZpbmUgX19pbm9fdF9kZWZpbmVkCisjZW5kaWYKKyNpZiBkZWZpbmVkIF9fVVNFX0xBUkdFRklMRTY0ICYmICFkZWZpbmVkIF9faW5vNjRfdF9kZWZpbmVkCit0eXBlZGVmIF9faW5vNjRfdCBpbm82NF90OworIyBkZWZpbmUgX19pbm82NF90X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fZGV2X3RfZGVmaW5lZAordHlwZWRlZiBfX2Rldl90IGRldl90OworIyBkZWZpbmUgX19kZXZfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX2dpZF90X2RlZmluZWQKK3R5cGVkZWYgX19naWRfdCBnaWRfdDsKKyMgZGVmaW5lIF9fZ2lkX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX19tb2RlX3RfZGVmaW5lZAordHlwZWRlZiBfX21vZGVfdCBtb2RlX3Q7CisjIGRlZmluZSBfX21vZGVfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX25saW5rX3RfZGVmaW5lZAordHlwZWRlZiBfX25saW5rX3QgbmxpbmtfdDsKKyMgZGVmaW5lIF9fbmxpbmtfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX3VpZF90X2RlZmluZWQKK3R5cGVkZWYgX191aWRfdCB1aWRfdDsKKyMgZGVmaW5lIF9fdWlkX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX19vZmZfdF9kZWZpbmVkCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0Cit0eXBlZGVmIF9fb2ZmX3Qgb2ZmX3Q7CisjIGVsc2UKK3R5cGVkZWYgX19vZmY2NF90IG9mZl90OworIyBlbmRpZgorIyBkZWZpbmUgX19vZmZfdF9kZWZpbmVkCisjZW5kaWYKKyNpZiBkZWZpbmVkIF9fVVNFX0xBUkdFRklMRTY0ICYmICFkZWZpbmVkIF9fb2ZmNjRfdF9kZWZpbmVkCit0eXBlZGVmIF9fb2ZmNjRfdCBvZmY2NF90OworIyBkZWZpbmUgX19vZmY2NF90X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fcGlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3BpZF90IHBpZF90OworIyBkZWZpbmUgX19waWRfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmIChkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4KSBcCisgICAgJiYgIWRlZmluZWQgX19pZF90X2RlZmluZWQKK3R5cGVkZWYgX19pZF90IGlkX3Q7CisjIGRlZmluZSBfX2lkX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX19zc2l6ZV90X2RlZmluZWQKK3R5cGVkZWYgX19zc2l6ZV90IHNzaXplX3Q7CisjIGRlZmluZSBfX3NzaXplX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZmRlZglfX1VTRV9CU0QKKyMgaWZuZGVmIF9fZGFkZHJfdF9kZWZpbmVkCit0eXBlZGVmIF9fZGFkZHJfdCBkYWRkcl90OwordHlwZWRlZiBfX2NhZGRyX3QgY2FkZHJfdDsKKyMgIGRlZmluZSBfX2RhZGRyX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCisKKyNpZiAoZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4pICYmICFkZWZpbmVkIF9fa2V5X3RfZGVmaW5lZAordHlwZWRlZiBfX2tleV90IGtleV90OworIyBkZWZpbmUgX19rZXlfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAorIyBkZWZpbmUgX19uZWVkX2Nsb2NrX3QKKyNlbmRpZgorI2RlZmluZQlfX25lZWRfdGltZV90CisjZGVmaW5lIF9fbmVlZF90aW1lcl90CisjZGVmaW5lIF9fbmVlZF9jbG9ja2lkX3QKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZmRlZiBfX1VTRV9YT1BFTgorIyBpZm5kZWYgX191c2Vjb25kc190X2RlZmluZWQKK3R5cGVkZWYgX191c2Vjb25kc190IHVzZWNvbmRzX3Q7CisjICBkZWZpbmUgX191c2Vjb25kc190X2RlZmluZWQKKyMgZW5kaWYKKyMgaWZuZGVmIF9fc3VzZWNvbmRzX3RfZGVmaW5lZAordHlwZWRlZiBfX3N1c2Vjb25kc190IHN1c2Vjb25kc190OworIyAgZGVmaW5lIF9fc3VzZWNvbmRzX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUJX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaWZkZWYgX19VU0VfTUlTQworLyogT2xkIGNvbXBhdGliaWxpdHkgbmFtZXMgZm9yIEMgdHlwZXMuICAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCB1bG9uZzsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IHVzaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQ7CisjZW5kaWYKKworLyogVGhlc2Ugc2l6ZS1zcGVjaWZpYyBuYW1lcyBhcmUgdXNlZCBieSBzb21lIG9mIHRoZSBpbmV0IGNvZGUuICAqLworCisjaWYgIV9fR05VQ19QUkVSRVEgKDIsIDcpCisKKy8qIFRoZXNlIHR5cGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBJU08gQzk5IGhlYWRlciA8aW50dHlwZXMuaD4uICovCisjIGlmbmRlZiBfX2ludDhfdF9kZWZpbmVkCisjICBkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAordHlwZWRlZgljaGFyIGludDhfdDsKK3R5cGVkZWYJc2hvcnQgaW50IGludDE2X3Q7Cit0eXBlZGVmCWludCBpbnQzMl90OworIyAgaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiBsb25nIGludCBpbnQ2NF90OworIyAgZWxpZiBfX0dMSUJDX0hBVkVfTE9OR19MT05HCitfX2V4dGVuc2lvbl9fIHR5cGVkZWYgbG9uZyBsb25nIGludCBpbnQ2NF90OworIyAgZW5kaWYKKyMgZW5kaWYKKworLyogQnV0IHRoZXNlIHdlcmUgZGVmaW5lZCBieSBJU08gQyB3aXRob3V0IHRoZSBmaXJzdCBgXycuICAqLwordHlwZWRlZgl1bnNpZ25lZCBjaGFyIHVfaW50OF90OwordHlwZWRlZgl1bnNpZ25lZCBzaG9ydCBpbnQgdV9pbnQxNl90OwordHlwZWRlZgl1bnNpZ25lZCBpbnQgdV9pbnQzMl90OworIyBpZiBfX1dPUkRTSVpFID09IDY0Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHVfaW50NjRfdDsKKyMgZWxpZiBfX0dMSUJDX0hBVkVfTE9OR19MT05HCitfX2V4dGVuc2lvbl9fIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCB1X2ludDY0X3Q7CisjIGVuZGlmCisKK3R5cGVkZWYgaW50IHJlZ2lzdGVyX3Q7CisKKyNlbHNlCisKKy8qIEZvciBHQ0MgMi43IGFuZCBsYXRlciwgd2UgY2FuIHVzZSBzcGVjaWZpYyB0eXBlLXNpemUgYXR0cmlidXRlcy4gICovCisjIGRlZmluZSBfX2ludE5fdChOLCBNT0RFKSBcCisgIHR5cGVkZWYgaW50IGludCMjTiMjX3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChNT0RFKSkpCisjIGRlZmluZSBfX3VfaW50Tl90KE4sIE1PREUpIFwKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgdV9pbnQjI04jI190IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoTU9ERSkpKQorCisjIGlmbmRlZiBfX2ludDhfdF9kZWZpbmVkCisjICBkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAorX19pbnROX3QgKDgsIF9fUUlfXyk7CitfX2ludE5fdCAoMTYsIF9fSElfXyk7CitfX2ludE5fdCAoMzIsIF9fU0lfXyk7CitfX2ludE5fdCAoNjQsIF9fRElfXyk7CisjIGVuZGlmCisKK19fdV9pbnROX3QgKDgsIF9fUUlfXyk7CitfX3VfaW50Tl90ICgxNiwgX19ISV9fKTsKK19fdV9pbnROX3QgKDMyLCBfX1NJX18pOworX191X2ludE5fdCAoNjQsIF9fRElfXyk7CisKK3R5cGVkZWYgaW50IHJlZ2lzdGVyX3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX3dvcmRfXykpKTsKKworCisvKiBTb21lIGNvZGUgZnJvbSBCSU5EIHRlc3RzIHRoaXMgbWFjcm8gdG8gc2VlIGlmIHRoZSB0eXBlcyBhYm92ZSBhcmUKKyAgIGRlZmluZWQuICAqLworI2VuZGlmCisjZGVmaW5lIF9fQklUX1RZUEVTX0RFRklORURfXwkxCisKKworI2lmZGVmCV9fVVNFX0JTRAorLyogSW4gQlNEIDxzeXMvdHlwZXMuaD4gaXMgZXhwZWN0ZWQgdG8gZGVmaW5lIEJZVEVfT1JERVIuICAqLworIyBpbmNsdWRlIDxlbmRpYW4uaD4KKworLyogSXQgYWxzbyBkZWZpbmVzIGBmZF9zZXQnIGFuZCB0aGUgRkRfKiBtYWNyb3MgZm9yIGBzZWxlY3QnLiAgKi8KKyMgaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorCisvKiBCU0QgZGVmaW5lcyB0aGVzZSBzeW1ib2xzLCBzbyB3ZSBmb2xsb3cuICAqLworIyBpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CisjZW5kaWYgLyogVXNlIEJTRC4gICovCisKKworI2lmIChkZWZpbmVkIF9fVVNFX1VOSVg5OCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4KSBcCisgICAgJiYgIWRlZmluZWQgX19ibGtzaXplX3RfZGVmaW5lZAordHlwZWRlZiBfX2Jsa3NpemVfdCBibGtzaXplX3Q7CisjIGRlZmluZSBfX2Jsa3NpemVfdF9kZWZpbmVkCisjZW5kaWYKKworLyogVHlwZXMgZnJvbSB0aGUgTGFyZ2UgRmlsZSBTdXBwb3J0IGludGVyZmFjZS4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyMgaWZuZGVmIF9fYmxrY250X3RfZGVmaW5lZAordHlwZWRlZiBfX2Jsa2NudF90IGJsa2NudF90OwkgLyogVHlwZSB0byBjb3VudCBudW1iZXIgb2YgZGlzayBibG9ja3MuICAqLworIyAgZGVmaW5lIF9fYmxrY250X3RfZGVmaW5lZAorIyBlbmRpZgorIyBpZm5kZWYgX19mc2Jsa2NudF90X2RlZmluZWQKK3R5cGVkZWYgX19mc2Jsa2NudF90IGZzYmxrY250X3Q7IC8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gYmxvY2tzLiAgKi8KKyMgIGRlZmluZSBfX2ZzYmxrY250X3RfZGVmaW5lZAorIyBlbmRpZgorIyBpZm5kZWYgX19mc2ZpbGNudF90X2RlZmluZWQKK3R5cGVkZWYgX19mc2ZpbGNudF90IGZzZmlsY250X3Q7IC8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gaW5vZGVzLiAgKi8KKyMgIGRlZmluZSBfX2ZzZmlsY250X3RfZGVmaW5lZAorIyBlbmRpZgorI2Vsc2UKKyMgaWZuZGVmIF9fYmxrY250X3RfZGVmaW5lZAordHlwZWRlZiBfX2Jsa2NudDY0X3QgYmxrY250X3Q7CSAgIC8qIFR5cGUgdG8gY291bnQgbnVtYmVyIG9mIGRpc2sgYmxvY2tzLiAgKi8KKyMgIGRlZmluZSBfX2Jsa2NudF90X2RlZmluZWQKKyMgZW5kaWYKKyMgaWZuZGVmIF9fZnNibGtjbnRfdF9kZWZpbmVkCit0eXBlZGVmIF9fZnNibGtjbnQ2NF90IGZzYmxrY250X3Q7IC8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gYmxvY2tzLiAgKi8KKyMgIGRlZmluZSBfX2ZzYmxrY250X3RfZGVmaW5lZAorIyBlbmRpZgorIyBpZm5kZWYgX19mc2ZpbGNudF90X2RlZmluZWQKK3R5cGVkZWYgX19mc2ZpbGNudDY0X3QgZnNmaWxjbnRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBpbm9kZXMuICAqLworIyAgZGVmaW5lIF9fZnNmaWxjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0Cit0eXBlZGVmIF9fYmxrY250NjRfdCBibGtjbnQ2NF90OyAgICAgLyogVHlwZSB0byBjb3VudCBudW1iZXIgb2YgZGlzayBibG9ja3MuICovCit0eXBlZGVmIF9fZnNibGtjbnQ2NF90IGZzYmxrY250NjRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBibG9ja3MuICAqLwordHlwZWRlZiBfX2ZzZmlsY250NjRfdCBmc2ZpbGNudDY0X3Q7IC8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gaW5vZGVzLiAgKi8KKyNlbmRpZgorCisKKy8qIE5vdyBhZGQgdGhlIHRocmVhZCB0eXBlcy4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9QT1NJWDE5OTUwNiB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OAorIyBpbmNsdWRlIDxiaXRzL3B0aHJlYWR0eXBlcy5oPgorI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvdHlwZXMuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy91Y29udGV4dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy91Y29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OWNkMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Vjb250ZXh0LmgKQEAgLTAsMCArMSwyNDggQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1VDT05URVhUX0gKKyNkZWZpbmUgX1NZU19VQ09OVEVYVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisvKiBXZSBuZWVkIHRoZSBzaWduYWwgY29udGV4dCBkZWZpbml0aW9ucyBldmVuIGlmIHRoZXkgYXJlIG5vdCB1c2VkCisgICBpbmNsdWRlZCBpbiA8c2lnbmFsLmg+LiAgKi8KKyNpbmNsdWRlIDxiaXRzL3NpZ2NvbnRleHQuaD4KKworI2lmIF9fV09SRFNJWkUgPT0gNjQKKworLyogVHlwZSBmb3IgZ2VuZXJhbCByZWdpc3Rlci4gICovCit0eXBlZGVmIGxvbmcgaW50IGdyZWdfdDsKKworLyogTnVtYmVyIG9mIGdlbmVyYWwgcmVnaXN0ZXJzLiAgKi8KKyNkZWZpbmUgTkdSRUcJMjMKKworLyogQ29udGFpbmVyIGZvciBhbGwgZ2VuZXJhbCByZWdpc3RlcnMuICAqLwordHlwZWRlZiBncmVnX3QgZ3JlZ3NldF90W05HUkVHXTsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogTnVtYmVyIG9mIGVhY2ggcmVnaXN0ZXIgaW4gdGhlIGBncmVnc2V0X3QnIGFycmF5LiAgKi8KK2VudW0KK3sKKyAgUkVHX1I4ID0gMCwKKyMgZGVmaW5lIFJFR19SOAkJUkVHX1I4CisgIFJFR19SOSwKKyMgZGVmaW5lIFJFR19SOQkJUkVHX1I5CisgIFJFR19SMTAsCisjIGRlZmluZSBSRUdfUjEwCVJFR19SMTAKKyAgUkVHX1IxMSwKKyMgZGVmaW5lIFJFR19SMTEJUkVHX1IxMQorICBSRUdfUjEyLAorIyBkZWZpbmUgUkVHX1IxMglSRUdfUjEyCisgIFJFR19SMTMsCisjIGRlZmluZSBSRUdfUjEzCVJFR19SMTMKKyAgUkVHX1IxNCwKKyMgZGVmaW5lIFJFR19SMTQJUkVHX1IxNAorICBSRUdfUjE1LAorIyBkZWZpbmUgUkVHX1IxNQlSRUdfUjE1CisgIFJFR19SREksCisjIGRlZmluZSBSRUdfUkRJCVJFR19SREkKKyAgUkVHX1JTSSwKKyMgZGVmaW5lIFJFR19SU0kJUkVHX1JTSQorICBSRUdfUkJQLAorIyBkZWZpbmUgUkVHX1JCUAlSRUdfUkJQCisgIFJFR19SQlgsCisjIGRlZmluZSBSRUdfUkJYCVJFR19SQlgKKyAgUkVHX1JEWCwKKyMgZGVmaW5lIFJFR19SRFgJUkVHX1JEWAorICBSRUdfUkFYLAorIyBkZWZpbmUgUkVHX1JBWAlSRUdfUkFYCisgIFJFR19SQ1gsCisjIGRlZmluZSBSRUdfUkNYCVJFR19SQ1gKKyAgUkVHX1JTUCwKKyMgZGVmaW5lIFJFR19SU1AJUkVHX1JTUAorICBSRUdfUklQLAorIyBkZWZpbmUgUkVHX1JJUAlSRUdfUklQCisgIFJFR19FRkwsCisjIGRlZmluZSBSRUdfRUZMCVJFR19FRkwKKyAgUkVHX0NTR1NGUywJCS8qIEFjdHVhbGx5IHNob3J0IGNzLCBncywgZnMsIF9fcGFkMC4gICovCisjIGRlZmluZSBSRUdfQ1NHU0ZTCVJFR19DU0dTRlMKKyAgUkVHX0VSUiwKKyMgZGVmaW5lIFJFR19FUlIJUkVHX0VSUgorICBSRUdfVFJBUE5PLAorIyBkZWZpbmUgUkVHX1RSQVBOTwlSRUdfVFJBUE5PCisgIFJFR19PTERNQVNLLAorIyBkZWZpbmUgUkVHX09MRE1BU0sJUkVHX09MRE1BU0sKKyAgUkVHX0NSMgorIyBkZWZpbmUgUkVHX0NSMglSRUdfQ1IyCit9OworI2VuZGlmCisKK3N0cnVjdCBfbGliY19mcHhyZWcKK3sKKyAgdW5zaWduZWQgc2hvcnQgaW50IHNpZ25pZmljYW5kWzRdOworICB1bnNpZ25lZCBzaG9ydCBpbnQgZXhwb25lbnQ7CisgIHVuc2lnbmVkIHNob3J0IGludCBwYWRkaW5nWzNdOworfTsKKworc3RydWN0IF9saWJjX3htbXJlZworeworICBfX3VpbnQzMl90CWVsZW1lbnRbNF07Cit9OworCitzdHJ1Y3QgX2xpYmNfZnBzdGF0ZQoreworICAvKiA2NC1iaXQgRlhTQVZFIGZvcm1hdC4gICovCisgIF9fdWludDE2X3QJCWN3ZDsKKyAgX191aW50MTZfdAkJc3dkOworICBfX3VpbnQxNl90CQlmdHc7CisgIF9fdWludDE2X3QJCWZvcDsKKyAgX191aW50NjRfdAkJcmlwOworICBfX3VpbnQ2NF90CQlyZHA7CisgIF9fdWludDMyX3QJCW14Y3NyOworICBfX3VpbnQzMl90CQlteGNyX21hc2s7CisgIHN0cnVjdCBfbGliY19mcHhyZWcJX3N0WzhdOworICBzdHJ1Y3QgX2xpYmNfeG1tcmVnCV94bW1bMTZdOworICBfX3VpbnQzMl90CQlwYWRkaW5nWzI0XTsKK307CisKKy8qIFN0cnVjdHVyZSB0byBkZXNjcmliZSBGUFUgcmVnaXN0ZXJzLiAgKi8KK3R5cGVkZWYgc3RydWN0IF9saWJjX2Zwc3RhdGUgKmZwcmVnc2V0X3Q7CisKKy8qIENvbnRleHQgdG8gZGVzY3JpYmUgd2hvbGUgcHJvY2Vzc29yIHN0YXRlLiAgKi8KK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICBncmVnc2V0X3QgZ3JlZ3M7CisgICAgLyogTm90ZSB0aGF0IGZwcmVncyBpcyBhIHBvaW50ZXIuICAqLworICAgIGZwcmVnc2V0X3QgZnByZWdzOworICAgIHVuc2lnbmVkIGxvbmcgX19yZXNlcnZlZDEgWzhdOworfSBtY29udGV4dF90OworCisvKiBVc2VybGV2ZWwgY29udGV4dC4gICovCit0eXBlZGVmIHN0cnVjdCB1Y29udGV4dAorICB7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgdWNfZmxhZ3M7CisgICAgc3RydWN0IHVjb250ZXh0ICp1Y19saW5rOworICAgIHN0YWNrX3QgdWNfc3RhY2s7CisgICAgbWNvbnRleHRfdCB1Y19tY29udGV4dDsKKyAgICBfX3NpZ3NldF90IHVjX3NpZ21hc2s7CisgICAgc3RydWN0IF9saWJjX2Zwc3RhdGUgX19mcHJlZ3NfbWVtOworICB9IHVjb250ZXh0X3Q7CisKKyNlbHNlIC8qIF9fV09SRFNJWkUgPT0gMzIgKi8KKworLyogVHlwZSBmb3IgZ2VuZXJhbCByZWdpc3Rlci4gICovCit0eXBlZGVmIGludCBncmVnX3Q7CisKKy8qIE51bWJlciBvZiBnZW5lcmFsIHJlZ2lzdGVycy4gICovCisjZGVmaW5lIE5HUkVHCTE5CisKKy8qIENvbnRhaW5lciBmb3IgYWxsIGdlbmVyYWwgcmVnaXN0ZXJzLiAgKi8KK3R5cGVkZWYgZ3JlZ190IGdyZWdzZXRfdFtOR1JFR107CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIE51bWJlciBvZiBlYWNoIHJlZ2lzdGVyIGlzIHRoZSBgZ3JlZ3NldF90JyBhcnJheS4gICovCitlbnVtCit7CisgIFJFR19HUyA9IDAsCisjIGRlZmluZSBSRUdfR1MJCVJFR19HUworICBSRUdfRlMsCisjIGRlZmluZSBSRUdfRlMJCVJFR19GUworICBSRUdfRVMsCisjIGRlZmluZSBSRUdfRVMJCVJFR19FUworICBSRUdfRFMsCisjIGRlZmluZSBSRUdfRFMJCVJFR19EUworICBSRUdfRURJLAorIyBkZWZpbmUgUkVHX0VESQlSRUdfRURJCisgIFJFR19FU0ksCisjIGRlZmluZSBSRUdfRVNJCVJFR19FU0kKKyAgUkVHX0VCUCwKKyMgZGVmaW5lIFJFR19FQlAJUkVHX0VCUAorICBSRUdfRVNQLAorIyBkZWZpbmUgUkVHX0VTUAlSRUdfRVNQCisgIFJFR19FQlgsCisjIGRlZmluZSBSRUdfRUJYCVJFR19FQlgKKyAgUkVHX0VEWCwKKyMgZGVmaW5lIFJFR19FRFgJUkVHX0VEWAorICBSRUdfRUNYLAorIyBkZWZpbmUgUkVHX0VDWAlSRUdfRUNYCisgIFJFR19FQVgsCisjIGRlZmluZSBSRUdfRUFYCVJFR19FQVgKKyAgUkVHX1RSQVBOTywKKyMgZGVmaW5lIFJFR19UUkFQTk8JUkVHX1RSQVBOTworICBSRUdfRVJSLAorIyBkZWZpbmUgUkVHX0VSUglSRUdfRVJSCisgIFJFR19FSVAsCisjIGRlZmluZSBSRUdfRUlQCVJFR19FSVAKKyAgUkVHX0NTLAorIyBkZWZpbmUgUkVHX0NTCQlSRUdfQ1MKKyAgUkVHX0VGTCwKKyMgZGVmaW5lIFJFR19FRkwJUkVHX0VGTAorICBSRUdfVUVTUCwKKyMgZGVmaW5lIFJFR19VRVNQCVJFR19VRVNQCisgIFJFR19TUworIyBkZWZpbmUgUkVHX1NTCVJFR19TUworfTsKKyNlbmRpZgorCisvKiBEZWZpbml0aW9ucyB0YWtlbiBmcm9tIHRoZSBrZXJuZWwgaGVhZGVycy4gICovCitzdHJ1Y3QgX2xpYmNfZnByZWcKK3sKKyAgdW5zaWduZWQgc2hvcnQgaW50IHNpZ25pZmljYW5kWzRdOworICB1bnNpZ25lZCBzaG9ydCBpbnQgZXhwb25lbnQ7Cit9OworCitzdHJ1Y3QgX2xpYmNfZnBzdGF0ZQoreworICB1bnNpZ25lZCBsb25nIGludCBjdzsKKyAgdW5zaWduZWQgbG9uZyBpbnQgc3c7CisgIHVuc2lnbmVkIGxvbmcgaW50IHRhZzsKKyAgdW5zaWduZWQgbG9uZyBpbnQgaXBvZmY7CisgIHVuc2lnbmVkIGxvbmcgaW50IGNzc2VsOworICB1bnNpZ25lZCBsb25nIGludCBkYXRhb2ZmOworICB1bnNpZ25lZCBsb25nIGludCBkYXRhc2VsOworICBzdHJ1Y3QgX2xpYmNfZnByZWcgX3N0WzhdOworICB1bnNpZ25lZCBsb25nIGludCBzdGF0dXM7Cit9OworCisvKiBTdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgRlBVIHJlZ2lzdGVycy4gICovCit0eXBlZGVmIHN0cnVjdCBfbGliY19mcHN0YXRlICpmcHJlZ3NldF90OworCisvKiBDb250ZXh0IHRvIGRlc2NyaWJlIHdob2xlIHByb2Nlc3NvciBzdGF0ZS4gICovCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgZ3JlZ3NldF90IGdyZWdzOworICAgIC8qIER1ZSB0byBMaW51eCdzIGhpc3Rvcnkgd2UgaGF2ZSB0byB1c2UgYSBwb2ludGVyIGhlcmUuICBUaGUgU3lzVi9pMzg2CisgICAgICAgQUJJIHJlcXVpcmVzIGEgc3RydWN0IHdpdGggdGhlIHZhbHVlcy4gICovCisgICAgZnByZWdzZXRfdCBmcHJlZ3M7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgb2xkbWFzazsKKyAgICB1bnNpZ25lZCBsb25nIGludCBjcjI7CisgIH0gbWNvbnRleHRfdDsKKworLyogVXNlcmxldmVsIGNvbnRleHQuICAqLwordHlwZWRlZiBzdHJ1Y3QgdWNvbnRleHQKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgaW50IHVjX2ZsYWdzOworICAgIHN0cnVjdCB1Y29udGV4dCAqdWNfbGluazsKKyAgICBzdGFja190IHVjX3N0YWNrOworICAgIG1jb250ZXh0X3QgdWNfbWNvbnRleHQ7CisgICAgX19zaWdzZXRfdCB1Y19zaWdtYXNrOworICAgIHN0cnVjdCBfbGliY19mcHN0YXRlIF9fZnByZWdzX21lbTsKKyAgfSB1Y29udGV4dF90OworCisjZW5kaWYgLyogX19XT1JEU0laRSA9PSAzMiAqLworCisjZW5kaWYgLyogc3lzL3Vjb250ZXh0LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdWlvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Vpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMmI3ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3Vpby5oCkBAIC0wLDAgKzEsMTIzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsMTk5MiwxOTk2LTE5OTksMjAwMywyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfVUlPX0gKKyNkZWZpbmUgX1NZU19VSU9fSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogVGhpcyBmaWxlIGRlZmluZXMgYHN0cnVjdCBpb3ZlYycuICAqLworI2luY2x1ZGUgPGJpdHMvdWlvLmg+CisKKworLyogUmVhZCBkYXRhIGZyb20gZmlsZSBkZXNjcmlwdG9yIEZELCBhbmQgcHV0IHRoZSByZXN1bHQgaW4gdGhlCisgICBidWZmZXJzIGRlc2NyaWJlZCBieSBJT1ZFQywgd2hpY2ggaXMgYSB2ZWN0b3Igb2YgQ09VTlQgJ3N0cnVjdCBpb3ZlYydzLgorICAgVGhlIGJ1ZmZlcnMgYXJlIGZpbGxlZCBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkLgorICAgT3BlcmF0ZXMganVzdCBsaWtlICdyZWFkJyAoc2VlIDx1bmlzdGQuaD4pIGV4Y2VwdCB0aGF0IGRhdGEgYXJlCisgICBwdXQgaW4gSU9WRUMgaW5zdGVhZCBvZiBhIGNvbnRpZ3VvdXMgYnVmZmVyLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHJlYWR2IChpbnQgX19mZCwgX19jb25zdCBzdHJ1Y3QgaW92ZWMgKl9faW92ZWMsIGludCBfX2NvdW50KQorICBfX3d1cjsKKworLyogV3JpdGUgZGF0YSBwb2ludGVkIGJ5IHRoZSBidWZmZXJzIGRlc2NyaWJlZCBieSBJT1ZFQywgd2hpY2gKKyAgIGlzIGEgdmVjdG9yIG9mIENPVU5UICdzdHJ1Y3QgaW92ZWMncywgdG8gZmlsZSBkZXNjcmlwdG9yIEZELgorICAgVGhlIGRhdGEgaXMgd3JpdHRlbiBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkLgorICAgT3BlcmF0ZXMganVzdCBsaWtlICd3cml0ZScgKHNlZSA8dW5pc3RkLmg+KSBleGNlcHQgdGhhdCB0aGUgZGF0YQorICAgYXJlIHRha2VuIGZyb20gSU9WRUMgaW5zdGVhZCBvZiBhIGNvbnRpZ3VvdXMgYnVmZmVyLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHdyaXRldiAoaW50IF9fZmQsIF9fY29uc3Qgc3RydWN0IGlvdmVjICpfX2lvdmVjLCBpbnQgX19jb3VudCkKKyAgX193dXI7CisKKworI2lmZGVmIF9fVVNFX0JTRAorIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorLyogUmVhZCBkYXRhIGZyb20gZmlsZSBkZXNjcmlwdG9yIEZEIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBPRkZTRVQKKyAgIHdpdGhvdXQgY2hhbmdlIHRoZSBmaWxlIHBvaW50ZXIsIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiB0aGUgYnVmZmVycworICAgZGVzY3JpYmVkIGJ5IElPVkVDLCB3aGljaCBpcyBhIHZlY3RvciBvZiBDT1VOVCAnc3RydWN0IGlvdmVjJ3MuCisgICBUaGUgYnVmZmVycyBhcmUgZmlsbGVkIGluIHRoZSBvcmRlciBzcGVjaWZpZWQuICBPcGVyYXRlcyBqdXN0IGxpa2UKKyAgICdwcmVhZCcgKHNlZSA8dW5pc3RkLmg+KSBleGNlcHQgdGhhdCBkYXRhIGFyZSBwdXQgaW4gSU9WRUMgaW5zdGVhZAorICAgb2YgYSBjb250aWd1b3VzIGJ1ZmZlci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCBwcmVhZHYgKGludCBfX2ZkLCBfX2NvbnN0IHN0cnVjdCBpb3ZlYyAqX19pb3ZlYywgaW50IF9fY291bnQsCisJCSAgICAgICBfX29mZl90IF9fb2Zmc2V0KSBfX3d1cjsKKworLyogV3JpdGUgZGF0YSBwb2ludGVkIGJ5IHRoZSBidWZmZXJzIGRlc2NyaWJlZCBieSBJT1ZFQywgd2hpY2ggaXMgYQorICAgdmVjdG9yIG9mIENPVU5UICdzdHJ1Y3QgaW92ZWMncywgdG8gZmlsZSBkZXNjcmlwdG9yIEZEIGF0IHRoZSBnaXZlbgorICAgcG9zaXRpb24gT0ZGU0VUIHdpdGhvdXQgY2hhbmdlIHRoZSBmaWxlIHBvaW50ZXIuICBUaGUgZGF0YSBpcworICAgd3JpdHRlbiBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkLiAgT3BlcmF0ZXMganVzdCBsaWtlICdwd3JpdGUnIChzZWUKKyAgIDx1bmlzdGQuaD4pIGV4Y2VwdCB0aGF0IHRoZSBkYXRhIGFyZSB0YWtlbiBmcm9tIElPVkVDIGluc3RlYWQgb2YgYQorICAgY29udGlndW91cyBidWZmZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3QgcHdyaXRldiAoaW50IF9fZmQsIF9fY29uc3Qgc3RydWN0IGlvdmVjICpfX2lvdmVjLCBpbnQgX19jb3VudCwKKwkJCV9fb2ZmX3QgX19vZmZzZXQpIF9fd3VyOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChwcmVhZHYsIChpbnQgX19mZCwgX19jb25zdCBzdHJ1Y3QgaW92ZWMgKl9faW92ZWMsCisJCQkJICAgIGludCBfX2NvdW50LCBfX29mZjY0X3QgX19vZmZzZXQpLAorCQkJICAgcHJlYWR2NjQpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAocHdyaXRldiwgKGludCBfX2ZkLCBfX2NvbnN0IHN0cnVjdCBpb3ZlYyAqX19pb3ZlYywKKwkJCQkgICAgIGludCBfX2NvdW50LCBfX29mZjY0X3QgX19vZmZzZXQpLAorCQkJICAgcHdyaXRldjY0KSBfX3d1cjsKKyMgIGVsc2UKKyMgICBkZWZpbmUgcHJlYWR2IHByZWFkdjY0CisjICAgZGVmaW5lIHB3cml0ZXYgcHdyaXRldjY0CisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmZGVmIF9fVVNFX0xBUkdFRklMRTY0CisvKiBSZWFkIGRhdGEgZnJvbSBmaWxlIGRlc2NyaXB0b3IgRkQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIE9GRlNFVAorICAgd2l0aG91dCBjaGFuZ2UgdGhlIGZpbGUgcG9pbnRlciwgYW5kIHB1dCB0aGUgcmVzdWx0IGluIHRoZSBidWZmZXJzCisgICBkZXNjcmliZWQgYnkgSU9WRUMsIHdoaWNoIGlzIGEgdmVjdG9yIG9mIENPVU5UICdzdHJ1Y3QgaW92ZWMncy4KKyAgIFRoZSBidWZmZXJzIGFyZSBmaWxsZWQgaW4gdGhlIG9yZGVyIHNwZWNpZmllZC4gIE9wZXJhdGVzIGp1c3QgbGlrZQorICAgJ3ByZWFkJyAoc2VlIDx1bmlzdGQuaD4pIGV4Y2VwdCB0aGF0IGRhdGEgYXJlIHB1dCBpbiBJT1ZFQyBpbnN0ZWFkCisgICBvZiBhIGNvbnRpZ3VvdXMgYnVmZmVyLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHByZWFkdjY0IChpbnQgX19mZCwgX19jb25zdCBzdHJ1Y3QgaW92ZWMgKl9faW92ZWMsIGludCBfX2NvdW50LAorCQkJIF9fb2ZmNjRfdCBfX29mZnNldCkgX193dXI7CisKKy8qIFdyaXRlIGRhdGEgcG9pbnRlZCBieSB0aGUgYnVmZmVycyBkZXNjcmliZWQgYnkgSU9WRUMsIHdoaWNoIGlzIGEKKyAgIHZlY3RvciBvZiBDT1VOVCAnc3RydWN0IGlvdmVjJ3MsIHRvIGZpbGUgZGVzY3JpcHRvciBGRCBhdCB0aGUgZ2l2ZW4KKyAgIHBvc2l0aW9uIE9GRlNFVCB3aXRob3V0IGNoYW5nZSB0aGUgZmlsZSBwb2ludGVyLiAgVGhlIGRhdGEgaXMKKyAgIHdyaXR0ZW4gaW4gdGhlIG9yZGVyIHNwZWNpZmllZC4gIE9wZXJhdGVzIGp1c3QgbGlrZSAncHdyaXRlJyAoc2VlCisgICA8dW5pc3RkLmg+KSBleGNlcHQgdGhhdCB0aGUgZGF0YSBhcmUgdGFrZW4gZnJvbSBJT1ZFQyBpbnN0ZWFkIG9mIGEKKyAgIGNvbnRpZ3VvdXMgYnVmZmVyLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHB3cml0ZXY2NCAoaW50IF9fZmQsIF9fY29uc3Qgc3RydWN0IGlvdmVjICpfX2lvdmVjLCBpbnQgX19jb3VudCwKKwkJCSAgX19vZmY2NF90IF9fb2Zmc2V0KSBfX3d1cjsKKyMgZW5kaWYKKyNlbmRpZgkvKiBVc2UgQlNEICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvdWlvLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdWx0cmFzb3VuZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy91bHRyYXNvdW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY1YzM4NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdWx0cmFzb3VuZC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxsaW51eC91bHRyYXNvdW5kLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3VuLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhMTBlNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdW4uaApAQCAtMCwwICsxLDQ3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTUsIDE5OTYsIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19VTl9ICisjZGVmaW5lCV9TWVNfVU5fSAkxCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKworLyogR2V0IHRoZSBkZWZpbml0aW9uIG9mIHRoZSBtYWNybyB0byBkZWZpbmUgdGhlIGNvbW1vbiBzb2NrYWRkciBtZW1iZXJzLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3NvY2thZGRyLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIGFkZHJlc3Mgb2YgYW4gQUZfTE9DQUwgKGFrYSBBRl9VTklYKSBzb2NrZXQuICAqLworc3RydWN0IHNvY2thZGRyX3VuCisgIHsKKyAgICBfX1NPQ0tBRERSX0NPTU1PTiAoc3VuXyk7CisgICAgY2hhciBzdW5fcGF0aFsxMDhdOwkJLyogUGF0aCBuYW1lLiAgKi8KKyAgfTsKKworCisjaWZkZWYgX19VU0VfTUlTQworIyBpbmNsdWRlIDxzdHJpbmcuaD4JCS8qIEZvciBwcm90b3R5cGUgb2YgYHN0cmxlbicuICAqLworCisvKiBFdmFsdWF0ZSB0byBhY3R1YWwgbGVuZ3RoIG9mIHRoZSBgc29ja2FkZHJfdW4nIHN0cnVjdHVyZS4gICovCisjIGRlZmluZSBTVU5fTEVOKHB0cikgKChzaXplX3QpICgoKHN0cnVjdCBzb2NrYWRkcl91biAqKSAwKS0+c3VuX3BhdGgpCSAgICAgIFwKKwkJICAgICAgKyBzdHJsZW4gKChwdHIpLT5zdW5fcGF0aCkpCisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHN5cy91bi5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy91bmlzdGQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdW5pc3RkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU4MjNmYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdW5pc3RkLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPHVuaXN0ZC5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy91c2VyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3VzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjg4MDI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy91c2VyLmgKQEAgLTAsMCArMSwxNzUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwNCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1VTRVJfSAorI2RlZmluZSBfU1lTX1VTRVJfSAkxCisKKy8qIFRoZSB3aG9sZSBwdXJwb3NlIG9mIHRoaXMgZmlsZSBpcyBmb3IgR0RCIGFuZCBHREIgb25seS4gIERvbid0IHJlYWQKKyAgIHRvbyBtdWNoIGludG8gaXQuICBEb24ndCB1c2UgaXQgZm9yIGFueXRoaW5nIG90aGVyIHRoYW4gR0RCIHVubGVzcworICAgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLiAgKi8KKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmIF9fV09SRFNJWkUgPT0gNjQKKworc3RydWN0IHVzZXJfZnByZWdzX3N0cnVjdAoreworICB1bnNpZ25lZCBzaG9ydCBpbnQJY3dkOworICB1bnNpZ25lZCBzaG9ydCBpbnQJc3dkOworICB1bnNpZ25lZCBzaG9ydCBpbnQJZnR3OworICB1bnNpZ25lZCBzaG9ydCBpbnQJZm9wOworICB1bnNpZ25lZCBsb25nIGludAlyaXA7CisgIHVuc2lnbmVkIGxvbmcgaW50CXJkcDsKKyAgdW5zaWduZWQgaW50CQlteGNzcjsKKyAgdW5zaWduZWQgaW50CQlteGNyX21hc2s7CisgIHVuc2lnbmVkIGludAkJc3Rfc3BhY2VbMzJdOyAgIC8qIDgqMTYgYnl0ZXMgZm9yIGVhY2ggRlAtcmVnID0gMTI4IGJ5dGVzICovCisgIHVuc2lnbmVkIGludAkJeG1tX3NwYWNlWzY0XTsgIC8qIDE2KjE2IGJ5dGVzIGZvciBlYWNoIFhNTS1yZWcgPSAyNTYgYnl0ZXMgKi8KKyAgdW5zaWduZWQgaW50CQlwYWRkaW5nWzI0XTsKK307CisKK3N0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0Cit7CisgIHVuc2lnbmVkIGxvbmcgaW50IHIxNTsKKyAgdW5zaWduZWQgbG9uZyBpbnQgcjE0OworICB1bnNpZ25lZCBsb25nIGludCByMTM7CisgIHVuc2lnbmVkIGxvbmcgaW50IHIxMjsKKyAgdW5zaWduZWQgbG9uZyBpbnQgcmJwOworICB1bnNpZ25lZCBsb25nIGludCByYng7CisgIHVuc2lnbmVkIGxvbmcgaW50IHIxMTsKKyAgdW5zaWduZWQgbG9uZyBpbnQgcjEwOworICB1bnNpZ25lZCBsb25nIGludCByOTsKKyAgdW5zaWduZWQgbG9uZyBpbnQgcjg7CisgIHVuc2lnbmVkIGxvbmcgaW50IHJheDsKKyAgdW5zaWduZWQgbG9uZyBpbnQgcmN4OworICB1bnNpZ25lZCBsb25nIGludCByZHg7CisgIHVuc2lnbmVkIGxvbmcgaW50IHJzaTsKKyAgdW5zaWduZWQgbG9uZyBpbnQgcmRpOworICB1bnNpZ25lZCBsb25nIGludCBvcmlnX3JheDsKKyAgdW5zaWduZWQgbG9uZyBpbnQgcmlwOworICB1bnNpZ25lZCBsb25nIGludCBjczsKKyAgdW5zaWduZWQgbG9uZyBpbnQgZWZsYWdzOworICB1bnNpZ25lZCBsb25nIGludCByc3A7CisgIHVuc2lnbmVkIGxvbmcgaW50IHNzOworICB1bnNpZ25lZCBsb25nIGludCBmc19iYXNlOworICB1bnNpZ25lZCBsb25nIGludCBnc19iYXNlOworICB1bnNpZ25lZCBsb25nIGludCBkczsKKyAgdW5zaWduZWQgbG9uZyBpbnQgZXM7CisgIHVuc2lnbmVkIGxvbmcgaW50IGZzOworICB1bnNpZ25lZCBsb25nIGludCBnczsKK307CisKK3N0cnVjdCB1c2VyCit7CisgIHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0CXJlZ3M7CisgIGludAkJCQl1X2ZwdmFsaWQ7CisgIHN0cnVjdCB1c2VyX2ZwcmVnc19zdHJ1Y3QJaTM4NzsKKyAgdW5zaWduZWQgbG9uZyBpbnQJCXVfdHNpemU7CisgIHVuc2lnbmVkIGxvbmcgaW50CQl1X2RzaXplOworICB1bnNpZ25lZCBsb25nIGludAkJdV9zc2l6ZTsKKyAgdW5zaWduZWQgbG9uZyBpbnQJCXN0YXJ0X2NvZGU7CisgIHVuc2lnbmVkIGxvbmcgaW50CQlzdGFydF9zdGFjazsKKyAgbG9uZyBpbnQJCQlzaWduYWw7CisgIGludAkJCQlyZXNlcnZlZDsKKyAgc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QqCXVfYXIwOworICBzdHJ1Y3QgdXNlcl9mcHJlZ3Nfc3RydWN0Kgl1X2Zwc3RhdGU7CisgIHVuc2lnbmVkIGxvbmcgaW50CQltYWdpYzsKKyAgY2hhcgkJCQl1X2NvbW0gWzMyXTsKKyAgdW5zaWduZWQgbG9uZyBpbnQJCXVfZGVidWdyZWcgWzhdOworfTsKKworI2Vsc2UKKy8qIFRoZXNlIGFyZSB0aGUgMzItYml0IHg4NiBzdHJ1Y3R1cmVzLiAgKi8KK3N0cnVjdCB1c2VyX2ZwcmVnc19zdHJ1Y3QKK3sKKyAgbG9uZyBpbnQgY3dkOworICBsb25nIGludCBzd2Q7CisgIGxvbmcgaW50IHR3ZDsKKyAgbG9uZyBpbnQgZmlwOworICBsb25nIGludCBmY3M7CisgIGxvbmcgaW50IGZvbzsKKyAgbG9uZyBpbnQgZm9zOworICBsb25nIGludCBzdF9zcGFjZSBbMjBdOworfTsKKworc3RydWN0IHVzZXJfZnB4cmVnc19zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgc2hvcnQgaW50IGN3ZDsKKyAgdW5zaWduZWQgc2hvcnQgaW50IHN3ZDsKKyAgdW5zaWduZWQgc2hvcnQgaW50IHR3ZDsKKyAgdW5zaWduZWQgc2hvcnQgaW50IGZvcDsKKyAgbG9uZyBpbnQgZmlwOworICBsb25nIGludCBmY3M7CisgIGxvbmcgaW50IGZvbzsKKyAgbG9uZyBpbnQgZm9zOworICBsb25nIGludCBteGNzcjsKKyAgbG9uZyBpbnQgcmVzZXJ2ZWQ7CisgIGxvbmcgaW50IHN0X3NwYWNlWzMyXTsgICAvKiA4KjE2IGJ5dGVzIGZvciBlYWNoIEZQLXJlZyA9IDEyOCBieXRlcyAqLworICBsb25nIGludCB4bW1fc3BhY2VbMzJdOyAgLyogOCoxNiBieXRlcyBmb3IgZWFjaCBYTU0tcmVnID0gMTI4IGJ5dGVzICovCisgIGxvbmcgaW50IHBhZGRpbmdbNTZdOworfTsKKworc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QKK3sKKyAgbG9uZyBpbnQgZWJ4OworICBsb25nIGludCBlY3g7CisgIGxvbmcgaW50IGVkeDsKKyAgbG9uZyBpbnQgZXNpOworICBsb25nIGludCBlZGk7CisgIGxvbmcgaW50IGVicDsKKyAgbG9uZyBpbnQgZWF4OworICBsb25nIGludCB4ZHM7CisgIGxvbmcgaW50IHhlczsKKyAgbG9uZyBpbnQgeGZzOworICBsb25nIGludCB4Z3M7CisgIGxvbmcgaW50IG9yaWdfZWF4OworICBsb25nIGludCBlaXA7CisgIGxvbmcgaW50IHhjczsKKyAgbG9uZyBpbnQgZWZsYWdzOworICBsb25nIGludCBlc3A7CisgIGxvbmcgaW50IHhzczsKK307CisKK3N0cnVjdCB1c2VyCit7CisgIHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0CXJlZ3M7CisgIGludAkJCQl1X2ZwdmFsaWQ7CisgIHN0cnVjdCB1c2VyX2ZwcmVnc19zdHJ1Y3QJaTM4NzsKKyAgdW5zaWduZWQgbG9uZyBpbnQJCXVfdHNpemU7CisgIHVuc2lnbmVkIGxvbmcgaW50CQl1X2RzaXplOworICB1bnNpZ25lZCBsb25nIGludAkJdV9zc2l6ZTsKKyAgdW5zaWduZWQgbG9uZyBpbnQJCXN0YXJ0X2NvZGU7CisgIHVuc2lnbmVkIGxvbmcgaW50CQlzdGFydF9zdGFjazsKKyAgbG9uZyBpbnQJCQlzaWduYWw7CisgIGludAkJCQlyZXNlcnZlZDsKKyAgc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QqCXVfYXIwOworICBzdHJ1Y3QgdXNlcl9mcHJlZ3Nfc3RydWN0Kgl1X2Zwc3RhdGU7CisgIHVuc2lnbmVkIGxvbmcgaW50CQltYWdpYzsKKyAgY2hhcgkJCQl1X2NvbW0gWzMyXTsKKyAgaW50CQkJCXVfZGVidWdyZWcgWzhdOworfTsKKyNlbmRpZiAgLyogX19XT1JEU0laRSAqLworCisjZGVmaW5lIFBBR0VfU0laRQkJKHN5c2NvbmYoX1NDX1BBR0VTSVpFKSkKKyNkZWZpbmUgUEFHRV9NQVNLCQkofihQQUdFX1NJWkUtMSkpCisjZGVmaW5lIE5CUEcJCQlQQUdFX1NJWkUKKyNkZWZpbmUgVVBBR0VTCQkJMQorI2RlZmluZSBIT1NUX1RFWFRfU1RBUlRfQUREUgkodS5zdGFydF9jb2RlKQorI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSCSh1LnN0YXJ0X3N0YWNrICsgdS51X3NzaXplICogTkJQRykKKworI2VuZGlmCS8qIF9TWVNfVVNFUl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3VzdGF0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3VzdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5Y2RhYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdXN0YXQuaApAQCAtMCwwICsxLDM4IEBACisvKiBIZWFkZXIgZGVzY3JpYmluZyBvYnNvbGV0ZSBgdXN0YXQnIGludGVyZmFjZS4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG9ic29sZXRlLiAgVXNlIDxzeXMvc3RhdGZzLmg+IGluc3RlYWQuCisgKi8KKworI2lmbmRlZiBfU1lTX1VTVEFUX0gKKyNkZWZpbmUJX1NZU19VU1RBVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3VzdGF0Lmg+CisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIGludCB1c3RhdCAoX19kZXZfdCBfX2Rldiwgc3RydWN0IHVzdGF0ICpfX3VidWYpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvdXN0YXQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy91dHNuYW1lLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3V0c25hbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDNhYWI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy91dHNuYW1lLmgKQEAgLTAsMCArMSw4NyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLDkyLDk0LDk2LDk3LDk5LDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglQT1NJWCBTdGFuZGFyZDogNC40IFN5c3RlbSBJZGVudGlmaWNhdGlvbgk8c3lzL3V0c25hbWUuaD4KKyAqLworCisjaWZuZGVmCV9TWVNfVVRTTkFNRV9ICisjZGVmaW5lCV9TWVNfVVRTTkFNRV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2luY2x1ZGUgPGJpdHMvdXRzbmFtZS5oPgorCisjaWZuZGVmIF9VVFNOQU1FX1NZU05BTUVfTEVOR1RICisjIGRlZmluZSBfVVRTTkFNRV9TWVNOQU1FX0xFTkdUSCBfVVRTTkFNRV9MRU5HVEgKKyNlbmRpZgorI2lmbmRlZiBfVVRTTkFNRV9OT0RFTkFNRV9MRU5HVEgKKyMgZGVmaW5lIF9VVFNOQU1FX05PREVOQU1FX0xFTkdUSCBfVVRTTkFNRV9MRU5HVEgKKyNlbmRpZgorI2lmbmRlZiBfVVRTTkFNRV9SRUxFQVNFX0xFTkdUSAorIyBkZWZpbmUgX1VUU05BTUVfUkVMRUFTRV9MRU5HVEggX1VUU05BTUVfTEVOR1RICisjZW5kaWYKKyNpZm5kZWYgX1VUU05BTUVfVkVSU0lPTl9MRU5HVEgKKyMgZGVmaW5lIF9VVFNOQU1FX1ZFUlNJT05fTEVOR1RIIF9VVFNOQU1FX0xFTkdUSAorI2VuZGlmCisjaWZuZGVmIF9VVFNOQU1FX01BQ0hJTkVfTEVOR1RICisjIGRlZmluZSBfVVRTTkFNRV9NQUNISU5FX0xFTkdUSCBfVVRTTkFNRV9MRU5HVEgKKyNlbmRpZgorCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgc3lzdGVtIGFuZCBtYWNoaW5lLiAgKi8KK3N0cnVjdCB1dHNuYW1lCisgIHsKKyAgICAvKiBOYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gICovCisgICAgY2hhciBzeXNuYW1lW19VVFNOQU1FX1NZU05BTUVfTEVOR1RIXTsKKworICAgIC8qIE5hbWUgb2YgdGhpcyBub2RlIG9uIHRoZSBuZXR3b3JrLiAgKi8KKyAgICBjaGFyIG5vZGVuYW1lW19VVFNOQU1FX05PREVOQU1FX0xFTkdUSF07CisKKyAgICAvKiBDdXJyZW50IHJlbGVhc2UgbGV2ZWwgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbi4gICovCisgICAgY2hhciByZWxlYXNlW19VVFNOQU1FX1JFTEVBU0VfTEVOR1RIXTsKKyAgICAvKiBDdXJyZW50IHZlcnNpb24gbGV2ZWwgb2YgdGhpcyByZWxlYXNlLiAgKi8KKyAgICBjaGFyIHZlcnNpb25bX1VUU05BTUVfVkVSU0lPTl9MRU5HVEhdOworCisgICAgLyogTmFtZSBvZiB0aGUgaGFyZHdhcmUgdHlwZSB0aGUgc3lzdGVtIGlzIHJ1bm5pbmcgb24uICAqLworICAgIGNoYXIgbWFjaGluZVtfVVRTTkFNRV9NQUNISU5FX0xFTkdUSF07CisKKyNpZiBfVVRTTkFNRV9ET01BSU5fTEVOR1RIIC0gMAorICAgIC8qIE5hbWUgb2YgdGhlIGRvbWFpbiBvZiB0aGlzIG5vZGUgb24gdGhlIG5ldHdvcmsuICAqLworIyBpZmRlZiBfX1VTRV9HTlUKKyAgICBjaGFyIGRvbWFpbm5hbWVbX1VUU05BTUVfRE9NQUlOX0xFTkdUSF07CisjIGVsc2UKKyAgICBjaGFyIF9fZG9tYWlubmFtZVtfVVRTTkFNRV9ET01BSU5fTEVOR1RIXTsKKyMgZW5kaWYKKyNlbmRpZgorICB9OworCisjaWZkZWYgX19VU0VfU1ZJRAorLyogTm90ZSB0aGF0IFNWSUQgYXNzdW1lcyBhbGwgbWVtYmVycyBoYXZlIHRoZSBzYW1lIHNpemUuICAqLworIyBkZWZpbmUgU1lTX05NTE4gIF9VVFNOQU1FX0xFTkdUSAorI2VuZGlmCisKKworLyogUHV0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzeXN0ZW0gaW4gTkFNRS4gICovCitleHRlcm4gaW50IHVuYW1lIChzdHJ1Y3QgdXRzbmFtZSAqX19uYW1lKSBfX1RIUk9XOworCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvdXRzbmFtZS5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy92ZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEyMmQzMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdmZzLmgKQEAgLTAsMCArMSw0IEBACisvKiBPdGhlciBzeXN0ZW1zIGRlY2xhcmUgYHN0cnVjdCBzdGF0ZnMnIGV0IGFsIGluIDxzeXMvdmZzLmg+LAorICAgc28gd2UgaGF2ZSB0aGlzIGZpbGUgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHByb2dyYW1zIGV4cGVjdGluZyBpdC4gICovCisKKyNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvc3lzL3ZsaW1pdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy92bGltaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjdhMDlhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy92bGltaXQuaApAQCAtMCwwICsxLDY4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19WTElNSVRfSAorI2RlZmluZSBfU1lTX1ZMSU1JVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogVGhpcyBpbnRlcmZhY2UgaXMgb2Jzb2xldGUsIGFuZCBpcyBzdXBlcnNlZGVkIGJ5IDxzeXMvcmVzb3VyY2UuaD4uICAqLworCisvKiBLaW5kcyBvZiByZXNvdXJjZSBsaW1pdC4gICovCitlbnVtIF9fdmxpbWl0X3Jlc291cmNlCit7CisgIC8qIFNldHRpbmcgdGhpcyBub24temVybyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHJhaXNlIGxpbWl0cy4KKyAgICAgT25seSB0aGUgc3VwZXItdXNlIGNhbiBzZXQgaXQgdG8gemVyby4KKworICAgICBUaGlzIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiByZWNlbnQgdmVyc2lvbnMgb2YgQlNELCBub3IgYnkKKyAgICAgdGhlIEdOVSBDIGxpYnJhcnkuICAqLworICBMSU1fTk9SQUlTRSwKKworICAvKiBDUFUgdGltZSBhdmFpbGFibGUgZm9yIGVhY2ggcHJvY2VzcyAoc2Vjb25kcykuICAqLworICBMSU1fQ1BVLAorCisgIC8qIExhcmdlc3QgZmlsZSB3aGljaCBjYW4gYmUgY3JlYXRlZCAoYnl0ZXMpLiAgKi8KKyAgTElNX0ZTSVpFLAorCisgIC8qIE1heGltdW0gc2l6ZSBvZiB0aGUgZGF0YSBzZWdtZW50IChieXRlcykuICAqLworICBMSU1fREFUQSwKKworICAvKiBNYXhpbXVtIHNpemUgb2YgdGhlIHN0YWNrIHNlZ21lbnQgKGJ5dGVzKS4gICovCisgIExJTV9TVEFDSywKKworICAvKiBMYXJnZXN0IGNvcmUgZmlsZSB0aGF0IHdpbGwgYmUgY3JlYXRlZCAoYnl0ZXMpLiAgKi8KKyAgTElNX0NPUkUsCisKKyAgLyogUmVzaWRlbnQgc2V0IHNpemUgKGJ5dGVzKS4gICovCisgIExJTV9NQVhSU1MKK307CisKKy8qIFRoaXMgbWVhbnMgbm8gbGltaXQuICAqLworI2RlZmluZSBJTkZJTklUWSAweDdmZmZmZmZmCisKKworLyogU2V0IHRoZSBzb2Z0IGxpbWl0IGZvciBSRVNPVVJDRSB0byBiZSBWQUxVRS4KKyAgIFJldHVybnMgMCBmb3Igc3VjY2VzcywgLTEgZm9yIGZhaWx1cmUuICAqLworZXh0ZXJuIGludCB2bGltaXQgKGVudW0gX192bGltaXRfcmVzb3VyY2UgX19yZXNvdXJjZSwgaW50IF9fdmFsdWUpIF9fVEhST1c7CisKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy92bGltaXQuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzRhYmZiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy92dC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxsaW51eC92dC5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy92dGltZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdnRpbWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU3ZjNhNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvdnRpbWVzLmgKQEAgLTAsMCArMSw2OSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfVlRJTUVTX0gKKyNkZWZpbmUgX1NZU19WVElNRVNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoaXMgaW50ZXJmYWNlIGlzIG9ic29sZXRlOyB1c2UgYGdldHJ1c2FnZScgaW5zdGVhZC4gICovCisKKy8qIEdyYW51bGFyaXR5IG9mIHRoZSBgdm1fdXRpbWUnIGFuZCBgdm1fc3RpbWUnIGZpZWxkcyBvZiBhIGBzdHJ1Y3QgdnRpbWVzJy4KKyAgIChUaGlzIGlzIHRoZSBmcmVxdWVuY3kgb2YgdGhlIG1hY2hpbmUncyBwb3dlciBzdXBwbHksIGluIEh6LikgICovCisjZGVmaW5lCVZUSU1FU19VTklUU19QRVJfU0VDT05ECTYwCisKK3N0cnVjdCB2dGltZXMKK3sKKyAgLyogVXNlciB0aW1lIHVzZWQgaW4gdW5pdHMgb2YgMS9WVElNRVNfVU5JVFNfUEVSX1NFQ09ORCBzZWNvbmRzLiAgKi8KKyAgaW50IHZtX3V0aW1lOworICAvKiBTeXN0ZW0gdGltZSB1c2VkIGluIHVuaXRzIG9mIDEvVlRJTUVTX1VOSVRTX1BFUl9TRUNPTkQgc2Vjb25kcy4gICovCisgIGludCB2bV9zdGltZTsKKworICAvKiBBbW91bnQgb2YgZGF0YSBhbmQgc3RhY2sgbWVtb3J5IHVzZWQgKGtpbG9ieXRlLXNlY29uZHMpLiAgKi8KKyAgdW5zaWduZWQgaW50IHZtX2lkc3JzczsKKyAgLyogQW1vdW50IG9mIHRleHQgbWVtb3J5IHVzZWQgKGtpbG9ieXRlLXNlY29uZHMpLiAgKi8KKyAgdW5zaWduZWQgaW50IHZtX2l4cnNzOworICAvKiBNYXhpbXVtIHJlc2lkZW50IHNldCBzaXplICh0ZXh0LCBkYXRhLCBhbmQgc3RhY2spIChraWxvYnl0ZXMpLiAgKi8KKyAgaW50IHZtX21heHJzczsKKworICAvKiBOdW1iZXIgb2YgaGFyZCBwYWdlIGZhdWx0cyAoaS5lLiB0aG9zZSB0aGF0IHJlcXVpcmVkIEkvTykuICAqLworICBpbnQgdm1fbWFqZmx0OworICAvKiBOdW1iZXIgb2Ygc29mdCBwYWdlIGZhdWx0cyAoaS5lLiB0aG9zZSBzZXJ2aWNlZCBieSByZWNsYWltaW5nCisgICAgIGEgcGFnZSBmcm9tIHRoZSBsaXN0IG9mIHBhZ2VzIGF3YWl0aW5nIHJlYWxsb2NhdGlvbi4gICovCisgIGludCB2bV9taW5mbHQ7CisKKyAgLyogTnVtYmVyIG9mIHRpbWVzIGEgcHJvY2VzcyB3YXMgc3dhcHBlZCBvdXQgb2YgcGh5c2ljYWwgbWVtb3J5LiAgKi8KKyAgaW50IHZtX25zd2FwOworCisgIC8qIE51bWJlciBvZiBpbnB1dCBvcGVyYXRpb25zIHZpYSB0aGUgZmlsZSBzeXN0ZW0uICBOb3RlOiBUaGlzCisgICAgIGFuZCBgcnVfb3VibG9jaycgZG8gbm90IGluY2x1ZGUgb3BlcmF0aW9ucyB3aXRoIHRoZSBjYWNoZS4gICovCisgIGludCB2bV9pbmJsazsKKyAgLyogTnVtYmVyIG9mIG91dHB1dCBvcGVyYXRpb25zIHZpYSB0aGUgZmlsZSBzeXN0ZW0uICAqLworICBpbnQgdm1fb3VibGs7Cit9OworCisvKiBJZiBDVVJSRU5UIGlzIG5vdCBOVUxMLCB3cml0ZSBzdGF0aXN0aWNzIGZvciB0aGUgY3VycmVudCBwcm9jZXNzIGludG8KKyAgICpDVVJSRU5ULiAgSWYgQ0hJTEQgaXMgbm90IE5VTEwsIHdyaXRlIHN0YXRpc3RpY3MgZm9yIGFsbCB0ZXJtaW5hdGVkIGNoaWxkCisgICBwcm9jZXNzZXMgaW50byAqQ0hJTEQuICBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIC0xIGZvciBmYWlsdXJlLiAgKi8KK2V4dGVybiBpbnQgdnRpbWVzIChzdHJ1Y3QgdnRpbWVzICogX19jdXJyZW50LCBzdHJ1Y3QgdnRpbWVzICogX19jaGlsZCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy92dGltZXMuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvd2FpdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy93YWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmZDU4ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMvd2FpdC5oCkBAIC0wLDAgKzEsMTgyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NCwxOTk2LTIwMDEsMjAwMywyMDA0LDIwMDUsMjAwNywyMDA5LDIwMTAsMjAxMQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglQT1NJWCBTdGFuZGFyZDogMy4yLjEgV2FpdCBmb3IgUHJvY2VzcyBUZXJtaW5hdGlvbgk8c3lzL3dhaXQuaD4KKyAqLworCisjaWZuZGVmCV9TWVNfV0FJVF9ICisjZGVmaW5lCV9TWVNfV0FJVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorCisvKiBUaGVzZSBtYWNyb3MgY291bGQgYWxzbyBiZSBkZWZpbmVkIGluIDxzdGRsaWIuaD4uICAqLworI2lmICFkZWZpbmVkIF9TVERMSUJfSCB8fCAoIWRlZmluZWQgX19VU0VfWE9QRU4gJiYgIWRlZmluZWQgX19VU0VfWE9QRU4ySzgpCisvKiBUaGlzIHdpbGwgZGVmaW5lIHRoZSBgVyonIG1hY3JvcyBmb3IgdGhlIGZsYWcKKyAgIGJpdHMgdG8gYHdhaXRwaWQnLCBgd2FpdDMnLCBhbmQgYHdhaXQ0Jy4gICovCisjIGluY2x1ZGUgPGJpdHMvd2FpdGZsYWdzLmg+CisKKyMgaWZkZWYJX19VU0VfQlNECisKKy8qIExvdHMgb2YgaGFpciB0byBhbGxvdyB0cmFkaXRpb25hbCBCU0QgdXNlIG9mIGB1bmlvbiB3YWl0JworICAgYXMgd2VsbCBhcyBQT1NJWC4xIHVzZSBvZiBgaW50JyBmb3IgdGhlIHN0YXR1cyB3b3JkLiAgKi8KKworIyAgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiAhZGVmaW5lZCBfX2NwbHVzcGx1cworIyAgIGRlZmluZSBfX1dBSVRfSU5UKHN0YXR1cykgXAorICAoX19leHRlbnNpb25fXyAoKCh1bmlvbiB7IF9fdHlwZW9mKHN0YXR1cykgX19pbjsgaW50IF9faTsgfSkgXAorCQkgICB7IC5fX2luID0gKHN0YXR1cykgfSkuX19pKSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgX19XQUlUX0lOVChzdGF0dXMpCSgqKF9fY29uc3QgaW50ICopICYoc3RhdHVzKSkKKyMgIGVuZGlmCisKKy8qIFRoaXMgaXMgdGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50IHRvIGB3YWl0Jy4gIFRoZSBmdW5reSB1bmlvbgorICAgY2F1c2VzIHJlZGVjbGFyYXRpb25zIHdpdGggZWl0aGVyIGBpbnQgKicgb3IgYHVuaW9uIHdhaXQgKicgdG8gYmUKKyAgIGFsbG93ZWQgd2l0aG91dCBjb21wbGFpbnQuICBfX1dBSVRfU1RBVFVTX0RFRk4gaXMgdGhlIHR5cGUgdXNlZCBpbgorICAgdGhlIGFjdHVhbCBmdW5jdGlvbiBkZWZpbml0aW9ucy4gICovCisKKyMgIGlmICFkZWZpbmVkIF9fR05VQ19fIHx8IF9fR05VQ19fIDwgMiB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzCisjICAgZGVmaW5lIF9fV0FJVF9TVEFUVVMJdm9pZCAqCisjICAgZGVmaW5lIF9fV0FJVF9TVEFUVVNfREVGTgl2b2lkICoKKyMgIGVsc2UKKy8qIFRoaXMgd29ya3MgaW4gR0NDIDIuNi4xIGFuZCBsYXRlci4gICovCit0eXBlZGVmIHVuaW9uCisgIHsKKyAgICB1bmlvbiB3YWl0ICpfX3VwdHI7CisgICAgaW50ICpfX2lwdHI7CisgIH0gX19XQUlUX1NUQVRVUyBfX2F0dHJpYnV0ZV9fICgoX190cmFuc3BhcmVudF91bmlvbl9fKSk7CisjICAgZGVmaW5lIF9fV0FJVF9TVEFUVVNfREVGTglpbnQgKgorIyAgZW5kaWYKKworIyBlbHNlIC8qIERvbid0IHVzZSBCU0QuICAqLworCisjICBkZWZpbmUgX19XQUlUX0lOVChzdGF0dXMpCShzdGF0dXMpCisjICBkZWZpbmUgX19XQUlUX1NUQVRVUwkJaW50ICoKKyMgIGRlZmluZSBfX1dBSVRfU1RBVFVTX0RFRk4JaW50ICoKKworIyBlbmRpZiAvKiBVc2UgQlNELiAgKi8KKworLyogVGhpcyB3aWxsIGRlZmluZSBhbGwgdGhlIGBfX1cqJyBtYWNyb3MuICAqLworIyBpbmNsdWRlIDxiaXRzL3dhaXRzdGF0dXMuaD4KKworIyBkZWZpbmUgV0VYSVRTVEFUVVMoc3RhdHVzKQlfX1dFWElUU1RBVFVTIChfX1dBSVRfSU5UIChzdGF0dXMpKQorIyBkZWZpbmUgV1RFUk1TSUcoc3RhdHVzKQlfX1dURVJNU0lHIChfX1dBSVRfSU5UIChzdGF0dXMpKQorIyBkZWZpbmUgV1NUT1BTSUcoc3RhdHVzKQlfX1dTVE9QU0lHIChfX1dBSVRfSU5UIChzdGF0dXMpKQorIyBkZWZpbmUgV0lGRVhJVEVEKHN0YXR1cykJX19XSUZFWElURUQgKF9fV0FJVF9JTlQgKHN0YXR1cykpCisjIGRlZmluZSBXSUZTSUdOQUxFRChzdGF0dXMpCV9fV0lGU0lHTkFMRUQgKF9fV0FJVF9JTlQgKHN0YXR1cykpCisjIGRlZmluZSBXSUZTVE9QUEVEKHN0YXR1cykJX19XSUZTVE9QUEVEIChfX1dBSVRfSU5UIChzdGF0dXMpKQorIyBpZmRlZiBfX1dJRkNPTlRJTlVFRAorIyAgZGVmaW5lIFdJRkNPTlRJTlVFRChzdGF0dXMpCV9fV0lGQ09OVElOVUVEIChfX1dBSVRfSU5UIChzdGF0dXMpKQorIyBlbmRpZgorI2VuZGlmCS8qIDxzdGRsaWIuaD4gbm90IGluY2x1ZGVkLiAgKi8KKworI2lmZGVmCV9fVVNFX0JTRAorIyBkZWZpbmUgV0NPUkVGTEFHCQlfX1dDT1JFRkxBRworIyBkZWZpbmUgV0NPUkVEVU1QKHN0YXR1cykJX19XQ09SRURVTVAgKF9fV0FJVF9JTlQgKHN0YXR1cykpCisjIGRlZmluZSBXX0VYSVRDT0RFKHJldCwgc2lnKQlfX1dfRVhJVENPREUgKHJldCwgc2lnKQorIyBkZWZpbmUgV19TVE9QQ09ERShzaWcpCV9fV19TVE9QQ09ERSAoc2lnKQorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSB1c2VkIGJ5IHRoZSBgd2FpdGlkJyBmdW5jdGlvbi4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLOAordHlwZWRlZiBlbnVtCit7CisgIFBfQUxMLAkJLyogV2FpdCBmb3IgYW55IGNoaWxkLiAgKi8KKyAgUF9QSUQsCQkvKiBXYWl0IGZvciBzcGVjaWZpZWQgcHJvY2Vzcy4gICovCisgIFBfUEdJRAkJLyogV2FpdCBmb3IgbWVtYmVycyBvZiBwcm9jZXNzIGdyb3VwLiAgKi8KK30gaWR0eXBlX3Q7CisjZW5kaWYKKworCisvKiBXYWl0IGZvciBhIGNoaWxkIHRvIGRpZS4gIFdoZW4gb25lIGRvZXMsIHB1dCBpdHMgc3RhdHVzIGluICpTVEFUX0xPQworICAgYW5kIHJldHVybiBpdHMgcHJvY2VzcyBJRC4gIEZvciBlcnJvcnMsIHJldHVybiAocGlkX3QpIC0xLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBfX3BpZF90IHdhaXQgKF9fV0FJVF9TVEFUVVMgX19zdGF0X2xvYyk7CisKKyNpZmRlZglfX1VTRV9CU0QKKy8qIFNwZWNpYWwgdmFsdWVzIGZvciB0aGUgUElEIGFyZ3VtZW50IHRvIGB3YWl0cGlkJyBhbmQgYHdhaXQ0Jy4gICovCisjIGRlZmluZSBXQUlUX0FOWQkoLTEpCS8qIEFueSBwcm9jZXNzLiAgKi8KKyMgZGVmaW5lIFdBSVRfTVlQR1JQCTAJLyogQW55IHByb2Nlc3MgaW4gbXkgcHJvY2VzcyBncm91cC4gICovCisjZW5kaWYKKworLyogV2FpdCBmb3IgYSBjaGlsZCBtYXRjaGluZyBQSUQgdG8gZGllLgorICAgSWYgUElEIGlzIGdyZWF0ZXIgdGhhbiAwLCBtYXRjaCBhbnkgcHJvY2VzcyB3aG9zZSBwcm9jZXNzIElEIGlzIFBJRC4KKyAgIElmIFBJRCBpcyAocGlkX3QpIC0xLCBtYXRjaCBhbnkgcHJvY2Vzcy4KKyAgIElmIFBJRCBpcyAocGlkX3QpIDAsIG1hdGNoIGFueSBwcm9jZXNzIHdpdGggdGhlCisgICBzYW1lIHByb2Nlc3MgZ3JvdXAgYXMgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKyAgIElmIFBJRCBpcyBsZXNzIHRoYW4gLTEsIG1hdGNoIGFueSBwcm9jZXNzIHdob3NlCisgICBwcm9jZXNzIGdyb3VwIGlzIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBQSUQuCisgICBJZiB0aGUgV05PSEFORyBiaXQgaXMgc2V0IGluIE9QVElPTlMsIGFuZCB0aGF0IGNoaWxkCisgICBpcyBub3QgYWxyZWFkeSBkZWFkLCByZXR1cm4gKHBpZF90KSAwLiAgSWYgc3VjY2Vzc2Z1bCwKKyAgIHJldHVybiBQSUQgYW5kIHN0b3JlIHRoZSBkZWFkIGNoaWxkJ3Mgc3RhdHVzIGluIFNUQVRfTE9DLgorICAgUmV0dXJuIChwaWRfdCkgLTEgZm9yIGVycm9ycy4gIElmIHRoZSBXVU5UUkFDRUQgYml0IGlzCisgICBzZXQgaW4gT1BUSU9OUywgcmV0dXJuIHN0YXR1cyBmb3Igc3RvcHBlZCBjaGlsZHJlbjsgb3RoZXJ3aXNlIGRvbid0LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBfX3BpZF90IHdhaXRwaWQgKF9fcGlkX3QgX19waWQsIGludCAqX19zdGF0X2xvYywgaW50IF9fb3B0aW9ucyk7CisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMks4CisjIGRlZmluZSBfX25lZWRfc2lnaW5mb190CisjIGluY2x1ZGUgPGJpdHMvc2lnaW5mby5oPgorLyogV2FpdCBmb3IgYSBjaGlsZGluZyBtYXRjaGluZyBJRFRZUEUgYW5kIElEIHRvIGNoYW5nZSB0aGUgc3RhdHVzIGFuZAorICAgcGxhY2UgYXBwcm9wcmlhdGUgaW5mb3JtYXRpb24gaW4gKklORk9QLgorICAgSWYgSURUWVBFIGlzIFBfUElELCBtYXRjaCBhbnkgcHJvY2VzcyB3aG9zZSBwcm9jZXNzIElEIGlzIElELgorICAgSWYgSURUWVBFIGlzIFBfUEdJRCwgbWF0Y2ggYW55IHByb2Nlc3Mgd2hvc2UgcHJvY2VzcyBncm91cCBpcyBJRC4KKyAgIElmIElEVFlQRSBpcyBQX0FMTCwgbWF0Y2ggYW55IHByb2Nlc3MuCisgICBJZiB0aGUgV05PSEFORyBiaXQgaXMgc2V0IGluIE9QVElPTlMsIGFuZCB0aGF0IGNoaWxkCisgICBpcyBub3QgYWxyZWFkeSBkZWFkLCBjbGVhciAqSU5GT1AgYW5kIHJldHVybiAwLiAgSWYgc3VjY2Vzc2Z1bCwgc3RvcmUKKyAgIGV4aXQgY29kZSBhbmQgc3RhdHVzIGluICpJTkZPUC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHdhaXRpZCAoaWR0eXBlX3QgX19pZHR5cGUsIF9faWRfdCBfX2lkLCBzaWdpbmZvX3QgKl9faW5mb3AsCisJCSAgIGludCBfX29wdGlvbnMpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBUaGlzIGJlaW5nIGhlcmUgbWFrZXMgdGhlIHByb3RvdHlwZXMgdmFsaWQgd2hldGhlciBvciBub3QKKyAgIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCA8c3lzL3Jlc291cmNlLmg+IHRvIGRlZmluZSBgc3RydWN0IHJ1c2FnZScuICAqLworc3RydWN0IHJ1c2FnZTsKKworLyogV2FpdCBmb3IgYSBjaGlsZCB0byBleGl0LiAgV2hlbiBvbmUgZG9lcywgcHV0IGl0cyBzdGF0dXMgaW4gKlNUQVRfTE9DIGFuZAorICAgcmV0dXJuIGl0cyBwcm9jZXNzIElELiAgRm9yIGVycm9ycyByZXR1cm4gKHBpZF90KSAtMS4gIElmIFVTQUdFIGlzIG5vdAorICAgbmlsLCBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2hpbGQncyByZXNvdXJjZSB1c2FnZSB0aGVyZS4gIElmIHRoZQorICAgV1VOVFJBQ0VEIGJpdCBpcyBzZXQgaW4gT1BUSU9OUywgcmV0dXJuIHN0YXR1cyBmb3Igc3RvcHBlZCBjaGlsZHJlbjsKKyAgIG90aGVyd2lzZSBkb24ndC4gICovCitleHRlcm4gX19waWRfdCB3YWl0MyAoX19XQUlUX1NUQVRVUyBfX3N0YXRfbG9jLCBpbnQgX19vcHRpb25zLAorCQkgICAgICBzdHJ1Y3QgcnVzYWdlICogX191c2FnZSkgX19USFJPV05MOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIFBJRCBpcyBsaWtlIHdhaXRwaWQuICBPdGhlciBhcmdzIGFyZSBsaWtlIHdhaXQzLiAgKi8KK2V4dGVybiBfX3BpZF90IHdhaXQ0IChfX3BpZF90IF9fcGlkLCBfX1dBSVRfU1RBVFVTIF9fc3RhdF9sb2MsIGludCBfX29wdGlvbnMsCisJCSAgICAgIHN0cnVjdCBydXNhZ2UgKl9fdXNhZ2UpIF9fVEhST1dOTDsKKyNlbmRpZiAvKiBVc2UgQlNELiAgKi8KKworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3dhaXQuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMveGF0dHIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudS9zeXMveGF0dHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzM3ZjkwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ODZfNjQtbGludXgtZ251L3N5cy94YXR0ci5oCkBAIC0wLDAgKzEsMTA0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19YQVRUUl9ICisjZGVmaW5lIF9TWVNfWEFUVFJfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogVGhlIGZvbGxvd2luZyBjb25zdGFudHMgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBmaWZ0aCBwYXJhbWV0ZXIgb2YKKyAgIGAqc2V0eGF0dHInLiAgKi8KK2VudW0KK3sKKyAgWEFUVFJfQ1JFQVRFID0gMSwJLyogc2V0IHZhbHVlLCBmYWlsIGlmIGF0dHIgYWxyZWFkeSBleGlzdHMuICAqLworI2RlZmluZSBYQVRUUl9DUkVBVEUJWEFUVFJfQ1JFQVRFCisgIFhBVFRSX1JFUExBQ0UgPSAyCS8qIHNldCB2YWx1ZSwgZmFpbCBpZiBhdHRyIGRvZXMgbm90IGV4aXN0LiAgKi8KKyNkZWZpbmUgWEFUVFJfUkVQTEFDRQlYQVRUUl9SRVBMQUNFCit9OworCisvKiBTZXQgdGhlIGF0dHJpYnV0ZSBOQU1FIG9mIHRoZSBmaWxlIHBvaW50ZWQgdG8gYnkgUEFUSCB0byBWQUxVRSAod2hpY2gKKyAgIGlzIFNJWkUgYnl0ZXMgbG9uZykuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgc2V0eGF0dHIgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX2NvbnN0IGNoYXIgKl9fbmFtZSwKKwkJICAgICBfX2NvbnN0IHZvaWQgKl9fdmFsdWUsIHNpemVfdCBfX3NpemUsIGludCBfX2ZsYWdzKQorCV9fVEhST1c7CisKKy8qIFNldCB0aGUgYXR0cmlidXRlIE5BTUUgb2YgdGhlIGZpbGUgcG9pbnRlZCB0byBieSBQQVRIIHRvIFZBTFVFICh3aGljaCBpcworICAgU0laRSBieXRlcyBsb25nKSwgbm90IGZvbGxvd2luZyBzeW1saW5rcyBmb3IgdGhlIGxhc3QgcGF0aG5hbWUgY29tcG9uZW50LgorICAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IGxzZXR4YXR0ciAoX19jb25zdCBjaGFyICpfX3BhdGgsIF9fY29uc3QgY2hhciAqX19uYW1lLAorCQkgICAgICBfX2NvbnN0IHZvaWQgKl9fdmFsdWUsIHNpemVfdCBfX3NpemUsIGludCBfX2ZsYWdzKQorCV9fVEhST1c7CisKKy8qIFNldCB0aGUgYXR0cmlidXRlIE5BTUUgb2YgdGhlIGZpbGUgZGVzY3JpcHRvciBGRCB0byBWQUxVRSAod2hpY2ggaXMgU0laRQorICAgYnl0ZXMgbG9uZykuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgZnNldHhhdHRyIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX25hbWUsIF9fY29uc3Qgdm9pZCAqX192YWx1ZSwKKwkJICAgICAgc2l6ZV90IF9fc2l6ZSwgaW50IF9fZmxhZ3MpIF9fVEhST1c7CisKKy8qIEdldCB0aGUgYXR0cmlidXRlIE5BTUUgb2YgdGhlIGZpbGUgcG9pbnRlZCB0byBieSBQQVRIIHRvIFZBTFVFICh3aGljaCBpcworICAgU0laRSBieXRlcyBsb25nKS4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIHNzaXplX3QgZ2V0eGF0dHIgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX2NvbnN0IGNoYXIgKl9fbmFtZSwKKwkJCSB2b2lkICpfX3ZhbHVlLCBzaXplX3QgX19zaXplKSBfX1RIUk9XOworCisvKiBHZXQgdGhlIGF0dHJpYnV0ZSBOQU1FIG9mIHRoZSBmaWxlIHBvaW50ZWQgdG8gYnkgUEFUSCB0byBWQUxVRSAod2hpY2ggaXMKKyAgIFNJWkUgYnl0ZXMgbG9uZyksIG5vdCBmb2xsb3dpbmcgc3ltbGlua3MgZm9yIHRoZSBsYXN0IHBhdGhuYW1lIGNvbXBvbmVudC4KKyAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIHNzaXplX3QgbGdldHhhdHRyIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19jb25zdCBjaGFyICpfX25hbWUsCisJCQkgIHZvaWQgKl9fdmFsdWUsIHNpemVfdCBfX3NpemUpIF9fVEhST1c7CisKKy8qIEdldCB0aGUgYXR0cmlidXRlIE5BTUUgb2YgdGhlIGZpbGUgZGVzY3JpcHRvciBGRCB0byBWQUxVRSAod2hpY2ggaXMgU0laRQorICAgYnl0ZXMgbG9uZykuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBzc2l6ZV90IGZnZXR4YXR0ciAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19uYW1lLCB2b2lkICpfX3ZhbHVlLAorCQkJICBzaXplX3QgX19zaXplKSBfX1RIUk9XOworCisvKiBMaXN0IGF0dHJpYnV0ZXMgb2YgdGhlIGZpbGUgcG9pbnRlZCB0byBieSBQQVRIIGludG8gdGhlIHVzZXItc3VwcGxpZWQKKyAgIGJ1ZmZlciBMSVNUICh3aGljaCBpcyBTSVpFIGJ5dGVzIGJpZykuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBmb3IKKyAgIGVycm9ycy4gICovCitleHRlcm4gc3NpemVfdCBsaXN0eGF0dHIgKF9fY29uc3QgY2hhciAqX19wYXRoLCBjaGFyICpfX2xpc3QsIHNpemVfdCBfX3NpemUpCisJX19USFJPVzsKKworLyogTGlzdCBhdHRyaWJ1dGVzIG9mIHRoZSBmaWxlIHBvaW50ZWQgdG8gYnkgUEFUSCBpbnRvIHRoZSB1c2VyLXN1cHBsaWVkCisgICBidWZmZXIgTElTVCAod2hpY2ggaXMgU0laRSBieXRlcyBiaWcpLCBub3QgZm9sbG93aW5nIHN5bWxpbmtzIGZvciB0aGUKKyAgIGxhc3QgcGF0aG5hbWUgY29tcG9uZW50LiAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gc3NpemVfdCBsbGlzdHhhdHRyIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgY2hhciAqX19saXN0LCBzaXplX3QgX19zaXplKQorCV9fVEhST1c7CisKKy8qIExpc3QgYXR0cmlidXRlcyBvZiB0aGUgZmlsZSBkZXNjcmlwdG9yIEZEIGludG8gdGhlIHVzZXItc3VwcGxpZWQgYnVmZmVyCisgICBMSVNUICh3aGljaCBpcyBTSVpFIGJ5dGVzIGJpZykuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBzc2l6ZV90IGZsaXN0eGF0dHIgKGludCBfX2ZkLCBjaGFyICpfX2xpc3QsIHNpemVfdCBfX3NpemUpCisJX19USFJPVzsKKworLyogUmVtb3ZlIHRoZSBhdHRyaWJ1dGUgTkFNRSBmcm9tIHRoZSBmaWxlIHBvaW50ZWQgdG8gYnkgUEFUSC4gIFJldHVybiAwCisgICBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgcmVtb3ZleGF0dHIgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX2NvbnN0IGNoYXIgKl9fbmFtZSkgX19USFJPVzsKKworLyogUmVtb3ZlIHRoZSBhdHRyaWJ1dGUgTkFNRSBmcm9tIHRoZSBmaWxlIHBvaW50ZWQgdG8gYnkgUEFUSCwgbm90CisgICBmb2xsb3dpbmcgc3ltbGlua3MgZm9yIHRoZSBsYXN0IHBhdGhuYW1lIGNvbXBvbmVudC4gIFJldHVybiAwIG9uCisgICBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgbHJlbW92ZXhhdHRyIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19jb25zdCBjaGFyICpfX25hbWUpIF9fVEhST1c7CisKKy8qIFJlbW92ZSB0aGUgYXR0cmlidXRlIE5BTUUgZnJvbSB0aGUgZmlsZSBkZXNjcmlwdG9yIEZELiAgUmV0dXJuIDAgb24KKyAgIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIGludCBmcmVtb3ZleGF0dHIgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fbmFtZSkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHN5cy94YXR0ci5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94Y2IvYmlncmVxLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3hjYi9iaWdyZXEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjU5ZDAzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94Y2IvYmlncmVxLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBUaGlzIGZpbGUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBiaWdyZXEueG1sIGJ5IGNfY2xpZW50LnB5LgorICogRWRpdCBhdCB5b3VyIHBlcmlsLgorICovCisKKy8qKgorICogQGRlZmdyb3VwIFhDQl9CaWdSZXF1ZXN0c19BUEkgWENCIEJpZ1JlcXVlc3RzIEFQSQorICogQGJyaWVmIEJpZ1JlcXVlc3RzIFhDQiBQcm90b2NvbCBJbXBsZW1lbnRhdGlvbi4KKyAqIEB7CisgKiovCisKKyNpZm5kZWYgX19CSUdSRVFfSAorI2RlZmluZSBfX0JJR1JFUV9ICisKKyNpbmNsdWRlICJ4Y2IuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFhDQl9CSUdSRVFVRVNUU19NQUpPUl9WRVJTSU9OIDAKKyNkZWZpbmUgWENCX0JJR1JFUVVFU1RTX01JTk9SX1ZFUlNJT04gMAorICAKK2V4dGVybiB4Y2JfZXh0ZW5zaW9uX3QgeGNiX2JpZ19yZXF1ZXN0c19pZDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2JpZ19yZXF1ZXN0c19lbmFibGVfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9iaWdfcmVxdWVzdHNfZW5hYmxlX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9iaWdfcmVxdWVzdHNfZW5hYmxlX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfYmlnX3JlcXVlc3RzX2VuYWJsZS4gKi8KKyNkZWZpbmUgWENCX0JJR19SRVFVRVNUU19FTkFCTEUgMAorCisvKioKKyAqIEBicmllZiB4Y2JfYmlnX3JlcXVlc3RzX2VuYWJsZV9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9iaWdfcmVxdWVzdHNfZW5hYmxlX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIG1pbm9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCit9IHhjYl9iaWdfcmVxdWVzdHNfZW5hYmxlX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2JpZ19yZXF1ZXN0c19lbmFibGVfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2JpZ19yZXF1ZXN0c19lbmFibGVfcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBtYXhpbXVtX3JlcXVlc3RfbGVuZ3RoOyAvKio8ICAqLworfSB4Y2JfYmlnX3JlcXVlc3RzX2VuYWJsZV9yZXBseV90OworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2JpZ19yZXF1ZXN0c19lbmFibGVfY29va2llX3QgeGNiX2JpZ19yZXF1ZXN0c19lbmFibGUKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEByZXR1cm5zIHhjYl9iaWdfcmVxdWVzdHNfZW5hYmxlX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9iaWdfcmVxdWVzdHNfZW5hYmxlX2Nvb2tpZV90Cit4Y2JfYmlnX3JlcXVlc3RzX2VuYWJsZSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfYmlnX3JlcXVlc3RzX2VuYWJsZV9jb29raWVfdCB4Y2JfYmlnX3JlcXVlc3RzX2VuYWJsZV91bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEByZXR1cm5zIHhjYl9iaWdfcmVxdWVzdHNfZW5hYmxlX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9iaWdfcmVxdWVzdHNfZW5hYmxlX2Nvb2tpZV90Cit4Y2JfYmlnX3JlcXVlc3RzX2VuYWJsZV91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2JpZ19yZXF1ZXN0c19lbmFibGVfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2JpZ19yZXF1ZXN0c19lbmFibGVfcmVwbHlfdCAqIHhjYl9iaWdfcmVxdWVzdHNfZW5hYmxlX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfYmlnX3JlcXVlc3RzX2VuYWJsZV9jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfYmlnX3JlcXVlc3RzX2VuYWJsZV9yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2JpZ19yZXF1ZXN0c19lbmFibGVfcmVwbHlfdCAqCit4Y2JfYmlnX3JlcXVlc3RzX2VuYWJsZV9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9iaWdfcmVxdWVzdHNfZW5hYmxlX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICoqZSAgLyoqPCAqLyk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCisKKy8qKgorICogQH0KKyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94Y2IveGNfbWlzYy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94Y2IveGNfbWlzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNzMxOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3hjYi94Y19taXNjLmgKQEAgLTAsMCArMSw0MTMgQEAKKy8qCisgKiBUaGlzIGZpbGUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB4Y19taXNjLnhtbCBieSBjX2NsaWVudC5weS4KKyAqIEVkaXQgYXQgeW91ciBwZXJpbC4KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBYQ0JfWENNaXNjX0FQSSBYQ0IgWENNaXNjIEFQSQorICogQGJyaWVmIFhDTWlzYyBYQ0IgUHJvdG9jb2wgSW1wbGVtZW50YXRpb24uCisgKiBAeworICoqLworCisjaWZuZGVmIF9fWENfTUlTQ19ICisjZGVmaW5lIF9fWENfTUlTQ19ICisKKyNpbmNsdWRlICJ4Y2IuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFhDQl9YQ01JU0NfTUFKT1JfVkVSU0lPTiAxCisjZGVmaW5lIFhDQl9YQ01JU0NfTUlOT1JfVkVSU0lPTiAxCisgIAorZXh0ZXJuIHhjYl9leHRlbnNpb25fdCB4Y2JfeGNfbWlzY19pZDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3hjX21pc2NfZ2V0X3ZlcnNpb25fY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl94Y19taXNjX2dldF92ZXJzaW9uX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl94Y19taXNjX2dldF92ZXJzaW9uX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfeGNfbWlzY19nZXRfdmVyc2lvbi4gKi8KKyNkZWZpbmUgWENCX1hDX01JU0NfR0VUX1ZFUlNJT04gMAorCisvKioKKyAqIEBicmllZiB4Y2JfeGNfbWlzY19nZXRfdmVyc2lvbl9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl94Y19taXNjX2dldF92ZXJzaW9uX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIG1pbm9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDE2X3QgY2xpZW50X21ham9yX3ZlcnNpb247IC8qKjwgICovCisgICAgdWludDE2X3QgY2xpZW50X21pbm9yX3ZlcnNpb247IC8qKjwgICovCit9IHhjYl94Y19taXNjX2dldF92ZXJzaW9uX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3hjX21pc2NfZ2V0X3ZlcnNpb25fcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3hjX21pc2NfZ2V0X3ZlcnNpb25fcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXJ2ZXJfbWFqb3JfdmVyc2lvbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXJ2ZXJfbWlub3JfdmVyc2lvbjsgLyoqPCAgKi8KK30geGNiX3hjX21pc2NfZ2V0X3ZlcnNpb25fcmVwbHlfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3hjX21pc2NfZ2V0X3hpZF9yYW5nZV9jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3hjX21pc2NfZ2V0X3hpZF9yYW5nZV9jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlLiAqLworI2RlZmluZSBYQ0JfWENfTUlTQ19HRVRfWElEX1JBTkdFIDEKKworLyoqCisgKiBAYnJpZWYgeGNiX3hjX21pc2NfZ2V0X3hpZF9yYW5nZV9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl94Y19taXNjX2dldF94aWRfcmFuZ2VfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgbWlub3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KK30geGNiX3hjX21pc2NfZ2V0X3hpZF9yYW5nZV9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl94Y19taXNjX2dldF94aWRfcmFuZ2VfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3hjX21pc2NfZ2V0X3hpZF9yYW5nZV9yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQzMl90IHN0YXJ0X2lkOyAvKio8ICAqLworICAgIHVpbnQzMl90IGNvdW50OyAvKio8ICAqLworfSB4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlX3JlcGx5X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl94Y19taXNjX2dldF94aWRfbGlzdF9jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl94Y19taXNjX2dldF94aWRfbGlzdF9jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0LiAqLworI2RlZmluZSBYQ0JfWENfTUlTQ19HRVRfWElEX0xJU1QgMgorCisvKioKKyAqIEBicmllZiB4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3RfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3RfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgbWlub3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBjb3VudDsgLyoqPCAgKi8KK30geGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl94Y19taXNjX2dldF94aWRfbGlzdF9yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQzMl90IGlkc19sZW47IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMVsyMF07IC8qKjwgICovCit9IHhjYl94Y19taXNjX2dldF94aWRfbGlzdF9yZXBseV90OworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3hjX21pc2NfZ2V0X3ZlcnNpb25fY29va2llX3QgeGNiX3hjX21pc2NfZ2V0X3ZlcnNpb24KKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBjbGllbnRfbWFqb3JfdmVyc2lvbgorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBjbGllbnRfbWlub3JfdmVyc2lvbgorICoqIEByZXR1cm5zIHhjYl94Y19taXNjX2dldF92ZXJzaW9uX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl94Y19taXNjX2dldF92ZXJzaW9uX2Nvb2tpZV90Cit4Y2JfeGNfbWlzY19nZXRfdmVyc2lvbiAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBjbGllbnRfbWFqb3JfdmVyc2lvbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBjbGllbnRfbWlub3JfdmVyc2lvbiAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfeGNfbWlzY19nZXRfdmVyc2lvbl9jb29raWVfdCB4Y2JfeGNfbWlzY19nZXRfdmVyc2lvbl91bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBjbGllbnRfbWFqb3JfdmVyc2lvbgorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBjbGllbnRfbWlub3JfdmVyc2lvbgorICoqIEByZXR1cm5zIHhjYl94Y19taXNjX2dldF92ZXJzaW9uX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl94Y19taXNjX2dldF92ZXJzaW9uX2Nvb2tpZV90Cit4Y2JfeGNfbWlzY19nZXRfdmVyc2lvbl91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGNsaWVudF9tYWpvcl92ZXJzaW9uICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBjbGllbnRfbWlub3JfdmVyc2lvbiAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfeGNfbWlzY19nZXRfdmVyc2lvbl91bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfeGNfbWlzY19nZXRfdmVyc2lvbl9yZXBseV90ICogeGNiX3hjX21pc2NfZ2V0X3ZlcnNpb25fcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl94Y19taXNjX2dldF92ZXJzaW9uX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl94Y19taXNjX2dldF92ZXJzaW9uX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfeGNfbWlzY19nZXRfdmVyc2lvbl9yZXBseV90ICoKK3hjYl94Y19taXNjX2dldF92ZXJzaW9uX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3hjX21pc2NfZ2V0X3ZlcnNpb25fY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgKiplICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl94Y19taXNjX2dldF94aWRfcmFuZ2VfY29va2llX3QgeGNiX3hjX21pc2NfZ2V0X3hpZF9yYW5nZQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX3hjX21pc2NfZ2V0X3hpZF9yYW5nZV9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlX2Nvb2tpZV90Cit4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl94Y19taXNjX2dldF94aWRfcmFuZ2VfY29va2llX3QgeGNiX3hjX21pc2NfZ2V0X3hpZF9yYW5nZV91bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEByZXR1cm5zIHhjYl94Y19taXNjX2dldF94aWRfcmFuZ2VfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3hjX21pc2NfZ2V0X3hpZF9yYW5nZV9jb29raWVfdAoreGNiX3hjX21pc2NfZ2V0X3hpZF9yYW5nZV91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX3hjX21pc2NfZ2V0X3hpZF9yYW5nZV91bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlX3JlcGx5X3QgKiB4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl94Y19taXNjX2dldF94aWRfcmFuZ2VfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlX3JlcGx5X3QgKgoreGNiX3hjX21pc2NfZ2V0X3hpZF9yYW5nZV9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfeGNfbWlzY19nZXRfeGlkX3JhbmdlX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCitpbnQKK3hjYl94Y19taXNjX2dldF94aWRfbGlzdF9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl94Y19taXNjX2dldF94aWRfbGlzdF9jb29raWVfdCB4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3QKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBjb3VudAorICoqIEByZXR1cm5zIHhjYl94Y19taXNjX2dldF94aWRfbGlzdF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3RfY29va2llX3QKK3hjYl94Y19taXNjX2dldF94aWRfbGlzdCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgY291bnQgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X2Nvb2tpZV90IHhjYl94Y19taXNjX2dldF94aWRfbGlzdF91bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBjb3VudAorICoqIEByZXR1cm5zIHhjYl94Y19taXNjX2dldF94aWRfbGlzdF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3RfY29va2llX3QKK3hjYl94Y19taXNjX2dldF94aWRfbGlzdF91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBjb3VudCAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB1aW50MzJfdCAqIHhjYl94Y19taXNjX2dldF94aWRfbGlzdF9pZHMKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB1aW50MzJfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3VpbnQzMl90ICoKK3hjYl94Y19taXNjX2dldF94aWRfbGlzdF9pZHMgKGNvbnN0IHhjYl94Y19taXNjX2dldF94aWRfbGlzdF9yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3RfaWRzX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3RfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl94Y19taXNjX2dldF94aWRfbGlzdF9pZHNfbGVuZ3RoIChjb25zdCB4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3RfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl94Y19taXNjX2dldF94aWRfbGlzdF9pZHNfZW5kCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl94Y19taXNjX2dldF94aWRfbGlzdF9yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3RfaWRzX2VuZCAoY29uc3QgeGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl94Y19taXNjX2dldF94aWRfbGlzdF9yZXBseV90ICogeGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfeGNfbWlzY19nZXRfeGlkX2xpc3RfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl94Y19taXNjX2dldF94aWRfbGlzdF9yZXBseV90ICoKK3hjYl94Y19taXNjX2dldF94aWRfbGlzdF9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3hjX21pc2NfZ2V0X3hpZF9saXN0X2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICAgKiplICAvKio8ICovKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKworLyoqCisgKiBAfQorICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3hjYi94Y2IuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveGNiL3hjYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZjY1MGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3hjYi94Y2IuaApAQCAtMCwwICsxLDUyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IEJhcnQgTWFzc2V5LCBKYW1leSBTaGFycCwgYW5kIEpvc2ggVHJpcGxldHQuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lcyBvZiB0aGUgYXV0aG9ycyBvciB0aGVpcgorICogaW5zdGl0dXRpb25zIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZQorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiBhdXRob3JpemF0aW9uIGZyb20gdGhlIGF1dGhvcnMuCisgKi8KKworI2lmbmRlZiBfX1hDQl9IX18KKyNkZWZpbmUgX19YQ0JfSF9fCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpZiBkZWZpbmVkKF9fc29sYXJpc19fKQorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1dJTjMyCisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2Vsc2UKKyNpbmNsdWRlICJ4Y2Jfd2luZGVmcy5oIgorI2VuZGlmCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBAZmlsZSB4Y2IuaAorICovCisKKy8qKgorICogQGRlZmdyb3VwIFhDQl9Db3JlX0FQSSBYQ0IgQ29yZSBBUEkKKyAqIEBicmllZiBDb3JlIEFQSSBvZiB0aGUgWENCIGxpYnJhcnkuCisgKgorICogQHsKKyAqLworCisvKiBQcmUtZGVmaW5lZCBjb25zdGFudHMgKi8KKworLyoqIEN1cnJlbnQgcHJvdG9jb2wgdmVyc2lvbiAqLworI2RlZmluZSBYX1BST1RPQ09MIDExCisKKy8qKiBDdXJyZW50IG1pbm9yIHZlcnNpb24gKi8KKyNkZWZpbmUgWF9QUk9UT0NPTF9SRVZJU0lPTiAwCisKKy8qKiBYX1RDUF9QT1JUICsgZGlzcGxheSBudW1iZXIgPSBzZXJ2ZXIgcG9ydCBmb3IgVENQIHRyYW5zcG9ydCAqLworI2RlZmluZSBYX1RDUF9QT1JUIDYwMDAKKworLyoqIHhjYiBjb25uZWN0aW9uIGVycm9ycyBiZWNhdXNlIG9mIHNvY2tldCwgcGlwZSBhbmQgb3RoZXIgc3RyZWFtIGVycm9ycy4gKi8KKyNkZWZpbmUgWENCX0NPTk5fRVJST1IgMQorCisvKiogeGNiIGNvbm5lY3Rpb24gc2h1dGRvd24gYmVjYXVzZSBvZiBleHRlbnNpb24gbm90IHNwcHBvcnRlZCAqLworI2RlZmluZSBYQ0JfQ09OTl9DTE9TRURfRVhUX05PVFNVUFBPUlRFRCAyCisKKy8qKiBtYWxsb2MoKSwgY2FsbG9jKCkgYW5kIHJlYWxsb2MoKSBlcnJvciB1cG9uIGZhaWx1cmUsIGZvciBlZyBFTk9NRU0gKi8KKyNkZWZpbmUgWENCX0NPTk5fQ0xPU0VEX01FTV9JTlNVRkZJQ0lFTlQgMworCisvKiogQ29ubmVjdGlvbiBjbG9zZWQsIGV4Y2VlZGluZyByZXF1ZXN0IGxlbmd0aCB0aGF0IHNlcnZlciBhY2NlcHRzLiAqLworI2RlZmluZSBYQ0JfQ09OTl9DTE9TRURfUkVRX0xFTl9FWENFRUQgNAorCisvKiogQ29ubmVjdGlvbiBjbG9zZWQsIGVycm9yIGR1cmluZyBwYXJzaW5nIGRpc3BsYXkgc3RyaW5nLiAqLworI2RlZmluZSBYQ0JfQ09OTl9DTE9TRURfUEFSU0VfRVJSIDUKKworI2RlZmluZSBYQ0JfVFlQRV9QQUQoVCxJKSAoLShJKSAmIChzaXplb2YoVCkgPiA0ID8gMyA6IHNpemVvZihUKSAtIDEpKQorCisvKiBPcGFxdWUgc3RydWN0dXJlcyAqLworCisvKioKKyAqIEBicmllZiBYQ0IgQ29ubmVjdGlvbiBzdHJ1Y3R1cmUuCisgKgorICogQSBzdHJ1Y3R1cmUgdGhhdCBjb250YWluIGFsbCBkYXRhIHRoYXQgIFhDQiBuZWVkcyB0byBjb21tdW5pY2F0ZSB3aXRoIGFuIFggc2VydmVyLgorICovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY29ubmVjdGlvbl90IHhjYl9jb25uZWN0aW9uX3Q7ICAvKio8IE9wYXF1ZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBhbGwgZGF0YSB0aGF0ICBYQ0IgbmVlZHMgdG8gY29tbXVuaWNhdGUgd2l0aCBhbiBYIHNlcnZlci4gKi8KKworCisvKiBPdGhlciB0eXBlcyAqLworCisvKioKKyAqIEBicmllZiBHZW5lcmljIGl0ZXJhdG9yLgorICoKKyAqIEEgZ2VuZXJpYyBpdGVyYXRvciBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB2b2lkICpkYXRhOyAgIC8qKjwgRGF0YSBvZiB0aGUgY3VycmVudCBpdGVyYXRvciAqLworICAgIGludCByZW07ICAgIC8qKjwgcmVtYWluaW5nIGVsZW1lbnRzICovCisgICAgaW50IGluZGV4OyAgLyoqPCBpbmRleCBvZiB0aGUgY3VycmVudCBpdGVyYXRvciAqLworfSB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90OworCisvKioKKyAqIEBicmllZiBHZW5lcmljIHJlcGx5LgorICoKKyAqIEEgZ2VuZXJpYyByZXBseSBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgcmVzcG9uc2VfdHlwZTsgIC8qKjwgVHlwZSBvZiB0aGUgcmVzcG9uc2UgKi8KKyAgICB1aW50OF90ICBwYWQwOyAgICAgICAgICAgLyoqPCBQYWRkaW5nICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7ICAgICAgIC8qKjwgU2VxdWVuY2UgbnVtYmVyICovCisgICAgdWludDMyX3QgbGVuZ3RoOyAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIHRoZSByZXNwb25zZSAqLworfSB4Y2JfZ2VuZXJpY19yZXBseV90OworCisvKioKKyAqIEBicmllZiBHZW5lcmljIGV2ZW50LgorICoKKyAqIEEgZ2VuZXJpYyBldmVudCBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgcmVzcG9uc2VfdHlwZTsgIC8qKjwgVHlwZSBvZiB0aGUgcmVzcG9uc2UgKi8KKyAgICB1aW50OF90ICBwYWQwOyAgICAgICAgICAgLyoqPCBQYWRkaW5nICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7ICAgICAgIC8qKjwgU2VxdWVuY2UgbnVtYmVyICovCisgICAgdWludDMyX3QgcGFkWzddOyAgICAgICAgIC8qKjwgUGFkZGluZyAqLworICAgIHVpbnQzMl90IGZ1bGxfc2VxdWVuY2U7ICAvKio8IGZ1bGwgc2VxdWVuY2UgKi8KK30geGNiX2dlbmVyaWNfZXZlbnRfdDsKKworLyoqCisgKiBAYnJpZWYgR0UgZXZlbnQKKyAqCisgKiBBbiBldmVudCBhcyBzZW50IGJ5IHRoZSBYR0UgZXh0ZW5zaW9uLiBUaGUgbGVuZ3RoIGZpZWxkIHNwZWNpZmllcyB0aGUKKyAqIG51bWJlciBvZiA0LWJ5dGUgYmxvY2tzIHRyYWlsaW5nIHRoZSBzdHJ1Y3QuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAgLyoqPCBUeXBlIG9mIHRoZSByZXNwb25zZSAqLworICAgIHVpbnQ4X3QgIHBhZDA7ICAgICAgICAgICAvKio8IFBhZGRpbmcgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgICAgICAgLyoqPCBTZXF1ZW5jZSBudW1iZXIgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7CisgICAgdWludDE2X3QgZXZlbnRfdHlwZTsKKyAgICB1aW50MTZfdCBwYWQxOworICAgIHVpbnQzMl90IHBhZFs1XTsgICAgICAgICAvKio8IFBhZGRpbmcgKi8KKyAgICB1aW50MzJfdCBmdWxsX3NlcXVlbmNlOyAgLyoqPCBmdWxsIHNlcXVlbmNlICovCit9IHhjYl9nZV9ldmVudF90OworCisvKioKKyAqIEBicmllZiBHZW5lcmljIGVycm9yLgorICoKKyAqIEEgZ2VuZXJpYyBlcnJvciBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgcmVzcG9uc2VfdHlwZTsgIC8qKjwgVHlwZSBvZiB0aGUgcmVzcG9uc2UgKi8KKyAgICB1aW50OF90ICAgZXJyb3JfY29kZTsgICAgIC8qKjwgRXJyb3IgY29kZSAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAgICAgICAvKio8IFNlcXVlbmNlIG51bWJlciAqLworICAgIHVpbnQzMl90IHJlc291cmNlX2lkOyAgICAgLyoqIDwgUmVzb3VyY2UgSUQgZm9yIHJlcXVlc3RzIHdpdGggc2lkZSBlZmZlY3RzIG9ubHkgKi8KKyAgICB1aW50MTZfdCBtaW5vcl9jb2RlOyAgICAgIC8qKiA8IE1pbm9yIG9wY29kZSBvZiB0aGUgZmFpbGVkIHJlcXVlc3QgKi8KKyAgICB1aW50OF90IG1ham9yX2NvZGU7ICAgICAgIC8qKiA8IE1ham9yIG9wY29kZSBvZiB0aGUgZmFpbGVkIHJlcXVlc3QgKi8KKyAgICB1aW50OF90IHBhZDA7CisgICAgdWludDMyX3QgcGFkWzVdOyAgICAgICAgIC8qKjwgUGFkZGluZyAqLworICAgIHVpbnQzMl90IGZ1bGxfc2VxdWVuY2U7ICAvKio8IGZ1bGwgc2VxdWVuY2UgKi8KK30geGNiX2dlbmVyaWNfZXJyb3JfdDsKKworLyoqCisgKiBAYnJpZWYgR2VuZXJpYyBjb29raWUuCisgKgorICogQSBnZW5lcmljIGNvb2tpZSBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7ICAvKio8IFNlcXVlbmNlIG51bWJlciAqLworfSB4Y2Jfdm9pZF9jb29raWVfdDsKKworCisvKiBJbmNsdWRlIHRoZSBnZW5lcmF0ZWQgeHByb3RvIGhlYWRlci4gKi8KKyNpbmNsdWRlICJ4cHJvdG8uaCIKKworCisvKiogWENCX05PTkUgaXMgdGhlIHVuaXZlcnNhbCBudWxsIHJlc291cmNlIG9yIG51bGwgYXRvbSBwYXJhbWV0ZXIgdmFsdWUgZm9yIG1hbnkgY29yZSBYIHJlcXVlc3RzICovCisjZGVmaW5lIFhDQl9OT05FIDBMCisKKy8qKiBYQ0JfQ09QWV9GUk9NX1BBUkVOVCBjYW4gYmUgdXNlZCBmb3IgbWFueSB4Y2JfY3JlYXRlX3dpbmRvdyBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFhDQl9DT1BZX0ZST01fUEFSRU5UIDBMCisKKy8qKiBYQ0JfQ1VSUkVOVF9USU1FIGNhbiBiZSB1c2VkIGluIG1vc3QgcmVxdWVzdHMgdGhhdCB0YWtlIGFuIHhjYl90aW1lc3RhbXBfdCAqLworI2RlZmluZSBYQ0JfQ1VSUkVOVF9USU1FIDBMCisKKy8qKiBYQ0JfTk9fU1lNQk9MIGZpbGxzIGluIHVudXNlZCBlbnRyaWVzIGluIHhjYl9rZXlzeW1fdCB0YWJsZXMgKi8KKyNkZWZpbmUgWENCX05PX1NZTUJPTCAwTAorCisKKy8qIHhjYl9hdXRoLmMgKi8KKworLyoqCisgKiBAYnJpZWYgQ29udGFpbmVyIGZvciBhdXRob3JpemF0aW9uIGluZm9ybWF0aW9uLgorICoKKyAqIEEgY29udGFpbmVyIGZvciBhdXRob3JpemF0aW9uIGluZm9ybWF0aW9uIHRvIGJlIHNlbnQgdG8gdGhlIFggc2VydmVyLgorICovCit0eXBlZGVmIHN0cnVjdCB4Y2JfYXV0aF9pbmZvX3QgeworICAgIGludCAgIG5hbWVsZW47ICAvKio8IExlbmd0aCBvZiB0aGUgc3RyaW5nIG5hbWUgKGFzIHJldHVybmVkIGJ5IHN0cmxlbikuICovCisgICAgY2hhciAqbmFtZTsgICAgIC8qKjwgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sIG5hbWUsIHN1Y2ggYXMgIk1JVC1NQUdJQy1DT09LSUUtMSIgb3IgIlhETS1BVVRIT1JJWkFUSU9OLTEiLiAqLworICAgIGludCAgIGRhdGFsZW47ICAvKio8IExlbmd0aCBvZiB0aGUgZGF0YSBtZW1iZXIuICovCisgICAgY2hhciAqZGF0YTsgICAvKio8IERhdGEgaW50ZXJwcmV0ZWQgaW4gYSBwcm90b2NvbC1zcGVjaWZpYyBtYW5uZXIuICovCit9IHhjYl9hdXRoX2luZm9fdDsKKworCisvKiB4Y2Jfb3V0LmMgKi8KKworLyoqCisgKiBAYnJpZWYgRm9yY2VzIGFueSBidWZmZXJlZCBvdXRwdXQgdG8gYmUgd3JpdHRlbiB0byB0aGUgc2VydmVyLgorICogQHBhcmFtIGM6IFRoZSBjb25uZWN0aW9uIHRvIHRoZSBYIHNlcnZlci4KKyAqIEByZXR1cm4gPiBAYyAwIG9uIHN1Y2Nlc3MsIDw9IEBjIDAgb3RoZXJ3aXNlLgorICoKKyAqIEZvcmNlcyBhbnkgYnVmZmVyZWQgb3V0cHV0IHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHNlcnZlci4gQmxvY2tzCisgKiB1bnRpbCB0aGUgd3JpdGUgaXMgY29tcGxldGUuCisgKi8KK2ludCB4Y2JfZmx1c2goeGNiX2Nvbm5lY3Rpb25fdCAqYyk7CisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIG1heGltdW0gcmVxdWVzdCBsZW5ndGggdGhhdCB0aGlzIHNlcnZlciBhY2NlcHRzLgorICogQHBhcmFtIGM6IFRoZSBjb25uZWN0aW9uIHRvIHRoZSBYIHNlcnZlci4KKyAqIEByZXR1cm4gVGhlIG1heGltdW0gcmVxdWVzdCBsZW5ndGggZmllbGQuCisgKgorICogSW4gdGhlIGFic2VuY2Ugb2YgdGhlIEJJRy1SRVFVRVNUUyBleHRlbnNpb24sIHJldHVybnMgdGhlCisgKiBtYXhpbXVtIHJlcXVlc3QgbGVuZ3RoIGZpZWxkIGZyb20gdGhlIGNvbm5lY3Rpb24gc2V0dXAgZGF0YSwgd2hpY2gKKyAqIG1heSBiZSBhcyBtdWNoIGFzIDY1NTM1LiBJZiB0aGUgc2VydmVyIHN1cHBvcnRzIEJJRy1SRVFVRVNUUywgdGhlbgorICogdGhlIG1heGltdW0gcmVxdWVzdCBsZW5ndGggZmllbGQgZnJvbSB0aGUgcmVwbHkgdG8gdGhlCisgKiBCaWdSZXF1ZXN0c0VuYWJsZSByZXF1ZXN0IHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZC4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBsZW5ndGggaXMgbWVhc3VyZWQgaW4gZm91ci1ieXRlIHVuaXRzLCBtYWtpbmcgdGhlCisgKiB0aGVvcmV0aWNhbCBtYXhpbXVtIGxlbmd0aHMgcm91Z2hseSAyNTZrQiB3aXRob3V0IEJJRy1SRVFVRVNUUyBhbmQKKyAqIDE2R0Igd2l0aC4KKyAqLwordWludDMyX3QgeGNiX2dldF9tYXhpbXVtX3JlcXVlc3RfbGVuZ3RoKHhjYl9jb25uZWN0aW9uX3QgKmMpOworCisvKioKKyAqIEBicmllZiBQcmVmZXRjaCB0aGUgbWF4aW11bSByZXF1ZXN0IGxlbmd0aCB3aXRob3V0IGJsb2NraW5nLgorICogQHBhcmFtIGM6IFRoZSBjb25uZWN0aW9uIHRvIHRoZSBYIHNlcnZlci4KKyAqCisgKiBXaXRob3V0IGJsb2NraW5nLCBkb2VzIGFzIG11Y2ggd29yayBhcyBwb3NzaWJsZSB0b3dhcmQgY29tcHV0aW5nCisgKiB0aGUgbWF4aW11bSByZXF1ZXN0IGxlbmd0aCBhY2NlcHRlZCBieSB0aGUgWCBzZXJ2ZXIuCisgKgorICogSW52b2tpbmcgdGhpcyBmdW5jdGlvbiBtYXkgY2F1c2UgYSBjYWxsIHRvIHhjYl9iaWdfcmVxdWVzdHNfZW5hYmxlLAorICogYnV0IHdpbGwgbm90IGJsb2NrIHdhaXRpbmcgZm9yIHRoZSByZXBseS4KKyAqIHhjYl9nZXRfbWF4aW11bV9yZXF1ZXN0X2xlbmd0aCB3aWxsIHJldHVybiB0aGUgcHJlZmV0Y2hlZCBkYXRhCisgKiBhZnRlciBwb3NzaWJseSBibG9ja2luZyB3aGlsZSB0aGUgcmVwbHkgaXMgcmV0cmlldmVkLgorICoKKyAqIE5vdGUgdGhhdCBpbiBvcmRlciBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBmdWxseSBub24tYmxvY2tpbmcsIHRoZQorICogYXBwbGljYXRpb24gbXVzdCBwcmV2aW91c2x5IGhhdmUgY2FsbGVkCisgKiB4Y2JfcHJlZmV0Y2hfZXh0ZW5zaW9uX2RhdGEoYywgJnhjYl9iaWdfcmVxdWVzdHNfaWQpIGFuZCB0aGUgcmVwbHkKKyAqIG11c3QgaGF2ZSBhbHJlYWR5IGFycml2ZWQuCisgKi8KK3ZvaWQgeGNiX3ByZWZldGNoX21heGltdW1fcmVxdWVzdF9sZW5ndGgoeGNiX2Nvbm5lY3Rpb25fdCAqYyk7CisKKworLyogeGNiX2luLmMgKi8KKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgbmV4dCBldmVudCBvciBlcnJvciBmcm9tIHRoZSBzZXJ2ZXIuCisgKiBAcGFyYW0gYzogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIFggc2VydmVyLgorICogQHJldHVybiBUaGUgbmV4dCBldmVudCBmcm9tIHRoZSBzZXJ2ZXIuCisgKgorICogUmV0dXJucyB0aGUgbmV4dCBldmVudCBvciBlcnJvciBmcm9tIHRoZSBzZXJ2ZXIsIG9yIHJldHVybnMgbnVsbCBpbgorICogdGhlIGV2ZW50IG9mIGFuIEkvTyBlcnJvci4gQmxvY2tzIHVudGlsIGVpdGhlciBhbiBldmVudCBvciBlcnJvcgorICogYXJyaXZlLCBvciBhbiBJL08gZXJyb3Igb2NjdXJzLgorICovCit4Y2JfZ2VuZXJpY19ldmVudF90ICp4Y2Jfd2FpdF9mb3JfZXZlbnQoeGNiX2Nvbm5lY3Rpb25fdCAqYyk7CisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIG5leHQgZXZlbnQgb3IgZXJyb3IgZnJvbSB0aGUgc2VydmVyLgorICogQHBhcmFtIGM6IFRoZSBjb25uZWN0aW9uIHRvIHRoZSBYIHNlcnZlci4KKyAqIGVycm9yIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uLgorICogQHJldHVybiBUaGUgbmV4dCBldmVudCBmcm9tIHRoZSBzZXJ2ZXIuCisgKgorICogUmV0dXJucyB0aGUgbmV4dCBldmVudCBvciBlcnJvciBmcm9tIHRoZSBzZXJ2ZXIsIGlmIG9uZSBpcworICogYXZhaWxhYmxlLCBvciByZXR1cm5zIEBjIE5VTEwgb3RoZXJ3aXNlLiBJZiBubyBldmVudCBpcyBhdmFpbGFibGUsIHRoYXQKKyAqIG1pZ2h0IGJlIGJlY2F1c2UgYW4gSS9PIGVycm9yIGxpa2UgY29ubmVjdGlvbiBjbG9zZSBvY2N1cnJlZCB3aGlsZQorICogYXR0ZW1wdGluZyB0byByZWFkIHRoZSBuZXh0IGV2ZW50LCBpbiB3aGljaCBjYXNlIHRoZSBjb25uZWN0aW9uIGlzCisgKiBzaHV0IGRvd24gd2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCisgKi8KK3hjYl9nZW5lcmljX2V2ZW50X3QgKnhjYl9wb2xsX2Zvcl9ldmVudCh4Y2JfY29ubmVjdGlvbl90ICpjKTsKKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgbmV4dCBldmVudCB3aXRob3V0IHJlYWRpbmcgZnJvbSB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSBjOiBUaGUgY29ubmVjdGlvbiB0byB0aGUgWCBzZXJ2ZXIuCisgKiBAcmV0dXJuIFRoZSBuZXh0IGFscmVhZHkgcXVldWVkIGV2ZW50IGZyb20gdGhlIHNlcnZlci4KKyAqCisgKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiB4Y2JfcG9sbF9mb3JfZXZlbnQgdGhhdCBvbmx5IGV4YW1pbmVzIHRoZQorICogZXZlbnQgcXVldWUgZm9yIG5ldyBldmVudHMuIFRoZSBmdW5jdGlvbiBkb2Vzbid0IHRyeSB0byByZWFkIG5ldworICogZXZlbnRzIGZyb20gdGhlIGNvbm5lY3Rpb24gaWYgbm8gcXVldWVkIGV2ZW50cyBhcmUgZm91bmQuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIGNhbGxlcnMgdGhhdCBrbm93IGluIGFkdmFuY2UgdGhhdCBhbGwKKyAqIGludGVyZXN0aW5nIGV2ZW50cyBoYXZlIGFscmVhZHkgYmVlbiByZWFkIGZyb20gdGhlIGNvbm5lY3Rpb24uIEZvcgorICogZXhhbXBsZSwgY2FsbGVycyBtaWdodCB1c2UgeGNiX3dhaXRfZm9yX3JlcGx5IGFuZCBiZSBpbnRlcmVzdGVkCisgKiBvbmx5IG9mIGV2ZW50cyB0aGF0IHByZWNlZGVkIGEgc3BlY2lmaWMgcmVwbHkuCisgKi8KK3hjYl9nZW5lcmljX2V2ZW50X3QgKnhjYl9wb2xsX2Zvcl9xdWV1ZWRfZXZlbnQoeGNiX2Nvbm5lY3Rpb25fdCAqYyk7CisKKy8qKgorICogQGJyaWVmIFJldHVybiB0aGUgZXJyb3IgZm9yIGEgcmVxdWVzdCwgb3IgTlVMTCBpZiBub25lIGNhbiBldmVyIGFycml2ZS4KKyAqIEBwYXJhbSBjOiBUaGUgY29ubmVjdGlvbiB0byB0aGUgWCBzZXJ2ZXIuCisgKiBAcGFyYW0gY29va2llOiBUaGUgcmVxdWVzdCBjb29raWUuCisgKiBAcmV0dXJuIFRoZSBlcnJvciBmb3IgdGhlIHJlcXVlc3QsIG9yIE5VTEwgaWYgbm9uZSBjYW4gZXZlciBhcnJpdmUuCisgKgorICogVGhlIHhjYl92b2lkX2Nvb2tpZV90IGNvb2tpZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgaGF2ZSByZXN1bHRlZAorICogZnJvbSBhIGNhbGwgdG8geGNiX1tyZXF1ZXN0X25hbWVdX2NoZWNrZWQoKS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBibG9jaworICogdW50aWwgb25lIG9mIHR3byBjb25kaXRpb25zIGhhcHBlbnMuICBJZiBhbiBlcnJvciBpcyByZWNlaXZlZCwgaXQgd2lsbCBiZQorICogcmV0dXJuZWQuICBJZiBhIHJlcGx5IHRvIGEgc3Vic2VxdWVudCByZXF1ZXN0IGhhcyBhbHJlYWR5IGFycml2ZWQsIG5vIGVycm9yCisgKiBjYW4gYXJyaXZlIGZvciB0aGlzIHJlcXVlc3QsIHNvIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gTlVMTC4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsIHBlcmZvcm0gYSBzeW5jIGlmIG5lZWRlZCB0byBlbnN1cmUgdGhhdCB0aGUKKyAqIHNlcXVlbmNlIG51bWJlciB3aWxsIGFkdmFuY2UgYmV5b25kIHRoYXQgcHJvdmlkZWQgaW4gY29va2llOyB0aGlzIGlzIGEKKyAqIGNvbnZlbmllbmNlIHRvIGF2b2lkIHJhY2VzIGluIGRldGVybWluaW5nIHdoZXRoZXIgdGhlIHN5bmMgaXMgbmVlZGVkLgorICovCit4Y2JfZ2VuZXJpY19lcnJvcl90ICp4Y2JfcmVxdWVzdF9jaGVjayh4Y2JfY29ubmVjdGlvbl90ICpjLCB4Y2Jfdm9pZF9jb29raWVfdCBjb29raWUpOworCisvKioKKyAqIEBicmllZiBEaXNjYXJkcyB0aGUgcmVwbHkgZm9yIGEgcmVxdWVzdC4KKyAqIEBwYXJhbSBjOiBUaGUgY29ubmVjdGlvbiB0byB0aGUgWCBzZXJ2ZXIuCisgKiBAcGFyYW0gc2VxdWVuY2U6IFRoZSByZXF1ZXN0IHNlcXVlbmNlIG51bWJlciBmcm9tIGEgY29va2llLgorICoKKyAqIERpc2NhcmRzIHRoZSByZXBseSBmb3IgYSByZXF1ZXN0LiBBZGRpdGlvbmFsbHksIGFueSBlcnJvciBnZW5lcmF0ZWQKKyAqIGJ5IHRoZSByZXF1ZXN0IGlzIGFsc28gZGlzY2FyZGVkICh1bmxlc3MgaXQgd2FzIGFuIF91bmNoZWNrZWQgcmVxdWVzdAorICogYW5kIHRoZSBlcnJvciBoYXMgYWxyZWFkeSBhcnJpdmVkKS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IGJsb2NrIGV2ZW4gaWYgdGhlIHJlcGx5IGlzIG5vdCB5ZXQgYXZhaWxhYmxlLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgc2VxdWVuY2UgcmVhbGx5IGRvZXMgaGF2ZSB0byBjb21lIGZyb20gYW4geGNiIGNvb2tpZTsKKyAqIHRoaXMgZnVuY3Rpb24gaXMgbm90IGRlc2lnbmVkIHRvIG9wZXJhdGUgb24gc29ja2V0LWhhbmRvZmYgcmVwbGllcy4KKyAqLwordm9pZCB4Y2JfZGlzY2FyZF9yZXBseSh4Y2JfY29ubmVjdGlvbl90ICpjLCB1bnNpZ25lZCBpbnQgc2VxdWVuY2UpOworCisKKy8qIHhjYl9leHQuYyAqLworCisvKioKKyAqIEB0eXBlZGVmIHR5cGVkZWYgc3RydWN0IHhjYl9leHRlbnNpb25fdCB4Y2JfZXh0ZW5zaW9uX3QKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2V4dGVuc2lvbl90IHhjYl9leHRlbnNpb25fdDsgIC8qKjwgT3BhcXVlIHN0cnVjdHVyZSB1c2VkIGFzIGtleSBmb3IgeGNiX2dldF9leHRlbnNpb25fZGF0YV90LiAqLworCisvKioKKyAqIEBicmllZiBDYWNoZXMgcmVwbHkgaW5mb3JtYXRpb24gZnJvbSBRdWVyeUV4dGVuc2lvbiByZXF1ZXN0cy4KKyAqIEBwYXJhbSBjOiBUaGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSBleHQ6IFRoZSBleHRlbnNpb24gZGF0YS4KKyAqIEByZXR1cm4gQSBwb2ludGVyIHRvIHRoZSB4Y2JfcXVlcnlfZXh0ZW5zaW9uX3JlcGx5X3QgZm9yIHRoZSBleHRlbnNpb24uCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgcHJpbWFyeSBpbnRlcmZhY2UgdG8gdGhlICJleHRlbnNpb24gY2FjaGUiLAorICogd2hpY2ggY2FjaGVzIHJlcGx5IGluZm9ybWF0aW9uIGZyb20gUXVlcnlFeHRlbnNpb24KKyAqIHJlcXVlc3RzLiBJbnZva2luZyB0aGlzIGZ1bmN0aW9uIG1heSBjYXVzZSBhIGNhbGwgdG8KKyAqIHhjYl9xdWVyeV9leHRlbnNpb24gdG8gcmV0cmlldmUgZXh0ZW5zaW9uIGluZm9ybWF0aW9uIGZyb20gdGhlCisgKiBzZXJ2ZXIsIGFuZCBtYXkgYmxvY2sgdW50aWwgZXh0ZW5zaW9uIGRhdGEgaXMgcmVjZWl2ZWQgZnJvbSB0aGUKKyAqIHNlcnZlci4KKyAqCisgKiBUaGUgcmVzdWx0IG11c3Qgbm90IGJlIGZyZWVkLiBUaGlzIHN0b3JhZ2UgaXMgbWFuYWdlZCBieSB0aGUgY2FjaGUKKyAqIGl0c2VsZi4KKyAqLworY29uc3QgeGNiX3F1ZXJ5X2V4dGVuc2lvbl9yZXBseV90ICp4Y2JfZ2V0X2V4dGVuc2lvbl9kYXRhKHhjYl9jb25uZWN0aW9uX3QgKmMsIHhjYl9leHRlbnNpb25fdCAqZXh0KTsKKworLyoqCisgKiBAYnJpZWYgUHJlZmV0Y2ggb2YgZXh0ZW5zaW9uIGRhdGEgaW50byB0aGUgZXh0ZW5zaW9uIGNhY2hlCisgKiBAcGFyYW0gYzogVGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gZXh0OiBUaGUgZXh0ZW5zaW9uIGRhdGEuCisgKgorICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgYSAicHJlZmV0Y2giIG9mIGV4dGVuc2lvbiBkYXRhIGludG8gdGhlCisgKiBleHRlbnNpb24gY2FjaGUuIEludm9raW5nIHRoZSBmdW5jdGlvbiBtYXkgY2F1c2UgYSBjYWxsIHRvCisgKiB4Y2JfcXVlcnlfZXh0ZW5zaW9uLCBidXQgd2lsbCBub3QgYmxvY2sgd2FpdGluZyBmb3IgdGhlCisgKiByZXBseS4geGNiX2dldF9leHRlbnNpb25fZGF0YSB3aWxsIHJldHVybiB0aGUgcHJlZmV0Y2hlZCBkYXRhIGFmdGVyCisgKiBwb3NzaWJseSBibG9ja2luZyB3aGlsZSBpdCBpcyByZXRyaWV2ZWQuCisgKi8KK3ZvaWQgeGNiX3ByZWZldGNoX2V4dGVuc2lvbl9kYXRhKHhjYl9jb25uZWN0aW9uX3QgKmMsIHhjYl9leHRlbnNpb25fdCAqZXh0KTsKKworCisvKiB4Y2JfY29ubi5jICovCisKKy8qKgorICogQGJyaWVmIEFjY2VzcyB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgc2VydmVyLgorICogQHBhcmFtIGM6IFRoZSBjb25uZWN0aW9uLgorICogQHJldHVybiBBIHBvaW50ZXIgdG8gYW4geGNiX3NldHVwX3Qgc3RydWN0dXJlLgorICoKKyAqIEFjY2Vzc29yIGZvciB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgc2VydmVyIHdoZW4gdGhlIHhjYl9jb25uZWN0aW9uX3QKKyAqIHdhcyBpbml0aWFsaXplZC4gVGhpcyBkYXRhIGluY2x1ZGVzCisgKiAtIHRoZSBzZXJ2ZXIncyByZXF1aXJlZCBmb3JtYXQgZm9yIGltYWdlcywKKyAqIC0gYSBsaXN0IG9mIGF2YWlsYWJsZSB2aXN1YWxzLAorICogLSBhIGxpc3Qgb2YgYXZhaWxhYmxlIHNjcmVlbnMsCisgKiAtIHRoZSBzZXJ2ZXIncyBtYXhpbXVtIHJlcXVlc3QgbGVuZ3RoIChpbiB0aGUgYWJzZW5jZSBvZiB0aGUKKyAqIEJJRy1SRVFVRVNUUyBleHRlbnNpb24pLAorICogLSBhbmQgb3RoZXIgYXNzb3J0ZWQgaW5mb3JtYXRpb24uCisgKgorICogU2VlIHRoZSBYIHByb3RvY29sIHNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgcmVzdWx0IG11c3Qgbm90IGJlIGZyZWVkLgorICovCitjb25zdCB4Y2Jfc2V0dXBfdCAqeGNiX2dldF9zZXR1cCh4Y2JfY29ubmVjdGlvbl90ICpjKTsKKworLyoqCisgKiBAYnJpZWYgQWNjZXNzIHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gYzogVGhlIGNvbm5lY3Rpb24uCisgKiBAcmV0dXJuIFRoZSBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogQWNjZXNzb3IgZm9yIHRoZSBmaWxlIGRlc2NyaXB0b3IgdGhhdCB3YXMgcGFzc2VkIHRvIHRoZQorICogeGNiX2Nvbm5lY3RfdG9fZmQgY2FsbCB0aGF0IHJldHVybmVkIEBwIGMuCisgKi8KK2ludCB4Y2JfZ2V0X2ZpbGVfZGVzY3JpcHRvcih4Y2JfY29ubmVjdGlvbl90ICpjKTsKKworLyoqCisgKiBAYnJpZWYgVGVzdCB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIGhhcyBzaHV0IGRvd24gZHVlIHRvIGEgZmF0YWwgZXJyb3IuCisgKiBAcGFyYW0gYzogVGhlIGNvbm5lY3Rpb24uCisgKiBAcmV0dXJuID4gMCBpZiB0aGUgY29ubmVjdGlvbiBpcyBpbiBhbiBlcnJvciBzdGF0ZTsgMCBvdGhlcndpc2UuCisgKgorICogU29tZSBlcnJvcnMgdGhhdCBvY2N1ciBpbiB0aGUgY29udGV4dCBvZiBhbiB4Y2JfY29ubmVjdGlvbl90CisgKiBhcmUgdW5yZWNvdmVyYWJsZS4gV2hlbiBzdWNoIGFuIGVycm9yIG9jY3VycywgdGhlCisgKiBjb25uZWN0aW9uIGlzIHNodXQgZG93biBhbmQgZnVydGhlciBvcGVyYXRpb25zIG9uIHRoZQorICogeGNiX2Nvbm5lY3Rpb25fdCBoYXZlIG5vIGVmZmVjdC4KKyAqCisgKiBAcmV0dXJuIFhDQl9DT05OX0VSUk9SLCBiZWNhdXNlIG9mIHNvY2tldCBlcnJvcnMsIHBpcGUgZXJyb3JzIG9yIG90aGVyIHN0cmVhbSBlcnJvcnMuCisgKiBAcmV0dXJuIFhDQl9DT05OX0NMT1NFRF9FWFRfTk9UU1VQUE9SVEVELCB3aGVuIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLgorICogQHJldHVybiBYQ0JfQ09OTl9DTE9TRURfTUVNX0lOU1VGRklDSUVOVCwgd2hlbiBtZW1vcnkgbm90IGF2YWlsYWJsZS4KKyAqIEByZXR1cm4gWENCX0NPTk5fQ0xPU0VEX1JFUV9MRU5fRVhDRUVELCBleGNlZWRpbmcgcmVxdWVzdCBsZW5ndGggdGhhdCBzZXJ2ZXIgYWNjZXB0cy4KKyAqIEByZXR1cm4gWENCX0NPTk5fQ0xPU0VEX1BBUlNFX0VSUiwgZXJyb3IgZHVyaW5nIHBhcnNpbmcgZGlzcGxheSBzdHJpbmcuCisgKi8KK2ludCB4Y2JfY29ubmVjdGlvbl9oYXNfZXJyb3IoeGNiX2Nvbm5lY3Rpb25fdCAqYyk7CisKKy8qKgorICogQGJyaWVmIENvbm5lY3RzIHRvIHRoZSBYIHNlcnZlci4KKyAqIEBwYXJhbSBmZDogVGhlIGZpbGUgZGVzY3JpcHRvci4KKyAqIEBwYXJhbSBhdXRoX2luZm86IEF1dGhlbnRpY2F0aW9uIGRhdGEuCisgKiBAcmV0dXJuIEEgbmV3bHkgYWxsb2NhdGVkIHhjYl9jb25uZWN0aW9uX3Qgc3RydWN0dXJlLgorICoKKyAqIENvbm5lY3RzIHRvIGFuIFggc2VydmVyLCBnaXZlbiB0aGUgb3BlbiBzb2NrZXQgQHAgZmQgYW5kIHRoZQorICogeGNiX2F1dGhfaW5mb190IEBwIGF1dGhfaW5mby4gVGhlIGZpbGUgZGVzY3JpcHRvciBAcCBmZCBpcworICogYmlkaXJlY3Rpb25hbGx5IGNvbm5lY3RlZCB0byBhbiBYIHNlcnZlci4gSWYgdGhlIGNvbm5lY3Rpb24KKyAqIHNob3VsZCBiZSB1bmF1dGhlbnRpY2F0ZWQsIEBwIGF1dGhfaW5mbyBtdXN0IGJlIEBjCisgKiBOVUxMLgorICovCit4Y2JfY29ubmVjdGlvbl90ICp4Y2JfY29ubmVjdF90b19mZChpbnQgZmQsIHhjYl9hdXRoX2luZm9fdCAqYXV0aF9pbmZvKTsKKworLyoqCisgKiBAYnJpZWYgQ2xvc2VzIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIGM6IFRoZSBjb25uZWN0aW9uLgorICoKKyAqIENsb3NlcyB0aGUgZmlsZSBkZXNjcmlwdG9yIGFuZCBmcmVlcyBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAqIGNvbm5lY3Rpb24gQGMgYy4KKyAqLwordm9pZCB4Y2JfZGlzY29ubmVjdCh4Y2JfY29ubmVjdGlvbl90ICpjKTsKKworCisvKiB4Y2JfdXRpbC5jICovCisKKy8qKgorICogQGJyaWVmIFBhcnNlcyBhIGRpc3BsYXkgc3RyaW5nIG5hbWUgaW4gdGhlIGZvcm0gZG9jdW1lbnRlZCBieSBYKDd4KS4KKyAqIEBwYXJhbSBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgZGlzcGxheS4KKyAqIEBwYXJhbSBob3N0OiBBIHBvaW50ZXIgdG8gYSBtYWxsb2MnZCBjb3B5IG9mIHRoZSBob3N0bmFtZS4KKyAqIEBwYXJhbSBkaXNwbGF5OiBBIHBvaW50ZXIgdG8gdGhlIGRpc3BsYXkgbnVtYmVyLgorICogQHBhcmFtIHNjcmVlbjogQSBwb2ludGVyIHRvIHRoZSBzY3JlZW4gbnVtYmVyLgorICogQHJldHVybiAwIG9uIGZhaWx1cmUsIG5vbiAwIG90aGVyd2lzZS4KKyAqCisgKiBQYXJzZXMgdGhlIGRpc3BsYXkgc3RyaW5nIG5hbWUgQHAgZGlzcGxheV9uYW1lIGluIHRoZSBmb3JtCisgKiBkb2N1bWVudGVkIGJ5IFgoN3gpLiBIYXMgbm8gc2lkZSBlZmZlY3RzIG9uIGZhaWx1cmUuIElmCisgKiBAcCBkaXNwbGF5bmFtZSBpcyBAYyBOVUxMIG9yIGVtcHR5LCBpdCB1c2VzIHRoZSBlbnZpcm9ubWVudAorICogdmFyaWFibGUgRElTUExBWS4gQHAgaG9zdHAgaXMgYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIHN0cmluZworICogdGhhdCBjb250YWluIHRoZSBob3N0IG5hbWUuIEBwIGRpc3BsYXlwIGlzIHNldCB0byB0aGUgZGlzcGxheQorICogbnVtYmVyIGFuZCBAcCBzY3JlZW5wIHRvIHRoZSBwcmVmZXJyZWQgc2NyZWVuIG51bWJlci4gQHAgc2NyZWVucAorICogY2FuIGJlIEBjIE5VTEwuIElmIEBwIGRpc3BsYXluYW1lIGRvZXMgbm90IGNvbnRhaW4gYSBzY3JlZW4gbnVtYmVyLAorICogaXQgaXMgc2V0IHRvIEBjIDAuCisgKi8KK2ludCB4Y2JfcGFyc2VfZGlzcGxheShjb25zdCBjaGFyICpuYW1lLCBjaGFyICoqaG9zdCwgaW50ICpkaXNwbGF5LCBpbnQgKnNjcmVlbik7CisKKy8qKgorICogQGJyaWVmIENvbm5lY3RzIHRvIHRoZSBYIHNlcnZlci4KKyAqIEBwYXJhbSBkaXNwbGF5bmFtZTogVGhlIG5hbWUgb2YgdGhlIGRpc3BsYXkuCisgKiBAcGFyYW0gc2NyZWVucDogQSBwb2ludGVyIHRvIGEgcHJlZmVycmVkIHNjcmVlbiBudW1iZXIuCisgKiBAcmV0dXJuIEEgbmV3bHkgYWxsb2NhdGVkIHhjYl9jb25uZWN0aW9uX3Qgc3RydWN0dXJlLgorICoKKyAqIENvbm5lY3RzIHRvIHRoZSBYIHNlcnZlciBzcGVjaWZpZWQgYnkgQHAgZGlzcGxheW5hbWUuIElmIEBwCisgKiBkaXNwbGF5bmFtZSBpcyBAYyBOVUxMLCB1c2VzIHRoZSB2YWx1ZSBvZiB0aGUgRElTUExBWSBlbnZpcm9ubWVudAorICogdmFyaWFibGUuIElmIGEgcGFydGljdWxhciBzY3JlZW4gb24gdGhhdCBzZXJ2ZXIgaXMgcHJlZmVycmVkLCB0aGUKKyAqIGludCBwb2ludGVkIHRvIGJ5IEBwIHNjcmVlbnAgKGlmIG5vdCBAYyBOVUxMKSB3aWxsIGJlIHNldCB0byB0aGF0CisgKiBzY3JlZW47IG90aGVyd2lzZSB0aGUgc2NyZWVuIHdpbGwgYmUgc2V0IHRvIDAuCisgKi8KK3hjYl9jb25uZWN0aW9uX3QgKnhjYl9jb25uZWN0KGNvbnN0IGNoYXIgKmRpc3BsYXluYW1lLCBpbnQgKnNjcmVlbnApOworCisvKioKKyAqIEBicmllZiBDb25uZWN0cyB0byB0aGUgWCBzZXJ2ZXIsIHVzaW5nIGFuIGF1dGhvcml6YXRpb24gaW5mb3JtYXRpb24uCisgKiBAcGFyYW0gZGlzcGxheTogVGhlIG5hbWUgb2YgdGhlIGRpc3BsYXkuCisgKiBAcGFyYW0gYXV0aDogVGhlIGF1dGhvcml6YXRpb24gaW5mb3JtYXRpb24uCisgKiBAcGFyYW0gc2NyZWVuOiBBIHBvaW50ZXIgdG8gYSBwcmVmZXJyZWQgc2NyZWVuIG51bWJlci4KKyAqIEByZXR1cm4gQSBuZXdseSBhbGxvY2F0ZWQgeGNiX2Nvbm5lY3Rpb25fdCBzdHJ1Y3R1cmUuCisgKgorICogQ29ubmVjdHMgdG8gdGhlIFggc2VydmVyIHNwZWNpZmllZCBieSBAcCBkaXNwbGF5bmFtZSwgdXNpbmcgdGhlCisgKiBhdXRob3JpemF0aW9uIEBwIGF1dGguIElmIGEgcGFydGljdWxhciBzY3JlZW4gb24gdGhhdCBzZXJ2ZXIgaXMKKyAqIHByZWZlcnJlZCwgdGhlIGludCBwb2ludGVkIHRvIGJ5IEBwIHNjcmVlbnAgKGlmIG5vdCBAYyBOVUxMKSB3aWxsCisgKiBiZSBzZXQgdG8gdGhhdCBzY3JlZW47IG90aGVyd2lzZSBAcCBzY3JlZW5wIHdpbGwgYmUgc2V0IHRvIDAuCisgKi8KK3hjYl9jb25uZWN0aW9uX3QgKnhjYl9jb25uZWN0X3RvX2Rpc3BsYXlfd2l0aF9hdXRoX2luZm8oY29uc3QgY2hhciAqZGlzcGxheSwgeGNiX2F1dGhfaW5mb190ICphdXRoLCBpbnQgKnNjcmVlbik7CisKKworLyogeGNiX3hpZC5jICovCisKKy8qKgorICogQGJyaWVmIEFsbG9jYXRlcyBhbiBYSUQgZm9yIGEgbmV3IG9iamVjdC4KKyAqIEBwYXJhbSBjOiBUaGUgY29ubmVjdGlvbi4KKyAqIEByZXR1cm4gQSBuZXdseSBhbGxvY2F0ZWQgWElELgorICoKKyAqIEFsbG9jYXRlcyBhbiBYSUQgZm9yIGEgbmV3IG9iamVjdC4gVHlwaWNhbGx5IHVzZWQganVzdCBwcmlvciB0bworICogdmFyaW91cyBvYmplY3QgY3JlYXRpb24gZnVuY3Rpb25zLCBzdWNoIGFzIHhjYl9jcmVhdGVfd2luZG93LgorICovCit1aW50MzJfdCB4Y2JfZ2VuZXJhdGVfaWQoeGNiX2Nvbm5lY3Rpb25fdCAqYyk7CisKKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8qIF9fWENCX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94Y2IveGNiZXh0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3hjYi94Y2JleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGIzYzkzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94Y2IveGNiZXh0LmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBCYXJ0IE1hc3NleSBhbmQgSmFtZXkgU2hhcnAuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKiAKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lcyBvZiB0aGUgYXV0aG9ycyBvciB0aGVpcgorICogaW5zdGl0dXRpb25zIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZQorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiBhdXRob3JpemF0aW9uIGZyb20gdGhlIGF1dGhvcnMuCisgKi8KKworI2lmbmRlZiBfX1hDQkVYVF9ICisjZGVmaW5lIF9fWENCRVhUX0gKKworI2luY2x1ZGUgInhjYi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIHhjYl9leHQuYyAqLworCitzdHJ1Y3QgeGNiX2V4dGVuc2lvbl90IHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGludCBnbG9iYWxfaWQ7Cit9OworCisKKy8qIHhjYl9vdXQuYyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc2l6ZV90IGNvdW50OworICAgIHhjYl9leHRlbnNpb25fdCAqZXh0OworICAgIHVpbnQ4X3Qgb3Bjb2RlOworICAgIHVpbnQ4X3QgaXN2b2lkOworfSB4Y2JfcHJvdG9jb2xfcmVxdWVzdF90OworCitlbnVtIHhjYl9zZW5kX3JlcXVlc3RfZmxhZ3NfdCB7CisgICAgWENCX1JFUVVFU1RfQ0hFQ0tFRCA9IDEgPDwgMCwKKyAgICBYQ0JfUkVRVUVTVF9SQVcgPSAxIDw8IDEsCisgICAgWENCX1JFUVVFU1RfRElTQ0FSRF9SRVBMWSA9IDEgPDwgMgorfTsKKwordW5zaWduZWQgaW50IHhjYl9zZW5kX3JlcXVlc3QoeGNiX2Nvbm5lY3Rpb25fdCAqYywgaW50IGZsYWdzLCBzdHJ1Y3QgaW92ZWMgKnZlY3RvciwgY29uc3QgeGNiX3Byb3RvY29sX3JlcXVlc3RfdCAqcmVxdWVzdCk7CisKKy8qIHhjYl90YWtlX3NvY2tldCBhbGxvd3MgZXh0ZXJuYWwgY29kZSB0byBhc2sgWENCIGZvciBwZXJtaXNzaW9uIHRvCisgKiB0YWtlIG92ZXIgdGhlIHdyaXRlIHNpZGUgb2YgdGhlIHNvY2tldCBhbmQgc2VuZCByYXcgZGF0YSB3aXRoCisgKiB4Y2Jfd3JpdGV2LiB4Y2JfdGFrZV9zb2NrZXQgcHJvdmlkZXMgdGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbGFzdAorICogcmVxdWVzdCBYQ0Igc2VudC4gVGhlIGNhbGxlciBvZiB4Y2JfdGFrZV9zb2NrZXQgbXVzdCBzdXBwbHkgYQorICogY2FsbGJhY2sgd2hpY2ggWENCIGNhbiBjYWxsIHdoZW4gaXQgd2FudHMgdGhlIHdyaXRlIHNpZGUgb2YgdGhlCisgKiBzb2NrZXQgYmFjayB0byBtYWtlIGEgcmVxdWVzdC4gVGhpcyBjYWxsYmFjayBzeW5jaHJvbml6ZXMgd2l0aCB0aGUKKyAqIGV4dGVybmFsIHNvY2tldCBvd25lciBhbmQgZmx1c2hlcyBhbnkgb3V0cHV0IHF1ZXVlcyBpZiBhcHByb3ByaWF0ZS4KKyAqIElmIHlvdSBhcmUgc2VuZGluZyByZXF1ZXN0cyB3aGljaCB3b24ndCBjYXVzZSBhIHJlcGx5LCBwbGVhc2Ugbm90ZSB0aGUKKyAqIGNvbW1lbnQgZm9yIHhjYl93cml0ZXYgd2hpY2ggZXhwbGFpbnMgc29tZSBzZXF1ZW5jZSBudW1iZXIgd3JhcCBpc3N1ZXMuCisgKiAqLworaW50IHhjYl90YWtlX3NvY2tldCh4Y2JfY29ubmVjdGlvbl90ICpjLCB2b2lkICgqcmV0dXJuX3NvY2tldCkodm9pZCAqY2xvc3VyZSksIHZvaWQgKmNsb3N1cmUsIGludCBmbGFncywgdWludDY0X3QgKnNlbnQpOworCisvKiBZb3UgbXVzdCBvd24gdGhlIHdyaXRlLXNpZGUgb2YgdGhlIHNvY2tldCAoeW91J3ZlIGNhbGxlZAorICogeGNiX3Rha2Vfc29ja2V0LCBhbmQgaGF2ZW4ndCByZXR1cm5lZCBmcm9tIHJldHVybl9zb2NrZXQgeWV0KSB0byBjYWxsCisgKiB4Y2Jfd3JpdGV2LiBBbHNvLCB0aGUgaW92ZWMgbXVzdCBoYXZlIGF0IGxlYXN0IDEgYnl0ZSBvZiBkYXRhIGluIGl0LgorICogWW91IGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgeGNiIGNhbiBkZXRlY3Qgc2VxdWVuY2UgbnVtYmVyIHdyYXBzIGNvcnJlY3RseS4KKyAqIFRoaXMgbWVhbnMgdGhhdCB0aGUgZmlyc3QgcmVxdWVzdCB5b3Ugc2VuZCBhZnRlciB4Y2JfdGFrZV9zb2NrZXQgbXVzdCBjYXVzZSBhCisgKiByZXBseSAoZS5nLiBqdXN0IGluc2VydCBhIEdldElucHV0Rm9jdXMgcmVxdWVzdCkuIEFmdGVyIGV2ZXJ5ICgxIDw8IDE2KSAtIDEKKyAqIHJlcXVlc3RzIHdpdGhvdXQgYSByZXBseSwgeW91IGhhdmUgdG8gaW5zZXJ0IGEgcmVxdWVzdCB3aGljaCB3aWxsIGNhdXNlIGEKKyAqIHJlcGx5LiBZb3UgY2FuIGFnYWluIHVzZSBHZXRJbnB1dEZvY3VzIGZvciB0aGlzLiBZb3UgZG8gbm90IGhhdmUgdG8gd2FpdCBmb3IKKyAqIGFueSBvZiB0aGUgR2V0SW5wdXRGb2N1cyByZXBsaWVzLCBidXQgY2FuIGluc3RlYWQgaGFuZGxlIHRoZW0gdmlhCisgKiB4Y2JfZGlzY2FyZF9yZXBseSgpLiAqLworaW50IHhjYl93cml0ZXYoeGNiX2Nvbm5lY3Rpb25fdCAqYywgc3RydWN0IGlvdmVjICp2ZWN0b3IsIGludCBjb3VudCwgdWludDY0X3QgcmVxdWVzdHMpOworCisKKy8qIHhjYl9pbi5jICovCisKK3ZvaWQgKnhjYl93YWl0X2Zvcl9yZXBseSh4Y2JfY29ubmVjdGlvbl90ICpjLCB1bnNpZ25lZCBpbnQgcmVxdWVzdCwgeGNiX2dlbmVyaWNfZXJyb3JfdCAqKmUpOworaW50IHhjYl9wb2xsX2Zvcl9yZXBseSh4Y2JfY29ubmVjdGlvbl90ICpjLCB1bnNpZ25lZCBpbnQgcmVxdWVzdCwgdm9pZCAqKnJlcGx5LCB4Y2JfZ2VuZXJpY19lcnJvcl90ICoqZXJyb3IpOworCisKKy8qIHhjYl91dGlsLmMgKi8KKworaW50IHhjYl9wb3Bjb3VudCh1aW50MzJfdCBtYXNrKTsKK2ludCB4Y2Jfc3Vtb2YodWludDhfdCAqbGlzdCwgaW50IGxlbik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94Y2IveHByb3RvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3hjYi94cHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjJhNDdjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94Y2IveHByb3RvLmgKQEAgLTAsMCArMSwxNTUzMiBAQAorLyoKKyAqIFRoaXMgZmlsZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHhwcm90by54bWwgYnkgY19jbGllbnQucHkuCisgKiBFZGl0IGF0IHlvdXIgcGVyaWwuCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgWENCX19BUEkgWENCICBBUEkKKyAqIEBicmllZiAgWENCIFByb3RvY29sIEltcGxlbWVudGF0aW9uLgorICogQHsKKyAqKi8KKworI2lmbmRlZiBfX1hQUk9UT19ICisjZGVmaW5lIF9fWFBST1RPX0gKKworI2luY2x1ZGUgInhjYi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogQGJyaWVmIHhjYl9jaGFyMmJfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NoYXIyYl90IHsKKyAgICB1aW50OF90IGJ5dGUxOyAvKio8ICAqLworICAgIHVpbnQ4X3QgYnl0ZTI7IC8qKjwgICovCit9IHhjYl9jaGFyMmJfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2NoYXIyYl9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY2hhcjJiX2l0ZXJhdG9yX3QgeworICAgIHhjYl9jaGFyMmJfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2JfY2hhcjJiX2l0ZXJhdG9yX3Q7CisKK3R5cGVkZWYgdWludDMyX3QgeGNiX3dpbmRvd190OworCisvKioKKyAqIEBicmllZiB4Y2Jfd2luZG93X2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl93aW5kb3dfaXRlcmF0b3JfdCB7CisgICAgeGNiX3dpbmRvd190ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl93aW5kb3dfaXRlcmF0b3JfdDsKKwordHlwZWRlZiB1aW50MzJfdCB4Y2JfcGl4bWFwX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9waXhtYXBfaXRlcmF0b3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3BpeG1hcF9pdGVyYXRvcl90IHsKKyAgICB4Y2JfcGl4bWFwX3QgKmRhdGE7IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICByZW07IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX3BpeG1hcF9pdGVyYXRvcl90OworCit0eXBlZGVmIHVpbnQzMl90IHhjYl9jdXJzb3JfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2N1cnNvcl9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY3Vyc29yX2l0ZXJhdG9yX3QgeworICAgIHhjYl9jdXJzb3JfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2JfY3Vyc29yX2l0ZXJhdG9yX3Q7CisKK3R5cGVkZWYgdWludDMyX3QgeGNiX2ZvbnRfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2ZvbnRfaXRlcmF0b3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2ZvbnRfaXRlcmF0b3JfdCB7CisgICAgeGNiX2ZvbnRfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICByZW07IC8qKjwgICovCisgICAgaW50ICAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl9mb250X2l0ZXJhdG9yX3Q7CisKK3R5cGVkZWYgdWludDMyX3QgeGNiX2djb250ZXh0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nY29udGV4dF9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2NvbnRleHRfaXRlcmF0b3JfdCB7CisgICAgeGNiX2djb250ZXh0X3QgKmRhdGE7IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl9nY29udGV4dF9pdGVyYXRvcl90OworCit0eXBlZGVmIHVpbnQzMl90IHhjYl9jb2xvcm1hcF90OworCisvKioKKyAqIEBicmllZiB4Y2JfY29sb3JtYXBfaXRlcmF0b3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NvbG9ybWFwX2l0ZXJhdG9yX3QgeworICAgIHhjYl9jb2xvcm1hcF90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICByZW07IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2JfY29sb3JtYXBfaXRlcmF0b3JfdDsKKwordHlwZWRlZiB1aW50MzJfdCB4Y2JfYXRvbV90OworCisvKioKKyAqIEBicmllZiB4Y2JfYXRvbV9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfYXRvbV9pdGVyYXRvcl90IHsKKyAgICB4Y2JfYXRvbV90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX2F0b21faXRlcmF0b3JfdDsKKwordHlwZWRlZiB1aW50MzJfdCB4Y2JfZHJhd2FibGVfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2RyYXdhYmxlX2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9kcmF3YWJsZV9pdGVyYXRvcl90IHsKKyAgICB4Y2JfZHJhd2FibGVfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX2RyYXdhYmxlX2l0ZXJhdG9yX3Q7CisKK3R5cGVkZWYgdWludDMyX3QgeGNiX2ZvbnRhYmxlX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9mb250YWJsZV9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZm9udGFibGVfaXRlcmF0b3JfdCB7CisgICAgeGNiX2ZvbnRhYmxlX3QgKmRhdGE7IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl9mb250YWJsZV9pdGVyYXRvcl90OworCit0eXBlZGVmIHVpbnQzMl90IHhjYl92aXN1YWxpZF90OworCisvKioKKyAqIEBicmllZiB4Y2JfdmlzdWFsaWRfaXRlcmF0b3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3Zpc3VhbGlkX2l0ZXJhdG9yX3QgeworICAgIHhjYl92aXN1YWxpZF90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICByZW07IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2JfdmlzdWFsaWRfaXRlcmF0b3JfdDsKKwordHlwZWRlZiB1aW50MzJfdCB4Y2JfdGltZXN0YW1wX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl90aW1lc3RhbXBfaXRlcmF0b3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3RpbWVzdGFtcF9pdGVyYXRvcl90IHsKKyAgICB4Y2JfdGltZXN0YW1wX3QgKmRhdGE7IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICAgICByZW07IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX3RpbWVzdGFtcF9pdGVyYXRvcl90OworCit0eXBlZGVmIHVpbnQzMl90IHhjYl9rZXlzeW1fdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2tleXN5bV9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfa2V5c3ltX2l0ZXJhdG9yX3QgeworICAgIHhjYl9rZXlzeW1fdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2Jfa2V5c3ltX2l0ZXJhdG9yX3Q7CisKK3R5cGVkZWYgdWludDhfdCB4Y2Jfa2V5Y29kZV90OworCisvKioKKyAqIEBicmllZiB4Y2Jfa2V5Y29kZV9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfa2V5Y29kZV9pdGVyYXRvcl90IHsKKyAgICB4Y2Jfa2V5Y29kZV90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX2tleWNvZGVfaXRlcmF0b3JfdDsKKwordHlwZWRlZiB1aW50OF90IHhjYl9idXR0b25fdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2J1dHRvbl9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfYnV0dG9uX2l0ZXJhdG9yX3QgeworICAgIHhjYl9idXR0b25fdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2JfYnV0dG9uX2l0ZXJhdG9yX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9wb2ludF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcG9pbnRfdCB7CisgICAgaW50MTZfdCB4OyAvKio8ICAqLworICAgIGludDE2X3QgeTsgLyoqPCAgKi8KK30geGNiX3BvaW50X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9wb2ludF9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcG9pbnRfaXRlcmF0b3JfdCB7CisgICAgeGNiX3BvaW50X3QgKmRhdGE7IC8qKjwgICovCisgICAgaW50ICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl9wb2ludF9pdGVyYXRvcl90OworCisvKioKKyAqIEBicmllZiB4Y2JfcmVjdGFuZ2xlX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9yZWN0YW5nbGVfdCB7CisgICAgaW50MTZfdCAgeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICB5OyAvKio8ICAqLworICAgIHVpbnQxNl90IHdpZHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90IGhlaWdodDsgLyoqPCAgKi8KK30geGNiX3JlY3RhbmdsZV90OworCisvKioKKyAqIEBicmllZiB4Y2JfcmVjdGFuZ2xlX2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9yZWN0YW5nbGVfaXRlcmF0b3JfdCB7CisgICAgeGNiX3JlY3RhbmdsZV90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl9yZWN0YW5nbGVfaXRlcmF0b3JfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2FyY190CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfYXJjX3QgeworICAgIGludDE2X3QgIHg7IC8qKjwgICovCisgICAgaW50MTZfdCAgeTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCB3aWR0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBoZWlnaHQ7IC8qKjwgICovCisgICAgaW50MTZfdCAgYW5nbGUxOyAvKio8ICAqLworICAgIGludDE2X3QgIGFuZ2xlMjsgLyoqPCAgKi8KK30geGNiX2FyY190OworCisvKioKKyAqIEBicmllZiB4Y2JfYXJjX2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9hcmNfaXRlcmF0b3JfdCB7CisgICAgeGNiX2FyY190ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl9hcmNfaXRlcmF0b3JfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2Zvcm1hdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZm9ybWF0X3QgeworICAgIHVpbnQ4X3QgZGVwdGg7IC8qKjwgICovCisgICAgdWludDhfdCBiaXRzX3Blcl9waXhlbDsgLyoqPCAgKi8KKyAgICB1aW50OF90IHNjYW5saW5lX3BhZDsgLyoqPCAgKi8KKyAgICB1aW50OF90IHBhZDBbNV07IC8qKjwgICovCit9IHhjYl9mb3JtYXRfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2Zvcm1hdF9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZm9ybWF0X2l0ZXJhdG9yX3QgeworICAgIHhjYl9mb3JtYXRfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2JfZm9ybWF0X2l0ZXJhdG9yX3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfdmlzdWFsX2NsYXNzX3QgeworICAgIFhDQl9WSVNVQUxfQ0xBU1NfU1RBVElDX0dSQVkgPSAwLAorICAgIFhDQl9WSVNVQUxfQ0xBU1NfR1JBWV9TQ0FMRSA9IDEsCisgICAgWENCX1ZJU1VBTF9DTEFTU19TVEFUSUNfQ09MT1IgPSAyLAorICAgIFhDQl9WSVNVQUxfQ0xBU1NfUFNFVURPX0NPTE9SID0gMywKKyAgICBYQ0JfVklTVUFMX0NMQVNTX1RSVUVfQ09MT1IgPSA0LAorICAgIFhDQl9WSVNVQUxfQ0xBU1NfRElSRUNUX0NPTE9SID0gNQorfSB4Y2JfdmlzdWFsX2NsYXNzX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl92aXN1YWx0eXBlX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl92aXN1YWx0eXBlX3QgeworICAgIHhjYl92aXN1YWxpZF90IHZpc3VhbF9pZDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBfY2xhc3M7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgYml0c19wZXJfcmdiX3ZhbHVlOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGNvbG9ybWFwX2VudHJpZXM7IC8qKjwgICovCisgICAgdWludDMyX3QgICAgICAgcmVkX21hc2s7IC8qKjwgICovCisgICAgdWludDMyX3QgICAgICAgZ3JlZW5fbWFzazsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICBibHVlX21hc2s7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMFs0XTsgLyoqPCAgKi8KK30geGNiX3Zpc3VhbHR5cGVfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3Zpc3VhbHR5cGVfaXRlcmF0b3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3Zpc3VhbHR5cGVfaXRlcmF0b3JfdCB7CisgICAgeGNiX3Zpc3VhbHR5cGVfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgICByZW07IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl92aXN1YWx0eXBlX2l0ZXJhdG9yX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9kZXB0aF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZGVwdGhfdCB7CisgICAgdWludDhfdCAgZGVwdGg7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCB2aXN1YWxzX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQxWzRdOyAvKio8ICAqLworfSB4Y2JfZGVwdGhfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2RlcHRoX2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9kZXB0aF9pdGVyYXRvcl90IHsKKyAgICB4Y2JfZGVwdGhfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX2RlcHRoX2l0ZXJhdG9yX3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfZXZlbnRfbWFza190IHsKKyAgICBYQ0JfRVZFTlRfTUFTS19OT19FVkVOVCA9IDAsCisgICAgWENCX0VWRU5UX01BU0tfS0VZX1BSRVNTID0gMSwKKyAgICBYQ0JfRVZFTlRfTUFTS19LRVlfUkVMRUFTRSA9IDIsCisgICAgWENCX0VWRU5UX01BU0tfQlVUVE9OX1BSRVNTID0gNCwKKyAgICBYQ0JfRVZFTlRfTUFTS19CVVRUT05fUkVMRUFTRSA9IDgsCisgICAgWENCX0VWRU5UX01BU0tfRU5URVJfV0lORE9XID0gMTYsCisgICAgWENCX0VWRU5UX01BU0tfTEVBVkVfV0lORE9XID0gMzIsCisgICAgWENCX0VWRU5UX01BU0tfUE9JTlRFUl9NT1RJT04gPSA2NCwKKyAgICBYQ0JfRVZFTlRfTUFTS19QT0lOVEVSX01PVElPTl9ISU5UID0gMTI4LAorICAgIFhDQl9FVkVOVF9NQVNLX0JVVFRPTl8xX01PVElPTiA9IDI1NiwKKyAgICBYQ0JfRVZFTlRfTUFTS19CVVRUT05fMl9NT1RJT04gPSA1MTIsCisgICAgWENCX0VWRU5UX01BU0tfQlVUVE9OXzNfTU9USU9OID0gMTAyNCwKKyAgICBYQ0JfRVZFTlRfTUFTS19CVVRUT05fNF9NT1RJT04gPSAyMDQ4LAorICAgIFhDQl9FVkVOVF9NQVNLX0JVVFRPTl81X01PVElPTiA9IDQwOTYsCisgICAgWENCX0VWRU5UX01BU0tfQlVUVE9OX01PVElPTiA9IDgxOTIsCisgICAgWENCX0VWRU5UX01BU0tfS0VZTUFQX1NUQVRFID0gMTYzODQsCisgICAgWENCX0VWRU5UX01BU0tfRVhQT1NVUkUgPSAzMjc2OCwKKyAgICBYQ0JfRVZFTlRfTUFTS19WSVNJQklMSVRZX0NIQU5HRSA9IDY1NTM2LAorICAgIFhDQl9FVkVOVF9NQVNLX1NUUlVDVFVSRV9OT1RJRlkgPSAxMzEwNzIsCisgICAgWENCX0VWRU5UX01BU0tfUkVTSVpFX1JFRElSRUNUID0gMjYyMTQ0LAorICAgIFhDQl9FVkVOVF9NQVNLX1NVQlNUUlVDVFVSRV9OT1RJRlkgPSA1MjQyODgsCisgICAgWENCX0VWRU5UX01BU0tfU1VCU1RSVUNUVVJFX1JFRElSRUNUID0gMTA0ODU3NiwKKyAgICBYQ0JfRVZFTlRfTUFTS19GT0NVU19DSEFOR0UgPSAyMDk3MTUyLAorICAgIFhDQl9FVkVOVF9NQVNLX1BST1BFUlRZX0NIQU5HRSA9IDQxOTQzMDQsCisgICAgWENCX0VWRU5UX01BU0tfQ09MT1JfTUFQX0NIQU5HRSA9IDgzODg2MDgsCisgICAgWENCX0VWRU5UX01BU0tfT1dORVJfR1JBQl9CVVRUT04gPSAxNjc3NzIxNgorfSB4Y2JfZXZlbnRfbWFza190OworCit0eXBlZGVmIGVudW0geGNiX2JhY2tpbmdfc3RvcmVfdCB7CisgICAgWENCX0JBQ0tJTkdfU1RPUkVfTk9UX1VTRUZVTCA9IDAsCisgICAgWENCX0JBQ0tJTkdfU1RPUkVfV0hFTl9NQVBQRUQgPSAxLAorICAgIFhDQl9CQUNLSU5HX1NUT1JFX0FMV0FZUyA9IDIKK30geGNiX2JhY2tpbmdfc3RvcmVfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3NjcmVlbl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc2NyZWVuX3QgeworICAgIHhjYl93aW5kb3dfdCAgIHJvb3Q7IC8qKjwgICovCisgICAgeGNiX2NvbG9ybWFwX3QgZGVmYXVsdF9jb2xvcm1hcDsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICB3aGl0ZV9waXhlbDsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICBibGFja19waXhlbDsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICBjdXJyZW50X2lucHV0X21hc2tzOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIHdpZHRoX2luX3BpeGVsczsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBoZWlnaHRfaW5fcGl4ZWxzOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIHdpZHRoX2luX21pbGxpbWV0ZXJzOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGhlaWdodF9pbl9taWxsaW1ldGVyczsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBtaW5faW5zdGFsbGVkX21hcHM7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbWF4X2luc3RhbGxlZF9tYXBzOyAvKio8ICAqLworICAgIHhjYl92aXN1YWxpZF90IHJvb3RfdmlzdWFsOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIGJhY2tpbmdfc3RvcmVzOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHNhdmVfdW5kZXJzOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHJvb3RfZGVwdGg7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgYWxsb3dlZF9kZXB0aHNfbGVuOyAvKio8ICAqLworfSB4Y2Jfc2NyZWVuX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9zY3JlZW5faXRlcmF0b3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3NjcmVlbl9pdGVyYXRvcl90IHsKKyAgICB4Y2Jfc2NyZWVuX3QgKmRhdGE7IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICByZW07IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX3NjcmVlbl9pdGVyYXRvcl90OworCisvKioKKyAqIEBicmllZiB4Y2Jfc2V0dXBfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc2V0dXBfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBieXRlX29yZGVyOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgcHJvdG9jb2xfbWFqb3JfdmVyc2lvbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBwcm90b2NvbF9taW5vcl92ZXJzaW9uOyAvKio8ICAqLworICAgIHVpbnQxNl90IGF1dGhvcml6YXRpb25fcHJvdG9jb2xfbmFtZV9sZW47IC8qKjwgICovCisgICAgdWludDE2X3QgYXV0aG9yaXphdGlvbl9wcm90b2NvbF9kYXRhX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQxWzJdOyAvKio8ICAqLworfSB4Y2Jfc2V0dXBfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2Jfc2V0dXBfcmVxdWVzdF9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc2V0dXBfcmVxdWVzdF9pdGVyYXRvcl90IHsKKyAgICB4Y2Jfc2V0dXBfcmVxdWVzdF90ICpkYXRhOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX3NldHVwX3JlcXVlc3RfaXRlcmF0b3JfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3NldHVwX2ZhaWxlZF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc2V0dXBfZmFpbGVkX3QgeworICAgIHVpbnQ4X3QgIHN0YXR1czsgLyoqPCAgKi8KKyAgICB1aW50OF90ICByZWFzb25fbGVuOyAvKio8ICAqLworICAgIHVpbnQxNl90IHByb3RvY29sX21ham9yX3ZlcnNpb247IC8qKjwgICovCisgICAgdWludDE2X3QgcHJvdG9jb2xfbWlub3JfdmVyc2lvbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCit9IHhjYl9zZXR1cF9mYWlsZWRfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3NldHVwX2ZhaWxlZF9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc2V0dXBfZmFpbGVkX2l0ZXJhdG9yX3QgeworICAgIHhjYl9zZXR1cF9mYWlsZWRfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2Jfc2V0dXBfZmFpbGVkX2l0ZXJhdG9yX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3NldHVwX2F1dGhlbnRpY2F0ZV90IHsKKyAgICB1aW50OF90ICBzdGF0dXM7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMFs1XTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCit9IHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3NldHVwX2F1dGhlbnRpY2F0ZV9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX2l0ZXJhdG9yX3QgeworICAgIHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX2l0ZXJhdG9yX3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfaW1hZ2Vfb3JkZXJfdCB7CisgICAgWENCX0lNQUdFX09SREVSX0xTQl9GSVJTVCA9IDAsCisgICAgWENCX0lNQUdFX09SREVSX01TQl9GSVJTVCA9IDEKK30geGNiX2ltYWdlX29yZGVyX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9zZXR1cF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc2V0dXBfdCB7CisgICAgdWludDhfdCAgICAgICBzdGF0dXM7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgcHJvdG9jb2xfbWFqb3JfdmVyc2lvbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgIHByb3RvY29sX21pbm9yX3ZlcnNpb247IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDMyX3QgICAgICByZWxlYXNlX251bWJlcjsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgIHJlc291cmNlX2lkX2Jhc2U7IC8qKjwgICovCisgICAgdWludDMyX3QgICAgICByZXNvdXJjZV9pZF9tYXNrOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICAgbW90aW9uX2J1ZmZlcl9zaXplOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgdmVuZG9yX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgIG1heGltdW1fcmVxdWVzdF9sZW5ndGg7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICByb290c19sZW47IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICBwaXhtYXBfZm9ybWF0c19sZW47IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICBpbWFnZV9ieXRlX29yZGVyOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgYml0bWFwX2Zvcm1hdF9iaXRfb3JkZXI7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICBiaXRtYXBfZm9ybWF0X3NjYW5saW5lX3VuaXQ7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICBiaXRtYXBfZm9ybWF0X3NjYW5saW5lX3BhZDsgLyoqPCAgKi8KKyAgICB4Y2Jfa2V5Y29kZV90IG1pbl9rZXljb2RlOyAvKio8ICAqLworICAgIHhjYl9rZXljb2RlX3QgbWF4X2tleWNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICBwYWQxWzRdOyAvKio8ICAqLworfSB4Y2Jfc2V0dXBfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3NldHVwX2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zZXR1cF9pdGVyYXRvcl90IHsKKyAgICB4Y2Jfc2V0dXBfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX3NldHVwX2l0ZXJhdG9yX3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfbW9kX21hc2tfdCB7CisgICAgWENCX01PRF9NQVNLX1NISUZUID0gMSwKKyAgICBYQ0JfTU9EX01BU0tfTE9DSyA9IDIsCisgICAgWENCX01PRF9NQVNLX0NPTlRST0wgPSA0LAorICAgIFhDQl9NT0RfTUFTS18xID0gOCwKKyAgICBYQ0JfTU9EX01BU0tfMiA9IDE2LAorICAgIFhDQl9NT0RfTUFTS18zID0gMzIsCisgICAgWENCX01PRF9NQVNLXzQgPSA2NCwKKyAgICBYQ0JfTU9EX01BU0tfNSA9IDEyOCwKKyAgICBYQ0JfTU9EX01BU0tfQU5ZID0gMzI3NjgKK30geGNiX21vZF9tYXNrX3Q7CisKK3R5cGVkZWYgZW51bSB4Y2Jfa2V5X2J1dF9tYXNrX3QgeworICAgIFhDQl9LRVlfQlVUX01BU0tfU0hJRlQgPSAxLAorICAgIFhDQl9LRVlfQlVUX01BU0tfTE9DSyA9IDIsCisgICAgWENCX0tFWV9CVVRfTUFTS19DT05UUk9MID0gNCwKKyAgICBYQ0JfS0VZX0JVVF9NQVNLX01PRF8xID0gOCwKKyAgICBYQ0JfS0VZX0JVVF9NQVNLX01PRF8yID0gMTYsCisgICAgWENCX0tFWV9CVVRfTUFTS19NT0RfMyA9IDMyLAorICAgIFhDQl9LRVlfQlVUX01BU0tfTU9EXzQgPSA2NCwKKyAgICBYQ0JfS0VZX0JVVF9NQVNLX01PRF81ID0gMTI4LAorICAgIFhDQl9LRVlfQlVUX01BU0tfQlVUVE9OXzEgPSAyNTYsCisgICAgWENCX0tFWV9CVVRfTUFTS19CVVRUT05fMiA9IDUxMiwKKyAgICBYQ0JfS0VZX0JVVF9NQVNLX0JVVFRPTl8zID0gMTAyNCwKKyAgICBYQ0JfS0VZX0JVVF9NQVNLX0JVVFRPTl80ID0gMjA0OCwKKyAgICBYQ0JfS0VZX0JVVF9NQVNLX0JVVFRPTl81ID0gNDA5NgorfSB4Y2Jfa2V5X2J1dF9tYXNrX3Q7CisKK3R5cGVkZWYgZW51bSB4Y2Jfd2luZG93X2VudW1fdCB7CisgICAgWENCX1dJTkRPV19OT05FID0gMAorfSB4Y2Jfd2luZG93X2VudW1fdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2tleV9wcmVzcy4gKi8KKyNkZWZpbmUgWENCX0tFWV9QUkVTUyAyCisKKy8qKgorICogQGJyaWVmIHhjYl9rZXlfcHJlc3NfZXZlbnRfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2tleV9wcmVzc19ldmVudF90IHsKKyAgICB1aW50OF90ICAgICAgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB4Y2Jfa2V5Y29kZV90ICAgZGV0YWlsOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgcm9vdDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgZXZlbnQ7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190ICAgIGNoaWxkOyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgICByb290X3g7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgIHJvb3RfeTsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICAgZXZlbnRfeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICAgZXZlbnRfeTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICAgc3RhdGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgIHNhbWVfc2NyZWVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBwYWQwOyAvKio8ICAqLworfSB4Y2Jfa2V5X3ByZXNzX2V2ZW50X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9rZXlfcmVsZWFzZS4gKi8KKyNkZWZpbmUgWENCX0tFWV9SRUxFQVNFIDMKKwordHlwZWRlZiB4Y2Jfa2V5X3ByZXNzX2V2ZW50X3QgeGNiX2tleV9yZWxlYXNlX2V2ZW50X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfYnV0dG9uX21hc2tfdCB7CisgICAgWENCX0JVVFRPTl9NQVNLXzEgPSAyNTYsCisgICAgWENCX0JVVFRPTl9NQVNLXzIgPSA1MTIsCisgICAgWENCX0JVVFRPTl9NQVNLXzMgPSAxMDI0LAorICAgIFhDQl9CVVRUT05fTUFTS180ID0gMjA0OCwKKyAgICBYQ0JfQlVUVE9OX01BU0tfNSA9IDQwOTYsCisgICAgWENCX0JVVFRPTl9NQVNLX0FOWSA9IDMyNzY4Cit9IHhjYl9idXR0b25fbWFza190OworCisvKiogT3Bjb2RlIGZvciB4Y2JfYnV0dG9uX3ByZXNzLiAqLworI2RlZmluZSBYQ0JfQlVUVE9OX1BSRVNTIDQKKworLyoqCisgKiBAYnJpZWYgeGNiX2J1dHRvbl9wcmVzc19ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfYnV0dG9uX3ByZXNzX2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHhjYl9idXR0b25fdCAgICBkZXRhaWw7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHhjYl90aW1lc3RhbXBfdCB0aW1lOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCAgICByb290OyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCAgICBldmVudDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgY2hpbGQ7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgIHJvb3RfeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICAgcm9vdF95OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgICBldmVudF94OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgICBldmVudF95OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICBzdGF0ZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICAgc2FtZV9zY3JlZW47IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgIHBhZDA7IC8qKjwgICovCit9IHhjYl9idXR0b25fcHJlc3NfZXZlbnRfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2J1dHRvbl9yZWxlYXNlLiAqLworI2RlZmluZSBYQ0JfQlVUVE9OX1JFTEVBU0UgNQorCit0eXBlZGVmIHhjYl9idXR0b25fcHJlc3NfZXZlbnRfdCB4Y2JfYnV0dG9uX3JlbGVhc2VfZXZlbnRfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9tb3Rpb25fdCB7CisgICAgWENCX01PVElPTl9OT1JNQUwgPSAwLAorICAgIFhDQl9NT1RJT05fSElOVCA9IDEKK30geGNiX21vdGlvbl90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfbW90aW9uX25vdGlmeS4gKi8KKyNkZWZpbmUgWENCX01PVElPTl9OT1RJRlkgNgorCisvKioKKyAqIEBicmllZiB4Y2JfbW90aW9uX25vdGlmeV9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfbW90aW9uX25vdGlmeV9ldmVudF90IHsKKyAgICB1aW50OF90ICAgICAgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICAgZGV0YWlsOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgcm9vdDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgZXZlbnQ7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190ICAgIGNoaWxkOyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgICByb290X3g7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgIHJvb3RfeTsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICAgZXZlbnRfeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICAgZXZlbnRfeTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICAgc3RhdGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgIHNhbWVfc2NyZWVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBwYWQwOyAvKio8ICAqLworfSB4Y2JfbW90aW9uX25vdGlmeV9ldmVudF90OworCit0eXBlZGVmIGVudW0geGNiX25vdGlmeV9kZXRhaWxfdCB7CisgICAgWENCX05PVElGWV9ERVRBSUxfQU5DRVNUT1IgPSAwLAorICAgIFhDQl9OT1RJRllfREVUQUlMX1ZJUlRVQUwgPSAxLAorICAgIFhDQl9OT1RJRllfREVUQUlMX0lORkVSSU9SID0gMiwKKyAgICBYQ0JfTk9USUZZX0RFVEFJTF9OT05MSU5FQVIgPSAzLAorICAgIFhDQl9OT1RJRllfREVUQUlMX05PTkxJTkVBUl9WSVJUVUFMID0gNCwKKyAgICBYQ0JfTk9USUZZX0RFVEFJTF9QT0lOVEVSID0gNSwKKyAgICBYQ0JfTk9USUZZX0RFVEFJTF9QT0lOVEVSX1JPT1QgPSA2LAorICAgIFhDQl9OT1RJRllfREVUQUlMX05PTkUgPSA3Cit9IHhjYl9ub3RpZnlfZGV0YWlsX3Q7CisKK3R5cGVkZWYgZW51bSB4Y2Jfbm90aWZ5X21vZGVfdCB7CisgICAgWENCX05PVElGWV9NT0RFX05PUk1BTCA9IDAsCisgICAgWENCX05PVElGWV9NT0RFX0dSQUIgPSAxLAorICAgIFhDQl9OT1RJRllfTU9ERV9VTkdSQUIgPSAyLAorICAgIFhDQl9OT1RJRllfTU9ERV9XSElMRV9HUkFCQkVEID0gMworfSB4Y2Jfbm90aWZ5X21vZGVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2VudGVyX25vdGlmeS4gKi8KKyNkZWZpbmUgWENCX0VOVEVSX05PVElGWSA3CisKKy8qKgorICogQGJyaWVmIHhjYl9lbnRlcl9ub3RpZnlfZXZlbnRfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2VudGVyX25vdGlmeV9ldmVudF90IHsKKyAgICB1aW50OF90ICAgICAgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICAgZGV0YWlsOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgcm9vdDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgZXZlbnQ7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190ICAgIGNoaWxkOyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgICByb290X3g7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgIHJvb3RfeTsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICAgZXZlbnRfeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICAgZXZlbnRfeTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICAgc3RhdGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgIG1vZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgIHNhbWVfc2NyZWVuX2ZvY3VzOyAvKio8ICAqLworfSB4Y2JfZW50ZXJfbm90aWZ5X2V2ZW50X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9sZWF2ZV9ub3RpZnkuICovCisjZGVmaW5lIFhDQl9MRUFWRV9OT1RJRlkgOAorCit0eXBlZGVmIHhjYl9lbnRlcl9ub3RpZnlfZXZlbnRfdCB4Y2JfbGVhdmVfbm90aWZ5X2V2ZW50X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9mb2N1c19pbi4gKi8KKyNkZWZpbmUgWENCX0ZPQ1VTX0lOIDkKKworLyoqCisgKiBAYnJpZWYgeGNiX2ZvY3VzX2luX2V2ZW50X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9mb2N1c19pbl9ldmVudF90IHsKKyAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgZGV0YWlsOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgZXZlbnQ7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIG1vZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDBbM107IC8qKjwgICovCit9IHhjYl9mb2N1c19pbl9ldmVudF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZm9jdXNfb3V0LiAqLworI2RlZmluZSBYQ0JfRk9DVVNfT1VUIDEwCisKK3R5cGVkZWYgeGNiX2ZvY3VzX2luX2V2ZW50X3QgeGNiX2ZvY3VzX291dF9ldmVudF90OworCisvKiogT3Bjb2RlIGZvciB4Y2Jfa2V5bWFwX25vdGlmeS4gKi8KKyNkZWZpbmUgWENCX0tFWU1BUF9OT1RJRlkgMTEKKworLyoqCisgKiBAYnJpZWYgeGNiX2tleW1hcF9ub3RpZnlfZXZlbnRfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2tleW1hcF9ub3RpZnlfZXZlbnRfdCB7CisgICAgdWludDhfdCByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3Qga2V5c1szMV07IC8qKjwgICovCit9IHhjYl9rZXltYXBfbm90aWZ5X2V2ZW50X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9leHBvc2UuICovCisjZGVmaW5lIFhDQl9FWFBPU0UgMTIKKworLyoqCisgKiBAYnJpZWYgeGNiX2V4cG9zZV9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZXhwb3NlX2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICB4OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICB5OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICB3aWR0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgaGVpZ2h0OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBjb3VudDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMVsyXTsgLyoqPCAgKi8KK30geGNiX2V4cG9zZV9ldmVudF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZ3JhcGhpY3NfZXhwb3N1cmUuICovCisjZGVmaW5lIFhDQl9HUkFQSElDU19FWFBPU1VSRSAxMworCisvKioKKyAqIEBicmllZiB4Y2JfZ3JhcGhpY3NfZXhwb3N1cmVfZXZlbnRfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dyYXBoaWNzX2V4cG9zdXJlX2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICB4OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIHk7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgd2lkdGg7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgaGVpZ2h0OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIG1pbm9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBjb3VudDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMVszXTsgLyoqPCAgKi8KK30geGNiX2dyYXBoaWNzX2V4cG9zdXJlX2V2ZW50X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9ub19leHBvc3VyZS4gKi8KKyNkZWZpbmUgWENCX05PX0VYUE9TVVJFIDE0CisKKy8qKgorICogQGJyaWVmIHhjYl9ub19leHBvc3VyZV9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfbm9fZXhwb3N1cmVfZXZlbnRfdCB7CisgICAgdWludDhfdCAgICAgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIG1pbm9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMTsgLyoqPCAgKi8KK30geGNiX25vX2V4cG9zdXJlX2V2ZW50X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfdmlzaWJpbGl0eV90IHsKKyAgICBYQ0JfVklTSUJJTElUWV9VTk9CU0NVUkVEID0gMCwKKyAgICBYQ0JfVklTSUJJTElUWV9QQVJUSUFMTFlfT0JTQ1VSRUQgPSAxLAorICAgIFhDQl9WSVNJQklMSVRZX0ZVTExZX09CU0NVUkVEID0gMgorfSB4Y2JfdmlzaWJpbGl0eV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfdmlzaWJpbGl0eV9ub3RpZnkuICovCisjZGVmaW5lIFhDQl9WSVNJQklMSVRZX05PVElGWSAxNQorCisvKioKKyAqIEBicmllZiB4Y2JfdmlzaWJpbGl0eV9ub3RpZnlfZXZlbnRfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3Zpc2liaWxpdHlfbm90aWZ5X2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBzdGF0ZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMVszXTsgLyoqPCAgKi8KK30geGNiX3Zpc2liaWxpdHlfbm90aWZ5X2V2ZW50X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jcmVhdGVfbm90aWZ5LiAqLworI2RlZmluZSBYQ0JfQ1JFQVRFX05PVElGWSAxNgorCisvKioKKyAqIEBicmllZiB4Y2JfY3JlYXRlX25vdGlmeV9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY3JlYXRlX25vdGlmeV9ldmVudF90IHsKKyAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgc2VxdWVuY2U7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHBhcmVudDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICB4OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICB5OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICB3aWR0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgaGVpZ2h0OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBib3JkZXJfd2lkdGg7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIG92ZXJyaWRlX3JlZGlyZWN0OyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQxOyAvKio8ICAqLworfSB4Y2JfY3JlYXRlX25vdGlmeV9ldmVudF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZGVzdHJveV9ub3RpZnkuICovCisjZGVmaW5lIFhDQl9ERVNUUk9ZX05PVElGWSAxNworCisvKioKKyAqIEBicmllZiB4Y2JfZGVzdHJveV9ub3RpZnlfZXZlbnRfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2Rlc3Ryb3lfbm90aWZ5X2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgZXZlbnQ7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsgLyoqPCAgKi8KK30geGNiX2Rlc3Ryb3lfbm90aWZ5X2V2ZW50X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl91bm1hcF9ub3RpZnkuICovCisjZGVmaW5lIFhDQl9VTk1BUF9OT1RJRlkgMTgKKworLyoqCisgKiBAYnJpZWYgeGNiX3VubWFwX25vdGlmeV9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfdW5tYXBfbm90aWZ5X2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgZXZlbnQ7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgZnJvbV9jb25maWd1cmU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDFbM107IC8qKjwgICovCit9IHhjYl91bm1hcF9ub3RpZnlfZXZlbnRfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX21hcF9ub3RpZnkuICovCisjZGVmaW5lIFhDQl9NQVBfTk9USUZZIDE5CisKKy8qKgorICogQGJyaWVmIHhjYl9tYXBfbm90aWZ5X2V2ZW50X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9tYXBfbm90aWZ5X2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgZXZlbnQ7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgb3ZlcnJpZGVfcmVkaXJlY3Q7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDFbM107IC8qKjwgICovCit9IHhjYl9tYXBfbm90aWZ5X2V2ZW50X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9tYXBfcmVxdWVzdC4gKi8KKyNkZWZpbmUgWENCX01BUF9SRVFVRVNUIDIwCisKKy8qKgorICogQGJyaWVmIHhjYl9tYXBfcmVxdWVzdF9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfbWFwX3JlcXVlc3RfZXZlbnRfdCB7CisgICAgdWludDhfdCAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCBwYXJlbnQ7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsgLyoqPCAgKi8KK30geGNiX21hcF9yZXF1ZXN0X2V2ZW50X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9yZXBhcmVudF9ub3RpZnkuICovCisjZGVmaW5lIFhDQl9SRVBBUkVOVF9OT1RJRlkgMjEKKworLyoqCisgKiBAYnJpZWYgeGNiX3JlcGFyZW50X25vdGlmeV9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcmVwYXJlbnRfbm90aWZ5X2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgZXZlbnQ7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgcGFyZW50OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICB4OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICB5OyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBvdmVycmlkZV9yZWRpcmVjdDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMVszXTsgLyoqPCAgKi8KK30geGNiX3JlcGFyZW50X25vdGlmeV9ldmVudF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY29uZmlndXJlX25vdGlmeS4gKi8KKyNkZWZpbmUgWENCX0NPTkZJR1VSRV9OT1RJRlkgMjIKKworLyoqCisgKiBAYnJpZWYgeGNiX2NvbmZpZ3VyZV9ub3RpZnlfZXZlbnRfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NvbmZpZ3VyZV9ub3RpZnlfZXZlbnRfdCB7CisgICAgdWludDhfdCAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCBldmVudDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCBhYm92ZV9zaWJsaW5nOyAvKio8ICAqLworICAgIGludDE2X3QgICAgICB4OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICB5OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICB3aWR0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgaGVpZ2h0OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBib3JkZXJfd2lkdGg7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIG92ZXJyaWRlX3JlZGlyZWN0OyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQxOyAvKio8ICAqLworfSB4Y2JfY29uZmlndXJlX25vdGlmeV9ldmVudF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY29uZmlndXJlX3JlcXVlc3QuICovCisjZGVmaW5lIFhDQl9DT05GSUdVUkVfUkVRVUVTVCAyMworCisvKioKKyAqIEBicmllZiB4Y2JfY29uZmlndXJlX3JlcXVlc3RfZXZlbnRfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NvbmZpZ3VyZV9yZXF1ZXN0X2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBzdGFja19tb2RlOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgcGFyZW50OyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHNpYmxpbmc7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIHg7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIHk7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHdpZHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBoZWlnaHQ7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGJvcmRlcl93aWR0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgdmFsdWVfbWFzazsgLyoqPCAgKi8KK30geGNiX2NvbmZpZ3VyZV9yZXF1ZXN0X2V2ZW50X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9ncmF2aXR5X25vdGlmeS4gKi8KKyNkZWZpbmUgWENCX0dSQVZJVFlfTk9USUZZIDI0CisKKy8qKgorICogQGJyaWVmIHhjYl9ncmF2aXR5X25vdGlmeV9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ3Jhdml0eV9ub3RpZnlfZXZlbnRfdCB7CisgICAgdWludDhfdCAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCBldmVudDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICB4OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICB5OyAvKio8ICAqLworfSB4Y2JfZ3Jhdml0eV9ub3RpZnlfZXZlbnRfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3Jlc2l6ZV9yZXF1ZXN0LiAqLworI2RlZmluZSBYQ0JfUkVTSVpFX1JFUVVFU1QgMjUKKworLyoqCisgKiBAYnJpZWYgeGNiX3Jlc2l6ZV9yZXF1ZXN0X2V2ZW50X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9yZXNpemVfcmVxdWVzdF9ldmVudF90IHsKKyAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgc2VxdWVuY2U7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgd2lkdGg7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGhlaWdodDsgLyoqPCAgKi8KK30geGNiX3Jlc2l6ZV9yZXF1ZXN0X2V2ZW50X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfcGxhY2VfdCB7CisgICAgWENCX1BMQUNFX09OX1RPUCA9IDAsCisgICAgWENCX1BMQUNFX09OX0JPVFRPTSA9IDEKK30geGNiX3BsYWNlX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jaXJjdWxhdGVfbm90aWZ5LiAqLworI2RlZmluZSBYQ0JfQ0lSQ1VMQVRFX05PVElGWSAyNgorCisvKioKKyAqIEBicmllZiB4Y2JfY2lyY3VsYXRlX25vdGlmeV9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY2lyY3VsYXRlX25vdGlmeV9ldmVudF90IHsKKyAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgc2VxdWVuY2U7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IGV2ZW50OyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDFbNF07IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBsYWNlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQyWzNdOyAvKio8ICAqLworfSB4Y2JfY2lyY3VsYXRlX25vdGlmeV9ldmVudF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY2lyY3VsYXRlX3JlcXVlc3QuICovCisjZGVmaW5lIFhDQl9DSVJDVUxBVEVfUkVRVUVTVCAyNworCit0eXBlZGVmIHhjYl9jaXJjdWxhdGVfbm90aWZ5X2V2ZW50X3QgeGNiX2NpcmN1bGF0ZV9yZXF1ZXN0X2V2ZW50X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfcHJvcGVydHlfdCB7CisgICAgWENCX1BST1BFUlRZX05FV19WQUxVRSA9IDAsCisgICAgWENCX1BST1BFUlRZX0RFTEVURSA9IDEKK30geGNiX3Byb3BlcnR5X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9wcm9wZXJ0eV9ub3RpZnkuICovCisjZGVmaW5lIFhDQl9QUk9QRVJUWV9OT1RJRlkgMjgKKworLyoqCisgKiBAYnJpZWYgeGNiX3Byb3BlcnR5X25vdGlmeV9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcHJvcGVydHlfbm90aWZ5X2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgd2luZG93OyAvKio8ICAqLworICAgIHhjYl9hdG9tX3QgICAgICBhdG9tOyAvKio8ICAqLworICAgIHhjYl90aW1lc3RhbXBfdCB0aW1lOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBzdGF0ZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICAgcGFkMVszXTsgLyoqPCAgKi8KK30geGNiX3Byb3BlcnR5X25vdGlmeV9ldmVudF90OworCisvKiogT3Bjb2RlIGZvciB4Y2Jfc2VsZWN0aW9uX2NsZWFyLiAqLworI2RlZmluZSBYQ0JfU0VMRUNUSU9OX0NMRUFSIDI5CisKKy8qKgorICogQGJyaWVmIHhjYl9zZWxlY3Rpb25fY2xlYXJfZXZlbnRfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3NlbGVjdGlvbl9jbGVhcl9ldmVudF90IHsKKyAgICB1aW50OF90ICAgICAgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICAgc2VxdWVuY2U7IC8qKjwgICovCisgICAgeGNiX3RpbWVzdGFtcF90IHRpbWU7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190ICAgIG93bmVyOyAvKio8ICAqLworICAgIHhjYl9hdG9tX3QgICAgICBzZWxlY3Rpb247IC8qKjwgICovCit9IHhjYl9zZWxlY3Rpb25fY2xlYXJfZXZlbnRfdDsKKwordHlwZWRlZiBlbnVtIHhjYl90aW1lX3QgeworICAgIFhDQl9USU1FX0NVUlJFTlRfVElNRSA9IDAKK30geGNiX3RpbWVfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9hdG9tX2VudW1fdCB7CisgICAgWENCX0FUT01fTk9ORSA9IDAsCisgICAgWENCX0FUT01fQU5ZID0gMCwKKyAgICBYQ0JfQVRPTV9QUklNQVJZLAorICAgIFhDQl9BVE9NX1NFQ09OREFSWSwKKyAgICBYQ0JfQVRPTV9BUkMsCisgICAgWENCX0FUT01fQVRPTSwKKyAgICBYQ0JfQVRPTV9CSVRNQVAsCisgICAgWENCX0FUT01fQ0FSRElOQUwsCisgICAgWENCX0FUT01fQ09MT1JNQVAsCisgICAgWENCX0FUT01fQ1VSU09SLAorICAgIFhDQl9BVE9NX0NVVF9CVUZGRVIwLAorICAgIFhDQl9BVE9NX0NVVF9CVUZGRVIxLAorICAgIFhDQl9BVE9NX0NVVF9CVUZGRVIyLAorICAgIFhDQl9BVE9NX0NVVF9CVUZGRVIzLAorICAgIFhDQl9BVE9NX0NVVF9CVUZGRVI0LAorICAgIFhDQl9BVE9NX0NVVF9CVUZGRVI1LAorICAgIFhDQl9BVE9NX0NVVF9CVUZGRVI2LAorICAgIFhDQl9BVE9NX0NVVF9CVUZGRVI3LAorICAgIFhDQl9BVE9NX0RSQVdBQkxFLAorICAgIFhDQl9BVE9NX0ZPTlQsCisgICAgWENCX0FUT01fSU5URUdFUiwKKyAgICBYQ0JfQVRPTV9QSVhNQVAsCisgICAgWENCX0FUT01fUE9JTlQsCisgICAgWENCX0FUT01fUkVDVEFOR0xFLAorICAgIFhDQl9BVE9NX1JFU09VUkNFX01BTkFHRVIsCisgICAgWENCX0FUT01fUkdCX0NPTE9SX01BUCwKKyAgICBYQ0JfQVRPTV9SR0JfQkVTVF9NQVAsCisgICAgWENCX0FUT01fUkdCX0JMVUVfTUFQLAorICAgIFhDQl9BVE9NX1JHQl9ERUZBVUxUX01BUCwKKyAgICBYQ0JfQVRPTV9SR0JfR1JBWV9NQVAsCisgICAgWENCX0FUT01fUkdCX0dSRUVOX01BUCwKKyAgICBYQ0JfQVRPTV9SR0JfUkVEX01BUCwKKyAgICBYQ0JfQVRPTV9TVFJJTkcsCisgICAgWENCX0FUT01fVklTVUFMSUQsCisgICAgWENCX0FUT01fV0lORE9XLAorICAgIFhDQl9BVE9NX1dNX0NPTU1BTkQsCisgICAgWENCX0FUT01fV01fSElOVFMsCisgICAgWENCX0FUT01fV01fQ0xJRU5UX01BQ0hJTkUsCisgICAgWENCX0FUT01fV01fSUNPTl9OQU1FLAorICAgIFhDQl9BVE9NX1dNX0lDT05fU0laRSwKKyAgICBYQ0JfQVRPTV9XTV9OQU1FLAorICAgIFhDQl9BVE9NX1dNX05PUk1BTF9ISU5UUywKKyAgICBYQ0JfQVRPTV9XTV9TSVpFX0hJTlRTLAorICAgIFhDQl9BVE9NX1dNX1pPT01fSElOVFMsCisgICAgWENCX0FUT01fTUlOX1NQQUNFLAorICAgIFhDQl9BVE9NX05PUk1fU1BBQ0UsCisgICAgWENCX0FUT01fTUFYX1NQQUNFLAorICAgIFhDQl9BVE9NX0VORF9TUEFDRSwKKyAgICBYQ0JfQVRPTV9TVVBFUlNDUklQVF9YLAorICAgIFhDQl9BVE9NX1NVUEVSU0NSSVBUX1ksCisgICAgWENCX0FUT01fU1VCU0NSSVBUX1gsCisgICAgWENCX0FUT01fU1VCU0NSSVBUX1ksCisgICAgWENCX0FUT01fVU5ERVJMSU5FX1BPU0lUSU9OLAorICAgIFhDQl9BVE9NX1VOREVSTElORV9USElDS05FU1MsCisgICAgWENCX0FUT01fU1RSSUtFT1VUX0FTQ0VOVCwKKyAgICBYQ0JfQVRPTV9TVFJJS0VPVVRfREVTQ0VOVCwKKyAgICBYQ0JfQVRPTV9JVEFMSUNfQU5HTEUsCisgICAgWENCX0FUT01fWF9IRUlHSFQsCisgICAgWENCX0FUT01fUVVBRF9XSURUSCwKKyAgICBYQ0JfQVRPTV9XRUlHSFQsCisgICAgWENCX0FUT01fUE9JTlRfU0laRSwKKyAgICBYQ0JfQVRPTV9SRVNPTFVUSU9OLAorICAgIFhDQl9BVE9NX0NPUFlSSUdIVCwKKyAgICBYQ0JfQVRPTV9OT1RJQ0UsCisgICAgWENCX0FUT01fRk9OVF9OQU1FLAorICAgIFhDQl9BVE9NX0ZBTUlMWV9OQU1FLAorICAgIFhDQl9BVE9NX0ZVTExfTkFNRSwKKyAgICBYQ0JfQVRPTV9DQVBfSEVJR0hULAorICAgIFhDQl9BVE9NX1dNX0NMQVNTLAorICAgIFhDQl9BVE9NX1dNX1RSQU5TSUVOVF9GT1IKK30geGNiX2F0b21fZW51bV90OworCisvKiogT3Bjb2RlIGZvciB4Y2Jfc2VsZWN0aW9uX3JlcXVlc3QuICovCisjZGVmaW5lIFhDQl9TRUxFQ1RJT05fUkVRVUVTVCAzMAorCisvKioKKyAqIEBicmllZiB4Y2Jfc2VsZWN0aW9uX3JlcXVlc3RfZXZlbnRfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3NlbGVjdGlvbl9yZXF1ZXN0X2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgb3duZXI7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190ICAgIHJlcXVlc3RvcjsgLyoqPCAgKi8KKyAgICB4Y2JfYXRvbV90ICAgICAgc2VsZWN0aW9uOyAvKio8ICAqLworICAgIHhjYl9hdG9tX3QgICAgICB0YXJnZXQ7IC8qKjwgICovCisgICAgeGNiX2F0b21fdCAgICAgIHByb3BlcnR5OyAvKio8ICAqLworfSB4Y2Jfc2VsZWN0aW9uX3JlcXVlc3RfZXZlbnRfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3NlbGVjdGlvbl9ub3RpZnkuICovCisjZGVmaW5lIFhDQl9TRUxFQ1RJT05fTk9USUZZIDMxCisKKy8qKgorICogQGJyaWVmIHhjYl9zZWxlY3Rpb25fbm90aWZ5X2V2ZW50X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zZWxlY3Rpb25fbm90aWZ5X2V2ZW50X3QgeworICAgIHVpbnQ4X3QgICAgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgcmVxdWVzdG9yOyAvKio8ICAqLworICAgIHhjYl9hdG9tX3QgICAgICBzZWxlY3Rpb247IC8qKjwgICovCisgICAgeGNiX2F0b21fdCAgICAgIHRhcmdldDsgLyoqPCAgKi8KKyAgICB4Y2JfYXRvbV90ICAgICAgcHJvcGVydHk7IC8qKjwgICovCit9IHhjYl9zZWxlY3Rpb25fbm90aWZ5X2V2ZW50X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfY29sb3JtYXBfc3RhdGVfdCB7CisgICAgWENCX0NPTE9STUFQX1NUQVRFX1VOSU5TVEFMTEVEID0gMCwKKyAgICBYQ0JfQ09MT1JNQVBfU1RBVEVfSU5TVEFMTEVEID0gMQorfSB4Y2JfY29sb3JtYXBfc3RhdGVfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9jb2xvcm1hcF9lbnVtX3QgeworICAgIFhDQl9DT0xPUk1BUF9OT05FID0gMAorfSB4Y2JfY29sb3JtYXBfZW51bV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY29sb3JtYXBfbm90aWZ5LiAqLworI2RlZmluZSBYQ0JfQ09MT1JNQVBfTk9USUZZIDMyCisKKy8qKgorICogQGJyaWVmIHhjYl9jb2xvcm1hcF9ub3RpZnlfZXZlbnRfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NvbG9ybWFwX25vdGlmeV9ldmVudF90IHsKKyAgICB1aW50OF90ICAgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgc2VxdWVuY2U7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190ICAgd2luZG93OyAvKio8ICAqLworICAgIHhjYl9jb2xvcm1hcF90IGNvbG9ybWFwOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIF9uZXc7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgc3RhdGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMVsyXTsgLyoqPCAgKi8KK30geGNiX2NvbG9ybWFwX25vdGlmeV9ldmVudF90OworCisvKioKKyAqIEBicmllZiB4Y2JfY2xpZW50X21lc3NhZ2VfZGF0YV90CisgKiovCit0eXBlZGVmIHVuaW9uIHhjYl9jbGllbnRfbWVzc2FnZV9kYXRhX3QgeworICAgIHVpbnQ4X3QgIGRhdGE4WzIwXTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBkYXRhMTZbMTBdOyAvKio8ICAqLworICAgIHVpbnQzMl90IGRhdGEzMls1XTsgLyoqPCAgKi8KK30geGNiX2NsaWVudF9tZXNzYWdlX2RhdGFfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2NsaWVudF9tZXNzYWdlX2RhdGFfaXRlcmF0b3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NsaWVudF9tZXNzYWdlX2RhdGFfaXRlcmF0b3JfdCB7CisgICAgeGNiX2NsaWVudF9tZXNzYWdlX2RhdGFfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICByZW07IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl9jbGllbnRfbWVzc2FnZV9kYXRhX2l0ZXJhdG9yX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jbGllbnRfbWVzc2FnZS4gKi8KKyNkZWZpbmUgWENCX0NMSUVOVF9NRVNTQUdFIDMzCisKKy8qKgorICogQGJyaWVmIHhjYl9jbGllbnRfbWVzc2FnZV9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY2xpZW50X21lc3NhZ2VfZXZlbnRfdCB7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgZm9ybWF0OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgc2VxdWVuY2U7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190ICAgICAgICAgICAgICB3aW5kb3c7IC8qKjwgICovCisgICAgeGNiX2F0b21fdCAgICAgICAgICAgICAgICB0eXBlOyAvKio8ICAqLworICAgIHhjYl9jbGllbnRfbWVzc2FnZV9kYXRhX3QgZGF0YTsgLyoqPCAgKi8KK30geGNiX2NsaWVudF9tZXNzYWdlX2V2ZW50X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfbWFwcGluZ190IHsKKyAgICBYQ0JfTUFQUElOR19NT0RJRklFUiA9IDAsCisgICAgWENCX01BUFBJTkdfS0VZQk9BUkQgPSAxLAorICAgIFhDQl9NQVBQSU5HX1BPSU5URVIgPSAyCit9IHhjYl9tYXBwaW5nX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9tYXBwaW5nX25vdGlmeS4gKi8KKyNkZWZpbmUgWENCX01BUFBJTkdfTk9USUZZIDM0CisKKy8qKgorICogQGJyaWVmIHhjYl9tYXBwaW5nX25vdGlmeV9ldmVudF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfbWFwcGluZ19ub3RpZnlfZXZlbnRfdCB7CisgICAgdWludDhfdCAgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgcmVxdWVzdDsgLyoqPCAgKi8KKyAgICB4Y2Jfa2V5Y29kZV90IGZpcnN0X2tleWNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICBjb3VudDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgIHBhZDE7IC8qKjwgICovCit9IHhjYl9tYXBwaW5nX25vdGlmeV9ldmVudF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfcmVxdWVzdC4gKi8KKyNkZWZpbmUgWENCX1JFUVVFU1QgMQorCisvKioKKyAqIEBicmllZiB4Y2JfcmVxdWVzdF9lcnJvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcmVxdWVzdF9lcnJvcl90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIGVycm9yX2NvZGU7IC8qKjwgICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgYmFkX3ZhbHVlOyAvKio8ICAqLworICAgIHVpbnQxNl90IG1pbm9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KK30geGNiX3JlcXVlc3RfZXJyb3JfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3ZhbHVlLiAqLworI2RlZmluZSBYQ0JfVkFMVUUgMgorCisvKioKKyAqIEBicmllZiB4Y2JfdmFsdWVfZXJyb3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3ZhbHVlX2Vycm9yX3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgZXJyb3JfY29kZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBiYWRfdmFsdWU7IC8qKjwgICovCisgICAgdWludDE2X3QgbWlub3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworfSB4Y2JfdmFsdWVfZXJyb3JfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3dpbmRvdy4gKi8KKyNkZWZpbmUgWENCX1dJTkRPVyAzCisKK3R5cGVkZWYgeGNiX3ZhbHVlX2Vycm9yX3QgeGNiX3dpbmRvd19lcnJvcl90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfcGl4bWFwLiAqLworI2RlZmluZSBYQ0JfUElYTUFQIDQKKwordHlwZWRlZiB4Y2JfdmFsdWVfZXJyb3JfdCB4Y2JfcGl4bWFwX2Vycm9yX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9hdG9tLiAqLworI2RlZmluZSBYQ0JfQVRPTSA1CisKK3R5cGVkZWYgeGNiX3ZhbHVlX2Vycm9yX3QgeGNiX2F0b21fZXJyb3JfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2N1cnNvci4gKi8KKyNkZWZpbmUgWENCX0NVUlNPUiA2CisKK3R5cGVkZWYgeGNiX3ZhbHVlX2Vycm9yX3QgeGNiX2N1cnNvcl9lcnJvcl90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZm9udC4gKi8KKyNkZWZpbmUgWENCX0ZPTlQgNworCit0eXBlZGVmIHhjYl92YWx1ZV9lcnJvcl90IHhjYl9mb250X2Vycm9yX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9tYXRjaC4gKi8KKyNkZWZpbmUgWENCX01BVENIIDgKKwordHlwZWRlZiB4Y2JfcmVxdWVzdF9lcnJvcl90IHhjYl9tYXRjaF9lcnJvcl90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZHJhd2FibGUuICovCisjZGVmaW5lIFhDQl9EUkFXQUJMRSA5CisKK3R5cGVkZWYgeGNiX3ZhbHVlX2Vycm9yX3QgeGNiX2RyYXdhYmxlX2Vycm9yX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9hY2Nlc3MuICovCisjZGVmaW5lIFhDQl9BQ0NFU1MgMTAKKwordHlwZWRlZiB4Y2JfcmVxdWVzdF9lcnJvcl90IHhjYl9hY2Nlc3NfZXJyb3JfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2FsbG9jLiAqLworI2RlZmluZSBYQ0JfQUxMT0MgMTEKKwordHlwZWRlZiB4Y2JfcmVxdWVzdF9lcnJvcl90IHhjYl9hbGxvY19lcnJvcl90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY29sb3JtYXAuICovCisjZGVmaW5lIFhDQl9DT0xPUk1BUCAxMgorCit0eXBlZGVmIHhjYl92YWx1ZV9lcnJvcl90IHhjYl9jb2xvcm1hcF9lcnJvcl90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZ19jb250ZXh0LiAqLworI2RlZmluZSBYQ0JfR19DT05URVhUIDEzCisKK3R5cGVkZWYgeGNiX3ZhbHVlX2Vycm9yX3QgeGNiX2dfY29udGV4dF9lcnJvcl90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfaWRfY2hvaWNlLiAqLworI2RlZmluZSBYQ0JfSURfQ0hPSUNFIDE0CisKK3R5cGVkZWYgeGNiX3ZhbHVlX2Vycm9yX3QgeGNiX2lkX2Nob2ljZV9lcnJvcl90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfbmFtZS4gKi8KKyNkZWZpbmUgWENCX05BTUUgMTUKKwordHlwZWRlZiB4Y2JfcmVxdWVzdF9lcnJvcl90IHhjYl9uYW1lX2Vycm9yX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9sZW5ndGguICovCisjZGVmaW5lIFhDQl9MRU5HVEggMTYKKwordHlwZWRlZiB4Y2JfcmVxdWVzdF9lcnJvcl90IHhjYl9sZW5ndGhfZXJyb3JfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2ltcGxlbWVudGF0aW9uLiAqLworI2RlZmluZSBYQ0JfSU1QTEVNRU5UQVRJT04gMTcKKwordHlwZWRlZiB4Y2JfcmVxdWVzdF9lcnJvcl90IHhjYl9pbXBsZW1lbnRhdGlvbl9lcnJvcl90OworCit0eXBlZGVmIGVudW0geGNiX3dpbmRvd19jbGFzc190IHsKKyAgICBYQ0JfV0lORE9XX0NMQVNTX0NPUFlfRlJPTV9QQVJFTlQgPSAwLAorICAgIFhDQl9XSU5ET1dfQ0xBU1NfSU5QVVRfT1VUUFVUID0gMSwKKyAgICBYQ0JfV0lORE9XX0NMQVNTX0lOUFVUX09OTFkgPSAyCit9IHhjYl93aW5kb3dfY2xhc3NfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9jd190IHsKKyAgICBYQ0JfQ1dfQkFDS19QSVhNQVAgPSAxLAorICAgIFhDQl9DV19CQUNLX1BJWEVMID0gMiwKKyAgICBYQ0JfQ1dfQk9SREVSX1BJWE1BUCA9IDQsCisgICAgWENCX0NXX0JPUkRFUl9QSVhFTCA9IDgsCisgICAgWENCX0NXX0JJVF9HUkFWSVRZID0gMTYsCisgICAgWENCX0NXX1dJTl9HUkFWSVRZID0gMzIsCisgICAgWENCX0NXX0JBQ0tJTkdfU1RPUkUgPSA2NCwKKyAgICBYQ0JfQ1dfQkFDS0lOR19QTEFORVMgPSAxMjgsCisgICAgWENCX0NXX0JBQ0tJTkdfUElYRUwgPSAyNTYsCisgICAgWENCX0NXX09WRVJSSURFX1JFRElSRUNUID0gNTEyLAorICAgIFhDQl9DV19TQVZFX1VOREVSID0gMTAyNCwKKyAgICBYQ0JfQ1dfRVZFTlRfTUFTSyA9IDIwNDgsCisgICAgWENCX0NXX0RPTlRfUFJPUEFHQVRFID0gNDA5NiwKKyAgICBYQ0JfQ1dfQ09MT1JNQVAgPSA4MTkyLAorICAgIFhDQl9DV19DVVJTT1IgPSAxNjM4NAorfSB4Y2JfY3dfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9iYWNrX3BpeG1hcF90IHsKKyAgICBYQ0JfQkFDS19QSVhNQVBfTk9ORSA9IDAsCisgICAgWENCX0JBQ0tfUElYTUFQX1BBUkVOVF9SRUxBVElWRSA9IDEKK30geGNiX2JhY2tfcGl4bWFwX3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfZ3Jhdml0eV90IHsKKyAgICBYQ0JfR1JBVklUWV9CSVRfRk9SR0VUID0gMCwKKyAgICBYQ0JfR1JBVklUWV9XSU5fVU5NQVAgPSAwLAorICAgIFhDQl9HUkFWSVRZX05PUlRIX1dFU1QgPSAxLAorICAgIFhDQl9HUkFWSVRZX05PUlRIID0gMiwKKyAgICBYQ0JfR1JBVklUWV9OT1JUSF9FQVNUID0gMywKKyAgICBYQ0JfR1JBVklUWV9XRVNUID0gNCwKKyAgICBYQ0JfR1JBVklUWV9DRU5URVIgPSA1LAorICAgIFhDQl9HUkFWSVRZX0VBU1QgPSA2LAorICAgIFhDQl9HUkFWSVRZX1NPVVRIX1dFU1QgPSA3LAorICAgIFhDQl9HUkFWSVRZX1NPVVRIID0gOCwKKyAgICBYQ0JfR1JBVklUWV9TT1VUSF9FQVNUID0gOSwKKyAgICBYQ0JfR1JBVklUWV9TVEFUSUMgPSAxMAorfSB4Y2JfZ3Jhdml0eV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY3JlYXRlX3dpbmRvdy4gKi8KKyNkZWZpbmUgWENCX0NSRUFURV9XSU5ET1cgMQorCisvKioKKyAqIEBicmllZiB4Y2JfY3JlYXRlX3dpbmRvd19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jcmVhdGVfd2luZG93X3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIGRlcHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICB3aWQ7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190ICAgcGFyZW50OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIHg7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgeTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICB3aWR0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBoZWlnaHQ7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgYm9yZGVyX3dpZHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIF9jbGFzczsgLyoqPCAgKi8KKyAgICB4Y2JfdmlzdWFsaWRfdCB2aXN1YWw7IC8qKjwgICovCisgICAgdWludDMyX3QgICAgICAgdmFsdWVfbWFzazsgLyoqPCAgKi8KK30geGNiX2NyZWF0ZV93aW5kb3dfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY2hhbmdlX3dpbmRvd19hdHRyaWJ1dGVzLiAqLworI2RlZmluZSBYQ0JfQ0hBTkdFX1dJTkRPV19BVFRSSUJVVEVTIDIKKworLyoqCisgKiBAYnJpZWYgeGNiX2NoYW5nZV93aW5kb3dfYXR0cmlidXRlc19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jaGFuZ2Vfd2luZG93X2F0dHJpYnV0ZXNfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgdmFsdWVfbWFzazsgLyoqPCAgKi8KK30geGNiX2NoYW5nZV93aW5kb3dfYXR0cmlidXRlc19yZXF1ZXN0X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfbWFwX3N0YXRlX3QgeworICAgIFhDQl9NQVBfU1RBVEVfVU5NQVBQRUQgPSAwLAorICAgIFhDQl9NQVBfU1RBVEVfVU5WSUVXQUJMRSA9IDEsCisgICAgWENCX01BUF9TVEFURV9WSUVXQUJMRSA9IDIKK30geGNiX21hcF9zdGF0ZV90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXMuICovCisjZGVmaW5lIFhDQl9HRVRfV0lORE9XX0FUVFJJQlVURVMgMworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF93aW5kb3dfYXR0cmlidXRlc19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworfSB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF93aW5kb3dfYXR0cmlidXRlc19yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgICAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgYmFja2luZ19zdG9yZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3Zpc3VhbGlkX3QgdmlzdWFsOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIF9jbGFzczsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBiaXRfZ3Jhdml0eTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICB3aW5fZ3Jhdml0eTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICBiYWNraW5nX3BsYW5lczsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICBiYWNraW5nX3BpeGVsOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHNhdmVfdW5kZXI7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgbWFwX2lzX2luc3RhbGxlZDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBtYXBfc3RhdGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgb3ZlcnJpZGVfcmVkaXJlY3Q7IC8qKjwgICovCisgICAgeGNiX2NvbG9ybWFwX3QgY29sb3JtYXA7IC8qKjwgICovCisgICAgdWludDMyX3QgICAgICAgYWxsX2V2ZW50X21hc2tzOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICAgIHlvdXJfZXZlbnRfbWFzazsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBkb19ub3RfcHJvcGFnYXRlX21hc2s7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMFsyXTsgLyoqPCAgKi8KK30geGNiX2dldF93aW5kb3dfYXR0cmlidXRlc19yZXBseV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZGVzdHJveV93aW5kb3cuICovCisjZGVmaW5lIFhDQl9ERVNUUk9ZX1dJTkRPVyA0CisKKy8qKgorICogQGJyaWVmIHhjYl9kZXN0cm95X3dpbmRvd19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9kZXN0cm95X3dpbmRvd19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworfSB4Y2JfZGVzdHJveV93aW5kb3dfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZGVzdHJveV9zdWJ3aW5kb3dzLiAqLworI2RlZmluZSBYQ0JfREVTVFJPWV9TVUJXSU5ET1dTIDUKKworLyoqCisgKiBAYnJpZWYgeGNiX2Rlc3Ryb3lfc3Vid2luZG93c19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9kZXN0cm95X3N1YndpbmRvd3NfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsgLyoqPCAgKi8KK30geGNiX2Rlc3Ryb3lfc3Vid2luZG93c19yZXF1ZXN0X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2Jfc2V0X21vZGVfdCB7CisgICAgWENCX1NFVF9NT0RFX0lOU0VSVCA9IDAsCisgICAgWENCX1NFVF9NT0RFX0RFTEVURSA9IDEKK30geGNiX3NldF9tb2RlX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jaGFuZ2Vfc2F2ZV9zZXQuICovCisjZGVmaW5lIFhDQl9DSEFOR0VfU0FWRV9TRVQgNgorCisvKioKKyAqIEBicmllZiB4Y2JfY2hhbmdlX3NhdmVfc2V0X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NoYW5nZV9zYXZlX3NldF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIG1vZGU7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworfSB4Y2JfY2hhbmdlX3NhdmVfc2V0X3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3JlcGFyZW50X3dpbmRvdy4gKi8KKyNkZWZpbmUgWENCX1JFUEFSRU5UX1dJTkRPVyA3CisKKy8qKgorICogQGJyaWVmIHhjYl9yZXBhcmVudF93aW5kb3dfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcmVwYXJlbnRfd2luZG93X3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHBhcmVudDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgeTsgLyoqPCAgKi8KK30geGNiX3JlcGFyZW50X3dpbmRvd19yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9tYXBfd2luZG93LiAqLworI2RlZmluZSBYQ0JfTUFQX1dJTkRPVyA4CisKKy8qKgorICogQGJyaWVmIHhjYl9tYXBfd2luZG93X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX21hcF93aW5kb3dfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsgLyoqPCAgKi8KK30geGNiX21hcF93aW5kb3dfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfbWFwX3N1YndpbmRvd3MuICovCisjZGVmaW5lIFhDQl9NQVBfU1VCV0lORE9XUyA5CisKKy8qKgorICogQGJyaWVmIHhjYl9tYXBfc3Vid2luZG93c19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9tYXBfc3Vid2luZG93c19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworfSB4Y2JfbWFwX3N1YndpbmRvd3NfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfdW5tYXBfd2luZG93LiAqLworI2RlZmluZSBYQ0JfVU5NQVBfV0lORE9XIDEwCisKKy8qKgorICogQGJyaWVmIHhjYl91bm1hcF93aW5kb3dfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfdW5tYXBfd2luZG93X3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCB3aW5kb3c7IC8qKjwgICovCit9IHhjYl91bm1hcF93aW5kb3dfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfdW5tYXBfc3Vid2luZG93cy4gKi8KKyNkZWZpbmUgWENCX1VOTUFQX1NVQldJTkRPV1MgMTEKKworLyoqCisgKiBAYnJpZWYgeGNiX3VubWFwX3N1YndpbmRvd3NfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfdW5tYXBfc3Vid2luZG93c19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworfSB4Y2JfdW5tYXBfc3Vid2luZG93c19yZXF1ZXN0X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfY29uZmlnX3dpbmRvd190IHsKKyAgICBYQ0JfQ09ORklHX1dJTkRPV19YID0gMSwKKyAgICBYQ0JfQ09ORklHX1dJTkRPV19ZID0gMiwKKyAgICBYQ0JfQ09ORklHX1dJTkRPV19XSURUSCA9IDQsCisgICAgWENCX0NPTkZJR19XSU5ET1dfSEVJR0hUID0gOCwKKyAgICBYQ0JfQ09ORklHX1dJTkRPV19CT1JERVJfV0lEVEggPSAxNiwKKyAgICBYQ0JfQ09ORklHX1dJTkRPV19TSUJMSU5HID0gMzIsCisgICAgWENCX0NPTkZJR19XSU5ET1dfU1RBQ0tfTU9ERSA9IDY0Cit9IHhjYl9jb25maWdfd2luZG93X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2Jfc3RhY2tfbW9kZV90IHsKKyAgICBYQ0JfU1RBQ0tfTU9ERV9BQk9WRSA9IDAsCisgICAgWENCX1NUQUNLX01PREVfQkVMT1cgPSAxLAorICAgIFhDQl9TVEFDS19NT0RFX1RPUF9JRiA9IDIsCisgICAgWENCX1NUQUNLX01PREVfQk9UVE9NX0lGID0gMywKKyAgICBYQ0JfU1RBQ0tfTU9ERV9PUFBPU0lURSA9IDQKK30geGNiX3N0YWNrX21vZGVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2NvbmZpZ3VyZV93aW5kb3cuICovCisjZGVmaW5lIFhDQl9DT05GSUdVUkVfV0lORE9XIDEyCisKKy8qKgorICogQGJyaWVmIHhjYl9jb25maWd1cmVfd2luZG93X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NvbmZpZ3VyZV93aW5kb3dfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgdmFsdWVfbWFzazsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMVsyXTsgLyoqPCAgKi8KK30geGNiX2NvbmZpZ3VyZV93aW5kb3dfcmVxdWVzdF90OworCit0eXBlZGVmIGVudW0geGNiX2NpcmN1bGF0ZV90IHsKKyAgICBYQ0JfQ0lSQ1VMQVRFX1JBSVNFX0xPV0VTVCA9IDAsCisgICAgWENCX0NJUkNVTEFURV9MT1dFUl9ISUdIRVNUID0gMQorfSB4Y2JfY2lyY3VsYXRlX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jaXJjdWxhdGVfd2luZG93LiAqLworI2RlZmluZSBYQ0JfQ0lSQ1VMQVRFX1dJTkRPVyAxMworCisvKioKKyAqIEBicmllZiB4Y2JfY2lyY3VsYXRlX3dpbmRvd19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jaXJjdWxhdGVfd2luZG93X3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgZGlyZWN0aW9uOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsgLyoqPCAgKi8KK30geGNiX2NpcmN1bGF0ZV93aW5kb3dfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X2dlb21ldHJ5X2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2dlb21ldHJ5X2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9nZXRfZ2VvbWV0cnlfY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9nZXRfZ2VvbWV0cnkuICovCisjZGVmaW5lIFhDQl9HRVRfR0VPTUVUUlkgMTQKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9nZW9tZXRyeV9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfZ2VvbWV0cnlfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2RyYXdhYmxlX3QgZHJhd2FibGU7IC8qKjwgICovCit9IHhjYl9nZXRfZ2VvbWV0cnlfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X2dlb21ldHJ5X3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfZ2VvbWV0cnlfcmVwbHlfdCB7CisgICAgdWludDhfdCAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIGRlcHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCByb290OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICB4OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICB5OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICB3aWR0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgaGVpZ2h0OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBib3JkZXJfd2lkdGg7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDBbMl07IC8qKjwgICovCit9IHhjYl9nZXRfZ2VvbWV0cnlfcmVwbHlfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3F1ZXJ5X3RyZWVfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV90cmVlX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9xdWVyeV90cmVlX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfcXVlcnlfdHJlZS4gKi8KKyNkZWZpbmUgWENCX1FVRVJZX1RSRUUgMTUKKworLyoqCisgKiBAYnJpZWYgeGNiX3F1ZXJ5X3RyZWVfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfdHJlZV9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworfSB4Y2JfcXVlcnlfdHJlZV9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9xdWVyeV90cmVlX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV90cmVlX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCByb290OyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCBwYXJlbnQ7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGNoaWxkcmVuX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMVsxNF07IC8qKjwgICovCit9IHhjYl9xdWVyeV90cmVlX3JlcGx5X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9pbnRlcm5fYXRvbV9jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2ludGVybl9hdG9tX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9pbnRlcm5fYXRvbV9jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2ludGVybl9hdG9tLiAqLworI2RlZmluZSBYQ0JfSU5URVJOX0FUT00gMTYKKworLyoqCisgKiBAYnJpZWYgeGNiX2ludGVybl9hdG9tX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2ludGVybl9hdG9tX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIG9ubHlfaWZfZXhpc3RzOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBuYW1lX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwWzJdOyAvKio8ICAqLworfSB4Y2JfaW50ZXJuX2F0b21fcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfaW50ZXJuX2F0b21fcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2ludGVybl9hdG9tX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfYXRvbV90IGF0b207IC8qKjwgICovCit9IHhjYl9pbnRlcm5fYXRvbV9yZXBseV90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X2F0b21fbmFtZV9jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9hdG9tX25hbWVfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2dldF9hdG9tX25hbWVfY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9nZXRfYXRvbV9uYW1lLiAqLworI2RlZmluZSBYQ0JfR0VUX0FUT01fTkFNRSAxNworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X2F0b21fbmFtZV9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfYXRvbV9uYW1lX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9hdG9tX3QgYXRvbTsgLyoqPCAgKi8KK30geGNiX2dldF9hdG9tX25hbWVfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X2F0b21fbmFtZV9yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2F0b21fbmFtZV9yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQxNl90IG5hbWVfbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDFbMjJdOyAvKio8ICAqLworfSB4Y2JfZ2V0X2F0b21fbmFtZV9yZXBseV90OworCit0eXBlZGVmIGVudW0geGNiX3Byb3BfbW9kZV90IHsKKyAgICBYQ0JfUFJPUF9NT0RFX1JFUExBQ0UgPSAwLAorICAgIFhDQl9QUk9QX01PREVfUFJFUEVORCA9IDEsCisgICAgWENCX1BST1BfTU9ERV9BUFBFTkQgPSAyCit9IHhjYl9wcm9wX21vZGVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2NoYW5nZV9wcm9wZXJ0eS4gKi8KKyNkZWZpbmUgWENCX0NIQU5HRV9QUk9QRVJUWSAxOAorCisvKioKKyAqIEBicmllZiB4Y2JfY2hhbmdlX3Byb3BlcnR5X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NoYW5nZV9wcm9wZXJ0eV9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIG1vZGU7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworICAgIHhjYl9hdG9tX3QgICBwcm9wZXJ0eTsgLyoqPCAgKi8KKyAgICB4Y2JfYXRvbV90ICAgdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgZm9ybWF0OyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwWzNdOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICBkYXRhX2xlbjsgLyoqPCAgKi8KK30geGNiX2NoYW5nZV9wcm9wZXJ0eV9yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9kZWxldGVfcHJvcGVydHkuICovCisjZGVmaW5lIFhDQl9ERUxFVEVfUFJPUEVSVFkgMTkKKworLyoqCisgKiBAYnJpZWYgeGNiX2RlbGV0ZV9wcm9wZXJ0eV9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9kZWxldGVfcHJvcGVydHlfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsgLyoqPCAgKi8KKyAgICB4Y2JfYXRvbV90ICAgcHJvcGVydHk7IC8qKjwgICovCit9IHhjYl9kZWxldGVfcHJvcGVydHlfcmVxdWVzdF90OworCit0eXBlZGVmIGVudW0geGNiX2dldF9wcm9wZXJ0eV90eXBlX3QgeworICAgIFhDQl9HRVRfUFJPUEVSVFlfVFlQRV9BTlkgPSAwCit9IHhjYl9nZXRfcHJvcGVydHlfdHlwZV90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X3Byb3BlcnR5X2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3Byb3BlcnR5X2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9nZXRfcHJvcGVydHlfY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9nZXRfcHJvcGVydHkuICovCisjZGVmaW5lIFhDQl9HRVRfUFJPUEVSVFkgMjAKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9wcm9wZXJ0eV9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfcHJvcGVydHlfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBfZGVsZXRlOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsgLyoqPCAgKi8KKyAgICB4Y2JfYXRvbV90ICAgcHJvcGVydHk7IC8qKjwgICovCisgICAgeGNiX2F0b21fdCAgIHR5cGU7IC8qKjwgICovCisgICAgdWludDMyX3QgICAgIGxvbmdfb2Zmc2V0OyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICBsb25nX2xlbmd0aDsgLyoqPCAgKi8KK30geGNiX2dldF9wcm9wZXJ0eV9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfcHJvcGVydHlfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9wcm9wZXJ0eV9yZXBseV90IHsKKyAgICB1aW50OF90ICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICBmb3JtYXQ7IC8qKjwgICovCisgICAgdWludDE2X3QgICBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfYXRvbV90IHR5cGU7IC8qKjwgICovCisgICAgdWludDMyX3QgICBieXRlc19hZnRlcjsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgIHZhbHVlX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgIHBhZDBbMTJdOyAvKio8ICAqLworfSB4Y2JfZ2V0X3Byb3BlcnR5X3JlcGx5X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9saXN0X3Byb3BlcnRpZXNfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9saXN0X3Byb3BlcnRpZXNfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2xpc3RfcHJvcGVydGllc19jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2xpc3RfcHJvcGVydGllcy4gKi8KKyNkZWZpbmUgWENCX0xJU1RfUFJPUEVSVElFUyAyMQorCisvKioKKyAqIEBicmllZiB4Y2JfbGlzdF9wcm9wZXJ0aWVzX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2xpc3RfcHJvcGVydGllc19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworfSB4Y2JfbGlzdF9wcm9wZXJ0aWVzX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2xpc3RfcHJvcGVydGllc19yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfbGlzdF9wcm9wZXJ0aWVzX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDE2X3QgYXRvbXNfbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDFbMjJdOyAvKio8ICAqLworfSB4Y2JfbGlzdF9wcm9wZXJ0aWVzX3JlcGx5X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9zZXRfc2VsZWN0aW9uX293bmVyLiAqLworI2RlZmluZSBYQ0JfU0VUX1NFTEVDVElPTl9PV05FUiAyMgorCisvKioKKyAqIEBicmllZiB4Y2Jfc2V0X3NlbGVjdGlvbl9vd25lcl9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zZXRfc2VsZWN0aW9uX293bmVyX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCAgICBvd25lcjsgLyoqPCAgKi8KKyAgICB4Y2JfYXRvbV90ICAgICAgc2VsZWN0aW9uOyAvKio8ICAqLworICAgIHhjYl90aW1lc3RhbXBfdCB0aW1lOyAvKio8ICAqLworfSB4Y2Jfc2V0X3NlbGVjdGlvbl9vd25lcl9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfc2VsZWN0aW9uX293bmVyX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcl9jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcl9jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2dldF9zZWxlY3Rpb25fb3duZXIuICovCisjZGVmaW5lIFhDQl9HRVRfU0VMRUNUSU9OX09XTkVSIDIzCisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfc2VsZWN0aW9uX293bmVyX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9zZWxlY3Rpb25fb3duZXJfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2F0b21fdCBzZWxlY3Rpb247IC8qKjwgICovCit9IHhjYl9nZXRfc2VsZWN0aW9uX293bmVyX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9zZWxlY3Rpb25fb3duZXJfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9zZWxlY3Rpb25fb3duZXJfcmVwbHlfdCB7CisgICAgdWludDhfdCAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IG93bmVyOyAvKio8ICAqLworfSB4Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcl9yZXBseV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY29udmVydF9zZWxlY3Rpb24uICovCisjZGVmaW5lIFhDQl9DT05WRVJUX1NFTEVDVElPTiAyNAorCisvKioKKyAqIEBicmllZiB4Y2JfY29udmVydF9zZWxlY3Rpb25fcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY29udmVydF9zZWxlY3Rpb25fcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190ICAgIHJlcXVlc3RvcjsgLyoqPCAgKi8KKyAgICB4Y2JfYXRvbV90ICAgICAgc2VsZWN0aW9uOyAvKio8ICAqLworICAgIHhjYl9hdG9tX3QgICAgICB0YXJnZXQ7IC8qKjwgICovCisgICAgeGNiX2F0b21fdCAgICAgIHByb3BlcnR5OyAvKio8ICAqLworICAgIHhjYl90aW1lc3RhbXBfdCB0aW1lOyAvKio8ICAqLworfSB4Y2JfY29udmVydF9zZWxlY3Rpb25fcmVxdWVzdF90OworCit0eXBlZGVmIGVudW0geGNiX3NlbmRfZXZlbnRfZGVzdF90IHsKKyAgICBYQ0JfU0VORF9FVkVOVF9ERVNUX1BPSU5URVJfV0lORE9XID0gMCwKKyAgICBYQ0JfU0VORF9FVkVOVF9ERVNUX0lURU1fRk9DVVMgPSAxCit9IHhjYl9zZW5kX2V2ZW50X2Rlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3NlbmRfZXZlbnQuICovCisjZGVmaW5lIFhDQl9TRU5EX0VWRU5UIDI1CisKKy8qKgorICogQGJyaWVmIHhjYl9zZW5kX2V2ZW50X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3NlbmRfZXZlbnRfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwcm9wYWdhdGU7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgZGVzdGluYXRpb247IC8qKjwgICovCisgICAgdWludDMyX3QgICAgIGV2ZW50X21hc2s7IC8qKjwgICovCisgICAgY2hhciAgICAgICAgIGV2ZW50WzMyXTsgLyoqPCAgKi8KK30geGNiX3NlbmRfZXZlbnRfcmVxdWVzdF90OworCit0eXBlZGVmIGVudW0geGNiX2dyYWJfbW9kZV90IHsKKyAgICBYQ0JfR1JBQl9NT0RFX1NZTkMgPSAwLAorICAgIFhDQl9HUkFCX01PREVfQVNZTkMgPSAxCit9IHhjYl9ncmFiX21vZGVfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9ncmFiX3N0YXR1c190IHsKKyAgICBYQ0JfR1JBQl9TVEFUVVNfU1VDQ0VTUyA9IDAsCisgICAgWENCX0dSQUJfU1RBVFVTX0FMUkVBRFlfR1JBQkJFRCA9IDEsCisgICAgWENCX0dSQUJfU1RBVFVTX0lOVkFMSURfVElNRSA9IDIsCisgICAgWENCX0dSQUJfU1RBVFVTX05PVF9WSUVXQUJMRSA9IDMsCisgICAgWENCX0dSQUJfU1RBVFVTX0ZST1pFTiA9IDQKK30geGNiX2dyYWJfc3RhdHVzX3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfY3Vyc29yX2VudW1fdCB7CisgICAgWENCX0NVUlNPUl9OT05FID0gMAorfSB4Y2JfY3Vyc29yX2VudW1fdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dyYWJfcG9pbnRlcl9jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dyYWJfcG9pbnRlcl9jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfZ3JhYl9wb2ludGVyX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZ3JhYl9wb2ludGVyLiAqLworI2RlZmluZSBYQ0JfR1JBQl9QT0lOVEVSIDI2CisKKy8qKgorICogQGJyaWVmIHhjYl9ncmFiX3BvaW50ZXJfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ3JhYl9wb2ludGVyX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICAgb3duZXJfZXZlbnRzOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190ICAgIGdyYWJfd2luZG93OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICBldmVudF9tYXNrOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBwb2ludGVyX21vZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgIGtleWJvYXJkX21vZGU7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190ICAgIGNvbmZpbmVfdG87IC8qKjwgICovCisgICAgeGNiX2N1cnNvcl90ICAgIGN1cnNvcjsgLyoqPCAgKi8KKyAgICB4Y2JfdGltZXN0YW1wX3QgdGltZTsgLyoqPCAgKi8KK30geGNiX2dyYWJfcG9pbnRlcl9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9ncmFiX3BvaW50ZXJfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dyYWJfcG9pbnRlcl9yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHN0YXR1czsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCit9IHhjYl9ncmFiX3BvaW50ZXJfcmVwbHlfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3VuZ3JhYl9wb2ludGVyLiAqLworI2RlZmluZSBYQ0JfVU5HUkFCX1BPSU5URVIgMjcKKworLyoqCisgKiBAYnJpZWYgeGNiX3VuZ3JhYl9wb2ludGVyX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3VuZ3JhYl9wb2ludGVyX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl90aW1lc3RhbXBfdCB0aW1lOyAvKio8ICAqLworfSB4Y2JfdW5ncmFiX3BvaW50ZXJfcmVxdWVzdF90OworCit0eXBlZGVmIGVudW0geGNiX2J1dHRvbl9pbmRleF90IHsKKyAgICBYQ0JfQlVUVE9OX0lOREVYX0FOWSA9IDAsCisgICAgWENCX0JVVFRPTl9JTkRFWF8xID0gMSwKKyAgICBYQ0JfQlVUVE9OX0lOREVYXzIgPSAyLAorICAgIFhDQl9CVVRUT05fSU5ERVhfMyA9IDMsCisgICAgWENCX0JVVFRPTl9JTkRFWF80ID0gNCwKKyAgICBYQ0JfQlVUVE9OX0lOREVYXzUgPSA1Cit9IHhjYl9idXR0b25faW5kZXhfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2dyYWJfYnV0dG9uLiAqLworI2RlZmluZSBYQ0JfR1JBQl9CVVRUT04gMjgKKworLyoqCisgKiBAYnJpZWYgeGNiX2dyYWJfYnV0dG9uX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dyYWJfYnV0dG9uX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgb3duZXJfZXZlbnRzOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IGdyYWJfd2luZG93OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBldmVudF9tYXNrOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwb2ludGVyX21vZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIGtleWJvYXJkX21vZGU7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IGNvbmZpbmVfdG87IC8qKjwgICovCisgICAgeGNiX2N1cnNvcl90IGN1cnNvcjsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgYnV0dG9uOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBtb2RpZmllcnM7IC8qKjwgICovCit9IHhjYl9ncmFiX2J1dHRvbl9yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl91bmdyYWJfYnV0dG9uLiAqLworI2RlZmluZSBYQ0JfVU5HUkFCX0JVVFRPTiAyOQorCisvKioKKyAqIEBicmllZiB4Y2JfdW5ncmFiX2J1dHRvbl9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl91bmdyYWJfYnV0dG9uX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgYnV0dG9uOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IGdyYWJfd2luZG93OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBtb2RpZmllcnM7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDBbMl07IC8qKjwgICovCit9IHhjYl91bmdyYWJfYnV0dG9uX3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2NoYW5nZV9hY3RpdmVfcG9pbnRlcl9ncmFiLiAqLworI2RlZmluZSBYQ0JfQ0hBTkdFX0FDVElWRV9QT0lOVEVSX0dSQUIgMzAKKworLyoqCisgKiBAYnJpZWYgeGNiX2NoYW5nZV9hY3RpdmVfcG9pbnRlcl9ncmFiX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NoYW5nZV9hY3RpdmVfcG9pbnRlcl9ncmFiX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9jdXJzb3JfdCAgICBjdXJzb3I7IC8qKjwgICovCisgICAgeGNiX3RpbWVzdGFtcF90IHRpbWU7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgIGV2ZW50X21hc2s7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgIHBhZDFbMl07IC8qKjwgICovCit9IHhjYl9jaGFuZ2VfYWN0aXZlX3BvaW50ZXJfZ3JhYl9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9ncmFiX2tleWJvYXJkX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ3JhYl9rZXlib2FyZF9jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfZ3JhYl9rZXlib2FyZF9jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2dyYWJfa2V5Ym9hcmQuICovCisjZGVmaW5lIFhDQl9HUkFCX0tFWUJPQVJEIDMxCisKKy8qKgorICogQGJyaWVmIHhjYl9ncmFiX2tleWJvYXJkX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dyYWJfa2V5Ym9hcmRfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBvd25lcl9ldmVudHM7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgZ3JhYl93aW5kb3c7IC8qKjwgICovCisgICAgeGNiX3RpbWVzdGFtcF90IHRpbWU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgIHBvaW50ZXJfbW9kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICAga2V5Ym9hcmRfbW9kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICAgcGFkMFsyXTsgLyoqPCAgKi8KK30geGNiX2dyYWJfa2V5Ym9hcmRfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ3JhYl9rZXlib2FyZF9yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ3JhYl9rZXlib2FyZF9yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHN0YXR1czsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCit9IHhjYl9ncmFiX2tleWJvYXJkX3JlcGx5X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl91bmdyYWJfa2V5Ym9hcmQuICovCisjZGVmaW5lIFhDQl9VTkdSQUJfS0VZQk9BUkQgMzIKKworLyoqCisgKiBAYnJpZWYgeGNiX3VuZ3JhYl9rZXlib2FyZF9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl91bmdyYWJfa2V5Ym9hcmRfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3RpbWVzdGFtcF90IHRpbWU7IC8qKjwgICovCit9IHhjYl91bmdyYWJfa2V5Ym9hcmRfcmVxdWVzdF90OworCit0eXBlZGVmIGVudW0geGNiX2dyYWJfdCB7CisgICAgWENCX0dSQUJfQU5ZID0gMAorfSB4Y2JfZ3JhYl90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZ3JhYl9rZXkuICovCisjZGVmaW5lIFhDQl9HUkFCX0tFWSAzMworCisvKioKKyAqIEBicmllZiB4Y2JfZ3JhYl9rZXlfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ3JhYl9rZXlfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgIG93bmVyX2V2ZW50czsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgIGdyYWJfd2luZG93OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgbW9kaWZpZXJzOyAvKio8ICAqLworICAgIHhjYl9rZXljb2RlX3Qga2V5OyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgcG9pbnRlcl9tb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAga2V5Ym9hcmRfbW9kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgIHBhZDBbM107IC8qKjwgICovCit9IHhjYl9ncmFiX2tleV9yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl91bmdyYWJfa2V5LiAqLworI2RlZmluZSBYQ0JfVU5HUkFCX0tFWSAzNAorCisvKioKKyAqIEBicmllZiB4Y2JfdW5ncmFiX2tleV9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl91bmdyYWJfa2V5X3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgeGNiX2tleWNvZGVfdCBrZXk7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190ICBncmFiX3dpbmRvdzsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgIG1vZGlmaWVyczsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgIHBhZDBbMl07IC8qKjwgICovCit9IHhjYl91bmdyYWJfa2V5X3JlcXVlc3RfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9hbGxvd190IHsKKyAgICBYQ0JfQUxMT1dfQVNZTkNfUE9JTlRFUiA9IDAsCisgICAgWENCX0FMTE9XX1NZTkNfUE9JTlRFUiA9IDEsCisgICAgWENCX0FMTE9XX1JFUExBWV9QT0lOVEVSID0gMiwKKyAgICBYQ0JfQUxMT1dfQVNZTkNfS0VZQk9BUkQgPSAzLAorICAgIFhDQl9BTExPV19TWU5DX0tFWUJPQVJEID0gNCwKKyAgICBYQ0JfQUxMT1dfUkVQTEFZX0tFWUJPQVJEID0gNSwKKyAgICBYQ0JfQUxMT1dfQVNZTkNfQk9USCA9IDYsCisgICAgWENCX0FMTE9XX1NZTkNfQk9USCA9IDcKK30geGNiX2FsbG93X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9hbGxvd19ldmVudHMuICovCisjZGVmaW5lIFhDQl9BTExPV19FVkVOVFMgMzUKKworLyoqCisgKiBAYnJpZWYgeGNiX2FsbG93X2V2ZW50c19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9hbGxvd19ldmVudHNfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICBtb2RlOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3RpbWVzdGFtcF90IHRpbWU7IC8qKjwgICovCit9IHhjYl9hbGxvd19ldmVudHNfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZ3JhYl9zZXJ2ZXIuICovCisjZGVmaW5lIFhDQl9HUkFCX1NFUlZFUiAzNgorCisvKioKKyAqIEBicmllZiB4Y2JfZ3JhYl9zZXJ2ZXJfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ3JhYl9zZXJ2ZXJfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCit9IHhjYl9ncmFiX3NlcnZlcl9yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl91bmdyYWJfc2VydmVyLiAqLworI2RlZmluZSBYQ0JfVU5HUkFCX1NFUlZFUiAzNworCisvKioKKyAqIEBicmllZiB4Y2JfdW5ncmFiX3NlcnZlcl9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl91bmdyYWJfc2VydmVyX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworfSB4Y2JfdW5ncmFiX3NlcnZlcl9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9xdWVyeV9wb2ludGVyX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfcG9pbnRlcl9jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfcXVlcnlfcG9pbnRlcl9jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3F1ZXJ5X3BvaW50ZXIuICovCisjZGVmaW5lIFhDQl9RVUVSWV9QT0lOVEVSIDM4CisKKy8qKgorICogQGJyaWVmIHhjYl9xdWVyeV9wb2ludGVyX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3F1ZXJ5X3BvaW50ZXJfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHdpbmRvdzsgLyoqPCAgKi8KK30geGNiX3F1ZXJ5X3BvaW50ZXJfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfcXVlcnlfcG9pbnRlcl9yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfcG9pbnRlcl9yZXBseV90IHsKKyAgICB1aW50OF90ICAgICAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgc2FtZV9zY3JlZW47IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IHJvb3Q7IC8qKjwgICovCisgICAgeGNiX3dpbmRvd190IGNoaWxkOyAvKio8ICAqLworICAgIGludDE2X3QgICAgICByb290X3g7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIHJvb3RfeTsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgd2luX3g7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIHdpbl95OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBtYXNrOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwWzJdOyAvKio8ICAqLworfSB4Y2JfcXVlcnlfcG9pbnRlcl9yZXBseV90OworCisvKioKKyAqIEBicmllZiB4Y2JfdGltZWNvb3JkX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl90aW1lY29vcmRfdCB7CisgICAgeGNiX3RpbWVzdGFtcF90IHRpbWU7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgIHg7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgIHk7IC8qKjwgICovCit9IHhjYl90aW1lY29vcmRfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3RpbWVjb29yZF9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfdGltZWNvb3JkX2l0ZXJhdG9yX3QgeworICAgIHhjYl90aW1lY29vcmRfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2JfdGltZWNvb3JkX2l0ZXJhdG9yX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfbW90aW9uX2V2ZW50c19jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9tb3Rpb25fZXZlbnRzX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9nZXRfbW90aW9uX2V2ZW50c19jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2dldF9tb3Rpb25fZXZlbnRzLiAqLworI2RlZmluZSBYQ0JfR0VUX01PVElPTl9FVkVOVFMgMzkKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9tb3Rpb25fZXZlbnRzX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9tb3Rpb25fZXZlbnRzX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCAgICB3aW5kb3c7IC8qKjwgICovCisgICAgeGNiX3RpbWVzdGFtcF90IHN0YXJ0OyAvKio8ICAqLworICAgIHhjYl90aW1lc3RhbXBfdCBzdG9wOyAvKio8ICAqLworfSB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9tb3Rpb25fZXZlbnRzX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDMyX3QgZXZlbnRzX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQxWzIwXTsgLyoqPCAgKi8KK30geGNiX2dldF9tb3Rpb25fZXZlbnRzX3JlcGx5X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl90cmFuc2xhdGVfY29vcmRpbmF0ZXNfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl90cmFuc2xhdGVfY29vcmRpbmF0ZXNfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc19jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlcy4gKi8KKyNkZWZpbmUgWENCX1RSQU5TTEFURV9DT09SRElOQVRFUyA0MAorCisvKioKKyAqIEBicmllZiB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgc3JjX3dpbmRvdzsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgZHN0X3dpbmRvdzsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgc3JjX3g7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIHNyY195OyAvKio8ICAqLworfSB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc19yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBzYW1lX3NjcmVlbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgY2hpbGQ7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIGRzdF94OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICBkc3RfeTsgLyoqPCAgKi8KK30geGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc19yZXBseV90OworCisvKiogT3Bjb2RlIGZvciB4Y2Jfd2FycF9wb2ludGVyLiAqLworI2RlZmluZSBYQ0JfV0FSUF9QT0lOVEVSIDQxCisKKy8qKgorICogQGJyaWVmIHhjYl93YXJwX3BvaW50ZXJfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfd2FycF9wb2ludGVyX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCBzcmNfd2luZG93OyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCBkc3Rfd2luZG93OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICBzcmNfeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgc3JjX3k7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHNyY193aWR0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgc3JjX2hlaWdodDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgZHN0X3g7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIGRzdF95OyAvKio8ICAqLworfSB4Y2Jfd2FycF9wb2ludGVyX3JlcXVlc3RfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9pbnB1dF9mb2N1c190IHsKKyAgICBYQ0JfSU5QVVRfRk9DVVNfTk9ORSA9IDAsCisgICAgWENCX0lOUFVUX0ZPQ1VTX1BPSU5URVJfUk9PVCA9IDEsCisgICAgWENCX0lOUFVUX0ZPQ1VTX1BBUkVOVCA9IDIsCisgICAgWENCX0lOUFVUX0ZPQ1VTX0ZPTExPV19LRVlCT0FSRCA9IDMKK30geGNiX2lucHV0X2ZvY3VzX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9zZXRfaW5wdXRfZm9jdXMuICovCisjZGVmaW5lIFhDQl9TRVRfSU5QVVRfRk9DVVMgNDIKKworLyoqCisgKiBAYnJpZWYgeGNiX3NldF9pbnB1dF9mb2N1c19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zZXRfaW5wdXRfZm9jdXNfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgICByZXZlcnRfdG87IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgICAgZm9jdXM7IC8qKjwgICovCisgICAgeGNiX3RpbWVzdGFtcF90IHRpbWU7IC8qKjwgICovCit9IHhjYl9zZXRfaW5wdXRfZm9jdXNfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X2lucHV0X2ZvY3VzX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2lucHV0X2ZvY3VzX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9nZXRfaW5wdXRfZm9jdXNfY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9nZXRfaW5wdXRfZm9jdXMuICovCisjZGVmaW5lIFhDQl9HRVRfSU5QVVRfRk9DVVMgNDMKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9pbnB1dF9mb2N1c19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfaW5wdXRfZm9jdXNfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCit9IHhjYl9nZXRfaW5wdXRfZm9jdXNfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X2lucHV0X2ZvY3VzX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfaW5wdXRfZm9jdXNfcmVwbHlfdCB7CisgICAgdWludDhfdCAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHJldmVydF90bzsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3QgZm9jdXM7IC8qKjwgICovCit9IHhjYl9nZXRfaW5wdXRfZm9jdXNfcmVwbHlfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3F1ZXJ5X2tleW1hcF9jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3F1ZXJ5X2tleW1hcF9jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfcXVlcnlfa2V5bWFwX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfcXVlcnlfa2V5bWFwLiAqLworI2RlZmluZSBYQ0JfUVVFUllfS0VZTUFQIDQ0CisKKy8qKgorICogQGJyaWVmIHhjYl9xdWVyeV9rZXltYXBfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfa2V5bWFwX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworfSB4Y2JfcXVlcnlfa2V5bWFwX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3F1ZXJ5X2tleW1hcF9yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfa2V5bWFwX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDhfdCAga2V5c1szMl07IC8qKjwgICovCit9IHhjYl9xdWVyeV9rZXltYXBfcmVwbHlfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX29wZW5fZm9udC4gKi8KKyNkZWZpbmUgWENCX09QRU5fRk9OVCA0NQorCisvKioKKyAqIEBicmllZiB4Y2Jfb3Blbl9mb250X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX29wZW5fZm9udF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfZm9udF90IGZpZDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgIG5hbWVfbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgcGFkMVsyXTsgLyoqPCAgKi8KK30geGNiX29wZW5fZm9udF9yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jbG9zZV9mb250LiAqLworI2RlZmluZSBYQ0JfQ0xPU0VfRk9OVCA0NgorCisvKioKKyAqIEBicmllZiB4Y2JfY2xvc2VfZm9udF9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jbG9zZV9mb250X3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9mb250X3QgZm9udDsgLyoqPCAgKi8KK30geGNiX2Nsb3NlX2ZvbnRfcmVxdWVzdF90OworCit0eXBlZGVmIGVudW0geGNiX2ZvbnRfZHJhd190IHsKKyAgICBYQ0JfRk9OVF9EUkFXX0xFRlRfVE9fUklHSFQgPSAwLAorICAgIFhDQl9GT05UX0RSQVdfUklHSFRfVE9fTEVGVCA9IDEKK30geGNiX2ZvbnRfZHJhd190OworCisvKioKKyAqIEBicmllZiB4Y2JfZm9udHByb3BfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2ZvbnRwcm9wX3QgeworICAgIHhjYl9hdG9tX3QgbmFtZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgIHZhbHVlOyAvKio8ICAqLworfSB4Y2JfZm9udHByb3BfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2ZvbnRwcm9wX2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9mb250cHJvcF9pdGVyYXRvcl90IHsKKyAgICB4Y2JfZm9udHByb3BfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX2ZvbnRwcm9wX2l0ZXJhdG9yX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9jaGFyaW5mb190CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY2hhcmluZm9fdCB7CisgICAgaW50MTZfdCAgbGVmdF9zaWRlX2JlYXJpbmc7IC8qKjwgICovCisgICAgaW50MTZfdCAgcmlnaHRfc2lkZV9iZWFyaW5nOyAvKio8ICAqLworICAgIGludDE2X3QgIGNoYXJhY3Rlcl93aWR0aDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICBhc2NlbnQ7IC8qKjwgICovCisgICAgaW50MTZfdCAgZGVzY2VudDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBhdHRyaWJ1dGVzOyAvKio8ICAqLworfSB4Y2JfY2hhcmluZm9fdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2NoYXJpbmZvX2l0ZXJhdG9yX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jaGFyaW5mb19pdGVyYXRvcl90IHsKKyAgICB4Y2JfY2hhcmluZm9fdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICAgcmVtOyAvKio8ICAqLworICAgIGludCAgICAgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX2NoYXJpbmZvX2l0ZXJhdG9yX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9xdWVyeV9mb250X2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfZm9udF9jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfcXVlcnlfZm9udF9jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3F1ZXJ5X2ZvbnQuICovCisjZGVmaW5lIFhDQl9RVUVSWV9GT05UIDQ3CisKKy8qKgorICogQGJyaWVmIHhjYl9xdWVyeV9mb250X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3F1ZXJ5X2ZvbnRfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2ZvbnRhYmxlX3QgZm9udDsgLyoqPCAgKi8KK30geGNiX3F1ZXJ5X2ZvbnRfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfcXVlcnlfZm9udF9yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfZm9udF9yZXBseV90IHsKKyAgICB1aW50OF90ICAgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9jaGFyaW5mb190IG1pbl9ib3VuZHM7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMVs0XTsgLyoqPCAgKi8KKyAgICB4Y2JfY2hhcmluZm9fdCBtYXhfYm91bmRzOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDJbNF07IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbWluX2NoYXJfb3JfYnl0ZTI7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbWF4X2NoYXJfb3JfYnl0ZTI7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgZGVmYXVsdF9jaGFyOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIHByb3BlcnRpZXNfbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIGRyYXdfZGlyZWN0aW9uOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIG1pbl9ieXRlMTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBtYXhfYnl0ZTE7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgYWxsX2NoYXJzX2V4aXN0OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIGZvbnRfYXNjZW50OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIGZvbnRfZGVzY2VudDsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICBjaGFyX2luZm9zX2xlbjsgLyoqPCAgKi8KK30geGNiX3F1ZXJ5X2ZvbnRfcmVwbHlfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfcXVlcnlfdGV4dF9leHRlbnRzLiAqLworI2RlZmluZSBYQ0JfUVVFUllfVEVYVF9FWFRFTlRTIDQ4CisKKy8qKgorICogQGJyaWVmIHhjYl9xdWVyeV90ZXh0X2V4dGVudHNfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIG9kZF9sZW5ndGg7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9mb250YWJsZV90IGZvbnQ7IC8qKjwgICovCit9IHhjYl9xdWVyeV90ZXh0X2V4dGVudHNfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV90ZXh0X2V4dGVudHNfcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBkcmF3X2RpcmVjdGlvbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgaW50MTZfdCAgZm9udF9hc2NlbnQ7IC8qKjwgICovCisgICAgaW50MTZfdCAgZm9udF9kZXNjZW50OyAvKio8ICAqLworICAgIGludDE2X3QgIG92ZXJhbGxfYXNjZW50OyAvKio8ICAqLworICAgIGludDE2X3QgIG92ZXJhbGxfZGVzY2VudDsgLyoqPCAgKi8KKyAgICBpbnQzMl90ICBvdmVyYWxsX3dpZHRoOyAvKio8ICAqLworICAgIGludDMyX3QgIG92ZXJhbGxfbGVmdDsgLyoqPCAgKi8KKyAgICBpbnQzMl90ICBvdmVyYWxsX3JpZ2h0OyAvKio8ICAqLworfSB4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX3JlcGx5X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9zdHJfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3N0cl90IHsKKyAgICB1aW50OF90IG5hbWVfbGVuOyAvKio8ICAqLworfSB4Y2Jfc3RyX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9zdHJfaXRlcmF0b3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3N0cl9pdGVyYXRvcl90IHsKKyAgICB4Y2Jfc3RyX3QgKmRhdGE7IC8qKjwgICovCisgICAgaW50ICAgICAgICByZW07IC8qKjwgICovCisgICAgaW50ICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX3N0cl9pdGVyYXRvcl90OworCisvKioKKyAqIEBicmllZiB4Y2JfbGlzdF9mb250c19jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2xpc3RfZm9udHNfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2xpc3RfZm9udHNfY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9saXN0X2ZvbnRzLiAqLworI2RlZmluZSBYQ0JfTElTVF9GT05UUyA0OQorCisvKioKKyAqIEBicmllZiB4Y2JfbGlzdF9mb250c19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9saXN0X2ZvbnRzX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQxNl90IG1heF9uYW1lczsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBwYXR0ZXJuX2xlbjsgLyoqPCAgKi8KK30geGNiX2xpc3RfZm9udHNfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfbGlzdF9mb250c19yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfbGlzdF9mb250c19yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQxNl90IG5hbWVzX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQxWzIyXTsgLyoqPCAgKi8KK30geGNiX2xpc3RfZm9udHNfcmVwbHlfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfbGlzdF9mb250c193aXRoX2luZm8uICovCisjZGVmaW5lIFhDQl9MSVNUX0ZPTlRTX1dJVEhfSU5GTyA1MAorCisvKioKKyAqIEBicmllZiB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDE2X3QgbWF4X25hbWVzOyAvKio8ICAqLworICAgIHVpbnQxNl90IHBhdHRlcm5fbGVuOyAvKio8ICAqLworfSB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgICAgICAgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgbmFtZV9sZW47IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9jaGFyaW5mb190IG1pbl9ib3VuZHM7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMFs0XTsgLyoqPCAgKi8KKyAgICB4Y2JfY2hhcmluZm9fdCBtYXhfYm91bmRzOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDFbNF07IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbWluX2NoYXJfb3JfYnl0ZTI7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbWF4X2NoYXJfb3JfYnl0ZTI7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgZGVmYXVsdF9jaGFyOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIHByb3BlcnRpZXNfbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIGRyYXdfZGlyZWN0aW9uOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIG1pbl9ieXRlMTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBtYXhfYnl0ZTE7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgYWxsX2NoYXJzX2V4aXN0OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIGZvbnRfYXNjZW50OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIGZvbnRfZGVzY2VudDsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICByZXBsaWVzX2hpbnQ7IC8qKjwgICovCit9IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXBseV90OworCisvKiogT3Bjb2RlIGZvciB4Y2Jfc2V0X2ZvbnRfcGF0aC4gKi8KKyNkZWZpbmUgWENCX1NFVF9GT05UX1BBVEggNTEKKworLyoqCisgKiBAYnJpZWYgeGNiX3NldF9mb250X3BhdGhfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc2V0X2ZvbnRfcGF0aF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBmb250X3F0eTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQxWzJdOyAvKio8ICAqLworfSB4Y2Jfc2V0X2ZvbnRfcGF0aF9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfZm9udF9wYXRoX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2ZvbnRfcGF0aF9jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfZ2V0X2ZvbnRfcGF0aF9jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2dldF9mb250X3BhdGguICovCisjZGVmaW5lIFhDQl9HRVRfRk9OVF9QQVRIIDUyCisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfZm9udF9wYXRoX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9mb250X3BhdGhfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCit9IHhjYl9nZXRfZm9udF9wYXRoX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9mb250X3BhdGhfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9mb250X3BhdGhfcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBwYXRoX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQxWzIyXTsgLyoqPCAgKi8KK30geGNiX2dldF9mb250X3BhdGhfcmVwbHlfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2NyZWF0ZV9waXhtYXAuICovCisjZGVmaW5lIFhDQl9DUkVBVEVfUElYTUFQIDUzCisKKy8qKgorICogQGJyaWVmIHhjYl9jcmVhdGVfcGl4bWFwX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NyZWF0ZV9waXhtYXBfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgZGVwdGg7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9waXhtYXBfdCAgIHBpZDsgLyoqPCAgKi8KKyAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICB3aWR0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBoZWlnaHQ7IC8qKjwgICovCit9IHhjYl9jcmVhdGVfcGl4bWFwX3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2ZyZWVfcGl4bWFwLiAqLworI2RlZmluZSBYQ0JfRlJFRV9QSVhNQVAgNTQKKworLyoqCisgKiBAYnJpZWYgeGNiX2ZyZWVfcGl4bWFwX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2ZyZWVfcGl4bWFwX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9waXhtYXBfdCBwaXhtYXA7IC8qKjwgICovCit9IHhjYl9mcmVlX3BpeG1hcF9yZXF1ZXN0X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfZ2NfdCB7CisgICAgWENCX0dDX0ZVTkNUSU9OID0gMSwKKyAgICBYQ0JfR0NfUExBTkVfTUFTSyA9IDIsCisgICAgWENCX0dDX0ZPUkVHUk9VTkQgPSA0LAorICAgIFhDQl9HQ19CQUNLR1JPVU5EID0gOCwKKyAgICBYQ0JfR0NfTElORV9XSURUSCA9IDE2LAorICAgIFhDQl9HQ19MSU5FX1NUWUxFID0gMzIsCisgICAgWENCX0dDX0NBUF9TVFlMRSA9IDY0LAorICAgIFhDQl9HQ19KT0lOX1NUWUxFID0gMTI4LAorICAgIFhDQl9HQ19GSUxMX1NUWUxFID0gMjU2LAorICAgIFhDQl9HQ19GSUxMX1JVTEUgPSA1MTIsCisgICAgWENCX0dDX1RJTEUgPSAxMDI0LAorICAgIFhDQl9HQ19TVElQUExFID0gMjA0OCwKKyAgICBYQ0JfR0NfVElMRV9TVElQUExFX09SSUdJTl9YID0gNDA5NiwKKyAgICBYQ0JfR0NfVElMRV9TVElQUExFX09SSUdJTl9ZID0gODE5MiwKKyAgICBYQ0JfR0NfRk9OVCA9IDE2Mzg0LAorICAgIFhDQl9HQ19TVUJXSU5ET1dfTU9ERSA9IDMyNzY4LAorICAgIFhDQl9HQ19HUkFQSElDU19FWFBPU1VSRVMgPSA2NTUzNiwKKyAgICBYQ0JfR0NfQ0xJUF9PUklHSU5fWCA9IDEzMTA3MiwKKyAgICBYQ0JfR0NfQ0xJUF9PUklHSU5fWSA9IDI2MjE0NCwKKyAgICBYQ0JfR0NfQ0xJUF9NQVNLID0gNTI0Mjg4LAorICAgIFhDQl9HQ19EQVNIX09GRlNFVCA9IDEwNDg1NzYsCisgICAgWENCX0dDX0RBU0hfTElTVCA9IDIwOTcxNTIsCisgICAgWENCX0dDX0FSQ19NT0RFID0gNDE5NDMwNAorfSB4Y2JfZ2NfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9neF90IHsKKyAgICBYQ0JfR1hfQ0xFQVIgPSAwLAorICAgIFhDQl9HWF9BTkQgPSAxLAorICAgIFhDQl9HWF9BTkRfUkVWRVJTRSA9IDIsCisgICAgWENCX0dYX0NPUFkgPSAzLAorICAgIFhDQl9HWF9BTkRfSU5WRVJURUQgPSA0LAorICAgIFhDQl9HWF9OT09QID0gNSwKKyAgICBYQ0JfR1hfWE9SID0gNiwKKyAgICBYQ0JfR1hfT1IgPSA3LAorICAgIFhDQl9HWF9OT1IgPSA4LAorICAgIFhDQl9HWF9FUVVJViA9IDksCisgICAgWENCX0dYX0lOVkVSVCA9IDEwLAorICAgIFhDQl9HWF9PUl9SRVZFUlNFID0gMTEsCisgICAgWENCX0dYX0NPUFlfSU5WRVJURUQgPSAxMiwKKyAgICBYQ0JfR1hfT1JfSU5WRVJURUQgPSAxMywKKyAgICBYQ0JfR1hfTkFORCA9IDE0LAorICAgIFhDQl9HWF9TRVQgPSAxNQorfSB4Y2JfZ3hfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9saW5lX3N0eWxlX3QgeworICAgIFhDQl9MSU5FX1NUWUxFX1NPTElEID0gMCwKKyAgICBYQ0JfTElORV9TVFlMRV9PTl9PRkZfREFTSCA9IDEsCisgICAgWENCX0xJTkVfU1RZTEVfRE9VQkxFX0RBU0ggPSAyCit9IHhjYl9saW5lX3N0eWxlX3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfY2FwX3N0eWxlX3QgeworICAgIFhDQl9DQVBfU1RZTEVfTk9UX0xBU1QgPSAwLAorICAgIFhDQl9DQVBfU1RZTEVfQlVUVCA9IDEsCisgICAgWENCX0NBUF9TVFlMRV9ST1VORCA9IDIsCisgICAgWENCX0NBUF9TVFlMRV9QUk9KRUNUSU5HID0gMworfSB4Y2JfY2FwX3N0eWxlX3Q7CisKK3R5cGVkZWYgZW51bSB4Y2Jfam9pbl9zdHlsZV90IHsKKyAgICBYQ0JfSk9JTl9TVFlMRV9NSVRFUiA9IDAsCisgICAgWENCX0pPSU5fU1RZTEVfUk9VTkQgPSAxLAorICAgIFhDQl9KT0lOX1NUWUxFX0JFVkVMID0gMgorfSB4Y2Jfam9pbl9zdHlsZV90OworCit0eXBlZGVmIGVudW0geGNiX2ZpbGxfc3R5bGVfdCB7CisgICAgWENCX0ZJTExfU1RZTEVfU09MSUQgPSAwLAorICAgIFhDQl9GSUxMX1NUWUxFX1RJTEVEID0gMSwKKyAgICBYQ0JfRklMTF9TVFlMRV9TVElQUExFRCA9IDIsCisgICAgWENCX0ZJTExfU1RZTEVfT1BBUVVFX1NUSVBQTEVEID0gMworfSB4Y2JfZmlsbF9zdHlsZV90OworCit0eXBlZGVmIGVudW0geGNiX2ZpbGxfcnVsZV90IHsKKyAgICBYQ0JfRklMTF9SVUxFX0VWRU5fT0REID0gMCwKKyAgICBYQ0JfRklMTF9SVUxFX1dJTkRJTkcgPSAxCit9IHhjYl9maWxsX3J1bGVfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9zdWJ3aW5kb3dfbW9kZV90IHsKKyAgICBYQ0JfU1VCV0lORE9XX01PREVfQ0xJUF9CWV9DSElMRFJFTiA9IDAsCisgICAgWENCX1NVQldJTkRPV19NT0RFX0lOQ0xVREVfSU5GRVJJT1JTID0gMQorfSB4Y2Jfc3Vid2luZG93X21vZGVfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9hcmNfbW9kZV90IHsKKyAgICBYQ0JfQVJDX01PREVfQ0hPUkQgPSAwLAorICAgIFhDQl9BUkNfTU9ERV9QSUVfU0xJQ0UgPSAxCit9IHhjYl9hcmNfbW9kZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY3JlYXRlX2djLiAqLworI2RlZmluZSBYQ0JfQ1JFQVRFX0dDIDU1CisKKy8qKgorICogQGJyaWVmIHhjYl9jcmVhdGVfZ2NfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY3JlYXRlX2djX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9nY29udGV4dF90IGNpZDsgLyoqPCAgKi8KKyAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICB2YWx1ZV9tYXNrOyAvKio8ICAqLworfSB4Y2JfY3JlYXRlX2djX3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2NoYW5nZV9nYy4gKi8KKyNkZWZpbmUgWENCX0NIQU5HRV9HQyA1NgorCisvKioKKyAqIEBicmllZiB4Y2JfY2hhbmdlX2djX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NoYW5nZV9nY19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfZ2NvbnRleHRfdCBnYzsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICB2YWx1ZV9tYXNrOyAvKio8ICAqLworfSB4Y2JfY2hhbmdlX2djX3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2NvcHlfZ2MuICovCisjZGVmaW5lIFhDQl9DT1BZX0dDIDU3CisKKy8qKgorICogQGJyaWVmIHhjYl9jb3B5X2djX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NvcHlfZ2NfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2djb250ZXh0X3Qgc3JjX2djOyAvKio8ICAqLworICAgIHhjYl9nY29udGV4dF90IGRzdF9nYzsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICB2YWx1ZV9tYXNrOyAvKio8ICAqLworfSB4Y2JfY29weV9nY19yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9zZXRfZGFzaGVzLiAqLworI2RlZmluZSBYQ0JfU0VUX0RBU0hFUyA1OAorCisvKioKKyAqIEBicmllZiB4Y2Jfc2V0X2Rhc2hlc19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zZXRfZGFzaGVzX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9nY29udGV4dF90IGdjOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGRhc2hfb2Zmc2V0OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGRhc2hlc19sZW47IC8qKjwgICovCit9IHhjYl9zZXRfZGFzaGVzX3JlcXVlc3RfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9jbGlwX29yZGVyaW5nX3QgeworICAgIFhDQl9DTElQX09SREVSSU5HX1VOU09SVEVEID0gMCwKKyAgICBYQ0JfQ0xJUF9PUkRFUklOR19ZX1NPUlRFRCA9IDEsCisgICAgWENCX0NMSVBfT1JERVJJTkdfWVhfU09SVEVEID0gMiwKKyAgICBYQ0JfQ0xJUF9PUkRFUklOR19ZWF9CQU5ERUQgPSAzCit9IHhjYl9jbGlwX29yZGVyaW5nX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9zZXRfY2xpcF9yZWN0YW5nbGVzLiAqLworI2RlZmluZSBYQ0JfU0VUX0NMSVBfUkVDVEFOR0xFUyA1OQorCisvKioKKyAqIEBicmllZiB4Y2Jfc2V0X2NsaXBfcmVjdGFuZ2xlc19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zZXRfY2xpcF9yZWN0YW5nbGVzX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIG9yZGVyaW5nOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfZ2NvbnRleHRfdCBnYzsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICBjbGlwX3hfb3JpZ2luOyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIGNsaXBfeV9vcmlnaW47IC8qKjwgICovCit9IHhjYl9zZXRfY2xpcF9yZWN0YW5nbGVzX3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2ZyZWVfZ2MuICovCisjZGVmaW5lIFhDQl9GUkVFX0dDIDYwCisKKy8qKgorICogQGJyaWVmIHhjYl9mcmVlX2djX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2ZyZWVfZ2NfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2djb250ZXh0X3QgZ2M7IC8qKjwgICovCit9IHhjYl9mcmVlX2djX3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2NsZWFyX2FyZWEuICovCisjZGVmaW5lIFhDQl9DTEVBUl9BUkVBIDYxCisKKy8qKgorICogQGJyaWVmIHhjYl9jbGVhcl9hcmVhX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NsZWFyX2FyZWFfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBleHBvc3VyZXM7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICB4OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICB5OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICB3aWR0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgaGVpZ2h0OyAvKio8ICAqLworfSB4Y2JfY2xlYXJfYXJlYV9yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jb3B5X2FyZWEuICovCisjZGVmaW5lIFhDQl9DT1BZX0FSRUEgNjIKKworLyoqCisgKiBAYnJpZWYgeGNiX2NvcHlfYXJlYV9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jb3B5X2FyZWFfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2RyYXdhYmxlX3Qgc3JjX2RyYXdhYmxlOyAvKio8ICAqLworICAgIHhjYl9kcmF3YWJsZV90IGRzdF9kcmF3YWJsZTsgLyoqPCAgKi8KKyAgICB4Y2JfZ2NvbnRleHRfdCBnYzsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICBzcmNfeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICBzcmNfeTsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICBkc3RfeDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICBkc3RfeTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICB3aWR0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBoZWlnaHQ7IC8qKjwgICovCit9IHhjYl9jb3B5X2FyZWFfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY29weV9wbGFuZS4gKi8KKyNkZWZpbmUgWENCX0NPUFlfUExBTkUgNjMKKworLyoqCisgKiBAYnJpZWYgeGNiX2NvcHlfcGxhbmVfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY29weV9wbGFuZV9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfZHJhd2FibGVfdCBzcmNfZHJhd2FibGU7IC8qKjwgICovCisgICAgeGNiX2RyYXdhYmxlX3QgZHN0X2RyYXdhYmxlOyAvKio8ICAqLworICAgIHhjYl9nY29udGV4dF90IGdjOyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIHNyY194OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIHNyY195OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIGRzdF94OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIGRzdF95OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIHdpZHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGhlaWdodDsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCAgICAgICBiaXRfcGxhbmU7IC8qKjwgICovCit9IHhjYl9jb3B5X3BsYW5lX3JlcXVlc3RfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9jb29yZF9tb2RlX3QgeworICAgIFhDQl9DT09SRF9NT0RFX09SSUdJTiA9IDAsCisgICAgWENCX0NPT1JEX01PREVfUFJFVklPVVMgPSAxCit9IHhjYl9jb29yZF9tb2RlX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9wb2x5X3BvaW50LiAqLworI2RlZmluZSBYQ0JfUE9MWV9QT0lOVCA2NAorCisvKioKKyAqIEBicmllZiB4Y2JfcG9seV9wb2ludF9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9wb2x5X3BvaW50X3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIGNvb3JkaW5hdGVfbW9kZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2RyYXdhYmxlX3QgZHJhd2FibGU7IC8qKjwgICovCisgICAgeGNiX2djb250ZXh0X3QgZ2M7IC8qKjwgICovCit9IHhjYl9wb2x5X3BvaW50X3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3BvbHlfbGluZS4gKi8KKyNkZWZpbmUgWENCX1BPTFlfTElORSA2NQorCisvKioKKyAqIEBicmllZiB4Y2JfcG9seV9saW5lX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3BvbHlfbGluZV9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBjb29yZGluYXRlX21vZGU7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlOyAvKio8ICAqLworICAgIHhjYl9nY29udGV4dF90IGdjOyAvKio8ICAqLworfSB4Y2JfcG9seV9saW5lX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3NlZ21lbnRfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3NlZ21lbnRfdCB7CisgICAgaW50MTZfdCB4MTsgLyoqPCAgKi8KKyAgICBpbnQxNl90IHkxOyAvKio8ICAqLworICAgIGludDE2X3QgeDI7IC8qKjwgICovCisgICAgaW50MTZfdCB5MjsgLyoqPCAgKi8KK30geGNiX3NlZ21lbnRfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3NlZ21lbnRfaXRlcmF0b3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3NlZ21lbnRfaXRlcmF0b3JfdCB7CisgICAgeGNiX3NlZ21lbnRfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICAgICByZW07IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl9zZWdtZW50X2l0ZXJhdG9yX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9wb2x5X3NlZ21lbnQuICovCisjZGVmaW5lIFhDQl9QT0xZX1NFR01FTlQgNjYKKworLyoqCisgKiBAYnJpZWYgeGNiX3BvbHlfc2VnbWVudF9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9wb2x5X3NlZ21lbnRfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2RyYXdhYmxlX3QgZHJhd2FibGU7IC8qKjwgICovCisgICAgeGNiX2djb250ZXh0X3QgZ2M7IC8qKjwgICovCit9IHhjYl9wb2x5X3NlZ21lbnRfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfcG9seV9yZWN0YW5nbGUuICovCisjZGVmaW5lIFhDQl9QT0xZX1JFQ1RBTkdMRSA2NworCisvKioKKyAqIEBicmllZiB4Y2JfcG9seV9yZWN0YW5nbGVfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcG9seV9yZWN0YW5nbGVfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2RyYXdhYmxlX3QgZHJhd2FibGU7IC8qKjwgICovCisgICAgeGNiX2djb250ZXh0X3QgZ2M7IC8qKjwgICovCit9IHhjYl9wb2x5X3JlY3RhbmdsZV9yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9wb2x5X2FyYy4gKi8KKyNkZWZpbmUgWENCX1BPTFlfQVJDIDY4CisKKy8qKgorICogQGJyaWVmIHhjYl9wb2x5X2FyY19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9wb2x5X2FyY19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgLyoqPCAgKi8KKyAgICB4Y2JfZ2NvbnRleHRfdCBnYzsgLyoqPCAgKi8KK30geGNiX3BvbHlfYXJjX3JlcXVlc3RfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9wb2x5X3NoYXBlX3QgeworICAgIFhDQl9QT0xZX1NIQVBFX0NPTVBMRVggPSAwLAorICAgIFhDQl9QT0xZX1NIQVBFX05PTkNPTlZFWCA9IDEsCisgICAgWENCX1BPTFlfU0hBUEVfQ09OVkVYID0gMgorfSB4Y2JfcG9seV9zaGFwZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZmlsbF9wb2x5LiAqLworI2RlZmluZSBYQ0JfRklMTF9QT0xZIDY5CisKKy8qKgorICogQGJyaWVmIHhjYl9maWxsX3BvbHlfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZmlsbF9wb2x5X3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlOyAvKio8ICAqLworICAgIHhjYl9nY29udGV4dF90IGdjOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHNoYXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIGNvb3JkaW5hdGVfbW9kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQxWzJdOyAvKio8ICAqLworfSB4Y2JfZmlsbF9wb2x5X3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3BvbHlfZmlsbF9yZWN0YW5nbGUuICovCisjZGVmaW5lIFhDQl9QT0xZX0ZJTExfUkVDVEFOR0xFIDcwCisKKy8qKgorICogQGJyaWVmIHhjYl9wb2x5X2ZpbGxfcmVjdGFuZ2xlX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3BvbHlfZmlsbF9yZWN0YW5nbGVfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2RyYXdhYmxlX3QgZHJhd2FibGU7IC8qKjwgICovCisgICAgeGNiX2djb250ZXh0X3QgZ2M7IC8qKjwgICovCit9IHhjYl9wb2x5X2ZpbGxfcmVjdGFuZ2xlX3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3BvbHlfZmlsbF9hcmMuICovCisjZGVmaW5lIFhDQl9QT0xZX0ZJTExfQVJDIDcxCisKKy8qKgorICogQGJyaWVmIHhjYl9wb2x5X2ZpbGxfYXJjX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3BvbHlfZmlsbF9hcmNfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2RyYXdhYmxlX3QgZHJhd2FibGU7IC8qKjwgICovCisgICAgeGNiX2djb250ZXh0X3QgZ2M7IC8qKjwgICovCit9IHhjYl9wb2x5X2ZpbGxfYXJjX3JlcXVlc3RfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9pbWFnZV9mb3JtYXRfdCB7CisgICAgWENCX0lNQUdFX0ZPUk1BVF9YWV9CSVRNQVAgPSAwLAorICAgIFhDQl9JTUFHRV9GT1JNQVRfWFlfUElYTUFQID0gMSwKKyAgICBYQ0JfSU1BR0VfRk9STUFUX1pfUElYTUFQID0gMgorfSB4Y2JfaW1hZ2VfZm9ybWF0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9wdXRfaW1hZ2UuICovCisjZGVmaW5lIFhDQl9QVVRfSU1BR0UgNzIKKworLyoqCisgKiBAYnJpZWYgeGNiX3B1dF9pbWFnZV9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9wdXRfaW1hZ2VfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgZm9ybWF0OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgLyoqPCAgKi8KKyAgICB4Y2JfZ2NvbnRleHRfdCBnYzsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICB3aWR0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBoZWlnaHQ7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgZHN0X3g7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgZHN0X3k7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgbGVmdF9wYWQ7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgZGVwdGg7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMFsyXTsgLyoqPCAgKi8KK30geGNiX3B1dF9pbWFnZV9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfaW1hZ2VfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfaW1hZ2VfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2dldF9pbWFnZV9jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2dldF9pbWFnZS4gKi8KKyNkZWZpbmUgWENCX0dFVF9JTUFHRSA3MworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X2ltYWdlX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9pbWFnZV9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBmb3JtYXQ7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlOyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIHg7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgeTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICB3aWR0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBoZWlnaHQ7IC8qKjwgICovCisgICAgdWludDMyX3QgICAgICAgcGxhbmVfbWFzazsgLyoqPCAgKi8KK30geGNiX2dldF9pbWFnZV9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfaW1hZ2VfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9pbWFnZV9yZXBseV90IHsKKyAgICB1aW50OF90ICAgICAgICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIGRlcHRoOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfdmlzdWFsaWRfdCB2aXN1YWw7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMFsyMF07IC8qKjwgICovCit9IHhjYl9nZXRfaW1hZ2VfcmVwbHlfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3BvbHlfdGV4dF84LiAqLworI2RlZmluZSBYQ0JfUE9MWV9URVhUXzggNzQKKworLyoqCisgKiBAYnJpZWYgeGNiX3BvbHlfdGV4dF84X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3BvbHlfdGV4dF84X3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlOyAvKio8ICAqLworICAgIHhjYl9nY29udGV4dF90IGdjOyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIHg7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgeTsgLyoqPCAgKi8KK30geGNiX3BvbHlfdGV4dF84X3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3BvbHlfdGV4dF8xNi4gKi8KKyNkZWZpbmUgWENCX1BPTFlfVEVYVF8xNiA3NQorCisvKioKKyAqIEBicmllZiB4Y2JfcG9seV90ZXh0XzE2X3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3BvbHlfdGV4dF8xNl9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgLyoqPCAgKi8KKyAgICB4Y2JfZ2NvbnRleHRfdCBnYzsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICAgICAgICB4OyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIHk7IC8qKjwgICovCit9IHhjYl9wb2x5X3RleHRfMTZfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfaW1hZ2VfdGV4dF84LiAqLworI2RlZmluZSBYQ0JfSU1BR0VfVEVYVF84IDc2CisKKy8qKgorICogQGJyaWVmIHhjYl9pbWFnZV90ZXh0XzhfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfaW1hZ2VfdGV4dF84X3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHN0cmluZ19sZW47IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlOyAvKio8ICAqLworICAgIHhjYl9nY29udGV4dF90IGdjOyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIHg7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgeTsgLyoqPCAgKi8KK30geGNiX2ltYWdlX3RleHRfOF9yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9pbWFnZV90ZXh0XzE2LiAqLworI2RlZmluZSBYQ0JfSU1BR0VfVEVYVF8xNiA3NworCisvKioKKyAqIEBicmllZiB4Y2JfaW1hZ2VfdGV4dF8xNl9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9pbWFnZV90ZXh0XzE2X3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHN0cmluZ19sZW47IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9kcmF3YWJsZV90IGRyYXdhYmxlOyAvKio8ICAqLworICAgIHhjYl9nY29udGV4dF90IGdjOyAvKio8ICAqLworICAgIGludDE2X3QgICAgICAgIHg7IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgICAgeTsgLyoqPCAgKi8KK30geGNiX2ltYWdlX3RleHRfMTZfcmVxdWVzdF90OworCit0eXBlZGVmIGVudW0geGNiX2NvbG9ybWFwX2FsbG9jX3QgeworICAgIFhDQl9DT0xPUk1BUF9BTExPQ19OT05FID0gMCwKKyAgICBYQ0JfQ09MT1JNQVBfQUxMT0NfQUxMID0gMQorfSB4Y2JfY29sb3JtYXBfYWxsb2NfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2NyZWF0ZV9jb2xvcm1hcC4gKi8KKyNkZWZpbmUgWENCX0NSRUFURV9DT0xPUk1BUCA3OAorCisvKioKKyAqIEBicmllZiB4Y2JfY3JlYXRlX2NvbG9ybWFwX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NyZWF0ZV9jb2xvcm1hcF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBhbGxvYzsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2NvbG9ybWFwX3QgbWlkOyAvKio8ICAqLworICAgIHhjYl93aW5kb3dfdCAgIHdpbmRvdzsgLyoqPCAgKi8KKyAgICB4Y2JfdmlzdWFsaWRfdCB2aXN1YWw7IC8qKjwgICovCit9IHhjYl9jcmVhdGVfY29sb3JtYXBfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZnJlZV9jb2xvcm1hcC4gKi8KKyNkZWZpbmUgWENCX0ZSRUVfQ09MT1JNQVAgNzkKKworLyoqCisgKiBAYnJpZWYgeGNiX2ZyZWVfY29sb3JtYXBfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZnJlZV9jb2xvcm1hcF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfY29sb3JtYXBfdCBjbWFwOyAvKio8ICAqLworfSB4Y2JfZnJlZV9jb2xvcm1hcF9yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jb3B5X2NvbG9ybWFwX2FuZF9mcmVlLiAqLworI2RlZmluZSBYQ0JfQ09QWV9DT0xPUk1BUF9BTkRfRlJFRSA4MAorCisvKioKKyAqIEBicmllZiB4Y2JfY29weV9jb2xvcm1hcF9hbmRfZnJlZV9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jb3B5X2NvbG9ybWFwX2FuZF9mcmVlX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9jb2xvcm1hcF90IG1pZDsgLyoqPCAgKi8KKyAgICB4Y2JfY29sb3JtYXBfdCBzcmNfY21hcDsgLyoqPCAgKi8KK30geGNiX2NvcHlfY29sb3JtYXBfYW5kX2ZyZWVfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfaW5zdGFsbF9jb2xvcm1hcC4gKi8KKyNkZWZpbmUgWENCX0lOU1RBTExfQ09MT1JNQVAgODEKKworLyoqCisgKiBAYnJpZWYgeGNiX2luc3RhbGxfY29sb3JtYXBfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfaW5zdGFsbF9jb2xvcm1hcF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfY29sb3JtYXBfdCBjbWFwOyAvKio8ICAqLworfSB4Y2JfaW5zdGFsbF9jb2xvcm1hcF9yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl91bmluc3RhbGxfY29sb3JtYXAuICovCisjZGVmaW5lIFhDQl9VTklOU1RBTExfQ09MT1JNQVAgODIKKworLyoqCisgKiBAYnJpZWYgeGNiX3VuaW5zdGFsbF9jb2xvcm1hcF9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl91bmluc3RhbGxfY29sb3JtYXBfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2NvbG9ybWFwX3QgY21hcDsgLyoqPCAgKi8KK30geGNiX3VuaW5zdGFsbF9jb2xvcm1hcF9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwcy4gKi8KKyNkZWZpbmUgWENCX0xJU1RfSU5TVEFMTEVEX0NPTE9STUFQUyA4MworCisvKioKKyAqIEBicmllZiB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworfSB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDE2X3QgY21hcHNfbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDFbMjJdOyAvKio8ICAqLworfSB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3JlcGx5X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9hbGxvY19jb2xvcl9jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2FsbG9jX2NvbG9yX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9hbGxvY19jb2xvcl9jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2FsbG9jX2NvbG9yLiAqLworI2RlZmluZSBYQ0JfQUxMT0NfQ09MT1IgODQKKworLyoqCisgKiBAYnJpZWYgeGNiX2FsbG9jX2NvbG9yX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2FsbG9jX2NvbG9yX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9jb2xvcm1hcF90IGNtYXA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgcmVkOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGdyZWVuOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGJsdWU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMVsyXTsgLyoqPCAgKi8KK30geGNiX2FsbG9jX2NvbG9yX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2FsbG9jX2NvbG9yX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9hbGxvY19jb2xvcl9yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQxNl90IHJlZDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBncmVlbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBibHVlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDFbMl07IC8qKjwgICovCisgICAgdWludDMyX3QgcGl4ZWw7IC8qKjwgICovCit9IHhjYl9hbGxvY19jb2xvcl9yZXBseV90OworCisvKioKKyAqIEBicmllZiB4Y2JfYWxsb2NfbmFtZWRfY29sb3JfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9hbGxvY19uYW1lZF9jb2xvcl9jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfYWxsb2NfbmFtZWRfY29sb3JfY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9hbGxvY19uYW1lZF9jb2xvci4gKi8KKyNkZWZpbmUgWENCX0FMTE9DX05BTUVEX0NPTE9SIDg1CisKKy8qKgorICogQGJyaWVmIHhjYl9hbGxvY19uYW1lZF9jb2xvcl9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9hbGxvY19uYW1lZF9jb2xvcl9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfY29sb3JtYXBfdCBjbWFwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIG5hbWVfbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDFbMl07IC8qKjwgICovCit9IHhjYl9hbGxvY19uYW1lZF9jb2xvcl9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9hbGxvY19uYW1lZF9jb2xvcl9yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfYWxsb2NfbmFtZWRfY29sb3JfcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBwaXhlbDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBleGFjdF9yZWQ7IC8qKjwgICovCisgICAgdWludDE2X3QgZXhhY3RfZ3JlZW47IC8qKjwgICovCisgICAgdWludDE2X3QgZXhhY3RfYmx1ZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCB2aXN1YWxfcmVkOyAvKio8ICAqLworICAgIHVpbnQxNl90IHZpc3VhbF9ncmVlbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCB2aXN1YWxfYmx1ZTsgLyoqPCAgKi8KK30geGNiX2FsbG9jX25hbWVkX2NvbG9yX3JlcGx5X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9hbGxvY19jb2xvcl9jZWxsc19jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9hbGxvY19jb2xvcl9jZWxsc19jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2FsbG9jX2NvbG9yX2NlbGxzLiAqLworI2RlZmluZSBYQ0JfQUxMT0NfQ09MT1JfQ0VMTFMgODYKKworLyoqCisgKiBAYnJpZWYgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIGNvbnRpZ3VvdXM7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9jb2xvcm1hcF90IGNtYXA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgY29sb3JzOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIHBsYW5lczsgLyoqPCAgKi8KK30geGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9hbGxvY19jb2xvcl9jZWxsc19yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQxNl90IHBpeGVsc19sZW47IC8qKjwgICovCisgICAgdWludDE2X3QgbWFza3NfbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDFbMjBdOyAvKio8ICAqLworfSB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVwbHlfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2FsbG9jX2NvbG9yX3BsYW5lc19jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2FsbG9jX2NvbG9yX3BsYW5lc19jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzLiAqLworI2RlZmluZSBYQ0JfQUxMT0NfQ09MT1JfUExBTkVTIDg3CisKKy8qKgorICogQGJyaWVmIHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIGNvbnRpZ3VvdXM7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9jb2xvcm1hcF90IGNtYXA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgY29sb3JzOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIHJlZHM7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgZ3JlZW5zOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGJsdWVzOyAvKio8ICAqLworfSB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2FsbG9jX2NvbG9yX3BsYW5lc19yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDE2X3QgcGl4ZWxzX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQxWzJdOyAvKio8ICAqLworICAgIHVpbnQzMl90IHJlZF9tYXNrOyAvKio8ICAqLworICAgIHVpbnQzMl90IGdyZWVuX21hc2s7IC8qKjwgICovCisgICAgdWludDMyX3QgYmx1ZV9tYXNrOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDJbOF07IC8qKjwgICovCit9IHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfcmVwbHlfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2ZyZWVfY29sb3JzLiAqLworI2RlZmluZSBYQ0JfRlJFRV9DT0xPUlMgODgKKworLyoqCisgKiBAYnJpZWYgeGNiX2ZyZWVfY29sb3JzX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2ZyZWVfY29sb3JzX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9jb2xvcm1hcF90IGNtYXA7IC8qKjwgICovCisgICAgdWludDMyX3QgICAgICAgcGxhbmVfbWFzazsgLyoqPCAgKi8KK30geGNiX2ZyZWVfY29sb3JzX3JlcXVlc3RfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9jb2xvcl9mbGFnX3QgeworICAgIFhDQl9DT0xPUl9GTEFHX1JFRCA9IDEsCisgICAgWENCX0NPTE9SX0ZMQUdfR1JFRU4gPSAyLAorICAgIFhDQl9DT0xPUl9GTEFHX0JMVUUgPSA0Cit9IHhjYl9jb2xvcl9mbGFnX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9jb2xvcml0ZW1fdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NvbG9yaXRlbV90IHsKKyAgICB1aW50MzJfdCBwaXhlbDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCByZWQ7IC8qKjwgICovCisgICAgdWludDE2X3QgZ3JlZW47IC8qKjwgICovCisgICAgdWludDE2X3QgYmx1ZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBmbGFnczsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworfSB4Y2JfY29sb3JpdGVtX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9jb2xvcml0ZW1faXRlcmF0b3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2NvbG9yaXRlbV9pdGVyYXRvcl90IHsKKyAgICB4Y2JfY29sb3JpdGVtX3QgKmRhdGE7IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICAgICByZW07IC8qKjwgICovCisgICAgaW50ICAgICAgICAgICAgICBpbmRleDsgLyoqPCAgKi8KK30geGNiX2NvbG9yaXRlbV9pdGVyYXRvcl90OworCisvKiogT3Bjb2RlIGZvciB4Y2Jfc3RvcmVfY29sb3JzLiAqLworI2RlZmluZSBYQ0JfU1RPUkVfQ09MT1JTIDg5CisKKy8qKgorICogQGJyaWVmIHhjYl9zdG9yZV9jb2xvcnNfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc3RvcmVfY29sb3JzX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9jb2xvcm1hcF90IGNtYXA7IC8qKjwgICovCit9IHhjYl9zdG9yZV9jb2xvcnNfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2Jfc3RvcmVfbmFtZWRfY29sb3IuICovCisjZGVmaW5lIFhDQl9TVE9SRV9OQU1FRF9DT0xPUiA5MAorCisvKioKKyAqIEBicmllZiB4Y2Jfc3RvcmVfbmFtZWRfY29sb3JfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc3RvcmVfbmFtZWRfY29sb3JfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgZmxhZ3M7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbGVuZ3RoOyAvKio8ICAqLworICAgIHhjYl9jb2xvcm1hcF90IGNtYXA7IC8qKjwgICovCisgICAgdWludDMyX3QgICAgICAgcGl4ZWw7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICAgbmFtZV9sZW47IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMFsyXTsgLyoqPCAgKi8KK30geGNiX3N0b3JlX25hbWVkX2NvbG9yX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3JnYl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcmdiX3QgeworICAgIHVpbnQxNl90IHJlZDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBncmVlbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBibHVlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDBbMl07IC8qKjwgICovCit9IHhjYl9yZ2JfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3JnYl9pdGVyYXRvcl90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcmdiX2l0ZXJhdG9yX3QgeworICAgIHhjYl9yZ2JfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgIHJlbTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgIGluZGV4OyAvKio8ICAqLworfSB4Y2JfcmdiX2l0ZXJhdG9yX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9xdWVyeV9jb2xvcnNfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9jb2xvcnNfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX3F1ZXJ5X2NvbG9yc19jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3F1ZXJ5X2NvbG9ycy4gKi8KKyNkZWZpbmUgWENCX1FVRVJZX0NPTE9SUyA5MQorCisvKioKKyAqIEBicmllZiB4Y2JfcXVlcnlfY29sb3JzX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3F1ZXJ5X2NvbG9yc19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfY29sb3JtYXBfdCBjbWFwOyAvKio8ICAqLworfSB4Y2JfcXVlcnlfY29sb3JzX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3F1ZXJ5X2NvbG9yc19yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfY29sb3JzX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDE2X3QgY29sb3JzX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQxWzIyXTsgLyoqPCAgKi8KK30geGNiX3F1ZXJ5X2NvbG9yc19yZXBseV90OworCisvKioKKyAqIEBicmllZiB4Y2JfbG9va3VwX2NvbG9yX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfbG9va3VwX2NvbG9yX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9sb29rdXBfY29sb3JfY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9sb29rdXBfY29sb3IuICovCisjZGVmaW5lIFhDQl9MT09LVVBfQ09MT1IgOTIKKworLyoqCisgKiBAYnJpZWYgeGNiX2xvb2t1cF9jb2xvcl9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9sb29rdXBfY29sb3JfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2NvbG9ybWFwX3QgY21hcDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBuYW1lX2xlbjsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgICBwYWQxWzJdOyAvKio8ICAqLworfSB4Y2JfbG9va3VwX2NvbG9yX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2xvb2t1cF9jb2xvcl9yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfbG9va3VwX2NvbG9yX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDE2X3QgZXhhY3RfcmVkOyAvKio8ICAqLworICAgIHVpbnQxNl90IGV4YWN0X2dyZWVuOyAvKio8ICAqLworICAgIHVpbnQxNl90IGV4YWN0X2JsdWU7IC8qKjwgICovCisgICAgdWludDE2X3QgdmlzdWFsX3JlZDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCB2aXN1YWxfZ3JlZW47IC8qKjwgICovCisgICAgdWludDE2X3QgdmlzdWFsX2JsdWU7IC8qKjwgICovCit9IHhjYl9sb29rdXBfY29sb3JfcmVwbHlfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9waXhtYXBfZW51bV90IHsKKyAgICBYQ0JfUElYTUFQX05PTkUgPSAwCit9IHhjYl9waXhtYXBfZW51bV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY3JlYXRlX2N1cnNvci4gKi8KKyNkZWZpbmUgWENCX0NSRUFURV9DVVJTT1IgOTMKKworLyoqCisgKiBAYnJpZWYgeGNiX2NyZWF0ZV9jdXJzb3JfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY3JlYXRlX2N1cnNvcl9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfY3Vyc29yX3QgY2lkOyAvKio8ICAqLworICAgIHhjYl9waXhtYXBfdCBzb3VyY2U7IC8qKjwgICovCisgICAgeGNiX3BpeG1hcF90IG1hc2s7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGZvcmVfcmVkOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBmb3JlX2dyZWVuOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBmb3JlX2JsdWU7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGJhY2tfcmVkOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBiYWNrX2dyZWVuOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBiYWNrX2JsdWU7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHg7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIHk7IC8qKjwgICovCit9IHhjYl9jcmVhdGVfY3Vyc29yX3JlcXVlc3RfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9mb250X2VudW1fdCB7CisgICAgWENCX0ZPTlRfTk9ORSA9IDAKK30geGNiX2ZvbnRfZW51bV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfY3JlYXRlX2dseXBoX2N1cnNvci4gKi8KKyNkZWZpbmUgWENCX0NSRUFURV9HTFlQSF9DVVJTT1IgOTQKKworLyoqCisgKiBAYnJpZWYgeGNiX2NyZWF0ZV9nbHlwaF9jdXJzb3JfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY3JlYXRlX2dseXBoX2N1cnNvcl9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfY3Vyc29yX3QgY2lkOyAvKio8ICAqLworICAgIHhjYl9mb250X3QgICBzb3VyY2VfZm9udDsgLyoqPCAgKi8KKyAgICB4Y2JfZm9udF90ICAgbWFza19mb250OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBzb3VyY2VfY2hhcjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgbWFza19jaGFyOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBmb3JlX3JlZDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgZm9yZV9ncmVlbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgZm9yZV9ibHVlOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBiYWNrX3JlZDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgYmFja19ncmVlbjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgYmFja19ibHVlOyAvKio8ICAqLworfSB4Y2JfY3JlYXRlX2dseXBoX2N1cnNvcl9yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9mcmVlX2N1cnNvci4gKi8KKyNkZWZpbmUgWENCX0ZSRUVfQ1VSU09SIDk1CisKKy8qKgorICogQGJyaWVmIHhjYl9mcmVlX2N1cnNvcl9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9mcmVlX2N1cnNvcl9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfY3Vyc29yX3QgY3Vyc29yOyAvKio8ICAqLworfSB4Y2JfZnJlZV9jdXJzb3JfcmVxdWVzdF90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfcmVjb2xvcl9jdXJzb3IuICovCisjZGVmaW5lIFhDQl9SRUNPTE9SX0NVUlNPUiA5NgorCisvKioKKyAqIEBicmllZiB4Y2JfcmVjb2xvcl9jdXJzb3JfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcmVjb2xvcl9jdXJzb3JfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2N1cnNvcl90IGN1cnNvcjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgZm9yZV9yZWQ7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGZvcmVfZ3JlZW47IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGZvcmVfYmx1ZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgYmFja19yZWQ7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGJhY2tfZ3JlZW47IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGJhY2tfYmx1ZTsgLyoqPCAgKi8KK30geGNiX3JlY29sb3JfY3Vyc29yX3JlcXVlc3RfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9xdWVyeV9zaGFwZV9vZl90IHsKKyAgICBYQ0JfUVVFUllfU0hBUEVfT0ZfTEFSR0VTVF9DVVJTT1IgPSAwLAorICAgIFhDQl9RVUVSWV9TSEFQRV9PRl9GQVNURVNUX1RJTEUgPSAxLAorICAgIFhDQl9RVUVSWV9TSEFQRV9PRl9GQVNURVNUX1NUSVBQTEUgPSAyCit9IHhjYl9xdWVyeV9zaGFwZV9vZl90OworCisvKioKKyAqIEBicmllZiB4Y2JfcXVlcnlfYmVzdF9zaXplX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfYmVzdF9zaXplX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9xdWVyeV9iZXN0X3NpemVfY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9xdWVyeV9iZXN0X3NpemUuICovCisjZGVmaW5lIFhDQl9RVUVSWV9CRVNUX1NJWkUgOTcKKworLyoqCisgKiBAYnJpZWYgeGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9iZXN0X3NpemVfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICAgX2NsYXNzOyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICB3aWR0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgICBoZWlnaHQ7IC8qKjwgICovCit9IHhjYl9xdWVyeV9iZXN0X3NpemVfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfcXVlcnlfYmVzdF9zaXplX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9iZXN0X3NpemVfcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCB3aWR0aDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBoZWlnaHQ7IC8qKjwgICovCit9IHhjYl9xdWVyeV9iZXN0X3NpemVfcmVwbHlfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX3F1ZXJ5X2V4dGVuc2lvbl9jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3F1ZXJ5X2V4dGVuc2lvbl9jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfcXVlcnlfZXh0ZW5zaW9uX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfcXVlcnlfZXh0ZW5zaW9uLiAqLworI2RlZmluZSBYQ0JfUVVFUllfRVhURU5TSU9OIDk4CisKKy8qKgorICogQGJyaWVmIHhjYl9xdWVyeV9leHRlbnNpb25fcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfcXVlcnlfZXh0ZW5zaW9uX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQxNl90IG5hbWVfbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDFbMl07IC8qKjwgICovCit9IHhjYl9xdWVyeV9leHRlbnNpb25fcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfcXVlcnlfZXh0ZW5zaW9uX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9xdWVyeV9leHRlbnNpb25fcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwcmVzZW50OyAvKio8ICAqLworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBmaXJzdF9ldmVudDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBmaXJzdF9lcnJvcjsgLyoqPCAgKi8KK30geGNiX3F1ZXJ5X2V4dGVuc2lvbl9yZXBseV90OworCisvKioKKyAqIEBicmllZiB4Y2JfbGlzdF9leHRlbnNpb25zX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfbGlzdF9leHRlbnNpb25zX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9saXN0X2V4dGVuc2lvbnNfY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9saXN0X2V4dGVuc2lvbnMuICovCisjZGVmaW5lIFhDQl9MSVNUX0VYVEVOU0lPTlMgOTkKKworLyoqCisgKiBAYnJpZWYgeGNiX2xpc3RfZXh0ZW5zaW9uc19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9saXN0X2V4dGVuc2lvbnNfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCit9IHhjYl9saXN0X2V4dGVuc2lvbnNfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfbGlzdF9leHRlbnNpb25zX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9saXN0X2V4dGVuc2lvbnNfcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBuYW1lc19sZW47IC8qKjwgICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDBbMjRdOyAvKio8ICAqLworfSB4Y2JfbGlzdF9leHRlbnNpb25zX3JlcGx5X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jaGFuZ2Vfa2V5Ym9hcmRfbWFwcGluZy4gKi8KKyNkZWZpbmUgWENCX0NIQU5HRV9LRVlCT0FSRF9NQVBQSU5HIDEwMAorCisvKioKKyAqIEBicmllZiB4Y2JfY2hhbmdlX2tleWJvYXJkX21hcHBpbmdfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY2hhbmdlX2tleWJvYXJkX21hcHBpbmdfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICAgICAgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgIGtleWNvZGVfY291bnQ7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgICBsZW5ndGg7IC8qKjwgICovCisgICAgeGNiX2tleWNvZGVfdCBmaXJzdF9rZXljb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAga2V5c3ltc19wZXJfa2V5Y29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICAgICAgIHBhZDBbMl07IC8qKjwgICovCit9IHhjYl9jaGFuZ2Vfa2V5Ym9hcmRfbWFwcGluZ19yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nLiAqLworI2RlZmluZSBYQ0JfR0VUX0tFWUJPQVJEX01BUFBJTkcgMTAxCisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgICAgICAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCAgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfa2V5Y29kZV90IGZpcnN0X2tleWNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgICBjb3VudDsgLyoqPCAgKi8KK30geGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIGtleXN5bXNfcGVyX2tleWNvZGU7IC8qKjwgICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDBbMjRdOyAvKio8ICAqLworfSB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfcmVwbHlfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9rYl90IHsKKyAgICBYQ0JfS0JfS0VZX0NMSUNLX1BFUkNFTlQgPSAxLAorICAgIFhDQl9LQl9CRUxMX1BFUkNFTlQgPSAyLAorICAgIFhDQl9LQl9CRUxMX1BJVENIID0gNCwKKyAgICBYQ0JfS0JfQkVMTF9EVVJBVElPTiA9IDgsCisgICAgWENCX0tCX0xFRCA9IDE2LAorICAgIFhDQl9LQl9MRURfTU9ERSA9IDMyLAorICAgIFhDQl9LQl9LRVkgPSA2NCwKKyAgICBYQ0JfS0JfQVVUT19SRVBFQVRfTU9ERSA9IDEyOAorfSB4Y2Jfa2JfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9sZWRfbW9kZV90IHsKKyAgICBYQ0JfTEVEX01PREVfT0ZGID0gMCwKKyAgICBYQ0JfTEVEX01PREVfT04gPSAxCit9IHhjYl9sZWRfbW9kZV90OworCit0eXBlZGVmIGVudW0geGNiX2F1dG9fcmVwZWF0X21vZGVfdCB7CisgICAgWENCX0FVVE9fUkVQRUFUX01PREVfT0ZGID0gMCwKKyAgICBYQ0JfQVVUT19SRVBFQVRfTU9ERV9PTiA9IDEsCisgICAgWENCX0FVVE9fUkVQRUFUX01PREVfREVGQVVMVCA9IDIKK30geGNiX2F1dG9fcmVwZWF0X21vZGVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2NoYW5nZV9rZXlib2FyZF9jb250cm9sLiAqLworI2RlZmluZSBYQ0JfQ0hBTkdFX0tFWUJPQVJEX0NPTlRST0wgMTAyCisKKy8qKgorICogQGJyaWVmIHhjYl9jaGFuZ2Vfa2V5Ym9hcmRfY29udHJvbF9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jaGFuZ2Vfa2V5Ym9hcmRfY29udHJvbF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCB2YWx1ZV9tYXNrOyAvKio8ICAqLworfSB4Y2JfY2hhbmdlX2tleWJvYXJkX2NvbnRyb2xfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF9jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbC4gKi8KKyNkZWZpbmUgWENCX0dFVF9LRVlCT0FSRF9DT05UUk9MIDEwMworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCit9IHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF9yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBnbG9iYWxfYXV0b19yZXBlYXQ7IC8qKjwgICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlZF9tYXNrOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIGtleV9jbGlja19wZXJjZW50OyAvKio8ICAqLworICAgIHVpbnQ4X3QgIGJlbGxfcGVyY2VudDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBiZWxsX3BpdGNoOyAvKio8ICAqLworICAgIHVpbnQxNl90IGJlbGxfZHVyYXRpb247IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMFsyXTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBhdXRvX3JlcGVhdHNbMzJdOyAvKio8ICAqLworfSB4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfcmVwbHlfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2JlbGwuICovCisjZGVmaW5lIFhDQl9CRUxMIDEwNAorCisvKioKKyAqIEBicmllZiB4Y2JfYmVsbF9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9iZWxsX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIGludDhfdCAgIHBlcmNlbnQ7IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworfSB4Y2JfYmVsbF9yZXF1ZXN0X3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9jaGFuZ2VfcG9pbnRlcl9jb250cm9sLiAqLworI2RlZmluZSBYQ0JfQ0hBTkdFX1BPSU5URVJfQ09OVFJPTCAxMDUKKworLyoqCisgKiBAYnJpZWYgeGNiX2NoYW5nZV9wb2ludGVyX2NvbnRyb2xfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfY2hhbmdlX3BvaW50ZXJfY29udHJvbF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICBhY2NlbGVyYXRpb25fbnVtZXJhdG9yOyAvKio8ICAqLworICAgIGludDE2X3QgIGFjY2VsZXJhdGlvbl9kZW5vbWluYXRvcjsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICB0aHJlc2hvbGQ7IC8qKjwgICovCisgICAgdWludDhfdCAgZG9fYWNjZWxlcmF0aW9uOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIGRvX3RocmVzaG9sZDsgLyoqPCAgKi8KK30geGNiX2NoYW5nZV9wb2ludGVyX2NvbnRyb2xfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9wb2ludGVyX2NvbnRyb2xfY29va2llX3QgeworICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsgLyoqPCAgKi8KK30geGNiX2dldF9wb2ludGVyX2NvbnRyb2xfY29va2llX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9nZXRfcG9pbnRlcl9jb250cm9sLiAqLworI2RlZmluZSBYQ0JfR0VUX1BPSU5URVJfQ09OVFJPTCAxMDYKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9wb2ludGVyX2NvbnRyb2xfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KK30geGNiX2dldF9wb2ludGVyX2NvbnRyb2xfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9yZXBseV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3Qgc2VxdWVuY2U7IC8qKjwgICovCisgICAgdWludDMyX3QgbGVuZ3RoOyAvKio8ICAqLworICAgIHVpbnQxNl90IGFjY2VsZXJhdGlvbl9udW1lcmF0b3I7IC8qKjwgICovCisgICAgdWludDE2X3QgYWNjZWxlcmF0aW9uX2Rlbm9taW5hdG9yOyAvKio8ICAqLworICAgIHVpbnQxNl90IHRocmVzaG9sZDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQxWzE4XTsgLyoqPCAgKi8KK30geGNiX2dldF9wb2ludGVyX2NvbnRyb2xfcmVwbHlfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9ibGFua2luZ190IHsKKyAgICBYQ0JfQkxBTktJTkdfTk9UX1BSRUZFUlJFRCA9IDAsCisgICAgWENCX0JMQU5LSU5HX1BSRUZFUlJFRCA9IDEsCisgICAgWENCX0JMQU5LSU5HX0RFRkFVTFQgPSAyCit9IHhjYl9ibGFua2luZ190OworCit0eXBlZGVmIGVudW0geGNiX2V4cG9zdXJlc190IHsKKyAgICBYQ0JfRVhQT1NVUkVTX05PVF9BTExPV0VEID0gMCwKKyAgICBYQ0JfRVhQT1NVUkVTX0FMTE9XRUQgPSAxLAorICAgIFhDQl9FWFBPU1VSRVNfREVGQVVMVCA9IDIKK30geGNiX2V4cG9zdXJlc190OworCisvKiogT3Bjb2RlIGZvciB4Y2Jfc2V0X3NjcmVlbl9zYXZlci4gKi8KKyNkZWZpbmUgWENCX1NFVF9TQ1JFRU5fU0FWRVIgMTA3CisKKy8qKgorICogQGJyaWVmIHhjYl9zZXRfc2NyZWVuX3NhdmVyX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3NldF9zY3JlZW5fc2F2ZXJfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCisgICAgaW50MTZfdCAgdGltZW91dDsgLyoqPCAgKi8KKyAgICBpbnQxNl90ICBpbnRlcnZhbDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwcmVmZXJfYmxhbmtpbmc7IC8qKjwgICovCisgICAgdWludDhfdCAgYWxsb3dfZXhwb3N1cmVzOyAvKio8ICAqLworfSB4Y2Jfc2V0X3NjcmVlbl9zYXZlcl9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfc2NyZWVuX3NhdmVyX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfZ2V0X3NjcmVlbl9zYXZlcl9jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfZ2V0X3NjcmVlbl9zYXZlcl9jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2dldF9zY3JlZW5fc2F2ZXIuICovCisjZGVmaW5lIFhDQl9HRVRfU0NSRUVOX1NBVkVSIDEwOAorCisvKioKKyAqIEBicmllZiB4Y2JfZ2V0X3NjcmVlbl9zYXZlcl9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfc2NyZWVuX3NhdmVyX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworfSB4Y2JfZ2V0X3NjcmVlbl9zYXZlcl9yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfc2NyZWVuX3NhdmVyX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfc2NyZWVuX3NhdmVyX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDE2X3QgdGltZW91dDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBpbnRlcnZhbDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwcmVmZXJfYmxhbmtpbmc7IC8qKjwgICovCisgICAgdWludDhfdCAgYWxsb3dfZXhwb3N1cmVzOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDFbMThdOyAvKio8ICAqLworfSB4Y2JfZ2V0X3NjcmVlbl9zYXZlcl9yZXBseV90OworCit0eXBlZGVmIGVudW0geGNiX2hvc3RfbW9kZV90IHsKKyAgICBYQ0JfSE9TVF9NT0RFX0lOU0VSVCA9IDAsCisgICAgWENCX0hPU1RfTU9ERV9ERUxFVEUgPSAxCit9IHhjYl9ob3N0X21vZGVfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9mYW1pbHlfdCB7CisgICAgWENCX0ZBTUlMWV9JTlRFUk5FVCA9IDAsCisgICAgWENCX0ZBTUlMWV9ERUNORVQgPSAxLAorICAgIFhDQl9GQU1JTFlfQ0hBT1MgPSAyLAorICAgIFhDQl9GQU1JTFlfU0VSVkVSX0lOVEVSUFJFVEVEID0gNSwKKyAgICBYQ0JfRkFNSUxZX0lOVEVSTkVUXzYgPSA2Cit9IHhjYl9mYW1pbHlfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2NoYW5nZV9ob3N0cy4gKi8KKyNkZWZpbmUgWENCX0NIQU5HRV9IT1NUUyAxMDkKKworLyoqCisgKiBAYnJpZWYgeGNiX2NoYW5nZV9ob3N0c19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9jaGFuZ2VfaG9zdHNfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgbW9kZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDhfdCAgZmFtaWx5OyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgYWRkcmVzc19sZW47IC8qKjwgICovCit9IHhjYl9jaGFuZ2VfaG9zdHNfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2JfaG9zdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfaG9zdF90IHsKKyAgICB1aW50OF90ICBmYW1pbHk7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBhZGRyZXNzX2xlbjsgLyoqPCAgKi8KK30geGNiX2hvc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2hvc3RfaXRlcmF0b3JfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2hvc3RfaXRlcmF0b3JfdCB7CisgICAgeGNiX2hvc3RfdCAqZGF0YTsgLyoqPCAgKi8KKyAgICBpbnQgICAgICAgICByZW07IC8qKjwgICovCisgICAgaW50ICAgICAgICAgaW5kZXg7IC8qKjwgICovCit9IHhjYl9ob3N0X2l0ZXJhdG9yX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9saXN0X2hvc3RzX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2JfbGlzdF9ob3N0c19jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2JfbGlzdF9ob3N0c19jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2xpc3RfaG9zdHMuICovCisjZGVmaW5lIFhDQl9MSVNUX0hPU1RTIDExMAorCisvKioKKyAqIEBicmllZiB4Y2JfbGlzdF9ob3N0c19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9saXN0X2hvc3RzX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworfSB4Y2JfbGlzdF9ob3N0c19yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9saXN0X2hvc3RzX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9saXN0X2hvc3RzX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgbW9kZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDE2X3QgaG9zdHNfbGVuOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIHBhZDBbMjJdOyAvKio8ICAqLworfSB4Y2JfbGlzdF9ob3N0c19yZXBseV90OworCit0eXBlZGVmIGVudW0geGNiX2FjY2Vzc19jb250cm9sX3QgeworICAgIFhDQl9BQ0NFU1NfQ09OVFJPTF9ESVNBQkxFID0gMCwKKyAgICBYQ0JfQUNDRVNTX0NPTlRST0xfRU5BQkxFID0gMQorfSB4Y2JfYWNjZXNzX2NvbnRyb2xfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3NldF9hY2Nlc3NfY29udHJvbC4gKi8KKyNkZWZpbmUgWENCX1NFVF9BQ0NFU1NfQ09OVFJPTCAxMTEKKworLyoqCisgKiBAYnJpZWYgeGNiX3NldF9hY2Nlc3NfY29udHJvbF9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zZXRfYWNjZXNzX2NvbnRyb2xfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgbW9kZTsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCit9IHhjYl9zZXRfYWNjZXNzX2NvbnRyb2xfcmVxdWVzdF90OworCit0eXBlZGVmIGVudW0geGNiX2Nsb3NlX2Rvd25fdCB7CisgICAgWENCX0NMT1NFX0RPV05fREVTVFJPWV9BTEwgPSAwLAorICAgIFhDQl9DTE9TRV9ET1dOX1JFVEFJTl9QRVJNQU5FTlQgPSAxLAorICAgIFhDQl9DTE9TRV9ET1dOX1JFVEFJTl9URU1QT1JBUlkgPSAyCit9IHhjYl9jbG9zZV9kb3duX3Q7CisKKy8qKiBPcGNvZGUgZm9yIHhjYl9zZXRfY2xvc2VfZG93bl9tb2RlLiAqLworI2RlZmluZSBYQ0JfU0VUX0NMT1NFX0RPV05fTU9ERSAxMTIKKworLyoqCisgKiBAYnJpZWYgeGNiX3NldF9jbG9zZV9kb3duX21vZGVfcmVxdWVzdF90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc2V0X2Nsb3NlX2Rvd25fbW9kZV9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBtb2RlOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KK30geGNiX3NldF9jbG9zZV9kb3duX21vZGVfcmVxdWVzdF90OworCit0eXBlZGVmIGVudW0geGNiX2tpbGxfdCB7CisgICAgWENCX0tJTExfQUxMX1RFTVBPUkFSWSA9IDAKK30geGNiX2tpbGxfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2tpbGxfY2xpZW50LiAqLworI2RlZmluZSBYQ0JfS0lMTF9DTElFTlQgMTEzCisKKy8qKgorICogQGJyaWVmIHhjYl9raWxsX2NsaWVudF9yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9raWxsX2NsaWVudF9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCByZXNvdXJjZTsgLyoqPCAgKi8KK30geGNiX2tpbGxfY2xpZW50X3JlcXVlc3RfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3JvdGF0ZV9wcm9wZXJ0aWVzLiAqLworI2RlZmluZSBYQ0JfUk9UQVRFX1BST1BFUlRJRVMgMTE0CisKKy8qKgorICogQGJyaWVmIHhjYl9yb3RhdGVfcHJvcGVydGllc19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9yb3RhdGVfcHJvcGVydGllc19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgICAgICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgICAgIHBhZDA7IC8qKjwgICovCisgICAgdWludDE2X3QgICAgIGxlbmd0aDsgLyoqPCAgKi8KKyAgICB4Y2Jfd2luZG93X3Qgd2luZG93OyAvKio8ICAqLworICAgIHVpbnQxNl90ICAgICBhdG9tc19sZW47IC8qKjwgICovCisgICAgaW50MTZfdCAgICAgIGRlbHRhOyAvKio8ICAqLworfSB4Y2Jfcm90YXRlX3Byb3BlcnRpZXNfcmVxdWVzdF90OworCit0eXBlZGVmIGVudW0geGNiX3NjcmVlbl9zYXZlcl90IHsKKyAgICBYQ0JfU0NSRUVOX1NBVkVSX1JFU0VUID0gMCwKKyAgICBYQ0JfU0NSRUVOX1NBVkVSX0FDVElWRSA9IDEKK30geGNiX3NjcmVlbl9zYXZlcl90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZm9yY2Vfc2NyZWVuX3NhdmVyLiAqLworI2RlZmluZSBYQ0JfRk9SQ0VfU0NSRUVOX1NBVkVSIDExNQorCisvKioKKyAqIEBicmllZiB4Y2JfZm9yY2Vfc2NyZWVuX3NhdmVyX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2ZvcmNlX3NjcmVlbl9zYXZlcl9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBtb2RlOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KK30geGNiX2ZvcmNlX3NjcmVlbl9zYXZlcl9yZXF1ZXN0X3Q7CisKK3R5cGVkZWYgZW51bSB4Y2JfbWFwcGluZ19zdGF0dXNfdCB7CisgICAgWENCX01BUFBJTkdfU1RBVFVTX1NVQ0NFU1MgPSAwLAorICAgIFhDQl9NQVBQSU5HX1NUQVRVU19CVVNZID0gMSwKKyAgICBYQ0JfTUFQUElOR19TVEFUVVNfRkFJTFVSRSA9IDIKK30geGNiX21hcHBpbmdfc3RhdHVzX3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX2Nvb2tpZV90CisgKiovCit0eXBlZGVmIHN0cnVjdCB4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ19jb29raWVfdCB7CisgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOyAvKio8ICAqLworfSB4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ19jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3NldF9wb2ludGVyX21hcHBpbmcuICovCisjZGVmaW5lIFhDQl9TRVRfUE9JTlRFUl9NQVBQSU5HIDExNgorCisvKioKKyAqIEBicmllZiB4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX3JlcXVlc3RfdCB7CisgICAgdWludDhfdCAgbWFqb3Jfb3Bjb2RlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIG1hcF9sZW47IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworfSB4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ19yZXF1ZXN0X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgc3RhdHVzOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KK30geGNiX3NldF9wb2ludGVyX21hcHBpbmdfcmVwbHlfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9wb2ludGVyX21hcHBpbmdfY29va2llX3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX2Nvb2tpZV90OworCisvKiogT3Bjb2RlIGZvciB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZy4gKi8KKyNkZWZpbmUgWENCX0dFVF9QT0lOVEVSX01BUFBJTkcgMTE3CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9wb2ludGVyX21hcHBpbmdfcmVxdWVzdF90IHsKKyAgICB1aW50OF90ICBtYWpvcl9vcGNvZGU7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMDsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBsZW5ndGg7IC8qKjwgICovCit9IHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9wb2ludGVyX21hcHBpbmdfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9wb2ludGVyX21hcHBpbmdfcmVwbHlfdCB7CisgICAgdWludDhfdCAgcmVzcG9uc2VfdHlwZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBtYXBfbGVuOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwWzI0XTsgLyoqPCAgKi8KK30geGNiX2dldF9wb2ludGVyX21hcHBpbmdfcmVwbHlfdDsKKwordHlwZWRlZiBlbnVtIHhjYl9tYXBfaW5kZXhfdCB7CisgICAgWENCX01BUF9JTkRFWF9TSElGVCA9IDAsCisgICAgWENCX01BUF9JTkRFWF9MT0NLID0gMSwKKyAgICBYQ0JfTUFQX0lOREVYX0NPTlRST0wgPSAyLAorICAgIFhDQl9NQVBfSU5ERVhfMSA9IDMsCisgICAgWENCX01BUF9JTkRFWF8yID0gNCwKKyAgICBYQ0JfTUFQX0lOREVYXzMgPSA1LAorICAgIFhDQl9NQVBfSU5ERVhfNCA9IDYsCisgICAgWENCX01BUF9JTkRFWF81ID0gNworfSB4Y2JfbWFwX2luZGV4X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ19jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3NldF9tb2RpZmllcl9tYXBwaW5nX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ19jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX3NldF9tb2RpZmllcl9tYXBwaW5nLiAqLworI2RlZmluZSBYQ0JfU0VUX01PRElGSUVSX01BUFBJTkcgMTE4CisKKy8qKgorICogQGJyaWVmIHhjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBrZXljb2Rlc19wZXJfbW9kaWZpZXI7IC8qKjwgICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKio8ICAqLworfSB4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfcmVxdWVzdF90OworCisvKioKKyAqIEBicmllZiB4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfcmVwbHlfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX3NldF9tb2RpZmllcl9tYXBwaW5nX3JlcGx5X3QgeworICAgIHVpbnQ4X3QgIHJlc3BvbnNlX3R5cGU7IC8qKjwgICovCisgICAgdWludDhfdCAgc3RhdHVzOyAvKio8ICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOyAvKio8ICAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgLyoqPCAgKi8KK30geGNiX3NldF9tb2RpZmllcl9tYXBwaW5nX3JlcGx5X3Q7CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19jb29raWVfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX2Nvb2tpZV90IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7IC8qKjwgICovCit9IHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19jb29raWVfdDsKKworLyoqIE9wY29kZSBmb3IgeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nLiAqLworI2RlZmluZSBYQ0JfR0VUX01PRElGSUVSX01BUFBJTkcgMTE5CisKKy8qKgorICogQGJyaWVmIHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19yZXF1ZXN0X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KK30geGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3JlcXVlc3RfdDsKKworLyoqCisgKiBAYnJpZWYgeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3JlcGx5X3QKKyAqKi8KK3R5cGVkZWYgc3RydWN0IHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19yZXBseV90IHsKKyAgICB1aW50OF90ICByZXNwb25zZV90eXBlOyAvKio8ICAqLworICAgIHVpbnQ4X3QgIGtleWNvZGVzX3Blcl9tb2RpZmllcjsgLyoqPCAgKi8KKyAgICB1aW50MTZfdCBzZXF1ZW5jZTsgLyoqPCAgKi8KKyAgICB1aW50MzJfdCBsZW5ndGg7IC8qKjwgICovCisgICAgdWludDhfdCAgcGFkMFsyNF07IC8qKjwgICovCit9IHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19yZXBseV90OworCisvKiogT3Bjb2RlIGZvciB4Y2Jfbm9fb3BlcmF0aW9uLiAqLworI2RlZmluZSBYQ0JfTk9fT1BFUkFUSU9OIDEyNworCisvKioKKyAqIEBicmllZiB4Y2Jfbm9fb3BlcmF0aW9uX3JlcXVlc3RfdAorICoqLwordHlwZWRlZiBzdHJ1Y3QgeGNiX25vX29wZXJhdGlvbl9yZXF1ZXN0X3QgeworICAgIHVpbnQ4X3QgIG1ham9yX29wY29kZTsgLyoqPCAgKi8KKyAgICB1aW50OF90ICBwYWQwOyAvKio8ICAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgLyoqPCAgKi8KK30geGNiX25vX29wZXJhdGlvbl9yZXF1ZXN0X3Q7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX2NoYXIyYl9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9jaGFyMmJfdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX2NoYXIyYl9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9jaGFyMmJfaXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX2NoYXIyYl9uZXh0ICh4Y2JfY2hhcjJiX2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX2NoYXIyYl9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9jaGFyMmJfZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl9jaGFyMmJfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfY2hhcjJiX2VuZCAoeGNiX2NoYXIyYl9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl93aW5kb3dfaXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2Jfd2luZG93X3QpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB2b2lkIHhjYl93aW5kb3dfbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2Jfd2luZG93X2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl93aW5kb3dfbmV4dCAoeGNiX3dpbmRvd19pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl93aW5kb3dfaXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2Jfd2luZG93X2VuZAorICoqIAorICoqIEBwYXJhbSB4Y2Jfd2luZG93X2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX3dpbmRvd19lbmQgKHhjYl93aW5kb3dfaXRlcmF0b3JfdCBpICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2JfcGl4bWFwX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX3BpeG1hcF90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2JfcGl4bWFwX25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3BpeG1hcF9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2JfcGl4bWFwX25leHQgKHhjYl9waXhtYXBfaXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2JfcGl4bWFwX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX3BpeG1hcF9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3BpeG1hcF9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9waXhtYXBfZW5kICh4Y2JfcGl4bWFwX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX2N1cnNvcl9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9jdXJzb3JfdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX2N1cnNvcl9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9jdXJzb3JfaXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX2N1cnNvcl9uZXh0ICh4Y2JfY3Vyc29yX2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX2N1cnNvcl9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9jdXJzb3JfZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl9jdXJzb3JfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfY3Vyc29yX2VuZCAoeGNiX2N1cnNvcl9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl9mb250X2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX2ZvbnRfdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX2ZvbnRfbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2JfZm9udF9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2JfZm9udF9uZXh0ICh4Y2JfZm9udF9pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl9mb250X2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2ZvbnRfZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl9mb250X2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2ZvbnRfZW5kICh4Y2JfZm9udF9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl9nY29udGV4dF9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9nY29udGV4dF90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2JfZ2NvbnRleHRfbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfaXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX2djb250ZXh0X25leHQgKHhjYl9nY29udGV4dF9pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl9nY29udGV4dF9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9nY29udGV4dF9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2djb250ZXh0X2VuZCAoeGNiX2djb250ZXh0X2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX2NvbG9ybWFwX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX2NvbG9ybWFwX3QpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB2b2lkIHhjYl9jb2xvcm1hcF9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2JfY29sb3JtYXBfbmV4dCAoeGNiX2NvbG9ybWFwX2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX2NvbG9ybWFwX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2NvbG9ybWFwX2VuZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29sb3JtYXBfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfY29sb3JtYXBfZW5kICh4Y2JfY29sb3JtYXBfaXRlcmF0b3JfdCBpICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2JfYXRvbV9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9hdG9tX3QpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB2b2lkIHhjYl9hdG9tX25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2F0b21faXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX2F0b21fbmV4dCAoeGNiX2F0b21faXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2JfYXRvbV9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9hdG9tX2VuZAorICoqIAorICoqIEBwYXJhbSB4Y2JfYXRvbV9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9hdG9tX2VuZCAoeGNiX2F0b21faXRlcmF0b3JfdCBpICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2JfZHJhd2FibGVfaXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2JfZHJhd2FibGVfdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX2RyYXdhYmxlX25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl9kcmF3YWJsZV9uZXh0ICh4Y2JfZHJhd2FibGVfaXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2JfZHJhd2FibGVfaXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfZHJhd2FibGVfZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9kcmF3YWJsZV9lbmQgKHhjYl9kcmF3YWJsZV9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl9mb250YWJsZV9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9mb250YWJsZV90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2JfZm9udGFibGVfbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2JfZm9udGFibGVfaXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX2ZvbnRhYmxlX25leHQgKHhjYl9mb250YWJsZV9pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl9mb250YWJsZV9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9mb250YWJsZV9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2ZvbnRhYmxlX2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2ZvbnRhYmxlX2VuZCAoeGNiX2ZvbnRhYmxlX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX3Zpc3VhbGlkX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX3Zpc3VhbGlkX3QpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB2b2lkIHhjYl92aXN1YWxpZF9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl92aXN1YWxpZF9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2JfdmlzdWFsaWRfbmV4dCAoeGNiX3Zpc3VhbGlkX2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX3Zpc3VhbGlkX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX3Zpc3VhbGlkX2VuZAorICoqIAorICoqIEBwYXJhbSB4Y2JfdmlzdWFsaWRfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfdmlzdWFsaWRfZW5kICh4Y2JfdmlzdWFsaWRfaXRlcmF0b3JfdCBpICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2JfdGltZXN0YW1wX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX3RpbWVzdGFtcF90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2JfdGltZXN0YW1wX25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3RpbWVzdGFtcF9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2JfdGltZXN0YW1wX25leHQgKHhjYl90aW1lc3RhbXBfaXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2JfdGltZXN0YW1wX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX3RpbWVzdGFtcF9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3RpbWVzdGFtcF9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl90aW1lc3RhbXBfZW5kICh4Y2JfdGltZXN0YW1wX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX2tleXN5bV9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9rZXlzeW1fdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX2tleXN5bV9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9rZXlzeW1faXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX2tleXN5bV9uZXh0ICh4Y2Jfa2V5c3ltX2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX2tleXN5bV9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9rZXlzeW1fZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl9rZXlzeW1faXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2Jfa2V5c3ltX2VuZCAoeGNiX2tleXN5bV9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl9rZXljb2RlX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX2tleWNvZGVfdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX2tleWNvZGVfbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2Jfa2V5Y29kZV9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2Jfa2V5Y29kZV9uZXh0ICh4Y2Jfa2V5Y29kZV9pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl9rZXljb2RlX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2tleWNvZGVfZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl9rZXljb2RlX2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2tleWNvZGVfZW5kICh4Y2Jfa2V5Y29kZV9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl9idXR0b25faXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2JfYnV0dG9uX3QpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB2b2lkIHhjYl9idXR0b25fbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2JfYnV0dG9uX2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl9idXR0b25fbmV4dCAoeGNiX2J1dHRvbl9pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl9idXR0b25faXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfYnV0dG9uX2VuZAorICoqIAorICoqIEBwYXJhbSB4Y2JfYnV0dG9uX2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2J1dHRvbl9lbmQgKHhjYl9idXR0b25faXRlcmF0b3JfdCBpICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2JfcG9pbnRfaXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2JfcG9pbnRfdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX3BvaW50X25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3BvaW50X2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl9wb2ludF9uZXh0ICh4Y2JfcG9pbnRfaXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2JfcG9pbnRfaXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfcG9pbnRfZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl9wb2ludF9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9wb2ludF9lbmQgKHhjYl9wb2ludF9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl9yZWN0YW5nbGVfaXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2JfcmVjdGFuZ2xlX3QpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB2b2lkIHhjYl9yZWN0YW5nbGVfbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2JfcmVjdGFuZ2xlX2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl9yZWN0YW5nbGVfbmV4dCAoeGNiX3JlY3RhbmdsZV9pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl9yZWN0YW5nbGVfaXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfcmVjdGFuZ2xlX2VuZAorICoqIAorICoqIEBwYXJhbSB4Y2JfcmVjdGFuZ2xlX2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX3JlY3RhbmdsZV9lbmQgKHhjYl9yZWN0YW5nbGVfaXRlcmF0b3JfdCBpICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2JfYXJjX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX2FyY190KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2JfYXJjX25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2FyY19pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2JfYXJjX25leHQgKHhjYl9hcmNfaXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2JfYXJjX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2FyY19lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2FyY19pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9hcmNfZW5kICh4Y2JfYXJjX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX2Zvcm1hdF9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9mb3JtYXRfdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX2Zvcm1hdF9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9mb3JtYXRfaXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX2Zvcm1hdF9uZXh0ICh4Y2JfZm9ybWF0X2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX2Zvcm1hdF9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9mb3JtYXRfZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl9mb3JtYXRfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfZm9ybWF0X2VuZCAoeGNiX2Zvcm1hdF9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl92aXN1YWx0eXBlX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX3Zpc3VhbHR5cGVfdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX3Zpc3VhbHR5cGVfbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2JfdmlzdWFsdHlwZV9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2JfdmlzdWFsdHlwZV9uZXh0ICh4Y2JfdmlzdWFsdHlwZV9pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl92aXN1YWx0eXBlX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX3Zpc3VhbHR5cGVfZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl92aXN1YWx0eXBlX2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX3Zpc3VhbHR5cGVfZW5kICh4Y2JfdmlzdWFsdHlwZV9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCitpbnQKK3hjYl9kZXB0aF9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92aXN1YWx0eXBlX3QgKiB4Y2JfZGVwdGhfdmlzdWFscworICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfZGVwdGhfdCAqUgorICoqIEByZXR1cm5zIHhjYl92aXN1YWx0eXBlX3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfdmlzdWFsdHlwZV90ICoKK3hjYl9kZXB0aF92aXN1YWxzIChjb25zdCB4Y2JfZGVwdGhfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX2RlcHRoX3Zpc3VhbHNfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9kZXB0aF90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX2RlcHRoX3Zpc3VhbHNfbGVuZ3RoIChjb25zdCB4Y2JfZGVwdGhfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfdmlzdWFsdHlwZV9pdGVyYXRvcl90IHhjYl9kZXB0aF92aXN1YWxzX2l0ZXJhdG9yCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9kZXB0aF90ICpSCisgKiogQHJldHVybnMgeGNiX3Zpc3VhbHR5cGVfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfdmlzdWFsdHlwZV9pdGVyYXRvcl90Cit4Y2JfZGVwdGhfdmlzdWFsc19pdGVyYXRvciAoY29uc3QgeGNiX2RlcHRoX3QgKlIgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl9kZXB0aF9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9kZXB0aF90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2JfZGVwdGhfbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2JfZGVwdGhfaXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX2RlcHRoX25leHQgKHhjYl9kZXB0aF9pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl9kZXB0aF9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9kZXB0aF9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2RlcHRoX2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2RlcHRoX2VuZCAoeGNiX2RlcHRoX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKK2ludAoreGNiX3NjcmVlbl9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2Jfc2NyZWVuX2FsbG93ZWRfZGVwdGhzX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2Jfc2NyZWVuX3QgKlIKKyAqKiBAcmV0dXJucyBpbnQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW50Cit4Y2Jfc2NyZWVuX2FsbG93ZWRfZGVwdGhzX2xlbmd0aCAoY29uc3QgeGNiX3NjcmVlbl90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9kZXB0aF9pdGVyYXRvcl90IHhjYl9zY3JlZW5fYWxsb3dlZF9kZXB0aHNfaXRlcmF0b3IKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3NjcmVlbl90ICpSCisgKiogQHJldHVybnMgeGNiX2RlcHRoX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2RlcHRoX2l0ZXJhdG9yX3QKK3hjYl9zY3JlZW5fYWxsb3dlZF9kZXB0aHNfaXRlcmF0b3IgKGNvbnN0IHhjYl9zY3JlZW5fdCAqUiAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX3NjcmVlbl9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9zY3JlZW5fdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX3NjcmVlbl9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9zY3JlZW5faXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX3NjcmVlbl9uZXh0ICh4Y2Jfc2NyZWVuX2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX3NjcmVlbl9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9zY3JlZW5fZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl9zY3JlZW5faXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2Jfc2NyZWVuX2VuZCAoeGNiX3NjcmVlbl9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCitpbnQKK3hjYl9zZXR1cF9yZXF1ZXN0X3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogY2hhciAqIHhjYl9zZXR1cF9yZXF1ZXN0X2F1dGhvcml6YXRpb25fcHJvdG9jb2xfbmFtZQorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2Jfc2V0dXBfcmVxdWVzdF90ICpSCisgKiogQHJldHVybnMgY2hhciAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2NoYXIgKgoreGNiX3NldHVwX3JlcXVlc3RfYXV0aG9yaXphdGlvbl9wcm90b2NvbF9uYW1lIChjb25zdCB4Y2Jfc2V0dXBfcmVxdWVzdF90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2Jfc2V0dXBfcmVxdWVzdF9hdXRob3JpemF0aW9uX3Byb3RvY29sX25hbWVfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9zZXR1cF9yZXF1ZXN0X3QgKlIKKyAqKiBAcmV0dXJucyBpbnQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW50Cit4Y2Jfc2V0dXBfcmVxdWVzdF9hdXRob3JpemF0aW9uX3Byb3RvY29sX25hbWVfbGVuZ3RoIChjb25zdCB4Y2Jfc2V0dXBfcmVxdWVzdF90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX3NldHVwX3JlcXVlc3RfYXV0aG9yaXphdGlvbl9wcm90b2NvbF9uYW1lX2VuZAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2Jfc2V0dXBfcmVxdWVzdF90ICpSCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2Jfc2V0dXBfcmVxdWVzdF9hdXRob3JpemF0aW9uX3Byb3RvY29sX25hbWVfZW5kIChjb25zdCB4Y2Jfc2V0dXBfcmVxdWVzdF90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGNoYXIgKiB4Y2Jfc2V0dXBfcmVxdWVzdF9hdXRob3JpemF0aW9uX3Byb3RvY29sX2RhdGEKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3NldHVwX3JlcXVlc3RfdCAqUgorICoqIEByZXR1cm5zIGNoYXIgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitjaGFyICoKK3hjYl9zZXR1cF9yZXF1ZXN0X2F1dGhvcml6YXRpb25fcHJvdG9jb2xfZGF0YSAoY29uc3QgeGNiX3NldHVwX3JlcXVlc3RfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX3NldHVwX3JlcXVlc3RfYXV0aG9yaXphdGlvbl9wcm90b2NvbF9kYXRhX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2Jfc2V0dXBfcmVxdWVzdF90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX3NldHVwX3JlcXVlc3RfYXV0aG9yaXphdGlvbl9wcm90b2NvbF9kYXRhX2xlbmd0aCAoY29uc3QgeGNiX3NldHVwX3JlcXVlc3RfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9zZXR1cF9yZXF1ZXN0X2F1dGhvcml6YXRpb25fcHJvdG9jb2xfZGF0YV9lbmQKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3NldHVwX3JlcXVlc3RfdCAqUgorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX3NldHVwX3JlcXVlc3RfYXV0aG9yaXphdGlvbl9wcm90b2NvbF9kYXRhX2VuZCAoY29uc3QgeGNiX3NldHVwX3JlcXVlc3RfdCAqUiAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX3NldHVwX3JlcXVlc3RfaXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2Jfc2V0dXBfcmVxdWVzdF90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2Jfc2V0dXBfcmVxdWVzdF9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9zZXR1cF9yZXF1ZXN0X2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl9zZXR1cF9yZXF1ZXN0X25leHQgKHhjYl9zZXR1cF9yZXF1ZXN0X2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX3NldHVwX3JlcXVlc3RfaXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2Jfc2V0dXBfcmVxdWVzdF9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3NldHVwX3JlcXVlc3RfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2Jfc2V0dXBfcmVxdWVzdF9lbmQgKHhjYl9zZXR1cF9yZXF1ZXN0X2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKK2ludAoreGNiX3NldHVwX2ZhaWxlZF9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGNoYXIgKiB4Y2Jfc2V0dXBfZmFpbGVkX3JlYXNvbgorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2Jfc2V0dXBfZmFpbGVkX3QgKlIKKyAqKiBAcmV0dXJucyBjaGFyICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorY2hhciAqCit4Y2Jfc2V0dXBfZmFpbGVkX3JlYXNvbiAoY29uc3QgeGNiX3NldHVwX2ZhaWxlZF90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2Jfc2V0dXBfZmFpbGVkX3JlYXNvbl9sZW5ndGgKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3NldHVwX2ZhaWxlZF90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX3NldHVwX2ZhaWxlZF9yZWFzb25fbGVuZ3RoIChjb25zdCB4Y2Jfc2V0dXBfZmFpbGVkX3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2Jfc2V0dXBfZmFpbGVkX3JlYXNvbl9lbmQKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3NldHVwX2ZhaWxlZF90ICpSCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2Jfc2V0dXBfZmFpbGVkX3JlYXNvbl9lbmQgKGNvbnN0IHhjYl9zZXR1cF9mYWlsZWRfdCAqUiAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX3NldHVwX2ZhaWxlZF9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9zZXR1cF9mYWlsZWRfdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX3NldHVwX2ZhaWxlZF9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9zZXR1cF9mYWlsZWRfaXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX3NldHVwX2ZhaWxlZF9uZXh0ICh4Y2Jfc2V0dXBfZmFpbGVkX2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX3NldHVwX2ZhaWxlZF9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9zZXR1cF9mYWlsZWRfZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl9zZXR1cF9mYWlsZWRfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2Jfc2V0dXBfZmFpbGVkX2VuZCAoeGNiX3NldHVwX2ZhaWxlZF9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCitpbnQKK3hjYl9zZXR1cF9hdXRoZW50aWNhdGVfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBjaGFyICogeGNiX3NldHVwX2F1dGhlbnRpY2F0ZV9yZWFzb24KKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3NldHVwX2F1dGhlbnRpY2F0ZV90ICpSCisgKiogQHJldHVybnMgY2hhciAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2NoYXIgKgoreGNiX3NldHVwX2F1dGhlbnRpY2F0ZV9yZWFzb24gKGNvbnN0IHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX3NldHVwX2F1dGhlbnRpY2F0ZV9yZWFzb25fbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9zZXR1cF9hdXRoZW50aWNhdGVfcmVhc29uX2xlbmd0aCAoY29uc3QgeGNiX3NldHVwX2F1dGhlbnRpY2F0ZV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX3NldHVwX2F1dGhlbnRpY2F0ZV9yZWFzb25fZW5kCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfdCAqUgorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX3NldHVwX2F1dGhlbnRpY2F0ZV9yZWFzb25fZW5kIChjb25zdCB4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX3QgKlIgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfaXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX3QpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB2b2lkIHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl9zZXR1cF9hdXRoZW50aWNhdGVfbmV4dCAoeGNiX3NldHVwX2F1dGhlbnRpY2F0ZV9pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfaXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX2VuZAorICoqIAorICoqIEBwYXJhbSB4Y2Jfc2V0dXBfYXV0aGVudGljYXRlX2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX3NldHVwX2F1dGhlbnRpY2F0ZV9lbmQgKHhjYl9zZXR1cF9hdXRoZW50aWNhdGVfaXRlcmF0b3JfdCBpICAvKio8ICovKTsKKworaW50Cit4Y2Jfc2V0dXBfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBjaGFyICogeGNiX3NldHVwX3ZlbmRvcgorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2Jfc2V0dXBfdCAqUgorICoqIEByZXR1cm5zIGNoYXIgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitjaGFyICoKK3hjYl9zZXR1cF92ZW5kb3IgKGNvbnN0IHhjYl9zZXR1cF90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2Jfc2V0dXBfdmVuZG9yX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2Jfc2V0dXBfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9zZXR1cF92ZW5kb3JfbGVuZ3RoIChjb25zdCB4Y2Jfc2V0dXBfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9zZXR1cF92ZW5kb3JfZW5kCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9zZXR1cF90ICpSCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2Jfc2V0dXBfdmVuZG9yX2VuZCAoY29uc3QgeGNiX3NldHVwX3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2Zvcm1hdF90ICogeGNiX3NldHVwX3BpeG1hcF9mb3JtYXRzCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9zZXR1cF90ICpSCisgKiogQHJldHVybnMgeGNiX2Zvcm1hdF90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2Zvcm1hdF90ICoKK3hjYl9zZXR1cF9waXhtYXBfZm9ybWF0cyAoY29uc3QgeGNiX3NldHVwX3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogaW50IHhjYl9zZXR1cF9waXhtYXBfZm9ybWF0c19sZW5ndGgKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3NldHVwX3QgKlIKKyAqKiBAcmV0dXJucyBpbnQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW50Cit4Y2Jfc2V0dXBfcGl4bWFwX2Zvcm1hdHNfbGVuZ3RoIChjb25zdCB4Y2Jfc2V0dXBfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZm9ybWF0X2l0ZXJhdG9yX3QgeGNiX3NldHVwX3BpeG1hcF9mb3JtYXRzX2l0ZXJhdG9yCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9zZXR1cF90ICpSCisgKiogQHJldHVybnMgeGNiX2Zvcm1hdF9pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9mb3JtYXRfaXRlcmF0b3JfdAoreGNiX3NldHVwX3BpeG1hcF9mb3JtYXRzX2l0ZXJhdG9yIChjb25zdCB4Y2Jfc2V0dXBfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX3NldHVwX3Jvb3RzX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2Jfc2V0dXBfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9zZXR1cF9yb290c19sZW5ndGggKGNvbnN0IHhjYl9zZXR1cF90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9zY3JlZW5faXRlcmF0b3JfdCB4Y2Jfc2V0dXBfcm9vdHNfaXRlcmF0b3IKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3NldHVwX3QgKlIKKyAqKiBAcmV0dXJucyB4Y2Jfc2NyZWVuX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3NjcmVlbl9pdGVyYXRvcl90Cit4Y2Jfc2V0dXBfcm9vdHNfaXRlcmF0b3IgKGNvbnN0IHhjYl9zZXR1cF90ICpSICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2Jfc2V0dXBfaXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2Jfc2V0dXBfdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX3NldHVwX25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3NldHVwX2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl9zZXR1cF9uZXh0ICh4Y2Jfc2V0dXBfaXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2Jfc2V0dXBfaXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2Jfc2V0dXBfZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl9zZXR1cF9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9zZXR1cF9lbmQgKHhjYl9zZXR1cF9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl9jbGllbnRfbWVzc2FnZV9kYXRhX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX2NsaWVudF9tZXNzYWdlX2RhdGFfdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX2NsaWVudF9tZXNzYWdlX2RhdGFfbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2JfY2xpZW50X21lc3NhZ2VfZGF0YV9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2JfY2xpZW50X21lc3NhZ2VfZGF0YV9uZXh0ICh4Y2JfY2xpZW50X21lc3NhZ2VfZGF0YV9pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl9jbGllbnRfbWVzc2FnZV9kYXRhX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2NsaWVudF9tZXNzYWdlX2RhdGFfZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl9jbGllbnRfbWVzc2FnZV9kYXRhX2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2NsaWVudF9tZXNzYWdlX2RhdGFfZW5kICh4Y2JfY2xpZW50X21lc3NhZ2VfZGF0YV9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCitpbnQKK3hjYl9jcmVhdGVfd2luZG93X3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY3JlYXRlX3dpbmRvd19jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgZGVwdGgKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2lkCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHBhcmVudAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB4CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHkKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgd2lkdGgKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgaGVpZ2h0CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGJvcmRlcl93aWR0aAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBfY2xhc3MKKyAqKiBAcGFyYW0geGNiX3Zpc3VhbGlkX3QgICAgdmlzdWFsCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sKKyAqKiBAcGFyYW0gY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY3JlYXRlX3dpbmRvd19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZGVwdGggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aWQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBwYXJlbnQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB4ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHdpZHRoICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgaGVpZ2h0ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgYm9yZGVyX3dpZHRoICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgX2NsYXNzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3Zpc3VhbGlkX3QgICAgdmlzdWFsICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgdmFsdWVfbWFzayAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NyZWF0ZV93aW5kb3cKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBkZXB0aAorICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aWQKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgcGFyZW50CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHgKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgeQorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICB3aWR0aAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBoZWlnaHQKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgYm9yZGVyX3dpZHRoCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIF9jbGFzcworICoqIEBwYXJhbSB4Y2JfdmlzdWFsaWRfdCAgICB2aXN1YWwKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgdmFsdWVfbWFzaworICoqIEBwYXJhbSBjb25zdCB1aW50MzJfdCAgICp2YWx1ZV9saXN0CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jcmVhdGVfd2luZG93ICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGRlcHRoICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpZCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBwYXJlbnQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB5ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHdpZHRoICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBib3JkZXJfd2lkdGggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgX2NsYXNzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHhjYl92aXN1YWxpZF90ICAgIHZpc3VhbCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICB2YWx1ZV9tYXNrICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QgIC8qKjwgKi8pOworCitpbnQKK3hjYl9jaGFuZ2Vfd2luZG93X2F0dHJpYnV0ZXNfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jaGFuZ2Vfd2luZG93X2F0dHJpYnV0ZXNfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICB2YWx1ZV9tYXNrCisgKiogQHBhcmFtIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NoYW5nZV93aW5kb3dfYXR0cmlidXRlc19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NoYW5nZV93aW5kb3dfYXR0cmlidXRlcworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICB2YWx1ZV9tYXNrCisgKiogQHBhcmFtIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NoYW5nZV93aW5kb3dfYXR0cmlidXRlcyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICp2YWx1ZV9saXN0ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfY29va2llX3QgeGNiX2dldF93aW5kb3dfYXR0cmlidXRlcworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEByZXR1cm5zIHhjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF93aW5kb3dfYXR0cmlidXRlc19jb29raWVfdAoreGNiX2dldF93aW5kb3dfYXR0cmlidXRlcyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX2Nvb2tpZV90IHhjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHJldHVybnMgeGNiX2dldF93aW5kb3dfYXR0cmlidXRlc19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX2Nvb2tpZV90Cit4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2dldF93aW5kb3dfYXR0cmlidXRlc191bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX3JlcGx5X3QgKiB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9nZXRfd2luZG93X2F0dHJpYnV0ZXNfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX3JlcGx5X3QgKgoreGNiX2dldF93aW5kb3dfYXR0cmlidXRlc19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2V0X3dpbmRvd19hdHRyaWJ1dGVzX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfZGVzdHJveV93aW5kb3dfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfZGVzdHJveV93aW5kb3dfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2Rlc3Ryb3lfd2luZG93CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9kZXN0cm95X3dpbmRvdyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2Rlc3Ryb3lfc3Vid2luZG93c19jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9kZXN0cm95X3N1YndpbmRvd3NfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9kZXN0cm95X3N1YndpbmRvd3MKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2Rlc3Ryb3lfc3Vid2luZG93cyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jaGFuZ2Vfc2F2ZV9zZXRfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIG1vZGUKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jaGFuZ2Vfc2F2ZV9zZXRfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgbW9kZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jaGFuZ2Vfc2F2ZV9zZXQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBtb2RlCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY2hhbmdlX3NhdmVfc2V0ICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgbW9kZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9yZXBhcmVudF93aW5kb3dfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBwYXJlbnQKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgeAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB5CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9yZXBhcmVudF93aW5kb3dfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBwYXJlbnQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHkgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3JlcGFyZW50X3dpbmRvdworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBwYXJlbnQKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgeAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB5CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9yZXBhcmVudF93aW5kb3cgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBwYXJlbnQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB4ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9tYXBfd2luZG93X2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX21hcF93aW5kb3dfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfbWFwX3dpbmRvdworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfbWFwX3dpbmRvdyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfbWFwX3N1YndpbmRvd3NfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfbWFwX3N1YndpbmRvd3NfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX21hcF9zdWJ3aW5kb3dzCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9tYXBfc3Vid2luZG93cyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3VubWFwX3dpbmRvd19jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl91bm1hcF93aW5kb3dfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl91bm1hcF93aW5kb3cKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3VubWFwX3dpbmRvdyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl91bm1hcF9zdWJ3aW5kb3dzX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3VubWFwX3N1YndpbmRvd3NfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfdW5tYXBfc3Vid2luZG93cworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfdW5tYXBfc3Vid2luZG93cyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8pOworCitpbnQKK3hjYl9jb25maWd1cmVfd2luZG93X3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY29uZmlndXJlX3dpbmRvd19jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHZhbHVlX21hc2sKKyAqKiBAcGFyYW0gY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY29uZmlndXJlX3dpbmRvd19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgdmFsdWVfbWFzayAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NvbmZpZ3VyZV93aW5kb3cKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgdmFsdWVfbWFzaworICoqIEBwYXJhbSBjb25zdCB1aW50MzJfdCAgICp2YWx1ZV9saXN0CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jb25maWd1cmVfd2luZG93ICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB2YWx1ZV9tYXNrICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY2lyY3VsYXRlX3dpbmRvd19jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgZGlyZWN0aW9uCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY2lyY3VsYXRlX3dpbmRvd19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZGlyZWN0aW9uICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jaXJjdWxhdGVfd2luZG93CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgZGlyZWN0aW9uCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY2lyY3VsYXRlX3dpbmRvdyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBkaXJlY3Rpb24gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfZ2VvbWV0cnlfY29va2llX3QgeGNiX2dldF9nZW9tZXRyeQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlCisgKiogQHJldHVybnMgeGNiX2dldF9nZW9tZXRyeV9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X2dlb21ldHJ5X2Nvb2tpZV90Cit4Y2JfZ2V0X2dlb21ldHJ5ICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9nZW9tZXRyeV9jb29raWVfdCB4Y2JfZ2V0X2dlb21ldHJ5X3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlCisgKiogQHJldHVybnMgeGNiX2dldF9nZW9tZXRyeV9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X2dlb21ldHJ5X2Nvb2tpZV90Cit4Y2JfZ2V0X2dlb21ldHJ5X3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfZ2V0X2dlb21ldHJ5X3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfZ2VvbWV0cnlfcmVwbHlfdCAqIHhjYl9nZXRfZ2VvbWV0cnlfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2dldF9nZW9tZXRyeV9jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9nZXRfZ2VvbWV0cnlfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfZ2VvbWV0cnlfcmVwbHlfdCAqCit4Y2JfZ2V0X2dlb21ldHJ5X3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZXRfZ2VvbWV0cnlfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICoqZSAgLyoqPCAqLyk7CisKK2ludAoreGNiX3F1ZXJ5X3RyZWVfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfcXVlcnlfdHJlZV9jb29raWVfdCB4Y2JfcXVlcnlfdHJlZQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEByZXR1cm5zIHhjYl9xdWVyeV90cmVlX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9xdWVyeV90cmVlX2Nvb2tpZV90Cit4Y2JfcXVlcnlfdHJlZSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3F1ZXJ5X3RyZWVfY29va2llX3QgeGNiX3F1ZXJ5X3RyZWVfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHJldHVybnMgeGNiX3F1ZXJ5X3RyZWVfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3F1ZXJ5X3RyZWVfY29va2llX3QKK3hjYl9xdWVyeV90cmVlX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl93aW5kb3dfdCAqIHhjYl9xdWVyeV90cmVlX2NoaWxkcmVuCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9xdWVyeV90cmVlX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2Jfd2luZG93X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfd2luZG93X3QgKgoreGNiX3F1ZXJ5X3RyZWVfY2hpbGRyZW4gKGNvbnN0IHhjYl9xdWVyeV90cmVlX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogaW50IHhjYl9xdWVyeV90cmVlX2NoaWxkcmVuX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfcXVlcnlfdHJlZV9yZXBseV90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX3F1ZXJ5X3RyZWVfY2hpbGRyZW5fbGVuZ3RoIChjb25zdCB4Y2JfcXVlcnlfdHJlZV9yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX3F1ZXJ5X3RyZWVfY2hpbGRyZW5fZW5kCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9xdWVyeV90cmVlX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9xdWVyeV90cmVlX2NoaWxkcmVuX2VuZCAoY29uc3QgeGNiX3F1ZXJ5X3RyZWVfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfcXVlcnlfdHJlZV91bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfcXVlcnlfdHJlZV9yZXBseV90ICogeGNiX3F1ZXJ5X3RyZWVfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9xdWVyeV90cmVlX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9xdWVyeV90cmVlX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcXVlcnlfdHJlZV9yZXBseV90ICoKK3hjYl9xdWVyeV90cmVlX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgeGNiX3F1ZXJ5X3RyZWVfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgKiplICAvKio8ICovKTsKKworaW50Cit4Y2JfaW50ZXJuX2F0b21fc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfaW50ZXJuX2F0b21fY29va2llX3QgeGNiX2ludGVybl9hdG9tCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgb25seV9pZl9leGlzdHMKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgbmFtZV9sZW4KKyAqKiBAcGFyYW0gY29uc3QgY2hhciAgICAgICAqbmFtZQorICoqIEByZXR1cm5zIHhjYl9pbnRlcm5fYXRvbV9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfaW50ZXJuX2F0b21fY29va2llX3QKK3hjYl9pbnRlcm5fYXRvbSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgb25seV9pZl9leGlzdHMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG5hbWVfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpuYW1lICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9pbnRlcm5fYXRvbV9jb29raWVfdCB4Y2JfaW50ZXJuX2F0b21fdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgb25seV9pZl9leGlzdHMKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgbmFtZV9sZW4KKyAqKiBAcGFyYW0gY29uc3QgY2hhciAgICAgICAqbmFtZQorICoqIEByZXR1cm5zIHhjYl9pbnRlcm5fYXRvbV9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfaW50ZXJuX2F0b21fY29va2llX3QKK3hjYl9pbnRlcm5fYXRvbV91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBvbmx5X2lmX2V4aXN0cyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG5hbWVfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqbmFtZSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfaW50ZXJuX2F0b21fdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2ludGVybl9hdG9tX3JlcGx5X3QgKiB4Y2JfaW50ZXJuX2F0b21fcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfaW50ZXJuX2F0b21fY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9pbnRlcm5fYXRvbV9yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2ludGVybl9hdG9tX3JlcGx5X3QgKgoreGNiX2ludGVybl9hdG9tX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB4Y2JfaW50ZXJuX2F0b21fY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAqKmUgIC8qKjwgKi8pOworCitpbnQKK3hjYl9nZXRfYXRvbV9uYW1lX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9hdG9tX25hbWVfY29va2llX3QgeGNiX2dldF9hdG9tX25hbWUKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfYXRvbV90ICAgICAgICBhdG9tCisgKiogQHJldHVybnMgeGNiX2dldF9hdG9tX25hbWVfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9hdG9tX25hbWVfY29va2llX3QKK3hjYl9nZXRfYXRvbV9uYW1lICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIGF0b20gIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9hdG9tX25hbWVfY29va2llX3QgeGNiX2dldF9hdG9tX25hbWVfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2F0b21fdCAgICAgICAgYXRvbQorICoqIEByZXR1cm5zIHhjYl9nZXRfYXRvbV9uYW1lX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfYXRvbV9uYW1lX2Nvb2tpZV90Cit4Y2JfZ2V0X2F0b21fbmFtZV91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIGF0b20gIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogY2hhciAqIHhjYl9nZXRfYXRvbV9uYW1lX25hbWUKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2dldF9hdG9tX25hbWVfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGNoYXIgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitjaGFyICoKK3hjYl9nZXRfYXRvbV9uYW1lX25hbWUgKGNvbnN0IHhjYl9nZXRfYXRvbV9uYW1lX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogaW50IHhjYl9nZXRfYXRvbV9uYW1lX25hbWVfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9nZXRfYXRvbV9uYW1lX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyBpbnQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW50Cit4Y2JfZ2V0X2F0b21fbmFtZV9uYW1lX2xlbmd0aCAoY29uc3QgeGNiX2dldF9hdG9tX25hbWVfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9nZXRfYXRvbV9uYW1lX25hbWVfZW5kCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9nZXRfYXRvbV9uYW1lX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9nZXRfYXRvbV9uYW1lX25hbWVfZW5kIChjb25zdCB4Y2JfZ2V0X2F0b21fbmFtZV9yZXBseV90ICpSICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9nZXRfYXRvbV9uYW1lX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfYXRvbV9uYW1lX3JlcGx5X3QgKiB4Y2JfZ2V0X2F0b21fbmFtZV9yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2dldF9hdG9tX25hbWVfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX2dldF9hdG9tX25hbWVfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfYXRvbV9uYW1lX3JlcGx5X3QgKgoreGNiX2dldF9hdG9tX25hbWVfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2V0X2F0b21fbmFtZV9jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAqKmUgIC8qKjwgKi8pOworCitpbnQKK3hjYl9jaGFuZ2VfcHJvcGVydHlfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jaGFuZ2VfcHJvcGVydHlfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIG1vZGUKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHBhcmFtIHhjYl9hdG9tX3QgICAgICAgIHByb3BlcnR5CisgKiogQHBhcmFtIHhjYl9hdG9tX3QgICAgICAgIHR5cGUKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgZm9ybWF0CisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIGRhdGFfbGVuCisgKiogQHBhcmFtIGNvbnN0IHZvaWQgICAgICAgKmRhdGEKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NoYW5nZV9wcm9wZXJ0eV9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBtb2RlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIHByb3BlcnR5ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICB0eXBlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBmb3JtYXQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGRhdGFfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICpkYXRhICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jaGFuZ2VfcHJvcGVydHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBtb2RlCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEBwYXJhbSB4Y2JfYXRvbV90ICAgICAgICBwcm9wZXJ0eQorICoqIEBwYXJhbSB4Y2JfYXRvbV90ICAgICAgICB0eXBlCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGZvcm1hdAorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBkYXRhX2xlbgorICoqIEBwYXJhbSBjb25zdCB2b2lkICAgICAgICpkYXRhCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jaGFuZ2VfcHJvcGVydHkgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBtb2RlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgcHJvcGVydHkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICB0eXBlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZm9ybWF0ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgZGF0YV9sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICpkYXRhICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2RlbGV0ZV9wcm9wZXJ0eV9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHBhcmFtIHhjYl9hdG9tX3QgICAgICAgIHByb3BlcnR5CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9kZWxldGVfcHJvcGVydHlfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICBwcm9wZXJ0eSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfZGVsZXRlX3Byb3BlcnR5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHBhcmFtIHhjYl9hdG9tX3QgICAgICAgIHByb3BlcnR5CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9kZWxldGVfcHJvcGVydHkgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICBwcm9wZXJ0eSAgLyoqPCAqLyk7CisKK2ludAoreGNiX2dldF9wcm9wZXJ0eV9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfcHJvcGVydHlfY29va2llX3QgeGNiX2dldF9wcm9wZXJ0eQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIF9kZWxldGUKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHBhcmFtIHhjYl9hdG9tX3QgICAgICAgIHByb3BlcnR5CisgKiogQHBhcmFtIHhjYl9hdG9tX3QgICAgICAgIHR5cGUKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgbG9uZ19vZmZzZXQKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgbG9uZ19sZW5ndGgKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X3Byb3BlcnR5X2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfcHJvcGVydHlfY29va2llX3QKK3hjYl9nZXRfcHJvcGVydHkgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBfZGVsZXRlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgcHJvcGVydHkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICB0eXBlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgbG9uZ19vZmZzZXQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBsb25nX2xlbmd0aCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X3Byb3BlcnR5X2Nvb2tpZV90IHhjYl9nZXRfcHJvcGVydHlfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgX2RlbGV0ZQorICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcGFyYW0geGNiX2F0b21fdCAgICAgICAgcHJvcGVydHkKKyAqKiBAcGFyYW0geGNiX2F0b21fdCAgICAgICAgdHlwZQorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBsb25nX29mZnNldAorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBsb25nX2xlbmd0aAorICoqIEByZXR1cm5zIHhjYl9nZXRfcHJvcGVydHlfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9wcm9wZXJ0eV9jb29raWVfdAoreGNiX2dldF9wcm9wZXJ0eV91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgX2RlbGV0ZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgcHJvcGVydHkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgdHlwZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBsb25nX29mZnNldCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBsb25nX2xlbmd0aCAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB2b2lkICogeGNiX2dldF9wcm9wZXJ0eV92YWx1ZQorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfZ2V0X3Byb3BlcnR5X3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB2b2lkICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZCAqCit4Y2JfZ2V0X3Byb3BlcnR5X3ZhbHVlIChjb25zdCB4Y2JfZ2V0X3Byb3BlcnR5X3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogaW50IHhjYl9nZXRfcHJvcGVydHlfdmFsdWVfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9nZXRfcHJvcGVydHlfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9nZXRfcHJvcGVydHlfdmFsdWVfbGVuZ3RoIChjb25zdCB4Y2JfZ2V0X3Byb3BlcnR5X3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfZ2V0X3Byb3BlcnR5X3ZhbHVlX2VuZAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfZ2V0X3Byb3BlcnR5X3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9nZXRfcHJvcGVydHlfdmFsdWVfZW5kIChjb25zdCB4Y2JfZ2V0X3Byb3BlcnR5X3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2dldF9wcm9wZXJ0eV91bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X3Byb3BlcnR5X3JlcGx5X3QgKiB4Y2JfZ2V0X3Byb3BlcnR5X3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9nZXRfcHJvcGVydHlfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X3Byb3BlcnR5X3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X3Byb3BlcnR5X3JlcGx5X3QgKgoreGNiX2dldF9wcm9wZXJ0eV9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2V0X3Byb3BlcnR5X2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAqKmUgIC8qKjwgKi8pOworCitpbnQKK3hjYl9saXN0X3Byb3BlcnRpZXNfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfbGlzdF9wcm9wZXJ0aWVzX2Nvb2tpZV90IHhjYl9saXN0X3Byb3BlcnRpZXMKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcmV0dXJucyB4Y2JfbGlzdF9wcm9wZXJ0aWVzX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9saXN0X3Byb3BlcnRpZXNfY29va2llX3QKK3hjYl9saXN0X3Byb3BlcnRpZXMgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2xpc3RfcHJvcGVydGllc19jb29raWVfdCB4Y2JfbGlzdF9wcm9wZXJ0aWVzX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEByZXR1cm5zIHhjYl9saXN0X3Byb3BlcnRpZXNfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2xpc3RfcHJvcGVydGllc19jb29raWVfdAoreGNiX2xpc3RfcHJvcGVydGllc191bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9hdG9tX3QgKiB4Y2JfbGlzdF9wcm9wZXJ0aWVzX2F0b21zCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9saXN0X3Byb3BlcnRpZXNfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl9hdG9tX3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfYXRvbV90ICoKK3hjYl9saXN0X3Byb3BlcnRpZXNfYXRvbXMgKGNvbnN0IHhjYl9saXN0X3Byb3BlcnRpZXNfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX2xpc3RfcHJvcGVydGllc19hdG9tc19sZW5ndGgKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2xpc3RfcHJvcGVydGllc19yZXBseV90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX2xpc3RfcHJvcGVydGllc19hdG9tc19sZW5ndGggKGNvbnN0IHhjYl9saXN0X3Byb3BlcnRpZXNfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9saXN0X3Byb3BlcnRpZXNfYXRvbXNfZW5kCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9saXN0X3Byb3BlcnRpZXNfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2xpc3RfcHJvcGVydGllc19hdG9tc19lbmQgKGNvbnN0IHhjYl9saXN0X3Byb3BlcnRpZXNfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfbGlzdF9wcm9wZXJ0aWVzX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9saXN0X3Byb3BlcnRpZXNfcmVwbHlfdCAqIHhjYl9saXN0X3Byb3BlcnRpZXNfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2xpc3RfcHJvcGVydGllc19jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9saXN0X3Byb3BlcnRpZXNfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9saXN0X3Byb3BlcnRpZXNfcmVwbHlfdCAqCit4Y2JfbGlzdF9wcm9wZXJ0aWVzX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9saXN0X3Byb3BlcnRpZXNfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICoqZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9zZXRfc2VsZWN0aW9uX293bmVyX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBvd25lcgorICoqIEBwYXJhbSB4Y2JfYXRvbV90ICAgICAgICBzZWxlY3Rpb24KKyAqKiBAcGFyYW0geGNiX3RpbWVzdGFtcF90ICAgdGltZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfc2V0X3NlbGVjdGlvbl9vd25lcl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgb3duZXIgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICBzZWxlY3Rpb24gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICB0aW1lICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9zZXRfc2VsZWN0aW9uX293bmVyCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgb3duZXIKKyAqKiBAcGFyYW0geGNiX2F0b21fdCAgICAgICAgc2VsZWN0aW9uCisgKiogQHBhcmFtIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3NldF9zZWxlY3Rpb25fb3duZXIgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgb3duZXIgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgc2VsZWN0aW9uICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9zZWxlY3Rpb25fb3duZXJfY29va2llX3QgeGNiX2dldF9zZWxlY3Rpb25fb3duZXIKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfYXRvbV90ICAgICAgICBzZWxlY3Rpb24KKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcl9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcl9jb29raWVfdAoreGNiX2dldF9zZWxlY3Rpb25fb3duZXIgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgc2VsZWN0aW9uICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfc2VsZWN0aW9uX293bmVyX2Nvb2tpZV90IHhjYl9nZXRfc2VsZWN0aW9uX293bmVyX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9hdG9tX3QgICAgICAgIHNlbGVjdGlvbgorICoqIEByZXR1cm5zIHhjYl9nZXRfc2VsZWN0aW9uX293bmVyX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfc2VsZWN0aW9uX293bmVyX2Nvb2tpZV90Cit4Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcl91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIHNlbGVjdGlvbiAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcl91bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcl9yZXBseV90ICogeGNiX2dldF9zZWxlY3Rpb25fb3duZXJfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9nZXRfc2VsZWN0aW9uX293bmVyX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9nZXRfc2VsZWN0aW9uX293bmVyX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X3NlbGVjdGlvbl9vd25lcl9yZXBseV90ICoKK3hjYl9nZXRfc2VsZWN0aW9uX293bmVyX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dldF9zZWxlY3Rpb25fb3duZXJfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgKiplICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NvbnZlcnRfc2VsZWN0aW9uX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICByZXF1ZXN0b3IKKyAqKiBAcGFyYW0geGNiX2F0b21fdCAgICAgICAgc2VsZWN0aW9uCisgKiogQHBhcmFtIHhjYl9hdG9tX3QgICAgICAgIHRhcmdldAorICoqIEBwYXJhbSB4Y2JfYXRvbV90ICAgICAgICBwcm9wZXJ0eQorICoqIEBwYXJhbSB4Y2JfdGltZXN0YW1wX3QgICB0aW1lCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jb252ZXJ0X3NlbGVjdGlvbl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHJlcXVlc3RvciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICBzZWxlY3Rpb24gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgdGFyZ2V0ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIHByb3BlcnR5ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NvbnZlcnRfc2VsZWN0aW9uCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgcmVxdWVzdG9yCisgKiogQHBhcmFtIHhjYl9hdG9tX3QgICAgICAgIHNlbGVjdGlvbgorICoqIEBwYXJhbSB4Y2JfYXRvbV90ICAgICAgICB0YXJnZXQKKyAqKiBAcGFyYW0geGNiX2F0b21fdCAgICAgICAgcHJvcGVydHkKKyAqKiBAcGFyYW0geGNiX3RpbWVzdGFtcF90ICAgdGltZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY29udmVydF9zZWxlY3Rpb24gKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHJlcXVlc3RvciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX2F0b21fdCAgICAgICAgc2VsZWN0aW9uICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB4Y2JfYXRvbV90ICAgICAgICB0YXJnZXQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHhjYl9hdG9tX3QgICAgICAgIHByb3BlcnR5ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICB0aW1lICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3NlbmRfZXZlbnRfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIHByb3BhZ2F0ZQorICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBkZXN0aW5hdGlvbgorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBldmVudF9tYXNrCisgKiogQHBhcmFtIGNvbnN0IGNoYXIgICAgICAgKmV2ZW50CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9zZW5kX2V2ZW50X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBwcm9wYWdhdGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBkZXN0aW5hdGlvbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGV2ZW50X21hc2sgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpldmVudCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfc2VuZF9ldmVudAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIHByb3BhZ2F0ZQorICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBkZXN0aW5hdGlvbgorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBldmVudF9tYXNrCisgKiogQHBhcmFtIGNvbnN0IGNoYXIgICAgICAgKmV2ZW50CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9zZW5kX2V2ZW50ICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIHByb3BhZ2F0ZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBkZXN0aW5hdGlvbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBldmVudF9tYXNrICAvKio8ICovLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmV2ZW50ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9ncmFiX3BvaW50ZXJfY29va2llX3QgeGNiX2dyYWJfcG9pbnRlcgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIG93bmVyX2V2ZW50cworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBncmFiX3dpbmRvdworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBldmVudF9tYXNrCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIHBvaW50ZXJfbW9kZQorICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBrZXlib2FyZF9tb2RlCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIGNvbmZpbmVfdG8KKyAqKiBAcGFyYW0geGNiX2N1cnNvcl90ICAgICAgY3Vyc29yCisgKiogQHBhcmFtIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUKKyAqKiBAcmV0dXJucyB4Y2JfZ3JhYl9wb2ludGVyX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9ncmFiX3BvaW50ZXJfY29va2llX3QKK3hjYl9ncmFiX3BvaW50ZXIgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBvd25lcl9ldmVudHMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBncmFiX3dpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGV2ZW50X21hc2sgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBwb2ludGVyX21vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBrZXlib2FyZF9tb2RlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgY29uZmluZV90byAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHhjYl9jdXJzb3JfdCAgICAgIGN1cnNvciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dyYWJfcG9pbnRlcl9jb29raWVfdCB4Y2JfZ3JhYl9wb2ludGVyX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIG93bmVyX2V2ZW50cworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBncmFiX3dpbmRvdworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBldmVudF9tYXNrCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIHBvaW50ZXJfbW9kZQorICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBrZXlib2FyZF9tb2RlCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIGNvbmZpbmVfdG8KKyAqKiBAcGFyYW0geGNiX2N1cnNvcl90ICAgICAgY3Vyc29yCisgKiogQHBhcmFtIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUKKyAqKiBAcmV0dXJucyB4Y2JfZ3JhYl9wb2ludGVyX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9ncmFiX3BvaW50ZXJfY29va2llX3QKK3hjYl9ncmFiX3BvaW50ZXJfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG93bmVyX2V2ZW50cyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBncmFiX3dpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBldmVudF9tYXNrICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIHBvaW50ZXJfbW9kZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBrZXlib2FyZF9tb2RlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGNvbmZpbmVfdG8gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY3Vyc29yICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2dyYWJfcG9pbnRlcl91bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ3JhYl9wb2ludGVyX3JlcGx5X3QgKiB4Y2JfZ3JhYl9wb2ludGVyX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9ncmFiX3BvaW50ZXJfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfZ3JhYl9wb2ludGVyX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ3JhYl9wb2ludGVyX3JlcGx5X3QgKgoreGNiX2dyYWJfcG9pbnRlcl9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ3JhYl9wb2ludGVyX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAqKmUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfdW5ncmFiX3BvaW50ZXJfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3VuZ3JhYl9wb2ludGVyX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgdGltZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfdW5ncmFiX3BvaW50ZXIKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfdGltZXN0YW1wX3QgICB0aW1lCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl91bmdyYWJfcG9pbnRlciAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgdGltZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9ncmFiX2J1dHRvbl9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgb3duZXJfZXZlbnRzCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIGdyYWJfd2luZG93CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGV2ZW50X21hc2sKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgcG9pbnRlcl9tb2RlCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGtleWJvYXJkX21vZGUKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgY29uZmluZV90bworICoqIEBwYXJhbSB4Y2JfY3Vyc29yX3QgICAgICBjdXJzb3IKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgYnV0dG9uCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIG1vZGlmaWVycworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfZ3JhYl9idXR0b25fY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBvd25lcl9ldmVudHMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZXZlbnRfbWFzayAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBwb2ludGVyX21vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAga2V5Ym9hcmRfbW9kZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBjb25maW5lX3RvICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jdXJzb3JfdCAgICAgIGN1cnNvciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBidXR0b24gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbW9kaWZpZXJzICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9ncmFiX2J1dHRvbgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIG93bmVyX2V2ZW50cworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBncmFiX3dpbmRvdworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBldmVudF9tYXNrCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIHBvaW50ZXJfbW9kZQorICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBrZXlib2FyZF9tb2RlCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIGNvbmZpbmVfdG8KKyAqKiBAcGFyYW0geGNiX2N1cnNvcl90ICAgICAgY3Vyc29yCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGJ1dHRvbgorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBtb2RpZmllcnMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2dyYWJfYnV0dG9uICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBvd25lcl9ldmVudHMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGdyYWJfd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBldmVudF9tYXNrICAvKio8ICovLAorICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBwb2ludGVyX21vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGtleWJvYXJkX21vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGNvbmZpbmVfdG8gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIHhjYl9jdXJzb3JfdCAgICAgIGN1cnNvciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgYnV0dG9uICAvKio8ICovLAorICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBtb2RpZmllcnMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfdW5ncmFiX2J1dHRvbl9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgYnV0dG9uCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIGdyYWJfd2luZG93CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIG1vZGlmaWVycworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfdW5ncmFiX2J1dHRvbl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgYnV0dG9uICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBtb2RpZmllcnMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3VuZ3JhYl9idXR0b24KKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBidXR0b24KKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgbW9kaWZpZXJzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl91bmdyYWJfYnV0dG9uICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGJ1dHRvbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBncmFiX3dpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBtb2RpZmllcnMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY2hhbmdlX2FjdGl2ZV9wb2ludGVyX2dyYWJfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jdXJzb3JfdCAgICAgIGN1cnNvcgorICoqIEBwYXJhbSB4Y2JfdGltZXN0YW1wX3QgICB0aW1lCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGV2ZW50X21hc2sKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NoYW5nZV9hY3RpdmVfcG9pbnRlcl9ncmFiX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY3Vyc29yICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZXZlbnRfbWFzayAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY2hhbmdlX2FjdGl2ZV9wb2ludGVyX2dyYWIKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfY3Vyc29yX3QgICAgICBjdXJzb3IKKyAqKiBAcGFyYW0geGNiX3RpbWVzdGFtcF90ICAgdGltZQorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBldmVudF9tYXNrCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jaGFuZ2VfYWN0aXZlX3BvaW50ZXJfZ3JhYiAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY3Vyc29yICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICB0aW1lICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBldmVudF9tYXNrICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9ncmFiX2tleWJvYXJkX2Nvb2tpZV90IHhjYl9ncmFiX2tleWJvYXJkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgb3duZXJfZXZlbnRzCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIGdyYWJfd2luZG93CisgKiogQHBhcmFtIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgcG9pbnRlcl9tb2RlCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGtleWJvYXJkX21vZGUKKyAqKiBAcmV0dXJucyB4Y2JfZ3JhYl9rZXlib2FyZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ3JhYl9rZXlib2FyZF9jb29raWVfdAoreGNiX2dyYWJfa2V5Ym9hcmQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgb3duZXJfZXZlbnRzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGdyYWJfd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgcG9pbnRlcl9tb2RlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGtleWJvYXJkX21vZGUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dyYWJfa2V5Ym9hcmRfY29va2llX3QgeGNiX2dyYWJfa2V5Ym9hcmRfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgb3duZXJfZXZlbnRzCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIGdyYWJfd2luZG93CisgKiogQHBhcmFtIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgcG9pbnRlcl9tb2RlCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGtleWJvYXJkX21vZGUKKyAqKiBAcmV0dXJucyB4Y2JfZ3JhYl9rZXlib2FyZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ3JhYl9rZXlib2FyZF9jb29raWVfdAoreGNiX2dyYWJfa2V5Ym9hcmRfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBvd25lcl9ldmVudHMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGdyYWJfd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICB0aW1lICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBwb2ludGVyX21vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGtleWJvYXJkX21vZGUgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2dyYWJfa2V5Ym9hcmRfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dyYWJfa2V5Ym9hcmRfcmVwbHlfdCAqIHhjYl9ncmFiX2tleWJvYXJkX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfZ3JhYl9rZXlib2FyZF9jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfZ3JhYl9rZXlib2FyZF9yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dyYWJfa2V5Ym9hcmRfcmVwbHlfdCAqCit4Y2JfZ3JhYl9rZXlib2FyZF9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9ncmFiX2tleWJvYXJkX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICoqZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl91bmdyYWJfa2V5Ym9hcmRfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3VuZ3JhYl9rZXlib2FyZF9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICB0aW1lICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl91bmdyYWJfa2V5Ym9hcmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfdGltZXN0YW1wX3QgICB0aW1lCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl91bmdyYWJfa2V5Ym9hcmQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICB0aW1lICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2dyYWJfa2V5X2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBvd25lcl9ldmVudHMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgbW9kaWZpZXJzCisgKiogQHBhcmFtIHhjYl9rZXljb2RlX3QgICAgIGtleQorICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBwb2ludGVyX21vZGUKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAga2V5Ym9hcmRfbW9kZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfZ3JhYl9rZXlfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBvd25lcl9ldmVudHMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbW9kaWZpZXJzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgIHhjYl9rZXljb2RlX3QgICAgIGtleSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBwb2ludGVyX21vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAga2V5Ym9hcmRfbW9kZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfZ3JhYl9rZXkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBvd25lcl9ldmVudHMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgbW9kaWZpZXJzCisgKiogQHBhcmFtIHhjYl9rZXljb2RlX3QgICAgIGtleQorICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBwb2ludGVyX21vZGUKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAga2V5Ym9hcmRfbW9kZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfZ3JhYl9rZXkgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG93bmVyX2V2ZW50cyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG1vZGlmaWVycyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgeGNiX2tleWNvZGVfdCAgICAga2V5ICAvKio8ICovLAorICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBwb2ludGVyX21vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGtleWJvYXJkX21vZGUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfdW5ncmFiX2tleV9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2tleWNvZGVfdCAgICAga2V5CisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIGdyYWJfd2luZG93CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIG1vZGlmaWVycworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfdW5ncmFiX2tleV9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2tleWNvZGVfdCAgICAga2V5ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBtb2RpZmllcnMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3VuZ3JhYl9rZXkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfa2V5Y29kZV90ICAgICBrZXkKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgZ3JhYl93aW5kb3cKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgbW9kaWZpZXJzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl91bmdyYWJfa2V5ICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgIHhjYl9rZXljb2RlX3QgICAgIGtleSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBncmFiX3dpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBtb2RpZmllcnMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfYWxsb3dfZXZlbnRzX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBtb2RlCisgKiogQHBhcmFtIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2FsbG93X2V2ZW50c19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBtb2RlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICB0aW1lICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9hbGxvd19ldmVudHMKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBtb2RlCisgKiogQHBhcmFtIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2FsbG93X2V2ZW50cyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG1vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICB0aW1lICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2dyYWJfc2VydmVyX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfZ3JhYl9zZXJ2ZXJfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfZ3JhYl9zZXJ2ZXIKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfZ3JhYl9zZXJ2ZXIgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfdW5ncmFiX3NlcnZlcl9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3VuZ3JhYl9zZXJ2ZXJfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfdW5ncmFiX3NlcnZlcgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl91bmdyYWJfc2VydmVyICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9xdWVyeV9wb2ludGVyX2Nvb2tpZV90IHhjYl9xdWVyeV9wb2ludGVyCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHJldHVybnMgeGNiX3F1ZXJ5X3BvaW50ZXJfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3F1ZXJ5X3BvaW50ZXJfY29va2llX3QKK3hjYl9xdWVyeV9wb2ludGVyICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfcXVlcnlfcG9pbnRlcl9jb29raWVfdCB4Y2JfcXVlcnlfcG9pbnRlcl91bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcmV0dXJucyB4Y2JfcXVlcnlfcG9pbnRlcl9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcXVlcnlfcG9pbnRlcl9jb29raWVfdAoreGNiX3F1ZXJ5X3BvaW50ZXJfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX3F1ZXJ5X3BvaW50ZXJfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3F1ZXJ5X3BvaW50ZXJfcmVwbHlfdCAqIHhjYl9xdWVyeV9wb2ludGVyX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfcXVlcnlfcG9pbnRlcl9jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfcXVlcnlfcG9pbnRlcl9yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3F1ZXJ5X3BvaW50ZXJfcmVwbHlfdCAqCit4Y2JfcXVlcnlfcG9pbnRlcl9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9xdWVyeV9wb2ludGVyX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICoqZSAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX3RpbWVjb29yZF9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl90aW1lY29vcmRfdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX3RpbWVjb29yZF9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl90aW1lY29vcmRfaXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX3RpbWVjb29yZF9uZXh0ICh4Y2JfdGltZWNvb3JkX2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX3RpbWVjb29yZF9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl90aW1lY29vcmRfZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl90aW1lY29vcmRfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfdGltZWNvb3JkX2VuZCAoeGNiX3RpbWVjb29yZF9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCitpbnQKK3hjYl9nZXRfbW90aW9uX2V2ZW50c19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfbW90aW9uX2V2ZW50c19jb29raWVfdCB4Y2JfZ2V0X21vdGlvbl9ldmVudHMKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcGFyYW0geGNiX3RpbWVzdGFtcF90ICAgc3RhcnQKKyAqKiBAcGFyYW0geGNiX3RpbWVzdGFtcF90ICAgc3RvcAorICoqIEByZXR1cm5zIHhjYl9nZXRfbW90aW9uX2V2ZW50c19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X21vdGlvbl9ldmVudHNfY29va2llX3QKK3hjYl9nZXRfbW90aW9uX2V2ZW50cyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB4Y2JfdGltZXN0YW1wX3QgICBzdGFydCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgc3RvcCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfY29va2llX3QgeGNiX2dldF9tb3Rpb25fZXZlbnRzX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEBwYXJhbSB4Y2JfdGltZXN0YW1wX3QgICBzdGFydAorICoqIEBwYXJhbSB4Y2JfdGltZXN0YW1wX3QgICBzdG9wCisgKiogQHJldHVybnMgeGNiX2dldF9tb3Rpb25fZXZlbnRzX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfbW90aW9uX2V2ZW50c19jb29raWVfdAoreGNiX2dldF9tb3Rpb25fZXZlbnRzX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl90aW1lc3RhbXBfdCAgIHN0YXJ0ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgc3RvcCAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfdGltZWNvb3JkX3QgKiB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfZXZlbnRzCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9nZXRfbW90aW9uX2V2ZW50c19yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX3RpbWVjb29yZF90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3RpbWVjb29yZF90ICoKK3hjYl9nZXRfbW90aW9uX2V2ZW50c19ldmVudHMgKGNvbnN0IHhjYl9nZXRfbW90aW9uX2V2ZW50c19yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfZXZlbnRzX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9nZXRfbW90aW9uX2V2ZW50c19ldmVudHNfbGVuZ3RoIChjb25zdCB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfdGltZWNvb3JkX2l0ZXJhdG9yX3QgeGNiX2dldF9tb3Rpb25fZXZlbnRzX2V2ZW50c19pdGVyYXRvcgorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl90aW1lY29vcmRfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfdGltZWNvb3JkX2l0ZXJhdG9yX3QKK3hjYl9nZXRfbW90aW9uX2V2ZW50c19ldmVudHNfaXRlcmF0b3IgKGNvbnN0IHhjYl9nZXRfbW90aW9uX2V2ZW50c19yZXBseV90ICpSICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9nZXRfbW90aW9uX2V2ZW50c191bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X21vdGlvbl9ldmVudHNfcmVwbHlfdCAqIHhjYl9nZXRfbW90aW9uX2V2ZW50c19yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9nZXRfbW90aW9uX2V2ZW50c19jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX2dldF9tb3Rpb25fZXZlbnRzX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X21vdGlvbl9ldmVudHNfcmVwbHlfdCAqCit4Y2JfZ2V0X21vdGlvbl9ldmVudHNfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZXRfbW90aW9uX2V2ZW50c19jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICoqZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX2Nvb2tpZV90IHhjYl90cmFuc2xhdGVfY29vcmRpbmF0ZXMKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBzcmNfd2luZG93CisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIGRzdF93aW5kb3cKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgc3JjX3gKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgc3JjX3kKKyAqKiBAcmV0dXJucyB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl90cmFuc2xhdGVfY29vcmRpbmF0ZXNfY29va2llX3QKK3hjYl90cmFuc2xhdGVfY29vcmRpbmF0ZXMgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBzcmNfd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZHN0X3dpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHNyY194ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgc3JjX3kgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc19jb29raWVfdCB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHNyY193aW5kb3cKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgZHN0X3dpbmRvdworICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICBzcmNfeAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICBzcmNfeQorICoqIEByZXR1cm5zIHhjYl90cmFuc2xhdGVfY29vcmRpbmF0ZXNfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc19jb29raWVfdAoreGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc191bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgc3JjX3dpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBkc3Rfd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHNyY194ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHNyY195ICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl90cmFuc2xhdGVfY29vcmRpbmF0ZXNfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc19yZXBseV90ICogeGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc19yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc19yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc19yZXBseV90ICoKK3hjYl90cmFuc2xhdGVfY29vcmRpbmF0ZXNfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc19jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICAgKiplICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3dhcnBfcG9pbnRlcl9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgc3JjX3dpbmRvdworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBkc3Rfd2luZG93CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHNyY194CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHNyY195CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHNyY193aWR0aAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBzcmNfaGVpZ2h0CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIGRzdF94CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIGRzdF95CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl93YXJwX3BvaW50ZXJfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgc3JjX3dpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZHN0X3dpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgc3JjX3ggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHNyY195ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBzcmNfd2lkdGggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHNyY19oZWlnaHQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRzdF94ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBkc3RfeSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfd2FycF9wb2ludGVyCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgc3JjX3dpbmRvdworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBkc3Rfd2luZG93CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHNyY194CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHNyY195CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHNyY193aWR0aAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBzcmNfaGVpZ2h0CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIGRzdF94CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIGRzdF95CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl93YXJwX3BvaW50ZXIgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBzcmNfd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgZHN0X3dpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHNyY194ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgc3JjX3kgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBzcmNfd2lkdGggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBzcmNfaGVpZ2h0ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgZHN0X3ggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBkc3RfeSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9zZXRfaW5wdXRfZm9jdXNfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIHJldmVydF90bworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICBmb2N1cworICoqIEBwYXJhbSB4Y2JfdGltZXN0YW1wX3QgICB0aW1lCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9zZXRfaW5wdXRfZm9jdXNfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgcmV2ZXJ0X3RvICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICBmb2N1cyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgdGltZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfc2V0X2lucHV0X2ZvY3VzCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgcmV2ZXJ0X3RvCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIGZvY3VzCisgKiogQHBhcmFtIHhjYl90aW1lc3RhbXBfdCAgIHRpbWUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3NldF9pbnB1dF9mb2N1cyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIHJldmVydF90byAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIGZvY3VzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgeGNiX3RpbWVzdGFtcF90ICAgdGltZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X2lucHV0X2ZvY3VzX2Nvb2tpZV90IHhjYl9nZXRfaW5wdXRfZm9jdXMKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEByZXR1cm5zIHhjYl9nZXRfaW5wdXRfZm9jdXNfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9pbnB1dF9mb2N1c19jb29raWVfdAoreGNiX2dldF9pbnB1dF9mb2N1cyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X2lucHV0X2ZvY3VzX2Nvb2tpZV90IHhjYl9nZXRfaW5wdXRfZm9jdXNfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X2lucHV0X2ZvY3VzX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfaW5wdXRfZm9jdXNfY29va2llX3QKK3hjYl9nZXRfaW5wdXRfZm9jdXNfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9nZXRfaW5wdXRfZm9jdXNfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9pbnB1dF9mb2N1c19yZXBseV90ICogeGNiX2dldF9pbnB1dF9mb2N1c19yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfZ2V0X2lucHV0X2ZvY3VzX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX2dldF9pbnB1dF9mb2N1c19yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9pbnB1dF9mb2N1c19yZXBseV90ICoKK3hjYl9nZXRfaW5wdXRfZm9jdXNfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dldF9pbnB1dF9mb2N1c19jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgKiplICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9xdWVyeV9rZXltYXBfY29va2llX3QgeGNiX3F1ZXJ5X2tleW1hcAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX3F1ZXJ5X2tleW1hcF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcXVlcnlfa2V5bWFwX2Nvb2tpZV90Cit4Y2JfcXVlcnlfa2V5bWFwICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9xdWVyeV9rZXltYXBfY29va2llX3QgeGNiX3F1ZXJ5X2tleW1hcF91bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEByZXR1cm5zIHhjYl9xdWVyeV9rZXltYXBfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3F1ZXJ5X2tleW1hcF9jb29raWVfdAoreGNiX3F1ZXJ5X2tleW1hcF91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX3F1ZXJ5X2tleW1hcF91bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfcXVlcnlfa2V5bWFwX3JlcGx5X3QgKiB4Y2JfcXVlcnlfa2V5bWFwX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9xdWVyeV9rZXltYXBfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfcXVlcnlfa2V5bWFwX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcXVlcnlfa2V5bWFwX3JlcGx5X3QgKgoreGNiX3F1ZXJ5X2tleW1hcF9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfcXVlcnlfa2V5bWFwX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAqKmUgIC8qKjwgKi8pOworCitpbnQKK3hjYl9vcGVuX2ZvbnRfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9vcGVuX2ZvbnRfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9mb250X3QgICAgICAgIGZpZAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbgorICoqIEBwYXJhbSBjb25zdCBjaGFyICAgICAgICpuYW1lCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9vcGVuX2ZvbnRfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX2ZvbnRfdCAgICAgICAgZmlkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqbmFtZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfb3Blbl9mb250CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2ZvbnRfdCAgICAgICAgZmlkCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIG5hbWVfbGVuCisgKiogQHBhcmFtIGNvbnN0IGNoYXIgICAgICAgKm5hbWUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX29wZW5fZm9udCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHhjYl9mb250X3QgICAgICAgIGZpZCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG5hbWVfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqbmFtZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jbG9zZV9mb250X2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfZm9udF90ICAgICAgICBmb250CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jbG9zZV9mb250X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZm9udF90ICAgICAgICBmb250ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jbG9zZV9mb250CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2ZvbnRfdCAgICAgICAgZm9udAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY2xvc2VfZm9udCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB4Y2JfZm9udF90ICAgICAgICBmb250ICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2JfZm9udHByb3BfaXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2JfZm9udHByb3BfdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX2ZvbnRwcm9wX25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2ZvbnRwcm9wX2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl9mb250cHJvcF9uZXh0ICh4Y2JfZm9udHByb3BfaXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2JfZm9udHByb3BfaXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfZm9udHByb3BfZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl9mb250cHJvcF9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9mb250cHJvcF9lbmQgKHhjYl9mb250cHJvcF9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCisvKioKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBpdGVyYXRvcgorICogQHBhcmFtIGkgUG9pbnRlciB0byBhIHhjYl9jaGFyaW5mb19pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9jaGFyaW5mb190KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2JfY2hhcmluZm9fbmV4dAorICoqIAorICoqIEBwYXJhbSB4Y2JfY2hhcmluZm9faXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX2NoYXJpbmZvX25leHQgKHhjYl9jaGFyaW5mb19pdGVyYXRvcl90ICppICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqIEBwYXJhbSBpIEFuIHhjYl9jaGFyaW5mb19pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9jaGFyaW5mb19lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2NoYXJpbmZvX2l0ZXJhdG9yX3QgaQorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2NoYXJpbmZvX2VuZCAoeGNiX2NoYXJpbmZvX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKK2ludAoreGNiX3F1ZXJ5X2ZvbnRfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfcXVlcnlfZm9udF9jb29raWVfdCB4Y2JfcXVlcnlfZm9udAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9mb250YWJsZV90ICAgIGZvbnQKKyAqKiBAcmV0dXJucyB4Y2JfcXVlcnlfZm9udF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcXVlcnlfZm9udF9jb29raWVfdAoreGNiX3F1ZXJ5X2ZvbnQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgeGNiX2ZvbnRhYmxlX3QgICAgZm9udCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfcXVlcnlfZm9udF9jb29raWVfdCB4Y2JfcXVlcnlfZm9udF91bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfZm9udGFibGVfdCAgICBmb250CisgKiogQHJldHVybnMgeGNiX3F1ZXJ5X2ZvbnRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3F1ZXJ5X2ZvbnRfY29va2llX3QKK3hjYl9xdWVyeV9mb250X3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2ZvbnRhYmxlX3QgICAgZm9udCAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZm9udHByb3BfdCAqIHhjYl9xdWVyeV9mb250X3Byb3BlcnRpZXMKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3F1ZXJ5X2ZvbnRfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl9mb250cHJvcF90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2ZvbnRwcm9wX3QgKgoreGNiX3F1ZXJ5X2ZvbnRfcHJvcGVydGllcyAoY29uc3QgeGNiX3F1ZXJ5X2ZvbnRfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX3F1ZXJ5X2ZvbnRfcHJvcGVydGllc19sZW5ndGgKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3F1ZXJ5X2ZvbnRfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9xdWVyeV9mb250X3Byb3BlcnRpZXNfbGVuZ3RoIChjb25zdCB4Y2JfcXVlcnlfZm9udF9yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9mb250cHJvcF9pdGVyYXRvcl90IHhjYl9xdWVyeV9mb250X3Byb3BlcnRpZXNfaXRlcmF0b3IKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3F1ZXJ5X2ZvbnRfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl9mb250cHJvcF9pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9mb250cHJvcF9pdGVyYXRvcl90Cit4Y2JfcXVlcnlfZm9udF9wcm9wZXJ0aWVzX2l0ZXJhdG9yIChjb25zdCB4Y2JfcXVlcnlfZm9udF9yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9jaGFyaW5mb190ICogeGNiX3F1ZXJ5X2ZvbnRfY2hhcl9pbmZvcworICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfcXVlcnlfZm9udF9yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX2NoYXJpbmZvX3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfY2hhcmluZm9fdCAqCit4Y2JfcXVlcnlfZm9udF9jaGFyX2luZm9zIChjb25zdCB4Y2JfcXVlcnlfZm9udF9yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2JfcXVlcnlfZm9udF9jaGFyX2luZm9zX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfcXVlcnlfZm9udF9yZXBseV90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX3F1ZXJ5X2ZvbnRfY2hhcl9pbmZvc19sZW5ndGggKGNvbnN0IHhjYl9xdWVyeV9mb250X3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2NoYXJpbmZvX2l0ZXJhdG9yX3QgeGNiX3F1ZXJ5X2ZvbnRfY2hhcl9pbmZvc19pdGVyYXRvcgorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfcXVlcnlfZm9udF9yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX2NoYXJpbmZvX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2NoYXJpbmZvX2l0ZXJhdG9yX3QKK3hjYl9xdWVyeV9mb250X2NoYXJfaW5mb3NfaXRlcmF0b3IgKGNvbnN0IHhjYl9xdWVyeV9mb250X3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX3F1ZXJ5X2ZvbnRfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3F1ZXJ5X2ZvbnRfcmVwbHlfdCAqIHhjYl9xdWVyeV9mb250X3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfcXVlcnlfZm9udF9jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfcXVlcnlfZm9udF9yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3F1ZXJ5X2ZvbnRfcmVwbHlfdCAqCit4Y2JfcXVlcnlfZm9udF9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgIHhjYl9xdWVyeV9mb250X2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICoqZSAgLyoqPCAqLyk7CisKK2ludAoreGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICBzdHJpbmdfbGVuICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9xdWVyeV90ZXh0X2V4dGVudHNfY29va2llX3QgeGNiX3F1ZXJ5X3RleHRfZXh0ZW50cworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgKmMKKyAqKiBAcGFyYW0geGNiX2ZvbnRhYmxlX3QgICAgICBmb250CisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgICAgc3RyaW5nX2xlbgorICoqIEBwYXJhbSBjb25zdCB4Y2JfY2hhcjJiX3QgKnN0cmluZworICoqIEByZXR1cm5zIHhjYl9xdWVyeV90ZXh0X2V4dGVudHNfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19jb29raWVfdAoreGNiX3F1ZXJ5X3RleHRfZXh0ZW50cyAoeGNiX2Nvbm5lY3Rpb25fdCAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2ZvbnRhYmxlX3QgICAgICBmb250ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBzdHJpbmdfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX2NoYXIyYl90ICpzdHJpbmcgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19jb29raWVfdCB4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgKmMKKyAqKiBAcGFyYW0geGNiX2ZvbnRhYmxlX3QgICAgICBmb250CisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgICAgc3RyaW5nX2xlbgorICoqIEBwYXJhbSBjb25zdCB4Y2JfY2hhcjJiX3QgKnN0cmluZworICoqIEByZXR1cm5zIHhjYl9xdWVyeV90ZXh0X2V4dGVudHNfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19jb29raWVfdAoreGNiX3F1ZXJ5X3RleHRfZXh0ZW50c191bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZm9udGFibGVfdCAgICAgIGZvbnQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBzdHJpbmdfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9jaGFyMmJfdCAqc3RyaW5nICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9xdWVyeV90ZXh0X2V4dGVudHNfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19yZXBseV90ICogeGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfcXVlcnlfdGV4dF9leHRlbnRzX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19yZXBseV90ICoKK3hjYl9xdWVyeV90ZXh0X2V4dGVudHNfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3F1ZXJ5X3RleHRfZXh0ZW50c19jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgKiplICAvKio8ICovKTsKKworaW50Cit4Y2Jfc3RyX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogY2hhciAqIHhjYl9zdHJfbmFtZQorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2Jfc3RyX3QgKlIKKyAqKiBAcmV0dXJucyBjaGFyICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorY2hhciAqCit4Y2Jfc3RyX25hbWUgKGNvbnN0IHhjYl9zdHJfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX3N0cl9uYW1lX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2Jfc3RyX3QgKlIKKyAqKiBAcmV0dXJucyBpbnQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW50Cit4Y2Jfc3RyX25hbWVfbGVuZ3RoIChjb25zdCB4Y2Jfc3RyX3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2Jfc3RyX25hbWVfZW5kCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9zdHJfdCAqUgorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX3N0cl9uYW1lX2VuZCAoY29uc3QgeGNiX3N0cl90ICpSICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2Jfc3RyX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX3N0cl90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2Jfc3RyX25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3N0cl9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2Jfc3RyX25leHQgKHhjYl9zdHJfaXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2Jfc3RyX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX3N0cl9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3N0cl9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9zdHJfZW5kICh4Y2Jfc3RyX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKK2ludAoreGNiX2xpc3RfZm9udHNfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfbGlzdF9mb250c19jb29raWVfdCB4Y2JfbGlzdF9mb250cworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIG1heF9uYW1lcworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBwYXR0ZXJuX2xlbgorICoqIEBwYXJhbSBjb25zdCBjaGFyICAgICAgICpwYXR0ZXJuCisgKiogQHJldHVybnMgeGNiX2xpc3RfZm9udHNfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2xpc3RfZm9udHNfY29va2llX3QKK3hjYl9saXN0X2ZvbnRzICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG1heF9uYW1lcyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBwYXR0ZXJuX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpwYXR0ZXJuICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9saXN0X2ZvbnRzX2Nvb2tpZV90IHhjYl9saXN0X2ZvbnRzX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIG1heF9uYW1lcworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBwYXR0ZXJuX2xlbgorICoqIEBwYXJhbSBjb25zdCBjaGFyICAgICAgICpwYXR0ZXJuCisgKiogQHJldHVybnMgeGNiX2xpc3RfZm9udHNfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2xpc3RfZm9udHNfY29va2llX3QKK3hjYl9saXN0X2ZvbnRzX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbWF4X25hbWVzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBwYXR0ZXJuX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqcGF0dGVybiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX2xpc3RfZm9udHNfbmFtZXNfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9saXN0X2ZvbnRzX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyBpbnQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW50Cit4Y2JfbGlzdF9mb250c19uYW1lc19sZW5ndGggKGNvbnN0IHhjYl9saXN0X2ZvbnRzX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3N0cl9pdGVyYXRvcl90IHhjYl9saXN0X2ZvbnRzX25hbWVzX2l0ZXJhdG9yCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9saXN0X2ZvbnRzX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2Jfc3RyX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3N0cl9pdGVyYXRvcl90Cit4Y2JfbGlzdF9mb250c19uYW1lc19pdGVyYXRvciAoY29uc3QgeGNiX2xpc3RfZm9udHNfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfbGlzdF9mb250c191bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfbGlzdF9mb250c19yZXBseV90ICogeGNiX2xpc3RfZm9udHNfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9saXN0X2ZvbnRzX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9saXN0X2ZvbnRzX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfbGlzdF9mb250c19yZXBseV90ICoKK3hjYl9saXN0X2ZvbnRzX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgeGNiX2xpc3RfZm9udHNfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgKiplICAvKio8ICovKTsKKworaW50Cit4Y2JfbGlzdF9mb250c193aXRoX2luZm9fc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fY29va2llX3QgeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgbWF4X25hbWVzCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHBhdHRlcm5fbGVuCisgKiogQHBhcmFtIGNvbnN0IGNoYXIgICAgICAgKnBhdHRlcm4KKyAqKiBAcmV0dXJucyB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX2Nvb2tpZV90Cit4Y2JfbGlzdF9mb250c193aXRoX2luZm8gKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG1heF9uYW1lcyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgcGF0dGVybl9sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKnBhdHRlcm4gIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX2Nvb2tpZV90IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb191bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBtYXhfbmFtZXMKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgcGF0dGVybl9sZW4KKyAqKiBAcGFyYW0gY29uc3QgY2hhciAgICAgICAqcGF0dGVybgorICoqIEByZXR1cm5zIHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfbGlzdF9mb250c193aXRoX2luZm9fY29va2llX3QKK3hjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb191bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBtYXhfbmFtZXMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBwYXR0ZXJuX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKnBhdHRlcm4gIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2ZvbnRwcm9wX3QgKiB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcHJvcGVydGllcworICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl9mb250cHJvcF90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2ZvbnRwcm9wX3QgKgoreGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3Byb3BlcnRpZXMgKGNvbnN0IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcHJvcGVydGllc19sZW5ndGgKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyBpbnQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW50Cit4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcHJvcGVydGllc19sZW5ndGggKGNvbnN0IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9mb250cHJvcF9pdGVyYXRvcl90IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19wcm9wZXJ0aWVzX2l0ZXJhdG9yCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX2ZvbnRwcm9wX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2ZvbnRwcm9wX2l0ZXJhdG9yX3QKK3hjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19wcm9wZXJ0aWVzX2l0ZXJhdG9yIChjb25zdCB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBjaGFyICogeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX25hbWUKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyBjaGFyICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorY2hhciAqCit4Y2JfbGlzdF9mb250c193aXRoX2luZm9fbmFtZSAoY29uc3QgeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogaW50IHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19uYW1lX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19uYW1lX2xlbmd0aCAoY29uc3QgeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fbmFtZV9lbmQKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19uYW1lX2VuZCAoY29uc3QgeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXBseV90ICogeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfbGlzdF9mb250c193aXRoX2luZm9fcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXBseV90ICoKK3hjYl9saXN0X2ZvbnRzX3dpdGhfaW5mb19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2xpc3RfZm9udHNfd2l0aF9pbmZvX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICAgKiplICAvKio8ICovKTsKKworaW50Cit4Y2Jfc2V0X2ZvbnRfcGF0aF9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3NldF9mb250X3BhdGhfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGZvbnRfcXR5CisgKiogQHBhcmFtIGNvbnN0IHhjYl9zdHJfdCAgKmZvbnQKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3NldF9mb250X3BhdGhfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvbnRfcXR5ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX3N0cl90ICAqZm9udCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfc2V0X2ZvbnRfcGF0aAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGZvbnRfcXR5CisgKiogQHBhcmFtIGNvbnN0IHhjYl9zdHJfdCAgKmZvbnQKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3NldF9mb250X3BhdGggKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZm9udF9xdHkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX3N0cl90ICAqZm9udCAgLyoqPCAqLyk7CisKK2ludAoreGNiX2dldF9mb250X3BhdGhfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X2ZvbnRfcGF0aF9jb29raWVfdCB4Y2JfZ2V0X2ZvbnRfcGF0aAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX2dldF9mb250X3BhdGhfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9mb250X3BhdGhfY29va2llX3QKK3hjYl9nZXRfZm9udF9wYXRoICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfZm9udF9wYXRoX2Nvb2tpZV90IHhjYl9nZXRfZm9udF9wYXRoX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX2dldF9mb250X3BhdGhfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9mb250X3BhdGhfY29va2llX3QKK3hjYl9nZXRfZm9udF9wYXRoX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX2dldF9mb250X3BhdGhfcGF0aF9sZW5ndGgKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2dldF9mb250X3BhdGhfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9nZXRfZm9udF9wYXRoX3BhdGhfbGVuZ3RoIChjb25zdCB4Y2JfZ2V0X2ZvbnRfcGF0aF9yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9zdHJfaXRlcmF0b3JfdCB4Y2JfZ2V0X2ZvbnRfcGF0aF9wYXRoX2l0ZXJhdG9yCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9nZXRfZm9udF9wYXRoX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2Jfc3RyX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3N0cl9pdGVyYXRvcl90Cit4Y2JfZ2V0X2ZvbnRfcGF0aF9wYXRoX2l0ZXJhdG9yIChjb25zdCB4Y2JfZ2V0X2ZvbnRfcGF0aF9yZXBseV90ICpSICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9nZXRfZm9udF9wYXRoX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfZm9udF9wYXRoX3JlcGx5X3QgKiB4Y2JfZ2V0X2ZvbnRfcGF0aF9yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2dldF9mb250X3BhdGhfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX2dldF9mb250X3BhdGhfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfZm9udF9wYXRoX3JlcGx5X3QgKgoreGNiX2dldF9mb250X3BhdGhfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2V0X2ZvbnRfcGF0aF9jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAqKmUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY3JlYXRlX3BpeG1hcF9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgZGVwdGgKKyAqKiBAcGFyYW0geGNiX3BpeG1hcF90ICAgICAgcGlkCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHdpZHRoCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGhlaWdodAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY3JlYXRlX3BpeG1hcF9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZGVwdGggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfcGl4bWFwX3QgICAgICBwaWQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHdpZHRoICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgaGVpZ2h0ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jcmVhdGVfcGl4bWFwCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgZGVwdGgKKyAqKiBAcGFyYW0geGNiX3BpeG1hcF90ICAgICAgcGlkCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHdpZHRoCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGhlaWdodAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY3JlYXRlX3BpeG1hcCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBkZXB0aCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB4Y2JfcGl4bWFwX3QgICAgICBwaWQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgd2lkdGggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgaGVpZ2h0ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2ZyZWVfcGl4bWFwX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfcGl4bWFwX3QgICAgICBwaXhtYXAKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2ZyZWVfcGl4bWFwX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3BpeG1hcF90ICAgICAgcGl4bWFwICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9mcmVlX3BpeG1hcAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9waXhtYXBfdCAgICAgIHBpeG1hcAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfZnJlZV9waXhtYXAgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIHhjYl9waXhtYXBfdCAgICAgIHBpeG1hcCAgLyoqPCAqLyk7CisKK2ludAoreGNiX2NyZWF0ZV9nY19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NyZWF0ZV9nY19jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgY2lkCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sKKyAqKiBAcGFyYW0gY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY3JlYXRlX2djX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGNpZCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NyZWF0ZV9nYworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGNpZAorICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZQorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICB2YWx1ZV9tYXNrCisgKiogQHBhcmFtIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NyZWF0ZV9nYyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGNpZCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgdmFsdWVfbWFzayAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QgIC8qKjwgKi8pOworCitpbnQKK3hjYl9jaGFuZ2VfZ2Nfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jaGFuZ2VfZ2NfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGdjCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sKKyAqKiBAcGFyYW0gY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY2hhbmdlX2djX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICB2YWx1ZV9tYXNrICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICp2YWx1ZV9saXN0ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jaGFuZ2VfZ2MKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICBnYworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICB2YWx1ZV9tYXNrCisgKiogQHBhcmFtIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NoYW5nZV9nYyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgdmFsdWVfbWFzayAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY29weV9nY19jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgc3JjX2djCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGRzdF9nYworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICB2YWx1ZV9tYXNrCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jb3B5X2djX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBzcmNfZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBkc3RfZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICB2YWx1ZV9tYXNrICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jb3B5X2djCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgc3JjX2djCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGRzdF9nYworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICB2YWx1ZV9tYXNrCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jb3B5X2djICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIHNyY19nYyAgLyoqPCAqLywKKyAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBkc3RfZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgdmFsdWVfbWFzayAgLyoqPCAqLyk7CisKK2ludAoreGNiX3NldF9kYXNoZXNfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9zZXRfZGFzaGVzX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICBnYworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBkYXNoX29mZnNldAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBkYXNoZXNfbGVuCisgKiogQHBhcmFtIGNvbnN0IHVpbnQ4X3QgICAgKmRhc2hlcworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfc2V0X2Rhc2hlc19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBkYXNoX29mZnNldCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGRhc2hlc19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICAgICpkYXNoZXMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3NldF9kYXNoZXMKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICBnYworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBkYXNoX29mZnNldAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBkYXNoZXNfbGVuCisgKiogQHBhcmFtIGNvbnN0IHVpbnQ4X3QgICAgKmRhc2hlcworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfc2V0X2Rhc2hlcyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBkYXNoX29mZnNldCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBkYXNoZXNfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgKmRhc2hlcyAgLyoqPCAqLyk7CisKK2ludAoreGNiX3NldF9jbGlwX3JlY3RhbmdsZXNfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgIHJlY3RhbmdsZXNfbGVuICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3NldF9jbGlwX3JlY3RhbmdsZXNfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgICAgICBvcmRlcmluZworICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICAgICAgIGdjCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgICAgICAgY2xpcF94X29yaWdpbgorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICAgICAgIGNsaXBfeV9vcmlnaW4KKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgICAgICByZWN0YW5nbGVzX2xlbgorICoqIEBwYXJhbSBjb25zdCB4Y2JfcmVjdGFuZ2xlX3QgKnJlY3RhbmdsZXMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3NldF9jbGlwX3JlY3RhbmdsZXNfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICAgICBvcmRlcmluZyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgICAgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICAgICAgIGNsaXBfeF9vcmlnaW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICAgICAgIGNsaXBfeV9vcmlnaW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgIHJlY3RhbmdsZXNfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX3JlY3RhbmdsZV90ICpyZWN0YW5nbGVzICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9zZXRfY2xpcF9yZWN0YW5nbGVzCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICAgICAgIG9yZGVyaW5nCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgICAgICAgZ2MKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgICAgICBjbGlwX3hfb3JpZ2luCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgICAgICAgY2xpcF95X29yaWdpbgorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICAgICAgIHJlY3RhbmdsZXNfbGVuCisgKiogQHBhcmFtIGNvbnN0IHhjYl9yZWN0YW5nbGVfdCAqcmVjdGFuZ2xlcworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfc2V0X2NsaXBfcmVjdGFuZ2xlcyAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgb3JkZXJpbmcgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgICAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICAgICAgIGNsaXBfeF9vcmlnaW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgICAgICBjbGlwX3lfb3JpZ2luICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgcmVjdGFuZ2xlc19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX3JlY3RhbmdsZV90ICpyZWN0YW5nbGVzICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2ZyZWVfZ2NfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGdjCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9mcmVlX2djX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfZnJlZV9nYworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGdjCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9mcmVlX2djICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NsZWFyX2FyZWFfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGV4cG9zdXJlcworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgeAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB5CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHdpZHRoCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGhlaWdodAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY2xlYXJfYXJlYV9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZXhwb3N1cmVzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB3aWR0aCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY2xlYXJfYXJlYQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGV4cG9zdXJlcworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgeAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB5CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHdpZHRoCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGhlaWdodAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY2xlYXJfYXJlYSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBleHBvc3VyZXMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB3aWR0aCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBoZWlnaHQgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY29weV9hcmVhX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICBzcmNfZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgZHN0X2RyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGdjCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHNyY194CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHNyY195CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIGRzdF94CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIGRzdF95CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHdpZHRoCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGhlaWdodAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY29weV9hcmVhX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIHNyY19kcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHN0X2RyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgc3JjX3ggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHNyY195ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBkc3RfeCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgZHN0X3kgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHdpZHRoICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBoZWlnaHQgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NvcHlfYXJlYQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIHNyY19kcmF3YWJsZQorICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICBkc3RfZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgZ2MKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgc3JjX3gKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgc3JjX3kKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgZHN0X3gKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgZHN0X3kKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgd2lkdGgKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgaGVpZ2h0CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jb3B5X2FyZWEgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBzcmNfZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkc3RfZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHNyY194ICAvKio8ICovLAorICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgc3JjX3kgIC8qKjwgKi8sCisgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBkc3RfeCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRzdF95ICAvKio8ICovLAorICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgd2lkdGggIC8qKjwgKi8sCisgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBoZWlnaHQgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY29weV9wbGFuZV9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgc3JjX2RyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRzdF9kcmF3YWJsZQorICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICBnYworICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICBzcmNfeAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICBzcmNfeQorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICBkc3RfeAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICBkc3RfeQorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICB3aWR0aAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBoZWlnaHQKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgYml0X3BsYW5lCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jb3B5X3BsYW5lX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBzcmNfZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkc3RfZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHNyY194ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgc3JjX3kgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBkc3RfeCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRzdF95ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgd2lkdGggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBoZWlnaHQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBiaXRfcGxhbmUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NvcHlfcGxhbmUKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICBzcmNfZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgZHN0X2RyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGdjCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHNyY194CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHNyY195CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIGRzdF94CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIGRzdF95CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHdpZHRoCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGhlaWdodAorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBiaXRfcGxhbmUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NvcHlfcGxhbmUgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgc3JjX2RyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRzdF9kcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBzcmNfeCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBzcmNfeSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBkc3RfeCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBkc3RfeSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB3aWR0aCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBoZWlnaHQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgYml0X3BsYW5lICAvKio8ICovKTsKKworaW50Cit4Y2JfcG9seV9wb2ludF9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgcG9pbnRzX2xlbiAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9wb2x5X3BvaW50X2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgIGNvb3JkaW5hdGVfbW9kZQorICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgIGdjCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgICBwb2ludHNfbGVuCisgKiogQHBhcmFtIGNvbnN0IHhjYl9wb2ludF90ICpwb2ludHMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3BvbHlfcG9pbnRfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICAgY29vcmRpbmF0ZV9tb2RlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgIHBvaW50c19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfcG9pbnRfdCAqcG9pbnRzICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9wb2x5X3BvaW50CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgICBjb29yZGluYXRlX21vZGUKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgICBnYworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICAgcG9pbnRzX2xlbgorICoqIEBwYXJhbSBjb25zdCB4Y2JfcG9pbnRfdCAqcG9pbnRzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9wb2x5X3BvaW50ICh4Y2JfY29ubmVjdGlvbl90ICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICAgY29vcmRpbmF0ZV9tb2RlICAvKio8ICovLAorICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgIHBvaW50c19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgY29uc3QgeGNiX3BvaW50X3QgKnBvaW50cyAgLyoqPCAqLyk7CisKK2ludAoreGNiX3BvbHlfbGluZV9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICBwb2ludHNfbGVuICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3BvbHlfbGluZV9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgICBjb29yZGluYXRlX21vZGUKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgICBnYworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICAgcG9pbnRzX2xlbgorICoqIEBwYXJhbSBjb25zdCB4Y2JfcG9pbnRfdCAqcG9pbnRzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9wb2x5X2xpbmVfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICBjb29yZGluYXRlX21vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgcG9pbnRzX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX3BvaW50X3QgKnBvaW50cyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfcG9seV9saW5lCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgICBjb29yZGluYXRlX21vZGUKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgICBnYworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICAgcG9pbnRzX2xlbgorICoqIEBwYXJhbSBjb25zdCB4Y2JfcG9pbnRfdCAqcG9pbnRzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9wb2x5X2xpbmUgKHhjYl9jb25uZWN0aW9uX3QgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgIGNvb3JkaW5hdGVfbW9kZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICBwb2ludHNfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgY29uc3QgeGNiX3BvaW50X3QgKnBvaW50cyAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX3NlZ21lbnRfaXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2Jfc2VnbWVudF90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2Jfc2VnbWVudF9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9zZWdtZW50X2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl9zZWdtZW50X25leHQgKHhjYl9zZWdtZW50X2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX3NlZ21lbnRfaXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2Jfc2VnbWVudF9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX3NlZ21lbnRfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2Jfc2VnbWVudF9lbmQgKHhjYl9zZWdtZW50X2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKK2ludAoreGNiX3BvbHlfc2VnbWVudF9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICBzZWdtZW50c19sZW4gIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfcG9seV9zZWdtZW50X2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAqYworICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICAgICBkcmF3YWJsZQorICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICAgICBnYworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICAgICBzZWdtZW50c19sZW4KKyAqKiBAcGFyYW0gY29uc3QgeGNiX3NlZ21lbnRfdCAqc2VnbWVudHMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3BvbHlfc2VnbWVudF9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIHNlZ21lbnRzX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX3NlZ21lbnRfdCAqc2VnbWVudHMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3BvbHlfc2VnbWVudAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgICAgIGdjCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgICAgIHNlZ21lbnRzX2xlbgorICoqIEBwYXJhbSBjb25zdCB4Y2Jfc2VnbWVudF90ICpzZWdtZW50cworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfcG9seV9zZWdtZW50ICh4Y2JfY29ubmVjdGlvbl90ICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIHNlZ21lbnRzX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9zZWdtZW50X3QgKnNlZ21lbnRzICAvKio8ICovKTsKKworaW50Cit4Y2JfcG9seV9yZWN0YW5nbGVfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICByZWN0YW5nbGVzX2xlbiAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9wb2x5X3JlY3RhbmdsZV9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAqYworICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICAgICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgICAgICAgZ2MKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgICAgICByZWN0YW5nbGVzX2xlbgorICoqIEBwYXJhbSBjb25zdCB4Y2JfcmVjdGFuZ2xlX3QgKnJlY3RhbmdsZXMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3BvbHlfcmVjdGFuZ2xlX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICAgICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgICAgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICByZWN0YW5nbGVzX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfcmVjdGFuZ2xlX3QgKnJlY3RhbmdsZXMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3BvbHlfcmVjdGFuZ2xlCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAqYworICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICAgICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgICAgICAgZ2MKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgICAgICByZWN0YW5nbGVzX2xlbgorICoqIEBwYXJhbSBjb25zdCB4Y2JfcmVjdGFuZ2xlX3QgKnJlY3RhbmdsZXMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3BvbHlfcmVjdGFuZ2xlICh4Y2JfY29ubmVjdGlvbl90ICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgICAgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgICAgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgcmVjdGFuZ2xlc19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9yZWN0YW5nbGVfdCAqcmVjdGFuZ2xlcyAgLyoqPCAqLyk7CisKK2ludAoreGNiX3BvbHlfYXJjX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgYXJjc19sZW4gIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfcG9seV9hcmNfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGdjCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIGFyY3NfbGVuCisgKiogQHBhcmFtIGNvbnN0IHhjYl9hcmNfdCAgKmFyY3MKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3BvbHlfYXJjX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgYXJjc19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX2FyY190ICAqYXJjcyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfcG9seV9hcmMKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZQorICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICBnYworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBhcmNzX2xlbgorICoqIEBwYXJhbSBjb25zdCB4Y2JfYXJjX3QgICphcmNzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9wb2x5X2FyYyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBhcmNzX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgY29uc3QgeGNiX2FyY190ICAqYXJjcyAgLyoqPCAqLyk7CisKK2ludAoreGNiX2ZpbGxfcG9seV9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICBwb2ludHNfbGVuICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2ZpbGxfcG9seV9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgICBkcmF3YWJsZQorICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICAgZ2MKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgIHNoYXBlCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgICBjb29yZGluYXRlX21vZGUKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgIHBvaW50c19sZW4KKyAqKiBAcGFyYW0gY29uc3QgeGNiX3BvaW50X3QgKnBvaW50cworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfZmlsbF9wb2x5X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgIHNoYXBlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICAgY29vcmRpbmF0ZV9tb2RlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgcG9pbnRzX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX3BvaW50X3QgKnBvaW50cyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfZmlsbF9wb2x5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgICBkcmF3YWJsZQorICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICAgZ2MKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgIHNoYXBlCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgICBjb29yZGluYXRlX21vZGUKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgIHBvaW50c19sZW4KKyAqKiBAcGFyYW0gY29uc3QgeGNiX3BvaW50X3QgKnBvaW50cworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfZmlsbF9wb2x5ICh4Y2JfY29ubmVjdGlvbl90ICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICBzaGFwZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICBjb29yZGluYXRlX21vZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgcG9pbnRzX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIGNvbnN0IHhjYl9wb2ludF90ICpwb2ludHMgIC8qKjwgKi8pOworCitpbnQKK3hjYl9wb2x5X2ZpbGxfcmVjdGFuZ2xlX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICByZWN0YW5nbGVzX2xlbiAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9wb2x5X2ZpbGxfcmVjdGFuZ2xlX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgICAgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgICAgICBnYworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICAgICAgIHJlY3RhbmdsZXNfbGVuCisgKiogQHBhcmFtIGNvbnN0IHhjYl9yZWN0YW5nbGVfdCAqcmVjdGFuZ2xlcworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfcG9seV9maWxsX3JlY3RhbmdsZV9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICAgICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgICAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgcmVjdGFuZ2xlc19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfcmVjdGFuZ2xlX3QgKnJlY3RhbmdsZXMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3BvbHlfZmlsbF9yZWN0YW5nbGUKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgICAgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgICAgICBnYworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICAgICAgIHJlY3RhbmdsZXNfbGVuCisgKiogQHBhcmFtIGNvbnN0IHhjYl9yZWN0YW5nbGVfdCAqcmVjdGFuZ2xlcworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfcG9seV9maWxsX3JlY3RhbmdsZSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgICAgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgICAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgIHJlY3RhbmdsZXNfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9yZWN0YW5nbGVfdCAqcmVjdGFuZ2xlcyAgLyoqPCAqLyk7CisKK2ludAoreGNiX3BvbHlfZmlsbF9hcmNfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgIGFyY3NfbGVuICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3BvbHlfZmlsbF9hcmNfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGdjCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIGFyY3NfbGVuCisgKiogQHBhcmFtIGNvbnN0IHhjYl9hcmNfdCAgKmFyY3MKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3BvbHlfZmlsbF9hcmNfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBhcmNzX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9hcmNfdCAgKmFyY3MgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3BvbHlfZmlsbF9hcmMKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZQorICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICBnYworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBhcmNzX2xlbgorICoqIEBwYXJhbSBjb25zdCB4Y2JfYXJjX3QgICphcmNzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9wb2x5X2ZpbGxfYXJjICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGFyY3NfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9hcmNfdCAgKmFyY3MgIC8qKjwgKi8pOworCitpbnQKK3hjYl9wdXRfaW1hZ2Vfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgZGF0YV9sZW4gIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfcHV0X2ltYWdlX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBmb3JtYXQKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgZ2MKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgd2lkdGgKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgaGVpZ2h0CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIGRzdF94CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIGRzdF95CisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGxlZnRfcGFkCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGRlcHRoCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIGRhdGFfbGVuCisgKiogQHBhcmFtIGNvbnN0IHVpbnQ4X3QgICAgKmRhdGEKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3B1dF9pbWFnZV9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBmb3JtYXQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgd2lkdGggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgZHN0X3ggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRzdF95ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBsZWZ0X3BhZCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZGVwdGggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGRhdGFfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICAgICpkYXRhICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9wdXRfaW1hZ2UKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBmb3JtYXQKKyAqKiBAcGFyYW0geGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgZ2MKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgd2lkdGgKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgaGVpZ2h0CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIGRzdF94CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIGRzdF95CisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGxlZnRfcGFkCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGRlcHRoCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIGRhdGFfbGVuCisgKiogQHBhcmFtIGNvbnN0IHVpbnQ4X3QgICAgKmRhdGEKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3B1dF9pbWFnZSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGZvcm1hdCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB3aWR0aCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRzdF94ICAvKio8ICovLAorICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgZHN0X3kgIC8qKjwgKi8sCisgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBsZWZ0X3BhZCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGRlcHRoICAvKio8ICovLAorICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgZGF0YV9sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICAgICpkYXRhICAvKio8ICovKTsKKworaW50Cit4Y2JfZ2V0X2ltYWdlX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9pbWFnZV9jb29raWVfdCB4Y2JfZ2V0X2ltYWdlCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgZm9ybWF0CisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHgKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgeQorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICB3aWR0aAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBoZWlnaHQKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgcGxhbmVfbWFzaworICoqIEByZXR1cm5zIHhjYl9nZXRfaW1hZ2VfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9pbWFnZV9jb29raWVfdAoreGNiX2dldF9pbWFnZSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGZvcm1hdCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB3aWR0aCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGhlaWdodCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHBsYW5lX21hc2sgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9pbWFnZV9jb29raWVfdCB4Y2JfZ2V0X2ltYWdlX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGZvcm1hdAorICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZQorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB4CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHkKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgd2lkdGgKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgaGVpZ2h0CisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIHBsYW5lX21hc2sKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X2ltYWdlX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfaW1hZ2VfY29va2llX3QKK3hjYl9nZXRfaW1hZ2VfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGZvcm1hdCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB4ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgd2lkdGggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgaGVpZ2h0ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHBsYW5lX21hc2sgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdWludDhfdCAqIHhjYl9nZXRfaW1hZ2VfZGF0YQorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfZ2V0X2ltYWdlX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB1aW50OF90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordWludDhfdCAqCit4Y2JfZ2V0X2ltYWdlX2RhdGEgKGNvbnN0IHhjYl9nZXRfaW1hZ2VfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX2dldF9pbWFnZV9kYXRhX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfZ2V0X2ltYWdlX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyBpbnQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW50Cit4Y2JfZ2V0X2ltYWdlX2RhdGFfbGVuZ3RoIChjb25zdCB4Y2JfZ2V0X2ltYWdlX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfZ2V0X2ltYWdlX2RhdGFfZW5kCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9nZXRfaW1hZ2VfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2dldF9pbWFnZV9kYXRhX2VuZCAoY29uc3QgeGNiX2dldF9pbWFnZV9yZXBseV90ICpSICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9nZXRfaW1hZ2VfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9pbWFnZV9yZXBseV90ICogeGNiX2dldF9pbWFnZV9yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfZ2V0X2ltYWdlX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgKiplCisgKiogQHJldHVybnMgeGNiX2dldF9pbWFnZV9yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9pbWFnZV9yZXBseV90ICoKK3hjYl9nZXRfaW1hZ2VfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgeGNiX2dldF9pbWFnZV9jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgKiplICAvKio8ICovKTsKKworaW50Cit4Y2JfcG9seV90ZXh0Xzhfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICBpdGVtc19sZW4gIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfcG9seV90ZXh0XzhfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGdjCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHgKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgeQorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBpdGVtc19sZW4KKyAqKiBAcGFyYW0gY29uc3QgdWludDhfdCAgICAqaXRlbXMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3BvbHlfdGV4dF84X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB5ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGl0ZW1zX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICAgICppdGVtcyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfcG9seV90ZXh0XzgKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZQorICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICBnYworICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB4CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHkKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgaXRlbXNfbGVuCisgKiogQHBhcmFtIGNvbnN0IHVpbnQ4X3QgICAgKml0ZW1zCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9wb2x5X3RleHRfOCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB4ICAvKio8ICovLAorICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB5ICAvKio8ICovLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBpdGVtc19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgKml0ZW1zICAvKio8ICovKTsKKworaW50Cit4Y2JfcG9seV90ZXh0XzE2X3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgIGl0ZW1zX2xlbiAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9wb2x5X3RleHRfMTZfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGdjCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHgKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgeQorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBpdGVtc19sZW4KKyAqKiBAcGFyYW0gY29uc3QgdWludDhfdCAgICAqaXRlbXMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3BvbHlfdGV4dF8xNl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGl0ZW1zX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAgICAqaXRlbXMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3BvbHlfdGV4dF8xNgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGdjCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHgKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgeQorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBpdGVtc19sZW4KKyAqKiBAcGFyYW0gY29uc3QgdWludDhfdCAgICAqaXRlbXMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3BvbHlfdGV4dF8xNiAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB4ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgeSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIGl0ZW1zX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICAgKml0ZW1zICAvKio8ICovKTsKKworaW50Cit4Y2JfaW1hZ2VfdGV4dF84X3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfaW1hZ2VfdGV4dF84X2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBzdHJpbmdfbGVuCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgIGdjCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHgKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgeQorICoqIEBwYXJhbSBjb25zdCBjaGFyICAgICAgICpzdHJpbmcKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2ltYWdlX3RleHRfOF9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBzdHJpbmdfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2djb250ZXh0X3QgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKnN0cmluZyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfaW1hZ2VfdGV4dF84CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgc3RyaW5nX2xlbgorICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZQorICoqIEBwYXJhbSB4Y2JfZ2NvbnRleHRfdCAgICBnYworICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB4CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHkKKyAqKiBAcGFyYW0gY29uc3QgY2hhciAgICAgICAqc3RyaW5nCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9pbWFnZV90ZXh0XzggKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBzdHJpbmdfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgeGNiX2RyYXdhYmxlX3QgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICBnYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB5ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqc3RyaW5nICAvKio8ICovKTsKKworaW50Cit4Y2JfaW1hZ2VfdGV4dF8xNl9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2ltYWdlX3RleHRfMTZfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgICBzdHJpbmdfbGVuCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgICAgZHJhd2FibGUKKyAqKiBAcGFyYW0geGNiX2djb250ZXh0X3QgICAgICBnYworICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICAgIHgKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgICB5CisgKiogQHBhcmFtIGNvbnN0IHhjYl9jaGFyMmJfdCAqc3RyaW5nCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9pbWFnZV90ZXh0XzE2X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgc3RyaW5nX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgICAgZHJhd2FibGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2NvbnRleHRfdCAgICAgIGdjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgICB4ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgICB5ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX2NoYXIyYl90ICpzdHJpbmcgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2ltYWdlX3RleHRfMTYKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgICAgc3RyaW5nX2xlbgorICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHhjYl9nY29udGV4dF90ICAgICAgZ2MKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgICB4CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgICAgeQorICoqIEBwYXJhbSBjb25zdCB4Y2JfY2hhcjJiX3QgKnN0cmluZworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfaW1hZ2VfdGV4dF8xNiAoeGNiX2Nvbm5lY3Rpb25fdCAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgc3RyaW5nX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHhjYl9nY29udGV4dF90ICAgICAgZ2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgICB4ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgICAgeSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfY2hhcjJiX3QgKnN0cmluZyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jcmVhdGVfY29sb3JtYXBfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGFsbG9jCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIG1pZAorICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcGFyYW0geGNiX3Zpc3VhbGlkX3QgICAgdmlzdWFsCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jcmVhdGVfY29sb3JtYXBfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgYWxsb2MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIG1pZCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfdmlzdWFsaWRfdCAgICB2aXN1YWwgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NyZWF0ZV9jb2xvcm1hcAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGFsbG9jCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIG1pZAorICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcGFyYW0geGNiX3Zpc3VhbGlkX3QgICAgdmlzdWFsCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jcmVhdGVfY29sb3JtYXAgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBhbGxvYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIG1pZCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHhjYl92aXN1YWxpZF90ICAgIHZpc3VhbCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9mcmVlX2NvbG9ybWFwX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfY29sb3JtYXBfdCAgICBjbWFwCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9mcmVlX2NvbG9ybWFwX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9mcmVlX2NvbG9ybWFwCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgY21hcAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfZnJlZV9jb2xvcm1hcCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NvcHlfY29sb3JtYXBfYW5kX2ZyZWVfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIG1pZAorICoqIEBwYXJhbSB4Y2JfY29sb3JtYXBfdCAgICBzcmNfY21hcAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY29weV9jb2xvcm1hcF9hbmRfZnJlZV9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgbWlkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgc3JjX2NtYXAgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NvcHlfY29sb3JtYXBfYW5kX2ZyZWUKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfY29sb3JtYXBfdCAgICBtaWQKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgc3JjX2NtYXAKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NvcHlfY29sb3JtYXBfYW5kX2ZyZWUgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgbWlkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIHNyY19jbWFwICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2luc3RhbGxfY29sb3JtYXBfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2luc3RhbGxfY29sb3JtYXBfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2luc3RhbGxfY29sb3JtYXAKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfY29sb3JtYXBfdCAgICBjbWFwCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9pbnN0YWxsX2NvbG9ybWFwICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfdW5pbnN0YWxsX2NvbG9ybWFwX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfY29sb3JtYXBfdCAgICBjbWFwCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl91bmluc3RhbGxfY29sb3JtYXBfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfdW5pbnN0YWxsX2NvbG9ybWFwCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgY21hcAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfdW5pbnN0YWxsX2NvbG9ybWFwICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLyoqPCAqLyk7CisKK2ludAoreGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfY29va2llX3QgeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwcworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEByZXR1cm5zIHhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19jb29raWVfdAoreGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwcyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX2Nvb2tpZV90IHhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX3dpbmRvd190ICAgICAgd2luZG93CisgKiogQHJldHVybnMgeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX2Nvb2tpZV90Cit4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2NvbG9ybWFwX3QgKiB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX2NtYXBzCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl9jb2xvcm1hcF90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2NvbG9ybWFwX3QgKgoreGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19jbWFwcyAoY29uc3QgeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX2NtYXBzX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyBpbnQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW50Cit4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX2NtYXBzX2xlbmd0aCAoY29uc3QgeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19jbWFwc19lbmQKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX2NtYXBzX2VuZCAoY29uc3QgeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19yZXBseV90ICpSICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19yZXBseV90ICogeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfbGlzdF9pbnN0YWxsZWRfY29sb3JtYXBzX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19yZXBseV90ICoKK3hjYl9saXN0X2luc3RhbGxlZF9jb2xvcm1hcHNfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2xpc3RfaW5zdGFsbGVkX2NvbG9ybWFwc19jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICAgICAgKiplICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9hbGxvY19jb2xvcl9jb29raWVfdCB4Y2JfYWxsb2NfY29sb3IKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfY29sb3JtYXBfdCAgICBjbWFwCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHJlZAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBncmVlbgorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBibHVlCisgKiogQHJldHVybnMgeGNiX2FsbG9jX2NvbG9yX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9hbGxvY19jb2xvcl9jb29raWVfdAoreGNiX2FsbG9jX2NvbG9yICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAvKio8ICovLAorICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICByZWQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGdyZWVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBibHVlICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9hbGxvY19jb2xvcl9jb29raWVfdCB4Y2JfYWxsb2NfY29sb3JfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgY21hcAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICByZWQKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgZ3JlZW4KKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgYmx1ZQorICoqIEByZXR1cm5zIHhjYl9hbGxvY19jb2xvcl9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfYWxsb2NfY29sb3JfY29va2llX3QKK3hjYl9hbGxvY19jb2xvcl91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgcmVkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZ3JlZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBibHVlICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9hbGxvY19jb2xvcl91bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfYWxsb2NfY29sb3JfcmVwbHlfdCAqIHhjYl9hbGxvY19jb2xvcl9yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9hbGxvY19jb2xvcl9jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX2FsbG9jX2NvbG9yX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfYWxsb2NfY29sb3JfcmVwbHlfdCAqCit4Y2JfYWxsb2NfY29sb3JfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHhjYl9hbGxvY19jb2xvcl9jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICoqZSAgLyoqPCAqLyk7CisKK2ludAoreGNiX2FsbG9jX25hbWVkX2NvbG9yX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2FsbG9jX25hbWVkX2NvbG9yX2Nvb2tpZV90IHhjYl9hbGxvY19uYW1lZF9jb2xvcgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgbmFtZV9sZW4KKyAqKiBAcGFyYW0gY29uc3QgY2hhciAgICAgICAqbmFtZQorICoqIEByZXR1cm5zIHhjYl9hbGxvY19uYW1lZF9jb2xvcl9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfYWxsb2NfbmFtZWRfY29sb3JfY29va2llX3QKK3hjYl9hbGxvY19uYW1lZF9jb2xvciAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbmFtZV9sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKm5hbWUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2FsbG9jX25hbWVkX2NvbG9yX2Nvb2tpZV90IHhjYl9hbGxvY19uYW1lZF9jb2xvcl91bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfY29sb3JtYXBfdCAgICBjbWFwCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIG5hbWVfbGVuCisgKiogQHBhcmFtIGNvbnN0IGNoYXIgICAgICAgKm5hbWUKKyAqKiBAcmV0dXJucyB4Y2JfYWxsb2NfbmFtZWRfY29sb3JfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2FsbG9jX25hbWVkX2NvbG9yX2Nvb2tpZV90Cit4Y2JfYWxsb2NfbmFtZWRfY29sb3JfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG5hbWVfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqbmFtZSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfYWxsb2NfbmFtZWRfY29sb3JfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2FsbG9jX25hbWVkX2NvbG9yX3JlcGx5X3QgKiB4Y2JfYWxsb2NfbmFtZWRfY29sb3JfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfYWxsb2NfbmFtZWRfY29sb3JfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9hbGxvY19uYW1lZF9jb2xvcl9yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2FsbG9jX25hbWVkX2NvbG9yX3JlcGx5X3QgKgoreGNiX2FsbG9jX25hbWVkX2NvbG9yX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfYWxsb2NfbmFtZWRfY29sb3JfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCitpbnQKK3hjYl9hbGxvY19jb2xvcl9jZWxsc19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9hbGxvY19jb2xvcl9jZWxsc19jb29raWVfdCB4Y2JfYWxsb2NfY29sb3JfY2VsbHMKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBjb250aWd1b3VzCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgY29sb3JzCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHBsYW5lcworICoqIEByZXR1cm5zIHhjYl9hbGxvY19jb2xvcl9jZWxsc19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfYWxsb2NfY29sb3JfY2VsbHNfY29va2llX3QKK3hjYl9hbGxvY19jb2xvcl9jZWxscyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgY29udGlndW91cyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgY29sb3JzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBwbGFuZXMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2FsbG9jX2NvbG9yX2NlbGxzX2Nvb2tpZV90IHhjYl9hbGxvY19jb2xvcl9jZWxsc191bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBjb250aWd1b3VzCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgY29sb3JzCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHBsYW5lcworICoqIEByZXR1cm5zIHhjYl9hbGxvY19jb2xvcl9jZWxsc19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfYWxsb2NfY29sb3JfY2VsbHNfY29va2llX3QKK3hjYl9hbGxvY19jb2xvcl9jZWxsc191bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBjb250aWd1b3VzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGNvbG9ycyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHBsYW5lcyAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB1aW50MzJfdCAqIHhjYl9hbGxvY19jb2xvcl9jZWxsc19waXhlbHMKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB1aW50MzJfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3VpbnQzMl90ICoKK3hjYl9hbGxvY19jb2xvcl9jZWxsc19waXhlbHMgKGNvbnN0IHhjYl9hbGxvY19jb2xvcl9jZWxsc19yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcGl4ZWxzX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9hbGxvY19jb2xvcl9jZWxsc19waXhlbHNfbGVuZ3RoIChjb25zdCB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9hbGxvY19jb2xvcl9jZWxsc19waXhlbHNfZW5kCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9hbGxvY19jb2xvcl9jZWxsc19yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcGl4ZWxzX2VuZCAoY29uc3QgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdWludDMyX3QgKiB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfbWFza3MKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB1aW50MzJfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3VpbnQzMl90ICoKK3hjYl9hbGxvY19jb2xvcl9jZWxsc19tYXNrcyAoY29uc3QgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogaW50IHhjYl9hbGxvY19jb2xvcl9jZWxsc19tYXNrc19sZW5ndGgKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyBpbnQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW50Cit4Y2JfYWxsb2NfY29sb3JfY2VsbHNfbWFza3NfbGVuZ3RoIChjb25zdCB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9hbGxvY19jb2xvcl9jZWxsc19tYXNrc19lbmQKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9hbGxvY19jb2xvcl9jZWxsc19tYXNrc19lbmQgKGNvbnN0IHhjYl9hbGxvY19jb2xvcl9jZWxsc19yZXBseV90ICpSICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9hbGxvY19jb2xvcl9jZWxsc191bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVwbHlfdCAqIHhjYl9hbGxvY19jb2xvcl9jZWxsc19yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9hbGxvY19jb2xvcl9jZWxsc19jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX2FsbG9jX2NvbG9yX2NlbGxzX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVwbHlfdCAqCit4Y2JfYWxsb2NfY29sb3JfY2VsbHNfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9hbGxvY19jb2xvcl9jZWxsc19jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICoqZSAgLyoqPCAqLyk7CisKK2ludAoreGNiX2FsbG9jX2NvbG9yX3BsYW5lc19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfY29va2llX3QgeGNiX2FsbG9jX2NvbG9yX3BsYW5lcworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGNvbnRpZ3VvdXMKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgY21hcAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBjb2xvcnMKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgcmVkcworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBncmVlbnMKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgYmx1ZXMKKyAqKiBAcmV0dXJucyB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9hbGxvY19jb2xvcl9wbGFuZXNfY29va2llX3QKK3hjYl9hbGxvY19jb2xvcl9wbGFuZXMgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBjb250aWd1b3VzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGNvbG9ycyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHJlZHMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBncmVlbnMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBibHVlcyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX2Nvb2tpZV90IHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgY29udGlndW91cworICoqIEBwYXJhbSB4Y2JfY29sb3JtYXBfdCAgICBjbWFwCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGNvbG9ycworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICByZWRzCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGdyZWVucworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBibHVlcworICoqIEByZXR1cm5zIHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2FsbG9jX2NvbG9yX3BsYW5lc19jb29raWVfdAoreGNiX2FsbG9jX2NvbG9yX3BsYW5lc191bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgY29udGlndW91cyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGNvbG9ycyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICByZWRzICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGdyZWVucyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBibHVlcyAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB1aW50MzJfdCAqIHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfcGl4ZWxzCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHVpbnQzMl90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordWludDMyX3QgKgoreGNiX2FsbG9jX2NvbG9yX3BsYW5lc19waXhlbHMgKGNvbnN0IHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX2FsbG9jX2NvbG9yX3BsYW5lc19waXhlbHNfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9hbGxvY19jb2xvcl9wbGFuZXNfcGl4ZWxzX2xlbmd0aCAoY29uc3QgeGNiX2FsbG9jX2NvbG9yX3BsYW5lc19yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2FsbG9jX2NvbG9yX3BsYW5lc19waXhlbHNfZW5kCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2FsbG9jX2NvbG9yX3BsYW5lc19waXhlbHNfZW5kIChjb25zdCB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2FsbG9jX2NvbG9yX3BsYW5lc191bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3JlcGx5X3QgKiB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9hbGxvY19jb2xvcl9wbGFuZXNfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX3JlcGx5X3QgKgoreGNiX2FsbG9jX2NvbG9yX3BsYW5lc19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfYWxsb2NfY29sb3JfcGxhbmVzX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCitpbnQKK3hjYl9mcmVlX2NvbG9yc19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgIHBpeGVsc19sZW4gIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfZnJlZV9jb2xvcnNfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgcGxhbmVfbWFzaworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBwaXhlbHNfbGVuCisgKiogQHBhcmFtIGNvbnN0IHVpbnQzMl90ICAgKnBpeGVscworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfZnJlZV9jb2xvcnNfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHBsYW5lX21hc2sgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgcGl4ZWxzX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICpwaXhlbHMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2ZyZWVfY29sb3JzCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgY21hcAorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBwbGFuZV9tYXNrCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIHBpeGVsc19sZW4KKyAqKiBAcGFyYW0gY29uc3QgdWludDMyX3QgICAqcGl4ZWxzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9mcmVlX2NvbG9ycyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgcGxhbmVfbWFzayAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgcGl4ZWxzX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAqcGl4ZWxzICAvKio8ICovKTsKKworLyoqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSBpIFBvaW50ZXIgdG8gYSB4Y2JfY29sb3JpdGVtX2l0ZXJhdG9yX3QKKyAqCisgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IuIFRoZSBtZW1iZXIgcmVtIGlzCisgKiBkZWNyZWFzZWQgYnkgb25lLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZSBuZXh0CisgKiBlbGVtZW50LiBUaGUgbWVtYmVyIGluZGV4IGlzIGluY3JlYXNlZCBieSBzaXplb2YoeGNiX2NvbG9yaXRlbV90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2JfY29sb3JpdGVtX25leHQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2NvbG9yaXRlbV9pdGVyYXRvcl90ICppCisgKiogQHJldHVybnMgdm9pZAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit2b2lkCit4Y2JfY29sb3JpdGVtX25leHQgKHhjYl9jb2xvcml0ZW1faXRlcmF0b3JfdCAqaSAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKiBAcGFyYW0gaSBBbiB4Y2JfY29sb3JpdGVtX2l0ZXJhdG9yX3QKKyAqIEByZXR1cm4gIFRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50CisgKgorICogU2V0IHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IGVsZW1lbnQuCisgKiBUaGUgbWVtYmVyIHJlbSBpcyBzZXQgdG8gMC4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgZWxlbWVudC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2NvbG9yaXRlbV9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2NvbG9yaXRlbV9pdGVyYXRvcl90IGkKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9jb2xvcml0ZW1fZW5kICh4Y2JfY29sb3JpdGVtX2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKK2ludAoreGNiX3N0b3JlX2NvbG9yc19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICBpdGVtc19sZW4gIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfc3RvcmVfY29sb3JzX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICpjCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgICAgICAgY21hcAorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICAgICAgIGl0ZW1zX2xlbgorICoqIEBwYXJhbSBjb25zdCB4Y2JfY29sb3JpdGVtX3QgKml0ZW1zCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9zdG9yZV9jb2xvcnNfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICAgICAgIGNtYXAgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgaXRlbXNfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfY29sb3JpdGVtX3QgKml0ZW1zICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9zdG9yZV9jb2xvcnMKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICpjCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgICAgICAgY21hcAorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICAgICAgIGl0ZW1zX2xlbgorICoqIEBwYXJhbSBjb25zdCB4Y2JfY29sb3JpdGVtX3QgKml0ZW1zCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9zdG9yZV9jb2xvcnMgKHhjYl9jb25uZWN0aW9uX3QgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgICAgICAgY21hcCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgaXRlbXNfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX2NvbG9yaXRlbV90ICppdGVtcyAgLyoqPCAqLyk7CisKK2ludAoreGNiX3N0b3JlX25hbWVkX2NvbG9yX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfc3RvcmVfbmFtZWRfY29sb3JfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGZsYWdzCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgcGl4ZWwKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgbmFtZV9sZW4KKyAqKiBAcGFyYW0gY29uc3QgY2hhciAgICAgICAqbmFtZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfc3RvcmVfbmFtZWRfY29sb3JfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBmbGFncyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfY29sb3JtYXBfdCAgICBjbWFwICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHBpeGVsICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG5hbWVfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKm5hbWUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3N0b3JlX25hbWVkX2NvbG9yCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgZmxhZ3MKKyAqKiBAcGFyYW0geGNiX2NvbG9ybWFwX3QgICAgY21hcAorICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICBwaXhlbAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbgorICoqIEBwYXJhbSBjb25zdCBjaGFyICAgICAgICpuYW1lCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9zdG9yZV9uYW1lZF9jb2xvciAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZmxhZ3MgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHBpeGVsICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqbmFtZSAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX3JnYl9pdGVyYXRvcl90CisgKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yLiBUaGUgbWVtYmVyIHJlbSBpcworICogZGVjcmVhc2VkIGJ5IG9uZS4gVGhlIG1lbWJlciBkYXRhIHBvaW50cyB0byB0aGUgbmV4dAorICogZWxlbWVudC4gVGhlIG1lbWJlciBpbmRleCBpcyBpbmNyZWFzZWQgYnkgc2l6ZW9mKHhjYl9yZ2JfdCkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHZvaWQgeGNiX3JnYl9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9yZ2JfaXRlcmF0b3JfdCAqaQorICoqIEByZXR1cm5zIHZvaWQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZAoreGNiX3JnYl9uZXh0ICh4Y2JfcmdiX2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX3JnYl9pdGVyYXRvcl90CisgKiBAcmV0dXJuICBUaGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICoKKyAqIFNldCB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciB0byB0aGUgbGFzdCBlbGVtZW50LgorICogVGhlIG1lbWJlciByZW0gaXMgc2V0IHRvIDAuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGVsZW1lbnQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90IHhjYl9yZ2JfZW5kCisgKiogCisgKiogQHBhcmFtIHhjYl9yZ2JfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfcmdiX2VuZCAoeGNiX3JnYl9pdGVyYXRvcl90IGkgIC8qKjwgKi8pOworCitpbnQKK3hjYl9xdWVyeV9jb2xvcnNfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgcGl4ZWxzX2xlbiAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfcXVlcnlfY29sb3JzX2Nvb2tpZV90IHhjYl9xdWVyeV9jb2xvcnMKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfY29sb3JtYXBfdCAgICBjbWFwCisgKiogQHBhcmFtIHVpbnQzMl90ICAgICAgICAgIHBpeGVsc19sZW4KKyAqKiBAcGFyYW0gY29uc3QgdWludDMyX3QgICAqcGl4ZWxzCisgKiogQHJldHVybnMgeGNiX3F1ZXJ5X2NvbG9yc19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcXVlcnlfY29sb3JzX2Nvb2tpZV90Cit4Y2JfcXVlcnlfY29sb3JzICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHBpeGVsc19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICpwaXhlbHMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3F1ZXJ5X2NvbG9yc19jb29raWVfdCB4Y2JfcXVlcnlfY29sb3JzX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgcGl4ZWxzX2xlbgorICoqIEBwYXJhbSBjb25zdCB1aW50MzJfdCAgICpwaXhlbHMKKyAqKiBAcmV0dXJucyB4Y2JfcXVlcnlfY29sb3JzX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9xdWVyeV9jb2xvcnNfY29va2llX3QKK3hjYl9xdWVyeV9jb2xvcnNfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgcGl4ZWxzX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICpwaXhlbHMgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3JnYl90ICogeGNiX3F1ZXJ5X2NvbG9yc19jb2xvcnMKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3F1ZXJ5X2NvbG9yc19yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX3JnYl90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3JnYl90ICoKK3hjYl9xdWVyeV9jb2xvcnNfY29sb3JzIChjb25zdCB4Y2JfcXVlcnlfY29sb3JzX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogaW50IHhjYl9xdWVyeV9jb2xvcnNfY29sb3JzX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfcXVlcnlfY29sb3JzX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyBpbnQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW50Cit4Y2JfcXVlcnlfY29sb3JzX2NvbG9yc19sZW5ndGggKGNvbnN0IHhjYl9xdWVyeV9jb2xvcnNfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfcmdiX2l0ZXJhdG9yX3QgeGNiX3F1ZXJ5X2NvbG9yc19jb2xvcnNfaXRlcmF0b3IKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX3F1ZXJ5X2NvbG9yc19yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX3JnYl9pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9yZ2JfaXRlcmF0b3JfdAoreGNiX3F1ZXJ5X2NvbG9yc19jb2xvcnNfaXRlcmF0b3IgKGNvbnN0IHhjYl9xdWVyeV9jb2xvcnNfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfcXVlcnlfY29sb3JzX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9xdWVyeV9jb2xvcnNfcmVwbHlfdCAqIHhjYl9xdWVyeV9jb2xvcnNfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX3F1ZXJ5X2NvbG9yc19jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9xdWVyeV9jb2xvcnNfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9xdWVyeV9jb2xvcnNfcmVwbHlfdCAqCit4Y2JfcXVlcnlfY29sb3JzX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9xdWVyeV9jb2xvcnNfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICoqZSAgLyoqPCAqLyk7CisKK2ludAoreGNiX2xvb2t1cF9jb2xvcl9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9sb29rdXBfY29sb3JfY29va2llX3QgeGNiX2xvb2t1cF9jb2xvcgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgbmFtZV9sZW4KKyAqKiBAcGFyYW0gY29uc3QgY2hhciAgICAgICAqbmFtZQorICoqIEByZXR1cm5zIHhjYl9sb29rdXBfY29sb3JfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2xvb2t1cF9jb2xvcl9jb29raWVfdAoreGNiX2xvb2t1cF9jb2xvciAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKm5hbWUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2xvb2t1cF9jb2xvcl9jb29raWVfdCB4Y2JfbG9va3VwX2NvbG9yX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jb2xvcm1hcF90ICAgIGNtYXAKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgbmFtZV9sZW4KKyAqKiBAcGFyYW0gY29uc3QgY2hhciAgICAgICAqbmFtZQorICoqIEByZXR1cm5zIHhjYl9sb29rdXBfY29sb3JfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2xvb2t1cF9jb2xvcl9jb29raWVfdAoreGNiX2xvb2t1cF9jb2xvcl91bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2NvbG9ybWFwX3QgICAgY21hcCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpuYW1lICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9sb29rdXBfY29sb3JfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2xvb2t1cF9jb2xvcl9yZXBseV90ICogeGNiX2xvb2t1cF9jb2xvcl9yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfbG9va3VwX2NvbG9yX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX2xvb2t1cF9jb2xvcl9yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2xvb2t1cF9jb2xvcl9yZXBseV90ICoKK3hjYl9sb29rdXBfY29sb3JfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2xvb2t1cF9jb2xvcl9jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgKiplICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NyZWF0ZV9jdXJzb3JfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jdXJzb3JfdCAgICAgIGNpZAorICoqIEBwYXJhbSB4Y2JfcGl4bWFwX3QgICAgICBzb3VyY2UKKyAqKiBAcGFyYW0geGNiX3BpeG1hcF90ICAgICAgbWFzaworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBmb3JlX3JlZAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBmb3JlX2dyZWVuCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGZvcmVfYmx1ZQorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBiYWNrX3JlZAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBiYWNrX2dyZWVuCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGJhY2tfYmx1ZQorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICB4CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHkKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NyZWF0ZV9jdXJzb3JfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jdXJzb3JfdCAgICAgIGNpZCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9waXhtYXBfdCAgICAgIHNvdXJjZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9waXhtYXBfdCAgICAgIG1hc2sgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBmb3JlX3JlZCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfZ3JlZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBmb3JlX2JsdWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBiYWNrX3JlZCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfZ3JlZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBiYWNrX2JsdWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB4ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgeSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY3JlYXRlX2N1cnNvcgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jdXJzb3JfdCAgICAgIGNpZAorICoqIEBwYXJhbSB4Y2JfcGl4bWFwX3QgICAgICBzb3VyY2UKKyAqKiBAcGFyYW0geGNiX3BpeG1hcF90ICAgICAgbWFzaworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBmb3JlX3JlZAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBmb3JlX2dyZWVuCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGZvcmVfYmx1ZQorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBiYWNrX3JlZAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBiYWNrX2dyZWVuCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGJhY2tfYmx1ZQorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICB4CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHkKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NyZWF0ZV9jdXJzb3IgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY2lkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHhjYl9waXhtYXBfdCAgICAgIHNvdXJjZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICB4Y2JfcGl4bWFwX3QgICAgICBtYXNrICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfcmVkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfZ3JlZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZm9yZV9ibHVlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfcmVkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfZ3JlZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgYmFja19ibHVlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIHggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgeSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jcmVhdGVfZ2x5cGhfY3Vyc29yX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfY3Vyc29yX3QgICAgICBjaWQKKyAqKiBAcGFyYW0geGNiX2ZvbnRfdCAgICAgICAgc291cmNlX2ZvbnQKKyAqKiBAcGFyYW0geGNiX2ZvbnRfdCAgICAgICAgbWFza19mb250CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHNvdXJjZV9jaGFyCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIG1hc2tfY2hhcgorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBmb3JlX3JlZAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBmb3JlX2dyZWVuCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGZvcmVfYmx1ZQorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBiYWNrX3JlZAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBiYWNrX2dyZWVuCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGJhY2tfYmx1ZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY3JlYXRlX2dseXBoX2N1cnNvcl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY2lkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2ZvbnRfdCAgICAgICAgc291cmNlX2ZvbnQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZm9udF90ICAgICAgICBtYXNrX2ZvbnQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBzb3VyY2VfY2hhciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIG1hc2tfY2hhciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfcmVkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZm9yZV9ncmVlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfYmx1ZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfcmVkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgYmFja19ncmVlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfYmx1ZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY3JlYXRlX2dseXBoX2N1cnNvcgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jdXJzb3JfdCAgICAgIGNpZAorICoqIEBwYXJhbSB4Y2JfZm9udF90ICAgICAgICBzb3VyY2VfZm9udAorICoqIEBwYXJhbSB4Y2JfZm9udF90ICAgICAgICBtYXNrX2ZvbnQKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgc291cmNlX2NoYXIKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgbWFza19jaGFyCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGZvcmVfcmVkCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGZvcmVfZ3JlZW4KKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgZm9yZV9ibHVlCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGJhY2tfcmVkCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGJhY2tfZ3JlZW4KKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgYmFja19ibHVlCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jcmVhdGVfZ2x5cGhfY3Vyc29yICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jdXJzb3JfdCAgICAgIGNpZCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZm9udF90ICAgICAgICBzb3VyY2VfZm9udCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZm9udF90ICAgICAgICBtYXNrX2ZvbnQgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgc291cmNlX2NoYXIgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbWFza19jaGFyICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfcmVkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfZ3JlZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgZm9yZV9ibHVlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfcmVkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfZ3JlZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgYmFja19ibHVlICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2ZyZWVfY3Vyc29yX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfY3Vyc29yX3QgICAgICBjdXJzb3IKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2ZyZWVfY3Vyc29yX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2N1cnNvcl90ICAgICAgY3Vyc29yICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9mcmVlX2N1cnNvcgorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl9jdXJzb3JfdCAgICAgIGN1cnNvcgorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfZnJlZV9jdXJzb3IgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgIHhjYl9jdXJzb3JfdCAgICAgIGN1cnNvciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9yZWNvbG9yX2N1cnNvcl9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2N1cnNvcl90ICAgICAgY3Vyc29yCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGZvcmVfcmVkCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGZvcmVfZ3JlZW4KKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgZm9yZV9ibHVlCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGJhY2tfcmVkCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGJhY2tfZ3JlZW4KKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgYmFja19ibHVlCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9yZWNvbG9yX2N1cnNvcl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9jdXJzb3JfdCAgICAgIGN1cnNvciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBmb3JlX3JlZCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBmb3JlX2dyZWVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfYmx1ZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBiYWNrX3JlZCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBiYWNrX2dyZWVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfYmx1ZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfcmVjb2xvcl9jdXJzb3IKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2JfY3Vyc29yX3QgICAgICBjdXJzb3IKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgZm9yZV9yZWQKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgZm9yZV9ncmVlbgorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBmb3JlX2JsdWUKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgYmFja19yZWQKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgYmFja19ncmVlbgorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBiYWNrX2JsdWUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3JlY29sb3JfY3Vyc29yICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICB4Y2JfY3Vyc29yX3QgICAgICBjdXJzb3IgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGZvcmVfcmVkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBmb3JlX2dyZWVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBmb3JlX2JsdWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGJhY2tfcmVkICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBiYWNrX2dyZWVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBiYWNrX2JsdWUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV9jb29raWVfdCB4Y2JfcXVlcnlfYmVzdF9zaXplCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgX2NsYXNzCisgKiogQHBhcmFtIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIHdpZHRoCisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGhlaWdodAorICoqIEByZXR1cm5zIHhjYl9xdWVyeV9iZXN0X3NpemVfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV9jb29raWVfdAoreGNiX3F1ZXJ5X2Jlc3Rfc2l6ZSAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIF9jbGFzcyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgIHhjYl9kcmF3YWJsZV90ICAgIGRyYXdhYmxlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgd2lkdGggIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBoZWlnaHQgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV9jb29raWVfdCB4Y2JfcXVlcnlfYmVzdF9zaXplX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIF9jbGFzcworICoqIEBwYXJhbSB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZQorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICB3aWR0aAorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBoZWlnaHQKKyAqKiBAcmV0dXJucyB4Y2JfcXVlcnlfYmVzdF9zaXplX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9xdWVyeV9iZXN0X3NpemVfY29va2llX3QKK3hjYl9xdWVyeV9iZXN0X3NpemVfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIF9jbGFzcyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZHJhd2FibGVfdCAgICBkcmF3YWJsZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICB3aWR0aCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBoZWlnaHQgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV91bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfcXVlcnlfYmVzdF9zaXplX3JlcGx5X3QgKiB4Y2JfcXVlcnlfYmVzdF9zaXplX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9xdWVyeV9iZXN0X3NpemVfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfcXVlcnlfYmVzdF9zaXplX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcXVlcnlfYmVzdF9zaXplX3JlcGx5X3QgKgoreGNiX3F1ZXJ5X2Jlc3Rfc2l6ZV9yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfcXVlcnlfYmVzdF9zaXplX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCitpbnQKK3hjYl9xdWVyeV9leHRlbnNpb25fc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfcXVlcnlfZXh0ZW5zaW9uX2Nvb2tpZV90IHhjYl9xdWVyeV9leHRlbnNpb24KKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbgorICoqIEBwYXJhbSBjb25zdCBjaGFyICAgICAgICpuYW1lCisgKiogQHJldHVybnMgeGNiX3F1ZXJ5X2V4dGVuc2lvbl9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcXVlcnlfZXh0ZW5zaW9uX2Nvb2tpZV90Cit4Y2JfcXVlcnlfZXh0ZW5zaW9uICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgbmFtZV9sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpuYW1lICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9xdWVyeV9leHRlbnNpb25fY29va2llX3QgeGNiX3F1ZXJ5X2V4dGVuc2lvbl91bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbgorICoqIEBwYXJhbSBjb25zdCBjaGFyICAgICAgICpuYW1lCisgKiogQHJldHVybnMgeGNiX3F1ZXJ5X2V4dGVuc2lvbl9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfcXVlcnlfZXh0ZW5zaW9uX2Nvb2tpZV90Cit4Y2JfcXVlcnlfZXh0ZW5zaW9uX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBuYW1lX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpuYW1lICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9xdWVyeV9leHRlbnNpb25fdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3F1ZXJ5X2V4dGVuc2lvbl9yZXBseV90ICogeGNiX3F1ZXJ5X2V4dGVuc2lvbl9yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfcXVlcnlfZXh0ZW5zaW9uX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX3F1ZXJ5X2V4dGVuc2lvbl9yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3F1ZXJ5X2V4dGVuc2lvbl9yZXBseV90ICoKK3hjYl9xdWVyeV9leHRlbnNpb25fcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3F1ZXJ5X2V4dGVuc2lvbl9jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgKiplICAvKio8ICovKTsKKworaW50Cit4Y2JfbGlzdF9leHRlbnNpb25zX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2xpc3RfZXh0ZW5zaW9uc19jb29raWVfdCB4Y2JfbGlzdF9leHRlbnNpb25zCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcmV0dXJucyB4Y2JfbGlzdF9leHRlbnNpb25zX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9saXN0X2V4dGVuc2lvbnNfY29va2llX3QKK3hjYl9saXN0X2V4dGVuc2lvbnMgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2xpc3RfZXh0ZW5zaW9uc19jb29raWVfdCB4Y2JfbGlzdF9leHRlbnNpb25zX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX2xpc3RfZXh0ZW5zaW9uc19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfbGlzdF9leHRlbnNpb25zX2Nvb2tpZV90Cit4Y2JfbGlzdF9leHRlbnNpb25zX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX2xpc3RfZXh0ZW5zaW9uc19uYW1lc19sZW5ndGgKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2xpc3RfZXh0ZW5zaW9uc19yZXBseV90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX2xpc3RfZXh0ZW5zaW9uc19uYW1lc19sZW5ndGggKGNvbnN0IHhjYl9saXN0X2V4dGVuc2lvbnNfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfc3RyX2l0ZXJhdG9yX3QgeGNiX2xpc3RfZXh0ZW5zaW9uc19uYW1lc19pdGVyYXRvcgorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfbGlzdF9leHRlbnNpb25zX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2Jfc3RyX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3N0cl9pdGVyYXRvcl90Cit4Y2JfbGlzdF9leHRlbnNpb25zX25hbWVzX2l0ZXJhdG9yIChjb25zdCB4Y2JfbGlzdF9leHRlbnNpb25zX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2xpc3RfZXh0ZW5zaW9uc191bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfbGlzdF9leHRlbnNpb25zX3JlcGx5X3QgKiB4Y2JfbGlzdF9leHRlbnNpb25zX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9saXN0X2V4dGVuc2lvbnNfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfbGlzdF9leHRlbnNpb25zX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfbGlzdF9leHRlbnNpb25zX3JlcGx5X3QgKgoreGNiX2xpc3RfZXh0ZW5zaW9uc19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfbGlzdF9leHRlbnNpb25zX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCitpbnQKK3hjYl9jaGFuZ2Vfa2V5Ym9hcmRfbWFwcGluZ19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2NoYW5nZV9rZXlib2FyZF9tYXBwaW5nX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgICAga2V5Y29kZV9jb3VudAorICoqIEBwYXJhbSB4Y2Jfa2V5Y29kZV90ICAgICAgIGZpcnN0X2tleWNvZGUKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgICBrZXlzeW1zX3Blcl9rZXljb2RlCisgKiogQHBhcmFtIGNvbnN0IHhjYl9rZXlzeW1fdCAqa2V5c3ltcworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY2hhbmdlX2tleWJvYXJkX21hcHBpbmdfY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAga2V5Y29kZV9jb3VudCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfa2V5Y29kZV90ICAgICAgIGZpcnN0X2tleWNvZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICBrZXlzeW1zX3Blcl9rZXljb2RlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhjYl9rZXlzeW1fdCAqa2V5c3ltcyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY2hhbmdlX2tleWJvYXJkX21hcHBpbmcKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgICAga2V5Y29kZV9jb3VudAorICoqIEBwYXJhbSB4Y2Jfa2V5Y29kZV90ICAgICAgIGZpcnN0X2tleWNvZGUKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgICBrZXlzeW1zX3Blcl9rZXljb2RlCisgKiogQHBhcmFtIGNvbnN0IHhjYl9rZXlzeW1fdCAqa2V5c3ltcworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY2hhbmdlX2tleWJvYXJkX21hcHBpbmcgKHhjYl9jb25uZWN0aW9uX3QgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICBrZXljb2RlX2NvdW50ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfa2V5Y29kZV90ICAgICAgIGZpcnN0X2tleWNvZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAga2V5c3ltc19wZXJfa2V5Y29kZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGNiX2tleXN5bV90ICprZXlzeW1zICAvKio8ICovKTsKKworaW50Cit4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfY29va2llX3QgeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0geGNiX2tleWNvZGVfdCAgICAgZmlyc3Rfa2V5Y29kZQorICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBjb3VudAorICoqIEByZXR1cm5zIHhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfY29va2llX3QKK3hjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2tleWNvZGVfdCAgICAgZmlyc3Rfa2V5Y29kZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgY291bnQgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX2Nvb2tpZV90IHhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ191bmNoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfa2V5Y29kZV90ICAgICBmaXJzdF9rZXljb2RlCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGNvdW50CisgKiogQHJldHVybnMgeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19jb29raWVfdAoreGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9rZXljb2RlX3QgICAgIGZpcnN0X2tleWNvZGUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBjb3VudCAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfa2V5c3ltX3QgKiB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfa2V5c3ltcworICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl9rZXlzeW1fdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9rZXlzeW1fdCAqCit4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfa2V5c3ltcyAoY29uc3QgeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogaW50IHhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19rZXlzeW1zX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19rZXlzeW1zX2xlbmd0aCAoY29uc3QgeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfa2V5c3ltc19lbmQKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19rZXlzeW1zX2VuZCAoY29uc3QgeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19yZXBseV90ICogeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X2tleWJvYXJkX21hcHBpbmdfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19yZXBseV90ICoKK3hjYl9nZXRfa2V5Ym9hcmRfbWFwcGluZ19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dldF9rZXlib2FyZF9tYXBwaW5nX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICAgKiplICAvKio8ICovKTsKKworaW50Cit4Y2JfY2hhbmdlX2tleWJvYXJkX2NvbnRyb2xfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jaGFuZ2Vfa2V5Ym9hcmRfY29udHJvbF9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgdmFsdWVfbWFzaworICoqIEBwYXJhbSBjb25zdCB1aW50MzJfdCAgICp2YWx1ZV9saXN0CisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jaGFuZ2Vfa2V5Ym9hcmRfY29udHJvbF9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgIHZhbHVlX21hc2sgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAqdmFsdWVfbGlzdCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY2hhbmdlX2tleWJvYXJkX2NvbnRyb2wKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50MzJfdCAgICAgICAgICB2YWx1ZV9tYXNrCisgKiogQHBhcmFtIGNvbnN0IHVpbnQzMl90ICAgKnZhbHVlX2xpc3QKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NoYW5nZV9rZXlib2FyZF9jb250cm9sICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICB2YWx1ZV9tYXNrICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICp2YWx1ZV9saXN0ICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF9jb29raWVfdCB4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2wKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEByZXR1cm5zIHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfY29va2llX3QKK3hjYl9nZXRfa2V5Ym9hcmRfY29udHJvbCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfY29va2llX3QgeGNiX2dldF9rZXlib2FyZF9jb250cm9sX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX2dldF9rZXlib2FyZF9jb250cm9sX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF9jb29raWVfdAoreGNiX2dldF9rZXlib2FyZF9jb250cm9sX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9rZXlib2FyZF9jb250cm9sX3JlcGx5X3QgKiB4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9nZXRfa2V5Ym9hcmRfY29udHJvbF9yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9rZXlib2FyZF9jb250cm9sX3JlcGx5X3QgKgoreGNiX2dldF9rZXlib2FyZF9jb250cm9sX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2V0X2tleWJvYXJkX2NvbnRyb2xfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfYmVsbF9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gaW50OF90ICAgICAgICAgICAgcGVyY2VudAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfYmVsbF9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgaW50OF90ICAgICAgICAgICAgcGVyY2VudCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfYmVsbAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIGludDhfdCAgICAgICAgICAgIHBlcmNlbnQKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2JlbGwgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgaW50OF90ICAgICAgICAgICAgcGVyY2VudCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jaGFuZ2VfcG9pbnRlcl9jb250cm9sX2NoZWNrZWQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICBhY2NlbGVyYXRpb25fbnVtZXJhdG9yCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIGFjY2VsZXJhdGlvbl9kZW5vbWluYXRvcgorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB0aHJlc2hvbGQKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgZG9fYWNjZWxlcmF0aW9uCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGRvX3RocmVzaG9sZAorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2JfY2hhbmdlX3BvaW50ZXJfY29udHJvbF9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgYWNjZWxlcmF0aW9uX251bWVyYXRvciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGFjY2VsZXJhdGlvbl9kZW5vbWluYXRvciAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHRocmVzaG9sZCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGRvX2FjY2VsZXJhdGlvbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIGRvX3RocmVzaG9sZCAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2JfY2hhbmdlX3BvaW50ZXJfY29udHJvbAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIGFjY2VsZXJhdGlvbl9udW1lcmF0b3IKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgYWNjZWxlcmF0aW9uX2Rlbm9taW5hdG9yCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIHRocmVzaG9sZAorICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBkb19hY2NlbGVyYXRpb24KKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgZG9fdGhyZXNob2xkCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jaGFuZ2VfcG9pbnRlcl9jb250cm9sICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGFjY2VsZXJhdGlvbl9udW1lcmF0b3IgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgYWNjZWxlcmF0aW9uX2Rlbm9taW5hdG9yICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIHRocmVzaG9sZCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBkb19hY2NlbGVyYXRpb24gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZG9fdGhyZXNob2xkICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfcG9pbnRlcl9jb250cm9sX2Nvb2tpZV90IHhjYl9nZXRfcG9pbnRlcl9jb250cm9sCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9jb29raWVfdAoreGNiX2dldF9wb2ludGVyX2NvbnRyb2wgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9wb2ludGVyX2NvbnRyb2xfY29va2llX3QgeGNiX2dldF9wb2ludGVyX2NvbnRyb2xfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9jb29raWVfdAoreGNiX2dldF9wb2ludGVyX2NvbnRyb2xfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9nZXRfcG9pbnRlcl9jb250cm9sX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfcG9pbnRlcl9jb250cm9sX3JlcGx5X3QgKiB4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2dldF9wb2ludGVyX2NvbnRyb2xfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX2dldF9wb2ludGVyX2NvbnRyb2xfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfcG9pbnRlcl9jb250cm9sX3JlcGx5X3QgKgoreGNiX2dldF9wb2ludGVyX2NvbnRyb2xfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2V0X3BvaW50ZXJfY29udHJvbF9jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfc2V0X3NjcmVlbl9zYXZlcl9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgdGltZW91dAorICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICBpbnRlcnZhbAorICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBwcmVmZXJfYmxhbmtpbmcKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgYWxsb3dfZXhwb3N1cmVzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9zZXRfc2NyZWVuX3NhdmVyX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICB0aW1lb3V0ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgaW50ZXJ2YWwgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBwcmVmZXJfYmxhbmtpbmcgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBhbGxvd19leHBvc3VyZXMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3NldF9zY3JlZW5fc2F2ZXIKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSBpbnQxNl90ICAgICAgICAgICB0aW1lb3V0CisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIGludGVydmFsCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIHByZWZlcl9ibGFua2luZworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBhbGxvd19leHBvc3VyZXMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3NldF9zY3JlZW5fc2F2ZXIgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgdGltZW91dCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBpbnRlcnZhbCAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBwcmVmZXJfYmxhbmtpbmcgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgYWxsb3dfZXhwb3N1cmVzICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfc2NyZWVuX3NhdmVyX2Nvb2tpZV90IHhjYl9nZXRfc2NyZWVuX3NhdmVyCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X3NjcmVlbl9zYXZlcl9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X3NjcmVlbl9zYXZlcl9jb29raWVfdAoreGNiX2dldF9zY3JlZW5fc2F2ZXIgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9zY3JlZW5fc2F2ZXJfY29va2llX3QgeGNiX2dldF9zY3JlZW5fc2F2ZXJfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X3NjcmVlbl9zYXZlcl9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X3NjcmVlbl9zYXZlcl9jb29raWVfdAoreGNiX2dldF9zY3JlZW5fc2F2ZXJfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHJlcGx5CisgKiBAcGFyYW0gYyAgICAgIFRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gY29va2llIFRoZSBjb29raWUKKyAqIEBwYXJhbSBlICAgICAgVGhlIHhjYl9nZW5lcmljX2Vycm9yX3Qgc3VwcGxpZWQKKyAqCisgKiBSZXR1cm5zIHRoZSByZXBseSBvZiB0aGUgcmVxdWVzdCBhc2tlZCBieQorICogCisgKiBUaGUgcGFyYW1ldGVyIEBwIGUgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIE5VTEwgaWYKKyAqIHhjYl9nZXRfc2NyZWVuX3NhdmVyX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfc2NyZWVuX3NhdmVyX3JlcGx5X3QgKiB4Y2JfZ2V0X3NjcmVlbl9zYXZlcl9yZXBseQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2dldF9zY3JlZW5fc2F2ZXJfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgKiplCisgKiogQHJldHVybnMgeGNiX2dldF9zY3JlZW5fc2F2ZXJfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfc2NyZWVuX3NhdmVyX3JlcGx5X3QgKgoreGNiX2dldF9zY3JlZW5fc2F2ZXJfcmVwbHkgKHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2V0X3NjcmVlbl9zYXZlcl9jb29raWVfdCAgIGNvb2tpZSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCitpbnQKK3hjYl9jaGFuZ2VfaG9zdHNfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jaGFuZ2VfaG9zdHNfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIG1vZGUKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgZmFtaWx5CisgKiogQHBhcmFtIHVpbnQxNl90ICAgICAgICAgIGFkZHJlc3NfbGVuCisgKiogQHBhcmFtIGNvbnN0IHVpbnQ4X3QgICAgKmFkZHJlc3MKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2NoYW5nZV9ob3N0c19jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBtb2RlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBmYW1pbHkgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGFkZHJlc3NfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICAgICphZGRyZXNzICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9jaGFuZ2VfaG9zdHMKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBtb2RlCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIGZhbWlseQorICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBhZGRyZXNzX2xlbgorICoqIEBwYXJhbSBjb25zdCB1aW50OF90ICAgICphZGRyZXNzCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9jaGFuZ2VfaG9zdHMgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBtb2RlICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgZmFtaWx5ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgYWRkcmVzc19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICAgICphZGRyZXNzICAvKio8ICovKTsKKworaW50Cit4Y2JfaG9zdF9zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHVpbnQ4X3QgKiB4Y2JfaG9zdF9hZGRyZXNzCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9ob3N0X3QgKlIKKyAqKiBAcmV0dXJucyB1aW50OF90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordWludDhfdCAqCit4Y2JfaG9zdF9hZGRyZXNzIChjb25zdCB4Y2JfaG9zdF90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIGludCB4Y2JfaG9zdF9hZGRyZXNzX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfaG9zdF90ICpSCisgKiogQHJldHVybnMgaW50CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK2ludAoreGNiX2hvc3RfYWRkcmVzc19sZW5ndGggKGNvbnN0IHhjYl9ob3N0X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfaG9zdF9hZGRyZXNzX2VuZAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfaG9zdF90ICpSCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfaG9zdF9hZGRyZXNzX2VuZCAoY29uc3QgeGNiX2hvc3RfdCAqUiAgLyoqPCAqLyk7CisKKy8qKgorICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gaSBQb2ludGVyIHRvIGEgeGNiX2hvc3RfaXRlcmF0b3JfdAorICoKKyAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBpdGVyYXRvci4gVGhlIG1lbWJlciByZW0gaXMKKyAqIGRlY3JlYXNlZCBieSBvbmUuIFRoZSBtZW1iZXIgZGF0YSBwb2ludHMgdG8gdGhlIG5leHQKKyAqIGVsZW1lbnQuIFRoZSBtZW1iZXIgaW5kZXggaXMgaW5jcmVhc2VkIGJ5IHNpemVvZih4Y2JfaG9zdF90KQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogdm9pZCB4Y2JfaG9zdF9uZXh0CisgKiogCisgKiogQHBhcmFtIHhjYl9ob3N0X2l0ZXJhdG9yX3QgKmkKKyAqKiBAcmV0dXJucyB2b2lkCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3ZvaWQKK3hjYl9ob3N0X25leHQgKHhjYl9ob3N0X2l0ZXJhdG9yX3QgKmkgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudAorICogQHBhcmFtIGkgQW4geGNiX2hvc3RfaXRlcmF0b3JfdAorICogQHJldHVybiAgVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudC4KKyAqIFRoZSBtZW1iZXIgcmVtIGlzIHNldCB0byAwLiBUaGUgbWVtYmVyIGRhdGEgcG9pbnRzIHRvIHRoZQorICogbGFzdCBlbGVtZW50LgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfaG9zdF9lbmQKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2hvc3RfaXRlcmF0b3JfdCBpCisgKiogQHJldHVybnMgeGNiX2dlbmVyaWNfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2VuZXJpY19pdGVyYXRvcl90Cit4Y2JfaG9zdF9lbmQgKHhjYl9ob3N0X2l0ZXJhdG9yX3QgaSAgLyoqPCAqLyk7CisKK2ludAoreGNiX2xpc3RfaG9zdHNfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfbGlzdF9ob3N0c19jb29raWVfdCB4Y2JfbGlzdF9ob3N0cworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX2xpc3RfaG9zdHNfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2xpc3RfaG9zdHNfY29va2llX3QKK3hjYl9saXN0X2hvc3RzICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9saXN0X2hvc3RzX2Nvb2tpZV90IHhjYl9saXN0X2hvc3RzX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX2xpc3RfaG9zdHNfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2xpc3RfaG9zdHNfY29va2llX3QKK3hjYl9saXN0X2hvc3RzX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX2xpc3RfaG9zdHNfaG9zdHNfbGVuZ3RoCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9saXN0X2hvc3RzX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyBpbnQKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoraW50Cit4Y2JfbGlzdF9ob3N0c19ob3N0c19sZW5ndGggKGNvbnN0IHhjYl9saXN0X2hvc3RzX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2hvc3RfaXRlcmF0b3JfdCB4Y2JfbGlzdF9ob3N0c19ob3N0c19pdGVyYXRvcgorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfbGlzdF9ob3N0c19yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX2hvc3RfaXRlcmF0b3JfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfaG9zdF9pdGVyYXRvcl90Cit4Y2JfbGlzdF9ob3N0c19ob3N0c19pdGVyYXRvciAoY29uc3QgeGNiX2xpc3RfaG9zdHNfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2JfbGlzdF9ob3N0c191bmNoZWNrZWQoKS4gaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgaXQgc3RvcmVzIHRoZSBlcnJvciBpZiBhbnkuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciB1c2luZyBmcmVlKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfbGlzdF9ob3N0c19yZXBseV90ICogeGNiX2xpc3RfaG9zdHNfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICpjCisgKiogQHBhcmFtIHhjYl9saXN0X2hvc3RzX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9saXN0X2hvc3RzX3JlcGx5X3QgKgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfbGlzdF9ob3N0c19yZXBseV90ICoKK3hjYl9saXN0X2hvc3RzX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgeGNiX2xpc3RfaG9zdHNfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgeGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgKiplICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3NldF9hY2Nlc3NfY29udHJvbF9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgbW9kZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfc2V0X2FjY2Vzc19jb250cm9sX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG1vZGUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX3NldF9hY2Nlc3NfY29udHJvbAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIG1vZGUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3NldF9hY2Nlc3NfY29udHJvbCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG1vZGUgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfc2V0X2Nsb3NlX2Rvd25fbW9kZV9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgbW9kZQorICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfc2V0X2Nsb3NlX2Rvd25fbW9kZV9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgbW9kZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfc2V0X2Nsb3NlX2Rvd25fbW9kZQorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIG1vZGUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3NldF9jbG9zZV9kb3duX21vZGUgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgbW9kZSAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9raWxsX2NsaWVudF9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgcmVzb3VyY2UKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2tpbGxfY2xpZW50X2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgcmVzb3VyY2UgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX2tpbGxfY2xpZW50CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDMyX3QgICAgICAgICAgcmVzb3VyY2UKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2tpbGxfY2xpZW50ICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICByZXNvdXJjZSAgLyoqPCAqLyk7CisKK2ludAoreGNiX3JvdGF0ZV9wcm9wZXJ0aWVzX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBub3QgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogc2F2ZWQgZm9yIGhhbmRsaW5nIGJ5IHhjYl9yZXF1ZXN0X2NoZWNrKCkuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfcm90YXRlX3Byb3BlcnRpZXNfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHhjYl93aW5kb3dfdCAgICAgIHdpbmRvdworICoqIEBwYXJhbSB1aW50MTZfdCAgICAgICAgICBhdG9tc19sZW4KKyAqKiBAcGFyYW0gaW50MTZfdCAgICAgICAgICAgZGVsdGEKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2F0b21fdCAqYXRvbXMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX3JvdGF0ZV9wcm9wZXJ0aWVzX2NoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgIGF0b21zX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICBkZWx0YSAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfYXRvbV90ICphdG9tcyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfdm9pZF9jb29raWVfdCB4Y2Jfcm90YXRlX3Byb3BlcnRpZXMKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB4Y2Jfd2luZG93X3QgICAgICB3aW5kb3cKKyAqKiBAcGFyYW0gdWludDE2X3QgICAgICAgICAgYXRvbXNfbGVuCisgKiogQHBhcmFtIGludDE2X3QgICAgICAgICAgIGRlbHRhCisgKiogQHBhcmFtIGNvbnN0IHhjYl9hdG9tX3QgKmF0b21zCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9yb3RhdGVfcHJvcGVydGllcyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgeGNiX3dpbmRvd190ICAgICAgd2luZG93ICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICAgICAgICBhdG9tc19sZW4gIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgIGRlbHRhICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2JfYXRvbV90ICphdG9tcyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBzYXZlZCBmb3IgaGFuZGxpbmcgYnkgeGNiX3JlcXVlc3RfY2hlY2soKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9mb3JjZV9zY3JlZW5fc2F2ZXJfY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgIG1vZGUKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX2ZvcmNlX3NjcmVlbl9zYXZlcl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBtb2RlICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9mb3JjZV9zY3JlZW5fc2F2ZXIKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEBwYXJhbSB1aW50OF90ICAgICAgICAgICBtb2RlCisgKiogQHJldHVybnMgeGNiX3ZvaWRfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3ZvaWRfY29va2llX3QKK3hjYl9mb3JjZV9zY3JlZW5fc2F2ZXIgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBtb2RlICAvKio8ICovKTsKKworaW50Cit4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX2Nvb2tpZV90IHhjYl9zZXRfcG9pbnRlcl9tYXBwaW5nCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgbWFwX2xlbgorICoqIEBwYXJhbSBjb25zdCB1aW50OF90ICAgICptYXAKKyAqKiBAcmV0dXJucyB4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ19jb29raWVfdAoreGNiX3NldF9wb2ludGVyX21hcHBpbmcgKHhjYl9jb25uZWN0aW9uX3QgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgbWFwX2xlbiAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICAgICptYXAgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICogVGhpcyBmb3JtIGNhbiBiZSB1c2VkIG9ubHkgaWYgdGhlIHJlcXVlc3Qgd2lsbCBjYXVzZQorICogYSByZXBseSB0byBiZSBnZW5lcmF0ZWQuIEFueSByZXR1cm5lZCBlcnJvciB3aWxsIGJlCisgKiBwbGFjZWQgaW4gdGhlIGV2ZW50IHF1ZXVlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3NldF9wb2ludGVyX21hcHBpbmdfY29va2llX3QgeGNiX3NldF9wb2ludGVyX21hcHBpbmdfdW5jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcGFyYW0gdWludDhfdCAgICAgICAgICAgbWFwX2xlbgorICoqIEBwYXJhbSBjb25zdCB1aW50OF90ICAgICptYXAKKyAqKiBAcmV0dXJucyB4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ19jb29raWVfdAoreGNiX3NldF9wb2ludGVyX21hcHBpbmdfdW5jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICBtYXBfbGVuICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICAgICptYXAgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX3NldF9wb2ludGVyX21hcHBpbmdfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3NldF9wb2ludGVyX21hcHBpbmdfcmVwbHlfdCAqIHhjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ19jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ19yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3NldF9wb2ludGVyX21hcHBpbmdfcmVwbHlfdCAqCit4Y2Jfc2V0X3BvaW50ZXJfbWFwcGluZ19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9zZXRfcG9pbnRlcl9tYXBwaW5nX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICoqZSAgLyoqPCAqLyk7CisKK2ludAoreGNiX2dldF9wb2ludGVyX21hcHBpbmdfc2l6ZW9mIChjb25zdCB2b2lkICAqX2J1ZmZlciAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19jb29raWVfdCB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX2dldF9wb2ludGVyX21hcHBpbmdfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9wb2ludGVyX21hcHBpbmdfY29va2llX3QKK3hjYl9nZXRfcG9pbnRlcl9tYXBwaW5nICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgY2F1c2UKKyAqIGEgcmVwbHkgdG8gYmUgZ2VuZXJhdGVkLiBBbnkgcmV0dXJuZWQgZXJyb3Igd2lsbCBiZQorICogcGxhY2VkIGluIHRoZSBldmVudCBxdWV1ZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX2Nvb2tpZV90IHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX2dldF9wb2ludGVyX21hcHBpbmdfY29va2llX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9wb2ludGVyX21hcHBpbmdfY29va2llX3QKK3hjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB1aW50OF90ICogeGNiX2dldF9wb2ludGVyX21hcHBpbmdfbWFwCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB1aW50OF90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordWludDhfdCAqCit4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19tYXAgKGNvbnN0IHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogaW50IHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX21hcF9sZW5ndGgKKyAqKiAKKyAqKiBAcGFyYW0gY29uc3QgeGNiX2dldF9wb2ludGVyX21hcHBpbmdfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX21hcF9sZW5ndGggKGNvbnN0IHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dlbmVyaWNfaXRlcmF0b3JfdCB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19tYXBfZW5kCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX3JlcGx5X3QgKlIKKyAqKiBAcmV0dXJucyB4Y2JfZ2VuZXJpY19pdGVyYXRvcl90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZW5lcmljX2l0ZXJhdG9yX3QKK3hjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX21hcF9lbmQgKGNvbnN0IHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2dldF9wb2ludGVyX21hcHBpbmdfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX2dldF9wb2ludGVyX21hcHBpbmdfcmVwbHlfdCAqIHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19jb29raWVfdCAgIGNvb2tpZQorICoqIEBwYXJhbSB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dldF9wb2ludGVyX21hcHBpbmdfcmVwbHlfdCAqCit4Y2JfZ2V0X3BvaW50ZXJfbWFwcGluZ19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZXRfcG9pbnRlcl9tYXBwaW5nX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICoqZSAgLyoqPCAqLyk7CisKK2ludAoreGNiX3NldF9tb2RpZmllcl9tYXBwaW5nX3NpemVvZiAoY29uc3Qgdm9pZCAgKl9idWZmZXIgIC8qKjwgKi8pOworCisvKioKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIKKyAqIEBwYXJhbSBjIFRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJuIEEgY29va2llCisgKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlci4KKyAqIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3NldF9tb2RpZmllcl9tYXBwaW5nX2Nvb2tpZV90IHhjYl9zZXRfbW9kaWZpZXJfbWFwcGluZworICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgICAgIGtleWNvZGVzX3Blcl9tb2RpZmllcgorICoqIEBwYXJhbSBjb25zdCB4Y2Jfa2V5Y29kZV90ICprZXljb2RlcworICoqIEByZXR1cm5zIHhjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfY29va2llX3QKK3hjYl9zZXRfbW9kaWZpZXJfbWFwcGluZyAoeGNiX2Nvbm5lY3Rpb25fdCAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICAga2V5Y29kZXNfcGVyX21vZGlmaWVyICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2Jfa2V5Y29kZV90ICprZXljb2RlcyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfY29va2llX3QgeGNiX3NldF9tb2RpZmllcl9tYXBwaW5nX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICAgICpjCisgKiogQHBhcmFtIHVpbnQ4X3QgICAgICAgICAgICAgIGtleWNvZGVzX3Blcl9tb2RpZmllcgorICoqIEBwYXJhbSBjb25zdCB4Y2Jfa2V5Y29kZV90ICprZXljb2RlcworICoqIEByZXR1cm5zIHhjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfY29va2llX3QKK3hjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ191bmNoZWNrZWQgKHhjYl9jb25uZWN0aW9uX3QgICAgKmMgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICAgICBrZXljb2Rlc19wZXJfbW9kaWZpZXIgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4Y2Jfa2V5Y29kZV90ICprZXljb2RlcyAgLyoqPCAqLyk7CisKKy8qKgorICogUmV0dXJuIHRoZSByZXBseQorICogQHBhcmFtIGMgICAgICBUaGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNvb2tpZSBUaGUgY29va2llCisgKiBAcGFyYW0gZSAgICAgIFRoZSB4Y2JfZ2VuZXJpY19lcnJvcl90IHN1cHBsaWVkCisgKgorICogUmV0dXJucyB0aGUgcmVwbHkgb2YgdGhlIHJlcXVlc3QgYXNrZWQgYnkKKyAqIAorICogVGhlIHBhcmFtZXRlciBAcCBlIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBOVUxMIGlmCisgKiB4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfdW5jaGVja2VkKCkuIGlzIHVzZWQuCisgKiBPdGhlcndpc2UsIGl0IHN0b3JlcyB0aGUgZXJyb3IgaWYgYW55LgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgZnJlZSgpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3NldF9tb2RpZmllcl9tYXBwaW5nX3JlcGx5X3QgKiB4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfcmVwbHkKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAqYworICoqIEBwYXJhbSB4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfY29va2llX3QgICBjb29raWUKKyAqKiBAcGFyYW0geGNiX2dlbmVyaWNfZXJyb3JfdCAgICAgICAgICAgICAgICoqZQorICoqIEByZXR1cm5zIHhjYl9zZXRfbW9kaWZpZXJfbWFwcGluZ19yZXBseV90ICoKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX3NldF9tb2RpZmllcl9tYXBwaW5nX3JlcGx5X3QgKgoreGNiX3NldF9tb2RpZmllcl9tYXBwaW5nX3JlcGx5ICh4Y2JfY29ubmVjdGlvbl90ICAgICAgICAgICAgICAgICAgICpjICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2Jfc2V0X21vZGlmaWVyX21hcHBpbmdfY29va2llX3QgICBjb29raWUgIC8qKjwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICAqKmUgIC8qKjwgKi8pOworCitpbnQKK3hjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19zaXplb2YgKGNvbnN0IHZvaWQgICpfYnVmZmVyICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19jb29raWVfdCB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmcKKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEByZXR1cm5zIHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfY29va2llX3QKK3hjYl9nZXRfbW9kaWZpZXJfbWFwcGluZyAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLyk7CisKKy8qKgorICogRGVsaXZlcnMgYSByZXF1ZXN0IHRvIHRoZSBYIHNlcnZlcgorICogQHBhcmFtIGMgVGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm4gQSBjb29raWUKKyAqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyLgorICogCisgKiBUaGlzIGZvcm0gY2FuIGJlIHVzZWQgb25seSBpZiB0aGUgcmVxdWVzdCB3aWxsIGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHBsYWNlZCBpbiB0aGUgZXZlbnQgcXVldWUuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfY29va2llX3QgeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3VuY2hlY2tlZAorICoqIAorICoqIEBwYXJhbSB4Y2JfY29ubmVjdGlvbl90ICpjCisgKiogQHJldHVybnMgeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19jb29raWVfdAoreGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3VuY2hlY2tlZCAoeGNiX2Nvbm5lY3Rpb25fdCAqYyAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiB4Y2Jfa2V5Y29kZV90ICogeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX2tleWNvZGVzCisgKiogCisgKiogQHBhcmFtIGNvbnN0IHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19yZXBseV90ICpSCisgKiogQHJldHVybnMgeGNiX2tleWNvZGVfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9rZXljb2RlX3QgKgoreGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX2tleWNvZGVzIChjb25zdCB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfcmVwbHlfdCAqUiAgLyoqPCAqLyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiBpbnQgeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX2tleWNvZGVzX2xlbmd0aAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIGludAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitpbnQKK3hjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19rZXljb2Rlc19sZW5ndGggKGNvbnN0IHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19yZXBseV90ICpSICAvKio8ICovKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QgeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX2tleWNvZGVzX2VuZAorICoqIAorICoqIEBwYXJhbSBjb25zdCB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfcmVwbHlfdCAqUgorICoqIEByZXR1cm5zIHhjYl9nZW5lcmljX2l0ZXJhdG9yX3QKKyAqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAoreGNiX2dlbmVyaWNfaXRlcmF0b3JfdAoreGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX2tleWNvZGVzX2VuZCAoY29uc3QgeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3JlcGx5X3QgKlIgIC8qKjwgKi8pOworCisvKioKKyAqIFJldHVybiB0aGUgcmVwbHkKKyAqIEBwYXJhbSBjICAgICAgVGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZQorICogQHBhcmFtIGUgICAgICBUaGUgeGNiX2dlbmVyaWNfZXJyb3JfdCBzdXBwbGllZAorICoKKyAqIFJldHVybnMgdGhlIHJlcGx5IG9mIHRoZSByZXF1ZXN0IGFza2VkIGJ5CisgKiAKKyAqIFRoZSBwYXJhbWV0ZXIgQHAgZSBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgTlVMTCBpZgorICogeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3VuY2hlY2tlZCgpLiBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCBpdCBzdG9yZXMgdGhlIGVycm9yIGlmIGFueS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGZyZWUoKS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19yZXBseV90ICogeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX3JlcGx5CisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgICAgICAgICAgICAgICAgICAgKmMKKyAqKiBAcGFyYW0geGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX2Nvb2tpZV90ICAgY29va2llCisgKiogQHBhcmFtIHhjYl9nZW5lcmljX2Vycm9yX3QgICAgICAgICAgICAgICAqKmUKKyAqKiBAcmV0dXJucyB4Y2JfZ2V0X21vZGlmaWVyX21hcHBpbmdfcmVwbHlfdCAqCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19yZXBseV90ICoKK3hjYl9nZXRfbW9kaWZpZXJfbWFwcGluZ19yZXBseSAoeGNiX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAgICAgICAqYyAgLyoqPCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNiX2dldF9tb2RpZmllcl9tYXBwaW5nX2Nvb2tpZV90ICAgY29va2llICAvKio8ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICAgICAgICAgICAgICAgKiplICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqIFRoaXMgZm9ybSBjYW4gYmUgdXNlZCBvbmx5IGlmIHRoZSByZXF1ZXN0IHdpbGwgbm90IGNhdXNlCisgKiBhIHJlcGx5IHRvIGJlIGdlbmVyYXRlZC4gQW55IHJldHVybmVkIGVycm9yIHdpbGwgYmUKKyAqIHNhdmVkIGZvciBoYW5kbGluZyBieSB4Y2JfcmVxdWVzdF9jaGVjaygpLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogeGNiX3ZvaWRfY29va2llX3QgeGNiX25vX29wZXJhdGlvbl9jaGVja2VkCisgKiogCisgKiogQHBhcmFtIHhjYl9jb25uZWN0aW9uX3QgKmMKKyAqKiBAcmV0dXJucyB4Y2Jfdm9pZF9jb29raWVfdAorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCit4Y2Jfdm9pZF9jb29raWVfdAoreGNiX25vX29wZXJhdGlvbl9jaGVja2VkICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworLyoqCisgKiBEZWxpdmVycyBhIHJlcXVlc3QgdG8gdGhlIFggc2VydmVyCisgKiBAcGFyYW0gYyBUaGUgY29ubmVjdGlvbgorICogQHJldHVybiBBIGNvb2tpZQorICoKKyAqIERlbGl2ZXJzIGEgcmVxdWVzdCB0byB0aGUgWCBzZXJ2ZXIuCisgKiAKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIHhjYl92b2lkX2Nvb2tpZV90IHhjYl9ub19vcGVyYXRpb24KKyAqKiAKKyAqKiBAcGFyYW0geGNiX2Nvbm5lY3Rpb25fdCAqYworICoqIEByZXR1cm5zIHhjYl92b2lkX2Nvb2tpZV90CisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3hjYl92b2lkX2Nvb2tpZV90Cit4Y2Jfbm9fb3BlcmF0aW9uICh4Y2JfY29ubmVjdGlvbl90ICpjICAvKio8ICovKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKworLyoqCisgKiBAfQorICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3hlbi9ldnRjaG4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveGVuL2V2dGNobi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZTgzM2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3hlbi9ldnRjaG4uaApAQCAtMCwwICsxLDg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBldnRjaG4uaAorICoKKyAqIEludGVyZmFjZSB0byAvZGV2L3hlbi9ldnRjaG4uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUsIEsgQSBGcmFzZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBvciwgd2hlbiBkaXN0cmlidXRlZAorICogc2VwYXJhdGVseSBmcm9tIHRoZSBMaW51eCBrZXJuZWwgb3IgaW5jb3Jwb3JhdGVkIGludG8gb3RoZXIKKyAqIHNvZnR3YXJlIHBhY2thZ2VzLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgbGljZW5zZToKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvdXJjZSBmaWxlICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksCisgKiBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9QVUJMSUNfRVZUQ0hOX0hfXworI2RlZmluZSBfX0xJTlVYX1BVQkxJQ19FVlRDSE5fSF9fCisKKy8qCisgKiBCaW5kIGEgZnJlc2ggcG9ydCB0byBWSVJRIEB2aXJxLgorICogUmV0dXJuIGFsbG9jYXRlZCBwb3J0LgorICovCisjZGVmaW5lIElPQ1RMX0VWVENITl9CSU5EX1ZJUlEJCQkJXAorCV9JT0MoX0lPQ19OT05FLCAnRScsIDAsIHNpemVvZihzdHJ1Y3QgaW9jdGxfZXZ0Y2huX2JpbmRfdmlycSkpCitzdHJ1Y3QgaW9jdGxfZXZ0Y2huX2JpbmRfdmlycSB7CisJdW5zaWduZWQgaW50IHZpcnE7Cit9OworCisvKgorICogQmluZCBhIGZyZXNoIHBvcnQgdG8gcmVtb3RlIDxAcmVtb3RlX2RvbWFpbiwgQHJlbW90ZV9wb3J0Pi4KKyAqIFJldHVybiBhbGxvY2F0ZWQgcG9ydC4KKyAqLworI2RlZmluZSBJT0NUTF9FVlRDSE5fQklORF9JTlRFUkRPTUFJTgkJCVwKKwlfSU9DKF9JT0NfTk9ORSwgJ0UnLCAxLCBzaXplb2Yoc3RydWN0IGlvY3RsX2V2dGNobl9iaW5kX2ludGVyZG9tYWluKSkKK3N0cnVjdCBpb2N0bF9ldnRjaG5fYmluZF9pbnRlcmRvbWFpbiB7CisJdW5zaWduZWQgaW50IHJlbW90ZV9kb21haW4sIHJlbW90ZV9wb3J0OworfTsKKworLyoKKyAqIEFsbG9jYXRlIGEgZnJlc2ggcG9ydCBmb3IgYmluZGluZyB0byBAcmVtb3RlX2RvbWFpbi4KKyAqIFJldHVybiBhbGxvY2F0ZWQgcG9ydC4KKyAqLworI2RlZmluZSBJT0NUTF9FVlRDSE5fQklORF9VTkJPVU5EX1BPUlQJCQlcCisJX0lPQyhfSU9DX05PTkUsICdFJywgMiwgc2l6ZW9mKHN0cnVjdCBpb2N0bF9ldnRjaG5fYmluZF91bmJvdW5kX3BvcnQpKQorc3RydWN0IGlvY3RsX2V2dGNobl9iaW5kX3VuYm91bmRfcG9ydCB7CisJdW5zaWduZWQgaW50IHJlbW90ZV9kb21haW47Cit9OworCisvKgorICogVW5iaW5kIHByZXZpb3VzbHkgYWxsb2NhdGVkIEBwb3J0LgorICovCisjZGVmaW5lIElPQ1RMX0VWVENITl9VTkJJTkQJCQkJXAorCV9JT0MoX0lPQ19OT05FLCAnRScsIDMsIHNpemVvZihzdHJ1Y3QgaW9jdGxfZXZ0Y2huX3VuYmluZCkpCitzdHJ1Y3QgaW9jdGxfZXZ0Y2huX3VuYmluZCB7CisJdW5zaWduZWQgaW50IHBvcnQ7Cit9OworCisvKgorICogVW5iaW5kIHByZXZpb3VzbHkgYWxsb2NhdGVkIEBwb3J0LgorICovCisjZGVmaW5lIElPQ1RMX0VWVENITl9OT1RJRlkJCQkJXAorCV9JT0MoX0lPQ19OT05FLCAnRScsIDQsIHNpemVvZihzdHJ1Y3QgaW9jdGxfZXZ0Y2huX25vdGlmeSkpCitzdHJ1Y3QgaW9jdGxfZXZ0Y2huX25vdGlmeSB7CisJdW5zaWduZWQgaW50IHBvcnQ7Cit9OworCisvKiBDbGVhciBhbmQgcmVpbml0aWFsaXNlIHRoZSBldmVudCBidWZmZXIuIENsZWFyIGVycm9yIGNvbmRpdGlvbi4gKi8KKyNkZWZpbmUgSU9DVExfRVZUQ0hOX1JFU0VUCQkJCVwKKwlfSU9DKF9JT0NfTk9ORSwgJ0UnLCA1LCAwKQorCisjZW5kaWYgLyogX19MSU5VWF9QVUJMSUNfRVZUQ0hOX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS94ZW4vcHJpdmNtZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94ZW4vcHJpdmNtZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYjAzYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3hlbi9wcml2Y21kLmgKQEAgLTAsMCArMSw3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcHJpdmNtZC5oCisgKgorICogSW50ZXJmYWNlIHRvIC9wcm9jL3hlbi9wcml2Y21kLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA1LCBLIEEgRnJhc2VyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgb3IsIHdoZW4gZGlzdHJpYnV0ZWQKKyAqIHNlcGFyYXRlbHkgZnJvbSB0aGUgTGludXgga2VybmVsIG9yIGluY29ycG9yYXRlZCBpbnRvIG90aGVyCisgKiBzb2Z0d2FyZSBwYWNrYWdlcywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb3VyY2UgZmlsZSAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LAorICogbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfUFVCTElDX1BSSVZDTURfSF9fCisjZGVmaW5lIF9fTElOVVhfUFVCTElDX1BSSVZDTURfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB4ZW5fcGZuX3Q7CisKK3N0cnVjdCBwcml2Y21kX2h5cGVyY2FsbCB7CisJX191NjQgb3A7CisJX191NjQgYXJnWzVdOworfTsKKworc3RydWN0IHByaXZjbWRfbW1hcF9lbnRyeSB7CisJX191NjQgdmE7CisJX191NjQgbWZuOworCV9fdTY0IG5wYWdlczsKK307CisKK3N0cnVjdCBwcml2Y21kX21tYXAgeworCWludCBudW07CisJZG9taWRfdCBkb207IC8qIHRhcmdldCBkb21haW4gKi8KKwlzdHJ1Y3QgcHJpdmNtZF9tbWFwX2VudHJ5ICplbnRyeTsKK307CisKK3N0cnVjdCBwcml2Y21kX21tYXBiYXRjaCB7CisJaW50IG51bTsgICAgIC8qIG51bWJlciBvZiBwYWdlcyB0byBwb3B1bGF0ZSAqLworCWRvbWlkX3QgZG9tOyAvKiB0YXJnZXQgZG9tYWluICovCisJX191NjQgYWRkcjsgIC8qIHZpcnR1YWwgYWRkcmVzcyAqLworCXhlbl9wZm5fdCAqYXJyOyAvKiBhcnJheSBvZiBtZm5zIC0gdG9wIG5pYmJsZSBzZXQgb24gZXJyICovCit9OworCisvKgorICogQGNtZDogSU9DVExfUFJJVkNNRF9IWVBFUkNBTEwKKyAqIEBhcmc6ICZwcml2Y21kX2h5cGVyY2FsbF90CisgKiBSZXR1cm46IFZhbHVlIHJldHVybmVkIGZyb20gZXhlY3V0aW9uIG9mIHRoZSBzcGVjaWZpZWQgaHlwZXJjYWxsLgorICovCisjZGVmaW5lIElPQ1RMX1BSSVZDTURfSFlQRVJDQUxMCQkJCQlcCisJX0lPQyhfSU9DX05PTkUsICdQJywgMCwgc2l6ZW9mKHN0cnVjdCBwcml2Y21kX2h5cGVyY2FsbCkpCisjZGVmaW5lIElPQ1RMX1BSSVZDTURfTU1BUAkJCQkJXAorCV9JT0MoX0lPQ19OT05FLCAnUCcsIDIsIHNpemVvZihzdHJ1Y3QgcHJpdmNtZF9tbWFwKSkKKyNkZWZpbmUgSU9DVExfUFJJVkNNRF9NTUFQQkFUQ0gJCQkJCVwKKwlfSU9DKF9JT0NfTk9ORSwgJ1AnLCAzLCBzaXplb2Yoc3RydWN0IHByaXZjbWRfbW1hcGJhdGNoKSkKKworI2VuZGlmIC8qIF9fTElOVVhfUFVCTElDX1BSSVZDTURfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3hsb2NhbGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveGxvY2FsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNTQxNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3hsb2NhbGUuaApAQCAtMCwwICsxLDQ1IEBACisvKiBEZWZpbml0aW9uIG9mIGxvY2FsZSBkYXRhdHlwZS4KKyAgIENvcHlyaWdodCAoQykgMTk5NywyMDAwLDIwMDIsMjAwOSwyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ny4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1hMT0NBTEVfSAorI2RlZmluZSBfWExPQ0FMRV9ICTEKKworLyogU3RydWN0dXJlIGZvciByZWVudHJhbnQgbG9jYWxlIHVzaW5nIGZ1bmN0aW9ucy4gIFRoaXMgaXMgYW4KKyAgIChhbG1vc3QpIG9wYXF1ZSB0eXBlIGZvciB0aGUgdXNlciBsZXZlbCBwcm9ncmFtcy4gIFRoZSBmaWxlIGFuZAorICAgdGhpcyBkYXRhIHN0cnVjdHVyZSBpcyBub3Qgc3RhbmRhcmRpemVkLiAgRG9uJ3QgcmVseSBvbiBpdC4gIEl0IGNhbgorICAgZ28gYXdheSB3aXRob3V0IHdhcm5pbmcuICAqLwordHlwZWRlZiBzdHJ1Y3QgX19sb2NhbGVfc3RydWN0Cit7CisgIC8qIE5vdGU6IExDX0FMTCBpcyBub3QgYSB2YWxpZCBpbmRleCBpbnRvIHRoaXMgYXJyYXkuICAqLworICBzdHJ1Y3QgX19sb2NhbGVfZGF0YSAqX19sb2NhbGVzWzEzXTsgLyogMTMgPSBfX0xDX0xBU1QuICovCisKKyAgLyogVG8gaW5jcmVhc2UgdGhlIHNwZWVkIG9mIHRoaXMgc29sdXRpb24gd2UgYWRkIHNvbWUgc3BlY2lhbCBtZW1iZXJzLiAgKi8KKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgaW50ICpfX2N0eXBlX2I7CisgIGNvbnN0IGludCAqX19jdHlwZV90b2xvd2VyOworICBjb25zdCBpbnQgKl9fY3R5cGVfdG91cHBlcjsKKworICAvKiBOb3RlOiBMQ19BTEwgaXMgbm90IGEgdmFsaWQgaW5kZXggaW50byB0aGlzIGFycmF5LiAgKi8KKyAgY29uc3QgY2hhciAqX19uYW1lc1sxM107Cit9ICpfX2xvY2FsZV90OworCisvKiBQT1NJWCAyMDA4IG1ha2VzIGxvY2FsZV90IG9mZmljaWFsLiAgKi8KK3R5cGVkZWYgX19sb2NhbGVfdCBsb2NhbGVfdDsKKworI2VuZGlmIC8qIHhsb2NhbGUuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS96Y29uZi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS96Y29uZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDk1NTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3pjb25mLmgKQEAgLTAsMCArMSwzOTQgQEAKKy8qIHpjb25mLmggLS0gY29uZmlndXJhdGlvbiBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNyBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIEAoIykgJElkJCAqLworCisjaWZuZGVmIFpDT05GX0gKKyNkZWZpbmUgWkNPTkZfSAorCisvKgorICogSWYgeW91ICpyZWFsbHkqIG5lZWQgYSB1bmlxdWUgcHJlZml4IGZvciBhbGwgdHlwZXMgYW5kIGxpYnJhcnkgZnVuY3Rpb25zLAorICogY29tcGlsZSB3aXRoIC1EWl9QUkVGSVguIFRoZSAic3RhbmRhcmQiIHpsaWIgc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGhvdXQgaXQuCisgKiBFdmVuIGJldHRlciB0aGFuIGNvbXBpbGluZyB3aXRoIC1EWl9QUkVGSVggd291bGQgYmUgdG8gdXNlIGNvbmZpZ3VyZSB0byBzZXQKKyAqIHRoaXMgcGVybWFuZW50bHkgaW4gemNvbmYuaCB1c2luZyAiLi9jb25maWd1cmUgLS16cHJlZml4Ii4KKyAqLworI2lmZGVmIFpfUFJFRklYICAgICAvKiBtYXkgYmUgc2V0IHRvICNpZiAxIGJ5IC4vY29uZmlndXJlICovCisKKy8qIGFsbCBsaW5rZWQgc3ltYm9scyAqLworIyAgZGVmaW5lIF9kaXN0X2NvZGUgICAgICAgICAgICB6X19kaXN0X2NvZGUKKyMgIGRlZmluZSBfbGVuZ3RoX2NvZGUgICAgICAgICAgel9fbGVuZ3RoX2NvZGUKKyMgIGRlZmluZSBfdHJfYWxpZ24gICAgICAgICAgICAgel9fdHJfYWxpZ24KKyMgIGRlZmluZSBfdHJfZmx1c2hfYmxvY2sgICAgICAgel9fdHJfZmx1c2hfYmxvY2sKKyMgIGRlZmluZSBfdHJfaW5pdCAgICAgICAgICAgICAgel9fdHJfaW5pdAorIyAgZGVmaW5lIF90cl9zdG9yZWRfYmxvY2sgICAgICB6X190cl9zdG9yZWRfYmxvY2sKKyMgIGRlZmluZSBfdHJfdGFsbHkgICAgICAgICAgICAgel9fdHJfdGFsbHkKKyMgIGRlZmluZSBhZGxlcjMyICAgICAgICAgICAgICAgel9hZGxlcjMyCisjICBkZWZpbmUgYWRsZXIzMl9jb21iaW5lICAgICAgIHpfYWRsZXIzMl9jb21iaW5lCisjICBkZWZpbmUgY29tcHJlc3MgICAgICAgICAgICAgIHpfY29tcHJlc3MKKyMgIGRlZmluZSBjb21wcmVzczIgICAgICAgICAgICAgel9jb21wcmVzczIKKyMgIGRlZmluZSBjb21wcmVzc0JvdW5kICAgICAgICAgel9jb21wcmVzc0JvdW5kCisjICBkZWZpbmUgY3JjMzIgICAgICAgICAgICAgICAgIHpfY3JjMzIKKyMgIGRlZmluZSBjcmMzMl9jb21iaW5lICAgICAgICAgel9jcmMzMl9jb21iaW5lCisjICBkZWZpbmUgZGVmbGF0ZSAgICAgICAgICAgICAgIHpfZGVmbGF0ZQorIyAgZGVmaW5lIGRlZmxhdGVCb3VuZCAgICAgICAgICB6X2RlZmxhdGVCb3VuZAorIyAgZGVmaW5lIGRlZmxhdGVDb3B5ICAgICAgICAgICB6X2RlZmxhdGVDb3B5CisjICBkZWZpbmUgZGVmbGF0ZUVuZCAgICAgICAgICAgIHpfZGVmbGF0ZUVuZAorIyAgZGVmaW5lIGRlZmxhdGVJbml0Ml8gICAgICAgICB6X2RlZmxhdGVJbml0Ml8KKyMgIGRlZmluZSBkZWZsYXRlSW5pdF8gICAgICAgICAgel9kZWZsYXRlSW5pdF8KKyMgIGRlZmluZSBkZWZsYXRlUGFyYW1zICAgICAgICAgel9kZWZsYXRlUGFyYW1zCisjICBkZWZpbmUgZGVmbGF0ZVByaW1lICAgICAgICAgIHpfZGVmbGF0ZVByaW1lCisjICBkZWZpbmUgZGVmbGF0ZVJlc2V0ICAgICAgICAgIHpfZGVmbGF0ZVJlc2V0CisjICBkZWZpbmUgZGVmbGF0ZVNldERpY3Rpb25hcnkgIHpfZGVmbGF0ZVNldERpY3Rpb25hcnkKKyMgIGRlZmluZSBkZWZsYXRlU2V0SGVhZGVyICAgICAgel9kZWZsYXRlU2V0SGVhZGVyCisjICBkZWZpbmUgZGVmbGF0ZVR1bmUgICAgICAgICAgIHpfZGVmbGF0ZVR1bmUKKyMgIGRlZmluZSBkZWZsYXRlX2NvcHlyaWdodCAgICAgel9kZWZsYXRlX2NvcHlyaWdodAorIyAgZGVmaW5lIGdldF9jcmNfdGFibGUgICAgICAgICB6X2dldF9jcmNfdGFibGUKKyMgIGRlZmluZSBnemNsZWFyZXJyICAgICAgICAgICAgel9nemNsZWFyZXJyCisjICBkZWZpbmUgZ3pjbG9zZSAgICAgICAgICAgICAgIHpfZ3pjbG9zZQorIyAgZGVmaW5lIGd6ZGlyZWN0ICAgICAgICAgICAgICB6X2d6ZGlyZWN0CisjICBkZWZpbmUgZ3pkb3BlbiAgICAgICAgICAgICAgIHpfZ3pkb3BlbgorIyAgZGVmaW5lIGd6ZW9mICAgICAgICAgICAgICAgICB6X2d6ZW9mCisjICBkZWZpbmUgZ3plcnJvciAgICAgICAgICAgICAgIHpfZ3plcnJvcgorIyAgZGVmaW5lIGd6Zmx1c2ggICAgICAgICAgICAgICB6X2d6Zmx1c2gKKyMgIGRlZmluZSBnemdldGMgICAgICAgICAgICAgICAgel9nemdldGMKKyMgIGRlZmluZSBnemdldHMgICAgICAgICAgICAgICAgel9nemdldHMKKyMgIGRlZmluZSBnem9wZW4gICAgICAgICAgICAgICAgel9nem9wZW4KKyMgIGRlZmluZSBnenByaW50ZiAgICAgICAgICAgICAgel9nenByaW50ZgorIyAgZGVmaW5lIGd6cHV0YyAgICAgICAgICAgICAgICB6X2d6cHV0YworIyAgZGVmaW5lIGd6cHV0cyAgICAgICAgICAgICAgICB6X2d6cHV0cworIyAgZGVmaW5lIGd6cmVhZCAgICAgICAgICAgICAgICB6X2d6cmVhZAorIyAgZGVmaW5lIGd6cmV3aW5kICAgICAgICAgICAgICB6X2d6cmV3aW5kCisjICBkZWZpbmUgZ3pzZWVrICAgICAgICAgICAgICAgIHpfZ3pzZWVrCisjICBkZWZpbmUgZ3pzZXRwYXJhbXMgICAgICAgICAgIHpfZ3pzZXRwYXJhbXMKKyMgIGRlZmluZSBnenRlbGwgICAgICAgICAgICAgICAgel9nenRlbGwKKyMgIGRlZmluZSBnenVuZ2V0YyAgICAgICAgICAgICAgel9nenVuZ2V0YworIyAgZGVmaW5lIGd6d3JpdGUgICAgICAgICAgICAgICB6X2d6d3JpdGUKKyMgIGRlZmluZSBpbmZsYXRlICAgICAgICAgICAgICAgel9pbmZsYXRlCisjICBkZWZpbmUgaW5mbGF0ZUJhY2sgICAgICAgICAgIHpfaW5mbGF0ZUJhY2sKKyMgIGRlZmluZSBpbmZsYXRlQmFja0VuZCAgICAgICAgel9pbmZsYXRlQmFja0VuZAorIyAgZGVmaW5lIGluZmxhdGVCYWNrSW5pdF8gICAgICB6X2luZmxhdGVCYWNrSW5pdF8KKyMgIGRlZmluZSBpbmZsYXRlQ29weSAgICAgICAgICAgel9pbmZsYXRlQ29weQorIyAgZGVmaW5lIGluZmxhdGVFbmQgICAgICAgICAgICB6X2luZmxhdGVFbmQKKyMgIGRlZmluZSBpbmZsYXRlR2V0SGVhZGVyICAgICAgel9pbmZsYXRlR2V0SGVhZGVyCisjICBkZWZpbmUgaW5mbGF0ZUluaXQyXyAgICAgICAgIHpfaW5mbGF0ZUluaXQyXworIyAgZGVmaW5lIGluZmxhdGVJbml0XyAgICAgICAgICB6X2luZmxhdGVJbml0XworIyAgZGVmaW5lIGluZmxhdGVQcmltZSAgICAgICAgICB6X2luZmxhdGVQcmltZQorIyAgZGVmaW5lIGluZmxhdGVSZXNldCAgICAgICAgICB6X2luZmxhdGVSZXNldAorIyAgZGVmaW5lIGluZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2luZmxhdGVTZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgaW5mbGF0ZVN5bmMgICAgICAgICAgIHpfaW5mbGF0ZVN5bmMKKyMgIGRlZmluZSBpbmZsYXRlU3luY1BvaW50ICAgICAgel9pbmZsYXRlU3luY1BvaW50CisjICBkZWZpbmUgaW5mbGF0ZV9jb3B5cmlnaHQgICAgIHpfaW5mbGF0ZV9jb3B5cmlnaHQKKyMgIGRlZmluZSBpbmZsYXRlX2Zhc3QgICAgICAgICAgel9pbmZsYXRlX2Zhc3QKKyMgIGRlZmluZSBpbmZsYXRlX3RhYmxlICAgICAgICAgel9pbmZsYXRlX3RhYmxlCisjICBkZWZpbmUgdW5jb21wcmVzcyAgICAgICAgICAgIHpfdW5jb21wcmVzcworIyAgZGVmaW5lIHpFcnJvciAgICAgICAgICAgICAgICB6X3pFcnJvcgorIyAgZGVmaW5lIHpfZXJybXNnICAgICAgICAgICAgICB6X3pfZXJybXNnCisjICBkZWZpbmUgemNhbGxvYyAgICAgICAgICAgICAgIHpfemNhbGxvYworIyAgZGVmaW5lIHpjZnJlZSAgICAgICAgICAgICAgICB6X3pjZnJlZQorIyAgZGVmaW5lIHpsaWJDb21waWxlRmxhZ3MgICAgICB6X3psaWJDb21waWxlRmxhZ3MKKyMgIGRlZmluZSB6bGliVmVyc2lvbiAgICAgICAgICAgel96bGliVmVyc2lvbgorCisvKiBhbGwgemxpYiB0eXBlZGVmcyBpbiB6bGliLmggYW5kIHpjb25mLmggKi8KKyMgIGRlZmluZSBCeXRlICAgICAgICAgICAgICAgICAgel9CeXRlCisjICBkZWZpbmUgQnl0ZWYgICAgICAgICAgICAgICAgIHpfQnl0ZWYKKyMgIGRlZmluZSBhbGxvY19mdW5jICAgICAgICAgICAgel9hbGxvY19mdW5jCisjICBkZWZpbmUgY2hhcmYgICAgICAgICAgICAgICAgIHpfY2hhcmYKKyMgIGRlZmluZSBmcmVlX2Z1bmMgICAgICAgICAgICAgel9mcmVlX2Z1bmMKKyMgIGRlZmluZSBnekZpbGUgICAgICAgICAgICAgICAgel9nekZpbGUKKyMgIGRlZmluZSBnel9oZWFkZXIgICAgICAgICAgICAgel9nel9oZWFkZXIKKyMgIGRlZmluZSBnel9oZWFkZXJwICAgICAgICAgICAgel9nel9oZWFkZXJwCisjICBkZWZpbmUgaW5fZnVuYyAgICAgICAgICAgICAgIHpfaW5fZnVuYworIyAgZGVmaW5lIGludGYgICAgICAgICAgICAgICAgICB6X2ludGYKKyMgIGRlZmluZSBvdXRfZnVuYyAgICAgICAgICAgICAgel9vdXRfZnVuYworIyAgZGVmaW5lIHVJbnQgICAgICAgICAgICAgICAgICB6X3VJbnQKKyMgIGRlZmluZSB1SW50ZiAgICAgICAgICAgICAgICAgel91SW50ZgorIyAgZGVmaW5lIHVMb25nICAgICAgICAgICAgICAgICB6X3VMb25nCisjICBkZWZpbmUgdUxvbmdmICAgICAgICAgICAgICAgIHpfdUxvbmdmCisjICBkZWZpbmUgdm9pZHAgICAgICAgICAgICAgICAgIHpfdm9pZHAKKyMgIGRlZmluZSB2b2lkcCAgICAgICAgICAgICAgICAgel92b2lkcAorIyAgZGVmaW5lIHZvaWRwYyAgICAgICAgICAgICAgICB6X3ZvaWRwYworIyAgZGVmaW5lIHZvaWRwYyAgICAgICAgICAgICAgICB6X3ZvaWRwYworIyAgZGVmaW5lIHZvaWRwZiAgICAgICAgICAgICAgICB6X3ZvaWRwZgorIyAgZGVmaW5lIHZvaWRwZiAgICAgICAgICAgICAgICB6X3ZvaWRwZgorIyAgZGVmaW5lIHpfc3RyZWFtICAgICAgICAgICAgICB6X3pfc3RyZWFtCisjICBkZWZpbmUgel9zdHJlYW1wICAgICAgICAgICAgIHpfel9zdHJlYW1wCisKKy8qIGFsbCB6bGliIHN0cnVjdHMgaW4gemxpYi5oIGFuZCB6Y29uZi5oICovCisjICBkZWZpbmUgZ3pfaGVhZGVyX3MgICAgICAgICAgIHpfZ3pfaGVhZGVyX3MKKyMgIGRlZmluZSBpbnRlcm5hbF9zdGF0ZSAgICAgICAgel9pbnRlcm5hbF9zdGF0ZQorIyAgZGVmaW5lIHpfc3RyZWFtX3MgICAgICAgICAgICB6X3pfc3RyZWFtX3MKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fTVNET1NfXykgJiYgIWRlZmluZWQoTVNET1MpCisjICBkZWZpbmUgTVNET1MKKyNlbmRpZgorI2lmIChkZWZpbmVkKE9TXzIpIHx8IGRlZmluZWQoX19PUzJfXykpICYmICFkZWZpbmVkKE9TMikKKyMgIGRlZmluZSBPUzIKKyNlbmRpZgorI2lmIGRlZmluZWQoX1dJTkRPV1MpICYmICFkZWZpbmVkKFdJTkRPV1MpCisjICBkZWZpbmUgV0lORE9XUworI2VuZGlmCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkgfHwgZGVmaW5lZChfX1dJTjMyX18pCisjICBpZm5kZWYgV0lOMzIKKyMgICAgZGVmaW5lIFdJTjMyCisjICBlbmRpZgorI2VuZGlmCisjaWYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTkRPV1MpKSAmJiAhZGVmaW5lZChXSU4zMikKKyMgIGlmICFkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykgJiYgIWRlZmluZWQoX18zODZfXykKKyMgICAgaWZuZGVmIFNZUzE2QklUCisjICAgICAgZGVmaW5lIFNZUzE2QklUCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKy8qCisgKiBDb21waWxlIHdpdGggLURNQVhTRUdfNjRLIGlmIHRoZSBhbGxvYyBmdW5jdGlvbiBjYW5ub3QgYWxsb2NhdGUgbW9yZQorICogdGhhbiA2NGsgYnl0ZXMgYXQgYSB0aW1lIChuZWVkZWQgb24gc3lzdGVtcyB3aXRoIDE2LWJpdCBpbnQpLgorICovCisjaWZkZWYgU1lTMTZCSVQKKyMgIGRlZmluZSBNQVhTRUdfNjRLCisjZW5kaWYKKyNpZmRlZiBNU0RPUworIyAgZGVmaW5lIFVOQUxJR05FRF9PSworI2VuZGlmCisKKyNpZmRlZiBfX1NURENfVkVSU0lPTl9fCisjICBpZm5kZWYgU1REQworIyAgICBkZWZpbmUgU1REQworIyAgZW5kaWYKKyMgIGlmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorIyAgICBpZm5kZWYgU1REQzk5CisjICAgICAgZGVmaW5lIFNUREM5OQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChfX0hPU19BSVhfXykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fT1M0MDBfXykgJiYgIWRlZmluZWQoU1REQykgICAgLyogaVNlcmllcyAoZm9ybWVybHkgQVMvNDAwKS4gKi8KKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKworI2lmbmRlZiBTVERDCisjICBpZm5kZWYgY29uc3QgLyogY2Fubm90IHVzZSAhZGVmaW5lZChTVERDKSAmJiAhZGVmaW5lZChjb25zdCkgb24gTWFjICovCisjICAgIGRlZmluZSBjb25zdCAgICAgICAvKiBub3RlOiBuZWVkIGEgbW9yZSBnZW50bGUgc29sdXRpb24gaGVyZSAqLworIyAgZW5kaWYKKyNlbmRpZgorCisvKiBTb21lIE1hYyBjb21waWxlcnMgbWVyZ2UgYWxsIC5oIGZpbGVzIGluY29ycmVjdGx5OiAqLworI2lmIGRlZmluZWQoX19NV0VSS1NfXyl8fGRlZmluZWQoYXBwbGVjKXx8ZGVmaW5lZChUSElOS19DKXx8ZGVmaW5lZChfX1NDX18pCisjICBkZWZpbmUgTk9fRFVNTVlfREVDTAorI2VuZGlmCisKKy8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqLworI2lmbmRlZiBNQVhfTUVNX0xFVkVMCisjICBpZmRlZiBNQVhTRUdfNjRLCisjICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDgKKyMgIGVsc2UKKyMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOQorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBNYXhpbXVtIHZhbHVlIGZvciB3aW5kb3dCaXRzIGluIGRlZmxhdGVJbml0MiBhbmQgaW5mbGF0ZUluaXQyLgorICogV0FSTklORzogcmVkdWNpbmcgTUFYX1dCSVRTIG1ha2VzIG1pbmlnemlwIHVuYWJsZSB0byBleHRyYWN0IC5neiBmaWxlcworICogY3JlYXRlZCBieSBnemlwLiAoRmlsZXMgY3JlYXRlZCBieSBtaW5pZ3ppcCBjYW4gc3RpbGwgYmUgZXh0cmFjdGVkIGJ5CisgKiBnemlwLikKKyAqLworI2lmbmRlZiBNQVhfV0JJVFMKKyMgIGRlZmluZSBNQVhfV0JJVFMgICAxNSAvKiAzMksgTFo3NyB3aW5kb3cgKi8KKyNlbmRpZgorCisvKiBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgZGVmbGF0ZSBhcmUgKGluIGJ5dGVzKToKKyAgICAgICAgICAgICgxIDw8ICh3aW5kb3dCaXRzKzIpKSArICAoMSA8PCAobWVtTGV2ZWwrOSkpCisgdGhhdCBpczogMTI4SyBmb3Igd2luZG93Qml0cz0xNSAgKyAgMTI4SyBmb3IgbWVtTGV2ZWwgPSA4ICAoZGVmYXVsdCB2YWx1ZXMpCisgcGx1cyBhIGZldyBraWxvYnl0ZXMgZm9yIHNtYWxsIG9iamVjdHMuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byByZWR1Y2UKKyB0aGUgZGVmYXVsdCBtZW1vcnkgcmVxdWlyZW1lbnRzIGZyb20gMjU2SyB0byAxMjhLLCBjb21waWxlIHdpdGgKKyAgICAgbWFrZSBDRkxBR1M9Ii1PIC1ETUFYX1dCSVRTPTE0IC1ETUFYX01FTV9MRVZFTD03IgorIE9mIGNvdXJzZSB0aGlzIHdpbGwgZ2VuZXJhbGx5IGRlZ3JhZGUgY29tcHJlc3Npb24gKHRoZXJlJ3Mgbm8gZnJlZSBsdW5jaCkuCisKKyAgIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBpbmZsYXRlIGFyZSAoaW4gYnl0ZXMpIDEgPDwgd2luZG93Qml0cworIHRoYXQgaXMsIDMySyBmb3Igd2luZG93Qml0cz0xNSAoZGVmYXVsdCB2YWx1ZSkgcGx1cyBhIGZldyBraWxvYnl0ZXMKKyBmb3Igc21hbGwgb2JqZWN0cy4KKyovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgZGVjbGFyYXRpb25zICovCisKKyNpZm5kZWYgT0YgLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLworIyAgaWZkZWYgU1REQworIyAgICBkZWZpbmUgT0YoYXJncykgIGFyZ3MKKyMgIGVsc2UKKyMgICAgZGVmaW5lIE9GKGFyZ3MpICAoKQorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGZvciBGQVIgYXJlIG5lZWRlZCBvbmx5IGZvciBNU0RPUyBtaXhlZAorICogbW9kZWwgcHJvZ3JhbW1pbmcgKHNtYWxsIG9yIG1lZGl1bSBtb2RlbCB3aXRoIHNvbWUgZmFyIGFsbG9jYXRpb25zKS4KKyAqIFRoaXMgd2FzIHRlc3RlZCBvbmx5IHdpdGggTVNDOyBmb3Igb3RoZXIgTVNET1MgY29tcGlsZXJzIHlvdSBtYXkgaGF2ZQorICogdG8gZGVmaW5lIE5PX01FTUNQWSBpbiB6dXRpbC5oLiAgSWYgeW91IGRvbid0IG5lZWQgdGhlIG1peGVkIG1vZGVsLAorICoganVzdCBkZWZpbmUgRkFSIHRvIGJlIGVtcHR5LgorICovCisjaWZkZWYgU1lTMTZCSVQKKyMgIGlmIGRlZmluZWQoTV9JODZTTSkgfHwgZGVmaW5lZChNX0k4Nk1NKQorICAgICAvKiBNU0Mgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCisjICAgIGRlZmluZSBTTUFMTF9NRURJVU0KKyMgICAgaWZkZWYgX01TQ19WRVIKKyMgICAgICBkZWZpbmUgRkFSIF9mYXIKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBGQVIgZmFyCisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgaWYgKGRlZmluZWQoX19TTUFMTF9fKSB8fCBkZWZpbmVkKF9fTUVESVVNX18pKQorICAgICAvKiBUdXJibyBDIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLworIyAgICBkZWZpbmUgU01BTExfTUVESVVNCisjICAgIGlmZGVmIF9fQk9STEFORENfXworIyAgICAgIGRlZmluZSBGQVIgX2ZhcgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIEZBUiBmYXIKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikKKyAgIC8qIElmIGJ1aWxkaW5nIG9yIHVzaW5nIHpsaWIgYXMgYSBETEwsIGRlZmluZSBaTElCX0RMTC4KKyAgICAqIFRoaXMgaXMgbm90IG1hbmRhdG9yeSwgYnV0IGl0IG9mZmVycyBhIGxpdHRsZSBwZXJmb3JtYW5jZSBpbmNyZWFzZS4KKyAgICAqLworIyAgaWZkZWYgWkxJQl9ETEwKKyMgICAgaWYgZGVmaW5lZChXSU4zMikgJiYgKCFkZWZpbmVkKF9fQk9STEFORENfXykgfHwgKF9fQk9STEFORENfXyA+PSAweDUwMCkpCisjICAgICAgaWZkZWYgWkxJQl9JTlRFUk5BTAorIyAgICAgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICAgIGVsc2UKKyMgICAgICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYgIC8qIFpMSUJfRExMICovCisgICAvKiBJZiBidWlsZGluZyBvciB1c2luZyB6bGliIHdpdGggdGhlIFdJTkFQSS9XSU5BUElWIGNhbGxpbmcgY29udmVudGlvbiwKKyAgICAqIGRlZmluZSBaTElCX1dJTkFQSS4KKyAgICAqIENhdXRpb246IHRoZSBzdGFuZGFyZCBaTElCMS5ETEwgaXMgTk9UIGNvbXBpbGVkIHVzaW5nIFpMSUJfV0lOQVBJLgorICAgICovCisjICBpZmRlZiBaTElCX1dJTkFQSQorIyAgICBpZmRlZiBGQVIKKyMgICAgICB1bmRlZiBGQVIKKyMgICAgZW5kaWYKKyMgICAgaW5jbHVkZSA8d2luZG93cy5oPgorICAgICAvKiBObyBuZWVkIGZvciBfZXhwb3J0LCB1c2UgWkxJQi5ERUYgaW5zdGVhZC4gKi8KKyAgICAgLyogRm9yIGNvbXBsZXRlIFdpbmRvd3MgY29tcGF0aWJpbGl0eSwgdXNlIFdJTkFQSSwgbm90IF9fc3RkY2FsbC4gKi8KKyMgICAgZGVmaW5lIFpFWFBPUlQgV0lOQVBJCisjICAgIGlmZGVmIFdJTjMyCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBXSU5BUElWCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIEZBUiBDREVDTAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19CRU9TX18pCisjICBpZmRlZiBaTElCX0RMTAorIyAgICBpZmRlZiBaTElCX0lOVEVSTkFMCisjICAgICAgZGVmaW5lIFpFWFBPUlQgICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIFpFWFBPUlQgICBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9WSVNJQklMSVRZX1BSQUdNQQorIyAgZGVmaW5lIFpFWFRFUk4gX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpIGV4dGVybgorI2VuZGlmCisKKyNpZm5kZWYgWkVYVEVSTgorIyAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuCisjZW5kaWYKKyNpZm5kZWYgWkVYUE9SVAorIyAgZGVmaW5lIFpFWFBPUlQKKyNlbmRpZgorI2lmbmRlZiBaRVhQT1JUVkEKKyMgIGRlZmluZSBaRVhQT1JUVkEKKyNlbmRpZgorCisjaWZuZGVmIEZBUgorIyAgZGVmaW5lIEZBUgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX01BQ1RZUEVTX18pCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIEJ5dGU7ICAvKiA4IGJpdHMgKi8KKyNlbmRpZgordHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1SW50OyAgLyogMTYgYml0cyBvciBtb3JlICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVMb25nOyAvKiAzMiBiaXRzIG9yIG1vcmUgKi8KKworI2lmZGVmIFNNQUxMX01FRElVTQorICAgLyogQm9ybGFuZCBDL0MrKyBhbmQgc29tZSBvbGQgTVNDIHZlcnNpb25zIGlnbm9yZSBGQVIgaW5zaWRlIHR5cGVkZWYgKi8KKyMgIGRlZmluZSBCeXRlZiBCeXRlIEZBUgorI2Vsc2UKKyAgIHR5cGVkZWYgQnl0ZSAgRkFSIEJ5dGVmOworI2VuZGlmCit0eXBlZGVmIGNoYXIgIEZBUiBjaGFyZjsKK3R5cGVkZWYgaW50ICAgRkFSIGludGY7Cit0eXBlZGVmIHVJbnQgIEZBUiB1SW50ZjsKK3R5cGVkZWYgdUxvbmcgRkFSIHVMb25nZjsKKworI2lmZGVmIFNUREMKKyAgIHR5cGVkZWYgdm9pZCBjb25zdCAqdm9pZHBjOworICAgdHlwZWRlZiB2b2lkIEZBUiAgICp2b2lkcGY7CisgICB0eXBlZGVmIHZvaWQgICAgICAgKnZvaWRwOworI2Vsc2UKKyAgIHR5cGVkZWYgQnl0ZSBjb25zdCAqdm9pZHBjOworICAgdHlwZWRlZiBCeXRlIEZBUiAgICp2b2lkcGY7CisgICB0eXBlZGVmIEJ5dGUgICAgICAgKnZvaWRwOworI2VuZGlmCisKKyNpbmNsdWRlICJ6bGliZGVmcy5oIiAgICAgICAvKiBjcmVhdGVkIGJ5IGNvbmZpZ3VyZSAqLworCisjaWZkZWYgX0xBUkdFRklMRTY0X1NPVVJDRQorIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2lmbmRlZiBTRUVLX1NFVAorIyAgZGVmaW5lIFNFRUtfU0VUICAgICAgICAwICAgICAgIC8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCisjICBkZWZpbmUgU0VFS19DVVIgICAgICAgIDEgICAgICAgLyogU2VlayBmcm9tIGN1cnJlbnQgcG9zaXRpb24uICAqLworIyAgZGVmaW5lIFNFRUtfRU5EICAgICAgICAyICAgICAgIC8qIFNldCBmaWxlIHBvaW50ZXIgdG8gRU9GIHBsdXMgIm9mZnNldCIgKi8KKyNlbmRpZgorI2lmbmRlZiB6X29mZl90CisjICBkZWZpbmUgel9vZmZfdCBsb25nCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19PUzQwMF9fKQorIyAgZGVmaW5lIE5PX3ZzbnByaW50ZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fTVZTX18pCisjICBkZWZpbmUgTk9fdnNucHJpbnRmCisjZW5kaWYKKworLyogTVZTIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IGV4dGVybmFsIG5hbWVzIGxhcmdlciB0aGFuIDggYnl0ZXMgKi8KKyNpZiBkZWZpbmVkKF9fTVZTX18pCisjICAgcHJhZ21hIG1hcChkZWZsYXRlSW5pdF8sIkRFSU4iKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUluaXQyXywiREVJTjIiKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUVuZCwiREVFTkQiKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUJvdW5kLCJERUJORCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlSW5pdF8sIklOSU4iKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUluaXQyXywiSU5JTjIiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUVuZCwiSU5FTkQiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVN5bmMsIklOU1kiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVNldERpY3Rpb25hcnksIklOU0VESSIpCisjICAgcHJhZ21hIG1hcChjb21wcmVzc0JvdW5kLCJDTUJORCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX3RhYmxlLCJJTlRBQkwiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9mYXN0LCJJTkZBIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfY29weXJpZ2h0LCJJTkNPUFkiKQorI2VuZGlmCisKKyNlbmRpZiAvKiBaQ09ORl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3psaWIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvemxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1N2Q2MDYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3psaWIuaApAQCAtMCwwICsxLDE0ODggQEAKKy8qIHpsaWIuaCAtLSBpbnRlcmZhY2Ugb2YgdGhlICd6bGliJyBnZW5lcmFsIHB1cnBvc2UgY29tcHJlc3Npb24gbGlicmFyeQorICB2ZXJzaW9uIDEuMi4zLjQsIERlY2VtYmVyIDIxc3QsIDIwMDkKKworICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwOSBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisgIEplYW4tbG91cCBHYWlsbHkgICAgICAgIE1hcmsgQWRsZXIKKyAgamxvdXBAZ3ppcC5vcmcgICAgICAgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQorCisKKyAgVGhlIGRhdGEgZm9ybWF0IHVzZWQgYnkgdGhlIHpsaWIgbGlicmFyeSBpcyBkZXNjcmliZWQgYnkgUkZDcyAoUmVxdWVzdCBmb3IKKyAgQ29tbWVudHMpIDE5NTAgdG8gMTk1MiBpbiB0aGUgZmlsZXMgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1MC50eHQKKyAgKHpsaWIgZm9ybWF0KSwgcmZjMTk1MS50eHQgKGRlZmxhdGUgZm9ybWF0KSBhbmQgcmZjMTk1Mi50eHQgKGd6aXAgZm9ybWF0KS4KKyovCisKKyNpZm5kZWYgWkxJQl9ICisjZGVmaW5lIFpMSUJfSAorCisjaW5jbHVkZSAiemNvbmYuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFpMSUJfVkVSU0lPTiAiMS4yLjMuNCIKKyNkZWZpbmUgWkxJQl9WRVJOVU0gMHgxMjM0CisjZGVmaW5lIFpMSUJfVkVSX01BSk9SIDEKKyNkZWZpbmUgWkxJQl9WRVJfTUlOT1IgMgorI2RlZmluZSBaTElCX1ZFUl9SRVZJU0lPTiAzCisKKy8qCisgICAgIFRoZSAnemxpYicgY29tcHJlc3Npb24gbGlicmFyeSBwcm92aWRlcyBpbi1tZW1vcnkgY29tcHJlc3Npb24gYW5kCisgIGRlY29tcHJlc3Npb24gZnVuY3Rpb25zLCBpbmNsdWRpbmcgaW50ZWdyaXR5IGNoZWNrcyBvZiB0aGUgdW5jb21wcmVzc2VkCisgIGRhdGEuICBUaGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgc3VwcG9ydHMgb25seSBvbmUgY29tcHJlc3Npb24gbWV0aG9kCisgIChkZWZsYXRpb24pIGJ1dCBvdGhlciBhbGdvcml0aG1zIHdpbGwgYmUgYWRkZWQgbGF0ZXIgYW5kIHdpbGwgaGF2ZSB0aGUgc2FtZQorICBzdHJlYW0gaW50ZXJmYWNlLgorCisgICAgIENvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlCisgIGVub3VnaCAoZm9yIGV4YW1wbGUgaWYgYW4gaW5wdXQgZmlsZSBpcyBtbWFwJ2VkKSwgb3IgY2FuIGJlIGRvbmUgYnkKKyAgcmVwZWF0ZWQgY2FsbHMgb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9uLiAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUKKyAgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWUgdGhlIG91dHB1dAorICAocHJvdmlkaW5nIG1vcmUgb3V0cHV0IHNwYWNlKSBiZWZvcmUgZWFjaCBjYWxsLgorCisgICAgIFRoZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHVzZWQgYnkgZGVmYXVsdCBieSB0aGUgaW4tbWVtb3J5IGZ1bmN0aW9ucyBpcworICB0aGUgemxpYiBmb3JtYXQsIHdoaWNoIGlzIGEgemxpYiB3cmFwcGVyIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTAsIHdyYXBwZWQKKyAgYXJvdW5kIGEgZGVmbGF0ZSBzdHJlYW0sIHdoaWNoIGlzIGl0c2VsZiBkb2N1bWVudGVkIGluIFJGQyAxOTUxLgorCisgICAgIFRoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdAorICB3aXRoIGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoYXQgb2Ygc3RkaW8gdXNpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IHN0YXJ0CisgIHdpdGggImd6Ii4gIFRoZSBnemlwIGZvcm1hdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgemxpYiBmb3JtYXQuICBnemlwIGlzIGEKKyAgZ3ppcCB3cmFwcGVyLCBkb2N1bWVudGVkIGluIFJGQyAxOTUyLCB3cmFwcGVkIGFyb3VuZCBhIGRlZmxhdGUgc3RyZWFtLgorCisgICAgIFRoaXMgbGlicmFyeSBjYW4gb3B0aW9uYWxseSByZWFkIGFuZCB3cml0ZSBnemlwIHN0cmVhbXMgaW4gbWVtb3J5IGFzIHdlbGwuCisKKyAgICAgVGhlIHpsaWIgZm9ybWF0IHdhcyBkZXNpZ25lZCB0byBiZSBjb21wYWN0IGFuZCBmYXN0IGZvciB1c2UgaW4gbWVtb3J5CisgIGFuZCBvbiBjb21tdW5pY2F0aW9ucyBjaGFubmVscy4gIFRoZSBnemlwIGZvcm1hdCB3YXMgZGVzaWduZWQgZm9yIHNpbmdsZS0KKyAgZmlsZSBjb21wcmVzc2lvbiBvbiBmaWxlIHN5c3RlbXMsIGhhcyBhIGxhcmdlciBoZWFkZXIgdGhhbiB6bGliIHRvIG1haW50YWluCisgIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiwgYW5kIHVzZXMgYSBkaWZmZXJlbnQsIHNsb3dlciBjaGVjayBtZXRob2QgdGhhbiB6bGliLgorCisgICAgIFRoZSBsaWJyYXJ5IGRvZXMgbm90IGluc3RhbGwgYW55IHNpZ25hbCBoYW5kbGVyLiBUaGUgZGVjb2RlciBjaGVja3MKKyAgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEsIHNvIHRoZSBsaWJyYXJ5IHNob3VsZCBuZXZlcgorICBjcmFzaCBldmVuIGluIGNhc2Ugb2YgY29ycnVwdGVkIGlucHV0LgorKi8KKwordHlwZWRlZiB2b2lkcGYgKCphbGxvY19mdW5jKSBPRigodm9pZHBmIG9wYXF1ZSwgdUludCBpdGVtcywgdUludCBzaXplKSk7Cit0eXBlZGVmIHZvaWQgICAoKmZyZWVfZnVuYykgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgYWRkcmVzcykpOworCitzdHJ1Y3QgaW50ZXJuYWxfc3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHpfc3RyZWFtX3MgeworICAgIEJ5dGVmICAgICpuZXh0X2luOyAgLyogbmV4dCBpbnB1dCBieXRlICovCisgICAgdUludCAgICAgYXZhaWxfaW47ICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IG5leHRfaW4gKi8KKyAgICB1TG9uZyAgICB0b3RhbF9pbjsgIC8qIHRvdGFsIG5iIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyICovCisKKyAgICBCeXRlZiAgICAqbmV4dF9vdXQ7IC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqLworICAgIHVJbnQgICAgIGF2YWlsX291dDsgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgbmV4dF9vdXQgKi8KKyAgICB1TG9uZyAgICB0b3RhbF9vdXQ7IC8qIHRvdGFsIG5iIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi8KKworICAgIGNoYXIgICAgICptc2c7ICAgICAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovCisgICAgc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqc3RhdGU7IC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqLworCisgICAgYWxsb2NfZnVuYyB6YWxsb2M7ICAvKiB1c2VkIHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLworICAgIGZyZWVfZnVuYyAgemZyZWU7ICAgLyogdXNlZCB0byBmcmVlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLworICAgIHZvaWRwZiAgICAgb3BhcXVlOyAgLyogcHJpdmF0ZSBkYXRhIG9iamVjdCBwYXNzZWQgdG8gemFsbG9jIGFuZCB6ZnJlZSAqLworCisgICAgaW50ICAgICBkYXRhX3R5cGU7ICAvKiBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6IGJpbmFyeSBvciB0ZXh0ICovCisgICAgdUxvbmcgICBhZGxlcjsgICAgICAvKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqLworICAgIHVMb25nICAgcmVzZXJ2ZWQ7ICAgLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KK30gel9zdHJlYW07CisKK3R5cGVkZWYgel9zdHJlYW0gRkFSICp6X3N0cmVhbXA7CisKKy8qCisgICAgIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHBhc3NlZCB0byBhbmQgZnJvbSB6bGliIHJvdXRpbmVzLiAgU2VlIFJGQyAxOTUyCisgIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIG1lYW5pbmdzIG9mIHRoZXNlIGZpZWxkcy4KKyovCit0eXBlZGVmIHN0cnVjdCBnel9oZWFkZXJfcyB7CisgICAgaW50ICAgICB0ZXh0OyAgICAgICAvKiB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0ICovCisgICAgdUxvbmcgICB0aW1lOyAgICAgICAvKiBtb2RpZmljYXRpb24gdGltZSAqLworICAgIGludCAgICAgeGZsYWdzOyAgICAgLyogZXh0cmEgZmxhZ3MgKG5vdCB1c2VkIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi8KKyAgICBpbnQgICAgIG9zOyAgICAgICAgIC8qIG9wZXJhdGluZyBzeXN0ZW0gKi8KKyAgICBCeXRlZiAgICpleHRyYTsgICAgIC8qIHBvaW50ZXIgdG8gZXh0cmEgZmllbGQgb3IgWl9OVUxMIGlmIG5vbmUgKi8KKyAgICB1SW50ICAgIGV4dHJhX2xlbjsgIC8qIGV4dHJhIGZpZWxkIGxlbmd0aCAodmFsaWQgaWYgZXh0cmEgIT0gWl9OVUxMKSAqLworICAgIHVJbnQgICAgZXh0cmFfbWF4OyAgLyogc3BhY2UgYXQgZXh0cmEgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KKyAgICBCeXRlZiAgICpuYW1lOyAgICAgIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGZpbGUgbmFtZSBvciBaX05VTEwgKi8KKyAgICB1SW50ICAgIG5hbWVfbWF4OyAgIC8qIHNwYWNlIGF0IG5hbWUgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KKyAgICBCeXRlZiAgICpjb21tZW50OyAgIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGNvbW1lbnQgb3IgWl9OVUxMICovCisgICAgdUludCAgICBjb21tX21heDsgICAvKiBzcGFjZSBhdCBjb21tZW50IChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovCisgICAgaW50ICAgICBoY3JjOyAgICAgICAvKiB0cnVlIGlmIHRoZXJlIHdhcyBvciB3aWxsIGJlIGEgaGVhZGVyIGNyYyAqLworICAgIGludCAgICAgZG9uZTsgICAgICAgLyogdHJ1ZSB3aGVuIGRvbmUgcmVhZGluZyBnemlwIGhlYWRlciAobm90IHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi8KK30gZ3pfaGVhZGVyOworCit0eXBlZGVmIGd6X2hlYWRlciBGQVIgKmd6X2hlYWRlcnA7CisKKy8qCisgICBUaGUgYXBwbGljYXRpb24gbXVzdCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4gd2hlbiBhdmFpbF9pbiBoYXMKKyAgIGRyb3BwZWQgdG8gemVyby4gSXQgbXVzdCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dCB3aGVuIGF2YWlsX291dAorICAgaGFzIGRyb3BwZWQgdG8gemVyby4gVGhlIGFwcGxpY2F0aW9uIG11c3QgaW5pdGlhbGl6ZSB6YWxsb2MsIHpmcmVlIGFuZAorICAgb3BhcXVlIGJlZm9yZSBjYWxsaW5nIHRoZSBpbml0IGZ1bmN0aW9uLiBBbGwgb3RoZXIgZmllbGRzIGFyZSBzZXQgYnkgdGhlCisgICBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBtdXN0IG5vdCBiZSB1cGRhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKworICAgVGhlIG9wYXF1ZSB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0CisgICBwYXJhbWV0ZXIgZm9yIGNhbGxzIG9mIHphbGxvYyBhbmQgemZyZWUuIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgY3VzdG9tCisgICBtZW1vcnkgbWFuYWdlbWVudC4gVGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYXR0YWNoZXMgbm8gbWVhbmluZyB0byB0aGUKKyAgIG9wYXF1ZSB2YWx1ZS4KKworICAgemFsbG9jIG11c3QgcmV0dXJuIFpfTlVMTCBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIG9iamVjdC4KKyAgIElmIHpsaWIgaXMgdXNlZCBpbiBhIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9uLCB6YWxsb2MgYW5kIHpmcmVlIG11c3QgYmUKKyAgIHRocmVhZCBzYWZlLgorCisgICBPbiAxNi1iaXQgc3lzdGVtcywgdGhlIGZ1bmN0aW9ucyB6YWxsb2MgYW5kIHpmcmVlIG11c3QgYmUgYWJsZSB0byBhbGxvY2F0ZQorICAgZXhhY3RseSA2NTUzNiBieXRlcywgYnV0IHdpbGwgbm90IGJlIHJlcXVpcmVkIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiB0aGlzCisgICBpZiB0aGUgc3ltYm9sIE1BWFNFR182NEsgaXMgZGVmaW5lZCAoc2VlIHpjb25mLmgpLiBXQVJOSU5HOiBPbiBNU0RPUywKKyAgIHBvaW50ZXJzIHJldHVybmVkIGJ5IHphbGxvYyBmb3Igb2JqZWN0cyBvZiBleGFjdGx5IDY1NTM2IGJ5dGVzICptdXN0KgorICAgaGF2ZSB0aGVpciBvZmZzZXQgbm9ybWFsaXplZCB0byB6ZXJvLiBUaGUgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9uCisgICBwcm92aWRlZCBieSB0aGlzIGxpYnJhcnkgZW5zdXJlcyB0aGlzIChzZWUgenV0aWwuYykuIFRvIHJlZHVjZSBtZW1vcnkKKyAgIHJlcXVpcmVtZW50cyBhbmQgYXZvaWQgYW55IGFsbG9jYXRpb24gb2YgNjRLIG9iamVjdHMsIGF0IHRoZSBleHBlbnNlIG9mCisgICBjb21wcmVzc2lvbiByYXRpbywgY29tcGlsZSB0aGUgbGlicmFyeSB3aXRoIC1ETUFYX1dCSVRTPTE0IChzZWUgemNvbmYuaCkuCisKKyAgIFRoZSBmaWVsZHMgdG90YWxfaW4gYW5kIHRvdGFsX291dCBjYW4gYmUgdXNlZCBmb3Igc3RhdGlzdGljcyBvcgorICAgcHJvZ3Jlc3MgcmVwb3J0cy4gQWZ0ZXIgY29tcHJlc3Npb24sIHRvdGFsX2luIGhvbGRzIHRoZSB0b3RhbCBzaXplIG9mCisgICB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYW5kIG1heSBiZSBzYXZlZCBmb3IgdXNlIGluIHRoZSBkZWNvbXByZXNzb3IKKyAgIChwYXJ0aWN1bGFybHkgaWYgdGhlIGRlY29tcHJlc3NvciB3YW50cyB0byBkZWNvbXByZXNzIGV2ZXJ5dGhpbmcgaW4KKyAgIGEgc2luZ2xlIHN0ZXApLgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogY29uc3RhbnRzICovCisKKyNkZWZpbmUgWl9OT19GTFVTSCAgICAgIDAKKyNkZWZpbmUgWl9QQVJUSUFMX0ZMVVNIIDEKKyNkZWZpbmUgWl9TWU5DX0ZMVVNIICAgIDIKKyNkZWZpbmUgWl9GVUxMX0ZMVVNIICAgIDMKKyNkZWZpbmUgWl9GSU5JU0ggICAgICAgIDQKKyNkZWZpbmUgWl9CTE9DSyAgICAgICAgIDUKKyNkZWZpbmUgWl9UUkVFUyAgICAgICAgIDYKKy8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KKworI2RlZmluZSBaX09LICAgICAgICAgICAgMAorI2RlZmluZSBaX1NUUkVBTV9FTkQgICAgMQorI2RlZmluZSBaX05FRURfRElDVCAgICAgMgorI2RlZmluZSBaX0VSUk5PICAgICAgICAoLTEpCisjZGVmaW5lIFpfU1RSRUFNX0VSUk9SICgtMikKKyNkZWZpbmUgWl9EQVRBX0VSUk9SICAgKC0zKQorI2RlZmluZSBaX01FTV9FUlJPUiAgICAoLTQpCisjZGVmaW5lIFpfQlVGX0VSUk9SICAgICgtNSkKKyNkZWZpbmUgWl9WRVJTSU9OX0VSUk9SICgtNikKKy8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZQorICogdmFsdWVzIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy4KKyAqLworCisjZGVmaW5lIFpfTk9fQ09NUFJFU1NJT04gICAgICAgICAwCisjZGVmaW5lIFpfQkVTVF9TUEVFRCAgICAgICAgICAgICAxCisjZGVmaW5lIFpfQkVTVF9DT01QUkVTU0lPTiAgICAgICA5CisjZGVmaW5lIFpfREVGQVVMVF9DT01QUkVTU0lPTiAgKC0xKQorLyogY29tcHJlc3Npb24gbGV2ZWxzICovCisKKyNkZWZpbmUgWl9GSUxURVJFRCAgICAgICAgICAgIDEKKyNkZWZpbmUgWl9IVUZGTUFOX09OTFkgICAgICAgIDIKKyNkZWZpbmUgWl9STEUgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWl9GSVhFRCAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWl9ERUZBVUxUX1NUUkFURUdZICAgIDAKKy8qIGNvbXByZXNzaW9uIHN0cmF0ZWd5OyBzZWUgZGVmbGF0ZUluaXQyKCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KKworI2RlZmluZSBaX0JJTkFSWSAgIDAKKyNkZWZpbmUgWl9URVhUICAgICAxCisjZGVmaW5lIFpfQVNDSUkgICAgWl9URVhUICAgLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAxLjIuMiBhbmQgZWFybGllciAqLworI2RlZmluZSBaX1VOS05PV04gIDIKKy8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi8KKworI2RlZmluZSBaX0RFRkxBVEVEICAgOAorLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICh0aGUgb25seSBvbmUgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbikgKi8KKworI2RlZmluZSBaX05VTEwgIDAgIC8qIGZvciBpbml0aWFsaXppbmcgemFsbG9jLCB6ZnJlZSwgb3BhcXVlICovCisKKyNkZWZpbmUgemxpYl92ZXJzaW9uIHpsaWJWZXJzaW9uKCkKKy8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbnMgPCAxLjAuMiAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNpYyBmdW5jdGlvbnMgKi8KKworWkVYVEVSTiBjb25zdCBjaGFyICogWkVYUE9SVCB6bGliVmVyc2lvbiBPRigodm9pZCkpOworLyogVGhlIGFwcGxpY2F0aW9uIGNhbiBjb21wYXJlIHpsaWJWZXJzaW9uIGFuZCBaTElCX1ZFUlNJT04gZm9yIGNvbnNpc3RlbmN5LgorICAgSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBkaWZmZXJzLCB0aGUgbGlicmFyeSBjb2RlIGFjdHVhbGx5IHVzZWQgaXMKKyAgIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHpsaWIuaCBoZWFkZXIgZmlsZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgIFRoaXMgY2hlY2sgaXMgYXV0b21hdGljYWxseSBtYWRlIGJ5IGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdC4KKyAqLworCisvKgorWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdCBPRigoel9zdHJlYW1wIHN0cm0sIGludCBsZXZlbCkpOworCisgICAgIEluaXRpYWxpemVzIHRoZSBpbnRlcm5hbCBzdHJlYW0gc3RhdGUgZm9yIGNvbXByZXNzaW9uLiBUaGUgZmllbGRzCisgICB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkgdGhlIGNhbGxlci4KKyAgIElmIHphbGxvYyBhbmQgemZyZWUgYXJlIHNldCB0byBaX05VTEwsIGRlZmxhdGVJbml0IHVwZGF0ZXMgdGhlbSB0bworICAgdXNlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCisKKyAgICAgVGhlIGNvbXByZXNzaW9uIGxldmVsIG11c3QgYmUgWl9ERUZBVUxUX0NPTVBSRVNTSU9OLCBvciBiZXR3ZWVuIDAgYW5kIDk6CisgICAxIGdpdmVzIGJlc3Qgc3BlZWQsIDkgZ2l2ZXMgYmVzdCBjb21wcmVzc2lvbiwgMCBnaXZlcyBubyBjb21wcmVzc2lvbiBhdAorICAgYWxsICh0aGUgaW5wdXQgZGF0YSBpcyBzaW1wbHkgY29waWVkIGEgYmxvY2sgYXQgYSB0aW1lKS4KKyAgIFpfREVGQVVMVF9DT01QUkVTU0lPTiByZXF1ZXN0cyBhIGRlZmF1bHQgY29tcHJvbWlzZSBiZXR3ZWVuIHNwZWVkIGFuZAorICAgY29tcHJlc3Npb24gKGN1cnJlbnRseSBlcXVpdmFsZW50IHRvIGxldmVsIDYpLgorCisgICAgIGRlZmxhdGVJbml0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90CisgICBlbm91Z2ggbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiBsZXZlbCBpcyBub3QgYSB2YWxpZCBjb21wcmVzc2lvbiBsZXZlbCwKKyAgIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gKHpsaWJfdmVyc2lvbikgaXMgaW5jb21wYXRpYmxlCisgICB3aXRoIHRoZSB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlciAoWkxJQl9WRVJTSU9OKS4KKyAgIG1zZyBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgZGVmbGF0ZUluaXQgZG9lcyBub3QKKyAgIHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBkZWZsYXRlKCkuCisqLworCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZSBPRigoel9zdHJlYW1wIHN0cm0sIGludCBmbHVzaCkpOworLyoKKyAgICBkZWZsYXRlIGNvbXByZXNzZXMgYXMgbXVjaCBkYXRhIGFzIHBvc3NpYmxlLCBhbmQgc3RvcHMgd2hlbiB0aGUgaW5wdXQKKyAgYnVmZmVyIGJlY29tZXMgZW1wdHkgb3IgdGhlIG91dHB1dCBidWZmZXIgYmVjb21lcyBmdWxsLiBJdCBtYXkgaW50cm9kdWNlIHNvbWUKKyAgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkgZXhjZXB0IHdoZW4KKyAgZm9yY2VkIHRvIGZsdXNoLgorCisgICAgVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgYXMgZm9sbG93cy4gZGVmbGF0ZSBwZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUKKyAgZm9sbG93aW5nIGFjdGlvbnM6CisKKyAgLSBDb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IG5leHRfaW4gYW5kIHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbgorICAgIGFjY29yZGluZ2x5LiBJZiBub3QgYWxsIGlucHV0IGNhbiBiZSBwcm9jZXNzZWQgKGJlY2F1c2UgdGhlcmUgaXMgbm90CisgICAgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIpLCBuZXh0X2luIGFuZCBhdmFpbF9pbiBhcmUgdXBkYXRlZCBhbmQKKyAgICBwcm9jZXNzaW5nIHdpbGwgcmVzdW1lIGF0IHRoaXMgcG9pbnQgZm9yIHRoZSBuZXh0IGNhbGwgb2YgZGVmbGF0ZSgpLgorCisgIC0gUHJvdmlkZSBtb3JlIG91dHB1dCBzdGFydGluZyBhdCBuZXh0X291dCBhbmQgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQKKyAgICBhY2NvcmRpbmdseS4gVGhpcyBhY3Rpb24gaXMgZm9yY2VkIGlmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgbm9uIHplcm8uCisgICAgRm9yY2luZyBmbHVzaCBmcmVxdWVudGx5IGRlZ3JhZGVzIHRoZSBjb21wcmVzc2lvbiByYXRpbywgc28gdGhpcyBwYXJhbWV0ZXIKKyAgICBzaG91bGQgYmUgc2V0IG9ubHkgd2hlbiBuZWNlc3NhcnkgKGluIGludGVyYWN0aXZlIGFwcGxpY2F0aW9ucykuCisgICAgU29tZSBvdXRwdXQgbWF5IGJlIHByb3ZpZGVkIGV2ZW4gaWYgZmx1c2ggaXMgbm90IHNldC4KKworICBCZWZvcmUgdGhlIGNhbGwgb2YgZGVmbGF0ZSgpLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGVuc3VyZSB0aGF0IGF0IGxlYXN0CisgIG9uZSBvZiB0aGUgYWN0aW9ucyBpcyBwb3NzaWJsZSwgYnkgcHJvdmlkaW5nIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWluZworICBtb3JlIG91dHB1dCwgYW5kIHVwZGF0aW5nIGF2YWlsX2luIG9yIGF2YWlsX291dCBhY2NvcmRpbmdseTsgYXZhaWxfb3V0CisgIHNob3VsZCBuZXZlciBiZSB6ZXJvIGJlZm9yZSB0aGUgY2FsbC4gVGhlIGFwcGxpY2F0aW9uIGNhbiBjb25zdW1lIHRoZQorICBjb21wcmVzc2VkIG91dHB1dCB3aGVuIGl0IHdhbnRzLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwKKyAgKGF2YWlsX291dCA9PSAwKSwgb3IgYWZ0ZXIgZWFjaCBjYWxsIG9mIGRlZmxhdGUoKS4gSWYgZGVmbGF0ZSByZXR1cm5zIFpfT0sKKyAgYW5kIHdpdGggemVybyBhdmFpbF9vdXQsIGl0IG11c3QgYmUgY2FsbGVkIGFnYWluIGFmdGVyIG1ha2luZyByb29tIGluIHRoZQorICBvdXRwdXQgYnVmZmVyIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgbW9yZSBvdXRwdXQgcGVuZGluZy4KKworICAgIE5vcm1hbGx5IHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfTk9fRkxVU0gsIHdoaWNoIGFsbG93cyBkZWZsYXRlIHRvCisgIGRlY2lkZSBob3cgbXVjaCBkYXRhIHRvIGFjY3VtdWxhdGUgYmVmb3JlIHByb2R1Y2luZyBvdXRwdXQsIGluIG9yZGVyIHRvCisgIG1heGltaXplIGNvbXByZXNzaW9uLgorCisgICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gWl9TWU5DX0ZMVVNILCBhbGwgcGVuZGluZyBvdXRwdXQgaXMKKyAgZmx1c2hlZCB0byB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgdGhlIG91dHB1dCBpcyBhbGlnbmVkIG9uIGEgYnl0ZSBib3VuZGFyeSwgc28KKyAgdGhhdCB0aGUgZGVjb21wcmVzc29yIGNhbiBnZXQgYWxsIGlucHV0IGRhdGEgYXZhaWxhYmxlIHNvIGZhci4gKEluIHBhcnRpY3VsYXIKKyAgYXZhaWxfaW4gaXMgemVybyBhZnRlciB0aGUgY2FsbCBpZiBlbm91Z2ggb3V0cHV0IHNwYWNlIGhhcyBiZWVuIHByb3ZpZGVkCisgIGJlZm9yZSB0aGUgY2FsbC4pICBGbHVzaGluZyBtYXkgZGVncmFkZSBjb21wcmVzc2lvbiBmb3Igc29tZSBjb21wcmVzc2lvbgorICBhbGdvcml0aG1zIGFuZCBzbyBpdCBzaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gbmVjZXNzYXJ5LiAgVGhpcyBjb21wbGV0ZXMgdGhlCisgIGN1cnJlbnQgZGVmbGF0ZSBibG9jayBhbmQgZm9sbG93cyBpdCB3aXRoIGFuIGVtcHR5IHN0b3JlZCBibG9jayB0aGF0IGlzIHRocmVlCisgIGJpdHMgcGx1cyBmaWxsZXIgYml0cyB0byB0aGUgbmV4dCBieXRlLCBmb2xsb3dlZCBieSBmb3VyIGJ5dGVzICgwMCAwMCBmZiBmZikuCisKKyAgICBJZiBmbHVzaCBpcyBzZXQgdG8gWl9QQVJUSUFMX0ZMVVNILCBhbGwgcGVuZGluZyBvdXRwdXQgaXMgZmx1c2hlZCB0byB0aGUKKyAgb3V0cHV0IGJ1ZmZlciwgYnV0IHRoZSBvdXRwdXQgaXMgbm90IGFsaWduZWQgdG8gYSBieXRlIGJvdW5kYXJ5LiAgQWxsIG9mIHRoZQorICBpbnB1dCBkYXRhIHNvIGZhciB3aWxsIGJlIGF2YWlsYWJsZSB0byB0aGUgZGVjb21wcmVzc29yLCBhcyBmb3IgWl9TWU5DX0ZMVVNILgorICBUaGlzIGNvbXBsZXRlcyB0aGUgY3VycmVudCBkZWZsYXRlIGJsb2NrIGFuZCBmb2xsb3dzIGl0IHdpdGggYW4gZW1wdHkgZml4ZWQKKyAgY29kZXMgYmxvY2sgdGhhdCBpcyAxMCBiaXRzIGxvbmcuICBUaGlzIGFzc3VyZXMgdGhhdCBlbm91Z2ggYnl0ZXMgYXJlIG91dHB1dAorICBpbiBvcmRlciBmb3IgdGhlIGRlY29tcHJlc3NvciB0byBmaW5pc2ggdGhlIGJsb2NrIGJlZm9yZSB0aGUgZW1wdHkgZml4ZWQgY29kZQorICBibG9jay4KKworICAgIElmIGZsdXNoIGlzIHNldCB0byBaX0JMT0NLLCBhIGRlZmxhdGUgYmxvY2sgaXMgY29tcGxldGVkIGFuZCBlbWl0dGVkLCBhcworICBmb3IgWl9TWU5DX0ZMVVNILCBidXQgdGhlIG91dHB1dCBpcyBub3QgYWxpZ25lZCBvbiBhIGJ5dGUgYm91bmRhcnksIGFuZCB1cCB0bworICBzZXZlbiBiaXRzIG9mIHRoZSBjdXJyZW50IGJsb2NrIGFyZSBoZWxkIHRvIGJlIHdyaXR0ZW4gYXMgdGhlIG5leHQgYnl0ZSBhZnRlcgorICB0aGUgbmV4dCBkZWZsYXRlIGJsb2NrIGlzIGNvbXBsZXRlZC4gIEluIHRoaXMgY2FzZSwgdGhlIGRlY29tcHJlc3NvciBtYXkgbm90CisgIGJlIHByb3ZpZGVkIGVub3VnaCBiaXRzIGF0IHRoaXMgcG9pbnQgaW4gb3JkZXIgdG8gY29tcGxldGUgZGVjb21wcmVzc2lvbiBvZgorICB0aGUgZGF0YSBwcm92aWRlZCBzbyBmYXIgdG8gdGhlIGNvbXByZXNzb3IuICBJdCBtYXkgbmVlZCB0byB3YWl0IGZvciB0aGUgbmV4dAorICBibG9jayB0byBiZSBlbWl0dGVkLiAgVGhpcyBpcyBmb3IgYWR2YW5jZWQgYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0byBjb250cm9sCisgIHRoZSBlbWlzc2lvbiBvZiBkZWZsYXRlIGJsb2Nrcy4KKworICAgIElmIGZsdXNoIGlzIHNldCB0byBaX0ZVTExfRkxVU0gsIGFsbCBvdXRwdXQgaXMgZmx1c2hlZCBhcyB3aXRoCisgIFpfU1lOQ19GTFVTSCwgYW5kIHRoZSBjb21wcmVzc2lvbiBzdGF0ZSBpcyByZXNldCBzbyB0aGF0IGRlY29tcHJlc3Npb24gY2FuCisgIHJlc3RhcnQgZnJvbSB0aGlzIHBvaW50IGlmIHByZXZpb3VzIGNvbXByZXNzZWQgZGF0YSBoYXMgYmVlbiBkYW1hZ2VkIG9yIGlmCisgIHJhbmRvbSBhY2Nlc3MgaXMgZGVzaXJlZC4gVXNpbmcgWl9GVUxMX0ZMVVNIIHRvbyBvZnRlbiBjYW4gc2VyaW91c2x5IGRlZ3JhZGUKKyAgY29tcHJlc3Npb24uCisKKyAgICBJZiBkZWZsYXRlIHJldHVybnMgd2l0aCBhdmFpbF9vdXQgPT0gMCwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZ2FpbgorICB3aXRoIHRoZSBzYW1lIHZhbHVlIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgYW5kIG1vcmUgb3V0cHV0IHNwYWNlICh1cGRhdGVkCisgIGF2YWlsX291dCksIHVudGlsIHRoZSBmbHVzaCBpcyBjb21wbGV0ZSAoZGVmbGF0ZSByZXR1cm5zIHdpdGggbm9uLXplcm8KKyAgYXZhaWxfb3V0KS4gSW4gdGhlIGNhc2Ugb2YgYSBaX0ZVTExfRkxVU0ggb3IgWl9TWU5DX0ZMVVNILCBtYWtlIHN1cmUgdGhhdAorICBhdmFpbF9vdXQgaXMgZ3JlYXRlciB0aGFuIHNpeCB0byBhdm9pZCByZXBlYXRlZCBmbHVzaCBtYXJrZXJzIGR1ZSB0bworICBhdmFpbF9vdXQgPT0gMCBvbiByZXR1cm4uCisKKyAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byBaX0ZJTklTSCwgcGVuZGluZyBpbnB1dCBpcyBwcm9jZXNzZWQsCisgIHBlbmRpbmcgb3V0cHV0IGlzIGZsdXNoZWQgYW5kIGRlZmxhdGUgcmV0dXJucyB3aXRoIFpfU1RSRUFNX0VORCBpZiB0aGVyZQorICB3YXMgZW5vdWdoIG91dHB1dCBzcGFjZTsgaWYgZGVmbGF0ZSByZXR1cm5zIHdpdGggWl9PSywgdGhpcyBmdW5jdGlvbiBtdXN0IGJlCisgIGNhbGxlZCBhZ2FpbiB3aXRoIFpfRklOSVNIIGFuZCBtb3JlIG91dHB1dCBzcGFjZSAodXBkYXRlZCBhdmFpbF9vdXQpIGJ1dCBubworICBtb3JlIGlucHV0IGRhdGEsIHVudGlsIGl0IHJldHVybnMgd2l0aCBaX1NUUkVBTV9FTkQgb3IgYW4gZXJyb3IuIEFmdGVyCisgIGRlZmxhdGUgaGFzIHJldHVybmVkIFpfU1RSRUFNX0VORCwgdGhlIG9ubHkgcG9zc2libGUgb3BlcmF0aW9ucyBvbiB0aGUKKyAgc3RyZWFtIGFyZSBkZWZsYXRlUmVzZXQgb3IgZGVmbGF0ZUVuZC4KKworICAgIFpfRklOSVNIIGNhbiBiZSB1c2VkIGltbWVkaWF0ZWx5IGFmdGVyIGRlZmxhdGVJbml0IGlmIGFsbCB0aGUgY29tcHJlc3Npb24KKyAgaXMgdG8gYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVwLiBJbiB0aGlzIGNhc2UsIGF2YWlsX291dCBtdXN0IGJlIGF0IGxlYXN0CisgIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBkZWZsYXRlQm91bmQgKHNlZSBiZWxvdykuIElmIGRlZmxhdGUgZG9lcyBub3QgcmV0dXJuCisgIFpfU1RSRUFNX0VORCwgdGhlbiBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhcyBkZXNjcmliZWQgYWJvdmUuCisKKyAgICBkZWZsYXRlKCkgc2V0cyBzdHJtLT5hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiBhbGwgaW5wdXQgcmVhZAorICBzbyBmYXIgKHRoYXQgaXMsIHRvdGFsX2luIGJ5dGVzKS4KKworICAgIGRlZmxhdGUoKSBtYXkgdXBkYXRlIHN0cm0tPmRhdGFfdHlwZSBpZiBpdCBjYW4gbWFrZSBhIGdvb2QgZ3Vlc3MgYWJvdXQKKyAgdGhlIGlucHV0IGRhdGEgdHlwZSAoWl9CSU5BUlkgb3IgWl9URVhUKS4gSW4gZG91YnQsIHRoZSBkYXRhIGlzIGNvbnNpZGVyZWQKKyAgYmluYXJ5LiBUaGlzIGZpZWxkIGlzIG9ubHkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzIGFuZCBkb2VzIG5vdCBhZmZlY3QKKyAgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpbiBhbnkgbWFubmVyLgorCisgICAgZGVmbGF0ZSgpIHJldHVybnMgWl9PSyBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQKKyAgcHJvY2Vzc2VkIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgWl9TVFJFQU1fRU5EIGlmIGFsbCBpbnB1dCBoYXMgYmVlbgorICBjb25zdW1lZCBhbmQgYWxsIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCAob25seSB3aGVuIGZsdXNoIGlzIHNldCB0bworICBaX0ZJTklTSCksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKKyAgaWYgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgWl9OVUxMKSwgWl9CVUZfRVJST1IgaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUKKyAgKGZvciBleGFtcGxlIGF2YWlsX2luIG9yIGF2YWlsX291dCB3YXMgemVybykuIE5vdGUgdGhhdCBaX0JVRl9FUlJPUiBpcyBub3QKKyAgZmF0YWwsIGFuZCBkZWZsYXRlKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIG1vcmUgaW5wdXQgYW5kIG1vcmUgb3V0cHV0CisgIHNwYWNlIHRvIGNvbnRpbnVlIGNvbXByZXNzaW5nLgorKi8KKworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVFbmQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CisvKgorICAgICBBbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhpcyBzdHJlYW0gYXJlIGZyZWVkLgorICAgVGhpcyBmdW5jdGlvbiBkaXNjYXJkcyBhbnkgdW5wcm9jZXNzZWQgaW5wdXQgYW5kIGRvZXMgbm90IGZsdXNoIGFueQorICAgcGVuZGluZyBvdXRwdXQuCisKKyAgICAgZGVmbGF0ZUVuZCByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgdGhlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCwgWl9EQVRBX0VSUk9SIGlmIHRoZSBzdHJlYW0gd2FzIGZyZWVkCisgICBwcmVtYXR1cmVseSAoc29tZSBpbnB1dCBvciBvdXRwdXQgd2FzIGRpc2NhcmRlZCkuIEluIHRoZSBlcnJvciBjYXNlLAorICAgbXNnIG1heSBiZSBzZXQgYnV0IHRoZW4gcG9pbnRzIHRvIGEgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUKKyAgIGRlYWxsb2NhdGVkKS4KKyovCisKKworLyoKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CisKKyAgICAgSW5pdGlhbGl6ZXMgdGhlIGludGVybmFsIHN0cmVhbSBzdGF0ZSBmb3IgZGVjb21wcmVzc2lvbi4gVGhlIGZpZWxkcworICAgbmV4dF9pbiwgYXZhaWxfaW4sIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieQorICAgdGhlIGNhbGxlci4gSWYgbmV4dF9pbiBpcyBub3QgWl9OVUxMIGFuZCBhdmFpbF9pbiBpcyBsYXJnZSBlbm91Z2ggKHRoZSBleGFjdAorICAgdmFsdWUgZGVwZW5kcyBvbiB0aGUgY29tcHJlc3Npb24gbWV0aG9kKSwgaW5mbGF0ZUluaXQgZGV0ZXJtaW5lcyB0aGUKKyAgIGNvbXByZXNzaW9uIG1ldGhvZCBmcm9tIHRoZSB6bGliIGhlYWRlciBhbmQgYWxsb2NhdGVzIGFsbCBkYXRhIHN0cnVjdHVyZXMKKyAgIGFjY29yZGluZ2x5OyBvdGhlcndpc2UgdGhlIGFsbG9jYXRpb24gd2lsbCBiZSBkZWZlcnJlZCB0byB0aGUgZmlyc3QgY2FsbCBvZgorICAgaW5mbGF0ZS4gIElmIHphbGxvYyBhbmQgemZyZWUgYXJlIHNldCB0byBaX05VTEwsIGluZmxhdGVJbml0IHVwZGF0ZXMgdGhlbSB0bworICAgdXNlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCisKKyAgICAgaW5mbGF0ZUluaXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlCisgICB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlciwgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHBhcmFtZXRlcnMgYXJlCisgICBpbnZhbGlkLCBzdWNoIGFzIGEgbnVsbCBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUuICBtc2cgaXMgc2V0IHRvIG51bGwgaWYKKyAgIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuIGluZmxhdGVJbml0IGRvZXMgbm90IHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb24KKyAgIGFwYXJ0IGZyb20gcG9zc2libHkgcmVhZGluZyB0aGUgemxpYiBoZWFkZXIgaWYgcHJlc2VudDogYWN0dWFsIGRlY29tcHJlc3Npb24KKyAgIHdpbGwgYmUgZG9uZSBieSBpbmZsYXRlKCkuICAoU28gbmV4dF9pbiBhbmQgYXZhaWxfaW4gbWF5IGJlIG1vZGlmaWVkLCBidXQKKyAgIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgYXJlIHVudXNlZCBhbmQgdW5jaGFuZ2VkLikgIFRoZSBjdXJyZW50CisgICBpbXBsZW1lbnRhdGlvbiBvZiBpbmZsYXRlSW5pdCgpIGRvZXMgbm90IHByb2Nlc3MgYW55IGhlYWRlciBpbmZvcm1hdGlvbiAtLQorICAgdGhhdCBpcyBkZWZlcnJlZCB1bnRpbCBpbmZsYXRlKCkgaXMgY2FsbGVkLgorKi8KKworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGUgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgZmx1c2gpKTsKKy8qCisgICAgaW5mbGF0ZSBkZWNvbXByZXNzZXMgYXMgbXVjaCBkYXRhIGFzIHBvc3NpYmxlLCBhbmQgc3RvcHMgd2hlbiB0aGUgaW5wdXQKKyAgYnVmZmVyIGJlY29tZXMgZW1wdHkgb3IgdGhlIG91dHB1dCBidWZmZXIgYmVjb21lcyBmdWxsLiBJdCBtYXkgaW50cm9kdWNlCisgIHNvbWUgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkgZXhjZXB0IHdoZW4KKyAgZm9yY2VkIHRvIGZsdXNoLgorCisgIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuIGluZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCisgIGZvbGxvd2luZyBhY3Rpb25zOgorCisgIC0gRGVjb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IG5leHRfaW4gYW5kIHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbgorICAgIGFjY29yZGluZ2x5LiBJZiBub3QgYWxsIGlucHV0IGNhbiBiZSBwcm9jZXNzZWQgKGJlY2F1c2UgdGhlcmUgaXMgbm90CisgICAgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIpLCBuZXh0X2luIGlzIHVwZGF0ZWQgYW5kIHByb2Nlc3NpbmcKKyAgICB3aWxsIHJlc3VtZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgbmV4dCBjYWxsIG9mIGluZmxhdGUoKS4KKworICAtIFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgbmV4dF9vdXQgYW5kIHVwZGF0ZSBuZXh0X291dCBhbmQgYXZhaWxfb3V0CisgICAgYWNjb3JkaW5nbHkuICBpbmZsYXRlKCkgcHJvdmlkZXMgYXMgbXVjaCBvdXRwdXQgYXMgcG9zc2libGUsIHVudGlsIHRoZXJlCisgICAgaXMgbm8gbW9yZSBpbnB1dCBkYXRhIG9yIG5vIG1vcmUgc3BhY2UgaW4gdGhlIG91dHB1dCBidWZmZXIgKHNlZSBiZWxvdworICAgIGFib3V0IHRoZSBmbHVzaCBwYXJhbWV0ZXIpLgorCisgIEJlZm9yZSB0aGUgY2FsbCBvZiBpbmZsYXRlKCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKKyAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nCisgIG1vcmUgb3V0cHV0LCBhbmQgdXBkYXRpbmcgdGhlIG5leHRfKiBhbmQgYXZhaWxfKiB2YWx1ZXMgYWNjb3JkaW5nbHkuCisgIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29uc3VtZSB0aGUgdW5jb21wcmVzc2VkIG91dHB1dCB3aGVuIGl0IHdhbnRzLCBmb3IKKyAgZXhhbXBsZSB3aGVuIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwgKGF2YWlsX291dCA9PSAwKSwgb3IgYWZ0ZXIgZWFjaAorICBjYWxsIG9mIGluZmxhdGUoKS4gSWYgaW5mbGF0ZSByZXR1cm5zIFpfT0sgYW5kIHdpdGggemVybyBhdmFpbF9vdXQsIGl0CisgIG11c3QgYmUgY2FsbGVkIGFnYWluIGFmdGVyIG1ha2luZyByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyIGJlY2F1c2UgdGhlcmUKKyAgbWlnaHQgYmUgbW9yZSBvdXRwdXQgcGVuZGluZy4KKworICAgIFRoZSBmbHVzaCBwYXJhbWV0ZXIgb2YgaW5mbGF0ZSgpIGNhbiBiZSBaX05PX0ZMVVNILCBaX1NZTkNfRkxVU0gsIFpfRklOSVNILAorICBaX0JMT0NLLCBvciBaX1RSRUVTLiBaX1NZTkNfRkxVU0ggcmVxdWVzdHMgdGhhdCBpbmZsYXRlKCkgZmx1c2ggYXMgbXVjaAorICBvdXRwdXQgYXMgcG9zc2libGUgdG8gdGhlIG91dHB1dCBidWZmZXIuIFpfQkxPQ0sgcmVxdWVzdHMgdGhhdCBpbmZsYXRlKCkgc3RvcAorICBpZiBhbmQgd2hlbiBpdCBnZXRzIHRvIHRoZSBuZXh0IGRlZmxhdGUgYmxvY2sgYm91bmRhcnkuIFdoZW4gZGVjb2RpbmcgdGhlCisgIHpsaWIgb3IgZ3ppcCBmb3JtYXQsIHRoaXMgd2lsbCBjYXVzZSBpbmZsYXRlKCkgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyCisgIHRoZSBoZWFkZXIgYW5kIGJlZm9yZSB0aGUgZmlyc3QgYmxvY2suIFdoZW4gZG9pbmcgYSByYXcgaW5mbGF0ZSwgaW5mbGF0ZSgpCisgIHdpbGwgZ28gYWhlYWQgYW5kIHByb2Nlc3MgdGhlIGZpcnN0IGJsb2NrLCBhbmQgd2lsbCByZXR1cm4gd2hlbiBpdCBnZXRzIHRvCisgIHRoZSBlbmQgb2YgdGhhdCBibG9jaywgb3Igd2hlbiBpdCBydW5zIG91dCBvZiBkYXRhLgorCisgICAgVGhlIFpfQkxPQ0sgb3B0aW9uIGFzc2lzdHMgaW4gYXBwZW5kaW5nIHRvIG9yIGNvbWJpbmluZyBkZWZsYXRlIHN0cmVhbXMuCisgIEFsc28gdG8gYXNzaXN0IGluIHRoaXMsIG9uIHJldHVybiBpbmZsYXRlKCkgd2lsbCBzZXQgc3RybS0+ZGF0YV90eXBlIHRvIHRoZQorICBudW1iZXIgb2YgdW51c2VkIGJpdHMgaW4gdGhlIGxhc3QgYnl0ZSB0YWtlbiBmcm9tIHN0cm0tPm5leHRfaW4sIHBsdXMgNjQKKyAgaWYgaW5mbGF0ZSgpIGlzIGN1cnJlbnRseSBkZWNvZGluZyB0aGUgbGFzdCBibG9jayBpbiB0aGUgZGVmbGF0ZSBzdHJlYW0sCisgIHBsdXMgMTI4IGlmIGluZmxhdGUoKSByZXR1cm5lZCBpbW1lZGlhdGVseSBhZnRlciBkZWNvZGluZyBhbiBlbmQtb2YtYmxvY2sKKyAgY29kZSBvciBkZWNvZGluZyB0aGUgY29tcGxldGUgaGVhZGVyIHVwIHRvIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBieXRlIG9mIHRoZQorICBkZWZsYXRlIHN0cmVhbS4gVGhlIGVuZC1vZi1ibG9jayB3aWxsIG5vdCBiZSBpbmRpY2F0ZWQgdW50aWwgYWxsIG9mIHRoZQorICB1bmNvbXByZXNzZWQgZGF0YSBmcm9tIHRoYXQgYmxvY2sgaGFzIGJlZW4gd3JpdHRlbiB0byBzdHJtLT5uZXh0X291dC4gIFRoZQorICBudW1iZXIgb2YgdW51c2VkIGJpdHMgbWF5IGluIGdlbmVyYWwgYmUgZ3JlYXRlciB0aGFuIHNldmVuLCBleGNlcHQgd2hlbgorICBiaXQgNyBvZiBkYXRhX3R5cGUgaXMgc2V0LCBpbiB3aGljaCBjYXNlIHRoZSBudW1iZXIgb2YgdW51c2VkIGJpdHMgd2lsbCBiZQorICBsZXNzIHRoYW4gZWlnaHQuICBkYXRhX3R5cGUgaXMgc2V0IGFzIG5vdGVkIGhlcmUgZXZlcnkgdGltZSBpbmZsYXRlKCkKKyAgcmV0dXJucyBmb3IgYWxsIGZsdXNoIG9wdGlvbnMsIGFuZCBzbyBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGFtb3VudAorICBvZiBjdXJyZW50bHkgY29uc3VtZWQgaW5wdXQgaW4gYml0cy4KKworICAgIFRoZSBaX1RSRUVTIG9wdGlvbiBiZWhhdmVzIGFzIFpfQkxPQ0sgZG9lcywgYnV0IGl0IGFsc28gcmV0dXJucyB3aGVuIHRoZQorICBlbmQgb2YgZWFjaCBkZWZsYXRlIGJsb2NrIGhlYWRlciBpcyByZWFjaGVkLCBiZWZvcmUgYW55IGFjdHVhbCBkYXRhIGluIHRoYXQKKyAgYmxvY2sgaXMgZGVjb2RlZC4gIFRoaXMgYWxsb3dzIHRoZSBjYWxsZXIgdG8gZGV0ZXJtaW5lIHRoZSBsZW5ndGggb2YgdGhlCisgIGRlZmxhdGUgYmxvY2sgaGVhZGVyIGZvciBsYXRlciB1c2UgaW4gcmFuZG9tIGFjY2VzcyB3aXRoaW4gYSBkZWZsYXRlIGJsb2NrLgorICAyNTYgaXMgYWRkZWQgdG8gdGhlIHZhbHVlIG9mIHN0cm0tPmRhdGFfdHlwZSB3aGVuIGluZmxhdGUoKSByZXR1cm5zCisgIGltbWVkaWF0ZWx5IGFmdGVyIHJlYWNoaW5nIHRoZSBlbmQgb2YgdGhlIGRlZmxhdGUgYmxvY2sgaGVhZGVyLgorCisgICAgaW5mbGF0ZSgpIHNob3VsZCBub3JtYWxseSBiZSBjYWxsZWQgdW50aWwgaXQgcmV0dXJucyBaX1NUUkVBTV9FTkQgb3IgYW4KKyAgZXJyb3IuIEhvd2V2ZXIgaWYgYWxsIGRlY29tcHJlc3Npb24gaXMgdG8gYmUgcGVyZm9ybWVkIGluIGEgc2luZ2xlIHN0ZXAKKyAgKGEgc2luZ2xlIGNhbGwgb2YgaW5mbGF0ZSksIHRoZSBwYXJhbWV0ZXIgZmx1c2ggc2hvdWxkIGJlIHNldCB0bworICBaX0ZJTklTSC4gSW4gdGhpcyBjYXNlIGFsbCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCBhbmQgYWxsIHBlbmRpbmcKKyAgb3V0cHV0IGlzIGZsdXNoZWQ7IGF2YWlsX291dCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCB0aGUKKyAgdW5jb21wcmVzc2VkIGRhdGEuIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbWF5IGhhdmUgYmVlbiBzYXZlZAorICBieSB0aGUgY29tcHJlc3NvciBmb3IgdGhpcyBwdXJwb3NlLikgVGhlIG5leHQgb3BlcmF0aW9uIG9uIHRoaXMgc3RyZWFtIG11c3QKKyAgYmUgaW5mbGF0ZUVuZCB0byBkZWFsbG9jYXRlIHRoZSBkZWNvbXByZXNzaW9uIHN0YXRlLiBUaGUgdXNlIG9mIFpfRklOSVNICisgIGlzIG5ldmVyIHJlcXVpcmVkLCBidXQgY2FuIGJlIHVzZWQgdG8gaW5mb3JtIGluZmxhdGUgdGhhdCBhIGZhc3RlciBhcHByb2FjaAorICBtYXkgYmUgdXNlZCBmb3IgdGhlIHNpbmdsZSBpbmZsYXRlKCkgY2FsbC4KKworICAgICBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCBpbmZsYXRlKCkgYWx3YXlzIGZsdXNoZXMgYXMgbXVjaCBvdXRwdXQgYXMKKyAgcG9zc2libGUgdG8gdGhlIG91dHB1dCBidWZmZXIsIGFuZCBhbHdheXMgdXNlcyB0aGUgZmFzdGVyIGFwcHJvYWNoIG9uIHRoZQorICBmaXJzdCBjYWxsLiBTbyB0aGUgb25seSBlZmZlY3Qgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBpbiB0aGlzIGltcGxlbWVudGF0aW9uCisgIGlzIG9uIHRoZSByZXR1cm4gdmFsdWUgb2YgaW5mbGF0ZSgpLCBhcyBub3RlZCBiZWxvdywgb3Igd2hlbiBpdCByZXR1cm5zIGVhcmx5CisgIGJlY2F1c2UgWl9CTE9DSyBvciBaX1RSRUVTIGlzIHVzZWQuCisKKyAgICAgSWYgYSBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYWZ0ZXIgdGhpcyBjYWxsIChzZWUgaW5mbGF0ZVNldERpY3Rpb25hcnkKKyAgYmVsb3cpLCBpbmZsYXRlIHNldHMgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgdGhlIGRpY3Rpb25hcnkKKyAgY2hvc2VuIGJ5IHRoZSBjb21wcmVzc29yIGFuZCByZXR1cm5zIFpfTkVFRF9ESUNUOyBvdGhlcndpc2UgaXQgc2V0cworICBzdHJtLT5hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiBhbGwgb3V0cHV0IHByb2R1Y2VkIHNvIGZhciAodGhhdCBpcywKKyAgdG90YWxfb3V0IGJ5dGVzKSBhbmQgcmV0dXJucyBaX09LLCBaX1NUUkVBTV9FTkQgb3IgYW4gZXJyb3IgY29kZSBhcyBkZXNjcmliZWQKKyAgYmVsb3cuIEF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwgaW5mbGF0ZSgpIGNoZWNrcyB0aGF0IGl0cyBjb21wdXRlZCBhZGxlcjMyCisgIGNoZWNrc3VtIGlzIGVxdWFsIHRvIHRoYXQgc2F2ZWQgYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgWl9TVFJFQU1fRU5ECisgIG9ubHkgaWYgdGhlIGNoZWNrc3VtIGlzIGNvcnJlY3QuCisKKyAgICBpbmZsYXRlKCkgY2FuIGRlY29tcHJlc3MgYW5kIGNoZWNrIGVpdGhlciB6bGliLXdyYXBwZWQgb3IgZ3ppcC13cmFwcGVkCisgIGRlZmxhdGUgZGF0YS4gIFRoZSBoZWFkZXIgdHlwZSBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5LCBpZiByZXF1ZXN0ZWQgd2hlbgorICBpbml0aWFsaXppbmcgd2l0aCBpbmZsYXRlSW5pdDIoKS4gIEFueSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIGd6aXAKKyAgaGVhZGVyIGlzIG5vdCByZXRhaW5lZCwgc28gYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0aGF0IGluZm9ybWF0aW9uIHNob3VsZAorICBpbnN0ZWFkIHVzZSByYXcgaW5mbGF0ZSwgc2VlIGluZmxhdGVJbml0MigpIGJlbG93LCBvciBpbmZsYXRlQmFjaygpIGFuZAorICBwZXJmb3JtIHRoZWlyIG93biBwcm9jZXNzaW5nIG9mIHRoZSBnemlwIGhlYWRlciBhbmQgdHJhaWxlci4KKworICAgIGluZmxhdGUoKSByZXR1cm5zIFpfT0sgaWYgc29tZSBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlIChtb3JlIGlucHV0IHByb2Nlc3NlZAorICBvciBtb3JlIG91dHB1dCBwcm9kdWNlZCksIFpfU1RSRUFNX0VORCBpZiB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgaGFzCisgIGJlZW4gcmVhY2hlZCBhbmQgYWxsIHVuY29tcHJlc3NlZCBvdXRwdXQgaGFzIGJlZW4gcHJvZHVjZWQsIFpfTkVFRF9ESUNUIGlmIGEKKyAgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGF0IHRoaXMgcG9pbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMKKyAgY29ycnVwdGVkIChpbnB1dCBzdHJlYW0gbm90IGNvbmZvcm1pbmcgdG8gdGhlIHpsaWIgZm9ybWF0IG9yIGluY29ycmVjdCBjaGVjaworICB2YWx1ZSksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQgKGZvciBleGFtcGxlCisgIG5leHRfaW4gb3IgbmV4dF9vdXQgd2FzIFpfTlVMTCksIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSwKKyAgWl9CVUZfRVJST1IgaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUgb3IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUKKyAgb3V0cHV0IGJ1ZmZlciB3aGVuIFpfRklOSVNIIGlzIHVzZWQuIE5vdGUgdGhhdCBaX0JVRl9FUlJPUiBpcyBub3QgZmF0YWwsIGFuZAorICBpbmZsYXRlKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIG1vcmUgaW5wdXQgYW5kIG1vcmUgb3V0cHV0IHNwYWNlIHRvCisgIGNvbnRpbnVlIGRlY29tcHJlc3NpbmcuIElmIFpfREFUQV9FUlJPUiBpcyByZXR1cm5lZCwgdGhlIGFwcGxpY2F0aW9uIG1heSB0aGVuCisgIGNhbGwgaW5mbGF0ZVN5bmMoKSB0byBsb29rIGZvciBhIGdvb2QgY29tcHJlc3Npb24gYmxvY2sgaWYgYSBwYXJ0aWFsIHJlY292ZXJ5CisgIG9mIHRoZSBkYXRhIGlzIGRlc2lyZWQuCisqLworCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUVuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIEFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGlzIHN0cmVhbSBhcmUgZnJlZWQuCisgICBUaGlzIGZ1bmN0aW9uIGRpc2NhcmRzIGFueSB1bnByb2Nlc3NlZCBpbnB1dCBhbmQgZG9lcyBub3QgZmx1c2ggYW55CisgICBwZW5kaW5nIG91dHB1dC4KKworICAgICBpbmZsYXRlRW5kIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0YXRlCisgICB3YXMgaW5jb25zaXN0ZW50LiBJbiB0aGUgZXJyb3IgY2FzZSwgbXNnIG1heSBiZSBzZXQgYnV0IHRoZW4gcG9pbnRzIHRvIGEKKyAgIHN0YXRpYyBzdHJpbmcgKHdoaWNoIG11c3Qgbm90IGJlIGRlYWxsb2NhdGVkKS4KKyovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmFuY2VkIGZ1bmN0aW9ucyAqLworCisvKgorICAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBuZWVkZWQgb25seSBpbiBzb21lIHNwZWNpYWwgYXBwbGljYXRpb25zLgorKi8KKworLyoKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXQyIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIG1lbUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgc3RyYXRlZ3kpKTsKKworICAgICBUaGlzIGlzIGFub3RoZXIgdmVyc2lvbiBvZiBkZWZsYXRlSW5pdCB3aXRoIG1vcmUgY29tcHJlc3Npb24gb3B0aW9ucy4gVGhlCisgICBmaWVsZHMgbmV4dF9pbiwgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5CisgICB0aGUgY2FsbGVyLgorCisgICAgIFRoZSBtZXRob2QgcGFyYW1ldGVyIGlzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QuIEl0IG11c3QgYmUgWl9ERUZMQVRFRCBpbgorICAgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgorCisgICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSB3aW5kb3cgc2l6ZQorICAgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yIHRoaXMKKyAgIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIExhcmdlciB2YWx1ZXMgb2YgdGhpcyBwYXJhbWV0ZXIgcmVzdWx0IGluIGJldHRlcgorICAgY29tcHJlc3Npb24gYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZgorICAgZGVmbGF0ZUluaXQgaXMgdXNlZCBpbnN0ZWFkLgorCisgICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgLTguLi0xNSBmb3IgcmF3IGRlZmxhdGUuIEluIHRoaXMgY2FzZSwgLXdpbmRvd0JpdHMKKyAgIGRldGVybWluZXMgdGhlIHdpbmRvdyBzaXplLiBkZWZsYXRlKCkgd2lsbCB0aGVuIGdlbmVyYXRlIHJhdyBkZWZsYXRlIGRhdGEKKyAgIHdpdGggbm8gemxpYiBoZWFkZXIgb3IgdHJhaWxlciwgYW5kIHdpbGwgbm90IGNvbXB1dGUgYW4gYWRsZXIzMiBjaGVjayB2YWx1ZS4KKworICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIGdyZWF0ZXIgdGhhbiAxNSBmb3Igb3B0aW9uYWwgZ3ppcCBlbmNvZGluZy4gQWRkCisgICAxNiB0byB3aW5kb3dCaXRzIHRvIHdyaXRlIGEgc2ltcGxlIGd6aXAgaGVhZGVyIGFuZCB0cmFpbGVyIGFyb3VuZCB0aGUKKyAgIGNvbXByZXNzZWQgZGF0YSBpbnN0ZWFkIG9mIGEgemxpYiB3cmFwcGVyLiBUaGUgZ3ppcCBoZWFkZXIgd2lsbCBoYXZlIG5vCisgICBmaWxlIG5hbWUsIG5vIGV4dHJhIGRhdGEsIG5vIGNvbW1lbnQsIG5vIG1vZGlmaWNhdGlvbiB0aW1lIChzZXQgdG8gemVybyksCisgICBubyBoZWFkZXIgY3JjLCBhbmQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2lsbCBiZSBzZXQgdG8gMjU1ICh1bmtub3duKS4gIElmIGEKKyAgIGd6aXAgc3RyZWFtIGlzIGJlaW5nIHdyaXR0ZW4sIHN0cm0tPmFkbGVyIGlzIGEgY3JjMzIgaW5zdGVhZCBvZiBhbiBhZGxlcjMyLgorCisgICAgIFRoZSBtZW1MZXZlbCBwYXJhbWV0ZXIgc3BlY2lmaWVzIGhvdyBtdWNoIG1lbW9yeSBzaG91bGQgYmUgYWxsb2NhdGVkCisgICBmb3IgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLiBtZW1MZXZlbD0xIHVzZXMgbWluaW11bSBtZW1vcnkgYnV0CisgICBpcyBzbG93IGFuZCByZWR1Y2VzIGNvbXByZXNzaW9uIHJhdGlvOyBtZW1MZXZlbD05IHVzZXMgbWF4aW11bSBtZW1vcnkKKyAgIGZvciBvcHRpbWFsIHNwZWVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA4LiBTZWUgemNvbmYuaCBmb3IgdG90YWwgbWVtb3J5CisgICB1c2FnZSBhcyBhIGZ1bmN0aW9uIG9mIHdpbmRvd0JpdHMgYW5kIG1lbUxldmVsLgorCisgICAgIFRoZSBzdHJhdGVneSBwYXJhbWV0ZXIgaXMgdXNlZCB0byB0dW5lIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0uIFVzZSB0aGUKKyAgIHZhbHVlIFpfREVGQVVMVF9TVFJBVEVHWSBmb3Igbm9ybWFsIGRhdGEsIFpfRklMVEVSRUQgZm9yIGRhdGEgcHJvZHVjZWQgYnkgYQorICAgZmlsdGVyIChvciBwcmVkaWN0b3IpLCBaX0hVRkZNQU5fT05MWSB0byBmb3JjZSBIdWZmbWFuIGVuY29kaW5nIG9ubHkgKG5vCisgICBzdHJpbmcgbWF0Y2gpLCBvciBaX1JMRSB0byBsaW1pdCBtYXRjaCBkaXN0YW5jZXMgdG8gb25lIChydW4tbGVuZ3RoCisgICBlbmNvZGluZykuIEZpbHRlcmVkIGRhdGEgY29uc2lzdHMgbW9zdGx5IG9mIHNtYWxsIHZhbHVlcyB3aXRoIGEgc29tZXdoYXQKKyAgIHJhbmRvbSBkaXN0cmlidXRpb24uIEluIHRoaXMgY2FzZSwgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpcyB0dW5lZCB0bworICAgY29tcHJlc3MgdGhlbSBiZXR0ZXIuIFRoZSBlZmZlY3Qgb2YgWl9GSUxURVJFRCBpcyB0byBmb3JjZSBtb3JlIEh1ZmZtYW4KKyAgIGNvZGluZyBhbmQgbGVzcyBzdHJpbmcgbWF0Y2hpbmc7IGl0IGlzIHNvbWV3aGF0IGludGVybWVkaWF0ZSBiZXR3ZWVuCisgICBaX0RFRkFVTFRfU1RSQVRFR1kgYW5kIFpfSFVGRk1BTl9PTkxZLiBaX1JMRSBpcyBkZXNpZ25lZCB0byBiZSBhbG1vc3QgYXMKKyAgIGZhc3QgYXMgWl9IVUZGTUFOX09OTFksIGJ1dCBnaXZlIGJldHRlciBjb21wcmVzc2lvbiBmb3IgUE5HIGltYWdlIGRhdGEuIFRoZQorICAgc3RyYXRlZ3kgcGFyYW1ldGVyIG9ubHkgYWZmZWN0cyB0aGUgY29tcHJlc3Npb24gcmF0aW8gYnV0IG5vdCB0aGUKKyAgIGNvcnJlY3RuZXNzIG9mIHRoZSBjb21wcmVzc2VkIG91dHB1dCBldmVuIGlmIGl0IGlzIG5vdCBzZXQgYXBwcm9wcmlhdGVseS4KKyAgIFpfRklYRUQgcHJldmVudHMgdGhlIHVzZSBvZiBkeW5hbWljIEh1ZmZtYW4gY29kZXMsIGFsbG93aW5nIGZvciBhIHNpbXBsZXIKKyAgIGRlY29kZXIgZm9yIHNwZWNpYWwgYXBwbGljYXRpb25zLgorCisgICAgICBkZWZsYXRlSW5pdDIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIGEgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgYW4gaW52YWxpZAorICAgbWV0aG9kKS4gbXNnIGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICBkZWZsYXRlSW5pdDIgZG9lcworICAgbm90IHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBkZWZsYXRlKCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVTZXREaWN0aW9uYXJ5IE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCAgZGljdExlbmd0aCkpOworLyoKKyAgICAgSW5pdGlhbGl6ZXMgdGhlIGNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gYnl0ZSBzZXF1ZW5jZQorICAgd2l0aG91dCBwcm9kdWNpbmcgYW55IGNvbXByZXNzZWQgb3V0cHV0LiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkCisgICBpbW1lZGlhdGVseSBhZnRlciBkZWZsYXRlSW5pdCwgZGVmbGF0ZUluaXQyIG9yIGRlZmxhdGVSZXNldCwgYmVmb3JlIGFueQorICAgY2FsbCBvZiBkZWZsYXRlLiBUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUKKyAgIGRpY3Rpb25hcnkgKHNlZSBpbmZsYXRlU2V0RGljdGlvbmFyeSkuCisKKyAgICAgVGhlIGRpY3Rpb25hcnkgc2hvdWxkIGNvbnNpc3Qgb2Ygc3RyaW5ncyAoYnl0ZSBzZXF1ZW5jZXMpIHRoYXQgYXJlIGxpa2VseQorICAgdG8gYmUgZW5jb3VudGVyZWQgbGF0ZXIgaW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCwgd2l0aCB0aGUgbW9zdCBjb21tb25seQorICAgdXNlZCBzdHJpbmdzIHByZWZlcmFibHkgcHV0IHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeS4gVXNpbmcgYQorICAgZGljdGlvbmFyeSBpcyBtb3N0IHVzZWZ1bCB3aGVuIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQgaXMgc2hvcnQgYW5kIGNhbiBiZQorICAgcHJlZGljdGVkIHdpdGggZ29vZCBhY2N1cmFjeTsgdGhlIGRhdGEgY2FuIHRoZW4gYmUgY29tcHJlc3NlZCBiZXR0ZXIgdGhhbgorICAgd2l0aCB0aGUgZGVmYXVsdCBlbXB0eSBkaWN0aW9uYXJ5LgorCisgICAgIERlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgY29tcHJlc3Npb24gZGF0YSBzdHJ1Y3R1cmVzIHNlbGVjdGVkIGJ5CisgICBkZWZsYXRlSW5pdCBvciBkZWZsYXRlSW5pdDIsIGEgcGFydCBvZiB0aGUgZGljdGlvbmFyeSBtYXkgaW4gZWZmZWN0IGJlCisgICBkaXNjYXJkZWQsIGZvciBleGFtcGxlIGlmIHRoZSBkaWN0aW9uYXJ5IGlzIGxhcmdlciB0aGFuIHRoZSB3aW5kb3cgc2l6ZQorICAgcHJvdmlkZWQgaW4gZGVmbGF0ZUluaXQgb3IgZGVmbGF0ZUluaXQyLiBUaHVzIHRoZSBzdHJpbmdzIG1vc3QgbGlrZWx5IHRvIGJlCisgICB1c2VmdWwgc2hvdWxkIGJlIHB1dCBhdCB0aGUgZW5kIG9mIHRoZSBkaWN0aW9uYXJ5LCBub3QgYXQgdGhlIGZyb250LiBJbgorICAgYWRkaXRpb24sIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIGRlZmxhdGUgd2lsbCB1c2UgYXQgbW9zdCB0aGUgd2luZG93CisgICBzaXplIG1pbnVzIDI2MiBieXRlcyBvZiB0aGUgcHJvdmlkZWQgZGljdGlvbmFyeS4KKworICAgICBVcG9uIHJldHVybiBvZiB0aGlzIGZ1bmN0aW9uLCBzdHJtLT5hZGxlciBpcyBzZXQgdG8gdGhlIGFkbGVyMzIgdmFsdWUKKyAgIG9mIHRoZSBkaWN0aW9uYXJ5OyB0aGUgZGVjb21wcmVzc29yIG1heSBsYXRlciB1c2UgdGhpcyB2YWx1ZSB0byBkZXRlcm1pbmUKKyAgIHdoaWNoIGRpY3Rpb25hcnkgaGFzIGJlZW4gdXNlZCBieSB0aGUgY29tcHJlc3Nvci4gKFRoZSBhZGxlcjMyIHZhbHVlCisgICBhcHBsaWVzIHRvIHRoZSB3aG9sZSBkaWN0aW9uYXJ5IGV2ZW4gaWYgb25seSBhIHN1YnNldCBvZiB0aGUgZGljdGlvbmFyeSBpcworICAgYWN0dWFsbHkgdXNlZCBieSB0aGUgY29tcHJlc3Nvci4pIElmIGEgcmF3IGRlZmxhdGUgd2FzIHJlcXVlc3RlZCwgdGhlbiB0aGUKKyAgIGFkbGVyMzIgdmFsdWUgaXMgbm90IGNvbXB1dGVkIGFuZCBzdHJtLT5hZGxlciBpcyBub3Qgc2V0LgorCisgICAgIGRlZmxhdGVTZXREaWN0aW9uYXJ5IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiBhCisgICBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoZS5nLiBkaWN0aW9uYXJ5IGJlaW5nIFpfTlVMTCkgb3IgdGhlIHN0cmVhbSBzdGF0ZSBpcworICAgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZSBpZiBkZWZsYXRlIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIHN0cmVhbQorICAgb3IgaWYgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCBpcyBic29ydCkuIGRlZmxhdGVTZXREaWN0aW9uYXJ5IGRvZXMgbm90CisgICBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlQ29weSBPRigoel9zdHJlYW1wIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6X3N0cmVhbXAgc291cmNlKSk7CisvKgorICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBzdHJlYW0gYXMgYSBjb21wbGV0ZSBjb3B5IG9mIHRoZSBzb3VyY2Ugc3RyZWFtLgorCisgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIHNldmVyYWwgY29tcHJlc3Npb24gc3RyYXRlZ2llcyB3aWxsIGJlCisgICB0cmllZCwgZm9yIGV4YW1wbGUgd2hlbiB0aGVyZSBhcmUgc2V2ZXJhbCB3YXlzIG9mIHByZS1wcm9jZXNzaW5nIHRoZSBpbnB1dAorICAgZGF0YSB3aXRoIGEgZmlsdGVyLiBUaGUgc3RyZWFtcyB0aGF0IHdpbGwgYmUgZGlzY2FyZGVkIHNob3VsZCB0aGVuIGJlIGZyZWVkCisgICBieSBjYWxsaW5nIGRlZmxhdGVFbmQuICBOb3RlIHRoYXQgZGVmbGF0ZUNvcHkgZHVwbGljYXRlcyB0aGUgaW50ZXJuYWwKKyAgIGNvbXByZXNzaW9uIHN0YXRlIHdoaWNoIGNhbiBiZSBxdWl0ZSBsYXJnZSwgc28gdGhpcyBzdHJhdGVneSBpcyBzbG93IGFuZAorICAgY2FuIGNvbnN1bWUgbG90cyBvZiBtZW1vcnkuCisKKyAgICAgZGVmbGF0ZUNvcHkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKKyAgIGVub3VnaCBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2Ugc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQKKyAgIChzdWNoIGFzIHphbGxvYyBiZWluZyBaX05VTEwpLiBtc2cgaXMgbGVmdCB1bmNoYW5nZWQgaW4gYm90aCBzb3VyY2UgYW5kCisgICBkZXN0aW5hdGlvbi4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVJlc2V0IE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGRlZmxhdGVFbmQgZm9sbG93ZWQgYnkgZGVmbGF0ZUluaXQsCisgICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLgorICAgVGhlIHN0cmVhbSB3aWxsIGtlZXAgdGhlIHNhbWUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIGFueSBvdGhlciBhdHRyaWJ1dGVzCisgICB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IGRlZmxhdGVJbml0Mi4KKworICAgICAgZGVmbGF0ZVJlc2V0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoc3VjaCBhcyB6YWxsb2Mgb3Igc3RhdGUgYmVpbmcgWl9OVUxMKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVBhcmFtcyBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmF0ZWd5KSk7CisvKgorICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIGFuZCBjb21wcmVzc2lvbiBzdHJhdGVneS4gIFRoZQorICAgaW50ZXJwcmV0YXRpb24gb2YgbGV2ZWwgYW5kIHN0cmF0ZWd5IGlzIGFzIGluIGRlZmxhdGVJbml0Mi4gIFRoaXMgY2FuIGJlCisgICB1c2VkIHRvIHN3aXRjaCBiZXR3ZWVuIGNvbXByZXNzaW9uIGFuZCBzdHJhaWdodCBjb3B5IG9mIHRoZSBpbnB1dCBkYXRhLCBvcgorICAgdG8gc3dpdGNoIHRvIGEgZGlmZmVyZW50IGtpbmQgb2YgaW5wdXQgZGF0YSByZXF1aXJpbmcgYSBkaWZmZXJlbnQKKyAgIHN0cmF0ZWd5LiBJZiB0aGUgY29tcHJlc3Npb24gbGV2ZWwgaXMgY2hhbmdlZCwgdGhlIGlucHV0IGF2YWlsYWJsZSBzbyBmYXIKKyAgIGlzIGNvbXByZXNzZWQgd2l0aCB0aGUgb2xkIGxldmVsIChhbmQgbWF5IGJlIGZsdXNoZWQpOyB0aGUgbmV3IGxldmVsIHdpbGwKKyAgIHRha2UgZWZmZWN0IG9ubHkgYXQgdGhlIG5leHQgY2FsbCBvZiBkZWZsYXRlKCkuCisKKyAgICAgQmVmb3JlIHRoZSBjYWxsIG9mIGRlZmxhdGVQYXJhbXMsIHRoZSBzdHJlYW0gc3RhdGUgbXVzdCBiZSBzZXQgYXMgZm9yCisgICBhIGNhbGwgb2YgZGVmbGF0ZSgpLCBzaW5jZSB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBpbnB1dCBtYXkgaGF2ZSB0bworICAgYmUgY29tcHJlc3NlZCBhbmQgZmx1c2hlZC4gSW4gcGFydGljdWxhciwgc3RybS0+YXZhaWxfb3V0IG11c3QgYmUgbm9uLXplcm8uCisKKyAgICAgZGVmbGF0ZVBhcmFtcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgb3IgaWYgYSBwYXJhbWV0ZXIgd2FzIGludmFsaWQsIFpfQlVGX0VSUk9SCisgICBpZiBzdHJtLT5hdmFpbF9vdXQgd2FzIHplcm8uCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVUdW5lIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnb29kX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfbGF6eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuaWNlX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfY2hhaW4pKTsKKy8qCisgICAgIEZpbmUgdHVuZSBkZWZsYXRlJ3MgaW50ZXJuYWwgY29tcHJlc3Npb24gcGFyYW1ldGVycy4gIFRoaXMgc2hvdWxkIG9ubHkgYmUKKyAgIHVzZWQgYnkgc29tZW9uZSB3aG8gdW5kZXJzdGFuZHMgdGhlIGFsZ29yaXRobSB1c2VkIGJ5IHpsaWIncyBkZWZsYXRlIGZvcgorICAgc2VhcmNoaW5nIGZvciB0aGUgYmVzdCBtYXRjaGluZyBzdHJpbmcsIGFuZCBldmVuIHRoZW4gb25seSBieSB0aGUgbW9zdAorICAgZmFuYXRpYyBvcHRpbWl6ZXIgdHJ5aW5nIHRvIHNxdWVlemUgb3V0IHRoZSBsYXN0IGNvbXByZXNzZWQgYml0IGZvciB0aGVpcgorICAgc3BlY2lmaWMgaW5wdXQgZGF0YS4gIFJlYWQgdGhlIGRlZmxhdGUuYyBzb3VyY2UgY29kZSBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlCisgICBtYXhfbGF6eSwgZ29vZF9sZW5ndGgsIG5pY2VfbGVuZ3RoLCBhbmQgbWF4X2NoYWluIHBhcmFtZXRlcnMuCisKKyAgICAgZGVmbGF0ZVR1bmUoKSBjYW4gYmUgY2FsbGVkIGFmdGVyIGRlZmxhdGVJbml0KCkgb3IgZGVmbGF0ZUluaXQyKCksIGFuZAorICAgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGZvciBhbiBpbnZhbGlkIGRlZmxhdGUgc3RyZWFtLgorICovCisKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBkZWZsYXRlQm91bmQgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgc291cmNlTGVuKSk7CisvKgorICAgICBkZWZsYXRlQm91bmQoKSByZXR1cm5zIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBjb21wcmVzc2VkIHNpemUgYWZ0ZXIKKyAgIGRlZmxhdGlvbiBvZiBzb3VyY2VMZW4gYnl0ZXMuICBJdCBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZWZsYXRlSW5pdCgpIG9yCisgICBkZWZsYXRlSW5pdDIoKSwgYW5kIGFmdGVyIGRlZmxhdGVTZXRIZWFkZXIoKSwgaWYgdXNlZC4gIFRoaXMgd291bGQgYmUgdXNlZAorICAgdG8gYWxsb2NhdGUgYW4gb3V0cHV0IGJ1ZmZlciBmb3IgZGVmbGF0aW9uIGluIGEgc2luZ2xlIHBhc3MsIGFuZCBzbyB3b3VsZCBiZQorICAgY2FsbGVkIGJlZm9yZSBkZWZsYXRlKCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVQcmltZSBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSk7CisvKgorICAgICBkZWZsYXRlUHJpbWUoKSBpbnNlcnRzIGJpdHMgaW4gdGhlIGRlZmxhdGUgb3V0cHV0IHN0cmVhbS4gIFRoZSBpbnRlbnQKKyAgaXMgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3RhcnQgb2ZmIHRoZSBkZWZsYXRlIG91dHB1dCB3aXRoIHRoZQorICBiaXRzIGxlZnRvdmVyIGZyb20gYSBwcmV2aW91cyBkZWZsYXRlIHN0cmVhbSB3aGVuIGFwcGVuZGluZyB0byBpdC4gIEFzIHN1Y2gsCisgIHRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCBmb3IgcmF3IGRlZmxhdGUsIGFuZCBtdXN0IGJlIHVzZWQgYmVmb3JlIHRoZQorICBmaXJzdCBkZWZsYXRlKCkgY2FsbCBhZnRlciBhIGRlZmxhdGVJbml0MigpIG9yIGRlZmxhdGVSZXNldCgpLiAgYml0cyBtdXN0IGJlCisgIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxNiwgYW5kIHRoYXQgbWFueSBvZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZgorICB2YWx1ZSB3aWxsIGJlIGluc2VydGVkIGluIHRoZSBvdXRwdXQuCisKKyAgICAgIGRlZmxhdGVQcmltZSByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVTZXRIZWFkZXIgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnel9oZWFkZXJwIGhlYWQpKTsKKy8qCisgICAgICBkZWZsYXRlU2V0SGVhZGVyKCkgcHJvdmlkZXMgZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gZm9yIHdoZW4gYSBnemlwCisgICBzdHJlYW0gaXMgcmVxdWVzdGVkIGJ5IGRlZmxhdGVJbml0MigpLiAgZGVmbGF0ZVNldEhlYWRlcigpIG1heSBiZSBjYWxsZWQKKyAgIGFmdGVyIGRlZmxhdGVJbml0MigpIG9yIGRlZmxhdGVSZXNldCgpIGFuZCBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgb2YKKyAgIGRlZmxhdGUoKS4gIFRoZSB0ZXh0LCB0aW1lLCBvcywgZXh0cmEgZmllbGQsIG5hbWUsIGFuZCBjb21tZW50IGluZm9ybWF0aW9uCisgICBpbiB0aGUgcHJvdmlkZWQgZ3pfaGVhZGVyIHN0cnVjdHVyZSBhcmUgd3JpdHRlbiB0byB0aGUgZ3ppcCBoZWFkZXIgKHhmbGFnIGlzCisgICBpZ25vcmVkIC0tIHRoZSBleHRyYSBmbGFncyBhcmUgc2V0IGFjY29yZGluZyB0byB0aGUgY29tcHJlc3Npb24gbGV2ZWwpLiAgVGhlCisgICBjYWxsZXIgbXVzdCBhc3N1cmUgdGhhdCwgaWYgbm90IFpfTlVMTCwgbmFtZSBhbmQgY29tbWVudCBhcmUgdGVybWluYXRlZCB3aXRoCisgICBhIHplcm8gYnl0ZSwgYW5kIHRoYXQgaWYgZXh0cmEgaXMgbm90IFpfTlVMTCwgdGhhdCBleHRyYV9sZW4gYnl0ZXMgYXJlCisgICBhdmFpbGFibGUgdGhlcmUuICBJZiBoY3JjIGlzIHRydWUsIGEgZ3ppcCBoZWFkZXIgY3JjIGlzIGluY2x1ZGVkLiAgTm90ZSB0aGF0CisgICB0aGUgY3VycmVudCB2ZXJzaW9ucyBvZiB0aGUgY29tbWFuZC1saW5lIHZlcnNpb24gb2YgZ3ppcCAodXAgdGhyb3VnaCB2ZXJzaW9uCisgICAxLjMueCkgZG8gbm90IHN1cHBvcnQgaGVhZGVyIGNyYydzLCBhbmQgd2lsbCByZXBvcnQgdGhhdCBpdCBpcyBhICJtdWx0aS1wYXJ0CisgICBnemlwIGZpbGUiIGFuZCBnaXZlIHVwLgorCisgICAgICBJZiBkZWZsYXRlU2V0SGVhZGVyIGlzIG5vdCB1c2VkLCB0aGUgZGVmYXVsdCBnemlwIGhlYWRlciBoYXMgdGV4dCBmYWxzZSwKKyAgIHRoZSB0aW1lIHNldCB0byB6ZXJvLCBhbmQgb3Mgc2V0IHRvIDI1NSwgd2l0aCBubyBleHRyYSwgbmFtZSwgb3IgY29tbWVudAorICAgZmllbGRzLiAgVGhlIGd6aXAgaGVhZGVyIGlzIHJldHVybmVkIHRvIHRoZSBkZWZhdWx0IHN0YXRlIGJ5IGRlZmxhdGVSZXNldCgpLgorCisgICAgICBkZWZsYXRlU2V0SGVhZGVyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KKyovCisKKy8qCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0MiBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICB3aW5kb3dCaXRzKSk7CisKKyAgICAgVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgaW5mbGF0ZUluaXQgd2l0aCBhbiBleHRyYSBwYXJhbWV0ZXIuIFRoZQorICAgZmllbGRzIG5leHRfaW4sIGF2YWlsX2luLCB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZAorICAgYmVmb3JlIGJ5IHRoZSBjYWxsZXIuCisKKyAgICAgVGhlIHdpbmRvd0JpdHMgcGFyYW1ldGVyIGlzIHRoZSBiYXNlIHR3byBsb2dhcml0aG0gb2YgdGhlIG1heGltdW0gd2luZG93CisgICBzaXplICh0aGUgc2l6ZSBvZiB0aGUgaGlzdG9yeSBidWZmZXIpLiAgSXQgc2hvdWxkIGJlIGluIHRoZSByYW5nZSA4Li4xNSBmb3IKKyAgIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTUgaWYgaW5mbGF0ZUluaXQgaXMgdXNlZAorICAgaW5zdGVhZC4gd2luZG93Qml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgd2luZG93Qml0cyB2YWx1ZQorICAgcHJvdmlkZWQgdG8gZGVmbGF0ZUluaXQyKCkgd2hpbGUgY29tcHJlc3NpbmcsIG9yIGl0IG11c3QgYmUgZXF1YWwgdG8gMTUgaWYKKyAgIGRlZmxhdGVJbml0MigpIHdhcyBub3QgdXNlZC4gSWYgYSBjb21wcmVzc2VkIHN0cmVhbSB3aXRoIGEgbGFyZ2VyIHdpbmRvdworICAgc2l6ZSBpcyBnaXZlbiBhcyBpbnB1dCwgaW5mbGF0ZSgpIHdpbGwgcmV0dXJuIHdpdGggdGhlIGVycm9yIGNvZGUKKyAgIFpfREFUQV9FUlJPUiBpbnN0ZWFkIG9mIHRyeWluZyB0byBhbGxvY2F0ZSBhIGxhcmdlciB3aW5kb3cuCisKKyAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSAtOC4uLTE1IGZvciByYXcgaW5mbGF0ZS4gSW4gdGhpcyBjYXNlLCAtd2luZG93Qml0cworICAgZGV0ZXJtaW5lcyB0aGUgd2luZG93IHNpemUuIGluZmxhdGUoKSB3aWxsIHRoZW4gcHJvY2VzcyByYXcgZGVmbGF0ZSBkYXRhLAorICAgbm90IGxvb2tpbmcgZm9yIGEgemxpYiBvciBnemlwIGhlYWRlciwgbm90IGdlbmVyYXRpbmcgYSBjaGVjayB2YWx1ZSwgYW5kIG5vdAorICAgbG9va2luZyBmb3IgYW55IGNoZWNrIHZhbHVlcyBmb3IgY29tcGFyaXNvbiBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uIFRoaXMKKyAgIGlzIGZvciB1c2Ugd2l0aCBvdGhlciBmb3JtYXRzIHRoYXQgdXNlIHRoZSBkZWZsYXRlIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQKKyAgIHN1Y2ggYXMgemlwLiAgVGhvc2UgZm9ybWF0cyBwcm92aWRlIHRoZWlyIG93biBjaGVjayB2YWx1ZXMuIElmIGEgY3VzdG9tCisgICBmb3JtYXQgaXMgZGV2ZWxvcGVkIHVzaW5nIHRoZSByYXcgZGVmbGF0ZSBmb3JtYXQgZm9yIGNvbXByZXNzZWQgZGF0YSwgaXQgaXMKKyAgIHJlY29tbWVuZGVkIHRoYXQgYSBjaGVjayB2YWx1ZSBzdWNoIGFzIGFuIGFkbGVyMzIgb3IgYSBjcmMzMiBiZSBhcHBsaWVkIHRvCisgICB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYXMgaXMgZG9uZSBpbiB0aGUgemxpYiwgZ3ppcCwgYW5kIHppcCBmb3JtYXRzLiAgRm9yCisgICBtb3N0IGFwcGxpY2F0aW9ucywgdGhlIHpsaWIgZm9ybWF0IHNob3VsZCBiZSB1c2VkIGFzIGlzLiBOb3RlIHRoYXQgY29tbWVudHMKKyAgIGFib3ZlIG9uIHRoZSB1c2UgaW4gZGVmbGF0ZUluaXQyKCkgYXBwbGllcyB0byB0aGUgbWFnbml0dWRlIG9mIHdpbmRvd0JpdHMuCisKKyAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSBncmVhdGVyIHRoYW4gMTUgZm9yIG9wdGlvbmFsIGd6aXAgZGVjb2RpbmcuIEFkZAorICAgMzIgdG8gd2luZG93Qml0cyB0byBlbmFibGUgemxpYiBhbmQgZ3ppcCBkZWNvZGluZyB3aXRoIGF1dG9tYXRpYyBoZWFkZXIKKyAgIGRldGVjdGlvbiwgb3IgYWRkIDE2IHRvIGRlY29kZSBvbmx5IHRoZSBnemlwIGZvcm1hdCAodGhlIHpsaWIgZm9ybWF0IHdpbGwKKyAgIHJldHVybiBhIFpfREFUQV9FUlJPUikuICBJZiBhIGd6aXAgc3RyZWFtIGlzIGJlaW5nIGRlY29kZWQsIHN0cm0tPmFkbGVyIGlzCisgICBhIGNyYzMyIGluc3RlYWQgb2YgYW4gYWRsZXIzMi4KKworICAgICBpbmZsYXRlSW5pdDIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlCisgICB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlciwgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHBhcmFtZXRlcnMgYXJlCisgICBpbnZhbGlkLCBzdWNoIGFzIGEgbnVsbCBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUuICBtc2cgaXMgc2V0IHRvIG51bGwgaWYKKyAgIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuIGluZmxhdGVJbml0MiBkb2VzIG5vdCBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uCisgICBhcGFydCBmcm9tIHBvc3NpYmx5IHJlYWRpbmcgdGhlIHpsaWIgaGVhZGVyIGlmIHByZXNlbnQ6IGFjdHVhbCBkZWNvbXByZXNzaW9uCisgICB3aWxsIGJlIGRvbmUgYnkgaW5mbGF0ZSgpLiAgKFNvIG5leHRfaW4gYW5kIGF2YWlsX2luIG1heSBiZSBtb2RpZmllZCwgYnV0CisgICBuZXh0X291dCBhbmQgYXZhaWxfb3V0IGFyZSB1bnVzZWQgYW5kIHVuY2hhbmdlZC4pICBUaGUgY3VycmVudAorICAgaW1wbGVtZW50YXRpb24gb2YgaW5mbGF0ZUluaXQyKCkgZG9lcyBub3QgcHJvY2VzcyBhbnkgaGVhZGVyIGluZm9ybWF0aW9uIC0tCisgICB0aGF0IGlzIGRlZmVycmVkIHVudGlsIGluZmxhdGUoKSBpcyBjYWxsZWQuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVTZXREaWN0aW9uYXJ5IE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCAgZGljdExlbmd0aCkpOworLyoKKyAgICAgSW5pdGlhbGl6ZXMgdGhlIGRlY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiB1bmNvbXByZXNzZWQgYnl0ZQorICAgc2VxdWVuY2UuIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBjYWxsIG9mIGluZmxhdGUsCisgICBpZiB0aGF0IGNhbGwgcmV0dXJuZWQgWl9ORUVEX0RJQ1QuIFRoZSBkaWN0aW9uYXJ5IGNob3NlbiBieSB0aGUgY29tcHJlc3NvcgorICAgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgYWRsZXIzMiB2YWx1ZSByZXR1cm5lZCBieSB0aGF0IGNhbGwgb2YgaW5mbGF0ZS4KKyAgIFRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZSBkaWN0aW9uYXJ5IChzZWUKKyAgIGRlZmxhdGVTZXREaWN0aW9uYXJ5KS4gIEZvciByYXcgaW5mbGF0ZSwgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkCisgICBpbW1lZGlhdGVseSBhZnRlciBpbmZsYXRlSW5pdDIoKSBvciBpbmZsYXRlUmVzZXQoKSBhbmQgYmVmb3JlIGFueSBjYWxsIG9mCisgICBpbmZsYXRlKCkgdG8gc2V0IHRoZSBkaWN0aW9uYXJ5LiAgVGhlIGFwcGxpY2F0aW9uIG11c3QgaW5zdXJlIHRoYXQgdGhlCisgICBkaWN0aW9uYXJ5IHRoYXQgd2FzIHVzZWQgZm9yIGNvbXByZXNzaW9uIGlzIHByb3ZpZGVkLgorCisgICAgIGluZmxhdGVTZXREaWN0aW9uYXJ5IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiBhCisgICBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoZS5nLiBkaWN0aW9uYXJ5IGJlaW5nIFpfTlVMTCkgb3IgdGhlIHN0cmVhbSBzdGF0ZSBpcworICAgaW5jb25zaXN0ZW50LCBaX0RBVEFfRVJST1IgaWYgdGhlIGdpdmVuIGRpY3Rpb25hcnkgZG9lc24ndCBtYXRjaCB0aGUKKyAgIGV4cGVjdGVkIG9uZSAoaW5jb3JyZWN0IGFkbGVyMzIgdmFsdWUpLiBpbmZsYXRlU2V0RGljdGlvbmFyeSBkb2VzIG5vdAorICAgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgc3Vic2VxdWVudCBjYWxscyBvZgorICAgaW5mbGF0ZSgpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlU3luYyBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgU2tpcHMgaW52YWxpZCBjb21wcmVzc2VkIGRhdGEgdW50aWwgYSBmdWxsIGZsdXNoIHBvaW50IChzZWUgYWJvdmUgdGhlCisgIGRlc2NyaXB0aW9uIG9mIGRlZmxhdGUgd2l0aCBaX0ZVTExfRkxVU0gpIGNhbiBiZSBmb3VuZCwgb3IgdW50aWwgYWxsCisgIGF2YWlsYWJsZSBpbnB1dCBpcyBza2lwcGVkLiBObyBvdXRwdXQgaXMgcHJvdmlkZWQuCisKKyAgICBpbmZsYXRlU3luYyByZXR1cm5zIFpfT0sgaWYgYSBmdWxsIGZsdXNoIHBvaW50IGhhcyBiZWVuIGZvdW5kLCBaX0JVRl9FUlJPUgorICBpZiBubyBtb3JlIGlucHV0IHdhcyBwcm92aWRlZCwgWl9EQVRBX0VSUk9SIGlmIG5vIGZsdXNoIHBvaW50IGhhcyBiZWVuIGZvdW5kLAorICBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0cnVjdHVyZSB3YXMgaW5jb25zaXN0ZW50LiBJbiB0aGUgc3VjY2VzcworICBjYXNlLCB0aGUgYXBwbGljYXRpb24gbWF5IHNhdmUgdGhlIGN1cnJlbnQgY3VycmVudCB2YWx1ZSBvZiB0b3RhbF9pbiB3aGljaAorICBpbmRpY2F0ZXMgd2hlcmUgdmFsaWQgY29tcHJlc3NlZCBkYXRhIHdhcyBmb3VuZC4gSW4gdGhlIGVycm9yIGNhc2UsIHRoZQorICBhcHBsaWNhdGlvbiBtYXkgcmVwZWF0ZWRseSBjYWxsIGluZmxhdGVTeW5jLCBwcm92aWRpbmcgbW9yZSBpbnB1dCBlYWNoIHRpbWUsCisgIHVudGlsIHN1Y2Nlc3Mgb3IgZW5kIG9mIHRoZSBpbnB1dCBkYXRhLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQ29weSBPRigoel9zdHJlYW1wIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6X3N0cmVhbXAgc291cmNlKSk7CisvKgorICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBzdHJlYW0gYXMgYSBjb21wbGV0ZSBjb3B5IG9mIHRoZSBzb3VyY2Ugc3RyZWFtLgorCisgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIHJhbmRvbWx5IGFjY2Vzc2luZyBhIGxhcmdlIHN0cmVhbS4gIFRoZQorICAgZmlyc3QgcGFzcyB0aHJvdWdoIHRoZSBzdHJlYW0gY2FuIHBlcmlvZGljYWxseSByZWNvcmQgdGhlIGluZmxhdGUgc3RhdGUsCisgICBhbGxvd2luZyByZXN0YXJ0aW5nIGluZmxhdGUgYXQgdGhvc2UgcG9pbnRzIHdoZW4gcmFuZG9tbHkgYWNjZXNzaW5nIHRoZQorICAgc3RyZWFtLgorCisgICAgIGluZmxhdGVDb3B5IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90CisgICBlbm91Z2ggbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50CisgICAoc3VjaCBhcyB6YWxsb2MgYmVpbmcgWl9OVUxMKS4gbXNnIGlzIGxlZnQgdW5jaGFuZ2VkIGluIGJvdGggc291cmNlIGFuZAorICAgZGVzdGluYXRpb24uCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVSZXNldCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBpbmZsYXRlRW5kIGZvbGxvd2VkIGJ5IGluZmxhdGVJbml0LAorICAgYnV0IGRvZXMgbm90IGZyZWUgYW5kIHJlYWxsb2NhdGUgYWxsIHRoZSBpbnRlcm5hbCBkZWNvbXByZXNzaW9uIHN0YXRlLgorICAgVGhlIHN0cmVhbSB3aWxsIGtlZXAgYXR0cmlidXRlcyB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IGluZmxhdGVJbml0Mi4KKworICAgICAgaW5mbGF0ZVJlc2V0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoc3VjaCBhcyB6YWxsb2Mgb3Igc3RhdGUgYmVpbmcgWl9OVUxMKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVJlc2V0MiBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dCaXRzKSk7CisvKgorICAgICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBzYW1lIGFzIGluZmxhdGVSZXNldCwgYnV0IGl0IGFsc28gcGVybWl0cyBjaGFuZ2luZworICAgdGhlIHdyYXAgYW5kIHdpbmRvdyBzaXplIHJlcXVlc3RzLiAgVGhlIHdpbmRvd0JpdHMgcGFyYW1ldGVyIGlzCisgICBpbnRlcnByZXRlZCB0aGUgc2FtZSBhcyBpdCBpcyBmb3IgaW5mbGF0ZUluaXQyLgorCisgICAgICBpbmZsYXRlUmVzZXQyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoc3VjaCBhcyB6YWxsb2Mgb3Igc3RhdGUgYmVpbmcgWl9OVUxMKSwgb3IgaWYKKyAgIHRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlUHJpbWUgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkpOworLyoKKyAgICAgVGhpcyBmdW5jdGlvbiBpbnNlcnRzIGJpdHMgaW4gdGhlIGluZmxhdGUgaW5wdXQgc3RyZWFtLiAgVGhlIGludGVudCBpcworICB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdGFydCBpbmZsYXRpbmcgYXQgYSBiaXQgcG9zaXRpb24gaW4gdGhlCisgIG1pZGRsZSBvZiBhIGJ5dGUuICBUaGUgcHJvdmlkZWQgYml0cyB3aWxsIGJlIHVzZWQgYmVmb3JlIGFueSBieXRlcyBhcmUgdXNlZAorICBmcm9tIG5leHRfaW4uICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCByYXcgaW5mbGF0ZSwgYW5kCisgIHNob3VsZCBiZSB1c2VkIGJlZm9yZSB0aGUgZmlyc3QgaW5mbGF0ZSgpIGNhbGwgYWZ0ZXIgaW5mbGF0ZUluaXQyKCkgb3IKKyAgaW5mbGF0ZVJlc2V0KCkuICBiaXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE2LCBhbmQgdGhhdCBtYW55IG9mIHRoZQorICBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHZhbHVlIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gdGhlIGlucHV0LgorCisgICAgIElmIGJpdHMgaXMgbmVnYXRpdmUsIHRoZW4gdGhlIGlucHV0IHN0cmVhbSBiaXQgYnVmZmVyIGlzIGVtcHRpZWQuICBUaGVuCisgIGluZmxhdGVQcmltZSgpIGNhbiBiZSBjYWxsZWQgYWdhaW4gdG8gcHV0IGJpdHMgaW4gdGhlIGJ1ZmZlci4gIFRoaXMgaXMgdXNlZAorICB0byBjbGVhciBvdXQgYml0cyBsZWZ0b3ZlciBhZnRlciBmZWVkaW5nIGluZmxhdGUgYSBibG9jayBkZXNjcmlwdGlvbiBwcmlvcgorICB0byBmZWVkaW5nIGluZmxhdGUgY29kZXMuCisKKyAgICAgIGluZmxhdGVQcmltZSByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCisqLworCitaRVhURVJOIGxvbmcgWkVYUE9SVCBpbmZsYXRlTWFyayBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0d28gdmFsdWVzLCBvbmUgaW4gdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhlIHJldHVybgorICAgdmFsdWUsIGFuZCB0aGUgb3RoZXIgaW4gdGhlIHJlbWFpbmluZyB1cHBlciBiaXRzLCBvYnRhaW5lZCBieSBzaGlmdGluZyB0aGUKKyAgIHJldHVybiB2YWx1ZSBkb3duIDE2IGJpdHMuICBJZiB0aGUgdXBwZXIgdmFsdWUgaXMgLTEgYW5kIHRoZSBsb3dlciB2YWx1ZSBpcworICAgemVybywgdGhlbiBpbmZsYXRlKCkgaXMgY3VycmVudGx5IGRlY29kaW5nIGluZm9ybWF0aW9uIG91dHNpZGUgb2YgYSBibG9jay4KKyAgIElmIHRoZSB1cHBlciB2YWx1ZSBpcyAtMSBhbmQgdGhlIGxvd2VyIHZhbHVlIGlzIG5vbi16ZXJvLCB0aGVuIGluZmxhdGUgaXMgaW4KKyAgIHRoZSBtaWRkbGUgb2YgYSBzdG9yZWQgYmxvY2ssIHdpdGggdGhlIGxvd2VyIHZhbHVlIGVxdWFsaW5nIHRoZSBudW1iZXIgb2YKKyAgIGJ5dGVzIGZyb20gdGhlIGlucHV0IHJlbWFpbmluZyB0byBjb3B5LiAgSWYgdGhlIHVwcGVyIHZhbHVlIGlzIG5vdCAtMSwgdGhlbgorICAgaXQgaXMgdGhlIG51bWJlciBvZiBiaXRzIGJhY2sgZnJvbSB0aGUgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGlucHV0IG9mCisgICB0aGUgY29kZSAobGl0ZXJhbCBvciBsZW5ndGgvZGlzdGFuY2UgcGFpcikgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gIEluCisgICB0aGF0IGNhc2UgdGhlIGxvd2VyIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWxyZWFkeSBlbWl0dGVkIGZvciB0aGF0CisgICBjb2RlLgorCisgICAgIEEgY29kZSBpcyBiZWluZyBwcm9jZXNzZWQgaWYgaW5mbGF0ZSBpcyB3YWl0aW5nIGZvciBtb3JlIGlucHV0IHRvIGNvbXBsZXRlCisgICBkZWNvZGluZyBvZiB0aGUgY29kZSwgb3IgaWYgaXQgaGFzIGNvbXBsZXRlZCBkZWNvZGluZyBidXQgaXMgd2FpdGluZyBmb3IKKyAgIG1vcmUgb3V0cHV0IHNwYWNlIHRvIHdyaXRlIHRoZSBsaXRlcmFsIG9yIG1hdGNoIGRhdGEuCisKKyAgICAgIGluZmxhdGVNYXJrKCkgaXMgdXNlZCB0byBtYXJrIGxvY2F0aW9ucyBpbiB0aGUgaW5wdXQgZGF0YSBmb3IgcmFuZG9tCisgICBhY2Nlc3MsIHdoaWNoIG1heSBiZSBhdCBiaXQgcG9zaXRpb25zLCBhbmQgdG8gbm90ZSB0aG9zZSBjYXNlcyB3aGVyZSB0aGUKKyAgIG91dHB1dCBvZiBhIGNvZGUgbWF5IHNwYW4gYm91bmRhcmllcyBvZiByYW5kb20gYWNjZXNzIGJsb2Nrcy4gIFRoZSBjdXJyZW50CisgICBsb2NhdGlvbiBpbiB0aGUgaW5wdXQgc3RyZWFtIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gYXZhaWxfaW4gYW5kIGRhdGFfdHlwZQorICAgYXMgbm90ZWQgaW4gdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgWl9CTE9DSyBmbHVzaCBwYXJhbWV0ZXIgZm9yIGluZmxhdGUuCisKKyAgICAgIGluZmxhdGVNYXJrIHJldHVybnMgdGhlIHZhbHVlIG5vdGVkIGFib3ZlIG9yIC0xIDw8IDE2IGlmIHRoZSBwcm92aWRlZAorICAgc291cmNlIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlR2V0SGVhZGVyIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3pfaGVhZGVycCBoZWFkKSk7CisvKgorICAgICAgaW5mbGF0ZUdldEhlYWRlcigpIHJlcXVlc3RzIHRoYXQgZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gYmUgc3RvcmVkIGluIHRoZQorICAgcHJvdmlkZWQgZ3pfaGVhZGVyIHN0cnVjdHVyZS4gIGluZmxhdGVHZXRIZWFkZXIoKSBtYXkgYmUgY2FsbGVkIGFmdGVyCisgICBpbmZsYXRlSW5pdDIoKSBvciBpbmZsYXRlUmVzZXQoKSwgYW5kIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCBvZiBpbmZsYXRlKCkuCisgICBBcyBpbmZsYXRlKCkgcHJvY2Vzc2VzIHRoZSBnemlwIHN0cmVhbSwgaGVhZC0+ZG9uZSBpcyB6ZXJvIHVudGlsIHRoZSBoZWFkZXIKKyAgIGlzIGNvbXBsZXRlZCwgYXQgd2hpY2ggdGltZSBoZWFkLT5kb25lIGlzIHNldCB0byBvbmUuICBJZiBhIHpsaWIgc3RyZWFtIGlzCisgICBiZWluZyBkZWNvZGVkLCB0aGVuIGhlYWQtPmRvbmUgaXMgc2V0IHRvIC0xIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgd2lsbCBiZQorICAgbm8gZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gZm9ydGhjb21pbmcuICBOb3RlIHRoYXQgWl9CTE9DSyBvciBaX1RSRUVTIGNhbiBiZQorICAgdXNlZCB0byBmb3JjZSBpbmZsYXRlKCkgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyIGhlYWRlciBwcm9jZXNzaW5nIGlzCisgICBjb21wbGV0ZSBhbmQgYmVmb3JlIGFueSBhY3R1YWwgZGF0YSBpcyBkZWNvbXByZXNzZWQuCisKKyAgICAgIFRoZSB0ZXh0LCB0aW1lLCB4ZmxhZ3MsIGFuZCBvcyBmaWVsZHMgYXJlIGZpbGxlZCBpbiB3aXRoIHRoZSBnemlwIGhlYWRlcgorICAgY29udGVudHMuICBoY3JjIGlzIHNldCB0byB0cnVlIGlmIHRoZXJlIGlzIGEgaGVhZGVyIENSQy4gIChUaGUgaGVhZGVyIENSQworICAgd2FzIHZhbGlkIGlmIGRvbmUgaXMgc2V0IHRvIG9uZS4pICBJZiBleHRyYSBpcyBub3QgWl9OVUxMLCB0aGVuIGV4dHJhX21heAorICAgY29udGFpbnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIGV4dHJhLiAgT25jZSBkb25lIGlzIHRydWUsCisgICBleHRyYV9sZW4gY29udGFpbnMgdGhlIGFjdHVhbCBleHRyYSBmaWVsZCBsZW5ndGgsIGFuZCBleHRyYSBjb250YWlucyB0aGUKKyAgIGV4dHJhIGZpZWxkLCBvciB0aGF0IGZpZWxkIHRydW5jYXRlZCBpZiBleHRyYV9tYXggaXMgbGVzcyB0aGFuIGV4dHJhX2xlbi4KKyAgIElmIG5hbWUgaXMgbm90IFpfTlVMTCwgdGhlbiB1cCB0byBuYW1lX21heCBjaGFyYWN0ZXJzIGFyZSB3cml0dGVuIHRoZXJlLAorICAgdGVybWluYXRlZCB3aXRoIGEgemVybyB1bmxlc3MgdGhlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gbmFtZV9tYXguICBJZgorICAgY29tbWVudCBpcyBub3QgWl9OVUxMLCB0aGVuIHVwIHRvIGNvbW1fbWF4IGNoYXJhY3RlcnMgYXJlIHdyaXR0ZW4gdGhlcmUsCisgICB0ZXJtaW5hdGVkIHdpdGggYSB6ZXJvIHVubGVzcyB0aGUgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiBjb21tX21heC4gIFdoZW4KKyAgIGFueSBvZiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCBhcmUgbm90IFpfTlVMTCBhbmQgdGhlIHJlc3BlY3RpdmUgZmllbGQgaXMKKyAgIG5vdCBwcmVzZW50IGluIHRoZSBoZWFkZXIsIHRoZW4gdGhhdCBmaWVsZCBpcyBzZXQgdG8gWl9OVUxMIHRvIHNpZ25hbCBpdHMKKyAgIGFic2VuY2UuICBUaGlzIGFsbG93cyB0aGUgdXNlIG9mIGRlZmxhdGVTZXRIZWFkZXIoKSB3aXRoIHRoZSByZXR1cm5lZAorICAgc3RydWN0dXJlIHRvIGR1cGxpY2F0ZSB0aGUgaGVhZGVyLiAgSG93ZXZlciBpZiB0aG9zZSBmaWVsZHMgYXJlIHNldCB0bworICAgYWxsb2NhdGVkIG1lbW9yeSwgdGhlbiB0aGUgYXBwbGljYXRpb24gd2lsbCBuZWVkIHRvIHNhdmUgdGhvc2UgcG9pbnRlcnMKKyAgIGVsc2V3aGVyZSBzbyB0aGF0IHRoZXkgY2FuIGJlIGV2ZW50dWFsbHkgZnJlZWQuCisKKyAgICAgIElmIGluZmxhdGVHZXRIZWFkZXIgaXMgbm90IHVzZWQsIHRoZW4gdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBpcyBzaW1wbHkKKyAgIGRpc2NhcmRlZC4gIFRoZSBoZWFkZXIgaXMgYWx3YXlzIGNoZWNrZWQgZm9yIHZhbGlkaXR5LCBpbmNsdWRpbmcgdGhlIGhlYWRlcgorICAgQ1JDIGlmIHByZXNlbnQuICBpbmZsYXRlUmVzZXQoKSB3aWxsIHJlc2V0IHRoZSBwcm9jZXNzIHRvIGRpc2NhcmQgdGhlIGhlYWRlcgorICAgaW5mb3JtYXRpb24uICBUaGUgYXBwbGljYXRpb24gd291bGQgbmVlZCB0byBjYWxsIGluZmxhdGVHZXRIZWFkZXIoKSBhZ2FpbiB0bworICAgcmV0cmlldmUgdGhlIGhlYWRlciBmcm9tIHRoZSBuZXh0IGd6aXAgc3RyZWFtLgorCisgICAgICBpbmZsYXRlR2V0SGVhZGVyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KKyovCisKKy8qCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrSW5pdCBPRigoel9zdHJlYW1wIHN0cm0sIGludCB3aW5kb3dCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3cpKTsKKworICAgICBJbml0aWFsaXplIHRoZSBpbnRlcm5hbCBzdHJlYW0gc3RhdGUgZm9yIGRlY29tcHJlc3Npb24gdXNpbmcgaW5mbGF0ZUJhY2soKQorICAgY2FsbHMuICBUaGUgZmllbGRzIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBpbiBzdHJtIG11c3QgYmUgaW5pdGlhbGl6ZWQKKyAgIGJlZm9yZSB0aGUgY2FsbC4gIElmIHphbGxvYyBhbmQgemZyZWUgYXJlIFpfTlVMTCwgdGhlbiB0aGUgZGVmYXVsdCBsaWJyYXJ5LQorICAgZGVyaXZlZCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyBhcmUgdXNlZC4gIHdpbmRvd0JpdHMgaXMgdGhlIGJhc2UgdHdvCisgICBsb2dhcml0aG0gb2YgdGhlIHdpbmRvdyBzaXplLCBpbiB0aGUgcmFuZ2UgOC4uMTUuICB3aW5kb3cgaXMgYSBjYWxsZXIKKyAgIHN1cHBsaWVkIGJ1ZmZlciBvZiB0aGF0IHNpemUuICBFeGNlcHQgZm9yIHNwZWNpYWwgYXBwbGljYXRpb25zIHdoZXJlIGl0IGlzCisgICBhc3N1cmVkIHRoYXQgZGVmbGF0ZSB3YXMgdXNlZCB3aXRoIHNtYWxsIHdpbmRvdyBzaXplcywgd2luZG93Qml0cyBtdXN0IGJlIDE1CisgICBhbmQgYSAzMksgYnl0ZSB3aW5kb3cgbXVzdCBiZSBzdXBwbGllZCB0byBiZSBhYmxlIHRvIGRlY29tcHJlc3MgZ2VuZXJhbAorICAgZGVmbGF0ZSBzdHJlYW1zLgorCisgICAgIFNlZSBpbmZsYXRlQmFjaygpIGZvciB0aGUgdXNhZ2Ugb2YgdGhlc2Ugcm91dGluZXMuCisKKyAgICAgaW5mbGF0ZUJhY2tJbml0IHdpbGwgcmV0dXJuIFpfT0sgb24gc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgYW55IG9mCisgICB0aGUgcGFyYW1hdGVycyBhcmUgaW52YWxpZCwgWl9NRU1fRVJST1IgaWYgdGhlIGludGVybmFsIHN0YXRlIGNvdWxkIG5vdAorICAgYmUgYWxsb2NhdGVkLCBvciBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgZG9lcyBub3QKKyAgIG1hdGNoIHRoZSB2ZXJzaW9uIG9mIHRoZSBoZWFkZXIgZmlsZS4KKyovCisKK3R5cGVkZWYgdW5zaWduZWQgKCppbl9mdW5jKSBPRigodm9pZCBGQVIgKiwgdW5zaWduZWQgY2hhciBGQVIgKiBGQVIgKikpOwordHlwZWRlZiBpbnQgKCpvdXRfZnVuYykgT0YoKHZvaWQgRkFSICosIHVuc2lnbmVkIGNoYXIgRkFSICosIHVuc2lnbmVkKSk7CisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2sgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fZnVuYyBpbiwgdm9pZCBGQVIgKmluX2Rlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfZnVuYyBvdXQsIHZvaWQgRkFSICpvdXRfZGVzYykpOworLyoKKyAgICAgaW5mbGF0ZUJhY2soKSBkb2VzIGEgcmF3IGluZmxhdGUgd2l0aCBhIHNpbmdsZSBjYWxsIHVzaW5nIGEgY2FsbC1iYWNrCisgICBpbnRlcmZhY2UgZm9yIGlucHV0IGFuZCBvdXRwdXQuICBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gaW5mbGF0ZSgpIGZvcgorICAgZmlsZSBpL28gYXBwbGljYXRpb25zIGluIHRoYXQgaXQgYXZvaWRzIGNvcHlpbmcgYmV0d2VlbiB0aGUgb3V0cHV0IGFuZCB0aGUKKyAgIHNsaWRpbmcgd2luZG93IGJ5IHNpbXBseSBtYWtpbmcgdGhlIHdpbmRvdyBpdHNlbGYgdGhlIG91dHB1dCBidWZmZXIuICBUaGlzCisgICBmdW5jdGlvbiB0cnVzdHMgdGhlIGFwcGxpY2F0aW9uIHRvIG5vdCBjaGFuZ2UgdGhlIG91dHB1dCBidWZmZXIgcGFzc2VkIGJ5CisgICB0aGUgb3V0cHV0IGZ1bmN0aW9uLCBhdCBsZWFzdCB1bnRpbCBpbmZsYXRlQmFjaygpIHJldHVybnMuCisKKyAgICAgaW5mbGF0ZUJhY2tJbml0KCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QgdG8gYWxsb2NhdGUgdGhlIGludGVybmFsIHN0YXRlCisgICBhbmQgdG8gaW5pdGlhbGl6ZSB0aGUgc3RhdGUgd2l0aCB0aGUgdXNlci1wcm92aWRlZCB3aW5kb3cgYnVmZmVyLgorICAgaW5mbGF0ZUJhY2soKSBtYXkgdGhlbiBiZSB1c2VkIG11bHRpcGxlIHRpbWVzIHRvIGluZmxhdGUgYSBjb21wbGV0ZSwgcmF3CisgICBkZWZsYXRlIHN0cmVhbSB3aXRoIGVhY2ggY2FsbC4gIGluZmxhdGVCYWNrRW5kKCkgaXMgdGhlbiBjYWxsZWQgdG8gZnJlZQorICAgdGhlIGFsbG9jYXRlZCBzdGF0ZS4KKworICAgICBBIHJhdyBkZWZsYXRlIHN0cmVhbSBpcyBvbmUgd2l0aCBubyB6bGliIG9yIGd6aXAgaGVhZGVyIG9yIHRyYWlsZXIuCisgICBUaGlzIHJvdXRpbmUgd291bGQgbm9ybWFsbHkgYmUgdXNlZCBpbiBhIHV0aWxpdHkgdGhhdCByZWFkcyB6aXAgb3IgZ3ppcAorICAgZmlsZXMgYW5kIHdyaXRlcyBvdXQgdW5jb21wcmVzc2VkIGZpbGVzLiAgVGhlIHV0aWxpdHkgd291bGQgZGVjb2RlIHRoZQorICAgaGVhZGVyIGFuZCBwcm9jZXNzIHRoZSB0cmFpbGVyIG9uIGl0cyBvd24sIGhlbmNlIHRoaXMgcm91dGluZSBleHBlY3RzCisgICBvbmx5IHRoZSByYXcgZGVmbGF0ZSBzdHJlYW0gdG8gZGVjb21wcmVzcy4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlCisgICBub3JtYWwgYmVoYXZpb3Igb2YgaW5mbGF0ZSgpLCB3aGljaCBleHBlY3RzIGVpdGhlciBhIHpsaWIgb3IgZ3ppcCBoZWFkZXIgYW5kCisgICB0cmFpbGVyIGFyb3VuZCB0aGUgZGVmbGF0ZSBzdHJlYW0uCisKKyAgICAgaW5mbGF0ZUJhY2soKSB1c2VzIHR3byBzdWJyb3V0aW5lcyBzdXBwbGllZCBieSB0aGUgY2FsbGVyIHRoYXQgYXJlIHRoZW4KKyAgIGNhbGxlZCBieSBpbmZsYXRlQmFjaygpIGZvciBpbnB1dCBhbmQgb3V0cHV0LiAgaW5mbGF0ZUJhY2soKSBjYWxscyB0aG9zZQorICAgcm91dGluZXMgdW50aWwgaXQgcmVhZHMgYSBjb21wbGV0ZSBkZWZsYXRlIHN0cmVhbSBhbmQgd3JpdGVzIG91dCBhbGwgb2YgdGhlCisgICB1bmNvbXByZXNzZWQgZGF0YSwgb3IgdW50aWwgaXQgZW5jb3VudGVycyBhbiBlcnJvci4gIFRoZSBmdW5jdGlvbidzCisgICBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdHlwZXMgYXJlIGRlZmluZWQgYWJvdmUgaW4gdGhlIGluX2Z1bmMgYW5kIG91dF9mdW5jCisgICB0eXBlZGVmcy4gIGluZmxhdGVCYWNrKCkgd2lsbCBjYWxsIGluKGluX2Rlc2MsICZidWYpIHdoaWNoIHNob3VsZCByZXR1cm4gdGhlCisgICBudW1iZXIgb2YgYnl0ZXMgb2YgcHJvdmlkZWQgaW5wdXQsIGFuZCBhIHBvaW50ZXIgdG8gdGhhdCBpbnB1dCBpbiBidWYuICBJZgorICAgdGhlcmUgaXMgbm8gaW5wdXQgYXZhaWxhYmxlLCBpbigpIG11c3QgcmV0dXJuIHplcm8tLWJ1ZiBpcyBpZ25vcmVkIGluIHRoYXQKKyAgIGNhc2UtLWFuZCBpbmZsYXRlQmFjaygpIHdpbGwgcmV0dXJuIGEgYnVmZmVyIGVycm9yLiAgaW5mbGF0ZUJhY2soKSB3aWxsIGNhbGwKKyAgIG91dChvdXRfZGVzYywgYnVmLCBsZW4pIHRvIHdyaXRlIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBidWZbMC4ubGVuLTFdLiAgb3V0KCkKKyAgIHNob3VsZCByZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvciBub24temVybyBvbiBmYWlsdXJlLiAgSWYgb3V0KCkgcmV0dXJucworICAgbm9uLXplcm8sIGluZmxhdGVCYWNrKCkgd2lsbCByZXR1cm4gd2l0aCBhbiBlcnJvci4gIE5laXRoZXIgaW4oKSBub3Igb3V0KCkKKyAgIGFyZSBwZXJtaXR0ZWQgdG8gY2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aGUgd2luZG93IHByb3ZpZGVkIHRvCisgICBpbmZsYXRlQmFja0luaXQoKSwgd2hpY2ggaXMgYWxzbyB0aGUgYnVmZmVyIHRoYXQgb3V0KCkgdXNlcyB0byB3cml0ZSBmcm9tLgorICAgVGhlIGxlbmd0aCB3cml0dGVuIGJ5IG91dCgpIHdpbGwgYmUgYXQgbW9zdCB0aGUgd2luZG93IHNpemUuICBBbnkgbm9uLXplcm8KKyAgIGFtb3VudCBvZiBpbnB1dCBtYXkgYmUgcHJvdmlkZWQgYnkgaW4oKS4KKworICAgICBGb3IgY29udmVuaWVuY2UsIGluZmxhdGVCYWNrKCkgY2FuIGJlIHByb3ZpZGVkIGlucHV0IG9uIHRoZSBmaXJzdCBjYWxsIGJ5CisgICBzZXR0aW5nIHN0cm0tPm5leHRfaW4gYW5kIHN0cm0tPmF2YWlsX2luLiAgSWYgdGhhdCBpbnB1dCBpcyBleGhhdXN0ZWQsIHRoZW4KKyAgIGluKCkgd2lsbCBiZSBjYWxsZWQuICBUaGVyZWZvcmUgc3RybS0+bmV4dF9pbiBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZQorICAgY2FsbGluZyBpbmZsYXRlQmFjaygpLiAgSWYgc3RybS0+bmV4dF9pbiBpcyBaX05VTEwsIHRoZW4gaW4oKSB3aWxsIGJlIGNhbGxlZAorICAgaW1tZWRpYXRlbHkgZm9yIGlucHV0LiAgSWYgc3RybS0+bmV4dF9pbiBpcyBub3QgWl9OVUxMLCB0aGVuIHN0cm0tPmF2YWlsX2luCisgICBtdXN0IGFsc28gYmUgaW5pdGlhbGl6ZWQsIGFuZCB0aGVuIGlmIHN0cm0tPmF2YWlsX2luIGlzIG5vdCB6ZXJvLCBpbnB1dCB3aWxsCisgICBpbml0aWFsbHkgYmUgdGFrZW4gZnJvbSBzdHJtLT5uZXh0X2luWzAgLi4gc3RybS0+YXZhaWxfaW4gLSAxXS4KKworICAgICBUaGUgaW5fZGVzYyBhbmQgb3V0X2Rlc2MgcGFyYW1ldGVycyBvZiBpbmZsYXRlQmFjaygpIGlzIHBhc3NlZCBhcyB0aGUKKyAgIGZpcnN0IHBhcmFtZXRlciBvZiBpbigpIGFuZCBvdXQoKSByZXNwZWN0aXZlbHkgd2hlbiB0aGV5IGFyZSBjYWxsZWQuICBUaGVzZQorICAgZGVzY3JpcHRvcnMgY2FuIGJlIG9wdGlvbmFsbHkgdXNlZCB0byBwYXNzIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBjYWxsZXItCisgICBzdXBwbGllZCBpbigpIGFuZCBvdXQoKSBmdW5jdGlvbnMgbmVlZCB0byBkbyB0aGVpciBqb2IuCisKKyAgICAgT24gcmV0dXJuLCBpbmZsYXRlQmFjaygpIHdpbGwgc2V0IHN0cm0tPm5leHRfaW4gYW5kIHN0cm0tPmF2YWlsX2luIHRvCisgICBwYXNzIGJhY2sgYW55IHVudXNlZCBpbnB1dCB0aGF0IHdhcyBwcm92aWRlZCBieSB0aGUgbGFzdCBpbigpIGNhbGwuICBUaGUKKyAgIHJldHVybiB2YWx1ZXMgb2YgaW5mbGF0ZUJhY2soKSBjYW4gYmUgWl9TVFJFQU1fRU5EIG9uIHN1Y2Nlc3MsIFpfQlVGX0VSUk9SCisgICBpZiBpbigpIG9yIG91dCgpIHJldHVybmVkIGFuIGVycm9yLCBaX0RBVEFfRVJST1IgaWYgdGhlcmUgd2FzIGEgZm9ybWF0CisgICBlcnJvciBpbiB0aGUgZGVmbGF0ZSBzdHJlYW0gKGluIHdoaWNoIGNhc2Ugc3RybS0+bXNnIGlzIHNldCB0byBpbmRpY2F0ZSB0aGUKKyAgIG5hdHVyZSBvZiB0aGUgZXJyb3IpLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHdhcyBub3QgcHJvcGVybHkKKyAgIGluaXRpYWxpemVkLiAgSW4gdGhlIGNhc2Ugb2YgWl9CVUZfRVJST1IsIGFuIGlucHV0IG9yIG91dHB1dCBlcnJvciBjYW4gYmUKKyAgIGRpc3Rpbmd1aXNoZWQgdXNpbmcgc3RybS0+bmV4dF9pbiB3aGljaCB3aWxsIGJlIFpfTlVMTCBvbmx5IGlmIGluKCkgcmV0dXJuZWQKKyAgIGFuIGVycm9yLiAgSWYgc3RybS0+bmV4dF9pbiBpcyBub3QgWl9OVUxMLCB0aGVuIHRoZSBaX0JVRl9FUlJPUiB3YXMgZHVlIHRvCisgICBvdXQoKSByZXR1cm5pbmcgbm9uLXplcm8uICAoaW4oKSB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgYmVmb3JlIG91dCgpLCBzbworICAgc3RybS0+bmV4dF9pbiBpcyBhc3N1cmVkIHRvIGJlIGRlZmluZWQgaWYgb3V0KCkgcmV0dXJucyBub24temVyby4pICBOb3RlCisgICB0aGF0IGluZmxhdGVCYWNrKCkgY2Fubm90IHJldHVybiBaX09LLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0VuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIEFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IGluZmxhdGVCYWNrSW5pdCgpIGlzIGZyZWVkLgorCisgICAgIGluZmxhdGVCYWNrRW5kKCkgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0KKyAgIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCisqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgemxpYkNvbXBpbGVGbGFncyBPRigodm9pZCkpOworLyogUmV0dXJuIGZsYWdzIGluZGljYXRpbmcgY29tcGlsZS10aW1lIG9wdGlvbnMuCisKKyAgICBUeXBlIHNpemVzLCB0d28gYml0cyBlYWNoLCAwMCA9IDE2IGJpdHMsIDAxID0gMzIsIDEwID0gNjQsIDExID0gb3RoZXI6CisgICAgIDEuMDogc2l6ZSBvZiB1SW50CisgICAgIDMuMjogc2l6ZSBvZiB1TG9uZworICAgICA1LjQ6IHNpemUgb2Ygdm9pZHBmIChwb2ludGVyKQorICAgICA3LjY6IHNpemUgb2Ygel9vZmZfdAorCisgICAgQ29tcGlsZXIsIGFzc2VtYmxlciwgYW5kIGRlYnVnIG9wdGlvbnM6CisgICAgIDg6IERFQlVHCisgICAgIDk6IEFTTVYgb3IgQVNNSU5GIC0tIHVzZSBBU00gY29kZQorICAgICAxMDogWkxJQl9XSU5BUEkgLS0gZXhwb3J0ZWQgZnVuY3Rpb25zIHVzZSB0aGUgV0lOQVBJIGNhbGxpbmcgY29udmVudGlvbgorICAgICAxMTogMCAocmVzZXJ2ZWQpCisKKyAgICBPbmUtdGltZSB0YWJsZSBidWlsZGluZyAoc21hbGxlciBjb2RlLCBidXQgbm90IHRocmVhZC1zYWZlIGlmIHRydWUpOgorICAgICAxMjogQlVJTERGSVhFRCAtLSBidWlsZCBzdGF0aWMgYmxvY2sgZGVjb2RpbmcgdGFibGVzIHdoZW4gbmVlZGVkCisgICAgIDEzOiBEWU5BTUlDX0NSQ19UQUJMRSAtLSBidWlsZCBDUkMgY2FsY3VsYXRpb24gdGFibGVzIHdoZW4gbmVlZGVkCisgICAgIDE0LDE1OiAwIChyZXNlcnZlZCkKKworICAgIExpYnJhcnkgY29udGVudCAoaW5kaWNhdGVzIG1pc3NpbmcgZnVuY3Rpb25hbGl0eSk6CisgICAgIDE2OiBOT19HWkNPTVBSRVNTIC0tIGd6KiBmdW5jdGlvbnMgY2Fubm90IGNvbXByZXNzICh0byBhdm9pZCBsaW5raW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmxhdGUgY29kZSB3aGVuIG5vdCBuZWVkZWQpCisgICAgIDE3OiBOT19HWklQIC0tIGRlZmxhdGUgY2FuJ3Qgd3JpdGUgZ3ppcCBzdHJlYW1zLCBhbmQgaW5mbGF0ZSBjYW4ndCBkZXRlY3QKKyAgICAgICAgICAgICAgICAgICAgYW5kIGRlY29kZSBnemlwIHN0cmVhbXMgKHRvIGF2b2lkIGxpbmtpbmcgY3JjIGNvZGUpCisgICAgIDE4LTE5OiAwIChyZXNlcnZlZCkKKworICAgIE9wZXJhdGlvbiB2YXJpYXRpb25zIChjaGFuZ2VzIGluIGxpYnJhcnkgZnVuY3Rpb25hbGl0eSk6CisgICAgIDIwOiBQS1pJUF9CVUdfV09SS0FST1VORCAtLSBzbGlnaHRseSBtb3JlIHBlcm1pc3NpdmUgaW5mbGF0ZQorICAgICAyMTogRkFTVEVTVCAtLSBkZWZsYXRlIGFsZ29yaXRobSB3aXRoIG9ubHkgb25lLCBsb3dlc3QgY29tcHJlc3Npb24gbGV2ZWwKKyAgICAgMjIsMjM6IDAgKHJlc2VydmVkKQorCisgICAgVGhlIHNwcmludGYgdmFyaWFudCB1c2VkIGJ5IGd6cHJpbnRmICh6ZXJvIGlzIGJlc3QpOgorICAgICAyNDogMCA9IHZzKiwgMSA9IHMqIC0tIDEgbWVhbnMgbGltaXRlZCB0byAyMCBhcmd1bWVudHMgYWZ0ZXIgdGhlIGZvcm1hdAorICAgICAyNTogMCA9ICpucHJpbnRmLCAxID0gKnByaW50ZiAtLSAxIG1lYW5zIGd6cHJpbnRmKCkgbm90IHNlY3VyZSEKKyAgICAgMjY6IDAgPSByZXR1cm5zIHZhbHVlLCAxID0gdm9pZCAtLSAxIG1lYW5zIGluZmVycmVkIHN0cmluZyBsZW5ndGggcmV0dXJuZWQKKworICAgIFJlbWFpbmRlcjoKKyAgICAgMjctMzE6IDAgKHJlc2VydmVkKQorICovCisKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KKworLyoKKyAgICAgVGhlIGZvbGxvd2luZyB1dGlsaXR5IGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mIHRoZQorICAgYmFzaWMgc3RyZWFtLW9yaWVudGVkIGZ1bmN0aW9ucy4gVG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZSwgc29tZQorICAgZGVmYXVsdCBvcHRpb25zIGFyZSBhc3N1bWVkIChjb21wcmVzc2lvbiBsZXZlbCBhbmQgbWVtb3J5IHVzYWdlLAorICAgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zKS4gVGhlIHNvdXJjZSBjb2RlIG9mIHRoZXNlCisgICB1dGlsaXR5IGZ1bmN0aW9ucyBjYW4gZWFzaWx5IGJlIG1vZGlmaWVkIGlmIHlvdSBuZWVkIHNwZWNpYWwgb3B0aW9ucy4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgY29tcHJlc3MgT0YoKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbikpOworLyoKKyAgICAgQ29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKKyAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwKKyAgIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCB0aGUgdmFsdWUgcmV0dXJuZWQKKyAgIGJ5IGNvbXByZXNzQm91bmQoc291cmNlTGVuKS4gVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUKKyAgIGNvbXByZXNzZWQgYnVmZmVyLgorICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbXByZXNzIGEgd2hvbGUgZmlsZSBhdCBvbmNlIGlmIHRoZQorICAgaW5wdXQgZmlsZSBpcyBtbWFwJ2VkLgorICAgICBjb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0CisgICBidWZmZXIuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGNvbXByZXNzMiBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpKTsKKy8qCisgICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiBUaGUgbGV2ZWwKKyAgIHBhcmFtZXRlciBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiBkZWZsYXRlSW5pdC4gIHNvdXJjZUxlbiBpcyB0aGUgYnl0ZQorICAgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZQorICAgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICAgY29tcHJlc3NCb3VuZChzb3VyY2VMZW4pLiBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZQorICAgY29tcHJlc3NlZCBidWZmZXIuCisKKyAgICAgY29tcHJlc3MyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyLAorICAgWl9TVFJFQU1fRVJST1IgaWYgdGhlIGxldmVsIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorKi8KKworWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNvbXByZXNzQm91bmQgT0YoKHVMb25nIHNvdXJjZUxlbikpOworLyoKKyAgICAgY29tcHJlc3NCb3VuZCgpIHJldHVybnMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGNvbXByZXNzZWQgc2l6ZSBhZnRlcgorICAgY29tcHJlc3MoKSBvciBjb21wcmVzczIoKSBvbiBzb3VyY2VMZW4gYnl0ZXMuICBJdCB3b3VsZCBiZSB1c2VkIGJlZm9yZQorICAgYSBjb21wcmVzcygpIG9yIGNvbXByZXNzMigpIGNhbGwgdG8gYWxsb2NhdGUgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgdW5jb21wcmVzcyBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pKTsKKy8qCisgICAgIERlY29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKKyAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwKKyAgIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUKKyAgIGVudGlyZSB1bmNvbXByZXNzZWQgZGF0YS4gKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtdXN0IGhhdmUKKyAgIGJlZW4gc2F2ZWQgcHJldmlvdXNseSBieSB0aGUgY29tcHJlc3NvciBhbmQgdHJhbnNtaXR0ZWQgdG8gdGhlIGRlY29tcHJlc3NvcgorICAgYnkgc29tZSBtZWNoYW5pc20gb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBjb21wcmVzc2lvbiBsaWJyYXJ5LikKKyAgIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBidWZmZXIuCisgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZGVjb21wcmVzcyBhIHdob2xlIGZpbGUgYXQgb25jZSBpZiB0aGUKKyAgIGlucHV0IGZpbGUgaXMgbW1hcCdlZC4KKworICAgICB1bmNvbXByZXNzIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90CisgICBlbm91Z2ggbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQKKyAgIGJ1ZmZlciwgb3IgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcyBjb3JydXB0ZWQgb3IgaW5jb21wbGV0ZS4KKyovCisKKwordHlwZWRlZiB2b2lkcCBnekZpbGU7CisKKy8qCitaRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6b3BlbiAgT0YoKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1vZGUpKTsKKworICAgICBPcGVucyBhIGd6aXAgKC5neikgZmlsZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLiBUaGUgbW9kZSBwYXJhbWV0ZXIKKyAgIGlzIGFzIGluIGZvcGVuICgicmIiIG9yICJ3YiIpIGJ1dCBjYW4gYWxzbyBpbmNsdWRlIGEgY29tcHJlc3Npb24gbGV2ZWwKKyAgICgid2I5Iikgb3IgYSBzdHJhdGVneTogJ2YnIGZvciBmaWx0ZXJlZCBkYXRhIGFzIGluICJ3YjZmIiwgJ2gnIGZvcgorICAgSHVmZm1hbiBvbmx5IGNvbXByZXNzaW9uIGFzIGluICJ3YjFoIiwgb3IgJ1InIGZvciBydW4tbGVuZ3RoIGVuY29kaW5nCisgICBhcyBpbiAid2IxUiIuIChTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIGRlZmxhdGVJbml0MiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICAgYWJvdXQgdGhlIHN0cmF0ZWd5IHBhcmFtZXRlci4pCisKKyAgICAgZ3pvcGVuIGNhbiBiZSB1c2VkIHRvIHJlYWQgYSBmaWxlIHdoaWNoIGlzIG5vdCBpbiBnemlwIGZvcm1hdDsgaW4gdGhpcworICAgY2FzZSBnenJlYWQgd2lsbCBkaXJlY3RseSByZWFkIGZyb20gdGhlIGZpbGUgd2l0aG91dCBkZWNvbXByZXNzaW9uLgorCisgICAgIGd6b3BlbiByZXR1cm5zIE5VTEwgaWYgdGhlIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZCBvciBpZiB0aGVyZSB3YXMKKyAgIGluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZTsgZXJybm8KKyAgIGNhbiBiZSBjaGVja2VkIHRvIGRpc3Rpbmd1aXNoIHRoZSB0d28gY2FzZXMgKGlmIGVycm5vIGlzIHplcm8sIHRoZQorICAgemxpYiBlcnJvciBpcyBaX01FTV9FUlJPUikuICAqLworCitaRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6ZG9wZW4gIE9GKChpbnQgZmQsIGNvbnN0IGNoYXIgKm1vZGUpKTsKKy8qCisgICAgIGd6ZG9wZW4oKSBhc3NvY2lhdGVzIGEgZ3pGaWxlIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvciBmZC4gIEZpbGUKKyAgIGRlc2NyaXB0b3JzIGFyZSBvYnRhaW5lZCBmcm9tIGNhbGxzIGxpa2Ugb3BlbiwgZHVwLCBjcmVhdCwgcGlwZSBvcgorICAgZmlsZW5vIChpbiB0aGUgZmlsZSBoYXMgYmVlbiBwcmV2aW91c2x5IG9wZW5lZCB3aXRoIGZvcGVuKS4KKyAgIFRoZSBtb2RlIHBhcmFtZXRlciBpcyBhcyBpbiBnem9wZW4uCisgICAgIFRoZSBuZXh0IGNhbGwgb2YgZ3pjbG9zZSBvbiB0aGUgcmV0dXJuZWQgZ3pGaWxlIHdpbGwgYWxzbyBjbG9zZSB0aGUKKyAgIGZpbGUgZGVzY3JpcHRvciBmZCwganVzdCBsaWtlIGZjbG9zZShmZG9wZW4oZmQpLCBtb2RlKSBjbG9zZXMgdGhlIGZpbGUKKyAgIGRlc2NyaXB0b3IgZmQuIElmIHlvdSB3YW50IHRvIGtlZXAgZmQgb3BlbiwgdXNlIGd6ZG9wZW4oZHVwKGZkKSwgbW9kZSkuCisgICAgIGd6ZG9wZW4gcmV0dXJucyBOVUxMIGlmIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlCisgICB0aGUgKGRlKWNvbXByZXNzaW9uIHN0YXRlLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnenNldHBhcmFtcyBPRigoZ3pGaWxlIGZpbGUsIGludCBsZXZlbCwgaW50IHN0cmF0ZWd5KSk7CisvKgorICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIG9yIHN0cmF0ZWd5LiBTZWUgdGhlIGRlc2NyaXB0aW9uCisgICBvZiBkZWZsYXRlSW5pdDIgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMuCisgICAgIGd6c2V0cGFyYW1zIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgZmlsZSB3YXMgbm90CisgICBvcGVuZWQgZm9yIHdyaXRpbmcuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6cmVhZCAgT0YoKGd6RmlsZSBmaWxlLCB2b2lkcCBidWYsIHVuc2lnbmVkIGxlbikpOworLyoKKyAgICAgUmVhZHMgdGhlIGdpdmVuIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLgorICAgSWYgdGhlIGlucHV0IGZpbGUgd2FzIG5vdCBpbiBnemlwIGZvcm1hdCwgZ3pyZWFkIGNvcGllcyB0aGUgZ2l2ZW4gbnVtYmVyCisgICBvZiBieXRlcyBpbnRvIHRoZSBidWZmZXIuCisgICAgIGd6cmVhZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHJlYWQgKDAgZm9yCisgICBlbmQgb2YgZmlsZSwgLTEgZm9yIGVycm9yKS4gKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnendyaXRlIE9GKChnekZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZHBjIGJ1ZiwgdW5zaWduZWQgbGVuKSk7CisvKgorICAgICBXcml0ZXMgdGhlIGdpdmVuIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLgorICAgZ3p3cml0ZSByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4KKyAgICgwIGluIGNhc2Ugb2YgZXJyb3IpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVFZBICAgZ3pwcmludGYgT0YoKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpOworLyoKKyAgICAgQ29udmVydHMsIGZvcm1hdHMsIGFuZCB3cml0ZXMgdGhlIGFyZ3MgdG8gdGhlIGNvbXByZXNzZWQgZmlsZSB1bmRlcgorICAgY29udHJvbCBvZiB0aGUgZm9ybWF0IHN0cmluZywgYXMgaW4gZnByaW50Zi4gZ3pwcmludGYgcmV0dXJucyB0aGUgbnVtYmVyIG9mCisgICB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiAoMCBpbiBjYXNlIG9mIGVycm9yKS4gIFRoZSBudW1iZXIgb2YKKyAgIHVuY29tcHJlc3NlZCBieXRlcyB3cml0dGVuIGlzIGxpbWl0ZWQgdG8gNDA5NS4gVGhlIGNhbGxlciBzaG91bGQgYXNzdXJlIHRoYXQKKyAgIHRoaXMgbGltaXQgaXMgbm90IGV4Y2VlZGVkLiBJZiBpdCBpcyBleGNlZWRlZCwgdGhlbiBnenByaW50ZigpIHdpbGwgcmV0dXJuCisgICByZXR1cm4gYW4gZXJyb3IgKDApIHdpdGggbm90aGluZyB3cml0dGVuLiBJbiB0aGlzIGNhc2UsIHRoZXJlIG1heSBhbHNvIGJlIGEKKyAgIGJ1ZmZlciBvdmVyZmxvdyB3aXRoIHVucHJlZGljdGFibGUgY29uc2VxdWVuY2VzLCB3aGljaCBpcyBwb3NzaWJsZSBvbmx5IGlmCisgICB6bGliIHdhcyBjb21waWxlZCB3aXRoIHRoZSBpbnNlY3VyZSBmdW5jdGlvbnMgc3ByaW50ZigpIG9yIHZzcHJpbnRmKCkKKyAgIGJlY2F1c2UgdGhlIHNlY3VyZSBzbnByaW50ZigpIG9yIHZzbnByaW50ZigpIGZ1bmN0aW9ucyB3ZXJlIG5vdCBhdmFpbGFibGUuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6cHV0cyBPRigoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKnMpKTsKKy8qCisgICAgICBXcml0ZXMgdGhlIGdpdmVuIG51bGwtdGVybWluYXRlZCBzdHJpbmcgdG8gdGhlIGNvbXByZXNzZWQgZmlsZSwgZXhjbHVkaW5nCisgICB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuCisgICAgICBnenB1dHMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KKyovCisKK1pFWFRFUk4gY2hhciAqIFpFWFBPUlQgZ3pnZXRzIE9GKChnekZpbGUgZmlsZSwgY2hhciAqYnVmLCBpbnQgbGVuKSk7CisvKgorICAgICAgUmVhZHMgYnl0ZXMgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlIHVudGlsIGxlbi0xIGNoYXJhY3RlcnMgYXJlIHJlYWQsIG9yCisgICBhIG5ld2xpbmUgY2hhcmFjdGVyIGlzIHJlYWQgYW5kIHRyYW5zZmVycmVkIHRvIGJ1Ziwgb3IgYW4gZW5kLW9mLWZpbGUKKyAgIGNvbmRpdGlvbiBpcyBlbmNvdW50ZXJlZC4gIFRoZSBzdHJpbmcgaXMgdGhlbiB0ZXJtaW5hdGVkIHdpdGggYSBudWxsCisgICBjaGFyYWN0ZXIuCisgICAgICBnemdldHMgcmV0dXJucyBidWYsIG9yIFpfTlVMTCBpbiBjYXNlIG9mIGVycm9yLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnenB1dGMgT0YoKGd6RmlsZSBmaWxlLCBpbnQgYykpOworLyoKKyAgICAgIFdyaXRlcyBjLCBjb252ZXJ0ZWQgdG8gYW4gdW5zaWduZWQgY2hhciwgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLgorICAgZ3pwdXRjIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6Z2V0YyBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgICBSZWFkcyBvbmUgYnl0ZSBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuIGd6Z2V0YyByZXR1cm5zIHRoaXMgYnl0ZQorICAgb3IgLTEgaW4gY2FzZSBvZiBlbmQgb2YgZmlsZSBvciBlcnJvci4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3p1bmdldGMgT0YoKGludCBjLCBnekZpbGUgZmlsZSkpOworLyoKKyAgICAgIFB1c2ggb25lIGNoYXJhY3RlciBiYWNrIG9udG8gdGhlIHN0cmVhbSB0byBiZSByZWFkIGFnYWluIGxhdGVyLgorICAgT25seSBvbmUgY2hhcmFjdGVyIG9mIHB1c2gtYmFjayBpcyBhbGxvd2VkLiAgZ3p1bmdldGMoKSByZXR1cm5zIHRoZQorICAgY2hhcmFjdGVyIHB1c2hlZCwgb3IgLTEgb24gZmFpbHVyZS4gIGd6dW5nZXRjKCkgd2lsbCBmYWlsIGlmIGEKKyAgIGNoYXJhY3RlciBoYXMgYmVlbiBwdXNoZWQgYnV0IG5vdCByZWFkIHlldCwgb3IgaWYgYyBpcyAtMS4gVGhlIHB1c2hlZAorICAgY2hhcmFjdGVyIHdpbGwgYmUgZGlzY2FyZGVkIGlmIHRoZSBzdHJlYW0gaXMgcmVwb3NpdGlvbmVkIHdpdGggZ3pzZWVrKCkKKyAgIG9yIGd6cmV3aW5kKCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6Zmx1c2ggT0YoKGd6RmlsZSBmaWxlLCBpbnQgZmx1c2gpKTsKKy8qCisgICAgIEZsdXNoZXMgYWxsIHBlbmRpbmcgb3V0cHV0IGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4gVGhlIHBhcmFtZXRlcgorICAgZmx1c2ggaXMgYXMgaW4gdGhlIGRlZmxhdGUoKSBmdW5jdGlvbi4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgemxpYgorICAgZXJyb3IgbnVtYmVyIChzZWUgZnVuY3Rpb24gZ3plcnJvciBiZWxvdykuIGd6Zmx1c2ggcmV0dXJucyBaX09LIGlmCisgICB0aGUgZmx1c2ggcGFyYW1ldGVyIGlzIFpfRklOSVNIIGFuZCBhbGwgb3V0cHV0IGNvdWxkIGJlIGZsdXNoZWQuCisgICAgIGd6Zmx1c2ggc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gc3RyaWN0bHkgbmVjZXNzYXJ5IGJlY2F1c2UgaXQgY2FuCisgICBkZWdyYWRlIGNvbXByZXNzaW9uLgorKi8KKworLyoKK1pFWFRFUk4gel9vZmZfdCBaRVhQT1JUICAgIGd6c2VlayBPRigoZ3pGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSk7CisKKyAgICAgIFNldHMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUKKyAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhlIG9mZnNldCByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLiBUaGUgd2hlbmNlIHBhcmFtZXRlciBpcyBkZWZpbmVkIGFzIGluIGxzZWVrKDIpOworICAgdGhlIHZhbHVlIFNFRUtfRU5EIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3IgcmVhZGluZywgdGhpcyBmdW5jdGlvbiBpcyBlbXVsYXRlZCBidXQgY2FuIGJlCisgICBleHRyZW1lbHkgc2xvdy4gSWYgdGhlIGZpbGUgaXMgb3BlbmVkIGZvciB3cml0aW5nLCBvbmx5IGZvcndhcmQgc2Vla3MgYXJlCisgICBzdXBwb3J0ZWQ7IGd6c2VlayB0aGVuIGNvbXByZXNzZXMgYSBzZXF1ZW5jZSBvZiB6ZXJvZXMgdXAgdG8gdGhlIG5ldworICAgc3RhcnRpbmcgcG9zaXRpb24uCisKKyAgICAgIGd6c2VlayByZXR1cm5zIHRoZSByZXN1bHRpbmcgb2Zmc2V0IGxvY2F0aW9uIGFzIG1lYXN1cmVkIGluIGJ5dGVzIGZyb20KKyAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IsIGluCisgICBwYXJ0aWN1bGFyIGlmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZyBhbmQgdGhlIG5ldyBzdGFydGluZyBwb3NpdGlvbgorICAgd291bGQgYmUgYmVmb3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnenJld2luZCBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFJld2luZHMgdGhlIGdpdmVuIGZpbGUuIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgZm9yIHJlYWRpbmcuCisKKyAgIGd6cmV3aW5kKGZpbGUpIGlzIGVxdWl2YWxlbnQgdG8gKGludClnenNlZWsoZmlsZSwgMEwsIFNFRUtfU0VUKQorKi8KKworLyoKK1pFWFRFUk4gel9vZmZfdCBaRVhQT1JUICAgIGd6dGVsbCBPRigoZ3pGaWxlIGZpbGUpKTsKKworICAgICBSZXR1cm5zIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlIG5leHQgZ3pyZWFkIG9yIGd6d3JpdGUgb24gdGhlCisgICBnaXZlbiBjb21wcmVzc2VkIGZpbGUuIFRoaXMgcG9zaXRpb24gcmVwcmVzZW50cyBhIG51bWJlciBvZiBieXRlcyBpbiB0aGUKKyAgIHVuY29tcHJlc3NlZCBkYXRhIHN0cmVhbS4KKworICAgZ3p0ZWxsKGZpbGUpIGlzIGVxdWl2YWxlbnQgdG8gZ3pzZWVrKGZpbGUsIDBMLCBTRUVLX0NVUikKKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3plb2YgT0YoKGd6RmlsZSBmaWxlKSk7CisvKgorICAgICBSZXR1cm5zIDEgd2hlbiBFT0YgaGFzIHByZXZpb3VzbHkgYmVlbiBkZXRlY3RlZCByZWFkaW5nIHRoZSBnaXZlbgorICAgaW5wdXQgc3RyZWFtLCBvdGhlcndpc2UgemVyby4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3pkaXJlY3QgT0YoKGd6RmlsZSBmaWxlKSk7CisvKgorICAgICBSZXR1cm5zIDEgaWYgZmlsZSBpcyBiZWluZyByZWFkIGRpcmVjdGx5IHdpdGhvdXQgZGVjb21wcmVzc2lvbiwgb3RoZXJ3aXNlCisgICB6ZXJvLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnemNsb3NlIE9GKChnekZpbGUgZmlsZSkpOworLyoKKyAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaWYgbmVjZXNzYXJ5LCBjbG9zZXMgdGhlIGNvbXByZXNzZWQgZmlsZQorICAgYW5kIGRlYWxsb2NhdGVzIGFsbCB0aGUgKGRlKWNvbXByZXNzaW9uIHN0YXRlLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB6bGliCisgICBlcnJvciBudW1iZXIuICBOb3RlIHRoYXQgb25jZSBmaWxlIGlzIGNsb3NlLCB5b3UgY2Fubm90IGNhbGwgZ3plcnJvciB3aXRoCisgICBmaWxlLCBzaW5jZSBpdHMgc3RydWN0dXJlcyBoYXZlIGJlZW4gZGVhbGxvY2F0ZWQuCisqLworCitaRVhURVJOIGNvbnN0IGNoYXIgKiBaRVhQT1JUIGd6ZXJyb3IgT0YoKGd6RmlsZSBmaWxlLCBpbnQgKmVycm51bSkpOworLyoKKyAgICAgUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIGxhc3QgZXJyb3Igd2hpY2ggb2NjdXJyZWQgb24gdGhlCisgICBnaXZlbiBjb21wcmVzc2VkIGZpbGUuIGVycm51bSBpcyBzZXQgdG8gemxpYiBlcnJvciBudW1iZXIuIElmIGFuCisgICBlcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIG5vdCBpbiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSwKKyAgIGVycm51bSBpcyBzZXQgdG8gWl9FUlJOTyBhbmQgdGhlIGFwcGxpY2F0aW9uIG1heSBjb25zdWx0IGVycm5vCisgICB0byBnZXQgdGhlIGV4YWN0IGVycm9yIGNvZGUuCisKKyAgIFRoZSBhcHBsaWNhdGlvbiBtdXN0IG5vdCBtb2RpZnkgdGhlIHJldHVybmVkIHN0cmluZyBhbmQgZnV0dXJlIGNhbGxzIHRvCisgICB0aGlzIGZ1bmN0aW9uIG1heSBpbnZhbGlkYXRlIHRoZSByZXR1cm5lZCBzdHJpbmcuCisqLworCitaRVhURVJOIHZvaWQgWkVYUE9SVCBnemNsZWFyZXJyIE9GKChnekZpbGUgZmlsZSkpOworLyoKKyAgICAgQ2xlYXJzIHRoZSBlcnJvciBhbmQgZW5kLW9mLWZpbGUgZmxhZ3MgZm9yIGZpbGUuIFRoaXMgaXMgYW5hbG9nb3VzIHRvIHRoZQorICAgY2xlYXJlcnIoKSBmdW5jdGlvbiBpbiBzdGRpby4gVGhpcyBpcyB1c2VmdWwgZm9yIGNvbnRpbnVpbmcgdG8gcmVhZCBhIGd6aXAKKyAgIGZpbGUgdGhhdCBpcyBiZWluZyB3cml0dGVuIGNvbmN1cnJlbnRseS4KKyovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrc3VtIGZ1bmN0aW9ucyAqLworCisvKgorICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCByZWxhdGVkIHRvIGNvbXByZXNzaW9uIGJ1dCBhcmUgZXhwb3J0ZWQKKyAgIGFueXdheSBiZWNhdXNlIHRoZXkgbWlnaHQgYmUgdXNlZnVsIGluIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUKKyAgIGNvbXByZXNzaW9uIGxpYnJhcnkuCisqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMiBPRigodUxvbmcgYWRsZXIsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7CisvKgorICAgICBVcGRhdGUgYSBydW5uaW5nIEFkbGVyLTMyIGNoZWNrc3VtIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gYW5kCisgICByZXR1cm4gdGhlIHVwZGF0ZWQgY2hlY2tzdW0uIElmIGJ1ZiBpcyBaX05VTEwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucworICAgdGhlIHJlcXVpcmVkIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBjaGVja3N1bS4KKyAgIEFuIEFkbGVyLTMyIGNoZWNrc3VtIGlzIGFsbW9zdCBhcyByZWxpYWJsZSBhcyBhIENSQzMyIGJ1dCBjYW4gYmUgY29tcHV0ZWQKKyAgIG11Y2ggZmFzdGVyLiBVc2FnZSBleGFtcGxlOgorCisgICAgIHVMb25nIGFkbGVyID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKKworICAgICB3aGlsZSAocmVhZF9idWZmZXIoYnVmZmVyLCBsZW5ndGgpICE9IEVPRikgeworICAgICAgIGFkbGVyID0gYWRsZXIzMihhZGxlciwgYnVmZmVyLCBsZW5ndGgpOworICAgICB9CisgICAgIGlmIChhZGxlciAhPSBvcmlnaW5hbF9hZGxlcikgZXJyb3IoKTsKKyovCisKKy8qCitaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lIE9GKCh1TG9uZyBhZGxlcjEsIHVMb25nIGFkbGVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfb2ZmX3QgbGVuMikpOworCisgICAgIENvbWJpbmUgdHdvIEFkbGVyLTMyIGNoZWNrc3VtcyBpbnRvIG9uZS4gIEZvciB0d28gc2VxdWVuY2VzIG9mIGJ5dGVzLCBzZXExCisgICBhbmQgc2VxMiB3aXRoIGxlbmd0aHMgbGVuMSBhbmQgbGVuMiwgQWRsZXItMzIgY2hlY2tzdW1zIHdlcmUgY2FsY3VsYXRlZCBmb3IKKyAgIGVhY2gsIGFkbGVyMSBhbmQgYWRsZXIyLiAgYWRsZXIzMl9jb21iaW5lKCkgcmV0dXJucyB0aGUgQWRsZXItMzIgY2hlY2tzdW0gb2YKKyAgIHNlcTEgYW5kIHNlcTIgY29uY2F0ZW5hdGVkLCByZXF1aXJpbmcgb25seSBhZGxlcjEsIGFkbGVyMiwgYW5kIGxlbjIuCisqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzIgICBPRigodUxvbmcgY3JjLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbikpOworLyoKKyAgICAgVXBkYXRlIGEgcnVubmluZyBDUkMtMzIgd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQgcmV0dXJuIHRoZQorICAgdXBkYXRlZCBDUkMtMzIuIElmIGJ1ZiBpcyBaX05VTEwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVxdWlyZWQgaW5pdGlhbAorICAgdmFsdWUgZm9yIHRoZSBmb3IgdGhlIGNyYy4gUHJlLSBhbmQgcG9zdC1jb25kaXRpb25pbmcgKG9uZSdzIGNvbXBsZW1lbnQpIGlzCisgICBwZXJmb3JtZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24gc28gaXQgc2hvdWxkbid0IGJlIGRvbmUgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgVXNhZ2UgZXhhbXBsZToKKworICAgICB1TG9uZyBjcmMgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKKworICAgICB3aGlsZSAocmVhZF9idWZmZXIoYnVmZmVyLCBsZW5ndGgpICE9IEVPRikgeworICAgICAgIGNyYyA9IGNyYzMyKGNyYywgYnVmZmVyLCBsZW5ndGgpOworICAgICB9CisgICAgIGlmIChjcmMgIT0gb3JpZ2luYWxfY3JjKSBlcnJvcigpOworKi8KKworLyoKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lIE9GKCh1TG9uZyBjcmMxLCB1TG9uZyBjcmMyLCB6X29mZl90IGxlbjIpKTsKKworICAgICBDb21iaW5lIHR3byBDUkMtMzIgY2hlY2sgdmFsdWVzIGludG8gb25lLiAgRm9yIHR3byBzZXF1ZW5jZXMgb2YgYnl0ZXMsCisgICBzZXExIGFuZCBzZXEyIHdpdGggbGVuZ3RocyBsZW4xIGFuZCBsZW4yLCBDUkMtMzIgY2hlY2sgdmFsdWVzIHdlcmUKKyAgIGNhbGN1bGF0ZWQgZm9yIGVhY2gsIGNyYzEgYW5kIGNyYzIuICBjcmMzMl9jb21iaW5lKCkgcmV0dXJucyB0aGUgQ1JDLTMyCisgICBjaGVjayB2YWx1ZSBvZiBzZXExIGFuZCBzZXEyIGNvbmNhdGVuYXRlZCwgcmVxdWlyaW5nIG9ubHkgY3JjMSwgY3JjMiwgYW5kCisgICBsZW4yLgorKi8KKworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB2YXJpb3VzIGhhY2tzLCBkb24ndCBsb29rIDopICovCisKKy8qIGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdCBhcmUgbWFjcm9zIHRvIGFsbG93IGNoZWNraW5nIHRoZSB6bGliIHZlcnNpb24KKyAqIGFuZCB0aGUgY29tcGlsZXIncyB2aWV3IG9mIHpfc3RyZWFtOgorICovCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVJbml0XyBPRigoel9zdHJlYW1wIHN0cm0sIGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLCBpbnQgc3RyZWFtX3NpemUpKTsKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLCBpbnQgc3RyZWFtX3NpemUpKTsKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXQyXyBPRigoel9zdHJlYW1wIHN0cm0sIGludCAgbGV2ZWwsIGludCAgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cywgaW50IG1lbUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyYXRlZ3ksIGNvbnN0IGNoYXIgKnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1fc2l6ZSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdDJfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50ICB3aW5kb3dCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLCBpbnQgc3RyZWFtX3NpemUpKTsKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tJbml0XyBPRigoel9zdHJlYW1wIHN0cm0sIGludCB3aW5kb3dCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX3NpemUpKTsKKyNkZWZpbmUgZGVmbGF0ZUluaXQoc3RybSwgbGV2ZWwpIFwKKyAgICAgICAgZGVmbGF0ZUluaXRfKChzdHJtKSwgKGxldmVsKSwgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorI2RlZmluZSBpbmZsYXRlSW5pdChzdHJtKSBcCisgICAgICAgIGluZmxhdGVJbml0Xygoc3RybSksICAgICAgICAgICAgICAgIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKKyNkZWZpbmUgZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkgXAorICAgICAgICBkZWZsYXRlSW5pdDJfKChzdHJtKSwobGV2ZWwpLChtZXRob2QpLCh3aW5kb3dCaXRzKSwobWVtTGV2ZWwpLFwKKyAgICAgICAgICAgICAgICAgICAgICAoc3RyYXRlZ3kpLCAgICAgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorI2RlZmluZSBpbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykgXAorICAgICAgICBpbmZsYXRlSW5pdDJfKChzdHJtKSwgKHdpbmRvd0JpdHMpLCBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCisjZGVmaW5lIGluZmxhdGVCYWNrSW5pdChzdHJtLCB3aW5kb3dCaXRzLCB3aW5kb3cpIFwKKyAgICAgICAgaW5mbGF0ZUJhY2tJbml0Xygoc3RybSksICh3aW5kb3dCaXRzKSwgKHdpbmRvdyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorCisjaWYgZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKQorICAgICNkZWZpbmUgel9vZmY2NF90IG9mZjY0X3QKKyNlbHNlIAorICAgICNpZiBfRklMRV9PRkZTRVRfQklUUyA9PSA2NAorICAgICAgICAjZGVmaW5lIHpfb2ZmNjRfdCBvZmZfdAorICAgICNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpIHx8IF9GSUxFX09GRlNFVF9CSVRTID09IDY0CisgICBaRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6b3BlbjY0IE9GKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOworICAgWkVYVEVSTiB6X29mZjY0X3QgWkVYUE9SVCBnenNlZWs2NCBPRigoZ3pGaWxlLCB6X29mZjY0X3QsIGludCkpOworICAgWkVYVEVSTiB6X29mZjY0X3QgWkVYUE9SVCBnenRlbGw2NCBPRigoZ3pGaWxlKSk7CisgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgel9vZmY2NF90KSk7CisgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZTY0IE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmNjRfdCkpOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChaTElCX0lOVEVSTkFMKSAmJiBfRklMRV9PRkZTRVRfQklUUyA9PSA2NAorIyAgZGVmaW5lIGd6b3BlbiBnem9wZW42NAorIyAgZGVmaW5lIGd6c2VlayBnenNlZWs2NAorIyAgZGVmaW5lIGd6dGVsbCBnenRlbGw2NAorIyAgZGVmaW5lIGFkbGVyMzJfY29tYmluZSBhZGxlcjMyX2NvbWJpbmU2NAorIyAgZGVmaW5lIGNyYzMyX2NvbWJpbmUgY3JjMzJfY29tYmluZTY0CisjICBpZm5kZWYgX0xBUkdFRklMRTY0X1NPVVJDRQorICAgICBaRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6b3BlbjY0IE9GKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOworICAgICBaRVhURVJOIG9mZl90IFpFWFBPUlQgZ3pzZWVrNjQgT0YoKGd6RmlsZSwgb2ZmX3QsIGludCkpOworICAgICBaRVhURVJOIG9mZl90IFpFWFBPUlQgZ3p0ZWxsNjQgT0YoKGd6RmlsZSkpOworICAgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgb2ZmX3QpKTsKKyAgICAgWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmU2NCBPRigodUxvbmcsIHVMb25nLCBvZmZfdCkpOworIyAgZW5kaWYKKyNlbHNlCisgICBaRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6b3BlbiBPRigoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKKyAgIFpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6c2VlayBPRigoZ3pGaWxlLCB6X29mZl90LCBpbnQpKTsKKyAgIFpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6dGVsbCBPRigoZ3pGaWxlKSk7CisgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lIE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKKyAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lIE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoWlVUSUxfSCkgJiYgIWRlZmluZWQoTk9fRFVNTVlfREVDTCkKKyAgICBzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUge2ludCBkdW1teTt9OyAvKiBoYWNrIGZvciBidWdneSBjb21waWxlcnMgKi8KKyNlbmRpZgorCitaRVhURVJOIGNvbnN0IGNoYXIgICAqIFpFWFBPUlQgekVycm9yICAgICAgICAgICBPRigoaW50KSk7CitaRVhURVJOIGludCAgICAgICAgICAgIFpFWFBPUlQgaW5mbGF0ZVN5bmNQb2ludCBPRigoel9zdHJlYW1wKSk7CitaRVhURVJOIGNvbnN0IHVMb25nZiAqIFpFWFBPUlQgZ2V0X2NyY190YWJsZSAgICBPRigodm9pZCkpOworWkVYVEVSTiBpbnQgICAgICAgICAgICBaRVhQT1JUIGluZmxhdGVVbmRlcm1pbmUgT0YoKHpfc3RyZWFtcCwgaW50KSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBaTElCX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvemxpYmRlZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvemxpYmRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQ2ZTgxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS96bGliZGVmcy5oCkBAIC0wLDAgKzEsMTMgQEAKKy8qIHpsaWJkZWZzLmggLS0gY29tcGlsZS10aW1lIGRlZmluaXRpb25zIGZvciB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNiBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4JLyogZm9yIG9mZl90ICovCisjaW5jbHVkZSA8dW5pc3RkLmg+CS8qIGZvciBTRUVLXyogYW5kIG9mZl90ICovCisjaWZkZWYgVk1TCisjICBpbmNsdWRlIDx1bml4aW8uaD4JLyogZm9yIG9mZl90ICovCisjZW5kaWYKKyNpZm5kZWYgel9vZmZfdAorIyAgZGVmaW5lIHpfb2ZmX3Qgb2ZmX3QKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL01jcnQxLm8gYi9zeXNyb290L3Vzci9saWIvTWNydDEubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWY5YzE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL01jcnQxLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL1NjcnQxLm8gYi9zeXNyb290L3Vzci9saWIvU2NydDEubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGIzMWJiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL1NjcnQxLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2Fsc2EtbGliL3NtaXhlci9zbWl4ZXItYWM5Ny5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9hbHNhLWxpYi9zbWl4ZXIvc21peGVyLWFjOTcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMyMmI5YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9hbHNhLWxpYi9zbWl4ZXIvc21peGVyLWFjOTcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2Fsc2EtbGliL3NtaXhlci9zbWl4ZXItaGRhLnNvIGIvc3lzcm9vdC91c3IvbGliL2Fsc2EtbGliL3NtaXhlci9zbWl4ZXItaGRhLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNDM1NGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvYWxzYS1saWIvc21peGVyL3NtaXhlci1oZGEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2Fsc2EtbGliL3NtaXhlci9zbWl4ZXItc2Jhc2Uuc28gYi9zeXNyb290L3Vzci9saWIvYWxzYS1saWIvc21peGVyL3NtaXhlci1zYmFzZS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjU2ZjlkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2Fsc2EtbGliL3NtaXhlci9zbWl4ZXItc2Jhc2Uuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2NtYWtlL1B1bHNlQXVkaW8vUHVsc2VBdWRpb0NvbmZpZy5jbWFrZSBiL3N5c3Jvb3QvdXNyL2xpYi9jbWFrZS9QdWxzZUF1ZGlvL1B1bHNlQXVkaW9Db25maWcuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0MzZhYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9jbWFrZS9QdWxzZUF1ZGlvL1B1bHNlQXVkaW9Db25maWcuY21ha2UKQEAgLTAsMCArMSwxMCBAQAorc2V0KFBVTFNFQVVESU9fRk9VTkQgVFJVRSkKKworc2V0KFBVTFNFQVVESU9fVkVSU0lPTl9NQUpPUiAxKQorc2V0KFBVTFNFQVVESU9fVkVSU0lPTl9NSU5PUiAxKQorc2V0KFBVTFNFQVVESU9fVkVSU0lPTiAxLjEpCitzZXQoUFVMU0VBVURJT19WRVJTSU9OX1NUUklORyAiMS4xIikKKworZmluZF9wYXRoKFBVTFNFQVVESU9fSU5DTFVERV9ESVIgcHVsc2UvcHVsc2VhdWRpby5oIEhJTlRTICIvdXNyL2luY2x1ZGUiKQorZmluZF9saWJyYXJ5KFBVTFNFQVVESU9fTElCUkFSWSBOQU1FUyBwdWxzZSBsaWJwdWxzZSBISU5UUyAiL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudSIpCitmaW5kX2xpYnJhcnkoUFVMU0VBVURJT19NQUlOTE9PUF9MSUJSQVJZIE5BTUVTIHB1bHNlLW1haW5sb29wLWdsaWIgbGlicHVsc2UtbWFpbmxvb3AtZ2xpYiBISU5UUyAiL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudSIpCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvY21ha2UvUHVsc2VBdWRpby9QdWxzZUF1ZGlvQ29uZmlnVmVyc2lvbi5jbWFrZSBiL3N5c3Jvb3QvdXNyL2xpYi9jbWFrZS9QdWxzZUF1ZGlvL1B1bHNlQXVkaW9Db25maWdWZXJzaW9uLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNjExMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvY21ha2UvUHVsc2VBdWRpby9QdWxzZUF1ZGlvQ29uZmlnVmVyc2lvbi5jbWFrZQpAQCAtMCwwICsxLDExIEBACitzZXQoUEFDS0FHRV9WRVJTSU9OIDEuMSkKKworaWYoIiR7UEFDS0FHRV9WRVJTSU9OfSIgVkVSU0lPTl9MRVNTICIke1BBQ0tBR0VfRklORF9WRVJTSU9OfSIgKQorICBzZXQoUEFDS0FHRV9WRVJTSU9OX0NPTVBBVElCTEUgRkFMU0UpCitlbHNlKCIke1BBQ0tBR0VfVkVSU0lPTn0iIFZFUlNJT05fTEVTUyAiJHtQQUNLQUdFX0ZJTkRfVkVSU0lPTn0iICkKKyAgc2V0KFBBQ0tBR0VfVkVSU0lPTl9DT01QQVRJQkxFIFRSVUUpCisgIGlmKCAiJHtQQUNLQUdFX0ZJTkRfVkVSU0lPTn0iIFNUUkVRVUFMICIke1BBQ0tBR0VfVkVSU0lPTn0iKQorICAgIHNldChQQUNLQUdFX1ZFUlNJT05fRVhBQ1QgVFJVRSkKKyAgZW5kaWYoICIke1BBQ0tBR0VfRklORF9WRVJTSU9OfSIgU1RSRVFVQUwgIiR7UEFDS0FHRV9WRVJTSU9OfSIpCitlbmRpZigiJHtQQUNLQUdFX1ZFUlNJT059IiBWRVJTSU9OX0xFU1MgIiR7UEFDS0FHRV9GSU5EX1ZFUlNJT059IiApCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9jcnQxLm8gYi9zeXNyb290L3Vzci9saWIvY3J0MS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZjQ2NWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvY3J0MS5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9jcnRpLm8gYi9zeXNyb290L3Vzci9saWIvY3J0aS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOWEyMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvY3J0aS5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9jcnRuLm8gYi9zeXNyb290L3Vzci9saWIvY3J0bi5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNWU2ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvY3J0bi5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9BTlNJX1gzLjExMC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9BTlNJX1gzLjExMC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWZlNDdlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0FOU0lfWDMuMTEwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9BUk1TQ0lJLTguc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQVJNU0NJSS04LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MDRiZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQVJNU0NJSS04LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9BU01PXzQ0OS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9BU01PXzQ0OS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWIyMTVmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0FTTU9fNDQ5LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9CSUc1LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0JJRzUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyYjNhNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9CSUc1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9CSUc1SEtTQ1Muc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQklHNUhLU0NTLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMTUyZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQklHNUhLU0NTLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9CUkYuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQlJGLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYjkzZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQlJGLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEwMDA3LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTAwMDcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI5NmNkMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEwMDA3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDExMjUuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMTI1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NzAyOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMTI1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTAuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjUwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMDVlMGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjUwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTEuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjUxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZjc2MTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjUxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTIuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjUyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZGNiNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjUyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjUzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZjMwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjUzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTQuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjU0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmODJhNTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjU0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTUuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjU1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYTlhNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjU1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTYuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjU2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MWQ3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjU2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTcuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjU3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxY2VmMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjU3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEyNTguc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjU4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OGRjZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjU4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDczNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDczNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWNjZmIxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzM3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDc3MC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDc3MC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTg2ZTZjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzcwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDc3MS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDc3MS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGRiYWNiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzcxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDc3Mi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDc3Mi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDE0ZTNjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzcyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDc3My5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDc3My5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODk3YTc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzczLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDc3NC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDc3NC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDNlZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzc0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDc3NS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDc3NS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGFhY2JkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQNzc1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDkzMi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDkzMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTNjNTlmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQOTMyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DU05fMzY5MTAzLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NTTl8zNjkxMDMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4OTZmYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DU05fMzY5MTAzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DV0kuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1dJLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNjI1ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1dJLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9ERUMtTUNTLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0RFQy1NQ1Muc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNlNzNlNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9ERUMtTUNTLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtQVQtREUtQS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtQVQtREUtQS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDRlNGFiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1BVC1ERS1BLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtQVQtREUuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUFULURFLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmY2Y3ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUFULURFLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtQ0EtRlIuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUNBLUZSLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZWQyOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUNBLUZSLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtREstTk8tQS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtREstTk8tQS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODJmNTliCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1ESy1OTy1BLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtREstTk8uc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLURLLU5PLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZDVjZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLURLLU5PLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtRVMtQS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtRVMtQS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmJjYTExCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1FUy1BLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtRVMtUy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtRVMtUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTJmMmUwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1FUy1TLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtRVMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUVTLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMGU4MmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUVTLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtRkktU0UtQS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtRkktU0UtQS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzg3OGMyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1GSS1TRS1BLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtRkktU0Uuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUZJLVNFLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYjIyZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUZJLVNFLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtRlIuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUZSLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOWRlYTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUZSLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtSVMtRlJJU1Muc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUlTLUZSSVNTLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNWYzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUlTLUZSSVNTLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtSVQuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUlULnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMjk3NGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUlULnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtUFQuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLVBULnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNDYwZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLVBULnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtVUsuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLVVLLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOTUzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLVVLLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtVVMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLVVTLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYTMxYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLVVTLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQ01BLUNZUklMTElDLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VDTUEtQ1lSSUxMSUMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2NjExMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQ01BLUNZUklMTElDLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FVUMtQ04uc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRVVDLUNOLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3Njk4YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRVVDLUNOLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FVUMtSklTWDAyMTMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRVVDLUpJU1gwMjEzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNmVlYmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRVVDLUpJU1gwMjEzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FVUMtSlAtTVMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRVVDLUpQLU1TLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NDhmZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRVVDLUpQLU1TLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FVUMtSlAuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRVVDLUpQLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOGRmYTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRVVDLUpQLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FVUMtS1Iuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRVVDLUtSLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZWY1OTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRVVDLUtSLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FVUMtVFcuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRVVDLVRXLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOTE3NGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRVVDLVRXLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HQjE4MDMwLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0dCMTgwMzAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E4MTZiNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HQjE4MDMwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HQkJJRzUuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvR0JCSUc1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMjc1MDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvR0JCSUc1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HQkdCSy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HQkdCSy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGNjYjYwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0dCR0JLLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HQksuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvR0JLLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MWI1MWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvR0JLLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HRU9SR0lBTi1BQ0FERU1ZLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0dFT1JHSUFOLUFDQURFTVkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5NThiNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HRU9SR0lBTi1BQ0FERU1ZLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HRU9SR0lBTi1QUy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HRU9SR0lBTi1QUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODg0MjA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0dFT1JHSUFOLVBTLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HT1NUXzE5NzY4LTc0LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0dPU1RfMTk3NjgtNzQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU2YjJiNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HT1NUXzE5NzY4LTc0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HUkVFSy1DQ0lUVC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HUkVFSy1DQ0lUVC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWJjZTdiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0dSRUVLLUNDSVRULnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HUkVFSzctT0xELnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0dSRUVLNy1PTEQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5ZDViNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HUkVFSzctT0xELnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HUkVFSzcuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvR1JFRUs3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MzNmNTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvR1JFRUs3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9IUC1HUkVFSzguc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSFAtR1JFRUs4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MTlhMzYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSFAtR1JFRUs4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9IUC1ST01BTjguc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSFAtUk9NQU44LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZjJkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSFAtUk9NQU44LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9IUC1ST01BTjkuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSFAtUk9NQU45LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViN2RlZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSFAtUk9NQU45LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9IUC1USEFJOC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9IUC1USEFJOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGIxNTRiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0hQLVRIQUk4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9IUC1UVVJLSVNIOC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9IUC1UVVJLSVNIOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDUwYjljCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0hQLVRVUktJU0g4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0wMzcuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMDM3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMzRlOTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMDM3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0wMzguc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMDM4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDQ5NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMDM4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDA0LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwMDQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQyNWFmYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDA0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDA4LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwMDguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVhNGRjYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDA4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDA4XzQyMC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDA4XzQyMC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTliYzU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwMDhfNDIwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDI1LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwMjUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNjMjFmZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDI1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDI2LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwMjYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAxY2MwYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDI2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDQ2LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwNDYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYzNThmNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDQ2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDQ3LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwNDcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY5ZTkyMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDQ3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDk3LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEwOTcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4ZWJiOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDk3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTEyLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMTIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc5ZDExMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTEyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTIyLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMjIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVmZGZkNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTIyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTIzLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMjMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiZjkwYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTIzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTI0LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMjQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUwYTlmZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTI0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTI5LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMjkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg2OTcyYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTI5LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTMwLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMzAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNjZmRlMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTMwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTMyLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMzIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxNjJlZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTMyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTMzLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMzMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwNTIzYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTMzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTM3LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExMzcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhiNmM3NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTM3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQwLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2ODgxMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQxLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdiYjhlOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQyLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg0MTRlYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQzLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5YzgyMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQ0LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkZTgwYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQ0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQ1LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkZTkyZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQ1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQ2LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQyY2U2ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQ2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQ3LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5YzNmZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQ3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQ4LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmODVmMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQ4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQ5LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNDkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU4MDBiNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQ5LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTUzLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNTMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMxMGU2YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTUzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTU0LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNTQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlNjcyYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTU0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTU1LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ1NTJhOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTU1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTU2LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNTYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVkZTA4MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTU2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTU3LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNTcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhY2M3NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTU3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTU4LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNTguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMzNDNhNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTU4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTYwLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI4YzYyNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTYwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTYxLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhNjUwNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTYxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTYyLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQxMTRhNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTYyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTYzLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM1YTI1ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTYzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTY0LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2MzVlMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTY0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTY2LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmYjRkZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTY2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTY3LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTExNjcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3NTI5YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTY3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMjcxMi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMjcxMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWI4YmU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEyNzEyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMzY0LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEzNjQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4OTc1ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMzY0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMzcxLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEzNzEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE2YzU2YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMzcxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMzg4LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEzODguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgyNTcwNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMzg4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMzkwLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEzOTAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzMTQ4MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMzkwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMzk5LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTEzOTkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzljMTdkMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMzk5LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xNjgwNC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xNjgwNC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTRmNGZmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTE2ODA0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yNTYuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjU2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNGY1YzAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjU2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yNzMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjczLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZWJjMTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjczLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yNzQuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjc0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYzE2NTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjc0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yNzUuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjc1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZGUyMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjc1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yNzcuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjc3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOTA2MDYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjc3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yNzguc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjc4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZjE2NzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjc4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yODAuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjgwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NmY4YzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjgwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yODEuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjgxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NWY5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjgxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yODQuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjg0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNTMyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjg0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yODUuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjg1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YzliNTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjg1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yOTAuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjkwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZjRlZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjkwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0yOTcuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjk3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NTE0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjk3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00MjAuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDIwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNTNkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDIwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00MjMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDIzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYWE4OTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDIzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00MjQuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDI0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZTdlZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDI0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00Mzcuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDM3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2Zjc2OTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDM3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00NTE3LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQ1MTcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY2MTFiZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00NTE3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00ODk5LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQ4OTkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1ZDNhOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00ODk5LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00OTA5LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQ5MDkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4YzkwOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00OTA5LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00OTcxLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQ5NzEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNmYzZiYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00OTcxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk01MDAuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNTAwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZDJmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNTAwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk01MzQ3LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTUzNDcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE0ZTg4MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk01MzQ3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04MDMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODAzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMTllNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODAzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NTAuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODUwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZGJiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODUwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NTEuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODUxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNjdiMTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODUxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NTIuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODUyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYjZhY2EKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODUyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NTUuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODU1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OTE2NzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODU1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NTYuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODU2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNWI0YmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODU2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NTcuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODU3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZmMzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODU3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjAuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODYwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMmUyMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODYwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjEuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODYxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NTJmYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODYxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjIuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODYyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNTJiZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODYyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODYzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMDI0ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODYzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjQuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODY0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MjRmNGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODY0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjUuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODY1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NzJiYTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODY1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjYuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODY2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMzc5ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODY2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NjZOQVYuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODY2TkFWLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NDBiZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODY2TkFWLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04Njguc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODY4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjODNmOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODY4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04Njkuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODY5LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYTYxNzQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODY5LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NzAuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODcwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOWY3Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODcwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NzEuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODcxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOTk3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODcxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NzQuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODc0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YzJkY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODc0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04NzUuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODc1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NWM5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODc1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04ODAuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODgwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNGU0NDEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODgwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk04OTEuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODkxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MTQ3MWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODkxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDEuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTAxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYjRhYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTAxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDIuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTAyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkN2RlNTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTAyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTAzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYmE2OTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTAzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDMwLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwMzAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5NjUxZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDMwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDQuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTA0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOThmMTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTA0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDUuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTA1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZGY3ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTA1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDY2LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwNjYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FkNTZhZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDY2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MTguc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTE4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYTc4M2YKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTE4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MjEuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTIxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MGUxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTIxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MjIuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTIyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNWRhMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTIyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MzAuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTMwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4OTQzMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTMwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MzIuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTMyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMGI3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTMyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MzMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTMzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MzMxMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTMzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MzUuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTM1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOWZkNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTM1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05Mzcuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTM3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NDk1MDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTM3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05Mzkuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTM5LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZjgzOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTM5LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05NDMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTQzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYzhlMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTQzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05NDQ4LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTk0NDguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlZGY3YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05NDQ4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JRUNfUDI3LTEuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUVDX1AyNy0xLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NDkxYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUVDX1AyNy0xLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JTklTLTguc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSU5JUy04LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZGQyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSU5JUy04LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JTklTLUNZUklMTElDLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lOSVMtQ1lSSUxMSUMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiZTNlZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JTklTLUNZUklMTElDLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JTklTLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lOSVMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZmNWI5YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JTklTLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU0lSSS0zMzQyLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTSVJJLTMzNDIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI2ZDU5ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU0lSSS0zMzQyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tMjAyMi1DTi1FWFQuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLTIwMjItQ04tRVhULnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNzVlYjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLTIwMjItQ04tRVhULnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tMjAyMi1DTi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tMjAyMi1DTi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmU0MThiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy0yMDIyLUNOLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tMjAyMi1KUC0zLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy0yMDIyLUpQLTMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE3MDJmZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tMjAyMi1KUC0zLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tMjAyMi1KUC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tMjAyMi1KUC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODMzZWE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy0yMDIyLUpQLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tMjAyMi1LUi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tMjAyMi1LUi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTUyYWI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy0yMDIyLUtSLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tSVItMTk3LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy1JUi0xOTcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkMDg5ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tSVItMTk3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tSVItMjA5LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy1JUi0yMDkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwNGJjZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tSVItMjA5LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU082NDYuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPNjQ2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMjg5ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPNjQ2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTEuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NWFmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTEwLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMTAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4NjAwZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTEwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTExLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMTEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTczMzhhZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTExLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTEzLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMTMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxNDhkZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTEzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTE0LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMTQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjYWJhOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTE0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTE1LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RlNmE2MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTE2LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMTYuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmMzIzNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTE2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTIuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0yLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZGJlMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0yLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0zLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzODM5YmEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0zLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTQuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS00LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MDgzNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS00LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTUuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS01LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYWY1OTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS01LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTYuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS02LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YmFmMjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS02LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTcuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS03LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZGYxNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS03LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTguc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS04LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYjExNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS04LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTkuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS05LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMDIxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS05LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTlFLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktOUUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxZmU2NgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTlFLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fMTAzNjctQk9YLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTT18xMDM2Ny1CT1guc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2YmJiNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fMTAzNjctQk9YLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fMTE1NDgtMS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fMTE1NDgtMS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmRlOGIwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTT18xMTU0OC0xLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fMjAzMy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fMjAzMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGJmNmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTT18yMDMzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fNTQyNy1FWFQuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzU0MjctRVhULnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MGEyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzU0MjctRVhULnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fNTQyNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fNTQyNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzM0NDdhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTT181NDI3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fNTQyOC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fNTQyOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzU3ZTgyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTT181NDI4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fNjkzNy0yLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTT182OTM3LTIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQzYWRhNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fNjkzNy0yLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fNjkzNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fNjkzNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDAyMjYxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTT182OTM3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9KT0hBQi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9KT0hBQi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWJlMmZlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0pPSEFCLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9LT0ktOC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9LT0ktOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzU3NmU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0tPSS04LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9LT0k4LVIuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvS09JOC1SLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NzY0NWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvS09JOC1SLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9LT0k4LVJVLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0tPSTgtUlUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y3NTJiMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9LT0k4LVJVLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9LT0k4LVQuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvS09JOC1ULnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNDUwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvS09JOC1ULnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9LT0k4LVUuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvS09JOC1VLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYjc5OWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvS09JOC1VLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9MQVRJTi1HUkVFSy0xLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0xBVElOLUdSRUVLLTEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4YWU3NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9MQVRJTi1HUkVFSy0xLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9MQVRJTi1HUkVFSy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9MQVRJTi1HUkVFSy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTI0MTRlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0xBVElOLUdSRUVLLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9NQUMtQ0VOVFJBTEVVUk9QRS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9NQUMtQ0VOVFJBTEVVUk9QRS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDMyMjI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L01BQy1DRU5UUkFMRVVST1BFLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9NQUMtSVMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvTUFDLUlTLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNDdmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvTUFDLUlTLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9NQUMtU0FNSS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9NQUMtU0FNSS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2U4NTY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L01BQy1TQU1JLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9NQUMtVUsuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvTUFDLVVLLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZTY2MjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvTUFDLVVLLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9NQUNJTlRPU0guc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvTUFDSU5UT1NILnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MzdjZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvTUFDSU5UT1NILnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9NSUsuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvTUlLLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MGJmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvTUlLLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9OQVRTLURBTk8uc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvTkFUUy1EQU5PLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMGFjZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvTkFUUy1EQU5PLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9OQVRTLVNFRkkuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvTkFUUy1TRUZJLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1Yjc1MDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvTkFUUy1TRUZJLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9QVDE1NC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9QVDE1NC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGE0NDY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L1BUMTU0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9SSzEwNDguc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvUksxMDQ4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNGMzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvUksxMDQ4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9TQU1JLVdTMi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9TQU1JLVdTMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTM0YWY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L1NBTUktV1MyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9TSElGVF9KSVNYMDIxMy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9TSElGVF9KSVNYMDIxMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTYxMjRjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L1NISUZUX0pJU1gwMjEzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9TSklTLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L1NKSVMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UyNTcyYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9TSklTLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9ULjYxLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L1QuNjEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRiYTU0MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9ULjYxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9UQ1ZONTcxMi0xLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L1RDVk41NzEyLTEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JlZDBhMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9UQ1ZONTcxMi0xLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9USVMtNjIwLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L1RJUy02MjAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4MDhlMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9USVMtNjIwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9UU0NJSS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9UU0NJSS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjU1MWU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L1RTQ0lJLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9VSEMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvVUhDLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MjRkNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvVUhDLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9VTklDT0RFLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L1VOSUNPREUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5ZGE4OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9VTklDT0RFLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9VVEYtMTYuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvVVRGLTE2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZWNkYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvVVRGLTE2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9VVEYtMzIuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvVVRGLTMyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOTU5MmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvVVRGLTMyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9VVEYtNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9VVEYtNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmRiYjlmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L1VURi03LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9WSVNDSUkuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvVklTQ0lJLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMGRhNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvVklTQ0lJLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9nY29udi1tb2R1bGVzIGIvc3lzcm9vdC91c3IvbGliL2djb252L2djb252LW1vZHVsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE4NzA5NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9nY29udi1tb2R1bGVzCkBAIC0wLDAgKzEsMTk3MSBAQAorIyBHTlUgbGliYyBpY29udiBjb25maWd1cmF0aW9uLgorIyBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNSwgMjAwNywgMjAwOCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyMgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyMgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyMgMDIxMTEtMTMwNyBVU0EuCisKKyMgQWxsIGxpbmVzIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKKworIyBJZiB0aGUgbGluZXMgc3RhcnQgd2l0aCBgbW9kdWxlJworIyAgZnJvbXNldDoJZWl0aGVyIGEgbmFtZSB0cmlwbGUgb3IgYSByZWd1bGFyIGV4cHJlc3Npb24gdHJpcGxlLgorIyAgdG9zZXQ6CWEgbmFtZSB0cmlwbGUgb3IgYW4gZXhwcmVzc2lvbiB3aXRoIFxOIHRvIGdldCByZWd1bGFyCisjCQlleHByZXNzaW9uIG1hdGNoaW5nIHJlc3VsdHMuCisjICBmaWxlbmFtZToJZmlsZW5hbWUgb2YgdGhlIG1vZHVsZSBpbXBsZW1lbnRpbmcgdGhlIHRyYW5zZm9ybWF0aW9uLgorIwkJSWYgaXQgaXMgbm90IGFic29sdXRlIHRoZSBwYXRoIGlzIG1hZGUgYWJzb2x1dGUgYnkgcHJlcGVuZGluZworIwkJdGhlIGRpcmVjdG9yeSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIGZvdW5kIGluLgorIyAgY29zdDoJb3B0aW9uYWwgY29zdCBvZiB0aGUgdHJhbnNmb3JtYXRpb24uICBEZWZhdWx0IGlzIDEuCisKKyMgSWYgdGhlIGxpbmVzIHN0YXJ0IHdpdGggYGFsaWFzJworIyAgYWxpYXM6CWFsaWFzIG5hbWUgd2hpY2ggaXMgbm90IHJlYWxseSByZWNvZ25pemVkLgorIyAgbmFtZToJdGhlIHJlYWwgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIHNldAorCithbGlhcwlJU08tSVItNC8vCQlCU180NzMwLy8KK2FsaWFzCUlTTzY0Ni1HQi8vCQlCU180NzMwLy8KK2FsaWFzCUdCLy8JCQlCU180NzMwLy8KK2FsaWFzCVVLLy8JCQlCU180NzMwLy8KK2FsaWFzCUNTSVNPNFVOSVRFREtJTkdET00vLwlCU180NzMwLy8KK21vZHVsZQlCU180NzMwLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJQlNfNDczMC8vCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTEyMS8vCQlDU0FfWjI0My40LTE5ODUtMS8vCithbGlhcwlJU082NDYtQ0EvLwkJQ1NBX1oyNDMuNC0xOTg1LTEvLworYWxpYXMJQ1NBNy0xLy8JCUNTQV9aMjQzLjQtMTk4NS0xLy8KK2FsaWFzCUNBLy8JCQlDU0FfWjI0My40LTE5ODUtMS8vCithbGlhcwlDU0lTTzEyMUNBTkFESUFOMS8vCUNTQV9aMjQzLjQtMTk4NS0xLy8KK2FsaWFzCUNTQV9aMjQzLjQxOTg1MS8vCUNTQV9aMjQzLjQtMTk4NS0xLy8KK21vZHVsZQlDU0FfWjI0My40LTE5ODUtMS8vCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJQ1NBX1oyNDMuNC0xOTg1LTEvLwlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTEyMi8vCQlDU0FfWjI0My40LTE5ODUtMi8vCithbGlhcwlJU082NDYtQ0EyLy8JCUNTQV9aMjQzLjQtMTk4NS0yLy8KK2FsaWFzCUNTQTctMi8vCQlDU0FfWjI0My40LTE5ODUtMi8vCithbGlhcwlDU0lTTzEyMkNBTkFESUFOMi8vCUNTQV9aMjQzLjQtMTk4NS0yLy8KK2FsaWFzCUNTQV9aMjQzLjQxOTg1Mi8vCUNTQV9aMjQzLjQtMTk4NS0yLy8KK21vZHVsZQlDU0FfWjI0My40LTE5ODUtMi8vCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJQ1NBX1oyNDMuNC0xOTg1LTIvLwlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTIxLy8JCURJTl82NjAwMy8vCithbGlhcwlERS8vCQkJRElOXzY2MDAzLy8KK2FsaWFzCUlTTzY0Ni1ERS8vCQlESU5fNjYwMDMvLworYWxpYXMJQ1NJU08yMUdFUk1BTi8vCQlESU5fNjYwMDMvLworbW9kdWxlCURJTl82NjAwMy8vCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCURJTl82NjAwMy8vCQlJU082NDYJCTIKKworYWxpYXMJRFMyMDg5Ly8JCURTXzIwODkvLworYWxpYXMJSVNPNjQ2LURLLy8JCURTXzIwODkvLworYWxpYXMJREsvLwkJCURTXzIwODkvLworYWxpYXMJQ1NJU082NDZEQU5JU0gvLwlEU18yMDg5Ly8KK21vZHVsZQlEU18yMDg5Ly8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJRFNfMjA4OS8vCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTE3Ly8JCUVTLy8KK2FsaWFzCUlTTzY0Ni1FUy8vCQlFUy8vCithbGlhcwlDU0lTTzE3U1BBTklTSC8vCUVTLy8KK21vZHVsZQlFUy8vCQkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlFUy8vCQkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi04NS8vCQlFUzIvLworYWxpYXMJSVNPNjQ2LUVTMi8vCQlFUzIvLworYWxpYXMJQ1NJU084NVNQQU5JU0gyLy8JRVMyLy8KK21vZHVsZQlFUzIvLwkJCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJRVMyLy8JCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTU3Ly8JCUdCXzE5ODgtODAvLworYWxpYXMJQ04vLwkJCUdCXzE5ODgtODAvLworYWxpYXMJSVNPNjQ2LUNOLy8JCUdCXzE5ODgtODAvLworYWxpYXMJQ1NJU081OEdCMTk4OC8vCQlHQl8xOTg4LTgwLy8KK2FsaWFzCUdCXzE5ODg4MC8vCQlHQl8xOTg4LTgwLy8KK21vZHVsZQlHQl8xOTg4LTgwLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJR0JfMTk4OC04MC8vCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTE1Ly8JCUlULy8KK2FsaWFzCUlTTzY0Ni1JVC8vCQlJVC8vCithbGlhcwlDU0lTTzE1SVRBTElBTi8vCUlULy8KK21vZHVsZQlJVC8vCQkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlJVC8vCQkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi0xNC8vCQlKSVNfQzYyMjAtMTk2OS1STy8vCithbGlhcwlKUC8vCQkJSklTX0M2MjIwLTE5NjktUk8vLworYWxpYXMJSVNPNjQ2LUpQLy8JCUpJU19DNjIyMC0xOTY5LVJPLy8KK2FsaWFzCUNTSVNPMTRKSVNDNjIyMFJPLy8JSklTX0M2MjIwLTE5NjktUk8vLworYWxpYXMJSklTX0M2MjIwMTk2OVJPLy8JSklTX0M2MjIwLTE5NjktUk8vLworbW9kdWxlCUpJU19DNjIyMC0xOTY5LVJPLy8JSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlKSVNfQzYyMjAtMTk2OS1STy8vCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItOTIvLwkJSklTX0M2MjI5LTE5ODQtQi8vCithbGlhcwlJU082NDYtSlAtT0NSLUIvLwlKSVNfQzYyMjktMTk4NC1CLy8KK2FsaWFzCUpQLU9DUi1CLy8JCUpJU19DNjIyOS0xOTg0LUIvLworYWxpYXMJQ1NJU085MkpJU0M2Mjk5MTk4NEIvLwlKSVNfQzYyMjktMTk4NC1CLy8KK2FsaWFzCUpJU19DNjIyOTE5ODRCLy8JSklTX0M2MjI5LTE5ODQtQi8vCittb2R1bGUJSklTX0M2MjI5LTE5ODQtQi8vCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJSklTX0M2MjI5LTE5ODQtQi8vCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItMTQxLy8JCUpVU19JLkIxLjAwMi8vCithbGlhcwlJU082NDYtWVUvLwkJSlVTX0kuQjEuMDAyLy8KK2FsaWFzCUpTLy8JCQlKVVNfSS5CMS4wMDIvLworYWxpYXMJWVUvLwkJCUpVU19JLkIxLjAwMi8vCithbGlhcwlDU0lTTzE0MUpVU0lCMTAwMi8vCUpVU19JLkIxLjAwMi8vCittb2R1bGUJSlVTX0kuQjEuMDAyLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJSlVTX0kuQjEuMDAyLy8JCUlTTzY0NgkJMgorCithbGlhcwlJU082NDYtS1IvLwkJS1NDNTYzNi8vCithbGlhcwlDU0tTQzU2MzYvLwkJS1NDNTYzNi8vCittb2R1bGUJS1NDNTYzNi8vCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCUtTQzU2MzYvLwkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi04Ni8vCQlNU1pfNzc5NS4zLy8KK2FsaWFzCUlTTzY0Ni1IVS8vCQlNU1pfNzc5NS4zLy8KK2FsaWFzCUhVLy8JCQlNU1pfNzc5NS4zLy8KK2FsaWFzCUNTSVNPODZIVU5HQVJJQU4vLwlNU1pfNzc5NS4zLy8KK21vZHVsZQlNU1pfNzc5NS4zLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJTVNaXzc3OTUuMy8vCQlJU082NDYJCTIKKworYWxpYXMJQ1VCQS8vCQkJTkNfTkMwMC0xMC8vCithbGlhcwlOQ19OQzAwLTEwOjgxLy8JCU5DX05DMDAtMTAvLworYWxpYXMJSVNPLUlSLTE1MS8vCQlOQ19OQzAwLTEwLy8KK2FsaWFzCUlTTzY0Ni1DVS8vCQlOQ19OQzAwLTEwLy8KK2FsaWFzCUNTSVNPMTUxQ1VCQS8vCQlOQ19OQzAwLTEwLy8KK2FsaWFzCU5DX05DMDAxMC8vCQlOQ19OQzAwLTEwLy8KK21vZHVsZQlOQ19OQzAwLTEwLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJTkNfTkMwMC0xMC8vCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTY5Ly8JCU5GX1pfNjItMDEwLy8KK2FsaWFzCUlTTzY0Ni1GUi8vCQlORl9aXzYyLTAxMC8vCithbGlhcwlGUi8vCQkJTkZfWl82Mi0wMTAvLworYWxpYXMJQ1NJU082OUZSRU5DSC8vCQlORl9aXzYyLTAxMC8vCithbGlhcwlORl9aXzYyMDEwLy8JCU5GX1pfNjItMDEwLy8KK21vZHVsZQlORl9aXzYyLTAxMC8vCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCU5GX1pfNjItMDEwLy8JCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItMjUvLwkJTkZfWl82Mi0wMTBfMTk3My8vCithbGlhcwlJU082NDYtRlIxLy8JCU5GX1pfNjItMDEwXzE5NzMvLworYWxpYXMJTkZfWl82Mi0wMTBfKDE5NzMpLy8JTkZfWl82Mi0wMTBfMTk3My8vCithbGlhcwlDU0lTTzI1RlJFTkNILy8JCU5GX1pfNjItMDEwXzE5NzMvLworYWxpYXMJTkZfWl82MjAxMF8xOTczLy8JTkZfWl82Mi0wMTBfMTk3My8vCittb2R1bGUJTkZfWl82Mi0wMTBfMTk3My8vCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJTkZfWl82Mi0wMTBfMTk3My8vCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItNjAvLwkJTlNfNDU1MS0xLy8KK2FsaWFzCUlTTzY0Ni1OTy8vCQlOU180NTUxLTEvLworYWxpYXMJTk8vLwkJCU5TXzQ1NTEtMS8vCithbGlhcwlDU0lTTzYwREFOSVNITk9SV0VHSUFOLy8gTlNfNDU1MS0xLy8KK2FsaWFzCUNTSVNPNjBOT1JXRUdJQU4xLy8JTlNfNDU1MS0xLy8KK2FsaWFzCU5TXzQ1NTExLy8JCU5TXzQ1NTEtMS8vCittb2R1bGUJTlNfNDU1MS0xLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJTlNfNDU1MS0xLy8JCUlTTzY0NgkJMgorCithbGlhcwlJU082NDYtTk8yLy8JCU5TXzQ1NTEtMi8vCithbGlhcwlJU08tSVItNjEvLwkJTlNfNDU1MS0yLy8KK2FsaWFzCU5PMi8vCQkJTlNfNDU1MS0yLy8KK2FsaWFzCUNTSVNPNjFOT1JXRUdJQU4yLy8JTlNfNDU1MS0yLy8KK2FsaWFzCU5TXzQ1NTEyLy8JCU5TXzQ1NTEtMi8vCittb2R1bGUJTlNfNDU1MS0yLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJTlNfNDU1MS0yLy8JCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItMTYvLwkJUFQvLworYWxpYXMJSVNPNjQ2LVBULy8JCVBULy8KK2FsaWFzCUNTSVNPMTZQT1JUVUdFU0UvLwlQVC8vCittb2R1bGUJUFQvLwkJCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJUFQvLwkJCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItODQvLwkJUFQyLy8KK2FsaWFzCUlTTzY0Ni1QVDIvLwkJUFQyLy8KK2FsaWFzCUNTSVNPODRQT1JUVUdVRVNFMi8vCVBUMi8vCittb2R1bGUJUFQyLy8JCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCVBUMi8vCQkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi0xMC8vCQlTRU5fODUwMjAwX0IvLworYWxpYXMJRkkvLwkJCVNFTl84NTAyMDBfQi8vCithbGlhcwlJU082NDYtRkkvLwkJU0VOXzg1MDIwMF9CLy8KK2FsaWFzCUlTTzY0Ni1TRS8vCQlTRU5fODUwMjAwX0IvLworYWxpYXMJU0UvLwkJCVNFTl84NTAyMDBfQi8vCithbGlhcwlDU0lTTzEwU1dFRElTSC8vCVNFTl84NTAyMDBfQi8vCithbGlhcwlTUzYzNjEyNy8vCQlTRU5fODUwMjAwX0IvLworbW9kdWxlCVNFTl84NTAyMDBfQi8vCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCVNFTl84NTAyMDBfQi8vCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTExLy8JCVNFTl84NTAyMDBfQy8vCithbGlhcwlJU082NDYtU0UyLy8JCVNFTl84NTAyMDBfQy8vCithbGlhcwlTRTIvLwkJCVNFTl84NTAyMDBfQy8vCithbGlhcwlDU0lTTzExU1dFRElTSEZPUk5BTUVTLy8gU0VOXzg1MDIwMF9DLy8KK21vZHVsZQlTRU5fODUwMjAwX0MvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlTRU5fODUwMjAwX0MvLwkJSVNPNjQ2CQkyCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTAwLy8JCUlTTy04ODU5LTEvLworYWxpYXMJSVNPXzg4NTktMToxOTg3Ly8JSVNPLTg4NTktMS8vCithbGlhcwlJU09fODg1OS0xLy8JCUlTTy04ODU5LTEvLworYWxpYXMJSVNPODg1OS0xLy8JCUlTTy04ODU5LTEvLworYWxpYXMJSVNPODg1OTEvLwkJSVNPLTg4NTktMS8vCithbGlhcwlMQVRJTjEvLwkJSVNPLTg4NTktMS8vCithbGlhcwlMMS8vCQkJSVNPLTg4NTktMS8vCithbGlhcwlJQk04MTkvLwkJSVNPLTg4NTktMS8vCithbGlhcwlDUDgxOS8vCQkJSVNPLTg4NTktMS8vCithbGlhcwlDU0lTT0xBVElOMS8vCQlJU08tODg1OS0xLy8KK2FsaWFzCTg4NTlfMS8vCQlJU08tODg1OS0xLy8KK2FsaWFzCU9TRjAwMDEwMDAxLy8JCUlTTy04ODU5LTEvLworbW9kdWxlCUlTTy04ODU5LTEvLwkJSU5URVJOQUwJCUlTTzg4NTktMQkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTEvLwkJSVNPODg1OS0xCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xMDEvLwkJSVNPLTg4NTktMi8vCithbGlhcwlJU09fODg1OS0yOjE5ODcvLwlJU08tODg1OS0yLy8KK2FsaWFzCUlTT184ODU5LTIvLwkJSVNPLTg4NTktMi8vCithbGlhcwlJU084ODU5LTIvLwkJSVNPLTg4NTktMi8vCithbGlhcwlJU084ODU5Mi8vCQlJU08tODg1OS0yLy8KK2FsaWFzCUxBVElOMi8vCQlJU08tODg1OS0yLy8KK2FsaWFzCUwyLy8JCQlJU08tODg1OS0yLy8KK2FsaWFzCUNTSVNPTEFUSU4yLy8JCUlTTy04ODU5LTIvLworYWxpYXMJODg1OV8yLy8JCUlTTy04ODU5LTIvLworYWxpYXMJT1NGMDAwMTAwMDIvLwkJSVNPLTg4NTktMi8vCithbGlhcwlJQk05MTIvLwkJSVNPLTg4NTktMi8vCithbGlhcwlDUDkxMi8vCQkJSVNPLTg4NTktMi8vCittb2R1bGUJSVNPLTg4NTktMi8vCQlJTlRFUk5BTAkJSVNPODg1OS0yCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktMi8vCQlJU084ODU5LTIJMQorCisjCWZyb20JCQl0bwkJCSBtb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xMDkvLwkJSVNPLTg4NTktMy8vCithbGlhcwlJU09fODg1OS0zOjE5ODgvLwlJU08tODg1OS0zLy8KK2FsaWFzCUlTT184ODU5LTMvLwkJSVNPLTg4NTktMy8vCithbGlhcwlJU084ODU5LTMvLwkJSVNPLTg4NTktMy8vCithbGlhcwlJU084ODU5My8vCQlJU08tODg1OS0zLy8KK2FsaWFzCUxBVElOMy8vCQlJU08tODg1OS0zLy8KK2FsaWFzCUwzLy8JCQlJU08tODg1OS0zLy8KK2FsaWFzCUNTSVNPTEFUSU4zLy8JCUlTTy04ODU5LTMvLworYWxpYXMJODg1OV8zLy8JCUlTTy04ODU5LTMvLworYWxpYXMJT1NGMDAwMTAwMDMvLwkJSVNPLTg4NTktMy8vCittb2R1bGUJSVNPLTg4NTktMy8vCQlJTlRFUk5BTAkJSVNPODg1OS0zCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktMy8vCQlJU084ODU5LTMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTExMC8vCQlJU08tODg1OS00Ly8KK2FsaWFzCUlTT184ODU5LTQ6MTk4OC8vCUlTTy04ODU5LTQvLworYWxpYXMJSVNPXzg4NTktNC8vCQlJU08tODg1OS00Ly8KK2FsaWFzCUlTTzg4NTktNC8vCQlJU08tODg1OS00Ly8KK2FsaWFzCUlTTzg4NTk0Ly8JCUlTTy04ODU5LTQvLworYWxpYXMJTEFUSU40Ly8JCUlTTy04ODU5LTQvLworYWxpYXMJTDQvLwkJCUlTTy04ODU5LTQvLworYWxpYXMJQ1NJU09MQVRJTjQvLwkJSVNPLTg4NTktNC8vCithbGlhcwk4ODU5XzQvLwkJSVNPLTg4NTktNC8vCithbGlhcwlPU0YwMDAxMDAwNC8vCQlJU08tODg1OS00Ly8KK21vZHVsZQlJU08tODg1OS00Ly8JCUlOVEVSTkFMCQlJU084ODU5LTQJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS00Ly8JCUlTTzg4NTktNAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTQ0Ly8JCUlTTy04ODU5LTUvLworYWxpYXMJSVNPXzg4NTktNToxOTg4Ly8JSVNPLTg4NTktNS8vCithbGlhcwlJU09fODg1OS01Ly8JCUlTTy04ODU5LTUvLworYWxpYXMJSVNPODg1OS01Ly8JCUlTTy04ODU5LTUvLworYWxpYXMJSVNPODg1OTUvLwkJSVNPLTg4NTktNS8vCithbGlhcwlDWVJJTExJQy8vCQlJU08tODg1OS01Ly8KK2FsaWFzCUNTSVNPTEFUSU5DWVJJTExJQy8vCUlTTy04ODU5LTUvLworYWxpYXMJODg1OV81Ly8JCUlTTy04ODU5LTUvLworYWxpYXMJT1NGMDAwMTAwMDUvLwkJSVNPLTg4NTktNS8vCithbGlhcwlJQk05MTUvLwkJSVNPLTg4NTktNS8vCithbGlhcwlDUDkxNS8vCQkJSVNPLTg4NTktNS8vCittb2R1bGUJSVNPLTg4NTktNS8vCQlJTlRFUk5BTAkJSVNPODg1OS01CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktNS8vCQlJU084ODU5LTUJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTEyNy8vCQlJU08tODg1OS02Ly8KK2FsaWFzCUlTT184ODU5LTY6MTk4Ny8vCUlTTy04ODU5LTYvLworYWxpYXMJSVNPXzg4NTktNi8vCQlJU08tODg1OS02Ly8KK2FsaWFzCUlTTzg4NTktNi8vCQlJU08tODg1OS02Ly8KK2FsaWFzCUlTTzg4NTk2Ly8JCUlTTy04ODU5LTYvLworYWxpYXMJRUNNQS0xMTQvLwkJSVNPLTg4NTktNi8vCithbGlhcwlBU01PLTcwOC8vCQlJU08tODg1OS02Ly8KK2FsaWFzCUFSQUJJQy8vCQlJU08tODg1OS02Ly8KK2FsaWFzCUNTSVNPTEFUSU5BUkFCSUMvLwlJU08tODg1OS02Ly8KK2FsaWFzCTg4NTlfNi8vCQlJU08tODg1OS02Ly8KK2FsaWFzCU9TRjAwMDEwMDA2Ly8JCUlTTy04ODU5LTYvLworYWxpYXMJSUJNMTA4OS8vCQlJU08tODg1OS02Ly8KK2FsaWFzCUNQMTA4OS8vCQlJU08tODg1OS02Ly8KK21vZHVsZQlJU08tODg1OS02Ly8JCUlOVEVSTkFMCQlJU084ODU5LTYJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS02Ly8JCUlTTzg4NTktNgkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTI2Ly8JCUlTTy04ODU5LTcvLworYWxpYXMJSVNPXzg4NTktNzoyMDAzLy8JSVNPLTg4NTktNy8vCithbGlhcwlJU09fODg1OS03OjE5ODcvLwlJU08tODg1OS03Ly8KK2FsaWFzCUlTT184ODU5LTcvLwkJSVNPLTg4NTktNy8vCithbGlhcwlJU084ODU5LTcvLwkJSVNPLTg4NTktNy8vCithbGlhcwlJU084ODU5Ny8vCQlJU08tODg1OS03Ly8KK2FsaWFzCUVMT1RfOTI4Ly8JCUlTTy04ODU5LTcvLworYWxpYXMJRUNNQS0xMTgvLwkJSVNPLTg4NTktNy8vCithbGlhcwlHUkVFSy8vCQkJSVNPLTg4NTktNy8vCithbGlhcwlHUkVFSzgvLwkJSVNPLTg4NTktNy8vCithbGlhcwlDU0lTT0xBVElOR1JFRUsvLwlJU08tODg1OS03Ly8KK2FsaWFzCTg4NTlfNy8vCQlJU08tODg1OS03Ly8KK2FsaWFzCU9TRjAwMDEwMDA3Ly8JCUlTTy04ODU5LTcvLworYWxpYXMJSUJNODEzLy8JCUlTTy04ODU5LTcvLworYWxpYXMJQ1A4MTMvLwkJCUlTTy04ODU5LTcvLworbW9kdWxlCUlTTy04ODU5LTcvLwkJSU5URVJOQUwJCUlTTzg4NTktNwkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTcvLwkJSVNPODg1OS03CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xMzgvLwkJSVNPLTg4NTktOC8vCithbGlhcwlJU09fODg1OS04OjE5ODgvLwlJU08tODg1OS04Ly8KK2FsaWFzCUlTT184ODU5LTgvLwkJSVNPLTg4NTktOC8vCithbGlhcwlJU084ODU5LTgvLwkJSVNPLTg4NTktOC8vCithbGlhcwlJU084ODU5OC8vCQlJU08tODg1OS04Ly8KK2FsaWFzCUhFQlJFVy8vCQlJU08tODg1OS04Ly8KK2FsaWFzCUNTSVNPTEFUSU5IRUJSRVcvLwlJU08tODg1OS04Ly8KK2FsaWFzCTg4NTlfOC8vCQlJU08tODg1OS04Ly8KK2FsaWFzCU9TRjAwMDEwMDA4Ly8JCUlTTy04ODU5LTgvLworYWxpYXMJSUJNOTE2Ly8JCUlTTy04ODU5LTgvLworYWxpYXMJQ1A5MTYvLwkJCUlTTy04ODU5LTgvLworbW9kdWxlCUlTTy04ODU5LTgvLwkJSU5URVJOQUwJCUlTTzg4NTktOAkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTgvLwkJSVNPODg1OS04CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xNDgvLwkJSVNPLTg4NTktOS8vCithbGlhcwlJU09fODg1OS05OjE5ODkvLwlJU08tODg1OS05Ly8KK2FsaWFzCUlTT184ODU5LTkvLwkJSVNPLTg4NTktOS8vCithbGlhcwlJU084ODU5LTkvLwkJSVNPLTg4NTktOS8vCithbGlhcwlJU084ODU5OS8vCQlJU08tODg1OS05Ly8KK2FsaWFzCUxBVElONS8vCQlJU08tODg1OS05Ly8KK2FsaWFzCUw1Ly8JCQlJU08tODg1OS05Ly8KK2FsaWFzCUNTSVNPTEFUSU41Ly8JCUlTTy04ODU5LTkvLworYWxpYXMJODg1OV85Ly8JCUlTTy04ODU5LTkvLworYWxpYXMJT1NGMDAwMTAwMDkvLwkJSVNPLTg4NTktOS8vCithbGlhcwlJQk05MjAvLwkJSVNPLTg4NTktOS8vCithbGlhcwlDUDkyMC8vCQkJSVNPLTg4NTktOS8vCithbGlhcwlUUy01ODgxLy8JCUlTTy04ODU5LTkvLworYWxpYXMJRUNNQS0xMjgvLwkJSVNPLTg4NTktOS8vCittb2R1bGUJSVNPLTg4NTktOS8vCQlJTlRFUk5BTAkJSVNPODg1OS05CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktOS8vCQlJU084ODU5LTkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTE1Ny8vCQlJU08tODg1OS0xMC8vCithbGlhcwlJU09fODg1OS0xMDoxOTkyLy8JSVNPLTg4NTktMTAvLworYWxpYXMJSVNPXzg4NTktMTAvLwkJSVNPLTg4NTktMTAvLworYWxpYXMJSVNPODg1OS0xMC8vCQlJU08tODg1OS0xMC8vCithbGlhcwlJU084ODU5MTAvLwkJSVNPLTg4NTktMTAvLworYWxpYXMJTEFUSU42Ly8JCUlTTy04ODU5LTEwLy8KK2FsaWFzCUw2Ly8JCQlJU08tODg1OS0xMC8vCithbGlhcwlDU0lTT0xBVElONi8vCQlJU08tODg1OS0xMC8vCithbGlhcwlPU0YwMDAxMDAwQS8vCQlJU08tODg1OS0xMC8vCittb2R1bGUJSVNPLTg4NTktMTAvLwkJSU5URVJOQUwJCUlTTzg4NTktMTAJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS0xMC8vCQlJU084ODU5LTEwCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTzg4NTktMTEvLwkJSVNPLTg4NTktMTEvLworYWxpYXMJSVNPODg1OTExLy8JCUlTTy04ODU5LTExLy8KK21vZHVsZQlJU08tODg1OS0xMS8vCQlJTlRFUk5BTAkJSVNPODg1OS0xMQkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTExLy8JCUlTTzg4NTktMTEJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPODg1OS0xMy8vCQlJU08tODg1OS0xMy8vCithbGlhcwlJU084ODU5MTMvLwkJSVNPLTg4NTktMTMvLworYWxpYXMJSVNPLUlSLTE3OS8vCQlJU08tODg1OS0xMy8vCithbGlhcwlMQVRJTjcvLwkJSVNPLTg4NTktMTMvLworYWxpYXMJTDcvLwkJCUlTTy04ODU5LTEzLy8KK2FsaWFzCUJBTFRJQy8vCQlJU08tODg1OS0xMy8vCittb2R1bGUJSVNPLTg4NTktMTMvLwkJSU5URVJOQUwJCUlTTzg4NTktMTMJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS0xMy8vCQlJU084ODU5LTEzCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTzg4NTktMTQvLwkJSVNPLTg4NTktMTQvLworYWxpYXMJSVNPODg1OTE0Ly8JCUlTTy04ODU5LTE0Ly8KK2FsaWFzCUlTTy1JUi0xOTkvLwkJSVNPLTg4NTktMTQvLworYWxpYXMJTEFUSU44Ly8JCUlTTy04ODU5LTE0Ly8KK2FsaWFzCUw4Ly8JCQlJU08tODg1OS0xNC8vCithbGlhcwlJU09fODg1OS0xNDoxOTk4Ly8JSVNPLTg4NTktMTQvLworYWxpYXMJSVNPXzg4NTktMTQvLwkJSVNPLTg4NTktMTQvLworYWxpYXMJSVNPLUNFTFRJQy8vCQlJU08tODg1OS0xNC8vCittb2R1bGUJSVNPLTg4NTktMTQvLwkJSU5URVJOQUwJCUlTTzg4NTktMTQJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS0xNC8vCQlJU084ODU5LTE0CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTzg4NTktMTUvLwkJSVNPLTg4NTktMTUvLworYWxpYXMJSVNPODg1OTE1Ly8JCUlTTy04ODU5LTE1Ly8KK2FsaWFzCUlTTy1JUi0yMDMvLwkJSVNPLTg4NTktMTUvLworYWxpYXMJSVNPXzg4NTktMTUvLwkJSVNPLTg4NTktMTUvLworYWxpYXMJTEFUSU4tOS8vCQlJU08tODg1OS0xNS8vCithbGlhcwlMQVRJTjkvLwkJSVNPLTg4NTktMTUvLworYWxpYXMJSVNPXzg4NTktMTU6MTk5OC8vCUlTTy04ODU5LTE1Ly8KK21vZHVsZQlJU08tODg1OS0xNS8vCQlJTlRFUk5BTAkJSVNPODg1OS0xNQkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTE1Ly8JCUlTTzg4NTktMTUJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPODg1OS0xNi8vCQlJU08tODg1OS0xNi8vCithbGlhcwlJU084ODU5MTYvLwkJSVNPLTg4NTktMTYvLworYWxpYXMJSVNPLUlSLTIyNi8vCQlJU08tODg1OS0xNi8vCithbGlhcwlMQVRJTjEwLy8JCUlTTy04ODU5LTE2Ly8KK2FsaWFzCUwxMC8vCQkJSVNPLTg4NTktMTYvLworYWxpYXMJSVNPXzg4NTktMTY6MjAwMS8vCUlTTy04ODU5LTE2Ly8KK2FsaWFzCUlTT184ODU5LTE2Ly8JCUlTTy04ODU5LTE2Ly8KK21vZHVsZQlJU08tODg1OS0xNi8vCQlJTlRFUk5BTAkJSVNPODg1OS0xNgkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTE2Ly8JCUlTTzg4NTktMTYJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJVC42MS8vCQkJVC42MS04QklULy8KK2FsaWFzCUlTTy1JUi0xMDMvLwkJVC42MS04QklULy8KK2FsaWFzCUNTSVNPMTAzVDYxOEJJVC8vCVQuNjEtOEJJVC8vCithbGlhcwlULjYxOEJJVC8vCQlULjYxLThCSVQvLworbW9kdWxlCVQuNjEtOEJJVC8vCQlJTlRFUk5BTAkJVC42MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlULjYxLThCSVQvLwkJVC42MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTE1Ni8vCQlJU09fNjkzNy8vCithbGlhcwlJU09fNjkzNzoxOTkyLy8JCUlTT182OTM3Ly8KK2FsaWFzCUlTTzY5MzcvLwkJSVNPXzY5MzcvLworbW9kdWxlCUlTT182OTM3Ly8JCUlOVEVSTkFMCQlJU09fNjkzNwkxCittb2R1bGUJSU5URVJOQUwJCUlTT182OTM3Ly8JCUlTT182OTM3CTEKKworCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTkwLy8JCUlTT182OTM3LTIvLworYWxpYXMJSVNPXzY5MzctMjoxOTgzLy8JSVNPXzY5MzctMi8vCithbGlhcwlDU0lTTzkwLy8JCUlTT182OTM3LTIvLworYWxpYXMJSVNPXzY5MzcyLy8JCUlTT182OTM3LTIvLworbW9kdWxlCUlTT182OTM3LTIvLwkJSU5URVJOQUwJCUlTT182OTM3LTIJMQorbW9kdWxlCUlOVEVSTkFMCQlJU09fNjkzNy0yLy8JCUlTT182OTM3LTIJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJU0hJRlQtSklTLy8JCVNKSVMvLworYWxpYXMJU0hJRlRfSklTLy8JCVNKSVMvLworYWxpYXMJTVNfS0FOSkkvLwkJU0pJUy8vCithbGlhcwlDU1NISUZUSklTLy8JCVNKSVMvLworbW9kdWxlCVNKSVMvLwkJCUlOVEVSTkFMCQlTSklTCQkxCittb2R1bGUJSU5URVJOQUwJCVNKSVMvLwkJCVNKSVMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVdJTkRPV1MtMzFKLy8JCUNQOTMyLy8KK2FsaWFzCU1TOTMyLy8JCQlDUDkzMi8vCithbGlhcwlTSklTLU9QRU4vLwkJQ1A5MzIvLworYWxpYXMJU0pJUy1XSU4vLwkJQ1A5MzIvLworYWxpYXMJQ1NXSU5ET1dTMzFKLy8JCUNQOTMyLy8KK21vZHVsZQlDUDkzMi8vCQkJSU5URVJOQUwJCUNQOTMyCQkxCittb2R1bGUJSU5URVJOQUwJCUNQOTMyLy8JCQlDUDkzMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJS09JOC8vCQkJS09JLTgvLworbW9kdWxlCUtPSS04Ly8JCQlJTlRFUk5BTAkJS09JLTgJCTEKK21vZHVsZQlJTlRFUk5BTAkJS09JLTgvLwkJCUtPSS04CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0tPSThSLy8JCUtPSTgtUi8vCithbGlhcwlLT0k4Ui8vCQkJS09JOC1SLy8KK21vZHVsZQlLT0k4LVIvLwkJSU5URVJOQUwJCUtPSTgtUgkJMQorbW9kdWxlCUlOVEVSTkFMCQlLT0k4LVIvLwkJS09JOC1SCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTkvLwkJTEFUSU4tR1JFRUsvLworYWxpYXMJQ1NJU08xOUxBVElOR1JFRUsvLwlMQVRJTi1HUkVFSy8vCithbGlhcwlMQVRJTkdSRUVLLy8JCUxBVElOLUdSRUVLLy8KK21vZHVsZQlMQVRJTi1HUkVFSy8vCQlJTlRFUk5BTAkJTEFUSU4tR1JFRUsJMQorbW9kdWxlCUlOVEVSTkFMCQlMQVRJTi1HUkVFSy8vCQlMQVRJTi1HUkVFSwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMjcvLwkJTEFUSU4tR1JFRUstMS8vCithbGlhcwlDU0lTTzI3TEFUSU5HUkVFSzEvLwlMQVRJTi1HUkVFSy0xLy8KK2FsaWFzCUxBVElOR1JFRUsxLy8JCUxBVElOLUdSRUVLLTEvLworbW9kdWxlCUxBVElOLUdSRUVLLTEvLwkJSU5URVJOQUwJCUxBVElOLUdSRUVLLTEJMQorbW9kdWxlCUlOVEVSTkFMCQlMQVRJTi1HUkVFSy0xLy8JCUxBVElOLUdSRUVLLTEJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJUk9NQU44Ly8JCUhQLVJPTUFOOC8vCithbGlhcwlSOC8vCQkJSFAtUk9NQU44Ly8KK2FsaWFzCUNTSFBST01BTjgvLwkJSFAtUk9NQU44Ly8KK2FsaWFzCU9TRjEwMDEwMDAxLy8JCUhQLVJPTUFOOC8vCithbGlhcwlIUFJPTUFOOC8vCQlIUC1ST01BTjgvLworbW9kdWxlCUhQLVJPTUFOOC8vCQlJTlRFUk5BTAkJSFAtUk9NQU44CTEKK21vZHVsZQlJTlRFUk5BTAkJSFAtUk9NQU44Ly8JCUhQLVJPTUFOOAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0VCQ0RJQ0FUREUvLwkJRUJDRElDLUFULURFLy8KK2FsaWFzCUVCQ0RJQ0FUREUvLwkJRUJDRElDLUFULURFLy8KK21vZHVsZQlFQkNESUMtQVQtREUvLwkJSU5URVJOQUwJCUVCQ0RJQy1BVC1ERQkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1BVC1ERS8vCQlFQkNESUMtQVQtREUJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNBVERFQS8vCQlFQkNESUMtQVQtREUtQS8vCithbGlhcwlFQkNESUNBVERFQS8vCQlFQkNESUMtQVQtREUtQS8vCittb2R1bGUJRUJDRElDLUFULURFLUEvLwlJTlRFUk5BTAkJRUJDRElDLUFULURFLUEJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtQVQtREUtQS8vCUVCQ0RJQy1BVC1ERS1BCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDQ0FGUi8vCQlFQkNESUMtQ0EtRlIvLworYWxpYXMJRUJDRElDQ0FGUi8vCQlFQkNESUMtQ0EtRlIvLworbW9kdWxlCUVCQ0RJQy1DQS1GUi8vCQlJTlRFUk5BTAkJRUJDRElDLUNBLUZSCTEKK21vZHVsZQlJTlRFUk5BTAkJRUJDRElDLUNBLUZSLy8JCUVCQ0RJQy1DQS1GUgkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0VCQ0RJQ0RLTk8vLwkJRUJDRElDLURLLU5PLy8KK2FsaWFzCUVCQ0RJQ0RLTk8vLwkJRUJDRElDLURLLU5PLy8KK21vZHVsZQlFQkNESUMtREstTk8vLwkJSU5URVJOQUwJCUVCQ0RJQy1ESy1OTwkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1ESy1OTy8vCQlFQkNESUMtREstTk8JMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNES05PQS8vCQlFQkNESUMtREstTk8tQS8vCithbGlhcwlFQkNESUNES05PQS8vCQlFQkNESUMtREstTk8tQS8vCittb2R1bGUJRUJDRElDLURLLU5PLUEvLwlJTlRFUk5BTAkJRUJDRElDLURLLU5PLUEJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtREstTk8tQS8vCUVCQ0RJQy1ESy1OTy1BCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDRVMvLwkJRUJDRElDLUVTLy8KK2FsaWFzCUVCQ0RJQ0VTLy8JCUVCQ0RJQy1FUy8vCittb2R1bGUJRUJDRElDLUVTLy8JCUlOVEVSTkFMCQlFQkNESUMtRVMJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtRVMvLwkJRUJDRElDLUVTCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDRVNBLy8JCUVCQ0RJQy1FUy1BLy8KK2FsaWFzCUVCQ0RJQ0VTQS8vCQlFQkNESUMtRVMtQS8vCittb2R1bGUJRUJDRElDLUVTLUEvLwkJSU5URVJOQUwJCUVCQ0RJQy1FUy1BCTEKK21vZHVsZQlJTlRFUk5BTAkJRUJDRElDLUVTLUEvLwkJRUJDRElDLUVTLUEJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNFU1MvLwkJRUJDRElDLUVTLVMvLworYWxpYXMJRUJDRElDRVNTLy8JCUVCQ0RJQy1FUy1TLy8KK21vZHVsZQlFQkNESUMtRVMtUy8vCQlJTlRFUk5BTAkJRUJDRElDLUVTLVMJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtRVMtUy8vCQlFQkNESUMtRVMtUwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0VCQ0RJQ0ZJU0UvLwkJRUJDRElDLUZJLVNFLy8KK2FsaWFzCUVCQ0RJQ0ZJU0UvLwkJRUJDRElDLUZJLVNFLy8KK21vZHVsZQlFQkNESUMtRkktU0UvLwkJSU5URVJOQUwJCUVCQ0RJQy1GSS1TRQkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1GSS1TRS8vCQlFQkNESUMtRkktU0UJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNGSVNFQS8vCQlFQkNESUMtRkktU0UtQS8vCithbGlhcwlFQkNESUNGSVNFQS8vCQlFQkNESUMtRkktU0UtQS8vCittb2R1bGUJRUJDRElDLUZJLVNFLUEvLwlJTlRFUk5BTAkJRUJDRElDLUZJLVNFLUEJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtRkktU0UtQS8vCUVCQ0RJQy1GSS1TRS1BCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDRlIvLwkJRUJDRElDLUZSLy8KK2FsaWFzCUVCQ0RJQ0ZSLy8JCUVCQ0RJQy1GUi8vCittb2R1bGUJRUJDRElDLUZSLy8JCUlOVEVSTkFMCQlFQkNESUMtRlIJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtRlIvLwkJRUJDRElDLUZSCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVCQ0RJQ0lTRlJJU1MvLwkJRUJDRElDLUlTLUZSSVNTLy8KK21vZHVsZQlFQkNESUMtSVMtRlJJU1MvLwlJTlRFUk5BTAkJRUJDRElDLUlTLUZSSVNTCTEKK21vZHVsZQlJTlRFUk5BTAkJRUJDRElDLUlTLUZSSVNTLy8JRUJDRElDLUlTLUZSSVNTCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDSVQvLwkJRUJDRElDLUlULy8KK2FsaWFzCUVCQ0RJQ0lULy8JCUVCQ0RJQy1JVC8vCittb2R1bGUJRUJDRElDLUlULy8JCUlOVEVSTkFMCQlFQkNESUMtSVQJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtSVQvLwkJRUJDRElDLUlUCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDUFQvLwkJRUJDRElDLVBULy8KK2FsaWFzCUVCQ0RJQ1BULy8JCUVCQ0RJQy1QVC8vCittb2R1bGUJRUJDRElDLVBULy8JCUlOVEVSTkFMCQlFQkNESUMtUFQJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtUFQvLwkJRUJDRElDLVBUCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDVUsvLwkJRUJDRElDLVVLLy8KK2FsaWFzCUVCQ0RJQ1VLLy8JCUVCQ0RJQy1VSy8vCittb2R1bGUJRUJDRElDLVVLLy8JCUlOVEVSTkFMCQlFQkNESUMtVUsJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtVUsvLwkJRUJDRElDLVVLCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDVVMvLwkJRUJDRElDLVVTLy8KK2FsaWFzCUVCQ0RJQ1VTLy8JCUVCQ0RJQy1VUy8vCittb2R1bGUJRUJDRElDLVVTLy8JCUlOVEVSTkFMCQlFQkNESUMtVVMJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtVVMvLwkJRUJDRElDLVVTCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQMDM3Ly8JCQlJQk0wMzcvLworYWxpYXMJRUJDRElDLUNQLVVTLy8JCUlCTTAzNy8vCithbGlhcwlFQkNESUMtQ1AtQ0EvLwkJSUJNMDM3Ly8KK2FsaWFzCUVCQ0RJQy1DUC1XVC8vCQlJQk0wMzcvLworYWxpYXMJRUJDRElDLUNQLU5MLy8JCUlCTTAzNy8vCithbGlhcwlDU0lCTTAzNy8vCQlJQk0wMzcvLworYWxpYXMJT1NGMTAwMjAwMjUvLwkJSUJNMDM3Ly8KK2FsaWFzCUNQMTA3MC8vCQlJQk0wMzcvLworYWxpYXMJQ1AyODIvLwkJCUlCTTAzNy8vCittb2R1bGUJSUJNMDM3Ly8JCUlOVEVSTkFMCQlJQk0wMzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMDM3Ly8JCUlCTTAzNwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJRUJDRElDLUlOVC8vCQlJQk0wMzgvLworYWxpYXMJQ1AwMzgvLwkJCUlCTTAzOC8vCithbGlhcwlDU0lCTTAzOC8vCQlJQk0wMzgvLworbW9kdWxlCUlCTTAzOC8vCQlJTlRFUk5BTAkJSUJNMDM4CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTAzOC8vCQlJQk0wMzgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVCQ0RJQy1JTlQxLy8JCUlCTTI1Ni8vCittb2R1bGUJSUJNMjU2Ly8JCUlOVEVSTkFMCQlJQk0yNTYJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjU2Ly8JCUlCTTI1NgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AyNzMvLwkJCUlCTTI3My8vCithbGlhcwlDU0lCTTI3My8vCQlJQk0yNzMvLworYWxpYXMJT1NGMTAwMjAxMTEvLwkJSUJNMjczLy8KK21vZHVsZQlJQk0yNzMvLwkJSU5URVJOQUwJCUlCTTI3MwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yNzMvLwkJSUJNMjczCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlFQkNESUMtQkUvLwkJSUJNMjc0Ly8KK2FsaWFzCUNQMjc0Ly8JCQlJQk0yNzQvLworYWxpYXMJQ1NJQk0yNzQvLwkJSUJNMjc0Ly8KK21vZHVsZQlJQk0yNzQvLwkJSU5URVJOQUwJCUlCTTI3NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yNzQvLwkJSUJNMjc0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlFQkNESUMtQlIvLwkJSUJNMjc1Ly8KK2FsaWFzCUNQMjc1Ly8JCQlJQk0yNzUvLworYWxpYXMJQ1NJQk0yNzUvLwkJSUJNMjc1Ly8KK21vZHVsZQlJQk0yNzUvLwkJSU5URVJOQUwJCUlCTTI3NQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yNzUvLwkJSUJNMjc1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlFQkNESUMtQ1AtREsvLwkJSUJNMjc3Ly8KK2FsaWFzCUVCQ0RJQy1DUC1OTy8vCQlJQk0yNzcvLworYWxpYXMJQ1NJQk0yNzcvLwkJSUJNMjc3Ly8KK2FsaWFzCU9TRjEwMDIwMTE1Ly8JCUlCTTI3Ny8vCittb2R1bGUJSUJNMjc3Ly8JCUlOVEVSTkFMCQlJQk0yNzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjc3Ly8JCUlCTTI3NwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AyNzgvLwkJCUlCTTI3OC8vCithbGlhcwlFQkNESUMtQ1AtRkkvLwkJSUJNMjc4Ly8KK2FsaWFzCUVCQ0RJQy1DUC1TRS8vCQlJQk0yNzgvLworYWxpYXMJQ1NJQk0yNzgvLwkJSUJNMjc4Ly8KK2FsaWFzCU9TRjEwMDIwMTE2Ly8JCUlCTTI3OC8vCittb2R1bGUJSUJNMjc4Ly8JCUlOVEVSTkFMCQlJQk0yNzgJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjc4Ly8JCUlCTTI3OAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AyODAvLwkJCUlCTTI4MC8vCithbGlhcwlFQkNESUMtQ1AtSVQvLwkJSUJNMjgwLy8KK2FsaWFzCUNTSUJNMjgwLy8JCUlCTTI4MC8vCithbGlhcwlPU0YxMDAyMDExOC8vCQlJQk0yODAvLworbW9kdWxlCUlCTTI4MC8vCQlJTlRFUk5BTAkJSUJNMjgwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTI4MC8vCQlJQk0yODAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVCQ0RJQy1KUC1FLy8JCUlCTTI4MS8vCithbGlhcwlDUDI4MS8vCQkJSUJNMjgxLy8KK2FsaWFzCUNTSUJNMjgxLy8JCUlCTTI4MS8vCittb2R1bGUJSUJNMjgxLy8JCUlOVEVSTkFMCQlJQk0yODEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjgxLy8JCUlCTTI4MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AyODQvLwkJCUlCTTI4NC8vCithbGlhcwlFQkNESUMtQ1AtRVMvLwkJSUJNMjg0Ly8KK2FsaWFzCUNTSUJNMjg0Ly8JCUlCTTI4NC8vCithbGlhcwlPU0YxMDAyMDExQy8vCQlJQk0yODQvLworYWxpYXMJQ1AxMDc5Ly8JCUlCTTI4NC8vCittb2R1bGUJSUJNMjg0Ly8JCUlOVEVSTkFMCQlJQk0yODQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjg0Ly8JCUlCTTI4NAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AyODUvLwkJCUlCTTI4NS8vCithbGlhcwlFQkNESUMtQ1AtR0IvLwkJSUJNMjg1Ly8KK2FsaWFzCUNTSUJNMjg1Ly8JCUlCTTI4NS8vCithbGlhcwlPU0YxMDAyMDExRC8vCQlJQk0yODUvLworbW9kdWxlCUlCTTI4NS8vCQlJTlRFUk5BTAkJSUJNMjg1CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTI4NS8vCQlJQk0yODUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQMjkwLy8JCQlJQk0yOTAvLworYWxpYXMJRUJDRElDLUpQLUtBTkEvLwlJQk0yOTAvLworYWxpYXMJQ1NJQk0yOTAvLwkJSUJNMjkwLy8KK2FsaWFzCU9TRjEwMDIwMTIyLy8JCUlCTTI5MC8vCittb2R1bGUJSUJNMjkwLy8JCUlOVEVSTkFMCQlJQk0yOTAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjkwLy8JCUlCTTI5MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AyOTcvLwkJCUlCTTI5Ny8vCithbGlhcwlFQkNESUMtQ1AtRlIvLwkJSUJNMjk3Ly8KK2FsaWFzCUNTSUJNMjk3Ly8JCUlCTTI5Ny8vCithbGlhcwlPU0YxMDAyMDEyOS8vCQlJQk0yOTcvLworYWxpYXMJQ1AxMDgxLy8JCUlCTTI5Ny8vCittb2R1bGUJSUJNMjk3Ly8JCUlOVEVSTkFMCQlJQk0yOTcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjk3Ly8JCUlCTTI5NwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A0MjAvLwkJCUlCTTQyMC8vCithbGlhcwlFQkNESUMtQ1AtQVIxLy8JCUlCTTQyMC8vCithbGlhcwlDU0lCTTQyMC8vCQlJQk00MjAvLworYWxpYXMJT1NGMTAwMjAxQTQvLwkJSUJNNDIwLy8KK21vZHVsZQlJQk00MjAvLwkJSU5URVJOQUwJCUlCTTQyMAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk00MjAvLwkJSUJNNDIwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDQyMy8vCQkJSUJNNDIzLy8KK2FsaWFzCUVCQ0RJQy1DUC1HUi8vCQlJQk00MjMvLworYWxpYXMJQ1NJQk00MjMvLwkJSUJNNDIzLy8KK21vZHVsZQlJQk00MjMvLwkJSU5URVJOQUwJCUlCTTQyMwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk00MjMvLwkJSUJNNDIzCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDQyNC8vCQkJSUJNNDI0Ly8KK2FsaWFzCUVCQ0RJQy1DUC1IRS8vCQlJQk00MjQvLworYWxpYXMJQ1NJQk00MjQvLwkJSUJNNDI0Ly8KK2FsaWFzCU9TRjEwMDIwMUE4Ly8JCUlCTTQyNC8vCittb2R1bGUJSUJNNDI0Ly8JCUlOVEVSTkFMCQlJQk00MjQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNNDI0Ly8JCUlCTTQyNAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A0MzcvLwkJCUlCTTQzNy8vCithbGlhcwk0MzcvLwkJCUlCTTQzNy8vCithbGlhcwlDU1BDOENPREVQQUdFNDM3Ly8JSUJNNDM3Ly8KK2FsaWFzCU9TRjEwMDIwMUI1Ly8JCUlCTTQzNy8vCittb2R1bGUJSUJNNDM3Ly8JCUlOVEVSTkFMCQlJQk00MzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNNDM3Ly8JCUlCTTQzNwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A1MDAvLwkJCUlCTTUwMC8vCithbGlhcwk1MDAvLwkJCUlCTTUwMC8vCithbGlhcwk1MDBWMS8vCQkJSUJNNTAwLy8KK2FsaWFzCUVCQ0RJQy1DUC1CRS8vCQlJQk01MDAvLworYWxpYXMJRUJDRElDLUNQLUNILy8JCUlCTTUwMC8vCithbGlhcwlDU0lCTTUwMC8vCQlJQk01MDAvLworYWxpYXMJT1NGMTAwMjAxRjQvLwkJSUJNNTAwLy8KK2FsaWFzCUNQMTA4NC8vCQlJQk01MDAvLworbW9kdWxlCUlCTTUwMC8vCQlJTlRFUk5BTAkJSUJNNTAwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTUwMC8vCQlJQk01MDAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODUwLy8JCQlJQk04NTAvLworYWxpYXMJODUwLy8JCQlJQk04NTAvLworYWxpYXMJQ1NQQzg1ME1VTFRJTElOR1VBTC8vCUlCTTg1MC8vCithbGlhcwlPU0YxMDAyMDM1Mi8vCQlJQk04NTAvLworbW9kdWxlCUlCTTg1MC8vCQlJTlRFUk5BTAkJSUJNODUwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg1MC8vCQlJQk04NTAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODUxLy8JCQlJQk04NTEvLworYWxpYXMJODUxLy8JCQlJQk04NTEvLworYWxpYXMJQ1NJQk04NTEvLwkJSUJNODUxLy8KK21vZHVsZQlJQk04NTEvLwkJSU5URVJOQUwJCUlCTTg1MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NTEvLwkJSUJNODUxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg1Mi8vCQkJSUJNODUyLy8KK2FsaWFzCTg1Mi8vCQkJSUJNODUyLy8KK2FsaWFzCUNTUENQODUyLy8JCUlCTTg1Mi8vCithbGlhcwlPU0YxMDAyMDM1NC8vCQlJQk04NTIvLworbW9kdWxlCUlCTTg1Mi8vCQlJTlRFUk5BTAkJSUJNODUyCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg1Mi8vCQlJQk04NTIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODU1Ly8JCQlJQk04NTUvLworYWxpYXMJODU1Ly8JCQlJQk04NTUvLworYWxpYXMJQ1NJQk04NTUvLwkJSUJNODU1Ly8KK2FsaWFzCU9TRjEwMDIwMzU3Ly8JCUlCTTg1NS8vCittb2R1bGUJSUJNODU1Ly8JCUlOVEVSTkFMCQlJQk04NTUJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODU1Ly8JCUlCTTg1NQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTg1Ni8vCQlJQk04NTYvLworYWxpYXMJQ1A4NTYvLwkJCUlCTTg1Ni8vCithbGlhcwk4NTYvLwkJCUlCTTg1Ni8vCithbGlhcwlDU0lCTTg1Ni8vCQlJQk04NTYvLworbW9kdWxlCUlCTTg1Ni8vCQlJTlRFUk5BTAkJSUJNODU2CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg1Ni8vCQlJQk04NTYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODU3Ly8JCQlJQk04NTcvLworYWxpYXMJODU3Ly8JCQlJQk04NTcvLworYWxpYXMJQ1NJQk04NTcvLwkJSUJNODU3Ly8KK2FsaWFzCU9TRjEwMDIwMzU5Ly8JCUlCTTg1Ny8vCittb2R1bGUJSUJNODU3Ly8JCUlOVEVSTkFMCQlJQk04NTcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODU3Ly8JCUlCTTg1NwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NjAvLwkJCUlCTTg2MC8vCithbGlhcwk4NjAvLwkJCUlCTTg2MC8vCithbGlhcwlDU0lCTTg2MC8vCQlJQk04NjAvLworbW9kdWxlCUlCTTg2MC8vCQlJTlRFUk5BTAkJSUJNODYwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg2MC8vCQlJQk04NjAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODYxLy8JCQlJQk04NjEvLworYWxpYXMJODYxLy8JCQlJQk04NjEvLworYWxpYXMJQ1BJQk04NjEvLwkJSUJNODYxLy8KK2FsaWFzCU9TRjEwMDIwMzVELy8JCUlCTTg2MS8vCittb2R1bGUJSUJNODYxLy8JCUlOVEVSTkFMCQlJQk04NjEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODYxLy8JCUlCTTg2MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NjIvLwkJCUlCTTg2Mi8vCithbGlhcwk4NjIvLwkJCUlCTTg2Mi8vCithbGlhcwlDU1BDODYyTEFUSU5IRUJSRVcvLwlJQk04NjIvLworYWxpYXMJT1NGMTAwMjAzNUUvLwkJSUJNODYyLy8KK21vZHVsZQlJQk04NjIvLwkJSU5URVJOQUwJCUlCTTg2MgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NjIvLwkJSUJNODYyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg2My8vCQkJSUJNODYzLy8KK2FsaWFzCTg2My8vCQkJSUJNODYzLy8KK2FsaWFzCUNTSUJNODYzLy8JCUlCTTg2My8vCithbGlhcwlPU0YxMDAyMDM1Ri8vCQlJQk04NjMvLworbW9kdWxlCUlCTTg2My8vCQlJTlRFUk5BTAkJSUJNODYzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg2My8vCQlJQk04NjMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODY0Ly8JCQlJQk04NjQvLworYWxpYXMJODY0Ly8JCQlJQk04NjQvLworYWxpYXMJQ1NJQk04NjQvLwkJSUJNODY0Ly8KK2FsaWFzCU9TRjEwMDIwMzYwLy8JCUlCTTg2NC8vCittb2R1bGUJSUJNODY0Ly8JCUlOVEVSTkFMCQlJQk04NjQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODY0Ly8JCUlCTTg2NAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NjUvLwkJCUlCTTg2NS8vCithbGlhcwk4NjUvLwkJCUlCTTg2NS8vCithbGlhcwlDU0lCTTg2NS8vCQlJQk04NjUvLworbW9kdWxlCUlCTTg2NS8vCQlJTlRFUk5BTAkJSUJNODY1CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg2NS8vCQlJQk04NjUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODY2Ly8JCQlJQk04NjYvLworYWxpYXMJODY2Ly8JCQlJQk04NjYvLworYWxpYXMJQ1NJQk04NjYvLwkJSUJNODY2Ly8KK21vZHVsZQlJQk04NjYvLwkJSU5URVJOQUwJCUlCTTg2NgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NjYvLwkJSUJNODY2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg2Nk5BVi8vCQlJQk04NjZOQVYvLworYWxpYXMJODY2TkFWLy8JCUlCTTg2Nk5BVi8vCittb2R1bGUJSUJNODY2TkFWLy8JCUlOVEVSTkFMCQlJQk04NjZOQVYJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NjZOQVYvLwkJSUJNODY2TkFWCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODY4Ly8JCQlJQk04NjgvLworYWxpYXMJQ1AtQVIvLwkJCUlCTTg2OC8vCithbGlhcwlDU0lCTTg2OC8vCQlJQk04NjgvLworYWxpYXMJT1NGMTAwMjAzNjQvLwkJSUJNODY4Ly8KK21vZHVsZQlJQk04NjgvLwkJSU5URVJOQUwJCUlCTTg2OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NjgvLwkJSUJNODY4CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg2OS8vCQkJSUJNODY5Ly8KK2FsaWFzCTg2OS8vCQkJSUJNODY5Ly8KK2FsaWFzCUNQLUdSLy8JCQlJQk04NjkvLworYWxpYXMJQ1NJQk04NjkvLwkJSUJNODY5Ly8KK2FsaWFzCU9TRjEwMDIwMzY1Ly8JCUlCTTg2OS8vCittb2R1bGUJSUJNODY5Ly8JCUlOVEVSTkFMCQlJQk04NjkJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODY5Ly8JCUlCTTg2OQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NzAvLwkJCUlCTTg3MC8vCithbGlhcwlFQkNESUMtQ1AtUk9FQ0UvLwlJQk04NzAvLworYWxpYXMJRUJDRElDLUNQLVlVLy8JCUlCTTg3MC8vCithbGlhcwlDU0lCTTg3MC8vCQlJQk04NzAvLworYWxpYXMJT1NGMTAwMjAzNjYvLwkJSUJNODcwLy8KK21vZHVsZQlJQk04NzAvLwkJSU5URVJOQUwJCUlCTTg3MAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NzAvLwkJSUJNODcwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg3MS8vCQkJSUJNODcxLy8KK2FsaWFzCUVCQ0RJQy1DUC1JUy8vCQlJQk04NzEvLworYWxpYXMJQ1NJQk04NzEvLwkJSUJNODcxLy8KK2FsaWFzCU9TRjEwMDIwMzY3Ly8JCUlCTTg3MS8vCittb2R1bGUJSUJNODcxLy8JCUlOVEVSTkFMCQlJQk04NzEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODcxLy8JCUlCTTg3MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NzUvLwkJCUlCTTg3NS8vCithbGlhcwlFQkNESUMtR1JFRUsvLwkJSUJNODc1Ly8KK2FsaWFzCU9TRjEwMDIwMzZCLy8JCUlCTTg3NS8vCittb2R1bGUJSUJNODc1Ly8JCUlOVEVSTkFMCQlJQk04NzUJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODc1Ly8JCUlCTTg3NQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4ODAvLwkJCUlCTTg4MC8vCithbGlhcwlFQkNESUMtQ1lSSUxMSUMvLwlJQk04ODAvLworYWxpYXMJQ1NJQk04ODAvLwkJSUJNODgwLy8KK2FsaWFzCU9TRjEwMDIwMzcwLy8JCUlCTTg4MC8vCittb2R1bGUJSUJNODgwLy8JCUlOVEVSTkFMCQlJQk04ODAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODgwLy8JCUlCTTg4MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4OTEvLwkJCUlCTTg5MS8vCithbGlhcwlDU0lCTTg5MS8vCQlJQk04OTEvLworYWxpYXMJT1NGMTAwMjAzN0IvLwkJSUJNODkxLy8KK21vZHVsZQlJQk04OTEvLwkJSU5URVJOQUwJCUlCTTg5MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04OTEvLwkJSUJNODkxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDkwMy8vCQkJSUJNOTAzLy8KK2FsaWFzCUNTSUJNOTAzLy8JCUlCTTkwMy8vCithbGlhcwlPU0YxMDAyMDM4Ny8vCQlJQk05MDMvLworbW9kdWxlCUlCTTkwMy8vCQlJTlRFUk5BTAkJSUJNOTAzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkwMy8vCQlJQk05MDMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQOTA0Ly8JCQlJQk05MDQvLworYWxpYXMJOTA0Ly8JCQlJQk05MDQvLworYWxpYXMJQ1NJQk05MDQvLwkJSUJNOTA0Ly8KK2FsaWFzCU9TRjEwMDIwMzg4Ly8JCUlCTTkwNC8vCittb2R1bGUJSUJNOTA0Ly8JCUlOVEVSTkFMCQlJQk05MDQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTA0Ly8JCUlCTTkwNAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A5MDUvLwkJCUlCTTkwNS8vCithbGlhcwlFQkNESUMtQ1AtVFIvLwkJSUJNOTA1Ly8KK2FsaWFzCUNTSUJNOTA1Ly8JCUlCTTkwNS8vCittb2R1bGUJSUJNOTA1Ly8JCUlOVEVSTkFMCQlJQk05MDUJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTA1Ly8JCUlCTTkwNQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A5MTgvLwkJCUlCTTkxOC8vCithbGlhcwlFQkNESUMtQ1AtQVIyLy8JCUlCTTkxOC8vCithbGlhcwlDU0lCTTkxOC8vCQlJQk05MTgvLworYWxpYXMJT1NGMTAwMjAzOTYvLwkJSUJNOTE4Ly8KK21vZHVsZQlJQk05MTgvLwkJSU5URVJOQUwJCUlCTTkxOAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05MTgvLwkJSUJNOTE4CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tOTIyLy8JCUlCTTkyMi8vCithbGlhcwlDUDkyMi8vCQkJSUJNOTIyLy8KK2FsaWFzCUNTSUJNOTIyLy8JCUlCTTkyMi8vCittb2R1bGUJSUJNOTIyLy8JCUlOVEVSTkFMCQlJQk05MjIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTIyLy8JCUlCTTkyMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkzMC8vCQlJQk05MzAvLworYWxpYXMJQ1A5MzAvLwkJCUlCTTkzMC8vCithbGlhcwlDU0lCTTkzMC8vCQlJQk05MzAvLworbW9kdWxlCUlCTTkzMC8vCQlJTlRFUk5BTAkJSUJNOTMwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkzMC8vCQlJQk05MzAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MzIvLwkJSUJNOTMyLy8KK2FsaWFzCUNTSUJNOTMyLy8JCUlCTTkzMi8vCittb2R1bGUJSUJNOTMyLy8JCUlOVEVSTkFMCQlJQk05MzIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTMyLy8JCUlCTTkzMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkzMy8vCQlJQk05MzMvLworYWxpYXMJQ1A5MzMvLwkJCUlCTTkzMy8vCithbGlhcwlDU0lCTTkzMy8vCQlJQk05MzMvLworbW9kdWxlCUlCTTkzMy8vCQlJTlRFUk5BTAkJSUJNOTMzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkzMy8vCQlJQk05MzMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MzUvLwkJSUJNOTM1Ly8KK2FsaWFzCUNQOTM1Ly8JCQlJQk05MzUvLworYWxpYXMJQ1NJQk05MzUvLwkJSUJNOTM1Ly8KK21vZHVsZQlJQk05MzUvLwkJSU5URVJOQUwJCUlCTTkzNQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05MzUvLwkJSUJNOTM1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tOTM3Ly8JCUlCTTkzNy8vCithbGlhcwlDUDkzNy8vCQkJSUJNOTM3Ly8KK2FsaWFzCUNTSUJNOTM3Ly8JCUlCTTkzNy8vCittb2R1bGUJSUJNOTM3Ly8JCUlOVEVSTkFMCQlJQk05MzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTM3Ly8JCUlCTTkzNwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkzOS8vCQlJQk05MzkvLworYWxpYXMJQ1A5MzkvLwkJCUlCTTkzOS8vCithbGlhcwlDU0lCTTkzOS8vCQlJQk05MzkvLworbW9kdWxlCUlCTTkzOS8vCQlJTlRFUk5BTAkJSUJNOTM5CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkzOS8vCQlJQk05MzkJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05NDMvLwkJSUJNOTQzLy8KK2FsaWFzCUNTSUJNOTQzLy8JCUlCTTk0My8vCittb2R1bGUJSUJNOTQzLy8JCUlOVEVSTkFMCQlJQk05NDMJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTQzLy8JCUlCTTk0MwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AxMDA0Ly8JCUlCTTEwMDQvLworYWxpYXMJT1MyTEFUSU4xLy8JCUlCTTEwMDQvLworbW9kdWxlCUlCTTEwMDQvLwkJSU5URVJOQUwJCUlCTTEwMDQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTAwNC8vCQlJQk0xMDA0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDEwMjYvLwkJSUJNMTAyNi8vCithbGlhcwkxMDI2Ly8JCQlJQk0xMDI2Ly8KK2FsaWFzCUNTSUJNMTAyNi8vCQlJQk0xMDI2Ly8KK2FsaWFzCU9TRjEwMDIwNDAyLy8JCUlCTTEwMjYvLworbW9kdWxlCUlCTTEwMjYvLwkJSU5URVJOQUwJCUlCTTEwMjYJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTAyNi8vCQlJQk0xMDI2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTA0Ni8vCQlJQk0xMDQ2Ly8KK2FsaWFzCUNQMTA0Ni8vCQlJQk0xMDQ2Ly8KK2FsaWFzCTEwNDYvLwkJCUlCTTEwNDYvLworbW9kdWxlCUlCTTEwNDYvLwkJSU5URVJOQUwJCUlCTTEwNDYJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTA0Ni8vCQlJQk0xMDQ2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTA0Ny8vCQlJQk0xMDQ3Ly8KK2FsaWFzCUNQMTA0Ny8vCQlJQk0xMDQ3Ly8KK2FsaWFzCTEwNDcvLwkJCUlCTTEwNDcvLworYWxpYXMJT1NGMTAwMjA0MTcvLwkJSUJNMTA0Ny8vCittb2R1bGUJSUJNMTA0Ny8vCQlJTlRFUk5BTAkJSUJNMTA0NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMDQ3Ly8JCUlCTTEwNDcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTI0Ly8JCUlCTTExMjQvLworYWxpYXMJQ1AxMTI0Ly8JCUlCTTExMjQvLworYWxpYXMJQ1NJQk0xMTI0Ly8JCUlCTTExMjQvLworbW9kdWxlCUlCTTExMjQvLwkJSU5URVJOQUwJCUlCTTExMjQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTEyNC8vCQlJQk0xMTI0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTEyOS8vCQlJQk0xMTI5Ly8KK2FsaWFzCUNQMTEyOS8vCQlJQk0xMTI5Ly8KK2FsaWFzCUNTSUJNMTEyOS8vCQlJQk0xMTI5Ly8KK21vZHVsZQlJQk0xMTI5Ly8JCUlOVEVSTkFMCQlJQk0xMTI5CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExMjkvLwkJSUJNMTEyOQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNjAvLwkJSUJNMTE2MC8vCithbGlhcwlDUDExNjAvLwkJSUJNMTE2MC8vCithbGlhcwlDU0lCTTExNjAvLwkJSUJNMTE2MC8vCittb2R1bGUJSUJNMTE2MC8vCQlJTlRFUk5BTAkJSUJNMTE2MAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTYwLy8JCUlCTTExNjAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTYxLy8JCUlCTTExNjEvLworYWxpYXMJQ1AxMTYxLy8JCUlCTTExNjEvLworYWxpYXMJQ1NJQk0xMTYxLy8JCUlCTTExNjEvLworbW9kdWxlCUlCTTExNjEvLwkJSU5URVJOQUwJCUlCTTExNjEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE2MS8vCQlJQk0xMTYxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTEzMi8vCQlJQk0xMTMyLy8KK2FsaWFzCUNQMTEzMi8vCQlJQk0xMTMyLy8KK2FsaWFzCUNTSUJNMTEzMi8vCQlJQk0xMTMyLy8KK21vZHVsZQlJQk0xMTMyLy8JCUlOVEVSTkFMCQlJQk0xMTMyCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExMzIvLwkJSUJNMTEzMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExMzMvLwkJSUJNMTEzMy8vCithbGlhcwlDUDExMzMvLwkJSUJNMTEzMy8vCithbGlhcwlDU0lCTTExMzMvLwkJSUJNMTEzMy8vCittb2R1bGUJSUJNMTEzMy8vCQlJTlRFUk5BTAkJSUJNMTEzMwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTMzLy8JCUlCTTExMzMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTYyLy8JCUlCTTExNjIvLworYWxpYXMJQ1AxMTYyLy8JCUlCTTExNjIvLworYWxpYXMJQ1NJQk0xMTYyMTE2Mi8vCQlJQk0xMTYyLy8KK21vZHVsZQlJQk0xMTYyLy8JCUlOVEVSTkFMCQlJQk0xMTYyCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNjIvLwkJSUJNMTE2MgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNjMvLwkJSUJNMTE2My8vCithbGlhcwlDUDExNjMvLwkJSUJNMTE2My8vCithbGlhcwlDU0lCTTExNjMvLwkJSUJNMTE2My8vCittb2R1bGUJSUJNMTE2My8vCQlJTlRFUk5BTAkJSUJNMTE2MwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTYzLy8JCUlCTTExNjMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTY0Ly8JCUlCTTExNjQvLworYWxpYXMJQ1AxMTY0Ly8JCUlCTTExNjQvLworYWxpYXMJQ1NJQk0xMTY0Ly8JCUlCTTExNjQvLworbW9kdWxlCUlCTTExNjQvLwkJSU5URVJOQUwJCUlCTTExNjQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE2NC8vCQlJQk0xMTY0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlFVUNLUi8vCQkJRVVDLUtSLy8KK2FsaWFzCUNTRVVDS1IvLwkJRVVDLUtSLy8KK2FsaWFzCU9TRjAwMDQwMDBhLy8JCUVVQy1LUi8vCittb2R1bGUJRVVDLUtSLy8JCUlOVEVSTkFMCQlFVUMtS1IJCTEKK21vZHVsZQlJTlRFUk5BTAkJRVVDLUtSLy8JCUVVQy1LUgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJTVNDUDk0OS8vCQlVSEMvLworYWxpYXMJQ1A5NDkvLwkJCVVIQy8vCithbGlhcwlPU0YxMDAyMDNCNS8vCQlVSEMvLworbW9kdWxlCVVIQy8vCQkJSU5URVJOQUwJCVVIQwkJMQorbW9kdWxlCUlOVEVSTkFMCQlVSEMvLwkJCVVIQwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJTVNDUDEzNjEvLwkJSk9IQUIvLworYWxpYXMJQ1AxMzYxLy8JCUpPSEFCLy8KK21vZHVsZQlKT0hBQi8vCQkJSU5URVJOQUwJCUpPSEFCCQkxCittb2R1bGUJSU5URVJOQUwJCUpPSEFCLy8JCQlKT0hBQgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQklHLUZJVkUvLwkJQklHNS8vCithbGlhcwlCSUdGSVZFLy8JCUJJRzUvLworYWxpYXMJQklHLTUvLwkJCUJJRzUvLworYWxpYXMJQ04tQklHNS8vCQlCSUc1Ly8KK2FsaWFzCUNQOTUwLy8JCQlCSUc1Ly8KK21vZHVsZQlCSUc1Ly8JCQlJTlRFUk5BTAkJQklHNQkJMQorbW9kdWxlCUlOVEVSTkFMCQlCSUc1Ly8JCQlCSUc1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlCSUc1LUhLU0NTLy8JCUJJRzVIS1NDUy8vCittb2R1bGUJQklHNUhLU0NTLy8JCUlOVEVSTkFMCQlCSUc1SEtTQ1MJMQorbW9kdWxlCUlOVEVSTkFMCQlCSUc1SEtTQ1MvLwkJQklHNUhLU0NTCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVVQ0pQLU1TLy8JCUVVQy1KUC1NUy8vCithbGlhcwlFVUNKUC1PUEVOLy8JCUVVQy1KUC1NUy8vCithbGlhcwlFVUNKUC1XSU4vLwkJRVVDLUpQLU1TLy8KK21vZHVsZQlFVUMtSlAtTVMvLwkJSU5URVJOQUwJCUVVQy1KUC1NUwkxCittb2R1bGUJSU5URVJOQUwJCUVVQy1KUC1NUy8vCQlFVUMtSlAtTVMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJRVVDSlAvLwkJCUVVQy1KUC8vCithbGlhcwlDU0VVQ1BLREZNVEpBUEFORVNFLy8JRVVDLUpQLy8KK2FsaWFzCU9TRjAwMDMwMDEwLy8JCUVVQy1KUC8vCithbGlhcwlVSklTLy8JCQlFVUMtSlAvLworbW9kdWxlCUVVQy1KUC8vCQlJTlRFUk5BTAkJRVVDLUpQCQkxCittb2R1bGUJSU5URVJOQUwJCUVVQy1KUC8vCQlFVUMtSlAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVVQ0NOLy8JCQlFVUMtQ04vLworYWxpYXMJR0IyMzEyLy8JCUVVQy1DTi8vCithbGlhcwljc0dCMjMxMi8vCQlFVUMtQ04vLworYWxpYXMJQ04tR0IvLwkJCUVVQy1DTi8vCittb2R1bGUJRVVDLUNOLy8JCUlOVEVSTkFMCQlFVUMtQ04JCTEKK21vZHVsZQlJTlRFUk5BTAkJRVVDLUNOLy8JCUVVQy1DTgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUVVQy1DTi8vCQlCSUc1Ly8JCQlHQkJJRzUJCTEKK21vZHVsZQlCSUc1Ly8JCQlFVUMtQ04vLwkJR0JCSUc1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlHQjEzMDAwLy8JCUdCSy8vCithbGlhcwlDUDkzNi8vCQkJR0JLLy8KK2FsaWFzCU1TOTM2Ly8JCQlHQksvLworYWxpYXMJV0lORE9XUy05MzYvLwkJR0JLLy8KK21vZHVsZQlHQksvLwkJCUlOVEVSTkFMCQlHQksJCTEKK21vZHVsZQlJTlRFUk5BTAkJR0JLLy8JCQlHQksJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlHQksvLwkJCUVVQy1DTi8vCQlHQkdCSwkJMQorbW9kdWxlCUVVQy1DTi8vCQlHQksvLwkJCUdCR0JLCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlFVUNUVy8vCQkJRVVDLVRXLy8KK2FsaWFzCU9TRjAwMDUwMDBhLy8JCUVVQy1UVy8vCittb2R1bGUJRVVDLVRXLy8JCUlOVEVSTkFMCQlFVUMtVFcJCTEKK21vZHVsZQlJTlRFUk5BTAkJRVVDLVRXLy8JCUVVQy1UVwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJUlVTQ0lJLy8JCUNQMTEyNS8vCithbGlhcwlJQk04NDgvLwkJQ1AxMTI1Ly8KK21vZHVsZQlDUDExMjUvLwkJSU5URVJOQUwJCUNQMTEyNQkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDExMjUvLwkJQ1AxMTI1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlNUy1FRS8vCQkJQ1AxMjUwLy8KK2FsaWFzCVdJTkRPV1MtMTI1MC8vCQlDUDEyNTAvLworbW9kdWxlCUNQMTI1MC8vCQlJTlRFUk5BTAkJQ1AxMjUwCQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1MC8vCQlDUDEyNTAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1TLUNZUkwvLwkJQ1AxMjUxLy8KK2FsaWFzCVdJTkRPV1MtMTI1MS8vCQlDUDEyNTEvLworbW9kdWxlCUNQMTI1MS8vCQlJTlRFUk5BTAkJQ1AxMjUxCQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1MS8vCQlDUDEyNTEJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1TLUFOU0kvLwkJQ1AxMjUyLy8KK2FsaWFzCVdJTkRPV1MtMTI1Mi8vCQlDUDEyNTIvLworbW9kdWxlCUNQMTI1Mi8vCQlJTlRFUk5BTAkJQ1AxMjUyCQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1Mi8vCQlDUDEyNTIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1TLUdSRUVLLy8JCUNQMTI1My8vCithbGlhcwlXSU5ET1dTLTEyNTMvLwkJQ1AxMjUzLy8KK21vZHVsZQlDUDEyNTMvLwkJSU5URVJOQUwJCUNQMTI1MwkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDEyNTMvLwkJQ1AxMjUzCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlNUy1UVVJLLy8JCUNQMTI1NC8vCithbGlhcwlXSU5ET1dTLTEyNTQvLwkJQ1AxMjU0Ly8KK21vZHVsZQlDUDEyNTQvLwkJSU5URVJOQUwJCUNQMTI1NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDEyNTQvLwkJQ1AxMjU0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlNUy1IRUJSLy8JCUNQMTI1NS8vCithbGlhcwlXSU5ET1dTLTEyNTUvLwkJQ1AxMjU1Ly8KK21vZHVsZQlDUDEyNTUvLwkJSU5URVJOQUwJCUNQMTI1NQkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDEyNTUvLwkJQ1AxMjU1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlNUy1BUkFCLy8JCUNQMTI1Ni8vCithbGlhcwlXSU5ET1dTLTEyNTYvLwkJQ1AxMjU2Ly8KK21vZHVsZQlDUDEyNTYvLwkJSU5URVJOQUwJCUNQMTI1NgkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDEyNTYvLwkJQ1AxMjU2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlXSU5CQUxUUklNLy8JCUNQMTI1Ny8vCithbGlhcwlXSU5ET1dTLTEyNTcvLwkJQ1AxMjU3Ly8KK21vZHVsZQlDUDEyNTcvLwkJSU5URVJOQUwJCUNQMTI1NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDEyNTcvLwkJQ1AxMjU3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlXSU5ET1dTLTEyNTgvLwkJQ1AxMjU4Ly8KK21vZHVsZQlDUDEyNTgvLwkJSU5URVJOQUwJCUNQMTI1OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDEyNTgvLwkJQ1AxMjU4CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwk4NzQvLwkJCUlCTTg3NC8vCithbGlhcwlDUDg3NC8vCQkJSUJNODc0Ly8KK2FsaWFzCVdJTkRPV1MtODc0Ly8JCUlCTTg3NC8vCittb2R1bGUJSUJNODc0Ly8JCUlOVEVSTkFMCQlJQk04NzQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODc0Ly8JCUlCTTg3NAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUNQNzM3Ly8JCQlJTlRFUk5BTAkJQ1A3MzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1A3MzcvLwkJCUNQNzM3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJQ1A3NzAvLwkJCUlOVEVSTkFMCQlDUDc3MAkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDc3MC8vCQkJQ1A3NzAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlDUDc3MS8vCQkJSU5URVJOQUwJCUNQNzcxCQkxCittb2R1bGUJSU5URVJOQUwJCUNQNzcxLy8JCQlDUDc3MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUNQNzcyLy8JCQlJTlRFUk5BTAkJQ1A3NzIJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1A3NzIvLwkJCUNQNzcyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJQ1A3NzMvLwkJCUlOVEVSTkFMCQlDUDc3MwkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDc3My8vCQkJQ1A3NzMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlDUDc3NC8vCQkJSU5URVJOQUwJCUNQNzc0CQkxCittb2R1bGUJSU5URVJOQUwJCUNQNzc0Ly8JCQlDUDc3NAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNNzc1Ly8JCUNQNzc1Ly8KK2FsaWFzCUNTUEM3NzVCQUxUSUMvLwkJQ1A3NzUvLworbW9kdWxlCUNQNzc1Ly8JCQlJTlRFUk5BTAkJQ1A3NzUJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1A3NzUvLwkJCUNQNzc1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0lTTzIwMjJKUC8vCQlJU08tMjAyMi1KUC8vCithbGlhcwlJU08yMDIySlAvLwkJSVNPLTIwMjItSlAvLworbW9kdWxlCUlTTy0yMDIyLUpQLy8JCUlOVEVSTkFMCQlJU08tMjAyMi1KUAkxCittb2R1bGUJSU5URVJOQUwJCUlTTy0yMDIyLUpQLy8JCUlTTy0yMDIyLUpQCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTSVNPMjAyMkpQMi8vCQlJU08tMjAyMi1KUC0yLy8KK2FsaWFzCUlTTzIwMjJKUDIvLwkJSVNPLTIwMjItSlAtMi8vCittb2R1bGUJSVNPLTIwMjItSlAtMi8vCQlJTlRFUk5BTAkJSVNPLTIwMjItSlAJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tMjAyMi1KUC0yLy8JCUlTTy0yMDIyLUpQCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlJU08tMjAyMi1KUC0zLy8JCUlOVEVSTkFMCQlJU08tMjAyMi1KUC0zCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTIwMjItSlAtMy8vCQlJU08tMjAyMi1KUC0zCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTSVNPMjAyMktSLy8JCUlTTy0yMDIyLUtSLy8KK2FsaWFzCUlTTzIwMjJLUi8vCQlJU08tMjAyMi1LUi8vCittb2R1bGUJSVNPLTIwMjItS1IvLwkJSU5URVJOQUwJCUlTTy0yMDIyLUtSCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTIwMjItS1IvLwkJSVNPLTIwMjItS1IJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NJU08yMDIyQ04vLwkJSVNPLTIwMjItQ04vLworYWxpYXMJSVNPMjAyMkNOLy8JCUlTTy0yMDIyLUNOLy8KK21vZHVsZQlJU08tMjAyMi1DTi8vCQlJTlRFUk5BTAkJSVNPLTIwMjItQ04JMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tMjAyMi1DTi8vCQlJU08tMjAyMi1DTgkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08yMDIyQ05FWFQvLwkJSVNPLTIwMjItQ04tRVhULy8KK21vZHVsZQlJU08tMjAyMi1DTi1FWFQvLwlJTlRFUk5BTAkJSVNPLTIwMjItQ04tRVhUCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTIwMjItQ04tRVhULy8JSVNPLTIwMjItQ04tRVhUCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1BQy8vCQkJTUFDSU5UT1NILy8KK2FsaWFzCUNTTUFDSU5UT1NILy8JCU1BQ0lOVE9TSC8vCittb2R1bGUJTUFDSU5UT1NILy8JCUlOVEVSTkFMCQlNQUNJTlRPU0gJMQorbW9kdWxlCUlOVEVSTkFMCQlNQUNJTlRPU0gvLwkJTUFDSU5UT1NICTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xNDMvLwkJSUVDX1AyNy0xLy8KK2FsaWFzCUNTSVNPMTQzSUVDUDI3MS8vCUlFQ19QMjctMS8vCithbGlhcwlJRUNfUDI3MS8vCQlJRUNfUDI3LTEvLworbW9kdWxlCUlFQ19QMjctMS8vCQlJTlRFUk5BTAkJSUVDX1AyNy0xCTEKK21vZHVsZQlJTlRFUk5BTAkJSUVDX1AyNy0xLy8JCUlFQ19QMjctMQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU09fOTAzNi8vCQlBU01PXzQ0OS8vCithbGlhcwlBUkFCSUM3Ly8JCUFTTU9fNDQ5Ly8KK2FsaWFzCUlTTy1JUi04OS8vCQlBU01PXzQ0OS8vCithbGlhcwlDU0lTTzg5QVNNTzQ0OS8vCUFTTU9fNDQ5Ly8KK21vZHVsZQlBU01PXzQ0OS8vCQlJTlRFUk5BTAkJQVNNT180NDkJMQorbW9kdWxlCUlOVEVSTkFMCQlBU01PXzQ0OS8vCQlBU01PXzQ0OQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlBTlNJX1gzLjExMC0xOTgzLy8JQU5TSV9YMy4xMTAvLworYWxpYXMJSVNPLUlSLTk5Ly8JCUFOU0lfWDMuMTEwLy8KK2FsaWFzCUNTQV9UNTAwLTE5ODMvLwkJQU5TSV9YMy4xMTAvLworYWxpYXMJQ1NBX1Q1MDAvLwkJQU5TSV9YMy4xMTAvLworYWxpYXMJTkFQTFBTLy8JCUFOU0lfWDMuMTEwLy8KK2FsaWFzCUNTSVNPOTlOQVBMUFMvLwkJQU5TSV9YMy4xMTAvLworbW9kdWxlCUFOU0lfWDMuMTEwLy8JCUlOVEVSTkFMCQlBTlNJX1gzLjExMAkxCittb2R1bGUJSU5URVJOQUwJCUFOU0lfWDMuMTEwLy8JCUFOU0lfWDMuMTEwCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xMzkvLwkJQ1NOXzM2OTEwMy8vCithbGlhcwlDU0lTTzEzOUNTTjM2OTEwMy8vCUNTTl8zNjkxMDMvLworbW9kdWxlCUNTTl8zNjkxMDMvLwkJSU5URVJOQUwJCUNTTl8zNjkxMDMJMQorbW9kdWxlCUlOVEVSTkFMCQlDU05fMzY5MTAzLy8JCUNTTl8zNjkxMDMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1dJLTIvLwkJCUNXSS8vCithbGlhcwlDUC1IVS8vCQkJQ1dJLy8KK21vZHVsZQlDV0kvLwkJCUlOVEVSTkFMCQlDV0kJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1dJLy8JCQlDV0kJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCURFQy8vCQkJREVDLU1DUy8vCithbGlhcwlDU0RFQ01DUy8vCQlERUMtTUNTLy8KK2FsaWFzCURFQ01DUy8vCQlERUMtTUNTLy8KK21vZHVsZQlERUMtTUNTLy8JCUlOVEVSTkFMCQlERUMtTUNTCQkxCittb2R1bGUJSU5URVJOQUwJCURFQy1NQ1MvLwkJREVDLU1DUwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTExMS8vCQlFQ01BLUNZUklMTElDLy8KK2FsaWFzCUNTSVNPMTExRUNNQUNZUklMTElDLy8JRUNNQS1DWVJJTExJQy8vCithbGlhcwlFQ01BQ1lSSUxMSUMvLwkJRUNNQS1DWVJJTExJQy8vCittb2R1bGUJRUNNQS1DWVJJTExJQy8vCQlJTlRFUk5BTAkJRUNNQS1DWVJJTExJQwkxCittb2R1bGUJSU5URVJOQUwJCUVDTUEtQ1lSSUxMSUMvLwkJRUNNQS1DWVJJTExJQwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlTVF9TRVZfMzU4LTg4Ly8JCUdPU1RfMTk3NjgtNzQvLworYWxpYXMJR09TVF8xOTc2OC8vCQlHT1NUXzE5NzY4LTc0Ly8KK2FsaWFzCUlTTy1JUi0xNTMvLwkJR09TVF8xOTc2OC03NC8vCithbGlhcwlDU0lTTzE1M0dPU1QxOTc2ODc0Ly8JR09TVF8xOTc2OC03NC8vCithbGlhcwlHT1NUXzE5NzY4NzQvLwkJR09TVF8xOTc2OC03NC8vCittb2R1bGUJR09TVF8xOTc2OC03NC8vCQlJTlRFUk5BTAkJR09TVF8xOTc2OC03NAkxCittb2R1bGUJSU5URVJOQUwJCUdPU1RfMTk3NjgtNzQvLwkJR09TVF8xOTc2OC03NAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTUwLy8JCUdSRUVLLUNDSVRULy8KK2FsaWFzCUNTSVNPMTUwLy8JCUdSRUVLLUNDSVRULy8KK2FsaWFzCUNTSVNPMTUwR1JFRUtDQ0lUVC8vCUdSRUVLLUNDSVRULy8KK2FsaWFzCUdSRUVLQ0NJVFQvLwkJR1JFRUstQ0NJVFQvLworbW9kdWxlCUdSRUVLLUNDSVRULy8JCUlOVEVSTkFMCQlHUkVFSy1DQ0lUVAkxCittb2R1bGUJSU5URVJOQUwJCUdSRUVLLUNDSVRULy8JCUdSRUVLLUNDSVRUCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi04OC8vCQlHUkVFSzcvLworYWxpYXMJQ1NJU084OEdSRUVLNy8vCQlHUkVFSzcvLworbW9kdWxlCUdSRUVLNy8vCQlJTlRFUk5BTAkJR1JFRUs3CQkxCittb2R1bGUJSU5URVJOQUwJCUdSRUVLNy8vCQlHUkVFSzcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xOC8vCQlHUkVFSzctT0xELy8KK2FsaWFzCUNTSVNPMThHUkVFSzdPTEQvLwlHUkVFSzctT0xELy8KK2FsaWFzCUdSRUVLN09MRC8vCQlHUkVFSzctT0xELy8KK21vZHVsZQlHUkVFSzctT0xELy8JCUlOVEVSTkFMCQlHUkVFSzctT0xECTEKK21vZHVsZQlJTlRFUk5BTAkJR1JFRUs3LU9MRC8vCQlHUkVFSzctT0xECTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi00OS8vCQlJTklTLy8KK2FsaWFzCUNTSVNPNDlJTklTLy8JCUlOSVMvLworbW9kdWxlCUlOSVMvLwkJCUlOVEVSTkFMCQlJTklTCQkxCittb2R1bGUJSU5URVJOQUwJCUlOSVMvLwkJCUlOSVMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi01MC8vCQlJTklTLTgvLworYWxpYXMJQ1NJU081MElOSVM4Ly8JCUlOSVMtOC8vCithbGlhcwlJTklTOC8vCQkJSU5JUy04Ly8KK21vZHVsZQlJTklTLTgvLwkJSU5URVJOQUwJCUlOSVMtOAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJTklTLTgvLwkJSU5JUy04CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItNTEvLwkJSU5JUy1DWVJJTExJQy8vCithbGlhcwlDU0lTTzUxSU5JU0NZUklMTElDLy8JSU5JUy1DWVJJTExJQy8vCithbGlhcwlJTklTQ1lSSUxMSUMvLwkJSU5JUy1DWVJJTExJQy8vCittb2R1bGUJSU5JUy1DWVJJTExJQy8vCQlJTlRFUk5BTAkJSU5JUy1DWVJJTExJQwkxCittb2R1bGUJSU5URVJOQUwJCUlOSVMtQ1lSSUxMSUMvLwkJSU5JUy1DWVJJTExJQwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItOTgvLwkJSVNPXzIwMzMvLworYWxpYXMJSVNPXzIwMzMtMTk4My8vCQlJU09fMjAzMy8vCithbGlhcwlFMTNCLy8JCQlJU09fMjAzMy8vCithbGlhcwlDU0lTTzIwMzMvLwkJSVNPXzIwMzMvLworbW9kdWxlCUlTT18yMDMzLy8JCUlOVEVSTkFMCQlJU09fMjAzMwkxCittb2R1bGUJSU5URVJOQUwJCUlTT18yMDMzLy8JCUlTT18yMDMzCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0zNy8vCQlJU09fNTQyNy8vCithbGlhcwlLT0ktNy8vCQkJSVNPXzU0MjcvLworYWxpYXMJQ1NJU081NDI3Q1lSSUxMSUMvLwlJU09fNTQyNy8vCittb2R1bGUJSVNPXzU0MjcvLwkJSU5URVJOQUwJCUlTT181NDI3CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPXzU0MjcvLwkJSVNPXzU0MjcJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTU0Ly8JCUlTT181NDI3LUVYVC8vCithbGlhcwlJU09fNTQyNzoxOTgxLy8JCUlTT181NDI3LUVYVC8vCithbGlhcwlDU0lTTzU0MjdDWVJJTExJQzE5ODEvLwlJU09fNTQyNy1FWFQvLworYWxpYXMJSVNPXzU0MjdFWFQvLwkJSVNPXzU0MjctRVhULy8KK21vZHVsZQlJU09fNTQyNy1FWFQvLwkJSU5URVJOQUwJCUlTT181NDI3LUVYVAkxCittb2R1bGUJSU5URVJOQUwJCUlTT181NDI3LUVYVC8vCQlJU09fNTQyNy1FWFQJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTU1Ly8JCUlTT181NDI4Ly8KK2FsaWFzCUlTT181NDI4OjE5ODAvLwkJSVNPXzU0MjgvLworYWxpYXMJQ1NJU081NDI4R1JFRUsvLwlJU09fNTQyOC8vCittb2R1bGUJSVNPXzU0MjgvLwkJSU5URVJOQUwJCUlTT181NDI4CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPXzU0MjgvLwkJSVNPXzU0MjgJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTE1NS8vCQlJU09fMTAzNjctQk9YLy8KK2FsaWFzCUNTSVNPMTAzNjdCT1gvLwkJSVNPXzEwMzY3LUJPWC8vCithbGlhcwlJU09fMTAzNjdCT1gvLwkJSVNPXzEwMzY3LUJPWC8vCittb2R1bGUJSVNPXzEwMzY3LUJPWC8vCQlJTlRFUk5BTAkJSVNPXzEwMzY3LUJPWAkxCittb2R1bGUJSU5URVJOQUwJCUlTT18xMDM2Ny1CT1gvLwkJSVNPXzEwMzY3LUJPWAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlNQUNJUy8vCQkJTUFDLUlTLy8KK21vZHVsZQlNQUMtSVMvLwkJSU5URVJOQUwJCU1BQy1JUwkJMQorbW9kdWxlCUlOVEVSTkFMCQlNQUMtSVMvLwkJTUFDLUlTCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlNQUNVSy8vCQkJTUFDLVVLLy8KK2FsaWFzCU1BQ1VLUkFJTklBTi8vCQlNQUMtVUsvLworYWxpYXMJTUFDLUNZUklMTElDLy8JCU1BQy1VSy8vCithbGlhcwlNQUNDWVJJTExJQy8vCQlNQUMtVUsvLworbW9kdWxlCU1BQy1VSy8vCQlJTlRFUk5BTAkJTUFDLVVLCQkxCittb2R1bGUJSU5URVJOQUwJCU1BQy1VSy8vCQlNQUMtVUsJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1TLU1BQy1DWVJJTExJQy8vCUNQMTAwMDcvLworYWxpYXMJTVNNQUNDWVJJTExJQy8vCQlDUDEwMDA3Ly8KK21vZHVsZQlDUDEwMDA3Ly8JCUlOVEVSTkFMCQlDUDEwMDA3CQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTAwMDcvLwkJQ1AxMDAwNwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTktMS8vCQlOQVRTLURBTk8vLworYWxpYXMJQ1NOQVRTREFOTy8vCQlOQVRTLURBTk8vLworYWxpYXMJTkFUU0RBTk8vLwkJTkFUUy1EQU5PLy8KK21vZHVsZQlOQVRTLURBTk8vLwkJSU5URVJOQUwJCU5BVFMtREFOTwkxCittb2R1bGUJSU5URVJOQUwJCU5BVFMtREFOTy8vCQlOQVRTLURBTk8JMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTgtMS8vCQlOQVRTLVNFRkkvLworYWxpYXMJQ1NOQVRTU0VGSS8vCQlOQVRTLVNFRkkvLworYWxpYXMJTkFUU1NFRkkvLwkJTkFUUy1TRUZJLy8KK21vZHVsZQlOQVRTLVNFRkkvLwkJSU5URVJOQUwJCU5BVFMtU0VGSQkxCittb2R1bGUJSU5URVJOQUwJCU5BVFMtU0VGSS8vCQlOQVRTLVNFRkkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJV1MyLy8JCQlXSU4tU0FNSS0yLy8KK2FsaWFzCVdJTlNBTUkyLy8JCVdJTi1TQU1JLTIvLworbW9kdWxlCVdJTi1TQU1JLTIvLwkJSU5URVJOQUwJCVNBTUktV1MyCTEKK21vZHVsZQlJTlRFUk5BTAkJV0lOLVNBTUktMi8vCQlTQU1JLVdTMgkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJSVNPLUlSLTE5Ny8vCQlJTlRFUk5BTAkJSVNPLUlSLTE5NwkxCittb2R1bGUJSU5URVJOQUwJCUlTTy1JUi0xOTcvLwkJSVNPLUlSLTE5NwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlUSVM2MjAvLwkJVElTLTYyMC8vCithbGlhcwlUSVM2MjAtMC8vCQlUSVMtNjIwLy8KK2FsaWFzCVRJUzYyMC4yNTI5LTEvLwkJVElTLTYyMC8vCithbGlhcwlUSVM2MjAuMjUzMy0wLy8JCVRJUy02MjAvLworYWxpYXMJSVNPLUlSLTE2Ni8vCQlUSVMtNjIwLy8KK21vZHVsZQlUSVMtNjIwLy8JCUlOVEVSTkFMCQlUSVMtNjIwCQkxCittb2R1bGUJSU5URVJOQUwJCVRJUy02MjAvLwkJVElTLTYyMAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJS09JOFUvLwkJCUtPSTgtVS8vCittb2R1bGUJS09JOC1VLy8JCUlOVEVSTkFMCQlLT0k4LVUJCTEKK21vZHVsZQlJTlRFUk5BTAkJS09JOC1VLy8JCUtPSTgtVQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNJUkkzMzQyLy8JCUlTSVJJLTMzNDIvLworbW9kdWxlCUlTSVJJLTMzNDIvLwkJSU5URVJOQUwJCUlTSVJJLTMzNDIJMQorbW9kdWxlCUlOVEVSTkFMCQlJU0lSSS0zMzQyLy8JCUlTSVJJLTMzNDIJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJVVRGMTYvLwkJCVVURi0xNi8vCittb2R1bGUJVVRGLTE2Ly8JCUlOVEVSTkFMCQlVVEYtMTYJCTEKK21vZHVsZQlJTlRFUk5BTAkJVVRGLTE2Ly8JCVVURi0xNgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJVVRGMTZMRS8vCQlVVEYtMTZMRS8vCittb2R1bGUJVVRGLTE2TEUvLwkJSU5URVJOQUwJCVVURi0xNgkJMQorbW9kdWxlCUlOVEVSTkFMCQlVVEYtMTZMRS8vCQlVVEYtMTYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVVURjE2QkUvLwkJVVRGLTE2QkUvLworbW9kdWxlCVVURi0xNkJFLy8JCUlOVEVSTkFMCQlVVEYtMTYJCTEKK21vZHVsZQlJTlRFUk5BTAkJVVRGLTE2QkUvLwkJVVRGLTE2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU1VOSUNPREUvLwkJVU5JQ09ERS8vCittb2R1bGUJVU5JQ09ERS8vCQlJTlRFUk5BTAkJVU5JQ09ERQkJMQorbW9kdWxlCUlOVEVSTkFMCQlVTklDT0RFLy8JCVVOSUNPREUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVVURjMyLy8JCQlVVEYtMzIvLworbW9kdWxlCVVURi0zMi8vCQlJTlRFUk5BTAkJVVRGLTMyCQkxCittb2R1bGUJSU5URVJOQUwJCVVURi0zMi8vCQlVVEYtMzIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVVURjMyTEUvLwkJVVRGLTMyTEUvLworbW9kdWxlCVVURi0zMkxFLy8JCUlOVEVSTkFMCQlVVEYtMzIJCTEKK21vZHVsZQlJTlRFUk5BTAkJVVRGLTMyTEUvLwkJVVRGLTMyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlVVEYzMkJFLy8JCVVURi0zMkJFLy8KK21vZHVsZQlVVEYtMzJCRS8vCQlJTlRFUk5BTAkJVVRGLTMyCQkxCittb2R1bGUJSU5URVJOQUwJCVVURi0zMkJFLy8JCVVURi0zMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJVVRGNy8vCQkJVVRGLTcvLworbW9kdWxlCVVURi03Ly8JCQlJTlRFUk5BTAkJVVRGLTcJCTEKK21vZHVsZQlJTlRFUk5BTAkJVVRGLTcvLwkJCVVURi03CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJR0IxODAzMC8vCQlJTlRFUk5BTAkJR0IxODAzMAkJMQorbW9kdWxlCUlOVEVSTkFMCQlHQjE4MDMwLy8JCUdCMTgwMzAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlWSVNDSUkvLwkJSU5URVJOQUwJCVZJU0NJSQkJMQorbW9kdWxlCUlOVEVSTkFMCQlWSVNDSUkvLwkJVklTQ0lJCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJS09JOC1ULy8JCUlOVEVSTkFMCQlLT0k4LVQJCTEKK21vZHVsZQlJTlRFUk5BTAkJS09JOC1ULy8JCUtPSTgtVAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUdFT1JHSUFOLVBTLy8JCUlOVEVSTkFMCQlHRU9SR0lBTi1QUwkxCittb2R1bGUJSU5URVJOQUwJCUdFT1JHSUFOLVBTLy8JCUdFT1JHSUFOLVBTCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlHRU9SR0lBTi1BQ0FERU1ZLy8JSU5URVJOQUwJCUdFT1JHSUFOLUFDQURFTVkgMQorbW9kdWxlCUlOVEVSTkFMCQlHRU9SR0lBTi1BQ0FERU1ZLy8JR0VPUkdJQU4tQUNBREVNWSAxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJSVNPLUlSLTIwOS8vCQlJTlRFUk5BTAkJSVNPLUlSLTIwOQkxCittb2R1bGUJSU5URVJOQUwJCUlTTy1JUi0yMDkvLwkJSVNPLUlSLTIwOQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJTUFDLVNBTUkvLwkJSU5URVJOQUwJCU1BQy1TQU1JCTEKK21vZHVsZQlJTlRFUk5BTAkJTUFDLVNBTUkvLwkJTUFDLVNBTUkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUFSTVNDSUktOC8vCQlJTlRFUk5BTAkJQVJNU0NJSS04CTEKK21vZHVsZQlJTlRFUk5BTAkJQVJNU0NJSS04Ly8JCUFSTVNDSUktOAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlUQ1ZOLy8JCQlUQ1ZONTcxMi0xLy8KK2FsaWFzCVRDVk4tNTcxMi8vCQlUQ1ZONTcxMi0xLy8KK2FsaWFzCVRDVk41NzEyLTE6MTk5My8vCVRDVk41NzEyLTEvLworbW9kdWxlCVRDVk41NzEyLTEvLwkJSU5URVJOQUwJCVRDVk41NzEyLTEJMQorbW9kdWxlCUlOVEVSTkFMCQlUQ1ZONTcxMi0xLy8JCVRDVk41NzEyLTEJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUVVQy1KSVNYMDIxMy8vCQlJTlRFUk5BTAkJRVVDLUpJU1gwMjEzCTEKK21vZHVsZQlJTlRFUk5BTAkJRVVDLUpJU1gwMjEzLy8JCUVVQy1KSVNYMDIxMwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJU2hpZnRfSklTWDAyMTMvLwlJTlRFUk5BTAkJU0hJRlRfSklTWDAyMTMJMQorbW9kdWxlCUlOVEVSTkFMCQlTaGlmdF9KSVNYMDIxMy8vCVNISUZUX0pJU1gwMjEzCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlUU0NJSS8vCQkJSU5URVJOQUwJCVRTQ0lJCQkxCittb2R1bGUJSU5URVJOQUwJCVRTQ0lJLy8JCQlUU0NJSQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCVBUMTU0Ly8JCQlJTlRFUk5BTAkJUFQxNTQJCTEKK21vZHVsZQlJTlRFUk5BTAkJUFQxNTQvLwkJCVBUMTU0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlTVFJLMTA0OC0yMDAyLy8JCVJLMTA0OC8vCittb2R1bGUJUksxMDQ4Ly8JCUlOVEVSTkFMCQlSSzEwNDgJCTEKK21vZHVsZQlJTlRFUk5BTAkJUksxMDQ4Ly8JCVJLMTA0OAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTEwMjUvLwkJSUJNMTAyNS8vCithbGlhcwlDUDEwMjUvLwkJSUJNMTAyNS8vCithbGlhcwlDU0lCTTEwMjUvLwkJSUJNMTAyNS8vCittb2R1bGUJSUJNMTAyNS8vCQlJTlRFUk5BTAkJSUJNMTAyNQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMDI1Ly8JCUlCTTEwMjUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTIyLy8JCUlCTTExMjIvLworYWxpYXMJQ1AxMTIyLy8JCUlCTTExMjIvLworYWxpYXMJQ1NJQk0xMTIyLy8JCUlCTTExMjIvLworbW9kdWxlCUlCTTExMjIvLwkJSU5URVJOQUwJCUlCTTExMjIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTEyMi8vCQlJQk0xMTIyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTEzNy8vCQlJQk0xMTM3Ly8KK2FsaWFzCUNQMTEzNy8vCQlJQk0xMTM3Ly8KK2FsaWFzCUNTSUJNMTEzNy8vCQlJQk0xMTM3Ly8KK21vZHVsZQlJQk0xMTM3Ly8JCUlOVEVSTkFMCQlJQk0xMTM3CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExMzcvLwkJSUJNMTEzNwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNTMvLwkJSUJNMTE1My8vCithbGlhcwlDUDExNTMvLwkJSUJNMTE1My8vCithbGlhcwlDU0lCTTExNTMvLwkJSUJNMTE1My8vCittb2R1bGUJSUJNMTE1My8vCQlJTlRFUk5BTAkJSUJNMTE1MwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTUzLy8JCUlCTTExNTMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTU0Ly8JCUlCTTExNTQvLworYWxpYXMJQ1AxMTU0Ly8JCUlCTTExNTQvLworYWxpYXMJQ1NJQk0xMTU0Ly8JCUlCTTExNTQvLworbW9kdWxlCUlCTTExNTQvLwkJSU5URVJOQUwJCUlCTTExNTQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE1NC8vCQlJQk0xMTU0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE1NS8vCQlJQk0xMTU1Ly8KK2FsaWFzCUNQMTE1NS8vCQlJQk0xMTU1Ly8KK2FsaWFzCUNTSUJNMTE1NS8vCQlJQk0xMTU1Ly8KK21vZHVsZQlJQk0xMTU1Ly8JCUlOVEVSTkFMCQlJQk0xMTU1CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNTUvLwkJSUJNMTE1NQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNTUvLwkJSUJNMTE1NS8vCithbGlhcwlDUDExNTUvLwkJSUJNMTE1NS8vCithbGlhcwlDU0lCTTExNTUvLwkJSUJNMTE1NS8vCittb2R1bGUJSUJNMTE1NS8vCQlJTlRFUk5BTAkJSUJNMTE1NQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTU1Ly8JCUlCTTExNTUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTU2Ly8JCUlCTTExNTYvLworYWxpYXMJQ1AxMTU2Ly8JCUlCTTExNTYvLworYWxpYXMJQ1NJQk0xMTU2Ly8JCUlCTTExNTYvLworbW9kdWxlCUlCTTExNTYvLwkJSU5URVJOQUwJCUlCTTExNTYJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE1Ni8vCQlJQk0xMTU2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE1Ny8vCQlJQk0xMTU3Ly8KK2FsaWFzCUNQMTE1Ny8vCQlJQk0xMTU3Ly8KK2FsaWFzCUNTSUJNMTE1Ny8vCQlJQk0xMTU3Ly8KK21vZHVsZQlJQk0xMTU3Ly8JCUlOVEVSTkFMCQlJQk0xMTU3CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNTcvLwkJSUJNMTE1NwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNTgvLwkJSUJNMTE1OC8vCithbGlhcwlDUDExNTgvLwkJSUJNMTE1OC8vCithbGlhcwlDU0lCTTExNTgvLwkJSUJNMTE1OC8vCittb2R1bGUJSUJNMTE1OC8vCQlJTlRFUk5BTAkJSUJNMTE1OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTU4Ly8JCUlCTTExNTgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS04MDMvLwkJSUJNODAzLy8KK2FsaWFzCUNQODAzLy8JCUlCTTgwMy8vCithbGlhcwlDU0lCTTgwMy8vCQlJQk04MDMvLworbW9kdWxlCUlCTTgwMy8vCQlJTlRFUk5BTAkJSUJNODAzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTgwMy8vCQlJQk04MDMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MDEvLwkJSUJNOTAxLy8KK2FsaWFzCUNQOTAxLy8JCUlCTTkwMS8vCithbGlhcwlDU0lCTTkwMS8vCQlJQk05MDEvLworbW9kdWxlCUlCTTkwMS8vCQlJTlRFUk5BTAkJSUJNOTAxCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkwMS8vCQlJQk05MDEJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MDIvLwkJSUJNOTAyLy8KK2FsaWFzCUNQOTAyLy8JCUlCTTkwMi8vCithbGlhcwlDU0lCTTkwMi8vCQlJQk05MDIvLworbW9kdWxlCUlCTTkwMi8vCQlJTlRFUk5BTAkJSUJNOTAyCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkwMi8vCQlJQk05MDIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MjEvLwkJSUJNOTIxLy8KK2FsaWFzCUNQOTIxLy8JCUlCTTkyMS8vCithbGlhcwlDU0lCTTkyMS8vCQlJQk05MjEvLworbW9kdWxlCUlCTTkyMS8vCQlJTlRFUk5BTAkJSUJNOTIxCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkyMS8vCQlJQk05MjEJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMDA4Ly8JCUlCTTEwMDgvLworYWxpYXMJQ1AxMDA4Ly8JCUlCTTEwMDgvLworYWxpYXMJQ1NJQk0xMDA4Ly8JCUlCTTEwMDgvLworbW9kdWxlCUlCTTEwMDgvLwkJSU5URVJOQUwJCUlCTTEwMDgJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTAwOC8vCQlJQk0xMDA4CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJSUJNMTAwOC8vCQlJQk00MjAvLwkJSUJNMTAwOF80MjAJMQorbW9kdWxlCUlCTTQyMC8vCQlJQk0xMDA4Ly8JCUlCTTEwMDhfNDIwCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMDk3Ly8JCUlCTTEwOTcvLworYWxpYXMJQ1AxMDk3Ly8JCUlCTTEwOTcvLworYWxpYXMJQ1NJQk0xMDk3Ly8JCUlCTTEwOTcvLworbW9kdWxlCUlCTTEwOTcvLwkJSU5URVJOQUwJCUlCTTEwOTcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTA5Ny8vCQlJQk0xMDk3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTExMi8vCQlJQk0xMTEyLy8KK2FsaWFzCUNQMTExMi8vCQlJQk0xMTEyLy8KK2FsaWFzCUNTSUJNMTExMi8vCQlJQk0xMTEyLy8KK21vZHVsZQlJQk0xMTEyLy8JCUlOVEVSTkFMCQlJQk0xMTEyCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExMTIvLwkJSUJNMTExMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExMjMvLwkJSUJNMTEyMy8vCithbGlhcwlDUDExMjMvLwkJSUJNMTEyMy8vCithbGlhcwlDU0lCTTExMjMvLwkJSUJNMTEyMy8vCittb2R1bGUJSUJNMTEyMy8vCQlJTlRFUk5BTAkJSUJNMTEyMwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTIzLy8JCUlCTTExMjMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTMwLy8JCUlCTTExMzAvLworYWxpYXMJQ1AxMTMwLy8JCUlCTTExMzAvLworYWxpYXMJQ1NJQk0xMTMwLy8JCUlCTTExMzAvLworbW9kdWxlCUlCTTExMzAvLwkJSU5URVJOQUwJCUlCTTExMzAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTEzMC8vCQlJQk0xMTMwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE0MC8vCQlJQk0xMTQwLy8KK2FsaWFzCUNQMTE0MC8vCQlJQk0xMTQwLy8KK2FsaWFzCUNTSUJNMTE0MC8vCQlJQk0xMTQwLy8KK21vZHVsZQlJQk0xMTQwLy8JCUlOVEVSTkFMCQlJQk0xMTQwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNDAvLwkJSUJNMTE0MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNDEvLwkJSUJNMTE0MS8vCithbGlhcwlDUDExNDEvLwkJSUJNMTE0MS8vCithbGlhcwlDU0lCTTExNDEvLwkJSUJNMTE0MS8vCittb2R1bGUJSUJNMTE0MS8vCQlJTlRFUk5BTAkJSUJNMTE0MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTQxLy8JCUlCTTExNDEJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTQyLy8JCUlCTTExNDIvLworYWxpYXMJQ1AxMTQyLy8JCUlCTTExNDIvLworYWxpYXMJQ1NJQk0xMTQyLy8JCUlCTTExNDIvLworbW9kdWxlCUlCTTExNDIvLwkJSU5URVJOQUwJCUlCTTExNDIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE0Mi8vCQlJQk0xMTQyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE0My8vCQlJQk0xMTQzLy8KK2FsaWFzCUNQMTE0My8vCQlJQk0xMTQzLy8KK2FsaWFzCUNTSUJNMTE0My8vCQlJQk0xMTQzLy8KK21vZHVsZQlJQk0xMTQzLy8JCUlOVEVSTkFMCQlJQk0xMTQzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNDMvLwkJSUJNMTE0MwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNDQvLwkJSUJNMTE0NC8vCithbGlhcwlDUDExNDQvLwkJSUJNMTE0NC8vCithbGlhcwlDU0lCTTExNDQvLwkJSUJNMTE0NC8vCittb2R1bGUJSUJNMTE0NC8vCQlJTlRFUk5BTAkJSUJNMTE0NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTQ0Ly8JCUlCTTExNDQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTQ1Ly8JCUlCTTExNDUvLworYWxpYXMJQ1AxMTQ1Ly8JCUlCTTExNDUvLworYWxpYXMJQ1NJQk0xMTQ1Ly8JCUlCTTExNDUvLworbW9kdWxlCUlCTTExNDUvLwkJSU5URVJOQUwJCUlCTTExNDUJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE0NS8vCQlJQk0xMTQ1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE0Ni8vCQlJQk0xMTQ2Ly8KK2FsaWFzCUNQMTE0Ni8vCQlJQk0xMTQ2Ly8KK2FsaWFzCUNTSUJNMTE0Ni8vCQlJQk0xMTQ2Ly8KK21vZHVsZQlJQk0xMTQ2Ly8JCUlOVEVSTkFMCQlJQk0xMTQ2CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNDYvLwkJSUJNMTE0NgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNDcvLwkJSUJNMTE0Ny8vCithbGlhcwlDUDExNDcvLwkJSUJNMTE0Ny8vCithbGlhcwlDU0lCTTExNDcvLwkJSUJNMTE0Ny8vCittb2R1bGUJSUJNMTE0Ny8vCQlJTlRFUk5BTAkJSUJNMTE0NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTQ3Ly8JCUlCTTExNDcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTQ4Ly8JCUlCTTExNDgvLworYWxpYXMJQ1AxMTQ4Ly8JCUlCTTExNDgvLworYWxpYXMJQ1NJQk0xMTQ4Ly8JCUlCTTExNDgvLworbW9kdWxlCUlCTTExNDgvLwkJSU5URVJOQUwJCUlCTTExNDgJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE0OC8vCQlJQk0xMTQ4CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE0OS8vCQlJQk0xMTQ5Ly8KK2FsaWFzCUNQMTE0OS8vCQlJQk0xMTQ5Ly8KK2FsaWFzCUNTSUJNMTE0OS8vCQlJQk0xMTQ5Ly8KK21vZHVsZQlJQk0xMTQ5Ly8JCUlOVEVSTkFMCQlJQk0xMTQ5CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNDkvLwkJSUJNMTE0OQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNjYvLwkJSUJNMTE2Ni8vCithbGlhcwlDUDExNjYvLwkJSUJNMTE2Ni8vCithbGlhcwlDU0lCTTExNjYvLwkJSUJNMTE2Ni8vCittb2R1bGUJSUJNMTE2Ni8vCQlJTlRFUk5BTAkJSUJNMTE2NgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTY2Ly8JCUlCTTExNjYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTY3Ly8JCUlCTTExNjcvLworYWxpYXMJQ1AxMTY3Ly8JCUlCTTExNjcvLworYWxpYXMJQ1NJQk0xMTY3Ly8JCUlCTTExNjcvLworbW9kdWxlCUlCTTExNjcvLwkJSU5URVJOQUwJCUlCTTExNjcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE2Ny8vCQlJQk0xMTY3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tNDUxNy8vCQlJQk00NTE3Ly8KK2FsaWFzCUNQNDUxNy8vCQlJQk00NTE3Ly8KK2FsaWFzCUNTSUJNNDUxNy8vCQlJQk00NTE3Ly8KK21vZHVsZQlJQk00NTE3Ly8JCUlOVEVSTkFMCQlJQk00NTE3CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTQ1MTcvLwkJSUJNNDUxNwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTQ4OTkvLwkJSUJNNDg5OS8vCithbGlhcwlDUDQ4OTkvLwkJSUJNNDg5OS8vCithbGlhcwlDU0lCTTQ4OTkvLwkJSUJNNDg5OS8vCittb2R1bGUJSUJNNDg5OS8vCQlJTlRFUk5BTAkJSUJNNDg5OQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk00ODk5Ly8JCUlCTTQ4OTkJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS00OTA5Ly8JCUlCTTQ5MDkvLworYWxpYXMJQ1A0OTA5Ly8JCUlCTTQ5MDkvLworYWxpYXMJQ1NJQk00OTA5Ly8JCUlCTTQ5MDkvLworbW9kdWxlCUlCTTQ5MDkvLwkJSU5URVJOQUwJCUlCTTQ5MDkJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNNDkwOS8vCQlJQk00OTA5CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tNDk3MS8vCQlJQk00OTcxLy8KK2FsaWFzCUNQNDk3MS8vCQlJQk00OTcxLy8KK2FsaWFzCUNTSUJNNDk3MS8vCQlJQk00OTcxLy8KK21vZHVsZQlJQk00OTcxLy8JCUlOVEVSTkFMCQlJQk00OTcxCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTQ5NzEvLwkJSUJNNDk3MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTUzNDcvLwkJSUJNNTM0Ny8vCithbGlhcwlDUDUzNDcvLwkJSUJNNTM0Ny8vCithbGlhcwlDU0lCTTUzNDcvLwkJSUJNNTM0Ny8vCittb2R1bGUJSUJNNTM0Ny8vCQlJTlRFUk5BTAkJSUJNNTM0NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk01MzQ3Ly8JCUlCTTUzNDcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MDMwLy8JCUlCTTkwMzAvLworYWxpYXMJQ1A5MDMwLy8JCUlCTTkwMzAvLworYWxpYXMJQ1NJQk05MDMwLy8JCUlCTTkwMzAvLworbW9kdWxlCUlCTTkwMzAvLwkJSU5URVJOQUwJCUlCTTkwMzAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTAzMC8vCQlJQk05MDMwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tOTA2Ni8vCQlJQk05MDY2Ly8KK2FsaWFzCUNQOTA2Ni8vCQlJQk05MDY2Ly8KK2FsaWFzCUNTSUJNOTA2Ni8vCQlJQk05MDY2Ly8KK21vZHVsZQlJQk05MDY2Ly8JCUlOVEVSTkFMCQlJQk05MDY2CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkwNjYvLwkJSUJNOTA2NgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTk0NDgvLwkJSUJNOTQ0OC8vCithbGlhcwlDUDk0NDgvLwkJSUJNOTQ0OC8vCithbGlhcwlDU0lCTTk0NDgvLwkJSUJNOTQ0OC8vCittb2R1bGUJSUJNOTQ0OC8vCQlJTlRFUk5BTAkJSUJNOTQ0OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05NDQ4Ly8JCUlCTTk0NDgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMjcxMi8vCQlJQk0xMjcxMi8vCithbGlhcwlDUDEyNzEyLy8JCUlCTTEyNzEyLy8KK2FsaWFzCUNTSUJNMTI3MTIvLwkJSUJNMTI3MTIvLworbW9kdWxlCUlCTTEyNzEyLy8JCUlOVEVSTkFMCQlJQk0xMjcxMgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMjcxMi8vCQlJQk0xMjcxMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTE2ODA0Ly8JCUlCTTE2ODA0Ly8KK2FsaWFzCUNQMTY4MDQvLwkJSUJNMTY4MDQvLworYWxpYXMJQ1NJQk0xNjgwNC8vCQlJQk0xNjgwNC8vCittb2R1bGUJSUJNMTY4MDQvLwkJSU5URVJOQUwJCUlCTTE2ODA0CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTE2ODA0Ly8JCUlCTTE2ODA0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTM2NC8vCQlJQk0xMzY0Ly8KK2FsaWFzCUNQMTM2NC8vCQlJQk0xMzY0Ly8KK2FsaWFzCUNTSUJNMTM2NC8vCQlJQk0xMzY0Ly8KK21vZHVsZQlJQk0xMzY0Ly8JCUlOVEVSTkFMCQlJQk0xMzY0CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTEzNjQvLwkJSUJNMTM2NAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTEzNzEvLwkJSUJNMTM3MS8vCithbGlhcwlDUDEzNzEvLwkJSUJNMTM3MS8vCithbGlhcwlDU0lCTTEzNzEvLwkJSUJNMTM3MS8vCittb2R1bGUJSUJNMTM3MS8vCQlJTlRFUk5BTAkJSUJNMTM3MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMzcxLy8JCUlCTTEzNzEJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMzg4Ly8JCUlCTTEzODgvLworYWxpYXMJQ1AxMzg4Ly8JCUlCTTEzODgvLworYWxpYXMJQ1NJQk0xMzg4Ly8JCUlCTTEzODgvLworbW9kdWxlCUlCTTEzODgvLwkJSU5URVJOQUwJCUlCTTEzODgJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTM4OC8vCQlJQk0xMzg4CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTM5MC8vCQlJQk0xMzkwLy8KK2FsaWFzCUNQMTM5MC8vCQlJQk0xMzkwLy8KK2FsaWFzCUNTSUJNMTM5MC8vCQlJQk0xMzkwLy8KK21vZHVsZQlJQk0xMzkwLy8JCUlOVEVSTkFMCQlJQk0xMzkwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTEzOTAvLwkJSUJNMTM5MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTEzOTkvLwkJSUJNMTM5OS8vCithbGlhcwlDUDEzOTkvLwkJSUJNMTM5OS8vCithbGlhcwlDU0lCTTEzOTkvLwkJSUJNMTM5OS8vCittb2R1bGUJSUJNMTM5OS8vCQlJTlRFUk5BTAkJSUJNMTM5OQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMzk5Ly8JCUlCTTEzOTkJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy9UUl8xMTU0OC0xLwkJSVNPXzExNTQ4LTEvLworYWxpYXMJSVNPMTE1NDgtMS8vCQlJU09fMTE1NDgtMS8vCittb2R1bGUJSVNPXzExNTQ4LTEvLwkJSU5URVJOQUwJCUlTT18xMTU0OC0xCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPXzExNTQ4LTEvLwkJSVNPXzExNTQ4LTEJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCU1JSy8vCQkJSU5URVJOQUwJCU1JSwkJMQorbW9kdWxlCUlOVEVSTkFMCQlNSUsvLwkJCU1JSwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUJSRi8vCQkJSU5URVJOQUwJCUJSRgkJMQorbW9kdWxlCUlOVEVSTkFMCQlCUkYvLwkJCUJSRgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AxMjgyLy8JCU1BQy1DRU5UUkFMRVVST1BFLy8KK21vZHVsZQlNQUMtQ0VOVFJBTEVVUk9QRS8vCUlOVEVSTkFMCQlNQUMtQ0VOVFJBTEVVUk9QRSAxCittb2R1bGUJSU5URVJOQUwJCU1BQy1DRU5UUkFMRVVST1BFLy8JTUFDLUNFTlRSQUxFVVJPUEUgMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUtPSTgtUlUvLwkJSU5URVJOQUwJCUtPSTgtUlUJCTEKK21vZHVsZQlJTlRFUk5BTAkJS09JOC1SVS8vCQlLT0k4LVJVCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU09fODg1OS05RS8vCQlJU08tODg1OS05RS8vCithbGlhcwlJU084ODU5LTlFLy8JCUlTTy04ODU5LTlFLy8KK2FsaWFzCUlTTzg4NTk5RS8vCQlJU08tODg1OS05RS8vCittb2R1bGUJSVNPLTg4NTktOUUvLwkJSU5URVJOQUwJCUlTTzg4NTktOUUJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS05RS8vCQlJU084ODU5LTlFCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVJPTUFOOS8vCQlIUC1ST01BTjkvLworYWxpYXMJUjkvLwkJCUhQLVJPTUFOOS8vCithbGlhcwlIUFJPTUFOOS8vCQlIUC1ST01BTjkvLworbW9kdWxlCUhQLVJPTUFOOS8vCQlJTlRFUk5BTAkJSFAtUk9NQU45CTEKK21vZHVsZQlJTlRFUk5BTAkJSFAtUk9NQU45Ly8JCUhQLVJPTUFOOQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlUVVJLSVNIOC8vCQlIUC1UVVJLSVNIOC8vCithbGlhcwlIUFRVUktJU0g4Ly8JCUhQLVRVUktJU0g4Ly8KK2FsaWFzCU9TRjEwMDEwMDA2Ly8JCUhQLVRVUktJU0g4Ly8KK21vZHVsZQlIUC1UVVJLSVNIOC8vCQlJTlRFUk5BTAkJSFAtVFVSS0lTSDgJMQorbW9kdWxlCUlOVEVSTkFMCQlIUC1UVVJLSVNIOC8vCQlIUC1UVVJLSVNIOAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlUSEFJOC8vCQkJSFAtVEhBSTgvLworYWxpYXMJSFBUSEFJOC8vCQlIUC1USEFJOC8vCittb2R1bGUJSFAtVEhBSTgvLwkJSU5URVJOQUwJCUhQLVRIQUk4CTEKK21vZHVsZQlJTlRFUk5BTAkJSFAtVEhBSTgvLwkJSFAtVEhBSTgJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSFBHUkVFSzgvLwkJSFAtR1JFRUs4Ly8KK2FsaWFzCU9TRjEwMDEwMDA0Ly8JCUhQLUdSRUVLOC8vCittb2R1bGUJSFAtR1JFRUs4Ly8JCUlOVEVSTkFMCQlIUC1HUkVFSzgJMQorbW9kdWxlCUlOVEVSTkFMCQlIUC1HUkVFSzgvLwkJSFAtR1JFRUs4CTEKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9nY29udi1tb2R1bGVzLmNhY2hlIGIvc3lzcm9vdC91c3IvbGliL2djb252L2djb252LW1vZHVsZXMuY2FjaGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5Y2U3YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9nY29udi1tb2R1bGVzLmNhY2hlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJDTlMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvbGliQ05TLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMWFlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvbGliQ05TLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJHQi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJHQi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjU3MDdiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L2xpYkdCLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJJU09JUjE2NS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJJU09JUjE2NS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDkyMjk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L2xpYklTT0lSMTY1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJKSVMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvbGliSklTLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYjQ5NWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvbGliSklTLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJKSVNYMDIxMy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJKSVNYMDIxMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzAxZTNkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L2xpYkpJU1gwMjEzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJLU0Muc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvbGliS1NDLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwN2QyMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvbGliS1NDLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9nY3J0MS5vIGIvc3lzcm9vdC91c3IvbGliL2djcnQxLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc0NDkwZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY3J0MS5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9sZC0yLjE1LnNvIGIvc3lzcm9vdC91c3IvbGliL2xkLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmI5NjYwYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9sZC0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9sZC1saW51eC14ODYtNjQuc28uMiBiL3N5c3Jvb3QvdXNyL2xpYi9sZC1saW51eC14ODYtNjQuc28uMgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi44Njc2ZDIzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xkLWxpbnV4LXg4Ni02NC5zby4yCkBAIC0wLDAgKzEgQEAKK2xkLTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliQnJva2VuTG9jYWxlLTIuMTUuc28gYi9zeXNyb290L3Vzci9saWIvbGliQnJva2VuTG9jYWxlLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgxZmY5YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJCcm9rZW5Mb2NhbGUtMi4xNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliQnJva2VuTG9jYWxlLmEgYi9zeXNyb290L3Vzci9saWIvbGliQnJva2VuTG9jYWxlLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYyMDk5ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJCcm9rZW5Mb2NhbGUuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliQnJva2VuTG9jYWxlLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYkJyb2tlbkxvY2FsZS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42ODEwNGMzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYkJyb2tlbkxvY2FsZS5zbwpAQCAtMCwwICsxIEBACitsaWJCcm9rZW5Mb2NhbGUuc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJCcm9rZW5Mb2NhbGUuc28uMSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJCcm9rZW5Mb2NhbGUuc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi43ODllZDFiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYkJyb2tlbkxvY2FsZS5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYkJyb2tlbkxvY2FsZS0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYkdMLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYkdMLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmZjM2EwM2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliR0wuc28KQEAgLTAsMCArMSBAQAorbGliR0wuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliU2VnRmF1bHQuc28gYi9zeXNyb290L3Vzci9saWIvbGliU2VnRmF1bHQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlmNzRjMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJTZWdGYXVsdC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliWDExLmEgYi9zeXNyb290L3Vzci9saWIvbGliWDExLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVmMjFkYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYMTEuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliWDExLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYlgxMS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zODc3ZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlgxMS5zbwpAQCAtMCwwICsxIEBACitsaWJYMTEuc28uNi4zLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliWDExLnNvLjYgYi9zeXNyb290L3Vzci9saWIvbGliWDExLnNvLjYKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMzg3N2RiNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYMTEuc28uNgpAQCAtMCwwICsxIEBACitsaWJYMTEuc28uNi4zLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliWDExLnNvLjYuMy4wIGIvc3lzcm9vdC91c3IvbGliL2xpYlgxMS5zby42LjMuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzcwZDUxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlgxMS5zby42LjMuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliWGF1LnNvLjYgYi9zeXNyb290L3Vzci9saWIvbGliWGF1LnNvLjYKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMzM5NjM2YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYYXUuc28uNgpAQCAtMCwwICsxIEBACitsaWJYYXUuc28uNi4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliWGF1LnNvLjYuMC4wIGIvc3lzcm9vdC91c3IvbGliL2xpYlhhdS5zby42LjAuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGI5NDNiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlhhdS5zby42LjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliWGRhbWFnZS5zby4xIGIvc3lzcm9vdC91c3IvbGliL2xpYlhkYW1hZ2Uuc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hNjFkOTFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlhkYW1hZ2Uuc28uMQpAQCAtMCwwICsxIEBACitsaWJYZGFtYWdlLnNvLjEuMS4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYlhkYW1hZ2Uuc28uMS4xLjAgYi9zeXNyb290L3Vzci9saWIvbGliWGRhbWFnZS5zby4xLjEuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODFhOWM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlhkYW1hZ2Uuc28uMS4xLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYlhkbWNwLnNvLjYgYi9zeXNyb290L3Vzci9saWIvbGliWGRtY3Auc28uNgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iYmY0NjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlhkbWNwLnNvLjYKQEAgLTAsMCArMSBAQAorbGliWGRtY3Auc28uNi4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliWGRtY3Auc28uNi4wLjAgYi9zeXNyb290L3Vzci9saWIvbGliWGRtY3Auc28uNi4wLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyNDEyYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYZG1jcC5zby42LjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliWGV4dC5hIGIvc3lzcm9vdC91c3IvbGliL2xpYlhleHQuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDAwNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlhleHQuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliWGV4dC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYZXh0LnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjQ2NWY4MDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliWGV4dC5zbwpAQCAtMCwwICsxIEBACitsaWJYZXh0LnNvLjYuNC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYlhleHQuc28uNiBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYZXh0LnNvLjYKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNDY1ZjgwNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYZXh0LnNvLjYKQEAgLTAsMCArMSBAQAorbGliWGV4dC5zby42LjQuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJYZXh0LnNvLjYuNC4wIGIvc3lzcm9vdC91c3IvbGliL2xpYlhleHQuc28uNi40LjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE2Njc0MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYZXh0LnNvLjYuNC4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJYZml4ZXMuYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYZml4ZXMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGM2ZDg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlhmaXhlcy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJYZml4ZXMuc28gYi9zeXNyb290L3Vzci9saWIvbGliWGZpeGVzLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjkyN2RhOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliWGZpeGVzLnNvCkBAIC0wLDAgKzEgQEAKK2xpYlhmaXhlcy5zby4zLjEuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJYZml4ZXMuc28uMyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYZml4ZXMuc28uMwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi45MjdkYTk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlhmaXhlcy5zby4zCkBAIC0wLDAgKzEgQEAKK2xpYlhmaXhlcy5zby4zLjEuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJYZml4ZXMuc28uMy4xLjAgYi9zeXNyb290L3Vzci9saWIvbGliWGZpeGVzLnNvLjMuMS4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OTFmYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliWGZpeGVzLnNvLjMuMS4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJYaS5hIGIvc3lzcm9vdC91c3IvbGliL2xpYlhpLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFhY2RhMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYaS5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJYaS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYaS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41OTJjOGY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlhpLnNvCkBAIC0wLDAgKzEgQEAKK2xpYlhpLnNvLjYuMS4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYlh4Zjg2dm0uc28uMSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYeGY4NnZtLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZTk5MWZmOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYeGY4NnZtLnNvLjEKQEAgLTAsMCArMSBAQAorbGliWHhmODZ2bS5zby4xLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJYeGY4NnZtLnNvLjEuMC4wIGIvc3lzcm9vdC91c3IvbGliL2xpYlh4Zjg2dm0uc28uMS4wLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU2YzZiZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYeGY4NnZtLnNvLjEuMC4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJhY2wuYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhY2wuYQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iYmFiNzVlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmFjbC5hCkBAIC0wLDAgKzEgQEAKK2xpYmFjbC5hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmFjbC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhY2wuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjI5MzMyMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhY2wuc28KQEAgLTAsMCArMSBAQAorbGliYWNsLnNvLjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYWNsLnNvLjEgYi9zeXNyb290L3Vzci9saWIvbGliYWNsLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMDliZjA1NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhY2wuc28uMQpAQCAtMCwwICsxIEBACitsaWJhY2wuc28uMS4xLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYWNsLnNvLjEuMS4wIGIvc3lzcm9vdC91c3IvbGliL2xpYmFjbC5zby4xLjEuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjE3MjFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmFjbC5zby4xLjEuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYW5sLTIuMTUuc28gYi9zeXNyb290L3Vzci9saWIvbGliYW5sLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM1NTIxMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhbmwtMi4xNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYW5sLmEgYi9zeXNyb290L3Vzci9saWIvbGliYW5sLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjNmIzNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhbmwuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYW5sLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYmFubC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40ZjBjNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmFubC5zbwpAQCAtMCwwICsxIEBACitsaWJhbmwuc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJhbmwuc28uMSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhbmwuc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40YzRkNjY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmFubC5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYmFubC0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmFzb3VuZC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhc291bmQuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNDJkZmM5OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhc291bmQuc28KQEAgLTAsMCArMSBAQAorbGliYXNvdW5kLnNvLjIuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmFzb3VuZC5zby4yIGIvc3lzcm9vdC91c3IvbGliL2xpYmFzb3VuZC5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjQyZGZjOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliYXNvdW5kLnNvLjIKQEAgLTAsMCArMSBAQAorbGliYXNvdW5kLnNvLjIuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmFzb3VuZC5zby4yLjAuMCBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhc291bmQuc28uMi4wLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVjOGZkZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhc291bmQuc28uMi4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmF0dHIuYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhdHRyLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIyZDU4YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhdHRyLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmF0dHIuc28gYi9zeXNyb290L3Vzci9saWIvbGliYXR0ci5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5lYjMyZDVlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmF0dHIuc28KQEAgLTAsMCArMSBAQAorbGliYXR0ci5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJhdHRyLnNvLjEgYi9zeXNyb290L3Vzci9saWIvbGliYXR0ci5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjNiZjA3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliYXR0ci5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYmF0dHIuc28uMS4xLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYXR0ci5zby4xLjEuMCBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhdHRyLnNvLjEuMS4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMGQ4MDYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliYXR0ci5zby4xLjEuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYXVkaW9maWxlLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYmF1ZGlvZmlsZS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42ZjgzOTdjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmF1ZGlvZmlsZS5zbwpAQCAtMCwwICsxIEBACitsaWJhdWRpb2ZpbGUuc28uMS4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYnNkLWNvbXBhdC5hIGIvc3lzcm9vdC91c3IvbGliL2xpYmJzZC1jb21wYXQuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjE2MjE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmJzZC1jb21wYXQuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYy0yLjE1LnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYmMtMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kN2E3OTU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmMtMi4xNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYy5hIGIvc3lzcm9vdC91c3IvbGliL2xpYmMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzY4Njg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmMuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MDBkMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliYy5zbwpAQCAtMCwwICsxLDUgQEAKKy8qIEdOVSBsZCBzY3JpcHQKKyAgIFVzZSB0aGUgc2hhcmVkIGxpYnJhcnksIGJ1dCBzb21lIGZ1bmN0aW9ucyBhcmUgb25seSBpbgorICAgdGhlIHN0YXRpYyBsaWJyYXJ5LCBzbyB0cnkgdGhhdCBzZWNvbmRhcmlseS4gICovCitPVVRQVVRfRk9STUFUKGVsZjY0LXg4Ni02NCkKK0dST1VQICggbGliYy5zby42IGxpYmNfbm9uc2hhcmVkLmEgIEFTX05FRURFRCAoIGxkLWxpbnV4LXg4Ni02NC5zby4yICkgKQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmMuc28uNiBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjLnNvLjYKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYThmNDJjZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjLnNvLjYKQEAgLTAsMCArMSBAQAorbGliYy0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmMvbWVtY3B5LXByZWxvYWQuc28gYi9zeXNyb290L3Vzci9saWIvbGliYy9tZW1jcHktcHJlbG9hZC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWI3ZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmMvbWVtY3B5LXByZWxvYWQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmMvbWVtY3B5LXN5c2xvZy1wcmVsb2FkLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYmMvbWVtY3B5LXN5c2xvZy1wcmVsb2FkLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMzg4NTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliYy9tZW1jcHktc3lzbG9nLXByZWxvYWQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmNfbm9uc2hhcmVkLmEgYi9zeXNyb290L3Vzci9saWIvbGliY19ub25zaGFyZWQuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjhjNTY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmNfbm9uc2hhcmVkLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmNhcC5hIGIvc3lzcm9vdC91c3IvbGliL2xpYmNhcC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YTQ2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliY2FwLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmNhcC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjYXAuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uM2RmMWY2OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjYXAuc28KQEAgLTAsMCArMSBAQAorbGliY2FwLnNvLjIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliY2FwLnNvLjIgYi9zeXNyb290L3Vzci9saWIvbGliY2FwLnNvLjIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjZkNWZlNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjYXAuc28uMgpAQCAtMCwwICsxIEBACitsaWJjYXAuc28uMi4yMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJjYXAuc28uMi4yMiBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjYXAuc28uMi4yMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjA1ZjBjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmNhcC5zby4yLjIyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJjaWRuLTIuMTUuc28gYi9zeXNyb290L3Vzci9saWIvbGliY2lkbi0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2Njg2MTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliY2lkbi0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJjaWRuLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYmNpZG4uc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMzBhMDFhNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjaWRuLnNvCkBAIC0wLDAgKzEgQEAKK2xpYmNpZG4uc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJjaWRuLnNvLjEgYi9zeXNyb290L3Vzci9saWIvbGliY2lkbi5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmY5ZjdmYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliY2lkbi5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYmNpZG4tMi4xNS5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJjcnlwdC0yLjE1LnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYmNyeXB0LTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFmNDdiMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjcnlwdC0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJjcnlwdC5hIGIvc3lzcm9vdC91c3IvbGliL2xpYmNyeXB0LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI2MjBlYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjcnlwdC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJjcnlwdC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjcnlwdC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zYjExZmZmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmNyeXB0LnNvCkBAIC0wLDAgKzEgQEAKK2xpYmNyeXB0LnNvLjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliY3J5cHQuc28uMSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjcnlwdC5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmI0YjljMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliY3J5cHQuc28uMQpAQCAtMCwwICsxIEBACitsaWJjcnlwdC0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmN1cnNlcy5hIGIvc3lzcm9vdC91c3IvbGliL2xpYmN1cnNlcy5hCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjU3NDU2MTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliY3Vyc2VzLmEKQEAgLTAsMCArMSBAQAorbGlibmN1cnNlcy5hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmN1cnNlcy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjdXJzZXMuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNjdmOGU2MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjdXJzZXMuc28KQEAgLTAsMCArMSBAQAorbGlibmN1cnNlcy5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJkbC0yLjE1LnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYmRsLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczYjAzZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJkbC0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJkbC5hIGIvc3lzcm9vdC91c3IvbGliL2xpYmRsLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxYWM2NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJkbC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJkbC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJkbC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42OTFmMTk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmRsLnNvCkBAIC0wLDAgKzEgQEAKK2xpYmRsLnNvLjIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliZGwuc28uMiBiL3N5c3Jvb3QvdXNyL2xpYi9saWJkbC5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmVhNTFhN2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliZGwuc28uMgpAQCAtMCwwICsxIEBACitsaWJkbC0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmRybS5zby4yIGIvc3lzcm9vdC91c3IvbGliL2xpYmRybS5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjZkZjIzZTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliZHJtLnNvLjIKQEAgLTAsMCArMSBAQAorbGliZHJtLnNvLjIuNC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmRybS5zby4yLjQuMCBiL3N5c3Jvb3QvdXNyL2xpYi9saWJkcm0uc28uMi40LjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYyMzQ0OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJkcm0uc28uMi40LjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmVzZC5hIGIvc3lzcm9vdC91c3IvbGliL2xpYmVzZC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NDdkNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliZXNkLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmVzZC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJlc2Quc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZmQ1NDE0MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJlc2Quc28KQEAgLTAsMCArMSBAQAorbGliZXNkLnNvLjAuMi4zOQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJmb3JtLmEgYi9zeXNyb290L3Vzci9saWIvbGliZm9ybS5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMjA5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliZm9ybS5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJmb3JtLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYmZvcm0uc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMTBlOTE2OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJmb3JtLnNvCkBAIC0wLDAgKzEgQEAKK2xpYmZvcm0uc28uNQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJmb3JtLnNvLjUgYi9zeXNyb290L3Vzci9saWIvbGliZm9ybS5zby41Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmZhZDJlNzQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliZm9ybS5zby41CkBAIC0wLDAgKzEgQEAKK2xpYmZvcm0uc28uNS45ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmZvcm0uc28uNS45IGIvc3lzcm9vdC91c3IvbGliL2xpYmZvcm0uc28uNS45Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NmRkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliZm9ybS5zby41LjkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmcuYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJnLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxNjIxNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJnLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmllZWUuYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJpZWVlLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzliOTY1ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJpZWVlLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm0tMi4xNS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJtLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M1ZDY1OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJtLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm0uYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJtLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VlOTEwMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJtLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm0uc28gYi9zeXNyb290L3Vzci9saWIvbGlibS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5jNjA3OTdkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYm0uc28KQEAgLTAsMCArMSBAQAorbGlibS5zby42ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm0uc28uNiBiL3N5c3Jvb3QvdXNyL2xpYi9saWJtLnNvLjYKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNzY3YmQzZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJtLnNvLjYKQEAgLTAsMCArMSBAQAorbGlibS0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm1jaGVjay5hIGIvc3lzcm9vdC91c3IvbGliL2xpYm1jaGVjay5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZDZiZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibWNoZWNrLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm1lbXVzYWdlLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYm1lbXVzYWdlLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMzhlMjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibWVtdXNhZ2Uuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm1lbnUuYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJtZW51LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ5YTAwOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJtZW51LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm1lbnUuc28gYi9zeXNyb290L3Vzci9saWIvbGlibWVudS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iMTJiNWNmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYm1lbnUuc28KQEAgLTAsMCArMSBAQAorbGlibWVudS5zby41ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm1lbnUuc28uNSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJtZW51LnNvLjUKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNDFhMTk5MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJtZW51LnNvLjUKQEAgLTAsMCArMSBAQAorbGlibWVudS5zby41LjkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlibWVudS5zby41LjkgYi9zeXNyb290L3Vzci9saWIvbGlibWVudS5zby41LjkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1Y2ZkZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJtZW51LnNvLjUuOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlibmN1cnNlcysrLmEgYi9zeXNyb290L3Vzci9saWIvbGlibmN1cnNlcysrLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzMWNmOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuY3Vyc2VzKysuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlibmN1cnNlcy5hIGIvc3lzcm9vdC91c3IvbGliL2xpYm5jdXJzZXMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDk3OWViCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYm5jdXJzZXMuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlibmN1cnNlcy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuY3Vyc2VzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMDk1M2EKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibmN1cnNlcy5zbwpAQCAtMCwwICsxIEBACitJTlBVVChsaWJuY3Vyc2VzLnNvLjUgLWx0aW5mbykKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuY3Vyc2VzLnNvLjUgYi9zeXNyb290L3Vzci9saWIvbGlibmN1cnNlcy5zby41Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjcyY2FhZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibmN1cnNlcy5zby41CkBAIC0wLDAgKzEgQEAKK2xpYm5jdXJzZXMuc28uNS45ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm5jdXJzZXMuc28uNS45IGIvc3lzcm9vdC91c3IvbGliL2xpYm5jdXJzZXMuc28uNS45Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NDY3YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibmN1cnNlcy5zby41LjkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm5zbC0yLjE1LnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zbC0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MGRlNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibnNsLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm5zbC5hIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zbC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Mzg0ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibnNsLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm5zbC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc2wuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMjhkMTZkOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc2wuc28KQEAgLTAsMCArMSBAQAorbGlibnNsLnNvLjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlibnNsLnNvLjEgYi9zeXNyb290L3Vzci9saWIvbGlibnNsLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNzk4OTZmOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc2wuc28uMQpAQCAtMCwwICsxIEBACitsaWJuc2wtMi4xNS5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfY29tcGF0LTIuMTUuc28gYi9zeXNyb290L3Vzci9saWIvbGlibnNzX2NvbXBhdC0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDBkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX2NvbXBhdC0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfY29tcGF0LnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zc19jb21wYXQuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjBmYTE3ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfY29tcGF0LnNvCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19jb21wYXQuc28uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfY29tcGF0LnNvLjIgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX2NvbXBhdC5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmFhNTg5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX2NvbXBhdC5zby4yCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19jb21wYXQtMi4xNS5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfZGIuc28gYi9zeXNyb290L3Vzci9saWIvbGlibnNzX2RiLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmEzODk5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX2RiLnNvCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19kYi5zby4yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm5zc19kbnMtMi4xNS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfZG5zLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg4ZTlmOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfZG5zLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm5zc19kbnMuc28gYi9zeXNyb290L3Vzci9saWIvbGlibnNzX2Rucy5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi43ZDdhMTY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zc19kbnMuc28KQEAgLTAsMCArMSBAQAorbGlibnNzX2Rucy5zby4yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm5zc19kbnMuc28uMiBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfZG5zLnNvLjIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjk3MzhhNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfZG5zLnNvLjIKQEAgLTAsMCArMSBAQAorbGlibnNzX2Rucy0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm5zc19maWxlcy0yLjE1LnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zc19maWxlcy0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYjYxMDMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX2ZpbGVzLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm5zc19maWxlcy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfZmlsZXMuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMmI5ZTM5OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfZmlsZXMuc28KQEAgLTAsMCArMSBAQAorbGlibnNzX2ZpbGVzLnNvLjIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlibnNzX2ZpbGVzLnNvLjIgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX2ZpbGVzLnNvLjIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZTc5NmFhNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfZmlsZXMuc28uMgpAQCAtMCwwICsxIEBACitsaWJuc3NfZmlsZXMtMi4xNS5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfaGVzaW9kLTIuMTUuc28gYi9zeXNyb290L3Vzci9saWIvbGlibnNzX2hlc2lvZC0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZGIzMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX2hlc2lvZC0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfaGVzaW9kLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zc19oZXNpb2Quc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZmQ3ZjE3NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfaGVzaW9kLnNvCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19oZXNpb2Quc28uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfaGVzaW9kLnNvLjIgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX2hlc2lvZC5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmI2MWE3MzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX2hlc2lvZC5zby4yCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19oZXNpb2QtMi4xNS5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzLTIuMTUuc28gYi9zeXNyb290L3Vzci9saWIvbGlibnNzX25pcy0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNjE3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX25pcy0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zc19uaXMuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYTQwMzY1MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzLnNvCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19uaXMuc28uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzLnNvLjIgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX25pcy5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjlmODk2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX25pcy5zby4yCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19uaXMtMi4xNS5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzcGx1cy0yLjE1LnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zc19uaXNwbHVzLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2NWVmMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzcGx1cy0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzcGx1cy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzcGx1cy5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iYTYxOGYxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zc19uaXNwbHVzLnNvCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19uaXNwbHVzLnNvLjIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlibnNzX25pc3BsdXMuc28uMiBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzcGx1cy5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjdlNDUwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX25pc3BsdXMuc28uMgpAQCAtMCwwICsxIEBACitsaWJuc3NfbmlzcGx1cy0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnBhbmVsLmEgYi9zeXNyb290L3Vzci9saWIvbGlicGFuZWwuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGU2MDM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnBhbmVsLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnBhbmVsLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYnBhbmVsLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmI1Y2Q0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicGFuZWwuc28KQEAgLTAsMCArMSBAQAorbGlicGFuZWwuc28uNQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJwYW5lbC5zby41IGIvc3lzcm9vdC91c3IvbGliL2xpYnBhbmVsLnNvLjUKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNTY5NDc5OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwYW5lbC5zby41CkBAIC0wLDAgKzEgQEAKK2xpYnBhbmVsLnNvLjUuOQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJwYW5lbC5zby41LjkgYi9zeXNyb290L3Vzci9saWIvbGlicGFuZWwuc28uNS45Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNjQ0NmEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicGFuZWwuc28uNS45CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJwY3Byb2ZpbGUuc28gYi9zeXNyb290L3Vzci9saWIvbGlicGNwcm9maWxlLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNjRiMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicGNwcm9maWxlLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJwdGhyZWFkLTIuMTUuc28gYi9zeXNyb290L3Vzci9saWIvbGlicHRocmVhZC0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZjMGRmNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicHRocmVhZC0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJwdGhyZWFkLmEgYi9zeXNyb290L3Vzci9saWIvbGlicHRocmVhZC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMDYxYzgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicHRocmVhZC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJwdGhyZWFkLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYnB0aHJlYWQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAyY2U3MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdGhyZWFkLnNvCkBAIC0wLDAgKzEsNSBAQAorLyogR05VIGxkIHNjcmlwdAorICAgVXNlIHRoZSBzaGFyZWQgbGlicmFyeSwgYnV0IHNvbWUgZnVuY3Rpb25zIGFyZSBvbmx5IGluCisgICB0aGUgc3RhdGljIGxpYnJhcnksIHNvIHRyeSB0aGF0IHNlY29uZGFyaWx5LiAgKi8KK09VVFBVVF9GT1JNQVQoZWxmNjQteDg2LTY0KQorR1JPVVAgKCBsaWJwdGhyZWFkLnNvLjAgbGlicHRocmVhZF9ub25zaGFyZWQuYSApCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlicHRocmVhZC5zby4wIGIvc3lzcm9vdC91c3IvbGliL2xpYnB0aHJlYWQuc28uMApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yMTU5N2IzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnB0aHJlYWQuc28uMApAQCAtMCwwICsxIEBACitsaWJwdGhyZWFkLTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlicHRocmVhZF9ub25zaGFyZWQuYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdGhyZWFkX25vbnNoYXJlZC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YTA4YTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicHRocmVhZF9ub25zaGFyZWQuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlicHVsc2UtbWFpbmxvb3AtZ2xpYi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS1tYWlubG9vcC1nbGliLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmY0NjZiNGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicHVsc2UtbWFpbmxvb3AtZ2xpYi5zbwpAQCAtMCwwICsxIEBACitsaWJwdWxzZS1tYWlubG9vcC1nbGliLnNvLjAuMC40ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLXNpbXBsZS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS1zaW1wbGUuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMmY2NWQ1YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS1zaW1wbGUuc28KQEAgLTAsMCArMSBAQAorbGlicHVsc2Utc2ltcGxlLnNvLjAuMC4zClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLXNpbXBsZS5zby4wIGIvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLXNpbXBsZS5zby4wCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjJmNjVkNWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicHVsc2Utc2ltcGxlLnNvLjAKQEAgLTAsMCArMSBAQAorbGlicHVsc2Utc2ltcGxlLnNvLjAuMC4zClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLXNpbXBsZS5zby4wLjAuMyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS1zaW1wbGUuc28uMC4wLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIyODk5MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS1zaW1wbGUuc28uMC4wLjMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjhlZGU2YTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicHVsc2Uuc28KQEAgLTAsMCArMSBAQAorbGlicHVsc2Uuc28uMC4xMy41ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLnNvLjAgYi9zeXNyb290L3Vzci9saWIvbGlicHVsc2Uuc28uMApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi44ZWRlNmE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLnNvLjAKQEAgLTAsMCArMSBAQAorbGlicHVsc2Uuc28uMC4xMy41ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLnNvLjAuMTMuNSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS5zby4wLjEzLjUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA4N2ZmNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS5zby4wLjEzLjUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlY29tbW9uLTEuMS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZWNvbW1vbi0xLjEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM1ZjYwMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZWNvbW1vbi0xLjEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnJlc29sdi0yLjE1LnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYnJlc29sdi0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMDdiOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicmVzb2x2LTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnJlc29sdi5hIGIvc3lzcm9vdC91c3IvbGliL2xpYnJlc29sdi5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlM2FlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicmVzb2x2LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnJlc29sdi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJyZXNvbHYuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYmY2YzE3ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJyZXNvbHYuc28KQEAgLTAsMCArMSBAQAorbGlicmVzb2x2LnNvLjIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlicmVzb2x2LnNvLjIgYi9zeXNyb290L3Vzci9saWIvbGlicmVzb2x2LnNvLjIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMjgzYTkyMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJyZXNvbHYuc28uMgpAQCAtMCwwICsxIEBACitsaWJyZXNvbHYtMi4xNS5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJycGNzdmMuYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJycGNzdmMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzQwYWNiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnJwY3N2Yy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJydC0yLjE1LnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYnJ0LTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjYjc1YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJydC0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJydC5hIGIvc3lzcm9vdC91c3IvbGliL2xpYnJ0LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU5Y2NjZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJydC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJydC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJydC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4wODIwZGY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnJ0LnNvCkBAIC0wLDAgKzEgQEAKK2xpYnJ0LnNvLjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlicnQuc28uMSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJydC5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmI2NzhlMDEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicnQuc28uMQpAQCAtMCwwICsxIEBACitsaWJydC0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnRlcm1jYXAuYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ0ZXJtY2FwLmEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMjYxMTczOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ0ZXJtY2FwLmEKQEAgLTAsMCArMSBAQAorbGlidGluZm8uYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJ0ZXJtY2FwLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYnRlcm1jYXAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIzNTU4MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ0ZXJtY2FwLnNvCkBAIC0wLDAgKzEsMyBAQAorLyogV2UgdXNlIGEgbGlua2VyIHNjcmlwdCByYXRoZXIgdGhhbiBhIHN5bWxpbmsgdG8gd29yayBhcm91bmQKKyAgIGFuIGxkY29uZmlnIGJ1Zywgc2VlIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvMjQ5MTIyLiAqLworR1JPVVAoIGxpYnRpbmZvLnNvICkKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJ0aHJlYWRfZGItMS4wLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYnRocmVhZF9kYi0xLjAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0MTBlZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ0aHJlYWRfZGItMS4wLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJ0aHJlYWRfZGIuc28gYi9zeXNyb290L3Vzci9saWIvbGlidGhyZWFkX2RiLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjM5MTk0NTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlidGhyZWFkX2RiLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnRocmVhZF9kYi5zby4xClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnRocmVhZF9kYi5zby4xIGIvc3lzcm9vdC91c3IvbGliL2xpYnRocmVhZF9kYi5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmJjNTI1MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlidGhyZWFkX2RiLnNvLjEKQEAgLTAsMCArMSBAQAorbGlidGhyZWFkX2RiLTEuMC5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJ0aWMuYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ0aWMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmNkNzBlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnRpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJ0aWMuc28gYi9zeXNyb290L3Vzci9saWIvbGlidGljLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmIyOGM1NWIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlidGljLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnRpYy5zby41ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnRpYy5zby41IGIvc3lzcm9vdC91c3IvbGliL2xpYnRpYy5zby41Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjU4ZjQ1YWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlidGljLnNvLjUKQEAgLTAsMCArMSBAQAorbGlidGljLnNvLjUuOQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJ0aWMuc28uNS45IGIvc3lzcm9vdC91c3IvbGliL2xpYnRpYy5zby41LjkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ3MDgyZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ0aWMuc28uNS45CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJ0aW5mby5hIGIvc3lzcm9vdC91c3IvbGliL2xpYnRpbmZvLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2NTI5NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ0aW5mby5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJ0aW5mby5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ0aW5mby5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40ZmFiODkyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnRpbmZvLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnRpbmZvLnNvLjUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlidGluZm8uc28uNSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ0aW5mby5zby41Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmNmOWJkMTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlidGluZm8uc28uNQpAQCAtMCwwICsxIEBACitsaWJ0aW5mby5zby41LjkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlidGluZm8uc28uNS45IGIvc3lzcm9vdC91c3IvbGliL2xpYnRpbmZvLnNvLjUuOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTExZWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnRpbmZvLnNvLjUuOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlidXRpbC0yLjE1LnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYnV0aWwtMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTJmZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnV0aWwtMi4xNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlidXRpbC5hIGIvc3lzcm9vdC91c3IvbGliL2xpYnV0aWwuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmE1YjFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnV0aWwuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlidXRpbC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ1dGlsLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmIzYWY2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlidXRpbC5zbwpAQCAtMCwwICsxIEBACitsaWJ1dGlsLnNvLjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlidXRpbC5zby4xIGIvc3lzcm9vdC91c3IvbGliL2xpYnV0aWwuc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41ZmZhM2QyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnV0aWwuc28uMQpAQCAtMCwwICsxIEBACitsaWJ1dGlsLTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlieGNiLmEgYi9zeXNyb290L3Vzci9saWIvbGlieGNiLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM1NTdhMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ4Y2IuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlieGNiLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYnhjYi5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5lODU4ZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnhjYi5zbwpAQCAtMCwwICsxIEBACitsaWJ4Y2Iuc28uMS4xLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlieGNiLnNvLjEgYi9zeXNyb290L3Vzci9saWIvbGlieGNiLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZTg1OGQ0NgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ4Y2Iuc28uMQpAQCAtMCwwICsxIEBACitsaWJ4Y2Iuc28uMS4xLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlieGNiLnNvLjEuMS4wIGIvc3lzcm9vdC91c3IvbGliL2xpYnhjYi5zby4xLjEuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmYzZmIyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnhjYi5zby4xLjEuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliei5hIGIvc3lzcm9vdC91c3IvbGliL2xpYnouYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTVhYjgyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnouYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliei5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ6LnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjY5M2E1ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliei5zbwpAQCAtMCwwICsxIEBACitsaWJ6LnNvLjEuMi4zLjQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliei5zby4xIGIvc3lzcm9vdC91c3IvbGliL2xpYnouc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42OTNhNWRkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnouc28uMQpAQCAtMCwwICsxIEBACitsaWJ6LnNvLjEuMi4zLjQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliei5zby4xLjIuMy40IGIvc3lzcm9vdC91c3IvbGliL2xpYnouc28uMS4yLjMuNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmIxYWEyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnouc28uMS4yLjMuNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbWVzYS9sZC5zby5jb25mIGIvc3lzcm9vdC91c3IvbGliL21lc2EvbGQuc28uY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2M1NWFiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL21lc2EvbGQuc28uY29uZgpAQCAtMCwwICsxIEBACisvdXNyL2xpYi94ODZfNjQtbGludXgtZ251L21lc2EKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9tZXNhL2xpYkdMLnNvIGIvc3lzcm9vdC91c3IvbGliL21lc2EvbGliR0wuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uM2NkZDljMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9tZXNhL2xpYkdMLnNvCkBAIC0wLDAgKzEgQEAKK2xpYkdMLnNvLjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbWVzYS9saWJHTC5zby4xIGIvc3lzcm9vdC91c3IvbGliL21lc2EvbGliR0wuc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5jMGFiOGMzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL21lc2EvbGliR0wuc28uMQpAQCAtMCwwICsxIEBACitsaWJHTC5zby4xLjIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbWVzYS9saWJHTC5zby4xLjIgYi9zeXNyb290L3Vzci9saWIvbWVzYS9saWJHTC5zby4xLjIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyYTNkZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9tZXNhL2xpYkdMLnNvLjEuMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2Fsc2EucGMgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2Fsc2EucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1NDI3MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvYWxzYS5wYwpAQCAtMCwwICsxLDE0IEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9L3VzcgorbGliZGlyPSR7cHJlZml4fS9saWIveDg2XzY0LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorCitOYW1lOiBhbHNhCitEZXNjcmlwdGlvbjogQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlIChBTFNBKSAtIExpYnJhcnkKK1ZlcnNpb246IDEuMC4yNQorUmVxdWlyZXM6IAorTGliczogLUwke2xpYmRpcn0gLWxhc291bmQKK0xpYnMucHJpdmF0ZTogLWxtIC1sZGwgLWxwdGhyZWFkIC1scnQKKyMgLUkke2luY2x1ZGVkaXJ9L2Fsc2EgYmVsb3cgaXMganVzdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorIyAoaXQgd2FzIHNldCBzbyBtaXN0YWtlbHkgaW4gdGhlIG9sZGVyIHZlcnNpb24pCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfSAtSSR7aW5jbHVkZWRpcn0vYWxzYQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9hdWRpb2ZpbGUucGMgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2F1ZGlvZmlsZS5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTZkZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9hdWRpb2ZpbGUucGMKQEAgLTAsMCArMSwxMiBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7cHJlZml4fS9saWIveDg2XzY0LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorCitOYW1lOiBhdWRpb2ZpbGUKK0Rlc2NyaXB0aW9uOiBhdWRpb2ZpbGUKK1JlcXVpcmVzOgorVmVyc2lvbjogMC4zLjMKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sYXVkaW9maWxlCitMaWJzLnByaXZhdGU6IC1sbQorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvZHJpLnBjIGIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9kcmkucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxOWIwOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvZHJpLnBjCkBAIC0wLDAgKzEsMTEgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0vdXNyL2xpYi94ODZfNjQtbGludXgtZ251CitpbmNsdWRlZGlyPS91c3IvaW5jbHVkZQorZHJpZHJpdmVyZGlyPS91c3IvbGliL3g4Nl82NC1saW51eC1nbnUvZHJpCisKK05hbWU6IGRyaQorRGVzY3JpcHRpb246IERpcmVjdCBSZW5kZXJpbmcgSW5mcmFzdHJ1Y3R1cmUKK1ZlcnNpb246IDguMC4wCitSZXF1aXJlcy5wcml2YXRlOiBsaWJkcm0gPj0gMi40LjI0CitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9lc291bmQucGMgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2Vzb3VuZC5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzc4M2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9lc291bmQucGMKQEAgLTAsMCArMSwxMiBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7cHJlZml4fS9saWIveDg2XzY0LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorZXNkX3NlcnZlcmRpcj0ke3ByZWZpeH0vYmluCisKK05hbWU6IGVzb3VuZAorRGVzY3JpcHRpb246IGVzb3VuZAorUmVxdWlyZXMucHJpdmF0ZTogYXVkaW9maWxlCitWZXJzaW9uOiAwLjIuNDEKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sZXNkIAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvZm9ybS5wYyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvZm9ybS5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjk2OWFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9mb3JtLnBjCkBAIC0wLDAgKzEsMTMgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0vdXNyL2xpYi94ODZfNjQtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCittYWpvcl92ZXJzaW9uPTUKK3ZlcnNpb249NS45LjIwMTEwNDA0CisKK05hbWU6IGZvcm0KK0Rlc2NyaXB0aW9uOiBuY3Vyc2VzIDUuOSBhZGQtb24gbGlicmFyeQorVmVyc2lvbjogJHt2ZXJzaW9ufQorUmVxdWlyZXM6IG5jdXJzZXMgdGluZm8KK0xpYnM6IC1MJHtsaWJkaXJ9IC1sZm9ybQorQ2ZsYWdzOiAKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvZ2wucGMgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2dsLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYmNkNGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2dsLnBjCkBAIC0wLDAgKzEsMTMgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0vdXNyL2xpYi94ODZfNjQtbGludXgtZ251CitpbmNsdWRlZGlyPS91c3IvaW5jbHVkZQorCitOYW1lOiBnbAorRGVzY3JpcHRpb246IE1lc2EgT3BlbkdMIGxpYnJhcnkKK1JlcXVpcmVzLnByaXZhdGU6IHgxMSB4ZXh0CitWZXJzaW9uOiA4LjAuMAorTGliczogLUwke2xpYmRpcn0gLWxHTAorTGlicy5wcml2YXRlOiAtbG0gLWxwdGhyZWFkCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfSAKK2dseF90bHM6IG5vCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2xpYnB1bHNlLW1haW5sb29wLWdsaWIucGMgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2xpYnB1bHNlLW1haW5sb29wLWdsaWIucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5MDE1NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbGlicHVsc2UtbWFpbmxvb3AtZ2xpYi5wYwpAQCAtMCwwICsxLDEyIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtwcmVmaXh9L2xpYi94ODZfNjQtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCisKK05hbWU6IGxpYnB1bHNlLW1haW5sb29wLWdsaWIKK0Rlc2NyaXB0aW9uOiBQdWxzZUF1ZGlvIEdMaWIgMi4wIE1haW4gTG9vcCBXcmFwcGVyCitWZXJzaW9uOiAxLjEKK0xpYnM6IC1MJHtsaWJkaXJ9IC1scHVsc2UtbWFpbmxvb3AtZ2xpYiAKK0xpYnMucHJpdmF0ZTogLWxwdWxzZWNvbW1vbi0xLjEKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9IC1EX1JFRU5UUkFOVAorUmVxdWlyZXM6IGxpYnB1bHNlIGdsaWItMi4wCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2xpYnB1bHNlLXNpbXBsZS5wYyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbGlicHVsc2Utc2ltcGxlLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNzdlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2xpYnB1bHNlLXNpbXBsZS5wYwpAQCAtMCwwICsxLDEyIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtwcmVmaXh9L2xpYi94ODZfNjQtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCisKK05hbWU6IGxpYnB1bHNlLXNpbXBsZQorRGVzY3JpcHRpb246IFB1bHNlQXVkaW8gU2ltcGxpZmllZCBTeW5jaHJvbm91cyBDbGllbnQgSW50ZXJmYWNlCitWZXJzaW9uOiAxLjEKK0xpYnM6IC1MJHtsaWJkaXJ9IC1scHVsc2Utc2ltcGxlIAorTGlicy5wcml2YXRlOiAtbHB1bHNlY29tbW9uLTEuMQorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0gLURfUkVFTlRSQU5UCitSZXF1aXJlczogbGlicHVsc2UKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbGlicHVsc2UucGMgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2xpYnB1bHNlLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZjllYTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2xpYnB1bHNlLnBjCkBAIC0wLDAgKzEsMTIgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0ke3ByZWZpeH0vbGliL3g4Nl82NC1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKK21vZGxpYmV4ZWNkaXI9JHtwcmVmaXh9L2xpYi9wdWxzZS0xLjEvbW9kdWxlcworCitOYW1lOiBsaWJwdWxzZQorRGVzY3JpcHRpb246IFB1bHNlQXVkaW8gQ2xpZW50IEludGVyZmFjZQorVmVyc2lvbjogMS4xCitMaWJzOiAtTCR7bGliZGlyfSAtbHB1bHNlIAorTGlicy5wcml2YXRlOiAtbHB1bHNlY29tbW9uLTEuMQorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0gLURfUkVFTlRSQU5UCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL21lbnUucGMgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL21lbnUucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgwNDBhNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbWVudS5wYwpAQCAtMCwwICsxLDEzIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9L3Vzci9saWIveDg2XzY0LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorbWFqb3JfdmVyc2lvbj01Cit2ZXJzaW9uPTUuOS4yMDExMDQwNAorCitOYW1lOiBtZW51CitEZXNjcmlwdGlvbjogbmN1cnNlcyA1LjkgYWRkLW9uIGxpYnJhcnkKK1ZlcnNpb246ICR7dmVyc2lvbn0KK1JlcXVpcmVzOiBuY3Vyc2VzIHRpbmZvCitMaWJzOiAtTCR7bGliZGlyfSAtbG1lbnUKK0NmbGFnczogCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL25jdXJzZXMrKy5wYyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbmN1cnNlcysrLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYzZjMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL25jdXJzZXMrKy5wYwpAQCAtMCwwICsxLDEzIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9L3Vzci9saWIveDg2XzY0LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorbWFqb3JfdmVyc2lvbj01Cit2ZXJzaW9uPTUuOS4yMDExMDQwNAorCitOYW1lOiBuY3Vyc2VzKysKK0Rlc2NyaXB0aW9uOiBuY3Vyc2VzIDUuOSBhZGQtb24gbGlicmFyeQorVmVyc2lvbjogJHt2ZXJzaW9ufQorUmVxdWlyZXM6IHBhbmVsIG1lbnUgZm9ybSBuY3Vyc2VzIHRpbmZvCitMaWJzOiAtTCR7bGliZGlyfSAtbG5jdXJzZXMrKworQ2ZsYWdzOiAKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbmN1cnNlcy5wYyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbmN1cnNlcy5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2U1YTVjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9uY3Vyc2VzLnBjCkBAIC0wLDAgKzEsMTMgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0vdXNyL2xpYi94ODZfNjQtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCittYWpvcl92ZXJzaW9uPTUKK3ZlcnNpb249NS45LjIwMTEwNDA0CisKK05hbWU6IG5jdXJzZXMKK0Rlc2NyaXB0aW9uOiBuY3Vyc2VzIDUuOSBsaWJyYXJ5CitWZXJzaW9uOiAke3ZlcnNpb259CitSZXF1aXJlczogdGluZm8KK0xpYnM6IC1MJHtsaWJkaXJ9IC1sbmN1cnNlcworQ2ZsYWdzOiAKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvcGFuZWwucGMgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3BhbmVsLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNDUyMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3BhbmVsLnBjCkBAIC0wLDAgKzEsMTMgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0vdXNyL2xpYi94ODZfNjQtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCittYWpvcl92ZXJzaW9uPTUKK3ZlcnNpb249NS45LjIwMTEwNDA0CisKK05hbWU6IHBhbmVsCitEZXNjcmlwdGlvbjogbmN1cnNlcyA1LjkgYWRkLW9uIGxpYnJhcnkKK1ZlcnNpb246ICR7dmVyc2lvbn0KK1JlcXVpcmVzOiBuY3Vyc2VzIHRpbmZvCitMaWJzOiAtTCR7bGliZGlyfSAtbHBhbmVsCitDZmxhZ3M6IApkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy90aWMucGMgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3RpYy5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGMyNGRmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy90aWMucGMKQEAgLTAsMCArMSwxMyBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPS91c3IvbGliL3g4Nl82NC1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKK21ham9yX3ZlcnNpb249NQordmVyc2lvbj01LjkuMjAxMTA0MDQKKworTmFtZTogdGljCitEZXNjcmlwdGlvbjogbmN1cnNlcyA1LjkgYWRkLW9uIGxpYnJhcnkKK1ZlcnNpb246ICR7dmVyc2lvbn0KK1JlcXVpcmVzOiBuY3Vyc2VzIHRpbmZvCitMaWJzOiAtTCR7bGliZGlyfSAtbHRpYworQ2ZsYWdzOiAKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvdGluZm8ucGMgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3RpbmZvLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OWQyYTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3RpbmZvLnBjCkBAIC0wLDAgKzEsMTMgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0vdXNyL2xpYi94ODZfNjQtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCittYWpvcl92ZXJzaW9uPTUKK3ZlcnNpb249NS45LjIwMTEwNDA0CisKK05hbWU6IHRpbmZvCitEZXNjcmlwdGlvbjogbmN1cnNlcyA1LjkgdGVybWluYWwgaW50ZXJmYWNlIGxpYnJhcnkKK1ZlcnNpb246ICR7dmVyc2lvbn0KK1JlcXVpcmVzOiAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sdGluZm8gIAorQ2ZsYWdzOiAKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcveDExLnBjIGIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy94MTEucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJkOTE5NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcveDExLnBjCkBAIC0wLDAgKzEsMTUgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0ke3ByZWZpeH0vbGliL3g4Nl82NC1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKKworeHRocmVhZGxpYj0tbHB0aHJlYWQKKworTmFtZTogWDExCitEZXNjcmlwdGlvbjogWCBMaWJyYXJ5CitWZXJzaW9uOiAxLjQuOTkuMQorUmVxdWlyZXM6IHhwcm90byBrYnByb3RvCitSZXF1aXJlcy5wcml2YXRlOiB4Y2IgPj0gMS4xLjkyCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfSAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sWDExCitMaWJzLnByaXZhdGU6IC1scHRocmVhZApkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy94Y2IucGMgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3hjYi5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTQ1NmE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy94Y2IucGMKQEAgLTAsMCArMSwxMyBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7cHJlZml4fS9saWIveDg2XzY0LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQoreGNicHJvdG9fdmVyc2lvbj0xLjcKKworTmFtZTogWENCCitEZXNjcmlwdGlvbjogWC1wcm90b2NvbCBDIEJpbmRpbmcKK1ZlcnNpb246IDEuOC4xCitSZXF1aXJlcy5wcml2YXRlOiBwdGhyZWFkLXN0dWJzIHhhdSA+PSAwLjk5LjIgeGRtY3AKK0xpYnM6IC1MJHtsaWJkaXJ9IC1seGNiCitMaWJzLnByaXZhdGU6IAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcveGV4dC5wYyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcveGV4dC5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTAyY2FhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy94ZXh0LnBjCkBAIC0wLDAgKzEsMTIgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0ke3ByZWZpeH0vbGliL3g4Nl82NC1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKKworTmFtZTogWGV4dAorRGVzY3JpcHRpb246IE1pc2MgWCBFeHRlbnNpb24gTGlicmFyeQorVmVyc2lvbjogMS4zLjAKK1JlcXVpcmVzOiB4ZXh0cHJvdG8KK1JlcXVpcmVzLnByaXZhdGU6IHgxMQorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KK0xpYnM6IC1MJHtsaWJkaXJ9IC1sWGV4dApkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy94Zml4ZXMucGMgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3hmaXhlcy5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTAzYjZlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy94Zml4ZXMucGMKQEAgLTAsMCArMSwxMiBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7cHJlZml4fS9saWIveDg2XzY0LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorCitOYW1lOiBYZml4ZXMKK0Rlc2NyaXB0aW9uOiBYIEZpeGVzICBMaWJyYXJ5CitWZXJzaW9uOiA1LjAKK1JlcXVpcmVzOiB4cHJvdG8gZml4ZXNwcm90byA+PSA1LjAKK1JlcXVpcmVzLnByaXZhdGU6IHgxMQorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KK0xpYnM6IC1MJHtsaWJkaXJ9IC1sWGZpeGVzCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3hpLnBjIGIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy94aS5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2NhZDRjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy94aS5wYwpAQCAtMCwwICsxLDEyIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtwcmVmaXh9L2xpYi94ODZfNjQtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCisKK05hbWU6IFhpCitEZXNjcmlwdGlvbjogWCBJbnB1dCBFeHRlbnNpb24gTGlicmFyeQorVmVyc2lvbjogMS42LjAKK1JlcXVpcmVzOiBpbnB1dHByb3RvCitSZXF1aXJlcy5wcml2YXRlOiB4MTEgeGV4dAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KK0xpYnM6IC1MJHtsaWJkaXJ9IC1sWGkKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvemxpYi5wYyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvemxpYi5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzYwYzJkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy96bGliLnBjCkBAIC0wLDAgKzEsMTIgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0ke3ByZWZpeH0vbGliL3g4Nl82NC1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKKworTmFtZTogemxpYgorRGVzY3JpcHRpb246IHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQorVmVyc2lvbjogMS4yLjMuNAorCitSZXF1aXJlczogCitMaWJzOiAtTCR7bGliZGlyfSAtbHoKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvdmFsZ3JpbmQvbmN1cnNlcy5zdXBwIGIvc3lzcm9vdC91c3IvbGliL3ZhbGdyaW5kL25jdXJzZXMuc3VwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2E1ODJjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL3ZhbGdyaW5kL25jdXJzZXMuc3VwcApAQCAtMCwwICsxLDIwNSBAQAorIyAkSWQ6IG5jdXJzZXMuc3VwcCx2IDEuNyAyMDA4LzA5LzIwIDE4OjQzOjQyIHRvbSBFeHAgJAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgICAjCisjIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksICMKKyMgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiAgIworIyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSAgICAjCisjIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvICMKKyMgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSAgIworIyBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gIworIyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgICAgICAjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgIworIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgICAjCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMICAgICMKKyMgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSICAgICAgIworIyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyAgICAjCisjIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgICAgICAgICMKKyMgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAgICMKKyMgaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgIworIyB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgICAgICAgICAjCisjIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBUaGlzIGlzIGEgd2FybmluZy1zdXBwcmVzc2lvbiBmaWxlIGZvciB2YWxncmluZCBhbmQgbmN1cnNlcy4KKyMKKyMgbmN1cnNlcyBjYW4gYWxzbyBiZSBjb25maWd1cmVkIHVzaW5nIHRoZSAtLWRpc2FibGUtbGVha3Mgb3B0aW9uLCB3aGljaAorIyBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gY2FsbCBfbmNfZnJlZWFsbCgpIG9yIF9uY19mcmVlX2FuZF9leGl0KCksIHRvCisjIGZyZWUgYWxsIG9mIG5jdXJzZXMnICJwZXJtYW5lbnQiIG1lbW9yeS4KKyMKKyMgU29tZSBvZiB0aGVzZSBsZWFrcyBjYW4gYmUgZnJlZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgaXRzIG93biBjbGVhbnVwLAorIyBmb3IgZXhhbXBsZToKKyMJZGVsc2NyZWVuKFNQKTsKKyMJZGVsX2N1cnRlcm0oY3VyX3Rlcm0pOworIyBIb3dldmVyLCBmZXcgYXBwbGljYXRpb25zIGRvIHRoaXMuCisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfYWRkX3RvX3RyeQorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOiphbGxvYworICAgZnVuOl9uY19hZGRfdG9fdHJ5Cit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfaG9tZV90ZXJtaW5mbworICAgTWVtY2hlY2s6TGVhaworICAgZnVuOm1hbGxvYworICAgZnVuOl9uY19ob21lX3Rlcm1pbmZvCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfaW5pdF93YWNzCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46Y2FsbG9jCisgICBmdW46X25jX2luaXRfd2FjcworfQorCit7CisgICBuY3Vyc2VzX2xlYWtfX25jX2tleW5hbWUKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjpjYWxsb2MKKyAgIGZ1bjpfbmNfa2V5bmFtZQorfQorCit7CisgICBuY3Vyc2VzX2xlYWtfX25jX2tleW5hbWVfMgorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOm1hbGxvYworICAgZnVuOnN0cmR1cAorICAgZnVuOl9uY19rZXluYW1lCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfcHJpbnRmX3N0cmluZworICAgTWVtY2hlY2s6TGVhaworICAgZnVuOm1hbGxvYworICAgZnVuOl9uY19kb2FsbG9jCisgICBmdW46X25jX3ByaW50Zl9zdHJpbmcKK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19yZWFkX3Rlcm10eXBlCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46KmFsbG9jCisgICBmdW46X25jX3JlYWRfdGVybXR5cGUKKyAgIGZ1bjpfbmNfcmVhZF9maWxlX2VudHJ5Cit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfcmVhZF90ZXJtdHlwZV8yCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46KmFsbG9jCisgICBmdW46X25jX2RvYWxsb2MKKyAgIGZ1bjpfbmNfcmVhZF90ZXJtdHlwZQorICAgZnVuOl9uY19yZWFkX2ZpbGVfZW50cnkKK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19zY3JvbGxfb3B0aW1pemUKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjoqYWxsb2MKKyAgIGZ1bjpfbmNfaGFzaF9tYXAKKyAgIGZ1bjpfbmNfc2Nyb2xsX29wdGltaXplCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfc2Nyb2xsX29wdGltaXplXzIKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjoqYWxsb2MKKyAgIGZ1bjpfbmNfZG9hbGxvYworICAgZnVuOl9uY19zY3JvbGxfb3B0aW1pemUKK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19zZXR1cHNjcmVlbgorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOmNhbGxvYworICAgZnVuOl9uY19zZXR1cHNjcmVlbgorICAgZnVuOm5ld3Rlcm0KK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19zZXR1cHNjcmVlbl8yCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46Y2FsbG9jCisgICBmdW46bmV3d2luCisgICBmdW46X25jX3NldHVwc2NyZWVuCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfc2V0dXB0ZXJtXzEKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjptYWxsb2MKKyAgIGZ1bjpzdHJkdXAKKyAgIGZ1bjpfbmNfc2V0dXB0ZXJtCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfc2V0dXB0ZXJtCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46Y2FsbG9jCisgICBmdW46X25jX3NldHVwdGVybQorfQorCit7CisgICBuY3Vyc2VzX2xlYWtfX25jX3NldHVwc2NyZWVuXzMKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjpjYWxsb2MKKyAgIGZ1bjpfbmNfbWFrZW5ldworICAgZnVuOm5ld3dpbgorICAgZnVuOl9uY19zZXR1cHNjcmVlbgorfQorCit7CisgICBuY3Vyc2VzX2xlYWtfX25jX3NldF9idWZmZXIKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjptYWxsb2MKKyAgIGZ1bjpfbmNfc2V0X2J1ZmZlcgorfQorCit7CisgICBuY3Vyc2VzX2xlYWtfX25jX3RwYXJtX2FuYWx5emUKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjoqYWxsb2MKKyAgIGZ1bjpfbmNfZG9hbGxvYworICAgZnVuOl9uY190cGFybV9hbmFseXplCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfdHJhY2VfYWxsb2MKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjoqYWxsb2MKKyAgIGZ1bjpfbmNfZG9hbGxvYworICAgZnVuOl9uY190cmFjZV9hbGxvYworfQorCit7CisgICBuY3Vyc2VzX2xlYWtfc3RhcnRfY29sb3IKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjpjYWxsb2MKKyAgIGZ1bjpzdGFydF9jb2xvcgorfQorCit7CisgICBuY3Vyc2VzX2xlYWtfdHBhcm0KKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjpyZWFsbG9jCisgICBmdW46X25jX2RvYWxsb2MKKyAgIGZ1bjp0cGFybQorfQorCit7CisgICBuY3Vyc2VzX2xlYWtfdHBhcmFtX2ludGVybmFsCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46cmVhbGxvYworICAgZnVuOl9uY19kb2FsbG9jCisgICBmdW46Z2V0X3NwYWNlCisgICBmdW46c2F2ZV9udW1iZXIKKyAgIGZ1bjp0cGFyYW1faW50ZXJuYWwKK30KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL01jcnQxLm8gYi9zeXNyb290L3Vzci9saWIzMi9NY3J0MS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZWRhYWIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9NY3J0MS5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL1NjcnQxLm8gYi9zeXNyb290L3Vzci9saWIzMi9TY3J0MS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOGE5YzcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9TY3J0MS5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2Fsc2EtbGliL3NtaXhlci9zbWl4ZXItYWM5Ny5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2Fsc2EtbGliL3NtaXhlci9zbWl4ZXItYWM5Ny5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjQzMjI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvYWxzYS1saWIvc21peGVyL3NtaXhlci1hYzk3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2Fsc2EtbGliL3NtaXhlci9zbWl4ZXItaGRhLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvYWxzYS1saWIvc21peGVyL3NtaXhlci1oZGEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY3ZGFlNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2Fsc2EtbGliL3NtaXhlci9zbWl4ZXItaGRhLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2Fsc2EtbGliL3NtaXhlci9zbWl4ZXItc2Jhc2Uuc28gYi9zeXNyb290L3Vzci9saWIzMi9hbHNhLWxpYi9zbWl4ZXIvc21peGVyLXNiYXNlLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NTlkN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9hbHNhLWxpYi9zbWl4ZXIvc21peGVyLXNiYXNlLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2NtYWtlL1B1bHNlQXVkaW8vUHVsc2VBdWRpb0NvbmZpZy5jbWFrZSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2NtYWtlL1B1bHNlQXVkaW8vUHVsc2VBdWRpb0NvbmZpZy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGFhYzg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvY21ha2UvUHVsc2VBdWRpby9QdWxzZUF1ZGlvQ29uZmlnLmNtYWtlCkBAIC0wLDAgKzEsMTAgQEAKK3NldChQVUxTRUFVRElPX0ZPVU5EIFRSVUUpCisKK3NldChQVUxTRUFVRElPX1ZFUlNJT05fTUFKT1IgMSkKK3NldChQVUxTRUFVRElPX1ZFUlNJT05fTUlOT1IgMSkKK3NldChQVUxTRUFVRElPX1ZFUlNJT04gMS4xKQorc2V0KFBVTFNFQVVESU9fVkVSU0lPTl9TVFJJTkcgIjEuMSIpCisKK2ZpbmRfcGF0aChQVUxTRUFVRElPX0lOQ0xVREVfRElSIHB1bHNlL3B1bHNlYXVkaW8uaCBISU5UUyAiL3Vzci9pbmNsdWRlIikKK2ZpbmRfbGlicmFyeShQVUxTRUFVRElPX0xJQlJBUlkgTkFNRVMgcHVsc2UgbGlicHVsc2UgSElOVFMgIi91c3IvbGliL2kzODYtbGludXgtZ251IikKK2ZpbmRfbGlicmFyeShQVUxTRUFVRElPX01BSU5MT09QX0xJQlJBUlkgTkFNRVMgcHVsc2UtbWFpbmxvb3AtZ2xpYiBsaWJwdWxzZS1tYWlubG9vcC1nbGliIEhJTlRTICIvdXNyL2xpYi9pMzg2LWxpbnV4LWdudSIpCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9jbWFrZS9QdWxzZUF1ZGlvL1B1bHNlQXVkaW9Db25maWdWZXJzaW9uLmNtYWtlIGIvc3lzcm9vdC91c3IvbGliMzIvY21ha2UvUHVsc2VBdWRpby9QdWxzZUF1ZGlvQ29uZmlnVmVyc2lvbi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjYxMTA5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvY21ha2UvUHVsc2VBdWRpby9QdWxzZUF1ZGlvQ29uZmlnVmVyc2lvbi5jbWFrZQpAQCAtMCwwICsxLDExIEBACitzZXQoUEFDS0FHRV9WRVJTSU9OIDEuMSkKKworaWYoIiR7UEFDS0FHRV9WRVJTSU9OfSIgVkVSU0lPTl9MRVNTICIke1BBQ0tBR0VfRklORF9WRVJTSU9OfSIgKQorICBzZXQoUEFDS0FHRV9WRVJTSU9OX0NPTVBBVElCTEUgRkFMU0UpCitlbHNlKCIke1BBQ0tBR0VfVkVSU0lPTn0iIFZFUlNJT05fTEVTUyAiJHtQQUNLQUdFX0ZJTkRfVkVSU0lPTn0iICkKKyAgc2V0KFBBQ0tBR0VfVkVSU0lPTl9DT01QQVRJQkxFIFRSVUUpCisgIGlmKCAiJHtQQUNLQUdFX0ZJTkRfVkVSU0lPTn0iIFNUUkVRVUFMICIke1BBQ0tBR0VfVkVSU0lPTn0iKQorICAgIHNldChQQUNLQUdFX1ZFUlNJT05fRVhBQ1QgVFJVRSkKKyAgZW5kaWYoICIke1BBQ0tBR0VfRklORF9WRVJTSU9OfSIgU1RSRVFVQUwgIiR7UEFDS0FHRV9WRVJTSU9OfSIpCitlbmRpZigiJHtQQUNLQUdFX1ZFUlNJT059IiBWRVJTSU9OX0xFU1MgIiR7UEFDS0FHRV9GSU5EX1ZFUlNJT059IiApCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2NydDEubyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2NydDEubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWY3YWFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvY3J0MS5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2NydGkubyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2NydGkubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWZjZTg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvY3J0aS5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2NydG4ubyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2NydG4ubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWUzMzU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvY3J0bi5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0FOU0lfWDMuMTEwLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQU5TSV9YMy4xMTAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiMzRhYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0FOU0lfWDMuMTEwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0FSTVNDSUktOC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0FSTVNDSUktOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTMwODIyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQVJNU0NJSS04LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0FTTU9fNDQ5LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQVNNT180NDkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyZmQ1YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0FTTU9fNDQ5LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0JJRzUuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9CSUc1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOTczY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9CSUc1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0JJRzVIS1NDUy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0JJRzVIS1NDUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTI4NjBkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQklHNUhLU0NTLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0JSRi5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0JSRi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDRlMGJjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQlJGLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTAwMDcuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9DUDEwMDA3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNzYyNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9DUDEwMDA3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTEyNS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTEyNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGVkYmY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMTI1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTI1MC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTI1MC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmRmZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjUwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTI1MS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTI1MS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWY4YmYzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjUxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTI1Mi5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTI1Mi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjJkZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjUyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTI1My5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTI1My5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWE5NmQxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjUzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTI1NC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTI1NC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTNlNDE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjU0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTI1NS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTI1NS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGZjY2JhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjU1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTI1Ni5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTI1Ni5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTIyNmEwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjU2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTI1Ny5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTI1Ny5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWI0YWI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjU3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTI1OC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQMTI1OC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzMxYWVlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1AxMjU4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQNzM3LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3Mzcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ1ZGUwMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQNzM3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQNzcwLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3NzAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2ZTk0YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQNzcwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQNzcxLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3NzEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBjZWJmMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQNzcxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQNzcyLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3NzIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUyNDIwOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQNzcyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQNzczLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3NzMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlZjgwMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQNzczLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQNzc0LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3NzQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA0MGM2YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQNzc0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQNzc1LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A3NzUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjNzBlMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQNzc1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQOTMyLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1A5MzIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExY2YzNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NQOTMyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NTTl8zNjkxMDMuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9DU05fMzY5MTAzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4OTk2ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9DU05fMzY5MTAzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NXSS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0NXSS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2M5Yzc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvQ1dJLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0RFQy1NQ1Muc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9ERUMtTUNTLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMmM5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9ERUMtTUNTLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1BVC1ERS1BLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUFULURFLUEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxYTIxNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1BVC1ERS1BLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1BVC1ERS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1BVC1ERS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWY5YTJiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUFULURFLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1DQS1GUi5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1DQS1GUi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWNjYzZiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUNBLUZSLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1ESy1OTy1BLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLURLLU5PLUEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzN2JhMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1ESy1OTy1BLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1ESy1OTy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1ESy1OTy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWQwZGU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLURLLU5PLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1FUy1BLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUVTLUEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5Mzg4ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1FUy1BLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1FUy1TLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUVTLVMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1YWZjZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1FUy1TLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1FUy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1FUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTBkMDdlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUVTLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1GSS1TRS1BLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUZJLVNFLUEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1M2U1NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1GSS1TRS1BLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1GSS1TRS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1GSS1TRS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODE0Yjk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUZJLVNFLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1GUi5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1GUi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWI3NTFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUZSLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1JUy1GUklTUy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1JUy1GUklTUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTllODEwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUlTLUZSSVNTLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1JVC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1JVC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODFhYzg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLUlULnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1QVC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1QVC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTQxMDNlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLVBULnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1VSy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1VSy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjlhMmM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLVVLLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1VUy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VCQ0RJQy1VUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU2ZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRUJDRElDLVVTLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VDTUEtQ1lSSUxMSUMuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9FQ01BLUNZUklMTElDLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NmI4NzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9FQ01BLUNZUklMTElDLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VVQy1DTi5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VVQy1DTi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGIxNjU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRVVDLUNOLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VVQy1KSVNYMDIxMy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VVQy1KSVNYMDIxMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjY5NjIwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRVVDLUpJU1gwMjEzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VVQy1KUC1NUy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VVQy1KUC1NUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWM2ZjczCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRVVDLUpQLU1TLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VVQy1KUC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VVQy1KUC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTBkOWI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRVVDLUpQLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VVQy1LUi5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VVQy1LUi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzQxMTZkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRVVDLUtSLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VVQy1UVy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0VVQy1UVy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTAxMzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvRVVDLVRXLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dCMTgwMzAuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9HQjE4MDMwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZDg5OGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9HQjE4MDMwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dCQklHNS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dCQklHNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjc2YWUzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR0JCSUc1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dCR0JLLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR0JHQksuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE0YzFkMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dCR0JLLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dCSy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dCSy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWVhZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR0JLLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dFT1JHSUFOLUFDQURFTVkuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9HRU9SR0lBTi1BQ0FERU1ZLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNmJjMTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9HRU9SR0lBTi1BQ0FERU1ZLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dFT1JHSUFOLVBTLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR0VPUkdJQU4tUFMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg0ZDhhOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dFT1JHSUFOLVBTLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dPU1RfMTk3NjgtNzQuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9HT1NUXzE5NzY4LTc0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NjIzNGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9HT1NUXzE5NzY4LTc0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dSRUVLLUNDSVRULnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR1JFRUstQ0NJVFQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ2M2U2ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dSRUVLLUNDSVRULnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dSRUVLNy1PTEQuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9HUkVFSzctT0xELnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4N2ZlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9HUkVFSzctT0xELnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dSRUVLNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0dSRUVLNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzc5ZTU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvR1JFRUs3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0hQLUdSRUVLOC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0hQLUdSRUVLOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGQ3MzFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSFAtR1JFRUs4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0hQLVJPTUFOOC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0hQLVJPTUFOOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTJkOWUzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSFAtUk9NQU44LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0hQLVJPTUFOOS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0hQLVJPTUFOOS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDllZWUyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSFAtUk9NQU45LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0hQLVRIQUk4LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSFAtVEhBSTguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYwNmRmNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0hQLVRIQUk4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0hQLVRVUktJU0g4LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSFAtVFVSS0lTSDguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWViZDgwYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0hQLVRVUktJU0g4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTAzNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTAzNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTE0YzcwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMDM3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTAzOC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTAzOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTU3MzE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMDM4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwMDQuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMDA0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNzVmZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMDA0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwMDguc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMDA4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYWRmOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMDA4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwMDhfNDIwLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTAwOF80MjAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExNjIzZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwMDhfNDIwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwMjUuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMDI1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMTExZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMDI1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwMjYuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMDI2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NmY1YjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMDI2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwNDYuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMDQ2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzODM5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMDQ2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwNDcuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMDQ3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NjZlYzYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMDQ3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEwOTcuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMDk3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMGFlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMDk3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMTIuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTEyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNGQ2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTEyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMjIuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTIyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2OTRjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTIyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMjMuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTIzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MGRiZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTIzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMjQuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTI0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YzUzYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTI0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMjkuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTI5LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOTEyMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTI5LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMzAuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTMwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZGQ0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTMwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMzIuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTMyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YzdjYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTMyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMzMuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTMzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OGFkYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTMzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExMzcuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTM3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YjhkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTM3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDAuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTQwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMGE4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTQwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDEuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTQxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNzBmM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTQxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDIuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTQyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0Mzg4YjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTQyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDMuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTQzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYjlmOTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTQzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDQuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTQ0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NmI5NGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTQ0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDUuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTQ1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMDYwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTQ1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDYuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTQ2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NDlhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTQ2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDcuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTQ3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhODRlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTQ3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDguc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTQ4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNTNjOTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTQ4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNDkuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTQ5LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNGM1ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTQ5LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNTMuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTUzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOTMxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTUzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNTQuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTU0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZjZkYjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTU0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNTUuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTU1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZWQwZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTU1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNTYuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTU2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMTg1YzQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTU2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNTcuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTU3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NjYxMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTU3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNTguc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTU4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZjVjZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTU4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjAuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTYwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNWY4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTYwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjEuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTYxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNWQyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTYxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjIuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTYyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlY2ZlMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTYyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjMuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTYzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZWRiYWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTYzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjQuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTY0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YjY0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTY0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjYuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTY2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MmExYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTY2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTExNjcuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTY3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MzU3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMTY3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEyNzEyLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTI3MTIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJjNjJlOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEyNzEyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEzNjQuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMzY0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNjZkOGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMzY0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEzNzEuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMzcxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3Zjk0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMzcxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEzODguc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMzg4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZmFiMTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMzg4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEzOTAuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMzkwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NWQ2ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMzkwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTEzOTkuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMzk5LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZjhmZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk0xMzk5LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTE2ODA0LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMTY4MDQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1YjE0YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTE2ODA0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI1Ni5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI1Ni5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGNiNGRlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjU2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI3My5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI3My5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTA0YTNhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjczLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI3NC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI3NC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTIzMzhhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjc0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI3NS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI3NS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjY1MDE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjc1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI3Ny5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI3Ny5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2Y3YzUzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjc3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI3OC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI3OC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTNmNzJhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjc4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI4MC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI4MC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjA5ZmYxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjgwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI4MS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI4MS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGM3ZGNhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjgxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI4NC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI4NC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjU4YjViCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjg0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI4NS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI4NS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzYwZmFiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjg1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI5MC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI5MC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWQ0YmVmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjkwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI5Ny5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTI5Ny5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWFlOGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNMjk3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTQyMC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTQyMC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWE3NGQwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNNDIwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTQyMy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTQyMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGM0MGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNNDIzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTQyNC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTQyNC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzZmYzlmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNNDI0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTQzNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTQzNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmE4NjMzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNNDM3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTQ1MTcuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk00NTE3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNzJlYWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk00NTE3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTQ4OTkuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk00ODk5LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OWRlYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk00ODk5LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTQ5MDkuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk00OTA5LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOGM1NDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk00OTA5LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTQ5NzEuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk00OTcxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYjkxMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk00OTcxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTUwMC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTUwMC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzI1ZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNNTAwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTUzNDcuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk01MzQ3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMmJiMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk01MzQ3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTgwMy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTgwMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTg2MzRiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODAzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg1MC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg1MC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDFhODkxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODUwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg1MS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg1MS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTRmMGFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODUxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg1Mi5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg1Mi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yzc2ZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODUyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg1NS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg1NS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmY3Y2QwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODU1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg1Ni5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg1Ni5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGE3ZThlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODU2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg1Ny5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg1Ny5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWVmNjIxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODU3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg2MC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg2MC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTAxYjg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODYwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg2MS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg2MS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDhjM2JmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODYxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg2Mi5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg2Mi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjZmYTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODYyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg2My5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg2My5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2Q4YTcxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODYzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg2NC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg2NC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTg3NmI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODY0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg2NS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg2NS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTY1MDMwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODY1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg2Ni5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg2Ni5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmE0NjI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODY2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg2Nk5BVi5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg2Nk5BVi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGU5M2FlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODY2TkFWLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg2OC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg2OC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDZhZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODY4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg2OS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg2OS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmJkOTk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODY5LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg3MC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg3MC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODA3YzI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODcwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg3MS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg3MS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjQyMGEzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODcxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg3NC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg3NC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGMyYmZiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODc0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg3NS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg3NS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGQ2NjcyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODc1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg4MC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg4MC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yjg1NzFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODgwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg5MS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTg5MS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjMwMDliCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNODkxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkwMS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkwMS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGQ1N2JiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTAxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkwMi5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkwMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDhiZTVjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTAyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkwMy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkwMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2NhNGVkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTAzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkwMzAuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05MDMwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZGJjMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05MDMwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkwNC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkwNC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWNkZTdkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTA0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkwNS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkwNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2EzMGZiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTA1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkwNjYuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05MDY2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMzE2ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05MDY2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkxOC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkxOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTIzNTUxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTE4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkyMS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkyMS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGE4ZGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTIxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkyMi5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkyMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmM4MTU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTIyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkzMC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkzMC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDQ0OTNkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTMwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkzMi5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkzMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YThmMWU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTMyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkzMy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkzMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODYxNTIzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTMzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkzNS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkzNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzhiNDg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTM1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkzNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkzNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2RlZjViCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTM3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkzOS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTkzOS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NThhYzA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTM5LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTk0My5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTk0My5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTNiMDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUJNOTQzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lCTTk0NDguc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05NDQ4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ODhhZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JQk05NDQ4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lFQ19QMjctMS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lFQ19QMjctMS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmEyZDNjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSUVDX1AyNy0xLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lOSVMtOC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lOSVMtOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDY5N2IzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSU5JUy04LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lOSVMtQ1lSSUxMSUMuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JTklTLUNZUklMTElDLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5Yzc5ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JTklTLUNZUklMTElDLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lOSVMuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JTklTLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOGNhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JTklTLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTSVJJLTMzNDIuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU0lSSS0zMzQyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNjZmYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU0lSSS0zMzQyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTy0yMDIyLUNOLUVYVC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTy0yMDIyLUNOLUVYVC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmY4NGRjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPLTIwMjItQ04tRVhULnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTy0yMDIyLUNOLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPLTIwMjItQ04uc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdkNjQyYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTy0yMDIyLUNOLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTy0yMDIyLUpQLTMuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU08tMjAyMi1KUC0zLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NDk4Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU08tMjAyMi1KUC0zLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTy0yMDIyLUpQLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPLTIwMjItSlAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFkNDMyMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTy0yMDIyLUpQLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTy0yMDIyLUtSLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPLTIwMjItS1Iuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIwMGU4ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTy0yMDIyLUtSLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTy1JUi0xOTcuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU08tSVItMTk3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YmNhOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU08tSVItMTk3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTy1JUi0yMDkuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU08tSVItMjA5LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyN2M0OTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU08tSVItMjA5LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzY0Ni5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzY0Ni5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDJkYzZiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPNjQ2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjE4M2IzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS0xLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMTAuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTEwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYjQzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTEwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMTEuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTExLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZGE3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTExLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMTMuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTEzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMTRiNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTEzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMTQuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTE0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZDdlNDkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTE0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMTUuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMGJkOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMTYuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTE2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyODQ3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTE2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMi5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODZhZjIyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS0yLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDI5NjNjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS0zLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktNC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktNC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTU0NTYwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS00LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktNS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzk1YzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS01LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktNi5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktNi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGMzYTk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS02LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWZkZTg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS03LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktOC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWIwYmUyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS04LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktOS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktOS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzRkN2M3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPODg1OS05LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTTzg4NTktOUUuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTlFLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZmUwYzgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU084ODU5LTlFLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTT18xMDM2Ny1CT1guc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU09fMTAzNjctQk9YLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYTljOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU09fMTAzNjctQk9YLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTT18xMTU0OC0xLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPXzExNTQ4LTEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1NjQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTT18xMTU0OC0xLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTT18yMDMzLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPXzIwMzMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczM2JjMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTT18yMDMzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTT181NDI3LUVYVC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTT181NDI3LUVYVC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTk0OTZlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPXzU0MjctRVhULnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTT181NDI3LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPXzU0Mjcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4ZTQ4YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTT181NDI3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTT181NDI4LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPXzU0Mjguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ5OTY1NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTT181NDI4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTT182OTM3LTIuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU09fNjkzNy0yLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYTE1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9JU09fNjkzNy0yLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTT182OTM3LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSVNPXzY5Mzcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlMzdhOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0lTT182OTM3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0pPSEFCLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvSk9IQUIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEzZTFkZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0pPSEFCLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0tPSS04LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvS09JLTguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlNDRkMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0tPSS04LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0tPSTgtUi5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0tPSTgtUi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDgyYWY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvS09JOC1SLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0tPSTgtUlUuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9LT0k4LVJVLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNjhiOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9LT0k4LVJVLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0tPSTgtVC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0tPSTgtVC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmUzYzdhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvS09JOC1ULnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0tPSTgtVS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0tPSTgtVS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTZiYjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvS09JOC1VLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0xBVElOLUdSRUVLLTEuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9MQVRJTi1HUkVFSy0xLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOGE5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9MQVRJTi1HUkVFSy0xLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0xBVElOLUdSRUVLLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTEFUSU4tR1JFRUsuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE3MTc2NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L0xBVElOLUdSRUVLLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L01BQy1DRU5UUkFMRVVST1BFLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTUFDLUNFTlRSQUxFVVJPUEUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZiNjM0ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L01BQy1DRU5UUkFMRVVST1BFLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L01BQy1JUy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L01BQy1JUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWNhNzZjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTUFDLUlTLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L01BQy1TQU1JLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTUFDLVNBTUkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkOTFkNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L01BQy1TQU1JLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L01BQy1VSy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L01BQy1VSy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzQyOTIyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTUFDLVVLLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L01BQ0lOVE9TSC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L01BQ0lOVE9TSC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTM2MGU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTUFDSU5UT1NILnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L01JSy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L01JSy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzg5YzA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTUlLLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L05BVFMtREFOTy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L05BVFMtREFOTy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTJlMjgxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTkFUUy1EQU5PLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L05BVFMtU0VGSS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L05BVFMtU0VGSS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2IzY2EzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvTkFUUy1TRUZJLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1BUMTU0LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvUFQxNTQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhNTVjOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1BUMTU0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1JLMTA0OC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1JLMTA0OC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjA1N2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvUksxMDQ4LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1NBTUktV1MyLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvU0FNSS1XUzIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyMTYzZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1NBTUktV1MyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1NISUZUX0pJU1gwMjEzLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvU0hJRlRfSklTWDAyMTMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM5MGM3MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1NISUZUX0pJU1gwMjEzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1NKSVMuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9TSklTLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYjg1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9TSklTLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1QuNjEuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9ULjYxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMmEwZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9ULjYxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1RDVk41NzEyLTEuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9UQ1ZONTcxMi0xLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOTg2MzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9UQ1ZONTcxMi0xLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1RJUy02MjAuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9USVMtNjIwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MGRjZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9USVMtNjIwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1RTQ0lJLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVFNDSUkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VjN2U0YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1RTQ0lJLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1VIQy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1VIQy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWY4NDIyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVUhDLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1VOSUNPREUuc28gYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9VTklDT0RFLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMzdkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9VTklDT0RFLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1VURi0xNi5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1VURi0xNi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDYzZDM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVVRGLTE2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1VURi0zMi5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1VURi0zMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzU2M2RkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVVRGLTMyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1VURi03LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVVRGLTcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4Y2IzYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1VURi03LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1ZJU0NJSS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L1ZJU0NJSS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzUwMjU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvVklTQ0lJLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L2djb252LW1vZHVsZXMgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9nY29udi1tb2R1bGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhODcwOTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9nY29udi1tb2R1bGVzCkBAIC0wLDAgKzEsMTk3MSBAQAorIyBHTlUgbGliYyBpY29udiBjb25maWd1cmF0aW9uLgorIyBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNSwgMjAwNywgMjAwOCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyMgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyMgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyMgMDIxMTEtMTMwNyBVU0EuCisKKyMgQWxsIGxpbmVzIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKKworIyBJZiB0aGUgbGluZXMgc3RhcnQgd2l0aCBgbW9kdWxlJworIyAgZnJvbXNldDoJZWl0aGVyIGEgbmFtZSB0cmlwbGUgb3IgYSByZWd1bGFyIGV4cHJlc3Npb24gdHJpcGxlLgorIyAgdG9zZXQ6CWEgbmFtZSB0cmlwbGUgb3IgYW4gZXhwcmVzc2lvbiB3aXRoIFxOIHRvIGdldCByZWd1bGFyCisjCQlleHByZXNzaW9uIG1hdGNoaW5nIHJlc3VsdHMuCisjICBmaWxlbmFtZToJZmlsZW5hbWUgb2YgdGhlIG1vZHVsZSBpbXBsZW1lbnRpbmcgdGhlIHRyYW5zZm9ybWF0aW9uLgorIwkJSWYgaXQgaXMgbm90IGFic29sdXRlIHRoZSBwYXRoIGlzIG1hZGUgYWJzb2x1dGUgYnkgcHJlcGVuZGluZworIwkJdGhlIGRpcmVjdG9yeSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIGZvdW5kIGluLgorIyAgY29zdDoJb3B0aW9uYWwgY29zdCBvZiB0aGUgdHJhbnNmb3JtYXRpb24uICBEZWZhdWx0IGlzIDEuCisKKyMgSWYgdGhlIGxpbmVzIHN0YXJ0IHdpdGggYGFsaWFzJworIyAgYWxpYXM6CWFsaWFzIG5hbWUgd2hpY2ggaXMgbm90IHJlYWxseSByZWNvZ25pemVkLgorIyAgbmFtZToJdGhlIHJlYWwgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIHNldAorCithbGlhcwlJU08tSVItNC8vCQlCU180NzMwLy8KK2FsaWFzCUlTTzY0Ni1HQi8vCQlCU180NzMwLy8KK2FsaWFzCUdCLy8JCQlCU180NzMwLy8KK2FsaWFzCVVLLy8JCQlCU180NzMwLy8KK2FsaWFzCUNTSVNPNFVOSVRFREtJTkdET00vLwlCU180NzMwLy8KK21vZHVsZQlCU180NzMwLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJQlNfNDczMC8vCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTEyMS8vCQlDU0FfWjI0My40LTE5ODUtMS8vCithbGlhcwlJU082NDYtQ0EvLwkJQ1NBX1oyNDMuNC0xOTg1LTEvLworYWxpYXMJQ1NBNy0xLy8JCUNTQV9aMjQzLjQtMTk4NS0xLy8KK2FsaWFzCUNBLy8JCQlDU0FfWjI0My40LTE5ODUtMS8vCithbGlhcwlDU0lTTzEyMUNBTkFESUFOMS8vCUNTQV9aMjQzLjQtMTk4NS0xLy8KK2FsaWFzCUNTQV9aMjQzLjQxOTg1MS8vCUNTQV9aMjQzLjQtMTk4NS0xLy8KK21vZHVsZQlDU0FfWjI0My40LTE5ODUtMS8vCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJQ1NBX1oyNDMuNC0xOTg1LTEvLwlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTEyMi8vCQlDU0FfWjI0My40LTE5ODUtMi8vCithbGlhcwlJU082NDYtQ0EyLy8JCUNTQV9aMjQzLjQtMTk4NS0yLy8KK2FsaWFzCUNTQTctMi8vCQlDU0FfWjI0My40LTE5ODUtMi8vCithbGlhcwlDU0lTTzEyMkNBTkFESUFOMi8vCUNTQV9aMjQzLjQtMTk4NS0yLy8KK2FsaWFzCUNTQV9aMjQzLjQxOTg1Mi8vCUNTQV9aMjQzLjQtMTk4NS0yLy8KK21vZHVsZQlDU0FfWjI0My40LTE5ODUtMi8vCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJQ1NBX1oyNDMuNC0xOTg1LTIvLwlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTIxLy8JCURJTl82NjAwMy8vCithbGlhcwlERS8vCQkJRElOXzY2MDAzLy8KK2FsaWFzCUlTTzY0Ni1ERS8vCQlESU5fNjYwMDMvLworYWxpYXMJQ1NJU08yMUdFUk1BTi8vCQlESU5fNjYwMDMvLworbW9kdWxlCURJTl82NjAwMy8vCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCURJTl82NjAwMy8vCQlJU082NDYJCTIKKworYWxpYXMJRFMyMDg5Ly8JCURTXzIwODkvLworYWxpYXMJSVNPNjQ2LURLLy8JCURTXzIwODkvLworYWxpYXMJREsvLwkJCURTXzIwODkvLworYWxpYXMJQ1NJU082NDZEQU5JU0gvLwlEU18yMDg5Ly8KK21vZHVsZQlEU18yMDg5Ly8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJRFNfMjA4OS8vCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTE3Ly8JCUVTLy8KK2FsaWFzCUlTTzY0Ni1FUy8vCQlFUy8vCithbGlhcwlDU0lTTzE3U1BBTklTSC8vCUVTLy8KK21vZHVsZQlFUy8vCQkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlFUy8vCQkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi04NS8vCQlFUzIvLworYWxpYXMJSVNPNjQ2LUVTMi8vCQlFUzIvLworYWxpYXMJQ1NJU084NVNQQU5JU0gyLy8JRVMyLy8KK21vZHVsZQlFUzIvLwkJCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJRVMyLy8JCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTU3Ly8JCUdCXzE5ODgtODAvLworYWxpYXMJQ04vLwkJCUdCXzE5ODgtODAvLworYWxpYXMJSVNPNjQ2LUNOLy8JCUdCXzE5ODgtODAvLworYWxpYXMJQ1NJU081OEdCMTk4OC8vCQlHQl8xOTg4LTgwLy8KK2FsaWFzCUdCXzE5ODg4MC8vCQlHQl8xOTg4LTgwLy8KK21vZHVsZQlHQl8xOTg4LTgwLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJR0JfMTk4OC04MC8vCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTE1Ly8JCUlULy8KK2FsaWFzCUlTTzY0Ni1JVC8vCQlJVC8vCithbGlhcwlDU0lTTzE1SVRBTElBTi8vCUlULy8KK21vZHVsZQlJVC8vCQkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlJVC8vCQkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi0xNC8vCQlKSVNfQzYyMjAtMTk2OS1STy8vCithbGlhcwlKUC8vCQkJSklTX0M2MjIwLTE5NjktUk8vLworYWxpYXMJSVNPNjQ2LUpQLy8JCUpJU19DNjIyMC0xOTY5LVJPLy8KK2FsaWFzCUNTSVNPMTRKSVNDNjIyMFJPLy8JSklTX0M2MjIwLTE5NjktUk8vLworYWxpYXMJSklTX0M2MjIwMTk2OVJPLy8JSklTX0M2MjIwLTE5NjktUk8vLworbW9kdWxlCUpJU19DNjIyMC0xOTY5LVJPLy8JSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlKSVNfQzYyMjAtMTk2OS1STy8vCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItOTIvLwkJSklTX0M2MjI5LTE5ODQtQi8vCithbGlhcwlJU082NDYtSlAtT0NSLUIvLwlKSVNfQzYyMjktMTk4NC1CLy8KK2FsaWFzCUpQLU9DUi1CLy8JCUpJU19DNjIyOS0xOTg0LUIvLworYWxpYXMJQ1NJU085MkpJU0M2Mjk5MTk4NEIvLwlKSVNfQzYyMjktMTk4NC1CLy8KK2FsaWFzCUpJU19DNjIyOTE5ODRCLy8JSklTX0M2MjI5LTE5ODQtQi8vCittb2R1bGUJSklTX0M2MjI5LTE5ODQtQi8vCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJSklTX0M2MjI5LTE5ODQtQi8vCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItMTQxLy8JCUpVU19JLkIxLjAwMi8vCithbGlhcwlJU082NDYtWVUvLwkJSlVTX0kuQjEuMDAyLy8KK2FsaWFzCUpTLy8JCQlKVVNfSS5CMS4wMDIvLworYWxpYXMJWVUvLwkJCUpVU19JLkIxLjAwMi8vCithbGlhcwlDU0lTTzE0MUpVU0lCMTAwMi8vCUpVU19JLkIxLjAwMi8vCittb2R1bGUJSlVTX0kuQjEuMDAyLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJSlVTX0kuQjEuMDAyLy8JCUlTTzY0NgkJMgorCithbGlhcwlJU082NDYtS1IvLwkJS1NDNTYzNi8vCithbGlhcwlDU0tTQzU2MzYvLwkJS1NDNTYzNi8vCittb2R1bGUJS1NDNTYzNi8vCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCUtTQzU2MzYvLwkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi04Ni8vCQlNU1pfNzc5NS4zLy8KK2FsaWFzCUlTTzY0Ni1IVS8vCQlNU1pfNzc5NS4zLy8KK2FsaWFzCUhVLy8JCQlNU1pfNzc5NS4zLy8KK2FsaWFzCUNTSVNPODZIVU5HQVJJQU4vLwlNU1pfNzc5NS4zLy8KK21vZHVsZQlNU1pfNzc5NS4zLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJTVNaXzc3OTUuMy8vCQlJU082NDYJCTIKKworYWxpYXMJQ1VCQS8vCQkJTkNfTkMwMC0xMC8vCithbGlhcwlOQ19OQzAwLTEwOjgxLy8JCU5DX05DMDAtMTAvLworYWxpYXMJSVNPLUlSLTE1MS8vCQlOQ19OQzAwLTEwLy8KK2FsaWFzCUlTTzY0Ni1DVS8vCQlOQ19OQzAwLTEwLy8KK2FsaWFzCUNTSVNPMTUxQ1VCQS8vCQlOQ19OQzAwLTEwLy8KK2FsaWFzCU5DX05DMDAxMC8vCQlOQ19OQzAwLTEwLy8KK21vZHVsZQlOQ19OQzAwLTEwLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJTkNfTkMwMC0xMC8vCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTY5Ly8JCU5GX1pfNjItMDEwLy8KK2FsaWFzCUlTTzY0Ni1GUi8vCQlORl9aXzYyLTAxMC8vCithbGlhcwlGUi8vCQkJTkZfWl82Mi0wMTAvLworYWxpYXMJQ1NJU082OUZSRU5DSC8vCQlORl9aXzYyLTAxMC8vCithbGlhcwlORl9aXzYyMDEwLy8JCU5GX1pfNjItMDEwLy8KK21vZHVsZQlORl9aXzYyLTAxMC8vCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCU5GX1pfNjItMDEwLy8JCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItMjUvLwkJTkZfWl82Mi0wMTBfMTk3My8vCithbGlhcwlJU082NDYtRlIxLy8JCU5GX1pfNjItMDEwXzE5NzMvLworYWxpYXMJTkZfWl82Mi0wMTBfKDE5NzMpLy8JTkZfWl82Mi0wMTBfMTk3My8vCithbGlhcwlDU0lTTzI1RlJFTkNILy8JCU5GX1pfNjItMDEwXzE5NzMvLworYWxpYXMJTkZfWl82MjAxMF8xOTczLy8JTkZfWl82Mi0wMTBfMTk3My8vCittb2R1bGUJTkZfWl82Mi0wMTBfMTk3My8vCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJTkZfWl82Mi0wMTBfMTk3My8vCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItNjAvLwkJTlNfNDU1MS0xLy8KK2FsaWFzCUlTTzY0Ni1OTy8vCQlOU180NTUxLTEvLworYWxpYXMJTk8vLwkJCU5TXzQ1NTEtMS8vCithbGlhcwlDU0lTTzYwREFOSVNITk9SV0VHSUFOLy8gTlNfNDU1MS0xLy8KK2FsaWFzCUNTSVNPNjBOT1JXRUdJQU4xLy8JTlNfNDU1MS0xLy8KK2FsaWFzCU5TXzQ1NTExLy8JCU5TXzQ1NTEtMS8vCittb2R1bGUJTlNfNDU1MS0xLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJTlNfNDU1MS0xLy8JCUlTTzY0NgkJMgorCithbGlhcwlJU082NDYtTk8yLy8JCU5TXzQ1NTEtMi8vCithbGlhcwlJU08tSVItNjEvLwkJTlNfNDU1MS0yLy8KK2FsaWFzCU5PMi8vCQkJTlNfNDU1MS0yLy8KK2FsaWFzCUNTSVNPNjFOT1JXRUdJQU4yLy8JTlNfNDU1MS0yLy8KK2FsaWFzCU5TXzQ1NTEyLy8JCU5TXzQ1NTEtMi8vCittb2R1bGUJTlNfNDU1MS0yLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJTlNfNDU1MS0yLy8JCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItMTYvLwkJUFQvLworYWxpYXMJSVNPNjQ2LVBULy8JCVBULy8KK2FsaWFzCUNTSVNPMTZQT1JUVUdFU0UvLwlQVC8vCittb2R1bGUJUFQvLwkJCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJUFQvLwkJCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItODQvLwkJUFQyLy8KK2FsaWFzCUlTTzY0Ni1QVDIvLwkJUFQyLy8KK2FsaWFzCUNTSVNPODRQT1JUVUdVRVNFMi8vCVBUMi8vCittb2R1bGUJUFQyLy8JCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCVBUMi8vCQkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi0xMC8vCQlTRU5fODUwMjAwX0IvLworYWxpYXMJRkkvLwkJCVNFTl84NTAyMDBfQi8vCithbGlhcwlJU082NDYtRkkvLwkJU0VOXzg1MDIwMF9CLy8KK2FsaWFzCUlTTzY0Ni1TRS8vCQlTRU5fODUwMjAwX0IvLworYWxpYXMJU0UvLwkJCVNFTl84NTAyMDBfQi8vCithbGlhcwlDU0lTTzEwU1dFRElTSC8vCVNFTl84NTAyMDBfQi8vCithbGlhcwlTUzYzNjEyNy8vCQlTRU5fODUwMjAwX0IvLworbW9kdWxlCVNFTl84NTAyMDBfQi8vCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCVNFTl84NTAyMDBfQi8vCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTExLy8JCVNFTl84NTAyMDBfQy8vCithbGlhcwlJU082NDYtU0UyLy8JCVNFTl84NTAyMDBfQy8vCithbGlhcwlTRTIvLwkJCVNFTl84NTAyMDBfQy8vCithbGlhcwlDU0lTTzExU1dFRElTSEZPUk5BTUVTLy8gU0VOXzg1MDIwMF9DLy8KK21vZHVsZQlTRU5fODUwMjAwX0MvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlTRU5fODUwMjAwX0MvLwkJSVNPNjQ2CQkyCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTAwLy8JCUlTTy04ODU5LTEvLworYWxpYXMJSVNPXzg4NTktMToxOTg3Ly8JSVNPLTg4NTktMS8vCithbGlhcwlJU09fODg1OS0xLy8JCUlTTy04ODU5LTEvLworYWxpYXMJSVNPODg1OS0xLy8JCUlTTy04ODU5LTEvLworYWxpYXMJSVNPODg1OTEvLwkJSVNPLTg4NTktMS8vCithbGlhcwlMQVRJTjEvLwkJSVNPLTg4NTktMS8vCithbGlhcwlMMS8vCQkJSVNPLTg4NTktMS8vCithbGlhcwlJQk04MTkvLwkJSVNPLTg4NTktMS8vCithbGlhcwlDUDgxOS8vCQkJSVNPLTg4NTktMS8vCithbGlhcwlDU0lTT0xBVElOMS8vCQlJU08tODg1OS0xLy8KK2FsaWFzCTg4NTlfMS8vCQlJU08tODg1OS0xLy8KK2FsaWFzCU9TRjAwMDEwMDAxLy8JCUlTTy04ODU5LTEvLworbW9kdWxlCUlTTy04ODU5LTEvLwkJSU5URVJOQUwJCUlTTzg4NTktMQkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTEvLwkJSVNPODg1OS0xCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xMDEvLwkJSVNPLTg4NTktMi8vCithbGlhcwlJU09fODg1OS0yOjE5ODcvLwlJU08tODg1OS0yLy8KK2FsaWFzCUlTT184ODU5LTIvLwkJSVNPLTg4NTktMi8vCithbGlhcwlJU084ODU5LTIvLwkJSVNPLTg4NTktMi8vCithbGlhcwlJU084ODU5Mi8vCQlJU08tODg1OS0yLy8KK2FsaWFzCUxBVElOMi8vCQlJU08tODg1OS0yLy8KK2FsaWFzCUwyLy8JCQlJU08tODg1OS0yLy8KK2FsaWFzCUNTSVNPTEFUSU4yLy8JCUlTTy04ODU5LTIvLworYWxpYXMJODg1OV8yLy8JCUlTTy04ODU5LTIvLworYWxpYXMJT1NGMDAwMTAwMDIvLwkJSVNPLTg4NTktMi8vCithbGlhcwlJQk05MTIvLwkJSVNPLTg4NTktMi8vCithbGlhcwlDUDkxMi8vCQkJSVNPLTg4NTktMi8vCittb2R1bGUJSVNPLTg4NTktMi8vCQlJTlRFUk5BTAkJSVNPODg1OS0yCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktMi8vCQlJU084ODU5LTIJMQorCisjCWZyb20JCQl0bwkJCSBtb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xMDkvLwkJSVNPLTg4NTktMy8vCithbGlhcwlJU09fODg1OS0zOjE5ODgvLwlJU08tODg1OS0zLy8KK2FsaWFzCUlTT184ODU5LTMvLwkJSVNPLTg4NTktMy8vCithbGlhcwlJU084ODU5LTMvLwkJSVNPLTg4NTktMy8vCithbGlhcwlJU084ODU5My8vCQlJU08tODg1OS0zLy8KK2FsaWFzCUxBVElOMy8vCQlJU08tODg1OS0zLy8KK2FsaWFzCUwzLy8JCQlJU08tODg1OS0zLy8KK2FsaWFzCUNTSVNPTEFUSU4zLy8JCUlTTy04ODU5LTMvLworYWxpYXMJODg1OV8zLy8JCUlTTy04ODU5LTMvLworYWxpYXMJT1NGMDAwMTAwMDMvLwkJSVNPLTg4NTktMy8vCittb2R1bGUJSVNPLTg4NTktMy8vCQlJTlRFUk5BTAkJSVNPODg1OS0zCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktMy8vCQlJU084ODU5LTMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTExMC8vCQlJU08tODg1OS00Ly8KK2FsaWFzCUlTT184ODU5LTQ6MTk4OC8vCUlTTy04ODU5LTQvLworYWxpYXMJSVNPXzg4NTktNC8vCQlJU08tODg1OS00Ly8KK2FsaWFzCUlTTzg4NTktNC8vCQlJU08tODg1OS00Ly8KK2FsaWFzCUlTTzg4NTk0Ly8JCUlTTy04ODU5LTQvLworYWxpYXMJTEFUSU40Ly8JCUlTTy04ODU5LTQvLworYWxpYXMJTDQvLwkJCUlTTy04ODU5LTQvLworYWxpYXMJQ1NJU09MQVRJTjQvLwkJSVNPLTg4NTktNC8vCithbGlhcwk4ODU5XzQvLwkJSVNPLTg4NTktNC8vCithbGlhcwlPU0YwMDAxMDAwNC8vCQlJU08tODg1OS00Ly8KK21vZHVsZQlJU08tODg1OS00Ly8JCUlOVEVSTkFMCQlJU084ODU5LTQJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS00Ly8JCUlTTzg4NTktNAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTQ0Ly8JCUlTTy04ODU5LTUvLworYWxpYXMJSVNPXzg4NTktNToxOTg4Ly8JSVNPLTg4NTktNS8vCithbGlhcwlJU09fODg1OS01Ly8JCUlTTy04ODU5LTUvLworYWxpYXMJSVNPODg1OS01Ly8JCUlTTy04ODU5LTUvLworYWxpYXMJSVNPODg1OTUvLwkJSVNPLTg4NTktNS8vCithbGlhcwlDWVJJTExJQy8vCQlJU08tODg1OS01Ly8KK2FsaWFzCUNTSVNPTEFUSU5DWVJJTExJQy8vCUlTTy04ODU5LTUvLworYWxpYXMJODg1OV81Ly8JCUlTTy04ODU5LTUvLworYWxpYXMJT1NGMDAwMTAwMDUvLwkJSVNPLTg4NTktNS8vCithbGlhcwlJQk05MTUvLwkJSVNPLTg4NTktNS8vCithbGlhcwlDUDkxNS8vCQkJSVNPLTg4NTktNS8vCittb2R1bGUJSVNPLTg4NTktNS8vCQlJTlRFUk5BTAkJSVNPODg1OS01CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktNS8vCQlJU084ODU5LTUJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTEyNy8vCQlJU08tODg1OS02Ly8KK2FsaWFzCUlTT184ODU5LTY6MTk4Ny8vCUlTTy04ODU5LTYvLworYWxpYXMJSVNPXzg4NTktNi8vCQlJU08tODg1OS02Ly8KK2FsaWFzCUlTTzg4NTktNi8vCQlJU08tODg1OS02Ly8KK2FsaWFzCUlTTzg4NTk2Ly8JCUlTTy04ODU5LTYvLworYWxpYXMJRUNNQS0xMTQvLwkJSVNPLTg4NTktNi8vCithbGlhcwlBU01PLTcwOC8vCQlJU08tODg1OS02Ly8KK2FsaWFzCUFSQUJJQy8vCQlJU08tODg1OS02Ly8KK2FsaWFzCUNTSVNPTEFUSU5BUkFCSUMvLwlJU08tODg1OS02Ly8KK2FsaWFzCTg4NTlfNi8vCQlJU08tODg1OS02Ly8KK2FsaWFzCU9TRjAwMDEwMDA2Ly8JCUlTTy04ODU5LTYvLworYWxpYXMJSUJNMTA4OS8vCQlJU08tODg1OS02Ly8KK2FsaWFzCUNQMTA4OS8vCQlJU08tODg1OS02Ly8KK21vZHVsZQlJU08tODg1OS02Ly8JCUlOVEVSTkFMCQlJU084ODU5LTYJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS02Ly8JCUlTTzg4NTktNgkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTI2Ly8JCUlTTy04ODU5LTcvLworYWxpYXMJSVNPXzg4NTktNzoyMDAzLy8JSVNPLTg4NTktNy8vCithbGlhcwlJU09fODg1OS03OjE5ODcvLwlJU08tODg1OS03Ly8KK2FsaWFzCUlTT184ODU5LTcvLwkJSVNPLTg4NTktNy8vCithbGlhcwlJU084ODU5LTcvLwkJSVNPLTg4NTktNy8vCithbGlhcwlJU084ODU5Ny8vCQlJU08tODg1OS03Ly8KK2FsaWFzCUVMT1RfOTI4Ly8JCUlTTy04ODU5LTcvLworYWxpYXMJRUNNQS0xMTgvLwkJSVNPLTg4NTktNy8vCithbGlhcwlHUkVFSy8vCQkJSVNPLTg4NTktNy8vCithbGlhcwlHUkVFSzgvLwkJSVNPLTg4NTktNy8vCithbGlhcwlDU0lTT0xBVElOR1JFRUsvLwlJU08tODg1OS03Ly8KK2FsaWFzCTg4NTlfNy8vCQlJU08tODg1OS03Ly8KK2FsaWFzCU9TRjAwMDEwMDA3Ly8JCUlTTy04ODU5LTcvLworYWxpYXMJSUJNODEzLy8JCUlTTy04ODU5LTcvLworYWxpYXMJQ1A4MTMvLwkJCUlTTy04ODU5LTcvLworbW9kdWxlCUlTTy04ODU5LTcvLwkJSU5URVJOQUwJCUlTTzg4NTktNwkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTcvLwkJSVNPODg1OS03CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xMzgvLwkJSVNPLTg4NTktOC8vCithbGlhcwlJU09fODg1OS04OjE5ODgvLwlJU08tODg1OS04Ly8KK2FsaWFzCUlTT184ODU5LTgvLwkJSVNPLTg4NTktOC8vCithbGlhcwlJU084ODU5LTgvLwkJSVNPLTg4NTktOC8vCithbGlhcwlJU084ODU5OC8vCQlJU08tODg1OS04Ly8KK2FsaWFzCUhFQlJFVy8vCQlJU08tODg1OS04Ly8KK2FsaWFzCUNTSVNPTEFUSU5IRUJSRVcvLwlJU08tODg1OS04Ly8KK2FsaWFzCTg4NTlfOC8vCQlJU08tODg1OS04Ly8KK2FsaWFzCU9TRjAwMDEwMDA4Ly8JCUlTTy04ODU5LTgvLworYWxpYXMJSUJNOTE2Ly8JCUlTTy04ODU5LTgvLworYWxpYXMJQ1A5MTYvLwkJCUlTTy04ODU5LTgvLworbW9kdWxlCUlTTy04ODU5LTgvLwkJSU5URVJOQUwJCUlTTzg4NTktOAkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTgvLwkJSVNPODg1OS04CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xNDgvLwkJSVNPLTg4NTktOS8vCithbGlhcwlJU09fODg1OS05OjE5ODkvLwlJU08tODg1OS05Ly8KK2FsaWFzCUlTT184ODU5LTkvLwkJSVNPLTg4NTktOS8vCithbGlhcwlJU084ODU5LTkvLwkJSVNPLTg4NTktOS8vCithbGlhcwlJU084ODU5OS8vCQlJU08tODg1OS05Ly8KK2FsaWFzCUxBVElONS8vCQlJU08tODg1OS05Ly8KK2FsaWFzCUw1Ly8JCQlJU08tODg1OS05Ly8KK2FsaWFzCUNTSVNPTEFUSU41Ly8JCUlTTy04ODU5LTkvLworYWxpYXMJODg1OV85Ly8JCUlTTy04ODU5LTkvLworYWxpYXMJT1NGMDAwMTAwMDkvLwkJSVNPLTg4NTktOS8vCithbGlhcwlJQk05MjAvLwkJSVNPLTg4NTktOS8vCithbGlhcwlDUDkyMC8vCQkJSVNPLTg4NTktOS8vCithbGlhcwlUUy01ODgxLy8JCUlTTy04ODU5LTkvLworYWxpYXMJRUNNQS0xMjgvLwkJSVNPLTg4NTktOS8vCittb2R1bGUJSVNPLTg4NTktOS8vCQlJTlRFUk5BTAkJSVNPODg1OS05CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktOS8vCQlJU084ODU5LTkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTE1Ny8vCQlJU08tODg1OS0xMC8vCithbGlhcwlJU09fODg1OS0xMDoxOTkyLy8JSVNPLTg4NTktMTAvLworYWxpYXMJSVNPXzg4NTktMTAvLwkJSVNPLTg4NTktMTAvLworYWxpYXMJSVNPODg1OS0xMC8vCQlJU08tODg1OS0xMC8vCithbGlhcwlJU084ODU5MTAvLwkJSVNPLTg4NTktMTAvLworYWxpYXMJTEFUSU42Ly8JCUlTTy04ODU5LTEwLy8KK2FsaWFzCUw2Ly8JCQlJU08tODg1OS0xMC8vCithbGlhcwlDU0lTT0xBVElONi8vCQlJU08tODg1OS0xMC8vCithbGlhcwlPU0YwMDAxMDAwQS8vCQlJU08tODg1OS0xMC8vCittb2R1bGUJSVNPLTg4NTktMTAvLwkJSU5URVJOQUwJCUlTTzg4NTktMTAJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS0xMC8vCQlJU084ODU5LTEwCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTzg4NTktMTEvLwkJSVNPLTg4NTktMTEvLworYWxpYXMJSVNPODg1OTExLy8JCUlTTy04ODU5LTExLy8KK21vZHVsZQlJU08tODg1OS0xMS8vCQlJTlRFUk5BTAkJSVNPODg1OS0xMQkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTExLy8JCUlTTzg4NTktMTEJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPODg1OS0xMy8vCQlJU08tODg1OS0xMy8vCithbGlhcwlJU084ODU5MTMvLwkJSVNPLTg4NTktMTMvLworYWxpYXMJSVNPLUlSLTE3OS8vCQlJU08tODg1OS0xMy8vCithbGlhcwlMQVRJTjcvLwkJSVNPLTg4NTktMTMvLworYWxpYXMJTDcvLwkJCUlTTy04ODU5LTEzLy8KK2FsaWFzCUJBTFRJQy8vCQlJU08tODg1OS0xMy8vCittb2R1bGUJSVNPLTg4NTktMTMvLwkJSU5URVJOQUwJCUlTTzg4NTktMTMJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS0xMy8vCQlJU084ODU5LTEzCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTzg4NTktMTQvLwkJSVNPLTg4NTktMTQvLworYWxpYXMJSVNPODg1OTE0Ly8JCUlTTy04ODU5LTE0Ly8KK2FsaWFzCUlTTy1JUi0xOTkvLwkJSVNPLTg4NTktMTQvLworYWxpYXMJTEFUSU44Ly8JCUlTTy04ODU5LTE0Ly8KK2FsaWFzCUw4Ly8JCQlJU08tODg1OS0xNC8vCithbGlhcwlJU09fODg1OS0xNDoxOTk4Ly8JSVNPLTg4NTktMTQvLworYWxpYXMJSVNPXzg4NTktMTQvLwkJSVNPLTg4NTktMTQvLworYWxpYXMJSVNPLUNFTFRJQy8vCQlJU08tODg1OS0xNC8vCittb2R1bGUJSVNPLTg4NTktMTQvLwkJSU5URVJOQUwJCUlTTzg4NTktMTQJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS0xNC8vCQlJU084ODU5LTE0CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTzg4NTktMTUvLwkJSVNPLTg4NTktMTUvLworYWxpYXMJSVNPODg1OTE1Ly8JCUlTTy04ODU5LTE1Ly8KK2FsaWFzCUlTTy1JUi0yMDMvLwkJSVNPLTg4NTktMTUvLworYWxpYXMJSVNPXzg4NTktMTUvLwkJSVNPLTg4NTktMTUvLworYWxpYXMJTEFUSU4tOS8vCQlJU08tODg1OS0xNS8vCithbGlhcwlMQVRJTjkvLwkJSVNPLTg4NTktMTUvLworYWxpYXMJSVNPXzg4NTktMTU6MTk5OC8vCUlTTy04ODU5LTE1Ly8KK21vZHVsZQlJU08tODg1OS0xNS8vCQlJTlRFUk5BTAkJSVNPODg1OS0xNQkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTE1Ly8JCUlTTzg4NTktMTUJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPODg1OS0xNi8vCQlJU08tODg1OS0xNi8vCithbGlhcwlJU084ODU5MTYvLwkJSVNPLTg4NTktMTYvLworYWxpYXMJSVNPLUlSLTIyNi8vCQlJU08tODg1OS0xNi8vCithbGlhcwlMQVRJTjEwLy8JCUlTTy04ODU5LTE2Ly8KK2FsaWFzCUwxMC8vCQkJSVNPLTg4NTktMTYvLworYWxpYXMJSVNPXzg4NTktMTY6MjAwMS8vCUlTTy04ODU5LTE2Ly8KK2FsaWFzCUlTT184ODU5LTE2Ly8JCUlTTy04ODU5LTE2Ly8KK21vZHVsZQlJU08tODg1OS0xNi8vCQlJTlRFUk5BTAkJSVNPODg1OS0xNgkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTE2Ly8JCUlTTzg4NTktMTYJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJVC42MS8vCQkJVC42MS04QklULy8KK2FsaWFzCUlTTy1JUi0xMDMvLwkJVC42MS04QklULy8KK2FsaWFzCUNTSVNPMTAzVDYxOEJJVC8vCVQuNjEtOEJJVC8vCithbGlhcwlULjYxOEJJVC8vCQlULjYxLThCSVQvLworbW9kdWxlCVQuNjEtOEJJVC8vCQlJTlRFUk5BTAkJVC42MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlULjYxLThCSVQvLwkJVC42MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTE1Ni8vCQlJU09fNjkzNy8vCithbGlhcwlJU09fNjkzNzoxOTkyLy8JCUlTT182OTM3Ly8KK2FsaWFzCUlTTzY5MzcvLwkJSVNPXzY5MzcvLworbW9kdWxlCUlTT182OTM3Ly8JCUlOVEVSTkFMCQlJU09fNjkzNwkxCittb2R1bGUJSU5URVJOQUwJCUlTT182OTM3Ly8JCUlTT182OTM3CTEKKworCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTkwLy8JCUlTT182OTM3LTIvLworYWxpYXMJSVNPXzY5MzctMjoxOTgzLy8JSVNPXzY5MzctMi8vCithbGlhcwlDU0lTTzkwLy8JCUlTT182OTM3LTIvLworYWxpYXMJSVNPXzY5MzcyLy8JCUlTT182OTM3LTIvLworbW9kdWxlCUlTT182OTM3LTIvLwkJSU5URVJOQUwJCUlTT182OTM3LTIJMQorbW9kdWxlCUlOVEVSTkFMCQlJU09fNjkzNy0yLy8JCUlTT182OTM3LTIJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJU0hJRlQtSklTLy8JCVNKSVMvLworYWxpYXMJU0hJRlRfSklTLy8JCVNKSVMvLworYWxpYXMJTVNfS0FOSkkvLwkJU0pJUy8vCithbGlhcwlDU1NISUZUSklTLy8JCVNKSVMvLworbW9kdWxlCVNKSVMvLwkJCUlOVEVSTkFMCQlTSklTCQkxCittb2R1bGUJSU5URVJOQUwJCVNKSVMvLwkJCVNKSVMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVdJTkRPV1MtMzFKLy8JCUNQOTMyLy8KK2FsaWFzCU1TOTMyLy8JCQlDUDkzMi8vCithbGlhcwlTSklTLU9QRU4vLwkJQ1A5MzIvLworYWxpYXMJU0pJUy1XSU4vLwkJQ1A5MzIvLworYWxpYXMJQ1NXSU5ET1dTMzFKLy8JCUNQOTMyLy8KK21vZHVsZQlDUDkzMi8vCQkJSU5URVJOQUwJCUNQOTMyCQkxCittb2R1bGUJSU5URVJOQUwJCUNQOTMyLy8JCQlDUDkzMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJS09JOC8vCQkJS09JLTgvLworbW9kdWxlCUtPSS04Ly8JCQlJTlRFUk5BTAkJS09JLTgJCTEKK21vZHVsZQlJTlRFUk5BTAkJS09JLTgvLwkJCUtPSS04CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0tPSThSLy8JCUtPSTgtUi8vCithbGlhcwlLT0k4Ui8vCQkJS09JOC1SLy8KK21vZHVsZQlLT0k4LVIvLwkJSU5URVJOQUwJCUtPSTgtUgkJMQorbW9kdWxlCUlOVEVSTkFMCQlLT0k4LVIvLwkJS09JOC1SCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTkvLwkJTEFUSU4tR1JFRUsvLworYWxpYXMJQ1NJU08xOUxBVElOR1JFRUsvLwlMQVRJTi1HUkVFSy8vCithbGlhcwlMQVRJTkdSRUVLLy8JCUxBVElOLUdSRUVLLy8KK21vZHVsZQlMQVRJTi1HUkVFSy8vCQlJTlRFUk5BTAkJTEFUSU4tR1JFRUsJMQorbW9kdWxlCUlOVEVSTkFMCQlMQVRJTi1HUkVFSy8vCQlMQVRJTi1HUkVFSwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMjcvLwkJTEFUSU4tR1JFRUstMS8vCithbGlhcwlDU0lTTzI3TEFUSU5HUkVFSzEvLwlMQVRJTi1HUkVFSy0xLy8KK2FsaWFzCUxBVElOR1JFRUsxLy8JCUxBVElOLUdSRUVLLTEvLworbW9kdWxlCUxBVElOLUdSRUVLLTEvLwkJSU5URVJOQUwJCUxBVElOLUdSRUVLLTEJMQorbW9kdWxlCUlOVEVSTkFMCQlMQVRJTi1HUkVFSy0xLy8JCUxBVElOLUdSRUVLLTEJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJUk9NQU44Ly8JCUhQLVJPTUFOOC8vCithbGlhcwlSOC8vCQkJSFAtUk9NQU44Ly8KK2FsaWFzCUNTSFBST01BTjgvLwkJSFAtUk9NQU44Ly8KK2FsaWFzCU9TRjEwMDEwMDAxLy8JCUhQLVJPTUFOOC8vCithbGlhcwlIUFJPTUFOOC8vCQlIUC1ST01BTjgvLworbW9kdWxlCUhQLVJPTUFOOC8vCQlJTlRFUk5BTAkJSFAtUk9NQU44CTEKK21vZHVsZQlJTlRFUk5BTAkJSFAtUk9NQU44Ly8JCUhQLVJPTUFOOAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0VCQ0RJQ0FUREUvLwkJRUJDRElDLUFULURFLy8KK2FsaWFzCUVCQ0RJQ0FUREUvLwkJRUJDRElDLUFULURFLy8KK21vZHVsZQlFQkNESUMtQVQtREUvLwkJSU5URVJOQUwJCUVCQ0RJQy1BVC1ERQkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1BVC1ERS8vCQlFQkNESUMtQVQtREUJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNBVERFQS8vCQlFQkNESUMtQVQtREUtQS8vCithbGlhcwlFQkNESUNBVERFQS8vCQlFQkNESUMtQVQtREUtQS8vCittb2R1bGUJRUJDRElDLUFULURFLUEvLwlJTlRFUk5BTAkJRUJDRElDLUFULURFLUEJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtQVQtREUtQS8vCUVCQ0RJQy1BVC1ERS1BCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDQ0FGUi8vCQlFQkNESUMtQ0EtRlIvLworYWxpYXMJRUJDRElDQ0FGUi8vCQlFQkNESUMtQ0EtRlIvLworbW9kdWxlCUVCQ0RJQy1DQS1GUi8vCQlJTlRFUk5BTAkJRUJDRElDLUNBLUZSCTEKK21vZHVsZQlJTlRFUk5BTAkJRUJDRElDLUNBLUZSLy8JCUVCQ0RJQy1DQS1GUgkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0VCQ0RJQ0RLTk8vLwkJRUJDRElDLURLLU5PLy8KK2FsaWFzCUVCQ0RJQ0RLTk8vLwkJRUJDRElDLURLLU5PLy8KK21vZHVsZQlFQkNESUMtREstTk8vLwkJSU5URVJOQUwJCUVCQ0RJQy1ESy1OTwkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1ESy1OTy8vCQlFQkNESUMtREstTk8JMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNES05PQS8vCQlFQkNESUMtREstTk8tQS8vCithbGlhcwlFQkNESUNES05PQS8vCQlFQkNESUMtREstTk8tQS8vCittb2R1bGUJRUJDRElDLURLLU5PLUEvLwlJTlRFUk5BTAkJRUJDRElDLURLLU5PLUEJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtREstTk8tQS8vCUVCQ0RJQy1ESy1OTy1BCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDRVMvLwkJRUJDRElDLUVTLy8KK2FsaWFzCUVCQ0RJQ0VTLy8JCUVCQ0RJQy1FUy8vCittb2R1bGUJRUJDRElDLUVTLy8JCUlOVEVSTkFMCQlFQkNESUMtRVMJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtRVMvLwkJRUJDRElDLUVTCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDRVNBLy8JCUVCQ0RJQy1FUy1BLy8KK2FsaWFzCUVCQ0RJQ0VTQS8vCQlFQkNESUMtRVMtQS8vCittb2R1bGUJRUJDRElDLUVTLUEvLwkJSU5URVJOQUwJCUVCQ0RJQy1FUy1BCTEKK21vZHVsZQlJTlRFUk5BTAkJRUJDRElDLUVTLUEvLwkJRUJDRElDLUVTLUEJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNFU1MvLwkJRUJDRElDLUVTLVMvLworYWxpYXMJRUJDRElDRVNTLy8JCUVCQ0RJQy1FUy1TLy8KK21vZHVsZQlFQkNESUMtRVMtUy8vCQlJTlRFUk5BTAkJRUJDRElDLUVTLVMJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtRVMtUy8vCQlFQkNESUMtRVMtUwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0VCQ0RJQ0ZJU0UvLwkJRUJDRElDLUZJLVNFLy8KK2FsaWFzCUVCQ0RJQ0ZJU0UvLwkJRUJDRElDLUZJLVNFLy8KK21vZHVsZQlFQkNESUMtRkktU0UvLwkJSU5URVJOQUwJCUVCQ0RJQy1GSS1TRQkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1GSS1TRS8vCQlFQkNESUMtRkktU0UJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNGSVNFQS8vCQlFQkNESUMtRkktU0UtQS8vCithbGlhcwlFQkNESUNGSVNFQS8vCQlFQkNESUMtRkktU0UtQS8vCittb2R1bGUJRUJDRElDLUZJLVNFLUEvLwlJTlRFUk5BTAkJRUJDRElDLUZJLVNFLUEJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtRkktU0UtQS8vCUVCQ0RJQy1GSS1TRS1BCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDRlIvLwkJRUJDRElDLUZSLy8KK2FsaWFzCUVCQ0RJQ0ZSLy8JCUVCQ0RJQy1GUi8vCittb2R1bGUJRUJDRElDLUZSLy8JCUlOVEVSTkFMCQlFQkNESUMtRlIJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtRlIvLwkJRUJDRElDLUZSCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVCQ0RJQ0lTRlJJU1MvLwkJRUJDRElDLUlTLUZSSVNTLy8KK21vZHVsZQlFQkNESUMtSVMtRlJJU1MvLwlJTlRFUk5BTAkJRUJDRElDLUlTLUZSSVNTCTEKK21vZHVsZQlJTlRFUk5BTAkJRUJDRElDLUlTLUZSSVNTLy8JRUJDRElDLUlTLUZSSVNTCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDSVQvLwkJRUJDRElDLUlULy8KK2FsaWFzCUVCQ0RJQ0lULy8JCUVCQ0RJQy1JVC8vCittb2R1bGUJRUJDRElDLUlULy8JCUlOVEVSTkFMCQlFQkNESUMtSVQJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtSVQvLwkJRUJDRElDLUlUCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDUFQvLwkJRUJDRElDLVBULy8KK2FsaWFzCUVCQ0RJQ1BULy8JCUVCQ0RJQy1QVC8vCittb2R1bGUJRUJDRElDLVBULy8JCUlOVEVSTkFMCQlFQkNESUMtUFQJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtUFQvLwkJRUJDRElDLVBUCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDVUsvLwkJRUJDRElDLVVLLy8KK2FsaWFzCUVCQ0RJQ1VLLy8JCUVCQ0RJQy1VSy8vCittb2R1bGUJRUJDRElDLVVLLy8JCUlOVEVSTkFMCQlFQkNESUMtVUsJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtVUsvLwkJRUJDRElDLVVLCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDVVMvLwkJRUJDRElDLVVTLy8KK2FsaWFzCUVCQ0RJQ1VTLy8JCUVCQ0RJQy1VUy8vCittb2R1bGUJRUJDRElDLVVTLy8JCUlOVEVSTkFMCQlFQkNESUMtVVMJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtVVMvLwkJRUJDRElDLVVTCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQMDM3Ly8JCQlJQk0wMzcvLworYWxpYXMJRUJDRElDLUNQLVVTLy8JCUlCTTAzNy8vCithbGlhcwlFQkNESUMtQ1AtQ0EvLwkJSUJNMDM3Ly8KK2FsaWFzCUVCQ0RJQy1DUC1XVC8vCQlJQk0wMzcvLworYWxpYXMJRUJDRElDLUNQLU5MLy8JCUlCTTAzNy8vCithbGlhcwlDU0lCTTAzNy8vCQlJQk0wMzcvLworYWxpYXMJT1NGMTAwMjAwMjUvLwkJSUJNMDM3Ly8KK2FsaWFzCUNQMTA3MC8vCQlJQk0wMzcvLworYWxpYXMJQ1AyODIvLwkJCUlCTTAzNy8vCittb2R1bGUJSUJNMDM3Ly8JCUlOVEVSTkFMCQlJQk0wMzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMDM3Ly8JCUlCTTAzNwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJRUJDRElDLUlOVC8vCQlJQk0wMzgvLworYWxpYXMJQ1AwMzgvLwkJCUlCTTAzOC8vCithbGlhcwlDU0lCTTAzOC8vCQlJQk0wMzgvLworbW9kdWxlCUlCTTAzOC8vCQlJTlRFUk5BTAkJSUJNMDM4CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTAzOC8vCQlJQk0wMzgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVCQ0RJQy1JTlQxLy8JCUlCTTI1Ni8vCittb2R1bGUJSUJNMjU2Ly8JCUlOVEVSTkFMCQlJQk0yNTYJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjU2Ly8JCUlCTTI1NgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AyNzMvLwkJCUlCTTI3My8vCithbGlhcwlDU0lCTTI3My8vCQlJQk0yNzMvLworYWxpYXMJT1NGMTAwMjAxMTEvLwkJSUJNMjczLy8KK21vZHVsZQlJQk0yNzMvLwkJSU5URVJOQUwJCUlCTTI3MwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yNzMvLwkJSUJNMjczCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlFQkNESUMtQkUvLwkJSUJNMjc0Ly8KK2FsaWFzCUNQMjc0Ly8JCQlJQk0yNzQvLworYWxpYXMJQ1NJQk0yNzQvLwkJSUJNMjc0Ly8KK21vZHVsZQlJQk0yNzQvLwkJSU5URVJOQUwJCUlCTTI3NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yNzQvLwkJSUJNMjc0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlFQkNESUMtQlIvLwkJSUJNMjc1Ly8KK2FsaWFzCUNQMjc1Ly8JCQlJQk0yNzUvLworYWxpYXMJQ1NJQk0yNzUvLwkJSUJNMjc1Ly8KK21vZHVsZQlJQk0yNzUvLwkJSU5URVJOQUwJCUlCTTI3NQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yNzUvLwkJSUJNMjc1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlFQkNESUMtQ1AtREsvLwkJSUJNMjc3Ly8KK2FsaWFzCUVCQ0RJQy1DUC1OTy8vCQlJQk0yNzcvLworYWxpYXMJQ1NJQk0yNzcvLwkJSUJNMjc3Ly8KK2FsaWFzCU9TRjEwMDIwMTE1Ly8JCUlCTTI3Ny8vCittb2R1bGUJSUJNMjc3Ly8JCUlOVEVSTkFMCQlJQk0yNzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjc3Ly8JCUlCTTI3NwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AyNzgvLwkJCUlCTTI3OC8vCithbGlhcwlFQkNESUMtQ1AtRkkvLwkJSUJNMjc4Ly8KK2FsaWFzCUVCQ0RJQy1DUC1TRS8vCQlJQk0yNzgvLworYWxpYXMJQ1NJQk0yNzgvLwkJSUJNMjc4Ly8KK2FsaWFzCU9TRjEwMDIwMTE2Ly8JCUlCTTI3OC8vCittb2R1bGUJSUJNMjc4Ly8JCUlOVEVSTkFMCQlJQk0yNzgJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjc4Ly8JCUlCTTI3OAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AyODAvLwkJCUlCTTI4MC8vCithbGlhcwlFQkNESUMtQ1AtSVQvLwkJSUJNMjgwLy8KK2FsaWFzCUNTSUJNMjgwLy8JCUlCTTI4MC8vCithbGlhcwlPU0YxMDAyMDExOC8vCQlJQk0yODAvLworbW9kdWxlCUlCTTI4MC8vCQlJTlRFUk5BTAkJSUJNMjgwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTI4MC8vCQlJQk0yODAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVCQ0RJQy1KUC1FLy8JCUlCTTI4MS8vCithbGlhcwlDUDI4MS8vCQkJSUJNMjgxLy8KK2FsaWFzCUNTSUJNMjgxLy8JCUlCTTI4MS8vCittb2R1bGUJSUJNMjgxLy8JCUlOVEVSTkFMCQlJQk0yODEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjgxLy8JCUlCTTI4MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AyODQvLwkJCUlCTTI4NC8vCithbGlhcwlFQkNESUMtQ1AtRVMvLwkJSUJNMjg0Ly8KK2FsaWFzCUNTSUJNMjg0Ly8JCUlCTTI4NC8vCithbGlhcwlPU0YxMDAyMDExQy8vCQlJQk0yODQvLworYWxpYXMJQ1AxMDc5Ly8JCUlCTTI4NC8vCittb2R1bGUJSUJNMjg0Ly8JCUlOVEVSTkFMCQlJQk0yODQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjg0Ly8JCUlCTTI4NAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AyODUvLwkJCUlCTTI4NS8vCithbGlhcwlFQkNESUMtQ1AtR0IvLwkJSUJNMjg1Ly8KK2FsaWFzCUNTSUJNMjg1Ly8JCUlCTTI4NS8vCithbGlhcwlPU0YxMDAyMDExRC8vCQlJQk0yODUvLworbW9kdWxlCUlCTTI4NS8vCQlJTlRFUk5BTAkJSUJNMjg1CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTI4NS8vCQlJQk0yODUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQMjkwLy8JCQlJQk0yOTAvLworYWxpYXMJRUJDRElDLUpQLUtBTkEvLwlJQk0yOTAvLworYWxpYXMJQ1NJQk0yOTAvLwkJSUJNMjkwLy8KK2FsaWFzCU9TRjEwMDIwMTIyLy8JCUlCTTI5MC8vCittb2R1bGUJSUJNMjkwLy8JCUlOVEVSTkFMCQlJQk0yOTAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjkwLy8JCUlCTTI5MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AyOTcvLwkJCUlCTTI5Ny8vCithbGlhcwlFQkNESUMtQ1AtRlIvLwkJSUJNMjk3Ly8KK2FsaWFzCUNTSUJNMjk3Ly8JCUlCTTI5Ny8vCithbGlhcwlPU0YxMDAyMDEyOS8vCQlJQk0yOTcvLworYWxpYXMJQ1AxMDgxLy8JCUlCTTI5Ny8vCittb2R1bGUJSUJNMjk3Ly8JCUlOVEVSTkFMCQlJQk0yOTcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjk3Ly8JCUlCTTI5NwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A0MjAvLwkJCUlCTTQyMC8vCithbGlhcwlFQkNESUMtQ1AtQVIxLy8JCUlCTTQyMC8vCithbGlhcwlDU0lCTTQyMC8vCQlJQk00MjAvLworYWxpYXMJT1NGMTAwMjAxQTQvLwkJSUJNNDIwLy8KK21vZHVsZQlJQk00MjAvLwkJSU5URVJOQUwJCUlCTTQyMAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk00MjAvLwkJSUJNNDIwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDQyMy8vCQkJSUJNNDIzLy8KK2FsaWFzCUVCQ0RJQy1DUC1HUi8vCQlJQk00MjMvLworYWxpYXMJQ1NJQk00MjMvLwkJSUJNNDIzLy8KK21vZHVsZQlJQk00MjMvLwkJSU5URVJOQUwJCUlCTTQyMwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk00MjMvLwkJSUJNNDIzCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDQyNC8vCQkJSUJNNDI0Ly8KK2FsaWFzCUVCQ0RJQy1DUC1IRS8vCQlJQk00MjQvLworYWxpYXMJQ1NJQk00MjQvLwkJSUJNNDI0Ly8KK2FsaWFzCU9TRjEwMDIwMUE4Ly8JCUlCTTQyNC8vCittb2R1bGUJSUJNNDI0Ly8JCUlOVEVSTkFMCQlJQk00MjQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNNDI0Ly8JCUlCTTQyNAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A0MzcvLwkJCUlCTTQzNy8vCithbGlhcwk0MzcvLwkJCUlCTTQzNy8vCithbGlhcwlDU1BDOENPREVQQUdFNDM3Ly8JSUJNNDM3Ly8KK2FsaWFzCU9TRjEwMDIwMUI1Ly8JCUlCTTQzNy8vCittb2R1bGUJSUJNNDM3Ly8JCUlOVEVSTkFMCQlJQk00MzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNNDM3Ly8JCUlCTTQzNwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A1MDAvLwkJCUlCTTUwMC8vCithbGlhcwk1MDAvLwkJCUlCTTUwMC8vCithbGlhcwk1MDBWMS8vCQkJSUJNNTAwLy8KK2FsaWFzCUVCQ0RJQy1DUC1CRS8vCQlJQk01MDAvLworYWxpYXMJRUJDRElDLUNQLUNILy8JCUlCTTUwMC8vCithbGlhcwlDU0lCTTUwMC8vCQlJQk01MDAvLworYWxpYXMJT1NGMTAwMjAxRjQvLwkJSUJNNTAwLy8KK2FsaWFzCUNQMTA4NC8vCQlJQk01MDAvLworbW9kdWxlCUlCTTUwMC8vCQlJTlRFUk5BTAkJSUJNNTAwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTUwMC8vCQlJQk01MDAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODUwLy8JCQlJQk04NTAvLworYWxpYXMJODUwLy8JCQlJQk04NTAvLworYWxpYXMJQ1NQQzg1ME1VTFRJTElOR1VBTC8vCUlCTTg1MC8vCithbGlhcwlPU0YxMDAyMDM1Mi8vCQlJQk04NTAvLworbW9kdWxlCUlCTTg1MC8vCQlJTlRFUk5BTAkJSUJNODUwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg1MC8vCQlJQk04NTAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODUxLy8JCQlJQk04NTEvLworYWxpYXMJODUxLy8JCQlJQk04NTEvLworYWxpYXMJQ1NJQk04NTEvLwkJSUJNODUxLy8KK21vZHVsZQlJQk04NTEvLwkJSU5URVJOQUwJCUlCTTg1MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NTEvLwkJSUJNODUxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg1Mi8vCQkJSUJNODUyLy8KK2FsaWFzCTg1Mi8vCQkJSUJNODUyLy8KK2FsaWFzCUNTUENQODUyLy8JCUlCTTg1Mi8vCithbGlhcwlPU0YxMDAyMDM1NC8vCQlJQk04NTIvLworbW9kdWxlCUlCTTg1Mi8vCQlJTlRFUk5BTAkJSUJNODUyCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg1Mi8vCQlJQk04NTIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODU1Ly8JCQlJQk04NTUvLworYWxpYXMJODU1Ly8JCQlJQk04NTUvLworYWxpYXMJQ1NJQk04NTUvLwkJSUJNODU1Ly8KK2FsaWFzCU9TRjEwMDIwMzU3Ly8JCUlCTTg1NS8vCittb2R1bGUJSUJNODU1Ly8JCUlOVEVSTkFMCQlJQk04NTUJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODU1Ly8JCUlCTTg1NQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTg1Ni8vCQlJQk04NTYvLworYWxpYXMJQ1A4NTYvLwkJCUlCTTg1Ni8vCithbGlhcwk4NTYvLwkJCUlCTTg1Ni8vCithbGlhcwlDU0lCTTg1Ni8vCQlJQk04NTYvLworbW9kdWxlCUlCTTg1Ni8vCQlJTlRFUk5BTAkJSUJNODU2CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg1Ni8vCQlJQk04NTYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODU3Ly8JCQlJQk04NTcvLworYWxpYXMJODU3Ly8JCQlJQk04NTcvLworYWxpYXMJQ1NJQk04NTcvLwkJSUJNODU3Ly8KK2FsaWFzCU9TRjEwMDIwMzU5Ly8JCUlCTTg1Ny8vCittb2R1bGUJSUJNODU3Ly8JCUlOVEVSTkFMCQlJQk04NTcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODU3Ly8JCUlCTTg1NwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NjAvLwkJCUlCTTg2MC8vCithbGlhcwk4NjAvLwkJCUlCTTg2MC8vCithbGlhcwlDU0lCTTg2MC8vCQlJQk04NjAvLworbW9kdWxlCUlCTTg2MC8vCQlJTlRFUk5BTAkJSUJNODYwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg2MC8vCQlJQk04NjAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODYxLy8JCQlJQk04NjEvLworYWxpYXMJODYxLy8JCQlJQk04NjEvLworYWxpYXMJQ1BJQk04NjEvLwkJSUJNODYxLy8KK2FsaWFzCU9TRjEwMDIwMzVELy8JCUlCTTg2MS8vCittb2R1bGUJSUJNODYxLy8JCUlOVEVSTkFMCQlJQk04NjEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODYxLy8JCUlCTTg2MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NjIvLwkJCUlCTTg2Mi8vCithbGlhcwk4NjIvLwkJCUlCTTg2Mi8vCithbGlhcwlDU1BDODYyTEFUSU5IRUJSRVcvLwlJQk04NjIvLworYWxpYXMJT1NGMTAwMjAzNUUvLwkJSUJNODYyLy8KK21vZHVsZQlJQk04NjIvLwkJSU5URVJOQUwJCUlCTTg2MgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NjIvLwkJSUJNODYyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg2My8vCQkJSUJNODYzLy8KK2FsaWFzCTg2My8vCQkJSUJNODYzLy8KK2FsaWFzCUNTSUJNODYzLy8JCUlCTTg2My8vCithbGlhcwlPU0YxMDAyMDM1Ri8vCQlJQk04NjMvLworbW9kdWxlCUlCTTg2My8vCQlJTlRFUk5BTAkJSUJNODYzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg2My8vCQlJQk04NjMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODY0Ly8JCQlJQk04NjQvLworYWxpYXMJODY0Ly8JCQlJQk04NjQvLworYWxpYXMJQ1NJQk04NjQvLwkJSUJNODY0Ly8KK2FsaWFzCU9TRjEwMDIwMzYwLy8JCUlCTTg2NC8vCittb2R1bGUJSUJNODY0Ly8JCUlOVEVSTkFMCQlJQk04NjQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODY0Ly8JCUlCTTg2NAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NjUvLwkJCUlCTTg2NS8vCithbGlhcwk4NjUvLwkJCUlCTTg2NS8vCithbGlhcwlDU0lCTTg2NS8vCQlJQk04NjUvLworbW9kdWxlCUlCTTg2NS8vCQlJTlRFUk5BTAkJSUJNODY1CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg2NS8vCQlJQk04NjUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODY2Ly8JCQlJQk04NjYvLworYWxpYXMJODY2Ly8JCQlJQk04NjYvLworYWxpYXMJQ1NJQk04NjYvLwkJSUJNODY2Ly8KK21vZHVsZQlJQk04NjYvLwkJSU5URVJOQUwJCUlCTTg2NgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NjYvLwkJSUJNODY2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg2Nk5BVi8vCQlJQk04NjZOQVYvLworYWxpYXMJODY2TkFWLy8JCUlCTTg2Nk5BVi8vCittb2R1bGUJSUJNODY2TkFWLy8JCUlOVEVSTkFMCQlJQk04NjZOQVYJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NjZOQVYvLwkJSUJNODY2TkFWCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODY4Ly8JCQlJQk04NjgvLworYWxpYXMJQ1AtQVIvLwkJCUlCTTg2OC8vCithbGlhcwlDU0lCTTg2OC8vCQlJQk04NjgvLworYWxpYXMJT1NGMTAwMjAzNjQvLwkJSUJNODY4Ly8KK21vZHVsZQlJQk04NjgvLwkJSU5URVJOQUwJCUlCTTg2OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NjgvLwkJSUJNODY4CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg2OS8vCQkJSUJNODY5Ly8KK2FsaWFzCTg2OS8vCQkJSUJNODY5Ly8KK2FsaWFzCUNQLUdSLy8JCQlJQk04NjkvLworYWxpYXMJQ1NJQk04NjkvLwkJSUJNODY5Ly8KK2FsaWFzCU9TRjEwMDIwMzY1Ly8JCUlCTTg2OS8vCittb2R1bGUJSUJNODY5Ly8JCUlOVEVSTkFMCQlJQk04NjkJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODY5Ly8JCUlCTTg2OQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NzAvLwkJCUlCTTg3MC8vCithbGlhcwlFQkNESUMtQ1AtUk9FQ0UvLwlJQk04NzAvLworYWxpYXMJRUJDRElDLUNQLVlVLy8JCUlCTTg3MC8vCithbGlhcwlDU0lCTTg3MC8vCQlJQk04NzAvLworYWxpYXMJT1NGMTAwMjAzNjYvLwkJSUJNODcwLy8KK21vZHVsZQlJQk04NzAvLwkJSU5URVJOQUwJCUlCTTg3MAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NzAvLwkJSUJNODcwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg3MS8vCQkJSUJNODcxLy8KK2FsaWFzCUVCQ0RJQy1DUC1JUy8vCQlJQk04NzEvLworYWxpYXMJQ1NJQk04NzEvLwkJSUJNODcxLy8KK2FsaWFzCU9TRjEwMDIwMzY3Ly8JCUlCTTg3MS8vCittb2R1bGUJSUJNODcxLy8JCUlOVEVSTkFMCQlJQk04NzEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODcxLy8JCUlCTTg3MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NzUvLwkJCUlCTTg3NS8vCithbGlhcwlFQkNESUMtR1JFRUsvLwkJSUJNODc1Ly8KK2FsaWFzCU9TRjEwMDIwMzZCLy8JCUlCTTg3NS8vCittb2R1bGUJSUJNODc1Ly8JCUlOVEVSTkFMCQlJQk04NzUJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODc1Ly8JCUlCTTg3NQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4ODAvLwkJCUlCTTg4MC8vCithbGlhcwlFQkNESUMtQ1lSSUxMSUMvLwlJQk04ODAvLworYWxpYXMJQ1NJQk04ODAvLwkJSUJNODgwLy8KK2FsaWFzCU9TRjEwMDIwMzcwLy8JCUlCTTg4MC8vCittb2R1bGUJSUJNODgwLy8JCUlOVEVSTkFMCQlJQk04ODAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODgwLy8JCUlCTTg4MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4OTEvLwkJCUlCTTg5MS8vCithbGlhcwlDU0lCTTg5MS8vCQlJQk04OTEvLworYWxpYXMJT1NGMTAwMjAzN0IvLwkJSUJNODkxLy8KK21vZHVsZQlJQk04OTEvLwkJSU5URVJOQUwJCUlCTTg5MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04OTEvLwkJSUJNODkxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDkwMy8vCQkJSUJNOTAzLy8KK2FsaWFzCUNTSUJNOTAzLy8JCUlCTTkwMy8vCithbGlhcwlPU0YxMDAyMDM4Ny8vCQlJQk05MDMvLworbW9kdWxlCUlCTTkwMy8vCQlJTlRFUk5BTAkJSUJNOTAzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkwMy8vCQlJQk05MDMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQOTA0Ly8JCQlJQk05MDQvLworYWxpYXMJOTA0Ly8JCQlJQk05MDQvLworYWxpYXMJQ1NJQk05MDQvLwkJSUJNOTA0Ly8KK2FsaWFzCU9TRjEwMDIwMzg4Ly8JCUlCTTkwNC8vCittb2R1bGUJSUJNOTA0Ly8JCUlOVEVSTkFMCQlJQk05MDQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTA0Ly8JCUlCTTkwNAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A5MDUvLwkJCUlCTTkwNS8vCithbGlhcwlFQkNESUMtQ1AtVFIvLwkJSUJNOTA1Ly8KK2FsaWFzCUNTSUJNOTA1Ly8JCUlCTTkwNS8vCittb2R1bGUJSUJNOTA1Ly8JCUlOVEVSTkFMCQlJQk05MDUJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTA1Ly8JCUlCTTkwNQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A5MTgvLwkJCUlCTTkxOC8vCithbGlhcwlFQkNESUMtQ1AtQVIyLy8JCUlCTTkxOC8vCithbGlhcwlDU0lCTTkxOC8vCQlJQk05MTgvLworYWxpYXMJT1NGMTAwMjAzOTYvLwkJSUJNOTE4Ly8KK21vZHVsZQlJQk05MTgvLwkJSU5URVJOQUwJCUlCTTkxOAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05MTgvLwkJSUJNOTE4CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tOTIyLy8JCUlCTTkyMi8vCithbGlhcwlDUDkyMi8vCQkJSUJNOTIyLy8KK2FsaWFzCUNTSUJNOTIyLy8JCUlCTTkyMi8vCittb2R1bGUJSUJNOTIyLy8JCUlOVEVSTkFMCQlJQk05MjIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTIyLy8JCUlCTTkyMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkzMC8vCQlJQk05MzAvLworYWxpYXMJQ1A5MzAvLwkJCUlCTTkzMC8vCithbGlhcwlDU0lCTTkzMC8vCQlJQk05MzAvLworbW9kdWxlCUlCTTkzMC8vCQlJTlRFUk5BTAkJSUJNOTMwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkzMC8vCQlJQk05MzAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MzIvLwkJSUJNOTMyLy8KK2FsaWFzCUNTSUJNOTMyLy8JCUlCTTkzMi8vCittb2R1bGUJSUJNOTMyLy8JCUlOVEVSTkFMCQlJQk05MzIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTMyLy8JCUlCTTkzMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkzMy8vCQlJQk05MzMvLworYWxpYXMJQ1A5MzMvLwkJCUlCTTkzMy8vCithbGlhcwlDU0lCTTkzMy8vCQlJQk05MzMvLworbW9kdWxlCUlCTTkzMy8vCQlJTlRFUk5BTAkJSUJNOTMzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkzMy8vCQlJQk05MzMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MzUvLwkJSUJNOTM1Ly8KK2FsaWFzCUNQOTM1Ly8JCQlJQk05MzUvLworYWxpYXMJQ1NJQk05MzUvLwkJSUJNOTM1Ly8KK21vZHVsZQlJQk05MzUvLwkJSU5URVJOQUwJCUlCTTkzNQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05MzUvLwkJSUJNOTM1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tOTM3Ly8JCUlCTTkzNy8vCithbGlhcwlDUDkzNy8vCQkJSUJNOTM3Ly8KK2FsaWFzCUNTSUJNOTM3Ly8JCUlCTTkzNy8vCittb2R1bGUJSUJNOTM3Ly8JCUlOVEVSTkFMCQlJQk05MzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTM3Ly8JCUlCTTkzNwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkzOS8vCQlJQk05MzkvLworYWxpYXMJQ1A5MzkvLwkJCUlCTTkzOS8vCithbGlhcwlDU0lCTTkzOS8vCQlJQk05MzkvLworbW9kdWxlCUlCTTkzOS8vCQlJTlRFUk5BTAkJSUJNOTM5CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkzOS8vCQlJQk05MzkJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05NDMvLwkJSUJNOTQzLy8KK2FsaWFzCUNTSUJNOTQzLy8JCUlCTTk0My8vCittb2R1bGUJSUJNOTQzLy8JCUlOVEVSTkFMCQlJQk05NDMJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTQzLy8JCUlCTTk0MwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AxMDA0Ly8JCUlCTTEwMDQvLworYWxpYXMJT1MyTEFUSU4xLy8JCUlCTTEwMDQvLworbW9kdWxlCUlCTTEwMDQvLwkJSU5URVJOQUwJCUlCTTEwMDQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTAwNC8vCQlJQk0xMDA0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDEwMjYvLwkJSUJNMTAyNi8vCithbGlhcwkxMDI2Ly8JCQlJQk0xMDI2Ly8KK2FsaWFzCUNTSUJNMTAyNi8vCQlJQk0xMDI2Ly8KK2FsaWFzCU9TRjEwMDIwNDAyLy8JCUlCTTEwMjYvLworbW9kdWxlCUlCTTEwMjYvLwkJSU5URVJOQUwJCUlCTTEwMjYJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTAyNi8vCQlJQk0xMDI2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTA0Ni8vCQlJQk0xMDQ2Ly8KK2FsaWFzCUNQMTA0Ni8vCQlJQk0xMDQ2Ly8KK2FsaWFzCTEwNDYvLwkJCUlCTTEwNDYvLworbW9kdWxlCUlCTTEwNDYvLwkJSU5URVJOQUwJCUlCTTEwNDYJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTA0Ni8vCQlJQk0xMDQ2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTA0Ny8vCQlJQk0xMDQ3Ly8KK2FsaWFzCUNQMTA0Ny8vCQlJQk0xMDQ3Ly8KK2FsaWFzCTEwNDcvLwkJCUlCTTEwNDcvLworYWxpYXMJT1NGMTAwMjA0MTcvLwkJSUJNMTA0Ny8vCittb2R1bGUJSUJNMTA0Ny8vCQlJTlRFUk5BTAkJSUJNMTA0NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMDQ3Ly8JCUlCTTEwNDcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTI0Ly8JCUlCTTExMjQvLworYWxpYXMJQ1AxMTI0Ly8JCUlCTTExMjQvLworYWxpYXMJQ1NJQk0xMTI0Ly8JCUlCTTExMjQvLworbW9kdWxlCUlCTTExMjQvLwkJSU5URVJOQUwJCUlCTTExMjQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTEyNC8vCQlJQk0xMTI0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTEyOS8vCQlJQk0xMTI5Ly8KK2FsaWFzCUNQMTEyOS8vCQlJQk0xMTI5Ly8KK2FsaWFzCUNTSUJNMTEyOS8vCQlJQk0xMTI5Ly8KK21vZHVsZQlJQk0xMTI5Ly8JCUlOVEVSTkFMCQlJQk0xMTI5CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExMjkvLwkJSUJNMTEyOQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNjAvLwkJSUJNMTE2MC8vCithbGlhcwlDUDExNjAvLwkJSUJNMTE2MC8vCithbGlhcwlDU0lCTTExNjAvLwkJSUJNMTE2MC8vCittb2R1bGUJSUJNMTE2MC8vCQlJTlRFUk5BTAkJSUJNMTE2MAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTYwLy8JCUlCTTExNjAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTYxLy8JCUlCTTExNjEvLworYWxpYXMJQ1AxMTYxLy8JCUlCTTExNjEvLworYWxpYXMJQ1NJQk0xMTYxLy8JCUlCTTExNjEvLworbW9kdWxlCUlCTTExNjEvLwkJSU5URVJOQUwJCUlCTTExNjEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE2MS8vCQlJQk0xMTYxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTEzMi8vCQlJQk0xMTMyLy8KK2FsaWFzCUNQMTEzMi8vCQlJQk0xMTMyLy8KK2FsaWFzCUNTSUJNMTEzMi8vCQlJQk0xMTMyLy8KK21vZHVsZQlJQk0xMTMyLy8JCUlOVEVSTkFMCQlJQk0xMTMyCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExMzIvLwkJSUJNMTEzMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExMzMvLwkJSUJNMTEzMy8vCithbGlhcwlDUDExMzMvLwkJSUJNMTEzMy8vCithbGlhcwlDU0lCTTExMzMvLwkJSUJNMTEzMy8vCittb2R1bGUJSUJNMTEzMy8vCQlJTlRFUk5BTAkJSUJNMTEzMwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTMzLy8JCUlCTTExMzMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTYyLy8JCUlCTTExNjIvLworYWxpYXMJQ1AxMTYyLy8JCUlCTTExNjIvLworYWxpYXMJQ1NJQk0xMTYyMTE2Mi8vCQlJQk0xMTYyLy8KK21vZHVsZQlJQk0xMTYyLy8JCUlOVEVSTkFMCQlJQk0xMTYyCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNjIvLwkJSUJNMTE2MgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNjMvLwkJSUJNMTE2My8vCithbGlhcwlDUDExNjMvLwkJSUJNMTE2My8vCithbGlhcwlDU0lCTTExNjMvLwkJSUJNMTE2My8vCittb2R1bGUJSUJNMTE2My8vCQlJTlRFUk5BTAkJSUJNMTE2MwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTYzLy8JCUlCTTExNjMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTY0Ly8JCUlCTTExNjQvLworYWxpYXMJQ1AxMTY0Ly8JCUlCTTExNjQvLworYWxpYXMJQ1NJQk0xMTY0Ly8JCUlCTTExNjQvLworbW9kdWxlCUlCTTExNjQvLwkJSU5URVJOQUwJCUlCTTExNjQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE2NC8vCQlJQk0xMTY0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlFVUNLUi8vCQkJRVVDLUtSLy8KK2FsaWFzCUNTRVVDS1IvLwkJRVVDLUtSLy8KK2FsaWFzCU9TRjAwMDQwMDBhLy8JCUVVQy1LUi8vCittb2R1bGUJRVVDLUtSLy8JCUlOVEVSTkFMCQlFVUMtS1IJCTEKK21vZHVsZQlJTlRFUk5BTAkJRVVDLUtSLy8JCUVVQy1LUgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJTVNDUDk0OS8vCQlVSEMvLworYWxpYXMJQ1A5NDkvLwkJCVVIQy8vCithbGlhcwlPU0YxMDAyMDNCNS8vCQlVSEMvLworbW9kdWxlCVVIQy8vCQkJSU5URVJOQUwJCVVIQwkJMQorbW9kdWxlCUlOVEVSTkFMCQlVSEMvLwkJCVVIQwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJTVNDUDEzNjEvLwkJSk9IQUIvLworYWxpYXMJQ1AxMzYxLy8JCUpPSEFCLy8KK21vZHVsZQlKT0hBQi8vCQkJSU5URVJOQUwJCUpPSEFCCQkxCittb2R1bGUJSU5URVJOQUwJCUpPSEFCLy8JCQlKT0hBQgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQklHLUZJVkUvLwkJQklHNS8vCithbGlhcwlCSUdGSVZFLy8JCUJJRzUvLworYWxpYXMJQklHLTUvLwkJCUJJRzUvLworYWxpYXMJQ04tQklHNS8vCQlCSUc1Ly8KK2FsaWFzCUNQOTUwLy8JCQlCSUc1Ly8KK21vZHVsZQlCSUc1Ly8JCQlJTlRFUk5BTAkJQklHNQkJMQorbW9kdWxlCUlOVEVSTkFMCQlCSUc1Ly8JCQlCSUc1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlCSUc1LUhLU0NTLy8JCUJJRzVIS1NDUy8vCittb2R1bGUJQklHNUhLU0NTLy8JCUlOVEVSTkFMCQlCSUc1SEtTQ1MJMQorbW9kdWxlCUlOVEVSTkFMCQlCSUc1SEtTQ1MvLwkJQklHNUhLU0NTCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVVQ0pQLU1TLy8JCUVVQy1KUC1NUy8vCithbGlhcwlFVUNKUC1PUEVOLy8JCUVVQy1KUC1NUy8vCithbGlhcwlFVUNKUC1XSU4vLwkJRVVDLUpQLU1TLy8KK21vZHVsZQlFVUMtSlAtTVMvLwkJSU5URVJOQUwJCUVVQy1KUC1NUwkxCittb2R1bGUJSU5URVJOQUwJCUVVQy1KUC1NUy8vCQlFVUMtSlAtTVMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJRVVDSlAvLwkJCUVVQy1KUC8vCithbGlhcwlDU0VVQ1BLREZNVEpBUEFORVNFLy8JRVVDLUpQLy8KK2FsaWFzCU9TRjAwMDMwMDEwLy8JCUVVQy1KUC8vCithbGlhcwlVSklTLy8JCQlFVUMtSlAvLworbW9kdWxlCUVVQy1KUC8vCQlJTlRFUk5BTAkJRVVDLUpQCQkxCittb2R1bGUJSU5URVJOQUwJCUVVQy1KUC8vCQlFVUMtSlAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVVQ0NOLy8JCQlFVUMtQ04vLworYWxpYXMJR0IyMzEyLy8JCUVVQy1DTi8vCithbGlhcwljc0dCMjMxMi8vCQlFVUMtQ04vLworYWxpYXMJQ04tR0IvLwkJCUVVQy1DTi8vCittb2R1bGUJRVVDLUNOLy8JCUlOVEVSTkFMCQlFVUMtQ04JCTEKK21vZHVsZQlJTlRFUk5BTAkJRVVDLUNOLy8JCUVVQy1DTgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUVVQy1DTi8vCQlCSUc1Ly8JCQlHQkJJRzUJCTEKK21vZHVsZQlCSUc1Ly8JCQlFVUMtQ04vLwkJR0JCSUc1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlHQjEzMDAwLy8JCUdCSy8vCithbGlhcwlDUDkzNi8vCQkJR0JLLy8KK2FsaWFzCU1TOTM2Ly8JCQlHQksvLworYWxpYXMJV0lORE9XUy05MzYvLwkJR0JLLy8KK21vZHVsZQlHQksvLwkJCUlOVEVSTkFMCQlHQksJCTEKK21vZHVsZQlJTlRFUk5BTAkJR0JLLy8JCQlHQksJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlHQksvLwkJCUVVQy1DTi8vCQlHQkdCSwkJMQorbW9kdWxlCUVVQy1DTi8vCQlHQksvLwkJCUdCR0JLCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlFVUNUVy8vCQkJRVVDLVRXLy8KK2FsaWFzCU9TRjAwMDUwMDBhLy8JCUVVQy1UVy8vCittb2R1bGUJRVVDLVRXLy8JCUlOVEVSTkFMCQlFVUMtVFcJCTEKK21vZHVsZQlJTlRFUk5BTAkJRVVDLVRXLy8JCUVVQy1UVwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJUlVTQ0lJLy8JCUNQMTEyNS8vCithbGlhcwlJQk04NDgvLwkJQ1AxMTI1Ly8KK21vZHVsZQlDUDExMjUvLwkJSU5URVJOQUwJCUNQMTEyNQkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDExMjUvLwkJQ1AxMTI1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlNUy1FRS8vCQkJQ1AxMjUwLy8KK2FsaWFzCVdJTkRPV1MtMTI1MC8vCQlDUDEyNTAvLworbW9kdWxlCUNQMTI1MC8vCQlJTlRFUk5BTAkJQ1AxMjUwCQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1MC8vCQlDUDEyNTAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1TLUNZUkwvLwkJQ1AxMjUxLy8KK2FsaWFzCVdJTkRPV1MtMTI1MS8vCQlDUDEyNTEvLworbW9kdWxlCUNQMTI1MS8vCQlJTlRFUk5BTAkJQ1AxMjUxCQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1MS8vCQlDUDEyNTEJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1TLUFOU0kvLwkJQ1AxMjUyLy8KK2FsaWFzCVdJTkRPV1MtMTI1Mi8vCQlDUDEyNTIvLworbW9kdWxlCUNQMTI1Mi8vCQlJTlRFUk5BTAkJQ1AxMjUyCQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1Mi8vCQlDUDEyNTIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1TLUdSRUVLLy8JCUNQMTI1My8vCithbGlhcwlXSU5ET1dTLTEyNTMvLwkJQ1AxMjUzLy8KK21vZHVsZQlDUDEyNTMvLwkJSU5URVJOQUwJCUNQMTI1MwkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDEyNTMvLwkJQ1AxMjUzCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlNUy1UVVJLLy8JCUNQMTI1NC8vCithbGlhcwlXSU5ET1dTLTEyNTQvLwkJQ1AxMjU0Ly8KK21vZHVsZQlDUDEyNTQvLwkJSU5URVJOQUwJCUNQMTI1NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDEyNTQvLwkJQ1AxMjU0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlNUy1IRUJSLy8JCUNQMTI1NS8vCithbGlhcwlXSU5ET1dTLTEyNTUvLwkJQ1AxMjU1Ly8KK21vZHVsZQlDUDEyNTUvLwkJSU5URVJOQUwJCUNQMTI1NQkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDEyNTUvLwkJQ1AxMjU1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlNUy1BUkFCLy8JCUNQMTI1Ni8vCithbGlhcwlXSU5ET1dTLTEyNTYvLwkJQ1AxMjU2Ly8KK21vZHVsZQlDUDEyNTYvLwkJSU5URVJOQUwJCUNQMTI1NgkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDEyNTYvLwkJQ1AxMjU2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlXSU5CQUxUUklNLy8JCUNQMTI1Ny8vCithbGlhcwlXSU5ET1dTLTEyNTcvLwkJQ1AxMjU3Ly8KK21vZHVsZQlDUDEyNTcvLwkJSU5URVJOQUwJCUNQMTI1NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDEyNTcvLwkJQ1AxMjU3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlXSU5ET1dTLTEyNTgvLwkJQ1AxMjU4Ly8KK21vZHVsZQlDUDEyNTgvLwkJSU5URVJOQUwJCUNQMTI1OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDEyNTgvLwkJQ1AxMjU4CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwk4NzQvLwkJCUlCTTg3NC8vCithbGlhcwlDUDg3NC8vCQkJSUJNODc0Ly8KK2FsaWFzCVdJTkRPV1MtODc0Ly8JCUlCTTg3NC8vCittb2R1bGUJSUJNODc0Ly8JCUlOVEVSTkFMCQlJQk04NzQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODc0Ly8JCUlCTTg3NAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUNQNzM3Ly8JCQlJTlRFUk5BTAkJQ1A3MzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1A3MzcvLwkJCUNQNzM3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJQ1A3NzAvLwkJCUlOVEVSTkFMCQlDUDc3MAkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDc3MC8vCQkJQ1A3NzAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlDUDc3MS8vCQkJSU5URVJOQUwJCUNQNzcxCQkxCittb2R1bGUJSU5URVJOQUwJCUNQNzcxLy8JCQlDUDc3MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUNQNzcyLy8JCQlJTlRFUk5BTAkJQ1A3NzIJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1A3NzIvLwkJCUNQNzcyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJQ1A3NzMvLwkJCUlOVEVSTkFMCQlDUDc3MwkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDc3My8vCQkJQ1A3NzMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlDUDc3NC8vCQkJSU5URVJOQUwJCUNQNzc0CQkxCittb2R1bGUJSU5URVJOQUwJCUNQNzc0Ly8JCQlDUDc3NAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNNzc1Ly8JCUNQNzc1Ly8KK2FsaWFzCUNTUEM3NzVCQUxUSUMvLwkJQ1A3NzUvLworbW9kdWxlCUNQNzc1Ly8JCQlJTlRFUk5BTAkJQ1A3NzUJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1A3NzUvLwkJCUNQNzc1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0lTTzIwMjJKUC8vCQlJU08tMjAyMi1KUC8vCithbGlhcwlJU08yMDIySlAvLwkJSVNPLTIwMjItSlAvLworbW9kdWxlCUlTTy0yMDIyLUpQLy8JCUlOVEVSTkFMCQlJU08tMjAyMi1KUAkxCittb2R1bGUJSU5URVJOQUwJCUlTTy0yMDIyLUpQLy8JCUlTTy0yMDIyLUpQCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTSVNPMjAyMkpQMi8vCQlJU08tMjAyMi1KUC0yLy8KK2FsaWFzCUlTTzIwMjJKUDIvLwkJSVNPLTIwMjItSlAtMi8vCittb2R1bGUJSVNPLTIwMjItSlAtMi8vCQlJTlRFUk5BTAkJSVNPLTIwMjItSlAJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tMjAyMi1KUC0yLy8JCUlTTy0yMDIyLUpQCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlJU08tMjAyMi1KUC0zLy8JCUlOVEVSTkFMCQlJU08tMjAyMi1KUC0zCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTIwMjItSlAtMy8vCQlJU08tMjAyMi1KUC0zCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTSVNPMjAyMktSLy8JCUlTTy0yMDIyLUtSLy8KK2FsaWFzCUlTTzIwMjJLUi8vCQlJU08tMjAyMi1LUi8vCittb2R1bGUJSVNPLTIwMjItS1IvLwkJSU5URVJOQUwJCUlTTy0yMDIyLUtSCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTIwMjItS1IvLwkJSVNPLTIwMjItS1IJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NJU08yMDIyQ04vLwkJSVNPLTIwMjItQ04vLworYWxpYXMJSVNPMjAyMkNOLy8JCUlTTy0yMDIyLUNOLy8KK21vZHVsZQlJU08tMjAyMi1DTi8vCQlJTlRFUk5BTAkJSVNPLTIwMjItQ04JMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tMjAyMi1DTi8vCQlJU08tMjAyMi1DTgkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08yMDIyQ05FWFQvLwkJSVNPLTIwMjItQ04tRVhULy8KK21vZHVsZQlJU08tMjAyMi1DTi1FWFQvLwlJTlRFUk5BTAkJSVNPLTIwMjItQ04tRVhUCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTIwMjItQ04tRVhULy8JSVNPLTIwMjItQ04tRVhUCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1BQy8vCQkJTUFDSU5UT1NILy8KK2FsaWFzCUNTTUFDSU5UT1NILy8JCU1BQ0lOVE9TSC8vCittb2R1bGUJTUFDSU5UT1NILy8JCUlOVEVSTkFMCQlNQUNJTlRPU0gJMQorbW9kdWxlCUlOVEVSTkFMCQlNQUNJTlRPU0gvLwkJTUFDSU5UT1NICTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xNDMvLwkJSUVDX1AyNy0xLy8KK2FsaWFzCUNTSVNPMTQzSUVDUDI3MS8vCUlFQ19QMjctMS8vCithbGlhcwlJRUNfUDI3MS8vCQlJRUNfUDI3LTEvLworbW9kdWxlCUlFQ19QMjctMS8vCQlJTlRFUk5BTAkJSUVDX1AyNy0xCTEKK21vZHVsZQlJTlRFUk5BTAkJSUVDX1AyNy0xLy8JCUlFQ19QMjctMQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU09fOTAzNi8vCQlBU01PXzQ0OS8vCithbGlhcwlBUkFCSUM3Ly8JCUFTTU9fNDQ5Ly8KK2FsaWFzCUlTTy1JUi04OS8vCQlBU01PXzQ0OS8vCithbGlhcwlDU0lTTzg5QVNNTzQ0OS8vCUFTTU9fNDQ5Ly8KK21vZHVsZQlBU01PXzQ0OS8vCQlJTlRFUk5BTAkJQVNNT180NDkJMQorbW9kdWxlCUlOVEVSTkFMCQlBU01PXzQ0OS8vCQlBU01PXzQ0OQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlBTlNJX1gzLjExMC0xOTgzLy8JQU5TSV9YMy4xMTAvLworYWxpYXMJSVNPLUlSLTk5Ly8JCUFOU0lfWDMuMTEwLy8KK2FsaWFzCUNTQV9UNTAwLTE5ODMvLwkJQU5TSV9YMy4xMTAvLworYWxpYXMJQ1NBX1Q1MDAvLwkJQU5TSV9YMy4xMTAvLworYWxpYXMJTkFQTFBTLy8JCUFOU0lfWDMuMTEwLy8KK2FsaWFzCUNTSVNPOTlOQVBMUFMvLwkJQU5TSV9YMy4xMTAvLworbW9kdWxlCUFOU0lfWDMuMTEwLy8JCUlOVEVSTkFMCQlBTlNJX1gzLjExMAkxCittb2R1bGUJSU5URVJOQUwJCUFOU0lfWDMuMTEwLy8JCUFOU0lfWDMuMTEwCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xMzkvLwkJQ1NOXzM2OTEwMy8vCithbGlhcwlDU0lTTzEzOUNTTjM2OTEwMy8vCUNTTl8zNjkxMDMvLworbW9kdWxlCUNTTl8zNjkxMDMvLwkJSU5URVJOQUwJCUNTTl8zNjkxMDMJMQorbW9kdWxlCUlOVEVSTkFMCQlDU05fMzY5MTAzLy8JCUNTTl8zNjkxMDMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1dJLTIvLwkJCUNXSS8vCithbGlhcwlDUC1IVS8vCQkJQ1dJLy8KK21vZHVsZQlDV0kvLwkJCUlOVEVSTkFMCQlDV0kJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1dJLy8JCQlDV0kJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCURFQy8vCQkJREVDLU1DUy8vCithbGlhcwlDU0RFQ01DUy8vCQlERUMtTUNTLy8KK2FsaWFzCURFQ01DUy8vCQlERUMtTUNTLy8KK21vZHVsZQlERUMtTUNTLy8JCUlOVEVSTkFMCQlERUMtTUNTCQkxCittb2R1bGUJSU5URVJOQUwJCURFQy1NQ1MvLwkJREVDLU1DUwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTExMS8vCQlFQ01BLUNZUklMTElDLy8KK2FsaWFzCUNTSVNPMTExRUNNQUNZUklMTElDLy8JRUNNQS1DWVJJTExJQy8vCithbGlhcwlFQ01BQ1lSSUxMSUMvLwkJRUNNQS1DWVJJTExJQy8vCittb2R1bGUJRUNNQS1DWVJJTExJQy8vCQlJTlRFUk5BTAkJRUNNQS1DWVJJTExJQwkxCittb2R1bGUJSU5URVJOQUwJCUVDTUEtQ1lSSUxMSUMvLwkJRUNNQS1DWVJJTExJQwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlTVF9TRVZfMzU4LTg4Ly8JCUdPU1RfMTk3NjgtNzQvLworYWxpYXMJR09TVF8xOTc2OC8vCQlHT1NUXzE5NzY4LTc0Ly8KK2FsaWFzCUlTTy1JUi0xNTMvLwkJR09TVF8xOTc2OC03NC8vCithbGlhcwlDU0lTTzE1M0dPU1QxOTc2ODc0Ly8JR09TVF8xOTc2OC03NC8vCithbGlhcwlHT1NUXzE5NzY4NzQvLwkJR09TVF8xOTc2OC03NC8vCittb2R1bGUJR09TVF8xOTc2OC03NC8vCQlJTlRFUk5BTAkJR09TVF8xOTc2OC03NAkxCittb2R1bGUJSU5URVJOQUwJCUdPU1RfMTk3NjgtNzQvLwkJR09TVF8xOTc2OC03NAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTUwLy8JCUdSRUVLLUNDSVRULy8KK2FsaWFzCUNTSVNPMTUwLy8JCUdSRUVLLUNDSVRULy8KK2FsaWFzCUNTSVNPMTUwR1JFRUtDQ0lUVC8vCUdSRUVLLUNDSVRULy8KK2FsaWFzCUdSRUVLQ0NJVFQvLwkJR1JFRUstQ0NJVFQvLworbW9kdWxlCUdSRUVLLUNDSVRULy8JCUlOVEVSTkFMCQlHUkVFSy1DQ0lUVAkxCittb2R1bGUJSU5URVJOQUwJCUdSRUVLLUNDSVRULy8JCUdSRUVLLUNDSVRUCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi04OC8vCQlHUkVFSzcvLworYWxpYXMJQ1NJU084OEdSRUVLNy8vCQlHUkVFSzcvLworbW9kdWxlCUdSRUVLNy8vCQlJTlRFUk5BTAkJR1JFRUs3CQkxCittb2R1bGUJSU5URVJOQUwJCUdSRUVLNy8vCQlHUkVFSzcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xOC8vCQlHUkVFSzctT0xELy8KK2FsaWFzCUNTSVNPMThHUkVFSzdPTEQvLwlHUkVFSzctT0xELy8KK2FsaWFzCUdSRUVLN09MRC8vCQlHUkVFSzctT0xELy8KK21vZHVsZQlHUkVFSzctT0xELy8JCUlOVEVSTkFMCQlHUkVFSzctT0xECTEKK21vZHVsZQlJTlRFUk5BTAkJR1JFRUs3LU9MRC8vCQlHUkVFSzctT0xECTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi00OS8vCQlJTklTLy8KK2FsaWFzCUNTSVNPNDlJTklTLy8JCUlOSVMvLworbW9kdWxlCUlOSVMvLwkJCUlOVEVSTkFMCQlJTklTCQkxCittb2R1bGUJSU5URVJOQUwJCUlOSVMvLwkJCUlOSVMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi01MC8vCQlJTklTLTgvLworYWxpYXMJQ1NJU081MElOSVM4Ly8JCUlOSVMtOC8vCithbGlhcwlJTklTOC8vCQkJSU5JUy04Ly8KK21vZHVsZQlJTklTLTgvLwkJSU5URVJOQUwJCUlOSVMtOAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJTklTLTgvLwkJSU5JUy04CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItNTEvLwkJSU5JUy1DWVJJTExJQy8vCithbGlhcwlDU0lTTzUxSU5JU0NZUklMTElDLy8JSU5JUy1DWVJJTExJQy8vCithbGlhcwlJTklTQ1lSSUxMSUMvLwkJSU5JUy1DWVJJTExJQy8vCittb2R1bGUJSU5JUy1DWVJJTExJQy8vCQlJTlRFUk5BTAkJSU5JUy1DWVJJTExJQwkxCittb2R1bGUJSU5URVJOQUwJCUlOSVMtQ1lSSUxMSUMvLwkJSU5JUy1DWVJJTExJQwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItOTgvLwkJSVNPXzIwMzMvLworYWxpYXMJSVNPXzIwMzMtMTk4My8vCQlJU09fMjAzMy8vCithbGlhcwlFMTNCLy8JCQlJU09fMjAzMy8vCithbGlhcwlDU0lTTzIwMzMvLwkJSVNPXzIwMzMvLworbW9kdWxlCUlTT18yMDMzLy8JCUlOVEVSTkFMCQlJU09fMjAzMwkxCittb2R1bGUJSU5URVJOQUwJCUlTT18yMDMzLy8JCUlTT18yMDMzCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0zNy8vCQlJU09fNTQyNy8vCithbGlhcwlLT0ktNy8vCQkJSVNPXzU0MjcvLworYWxpYXMJQ1NJU081NDI3Q1lSSUxMSUMvLwlJU09fNTQyNy8vCittb2R1bGUJSVNPXzU0MjcvLwkJSU5URVJOQUwJCUlTT181NDI3CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPXzU0MjcvLwkJSVNPXzU0MjcJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTU0Ly8JCUlTT181NDI3LUVYVC8vCithbGlhcwlJU09fNTQyNzoxOTgxLy8JCUlTT181NDI3LUVYVC8vCithbGlhcwlDU0lTTzU0MjdDWVJJTExJQzE5ODEvLwlJU09fNTQyNy1FWFQvLworYWxpYXMJSVNPXzU0MjdFWFQvLwkJSVNPXzU0MjctRVhULy8KK21vZHVsZQlJU09fNTQyNy1FWFQvLwkJSU5URVJOQUwJCUlTT181NDI3LUVYVAkxCittb2R1bGUJSU5URVJOQUwJCUlTT181NDI3LUVYVC8vCQlJU09fNTQyNy1FWFQJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTU1Ly8JCUlTT181NDI4Ly8KK2FsaWFzCUlTT181NDI4OjE5ODAvLwkJSVNPXzU0MjgvLworYWxpYXMJQ1NJU081NDI4R1JFRUsvLwlJU09fNTQyOC8vCittb2R1bGUJSVNPXzU0MjgvLwkJSU5URVJOQUwJCUlTT181NDI4CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPXzU0MjgvLwkJSVNPXzU0MjgJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTE1NS8vCQlJU09fMTAzNjctQk9YLy8KK2FsaWFzCUNTSVNPMTAzNjdCT1gvLwkJSVNPXzEwMzY3LUJPWC8vCithbGlhcwlJU09fMTAzNjdCT1gvLwkJSVNPXzEwMzY3LUJPWC8vCittb2R1bGUJSVNPXzEwMzY3LUJPWC8vCQlJTlRFUk5BTAkJSVNPXzEwMzY3LUJPWAkxCittb2R1bGUJSU5URVJOQUwJCUlTT18xMDM2Ny1CT1gvLwkJSVNPXzEwMzY3LUJPWAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlNQUNJUy8vCQkJTUFDLUlTLy8KK21vZHVsZQlNQUMtSVMvLwkJSU5URVJOQUwJCU1BQy1JUwkJMQorbW9kdWxlCUlOVEVSTkFMCQlNQUMtSVMvLwkJTUFDLUlTCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlNQUNVSy8vCQkJTUFDLVVLLy8KK2FsaWFzCU1BQ1VLUkFJTklBTi8vCQlNQUMtVUsvLworYWxpYXMJTUFDLUNZUklMTElDLy8JCU1BQy1VSy8vCithbGlhcwlNQUNDWVJJTExJQy8vCQlNQUMtVUsvLworbW9kdWxlCU1BQy1VSy8vCQlJTlRFUk5BTAkJTUFDLVVLCQkxCittb2R1bGUJSU5URVJOQUwJCU1BQy1VSy8vCQlNQUMtVUsJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1TLU1BQy1DWVJJTExJQy8vCUNQMTAwMDcvLworYWxpYXMJTVNNQUNDWVJJTExJQy8vCQlDUDEwMDA3Ly8KK21vZHVsZQlDUDEwMDA3Ly8JCUlOVEVSTkFMCQlDUDEwMDA3CQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTAwMDcvLwkJQ1AxMDAwNwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTktMS8vCQlOQVRTLURBTk8vLworYWxpYXMJQ1NOQVRTREFOTy8vCQlOQVRTLURBTk8vLworYWxpYXMJTkFUU0RBTk8vLwkJTkFUUy1EQU5PLy8KK21vZHVsZQlOQVRTLURBTk8vLwkJSU5URVJOQUwJCU5BVFMtREFOTwkxCittb2R1bGUJSU5URVJOQUwJCU5BVFMtREFOTy8vCQlOQVRTLURBTk8JMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTgtMS8vCQlOQVRTLVNFRkkvLworYWxpYXMJQ1NOQVRTU0VGSS8vCQlOQVRTLVNFRkkvLworYWxpYXMJTkFUU1NFRkkvLwkJTkFUUy1TRUZJLy8KK21vZHVsZQlOQVRTLVNFRkkvLwkJSU5URVJOQUwJCU5BVFMtU0VGSQkxCittb2R1bGUJSU5URVJOQUwJCU5BVFMtU0VGSS8vCQlOQVRTLVNFRkkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJV1MyLy8JCQlXSU4tU0FNSS0yLy8KK2FsaWFzCVdJTlNBTUkyLy8JCVdJTi1TQU1JLTIvLworbW9kdWxlCVdJTi1TQU1JLTIvLwkJSU5URVJOQUwJCVNBTUktV1MyCTEKK21vZHVsZQlJTlRFUk5BTAkJV0lOLVNBTUktMi8vCQlTQU1JLVdTMgkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJSVNPLUlSLTE5Ny8vCQlJTlRFUk5BTAkJSVNPLUlSLTE5NwkxCittb2R1bGUJSU5URVJOQUwJCUlTTy1JUi0xOTcvLwkJSVNPLUlSLTE5NwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlUSVM2MjAvLwkJVElTLTYyMC8vCithbGlhcwlUSVM2MjAtMC8vCQlUSVMtNjIwLy8KK2FsaWFzCVRJUzYyMC4yNTI5LTEvLwkJVElTLTYyMC8vCithbGlhcwlUSVM2MjAuMjUzMy0wLy8JCVRJUy02MjAvLworYWxpYXMJSVNPLUlSLTE2Ni8vCQlUSVMtNjIwLy8KK21vZHVsZQlUSVMtNjIwLy8JCUlOVEVSTkFMCQlUSVMtNjIwCQkxCittb2R1bGUJSU5URVJOQUwJCVRJUy02MjAvLwkJVElTLTYyMAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJS09JOFUvLwkJCUtPSTgtVS8vCittb2R1bGUJS09JOC1VLy8JCUlOVEVSTkFMCQlLT0k4LVUJCTEKK21vZHVsZQlJTlRFUk5BTAkJS09JOC1VLy8JCUtPSTgtVQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNJUkkzMzQyLy8JCUlTSVJJLTMzNDIvLworbW9kdWxlCUlTSVJJLTMzNDIvLwkJSU5URVJOQUwJCUlTSVJJLTMzNDIJMQorbW9kdWxlCUlOVEVSTkFMCQlJU0lSSS0zMzQyLy8JCUlTSVJJLTMzNDIJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJVVRGMTYvLwkJCVVURi0xNi8vCittb2R1bGUJVVRGLTE2Ly8JCUlOVEVSTkFMCQlVVEYtMTYJCTEKK21vZHVsZQlJTlRFUk5BTAkJVVRGLTE2Ly8JCVVURi0xNgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJVVRGMTZMRS8vCQlVVEYtMTZMRS8vCittb2R1bGUJVVRGLTE2TEUvLwkJSU5URVJOQUwJCVVURi0xNgkJMQorbW9kdWxlCUlOVEVSTkFMCQlVVEYtMTZMRS8vCQlVVEYtMTYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVVURjE2QkUvLwkJVVRGLTE2QkUvLworbW9kdWxlCVVURi0xNkJFLy8JCUlOVEVSTkFMCQlVVEYtMTYJCTEKK21vZHVsZQlJTlRFUk5BTAkJVVRGLTE2QkUvLwkJVVRGLTE2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU1VOSUNPREUvLwkJVU5JQ09ERS8vCittb2R1bGUJVU5JQ09ERS8vCQlJTlRFUk5BTAkJVU5JQ09ERQkJMQorbW9kdWxlCUlOVEVSTkFMCQlVTklDT0RFLy8JCVVOSUNPREUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVVURjMyLy8JCQlVVEYtMzIvLworbW9kdWxlCVVURi0zMi8vCQlJTlRFUk5BTAkJVVRGLTMyCQkxCittb2R1bGUJSU5URVJOQUwJCVVURi0zMi8vCQlVVEYtMzIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVVURjMyTEUvLwkJVVRGLTMyTEUvLworbW9kdWxlCVVURi0zMkxFLy8JCUlOVEVSTkFMCQlVVEYtMzIJCTEKK21vZHVsZQlJTlRFUk5BTAkJVVRGLTMyTEUvLwkJVVRGLTMyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlVVEYzMkJFLy8JCVVURi0zMkJFLy8KK21vZHVsZQlVVEYtMzJCRS8vCQlJTlRFUk5BTAkJVVRGLTMyCQkxCittb2R1bGUJSU5URVJOQUwJCVVURi0zMkJFLy8JCVVURi0zMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJVVRGNy8vCQkJVVRGLTcvLworbW9kdWxlCVVURi03Ly8JCQlJTlRFUk5BTAkJVVRGLTcJCTEKK21vZHVsZQlJTlRFUk5BTAkJVVRGLTcvLwkJCVVURi03CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJR0IxODAzMC8vCQlJTlRFUk5BTAkJR0IxODAzMAkJMQorbW9kdWxlCUlOVEVSTkFMCQlHQjE4MDMwLy8JCUdCMTgwMzAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlWSVNDSUkvLwkJSU5URVJOQUwJCVZJU0NJSQkJMQorbW9kdWxlCUlOVEVSTkFMCQlWSVNDSUkvLwkJVklTQ0lJCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJS09JOC1ULy8JCUlOVEVSTkFMCQlLT0k4LVQJCTEKK21vZHVsZQlJTlRFUk5BTAkJS09JOC1ULy8JCUtPSTgtVAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUdFT1JHSUFOLVBTLy8JCUlOVEVSTkFMCQlHRU9SR0lBTi1QUwkxCittb2R1bGUJSU5URVJOQUwJCUdFT1JHSUFOLVBTLy8JCUdFT1JHSUFOLVBTCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlHRU9SR0lBTi1BQ0FERU1ZLy8JSU5URVJOQUwJCUdFT1JHSUFOLUFDQURFTVkgMQorbW9kdWxlCUlOVEVSTkFMCQlHRU9SR0lBTi1BQ0FERU1ZLy8JR0VPUkdJQU4tQUNBREVNWSAxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJSVNPLUlSLTIwOS8vCQlJTlRFUk5BTAkJSVNPLUlSLTIwOQkxCittb2R1bGUJSU5URVJOQUwJCUlTTy1JUi0yMDkvLwkJSVNPLUlSLTIwOQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJTUFDLVNBTUkvLwkJSU5URVJOQUwJCU1BQy1TQU1JCTEKK21vZHVsZQlJTlRFUk5BTAkJTUFDLVNBTUkvLwkJTUFDLVNBTUkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUFSTVNDSUktOC8vCQlJTlRFUk5BTAkJQVJNU0NJSS04CTEKK21vZHVsZQlJTlRFUk5BTAkJQVJNU0NJSS04Ly8JCUFSTVNDSUktOAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlUQ1ZOLy8JCQlUQ1ZONTcxMi0xLy8KK2FsaWFzCVRDVk4tNTcxMi8vCQlUQ1ZONTcxMi0xLy8KK2FsaWFzCVRDVk41NzEyLTE6MTk5My8vCVRDVk41NzEyLTEvLworbW9kdWxlCVRDVk41NzEyLTEvLwkJSU5URVJOQUwJCVRDVk41NzEyLTEJMQorbW9kdWxlCUlOVEVSTkFMCQlUQ1ZONTcxMi0xLy8JCVRDVk41NzEyLTEJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUVVQy1KSVNYMDIxMy8vCQlJTlRFUk5BTAkJRVVDLUpJU1gwMjEzCTEKK21vZHVsZQlJTlRFUk5BTAkJRVVDLUpJU1gwMjEzLy8JCUVVQy1KSVNYMDIxMwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJU2hpZnRfSklTWDAyMTMvLwlJTlRFUk5BTAkJU0hJRlRfSklTWDAyMTMJMQorbW9kdWxlCUlOVEVSTkFMCQlTaGlmdF9KSVNYMDIxMy8vCVNISUZUX0pJU1gwMjEzCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlUU0NJSS8vCQkJSU5URVJOQUwJCVRTQ0lJCQkxCittb2R1bGUJSU5URVJOQUwJCVRTQ0lJLy8JCQlUU0NJSQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCVBUMTU0Ly8JCQlJTlRFUk5BTAkJUFQxNTQJCTEKK21vZHVsZQlJTlRFUk5BTAkJUFQxNTQvLwkJCVBUMTU0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlTVFJLMTA0OC0yMDAyLy8JCVJLMTA0OC8vCittb2R1bGUJUksxMDQ4Ly8JCUlOVEVSTkFMCQlSSzEwNDgJCTEKK21vZHVsZQlJTlRFUk5BTAkJUksxMDQ4Ly8JCVJLMTA0OAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTEwMjUvLwkJSUJNMTAyNS8vCithbGlhcwlDUDEwMjUvLwkJSUJNMTAyNS8vCithbGlhcwlDU0lCTTEwMjUvLwkJSUJNMTAyNS8vCittb2R1bGUJSUJNMTAyNS8vCQlJTlRFUk5BTAkJSUJNMTAyNQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMDI1Ly8JCUlCTTEwMjUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTIyLy8JCUlCTTExMjIvLworYWxpYXMJQ1AxMTIyLy8JCUlCTTExMjIvLworYWxpYXMJQ1NJQk0xMTIyLy8JCUlCTTExMjIvLworbW9kdWxlCUlCTTExMjIvLwkJSU5URVJOQUwJCUlCTTExMjIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTEyMi8vCQlJQk0xMTIyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTEzNy8vCQlJQk0xMTM3Ly8KK2FsaWFzCUNQMTEzNy8vCQlJQk0xMTM3Ly8KK2FsaWFzCUNTSUJNMTEzNy8vCQlJQk0xMTM3Ly8KK21vZHVsZQlJQk0xMTM3Ly8JCUlOVEVSTkFMCQlJQk0xMTM3CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExMzcvLwkJSUJNMTEzNwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNTMvLwkJSUJNMTE1My8vCithbGlhcwlDUDExNTMvLwkJSUJNMTE1My8vCithbGlhcwlDU0lCTTExNTMvLwkJSUJNMTE1My8vCittb2R1bGUJSUJNMTE1My8vCQlJTlRFUk5BTAkJSUJNMTE1MwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTUzLy8JCUlCTTExNTMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTU0Ly8JCUlCTTExNTQvLworYWxpYXMJQ1AxMTU0Ly8JCUlCTTExNTQvLworYWxpYXMJQ1NJQk0xMTU0Ly8JCUlCTTExNTQvLworbW9kdWxlCUlCTTExNTQvLwkJSU5URVJOQUwJCUlCTTExNTQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE1NC8vCQlJQk0xMTU0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE1NS8vCQlJQk0xMTU1Ly8KK2FsaWFzCUNQMTE1NS8vCQlJQk0xMTU1Ly8KK2FsaWFzCUNTSUJNMTE1NS8vCQlJQk0xMTU1Ly8KK21vZHVsZQlJQk0xMTU1Ly8JCUlOVEVSTkFMCQlJQk0xMTU1CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNTUvLwkJSUJNMTE1NQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNTUvLwkJSUJNMTE1NS8vCithbGlhcwlDUDExNTUvLwkJSUJNMTE1NS8vCithbGlhcwlDU0lCTTExNTUvLwkJSUJNMTE1NS8vCittb2R1bGUJSUJNMTE1NS8vCQlJTlRFUk5BTAkJSUJNMTE1NQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTU1Ly8JCUlCTTExNTUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTU2Ly8JCUlCTTExNTYvLworYWxpYXMJQ1AxMTU2Ly8JCUlCTTExNTYvLworYWxpYXMJQ1NJQk0xMTU2Ly8JCUlCTTExNTYvLworbW9kdWxlCUlCTTExNTYvLwkJSU5URVJOQUwJCUlCTTExNTYJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE1Ni8vCQlJQk0xMTU2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE1Ny8vCQlJQk0xMTU3Ly8KK2FsaWFzCUNQMTE1Ny8vCQlJQk0xMTU3Ly8KK2FsaWFzCUNTSUJNMTE1Ny8vCQlJQk0xMTU3Ly8KK21vZHVsZQlJQk0xMTU3Ly8JCUlOVEVSTkFMCQlJQk0xMTU3CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNTcvLwkJSUJNMTE1NwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNTgvLwkJSUJNMTE1OC8vCithbGlhcwlDUDExNTgvLwkJSUJNMTE1OC8vCithbGlhcwlDU0lCTTExNTgvLwkJSUJNMTE1OC8vCittb2R1bGUJSUJNMTE1OC8vCQlJTlRFUk5BTAkJSUJNMTE1OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTU4Ly8JCUlCTTExNTgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS04MDMvLwkJSUJNODAzLy8KK2FsaWFzCUNQODAzLy8JCUlCTTgwMy8vCithbGlhcwlDU0lCTTgwMy8vCQlJQk04MDMvLworbW9kdWxlCUlCTTgwMy8vCQlJTlRFUk5BTAkJSUJNODAzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTgwMy8vCQlJQk04MDMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MDEvLwkJSUJNOTAxLy8KK2FsaWFzCUNQOTAxLy8JCUlCTTkwMS8vCithbGlhcwlDU0lCTTkwMS8vCQlJQk05MDEvLworbW9kdWxlCUlCTTkwMS8vCQlJTlRFUk5BTAkJSUJNOTAxCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkwMS8vCQlJQk05MDEJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MDIvLwkJSUJNOTAyLy8KK2FsaWFzCUNQOTAyLy8JCUlCTTkwMi8vCithbGlhcwlDU0lCTTkwMi8vCQlJQk05MDIvLworbW9kdWxlCUlCTTkwMi8vCQlJTlRFUk5BTAkJSUJNOTAyCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkwMi8vCQlJQk05MDIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MjEvLwkJSUJNOTIxLy8KK2FsaWFzCUNQOTIxLy8JCUlCTTkyMS8vCithbGlhcwlDU0lCTTkyMS8vCQlJQk05MjEvLworbW9kdWxlCUlCTTkyMS8vCQlJTlRFUk5BTAkJSUJNOTIxCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkyMS8vCQlJQk05MjEJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMDA4Ly8JCUlCTTEwMDgvLworYWxpYXMJQ1AxMDA4Ly8JCUlCTTEwMDgvLworYWxpYXMJQ1NJQk0xMDA4Ly8JCUlCTTEwMDgvLworbW9kdWxlCUlCTTEwMDgvLwkJSU5URVJOQUwJCUlCTTEwMDgJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTAwOC8vCQlJQk0xMDA4CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJSUJNMTAwOC8vCQlJQk00MjAvLwkJSUJNMTAwOF80MjAJMQorbW9kdWxlCUlCTTQyMC8vCQlJQk0xMDA4Ly8JCUlCTTEwMDhfNDIwCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMDk3Ly8JCUlCTTEwOTcvLworYWxpYXMJQ1AxMDk3Ly8JCUlCTTEwOTcvLworYWxpYXMJQ1NJQk0xMDk3Ly8JCUlCTTEwOTcvLworbW9kdWxlCUlCTTEwOTcvLwkJSU5URVJOQUwJCUlCTTEwOTcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTA5Ny8vCQlJQk0xMDk3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTExMi8vCQlJQk0xMTEyLy8KK2FsaWFzCUNQMTExMi8vCQlJQk0xMTEyLy8KK2FsaWFzCUNTSUJNMTExMi8vCQlJQk0xMTEyLy8KK21vZHVsZQlJQk0xMTEyLy8JCUlOVEVSTkFMCQlJQk0xMTEyCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExMTIvLwkJSUJNMTExMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExMjMvLwkJSUJNMTEyMy8vCithbGlhcwlDUDExMjMvLwkJSUJNMTEyMy8vCithbGlhcwlDU0lCTTExMjMvLwkJSUJNMTEyMy8vCittb2R1bGUJSUJNMTEyMy8vCQlJTlRFUk5BTAkJSUJNMTEyMwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTIzLy8JCUlCTTExMjMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTMwLy8JCUlCTTExMzAvLworYWxpYXMJQ1AxMTMwLy8JCUlCTTExMzAvLworYWxpYXMJQ1NJQk0xMTMwLy8JCUlCTTExMzAvLworbW9kdWxlCUlCTTExMzAvLwkJSU5URVJOQUwJCUlCTTExMzAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTEzMC8vCQlJQk0xMTMwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE0MC8vCQlJQk0xMTQwLy8KK2FsaWFzCUNQMTE0MC8vCQlJQk0xMTQwLy8KK2FsaWFzCUNTSUJNMTE0MC8vCQlJQk0xMTQwLy8KK21vZHVsZQlJQk0xMTQwLy8JCUlOVEVSTkFMCQlJQk0xMTQwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNDAvLwkJSUJNMTE0MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNDEvLwkJSUJNMTE0MS8vCithbGlhcwlDUDExNDEvLwkJSUJNMTE0MS8vCithbGlhcwlDU0lCTTExNDEvLwkJSUJNMTE0MS8vCittb2R1bGUJSUJNMTE0MS8vCQlJTlRFUk5BTAkJSUJNMTE0MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTQxLy8JCUlCTTExNDEJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTQyLy8JCUlCTTExNDIvLworYWxpYXMJQ1AxMTQyLy8JCUlCTTExNDIvLworYWxpYXMJQ1NJQk0xMTQyLy8JCUlCTTExNDIvLworbW9kdWxlCUlCTTExNDIvLwkJSU5URVJOQUwJCUlCTTExNDIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE0Mi8vCQlJQk0xMTQyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE0My8vCQlJQk0xMTQzLy8KK2FsaWFzCUNQMTE0My8vCQlJQk0xMTQzLy8KK2FsaWFzCUNTSUJNMTE0My8vCQlJQk0xMTQzLy8KK21vZHVsZQlJQk0xMTQzLy8JCUlOVEVSTkFMCQlJQk0xMTQzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNDMvLwkJSUJNMTE0MwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNDQvLwkJSUJNMTE0NC8vCithbGlhcwlDUDExNDQvLwkJSUJNMTE0NC8vCithbGlhcwlDU0lCTTExNDQvLwkJSUJNMTE0NC8vCittb2R1bGUJSUJNMTE0NC8vCQlJTlRFUk5BTAkJSUJNMTE0NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTQ0Ly8JCUlCTTExNDQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTQ1Ly8JCUlCTTExNDUvLworYWxpYXMJQ1AxMTQ1Ly8JCUlCTTExNDUvLworYWxpYXMJQ1NJQk0xMTQ1Ly8JCUlCTTExNDUvLworbW9kdWxlCUlCTTExNDUvLwkJSU5URVJOQUwJCUlCTTExNDUJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE0NS8vCQlJQk0xMTQ1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE0Ni8vCQlJQk0xMTQ2Ly8KK2FsaWFzCUNQMTE0Ni8vCQlJQk0xMTQ2Ly8KK2FsaWFzCUNTSUJNMTE0Ni8vCQlJQk0xMTQ2Ly8KK21vZHVsZQlJQk0xMTQ2Ly8JCUlOVEVSTkFMCQlJQk0xMTQ2CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNDYvLwkJSUJNMTE0NgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNDcvLwkJSUJNMTE0Ny8vCithbGlhcwlDUDExNDcvLwkJSUJNMTE0Ny8vCithbGlhcwlDU0lCTTExNDcvLwkJSUJNMTE0Ny8vCittb2R1bGUJSUJNMTE0Ny8vCQlJTlRFUk5BTAkJSUJNMTE0NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTQ3Ly8JCUlCTTExNDcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTQ4Ly8JCUlCTTExNDgvLworYWxpYXMJQ1AxMTQ4Ly8JCUlCTTExNDgvLworYWxpYXMJQ1NJQk0xMTQ4Ly8JCUlCTTExNDgvLworbW9kdWxlCUlCTTExNDgvLwkJSU5URVJOQUwJCUlCTTExNDgJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE0OC8vCQlJQk0xMTQ4CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE0OS8vCQlJQk0xMTQ5Ly8KK2FsaWFzCUNQMTE0OS8vCQlJQk0xMTQ5Ly8KK2FsaWFzCUNTSUJNMTE0OS8vCQlJQk0xMTQ5Ly8KK21vZHVsZQlJQk0xMTQ5Ly8JCUlOVEVSTkFMCQlJQk0xMTQ5CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNDkvLwkJSUJNMTE0OQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNjYvLwkJSUJNMTE2Ni8vCithbGlhcwlDUDExNjYvLwkJSUJNMTE2Ni8vCithbGlhcwlDU0lCTTExNjYvLwkJSUJNMTE2Ni8vCittb2R1bGUJSUJNMTE2Ni8vCQlJTlRFUk5BTAkJSUJNMTE2NgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTY2Ly8JCUlCTTExNjYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTY3Ly8JCUlCTTExNjcvLworYWxpYXMJQ1AxMTY3Ly8JCUlCTTExNjcvLworYWxpYXMJQ1NJQk0xMTY3Ly8JCUlCTTExNjcvLworbW9kdWxlCUlCTTExNjcvLwkJSU5URVJOQUwJCUlCTTExNjcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE2Ny8vCQlJQk0xMTY3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tNDUxNy8vCQlJQk00NTE3Ly8KK2FsaWFzCUNQNDUxNy8vCQlJQk00NTE3Ly8KK2FsaWFzCUNTSUJNNDUxNy8vCQlJQk00NTE3Ly8KK21vZHVsZQlJQk00NTE3Ly8JCUlOVEVSTkFMCQlJQk00NTE3CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTQ1MTcvLwkJSUJNNDUxNwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTQ4OTkvLwkJSUJNNDg5OS8vCithbGlhcwlDUDQ4OTkvLwkJSUJNNDg5OS8vCithbGlhcwlDU0lCTTQ4OTkvLwkJSUJNNDg5OS8vCittb2R1bGUJSUJNNDg5OS8vCQlJTlRFUk5BTAkJSUJNNDg5OQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk00ODk5Ly8JCUlCTTQ4OTkJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS00OTA5Ly8JCUlCTTQ5MDkvLworYWxpYXMJQ1A0OTA5Ly8JCUlCTTQ5MDkvLworYWxpYXMJQ1NJQk00OTA5Ly8JCUlCTTQ5MDkvLworbW9kdWxlCUlCTTQ5MDkvLwkJSU5URVJOQUwJCUlCTTQ5MDkJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNNDkwOS8vCQlJQk00OTA5CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tNDk3MS8vCQlJQk00OTcxLy8KK2FsaWFzCUNQNDk3MS8vCQlJQk00OTcxLy8KK2FsaWFzCUNTSUJNNDk3MS8vCQlJQk00OTcxLy8KK21vZHVsZQlJQk00OTcxLy8JCUlOVEVSTkFMCQlJQk00OTcxCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTQ5NzEvLwkJSUJNNDk3MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTUzNDcvLwkJSUJNNTM0Ny8vCithbGlhcwlDUDUzNDcvLwkJSUJNNTM0Ny8vCithbGlhcwlDU0lCTTUzNDcvLwkJSUJNNTM0Ny8vCittb2R1bGUJSUJNNTM0Ny8vCQlJTlRFUk5BTAkJSUJNNTM0NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk01MzQ3Ly8JCUlCTTUzNDcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MDMwLy8JCUlCTTkwMzAvLworYWxpYXMJQ1A5MDMwLy8JCUlCTTkwMzAvLworYWxpYXMJQ1NJQk05MDMwLy8JCUlCTTkwMzAvLworbW9kdWxlCUlCTTkwMzAvLwkJSU5URVJOQUwJCUlCTTkwMzAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTAzMC8vCQlJQk05MDMwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tOTA2Ni8vCQlJQk05MDY2Ly8KK2FsaWFzCUNQOTA2Ni8vCQlJQk05MDY2Ly8KK2FsaWFzCUNTSUJNOTA2Ni8vCQlJQk05MDY2Ly8KK21vZHVsZQlJQk05MDY2Ly8JCUlOVEVSTkFMCQlJQk05MDY2CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkwNjYvLwkJSUJNOTA2NgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTk0NDgvLwkJSUJNOTQ0OC8vCithbGlhcwlDUDk0NDgvLwkJSUJNOTQ0OC8vCithbGlhcwlDU0lCTTk0NDgvLwkJSUJNOTQ0OC8vCittb2R1bGUJSUJNOTQ0OC8vCQlJTlRFUk5BTAkJSUJNOTQ0OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05NDQ4Ly8JCUlCTTk0NDgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMjcxMi8vCQlJQk0xMjcxMi8vCithbGlhcwlDUDEyNzEyLy8JCUlCTTEyNzEyLy8KK2FsaWFzCUNTSUJNMTI3MTIvLwkJSUJNMTI3MTIvLworbW9kdWxlCUlCTTEyNzEyLy8JCUlOVEVSTkFMCQlJQk0xMjcxMgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMjcxMi8vCQlJQk0xMjcxMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTE2ODA0Ly8JCUlCTTE2ODA0Ly8KK2FsaWFzCUNQMTY4MDQvLwkJSUJNMTY4MDQvLworYWxpYXMJQ1NJQk0xNjgwNC8vCQlJQk0xNjgwNC8vCittb2R1bGUJSUJNMTY4MDQvLwkJSU5URVJOQUwJCUlCTTE2ODA0CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTE2ODA0Ly8JCUlCTTE2ODA0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTM2NC8vCQlJQk0xMzY0Ly8KK2FsaWFzCUNQMTM2NC8vCQlJQk0xMzY0Ly8KK2FsaWFzCUNTSUJNMTM2NC8vCQlJQk0xMzY0Ly8KK21vZHVsZQlJQk0xMzY0Ly8JCUlOVEVSTkFMCQlJQk0xMzY0CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTEzNjQvLwkJSUJNMTM2NAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTEzNzEvLwkJSUJNMTM3MS8vCithbGlhcwlDUDEzNzEvLwkJSUJNMTM3MS8vCithbGlhcwlDU0lCTTEzNzEvLwkJSUJNMTM3MS8vCittb2R1bGUJSUJNMTM3MS8vCQlJTlRFUk5BTAkJSUJNMTM3MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMzcxLy8JCUlCTTEzNzEJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMzg4Ly8JCUlCTTEzODgvLworYWxpYXMJQ1AxMzg4Ly8JCUlCTTEzODgvLworYWxpYXMJQ1NJQk0xMzg4Ly8JCUlCTTEzODgvLworbW9kdWxlCUlCTTEzODgvLwkJSU5URVJOQUwJCUlCTTEzODgJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTM4OC8vCQlJQk0xMzg4CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTM5MC8vCQlJQk0xMzkwLy8KK2FsaWFzCUNQMTM5MC8vCQlJQk0xMzkwLy8KK2FsaWFzCUNTSUJNMTM5MC8vCQlJQk0xMzkwLy8KK21vZHVsZQlJQk0xMzkwLy8JCUlOVEVSTkFMCQlJQk0xMzkwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTEzOTAvLwkJSUJNMTM5MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTEzOTkvLwkJSUJNMTM5OS8vCithbGlhcwlDUDEzOTkvLwkJSUJNMTM5OS8vCithbGlhcwlDU0lCTTEzOTkvLwkJSUJNMTM5OS8vCittb2R1bGUJSUJNMTM5OS8vCQlJTlRFUk5BTAkJSUJNMTM5OQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMzk5Ly8JCUlCTTEzOTkJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy9UUl8xMTU0OC0xLwkJSVNPXzExNTQ4LTEvLworYWxpYXMJSVNPMTE1NDgtMS8vCQlJU09fMTE1NDgtMS8vCittb2R1bGUJSVNPXzExNTQ4LTEvLwkJSU5URVJOQUwJCUlTT18xMTU0OC0xCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPXzExNTQ4LTEvLwkJSVNPXzExNTQ4LTEJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCU1JSy8vCQkJSU5URVJOQUwJCU1JSwkJMQorbW9kdWxlCUlOVEVSTkFMCQlNSUsvLwkJCU1JSwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUJSRi8vCQkJSU5URVJOQUwJCUJSRgkJMQorbW9kdWxlCUlOVEVSTkFMCQlCUkYvLwkJCUJSRgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AxMjgyLy8JCU1BQy1DRU5UUkFMRVVST1BFLy8KK21vZHVsZQlNQUMtQ0VOVFJBTEVVUk9QRS8vCUlOVEVSTkFMCQlNQUMtQ0VOVFJBTEVVUk9QRSAxCittb2R1bGUJSU5URVJOQUwJCU1BQy1DRU5UUkFMRVVST1BFLy8JTUFDLUNFTlRSQUxFVVJPUEUgMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUtPSTgtUlUvLwkJSU5URVJOQUwJCUtPSTgtUlUJCTEKK21vZHVsZQlJTlRFUk5BTAkJS09JOC1SVS8vCQlLT0k4LVJVCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU09fODg1OS05RS8vCQlJU08tODg1OS05RS8vCithbGlhcwlJU084ODU5LTlFLy8JCUlTTy04ODU5LTlFLy8KK2FsaWFzCUlTTzg4NTk5RS8vCQlJU08tODg1OS05RS8vCittb2R1bGUJSVNPLTg4NTktOUUvLwkJSU5URVJOQUwJCUlTTzg4NTktOUUJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS05RS8vCQlJU084ODU5LTlFCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVJPTUFOOS8vCQlIUC1ST01BTjkvLworYWxpYXMJUjkvLwkJCUhQLVJPTUFOOS8vCithbGlhcwlIUFJPTUFOOS8vCQlIUC1ST01BTjkvLworbW9kdWxlCUhQLVJPTUFOOS8vCQlJTlRFUk5BTAkJSFAtUk9NQU45CTEKK21vZHVsZQlJTlRFUk5BTAkJSFAtUk9NQU45Ly8JCUhQLVJPTUFOOQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlUVVJLSVNIOC8vCQlIUC1UVVJLSVNIOC8vCithbGlhcwlIUFRVUktJU0g4Ly8JCUhQLVRVUktJU0g4Ly8KK2FsaWFzCU9TRjEwMDEwMDA2Ly8JCUhQLVRVUktJU0g4Ly8KK21vZHVsZQlIUC1UVVJLSVNIOC8vCQlJTlRFUk5BTAkJSFAtVFVSS0lTSDgJMQorbW9kdWxlCUlOVEVSTkFMCQlIUC1UVVJLSVNIOC8vCQlIUC1UVVJLSVNIOAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlUSEFJOC8vCQkJSFAtVEhBSTgvLworYWxpYXMJSFBUSEFJOC8vCQlIUC1USEFJOC8vCittb2R1bGUJSFAtVEhBSTgvLwkJSU5URVJOQUwJCUhQLVRIQUk4CTEKK21vZHVsZQlJTlRFUk5BTAkJSFAtVEhBSTgvLwkJSFAtVEhBSTgJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSFBHUkVFSzgvLwkJSFAtR1JFRUs4Ly8KK2FsaWFzCU9TRjEwMDEwMDA0Ly8JCUhQLUdSRUVLOC8vCittb2R1bGUJSFAtR1JFRUs4Ly8JCUlOVEVSTkFMCQlIUC1HUkVFSzgJMQorbW9kdWxlCUlOVEVSTkFMCQlIUC1HUkVFSzgvLwkJSFAtR1JFRUs4CTEKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L2djb252LW1vZHVsZXMuY2FjaGUgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9nY29udi1tb2R1bGVzLmNhY2hlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYTQ4M2YKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY29udi9nY29udi1tb2R1bGVzLmNhY2hlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L2xpYkNOUy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L2xpYkNOUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzg3OWY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvbGliQ05TLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L2xpYkdCLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvbGliR0Iuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2NjFmYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L2xpYkdCLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L2xpYklTT0lSMTY1LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvbGliSVNPSVIxNjUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2MGMwYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L2xpYklTT0lSMTY1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L2xpYkpJUy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L2xpYkpJUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWU1NjhmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvbGliSklTLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L2xpYkpJU1gwMjEzLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvbGliSklTWDAyMTMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIyOGI3MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L2xpYkpJU1gwMjEzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L2xpYktTQy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2djb252L2xpYktTQy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDY0YTUxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvZ2NvbnYvbGliS1NDLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2djcnQxLm8gYi9zeXNyb290L3Vzci9saWIzMi9nY3J0MS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZTgwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9nY3J0MS5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xkLTIuMTUuc28gYi9zeXNyb290L3Vzci9saWIzMi9sZC0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQyMzA2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9sZC0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xkLWxpbnV4LnNvLjIgYi9zeXNyb290L3Vzci9saWIzMi9sZC1saW51eC5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjg2NzZkMjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9sZC1saW51eC5zby4yCkBAIC0wLDAgKzEgQEAKK2xkLTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJCcm9rZW5Mb2NhbGUtMi4xNS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYkJyb2tlbkxvY2FsZS0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMDJmNjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJCcm9rZW5Mb2NhbGUtMi4xNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJCcm9rZW5Mb2NhbGUuYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYkJyb2tlbkxvY2FsZS5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNTI0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJCcm9rZW5Mb2NhbGUuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJCcm9rZW5Mb2NhbGUuc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJCcm9rZW5Mb2NhbGUuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNjgxMDRjMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYkJyb2tlbkxvY2FsZS5zbwpAQCAtMCwwICsxIEBACitsaWJCcm9rZW5Mb2NhbGUuc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYkJyb2tlbkxvY2FsZS5zby4xIGIvc3lzcm9vdC91c3IvbGliMzIvbGliQnJva2VuTG9jYWxlLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNzg5ZWQxYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYkJyb2tlbkxvY2FsZS5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYkJyb2tlbkxvY2FsZS0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliR0wuc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJHTC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5mYzNhMDNlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGliR0wuc28KQEAgLTAsMCArMSBAQAorbGliR0wuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJTZWdGYXVsdC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlNlZ0ZhdWx0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NThkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJTZWdGYXVsdC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJYMTEuYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlgxMS5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZGMxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJYMTEuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJYMTEuc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJYMTEuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMzg3N2RiNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlgxMS5zbwpAQCAtMCwwICsxIEBACitsaWJYMTEuc28uNi4zLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJYMTEuc28uNiBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlgxMS5zby42Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjM4NzdkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJYMTEuc28uNgpAQCAtMCwwICsxIEBACitsaWJYMTEuc28uNi4zLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJYMTEuc28uNi4zLjAgYi9zeXNyb290L3Vzci9saWIzMi9saWJYMTEuc28uNi4zLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA4MGQxMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlgxMS5zby42LjMuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJYYXUuc28uNiBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhhdS5zby42Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjMzOTYzNmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJYYXUuc28uNgpAQCAtMCwwICsxIEBACitsaWJYYXUuc28uNi4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJYYXUuc28uNi4wLjAgYi9zeXNyb290L3Vzci9saWIzMi9saWJYYXUuc28uNi4wLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmZjgxNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhhdS5zby42LjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJYZGFtYWdlLnNvLjEgYi9zeXNyb290L3Vzci9saWIzMi9saWJYZGFtYWdlLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYTYxZDkxZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhkYW1hZ2Uuc28uMQpAQCAtMCwwICsxIEBACitsaWJYZGFtYWdlLnNvLjEuMS4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliWGRhbWFnZS5zby4xLjEuMCBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhkYW1hZ2Uuc28uMS4xLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UxNTI3NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhkYW1hZ2Uuc28uMS4xLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliWGRtY3Auc28uNiBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhkbWNwLnNvLjYKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYmJmNDY0NgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhkbWNwLnNvLjYKQEAgLTAsMCArMSBAQAorbGliWGRtY3Auc28uNi4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJYZG1jcC5zby42LjAuMCBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhkbWNwLnNvLjYuMC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NTQ1OGIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJYZG1jcC5zby42LjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJYZXh0LmEgYi9zeXNyb290L3Vzci9saWIzMi9saWJYZXh0LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk3ZGY3MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhleHQuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJYZXh0LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGliWGV4dC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40NjVmODA1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGliWGV4dC5zbwpAQCAtMCwwICsxIEBACitsaWJYZXh0LnNvLjYuNC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliWGV4dC5zby42IGIvc3lzcm9vdC91c3IvbGliMzIvbGliWGV4dC5zby42Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjQ2NWY4MDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJYZXh0LnNvLjYKQEAgLTAsMCArMSBAQAorbGliWGV4dC5zby42LjQuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhleHQuc28uNi40LjAgYi9zeXNyb290L3Vzci9saWIzMi9saWJYZXh0LnNvLjYuNC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZTIyOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJYZXh0LnNvLjYuNC4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhmaXhlcy5hIGIvc3lzcm9vdC91c3IvbGliMzIvbGliWGZpeGVzLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjZDkxZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhmaXhlcy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhmaXhlcy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhmaXhlcy5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi45MjdkYTk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGliWGZpeGVzLnNvCkBAIC0wLDAgKzEgQEAKK2xpYlhmaXhlcy5zby4zLjEuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhmaXhlcy5zby4zIGIvc3lzcm9vdC91c3IvbGliMzIvbGliWGZpeGVzLnNvLjMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uOTI3ZGE5OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhmaXhlcy5zby4zCkBAIC0wLDAgKzEgQEAKK2xpYlhmaXhlcy5zby4zLjEuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhmaXhlcy5zby4zLjEuMCBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhmaXhlcy5zby4zLjEuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mzc0MGYxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGliWGZpeGVzLnNvLjMuMS4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhpLmEgYi9zeXNyb290L3Vzci9saWIzMi9saWJYaS5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNjM0MTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJYaS5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhpLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGliWGkuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNTkyYzhmOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlhpLnNvCkBAIC0wLDAgKzEgQEAKK2xpYlhpLnNvLjYuMS4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliWHhmODZ2bS5zby4xIGIvc3lzcm9vdC91c3IvbGliMzIvbGliWHhmODZ2bS5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmU5OTFmZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJYeGY4NnZtLnNvLjEKQEAgLTAsMCArMSBAQAorbGliWHhmODZ2bS5zby4xLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYlh4Zjg2dm0uc28uMS4wLjAgYi9zeXNyb290L3Vzci9saWIzMi9saWJYeGY4NnZtLnNvLjEuMC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOTczMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJYeGY4NnZtLnNvLjEuMC4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFjbC5hIGIvc3lzcm9vdC91c3IvbGliMzIvbGliYWNsLmEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYmJhYjc1ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFjbC5hCkBAIC0wLDAgKzEgQEAKK2xpYmFjbC5hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliYWNsLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGliYWNsLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmIyOTMzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJhY2wuc28KQEAgLTAsMCArMSBAQAorbGliYWNsLnNvLjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJhY2wuc28uMSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFjbC5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjA5YmYwNTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJhY2wuc28uMQpAQCAtMCwwICsxIEBACitsaWJhY2wuc28uMS4xLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJhY2wuc28uMS4xLjAgYi9zeXNyb290L3Vzci9saWIzMi9saWJhY2wuc28uMS4xLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0ODc0MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFjbC5zby4xLjEuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJhbmwtMi4xNS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFubC0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiM2JmNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJhbmwtMi4xNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJhbmwuYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFubC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZTJkNGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJhbmwuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJhbmwuc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJhbmwuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNGYwYzRjNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFubC5zbwpAQCAtMCwwICsxIEBACitsaWJhbmwuc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFubC5zby4xIGIvc3lzcm9vdC91c3IvbGliMzIvbGliYW5sLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNGM0ZDY2NgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmFubC5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYmFubC0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliYXNvdW5kLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGliYXNvdW5kLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjQyZGZjOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJhc291bmQuc28KQEAgLTAsMCArMSBAQAorbGliYXNvdW5kLnNvLjIuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliYXNvdW5kLnNvLjIgYi9zeXNyb290L3Vzci9saWIzMi9saWJhc291bmQuc28uMgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40MmRmYzk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGliYXNvdW5kLnNvLjIKQEAgLTAsMCArMSBAQAorbGliYXNvdW5kLnNvLjIuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliYXNvdW5kLnNvLjIuMC4wIGIvc3lzcm9vdC91c3IvbGliMzIvbGliYXNvdW5kLnNvLjIuMC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNWExNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJhc291bmQuc28uMi4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliYXR0ci5hIGIvc3lzcm9vdC91c3IvbGliMzIvbGliYXR0ci5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YmEyMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJhdHRyLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliYXR0ci5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmF0dHIuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZWIzMmQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmF0dHIuc28KQEAgLTAsMCArMSBAQAorbGliYXR0ci5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmF0dHIuc28uMSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmF0dHIuc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zYmYwNzg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGliYXR0ci5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYmF0dHIuc28uMS4xLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJhdHRyLnNvLjEuMS4wIGIvc3lzcm9vdC91c3IvbGliMzIvbGliYXR0ci5zby4xLjEuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjVlNjY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGliYXR0ci5zby4xLjEuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJhdWRpb2ZpbGUuc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJhdWRpb2ZpbGUuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNmY4Mzk3YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmF1ZGlvZmlsZS5zbwpAQCAtMCwwICsxIEBACitsaWJhdWRpb2ZpbGUuc28uMS4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJic2QtY29tcGF0LmEgYi9zeXNyb290L3Vzci9saWIzMi9saWJic2QtY29tcGF0LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYxNWQ2NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmJzZC1jb21wYXQuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJjLTIuMTUuc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJjLTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGMxMTEyMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmMtMi4xNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJjLmEgYi9zeXNyb290L3Vzci9saWIzMi9saWJjLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmNzNkNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmMuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJjLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGliYy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjMwODJjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGliYy5zbwpAQCAtMCwwICsxLDUgQEAKKy8qIEdOVSBsZCBzY3JpcHQKKyAgIFVzZSB0aGUgc2hhcmVkIGxpYnJhcnksIGJ1dCBzb21lIGZ1bmN0aW9ucyBhcmUgb25seSBpbgorICAgdGhlIHN0YXRpYyBsaWJyYXJ5LCBzbyB0cnkgdGhhdCBzZWNvbmRhcmlseS4gICovCitPVVRQVVRfRk9STUFUKGVsZjMyLWkzODYpCitHUk9VUCAoIGxpYmMuc28uNiBsaWJjX25vbnNoYXJlZC5hICBBU19ORUVERUQgKCBsZC1saW51eC5zby4yICkgKQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliYy5zby42IGIvc3lzcm9vdC91c3IvbGliMzIvbGliYy5zby42Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmE4ZjQyY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJjLnNvLjYKQEAgLTAsMCArMSBAQAorbGliYy0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliY19ub25zaGFyZWQuYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNfbm9uc2hhcmVkLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRmY2VmNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNfbm9uc2hhcmVkLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliY2FwLmEgYi9zeXNyb290L3Vzci9saWIzMi9saWJjYXAuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzk1ODFhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGliY2FwLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliY2FwLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGliY2FwLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjNkZjFmNjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJjYXAuc28KQEAgLTAsMCArMSBAQAorbGliY2FwLnNvLjIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJjYXAuc28uMiBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNhcC5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmI2ZDVmZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJjYXAuc28uMgpAQCAtMCwwICsxIEBACitsaWJjYXAuc28uMi4yMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNhcC5zby4yLjIyIGIvc3lzcm9vdC91c3IvbGliMzIvbGliY2FwLnNvLjIuMjIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYwMDg3ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNhcC5zby4yLjIyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNpZG4tMi4xNS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNpZG4tMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDVjMjk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGliY2lkbi0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNpZG4uc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJjaWRuLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjMwYTAxYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJjaWRuLnNvCkBAIC0wLDAgKzEgQEAKK2xpYmNpZG4uc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNpZG4uc28uMSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNpZG4uc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5mOWY3ZmM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGliY2lkbi5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYmNpZG4tMi4xNS5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNyeXB0LTIuMTUuc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJjcnlwdC0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZGMxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJjcnlwdC0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNyeXB0LmEgYi9zeXNyb290L3Vzci9saWIzMi9saWJjcnlwdC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZTgxNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJjcnlwdC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNyeXB0LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGliY3J5cHQuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uM2IxMWZmZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmNyeXB0LnNvCkBAIC0wLDAgKzEgQEAKK2xpYmNyeXB0LnNvLjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJjcnlwdC5zby4xIGIvc3lzcm9vdC91c3IvbGliMzIvbGliY3J5cHQuc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iNGI5YzM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGliY3J5cHQuc28uMQpAQCAtMCwwICsxIEBACitsaWJjcnlwdC0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliY3Vyc2VzLmEgYi9zeXNyb290L3Vzci9saWIzMi9saWJjdXJzZXMuYQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41NzQ1NjExCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGliY3Vyc2VzLmEKQEAgLTAsMCArMSBAQAorbGlibmN1cnNlcy5hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliY3Vyc2VzLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGliY3Vyc2VzLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjY3ZjhlNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJjdXJzZXMuc28KQEAgLTAsMCArMSBAQAorbGlibmN1cnNlcy5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmRsLTIuMTUuc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJkbC0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMjM1NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJkbC0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmRsLmEgYi9zeXNyb290L3Vzci9saWIzMi9saWJkbC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhY2U2YjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJkbC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmRsLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGliZGwuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNjkxZjE5OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmRsLnNvCkBAIC0wLDAgKzEgQEAKK2xpYmRsLnNvLjIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJkbC5zby4yIGIvc3lzcm9vdC91c3IvbGliMzIvbGliZGwuc28uMgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5lYTUxYTdlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGliZGwuc28uMgpAQCAtMCwwICsxIEBACitsaWJkbC0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliZHJtLnNvLjIgYi9zeXNyb290L3Vzci9saWIzMi9saWJkcm0uc28uMgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42ZGYyM2U2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGliZHJtLnNvLjIKQEAgLTAsMCArMSBAQAorbGliZHJtLnNvLjIuNC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliZHJtLnNvLjIuNC4wIGIvc3lzcm9vdC91c3IvbGliMzIvbGliZHJtLnNvLjIuNC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4M2E1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJkcm0uc28uMi40LjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliZXNkLmEgYi9zeXNyb290L3Vzci9saWIzMi9saWJlc2QuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzgyMjY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGliZXNkLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliZXNkLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGliZXNkLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmZkNTQxNDAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJlc2Quc28KQEAgLTAsMCArMSBAQAorbGliZXNkLnNvLjAuMi4zOQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmZvcm0uYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmZvcm0uYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjgwZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGliZm9ybS5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmZvcm0uc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJmb3JtLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjEwZTkxNjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJmb3JtLnNvCkBAIC0wLDAgKzEgQEAKK2xpYmZvcm0uc28uNQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmZvcm0uc28uNSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYmZvcm0uc28uNQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5mYWQyZTc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGliZm9ybS5zby41CkBAIC0wLDAgKzEgQEAKK2xpYmZvcm0uc28uNS45ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliZm9ybS5zby41LjkgYi9zeXNyb290L3Vzci9saWIzMi9saWJmb3JtLnNvLjUuOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjg1NjY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGliZm9ybS5zby41LjkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliZy5hIGIvc3lzcm9vdC91c3IvbGliMzIvbGliZy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZDJkZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJnLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliaWVlZS5hIGIvc3lzcm9vdC91c3IvbGliMzIvbGliaWVlZS5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNWM5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJpZWVlLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlibS0yLjE1LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibS0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OTc0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJtLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlibS5hIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibS5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MmNiNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJtLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlibS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm0uc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYzYwNzk3ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm0uc28KQEAgLTAsMCArMSBAQAorbGlibS5zby42ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlibS5zby42IGIvc3lzcm9vdC91c3IvbGliMzIvbGlibS5zby42Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjc2N2JkM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJtLnNvLjYKQEAgLTAsMCArMSBAQAorbGlibS0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlibWNoZWNrLmEgYi9zeXNyb290L3Vzci9saWIzMi9saWJtY2hlY2suYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjEwZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibWNoZWNrLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlibWVtdXNhZ2Uuc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJtZW11c2FnZS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTZjODIxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibWVtdXNhZ2Uuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlibWVudS5hIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibWVudS5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMGZiOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJtZW51LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlibWVudS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm1lbnUuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjEyYjVjZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm1lbnUuc28KQEAgLTAsMCArMSBAQAorbGlibWVudS5zby41ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlibWVudS5zby41IGIvc3lzcm9vdC91c3IvbGliMzIvbGlibWVudS5zby41Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjQxYTE5OTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJtZW51LnNvLjUKQEAgLTAsMCArMSBAQAorbGlibWVudS5zby41LjkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJtZW51LnNvLjUuOSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm1lbnUuc28uNS45Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYWFjNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJtZW51LnNvLjUuOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJuY3Vyc2VzKysuYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5jdXJzZXMrKy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZThjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJuY3Vyc2VzKysuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJuY3Vyc2VzLmEgYi9zeXNyb290L3Vzci9saWIzMi9saWJuY3Vyc2VzLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVjYzBmOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5jdXJzZXMuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJuY3Vyc2VzLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibmN1cnNlcy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDA5NTNhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibmN1cnNlcy5zbwpAQCAtMCwwICsxIEBACitJTlBVVChsaWJuY3Vyc2VzLnNvLjUgLWx0aW5mbykKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5jdXJzZXMuc28uNSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5jdXJzZXMuc28uNQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi43MmNhYWYyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibmN1cnNlcy5zby41CkBAIC0wLDAgKzEgQEAKK2xpYm5jdXJzZXMuc28uNS45ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlibmN1cnNlcy5zby41LjkgYi9zeXNyb290L3Vzci9saWIzMi9saWJuY3Vyc2VzLnNvLjUuOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2M5M2JkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibmN1cnNlcy5zby41LjkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlibnNsLTIuMTUuc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJuc2wtMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzczOWE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibnNsLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlibnNsLmEgYi9zeXNyb290L3Vzci9saWIzMi9saWJuc2wuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTg1OTIxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibnNsLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlibnNsLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibnNsLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjI4ZDE2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJuc2wuc28KQEAgLTAsMCArMSBAQAorbGlibnNsLnNvLjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJuc2wuc28uMSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zbC5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjc5ODk2ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJuc2wuc28uMQpAQCAtMCwwICsxIEBACitsaWJuc2wtMi4xNS5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19jb21wYXQtMi4xNS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19jb21wYXQtMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWFhOTAzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2NvbXBhdC0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19jb21wYXQuc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfY29tcGF0LnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmIwZmExN2YKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfY29tcGF0LnNvCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19jb21wYXQuc28uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19jb21wYXQuc28uMiBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19jb21wYXQuc28uMgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hYTU4OTdkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2NvbXBhdC5zby4yCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19jb21wYXQtMi4xNS5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19kYi5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19kYi5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hMzg5OWFhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2RiLnNvCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19kYi5zby4yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2Rucy0yLjE1LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2Rucy0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMjNkNjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfZG5zLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2Rucy5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19kbnMuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uN2Q3YTE2OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19kbnMuc28KQEAgLTAsMCArMSBAQAorbGlibnNzX2Rucy5zby4yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2Rucy5zby4yIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2Rucy5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmI5NzM4YTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfZG5zLnNvLjIKQEAgLTAsMCArMSBAQAorbGlibnNzX2Rucy0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2ZpbGVzLTIuMTUuc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfZmlsZXMtMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzc2MDgyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2ZpbGVzLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2ZpbGVzLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2ZpbGVzLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjJiOWUzOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfZmlsZXMuc28KQEAgLTAsMCArMSBAQAorbGlibnNzX2ZpbGVzLnNvLjIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfZmlsZXMuc28uMiBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19maWxlcy5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmU3OTZhYTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfZmlsZXMuc28uMgpAQCAtMCwwICsxIEBACitsaWJuc3NfZmlsZXMtMi4xNS5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19oZXNpb2QtMi4xNS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19oZXNpb2QtMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Nzc1YTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2hlc2lvZC0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19oZXNpb2Quc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfaGVzaW9kLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmZkN2YxNzQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfaGVzaW9kLnNvCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19oZXNpb2Quc28uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19oZXNpb2Quc28uMiBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19oZXNpb2Quc28uMgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iNjFhNzM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX2hlc2lvZC5zby4yCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19oZXNpb2QtMi4xNS5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19uaXMtMi4xNS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19uaXMtMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGQ1OTlmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX25pcy0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19uaXMuc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfbmlzLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmE0MDM2NTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfbmlzLnNvCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19uaXMuc28uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19uaXMuc28uMiBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19uaXMuc28uMgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi45Zjg5NmE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX25pcy5zby4yCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19uaXMtMi4xNS5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19uaXNwbHVzLTIuMTUuc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfbmlzcGx1cy0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMzJlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfbmlzcGx1cy0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19uaXNwbHVzLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX25pc3BsdXMuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYmE2MThmMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYm5zc19uaXNwbHVzLnNvCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19uaXNwbHVzLnNvLjIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJuc3NfbmlzcGx1cy5zby4yIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX25pc3BsdXMuc28uMgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi43ZTQ1MDZkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlibnNzX25pc3BsdXMuc28uMgpAQCAtMCwwICsxIEBACitsaWJuc3NfbmlzcGx1cy0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlicGFuZWwuYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnBhbmVsLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhMmM1OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnBhbmVsLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlicGFuZWwuc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJwYW5lbC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iNWNkNGE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlicGFuZWwuc28KQEAgLTAsMCArMSBAQAorbGlicGFuZWwuc28uNQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnBhbmVsLnNvLjUgYi9zeXNyb290L3Vzci9saWIzMi9saWJwYW5lbC5zby41Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjU2OTQ3OTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJwYW5lbC5zby41CkBAIC0wLDAgKzEgQEAKK2xpYnBhbmVsLnNvLjUuOQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnBhbmVsLnNvLjUuOSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnBhbmVsLnNvLjUuOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2EwZDc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlicGFuZWwuc28uNS45CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnBjcHJvZmlsZS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnBjcHJvZmlsZS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjllZGYyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlicGNwcm9maWxlLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB0aHJlYWQtMi4xNS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB0aHJlYWQtMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNGJmYzIyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlicHRocmVhZC0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB0aHJlYWQuYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB0aHJlYWQuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTg0NDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlicHRocmVhZC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB0aHJlYWQuc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJwdGhyZWFkLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDdjOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJwdGhyZWFkLnNvCkBAIC0wLDAgKzEsNSBAQAorLyogR05VIGxkIHNjcmlwdAorICAgVXNlIHRoZSBzaGFyZWQgbGlicmFyeSwgYnV0IHNvbWUgZnVuY3Rpb25zIGFyZSBvbmx5IGluCisgICB0aGUgc3RhdGljIGxpYnJhcnksIHNvIHRyeSB0aGF0IHNlY29uZGFyaWx5LiAgKi8KK09VVFBVVF9GT1JNQVQoZWxmMzItaTM4NikKK0dST1VQICggbGlicHRocmVhZC5zby4wIGxpYnB0aHJlYWRfbm9uc2hhcmVkLmEgKQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlicHRocmVhZC5zby4wIGIvc3lzcm9vdC91c3IvbGliMzIvbGlicHRocmVhZC5zby4wCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjIxNTk3YjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJwdGhyZWFkLnNvLjAKQEAgLTAsMCArMSBAQAorbGlicHRocmVhZC0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlicHRocmVhZF9ub25zaGFyZWQuYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB0aHJlYWRfbm9uc2hhcmVkLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EwODMyYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB0aHJlYWRfbm9uc2hhcmVkLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2UtbWFpbmxvb3AtZ2xpYi5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB1bHNlLW1haW5sb29wLWdsaWIuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZjQ2NmI0ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB1bHNlLW1haW5sb29wLWdsaWIuc28KQEAgLTAsMCArMSBAQAorbGlicHVsc2UtbWFpbmxvb3AtZ2xpYi5zby4wLjAuNApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB1bHNlLXNpbXBsZS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB1bHNlLXNpbXBsZS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yZjY1ZDVjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2Utc2ltcGxlLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnB1bHNlLXNpbXBsZS5zby4wLjAuMwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB1bHNlLXNpbXBsZS5zby4wIGIvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2Utc2ltcGxlLnNvLjAKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMmY2NWQ1YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB1bHNlLXNpbXBsZS5zby4wCkBAIC0wLDAgKzEgQEAKK2xpYnB1bHNlLXNpbXBsZS5zby4wLjAuMwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB1bHNlLXNpbXBsZS5zby4wLjAuMyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB1bHNlLXNpbXBsZS5zby4wLjAuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDJkYzE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2Utc2ltcGxlLnNvLjAuMC4zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB1bHNlLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2Uuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uOGVkZTZhNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB1bHNlLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnB1bHNlLnNvLjAuMTMuNQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB1bHNlLnNvLjAgYi9zeXNyb290L3Vzci9saWIzMi9saWJwdWxzZS5zby4wCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjhlZGU2YTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJwdWxzZS5zby4wCkBAIC0wLDAgKzEgQEAKK2xpYnB1bHNlLnNvLjAuMTMuNQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB1bHNlLnNvLjAuMTMuNSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB1bHNlLnNvLjAuMTMuNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzQwYWFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2Uuc28uMC4xMy41CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB1bHNlY29tbW9uLTEuMS5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnB1bHNlY29tbW9uLTEuMS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWM1YTRhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlicHVsc2Vjb21tb24tMS4xLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnJlc29sdi0yLjE1LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGlicmVzb2x2LTIuMTUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmMmZiOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnJlc29sdi0yLjE1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnJlc29sdi5hIGIvc3lzcm9vdC91c3IvbGliMzIvbGlicmVzb2x2LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiMTZiOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnJlc29sdi5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnJlc29sdi5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnJlc29sdi5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iZjZjMTdmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlicmVzb2x2LnNvCkBAIC0wLDAgKzEgQEAKK2xpYnJlc29sdi5zby4yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlicmVzb2x2LnNvLjIgYi9zeXNyb290L3Vzci9saWIzMi9saWJyZXNvbHYuc28uMgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yODNhOTIzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlicmVzb2x2LnNvLjIKQEAgLTAsMCArMSBAQAorbGlicmVzb2x2LTIuMTUuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJycGNzdmMuYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnJwY3N2Yy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZmIwOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJycGNzdmMuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJydC0yLjE1LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGlicnQtMi4xNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDNkODhhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlicnQtMi4xNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJydC5hIGIvc3lzcm9vdC91c3IvbGliMzIvbGlicnQuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTQ0ZTIzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlicnQuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJydC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnJ0LnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjA4MjBkZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJydC5zbwpAQCAtMCwwICsxIEBACitsaWJydC5zby4xClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlicnQuc28uMSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnJ0LnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjY3OGUwMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnJ0LnNvLjEKQEAgLTAsMCArMSBAQAorbGlicnQtMi4xNS5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRlcm1jYXAuYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRlcm1jYXAuYQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yNjExNzM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlidGVybWNhcC5hCkBAIC0wLDAgKzEgQEAKK2xpYnRpbmZvLmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJ0ZXJtY2FwLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGlidGVybWNhcC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjM1NTgzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlidGVybWNhcC5zbwpAQCAtMCwwICsxLDMgQEAKKy8qIFdlIHVzZSBhIGxpbmtlciBzY3JpcHQgcmF0aGVyIHRoYW4gYSBzeW1saW5rIHRvIHdvcmsgYXJvdW5kCisgICBhbiBsZGNvbmZpZyBidWcsIHNlZSBodHRwOi8vYnVncy5kZWJpYW4ub3JnLzI0OTEyMi4gKi8KK0dST1VQKCBsaWJ0aW5mby5zbyApCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJ0aHJlYWRfZGItMS4wLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGlidGhyZWFkX2RiLTEuMC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzlhMTVlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlidGhyZWFkX2RiLTEuMC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJ0aHJlYWRfZGIuc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJ0aHJlYWRfZGIuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMzkxOTQ1NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRocmVhZF9kYi5zbwpAQCAtMCwwICsxIEBACitsaWJ0aHJlYWRfZGIuc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRocmVhZF9kYi5zby4xIGIvc3lzcm9vdC91c3IvbGliMzIvbGlidGhyZWFkX2RiLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYmM1MjUxNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRocmVhZF9kYi5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYnRocmVhZF9kYi0xLjAuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJ0aWMuYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRpYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YTMwZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJ0aWMuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJ0aWMuc28gYi9zeXNyb290L3Vzci9saWIzMi9saWJ0aWMuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjI4YzU1YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRpYy5zbwpAQCAtMCwwICsxIEBACitsaWJ0aWMuc28uNQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRpYy5zby41IGIvc3lzcm9vdC91c3IvbGliMzIvbGlidGljLnNvLjUKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNThmNDVhZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRpYy5zby41CkBAIC0wLDAgKzEgQEAKK2xpYnRpYy5zby41LjkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJ0aWMuc28uNS45IGIvc3lzcm9vdC91c3IvbGliMzIvbGlidGljLnNvLjUuOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDlhMWZjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlidGljLnNvLjUuOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJ0aW5mby5hIGIvc3lzcm9vdC91c3IvbGliMzIvbGlidGluZm8uYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmQ2NzdjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlidGluZm8uYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9saWJ0aW5mby5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRpbmZvLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjRmYWI4OTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJ0aW5mby5zbwpAQCAtMCwwICsxIEBACitsaWJ0aW5mby5zby41ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlidGluZm8uc28uNSBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRpbmZvLnNvLjUKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uY2Y5YmQxNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnRpbmZvLnNvLjUKQEAgLTAsMCArMSBAQAorbGlidGluZm8uc28uNS45ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlidGluZm8uc28uNS45IGIvc3lzcm9vdC91c3IvbGliMzIvbGlidGluZm8uc28uNS45Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMThkNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJ0aW5mby5zby41LjkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlidXRpbC0yLjE1LnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGlidXRpbC0yLjE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZjNkZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJ1dGlsLTIuMTUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlidXRpbC5hIGIvc3lzcm9vdC91c3IvbGliMzIvbGlidXRpbC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZTVmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJ1dGlsLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlidXRpbC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnV0aWwuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjNhZjY0NgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnV0aWwuc28KQEAgLTAsMCArMSBAQAorbGlidXRpbC5zby4xClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlidXRpbC5zby4xIGIvc3lzcm9vdC91c3IvbGliMzIvbGlidXRpbC5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjVmZmEzZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJ1dGlsLnNvLjEKQEAgLTAsMCArMSBAQAorbGlidXRpbC0yLjE1LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlieGNiLmEgYi9zeXNyb290L3Vzci9saWIzMi9saWJ4Y2IuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjQ0MDAxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlieGNiLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlieGNiLnNvIGIvc3lzcm9vdC91c3IvbGliMzIvbGlieGNiLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmU4NThkNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJ4Y2Iuc28KQEAgLTAsMCArMSBAQAorbGlieGNiLnNvLjEuMS4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlieGNiLnNvLjEgYi9zeXNyb290L3Vzci9saWIzMi9saWJ4Y2Iuc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5lODU4ZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbGlieGNiLnNvLjEKQEAgLTAsMCArMSBAQAorbGlieGNiLnNvLjEuMS4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGlieGNiLnNvLjEuMS4wIGIvc3lzcm9vdC91c3IvbGliMzIvbGlieGNiLnNvLjEuMS4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZTgwYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJ4Y2Iuc28uMS4xLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliei5hIGIvc3lzcm9vdC91c3IvbGliMzIvbGliei5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOGZiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJ6LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliei5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnouc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNjkzYTVkZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL2xpYnouc28KQEAgLTAsMCArMSBAQAorbGliei5zby4xLjIuMy40ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliei5zby4xIGIvc3lzcm9vdC91c3IvbGliMzIvbGliei5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjY5M2E1ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJ6LnNvLjEKQEAgLTAsMCArMSBAQAorbGliei5zby4xLjIuMy40ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbGliei5zby4xLjIuMy40IGIvc3lzcm9vdC91c3IvbGliMzIvbGliei5zby4xLjIuMy40Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZmE2ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9saWJ6LnNvLjEuMi4zLjQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbWVzYS9sZC5zby5jb25mIGIvc3lzcm9vdC91c3IvbGliMzIvbWVzYS9sZC5zby5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZmUzNTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9tZXNhL2xkLnNvLmNvbmYKQEAgLTAsMCArMSBAQAorL3Vzci9saWIvaTM4Ni1saW51eC1nbnUvbWVzYQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvbWVzYS9saWJHTC5zbyBiL3N5c3Jvb3QvdXNyL2xpYjMyL21lc2EvbGliR0wuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uM2NkZDljMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL21lc2EvbGliR0wuc28KQEAgLTAsMCArMSBAQAorbGliR0wuc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL21lc2EvbGliR0wuc28uMSBiL3N5c3Jvb3QvdXNyL2xpYjMyL21lc2EvbGliR0wuc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5jMGFiOGMzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvbWVzYS9saWJHTC5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYkdMLnNvLjEuMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL21lc2EvbGliR0wuc28uMS4yIGIvc3lzcm9vdC91c3IvbGliMzIvbWVzYS9saWJHTC5zby4xLjIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyZTViMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL21lc2EvbGliR0wuc28uMS4yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9hbHNhLnBjIGIvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL2Fsc2EucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY5OWU3ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9hbHNhLnBjCkBAIC0wLDAgKzEsMTQgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0vdXNyCitsaWJkaXI9JHtwcmVmaXh9L2xpYi9pMzg2LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorCitOYW1lOiBhbHNhCitEZXNjcmlwdGlvbjogQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlIChBTFNBKSAtIExpYnJhcnkKK1ZlcnNpb246IDEuMC4yNQorUmVxdWlyZXM6IAorTGliczogLUwke2xpYmRpcn0gLWxhc291bmQKK0xpYnMucHJpdmF0ZTogLWxtIC1sZGwgLWxwdGhyZWFkIC1scnQKKyMgLUkke2luY2x1ZGVkaXJ9L2Fsc2EgYmVsb3cgaXMganVzdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorIyAoaXQgd2FzIHNldCBzbyBtaXN0YWtlbHkgaW4gdGhlIG9sZGVyIHZlcnNpb24pCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfSAtSSR7aW5jbHVkZWRpcn0vYWxzYQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL2F1ZGlvZmlsZS5wYyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9hdWRpb2ZpbGUucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU1ZmVmMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9hdWRpb2ZpbGUucGMKQEAgLTAsMCArMSwxMiBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7cHJlZml4fS9saWIvaTM4Ni1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKKworTmFtZTogYXVkaW9maWxlCitEZXNjcmlwdGlvbjogYXVkaW9maWxlCitSZXF1aXJlczoKK1ZlcnNpb246IDAuMy4zCitMaWJzOiAtTCR7bGliZGlyfSAtbGF1ZGlvZmlsZQorTGlicy5wcml2YXRlOiAtbG0KK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvZHJpLnBjIGIvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL2RyaS5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmUzZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL2RyaS5wYwpAQCAtMCwwICsxLDExIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9L3Vzci9saWIvaTM4Ni1saW51eC1nbnUKK2luY2x1ZGVkaXI9L3Vzci9pbmNsdWRlCitkcmlkcml2ZXJkaXI9L3Vzci9saWIvaTM4Ni1saW51eC1nbnUvZHJpCisKK05hbWU6IGRyaQorRGVzY3JpcHRpb246IERpcmVjdCBSZW5kZXJpbmcgSW5mcmFzdHJ1Y3R1cmUKK1ZlcnNpb246IDguMC4wCitSZXF1aXJlcy5wcml2YXRlOiBsaWJkcm0gPj0gMi40LjI0CitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL2Vzb3VuZC5wYyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9lc291bmQucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBmMjM5OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9lc291bmQucGMKQEAgLTAsMCArMSwxMiBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7cHJlZml4fS9saWIvaTM4Ni1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKK2VzZF9zZXJ2ZXJkaXI9JHtwcmVmaXh9L2JpbgorCitOYW1lOiBlc291bmQKK0Rlc2NyaXB0aW9uOiBlc291bmQKK1JlcXVpcmVzLnByaXZhdGU6IGF1ZGlvZmlsZQorVmVyc2lvbjogMC4yLjQxCitMaWJzOiAtTCR7bGliZGlyfSAtbGVzZCAKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvZm9ybS5wYyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9mb3JtLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NjM1MGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvZm9ybS5wYwpAQCAtMCwwICsxLDEzIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9L3Vzci9saWIvaTM4Ni1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKK21ham9yX3ZlcnNpb249NQordmVyc2lvbj01LjkuMjAxMTA0MDQKKworTmFtZTogZm9ybQorRGVzY3JpcHRpb246IG5jdXJzZXMgNS45IGFkZC1vbiBsaWJyYXJ5CitWZXJzaW9uOiAke3ZlcnNpb259CitSZXF1aXJlczogbmN1cnNlcyB0aW5mbworTGliczogLUwke2xpYmRpcn0gLWxmb3JtCitDZmxhZ3M6IApkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL2dsLnBjIGIvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL2dsLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkM2U2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvZ2wucGMKQEAgLTAsMCArMSwxMyBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPS91c3IvbGliL2kzODYtbGludXgtZ251CitpbmNsdWRlZGlyPS91c3IvaW5jbHVkZQorCitOYW1lOiBnbAorRGVzY3JpcHRpb246IE1lc2EgT3BlbkdMIGxpYnJhcnkKK1JlcXVpcmVzLnByaXZhdGU6IHgxMSB4ZXh0CitWZXJzaW9uOiA4LjAuMAorTGliczogLUwke2xpYmRpcn0gLWxHTAorTGlicy5wcml2YXRlOiAtbG0gLWxwdGhyZWFkCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfSAKK2dseF90bHM6IG5vCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvbGlicHVsc2UtbWFpbmxvb3AtZ2xpYi5wYyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9saWJwdWxzZS1tYWlubG9vcC1nbGliLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYWJhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvbGlicHVsc2UtbWFpbmxvb3AtZ2xpYi5wYwpAQCAtMCwwICsxLDEyIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtwcmVmaXh9L2xpYi9pMzg2LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorCitOYW1lOiBsaWJwdWxzZS1tYWlubG9vcC1nbGliCitEZXNjcmlwdGlvbjogUHVsc2VBdWRpbyBHTGliIDIuMCBNYWluIExvb3AgV3JhcHBlcgorVmVyc2lvbjogMS4xCitMaWJzOiAtTCR7bGliZGlyfSAtbHB1bHNlLW1haW5sb29wLWdsaWIgCitMaWJzLnByaXZhdGU6IC1scHVsc2Vjb21tb24tMS4xCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfSAtRF9SRUVOVFJBTlQKK1JlcXVpcmVzOiBsaWJwdWxzZSBnbGliLTIuMApkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL2xpYnB1bHNlLXNpbXBsZS5wYyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9saWJwdWxzZS1zaW1wbGUucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5NDBiYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9saWJwdWxzZS1zaW1wbGUucGMKQEAgLTAsMCArMSwxMiBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7cHJlZml4fS9saWIvaTM4Ni1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKKworTmFtZTogbGlicHVsc2Utc2ltcGxlCitEZXNjcmlwdGlvbjogUHVsc2VBdWRpbyBTaW1wbGlmaWVkIFN5bmNocm9ub3VzIENsaWVudCBJbnRlcmZhY2UKK1ZlcnNpb246IDEuMQorTGliczogLUwke2xpYmRpcn0gLWxwdWxzZS1zaW1wbGUgCitMaWJzLnByaXZhdGU6IC1scHVsc2Vjb21tb24tMS4xCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfSAtRF9SRUVOVFJBTlQKK1JlcXVpcmVzOiBsaWJwdWxzZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL2xpYnB1bHNlLnBjIGIvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL2xpYnB1bHNlLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMTczMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvbGlicHVsc2UucGMKQEAgLTAsMCArMSwxMiBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7cHJlZml4fS9saWIvaTM4Ni1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKK21vZGxpYmV4ZWNkaXI9JHtwcmVmaXh9L2xpYi9wdWxzZS0xLjEvbW9kdWxlcworCitOYW1lOiBsaWJwdWxzZQorRGVzY3JpcHRpb246IFB1bHNlQXVkaW8gQ2xpZW50IEludGVyZmFjZQorVmVyc2lvbjogMS4xCitMaWJzOiAtTCR7bGliZGlyfSAtbHB1bHNlIAorTGlicy5wcml2YXRlOiAtbHB1bHNlY29tbW9uLTEuMQorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0gLURfUkVFTlRSQU5UCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvbWVudS5wYyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9tZW51LnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZWI2ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvbWVudS5wYwpAQCAtMCwwICsxLDEzIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9L3Vzci9saWIvaTM4Ni1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKK21ham9yX3ZlcnNpb249NQordmVyc2lvbj01LjkuMjAxMTA0MDQKKworTmFtZTogbWVudQorRGVzY3JpcHRpb246IG5jdXJzZXMgNS45IGFkZC1vbiBsaWJyYXJ5CitWZXJzaW9uOiAke3ZlcnNpb259CitSZXF1aXJlczogbmN1cnNlcyB0aW5mbworTGliczogLUwke2xpYmRpcn0gLWxtZW51CitDZmxhZ3M6IApkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL25jdXJzZXMrKy5wYyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9uY3Vyc2VzKysucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RkMWRlNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9uY3Vyc2VzKysucGMKQEAgLTAsMCArMSwxMyBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPS91c3IvbGliL2kzODYtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCittYWpvcl92ZXJzaW9uPTUKK3ZlcnNpb249NS45LjIwMTEwNDA0CisKK05hbWU6IG5jdXJzZXMrKworRGVzY3JpcHRpb246IG5jdXJzZXMgNS45IGFkZC1vbiBsaWJyYXJ5CitWZXJzaW9uOiAke3ZlcnNpb259CitSZXF1aXJlczogcGFuZWwgbWVudSBmb3JtIG5jdXJzZXMgdGluZm8KK0xpYnM6IC1MJHtsaWJkaXJ9IC1sbmN1cnNlcysrCitDZmxhZ3M6IApkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL25jdXJzZXMucGMgYi9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvbmN1cnNlcy5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTkyYjY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL25jdXJzZXMucGMKQEAgLTAsMCArMSwxMyBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPS91c3IvbGliL2kzODYtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCittYWpvcl92ZXJzaW9uPTUKK3ZlcnNpb249NS45LjIwMTEwNDA0CisKK05hbWU6IG5jdXJzZXMKK0Rlc2NyaXB0aW9uOiBuY3Vyc2VzIDUuOSBsaWJyYXJ5CitWZXJzaW9uOiAke3ZlcnNpb259CitSZXF1aXJlczogdGluZm8KK0xpYnM6IC1MJHtsaWJkaXJ9IC1sbmN1cnNlcworQ2ZsYWdzOiAKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9wYW5lbC5wYyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy9wYW5lbC5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTdkN2QzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL3BhbmVsLnBjCkBAIC0wLDAgKzEsMTMgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0vdXNyL2xpYi9pMzg2LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorbWFqb3JfdmVyc2lvbj01Cit2ZXJzaW9uPTUuOS4yMDExMDQwNAorCitOYW1lOiBwYW5lbAorRGVzY3JpcHRpb246IG5jdXJzZXMgNS45IGFkZC1vbiBsaWJyYXJ5CitWZXJzaW9uOiAke3ZlcnNpb259CitSZXF1aXJlczogbmN1cnNlcyB0aW5mbworTGliczogLUwke2xpYmRpcn0gLWxwYW5lbAorQ2ZsYWdzOiAKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy90aWMucGMgYi9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvdGljLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NjViNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvdGljLnBjCkBAIC0wLDAgKzEsMTMgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0vdXNyL2xpYi9pMzg2LWxpbnV4LWdudQoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorbWFqb3JfdmVyc2lvbj01Cit2ZXJzaW9uPTUuOS4yMDExMDQwNAorCitOYW1lOiB0aWMKK0Rlc2NyaXB0aW9uOiBuY3Vyc2VzIDUuOSBhZGQtb24gbGlicmFyeQorVmVyc2lvbjogJHt2ZXJzaW9ufQorUmVxdWlyZXM6IG5jdXJzZXMgdGluZm8KK0xpYnM6IC1MJHtsaWJkaXJ9IC1sdGljCitDZmxhZ3M6IApkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL3RpbmZvLnBjIGIvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL3RpbmZvLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYjcwM2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvdGluZm8ucGMKQEAgLTAsMCArMSwxMyBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPS91c3IvbGliL2kzODYtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCittYWpvcl92ZXJzaW9uPTUKK3ZlcnNpb249NS45LjIwMTEwNDA0CisKK05hbWU6IHRpbmZvCitEZXNjcmlwdGlvbjogbmN1cnNlcyA1LjkgdGVybWluYWwgaW50ZXJmYWNlIGxpYnJhcnkKK1ZlcnNpb246ICR7dmVyc2lvbn0KK1JlcXVpcmVzOiAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sdGluZm8gIAorQ2ZsYWdzOiAKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy94MTEucGMgYi9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcveDExLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYmE0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcveDExLnBjCkBAIC0wLDAgKzEsMTUgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0ke3ByZWZpeH0vbGliL2kzODYtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCisKK3h0aHJlYWRsaWI9LWxwdGhyZWFkCisKK05hbWU6IFgxMQorRGVzY3JpcHRpb246IFggTGlicmFyeQorVmVyc2lvbjogMS40Ljk5LjEKK1JlcXVpcmVzOiB4cHJvdG8ga2Jwcm90bworUmVxdWlyZXMucHJpdmF0ZTogeGNiID49IDEuMS45MgorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0gCitMaWJzOiAtTCR7bGliZGlyfSAtbFgxMQorTGlicy5wcml2YXRlOiAtbHB0aHJlYWQKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy94Y2IucGMgYi9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcveGNiLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYjVlNzAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcveGNiLnBjCkBAIC0wLDAgKzEsMTMgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0ke3ByZWZpeH0vbGliL2kzODYtbGludXgtZ251CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCit4Y2Jwcm90b192ZXJzaW9uPTEuNworCitOYW1lOiBYQ0IKK0Rlc2NyaXB0aW9uOiBYLXByb3RvY29sIEMgQmluZGluZworVmVyc2lvbjogMS44LjEKK1JlcXVpcmVzLnByaXZhdGU6IHB0aHJlYWQtc3R1YnMgeGF1ID49IDAuOTkuMiB4ZG1jcAorTGliczogLUwke2xpYmRpcn0gLWx4Y2IKK0xpYnMucHJpdmF0ZTogCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL3hleHQucGMgYi9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcveGV4dC5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjViNTgzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL3hleHQucGMKQEAgLTAsMCArMSwxMiBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7cHJlZml4fS9saWIvaTM4Ni1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKKworTmFtZTogWGV4dAorRGVzY3JpcHRpb246IE1pc2MgWCBFeHRlbnNpb24gTGlicmFyeQorVmVyc2lvbjogMS4zLjAKK1JlcXVpcmVzOiB4ZXh0cHJvdG8KK1JlcXVpcmVzLnByaXZhdGU6IHgxMQorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KK0xpYnM6IC1MJHtsaWJkaXJ9IC1sWGV4dApkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL3hmaXhlcy5wYyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy94Zml4ZXMucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU5NDE2MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3BrZ2NvbmZpZy94Zml4ZXMucGMKQEAgLTAsMCArMSwxMiBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7cHJlZml4fS9saWIvaTM4Ni1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKKworTmFtZTogWGZpeGVzCitEZXNjcmlwdGlvbjogWCBGaXhlcyAgTGlicmFyeQorVmVyc2lvbjogNS4wCitSZXF1aXJlczogeHByb3RvIGZpeGVzcHJvdG8gPj0gNS4wCitSZXF1aXJlcy5wcml2YXRlOiB4MTEKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CitMaWJzOiAtTCR7bGliZGlyfSAtbFhmaXhlcwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL3hpLnBjIGIvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL3hpLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzODA4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcveGkucGMKQEAgLTAsMCArMSwxMiBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7cHJlZml4fS9saWIvaTM4Ni1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKKworTmFtZTogWGkKK0Rlc2NyaXB0aW9uOiBYIElucHV0IEV4dGVuc2lvbiBMaWJyYXJ5CitWZXJzaW9uOiAxLjYuMAorUmVxdWlyZXM6IGlucHV0cHJvdG8KK1JlcXVpcmVzLnByaXZhdGU6IHgxMSB4ZXh0CitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQorTGliczogLUwke2xpYmRpcn0gLWxYaQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL3psaWIucGMgYi9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcvemxpYi5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDY2OWRjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL3psaWIucGMKQEAgLTAsMCArMSwxMiBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7cHJlZml4fS9saWIvaTM4Ni1saW51eC1nbnUKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKKworTmFtZTogemxpYgorRGVzY3JpcHRpb246IHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQorVmVyc2lvbjogMS4yLjMuNAorCitSZXF1aXJlczogCitMaWJzOiAtTCR7bGliZGlyfSAtbHoKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIzMi92YWxncmluZC9uY3Vyc2VzLnN1cHAgYi9zeXNyb290L3Vzci9saWIzMi92YWxncmluZC9uY3Vyc2VzLnN1cHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNhNTgyYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3ZhbGdyaW5kL25jdXJzZXMuc3VwcApAQCAtMCwwICsxLDIwNSBAQAorIyAkSWQ6IG5jdXJzZXMuc3VwcCx2IDEuNyAyMDA4LzA5LzIwIDE4OjQzOjQyIHRvbSBFeHAgJAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgICAjCisjIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksICMKKyMgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiAgIworIyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSAgICAjCisjIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvICMKKyMgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSAgIworIyBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gIworIyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgICAgICAjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgIworIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgICAjCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMICAgICMKKyMgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSICAgICAgIworIyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyAgICAjCisjIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgICAgICAgICMKKyMgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAgICMKKyMgaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgIworIyB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgICAgICAgICAjCisjIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBUaGlzIGlzIGEgd2FybmluZy1zdXBwcmVzc2lvbiBmaWxlIGZvciB2YWxncmluZCBhbmQgbmN1cnNlcy4KKyMKKyMgbmN1cnNlcyBjYW4gYWxzbyBiZSBjb25maWd1cmVkIHVzaW5nIHRoZSAtLWRpc2FibGUtbGVha3Mgb3B0aW9uLCB3aGljaAorIyBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gY2FsbCBfbmNfZnJlZWFsbCgpIG9yIF9uY19mcmVlX2FuZF9leGl0KCksIHRvCisjIGZyZWUgYWxsIG9mIG5jdXJzZXMnICJwZXJtYW5lbnQiIG1lbW9yeS4KKyMKKyMgU29tZSBvZiB0aGVzZSBsZWFrcyBjYW4gYmUgZnJlZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgaXRzIG93biBjbGVhbnVwLAorIyBmb3IgZXhhbXBsZToKKyMJZGVsc2NyZWVuKFNQKTsKKyMJZGVsX2N1cnRlcm0oY3VyX3Rlcm0pOworIyBIb3dldmVyLCBmZXcgYXBwbGljYXRpb25zIGRvIHRoaXMuCisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfYWRkX3RvX3RyeQorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOiphbGxvYworICAgZnVuOl9uY19hZGRfdG9fdHJ5Cit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfaG9tZV90ZXJtaW5mbworICAgTWVtY2hlY2s6TGVhaworICAgZnVuOm1hbGxvYworICAgZnVuOl9uY19ob21lX3Rlcm1pbmZvCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfaW5pdF93YWNzCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46Y2FsbG9jCisgICBmdW46X25jX2luaXRfd2FjcworfQorCit7CisgICBuY3Vyc2VzX2xlYWtfX25jX2tleW5hbWUKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjpjYWxsb2MKKyAgIGZ1bjpfbmNfa2V5bmFtZQorfQorCit7CisgICBuY3Vyc2VzX2xlYWtfX25jX2tleW5hbWVfMgorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOm1hbGxvYworICAgZnVuOnN0cmR1cAorICAgZnVuOl9uY19rZXluYW1lCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfcHJpbnRmX3N0cmluZworICAgTWVtY2hlY2s6TGVhaworICAgZnVuOm1hbGxvYworICAgZnVuOl9uY19kb2FsbG9jCisgICBmdW46X25jX3ByaW50Zl9zdHJpbmcKK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19yZWFkX3Rlcm10eXBlCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46KmFsbG9jCisgICBmdW46X25jX3JlYWRfdGVybXR5cGUKKyAgIGZ1bjpfbmNfcmVhZF9maWxlX2VudHJ5Cit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfcmVhZF90ZXJtdHlwZV8yCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46KmFsbG9jCisgICBmdW46X25jX2RvYWxsb2MKKyAgIGZ1bjpfbmNfcmVhZF90ZXJtdHlwZQorICAgZnVuOl9uY19yZWFkX2ZpbGVfZW50cnkKK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19zY3JvbGxfb3B0aW1pemUKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjoqYWxsb2MKKyAgIGZ1bjpfbmNfaGFzaF9tYXAKKyAgIGZ1bjpfbmNfc2Nyb2xsX29wdGltaXplCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfc2Nyb2xsX29wdGltaXplXzIKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjoqYWxsb2MKKyAgIGZ1bjpfbmNfZG9hbGxvYworICAgZnVuOl9uY19zY3JvbGxfb3B0aW1pemUKK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19zZXR1cHNjcmVlbgorICAgTWVtY2hlY2s6TGVhaworICAgZnVuOmNhbGxvYworICAgZnVuOl9uY19zZXR1cHNjcmVlbgorICAgZnVuOm5ld3Rlcm0KK30KKworeworICAgbmN1cnNlc19sZWFrX19uY19zZXR1cHNjcmVlbl8yCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46Y2FsbG9jCisgICBmdW46bmV3d2luCisgICBmdW46X25jX3NldHVwc2NyZWVuCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfc2V0dXB0ZXJtXzEKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjptYWxsb2MKKyAgIGZ1bjpzdHJkdXAKKyAgIGZ1bjpfbmNfc2V0dXB0ZXJtCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfc2V0dXB0ZXJtCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46Y2FsbG9jCisgICBmdW46X25jX3NldHVwdGVybQorfQorCit7CisgICBuY3Vyc2VzX2xlYWtfX25jX3NldHVwc2NyZWVuXzMKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjpjYWxsb2MKKyAgIGZ1bjpfbmNfbWFrZW5ldworICAgZnVuOm5ld3dpbgorICAgZnVuOl9uY19zZXR1cHNjcmVlbgorfQorCit7CisgICBuY3Vyc2VzX2xlYWtfX25jX3NldF9idWZmZXIKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjptYWxsb2MKKyAgIGZ1bjpfbmNfc2V0X2J1ZmZlcgorfQorCit7CisgICBuY3Vyc2VzX2xlYWtfX25jX3RwYXJtX2FuYWx5emUKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjoqYWxsb2MKKyAgIGZ1bjpfbmNfZG9hbGxvYworICAgZnVuOl9uY190cGFybV9hbmFseXplCit9CisKK3sKKyAgIG5jdXJzZXNfbGVha19fbmNfdHJhY2VfYWxsb2MKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjoqYWxsb2MKKyAgIGZ1bjpfbmNfZG9hbGxvYworICAgZnVuOl9uY190cmFjZV9hbGxvYworfQorCit7CisgICBuY3Vyc2VzX2xlYWtfc3RhcnRfY29sb3IKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjpjYWxsb2MKKyAgIGZ1bjpzdGFydF9jb2xvcgorfQorCit7CisgICBuY3Vyc2VzX2xlYWtfdHBhcm0KKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjpyZWFsbG9jCisgICBmdW46X25jX2RvYWxsb2MKKyAgIGZ1bjp0cGFybQorfQorCit7CisgICBuY3Vyc2VzX2xlYWtfdHBhcmFtX2ludGVybmFsCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46cmVhbGxvYworICAgZnVuOl9uY19kb2FsbG9jCisgICBmdW46Z2V0X3NwYWNlCisgICBmdW46c2F2ZV9udW1iZXIKKyAgIGZ1bjp0cGFyYW1faW50ZXJuYWwKK30KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJCcm9rZW5Mb2NhbGUuYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJCcm9rZW5Mb2NhbGUuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWJmNWEzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYkJyb2tlbkxvY2FsZS5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJCcm9rZW5Mb2NhbGVfcGljLmEgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliQnJva2VuTG9jYWxlX3BpYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3M2JhMzcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliQnJva2VuTG9jYWxlX3BpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJhbmwuYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJhbmwuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTdmYzk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmFubC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJhbmxfcGljLmEgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliYW5sX3BpYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYjgwZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliYW5sX3BpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJic2QtY29tcGF0LmEgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliYnNkLWNvbXBhdC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZDJkZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliYnNkLWNvbXBhdC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJjLmEgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMmJmOTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJjX25vbnNoYXJlZC5hIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmNfbm9uc2hhcmVkLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmZjQ2YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJjX25vbnNoYXJlZC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJjX3BpYy5hIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmNfcGljLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyNmVkYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJjX3BpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJjaWRuX3BpYy5hIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmNpZG5fcGljLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc1ODcxOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJjaWRuX3BpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJjcnlwdC5hIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmNyeXB0LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU4ZmMxZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJjcnlwdC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJjcnlwdF9waWMuYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJjcnlwdF9waWMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTFmYjIxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmNyeXB0X3BpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJkbC5hIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmRsLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2NzNlYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJkbC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJkbF9waWMuYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJkbF9waWMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTMwYzQyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYmRsX3BpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJnLmEgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliZy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ODA5MjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliZy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJpZWVlLmEgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliaWVlZS5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNWM5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGliaWVlZS5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJtLmEgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlibS5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNmJlYjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlibS5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJtX3BpYy5hIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm1fcGljLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmMDFlMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJtX3BpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJtY2hlY2suYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJtY2hlY2suYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjEwZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm1jaGVjay5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc2wuYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc2wuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjc5ZThiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zbC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc2xfcGljLmEgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlibnNsX3BpYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNDg2ODUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlibnNsX3BpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc3NfY29tcGF0X3BpYy5hIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zc19jb21wYXRfcGljLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRmNzA5OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc3NfY29tcGF0X3BpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc3NfZGJfcGljLmEgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlibnNzX2RiX3BpYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNTFjMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlibnNzX2RiX3BpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc3NfZG5zX3BpYy5hIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zc19kbnNfcGljLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFhMGE2MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc3NfZG5zX3BpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc3NfZmlsZXNfcGljLmEgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlibnNzX2ZpbGVzX3BpYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MWJjM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlibnNzX2ZpbGVzX3BpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc3NfaGVzaW9kX3BpYy5hIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zc19oZXNpb2RfcGljLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE0ZWMwZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc3NfaGVzaW9kX3BpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc3NfbmlzX3BpYy5hIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zc19uaXNfcGljLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZkYjgwZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc3NfbmlzX3BpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc3NfbmlzcGx1c19waWMuYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJuc3NfbmlzcGx1c19waWMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzA4NDIzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYm5zc19uaXNwbHVzX3BpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJwdGhyZWFkLmEgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlicHRocmVhZC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MWU2MTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlicHRocmVhZC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJwdGhyZWFkX25vbnNoYXJlZC5hIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnB0aHJlYWRfbm9uc2hhcmVkLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExNjk0MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJwdGhyZWFkX25vbnNoYXJlZC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJyZXNvbHYuYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJyZXNvbHYuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGRkZGNlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnJlc29sdi5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJyZXNvbHZfcGljLmEgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlicmVzb2x2X3BpYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyY2ZmMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlicmVzb2x2X3BpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJycGNzdmMuYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJycGNzdmMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTA2OTZjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnJwY3N2Yy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJydC5hIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnJ0LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE5NjU4ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJydC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJydF9waWMuYSBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJydF9waWMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTc2NjA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnJ0X3BpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJ0aHJlYWRfZGJfcGljLmEgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlidGhyZWFkX2RiX3BpYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YzQwN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlidGhyZWFkX2RiX3BpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJ1dGlsLmEgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlidXRpbC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMjhjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIzMi94ZW4vbGlidXRpbC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJ1dGlsX3BpYy5hIGIvc3lzcm9vdC91c3IvbGliMzIveGVuL2xpYnV0aWxfcGljLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxYzY0NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYjMyL3hlbi9saWJ1dGlsX3BpYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xjaGFpbi1wYXRjaGVzL2djYy8wMDAxLVJlLWVuYWJsZS1nY2M0LjYtbGlic3RkYy12ZXJzaW9uaW5nLWZvci1ob3N0LXRvb2xjaGEucGF0Y2ggYi90b29sY2hhaW4tcGF0Y2hlcy9nY2MvMDAwMS1SZS1lbmFibGUtZ2NjNC42LWxpYnN0ZGMtdmVyc2lvbmluZy1mb3ItaG9zdC10b29sY2hhLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZjViZGMKLS0tIC9kZXYvbnVsbAorKysgYi90b29sY2hhaW4tcGF0Y2hlcy9nY2MvMDAwMS1SZS1lbmFibGUtZ2NjNC42LWxpYnN0ZGMtdmVyc2lvbmluZy1mb3ItaG9zdC10b29sY2hhLnBhdGNoCkBAIC0wLDAgKzEsNDMgQEAKK0Zyb20gYWYxODc2OTcyZjlkYzU1YWYwZTJmOTBmZTU2M2M2NTgyZjYyM2Y2OSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEFuZHJldyBIc2llaCA8YW5kcmV3aHNpZWhAZ29vZ2xlLmNvbT4KK0RhdGU6IFdlZCwgMTIgTWFyIDIwMTQgMTM6MTI6MTggKzA4MDAKK1N1YmplY3Q6IFtQQVRDSF0gUmUtZW5hYmxlIGdjYzQuNiBsaWJzdGRjKysgdmVyc2lvbmluZyBmb3IgaG9zdCB0b29sY2hhaW4KKworVGhpcyBDTCByZXZlcnRzIDRhMDkyNzQyM2Q1MWY1OTRiODcwZTU4YjNlYjUxNTc0MzI3ZjhiMGUKK2ZvciBwcmVidWlsdHMvZ2NjL2xpbnV4LXg4Ni9ob3N0L3g4Nl82NC1saW51eC1nbGliYzIuMTEtNC42CisKK0NoYW5nZS1JZDogSTMxYzA0YzEwNTY5MmZlNGNkYjZmMjYxOTIwYTA1ODgyNTM5YzM3NTAKKy0tLQorIGdjYy00LjYvbGlic3RkYysrLXYzL3NyYy9NYWtlZmlsZS5hbSB8IDIgKy0KKyBnY2MtNC42L2xpYnN0ZGMrKy12My9zcmMvTWFrZWZpbGUuaW4gfCAyICstCisgMiBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9nY2MtNC42L2xpYnN0ZGMrKy12My9zcmMvTWFrZWZpbGUuYW0gYi9nY2MtNC42L2xpYnN0ZGMrKy12My9zcmMvTWFrZWZpbGUuYW0KK2luZGV4IDY4MGExNzIuLjI3NzMxN2IgMTAwNjQ0CistLS0gYS9nY2MtNC42L2xpYnN0ZGMrKy12My9zcmMvTWFrZWZpbGUuYW0KKysrKyBiL2djYy00LjYvbGlic3RkYysrLXYzL3NyYy9NYWtlZmlsZS5hbQorQEAgLTI1MSw3ICsyNTEsNyBAQCBsaWJzdGRjX19fbGFfREVQRU5ERU5DSUVTID0gXAorIAkkKHRvcF9idWlsZGRpcikvbGlic3VwYysrL2xpYnN1cGMrK2NvbnZlbmllbmNlLmxhCisgCisgbGlic3RkY19fX2xhX0xERkxBR1MgPSBcCistCS1hdm9pZC12ZXJzaW9uICR7dmVyc2lvbl9hcmd9IC1sbQorKwktdmVyc2lvbi1pbmZvICQobGlidG9vbF9WRVJTSU9OKSR7dmVyc2lvbl9hcmd9IC1sbQorIAorIGxpYnN0ZGNfX19sYV9MSU5LID0gJChDWFhMSU5LKSAkKGxpYnN0ZGNfX19sYV9MREZMQUdTKQorIAorZGlmZiAtLWdpdCBhL2djYy00LjYvbGlic3RkYysrLXYzL3NyYy9NYWtlZmlsZS5pbiBiL2djYy00LjYvbGlic3RkYysrLXYzL3NyYy9NYWtlZmlsZS5pbgoraW5kZXggZDAzYWNkNS4uMTQ2ZWMzZiAxMDA2NDQKKy0tLSBhL2djYy00LjYvbGlic3RkYysrLXYzL3NyYy9NYWtlZmlsZS5pbgorKysrIGIvZ2NjLTQuNi9saWJzdGRjKystdjMvc3JjL01ha2VmaWxlLmluCitAQCAtNDY2LDcgKzQ2Niw3IEBAIGxpYnN0ZGNfX19sYV9ERVBFTkRFTkNJRVMgPSBcCisgCSQodG9wX2J1aWxkZGlyKS9saWJzdXBjKysvbGlic3VwYysrY29udmVuaWVuY2UubGEKKyAKKyBsaWJzdGRjX19fbGFfTERGTEFHUyA9IFwKKy0JLWF2b2lkLXZlcnNpb24gJHt2ZXJzaW9uX2FyZ30gLWxtCisrCS12ZXJzaW9uLWluZm8gJChsaWJ0b29sX1ZFUlNJT04pICR7dmVyc2lvbl9hcmd9IC1sbQorIAorIGxpYnN0ZGNfX19sYV9MSU5LID0gJChDWFhMSU5LKSAkKGxpYnN0ZGNfX19sYV9MREZMQUdTKQorIAorLS0gCisxLjkuMC4yNzkuZ2RjOWUzZWIKKwpkaWZmIC0tZ2l0IGEvdG9vbGNoYWluLXBhdGNoZXMvZ2NjLzAwMDEtUmUtZW5hYmxlLWdjYzQuOC1saWJzdGRjLXZlcnNpb25pbmctZm9yLWhvc3QtdG9vbGNoYS5wYXRjaCBiL3Rvb2xjaGFpbi1wYXRjaGVzL2djYy8wMDAxLVJlLWVuYWJsZS1nY2M0LjgtbGlic3RkYy12ZXJzaW9uaW5nLWZvci1ob3N0LXRvb2xjaGEucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVjNDQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xjaGFpbi1wYXRjaGVzL2djYy8wMDAxLVJlLWVuYWJsZS1nY2M0LjgtbGlic3RkYy12ZXJzaW9uaW5nLWZvci1ob3N0LXRvb2xjaGEucGF0Y2gKQEAgLTAsMCArMSw0MyBAQAorRnJvbSAyZTc0MmE1YTA2ZmIyOTZjN2FlZmE2MTFiMmIxMGM0MGM0OTJlYjM2IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogQW5kcmV3IEhzaWVoIDxhbmRyZXdoc2llaEBnb29nbGUuY29tPgorRGF0ZTogV2VkLCAxMiBNYXIgMjAxNCAxMzoxNjoxNiArMDgwMAorU3ViamVjdDogW1BBVENIXSBSZS1lbmFibGUgZ2NjNC44IGxpYnN0ZGMrKyB2ZXJzaW9uaW5nIGZvciBob3N0IHRvb2xjaGFpbgorCitUaGlzIENMIHJldmVydHMgZjUwYTgxMTY1ZTMwNWM3MzM5YmVjNzhiZDNjOWNmOGEzNWUxZjIzMworZm9yIHByZWJ1aWx0cy9nY2MvbGludXgteDg2L2hvc3QveDg2XzY0LWxpbnV4LWdsaWJjMi4xMS00LjgKKworQ2hhbmdlLUlkOiBJNzRlMDY1ZWFiMjI5MzllNWRkN2ZkNjBmNjFhYTAwYzZiOTMzZGU4MAorLS0tCisgZ2NjLTQuOC9saWJzdGRjKystdjMvc3JjL01ha2VmaWxlLmFtIHwgMiArLQorIGdjYy00LjgvbGlic3RkYysrLXYzL3NyYy9NYWtlZmlsZS5pbiB8IDIgKy0KKyAyIGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2djYy00LjgvbGlic3RkYysrLXYzL3NyYy9NYWtlZmlsZS5hbSBiL2djYy00LjgvbGlic3RkYysrLXYzL3NyYy9NYWtlZmlsZS5hbQoraW5kZXggMDdjNDE2MC4uMjBkZDkxOCAxMDA2NDQKKy0tLSBhL2djYy00LjgvbGlic3RkYysrLXYzL3NyYy9NYWtlZmlsZS5hbQorKysrIGIvZ2NjLTQuOC9saWJzdGRjKystdjMvc3JjL01ha2VmaWxlLmFtCitAQCAtNjgsNyArNjgsNyBAQCBsaWJzdGRjX19fbGFfREVQRU5ERU5DSUVTID0gXAorIAkkKHRvcF9idWlsZGRpcikvc3JjL2MrKzExL2xpYmMrKzExY29udmVuaWVuY2UubGEKKyAKKyBsaWJzdGRjX19fbGFfTERGTEFHUyA9IFwKKy0JLWF2b2lkLXZlcnNpb24gJHt2ZXJzaW9uX2FyZ30gLWxtCisrCS12ZXJzaW9uLWluZm8gJChsaWJ0b29sX1ZFUlNJT04pJHt2ZXJzaW9uX2FyZ30gLWxtCisgCisgbGlic3RkY19fX2xhX0xJTksgPSAkKENYWExJTkspICQobGlic3RkY19fX2xhX0xERkxBR1MpCisgCitkaWZmIC0tZ2l0IGEvZ2NjLTQuOC9saWJzdGRjKystdjMvc3JjL01ha2VmaWxlLmluIGIvZ2NjLTQuOC9saWJzdGRjKystdjMvc3JjL01ha2VmaWxlLmluCitpbmRleCA5NzIxZWJiLi5hN2IzNDA0IDEwMDY0NAorLS0tIGEvZ2NjLTQuOC9saWJzdGRjKystdjMvc3JjL01ha2VmaWxlLmluCisrKysgYi9nY2MtNC44L2xpYnN0ZGMrKy12My9zcmMvTWFrZWZpbGUuaW4KK0BAIC0zNjgsNyArMzY4LDcgQEAgbGlic3RkY19fX2xhX0RFUEVOREVOQ0lFUyA9IFwKKyAJJCh0b3BfYnVpbGRkaXIpL3NyYy9jKysxMS9saWJjKysxMWNvbnZlbmllbmNlLmxhCisgCisgbGlic3RkY19fX2xhX0xERkxBR1MgPSBcCistCS1hdm9pZC12ZXJzaW9uICR7dmVyc2lvbl9hcmd9IC1sbQorKwktdmVyc2lvbi1pbmZvICQobGlidG9vbF9WRVJTSU9OKSAke3ZlcnNpb25fYXJnfSAtbG0KKyAKKyBsaWJzdGRjX19fbGFfTElOSyA9ICQoQ1hYTElOSykgJChsaWJzdGRjX19fbGFfTERGTEFHUykKKyAKKy0tIAorMS45LjAuMjc5LmdkYzllM2ViCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vYXIgYi94ODZfNjQtbGludXgvYmluL2FyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAwYTQ0YjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvYmluL2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vYXMgYi94ODZfNjQtbGludXgvYmluL2FzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk0OTczZGEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvYmluL2FzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vYysrIGIveDg2XzY0LWxpbnV4L2Jpbi9jKysKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTQyYTc4NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9iaW4vYysrCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vZysrIGIveDg2XzY0LWxpbnV4L2Jpbi9nKysKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTQyYTc4NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9iaW4vZysrCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vZ2NjIGIveDg2XzY0LWxpbnV4L2Jpbi9nY2MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjc0ODRmMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9iaW4vZ2NjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vbGQgYi94ODZfNjQtbGludXgvYmluL2xkCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVlYTVhYTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvYmluL2xkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vbGQuYmZkIGIveDg2XzY0LWxpbnV4L2Jpbi9sZC5iZmQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzk3ZmMwZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9iaW4vbGQuYmZkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vbGQuZ29sZCBiL3g4Nl82NC1saW51eC9iaW4vbGQuZ29sZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZWE1YWE2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2Jpbi9sZC5nb2xkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vbm0gYi94ODZfNjQtbGludXgvYmluL25tCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI4ZWQyMjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvYmluL25tCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vb2JqY29weSBiL3g4Nl82NC1saW51eC9iaW4vb2JqY29weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNDVmZjM0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2Jpbi9vYmpjb3B5CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vb2JqZHVtcCBiL3g4Nl82NC1saW51eC9iaW4vb2JqZHVtcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMjRmZjliCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2Jpbi9vYmpkdW1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vcmFubGliIGIveDg2XzY0LWxpbnV4L2Jpbi9yYW5saWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjJmNzJjZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9iaW4vcmFubGliCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vc3RyaXAgYi94ODZfNjQtbGludXgvYmluL3N0cmlwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYxZjVmNzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvYmluL3N0cmlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYWxnb3JpdGhtIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9hbGdvcml0aG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1ZGRiOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYWxnb3JpdGhtCkBAIC0wLDAgKzEsNjggQEAKKy8vIDxhbGdvcml0aG0+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBpbmNsdWRlL2FsZ29yaXRobQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9BTEdPUklUSE0KKyNkZWZpbmUgX0dMSUJDWFhfQUxHT1JJVEhNIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8dXRpbGl0eT4gLy8gVUstMzAwLgorI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnby5oPgorCisjaWZkZWYgX0dMSUJDWFhfUEFSQUxMRUwKKyMgaW5jbHVkZSA8cGFyYWxsZWwvYWxnb3JpdGhtPgorI2VuZGlmCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9BTEdPUklUSE0gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYXJyYXkgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2FycmF5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMmE3MWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2FycmF5CkBAIC0wLDAgKzEsMzMzIEBACisvLyA8YXJyYXk+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2FycmF5CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0FSUkFZCisjZGVmaW5lIF9HTElCQ1hYX0FSUkFZIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPgorI2luY2x1ZGUgPGJpdHMvcmFuZ2VfYWNjZXNzLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIHN0cnVjdCBfX2FycmF5X3RyYWl0cworICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwIF9UeXBlW19ObV07CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX1RwJgorICAgICAgX1NfcmVmKGNvbnN0IF9UeXBlJiBfX3QsIHN0ZDo6c2l6ZV90IF9fbikgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8X1RwJj4oX190W19fbl0pOyB9CisgICAgfTsKKworIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgIHN0cnVjdCBfX2FycmF5X3RyYWl0czxfVHAsIDA+CisgICB7CisgICAgIHN0cnVjdCBfVHlwZSB7IH07CisKKyAgICAgc3RhdGljIGNvbnN0ZXhwciBfVHAmCisgICAgIF9TX3JlZihjb25zdCBfVHlwZSYsIHN0ZDo6c2l6ZV90KSBub2V4Y2VwdAorICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8X1RwKj4obnVsbHB0cik7IH0KKyAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgZm9yIHN0b3JpbmcgYSBmaXhlZCBzaXplIHNlcXVlbmNlIG9mIGVsZW1lbnRzLgorICAgKgorICAgKiAgQGluZ3JvdXAgc2VxdWVuY2VzCisgICAqCisgICAqICBNZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sIGEKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY2Ij5yZXZlcnNpYmxlIGNvbnRhaW5lcjwvYT4sIGFuZCBhCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NyI+c2VxdWVuY2U8L2E+LgorICAgKgorICAgKiAgU2V0cyBzdXBwb3J0IHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLgorICAgKgorICAgKiAgQHRwYXJhbSAgVHAgIFR5cGUgb2YgZWxlbWVudC4gUmVxdWlyZWQgdG8gYmUgYSBjb21wbGV0ZSB0eXBlLgorICAgKiAgQHRwYXJhbSAgTiAgTnVtYmVyIG9mIGVsZW1lbnRzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBzdHJ1Y3QgYXJyYXkKKyAgICB7CisgICAgICB0eXBlZGVmIF9UcCAJICAgIAkJCSAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUqCQkJICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgIAkgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgIAkgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUqICAgICAgICAgIAkJICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqCQkJICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90ICAgICAgICAgICAgICAgICAgICAJICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAJICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+CSAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICAvLyBTdXBwb3J0IGZvciB6ZXJvLXNpemVkIGFycmF5cyBtYW5kYXRvcnkuCisgICAgICB0eXBlZGVmIF9HTElCQ1hYX1NURF9DOjpfX2FycmF5X3RyYWl0czxfVHAsIF9ObT4gX0FUX1R5cGU7CisgICAgICB0eXBlbmFtZSBfQVRfVHlwZTo6X1R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgX01fZWxlbXM7CisKKyAgICAgIC8vIE5vIGV4cGxpY2l0IGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3kgZm9yIGFnZ3JlZ2F0ZSB0eXBlLgorCisgICAgICAvLyBEUiA3NzYuCisgICAgICB2b2lkCisgICAgICBmaWxsKGNvbnN0IHZhbHVlX3R5cGUmIF9fdSkKKyAgICAgIHsgc3RkOjpmaWxsX24oYmVnaW4oKSwgc2l6ZSgpLCBfX3UpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoYXJyYXkmIF9fb3RoZXIpCisgICAgICBub2V4Y2VwdChub2V4Y2VwdChzd2FwKHN0ZDo6ZGVjbHZhbDxfVHAmPigpLCBzdGQ6OmRlY2x2YWw8X1RwJj4oKSkpKQorICAgICAgeyBzdGQ6OnN3YXBfcmFuZ2VzKGJlZ2luKCksIGVuZCgpLCBfX290aGVyLmJlZ2luKCkpOyB9CisKKyAgICAgIC8vIEl0ZXJhdG9ycy4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBpdGVyYXRvcihkYXRhKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihkYXRhKCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoZGF0YSgpICsgX05tKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKGRhdGEoKSArIF9ObSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvciAKKyAgICAgIHJiZWdpbigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIAorICAgICAgcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IgCisgICAgICByZW5kKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciAKKyAgICAgIHJlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKGRhdGEoKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoZGF0YSgpICsgX05tKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIAorICAgICAgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIAorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICAvLyBDYXBhY2l0eS4KKyAgICAgIGNvbnN0ZXhwciBzaXplX3R5cGUgCisgICAgICBzaXplKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gX05tOyB9CisKKyAgICAgIGNvbnN0ZXhwciBzaXplX3R5cGUgCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuIF9ObTsgfQorCisgICAgICBjb25zdGV4cHIgYm9vbCAKKyAgICAgIGVtcHR5KCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gc2l6ZSgpID09IDA7IH0KKworICAgICAgLy8gRWxlbWVudCBhY2Nlc3MuCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIF9BVF9UeXBlOjpfU19yZWYoX01fZWxlbXMsIF9fbik7IH0KKworICAgICAgY29uc3RleHByIGNvbnN0X3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgX19uKTsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIGF0KHNpemVfdHlwZSBfX24pCisgICAgICB7CisJaWYgKF9fbiA+PSBfTm0pCisJICBzdGQ6Ol9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiYXJyYXk6OmF0IikpOworCXJldHVybiBfQVRfVHlwZTo6X1NfcmVmKF9NX2VsZW1zLCBfX24pOworICAgICAgfQorCisgICAgICBjb25zdGV4cHIgY29uc3RfcmVmZXJlbmNlCisgICAgICBhdChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeworCS8vIFJlc3VsdCBvZiBjb25kaXRpb25hbCBleHByZXNzaW9uIG11c3QgYmUgYW4gbHZhbHVlIHNvIHVzZQorCS8vIGJvb2xlYW4gPyBsdmFsdWUgOiAodGhyb3ctZXhwciwgbHZhbHVlKQorCXJldHVybiBfX24gPCBfTm0gPyBfQVRfVHlwZTo6X1NfcmVmKF9NX2VsZW1zLCBfX24pCisJICA6IChzdGQ6Ol9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiYXJyYXk6OmF0IikpLAorCSAgICAgX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgMCkpOworICAgICAgfQorCisgICAgICByZWZlcmVuY2UgCisgICAgICBmcm9udCgpCisgICAgICB7IHJldHVybiAqYmVnaW4oKTsgfQorCisgICAgICBjb25zdGV4cHIgY29uc3RfcmVmZXJlbmNlIAorICAgICAgZnJvbnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgMCk7IH0KKworICAgICAgcmVmZXJlbmNlIAorICAgICAgYmFjaygpCisgICAgICB7IHJldHVybiBfTm0gPyAqKGVuZCgpIC0gMSkgOiAqZW5kKCk7IH0KKworICAgICAgY29uc3RleHByIGNvbnN0X3JlZmVyZW5jZSAKKyAgICAgIGJhY2soKSBjb25zdAorICAgICAgeyAKKwlyZXR1cm4gX05tID8gX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgX05tIC0gMSkgCisgCSAgICAgICAgICAgOiBfQVRfVHlwZTo6X1NfcmVmKF9NX2VsZW1zLCAwKTsKKyAgICAgIH0KKworICAgICAgcG9pbnRlcgorICAgICAgZGF0YSgpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9BVF9UeXBlOjpfU19yZWYoX01fZWxlbXMsIDApKTsgfQorCisgICAgICBjb25zdF9wb2ludGVyCisgICAgICBkYXRhKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgMCkpOyB9CisgICAgfTsKKworICAvLyBBcnJheSBjb21wYXJpc29ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIGJvb2wgCisgICAgb3BlcmF0b3I9PShjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fb25lLCBjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fdHdvKQorICAgIHsgcmV0dXJuIHN0ZDo6ZXF1YWwoX19vbmUuYmVnaW4oKSwgX19vbmUuZW5kKCksIF9fdHdvLmJlZ2luKCkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgeyByZXR1cm4gIShfX29uZSA9PSBfX3R3byk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fYSwgY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX2IpCisgICAgeyAKKyAgICAgIHJldHVybiBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9fYS5iZWdpbigpLCBfX2EuZW5kKCksCisJCQkJCSAgX19iLmJlZ2luKCksIF9fYi5lbmQoKSk7IAorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fb25lLCBjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fdHdvKQorICAgIHsgcmV0dXJuIF9fdHdvIDwgX19vbmU7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX29uZSwgY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX3R3bykKKyAgICB7IHJldHVybiAhKF9fb25lID4gX190d28pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgeyByZXR1cm4gIShfX29uZSA8IF9fdHdvKTsgfQorCisgIC8vIFNwZWNpYWxpemVkIGFsZ29yaXRobXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChhcnJheTxfVHAsIF9ObT4mIF9fb25lLCBhcnJheTxfVHAsIF9ObT4mIF9fdHdvKQorICAgIG5vZXhjZXB0KG5vZXhjZXB0KF9fb25lLnN3YXAoX190d28pKSkKKyAgICB7IF9fb25lLnN3YXAoX190d28pOyB9CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0ludCwgdHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgY29uc3RleHByIF9UcCYKKyAgICBnZXQoYXJyYXk8X1RwLCBfTm0+JiBfX2Fycikgbm9leGNlcHQKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9JbnQgPCBfTm0sICJpbmRleCBpcyBvdXQgb2YgYm91bmRzIik7CisgICAgICByZXR1cm4gX0dMSUJDWFhfU1REX0M6Ol9fYXJyYXlfdHJhaXRzPF9UcCwgX05tPjo6CisJX1NfcmVmKF9fYXJyLl9NX2VsZW1zLCBfSW50KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0ludCwgdHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgY29uc3RleHByIF9UcCYmCisgICAgZ2V0KGFycmF5PF9UcCwgX05tPiYmIF9fYXJyKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoX0ludCA8IF9ObSwgImluZGV4IGlzIG91dCBvZiBib3VuZHMiKTsKKyAgICAgIHJldHVybiBzdGQ6Om1vdmUoZ2V0PF9JbnQ+KF9fYXJyKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JbnQsIHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGNvbnN0ZXhwciBjb25zdCBfVHAmCisgICAgZ2V0KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19hcnIpIG5vZXhjZXB0CisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChfSW50IDwgX05tLCAiaW5kZXggaXMgb3V0IG9mIGJvdW5kcyIpOworICAgICAgcmV0dXJuIF9HTElCQ1hYX1NURF9DOjpfX2FycmF5X3RyYWl0czxfVHAsIF9ObT46OgorCV9TX3JlZihfX2Fyci5fTV9lbGVtcywgX0ludCk7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBUdXBsZSBpbnRlcmZhY2UgdG8gY2xhc3MgdGVtcGxhdGUgYXJyYXkuCisKKyAgLy8vIHR1cGxlX3NpemUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAKKyAgICBjbGFzcyB0dXBsZV9zaXplOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIHN0cnVjdCB0dXBsZV9zaXplPF9HTElCQ1hYX1NURF9DOjphcnJheTxfVHAsIF9ObT4+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIF9ObT4geyB9OworCisgIC8vLyB0dXBsZV9lbGVtZW50CisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JbnQsIHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyB0dXBsZV9lbGVtZW50OworCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JbnQsIHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIHN0cnVjdCB0dXBsZV9lbGVtZW50PF9JbnQsIF9HTElCQ1hYX1NURF9DOjphcnJheTxfVHAsIF9ObT4+CisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChfSW50IDwgX05tLCAiaW5kZXggaXMgb3V0IG9mIGJvdW5kcyIpOworICAgICAgdHlwZWRlZiBfVHAgdHlwZTsKKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyMgaW5jbHVkZSA8ZGVidWcvYXJyYXk+CisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1BST0ZJTEUKKyMgaW5jbHVkZSA8cHJvZmlsZS9hcnJheT4KKyNlbmRpZgorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vIF9HTElCQ1hYX0FSUkFZCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2F0b21pYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYXRvbWljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxM2Y1NzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2F0b21pYwpAQCAtMCwwICsxLDExMjIgQEAKKy8vIC0qLSBDKysgLSotIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvYXRvbWljCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisvLyBCYXNlZCBvbiAiQysrIEF0b21pYyBUeXBlcyBhbmQgT3BlcmF0aW9ucyIgYnkgSGFucyBCb2VobSBhbmQgTGF3cmVuY2UgQ3Jvd2wuCisvLyBodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL3BhcGVycy8yMDA3L24yNDI3Lmh0bWwKKworI2lmbmRlZiBfR0xJQkNYWF9BVE9NSUMKKyNkZWZpbmUgX0dMSUJDWFhfQVRPTUlDIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL2F0b21pY19iYXNlLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgYXRvbWljcworICAgKiBAeworICAgKi8KKworICAvLy8gYXRvbWljX2Jvb2wKKyAgLy8gTkI6IE5vIG9wZXJhdG9ycyBvciBmZXRjaC1vcGVyYXRpb25zIGZvciB0aGlzIHR5cGUuCisgIHN0cnVjdCBhdG9taWNfYm9vbAorICB7CisgIHByaXZhdGU6CisgICAgX19hdG9taWNfYmFzZTxib29sPglfTV9iYXNlOworCisgIHB1YmxpYzoKKyAgICBhdG9taWNfYm9vbCgpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICB+YXRvbWljX2Jvb2woKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgYXRvbWljX2Jvb2woY29uc3QgYXRvbWljX2Jvb2wmKSA9IGRlbGV0ZTsKKyAgICBhdG9taWNfYm9vbCYgb3BlcmF0b3I9KGNvbnN0IGF0b21pY19ib29sJikgPSBkZWxldGU7CisgICAgYXRvbWljX2Jvb2wmIG9wZXJhdG9yPShjb25zdCBhdG9taWNfYm9vbCYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgY29uc3RleHByIGF0b21pY19ib29sKGJvb2wgX19pKSBub2V4Y2VwdCA6IF9NX2Jhc2UoX19pKSB7IH0KKworICAgIGJvb2wKKyAgICBvcGVyYXRvcj0oYm9vbCBfX2kpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX01fYmFzZS5vcGVyYXRvcj0oX19pKTsgfQorCisgICAgYm9vbAorICAgIG9wZXJhdG9yPShib29sIF9faSkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICB7IHJldHVybiBfTV9iYXNlLm9wZXJhdG9yPShfX2kpOyB9CisKKyAgICBvcGVyYXRvciBib29sKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7IHJldHVybiBfTV9iYXNlLmxvYWQoKTsgfQorCisgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHZvbGF0aWxlIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX01fYmFzZS5sb2FkKCk7IH0KKworICAgIGJvb2wKKyAgICBpc19sb2NrX2ZyZWUoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBfTV9iYXNlLmlzX2xvY2tfZnJlZSgpOyB9CisKKyAgICBib29sCisgICAgaXNfbG9ja19mcmVlKCkgY29uc3Qgdm9sYXRpbGUgbm9leGNlcHQgeyByZXR1cm4gX01fYmFzZS5pc19sb2NrX2ZyZWUoKTsgfQorCisgICAgdm9pZAorICAgIHN0b3JlKGJvb2wgX19pLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0CisgICAgeyBfTV9iYXNlLnN0b3JlKF9faSwgX19tKTsgfQorCisgICAgdm9pZAorICAgIHN0b3JlKGJvb2wgX19pLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgeyBfTV9iYXNlLnN0b3JlKF9faSwgX19tKTsgfQorCisgICAgYm9vbAorICAgIGxvYWQobWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBjb25zdCBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9NX2Jhc2UubG9hZChfX20pOyB9CisKKyAgICBib29sCisgICAgbG9hZChtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIGNvbnN0IHZvbGF0aWxlIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX01fYmFzZS5sb2FkKF9fbSk7IH0KKworICAgIGJvb2wKKyAgICBleGNoYW5nZShib29sIF9faSwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9NX2Jhc2UuZXhjaGFuZ2UoX19pLCBfX20pOyB9CisKKyAgICBib29sCisgICAgZXhjaGFuZ2UoYm9vbCBfX2ksCisJICAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX01fYmFzZS5leGNoYW5nZShfX2ksIF9fbSk7IH0KKworICAgIGJvb2wKKyAgICBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoYm9vbCYgX19pMSwgYm9vbCBfX2kyLCBtZW1vcnlfb3JkZXIgX19tMSwKKwkJCSAgbWVtb3J5X29yZGVyIF9fbTIpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX01fYmFzZS5jb21wYXJlX2V4Y2hhbmdlX3dlYWsoX19pMSwgX19pMiwgX19tMSwgX19tMik7IH0KKworICAgIGJvb2wKKyAgICBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoYm9vbCYgX19pMSwgYm9vbCBfX2kyLCBtZW1vcnlfb3JkZXIgX19tMSwKKwkJCSAgbWVtb3J5X29yZGVyIF9fbTIpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX01fYmFzZS5jb21wYXJlX2V4Y2hhbmdlX3dlYWsoX19pMSwgX19pMiwgX19tMSwgX19tMik7IH0KKworICAgIGJvb2wKKyAgICBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoYm9vbCYgX19pMSwgYm9vbCBfX2kyLAorCQkJICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX01fYmFzZS5jb21wYXJlX2V4Y2hhbmdlX3dlYWsoX19pMSwgX19pMiwgX19tKTsgfQorCisgICAgYm9vbAorICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2Vhayhib29sJiBfX2kxLCBib29sIF9faTIsCisJCSAgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9NX2Jhc2UuY29tcGFyZV9leGNoYW5nZV93ZWFrKF9faTEsIF9faTIsIF9fbSk7IH0KKworICAgIGJvb2wKKyAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhib29sJiBfX2kxLCBib29sIF9faTIsIG1lbW9yeV9vcmRlciBfX20xLAorCQkJICAgIG1lbW9yeV9vcmRlciBfX20yKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9NX2Jhc2UuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19pMSwgX19pMiwgX19tMSwgX19tMik7IH0KKworICAgIGJvb2wKKyAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhib29sJiBfX2kxLCBib29sIF9faTIsIG1lbW9yeV9vcmRlciBfX20xLAorCQkJICAgIG1lbW9yeV9vcmRlciBfX20yKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9NX2Jhc2UuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19pMSwgX19pMiwgX19tMSwgX19tMik7IH0KKworICAgIGJvb2wKKyAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhib29sJiBfX2kxLCBib29sIF9faTIsCisJCQkgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9NX2Jhc2UuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19pMSwgX19pMiwgX19tKTsgfQorCisgICAgYm9vbAorICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKGJvb2wmIF9faTEsIGJvb2wgX19pMiwKKwkJICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICB7IHJldHVybiBfTV9iYXNlLmNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9faTEsIF9faTIsIF9fbSk7IH0KKyAgfTsKKworCisgIC8qKgorICAgKiAgQGJyaWVmIEdlbmVyaWMgYXRvbWljIHR5cGUsIHByaW1hcnkgY2xhc3MgdGVtcGxhdGUuCisgICAqCisgICAqICBAdHBhcmFtIF9UcCAgVHlwZSB0byBiZSBtYWRlIGF0b21pYywgbXVzdCBiZSB0cml2YWxseSBjb3B5YWJsZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYXRvbWljCisgICAgeworICAgIHByaXZhdGU6CisgICAgICBfVHAgX01faTsKKworICAgIHB1YmxpYzoKKyAgICAgIGF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIH5hdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICBjb25zdGV4cHIgYXRvbWljKF9UcCBfX2kpIG5vZXhjZXB0IDogX01faShfX2kpIHsgfQorCisgICAgICBvcGVyYXRvciBfVHAoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gbG9hZCgpOyB9CisKKyAgICAgIG9wZXJhdG9yIF9UcCgpIGNvbnN0IHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBsb2FkKCk7IH0KKworICAgICAgX1RwCisgICAgICBvcGVyYXRvcj0oX1RwIF9faSkgbm9leGNlcHQgCisgICAgICB7IHN0b3JlKF9faSk7IHJldHVybiBfX2k7IH0KKworICAgICAgX1RwCisgICAgICBvcGVyYXRvcj0oX1RwIF9faSkgdm9sYXRpbGUgbm9leGNlcHQgCisgICAgICB7IHN0b3JlKF9faSk7IHJldHVybiBfX2k7IH0KKworICAgICAgYm9vbAorICAgICAgaXNfbG9ja19mcmVlKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX2lzX2xvY2tfZnJlZShzaXplb2YoX01faSksIG51bGxwdHIpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGlzX2xvY2tfZnJlZSgpIGNvbnN0IHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19pc19sb2NrX2ZyZWUoc2l6ZW9mKF9NX2kpLCBudWxscHRyKTsgfQorCisgICAgICB2b2lkCisgICAgICBzdG9yZShfVHAgX19pLCBtZW1vcnlfb3JkZXIgX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsgX19hdG9taWNfc3RvcmUoJl9NX2ksICZfX2ksIF9tKTsgfQorCisgICAgICB2b2lkCisgICAgICBzdG9yZShfVHAgX19pLCBtZW1vcnlfb3JkZXIgX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgX19hdG9taWNfc3RvcmUoJl9NX2ksICZfX2ksIF9tKTsgfQorCisgICAgICBfVHAKKyAgICAgIGxvYWQobWVtb3J5X29yZGVyIF9tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IAorICAgICAgICBfVHAgdG1wOworCV9fYXRvbWljX2xvYWQoJl9NX2ksICZ0bXAsIF9tKTsgCisJcmV0dXJuIHRtcDsKKyAgICAgIH0KKworICAgICAgX1RwCisgICAgICBsb2FkKG1lbW9yeV9vcmRlciBfbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBjb25zdCB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyAKKyAgICAgICAgX1RwIHRtcDsKKwlfX2F0b21pY19sb2FkKCZfTV9pLCAmdG1wLCBfbSk7IAorCXJldHVybiB0bXA7CisgICAgICB9CisKKyAgICAgIF9UcAorICAgICAgZXhjaGFuZ2UoX1RwIF9faSwgbWVtb3J5X29yZGVyIF9tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0CisgICAgICB7IAorICAgICAgICBfVHAgdG1wOworCV9fYXRvbWljX2V4Y2hhbmdlKCZfTV9pLCAmX19pLCAmdG1wLCBfbSk7IAorCXJldHVybiB0bXA7CisgICAgICB9CisKKyAgICAgIF9UcAorICAgICAgZXhjaGFuZ2UoX1RwIF9faSwgCisJICAgICAgIG1lbW9yeV9vcmRlciBfbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyAKKyAgICAgICAgX1RwIHRtcDsKKwlfX2F0b21pY19leGNoYW5nZSgmX01faSwgJl9faSwgJnRtcCwgX20pOyAKKwlyZXR1cm4gdG1wOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoX1RwJiBfX2UsIF9UcCBfX2ksIG1lbW9yeV9vcmRlciBfX3MsIAorCQkJICAgIG1lbW9yeV9vcmRlciBfX2YpIG5vZXhjZXB0CisgICAgICB7CisJcmV0dXJuIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2UoJl9NX2ksICZfX2UsICZfX2ksIHRydWUsIF9fcywgX19mKTsgCisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfVHAmIF9fZSwgX1RwIF9faSwgbWVtb3J5X29yZGVyIF9fcywgCisJCQkgICAgbWVtb3J5X29yZGVyIF9fZikgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsKKwlyZXR1cm4gX19hdG9taWNfY29tcGFyZV9leGNoYW5nZSgmX01faSwgJl9fZSwgJl9faSwgdHJ1ZSwgX19zLCBfX2YpOyAKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV93ZWFrKF9UcCYgX19lLCBfVHAgX19pLAorCQkJICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX2UsIF9faSwgX19tLCBfX20pOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfVHAmIF9fZSwgX1RwIF9faSwKKwkJICAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoX19lLCBfX2ksIF9fbSwgX19tKTsgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfVHAmIF9fZSwgX1RwIF9faSwgbWVtb3J5X29yZGVyIF9fcywgCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19mKSBub2V4Y2VwdAorICAgICAgeworCXJldHVybiBfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlKCZfTV9pLCAmX19lLCAmX19pLCBmYWxzZSwgX19zLCBfX2YpOyAKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX1RwJiBfX2UsIF9UcCBfX2ksIG1lbW9yeV9vcmRlciBfX3MsIAorCQkJICAgICAgbWVtb3J5X29yZGVyIF9fZikgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsKKwlyZXR1cm4gX19hdG9taWNfY29tcGFyZV9leGNoYW5nZSgmX01faSwgJl9fZSwgJl9faSwgZmFsc2UsIF9fcywgX19mKTsgCisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9UcCYgX19lLCBfVHAgX19pLAorCQkJICAgICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9fZSwgX19pLCBfX20sIF9fbSk7IH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX1RwJiBfX2UsIF9UcCBfX2ksCisJCSAgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19lLCBfX2ksIF9fbSwgX19tKTsgfQorICAgIH07CisKKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgcG9pbnRlciB0eXBlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhdG9taWM8X1RwKj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9UcCogCQkJX19wb2ludGVyX3R5cGU7CisgICAgICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8X1RwKj4JX19iYXNlX3R5cGU7CisgICAgICBfX2Jhc2VfdHlwZQkJCV9NX2I7CisKKyAgICAgIGF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIH5hdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICBjb25zdGV4cHIgYXRvbWljKF9fcG9pbnRlcl90eXBlIF9fcCkgbm9leGNlcHQgOiBfTV9iKF9fcCkgeyB9CisKKyAgICAgIG9wZXJhdG9yIF9fcG9pbnRlcl90eXBlKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fcG9pbnRlcl90eXBlKF9NX2IpOyB9CisKKyAgICAgIG9wZXJhdG9yIF9fcG9pbnRlcl90eXBlKCkgY29uc3Qgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fcG9pbnRlcl90eXBlKF9NX2IpOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvcj0oX19wb2ludGVyX3R5cGUgX19wKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYi5vcGVyYXRvcj0oX19wKTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3I9KF9fcG9pbnRlcl90eXBlIF9fcCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2Iub3BlcmF0b3I9KF9fcCk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yKysoaW50KSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYisrOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvcisrKGludCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2IrKzsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3ItLShpbnQpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9iLS07IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yLS0oaW50KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYi0tOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvcisrKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuICsrX01fYjsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3IrKygpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiArK19NX2I7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yLS0oKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gLS1fTV9iOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvci0tKCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIC0tX01fYjsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3IrPShwdHJkaWZmX3QgX19kKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYi5vcGVyYXRvcis9KF9fZCk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yKz0ocHRyZGlmZl90IF9fZCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2Iub3BlcmF0b3IrPShfX2QpOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvci09KHB0cmRpZmZfdCBfX2QpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9iLm9wZXJhdG9yLT0oX19kKTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3ItPShwdHJkaWZmX3QgX19kKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYi5vcGVyYXRvci09KF9fZCk7IH0KKworICAgICAgYm9vbAorICAgICAgaXNfbG9ja19mcmVlKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2IuaXNfbG9ja19mcmVlKCk7IH0KKworICAgICAgYm9vbAorICAgICAgaXNfbG9ja19mcmVlKCkgY29uc3Qgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2IuaXNfbG9ja19mcmVlKCk7IH0KKworICAgICAgdm9pZAorICAgICAgc3RvcmUoX19wb2ludGVyX3R5cGUgX19wLAorCSAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9iLnN0b3JlKF9fcCwgX19tKTsgfQorCisgICAgICB2b2lkCisgICAgICBzdG9yZShfX3BvaW50ZXJfdHlwZSBfX3AsCisJICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2Iuc3RvcmUoX19wLCBfX20pOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBsb2FkKG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2IubG9hZChfX20pOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBsb2FkKG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgY29uc3Qgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2IubG9hZChfX20pOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBleGNoYW5nZShfX3BvaW50ZXJfdHlwZSBfX3AsCisJICAgICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2IuZXhjaGFuZ2UoX19wLCBfX20pOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBleGNoYW5nZShfX3BvaW50ZXJfdHlwZSBfX3AsCisJICAgICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2IuZXhjaGFuZ2UoX19wLCBfX20pOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX3BvaW50ZXJfdHlwZSYgX19wMSwgX19wb2ludGVyX3R5cGUgX19wMiwKKwkJCSAgICBtZW1vcnlfb3JkZXIgX19tMSwgbWVtb3J5X29yZGVyIF9fbTIpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9iLmNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9fcDEsIF9fcDIsIF9fbTEsIF9fbTIpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX3BvaW50ZXJfdHlwZSYgX19wMSwgX19wb2ludGVyX3R5cGUgX19wMiwKKwkJCSAgICBtZW1vcnlfb3JkZXIgX19tMSwKKwkJCSAgICBtZW1vcnlfb3JkZXIgX19tMikgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2IuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19wMSwgX19wMiwgX19tMSwgX19tMik7IH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV93ZWFrKF9fcG9pbnRlcl90eXBlJiBfX3AxLCBfX3BvaW50ZXJfdHlwZSBfX3AyLAorCQkJICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsKKwlyZXR1cm4gY29tcGFyZV9leGNoYW5nZV93ZWFrKF9fcDEsIF9fcDIsIF9fbSwKKwkJCQkgICAgIF9fY21wZXhjaF9mYWlsdXJlX29yZGVyKF9fbSkpOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoX19wb2ludGVyX3R5cGUmIF9fcDEsIF9fcG9pbnRlcl90eXBlIF9fcDIsCisJCSAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7CisJcmV0dXJuIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX3AxLCBfX3AyLCBfX20sCisJCQkJICAgICBfX2NtcGV4Y2hfZmFpbHVyZV9vcmRlcihfX20pKTsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19wb2ludGVyX3R5cGUmIF9fcDEsIF9fcG9pbnRlcl90eXBlIF9fcDIsCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tMSwgbWVtb3J5X29yZGVyIF9fbTIpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9iLmNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9fcDEsIF9fcDIsIF9fbTEsIF9fbTIpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9fcG9pbnRlcl90eXBlJiBfX3AxLCBfX3BvaW50ZXJfdHlwZSBfX3AyLAorCQkJICAgICAgbWVtb3J5X29yZGVyIF9fbTEsCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tMikgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2IuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19wMSwgX19wMiwgX19tMSwgX19tMik7IH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19wb2ludGVyX3R5cGUmIF9fcDEsIF9fcG9pbnRlcl90eXBlIF9fcDIsCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0CisgICAgICB7CisJcmV0dXJuIF9NX2IuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19wMSwgX19wMiwgX19tLAorCQkJCQkgICAgX19jbXBleGNoX2ZhaWx1cmVfb3JkZXIoX19tKSk7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9fcG9pbnRlcl90eXBlJiBfX3AxLCBfX3BvaW50ZXJfdHlwZSBfX3AyLAorCQkgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeworCXJldHVybiBfTV9iLmNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9fcDEsIF9fcDIsIF9fbSwKKwkJCQkJICAgIF9fY21wZXhjaF9mYWlsdXJlX29yZGVyKF9fbSkpOworICAgICAgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgZmV0Y2hfYWRkKHB0cmRpZmZfdCBfX2QsCisJCW1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2IuZmV0Y2hfYWRkKF9fZCwgX19tKTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgZmV0Y2hfYWRkKHB0cmRpZmZfdCBfX2QsCisJCW1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2IuZmV0Y2hfYWRkKF9fZCwgX19tKTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgZmV0Y2hfc3ViKHB0cmRpZmZfdCBfX2QsCisJCW1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2IuZmV0Y2hfc3ViKF9fZCwgX19tKTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgZmV0Y2hfc3ViKHB0cmRpZmZfdCBfX2QsCisJCW1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2IuZmV0Y2hfc3ViKF9fZCwgX19tKTsgfQorICAgIH07CisKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIGJvb2wuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgYXRvbWljPGJvb2w+IDogcHVibGljIGF0b21pY19ib29sCisgICAgeworICAgICAgdHlwZWRlZiBib29sIAkJCV9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHR5cGVkZWYgYXRvbWljX2Jvb2wgCQlfX2Jhc2VfdHlwZTsKKworICAgICAgYXRvbWljKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgfmF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIGF0b21pYyhjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAgIGNvbnN0ZXhwciBhdG9taWMoX19pbnRlZ3JhbF90eXBlIF9faSkgbm9leGNlcHQgOiBfX2Jhc2VfdHlwZShfX2kpIHsgfQorCisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3IgX19pbnRlZ3JhbF90eXBlOworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yPTsKKyAgICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgY2hhci4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBhdG9taWM8Y2hhcj4gOiBwdWJsaWMgYXRvbWljX2NoYXIKKyAgICB7CisgICAgICB0eXBlZGVmIGNoYXIgCQkJX19pbnRlZ3JhbF90eXBlOworICAgICAgdHlwZWRlZiBhdG9taWNfY2hhciAJCV9fYmFzZV90eXBlOworCisgICAgICBhdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICB+YXRvbWljKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgYXRvbWljKGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSB2b2xhdGlsZSA9IGRlbGV0ZTsKKworICAgICAgY29uc3RleHByIGF0b21pYyhfX2ludGVncmFsX3R5cGUgX19pKSBub2V4Y2VwdCA6IF9fYmFzZV90eXBlKF9faSkgeyB9CisKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvciBfX2ludGVncmFsX3R5cGU7CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3I9OworICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBzaWduZWQgY2hhci4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBhdG9taWM8c2lnbmVkIGNoYXI+IDogcHVibGljIGF0b21pY19zY2hhcgorICAgIHsKKyAgICAgIHR5cGVkZWYgc2lnbmVkIGNoYXIgCQlfX2ludGVncmFsX3R5cGU7CisgICAgICB0eXBlZGVmIGF0b21pY19zY2hhciAJCV9fYmFzZV90eXBlOworCisgICAgICBhdG9taWMoKSBub2V4Y2VwdD0gZGVmYXVsdDsKKyAgICAgIH5hdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICBjb25zdGV4cHIgYXRvbWljKF9faW50ZWdyYWxfdHlwZSBfX2kpIG5vZXhjZXB0IDogX19iYXNlX3R5cGUoX19pKSB7IH0KKworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yIF9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHVuc2lnbmVkIGNoYXIuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgYXRvbWljPHVuc2lnbmVkIGNoYXI+IDogcHVibGljIGF0b21pY191Y2hhcgorICAgIHsKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAJCV9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHR5cGVkZWYgYXRvbWljX3VjaGFyIAkJX19iYXNlX3R5cGU7CisKKyAgICAgIGF0b21pYygpIG5vZXhjZXB0PSBkZWZhdWx0OworICAgICAgfmF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIGF0b21pYyhjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAgIGNvbnN0ZXhwciBhdG9taWMoX19pbnRlZ3JhbF90eXBlIF9faSkgbm9leGNlcHQgOiBfX2Jhc2VfdHlwZShfX2kpIHsgfQorCisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3IgX19pbnRlZ3JhbF90eXBlOworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yPTsKKyAgICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3Igc2hvcnQuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgYXRvbWljPHNob3J0PiA6IHB1YmxpYyBhdG9taWNfc2hvcnQKKyAgICB7CisgICAgICB0eXBlZGVmIHNob3J0IAkJCV9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHR5cGVkZWYgYXRvbWljX3Nob3J0IAkJX19iYXNlX3R5cGU7CisKKyAgICAgIGF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIH5hdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICBjb25zdGV4cHIgYXRvbWljKF9faW50ZWdyYWxfdHlwZSBfX2kpIG5vZXhjZXB0IDogX19iYXNlX3R5cGUoX19pKSB7IH0KKworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yIF9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHVuc2lnbmVkIHNob3J0LgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGF0b21pYzx1bnNpZ25lZCBzaG9ydD4gOiBwdWJsaWMgYXRvbWljX3VzaG9ydAorICAgIHsKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgCSAgICAgIAlfX2ludGVncmFsX3R5cGU7CisgICAgICB0eXBlZGVmIGF0b21pY191c2hvcnQgCQlfX2Jhc2VfdHlwZTsKKworICAgICAgYXRvbWljKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgfmF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIGF0b21pYyhjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAgIGNvbnN0ZXhwciBhdG9taWMoX19pbnRlZ3JhbF90eXBlIF9faSkgbm9leGNlcHQgOiBfX2Jhc2VfdHlwZShfX2kpIHsgfQorCisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3IgX19pbnRlZ3JhbF90eXBlOworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yPTsKKyAgICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgaW50LgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGF0b21pYzxpbnQ+IDogYXRvbWljX2ludAorICAgIHsKKyAgICAgIHR5cGVkZWYgaW50IAkJCV9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHR5cGVkZWYgYXRvbWljX2ludCAJCV9fYmFzZV90eXBlOworCisgICAgICBhdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICB+YXRvbWljKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgYXRvbWljKGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSB2b2xhdGlsZSA9IGRlbGV0ZTsKKworICAgICAgY29uc3RleHByIGF0b21pYyhfX2ludGVncmFsX3R5cGUgX19pKSBub2V4Y2VwdCA6IF9fYmFzZV90eXBlKF9faSkgeyB9CisKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvciBfX2ludGVncmFsX3R5cGU7CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3I9OworICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciB1bnNpZ25lZCBpbnQuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgYXRvbWljPHVuc2lnbmVkIGludD4gOiBwdWJsaWMgYXRvbWljX3VpbnQKKyAgICB7CisgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludAkJX19pbnRlZ3JhbF90eXBlOworICAgICAgdHlwZWRlZiBhdG9taWNfdWludCAJCV9fYmFzZV90eXBlOworCisgICAgICBhdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICB+YXRvbWljKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgYXRvbWljKGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSB2b2xhdGlsZSA9IGRlbGV0ZTsKKworICAgICAgY29uc3RleHByIGF0b21pYyhfX2ludGVncmFsX3R5cGUgX19pKSBub2V4Y2VwdCA6IF9fYmFzZV90eXBlKF9faSkgeyB9CisKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvciBfX2ludGVncmFsX3R5cGU7CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3I9OworICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBsb25nLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGF0b21pYzxsb25nPiA6IHB1YmxpYyBhdG9taWNfbG9uZworICAgIHsKKyAgICAgIHR5cGVkZWYgbG9uZyAJCQlfX2ludGVncmFsX3R5cGU7CisgICAgICB0eXBlZGVmIGF0b21pY19sb25nIAkJX19iYXNlX3R5cGU7CisKKyAgICAgIGF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIH5hdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICBjb25zdGV4cHIgYXRvbWljKF9faW50ZWdyYWxfdHlwZSBfX2kpIG5vZXhjZXB0IDogX19iYXNlX3R5cGUoX19pKSB7IH0KKworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yIF9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHVuc2lnbmVkIGxvbmcuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgYXRvbWljPHVuc2lnbmVkIGxvbmc+IDogcHVibGljIGF0b21pY191bG9uZworICAgIHsKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAJCV9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHR5cGVkZWYgYXRvbWljX3Vsb25nIAkJX19iYXNlX3R5cGU7CisKKyAgICAgIGF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIH5hdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICBjb25zdGV4cHIgYXRvbWljKF9faW50ZWdyYWxfdHlwZSBfX2kpIG5vZXhjZXB0IDogX19iYXNlX3R5cGUoX19pKSB7IH0KKworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yIF9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIGxvbmcgbG9uZy4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBhdG9taWM8bG9uZyBsb25nPiA6IHB1YmxpYyBhdG9taWNfbGxvbmcKKyAgICB7CisgICAgICB0eXBlZGVmIGxvbmcgbG9uZyAJCV9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHR5cGVkZWYgYXRvbWljX2xsb25nIAkJX19iYXNlX3R5cGU7CisKKyAgICAgIGF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIH5hdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICBjb25zdGV4cHIgYXRvbWljKF9faW50ZWdyYWxfdHlwZSBfX2kpIG5vZXhjZXB0IDogX19iYXNlX3R5cGUoX19pKSB7IH0KKworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yIF9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHVuc2lnbmVkIGxvbmcgbG9uZy4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBhdG9taWM8dW5zaWduZWQgbG9uZyBsb25nPiA6IHB1YmxpYyBhdG9taWNfdWxsb25nCisgICAgeworICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgICAgICAgCV9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHR5cGVkZWYgYXRvbWljX3VsbG9uZyAJCV9fYmFzZV90eXBlOworCisgICAgICBhdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICB+YXRvbWljKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgYXRvbWljKGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSB2b2xhdGlsZSA9IGRlbGV0ZTsKKworICAgICAgY29uc3RleHByIGF0b21pYyhfX2ludGVncmFsX3R5cGUgX19pKSBub2V4Y2VwdCA6IF9fYmFzZV90eXBlKF9faSkgeyB9CisKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvciBfX2ludGVncmFsX3R5cGU7CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3I9OworICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciB3Y2hhcl90LgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGF0b21pYzx3Y2hhcl90PiA6IHB1YmxpYyBhdG9taWNfd2NoYXJfdAorICAgIHsKKyAgICAgIHR5cGVkZWYgd2NoYXJfdCAJCQlfX2ludGVncmFsX3R5cGU7CisgICAgICB0eXBlZGVmIGF0b21pY193Y2hhcl90IAkJX19iYXNlX3R5cGU7CisKKyAgICAgIGF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIH5hdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICBjb25zdGV4cHIgYXRvbWljKF9faW50ZWdyYWxfdHlwZSBfX2kpIG5vZXhjZXB0IDogX19iYXNlX3R5cGUoX19pKSB7IH0KKworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yIF9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIGNoYXIxNl90LgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGF0b21pYzxjaGFyMTZfdD4gOiBwdWJsaWMgYXRvbWljX2NoYXIxNl90CisgICAgeworICAgICAgdHlwZWRlZiBjaGFyMTZfdCAJCQlfX2ludGVncmFsX3R5cGU7CisgICAgICB0eXBlZGVmIGF0b21pY19jaGFyMTZfdCAJCV9fYmFzZV90eXBlOworCisgICAgICBhdG9taWMoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICB+YXRvbWljKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgYXRvbWljKGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSB2b2xhdGlsZSA9IGRlbGV0ZTsKKworICAgICAgY29uc3RleHByIGF0b21pYyhfX2ludGVncmFsX3R5cGUgX19pKSBub2V4Y2VwdCA6IF9fYmFzZV90eXBlKF9faSkgeyB9CisKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvciBfX2ludGVncmFsX3R5cGU7CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3I9OworICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBjaGFyMzJfdC4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBhdG9taWM8Y2hhcjMyX3Q+IDogcHVibGljIGF0b21pY19jaGFyMzJfdAorICAgIHsKKyAgICAgIHR5cGVkZWYgY2hhcjMyX3QgCQkJX19pbnRlZ3JhbF90eXBlOworICAgICAgdHlwZWRlZiBhdG9taWNfY2hhcjMyX3QgCQlfX2Jhc2VfdHlwZTsKKworICAgICAgYXRvbWljKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgfmF0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIGF0b21pYyhjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAgIGNvbnN0ZXhwciBhdG9taWMoX19pbnRlZ3JhbF90eXBlIF9faSkgbm9leGNlcHQgOiBfX2Jhc2VfdHlwZShfX2kpIHsgfQorCisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3IgX19pbnRlZ3JhbF90eXBlOworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yPTsKKyAgICB9OworCisKKyAgLy8gRnVuY3Rpb24gZGVmaW5pdGlvbnMsIGF0b21pY19mbGFnIG9wZXJhdGlvbnMuCisgIGlubGluZSBib29sCisgIGF0b21pY19mbGFnX3Rlc3RfYW5kX3NldF9leHBsaWNpdChhdG9taWNfZmxhZyogX19hLAorCQkJCSAgICBtZW1vcnlfb3JkZXIgX19tKSBub2V4Y2VwdAorICB7IHJldHVybiBfX2EtPnRlc3RfYW5kX3NldChfX20pOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgYXRvbWljX2ZsYWdfdGVzdF9hbmRfc2V0X2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19mbGFnKiBfX2EsCisJCQkJICAgIG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgIHsgcmV0dXJuIF9fYS0+dGVzdF9hbmRfc2V0KF9fbSk7IH0KKworICBpbmxpbmUgdm9pZAorICBhdG9taWNfZmxhZ19jbGVhcl9leHBsaWNpdChhdG9taWNfZmxhZyogX19hLCBtZW1vcnlfb3JkZXIgX19tKSBub2V4Y2VwdAorICB7IF9fYS0+Y2xlYXIoX19tKTsgfQorCisgIGlubGluZSB2b2lkCisgIGF0b21pY19mbGFnX2NsZWFyX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pY19mbGFnKiBfX2EsCisJCQkgICAgIG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgIHsgX19hLT5jbGVhcihfX20pOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgYXRvbWljX2ZsYWdfdGVzdF9hbmRfc2V0KGF0b21pY19mbGFnKiBfX2EpIG5vZXhjZXB0CisgIHsgcmV0dXJuIGF0b21pY19mbGFnX3Rlc3RfYW5kX3NldF9leHBsaWNpdChfX2EsIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgIGlubGluZSBib29sCisgIGF0b21pY19mbGFnX3Rlc3RfYW5kX3NldCh2b2xhdGlsZSBhdG9taWNfZmxhZyogX19hKSBub2V4Y2VwdAorICB7IHJldHVybiBhdG9taWNfZmxhZ190ZXN0X2FuZF9zZXRfZXhwbGljaXQoX19hLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICBpbmxpbmUgdm9pZAorICBhdG9taWNfZmxhZ19jbGVhcihhdG9taWNfZmxhZyogX19hKSBub2V4Y2VwdAorICB7IGF0b21pY19mbGFnX2NsZWFyX2V4cGxpY2l0KF9fYSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgaW5saW5lIHZvaWQKKyAgYXRvbWljX2ZsYWdfY2xlYXIodm9sYXRpbGUgYXRvbWljX2ZsYWcqIF9fYSkgbm9leGNlcHQKKyAgeyBhdG9taWNfZmxhZ19jbGVhcl9leHBsaWNpdChfX2EsIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisKKyAgLy8gRnVuY3Rpb24gdGVtcGxhdGVzIGdlbmVyYWxseSBhcHBsaWNhYmxlIHRvIGF0b21pYyB0eXBlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIGF0b21pY19pc19sb2NrX2ZyZWUoY29uc3QgYXRvbWljPF9JVHA+KiBfX2EpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLT5pc19sb2NrX2ZyZWUoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBhdG9taWNfaXNfbG9ja19mcmVlKGNvbnN0IHZvbGF0aWxlIGF0b21pYzxfSVRwPiogX19hKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS0+aXNfbG9ja19mcmVlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSB2b2lkCisgICAgYXRvbWljX2luaXQoYXRvbWljPF9JVHA+KiBfX2EsIF9JVHAgX19pKSBub2V4Y2VwdDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSB2b2lkCisgICAgYXRvbWljX2luaXQodm9sYXRpbGUgYXRvbWljPF9JVHA+KiBfX2EsIF9JVHAgX19pKSBub2V4Y2VwdDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSB2b2lkCisgICAgYXRvbWljX3N0b3JlX2V4cGxpY2l0KGF0b21pYzxfSVRwPiogX19hLCBfSVRwIF9faSwKKwkJCSAgbWVtb3J5X29yZGVyIF9fbSkgbm9leGNlcHQKKyAgICB7IF9fYS0+c3RvcmUoX19pLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIGF0b21pY19zdG9yZV9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWM8X0lUcD4qIF9fYSwgX0lUcCBfX2ksCisJCQkgIG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgICAgeyBfX2EtPnN0b3JlKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfbG9hZF9leHBsaWNpdChjb25zdCBhdG9taWM8X0lUcD4qIF9fYSwgbWVtb3J5X29yZGVyIF9fbSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2EtPmxvYWQoX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfbG9hZF9leHBsaWNpdChjb25zdCB2b2xhdGlsZSBhdG9taWM8X0lUcD4qIF9fYSwKKwkJCSBtZW1vcnlfb3JkZXIgX19tKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS0+bG9hZChfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19leGNoYW5nZV9leHBsaWNpdChhdG9taWM8X0lUcD4qIF9fYSwgX0lUcCBfX2ksCisJCQkgICAgIG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLT5leGNoYW5nZShfX2ksIF9fbSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwCisgICAgYXRvbWljX2V4Y2hhbmdlX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pYzxfSVRwPiogX19hLCBfSVRwIF9faSwKKwkJCSAgICAgbWVtb3J5X29yZGVyIF9fbSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2EtPmV4Y2hhbmdlKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBhdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrX2V4cGxpY2l0KGF0b21pYzxfSVRwPiogX19hLAorCQkJCQkgIF9JVHAqIF9faTEsIF9JVHAgX19pMiwKKwkJCQkJICBtZW1vcnlfb3JkZXIgX19tMSwKKwkJCQkJICBtZW1vcnlfb3JkZXIgX19tMikgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2EtPmNvbXBhcmVfZXhjaGFuZ2Vfd2VhaygqX19pMSwgX19pMiwgX19tMSwgX19tMik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBib29sCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vha19leHBsaWNpdCh2b2xhdGlsZSBhdG9taWM8X0lUcD4qIF9fYSwKKwkJCQkJICBfSVRwKiBfX2kxLCBfSVRwIF9faTIsCisJCQkJCSAgbWVtb3J5X29yZGVyIF9fbTEsCisJCQkJCSAgbWVtb3J5X29yZGVyIF9fbTIpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLT5jb21wYXJlX2V4Y2hhbmdlX3dlYWsoKl9faTEsIF9faTIsIF9fbTEsIF9fbTIpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdChhdG9taWM8X0lUcD4qIF9fYSwKKwkJCQkJICAgIF9JVHAqIF9faTEsIF9JVHAgX19pMiwKKwkJCQkJICAgIG1lbW9yeV9vcmRlciBfX20xLAorCQkJCQkgICAgbWVtb3J5X29yZGVyIF9fbTIpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLT5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZygqX19pMSwgX19pMiwgX19tMSwgX19tMik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBib29sCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pYzxfSVRwPiogX19hLAorCQkJCQkgICAgX0lUcCogX19pMSwgX0lUcCBfX2kyLAorCQkJCQkgICAgbWVtb3J5X29yZGVyIF9fbTEsCisJCQkJCSAgICBtZW1vcnlfb3JkZXIgX19tMikgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2EtPmNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKCpfX2kxLCBfX2kyLCBfX20xLCBfX20yKTsgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIGF0b21pY19zdG9yZShhdG9taWM8X0lUcD4qIF9fYSwgX0lUcCBfX2kpIG5vZXhjZXB0CisgICAgeyBhdG9taWNfc3RvcmVfZXhwbGljaXQoX19hLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBhdG9taWNfc3RvcmUodm9sYXRpbGUgYXRvbWljPF9JVHA+KiBfX2EsIF9JVHAgX19pKSBub2V4Y2VwdAorICAgIHsgYXRvbWljX3N0b3JlX2V4cGxpY2l0KF9fYSwgX19pLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwCisgICAgYXRvbWljX2xvYWQoY29uc3QgYXRvbWljPF9JVHA+KiBfX2EpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gYXRvbWljX2xvYWRfZXhwbGljaXQoX19hLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwCisgICAgYXRvbWljX2xvYWQoY29uc3Qgdm9sYXRpbGUgYXRvbWljPF9JVHA+KiBfX2EpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gYXRvbWljX2xvYWRfZXhwbGljaXQoX19hLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwCisgICAgYXRvbWljX2V4Y2hhbmdlKGF0b21pYzxfSVRwPiogX19hLCBfSVRwIF9faSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBhdG9taWNfZXhjaGFuZ2VfZXhwbGljaXQoX19hLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZXhjaGFuZ2Uodm9sYXRpbGUgYXRvbWljPF9JVHA+KiBfX2EsIF9JVHAgX19pKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIGF0b21pY19leGNoYW5nZV9leHBsaWNpdChfX2EsIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWsoYXRvbWljPF9JVHA+KiBfX2EsCisJCQkJIF9JVHAqIF9faTEsIF9JVHAgX19pMikgbm9leGNlcHQKKyAgICB7CisgICAgICByZXR1cm4gYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vha19leHBsaWNpdChfX2EsIF9faTEsIF9faTIsCisJCQkJCQkgICBtZW1vcnlfb3JkZXJfc2VxX2NzdCwKKwkJCQkJCSAgIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWsodm9sYXRpbGUgYXRvbWljPF9JVHA+KiBfX2EsCisJCQkJIF9JVHAqIF9faTEsIF9JVHAgX19pMikgbm9leGNlcHQKKyAgICB7CisgICAgICByZXR1cm4gYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vha19leHBsaWNpdChfX2EsIF9faTEsIF9faTIsCisJCQkJCQkgICBtZW1vcnlfb3JkZXJfc2VxX2NzdCwKKwkJCQkJCSAgIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhhdG9taWM8X0lUcD4qIF9fYSwKKwkJCQkgICBfSVRwKiBfX2kxLCBfSVRwIF9faTIpIG5vZXhjZXB0CisgICAgeworICAgICAgcmV0dXJuIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdChfX2EsIF9faTEsIF9faTIsCisJCQkJCQkgICAgIG1lbW9yeV9vcmRlcl9zZXFfY3N0LAorCQkJCQkJICAgICBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmcodm9sYXRpbGUgYXRvbWljPF9JVHA+KiBfX2EsCisJCQkJICAgX0lUcCogX19pMSwgX0lUcCBfX2kyKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIHJldHVybiBhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmdfZXhwbGljaXQoX19hLCBfX2kxLCBfX2kyLAorCQkJCQkJICAgICBtZW1vcnlfb3JkZXJfc2VxX2NzdCwKKwkJCQkJCSAgICAgbWVtb3J5X29yZGVyX3NlcV9jc3QpOworICAgIH0KKworICAvLyBGdW5jdGlvbiB0ZW1wbGF0ZXMgZm9yIGF0b21pY19pbnRlZ3JhbCBvcGVyYXRpb25zIG9ubHksIHVzaW5nCisgIC8vIF9fYXRvbWljX2Jhc2UuIFRlbXBsYXRlIGFyZ3VtZW50IHNob3VsZCBiZSBjb25zdHJpY3RlZCB0bworICAvLyBpbnRlcmdyYWwgdHlwZXMgYXMgc3BlY2lmaWVkIGluIHRoZSBzdGFuZGFyZCwgZXhjbHVkaW5nIGFkZHJlc3MKKyAgLy8gdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2ksCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfYWRkKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KHZvbGF0aWxlIF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2ksCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfYWRkKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfc3ViX2V4cGxpY2l0KF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2ksCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfc3ViKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfc3ViX2V4cGxpY2l0KHZvbGF0aWxlIF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2ksCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfc3ViKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfYW5kX2V4cGxpY2l0KF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2ksCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfYW5kKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfYW5kX2V4cGxpY2l0KHZvbGF0aWxlIF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2ksCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfYW5kKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfb3JfZXhwbGljaXQoX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSwKKwkJCSAgICAgbWVtb3J5X29yZGVyIF9fbSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2EtPmZldGNoX29yKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfb3JfZXhwbGljaXQodm9sYXRpbGUgX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSwKKwkJCSAgICAgbWVtb3J5X29yZGVyIF9fbSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2EtPmZldGNoX29yKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfeG9yX2V4cGxpY2l0KF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2ksCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfeG9yKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfeG9yX2V4cGxpY2l0KHZvbGF0aWxlIF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2ksCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfeG9yKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfYWRkKF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2kpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gYXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdChfX2EsIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF9hZGQodm9sYXRpbGUgX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBhdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KF9fYSwgX19pLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwCisgICAgYXRvbWljX2ZldGNoX3N1YihfX2F0b21pY19iYXNlPF9JVHA+KiBfX2EsIF9JVHAgX19pKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIGF0b21pY19mZXRjaF9zdWJfZXhwbGljaXQoX19hLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfc3ViKHZvbGF0aWxlIF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2kpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gYXRvbWljX2ZldGNoX3N1Yl9leHBsaWNpdChfX2EsIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF9hbmQoX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBhdG9taWNfZmV0Y2hfYW5kX2V4cGxpY2l0KF9fYSwgX19pLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwCisgICAgYXRvbWljX2ZldGNoX2FuZCh2b2xhdGlsZSBfX2F0b21pY19iYXNlPF9JVHA+KiBfX2EsIF9JVHAgX19pKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIGF0b21pY19mZXRjaF9hbmRfZXhwbGljaXQoX19hLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfb3IoX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBhdG9taWNfZmV0Y2hfb3JfZXhwbGljaXQoX19hLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfb3Iodm9sYXRpbGUgX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBhdG9taWNfZmV0Y2hfb3JfZXhwbGljaXQoX19hLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfeG9yKF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2kpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gYXRvbWljX2ZldGNoX3hvcl9leHBsaWNpdChfX2EsIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF94b3Iodm9sYXRpbGUgX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBhdG9taWNfZmV0Y2hfeG9yX2V4cGxpY2l0KF9fYSwgX19pLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworCisgIC8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb25zIGZvciBwb2ludGVycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcCoKKyAgICBhdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KGF0b21pYzxfSVRwKj4qIF9fYSwgcHRyZGlmZl90IF9fZCwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLT5mZXRjaF9hZGQoX19kLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcCoKKyAgICBhdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pYzxfSVRwKj4qIF9fYSwgcHRyZGlmZl90IF9fZCwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLT5mZXRjaF9hZGQoX19kLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcCoKKyAgICBhdG9taWNfZmV0Y2hfYWRkKHZvbGF0aWxlIGF0b21pYzxfSVRwKj4qIF9fYSwgcHRyZGlmZl90IF9fZCkgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2EtPmZldGNoX2FkZChfX2QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcCoKKyAgICBhdG9taWNfZmV0Y2hfYWRkKGF0b21pYzxfSVRwKj4qIF9fYSwgcHRyZGlmZl90IF9fZCkgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2EtPmZldGNoX2FkZChfX2QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcCoKKyAgICBhdG9taWNfZmV0Y2hfc3ViX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pYzxfSVRwKj4qIF9fYSwKKwkJCSAgICAgIHB0cmRpZmZfdCBfX2QsIG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLT5mZXRjaF9zdWIoX19kLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcCoKKyAgICBhdG9taWNfZmV0Y2hfc3ViX2V4cGxpY2l0KGF0b21pYzxfSVRwKj4qIF9fYSwgcHRyZGlmZl90IF9fZCwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLT5mZXRjaF9zdWIoX19kLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcCoKKyAgICBhdG9taWNfZmV0Y2hfc3ViKHZvbGF0aWxlIGF0b21pYzxfSVRwKj4qIF9fYSwgcHRyZGlmZl90IF9fZCkgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2EtPmZldGNoX3N1YihfX2QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcCoKKyAgICBhdG9taWNfZmV0Y2hfc3ViKGF0b21pYzxfSVRwKj4qIF9fYSwgcHRyZGlmZl90IF9fZCkgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2EtPmZldGNoX3N1YihfX2QpOyB9CisgIC8vIEB9IGdyb3VwIGF0b21pY3MKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYmFja3dhcmQvYXV0b19wdHIuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYmFja3dhcmQvYXV0b19wdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2M5ZDJmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iYWNrd2FyZC9hdXRvX3B0ci5oCkBAIC0wLDAgKzEsMzI5IEBACisvLyBhdXRvX3B0ciBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYmFja3dhcmQvYXV0b19wdHIuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le21lbW9yeX0KKyAqLworCisjaWZuZGVmIF9CQUNLV0FSRF9BVVRPX1BUUl9ICisjZGVmaW5lIF9CQUNLV0FSRF9BVVRPX1BUUl9IIDEKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQSB3cmFwcGVyIGNsYXNzIHRvIHByb3ZpZGUgYXV0b19wdHIgd2l0aCByZWZlcmVuY2Ugc2VtYW50aWNzLgorICAgKiAgRm9yIGV4YW1wbGUsIGFuIGF1dG9fcHRyIGNhbiBiZSBhc3NpZ25lZCAob3IgY29uc3RydWN0ZWQgZnJvbSkKKyAgICogIHRoZSByZXN1bHQgb2YgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIGF1dG9fcHRyIGJ5IHZhbHVlLgorICAgKgorICAgKiAgQWxsIHRoZSBhdXRvX3B0cl9yZWYgc3R1ZmYgc2hvdWxkIGhhcHBlbiBiZWhpbmQgdGhlIHNjZW5lcy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgc3RydWN0IGF1dG9fcHRyX3JlZgorICAgIHsKKyAgICAgIF9UcDEqIF9NX3B0cjsKKyAgICAgIAorICAgICAgZXhwbGljaXQKKyAgICAgIGF1dG9fcHRyX3JlZihfVHAxKiBfX3ApOiBfTV9wdHIoX19wKSB7IH0KKyAgICB9IF9HTElCQ1hYX0RFUFJFQ0FURUQ7CisKKworICAvKioKKyAgICogIEBicmllZiAgQSBzaW1wbGUgc21hcnQgcG9pbnRlciBwcm92aWRpbmcgc3RyaWN0IG93bmVyc2hpcCBzZW1hbnRpY3MuCisgICAqCisgICAqICBUaGUgU3RhbmRhcmQgc2F5czoKKyAgICogIDxwcmU+CisgICAqICBBbiBAYyBhdXRvX3B0ciBvd25zIHRoZSBvYmplY3QgaXQgaG9sZHMgYSBwb2ludGVyIHRvLiAgQ29weWluZworICAgKiAgYW4gQGMgYXV0b19wdHIgY29waWVzIHRoZSBwb2ludGVyIGFuZCB0cmFuc2ZlcnMgb3duZXJzaGlwIHRvIHRoZQorICAgKiAgZGVzdGluYXRpb24uICBJZiBtb3JlIHRoYW4gb25lIEBjIGF1dG9fcHRyIG93bnMgdGhlIHNhbWUgb2JqZWN0CisgICAqICBhdCB0aGUgc2FtZSB0aW1lIHRoZSBiZWhhdmlvciBvZiB0aGUgcHJvZ3JhbSBpcyB1bmRlZmluZWQuCisgICAqCisgICAqICBUaGUgdXNlcyBvZiBAYyBhdXRvX3B0ciBpbmNsdWRlIHByb3ZpZGluZyB0ZW1wb3JhcnkKKyAgICogIGV4Y2VwdGlvbi1zYWZldHkgZm9yIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBtZW1vcnksIHBhc3NpbmcKKyAgICogIG93bmVyc2hpcCBvZiBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtb3J5IHRvIGEgZnVuY3Rpb24sIGFuZAorICAgKiAgcmV0dXJuaW5nIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBtZW1vcnkgZnJvbSBhIGZ1bmN0aW9uLiAgQGMKKyAgICogIGF1dG9fcHRyIGRvZXMgbm90IG1lZXQgdGhlIENvcHlDb25zdHJ1Y3RpYmxlIGFuZCBBc3NpZ25hYmxlCisgICAqICByZXF1aXJlbWVudHMgZm9yIFN0YW5kYXJkIExpYnJhcnkgPGEKKyAgICogIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+IGVsZW1lbnRzIGFuZCB0aHVzCisgICAqICBpbnN0YW50aWF0aW5nIGEgU3RhbmRhcmQgTGlicmFyeSBjb250YWluZXIgd2l0aCBhbiBAYyBhdXRvX3B0cgorICAgKiAgcmVzdWx0cyBpbiB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAqICA8L3ByZT4KKyAgICogIFF1b3RlZCBmcm9tIFsyMC40LjVdLzMuCisgICAqCisgICAqICBHb29kIGV4YW1wbGVzIG9mIHdoYXQgY2FuIGFuZCBjYW5ub3QgYmUgZG9uZSB3aXRoIGF1dG9fcHRyIGNhbgorICAgKiAgYmUgZm91bmQgaW4gdGhlIGxpYnN0ZGMrKyB0ZXN0c3VpdGUuCisgICAqCisgICAqICBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAqICAxMjcuICBhdXRvX3B0cjw+IGNvbnZlcnNpb24gaXNzdWVzCisgICAqICBUaGVzZSByZXNvbHV0aW9ucyBoYXZlIGFsbCBiZWVuIGluY29ycG9yYXRlZC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBhdXRvX3B0cgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgX1RwKiBfTV9wdHI7CisgICAgICAKKyAgICBwdWJsaWM6CisgICAgICAvLy8gVGhlIHBvaW50ZWQtdG8gdHlwZS4KKyAgICAgIHR5cGVkZWYgX1RwIGVsZW1lbnRfdHlwZTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBbiAlYXV0b19wdHIgaXMgdXN1YWxseSBjb25zdHJ1Y3RlZCBmcm9tIGEgcmF3IHBvaW50ZXIuCisgICAgICAgKiAgQHBhcmFtICBfX3AgIEEgcG9pbnRlciAoZGVmYXVsdHMgdG8gTlVMTCkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgb2JqZWN0IG5vdyBAZSBvd25zIHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSBAYSBfX3AuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBhdXRvX3B0cihlbGVtZW50X3R5cGUqIF9fcCA9IDApIHRocm93KCkgOiBfTV9wdHIoX19wKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBbiAlYXV0b19wdHIgY2FuIGJlIGNvbnN0cnVjdGVkIGZyb20gYW5vdGhlciAlYXV0b19wdHIuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFub3RoZXIgJWF1dG9fcHRyIG9mIHRoZSBzYW1lIHR5cGUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgb2JqZWN0IG5vdyBAZSBvd25zIHRoZSBvYmplY3QgcHJldmlvdXNseSBvd25lZCBieSBAYSBfX2EsCisgICAgICAgKiAgd2hpY2ggaGFzIGdpdmVuIHVwIG93bmVyc2hpcC4KKyAgICAgICAqLworICAgICAgYXV0b19wdHIoYXV0b19wdHImIF9fYSkgdGhyb3coKSA6IF9NX3B0cihfX2EucmVsZWFzZSgpKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBbiAlYXV0b19wdHIgY2FuIGJlIGNvbnN0cnVjdGVkIGZyb20gYW5vdGhlciAlYXV0b19wdHIuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFub3RoZXIgJWF1dG9fcHRyIG9mIGEgZGlmZmVyZW50IGJ1dCByZWxhdGVkIHR5cGUuCisgICAgICAgKgorICAgICAgICogIEEgcG9pbnRlci10by1UcDEgbXVzdCBiZSBjb252ZXJ0aWJsZSB0byBhCisgICAgICAgKiAgcG9pbnRlci10by1UcC9lbGVtZW50X3R5cGUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgb2JqZWN0IG5vdyBAZSBvd25zIHRoZSBvYmplY3QgcHJldmlvdXNseSBvd25lZCBieSBAYSBfX2EsCisgICAgICAgKiAgd2hpY2ggaGFzIGdpdmVuIHVwIG93bmVyc2hpcC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgYXV0b19wdHIoYXV0b19wdHI8X1RwMT4mIF9fYSkgdGhyb3coKSA6IF9NX3B0cihfX2EucmVsZWFzZSgpKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlYXV0b19wdHIgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW5vdGhlciAlYXV0b19wdHIgb2YgdGhlIHNhbWUgdHlwZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvYmplY3Qgbm93IEBlIG93bnMgdGhlIG9iamVjdCBwcmV2aW91c2x5IG93bmVkIGJ5IEBhIF9fYSwKKyAgICAgICAqICB3aGljaCBoYXMgZ2l2ZW4gdXAgb3duZXJzaGlwLiAgVGhlIG9iamVjdCB0aGF0IHRoaXMgb25lIEBlCisgICAgICAgKiAgdXNlZCB0byBvd24gYW5kIHRyYWNrIGhhcyBiZWVuIGRlbGV0ZWQuCisgICAgICAgKi8KKyAgICAgIGF1dG9fcHRyJgorICAgICAgb3BlcmF0b3I9KGF1dG9fcHRyJiBfX2EpIHRocm93KCkKKyAgICAgIHsKKwlyZXNldChfX2EucmVsZWFzZSgpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJWF1dG9fcHRyIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFub3RoZXIgJWF1dG9fcHRyIG9mIGEgZGlmZmVyZW50IGJ1dCByZWxhdGVkIHR5cGUuCisgICAgICAgKgorICAgICAgICogIEEgcG9pbnRlci10by1UcDEgbXVzdCBiZSBjb252ZXJ0aWJsZSB0byBhIHBvaW50ZXItdG8tVHAvZWxlbWVudF90eXBlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9iamVjdCBub3cgQGUgb3ducyB0aGUgb2JqZWN0IHByZXZpb3VzbHkgb3duZWQgYnkgQGEgX19hLAorICAgICAgICogIHdoaWNoIGhhcyBnaXZlbiB1cCBvd25lcnNoaXAuICBUaGUgb2JqZWN0IHRoYXQgdGhpcyBvbmUgQGUKKyAgICAgICAqICB1c2VkIHRvIG93biBhbmQgdHJhY2sgaGFzIGJlZW4gZGVsZXRlZC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgYXV0b19wdHImCisgICAgICAgIG9wZXJhdG9yPShhdXRvX3B0cjxfVHAxPiYgX19hKSB0aHJvdygpCisgICAgICAgIHsKKwkgIHJlc2V0KF9fYS5yZWxlYXNlKCkpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgLyoqCisgICAgICAgKiAgV2hlbiB0aGUgJWF1dG9fcHRyIGdvZXMgb3V0IG9mIHNjb3BlLCB0aGUgb2JqZWN0IGl0IG93bnMgaXMKKyAgICAgICAqICBkZWxldGVkLiAgSWYgaXQgbm8gbG9uZ2VyIG93bnMgYW55dGhpbmcgKGkuZS4sIEBjIGdldCgpIGlzCisgICAgICAgKiAgQGMgTlVMTCksIHRoZW4gdGhpcyBoYXMgbm8gZWZmZWN0LgorICAgICAgICoKKyAgICAgICAqICBUaGUgQysrIHN0YW5kYXJkIHNheXMgdGhlcmUgaXMgc3VwcG9zZWQgdG8gYmUgYW4gZW1wdHkgdGhyb3cKKyAgICAgICAqICBzcGVjaWZpY2F0aW9uIGhlcmUsIGJ1dCBvbWl0dGluZyBpdCBpcyBzdGFuZGFyZCBjb25mb3JtaW5nLiAgSXRzCisgICAgICAgKiAgcHJlc2VuY2UgY2FuIGJlIGRldGVjdGVkIG9ubHkgaWYgX1RwOjp+X1RwKCkgdGhyb3dzLCBidXQgdGhpcyBpcworICAgICAgICogIHByb2hpYml0ZWQuICBbMTcuNC4zLjZdLzIKKyAgICAgICAqLworICAgICAgfmF1dG9fcHRyKCkgeyBkZWxldGUgX01fcHRyOyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU21hcnQgcG9pbnRlciBkZXJlZmVyZW5jaW5nLgorICAgICAgICoKKyAgICAgICAqICBJZiB0aGlzICVhdXRvX3B0ciBubyBsb25nZXIgb3ducyBhbnl0aGluZywgdGhlbiB0aGlzCisgICAgICAgKiAgb3BlcmF0aW9uIHdpbGwgY3Jhc2guICAoRm9yIGEgc21hcnQgcG9pbnRlciwgPGVtPm5vIGxvbmdlciBvd25zCisgICAgICAgKiAgYW55dGhpbmc8L2VtPiBpcyB0aGUgc2FtZSBhcyBiZWluZyBhIG51bGwgcG9pbnRlciwgYW5kIHlvdSBrbm93CisgICAgICAgKiAgd2hhdCBoYXBwZW5zIHdoZW4geW91IGRlcmVmZXJlbmNlIG9uZSBvZiB0aG9zZS4uLikKKyAgICAgICAqLworICAgICAgZWxlbWVudF90eXBlJgorICAgICAgb3BlcmF0b3IqKCkgY29uc3QgdGhyb3coKSAKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fcHRyICE9IDApOworCXJldHVybiAqX01fcHRyOyAKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTbWFydCBwb2ludGVyIGRlcmVmZXJlbmNpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgcmV0dXJucyB0aGUgcG9pbnRlciBpdHNlbGYsIHdoaWNoIHRoZSBsYW5ndWFnZSB0aGVuIHdpbGwKKyAgICAgICAqICBhdXRvbWF0aWNhbGx5IGNhdXNlIHRvIGJlIGRlcmVmZXJlbmNlZC4KKyAgICAgICAqLworICAgICAgZWxlbWVudF90eXBlKgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0IHRocm93KCkgCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX3B0ciAhPSAwKTsKKwlyZXR1cm4gX01fcHRyOyAKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCeXBhc3NpbmcgdGhlIHNtYXJ0IHBvaW50ZXIuCisgICAgICAgKiAgQHJldHVybiAgVGhlIHJhdyBwb2ludGVyIGJlaW5nIG1hbmFnZWQuCisgICAgICAgKgorICAgICAgICogIFlvdSBjYW4gZ2V0IGEgY29weSBvZiB0aGUgcG9pbnRlciB0aGF0IHRoaXMgb2JqZWN0IG93bnMsIGZvcgorICAgICAgICogIHNpdHVhdGlvbnMgc3VjaCBhcyBwYXNzaW5nIHRvIGEgZnVuY3Rpb24gd2hpY2ggb25seSBhY2NlcHRzCisgICAgICAgKiAgYSByYXcgcG9pbnRlci4KKyAgICAgICAqCisgICAgICAgKiAgQG5vdGUgIFRoaXMgJWF1dG9fcHRyIHN0aWxsIG93bnMgdGhlIG1lbW9yeS4KKyAgICAgICAqLworICAgICAgZWxlbWVudF90eXBlKgorICAgICAgZ2V0KCkgY29uc3QgdGhyb3coKSB7IHJldHVybiBfTV9wdHI7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCeXBhc3NpbmcgdGhlIHNtYXJ0IHBvaW50ZXIuCisgICAgICAgKiAgQHJldHVybiAgVGhlIHJhdyBwb2ludGVyIGJlaW5nIG1hbmFnZWQuCisgICAgICAgKgorICAgICAgICogIFlvdSBjYW4gZ2V0IGEgY29weSBvZiB0aGUgcG9pbnRlciB0aGF0IHRoaXMgb2JqZWN0IG93bnMsIGZvcgorICAgICAgICogIHNpdHVhdGlvbnMgc3VjaCBhcyBwYXNzaW5nIHRvIGEgZnVuY3Rpb24gd2hpY2ggb25seSBhY2NlcHRzCisgICAgICAgKiAgYSByYXcgcG9pbnRlci4KKyAgICAgICAqCisgICAgICAgKiAgQG5vdGUgIFRoaXMgJWF1dG9fcHRyIG5vIGxvbmdlciBvd25zIHRoZSBtZW1vcnkuICBXaGVuIHRoaXMgb2JqZWN0CisgICAgICAgKiAgZ29lcyBvdXQgb2Ygc2NvcGUsIG5vdGhpbmcgd2lsbCBoYXBwZW4uCisgICAgICAgKi8KKyAgICAgIGVsZW1lbnRfdHlwZSoKKyAgICAgIHJlbGVhc2UoKSB0aHJvdygpCisgICAgICB7CisJZWxlbWVudF90eXBlKiBfX3RtcCA9IF9NX3B0cjsKKwlfTV9wdHIgPSAwOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGb3JjaWJseSBkZWxldGVzIHRoZSBtYW5hZ2VkIG9iamVjdC4KKyAgICAgICAqICBAcGFyYW0gIF9fcCAgQSBwb2ludGVyIChkZWZhdWx0cyB0byBOVUxMKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvYmplY3Qgbm93IEBlIG93bnMgdGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5IEBhIF9fcC4gIFRoZQorICAgICAgICogIHByZXZpb3VzIG9iamVjdCBoYXMgYmVlbiBkZWxldGVkLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldChlbGVtZW50X3R5cGUqIF9fcCA9IDApIHRocm93KCkKKyAgICAgIHsKKwlpZiAoX19wICE9IF9NX3B0cikKKwkgIHsKKwkgICAgZGVsZXRlIF9NX3B0cjsKKwkgICAgX01fcHRyID0gX19wOworCSAgfQorICAgICAgfQorICAgICAgCisgICAgICAvKiogCisgICAgICAgKiAgQGJyaWVmICBBdXRvbWF0aWMgY29udmVyc2lvbnMKKyAgICAgICAqCisgICAgICAgKiAgVGhlc2Ugb3BlcmF0aW9ucyBjb252ZXJ0IGFuICVhdXRvX3B0ciBpbnRvIGFuZCBmcm9tIGFuIGF1dG9fcHRyX3JlZgorICAgICAgICogIGF1dG9tYXRpY2FsbHkgYXMgbmVlZGVkLiAgVGhpcyBhbGxvd3MgY29uc3RydWN0cyBzdWNoIGFzCisgICAgICAgKiAgQGNvZGUKKyAgICAgICAqICAgIGF1dG9fcHRyPERlcml2ZWQ+ICBmdW5jX3JldHVybmluZ19hdXRvX3B0ciguLi4uLik7CisgICAgICAgKiAgICAuLi4KKyAgICAgICAqICAgIGF1dG9fcHRyPEJhc2U+IHB0ciA9IGZ1bmNfcmV0dXJuaW5nX2F1dG9fcHRyKC4uLi4uKTsKKyAgICAgICAqICBAZW5kY29kZQorICAgICAgICovCisgICAgICBhdXRvX3B0cihhdXRvX3B0cl9yZWY8ZWxlbWVudF90eXBlPiBfX3JlZikgdGhyb3coKQorICAgICAgOiBfTV9wdHIoX19yZWYuX01fcHRyKSB7IH0KKyAgICAgIAorICAgICAgYXV0b19wdHImCisgICAgICBvcGVyYXRvcj0oYXV0b19wdHJfcmVmPGVsZW1lbnRfdHlwZT4gX19yZWYpIHRocm93KCkKKyAgICAgIHsKKwlpZiAoX19yZWYuX01fcHRyICE9IHRoaXMtPmdldCgpKQorCSAgeworCSAgICBkZWxldGUgX01fcHRyOworCSAgICBfTV9wdHIgPSBfX3JlZi5fTV9wdHI7CisJICB9CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgICAgCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBvcGVyYXRvciBhdXRvX3B0cl9yZWY8X1RwMT4oKSB0aHJvdygpCisgICAgICAgIHsgcmV0dXJuIGF1dG9fcHRyX3JlZjxfVHAxPih0aGlzLT5yZWxlYXNlKCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIG9wZXJhdG9yIGF1dG9fcHRyPF9UcDE+KCkgdGhyb3coKQorICAgICAgICB7IHJldHVybiBhdXRvX3B0cjxfVHAxPih0aGlzLT5yZWxlYXNlKCkpOyB9CisgICAgfSBfR0xJQkNYWF9ERVBSRUNBVEVEOworCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gNTQxLiBzaGFyZWRfcHRyIHRlbXBsYXRlIGFzc2lnbm1lbnQgYW5kIHZvaWQKKyAgdGVtcGxhdGU8PgorICAgIGNsYXNzIGF1dG9fcHRyPHZvaWQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdm9pZCBlbGVtZW50X3R5cGU7CisgICAgfSBfR0xJQkNYWF9ERVBSRUNBVEVEOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTxfTG9ja19wb2xpY3kgX0xwPgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lCisgICAgX19zaGFyZWRfY291bnQ8X0xwPjo6X19zaGFyZWRfY291bnQoc3RkOjphdXRvX3B0cjxfVHA+JiYgX19yKQorICAgIDogX01fcGkobmV3IF9TcF9jb3VudGVkX3B0cjxfVHAqLCBfTHA+KF9fci5nZXQoKSkpCisgICAgeyBfX3IucmVsZWFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgIGlubGluZQorICAgIF9fc2hhcmVkX3B0cjxfVHAsIF9McD46Ol9fc2hhcmVkX3B0cihzdGQ6OmF1dG9fcHRyPF9UcDE+JiYgX19yKQorICAgIDogX01fcHRyKF9fci5nZXQoKSksIF9NX3JlZmNvdW50KCkKKyAgICB7CisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVHAxKiwgX1RwKj4pCisgICAgICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoX1RwMSkgPiAwLCAiaW5jb21wbGV0ZSB0eXBlIiApOworICAgICAgX1RwMSogX190bXAgPSBfX3IuZ2V0KCk7CisgICAgICBfTV9yZWZjb3VudCA9IF9fc2hhcmVkX2NvdW50PF9McD4oc3RkOjptb3ZlKF9fcikpOworICAgICAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoX01fcmVmY291bnQsIF9fdG1wLCBfX3RtcCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICBpbmxpbmUKKyAgICBzaGFyZWRfcHRyPF9UcD46OnNoYXJlZF9wdHIoc3RkOjphdXRvX3B0cjxfVHAxPiYmIF9fcikKKyAgICA6IF9fc2hhcmVkX3B0cjxfVHA+KHN0ZDo6bW92ZShfX3IpKSB7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcD4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwLCB0eXBlbmFtZT4KKyAgICBpbmxpbmUKKyAgICB1bmlxdWVfcHRyPF9UcCwgX0RwPjo6dW5pcXVlX3B0cihhdXRvX3B0cjxfVXA+JiYgX191KSBub2V4Y2VwdAorICAgIDogX01fdChfX3UucmVsZWFzZSgpLCBkZWxldGVyX3R5cGUoKSkgeyB9CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0JBQ0tXQVJEX0FVVE9fUFRSX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYmFja3dhcmQvYmFja3dhcmRfd2FybmluZy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iYWNrd2FyZC9iYWNrd2FyZF93YXJuaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg3ZDUyOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYmFja3dhcmQvYmFja3dhcmRfd2FybmluZy5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiYWNrd2FyZC9iYWNrd2FyZF93YXJuaW5nLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpb3Nmd2R9CisgKi8KKworI2lmbmRlZiBfQkFDS1dBUkRfQkFDS1dBUkRfV0FSTklOR19ICisjZGVmaW5lIF9CQUNLV0FSRF9CQUNLV0FSRF9XQVJOSU5HX0ggMQorCisjaWZkZWYgX19ERVBSRUNBVEVECisjd2FybmluZyBcCisgIFRoaXMgZmlsZSBpbmNsdWRlcyBhdCBsZWFzdCBvbmUgZGVwcmVjYXRlZCBvciBhbnRpcXVhdGVkIGhlYWRlciB3aGljaCBcCisgIG1heSBiZSByZW1vdmVkIHdpdGhvdXQgZnVydGhlciBub3RpY2UgYXQgYSBmdXR1cmUgZGF0ZS4gUGxlYXNlIHVzZSBhIFwKKyAgbm9uLWRlcHJlY2F0ZWQgaW50ZXJmYWNlIHdpdGggZXF1aXZhbGVudCBmdW5jdGlvbmFsaXR5IGluc3RlYWQuIEZvciBhIFwKKyAgbGlzdGluZyBvZiByZXBsYWNlbWVudCBoZWFkZXJzIGFuZCBpbnRlcmZhY2VzLCBjb25zdWx0IHRoZSBmaWxlIFwKKyAgYmFja3dhcmRfd2FybmluZy5oLiBUbyBkaXNhYmxlIHRoaXMgd2FybmluZyB1c2UgLVduby1kZXByZWNhdGVkLgorCisvKgorICBBIGxpc3Qgb2YgdmFsaWQgcmVwbGFjZW1lbnRzIGlzIGFzIGZvbGxvd3M6CisKKyAgVXNlOgkJCQkJSW5zdGVhZCBvZjoKKyAgPHNzdHJlYW0+LCBiYXNpY19zdHJpbmdidWYJICAgCTxzdHJzdHJlYW0+LCBzdHJzdHJlYW1idWYKKyAgPHNzdHJlYW0+LCBiYXNpY19pc3RyaW5nc3RyZWFtCTxzdHJzdHJlYW0+LCBpc3Ryc3RyZWFtCisgIDxzc3RyZWFtPiwgYmFzaWNfb3N0cmluZ3N0cmVhbQk8c3Ryc3RyZWFtPiwgb3N0cnN0cmVhbQorICA8c3N0cmVhbT4sIGJhc2ljX3N0cmluZ3N0cmVhbQkJPHN0cnN0cmVhbT4sIHN0cnN0cmVhbQorICA8dW5vcmRlcmVkX3NldD4sIHVub3JkZXJlZF9zZXQgICAgIAk8ZXh0L2hhc2hfc2V0PiwgaGFzaF9zZXQKKyAgPHVub3JkZXJlZF9zZXQ+LCB1bm9yZGVyZWRfbXVsdGlzZXQJPGV4dC9oYXNoX3NldD4sIGhhc2hfbXVsdGlzZXQKKyAgPHVub3JkZXJlZF9tYXA+LCB1bm9yZGVyZWRfbWFwCTxleHQvaGFzaF9tYXA+LCBoYXNoX21hcAorICA8dW5vcmRlcmVkX21hcD4sIHVub3JkZXJlZF9tdWx0aW1hcAk8ZXh0L2hhc2hfbWFwPiwgaGFzaF9tdWx0aW1hcAorICA8ZnVuY3Rpb25hbD4sIGJpbmQJCQk8ZnVuY3Rpb25hbD4sIGJpbmRlcjFzdAorICA8ZnVuY3Rpb25hbD4sIGJpbmQJCQk8ZnVuY3Rpb25hbD4sIGJpbmRlcjJuZAorICA8ZnVuY3Rpb25hbD4sIGJpbmQJCQk8ZnVuY3Rpb25hbD4sIGJpbmQxc3QKKyAgPGZ1bmN0aW9uYWw+LCBiaW5kCQkJPGZ1bmN0aW9uYWw+LCBiaW5kMm5kCisgIDxtZW1vcnk+LCB1bmlxdWVfcHRyICAgICAgIAkJPG1lbW9yeT4sIGF1dG9fcHRyCisqLworCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JhY2t3YXJkL2JpbmRlcnMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYmFja3dhcmQvYmluZGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YmUwMjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JhY2t3YXJkL2JpbmRlcnMuaApAQCAtMCwwICsxLDE3NiBAQAorLy8gRnVuY3RvciBpbXBsZW1lbnRhdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OAorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJhY2t3YXJkL2JpbmRlcnMuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2Z1bmN0aW9uYWx9CisgKi8KKworI2lmbmRlZiBfQkFDS1dBUkRfQklOREVSU19ICisjZGVmaW5lIF9CQUNLV0FSRF9CSU5ERVJTX0ggMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gMjAuMy42IGJpbmRlcnMKKyAgLyoqIEBkZWZncm91cCBiaW5kZXJzIEJpbmRlciBDbGFzc2VzCisgICAqIEBpbmdyb3VwIGZ1bmN0b3JzCisgICAqCisgICAqICBCaW5kZXJzIHR1cm4gZnVuY3Rpb25zL2Z1bmN0b3JzIHdpdGggdHdvIGFyZ3VtZW50cyBpbnRvIGZ1bmN0b3JzCisgICAqICB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50LCBzdG9yaW5nIGFuIGFyZ3VtZW50IHRvIGJlIGFwcGxpZWQgbGF0ZXIuCisgICAqICBGb3IgZXhhbXBsZSwgYSB2YXJpYWJsZSBAYyBCIG9mIHR5cGUgQGMgYmluZGVyMXN0IGlzIGNvbnN0cnVjdGVkCisgICAqICBmcm9tIGEgZnVuY3RvciBAYyBmIGFuZCBhbiBhcmd1bWVudCBAYyB4LiBMYXRlciwgQidzIEBjCisgICAqICBvcGVyYXRvcigpIGlzIGNhbGxlZCB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50IEBjIHkuIFRoZSByZXR1cm4KKyAgICogIHZhbHVlIGlzIHRoZSB2YWx1ZSBvZiBAYyBmKHgseSkuIEBjIEIgY2FuIGJlIEBhIGNhbGxlZCB3aXRoCisgICAqICB2YXJpb3VzIGFyZ3VtZW50cyAoeTEsIHkyLCAuLi4pIGFuZCB3aWxsIGluIHR1cm4gY2FsbCBAYworICAgKiAgZih4LHkxKSwgQGMgZih4LHkyKSwgLi4uCisgICAqCisgICAqICBUaGUgZnVuY3Rpb24gQGMgYmluZDFzdCBpcyBwcm92aWRlZCB0byBzYXZlIHNvbWUgdHlwaW5nLiBJdCB0YWtlcyB0aGUKKyAgICogIGZ1bmN0aW9uIGFuZCBhbiBhcmd1bWVudCBhcyBwYXJhbWV0ZXJzLCBhbmQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZgorICAgKiAgQGMgYmluZGVyMXN0LgorICAgKgorICAgKiAgVGhlIHR5cGUgQGMgYmluZGVyMm5kIGFuZCBpdHMgY3JlYXRvciBmdW5jdGlvbiBAYyBiaW5kMm5kIGRvIHRoZSBzYW1lCisgICAqICB0aGluZywgYnV0IHRoZSBzdG9yZWQgYXJndW1lbnQgaXMgcGFzc2VkIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGluc3RlYWQKKyAgICogIG9mIHRoZSBmaXJzdCwgZS5nLiwgQGMgYmluZDJuZChzdGQ6Om1pbnVzPGZsb2F0PigpLDEuMykgd2lsbCBjcmVhdGUgYQorICAgKiAgZnVuY3RvciB3aG9zZSBAYyBvcGVyYXRvcigpIGFjY2VwdHMgYSBmbG9hdGluZy1wb2ludCBudW1iZXIsIHN1YnRyYWN0cworICAgKiAgMS4zIGZyb20gaXQsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuIChJZiBAYyBiaW5kMXN0IGhhZCBiZWVuIHVzZWQsCisgICAqICB0aGUgZnVuY3RvciB3b3VsZCBwZXJmb3JtIDxlbT4xLjMgLSB4PC9lbT4gaW5zdGVhZC4KKyAgICoKKyAgICogIENyZWF0b3Itd3JhcHBlciBmdW5jdGlvbnMgbGlrZSBAYyBiaW5kMXN0IGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGluCisgICAqICBjYWxsaW5nIGFsZ29yaXRobXMuIFRoZWlyIHJldHVybiB2YWx1ZXMgd2lsbCBiZSB0ZW1wb3Jhcnkgb2JqZWN0cy4KKyAgICogIChUaGUgZ29hbCBpcyB0byBub3QgcmVxdWlyZSB5b3UgdG8gdHlwZSBuYW1lcyBsaWtlCisgICAqICBAYyBzdGQ6OmJpbmRlcjFzdDxzdGQ6OnBsdXM8aW50Pj4gZm9yIGRlY2xhcmluZyBhIHZhcmlhYmxlIHRvIGhvbGQgdGhlCisgICAqICByZXR1cm4gdmFsdWUgZnJvbSBAYyBiaW5kMXN0KHN0ZDo6cGx1czxpbnQ+KCksNSkuCisgICAqCisgICAqICBUaGVzZSBiZWNvbWUgbW9yZSB1c2VmdWwgd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBjb21wb3NpdGlvbiBmdW5jdGlvbnMuCisgICAqCisgICAqICBUaGVzZSBmdW5jdGlvbnMgYXJlIGRlcHJlY2F0ZWQgaW4gQysrMTEgYW5kIGNhbiBiZSByZXBsYWNlZCBieQorICAgKiAgQGMgc3RkOjpiaW5kIChvciBAYyBzdGQ6OnRyMTo6YmluZCkgd2hpY2ggaXMgbW9yZSBwb3dlcmZ1bCBhbmQgZmxleGlibGUsCisgICAqICBzdXBwb3J0aW5nIGZ1bmN0aW9ucyB3aXRoIGFueSBudW1iZXIgb2YgYXJndW1lbnRzLiAgVXNlcyBvZiBAYyBiaW5kMXN0CisgICAqICBjYW4gYmUgcmVwbGFjZWQgYnkgQGMgc3RkOjpiaW5kKGYsIHgsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkgYW5kCisgICAqICBAYyBiaW5kMm5kIGJ5IEBjIHN0ZDo6YmluZChmLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEsIHgpLgorICAgKiAgQHsKKyAgICovCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGJpbmRlcnMgYmluZGVyIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9PcGVyYXRpb24+CisgICAgY2xhc3MgYmluZGVyMXN0CisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX09wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUsCisJCQkgICAgdHlwZW5hbWUgX09wZXJhdGlvbjo6cmVzdWx0X3R5cGU+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIF9PcGVyYXRpb24gb3A7CisgICAgICB0eXBlbmFtZSBfT3BlcmF0aW9uOjpmaXJzdF9hcmd1bWVudF90eXBlIHZhbHVlOworCisgICAgcHVibGljOgorICAgICAgYmluZGVyMXN0KGNvbnN0IF9PcGVyYXRpb24mIF9feCwKKwkJY29uc3QgdHlwZW5hbWUgX09wZXJhdGlvbjo6Zmlyc3RfYXJndW1lbnRfdHlwZSYgX195KQorICAgICAgOiBvcChfX3gpLCB2YWx1ZShfX3kpIHsgfQorCisgICAgICB0eXBlbmFtZSBfT3BlcmF0aW9uOjpyZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKShjb25zdCB0eXBlbmFtZSBfT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gb3AodmFsdWUsIF9feCk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTA5LiAgTWlzc2luZyBiaW5kZXJzIGZvciBub24tY29uc3Qgc2VxdWVuY2UgZWxlbWVudHMKKyAgICAgIHR5cGVuYW1lIF9PcGVyYXRpb246OnJlc3VsdF90eXBlCisgICAgICBvcGVyYXRvcigpKHR5cGVuYW1lIF9PcGVyYXRpb246OnNlY29uZF9hcmd1bWVudF90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBvcCh2YWx1ZSwgX194KTsgfQorICAgIH0gX0dMSUJDWFhfREVQUkVDQVRFRDsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBiaW5kZXJzIGJpbmRlciBmdW5jdG9yc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3BlcmF0aW9uLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJpbmRlcjFzdDxfT3BlcmF0aW9uPgorICAgIGJpbmQxc3QoY29uc3QgX09wZXJhdGlvbiYgX19mbiwgY29uc3QgX1RwJiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfT3BlcmF0aW9uOjpmaXJzdF9hcmd1bWVudF90eXBlIF9BcmcxX3R5cGU7CisgICAgICByZXR1cm4gYmluZGVyMXN0PF9PcGVyYXRpb24+KF9fZm4sIF9BcmcxX3R5cGUoX194KSk7CisgICAgfQorCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGJpbmRlcnMgYmluZGVyIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9PcGVyYXRpb24+CisgICAgY2xhc3MgYmluZGVyMm5kCisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX09wZXJhdGlvbjo6Zmlyc3RfYXJndW1lbnRfdHlwZSwKKwkJCSAgICB0eXBlbmFtZSBfT3BlcmF0aW9uOjpyZXN1bHRfdHlwZT4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX09wZXJhdGlvbiBvcDsKKyAgICAgIHR5cGVuYW1lIF9PcGVyYXRpb246OnNlY29uZF9hcmd1bWVudF90eXBlIHZhbHVlOworCisgICAgcHVibGljOgorICAgICAgYmluZGVyMm5kKGNvbnN0IF9PcGVyYXRpb24mIF9feCwKKwkJY29uc3QgdHlwZW5hbWUgX09wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUmIF9feSkKKyAgICAgIDogb3AoX194KSwgdmFsdWUoX195KSB7IH0KKworICAgICAgdHlwZW5hbWUgX09wZXJhdGlvbjo6cmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgdHlwZW5hbWUgX09wZXJhdGlvbjo6Zmlyc3RfYXJndW1lbnRfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gb3AoX194LCB2YWx1ZSk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTA5LiAgTWlzc2luZyBiaW5kZXJzIGZvciBub24tY29uc3Qgc2VxdWVuY2UgZWxlbWVudHMKKyAgICAgIHR5cGVuYW1lIF9PcGVyYXRpb246OnJlc3VsdF90eXBlCisgICAgICBvcGVyYXRvcigpKHR5cGVuYW1lIF9PcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG9wKF9feCwgdmFsdWUpOyB9CisgICAgfSBfR0xJQkNYWF9ERVBSRUNBVEVEOworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGJpbmRlcnMgYmluZGVyIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9PcGVyYXRpb24sIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYmluZGVyMm5kPF9PcGVyYXRpb24+CisgICAgYmluZDJuZChjb25zdCBfT3BlcmF0aW9uJiBfX2ZuLCBjb25zdCBfVHAmIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9PcGVyYXRpb246OnNlY29uZF9hcmd1bWVudF90eXBlIF9BcmcyX3R5cGU7CisgICAgICByZXR1cm4gYmluZGVyMm5kPF9PcGVyYXRpb24+KF9fZm4sIF9BcmcyX3R5cGUoX194KSk7CisgICAgfSAKKyAgLyoqIEB9ICAqLworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfQkFDS1dBUkRfQklOREVSU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JhY2t3YXJkL2hhc2hfZnVuLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JhY2t3YXJkL2hhc2hfZnVuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ExY2FhNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYmFja3dhcmQvaGFzaF9mdW4uaApAQCAtMCwwICsxLDE3MCBAQAorLy8gJ3N0cnVjdCBoYXNoJyBmcm9tIFNHSSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqLworCisvKiogQGZpbGUgYmFja3dhcmQvaGFzaF9mdW4uaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IChwb3NzaWJseQorICogIGNvbnRhaW5pbmcgZXh0ZW5zaW9ucyBmcm9tIHRoZSBIUC9TR0kgU1RMIHN1YnNldCkuCisgKi8KKworI2lmbmRlZiBfQkFDS1dBUkRfSEFTSF9GVU5fSAorI2RlZmluZSBfQkFDS1dBUkRfSEFTSF9GVU5fSCAxCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgc3RkOjpzaXplX3Q7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleT4KKyAgICBzdHJ1Y3QgaGFzaCB7IH07CisKKyAgaW5saW5lIHNpemVfdAorICBfX3N0bF9oYXNoX3N0cmluZyhjb25zdCBjaGFyKiBfX3MpCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIF9faCA9IDA7CisgICAgZm9yICggOyAqX19zOyArK19fcykKKyAgICAgIF9faCA9IDUgKiBfX2ggKyAqX19zOworICAgIHJldHVybiBzaXplX3QoX19oKTsKKyAgfQorCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDxjaGFyKj4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgY2hhciogX19zKSBjb25zdAorICAgICAgeyByZXR1cm4gX19zdGxfaGFzaF9zdHJpbmcoX19zKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPGNvbnN0IGNoYXIqPgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBfX3MpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3N0bF9oYXNoX3N0cmluZyhfX3MpOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8Y2hhcj4KKyAgICB7IAorICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNoYXIgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX194OyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8dW5zaWduZWQgY2hhcj4KKyAgICB7IAorICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKHVuc2lnbmVkIGNoYXIgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX194OyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8c2lnbmVkIGNoYXI+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKHVuc2lnbmVkIGNoYXIgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX194OyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8c2hvcnQ+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKHNob3J0IF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feDsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPHVuc2lnbmVkIHNob3J0PgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKSh1bnNpZ25lZCBzaG9ydCBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3g7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDxpbnQ+CisgICAgeyAKKyAgICAgIHNpemVfdCAKKyAgICAgIG9wZXJhdG9yKCkoaW50IF9feCkgY29uc3QgCisgICAgICB7IHJldHVybiBfX3g7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDx1bnNpZ25lZCBpbnQ+CisgICAgeyAKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKSh1bnNpZ25lZCBpbnQgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX194OyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8bG9uZz4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkobG9uZyBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3g7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDx1bnNpZ25lZCBsb25nPgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKSh1bnNpZ25lZCBsb25nIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feDsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JhY2t3YXJkL2hhc2hfbWFwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iYWNrd2FyZC9oYXNoX21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjI4NzFhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iYWNrd2FyZC9oYXNoX21hcApAQCAtMCwwICsxLDU5OSBAQAorLy8gSGFzaGluZyBtYXAgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NgorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICovCisKKy8qKiBAZmlsZSBiYWNrd2FyZC9oYXNoX21hcAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IChwb3NzaWJseQorICogIGNvbnRhaW5pbmcgZXh0ZW5zaW9ucyBmcm9tIHRoZSBIUC9TR0kgU1RMIHN1YnNldCkuCisgKi8KKworI2lmbmRlZiBfQkFDS1dBUkRfSEFTSF9NQVAKKyNkZWZpbmUgX0JBQ0tXQVJEX0hBU0hfTUFQIDEKKworI2lmbmRlZiBfR0xJQkNYWF9QRVJNSVRfQkFDS1dBUkRfSEFTSAorI2luY2x1ZGUgImJhY2t3YXJkX3dhcm5pbmcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiYWNrd2FyZC9oYXNodGFibGUuaD4KKyNpbmNsdWRlIDxiaXRzL2NvbmNlcHRfY2hlY2suaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHVzaW5nIHN0ZDo6ZXF1YWxfdG87CisgIHVzaW5nIHN0ZDo6YWxsb2NhdG9yOworICB1c2luZyBzdGQ6OnBhaXI7CisgIHVzaW5nIHN0ZDo6X1NlbGVjdDFzdDsKKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRm4gPSBoYXNoPF9LZXk+LAorCSAgIGNsYXNzIF9FcXVhbEtleSA9IGVxdWFsX3RvPF9LZXk+LCBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8X1RwPiA+CisgICAgY2xhc3MgaGFzaF9tYXAKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgaGFzaHRhYmxlPHBhaXI8Y29uc3QgX0tleSwgX1RwPixfS2V5LCBfSGFzaEZuLAorCQkJX1NlbGVjdDFzdDxwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiwKKwkJCV9FcXVhbEtleSwgX0FsbG9jPiBfSHQ7CisKKyAgICAgIF9IdCBfTV9odDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfdHlwZSBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwIGRhdGFfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwIG1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpoYXNoZXIgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV9lcXVhbCBrZXlfZXF1YWw7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cG9pbnRlciBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjppdGVyYXRvciBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworICAgICAgCisgICAgICBoYXNoZXIKKyAgICAgIGhhc2hfZnVuY3QoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuaGFzaF9mdW5jdCgpOyB9CisKKyAgICAgIGtleV9lcXVhbAorICAgICAga2V5X2VxKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmtleV9lcSgpOyB9CisKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmdldF9hbGxvY2F0b3IoKTsgfQorCisgICAgICBoYXNoX21hcCgpCisgICAgICA6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorICAKKyAgICAgIGV4cGxpY2l0CisgICAgICBoYXNoX21hcChzaXplX3R5cGUgX19uKQorICAgICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgaGFzaF9tYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorCisgICAgICBoYXNoX21hcChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisJICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpIHt9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX21hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKwk6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX21hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbikKKwk6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX21hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKwkJIGNvbnN0IGhhc2hlciYgX19oZikKKwk6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorCQkgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LnNpemUoKTsgfQorICAgICAgCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lm1heF9zaXplKCk7IH0KKyAgICAgIAorICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZW1wdHkoKTsgfQorICAKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoaGFzaF9tYXAmIF9faHMpCisgICAgICB7IF9NX2h0LnN3YXAoX19ocy5fTV9odCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0sxLCBjbGFzcyBfVDEsIGNsYXNzIF9IRiwgY2xhc3MgX0VxSywgY2xhc3MgX0FsPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcj09IChjb25zdCBoYXNoX21hcDxfSzEsIF9UMSwgX0hGLCBfRXFLLCBfQWw+JiwKKwkJICAgIGNvbnN0IGhhc2hfbWFwPF9LMSwgX1QxLCBfSEYsIF9FcUssIF9BbD4mKTsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpCisgICAgICB7IHJldHVybiBfTV9odC5lbmQoKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7IHJldHVybiBfTV9odC5pbnNlcnRfdW5pcXVlKF9fb2JqKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydF9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF91bmlxdWVfbm9yZXNpemUoX19vYmopOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisKKyAgICAgIF9UcCYKKyAgICAgIG9wZXJhdG9yW10oY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeyByZXR1cm4gX01faHQuZmluZF9vcl9pbnNlcnQodmFsdWVfdHlwZShfX2tleSwgX1RwKCkpKS5zZWNvbmQ7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5jb3VudChfX2tleSk7IH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKworICAgICAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7cmV0dXJuIF9NX2h0LmVyYXNlKF9fa2V5KTsgfQorCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2l0KQorICAgICAgeyBfTV9odC5lcmFzZShfX2l0KTsgfQorCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCkKKyAgICAgIHsgX01faHQuZXJhc2UoX19mLCBfX2wpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkKKyAgICAgIHsgX01faHQuY2xlYXIoKTsgfQorCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9faGludCkKKyAgICAgIHsgX01faHQucmVzaXplKF9faGludCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lm1heF9idWNrZXRfY291bnQoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVsZW1zX2luX2J1Y2tldChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZWxlbXNfaW5fYnVja2V0KF9fbik7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgY2xhc3MgX0VxbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcWxLZXksIF9BbGxvYz4mIF9faG0xLAorCSAgICAgICBjb25zdCBoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcWxLZXksIF9BbGxvYz4mIF9faG0yKQorICAgIHsgcmV0dXJuIF9faG0xLl9NX2h0ID09IF9faG0yLl9NX2h0OyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuLCBjbGFzcyBfRXFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxbEtleSwgX0FsbG9jPiYgX19obTEsCisJICAgICAgIGNvbnN0IGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxbEtleSwgX0FsbG9jPiYgX19obTIpCisgICAgeyByZXR1cm4gIShfX2htMSA9PSBfX2htMik7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRm4sIGNsYXNzIF9FcWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoaGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFsS2V5LCBfQWxsb2M+JiBfX2htMSwKKwkgaGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFsS2V5LCBfQWxsb2M+JiBfX2htMikKKyAgICB7IF9faG0xLnN3YXAoX19obTIpOyB9CisKKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsCisJICAgY2xhc3MgX0hhc2hGbiA9IGhhc2g8X0tleT4sCisJICAgY2xhc3MgX0VxdWFsS2V5ID0gZXF1YWxfdG88X0tleT4sCisJICAgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPF9UcD4gPgorICAgIGNsYXNzIGhhc2hfbXVsdGltYXAKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9LZXksIF9TR0lBc3NpZ25hYmxlQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfVHAsIF9TR0lBc3NpZ25hYmxlQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczMoX0hhc2hGbiwgc2l6ZV90LCBfS2V5LCBfVW5hcnlGdW5jdGlvbkNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMzKF9FcXVhbEtleSwgX0tleSwgX0tleSwgX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQpCisJCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgaGFzaHRhYmxlPHBhaXI8Y29uc3QgX0tleSwgX1RwPiwgX0tleSwgX0hhc2hGbiwKKwkJCV9TZWxlY3Qxc3Q8cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4sIF9FcXVhbEtleSwgX0FsbG9jPgorICAgICAgICAgIF9IdDsKKworICAgICAgX0h0IF9NX2h0OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV90eXBlIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfVHAgZGF0YV90eXBlOworICAgICAgdHlwZWRlZiBfVHAgbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Omhhc2hlciBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpwb2ludGVyIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgICAgICAKKyAgICAgIGhhc2hlcgorICAgICAgaGFzaF9mdW5jdCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5oYXNoX2Z1bmN0KCk7IH0KKworICAgICAga2V5X2VxdWFsCisgICAgICBrZXlfZXEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQua2V5X2VxKCk7IH0KKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZ2V0X2FsbG9jYXRvcigpOyB9CisKKyAgICAgIGhhc2hfbXVsdGltYXAoKQorICAgICAgOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgZXhwbGljaXQKKyAgICAgIGhhc2hfbXVsdGltYXAoc2l6ZV90eXBlIF9fbikKKyAgICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisKKyAgICAgIGhhc2hfbXVsdGltYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorCisgICAgICBoYXNoX211bHRpbWFwKHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKwkJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpIHt9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorCTogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbikKKwk6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisJCSAgICAgIGNvbnN0IGhhc2hlciYgX19oZikKKwk6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorCQkgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5zaXplKCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5tYXhfc2l6ZSgpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVtcHR5KCk7IH0KKworICAgICAgdm9pZAorICAgICAgc3dhcChoYXNoX211bHRpbWFwJiBfX2hzKQorICAgICAgeyBfTV9odC5zd2FwKF9faHMuX01faHQpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9LMSwgY2xhc3MgX1QxLCBjbGFzcyBfSEYsIGNsYXNzIF9FcUssIGNsYXNzIF9BbD4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I9PShjb25zdCBoYXNoX211bHRpbWFwPF9LMSwgX1QxLCBfSEYsIF9FcUssIF9BbD4mLAorCQkgICBjb25zdCBoYXNoX211bHRpbWFwPF9LMSwgX1QxLCBfSEYsIF9FcUssIF9BbD4mKTsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpCisgICAgICB7IHJldHVybiBfTV9odC5lbmQoKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7IHJldHVybiBfTV9odC5pbnNlcnRfZXF1YWwoX19vYmopOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLF9fbCk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydF9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF9lcXVhbF9ub3Jlc2l6ZShfX29iaik7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5jb3VudChfX2tleSk7IH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKworICAgICAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7IHJldHVybiBfTV9odC5lcmFzZShfX2tleSk7IH0KKworICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19pdCkKKyAgICAgIHsgX01faHQuZXJhc2UoX19pdCk7IH0KKworICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19mLCBpdGVyYXRvciBfX2wpCisgICAgICB7IF9NX2h0LmVyYXNlKF9fZiwgX19sKTsgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7IF9NX2h0LmNsZWFyKCk7IH0KKworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX2hpbnQpCisgICAgICB7IF9NX2h0LnJlc2l6ZShfX2hpbnQpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmJ1Y2tldF9jb3VudCgpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5tYXhfYnVja2V0X2NvdW50KCk7IH0KKyAgICAgIAorICAgICAgc2l6ZV90eXBlCisgICAgICBlbGVtc19pbl9idWNrZXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVsZW1zX2luX2J1Y2tldChfX24pOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IRiwgY2xhc3MgX0VxS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSEYsIF9FcUtleSwgX0FsbG9jPiYgX19obTEsCisJICAgICAgIGNvbnN0IGhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSEYsIF9FcUtleSwgX0FsbG9jPiYgX19obTIpCisgICAgeyByZXR1cm4gX19obTEuX01faHQgPT0gX19obTIuX01faHQ7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IRiwgY2xhc3MgX0VxS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSEYsIF9FcUtleSwgX0FsbG9jPiYgX19obTEsCisJICAgICAgIGNvbnN0IGhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSEYsIF9FcUtleSwgX0FsbG9jPiYgX19obTIpCisgICAgeyByZXR1cm4gIShfX2htMSA9PSBfX2htMik7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRm4sIGNsYXNzIF9FcWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoaGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcWxLZXksIF9BbGxvYz4mIF9faG0xLAorCSBoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxbEtleSwgX0FsbG9jPiYgX19obTIpCisgICAgeyBfX2htMS5zd2FwKF9faG0yKTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBTcGVjaWFsaXphdGlvbiBvZiBpbnNlcnRfaXRlcmF0b3Igc28gdGhhdCBpdCB3aWxsIHdvcmsgZm9yIGhhc2hfbWFwCisgIC8vIGFuZCBoYXNoX211bHRpbWFwLgorICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRm4sICBjbGFzcyBfRXFLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBpbnNlcnRfaXRlcmF0b3I8X19nbnVfY3h4OjpoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIAorCQkJCQkgICAgICBfRXFLZXksIF9BbGxvYz4gPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6aGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFLZXksIF9BbGxvYz4KKyAgICAgICAgX0NvbnRhaW5lcjsKKyAgICAgIF9Db250YWluZXIqIGNvbnRhaW5lcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIAorICAgICAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkKKyAgICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gsIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yKQorICAgICAgOiBjb250YWluZXIoJl9feCkge30KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsdWUpCisgICAgICB7CisJY29udGFpbmVyLT5pbnNlcnQoX192YWx1ZSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvciooKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgorICAgIGNsYXNzIGluc2VydF9pdGVyYXRvcjxfX2dudV9jeHg6Omhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaEZuLAorCQkJCQkJICAgX0VxS2V5LCBfQWxsb2M+ID4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Omhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFLZXksIF9BbGxvYz4KKyAgICAgICAgX0NvbnRhaW5lcjsKKyAgICAgIF9Db250YWluZXIqIGNvbnRhaW5lcjsKKyAgICAgIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIGl0ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisgICAgICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKKyAgICAgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpCisgICAgICA6IGNvbnRhaW5lcigmX194KSB7fQorCisgICAgICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvcikKKyAgICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbHVlKQorICAgICAgeworCWNvbnRhaW5lci0+aW5zZXJ0KF9fdmFsdWUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JhY2t3YXJkL2hhc2hfc2V0IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iYWNrd2FyZC9oYXNoX3NldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzhlODQ3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iYWNrd2FyZC9oYXNoX3NldApAQCAtMCwwICsxLDU2NyBAQAorLy8gSGFzaGluZyBzZXQgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NgorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICovCisKKy8qKiBAZmlsZSBiYWNrd2FyZC9oYXNoX3NldAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IChwb3NzaWJseQorICogIGNvbnRhaW5pbmcgZXh0ZW5zaW9ucyBmcm9tIHRoZSBIUC9TR0kgU1RMIHN1YnNldCkuCisgKi8KKworI2lmbmRlZiBfQkFDS1dBUkRfSEFTSF9TRVQKKyNkZWZpbmUgX0JBQ0tXQVJEX0hBU0hfU0VUIDEKKworI2lmbmRlZiBfR0xJQkNYWF9QRVJNSVRfQkFDS1dBUkRfSEFTSAorI2luY2x1ZGUgImJhY2t3YXJkX3dhcm5pbmcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiYWNrd2FyZC9oYXNodGFibGUuaD4KKyNpbmNsdWRlIDxiaXRzL2NvbmNlcHRfY2hlY2suaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHVzaW5nIHN0ZDo6ZXF1YWxfdG87CisgIHVzaW5nIHN0ZDo6YWxsb2NhdG9yOworICB1c2luZyBzdGQ6OnBhaXI7CisgIHVzaW5nIHN0ZDo6X0lkZW50aXR5OworCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2hGY24gID0gaGFzaDxfVmFsdWU+LAorCSAgIGNsYXNzIF9FcXVhbEtleSA9IGVxdWFsX3RvPF9WYWx1ZT4sCisJICAgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPF9WYWx1ZT4gPgorICAgIGNsYXNzIGhhc2hfc2V0CisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfVmFsdWUsIF9TR0lBc3NpZ25hYmxlQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczMoX0hhc2hGY24sIHNpemVfdCwgX1ZhbHVlLCBfVW5hcnlGdW5jdGlvbkNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMzKF9FcXVhbEtleSwgX1ZhbHVlLCBfVmFsdWUsIF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0KQorCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgaGFzaHRhYmxlPF9WYWx1ZSwgX1ZhbHVlLCBfSGFzaEZjbiwgX0lkZW50aXR5PF9WYWx1ZT4sCisJCQlfRXF1YWxLZXksIF9BbGxvYz4gX0h0OworICAgICAgX0h0IF9NX2h0OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV90eXBlIGtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpoYXNoZXIgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV9lcXVhbCBrZXlfZXF1YWw7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6cG9pbnRlciBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworICAgICAgCisgICAgICBoYXNoZXIKKyAgICAgIGhhc2hfZnVuY3QoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuaGFzaF9mdW5jdCgpOyB9CisKKyAgICAgIGtleV9lcXVhbAorICAgICAga2V5X2VxKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmtleV9lcSgpOyB9CisKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmdldF9hbGxvY2F0b3IoKTsgfQorCisgICAgICBoYXNoX3NldCgpCisgICAgICA6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorCisgICAgICBleHBsaWNpdAorICAgICAgaGFzaF9zZXQoc2l6ZV90eXBlIF9fbikKKyAgICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisKKyAgICAgIGhhc2hfc2V0KHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZikKKyAgICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgaGFzaF9zZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorCSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7fQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisJOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24pCisJOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisJCSBjb25zdCBoYXNoZXImIF9faGYpCisJOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX3NldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKwkJIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKwkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5zaXplKCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5tYXhfc2l6ZSgpOyB9CisgICAgICAKKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVtcHR5KCk7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgc3dhcChoYXNoX3NldCYgX19ocykKKyAgICAgIHsgX01faHQuc3dhcChfX2hzLl9NX2h0KTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfSEYsIGNsYXNzIF9FcUssIGNsYXNzIF9BbD4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I9PShjb25zdCBoYXNoX3NldDxfVmFsLCBfSEYsIF9FcUssIF9BbD4mLAorCQkgICBjb25zdCBoYXNoX3NldDxfVmFsLCBfSEYsIF9FcUssIF9BbD4mKTsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKyAgICAgIAorICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lbmQoKTsgfQorCisgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeworCXBhaXI8dHlwZW5hbWUgX0h0OjppdGVyYXRvciwgYm9vbD4gX19wID0gX01faHQuaW5zZXJ0X3VuaXF1ZShfX29iaik7CisJcmV0dXJuIHBhaXI8aXRlcmF0b3IsYm9vbD4oX19wLmZpcnN0LCBfX3Auc2Vjb25kKTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnRfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7CisJcGFpcjx0eXBlbmFtZSBfSHQ6Oml0ZXJhdG9yLCBib29sPiBfX3AKKwkgID0gX01faHQuaW5zZXJ0X3VuaXF1ZV9ub3Jlc2l6ZShfX29iaik7CisJcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGJvb2w+KF9fcC5maXJzdCwgX19wLnNlY29uZCk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuY291bnQoX19rZXkpOyB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAge3JldHVybiBfTV9odC5lcmFzZShfX2tleSk7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19pdCkKKyAgICAgIHsgX01faHQuZXJhc2UoX19pdCk7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19mLCBpdGVyYXRvciBfX2wpCisgICAgICB7IF9NX2h0LmVyYXNlKF9fZiwgX19sKTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7IF9NX2h0LmNsZWFyKCk7IH0KKworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX2hpbnQpCisgICAgICB7IF9NX2h0LnJlc2l6ZShfX2hpbnQpOyB9CisgICAgICAKKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmJ1Y2tldF9jb3VudCgpOyB9CisgICAgICAKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5tYXhfYnVja2V0X2NvdW50KCk7IH0KKyAgICAgIAorICAgICAgc2l6ZV90eXBlCisgICAgICBlbGVtc19pbl9idWNrZXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVsZW1zX2luX2J1Y2tldChfX24pOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgaGFzaF9zZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMSwKKwkgICAgICAgY29uc3QgaGFzaF9zZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMikKKyAgICB7IHJldHVybiBfX2hzMS5fTV9odCA9PSBfX2hzMi5fTV9odDsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBoYXNoX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4mIF9faHMxLAorCSAgICAgICBjb25zdCBoYXNoX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4mIF9faHMyKQorICAgIHsgcmV0dXJuICEoX19oczEgPT0gX19oczIpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChoYXNoX3NldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMSwKKwkgaGFzaF9zZXQ8X1ZhbCwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczIpCisgICAgeyBfX2hzMS5zd2FwKF9faHMyKTsgfQorCisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAZG9jdG9kbworICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLAorCSAgIGNsYXNzIF9IYXNoRmNuID0gaGFzaDxfVmFsdWU+LAorCSAgIGNsYXNzIF9FcXVhbEtleSA9IGVxdWFsX3RvPF9WYWx1ZT4sCisJICAgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPF9WYWx1ZT4gPgorICAgIGNsYXNzIGhhc2hfbXVsdGlzZXQKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9WYWx1ZSwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMyhfSGFzaEZjbiwgc2l6ZV90LCBfVmFsdWUsIF9VbmFyeUZ1bmN0aW9uQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczMoX0VxdWFsS2V5LCBfVmFsdWUsIF9WYWx1ZSwgX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQpCisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBoYXNodGFibGU8X1ZhbHVlLCBfVmFsdWUsIF9IYXNoRmNuLCBfSWRlbnRpdHk8X1ZhbHVlPiwKKwkJCV9FcXVhbEtleSwgX0FsbG9jPiBfSHQ7CisgICAgICBfSHQgX01faHQ7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X3R5cGUga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Omhhc2hlciBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpwb2ludGVyIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgICAgICAKKyAgICAgIGhhc2hlcgorICAgICAgaGFzaF9mdW5jdCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5oYXNoX2Z1bmN0KCk7IH0KKyAgICAgIAorICAgICAga2V5X2VxdWFsCisgICAgICBrZXlfZXEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQua2V5X2VxKCk7IH0KKyAgICAgIAorICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZ2V0X2FsbG9jYXRvcigpOyB9CisKKyAgICAgIGhhc2hfbXVsdGlzZXQoKQorICAgICAgOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgZXhwbGljaXQKKyAgICAgIGhhc2hfbXVsdGlzZXQoc2l6ZV90eXBlIF9fbikKKyAgICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisKKyAgICAgIGhhc2hfbXVsdGlzZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorICAgICAgCisgICAgICBoYXNoX211bHRpc2V0KHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKwkJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpIHt9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorCTogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbikKKwk6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisJCSAgICAgIGNvbnN0IGhhc2hlciYgX19oZikKKwk6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorCQkgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5zaXplKCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5tYXhfc2l6ZSgpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVtcHR5KCk7IH0KKworICAgICAgdm9pZAorICAgICAgc3dhcChoYXNoX211bHRpc2V0JiBocykKKyAgICAgIHsgX01faHQuc3dhcChocy5fTV9odCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0hGLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWw+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgaGFzaF9tdWx0aXNldDxfVmFsLCBfSEYsIF9FcUssIF9BbD4mLAorCQkgICBjb25zdCBoYXNoX211bHRpc2V0PF9WYWwsIF9IRiwgX0VxSywgX0FsPiYpOworCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorICAgICAgCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7IHJldHVybiBfTV9odC5pbnNlcnRfZXF1YWwoX19vYmopOyB9CisgIAorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorICAgICAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsX19sKTsgfQorICAKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7IHJldHVybiBfTV9odC5pbnNlcnRfZXF1YWxfbm9yZXNpemUoX19vYmopOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuY291bnQoX19rZXkpOyB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeyByZXR1cm4gX01faHQuZXJhc2UoX19rZXkpOyB9CisgIAorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19pdCkKKyAgICAgIHsgX01faHQuZXJhc2UoX19pdCk7IH0KKyAgCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCkKKyAgICAgIHsgX01faHQuZXJhc2UoX19mLCBfX2wpOyB9CisgIAorICAgICAgdm9pZAorICAgICAgY2xlYXIoKQorICAgICAgeyBfTV9odC5jbGVhcigpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19oaW50KQorICAgICAgeyBfTV9odC5yZXNpemUoX19oaW50KTsgfQorICAKKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmJ1Y2tldF9jb3VudCgpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5tYXhfYnVja2V0X2NvdW50KCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBlbGVtc19pbl9idWNrZXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVsZW1zX2luX2J1Y2tldChfX24pOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGhhc2hfbXVsdGlzZXQ8X1ZhbCwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczEsCisJICAgICAgIGNvbnN0IGhhc2hfbXVsdGlzZXQ8X1ZhbCwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczIpCisgICAgeyByZXR1cm4gX19oczEuX01faHQgPT0gX19oczIuX01faHQ7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGhhc2hfbXVsdGlzZXQ8X1ZhbCwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczEsCisJICAgICAgIGNvbnN0IGhhc2hfbXVsdGlzZXQ8X1ZhbCwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczIpCisgICAgeyByZXR1cm4gIShfX2hzMSA9PSBfX2hzMik7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGhhc2hfbXVsdGlzZXQ8X1ZhbCwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczEsCisJIGhhc2hfbXVsdGlzZXQ8X1ZhbCwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczIpCisgICAgeyBfX2hzMS5zd2FwKF9faHMyKTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBTcGVjaWFsaXphdGlvbiBvZiBpbnNlcnRfaXRlcmF0b3Igc28gdGhhdCBpdCB3aWxsIHdvcmsgZm9yIGhhc2hfc2V0CisgIC8vIGFuZCBoYXNoX211bHRpc2V0LgorICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBpbnNlcnRfaXRlcmF0b3I8X19nbnVfY3h4OjpoYXNoX3NldDxfVmFsdWUsIF9IYXNoRmNuLAorCQkJCQkgICAgICBfRXF1YWxLZXksIF9BbGxvYz4gPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6aGFzaF9zZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+CisgICAgICAgIF9Db250YWluZXI7CisgICAgICBfQ29udGFpbmVyKiBjb250YWluZXI7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisgICAgICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKKyAgICAgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpCisgICAgICA6IGNvbnRhaW5lcigmX194KSB7fQorICAgICAgCisgICAgICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvcikKKyAgICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbHVlKQorICAgICAgeworCWNvbnRhaW5lci0+aW5zZXJ0KF9fdmFsdWUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICAgICAKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICAgIAorICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3MgaW5zZXJ0X2l0ZXJhdG9yPF9fZ251X2N4eDo6aGFzaF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoRmNuLAorCQkJCQkJICAgX0VxdWFsS2V5LCBfQWxsb2M+ID4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Omhhc2hfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+CisgICAgICAgIF9Db250YWluZXI7CisgICAgICBfQ29udGFpbmVyKiBjb250YWluZXI7CisgICAgICB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBpdGVyOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworICAgICAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgCisgICAgICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194KQorICAgICAgOiBjb250YWluZXIoJl9feCkge30KKyAgICAgIAorICAgICAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IpCisgICAgICA6IGNvbnRhaW5lcigmX194KSB7fQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWx1ZSkKKyAgICAgIHsKKwljb250YWluZXItPmluc2VydChfX3ZhbHVlKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKigpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JhY2t3YXJkL2hhc2h0YWJsZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iYWNrd2FyZC9oYXNodGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmRmNjczCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iYWNrd2FyZC9oYXNodGFibGUuaApAQCAtMCwwICsxLDExNjcgQEAKKy8vIEhhc2h0YWJsZSBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IGNvbnRhaW5lcnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKi8KKworLyoqIEBmaWxlIGJhY2t3YXJkL2hhc2h0YWJsZS5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkgKHBvc3NpYmx5CisgKiAgY29udGFpbmluZyBleHRlbnNpb25zIGZyb20gdGhlIEhQL1NHSSBTVEwgc3Vic2V0KS4KKyAqLworCisjaWZuZGVmIF9CQUNLV0FSRF9IQVNIVEFCTEVfSAorI2RlZmluZSBfQkFDS1dBUkRfSEFTSFRBQkxFX0ggMQorCisvLyBIYXNodGFibGUgY2xhc3MsIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBoYXNoZWQgYXNzb2NpYXRpdmUgY29udGFpbmVycworLy8gaGFzaF9zZXQsIGhhc2hfbWFwLCBoYXNoX211bHRpc2V0LCBhbmQgaGFzaF9tdWx0aW1hcC4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Yml0cy9zdGxfZnVuY3Rpb24uaD4KKyNpbmNsdWRlIDxiYWNrd2FyZC9oYXNoX2Z1bi5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgc3RkOjpzaXplX3Q7CisgIHVzaW5nIHN0ZDo6cHRyZGlmZl90OworICB1c2luZyBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnOworICB1c2luZyBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZzsKKyAgdXNpbmcgc3RkOjpfQ29uc3RydWN0OworICB1c2luZyBzdGQ6Ol9EZXN0cm95OworICB1c2luZyBzdGQ6OmRpc3RhbmNlOworICB1c2luZyBzdGQ6OnZlY3RvcjsKKyAgdXNpbmcgc3RkOjpwYWlyOworICB1c2luZyBzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbD4KKyAgICBzdHJ1Y3QgX0hhc2h0YWJsZV9ub2RlCisgICAgeworICAgICAgX0hhc2h0YWJsZV9ub2RlKiBfTV9uZXh0OworICAgICAgX1ZhbCBfTV92YWw7CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0V4dHJhY3RLZXksIAorCSAgIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8X1ZhbD4gPgorICAgIGNsYXNzIGhhc2h0YWJsZTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSGFzaEZjbiwKKwkgICBjbGFzcyBfRXh0cmFjdEtleSwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgc3RydWN0IF9IYXNodGFibGVfaXRlcmF0b3I7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hhc2hGY24sCisJICAgY2xhc3MgX0V4dHJhY3RLZXksIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yOworCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IYXNoRmNuLAorCSAgIGNsYXNzIF9FeHRyYWN0S2V5LCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX0hhc2h0YWJsZV9pdGVyYXRvcgorICAgIHsKKyAgICAgIHR5cGVkZWYgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IYXNoRmNuLCBfRXh0cmFjdEtleSwgX0VxdWFsS2V5LCBfQWxsb2M+CisgICAgICAgIF9IYXNodGFibGU7CisgICAgICB0eXBlZGVmIF9IYXNodGFibGVfaXRlcmF0b3I8X1ZhbCwgX0tleSwgX0hhc2hGY24sCisJCQkJICBfRXh0cmFjdEtleSwgX0VxdWFsS2V5LCBfQWxsb2M+CisgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yPF9WYWwsIF9LZXksIF9IYXNoRmNuLAorCQkJCQlfRXh0cmFjdEtleSwgX0VxdWFsS2V5LCBfQWxsb2M+CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfSGFzaHRhYmxlX25vZGU8X1ZhbD4gX05vZGU7CisgICAgICB0eXBlZGVmIGZvcndhcmRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiBfVmFsIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIF9WYWwmIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgX1ZhbCogcG9pbnRlcjsKKyAgICAgIAorICAgICAgX05vZGUqIF9NX2N1cjsKKyAgICAgIF9IYXNodGFibGUqIF9NX2h0OworCisgICAgICBfSGFzaHRhYmxlX2l0ZXJhdG9yKF9Ob2RlKiBfX24sIF9IYXNodGFibGUqIF9fdGFiKQorICAgICAgOiBfTV9jdXIoX19uKSwgX01faHQoX190YWIpIHsgfQorCisgICAgICBfSGFzaHRhYmxlX2l0ZXJhdG9yKCkgeyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2N1ci0+X01fdmFsOyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeyByZXR1cm4gJihvcGVyYXRvciooKSk7IH0KKworICAgICAgaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCk7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCk7CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIF9faXQpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9jdXIgPT0gX19pdC5fTV9jdXI7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgX19pdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2N1ciAhPSBfX2l0Ll9NX2N1cjsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hhc2hGY24sCisJICAgY2xhc3MgX0V4dHJhY3RLZXksIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yCisgICAgeworICAgICAgdHlwZWRlZiBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hhc2hGY24sIF9FeHRyYWN0S2V5LCBfRXF1YWxLZXksIF9BbGxvYz4KKyAgICAgICAgX0hhc2h0YWJsZTsKKyAgICAgIHR5cGVkZWYgX0hhc2h0YWJsZV9pdGVyYXRvcjxfVmFsLF9LZXksX0hhc2hGY24sCisJCQkJICBfRXh0cmFjdEtleSxfRXF1YWxLZXksX0FsbG9jPgorICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcjxfVmFsLCBfS2V5LCBfSGFzaEZjbiwKKwkJCQkJX0V4dHJhY3RLZXksIF9FcXVhbEtleSwgX0FsbG9jPgorICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX0hhc2h0YWJsZV9ub2RlPF9WYWw+IF9Ob2RlOworCisgICAgICB0eXBlZGVmIGZvcndhcmRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiBfVmFsIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIGNvbnN0IF9WYWwmIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1ZhbCogcG9pbnRlcjsKKyAgICAgIAorICAgICAgY29uc3QgX05vZGUqIF9NX2N1cjsKKyAgICAgIGNvbnN0IF9IYXNodGFibGUqIF9NX2h0OworCisgICAgICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yKGNvbnN0IF9Ob2RlKiBfX24sIGNvbnN0IF9IYXNodGFibGUqIF9fdGFiKQorICAgICAgOiBfTV9jdXIoX19uKSwgX01faHQoX190YWIpIHsgfQorCisgICAgICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yKCkgeyB9CisKKyAgICAgIF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3IoY29uc3QgaXRlcmF0b3ImIF9faXQpCisgICAgICA6IF9NX2N1cihfX2l0Ll9NX2N1ciksIF9NX2h0KF9faXQuX01faHQpIHsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9jdXItPl9NX3ZhbDsgfQorCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICYob3BlcmF0b3IqKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpOworCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpOworCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2l0KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fY3VyID09IF9faXQuX01fY3VyOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faXQpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9jdXIgIT0gX19pdC5fTV9jdXI7IH0KKyAgICB9OworCisgIC8vIE5vdGU6IGFzc3VtZXMgbG9uZyBpcyBhdCBsZWFzdCAzMiBiaXRzLgorICBlbnVtIHsgX1NfbnVtX3ByaW1lcyA9IDI5IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByaW1lVHlwZT4KKyAgICBzdHJ1Y3QgX0hhc2h0YWJsZV9wcmltZV9saXN0CisgICAgeworICAgICAgc3RhdGljIGNvbnN0IF9QcmltZVR5cGUgIF9fc3RsX3ByaW1lX2xpc3RbX1NfbnVtX3ByaW1lc107CisKKyAgICAgIHN0YXRpYyBjb25zdCBfUHJpbWVUeXBlKgorICAgICAgX1NfZ2V0X3ByaW1lX2xpc3QoKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9QcmltZVR5cGU+IGNvbnN0IF9QcmltZVR5cGUKKyAgX0hhc2h0YWJsZV9wcmltZV9saXN0PF9QcmltZVR5cGU+OjpfX3N0bF9wcmltZV9saXN0W19TX251bV9wcmltZXNdID0KKyAgICB7CisgICAgICA1dWwsICAgICAgICAgIDUzdWwsICAgICAgICAgOTd1bCwgICAgICAgICAxOTN1bCwgICAgICAgMzg5dWwsCisgICAgICA3Njl1bCwgICAgICAgIDE1NDN1bCwgICAgICAgMzA3OXVsLCAgICAgICA2MTUxdWwsICAgICAgMTIyODl1bCwKKyAgICAgIDI0NTkzdWwsICAgICAgNDkxNTd1bCwgICAgICA5ODMxN3VsLCAgICAgIDE5NjYxM3VsLCAgICAzOTMyNDF1bCwKKyAgICAgIDc4NjQzM3VsLCAgICAgMTU3Mjg2OXVsLCAgICAzMTQ1NzM5dWwsICAgIDYyOTE0Njl1bCwgICAxMjU4MjkxN3VsLAorICAgICAgMjUxNjU4NDN1bCwgICA1MDMzMTY1M3VsLCAgIDEwMDY2MzMxOXVsLCAgMjAxMzI2NjExdWwsIDQwMjY1MzE4OXVsLAorICAgICAgODA1MzA2NDU3dWwsICAxNjEwNjEyNzQxdWwsIDMyMjEyMjU0NzN1bCwgNDI5NDk2NzI5MXVsCisgICAgfTsKKworIHRlbXBsYXRlPGNsYXNzIF9QcmltZVR5cGU+IGlubGluZSBjb25zdCBfUHJpbWVUeXBlKgorIF9IYXNodGFibGVfcHJpbWVfbGlzdDxfUHJpbWVUeXBlPjo6X1NfZ2V0X3ByaW1lX2xpc3QoKQorIHsKKyAgIHJldHVybiBfX3N0bF9wcmltZV9saXN0OworIH0KKworICBpbmxpbmUgdW5zaWduZWQgbG9uZworICBfX3N0bF9uZXh0X3ByaW1lKHVuc2lnbmVkIGxvbmcgX19uKQorICB7CisgICAgY29uc3QgdW5zaWduZWQgbG9uZyogX19maXJzdCA9IF9IYXNodGFibGVfcHJpbWVfbGlzdDx1bnNpZ25lZCBsb25nPjo6X1NfZ2V0X3ByaW1lX2xpc3QoKTsKKyAgICBjb25zdCB1bnNpZ25lZCBsb25nKiBfX2xhc3QgPSBfX2ZpcnN0ICsgKGludClfU19udW1fcHJpbWVzOworICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcqIHBvcyA9IHN0ZDo6bG93ZXJfYm91bmQoX19maXJzdCwgX19sYXN0LCBfX24pOworICAgIHJldHVybiBwb3MgPT0gX19sYXN0ID8gKihfX2xhc3QgLSAxKSA6ICpwb3M7CisgIH0KKworICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIG9wZXJhdG9yPT0uICAKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsCisJICAgY2xhc3MgX0VxLCBjbGFzcyBfQWxsPgorICAgIGNsYXNzIGhhc2h0YWJsZTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwKKwkgICBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+JiBfX2h0MSwKKwkgICAgICAgY29uc3QgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+JiBfX2h0Mik7CisKKyAgLy8gSGFzaHRhYmxlcyBoYW5kbGUgYWxsb2NhdG9ycyBhIGJpdCBkaWZmZXJlbnRseSB0aGFuIG90aGVyCisgIC8vIGNvbnRhaW5lcnMgZG8uICBJZiB3ZSdyZSB1c2luZyBzdGFuZGFyZC1jb25mb3JtaW5nIGFsbG9jYXRvcnMsIHRoZW4KKyAgLy8gYSBoYXNodGFibGUgdW5jb25kaXRpb25hbGx5IGhhcyBhIG1lbWJlciB2YXJpYWJsZSB0byBob2xkIGl0cworICAvLyBhbGxvY2F0b3IsIGV2ZW4gaWYgaXQgc28gaGFwcGVucyB0aGF0IGFsbCBpbnN0YW5jZXMgb2YgdGhlCisgIC8vIGFsbG9jYXRvciB0eXBlIGFyZSBpZGVudGljYWwuICBUaGlzIGlzIGJlY2F1c2UsIGZvciBoYXNodGFibGVzLAorICAvLyB0aGlzIGV4dHJhIHN0b3JhZ2UgaXMgbmVnbGlnaWJsZS4gIEFkZGl0aW9uYWxseSwgYSBiYXNlIGNsYXNzCisgIC8vIHdvdWxkbid0IHNlcnZlIGFueSBvdGhlciBwdXJwb3NlczsgaXQgd291bGRuJ3QsIGZvciBleGFtcGxlLAorICAvLyBzaW1wbGlmeSB0aGUgZXhjZXB0aW9uLWhhbmRsaW5nIGNvZGUuICAKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hhc2hGY24sCisJICAgY2xhc3MgX0V4dHJhY3RLZXksIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGNsYXNzIGhhc2h0YWJsZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9LZXkga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIF9WYWwgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0hhc2hGY24gaGFzaGVyOworICAgICAgdHlwZWRlZiBfRXF1YWxLZXkga2V5X2VxdWFsOworCisgICAgICB0eXBlZGVmIHNpemVfdCAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlKiAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgaGFzaGVyCisgICAgICBoYXNoX2Z1bmN0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2hhc2g7IH0KKworICAgICAga2V5X2VxdWFsCisgICAgICBrZXlfZXEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZXF1YWxzOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfSGFzaHRhYmxlX25vZGU8X1ZhbD4gX05vZGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPHZhbHVlX3R5cGU+OjpvdGhlciBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX25vZGVfYWxsb2NhdG9yOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfTm9kZT46Om90aGVyIF9Ob2RlX0FsbG9jOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfTm9kZSo+OjpvdGhlciBfTm9kZXB0cl9BbGxvYzsKKyAgICAgIHR5cGVkZWYgdmVjdG9yPF9Ob2RlKiwgX05vZGVwdHJfQWxsb2M+IF9WZWN0b3JfdHlwZTsKKworICAgICAgX05vZGVfQWxsb2MgX01fbm9kZV9hbGxvY2F0b3I7CisKKyAgICAgIF9Ob2RlKgorICAgICAgX01fZ2V0X25vZGUoKQorICAgICAgeyByZXR1cm4gX01fbm9kZV9hbGxvY2F0b3IuYWxsb2NhdGUoMSk7IH0KKworICAgICAgdm9pZAorICAgICAgX01fcHV0X25vZGUoX05vZGUqIF9fcCkKKyAgICAgIHsgX01fbm9kZV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShfX3AsIDEpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgaGFzaGVyICAgICAgICAgICAgICAgIF9NX2hhc2g7CisgICAgICBrZXlfZXF1YWwgICAgICAgICAgICAgX01fZXF1YWxzOworICAgICAgX0V4dHJhY3RLZXkgICAgICAgICAgIF9NX2dldF9rZXk7CisgICAgICBfVmVjdG9yX3R5cGUgICAgICAgICAgX01fYnVja2V0czsKKyAgICAgIHNpemVfdHlwZSAgICAgICAgICAgICBfTV9udW1fZWxlbWVudHM7CisgICAgICAKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9IYXNodGFibGVfaXRlcmF0b3I8X1ZhbCwgX0tleSwgX0hhc2hGY24sIF9FeHRyYWN0S2V5LAorCQkJCSAgX0VxdWFsS2V5LCBfQWxsb2M+CisgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yPF9WYWwsIF9LZXksIF9IYXNoRmNuLCBfRXh0cmFjdEtleSwKKwkJCQkJX0VxdWFsS2V5LCBfQWxsb2M+CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICBmcmllbmQgc3RydWN0CisgICAgICBfSGFzaHRhYmxlX2l0ZXJhdG9yPF9WYWwsIF9LZXksIF9IYXNoRmNuLCBfRXh0cmFjdEtleSwgX0VxdWFsS2V5LCBfQWxsb2M+OworCisgICAgICBmcmllbmQgc3RydWN0CisgICAgICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yPF9WYWwsIF9LZXksIF9IYXNoRmNuLCBfRXh0cmFjdEtleSwKKwkJCQlfRXF1YWxLZXksIF9BbGxvYz47CisKKyAgICBwdWJsaWM6CisgICAgICBoYXNodGFibGUoc2l6ZV90eXBlIF9fbiwgY29uc3QgX0hhc2hGY24mIF9faGYsCisJCWNvbnN0IF9FcXVhbEtleSYgX19lcWwsIGNvbnN0IF9FeHRyYWN0S2V5JiBfX2V4dCwKKwkJY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX25vZGVfYWxsb2NhdG9yKF9fYSksIF9NX2hhc2goX19oZiksIF9NX2VxdWFscyhfX2VxbCksCisJX01fZ2V0X2tleShfX2V4dCksIF9NX2J1Y2tldHMoX19hKSwgX01fbnVtX2VsZW1lbnRzKDApCisgICAgICB7IF9NX2luaXRpYWxpemVfYnVja2V0cyhfX24pOyB9CisKKyAgICAgIGhhc2h0YWJsZShzaXplX3R5cGUgX19uLCBjb25zdCBfSGFzaEZjbiYgX19oZiwKKwkJY29uc3QgX0VxdWFsS2V5JiBfX2VxbCwKKwkJY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX25vZGVfYWxsb2NhdG9yKF9fYSksIF9NX2hhc2goX19oZiksIF9NX2VxdWFscyhfX2VxbCksCisJX01fZ2V0X2tleShfRXh0cmFjdEtleSgpKSwgX01fYnVja2V0cyhfX2EpLCBfTV9udW1fZWxlbWVudHMoMCkKKyAgICAgIHsgX01faW5pdGlhbGl6ZV9idWNrZXRzKF9fbik7IH0KKworICAgICAgaGFzaHRhYmxlKGNvbnN0IGhhc2h0YWJsZSYgX19odCkKKyAgICAgIDogX01fbm9kZV9hbGxvY2F0b3IoX19odC5nZXRfYWxsb2NhdG9yKCkpLCBfTV9oYXNoKF9faHQuX01faGFzaCksCisgICAgICBfTV9lcXVhbHMoX19odC5fTV9lcXVhbHMpLCBfTV9nZXRfa2V5KF9faHQuX01fZ2V0X2tleSksCisgICAgICBfTV9idWNrZXRzKF9faHQuZ2V0X2FsbG9jYXRvcigpKSwgX01fbnVtX2VsZW1lbnRzKDApCisgICAgICB7IF9NX2NvcHlfZnJvbShfX2h0KTsgfQorCisgICAgICBoYXNodGFibGUmCisgICAgICBvcGVyYXRvcj0gKGNvbnN0IGhhc2h0YWJsZSYgX19odCkKKyAgICAgIHsKKwlpZiAoJl9faHQgIT0gdGhpcykKKwkgIHsKKwkgICAgY2xlYXIoKTsKKwkgICAgX01faGFzaCA9IF9faHQuX01faGFzaDsKKwkgICAgX01fZXF1YWxzID0gX19odC5fTV9lcXVhbHM7CisJICAgIF9NX2dldF9rZXkgPSBfX2h0Ll9NX2dldF9rZXk7CisJICAgIF9NX2NvcHlfZnJvbShfX2h0KTsKKwkgIH0KKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIH5oYXNodGFibGUoKQorICAgICAgeyBjbGVhcigpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9udW1fZWxlbWVudHM7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBzaXplX3R5cGUoLTEpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHNpemUoKSA9PSAwOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoaGFzaHRhYmxlJiBfX2h0KQorICAgICAgeworCXN0ZDo6c3dhcChfTV9oYXNoLCBfX2h0Ll9NX2hhc2gpOworCXN0ZDo6c3dhcChfTV9lcXVhbHMsIF9faHQuX01fZXF1YWxzKTsKKwlzdGQ6OnN3YXAoX01fZ2V0X2tleSwgX19odC5fTV9nZXRfa2V5KTsKKwlfTV9idWNrZXRzLnN3YXAoX19odC5fTV9idWNrZXRzKTsKKwlzdGQ6OnN3YXAoX01fbnVtX2VsZW1lbnRzLCBfX2h0Ll9NX251bV9lbGVtZW50cyk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpCisgICAgICB7CisJZm9yIChzaXplX3R5cGUgX19uID0gMDsgX19uIDwgX01fYnVja2V0cy5zaXplKCk7ICsrX19uKQorCSAgaWYgKF9NX2J1Y2tldHNbX19uXSkKKwkgICAgcmV0dXJuIGl0ZXJhdG9yKF9NX2J1Y2tldHNbX19uXSwgdGhpcyk7CisJcmV0dXJuIGVuZCgpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKDAsIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7CisJZm9yIChzaXplX3R5cGUgX19uID0gMDsgX19uIDwgX01fYnVja2V0cy5zaXplKCk7ICsrX19uKQorCSAgaWYgKF9NX2J1Y2tldHNbX19uXSkKKwkgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9NX2J1Y2tldHNbX19uXSwgdGhpcyk7CisJcmV0dXJuIGVuZCgpOworICAgICAgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKDAsIHRoaXMpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9WbCwgY2xhc3MgX0t5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLAorCQljbGFzcyBfQWw+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgaGFzaHRhYmxlPF9WbCwgX0t5LCBfSEYsIF9FeCwgX0VxLCBfQWw+JiwKKwkJICAgY29uc3QgaGFzaHRhYmxlPF9WbCwgX0t5LCBfSEYsIF9FeCwgX0VxLCBfQWw+Jik7CisKKyAgICBwdWJsaWM6CisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9idWNrZXRzLnNpemUoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9idWNrZXRfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX0hhc2h0YWJsZV9wcmltZV9saXN0PHVuc2lnbmVkIGxvbmc+OjoKKyAgICAgICAgICAgICAgIF9TX2dldF9wcmltZV9saXN0KClbKGludClfU19udW1fcHJpbWVzIC0gMV07CisgICAgICB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZWxlbXNfaW5fYnVja2V0KHNpemVfdHlwZSBfX2J1Y2tldCkgY29uc3QKKyAgICAgIHsKKwlzaXplX3R5cGUgX19yZXN1bHQgPSAwOworCWZvciAoX05vZGUqIF9fbiA9IF9NX2J1Y2tldHNbX19idWNrZXRdOyBfX247IF9fbiA9IF9fbi0+X01fbmV4dCkKKwkgIF9fcmVzdWx0ICs9IDE7CisJcmV0dXJuIF9fcmVzdWx0OworICAgICAgfQorCisgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0X3VuaXF1ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKwlyZXNpemUoX01fbnVtX2VsZW1lbnRzICsgMSk7CisJcmV0dXJuIGluc2VydF91bmlxdWVfbm9yZXNpemUoX19vYmopOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0X2VxdWFsKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeworCXJlc2l6ZShfTV9udW1fZWxlbWVudHMgKyAxKTsKKwlyZXR1cm4gaW5zZXJ0X2VxdWFsX25vcmVzaXplKF9fb2JqKTsKKyAgICAgIH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydF91bmlxdWVfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopOworCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0X2VxdWFsX25vcmVzaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0X3VuaXF1ZShfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKyAgICAgICAgeyBpbnNlcnRfdW5pcXVlKF9fZiwgX19sLCBfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZikpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydF9lcXVhbChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKyAgICAgICAgeyBpbnNlcnRfZXF1YWwoX19mLCBfX2wsIF9faXRlcmF0b3JfY2F0ZWdvcnkoX19mKSk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0X3VuaXF1ZShfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKwkJICAgICAgaW5wdXRfaXRlcmF0b3JfdGFnKQorICAgICAgICB7CisJICBmb3IgKCA7IF9fZiAhPSBfX2w7ICsrX19mKQorCSAgICBpbnNlcnRfdW5pcXVlKCpfX2YpOworCX0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0X2VxdWFsKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorCQkgICAgIGlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICAgICAgeworCSAgZm9yICggOyBfX2YgIT0gX19sOyArK19fZikKKwkgICAgaW5zZXJ0X2VxdWFsKCpfX2YpOworCX0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnRfdW5pcXVlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fbCwKKwkJICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgICAgIHsKKwkgIHNpemVfdHlwZSBfX24gPSBkaXN0YW5jZShfX2YsIF9fbCk7CisJICByZXNpemUoX01fbnVtX2VsZW1lbnRzICsgX19uKTsKKwkgIGZvciAoIDsgX19uID4gMDsgLS1fX24sICsrX19mKQorCSAgICBpbnNlcnRfdW5pcXVlX25vcmVzaXplKCpfX2YpOworCX0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnRfZXF1YWwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX19sLAorCQkgICAgIGZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgICAgICB7CisJICBzaXplX3R5cGUgX19uID0gZGlzdGFuY2UoX19mLCBfX2wpOworCSAgcmVzaXplKF9NX251bV9lbGVtZW50cyArIF9fbik7CisJICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uLCArK19fZikKKwkgICAgaW5zZXJ0X2VxdWFsX25vcmVzaXplKCpfX2YpOworCX0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBmaW5kX29yX2luc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaik7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsKKwlzaXplX3R5cGUgX19uID0gX01fYmt0X251bV9rZXkoX19rZXkpOworCV9Ob2RlKiBfX2ZpcnN0OworCWZvciAoX19maXJzdCA9IF9NX2J1Y2tldHNbX19uXTsKKwkgICAgIF9fZmlyc3QgJiYgIV9NX2VxdWFscyhfTV9nZXRfa2V5KF9fZmlyc3QtPl9NX3ZhbCksIF9fa2V5KTsKKwkgICAgIF9fZmlyc3QgPSBfX2ZpcnN0LT5fTV9uZXh0KQorCSAgeyB9CisJcmV0dXJuIGl0ZXJhdG9yKF9fZmlyc3QsIHRoaXMpOworICAgICAgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7CisJc2l6ZV90eXBlIF9fbiA9IF9NX2JrdF9udW1fa2V5KF9fa2V5KTsKKwljb25zdCBfTm9kZSogX19maXJzdDsKKwlmb3IgKF9fZmlyc3QgPSBfTV9idWNrZXRzW19fbl07CisJICAgICBfX2ZpcnN0ICYmICFfTV9lcXVhbHMoX01fZ2V0X2tleShfX2ZpcnN0LT5fTV92YWwpLCBfX2tleSk7CisJICAgICBfX2ZpcnN0ID0gX19maXJzdC0+X01fbmV4dCkKKwkgIHsgfQorCXJldHVybiBjb25zdF9pdGVyYXRvcihfX2ZpcnN0LCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7CisJY29uc3Qgc2l6ZV90eXBlIF9fbiA9IF9NX2JrdF9udW1fa2V5KF9fa2V5KTsKKwlzaXplX3R5cGUgX19yZXN1bHQgPSAwOworCQorCWZvciAoY29uc3QgX05vZGUqIF9fY3VyID0gX01fYnVja2V0c1tfX25dOyBfX2N1cjsKKwkgICAgIF9fY3VyID0gX19jdXItPl9NX25leHQpCisJICBpZiAoX01fZXF1YWxzKF9NX2dldF9rZXkoX19jdXItPl9NX3ZhbCksIF9fa2V5KSkKKwkgICAgKytfX3Jlc3VsdDsKKwlyZXR1cm4gX19yZXN1bHQ7CisgICAgICB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KTsKKworICAgICAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0OworCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2tleSk7CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGNvbnN0IGl0ZXJhdG9yJiBfX2l0KTsKKworICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KTsKKworICAgICAgdm9pZAorICAgICAgZXJhc2UoY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faXQpOworCisgICAgICB2b2lkCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpOworCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fbnVtX2VsZW1lbnRzX2hpbnQpOworCisgICAgICB2b2lkCisgICAgICBjbGVhcigpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fbmV4dF9zaXplKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfX3N0bF9uZXh0X3ByaW1lKF9fbik7IH0KKworICAgICAgdm9pZAorICAgICAgX01faW5pdGlhbGl6ZV9idWNrZXRzKHNpemVfdHlwZSBfX24pCisgICAgICB7CisJY29uc3Qgc2l6ZV90eXBlIF9fbl9idWNrZXRzID0gX01fbmV4dF9zaXplKF9fbik7CisJX01fYnVja2V0cy5yZXNlcnZlKF9fbl9idWNrZXRzKTsKKwlfTV9idWNrZXRzLmluc2VydChfTV9idWNrZXRzLmVuZCgpLCBfX25fYnVja2V0cywgKF9Ob2RlKikgMCk7CisJX01fbnVtX2VsZW1lbnRzID0gMDsKKyAgICAgIH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBfTV9ia3RfbnVtX2tleShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9ia3RfbnVtX2tleShfX2tleSwgX01fYnVja2V0cy5zaXplKCkpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fYmt0X251bShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2JrdF9udW1fa2V5KF9NX2dldF9rZXkoX19vYmopKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX2JrdF9udW1fa2V5KGNvbnN0IGtleV90eXBlJiBfX2tleSwgc2l6ZV90IF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2hhc2goX19rZXkpICUgX19uOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fYmt0X251bShjb25zdCB2YWx1ZV90eXBlJiBfX29iaiwgc2l6ZV90IF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2JrdF9udW1fa2V5KF9NX2dldF9rZXkoX19vYmopLCBfX24pOyB9CisKKyAgICAgIF9Ob2RlKgorICAgICAgX01fbmV3X25vZGUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7CisJX05vZGUqIF9fbiA9IF9NX2dldF9ub2RlKCk7CisJX19uLT5fTV9uZXh0ID0gMDsKKwlfX3RyeQorCSAgeworCSAgICB0aGlzLT5nZXRfYWxsb2NhdG9yKCkuY29uc3RydWN0KCZfX24tPl9NX3ZhbCwgX19vYmopOworCSAgICByZXR1cm4gX19uOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfTV9wdXRfbm9kZShfX24pOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fZGVsZXRlX25vZGUoX05vZGUqIF9fbikKKyAgICAgIHsKKwl0aGlzLT5nZXRfYWxsb2NhdG9yKCkuZGVzdHJveSgmX19uLT5fTV92YWwpOworCV9NX3B1dF9ub2RlKF9fbik7CisgICAgICB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX2VyYXNlX2J1Y2tldChjb25zdCBzaXplX3R5cGUgX19uLCBfTm9kZSogX19maXJzdCwgX05vZGUqIF9fbGFzdCk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2VyYXNlX2J1Y2tldChjb25zdCBzaXplX3R5cGUgX19uLCBfTm9kZSogX19sYXN0KTsKKworICAgICAgdm9pZAorICAgICAgX01fY29weV9mcm9tKGNvbnN0IGhhc2h0YWJsZSYgX19odCk7CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssCisJICAgIGNsYXNzIF9BbGw+CisgICAgX0hhc2h0YWJsZV9pdGVyYXRvcjxfVmFsLCBfS2V5LCBfSEYsIF9FeEssIF9FcUssIF9BbGw+JgorICAgIF9IYXNodGFibGVfaXRlcmF0b3I8X1ZhbCwgX0tleSwgX0hGLCBfRXhLLCBfRXFLLCBfQWxsPjo6CisgICAgb3BlcmF0b3IrKygpCisgICAgeworICAgICAgY29uc3QgX05vZGUqIF9fb2xkID0gX01fY3VyOworICAgICAgX01fY3VyID0gX01fY3VyLT5fTV9uZXh0OworICAgICAgaWYgKCFfTV9jdXIpCisJeworCSAgc2l6ZV90eXBlIF9fYnVja2V0ID0gX01faHQtPl9NX2JrdF9udW0oX19vbGQtPl9NX3ZhbCk7CisJICB3aGlsZSAoIV9NX2N1ciAmJiArK19fYnVja2V0IDwgX01faHQtPl9NX2J1Y2tldHMuc2l6ZSgpKQorCSAgICBfTV9jdXIgPSBfTV9odC0+X01fYnVja2V0c1tfX2J1Y2tldF07CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssCisJICAgIGNsYXNzIF9BbGw+CisgICAgaW5saW5lIF9IYXNodGFibGVfaXRlcmF0b3I8X1ZhbCwgX0tleSwgX0hGLCBfRXhLLCBfRXFLLCBfQWxsPgorICAgIF9IYXNodGFibGVfaXRlcmF0b3I8X1ZhbCwgX0tleSwgX0hGLCBfRXhLLCBfRXFLLCBfQWxsPjo6CisgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgeworICAgICAgaXRlcmF0b3IgX190bXAgPSAqdGhpczsKKyAgICAgICsrKnRoaXM7CisgICAgICByZXR1cm4gX190bXA7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywKKwkgICAgY2xhc3MgX0FsbD4KKyAgICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yPF9WYWwsIF9LZXksIF9IRiwgX0V4SywgX0VxSywgX0FsbD4mCisgICAgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcjxfVmFsLCBfS2V5LCBfSEYsIF9FeEssIF9FcUssIF9BbGw+OjoKKyAgICBvcGVyYXRvcisrKCkKKyAgICB7CisgICAgICBjb25zdCBfTm9kZSogX19vbGQgPSBfTV9jdXI7CisgICAgICBfTV9jdXIgPSBfTV9jdXItPl9NX25leHQ7CisgICAgICBpZiAoIV9NX2N1cikKKwl7CisJICBzaXplX3R5cGUgX19idWNrZXQgPSBfTV9odC0+X01fYmt0X251bShfX29sZC0+X01fdmFsKTsKKwkgIHdoaWxlICghX01fY3VyICYmICsrX19idWNrZXQgPCBfTV9odC0+X01fYnVja2V0cy5zaXplKCkpCisJICAgIF9NX2N1ciA9IF9NX2h0LT5fTV9idWNrZXRzW19fYnVja2V0XTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywKKwkgICAgY2xhc3MgX0FsbD4KKyAgICBpbmxpbmUgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcjxfVmFsLCBfS2V5LCBfSEYsIF9FeEssIF9FcUssIF9BbGw+CisgICAgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcjxfVmFsLCBfS2V5LCBfSEYsIF9FeEssIF9FcUssIF9BbGw+OjoKKyAgICBvcGVyYXRvcisrKGludCkKKyAgICB7CisgICAgICBjb25zdF9pdGVyYXRvciBfX3RtcCA9ICp0aGlzOworICAgICAgKysqdGhpczsKKyAgICAgIHJldHVybiBfX3RtcDsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNsYXNzIF9FcSwgY2xhc3MgX0FsbD4KKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD4mIF9faHQxLAorCSAgICAgICBjb25zdCBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD4mIF9faHQyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+OjpfTm9kZSBfTm9kZTsKKworICAgICAgaWYgKF9faHQxLl9NX2J1Y2tldHMuc2l6ZSgpICE9IF9faHQyLl9NX2J1Y2tldHMuc2l6ZSgpKQorCXJldHVybiBmYWxzZTsKKworICAgICAgZm9yIChzaXplX3QgX19uID0gMDsgX19uIDwgX19odDEuX01fYnVja2V0cy5zaXplKCk7ICsrX19uKQorCXsKKwkgIF9Ob2RlKiBfX2N1cjEgPSBfX2h0MS5fTV9idWNrZXRzW19fbl07CisJICBfTm9kZSogX19jdXIyID0gX19odDIuX01fYnVja2V0c1tfX25dOworCSAgLy8gQ2hlY2sgc2FtZSBsZW5ndGggb2YgbGlzdHMKKwkgIGZvciAoOyBfX2N1cjEgJiYgX19jdXIyOworCSAgICAgICBfX2N1cjEgPSBfX2N1cjEtPl9NX25leHQsIF9fY3VyMiA9IF9fY3VyMi0+X01fbmV4dCkKKwkgICAgeyB9IAorCSAgaWYgKF9fY3VyMSB8fCBfX2N1cjIpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIC8vIE5vdyBjaGVjayBvbmUncyBlbGVtZW50cyBhcmUgaW4gdGhlIG90aGVyCisJICBmb3IgKF9fY3VyMSA9IF9faHQxLl9NX2J1Y2tldHNbX19uXSA7IF9fY3VyMTsKKwkgICAgICAgX19jdXIxID0gX19jdXIxLT5fTV9uZXh0KQorCSAgICB7CisJICAgICAgYm9vbCBfZm91bmRfX2N1cjEgPSBmYWxzZTsKKwkgICAgICBmb3IgKF9fY3VyMiA9IF9faHQyLl9NX2J1Y2tldHNbX19uXTsKKwkJICAgX19jdXIyOyBfX2N1cjIgPSBfX2N1cjItPl9NX25leHQpCisJCXsKKwkJICBpZiAoX19jdXIxLT5fTV92YWwgPT0gX19jdXIyLT5fTV92YWwpCisJCSAgICB7CisJCSAgICAgIF9mb3VuZF9fY3VyMSA9IHRydWU7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisJICAgICAgaWYgKCFfZm91bmRfX2N1cjEpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLCBjbGFzcyBfQWxsPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD4mIF9faHQxLAorCSAgICAgICBjb25zdCBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD4mIF9faHQyKQorICAgIHsgcmV0dXJuICEoX19odDEgPT0gX19odDIpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXh0cmFjdCwgY2xhc3MgX0VxS2V5LAorCSAgICBjbGFzcyBfQWxsPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXh0cmFjdCwgX0VxS2V5LCBfQWxsPiYgX19odDEsCisJIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeHRyYWN0LCBfRXFLZXksIF9BbGw+JiBfX2h0MikKKyAgICB7IF9faHQxLnN3YXAoX19odDIpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNsYXNzIF9FcSwgY2xhc3MgX0FsbD4KKyAgICBwYWlyPHR5cGVuYW1lIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6aXRlcmF0b3IsIGJvb2w+CisgICAgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+OjoKKyAgICBpbnNlcnRfdW5pcXVlX25vcmVzaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9ia3RfbnVtKF9fb2JqKTsKKyAgICAgIF9Ob2RlKiBfX2ZpcnN0ID0gX01fYnVja2V0c1tfX25dOworICAgICAgCisgICAgICBmb3IgKF9Ob2RlKiBfX2N1ciA9IF9fZmlyc3Q7IF9fY3VyOyBfX2N1ciA9IF9fY3VyLT5fTV9uZXh0KQorCWlmIChfTV9lcXVhbHMoX01fZ2V0X2tleShfX2N1ci0+X01fdmFsKSwgX01fZ2V0X2tleShfX29iaikpKQorCSAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fY3VyLCB0aGlzKSwgZmFsc2UpOworICAgICAgCisgICAgICBfTm9kZSogX190bXAgPSBfTV9uZXdfbm9kZShfX29iaik7CisgICAgICBfX3RtcC0+X01fbmV4dCA9IF9fZmlyc3Q7CisgICAgICBfTV9idWNrZXRzW19fbl0gPSBfX3RtcDsKKyAgICAgICsrX01fbnVtX2VsZW1lbnRzOworICAgICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fdG1wLCB0aGlzKSwgdHJ1ZSk7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgdHlwZW5hbWUgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+OjppdGVyYXRvcgorICAgIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6CisgICAgaW5zZXJ0X2VxdWFsX25vcmVzaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9ia3RfbnVtKF9fb2JqKTsKKyAgICAgIF9Ob2RlKiBfX2ZpcnN0ID0gX01fYnVja2V0c1tfX25dOworICAgICAgCisgICAgICBmb3IgKF9Ob2RlKiBfX2N1ciA9IF9fZmlyc3Q7IF9fY3VyOyBfX2N1ciA9IF9fY3VyLT5fTV9uZXh0KQorCWlmIChfTV9lcXVhbHMoX01fZ2V0X2tleShfX2N1ci0+X01fdmFsKSwgX01fZ2V0X2tleShfX29iaikpKQorCSAgeworCSAgICBfTm9kZSogX190bXAgPSBfTV9uZXdfbm9kZShfX29iaik7CisJICAgIF9fdG1wLT5fTV9uZXh0ID0gX19jdXItPl9NX25leHQ7CisJICAgIF9fY3VyLT5fTV9uZXh0ID0gX190bXA7CisJICAgICsrX01fbnVtX2VsZW1lbnRzOworCSAgICByZXR1cm4gaXRlcmF0b3IoX190bXAsIHRoaXMpOworCSAgfQorCisgICAgICBfTm9kZSogX190bXAgPSBfTV9uZXdfbm9kZShfX29iaik7CisgICAgICBfX3RtcC0+X01fbmV4dCA9IF9fZmlyc3Q7CisgICAgICBfTV9idWNrZXRzW19fbl0gPSBfX3RtcDsKKyAgICAgICsrX01fbnVtX2VsZW1lbnRzOworICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9fdG1wLCB0aGlzKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNsYXNzIF9FcSwgY2xhc3MgX0FsbD4KKyAgICB0eXBlbmFtZSBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46OnJlZmVyZW5jZQorICAgIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6CisgICAgZmluZF9vcl9pbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgeworICAgICAgcmVzaXplKF9NX251bV9lbGVtZW50cyArIDEpOworCisgICAgICBzaXplX3R5cGUgX19uID0gX01fYmt0X251bShfX29iaik7CisgICAgICBfTm9kZSogX19maXJzdCA9IF9NX2J1Y2tldHNbX19uXTsKKyAgICAgIAorICAgICAgZm9yIChfTm9kZSogX19jdXIgPSBfX2ZpcnN0OyBfX2N1cjsgX19jdXIgPSBfX2N1ci0+X01fbmV4dCkKKwlpZiAoX01fZXF1YWxzKF9NX2dldF9rZXkoX19jdXItPl9NX3ZhbCksIF9NX2dldF9rZXkoX19vYmopKSkKKwkgIHJldHVybiBfX2N1ci0+X01fdmFsOworICAgICAgCisgICAgICBfTm9kZSogX190bXAgPSBfTV9uZXdfbm9kZShfX29iaik7CisgICAgICBfX3RtcC0+X01fbmV4dCA9IF9fZmlyc3Q7CisgICAgICBfTV9idWNrZXRzW19fbl0gPSBfX3RtcDsKKyAgICAgICsrX01fbnVtX2VsZW1lbnRzOworICAgICAgcmV0dXJuIF9fdG1wLT5fTV92YWw7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgcGFpcjx0eXBlbmFtZSBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46Oml0ZXJhdG9yLAorCSB0eXBlbmFtZSBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46Oml0ZXJhdG9yPgorICAgIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6CisgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgIHsKKyAgICAgIHR5cGVkZWYgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IF9QaWk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19uID0gX01fYmt0X251bV9rZXkoX19rZXkpOworCisgICAgICBmb3IgKF9Ob2RlKiBfX2ZpcnN0ID0gX01fYnVja2V0c1tfX25dOyBfX2ZpcnN0OworCSAgIF9fZmlyc3QgPSBfX2ZpcnN0LT5fTV9uZXh0KQorCWlmIChfTV9lcXVhbHMoX01fZ2V0X2tleShfX2ZpcnN0LT5fTV92YWwpLCBfX2tleSkpCisJICB7CisJICAgIGZvciAoX05vZGUqIF9fY3VyID0gX19maXJzdC0+X01fbmV4dDsgX19jdXI7CisJCSBfX2N1ciA9IF9fY3VyLT5fTV9uZXh0KQorCSAgICAgIGlmICghX01fZXF1YWxzKF9NX2dldF9rZXkoX19jdXItPl9NX3ZhbCksIF9fa2V5KSkKKwkJcmV0dXJuIF9QaWkoaXRlcmF0b3IoX19maXJzdCwgdGhpcyksIGl0ZXJhdG9yKF9fY3VyLCB0aGlzKSk7CisJICAgIGZvciAoc2l6ZV90eXBlIF9fbSA9IF9fbiArIDE7IF9fbSA8IF9NX2J1Y2tldHMuc2l6ZSgpOyArK19fbSkKKwkgICAgICBpZiAoX01fYnVja2V0c1tfX21dKQorCQlyZXR1cm4gX1BpaShpdGVyYXRvcihfX2ZpcnN0LCB0aGlzKSwKKwkJCSAgICBpdGVyYXRvcihfTV9idWNrZXRzW19fbV0sIHRoaXMpKTsKKwkgICAgcmV0dXJuIF9QaWkoaXRlcmF0b3IoX19maXJzdCwgdGhpcyksIGVuZCgpKTsKKwkgIH0KKyAgICAgIHJldHVybiBfUGlpKGVuZCgpLCBlbmQoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgcGFpcjx0eXBlbmFtZSBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46OmNvbnN0X2l0ZXJhdG9yLAorCSB0eXBlbmFtZSBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46OmNvbnN0X2l0ZXJhdG9yPgorICAgIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6CisgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVkZWYgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IF9QaWk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19uID0gX01fYmt0X251bV9rZXkoX19rZXkpOworCisgICAgICBmb3IgKGNvbnN0IF9Ob2RlKiBfX2ZpcnN0ID0gX01fYnVja2V0c1tfX25dOyBfX2ZpcnN0OworCSAgIF9fZmlyc3QgPSBfX2ZpcnN0LT5fTV9uZXh0KQorCXsKKwkgIGlmIChfTV9lcXVhbHMoX01fZ2V0X2tleShfX2ZpcnN0LT5fTV92YWwpLCBfX2tleSkpCisJICAgIHsKKwkgICAgICBmb3IgKGNvbnN0IF9Ob2RlKiBfX2N1ciA9IF9fZmlyc3QtPl9NX25leHQ7IF9fY3VyOworCQkgICBfX2N1ciA9IF9fY3VyLT5fTV9uZXh0KQorCQlpZiAoIV9NX2VxdWFscyhfTV9nZXRfa2V5KF9fY3VyLT5fTV92YWwpLCBfX2tleSkpCisJCSAgcmV0dXJuIF9QaWkoY29uc3RfaXRlcmF0b3IoX19maXJzdCwgdGhpcyksCisJCQkgICAgICBjb25zdF9pdGVyYXRvcihfX2N1ciwgdGhpcykpOworCSAgICAgIGZvciAoc2l6ZV90eXBlIF9fbSA9IF9fbiArIDE7IF9fbSA8IF9NX2J1Y2tldHMuc2l6ZSgpOyArK19fbSkKKwkJaWYgKF9NX2J1Y2tldHNbX19tXSkKKwkJICByZXR1cm4gX1BpaShjb25zdF9pdGVyYXRvcihfX2ZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGNvbnN0X2l0ZXJhdG9yKF9NX2J1Y2tldHNbX19tXSwgdGhpcykpOworCSAgICAgIHJldHVybiBfUGlpKGNvbnN0X2l0ZXJhdG9yKF9fZmlyc3QsIHRoaXMpLCBlbmQoKSk7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX1BpaShlbmQoKSwgZW5kKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLCBjbGFzcyBfQWxsPgorICAgIHR5cGVuYW1lIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6c2l6ZV90eXBlCisgICAgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+OjoKKyAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IF9NX2JrdF9udW1fa2V5KF9fa2V5KTsKKyAgICAgIF9Ob2RlKiBfX2ZpcnN0ID0gX01fYnVja2V0c1tfX25dOworICAgICAgX05vZGUqIF9fc2F2ZWRfc2xvdCA9IDA7CisgICAgICBzaXplX3R5cGUgX19lcmFzZWQgPSAwOworCisgICAgICBpZiAoX19maXJzdCkKKwl7CisJICBfTm9kZSogX19jdXIgPSBfX2ZpcnN0OworCSAgX05vZGUqIF9fbmV4dCA9IF9fY3VyLT5fTV9uZXh0OworCSAgd2hpbGUgKF9fbmV4dCkKKwkgICAgeworCSAgICAgIGlmIChfTV9lcXVhbHMoX01fZ2V0X2tleShfX25leHQtPl9NX3ZhbCksIF9fa2V5KSkKKwkJeworCQkgIGlmICgmX01fZ2V0X2tleShfX25leHQtPl9NX3ZhbCkgIT0gJl9fa2V5KQorCQkgICAgeworCQkgICAgICBfX2N1ci0+X01fbmV4dCA9IF9fbmV4dC0+X01fbmV4dDsKKwkJICAgICAgX01fZGVsZXRlX25vZGUoX19uZXh0KTsKKwkJICAgICAgX19uZXh0ID0gX19jdXItPl9NX25leHQ7CisJCSAgICAgICsrX19lcmFzZWQ7CisJCSAgICAgIC0tX01fbnVtX2VsZW1lbnRzOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgX19zYXZlZF9zbG90ID0gX19jdXI7CisJCSAgICAgIF9fY3VyID0gX19uZXh0OworCQkgICAgICBfX25leHQgPSBfX2N1ci0+X01fbmV4dDsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIF9fY3VyID0gX19uZXh0OworCQkgIF9fbmV4dCA9IF9fY3VyLT5fTV9uZXh0OworCQl9CisJICAgIH0KKwkgIGJvb2wgX19kZWxldGVfZmlyc3QgPSBfTV9lcXVhbHMoX01fZ2V0X2tleShfX2ZpcnN0LT5fTV92YWwpLCBfX2tleSk7CisJICBpZiAoX19zYXZlZF9zbG90KQorCSAgICB7CisJICAgICAgX19uZXh0ID0gX19zYXZlZF9zbG90LT5fTV9uZXh0OworCSAgICAgIF9fc2F2ZWRfc2xvdC0+X01fbmV4dCA9IF9fbmV4dC0+X01fbmV4dDsKKwkgICAgICBfTV9kZWxldGVfbm9kZShfX25leHQpOworCSAgICAgICsrX19lcmFzZWQ7CisJICAgICAgLS1fTV9udW1fZWxlbWVudHM7CisJICAgIH0KKwkgIGlmIChfX2RlbGV0ZV9maXJzdCkKKwkgICAgeworCSAgICAgIF9NX2J1Y2tldHNbX19uXSA9IF9fZmlyc3QtPl9NX25leHQ7CisJICAgICAgX01fZGVsZXRlX25vZGUoX19maXJzdCk7CisJICAgICAgKytfX2VyYXNlZDsKKwkgICAgICAtLV9NX251bV9lbGVtZW50czsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBfX2VyYXNlZDsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNsYXNzIF9FcSwgY2xhc3MgX0FsbD4KKyAgICB2b2lkIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6CisgICAgZXJhc2UoY29uc3QgaXRlcmF0b3ImIF9faXQpCisgICAgeworICAgICAgX05vZGUqIF9fcCA9IF9faXQuX01fY3VyOworICAgICAgaWYgKF9fcCkKKwl7CisJICBjb25zdCBzaXplX3R5cGUgX19uID0gX01fYmt0X251bShfX3AtPl9NX3ZhbCk7CisJICBfTm9kZSogX19jdXIgPSBfTV9idWNrZXRzW19fbl07CisJICAKKwkgIGlmIChfX2N1ciA9PSBfX3ApCisJICAgIHsKKwkgICAgICBfTV9idWNrZXRzW19fbl0gPSBfX2N1ci0+X01fbmV4dDsKKwkgICAgICBfTV9kZWxldGVfbm9kZShfX2N1cik7CisJICAgICAgLS1fTV9udW1fZWxlbWVudHM7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9Ob2RlKiBfX25leHQgPSBfX2N1ci0+X01fbmV4dDsKKwkgICAgICB3aGlsZSAoX19uZXh0KQorCQl7CisJCSAgaWYgKF9fbmV4dCA9PSBfX3ApCisJCSAgICB7CisJCSAgICAgIF9fY3VyLT5fTV9uZXh0ID0gX19uZXh0LT5fTV9uZXh0OworCQkgICAgICBfTV9kZWxldGVfbm9kZShfX25leHQpOworCQkgICAgICAtLV9NX251bV9lbGVtZW50czsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBfX2N1ciA9IF9fbmV4dDsKKwkJICAgICAgX19uZXh0ID0gX19jdXItPl9NX25leHQ7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNsYXNzIF9FcSwgY2xhc3MgX0FsbD4KKyAgICB2b2lkCisgICAgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+OjoKKyAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgc2l6ZV90eXBlIF9fZl9idWNrZXQgPSBfX2ZpcnN0Ll9NX2N1ciA/IF9NX2JrdF9udW0oX19maXJzdC5fTV9jdXItPl9NX3ZhbCkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9NX2J1Y2tldHMuc2l6ZSgpOworCisgICAgICBzaXplX3R5cGUgX19sX2J1Y2tldCA9IF9fbGFzdC5fTV9jdXIgPyBfTV9ia3RfbnVtKF9fbGFzdC5fTV9jdXItPl9NX3ZhbCkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX01fYnVja2V0cy5zaXplKCk7CisKKyAgICAgIGlmIChfX2ZpcnN0Ll9NX2N1ciA9PSBfX2xhc3QuX01fY3VyKQorCXJldHVybjsKKyAgICAgIGVsc2UgaWYgKF9fZl9idWNrZXQgPT0gX19sX2J1Y2tldCkKKwlfTV9lcmFzZV9idWNrZXQoX19mX2J1Y2tldCwgX19maXJzdC5fTV9jdXIsIF9fbGFzdC5fTV9jdXIpOworICAgICAgZWxzZQorCXsKKwkgIF9NX2VyYXNlX2J1Y2tldChfX2ZfYnVja2V0LCBfX2ZpcnN0Ll9NX2N1ciwgMCk7CisJICBmb3IgKHNpemVfdHlwZSBfX24gPSBfX2ZfYnVja2V0ICsgMTsgX19uIDwgX19sX2J1Y2tldDsgKytfX24pCisJICAgIF9NX2VyYXNlX2J1Y2tldChfX24sIDApOworCSAgaWYgKF9fbF9idWNrZXQgIT0gX01fYnVja2V0cy5zaXplKCkpCisJICAgIF9NX2VyYXNlX2J1Y2tldChfX2xfYnVja2V0LCBfX2xhc3QuX01fY3VyKTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgaW5saW5lIHZvaWQKKyAgICBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46OgorICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICBlcmFzZShpdGVyYXRvcihjb25zdF9jYXN0PF9Ob2RlKj4oX19maXJzdC5fTV9jdXIpLAorCQkgICAgIGNvbnN0X2Nhc3Q8aGFzaHRhYmxlKj4oX19maXJzdC5fTV9odCkpLAorCSAgICBpdGVyYXRvcihjb25zdF9jYXN0PF9Ob2RlKj4oX19sYXN0Ll9NX2N1ciksCisJCSAgICAgY29uc3RfY2FzdDxoYXNodGFibGUqPihfX2xhc3QuX01faHQpKSk7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgaW5saW5lIHZvaWQKKyAgICBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46OgorICAgIGVyYXNlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2l0KQorICAgIHsgZXJhc2UoaXRlcmF0b3IoY29uc3RfY2FzdDxfTm9kZSo+KF9faXQuX01fY3VyKSwKKwkJICAgICBjb25zdF9jYXN0PGhhc2h0YWJsZSo+KF9faXQuX01faHQpKSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLCBjbGFzcyBfQWxsPgorICAgIHZvaWQKKyAgICBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46OgorICAgIHJlc2l6ZShzaXplX3R5cGUgX19udW1fZWxlbWVudHNfaGludCkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfbiA9IF9NX2J1Y2tldHMuc2l6ZSgpOworICAgICAgaWYgKF9fbnVtX2VsZW1lbnRzX2hpbnQgPiBfX29sZF9uKQorCXsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9uZXh0X3NpemUoX19udW1fZWxlbWVudHNfaGludCk7CisJICBpZiAoX19uID4gX19vbGRfbikKKwkgICAgeworCSAgICAgIF9WZWN0b3JfdHlwZSBfX3RtcChfX24sIChfTm9kZSopKDApLCBfTV9idWNrZXRzLmdldF9hbGxvY2F0b3IoKSk7CisJICAgICAgX190cnkKKwkJeworCQkgIGZvciAoc2l6ZV90eXBlIF9fYnVja2V0ID0gMDsgX19idWNrZXQgPCBfX29sZF9uOyArK19fYnVja2V0KQorCQkgICAgeworCQkgICAgICBfTm9kZSogX19maXJzdCA9IF9NX2J1Y2tldHNbX19idWNrZXRdOworCQkgICAgICB3aGlsZSAoX19maXJzdCkKKwkJCXsKKwkJCSAgc2l6ZV90eXBlIF9fbmV3X2J1Y2tldCA9IF9NX2JrdF9udW0oX19maXJzdC0+X01fdmFsLAorCQkJCQkJCSAgICAgIF9fbik7CisJCQkgIF9NX2J1Y2tldHNbX19idWNrZXRdID0gX19maXJzdC0+X01fbmV4dDsKKwkJCSAgX19maXJzdC0+X01fbmV4dCA9IF9fdG1wW19fbmV3X2J1Y2tldF07CisJCQkgIF9fdG1wW19fbmV3X2J1Y2tldF0gPSBfX2ZpcnN0OworCQkJICBfX2ZpcnN0ID0gX01fYnVja2V0c1tfX2J1Y2tldF07CisJCQl9CisJCSAgICB9CisJCSAgX01fYnVja2V0cy5zd2FwKF9fdG1wKTsKKwkJfQorCSAgICAgIF9fY2F0Y2goLi4uKQorCQl7CisJCSAgZm9yIChzaXplX3R5cGUgX19idWNrZXQgPSAwOyBfX2J1Y2tldCA8IF9fdG1wLnNpemUoKTsKKwkJICAgICAgICsrX19idWNrZXQpCisJCSAgICB7CisJCSAgICAgIHdoaWxlIChfX3RtcFtfX2J1Y2tldF0pCisJCQl7CisJCQkgIF9Ob2RlKiBfX25leHQgPSBfX3RtcFtfX2J1Y2tldF0tPl9NX25leHQ7CisJCQkgIF9NX2RlbGV0ZV9ub2RlKF9fdG1wW19fYnVja2V0XSk7CisJCQkgIF9fdG1wW19fYnVja2V0XSA9IF9fbmV4dDsKKwkJCX0KKwkJICAgIH0KKwkJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLCBjbGFzcyBfQWxsPgorICAgIHZvaWQKKyAgICBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46OgorICAgIF9NX2VyYXNlX2J1Y2tldChjb25zdCBzaXplX3R5cGUgX19uLCBfTm9kZSogX19maXJzdCwgX05vZGUqIF9fbGFzdCkKKyAgICB7CisgICAgICBfTm9kZSogX19jdXIgPSBfTV9idWNrZXRzW19fbl07CisgICAgICBpZiAoX19jdXIgPT0gX19maXJzdCkKKwlfTV9lcmFzZV9idWNrZXQoX19uLCBfX2xhc3QpOworICAgICAgZWxzZQorCXsKKwkgIF9Ob2RlKiBfX25leHQ7CisJICBmb3IgKF9fbmV4dCA9IF9fY3VyLT5fTV9uZXh0OworCSAgICAgICBfX25leHQgIT0gX19maXJzdDsKKwkgICAgICAgX19jdXIgPSBfX25leHQsIF9fbmV4dCA9IF9fY3VyLT5fTV9uZXh0KQorCSAgICA7CisJICB3aGlsZSAoX19uZXh0ICE9IF9fbGFzdCkKKwkgICAgeworCSAgICAgIF9fY3VyLT5fTV9uZXh0ID0gX19uZXh0LT5fTV9uZXh0OworCSAgICAgIF9NX2RlbGV0ZV9ub2RlKF9fbmV4dCk7CisJICAgICAgX19uZXh0ID0gX19jdXItPl9NX25leHQ7CisJICAgICAgLS1fTV9udW1fZWxlbWVudHM7CisJICAgIH0KKwl9CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgdm9pZAorICAgIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6CisgICAgX01fZXJhc2VfYnVja2V0KGNvbnN0IHNpemVfdHlwZSBfX24sIF9Ob2RlKiBfX2xhc3QpCisgICAgeworICAgICAgX05vZGUqIF9fY3VyID0gX01fYnVja2V0c1tfX25dOworICAgICAgd2hpbGUgKF9fY3VyICE9IF9fbGFzdCkKKwl7CisJICBfTm9kZSogX19uZXh0ID0gX19jdXItPl9NX25leHQ7CisJICBfTV9kZWxldGVfbm9kZShfX2N1cik7CisJICBfX2N1ciA9IF9fbmV4dDsKKwkgIF9NX2J1Y2tldHNbX19uXSA9IF9fY3VyOworCSAgLS1fTV9udW1fZWxlbWVudHM7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLCBjbGFzcyBfQWxsPgorICAgIHZvaWQKKyAgICBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46OgorICAgIGNsZWFyKCkKKyAgICB7CisgICAgICBpZiAoX01fbnVtX2VsZW1lbnRzID09IDApCisJcmV0dXJuOworCisgICAgICBmb3IgKHNpemVfdHlwZSBfX2kgPSAwOyBfX2kgPCBfTV9idWNrZXRzLnNpemUoKTsgKytfX2kpCisJeworCSAgX05vZGUqIF9fY3VyID0gX01fYnVja2V0c1tfX2ldOworCSAgd2hpbGUgKF9fY3VyICE9IDApCisJICAgIHsKKwkgICAgICBfTm9kZSogX19uZXh0ID0gX19jdXItPl9NX25leHQ7CisJICAgICAgX01fZGVsZXRlX25vZGUoX19jdXIpOworCSAgICAgIF9fY3VyID0gX19uZXh0OworCSAgICB9CisJICBfTV9idWNrZXRzW19faV0gPSAwOworCX0KKyAgICAgIF9NX251bV9lbGVtZW50cyA9IDA7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgdm9pZAorICAgIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6CisgICAgX01fY29weV9mcm9tKGNvbnN0IGhhc2h0YWJsZSYgX19odCkKKyAgICB7CisgICAgICBfTV9idWNrZXRzLmNsZWFyKCk7CisgICAgICBfTV9idWNrZXRzLnJlc2VydmUoX19odC5fTV9idWNrZXRzLnNpemUoKSk7CisgICAgICBfTV9idWNrZXRzLmluc2VydChfTV9idWNrZXRzLmVuZCgpLCBfX2h0Ll9NX2J1Y2tldHMuc2l6ZSgpLCAoX05vZGUqKSAwKTsKKyAgICAgIF9fdHJ5CisJeworCSAgZm9yIChzaXplX3R5cGUgX19pID0gMDsgX19pIDwgX19odC5fTV9idWNrZXRzLnNpemUoKTsgKytfX2kpIHsKKwkgICAgY29uc3QgX05vZGUqIF9fY3VyID0gX19odC5fTV9idWNrZXRzW19faV07CisJICAgIGlmIChfX2N1cikKKwkgICAgICB7CisJCV9Ob2RlKiBfX2xvY2FsX2NvcHkgPSBfTV9uZXdfbm9kZShfX2N1ci0+X01fdmFsKTsKKwkJX01fYnVja2V0c1tfX2ldID0gX19sb2NhbF9jb3B5OworCQkKKwkJZm9yIChfTm9kZSogX19uZXh0ID0gX19jdXItPl9NX25leHQ7CisJCSAgICAgX19uZXh0OworCQkgICAgIF9fY3VyID0gX19uZXh0LCBfX25leHQgPSBfX2N1ci0+X01fbmV4dCkKKwkJICB7CisJCSAgICBfX2xvY2FsX2NvcHktPl9NX25leHQgPSBfTV9uZXdfbm9kZShfX25leHQtPl9NX3ZhbCk7CisJCSAgICBfX2xvY2FsX2NvcHkgPSBfX2xvY2FsX2NvcHktPl9NX25leHQ7CisJCSAgfQorCSAgICAgIH0KKwkgIH0KKwkgIF9NX251bV9lbGVtZW50cyA9IF9faHQuX01fbnVtX2VsZW1lbnRzOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIGNsZWFyKCk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iYWNrd2FyZC9zdHJzdHJlYW0gYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JhY2t3YXJkL3N0cnN0cmVhbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjY1YmUwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iYWNrd2FyZC9zdHJzdHJlYW0KQEAgLTAsMCArMSwxODQgQEAKKy8vIEJhY2t3YXJkLWNvbXBhdCBzdXBwb3J0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8vIFdBUk5JTkc6IFRoZSBjbGFzc2VzIGRlZmluZWQgaW4gdGhpcyBoZWFkZXIgYXJlIERFUFJFQ0FURUQuICBUaGlzCisvLyBoZWFkZXIgaXMgZGVmaW5lZCBpbiBzZWN0aW9uIEQuNy4xIG9mIHRoZSBDKysgc3RhbmRhcmQsIGFuZCBpdAorLy8gTUFZIEJFIFJFTU9WRUQgaW4gYSBmdXR1cmUgc3RhbmRhcmQgcmV2aXNpb24uICBPbmUgc2hvdWxkIHVzZSB0aGUKKy8vIGhlYWRlciA8c3N0cmVhbT4gaW5zdGVhZC4KKworLyoqIEBmaWxlIGJhY2t3YXJkL3N0cnN0cmVhbQorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3NzdHJlYW19CisgKi8KKworI2lmbmRlZiBfQkFDS1dBUkRfU1RSU1RSRUFNCisjZGVmaW5lIF9CQUNLV0FSRF9TVFJTVFJFQU0KKworI2luY2x1ZGUgImJhY2t3YXJkX3dhcm5pbmcuaCIKKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8aW9zPgorI2luY2x1ZGUgPGlzdHJlYW0+CisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBDbGFzcyBzdHJzdHJlYW1idWYsIGEgc3RyZWFtYnVmIGNsYXNzIHRoYXQgbWFuYWdlcyBhbiBhcnJheSBvZiBjaGFyLgorICAvLyBOb3RlIHRoYXQgdGhpcyBjbGFzcyBpcyBub3QgYSB0ZW1wbGF0ZS4KKyAgY2xhc3Mgc3Ryc3RyZWFtYnVmIDogcHVibGljIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyLCBjaGFyX3RyYWl0czxjaGFyPiA+CisgIHsKKyAgcHVibGljOgorICAgIC8vIFR5cGVzLgorICAgIHR5cGVkZWYgY2hhcl90cmFpdHM8Y2hhcj4gICAgICAgICAgICAgIF9UcmFpdHM7CisgICAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8Y2hhciwgX1RyYWl0cz4gX0Jhc2U7CisKKyAgcHVibGljOgorICAgIC8vIENvbnN0cnVjdG9yLCBkZXN0cnVjdG9yCisgICAgZXhwbGljaXQgc3Ryc3RyZWFtYnVmKHN0cmVhbXNpemUgX19pbml0aWFsX2NhcGFjaXR5ID0gMCk7CisgICAgc3Ryc3RyZWFtYnVmKHZvaWQqICgqX19hbGxvYykoc2l6ZV90KSwgdm9pZCAoKl9fZnJlZSkodm9pZCopKTsKKworICAgIHN0cnN0cmVhbWJ1ZihjaGFyKiBfX2dldCwgc3RyZWFtc2l6ZSBfX24sIGNoYXIqIF9fcHV0ID0gMCkgdGhyb3cgKCk7CisgICAgc3Ryc3RyZWFtYnVmKHNpZ25lZCBjaGFyKiBfX2dldCwgc3RyZWFtc2l6ZSBfX24sIHNpZ25lZCBjaGFyKiBfX3B1dCA9IDApIHRocm93ICgpOworICAgIHN0cnN0cmVhbWJ1Zih1bnNpZ25lZCBjaGFyKiBfX2dldCwgc3RyZWFtc2l6ZSBfX24sIHVuc2lnbmVkIGNoYXIqIF9fcHV0PTApIHRocm93ICgpOworCisgICAgc3Ryc3RyZWFtYnVmKGNvbnN0IGNoYXIqIF9fZ2V0LCBzdHJlYW1zaXplIF9fbikgdGhyb3cgKCk7CisgICAgc3Ryc3RyZWFtYnVmKGNvbnN0IHNpZ25lZCBjaGFyKiBfX2dldCwgc3RyZWFtc2l6ZSBfX24pIHRocm93ICgpOworICAgIHN0cnN0cmVhbWJ1Zihjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2dldCwgc3RyZWFtc2l6ZSBfX24pIHRocm93ICgpOworCisgICAgdmlydHVhbCB+c3Ryc3RyZWFtYnVmKCk7CisKKyAgcHVibGljOgorICAgIHZvaWQgZnJlZXplKGJvb2wgPSB0cnVlKSB0aHJvdyAoKTsKKyAgICBjaGFyKiBzdHIoKSB0aHJvdyAoKTsKKyAgICBfR0xJQkNYWF9QVVJFIGludCBwY291bnQoKSBjb25zdCB0aHJvdyAoKTsKKworICBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBpbnRfdHlwZSBvdmVyZmxvdyhpbnRfdHlwZSBfX2MgID0gX1RyYWl0czo6ZW9mKCkpOworICAgIHZpcnR1YWwgaW50X3R5cGUgcGJhY2tmYWlsKGludF90eXBlIF9fYyA9IF9UcmFpdHM6OmVvZigpKTsKKyAgICB2aXJ0dWFsIGludF90eXBlIHVuZGVyZmxvdygpOworICAgIHZpcnR1YWwgX0Jhc2UqIHNldGJ1ZihjaGFyKiBfX2J1Ziwgc3RyZWFtc2l6ZSBfX24pOworICAgIHZpcnR1YWwgcG9zX3R5cGUgc2Vla29mZihvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX19kaXIsCisJCQkgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUKKwkJCSAgICAgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyAgICB2aXJ0dWFsIHBvc190eXBlIHNlZWtwb3MocG9zX3R5cGUgX19wb3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUKKwkJCSAgICAgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKworICBwcml2YXRlOgorICAgIHN0cnN0cmVhbWJ1ZiYKKyAgICBvcGVyYXRvcj0oY29uc3Qgc3Ryc3RyZWFtYnVmJik7CisKKyAgICBzdHJzdHJlYW1idWYoY29uc3Qgc3Ryc3RyZWFtYnVmJik7CisKKyAgICAvLyBEeW5hbWljIGFsbG9jYXRpb24sIHBvc3NpYmx5IHVzaW5nIF9NX2FsbG9jX2Z1biBhbmQgX01fZnJlZV9mdW4uCisgICAgY2hhciogX01fYWxsb2Moc2l6ZV90KTsKKyAgICB2b2lkICBfTV9mcmVlKGNoYXIqKTsKKworICAgIC8vIEhlbHBlciBmdW5jdGlvbiB1c2VkIGluIGNvbnN0cnVjdG9ycy4KKyAgICB2b2lkIF9NX3NldHVwKGNoYXIqIF9fZ2V0LCBjaGFyKiBfX3B1dCwgc3RyZWFtc2l6ZSBfX24pIHRocm93ICgpOworCisgIHByaXZhdGU6CisgICAgLy8gRGF0YSBtZW1iZXJzLgorICAgIHZvaWQqICgqX01fYWxsb2NfZnVuKShzaXplX3QpOworICAgIHZvaWQgICgqX01fZnJlZV9mdW4pKHZvaWQqKTsKKworICAgIGJvb2wgX01fZHluYW1pYyAgOiAxOworICAgIGJvb2wgX01fZnJvemVuICAgOiAxOworICAgIGJvb2wgX01fY29uc3RhbnQgOiAxOworICB9OworCisgIC8vIENsYXNzIGlzdHJzdHJlYW0sIGFuIGlzdHJlYW0gdGhhdCBtYW5hZ2VzIGEgc3Ryc3RyZWFtYnVmLgorICBjbGFzcyBpc3Ryc3RyZWFtIDogcHVibGljIGJhc2ljX2lzdHJlYW08Y2hhcj4KKyAgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgaXN0cnN0cmVhbShjaGFyKik7CisgICAgZXhwbGljaXQgaXN0cnN0cmVhbShjb25zdCBjaGFyKik7CisgICAgaXN0cnN0cmVhbShjaGFyKiAsIHN0cmVhbXNpemUpOworICAgIGlzdHJzdHJlYW0oY29uc3QgY2hhciosIHN0cmVhbXNpemUpOworICAgIHZpcnR1YWwgfmlzdHJzdHJlYW0oKTsKKworICAgIF9HTElCQ1hYX0NPTlNUIHN0cnN0cmVhbWJ1ZiogcmRidWYoKSBjb25zdCB0aHJvdyAoKTsKKyAgICBjaGFyKiBzdHIoKSB0aHJvdyAoKTsKKworICBwcml2YXRlOgorICAgIHN0cnN0cmVhbWJ1ZiBfTV9idWY7CisgIH07CisKKyAgLy8gQ2xhc3Mgb3N0cnN0cmVhbQorICBjbGFzcyBvc3Ryc3RyZWFtIDogcHVibGljIGJhc2ljX29zdHJlYW08Y2hhcj4KKyAgeworICBwdWJsaWM6CisgICAgb3N0cnN0cmVhbSgpOworICAgIG9zdHJzdHJlYW0oY2hhciosIGludCwgaW9zX2Jhc2U6Om9wZW5tb2RlID0gaW9zX2Jhc2U6Om91dCk7CisgICAgdmlydHVhbCB+b3N0cnN0cmVhbSgpOworCisgICAgX0dMSUJDWFhfQ09OU1Qgc3Ryc3RyZWFtYnVmKiByZGJ1ZigpIGNvbnN0IHRocm93ICgpOworICAgIHZvaWQgZnJlZXplKGJvb2wgPSB0cnVlKSB0aHJvdygpOworICAgIGNoYXIqIHN0cigpIHRocm93ICgpOworICAgIF9HTElCQ1hYX1BVUkUgaW50IHBjb3VudCgpIGNvbnN0IHRocm93ICgpOworCisgIHByaXZhdGU6CisgICAgc3Ryc3RyZWFtYnVmIF9NX2J1ZjsKKyAgfTsKKworICAvLyBDbGFzcyBzdHJzdHJlYW0KKyAgY2xhc3Mgc3Ryc3RyZWFtIDogcHVibGljIGJhc2ljX2lvc3RyZWFtPGNoYXI+CisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIGNoYXJfdHJhaXRzPGNoYXI+OjppbnRfdHlwZSBpbnRfdHlwZTsKKyAgICB0eXBlZGVmIGNoYXJfdHJhaXRzPGNoYXI+Ojpwb3NfdHlwZSBwb3NfdHlwZTsKKyAgICB0eXBlZGVmIGNoYXJfdHJhaXRzPGNoYXI+OjpvZmZfdHlwZSBvZmZfdHlwZTsKKworICAgIHN0cnN0cmVhbSgpOworICAgIHN0cnN0cmVhbShjaGFyKiwgaW50LCBpb3NfYmFzZTo6b3Blbm1vZGUgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKyAgICB2aXJ0dWFsIH5zdHJzdHJlYW0oKTsKKworICAgIF9HTElCQ1hYX0NPTlNUIHN0cnN0cmVhbWJ1ZiogcmRidWYoKSBjb25zdCB0aHJvdyAoKTsKKyAgICB2b2lkIGZyZWV6ZShib29sID0gdHJ1ZSkgdGhyb3cgKCk7CisgICAgX0dMSUJDWFhfUFVSRSBpbnQgcGNvdW50KCkgY29uc3QgdGhyb3cgKCk7CisgICAgY2hhciogc3RyKCkgdGhyb3cgKCk7CisKKyAgcHJpdmF0ZToKKyAgICBzdHJzdHJlYW1idWYgX01fYnVmOworICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2FsZ29yaXRobWZ3ZC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2FsZ29yaXRobWZ3ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MzIxYjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYWxnb3JpdGhtZndkLmgKQEAgLTAsMCArMSw4MjYgQEAKKy8vIDxhbGdvcml0aG0+IEZvcndhcmQgZGVjbGFyYXRpb25zICAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9hbGdvcml0aG1md2QuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2FsZ29yaXRobX0KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0FMR09SSVRITUZXRF9ICisjZGVmaW5lIF9HTElCQ1hYX0FMR09SSVRITUZXRF9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9wYWlyLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3JfYmFzZV90eXBlcy5oPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKgorICAgIGFkamFjZW50X2ZpbmQKKyAgICBhbGxfb2YgKEMrKzB4KQorICAgIGFueV9vZiAoQysrMHgpCisgICAgYmluYXJ5X3NlYXJjaAorICAgIGNvcHkKKyAgICBjb3B5X2JhY2t3YXJkCisgICAgY29weV9pZiAoQysrMHgpCisgICAgY29weV9uIChDKysweCkKKyAgICBjb3VudAorICAgIGNvdW50X2lmCisgICAgZXF1YWwKKyAgICBlcXVhbF9yYW5nZQorICAgIGZpbGwKKyAgICBmaWxsX24KKyAgICBmaW5kCisgICAgZmluZF9lbmQKKyAgICBmaW5kX2ZpcnN0X29mCisgICAgZmluZF9pZgorICAgIGZpbmRfaWZfbm90IChDKysweCkKKyAgICBmb3JfZWFjaAorICAgIGdlbmVyYXRlCisgICAgZ2VuZXJhdGVfbgorICAgIGluY2x1ZGVzCisgICAgaW5wbGFjZV9tZXJnZQorICAgIGlzX2hlYXAgKEMrKzB4KQorICAgIGlzX2hlYXBfdW50aWwgKEMrKzB4KQorICAgIGlzX3BhcnRpdGlvbmVkIChDKysweCkKKyAgICBpc19zb3J0ZWQgKEMrKzB4KQorICAgIGlzX3NvcnRlZF91bnRpbCAoQysrMHgpCisgICAgaXRlcl9zd2FwCisgICAgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUKKyAgICBsb3dlcl9ib3VuZAorICAgIG1ha2VfaGVhcAorICAgIG1heAorICAgIG1heF9lbGVtZW50CisgICAgbWVyZ2UKKyAgICBtaW4KKyAgICBtaW5fZWxlbWVudAorICAgIG1pbm1heCAoQysrMHgpCisgICAgbWlubWF4X2VsZW1lbnQgKEMrKzB4KQorICAgIG1pc21hdGNoCisgICAgbmV4dF9wZXJtdXRhdGlvbgorICAgIG5vbmVfb2YgKEMrKzB4KQorICAgIG50aF9lbGVtZW50CisgICAgcGFydGlhbF9zb3J0CisgICAgcGFydGlhbF9zb3J0X2NvcHkKKyAgICBwYXJ0aXRpb24KKyAgICBwYXJ0aXRpb25fY29weSAoQysrMHgpCisgICAgcGFydGl0aW9uX3BvaW50IChDKysweCkKKyAgICBwb3BfaGVhcAorICAgIHByZXZfcGVybXV0YXRpb24KKyAgICBwdXNoX2hlYXAKKyAgICByYW5kb21fc2h1ZmZsZQorICAgIHJlbW92ZQorICAgIHJlbW92ZV9jb3B5CisgICAgcmVtb3ZlX2NvcHlfaWYKKyAgICByZW1vdmVfaWYKKyAgICByZXBsYWNlCisgICAgcmVwbGFjZV9jb3B5CisgICAgcmVwbGFjZV9jb3B5X2lmCisgICAgcmVwbGFjZV9pZgorICAgIHJldmVyc2UKKyAgICByZXZlcnNlX2NvcHkKKyAgICByb3RhdGUKKyAgICByb3RhdGVfY29weQorICAgIHNlYXJjaAorICAgIHNlYXJjaF9uCisgICAgc2V0X2RpZmZlcmVuY2UKKyAgICBzZXRfaW50ZXJzZWN0aW9uCisgICAgc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlCisgICAgc2V0X3VuaW9uCisgICAgc2h1ZmZsZSAoQysrMHgpCisgICAgc29ydAorICAgIHNvcnRfaGVhcAorICAgIHN0YWJsZV9wYXJ0aXRpb24KKyAgICBzdGFibGVfc29ydAorICAgIHN3YXAKKyAgICBzd2FwX3JhbmdlcworICAgIHRyYW5zZm9ybQorICAgIHVuaXF1ZQorICAgIHVuaXF1ZV9jb3B5CisgICAgdXBwZXJfYm91bmQKKyAgKi8KKworICAvKioKKyAgICogQGRlZmdyb3VwIGFsZ29yaXRobXMgQWxnb3JpdGhtcworICAgKgorICAgKiBDb21wb25lbnRzIGZvciBwZXJmb3JtaW5nIGFsZ29yaXRobWljIG9wZXJhdGlvbnMuIEluY2x1ZGVzCisgICAqIG5vbi1tb2RpZnlpbmcgc2VxdWVuY2UsIG1vZGlmeWluZyAobXV0YXRpbmcpIHNlcXVlbmNlLCBzb3J0aW5nLAorICAgKiBzZWFyY2hpbmcsIG1lcmdlLCBwYXJ0aXRpb24sIGhlYXAsIHNldCwgbWluaW1hLCBtYXhpbWEsIGFuZAorICAgKiBwZXJtdXRhdGlvbiBvcGVyYXRpb25zLgorICAgKi8KKworICAvKioKKyAgICogQGRlZmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMgTXV0YXRpbmcKKyAgICogQGluZ3JvdXAgYWxnb3JpdGhtcworICAgKi8KKworICAvKioKKyAgICogQGRlZmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zIE5vbi1NdXRhdGluZworICAgKiBAaW5ncm91cCBhbGdvcml0aG1zCisgICAqLworCisgIC8qKgorICAgKiBAZGVmZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zIFNvcnRpbmcKKyAgICogQGluZ3JvdXAgYWxnb3JpdGhtcworICAgKi8KKworICAvKioKKyAgICogQGRlZmdyb3VwIHNldF9hbGdvcml0aG1zIFNldCBPcGVyYXRpb24KKyAgICogQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqCisgICAqIFRoZXNlIGFsZ29yaXRobXMgYXJlIGNvbW1vbiBzZXQgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gc2VxdWVuY2VzCisgICAqIHRoYXQgYXJlIGFscmVhZHkgc29ydGVkLiBUaGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIHdpbGwgYmUKKyAgICogbGluZWFyLgorICAgKi8KKworICAvKioKKyAgICogQGRlZmdyb3VwIGJpbmFyeV9zZWFyY2hfYWxnb3JpdGhtcyBCaW5hcnkgU2VhcmNoCisgICAqIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKgorICAgKiBUaGVzZSBhbGdvcml0aG1zIGFyZSB2YXJpYXRpb25zIG9mIGEgY2xhc3NpYyBiaW5hcnkgc2VhcmNoLCBhbmQKKyAgICogYWxsIGFzc3VtZSB0aGF0IHRoZSBzZXF1ZW5jZSBiZWluZyBzZWFyY2hlZCBpcyBhbHJlYWR5IHNvcnRlZC4KKyAgICogCisgICAqIFRoZSBudW1iZXIgb2YgY29tcGFyaXNvbnMgd2lsbCBiZSBsb2dhcml0aG1pYyAoYW5kIGFzIGZldyBhcworICAgKiBwb3NzaWJsZSkuICBUaGUgbnVtYmVyIG9mIHN0ZXBzIHRocm91Z2ggdGhlIHNlcXVlbmNlIHdpbGwgYmUKKyAgICogbG9nYXJpdGhtaWMgZm9yIHJhbmRvbS1hY2Nlc3MgaXRlcmF0b3JzIChlLmcuLCBwb2ludGVycyksIGFuZAorICAgKiBsaW5lYXIgb3RoZXJ3aXNlLgorICAgKiAKKyAgICogVGhlIExXRyBoYXMgcGFzc2VkIERlZmVjdCBSZXBvcnQgMjcwLCB3aGljaCBub3RlczogPGVtPlRoZQorICAgKiBwcm9wb3NlZCByZXNvbHV0aW9uIHJlaW50ZXJwcmV0cyBiaW5hcnkgc2VhcmNoLiBJbnN0ZWFkIG9mCisgICAqIHRoaW5raW5nIGFib3V0IHNlYXJjaGluZyBmb3IgYSB2YWx1ZSBpbiBhIHNvcnRlZCByYW5nZSwgd2UgdmlldworICAgKiB0aGF0IGFzIGFuIGltcG9ydGFudCBzcGVjaWFsIGNhc2Ugb2YgYSBtb3JlIGdlbmVyYWwgYWxnb3JpdGhtOgorICAgKiBzZWFyY2hpbmcgZm9yIHRoZSBwYXJ0aXRpb24gcG9pbnQgaW4gYSBwYXJ0aXRpb25lZCByYW5nZS4gIFdlCisgICAqIGFsc28gYWRkIGEgZ3VhcmFudGVlIHRoYXQgdGhlIG9sZCB3b3JkaW5nIGRpZCBub3Q6IHdlIGVuc3VyZSB0aGF0CisgICAqIHRoZSB1cHBlciBib3VuZCBpcyBubyBlYXJsaWVyIHRoYW4gdGhlIGxvd2VyIGJvdW5kLCB0aGF0IHRoZSBwYWlyCisgICAqIHJldHVybmVkIGJ5IGVxdWFsX3JhbmdlIGlzIGEgdmFsaWQgcmFuZ2UsIGFuZCB0aGF0IHRoZSBmaXJzdCBwYXJ0CisgICAqIG9mIHRoYXQgcGFpciBpcyB0aGUgbG93ZXIgYm91bmQuPC9lbT4KKyAgICoKKyAgICogVGhlIGFjdHVhbCBlZmZlY3Qgb2YgdGhlIGZpcnN0IHNlbnRlbmNlIGlzIHRoYXQgYSBjb21wYXJpc29uCisgICAqIGZ1bmN0b3IgcGFzc2VkIGJ5IHRoZSB1c2VyIGRvZXNuJ3QgbmVjZXNzYXJpbHkgbmVlZCB0byBpbmR1Y2UgYQorICAgKiBzdHJpY3Qgd2VhayBvcmRlcmluZyByZWxhdGlvbi4gIFJhdGhlciwgaXQgcGFydGl0aW9ucyB0aGUgcmFuZ2UuCisgICAqLworCisgIC8vIGFkamFjZW50X2ZpbmQKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGJvb2wKKyAgICBhbGxfb2YoX0lJdGVyLCBfSUl0ZXIsIF9QcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBib29sCisgICAgYW55X29mKF9JSXRlciwgX0lJdGVyLCBfUHJlZGljYXRlKTsKKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIGJvb2wgCisgICAgYmluYXJ5X3NlYXJjaChfRkl0ZXIsIF9GSXRlciwgY29uc3QgX1RwJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGJvb2wgCisgICAgYmluYXJ5X3NlYXJjaChfRkl0ZXIsIF9GSXRlciwgY29uc3QgX1RwJiwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlciAKKyAgICBjb3B5KF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CSXRlcjEsIHR5cGVuYW1lIF9CSXRlcjI+CisgICAgX0JJdGVyMgorICAgIGNvcHlfYmFja3dhcmQoX0JJdGVyMSwgX0JJdGVyMSwgX0JJdGVyMik7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9PSXRlcgorICAgIGNvcHlfaWYoX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgX1ByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlcgorICAgIGNvcHlfbihfSUl0ZXIsIF9TaXplLCBfT0l0ZXIpOworI2VuZGlmCisKKyAgLy8gY291bnQKKyAgLy8gY291bnRfaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBwYWlyPF9GSXRlciwgX0ZJdGVyPgorICAgIGVxdWFsX3JhbmdlKF9GSXRlciwgX0ZJdGVyLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgcGFpcjxfRkl0ZXIsIF9GSXRlcj4KKyAgICBlcXVhbF9yYW5nZShfRkl0ZXIsIF9GSXRlciwgY29uc3QgX1RwJiwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIHZvaWQgCisgICAgZmlsbChfRkl0ZXIsIF9GSXRlciwgY29uc3QgX1RwJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX1RwPgorICAgIF9PSXRlcgorICAgIGZpbGxfbihfT0l0ZXIsIF9TaXplLCBjb25zdCBfVHAmKTsKKworICAvLyBmaW5kCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyMSwgdHlwZW5hbWUgX0ZJdGVyMj4KKyAgICBfRkl0ZXIxCisgICAgZmluZF9lbmQoX0ZJdGVyMSwgX0ZJdGVyMSwgX0ZJdGVyMiwgX0ZJdGVyMik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyMSwgdHlwZW5hbWUgX0ZJdGVyMiwgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfRkl0ZXIxCisgICAgZmluZF9lbmQoX0ZJdGVyMSwgX0ZJdGVyMSwgX0ZJdGVyMiwgX0ZJdGVyMiwgX0JpbmFyeVByZWRpY2F0ZSk7CisKKyAgLy8gZmluZF9maXJzdF9vZgorICAvLyBmaW5kX2lmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfSUl0ZXIKKyAgICBmaW5kX2lmX25vdChfSUl0ZXIsIF9JSXRlciwgX1ByZWRpY2F0ZSk7CisjZW5kaWYKKworICAvLyBmb3JfZWFjaAorICAvLyBnZW5lcmF0ZQorICAvLyBnZW5lcmF0ZV9uCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMj4KKyAgICBib29sIAorICAgIGluY2x1ZGVzKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGJvb2wgCisgICAgaW5jbHVkZXMoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CSXRlcj4KKyAgICB2b2lkIAorICAgIGlucGxhY2VfbWVyZ2UoX0JJdGVyLCBfQkl0ZXIsIF9CSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkIAorICAgIGlucGxhY2VfbWVyZ2UoX0JJdGVyLCBfQkl0ZXIsIF9CSXRlciwgX0NvbXBhcmUpOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIGJvb2wgCisgICAgaXNfaGVhcChfUkFJdGVyLCBfUkFJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBib29sIAorICAgIGlzX2hlYXAoX1JBSXRlciwgX1JBSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgX1JBSXRlciAKKyAgICBpc19oZWFwX3VudGlsKF9SQUl0ZXIsIF9SQUl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXIgCisgICAgaXNfaGVhcF91bnRpbChfUkFJdGVyLCBfUkFJdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGJvb2wKKyAgICBpc19wYXJ0aXRpb25lZChfSUl0ZXIsIF9JSXRlciwgX1ByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyMSwgdHlwZW5hbWUgX0ZJdGVyMj4KKyAgICBib29sCisgICAgaXNfcGVybXV0YXRpb24oX0ZJdGVyMSwgX0ZJdGVyMSwgX0ZJdGVyMik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyMSwgdHlwZW5hbWUgX0ZJdGVyMiwKKwkgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIGJvb2wKKyAgICBpc19wZXJtdXRhdGlvbihfRkl0ZXIxLCBfRkl0ZXIxLCBfRkl0ZXIyLCBfQmluYXJ5UHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXI+CisgICAgYm9vbCAKKyAgICBpc19zb3J0ZWQoX0ZJdGVyLCBfRkl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgYm9vbCAKKyAgICBpc19zb3J0ZWQoX0ZJdGVyLCBfRkl0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXI+CisgICAgX0ZJdGVyIAorICAgIGlzX3NvcnRlZF91bnRpbChfRkl0ZXIsIF9GSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfRkl0ZXIgCisgICAgaXNfc29ydGVkX3VudGlsKF9GSXRlciwgX0ZJdGVyLCBfQ29tcGFyZSk7CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIxLCB0eXBlbmFtZSBfRkl0ZXIyPgorICAgIHZvaWQgCisgICAgaXRlcl9zd2FwKF9GSXRlcjEsIF9GSXRlcjIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIF9GSXRlciAKKyAgICBsb3dlcl9ib3VuZChfRkl0ZXIsIF9GSXRlciwgY29uc3QgX1RwJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9GSXRlciAKKyAgICBsb3dlcl9ib3VuZChfRkl0ZXIsIF9GSXRlciwgY29uc3QgX1RwJiwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgdm9pZCAKKyAgICBtYWtlX2hlYXAoX1JBSXRlciwgX1JBSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZCAKKyAgICBtYWtlX2hlYXAoX1JBSXRlciwgX1JBSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gCisgICAgY29uc3QgX1RwJiAKKyAgICBtYXgoY29uc3QgX1RwJiwgY29uc3QgX1RwJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBjb25zdCBfVHAmIAorICAgIG1heChjb25zdCBfVHAmLCBjb25zdCBfVHAmLCBfQ29tcGFyZSk7CisKKyAgLy8gbWF4X2VsZW1lbnQKKyAgLy8gbWVyZ2UKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IAorICAgIGNvbnN0IF9UcCYgCisgICAgbWluKGNvbnN0IF9UcCYsIGNvbnN0IF9UcCYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgY29uc3QgX1RwJiAKKyAgICBtaW4oY29uc3QgX1RwJiwgY29uc3QgX1RwJiwgX0NvbXBhcmUpOworCisgIC8vIG1pbl9lbGVtZW50CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBwYWlyPGNvbnN0IF9UcCYsIGNvbnN0IF9UcCY+IAorICAgIG1pbm1heChjb25zdCBfVHAmLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHBhaXI8Y29uc3QgX1RwJiwgY29uc3QgX1RwJj4KKyAgICBtaW5tYXgoY29uc3QgX1RwJiwgY29uc3QgX1RwJiwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcj4KKyAgICBwYWlyPF9GSXRlciwgX0ZJdGVyPgorICAgIG1pbm1heF9lbGVtZW50KF9GSXRlciwgX0ZJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHBhaXI8X0ZJdGVyLCBfRkl0ZXI+CisgICAgbWlubWF4X2VsZW1lbnQoX0ZJdGVyLCBfRkl0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgbWluKGluaXRpYWxpemVyX2xpc3Q8X1RwPik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfVHAKKyAgICBtaW4oaW5pdGlhbGl6ZXJfbGlzdDxfVHA+LCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIG1heChpbml0aWFsaXplcl9saXN0PF9UcD4pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1RwCisgICAgbWF4KGluaXRpYWxpemVyX2xpc3Q8X1RwPiwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBwYWlyPF9UcCwgX1RwPgorICAgIG1pbm1heChpbml0aWFsaXplcl9saXN0PF9UcD4pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgcGFpcjxfVHAsIF9UcD4KKyAgICBtaW5tYXgoaW5pdGlhbGl6ZXJfbGlzdDxfVHA+LCBfQ29tcGFyZSk7CisjZW5kaWYKKworICAvLyBtaXNtYXRjaAorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CSXRlcj4KKyAgICBib29sIAorICAgIG5leHRfcGVybXV0YXRpb24oX0JJdGVyLCBfQkl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgYm9vbCAKKyAgICBuZXh0X3Blcm11dGF0aW9uKF9CSXRlciwgX0JJdGVyLCBfQ29tcGFyZSk7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBib29sCisgICAgbm9uZV9vZihfSUl0ZXIsIF9JSXRlciwgX1ByZWRpY2F0ZSk7CisjZW5kaWYKKworICAvLyBudGhfZWxlbWVudAorICAvLyBwYXJ0aWFsX3NvcnQKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgX1JBSXRlcgorICAgIHBhcnRpYWxfc29ydF9jb3B5KF9JSXRlciwgX0lJdGVyLCBfUkFJdGVyLCBfUkFJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXIKKyAgICBwYXJ0aWFsX3NvcnRfY29weShfSUl0ZXIsIF9JSXRlciwgX1JBSXRlciwgX1JBSXRlciwgX0NvbXBhcmUpOworCisgIC8vIHBhcnRpdGlvbgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlcjEsCisJICAgdHlwZW5hbWUgX09JdGVyMiwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBwYWlyPF9PSXRlcjEsIF9PSXRlcjI+CisgICAgcGFydGl0aW9uX2NvcHkoX0lJdGVyLCBfSUl0ZXIsIF9PSXRlcjEsIF9PSXRlcjIsIF9QcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfRkl0ZXIKKyAgICBwYXJ0aXRpb25fcG9pbnQoX0ZJdGVyLCBfRkl0ZXIsIF9QcmVkaWNhdGUpOworI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICB2b2lkIAorICAgIHBvcF9oZWFwKF9SQUl0ZXIsIF9SQUl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQgCisgICAgcG9wX2hlYXAoX1JBSXRlciwgX1JBSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CSXRlcj4KKyAgICBib29sIAorICAgIHByZXZfcGVybXV0YXRpb24oX0JJdGVyLCBfQkl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgYm9vbCAKKyAgICBwcmV2X3Blcm11dGF0aW9uKF9CSXRlciwgX0JJdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICB2b2lkIAorICAgIHB1c2hfaGVhcChfUkFJdGVyLCBfUkFJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkIAorICAgIHB1c2hfaGVhcChfUkFJdGVyLCBfUkFJdGVyLCBfQ29tcGFyZSk7CisKKyAgLy8gcmFuZG9tX3NodWZmbGUKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBfRkl0ZXIgCisgICAgcmVtb3ZlKF9GSXRlciwgX0ZJdGVyLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX0ZJdGVyIAorICAgIHJlbW92ZV9pZihfRkl0ZXIsIF9GSXRlciwgX1ByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBfT0l0ZXIgCisgICAgcmVtb3ZlX2NvcHkoX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgY29uc3QgX1RwJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX09JdGVyIAorICAgIHJlbW92ZV9jb3B5X2lmKF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIsIF9QcmVkaWNhdGUpOworCisgIC8vIHJlcGxhY2UKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIF9PSXRlciAKKyAgICByZXBsYWNlX2NvcHkoX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgY29uc3QgX1RwJiwgY29uc3QgX1RwJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXIsIHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX1RwPgorICAgIF9PSXRlciAKKyAgICByZXBsYWNlX2NvcHlfaWYoX0l0ZXIsIF9JdGVyLCBfT0l0ZXIsIF9QcmVkaWNhdGUsIGNvbnN0IF9UcCYpOworCisgIC8vIHJlcGxhY2VfaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQkl0ZXI+CisgICAgdm9pZCAKKyAgICByZXZlcnNlKF9CSXRlciwgX0JJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQkl0ZXIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIgCisgICAgcmV2ZXJzZV9jb3B5KF9CSXRlciwgX0JJdGVyLCBfT0l0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcj4KKyAgICB2b2lkIAorICAgIHJvdGF0ZShfRkl0ZXIsIF9GSXRlciwgX0ZJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIgCisgICAgcm90YXRlX2NvcHkoX0ZJdGVyLCBfRkl0ZXIsIF9GSXRlciwgX09JdGVyKTsKKworICAvLyBzZWFyY2gKKyAgLy8gc2VhcmNoX24KKyAgLy8gc2V0X2RpZmZlcmVuY2UKKyAgLy8gc2V0X2ludGVyc2VjdGlvbgorICAvLyBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UKKyAgLy8gc2V0X3VuaW9uCisKKyNpZiAoX19jcGx1c3BsdXMgPj0gMjAxMTAzTCkgJiYgZGVmaW5lZChfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9VR2VuZXJhdG9yPgorICAgIHZvaWQKKyAgICBzaHVmZmxlKF9SQUl0ZXIsIF9SQUl0ZXIsIF9VR2VuZXJhdG9yJiYpOworI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICB2b2lkIAorICAgIHNvcnRfaGVhcChfUkFJdGVyLCBfUkFJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkIAorICAgIHNvcnRfaGVhcChfUkFJdGVyLCBfUkFJdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9CSXRlciAKKyAgICBzdGFibGVfcGFydGl0aW9uKF9CSXRlciwgX0JJdGVyLCBfUHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IAorICAgIHZvaWQgCisgICAgc3dhcChfVHAmLCBfVHAmKQorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICBub2V4Y2VwdChfX2FuZF88aXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8X1RwPiwKKwkgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfVHA+Pjo6dmFsdWUpCisjZW5kaWYKKyAgICA7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzaXplX3QgX05tPgorICAgIHZvaWQKKyAgICBzd2FwKF9UcCAoJl9fYSlbX05tXSwgX1RwICgmX19iKVtfTm1dKQorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICBub2V4Y2VwdChub2V4Y2VwdChzd2FwKCpfX2EsICpfX2IpKSkKKyNlbmRpZgorICAgIDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIxLCB0eXBlbmFtZSBfRkl0ZXIyPgorICAgIF9GSXRlcjIgCisgICAgc3dhcF9yYW5nZXMoX0ZJdGVyMSwgX0ZJdGVyMSwgX0ZJdGVyMik7CisKKyAgLy8gdHJhbnNmb3JtCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyPgorICAgIF9GSXRlciAKKyAgICB1bmlxdWUoX0ZJdGVyLCBfRkl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfRkl0ZXIgCisgICAgdW5pcXVlKF9GSXRlciwgX0ZJdGVyLCBfQmluYXJ5UHJlZGljYXRlKTsKKworICAvLyB1bmlxdWVfY29weQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIF9GSXRlciAKKyAgICB1cHBlcl9ib3VuZChfRkl0ZXIsIF9GSXRlciwgY29uc3QgX1RwJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9GSXRlciAKKyAgICB1cHBlcl9ib3VuZChfRkl0ZXIsIF9GSXRlciwgY29uc3QgX1RwJiwgX0NvbXBhcmUpOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0FMR08KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXI+CisgICAgX0ZJdGVyIAorICAgIGFkamFjZW50X2ZpbmQoX0ZJdGVyLCBfRkl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfRkl0ZXIgCisgICAgYWRqYWNlbnRfZmluZChfRkl0ZXIsIF9GSXRlciwgX0JpbmFyeVByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIGNvdW50KF9JSXRlciwgX0lJdGVyLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIGNvdW50X2lmKF9JSXRlciwgX0lJdGVyLCBfUHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyPgorICAgIGJvb2wgCisgICAgZXF1YWwoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBib29sIAorICAgIGVxdWFsKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9CaW5hcnlQcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIF9JSXRlciAKKyAgICBmaW5kKF9JSXRlciwgX0lJdGVyLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIxLCB0eXBlbmFtZSBfRkl0ZXIyPgorICAgIF9GSXRlcjEKKyAgICBmaW5kX2ZpcnN0X29mKF9GSXRlcjEsIF9GSXRlcjEsIF9GSXRlcjIsIF9GSXRlcjIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcjEsIHR5cGVuYW1lIF9GSXRlcjIsIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX0ZJdGVyMQorICAgIGZpbmRfZmlyc3Rfb2YoX0ZJdGVyMSwgX0ZJdGVyMSwgX0ZJdGVyMiwgX0ZJdGVyMiwgX0JpbmFyeVByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9JSXRlcgorICAgIGZpbmRfaWYoX0lJdGVyLCBfSUl0ZXIsIF9QcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX0Z1bmN0PgorICAgIF9GdW5jdCAKKyAgICBmb3JfZWFjaChfSUl0ZXIsIF9JSXRlciwgX0Z1bmN0KTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9HZW5lcmF0b3I+CisgICAgdm9pZCAKKyAgICBnZW5lcmF0ZShfRkl0ZXIsIF9GSXRlciwgX0dlbmVyYXRvcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0dlbmVyYXRvcj4KKyAgICBfT0l0ZXIKKyAgICBnZW5lcmF0ZV9uKF9PSXRlciwgX1NpemUsIF9HZW5lcmF0b3IpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjI+CisgICAgYm9vbCAKKyAgICBsZXhpY29ncmFwaGljYWxfY29tcGFyZShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBib29sIAorICAgIGxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXI+CisgICAgX0ZJdGVyIAorICAgIG1heF9lbGVtZW50KF9GSXRlciwgX0ZJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9GSXRlciAKKyAgICBtYXhfZWxlbWVudChfRkl0ZXIsIF9GSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIgCisgICAgbWVyZ2UoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXIsIAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9PSXRlciAKKyAgICBtZXJnZShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXI+CisgICAgX0ZJdGVyIAorICAgIG1pbl9lbGVtZW50KF9GSXRlciwgX0ZJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9GSXRlciAKKyAgICBtaW5fZWxlbWVudChfRkl0ZXIsIF9GSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjI+CisgICAgcGFpcjxfSUl0ZXIxLCBfSUl0ZXIyPgorICAgIG1pc21hdGNoKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgcGFpcjxfSUl0ZXIxLCBfSUl0ZXIyPgorICAgIG1pc21hdGNoKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9CaW5hcnlQcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgdm9pZCAKKyAgICBudGhfZWxlbWVudChfUkFJdGVyLCBfUkFJdGVyLCBfUkFJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkIAorICAgIG50aF9lbGVtZW50KF9SQUl0ZXIsIF9SQUl0ZXIsIF9SQUl0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIHZvaWQgCisgICAgcGFydGlhbF9zb3J0KF9SQUl0ZXIsIF9SQUl0ZXIsIF9SQUl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQgCisgICAgcGFydGlhbF9zb3J0KF9SQUl0ZXIsIF9SQUl0ZXIsIF9SQUl0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQkl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX0JJdGVyIAorICAgIHBhcnRpdGlvbihfQkl0ZXIsIF9CSXRlciwgX1ByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICB2b2lkIAorICAgIHJhbmRvbV9zaHVmZmxlKF9SQUl0ZXIsIF9SQUl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9HZW5lcmF0b3I+CisgICAgdm9pZCAKKyAgICByYW5kb21fc2h1ZmZsZShfUkFJdGVyLCBfUkFJdGVyLAorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKwkJICAgX0dlbmVyYXRvciYmKTsKKyNlbHNlCisJCSAgIF9HZW5lcmF0b3ImKTsKKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIHZvaWQgCisgICAgcmVwbGFjZShfRkl0ZXIsIF9GSXRlciwgY29uc3QgX1RwJiwgY29uc3QgX1RwJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfVHA+CisgICAgdm9pZCAKKyAgICByZXBsYWNlX2lmKF9GSXRlciwgX0ZJdGVyLCBfUHJlZGljYXRlLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIxLCB0eXBlbmFtZSBfRkl0ZXIyPgorICAgIF9GSXRlcjEgCisgICAgc2VhcmNoKF9GSXRlcjEsIF9GSXRlcjEsIF9GSXRlcjIsIF9GSXRlcjIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcjEsIHR5cGVuYW1lIF9GSXRlcjIsIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX0ZJdGVyMSAKKyAgICBzZWFyY2goX0ZJdGVyMSwgX0ZJdGVyMSwgX0ZJdGVyMiwgX0ZJdGVyMiwgX0JpbmFyeVByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX1RwPgorICAgIF9GSXRlciAKKyAgICBzZWFyY2hfbihfRkl0ZXIsIF9GSXRlciwgX1NpemUsIGNvbnN0IF9UcCYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9UcCwgCisJICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfRkl0ZXIgCisgICAgc2VhcmNoX24oX0ZJdGVyLCBfRkl0ZXIsIF9TaXplLCBjb25zdCBfVHAmLCBfQmluYXJ5UHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXI+CisgICAgX09JdGVyIAorICAgIHNldF9kaWZmZXJlbmNlKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyLCAKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfT0l0ZXIgCisgICAgc2V0X2RpZmZlcmVuY2UoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlciAKKyAgICBzZXRfaW50ZXJzZWN0aW9uKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9PSXRlciAKKyAgICBzZXRfaW50ZXJzZWN0aW9uKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIKKyAgICBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXIsIAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9PSXRlcgorICAgIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCAKKwkJCSAgICAgX09JdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlciAKKyAgICBzZXRfdW5pb24oX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXIsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX09JdGVyIAorICAgIHNldF91bmlvbihfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIHZvaWQgCisgICAgc29ydChfUkFJdGVyLCBfUkFJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkIAorICAgIHNvcnQoX1JBSXRlciwgX1JBSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgdm9pZCAKKyAgICBzdGFibGVfc29ydChfUkFJdGVyLCBfUkFJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkIAorICAgIHN0YWJsZV9zb3J0KF9SQUl0ZXIsIF9SQUl0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX1VuYXJ5T3BlcmF0aW9uPgorICAgIF9PSXRlciAKKyAgICB0cmFuc2Zvcm0oX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgX1VuYXJ5T3BlcmF0aW9uKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXIsIAorCSAgIHR5cGVuYW1lIF9CaW5hcnlPcGVyYXRpb24+CisgICAgX09JdGVyIAorICAgIHRyYW5zZm9ybShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfT0l0ZXIsIF9CaW5hcnlPcGVyYXRpb24pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlciAKKyAgICB1bmlxdWVfY29weShfSUl0ZXIsIF9JSXRlciwgX09JdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfT0l0ZXIgCisgICAgdW5pcXVlX2NvcHkoX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgX0JpbmFyeVByZWRpY2F0ZSk7CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQUxHTworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNpZmRlZiBfR0xJQkNYWF9QQVJBTExFTAorIyBpbmNsdWRlIDxwYXJhbGxlbC9hbGdvcml0aG1md2QuaD4KKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2FsbG9jX3RyYWl0cy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2FsbG9jX3RyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZWExNDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYWxsb2NfdHJhaXRzLmgKQEAgLTAsMCArMSw1NjYgQEAKKy8vIEFsbG9jYXRvciB0cmFpdHMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvYWxsb2NfdHJhaXRzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXttZW1vcnl9CisgKi8KKworI2lmbmRlZiBfQUxMT0NfVFJBSVRTX0gKKyNkZWZpbmUgX0FMTE9DX1RSQUlUU19IIDEKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworI2luY2x1ZGUgPGJpdHMvbWVtb3J5ZndkLmg+CisjaW5jbHVkZSA8Yml0cy9wdHJfdHJhaXRzLmg+CisjaW5jbHVkZSA8ZXh0L251bWVyaWNfdHJhaXRzLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBfX2FsbG9jdHJfcmViaW5kX2hlbHBlcgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYzIsIHR5cGVuYW1lIF9UcDI+CisJc3RhdGljIGNvbnN0ZXhwciBib29sCisgICAgICAgCV9TX2Noayh0eXBlbmFtZSBfQWxsb2MyOjp0ZW1wbGF0ZSByZWJpbmQ8X1RwMj46Om90aGVyKikKKwl7IHJldHVybiB0cnVlOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sCisgICAgICAgCV9TX2NoayguLi4pCisgICAgICAgCXsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBfX3ZhbHVlID0gX1NfY2hrPF9BbGxvYywgX1RwPihudWxscHRyKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX1RwPgorICAgIGNvbnN0IGJvb2wgX19hbGxvY3RyX3JlYmluZF9oZWxwZXI8X0FsbG9jLCBfVHA+OjpfX3ZhbHVlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX1RwLAorICAgICAgICAgICBib29sID0gX19hbGxvY3RyX3JlYmluZF9oZWxwZXI8X0FsbG9jLCBfVHA+OjpfX3ZhbHVlPgorICAgIHN0cnVjdCBfX2FsbG9jdHJfcmViaW5kOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2FsbG9jdHJfcmViaW5kPF9BbGxvYywgX1RwLCB0cnVlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X1RwPjo6b3RoZXIgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lLi4uPiBjbGFzcyBfQWxsb2MsIHR5cGVuYW1lIF9UcCwKKyAgICAgICAgICAgIHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgc3RydWN0IF9fYWxsb2N0cl9yZWJpbmQ8X0FsbG9jPF9VcCwgX0FyZ3MuLi4+LCBfVHAsIGZhbHNlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0FsbG9jPF9UcCwgX0FyZ3MuLi4+IF9fdHlwZTsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgIFVuaWZvcm0gaW50ZXJmYWNlIHRvIGFsbCBhbGxvY2F0b3IgdHlwZXMuCisgICAqIEBpbmdyb3VwIGFsbG9jYXRvcnMKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBhbGxvY2F0b3JfdHJhaXRzCisgICAgeworICAgICAgLy8vIFRoZSBhbGxvY2F0b3IgdHlwZQorICAgICAgdHlwZWRlZiBfQWxsb2MgYWxsb2NhdG9yX3R5cGU7CisgICAgICAvLy8gVGhlIGFsbG9jYXRlZCB0eXBlCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisjZGVmaW5lIF9HTElCQ1hYX0FMTE9DX1RSX05FU1RFRF9UWVBFKF9OVFlQRSwgX0FMVCkgXAorICBwcml2YXRlOiBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gXAorICAgIHN0YXRpYyB0eXBlbmFtZSBfVHA6Ol9OVFlQRSBfU18jI19OVFlQRSMjX2hlbHBlcihfVHAqKTsgXAorICBzdGF0aWMgX0FMVCBfU18jI19OVFlQRSMjX2hlbHBlciguLi4pOyBcCisgICAgdHlwZWRlZiBkZWNsdHlwZShfU18jI19OVFlQRSMjX2hlbHBlcigoX0FsbG9jKikwKSkgX18jI19OVFlQRTsgXAorICBwdWJsaWM6CisKK19HTElCQ1hYX0FMTE9DX1RSX05FU1RFRF9UWVBFKHBvaW50ZXIsIHZhbHVlX3R5cGUqKQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiAgIFRoZSBhbGxvY2F0b3IncyBwb2ludGVyIHR5cGUuCisgICAgICAgKgorICAgICAgICogQGMgQWxsb2M6OnBvaW50ZXIgaWYgdGhhdCB0eXBlIGV4aXN0cywgb3RoZXJ3aXNlIEBjIHZhbHVlX3R5cGUqCisgICAgICAqLworICAgICAgdHlwZWRlZiBfX3BvaW50ZXIgcG9pbnRlcjsKKworX0dMSUJDWFhfQUxMT0NfVFJfTkVTVEVEX1RZUEUoY29uc3RfcG9pbnRlciwKKyAgdHlwZW5hbWUgcG9pbnRlcl90cmFpdHM8cG9pbnRlcj46OnRlbXBsYXRlIHJlYmluZDxjb25zdCB2YWx1ZV90eXBlPikKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgICBUaGUgYWxsb2NhdG9yJ3MgY29uc3QgcG9pbnRlciB0eXBlLgorICAgICAgICoKKyAgICAgICAqIEBjIEFsbG9jOjpjb25zdF9wb2ludGVyIGlmIHRoYXQgdHlwZSBleGlzdHMsIG90aGVyd2lzZQorICAgICAgICogPHR0PiBwb2ludGVyX3RyYWl0czxwb2ludGVyPjo6cmViaW5kPGNvbnN0IHZhbHVlX3R5cGU+IDwvdHQ+CisgICAgICAqLworICAgICAgdHlwZWRlZiBfX2NvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKworX0dMSUJDWFhfQUxMT0NfVFJfTkVTVEVEX1RZUEUodm9pZF9wb2ludGVyLAorICB0eXBlbmFtZSBwb2ludGVyX3RyYWl0czxwb2ludGVyPjo6dGVtcGxhdGUgcmViaW5kPHZvaWQ+KQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiAgIFRoZSBhbGxvY2F0b3IncyB2b2lkIHBvaW50ZXIgdHlwZS4KKyAgICAgICAqCisgICAgICAgKiBAYyBBbGxvYzo6dm9pZF9wb2ludGVyIGlmIHRoYXQgdHlwZSBleGlzdHMsIG90aGVyd2lzZQorICAgICAgICogPHR0PiBwb2ludGVyX3RyYWl0czxwb2ludGVyPjo6cmViaW5kPHZvaWQ+IDwvdHQ+CisgICAgICAqLworICAgICAgdHlwZWRlZiBfX3ZvaWRfcG9pbnRlciB2b2lkX3BvaW50ZXI7CisKK19HTElCQ1hYX0FMTE9DX1RSX05FU1RFRF9UWVBFKGNvbnN0X3ZvaWRfcG9pbnRlciwKKyAgdHlwZW5hbWUgcG9pbnRlcl90cmFpdHM8cG9pbnRlcj46OnRlbXBsYXRlIHJlYmluZDxjb25zdCB2b2lkPikKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgICBUaGUgYWxsb2NhdG9yJ3MgY29uc3Qgdm9pZCBwb2ludGVyIHR5cGUuCisgICAgICAgKgorICAgICAgICogQGMgQWxsb2M6OmNvbnN0X3ZvaWRfcG9pbnRlciBpZiB0aGF0IHR5cGUgZXhpc3RzLCBvdGhlcndpc2UKKyAgICAgICAqIDx0dD4gcG9pbnRlcl90cmFpdHM8cG9pbnRlcj46OnJlYmluZDxjb25zdCB2b2lkPiA8L3R0PgorICAgICAgKi8KKyAgICAgIHR5cGVkZWYgX19jb25zdF92b2lkX3BvaW50ZXIgY29uc3Rfdm9pZF9wb2ludGVyOworCitfR0xJQkNYWF9BTExPQ19UUl9ORVNURURfVFlQRShkaWZmZXJlbmNlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBwb2ludGVyX3RyYWl0czxwb2ludGVyPjo6ZGlmZmVyZW5jZV90eXBlKQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiAgIFRoZSBhbGxvY2F0b3IncyBkaWZmZXJlbmNlIHR5cGUKKyAgICAgICAqCisgICAgICAgKiBAYyBBbGxvYzo6ZGlmZmVyZW5jZV90eXBlIGlmIHRoYXQgdHlwZSBleGlzdHMsIG90aGVyd2lzZQorICAgICAgICogPHR0PiBwb2ludGVyX3RyYWl0czxwb2ludGVyPjo6ZGlmZmVyZW5jZV90eXBlIDwvdHQ+CisgICAgICAqLworICAgICAgdHlwZWRlZiBfX2RpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKK19HTElCQ1hYX0FMTE9DX1RSX05FU1RFRF9UWVBFKHNpemVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIG1ha2VfdW5zaWduZWQ8ZGlmZmVyZW5jZV90eXBlPjo6dHlwZSkKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgICBUaGUgYWxsb2NhdG9yJ3Mgc2l6ZSB0eXBlCisgICAgICAgKgorICAgICAgICogQGMgQWxsb2M6OnNpemVfdHlwZSBpZiB0aGF0IHR5cGUgZXhpc3RzLCBvdGhlcndpc2UKKyAgICAgICAqIDx0dD4gbWFrZV91bnNpZ25lZDxkaWZmZXJlbmNlX3R5cGU+Ojp0eXBlIDwvdHQ+CisgICAgICAqLworICAgICAgdHlwZWRlZiBfX3NpemVfdHlwZSBzaXplX3R5cGU7CisKK19HTElCQ1hYX0FMTE9DX1RSX05FU1RFRF9UWVBFKHByb3BhZ2F0ZV9vbl9jb250YWluZXJfY29weV9hc3NpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2VfdHlwZSkKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgICBIb3cgdGhlIGFsbG9jYXRvciBpcyBwcm9wYWdhdGVkIG9uIGNvcHkgYXNzaWdubWVudAorICAgICAgICoKKyAgICAgICAqIEBjIEFsbG9jOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX2NvcHlfYXNzaWdubWVudCBpZiB0aGF0IHR5cGUgZXhpc3RzLAorICAgICAgICogb3RoZXJ3aXNlIEBjIGZhbHNlX3R5cGUKKyAgICAgICovCisgICAgICB0eXBlZGVmIF9fcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9jb3B5X2Fzc2lnbm1lbnQKKyAgICAgICAJcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9jb3B5X2Fzc2lnbm1lbnQ7CisKK19HTElCQ1hYX0FMTE9DX1RSX05FU1RFRF9UWVBFKHByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2VfdHlwZSkKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgICBIb3cgdGhlIGFsbG9jYXRvciBpcyBwcm9wYWdhdGVkIG9uIG1vdmUgYXNzaWdubWVudAorICAgICAgICoKKyAgICAgICAqIEBjIEFsbG9jOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudCBpZiB0aGF0IHR5cGUgZXhpc3RzLAorICAgICAgICogb3RoZXJ3aXNlIEBjIGZhbHNlX3R5cGUKKyAgICAgICovCisgICAgICB0eXBlZGVmIF9fcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQKKyAgICAgICAJcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ7CisKK19HTElCQ1hYX0FMTE9DX1RSX05FU1RFRF9UWVBFKHByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlX3R5cGUpCisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmICAgSG93IHRoZSBhbGxvY2F0b3IgaXMgcHJvcGFnYXRlZCBvbiBzd2FwCisgICAgICAgKgorICAgICAgICogQGMgQWxsb2M6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcCBpZiB0aGF0IHR5cGUgZXhpc3RzLAorICAgICAgICogb3RoZXJ3aXNlIEBjIGZhbHNlX3R5cGUKKyAgICAgICovCisgICAgICB0eXBlZGVmIF9fcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9zd2FwIHByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDsKKworI3VuZGVmIF9HTElCQ1hYX0FMTE9DX1RSX05FU1RFRF9UWVBFCisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgdXNpbmcgcmViaW5kX2FsbG9jID0gdHlwZW5hbWUgX19hbGxvY3RyX3JlYmluZDxfQWxsb2MsIF9UcD46Ol9fdHlwZTsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgdXNpbmcgcmViaW5kX3RyYWl0cyA9IGFsbG9jYXRvcl90cmFpdHM8cmViaW5kX2FsbG9jPF9UcD4+OworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYzI+CisJc3RydWN0IF9fYWxsb2NhdGVfaGVscGVyCisJeworCSAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jMywKKwkgICAgdHlwZW5hbWUgPSBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8X0FsbG9jMyo+KCktPmFsbG9jYXRlKAorCQkgIHN0ZDo6ZGVjbHZhbDxzaXplX3R5cGU+KCksCisJCSAgc3RkOjpkZWNsdmFsPGNvbnN0X3ZvaWRfcG9pbnRlcj4oKSkpPgorCSAgICBzdGF0aWMgdHJ1ZV90eXBlIF9fdGVzdChpbnQpOworCisJICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKwkgICAgc3RhdGljIGZhbHNlX3R5cGUgX190ZXN0KC4uLik7CisKKwkgIHR5cGVkZWYgZGVjbHR5cGUoX190ZXN0PF9BbGxvYz4oMCkpIHR5cGU7CisJICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHR5cGU6OnZhbHVlOworCX07CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYzI+CisJc3RhdGljIHR5cGVuYW1lCisgICAgICAgCWVuYWJsZV9pZjxfX2FsbG9jYXRlX2hlbHBlcjxfQWxsb2MyPjo6dmFsdWUsIHBvaW50ZXI+Ojp0eXBlCisgICAgICAgCV9TX2FsbG9jYXRlKF9BbGxvYzImIF9fYSwgc2l6ZV90eXBlIF9fbiwgY29uc3Rfdm9pZF9wb2ludGVyIF9faGludCkKKwl7IHJldHVybiBfX2EuYWxsb2NhdGUoX19uLCBfX2hpbnQpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYzI+CisJc3RhdGljIHR5cGVuYW1lCisgICAgICAgCWVuYWJsZV9pZjwhX19hbGxvY2F0ZV9oZWxwZXI8X0FsbG9jMj46OnZhbHVlLCBwb2ludGVyPjo6dHlwZQorICAgICAgIAlfU19hbGxvY2F0ZShfQWxsb2MyJiBfX2EsIHNpemVfdHlwZSBfX24sIC4uLikKKwl7IHJldHVybiBfX2EuYWxsb2NhdGUoX19uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorCXN0cnVjdCBfX2NvbnN0cnVjdF9oZWxwZXIKKwl7CisJICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MyLAorCSAgICB0eXBlbmFtZSA9IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxfQWxsb2MyKj4oKS0+Y29uc3RydWN0KAorCQkgIHN0ZDo6ZGVjbHZhbDxfVHAqPigpLCBzdGQ6OmRlY2x2YWw8X0FyZ3M+KCkuLi4pKT4KKwkgICAgc3RhdGljIHRydWVfdHlwZSBfX3Rlc3QoaW50KTsKKworCSAgdGVtcGxhdGU8dHlwZW5hbWU+CisJICAgIHN0YXRpYyBmYWxzZV90eXBlIF9fdGVzdCguLi4pOworCisJICB0eXBlZGVmIGRlY2x0eXBlKF9fdGVzdDxfQWxsb2M+KDApKSB0eXBlOworCSAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0eXBlOjp2YWx1ZTsKKwl9OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorCXN0YXRpYyB0eXBlbmFtZQorICAgICAgIAllbmFibGVfaWY8X19jb25zdHJ1Y3RfaGVscGVyPF9UcCwgX0FyZ3MuLi4+Ojp2YWx1ZSwgdm9pZD46OnR5cGUKKyAgICAgICAJX1NfY29uc3RydWN0KF9BbGxvYyYgX19hLCBfVHAqIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyBfX2EuY29uc3RydWN0KF9fcCwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorCXN0YXRpYyB0eXBlbmFtZQorCWVuYWJsZV9pZjxfX2FuZF88X19ub3RfPF9fY29uc3RydWN0X2hlbHBlcjxfVHAsIF9BcmdzLi4uPj4sCisJCQkgaXNfY29uc3RydWN0aWJsZTxfVHAsIF9BcmdzLi4uPj46OnZhbHVlLCB2b2lkPjo6dHlwZQorICAgICAgIAlfU19jb25zdHJ1Y3QoX0FsbG9jJiwgX1RwKiBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsgOjpuZXcoKHZvaWQqKV9fcCkgX1RwKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCXN0cnVjdCBfX2Rlc3Ryb3lfaGVscGVyCisJeworCSAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jMiwKKwkgICAgdHlwZW5hbWUgPSBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8X0FsbG9jMio+KCktPmRlc3Ryb3koCisJCSAgc3RkOjpkZWNsdmFsPF9UcCo+KCkpKT4KKwkgICAgc3RhdGljIHRydWVfdHlwZSBfX3Rlc3QoaW50KTsKKworCSAgdGVtcGxhdGU8dHlwZW5hbWU+CisJICAgIHN0YXRpYyBmYWxzZV90eXBlIF9fdGVzdCguLi4pOworCisJICB0eXBlZGVmIGRlY2x0eXBlKF9fdGVzdDxfQWxsb2M+KDApKSB0eXBlOworCSAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0eXBlOjp2YWx1ZTsKKwl9OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisJc3RhdGljIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2Rlc3Ryb3lfaGVscGVyPF9UcD46OnZhbHVlLCB2b2lkPjo6dHlwZQorICAgICAgIAlfU19kZXN0cm95KF9BbGxvYyYgX19hLCBfVHAqIF9fcCkKKwl7IF9fYS5kZXN0cm95KF9fcCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCXN0YXRpYyB0eXBlbmFtZSBlbmFibGVfaWY8IV9fZGVzdHJveV9oZWxwZXI8X1RwPjo6dmFsdWUsIHZvaWQ+Ojp0eXBlCisgICAgICAgCV9TX2Rlc3Ryb3koX0FsbG9jJiwgX1RwKiBfX3ApCisJeyBfX3AtPn5fVHAoKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MyPgorCXN0cnVjdCBfX21heHNpemVfaGVscGVyCisJeworCSAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jMywKKwkgICAgdHlwZW5hbWUgPSBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8X0FsbG9jMyo+KCktPm1heF9zaXplKCkpPgorCSAgICBzdGF0aWMgdHJ1ZV90eXBlIF9fdGVzdChpbnQpOworCisJICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKwkgICAgc3RhdGljIGZhbHNlX3R5cGUgX190ZXN0KC4uLik7CisKKwkgIHR5cGVkZWYgZGVjbHR5cGUoX190ZXN0PF9BbGxvYzI+KDApKSB0eXBlOworCSAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0eXBlOjp2YWx1ZTsKKwl9OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MyPgorCXN0YXRpYyB0eXBlbmFtZQorICAgICAgIAllbmFibGVfaWY8X19tYXhzaXplX2hlbHBlcjxfQWxsb2MyPjo6dmFsdWUsIHNpemVfdHlwZT46OnR5cGUKKyAgICAgICAJX1NfbWF4X3NpemUoX0FsbG9jMiYgX19hKQorCXsgcmV0dXJuIF9fYS5tYXhfc2l6ZSgpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYzI+CisJc3RhdGljIHR5cGVuYW1lCisgICAgICAgCWVuYWJsZV9pZjwhX19tYXhzaXplX2hlbHBlcjxfQWxsb2MyPjo6dmFsdWUsIHNpemVfdHlwZT46OnR5cGUKKwlfU19tYXhfc2l6ZShfQWxsb2MyJikKKwl7IHJldHVybiBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8c2l6ZV90eXBlPjo6X19tYXg7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jMj4KKwlzdHJ1Y3QgX19zZWxlY3RfaGVscGVyCisJeworCSAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jMywgdHlwZW5hbWUKKwkgICAgPSBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8X0FsbG9jMyo+KCkKKwkJLT5zZWxlY3Rfb25fY29udGFpbmVyX2NvcHlfY29uc3RydWN0aW9uKCkpPgorCSAgICBzdGF0aWMgdHJ1ZV90eXBlIF9fdGVzdChpbnQpOworCisJICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKwkgICAgc3RhdGljIGZhbHNlX3R5cGUgX190ZXN0KC4uLik7CisKKwkgIHR5cGVkZWYgZGVjbHR5cGUoX190ZXN0PF9BbGxvYzI+KDApKSB0eXBlOworCSAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0eXBlOjp2YWx1ZTsKKwl9OworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jMj4KKwlzdGF0aWMgdHlwZW5hbWUKKyAgICAgICAJZW5hYmxlX2lmPF9fc2VsZWN0X2hlbHBlcjxfQWxsb2MyPjo6dmFsdWUsIF9BbGxvYzI+Ojp0eXBlCisgICAgICAgCV9TX3NlbGVjdChfQWxsb2MyJiBfX2EpCisJeyByZXR1cm4gX19hLnNlbGVjdF9vbl9jb250YWluZXJfY29weV9jb25zdHJ1Y3Rpb24oKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MyPgorCXN0YXRpYyB0eXBlbmFtZQorICAgICAgIAllbmFibGVfaWY8IV9fc2VsZWN0X2hlbHBlcjxfQWxsb2MyPjo6dmFsdWUsIF9BbGxvYzI+Ojp0eXBlCisgICAgICAgCV9TX3NlbGVjdChfQWxsb2MyJiBfX2EpCisJeyByZXR1cm4gX19hOyB9CisKKyAgICBwdWJsaWM6CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWxsb2NhdGUgbWVtb3J5LgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX24gIFRoZSBudW1iZXIgb2Ygb2JqZWN0cyB0byBhbGxvY2F0ZSBzcGFjZSBmb3IuCisgICAgICAgKgorICAgICAgICogIENhbGxzIEBjIGEuYWxsb2NhdGUobikKKyAgICAgICovCisgICAgICBzdGF0aWMgcG9pbnRlcgorICAgICAgYWxsb2NhdGUoX0FsbG9jJiBfX2EsIHNpemVfdHlwZSBfX24pCisgICAgICB7IHJldHVybiBfX2EuYWxsb2NhdGUoX19uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFsbG9jYXRlIG1lbW9yeS4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19uICBUaGUgbnVtYmVyIG9mIG9iamVjdHMgdG8gYWxsb2NhdGUgc3BhY2UgZm9yLgorICAgICAgICogIEBwYXJhbSAgX19oaW50IEFpZCB0byBsb2NhbGl0eS4KKyAgICAgICAqICBAcmV0dXJuIE1lbW9yeSBvZiBzdWl0YWJsZSBzaXplIGFuZCBhbGlnbm1lbnQgZm9yIEBhIG4gb2JqZWN0cworICAgICAgICogICAgICAgICAgb2YgdHlwZSBAYyB2YWx1ZV90eXBlCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgPHR0PiBhLmFsbG9jYXRlKG4sIGhpbnQpIDwvdHQ+IGlmIHRoYXQgZXhwcmVzc2lvbiBpcworICAgICAgICogIHdlbGwtZm9ybWVkLCBvdGhlcndpc2UgcmV0dXJucyBAYyBhLmFsbG9jYXRlKG4pCisgICAgICAqLworICAgICAgc3RhdGljIHBvaW50ZXIKKyAgICAgIGFsbG9jYXRlKF9BbGxvYyYgX19hLCBzaXplX3R5cGUgX19uLCBjb25zdF92b2lkX3BvaW50ZXIgX19oaW50KQorICAgICAgeyByZXR1cm4gX1NfYWxsb2NhdGUoX19hLCBfX24sIF9faGludCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZWFsbG9jYXRlIG1lbW9yeS4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19wICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgdG8gZGVhbGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgVGhlIG51bWJlciBvZiBvYmplY3RzIHNwYWNlIHdhcyBhbGxvY2F0ZWQgZm9yLgorICAgICAgICoKKyAgICAgICAqICBDYWxscyA8dHQ+IGEuZGVhbGxvY2F0ZShwLCBuKSA8L3R0PgorICAgICAgKi8KKyAgICAgIHN0YXRpYyB2b2lkIGRlYWxsb2NhdGUoX0FsbG9jJiBfX2EsIHBvaW50ZXIgX19wLCBzaXplX3R5cGUgX19uKQorICAgICAgeyBfX2EuZGVhbGxvY2F0ZShfX3AsIF9fbik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3QgYW4gb2JqZWN0IG9mIHR5cGUgQGEgX1RwCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fcCAgUG9pbnRlciB0byBtZW1vcnkgb2Ygc3VpdGFibGUgc2l6ZSBhbmQgYWxpZ25tZW50IGZvciBUcAorICAgICAgICogIEBwYXJhbSAgX19hcmdzIENvbnN0cnVjdG9yIGFyZ3VtZW50cy4KKyAgICAgICAqCisgICAgICAgKiAgQ2FsbHMgPHR0PiBfX2EuY29uc3RydWN0KF9fcCwgc3RkOjpmb3J3YXJkPEFyZ3M+KF9fYXJncykuLi4pIDwvdHQ+CisgICAgICAgKiAgaWYgdGhhdCBleHByZXNzaW9uIGlzIHdlbGwtZm9ybWVkLCBvdGhlcndpc2UgdXNlcyBwbGFjZW1lbnQtbmV3CisgICAgICAgKiAgdG8gY29uc3RydWN0IGFuIG9iamVjdCBvZiB0eXBlIEBhIF9UcCBhdCBsb2NhdGlvbiBAYSBfX3AgZnJvbSB0aGUKKyAgICAgICAqICBhcmd1bWVudHMgQGEgX19hcmdzLi4uCisgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKwlzdGF0aWMgYXV0byBjb25zdHJ1Y3QoX0FsbG9jJiBfX2EsIF9UcCogX19wLCBfQXJncyYmLi4uIF9fYXJncykKKwktPiBkZWNsdHlwZShfU19jb25zdHJ1Y3QoX19hLCBfX3AsIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikpCisJeyBfU19jb25zdHJ1Y3QoX19hLCBfX3AsIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZXN0cm95IGFuIG9iamVjdCBvZiB0eXBlIEBhIF9UcAorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3AgIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBkZXN0cm95CisgICAgICAgKgorICAgICAgICogIENhbGxzIEBjIF9fYS5kZXN0cm95KF9fcCkgaWYgdGhhdCBleHByZXNzaW9uIGlzIHdlbGwtZm9ybWVkLAorICAgICAgICogIG90aGVyd2lzZSBjYWxscyBAYyBfX3AtPn5fVHAoKQorICAgICAgKi8KKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisJc3RhdGljIHZvaWQgZGVzdHJveShfQWxsb2MmIF9fYSwgX1RwKiBfX3ApCisJeyBfU19kZXN0cm95KF9fYSwgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRoZSBtYXhpbXVtIHN1cHBvcnRlZCBhbGxvY2F0aW9uIHNpemUKKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yLgorICAgICAgICogIEByZXR1cm4gQGMgX19hLm1heF9zaXplKCkgb3IgQGMgbnVtZXJpY19saW1pdHM8c2l6ZV90eXBlPjo6bWF4KCkKKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBAYyBfX2EubWF4X3NpemUoKSBpZiB0aGF0IGV4cHJlc3Npb24gaXMgd2VsbC1mb3JtZWQsCisgICAgICAgKiAgb3RoZXJ3aXNlIHJldHVybnMgQGMgbnVtZXJpY19saW1pdHM8c2l6ZV90eXBlPjo6bWF4KCkKKyAgICAgICovCisgICAgICBzdGF0aWMgc2l6ZV90eXBlIG1heF9zaXplKGNvbnN0IF9BbGxvYyYgX19hKQorICAgICAgeyByZXR1cm4gX1NfbWF4X3NpemUoX19hKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE9idGFpbiBhbiBhbGxvY2F0b3IgdG8gdXNlIHdoZW4gY29weWluZyBhIGNvbnRhaW5lci4KKyAgICAgICAqICBAcGFyYW0gIF9fcmhzICBBbiBhbGxvY2F0b3IuCisgICAgICAgKiAgQHJldHVybiBAYyBfX3Jocy5zZWxlY3Rfb25fY29udGFpbmVyX2NvcHlfY29uc3RydWN0aW9uKCkgb3IgQGEgX19yaHMKKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBAYyBfX3Jocy5zZWxlY3Rfb25fY29udGFpbmVyX2NvcHlfY29uc3RydWN0aW9uKCkgaWYgdGhhdAorICAgICAgICogIGV4cHJlc3Npb24gaXMgd2VsbC1mb3JtZWQsIG90aGVyd2lzZSByZXR1cm5zIEBhIF9fcmhzCisgICAgICAqLworICAgICAgc3RhdGljIF9BbGxvYworICAgICAgc2VsZWN0X29uX2NvbnRhaW5lcl9jb3B5X2NvbnN0cnVjdGlvbihjb25zdCBfQWxsb2MmIF9fcmhzKQorICAgICAgeyByZXR1cm4gX1Nfc2VsZWN0KF9fcmhzKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MyPgorICAgIGNvbnN0IGJvb2wgYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+OjpfX2FsbG9jYXRlX2hlbHBlcjxfQWxsb2MyPjo6dmFsdWU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGNvbnN0IGJvb2wKKyAgICBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz46Ol9fY29uc3RydWN0X2hlbHBlcjxfVHAsIF9BcmdzLi4uPjo6dmFsdWU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3QgYm9vbCBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz46Ol9fZGVzdHJveV9oZWxwZXI8X1RwPjo6dmFsdWU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MyPgorICAgIGNvbnN0IGJvb2wgYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+OjpfX21heHNpemVfaGVscGVyPF9BbGxvYzI+Ojp2YWx1ZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYzI+CisgICAgY29uc3QgYm9vbCBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz46Ol9fc2VsZWN0X2hlbHBlcjxfQWxsb2MyPjo6dmFsdWU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgX19kb19hbGxvY19vbl9jb3B5KF9BbGxvYyYgX19vbmUsIGNvbnN0IF9BbGxvYyYgX190d28sIHRydWVfdHlwZSkKKyAgICB7IF9fb25lID0gX190d287IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX2RvX2FsbG9jX29uX2NvcHkoX0FsbG9jJiwgY29uc3QgX0FsbG9jJiwgZmFsc2VfdHlwZSkKKyAgICB7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQgX19hbGxvY19vbl9jb3B5KF9BbGxvYyYgX19vbmUsIGNvbnN0IF9BbGxvYyYgX190d28pCisgICAgeworICAgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz4gX190cmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX2NvcHlfYXNzaWdubWVudCBfX3BvY2NhOworICAgICAgX19kb19hbGxvY19vbl9jb3B5KF9fb25lLCBfX3R3bywgX19wb2NjYSgpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBfQWxsb2MgX19hbGxvY19vbl9jb3B5KGNvbnN0IF9BbGxvYyYgX19hKQorICAgIHsKKyAgICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+IF9fdHJhaXRzOworICAgICAgcmV0dXJuIF9fdHJhaXRzOjpzZWxlY3Rfb25fY29udGFpbmVyX2NvcHlfY29uc3RydWN0aW9uKF9fYSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZCBfX2RvX2FsbG9jX29uX21vdmUoX0FsbG9jJiBfX29uZSwgX0FsbG9jJiBfX3R3bywgdHJ1ZV90eXBlKQorICAgIHsgX19vbmUgPSBzdGQ6Om1vdmUoX190d28pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkIF9fZG9fYWxsb2Nfb25fbW92ZShfQWxsb2MmLCBfQWxsb2MmLCBmYWxzZV90eXBlKQorICAgIHsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZCBfX2FsbG9jX29uX21vdmUoX0FsbG9jJiBfX29uZSwgX0FsbG9jJiBfX3R3bykKKyAgICB7CisgICAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPiBfX3RyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHM6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50IF9fcG9jbWE7CisgICAgICBfX2RvX2FsbG9jX29uX21vdmUoX19vbmUsIF9fdHdvLCBfX3BvY21hKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQgX19kb19hbGxvY19vbl9zd2FwKF9BbGxvYyYgX19vbmUsIF9BbGxvYyYgX190d28sIHRydWVfdHlwZSkKKyAgICB7CisgICAgICB1c2luZyBzdGQ6OnN3YXA7CisgICAgICBzd2FwKF9fb25lLCBfX3R3byk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZCBfX2RvX2FsbG9jX29uX3N3YXAoX0FsbG9jJiwgX0FsbG9jJiwgZmFsc2VfdHlwZSkKKyAgICB7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQgX19hbGxvY19vbl9zd2FwKF9BbGxvYyYgX19vbmUsIF9BbGxvYyYgX190d28pCisgICAgeworICAgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz4gX190cmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzOjpwcm9wYWdhdGVfb25fY29udGFpbmVyX3N3YXAgX19wb2NzOworICAgICAgX19kb19hbGxvY19vbl9zd2FwKF9fb25lLCBfX3R3bywgX19wb2NzKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgX19pc19jb3B5X2luc2VydGFibGVfaW1wbAorICAgIHsKKyAgICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+IF9UcmFpdHM7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUKKwkgICAgICAgPSBkZWNsdHlwZShfVHJhaXRzOjpjb25zdHJ1Y3Qoc3RkOjpkZWNsdmFsPF9BbGxvYyY+KCksCisJCQkJCSAgICAgc3RkOjpkZWNsdmFsPF9VcCo+KCksCisJCQkJCSAgICAgc3RkOjpkZWNsdmFsPGNvbnN0IF9VcCY+KCkpKT4KKwlzdGF0aWMgdHJ1ZV90eXBlCisJX01fc2VsZWN0KGludCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKwlzdGF0aWMgZmFsc2VfdHlwZQorCV9NX3NlbGVjdCguLi4pOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBkZWNsdHlwZShfTV9zZWxlY3Q8dHlwZW5hbWUgX0FsbG9jOjp2YWx1ZV90eXBlPigwKSkgdHlwZTsKKyAgICB9OworCisgIC8vIHRydWUgaWYgX0FsbG9jOjp2YWx1ZV90eXBlIGlzIENvcHlJbnNlcnRhYmxlIGludG8gY29udGFpbmVycyB1c2luZyBfQWxsb2MKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBfX2lzX2NvcHlfaW5zZXJ0YWJsZQorICAgIDogX19pc19jb3B5X2luc2VydGFibGVfaW1wbDxfQWxsb2M+Ojp0eXBlCisgICAgeyB9OworCisgIC8vIHN0ZDo6YWxsb2NhdG9yPF9UcD4ganVzdCByZXF1aXJlcyBDb3B5Q29uc3RydWN0aWJsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfY29weV9pbnNlcnRhYmxlPGFsbG9jYXRvcjxfVHA+PgorICAgIDogaXNfY29weV9jb25zdHJ1Y3RpYmxlPF9UcD4KKyAgICB7IH07CisKKyAgLy8gVXNlZCB0byBhbGxvdyBjb3B5IGNvbnN0cnVjdGlvbiBvZiB1bm9yZGVyZWQgY29udGFpbmVycworICB0ZW1wbGF0ZTxib29sPiBzdHJ1Y3QgX19hbGxvd19jb3B5X2NvbnMgeyB9OworCisgIC8vIFVzZWQgdG8gZGVsZXRlIGNvcHkgY29uc3RydWN0b3Igb2YgdW5vcmRlcmVkIGNvbnRhaW5lcnMKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2FsbG93X2NvcHlfY29uczxmYWxzZT4KKyAgICB7CisgICAgICBfX2FsbG93X2NvcHlfY29ucygpID0gZGVmYXVsdDsKKyAgICAgIF9fYWxsb3dfY29weV9jb25zKGNvbnN0IF9fYWxsb3dfY29weV9jb25zJikgPSBkZWxldGU7CisgICAgICBfX2FsbG93X2NvcHlfY29ucyhfX2FsbG93X2NvcHlfY29ucyYmKSA9IGRlZmF1bHQ7CisgICAgICBfX2FsbG93X2NvcHlfY29ucyYgb3BlcmF0b3I9KGNvbnN0IF9fYWxsb3dfY29weV9jb25zJikgPSBkZWZhdWx0OworICAgICAgX19hbGxvd19jb3B5X2NvbnMmIG9wZXJhdG9yPShfX2FsbG93X2NvcHlfY29ucyYmKSA9IGRlZmF1bHQ7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgdXNpbmcgX19jaGVja19jb3B5X2NvbnN0cnVjdGlibGUKKyAgICAgID0gX19hbGxvd19jb3B5X2NvbnM8X19pc19jb3B5X2luc2VydGFibGU8X0FsbG9jPjo6dmFsdWU+OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2FsbG9jYXRvci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZGYyNDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYWxsb2NhdG9yLmgKQEAgLTAsMCArMSwyMjEgQEAKKy8vIEFsbG9jYXRvcnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9hbGxvY2F0b3IuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le21lbW9yeX0KKyAqLworCisjaWZuZGVmIF9BTExPQ0FUT1JfSAorI2RlZmluZSBfQUxMT0NBVE9SX0ggMQorCisjaW5jbHVkZSA8Yml0cy9jKythbGxvY2F0b3IuaD4gLy8gRGVmaW5lIHRoZSBiYXNlIGNsYXNzIHRvIHN0ZDo6YWxsb2NhdG9yLgorI2luY2x1ZGUgPGJpdHMvbWVtb3J5ZndkLmg+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBhZGR0b2dyb3VwIGFsbG9jYXRvcnMKKyAgICogIEB7CisgICAqLworCisgIC8vLyBhbGxvY2F0b3I8dm9pZD4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBhbGxvY2F0b3I8dm9pZD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBzaXplX3QgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCogICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3Qgdm9pZCogY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgdmFsdWVfdHlwZTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgc3RydWN0IHJlYmluZAorICAgICAgICB7IHR5cGVkZWYgYWxsb2NhdG9yPF9UcDE+IG90aGVyOyB9OworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjEwMy4gc3RkOjphbGxvY2F0b3IgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQKKyAgICAgIHR5cGVkZWYgdHJ1ZV90eXBlIHByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50OworI2VuZGlmCisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmICBUaGUgQGEgc3RhbmRhcmQgYWxsb2NhdG9yLCBhcyBwZXIgWzIwLjRdLgorICAgKgorICAgKiAgU2VlIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MDRjaDExLmh0bWwKKyAgICogIGZvciBmdXJ0aGVyIGRldGFpbHMuCisgICAqCisgICAqICBAdHBhcmFtICBfVHAgIFR5cGUgb2YgYWxsb2NhdGVkIG9iamVjdC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBhbGxvY2F0b3I6IHB1YmxpYyBfX2FsbG9jYXRvcl9iYXNlPF9UcD4KKyAgICB7CisgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHNpemVfdCAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwKiAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAqIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIF9UcCYgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICB2YWx1ZV90eXBlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBzdHJ1Y3QgcmViaW5kCisgICAgICAgIHsgdHlwZWRlZiBhbGxvY2F0b3I8X1RwMT4gb3RoZXI7IH07CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTAzLiBzdGQ6OmFsbG9jYXRvciBwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudAorICAgICAgdHlwZWRlZiB0cnVlX3R5cGUgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ7CisjZW5kaWYKKworICAgICAgYWxsb2NhdG9yKCkgdGhyb3coKSB7IH0KKworICAgICAgYWxsb2NhdG9yKGNvbnN0IGFsbG9jYXRvciYgX19hKSB0aHJvdygpCisgICAgICA6IF9fYWxsb2NhdG9yX2Jhc2U8X1RwPihfX2EpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBhbGxvY2F0b3IoY29uc3QgYWxsb2NhdG9yPF9UcDE+JikgdGhyb3coKSB7IH0KKworICAgICAgfmFsbG9jYXRvcigpIHRocm93KCkgeyB9CisKKyAgICAgIC8vIEluaGVyaXQgZXZlcnl0aGluZyBlbHNlLgorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGFsbG9jYXRvcjxfVDE+JiwgY29uc3QgYWxsb2NhdG9yPF9UMj4mKQorICAgIHsgcmV0dXJuIHRydWU7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGFsbG9jYXRvcjxfVHA+JiwgY29uc3QgYWxsb2NhdG9yPF9UcD4mKQorICAgIHsgcmV0dXJuIHRydWU7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgYWxsb2NhdG9yPF9UMT4mLCBjb25zdCBhbGxvY2F0b3I8X1QyPiYpCisgICAgeyByZXR1cm4gZmFsc2U7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGFsbG9jYXRvcjxfVHA+JiwgY29uc3QgYWxsb2NhdG9yPF9UcD4mKQorICAgIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIEB9IGdyb3VwIGFsbG9jYXRvcgorCisgIC8vIEluaGliaXQgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgZm9yIHJlcXVpcmVkIGluc3RhbnRpYXRpb25zLAorICAvLyB3aGljaCBhcmUgZGVmaW5lZCB2aWEgZXhwbGljaXQgaW5zdGFudGlhdGlvbnMgZWxzZXdoZXJlLgorI2lmIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURQorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYWxsb2NhdG9yPGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYWxsb2NhdG9yPHdjaGFyX3Q+OworI2VuZGlmCisKKyAgLy8gVW5kZWZpbmUuCisjdW5kZWYgX19hbGxvY2F0b3JfYmFzZQorCisgIC8vIFRvIGltcGxlbWVudCBPcHRpb24gMyBvZiBEUiA0MzEuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYywgYm9vbCA9IF9faXNfZW1wdHkoX0FsbG9jKT4KKyAgICBzdHJ1Y3QgX19hbGxvY19zd2FwCisgICAgeyBzdGF0aWMgdm9pZCBfU19kb19pdChfQWxsb2MmLCBfQWxsb2MmKSB7IH0gfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IF9fYWxsb2Nfc3dhcDxfQWxsb2MsIGZhbHNlPgorICAgIHsKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19kb19pdChfQWxsb2MmIF9fb25lLCBfQWxsb2MmIF9fdHdvKQorICAgICAgeworCS8vIFByZWNvbmRpdGlvbjogc3dhcHBhYmxlIGFsbG9jYXRvcnMuCisJaWYgKF9fb25lICE9IF9fdHdvKQorCSAgc3dhcChfX29uZSwgX190d28pOworICAgICAgfQorICAgIH07CisKKyAgLy8gT3B0aW1pemUgZm9yIHN0YXRlbGVzcyBhbGxvY2F0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MsIGJvb2wgPSBfX2lzX2VtcHR5KF9BbGxvYyk+CisgICAgc3RydWN0IF9fYWxsb2NfbmVxCisgICAgeworICAgICAgc3RhdGljIGJvb2wKKyAgICAgIF9TX2RvX2l0KGNvbnN0IF9BbGxvYyYsIGNvbnN0IF9BbGxvYyYpCisgICAgICB7IHJldHVybiBmYWxzZTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBfX2FsbG9jX25lcTxfQWxsb2MsIGZhbHNlPgorICAgIHsKKyAgICAgIHN0YXRpYyBib29sCisgICAgICBfU19kb19pdChjb25zdCBfQWxsb2MmIF9fb25lLCBjb25zdCBfQWxsb2MmIF9fdHdvKQorICAgICAgeyByZXR1cm4gX19vbmUgIT0gX190d287IH0KKyAgICB9OworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2wKKyAgICA9IF9fb3JfPGlzX2NvcHlfY29uc3RydWN0aWJsZTx0eXBlbmFtZSBfVHA6OnZhbHVlX3R5cGU+LAorICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8dHlwZW5hbWUgX1RwOjp2YWx1ZV90eXBlPj46OnZhbHVlPgorICAgIHN0cnVjdCBfX3Nocmlua190b19maXRfYXV4CisgICAgeyBzdGF0aWMgYm9vbCBfU19kb19pdChfVHAmKSB7IHJldHVybiBmYWxzZTsgfSB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19zaHJpbmtfdG9fZml0X2F1eDxfVHAsIHRydWU+CisgICAgeworICAgICAgc3RhdGljIGJvb2wKKyAgICAgIF9TX2RvX2l0KF9UcCYgX19jKQorICAgICAgeworCV9fdHJ5CisJICB7CisJICAgIF9UcChfX21ha2VfbW92ZV9pZl9ub2V4Y2VwdF9pdGVyYXRvcihfX2MuYmVnaW4oKSksCisJCV9fbWFrZV9tb3ZlX2lmX25vZXhjZXB0X2l0ZXJhdG9yKF9fYy5lbmQoKSksCisJCV9fYy5nZXRfYWxsb2NhdG9yKCkpLnN3YXAoX19jKTsKKwkgICAgcmV0dXJuIHRydWU7CisJICB9CisJX19jYXRjaCguLi4pCisJICB7IHJldHVybiBmYWxzZTsgfQorICAgICAgfQorICAgIH07CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYXRvbWljX2Jhc2UuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9hdG9taWNfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNGQyMDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYXRvbWljX2Jhc2UuaApAQCAtMCwwICsxLDg4OCBAQAorLy8gLSotIEMrKyAtKi0gaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9hdG9taWNfYmFzZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7YXRvbWljfQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQVRPTUlDX0JBU0VfSAorI2RlZmluZSBfR0xJQkNYWF9BVE9NSUNfQkFTRV9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Yml0cy9hdG9taWNfbG9ja2ZyZWVfZGVmaW5lcy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBkZWZncm91cCBhdG9taWNzIEF0b21pY3MKKyAgICoKKyAgICogQ29tcG9uZW50cyBmb3IgcGVyZm9ybWluZyBhdG9taWMgb3BlcmF0aW9ucy4KKyAgICogQHsKKyAgICovCisKKyAgLy8vIEVudW1lcmF0aW9uIGZvciBtZW1vcnlfb3JkZXIKKyAgdHlwZWRlZiBlbnVtIG1lbW9yeV9vcmRlcgorICAgIHsKKyAgICAgIG1lbW9yeV9vcmRlcl9yZWxheGVkLAorICAgICAgbWVtb3J5X29yZGVyX2NvbnN1bWUsCisgICAgICBtZW1vcnlfb3JkZXJfYWNxdWlyZSwKKyAgICAgIG1lbW9yeV9vcmRlcl9yZWxlYXNlLAorICAgICAgbWVtb3J5X29yZGVyX2FjcV9yZWwsCisgICAgICBtZW1vcnlfb3JkZXJfc2VxX2NzdAorICAgIH0gbWVtb3J5X29yZGVyOworCisgIGVudW0gX19tZW1vcnlfb3JkZXJfbW9kaWZpZXIKKyAgICB7CisgICAgICBfX21lbW9yeV9vcmRlcl9tYXNrICAgICAgICAgID0gMHgwZmZmZiwKKyAgICAgIF9fbWVtb3J5X29yZGVyX21vZGlmaWVyX21hc2sgPSAweGZmZmYwMDAwLAorICAgICAgX19tZW1vcnlfb3JkZXJfaGxlX2FjcXVpcmUgICA9IDB4MTAwMDAsCisgICAgICBfX21lbW9yeV9vcmRlcl9obGVfcmVsZWFzZSAgID0gMHgyMDAwMAorICAgIH07CisKKyAgY29uc3RleHByIG1lbW9yeV9vcmRlcgorICBvcGVyYXRvcnwobWVtb3J5X29yZGVyIF9fbSwgX19tZW1vcnlfb3JkZXJfbW9kaWZpZXIgX19tb2QpCisgIHsKKyAgICByZXR1cm4gbWVtb3J5X29yZGVyKF9fbSB8IGludChfX21vZCkpOworICB9CisKKyAgY29uc3RleHByIG1lbW9yeV9vcmRlcgorICBvcGVyYXRvciYobWVtb3J5X29yZGVyIF9fbSwgX19tZW1vcnlfb3JkZXJfbW9kaWZpZXIgX19tb2QpCisgIHsKKyAgICByZXR1cm4gbWVtb3J5X29yZGVyKF9fbSAmIGludChfX21vZCkpOworICB9CisKKyAgLy8gRHJvcCByZWxlYXNlIG9yZGVyaW5nIGFzIHBlciBbYXRvbWljcy50eXBlcy5vcGVyYXRpb25zLnJlcV0vMjEKKyAgY29uc3RleHByIG1lbW9yeV9vcmRlcgorICBfX2NtcGV4Y2hfZmFpbHVyZV9vcmRlcjIobWVtb3J5X29yZGVyIF9fbSkgbm9leGNlcHQKKyAgeworICAgIHJldHVybiBfX20gPT0gbWVtb3J5X29yZGVyX2FjcV9yZWwgPyBtZW1vcnlfb3JkZXJfYWNxdWlyZQorICAgICAgOiBfX20gPT0gbWVtb3J5X29yZGVyX3JlbGVhc2UgPyBtZW1vcnlfb3JkZXJfcmVsYXhlZCA6IF9fbTsKKyAgfQorCisgIGNvbnN0ZXhwciBtZW1vcnlfb3JkZXIKKyAgX19jbXBleGNoX2ZhaWx1cmVfb3JkZXIobWVtb3J5X29yZGVyIF9fbSkgbm9leGNlcHQKKyAgeworICAgIHJldHVybiBtZW1vcnlfb3JkZXIoX19jbXBleGNoX2ZhaWx1cmVfb3JkZXIyKF9fbSAmIF9fbWVtb3J5X29yZGVyX21hc2spCisgICAgICB8IChfX20gJiBfX21lbW9yeV9vcmRlcl9tb2RpZmllcl9tYXNrKSk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBhdG9taWNfdGhyZWFkX2ZlbmNlKG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgIHsgX19hdG9taWNfdGhyZWFkX2ZlbmNlKF9fbSk7IH0KKworICBpbmxpbmUgdm9pZAorICBhdG9taWNfc2lnbmFsX2ZlbmNlKG1lbW9yeV9vcmRlciBfX20pIG5vZXhjZXB0CisgIHsgX19hdG9taWNfc2lnbmFsX2ZlbmNlKF9fbSk7IH0KKworICAvLy8ga2lsbF9kZXBlbmRlbmN5CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAga2lsbF9kZXBlbmRlbmN5KF9UcCBfX3kpIG5vZXhjZXB0CisgICAgeworICAgICAgX1RwIF9fcmV0KF9feSk7CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisKKyAgLy8gQmFzZSB0eXBlcyBmb3IgYXRvbWljcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFRwPgorICAgIHN0cnVjdCBfX2F0b21pY19iYXNlOworCisgIC8vLyBhdG9taWNfY2hhcgorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8Y2hhcj4gIAkgICAgICAgCQlhdG9taWNfY2hhcjsKKworICAvLy8gYXRvbWljX3NjaGFyCisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxzaWduZWQgY2hhcj4JICAgICAJYXRvbWljX3NjaGFyOworCisgIC8vLyBhdG9taWNfdWNoYXIKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVuc2lnbmVkIGNoYXI+CQlhdG9taWNfdWNoYXI7CisKKyAgLy8vIGF0b21pY19zaG9ydAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8c2hvcnQ+CQkJYXRvbWljX3Nob3J0OworCisgIC8vLyBhdG9taWNfdXNob3J0CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTx1bnNpZ25lZCBzaG9ydD4JIAlhdG9taWNfdXNob3J0OworCisgIC8vLyBhdG9taWNfaW50CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxpbnQ+ICAJICAgICAgIAkJYXRvbWljX2ludDsKKworICAvLy8gYXRvbWljX3VpbnQKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVuc2lnbmVkIGludD4JICAgICAJYXRvbWljX3VpbnQ7CisKKyAgLy8vIGF0b21pY19sb25nCisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxsb25nPiAgCSAgICAgICAJCWF0b21pY19sb25nOworCisgIC8vLyBhdG9taWNfdWxvbmcKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVuc2lnbmVkIGxvbmc+CQlhdG9taWNfdWxvbmc7CisKKyAgLy8vIGF0b21pY19sbG9uZworICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8bG9uZyBsb25nPiAgCQlhdG9taWNfbGxvbmc7CisKKyAgLy8vIGF0b21pY191bGxvbmcKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVuc2lnbmVkIGxvbmcgbG9uZz4gCWF0b21pY191bGxvbmc7CisKKyAgLy8vIGF0b21pY193Y2hhcl90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTx3Y2hhcl90PiAgCQlhdG9taWNfd2NoYXJfdDsKKworICAvLy8gYXRvbWljX2NoYXIxNl90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxjaGFyMTZfdD4gIAkJYXRvbWljX2NoYXIxNl90OworCisgIC8vLyBhdG9taWNfY2hhcjMyX3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPGNoYXIzMl90PiAgCQlhdG9taWNfY2hhcjMyX3Q7CisKKyAgLy8vIGF0b21pY19jaGFyMzJfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8Y2hhcjMyX3Q+ICAJCWF0b21pY19jaGFyMzJfdDsKKworCisgIC8vLyBhdG9taWNfaW50X2xlYXN0OF90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxpbnRfbGVhc3Q4X3Q+ICAJCWF0b21pY19pbnRfbGVhc3Q4X3Q7CisKKyAgLy8vIGF0b21pY191aW50X2xlYXN0OF90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTx1aW50X2xlYXN0OF90PgkgICAgICAgCWF0b21pY191aW50X2xlYXN0OF90OworCisgIC8vLyBhdG9taWNfaW50X2xlYXN0MTZfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8aW50X2xlYXN0MTZfdD4JICAgICAgIAlhdG9taWNfaW50X2xlYXN0MTZfdDsKKworICAvLy8gYXRvbWljX3VpbnRfbGVhc3QxNl90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTx1aW50X2xlYXN0MTZfdD4JICAgICAgIAlhdG9taWNfdWludF9sZWFzdDE2X3Q7CisKKyAgLy8vIGF0b21pY19pbnRfbGVhc3QzMl90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxpbnRfbGVhc3QzMl90PgkgICAgICAgCWF0b21pY19pbnRfbGVhc3QzMl90OworCisgIC8vLyBhdG9taWNfdWludF9sZWFzdDMyX3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVpbnRfbGVhc3QzMl90PgkgICAgICAgCWF0b21pY191aW50X2xlYXN0MzJfdDsKKworICAvLy8gYXRvbWljX2ludF9sZWFzdDY0X3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPGludF9sZWFzdDY0X3Q+CSAgICAgICAJYXRvbWljX2ludF9sZWFzdDY0X3Q7CisKKyAgLy8vIGF0b21pY191aW50X2xlYXN0NjRfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8dWludF9sZWFzdDY0X3Q+CSAgICAgICAJYXRvbWljX3VpbnRfbGVhc3Q2NF90OworCisKKyAgLy8vIGF0b21pY19pbnRfZmFzdDhfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8aW50X2Zhc3Q4X3Q+ICAJCWF0b21pY19pbnRfZmFzdDhfdDsKKworICAvLy8gYXRvbWljX3VpbnRfZmFzdDhfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8dWludF9mYXN0OF90PgkgICAgICAJYXRvbWljX3VpbnRfZmFzdDhfdDsKKworICAvLy8gYXRvbWljX2ludF9mYXN0MTZfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8aW50X2Zhc3QxNl90PgkgICAgICAJYXRvbWljX2ludF9mYXN0MTZfdDsKKworICAvLy8gYXRvbWljX3VpbnRfZmFzdDE2X3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVpbnRfZmFzdDE2X3Q+CSAgICAgIAlhdG9taWNfdWludF9mYXN0MTZfdDsKKworICAvLy8gYXRvbWljX2ludF9mYXN0MzJfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8aW50X2Zhc3QzMl90PgkgICAgICAJYXRvbWljX2ludF9mYXN0MzJfdDsKKworICAvLy8gYXRvbWljX3VpbnRfZmFzdDMyX3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVpbnRfZmFzdDMyX3Q+CSAgICAgIAlhdG9taWNfdWludF9mYXN0MzJfdDsKKworICAvLy8gYXRvbWljX2ludF9mYXN0NjRfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8aW50X2Zhc3Q2NF90PgkgICAgICAJYXRvbWljX2ludF9mYXN0NjRfdDsKKworICAvLy8gYXRvbWljX3VpbnRfZmFzdDY0X3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVpbnRfZmFzdDY0X3Q+CSAgICAgIAlhdG9taWNfdWludF9mYXN0NjRfdDsKKworCisgIC8vLyBhdG9taWNfaW50cHRyX3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPGludHB0cl90PiAgCSAgICAgICAJYXRvbWljX2ludHB0cl90OworCisgIC8vLyBhdG9taWNfdWludHB0cl90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTx1aW50cHRyX3Q+ICAJICAgICAgIAlhdG9taWNfdWludHB0cl90OworCisgIC8vLyBhdG9taWNfc2l6ZV90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxzaXplX3Q+CSAJICAgICAgIAlhdG9taWNfc2l6ZV90OworCisgIC8vLyBhdG9taWNfaW50bWF4X3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPGludG1heF90PiAgCSAgICAgICAJYXRvbWljX2ludG1heF90OworCisgIC8vLyBhdG9taWNfdWludG1heF90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTx1aW50bWF4X3Q+ICAJICAgICAgIAlhdG9taWNfdWludG1heF90OworCisgIC8vLyBhdG9taWNfcHRyZGlmZl90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxwdHJkaWZmX3Q+ICAJICAgICAgIAlhdG9taWNfcHRyZGlmZl90OworCisKKyNkZWZpbmUgQVRPTUlDX1ZBUl9JTklUKF9WSSkgeyBfVkkgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYXRvbWljOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYXRvbWljPF9UcCo+OworCisgICAgLyogVGhlIHRhcmdldCdzICJzZXQiIHZhbHVlIGZvciB0ZXN0LWFuZC1zZXQgbWF5IG5vdCBiZSBleGFjdGx5IDEuICAqLworI2lmIF9fR0NDX0FUT01JQ19URVNUX0FORF9TRVRfVFJVRVZBTCA9PSAxCisgICAgdHlwZWRlZiBib29sIF9fYXRvbWljX2ZsYWdfZGF0YV90eXBlOworI2Vsc2UKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX19hdG9taWNfZmxhZ19kYXRhX3R5cGU7CisjZW5kaWYKKworICAvKioKKyAgICogIEBicmllZiBCYXNlIHR5cGUgZm9yIGF0b21pY19mbGFnLgorICAgKgorICAgKiAgQmFzZSB0eXBlIGlzIFBPRCB3aXRoIGRhdGEsIGFsbG93aW5nIGF0b21pY19mbGFnIHRvIGRlcml2ZSBmcm9tCisgICAqICBpdCBhbmQgbWVldCB0aGUgc3RhbmRhcmQgbGF5b3V0IHR5cGUgcmVxdWlyZW1lbnQuIEluIGFkZGl0aW9uIHRvCisgICAqICBjb21wYXRpYmlsdHkgd2l0aCBhIEMgaW50ZXJmYWNlLCB0aGlzIGFsbG93cyBkaWZmZXJlbnQKKyAgICogIGltcGxlbWVudGF0aW9ucyBvZiBhdG9taWNfZmxhZyB0byB1c2UgdGhlIHNhbWUgYXRvbWljIG9wZXJhdGlvbgorICAgKiAgZnVuY3Rpb25zLCB2aWEgYSBzdGFuZGFyZCBjb252ZXJzaW9uIHRvIHRoZSBfX2F0b21pY19mbGFnX2Jhc2UKKyAgICogIGFyZ3VtZW50LgorICAqLworICBfR0xJQkNYWF9CRUdJTl9FWFRFUk5fQworCisgIHN0cnVjdCBfX2F0b21pY19mbGFnX2Jhc2UKKyAgeworICAgIF9fYXRvbWljX2ZsYWdfZGF0YV90eXBlIF9NX2k7CisgIH07CisKKyAgX0dMSUJDWFhfRU5EX0VYVEVSTl9DCisKKyNkZWZpbmUgQVRPTUlDX0ZMQUdfSU5JVCB7IDAgfQorCisgIC8vLyBhdG9taWNfZmxhZworICBzdHJ1Y3QgYXRvbWljX2ZsYWcgOiBwdWJsaWMgX19hdG9taWNfZmxhZ19iYXNlCisgIHsKKyAgICBhdG9taWNfZmxhZygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICB+YXRvbWljX2ZsYWcoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgYXRvbWljX2ZsYWcoY29uc3QgYXRvbWljX2ZsYWcmKSA9IGRlbGV0ZTsKKyAgICBhdG9taWNfZmxhZyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pY19mbGFnJikgPSBkZWxldGU7CisgICAgYXRvbWljX2ZsYWcmIG9wZXJhdG9yPShjb25zdCBhdG9taWNfZmxhZyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgLy8gQ29udmVyc2lvbiB0byBBVE9NSUNfRkxBR19JTklULgorICAgIGNvbnN0ZXhwciBhdG9taWNfZmxhZyhib29sIF9faSkgbm9leGNlcHQKKyAgICAgIDogX19hdG9taWNfZmxhZ19iYXNleyBfU19pbml0KF9faSkgfQorICAgIHsgfQorCisgICAgYm9vbAorICAgIHRlc3RfYW5kX3NldChtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0CisgICAgeworICAgICAgcmV0dXJuIF9fYXRvbWljX3Rlc3RfYW5kX3NldCAoJl9NX2ksIF9fbSk7CisgICAgfQorCisgICAgYm9vbAorICAgIHRlc3RfYW5kX3NldChtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgeworICAgICAgcmV0dXJuIF9fYXRvbWljX3Rlc3RfYW5kX3NldCAoJl9NX2ksIF9fbSk7CisgICAgfQorCisgICAgdm9pZAorICAgIGNsZWFyKG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICB7CisgICAgICBtZW1vcnlfb3JkZXIgX19iID0gX19tICYgX19tZW1vcnlfb3JkZXJfbWFzazsKKyAgICAgIF9fZ2xpYmN4eF9hc3NlcnQoX19iICE9IG1lbW9yeV9vcmRlcl9jb25zdW1lKTsKKyAgICAgIF9fZ2xpYmN4eF9hc3NlcnQoX19iICE9IG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgICAgIF9fZ2xpYmN4eF9hc3NlcnQoX19iICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKworICAgICAgX19hdG9taWNfY2xlYXIgKCZfTV9pLCBfX20pOworICAgIH0KKworICAgIHZvaWQKKyAgICBjbGVhcihtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgeworICAgICAgbWVtb3J5X29yZGVyIF9fYiA9IF9fbSAmIF9fbWVtb3J5X29yZGVyX21hc2s7CisgICAgICBfX2dsaWJjeHhfYXNzZXJ0KF9fYiAhPSBtZW1vcnlfb3JkZXJfY29uc3VtZSk7CisgICAgICBfX2dsaWJjeHhfYXNzZXJ0KF9fYiAhPSBtZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgICAgICBfX2dsaWJjeHhfYXNzZXJ0KF9fYiAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisKKyAgICAgIF9fYXRvbWljX2NsZWFyICgmX01faSwgX19tKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3RleHByIF9fYXRvbWljX2ZsYWdfZGF0YV90eXBlCisgICAgX1NfaW5pdChib29sIF9faSkKKyAgICB7IHJldHVybiBfX2kgPyBfX0dDQ19BVE9NSUNfVEVTVF9BTkRfU0VUX1RSVUVWQUwgOiAwOyB9CisgIH07CisKKworICAvLy8gQmFzZSBjbGFzcyBmb3IgYXRvbWljIGludGVncmFscy4KKyAgLy8KKyAgLy8gRm9yIGVhY2ggb2YgdGhlIGludGVncmFsIHR5cGVzLCBkZWZpbmUgYXRvbWljX1tpbnRlZ3JhbCB0eXBlXSBzdHJ1Y3QKKyAgLy8KKyAgLy8gYXRvbWljX2Jvb2wgICAgIGJvb2wKKyAgLy8gYXRvbWljX2NoYXIgICAgIGNoYXIKKyAgLy8gYXRvbWljX3NjaGFyICAgIHNpZ25lZCBjaGFyCisgIC8vIGF0b21pY191Y2hhciAgICB1bnNpZ25lZCBjaGFyCisgIC8vIGF0b21pY19zaG9ydCAgICBzaG9ydAorICAvLyBhdG9taWNfdXNob3J0ICAgdW5zaWduZWQgc2hvcnQKKyAgLy8gYXRvbWljX2ludCAgICAgIGludAorICAvLyBhdG9taWNfdWludCAgICAgdW5zaWduZWQgaW50CisgIC8vIGF0b21pY19sb25nICAgICBsb25nCisgIC8vIGF0b21pY191bG9uZyAgICB1bnNpZ25lZCBsb25nCisgIC8vIGF0b21pY19sbG9uZyAgICBsb25nIGxvbmcKKyAgLy8gYXRvbWljX3VsbG9uZyAgIHVuc2lnbmVkIGxvbmcgbG9uZworICAvLyBhdG9taWNfY2hhcjE2X3QgY2hhcjE2X3QKKyAgLy8gYXRvbWljX2NoYXIzMl90IGNoYXIzMl90CisgIC8vIGF0b21pY193Y2hhcl90ICB3Y2hhcl90CisgIC8vCisgIC8vIE5COiBBc3N1bWluZyBfSVRwIGlzIGFuIGludGVncmFsIHNjYWxhciB0eXBlIHRoYXQgaXMgMSwgMiwgNCwgb3IKKyAgLy8gOCBieXRlcywgc2luY2UgdGhhdCBpcyB3aGF0IEdDQyBidWlsdC1pbiBmdW5jdGlvbnMgZm9yIGF0b21pYworICAvLyBtZW1vcnkgYWNjZXNzIGV4cGVjdC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBzdHJ1Y3QgX19hdG9taWNfYmFzZQorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfSVRwIAlfX2ludF90eXBlOworCisgICAgICBfX2ludF90eXBlIAlfTV9pOworCisgICAgcHVibGljOgorICAgICAgX19hdG9taWNfYmFzZSgpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIH5fX2F0b21pY19iYXNlKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgX19hdG9taWNfYmFzZShjb25zdCBfX2F0b21pY19iYXNlJikgPSBkZWxldGU7CisgICAgICBfX2F0b21pY19iYXNlJiBvcGVyYXRvcj0oY29uc3QgX19hdG9taWNfYmFzZSYpID0gZGVsZXRlOworICAgICAgX19hdG9taWNfYmFzZSYgb3BlcmF0b3I9KGNvbnN0IF9fYXRvbWljX2Jhc2UmKSB2b2xhdGlsZSA9IGRlbGV0ZTsKKworICAgICAgLy8gUmVxdWlyZXMgX19pbnRfdHlwZSBjb252ZXJ0aWJsZSB0byBfTV9pLgorICAgICAgY29uc3RleHByIF9fYXRvbWljX2Jhc2UoX19pbnRfdHlwZSBfX2kpIG5vZXhjZXB0IDogX01faSAoX19pKSB7IH0KKworICAgICAgb3BlcmF0b3IgX19pbnRfdHlwZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBsb2FkKCk7IH0KKworICAgICAgb3BlcmF0b3IgX19pbnRfdHlwZSgpIGNvbnN0IHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBsb2FkKCk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3I9KF9faW50X3R5cGUgX19pKSBub2V4Y2VwdAorICAgICAgeworCXN0b3JlKF9faSk7CisJcmV0dXJuIF9faTsKKyAgICAgIH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3I9KF9faW50X3R5cGUgX19pKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeworCXN0b3JlKF9faSk7CisJcmV0dXJuIF9faTsKKyAgICAgIH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3IrKyhpbnQpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBmZXRjaF9hZGQoMSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3IrKyhpbnQpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBmZXRjaF9hZGQoMSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3ItLShpbnQpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBmZXRjaF9zdWIoMSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3ItLShpbnQpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBmZXRjaF9zdWIoMSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3IrKygpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19hZGRfZmV0Y2goJl9NX2ksIDEsIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvcisrKCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX2FkZF9mZXRjaCgmX01faSwgMSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIG9wZXJhdG9yLS0oKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfc3ViX2ZldGNoKCZfTV9pLCAxLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3ItLSgpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19zdWJfZmV0Y2goJl9NX2ksIDEsIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvcis9KF9faW50X3R5cGUgX19pKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfYWRkX2ZldGNoKCZfTV9pLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvcis9KF9faW50X3R5cGUgX19pKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfYWRkX2ZldGNoKCZfTV9pLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvci09KF9faW50X3R5cGUgX19pKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfc3ViX2ZldGNoKCZfTV9pLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvci09KF9faW50X3R5cGUgX19pKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfc3ViX2ZldGNoKCZfTV9pLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvciY9KF9faW50X3R5cGUgX19pKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfYW5kX2ZldGNoKCZfTV9pLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvciY9KF9faW50X3R5cGUgX19pKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfYW5kX2ZldGNoKCZfTV9pLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvcnw9KF9faW50X3R5cGUgX19pKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfb3JfZmV0Y2goJl9NX2ksIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIG9wZXJhdG9yfD0oX19pbnRfdHlwZSBfX2kpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19vcl9mZXRjaCgmX01faSwgX19pLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3JePShfX2ludF90eXBlIF9faSkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX3hvcl9mZXRjaCgmX01faSwgX19pLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3JePShfX2ludF90eXBlIF9faSkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX3hvcl9mZXRjaCgmX01faSwgX19pLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICAgICAgYm9vbAorICAgICAgaXNfbG9ja19mcmVlKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX2lzX2xvY2tfZnJlZShzaXplb2YoX01faSksIG51bGxwdHIpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGlzX2xvY2tfZnJlZSgpIGNvbnN0IHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19pc19sb2NrX2ZyZWUoc2l6ZW9mKF9NX2kpLCBudWxscHRyKTsgfQorCisgICAgICB2b2lkCisgICAgICBzdG9yZShfX2ludF90eXBlIF9faSwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdAorICAgICAgeworICAgICAgICBtZW1vcnlfb3JkZXIgX19iID0gX19tICYgX19tZW1vcnlfb3JkZXJfbWFzazsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYiAhPSBtZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisJX19nbGliY3h4X2Fzc2VydChfX2IgIT0gbWVtb3J5X29yZGVyX2FjcV9yZWwpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iICE9IG1lbW9yeV9vcmRlcl9jb25zdW1lKTsKKworCV9fYXRvbWljX3N0b3JlX24oJl9NX2ksIF9faSwgX19tKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgc3RvcmUoX19pbnRfdHlwZSBfX2ksCisJICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgbWVtb3J5X29yZGVyIF9fYiA9IF9fbSAmIF9fbWVtb3J5X29yZGVyX21hc2s7CisJX19nbGliY3h4X2Fzc2VydChfX2IgIT0gbWVtb3J5X29yZGVyX2FjcXVpcmUpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYiAhPSBtZW1vcnlfb3JkZXJfY29uc3VtZSk7CisKKwlfX2F0b21pY19zdG9yZV9uKCZfTV9pLCBfX2ksIF9fbSk7CisgICAgICB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIGxvYWQobWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBjb25zdCBub2V4Y2VwdAorICAgICAgeworICAgICAgIG1lbW9yeV9vcmRlciBfX2IgPSBfX20gJiBfX21lbW9yeV9vcmRlcl9tYXNrOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iICE9IG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYiAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisKKwlyZXR1cm4gX19hdG9taWNfbG9hZF9uKCZfTV9pLCBfX20pOworICAgICAgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBsb2FkKG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgY29uc3Qgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgbWVtb3J5X29yZGVyIF9fYiA9IF9fbSAmIF9fbWVtb3J5X29yZGVyX21hc2s7CisJX19nbGliY3h4X2Fzc2VydChfX2IgIT0gbWVtb3J5X29yZGVyX3JlbGVhc2UpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKworCXJldHVybiBfX2F0b21pY19sb2FkX24oJl9NX2ksIF9fbSk7CisgICAgICB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIGV4Y2hhbmdlKF9faW50X3R5cGUgX19pLAorCSAgICAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0CisgICAgICB7CisJcmV0dXJuIF9fYXRvbWljX2V4Y2hhbmdlX24oJl9NX2ksIF9faSwgX19tKTsKKyAgICAgIH0KKworCisgICAgICBfX2ludF90eXBlCisgICAgICBleGNoYW5nZShfX2ludF90eXBlIF9faSwKKwkgICAgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeworCXJldHVybiBfX2F0b21pY19leGNoYW5nZV9uKCZfTV9pLCBfX2ksIF9fbSk7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX2ludF90eXBlJiBfX2kxLCBfX2ludF90eXBlIF9faTIsCisJCQkgICAgbWVtb3J5X29yZGVyIF9fbTEsIG1lbW9yeV9vcmRlciBfX20yKSBub2V4Y2VwdAorICAgICAgeworICAgICAgIG1lbW9yeV9vcmRlciBfX2IyID0gX19tMiAmIF9fbWVtb3J5X29yZGVyX21hc2s7CisgICAgICAgbWVtb3J5X29yZGVyIF9fYjEgPSBfX20xICYgX19tZW1vcnlfb3JkZXJfbWFzazsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYjIgIT0gbWVtb3J5X29yZGVyX3JlbGVhc2UpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iMiAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisJX19nbGliY3h4X2Fzc2VydChfX2IyIDw9IF9fYjEpOworCisJcmV0dXJuIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfbigmX01faSwgJl9faTEsIF9faTIsIDEsIF9fbTEsIF9fbTIpOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoX19pbnRfdHlwZSYgX19pMSwgX19pbnRfdHlwZSBfX2kyLAorCQkJICAgIG1lbW9yeV9vcmRlciBfX20xLAorCQkJICAgIG1lbW9yeV9vcmRlciBfX20yKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeworICAgICAgIG1lbW9yeV9vcmRlciBfX2IyID0gX19tMiAmIF9fbWVtb3J5X29yZGVyX21hc2s7CisgICAgICAgbWVtb3J5X29yZGVyIF9fYjEgPSBfX20xICYgX19tZW1vcnlfb3JkZXJfbWFzazsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYjIgIT0gbWVtb3J5X29yZGVyX3JlbGVhc2UpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iMiAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisJX19nbGliY3h4X2Fzc2VydChfX2IyIDw9IF9fYjEpOworCisJcmV0dXJuIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfbigmX01faSwgJl9faTEsIF9faTIsIDEsIF9fbTEsIF9fbTIpOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoX19pbnRfdHlwZSYgX19pMSwgX19pbnRfdHlwZSBfX2kyLAorCQkJICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsKKwlyZXR1cm4gY29tcGFyZV9leGNoYW5nZV93ZWFrKF9faTEsIF9faTIsIF9fbSwKKwkJCQkgICAgIF9fY21wZXhjaF9mYWlsdXJlX29yZGVyKF9fbSkpOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoX19pbnRfdHlwZSYgX19pMSwgX19pbnRfdHlwZSBfX2kyLAorCQkgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7CisJcmV0dXJuIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX2kxLCBfX2kyLCBfX20sCisJCQkJICAgICBfX2NtcGV4Y2hfZmFpbHVyZV9vcmRlcihfX20pKTsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19pbnRfdHlwZSYgX19pMSwgX19pbnRfdHlwZSBfX2kyLAorCQkJICAgICAgbWVtb3J5X29yZGVyIF9fbTEsIG1lbW9yeV9vcmRlciBfX20yKSBub2V4Y2VwdAorICAgICAgeworICAgICAgICBtZW1vcnlfb3JkZXIgX19iMiA9IF9fbTIgJiBfX21lbW9yeV9vcmRlcl9tYXNrOworICAgICAgICBtZW1vcnlfb3JkZXIgX19iMSA9IF9fbTEgJiBfX21lbW9yeV9vcmRlcl9tYXNrOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iMiAhPSBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisJX19nbGliY3h4X2Fzc2VydChfX2IyICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYjIgPD0gX19iMSk7CisKKwlyZXR1cm4gX19hdG9taWNfY29tcGFyZV9leGNoYW5nZV9uKCZfTV9pLCAmX19pMSwgX19pMiwgMCwgX19tMSwgX19tMik7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9faW50X3R5cGUmIF9faTEsIF9faW50X3R5cGUgX19pMiwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20xLAorCQkJICAgICAgbWVtb3J5X29yZGVyIF9fbTIpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIG1lbW9yeV9vcmRlciBfX2IyID0gX19tMiAmIF9fbWVtb3J5X29yZGVyX21hc2s7CisgICAgICAgIG1lbW9yeV9vcmRlciBfX2IxID0gX19tMSAmIF9fbWVtb3J5X29yZGVyX21hc2s7CisKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYjIgIT0gbWVtb3J5X29yZGVyX3JlbGVhc2UpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iMiAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisJX19nbGliY3h4X2Fzc2VydChfX2IyIDw9IF9fYjEpOworCisJcmV0dXJuIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfbigmX01faSwgJl9faTEsIF9faTIsIDAsIF9fbTEsIF9fbTIpOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX2ludF90eXBlJiBfX2kxLCBfX2ludF90eXBlIF9faTIsCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0CisgICAgICB7CisJcmV0dXJuIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9faTEsIF9faTIsIF9fbSwKKwkJCQkgICAgICAgX19jbXBleGNoX2ZhaWx1cmVfb3JkZXIoX19tKSk7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9faW50X3R5cGUmIF9faTEsIF9faW50X3R5cGUgX19pMiwKKwkJIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsKKwlyZXR1cm4gY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19pMSwgX19pMiwgX19tLAorCQkJCSAgICAgICBfX2NtcGV4Y2hfZmFpbHVyZV9vcmRlcihfX20pKTsKKyAgICAgIH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgZmV0Y2hfYWRkKF9faW50X3R5cGUgX19pLAorCQltZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19mZXRjaF9hZGQoJl9NX2ksIF9faSwgX19tKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBmZXRjaF9hZGQoX19pbnRfdHlwZSBfX2ksCisJCW1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX2ZldGNoX2FkZCgmX01faSwgX19pLCBfX20pOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIGZldGNoX3N1YihfX2ludF90eXBlIF9faSwKKwkJbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfZmV0Y2hfc3ViKCZfTV9pLCBfX2ksIF9fbSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgZmV0Y2hfc3ViKF9faW50X3R5cGUgX19pLAorCQltZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19mZXRjaF9zdWIoJl9NX2ksIF9faSwgX19tKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBmZXRjaF9hbmQoX19pbnRfdHlwZSBfX2ksCisJCW1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX2ZldGNoX2FuZCgmX01faSwgX19pLCBfX20pOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIGZldGNoX2FuZChfX2ludF90eXBlIF9faSwKKwkJbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfZmV0Y2hfYW5kKCZfTV9pLCBfX2ksIF9fbSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgZmV0Y2hfb3IoX19pbnRfdHlwZSBfX2ksCisJICAgICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX2ZldGNoX29yKCZfTV9pLCBfX2ksIF9fbSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgZmV0Y2hfb3IoX19pbnRfdHlwZSBfX2ksCisJICAgICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX2ZldGNoX29yKCZfTV9pLCBfX2ksIF9fbSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgZmV0Y2hfeG9yKF9faW50X3R5cGUgX19pLAorCQltZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19mZXRjaF94b3IoJl9NX2ksIF9faSwgX19tKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBmZXRjaF94b3IoX19pbnRfdHlwZSBfX2ksCisJCW1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX2ZldGNoX3hvcigmX01faSwgX19pLCBfX20pOyB9CisgICAgfTsKKworCisgIC8vLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciBwb2ludGVyIHR5cGVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUFRwPgorICAgIHN0cnVjdCBfX2F0b21pY19iYXNlPF9QVHAqPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfUFRwKiAJX19wb2ludGVyX3R5cGU7CisKKyAgICAgIF9fcG9pbnRlcl90eXBlIAlfTV9wOworCisgICAgICAvLyBGYWN0b3JlZCBvdXQgdG8gZmFjaWxpdGF0ZSBleHBsaWNpdCBzcGVjaWFsaXphdGlvbi4KKyAgICAgIGNvbnN0ZXhwciBwdHJkaWZmX3QKKyAgICAgIF9NX3R5cGVfc2l6ZShwdHJkaWZmX3QgX19kKSB7IHJldHVybiBfX2QgKiBzaXplb2YoX1BUcCk7IH0KKworICAgICAgY29uc3RleHByIHB0cmRpZmZfdAorICAgICAgX01fdHlwZV9zaXplKHB0cmRpZmZfdCBfX2QpIHZvbGF0aWxlIHsgcmV0dXJuIF9fZCAqIHNpemVvZihfUFRwKTsgfQorCisgICAgcHVibGljOgorICAgICAgX19hdG9taWNfYmFzZSgpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAgIH5fX2F0b21pY19iYXNlKCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgX19hdG9taWNfYmFzZShjb25zdCBfX2F0b21pY19iYXNlJikgPSBkZWxldGU7CisgICAgICBfX2F0b21pY19iYXNlJiBvcGVyYXRvcj0oY29uc3QgX19hdG9taWNfYmFzZSYpID0gZGVsZXRlOworICAgICAgX19hdG9taWNfYmFzZSYgb3BlcmF0b3I9KGNvbnN0IF9fYXRvbWljX2Jhc2UmKSB2b2xhdGlsZSA9IGRlbGV0ZTsKKworICAgICAgLy8gUmVxdWlyZXMgX19wb2ludGVyX3R5cGUgY29udmVydGlibGUgdG8gX01fcC4KKyAgICAgIGNvbnN0ZXhwciBfX2F0b21pY19iYXNlKF9fcG9pbnRlcl90eXBlIF9fcCkgbm9leGNlcHQgOiBfTV9wIChfX3ApIHsgfQorCisgICAgICBvcGVyYXRvciBfX3BvaW50ZXJfdHlwZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBsb2FkKCk7IH0KKworICAgICAgb3BlcmF0b3IgX19wb2ludGVyX3R5cGUoKSBjb25zdCB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gbG9hZCgpOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvcj0oX19wb2ludGVyX3R5cGUgX19wKSBub2V4Y2VwdAorICAgICAgeworCXN0b3JlKF9fcCk7CisJcmV0dXJuIF9fcDsKKyAgICAgIH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yPShfX3BvaW50ZXJfdHlwZSBfX3ApIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7CisJc3RvcmUoX19wKTsKKwlyZXR1cm4gX19wOworICAgICAgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3IrKyhpbnQpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBmZXRjaF9hZGQoMSk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yKysoaW50KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gZmV0Y2hfYWRkKDEpOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvci0tKGludCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGZldGNoX3N1YigxKTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3ItLShpbnQpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBmZXRjaF9zdWIoMSk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yKysoKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfYWRkX2ZldGNoKCZfTV9wLCBfTV90eXBlX3NpemUoMSksCisJCQkJICBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yKysoKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfYWRkX2ZldGNoKCZfTV9wLCBfTV90eXBlX3NpemUoMSksCisJCQkJICBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yLS0oKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfc3ViX2ZldGNoKCZfTV9wLCBfTV90eXBlX3NpemUoMSksCisJCQkJICBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yLS0oKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfc3ViX2ZldGNoKCZfTV9wLCBfTV90eXBlX3NpemUoMSksCisJCQkJICBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yKz0ocHRyZGlmZl90IF9fZCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX2FkZF9mZXRjaCgmX01fcCwgX01fdHlwZV9zaXplKF9fZCksCisJCQkJICBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yKz0ocHRyZGlmZl90IF9fZCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX2FkZF9mZXRjaCgmX01fcCwgX01fdHlwZV9zaXplKF9fZCksCisJCQkJICBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yLT0ocHRyZGlmZl90IF9fZCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX3N1Yl9mZXRjaCgmX01fcCwgX01fdHlwZV9zaXplKF9fZCksCisJCQkJICBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yLT0ocHRyZGlmZl90IF9fZCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX3N1Yl9mZXRjaCgmX01fcCwgX01fdHlwZV9zaXplKF9fZCksCisJCQkJICBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICAgICAgYm9vbAorICAgICAgaXNfbG9ja19mcmVlKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX2lzX2xvY2tfZnJlZShzaXplb2YoX19wb2ludGVyX3R5cGUpLCBudWxscHRyKTsgfQorCisgICAgICBib29sCisgICAgICBpc19sb2NrX2ZyZWUoKSBjb25zdCB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfaXNfbG9ja19mcmVlKHNpemVvZihfX3BvaW50ZXJfdHlwZSksIG51bGxwdHIpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN0b3JlKF9fcG9pbnRlcl90eXBlIF9fcCwKKwkgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdAorICAgICAgeworICAgICAgICBtZW1vcnlfb3JkZXIgX19iID0gX19tICYgX19tZW1vcnlfb3JkZXJfbWFzazsKKworCV9fZ2xpYmN4eF9hc3NlcnQoX19iICE9IG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYiAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisJX19nbGliY3h4X2Fzc2VydChfX2IgIT0gbWVtb3J5X29yZGVyX2NvbnN1bWUpOworCisJX19hdG9taWNfc3RvcmVfbigmX01fcCwgX19wLCBfX20pOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzdG9yZShfX3BvaW50ZXJfdHlwZSBfX3AsCisJICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgbWVtb3J5X29yZGVyIF9fYiA9IF9fbSAmIF9fbWVtb3J5X29yZGVyX21hc2s7CisJX19nbGliY3h4X2Fzc2VydChfX2IgIT0gbWVtb3J5X29yZGVyX2FjcXVpcmUpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYiAhPSBtZW1vcnlfb3JkZXJfY29uc3VtZSk7CisKKwlfX2F0b21pY19zdG9yZV9uKCZfTV9wLCBfX3AsIF9fbSk7CisgICAgICB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBsb2FkKG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgbWVtb3J5X29yZGVyIF9fYiA9IF9fbSAmIF9fbWVtb3J5X29yZGVyX21hc2s7CisJX19nbGliY3h4X2Fzc2VydChfX2IgIT0gbWVtb3J5X29yZGVyX3JlbGVhc2UpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKworCXJldHVybiBfX2F0b21pY19sb2FkX24oJl9NX3AsIF9fbSk7CisgICAgICB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBsb2FkKG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgY29uc3Qgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgbWVtb3J5X29yZGVyIF9fYiA9IF9fbSAmIF9fbWVtb3J5X29yZGVyX21hc2s7CisJX19nbGliY3h4X2Fzc2VydChfX2IgIT0gbWVtb3J5X29yZGVyX3JlbGVhc2UpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKworCXJldHVybiBfX2F0b21pY19sb2FkX24oJl9NX3AsIF9fbSk7CisgICAgICB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBleGNoYW5nZShfX3BvaW50ZXJfdHlwZSBfX3AsCisJICAgICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsKKwlyZXR1cm4gX19hdG9taWNfZXhjaGFuZ2VfbigmX01fcCwgX19wLCBfX20pOworICAgICAgfQorCisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBleGNoYW5nZShfX3BvaW50ZXJfdHlwZSBfX3AsCisJICAgICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUgbm9leGNlcHQKKyAgICAgIHsKKwlyZXR1cm4gX19hdG9taWNfZXhjaGFuZ2VfbigmX01fcCwgX19wLCBfX20pOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX3BvaW50ZXJfdHlwZSYgX19wMSwgX19wb2ludGVyX3R5cGUgX19wMiwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20xLAorCQkJICAgICAgbWVtb3J5X29yZGVyIF9fbTIpIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIG1lbW9yeV9vcmRlciBfX2IyID0gX19tMiAmIF9fbWVtb3J5X29yZGVyX21hc2s7CisgICAgICAgIG1lbW9yeV9vcmRlciBfX2IxID0gX19tMSAmIF9fbWVtb3J5X29yZGVyX21hc2s7CisJX19nbGliY3h4X2Fzc2VydChfX2IyICE9IG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYjIgIT0gbWVtb3J5X29yZGVyX2FjcV9yZWwpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iMiA8PSBfX2IxKTsKKworCXJldHVybiBfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX24oJl9NX3AsICZfX3AxLCBfX3AyLCAwLCBfX20xLCBfX20yKTsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19wb2ludGVyX3R5cGUmIF9fcDEsIF9fcG9pbnRlcl90eXBlIF9fcDIsCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tMSwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20yKSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeworICAgICAgICBtZW1vcnlfb3JkZXIgX19iMiA9IF9fbTIgJiBfX21lbW9yeV9vcmRlcl9tYXNrOworICAgICAgICBtZW1vcnlfb3JkZXIgX19iMSA9IF9fbTEgJiBfX21lbW9yeV9vcmRlcl9tYXNrOworCisJX19nbGliY3h4X2Fzc2VydChfX2IyICE9IG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fYjIgIT0gbWVtb3J5X29yZGVyX2FjcV9yZWwpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19iMiA8PSBfX2IxKTsKKworCXJldHVybiBfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX24oJl9NX3AsICZfX3AxLCBfX3AyLCAwLCBfX20xLCBfX20yKTsKKyAgICAgIH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIGZldGNoX2FkZChwdHJkaWZmX3QgX19kLAorCQltZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19mZXRjaF9hZGQoJl9NX3AsIF9NX3R5cGVfc2l6ZShfX2QpLCBfX20pOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBmZXRjaF9hZGQocHRyZGlmZl90IF9fZCwKKwkJbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hdG9taWNfZmV0Y2hfYWRkKCZfTV9wLCBfTV90eXBlX3NpemUoX19kKSwgX19tKTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgZmV0Y2hfc3ViKHB0cmRpZmZfdCBfX2QsCisJCW1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYXRvbWljX2ZldGNoX3N1YigmX01fcCwgX01fdHlwZV9zaXplKF9fZCksIF9fbSk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIGZldGNoX3N1YihwdHJkaWZmX3QgX19kLAorCQltZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2F0b21pY19mZXRjaF9zdWIoJl9NX3AsIF9NX3R5cGVfc2l6ZShfX2QpLCBfX20pOyB9CisgICAgfTsKKworICAvLyBAfSBncm91cCBhdG9taWNzCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2F0b21pY19sb2NrZnJlZV9kZWZpbmVzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYXRvbWljX2xvY2tmcmVlX2RlZmluZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDg5MDdiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2F0b21pY19sb2NrZnJlZV9kZWZpbmVzLmgKQEAgLTAsMCArMSw2MyBAQAorLy8gLSotIEMrKyAtKi0gaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9hdG9taWNfbG9ja2ZyZWVfZGVmaW5lcy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7YXRvbWljfQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQVRPTUlDX0xPQ0tfRlJFRV9ICisjZGVmaW5lIF9HTElCQ1hYX0FUT01JQ19MT0NLX0ZSRUVfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworLyoqCisgKiBAYWRkdG9ncm91cCBhdG9taWNzCisgKiBAeworICovCisKKy8qKgorICogTG9jay1mcmVlIHByb3BlcnR5LgorICoKKyAqIDAgaW5kaWNhdGVzIHRoYXQgdGhlIHR5cGVzIGFyZSBuZXZlciBsb2NrLWZyZWUuCisgKiAxIGluZGljYXRlcyB0aGF0IHRoZSB0eXBlcyBhcmUgc29tZXRpbWVzIGxvY2stZnJlZS4KKyAqIDIgaW5kaWNhdGVzIHRoYXQgdGhlIHR5cGVzIGFyZSBhbHdheXMgbG9jay1mcmVlLgorICovCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjZGVmaW5lIEFUT01JQ19CT09MX0xPQ0tfRlJFRQkJX19HQ0NfQVRPTUlDX0JPT0xfTE9DS19GUkVFCisjZGVmaW5lIEFUT01JQ19DSEFSX0xPQ0tfRlJFRQkJX19HQ0NfQVRPTUlDX0NIQVJfTE9DS19GUkVFCisjZGVmaW5lIEFUT01JQ19XQ0hBUl9UX0xPQ0tfRlJFRQlfX0dDQ19BVE9NSUNfV0NIQVJfVF9MT0NLX0ZSRUUKKyNkZWZpbmUgQVRPTUlDX0NIQVIxNl9UX0xPQ0tfRlJFRQlfX0dDQ19BVE9NSUNfQ0hBUjE2X1RfTE9DS19GUkVFCisjZGVmaW5lIEFUT01JQ19DSEFSMzJfVF9MT0NLX0ZSRUUJX19HQ0NfQVRPTUlDX0NIQVIzMl9UX0xPQ0tfRlJFRQorI2RlZmluZSBBVE9NSUNfU0hPUlRfTE9DS19GUkVFCQlfX0dDQ19BVE9NSUNfU0hPUlRfTE9DS19GUkVFCisjZGVmaW5lIEFUT01JQ19JTlRfTE9DS19GUkVFCQlfX0dDQ19BVE9NSUNfSU5UX0xPQ0tfRlJFRQorI2RlZmluZSBBVE9NSUNfTE9OR19MT0NLX0ZSRUUJCV9fR0NDX0FUT01JQ19MT05HX0xPQ0tfRlJFRQorI2RlZmluZSBBVE9NSUNfTExPTkdfTE9DS19GUkVFCQlfX0dDQ19BVE9NSUNfTExPTkdfTE9DS19GUkVFCisjZGVmaW5lIEFUT01JQ19QT0lOVEVSX0xPQ0tfRlJFRQlfX0dDQ19BVE9NSUNfUE9JTlRFUl9MT0NLX0ZSRUUKKyNlbmRpZgorCisvLyBAfSBncm91cCBhdG9taWNzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2Jhc2ljX2lvcy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2Jhc2ljX2lvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMjU4MDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYmFzaWNfaW9zLmgKQEAgLTAsMCArMSw0NzcgQEAKKy8vIElvc3RyZWFtcyBiYXNlIGNsYXNzZXMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvYmFzaWNfaW9zLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpb3N9CisgKi8KKworI2lmbmRlZiBfQkFTSUNfSU9TX0gKKyNkZWZpbmUgX0JBU0lDX0lPU19IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9sb2NhbGVmd2QuaD4KKyNpbmNsdWRlIDxiaXRzL2xvY2FsZV9jbGFzc2VzLmg+CisjaW5jbHVkZSA8Yml0cy9sb2NhbGVfZmFjZXRzLmg+CisjaW5jbHVkZSA8Yml0cy9zdHJlYW1idWZfaXRlcmF0b3IuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4KKyAgICBpbmxpbmUgY29uc3QgX0ZhY2V0JgorICAgIF9fY2hlY2tfZmFjZXQoY29uc3QgX0ZhY2V0KiBfX2YpCisgICAgeworICAgICAgaWYgKCFfX2YpCisJX190aHJvd19iYWRfY2FzdCgpOworICAgICAgcmV0dXJuICpfX2Y7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFRlbXBsYXRlIGNsYXNzIGJhc2ljX2lvcywgdmlydHVhbCBiYXNlIGNsYXNzIGZvciBhbGwKKyAgICogIHN0cmVhbSBjbGFzc2VzLiAKKyAgICogIEBpbmdyb3VwIGlvCisgICAqCisgICAqICBAdHBhcmFtIF9DaGFyVCAgVHlwZSBvZiBjaGFyYWN0ZXIgc3RyZWFtLgorICAgKiAgQHRwYXJhbSBfVHJhaXRzICBUcmFpdHMgZm9yIGNoYXJhY3RlciB0eXBlLCBkZWZhdWx0cyB0bworICAgKiAgICAgICAgICAgICAgICAgICBjaGFyX3RyYWl0czxfQ2hhclQ+LgorICAgKgorICAgKiAgTW9zdCBvZiB0aGUgbWVtYmVyIGZ1bmN0aW9ucyBjYWxsZWQgZGlzcGF0Y2hlZCBvbiBzdHJlYW0gb2JqZWN0cworICAgKiAgKGUuZy4sIEBjIHN0ZDo6Y291dC5mb28oYmFyKTspIGFyZSBjb25zb2xpZGF0ZWQgaW4gdGhpcyBjbGFzcy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGNsYXNzIGJhc2ljX2lvcyA6IHB1YmxpYyBpb3NfYmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBUaGVzZSBhcmUgc3RhbmRhcmQgdHlwZXMuICBUaGV5IHBlcm1pdCBhIHN0YW5kYXJkaXplZCB3YXkgb2YKKyAgICAgICAqICByZWZlcnJpbmcgdG8gbmFtZXMgb2YgKG9yIG5hbWVzIGRlcGVuZGVudCBvbikgdGhlIHRlbXBsYXRlCisgICAgICAgKiAgcGFyYW1ldGVycywgd2hpY2ggYXJlIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICovCisgICAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgICAgICAgICAgICAgaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvc190eXBlICAgICAgICAgICAgIHBvc190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSAgICAgICAgICAgICBvZmZfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgICAgICAvL0B9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIFRoZXNlIGFyZSBub24tc3RhbmRhcmQgdHlwZXMuCisgICAgICAqLworICAgICAgdHlwZWRlZiBjdHlwZTxfQ2hhclQ+ICAgICAgICAgICAgICAgICAgICAgICAgICBfX2N0eXBlX3R5cGU7CisgICAgICB0eXBlZGVmIG51bV9wdXQ8X0NoYXJULCBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4gPgorCQkJCQkJICAgICBfX251bV9wdXRfdHlwZTsKKyAgICAgIHR5cGVkZWYgbnVtX2dldDxfQ2hhclQsIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiA+CisJCQkJCQkgICAgIF9fbnVtX2dldF90eXBlOworICAgICAgLy9AfQorCisgICAgICAvLyBEYXRhIG1lbWJlcnM6CisgICAgcHJvdGVjdGVkOgorICAgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KiAgICAgICAgICAgICAgICBfTV90aWU7CisgICAgICBtdXRhYmxlIGNoYXJfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2ZpbGw7CisgICAgICBtdXRhYmxlIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2ZpbGxfaW5pdDsKKyAgICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiAgICAgICAgICAgICAgX01fc3RyZWFtYnVmOworCisgICAgICAvLyBDYWNoZWQgdXNlX2ZhY2V0PGN0eXBlPiwgd2hpY2ggaXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlIGluZm8uCisgICAgICBjb25zdCBfX2N0eXBlX3R5cGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2N0eXBlOworICAgICAgLy8gRm9yIG9zdHJlYW0uCisgICAgICBjb25zdCBfX251bV9wdXRfdHlwZSogICAgICAgICAgICAgICAgICAgICAgICAgIF9NX251bV9wdXQ7CisgICAgICAvLyBGb3IgaXN0cmVhbS4KKyAgICAgIGNvbnN0IF9fbnVtX2dldF90eXBlKiAgICAgICAgICAgICAgICAgICAgICAgICAgX01fbnVtX2dldDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGhlIHF1aWNrLWFuZC1lYXN5IHN0YXR1cyBjaGVjay4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBhbGxvd3MgeW91IHRvIHdyaXRlIGNvbnN0cnVjdHMgc3VjaCBhcworICAgICAgICogIDxjb2RlPmlmICghYV9zdHJlYW0pIC4uLjwvY29kZT4gYW5kIDxjb2RlPndoaWxlIChhX3N0cmVhbSkgLi4uPC9jb2RlPgorICAgICAgKi8KKyAgICAgIG9wZXJhdG9yIHZvaWQqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmZhaWwoKSA/IDAgOiBjb25zdF9jYXN0PGJhc2ljX2lvcyo+KHRoaXMpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yISgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5mYWlsKCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm5zIHRoZSBlcnJvciBzdGF0ZSBvZiB0aGUgc3RyZWFtIGJ1ZmZlci4KKyAgICAgICAqICBAcmV0dXJuICBBIGJpdCBwYXR0ZXJuICh3ZWxsLCBpc24ndCBldmVyeXRoaW5nPykKKyAgICAgICAqCisgICAgICAgKiAgU2VlIHN0ZDo6aW9zX2Jhc2U6Omlvc3RhdGUgZm9yIHRoZSBwb3NzaWJsZSBiaXQgdmFsdWVzLiAgTW9zdAorICAgICAgICogIHVzZXJzIHdpbGwgY2FsbCBvbmUgb2YgdGhlIGludGVycHJldGluZyB3cmFwcGVycywgZS5nLiwgZ29vZCgpLgorICAgICAgKi8KKyAgICAgIGlvc3RhdGUKKyAgICAgIHJkc3RhdGUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fc3RyZWFtYnVmX3N0YXRlOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgW1JlXXNldHMgdGhlIGVycm9yIHN0YXRlLgorICAgICAgICogIEBwYXJhbSAgX19zdGF0ZSAgVGhlIG5ldyBzdGF0ZSBmbGFnKHMpIHRvIHNldC4KKyAgICAgICAqCisgICAgICAgKiAgU2VlIHN0ZDo6aW9zX2Jhc2U6Omlvc3RhdGUgZm9yIHRoZSBwb3NzaWJsZSBiaXQgdmFsdWVzLiAgTW9zdAorICAgICAgICogIHVzZXJzIHdpbGwgbm90IG5lZWQgdG8gcGFzcyBhbiBhcmd1bWVudC4KKyAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbGVhcihpb3N0YXRlIF9fc3RhdGUgPSBnb29kYml0KTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXRzIGFkZGl0aW9uYWwgZmxhZ3MgaW4gdGhlIGVycm9yIHN0YXRlLgorICAgICAgICogIEBwYXJhbSAgX19zdGF0ZSAgVGhlIGFkZGl0aW9uYWwgc3RhdGUgZmxhZyhzKSB0byBzZXQuCisgICAgICAgKgorICAgICAgICogIFNlZSBzdGQ6Omlvc19iYXNlOjppb3N0YXRlIGZvciB0aGUgcG9zc2libGUgYml0IHZhbHVlcy4KKyAgICAgICovCisgICAgICB2b2lkCisgICAgICBzZXRzdGF0ZShpb3N0YXRlIF9fc3RhdGUpCisgICAgICB7IHRoaXMtPmNsZWFyKHRoaXMtPnJkc3RhdGUoKSB8IF9fc3RhdGUpOyB9CisKKyAgICAgIC8vIEZsaXAgdGhlIGludGVybmFsIHN0YXRlIG9uIGZvciB0aGUgcHJvcGVyIHN0YXRlIGJpdHMsIHRoZW4gcmUKKyAgICAgIC8vIHRocm93cyB0aGUgcHJvcGFnYXRlZCBleGNlcHRpb24gaWYgYml0IGFsc28gc2V0IGluCisgICAgICAvLyBleGNlcHRpb25zKCkuCisgICAgICB2b2lkCisgICAgICBfTV9zZXRzdGF0ZShpb3N0YXRlIF9fc3RhdGUpCisgICAgICB7CisJLy8gMjcuNi4xLjIuMSBDb21tb24gcmVxdWlyZW1lbnRzLgorCS8vIFR1cm4gdGhpcyBvbiB3aXRob3V0IGNhdXNpbmcgYW4gaW9zOjpmYWlsdXJlIHRvIGJlIHRocm93bi4KKwlfTV9zdHJlYW1idWZfc3RhdGUgfD0gX19zdGF0ZTsKKwlpZiAodGhpcy0+ZXhjZXB0aW9ucygpICYgX19zdGF0ZSkKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZhc3QgZXJyb3IgY2hlY2tpbmcuCisgICAgICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBubyBlcnJvciBmbGFncyBhcmUgc2V0LgorICAgICAgICoKKyAgICAgICAqICBBIHdyYXBwZXIgYXJvdW5kIHJkc3RhdGUuCisgICAgICAqLworICAgICAgYm9vbAorICAgICAgZ29vZCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5yZHN0YXRlKCkgPT0gMDsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZhc3QgZXJyb3IgY2hlY2tpbmcuCisgICAgICAgKiAgQHJldHVybiAgVHJ1ZSBpZiB0aGUgZW9mYml0IGlzIHNldC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IG90aGVyIGlvc3RhdGUgZmxhZ3MgbWF5IGFsc28gYmUgc2V0LgorICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGVvZigpIGNvbnN0CisgICAgICB7IHJldHVybiAodGhpcy0+cmRzdGF0ZSgpICYgZW9mYml0KSAhPSAwOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmFzdCBlcnJvciBjaGVja2luZy4KKyAgICAgICAqICBAcmV0dXJuICBUcnVlIGlmIGVpdGhlciB0aGUgYmFkYml0IG9yIHRoZSBmYWlsYml0IGlzIHNldC4KKyAgICAgICAqCisgICAgICAgKiAgQ2hlY2tpbmcgdGhlIGJhZGJpdCBpbiBmYWlsKCkgaXMgaGlzdG9yaWNhbCBwcmFjdGljZS4KKyAgICAgICAqICBOb3RlIHRoYXQgb3RoZXIgaW9zdGF0ZSBmbGFncyBtYXkgYWxzbyBiZSBzZXQuCisgICAgICAqLworICAgICAgYm9vbAorICAgICAgZmFpbCgpIGNvbnN0CisgICAgICB7IHJldHVybiAodGhpcy0+cmRzdGF0ZSgpICYgKGJhZGJpdCB8IGZhaWxiaXQpKSAhPSAwOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmFzdCBlcnJvciBjaGVja2luZy4KKyAgICAgICAqICBAcmV0dXJuICBUcnVlIGlmIHRoZSBiYWRiaXQgaXMgc2V0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgb3RoZXIgaW9zdGF0ZSBmbGFncyBtYXkgYWxzbyBiZSBzZXQuCisgICAgICAqLworICAgICAgYm9vbAorICAgICAgYmFkKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICh0aGlzLT5yZHN0YXRlKCkgJiBiYWRiaXQpICE9IDA7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUaHJvd2luZyBleGNlcHRpb25zIG9uIGVycm9ycy4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY3VycmVudCBleGNlcHRpb25zIG1hc2suCisgICAgICAgKgorICAgICAgICogIFRoaXMgY2hhbmdlcyBub3RoaW5nIGluIHRoZSBzdHJlYW0uICBTZWUgdGhlIG9uZS1hcmd1bWVudCB2ZXJzaW9uCisgICAgICAgKiAgb2YgZXhjZXB0aW9ucyhpb3N0YXRlKSBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlIHJldHVybiB2YWx1ZS4KKyAgICAgICovCisgICAgICBpb3N0YXRlCisgICAgICBleGNlcHRpb25zKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2V4Y2VwdGlvbjsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRocm93aW5nIGV4Y2VwdGlvbnMgb24gZXJyb3JzLgorICAgICAgICogIEBwYXJhbSAgX19leGNlcHQgIFRoZSBuZXcgZXhjZXB0aW9ucyBtYXNrLgorICAgICAgICoKKyAgICAgICAqICBCeSBkZWZhdWx0LCBlcnJvciBmbGFncyBhcmUgc2V0IHNpbGVudGx5LiAgWW91IGNhbiBzZXQgYW4KKyAgICAgICAqICBleGNlcHRpb25zIG1hc2sgZm9yIGVhY2ggc3RyZWFtOyBpZiBhIGJpdCBpbiB0aGUgbWFzayBiZWNvbWVzIHNldAorICAgICAgICogIGluIHRoZSBlcnJvciBmbGFncywgdGhlbiBhbiBleGNlcHRpb24gb2YgdHlwZQorICAgICAgICogIHN0ZDo6aW9zX2Jhc2U6OmZhaWx1cmUgaXMgdGhyb3duLgorICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgZXJyb3IgZmxhZyBpcyBhbHJlYWR5IHNldCB3aGVuIHRoZSBleGNlcHRpb25zIG1hc2sgaXMKKyAgICAgICAqICBhZGRlZCwgdGhlIGV4Y2VwdGlvbiBpcyBpbW1lZGlhdGVseSB0aHJvd24uICBUcnkgcnVubmluZyB0aGUKKyAgICAgICAqICBmb2xsb3dpbmcgdW5kZXIgR0NDIDMuMSBvciBsYXRlcjoKKyAgICAgICAqICBAY29kZQorICAgICAgICogICNpbmNsdWRlIDxpb3N0cmVhbT4KKyAgICAgICAqICAjaW5jbHVkZSA8ZnN0cmVhbT4KKyAgICAgICAqICAjaW5jbHVkZSA8ZXhjZXB0aW9uPgorICAgICAgICoKKyAgICAgICAqICBpbnQgbWFpbigpCisgICAgICAgKiAgeworICAgICAgICogICAgICBzdGQ6OnNldF90ZXJtaW5hdGUgKF9fZ251X2N4eDo6X192ZXJib3NlX3Rlcm1pbmF0ZV9oYW5kbGVyKTsKKyAgICAgICAqCisgICAgICAgKiAgICAgIHN0ZDo6aWZzdHJlYW0gZiAoIi9ldGMvbW90ZCIpOworICAgICAgICoKKyAgICAgICAqICAgICAgc3RkOjpjZXJyIDw8ICJTZXR0aW5nIGJhZGJpdFxuIjsKKyAgICAgICAqICAgICAgZi5zZXRzdGF0ZSAoc3RkOjppb3NfYmFzZTo6YmFkYml0KTsKKyAgICAgICAqCisgICAgICAgKiAgICAgIHN0ZDo6Y2VyciA8PCAiU2V0dGluZyBleGNlcHRpb24gbWFza1xuIjsKKyAgICAgICAqICAgICAgZi5leGNlcHRpb25zIChzdGQ6Omlvc19iYXNlOjpiYWRiaXQpOworICAgICAgICogIH0KKyAgICAgICAqICBAZW5kY29kZQorICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGV4Y2VwdGlvbnMoaW9zdGF0ZSBfX2V4Y2VwdCkKKyAgICAgIHsKKyAgICAgICAgX01fZXhjZXB0aW9uID0gX19leGNlcHQ7CisgICAgICAgIHRoaXMtPmNsZWFyKF9NX3N0cmVhbWJ1Zl9zdGF0ZSk7CisgICAgICB9CisKKyAgICAgIC8vIENvbnN0cnVjdG9yL2Rlc3RydWN0b3I6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdG9yIHBlcmZvcm1zIGluaXRpYWxpemF0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGUgcGFyYW1ldGVyIGlzIHBhc3NlZCBieSBkZXJpdmVkIHN0cmVhbXMuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX2lvcyhiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19zYikKKyAgICAgIDogaW9zX2Jhc2UoKSwgX01fdGllKDApLCBfTV9maWxsKCksIF9NX2ZpbGxfaW5pdChmYWxzZSksIF9NX3N0cmVhbWJ1ZigwKSwKKwlfTV9jdHlwZSgwKSwgX01fbnVtX3B1dCgwKSwgX01fbnVtX2dldCgwKQorICAgICAgeyB0aGlzLT5pbml0KF9fc2IpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRW1wdHkuCisgICAgICAgKgorICAgICAgICogIFRoZSBkZXN0cnVjdG9yIGRvZXMgbm90aGluZy4gIE1vcmUgc3BlY2lmaWNhbGx5LCBpdCBkb2VzIG5vdAorICAgICAgICogIGRlc3Ryb3kgdGhlIHN0cmVhbWJ1ZiBoZWxkIGJ5IHJkYnVmKCkuCisgICAgICAqLworICAgICAgdmlydHVhbAorICAgICAgfmJhc2ljX2lvcygpIHsgfQorCisgICAgICAvLyBNZW1iZXJzOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGZXRjaGVzIHRoZSBjdXJyZW50IEBlIHRpZWQgc3RyZWFtLgorICAgICAgICogIEByZXR1cm4gIEEgcG9pbnRlciB0byB0aGUgdGllZCBzdHJlYW0sIG9yIE5VTEwgaWYgdGhlIHN0cmVhbSBpcworICAgICAgICogICAgICAgICAgIG5vdCB0aWVkLgorICAgICAgICoKKyAgICAgICAqICBBIHN0cmVhbSBtYXkgYmUgQGUgdGllZCAob3Igc3luY2hyb25pemVkKSB0byBhIHNlY29uZCBvdXRwdXQKKyAgICAgICAqICBzdHJlYW0uICBXaGVuIHRoaXMgc3RyZWFtIHBlcmZvcm1zIGFueSBJL08sIHRoZSB0aWVkIHN0cmVhbSBpcworICAgICAgICogIGZpcnN0IGZsdXNoZWQuICBGb3IgZXhhbXBsZSwgQGMgc3RkOjpjaW4gaXMgdGllZCB0byBAYyBzdGQ6OmNvdXQuCisgICAgICAqLworICAgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KgorICAgICAgdGllKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3RpZTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRpZXMgdGhpcyBzdHJlYW0gdG8gYW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqICBAcGFyYW0gIF9fdGllc3RyICBUaGUgb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgcHJldmlvdXNseSB0aWVkIG91dHB1dCBzdHJlYW0sIG9yIE5VTEwgaWYgdGhlIHN0cmVhbQorICAgICAgICogICAgICAgICAgIHdhcyBub3QgdGllZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBzZXRzIHVwIGEgbmV3IHRpZTsgc2VlIHRpZSgpIGZvciBtb3JlLgorICAgICAgKi8KKyAgICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPioKKyAgICAgIHRpZShiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qIF9fdGllc3RyKQorICAgICAgeworICAgICAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qIF9fb2xkID0gX01fdGllOworICAgICAgICBfTV90aWUgPSBfX3RpZXN0cjsKKyAgICAgICAgcmV0dXJuIF9fb2xkOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFjY2Vzc2luZyB0aGUgdW5kZXJseWluZyBidWZmZXIuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGN1cnJlbnQgc3RyZWFtIGJ1ZmZlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBkb2VzIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBzdHJlYW0uCisgICAgICAqLworICAgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qCisgICAgICByZGJ1ZigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9zdHJlYW1idWY7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDaGFuZ2luZyB0aGUgdW5kZXJseWluZyBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICBfX3NiICBUaGUgbmV3IHN0cmVhbSBidWZmZXIuCisgICAgICAgKiAgQHJldHVybiAgVGhlIHByZXZpb3VzIHN0cmVhbSBidWZmZXIuCisgICAgICAgKgorICAgICAgICogIEFzc29jaWF0ZXMgYSBuZXcgYnVmZmVyIHdpdGggdGhlIGN1cnJlbnQgc3RyZWFtLCBhbmQgY2xlYXJzIHRoZQorICAgICAgICogIGVycm9yIHN0YXRlLgorICAgICAgICoKKyAgICAgICAqICBEdWUgdG8gaGlzdG9yaWNhbCBhY2NpZGVudHMgd2hpY2ggdGhlIExXRyByZWZ1c2VzIHRvIGNvcnJlY3QsIHRoZQorICAgICAgICogIEkvTyBsaWJyYXJ5IHN1ZmZlcnMgZnJvbSBhIGRlc2lnbiBlcnJvcjogIHRoaXMgZnVuY3Rpb24gaXMgaGlkZGVuCisgICAgICAgKiAgaW4gZGVyaXZlZCBjbGFzc2VzIGJ5IG92ZXJyaWRlcyBvZiB0aGUgemVyby1hcmd1bWVudCBAYyByZGJ1ZigpLAorICAgICAgICogIHdoaWNoIGlzIG5vbi12aXJ0dWFsIGZvciBoeXN0ZXJpY2FsIHJhaXNpbnMuICBBcyBhIHJlc3VsdCwgeW91CisgICAgICAgKiAgbXVzdCB1c2UgZXhwbGljaXQgcXVhbGlmaWNhdGlvbnMgdG8gYWNjZXNzIHRoaXMgZnVuY3Rpb24gdmlhIGFueQorICAgICAgICogIGRlcml2ZWQgY2xhc3MuICBGb3IgZXhhbXBsZToKKyAgICAgICAqCisgICAgICAgKiAgQGNvZGUKKyAgICAgICAqICBzdGQ6OmZzdHJlYW0gICAgIGZvbzsgICAgICAgICAvLyBvciBzb21lIG90aGVyIGRlcml2ZWQgdHlwZQorICAgICAgICogIHN0ZDo6c3RyZWFtYnVmKiAgcCA9IC4uLi4uOworICAgICAgICoKKyAgICAgICAqICBmb28uaW9zOjpyZGJ1ZihwKTsgICAgICAgICAgICAvLyBpb3MgPT0gYmFzaWNfaW9zPGNoYXI+CisgICAgICAgKiAgQGVuZGNvZGUKKyAgICAgICovCisgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPioKKyAgICAgIHJkYnVmKGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3NiKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb3BpZXMgZmllbGRzIG9mIF9fcmhzIGludG8gdGhpcy4KKyAgICAgICAqICBAcGFyYW0gIF9fcmhzICBUaGUgc291cmNlIHZhbHVlcyBmb3IgdGhlIGNvcGllcy4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIEFsbCBmaWVsZHMgb2YgX19yaHMgYXJlIGNvcGllZCBpbnRvIHRoaXMgb2JqZWN0IGV4Y2VwdCB0aGF0IHJkYnVmKCkKKyAgICAgICAqICBhbmQgcmRzdGF0ZSgpIHJlbWFpbiB1bmNoYW5nZWQuICBBbGwgdmFsdWVzIGluIHRoZSBwd29yZCBhbmQgaXdvcmQKKyAgICAgICAqICBhcnJheXMgYXJlIGNvcGllZC4gIEJlZm9yZSBjb3B5aW5nLCBlYWNoIGNhbGxiYWNrIGlzIGludm9rZWQgd2l0aAorICAgICAgICogIGVyYXNlX2V2ZW50LiAgQWZ0ZXIgY29weWluZywgZWFjaCAobmV3KSBjYWxsYmFjayBpcyBpbnZva2VkIHdpdGgKKyAgICAgICAqICBjb3B5Zm10X2V2ZW50LiAgVGhlIGZpbmFsIHN0ZXAgaXMgdG8gY29weSBleGNlcHRpb25zKCkuCisgICAgICAqLworICAgICAgYmFzaWNfaW9zJgorICAgICAgY29weWZtdChjb25zdCBiYXNpY19pb3MmIF9fcmhzKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXRyaWV2ZXMgdGhlIEBhIGVtcHR5IGNoYXJhY3Rlci4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY3VycmVudCBmaWxsIGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgSXQgZGVmYXVsdHMgdG8gYSBzcGFjZSAoJyAnKSBpbiB0aGUgY3VycmVudCBsb2NhbGUuCisgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICBmaWxsKCkgY29uc3QKKyAgICAgIHsKKwlpZiAoIV9NX2ZpbGxfaW5pdCkKKwkgIHsKKwkgICAgX01fZmlsbCA9IHRoaXMtPndpZGVuKCcgJyk7CisJICAgIF9NX2ZpbGxfaW5pdCA9IHRydWU7CisJICB9CisJcmV0dXJuIF9NX2ZpbGw7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0cyBhIG5ldyBAYSBlbXB0eSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtICBfX2NoICBUaGUgbmV3IGNoYXJhY3Rlci4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgcHJldmlvdXMgZmlsbCBjaGFyYWN0ZXIuCisgICAgICAgKgorICAgICAgICogIFRoZSBmaWxsIGNoYXJhY3RlciBpcyB1c2VkIHRvIGZpbGwgb3V0IHNwYWNlIHdoZW4gUCsgY2hhcmFjdGVycworICAgICAgICogIGhhdmUgYmVlbiByZXF1ZXN0ZWQgKGUuZy4sIHZpYSBzZXR3KSwgUSBjaGFyYWN0ZXJzIGFyZSBhY3R1YWxseQorICAgICAgICogIHVzZWQsIGFuZCBRPFAuICBJdCBkZWZhdWx0cyB0byBhIHNwYWNlICgnICcpIGluIHRoZSBjdXJyZW50IGxvY2FsZS4KKyAgICAgICovCisgICAgICBjaGFyX3R5cGUKKyAgICAgIGZpbGwoY2hhcl90eXBlIF9fY2gpCisgICAgICB7CisJY2hhcl90eXBlIF9fb2xkID0gdGhpcy0+ZmlsbCgpOworCV9NX2ZpbGwgPSBfX2NoOworCXJldHVybiBfX29sZDsKKyAgICAgIH0KKworICAgICAgLy8gTG9jYWxlczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTW92ZXMgdG8gYSBuZXcgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSAgX19sb2MgIFRoZSBuZXcgbG9jYWxlLgorICAgICAgICogIEByZXR1cm4gIFRoZSBwcmV2aW91cyBsb2NhbGUuCisgICAgICAgKgorICAgICAgICogIENhbGxzIEBjIGlvc19iYXNlOjppbWJ1ZShsb2MpLCBhbmQgaWYgYSBzdHJlYW0gYnVmZmVyIGlzIGFzc29jaWF0ZWQKKyAgICAgICAqICB3aXRoIHRoaXMgc3RyZWFtLCBjYWxscyB0aGF0IGJ1ZmZlcidzIEBjIHB1YmltYnVlKGxvYykuCisgICAgICAgKgorICAgICAgICogIEFkZGl0aW9uYWwgbDEwbiBub3RlcyBhcmUgYXQKKyAgICAgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2xvY2FsaXphdGlvbi5odG1sCisgICAgICAqLworICAgICAgbG9jYWxlCisgICAgICBpbWJ1ZShjb25zdCBsb2NhbGUmIF9fbG9jKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTcXVlZXplcyBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSAgX19jICBUaGUgY2hhcmFjdGVyIHRvIG5hcnJvdy4KKyAgICAgICAqICBAcGFyYW0gIF9fZGZhdWx0ICBUaGUgY2hhcmFjdGVyIHRvIG5hcnJvdy4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgbmFycm93ZWQgY2hhcmFjdGVyLgorICAgICAgICoKKyAgICAgICAqICBNYXBzIGEgY2hhcmFjdGVyIG9mIEBjIGNoYXJfdHlwZSB0byBhIGNoYXJhY3RlciBvZiBAYyBjaGFyLAorICAgICAgICogIGlmIHBvc3NpYmxlLgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIHRoZSByZXN1bHQgb2YKKyAgICAgICAqICBAY29kZQorICAgICAgICogICAgc3RkOjp1c2VfZmFjZXQ8Y3R5cGU8Y2hhcl90eXBlPiA+KGdldGxvYygpKS5uYXJyb3coYyxkZmF1bHQpCisgICAgICAgKiAgQGVuZGNvZGUKKyAgICAgICAqCisgICAgICAgKiAgQWRkaXRpb25hbCBsMTBuIG5vdGVzIGFyZSBhdAorICAgICAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvbG9jYWxpemF0aW9uLmh0bWwKKyAgICAgICovCisgICAgICBjaGFyCisgICAgICBuYXJyb3coY2hhcl90eXBlIF9fYywgY2hhciBfX2RmYXVsdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fY2hlY2tfZmFjZXQoX01fY3R5cGUpLm5hcnJvdyhfX2MsIF9fZGZhdWx0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFdpZGVucyBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSAgX19jICBUaGUgY2hhcmFjdGVyIHRvIHdpZGVuLgorICAgICAgICogIEByZXR1cm4gIFRoZSB3aWRlbmVkIGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgTWFwcyBhIGNoYXJhY3RlciBvZiBAYyBjaGFyIHRvIGEgY2hhcmFjdGVyIG9mIEBjIGNoYXJfdHlwZS4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyB0aGUgcmVzdWx0IG9mCisgICAgICAgKiAgQGNvZGUKKyAgICAgICAqICAgIHN0ZDo6dXNlX2ZhY2V0PGN0eXBlPGNoYXJfdHlwZT4gPihnZXRsb2MoKSkud2lkZW4oYykKKyAgICAgICAqICBAZW5kY29kZQorICAgICAgICoKKyAgICAgICAqICBBZGRpdGlvbmFsIGwxMG4gbm90ZXMgYXJlIGF0CisgICAgICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9sb2NhbGl6YXRpb24uaHRtbAorICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZQorICAgICAgd2lkZW4oY2hhciBfX2MpIGNvbnN0CisgICAgICB7IHJldHVybiBfX2NoZWNrX2ZhY2V0KF9NX2N0eXBlKS53aWRlbihfX2MpOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLyAyNy40LjUuMSAgYmFzaWNfaW9zIGNvbnN0cnVjdG9ycworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBFbXB0eS4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgZG9lcyBub3RoaW5nIGFuZCBpcyBub3Qgbm9ybWFsbHkKKyAgICAgICAqICBhY2Nlc3NpYmxlIHRvIHVzZXJzLgorICAgICAgKi8KKyAgICAgIGJhc2ljX2lvcygpCisgICAgICA6IGlvc19iYXNlKCksIF9NX3RpZSgwKSwgX01fZmlsbChjaGFyX3R5cGUoKSksIF9NX2ZpbGxfaW5pdChmYWxzZSksIAorCV9NX3N0cmVhbWJ1ZigwKSwgX01fY3R5cGUoMCksIF9NX251bV9wdXQoMCksIF9NX251bV9nZXQoMCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFsbCBzZXR1cCBpcyBwZXJmb3JtZWQgaGVyZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgcHVibGljIGNvbnN0cnVjdG9yLiAgSXQgaXMgbm90IHZpcnR1YWwgYW5kCisgICAgICAgKiAgY2Fubm90IGJlIHJlZGVmaW5lZC4KKyAgICAgICovCisgICAgICB2b2lkCisgICAgICBpbml0KGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3NiKTsKKworICAgICAgdm9pZAorICAgICAgX01fY2FjaGVfbG9jYWxlKGNvbnN0IGxvY2FsZSYgX19sb2MpOworICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2luY2x1ZGUgPGJpdHMvYmFzaWNfaW9zLnRjYz4KKworI2VuZGlmIC8qIF9CQVNJQ19JT1NfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2Jhc2ljX2lvcy50Y2MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYmFzaWNfaW9zLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDQ1YTY1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2Jhc2ljX2lvcy50Y2MKQEAgLTAsMCArMSwxODggQEAKKy8vIGJhc2ljX2lvcyBtZW1iZXIgZnVuY3Rpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5OS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2Jhc2ljX2lvcy50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpb3N9CisgKi8KKworI2lmbmRlZiBfQkFTSUNfSU9TX1RDQworI2RlZmluZSBfQkFTSUNfSU9TX1RDQyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB2b2lkCisgICAgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46OmNsZWFyKGlvc3RhdGUgX19zdGF0ZSkKKyAgICB7CisgICAgICBpZiAodGhpcy0+cmRidWYoKSkKKwlfTV9zdHJlYW1idWZfc3RhdGUgPSBfX3N0YXRlOworICAgICAgZWxzZQorCSAgX01fc3RyZWFtYnVmX3N0YXRlID0gX19zdGF0ZSB8IGJhZGJpdDsKKyAgICAgIGlmICh0aGlzLT5leGNlcHRpb25zKCkgJiB0aGlzLT5yZHN0YXRlKCkpCisJX190aHJvd19pb3NfZmFpbHVyZShfX04oImJhc2ljX2lvczo6Y2xlYXIiKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPioKKyAgICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6cmRidWYoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc2IpCisgICAgeworICAgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fb2xkID0gX01fc3RyZWFtYnVmOworICAgICAgX01fc3RyZWFtYnVmID0gX19zYjsKKyAgICAgIHRoaXMtPmNsZWFyKCk7CisgICAgICByZXR1cm4gX19vbGQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6Y29weWZtdChjb25zdCBiYXNpY19pb3MmIF9fcmhzKQorICAgIHsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDI5Mi4gZWZmZWN0cyBvZiBhLmNvcHlmbXQgKGEpCisgICAgICBpZiAodGhpcyAhPSAmX19yaHMpCisJeworCSAgLy8gUGVyIDI3LjEuMSwgZG8gbm90IGNhbGwgaW1idWUsIHlldCBtdXN0IHRyYXNoIGFsbCBjYWNoZXMKKwkgIC8vIGFzc29jaWF0ZWQgd2l0aCBpbWJ1ZSgpCisKKwkgIC8vIEFsbG9jIGFueSBuZXcgd29yZCBhcnJheSBmaXJzdCwgc28gaWYgaXQgZmFpbHMgd2UgaGF2ZSAicm9sbGJhY2siLgorCSAgX1dvcmRzKiBfX3dvcmRzID0gKF9fcmhzLl9NX3dvcmRfc2l6ZSA8PSBfU19sb2NhbF93b3JkX3NpemUpID8KKwkgICAgICAgICAgICAgICAgICAgICBfTV9sb2NhbF93b3JkIDogbmV3IF9Xb3Jkc1tfX3Jocy5fTV93b3JkX3NpemVdOworCisJICAvLyBCdW1wIHJlZnMgYmVmb3JlIGRvaW5nIGNhbGxiYWNrcywgZm9yIHNhZmV0eS4KKwkgIF9DYWxsYmFja19saXN0KiBfX2NiID0gX19yaHMuX01fY2FsbGJhY2tzOworCSAgaWYgKF9fY2IpCisJICAgIF9fY2ItPl9NX2FkZF9yZWZlcmVuY2UoKTsKKwkgIF9NX2NhbGxfY2FsbGJhY2tzKGVyYXNlX2V2ZW50KTsKKwkgIGlmIChfTV93b3JkICE9IF9NX2xvY2FsX3dvcmQpCisJICAgIHsKKwkgICAgICBkZWxldGUgW10gX01fd29yZDsKKwkgICAgICBfTV93b3JkID0gMDsKKwkgICAgfQorCSAgX01fZGlzcG9zZV9jYWxsYmFja3MoKTsKKworCSAgLy8gTkI6IERvbid0IHdhbnQgYW55IGFkZGVkIGR1cmluZyBhYm92ZS4KKwkgIF9NX2NhbGxiYWNrcyA9IF9fY2I7CisJICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBfX3Jocy5fTV93b3JkX3NpemU7ICsrX19pKQorCSAgICBfX3dvcmRzW19faV0gPSBfX3Jocy5fTV93b3JkW19faV07CisJICBfTV93b3JkID0gX193b3JkczsKKwkgIF9NX3dvcmRfc2l6ZSA9IF9fcmhzLl9NX3dvcmRfc2l6ZTsKKworCSAgdGhpcy0+ZmxhZ3MoX19yaHMuZmxhZ3MoKSk7CisJICB0aGlzLT53aWR0aChfX3Jocy53aWR0aCgpKTsKKwkgIHRoaXMtPnByZWNpc2lvbihfX3Jocy5wcmVjaXNpb24oKSk7CisJICB0aGlzLT50aWUoX19yaHMudGllKCkpOworCSAgdGhpcy0+ZmlsbChfX3Jocy5maWxsKCkpOworCSAgX01faW9zX2xvY2FsZSA9IF9fcmhzLmdldGxvYygpOworCSAgX01fY2FjaGVfbG9jYWxlKF9NX2lvc19sb2NhbGUpOworCisJICBfTV9jYWxsX2NhbGxiYWNrcyhjb3B5Zm10X2V2ZW50KTsKKworCSAgLy8gVGhlIG5leHQgaXMgcmVxdWlyZWQgdG8gYmUgdGhlIGxhc3QgYXNzaWdubWVudC4KKwkgIHRoaXMtPmV4Y2VwdGlvbnMoX19yaHMuZXhjZXB0aW9ucygpKTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIC8vIExvY2FsZXM6CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBsb2NhbGUKKyAgICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6aW1idWUoY29uc3QgbG9jYWxlJiBfX2xvYykKKyAgICB7CisgICAgICBsb2NhbGUgX19vbGQodGhpcy0+Z2V0bG9jKCkpOworICAgICAgaW9zX2Jhc2U6OmltYnVlKF9fbG9jKTsKKyAgICAgIF9NX2NhY2hlX2xvY2FsZShfX2xvYyk7CisgICAgICBpZiAodGhpcy0+cmRidWYoKSAhPSAwKQorCXRoaXMtPnJkYnVmKCktPnB1YmltYnVlKF9fbG9jKTsKKyAgICAgIHJldHVybiBfX29sZDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHZvaWQKKyAgICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6aW5pdChiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19zYikKKyAgICB7CisgICAgICAvLyBOQjogVGhpcyBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIG9iamVjdC4KKyAgICAgIGlvc19iYXNlOjpfTV9pbml0KCk7CisKKyAgICAgIC8vIENhY2hlIGxvY2FsZSBkYXRhIGFuZCBzcGVjaWZpYyBmYWNldHMgdXNlZCBieSBpb3N0cmVhbXMuCisgICAgICBfTV9jYWNoZV9sb2NhbGUoX01faW9zX2xvY2FsZSk7CisKKyAgICAgIC8vIE5COiBUaGUgMjcuNC40LjEgUG9zdGNvbmRpdGlvbnMgVGFibGUgc3BlY2lmaWVzIHJlcXVpcmVtZW50cworICAgICAgLy8gYWZ0ZXIgYmFzaWNfaW9zOjppbml0KCkgaGFzIGJlZW4gY2FsbGVkLiBBcyBwYXJ0IG9mIHRoaXMsCisgICAgICAvLyBmaWxsKCkgbXVzdCByZXR1cm4gd2lkZW4oJyAnKSBhbnkgdGltZSBhZnRlciBpbml0KCkgaGFzIGJlZW4KKyAgICAgIC8vIGNhbGxlZCwgd2hpY2ggbmVlZHMgYW4gaW1idWVkIGN0eXBlIGZhY2V0IG9mIGNoYXJfdHlwZSB0bworICAgICAgLy8gcmV0dXJuIHdpdGhvdXQgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLiBVbmZvcnR1bmF0ZWx5LAorICAgICAgLy8gY3R5cGU8Y2hhcl90eXBlPiBpcyBub3QgbmVjZXNzYXJpbHkgYSByZXF1aXJlZCBmYWNldCwgc28KKyAgICAgIC8vIHN0cmVhbXMgd2l0aCBjaGFyX3R5cGUgIT0gW2NoYXIsIHdjaGFyX3RdIHdpbGwgbm90IGhhdmUgaXQgYnkKKyAgICAgIC8vIGRlZmF1bHQuIEJlY2F1c2Ugb2YgdGhpcywgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIF9NX2ZpbGwgaXMKKyAgICAgIC8vIGNvbnN0cnVjdGVkIG9uIHRoZSBmaXJzdCBjYWxsIG9mIGZpbGwoKS4gVGhhdCB3YXksCisgICAgICAvLyB1bmZvcm1hdHRlZCBpbnB1dCBhbmQgb3V0cHV0IHdpdGggbm9uLXJlcXVpcmVkIGJhc2ljX2lvcworICAgICAgLy8gaW5zdGFudGlhdGlvbnMgaXMgcG9zc2libGUgZXZlbiB3aXRob3V0IGltYnVpbmcgdGhlIGV4cGVjdGVkCisgICAgICAvLyBjdHlwZTxjaGFyX3R5cGU+IGZhY2V0LgorICAgICAgX01fZmlsbCA9IF9DaGFyVCgpOworICAgICAgX01fZmlsbF9pbml0ID0gZmFsc2U7CisKKyAgICAgIF9NX3RpZSA9IDA7CisgICAgICBfTV9leGNlcHRpb24gPSBnb29kYml0OworICAgICAgX01fc3RyZWFtYnVmID0gX19zYjsKKyAgICAgIF9NX3N0cmVhbWJ1Zl9zdGF0ZSA9IF9fc2IgPyBnb29kYml0IDogYmFkYml0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdm9pZAorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+OjpfTV9jYWNoZV9sb2NhbGUoY29uc3QgbG9jYWxlJiBfX2xvYykKKyAgICB7CisgICAgICBpZiAoX19idWlsdGluX2V4cGVjdChoYXNfZmFjZXQ8X19jdHlwZV90eXBlPihfX2xvYyksIHRydWUpKQorCV9NX2N0eXBlID0gJnVzZV9mYWNldDxfX2N0eXBlX3R5cGU+KF9fbG9jKTsKKyAgICAgIGVsc2UKKwlfTV9jdHlwZSA9IDA7CisKKyAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGhhc19mYWNldDxfX251bV9wdXRfdHlwZT4oX19sb2MpLCB0cnVlKSkKKwlfTV9udW1fcHV0ID0gJnVzZV9mYWNldDxfX251bV9wdXRfdHlwZT4oX19sb2MpOworICAgICAgZWxzZQorCV9NX251bV9wdXQgPSAwOworCisgICAgICBpZiAoX19idWlsdGluX2V4cGVjdChoYXNfZmFjZXQ8X19udW1fZ2V0X3R5cGU+KF9fbG9jKSwgdHJ1ZSkpCisJX01fbnVtX2dldCA9ICZ1c2VfZmFjZXQ8X19udW1fZ2V0X3R5cGU+KF9fbG9jKTsKKyAgICAgIGVsc2UKKwlfTV9udW1fZ2V0ID0gMDsKKyAgICB9CisKKyAgLy8gSW5oaWJpdCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBmb3IgcmVxdWlyZWQgaW5zdGFudGlhdGlvbnMsCisgIC8vIHdoaWNoIGFyZSBkZWZpbmVkIHZpYSBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBlbHNld2hlcmUuCisjaWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19pb3M8Y2hhcj47CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfaW9zPHdjaGFyX3Q+OworI2VuZGlmCisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYmFzaWNfc3RyaW5nLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYmFzaWNfc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNiZDliOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9iYXNpY19zdHJpbmcuaApAQCAtMCwwICsxLDMxMTEgQEAKKy8vIENvbXBvbmVudHMgZm9yIG1hbmlwdWxhdGluZyBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9iYXNpY19zdHJpbmcuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3N0cmluZ30KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjEgU3RyaW5ncyBsaWJyYXJ5CisvLworCisjaWZuZGVmIF9CQVNJQ19TVFJJTkdfSAorI2RlZmluZSBfQkFTSUNfU1RSSU5HX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxleHQvYXRvbWljaXR5Lmg+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAY2xhc3MgYmFzaWNfc3RyaW5nIGJhc2ljX3N0cmluZy5oIDxzdHJpbmc+CisgICAqICBAYnJpZWYgIE1hbmFnaW5nIHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzIGFuZCBjaGFyYWN0ZXItbGlrZSBvYmplY3RzLgorICAgKgorICAgKiAgQGluZ3JvdXAgc3RyaW5ncworICAgKiAgQGluZ3JvdXAgc2VxdWVuY2VzCisgICAqCisgICAqICBAdHBhcmFtIF9DaGFyVCAgVHlwZSBvZiBjaGFyYWN0ZXIKKyAgICogIEB0cGFyYW0gX1RyYWl0cyAgVHJhaXRzIGZvciBjaGFyYWN0ZXIgdHlwZSwgZGVmYXVsdHMgdG8KKyAgICogICAgICAgICAgICAgICAgICAgY2hhcl90cmFpdHM8X0NoYXJUPi4KKyAgICogIEB0cGFyYW0gX0FsbG9jICBBbGxvY2F0b3IgdHlwZSwgZGVmYXVsdHMgdG8gYWxsb2NhdG9yPF9DaGFyVD4uCisgICAqCisgICAqICBNZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sIGEKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY2Ij5yZXZlcnNpYmxlIGNvbnRhaW5lcjwvYT4sIGFuZCBhCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NyI+c2VxdWVuY2U8L2E+LiAgT2YgdGhlCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2OCI+b3B0aW9uYWwgc2VxdWVuY2UgcmVxdWlyZW1lbnRzPC9hPiwgb25seQorICAgKiAgQGMgcHVzaF9iYWNrLCBAYyBhdCwgYW5kIEBjICVhcnJheSBhY2Nlc3MgYXJlIHN1cHBvcnRlZC4KKyAgICoKKyAgICogIEBkb2N0b2RvCisgICAqCisgICAqCisgICAqICBEb2N1bWVudGF0aW9uPyAgV2hhdCdzIHRoYXQ/CisgICAqICBOYXRoYW4gTXllcnMgPG5jbUBjYW50cmlwLm9yZz4uCisgICAqCisgICAqICBBIHN0cmluZyBsb29rcyBsaWtlIHRoaXM6CisgICAqCisgICAqICBAY29kZQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbX1JlcF0KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fbGVuZ3RoCisgICAqICAgW2Jhc2ljX3N0cmluZzxjaGFyX3R5cGU+XSAgICAgICAgICAgIF9NX2NhcGFjaXR5CisgICAqICAgX01fZGF0YXBsdXMgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX3JlZmNvdW50CisgICAqICAgX01fcCAtLS0tLS0tLS0tLS0tLS0tPiAgICAgICAgICAgICAgIHVubmFtZWQgYXJyYXkgb2YgY2hhcl90eXBlCisgICAqICBAZW5kY29kZQorICAgKgorICAgKiAgV2hlcmUgdGhlIF9NX3AgcG9pbnRzIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZywgYW5kCisgICAqICB5b3UgY2FzdCBpdCB0byBhIHBvaW50ZXItdG8tX1JlcCBhbmQgc3VidHJhY3QgMSB0byBnZXQgYQorICAgKiAgcG9pbnRlciB0byB0aGUgaGVhZGVyLgorICAgKgorICAgKiAgVGhpcyBhcHByb2FjaCBoYXMgdGhlIGVub3Jtb3VzIGFkdmFudGFnZSB0aGF0IGEgc3RyaW5nIG9iamVjdAorICAgKiAgcmVxdWlyZXMgb25seSBvbmUgYWxsb2NhdGlvbi4gIEFsbCB0aGUgdWdsaW5lc3MgaXMgY29uZmluZWQKKyAgICogIHdpdGhpbiBhIHNpbmdsZSAlcGFpciBvZiBpbmxpbmUgZnVuY3Rpb25zLCB3aGljaCBlYWNoIGNvbXBpbGUgdG8KKyAgICogIGEgc2luZ2xlIEBhIGFkZCBpbnN0cnVjdGlvbjogX1JlcDo6X01fZGF0YSgpLCBhbmQKKyAgICogIHN0cmluZzo6X01fcmVwKCk7IGFuZCB0aGUgYWxsb2NhdGlvbiBmdW5jdGlvbiB3aGljaCBnZXRzIGEKKyAgICogIGJsb2NrIG9mIHJhdyBieXRlcyBhbmQgd2l0aCByb29tIGVub3VnaCBhbmQgY29uc3RydWN0cyBhIF9SZXAKKyAgICogIG9iamVjdCBhdCB0aGUgZnJvbnQuCisgICAqCisgICAqICBUaGUgcmVhc29uIHlvdSB3YW50IF9NX2RhdGEgcG9pbnRpbmcgdG8gdGhlIGNoYXJhY3RlciAlYXJyYXkgYW5kCisgICAqICBub3QgdGhlIF9SZXAgaXMgc28gdGhhdCB0aGUgZGVidWdnZXIgY2FuIHNlZSB0aGUgc3RyaW5nCisgICAqICBjb250ZW50cy4gKFByb2JhYmx5IHdlIHNob3VsZCBhZGQgYSBub24taW5saW5lIG1lbWJlciB0byBnZXQKKyAgICogIHRoZSBfUmVwIGZvciB0aGUgZGVidWdnZXIgdG8gdXNlLCBzbyB1c2VycyBjYW4gY2hlY2sgdGhlIGFjdHVhbAorICAgKiAgc3RyaW5nIGxlbmd0aC4pCisgICAqCisgICAqICBOb3RlIHRoYXQgdGhlIF9SZXAgb2JqZWN0IGlzIGEgUE9EIHNvIHRoYXQgeW91IGNhbiBoYXZlIGEKKyAgICogIHN0YXRpYyA8ZW0+ZW1wdHkgc3RyaW5nPC9lbT4gX1JlcCBvYmplY3QgYWxyZWFkeSBAYSBjb25zdHJ1Y3RlZCBiZWZvcmUKKyAgICogIHN0YXRpYyBjb25zdHJ1Y3RvcnMgaGF2ZSBydW4uICBUaGUgcmVmZXJlbmNlLWNvdW50IGVuY29kaW5nIGlzCisgICAqICBjaG9zZW4gc28gdGhhdCBhIDAgaW5kaWNhdGVzIG9uZSByZWZlcmVuY2UsIHNvIHlvdSBuZXZlciB0cnkgdG8KKyAgICogIGRlc3Ryb3kgdGhlIGVtcHR5LXN0cmluZyBfUmVwIG9iamVjdC4KKyAgICoKKyAgICogIEFsbCBidXQgdGhlIGxhc3QgcGFyYWdyYXBoIGlzIGNvbnNpZGVyZWQgcHJldHR5IGNvbnZlbnRpb25hbAorICAgKiAgZm9yIGEgQysrIHN0cmluZyBpbXBsZW1lbnRhdGlvbi4KKyAgKi8KKyAgLy8gMjEuMyAgVGVtcGxhdGUgY2xhc3MgYmFzaWNfc3RyaW5nCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIGJhc2ljX3N0cmluZworICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X0NoYXJUPjo6b3RoZXIgX0NoYXJUX2FsbG9jX3R5cGU7CisKKyAgICAgIC8vIFR5cGVzOgorICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RyYWl0cwkJCQkJICAgIHRyYWl0c190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpjaGFyX3R5cGUJCSAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQWxsb2MJCQkJCSAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NoYXJUX2FsbG9jX3R5cGU6OnNpemVfdHlwZQkgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ2hhclRfYWxsb2NfdHlwZTo6ZGlmZmVyZW5jZV90eXBlICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ2hhclRfYWxsb2NfdHlwZTo6cmVmZXJlbmNlCSAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyVF9hbGxvY190eXBlOjpjb25zdF9yZWZlcmVuY2UgICBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyVF9hbGxvY190eXBlOjpwb2ludGVyCSAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ2hhclRfYWxsb2NfdHlwZTo6Y29uc3RfcG9pbnRlcgkgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX25vcm1hbF9pdGVyYXRvcjxwb2ludGVyLCBiYXNpY19zdHJpbmc+ICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX25vcm1hbF9pdGVyYXRvcjxjb25zdF9wb2ludGVyLCBiYXNpY19zdHJpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPgljb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+CQkgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgIHByaXZhdGU6CisgICAgICAvLyBfUmVwOiBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAgICAgIC8vICAgSW52YXJpYW50czoKKyAgICAgIC8vICAgMS4gU3RyaW5nIHJlYWxseSBjb250YWlucyBfTV9sZW5ndGggKyAxIGNoYXJhY3RlcnM6IGR1ZSB0byAyMS4zLjQKKyAgICAgIC8vICAgICAgbXVzdCBiZSBrZXB0IG51bGwtdGVybWluYXRlZC4KKyAgICAgIC8vICAgMi4gX01fY2FwYWNpdHkgPj0gX01fbGVuZ3RoCisgICAgICAvLyAgICAgIEFsbG9jYXRlZCBtZW1vcnkgaXMgYWx3YXlzIChfTV9jYXBhY2l0eSArIDEpICogc2l6ZW9mKF9DaGFyVCkuCisgICAgICAvLyAgIDMuIF9NX3JlZmNvdW50IGhhcyB0aHJlZSBzdGF0ZXM6CisgICAgICAvLyAgICAgIC0xOiBsZWFrZWQsIG9uZSByZWZlcmVuY2UsIG5vIHJlZi1jb3BpZXMgYWxsb3dlZCwgbm9uLWNvbnN0LgorICAgICAgLy8gICAgICAgMDogb25lIHJlZmVyZW5jZSwgbm9uLWNvbnN0LgorICAgICAgLy8gICAgIG4+MDogbiArIDEgcmVmZXJlbmNlcywgb3BlcmF0aW9ucyByZXF1aXJlIGEgbG9jaywgY29uc3QuCisgICAgICAvLyAgIDQuIEFsbCBmaWVsZHM9PTAgaXMgYW4gZW1wdHkgc3RyaW5nLCBnaXZlbiB0aGUgZXh0cmEgc3RvcmFnZQorICAgICAgLy8gICAgICBiZXlvbmQtdGhlLWVuZCBmb3IgYSBudWxsIHRlcm1pbmF0b3I7IHRodXMsIHRoZSBzaGFyZWQKKyAgICAgIC8vICAgICAgZW1wdHkgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG5lZWRzIG5vIGNvbnN0cnVjdG9yLgorCisgICAgICBzdHJ1Y3QgX1JlcF9iYXNlCisgICAgICB7CisJc2l6ZV90eXBlCQlfTV9sZW5ndGg7CisJc2l6ZV90eXBlCQlfTV9jYXBhY2l0eTsKKwlfQXRvbWljX3dvcmQJCV9NX3JlZmNvdW50OworICAgICAgfTsKKworICAgICAgc3RydWN0IF9SZXAgOiBfUmVwX2Jhc2UKKyAgICAgIHsKKwkvLyBUeXBlczoKKwl0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPGNoYXI+OjpvdGhlciBfUmF3X2J5dGVzX2FsbG9jOworCisJLy8gKFB1YmxpYykgRGF0YSBtZW1iZXJzOgorCisJLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIGluZGl2aWR1YWwgY2hhcl90eXBlIGVsZW1lbnRzIG9mIGFuCisJLy8gaW5kaXZpZHVhbCBzdHJpbmcgaXMgZGV0ZXJtaW5lZCBieSBfU19tYXhfc2l6ZS4gVGhpcyBpcyB0aGUKKwkvLyB2YWx1ZSB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYnkgbWF4X3NpemUoKS4gIChXaGVyZWFzIG5wb3MKKwkvLyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhlIGFsbG9jYXRvciBjYW4gYWxsb2NhdGUuKQorCS8vIElmIG9uZSB3YXMgdG8gZGl2dnkgdXAgdGhlIHRoZW9yZXRpY2FsIGxhcmdlc3Qgc2l6ZSBzdHJpbmcsCisJLy8gd2l0aCBhIHRlcm1pbmF0aW5nIGNoYXJhY3RlciBhbmQgbSBfQ2hhclQgZWxlbWVudHMsIGl0J2QKKwkvLyBsb29rIGxpa2UgdGhpczoKKwkvLyBucG9zID0gc2l6ZW9mKF9SZXApICsgKG0gKiBzaXplb2YoX0NoYXJUKSkgKyBzaXplb2YoX0NoYXJUKQorCS8vIFNvbHZpbmcgZm9yIG06CisJLy8gbSA9ICgobnBvcyAtIHNpemVvZihfUmVwKSkvc2l6ZW9mKENoYXJUKSkgLSAxCisJLy8gSW4gYWRkaXRpb24sIHRoaXMgaW1wbGVtZW50YXRpb24gcXVhcnRlcnMgdGhpcyBhbW91bnQuCisJc3RhdGljIGNvbnN0IHNpemVfdHlwZQlfU19tYXhfc2l6ZTsKKwlzdGF0aWMgY29uc3QgX0NoYXJUCV9TX3Rlcm1pbmFsOworCisJLy8gVGhlIGZvbGxvd2luZyBzdG9yYWdlIGlzIGluaXQnZCB0byAwIGJ5IHRoZSBsaW5rZXIsIHJlc3VsdGluZworICAgICAgICAvLyAoY2FyZWZ1bGx5KSBpbiBhbiBlbXB0eSBzdHJpbmcgd2l0aCBvbmUgcmVmZXJlbmNlLgorICAgICAgICBzdGF0aWMgc2l6ZV90eXBlIF9TX2VtcHR5X3JlcF9zdG9yYWdlW107CisKKyAgICAgICAgc3RhdGljIF9SZXAmCisgICAgICAgIF9TX2VtcHR5X3JlcCgpCisgICAgICAgIHsgCisJICAvLyBOQjogTWlsZCBoYWNrIHRvIGF2b2lkIHN0cmljdC1hbGlhc2luZyB3YXJuaW5ncy4gIE5vdGUgdGhhdAorCSAgLy8gX1NfZW1wdHlfcmVwX3N0b3JhZ2UgaXMgbmV2ZXIgbW9kaWZpZWQgYW5kIHRoZSBwdW5uaW5nIHNob3VsZAorCSAgLy8gYmUgcmVhc29uYWJseSBzYWZlIGluIHRoaXMgY2FzZS4KKwkgIHZvaWQqIF9fcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KCZfU19lbXB0eV9yZXBfc3RvcmFnZSk7CisJICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8X1JlcCo+KF9fcCk7CisJfQorCisgICAgICAgIGJvb2wKKwlfTV9pc19sZWFrZWQoKSBjb25zdAorICAgICAgICB7IHJldHVybiB0aGlzLT5fTV9yZWZjb3VudCA8IDA7IH0KKworICAgICAgICBib29sCisJX01faXNfc2hhcmVkKCkgY29uc3QKKyAgICAgICAgeyByZXR1cm4gdGhpcy0+X01fcmVmY291bnQgPiAwOyB9CisKKyAgICAgICAgdm9pZAorCV9NX3NldF9sZWFrZWQoKQorICAgICAgICB7IHRoaXMtPl9NX3JlZmNvdW50ID0gLTE7IH0KKworICAgICAgICB2b2lkCisJX01fc2V0X3NoYXJhYmxlKCkKKyAgICAgICAgeyB0aGlzLT5fTV9yZWZjb3VudCA9IDA7IH0KKworCXZvaWQKKwlfTV9zZXRfbGVuZ3RoX2FuZF9zaGFyYWJsZShzaXplX3R5cGUgX19uKQorCXsKKyNpZiBfR0xJQkNYWF9GVUxMWV9EWU5BTUlDX1NUUklORyA9PSAwCisJICBpZiAoX19idWlsdGluX2V4cGVjdCh0aGlzICE9ICZfU19lbXB0eV9yZXAoKSwgZmFsc2UpKQorI2VuZGlmCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRfc2hhcmFibGUoKTsgIC8vIE9uZSByZWZlcmVuY2UuCisJICAgICAgdGhpcy0+X01fbGVuZ3RoID0gX19uOworCSAgICAgIHRyYWl0c190eXBlOjphc3NpZ24odGhpcy0+X01fcmVmZGF0YSgpW19fbl0sIF9TX3Rlcm1pbmFsKTsKKwkgICAgICAvLyBncnJyLiAocGVyIDIxLjMuNCkKKwkgICAgICAvLyBZb3UgY2Fubm90IGxlYXZlIHRob3NlIExXRyBwZW9wbGUgYWxvbmUgZm9yIGEgc2Vjb25kLgorCSAgICB9CisJfQorCisJX0NoYXJUKgorCV9NX3JlZmRhdGEoKSB0aHJvdygpCisJeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxfQ2hhclQqPih0aGlzICsgMSk7IH0KKworCV9DaGFyVCoKKwlfTV9ncmFiKGNvbnN0IF9BbGxvYyYgX19hbGxvYzEsIGNvbnN0IF9BbGxvYyYgX19hbGxvYzIpCisJeworCSAgcmV0dXJuICghX01faXNfbGVha2VkKCkgJiYgX19hbGxvYzEgPT0gX19hbGxvYzIpCisJICAgICAgICAgID8gX01fcmVmY29weSgpIDogX01fY2xvbmUoX19hbGxvYzEpOworCX0KKworCS8vIENyZWF0ZSAmIERlc3Ryb3kKKwlzdGF0aWMgX1JlcCoKKwlfU19jcmVhdGUoc2l6ZV90eXBlLCBzaXplX3R5cGUsIGNvbnN0IF9BbGxvYyYpOworCisJdm9pZAorCV9NX2Rpc3Bvc2UoY29uc3QgX0FsbG9jJiBfX2EpCisJeworI2lmIF9HTElCQ1hYX0ZVTExZX0RZTkFNSUNfU1RSSU5HID09IDAKKwkgIGlmIChfX2J1aWx0aW5fZXhwZWN0KHRoaXMgIT0gJl9TX2VtcHR5X3JlcCgpLCBmYWxzZSkpCisjZW5kaWYKKwkgICAgeworCSAgICAgIC8vIEJlIHJhY2UtZGV0ZWN0b3ItZnJpZW5kbHkuICBGb3IgbW9yZSBpbmZvIHNlZSBiaXRzL2MrK2NvbmZpZy4KKwkgICAgICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19CRUZPUkUoJnRoaXMtPl9NX3JlZmNvdW50KTsKKwkgICAgICBpZiAoX19nbnVfY3h4OjpfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2goJnRoaXMtPl9NX3JlZmNvdW50LAorCQkJCQkJCSAtMSkgPD0gMCkKKwkJeworCQkgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0FGVEVSKCZ0aGlzLT5fTV9yZWZjb3VudCk7CisJCSAgX01fZGVzdHJveShfX2EpOworCQl9CisJICAgIH0KKwl9ICAvLyBYWFggTVQKKworCXZvaWQKKwlfTV9kZXN0cm95KGNvbnN0IF9BbGxvYyYpIHRocm93KCk7CisKKwlfQ2hhclQqCisJX01fcmVmY29weSgpIHRocm93KCkKKwl7CisjaWYgX0dMSUJDWFhfRlVMTFlfRFlOQU1JQ19TVFJJTkcgPT0gMAorCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QodGhpcyAhPSAmX1NfZW1wdHlfcmVwKCksIGZhbHNlKSkKKyNlbmRpZgorICAgICAgICAgICAgX19nbnVfY3h4OjpfX2F0b21pY19hZGRfZGlzcGF0Y2goJnRoaXMtPl9NX3JlZmNvdW50LCAxKTsKKwkgIHJldHVybiBfTV9yZWZkYXRhKCk7CisJfSAgLy8gWFhYIE1UCisKKwlfQ2hhclQqCisJX01fY2xvbmUoY29uc3QgX0FsbG9jJiwgc2l6ZV90eXBlIF9fcmVzID0gMCk7CisgICAgICB9OworCisgICAgICAvLyBVc2UgZW1wdHktYmFzZSBvcHRpbWl6YXRpb246IGh0dHA6Ly93d3cuY2FudHJpcC5vcmcvZW1wdHlvcHQuaHRtbAorICAgICAgc3RydWN0IF9BbGxvY19oaWRlciA6IF9BbGxvYworICAgICAgeworCV9BbGxvY19oaWRlcihfQ2hhclQqIF9fZGF0LCBjb25zdCBfQWxsb2MmIF9fYSkKKwk6IF9BbGxvYyhfX2EpLCBfTV9wKF9fZGF0KSB7IH0KKworCV9DaGFyVCogX01fcDsgLy8gVGhlIGFjdHVhbCBkYXRhLgorICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIERhdGEgTWVtYmVycyAocHVibGljKToKKyAgICAgIC8vIE5COiBUaGlzIGlzIGFuIHVuc2lnbmVkIHR5cGUsIGFuZCB0aHVzIHJlcHJlc2VudHMgdGhlIG1heGltdW0KKyAgICAgIC8vIHNpemUgdGhhdCB0aGUgYWxsb2NhdG9yIGNhbiBob2xkLgorICAgICAgLy8vICBWYWx1ZSByZXR1cm5lZCBieSB2YXJpb3VzIG1lbWJlciBmdW5jdGlvbnMgd2hlbiB0aGV5IGZhaWwuCisgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBlCW5wb3MgPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KC0xKTsKKworICAgIHByaXZhdGU6CisgICAgICAvLyBEYXRhIE1lbWJlcnMgKHByaXZhdGUpOgorICAgICAgbXV0YWJsZSBfQWxsb2NfaGlkZXIJX01fZGF0YXBsdXM7CisKKyAgICAgIF9DaGFyVCoKKyAgICAgIF9NX2RhdGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gIF9NX2RhdGFwbHVzLl9NX3A7IH0KKworICAgICAgX0NoYXJUKgorICAgICAgX01fZGF0YShfQ2hhclQqIF9fcCkKKyAgICAgIHsgcmV0dXJuIChfTV9kYXRhcGx1cy5fTV9wID0gX19wKTsgfQorCisgICAgICBfUmVwKgorICAgICAgX01fcmVwKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICYoKHJlaW50ZXJwcmV0X2Nhc3Q8X1JlcCo+IChfTV9kYXRhKCkpKVstMV0pOyB9CisKKyAgICAgIC8vIEZvciB0aGUgaW50ZXJuYWwgdXNlIHdlIGhhdmUgZnVuY3Rpb25zIHNpbWlsYXIgdG8gYGJlZ2luJy9gZW5kJworICAgICAgLy8gYnV0IHRoZXkgZG8gbm90IGNhbGwgX01fbGVhay4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9pYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX01fZGF0YSgpKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgX01faWVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBpdGVyYXRvcihfTV9kYXRhKCkgKyB0aGlzLT5zaXplKCkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2xlYWsoKSAgICAvLyBmb3IgdXNlIGluIGJlZ2luKCkgJiBub24tY29uc3Qgb3BbXQorICAgICAgeworCWlmICghX01fcmVwKCktPl9NX2lzX2xlYWtlZCgpKQorCSAgX01fbGVha19oYXJkKCk7CisgICAgICB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fY2hlY2soc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBjaGFyKiBfX3MpIGNvbnN0CisgICAgICB7CisJaWYgKF9fcG9zID4gdGhpcy0+c2l6ZSgpKQorCSAgX190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKF9fcykpOworCXJldHVybiBfX3BvczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fY2hlY2tfbGVuZ3RoKHNpemVfdHlwZSBfX24xLCBzaXplX3R5cGUgX19uMiwgY29uc3QgY2hhciogX19zKSBjb25zdAorICAgICAgeworCWlmICh0aGlzLT5tYXhfc2l6ZSgpIC0gKHRoaXMtPnNpemUoKSAtIF9fbjEpIDwgX19uMikKKwkgIF9fdGhyb3dfbGVuZ3RoX2Vycm9yKF9fTihfX3MpKTsKKyAgICAgIH0KKworICAgICAgLy8gTkI6IF9NX2xpbWl0IGRvZXNuJ3QgY2hlY2sgZm9yIGEgYmFkIF9fcG9zIHZhbHVlLgorICAgICAgc2l6ZV90eXBlCisgICAgICBfTV9saW1pdChzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX29mZikgY29uc3QKKyAgICAgIHsKKwljb25zdCBib29sIF9fdGVzdG9mZiA9ICBfX29mZiA8IHRoaXMtPnNpemUoKSAtIF9fcG9zOworCXJldHVybiBfX3Rlc3RvZmYgPyBfX29mZiA6IHRoaXMtPnNpemUoKSAtIF9fcG9zOworICAgICAgfQorCisgICAgICAvLyBUcnVlIGlmIF9SZXAgYW5kIHNvdXJjZSBkbyBub3Qgb3ZlcmxhcC4KKyAgICAgIGJvb2wKKyAgICAgIF9NX2Rpc2p1bmN0KGNvbnN0IF9DaGFyVCogX19zKSBjb25zdAorICAgICAgeworCXJldHVybiAobGVzczxjb25zdCBfQ2hhclQqPigpKF9fcywgX01fZGF0YSgpKQorCQl8fCBsZXNzPGNvbnN0IF9DaGFyVCo+KCkoX01fZGF0YSgpICsgdGhpcy0+c2l6ZSgpLCBfX3MpKTsKKyAgICAgIH0KKworICAgICAgLy8gV2hlbiBfX24gPSAxIHdheSBmYXN0ZXIgdGhhbiB0aGUgZ2VuZXJhbCBtdWx0aWNoYXIKKyAgICAgIC8vIHRyYWl0c190eXBlOjpjb3B5L21vdmUvYXNzaWduLgorICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9NX2NvcHkoX0NoYXJUKiBfX2QsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQorICAgICAgeworCWlmIChfX24gPT0gMSkKKwkgIHRyYWl0c190eXBlOjphc3NpZ24oKl9fZCwgKl9fcyk7CisJZWxzZQorCSAgdHJhaXRzX3R5cGU6OmNvcHkoX19kLCBfX3MsIF9fbik7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfTV9tb3ZlKF9DaGFyVCogX19kLCBjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlpZiAoX19uID09IDEpCisJICB0cmFpdHNfdHlwZTo6YXNzaWduKCpfX2QsICpfX3MpOworCWVsc2UKKwkgIHRyYWl0c190eXBlOjptb3ZlKF9fZCwgX19zLCBfX24pOwkgIAorICAgICAgfQorCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX01fYXNzaWduKF9DaGFyVCogX19kLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgICAgeworCWlmIChfX24gPT0gMSkKKwkgIHRyYWl0c190eXBlOjphc3NpZ24oKl9fZCwgX19jKTsKKwllbHNlCisJICB0cmFpdHNfdHlwZTo6YXNzaWduKF9fZCwgX19uLCBfX2MpOwkgIAorICAgICAgfQorCisgICAgICAvLyBfU19jb3B5X2NoYXJzIGlzIGEgc2VwYXJhdGUgdGVtcGxhdGUgdG8gcGVybWl0IHNwZWNpYWxpemF0aW9uCisgICAgICAvLyB0byBvcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIHBvaW50ZXJzIGFzIGl0ZXJhdG9ycy4KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JdGVyYXRvcj4KKyAgICAgICAgc3RhdGljIHZvaWQKKyAgICAgICAgX1NfY29weV9jaGFycyhfQ2hhclQqIF9fcCwgX0l0ZXJhdG9yIF9fazEsIF9JdGVyYXRvciBfX2syKQorICAgICAgICB7CisJICBmb3IgKDsgX19rMSAhPSBfX2syOyArK19fazEsICsrX19wKQorCSAgICB0cmFpdHNfdHlwZTo6YXNzaWduKCpfX3AsICpfX2sxKTsgLy8gVGhlc2UgdHlwZXMgYXJlIG9mZi4KKwl9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19jb3B5X2NoYXJzKF9DaGFyVCogX19wLCBpdGVyYXRvciBfX2sxLCBpdGVyYXRvciBfX2syKQorICAgICAgeyBfU19jb3B5X2NoYXJzKF9fcCwgX19rMS5iYXNlKCksIF9fazIuYmFzZSgpKTsgfQorCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfY29weV9jaGFycyhfQ2hhclQqIF9fcCwgY29uc3RfaXRlcmF0b3IgX19rMSwgY29uc3RfaXRlcmF0b3IgX19rMikKKyAgICAgIHsgX1NfY29weV9jaGFycyhfX3AsIF9fazEuYmFzZSgpLCBfX2syLmJhc2UoKSk7IH0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2NvcHlfY2hhcnMoX0NoYXJUKiBfX3AsIF9DaGFyVCogX19rMSwgX0NoYXJUKiBfX2syKQorICAgICAgeyBfTV9jb3B5KF9fcCwgX19rMSwgX19rMiAtIF9fazEpOyB9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19jb3B5X2NoYXJzKF9DaGFyVCogX19wLCBjb25zdCBfQ2hhclQqIF9fazEsIGNvbnN0IF9DaGFyVCogX19rMikKKyAgICAgIHsgX01fY29weShfX3AsIF9fazEsIF9fazIgLSBfX2sxKTsgfQorCisgICAgICBzdGF0aWMgaW50CisgICAgICBfU19jb21wYXJlKHNpemVfdHlwZSBfX24xLCBzaXplX3R5cGUgX19uMikKKyAgICAgIHsKKwljb25zdCBkaWZmZXJlbmNlX3R5cGUgX19kID0gZGlmZmVyZW5jZV90eXBlKF9fbjEgLSBfX24yKTsKKworCWlmIChfX2QgPiBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8aW50Pjo6X19tYXgpCisJICByZXR1cm4gX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPGludD46Ol9fbWF4OworCWVsc2UgaWYgKF9fZCA8IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxpbnQ+OjpfX21pbikKKwkgIHJldHVybiBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8aW50Pjo6X19taW47CisJZWxzZQorCSAgcmV0dXJuIGludChfX2QpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9tdXRhdGUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19sZW4xLCBzaXplX3R5cGUgX19sZW4yKTsKKworICAgICAgdm9pZAorICAgICAgX01fbGVha19oYXJkKCk7CisKKyAgICAgIHN0YXRpYyBfUmVwJgorICAgICAgX1NfZW1wdHlfcmVwKCkKKyAgICAgIHsgcmV0dXJuIF9SZXA6Ol9TX2VtcHR5X3JlcCgpOyB9CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBDb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgLy8gTkI6IFdlIG92ZXJsb2FkIGN0b3JzIGluIHNvbWUgY2FzZXMgaW5zdGVhZCBvZiB1c2luZyBkZWZhdWx0CisgICAgICAvLyBhcmd1bWVudHMsIHBlciAxNy40LjQuNCBwYXJhLiAyIGl0ZW0gMi4KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZWZhdWx0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gZW1wdHkgc3RyaW5nLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcoKQorI2lmIF9HTElCQ1hYX0ZVTExZX0RZTkFNSUNfU1RSSU5HID09IDAKKyAgICAgIDogX01fZGF0YXBsdXMoX1NfZW1wdHlfcmVwKCkuX01fcmVmZGF0YSgpLCBfQWxsb2MoKSkgeyB9CisjZWxzZQorICAgICAgOiBfTV9kYXRhcGx1cyhfU19jb25zdHJ1Y3Qoc2l6ZV90eXBlKCksIF9DaGFyVCgpLCBfQWxsb2MoKSksIF9BbGxvYygpKXsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IGFuIGVtcHR5IHN0cmluZyB1c2luZyBhbGxvY2F0b3IgQGEgYS4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX3N0cmluZyhjb25zdCBfQWxsb2MmIF9fYSk7CisKKyAgICAgIC8vIE5COiBwZXIgTFdHIGlzc3VlIDQyLCBzZW1hbnRpY3MgZGlmZmVyZW50IGZyb20gSVM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJpbmcgd2l0aCBjb3B5IG9mIHZhbHVlIG9mIEBhIHN0ci4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBTb3VyY2Ugc3RyaW5nLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cik7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJpbmcgYXMgY29weSBvZiBhIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBTb3VyY2Ugc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byBjb3B5IGZyb20uCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvcHkgKGRlZmF1bHQgcmVtYWluZGVyKS4KKyAgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcywKKwkJICAgc2l6ZV90eXBlIF9fbiA9IG5wb3MpOworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3Qgc3RyaW5nIGFzIGNvcHkgb2YgYSBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3N0ciAgU291cmNlIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gY29weSBmcm9tLgorICAgICAgICogIEBwYXJhbSAgX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBjb3B5LgorICAgICAgICogIEBwYXJhbSAgX19hICBBbGxvY2F0b3IgdG8gdXNlLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLAorCQkgICBzaXplX3R5cGUgX19uLCBjb25zdCBfQWxsb2MmIF9fYSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmluZyBpbml0aWFsaXplZCBieSBhIGNoYXJhY3RlciAlYXJyYXkuCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFNvdXJjZSBjaGFyYWN0ZXIgJWFycmF5LgorICAgICAgICogIEBwYXJhbSAgX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBjb3B5LgorICAgICAgICogIEBwYXJhbSAgX19hICBBbGxvY2F0b3IgdG8gdXNlIChkZWZhdWx0IGlzIGRlZmF1bHQgYWxsb2NhdG9yKS4KKyAgICAgICAqCisgICAgICAgKiAgTkI6IEBhIF9fcyBtdXN0IGhhdmUgYXQgbGVhc3QgQGEgX19uIGNoYXJhY3RlcnMsICZhcG9zO1xcMCZhcG9zOworICAgICAgICogIGhhcyBubyBzcGVjaWFsIG1lYW5pbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbiwKKwkJICAgY29uc3QgX0FsbG9jJiBfX2EgPSBfQWxsb2MoKSk7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJpbmcgYXMgY29weSBvZiBhIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19zICBTb3VyY2UgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFsbG9jYXRvciB0byB1c2UgKGRlZmF1bHQgaXMgZGVmYXVsdCBhbGxvY2F0b3IpLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsIGNvbnN0IF9BbGxvYyYgX19hID0gX0FsbG9jKCkpOworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3Qgc3RyaW5nIGFzIG11bHRpcGxlIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSAgX19jICBDaGFyYWN0ZXIgdG8gdXNlLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbGxvY2F0b3IgdG8gdXNlIChkZWZhdWx0IGlzIGRlZmF1bHQgYWxsb2NhdG9yKS4KKyAgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsIGNvbnN0IF9BbGxvYyYgX19hID0gX0FsbG9jKCkpOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNb3ZlIGNvbnN0cnVjdCBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3N0ciAgU291cmNlIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgc3RyaW5nIGNvbnRhaW5zIHRoZSBleGFjdCBjb250ZW50cyBvZiBAYSBfX3N0ci4KKyAgICAgICAqICBAYSBfX3N0ciBpcyBhIHZhbGlkLCBidXQgdW5zcGVjaWZpZWQgc3RyaW5nLgorICAgICAgICoqLworICAgICAgYmFzaWNfc3RyaW5nKGJhc2ljX3N0cmluZyYmIF9fc3RyKSBub2V4Y2VwdAorICAgICAgOiBfTV9kYXRhcGx1cyhfX3N0ci5fTV9kYXRhcGx1cykKKyAgICAgIHsKKyNpZiBfR0xJQkNYWF9GVUxMWV9EWU5BTUlDX1NUUklORyA9PSAwCisJX19zdHIuX01fZGF0YShfU19lbXB0eV9yZXAoKS5fTV9yZWZkYXRhKCkpOworI2Vsc2UKKwlfX3N0ci5fTV9kYXRhKF9TX2NvbnN0cnVjdChzaXplX3R5cGUoKSwgX0NoYXJUKCksIGdldF9hbGxvY2F0b3IoKSkpOworI2VuZGlmCisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmluZyBmcm9tIGFuIGluaXRpYWxpemVyICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgX19sICBzdGQ6OmluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQWxsb2NhdG9yIHRvIHVzZSAoZGVmYXVsdCBpcyBkZWZhdWx0IGFsbG9jYXRvcikuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyhpbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sLCBjb25zdCBfQWxsb2MmIF9fYSA9IF9BbGxvYygpKTsKKyNlbmRpZiAvLyBDKysxMQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJpbmcgYXMgY29weSBvZiBhIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgX19iZWcgIFN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgX19lbmQgIEVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQWxsb2NhdG9yIHRvIHVzZSAoZGVmYXVsdCBpcyBkZWZhdWx0IGFsbG9jYXRvcikuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBiYXNpY19zdHJpbmcoX0lucHV0SXRlcmF0b3IgX19iZWcsIF9JbnB1dEl0ZXJhdG9yIF9fZW5kLAorCQkgICAgIGNvbnN0IF9BbGxvYyYgX19hID0gX0FsbG9jKCkpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlc3Ryb3kgdGhlIHN0cmluZyBpbnN0YW5jZS4KKyAgICAgICAqLworICAgICAgfmJhc2ljX3N0cmluZygpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9NX3JlcCgpLT5fTV9kaXNwb3NlKHRoaXMtPmdldF9hbGxvY2F0b3IoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBc3NpZ24gdGhlIHZhbHVlIG9mIEBhIHN0ciB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBTb3VyY2Ugc3RyaW5nLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBvcGVyYXRvcj0oY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikgCisgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oX19zdHIpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29weSBjb250ZW50cyBvZiBAYSBzIGludG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFNvdXJjZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX0NoYXJUKiBfX3MpIAorICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKF9fcyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gc3RyaW5nIG9mIGxlbmd0aCAxLgorICAgICAgICogIEBwYXJhbSAgX19jICBTb3VyY2UgY2hhcmFjdGVyLgorICAgICAgICoKKyAgICAgICAqICBBc3NpZ25pbmcgdG8gYSBjaGFyYWN0ZXIgbWFrZXMgdGhpcyBzdHJpbmcgbGVuZ3RoIDEgYW5kCisgICAgICAgKiAgKCp0aGlzKVswXSA9PSBAYSBjLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBvcGVyYXRvcj0oX0NoYXJUIF9fYykgCisgICAgICB7IAorCXRoaXMtPmFzc2lnbigxLCBfX2MpOyAKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1vdmUgYXNzaWduIHRoZSB2YWx1ZSBvZiBAYSBzdHIgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3N0ciAgU291cmNlIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGNvbnRlbnRzIG9mIEBhIHN0ciBhcmUgbW92ZWQgaW50byB0aGlzIHN0cmluZyAod2l0aG91dCBjb3B5aW5nKS4KKyAgICAgICAqICBAYSBzdHIgaXMgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkIHN0cmluZy4KKyAgICAgICAqKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIG9wZXJhdG9yPShiYXNpY19zdHJpbmcmJiBfX3N0cikKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwl0aGlzLT5zd2FwKF9fc3RyKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIHN0cmluZyBjb25zdHJ1Y3RlZCBmcm9tIGluaXRpYWxpemVyICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgX19sICBzdGQ6OmluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sKQorICAgICAgeworCXRoaXMtPmFzc2lnbihfX2wuYmVnaW4oKSwgX19sLnNpemUoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmIC8vIEMrKzExCisKKyAgICAgIC8vIEl0ZXJhdG9yczoKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4KKyAgICAgICAqICB0aGUgJXN0cmluZy4gIFVuc2hhcmVzIHRoZSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJX01fbGVhaygpOworCXJldHVybiBpdGVyYXRvcihfTV9kYXRhKCkpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgY2hhcmFjdGVyIGluIHRoZSAlc3RyaW5nLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX01fZGF0YSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdAorICAgICAgICogIGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4gIFVuc2hhcmVzIHRoZSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCV9NX2xlYWsoKTsKKwlyZXR1cm4gaXRlcmF0b3IoX01fZGF0YSgpICsgdGhpcy0+c2l6ZSgpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZQorICAgICAgICogIGxhc3QgY2hhcmFjdGVyIGluIHRoZSAlc3RyaW5nLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9NX2RhdGEoKSArIHRoaXMtPnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgbGFzdAorICAgICAgICogIGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIHJldmVyc2UgZWxlbWVudAorICAgICAgICogIG9yZGVyLiAgVW5zaGFyZXMgdGhlIHN0cmluZy4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IodGhpcy0+ZW5kKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSAlc3RyaW5nLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4KKyAgICAgICAqICByZXZlcnNlIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPmVuZCgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIG9uZSBiZWZvcmUgdGhlCisgICAgICAgKiAgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSAlc3RyaW5nLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gcmV2ZXJzZQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuICBVbnNoYXJlcyB0aGUgc3RyaW5nLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IodGhpcy0+YmVnaW4oKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMKKyAgICAgICAqICB0byBvbmUgYmVmb3JlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuICBJdGVyYXRpb24KKyAgICAgICAqICBpcyBkb25lIGluIHJldmVyc2UgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPmJlZ2luKCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgY2hhcmFjdGVyIGluIHRoZSAlc3RyaW5nLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2RhdGEoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZQorICAgICAgICogIGxhc3QgY2hhcmFjdGVyIGluIHRoZSAlc3RyaW5nLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzLT5fTV9kYXRhKCkgKyB0aGlzLT5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSAlc3RyaW5nLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4KKyAgICAgICAqICByZXZlcnNlIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5lbmQoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMKKyAgICAgICAqICB0byBvbmUgYmVmb3JlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuICBJdGVyYXRpb24KKyAgICAgICAqICBpcyBkb25lIGluIHJldmVyc2UgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5iZWdpbigpKTsgfQorI2VuZGlmCisKKyAgICBwdWJsaWM6CisgICAgICAvLyBDYXBhY2l0eToKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZywgbm90IGluY2x1ZGluZyBhbnkKKyAgICAgIC8vLyAgbnVsbC10ZXJtaW5hdGlvbi4KKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV9yZXAoKS0+X01fbGVuZ3RoOyB9CisKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZywgbm90IGluY2x1ZGluZyBhbnkKKyAgICAgIC8vLyAgbnVsbC10ZXJtaW5hdGlvbi4KKyAgICAgIHNpemVfdHlwZQorICAgICAgbGVuZ3RoKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3JlcCgpLT5fTV9sZW5ndGg7IH0KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBzaXplKCkgb2YgdGhlIGxhcmdlc3QgcG9zc2libGUgJXN0cmluZy4KKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX1JlcDo6X1NfbWF4X3NpemU7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXNpemVzIHRoZSAlc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRoZSAlc3RyaW5nIHNob3VsZCBjb250YWluLgorICAgICAgICogIEBwYXJhbSAgX19jICBDaGFyYWN0ZXIgdG8gZmlsbCBhbnkgbmV3IGVsZW1lbnRzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgJXJlc2l6ZSB0aGUgJXN0cmluZyB0byB0aGUgc3BlY2lmaWVkCisgICAgICAgKiAgbnVtYmVyIG9mIGNoYXJhY3RlcnMuICBJZiB0aGUgbnVtYmVyIGlzIHNtYWxsZXIgdGhhbiB0aGUKKyAgICAgICAqICAlc3RyaW5nJ3MgY3VycmVudCBzaXplIHRoZSAlc3RyaW5nIGlzIHRydW5jYXRlZCwgb3RoZXJ3aXNlCisgICAgICAgKiAgdGhlICVzdHJpbmcgaXMgZXh0ZW5kZWQgYW5kIG5ldyBlbGVtZW50cyBhcmUgJXNldCB0byBAYSBfX2MuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXNpemVzIHRoZSAlc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRoZSAlc3RyaW5nIHNob3VsZCBjb250YWluLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzaXplIHRoZSAlc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLiAgSWYKKyAgICAgICAqICB0aGUgbmV3IHNpemUgaXMgc21hbGxlciB0aGFuIHRoZSAlc3RyaW5nJ3MgY3VycmVudCBzaXplIHRoZSAlc3RyaW5nCisgICAgICAgKiAgaXMgdHJ1bmNhdGVkLCBvdGhlcndpc2UgdGhlICVzdHJpbmcgaXMgZXh0ZW5kZWQgYW5kIG5ldyBjaGFyYWN0ZXJzCisgICAgICAgKiAgYXJlIGRlZmF1bHQtY29uc3RydWN0ZWQuICBGb3IgYmFzaWMgdHlwZXMgc3VjaCBhcyBjaGFyLCB0aGlzIG1lYW5zCisgICAgICAgKiAgc2V0dGluZyB0aGVtIHRvIDAuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19uKQorICAgICAgeyB0aGlzLT5yZXNpemUoX19uLCBfQ2hhclQoKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8vLyAgQSBub24tYmluZGluZyByZXF1ZXN0IHRvIHJlZHVjZSBjYXBhY2l0eSgpIHRvIHNpemUoKS4KKyAgICAgIHZvaWQKKyAgICAgIHNocmlua190b19maXQoKQorICAgICAgeworCWlmIChjYXBhY2l0eSgpID4gc2l6ZSgpKQorCSAgeworCSAgICBfX3RyeQorCSAgICAgIHsgcmVzZXJ2ZSgwKTsgfQorCSAgICBfX2NhdGNoKC4uLikKKwkgICAgICB7IH0KKwkgIH0KKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHRoZSAlc3RyaW5nIGNhbiBob2xkCisgICAgICAgKiAgYmVmb3JlIG5lZWRpbmcgdG8gYWxsb2NhdGUgbW9yZSBtZW1vcnkuCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgY2FwYWNpdHkoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fcmVwKCktPl9NX2NhcGFjaXR5OyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXR0ZW1wdCB0byBwcmVhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IGZvciBzcGVjaWZpZWQgbnVtYmVyIG9mCisgICAgICAgKiAgICAgICAgICBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSAgX19yZXNfYXJnICBOdW1iZXIgb2YgY2hhcmFjdGVycyByZXF1aXJlZC4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBAYSBfX3Jlc19hcmcgZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIHJlc2VydmUgZW5vdWdoIG1lbW9yeSBmb3IgdGhlCisgICAgICAgKiAgJXN0cmluZyB0byBob2xkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMuICBJZiB0aGUKKyAgICAgICAqICBudW1iZXIgcmVxdWVzdGVkIGlzIG1vcmUgdGhhbiBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMKKyAgICAgICAqICB0aHJvd24uCisgICAgICAgKgorICAgICAgICogIFRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0aGF0IGlmIG9wdGltYWwgY29kZSBpcyBhCisgICAgICAgKiAgbmVjZXNzaXR5IGFuZCB0aGUgdXNlciBjYW4gZGV0ZXJtaW5lIHRoZSBzdHJpbmcgbGVuZ3RoIHRoYXQgd2lsbCBiZQorICAgICAgICogIHJlcXVpcmVkLCB0aGUgdXNlciBjYW4gcmVzZXJ2ZSB0aGUgbWVtb3J5IGluICVhZHZhbmNlLCBhbmQgdGh1cworICAgICAgICogIHByZXZlbnQgYSBwb3NzaWJsZSByZWFsbG9jYXRpb24gb2YgbWVtb3J5IGFuZCBjb3B5aW5nIG9mICVzdHJpbmcKKyAgICAgICAqICBkYXRhLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNlcnZlKHNpemVfdHlwZSBfX3Jlc19hcmcgPSAwKTsKKworICAgICAgLyoqCisgICAgICAgKiAgRXJhc2VzIHRoZSBzdHJpbmcsIG1ha2luZyBpdCBlbXB0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyBfTV9tdXRhdGUoMCwgdGhpcy0+c2l6ZSgpLCAwKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlICVzdHJpbmcgaXMgZW1wdHkuICBFcXVpdmFsZW50IHRvIAorICAgICAgICogIDxjb2RlPip0aGlzID09ICIiPC9jb2RlPi4KKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+c2l6ZSgpID09IDA7IH0KKworICAgICAgLy8gRWxlbWVudCBhY2Nlc3M6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN1YnNjcmlwdCBhY2Nlc3MgdG8gdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSAlc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIFRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIHRvIGFjY2Vzcy4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRvciBhbGxvd3MgZm9yIGVhc3ksIGFycmF5LXN0eWxlLCBkYXRhIGFjY2Vzcy4KKyAgICAgICAqICBOb3RlIHRoYXQgZGF0YSBhY2Nlc3Mgd2l0aCB0aGlzIG9wZXJhdG9yIGlzIHVuY2hlY2tlZCBhbmQKKyAgICAgICAqICBvdXRfb2ZfcmFuZ2UgbG9va3VwcyBhcmUgbm90IGRlZmluZWQuIChGb3IgY2hlY2tlZCBsb29rdXBzCisgICAgICAgKiAgc2VlIGF0KCkuKQorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10gKHNpemVfdHlwZSBfX3BvcykgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX19wb3MgPD0gc2l6ZSgpKTsKKwlyZXR1cm4gX01fZGF0YSgpW19fcG9zXTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdWJzY3JpcHQgYWNjZXNzIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJXN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBUaGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciB0byBhY2Nlc3MuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC93cml0ZSByZWZlcmVuY2UgdG8gdGhlIGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRvciBhbGxvd3MgZm9yIGVhc3ksIGFycmF5LXN0eWxlLCBkYXRhIGFjY2Vzcy4KKyAgICAgICAqICBOb3RlIHRoYXQgZGF0YSBhY2Nlc3Mgd2l0aCB0aGlzIG9wZXJhdG9yIGlzIHVuY2hlY2tlZCBhbmQKKyAgICAgICAqICBvdXRfb2ZfcmFuZ2UgbG9va3VwcyBhcmUgbm90IGRlZmluZWQuIChGb3IgY2hlY2tlZCBsb29rdXBzCisgICAgICAgKiAgc2VlIGF0KCkuKSAgVW5zaGFyZXMgdGhlIHN0cmluZy4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX3BvcykKKyAgICAgIHsKKyAgICAgICAgLy8gYWxsb3cgcG9zID09IHNpemUoKSBhcyB2MyBleHRlbnNpb246CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9fcG9zIDw9IHNpemUoKSk7CisgICAgICAgIC8vIGJ1dCBiZSBzdHJpY3QgaW4gcGVkYW50aWMgbW9kZToKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX19wb3MgPCBzaXplKCkpOworCV9NX2xlYWsoKTsKKwlyZXR1cm4gX01fZGF0YSgpW19fcG9zXTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSAlc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX24gVGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgdG8gYWNjZXNzLgorICAgICAgICogIEByZXR1cm4gIFJlYWQtb25seSAoY29uc3QpIHJlZmVyZW5jZSB0byB0aGUgY2hhcmFjdGVyLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIG4gaXMgYW4gaW52YWxpZCBpbmRleC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBmb3Igc2FmZXIgZGF0YSBhY2Nlc3MuICBUaGUgcGFyYW1ldGVyIGlzCisgICAgICAgKiAgZmlyc3QgY2hlY2tlZCB0aGF0IGl0IGlzIGluIHRoZSByYW5nZSBvZiB0aGUgc3RyaW5nLiAgVGhlIGZ1bmN0aW9uCisgICAgICAgKiAgdGhyb3dzIG91dF9vZl9yYW5nZSBpZiB0aGUgY2hlY2sgZmFpbHMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgYXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsKKwlpZiAoX19uID49IHRoaXMtPnNpemUoKSkKKwkgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiYmFzaWNfc3RyaW5nOjphdCIpKTsKKwlyZXR1cm4gX01fZGF0YSgpW19fbl07CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJXN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19uIFRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIHRvIGFjY2Vzcy4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgY2hhcmFjdGVyLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIG4gaXMgYW4gaW52YWxpZCBpbmRleC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBmb3Igc2FmZXIgZGF0YSBhY2Nlc3MuICBUaGUgcGFyYW1ldGVyIGlzCisgICAgICAgKiAgZmlyc3QgY2hlY2tlZCB0aGF0IGl0IGlzIGluIHRoZSByYW5nZSBvZiB0aGUgc3RyaW5nLiAgVGhlIGZ1bmN0aW9uCisgICAgICAgKiAgdGhyb3dzIG91dF9vZl9yYW5nZSBpZiB0aGUgY2hlY2sgZmFpbHMuICBTdWNjZXNzIHJlc3VsdHMgaW4KKyAgICAgICAqICB1bnNoYXJpbmcgdGhlIHN0cmluZy4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBhdChzaXplX3R5cGUgX19uKQorICAgICAgeworCWlmIChfX24gPj0gc2l6ZSgpKQorCSAgX190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJiYXNpY19zdHJpbmc6OmF0IikpOworCV9NX2xlYWsoKTsKKwlyZXR1cm4gX01fZGF0YSgpW19fbl07CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJXN0cmluZy4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBmcm9udCgpCisgICAgICB7IHJldHVybiBvcGVyYXRvcltdKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJXN0cmluZy4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBmcm9udCgpIGNvbnN0CisgICAgICB7IHJldHVybiBvcGVyYXRvcltdKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgbGFzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICVzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgYmFjaygpCisgICAgICB7IHJldHVybiBvcGVyYXRvcltdKHRoaXMtPnNpemUoKSAtIDEpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlCisgICAgICAgKiAgbGFzdCBlbGVtZW50IG9mIHRoZSAlc3RyaW5nLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGJhY2soKSBjb25zdAorICAgICAgeyByZXR1cm4gb3BlcmF0b3JbXSh0aGlzLT5zaXplKCkgLSAxKTsgfQorI2VuZGlmCisKKyAgICAgIC8vIE1vZGlmaWVyczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGEgc3RyaW5nIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgVGhlIHN0cmluZyB0byBhcHBlbmQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBvcGVyYXRvcis9KGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpCisgICAgICB7IHJldHVybiB0aGlzLT5hcHBlbmQoX19zdHIpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgVGhlIEMgc3RyaW5nIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIG9wZXJhdG9yKz0oY29uc3QgX0NoYXJUKiBfX3MpCisgICAgICB7IHJldHVybiB0aGlzLT5hcHBlbmQoX19zKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhcmFjdGVyIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIG9wZXJhdG9yKz0oX0NoYXJUIF9fYykKKyAgICAgIHsgCisJdGhpcy0+cHVzaF9iYWNrKF9fYyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBlbmQgYW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX2wgIFRoZSBpbml0aWFsaXplcl9saXN0IG9mIGNoYXJhY3RlcnMgdG8gYmUgYXBwZW5kZWQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBvcGVyYXRvcis9KGluaXRpYWxpemVyX2xpc3Q8X0NoYXJUPiBfX2wpCisgICAgICB7IHJldHVybiB0aGlzLT5hcHBlbmQoX19sLmJlZ2luKCksIF9fbC5zaXplKCkpOyB9CisjZW5kaWYgLy8gQysrMTEKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBlbmQgYSBzdHJpbmcgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBUaGUgc3RyaW5nIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGFwcGVuZChjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBlbmQgYSBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBUaGUgc3RyaW5nIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2Ygc3RyIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcGFyYW0gX19uICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYXBwZW5kLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlIGlmIEBhIF9fcG9zIGlzIG5vdCBhIHZhbGlkIGluZGV4LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGFwcGVuZHMgQGEgX19uIGNoYXJhY3RlcnMgZnJvbSBAYSBfX3N0cgorICAgICAgICogIHN0YXJ0aW5nIGF0IEBhIF9fcG9zIHRvIHRoaXMgc3RyaW5nLiAgSWYgQGEgX19uIGlzIGlzIGxhcmdlcgorICAgICAgICogIHRoYW4gdGhlIG51bWJlciBvZiBhdmFpbGFibGUgY2hhcmFjdGVycyBpbiBAYSBfX3N0ciwgdGhlCisgICAgICAgKiAgcmVtYWluZGVyIG9mIEBhIF9fc3RyIGlzIGFwcGVuZGVkLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBhcHBlbmQoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBlbmQgYSBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBUaGUgQyBzdHJpbmcgdG8gYXBwZW5kLgorICAgICAgICogIEBwYXJhbSBfX24gIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBhcHBlbmQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIFRoZSBDIHN0cmluZyB0byBhcHBlbmQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX3MpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiB0aGlzLT5hcHBlbmQoX19zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBtdWx0aXBsZSBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX24gIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBhcHBlbmQuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgVGhlIGNoYXJhY3RlciB0byB1c2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBBcHBlbmRzIF9fbiBjb3BpZXMgb2YgX19jIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBhcHBlbmQoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYyk7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhbiBpbml0aWFsaXplcl9saXN0IG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIF9fbCAgVGhlIGluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycyB0byBhcHBlbmQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBhcHBlbmQoaW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFwcGVuZChfX2wuYmVnaW4oKSwgX19sLnNpemUoKSk7IH0KKyNlbmRpZiAvLyBDKysxMQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhIHJhbmdlIG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIF9fZmlyc3QgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gYXBwZW5kLgorICAgICAgICogIEBwYXJhbSBfX2xhc3QgIEl0ZXJhdG9yIG1hcmtpbmcgdGhlIGVuZCBvZiB0aGUgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBBcHBlbmRzIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtfX2ZpcnN0LF9fbGFzdCkgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBiYXNpY19zdHJpbmcmCisgICAgICAgIGFwcGVuZChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX01faWVuZCgpLCBfTV9pZW5kKCksIF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBlbmQgYSBzaW5nbGUgY2hhcmFjdGVyLgorICAgICAgICogIEBwYXJhbSBfX2MgIENoYXJhY3RlciB0byBhcHBlbmQuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfYmFjayhfQ2hhclQgX19jKQorICAgICAgeyAKKwljb25zdCBzaXplX3R5cGUgX19sZW4gPSAxICsgdGhpcy0+c2l6ZSgpOworCWlmIChfX2xlbiA+IHRoaXMtPmNhcGFjaXR5KCkgfHwgX01fcmVwKCktPl9NX2lzX3NoYXJlZCgpKQorCSAgdGhpcy0+cmVzZXJ2ZShfX2xlbik7CisJdHJhaXRzX3R5cGU6OmFzc2lnbihfTV9kYXRhKClbdGhpcy0+c2l6ZSgpXSwgX19jKTsKKwlfTV9yZXAoKS0+X01fc2V0X2xlbmd0aF9hbmRfc2hhcmFibGUoX19sZW4pOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldCB2YWx1ZSB0byBjb250ZW50cyBvZiBhbm90aGVyIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBTb3VyY2Ugc3RyaW5nIHRvIHVzZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGFzc2lnbihjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIGNvbnRlbnRzIG9mIGFub3RoZXIgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19zdHIgIFNvdXJjZSBzdHJpbmcgdG8gdXNlLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoaXMgc3RyaW5nIHRvIHRoZSBleGFjdCBjb250ZW50cyBvZiBAYSBfX3N0ci4KKyAgICAgICAqICBAYSBfX3N0ciBpcyBhIHZhbGlkLCBidXQgdW5zcGVjaWZpZWQgc3RyaW5nLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBhc3NpZ24oYmFzaWNfc3RyaW5nJiYgX19zdHIpCisgICAgICB7CisJdGhpcy0+c3dhcChfX3N0cik7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmIC8vIEMrKzExCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIGEgc3Vic3RyaW5nIG9mIGEgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgVGhlIHN0cmluZyB0byB1c2UuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHN0ci4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgaWYgQGEgcG9zIGlzIG5vdCBhIHZhbGlkIGluZGV4LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhpcyBzdHJpbmcgdG8gdGhlIHN1YnN0cmluZyBvZiBAYSBfX3N0cgorICAgICAgICogIGNvbnNpc3Rpbmcgb2YgQGEgX19uIGNoYXJhY3RlcnMgYXQgQGEgX19wb3MuICBJZiBAYSBfX24gaXMKKyAgICAgICAqICBpcyBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjaGFyYWN0ZXJzIGluIEBhCisgICAgICAgKiAgX19zdHIsIHRoZSByZW1haW5kZXIgb2YgQGEgX19zdHIgaXMgdXNlZC4KKyAgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgYXNzaWduKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihfX3N0ci5fTV9kYXRhKCkKKwkJCSAgICArIF9fc3RyLl9NX2NoZWNrKF9fcG9zLCAiYmFzaWNfc3RyaW5nOjphc3NpZ24iKSwKKwkJCSAgICBfX3N0ci5fTV9saW1pdChfX3BvcywgX19uKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gYSBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBUaGUgQyBzdHJpbmcgdG8gdXNlLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHVzZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdmFsdWUgb2YgdGhpcyBzdHJpbmcgdG8gdGhlIGZpcnN0IEBhIF9fbgorICAgICAgICogIGNoYXJhY3RlcnMgb2YgQGEgX19zLiAgSWYgQGEgX19uIGlzIGlzIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YKKyAgICAgICAqICBhdmFpbGFibGUgY2hhcmFjdGVycyBpbiBAYSBfX3MsIHRoZSByZW1haW5kZXIgb2YgQGEgX19zIGlzIHVzZWQuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbik7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIGNvbnRlbnRzIG9mIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgVGhlIEMgc3RyaW5nIHRvIHVzZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdmFsdWUgb2YgdGhpcyBzdHJpbmcgdG8gdGhlIHZhbHVlIG9mIEBhIF9fcy4KKyAgICAgICAqICBUaGUgZGF0YSBpcyBjb3BpZWQsIHNvIHRoZXJlIGlzIG5vIGRlcGVuZGVuY2Ugb24gQGEgX19zIG9uY2UgdGhlCisgICAgICAgKiAgZnVuY3Rpb24gcmV0dXJucy4KKyAgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgYXNzaWduKGNvbnN0IF9DaGFyVCogX19zKQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKwlyZXR1cm4gdGhpcy0+YXNzaWduKF9fcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gbXVsdGlwbGUgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19uICBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgVGhlIGNoYXJhY3RlciB0byB1c2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHZhbHVlIG9mIHRoaXMgc3RyaW5nIHRvIEBhIF9fbiBjb3BpZXMgb2YKKyAgICAgICAqICBjaGFyYWN0ZXIgQGEgX19jLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykKKyAgICAgIHsgcmV0dXJuIF9NX3JlcGxhY2VfYXV4KHNpemVfdHlwZSgwKSwgdGhpcy0+c2l6ZSgpLCBfX24sIF9fYyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gYSByYW5nZSBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX2ZpcnN0ICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcGFyYW0gX19sYXN0ICBJdGVyYXRvciBtYXJraW5nIHRoZSBlbmQgb2YgdGhlIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgU2V0cyB2YWx1ZSBvZiBzdHJpbmcgdG8gY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW19fZmlyc3QsX19sYXN0KS4KKyAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7IHJldHVybiB0aGlzLT5yZXBsYWNlKF9NX2liZWdpbigpLCBfTV9pZW5kKCksIF9fZmlyc3QsIF9fbGFzdCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIGFuIGluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19sICBUaGUgaW5pdGlhbGl6ZXJfbGlzdCBvZiBjaGFyYWN0ZXJzIHRvIGFzc2lnbi4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGFzc2lnbihpbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sKQorICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKF9fbC5iZWdpbigpLCBfX2wuc2l6ZSgpKTsgfQorI2VuZGlmIC8vIEMrKzExCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IG11bHRpcGxlIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIF9fcCAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgbG9jYXRpb24gaW4gc3RyaW5nIHRvIGluc2VydCBhdC4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBpbnNlcnQKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhcmFjdGVyIHRvIGluc2VydC4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0cyBAYSBfX24gY29waWVzIG9mIGNoYXJhY3RlciBAYSBfX2Mgc3RhcnRpbmcgYXQgdGhlCisgICAgICAgKiAgcG9zaXRpb24gcmVmZXJlbmNlZCBieSBpdGVyYXRvciBAYSBfX3AuICBJZiBhZGRpbmcKKyAgICAgICAqICBjaGFyYWN0ZXJzIGNhdXNlcyB0aGUgbGVuZ3RoIHRvIGV4Y2VlZCBtYXhfc2l6ZSgpLAorICAgICAgICogIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0CisgICAgICAgKiAgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgICAgewl0aGlzLT5yZXBsYWNlKF9fcCwgX19wLCBfX24sIF9fYyk7ICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IGEgcmFuZ2Ugb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19wICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX2JlZyAgU3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9fZW5kICBFbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIEluc2VydHMgY2hhcmFjdGVycyBpbiByYW5nZSBbX19iZWcsX19lbmQpLiAgSWYgYWRkaW5nCisgICAgICAgKiAgY2hhcmFjdGVycyBjYXVzZXMgdGhlIGxlbmd0aCB0byBleGNlZWQgbWF4X3NpemUoKSwKKyAgICAgICAqICBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndAorICAgICAgICogIGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgX0lucHV0SXRlcmF0b3IgX19iZWcsIF9JbnB1dEl0ZXJhdG9yIF9fZW5kKQorICAgICAgICB7IHRoaXMtPnJlcGxhY2UoX19wLCBfX3AsIF9fYmVnLCBfX2VuZCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IGFuIGluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19wICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX2wgIFRoZSBpbml0aWFsaXplcl9saXN0IG9mIGNoYXJhY3RlcnMgdG8gaW5zZXJ0LgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wLCBpbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfX3AgPj0gX01faWJlZ2luKCkgJiYgX19wIDw9IF9NX2llbmQoKSk7CisJdGhpcy0+aW5zZXJ0KF9fcCAtIF9NX2liZWdpbigpLCBfX2wuYmVnaW4oKSwgX19sLnNpemUoKSk7CisgICAgICB9CisjZW5kaWYgLy8gQysrMTEKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgdmFsdWUgb2YgYSBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zMSAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgbG9jYXRpb24gaW4gc3RyaW5nIHRvIGluc2VydCBhdC4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFRoZSBzdHJpbmcgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0cyB2YWx1ZSBvZiBAYSBfX3N0ciBzdGFydGluZyBhdCBAYSBfX3BvczEuICBJZiBhZGRpbmcKKyAgICAgICAqICBjaGFyYWN0ZXJzIGNhdXNlcyB0aGUgbGVuZ3RoIHRvIGV4Y2VlZCBtYXhfc2l6ZSgpLAorICAgICAgICogIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0CisgICAgICAgKiAgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmluc2VydChfX3BvczEsIF9fc3RyLCBzaXplX3R5cGUoMCksIF9fc3RyLnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgYSBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zMSAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgbG9jYXRpb24gaW4gc3RyaW5nIHRvIGluc2VydCBhdC4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFRoZSBzdHJpbmcgdG8gaW5zZXJ0LgorICAgICAgICogIEBwYXJhbSBfX3BvczIgIFN0YXJ0IG9mIGNoYXJhY3RlcnMgaW4gc3RyIHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIHBvczEgPiBzaXplKCkgb3IKKyAgICAgICAqICBAYSBfX3BvczIgPiBAYSBzdHIuc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBhdCBAYSBwb3MxLCBpbnNlcnQgQGEgX19uIGNoYXJhY3RlciBvZiBAYSBfX3N0cgorICAgICAgICogIGJlZ2lubmluZyB3aXRoIEBhIF9fcG9zMi4gIElmIGFkZGluZyBjaGFyYWN0ZXJzIGNhdXNlcyB0aGUKKyAgICAgICAqICBsZW5ndGggdG8gZXhjZWVkIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBJZiBAYQorICAgICAgICogIF9fcG9zMSBpcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGlzIHN0cmluZyBvciBAYSBfX3BvczIgaXMKKyAgICAgICAqICBiZXlvbmQgdGhlIGVuZCBvZiBAYSBfX3N0ciwgb3V0X29mX3JhbmdlIGlzIHRocm93bi4gIFRoZQorICAgICAgICogIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGluc2VydChzaXplX3R5cGUgX19wb3MxLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLAorCSAgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmluc2VydChfX3BvczEsIF9fc3RyLl9NX2RhdGEoKQorCQkJICAgICsgX19zdHIuX01fY2hlY2soX19wb3MyLCAiYmFzaWNfc3RyaW5nOjppbnNlcnQiKSwKKwkJCSAgICBfX3N0ci5fTV9saW1pdChfX3BvczIsIF9fbikpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IGEgQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX3MgIFRoZSBDIHN0cmluZyB0byBpbnNlcnQuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19wb3MgaXMgYmV5b25kIHRoZSBlbmQgb2YgdGhpcworICAgICAgICogIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0cyB0aGUgZmlyc3QgQGEgX19uIGNoYXJhY3RlcnMgb2YgQGEgX19zIHN0YXJ0aW5nIGF0IEBhCisgICAgICAgKiAgX19wb3MuICBJZiBhZGRpbmcgY2hhcmFjdGVycyBjYXVzZXMgdGhlIGxlbmd0aCB0byBleGNlZWQKKyAgICAgICAqICBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgSWYgQGEgX19wb3MgaXMgYmV5b25kCisgICAgICAgKiAgZW5kKCksIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZworICAgICAgICogIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbik7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX3MgIFRoZSBDIHN0cmluZyB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIHBvcyBpcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGlzCisgICAgICAgKiAgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRzIHRoZSBmaXJzdCBAYSBuIGNoYXJhY3RlcnMgb2YgQGEgX19zIHN0YXJ0aW5nIGF0IEBhIF9fcG9zLiAgSWYKKyAgICAgICAqICBhZGRpbmcgY2hhcmFjdGVycyBjYXVzZXMgdGhlIGxlbmd0aCB0byBleGNlZWQgbWF4X3NpemUoKSwKKyAgICAgICAqICBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgSWYgQGEgX19wb3MgaXMgYmV5b25kIGVuZCgpLCBvdXRfb2ZfcmFuZ2UgaXMKKyAgICAgICAqICB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcworICAgICAgICogIHRocm93bi4KKyAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQ2hhclQqIF9fcykKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPmluc2VydChfX3BvcywgX19zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCBtdWx0aXBsZSBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggaW4gc3RyaW5nIHRvIGluc2VydCBhdC4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBpbnNlcnQKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhcmFjdGVyIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19wb3MgaXMgYmV5b25kIHRoZSBlbmQgb2YgdGhpcworICAgICAgICogIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0cyBAYSBfX24gY29waWVzIG9mIGNoYXJhY3RlciBAYSBfX2Mgc3RhcnRpbmcgYXQgaW5kZXgKKyAgICAgICAqICBAYSBfX3Bvcy4gIElmIGFkZGluZyBjaGFyYWN0ZXJzIGNhdXNlcyB0aGUgbGVuZ3RoIHRvIGV4Y2VlZAorICAgICAgICogIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBJZiBAYSBfX3BvcyA+IGxlbmd0aCgpLAorICAgICAgICogIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0CisgICAgICAgKiAgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgICAgeyByZXR1cm4gX01fcmVwbGFjZV9hdXgoX01fY2hlY2soX19wb3MsICJiYXNpY19zdHJpbmc6Omluc2VydCIpLAorCQkJICAgICAgc2l6ZV90eXBlKDApLCBfX24sIF9fYyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgb25lIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gX19wICBJdGVyYXRvciByZWZlcmVuY2luZyBwb3NpdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyYWN0ZXIgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIG5ld2x5IGluc2VydGVkIGNoYXIuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIEluc2VydHMgY2hhcmFjdGVyIEBhIF9fYyBhdCBwb3NpdGlvbiByZWZlcmVuY2VkIGJ5IEBhIF9fcC4KKyAgICAgICAqICBJZiBhZGRpbmcgY2hhcmFjdGVyIGNhdXNlcyB0aGUgbGVuZ3RoIHRvIGV4Y2VlZCBtYXhfc2l6ZSgpLAorICAgICAgICogIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBJZiBAYSBfX3AgaXMgYmV5b25kIGVuZCBvZiBzdHJpbmcsCisgICAgICAgKiAgb3V0X29mX3JhbmdlIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QKKyAgICAgICAqICBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wLCBfQ2hhclQgX19jKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfX3AgPj0gX01faWJlZ2luKCkgJiYgX19wIDw9IF9NX2llbmQoKSk7CisJY29uc3Qgc2l6ZV90eXBlIF9fcG9zID0gX19wIC0gX01faWJlZ2luKCk7CisJX01fcmVwbGFjZV9hdXgoX19wb3MsIHNpemVfdHlwZSgwKSwgc2l6ZV90eXBlKDEpLCBfX2MpOworCV9NX3JlcCgpLT5fTV9zZXRfbGVha2VkKCk7CisJcmV0dXJuIGl0ZXJhdG9yKF9NX2RhdGEoKSArIF9fcG9zKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmUgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byByZW1vdmUgKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVtb3ZlIChkZWZhdWx0IHJlbWFpbmRlcikuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIHBvcyBpcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGlzCisgICAgICAgKiAgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIEBhIF9fbiBjaGFyYWN0ZXJzIGZyb20gdGhpcyBzdHJpbmcgc3RhcnRpbmcgYXQgQGEKKyAgICAgICAqICBfX3Bvcy4gIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBpcyByZWR1Y2VkIGJ5IEBhIF9fbi4gIElmCisgICAgICAgKiAgdGhlcmUgYXJlIDwgQGEgX19uIGNoYXJhY3RlcnMgdG8gcmVtb3ZlLCB0aGUgcmVtYWluZGVyIG9mCisgICAgICAgKiAgdGhlIHN0cmluZyBpcyB0cnVuY2F0ZWQuICBJZiBAYSBfX3AgaXMgYmV5b25kIGVuZCBvZiBzdHJpbmcsCisgICAgICAgKiAgb3V0X29mX3JhbmdlIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QKKyAgICAgICAqICBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGVyYXNlKHNpemVfdHlwZSBfX3BvcyA9IDAsIHNpemVfdHlwZSBfX24gPSBucG9zKQorICAgICAgeyAKKwlfTV9tdXRhdGUoX01fY2hlY2soX19wb3MsICJiYXNpY19zdHJpbmc6OmVyYXNlIiksCisJCSAgX01fbGltaXQoX19wb3MsIF9fbiksIHNpemVfdHlwZSgwKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBvbmUgY2hhcmFjdGVyLgorICAgICAgICogIEBwYXJhbSBfX3Bvc2l0aW9uICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgY2hhcmFjdGVyIHRvIHJlbW92ZS4KKyAgICAgICAqICBAcmV0dXJuICBpdGVyYXRvciByZWZlcmVuY2luZyBzYW1lIGxvY2F0aW9uIGFmdGVyIHJlbW92YWwuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlciBhdCBAYSBfX3Bvc2l0aW9uIGZyb20gdGhpcyBzdHJpbmcuIFRoZSB2YWx1ZQorICAgICAgICogIG9mIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfX3Bvc2l0aW9uID49IF9NX2liZWdpbigpCisJCQkJICYmIF9fcG9zaXRpb24gPCBfTV9pZW5kKCkpOworCWNvbnN0IHNpemVfdHlwZSBfX3BvcyA9IF9fcG9zaXRpb24gLSBfTV9pYmVnaW4oKTsKKwlfTV9tdXRhdGUoX19wb3MsIHNpemVfdHlwZSgxKSwgc2l6ZV90eXBlKDApKTsKKwlfTV9yZXAoKS0+X01fc2V0X2xlYWtlZCgpOworCXJldHVybiBpdGVyYXRvcihfTV9kYXRhKCkgKyBfX3Bvcyk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIGEgcmFuZ2Ugb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19maXJzdCAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGZpcnN0IGNoYXJhY3RlciB0byByZW1vdmUuCisgICAgICAgKiAgQHBhcmFtIF9fbGFzdCAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGVuZCBvZiB0aGUgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgbG9jYXRpb24gb2YgZmlyc3QgYWZ0ZXIgcmVtb3ZhbC4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW2ZpcnN0LGxhc3QpIGZyb20gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpOworIAorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIHRoZSBsYXN0IGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIHN0cmluZyBtdXN0IGJlIG5vbi1lbXB0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcG9wX2JhY2soKQorICAgICAgeyBlcmFzZShzaXplKCktMSwgMSk7IH0KKyNlbmRpZiAvLyBDKysxMQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgY2hhcmFjdGVycyB3aXRoIHZhbHVlIGZyb20gYW5vdGhlciBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZXBsYWNlZC4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIHBvcyBpcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGlzCisgICAgICAgKiAgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbX19wb3MsX19wb3MrX19uKSBmcm9tCisgICAgICAgKiAgdGhpcyBzdHJpbmcuICBJbiBwbGFjZSwgdGhlIHZhbHVlIG9mIEBhIF9fc3RyIGlzIGluc2VydGVkLgorICAgICAgICogIElmIEBhIF9fcG9zIGlzIGJleW9uZCBlbmQgb2Ygc3RyaW5nLCBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLgorICAgICAgICogIElmIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdCBleGNlZWRzIG1heF9zaXplKCksIGxlbmd0aF9lcnJvcgorICAgICAgICogIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuCisgICAgICAgKiAgZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQorICAgICAgeyByZXR1cm4gdGhpcy0+cmVwbGFjZShfX3BvcywgX19uLCBfX3N0ci5fTV9kYXRhKCksIF9fc3RyLnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIGNoYXJhY3RlcnMgd2l0aCB2YWx1ZSBmcm9tIGFub3RoZXIgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3BvczEgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX24xICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZXBsYWNlZC4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyB0byBpbnNlcnQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zMiAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIG9mIHN0ciB0byB1c2UuCisgICAgICAgKiAgQHBhcmFtIF9fbjIgIE51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gc3RyIHRvIHVzZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19wb3MxID4gc2l6ZSgpIG9yIEBhIF9fcG9zMiA+CisgICAgICAgKiAgX19zdHIuc2l6ZSgpLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbX19wb3MxLF9fcG9zMSArIG4pIGZyb20gdGhpcworICAgICAgICogIHN0cmluZy4gIEluIHBsYWNlLCB0aGUgdmFsdWUgb2YgQGEgX19zdHIgaXMgaW5zZXJ0ZWQuICBJZiBAYSBfX3BvcyBpcworICAgICAgICogIGJleW9uZCBlbmQgb2Ygc3RyaW5nLCBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLiAgSWYgdGhlIGxlbmd0aCBvZiB0aGUKKyAgICAgICAqICByZXN1bHQgZXhjZWVkcyBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZQorICAgICAgICogIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgcmVwbGFjZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwKKwkgICAgICBzaXplX3R5cGUgX19wb3MyLCBzaXplX3R5cGUgX19uMikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19wb3MxLCBfX24xLCBfX3N0ci5fTV9kYXRhKCkKKwkJCSAgICAgKyBfX3N0ci5fTV9jaGVjayhfX3BvczIsICJiYXNpY19zdHJpbmc6OnJlcGxhY2UiKSwKKwkJCSAgICAgX19zdHIuX01fbGltaXQoX19wb3MyLCBfX24yKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIGNoYXJhY3RlcnMgd2l0aCB2YWx1ZSBvZiBhIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9fbjEgIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlcGxhY2VkLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gX19uMiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBAYSBzIHRvIHVzZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgcG9zMSA+IHNpemUoKS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW19fcG9zLF9fcG9zICsgX19uMSkKKyAgICAgICAqICBmcm9tIHRoaXMgc3RyaW5nLiAgSW4gcGxhY2UsIHRoZSBmaXJzdCBAYSBfX24yIGNoYXJhY3RlcnMgb2YKKyAgICAgICAqICBAYSBfX3MgYXJlIGluc2VydGVkLCBvciBhbGwgb2YgQGEgX19zIGlmIEBhIF9fbjIgaXMgdG9vIGxhcmdlLiAgSWYKKyAgICAgICAqICBAYSBfX3BvcyBpcyBiZXlvbmQgZW5kIG9mIHN0cmluZywgb3V0X29mX3JhbmdlIGlzIHRocm93bi4gIElmCisgICAgICAgKiAgdGhlIGxlbmd0aCBvZiByZXN1bHQgZXhjZWVkcyBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMKKyAgICAgICAqICB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvcgorICAgICAgICogIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLAorCSAgICAgIHNpemVfdHlwZSBfX24yKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIGNoYXJhY3RlcnMgd2l0aCB2YWx1ZSBvZiBhIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9fbjEgIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlcGxhY2VkLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgcG9zID4gc2l6ZSgpLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbX19wb3MsX19wb3MgKyBfX24xKQorICAgICAgICogIGZyb20gdGhpcyBzdHJpbmcuICBJbiBwbGFjZSwgdGhlIGNoYXJhY3RlcnMgb2YgQGEgX19zIGFyZQorICAgICAgICogIGluc2VydGVkLiAgSWYgQGEgX19wb3MgaXMgYmV5b25kIGVuZCBvZiBzdHJpbmcsIG91dF9vZl9yYW5nZQorICAgICAgICogIGlzIHRocm93bi4gIElmIHRoZSBsZW5ndGggb2YgcmVzdWx0IGV4Y2VlZHMgbWF4X3NpemUoKSwKKyAgICAgICAqICBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndAorICAgICAgICogIGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcykKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19wb3MsIF9fbjEsIF9fcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIGNoYXJhY3RlcnMgd2l0aCBtdWx0aXBsZSBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9fbjEgIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlcGxhY2VkLgorICAgICAgICogIEBwYXJhbSBfX24yICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBpbnNlcnQuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgQ2hhcmFjdGVyIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19wb3MgPiBzaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtwb3MscG9zICsgbjEpIGZyb20gdGhpcworICAgICAgICogIHN0cmluZy4gIEluIHBsYWNlLCBAYSBfX24yIGNvcGllcyBvZiBAYSBfX2MgYXJlIGluc2VydGVkLgorICAgICAgICogIElmIEBhIF9fcG9zIGlzIGJleW9uZCBlbmQgb2Ygc3RyaW5nLCBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLgorICAgICAgICogIElmIHRoZSBsZW5ndGggb2YgcmVzdWx0IGV4Y2VlZHMgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzCisgICAgICAgKiAgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IKKyAgICAgICAqICBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBzaXplX3R5cGUgX19uMiwgX0NoYXJUIF9fYykKKyAgICAgIHsgcmV0dXJuIF9NX3JlcGxhY2VfYXV4KF9NX2NoZWNrKF9fcG9zLCAiYmFzaWNfc3RyaW5nOjpyZXBsYWNlIiksCisJCQkgICAgICBfTV9saW1pdChfX3BvcywgX19uMSksIF9fbjIsIF9fYyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIHJhbmdlIG9mIGNoYXJhY3RlcnMgd2l0aCBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9faTEgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHN0YXJ0IG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9faTIgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGVuZCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIHZhbHVlIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtfX2kxLF9faTIpLiAgSW4gcGxhY2UsCisgICAgICAgKiAgdGhlIHZhbHVlIG9mIEBhIF9fc3RyIGlzIGluc2VydGVkLiAgSWYgdGhlIGxlbmd0aCBvZiByZXN1bHQKKyAgICAgICAqICBleGNlZWRzIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YKKyAgICAgICAqICB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpCisgICAgICB7IHJldHVybiB0aGlzLT5yZXBsYWNlKF9faTEsIF9faTIsIF9fc3RyLl9NX2RhdGEoKSwgX19zdHIuc2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgcmFuZ2Ugb2YgY2hhcmFjdGVycyB3aXRoIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX2kxICBJdGVyYXRvciByZWZlcmVuY2luZyBzdGFydCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX2kyICBJdGVyYXRvciByZWZlcmVuY2luZyBlbmQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyB2YWx1ZSB0byBpbnNlcnQuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBzIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtfX2kxLF9faTIpLiAgSW4gcGxhY2UsCisgICAgICAgKiAgdGhlIGZpcnN0IEBhIF9fbiBjaGFyYWN0ZXJzIG9mIEBhIF9fcyBhcmUgaW5zZXJ0ZWQuICBJZiB0aGUKKyAgICAgICAqICBsZW5ndGggb2YgcmVzdWx0IGV4Y2VlZHMgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4KKyAgICAgICAqICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcworICAgICAgICogIHRocm93bi4KKyAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfTV9pYmVnaW4oKSA8PSBfX2kxICYmIF9faTEgPD0gX19pMgorCQkJCSAmJiBfX2kyIDw9IF9NX2llbmQoKSk7CisJcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19pMSAtIF9NX2liZWdpbigpLCBfX2kyIC0gX19pMSwgX19zLCBfX24pOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgcmFuZ2Ugb2YgY2hhcmFjdGVycyB3aXRoIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX2kxICBJdGVyYXRvciByZWZlcmVuY2luZyBzdGFydCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX2kyICBJdGVyYXRvciByZWZlcmVuY2luZyBlbmQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyB2YWx1ZSB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbX19pMSxfX2kyKS4gIEluIHBsYWNlLAorICAgICAgICogIHRoZSBjaGFyYWN0ZXJzIG9mIEBhIF9fcyBhcmUgaW5zZXJ0ZWQuICBJZiB0aGUgbGVuZ3RoIG9mCisgICAgICAgKiAgcmVzdWx0IGV4Y2VlZHMgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZQorICAgICAgICogIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgY29uc3QgX0NoYXJUKiBfX3MpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiB0aGlzLT5yZXBsYWNlKF9faTEsIF9faTIsIF9fcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIHJhbmdlIG9mIGNoYXJhY3RlcnMgd2l0aCBtdWx0aXBsZSBjaGFyYWN0ZXJzCisgICAgICAgKiAgQHBhcmFtIF9faTEgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHN0YXJ0IG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9faTIgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGVuZCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gX19jICBDaGFyYWN0ZXIgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW19faTEsX19pMikuICBJbiBwbGFjZSwKKyAgICAgICAqICBAYSBfX24gY29waWVzIG9mIEBhIF9fYyBhcmUgaW5zZXJ0ZWQuICBJZiB0aGUgbGVuZ3RoIG9mCisgICAgICAgKiAgcmVzdWx0IGV4Y2VlZHMgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZQorICAgICAgICogIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX01faWJlZ2luKCkgPD0gX19pMSAmJiBfX2kxIDw9IF9faTIKKwkJCQkgJiYgX19pMiA8PSBfTV9pZW5kKCkpOworCXJldHVybiBfTV9yZXBsYWNlX2F1eChfX2kxIC0gX01faWJlZ2luKCksIF9faTIgLSBfX2kxLCBfX24sIF9fYyk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVwbGFjZSByYW5nZSBvZiBjaGFyYWN0ZXJzIHdpdGggcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faTEgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHN0YXJ0IG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9faTIgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGVuZCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX2sxICBJdGVyYXRvciByZWZlcmVuY2luZyBzdGFydCBvZiByYW5nZSB0byBpbnNlcnQuCisgICAgICAgKiAgQHBhcmFtIF9fazIgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGVuZCBvZiByYW5nZSB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbX19pMSxfX2kyKS4gIEluIHBsYWNlLAorICAgICAgICogIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtfX2sxLF9fazIpIGFyZSBpbnNlcnRlZC4gIElmIHRoZQorICAgICAgICogIGxlbmd0aCBvZiByZXN1bHQgZXhjZWVkcyBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLgorICAgICAgICogIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzCisgICAgICAgKiAgdGhyb3duLgorICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBiYXNpY19zdHJpbmcmCisgICAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwKKwkJX0lucHV0SXRlcmF0b3IgX19rMSwgX0lucHV0SXRlcmF0b3IgX19rMikKKyAgICAgICAgeworCSAgX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9NX2liZWdpbigpIDw9IF9faTEgJiYgX19pMSA8PSBfX2kyCisJCQkJICAgJiYgX19pMiA8PSBfTV9pZW5kKCkpOworCSAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fazEsIF9fazIpOworCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJICByZXR1cm4gX01fcmVwbGFjZV9kaXNwYXRjaChfX2kxLCBfX2kyLCBfX2sxLCBfX2syLCBfSW50ZWdyYWwoKSk7CisJfQorCisgICAgICAvLyBTcGVjaWFsaXphdGlvbnMgZm9yIHRoZSBjb21tb24gY2FzZSBvZiBwb2ludGVyIGFuZCBpdGVyYXRvcjoKKyAgICAgIC8vIHVzZWZ1bCB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgdGVtcG9yYXJ5IGJ1ZmZlcmluZyBpbiBfTV9yZXBsYWNlLgorICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBfQ2hhclQqIF9fazEsIF9DaGFyVCogX19rMikKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX01faWJlZ2luKCkgPD0gX19pMSAmJiBfX2kxIDw9IF9faTIKKwkJCQkgJiYgX19pMiA8PSBfTV9pZW5kKCkpOworCV9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2sxLCBfX2syKTsKKwlyZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kxIC0gX01faWJlZ2luKCksIF9faTIgLSBfX2kxLAorCQkJICAgICBfX2sxLCBfX2syIC0gX19rMSk7CisgICAgICB9CisKKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwKKwkgICAgICBjb25zdCBfQ2hhclQqIF9fazEsIGNvbnN0IF9DaGFyVCogX19rMikKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX01faWJlZ2luKCkgPD0gX19pMSAmJiBfX2kxIDw9IF9faTIKKwkJCQkgJiYgX19pMiA8PSBfTV9pZW5kKCkpOworCV9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2sxLCBfX2syKTsKKwlyZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kxIC0gX01faWJlZ2luKCksIF9faTIgLSBfX2kxLAorCQkJICAgICBfX2sxLCBfX2syIC0gX19rMSk7CisgICAgICB9CisKKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgaXRlcmF0b3IgX19rMSwgaXRlcmF0b3IgX19rMikKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX01faWJlZ2luKCkgPD0gX19pMSAmJiBfX2kxIDw9IF9faTIKKwkJCQkgJiYgX19pMiA8PSBfTV9pZW5kKCkpOworCV9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2sxLCBfX2syKTsKKwlyZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kxIC0gX01faWJlZ2luKCksIF9faTIgLSBfX2kxLAorCQkJICAgICBfX2sxLmJhc2UoKSwgX19rMiAtIF9fazEpOworICAgICAgfQorCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsCisJICAgICAgY29uc3RfaXRlcmF0b3IgX19rMSwgY29uc3RfaXRlcmF0b3IgX19rMikKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX01faWJlZ2luKCkgPD0gX19pMSAmJiBfX2kxIDw9IF9faTIKKwkJCQkgJiYgX19pMiA8PSBfTV9pZW5kKCkpOworCV9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2sxLCBfX2syKTsKKwlyZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kxIC0gX01faWJlZ2luKCksIF9faTIgLSBfX2kxLAorCQkJICAgICBfX2sxLmJhc2UoKSwgX19rMiAtIF9fazEpOworICAgICAgfQorICAgICAgCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIHJhbmdlIG9mIGNoYXJhY3RlcnMgd2l0aCBpbml0aWFsaXplcl9saXN0LgorICAgICAgICogIEBwYXJhbSBfX2kxICBJdGVyYXRvciByZWZlcmVuY2luZyBzdGFydCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX2kyICBJdGVyYXRvciByZWZlcmVuY2luZyBlbmQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19sICBUaGUgaW5pdGlhbGl6ZXJfbGlzdCBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtfX2kxLF9faTIpLiAgSW4gcGxhY2UsCisgICAgICAgKiAgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW19fazEsX19rMikgYXJlIGluc2VydGVkLiAgSWYgdGhlCisgICAgICAgKiAgbGVuZ3RoIG9mIHJlc3VsdCBleGNlZWRzIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uCisgICAgICAgKiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMKKyAgICAgICAqICB0aHJvd24uCisgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsCisJCQkgICAgaW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19pMSwgX19pMiwgX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZiAvLyBDKysxMQorCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnRlZ2VyPgorCWJhc2ljX3N0cmluZyYKKwlfTV9yZXBsYWNlX2Rpc3BhdGNoKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIF9JbnRlZ2VyIF9fbiwKKwkJCSAgICBfSW50ZWdlciBfX3ZhbCwgX190cnVlX3R5cGUpCisgICAgICAgIHsgcmV0dXJuIF9NX3JlcGxhY2VfYXV4KF9faTEgLSBfTV9pYmVnaW4oKSwgX19pMiAtIF9faTEsIF9fbiwgX192YWwpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorCWJhc2ljX3N0cmluZyYKKwlfTV9yZXBsYWNlX2Rpc3BhdGNoKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIF9JbnB1dEl0ZXJhdG9yIF9fazEsCisJCQkgICAgX0lucHV0SXRlcmF0b3IgX19rMiwgX19mYWxzZV90eXBlKTsKKworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgX01fcmVwbGFjZV9hdXgoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIHNpemVfdHlwZSBfX24yLAorCQkgICAgIF9DaGFyVCBfX2MpOworCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBfTV9yZXBsYWNlX3NhZmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLAorCQkgICAgICBzaXplX3R5cGUgX19uMik7CisKKyAgICAgIC8vIF9TX2NvbnN0cnVjdF9hdXggaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIDIxLjMuMSBwYXJhIDE1IHdoaWNoCisgICAgICAvLyByZXF1aXJlcyBzcGVjaWFsIGJlaGF2aW91ciBpZiBfSW5JdGVyIGlzIGFuIGludGVncmFsIHR5cGUKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Jbkl0ZXJhdG9yPgorICAgICAgICBzdGF0aWMgX0NoYXJUKgorICAgICAgICBfU19jb25zdHJ1Y3RfYXV4KF9Jbkl0ZXJhdG9yIF9fYmVnLCBfSW5JdGVyYXRvciBfX2VuZCwKKwkJCSBjb25zdCBfQWxsb2MmIF9fYSwgX19mYWxzZV90eXBlKQorCXsKKyAgICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5JdGVyYXRvcj46Oml0ZXJhdG9yX2NhdGVnb3J5IF9UYWc7CisgICAgICAgICAgcmV0dXJuIF9TX2NvbnN0cnVjdChfX2JlZywgX19lbmQsIF9fYSwgX1RhZygpKTsKKwl9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQzOC4gQW1iaWd1aXR5IGluIHRoZSAiZG8gdGhlIHJpZ2h0IHRoaW5nIiBjbGF1c2UKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnRlZ2VyPgorICAgICAgICBzdGF0aWMgX0NoYXJUKgorICAgICAgICBfU19jb25zdHJ1Y3RfYXV4KF9JbnRlZ2VyIF9fYmVnLCBfSW50ZWdlciBfX2VuZCwKKwkJCSBjb25zdCBfQWxsb2MmIF9fYSwgX190cnVlX3R5cGUpCisgICAgICAgIHsgcmV0dXJuIF9TX2NvbnN0cnVjdF9hdXhfMihzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fYmVnKSwKKwkJCQkgICAgX19lbmQsIF9fYSk7IH0KKworICAgICAgc3RhdGljIF9DaGFyVCoKKyAgICAgIF9TX2NvbnN0cnVjdF9hdXhfMihzaXplX3R5cGUgX19yZXEsIF9DaGFyVCBfX2MsIGNvbnN0IF9BbGxvYyYgX19hKQorICAgICAgeyByZXR1cm4gX1NfY29uc3RydWN0KF9fcmVxLCBfX2MsIF9fYSk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0luSXRlcmF0b3I+CisgICAgICAgIHN0YXRpYyBfQ2hhclQqCisgICAgICAgIF9TX2NvbnN0cnVjdChfSW5JdGVyYXRvciBfX2JlZywgX0luSXRlcmF0b3IgX19lbmQsIGNvbnN0IF9BbGxvYyYgX19hKQorCXsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2lzX2ludGVnZXI8X0luSXRlcmF0b3I+OjpfX3R5cGUgX0ludGVncmFsOworCSAgcmV0dXJuIF9TX2NvbnN0cnVjdF9hdXgoX19iZWcsIF9fZW5kLCBfX2EsIF9JbnRlZ3JhbCgpKTsKKyAgICAgICAgfQorCisgICAgICAvLyBGb3IgSW5wdXQgSXRlcmF0b3JzLCB1c2VkIGluIGlzdHJlYW1idWZfaXRlcmF0b3JzLCBldGMuCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5JdGVyYXRvcj4KKyAgICAgICAgc3RhdGljIF9DaGFyVCoKKyAgICAgICAgIF9TX2NvbnN0cnVjdChfSW5JdGVyYXRvciBfX2JlZywgX0luSXRlcmF0b3IgX19lbmQsIGNvbnN0IF9BbGxvYyYgX19hLAorCQkgICAgICBpbnB1dF9pdGVyYXRvcl90YWcpOworCisgICAgICAvLyBGb3IgZm9yd2FyZF9pdGVyYXRvcnMgdXAgdG8gcmFuZG9tX2FjY2Vzc19pdGVyYXRvcnMsIHVzZWQgZm9yCisgICAgICAvLyBzdHJpbmc6Oml0ZXJhdG9yLCBfQ2hhclQqLCBldGMuCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRndkSXRlcmF0b3I+CisgICAgICAgIHN0YXRpYyBfQ2hhclQqCisgICAgICAgIF9TX2NvbnN0cnVjdChfRndkSXRlcmF0b3IgX19iZWcsIF9Gd2RJdGVyYXRvciBfX2VuZCwgY29uc3QgX0FsbG9jJiBfX2EsCisJCSAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcpOworCisgICAgICBzdGF0aWMgX0NoYXJUKgorICAgICAgX1NfY29uc3RydWN0KHNpemVfdHlwZSBfX3JlcSwgX0NoYXJUIF9fYywgY29uc3QgX0FsbG9jJiBfX2EpOworCisgICAgcHVibGljOgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvcHkgc3Vic3RyaW5nIGludG8gQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgdG8gY29weSB2YWx1ZSBpbnRvLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvcHkuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gY29weS4KKyAgICAgICAqICBAcmV0dXJuICBOdW1iZXIgb2YgY2hhcmFjdGVycyBhY3R1YWxseSBjb3BpZWQKKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBfX3BvcyA+IHNpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgQ29waWVzIHVwIHRvIEBhIF9fbiBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IEBhIF9fcG9zIGludG8gdGhlCisgICAgICAgKiAgQyBzdHJpbmcgQGEgX19zLiAgSWYgQGEgX19wb3MgaXMgJWdyZWF0ZXIgdGhhbiBzaXplKCksCisgICAgICAgKiAgb3V0X29mX3JhbmdlIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNvcHkoX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24sIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN3YXAgY29udGVudHMgd2l0aCBhbm90aGVyIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBTdHJpbmcgdG8gc3dhcCB3aXRoLgorICAgICAgICoKKyAgICAgICAqICBFeGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RyaW5nIHdpdGggdGhhdCBvZiBAYSBfX3MgaW4gY29uc3RhbnQKKyAgICAgICAqICB0aW1lLgorICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoYmFzaWNfc3RyaW5nJiBfX3MpOworCisgICAgICAvLyBTdHJpbmcgb3BlcmF0aW9uczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGNvbnN0IHBvaW50ZXIgdG8gbnVsbC10ZXJtaW5hdGVkIGNvbnRlbnRzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgaGFuZGxlIHRvIGludGVybmFsIGRhdGEuICBEbyBub3QgbW9kaWZ5IG9yIGRpcmUgdGhpbmdzIG1heQorICAgICAgICogIGhhcHBlbi4KKyAgICAgICovCisgICAgICBjb25zdCBfQ2hhclQqCisgICAgICBjX3N0cigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV9kYXRhKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gY29uc3QgcG9pbnRlciB0byBjb250ZW50cy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIGhhbmRsZSB0byBpbnRlcm5hbCBkYXRhLiAgRG8gbm90IG1vZGlmeSBvciBkaXJlIHRoaW5ncyBtYXkKKyAgICAgICAqICBoYXBwZW4uCisgICAgICAqLworICAgICAgY29uc3QgX0NoYXJUKgorICAgICAgZGF0YSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV9kYXRhKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gY29weSBvZiBhbGxvY2F0b3IgdXNlZCB0byBjb25zdHJ1Y3QgdGhpcyBzdHJpbmcuCisgICAgICAqLworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fZGF0YXBsdXM7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gQGEgcyB0byBzZWFyY2ggZm9yLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIHN0YXJ0IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIHRoZSBmaXJzdCBAYQorICAgICAgICogIF9fbiBjaGFyYWN0ZXJzIGluIEBhIF9fcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwKKyAgICAgICAqICByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCBiZWdpbnMuICBJZiBub3QgZm91bmQsIHJldHVybnMKKyAgICAgICAqICBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggZnJvbSAoZGVmYXVsdCAwKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBzdGFydCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBmb3J3YXJkIGZvciB2YWx1ZSBvZiBAYSBfX3N0ciB3aXRoaW4KKyAgICAgICAqICB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCBiZWdpbnMuICBJZiBub3QKKyAgICAgICAqICBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZChjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorCV9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5maW5kKF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIHN0YXJ0IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIHRoZSB2YWx1ZSBvZiBAYQorICAgICAgICogIF9fcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUKKyAgICAgICAqICBpdCBiZWdpbnMuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiB0aGlzLT5maW5kKF9fcywgX19wb3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gX19jICBDaGFyYWN0ZXIgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIEBhIF9fYyB3aXRoaW4KKyAgICAgICAqICB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMKKyAgICAgICAqICBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBTdHJpbmcgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20gKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBzdGFydCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciB2YWx1ZSBvZiBAYQorICAgICAgICogIF9fc3RyIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZQorICAgICAgICogIGl0IGJlZ2lucy4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgcmZpbmQoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKKwlfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+cmZpbmQoX19zdHIuZGF0YSgpLCBfX3BvcywgX19zdHIuc2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggYmFjayBmcm9tLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gcyB0byBzZWFyY2ggZm9yLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIHN0YXJ0IG9mIGxhc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIHRoZSBmaXJzdCBAYQorICAgICAgICogIF9fbiBjaGFyYWN0ZXJzIGluIEBhIF9fcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwKKyAgICAgICAqICByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCBiZWdpbnMuICBJZiBub3QgZm91bmQsIHJldHVybnMKKyAgICAgICAqICBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgcmZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHN0YXJ0IHNlYXJjaCBhdCAoZGVmYXVsdCBlbmQpLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIHN0YXJ0IG9mICBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciB0aGUgdmFsdWUgb2YKKyAgICAgICAqICBAYSBfX3Mgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4CisgICAgICAgKiAgd2hlcmUgaXQgYmVnaW5zLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICByZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPnJmaW5kKF9fcywgX19wb3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyLgorICAgICAgICogIEBwYXJhbSBfX2MgIENoYXJhY3RlciB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbSAoZGVmYXVsdCBlbmQpLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGxhc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIEBhIF9fYyB3aXRoaW4KKyAgICAgICAqICB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMKKyAgICAgICAqICBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgcmZpbmQoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQ7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIGNoYXJhY3RlciBvZiBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBTdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggZnJvbSAoZGVmYXVsdCAwKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBmb3J3YXJkIGZvciBvbmUgb2YgdGhlCisgICAgICAgKiAgY2hhcmFjdGVycyBvZiBAYSBfX3N0ciB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwKKyAgICAgICAqICByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMKKyAgICAgICAqICBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9maXJzdF9vZihjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorCV9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5maW5kX2ZpcnN0X29mKF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG9mIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIFN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gcyB0byBzZWFyY2ggZm9yLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIG9uZSBvZiB0aGUKKyAgICAgICAqICBmaXJzdCBAYSBfX24gY2hhcmFjdGVycyBvZiBAYSBfX3Mgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYKKyAgICAgICAqICBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLAorICAgICAgICogIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfZmlyc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIGNoYXJhY3RlciBvZiBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBTdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggZnJvbSAoZGVmYXVsdCAwKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBmb3J3YXJkIGZvciBvbmUgb2YgdGhlCisgICAgICAgKiAgY2hhcmFjdGVycyBvZiBAYSBfX3Mgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMKKyAgICAgICAqICB0aGUgaW5kZXggd2hlcmUgaXQgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2ZpcnN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKwlyZXR1cm4gdGhpcy0+ZmluZF9maXJzdF9vZihfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgQ2hhcmFjdGVyIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggZnJvbSAoZGVmYXVsdCAwKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBmb3J3YXJkIGZvciB0aGUgY2hhcmFjdGVyCisgICAgICAgKiAgQGEgX19jIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleAorICAgICAgICogIHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiBlcXVpdmFsZW50IHRvIGZpbmQoX19jLCBfX3BvcykuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2ZpcnN0X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5maW5kKF9fYywgX19wb3MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG9mIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20gKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciBvbmUgb2YgdGhlCisgICAgICAgKiAgY2hhcmFjdGVycyBvZiBAYSBfX3N0ciB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwKKyAgICAgICAqICByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMKKyAgICAgICAqICBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9sYXN0X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CisJX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmZpbmRfbGFzdF9vZihfX3N0ci5kYXRhKCksIF9fcG9zLCBfX3N0ci5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG9mIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbS4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHMgdG8gc2VhcmNoIGZvci4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciBvbmUgb2YgdGhlCisgICAgICAgKiAgZmlyc3QgQGEgX19uIGNoYXJhY3RlcnMgb2YgQGEgX19zIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmCisgICAgICAgKiAgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwKKyAgICAgICAqICByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2xhc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG9mIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbSAoZGVmYXVsdCBlbmQpLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGxhc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIG9uZSBvZiB0aGUKKyAgICAgICAqICBjaGFyYWN0ZXJzIG9mIEBhIF9fcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucworICAgICAgICogIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfbGFzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPmZpbmRfbGFzdF9vZihfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gX19jICBDaGFyYWN0ZXIgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20gKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciBAYSBfX2Mgd2l0aGluCisgICAgICAgKiAgdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgd2FzCisgICAgICAgKiAgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogZXF1aXZhbGVudCB0byByZmluZChfX2MsIF9fcG9zKS4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfbGFzdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+cmZpbmQoX19jLCBfX3Bvcyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG5vdCBpbiBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBTdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGF2b2lkLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIGEgY2hhcmFjdGVyIG5vdCBjb250YWluZWQKKyAgICAgICAqICBpbiBAYSBfX3N0ciB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQKKyAgICAgICAqICB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisJX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmZpbmRfZmlyc3Rfbm90X29mKF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG5vdCBpbiBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gYXZvaWQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20uCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBfX3MgdG8gY29uc2lkZXIuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3IgYSBjaGFyYWN0ZXIgbm90CisgICAgICAgKiAgY29udGFpbmVkIGluIHRoZSBmaXJzdCBAYSBfX24gY2hhcmFjdGVycyBvZiBAYSBfX3Mgd2l0aGluCisgICAgICAgKiAgdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgd2FzCisgICAgICAgKiAgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsCisJCQlzaXplX3R5cGUgX19uKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG5vdCBpbiBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gYXZvaWQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20gKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3IgYSBjaGFyYWN0ZXIgbm90CisgICAgICAgKiAgY29udGFpbmVkIGluIEBhIF9fcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucworICAgICAgICogIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKwlyZXR1cm4gdGhpcy0+ZmluZF9maXJzdF9ub3Rfb2YoX19zLCBfX3BvcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgZGlmZmVyZW50IGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gX19jICBDaGFyYWN0ZXIgdG8gYXZvaWQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20gKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3IgYSBjaGFyYWN0ZXIKKyAgICAgICAqICBvdGhlciB0aGFuIEBhIF9fYyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUKKyAgICAgICAqICBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfZmlyc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisJX0dMSUJDWFhfTk9FWENFUFQ7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG5vdCBpbiBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBTdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGF2b2lkLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20gKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciBhIGNoYXJhY3RlcgorICAgICAgICogIG5vdCBjb250YWluZWQgaW4gQGEgX19zdHIgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsCisgICAgICAgKiAgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zCisgICAgICAgKiAgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKKwlfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+ZmluZF9sYXN0X25vdF9vZihfX3N0ci5kYXRhKCksIF9fcG9zLCBfX3N0ci5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG5vdCBpbiBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gYXZvaWQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbS4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHMgdG8gY29uc2lkZXIuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgYSBjaGFyYWN0ZXIgbm90CisgICAgICAgKiAgY29udGFpbmVkIGluIHRoZSBmaXJzdCBAYSBfX24gY2hhcmFjdGVycyBvZiBAYSBfX3Mgd2l0aGluIHRoaXMgc3RyaW5nLgorICAgICAgICogIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsCisgICAgICAgKiAgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9sYXN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLAorCQkgICAgICAgc2l6ZV90eXBlIF9fbikgY29uc3Q7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIGNoYXJhY3RlciBub3QgaW4gQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGF2b2lkLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20gKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciBhIGNoYXJhY3RlcgorICAgICAgICogIG5vdCBjb250YWluZWQgaW4gQGEgX19zIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLAorICAgICAgICogIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucworICAgICAgICogIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKwlyZXR1cm4gdGhpcy0+ZmluZF9sYXN0X25vdF9vZihfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIGRpZmZlcmVudCBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgQ2hhcmFjdGVyIHRvIGF2b2lkLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20gKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciBhIGNoYXJhY3RlciBvdGhlciB0aGFuCisgICAgICAgKiAgQGEgX19jIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMKKyAgICAgICAqICBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9sYXN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorCV9HTElCQ1hYX05PRVhDRVBUOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEdldCBhIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciAoZGVmYXVsdCAwKS4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiBzdWJzdHJpbmcgKGRlZmF1bHQgcmVtYWluZGVyKS4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgbmV3IHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBfX3BvcyA+IHNpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgQ29uc3RydWN0IGFuZCByZXR1cm4gYSBuZXcgc3RyaW5nIHVzaW5nIHRoZSBAYSBfX24KKyAgICAgICAqICBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IEBhIF9fcG9zLiAgSWYgdGhlIHN0cmluZyBpcyB0b28KKyAgICAgICAqICBzaG9ydCwgdXNlIHRoZSByZW1haW5kZXIgb2YgdGhlIGNoYXJhY3RlcnMuICBJZiBAYSBfX3BvcyBpcworICAgICAgICogIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nCisgICAgICBzdWJzdHIoc2l6ZV90eXBlIF9fcG9zID0gMCwgc2l6ZV90eXBlIF9fbiA9IG5wb3MpIGNvbnN0CisgICAgICB7IHJldHVybiBiYXNpY19zdHJpbmcoKnRoaXMsCisJCQkgICAgX01fY2hlY2soX19wb3MsICJiYXNpY19zdHJpbmc6OnN1YnN0ciIpLCBfX24pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29tcGFyZSB0byBhIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHJldHVybiAgSW50ZWdlciA8IDAsIDAsIG9yID4gMC4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhbiBpbnRlZ2VyIDwgMCBpZiB0aGlzIHN0cmluZyBpcyBvcmRlcmVkIGJlZm9yZSBAYQorICAgICAgICogIF9fc3RyLCAwIGlmIHRoZWlyIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgb3IgPiAwIGlmIHRoaXMKKyAgICAgICAqICBzdHJpbmcgaXMgb3JkZXJlZCBhZnRlciBAYSBfX3N0ci4gIERldGVybWluZXMgdGhlIGVmZmVjdGl2ZQorICAgICAgICogIGxlbmd0aCBybGVuIG9mIHRoZSBzdHJpbmdzIHRvIGNvbXBhcmUgYXMgdGhlIHNtYWxsZXN0IG9mCisgICAgICAgKiAgc2l6ZSgpIGFuZCBzdHIuc2l6ZSgpLiAgVGhlIGZ1bmN0aW9uIHRoZW4gY29tcGFyZXMgdGhlIHR3bworICAgICAgICogIHN0cmluZ3MgYnkgY2FsbGluZyB0cmFpdHM6OmNvbXBhcmUoZGF0YSgpLCBzdHIuZGF0YSgpLHJsZW4pLgorICAgICAgICogIElmIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24gaXMgbm9uemVybyByZXR1cm5zIGl0LAorICAgICAgICogIG90aGVyd2lzZSB0aGUgc2hvcnRlciBvbmUgaXMgb3JkZXJlZCBmaXJzdC4KKyAgICAgICovCisgICAgICBpbnQKKyAgICAgIGNvbXBhcmUoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikgY29uc3QKKyAgICAgIHsKKwljb25zdCBzaXplX3R5cGUgX19zaXplID0gdGhpcy0+c2l6ZSgpOworCWNvbnN0IHNpemVfdHlwZSBfX29zaXplID0gX19zdHIuc2l6ZSgpOworCWNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHN0ZDo6bWluKF9fc2l6ZSwgX19vc2l6ZSk7CisKKwlpbnQgX19yID0gdHJhaXRzX3R5cGU6OmNvbXBhcmUoX01fZGF0YSgpLCBfX3N0ci5kYXRhKCksIF9fbGVuKTsKKwlpZiAoIV9fcikKKwkgIF9fciA9IF9TX2NvbXBhcmUoX19zaXplLCBfX29zaXplKTsKKwlyZXR1cm4gX19yOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbXBhcmUgc3Vic3RyaW5nIHRvIGEgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIG9mIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBTdHJpbmcgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEByZXR1cm4gIEludGVnZXIgPCAwLCAwLCBvciA+IDAuCisgICAgICAgKgorICAgICAgICogIEZvcm0gdGhlIHN1YnN0cmluZyBvZiB0aGlzIHN0cmluZyBmcm9tIHRoZSBAYSBfX24gY2hhcmFjdGVycworICAgICAgICogIHN0YXJ0aW5nIGF0IEBhIF9fcG9zLiAgUmV0dXJucyBhbiBpbnRlZ2VyIDwgMCBpZiB0aGUKKyAgICAgICAqICBzdWJzdHJpbmcgaXMgb3JkZXJlZCBiZWZvcmUgQGEgX19zdHIsIDAgaWYgdGhlaXIgdmFsdWVzIGFyZQorICAgICAgICogIGVxdWl2YWxlbnQsIG9yID4gMCBpZiB0aGUgc3Vic3RyaW5nIGlzIG9yZGVyZWQgYWZ0ZXIgQGEKKyAgICAgICAqICBfX3N0ci4gIERldGVybWluZXMgdGhlIGVmZmVjdGl2ZSBsZW5ndGggcmxlbiBvZiB0aGUgc3RyaW5ncworICAgICAgICogIHRvIGNvbXBhcmUgYXMgdGhlIHNtYWxsZXN0IG9mIHRoZSBsZW5ndGggb2YgdGhlIHN1YnN0cmluZworICAgICAgICogIGFuZCBAYSBfX3N0ci5zaXplKCkuICBUaGUgZnVuY3Rpb24gdGhlbiBjb21wYXJlcyB0aGUgdHdvCisgICAgICAgKiAgc3RyaW5ncyBieSBjYWxsaW5nCisgICAgICAgKiAgdHJhaXRzOjpjb21wYXJlKHN1YnN0cmluZy5kYXRhKCksc3RyLmRhdGEoKSxybGVuKS4gIElmIHRoZQorICAgICAgICogIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBpcyBub256ZXJvIHJldHVybnMgaXQsIG90aGVyd2lzZQorICAgICAgICogIHRoZSBzaG9ydGVyIG9uZSBpcyBvcmRlcmVkIGZpcnN0LgorICAgICAgKi8KKyAgICAgIGludAorICAgICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbXBhcmUgc3Vic3RyaW5nIHRvIGEgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3BvczEgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciBvZiBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fbjEgIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zMiAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIG9mIHN1YnN0cmluZyBvZiBzdHIuCisgICAgICAgKiAgQHBhcmFtIF9fbjIgIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHN1YnN0cmluZyBvZiBzdHIuCisgICAgICAgKiAgQHJldHVybiAgSW50ZWdlciA8IDAsIDAsIG9yID4gMC4KKyAgICAgICAqCisgICAgICAgKiAgRm9ybSB0aGUgc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIGZyb20gdGhlIEBhIF9fbjEKKyAgICAgICAqICBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IEBhIF9fcG9zMS4gIEZvcm0gdGhlIHN1YnN0cmluZyBvZiBAYQorICAgICAgICogIF9fc3RyIGZyb20gdGhlIEBhIF9fbjIgY2hhcmFjdGVycyBzdGFydGluZyBhdCBAYSBfX3BvczIuCisgICAgICAgKiAgUmV0dXJucyBhbiBpbnRlZ2VyIDwgMCBpZiB0aGlzIHN1YnN0cmluZyBpcyBvcmRlcmVkIGJlZm9yZQorICAgICAgICogIHRoZSBzdWJzdHJpbmcgb2YgQGEgX19zdHIsIDAgaWYgdGhlaXIgdmFsdWVzIGFyZSBlcXVpdmFsZW50LAorICAgICAgICogIG9yID4gMCBpZiB0aGlzIHN1YnN0cmluZyBpcyBvcmRlcmVkIGFmdGVyIHRoZSBzdWJzdHJpbmcgb2YKKyAgICAgICAqICBAYSBfX3N0ci4gIERldGVybWluZXMgdGhlIGVmZmVjdGl2ZSBsZW5ndGggcmxlbiBvZiB0aGUKKyAgICAgICAqICBzdHJpbmdzIHRvIGNvbXBhcmUgYXMgdGhlIHNtYWxsZXN0IG9mIHRoZSBsZW5ndGhzIG9mIHRoZQorICAgICAgICogIHN1YnN0cmluZ3MuICBUaGUgZnVuY3Rpb24gdGhlbiBjb21wYXJlcyB0aGUgdHdvIHN0cmluZ3MgYnkKKyAgICAgICAqICBjYWxsaW5nCisgICAgICAgKiAgdHJhaXRzOjpjb21wYXJlKHN1YnN0cmluZy5kYXRhKCksc3RyLnN1YnN0cihwb3MyLG4yKS5kYXRhKCkscmxlbikuCisgICAgICAgKiAgSWYgdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBpcyBub256ZXJvIHJldHVybnMgaXQsCisgICAgICAgKiAgb3RoZXJ3aXNlIHRoZSBzaG9ydGVyIG9uZSBpcyBvcmRlcmVkIGZpcnN0LgorICAgICAgKi8KKyAgICAgIGludAorICAgICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwKKwkgICAgICBzaXplX3R5cGUgX19wb3MyLCBzaXplX3R5cGUgX19uMikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29tcGFyZSB0byBhIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcmV0dXJuICBJbnRlZ2VyIDwgMCwgMCwgb3IgPiAwLgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGFuIGludGVnZXIgPCAwIGlmIHRoaXMgc3RyaW5nIGlzIG9yZGVyZWQgYmVmb3JlIEBhIF9fcywgMCBpZgorICAgICAgICogIHRoZWlyIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgb3IgPiAwIGlmIHRoaXMgc3RyaW5nIGlzIG9yZGVyZWQgYWZ0ZXIKKyAgICAgICAqICBAYSBfX3MuICBEZXRlcm1pbmVzIHRoZSBlZmZlY3RpdmUgbGVuZ3RoIHJsZW4gb2YgdGhlIHN0cmluZ3MgdG8KKyAgICAgICAqICBjb21wYXJlIGFzIHRoZSBzbWFsbGVzdCBvZiBzaXplKCkgYW5kIHRoZSBsZW5ndGggb2YgYSBzdHJpbmcKKyAgICAgICAqICBjb25zdHJ1Y3RlZCBmcm9tIEBhIF9fcy4gIFRoZSBmdW5jdGlvbiB0aGVuIGNvbXBhcmVzIHRoZSB0d28gc3RyaW5ncworICAgICAgICogIGJ5IGNhbGxpbmcgdHJhaXRzOjpjb21wYXJlKGRhdGEoKSxzLHJsZW4pLiAgSWYgdGhlIHJlc3VsdCBvZiB0aGUKKyAgICAgICAqICBjb21wYXJpc29uIGlzIG5vbnplcm8gcmV0dXJucyBpdCwgb3RoZXJ3aXNlIHRoZSBzaG9ydGVyIG9uZSBpcworICAgICAgICogIG9yZGVyZWQgZmlyc3QuCisgICAgICAqLworICAgICAgaW50CisgICAgICBjb21wYXJlKGNvbnN0IF9DaGFyVCogX19zKSBjb25zdDsKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNSBTdHJpbmc6OmNvbXBhcmUgc3BlY2lmaWNhdGlvbiBxdWVzdGlvbmFibGUKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29tcGFyZSBzdWJzdHJpbmcgdG8gYSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciBvZiBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fbjEgIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHJldHVybiAgSW50ZWdlciA8IDAsIDAsIG9yID4gMC4KKyAgICAgICAqCisgICAgICAgKiAgRm9ybSB0aGUgc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIGZyb20gdGhlIEBhIF9fbjEKKyAgICAgICAqICBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IEBhIHBvcy4gIFJldHVybnMgYW4gaW50ZWdlciA8IDAgaWYKKyAgICAgICAqICB0aGUgc3Vic3RyaW5nIGlzIG9yZGVyZWQgYmVmb3JlIEBhIF9fcywgMCBpZiB0aGVpciB2YWx1ZXMKKyAgICAgICAqICBhcmUgZXF1aXZhbGVudCwgb3IgPiAwIGlmIHRoZSBzdWJzdHJpbmcgaXMgb3JkZXJlZCBhZnRlciBAYQorICAgICAgICogIF9fcy4gIERldGVybWluZXMgdGhlIGVmZmVjdGl2ZSBsZW5ndGggcmxlbiBvZiB0aGUgc3RyaW5ncyB0bworICAgICAgICogIGNvbXBhcmUgYXMgdGhlIHNtYWxsZXN0IG9mIHRoZSBsZW5ndGggb2YgdGhlIHN1YnN0cmluZyBhbmQKKyAgICAgICAqICB0aGUgbGVuZ3RoIG9mIGEgc3RyaW5nIGNvbnN0cnVjdGVkIGZyb20gQGEgX19zLiAgVGhlCisgICAgICAgKiAgZnVuY3Rpb24gdGhlbiBjb21wYXJlcyB0aGUgdHdvIHN0cmluZyBieSBjYWxsaW5nCisgICAgICAgKiAgdHJhaXRzOjpjb21wYXJlKHN1YnN0cmluZy5kYXRhKCksX19zLHJsZW4pLiAgSWYgdGhlIHJlc3VsdCBvZgorICAgICAgICogIHRoZSBjb21wYXJpc29uIGlzIG5vbnplcm8gcmV0dXJucyBpdCwgb3RoZXJ3aXNlIHRoZSBzaG9ydGVyCisgICAgICAgKiAgb25lIGlzIG9yZGVyZWQgZmlyc3QuCisgICAgICAqLworICAgICAgaW50CisgICAgICBjb21wYXJlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb21wYXJlIHN1YnN0cmluZyBhZ2FpbnN0IGEgY2hhcmFjdGVyICVhcnJheS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciBvZiBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fbjEgIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBjaGFyYWN0ZXIgJWFycmF5IHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcGFyYW0gX19uMiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgb2Ygcy4KKyAgICAgICAqICBAcmV0dXJuICBJbnRlZ2VyIDwgMCwgMCwgb3IgPiAwLgorICAgICAgICoKKyAgICAgICAqICBGb3JtIHRoZSBzdWJzdHJpbmcgb2YgdGhpcyBzdHJpbmcgZnJvbSB0aGUgQGEgX19uMQorICAgICAgICogIGNoYXJhY3RlcnMgc3RhcnRpbmcgYXQgQGEgX19wb3MuICBGb3JtIGEgc3RyaW5nIGZyb20gdGhlCisgICAgICAgKiAgZmlyc3QgQGEgX19uMiBjaGFyYWN0ZXJzIG9mIEBhIF9fcy4gIFJldHVybnMgYW4gaW50ZWdlciA8IDAKKyAgICAgICAqICBpZiB0aGlzIHN1YnN0cmluZyBpcyBvcmRlcmVkIGJlZm9yZSB0aGUgc3RyaW5nIGZyb20gQGEgX19zLAorICAgICAgICogIDAgaWYgdGhlaXIgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBvciA+IDAgaWYgdGhpcyBzdWJzdHJpbmcKKyAgICAgICAqICBpcyBvcmRlcmVkIGFmdGVyIHRoZSBzdHJpbmcgZnJvbSBAYSBfX3MuICBEZXRlcm1pbmVzIHRoZQorICAgICAgICogIGVmZmVjdGl2ZSBsZW5ndGggcmxlbiBvZiB0aGUgc3RyaW5ncyB0byBjb21wYXJlIGFzIHRoZQorICAgICAgICogIHNtYWxsZXN0IG9mIHRoZSBsZW5ndGggb2YgdGhlIHN1YnN0cmluZyBhbmQgQGEgX19uMi4gIFRoZQorICAgICAgICogIGZ1bmN0aW9uIHRoZW4gY29tcGFyZXMgdGhlIHR3byBzdHJpbmdzIGJ5IGNhbGxpbmcKKyAgICAgICAqICB0cmFpdHM6OmNvbXBhcmUoc3Vic3RyaW5nLmRhdGEoKSxzLHJsZW4pLiAgSWYgdGhlIHJlc3VsdCBvZgorICAgICAgICogIHRoZSBjb21wYXJpc29uIGlzIG5vbnplcm8gcmV0dXJucyBpdCwgb3RoZXJ3aXNlIHRoZSBzaG9ydGVyCisgICAgICAgKiAgb25lIGlzIG9yZGVyZWQgZmlyc3QuCisgICAgICAgKgorICAgICAgICogIE5COiBzIG11c3QgaGF2ZSBhdCBsZWFzdCBuMiBjaGFyYWN0ZXJzLCAmYXBvcztcXDAmYXBvczsgaGFzCisgICAgICAgKiAgbm8gc3BlY2lhbCBtZWFuaW5nLgorICAgICAgKi8KKyAgICAgIGludAorICAgICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcywKKwkgICAgICBzaXplX3R5cGUgX19uMikgY29uc3Q7CisgIH07CisKKyAgLy8gb3BlcmF0b3IrCisgIC8qKgorICAgKiAgQGJyaWVmICBDb25jYXRlbmF0ZSB0d28gc3RyaW5ncy4KKyAgICogIEBwYXJhbSBfX2xocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBMYXN0IHN0cmluZy4KKyAgICogIEByZXR1cm4gIE5ldyBzdHJpbmcgd2l0aCB2YWx1ZSBvZiBAYSBfX2xocyBmb2xsb3dlZCBieSBAYSBfX3Jocy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19saHMsCisJICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCisgICAgeworICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiBfX3N0cihfX2xocyk7CisgICAgICBfX3N0ci5hcHBlbmQoX19yaHMpOworICAgICAgcmV0dXJuIF9fc3RyOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgQ29uY2F0ZW5hdGUgQyBzdHJpbmcgYW5kIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBMYXN0IHN0cmluZy4KKyAgICogIEByZXR1cm4gIE5ldyBzdHJpbmcgd2l0aCB2YWx1ZSBvZiBAYSBfX2xocyBmb2xsb3dlZCBieSBAYSBfX3Jocy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+CisgICAgb3BlcmF0b3IrKGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9fcmhzKTsKKworICAvKioKKyAgICogIEBicmllZiAgQ29uY2F0ZW5hdGUgY2hhcmFjdGVyIGFuZCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgTGFzdCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBOZXcgc3RyaW5nIHdpdGggQGEgX19saHMgZm9sbG93ZWQgYnkgQGEgX19yaHMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPgorICAgIG9wZXJhdG9yKyhfQ2hhclQgX19saHMsIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3Jocyk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbmNhdGVuYXRlIHN0cmluZyBhbmQgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgTGFzdCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBOZXcgc3RyaW5nIHdpdGggQGEgX19saHMgZm9sbG93ZWQgYnkgQGEgX19yaHMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywKKwkgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeworICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiBfX3N0cihfX2xocyk7CisgICAgICBfX3N0ci5hcHBlbmQoX19yaHMpOworICAgICAgcmV0dXJuIF9fc3RyOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgQ29uY2F0ZW5hdGUgc3RyaW5nIGFuZCBjaGFyYWN0ZXIuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgTGFzdCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBOZXcgc3RyaW5nIHdpdGggQGEgX19saHMgZm9sbG93ZWQgYnkgQGEgX19yaHMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywgX0NoYXJUIF9fcmhzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPglfX3N0cmluZ190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3N0cmluZ190eXBlOjpzaXplX3R5cGUJCV9fc2l6ZV90eXBlOworICAgICAgX19zdHJpbmdfdHlwZSBfX3N0cihfX2xocyk7CisgICAgICBfX3N0ci5hcHBlbmQoX19zaXplX3R5cGUoMSksIF9fcmhzKTsKKyAgICAgIHJldHVybiBfX3N0cjsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mJiBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBzdGQ6Om1vdmUoX19saHMuYXBwZW5kKF9fcmhzKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiYgX19yaHMpCisgICAgeyByZXR1cm4gc3RkOjptb3ZlKF9fcmhzLmluc2VydCgwLCBfX2xocykpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisoYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYmIF9fbGhzLAorCSAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mJiBfX3JocykKKyAgICB7CisgICAgICBjb25zdCBhdXRvIF9fc2l6ZSA9IF9fbGhzLnNpemUoKSArIF9fcmhzLnNpemUoKTsKKyAgICAgIGNvbnN0IGJvb2wgX19jb25kID0gKF9fc2l6ZSA+IF9fbGhzLmNhcGFjaXR5KCkKKwkJCSAgICYmIF9fc2l6ZSA8PSBfX3Jocy5jYXBhY2l0eSgpKTsKKyAgICAgIHJldHVybiBfX2NvbmQgPyBzdGQ6Om1vdmUoX19yaHMuaW5zZXJ0KDAsIF9fbGhzKSkKKwkgICAgICAgICAgICA6IHN0ZDo6bW92ZShfX2xocy5hcHBlbmQoX19yaHMpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisoY29uc3QgX0NoYXJUKiBfX2xocywKKwkgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiYgX19yaHMpCisgICAgeyByZXR1cm4gc3RkOjptb3ZlKF9fcmhzLmluc2VydCgwLCBfX2xocykpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisoX0NoYXJUIF9fbGhzLAorCSAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mJiBfX3JocykKKyAgICB7IHJldHVybiBzdGQ6Om1vdmUoX19yaHMuaW5zZXJ0KDAsIDEsIF9fbGhzKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiYgX19saHMsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiBzdGQ6Om1vdmUoX19saHMuYXBwZW5kKF9fcmhzKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiYgX19saHMsCisJICAgICAgX0NoYXJUIF9fcmhzKQorICAgIHsgcmV0dXJuIHN0ZDo6bW92ZShfX2xocy5hcHBlbmQoMSwgX19yaHMpKTsgfQorI2VuZGlmCisKKyAgLy8gb3BlcmF0b3IgPT0KKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgZXF1aXZhbGVuY2Ugb2YgdHdvIHN0cmluZ3MuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU2Vjb25kIHN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMuY29tcGFyZShAYSBfX3JocykgPT0gMC4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPT0gMDsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBpbmxpbmUKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfY2hhcjxfQ2hhclQ+OjpfX3ZhbHVlLCBib29sPjo6X190eXBlCisgICAgb3BlcmF0b3I9PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJUPiYgX19saHMsCisJICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQ+JiBfX3JocykKKyAgICB7IHJldHVybiAoX19saHMuc2l6ZSgpID09IF9fcmhzLnNpemUoKQorCSAgICAgICYmICFzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD46OmNvbXBhcmUoX19saHMuZGF0YSgpLCBfX3Jocy5kYXRhKCksCisJCQkJCQkgICAgX19saHMuc2l6ZSgpKSk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBlcXVpdmFsZW5jZSBvZiBDIHN0cmluZyBhbmQgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBDIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX3Jocy5jb21wYXJlKEBhIF9fbGhzKSA9PSAwLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzLmNvbXBhcmUoX19saHMpID09IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBlcXVpdmFsZW5jZSBvZiBzdHJpbmcgYW5kIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBTdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIEMgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocy5jb21wYXJlKEBhIF9fcmhzKSA9PSAwLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfQ2hhclQqIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID09IDA7IH0KKworICAvLyBvcGVyYXRvciAhPQorICAvKioKKyAgICogIEBicmllZiAgVGVzdCBkaWZmZXJlbmNlIG9mIHR3byBzdHJpbmdzLgorICAgKiAgQHBhcmFtIF9fbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFNlY29uZCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzLmNvbXBhcmUoQGEgX19yaHMpICE9IDAuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgZGlmZmVyZW5jZSBvZiBDIHN0cmluZyBhbmQgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBDIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX3Jocy5jb21wYXJlKEBhIF9fbGhzKSAhPSAwLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgZGlmZmVyZW5jZSBvZiBzdHJpbmcgYW5kIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBTdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIEMgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocy5jb21wYXJlKEBhIF9fcmhzKSAhPSAwLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfQ2hhclQqIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgLy8gb3BlcmF0b3IgPAorICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBzdHJpbmcgcHJlY2VkZXMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFNlY29uZCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzIHByZWNlZGVzIEBhIF9fcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19saHMsCisJICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPCAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIHByZWNlZGVzIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBTdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIEMgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBwcmVjZWRlcyBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPCAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgQyBzdHJpbmcgcHJlY2VkZXMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBDIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBwcmVjZWRlcyBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19yaHMuY29tcGFyZShfX2xocykgPiAwOyB9CisKKyAgLy8gb3BlcmF0b3IgPgorICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBzdHJpbmcgZm9sbG93cyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU2Vjb25kIHN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgZm9sbG93cyBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID4gMDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGlmIHN0cmluZyBmb2xsb3dzIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBTdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIEMgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBmb2xsb3dzIEBhIF9fcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19saHMsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA+IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBDIHN0cmluZyBmb2xsb3dzIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgZm9sbG93cyBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19yaHMuY29tcGFyZShfX2xocykgPCAwOyB9CisKKyAgLy8gb3BlcmF0b3IgPD0KKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIGRvZXNuJ3QgZm9sbG93IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBTZWNvbmQgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBkb2Vzbid0IGZvbGxvdyBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPD0gMDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGlmIHN0cmluZyBkb2Vzbid0IGZvbGxvdyBDIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgU3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBDIHN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgZG9lc24ndCBmb2xsb3cgQGEgX19yaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPD0gMDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGlmIEMgc3RyaW5nIGRvZXNuJ3QgZm9sbG93IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgZG9lc24ndCBmb2xsb3cgQGEgX19yaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX0NoYXJUKiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19yaHMuY29tcGFyZShfX2xocykgPj0gMDsgfQorCisgIC8vIG9wZXJhdG9yID49CisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGlmIHN0cmluZyBkb2Vzbid0IHByZWNlZGUgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFNlY29uZCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzIGRvZXNuJ3QgcHJlY2VkZSBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPj0gMDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGlmIHN0cmluZyBkb2Vzbid0IHByZWNlZGUgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIFN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgQyBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzIGRvZXNuJ3QgcHJlY2VkZSBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA+PSAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgQyBzdHJpbmcgZG9lc24ndCBwcmVjZWRlIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgZG9lc24ndCBwcmVjZWRlIEBhIF9fcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX3Jocy5jb21wYXJlKF9fbGhzKSA8PSAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFN3YXAgY29udGVudHMgb2YgdHdvIHN0cmluZ3MuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU2Vjb25kIHN0cmluZy4KKyAgICoKKyAgICogIEV4Y2hhbmdlcyB0aGUgY29udGVudHMgb2YgQGEgX19saHMgYW5kIEBhIF9fcmhzIGluIGNvbnN0YW50IHRpbWUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19saHMsCisJIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgX19saHMuc3dhcChfX3Jocyk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgUmVhZCBzdHJlYW0gaW50byBhIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2lzICBJbnB1dCBzdHJlYW0uCisgICAqICBAcGFyYW0gX19zdHIgIEJ1ZmZlciB0byBzdG9yZSBpbnRvLgorICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoZSBpbnB1dCBzdHJlYW0uCisgICAqCisgICAqICBTdG9yZXMgY2hhcmFjdGVycyBmcm9tIEBhIF9faXMgaW50byBAYSBfX3N0ciB1bnRpbCB3aGl0ZXNwYWNlIGlzCisgICAqICBmb3VuZCwgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGlzIGVuY291bnRlcmVkLCBvciBzdHIubWF4X3NpemUoKQorICAgKiAgaXMgcmVhY2hlZC4gIElmIGlzLndpZHRoKCkgaXMgbm9uLXplcm8sIHRoYXQgaXMgdGhlIGxpbWl0IG9uIHRoZQorICAgKiAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgc3RvcmVkIGludG8gQGEgX19zdHIuICBBbnkgcHJldmlvdXMKKyAgICogIGNvbnRlbnRzIG9mIEBhIF9fc3RyIGFyZSBlcmFzZWQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fc3RyKTsKKworICB0ZW1wbGF0ZTw+CisgICAgYmFzaWNfaXN0cmVhbTxjaGFyPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhcj4mIF9faXMsIGJhc2ljX3N0cmluZzxjaGFyPiYgX19zdHIpOworCisgIC8qKgorICAgKiAgQGJyaWVmICBXcml0ZSBzdHJpbmcgdG8gYSBzdHJlYW0uCisgICAqICBAcGFyYW0gX19vcyAgT3V0cHV0IHN0cmVhbS4KKyAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIHRvIHdyaXRlIG91dC4KKyAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICoKKyAgICogIE91dHB1dCBjaGFyYWN0ZXJzIG9mIEBhIF9fc3RyIGludG8gb3MgZm9sbG93aW5nIHRoZSBzYW1lIHJ1bGVzIGFzIGZvcgorICAgKiAgd3JpdGluZyBhIEMgc3RyaW5nLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zdHIpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNTg2LiBzdHJpbmcgaW5zZXJ0ZXIgbm90IGEgZm9ybWF0dGVkIGZ1bmN0aW9uCisgICAgICByZXR1cm4gX19vc3RyZWFtX2luc2VydChfX29zLCBfX3N0ci5kYXRhKCksIF9fc3RyLnNpemUoKSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZWFkIGEgbGluZSBmcm9tIHN0cmVhbSBpbnRvIGEgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9faXMgIElucHV0IHN0cmVhbS4KKyAgICogIEBwYXJhbSBfX3N0ciAgQnVmZmVyIHRvIHN0b3JlIGludG8uCisgICAqICBAcGFyYW0gX19kZWxpbSAgQ2hhcmFjdGVyIG1hcmtpbmcgZW5kIG9mIGxpbmUuCisgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhlIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogIFN0b3JlcyBjaGFyYWN0ZXJzIGZyb20gQGEgX19pcyBpbnRvIEBhIF9fc3RyIHVudGlsIEBhIF9fZGVsaW0gaXMKKyAgICogIGZvdW5kLCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaXMgZW5jb3VudGVyZWQsIG9yIHN0ci5tYXhfc2l6ZSgpCisgICAqICBpcyByZWFjaGVkLiAgQW55IHByZXZpb3VzIGNvbnRlbnRzIG9mIEBhIF9fc3RyIGFyZSBlcmFzZWQuICBJZgorICAgKiAgQGEgX19kZWxpbSBpcyBlbmNvdW50ZXJlZCwgaXQgaXMgZXh0cmFjdGVkIGJ1dCBub3Qgc3RvcmVkIGludG8KKyAgICogIEBhIF9fc3RyLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGdldGxpbmUoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3N0ciwgX0NoYXJUIF9fZGVsaW0pOworCisgIC8qKgorICAgKiAgQGJyaWVmICBSZWFkIGEgbGluZSBmcm9tIHN0cmVhbSBpbnRvIGEgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9faXMgIElucHV0IHN0cmVhbS4KKyAgICogIEBwYXJhbSBfX3N0ciAgQnVmZmVyIHRvIHN0b3JlIGludG8uCisgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhlIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogIFN0b3JlcyBjaGFyYWN0ZXJzIGZyb20gaXMgaW50byBAYSBfX3N0ciB1bnRpbCAmYXBvcztcbiZhcG9zOyBpcworICAgKiAgZm91bmQsIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcyBlbmNvdW50ZXJlZCwgb3Igc3RyLm1heF9zaXplKCkKKyAgICogIGlzIHJlYWNoZWQuICBBbnkgcHJldmlvdXMgY29udGVudHMgb2YgQGEgX19zdHIgYXJlIGVyYXNlZC4gIElmCisgICAqICBlbmQgb2YgbGluZSBpcyBlbmNvdW50ZXJlZCwgaXQgaXMgZXh0cmFjdGVkIGJ1dCBub3Qgc3RvcmVkIGludG8KKyAgICogIEBhIF9fc3RyLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBnZXRsaW5lKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zdHIpCisgICAgeyByZXR1cm4gZ2V0bGluZShfX2lzLCBfX3N0ciwgX19pcy53aWRlbignXG4nKSk7IH0KKworICB0ZW1wbGF0ZTw+CisgICAgYmFzaWNfaXN0cmVhbTxjaGFyPiYKKyAgICBnZXRsaW5lKGJhc2ljX2lzdHJlYW08Y2hhcj4mIF9faW4sIGJhc2ljX3N0cmluZzxjaGFyPiYgX19zdHIsCisJICAgIGNoYXIgX19kZWxpbSk7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+CisgICAgYmFzaWNfaXN0cmVhbTx3Y2hhcl90PiYKKyAgICBnZXRsaW5lKGJhc2ljX2lzdHJlYW08d2NoYXJfdD4mIF9faW4sIGJhc2ljX3N0cmluZzx3Y2hhcl90PiYgX19zdHIsCisJICAgIHdjaGFyX3QgX19kZWxpbSk7CisjZW5kaWYgIAorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNpZiAoKF9fY3BsdXNwbHVzID49IDIwMTEwM0wpICYmIGRlZmluZWQoX0dMSUJDWFhfVVNFX0M5OSkgXAorICAgICAmJiAhZGVmaW5lZChfR0xJQkNYWF9IQVZFX0JST0tFTl9WU1dQUklOVEYpKQorCisjaW5jbHVkZSA8ZXh0L3N0cmluZ19jb252ZXJzaW9ucy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gMjEuNCBOdW1lcmljIENvbnZlcnNpb25zIFtzdHJpbmcuY29udmVyc2lvbnNdLgorICBpbmxpbmUgaW50CisgIHN0b2koY29uc3Qgc3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2E8bG9uZywgaW50Pigmc3RkOjpzdHJ0b2wsICJzdG9pIiwgX19zdHIuY19zdHIoKSwKKwkJCQkJX19pZHgsIF9fYmFzZSk7IH0KKworICBpbmxpbmUgbG9uZworICBzdG9sKGNvbnN0IHN0cmluZyYgX19zdHIsIHNpemVfdCogX19pZHggPSAwLCBpbnQgX19iYXNlID0gMTApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6OnN0cnRvbCwgInN0b2wiLCBfX3N0ci5jX3N0cigpLAorCQkJICAgICBfX2lkeCwgX19iYXNlKTsgfQorCisgIGlubGluZSB1bnNpZ25lZCBsb25nCisgIHN0b3VsKGNvbnN0IHN0cmluZyYgX19zdHIsIHNpemVfdCogX19pZHggPSAwLCBpbnQgX19iYXNlID0gMTApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6OnN0cnRvdWwsICJzdG91bCIsIF9fc3RyLmNfc3RyKCksCisJCQkgICAgIF9faWR4LCBfX2Jhc2UpOyB9CisKKyAgaW5saW5lIGxvbmcgbG9uZworICBzdG9sbChjb25zdCBzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjpzdHJ0b2xsLCAic3RvbGwiLCBfX3N0ci5jX3N0cigpLAorCQkJICAgICBfX2lkeCwgX19iYXNlKTsgfQorCisgIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcKKyAgc3RvdWxsKGNvbnN0IHN0cmluZyYgX19zdHIsIHNpemVfdCogX19pZHggPSAwLCBpbnQgX19iYXNlID0gMTApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6OnN0cnRvdWxsLCAic3RvdWxsIiwgX19zdHIuY19zdHIoKSwKKwkJCSAgICAgX19pZHgsIF9fYmFzZSk7IH0KKworICAvLyBOQjogc3RydG9mIHZzIHN0cnRvZC4KKyAgaW5saW5lIGZsb2F0CisgIHN0b2YoY29uc3Qgc3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6OnN0cnRvZiwgInN0b2YiLCBfX3N0ci5jX3N0cigpLCBfX2lkeCk7IH0KKworICBpbmxpbmUgZG91YmxlCisgIHN0b2QoY29uc3Qgc3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6OnN0cnRvZCwgInN0b2QiLCBfX3N0ci5jX3N0cigpLCBfX2lkeCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgc3RvbGQoY29uc3Qgc3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6OnN0cnRvbGQsICJzdG9sZCIsIF9fc3RyLmNfc3RyKCksIF9faWR4KTsgfQorCisgIC8vIE5COiAodilzbnByaW50ZiB2cyBzcHJpbnRmLgorCisgIC8vIERSIDEyNjEuCisgIGlubGluZSBzdHJpbmcKKyAgdG9fc3RyaW5nKGludCBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8c3RyaW5nPigmc3RkOjp2c25wcmludGYsIDQgKiBzaXplb2YoaW50KSwKKwkJCQkJICAgIiVkIiwgX192YWwpOyB9CisKKyAgaW5saW5lIHN0cmluZworICB0b19zdHJpbmcodW5zaWduZWQgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPHN0cmluZz4oJnN0ZDo6dnNucHJpbnRmLAorCQkJCQkgICA0ICogc2l6ZW9mKHVuc2lnbmVkKSwKKwkJCQkJICAgIiV1IiwgX192YWwpOyB9CisKKyAgaW5saW5lIHN0cmluZworICB0b19zdHJpbmcobG9uZyBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8c3RyaW5nPigmc3RkOjp2c25wcmludGYsIDQgKiBzaXplb2YobG9uZyksCisJCQkJCSAgICIlbGQiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgc3RyaW5nCisgIHRvX3N0cmluZyh1bnNpZ25lZCBsb25nIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxzdHJpbmc+KCZzdGQ6OnZzbnByaW50ZiwKKwkJCQkJICAgNCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJCQkJICAgIiVsdSIsIF9fdmFsKTsgfQorCisgIGlubGluZSBzdHJpbmcKKyAgdG9fc3RyaW5nKGxvbmcgbG9uZyBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8c3RyaW5nPigmc3RkOjp2c25wcmludGYsCisJCQkJCSAgIDQgKiBzaXplb2YobG9uZyBsb25nKSwKKwkJCQkJICAgIiVsbGQiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgc3RyaW5nCisgIHRvX3N0cmluZyh1bnNpZ25lZCBsb25nIGxvbmcgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPHN0cmluZz4oJnN0ZDo6dnNucHJpbnRmLAorCQkJCQkgICA0ICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZyksCisJCQkJCSAgICIlbGx1IiwgX192YWwpOyB9CisKKyAgaW5saW5lIHN0cmluZworICB0b19zdHJpbmcoZmxvYXQgX192YWwpCisgIHsKKyAgICBjb25zdCBpbnQgX19uID0gCisgICAgICBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8ZmxvYXQ+OjpfX21heF9leHBvbmVudDEwICsgMjA7CisgICAgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPHN0cmluZz4oJnN0ZDo6dnNucHJpbnRmLCBfX24sCisJCQkJCSAgICIlZiIsIF9fdmFsKTsKKyAgfQorCisgIGlubGluZSBzdHJpbmcKKyAgdG9fc3RyaW5nKGRvdWJsZSBfX3ZhbCkKKyAgeworICAgIGNvbnN0IGludCBfX24gPSAKKyAgICAgIF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxkb3VibGU+OjpfX21heF9leHBvbmVudDEwICsgMjA7CisgICAgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPHN0cmluZz4oJnN0ZDo6dnNucHJpbnRmLCBfX24sCisJCQkJCSAgICIlZiIsIF9fdmFsKTsKKyAgfQorCisgIGlubGluZSBzdHJpbmcKKyAgdG9fc3RyaW5nKGxvbmcgZG91YmxlIF9fdmFsKQorICB7CisgICAgY29uc3QgaW50IF9fbiA9IAorICAgICAgX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPGxvbmcgZG91YmxlPjo6X19tYXhfZXhwb25lbnQxMCArIDIwOworICAgIHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxzdHJpbmc+KCZzdGQ6OnZzbnByaW50ZiwgX19uLAorCQkJCQkgICAiJUxmIiwgX192YWwpOworICB9CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICBpbmxpbmUgaW50IAorICBzdG9pKGNvbnN0IHdzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYTxsb25nLCBpbnQ+KCZzdGQ6Ondjc3RvbCwgInN0b2kiLCBfX3N0ci5jX3N0cigpLAorCQkJCQlfX2lkeCwgX19iYXNlKTsgfQorCisgIGlubGluZSBsb25nIAorICBzdG9sKGNvbnN0IHdzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjp3Y3N0b2wsICJzdG9sIiwgX19zdHIuY19zdHIoKSwKKwkJCSAgICAgX19pZHgsIF9fYmFzZSk7IH0KKworICBpbmxpbmUgdW5zaWduZWQgbG9uZworICBzdG91bChjb25zdCB3c3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6d2NzdG91bCwgInN0b3VsIiwgX19zdHIuY19zdHIoKSwKKwkJCSAgICAgX19pZHgsIF9fYmFzZSk7IH0KKworICBpbmxpbmUgbG9uZyBsb25nCisgIHN0b2xsKGNvbnN0IHdzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjp3Y3N0b2xsLCAic3RvbGwiLCBfX3N0ci5jX3N0cigpLAorCQkJICAgICBfX2lkeCwgX19iYXNlKTsgfQorCisgIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcKKyAgc3RvdWxsKGNvbnN0IHdzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjp3Y3N0b3VsbCwgInN0b3VsbCIsIF9fc3RyLmNfc3RyKCksCisJCQkgICAgIF9faWR4LCBfX2Jhc2UpOyB9CisKKyAgLy8gTkI6IHdjc3RvZiB2cyB3Y3N0b2QuCisgIGlubGluZSBmbG9hdAorICBzdG9mKGNvbnN0IHdzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6d2NzdG9mLCAic3RvZiIsIF9fc3RyLmNfc3RyKCksIF9faWR4KTsgfQorCisgIGlubGluZSBkb3VibGUKKyAgc3RvZChjb25zdCB3c3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6Ondjc3RvZCwgInN0b2QiLCBfX3N0ci5jX3N0cigpLCBfX2lkeCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgc3RvbGQoY29uc3Qgd3N0cmluZyYgX19zdHIsIHNpemVfdCogX19pZHggPSAwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjp3Y3N0b2xkLCAic3RvbGQiLCBfX3N0ci5jX3N0cigpLCBfX2lkeCk7IH0KKworICAvLyBEUiAxMjYxLgorICBpbmxpbmUgd3N0cmluZworICB0b193c3RyaW5nKGludCBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8d3N0cmluZz4oJnN0ZDo6dnN3cHJpbnRmLCA0ICogc2l6ZW9mKGludCksCisJCQkJCSAgICBMIiVkIiwgX192YWwpOyB9CisKKyAgaW5saW5lIHdzdHJpbmcKKyAgdG9fd3N0cmluZyh1bnNpZ25lZCBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8d3N0cmluZz4oJnN0ZDo6dnN3cHJpbnRmLAorCQkJCQkgICAgNCAqIHNpemVvZih1bnNpZ25lZCksCisJCQkJCSAgICBMIiV1IiwgX192YWwpOyB9CisKKyAgaW5saW5lIHdzdHJpbmcKKyAgdG9fd3N0cmluZyhsb25nIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzx3c3RyaW5nPigmc3RkOjp2c3dwcmludGYsIDQgKiBzaXplb2YobG9uZyksCisJCQkJCSAgICBMIiVsZCIsIF9fdmFsKTsgfQorCisgIGlubGluZSB3c3RyaW5nCisgIHRvX3dzdHJpbmcodW5zaWduZWQgbG9uZyBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8d3N0cmluZz4oJnN0ZDo6dnN3cHJpbnRmLAorCQkJCQkgICAgNCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJCQkJICAgIEwiJWx1IiwgX192YWwpOyB9CisKKyAgaW5saW5lIHdzdHJpbmcKKyAgdG9fd3N0cmluZyhsb25nIGxvbmcgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPHdzdHJpbmc+KCZzdGQ6OnZzd3ByaW50ZiwKKwkJCQkJICAgIDQgKiBzaXplb2YobG9uZyBsb25nKSwKKwkJCQkJICAgIEwiJWxsZCIsIF9fdmFsKTsgfQorCisgIGlubGluZSB3c3RyaW5nCisgIHRvX3dzdHJpbmcodW5zaWduZWQgbG9uZyBsb25nIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzx3c3RyaW5nPigmc3RkOjp2c3dwcmludGYsCisJCQkJCSAgICA0ICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZyksCisJCQkJCSAgICBMIiVsbHUiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgd3N0cmluZworICB0b193c3RyaW5nKGZsb2F0IF9fdmFsKQorICB7CisgICAgY29uc3QgaW50IF9fbiA9CisgICAgICBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8ZmxvYXQ+OjpfX21heF9leHBvbmVudDEwICsgMjA7CisgICAgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPHdzdHJpbmc+KCZzdGQ6OnZzd3ByaW50ZiwgX19uLAorCQkJCQkgICAgTCIlZiIsIF9fdmFsKTsKKyAgfQorCisgIGlubGluZSB3c3RyaW5nCisgIHRvX3dzdHJpbmcoZG91YmxlIF9fdmFsKQorICB7CisgICAgY29uc3QgaW50IF9fbiA9CisgICAgICBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8ZG91YmxlPjo6X19tYXhfZXhwb25lbnQxMCArIDIwOworICAgIHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzx3c3RyaW5nPigmc3RkOjp2c3dwcmludGYsIF9fbiwKKwkJCQkJICAgIEwiJWYiLCBfX3ZhbCk7CisgIH0KKworICBpbmxpbmUgd3N0cmluZworICB0b193c3RyaW5nKGxvbmcgZG91YmxlIF9fdmFsKQorICB7CisgICAgY29uc3QgaW50IF9fbiA9CisgICAgICBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8bG9uZyBkb3VibGU+OjpfX21heF9leHBvbmVudDEwICsgMjA7CisgICAgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPHdzdHJpbmc+KCZzdGQ6OnZzd3ByaW50ZiwgX19uLAorCQkJCQkgICAgTCIlTGYiLCBfX3ZhbCk7CisgIH0KKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBDKysxMSAmJiBfR0xJQkNYWF9VU0VfQzk5IC4uLiAqLworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisjaW5jbHVkZSA8Yml0cy9mdW5jdGlvbmFsX2hhc2guaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIERSIDExODIuCisKKyNpZm5kZWYgX0dMSUJDWFhfQ09NUEFUSUJJTElUWV9DWFgwWAorICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciBzdHJpbmcuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDxzdHJpbmc+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBzdHJpbmc+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IHN0cmluZyYgX19zKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpfSGFzaF9pbXBsOjpoYXNoKF9fcy5kYXRhKCksIF9fcy5sZW5ndGgoKSk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19mYXN0X2hhc2g8aGFzaDxzdHJpbmc+PiA6IHN0ZDo6ZmFsc2VfdHlwZQorICAgIHsgfTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIHdzdHJpbmcuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDx3c3RyaW5nPgorICAgIDogcHVibGljIF9faGFzaF9iYXNlPHNpemVfdCwgd3N0cmluZz4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3Qgd3N0cmluZyYgX19zKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpfSGFzaF9pbXBsOjpoYXNoKF9fcy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zLmxlbmd0aCgpICogc2l6ZW9mKHdjaGFyX3QpKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2Zhc3RfaGFzaDxoYXNoPHdzdHJpbmc+PiA6IHN0ZDo6ZmFsc2VfdHlwZQorICAgIHsgfTsKKyNlbmRpZgorI2VuZGlmIC8qIF9HTElCQ1hYX0NPTVBBVElCSUxJVFlfQ1hYMFggKi8KKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMQorICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciB1MTZzdHJpbmcuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDx1MTZzdHJpbmc+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCB1MTZzdHJpbmc+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IHUxNnN0cmluZyYgX19zKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpfSGFzaF9pbXBsOjpoYXNoKF9fcy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zLmxlbmd0aCgpICogc2l6ZW9mKGNoYXIxNl90KSk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19mYXN0X2hhc2g8aGFzaDx1MTZzdHJpbmc+PiA6IHN0ZDo6ZmFsc2VfdHlwZQorICAgIHsgfTsKKworICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciB1MzJzdHJpbmcuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDx1MzJzdHJpbmc+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCB1MzJzdHJpbmc+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IHUzMnN0cmluZyYgX19zKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpfSGFzaF9pbXBsOjpoYXNoKF9fcy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zLmxlbmd0aCgpICogc2l6ZW9mKGNoYXIzMl90KSk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19mYXN0X2hhc2g8aGFzaDx1MzJzdHJpbmc+PiA6IHN0ZDo6ZmFsc2VfdHlwZQorICAgIHsgfTsKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLyogX0JBU0lDX1NUUklOR19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYmFzaWNfc3RyaW5nLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9iYXNpY19zdHJpbmcudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxN2ViNzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYmFzaWNfc3RyaW5nLnRjYwpAQCAtMCwwICsxLDExNjYgQEAKKy8vIENvbXBvbmVudHMgZm9yIG1hbmlwdWxhdGluZyBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9iYXNpY19zdHJpbmcudGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7c3RyaW5nfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMSAgU3RyaW5ncyBsaWJyYXJ5CisvLworCisvLyBXcml0dGVuIGJ5IEphc29uIE1lcnJpbGwgYmFzZWQgdXBvbiB0aGUgc3BlY2lmaWNhdGlvbiBieSBUYWthbm9yaSBBZGFjaGkKKy8vIGluIEFOU0kgWDNKMTYvOTQtMDAxM1IyLiAgUmV3cml0dGVuIGJ5IE5hdGhhbiBNeWVycyB0byBJU08tMTQ4ODIuCisKKyNpZm5kZWYgX0JBU0lDX1NUUklOR19UQ0MKKyNkZWZpbmUgX0JBU0lDX1NUUklOR19UQ0MgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2N4eGFiaV9mb3JjZWQuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNvbnN0IHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9SZXA6Ol9TX21heF9zaXplID0gKCgobnBvcyAtIHNpemVvZihfUmVwX2Jhc2UpKS9zaXplb2YoX0NoYXJUKSkgLSAxKSAvIDQ7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY29uc3QgX0NoYXJUCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX1JlcDo6X1NfdGVybWluYWwgPSBfQ2hhclQoKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjb25zdCB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpucG9zOworCisgIC8vIExpbmtlciBzZXRzIF9TX2VtcHR5X3JlcF9zdG9yYWdlIHRvIGFsbCAwcyAob25lIHJlZmVyZW5jZSwgZW1wdHkgc3RyaW5nKQorICAvLyBhdCBzdGF0aWMgaW5pdCB0aW1lIChiZWZvcmUgc3RhdGljIGN0b3JzIGFyZSBydW4pLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpfUmVwOjpfU19lbXB0eV9yZXBfc3RvcmFnZVsKKyAgICAoc2l6ZW9mKF9SZXBfYmFzZSkgKyBzaXplb2YoX0NoYXJUKSArIHNpemVvZihzaXplX3R5cGUpIC0gMSkgLworICAgICAgc2l6ZW9mKHNpemVfdHlwZSldOworCisgIC8vIE5COiBUaGlzIGlzIHRoZSBzcGVjaWFsIGNhc2UgZm9yIElucHV0IEl0ZXJhdG9ycywgdXNlZCBpbgorICAvLyBpc3RyZWFtYnVmX2l0ZXJhdG9ycywgZXRjLgorICAvLyBJbnB1dCBJdGVyYXRvcnMgaGF2ZSBhIGNvc3Qgc3RydWN0dXJlIHZlcnkgZGlmZmVyZW50IGZyb20KKyAgLy8gcG9pbnRlcnMsIGNhbGxpbmcgZm9yIGEgZGlmZmVyZW50IGNvZGluZyBzdHlsZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlcmF0b3I+CisgICAgICBfQ2hhclQqCisgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICAgIF9TX2NvbnN0cnVjdChfSW5JdGVyYXRvciBfX2JlZywgX0luSXRlcmF0b3IgX19lbmQsIGNvbnN0IF9BbGxvYyYgX19hLAorCQkgICBpbnB1dF9pdGVyYXRvcl90YWcpCisgICAgICB7CisjaWYgX0dMSUJDWFhfRlVMTFlfRFlOQU1JQ19TVFJJTkcgPT0gMAorCWlmIChfX2JlZyA9PSBfX2VuZCAmJiBfX2EgPT0gX0FsbG9jKCkpCisJICByZXR1cm4gX1NfZW1wdHlfcmVwKCkuX01fcmVmZGF0YSgpOworI2VuZGlmCisJLy8gQXZvaWQgcmVhbGxvY2F0aW9uIGZvciBjb21tb24gY2FzZS4KKwlfQ2hhclQgX19idWZbMTI4XTsKKwlzaXplX3R5cGUgX19sZW4gPSAwOworCXdoaWxlIChfX2JlZyAhPSBfX2VuZCAmJiBfX2xlbiA8IHNpemVvZihfX2J1ZikgLyBzaXplb2YoX0NoYXJUKSkKKwkgIHsKKwkgICAgX19idWZbX19sZW4rK10gPSAqX19iZWc7CisJICAgICsrX19iZWc7CisJICB9CisJX1JlcCogX19yID0gX1JlcDo6X1NfY3JlYXRlKF9fbGVuLCBzaXplX3R5cGUoMCksIF9fYSk7CisJX01fY29weShfX3ItPl9NX3JlZmRhdGEoKSwgX19idWYsIF9fbGVuKTsKKwlfX3RyeQorCSAgeworCSAgICB3aGlsZSAoX19iZWcgIT0gX19lbmQpCisJICAgICAgeworCQlpZiAoX19sZW4gPT0gX19yLT5fTV9jYXBhY2l0eSkKKwkJICB7CisJCSAgICAvLyBBbGxvY2F0ZSBtb3JlIHNwYWNlLgorCQkgICAgX1JlcCogX19hbm90aGVyID0gX1JlcDo6X1NfY3JlYXRlKF9fbGVuICsgMSwgX19sZW4sIF9fYSk7CisJCSAgICBfTV9jb3B5KF9fYW5vdGhlci0+X01fcmVmZGF0YSgpLCBfX3ItPl9NX3JlZmRhdGEoKSwgX19sZW4pOworCQkgICAgX19yLT5fTV9kZXN0cm95KF9fYSk7CisJCSAgICBfX3IgPSBfX2Fub3RoZXI7CisJCSAgfQorCQlfX3ItPl9NX3JlZmRhdGEoKVtfX2xlbisrXSA9ICpfX2JlZzsKKwkJKytfX2JlZzsKKwkgICAgICB9CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIF9fci0+X01fZGVzdHJveShfX2EpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKwlfX3ItPl9NX3NldF9sZW5ndGhfYW5kX3NoYXJhYmxlKF9fbGVuKTsKKwlyZXR1cm4gX19yLT5fTV9yZWZkYXRhKCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9Jbkl0ZXJhdG9yPgorICAgICAgX0NoYXJUKgorICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgICBfU19jb25zdHJ1Y3QoX0luSXRlcmF0b3IgX19iZWcsIF9Jbkl0ZXJhdG9yIF9fZW5kLCBjb25zdCBfQWxsb2MmIF9fYSwKKwkJICAgZm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgICB7CisjaWYgX0dMSUJDWFhfRlVMTFlfRFlOQU1JQ19TVFJJTkcgPT0gMAorCWlmIChfX2JlZyA9PSBfX2VuZCAmJiBfX2EgPT0gX0FsbG9jKCkpCisJICByZXR1cm4gX1NfZW1wdHlfcmVwKCkuX01fcmVmZGF0YSgpOworI2VuZGlmCisJLy8gTkI6IE5vdCByZXF1aXJlZCwgYnV0IGNvbnNpZGVyZWQgYmVzdCBwcmFjdGljZS4KKwlpZiAoX19nbnVfY3h4OjpfX2lzX251bGxfcG9pbnRlcihfX2JlZykgJiYgX19iZWcgIT0gX19lbmQpCisJICBfX3Rocm93X2xvZ2ljX2Vycm9yKF9fTigiYmFzaWNfc3RyaW5nOjpfU19jb25zdHJ1Y3QgbnVsbCBub3QgdmFsaWQiKSk7CisKKwljb25zdCBzaXplX3R5cGUgX19kbmV3ID0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihzdGQ6OmRpc3RhbmNlKF9fYmVnLAorCQkJCQkJCQkgICAgICBfX2VuZCkpOworCS8vIENoZWNrIGZvciBvdXRfb2ZfcmFuZ2UgYW5kIGxlbmd0aF9lcnJvciBleGNlcHRpb25zLgorCV9SZXAqIF9fciA9IF9SZXA6Ol9TX2NyZWF0ZShfX2RuZXcsIHNpemVfdHlwZSgwKSwgX19hKTsKKwlfX3RyeQorCSAgeyBfU19jb3B5X2NoYXJzKF9fci0+X01fcmVmZGF0YSgpLCBfX2JlZywgX19lbmQpOyB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIF9fci0+X01fZGVzdHJveShfX2EpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKwlfX3ItPl9NX3NldF9sZW5ndGhfYW5kX3NoYXJhYmxlKF9fZG5ldyk7CisJcmV0dXJuIF9fci0+X01fcmVmZGF0YSgpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9DaGFyVCoKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfU19jb25zdHJ1Y3Qoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYywgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgeworI2lmIF9HTElCQ1hYX0ZVTExZX0RZTkFNSUNfU1RSSU5HID09IDAKKyAgICAgIGlmIChfX24gPT0gMCAmJiBfX2EgPT0gX0FsbG9jKCkpCisJcmV0dXJuIF9TX2VtcHR5X3JlcCgpLl9NX3JlZmRhdGEoKTsKKyNlbmRpZgorICAgICAgLy8gQ2hlY2sgZm9yIG91dF9vZl9yYW5nZSBhbmQgbGVuZ3RoX2Vycm9yIGV4Y2VwdGlvbnMuCisgICAgICBfUmVwKiBfX3IgPSBfUmVwOjpfU19jcmVhdGUoX19uLCBzaXplX3R5cGUoMCksIF9fYSk7CisgICAgICBpZiAoX19uKQorCV9NX2Fzc2lnbihfX3ItPl9NX3JlZmRhdGEoKSwgX19uLCBfX2MpOworCisgICAgICBfX3ItPl9NX3NldF9sZW5ndGhfYW5kX3NoYXJhYmxlKF9fbik7CisgICAgICByZXR1cm4gX19yLT5fTV9yZWZkYXRhKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQorICAgIDogX01fZGF0YXBsdXMoX19zdHIuX01fcmVwKCktPl9NX2dyYWIoX0FsbG9jKF9fc3RyLmdldF9hbGxvY2F0b3IoKSksCisJCQkJCSAgX19zdHIuZ2V0X2FsbG9jYXRvcigpKSwKKwkJICBfX3N0ci5nZXRfYWxsb2NhdG9yKCkpCisgICAgeyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgYmFzaWNfc3RyaW5nKGNvbnN0IF9BbGxvYyYgX19hKQorICAgIDogX01fZGF0YXBsdXMoX1NfY29uc3RydWN0KHNpemVfdHlwZSgpLCBfQ2hhclQoKSwgX19hKSwgX19hKQorICAgIHsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCisgICAgOiBfTV9kYXRhcGx1cyhfU19jb25zdHJ1Y3QoX19zdHIuX01fZGF0YSgpCisJCQkgICAgICAgKyBfX3N0ci5fTV9jaGVjayhfX3BvcywKKwkJCQkJCSJiYXNpY19zdHJpbmc6OmJhc2ljX3N0cmluZyIpLAorCQkJICAgICAgIF9fc3RyLl9NX2RhdGEoKSArIF9fc3RyLl9NX2xpbWl0KF9fcG9zLCBfX24pCisJCQkgICAgICAgKyBfX3BvcywgX0FsbG9jKCkpLCBfQWxsb2MoKSkKKyAgICB7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBiYXNpY19zdHJpbmcoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLAorCQkgc2l6ZV90eXBlIF9fbiwgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgOiBfTV9kYXRhcGx1cyhfU19jb25zdHJ1Y3QoX19zdHIuX01fZGF0YSgpCisJCQkgICAgICAgKyBfX3N0ci5fTV9jaGVjayhfX3BvcywKKwkJCQkJCSJiYXNpY19zdHJpbmc6OmJhc2ljX3N0cmluZyIpLAorCQkJICAgICAgIF9fc3RyLl9NX2RhdGEoKSArIF9fc3RyLl9NX2xpbWl0KF9fcG9zLCBfX24pCisJCQkgICAgICAgKyBfX3BvcywgX19hKSwgX19hKQorICAgIHsgfQorCisgIC8vIFRCRDogRFBHIGFubm90YXRlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgOiBfTV9kYXRhcGx1cyhfU19jb25zdHJ1Y3QoX19zLCBfX3MgKyBfX24sIF9fYSksIF9fYSkKKyAgICB7IH0KKworICAvLyBUQkQ6IERQRyBhbm5vdGF0ZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsIGNvbnN0IF9BbGxvYyYgX19hKQorICAgIDogX01fZGF0YXBsdXMoX1NfY29uc3RydWN0KF9fcywgX19zID8gX19zICsgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpIDoKKwkJCSAgICAgICBfX3MgKyBucG9zLCBfX2EpLCBfX2EpCisgICAgeyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgYmFzaWNfc3RyaW5nKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsIGNvbnN0IF9BbGxvYyYgX19hKQorICAgIDogX01fZGF0YXBsdXMoX1NfY29uc3RydWN0KF9fbiwgX19jLCBfX2EpLCBfX2EpCisgICAgeyB9CisKKyAgLy8gVEJEOiBEUEcgYW5ub3RhdGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgYmFzaWNfc3RyaW5nKF9JbnB1dEl0ZXJhdG9yIF9fYmVnLCBfSW5wdXRJdGVyYXRvciBfX2VuZCwgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgOiBfTV9kYXRhcGx1cyhfU19jb25zdHJ1Y3QoX19iZWcsIF9fZW5kLCBfX2EpLCBfX2EpCisgICAgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGJhc2ljX3N0cmluZyhpbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sLCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICA6IF9NX2RhdGFwbHVzKF9TX2NvbnN0cnVjdChfX2wuYmVnaW4oKSwgX19sLmVuZCgpLCBfX2EpLCBfX2EpCisgICAgeyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGFzc2lnbihjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQorICAgIHsKKyAgICAgIGlmIChfTV9yZXAoKSAhPSBfX3N0ci5fTV9yZXAoKSkKKwl7CisJICAvLyBYWFggTVQKKwkgIGNvbnN0IGFsbG9jYXRvcl90eXBlIF9fYSA9IHRoaXMtPmdldF9hbGxvY2F0b3IoKTsKKwkgIF9DaGFyVCogX190bXAgPSBfX3N0ci5fTV9yZXAoKS0+X01fZ3JhYihfX2EsIF9fc3RyLmdldF9hbGxvY2F0b3IoKSk7CisJICBfTV9yZXAoKS0+X01fZGlzcG9zZShfX2EpOworCSAgX01fZGF0YShfX3RtcCk7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBfTV9jaGVja19sZW5ndGgodGhpcy0+c2l6ZSgpLCBfX24sICJiYXNpY19zdHJpbmc6OmFzc2lnbiIpOworICAgICAgaWYgKF9NX2Rpc2p1bmN0KF9fcykgfHwgX01fcmVwKCktPl9NX2lzX3NoYXJlZCgpKQorCXJldHVybiBfTV9yZXBsYWNlX3NhZmUoc2l6ZV90eXBlKDApLCB0aGlzLT5zaXplKCksIF9fcywgX19uKTsKKyAgICAgIGVsc2UKKwl7CisJICAvLyBXb3JrIGluLXBsYWNlLgorCSAgY29uc3Qgc2l6ZV90eXBlIF9fcG9zID0gX19zIC0gX01fZGF0YSgpOworCSAgaWYgKF9fcG9zID49IF9fbikKKwkgICAgX01fY29weShfTV9kYXRhKCksIF9fcywgX19uKTsKKwkgIGVsc2UgaWYgKF9fcG9zKQorCSAgICBfTV9tb3ZlKF9NX2RhdGEoKSwgX19zLCBfX24pOworCSAgX01fcmVwKCktPl9NX3NldF9sZW5ndGhfYW5kX3NoYXJhYmxlKF9fbik7CisJICByZXR1cm4gKnRoaXM7CisJfQorICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBhcHBlbmQoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykKKyAgICB7CisgICAgICBpZiAoX19uKQorCXsKKwkgIF9NX2NoZWNrX2xlbmd0aChzaXplX3R5cGUoMCksIF9fbiwgImJhc2ljX3N0cmluZzo6YXBwZW5kIik7CSAgCisJICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBfX24gKyB0aGlzLT5zaXplKCk7CisJICBpZiAoX19sZW4gPiB0aGlzLT5jYXBhY2l0eSgpIHx8IF9NX3JlcCgpLT5fTV9pc19zaGFyZWQoKSkKKwkgICAgdGhpcy0+cmVzZXJ2ZShfX2xlbik7CisJICBfTV9hc3NpZ24oX01fZGF0YSgpICsgdGhpcy0+c2l6ZSgpLCBfX24sIF9fYyk7CisJICBfTV9yZXAoKS0+X01fc2V0X2xlbmd0aF9hbmRfc2hhcmFibGUoX19sZW4pOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgaWYgKF9fbikKKwl7CisJICBfTV9jaGVja19sZW5ndGgoc2l6ZV90eXBlKDApLCBfX24sICJiYXNpY19zdHJpbmc6OmFwcGVuZCIpOworCSAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gX19uICsgdGhpcy0+c2l6ZSgpOworCSAgaWYgKF9fbGVuID4gdGhpcy0+Y2FwYWNpdHkoKSB8fCBfTV9yZXAoKS0+X01faXNfc2hhcmVkKCkpCisJICAgIHsKKwkgICAgICBpZiAoX01fZGlzanVuY3QoX19zKSkKKwkJdGhpcy0+cmVzZXJ2ZShfX2xlbik7CisJICAgICAgZWxzZQorCQl7CisJCSAgY29uc3Qgc2l6ZV90eXBlIF9fb2ZmID0gX19zIC0gX01fZGF0YSgpOworCQkgIHRoaXMtPnJlc2VydmUoX19sZW4pOworCQkgIF9fcyA9IF9NX2RhdGEoKSArIF9fb2ZmOworCQl9CisJICAgIH0KKwkgIF9NX2NvcHkoX01fZGF0YSgpICsgdGhpcy0+c2l6ZSgpLCBfX3MsIF9fbik7CisJICBfTV9yZXAoKS0+X01fc2V0X2xlbmd0aF9hbmRfc2hhcmFibGUoX19sZW4pOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBhcHBlbmQoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19zaXplID0gX19zdHIuc2l6ZSgpOworICAgICAgaWYgKF9fc2l6ZSkKKwl7CisJICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBfX3NpemUgKyB0aGlzLT5zaXplKCk7CisJICBpZiAoX19sZW4gPiB0aGlzLT5jYXBhY2l0eSgpIHx8IF9NX3JlcCgpLT5fTV9pc19zaGFyZWQoKSkKKwkgICAgdGhpcy0+cmVzZXJ2ZShfX2xlbik7CisJICBfTV9jb3B5KF9NX2RhdGEoKSArIHRoaXMtPnNpemUoKSwgX19zdHIuX01fZGF0YSgpLCBfX3NpemUpOworCSAgX01fcmVwKCktPl9NX3NldF9sZW5ndGhfYW5kX3NoYXJhYmxlKF9fbGVuKTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfSAgICAKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGFwcGVuZChjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX19zdHIuX01fY2hlY2soX19wb3MsICJiYXNpY19zdHJpbmc6OmFwcGVuZCIpOworICAgICAgX19uID0gX19zdHIuX01fbGltaXQoX19wb3MsIF9fbik7CisgICAgICBpZiAoX19uKQorCXsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IF9fbiArIHRoaXMtPnNpemUoKTsKKwkgIGlmIChfX2xlbiA+IHRoaXMtPmNhcGFjaXR5KCkgfHwgX01fcmVwKCktPl9NX2lzX3NoYXJlZCgpKQorCSAgICB0aGlzLT5yZXNlcnZlKF9fbGVuKTsKKwkgIF9NX2NvcHkoX01fZGF0YSgpICsgdGhpcy0+c2l6ZSgpLCBfX3N0ci5fTV9kYXRhKCkgKyBfX3BvcywgX19uKTsKKwkgIF9NX3JlcCgpLT5fTV9zZXRfbGVuZ3RoX2FuZF9zaGFyYWJsZShfX2xlbik7CSAgCisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mCisgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgICAgeworICAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgICBfTV9jaGVjayhfX3BvcywgImJhc2ljX3N0cmluZzo6aW5zZXJ0Iik7CisgICAgICAgX01fY2hlY2tfbGVuZ3RoKHNpemVfdHlwZSgwKSwgX19uLCAiYmFzaWNfc3RyaW5nOjppbnNlcnQiKTsKKyAgICAgICBpZiAoX01fZGlzanVuY3QoX19zKSB8fCBfTV9yZXAoKS0+X01faXNfc2hhcmVkKCkpCisgICAgICAgICByZXR1cm4gX01fcmVwbGFjZV9zYWZlKF9fcG9zLCBzaXplX3R5cGUoMCksIF9fcywgX19uKTsKKyAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgIC8vIFdvcmsgaW4tcGxhY2UuCisgICAgICAgICAgIGNvbnN0IHNpemVfdHlwZSBfX29mZiA9IF9fcyAtIF9NX2RhdGEoKTsKKyAgICAgICAgICAgX01fbXV0YXRlKF9fcG9zLCAwLCBfX24pOworICAgICAgICAgICBfX3MgPSBfTV9kYXRhKCkgKyBfX29mZjsKKyAgICAgICAgICAgX0NoYXJUKiBfX3AgPSBfTV9kYXRhKCkgKyBfX3BvczsKKyAgICAgICAgICAgaWYgKF9fcyAgKyBfX24gPD0gX19wKQorICAgICAgICAgICAgIF9NX2NvcHkoX19wLCBfX3MsIF9fbik7CisgICAgICAgICAgIGVsc2UgaWYgKF9fcyA+PSBfX3ApCisgICAgICAgICAgICAgX01fY29weShfX3AsIF9fcyArIF9fbiwgX19uKTsKKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIHsKKwkgICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbmxlZnQgPSBfX3AgLSBfX3M7CisgICAgICAgICAgICAgICBfTV9jb3B5KF9fcCwgX19zLCBfX25sZWZ0KTsKKyAgICAgICAgICAgICAgIF9NX2NvcHkoX19wICsgX19ubGVmdCwgX19wICsgX19uLCBfX24gLSBfX25sZWZ0KTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgIH0KKyAgICAgfQorCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgeworICAgICAgIF9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfX2ZpcnN0ID49IF9NX2liZWdpbigpICYmIF9fZmlyc3QgPD0gX19sYXN0CisJCQkJJiYgX19sYXN0IDw9IF9NX2llbmQoKSk7CisKKyAgICAgICAvLyBOQjogVGhpcyBpc24ndCBqdXN0IGFuIG9wdGltaXphdGlvbiAoYmFpbCBvdXQgZWFybHkgd2hlbgorICAgICAgIC8vIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8sIHJlYWxseSksIGl0J3MgYWxzbyBhIGNvcnJlY3RuZXNzCisgICAgICAgLy8gaXNzdWUgdnMgTVQsIHNlZSBsaWJzdGRjKysvNDA1MTguCisgICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgICAgaWYgKF9fc2l6ZSkKKwkgeworCSAgIGNvbnN0IHNpemVfdHlwZSBfX3BvcyA9IF9fZmlyc3QgLSBfTV9pYmVnaW4oKTsKKwkgICBfTV9tdXRhdGUoX19wb3MsIF9fc2l6ZSwgc2l6ZV90eXBlKDApKTsKKwkgICBfTV9yZXAoKS0+X01fc2V0X2xlYWtlZCgpOworCSAgIHJldHVybiBpdGVyYXRvcihfTV9kYXRhKCkgKyBfX3Bvcyk7CisJIH0KKyAgICAgICBlbHNlCisJIHJldHVybiBfX2ZpcnN0OworICAgICB9CisKKyAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JgorICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICAgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcywKKwkgICAgIHNpemVfdHlwZSBfX24yKQorICAgICB7CisgICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24yKTsKKyAgICAgICBfTV9jaGVjayhfX3BvcywgImJhc2ljX3N0cmluZzo6cmVwbGFjZSIpOworICAgICAgIF9fbjEgPSBfTV9saW1pdChfX3BvcywgX19uMSk7CisgICAgICAgX01fY2hlY2tfbGVuZ3RoKF9fbjEsIF9fbjIsICJiYXNpY19zdHJpbmc6OnJlcGxhY2UiKTsKKyAgICAgICBib29sIF9fbGVmdDsKKyAgICAgICBpZiAoX01fZGlzanVuY3QoX19zKSB8fCBfTV9yZXAoKS0+X01faXNfc2hhcmVkKCkpCisgICAgICAgICByZXR1cm4gX01fcmVwbGFjZV9zYWZlKF9fcG9zLCBfX24xLCBfX3MsIF9fbjIpOworICAgICAgIGVsc2UgaWYgKChfX2xlZnQgPSBfX3MgKyBfX24yIDw9IF9NX2RhdGEoKSArIF9fcG9zKQorCQl8fCBfTV9kYXRhKCkgKyBfX3BvcyArIF9fbjEgPD0gX19zKQorCSB7CisJICAgLy8gV29yayBpbi1wbGFjZTogbm9uLW92ZXJsYXBwaW5nIGNhc2UuCisJICAgc2l6ZV90eXBlIF9fb2ZmID0gX19zIC0gX01fZGF0YSgpOworCSAgIF9fbGVmdCA/IF9fb2ZmIDogKF9fb2ZmICs9IF9fbjIgLSBfX24xKTsKKwkgICBfTV9tdXRhdGUoX19wb3MsIF9fbjEsIF9fbjIpOworCSAgIF9NX2NvcHkoX01fZGF0YSgpICsgX19wb3MsIF9NX2RhdGEoKSArIF9fb2ZmLCBfX24yKTsKKwkgICByZXR1cm4gKnRoaXM7CisJIH0KKyAgICAgICBlbHNlCisJIHsKKwkgICAvLyBUb2RvOiBvdmVybGFwcGluZyBjYXNlLgorCSAgIGNvbnN0IGJhc2ljX3N0cmluZyBfX3RtcChfX3MsIF9fbjIpOworCSAgIHJldHVybiBfTV9yZXBsYWNlX3NhZmUoX19wb3MsIF9fbjEsIF9fdG1wLl9NX2RhdGEoKSwgX19uMik7CisJIH0KKyAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpfUmVwOjoKKyAgICBfTV9kZXN0cm95KGNvbnN0IF9BbGxvYyYgX19hKSB0aHJvdyAoKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSBzaXplb2YoX1JlcF9iYXNlKSArCisJICAgICAgICAgICAgICAgICAgICAgICAodGhpcy0+X01fY2FwYWNpdHkgKyAxKSAqIHNpemVvZihfQ2hhclQpOworICAgICAgX1Jhd19ieXRlc19hbGxvYyhfX2EpLmRlYWxsb2NhdGUocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4odGhpcyksIF9fc2l6ZSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfTV9sZWFrX2hhcmQoKQorICAgIHsKKyNpZiBfR0xJQkNYWF9GVUxMWV9EWU5BTUlDX1NUUklORyA9PSAwCisgICAgICBpZiAoX01fcmVwKCkgPT0gJl9TX2VtcHR5X3JlcCgpKQorCXJldHVybjsKKyNlbmRpZgorICAgICAgaWYgKF9NX3JlcCgpLT5fTV9pc19zaGFyZWQoKSkKKwlfTV9tdXRhdGUoMCwgMCwgMCk7CisgICAgICBfTV9yZXAoKS0+X01fc2V0X2xlYWtlZCgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX01fbXV0YXRlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbGVuMSwgc2l6ZV90eXBlIF9fbGVuMikKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX25ld19zaXplID0gX19vbGRfc2l6ZSArIF9fbGVuMiAtIF9fbGVuMTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2hvd19tdWNoID0gX19vbGRfc2l6ZSAtIF9fcG9zIC0gX19sZW4xOworCisgICAgICBpZiAoX19uZXdfc2l6ZSA+IHRoaXMtPmNhcGFjaXR5KCkgfHwgX01fcmVwKCktPl9NX2lzX3NoYXJlZCgpKQorCXsKKwkgIC8vIE11c3QgcmVhbGxvY2F0ZS4KKwkgIGNvbnN0IGFsbG9jYXRvcl90eXBlIF9fYSA9IGdldF9hbGxvY2F0b3IoKTsKKwkgIF9SZXAqIF9fciA9IF9SZXA6Ol9TX2NyZWF0ZShfX25ld19zaXplLCB0aGlzLT5jYXBhY2l0eSgpLCBfX2EpOworCisJICBpZiAoX19wb3MpCisJICAgIF9NX2NvcHkoX19yLT5fTV9yZWZkYXRhKCksIF9NX2RhdGEoKSwgX19wb3MpOworCSAgaWYgKF9faG93X211Y2gpCisJICAgIF9NX2NvcHkoX19yLT5fTV9yZWZkYXRhKCkgKyBfX3BvcyArIF9fbGVuMiwKKwkJICAgIF9NX2RhdGEoKSArIF9fcG9zICsgX19sZW4xLCBfX2hvd19tdWNoKTsKKworCSAgX01fcmVwKCktPl9NX2Rpc3Bvc2UoX19hKTsKKwkgIF9NX2RhdGEoX19yLT5fTV9yZWZkYXRhKCkpOworCX0KKyAgICAgIGVsc2UgaWYgKF9faG93X211Y2ggJiYgX19sZW4xICE9IF9fbGVuMikKKwl7CisJICAvLyBXb3JrIGluLXBsYWNlLgorCSAgX01fbW92ZShfTV9kYXRhKCkgKyBfX3BvcyArIF9fbGVuMiwKKwkJICBfTV9kYXRhKCkgKyBfX3BvcyArIF9fbGVuMSwgX19ob3dfbXVjaCk7CisJfQorICAgICAgX01fcmVwKCktPl9NX3NldF9sZW5ndGhfYW5kX3NoYXJhYmxlKF9fbmV3X3NpemUpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgcmVzZXJ2ZShzaXplX3R5cGUgX19yZXMpCisgICAgeworICAgICAgaWYgKF9fcmVzICE9IHRoaXMtPmNhcGFjaXR5KCkgfHwgX01fcmVwKCktPl9NX2lzX3NoYXJlZCgpKQorICAgICAgICB7CisJICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3Qgc2hyaW5rIGJlbG93IHRoZSBjdXJyZW50IHNpemUKKwkgIGlmIChfX3JlcyA8IHRoaXMtPnNpemUoKSkKKwkgICAgX19yZXMgPSB0aGlzLT5zaXplKCk7CisJICBjb25zdCBhbGxvY2F0b3JfdHlwZSBfX2EgPSBnZXRfYWxsb2NhdG9yKCk7CisJICBfQ2hhclQqIF9fdG1wID0gX01fcmVwKCktPl9NX2Nsb25lKF9fYSwgX19yZXMgLSB0aGlzLT5zaXplKCkpOworCSAgX01fcmVwKCktPl9NX2Rpc3Bvc2UoX19hKTsKKwkgIF9NX2RhdGEoX190bXApOworICAgICAgICB9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBzd2FwKGJhc2ljX3N0cmluZyYgX19zKQorICAgIHsKKyAgICAgIGlmIChfTV9yZXAoKS0+X01faXNfbGVha2VkKCkpCisJX01fcmVwKCktPl9NX3NldF9zaGFyYWJsZSgpOworICAgICAgaWYgKF9fcy5fTV9yZXAoKS0+X01faXNfbGVha2VkKCkpCisJX19zLl9NX3JlcCgpLT5fTV9zZXRfc2hhcmFibGUoKTsKKyAgICAgIGlmICh0aGlzLT5nZXRfYWxsb2NhdG9yKCkgPT0gX19zLmdldF9hbGxvY2F0b3IoKSkKKwl7CisJICBfQ2hhclQqIF9fdG1wID0gX01fZGF0YSgpOworCSAgX01fZGF0YShfX3MuX01fZGF0YSgpKTsKKwkgIF9fcy5fTV9kYXRhKF9fdG1wKTsKKwl9CisgICAgICAvLyBUaGUgY29kZSBiZWxvdyBjYW4gdXN1YWxseSBiZSBvcHRpbWl6ZWQgYXdheS4KKyAgICAgIGVsc2UKKwl7CisJICBjb25zdCBiYXNpY19zdHJpbmcgX190bXAxKF9NX2liZWdpbigpLCBfTV9pZW5kKCksCisJCQkJICAgIF9fcy5nZXRfYWxsb2NhdG9yKCkpOworCSAgY29uc3QgYmFzaWNfc3RyaW5nIF9fdG1wMihfX3MuX01faWJlZ2luKCksIF9fcy5fTV9pZW5kKCksCisJCQkJICAgIHRoaXMtPmdldF9hbGxvY2F0b3IoKSk7CisJICAqdGhpcyA9IF9fdG1wMjsKKwkgIF9fcyA9IF9fdG1wMTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Ol9SZXAqCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6X1JlcDo6CisgICAgX1NfY3JlYXRlKHNpemVfdHlwZSBfX2NhcGFjaXR5LCBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHksCisJICAgICAgY29uc3QgX0FsbG9jJiBfX2FsbG9jKQorICAgIHsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDgzLiAgU3RyaW5nOjpucG9zIHZzLiBzdHJpbmc6Om1heF9zaXplKCkKKyAgICAgIGlmIChfX2NhcGFjaXR5ID4gX1NfbWF4X3NpemUpCisJX190aHJvd19sZW5ndGhfZXJyb3IoX19OKCJiYXNpY19zdHJpbmc6Ol9TX2NyZWF0ZSIpKTsKKworICAgICAgLy8gVGhlIHN0YW5kYXJkIHBsYWNlcyBubyByZXN0cmljdGlvbiBvbiBhbGxvY2F0aW5nIG1vcmUgbWVtb3J5CisgICAgICAvLyB0aGFuIGlzIHN0cmljdGx5IG5lZWRlZCB3aXRoaW4gdGhpcyBsYXllciBhdCB0aGUgbW9tZW50IG9yIGFzCisgICAgICAvLyByZXF1ZXN0ZWQgYnkgYW4gZXhwbGljaXQgYXBwbGljYXRpb24gY2FsbCB0byByZXNlcnZlKCkuCisKKyAgICAgIC8vIE1hbnkgbWFsbG9jIGltcGxlbWVudGF0aW9ucyBwZXJmb3JtIHF1aXRlIHBvb3JseSB3aGVuIGFuCisgICAgICAvLyBhcHBsaWNhdGlvbiBhdHRlbXB0cyB0byBhbGxvY2F0ZSBtZW1vcnkgaW4gYSBzdGVwd2lzZSBmYXNoaW9uCisgICAgICAvLyBncm93aW5nIGVhY2ggYWxsb2NhdGlvbiBzaXplIGJ5IG9ubHkgMSBjaGFyLiAgQWRkaXRpb25hbGx5LAorICAgICAgLy8gaXQgbWFrZXMgbGl0dGxlIHNlbnNlIHRvIGFsbG9jYXRlIGxlc3MgbGluZWFyIG1lbW9yeSB0aGFuIHRoZQorICAgICAgLy8gbmF0dXJhbCBibG9ja2luZyBzaXplIG9mIHRoZSBtYWxsb2MgaW1wbGVtZW50YXRpb24uCisgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB3ZSB3b3VsZCBuZWVkIGEgc29tZXdoYXQgbG93LWxldmVsIGNhbGN1bGF0aW9uCisgICAgICAvLyB3aXRoIHR1bmVkIHBhcmFtZXRlcnMgdG8gZ2V0IHRoaXMgcGVyZmVjdCBmb3IgYW55IHBhcnRpY3VsYXIKKyAgICAgIC8vIG1hbGxvYyBpbXBsZW1lbnRhdGlvbi4gIEZvcnR1bmF0ZWx5LCBnZW5lcmFsaXphdGlvbnMgYWJvdXQKKyAgICAgIC8vIGNvbW1vbiBmZWF0dXJlcyBzZWVuIGFtb25nIGltcGxlbWVudGF0aW9ucyBzZWVtcyB0byBzdWZmaWNlLgorCisgICAgICAvLyBfX3BhZ2VzaXplIG5lZWQgbm90IG1hdGNoIHRoZSBhY3R1YWwgVk0gcGFnZSBzaXplIGZvciBnb29kCisgICAgICAvLyByZXN1bHRzIGluIHByYWN0aWNlLCB0aHVzIHdlIHBpY2sgYSBjb21tb24gdmFsdWUgb24gdGhlIGxvdworICAgICAgLy8gc2lkZS4gIF9fbWFsbG9jX2hlYWRlcl9zaXplIGlzIGFuIGVzdGltYXRlIG9mIHRoZSBhbW91bnQgb2YKKyAgICAgIC8vIG92ZXJoZWFkIHBlciBtZW1vcnkgYWxsb2NhdGlvbiAoaW4gcHJhY3RpY2Ugc2VlbiBOICogc2l6ZW9mCisgICAgICAvLyAodm9pZCopIHdoZXJlIE4gaXMgMCwgMiBvciA0KS4gIEFjY29yZGluZyB0byBmb2xrbG9yZSwKKyAgICAgIC8vIHBpY2tpbmcgdGhpcyB2YWx1ZSBvbiB0aGUgaGlnaCBzaWRlIGlzIGJldHRlciB0aGFuCisgICAgICAvLyBsb3ctYmFsbGluZyBpdCAoZXNwZWNpYWxseSB3aGVuIHRoaXMgYWxnb3JpdGhtIGlzIHVzZWQgd2l0aAorICAgICAgLy8gbWFsbG9jIGltcGxlbWVudGF0aW9ucyB0aGF0IGFsbG9jYXRlIG1lbW9yeSBibG9ja3Mgcm91bmRlZCB1cAorICAgICAgLy8gdG8gYSBzaXplIHdoaWNoIGlzIGEgcG93ZXIgb2YgMikuCisgICAgICBjb25zdCBzaXplX3R5cGUgX19wYWdlc2l6ZSA9IDQwOTY7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19tYWxsb2NfaGVhZGVyX3NpemUgPSA0ICogc2l6ZW9mKHZvaWQqKTsKKworICAgICAgLy8gVGhlIGJlbG93IGltcGxlbWVudHMgYW4gZXhwb25lbnRpYWwgZ3Jvd3RoIHBvbGljeSwgbmVjZXNzYXJ5IHRvCisgICAgICAvLyBtZWV0IGFtb3J0aXplZCBsaW5lYXIgdGltZSByZXF1aXJlbWVudHMgb2YgdGhlIGxpYnJhcnk6IHNlZQorICAgICAgLy8gaHR0cDovL2djYy5nbnUub3JnL21sL2xpYnN0ZGMrKy8yMDAxLTA3L21zZzAwMDg1Lmh0bWwuCisgICAgICAvLyBJdCdzIGFjdGl2ZSBmb3IgYWxsb2NhdGlvbnMgcmVxdWlyaW5nIGFuIGFtb3VudCBvZiBtZW1vcnkgYWJvdmUKKyAgICAgIC8vIHN5c3RlbSBwYWdlc2l6ZS4gVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUKKyAgICAgIC8vIHN0YW5kYXJkOiBodHRwOi8vZ2NjLmdudS5vcmcvbWwvbGlic3RkYysrLzIwMDEtMDcvbXNnMDAxMzAuaHRtbAorICAgICAgaWYgKF9fY2FwYWNpdHkgPiBfX29sZF9jYXBhY2l0eSAmJiBfX2NhcGFjaXR5IDwgMiAqIF9fb2xkX2NhcGFjaXR5KQorCV9fY2FwYWNpdHkgPSAyICogX19vbGRfY2FwYWNpdHk7CisKKyAgICAgIC8vIE5COiBOZWVkIGFuIGFycmF5IG9mIGNoYXJfdHlwZVtfX2NhcGFjaXR5XSwgcGx1cyBhIHRlcm1pbmF0aW5nCisgICAgICAvLyBudWxsIGNoYXJfdHlwZSgpIGVsZW1lbnQsIHBsdXMgZW5vdWdoIGZvciB0aGUgX1JlcCBkYXRhIHN0cnVjdHVyZS4KKyAgICAgIC8vIFdoZXcuIFNlZW1pbmdseSBzbyBuZWVkeSwgeWV0IHNvIGVsZW1lbnRhbC4KKyAgICAgIHNpemVfdHlwZSBfX3NpemUgPSAoX19jYXBhY2l0eSArIDEpICogc2l6ZW9mKF9DaGFyVCkgKyBzaXplb2YoX1JlcCk7CisKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2Fkal9zaXplID0gX19zaXplICsgX19tYWxsb2NfaGVhZGVyX3NpemU7CisgICAgICBpZiAoX19hZGpfc2l6ZSA+IF9fcGFnZXNpemUgJiYgX19jYXBhY2l0eSA+IF9fb2xkX2NhcGFjaXR5KQorCXsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX2V4dHJhID0gX19wYWdlc2l6ZSAtIF9fYWRqX3NpemUgJSBfX3BhZ2VzaXplOworCSAgX19jYXBhY2l0eSArPSBfX2V4dHJhIC8gc2l6ZW9mKF9DaGFyVCk7CisJICAvLyBOZXZlciBhbGxvY2F0ZSBhIHN0cmluZyBiaWdnZXIgdGhhbiBfU19tYXhfc2l6ZS4KKwkgIGlmIChfX2NhcGFjaXR5ID4gX1NfbWF4X3NpemUpCisJICAgIF9fY2FwYWNpdHkgPSBfU19tYXhfc2l6ZTsKKwkgIF9fc2l6ZSA9IChfX2NhcGFjaXR5ICsgMSkgKiBzaXplb2YoX0NoYXJUKSArIHNpemVvZihfUmVwKTsKKwl9CisKKyAgICAgIC8vIE5COiBNaWdodCB0aHJvdywgYnV0IG5vIHdvcnJpZXMgYWJvdXQgYSBsZWFrLCBtYXRlOiBfUmVwKCkKKyAgICAgIC8vIGRvZXMgbm90IHRocm93LgorICAgICAgdm9pZCogX19wbGFjZSA9IF9SYXdfYnl0ZXNfYWxsb2MoX19hbGxvYykuYWxsb2NhdGUoX19zaXplKTsKKyAgICAgIF9SZXAgKl9fcCA9IG5ldyAoX19wbGFjZSkgX1JlcDsKKyAgICAgIF9fcC0+X01fY2FwYWNpdHkgPSBfX2NhcGFjaXR5OworICAgICAgLy8gQUJJIGNvbXBhdGliaWxpdHkgLSAzLjQueCBzZXQgaW4gX1NfY3JlYXRlIGJvdGgKKyAgICAgIC8vIF9NX3JlZmNvdW50IGFuZCBfTV9sZW5ndGguICBBbGwgY2FsbGVycyBvZiBfU19jcmVhdGUKKyAgICAgIC8vIGluIGJhc2ljX3N0cmluZy50Y2MgdGhlbiBzZXQganVzdCBfTV9sZW5ndGguCisgICAgICAvLyBJbiA0LjAueCBhbmQgbGF0ZXIgYm90aCBfTV9yZWZjb3VudCBhbmQgX01fbGVuZ3RoCisgICAgICAvLyBhcmUgaW5pdGlhbGl6ZWQgaW4gdGhlIGNhbGxlcnMsIHVuZm9ydHVuYXRlbHkgd2UgY2FuCisgICAgICAvLyBoYXZlIDMuNC54IGNvbXBpbGVkIGNvZGUgd2l0aCBfU19jcmVhdGUgY2FsbGVycyBpbmxpbmVkCisgICAgICAvLyBjYWxsaW5nIDQuMC54KyBfU19jcmVhdGUuCisgICAgICBfX3AtPl9NX3NldF9zaGFyYWJsZSgpOworICAgICAgcmV0dXJuIF9fcDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX0NoYXJUKgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Ol9SZXA6OgorICAgIF9NX2Nsb25lKGNvbnN0IF9BbGxvYyYgX19hbGxvYywgc2l6ZV90eXBlIF9fcmVzKQorICAgIHsKKyAgICAgIC8vIFJlcXVlc3RlZCBjYXBhY2l0eSBvZiB0aGUgY2xvbmUuCisgICAgICBjb25zdCBzaXplX3R5cGUgX19yZXF1ZXN0ZWRfY2FwID0gdGhpcy0+X01fbGVuZ3RoICsgX19yZXM7CisgICAgICBfUmVwKiBfX3IgPSBfUmVwOjpfU19jcmVhdGUoX19yZXF1ZXN0ZWRfY2FwLCB0aGlzLT5fTV9jYXBhY2l0eSwKKwkJCQkgIF9fYWxsb2MpOworICAgICAgaWYgKHRoaXMtPl9NX2xlbmd0aCkKKwlfTV9jb3B5KF9fci0+X01fcmVmZGF0YSgpLCBfTV9yZWZkYXRhKCksIHRoaXMtPl9NX2xlbmd0aCk7CisKKyAgICAgIF9fci0+X01fc2V0X2xlbmd0aF9hbmRfc2hhcmFibGUodGhpcy0+X01fbGVuZ3RoKTsKKyAgICAgIHJldHVybiBfX3ItPl9NX3JlZmRhdGEoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIHJlc2l6ZShzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBfTV9jaGVja19sZW5ndGgoX19zaXplLCBfX24sICJiYXNpY19zdHJpbmc6OnJlc2l6ZSIpOworICAgICAgaWYgKF9fc2l6ZSA8IF9fbikKKwl0aGlzLT5hcHBlbmQoX19uIC0gX19zaXplLCBfX2MpOworICAgICAgZWxzZSBpZiAoX19uIDwgX19zaXplKQorCXRoaXMtPmVyYXNlKF9fbik7CisgICAgICAvLyBlbHNlIG5vdGhpbmcgKGluIHBhcnRpY3VsYXIsIGF2b2lkIGNhbGxpbmcgX01fbXV0YXRlKCkgdW5uZWNlc3NhcmlseS4pCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYKKyAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgICAgX01fcmVwbGFjZV9kaXNwYXRjaChpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBfSW5wdXRJdGVyYXRvciBfX2sxLAorCQkJICBfSW5wdXRJdGVyYXRvciBfX2syLCBfX2ZhbHNlX3R5cGUpCisgICAgICB7CisJY29uc3QgYmFzaWNfc3RyaW5nIF9fcyhfX2sxLCBfX2syKTsKKwljb25zdCBzaXplX3R5cGUgX19uMSA9IF9faTIgLSBfX2kxOworCV9NX2NoZWNrX2xlbmd0aChfX24xLCBfX3Muc2l6ZSgpLCAiYmFzaWNfc3RyaW5nOjpfTV9yZXBsYWNlX2Rpc3BhdGNoIik7CisJcmV0dXJuIF9NX3JlcGxhY2Vfc2FmZShfX2kxIC0gX01faWJlZ2luKCksIF9fbjEsIF9fcy5fTV9kYXRhKCksCisJCQkgICAgICAgX19zLnNpemUoKSk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfTV9yZXBsYWNlX2F1eChzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgc2l6ZV90eXBlIF9fbjIsCisJCSAgIF9DaGFyVCBfX2MpCisgICAgeworICAgICAgX01fY2hlY2tfbGVuZ3RoKF9fbjEsIF9fbjIsICJiYXNpY19zdHJpbmc6Ol9NX3JlcGxhY2VfYXV4Iik7CisgICAgICBfTV9tdXRhdGUoX19wb3MxLCBfX24xLCBfX24yKTsKKyAgICAgIGlmIChfX24yKQorCV9NX2Fzc2lnbihfTV9kYXRhKCkgKyBfX3BvczEsIF9fbjIsIF9fYyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX01fcmVwbGFjZV9zYWZlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcywKKwkJICAgIHNpemVfdHlwZSBfX24yKQorICAgIHsKKyAgICAgIF9NX211dGF0ZShfX3BvczEsIF9fbjEsIF9fbjIpOworICAgICAgaWYgKF9fbjIpCisJX01fY29weShfTV9kYXRhKCkgKyBfX3BvczEsIF9fcywgX19uMik7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisoY29uc3QgX0NoYXJUKiBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fbGhzKTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiBfX3N0cmluZ190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3N0cmluZ190eXBlOjpzaXplX3R5cGUJICBfX3NpemVfdHlwZTsKKyAgICAgIGNvbnN0IF9fc2l6ZV90eXBlIF9fbGVuID0gX1RyYWl0czo6bGVuZ3RoKF9fbGhzKTsKKyAgICAgIF9fc3RyaW5nX3R5cGUgX19zdHI7CisgICAgICBfX3N0ci5yZXNlcnZlKF9fbGVuICsgX19yaHMuc2l6ZSgpKTsKKyAgICAgIF9fc3RyLmFwcGVuZChfX2xocywgX19sZW4pOworICAgICAgX19zdHIuYXBwZW5kKF9fcmhzKTsKKyAgICAgIHJldHVybiBfX3N0cjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhfQ2hhclQgX19saHMsIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiBfX3N0cmluZ190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3N0cmluZ190eXBlOjpzaXplX3R5cGUJICBfX3NpemVfdHlwZTsKKyAgICAgIF9fc3RyaW5nX3R5cGUgX19zdHI7CisgICAgICBjb25zdCBfX3NpemVfdHlwZSBfX2xlbiA9IF9fcmhzLnNpemUoKTsKKyAgICAgIF9fc3RyLnJlc2VydmUoX19sZW4gKyAxKTsKKyAgICAgIF9fc3RyLmFwcGVuZChfX3NpemVfdHlwZSgxKSwgX19saHMpOworICAgICAgX19zdHIuYXBwZW5kKF9fcmhzKTsKKyAgICAgIHJldHVybiBfX3N0cjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgY29weShfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbiwgc2l6ZV90eXBlIF9fcG9zKSBjb25zdAorICAgIHsKKyAgICAgIF9NX2NoZWNrKF9fcG9zLCAiYmFzaWNfc3RyaW5nOjpjb3B5Iik7CisgICAgICBfX24gPSBfTV9saW1pdChfX3BvcywgX19uKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgIGlmIChfX24pCisJX01fY29weShfX3MsIF9NX2RhdGEoKSArIF9fcG9zLCBfX24pOworICAgICAgLy8gMjEuMy41LjcgcGFyIDM6IGRvIG5vdCBhcHBlbmQgbnVsbC4gIChnb29kLikKKyAgICAgIHJldHVybiBfX247CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19zaXplID0gdGhpcy0+c2l6ZSgpOworICAgICAgY29uc3QgX0NoYXJUKiBfX2RhdGEgPSBfTV9kYXRhKCk7CisKKyAgICAgIGlmIChfX24gPT0gMCkKKwlyZXR1cm4gX19wb3MgPD0gX19zaXplID8gX19wb3MgOiBucG9zOworCisgICAgICBpZiAoX19uIDw9IF9fc2l6ZSkKKwl7CisJICBmb3IgKDsgX19wb3MgPD0gX19zaXplIC0gX19uOyArK19fcG9zKQorCSAgICBpZiAodHJhaXRzX3R5cGU6OmVxKF9fZGF0YVtfX3Bvc10sIF9fc1swXSkKKwkJJiYgdHJhaXRzX3R5cGU6OmNvbXBhcmUoX19kYXRhICsgX19wb3MgKyAxLAorCQkJCQlfX3MgKyAxLCBfX24gLSAxKSA9PSAwKQorCSAgICAgIHJldHVybiBfX3BvczsKKwl9CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgc2l6ZV90eXBlIF9fcmV0ID0gbnBvczsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBpZiAoX19wb3MgPCBfX3NpemUpCisJeworCSAgY29uc3QgX0NoYXJUKiBfX2RhdGEgPSBfTV9kYXRhKCk7CisJICBjb25zdCBzaXplX3R5cGUgX19uID0gX19zaXplIC0gX19wb3M7CisJICBjb25zdCBfQ2hhclQqIF9fcCA9IHRyYWl0c190eXBlOjpmaW5kKF9fZGF0YSArIF9fcG9zLCBfX24sIF9fYyk7CisJICBpZiAoX19wKQorCSAgICBfX3JldCA9IF9fcCAtIF9fZGF0YTsKKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGlmIChfX24gPD0gX19zaXplKQorCXsKKwkgIF9fcG9zID0gc3RkOjptaW4oc2l6ZV90eXBlKF9fc2l6ZSAtIF9fbiksIF9fcG9zKTsKKwkgIGNvbnN0IF9DaGFyVCogX19kYXRhID0gX01fZGF0YSgpOworCSAgZG8KKwkgICAgeworCSAgICAgIGlmICh0cmFpdHNfdHlwZTo6Y29tcGFyZShfX2RhdGEgKyBfX3BvcywgX19zLCBfX24pID09IDApCisJCXJldHVybiBfX3BvczsKKwkgICAgfQorCSAgd2hpbGUgKF9fcG9zLS0gPiAwKTsKKwl9CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgcmZpbmQoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBpZiAoX19zaXplKQorCXsKKwkgIGlmICgtLV9fc2l6ZSA+IF9fcG9zKQorCSAgICBfX3NpemUgPSBfX3BvczsKKwkgIGZvciAoKytfX3NpemU7IF9fc2l6ZS0tID4gMDsgKQorCSAgICBpZiAodHJhaXRzX3R5cGU6OmVxKF9NX2RhdGEoKVtfX3NpemVdLCBfX2MpKQorCSAgICAgIHJldHVybiBfX3NpemU7CisJfQorICAgICAgcmV0dXJuIG5wb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGZpbmRfZmlyc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBmb3IgKDsgX19uICYmIF9fcG9zIDwgdGhpcy0+c2l6ZSgpOyArK19fcG9zKQorCXsKKwkgIGNvbnN0IF9DaGFyVCogX19wID0gdHJhaXRzX3R5cGU6OmZpbmQoX19zLCBfX24sIF9NX2RhdGEoKVtfX3Bvc10pOworCSAgaWYgKF9fcCkKKwkgICAgcmV0dXJuIF9fcG9zOworCX0KKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBmaW5kX2xhc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBzaXplX3R5cGUgX19zaXplID0gdGhpcy0+c2l6ZSgpOworICAgICAgaWYgKF9fc2l6ZSAmJiBfX24pCisJeworCSAgaWYgKC0tX19zaXplID4gX19wb3MpCisJICAgIF9fc2l6ZSA9IF9fcG9zOworCSAgZG8KKwkgICAgeworCSAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZmluZChfX3MsIF9fbiwgX01fZGF0YSgpW19fc2l6ZV0pKQorCQlyZXR1cm4gX19zaXplOworCSAgICB9CisJICB3aGlsZSAoX19zaXplLS0gIT0gMCk7CisJfQorICAgICAgcmV0dXJuIG5wb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgZm9yICg7IF9fcG9zIDwgdGhpcy0+c2l6ZSgpOyArK19fcG9zKQorCWlmICghdHJhaXRzX3R5cGU6OmZpbmQoX19zLCBfX24sIF9NX2RhdGEoKVtfX3Bvc10pKQorCSAgcmV0dXJuIF9fcG9zOworICAgICAgcmV0dXJuIG5wb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGZpbmRfZmlyc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7CisgICAgICBmb3IgKDsgX19wb3MgPCB0aGlzLT5zaXplKCk7ICsrX19wb3MpCisJaWYgKCF0cmFpdHNfdHlwZTo6ZXEoX01fZGF0YSgpW19fcG9zXSwgX19jKSkKKwkgIHJldHVybiBfX3BvczsKKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGlmIChfX3NpemUpCisJeworCSAgaWYgKC0tX19zaXplID4gX19wb3MpCisJICAgIF9fc2l6ZSA9IF9fcG9zOworCSAgZG8KKwkgICAgeworCSAgICAgIGlmICghdHJhaXRzX3R5cGU6OmZpbmQoX19zLCBfX24sIF9NX2RhdGEoKVtfX3NpemVdKSkKKwkJcmV0dXJuIF9fc2l6ZTsKKwkgICAgfQorCSAgd2hpbGUgKF9fc2l6ZS0tKTsKKwl9CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgZmluZF9sYXN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGlmIChfX3NpemUpCisJeworCSAgaWYgKC0tX19zaXplID4gX19wb3MpCisJICAgIF9fc2l6ZSA9IF9fcG9zOworCSAgZG8KKwkgICAgeworCSAgICAgIGlmICghdHJhaXRzX3R5cGU6OmVxKF9NX2RhdGEoKVtfX3NpemVdLCBfX2MpKQorCQlyZXR1cm4gX19zaXplOworCSAgICB9CisJICB3aGlsZSAoX19zaXplLS0pOworCX0KKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbnQKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBjb21wYXJlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikgY29uc3QKKyAgICB7CisgICAgICBfTV9jaGVjayhfX3BvcywgImJhc2ljX3N0cmluZzo6Y29tcGFyZSIpOworICAgICAgX19uID0gX01fbGltaXQoX19wb3MsIF9fbik7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19vc2l6ZSA9IF9fc3RyLnNpemUoKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHN0ZDo6bWluKF9fbiwgX19vc2l6ZSk7CisgICAgICBpbnQgX19yID0gdHJhaXRzX3R5cGU6OmNvbXBhcmUoX01fZGF0YSgpICsgX19wb3MsIF9fc3RyLmRhdGEoKSwgX19sZW4pOworICAgICAgaWYgKCFfX3IpCisJX19yID0gX1NfY29tcGFyZShfX24sIF9fb3NpemUpOworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW50CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwKKwkgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjIpIGNvbnN0CisgICAgeworICAgICAgX01fY2hlY2soX19wb3MxLCAiYmFzaWNfc3RyaW5nOjpjb21wYXJlIik7CisgICAgICBfX3N0ci5fTV9jaGVjayhfX3BvczIsICJiYXNpY19zdHJpbmc6OmNvbXBhcmUiKTsKKyAgICAgIF9fbjEgPSBfTV9saW1pdChfX3BvczEsIF9fbjEpOworICAgICAgX19uMiA9IF9fc3RyLl9NX2xpbWl0KF9fcG9zMiwgX19uMik7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBzdGQ6Om1pbihfX24xLCBfX24yKTsKKyAgICAgIGludCBfX3IgPSB0cmFpdHNfdHlwZTo6Y29tcGFyZShfTV9kYXRhKCkgKyBfX3BvczEsCisJCQkJICAgICBfX3N0ci5kYXRhKCkgKyBfX3BvczIsIF9fbGVuKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IF9TX2NvbXBhcmUoX19uMSwgX19uMik7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbnQKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBjb21wYXJlKGNvbnN0IF9DaGFyVCogX19zKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19vc2l6ZSA9IHRyYWl0c190eXBlOjpsZW5ndGgoX19zKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHN0ZDo6bWluKF9fc2l6ZSwgX19vc2l6ZSk7CisgICAgICBpbnQgX19yID0gdHJhaXRzX3R5cGU6OmNvbXBhcmUoX01fZGF0YSgpLCBfX3MsIF9fbGVuKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IF9TX2NvbXBhcmUoX19zaXplLCBfX29zaXplKTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGludAorICAgIGJhc2ljX3N0cmluZyA8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBjb21wYXJlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKyAgICAgIF9NX2NoZWNrKF9fcG9zLCAiYmFzaWNfc3RyaW5nOjpjb21wYXJlIik7CisgICAgICBfX24xID0gX01fbGltaXQoX19wb3MsIF9fbjEpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fb3NpemUgPSB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcyk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBzdGQ6Om1pbihfX24xLCBfX29zaXplKTsKKyAgICAgIGludCBfX3IgPSB0cmFpdHNfdHlwZTo6Y29tcGFyZShfTV9kYXRhKCkgKyBfX3BvcywgX19zLCBfX2xlbik7CisgICAgICBpZiAoIV9fcikKKwlfX3IgPSBfU19jb21wYXJlKF9fbjEsIF9fb3NpemUpOworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW50CisgICAgYmFzaWNfc3RyaW5nIDxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MsCisJICAgIHNpemVfdHlwZSBfX24yKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uMik7CisgICAgICBfTV9jaGVjayhfX3BvcywgImJhc2ljX3N0cmluZzo6Y29tcGFyZSIpOworICAgICAgX19uMSA9IF9NX2xpbWl0KF9fcG9zLCBfX24xKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHN0ZDo6bWluKF9fbjEsIF9fbjIpOworICAgICAgaW50IF9fciA9IHRyYWl0c190eXBlOjpjb21wYXJlKF9NX2RhdGEoKSArIF9fcG9zLCBfX3MsIF9fbGVuKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IF9TX2NvbXBhcmUoX19uMSwgX19uMik7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICAvLyAyMS4zLjcuOSBiYXNpY19zdHJpbmc6OmdldGxpbmUgYW5kIG9wZXJhdG9ycworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faW4sCisJICAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fc3RyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+CQlfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPglfX3N0cmluZ190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgICAgICBfX2lvc19iYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW50X3R5cGUJCV9faW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fc3RyaW5nX3R5cGU6OnNpemVfdHlwZQkJX19zaXplX3R5cGU7CisgICAgICB0eXBlZGVmIGN0eXBlPF9DaGFyVD4JCQkJX19jdHlwZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2N0eXBlX3R5cGU6OmN0eXBlX2Jhc2UgICAgICAgICBfX2N0eXBlX2Jhc2U7CisKKyAgICAgIF9fc2l6ZV90eXBlIF9fZXh0cmFjdGVkID0gMDsKKyAgICAgIHR5cGVuYW1lIF9faW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBfX2lvc19iYXNlOjpnb29kYml0OworICAgICAgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6OnNlbnRyeSBfX2NlcmIoX19pbiwgZmFsc2UpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgLy8gQXZvaWQgcmVhbGxvY2F0aW9uIGZvciBjb21tb24gY2FzZS4KKwkgICAgICBfX3N0ci5lcmFzZSgpOworCSAgICAgIF9DaGFyVCBfX2J1ZlsxMjhdOworCSAgICAgIF9fc2l6ZV90eXBlIF9fbGVuID0gMDsJICAgICAgCisJICAgICAgY29uc3Qgc3RyZWFtc2l6ZSBfX3cgPSBfX2luLndpZHRoKCk7CisJICAgICAgY29uc3QgX19zaXplX3R5cGUgX19uID0gX193ID4gMCA/IHN0YXRpY19jYXN0PF9fc2l6ZV90eXBlPihfX3cpCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19zdHIubWF4X3NpemUoKTsKKwkgICAgICBjb25zdCBfX2N0eXBlX3R5cGUmIF9fY3QgPSB1c2VfZmFjZXQ8X19jdHlwZV90eXBlPihfX2luLmdldGxvYygpKTsKKwkgICAgICBjb25zdCBfX2ludF90eXBlIF9fZW9mID0gX1RyYWl0czo6ZW9mKCk7CisJICAgICAgX19pbnRfdHlwZSBfX2MgPSBfX2luLnJkYnVmKCktPnNnZXRjKCk7CisKKwkgICAgICB3aGlsZSAoX19leHRyYWN0ZWQgPCBfX24KKwkJICAgICAmJiAhX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikKKwkJICAgICAmJiAhX19jdC5pcyhfX2N0eXBlX2Jhc2U6OnNwYWNlLAorCQkJCSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKSkpCisJCXsKKwkJICBpZiAoX19sZW4gPT0gc2l6ZW9mKF9fYnVmKSAvIHNpemVvZihfQ2hhclQpKQorCQkgICAgeworCQkgICAgICBfX3N0ci5hcHBlbmQoX19idWYsIHNpemVvZihfX2J1ZikgLyBzaXplb2YoX0NoYXJUKSk7CisJCSAgICAgIF9fbGVuID0gMDsKKwkJICAgIH0KKwkJICBfX2J1ZltfX2xlbisrXSA9IF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpOworCQkgICsrX19leHRyYWN0ZWQ7CisJCSAgX19jID0gX19pbi5yZGJ1ZigpLT5zbmV4dGMoKTsKKwkJfQorCSAgICAgIF9fc3RyLmFwcGVuZChfX2J1ZiwgX19sZW4pOworCisJICAgICAgaWYgKF9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKQorCQlfX2VyciB8PSBfX2lvc19iYXNlOjplb2ZiaXQ7CisJICAgICAgX19pbi53aWR0aCgwKTsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgX19pbi5fTV9zZXRzdGF0ZShfX2lvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgICAgICAvLyA5MS4gRGVzY3JpcHRpb24gb2Ygb3BlcmF0b3I+PiBhbmQgZ2V0bGluZSgpIGZvciBzdHJpbmc8PgorCSAgICAgIC8vIG1pZ2h0IGNhdXNlIGVuZGxlc3MgbG9vcAorCSAgICAgIF9faW4uX01fc2V0c3RhdGUoX19pb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgfQorCX0KKyAgICAgIC8vIDIxMS4gIG9wZXJhdG9yPj4oaXN0cmVhbSYsIHN0cmluZyYpIGRvZXNuJ3Qgc2V0IGZhaWxiaXQKKyAgICAgIGlmICghX19leHRyYWN0ZWQpCisJX19lcnIgfD0gX19pb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgIGlmIChfX2VycikKKwlfX2luLnNldHN0YXRlKF9fZXJyKTsKKyAgICAgIHJldHVybiBfX2luOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgZ2V0bGluZShiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faW4sCisJICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fc3RyLCBfQ2hhclQgX19kZWxpbSkKKyAgICB7CisgICAgICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPgkJX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4JX19zdHJpbmdfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgICAgICAgX19pb3NfYmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6OmludF90eXBlCQlfX2ludF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3N0cmluZ190eXBlOjpzaXplX3R5cGUJCV9fc2l6ZV90eXBlOworCisgICAgICBfX3NpemVfdHlwZSBfX2V4dHJhY3RlZCA9IDA7CisgICAgICBjb25zdCBfX3NpemVfdHlwZSBfX24gPSBfX3N0ci5tYXhfc2l6ZSgpOworICAgICAgdHlwZW5hbWUgX19pb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IF9faW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6c2VudHJ5IF9fY2VyYihfX2luLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgX190cnkKKwkgICAgeworCSAgICAgIF9fc3RyLmVyYXNlKCk7CisJICAgICAgY29uc3QgX19pbnRfdHlwZSBfX2lkZWxpbSA9IF9UcmFpdHM6OnRvX2ludF90eXBlKF9fZGVsaW0pOworCSAgICAgIGNvbnN0IF9faW50X3R5cGUgX19lb2YgPSBfVHJhaXRzOjplb2YoKTsKKwkgICAgICBfX2ludF90eXBlIF9fYyA9IF9faW4ucmRidWYoKS0+c2dldGMoKTsKKworCSAgICAgIHdoaWxlIChfX2V4dHJhY3RlZCA8IF9fbgorCQkgICAgICYmICFfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKQorCQkgICAgICYmICFfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MsIF9faWRlbGltKSkKKwkJeworCQkgIF9fc3RyICs9IF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpOworCQkgICsrX19leHRyYWN0ZWQ7CisJCSAgX19jID0gX19pbi5yZGJ1ZigpLT5zbmV4dGMoKTsKKwkJfQorCisJICAgICAgaWYgKF9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKQorCQlfX2VyciB8PSBfX2lvc19iYXNlOjplb2ZiaXQ7CisJICAgICAgZWxzZSBpZiAoX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfX2lkZWxpbSkpCisJCXsKKwkJICArK19fZXh0cmFjdGVkOwkJICAKKwkJICBfX2luLnJkYnVmKCktPnNidW1wYygpOworCQl9CisJICAgICAgZWxzZQorCQlfX2VyciB8PSBfX2lvc19iYXNlOjpmYWlsYml0OworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICBfX2luLl9NX3NldHN0YXRlKF9faW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgICAgIC8vIDkxLiBEZXNjcmlwdGlvbiBvZiBvcGVyYXRvcj4+IGFuZCBnZXRsaW5lKCkgZm9yIHN0cmluZzw+CisJICAgICAgLy8gbWlnaHQgY2F1c2UgZW5kbGVzcyBsb29wCisJICAgICAgX19pbi5fTV9zZXRzdGF0ZShfX2lvc19iYXNlOjpiYWRiaXQpOworCSAgICB9CisJfQorICAgICAgaWYgKCFfX2V4dHJhY3RlZCkKKwlfX2VyciB8PSBfX2lvc19iYXNlOjpmYWlsYml0OworICAgICAgaWYgKF9fZXJyKQorCV9faW4uc2V0c3RhdGUoX19lcnIpOworICAgICAgcmV0dXJuIF9faW47CisgICAgfQorCisgIC8vIEluaGliaXQgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgZm9yIHJlcXVpcmVkIGluc3RhbnRpYXRpb25zLAorICAvLyB3aGljaCBhcmUgZGVmaW5lZCB2aWEgZXhwbGljaXQgaW5zdGFudGlhdGlvbnMgZWxzZXdoZXJlLgorI2lmIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURSA+IDAKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX3N0cmluZzxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYmFzaWNfaXN0cmVhbTxjaGFyPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhcj4mLCBzdHJpbmcmKTsKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYmFzaWNfb3N0cmVhbTxjaGFyPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhcj4mLCBjb25zdCBzdHJpbmcmKTsKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYmFzaWNfaXN0cmVhbTxjaGFyPiYKKyAgICBnZXRsaW5lKGJhc2ljX2lzdHJlYW08Y2hhcj4mLCBzdHJpbmcmLCBjaGFyKTsKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYmFzaWNfaXN0cmVhbTxjaGFyPiYKKyAgICBnZXRsaW5lKGJhc2ljX2lzdHJlYW08Y2hhcj4mLCBzdHJpbmcmKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19zdHJpbmc8d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJhc2ljX2lzdHJlYW08d2NoYXJfdD4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPHdjaGFyX3Q+Jiwgd3N0cmluZyYpOworICBleHRlcm4gdGVtcGxhdGUKKyAgICBiYXNpY19vc3RyZWFtPHdjaGFyX3Q+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTx3Y2hhcl90PiYsIGNvbnN0IHdzdHJpbmcmKTsKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYmFzaWNfaXN0cmVhbTx3Y2hhcl90PiYKKyAgICBnZXRsaW5lKGJhc2ljX2lzdHJlYW08d2NoYXJfdD4mLCB3c3RyaW5nJiwgd2NoYXJfdCk7CisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJhc2ljX2lzdHJlYW08d2NoYXJfdD4mCisgICAgZ2V0bGluZShiYXNpY19pc3RyZWFtPHdjaGFyX3Q+Jiwgd3N0cmluZyYpOworI2VuZGlmCisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYm9vc3RfY29uY2VwdF9jaGVjay5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2Jvb3N0X2NvbmNlcHRfY2hlY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzNiOGFhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2Jvb3N0X2NvbmNlcHRfY2hlY2suaApAQCAtMCwwICsxLDc5MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gKEMpIENvcHlyaWdodCBKZXJlbXkgU2llayAyMDAwLiBQZXJtaXNzaW9uIHRvIGNvcHksIHVzZSwgbW9kaWZ5LAorLy8gc2VsbCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGlzIGdyYW50ZWQgcHJvdmlkZWQgdGhpcworLy8gY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMuIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQKKy8vICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHksIGFuZCB3aXRoIG5vIGNsYWltIGFzCisvLyB0byBpdHMgc3VpdGFiaWxpdHkgZm9yIGFueSBwdXJwb3NlLgorLy8KKworLyoqIEBmaWxlIGJpdHMvYm9vc3RfY29uY2VwdF9jaGVjay5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aXRlcmF0b3J9CisgKi8KKworLy8gR0NDIE5vdGU6ICBiYXNlZCBvbiB2ZXJzaW9uIDEuMTIuMCBvZiB0aGUgQm9vc3QgbGlicmFyeS4KKworI2lmbmRlZiBfQk9PU1RfQ09OQ0VQVF9DSEVDS19ICisjZGVmaW5lIF9CT09TVF9DT05DRVBUX0NIRUNLX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfdHlwZXMuaD4gICAgLy8gZm9yIHRyYWl0cyBhbmQgdGFncworCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyNkZWZpbmUgX0lzVW51c2VkIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSkKKworLy8gV2hlbiB0aGUgQy1DIGNvZGUgaXMgaW4gdXNlLCB3ZSB3b3VsZCBsaWtlIHRoaXMgZnVuY3Rpb24gdG8gZG8gYXMgbGl0dGxlCisvLyBhcyBwb3NzaWJsZSBhdCBydW50aW1lLCB1c2UgYXMgZmV3IHJlc291cmNlcyBhcyBwb3NzaWJsZSwgYW5kIGhvcGVmdWxseQorLy8gYmUgZWxpZGVkIG91dCBvZiBleGlzdGVuY2UuLi4gaG1tbS4KK3RlbXBsYXRlIDxjbGFzcyBfQ29uY2VwdD4KK2lubGluZSB2b2lkIF9fZnVuY3Rpb25fcmVxdWlyZXMoKQoreworICB2b2lkIChfQ29uY2VwdDo6Kl9feCkoKSBfSXNVbnVzZWQgPSAmX0NvbmNlcHQ6Ol9fY29uc3RyYWludHM7Cit9CisKKy8vIE5vIGRlZmluaXRpb246IGlmIHRoaXMgaXMgcmVmZXJlbmNlZCwgdGhlcmUncyBhIHByb2JsZW0gd2l0aAorLy8gdGhlIGluc3RhbnRpYXRpbmcgdHlwZSBub3QgYmVpbmcgb25lIG9mIHRoZSByZXF1aXJlZCBpbnRlZ2VyIHR5cGVzLgorLy8gVW5mb3J0dW5hdGVseSwgdGhpcyByZXN1bHRzIGluIGEgbGluay10aW1lIGVycm9yLCBub3QgYSBjb21waWxlLXRpbWUgZXJyb3IuCit2b2lkIF9fZXJyb3JfdHlwZV9tdXN0X2JlX2FuX2ludGVnZXJfdHlwZSgpOwordm9pZCBfX2Vycm9yX3R5cGVfbXVzdF9iZV9hbl91bnNpZ25lZF9pbnRlZ2VyX3R5cGUoKTsKK3ZvaWQgX19lcnJvcl90eXBlX211c3RfYmVfYV9zaWduZWRfaW50ZWdlcl90eXBlKCk7CisKKy8vID8/PyBTaG91bGQgdGhlICJjb25jZXB0X2NoZWNraW5nKiIgc3RydWN0cyBiZWdpbiB3aXRoIG1vcmUgdGhhbiBfID8KKyNkZWZpbmUgX0dMSUJDWFhfQ0xBU1NfUkVRVUlSRVMoX3R5cGVfdmFyLCBfbnMsIF9jb25jZXB0KSBcCisgIHR5cGVkZWYgdm9pZCAoX25zOjpfY29uY2VwdCA8X3R5cGVfdmFyPjo6KiBfZnVuYyMjX3R5cGVfdmFyIyNfY29uY2VwdCkoKTsgXAorICB0ZW1wbGF0ZSA8X2Z1bmMjI190eXBlX3ZhciMjX2NvbmNlcHQgX1RwMT4gXAorICBzdHJ1Y3QgX2NvbmNlcHRfY2hlY2tpbmcjI190eXBlX3ZhciMjX2NvbmNlcHQgeyB9OyBcCisgIHR5cGVkZWYgX2NvbmNlcHRfY2hlY2tpbmcjI190eXBlX3ZhciMjX2NvbmNlcHQ8IFwKKyAgICAmX25zOjpfY29uY2VwdCA8X3R5cGVfdmFyPjo6X19jb25zdHJhaW50cz4gXAorICAgIF9jb25jZXB0X2NoZWNraW5nX3R5cGVkZWYjI190eXBlX3ZhciMjX2NvbmNlcHQKKworI2RlZmluZSBfR0xJQkNYWF9DTEFTU19SRVFVSVJFUzIoX3R5cGVfdmFyMSwgX3R5cGVfdmFyMiwgX25zLCBfY29uY2VwdCkgXAorICB0eXBlZGVmIHZvaWQgKF9uczo6X2NvbmNlcHQgPF90eXBlX3ZhcjEsX3R5cGVfdmFyMj46OiogX2Z1bmMjI190eXBlX3ZhcjEjI190eXBlX3ZhcjIjI19jb25jZXB0KSgpOyBcCisgIHRlbXBsYXRlIDxfZnVuYyMjX3R5cGVfdmFyMSMjX3R5cGVfdmFyMiMjX2NvbmNlcHQgX1RwMT4gXAorICBzdHJ1Y3QgX2NvbmNlcHRfY2hlY2tpbmcjI190eXBlX3ZhcjEjI190eXBlX3ZhcjIjI19jb25jZXB0IHsgfTsgXAorICB0eXBlZGVmIF9jb25jZXB0X2NoZWNraW5nIyNfdHlwZV92YXIxIyNfdHlwZV92YXIyIyNfY29uY2VwdDwgXAorICAgICZfbnM6Ol9jb25jZXB0IDxfdHlwZV92YXIxLF90eXBlX3ZhcjI+OjpfX2NvbnN0cmFpbnRzPiBcCisgICAgX2NvbmNlcHRfY2hlY2tpbmdfdHlwZWRlZiMjX3R5cGVfdmFyMSMjX3R5cGVfdmFyMiMjX2NvbmNlcHQKKworI2RlZmluZSBfR0xJQkNYWF9DTEFTU19SRVFVSVJFUzMoX3R5cGVfdmFyMSwgX3R5cGVfdmFyMiwgX3R5cGVfdmFyMywgX25zLCBfY29uY2VwdCkgXAorICB0eXBlZGVmIHZvaWQgKF9uczo6X2NvbmNlcHQgPF90eXBlX3ZhcjEsX3R5cGVfdmFyMixfdHlwZV92YXIzPjo6KiBfZnVuYyMjX3R5cGVfdmFyMSMjX3R5cGVfdmFyMiMjX3R5cGVfdmFyMyMjX2NvbmNlcHQpKCk7IFwKKyAgdGVtcGxhdGUgPF9mdW5jIyNfdHlwZV92YXIxIyNfdHlwZV92YXIyIyNfdHlwZV92YXIzIyNfY29uY2VwdCBfVHAxPiBcCisgIHN0cnVjdCBfY29uY2VwdF9jaGVja2luZyMjX3R5cGVfdmFyMSMjX3R5cGVfdmFyMiMjX3R5cGVfdmFyMyMjX2NvbmNlcHQgeyB9OyBcCisgIHR5cGVkZWYgX2NvbmNlcHRfY2hlY2tpbmcjI190eXBlX3ZhcjEjI190eXBlX3ZhcjIjI190eXBlX3ZhcjMjI19jb25jZXB0PCBcCisgICAgJl9uczo6X2NvbmNlcHQgPF90eXBlX3ZhcjEsX3R5cGVfdmFyMixfdHlwZV92YXIzPjo6X19jb25zdHJhaW50cz4gIFwKKyAgX2NvbmNlcHRfY2hlY2tpbmdfdHlwZWRlZiMjX3R5cGVfdmFyMSMjX3R5cGVfdmFyMiMjX3R5cGVfdmFyMyMjX2NvbmNlcHQKKworI2RlZmluZSBfR0xJQkNYWF9DTEFTU19SRVFVSVJFUzQoX3R5cGVfdmFyMSwgX3R5cGVfdmFyMiwgX3R5cGVfdmFyMywgX3R5cGVfdmFyNCwgX25zLCBfY29uY2VwdCkgXAorICB0eXBlZGVmIHZvaWQgKF9uczo6X2NvbmNlcHQgPF90eXBlX3ZhcjEsX3R5cGVfdmFyMixfdHlwZV92YXIzLF90eXBlX3ZhcjQ+OjoqIF9mdW5jIyNfdHlwZV92YXIxIyNfdHlwZV92YXIyIyNfdHlwZV92YXIzIyNfdHlwZV92YXI0IyNfY29uY2VwdCkoKTsgXAorICB0ZW1wbGF0ZSA8X2Z1bmMjI190eXBlX3ZhcjEjI190eXBlX3ZhcjIjI190eXBlX3ZhcjMjI190eXBlX3ZhcjQjI19jb25jZXB0IF9UcDE+IFwKKyAgc3RydWN0IF9jb25jZXB0X2NoZWNraW5nIyNfdHlwZV92YXIxIyNfdHlwZV92YXIyIyNfdHlwZV92YXIzIyNfdHlwZV92YXI0IyNfY29uY2VwdCB7IH07IFwKKyAgdHlwZWRlZiBfY29uY2VwdF9jaGVja2luZyMjX3R5cGVfdmFyMSMjX3R5cGVfdmFyMiMjX3R5cGVfdmFyMyMjX3R5cGVfdmFyNCMjX2NvbmNlcHQ8IFwKKyAgJl9uczo6X2NvbmNlcHQgPF90eXBlX3ZhcjEsX3R5cGVfdmFyMixfdHlwZV92YXIzLF90eXBlX3ZhcjQ+OjpfX2NvbnN0cmFpbnRzPiBcCisgICAgX2NvbmNlcHRfY2hlY2tpbmdfdHlwZWRlZiMjX3R5cGVfdmFyMSMjX3R5cGVfdmFyMiMjX3R5cGVfdmFyMyMjX3R5cGVfdmFyNCMjX2NvbmNlcHQKKworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KK3N0cnVjdCBfQXV4X3JlcXVpcmVfc2FtZSB7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBfVHA+CitzdHJ1Y3QgX0F1eF9yZXF1aXJlX3NhbWU8X1RwLF9UcD4geyB0eXBlZGVmIF9UcCBfVHlwZTsgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KKyAgc3RydWN0IF9TYW1lVHlwZUNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0F1eF9yZXF1aXJlX3NhbWU8X1RwMSwgX1RwMj46Ol9UeXBlIF9SZXF1aXJlZDsKKyAgICB9CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9JbnRlZ2VyQ29uY2VwdCB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19lcnJvcl90eXBlX211c3RfYmVfYW5faW50ZWdlcl90eXBlKCk7CisgICAgfQorICB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX0ludGVnZXJDb25jZXB0PHNob3J0PiB7IHZvaWQgX19jb25zdHJhaW50cygpIHt9IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBfSW50ZWdlckNvbmNlcHQ8dW5zaWduZWQgc2hvcnQ+IHsgdm9pZCBfX2NvbnN0cmFpbnRzKCl7fSB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX0ludGVnZXJDb25jZXB0PGludD4geyB2b2lkIF9fY29uc3RyYWludHMoKSB7fSB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX0ludGVnZXJDb25jZXB0PHVuc2lnbmVkIGludD4geyB2b2lkIF9fY29uc3RyYWludHMoKSB7fSB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX0ludGVnZXJDb25jZXB0PGxvbmc+IHsgdm9pZCBfX2NvbnN0cmFpbnRzKCkge30gfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IF9JbnRlZ2VyQ29uY2VwdDx1bnNpZ25lZCBsb25nPiB7IHZvaWQgX19jb25zdHJhaW50cygpIHt9IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBfSW50ZWdlckNvbmNlcHQ8bG9uZyBsb25nPiB7IHZvaWQgX19jb25zdHJhaW50cygpIHt9IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBfSW50ZWdlckNvbmNlcHQ8dW5zaWduZWQgbG9uZyBsb25nPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB2b2lkIF9fY29uc3RyYWludHMoKSB7fSB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgIHN0cnVjdCBfU2lnbmVkSW50ZWdlckNvbmNlcHQgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZXJyb3JfdHlwZV9tdXN0X2JlX2Ffc2lnbmVkX2ludGVnZXJfdHlwZSgpOworICAgIH0KKyAgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IF9TaWduZWRJbnRlZ2VyQ29uY2VwdDxzaG9ydD4geyB2b2lkIF9fY29uc3RyYWludHMoKSB7fSB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX1NpZ25lZEludGVnZXJDb25jZXB0PGludD4geyB2b2lkIF9fY29uc3RyYWludHMoKSB7fSB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX1NpZ25lZEludGVnZXJDb25jZXB0PGxvbmc+IHsgdm9pZCBfX2NvbnN0cmFpbnRzKCkge30gfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IF9TaWduZWRJbnRlZ2VyQ29uY2VwdDxsb25nIGxvbmc+IHsgdm9pZCBfX2NvbnN0cmFpbnRzKCl7fX07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9VbnNpZ25lZEludGVnZXJDb25jZXB0IHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Vycm9yX3R5cGVfbXVzdF9iZV9hbl91bnNpZ25lZF9pbnRlZ2VyX3R5cGUoKTsKKyAgICB9CisgIH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBfVW5zaWduZWRJbnRlZ2VyQ29uY2VwdDx1bnNpZ25lZCBzaG9ydD4KKyAgICB7IHZvaWQgX19jb25zdHJhaW50cygpIHt9IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBfVW5zaWduZWRJbnRlZ2VyQ29uY2VwdDx1bnNpZ25lZCBpbnQ+CisgICAgeyB2b2lkIF9fY29uc3RyYWludHMoKSB7fSB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX1Vuc2lnbmVkSW50ZWdlckNvbmNlcHQ8dW5zaWduZWQgbG9uZz4KKyAgICB7IHZvaWQgX19jb25zdHJhaW50cygpIHt9IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBfVW5zaWduZWRJbnRlZ2VyQ29uY2VwdDx1bnNpZ25lZCBsb25nIGxvbmc+CisgICAgeyB2b2lkIF9fY29uc3RyYWludHMoKSB7fSB9OworCisgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIEJhc2ljIENvbmNlcHRzCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9EZWZhdWx0Q29uc3RydWN0aWJsZUNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9UcCBfX2EgX0lzVW51c2VkOyAgICAgICAgICAgICAgICAvLyByZXF1aXJlIGRlZmF1bHQgY29uc3RydWN0b3IKKyAgICB9CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9Bc3NpZ25hYmxlQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19hID0gX19hOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgYXNzaWdubWVudCBvcGVyYXRvcgorICAgICAgX19jb25zdF9jb25zdHJhaW50cyhfX2EpOworICAgIH0KKyAgICB2b2lkIF9fY29uc3RfY29uc3RyYWludHMoY29uc3QgX1RwJiBfX2IpIHsKKyAgICAgIF9fYSA9IF9fYjsgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgcmVxdWlyZWQgZm9yIGFyZ3VtZW50IHRvIGFzc2lnbm1lbnQKKyAgICB9CisgICAgX1RwIF9fYTsKKyAgICAvLyBwb3NzaWJseSBzaG91bGQgYmUgIlRwKiBhOyIgYW5kIHRoZW4gZGVyZWZlcmVuY2UgImEiIGluIGNvbnN0cmFpbnQKKyAgICAvLyBmdW5jdGlvbnM/ICBwcmVzZW50IHdheSB3b3VsZCByZXF1aXJlIGEgZGVmYXVsdCBjdG9yLCBpIHRoaW5rLi4uCisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9Db3B5Q29uc3RydWN0aWJsZUNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9UcCBfX2EoX19iKTsgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIGNvcHkgY29uc3RydWN0b3IKKyAgICAgIF9UcCogX19wdHIgX0lzVW51c2VkID0gJl9fYTsgICAgICAvLyByZXF1aXJlIGFkZHJlc3Mgb2Ygb3BlcmF0b3IKKyAgICAgIF9fY29uc3RfY29uc3RyYWludHMoX19hKTsKKyAgICB9CisgICAgdm9pZCBfX2NvbnN0X2NvbnN0cmFpbnRzKGNvbnN0IF9UcCYgX19hKSB7CisgICAgICBfVHAgX19jIF9Jc1VudXNlZChfX2EpOyAgICAgICAgICAgLy8gcmVxdWlyZSBjb25zdCBjb3B5IGNvbnN0cnVjdG9yCisgICAgICBjb25zdCBfVHAqIF9fcHRyIF9Jc1VudXNlZCA9ICZfX2E7IC8vIHJlcXVpcmUgY29uc3QgYWRkcmVzcyBvZiBvcGVyYXRvcgorICAgIH0KKyAgICBfVHAgX19iOworICB9OworCisgIC8vIFRoZSBTR0kgU1RMIHZlcnNpb24gb2YgQXNzaWduYWJsZSByZXF1aXJlcyBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9TR0lBc3NpZ25hYmxlQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX1RwIF9fYiBfSXNVbnVzZWQoX19hKTsKKyAgICAgIF9fYSA9IF9fYTsgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIGFzc2lnbm1lbnQgb3BlcmF0b3IKKyAgICAgIF9fY29uc3RfY29uc3RyYWludHMoX19hKTsKKyAgICB9CisgICAgdm9pZCBfX2NvbnN0X2NvbnN0cmFpbnRzKGNvbnN0IF9UcCYgX19iKSB7CisgICAgICBfVHAgX19jIF9Jc1VudXNlZChfX2IpOworICAgICAgX19hID0gX19iOyAgICAgICAgICAgICAgLy8gY29uc3QgcmVxdWlyZWQgZm9yIGFyZ3VtZW50IHRvIGFzc2lnbm1lbnQKKyAgICB9CisgICAgX1RwIF9fYTsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0Zyb20sIGNsYXNzIF9Ubz4KKyAgc3RydWN0IF9Db252ZXJ0aWJsZUNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9UbyBfX3kgX0lzVW51c2VkID0gX194OworICAgIH0KKyAgICBfRnJvbSBfX3g7CisgIH07CisKKyAgLy8gVGhlIEMrKyBzdGFuZGFyZCByZXF1aXJlbWVudHMgZm9yIG1hbnkgY29uY2VwdHMgdGFsayBhYm91dCByZXR1cm4KKyAgLy8gdHlwZXMgdGhhdCBtdXN0IGJlICJjb252ZXJ0aWJsZSB0byBib29sIi4gIFRoZSBwcm9ibGVtIHdpdGggdGhpcworICAvLyByZXF1aXJlbWVudCBpcyB0aGF0IGl0IGxlYXZlcyB0aGUgZG9vciBvcGVuIGZvciBldmlsIHByb3hpZXMgdGhhdAorICAvLyBkZWZpbmUgdGhpbmdzIGxpa2Ugb3BlcmF0b3J8fCB3aXRoIHN0cmFuZ2UgcmV0dXJuIHR5cGVzLiAgVHdvCisgIC8vIHBvc3NpYmxlIHNvbHV0aW9ucyBhcmU6CisgIC8vIDEpIHJlcXVpcmUgdGhlIHJldHVybiB0eXBlIHRvIGJlIGV4YWN0bHkgYm9vbAorICAvLyAyKSBzdGF5IHdpdGggY29udmVydGlibGUgdG8gYm9vbCwgYW5kIGFsc28KKyAgLy8gICAgc3BlY2lmeSBzdHVmZiBhYm91dCBhbGwgdGhlIGxvZ2ljYWwgb3BlcmF0b3JzLgorICAvLyBGb3Igbm93IHdlIGp1c3QgdGVzdCBmb3IgY29udmVydGlibGUgdG8gYm9vbC4KKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgdm9pZCBfX2F1eF9yZXF1aXJlX2Jvb2xlYW5fZXhwcihjb25zdCBfVHAmIF9fdCkgeworICAgIGJvb2wgX194IF9Jc1VudXNlZCA9IF9fdDsKKyAgfQorCisvLyBGSVhNRQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX0VxdWFsaXR5Q29tcGFyYWJsZUNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fYXV4X3JlcXVpcmVfYm9vbGVhbl9leHByKF9fYSA9PSBfX2IpOworICAgIH0KKyAgICBfVHAgX19hLCBfX2I7CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2F1eF9yZXF1aXJlX2Jvb2xlYW5fZXhwcihfX2EgPCBfX2IpOworICAgIH0KKyAgICBfVHAgX19hLCBfX2I7CisgIH07CisKKyAgLy8gVGhpcyBpcyBlcXVpdmFsZW50IHRvIFNHSSBTVEwncyBMZXNzVGhhbkNvbXBhcmFibGUuCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgIHN0cnVjdCBfQ29tcGFyYWJsZUNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fYXV4X3JlcXVpcmVfYm9vbGVhbl9leHByKF9fYSA8IF9fYik7CisgICAgICBfX2F1eF9yZXF1aXJlX2Jvb2xlYW5fZXhwcihfX2EgPiBfX2IpOworICAgICAgX19hdXhfcmVxdWlyZV9ib29sZWFuX2V4cHIoX19hIDw9IF9fYik7CisgICAgICBfX2F1eF9yZXF1aXJlX2Jvb2xlYW5fZXhwcihfX2EgPj0gX19iKTsKKyAgICB9CisgICAgX1RwIF9fYSwgX19iOworICB9OworCisjZGVmaW5lIF9HTElCQ1hYX0RFRklORV9CSU5BUllfUFJFRElDQVRFX09QX0NPTlNUUkFJTlQoX09QLF9OQU1FKSBcCisgIHRlbXBsYXRlIDxjbGFzcyBfRmlyc3QsIGNsYXNzIF9TZWNvbmQ+IFwKKyAgc3RydWN0IF9OQU1FIHsgXAorICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsgKHZvaWQpX19jb25zdHJhaW50c18oKTsgfSBcCisgICAgYm9vbCBfX2NvbnN0cmFpbnRzXygpIHsgIFwKKyAgICAgIHJldHVybiAgX19hIF9PUCBfX2I7IFwKKyAgICB9IFwKKyAgICBfRmlyc3QgX19hOyBcCisgICAgX1NlY29uZCBfX2I7IFwKKyAgfQorCisjZGVmaW5lIF9HTElCQ1hYX0RFRklORV9CSU5BUllfT1BFUkFUT1JfQ09OU1RSQUlOVChfT1AsX05BTUUpIFwKKyAgdGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9GaXJzdCwgY2xhc3MgX1NlY29uZD4gXAorICBzdHJ1Y3QgX05BTUUgeyBcCisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeyAodm9pZClfX2NvbnN0cmFpbnRzXygpOyB9IFwKKyAgICBfUmV0IF9fY29uc3RyYWludHNfKCkgeyAgXAorICAgICAgcmV0dXJuIF9fYSBfT1AgX19iOyBcCisgICAgfSBcCisgICAgX0ZpcnN0IF9fYTsgXAorICAgIF9TZWNvbmQgX19iOyBcCisgIH0KKworICBfR0xJQkNYWF9ERUZJTkVfQklOQVJZX1BSRURJQ0FURV9PUF9DT05TVFJBSU5UKD09LCBfRXF1YWxPcENvbmNlcHQpOworICBfR0xJQkNYWF9ERUZJTkVfQklOQVJZX1BSRURJQ0FURV9PUF9DT05TVFJBSU5UKCE9LCBfTm90RXF1YWxPcENvbmNlcHQpOworICBfR0xJQkNYWF9ERUZJTkVfQklOQVJZX1BSRURJQ0FURV9PUF9DT05TVFJBSU5UKDwsIF9MZXNzVGhhbk9wQ29uY2VwdCk7CisgIF9HTElCQ1hYX0RFRklORV9CSU5BUllfUFJFRElDQVRFX09QX0NPTlNUUkFJTlQoPD0sIF9MZXNzRXF1YWxPcENvbmNlcHQpOworICBfR0xJQkNYWF9ERUZJTkVfQklOQVJZX1BSRURJQ0FURV9PUF9DT05TVFJBSU5UKD4sIF9HcmVhdGVyVGhhbk9wQ29uY2VwdCk7CisgIF9HTElCQ1hYX0RFRklORV9CSU5BUllfUFJFRElDQVRFX09QX0NPTlNUUkFJTlQoPj0sIF9HcmVhdGVyRXF1YWxPcENvbmNlcHQpOworCisgIF9HTElCQ1hYX0RFRklORV9CSU5BUllfT1BFUkFUT1JfQ09OU1RSQUlOVCgrLCBfUGx1c09wQ29uY2VwdCk7CisgIF9HTElCQ1hYX0RFRklORV9CSU5BUllfT1BFUkFUT1JfQ09OU1RSQUlOVCgqLCBfVGltZXNPcENvbmNlcHQpOworICBfR0xJQkNYWF9ERUZJTkVfQklOQVJZX09QRVJBVE9SX0NPTlNUUkFJTlQoLywgX0RpdmlkZU9wQ29uY2VwdCk7CisgIF9HTElCQ1hYX0RFRklORV9CSU5BUllfT1BFUkFUT1JfQ09OU1RSQUlOVCgtLCBfU3VidHJhY3RPcENvbmNlcHQpOworICBfR0xJQkNYWF9ERUZJTkVfQklOQVJZX09QRVJBVE9SX0NPTlNUUkFJTlQoJSwgX01vZE9wQ29uY2VwdCk7CisKKyN1bmRlZiBfR0xJQkNYWF9ERUZJTkVfQklOQVJZX1BSRURJQ0FURV9PUF9DT05TVFJBSU5UCisjdW5kZWYgX0dMSUJDWFhfREVGSU5FX0JJTkFSWV9PUEVSQVRPUl9DT05TVFJBSU5UCisKKyAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gRnVuY3Rpb24gT2JqZWN0IENvbmNlcHRzCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9GdW5jLCBjbGFzcyBfUmV0dXJuPgorICBzdHJ1Y3QgX0dlbmVyYXRvckNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIGNvbnN0IF9SZXR1cm4mIF9fciBfSXNVbnVzZWQgPSBfX2YoKTsvLyByZXF1aXJlIG9wZXJhdG9yKCkgbWVtYmVyIGZ1bmN0aW9uCisgICAgfQorICAgIF9GdW5jIF9fZjsKKyAgfTsKKworCisgIHRlbXBsYXRlIDxjbGFzcyBfRnVuYz4KKyAgc3RydWN0IF9HZW5lcmF0b3JDb25jZXB0PF9GdW5jLHZvaWQ+CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2YoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBvcGVyYXRvcigpIG1lbWJlciBmdW5jdGlvbgorICAgIH0KKyAgICBfRnVuYyBfX2Y7CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9GdW5jLCBjbGFzcyBfUmV0dXJuLCBjbGFzcyBfQXJnPgorICBzdHJ1Y3QgX1VuYXJ5RnVuY3Rpb25Db25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX3IgPSBfX2YoX19hcmcpOyAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgb3BlcmF0b3IoKQorICAgIH0KKyAgICBfRnVuYyBfX2Y7CisgICAgX0FyZyBfX2FyZzsKKyAgICBfUmV0dXJuIF9fcjsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0Z1bmMsIGNsYXNzIF9Bcmc+CisgIHN0cnVjdCBfVW5hcnlGdW5jdGlvbkNvbmNlcHQ8X0Z1bmMsIHZvaWQsIF9Bcmc+IHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2YoX19hcmcpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBvcGVyYXRvcigpCisgICAgfQorICAgIF9GdW5jIF9fZjsKKyAgICBfQXJnIF9fYXJnOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfRnVuYywgY2xhc3MgX1JldHVybiwgY2xhc3MgX0ZpcnN0LCBjbGFzcyBfU2Vjb25kPgorICBzdHJ1Y3QgX0JpbmFyeUZ1bmN0aW9uQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19yID0gX19mKF9fZmlyc3QsIF9fc2Vjb25kKTsgICAgIC8vIHJlcXVpcmUgb3BlcmF0b3IoKQorICAgIH0KKyAgICBfRnVuYyBfX2Y7CisgICAgX0ZpcnN0IF9fZmlyc3Q7CisgICAgX1NlY29uZCBfX3NlY29uZDsKKyAgICBfUmV0dXJuIF9fcjsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0Z1bmMsIGNsYXNzIF9GaXJzdCwgY2xhc3MgX1NlY29uZD4KKyAgc3RydWN0IF9CaW5hcnlGdW5jdGlvbkNvbmNlcHQ8X0Z1bmMsIHZvaWQsIF9GaXJzdCwgX1NlY29uZD4KKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZihfX2ZpcnN0LCBfX3NlY29uZCk7ICAgICAgICAgICAvLyByZXF1aXJlIG9wZXJhdG9yKCkKKyAgICB9CisgICAgX0Z1bmMgX19mOworICAgIF9GaXJzdCBfX2ZpcnN0OworICAgIF9TZWNvbmQgX19zZWNvbmQ7CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9GdW5jLCBjbGFzcyBfQXJnPgorICBzdHJ1Y3QgX1VuYXJ5UHJlZGljYXRlQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19hdXhfcmVxdWlyZV9ib29sZWFuX2V4cHIoX19mKF9fYXJnKSk7IC8vIHJlcXVpcmUgb3AoKSByZXR1cm5pbmcgYm9vbAorICAgIH0KKyAgICBfRnVuYyBfX2Y7CisgICAgX0FyZyBfX2FyZzsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0Z1bmMsIGNsYXNzIF9GaXJzdCwgY2xhc3MgX1NlY29uZD4KKyAgc3RydWN0IF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2F1eF9yZXF1aXJlX2Jvb2xlYW5fZXhwcihfX2YoX19hLCBfX2IpKTsgLy8gcmVxdWlyZSBvcCgpIHJldHVybmluZyBib29sCisgICAgfQorICAgIF9GdW5jIF9fZjsKKyAgICBfRmlyc3QgX19hOworICAgIF9TZWNvbmQgX19iOworICB9OworCisgIC8vIHVzZSB0aGlzIHdoZW4gZnVuY3RvciBpcyB1c2VkIGluc2lkZSBhIGNvbnRhaW5lciBjbGFzcyBsaWtlIHN0ZDo6c2V0CisgIHRlbXBsYXRlIDxjbGFzcyBfRnVuYywgY2xhc3MgX0ZpcnN0LCBjbGFzcyBfU2Vjb25kPgorICBzdHJ1Y3QgX0NvbnN0X0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fY29uc3RfY29uc3RyYWludHMoX19mKTsKKyAgICB9CisgICAgdm9pZCBfX2NvbnN0X2NvbnN0cmFpbnRzKGNvbnN0IF9GdW5jJiBfX2Z1bikgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczxfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfRnVuYywgX0ZpcnN0LCBfU2Vjb25kPiA+KCk7CisgICAgICAvLyBvcGVyYXRvcigpIG11c3QgYmUgYSBjb25zdCBtZW1iZXIgZnVuY3Rpb24KKyAgICAgIF9fYXV4X3JlcXVpcmVfYm9vbGVhbl9leHByKF9fZnVuKF9fYSwgX19iKSk7CisgICAgfQorICAgIF9GdW5jIF9fZjsKKyAgICBfRmlyc3QgX19hOworICAgIF9TZWNvbmQgX19iOworICB9OworCisgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIEl0ZXJhdG9yIENvbmNlcHRzCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9Ucml2aWFsSXRlcmF0b3JDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisvLyAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfRGVmYXVsdENvbnN0cnVjdGlibGVDb25jZXB0PF9UcD4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0Fzc2lnbmFibGVDb25jZXB0PF9UcD4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0VxdWFsaXR5Q29tcGFyYWJsZUNvbmNlcHQ8X1RwPiA+KCk7CisvLyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1RwPjo6dmFsdWVfdHlwZSBfVjsKKyAgICAgICh2b2lkKSpfX2k7ICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIGRlcmVmZXJlbmNlIG9wZXJhdG9yCisgICAgfQorICAgIF9UcCBfX2k7CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9NdXRhYmxlX1RyaXZpYWxJdGVyYXRvckNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9Ucml2aWFsSXRlcmF0b3JDb25jZXB0PF9UcD4gPigpOworICAgICAgKl9faSA9ICpfX2o7ICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgZGVyZWZlcmVuY2UgYW5kIGFzc2lnbm1lbnQKKyAgICB9CisgICAgX1RwIF9faSwgX19qOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgIHN0cnVjdCBfSW5wdXRJdGVyYXRvckNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9Ucml2aWFsSXRlcmF0b3JDb25jZXB0PF9UcD4gPigpOworICAgICAgLy8gcmVxdWlyZSBpdGVyYXRvcl90cmFpdHMgdHlwZWRlZidzCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9UcD46OmRpZmZlcmVuY2VfdHlwZSBfRGlmZjsKKy8vICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX1NpZ25lZEludGVnZXJDb25jZXB0PF9EaWZmPiA+KCk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9UcD46OnJlZmVyZW5jZSBfUmVmOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfVHA+Ojpwb2ludGVyIF9QdDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1RwPjo6aXRlcmF0b3JfY2F0ZWdvcnkgX0NhdDsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9Db252ZXJ0aWJsZUNvbmNlcHQ8CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9UcD46Oml0ZXJhdG9yX2NhdGVnb3J5LAorICAgICAgICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZz4gPigpOworICAgICAgKytfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgcHJlaW5jcmVtZW50IG9wZXJhdG9yCisgICAgICBfX2krKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBwb3N0aW5jcmVtZW50IG9wZXJhdG9yCisgICAgfQorICAgIF9UcCBfX2k7CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1ZhbHVlVD4KKyAgc3RydWN0IF9PdXRwdXRJdGVyYXRvckNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9Bc3NpZ25hYmxlQ29uY2VwdDxfVHA+ID4oKTsKKyAgICAgICsrX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIHByZWluY3JlbWVudCBvcGVyYXRvcgorICAgICAgX19pKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgcG9zdGluY3JlbWVudCBvcGVyYXRvcgorICAgICAgKl9faSsrID0gX190OyAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgcG9zdGluY3JlbWVudCBhbmQgYXNzaWdubWVudAorICAgIH0KKyAgICBfVHAgX19pOworICAgIF9WYWx1ZVQgX190OworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgIHN0cnVjdCBfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0lucHV0SXRlcmF0b3JDb25jZXB0PF9UcD4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0RlZmF1bHRDb25zdHJ1Y3RpYmxlQ29uY2VwdDxfVHA+ID4oKTsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9Db252ZXJ0aWJsZUNvbmNlcHQ8CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9UcD46Oml0ZXJhdG9yX2NhdGVnb3J5LAorICAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnPiA+KCk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9UcD46OnJlZmVyZW5jZSBfUmVmOworICAgICAgX1JlZiBfX3IgX0lzVW51c2VkID0gKl9faTsKKyAgICB9CisgICAgX1RwIF9faTsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X1RwPiA+KCk7CisgICAgICAqX19pKysgPSAqX19pOyAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBwb3N0aW5jcmVtZW50IGFuZCBhc3NpZ25tZW50CisgICAgfQorICAgIF9UcCBfX2k7CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfVHA+ID4oKTsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9Db252ZXJ0aWJsZUNvbmNlcHQ8CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9UcD46Oml0ZXJhdG9yX2NhdGVnb3J5LAorICAgICAgICBzdGQ6OmJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnPiA+KCk7CisgICAgICAtLV9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBwcmVkZWNyZW1lbnQgb3BlcmF0b3IKKyAgICAgIF9faS0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIHBvc3RkZWNyZW1lbnQgb3BlcmF0b3IKKyAgICB9CisgICAgX1RwIF9faTsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX011dGFibGVfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8X1RwPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfTXV0YWJsZV9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9UcD4gPigpOworICAgICAgKl9faS0tID0gKl9faTsgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgcG9zdGRlY3JlbWVudCBhbmQgYXNzaWdubWVudAorICAgIH0KKyAgICBfVHAgX19pOworICB9OworCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PF9UcD4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0NvbXBhcmFibGVDb25jZXB0PF9UcD4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0NvbnZlcnRpYmxlQ29uY2VwdDwKKyAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1RwPjo6aXRlcmF0b3JfY2F0ZWdvcnksCisgICAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWc+ID4oKTsKKyAgICAgIC8vID8/PyBXZSBkb24ndCB1c2UgX1JlZiwgYXJlIHdlIGp1c3QgY2hlY2tpbmcgZm9yICJyZWZlcmVuY2VhYmlsaXR5Ij8KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1RwPjo6cmVmZXJlbmNlIF9SZWY7CisKKyAgICAgIF9faSArPSBfX247ICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIGFzc2lnbm1lbnQgYWRkaXRpb24gb3BlcmF0b3IKKyAgICAgIF9faSA9IF9faSArIF9fbjsgX19pID0gX19uICsgX19pOyAvLyByZXF1aXJlIGFkZGl0aW9uIHdpdGggZGlmZmVyZW5jZSB0eXBlCisgICAgICBfX2kgLT0gX19uOyAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBhc3NpZ25tZW50IHN1YnRyYWN0aW9uIG9wCisgICAgICBfX2kgPSBfX2kgLSBfX247ICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBzdWJ0cmFjdGlvbiB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICBkaWZmZXJlbmNlIHR5cGUKKyAgICAgIF9fbiA9IF9faSAtIF9fajsgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIGRpZmZlcmVuY2Ugb3BlcmF0b3IKKyAgICAgICh2b2lkKV9faVtfX25dOyAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIGVsZW1lbnQgYWNjZXNzIG9wZXJhdG9yCisgICAgfQorICAgIF9UcCBfX2EsIF9fYjsKKyAgICBfVHAgX19pLCBfX2o7CisgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1RwPjo6ZGlmZmVyZW5jZV90eXBlIF9fbjsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PF9UcD4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX011dGFibGVfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDxfVHA+ID4oKTsKKyAgICAgIF9faVtfX25dID0gKl9faTsgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIGVsZW1lbnQgYWNjZXNzIGFuZCBhc3NpZ25tZW50CisgICAgfQorICAgIF9UcCBfX2k7CisgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1RwPjo6ZGlmZmVyZW5jZV90eXBlIF9fbjsKKyAgfTsKKworICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBDb250YWluZXIgQ29uY2VwdHMKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KKyAgc3RydWN0IF9Db250YWluZXJDb25jZXB0CisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUgX1ZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6OnNpemVfdHlwZSBfU2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6Y29uc3RfcmVmZXJlbmNlIF9Db25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjpjb25zdF9wb2ludGVyIF9Db25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgX0NvbnN0X2l0ZXJhdG9yOworCisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0lucHV0SXRlcmF0b3JDb25jZXB0PF9Db25zdF9pdGVyYXRvcj4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0Fzc2lnbmFibGVDb25jZXB0PF9Db250YWluZXI+ID4oKTsKKyAgICAgIGNvbnN0IF9Db250YWluZXIgX19jOworICAgICAgX19pID0gX19jLmJlZ2luKCk7CisgICAgICBfX2kgPSBfX2MuZW5kKCk7CisgICAgICBfX24gPSBfX2Muc2l6ZSgpOworICAgICAgX19uID0gX19jLm1heF9zaXplKCk7CisgICAgICBfX2IgPSBfX2MuZW1wdHkoKTsKKyAgICB9CisgICAgYm9vbCBfX2I7CisgICAgX0NvbnN0X2l0ZXJhdG9yIF9faTsKKyAgICBfU2l6ZV90eXBlIF9fbjsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KKyAgc3RydWN0IF9NdXRhYmxlX0NvbnRhaW5lckNvbmNlcHQKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSBfVmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6OnJlZmVyZW5jZSBfUmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgX0l0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6cG9pbnRlciBfUG9pbnRlcjsKKworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9Db250YWluZXJDb25jZXB0PF9Db250YWluZXI+ID4oKTsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9Bc3NpZ25hYmxlQ29uY2VwdDxfVmFsdWVfdHlwZT4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JdGVyYXRvcj4gPigpOworCisgICAgICBfX2kgPSBfX2MuYmVnaW4oKTsKKyAgICAgIF9faSA9IF9fYy5lbmQoKTsKKyAgICAgIF9fYy5zd2FwKF9fYzIpOworICAgIH0KKyAgICBfSXRlcmF0b3IgX19pOworICAgIF9Db250YWluZXIgX19jLCBfX2MyOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZENvbnRhaW5lcj4KKyAgc3RydWN0IF9Gb3J3YXJkQ29udGFpbmVyQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0NvbnRhaW5lckNvbmNlcHQ8X0ZvcndhcmRDb250YWluZXI+ID4oKTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0ZvcndhcmRDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIF9Db25zdF9pdGVyYXRvcjsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Db25zdF9pdGVyYXRvcj4gPigpOworICAgIH0KKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRDb250YWluZXI+CisgIHN0cnVjdCBfTXV0YWJsZV9Gb3J3YXJkQ29udGFpbmVyQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0ZvcndhcmRDb250YWluZXJDb25jZXB0PF9Gb3J3YXJkQ29udGFpbmVyPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfTXV0YWJsZV9Db250YWluZXJDb25jZXB0PF9Gb3J3YXJkQ29udGFpbmVyPiA+KCk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Gb3J3YXJkQ29udGFpbmVyOjppdGVyYXRvciBfSXRlcmF0b3I7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfTXV0YWJsZV9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9JdGVyYXRvcj4gPigpOworICAgIH0KKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1JldmVyc2libGVDb250YWluZXI+CisgIHN0cnVjdCBfUmV2ZXJzaWJsZUNvbnRhaW5lckNvbmNlcHQKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JldmVyc2libGVDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIF9Db25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXZlcnNpYmxlQ29udGFpbmVyOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBfQ29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9Gb3J3YXJkQ29udGFpbmVyQ29uY2VwdDxfUmV2ZXJzaWJsZUNvbnRhaW5lcj4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8X0NvbnN0X2l0ZXJhdG9yPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPAorICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDxfQ29uc3RfcmV2ZXJzZV9pdGVyYXRvcj4gPigpOworCisgICAgICBjb25zdCBfUmV2ZXJzaWJsZUNvbnRhaW5lciBfX2M7CisgICAgICBfQ29uc3RfcmV2ZXJzZV9pdGVyYXRvciBfX2kgPSBfX2MucmJlZ2luKCk7CisgICAgICBfX2kgPSBfX2MucmVuZCgpOworICAgIH0KKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1JldmVyc2libGVDb250YWluZXI+CisgIHN0cnVjdCBfTXV0YWJsZV9SZXZlcnNpYmxlQ29udGFpbmVyQ29uY2VwdAorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmV2ZXJzaWJsZUNvbnRhaW5lcjo6aXRlcmF0b3IgX0l0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JldmVyc2libGVDb250YWluZXI6OnJldmVyc2VfaXRlcmF0b3IgX1JldmVyc2VfaXRlcmF0b3I7CisKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPF9SZXZlcnNpYmxlQ29udGFpbmVyQ29uY2VwdDxfUmV2ZXJzaWJsZUNvbnRhaW5lcj4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwKKyAgICAgICAgX011dGFibGVfRm9yd2FyZENvbnRhaW5lckNvbmNlcHQ8X1JldmVyc2libGVDb250YWluZXI+ID4oKTsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8X011dGFibGVfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDxfSXRlcmF0b3I+ID4oKTsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8CisgICAgICAgIF9NdXRhYmxlX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8X1JldmVyc2VfaXRlcmF0b3I+ID4oKTsKKworICAgICAgX1JldmVyc2VfaXRlcmF0b3IgX19pID0gX19jLnJiZWdpbigpOworICAgICAgX19pID0gX19jLnJlbmQoKTsKKyAgICB9CisgICAgX1JldmVyc2libGVDb250YWluZXIgX19jOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzQ29udGFpbmVyPgorICBzdHJ1Y3QgX1JhbmRvbUFjY2Vzc0NvbnRhaW5lckNvbmNlcHQKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0NvbnRhaW5lcjo6c2l6ZV90eXBlIF9TaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmFuZG9tQWNjZXNzQ29udGFpbmVyOjpjb25zdF9yZWZlcmVuY2UgX0NvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIF9Db25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NDb250YWluZXI6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIF9Db25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwKKyAgICAgICAgX1JldmVyc2libGVDb250YWluZXJDb25jZXB0PF9SYW5kb21BY2Nlc3NDb250YWluZXI+ID4oKTsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8X0NvbnN0X2l0ZXJhdG9yPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPAorICAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PF9Db25zdF9yZXZlcnNlX2l0ZXJhdG9yPiA+KCk7CisKKyAgICAgIGNvbnN0IF9SYW5kb21BY2Nlc3NDb250YWluZXIgX19jOworICAgICAgX0NvbnN0X3JlZmVyZW5jZSBfX3IgX0lzVW51c2VkID0gX19jW19fbl07CisgICAgfQorICAgIF9TaXplX3R5cGUgX19uOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzQ29udGFpbmVyPgorICBzdHJ1Y3QgX011dGFibGVfUmFuZG9tQWNjZXNzQ29udGFpbmVyQ29uY2VwdAorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmFuZG9tQWNjZXNzQ29udGFpbmVyOjpzaXplX3R5cGUgX1NpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NDb250YWluZXI6OnJlZmVyZW5jZSBfUmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0NvbnRhaW5lcjo6aXRlcmF0b3IgX0l0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0NvbnRhaW5lcjo6cmV2ZXJzZV9pdGVyYXRvciBfUmV2ZXJzZV9pdGVyYXRvcjsKKworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8CisgICAgICAgIF9SYW5kb21BY2Nlc3NDb250YWluZXJDb25jZXB0PF9SYW5kb21BY2Nlc3NDb250YWluZXI+ID4oKTsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8CisgICAgICAgIF9NdXRhYmxlX1JldmVyc2libGVDb250YWluZXJDb25jZXB0PF9SYW5kb21BY2Nlc3NDb250YWluZXI+ID4oKTsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDxfSXRlcmF0b3I+ID4oKTsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8CisgICAgICAgIF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDxfUmV2ZXJzZV9pdGVyYXRvcj4gPigpOworCisgICAgICBfUmVmZXJlbmNlIF9fciBfSXNVbnVzZWQgPSBfX2NbX19pXTsKKyAgICB9CisgICAgX1NpemVfdHlwZSBfX2k7CisgICAgX1JhbmRvbUFjY2Vzc0NvbnRhaW5lciBfX2M7CisgIH07CisKKyAgLy8gQSBTZXF1ZW5jZSBpcyBpbmhlcmVudGx5IG11dGFibGUKKyAgdGVtcGxhdGUgPGNsYXNzIF9TZXF1ZW5jZT4KKyAgc3RydWN0IF9TZXF1ZW5jZUNvbmNlcHQKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpyZWZlcmVuY2UgX1JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6Y29uc3RfcmVmZXJlbmNlIF9Db25zdF9yZWZlcmVuY2U7CisKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICAvLyBNYXR0IEF1c3Rlcm4ncyBib29rIHB1dHMgRGVmYXVsdENvbnN0cnVjdGlibGUgaGVyZSwgdGhlIEMrKworICAgICAgLy8gc3RhbmRhcmQgcGxhY2VzIGl0IGluIENvbnRhaW5lcgorICAgICAgLy8gICAgZnVuY3Rpb25fcmVxdWlyZXM8IERlZmF1bHRDb25zdHJ1Y3RpYmxlPFNlcXVlbmNlPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfTXV0YWJsZV9Gb3J3YXJkQ29udGFpbmVyQ29uY2VwdDxfU2VxdWVuY2U+ID4oKTsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9EZWZhdWx0Q29uc3RydWN0aWJsZUNvbmNlcHQ8X1NlcXVlbmNlPiA+KCk7CisKKyAgICAgIF9TZXF1ZW5jZQorCV9fYyBfSXNVbnVzZWQoX19uLCBfX3QpLAorICAgICAgICBfX2MyIF9Jc1VudXNlZChfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBfX2MuaW5zZXJ0KF9fcCwgX190KTsKKyAgICAgIF9fYy5pbnNlcnQoX19wLCBfX24sIF9fdCk7CisgICAgICBfX2MuaW5zZXJ0KF9fcCwgX19maXJzdCwgX19sYXN0KTsKKworICAgICAgX19jLmVyYXNlKF9fcCk7CisgICAgICBfX2MuZXJhc2UoX19wLCBfX3EpOworCisgICAgICBfUmVmZXJlbmNlIF9fciBfSXNVbnVzZWQgPSBfX2MuZnJvbnQoKTsKKworICAgICAgX19jb25zdF9jb25zdHJhaW50cyhfX2MpOworICAgIH0KKyAgICB2b2lkIF9fY29uc3RfY29uc3RyYWludHMoY29uc3QgX1NlcXVlbmNlJiBfX2MpIHsKKyAgICAgIF9Db25zdF9yZWZlcmVuY2UgX19yIF9Jc1VudXNlZCA9IF9fYy5mcm9udCgpOworICAgIH0KKyAgICB0eXBlbmFtZSBfU2VxdWVuY2U6OnZhbHVlX3R5cGUgX190OworICAgIHR5cGVuYW1lIF9TZXF1ZW5jZTo6c2l6ZV90eXBlIF9fbjsKKyAgICB0eXBlbmFtZSBfU2VxdWVuY2U6OnZhbHVlX3R5cGUgKl9fZmlyc3QsICpfX2xhc3Q7CisgICAgdHlwZW5hbWUgX1NlcXVlbmNlOjppdGVyYXRvciBfX3AsIF9fcTsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0Zyb250SW5zZXJ0aW9uU2VxdWVuY2U+CisgIHN0cnVjdCBfRnJvbnRJbnNlcnRpb25TZXF1ZW5jZUNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9TZXF1ZW5jZUNvbmNlcHQ8X0Zyb250SW5zZXJ0aW9uU2VxdWVuY2U+ID4oKTsKKworICAgICAgX19jLnB1c2hfZnJvbnQoX190KTsKKyAgICAgIF9fYy5wb3BfZnJvbnQoKTsKKyAgICB9CisgICAgX0Zyb250SW5zZXJ0aW9uU2VxdWVuY2UgX19jOworICAgIHR5cGVuYW1lIF9Gcm9udEluc2VydGlvblNlcXVlbmNlOjp2YWx1ZV90eXBlIF9fdDsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0JhY2tJbnNlcnRpb25TZXF1ZW5jZT4KKyAgc3RydWN0IF9CYWNrSW5zZXJ0aW9uU2VxdWVuY2VDb25jZXB0CisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYWNrSW5zZXJ0aW9uU2VxdWVuY2U6OnJlZmVyZW5jZSBfUmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0JhY2tJbnNlcnRpb25TZXF1ZW5jZTo6Y29uc3RfcmVmZXJlbmNlIF9Db25zdF9yZWZlcmVuY2U7CisKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfU2VxdWVuY2VDb25jZXB0PF9CYWNrSW5zZXJ0aW9uU2VxdWVuY2U+ID4oKTsKKworICAgICAgX19jLnB1c2hfYmFjayhfX3QpOworICAgICAgX19jLnBvcF9iYWNrKCk7CisgICAgICBfUmVmZXJlbmNlIF9fciBfSXNVbnVzZWQgPSBfX2MuYmFjaygpOworICAgIH0KKyAgICB2b2lkIF9fY29uc3RfY29uc3RyYWludHMoY29uc3QgX0JhY2tJbnNlcnRpb25TZXF1ZW5jZSYgX19jKSB7CisgICAgICBfQ29uc3RfcmVmZXJlbmNlIF9fciBfSXNVbnVzZWQgPSBfX2MuYmFjaygpOworICAgIH07CisgICAgX0JhY2tJbnNlcnRpb25TZXF1ZW5jZSBfX2M7CisgICAgdHlwZW5hbWUgX0JhY2tJbnNlcnRpb25TZXF1ZW5jZTo6dmFsdWVfdHlwZSBfX3Q7CisgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI3VuZGVmIF9Jc1VudXNlZAorCisjZW5kaWYgLy8gX0dMSUJDWFhfQk9PU1RfQ09OQ0VQVF9DSEVDSworCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9jKysweF93YXJuaW5nLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYysrMHhfd2FybmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0N2IzNzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvYysrMHhfd2FybmluZy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2MrKzB4X3dhcm5pbmcuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2lvc2Z3ZH0KKyAqLworCisjaWZuZGVmIF9DWFgwWF9XQVJOSU5HX0gKKyNkZWZpbmUgX0NYWDBYX1dBUk5JTkdfSCAxCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyNlcnJvciBUaGlzIGZpbGUgcmVxdWlyZXMgY29tcGlsZXIgYW5kIGxpYnJhcnkgc3VwcG9ydCBmb3IgdGhlIFwKK0lTTyBDKysgMjAxMSBzdGFuZGFyZC4gVGhpcyBzdXBwb3J0IGlzIGN1cnJlbnRseSBleHBlcmltZW50YWwsIGFuZCBtdXN0IGJlIFwKK2VuYWJsZWQgd2l0aCB0aGUgLXN0ZD1jKysxMSBvciAtc3RkPWdudSsrMTEgY29tcGlsZXIgb3B0aW9ucy4KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9jaGFyX3RyYWl0cy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2NoYXJfdHJhaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI5MzQ5NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9jaGFyX3RyYWl0cy5oCkBAIC0wLDAgKzEsNTczIEBACisvLyBDaGFyYWN0ZXIgVHJhaXRzIGZvciB1c2UgYnkgc3RhbmRhcmQgc3RyaW5nIGFuZCBpb3N0cmVhbSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9jaGFyX3RyYWl0cy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7c3RyaW5nfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMSAgU3RyaW5ncyBsaWJyYXJ5CisvLworCisjaWZuZGVmIF9DSEFSX1RSQUlUU19ICisjZGVmaW5lIF9DSEFSX1RSQUlUU19IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4gIC8vIHN0ZDo6Y29weSwgc3RkOjpmaWxsX24KKyNpbmNsdWRlIDxiaXRzL3Bvc3R5cGVzLmg+ICAgICAgLy8gRm9yIHN0cmVhbXBvcworI2luY2x1ZGUgPGN3Y2hhcj4gICAgICAgICAgICAgICAvLyBGb3IgV0VPRiwgd21lbW1vdmUsIHdtZW1zZXQsIGV0Yy4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmICBNYXBwaW5nIGZyb20gY2hhcmFjdGVyIHR5cGUgdG8gYXNzb2NpYXRlZCB0eXBlcy4KKyAgICoKKyAgICogIEBub3RlIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRoZSBnZW5lcmljIHZlcnNpb24KKyAgICogIG9mIGNoYXJfdHJhaXRzLiAgSXQgZGVmaW5lcyBpbnRfdHlwZSwgb2ZmX3R5cGUsIHBvc190eXBlLCBhbmQKKyAgICogIHN0YXRlX3R5cGUuICBCeSBkZWZhdWx0IHRoZXNlIGFyZSB1bnNpZ25lZCBsb25nLCBzdHJlYW1vZmYsCisgICAqICBzdHJlYW1wb3MsIGFuZCBtYnN0YXRlX3QuICBVc2VycyB3aG8gbmVlZCBhIGRpZmZlcmVudCBzZXQgb2YKKyAgICogIHR5cGVzLCBidXQgd2hvIGRvbid0IG5lZWQgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9ucyBvZiBhbnkgZnVuY3Rpb24KKyAgICogIGRlZmluZWQgaW4gY2hhcl90cmFpdHMsIGNhbiBzcGVjaWFsaXplIF9fZ251X2N4eDo6X0NoYXJfdHlwZXMKKyAgICogIHdoaWxlIGxlYXZpbmcgX19nbnVfY3h4OjpjaGFyX3RyYWl0cyBhbG9uZS4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIHN0cnVjdCBfQ2hhcl90eXBlcworICAgIHsKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIGludF90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnN0cmVhbXBvcyAgcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6c3RyZWFtb2ZmICBvZmZfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjptYnN0YXRlX3QgIHN0YXRlX3R5cGU7CisgICAgfTsKKworCisgIC8qKgorICAgKiAgQGJyaWVmICBCYXNlIGNsYXNzIHVzZWQgdG8gaW1wbGVtZW50IHN0ZDo6Y2hhcl90cmFpdHMuCisgICAqCisgICAqICBAbm90ZSBGb3IgYW55IGdpdmVuIGFjdHVhbCBjaGFyYWN0ZXIgdHlwZSwgdGhpcyBkZWZpbml0aW9uIGlzCisgICAqICBwcm9iYWJseSB3cm9uZy4gIChNb3N0IG9mIHRoZSBtZW1iZXIgZnVuY3Rpb25zIGFyZSBsaWtlbHkgdG8gYmUKKyAgICogIHJpZ2h0LCBidXQgdGhlIGludF90eXBlIGFuZCBzdGF0ZV90eXBlIHR5cGVkZWZzLCBhbmQgdGhlIGVvZigpCisgICAqICBtZW1iZXIgZnVuY3Rpb24sIGFyZSBsaWtlbHkgdG8gYmUgd3JvbmcuKSAgVGhlIHJlYXNvbiB0aGlzIGNsYXNzCisgICAqICBleGlzdHMgaXMgc28gdXNlcnMgY2FuIHNwZWNpYWxpemUgaXQuICBDbGFzc2VzIGluIG5hbWVzcGFjZSBzdGQKKyAgICogIG1heSBub3QgYmUgc3BlY2lhbGl6ZWQgZm9yIGZ1bmRhbWVudGFsIHR5cGVzLCBidXQgY2xhc3NlcyBpbgorICAgKiAgbmFtZXNwYWNlIF9fZ251X2N4eCBtYXkgYmUuCisgICAqCisgICAqICBTZWUgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQwNWNoMTNzMDMuaHRtbAorICAgKiAgZm9yIGFkdmljZSBvbiBob3cgdG8gbWFrZSB1c2Ugb2YgdGhpcyBjbGFzcyBmb3IgQGEgdW51c3VhbCBjaGFyYWN0ZXIKKyAgICogIHR5cGVzLiBBbHNvLCBjaGVjayBvdXQgaW5jbHVkZS9leHQvcG9kX2NoYXJfdHJhaXRzLmguICAKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBzdHJ1Y3QgY2hhcl90cmFpdHMKKyAgICB7CisgICAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NoYXJfdHlwZXM8X0NoYXJUPjo6aW50X3R5cGUgICAgaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyX3R5cGVzPF9DaGFyVD46OnBvc190eXBlICAgIHBvc190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ2hhcl90eXBlczxfQ2hhclQ+OjpvZmZfdHlwZSAgICBvZmZfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NoYXJfdHlwZXM8X0NoYXJUPjo6c3RhdGVfdHlwZSAgc3RhdGVfdHlwZTsKKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIGFzc2lnbihjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikKKyAgICAgIHsgX19jMSA9IF9fYzI7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgICBlcShjb25zdCBjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikKKyAgICAgIHsgcmV0dXJuIF9fYzEgPT0gX19jMjsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICAgIGx0KGNvbnN0IGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKQorICAgICAgeyByZXR1cm4gX19jMSA8IF9fYzI7IH0KKworICAgICAgc3RhdGljIGludAorICAgICAgY29tcGFyZShjb25zdCBjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc3RkOjpzaXplX3QgX19uKTsKKworICAgICAgc3RhdGljIHN0ZDo6c2l6ZV90CisgICAgICBsZW5ndGgoY29uc3QgY2hhcl90eXBlKiBfX3MpOworCisgICAgICBzdGF0aWMgY29uc3QgY2hhcl90eXBlKgorICAgICAgZmluZChjb25zdCBjaGFyX3R5cGUqIF9fcywgc3RkOjpzaXplX3QgX19uLCBjb25zdCBjaGFyX3R5cGUmIF9fYSk7CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCisgICAgICBtb3ZlKGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzdGQ6OnNpemVfdCBfX24pOworCisgICAgICBzdGF0aWMgY2hhcl90eXBlKgorICAgICAgY29weShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc3RkOjpzaXplX3QgX19uKTsKKworICAgICAgc3RhdGljIGNoYXJfdHlwZSoKKyAgICAgIGFzc2lnbihjaGFyX3R5cGUqIF9fcywgc3RkOjpzaXplX3QgX19uLCBjaGFyX3R5cGUgX19hKTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBjaGFyX3R5cGUKKyAgICAgIHRvX2NoYXJfdHlwZShjb25zdCBpbnRfdHlwZSYgX19jKQorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcl90eXBlPihfX2MpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgaW50X3R5cGUKKyAgICAgIHRvX2ludF90eXBlKGNvbnN0IGNoYXJfdHlwZSYgX19jKQorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50X3R5cGU+KF9fYyk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgICBlcV9pbnRfdHlwZShjb25zdCBpbnRfdHlwZSYgX19jMSwgY29uc3QgaW50X3R5cGUmIF9fYzIpCisgICAgICB7IHJldHVybiBfX2MxID09IF9fYzI7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBpbnRfdHlwZQorICAgICAgZW9mKCkKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGludF90eXBlPihfR0xJQkNYWF9TVERJT19FT0YpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgaW50X3R5cGUKKyAgICAgIG5vdF9lb2YoY29uc3QgaW50X3R5cGUmIF9fYykKKyAgICAgIHsgcmV0dXJuICFlcV9pbnRfdHlwZShfX2MsIGVvZigpKSA/IF9fYyA6IHRvX2ludF90eXBlKGNoYXJfdHlwZSgpKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGludAorICAgIGNoYXJfdHJhaXRzPF9DaGFyVD46OgorICAgIGNvbXBhcmUoY29uc3QgY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHN0ZDo6c2l6ZV90IF9fbikKKyAgICB7CisgICAgICBmb3IgKHN0ZDo6c2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisJaWYgKGx0KF9fczFbX19pXSwgX19zMltfX2ldKSkKKwkgIHJldHVybiAtMTsKKwllbHNlIGlmIChsdChfX3MyW19faV0sIF9fczFbX19pXSkpCisJICByZXR1cm4gMTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgc3RkOjpzaXplX3QKKyAgICBjaGFyX3RyYWl0czxfQ2hhclQ+OjoKKyAgICBsZW5ndGgoY29uc3QgY2hhcl90eXBlKiBfX3ApCisgICAgeworICAgICAgc3RkOjpzaXplX3QgX19pID0gMDsKKyAgICAgIHdoaWxlICghZXEoX19wW19faV0sIGNoYXJfdHlwZSgpKSkKKyAgICAgICAgKytfX2k7CisgICAgICByZXR1cm4gX19pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY29uc3QgdHlwZW5hbWUgY2hhcl90cmFpdHM8X0NoYXJUPjo6Y2hhcl90eXBlKgorICAgIGNoYXJfdHJhaXRzPF9DaGFyVD46OgorICAgIGZpbmQoY29uc3QgY2hhcl90eXBlKiBfX3MsIHN0ZDo6c2l6ZV90IF9fbiwgY29uc3QgY2hhcl90eXBlJiBfX2EpCisgICAgeworICAgICAgZm9yIChzdGQ6OnNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorICAgICAgICBpZiAoZXEoX19zW19faV0sIF9fYSkpCisgICAgICAgICAgcmV0dXJuIF9fcyArIF9faTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgdHlwZW5hbWUgY2hhcl90cmFpdHM8X0NoYXJUPjo6Y2hhcl90eXBlKgorICAgIGNoYXJfdHJhaXRzPF9DaGFyVD46OgorICAgIG1vdmUoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHN0ZDo6c2l6ZV90IF9fbikKKyAgICB7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X0NoYXJUKj4oX19idWlsdGluX21lbW1vdmUoX19zMSwgX19zMiwKKwkJCQkJCSAgICBfX24gKiBzaXplb2YoY2hhcl90eXBlKSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgdHlwZW5hbWUgY2hhcl90cmFpdHM8X0NoYXJUPjo6Y2hhcl90eXBlKgorICAgIGNoYXJfdHJhaXRzPF9DaGFyVD46OgorICAgIGNvcHkoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHN0ZDo6c2l6ZV90IF9fbikKKyAgICB7CisgICAgICAvLyBOQjogSW5saW5lIHN0ZDo6Y29weSBzbyBubyByZWN1cnNpdmUgZGVwZW5kZW5jaWVzLgorICAgICAgc3RkOjpjb3B5KF9fczIsIF9fczIgKyBfX24sIF9fczEpOworICAgICAgcmV0dXJuIF9fczE7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICB0eXBlbmFtZSBjaGFyX3RyYWl0czxfQ2hhclQ+OjpjaGFyX3R5cGUqCisgICAgY2hhcl90cmFpdHM8X0NoYXJUPjo6CisgICAgYXNzaWduKGNoYXJfdHlwZSogX19zLCBzdGQ6OnNpemVfdCBfX24sIGNoYXJfdHlwZSBfX2EpCisgICAgeworICAgICAgLy8gTkI6IElubGluZSBzdGQ6OmZpbGxfbiBzbyBubyByZWN1cnNpdmUgZGVwZW5kZW5jaWVzLgorICAgICAgc3RkOjpmaWxsX24oX19zLCBfX24sIF9fYSk7CisgICAgICByZXR1cm4gX19zOworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gMjEuMQorICAvKioKKyAgICogIEBicmllZiAgQmFzaXMgZm9yIGV4cGxpY2l0IHRyYWl0cyBzcGVjaWFsaXphdGlvbnMuCisgICAqCisgICAqICBAbm90ZSAgRm9yIGFueSBnaXZlbiBhY3R1YWwgY2hhcmFjdGVyIHR5cGUsIHRoaXMgZGVmaW5pdGlvbiBpcworICAgKiAgcHJvYmFibHkgd3JvbmcuICBTaW5jZSB0aGlzIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgYXJvdW5kCisgICAqICBfX2dudV9jeHg6OmNoYXJfdHJhaXRzLCBpdCBpcyBwb3NzaWJsZSB0byBhY2hpZXZlIGEgbW9yZQorICAgKiAgYXBwcm9wcmlhdGUgZGVmaW5pdGlvbiBieSBzcGVjaWFsaXppbmcgX19nbnVfY3h4OjpjaGFyX3RyYWl0cy4KKyAgICoKKyAgICogIFNlZSBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDA1Y2gxM3MwMy5odG1sCisgICAqICBmb3IgYWR2aWNlIG9uIGhvdyB0byBtYWtlIHVzZSBvZiB0aGlzIGNsYXNzIGZvciBAYSB1bnVzdWFsIGNoYXJhY3RlcgorICAgKiAgdHlwZXMuIEFsc28sIGNoZWNrIG91dCBpbmNsdWRlL2V4dC9wb2RfY2hhcl90cmFpdHMuaC4KKyAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUPgorICAgIHN0cnVjdCBjaGFyX3RyYWl0cyA6IHB1YmxpYyBfX2dudV9jeHg6OmNoYXJfdHJhaXRzPF9DaGFyVD4KKyAgICB7IH07CisKKworICAvLy8gMjEuMS4zLjEgIGNoYXJfdHJhaXRzIHNwZWNpYWxpemF0aW9ucworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGNoYXJfdHJhaXRzPGNoYXI+CisgICAgeworICAgICAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIGludCAgICAgICAgICAgICAgIGludF90eXBlOworICAgICAgdHlwZWRlZiBzdHJlYW1wb3MgICAgICAgICBwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RyZWFtb2ZmICAgICAgICAgb2ZmX3R5cGU7CisgICAgICB0eXBlZGVmIG1ic3RhdGVfdCAgICAgICAgIHN0YXRlX3R5cGU7CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBhc3NpZ24oY2hhcl90eXBlJiBfX2MxLCBjb25zdCBjaGFyX3R5cGUmIF9fYzIpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9fYzEgPSBfX2MyOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgICAgZXEoY29uc3QgY2hhcl90eXBlJiBfX2MxLCBjb25zdCBjaGFyX3R5cGUmIF9fYzIpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfX2MxID09IF9fYzI7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgICBsdChjb25zdCBjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9fYzEgPCBfX2MyOyB9CisKKyAgICAgIHN0YXRpYyBpbnQKKyAgICAgIGNvbXBhcmUoY29uc3QgY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCisgICAgICB7IHJldHVybiBfX2J1aWx0aW5fbWVtY21wKF9fczEsIF9fczIsIF9fbik7IH0KKworICAgICAgc3RhdGljIHNpemVfdAorICAgICAgbGVuZ3RoKGNvbnN0IGNoYXJfdHlwZSogX19zKQorICAgICAgeyByZXR1cm4gX19idWlsdGluX3N0cmxlbihfX3MpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyX3R5cGUqCisgICAgICBmaW5kKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjb25zdCBjaGFyX3R5cGUmIF9fYSkKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IGNoYXJfdHlwZSo+KF9fYnVpbHRpbl9tZW1jaHIoX19zLCBfX2EsIF9fbikpOyB9CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCisgICAgICBtb3ZlKGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKQorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcl90eXBlKj4oX19idWlsdGluX21lbW1vdmUoX19zMSwgX19zMiwgX19uKSk7IH0KKworICAgICAgc3RhdGljIGNoYXJfdHlwZSoKKyAgICAgIGNvcHkoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxjaGFyX3R5cGUqPihfX2J1aWx0aW5fbWVtY3B5KF9fczEsIF9fczIsIF9fbikpOyB9CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCisgICAgICBhc3NpZ24oY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNoYXJfdHlwZSBfX2EpCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxjaGFyX3R5cGUqPihfX2J1aWx0aW5fbWVtc2V0KF9fcywgX19hLCBfX24pKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXJfdHlwZQorICAgICAgdG9fY2hhcl90eXBlKGNvbnN0IGludF90eXBlJiBfX2MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxjaGFyX3R5cGU+KF9fYyk7IH0KKworICAgICAgLy8gVG8ga2VlcCBib3RoIHRoZSBieXRlIDB4ZmYgYW5kIHRoZSBlb2Ygc3ltYm9sIDB4ZmZmZmZmZmYKKyAgICAgIC8vIGZyb20gZW5kaW5nIHVwIGFzIDB4ZmZmZmZmZmYuCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGludF90eXBlCisgICAgICB0b19pbnRfdHlwZShjb25zdCBjaGFyX3R5cGUmIF9fYykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGludF90eXBlPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihfX2MpKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICAgIGVxX2ludF90eXBlKGNvbnN0IGludF90eXBlJiBfX2MxLCBjb25zdCBpbnRfdHlwZSYgX19jMikgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9fYzEgPT0gX19jMjsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGludF90eXBlCisgICAgICBlb2YoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50X3R5cGU+KF9HTElCQ1hYX1NURElPX0VPRik7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBpbnRfdHlwZQorICAgICAgbm90X2VvZihjb25zdCBpbnRfdHlwZSYgX19jKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gKF9fYyA9PSBlb2YoKSkgPyAwIDogX19jOyB9CisgIH07CisKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIC8vLyAyMS4xLjMuMiAgY2hhcl90cmFpdHMgc3BlY2lhbGl6YXRpb25zCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgY2hhcl90cmFpdHM8d2NoYXJfdD4KKyAgICB7CisgICAgICB0eXBlZGVmIHdjaGFyX3QgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgd2ludF90ICAgICAgICAgICAgaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHN0cmVhbW9mZiAgICAgICAgIG9mZl90eXBlOworICAgICAgdHlwZWRlZiB3c3RyZWFtcG9zICAgICAgICBwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgbWJzdGF0ZV90ICAgICAgICAgc3RhdGVfdHlwZTsKKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIGFzc2lnbihjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgX19jMSA9IF9fYzI7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgICBlcShjb25zdCBjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9fYzEgPT0gX19jMjsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICAgIGx0KGNvbnN0IGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX19jMSA8IF9fYzI7IH0KKworICAgICAgc3RhdGljIGludAorICAgICAgY29tcGFyZShjb25zdCBjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKKyAgICAgIHsgcmV0dXJuIHdtZW1jbXAoX19zMSwgX19zMiwgX19uKTsgfQorCisgICAgICBzdGF0aWMgc2l6ZV90CisgICAgICBsZW5ndGgoY29uc3QgY2hhcl90eXBlKiBfX3MpCisgICAgICB7IHJldHVybiB3Y3NsZW4oX19zKTsgfQorCisgICAgICBzdGF0aWMgY29uc3QgY2hhcl90eXBlKgorICAgICAgZmluZChjb25zdCBjaGFyX3R5cGUqIF9fcywgc2l6ZV90IF9fbiwgY29uc3QgY2hhcl90eXBlJiBfX2EpCisgICAgICB7IHJldHVybiB3bWVtY2hyKF9fcywgX19hLCBfX24pOyB9CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCisgICAgICBtb3ZlKGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKQorICAgICAgeyByZXR1cm4gd21lbW1vdmUoX19zMSwgX19zMiwgX19uKTsgfQorCisgICAgICBzdGF0aWMgY2hhcl90eXBlKgorICAgICAgY29weShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKKyAgICAgIHsgcmV0dXJuIHdtZW1jcHkoX19zMSwgX19zMiwgX19uKTsgfQorCisgICAgICBzdGF0aWMgY2hhcl90eXBlKgorICAgICAgYXNzaWduKGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjaGFyX3R5cGUgX19hKQorICAgICAgeyByZXR1cm4gd21lbXNldChfX3MsIF9fYSwgX19uKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXJfdHlwZQorICAgICAgdG9fY2hhcl90eXBlKGNvbnN0IGludF90eXBlJiBfX2MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjaGFyX3R5cGUoX19jKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGludF90eXBlCisgICAgICB0b19pbnRfdHlwZShjb25zdCBjaGFyX3R5cGUmIF9fYykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGludF90eXBlKF9fYyk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgICBlcV9pbnRfdHlwZShjb25zdCBpbnRfdHlwZSYgX19jMSwgY29uc3QgaW50X3R5cGUmIF9fYzIpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfX2MxID09IF9fYzI7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBpbnRfdHlwZQorICAgICAgZW9mKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGludF90eXBlPihXRU9GKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGludF90eXBlCisgICAgICBub3RfZW9mKGNvbnN0IGludF90eXBlJiBfX2MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBlcV9pbnRfdHlwZShfX2MsIGVvZigpKSA/IDAgOiBfX2M7IH0KKyAgfTsKKyNlbmRpZiAvL19HTElCQ1hYX1VTRV9XQ0hBUl9UCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2lmICgoX19jcGx1c3BsdXMgPj0gMjAxMTAzTCkgXAorICAgICAmJiBkZWZpbmVkKF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMSkpCisKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBjaGFyX3RyYWl0czxjaGFyMTZfdD4KKyAgICB7CisgICAgICB0eXBlZGVmIGNoYXIxNl90ICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdWludF9sZWFzdDE2X3QgICAgaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHN0cmVhbW9mZiAgICAgICAgIG9mZl90eXBlOworICAgICAgdHlwZWRlZiB1MTZzdHJlYW1wb3MgICAgICBwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgbWJzdGF0ZV90ICAgICAgICAgc3RhdGVfdHlwZTsKKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIGFzc2lnbihjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikgbm9leGNlcHQKKyAgICAgIHsgX19jMSA9IF9fYzI7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sCisgICAgICBlcShjb25zdCBjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYzEgPT0gX19jMjsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wKKyAgICAgIGx0KGNvbnN0IGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19jMSA8IF9fYzI7IH0KKworICAgICAgc3RhdGljIGludAorICAgICAgY29tcGFyZShjb25zdCBjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorCSAgaWYgKGx0KF9fczFbX19pXSwgX19zMltfX2ldKSkKKwkgICAgcmV0dXJuIC0xOworCSAgZWxzZSBpZiAobHQoX19zMltfX2ldLCBfX3MxW19faV0pKQorCSAgICByZXR1cm4gMTsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgc3RhdGljIHNpemVfdAorICAgICAgbGVuZ3RoKGNvbnN0IGNoYXJfdHlwZSogX19zKQorICAgICAgeworCXNpemVfdCBfX2kgPSAwOworCXdoaWxlICghZXEoX19zW19faV0sIGNoYXJfdHlwZSgpKSkKKwkgICsrX19pOworCXJldHVybiBfX2k7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyX3R5cGUqCisgICAgICBmaW5kKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjb25zdCBjaGFyX3R5cGUmIF9fYSkKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorCSAgaWYgKGVxKF9fc1tfX2ldLCBfX2EpKQorCSAgICByZXR1cm4gX19zICsgX19pOworCXJldHVybiAwOworICAgICAgfQorCisgICAgICBzdGF0aWMgY2hhcl90eXBlKgorICAgICAgbW92ZShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKKyAgICAgIHsKKwlyZXR1cm4gKHN0YXRpY19jYXN0PGNoYXJfdHlwZSo+CisJCShfX2J1aWx0aW5fbWVtbW92ZShfX3MxLCBfX3MyLCBfX24gKiBzaXplb2YoY2hhcl90eXBlKSkpKTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGNoYXJfdHlwZSoKKyAgICAgIGNvcHkoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCisgICAgICB7CisJcmV0dXJuIChzdGF0aWNfY2FzdDxjaGFyX3R5cGUqPgorCQkoX19idWlsdGluX21lbWNweShfX3MxLCBfX3MyLCBfX24gKiBzaXplb2YoY2hhcl90eXBlKSkpKTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGNoYXJfdHlwZSoKKyAgICAgIGFzc2lnbihjaGFyX3R5cGUqIF9fcywgc2l6ZV90IF9fbiwgY2hhcl90eXBlIF9fYSkKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorCSAgYXNzaWduKF9fc1tfX2ldLCBfX2EpOworCXJldHVybiBfX3M7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhcl90eXBlCisgICAgICB0b19jaGFyX3R5cGUoY29uc3QgaW50X3R5cGUmIF9fYykgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNoYXJfdHlwZShfX2MpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50X3R5cGUKKyAgICAgIHRvX2ludF90eXBlKGNvbnN0IGNoYXJfdHlwZSYgX19jKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gaW50X3R5cGUoX19jKTsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wKKyAgICAgIGVxX2ludF90eXBlKGNvbnN0IGludF90eXBlJiBfX2MxLCBjb25zdCBpbnRfdHlwZSYgX19jMikgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYzEgPT0gX19jMjsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGludF90eXBlCisgICAgICBlb2YoKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50X3R5cGU+KC0xKTsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGludF90eXBlCisgICAgICBub3RfZW9mKGNvbnN0IGludF90eXBlJiBfX2MpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBlcV9pbnRfdHlwZShfX2MsIGVvZigpKSA/IDAgOiBfX2M7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgY2hhcl90cmFpdHM8Y2hhcjMyX3Q+CisgICAgeworICAgICAgdHlwZWRlZiBjaGFyMzJfdCAgICAgICAgICBjaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIHVpbnRfbGVhc3QzMl90ICAgIGludF90eXBlOworICAgICAgdHlwZWRlZiBzdHJlYW1vZmYgICAgICAgICBvZmZfdHlwZTsKKyAgICAgIHR5cGVkZWYgdTMyc3RyZWFtcG9zICAgICAgcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIG1ic3RhdGVfdCAgICAgICAgIHN0YXRlX3R5cGU7CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBhc3NpZ24oY2hhcl90eXBlJiBfX2MxLCBjb25zdCBjaGFyX3R5cGUmIF9fYzIpIG5vZXhjZXB0CisgICAgICB7IF9fYzEgPSBfX2MyOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbAorICAgICAgZXEoY29uc3QgY2hhcl90eXBlJiBfX2MxLCBjb25zdCBjaGFyX3R5cGUmIF9fYzIpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2MxID09IF9fYzI7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sCisgICAgICBsdChjb25zdCBjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fYzEgPCBfX2MyOyB9CisKKyAgICAgIHN0YXRpYyBpbnQKKyAgICAgIGNvbXBhcmUoY29uc3QgY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCisgICAgICB7CisJZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKwkgIGlmIChsdChfX3MxW19faV0sIF9fczJbX19pXSkpCisJICAgIHJldHVybiAtMTsKKwkgIGVsc2UgaWYgKGx0KF9fczJbX19pXSwgX19zMVtfX2ldKSkKKwkgICAgcmV0dXJuIDE7CisJcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBzaXplX3QKKyAgICAgIGxlbmd0aChjb25zdCBjaGFyX3R5cGUqIF9fcykKKyAgICAgIHsKKwlzaXplX3QgX19pID0gMDsKKwl3aGlsZSAoIWVxKF9fc1tfX2ldLCBjaGFyX3R5cGUoKSkpCisJICArK19faTsKKwlyZXR1cm4gX19pOworICAgICAgfQorCisgICAgICBzdGF0aWMgY29uc3QgY2hhcl90eXBlKgorICAgICAgZmluZChjb25zdCBjaGFyX3R5cGUqIF9fcywgc2l6ZV90IF9fbiwgY29uc3QgY2hhcl90eXBlJiBfX2EpCisgICAgICB7CisJZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKwkgIGlmIChlcShfX3NbX19pXSwgX19hKSkKKwkgICAgcmV0dXJuIF9fcyArIF9faTsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGNoYXJfdHlwZSoKKyAgICAgIG1vdmUoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCisgICAgICB7CisJcmV0dXJuIChzdGF0aWNfY2FzdDxjaGFyX3R5cGUqPgorCQkoX19idWlsdGluX21lbW1vdmUoX19zMSwgX19zMiwgX19uICogc2l6ZW9mKGNoYXJfdHlwZSkpKSk7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCisgICAgICBjb3B5KGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKQorICAgICAgeyAKKwlyZXR1cm4gKHN0YXRpY19jYXN0PGNoYXJfdHlwZSo+CisJCShfX2J1aWx0aW5fbWVtY3B5KF9fczEsIF9fczIsIF9fbiAqIHNpemVvZihjaGFyX3R5cGUpKSkpOworICAgICAgfQorCisgICAgICBzdGF0aWMgY2hhcl90eXBlKgorICAgICAgYXNzaWduKGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjaGFyX3R5cGUgX19hKQorICAgICAgeworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisJICBhc3NpZ24oX19zW19faV0sIF9fYSk7CisJcmV0dXJuIF9fczsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyX3R5cGUKKyAgICAgIHRvX2NoYXJfdHlwZShjb25zdCBpbnRfdHlwZSYgX19jKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY2hhcl90eXBlKF9fYyk7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnRfdHlwZQorICAgICAgdG9faW50X3R5cGUoY29uc3QgY2hhcl90eXBlJiBfX2MpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBpbnRfdHlwZShfX2MpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbAorICAgICAgZXFfaW50X3R5cGUoY29uc3QgaW50X3R5cGUmIF9fYzEsIGNvbnN0IGludF90eXBlJiBfX2MyKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19jMSA9PSBfX2MyOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50X3R5cGUKKyAgICAgIGVvZigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnRfdHlwZT4oLTEpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50X3R5cGUKKyAgICAgIG5vdF9lb2YoY29uc3QgaW50X3R5cGUmIF9fYykgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGVxX2ludF90eXBlKF9fYywgZW9mKCkpID8gMCA6IF9fYzsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIAorCisjZW5kaWYgLy8gX0NIQVJfVFJBSVRTX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9jb2RlY3Z0LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvY29kZWN2dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3Y2Q5M2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvY29kZWN2dC5oCkBAIC0wLDAgKzEsNTA3IEBACisvLyBMb2NhbGUgc3VwcG9ydCAoY29kZWN2dCkgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvY29kZWN2dC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bG9jYWxlfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMi4yLjEuNSBUZW1wbGF0ZSBjbGFzcyBjb2RlY3Z0CisvLworCisvLyBXcml0dGVuIGJ5IEJlbmphbWluIEtvc25payA8YmtvekByZWRoYXQuY29tPgorCisjaWZuZGVmIF9DT0RFQ1ZUX0gKKyNkZWZpbmUgX0NPREVDVlRfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vLyBFbXB0eSBiYXNlIGNsYXNzIGZvciBjb2RlY3Z0IGZhY2V0IFsyMi4yLjEuNV0uCisgIGNsYXNzIGNvZGVjdnRfYmFzZQorICB7CisgIHB1YmxpYzoKKyAgICBlbnVtIHJlc3VsdAorICAgIHsKKyAgICAgIG9rLAorICAgICAgcGFydGlhbCwKKyAgICAgIGVycm9yLAorICAgICAgbm9jb252CisgICAgfTsKKyAgfTsKKworICAvKioKKyAgICogIEBicmllZiAgQ29tbW9uIGJhc2UgZm9yIGNvZGVjdnQgZnVuY3Rpb25zLgorICAgKgorICAgKiAgVGhpcyB0ZW1wbGF0ZSBjbGFzcyBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHB1YmxpYyBmdW5jdGlvbnMKKyAgICogIHRoYXQgZm9yd2FyZCB0byB0aGUgcHJvdGVjdGVkIHZpcnR1YWwgZnVuY3Rpb25zLgorICAgKgorICAgKiAgVGhpcyB0ZW1wbGF0ZSBhbHNvIHByb3ZpZGVzIGFic3RyYWN0IHN0dWJzIGZvciB0aGUgcHJvdGVjdGVkIHZpcnR1YWwKKyAgICogIGZ1bmN0aW9ucy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVyblQsIHR5cGVuYW1lIF9FeHRlcm5ULCB0eXBlbmFtZSBfU3RhdGVUPgorICAgIGNsYXNzIF9fY29kZWN2dF9hYnN0cmFjdF9iYXNlCisgICAgOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwgcHVibGljIGNvZGVjdnRfYmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIHR5cGVkZWYgY29kZWN2dF9iYXNlOjpyZXN1bHQJcmVzdWx0OworICAgICAgdHlwZWRlZiBfSW50ZXJuVAkJCWludGVybl90eXBlOworICAgICAgdHlwZWRlZiBfRXh0ZXJuVAkJCWV4dGVybl90eXBlOworICAgICAgdHlwZWRlZiBfU3RhdGVUCQkJc3RhdGVfdHlwZTsKKworICAgICAgLy8gMjIuMi4xLjUuMSBjb2RlY3Z0IG1lbWJlcnMKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCBmcm9tIGludGVybmFsIHRvIGV4dGVybmFsIGNoYXJhY3RlciBzZXQuCisgICAgICAgKgorICAgICAgICogIENvbnZlcnRzIGlucHV0IHN0cmluZyBvZiBpbnRlcm5fdHlwZSB0byBvdXRwdXQgc3RyaW5nIG9mCisgICAgICAgKiAgZXh0ZXJuX3R5cGUuICBUaGlzIGlzIGFuYWxvZ291cyB0byB3Y3NydG9tYnMuICBJdCBkb2VzIHRoaXMgYnkKKyAgICAgICAqICBjYWxsaW5nIGNvZGVjdnQ6OmRvX291dC4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gY2hhcmFjdGVyIHNldHMgYXJlIGRldGVybWluZWQgYnkgdGhlCisgICAgICAgKiAgZmFjZXQncyBsb2NhbGUsIGludGVybmFsIGFuZCBleHRlcm5hbCB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGNoYXJhY3RlcnMgaW4gW2Zyb20sZnJvbV9lbmQpIGFyZSBjb252ZXJ0ZWQgYW5kIHdyaXR0ZW4gdG8KKyAgICAgICAqICBbdG8sdG9fZW5kKS4gIGZyb21fbmV4dCBhbmQgdG9fbmV4dCBhcmUgc2V0IHRvIHBvaW50IHRvIHRoZQorICAgICAgICogIGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIGxhc3Qgc3VjY2Vzc2Z1bGx5IGNvbnZlcnRlZCBjaGFyYWN0ZXIsCisgICAgICAgKiAgcmVzcGVjdGl2ZWx5LiAgSWYgdGhlIHJlc3VsdCBuZWVkZWQgbm8gY29udmVyc2lvbiwgZnJvbV9uZXh0IGFuZAorICAgICAgICogIHRvX25leHQgYXJlIG5vdCBhZmZlY3RlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIEBhIHN0YXRlIGFyZ3VtZW50IHNob3VsZCBiZSBpbml0aWFsaXplZCBpZiB0aGUgaW5wdXQgaXMgYXQgdGhlCisgICAgICAgKiAgYmVnaW5uaW5nIGFuZCBjYXJyaWVkIGZyb20gYSBwcmV2aW91cyBjYWxsIGlmIGNvbnRpbnVpbmcKKyAgICAgICAqICBjb252ZXJzaW9uLiAgVGhlcmUgYXJlIG5vIGd1YXJhbnRlZXMgYWJvdXQgaG93IEBhIHN0YXRlIGlzIHVzZWQuCisgICAgICAgKgorICAgICAgICogIFRoZSByZXN1bHQgcmV0dXJuZWQgaXMgYSBtZW1iZXIgb2YgY29kZWN2dF9iYXNlOjpyZXN1bHQuICBJZgorICAgICAgICogIGFsbCB0aGUgaW5wdXQgaXMgY29udmVydGVkLCByZXR1cm5zIGNvZGVjdnRfYmFzZTo6b2suICBJZiBubworICAgICAgICogIGNvbnZlcnNpb24gaXMgbmVjZXNzYXJ5LCByZXR1cm5zIGNvZGVjdnRfYmFzZTo6bm9jb252LiAgSWYKKyAgICAgICAqICB0aGUgaW5wdXQgZW5kcyBlYXJseSBvciB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgc3BhY2UgaW4gdGhlCisgICAgICAgKiAgb3V0cHV0LCByZXR1cm5zIGNvZGVjdnRfYmFzZTo6cGFydGlhbC4gIE90aGVyd2lzZSB0aGUKKyAgICAgICAqICBjb252ZXJzaW9uIGZhaWxlZCBhbmQgY29kZWN2dF9iYXNlOjplcnJvciBpcyByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3N0YXRlICBQZXJzaXN0ZW50IGNvbnZlcnNpb24gc3RhdGUgZGF0YS4KKyAgICAgICAqICBAcGFyYW0gIF9fZnJvbSAgU3RhcnQgb2YgaW5wdXQuCisgICAgICAgKiAgQHBhcmFtICBfX2Zyb21fZW5kICBFbmQgb2YgaW5wdXQuCisgICAgICAgKiAgQHBhcmFtICBfX2Zyb21fbmV4dCAgUmV0dXJucyBzdGFydCBvZiB1bmNvbnZlcnRlZCBkYXRhLgorICAgICAgICogIEBwYXJhbSAgX190byAgU3RhcnQgb2Ygb3V0cHV0IGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIF9fdG9fZW5kICBFbmQgb2Ygb3V0cHV0IGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIF9fdG9fbmV4dCAgUmV0dXJucyBzdGFydCBvZiB1bnVzZWQgb3V0cHV0IGFyZWEuCisgICAgICAgKiAgQHJldHVybiAgY29kZWN2dF9iYXNlOjpyZXN1bHQuCisgICAgICAqLworICAgICAgcmVzdWx0CisgICAgICBvdXQoc3RhdGVfdHlwZSYgX19zdGF0ZSwgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJvbSwKKwkgIGNvbnN0IGludGVybl90eXBlKiBfX2Zyb21fZW5kLCBjb25zdCBpbnRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAorCSAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwKKwkgIGV4dGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdAorICAgICAgeworCXJldHVybiB0aGlzLT5kb19vdXQoX19zdGF0ZSwgX19mcm9tLCBfX2Zyb21fZW5kLCBfX2Zyb21fbmV4dCwKKwkJCSAgICBfX3RvLCBfX3RvX2VuZCwgX190b19uZXh0KTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXNldCBjb252ZXJzaW9uIHN0YXRlLgorICAgICAgICoKKyAgICAgICAqICBXcml0ZXMgY2hhcmFjdGVycyB0byBvdXRwdXQgdGhhdCB3b3VsZCByZXN0b3JlIEBhIHN0YXRlIHRvIGluaXRpYWwKKyAgICAgICAqICBjb25kaXRpb25zLiAgVGhlIGlkZWEgaXMgdGhhdCBpZiBhIHBhcnRpYWwgY29udmVyc2lvbiBvY2N1cnMsIHRoZW4KKyAgICAgICAqICB0aGUgY29udmVydGluZyB0aGUgY2hhcmFjdGVycyB3cml0dGVuIGJ5IHRoaXMgZnVuY3Rpb24gd291bGQgbGVhdmUKKyAgICAgICAqICB0aGUgc3RhdGUgaW4gaW5pdGlhbCBjb25kaXRpb25zLCByYXRoZXIgdGhhbiBwYXJ0aWFsIGNvbnZlcnNpb24KKyAgICAgICAqICBzdGF0ZS4gIEl0IGRvZXMgdGhpcyBieSBjYWxsaW5nIGNvZGVjdnQ6OmRvX3Vuc2hpZnQoKS4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIGV4YW1wbGUsIGlmIDQgZXh0ZXJuYWwgY2hhcmFjdGVycyBhbHdheXMgY29udmVydGVkIHRvIDEgaW50ZXJuYWwKKyAgICAgICAqICBjaGFyYWN0ZXIsIGFuZCBpbnB1dCB0byBpbigpIGhhZCA2IGV4dGVybmFsIGNoYXJhY3RlcnMgd2l0aCBzdGF0ZQorICAgICAgICogIHNhdmVkLCB0aGlzIGZ1bmN0aW9uIHdvdWxkIHdyaXRlIHR3byBjaGFyYWN0ZXJzIHRvIHRoZSBvdXRwdXQgYW5kCisgICAgICAgKiAgc2V0IHRoZSBzdGF0ZSB0byBpbml0aWFsaXplZCBjb25kaXRpb25zLgorICAgICAgICoKKyAgICAgICAqICBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBjaGFyYWN0ZXIgc2V0cyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUKKyAgICAgICAqICBmYWNldCdzIGxvY2FsZSwgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgcmVzdWx0IHJldHVybmVkIGlzIGEgbWVtYmVyIG9mIGNvZGVjdnRfYmFzZTo6cmVzdWx0LiAgSWYgdGhlCisgICAgICAgKiAgc3RhdGUgY291bGQgYmUgcmVzZXQgYW5kIGRhdGEgd3JpdHRlbiwgcmV0dXJucyBjb2RlY3Z0X2Jhc2U6Om9rLiAgSWYKKyAgICAgICAqICBubyBjb252ZXJzaW9uIGlzIG5lY2Vzc2FyeSwgcmV0dXJucyBjb2RlY3Z0X2Jhc2U6Om5vY29udi4gIElmIHRoZQorICAgICAgICogIG91dHB1dCBoYXMgaW5zdWZmaWNpZW50IHNwYWNlLCByZXR1cm5zIGNvZGVjdnRfYmFzZTo6cGFydGlhbC4KKyAgICAgICAqICBPdGhlcndpc2UgdGhlIHJlc2V0IGZhaWxlZCBhbmQgY29kZWN2dF9iYXNlOjplcnJvciBpcyByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3N0YXRlICBQZXJzaXN0ZW50IGNvbnZlcnNpb24gc3RhdGUgZGF0YS4KKyAgICAgICAqICBAcGFyYW0gIF9fdG8gIFN0YXJ0IG9mIG91dHB1dCBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICBfX3RvX2VuZCAgRW5kIG9mIG91dHB1dCBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICBfX3RvX25leHQgIFJldHVybnMgc3RhcnQgb2YgdW51c2VkIG91dHB1dCBhcmVhLgorICAgICAgICogIEByZXR1cm4gIGNvZGVjdnRfYmFzZTo6cmVzdWx0LgorICAgICAgKi8KKyAgICAgIHJlc3VsdAorICAgICAgdW5zaGlmdChzdGF0ZV90eXBlJiBfX3N0YXRlLCBleHRlcm5fdHlwZSogX190bywgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLAorCSAgICAgIGV4dGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fdW5zaGlmdChfX3N0YXRlLCBfX3RvLF9fdG9fZW5kLF9fdG9fbmV4dCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IGZyb20gZXh0ZXJuYWwgdG8gaW50ZXJuYWwgY2hhcmFjdGVyIHNldC4KKyAgICAgICAqCisgICAgICAgKiAgQ29udmVydHMgaW5wdXQgc3RyaW5nIG9mIGV4dGVybl90eXBlIHRvIG91dHB1dCBzdHJpbmcgb2YKKyAgICAgICAqICBpbnRlcm5fdHlwZS4gIFRoaXMgaXMgYW5hbG9nb3VzIHRvIG1ic3J0b3djcy4gIEl0IGRvZXMgdGhpcyBieQorICAgICAgICogIGNhbGxpbmcgY29kZWN2dDo6ZG9faW4uCisgICAgICAgKgorICAgICAgICogIFRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGNoYXJhY3RlciBzZXRzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZQorICAgICAgICogIGZhY2V0J3MgbG9jYWxlLCBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBjaGFyYWN0ZXJzIGluIFtmcm9tLGZyb21fZW5kKSBhcmUgY29udmVydGVkIGFuZCB3cml0dGVuIHRvCisgICAgICAgKiAgW3RvLHRvX2VuZCkuICBmcm9tX25leHQgYW5kIHRvX25leHQgYXJlIHNldCB0byBwb2ludCB0byB0aGUKKyAgICAgICAqICBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSBsYXN0IHN1Y2Nlc3NmdWxseSBjb252ZXJ0ZWQgY2hhcmFjdGVyLAorICAgICAgICogIHJlc3BlY3RpdmVseS4gIElmIHRoZSByZXN1bHQgbmVlZGVkIG5vIGNvbnZlcnNpb24sIGZyb21fbmV4dCBhbmQKKyAgICAgICAqICB0b19uZXh0IGFyZSBub3QgYWZmZWN0ZWQuCisgICAgICAgKgorICAgICAgICogIFRoZSBAYSBzdGF0ZSBhcmd1bWVudCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgaWYgdGhlIGlucHV0IGlzIGF0IHRoZQorICAgICAgICogIGJlZ2lubmluZyBhbmQgY2FycmllZCBmcm9tIGEgcHJldmlvdXMgY2FsbCBpZiBjb250aW51aW5nCisgICAgICAgKiAgY29udmVyc2lvbi4gIFRoZXJlIGFyZSBubyBndWFyYW50ZWVzIGFib3V0IGhvdyBAYSBzdGF0ZSBpcyB1c2VkLgorICAgICAgICoKKyAgICAgICAqICBUaGUgcmVzdWx0IHJldHVybmVkIGlzIGEgbWVtYmVyIG9mIGNvZGVjdnRfYmFzZTo6cmVzdWx0LiAgSWYKKyAgICAgICAqICBhbGwgdGhlIGlucHV0IGlzIGNvbnZlcnRlZCwgcmV0dXJucyBjb2RlY3Z0X2Jhc2U6Om9rLiAgSWYgbm8KKyAgICAgICAqICBjb252ZXJzaW9uIGlzIG5lY2Vzc2FyeSwgcmV0dXJucyBjb2RlY3Z0X2Jhc2U6Om5vY29udi4gIElmCisgICAgICAgKiAgdGhlIGlucHV0IGVuZHMgZWFybHkgb3IgdGhlcmUgaXMgaW5zdWZmaWNpZW50IHNwYWNlIGluIHRoZQorICAgICAgICogIG91dHB1dCwgcmV0dXJucyBjb2RlY3Z0X2Jhc2U6OnBhcnRpYWwuICBPdGhlcndpc2UgdGhlCisgICAgICAgKiAgY29udmVyc2lvbiBmYWlsZWQgYW5kIGNvZGVjdnRfYmFzZTo6ZXJyb3IgaXMgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19zdGF0ZSAgUGVyc2lzdGVudCBjb252ZXJzaW9uIHN0YXRlIGRhdGEuCisgICAgICAgKiAgQHBhcmFtICBfX2Zyb20gIFN0YXJ0IG9mIGlucHV0LgorICAgICAgICogIEBwYXJhbSAgX19mcm9tX2VuZCAgRW5kIG9mIGlucHV0LgorICAgICAgICogIEBwYXJhbSAgX19mcm9tX25leHQgIFJldHVybnMgc3RhcnQgb2YgdW5jb252ZXJ0ZWQgZGF0YS4KKyAgICAgICAqICBAcGFyYW0gIF9fdG8gIFN0YXJ0IG9mIG91dHB1dCBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICBfX3RvX2VuZCAgRW5kIG9mIG91dHB1dCBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICBfX3RvX25leHQgIFJldHVybnMgc3RhcnQgb2YgdW51c2VkIG91dHB1dCBhcmVhLgorICAgICAgICogIEByZXR1cm4gIGNvZGVjdnRfYmFzZTo6cmVzdWx0LgorICAgICAgKi8KKyAgICAgIHJlc3VsdAorICAgICAgaW4oc3RhdGVfdHlwZSYgX19zdGF0ZSwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbSwKKwkgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbV9lbmQsIGNvbnN0IGV4dGVybl90eXBlKiYgX19mcm9tX25leHQsCisJIGludGVybl90eXBlKiBfX3RvLCBpbnRlcm5fdHlwZSogX190b19lbmQsCisJIGludGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdAorICAgICAgeworCXJldHVybiB0aGlzLT5kb19pbihfX3N0YXRlLCBfX2Zyb20sIF9fZnJvbV9lbmQsIF9fZnJvbV9uZXh0LAorCQkJICAgX190bywgX190b19lbmQsIF9fdG9fbmV4dCk7CisgICAgICB9CisKKyAgICAgIGludAorICAgICAgZW5jb2RpbmcoKSBjb25zdCB0aHJvdygpCisgICAgICB7IHJldHVybiB0aGlzLT5kb19lbmNvZGluZygpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGFsd2F5c19ub2NvbnYoKSBjb25zdCB0aHJvdygpCisgICAgICB7IHJldHVybiB0aGlzLT5kb19hbHdheXNfbm9jb252KCk7IH0KKworICAgICAgaW50CisgICAgICBsZW5ndGgoc3RhdGVfdHlwZSYgX19zdGF0ZSwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbSwKKwkgICAgIGNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwgc2l6ZV90IF9fbWF4KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fbGVuZ3RoKF9fc3RhdGUsIF9fZnJvbSwgX19lbmQsIF9fbWF4KTsgfQorCisgICAgICBpbnQKKyAgICAgIG1heF9sZW5ndGgoKSBjb25zdCB0aHJvdygpCisgICAgICB7IHJldHVybiB0aGlzLT5kb19tYXhfbGVuZ3RoKCk7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX2NvZGVjdnRfYWJzdHJhY3RfYmFzZShzaXplX3QgX19yZWZzID0gMCkgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykgeyB9CisKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5fX2NvZGVjdnRfYWJzdHJhY3RfYmFzZSgpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnZlcnQgZnJvbSBpbnRlcm5hbCB0byBleHRlcm5hbCBjaGFyYWN0ZXIgc2V0LgorICAgICAgICoKKyAgICAgICAqICBDb252ZXJ0cyBpbnB1dCBzdHJpbmcgb2YgaW50ZXJuX3R5cGUgdG8gb3V0cHV0IHN0cmluZyBvZgorICAgICAgICogIGV4dGVybl90eXBlLiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UKKyAgICAgICAqICB0aGUgdmFsdWUgcmV0dXJuZWQuICBAc2VlIG91dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgZG9fb3V0KHN0YXRlX3R5cGUmIF9fc3RhdGUsIGNvbnN0IGludGVybl90eXBlKiBfX2Zyb20sCisJICAgICBjb25zdCBpbnRlcm5fdHlwZSogX19mcm9tX2VuZCwgY29uc3QgaW50ZXJuX3R5cGUqJiBfX2Zyb21fbmV4dCwKKwkgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsCisJICAgICBleHRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3QgPSAwOworCisgICAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgZG9fdW5zaGlmdChzdGF0ZV90eXBlJiBfX3N0YXRlLCBleHRlcm5fdHlwZSogX190bywKKwkJIGV4dGVybl90eXBlKiBfX3RvX2VuZCwgZXh0ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0ID0gMDsKKworICAgICAgdmlydHVhbCByZXN1bHQKKyAgICAgIGRvX2luKHN0YXRlX3R5cGUmIF9fc3RhdGUsIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb20sCisJICAgIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb21fZW5kLCBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAorCSAgICBpbnRlcm5fdHlwZSogX190bywgaW50ZXJuX3R5cGUqIF9fdG9fZW5kLAorCSAgICBpbnRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3QgPSAwOworCisgICAgICB2aXJ0dWFsIGludAorICAgICAgZG9fZW5jb2RpbmcoKSBjb25zdCB0aHJvdygpID0gMDsKKworICAgICAgdmlydHVhbCBib29sCisgICAgICBkb19hbHdheXNfbm9jb252KCkgY29uc3QgdGhyb3coKSA9IDA7CisKKyAgICAgIHZpcnR1YWwgaW50CisgICAgICBkb19sZW5ndGgoc3RhdGVfdHlwZSYsIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb20sCisJCWNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwgc2l6ZV90IF9fbWF4KSBjb25zdCA9IDA7CisKKyAgICAgIHZpcnR1YWwgaW50CisgICAgICBkb19tYXhfbGVuZ3RoKCkgY29uc3QgdGhyb3coKSA9IDA7CisgICAgfTsKKworCisKKyAgLyoqCisgICAqICBAYnJpZWYgIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUgY29kZWN2dC4KKyAgICogIEBpbmdyb3VwIGxvY2FsZXMKKyAgICoKKyAgICogIE5COiBHZW5lcmljLCBtb3N0bHkgdXNlbGVzcyBpbXBsZW1lbnRhdGlvbi4KKyAgICoKKyAgKi8KKyAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlcm5ULCB0eXBlbmFtZSBfRXh0ZXJuVCwgdHlwZW5hbWUgX1N0YXRlVD4KKyAgICBjbGFzcyBjb2RlY3Z0CisgICAgOiBwdWJsaWMgX19jb2RlY3Z0X2Fic3RyYWN0X2Jhc2U8X0ludGVyblQsIF9FeHRlcm5ULCBfU3RhdGVUPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIHR5cGVkZWYgY29kZWN2dF9iYXNlOjpyZXN1bHQJcmVzdWx0OworICAgICAgdHlwZWRlZiBfSW50ZXJuVAkJCWludGVybl90eXBlOworICAgICAgdHlwZWRlZiBfRXh0ZXJuVAkJCWV4dGVybl90eXBlOworICAgICAgdHlwZWRlZiBfU3RhdGVUCQkJc3RhdGVfdHlwZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9fY19sb2NhbGUJCQlfTV9jX2xvY2FsZV9jb2RlY3Z0OworCisgICAgcHVibGljOgorICAgICAgc3RhdGljIGxvY2FsZTo6aWQJCQlpZDsKKworICAgICAgZXhwbGljaXQKKyAgICAgIGNvZGVjdnQoc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IF9fY29kZWN2dF9hYnN0cmFjdF9iYXNlPF9JbnRlcm5ULCBfRXh0ZXJuVCwgX1N0YXRlVD4gKF9fcmVmcyksCisJX01fY19sb2NhbGVfY29kZWN2dCgwKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBjb2RlY3Z0KF9fY19sb2NhbGUgX19jbG9jLCBzaXplX3QgX19yZWZzID0gMCk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2aXJ0dWFsCisgICAgICB+Y29kZWN2dCgpIHsgfQorCisgICAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgZG9fb3V0KHN0YXRlX3R5cGUmIF9fc3RhdGUsIGNvbnN0IGludGVybl90eXBlKiBfX2Zyb20sCisJICAgICBjb25zdCBpbnRlcm5fdHlwZSogX19mcm9tX2VuZCwgY29uc3QgaW50ZXJuX3R5cGUqJiBfX2Zyb21fbmV4dCwKKwkgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsCisJICAgICBleHRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICBkb191bnNoaWZ0KHN0YXRlX3R5cGUmIF9fc3RhdGUsIGV4dGVybl90eXBlKiBfX3RvLAorCQkgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLCBleHRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICBkb19pbihzdGF0ZV90eXBlJiBfX3N0YXRlLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLAorCSAgICBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tX2VuZCwgY29uc3QgZXh0ZXJuX3R5cGUqJiBfX2Zyb21fbmV4dCwKKwkgICAgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3RvX2VuZCwKKwkgICAgaW50ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIGludAorICAgICAgZG9fZW5jb2RpbmcoKSBjb25zdCB0aHJvdygpOworCisgICAgICB2aXJ0dWFsIGJvb2wKKyAgICAgIGRvX2Fsd2F5c19ub2NvbnYoKSBjb25zdCB0aHJvdygpOworCisgICAgICB2aXJ0dWFsIGludAorICAgICAgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLAorCQljb25zdCBleHRlcm5fdHlwZSogX19lbmQsIHNpemVfdCBfX21heCkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgaW50CisgICAgICBkb19tYXhfbGVuZ3RoKCkgY29uc3QgdGhyb3coKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlcm5ULCB0eXBlbmFtZSBfRXh0ZXJuVCwgdHlwZW5hbWUgX1N0YXRlVD4KKyAgICBsb2NhbGU6OmlkIGNvZGVjdnQ8X0ludGVyblQsIF9FeHRlcm5ULCBfU3RhdGVUPjo6aWQ7CisKKyAgLy8vIGNsYXNzIGNvZGVjdnQ8Y2hhciwgY2hhciwgbWJzdGF0ZV90PiBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIGNsYXNzIGNvZGVjdnQ8Y2hhciwgY2hhciwgbWJzdGF0ZV90PgorICAgIDogcHVibGljIF9fY29kZWN2dF9hYnN0cmFjdF9iYXNlPGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICB0eXBlZGVmIGNoYXIJCQlpbnRlcm5fdHlwZTsKKyAgICAgIHR5cGVkZWYgY2hhcgkJCWV4dGVybl90eXBlOworICAgICAgdHlwZWRlZiBtYnN0YXRlX3QJCQlzdGF0ZV90eXBlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgX19jX2xvY2FsZQkJCV9NX2NfbG9jYWxlX2NvZGVjdnQ7CisKKyAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgbG9jYWxlOjppZCBpZDsKKworICAgICAgZXhwbGljaXQKKyAgICAgIGNvZGVjdnQoc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgICBleHBsaWNpdAorICAgICAgY29kZWN2dChfX2NfbG9jYWxlIF9fY2xvYywgc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgcHJvdGVjdGVkOgorICAgICAgdmlydHVhbAorICAgICAgfmNvZGVjdnQoKTsKKworICAgICAgdmlydHVhbCByZXN1bHQKKyAgICAgIGRvX291dChzdGF0ZV90eXBlJiBfX3N0YXRlLCBjb25zdCBpbnRlcm5fdHlwZSogX19mcm9tLAorCSAgICAgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJvbV9lbmQsIGNvbnN0IGludGVybl90eXBlKiYgX19mcm9tX25leHQsCisJICAgICBleHRlcm5fdHlwZSogX190bywgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLAorCSAgICAgZXh0ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgZG9fdW5zaGlmdChzdGF0ZV90eXBlJiBfX3N0YXRlLCBleHRlcm5fdHlwZSogX190bywKKwkJIGV4dGVybl90eXBlKiBfX3RvX2VuZCwgZXh0ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgZG9faW4oc3RhdGVfdHlwZSYgX19zdGF0ZSwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbSwKKwkgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbV9lbmQsIGNvbnN0IGV4dGVybl90eXBlKiYgX19mcm9tX25leHQsCisJICAgIGludGVybl90eXBlKiBfX3RvLCBpbnRlcm5fdHlwZSogX190b19lbmQsCisJICAgIGludGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdDsKKworICAgICAgdmlydHVhbCBpbnQKKyAgICAgIGRvX2VuY29kaW5nKCkgY29uc3QgdGhyb3coKTsKKworICAgICAgdmlydHVhbCBib29sCisgICAgICBkb19hbHdheXNfbm9jb252KCkgY29uc3QgdGhyb3coKTsKKworICAgICAgdmlydHVhbCBpbnQKKyAgICAgIGRvX2xlbmd0aChzdGF0ZV90eXBlJiwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbSwKKwkJY29uc3QgZXh0ZXJuX3R5cGUqIF9fZW5kLCBzaXplX3QgX19tYXgpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIGludAorICAgICAgZG9fbWF4X2xlbmd0aCgpIGNvbnN0IHRocm93KCk7CisgIH07CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICAvLy8gY2xhc3MgY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+CisgICAgOiBwdWJsaWMgX19jb2RlY3Z0X2Fic3RyYWN0X2Jhc2U8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIHR5cGVkZWYgd2NoYXJfdAkJCWludGVybl90eXBlOworICAgICAgdHlwZWRlZiBjaGFyCQkJZXh0ZXJuX3R5cGU7CisgICAgICB0eXBlZGVmIG1ic3RhdGVfdAkJCXN0YXRlX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfX2NfbG9jYWxlCQkJX01fY19sb2NhbGVfY29kZWN2dDsKKworICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBsb2NhbGU6OmlkCQkJaWQ7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBjb2RlY3Z0KHNpemVfdCBfX3JlZnMgPSAwKTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIGNvZGVjdnQoX19jX2xvY2FsZSBfX2Nsb2MsIHNpemVfdCBfX3JlZnMgPSAwKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5jb2RlY3Z0KCk7CisKKyAgICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICBkb19vdXQoc3RhdGVfdHlwZSYgX19zdGF0ZSwgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJvbSwKKwkgICAgIGNvbnN0IGludGVybl90eXBlKiBfX2Zyb21fZW5kLCBjb25zdCBpbnRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAorCSAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwKKwkgICAgIGV4dGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdDsKKworICAgICAgdmlydHVhbCByZXN1bHQKKyAgICAgIGRvX3Vuc2hpZnQoc3RhdGVfdHlwZSYgX19zdGF0ZSwKKwkJIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsCisJCSBleHRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICBkb19pbihzdGF0ZV90eXBlJiBfX3N0YXRlLAorCSAgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbSwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbV9lbmQsCisJICAgICBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAorCSAgICAgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3RvX2VuZCwKKwkgICAgIGludGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdDsKKworICAgICAgdmlydHVhbAorICAgICAgaW50IGRvX2VuY29kaW5nKCkgY29uc3QgdGhyb3coKTsKKworICAgICAgdmlydHVhbAorICAgICAgYm9vbCBkb19hbHdheXNfbm9jb252KCkgY29uc3QgdGhyb3coKTsKKworICAgICAgdmlydHVhbAorICAgICAgaW50IGRvX2xlbmd0aChzdGF0ZV90eXBlJiwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbSwKKwkJICAgIGNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwgc2l6ZV90IF9fbWF4KSBjb25zdDsKKworICAgICAgdmlydHVhbCBpbnQKKyAgICAgIGRvX21heF9sZW5ndGgoKSBjb25zdCB0aHJvdygpOworICAgIH07CisjZW5kaWYgLy9fR0xJQkNYWF9VU0VfV0NIQVJfVAorCisgIC8vLyBjbGFzcyBjb2RlY3Z0X2J5bmFtZSBbMjIuMi4xLjZdLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZXJuVCwgdHlwZW5hbWUgX0V4dGVyblQsIHR5cGVuYW1lIF9TdGF0ZVQ+CisgICAgY2xhc3MgY29kZWN2dF9ieW5hbWUgOiBwdWJsaWMgY29kZWN2dDxfSW50ZXJuVCwgX0V4dGVyblQsIF9TdGF0ZVQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0CisgICAgICBjb2RlY3Z0X2J5bmFtZShjb25zdCBjaGFyKiBfX3MsIHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiBjb2RlY3Z0PF9JbnRlcm5ULCBfRXh0ZXJuVCwgX1N0YXRlVD4oX19yZWZzKQorICAgICAgeworCWlmIChfX2J1aWx0aW5fc3RyY21wKF9fcywgIkMiKSAhPSAwCisJICAgICYmIF9fYnVpbHRpbl9zdHJjbXAoX19zLCAiUE9TSVgiKSAhPSAwKQorCSAgeworCSAgICB0aGlzLT5fU19kZXN0cm95X2NfbG9jYWxlKHRoaXMtPl9NX2NfbG9jYWxlX2NvZGVjdnQpOworCSAgICB0aGlzLT5fU19jcmVhdGVfY19sb2NhbGUodGhpcy0+X01fY19sb2NhbGVfY29kZWN2dCwgX19zKTsKKwkgIH0KKyAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5jb2RlY3Z0X2J5bmFtZSgpIHsgfQorICAgIH07CisKKyAgLy8gSW5oaWJpdCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBmb3IgcmVxdWlyZWQgaW5zdGFudGlhdGlvbnMsCisgIC8vIHdoaWNoIGFyZSBkZWZpbmVkIHZpYSBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBlbHNld2hlcmUuCisjaWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBjb2RlY3Z0X2J5bmFtZTxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+OworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IGNvZGVjdnQ8Y2hhciwgY2hhciwgbWJzdGF0ZV90PiYKKyAgICB1c2VfZmFjZXQ8Y29kZWN2dDxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxjb2RlY3Z0PGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4gPihjb25zdCBsb2NhbGUmKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBjb2RlY3Z0X2J5bmFtZTx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+OworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IGNvZGVjdnQ8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PiYKKyAgICB1c2VfZmFjZXQ8Y29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4gPihjb25zdCBsb2NhbGUmKTsKKyNlbmRpZgorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBfQ09ERUNWVF9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvY29uY2VwdF9jaGVjay5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2NvbmNlcHRfY2hlY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODlmZDZhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2NvbmNlcHRfY2hlY2suaApAQCAtMCwwICsxLDgwIEBACisvLyBDb25jZXB0LWNoZWNraW5nIGNvbnRyb2wgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvY29uY2VwdF9jaGVjay5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aXRlcmF0b3J9CisgKi8KKworI2lmbmRlZiBfQ09OQ0VQVF9DSEVDS19ICisjZGVmaW5lIF9DT05DRVBUX0NIRUNLX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCisvLyBBbGwgcGxhY2VzIGluIGxpYnN0ZGMrKy12MyB3aGVyZSB0aGVzZSBhcmUgdXNlZCwgb3IgL21pZ2h0LyBiZSB1c2VkLCBvcgorLy8gZG9uJ3QgbmVlZCB0byBiZSB1c2VkLCBvciBwZXJoYXBzIC9zaG91bGQvIGJlIHVzZWQsIGFyZSBjb21tZW50ZWQgd2l0aAorLy8gImNvbmNlcHQgcmVxdWlyZW1lbnRzIiAoYW5kIG1heWJlIHNvbWUgbW9yZSB0ZXh0KS4gIFNvIGdyZXAgbGlrZSBjcmF6eQorLy8gaWYgeW91J3JlIGxvb2tpbmcgZm9yIGFkZGl0aW9uYWwgcGxhY2VzIHRvIHVzZSB0aGVzZS4KKworLy8gQ29uY2VwdC1jaGVja2luZyBjb2RlIGlzIG9mZiBieSBkZWZhdWx0IHVubGVzcyB1c2VycyB0dXJuIGl0IG9uIHZpYQorLy8gY29uZmlndXJlIG9wdGlvbnMgb3IgZWRpdGluZyBjKytjb25maWcuaC4KKworI2lmbmRlZiBfR0xJQkNYWF9DT05DRVBUX0NIRUNLUworCisjZGVmaW5lIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyguLi4pCisjZGVmaW5lIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfYSxfYikKKyNkZWZpbmUgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMihfYSxfYixfYykKKyNkZWZpbmUgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMyhfYSxfYixfYyxfZCkKKyNkZWZpbmUgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzNChfYSxfYixfYyxfZCxfZSkKKworI2Vsc2UgLy8gdGhlIGNoZWNrcyBhcmUgb24KKworI2luY2x1ZGUgPGJpdHMvYm9vc3RfY29uY2VwdF9jaGVjay5oPgorCisvLyBOb3RlIHRoYXQgdGhlIG9idmlvdXMgYW5kIGVsZWdhbnQgYXBwcm9hY2ggb2YKKy8vCisvLyNkZWZpbmUgZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhDKSBkZWJ1Zzo6ZnVuY3Rpb25fcmVxdWlyZXM8IGRlYnVnOjpDID4oKQorLy8KKy8vIHdvbid0IHdvcmsgZHVlIHRvIGNvbmNlcHQgdGVtcGxhdGVzIHdpdGggbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIsIGUuZy4sCisvLyBCaW5hcnlQcmVkaWNhdGVDb25jZXB0LiAgVGhlIHByZXByb2Nlc3NvciB0cmllcyB0byBzcGxpdCB0aGluZ3MgdXAgb24KKy8vIHRoZSBjb21tYXMgaW4gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QuICBXZSBjYW4ndCB1c2UgYW4gaW5uZXIgcGFpciBvZgorLy8gcGFyZW50aGVzaXMgdG8gaGlkZSB0aGUgY29tbWFzLCBiZWNhdXNlICJkZWJ1Zzo6KFRlbXA8Rm9vLEJhcj4pIiBpc24ndAorLy8gYSB2YWxpZCBpbnN0YW50aWF0aW9uIHBhdHRlcm4uICBUaHVzLCB3ZSBzdGVhbCBhIGZlYXR1cmUgZnJvbSBDOTkuCisKKyNkZWZpbmUgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX2dudV9jeHg6Ol9fZnVuY3Rpb25fcmVxdWlyZXM8IF9fZ251X2N4eDo6X19WQV9BUkdTX18gPigpOworI2RlZmluZSBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX2EsX0MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9HTElCQ1hYX0NMQVNTX1JFUVVJUkVTKF9hLCBfX2dudV9jeHgsIF9DKTsKKyNkZWZpbmUgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMihfYSxfYixfQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfR0xJQkNYWF9DTEFTU19SRVFVSVJFUzIoX2EsIF9iLCBfX2dudV9jeHgsIF9DKTsKKyNkZWZpbmUgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMyhfYSxfYixfYyxfQykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfR0xJQkNYWF9DTEFTU19SRVFVSVJFUzMoX2EsIF9iLCBfYywgX19nbnVfY3h4LCBfQyk7CisjZGVmaW5lIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczQoX2EsX2IsX2MsX2QsX0MpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX0dMSUJDWFhfQ0xBU1NfUkVRVUlSRVM0KF9hLCBfYiwgX2MsIF9kLCBfX2dudV9jeHgsIF9DKTsKKworI2VuZGlmIC8vIGVuYWJsZS9kaXNhYmxlCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9DT05DRVBUX0NIRUNLCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvY3BwX3R5cGVfdHJhaXRzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvY3BwX3R5cGVfdHJhaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMwM2M5OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9jcHBfdHlwZV90cmFpdHMuaApAQCAtMCwwICsxLDQyNCBAQAorLy8gVGhlICAtKi0gQysrIC0qLSB0eXBlIHRyYWl0cyBjbGFzc2VzIGZvciBpbnRlcm5hbCB1c2UgaW4gbGlic3RkYysrCisKKy8vIENvcHlyaWdodCAoQykgMjAwMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2NwcF90eXBlX3RyYWl0cy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZXh0L3R5cGVfdHJhaXRzfQorICovCisKKy8vIFdyaXR0ZW4gYnkgR2FicmllbCBEb3MgUmVpcyA8ZG9zcmVpc0BjbWxhLmVucy1jYWNoYW4uZnI+CisKKyNpZm5kZWYgX0NQUF9UWVBFX1RSQUlUU19ICisjZGVmaW5lIF9DUFBfVFlQRV9UUkFJVFNfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgc29tZSBjb21waWxlLXRpbWUgaW5mb3JtYXRpb24gYWJvdXQgdmFyaW91cyB0eXBlcy4KKy8vIFRoZXNlIHJlcHJlc2VudGF0aW9ucyB3ZXJlIGRlc2lnbmVkLCBvbiBwdXJwb3NlLCB0byBiZSBjb25zdGFudC1leHByZXNzaW9ucworLy8gYW5kIG5vdCB0eXBlcyBhcyBmb3VuZCBpbiA8Yml0cy90eXBlX3RyYWl0cy5oPi4gIEluIHBhcnRpY3VsYXIsIHRoZXkKKy8vIGNhbiBiZSB1c2VkIGluIGNvbnRyb2wgc3RydWN0dXJlcyBhbmQgdGhlIG9wdGltaXplciBob3BlZnVsbHkgd2lsbCBkbworLy8gdGhlIG9idmlvdXMgdGhpbmcuCisvLworLy8gV2h5IGludGVncmFsIGV4cHJlc3Npb25zLCBhbmQgbm90IGZ1bmN0aW9ucyBub3IgdHlwZXM/CisvLyBGaXJzdGx5LCB0aGVzZSBjb21waWxlLXRpbWUgZW50aXRpZXMgYXJlIHVzZWQgYXMgdGVtcGxhdGUtYXJndW1lbnRzCisvLyBzbyBmdW5jdGlvbiByZXR1cm4gdmFsdWVzIHdvbid0IHdvcms6ICBXZSBuZWVkIGNvbXBpbGUtdGltZSBlbnRpdGllcy4KKy8vIFdlJ3JlIGxlZnQgd2l0aCB0eXBlcyBhbmQgY29uc3RhbnQgIGludGVncmFsIGV4cHJlc3Npb25zLgorLy8gU2Vjb25kbHksIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgZWFzZSBvZiB1c2UsIHR5cGUtYmFzZWQgY29tcGlsZS10aW1lCisvLyBpbmZvcm1hdGlvbiBpcyAtbm90LSAqdGhhdCogY29udmVuaWVudC4gIE9uIGhhcyB0byB3cml0ZSBsb3RzIG9mCisvLyBvdmVybG9hZGVkIGZ1bmN0aW9ucyBhbmQgdG8gaG9wZSB0aGF0IHRoZSBjb21waWxlciB3aWxsIHNlbGVjdCB0aGUgcmlnaHQKKy8vIG9uZS4gQXMgYSBuZXQgZWZmZWN0LCB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgaXNuJ3QgdmVyeSBjbGVhciBhdCBmaXJzdAorLy8gZ2xhbmNlLgorLy8gVGhpcmRseSwgcGFydGlhbCBvcmRlcmluZyBhbmQgb3ZlcmxvYWQgcmVzb2x1dGlvbiAob2YgZnVuY3Rpb24gdGVtcGxhdGVzKQorLy8gaXMgaGlnaGx5IGNvc3RseSBpbiB0ZXJtcyBvZiBjb21waWxlci1yZXNvdXJjZS4gIEl0IGlzIGEgR29vZCBUaGluZyB0bworLy8ga2VlcCB0aGVzZSByZXNvdXJjZSBjb25zdW1wdGlvbiBhcyBsZWFzdCBhcyBwb3NzaWJsZS4KKy8vCisvLyBTZWUgdmFsYXJyYXlfYXJyYXkuaCBmb3IgYSBjYXNlIHVzZS4KKy8vCisvLyAtLSBHYWJ5IChkb3NyZWlzQGNtbGEuZW5zLWNhY2hhbi5mcikgMjAwMC0wMy0wNi4KKy8vCisvLyBVcGRhdGUgMjAwNTogdHlwZXMgYXJlIGFsc28gcHJvdmlkZWQgYW5kIDxiaXRzL3R5cGVfdHJhaXRzLmg+IGhhcyBiZWVuCisvLyByZW1vdmVkLgorLy8KKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBoYWNrLCBzaG91bGQgcmVhbGx5IGluY2x1ZGUgdGhpcyBmcm9tIHNvbWV3aGVyZS4KK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgY2xhc3MgX19ub3JtYWxfaXRlcmF0b3I7CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHN0cnVjdCBfX3RydWVfdHlwZSB7IH07CisgIHN0cnVjdCBfX2ZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPGJvb2w+CisgICAgc3RydWN0IF9fdHJ1dGhfdHlwZQorICAgIHsgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX190cnV0aF90eXBlPHRydWU+CisgICAgeyB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsgfTsKKworICAvLyBOLkIuIFRoZSBjb252ZXJzaW9ucyB0byBib29sIGFyZSBuZWVkZWQgZHVlIHRvIHRoZSBpc3N1ZQorICAvLyBleHBsYWluZWQgaW4gYysrLzE5NDA0LgorICB0ZW1wbGF0ZTxjbGFzcyBfU3AsIGNsYXNzIF9UcD4KKyAgICBzdHJ1Y3QgX190cmFpdG9yCisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSBib29sKF9TcDo6X192YWx1ZSkgfHwgYm9vbChfVHA6Ol9fdmFsdWUpIH07CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJ1dGhfdHlwZTxfX3ZhbHVlPjo6X190eXBlIF9fdHlwZTsKKyAgICB9OworCisgIC8vIENvbXBhcmUgZm9yIGVxdWFsaXR5IG9mIHR5cGVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+CisgICAgc3RydWN0IF9fYXJlX3NhbWUKKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDAgfTsKKyAgICAgIHR5cGVkZWYgX19mYWxzZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hcmVfc2FtZTxfVHAsIF9UcD4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgLy8gSG9sZHMgaWYgdGhlIHRlbXBsYXRlLWFyZ3VtZW50IGlzIGEgdm9pZCB0eXBlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfdm9pZAorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMCB9OworICAgICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX3ZvaWQ8dm9pZD4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgLy8KKyAgLy8gSW50ZWdlciB0eXBlcworICAvLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfaW50ZWdlcgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMCB9OworICAgICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgLy8gVGhpcnRlZW4gc3BlY2lhbGl6YXRpb25zICh5ZXMgdGhlcmUgYXJlIGVsZXZlbiBzdGFuZGFyZCBpbnRlZ2VyCisgIC8vIHR5cGVzOyA8ZW0+bG9uZyBsb25nPC9lbT4gYW5kIDxlbT51bnNpZ25lZCBsb25nIGxvbmc8L2VtPiBhcmUKKyAgLy8gc3VwcG9ydGVkIGFzIGV4dGVuc2lvbnMpCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyPGJvb2w+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyPGNoYXI+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyPHNpZ25lZCBjaGFyPgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfaW50ZWdlcjx1bnNpZ25lZCBjaGFyPgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworIyBpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfaW50ZWdlcjx3Y2hhcl90PgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKyMgZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVnZXI8Y2hhcjE2X3Q+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyPGNoYXIzMl90PgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKyNlbmRpZgorCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyPHNob3J0PgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfaW50ZWdlcjx1bnNpZ25lZCBzaG9ydD4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVnZXI8aW50PgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfaW50ZWdlcjx1bnNpZ25lZCBpbnQ+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyPGxvbmc+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyPHVuc2lnbmVkIGxvbmc+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyPGxvbmcgbG9uZz4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVnZXI8dW5zaWduZWQgbG9uZyBsb25nPgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICAvLworICAvLyBGbG9hdGluZyBwb2ludCB0eXBlcworICAvLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfZmxvYXRpbmcKKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDAgfTsKKyAgICAgIHR5cGVkZWYgX19mYWxzZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIC8vIHRocmVlIHNwZWNpYWxpemF0aW9ucyAoZmxvYXQsIGRvdWJsZSBhbmQgJ2xvbmcgZG91YmxlJykKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2Zsb2F0aW5nPGZsb2F0PgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfZmxvYXRpbmc8ZG91YmxlPgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfZmxvYXRpbmc8bG9uZyBkb3VibGU+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIC8vCisgIC8vIFBvaW50ZXIgdHlwZXMKKyAgLy8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX3BvaW50ZXIKKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDAgfTsKKyAgICAgIHR5cGVkZWYgX19mYWxzZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19wb2ludGVyPF9UcCo+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIC8vCisgIC8vIE5vcm1hbCBpdGVyYXRvciB0eXBlCisgIC8vCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19ub3JtYWxfaXRlcmF0b3IKKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDAgfTsKKyAgICAgIHR5cGVkZWYgX19mYWxzZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBzdHJ1Y3QgX19pc19ub3JtYWxfaXRlcmF0b3I8IF9fZ251X2N4eDo6X19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLAorCQkJCQkJCSAgICAgIF9Db250YWluZXI+ID4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgLy8KKyAgLy8gQW4gYXJpdGhtZXRpYyB0eXBlIGlzIGFuIGludGVnZXIgdHlwZSBvciBhIGZsb2F0aW5nIHBvaW50IHR5cGUKKyAgLy8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2FyaXRobWV0aWMKKyAgICA6IHB1YmxpYyBfX3RyYWl0b3I8X19pc19pbnRlZ2VyPF9UcD4sIF9faXNfZmxvYXRpbmc8X1RwPiA+CisgICAgeyB9OworCisgIC8vCisgIC8vIEEgZnVuZGFtZW50YWwgdHlwZSBpcyBgdm9pZCcgb3IgYW5kIGFyaXRobWV0aWMgdHlwZQorICAvLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfZnVuZGFtZW50YWwKKyAgICA6IHB1YmxpYyBfX3RyYWl0b3I8X19pc192b2lkPF9UcD4sIF9faXNfYXJpdGhtZXRpYzxfVHA+ID4KKyAgICB7IH07CisKKyAgLy8KKyAgLy8gQSBzY2FsYXIgdHlwZSBpcyBhbiBhcml0aG1ldGljIHR5cGUgb3IgYSBwb2ludGVyIHR5cGUKKyAgLy8gCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19zY2FsYXIKKyAgICA6IHB1YmxpYyBfX3RyYWl0b3I8X19pc19hcml0aG1ldGljPF9UcD4sIF9faXNfcG9pbnRlcjxfVHA+ID4KKyAgICB7IH07CisKKyAgLy8KKyAgLy8gRm9yIHVzZSBpbiBzdGQ6OmNvcHkgYW5kIHN0ZDo6ZmluZCBvdmVybG9hZHMgZm9yIHN0cmVhbWJ1ZiBpdGVyYXRvcnMuCisgIC8vCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19jaGFyCisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAwIH07CisgICAgICB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfY2hhcjxjaGFyPgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19jaGFyPHdjaGFyX3Q+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2J5dGUKKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDAgfTsKKyAgICAgIHR5cGVkZWYgX19mYWxzZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19ieXRlPGNoYXI+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19ieXRlPHNpZ25lZCBjaGFyPgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfYnl0ZTx1bnNpZ25lZCBjaGFyPgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICAvLworICAvLyBNb3ZlIGl0ZXJhdG9yIHR5cGUKKyAgLy8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX21vdmVfaXRlcmF0b3IKKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDAgfTsKKyAgICAgIHR5cGVkZWYgX19mYWxzZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgY2xhc3MgbW92ZV9pdGVyYXRvcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgc3RydWN0IF9faXNfbW92ZV9pdGVyYXRvcjwgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+ID4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy9fQ1BQX1RZUEVfVFJBSVRTX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9jeHhhYmlfZm9yY2VkLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvY3h4YWJpX2ZvcmNlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYTY1ODEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvY3h4YWJpX2ZvcmNlZC5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vIGN4eGFiaS5oIHN1YnNldCBmb3IgY2FuY2VsbGF0aW9uIC0qLSBDKysgLSotCisgIAorLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorLy8KKy8vIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisvLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLyAKKy8vIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyAKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2N4eGFiaV9mb3JjZWQuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2N4eGFiaS5ofQorICovCisKKyNpZm5kZWYgX0NYWEFCSV9GT1JDRURfSAorI2RlZmluZSBfQ1hYQUJJX0ZPUkNFRF9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHB1c2goZGVmYXVsdCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCituYW1lc3BhY2UgX19jeHhhYml2MQoreyAgCisgIC8qKiAKKyAgICogIEBicmllZiBUaHJvd24gYXMgcGFydCBvZiBmb3JjZWQgdW53aW5kaW5nLgorICAgKiAgQGluZ3JvdXAgZXhjZXB0aW9ucworICAgKgorICAgKiAgQSBtYWdpYyBwbGFjZWhvbGRlciBjbGFzcyB0aGF0IGNhbiBiZSBjYXVnaHQgYnkgcmVmZXJlbmNlIHRvCisgICAqICByZWNvZ25pemUgZm9yY2VkIHVud2luZGluZy4KKyAgICovCisgIGNsYXNzIF9fZm9yY2VkX3Vud2luZAorICB7CisgICAgdmlydHVhbCB+X19mb3JjZWRfdW53aW5kKCkgdGhyb3coKTsKKworICAgIC8vIFByZXZlbnQgY2F0Y2ggYnkgdmFsdWUuCisgICAgdmlydHVhbCB2b2lkIF9fcHVyZV9kdW1teSgpID0gMDsgCisgIH07Cit9CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwb3AKKworI2VuZGlmIC8vIF9fQ1hYQUJJX0ZPUkNFRF9IIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2RlcXVlLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9kZXF1ZS50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODljNWVmNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9kZXF1ZS50Y2MKQEAgLTAsMCArMSwxMDY4IEBACisvLyBEZXF1ZSBpbXBsZW1lbnRhdGlvbiAob3V0IG9mIGxpbmUpIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9kZXF1ZS50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtkZXF1ZX0KKyAqLworCisjaWZuZGVmIF9ERVFVRV9UQ0MKKyNkZWZpbmUgX0RFUVVFX1RDQyAxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgX01fZGVmYXVsdF9pbml0aWFsaXplKCkKKyAgICB7CisgICAgICBfTWFwX3BvaW50ZXIgX19jdXI7CisgICAgICBfX3RyeQorICAgICAgICB7CisgICAgICAgICAgZm9yIChfX2N1ciA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZTsKKwkgICAgICAgX19jdXIgPCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlOworCSAgICAgICArK19fY3VyKQorICAgICAgICAgICAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9hKCpfX2N1ciwgKl9fY3VyICsgX1NfYnVmZmVyX3NpemUoKSwKKwkJCQkJICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKyAgICAgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9kZWZhdWx0X2EodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fZmlyc3QsCisJCQkJCSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9jdXIsCisJCQkJCSBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworICAgICAgICB9CisgICAgICBfX2NhdGNoKC4uLikKKyAgICAgICAgeworICAgICAgICAgIHN0ZDo6X0Rlc3Ryb3kodGhpcy0+X01faW1wbC5fTV9zdGFydCwgaXRlcmF0b3IoKl9fY3VyLCBfX2N1ciksCisJCQlfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworICAgICAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGRlcXVlPF9UcCwgX0FsbG9jPiYKKyAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgIG9wZXJhdG9yPShjb25zdCBkZXF1ZSYgX194KQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKTsKKyAgICAgIGlmICgmX194ICE9IHRoaXMpCisJeworCSAgaWYgKF9fbGVuID49IF9feC5zaXplKCkpCisJICAgIF9NX2VyYXNlX2F0X2VuZChzdGQ6OmNvcHkoX194LmJlZ2luKCksIF9feC5lbmQoKSwKKwkJCQkgICAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb25zdF9pdGVyYXRvciBfX21pZCA9IF9feC5iZWdpbigpICsgZGlmZmVyZW5jZV90eXBlKF9fbGVuKTsKKwkgICAgICBzdGQ6OmNvcHkoX194LmJlZ2luKCksIF9fbWlkLCB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsKKwkgICAgICBpbnNlcnQodGhpcy0+X01faW1wbC5fTV9maW5pc2gsIF9fbWlkLCBfX3guZW5kKCkpOworCSAgICB9CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICB2b2lkCisgICAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgICAgZW1wbGFjZV9mcm9udChfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIHsKKwlpZiAodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIgIT0gdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9maXJzdCkKKwkgIHsKKwkgICAgdGhpcy0+X01faW1wbC5jb25zdHJ1Y3QodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIgLSAxLAorCQkJCSAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgICAtLXRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyOworCSAgfQorCWVsc2UKKwkgIF9NX3B1c2hfZnJvbnRfYXV4KHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICB2b2lkCisgICAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgICAgZW1wbGFjZV9iYWNrKF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgeworCWlmICh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9jdXIKKwkgICAgIT0gdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fbGFzdCAtIDEpCisJICB7CisJICAgIHRoaXMtPl9NX2ltcGwuY29uc3RydWN0KHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2N1ciwKKwkJCQkgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgICAgKyt0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9jdXI7CisJICB9CisJZWxzZQorCSAgX01fcHVzaF9iYWNrX2F1eChzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgICAgfQorI2VuZGlmCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGRlcXVlPF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgeworICAgICAgaWYgKF9fcG9zaXRpb24uX01fY3VyID09IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyKQorCXsKKwkgIHB1c2hfZnJvbnQoX194KTsKKwkgIHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0OworCX0KKyAgICAgIGVsc2UgaWYgKF9fcG9zaXRpb24uX01fY3VyID09IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2N1cikKKwl7CisJICBwdXNoX2JhY2soX194KTsKKwkgIGl0ZXJhdG9yIF9fdG1wID0gdGhpcy0+X01faW1wbC5fTV9maW5pc2g7CisJICAtLV9fdG1wOworCSAgcmV0dXJuIF9fdG1wOworCX0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9NX2luc2VydF9hdXgoX19wb3NpdGlvbiwgX194KTsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgdHlwZW5hbWUgZGVxdWU8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorICAgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICAgIGVtcGxhY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICB7CisJaWYgKF9fcG9zaXRpb24uX01fY3VyID09IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyKQorCSAgeworCSAgICBlbXBsYWNlX2Zyb250KHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICAgIHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0OworCSAgfQorCWVsc2UgaWYgKF9fcG9zaXRpb24uX01fY3VyID09IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2N1cikKKwkgIHsKKwkgICAgZW1wbGFjZV9iYWNrKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICAgIGl0ZXJhdG9yIF9fdG1wID0gdGhpcy0+X01faW1wbC5fTV9maW5pc2g7CisJICAgIC0tX190bXA7CisJICAgIHJldHVybiBfX3RtcDsKKwkgIH0KKwllbHNlCisJICByZXR1cm4gX01faW5zZXJ0X2F1eChfX3Bvc2l0aW9uLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgICAgfQorI2VuZGlmCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGRlcXVlPF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgeworICAgICAgaXRlcmF0b3IgX19uZXh0ID0gX19wb3NpdGlvbjsKKyAgICAgICsrX19uZXh0OworICAgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9faW5kZXggPSBfX3Bvc2l0aW9uIC0gYmVnaW4oKTsKKyAgICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9faW5kZXgpIDwgKHNpemUoKSA+PiAxKSkKKwl7CisJICBpZiAoX19wb3NpdGlvbiAhPSBiZWdpbigpKQorCSAgICBfR0xJQkNYWF9NT1ZFX0JBQ0tXQVJEMyhiZWdpbigpLCBfX3Bvc2l0aW9uLCBfX25leHQpOworCSAgcG9wX2Zyb250KCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChfX25leHQgIT0gZW5kKCkpCisJICAgIF9HTElCQ1hYX01PVkUzKF9fbmV4dCwgZW5kKCksIF9fcG9zaXRpb24pOworCSAgcG9wX2JhY2soKTsKKwl9CisgICAgICByZXR1cm4gYmVnaW4oKSArIF9faW5kZXg7CisgICAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBkZXF1ZTxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX2ZpcnN0OworICAgICAgZWxzZSBpZiAoX19maXJzdCA9PSBiZWdpbigpICYmIF9fbGFzdCA9PSBlbmQoKSkKKwl7CisJICBjbGVhcigpOworCSAgcmV0dXJuIGVuZCgpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19uID0gX19sYXN0IC0gX19maXJzdDsKKwkgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zX2JlZm9yZSA9IF9fZmlyc3QgLSBiZWdpbigpOworCSAgaWYgKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19lbGVtc19iZWZvcmUpIDw9IChzaXplKCkgLSBfX24pIC8gMikKKwkgICAgeworCSAgICAgIGlmIChfX2ZpcnN0ICE9IGJlZ2luKCkpCisJCV9HTElCQ1hYX01PVkVfQkFDS1dBUkQzKGJlZ2luKCksIF9fZmlyc3QsIF9fbGFzdCk7CisJICAgICAgX01fZXJhc2VfYXRfYmVnaW4oYmVnaW4oKSArIF9fbik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChfX2xhc3QgIT0gZW5kKCkpCisJCV9HTElCQ1hYX01PVkUzKF9fbGFzdCwgZW5kKCksIF9fZmlyc3QpOworCSAgICAgIF9NX2VyYXNlX2F0X2VuZChlbmQoKSAtIF9fbik7CisJICAgIH0KKwkgIHJldHVybiBiZWdpbigpICsgX19lbGVtc19iZWZvcmU7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX2Fzc2lnbl9hdXgoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgICAgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpCisgICAgICB7CisgICAgICAgIGl0ZXJhdG9yIF9fY3VyID0gYmVnaW4oKTsKKyAgICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0ICYmIF9fY3VyICE9IGVuZCgpOyArK19fY3VyLCArK19fZmlyc3QpCisgICAgICAgICAgKl9fY3VyID0gKl9fZmlyc3Q7CisgICAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgICAgICBfTV9lcmFzZV9hdF9lbmQoX19jdXIpOworICAgICAgICBlbHNlCisgICAgICAgICAgaW5zZXJ0KGVuZCgpLCBfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9maWxsX2luc2VydChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgIHsKKyAgICAgIGlmIChfX3Bvcy5fTV9jdXIgPT0gdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIpCisJeworCSAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2Zyb250KF9fbik7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZmlsbF9hKF9fbmV3X3N0YXJ0LCB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJCQkgIF9feCwgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkgICAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgX01fZGVzdHJveV9ub2RlcyhfX25ld19zdGFydC5fTV9ub2RlLAorCQkJICAgICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZSk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChfX3Bvcy5fTV9jdXIgPT0gdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyKQorCXsKKwkgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhfX24pOworCSAgX190cnkKKwkgICAgeworCSAgICAgIHN0ZDo6X191bmluaXRpYWxpemVkX2ZpbGxfYSh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJICBfX25ld19maW5pc2gsIF9feCwKKwkJCQkJICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gX19uZXdfZmluaXNoOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIF9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fbm9kZSArIDEsCisJCQkgICAgICAgX19uZXdfZmluaXNoLl9NX25vZGUgKyAxKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKyAgICAgICAgX01faW5zZXJ0X2F1eChfX3BvcywgX19uLCBfX3gpOworICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgIF9NX2RlZmF1bHRfYXBwZW5kKHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgaWYgKF9fbikKKwl7CisJICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2JhY2soX19uKTsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9kZWZhdWx0X2EodGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCSAgICAgX19uZXdfZmluaXNoLAorCQkJCQkgICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgX01fZGVzdHJveV9ub2Rlcyh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwKKwkJCSAgICAgICBfX25ld19maW5pc2guX01fbm9kZSArIDEpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYm9vbAorICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgX01fc2hyaW5rX3RvX2ZpdCgpCisgICAgeworICAgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZnJvbnRfY2FwYWNpdHkKKwk9ICh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2N1ciAtIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fZmlyc3QpOworICAgICAgaWYgKF9fZnJvbnRfY2FwYWNpdHkgPT0gMCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2JhY2tfY2FwYWNpdHkKKwk9ICh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9sYXN0IC0gdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyKTsKKyAgICAgIGlmIChfX2Zyb250X2NhcGFjaXR5ICsgX19iYWNrX2NhcGFjaXR5IDwgX1NfYnVmZmVyX3NpemUoKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIHJldHVybiBzdGQ6Ol9fc2hyaW5rX3RvX2ZpdF9hdXg8ZGVxdWU+OjpfU19kb19pdCgqdGhpcyk7CisgICAgfQorI2VuZGlmCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgIF9NX2ZpbGxfaW5pdGlhbGl6ZShjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbHVlKQorICAgIHsKKyAgICAgIF9NYXBfcG9pbnRlciBfX2N1cjsKKyAgICAgIF9fdHJ5CisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKF9fY3VyID0gdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlOworCSAgICAgICBfX2N1ciA8IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGU7CisJICAgICAgICsrX19jdXIpCisgICAgICAgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9maWxsX2EoKl9fY3VyLCAqX19jdXIgKyBfU19idWZmZXJfc2l6ZSgpLAorCQkJCQlfX3ZhbHVlLCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworICAgICAgICAgIHN0ZDo6X191bmluaXRpYWxpemVkX2ZpbGxfYSh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9maXJzdCwKKwkJCQkgICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9jdXIsCisJCQkJICAgICAgX192YWx1ZSwgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKyAgICAgICAgfQorICAgICAgX19jYXRjaCguLi4pCisgICAgICAgIHsKKyAgICAgICAgICBzdGQ6Ol9EZXN0cm95KHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsIGl0ZXJhdG9yKCpfX2N1ciwgX19jdXIpLAorCQkJX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKyAgICAgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICAgICAgfQorICAgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX3JhbmdlX2luaXRpYWxpemUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKyAgICAgICAgdGhpcy0+X01faW5pdGlhbGl6ZV9tYXAoMCk7CisgICAgICAgIF9fdHJ5CisgICAgICAgICAgeworICAgICAgICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCSAgICAgIGVtcGxhY2VfYmFjaygqX19maXJzdCk7CisjZWxzZQorICAgICAgICAgICAgICBwdXNoX2JhY2soKl9fZmlyc3QpOworI2VuZGlmCisgICAgICAgICAgfQorICAgICAgICBfX2NhdGNoKC4uLikKKyAgICAgICAgICB7CisgICAgICAgICAgICBjbGVhcigpOworICAgICAgICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgICAgICAgfQorICAgICAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9yYW5nZV9pbml0aWFsaXplKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgICB7CisgICAgICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgIHRoaXMtPl9NX2luaXRpYWxpemVfbWFwKF9fbik7CisKKyAgICAgICAgX01hcF9wb2ludGVyIF9fY3VyX25vZGU7CisgICAgICAgIF9fdHJ5CisgICAgICAgICAgeworICAgICAgICAgICAgZm9yIChfX2N1cl9ub2RlID0gdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlOworICAgICAgICAgICAgICAgICBfX2N1cl9ub2RlIDwgdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fbm9kZTsKKyAgICAgICAgICAgICAgICAgKytfX2N1cl9ub2RlKQorCSAgICAgIHsKKwkJX0ZvcndhcmRJdGVyYXRvciBfX21pZCA9IF9fZmlyc3Q7CisJCXN0ZDo6YWR2YW5jZShfX21pZCwgX1NfYnVmZmVyX3NpemUoKSk7CisJCXN0ZDo6X191bmluaXRpYWxpemVkX2NvcHlfYShfX2ZpcnN0LCBfX21pZCwgKl9fY3VyX25vZGUsCisJCQkJCSAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQlfX2ZpcnN0ID0gX19taWQ7CisJICAgICAgfQorICAgICAgICAgICAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfY29weV9hKF9fZmlyc3QsIF9fbGFzdCwKKwkJCQkJdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fZmlyc3QsCisJCQkJCV9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisgICAgICAgICAgfQorICAgICAgICBfX2NhdGNoKC4uLikKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdGQ6Ol9EZXN0cm95KHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsCisJCQkgIGl0ZXJhdG9yKCpfX2N1cl9ub2RlLCBfX2N1cl9ub2RlKSwKKwkJCSAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKyAgICAgICAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgICAgICAgIH0KKyAgICAgIH0KKworICAvLyBDYWxsZWQgb25seSBpZiBfTV9pbXBsLl9NX2ZpbmlzaC5fTV9jdXIgPT0gX01faW1wbC5fTV9maW5pc2guX01fbGFzdCAtIDEuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHZvaWQKKyAgICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9wdXNoX2JhY2tfYXV4KF9BcmdzJiYuLi4gX19hcmdzKQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9wdXNoX2JhY2tfYXV4KGNvbnN0IHZhbHVlX3R5cGUmIF9fdCkKKyNlbmRpZgorICAgICAgeworCV9NX3Jlc2VydmVfbWFwX2F0X2JhY2soKTsKKwkqKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGUgKyAxKSA9IHRoaXMtPl9NX2FsbG9jYXRlX25vZGUoKTsKKwlfX3RyeQorCSAgeworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKwkgICAgdGhpcy0+X01faW1wbC5jb25zdHJ1Y3QodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyLAorCQkJCSAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworI2Vsc2UKKwkgICAgdGhpcy0+X01faW1wbC5jb25zdHJ1Y3QodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyLCBfX3QpOworI2VuZGlmCisJICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX3NldF9ub2RlKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGUKKwkJCQkJCSsgMSk7CisJICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2N1ciA9IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2ZpcnN0OworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfTV9kZWFsbG9jYXRlX25vZGUoKih0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlICsgMSkpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKyAgICAgIH0KKworICAvLyBDYWxsZWQgb25seSBpZiBfTV9pbXBsLl9NX3N0YXJ0Ll9NX2N1ciA9PSBfTV9pbXBsLl9NX3N0YXJ0Ll9NX2ZpcnN0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICB2b2lkCisgICAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgICAgX01fcHVzaF9mcm9udF9hdXgoX0FyZ3MmJi4uLiBfX2FyZ3MpCisjZWxzZQorICAgICAgdm9pZAorICAgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX3B1c2hfZnJvbnRfYXV4KGNvbnN0IHZhbHVlX3R5cGUmIF9fdCkKKyNlbmRpZgorICAgICAgeworCV9NX3Jlc2VydmVfbWFwX2F0X2Zyb250KCk7CisJKih0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX25vZGUgLSAxKSA9IHRoaXMtPl9NX2FsbG9jYXRlX25vZGUoKTsKKwlfX3RyeQorCSAgeworCSAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX3NldF9ub2RlKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZQorCQkJCQkgICAgICAgLSAxKTsKKwkgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIgPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2xhc3QgLSAxOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKwkgICAgdGhpcy0+X01faW1wbC5jb25zdHJ1Y3QodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIsCisJCQkJICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisjZWxzZQorCSAgICB0aGlzLT5fTV9pbXBsLmNvbnN0cnVjdCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2N1ciwgX190KTsKKyNlbmRpZgorCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICArK3RoaXMtPl9NX2ltcGwuX01fc3RhcnQ7CisJICAgIF9NX2RlYWxsb2NhdGVfbm9kZSgqKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZSAtIDEpKTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisgICAgICB9CisKKyAgLy8gQ2FsbGVkIG9ubHkgaWYgX01faW1wbC5fTV9maW5pc2guX01fY3VyID09IF9NX2ltcGwuX01fZmluaXNoLl9NX2ZpcnN0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZCBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgIF9NX3BvcF9iYWNrX2F1eCgpCisgICAgeworICAgICAgX01fZGVhbGxvY2F0ZV9ub2RlKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2ZpcnN0KTsKKyAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX3NldF9ub2RlKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGUgLSAxKTsKKyAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2N1ciA9IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2xhc3QgLSAxOworICAgICAgdGhpcy0+X01faW1wbC5kZXN0cm95KHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2N1cik7CisgICAgfQorCisgIC8vIENhbGxlZCBvbmx5IGlmIF9NX2ltcGwuX01fc3RhcnQuX01fY3VyID09IF9NX2ltcGwuX01fc3RhcnQuX01fbGFzdCAtIDEuCisgIC8vIE5vdGUgdGhhdCBpZiB0aGUgZGVxdWUgaGFzIGF0IGxlYXN0IG9uZSBlbGVtZW50IChhIHByZWNvbmRpdGlvbiBmb3IgdGhpcworICAvLyBtZW1iZXIgZnVuY3Rpb24pLCBhbmQgaWYKKyAgLy8gICBfTV9pbXBsLl9NX3N0YXJ0Ll9NX2N1ciA9PSBfTV9pbXBsLl9NX3N0YXJ0Ll9NX2xhc3QsCisgIC8vIHRoZW4gdGhlIGRlcXVlIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gbm9kZXMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgX01fcG9wX2Zyb250X2F1eCgpCisgICAgeworICAgICAgdGhpcy0+X01faW1wbC5kZXN0cm95KHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyKTsKKyAgICAgIF9NX2RlYWxsb2NhdGVfbm9kZSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2ZpcnN0KTsKKyAgICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fc2V0X25vZGUodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlICsgMSk7CisgICAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2N1ciA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fZmlyc3Q7CisgICAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgICAgX01fcmFuZ2VfaW5zZXJ0X2F1eChpdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICAgIHsgc3RkOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgc3RkOjppbnNlcnRlcigqdGhpcywgX19wb3MpKTsgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9yYW5nZV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgICAgeworICAgICAgICBjb25zdCBzaXplX3R5cGUgX19uID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICBpZiAoX19wb3MuX01fY3VyID09IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyKQorCSAgeworCSAgICBpdGVyYXRvciBfX25ld19zdGFydCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfZnJvbnQoX19uKTsKKwkgICAgX190cnkKKwkgICAgICB7CisJCXN0ZDo6X191bmluaXRpYWxpemVkX2NvcHlfYShfX2ZpcnN0LCBfX2xhc3QsIF9fbmV3X3N0YXJ0LAorCQkJCQkgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworCSAgICAgIH0KKwkgICAgX19jYXRjaCguLi4pCisJICAgICAgeworCQlfTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsCisJCQkJIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZSk7CisJCV9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICAgIH0KKwkgIH0KKyAgICAgICAgZWxzZSBpZiAoX19wb3MuX01fY3VyID09IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2N1cikKKwkgIHsKKwkgICAgaXRlcmF0b3IgX19uZXdfZmluaXNoID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9iYWNrKF9fbik7CisJICAgIF9fdHJ5CisJICAgICAgeworCQlzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5X2EoX19maXJzdCwgX19sYXN0LAorCQkJCQkgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCSAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQl0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKwkgICAgICB9CisJICAgIF9fY2F0Y2goLi4uKQorCSAgICAgIHsKKwkJX01fZGVzdHJveV9ub2Rlcyh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwKKwkJCQkgX19uZXdfZmluaXNoLl9NX25vZGUgKyAxKTsKKwkJX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgICAgfQorCSAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgX01faW5zZXJ0X2F1eChfX3BvcywgX19maXJzdCwgX19sYXN0LCBfX24pOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHR5cGVuYW1lIGRlcXVlPF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIHsKKwl2YWx1ZV90eXBlIF9feF9jb3B5KHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IC8vIFhYWCBjb3B5CisjZWxzZQorICAgIHR5cGVuYW1lIGRlcXVlPF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7CisJdmFsdWVfdHlwZSBfX3hfY29weSA9IF9feDsgLy8gWFhYIGNvcHkKKyNlbmRpZgorCWRpZmZlcmVuY2VfdHlwZSBfX2luZGV4ID0gX19wb3MgLSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0OworCWlmIChzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9faW5kZXgpIDwgc2l6ZSgpIC8gMikKKwkgIHsKKwkgICAgcHVzaF9mcm9udChfR0xJQkNYWF9NT1ZFKGZyb250KCkpKTsKKwkgICAgaXRlcmF0b3IgX19mcm9udDEgPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0OworCSAgICArK19fZnJvbnQxOworCSAgICBpdGVyYXRvciBfX2Zyb250MiA9IF9fZnJvbnQxOworCSAgICArK19fZnJvbnQyOworCSAgICBfX3BvcyA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX2luZGV4OworCSAgICBpdGVyYXRvciBfX3BvczEgPSBfX3BvczsKKwkgICAgKytfX3BvczE7CisJICAgIF9HTElCQ1hYX01PVkUzKF9fZnJvbnQyLCBfX3BvczEsIF9fZnJvbnQxKTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIHB1c2hfYmFjayhfR0xJQkNYWF9NT1ZFKGJhY2soKSkpOworCSAgICBpdGVyYXRvciBfX2JhY2sxID0gdGhpcy0+X01faW1wbC5fTV9maW5pc2g7CisJICAgIC0tX19iYWNrMTsKKwkgICAgaXRlcmF0b3IgX19iYWNrMiA9IF9fYmFjazE7CisJICAgIC0tX19iYWNrMjsKKwkgICAgX19wb3MgPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgX19pbmRleDsKKwkgICAgX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoX19wb3MsIF9fYmFjazIsIF9fYmFjazEpOworCSAgfQorCSpfX3BvcyA9IF9HTElCQ1hYX01PVkUoX194X2NvcHkpOworCXJldHVybiBfX3BvczsKKyAgICAgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgX01faW5zZXJ0X2F1eChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgIHsKKyAgICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zX2JlZm9yZSA9IF9fcG9zIC0gdGhpcy0+X01faW1wbC5fTV9zdGFydDsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbmd0aCA9IHRoaXMtPnNpemUoKTsKKyAgICAgIHZhbHVlX3R5cGUgX194X2NvcHkgPSBfX3g7CisgICAgICBpZiAoX19lbGVtc19iZWZvcmUgPCBkaWZmZXJlbmNlX3R5cGUoX19sZW5ndGggLyAyKSkKKwl7CisJICBpdGVyYXRvciBfX25ld19zdGFydCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfZnJvbnQoX19uKTsKKwkgIGl0ZXJhdG9yIF9fb2xkX3N0YXJ0ID0gdGhpcy0+X01faW1wbC5fTV9zdGFydDsKKwkgIF9fcG9zID0gdGhpcy0+X01faW1wbC5fTV9zdGFydCArIF9fZWxlbXNfYmVmb3JlOworCSAgX190cnkKKwkgICAgeworCSAgICAgIGlmIChfX2VsZW1zX2JlZm9yZSA+PSBkaWZmZXJlbmNlX3R5cGUoX19uKSkKKwkJeworCQkgIGl0ZXJhdG9yIF9fc3RhcnRfbiA9ICh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0CisJCQkJCSsgZGlmZmVyZW5jZV90eXBlKF9fbikpOworCQkgIHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfYSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJCQkgICAgICBfX3N0YXJ0X24sIF9fbmV3X3N0YXJ0LAorCQkJCQkgICAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX25ld19zdGFydDsKKwkJICBfR0xJQkNYWF9NT1ZFMyhfX3N0YXJ0X24sIF9fcG9zLCBfX29sZF9zdGFydCk7CisJCSAgc3RkOjpmaWxsKF9fcG9zIC0gZGlmZmVyZW5jZV90eXBlKF9fbiksIF9fcG9zLCBfX3hfY29weSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2ZpbGwodGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCQkJCSBfX3BvcywgX19uZXdfc3RhcnQsCisJCQkJCQkgdGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCQkJCSBfX3hfY29weSwKKwkJCQkJCSBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX25ld19zdGFydDsKKwkJICBzdGQ6OmZpbGwoX19vbGRfc3RhcnQsIF9fcG9zLCBfX3hfY29weSk7CisJCX0KKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBfTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsCisJCQkgICAgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2JhY2soX19uKTsKKwkgIGl0ZXJhdG9yIF9fb2xkX2ZpbmlzaCA9IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoOworCSAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNfYWZ0ZXIgPQorCSAgICBkaWZmZXJlbmNlX3R5cGUoX19sZW5ndGgpIC0gX19lbGVtc19iZWZvcmU7CisJICBfX3BvcyA9IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoIC0gX19lbGVtc19hZnRlcjsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBpZiAoX19lbGVtc19hZnRlciA+IGRpZmZlcmVuY2VfdHlwZShfX24pKQorCQl7CisJCSAgaXRlcmF0b3IgX19maW5pc2hfbiA9ICh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaAorCQkJCQkgLSBkaWZmZXJlbmNlX3R5cGUoX19uKSk7CisJCSAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfbW92ZV9hKF9fZmluaXNoX24sCisJCQkJCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkgICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJICAgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKwkJICBfR0xJQkNYWF9NT1ZFX0JBQ0tXQVJEMyhfX3BvcywgX19maW5pc2hfbiwgX19vbGRfZmluaXNoKTsKKwkJICBzdGQ6OmZpbGwoX19wb3MsIF9fcG9zICsgZGlmZmVyZW5jZV90eXBlKF9fbiksIF9feF9jb3B5KTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHN0ZDo6X191bmluaXRpYWxpemVkX2ZpbGxfbW92ZSh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJCSBfX3BvcyArIGRpZmZlcmVuY2VfdHlwZShfX24pLAorCQkJCQkJIF9feF9jb3B5LCBfX3BvcywKKwkJCQkJCSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJCSBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gX19uZXdfZmluaXNoOworCQkgIHN0ZDo6ZmlsbChfX3BvcywgX19vbGRfZmluaXNoLCBfX3hfY29weSk7CisJCX0KKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBfTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGUgKyAxLAorCQkJICAgICAgIF9fbmV3X2ZpbmlzaC5fTV9ub2RlICsgMSk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwl9CisgICAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uKQorICAgICAgeworICAgICAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc2JlZm9yZSA9IF9fcG9zIC0gdGhpcy0+X01faW1wbC5fTV9zdGFydDsKKyAgICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuZ3RoID0gc2l6ZSgpOworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX2VsZW1zYmVmb3JlKSA8IF9fbGVuZ3RoIC8gMikKKwkgIHsKKwkgICAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2Zyb250KF9fbik7CisJICAgIGl0ZXJhdG9yIF9fb2xkX3N0YXJ0ID0gdGhpcy0+X01faW1wbC5fTV9zdGFydDsKKwkgICAgX19wb3MgPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgX19lbGVtc2JlZm9yZTsKKwkgICAgX190cnkKKwkgICAgICB7CisJCWlmIChfX2VsZW1zYmVmb3JlID49IGRpZmZlcmVuY2VfdHlwZShfX24pKQorCQkgIHsKKwkJICAgIGl0ZXJhdG9yIF9fc3RhcnRfbiA9ICh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0CisJCQkJCSAgKyBkaWZmZXJlbmNlX3R5cGUoX19uKSk7CisJCSAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2EodGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCQkJCV9fc3RhcnRfbiwgX19uZXdfc3RhcnQsCisJCQkJCQlfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworCQkgICAgX0dMSUJDWFhfTU9WRTMoX19zdGFydF9uLCBfX3BvcywgX19vbGRfc3RhcnQpOworCQkgICAgc3RkOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3MgLSBkaWZmZXJlbmNlX3R5cGUoX19uKSk7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgX0ZvcndhcmRJdGVyYXRvciBfX21pZCA9IF9fZmlyc3Q7CisJCSAgICBzdGQ6OmFkdmFuY2UoX19taWQsIGRpZmZlcmVuY2VfdHlwZShfX24pIC0gX19lbGVtc2JlZm9yZSk7CisJCSAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2NvcHkodGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCQkJCSAgIF9fcG9zLCBfX2ZpcnN0LCBfX21pZCwKKwkJCQkJCSAgIF9fbmV3X3N0YXJ0LAorCQkJCQkJICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX25ld19zdGFydDsKKwkJICAgIHN0ZDo6Y29weShfX21pZCwgX19sYXN0LCBfX29sZF9zdGFydCk7CisJCSAgfQorCSAgICAgIH0KKwkgICAgX19jYXRjaCguLi4pCisJICAgICAgeworCQlfTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsCisJCQkJIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZSk7CisJCV9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICAgIH0KKwkgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaXRlcmF0b3IgX19uZXdfZmluaXNoID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9iYWNrKF9fbik7CisgICAgICAgICAgaXRlcmF0b3IgX19vbGRfZmluaXNoID0gdGhpcy0+X01faW1wbC5fTV9maW5pc2g7CisgICAgICAgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNhZnRlciA9CisgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGUoX19sZW5ndGgpIC0gX19lbGVtc2JlZm9yZTsKKyAgICAgICAgICBfX3BvcyA9IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoIC0gX19lbGVtc2FmdGVyOworICAgICAgICAgIF9fdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChfX2VsZW1zYWZ0ZXIgPiBkaWZmZXJlbmNlX3R5cGUoX19uKSkKKwkJeworCQkgIGl0ZXJhdG9yIF9fZmluaXNoX24gPSAodGhpcy0+X01faW1wbC5fTV9maW5pc2gKKwkJCQkJIC0gZGlmZmVyZW5jZV90eXBlKF9fbikpOworCQkgIHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfYShfX2ZpbmlzaF9uLAorCQkJCQkgICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCSAgICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCSAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisJCSAgX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoX19wb3MsIF9fZmluaXNoX24sIF9fb2xkX2ZpbmlzaCk7CisJCSAgc3RkOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3MpOworCQl9CisgICAgICAgICAgICAgIGVsc2UKKwkJeworCQkgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0OworCQkgIHN0ZDo6YWR2YW5jZShfX21pZCwgX19lbGVtc2FmdGVyKTsKKwkJICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5X21vdmUoX19taWQsIF9fbGFzdCwgX19wb3MsCisJCQkJCQkgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCQkgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCQkgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKwkJICBzdGQ6OmNvcHkoX19maXJzdCwgX19taWQsIF9fcG9zKTsKKwkJfQorICAgICAgICAgICAgfQorICAgICAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGUgKyAxLAorCQkJICAgICAgIF9fbmV3X2ZpbmlzaC5fTV9ub2RlICsgMSk7CisgICAgICAgICAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgICB2b2lkCisgICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgIF9NX2Rlc3Ryb3lfZGF0YV9hdXgoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICB7CisgICAgICAgZm9yIChfTWFwX3BvaW50ZXIgX19ub2RlID0gX19maXJzdC5fTV9ub2RlICsgMTsKKwkgICAgX19ub2RlIDwgX19sYXN0Ll9NX25vZGU7ICsrX19ub2RlKQorCSBzdGQ6Ol9EZXN0cm95KCpfX25vZGUsICpfX25vZGUgKyBfU19idWZmZXJfc2l6ZSgpLAorCQkgICAgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKworICAgICAgIGlmIChfX2ZpcnN0Ll9NX25vZGUgIT0gX19sYXN0Ll9NX25vZGUpCisJIHsKKwkgICBzdGQ6Ol9EZXN0cm95KF9fZmlyc3QuX01fY3VyLCBfX2ZpcnN0Ll9NX2xhc3QsCisJCQkgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkgICBzdGQ6Ol9EZXN0cm95KF9fbGFzdC5fTV9maXJzdCwgX19sYXN0Ll9NX2N1ciwKKwkJCSBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSB9CisgICAgICAgZWxzZQorCSBzdGQ6Ol9EZXN0cm95KF9fZmlyc3QuX01fY3VyLCBfX2xhc3QuX01fY3VyLAorCQkgICAgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKyAgICAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9uZXdfZWxlbWVudHNfYXRfZnJvbnQoc2l6ZV90eXBlIF9fbmV3X2VsZW1zKQorICAgIHsKKyAgICAgIGlmICh0aGlzLT5tYXhfc2l6ZSgpIC0gdGhpcy0+c2l6ZSgpIDwgX19uZXdfZWxlbXMpCisJX190aHJvd19sZW5ndGhfZXJyb3IoX19OKCJkZXF1ZTo6X01fbmV3X2VsZW1lbnRzX2F0X2Zyb250IikpOworCisgICAgICBjb25zdCBzaXplX3R5cGUgX19uZXdfbm9kZXMgPSAoKF9fbmV3X2VsZW1zICsgX1NfYnVmZmVyX3NpemUoKSAtIDEpCisJCQkJICAgICAvIF9TX2J1ZmZlcl9zaXplKCkpOworICAgICAgX01fcmVzZXJ2ZV9tYXBfYXRfZnJvbnQoX19uZXdfbm9kZXMpOworICAgICAgc2l6ZV90eXBlIF9faTsKKyAgICAgIF9fdHJ5CisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKF9faSA9IDE7IF9faSA8PSBfX25ld19ub2RlczsgKytfX2kpCisgICAgICAgICAgICAqKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZSAtIF9faSkgPSB0aGlzLT5fTV9hbGxvY2F0ZV9ub2RlKCk7CisgICAgICAgIH0KKyAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICB7CisgICAgICAgICAgZm9yIChzaXplX3R5cGUgX19qID0gMTsgX19qIDwgX19pOyArK19faikKKyAgICAgICAgICAgIF9NX2RlYWxsb2NhdGVfbm9kZSgqKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZSAtIF9faikpOworICAgICAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgICAgICB9CisgICAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9uZXdfZWxlbWVudHNfYXRfYmFjayhzaXplX3R5cGUgX19uZXdfZWxlbXMpCisgICAgeworICAgICAgaWYgKHRoaXMtPm1heF9zaXplKCkgLSB0aGlzLT5zaXplKCkgPCBfX25ld19lbGVtcykKKwlfX3Rocm93X2xlbmd0aF9lcnJvcihfX04oImRlcXVlOjpfTV9uZXdfZWxlbWVudHNfYXRfYmFjayIpKTsKKworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbmV3X25vZGVzID0gKChfX25ld19lbGVtcyArIF9TX2J1ZmZlcl9zaXplKCkgLSAxKQorCQkJCSAgICAgLyBfU19idWZmZXJfc2l6ZSgpKTsKKyAgICAgIF9NX3Jlc2VydmVfbWFwX2F0X2JhY2soX19uZXdfbm9kZXMpOworICAgICAgc2l6ZV90eXBlIF9faTsKKyAgICAgIF9fdHJ5CisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKF9faSA9IDE7IF9faSA8PSBfX25ld19ub2RlczsgKytfX2kpCisgICAgICAgICAgICAqKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGUgKyBfX2kpID0gdGhpcy0+X01fYWxsb2NhdGVfbm9kZSgpOworICAgICAgICB9CisgICAgICBfX2NhdGNoKC4uLikKKyAgICAgICAgeworICAgICAgICAgIGZvciAoc2l6ZV90eXBlIF9faiA9IDE7IF9faiA8IF9faTsgKytfX2opCisgICAgICAgICAgICBfTV9kZWFsbG9jYXRlX25vZGUoKih0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlICsgX19qKSk7CisgICAgICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgICAgIH0KKyAgICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgIF9NX3JlYWxsb2NhdGVfbWFwKHNpemVfdHlwZSBfX25vZGVzX3RvX2FkZCwgYm9vbCBfX2FkZF9hdF9mcm9udCkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfbnVtX25vZGVzCisJPSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlIC0gdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlICsgMTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX25ld19udW1fbm9kZXMgPSBfX29sZF9udW1fbm9kZXMgKyBfX25vZGVzX3RvX2FkZDsKKworICAgICAgX01hcF9wb2ludGVyIF9fbmV3X25zdGFydDsKKyAgICAgIGlmICh0aGlzLT5fTV9pbXBsLl9NX21hcF9zaXplID4gMiAqIF9fbmV3X251bV9ub2RlcykKKwl7CisJICBfX25ld19uc3RhcnQgPSB0aGlzLT5fTV9pbXBsLl9NX21hcCArICh0aGlzLT5fTV9pbXBsLl9NX21hcF9zaXplCisJCQkJCSAtIF9fbmV3X251bV9ub2RlcykgLyAyCisJICAgICAgICAgICAgICAgICArIChfX2FkZF9hdF9mcm9udCA/IF9fbm9kZXNfdG9fYWRkIDogMCk7CisJICBpZiAoX19uZXdfbnN0YXJ0IDwgdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlKQorCSAgICBzdGQ6OmNvcHkodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlLAorCQkgICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwKKwkJICAgICAgX19uZXdfbnN0YXJ0KTsKKwkgIGVsc2UKKwkgICAgc3RkOjpjb3B5X2JhY2t3YXJkKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZSwKKwkJCSAgICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwKKwkJCSAgICAgICBfX25ld19uc3RhcnQgKyBfX29sZF9udW1fbm9kZXMpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzaXplX3R5cGUgX19uZXdfbWFwX3NpemUgPSB0aGlzLT5fTV9pbXBsLl9NX21hcF9zaXplCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0ZDo6bWF4KHRoaXMtPl9NX2ltcGwuX01fbWFwX3NpemUsCisJCQkJCQlfX25vZGVzX3RvX2FkZCkgKyAyOworCisJICBfTWFwX3BvaW50ZXIgX19uZXdfbWFwID0gdGhpcy0+X01fYWxsb2NhdGVfbWFwKF9fbmV3X21hcF9zaXplKTsKKwkgIF9fbmV3X25zdGFydCA9IF9fbmV3X21hcCArIChfX25ld19tYXBfc2l6ZSAtIF9fbmV3X251bV9ub2RlcykgLyAyCisJICAgICAgICAgICAgICAgICArIChfX2FkZF9hdF9mcm9udCA/IF9fbm9kZXNfdG9fYWRkIDogMCk7CisJICBzdGQ6OmNvcHkodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlLAorCQkgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fbm9kZSArIDEsCisJCSAgICBfX25ld19uc3RhcnQpOworCSAgX01fZGVhbGxvY2F0ZV9tYXAodGhpcy0+X01faW1wbC5fTV9tYXAsIHRoaXMtPl9NX2ltcGwuX01fbWFwX3NpemUpOworCisJICB0aGlzLT5fTV9pbXBsLl9NX21hcCA9IF9fbmV3X21hcDsKKwkgIHRoaXMtPl9NX2ltcGwuX01fbWFwX3NpemUgPSBfX25ld19tYXBfc2l6ZTsKKwl9CisKKyAgICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fc2V0X25vZGUoX19uZXdfbnN0YXJ0KTsKKyAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX3NldF9ub2RlKF9fbmV3X25zdGFydCArIF9fb2xkX251bV9ub2RlcyAtIDEpOworICAgIH0KKworICAvLyBPdmVybG9hZCBmb3IgZGVxdWU6Oml0ZXJhdG9ycywgZXhwbG9pdGluZyB0aGUgInNlZ21lbnRlZC1pdGVyYXRvcgorICAvLyBvcHRpbWl6YXRpb24iLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIGZpbGwoY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4mIF9fZmlyc3QsCisJIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+JiBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWx1ZSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+OjpfU2VsZiBfU2VsZjsKKworICAgICAgZm9yICh0eXBlbmFtZSBfU2VsZjo6X01hcF9wb2ludGVyIF9fbm9kZSA9IF9fZmlyc3QuX01fbm9kZSArIDE7CisgICAgICAgICAgIF9fbm9kZSA8IF9fbGFzdC5fTV9ub2RlOyArK19fbm9kZSkKKwlzdGQ6OmZpbGwoKl9fbm9kZSwgKl9fbm9kZSArIF9TZWxmOjpfU19idWZmZXJfc2l6ZSgpLCBfX3ZhbHVlKTsKKworICAgICAgaWYgKF9fZmlyc3QuX01fbm9kZSAhPSBfX2xhc3QuX01fbm9kZSkKKwl7CisJICBzdGQ6OmZpbGwoX19maXJzdC5fTV9jdXIsIF9fZmlyc3QuX01fbGFzdCwgX192YWx1ZSk7CisJICBzdGQ6OmZpbGwoX19sYXN0Ll9NX2ZpcnN0LCBfX2xhc3QuX01fY3VyLCBfX3ZhbHVlKTsKKwl9CisgICAgICBlbHNlCisJc3RkOjpmaWxsKF9fZmlyc3QuX01fY3VyLCBfX2xhc3QuX01fY3VyLCBfX3ZhbHVlKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+CisgICAgY29weShfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiBfX2ZpcnN0LAorCSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiBfX2xhc3QsCisJIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+IF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj46Ol9TZWxmIF9TZWxmOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VsZjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgZGlmZmVyZW5jZV90eXBlIF9fbGVuID0gX19sYXN0IC0gX19maXJzdDsKKyAgICAgIHdoaWxlIChfX2xlbiA+IDApCisJeworCSAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fY2xlbgorCSAgICA9IHN0ZDo6bWluKF9fbGVuLCBzdGQ6Om1pbihfX2ZpcnN0Ll9NX2xhc3QgLSBfX2ZpcnN0Ll9NX2N1ciwKKwkJCQkgICAgICAgX19yZXN1bHQuX01fbGFzdCAtIF9fcmVzdWx0Ll9NX2N1cikpOworCSAgc3RkOjpjb3B5KF9fZmlyc3QuX01fY3VyLCBfX2ZpcnN0Ll9NX2N1ciArIF9fY2xlbiwgX19yZXN1bHQuX01fY3VyKTsKKwkgIF9fZmlyc3QgKz0gX19jbGVuOworCSAgX19yZXN1bHQgKz0gX19jbGVuOworCSAgX19sZW4gLT0gX19jbGVuOworCX0KKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+CisgICAgY29weV9iYWNrd2FyZChfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiBfX2ZpcnN0LAorCQkgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+IF9fbGFzdCwKKwkJICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+OjpfU2VsZiBfU2VsZjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlbGY6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2xlbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgICB3aGlsZSAoX19sZW4gPiAwKQorCXsKKwkgIGRpZmZlcmVuY2VfdHlwZSBfX2xsZW4gPSBfX2xhc3QuX01fY3VyIC0gX19sYXN0Ll9NX2ZpcnN0OworCSAgX1RwKiBfX2xlbmQgPSBfX2xhc3QuX01fY3VyOworCisJICBkaWZmZXJlbmNlX3R5cGUgX19ybGVuID0gX19yZXN1bHQuX01fY3VyIC0gX19yZXN1bHQuX01fZmlyc3Q7CisJICBfVHAqIF9fcmVuZCA9IF9fcmVzdWx0Ll9NX2N1cjsKKworCSAgaWYgKCFfX2xsZW4pCisJICAgIHsKKwkgICAgICBfX2xsZW4gPSBfU2VsZjo6X1NfYnVmZmVyX3NpemUoKTsKKwkgICAgICBfX2xlbmQgPSAqKF9fbGFzdC5fTV9ub2RlIC0gMSkgKyBfX2xsZW47CisJICAgIH0KKwkgIGlmICghX19ybGVuKQorCSAgICB7CisJICAgICAgX19ybGVuID0gX1NlbGY6Ol9TX2J1ZmZlcl9zaXplKCk7CisJICAgICAgX19yZW5kID0gKihfX3Jlc3VsdC5fTV9ub2RlIC0gMSkgKyBfX3JsZW47CisJICAgIH0KKworCSAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fY2xlbiA9IHN0ZDo6bWluKF9fbGVuLAorCQkJCQkJICBzdGQ6Om1pbihfX2xsZW4sIF9fcmxlbikpOworCSAgc3RkOjpjb3B5X2JhY2t3YXJkKF9fbGVuZCAtIF9fY2xlbiwgX19sZW5kLCBfX3JlbmQpOworCSAgX19sYXN0IC09IF9fY2xlbjsKKwkgIF9fcmVzdWx0IC09IF9fY2xlbjsKKwkgIF9fbGVuIC09IF9fY2xlbjsKKwl9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4KKyAgICBtb3ZlKF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+IF9fZmlyc3QsCisJIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+IF9fbGFzdCwKKwkgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4gX19yZXN1bHQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPjo6X1NlbGYgX1NlbGY7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZWxmOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgICAgICBkaWZmZXJlbmNlX3R5cGUgX19sZW4gPSBfX2xhc3QgLSBfX2ZpcnN0OworICAgICAgd2hpbGUgKF9fbGVuID4gMCkKKwl7CisJICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19jbGVuCisJICAgID0gc3RkOjptaW4oX19sZW4sIHN0ZDo6bWluKF9fZmlyc3QuX01fbGFzdCAtIF9fZmlyc3QuX01fY3VyLAorCQkJCSAgICAgICBfX3Jlc3VsdC5fTV9sYXN0IC0gX19yZXN1bHQuX01fY3VyKSk7CisJICBzdGQ6Om1vdmUoX19maXJzdC5fTV9jdXIsIF9fZmlyc3QuX01fY3VyICsgX19jbGVuLCBfX3Jlc3VsdC5fTV9jdXIpOworCSAgX19maXJzdCArPSBfX2NsZW47CisJICBfX3Jlc3VsdCArPSBfX2NsZW47CisJICBfX2xlbiAtPSBfX2NsZW47CisJfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4KKyAgICBtb3ZlX2JhY2t3YXJkKF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+IF9fZmlyc3QsCisJCSAgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgY29uc3QgX1RwJiwgY29uc3QgX1RwKj4gX19sYXN0LAorCQkgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+IF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj46Ol9TZWxmIF9TZWxmOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VsZjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgZGlmZmVyZW5jZV90eXBlIF9fbGVuID0gX19sYXN0IC0gX19maXJzdDsKKyAgICAgIHdoaWxlIChfX2xlbiA+IDApCisJeworCSAgZGlmZmVyZW5jZV90eXBlIF9fbGxlbiA9IF9fbGFzdC5fTV9jdXIgLSBfX2xhc3QuX01fZmlyc3Q7CisJICBfVHAqIF9fbGVuZCA9IF9fbGFzdC5fTV9jdXI7CisKKwkgIGRpZmZlcmVuY2VfdHlwZSBfX3JsZW4gPSBfX3Jlc3VsdC5fTV9jdXIgLSBfX3Jlc3VsdC5fTV9maXJzdDsKKwkgIF9UcCogX19yZW5kID0gX19yZXN1bHQuX01fY3VyOworCisJICBpZiAoIV9fbGxlbikKKwkgICAgeworCSAgICAgIF9fbGxlbiA9IF9TZWxmOjpfU19idWZmZXJfc2l6ZSgpOworCSAgICAgIF9fbGVuZCA9ICooX19sYXN0Ll9NX25vZGUgLSAxKSArIF9fbGxlbjsKKwkgICAgfQorCSAgaWYgKCFfX3JsZW4pCisJICAgIHsKKwkgICAgICBfX3JsZW4gPSBfU2VsZjo6X1NfYnVmZmVyX3NpemUoKTsKKwkgICAgICBfX3JlbmQgPSAqKF9fcmVzdWx0Ll9NX25vZGUgLSAxKSArIF9fcmxlbjsKKwkgICAgfQorCisJICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19jbGVuID0gc3RkOjptaW4oX19sZW4sCisJCQkJCQkgIHN0ZDo6bWluKF9fbGxlbiwgX19ybGVuKSk7CisJICBzdGQ6Om1vdmVfYmFja3dhcmQoX19sZW5kIC0gX19jbGVuLCBfX2xlbmQsIF9fcmVuZCk7CisJICBfX2xhc3QgLT0gX19jbGVuOworCSAgX19yZXN1bHQgLT0gX19jbGVuOworCSAgX19sZW4gLT0gX19jbGVuOworCX0KKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9leGNlcHRpb25fZGVmaW5lcy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2V4Y2VwdGlvbl9kZWZpbmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAyYTJkNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9leGNlcHRpb25fZGVmaW5lcy5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vIC1mbm8tZXhjZXB0aW9ucyBTdXBwb3J0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2V4Y2VwdGlvbl9kZWZpbmVzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtleGNlcHRpb259CisgKi8KKworI2lmbmRlZiBfRVhDRVBUSU9OX0RFRklORVNfSAorI2RlZmluZSBfRVhDRVBUSU9OX0RFRklORVNfSCAxCisKKyNpZm5kZWYgX19FWENFUFRJT05TCisvLyBJZmYgLWZuby1leGNlcHRpb25zLCB0cmFuc2Zvcm0gZXJyb3IgaGFuZGxpbmcgY29kZSB0byB3b3JrIHdpdGhvdXQgaXQuCisjIGRlZmluZSBfX3RyeSAgICAgIGlmICh0cnVlKQorIyBkZWZpbmUgX19jYXRjaChYKSBpZiAoZmFsc2UpCisjIGRlZmluZSBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbgorI2Vsc2UKKy8vIEVsc2UgcHJvY2VlZCBub3JtYWxseS4KKyMgZGVmaW5lIF9fdHJ5ICAgICAgdHJ5CisjIGRlZmluZSBfX2NhdGNoKFgpIGNhdGNoKFgpCisjIGRlZmluZSBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbiB0aHJvdworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2V4Y2VwdGlvbl9wdHIuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9leGNlcHRpb25fcHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJmOGY4NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9leGNlcHRpb25fcHRyLmgKQEAgLTAsMCArMSwxOTggQEAKKy8vIEV4Y2VwdGlvbiBIYW5kbGluZyBzdXBwb3J0IGhlYWRlciAoZXhjZXB0aW9uX3B0ciBjbGFzcykgZm9yIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKy8vCisvLyBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKy8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8gCisvLyBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9leGNlcHRpb25fcHRyLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtleGNlcHRpb259CisgKi8KKworI2lmbmRlZiBfRVhDRVBUSU9OX1BUUl9ICisjZGVmaW5lIF9FWENFUFRJT05fUFRSX0gKKworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwdXNoKGRlZmF1bHQpCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvZXhjZXB0aW9uX2RlZmluZXMuaD4KKworI2lmIEFUT01JQ19JTlRfTE9DS19GUkVFIDwgMgorIyAgZXJyb3IgVGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IGV4Y2VwdGlvbiBwcm9wYWdhdGlvbi4KKyNlbmRpZgorCitleHRlcm4gIkMrKyIgeworCituYW1lc3BhY2Ugc3RkIAoreworICBjbGFzcyB0eXBlX2luZm87CisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIGV4Y2VwdGlvbnMKKyAgICogQHsKKyAgICovCisgIG5hbWVzcGFjZSBfX2V4Y2VwdGlvbl9wdHIKKyAgeworICAgIGNsYXNzIGV4Y2VwdGlvbl9wdHI7CisgIH0KKworICB1c2luZyBfX2V4Y2VwdGlvbl9wdHI6OmV4Y2VwdGlvbl9wdHI7CisKKyAgLyoqIE9idGFpbiBhbiBleGNlcHRpb25fcHRyIHRvIHRoZSBjdXJyZW50bHkgaGFuZGxlZCBleGNlcHRpb24uIElmIHRoZXJlCisgICAqICBpcyBub25lLCBvciB0aGUgY3VycmVudGx5IGhhbmRsZWQgZXhjZXB0aW9uIGlzIGZvcmVpZ24sIHJldHVybiB0aGUgbnVsbAorICAgKiAgdmFsdWUuCisgICAqLworICBleGNlcHRpb25fcHRyIGN1cnJlbnRfZXhjZXB0aW9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworCisgIC8vLyBUaHJvdyB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgdGhlIGV4Y2VwdGlvbl9wdHIuCisgIHZvaWQgcmV0aHJvd19leGNlcHRpb24oZXhjZXB0aW9uX3B0cikgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworCisgIG5hbWVzcGFjZSBfX2V4Y2VwdGlvbl9wdHIKKyAgeworICAgIC8qKgorICAgICAqICBAYnJpZWYgQW4gb3BhcXVlIHBvaW50ZXIgdG8gYW4gYXJiaXRyYXJ5IGV4Y2VwdGlvbi4KKyAgICAgKiAgQGluZ3JvdXAgZXhjZXB0aW9ucworICAgICAqLworICAgIGNsYXNzIGV4Y2VwdGlvbl9wdHIKKyAgICB7CisgICAgICB2b2lkKiBfTV9leGNlcHRpb25fb2JqZWN0OworCisgICAgICBleHBsaWNpdCBleGNlcHRpb25fcHRyKHZvaWQqIF9fZSkgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworCisgICAgICB2b2lkIF9NX2FkZHJlZigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKyAgICAgIHZvaWQgX01fcmVsZWFzZSgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKworICAgICAgdm9pZCAqX01fZ2V0KCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQgX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSk7CisKKyAgICAgIGZyaWVuZCBleGNlcHRpb25fcHRyIHN0ZDo6Y3VycmVudF9leGNlcHRpb24oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisgICAgICBmcmllbmQgdm9pZCBzdGQ6OnJldGhyb3dfZXhjZXB0aW9uKGV4Y2VwdGlvbl9wdHIpOworCisgICAgcHVibGljOgorICAgICAgZXhjZXB0aW9uX3B0cigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKworICAgICAgZXhjZXB0aW9uX3B0cihjb25zdCBleGNlcHRpb25fcHRyJikgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgZXhjZXB0aW9uX3B0cihudWxscHRyX3QpIG5vZXhjZXB0CisgICAgICA6IF9NX2V4Y2VwdGlvbl9vYmplY3QoMCkKKyAgICAgIHsgfQorCisgICAgICBleGNlcHRpb25fcHRyKGV4Y2VwdGlvbl9wdHImJiBfX28pIG5vZXhjZXB0CisgICAgICA6IF9NX2V4Y2VwdGlvbl9vYmplY3QoX19vLl9NX2V4Y2VwdGlvbl9vYmplY3QpCisgICAgICB7IF9fby5fTV9leGNlcHRpb25fb2JqZWN0ID0gMDsgfQorI2VuZGlmCisKKyNpZiAoX19jcGx1c3BsdXMgPCAyMDExMDNMKSB8fCBkZWZpbmVkIChfR0xJQkNYWF9FSF9QVFJfQ09NUEFUKQorICAgICAgdHlwZWRlZiB2b2lkIChleGNlcHRpb25fcHRyOjoqX19zYWZlX2Jvb2wpKCk7CisKKyAgICAgIC8vIEZvciBjb25zdHJ1Y3Rpb24gZnJvbSBudWxscHRyIG9yIDAuCisgICAgICBleGNlcHRpb25fcHRyKF9fc2FmZV9ib29sKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisjZW5kaWYKKworICAgICAgZXhjZXB0aW9uX3B0ciYgCisgICAgICBvcGVyYXRvcj0oY29uc3QgZXhjZXB0aW9uX3B0ciYpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGV4Y2VwdGlvbl9wdHImIAorICAgICAgb3BlcmF0b3I9KGV4Y2VwdGlvbl9wdHImJiBfX28pIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIGV4Y2VwdGlvbl9wdHIoc3RhdGljX2Nhc3Q8ZXhjZXB0aW9uX3B0ciYmPihfX28pKS5zd2FwKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIH5leGNlcHRpb25fcHRyKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworCisgICAgICB2b2lkIAorICAgICAgc3dhcChleGNlcHRpb25fcHRyJikgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworCisjaWZkZWYgX0dMSUJDWFhfRUhfUFRSX0NPTVBBVAorICAgICAgLy8gUmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBDWFhBQklfMS4zLgorICAgICAgdm9pZCBfTV9zYWZlX2Jvb2xfZHVtbXkoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKwlfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisgICAgICBib29sIG9wZXJhdG9yISgpIGNvbnN0IF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorCV9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOworICAgICAgb3BlcmF0b3IgX19zYWZlX2Jvb2woKSBjb25zdCBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZXhjZXB0aW9uX29iamVjdDsgfQorI2VuZGlmCisKKyAgICAgIGZyaWVuZCBib29sIAorICAgICAgb3BlcmF0b3I9PShjb25zdCBleGNlcHRpb25fcHRyJiwgY29uc3QgZXhjZXB0aW9uX3B0ciYpCisJX0dMSUJDWFhfVVNFX05PRVhDRVBUIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOworCisgICAgICBjb25zdCBjbGFzcyBzdGQ6OnR5cGVfaW5mbyoKKyAgICAgIF9fY3hhX2V4Y2VwdGlvbl90eXBlKCkgY29uc3QgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisJX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSk7CisgICAgfTsKKworICAgIGJvb2wgCisgICAgb3BlcmF0b3I9PShjb25zdCBleGNlcHRpb25fcHRyJiwgY29uc3QgZXhjZXB0aW9uX3B0ciYpCisgICAgICBfR0xJQkNYWF9VU0VfTk9FWENFUFQgX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSk7CisKKyAgICBib29sIAorICAgIG9wZXJhdG9yIT0oY29uc3QgZXhjZXB0aW9uX3B0ciYsIGNvbnN0IGV4Y2VwdGlvbl9wdHImKQorICAgICAgX0dMSUJDWFhfVVNFX05PRVhDRVBUIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGV4Y2VwdGlvbl9wdHImIF9fbGhzLCBleGNlcHRpb25fcHRyJiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKKyAgfSAvLyBuYW1lc3BhY2UgX19leGNlcHRpb25fcHRyCisKKworICAvLy8gT2J0YWluIGFuIGV4Y2VwdGlvbl9wdHIgcG9pbnRpbmcgdG8gYSBjb3B5IG9mIHRoZSBzdXBwbGllZCBvYmplY3QuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9FeD4KKyAgICBleGNlcHRpb25fcHRyIAorICAgIGNvcHlfZXhjZXB0aW9uKF9FeCBfX2V4KSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICB7CisgICAgICBfX3RyeQorCXsKKyNpZmRlZiBfX0VYQ0VQVElPTlMKKwkgIHRocm93IF9fZXg7CisjZW5kaWYKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICByZXR1cm4gY3VycmVudF9leGNlcHRpb24oKTsKKwl9CisgICAgfQorCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gMTEzMC4gY29weV9leGNlcHRpb24gbmFtZSBtaXNsZWFkaW5nCisgIC8vLyBPYnRhaW4gYW4gZXhjZXB0aW9uX3B0ciBwb2ludGluZyB0byBhIGNvcHkgb2YgdGhlIHN1cHBsaWVkIG9iamVjdC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0V4PgorICAgIGV4Y2VwdGlvbl9wdHIgCisgICAgbWFrZV9leGNlcHRpb25fcHRyKF9FeCBfX2V4KSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICB7IHJldHVybiBzdGQ6OmNvcHlfZXhjZXB0aW9uPF9FeD4oX19leCk7IH0KKworICAvLyBAfSBncm91cCBleGNlcHRpb25zCit9IC8vIG5hbWVzcGFjZSBzdGQKKworfSAvLyBleHRlcm4gIkMrKyIKKworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwb3AKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvZm9yd2FyZF9saXN0LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvZm9yd2FyZF9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA4ZDY3OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9mb3J3YXJkX2xpc3QuaApAQCAtMCwwICsxLDE0MDIgQEAKKy8vIDxmb3J3YXJkX2xpc3QuaD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvZm9yd2FyZF9saXN0LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtmb3J3YXJkX2xpc3R9CisgKi8KKworI2lmbmRlZiBfRk9SV0FSRF9MSVNUX0gKKyNkZWZpbmUgX0ZPUldBUkRfTElTVF9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUgorCisgIC8qKgorICAgKiAgQGJyaWVmICBBIGhlbHBlciBiYXNpYyBub2RlIGNsYXNzIGZvciAlZm9yd2FyZF9saXN0LgorICAgKiAgICAgICAgICBUaGlzIGlzIGp1c3QgYSBsaW5rZWQgbGlzdCB3aXRoIG5vdGhpbmcgaW5zaWRlIGl0LgorICAgKiAgICAgICAgICBUaGVyZSBhcmUgcHVyZWx5IGxpc3Qgc2h1ZmZsaW5nIHV0aWxpdHkgbWV0aG9kcyBoZXJlLgorICAgKi8KKyAgc3RydWN0IF9Gd2RfbGlzdF9ub2RlX2Jhc2UKKyAgeworICAgIF9Gd2RfbGlzdF9ub2RlX2Jhc2UoKSA9IGRlZmF1bHQ7CisKKyAgICBfRndkX2xpc3Rfbm9kZV9iYXNlKiBfTV9uZXh0ID0gbnVsbHB0cjsKKworICAgIF9Gd2RfbGlzdF9ub2RlX2Jhc2UqCisgICAgX01fdHJhbnNmZXJfYWZ0ZXIoX0Z3ZF9saXN0X25vZGVfYmFzZSogX19iZWdpbiwKKwkJICAgICAgX0Z3ZF9saXN0X25vZGVfYmFzZSogX19lbmQpCisgICAgeworICAgICAgX0Z3ZF9saXN0X25vZGVfYmFzZSogX19rZWVwID0gX19iZWdpbi0+X01fbmV4dDsKKyAgICAgIGlmIChfX2VuZCkKKwl7CisJICBfX2JlZ2luLT5fTV9uZXh0ID0gX19lbmQtPl9NX25leHQ7CisJICBfX2VuZC0+X01fbmV4dCA9IF9NX25leHQ7CisJfQorICAgICAgZWxzZQorCV9fYmVnaW4tPl9NX25leHQgPSAwOworICAgICAgX01fbmV4dCA9IF9fa2VlcDsKKyAgICAgIHJldHVybiBfX2VuZDsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX01fcmV2ZXJzZV9hZnRlcigpIG5vZXhjZXB0CisgICAgeworICAgICAgX0Z3ZF9saXN0X25vZGVfYmFzZSogX190YWlsID0gX01fbmV4dDsKKyAgICAgIGlmICghX190YWlsKQorCXJldHVybjsKKyAgICAgIHdoaWxlIChfRndkX2xpc3Rfbm9kZV9iYXNlKiBfX3RlbXAgPSBfX3RhaWwtPl9NX25leHQpCisJeworCSAgX0Z3ZF9saXN0X25vZGVfYmFzZSogX19rZWVwID0gX01fbmV4dDsKKwkgIF9NX25leHQgPSBfX3RlbXA7CisJICBfX3RhaWwtPl9NX25leHQgPSBfX3RlbXAtPl9NX25leHQ7CisJICBfTV9uZXh0LT5fTV9uZXh0ID0gX19rZWVwOworCX0KKyAgICB9CisgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEEgaGVscGVyIG5vZGUgY2xhc3MgZm9yICVmb3J3YXJkX2xpc3QuCisgICAqICAgICAgICAgIFRoaXMgaXMganVzdCBhIGxpbmtlZCBsaXN0IHdpdGggdW5pbml0aWFsaXplZCBzdG9yYWdlIGZvciBhCisgICAqICAgICAgICAgIGRhdGEgdmFsdWUgaW4gZWFjaCBub2RlLgorICAgKiAgICAgICAgICBUaGVyZSBpcyBhIHNvcnRpbmcgdXRpbGl0eSBtZXRob2QuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9Gd2RfbGlzdF9ub2RlCisgICAgOiBwdWJsaWMgX0Z3ZF9saXN0X25vZGVfYmFzZQorICAgIHsKKyAgICAgIF9Gd2RfbGlzdF9ub2RlKCkgPSBkZWZhdWx0OworCisgICAgICB0eXBlbmFtZSBhbGlnbmVkX3N0b3JhZ2U8c2l6ZW9mKF9UcCksIGFsaWdubWVudF9vZjxfVHA+Ojp2YWx1ZT46OnR5cGUKKwlfTV9zdG9yYWdlOworCisgICAgICBfVHAqCisgICAgICBfTV92YWxwdHIoKSBub2V4Y2VwdAorICAgICAgeworCXJldHVybiBzdGF0aWNfY2FzdDxfVHAqPihzdGF0aWNfY2FzdDx2b2lkKj4oJl9NX3N0b3JhZ2UpKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgX1RwKgorICAgICAgX01fdmFscHRyKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsKKwlyZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgX1RwKj4oc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KCZfTV9zdG9yYWdlKSk7CisgICAgICB9CisgICAgfTsKKworICAvKioKKyAgICogICBAYnJpZWYgQSBmb3J3YXJkX2xpc3Q6Oml0ZXJhdG9yLgorICAgKiAKKyAgICogICBBbGwgdGhlIGZ1bmN0aW9ucyBhcmUgb3Agb3ZlcmxvYWRzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfRndkX2xpc3RfaXRlcmF0b3IKKyAgICB7CisgICAgICB0eXBlZGVmIF9Gd2RfbGlzdF9pdGVyYXRvcjxfVHA+ICAgICAgICAgICAgX1NlbGY7CisgICAgICB0eXBlZGVmIF9Gd2RfbGlzdF9ub2RlPF9UcD4gICAgICAgICAgICAgICAgX05vZGU7CisKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfVHAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIF9UcCYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgX0Z3ZF9saXN0X2l0ZXJhdG9yKCkKKyAgICAgIDogX01fbm9kZSgpIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgX0Z3ZF9saXN0X2l0ZXJhdG9yKF9Gd2RfbGlzdF9ub2RlX2Jhc2UqIF9fbikgCisgICAgICA6IF9NX25vZGUoX19uKSB7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PF9Ob2RlKj4odGhpcy0+X01fbm9kZSktPl9NX3ZhbHB0cigpOyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X05vZGUqPih0aGlzLT5fTV9ub2RlKS0+X01fdmFscHRyKCk7IH0KKworICAgICAgX1NlbGYmCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKyAgICAgICAgX01fbm9kZSA9IF9NX25vZGUtPl9NX25leHQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1NlbGYKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworICAgICAgICBfU2VsZiBfX3RtcCgqdGhpcyk7CisgICAgICAgIF9NX25vZGUgPSBfTV9ub2RlLT5fTV9uZXh0OworICAgICAgICByZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgX1NlbGYmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX25vZGUgPT0gX194Ll9NX25vZGU7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBfU2VsZiYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbm9kZSAhPSBfX3guX01fbm9kZTsgfQorCisgICAgICBfU2VsZgorICAgICAgX01fbmV4dCgpIGNvbnN0CisgICAgICB7CisgICAgICAgIGlmIChfTV9ub2RlKQorICAgICAgICAgIHJldHVybiBfRndkX2xpc3RfaXRlcmF0b3IoX01fbm9kZS0+X01fbmV4dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gX0Z3ZF9saXN0X2l0ZXJhdG9yKDApOworICAgICAgfQorCisgICAgICBfRndkX2xpc3Rfbm9kZV9iYXNlKiBfTV9ub2RlOworICAgIH07CisKKyAgLyoqCisgICAqICAgQGJyaWVmIEEgZm9yd2FyZF9saXN0Ojpjb25zdF9pdGVyYXRvci4KKyAgICogCisgICAqICAgQWxsIHRoZSBmdW5jdGlvbnMgYXJlIG9wIG92ZXJsb2Fkcy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0Z3ZF9saXN0X2NvbnN0X2l0ZXJhdG9yCisgICAgeworICAgICAgdHlwZWRlZiBfRndkX2xpc3RfY29uc3RfaXRlcmF0b3I8X1RwPiAgICAgIF9TZWxmOworICAgICAgdHlwZWRlZiBjb25zdCBfRndkX2xpc3Rfbm9kZTxfVHA+ICAgICAgICAgIF9Ob2RlOworICAgICAgdHlwZWRlZiBfRndkX2xpc3RfaXRlcmF0b3I8X1RwPiAgICAgICAgICAgIGl0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwKiAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAmICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIF9Gd2RfbGlzdF9jb25zdF9pdGVyYXRvcigpCisgICAgICA6IF9NX25vZGUoKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIF9Gd2RfbGlzdF9jb25zdF9pdGVyYXRvcihjb25zdCBfRndkX2xpc3Rfbm9kZV9iYXNlKiBfX24pIAorICAgICAgOiBfTV9ub2RlKF9fbikgeyB9CisKKyAgICAgIF9Gd2RfbGlzdF9jb25zdF9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX19pdGVyKQorICAgICAgOiBfTV9ub2RlKF9faXRlci5fTV9ub2RlKSB7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PF9Ob2RlKj4odGhpcy0+X01fbm9kZSktPl9NX3ZhbHB0cigpOyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X05vZGUqPih0aGlzLT5fTV9ub2RlKS0+X01fdmFscHRyKCk7IH0KKworICAgICAgX1NlbGYmCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKyAgICAgICAgX01fbm9kZSA9IF9NX25vZGUtPl9NX25leHQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1NlbGYKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworICAgICAgICBfU2VsZiBfX3RtcCgqdGhpcyk7CisgICAgICAgIF9NX25vZGUgPSBfTV9ub2RlLT5fTV9uZXh0OworICAgICAgICByZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgX1NlbGYmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX25vZGUgPT0gX194Ll9NX25vZGU7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBfU2VsZiYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbm9kZSAhPSBfX3guX01fbm9kZTsgfQorCisgICAgICBfU2VsZgorICAgICAgX01fbmV4dCgpIGNvbnN0CisgICAgICB7CisgICAgICAgIGlmICh0aGlzLT5fTV9ub2RlKQorICAgICAgICAgIHJldHVybiBfRndkX2xpc3RfY29uc3RfaXRlcmF0b3IoX01fbm9kZS0+X01fbmV4dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gX0Z3ZF9saXN0X2NvbnN0X2l0ZXJhdG9yKDApOworICAgICAgfQorCisgICAgICBjb25zdCBfRndkX2xpc3Rfbm9kZV9iYXNlKiBfTV9ub2RlOworICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEZvcndhcmQgbGlzdCBpdGVyYXRvciBlcXVhbGl0eSBjb21wYXJpc29uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfRndkX2xpc3RfaXRlcmF0b3I8X1RwPiYgX194LAorICAgICAgICAgICAgICAgY29uc3QgX0Z3ZF9saXN0X2NvbnN0X2l0ZXJhdG9yPF9UcD4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fbm9kZSA9PSBfX3kuX01fbm9kZTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBGb3J3YXJkIGxpc3QgaXRlcmF0b3IgaW5lcXVhbGl0eSBjb21wYXJpc29uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfRndkX2xpc3RfaXRlcmF0b3I8X1RwPiYgX194LAorICAgICAgICAgICAgICAgY29uc3QgX0Z3ZF9saXN0X2NvbnN0X2l0ZXJhdG9yPF9UcD4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fbm9kZSAhPSBfX3kuX01fbm9kZTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBCYXNlIGNsYXNzIGZvciAlZm9yd2FyZF9saXN0LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IF9Gd2RfbGlzdF9iYXNlCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2FsbG9jX3RyYWl0czxfQWxsb2M+IF9BbGxvY190cmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM6OnRlbXBsYXRlIHJlYmluZDxfVHA+OjpvdGhlcgorICAgICAgICBfVHBfYWxsb2NfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzOjp0ZW1wbGF0ZQorICAgICAgICByZWJpbmQ8X0Z3ZF9saXN0X25vZGU8X1RwPj46Om90aGVyIF9Ob2RlX2FsbG9jX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX2FsbG9jX3RyYWl0czxfTm9kZV9hbGxvY190eXBlPiBfTm9kZV9hbGxvY190cmFpdHM7CisKKyAgICAgIHN0cnVjdCBfRndkX2xpc3RfaW1wbCAKKyAgICAgIDogcHVibGljIF9Ob2RlX2FsbG9jX3R5cGUKKyAgICAgIHsKKyAgICAgICAgX0Z3ZF9saXN0X25vZGVfYmFzZSBfTV9oZWFkOworCisgICAgICAgIF9Gd2RfbGlzdF9pbXBsKCkKKyAgICAgICAgOiBfTm9kZV9hbGxvY190eXBlKCksIF9NX2hlYWQoKQorICAgICAgICB7IH0KKworICAgICAgICBfRndkX2xpc3RfaW1wbChjb25zdCBfTm9kZV9hbGxvY190eXBlJiBfX2EpCisgICAgICAgIDogX05vZGVfYWxsb2NfdHlwZShfX2EpLCBfTV9oZWFkKCkKKyAgICAgICAgeyB9CisKKyAgICAgICAgX0Z3ZF9saXN0X2ltcGwoX05vZGVfYWxsb2NfdHlwZSYmIF9fYSkKKwk6IF9Ob2RlX2FsbG9jX3R5cGUoc3RkOjptb3ZlKF9fYSkpLCBfTV9oZWFkKCkKKyAgICAgICAgeyB9CisgICAgICB9OworCisgICAgICBfRndkX2xpc3RfaW1wbCBfTV9pbXBsOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfRndkX2xpc3RfaXRlcmF0b3I8X1RwPiAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9Gd2RfbGlzdF9jb25zdF9pdGVyYXRvcjxfVHA+ICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX0Z3ZF9saXN0X25vZGU8X1RwPiAgICAgICAgICAgICAgICAgICAgIF9Ob2RlOworCisgICAgICBfTm9kZV9hbGxvY190eXBlJgorICAgICAgX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxfTm9kZV9hbGxvY190eXBlKj4oJnRoaXMtPl9NX2ltcGwpOyB9CisKKyAgICAgIGNvbnN0IF9Ob2RlX2FsbG9jX3R5cGUmCisgICAgICBfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IF9Ob2RlX2FsbG9jX3R5cGUqPigmdGhpcy0+X01faW1wbCk7IH0KKworICAgICAgX0Z3ZF9saXN0X2Jhc2UoKQorICAgICAgOiBfTV9pbXBsKCkgeyB9CisKKyAgICAgIF9Gd2RfbGlzdF9iYXNlKGNvbnN0IF9Ob2RlX2FsbG9jX3R5cGUmIF9fYSkKKyAgICAgIDogX01faW1wbChfX2EpIHsgfQorCisgICAgICBfRndkX2xpc3RfYmFzZShfRndkX2xpc3RfYmFzZSYmIF9fbHN0LCBjb25zdCBfTm9kZV9hbGxvY190eXBlJiBfX2EpOworCisgICAgICBfRndkX2xpc3RfYmFzZShfRndkX2xpc3RfYmFzZSYmIF9fbHN0KQorICAgICAgOiBfTV9pbXBsKHN0ZDo6bW92ZShfX2xzdC5fTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSkpCisgICAgICB7CisJdGhpcy0+X01faW1wbC5fTV9oZWFkLl9NX25leHQgPSBfX2xzdC5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dDsKKwlfX2xzdC5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCA9IDA7CisgICAgICB9CisKKyAgICAgIH5fRndkX2xpc3RfYmFzZSgpCisgICAgICB7IF9NX2VyYXNlX2FmdGVyKCZfTV9pbXBsLl9NX2hlYWQsIDApOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisKKyAgICAgIF9Ob2RlKgorICAgICAgX01fZ2V0X25vZGUoKQorICAgICAgeyByZXR1cm4gX05vZGVfYWxsb2NfdHJhaXRzOjphbGxvY2F0ZShfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSwgMSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIF9Ob2RlKgorICAgICAgICBfTV9jcmVhdGVfbm9kZShfQXJncyYmLi4uIF9fYXJncykKKyAgICAgICAgeworICAgICAgICAgIF9Ob2RlKiBfX25vZGUgPSB0aGlzLT5fTV9nZXRfbm9kZSgpOworICAgICAgICAgIF9fdHJ5CisgICAgICAgICAgICB7CisJICAgICAgX1RwX2FsbG9jX3R5cGUgX19hKF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpKTsKKwkgICAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8X1RwX2FsbG9jX3R5cGU+IF9BbGxvY190cmFpdHM7CisJICAgICAgOjpuZXcgKCh2b2lkKilfX25vZGUpIF9Ob2RlKCk7CisJICAgICAgX0FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX19ub2RlLT5fTV92YWxwdHIoKSwKKwkJCQkgICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBfX2NhdGNoKC4uLikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdGhpcy0+X01fcHV0X25vZGUoX19ub2RlKTsKKyAgICAgICAgICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIF9fbm9kZTsKKyAgICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgX0Z3ZF9saXN0X25vZGVfYmFzZSoKKyAgICAgICAgX01faW5zZXJ0X2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfQXJncyYmLi4uIF9fYXJncyk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3B1dF9ub2RlKF9Ob2RlKiBfX3ApCisgICAgICB7IF9Ob2RlX2FsbG9jX3RyYWl0czo6ZGVhbGxvY2F0ZShfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSwgX19wLCAxKTsgfQorCisgICAgICBfRndkX2xpc3Rfbm9kZV9iYXNlKgorICAgICAgX01fZXJhc2VfYWZ0ZXIoX0Z3ZF9saXN0X25vZGVfYmFzZSogX19wb3MpOworCisgICAgICBfRndkX2xpc3Rfbm9kZV9iYXNlKgorICAgICAgX01fZXJhc2VfYWZ0ZXIoX0Z3ZF9saXN0X25vZGVfYmFzZSogX19wb3MsIAorICAgICAgICAgICAgICAgICAgICAgX0Z3ZF9saXN0X25vZGVfYmFzZSogX19sYXN0KTsKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIEEgc3RhbmRhcmQgY29udGFpbmVyIHdpdGggbGluZWFyIHRpbWUgYWNjZXNzIHRvIGVsZW1lbnRzLAorICAgKiAgYW5kIGZpeGVkIHRpbWUgaW5zZXJ0aW9uL2RlbGV0aW9uIGF0IGFueSBwb2ludCBpbiB0aGUgc2VxdWVuY2UuCisgICAqCisgICAqICBAaW5ncm91cCBzZXF1ZW5jZXMKKyAgICoKKyAgICogIEB0cGFyYW0gX1RwICBUeXBlIG9mIGVsZW1lbnQuCisgICAqICBAdHBhcmFtIF9BbGxvYyAgQWxsb2NhdG9yIHR5cGUsIGRlZmF1bHRzIHRvIGFsbG9jYXRvcjxfVHA+LgorICAgKgorICAgKiAgTWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LCBhCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NyI+c2VxdWVuY2U8L2E+LCBpbmNsdWRpbmcgdGhlCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2OCI+b3B0aW9uYWwgc2VxdWVuY2UgcmVxdWlyZW1lbnRzPC9hPiB3aXRoIHRoZQorICAgKiAgJWV4Y2VwdGlvbiBvZiBAYyBhdCBhbmQgQGMgb3BlcmF0b3JbXS4KKyAgICoKKyAgICogIFRoaXMgaXMgYSBAZSBzaW5nbHkgQGUgbGlua2VkICVsaXN0LiAgVHJhdmVyc2FsIHVwIHRoZQorICAgKiAgJWxpc3QgcmVxdWlyZXMgbGluZWFyIHRpbWUsIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIGVsZW1lbnRzIChvcgorICAgKiAgQGUgbm9kZXMpIGlzIGRvbmUgaW4gY29uc3RhbnQgdGltZSwgcmVnYXJkbGVzcyBvZiB3aGVyZSB0aGUKKyAgICogIGNoYW5nZSB0YWtlcyBwbGFjZS4gIFVubGlrZSBzdGQ6OnZlY3RvciBhbmQgc3RkOjpkZXF1ZSwKKyAgICogIHJhbmRvbS1hY2Nlc3MgaXRlcmF0b3JzIGFyZSBub3QgcHJvdmlkZWQsIHNvIHN1YnNjcmlwdGluZyAoIEBjCisgICAqICBbXSApIGFjY2VzcyBpcyBub3QgYWxsb3dlZC4gIEZvciBhbGdvcml0aG1zIHdoaWNoIG9ubHkgbmVlZAorICAgKiAgc2VxdWVudGlhbCBhY2Nlc3MsIHRoaXMgbGFjayBtYWtlcyBubyBkaWZmZXJlbmNlLgorICAgKgorICAgKiAgQWxzbyB1bmxpa2UgdGhlIG90aGVyIHN0YW5kYXJkIGNvbnRhaW5lcnMsIHN0ZDo6Zm9yd2FyZF9saXN0IHByb3ZpZGVzCisgICAqICBzcGVjaWFsaXplZCBhbGdvcml0aG1zICV1bmlxdWUgdG8gbGlua2VkIGxpc3RzLCBzdWNoIGFzCisgICAqICBzcGxpY2luZywgc29ydGluZywgYW5kIGluLXBsYWNlIHJldmVyc2FsLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2MgPSBhbGxvY2F0b3I8X1RwPiA+CisgICAgY2xhc3MgZm9yd2FyZF9saXN0IDogcHJpdmF0ZSBfRndkX2xpc3RfYmFzZTxfVHAsIF9BbGxvYz4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX0Z3ZF9saXN0X2Jhc2U8X1RwLCBfQWxsb2M+ICAgICAgICAgICAgICAgICAgX0Jhc2U7CisgICAgICB0eXBlZGVmIF9Gd2RfbGlzdF9ub2RlPF9UcD4gICAgICAgICAgICAgICAgICAgICAgICAgIF9Ob2RlOworICAgICAgdHlwZWRlZiBfRndkX2xpc3Rfbm9kZV9iYXNlICAgICAgICAgICAgICAgICAgICAgICAgICBfTm9kZV9iYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6X1RwX2FsbG9jX3R5cGUgICAgICAgICAgICAgICBfVHBfYWxsb2NfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Ol9Ob2RlX2FsbG9jX3R5cGUgICAgICAgICAgICAgX05vZGVfYWxsb2NfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Ol9Ob2RlX2FsbG9jX3RyYWl0cyAgICAgICAgICAgX05vZGVfYWxsb2NfdHJhaXRzOworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fYWxsb2NfdHJhaXRzPF9UcF9hbGxvY190eXBlPiAgICBfQWxsb2NfdHJhaXRzOworCisgICAgcHVibGljOgorICAgICAgLy8gdHlwZXM6CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM6OnBvaW50ZXIgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM6OmNvbnN0X3BvaW50ZXIgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM6OnJlZmVyZW5jZSAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czo6Y29uc3RfcmVmZXJlbmNlICAgICAgY29uc3RfcmVmZXJlbmNlOworIAorICAgICAgdHlwZWRlZiBfRndkX2xpc3RfaXRlcmF0b3I8X1RwPiAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX0Z3ZF9saXN0X2NvbnN0X2l0ZXJhdG9yPF9UcD4gICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfQWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgLy8gMjMuMy40LjIgY29uc3RydWN0L2NvcHkvZGVzdHJveToKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGVzIGEgJWZvcndhcmRfbGlzdCB3aXRoIG5vIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19hbCAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGZvcndhcmRfbGlzdChjb25zdCBfQWxsb2MmIF9fYWwgPSBfQWxsb2MoKSkKKyAgICAgIDogX0Jhc2UoX05vZGVfYWxsb2NfdHlwZShfX2FsKSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvcHkgY29uc3RydWN0b3Igd2l0aCBhbGxvY2F0b3IgYXJndW1lbnQuCisgICAgICAgKiAgQHBhcmFtICBfX2xpc3QgIElucHV0IGxpc3QgdG8gY29weS4KKyAgICAgICAqICBAcGFyYW0gIF9fYWwgICAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZm9yd2FyZF9saXN0KGNvbnN0IGZvcndhcmRfbGlzdCYgX19saXN0LCBjb25zdCBfQWxsb2MmIF9fYWwpCisgICAgICA6IF9CYXNlKF9Ob2RlX2FsbG9jX3R5cGUoX19hbCkpCisgICAgICB7IF9NX3JhbmdlX2luaXRpYWxpemUoX19saXN0LmJlZ2luKCksIF9fbGlzdC5lbmQoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNb3ZlIGNvbnN0cnVjdG9yIHdpdGggYWxsb2NhdG9yIGFyZ3VtZW50LgorICAgICAgICogIEBwYXJhbSAgX19saXN0ICBJbnB1dCBsaXN0IHRvIG1vdmUuCisgICAgICAgKiAgQHBhcmFtICBfX2FsICAgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGZvcndhcmRfbGlzdChmb3J3YXJkX2xpc3QmJiBfX2xpc3QsIGNvbnN0IF9BbGxvYyYgX19hbCkKKyAgICAgIG5vZXhjZXB0KF9Ob2RlX2FsbG9jX3RyYWl0czo6X1NfYWx3YXlzX2VxdWFsKCkpCisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX2xpc3QpLCBfTm9kZV9hbGxvY190eXBlKF9fYWwpKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICVmb3J3YXJkX2xpc3Qgd2l0aCBkZWZhdWx0IGNvbnN0cnVjdGVkIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19uICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGluaXRpYWxseSBjcmVhdGUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyB0aGUgJWZvcndhcmRfbGlzdCB3aXRoIEBhIF9fbiBkZWZhdWx0CisgICAgICAgKiAgY29uc3RydWN0ZWQgZWxlbWVudHMuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBmb3J3YXJkX2xpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgX0FsbG9jJiBfX2FsID0gX0FsbG9jKCkpCisgICAgICA6IF9CYXNlKF9Ob2RlX2FsbG9jX3R5cGUoX19hbCkpCisgICAgICB7IF9NX2RlZmF1bHRfaW5pdGlhbGl6ZShfX24pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICVmb3J3YXJkX2xpc3Qgd2l0aCBjb3BpZXMgb2YgYW4gZXhlbXBsYXIgZWxlbWVudC4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgICAgIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gaW5pdGlhbGx5IGNyZWF0ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fdmFsdWUgIEFuIGVsZW1lbnQgdG8gY29weS4KKyAgICAgICAqICBAcGFyYW0gIF9fYWwgICAgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgY29uc3RydWN0b3IgZmlsbHMgdGhlICVmb3J3YXJkX2xpc3Qgd2l0aCBAYSBfX24gY29waWVzIG9mCisgICAgICAgKiAgQGEgX192YWx1ZS4KKyAgICAgICAqLworICAgICAgZm9yd2FyZF9saXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBfQWxsb2MmIF9fYWwgPSBfQWxsb2MoKSkKKyAgICAgIDogX0Jhc2UoX05vZGVfYWxsb2NfdHlwZShfX2FsKSkKKyAgICAgIHsgX01fZmlsbF9pbml0aWFsaXplKF9fbiwgX192YWx1ZSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlZm9yd2FyZF9saXN0IGZyb20gYSByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2FsICAgICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAlZm9yd2FyZF9saXN0IGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBmcm9tCisgICAgICAgKiAgW0BhIF9fZmlyc3QsQGEgX19sYXN0KS4gIFRoaXMgaXMgbGluZWFyIGluIE4gKHdoZXJlIE4gaXMKKyAgICAgICAqICBkaXN0YW5jZShAYSBfX2ZpcnN0LEBhIF9fbGFzdCkpLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyAgICAgICAgZm9yd2FyZF9saXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9BbGxvYyYgX19hbCA9IF9BbGxvYygpKQorCTogX0Jhc2UoX05vZGVfYWxsb2NfdHlwZShfX2FsKSkKKyAgICAgICAgeyBfTV9yYW5nZV9pbml0aWFsaXplKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUaGUgJWZvcndhcmRfbGlzdCBjb3B5IGNvbnN0cnVjdG9yLgorICAgICAgICogIEBwYXJhbSAgX19saXN0ICBBICVmb3J3YXJkX2xpc3Qgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvcgorICAgICAgICogICAgICAgICAgICAgICAgICB0eXBlcy4KKyAgICAgICAqLworICAgICAgZm9yd2FyZF9saXN0KGNvbnN0IGZvcndhcmRfbGlzdCYgX19saXN0KQorICAgICAgOiBfQmFzZShfTm9kZV9hbGxvY190cmFpdHM6Ol9TX3NlbGVjdF9vbl9jb3B5KAorICAgICAgICAgICAgICAgIF9fbGlzdC5fTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSkpCisgICAgICB7IF9NX3JhbmdlX2luaXRpYWxpemUoX19saXN0LmJlZ2luKCksIF9fbGlzdC5lbmQoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUaGUgJWZvcndhcmRfbGlzdCBtb3ZlIGNvbnN0cnVjdG9yLgorICAgICAgICogIEBwYXJhbSAgX19saXN0ICBBICVmb3J3YXJkX2xpc3Qgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvcgorICAgICAgICogICAgICAgICAgICAgICAgICB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJWZvcndhcmRfbGlzdCBjb250YWlucyB0aGUgZXhhY3QgY29udGVudHMgb2YgQGEKKyAgICAgICAqICBfX2xpc3QuIFRoZSBjb250ZW50cyBvZiBAYSBfX2xpc3QgYXJlIGEgdmFsaWQsIGJ1dCB1bnNwZWNpZmllZAorICAgICAgICogICVmb3J3YXJkX2xpc3QuCisgICAgICAgKi8KKyAgICAgIGZvcndhcmRfbGlzdChmb3J3YXJkX2xpc3QmJiBfX2xpc3QpIG5vZXhjZXB0CisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX2xpc3QpKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlZm9yd2FyZF9saXN0IGZyb20gYW4gaW5pdGlhbGl6ZXJfbGlzdAorICAgICAgICogIEBwYXJhbSAgX19pbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiB2YWx1ZV90eXBlLgorICAgICAgICogIEBwYXJhbSAgX19hbCAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGEgJWZvcndhcmRfbGlzdCBjb25zaXN0aW5nIG9mIGNvcGllcyBvZiB0aGUgZWxlbWVudHMKKyAgICAgICAqICBpbiB0aGUgaW5pdGlhbGl6ZXJfbGlzdCBAYSBfX2lsLiAgVGhpcyBpcyBsaW5lYXIgaW4gX19pbC5zaXplKCkuCisgICAgICAgKi8KKyAgICAgIGZvcndhcmRfbGlzdChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2lsLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IF9BbGxvYyYgX19hbCA9IF9BbGxvYygpKQorICAgICAgOiBfQmFzZShfTm9kZV9hbGxvY190eXBlKF9fYWwpKQorICAgICAgeyBfTV9yYW5nZV9pbml0aWFsaXplKF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUaGUgZm9yd2FyZF9saXN0IGR0b3IuCisgICAgICAgKi8KKyAgICAgIH5mb3J3YXJkX2xpc3QoKSBub2V4Y2VwdAorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGhlICVmb3J3YXJkX2xpc3QgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbGlzdCAgQSAlZm9yd2FyZF9saXN0IG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IKKyAgICAgICAqICAgICAgICAgICAgICAgIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBBbGwgdGhlIGVsZW1lbnRzIG9mIEBhIF9fbGlzdCBhcmUgY29waWVkLCBidXQgdW5saWtlIHRoZSBjb3B5CisgICAgICAgKiAgY29uc3RydWN0b3IsIHRoZSBhbGxvY2F0b3Igb2JqZWN0IGlzIG5vdCBjb3BpZWQuCisgICAgICAgKi8KKyAgICAgIGZvcndhcmRfbGlzdCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBmb3J3YXJkX2xpc3QmIF9fbGlzdCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGhlICVmb3J3YXJkX2xpc3QgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19saXN0ICBBICVmb3J3YXJkX2xpc3Qgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvcgorICAgICAgICogICAgICAgICAgICAgICAgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBjb250ZW50cyBvZiBAYSBfX2xpc3QgYXJlIG1vdmVkIGludG8gdGhpcyAlZm9yd2FyZF9saXN0CisgICAgICAgKiAgKHdpdGhvdXQgY29weWluZywgaWYgdGhlIGFsbG9jYXRvcnMgcGVybWl0IGl0KS4KKyAgICAgICAqICBAYSBfX2xpc3QgaXMgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkICVmb3J3YXJkX2xpc3QKKyAgICAgICAqLworICAgICAgZm9yd2FyZF9saXN0JgorICAgICAgb3BlcmF0b3I9KGZvcndhcmRfbGlzdCYmIF9fbGlzdCkKKyAgICAgIG5vZXhjZXB0KF9Ob2RlX2FsbG9jX3RyYWl0czo6X1Nfbm90aHJvd19tb3ZlKCkpCisgICAgICB7CisgICAgICAgIGNvbnN0ZXhwciBib29sIF9fbW92ZV9zdG9yYWdlID0KKyAgICAgICAgICBfTm9kZV9hbGxvY190cmFpdHM6Ol9TX3Byb3BhZ2F0ZV9vbl9tb3ZlX2Fzc2lnbigpCisgICAgICAgICAgfHwgX05vZGVfYWxsb2NfdHJhaXRzOjpfU19hbHdheXNfZXF1YWwoKTsKKyAgICAgICAgX01fbW92ZV9hc3NpZ24oc3RkOjptb3ZlKF9fbGlzdCksCisgICAgICAgICAgICAgICAgICAgICAgIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9fbW92ZV9zdG9yYWdlPigpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGhlICVmb3J3YXJkX2xpc3QgaW5pdGlhbGl6ZXIgbGlzdCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19pbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiB2YWx1ZV90eXBlLgorICAgICAgICoKKyAgICAgICAqICBSZXBsYWNlIHRoZSBjb250ZW50cyBvZiB0aGUgJWZvcndhcmRfbGlzdCB3aXRoIGNvcGllcyBvZiB0aGUKKyAgICAgICAqICBlbGVtZW50cyBpbiB0aGUgaW5pdGlhbGl6ZXJfbGlzdCBAYSBfX2lsLiAgVGhpcyBpcyBsaW5lYXIgaW4KKyAgICAgICAqICBfX2lsLnNpemUoKS4KKyAgICAgICAqLworICAgICAgZm9yd2FyZF9saXN0JgorICAgICAgb3BlcmF0b3I9KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9faWwpCisgICAgICB7CisgICAgICAgIGFzc2lnbihfX2lsKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbnMgYSByYW5nZSB0byBhICVmb3J3YXJkX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGEgJWZvcndhcmRfbGlzdCB3aXRoIGNvcGllcyBvZiB0aGUgZWxlbWVudHMKKyAgICAgICAqICBpbiB0aGUgcmFuZ2UgW0BhIF9fZmlyc3QsQGEgX19sYXN0KS4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBhc3NpZ25tZW50IGNvbXBsZXRlbHkgY2hhbmdlcyB0aGUgJWZvcndhcmRfbGlzdCBhbmQKKyAgICAgICAqICB0aGF0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgdGhlIHJlc3VsdGluZyAlZm9yd2FyZF9saXN0IGlzIHRoZQorICAgICAgICogIHNhbWUgYXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBhc3NpZ25lZC4gIE9sZCBkYXRhIGlzIGxvc3QuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorCXZvaWQKKyAgICAgICAgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgdHlwZWRlZiBpc19hc3NpZ25hYmxlPF9UcCwgZGVjbHR5cGUoKl9fZmlyc3QpPiBfX2Fzc2lnbmFibGU7CisJICBfTV9hc3NpZ24oX19maXJzdCwgX19sYXN0LCBfX2Fzc2lnbmFibGUoKSk7CisJfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbnMgYSBnaXZlbiB2YWx1ZSB0byBhICVmb3J3YXJkX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBlbGVtZW50cyB0byBiZSBhc3NpZ25lZC4KKyAgICAgICAqICBAcGFyYW0gIF9fdmFsICBWYWx1ZSB0byBiZSBhc3NpZ25lZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhICVmb3J3YXJkX2xpc3Qgd2l0aCBAYSBfX24gY29waWVzIG9mIHRoZQorICAgICAgICogIGdpdmVuIHZhbHVlLiAgTm90ZSB0aGF0IHRoZSBhc3NpZ25tZW50IGNvbXBsZXRlbHkgY2hhbmdlcyB0aGUKKyAgICAgICAqICAlZm9yd2FyZF9saXN0LCBhbmQgdGhhdCB0aGUgcmVzdWx0aW5nICVmb3J3YXJkX2xpc3QgaGFzIF9fbgorICAgICAgICogIGVsZW1lbnRzLiAgT2xkIGRhdGEgaXMgbG9zdC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpCisgICAgICB7IF9NX2Fzc2lnbl9uKF9fbiwgX192YWwsIGlzX2NvcHlfYXNzaWduYWJsZTxfVHA+KCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWducyBhbiBpbml0aWFsaXplcl9saXN0IHRvIGEgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9faWwgIEFuIGluaXRpYWxpemVyX2xpc3Qgb2YgdmFsdWVfdHlwZS4KKyAgICAgICAqCisgICAgICAgKiAgUmVwbGFjZSB0aGUgY29udGVudHMgb2YgdGhlICVmb3J3YXJkX2xpc3Qgd2l0aCBjb3BpZXMgb2YgdGhlCisgICAgICAgKiAgZWxlbWVudHMgaW4gdGhlIGluaXRpYWxpemVyX2xpc3QgQGEgX19pbC4gIFRoaXMgaXMgbGluZWFyIGluCisgICAgICAgKiAgaWwuc2l6ZSgpLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oc3RkOjppbml0aWFsaXplcl9saXN0PF9UcD4gX19pbCkKKyAgICAgIHsgYXNzaWduKF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7IH0KKworICAgICAgLy8vIEdldCBhIGNvcHkgb2YgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIG9iamVjdC4KKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGFsbG9jYXRvcl90eXBlKHRoaXMtPl9NX2dldF9Ob2RlX2FsbG9jYXRvcigpKTsgfQorCisgICAgICAvLyAyMy4zLjQuMyBpdGVyYXRvcnM6CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIGJlZm9yZSB0aGUgZmlyc3QgZWxlbWVudAorICAgICAgICogIGluIHRoZSAlZm9yd2FyZF9saXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZm9yZV9iZWdpbigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBpdGVyYXRvcigmdGhpcy0+X01faW1wbC5fTV9oZWFkKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgYmVmb3JlIHRoZQorICAgICAgICogIGZpcnN0IGVsZW1lbnQgaW4gdGhlICVmb3J3YXJkX2xpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWZvcmVfYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJnRoaXMtPl9NX2ltcGwuX01faGVhZCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0IGVsZW1lbnQKKyAgICAgICAqICBpbiB0aGUgJWZvcndhcmRfbGlzdC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIG9yZGluYXJ5IGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBpdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICVmb3J3YXJkX2xpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAlZm9yd2FyZF9saXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAlZm9yd2FyZF9saXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUKKyAgICAgICAqICBmaXJzdCBlbGVtZW50IGluIHRoZSAlZm9yd2FyZF9saXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01faGVhZC5fTV9uZXh0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgYmVmb3JlIHRoZQorICAgICAgICogIGZpcnN0IGVsZW1lbnQgaW4gdGhlICVmb3J3YXJkX2xpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVmb3JlX2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZ0aGlzLT5fTV9pbXBsLl9NX2hlYWQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdAorICAgICAgICogIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlICVmb3J3YXJkX2xpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbgorICAgICAgICogIG9yZGluYXJ5IGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgJWZvcndhcmRfbGlzdCBpcyBlbXB0eS4gIChUaHVzIGJlZ2luKCkgd291bGQKKyAgICAgICAqICBlcXVhbCBlbmQoKS4pCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01faGVhZC5fTV9uZXh0ID09IDA7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyB0aGUgbGFyZ2VzdCBwb3NzaWJsZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTm9kZV9hbGxvY190cmFpdHM6Om1heF9zaXplKHRoaXMtPl9NX2dldF9Ob2RlX2FsbG9jYXRvcigpKTsgfQorCisgICAgICAvLyAyMy4zLjQuNCBlbGVtZW50IGFjY2VzczoKKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICVmb3J3YXJkX2xpc3QuCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgZnJvbnQoKQorICAgICAgeworICAgICAgICBfTm9kZSogX19mcm9udCA9IHN0YXRpY19jYXN0PF9Ob2RlKj4odGhpcy0+X01faW1wbC5fTV9oZWFkLl9NX25leHQpOworICAgICAgICByZXR1cm4gKl9fZnJvbnQtPl9NX3ZhbHB0cigpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICVmb3J3YXJkX2xpc3QuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgZnJvbnQoKSBjb25zdAorICAgICAgeworICAgICAgICBfTm9kZSogX19mcm9udCA9IHN0YXRpY19jYXN0PF9Ob2RlKj4odGhpcy0+X01faW1wbC5fTV9oZWFkLl9NX25leHQpOworICAgICAgICByZXR1cm4gKl9fZnJvbnQtPl9NX3ZhbHB0cigpOworICAgICAgfQorCisgICAgICAvLyAyMy4zLjQuNSBtb2Rp76yBZXJzOgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdHMgb2JqZWN0IGluICVmb3J3YXJkX2xpc3QgYXQgdGhlIGZyb250IG9mIHRoZQorICAgICAgICogICAgICAgICAgbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fYXJncyAgQXJndW1lbnRzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGFuIG9iamVjdCBvZiB0eXBlIFRwIGNvbnN0cnVjdGVkCisgICAgICAgKiAgd2l0aCBUcChzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pIGF0IHRoZSBmcm9udCBvZiB0aGUgbGlzdAorICAgICAgICogIER1ZSB0byB0aGUgbmF0dXJlIG9mIGEgJWZvcndhcmRfbGlzdCB0aGlzIG9wZXJhdGlvbiBjYW4KKyAgICAgICAqICBiZSBkb25lIGluIGNvbnN0YW50IHRpbWUsIGFuZCBkb2VzIG5vdCBpbnZhbGlkYXRlIGl0ZXJhdG9ycworICAgICAgICogIGFuZCByZWZlcmVuY2VzLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBlbXBsYWNlX2Zyb250KF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgICB7IHRoaXMtPl9NX2luc2VydF9hZnRlcihjYmVmb3JlX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBZGQgZGF0YSB0byB0aGUgZnJvbnQgb2YgdGhlICVmb3J3YXJkX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX3ZhbCAgRGF0YSB0byBiZSBhZGRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIHR5cGljYWwgc3RhY2sgb3BlcmF0aW9uLiAgVGhlIGZ1bmN0aW9uIGNyZWF0ZXMgYW4KKyAgICAgICAqICBlbGVtZW50IGF0IHRoZSBmcm9udCBvZiB0aGUgJWZvcndhcmRfbGlzdCBhbmQgYXNzaWducyB0aGUgZ2l2ZW4KKyAgICAgICAqICBkYXRhIHRvIGl0LiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgYSAlZm9yd2FyZF9saXN0IHRoaXMgb3BlcmF0aW9uCisgICAgICAgKiAgY2FuIGJlIGRvbmUgaW4gY29uc3RhbnQgdGltZSwgYW5kIGRvZXMgbm90IGludmFsaWRhdGUgaXRlcmF0b3JzCisgICAgICAgKiAgYW5kIHJlZmVyZW5jZXMuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfZnJvbnQoY29uc3QgX1RwJiBfX3ZhbCkKKyAgICAgIHsgdGhpcy0+X01faW5zZXJ0X2FmdGVyKGNiZWZvcmVfYmVnaW4oKSwgX192YWwpOyB9CisKKyAgICAgIC8qKgorICAgICAgICoKKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcHVzaF9mcm9udChfVHAmJiBfX3ZhbCkKKyAgICAgIHsgdGhpcy0+X01faW5zZXJ0X2FmdGVyKGNiZWZvcmVfYmVnaW4oKSwgc3RkOjptb3ZlKF9fdmFsKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmVzIGZpcnN0IGVsZW1lbnQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSB0eXBpY2FsIHN0YWNrIG9wZXJhdGlvbi4gIEl0IHNocmlua3MgdGhlICVmb3J3YXJkX2xpc3QKKyAgICAgICAqICBieSBvbmUuICBEdWUgdG8gdGhlIG5hdHVyZSBvZiBhICVmb3J3YXJkX2xpc3QgdGhpcyBvcGVyYXRpb24gY2FuCisgICAgICAgKiAgYmUgZG9uZSBpbiBjb25zdGFudCB0aW1lLCBhbmQgb25seSBpbnZhbGlkYXRlcyBpdGVyYXRvcnMvcmVmZXJlbmNlcworICAgICAgICogIHRvIHRoZSBlbGVtZW50IGJlaW5nIHJlbW92ZWQuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCBubyBkYXRhIGlzIHJldHVybmVkLCBhbmQgaWYgdGhlIGZpcnN0IGVsZW1lbnQncyBkYXRhCisgICAgICAgKiAgaXMgbmVlZGVkLCBpdCBzaG91bGQgYmUgcmV0cmlldmVkIGJlZm9yZSBwb3BfZnJvbnQoKSBpcworICAgICAgICogIGNhbGxlZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcG9wX2Zyb250KCkKKyAgICAgIHsgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoJnRoaXMtPl9NX2ltcGwuX01faGVhZCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RzIG9iamVjdCBpbiAlZm9yd2FyZF9saXN0IGFmdGVyIHRoZSBzcGVjaWZpZWQKKyAgICAgICAqICAgICAgICAgIGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIEEgY29uc3RfaXRlcmF0b3IgaW50byB0aGUgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fYXJncyAgQXJndW1lbnRzLgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBpbnNlcnRlZCBkYXRhLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGFuIG9iamVjdCBvZiB0eXBlIFQgY29uc3RydWN0ZWQKKyAgICAgICAqICB3aXRoIFQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSBhZnRlciB0aGUgc3BlY2lmaWVkCisgICAgICAgKiAgbG9jYXRpb24uICBEdWUgdG8gdGhlIG5hdHVyZSBvZiBhICVmb3J3YXJkX2xpc3QgdGhpcyBvcGVyYXRpb24gY2FuCisgICAgICAgKiAgYmUgZG9uZSBpbiBjb25zdGFudCB0aW1lLCBhbmQgZG9lcyBub3QgaW52YWxpZGF0ZSBpdGVyYXRvcnMKKyAgICAgICAqICBhbmQgcmVmZXJlbmNlcy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGVtcGxhY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgICB7IHJldHVybiBpdGVyYXRvcih0aGlzLT5fTV9pbnNlcnRfYWZ0ZXIoX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydHMgZ2l2ZW4gdmFsdWUgaW50byAlZm9yd2FyZF9saXN0IGFmdGVyIHNwZWNpZmllZAorICAgICAgICogICAgICAgICAgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgQW4gaXRlcmF0b3IgaW50byB0aGUgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fdmFsICBEYXRhIHRvIGJlIGluc2VydGVkLgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBpbnNlcnRlZCBkYXRhLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGEgY29weSBvZiB0aGUgZ2l2ZW4gdmFsdWUgYWZ0ZXIKKyAgICAgICAqICB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgYSAlZm9yd2FyZF9saXN0IHRoaXMKKyAgICAgICAqICBvcGVyYXRpb24gY2FuIGJlIGRvbmUgaW4gY29uc3RhbnQgdGltZSwgYW5kIGRvZXMgbm90CisgICAgICAgKiAgaW52YWxpZGF0ZSBpdGVyYXRvcnMgYW5kIHJlZmVyZW5jZXMuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIGNvbnN0IF9UcCYgX192YWwpCisgICAgICB7IHJldHVybiBpdGVyYXRvcih0aGlzLT5fTV9pbnNlcnRfYWZ0ZXIoX19wb3MsIF9fdmFsKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0X2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfVHAmJiBfX3ZhbCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2luc2VydF9hZnRlcihfX3Bvcywgc3RkOjptb3ZlKF9fdmFsKSkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyBhIG51bWJlciBvZiBjb3BpZXMgb2YgZ2l2ZW4gZGF0YSBpbnRvIHRoZQorICAgICAgICogICAgICAgICAgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBBbiBpdGVyYXRvciBpbnRvIHRoZSAlZm9yd2FyZF9saXN0LgorICAgICAgICogIEBwYXJhbSAgX19uICBOdW1iZXIgb2YgZWxlbWVudHMgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHBhcmFtICBfX3ZhbCAgRGF0YSB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBpbnNlcnRlZCBjb3B5IG9mCisgICAgICAgKiAgICAgICAgICAgQGEgdmFsIG9yIEBhIHBvcyBpZiBAYSBuID09IDAuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNvcGllcyBvZiB0aGUKKyAgICAgICAqICBnaXZlbiBkYXRhIGFmdGVyIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgQGEgcG9zLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9wZXJhdGlvbiBpcyBsaW5lYXIgaW4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbnNlcnRlZCBhbmQKKyAgICAgICAqICBkb2VzIG5vdCBpbnZhbGlkYXRlIGl0ZXJhdG9ycyBhbmQgcmVmZXJlbmNlcy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyBhIHJhbmdlIGludG8gdGhlICVmb3J3YXJkX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgQW4gaXRlcmF0b3IgaW50byB0aGUgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgaW5zZXJ0ZWQgZWxlbWVudCBvcgorICAgICAgICogICAgICAgICAgIEBhIF9fcG9zIGlmIEBhIF9fZmlyc3QgPT0gQGEgX19sYXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGNvcGllcyBvZiB0aGUgZGF0YSBpbiB0aGUgcmFuZ2UKKyAgICAgICAqICBbQGEgX19maXJzdCxAYSBfX2xhc3QpIGludG8gdGhlICVmb3J3YXJkX2xpc3QgYWZ0ZXIgdGhlCisgICAgICAgKiAgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IEBhIF9fcG9zLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9wZXJhdGlvbiBpcyBsaW5lYXIgaW4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbnNlcnRlZCBhbmQKKyAgICAgICAqICBkb2VzIG5vdCBpbnZhbGlkYXRlIGl0ZXJhdG9ycyBhbmQgcmVmZXJlbmNlcy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyB0aGUgY29udGVudHMgb2YgYW4gaW5pdGlhbGl6ZXJfbGlzdCBpbnRvCisgICAgICAgKiAgICAgICAgICAlZm9yd2FyZF9saXN0IGFmdGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgQW4gaXRlcmF0b3IgaW50byB0aGUgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9faWwgIEFuIGluaXRpYWxpemVyX2xpc3Qgb2YgdmFsdWVfdHlwZS4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBpbnNlcnRlZCBlbGVtZW50CisgICAgICAgKiAgICAgICAgICAgb3IgQGEgX19wb3MgaWYgQGEgX19pbCBpcyBlbXB0eS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBjb3BpZXMgb2YgdGhlIGRhdGEgaW4gdGhlCisgICAgICAgKiAgaW5pdGlhbGl6ZXJfbGlzdCBAYSBfX2lsIGludG8gdGhlICVmb3J3YXJkX2xpc3QgYmVmb3JlIHRoZSBsb2NhdGlvbgorICAgICAgICogIHNwZWNpZmllZCBieSBAYSBfX3Bvcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRpb24gaXMgbGluZWFyIGluIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW5zZXJ0ZWQgYW5kCisgICAgICAgKiAgZG9lcyBub3QgaW52YWxpZGF0ZSBpdGVyYXRvcnMgYW5kIHJlZmVyZW5jZXMuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9faWwpCisgICAgICB7IHJldHVybiBpbnNlcnRfYWZ0ZXIoX19wb3MsIF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmVzIHRoZSBlbGVtZW50IHBvaW50ZWQgdG8gYnkgdGhlIGl0ZXJhdG9yIGZvbGxvd2luZworICAgICAgICogICAgICAgICAgQGMgcG9zLgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIEl0ZXJhdG9yIHBvaW50aW5nIGJlZm9yZSBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZWxlbWVudCBmb2xsb3dpbmcgdGhlIG9uZQorICAgICAgICogICAgICAgICAgIHRoYXQgd2FzIGVyYXNlZCwgb3IgZW5kKCkgaWYgbm8gc3VjaCBlbGVtZW50IGV4aXN0cy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGVyYXNlIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBhbmQKKyAgICAgICAqICB0aHVzIHNob3J0ZW4gdGhlICVmb3J3YXJkX2xpc3QgYnkgb25lLgorICAgICAgICoKKyAgICAgICAqICBEdWUgdG8gdGhlIG5hdHVyZSBvZiBhICVmb3J3YXJkX2xpc3QgdGhpcyBvcGVyYXRpb24gY2FuIGJlIGRvbmUKKyAgICAgICAqICBpbiBjb25zdGFudCB0aW1lLCBhbmQgb25seSBpbnZhbGlkYXRlcyBpdGVyYXRvcnMvcmVmZXJlbmNlcyB0bworICAgICAgICogIHRoZSBlbGVtZW50IGJlaW5nIHJlbW92ZWQuICBUaGUgdXNlciBpcyBhbHNvIGNhdXRpb25lZCB0aGF0CisgICAgICAgKiAgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnQKKyAgICAgICAqICBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4KKyAgICAgICAqICBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fZXJhc2VfYWZ0ZXIoY29uc3RfY2FzdDxfTm9kZV9iYXNlKj4KKwkJCQkJICAgICAoX19wb3MuX01fbm9kZSkpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBhIHJhbmdlIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIEl0ZXJhdG9yIHBvaW50aW5nIGJlZm9yZSB0aGUgZmlyc3QgZWxlbWVudCB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgIGVyYXNlZC4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gb25lIHBhc3QgdGhlIGxhc3QgZWxlbWVudCB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgICBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiAgQCBfX2xhc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBlcmFzZSB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlCisgICAgICAgKiAgQGEgKF9fcG9zLF9fbGFzdCkgYW5kIHNob3J0ZW4gdGhlICVmb3J3YXJkX2xpc3QgYWNjb3JkaW5nbHkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgb3BlcmF0aW9uIGlzIGxpbmVhciB0aW1lIGluIHRoZSBzaXplIG9mIHRoZSByYW5nZSBhbmQgb25seQorICAgICAgICogIGludmFsaWRhdGVzIGl0ZXJhdG9ycy9yZWZlcmVuY2VzIHRvIHRoZSBlbGVtZW50IGJlaW5nIHJlbW92ZWQuCisgICAgICAgKiAgVGhlIHVzZXIgaXMgYWxzbyBjYXV0aW9uZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZQorICAgICAgICogIGVsZW1lbnRzLCBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZQorICAgICAgICogIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlcgorICAgICAgICogIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fZXJhc2VfYWZ0ZXIoY29uc3RfY2FzdDxfTm9kZV9iYXNlKj4KKwkJCQkJICAgICAoX19wb3MuX01fbm9kZSksCisJCQkJCSAgICAgY29uc3RfY2FzdDxfTm9kZV9iYXNlKj4KKwkJCQkJICAgICAoX19sYXN0Ll9NX25vZGUpKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTd2FwcyBkYXRhIHdpdGggYW5vdGhlciAlZm9yd2FyZF9saXN0LgorICAgICAgICogIEBwYXJhbSAgX19saXN0ICBBICVmb3J3YXJkX2xpc3Qgb2YgdGhlIHNhbWUgZWxlbWVudCBhbmQgYWxsb2NhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgICAgIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGV4Y2hhbmdlcyB0aGUgZWxlbWVudHMgYmV0d2VlbiB0d28gbGlzdHMgaW4gY29uc3RhbnQKKyAgICAgICAqICB0aW1lLiAgTm90ZSB0aGF0IHRoZSBnbG9iYWwgc3RkOjpzd2FwKCkgZnVuY3Rpb24gaXMKKyAgICAgICAqICBzcGVjaWFsaXplZCBzdWNoIHRoYXQgc3RkOjpzd2FwKGwxLGwyKSB3aWxsIGZlZWQgdG8gdGhpcworICAgICAgICogIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzd2FwKGZvcndhcmRfbGlzdCYgX19saXN0KQorICAgICAgbm9leGNlcHQoX05vZGVfYWxsb2NfdHJhaXRzOjpfU19ub3Rocm93X3N3YXAoKSkKKyAgICAgIHsKKyAgICAgICAgc3RkOjpzd2FwKHRoaXMtPl9NX2ltcGwuX01faGVhZC5fTV9uZXh0LAorCQkgIF9fbGlzdC5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCk7CisJX05vZGVfYWxsb2NfdHJhaXRzOjpfU19vbl9zd2FwKHRoaXMtPl9NX2dldF9Ob2RlX2FsbG9jYXRvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19saXN0Ll9NX2dldF9Ob2RlX2FsbG9jYXRvcigpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFJlc2l6ZXMgdGhlICVmb3J3YXJkX2xpc3QgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YKKyAgICAgICAqICAgICAgICAgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtIF9fc3ogTnVtYmVyIG9mIGVsZW1lbnRzIHRoZSAlZm9yd2FyZF9saXN0IHNob3VsZCBjb250YWluLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgJXJlc2l6ZSB0aGUgJWZvcndhcmRfbGlzdCB0byB0aGUgc3BlY2lmaWVkCisgICAgICAgKiAgbnVtYmVyIG9mIGVsZW1lbnRzLiAgSWYgdGhlIG51bWJlciBpcyBzbWFsbGVyIHRoYW4gdGhlCisgICAgICAgKiAgJWZvcndhcmRfbGlzdCdzIGN1cnJlbnQgbnVtYmVyIG9mIGVsZW1lbnRzIHRoZSAlZm9yd2FyZF9saXN0CisgICAgICAgKiAgaXMgdHJ1bmNhdGVkLCBvdGhlcndpc2UgdGhlICVmb3J3YXJkX2xpc3QgaXMgZXh0ZW5kZWQgYW5kIHRoZQorICAgICAgICogIG5ldyBlbGVtZW50cyBhcmUgZGVmYXVsdCBjb25zdHJ1Y3RlZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6KTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFJlc2l6ZXMgdGhlICVmb3J3YXJkX2xpc3QgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YKKyAgICAgICAqICAgICAgICAgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtIF9fc3ogTnVtYmVyIG9mIGVsZW1lbnRzIHRoZSAlZm9yd2FyZF9saXN0IHNob3VsZCBjb250YWluLgorICAgICAgICogIEBwYXJhbSBfX3ZhbCBEYXRhIHdpdGggd2hpY2ggbmV3IGVsZW1lbnRzIHNob3VsZCBiZSBwb3B1bGF0ZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCAlcmVzaXplIHRoZSAlZm9yd2FyZF9saXN0IHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgICAqICBudW1iZXIgb2YgZWxlbWVudHMuICBJZiB0aGUgbnVtYmVyIGlzIHNtYWxsZXIgdGhhbiB0aGUKKyAgICAgICAqICAlZm9yd2FyZF9saXN0J3MgY3VycmVudCBudW1iZXIgb2YgZWxlbWVudHMgdGhlICVmb3J3YXJkX2xpc3QKKyAgICAgICAqICBpcyB0cnVuY2F0ZWQsIG90aGVyd2lzZSB0aGUgJWZvcndhcmRfbGlzdCBpcyBleHRlbmRlZCBhbmQgbmV3CisgICAgICAgKiAgZWxlbWVudHMgYXJlIHBvcHVsYXRlZCB3aXRoIGdpdmVuIGRhdGEuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEVyYXNlcyBhbGwgdGhlIGVsZW1lbnRzLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcworICAgICAgICogIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlCisgICAgICAgKiAgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LgorICAgICAgICogIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgbm9leGNlcHQKKyAgICAgIHsgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoJnRoaXMtPl9NX2ltcGwuX01faGVhZCwgMCk7IH0KKworICAgICAgLy8gMjMuMy40LjYgZm9yd2FyZF9saXN0IG9wZXJhdGlvbnM6CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IGNvbnRlbnRzIG9mIGFub3RoZXIgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZWxlbWVudCB0byBpbnNlcnQgYWZ0ZXIuCisgICAgICAgKiAgQHBhcmFtICBfX2xpc3QgIFNvdXJjZSBsaXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGUgZWxlbWVudHMgb2YgQGEgbGlzdCBhcmUgaW5zZXJ0ZWQgaW4gY29uc3RhbnQgdGltZSBhZnRlcgorICAgICAgICogIHRoZSBlbGVtZW50IHJlZmVyZW5jZWQgYnkgQGEgcG9zLiAgQGEgbGlzdCBiZWNvbWVzIGFuIGVtcHR5CisgICAgICAgKiAgbGlzdC4KKyAgICAgICAqCisgICAgICAgKiAgUmVxdWlyZXMgdGhpcyAhPSBAYSB4LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIGZvcndhcmRfbGlzdCYmIF9fbGlzdCkKKyAgICAgIHsKKwlpZiAoIV9fbGlzdC5lbXB0eSgpKQorCSAgX01fc3BsaWNlX2FmdGVyKF9fcG9zLCBfX2xpc3QuYmVmb3JlX2JlZ2luKCksIF9fbGlzdC5lbmQoKSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgZm9yd2FyZF9saXN0JiBfX2xpc3QpCisgICAgICB7IHNwbGljZV9hZnRlcihfX3Bvcywgc3RkOjptb3ZlKF9fbGlzdCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IGVsZW1lbnQgZnJvbSBhbm90aGVyICVmb3J3YXJkX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGVsZW1lbnQgdG8gaW5zZXJ0IGFmdGVyLgorICAgICAgICogIEBwYXJhbSAgX19saXN0ICBTb3VyY2UgbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9faSAgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBlbGVtZW50IGJlZm9yZSB0aGUgZWxlbWVudAorICAgICAgICogICAgICAgICAgICAgICAgdG8gbW92ZS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgZWxlbWVudCBpbiBsaXN0IEBhIGxpc3QgcmVmZXJlbmNlZCBieSBAYSBpIGFuZAorICAgICAgICogIGluc2VydHMgaXQgaW50byB0aGUgY3VycmVudCBsaXN0IGFmdGVyIEBhIHBvcy4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc3BsaWNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBmb3J3YXJkX2xpc3QmJiBfX2xpc3QsCisgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19pKTsKKworICAgICAgdm9pZAorICAgICAgc3BsaWNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBmb3J3YXJkX2xpc3QmIF9fbGlzdCwKKyAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2kpCisgICAgICB7IHNwbGljZV9hZnRlcihfX3Bvcywgc3RkOjptb3ZlKF9fbGlzdCksIF9faSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgcmFuZ2UgZnJvbSBhbm90aGVyICVmb3J3YXJkX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGVsZW1lbnQgdG8gaW5zZXJ0IGFmdGVyLgorICAgICAgICogIEBwYXJhbSAgX19saXN0ICBTb3VyY2UgbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fYmVmb3JlICBJdGVyYXRvciByZWZlcmVuY2luZyBiZWZvcmUgdGhlIHN0YXJ0IG9mIHJhbmdlCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgaW4gbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGVuZCBvZiByYW5nZSBpbiBsaXN0LgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIGVsZW1lbnRzIGluIHRoZSByYW5nZSAoX19iZWZvcmUsX19sYXN0KSBhbmQgaW5zZXJ0cyB0aGVtCisgICAgICAgKiAgYWZ0ZXIgQGEgX19wb3MgaW4gY29uc3RhbnQgdGltZS4KKyAgICAgICAqCisgICAgICAgKiAgVW5kZWZpbmVkIGlmIEBhIF9fcG9zIGlzIGluIChfX2JlZm9yZSxfX2xhc3QpLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIGZvcndhcmRfbGlzdCYmLAorICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fYmVmb3JlLCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7IF9NX3NwbGljZV9hZnRlcihfX3BvcywgX19iZWZvcmUsIF9fbGFzdCk7IH0KKworICAgICAgdm9pZAorICAgICAgc3BsaWNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBmb3J3YXJkX2xpc3QmLAorICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fYmVmb3JlLCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7IF9NX3NwbGljZV9hZnRlcihfX3BvcywgX19iZWZvcmUsIF9fbGFzdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmUgYWxsIGVsZW1lbnRzIGVxdWFsIHRvIHZhbHVlLgorICAgICAgICogIEBwYXJhbSAgX192YWwgIFRoZSB2YWx1ZSB0byByZW1vdmUuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgZXZlcnkgZWxlbWVudCBpbiB0aGUgbGlzdCBlcXVhbCB0byBAYSBfX3ZhbC4KKyAgICAgICAqICBSZW1haW5pbmcgZWxlbWVudHMgc3RheSBpbiBsaXN0IG9yZGVyLiAgTm90ZSB0aGF0IHRoaXMKKyAgICAgICAqICBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50cworICAgICAgICogIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90CisgICAgICAgKiAgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncworICAgICAgICogIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZW1vdmUoY29uc3QgX1RwJiBfX3ZhbCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIGFsbCBlbGVtZW50cyBzYXRpc2Z5aW5nIGEgcHJlZGljYXRlLgorICAgICAgICogIEBwYXJhbSAgX19wcmVkICBVbmFyeSBwcmVkaWNhdGUgZnVuY3Rpb24gb3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIGxpc3QgZm9yIHdoaWNoIHRoZSBwcmVkaWNhdGUKKyAgICAgICAqICByZXR1cm5zIHRydWUuICBSZW1haW5pbmcgZWxlbWVudHMgc3RheSBpbiBsaXN0IG9yZGVyLiAgTm90ZQorICAgICAgICogIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZQorICAgICAgICogIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMKKyAgICAgICAqICBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncworICAgICAgICogIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHJlZD4KKyAgICAgICAgdm9pZAorICAgICAgICByZW1vdmVfaWYoX1ByZWQgX19wcmVkKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmUgY29uc2VjdXRpdmUgZHVwbGljYXRlIGVsZW1lbnRzLgorICAgICAgICoKKyAgICAgICAqICBGb3IgZWFjaCBjb25zZWN1dGl2ZSBzZXQgb2YgZWxlbWVudHMgd2l0aCB0aGUgc2FtZSB2YWx1ZSwKKyAgICAgICAqICByZW1vdmUgYWxsIGJ1dCB0aGUgZmlyc3Qgb25lLiAgUmVtYWluaW5nIGVsZW1lbnRzIHN0YXkgaW4KKyAgICAgICAqICBsaXN0IG9yZGVyLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlCisgICAgICAgKiAgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywKKyAgICAgICAqICB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nCisgICAgICAgKiAgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgdW5pcXVlKCkKKyAgICAgIHsgdW5pcXVlKHN0ZDo6ZXF1YWxfdG88X1RwPigpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBjb25zZWN1dGl2ZSBlbGVtZW50cyBzYXRpc2Z5aW5nIGEgcHJlZGljYXRlLgorICAgICAgICogIEBwYXJhbSAgX19iaW5hcnlfcHJlZCAgQmluYXJ5IHByZWRpY2F0ZSBmdW5jdGlvbiBvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIEZvciBlYWNoIGNvbnNlY3V0aXZlIHNldCBvZiBlbGVtZW50cyBbZmlyc3QsbGFzdCkgdGhhdAorICAgICAgICogIHNhdGlzZnkgcHJlZGljYXRlKGZpcnN0LGkpIHdoZXJlIGkgaXMgYW4gaXRlcmF0b3IgaW4KKyAgICAgICAqICBbZmlyc3QsbGFzdCksIHJlbW92ZSBhbGwgYnV0IHRoZSBmaXJzdCBvbmUuICBSZW1haW5pbmcKKyAgICAgICAqICBlbGVtZW50cyBzdGF5IGluIGxpc3Qgb3JkZXIuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5CisgICAgICAgKiAgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlCisgICAgICAgKiAgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LgorICAgICAgICogIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaW5QcmVkPgorICAgICAgICB2b2lkCisgICAgICAgIHVuaXF1ZShfQmluUHJlZCBfX2JpbmFyeV9wcmVkKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNZXJnZSBzb3J0ZWQgbGlzdHMuCisgICAgICAgKiAgQHBhcmFtICBfX2xpc3QgIFNvcnRlZCBsaXN0IHRvIG1lcmdlLgorICAgICAgICoKKyAgICAgICAqICBBc3N1bWVzIHRoYXQgYm90aCBAYSBsaXN0IGFuZCB0aGlzIGxpc3QgYXJlIHNvcnRlZCBhY2NvcmRpbmcgdG8KKyAgICAgICAqICBvcGVyYXRvcjwoKS4gIE1lcmdlcyBlbGVtZW50cyBvZiBAYSBfX2xpc3QgaW50byB0aGlzIGxpc3QgaW4KKyAgICAgICAqICBzb3J0ZWQgb3JkZXIsIGxlYXZpbmcgQGEgX19saXN0IGVtcHR5IHdoZW4gY29tcGxldGUuICBFbGVtZW50cyBpbgorICAgICAgICogIHRoaXMgbGlzdCBwcmVjZWRlIGVsZW1lbnRzIGluIEBhIF9fbGlzdCB0aGF0IGFyZSBlcXVhbC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgbWVyZ2UoZm9yd2FyZF9saXN0JiYgX19saXN0KQorICAgICAgeyBtZXJnZShzdGQ6Om1vdmUoX19saXN0KSwgc3RkOjpsZXNzPF9UcD4oKSk7IH0KKworICAgICAgdm9pZAorICAgICAgbWVyZ2UoZm9yd2FyZF9saXN0JiBfX2xpc3QpCisgICAgICB7IG1lcmdlKHN0ZDo6bW92ZShfX2xpc3QpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1lcmdlIHNvcnRlZCBsaXN0cyBhY2NvcmRpbmcgdG8gY29tcGFyaXNvbiBmdW5jdGlvbi4KKyAgICAgICAqICBAcGFyYW0gIF9fbGlzdCAgU29ydGVkIGxpc3QgdG8gbWVyZ2UuCisgICAgICAgKiAgQHBhcmFtICBfX2NvbXAgQ29tcGFyaXNvbiBmdW5jdGlvbiBkZWZpbmluZyBzb3J0IG9yZGVyLgorICAgICAgICoKKyAgICAgICAqICBBc3N1bWVzIHRoYXQgYm90aCBAYSBfX2xpc3QgYW5kIHRoaXMgbGlzdCBhcmUgc29ydGVkIGFjY29yZGluZyB0bworICAgICAgICogIGNvbXAuICBNZXJnZXMgZWxlbWVudHMgb2YgQGEgX19saXN0IGludG8gdGhpcyBsaXN0CisgICAgICAgKiAgaW4gc29ydGVkIG9yZGVyLCBsZWF2aW5nIEBhIF9fbGlzdCBlbXB0eSB3aGVuIGNvbXBsZXRlLiAgRWxlbWVudHMKKyAgICAgICAqICBpbiB0aGlzIGxpc3QgcHJlY2VkZSBlbGVtZW50cyBpbiBAYSBfX2xpc3QgdGhhdCBhcmUgZXF1aXZhbGVudAorICAgICAgICogIGFjY29yZGluZyB0byBjb21wKCkuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db21wPgorICAgICAgICB2b2lkCisgICAgICAgIG1lcmdlKGZvcndhcmRfbGlzdCYmIF9fbGlzdCwgX0NvbXAgX19jb21wKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbXA+CisgICAgICAgIHZvaWQKKyAgICAgICAgbWVyZ2UoZm9yd2FyZF9saXN0JiBfX2xpc3QsIF9Db21wIF9fY29tcCkKKyAgICAgICAgeyBtZXJnZShzdGQ6Om1vdmUoX19saXN0KSwgX19jb21wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNvcnQgdGhlIGVsZW1lbnRzIG9mIHRoZSBsaXN0LgorICAgICAgICoKKyAgICAgICAqICBTb3J0cyB0aGUgZWxlbWVudHMgb2YgdGhpcyBsaXN0IGluIE5sb2dOIHRpbWUuICBFcXVpdmFsZW50CisgICAgICAgKiAgZWxlbWVudHMgcmVtYWluIGluIGxpc3Qgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHNvcnQoKQorICAgICAgeyBzb3J0KHN0ZDo6bGVzczxfVHA+KCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU29ydCB0aGUgZm9yd2FyZF9saXN0IHVzaW5nIGEgY29tcGFyaXNvbiBmdW5jdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgU29ydHMgdGhlIGVsZW1lbnRzIG9mIHRoaXMgbGlzdCBpbiBObG9nTiB0aW1lLiAgRXF1aXZhbGVudAorICAgICAgICogIGVsZW1lbnRzIHJlbWFpbiBpbiBsaXN0IG9yZGVyLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29tcD4KKyAgICAgICAgdm9pZAorICAgICAgICBzb3J0KF9Db21wIF9fY29tcCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV2ZXJzZSB0aGUgZWxlbWVudHMgaW4gbGlzdC4KKyAgICAgICAqCisgICAgICAgKiAgUmV2ZXJzZSB0aGUgb3JkZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgaW4gbGluZWFyIHRpbWUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJldmVyc2UoKSBub2V4Y2VwdAorICAgICAgeyB0aGlzLT5fTV9pbXBsLl9NX2hlYWQuX01fcmV2ZXJzZV9hZnRlcigpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSByYW5nZSBjb25zdHJ1Y3RvciB0byBpbXBsZW1lbnQgWzIzLjMuNC4yXS85CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9yYW5nZV9pbml0aWFsaXplKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7CisKKyAgICAgIC8vIENhbGxlZCBieSBmb3J3YXJkX2xpc3Qobix2LGEpLCBhbmQgdGhlIHJhbmdlIGNvbnN0cnVjdG9yIHdoZW4gaXQKKyAgICAgIC8vIHR1cm5zIG91dCB0byBiZSB0aGUgc2FtZSB0aGluZy4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2ZpbGxfaW5pdGlhbGl6ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbHVlKTsKKworICAgICAgLy8gQ2FsbGVkIGJ5IHNwbGljZV9hZnRlciBhbmQgaW5zZXJ0X2FmdGVyLgorICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX3NwbGljZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgY29uc3RfaXRlcmF0b3IgX19iZWZvcmUsCisJCSAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCk7CisKKyAgICAgIC8vIENhbGxlZCBieSBmb3J3YXJkX2xpc3QobikuCisgICAgICB2b2lkCisgICAgICBfTV9kZWZhdWx0X2luaXRpYWxpemUoc2l6ZV90eXBlIF9fbik7CisKKyAgICAgIC8vIENhbGxlZCBieSByZXNpemUoc3opLgorICAgICAgdm9pZAorICAgICAgX01fZGVmYXVsdF9pbnNlcnRfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24pOworCisgICAgICAvLyBDYWxsZWQgYnkgb3BlcmF0b3I9KGZvcndhcmRfbGlzdCYmKQorICAgICAgdm9pZAorICAgICAgX01fbW92ZV9hc3NpZ24oZm9yd2FyZF9saXN0JiYgX19saXN0LCBzdGQ6OnRydWVfdHlwZSkgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgc3RkOjpzd2FwKHRoaXMtPl9NX2ltcGwuX01faGVhZC5fTV9uZXh0LAorICAgICAgICAgICAgICAgICAgX19saXN0Ll9NX2ltcGwuX01faGVhZC5fTV9uZXh0KTsKKyAgICAgICAgc3RkOjpfX2FsbG9jX29uX21vdmUodGhpcy0+X01fZ2V0X05vZGVfYWxsb2NhdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbGlzdC5fTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSk7CisgICAgICB9CisKKyAgICAgIC8vIENhbGxlZCBieSBvcGVyYXRvcj0oZm9yd2FyZF9saXN0JiYpCisgICAgICB2b2lkCisgICAgICBfTV9tb3ZlX2Fzc2lnbihmb3J3YXJkX2xpc3QmJiBfX2xpc3QsIHN0ZDo6ZmFsc2VfdHlwZSkKKyAgICAgIHsKKyAgICAgICAgaWYgKF9fbGlzdC5fTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSA9PSB0aGlzLT5fTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSkKKyAgICAgICAgICBfTV9tb3ZlX2Fzc2lnbihzdGQ6Om1vdmUoX19saXN0KSwgc3RkOjp0cnVlX3R5cGUoKSk7CisgICAgICAgIGVsc2UKKwkgIC8vIFRoZSBydmFsdWUncyBhbGxvY2F0b3IgY2Fubm90IGJlIG1vdmVkLCBvciBpcyBub3QgZXF1YWwsCisJICAvLyBzbyB3ZSBuZWVkIHRvIGluZGl2aWR1YWxseSBtb3ZlIGVhY2ggZWxlbWVudC4KKwkgIHRoaXMtPmFzc2lnbihzdGQ6Ol9fbWFrZV9tb3ZlX2lmX25vZXhjZXB0X2l0ZXJhdG9yKF9fbGlzdC5iZWdpbigpKSwKKwkJICAgICAgIHN0ZDo6X19tYWtlX21vdmVfaWZfbm9leGNlcHRfaXRlcmF0b3IoX19saXN0LmVuZCgpKSk7CisgICAgICB9CisKKyAgICAgIC8vIENhbGxlZCBieSBhc3NpZ24oX0lucHV0SXRlcmF0b3IsIF9JbnB1dEl0ZXJhdG9yKSBpZiBfVHAgaXMKKyAgICAgIC8vIENvcHlBc3NpZ25hYmxlLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJdm9pZAorICAgICAgICBfTV9hc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCB0cnVlX3R5cGUpCisJeworCSAgYXV0byBfX3ByZXYgPSBiZWZvcmVfYmVnaW4oKTsKKwkgIGF1dG8gX19jdXJyID0gYmVnaW4oKTsKKwkgIGF1dG8gX19lbmQgPSBlbmQoKTsKKwkgIHdoaWxlIChfX2N1cnIgIT0gX19lbmQgJiYgX19maXJzdCAhPSBfX2xhc3QpCisJICAgIHsKKwkgICAgICAqX19jdXJyID0gKl9fZmlyc3Q7CisJICAgICAgKytfX3ByZXY7CisJICAgICAgKytfX2N1cnI7CisJICAgICAgKytfX2ZpcnN0OworCSAgICB9CisJICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisJICAgIGluc2VydF9hZnRlcihfX3ByZXYsIF9fZmlyc3QsIF9fbGFzdCk7CisJICBlbHNlIGlmIChfX2N1cnIgIT0gX19lbmQpCisJICAgIGVyYXNlX2FmdGVyKF9fcHJldiwgX19lbmQpOworICAgICAgICB9CisKKyAgICAgIC8vIENhbGxlZCBieSBhc3NpZ24oX0lucHV0SXRlcmF0b3IsIF9JbnB1dEl0ZXJhdG9yKSBpZiBfVHAgaXMgbm90CisgICAgICAvLyBDb3B5QXNzaWduYWJsZS4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXZvaWQKKyAgICAgICAgX01fYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgZmFsc2VfdHlwZSkKKwl7CisJICBjbGVhcigpOworCSAgaW5zZXJ0X2FmdGVyKGNiZWZvcmVfYmVnaW4oKSwgX19maXJzdCwgX19sYXN0KTsKKwl9CisKKyAgICAgIC8vIENhbGxlZCBieSBhc3NpZ24oc2l6ZV90eXBlLCBjb25zdCBfVHAmKSBpZiBUcCBpcyBDb3B5QXNzaWduYWJsZQorICAgICAgdm9pZAorICAgICAgX01fYXNzaWduX24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCwgdHJ1ZV90eXBlKQorICAgICAgeworCWF1dG8gX19wcmV2ID0gYmVmb3JlX2JlZ2luKCk7CisJYXV0byBfX2N1cnIgPSBiZWdpbigpOworCWF1dG8gX19lbmQgPSBlbmQoKTsKKwl3aGlsZSAoX19jdXJyICE9IF9fZW5kICYmIF9fbiA+IDApCisJICB7CisJICAgICpfX2N1cnIgPSBfX3ZhbDsKKwkgICAgKytfX3ByZXY7CisJICAgICsrX19jdXJyOworCSAgICAtLV9fbjsKKwkgIH0KKwlpZiAoX19uID4gMCkKKwkgIGluc2VydF9hZnRlcihfX3ByZXYsIF9fbiwgX192YWwpOworCWVsc2UgaWYgKF9fY3VyciAhPSBfX2VuZCkKKwkgIGVyYXNlX2FmdGVyKF9fcHJldiwgX19lbmQpOworICAgICAgfQorCisgICAgICAvLyBDYWxsZWQgYnkgYXNzaWduKHNpemVfdHlwZSwgY29uc3QgX1RwJikgaWYgVHAgaXMgbm9uLUNvcHlBc3NpZ25hYmxlCisgICAgICB2b2lkCisgICAgICBfTV9hc3NpZ25fbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsLCBmYWxzZV90eXBlKQorICAgICAgeworCWNsZWFyKCk7CisJaW5zZXJ0X2FmdGVyKGNiZWZvcmVfYmVnaW4oKSwgX19uLCBfX3ZhbCk7CisgICAgICB9CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiAgRm9yd2FyZCBsaXN0IGVxdWFsaXR5IGNvbXBhcmlzb24uCisgICAqICBAcGFyYW0gIF9fbHggIEEgJWZvcndhcmRfbGlzdAorICAgKiAgQHBhcmFtICBfX2x5ICBBICVmb3J3YXJkX2xpc3Qgb2YgdGhlIHNhbWUgdHlwZSBhcyBAYSBfX2x4LgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZmYgdGhlIGVsZW1lbnRzIG9mIHRoZSBmb3J3YXJkIGxpc3RzIGFyZSBlcXVhbC4KKyAgICoKKyAgICogIFRoaXMgaXMgYW4gZXF1aXZhbGVuY2UgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIG51bWJlciBvZiAKKyAgICogIGVsZW1lbnRzIG9mIHRoZSBmb3J3YXJkIGxpc3RzLiAgRGVxdWVzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQKKyAgICogIGlmIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgY29tcGFyZSBlcXVhbC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KTsKKworICAvKioKKyAgICogIEBicmllZiAgRm9yd2FyZCBsaXN0IG9yZGVyaW5nIHJlbGF0aW9uLgorICAgKiAgQHBhcmFtICBfX2x4ICBBICVmb3J3YXJkX2xpc3QuCisgICAqICBAcGFyYW0gIF9fbHkgIEEgJWZvcndhcmRfbGlzdCBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIF9fbHguCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiBAYSBfX2x4IGlzIGxleGljb2dyYXBoaWNhbGx5IGxlc3MgdGhhbiBAYSBfX2x5LgorICAgKgorICAgKiAgVGhpcyBpcyBhIHRvdGFsIG9yZGVyaW5nIHJlbGF0aW9uLiAgSXQgaXMgbGluZWFyIGluIHRoZSBudW1iZXIgb2YgCisgICAqICBlbGVtZW50cyBvZiB0aGUgZm9yd2FyZCBsaXN0cy4gIFRoZSBlbGVtZW50cyBtdXN0IGJlIGNvbXBhcmFibGUKKyAgICogIHdpdGggQGMgPC4KKyAgICoKKyAgICogIFNlZSBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKCkgZm9yIGhvdyB0aGUgZGV0ZXJtaW5hdGlvbiBpcyBtYWRlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IHJldHVybiBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9fbHguY2JlZ2luKCksIF9fbHguY2VuZCgpLAorCQkJCQkgIF9fbHkuY2JlZ2luKCksIF9fbHkuY2VuZCgpKTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcj09CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x4LAorICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IHJldHVybiAhKF9fbHggPT0gX19seSk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHkpCisgICAgeyByZXR1cm4gKF9fbHkgPCBfX2x4KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgcmV0dXJuICEoX19seCA8IF9fbHkpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHkpCisgICAgeyByZXR1cm4gIShfX2x5IDwgX19seCk7IH0KKworICAvLy8gU2VlIHN0ZDo6Zm9yd2FyZF9saXN0Ojpzd2FwKCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x4LAorCSBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgX19seC5zd2FwKF9fbHkpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8vIF9GT1JXQVJEX0xJU1RfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2ZvcndhcmRfbGlzdC50Y2MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvZm9yd2FyZF9saXN0LnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWNlODBjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2ZvcndhcmRfbGlzdC50Y2MKQEAgLTAsMCArMSw1MTEgQEAKKy8vIDxmb3J3YXJkX2xpc3QudGNjPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9mb3J3YXJkX2xpc3QudGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7Zm9yd2FyZF9saXN0fQorICovCisKKyNpZm5kZWYgX0ZPUldBUkRfTElTVF9UQ0MKKyNkZWZpbmUgX0ZPUldBUkRfTElTVF9UQ0MgMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBfRndkX2xpc3RfYmFzZTxfVHAsIF9BbGxvYz46OgorICAgIF9Gd2RfbGlzdF9iYXNlKF9Gd2RfbGlzdF9iYXNlJiYgX19sc3QsIGNvbnN0IF9Ob2RlX2FsbG9jX3R5cGUmIF9fYSkKKyAgICA6IF9NX2ltcGwoX19hKQorICAgIHsKKyAgICAgIGlmIChfX2xzdC5fTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSA9PSBfX2EpCisJeworCSAgdGhpcy0+X01faW1wbC5fTV9oZWFkLl9NX25leHQgPSBfX2xzdC5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dDsKKwkgIF9fbHN0Ll9NX2ltcGwuX01faGVhZC5fTV9uZXh0ID0gMDsKKwl9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB0aGlzLT5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCA9IDA7CisgICAgICAgICAgX0Z3ZF9saXN0X25vZGVfYmFzZSogX190byA9ICZ0aGlzLT5fTV9pbXBsLl9NX2hlYWQ7CisgICAgICAgICAgX05vZGUqIF9fY3VyciA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oX19sc3QuX01faW1wbC5fTV9oZWFkLl9NX25leHQpOworCisgICAgICAgICAgd2hpbGUgKF9fY3VycikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX190by0+X01fbmV4dCA9CisgICAgICAgICAgICAgICAgX01fY3JlYXRlX25vZGUoc3RkOjptb3ZlX2lmX25vZXhjZXB0KCpfX2N1cnItPl9NX3ZhbHB0cigpKSk7CisgICAgICAgICAgICAgIF9fdG8gPSBfX3RvLT5fTV9uZXh0OworICAgICAgICAgICAgICBfX2N1cnIgPSBzdGF0aWNfY2FzdDxfTm9kZSo+KF9fY3Vyci0+X01fbmV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICBfRndkX2xpc3Rfbm9kZV9iYXNlKgorICAgICAgX0Z3ZF9saXN0X2Jhc2U8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX2luc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICB7CisgICAgICAgIF9Gd2RfbGlzdF9ub2RlX2Jhc2UqIF9fdG8KKwkgID0gY29uc3RfY2FzdDxfRndkX2xpc3Rfbm9kZV9iYXNlKj4oX19wb3MuX01fbm9kZSk7CisJX05vZGUqIF9fdGhpbmcgPSBfTV9jcmVhdGVfbm9kZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgICAgICBfX3RoaW5nLT5fTV9uZXh0ID0gX190by0+X01fbmV4dDsKKyAgICAgICAgX190by0+X01fbmV4dCA9IF9fdGhpbmc7CisgICAgICAgIHJldHVybiBfX3RvLT5fTV9uZXh0OworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9Gd2RfbGlzdF9ub2RlX2Jhc2UqCisgICAgX0Z3ZF9saXN0X2Jhc2U8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9lcmFzZV9hZnRlcihfRndkX2xpc3Rfbm9kZV9iYXNlKiBfX3BvcykKKyAgICB7CisgICAgICBfTm9kZSogX19jdXJyID0gc3RhdGljX2Nhc3Q8X05vZGUqPihfX3Bvcy0+X01fbmV4dCk7CisgICAgICBfX3Bvcy0+X01fbmV4dCA9IF9fY3Vyci0+X01fbmV4dDsKKyAgICAgIF9UcF9hbGxvY190eXBlIF9fYShfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSk7CisgICAgICBhbGxvY2F0b3JfdHJhaXRzPF9UcF9hbGxvY190eXBlPjo6ZGVzdHJveShfX2EsIF9fY3Vyci0+X01fdmFscHRyKCkpOworICAgICAgX19jdXJyLT5+X05vZGUoKTsKKyAgICAgIF9NX3B1dF9ub2RlKF9fY3Vycik7CisgICAgICByZXR1cm4gX19wb3MtPl9NX25leHQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9Gd2RfbGlzdF9ub2RlX2Jhc2UqCisgICAgX0Z3ZF9saXN0X2Jhc2U8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9lcmFzZV9hZnRlcihfRndkX2xpc3Rfbm9kZV9iYXNlKiBfX3BvcywgCisgICAgICAgICAgICAgICAgICAgX0Z3ZF9saXN0X25vZGVfYmFzZSogX19sYXN0KQorICAgIHsKKyAgICAgIF9Ob2RlKiBfX2N1cnIgPSBzdGF0aWNfY2FzdDxfTm9kZSo+KF9fcG9zLT5fTV9uZXh0KTsKKyAgICAgIHdoaWxlIChfX2N1cnIgIT0gX19sYXN0KQorICAgICAgICB7CisgICAgICAgICAgX05vZGUqIF9fdGVtcCA9IF9fY3VycjsKKyAgICAgICAgICBfX2N1cnIgPSBzdGF0aWNfY2FzdDxfTm9kZSo+KF9fY3Vyci0+X01fbmV4dCk7CisJICBfVHBfYWxsb2NfdHlwZSBfX2EoX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkpOworCSAgYWxsb2NhdG9yX3RyYWl0czxfVHBfYWxsb2NfdHlwZT46OmRlc3Ryb3koX19hLCBfX3RlbXAtPl9NX3ZhbHB0cigpKTsKKwkgIF9fdGVtcC0+fl9Ob2RlKCk7CisgICAgICAgICAgX01fcHV0X25vZGUoX190ZW1wKTsKKyAgICAgICAgfQorICAgICAgX19wb3MtPl9NX25leHQgPSBfX2xhc3Q7CisgICAgICByZXR1cm4gX19sYXN0OworICAgIH0KKworICAvLyBDYWxsZWQgYnkgdGhlIHJhbmdlIGNvbnN0cnVjdG9yIHRvIGltcGxlbWVudCBbMjMuMy40LjJdLzkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX3JhbmdlX2luaXRpYWxpemUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgeworICAgICAgICBfTm9kZV9iYXNlKiBfX3RvID0gJnRoaXMtPl9NX2ltcGwuX01faGVhZDsKKyAgICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICAgICAgeworICAgICAgICAgICAgX190by0+X01fbmV4dCA9IHRoaXMtPl9NX2NyZWF0ZV9ub2RlKCpfX2ZpcnN0KTsKKyAgICAgICAgICAgIF9fdG8gPSBfX3RvLT5fTV9uZXh0OworICAgICAgICAgIH0KKyAgICAgIH0KKworICAvLyBDYWxsZWQgYnkgZm9yd2FyZF9saXN0KG4sdixhKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIF9NX2ZpbGxfaW5pdGlhbGl6ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbHVlKQorICAgIHsKKyAgICAgIF9Ob2RlX2Jhc2UqIF9fdG8gPSAmdGhpcy0+X01faW1wbC5fTV9oZWFkOworICAgICAgZm9yICg7IF9fbjsgLS1fX24pCisgICAgICAgIHsKKyAgICAgICAgICBfX3RvLT5fTV9uZXh0ID0gdGhpcy0+X01fY3JlYXRlX25vZGUoX192YWx1ZSk7CisgICAgICAgICAgX190byA9IF9fdG8tPl9NX25leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIF9NX2RlZmF1bHRfaW5pdGlhbGl6ZShzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIF9Ob2RlX2Jhc2UqIF9fdG8gPSAmdGhpcy0+X01faW1wbC5fTV9oZWFkOworICAgICAgZm9yICg7IF9fbjsgLS1fX24pCisgICAgICAgIHsKKyAgICAgICAgICBfX3RvLT5fTV9uZXh0ID0gdGhpcy0+X01fY3JlYXRlX25vZGUoKTsKKyAgICAgICAgICBfX3RvID0gX190by0+X01fbmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JgorICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIG9wZXJhdG9yPShjb25zdCBmb3J3YXJkX2xpc3QmIF9fbGlzdCkKKyAgICB7CisgICAgICBpZiAoJl9fbGlzdCAhPSB0aGlzKQorICAgICAgICB7CisJICBpZiAoX05vZGVfYWxsb2NfdHJhaXRzOjpfU19wcm9wYWdhdGVfb25fY29weV9hc3NpZ24oKSkKKwkgICAgeworICAgICAgICAgICAgICBhdXRvJiBfX3RoaXNfYWxsb2MgPSB0aGlzLT5fTV9nZXRfTm9kZV9hbGxvY2F0b3IoKTsKKyAgICAgICAgICAgICAgYXV0byYgX190aGF0X2FsbG9jID0gX19saXN0Ll9NX2dldF9Ob2RlX2FsbG9jYXRvcigpOworICAgICAgICAgICAgICBpZiAoIV9Ob2RlX2FsbG9jX3RyYWl0czo6X1NfYWx3YXlzX2VxdWFsKCkKKwkgICAgICAgICAgJiYgX190aGlzX2FsbG9jICE9IF9fdGhhdF9hbGxvYykKKwkgICAgICAgIHsKKwkJICAvLyByZXBsYWNlbWVudCBhbGxvY2F0b3IgY2Fubm90IGZyZWUgZXhpc3Rpbmcgc3RvcmFnZQorCQkgIGNsZWFyKCk7CisJCX0KKwkgICAgICBzdGQ6Ol9fYWxsb2Nfb25fY29weShfX3RoaXNfYWxsb2MsIF9fdGhhdF9hbGxvYyk7CisgICAgICAgICAgICB9CisJICBhc3NpZ24oX19saXN0LmNiZWdpbigpLCBfX2xpc3QuY2VuZCgpKTsKKyAgICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6CisgICAgX01fZGVmYXVsdF9pbnNlcnRfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgY29uc3RfaXRlcmF0b3IgX19zYXZlZF9wb3MgPSBfX3BvczsKKyAgICAgIF9fdHJ5CisJeworCSAgZm9yICg7IF9fbjsgLS1fX24pCisJICAgIF9fcG9zID0gZW1wbGFjZV9hZnRlcihfX3Bvcyk7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgZXJhc2VfYWZ0ZXIoX19zYXZlZF9wb3MsICsrX19wb3MpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6CisgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6KQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9fayA9IGJlZm9yZV9iZWdpbigpOworCisgICAgICBzaXplX3R5cGUgX19sZW4gPSAwOworICAgICAgd2hpbGUgKF9fay5fTV9uZXh0KCkgIT0gZW5kKCkgJiYgX19sZW4gPCBfX3N6KQorICAgICAgICB7CisgICAgICAgICAgKytfX2s7CisgICAgICAgICAgKytfX2xlbjsKKyAgICAgICAgfQorICAgICAgaWYgKF9fbGVuID09IF9fc3opCisgICAgICAgIGVyYXNlX2FmdGVyKF9faywgZW5kKCkpOworICAgICAgZWxzZQorCV9NX2RlZmF1bHRfaW5zZXJ0X2FmdGVyKF9faywgX19zeiAtIF9fbGVuKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwpCisgICAgeworICAgICAgaXRlcmF0b3IgX19rID0gYmVmb3JlX2JlZ2luKCk7CisKKyAgICAgIHNpemVfdHlwZSBfX2xlbiA9IDA7CisgICAgICB3aGlsZSAoX19rLl9NX25leHQoKSAhPSBlbmQoKSAmJiBfX2xlbiA8IF9fc3opCisgICAgICAgIHsKKyAgICAgICAgICArK19fazsKKyAgICAgICAgICArK19fbGVuOworICAgICAgICB9CisgICAgICBpZiAoX19sZW4gPT0gX19zeikKKyAgICAgICAgZXJhc2VfYWZ0ZXIoX19rLCBlbmQoKSk7CisgICAgICBlbHNlCisgICAgICAgIGluc2VydF9hZnRlcihfX2ssIF9fc3ogLSBfX2xlbiwgX192YWwpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIF9NX3NwbGljZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywKKwkJICAgIGNvbnN0X2l0ZXJhdG9yIF9fYmVmb3JlLCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgX05vZGVfYmFzZSogX190bXAgPSBjb25zdF9jYXN0PF9Ob2RlX2Jhc2UqPihfX3Bvcy5fTV9ub2RlKTsKKyAgICAgIF9Ob2RlX2Jhc2UqIF9fYiA9IGNvbnN0X2Nhc3Q8X05vZGVfYmFzZSo+KF9fYmVmb3JlLl9NX25vZGUpOworICAgICAgX05vZGVfYmFzZSogX19lbmQgPSBfX2I7CisKKyAgICAgIHdoaWxlIChfX2VuZCAmJiBfX2VuZC0+X01fbmV4dCAhPSBfX2xhc3QuX01fbm9kZSkKKwlfX2VuZCA9IF9fZW5kLT5fTV9uZXh0OworCisgICAgICBpZiAoX19iICE9IF9fZW5kKQorCXJldHVybiBpdGVyYXRvcihfX3RtcC0+X01fdHJhbnNmZXJfYWZ0ZXIoX19iLCBfX2VuZCkpOyAgICAgIAorICAgICAgZWxzZQorCXJldHVybiBpdGVyYXRvcihfX3RtcCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICBzcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIGZvcndhcmRfbGlzdCYmLAorCQkgY29uc3RfaXRlcmF0b3IgX19pKQorICAgIHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIF9faiA9IF9faTsKKyAgICAgICsrX19qOworCisgICAgICBpZiAoX19wb3MgPT0gX19pIHx8IF9fcG9zID09IF9faikKKwlyZXR1cm47CisKKyAgICAgIF9Ob2RlX2Jhc2UqIF9fdG1wID0gY29uc3RfY2FzdDxfTm9kZV9iYXNlKj4oX19wb3MuX01fbm9kZSk7CisgICAgICBfX3RtcC0+X01fdHJhbnNmZXJfYWZ0ZXIoY29uc3RfY2FzdDxfTm9kZV9iYXNlKj4oX19pLl9NX25vZGUpLAorCQkJICAgICAgIGNvbnN0X2Nhc3Q8X05vZGVfYmFzZSo+KF9fai5fTV9ub2RlKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6CisgICAgaW5zZXJ0X2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKQorICAgIHsKKyAgICAgIGlmIChfX24pCisJeworCSAgZm9yd2FyZF9saXN0IF9fdG1wKF9fbiwgX192YWwsIGdldF9hbGxvY2F0b3IoKSk7CisJICByZXR1cm4gX01fc3BsaWNlX2FmdGVyKF9fcG9zLCBfX3RtcC5iZWZvcmVfYmVnaW4oKSwgX190bXAuZW5kKCkpOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gaXRlcmF0b3IoY29uc3RfY2FzdDxfTm9kZV9iYXNlKj4oX19wb3MuX01fbm9kZSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWU+CisgICAgICB0eXBlbmFtZSBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorICAgICAgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6CisgICAgICBpbnNlcnRfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsCisJCSAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwlmb3J3YXJkX2xpc3QgX190bXAoX19maXJzdCwgX19sYXN0LCBnZXRfYWxsb2NhdG9yKCkpOworCWlmICghX190bXAuZW1wdHkoKSkKKwkgIHJldHVybiBfTV9zcGxpY2VfYWZ0ZXIoX19wb3MsIF9fdG1wLmJlZm9yZV9iZWdpbigpLCBfX3RtcC5lbmQoKSk7CisJZWxzZQorCSAgcmV0dXJuIGl0ZXJhdG9yKGNvbnN0X2Nhc3Q8X05vZGVfYmFzZSo+KF9fcG9zLl9NX25vZGUpKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6CisgICAgcmVtb3ZlKGNvbnN0IF9UcCYgX192YWwpCisgICAgeworICAgICAgX05vZGUqIF9fY3VyciA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oJnRoaXMtPl9NX2ltcGwuX01faGVhZCk7CisgICAgICBfTm9kZSogX19leHRyYSA9IDA7CisKKyAgICAgIHdoaWxlIChfTm9kZSogX190bXAgPSBzdGF0aWNfY2FzdDxfTm9kZSo+KF9fY3Vyci0+X01fbmV4dCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKl9fdG1wLT5fTV92YWxwdHIoKSA9PSBfX3ZhbCkKKwkgICAgeworCSAgICAgIGlmIChfX3RtcC0+X01fdmFscHRyKCkgIT0gc3RkOjpfX2FkZHJlc3NvZihfX3ZhbCkpCisJCXsKKwkJICB0aGlzLT5fTV9lcmFzZV9hZnRlcihfX2N1cnIpOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgZWxzZQorCQlfX2V4dHJhID0gX19jdXJyOworCSAgICB9CisJICBfX2N1cnIgPSBzdGF0aWNfY2FzdDxfTm9kZSo+KF9fY3Vyci0+X01fbmV4dCk7CisgICAgICAgIH0KKworICAgICAgaWYgKF9fZXh0cmEpCisJdGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19leHRyYSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QcmVkPgorICAgICAgdm9pZAorICAgICAgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6CisgICAgICByZW1vdmVfaWYoX1ByZWQgX19wcmVkKQorICAgICAgeworCV9Ob2RlKiBfX2N1cnIgPSBzdGF0aWNfY2FzdDxfTm9kZSo+KCZ0aGlzLT5fTV9pbXBsLl9NX2hlYWQpOworICAgICAgICB3aGlsZSAoX05vZGUqIF9fdG1wID0gc3RhdGljX2Nhc3Q8X05vZGUqPihfX2N1cnItPl9NX25leHQpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX3ByZWQoKl9fdG1wLT5fTV92YWxwdHIoKSkpCisgICAgICAgICAgICAgIHRoaXMtPl9NX2VyYXNlX2FmdGVyKF9fY3Vycik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIF9fY3VyciA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oX19jdXJyLT5fTV9uZXh0KTsKKyAgICAgICAgICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpblByZWQ+CisgICAgICB2b2lkCisgICAgICBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICAgIHVuaXF1ZShfQmluUHJlZCBfX2JpbmFyeV9wcmVkKQorICAgICAgeworICAgICAgICBpdGVyYXRvciBfX2ZpcnN0ID0gYmVnaW4oKTsKKyAgICAgICAgaXRlcmF0b3IgX19sYXN0ID0gZW5kKCk7CisgICAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIGl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICAgIHdoaWxlICgrK19fbmV4dCAhPSBfX2xhc3QpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX19iaW5hcnlfcHJlZCgqX19maXJzdCwgKl9fbmV4dCkpCisgICAgICAgICAgICBlcmFzZV9hZnRlcihfX2ZpcnN0KTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBfX2ZpcnN0ID0gX19uZXh0OworICAgICAgICAgIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICAgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29tcD4KKyAgICAgIHZvaWQKKyAgICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgICAgbWVyZ2UoZm9yd2FyZF9saXN0JiYgX19saXN0LCBfQ29tcCBfX2NvbXApCisgICAgICB7CisgICAgICAgIF9Ob2RlX2Jhc2UqIF9fbm9kZSA9ICZ0aGlzLT5fTV9pbXBsLl9NX2hlYWQ7CisgICAgICAgIHdoaWxlIChfX25vZGUtPl9NX25leHQgJiYgX19saXN0Ll9NX2ltcGwuX01faGVhZC5fTV9uZXh0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX2NvbXAoKnN0YXRpY19jYXN0PF9Ob2RlKj4KKyAgICAgICAgICAgICAgICAgICAgICAgKF9fbGlzdC5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCktPl9NX3ZhbHB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAqc3RhdGljX2Nhc3Q8X05vZGUqPgorICAgICAgICAgICAgICAgICAgICAgICAoX19ub2RlLT5fTV9uZXh0KS0+X01fdmFscHRyKCkpKQorICAgICAgICAgICAgICBfX25vZGUtPl9NX3RyYW5zZmVyX2FmdGVyKCZfX2xpc3QuX01faW1wbC5fTV9oZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbGlzdC5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCk7CisgICAgICAgICAgICBfX25vZGUgPSBfX25vZGUtPl9NX25leHQ7CisgICAgICAgICAgfQorICAgICAgICBpZiAoX19saXN0Ll9NX2ltcGwuX01faGVhZC5fTV9uZXh0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9fbm9kZS0+X01fbmV4dCA9IF9fbGlzdC5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dDsKKyAgICAgICAgICAgIF9fbGlzdC5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCA9IDA7CisgICAgICAgICAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsKKyAgICAgIC8vICBXZSBkb24ndCBoYXZlIHNpemUoKSBzbyB3ZSBuZWVkIHRvIHdhbGsgdGhyb3VnaCBib3RoIGxpc3RzCisgICAgICAvLyAgbWFraW5nIHN1cmUgYm90aCBpdGVyYXRvcnMgYXJlIHZhbGlkLgorICAgICAgYXV0byBfX2l4ID0gX19seC5jYmVnaW4oKTsKKyAgICAgIGF1dG8gX19peSA9IF9fbHkuY2JlZ2luKCk7CisgICAgICB3aGlsZSAoX19peCAhPSBfX2x4LmNlbmQoKSAmJiBfX2l5ICE9IF9fbHkuY2VuZCgpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCpfX2l4ICE9ICpfX2l5KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICsrX19peDsKKyAgICAgICAgICArK19faXk7CisgICAgICAgIH0KKyAgICAgIGlmIChfX2l4ID09IF9fbHguY2VuZCgpICYmIF9faXkgPT0gX19seS5jZW5kKCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db21wPgorICAgICAgdm9pZAorICAgICAgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6CisgICAgICBzb3J0KF9Db21wIF9fY29tcCkKKyAgICAgIHsKKyAgICAgICAgLy8gSWYgYG5leHQnIGlzIDAsIHJldHVybiBpbW1lZGlhdGVseS4KKyAgICAgICAgX05vZGUqIF9fbGlzdCA9IHN0YXRpY19jYXN0PF9Ob2RlKj4odGhpcy0+X01faW1wbC5fTV9oZWFkLl9NX25leHQpOworICAgICAgICBpZiAoIV9fbGlzdCkKKyAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdW5zaWduZWQgbG9uZyBfX2luc2l6ZSA9IDE7CisKKyAgICAgICAgd2hpbGUgKDEpCisgICAgICAgICAgeworICAgICAgICAgICAgX05vZGUqIF9fcCA9IF9fbGlzdDsKKyAgICAgICAgICAgIF9fbGlzdCA9IDA7CisgICAgICAgICAgICBfTm9kZSogX190YWlsID0gMDsKKworICAgICAgICAgICAgLy8gQ291bnQgbnVtYmVyIG9mIG1lcmdlcyB3ZSBkbyBpbiB0aGlzIHBhc3MuCisgICAgICAgICAgICB1bnNpZ25lZCBsb25nIF9fbm1lcmdlcyA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlIChfX3ApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK19fbm1lcmdlczsKKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBleGlzdHMgYSBtZXJnZSB0byBiZSBkb25lLgorICAgICAgICAgICAgICAgIC8vIFN0ZXAgYGluc2l6ZScgcGxhY2VzIGFsb25nIGZyb20gcC4KKyAgICAgICAgICAgICAgICBfTm9kZSogX19xID0gX19wOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgX19wc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBsb25nIF9faSA9IDA7IF9faSA8IF9faW5zaXplOyArK19faSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytfX3BzaXplOworICAgICAgICAgICAgICAgICAgICBfX3EgPSBzdGF0aWNfY2FzdDxfTm9kZSo+KF9fcS0+X01fbmV4dCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghX19xKQorICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSWYgcSBoYXNuJ3QgZmFsbGVuIG9mZiBlbmQsIHdlIGhhdmUgdHdvIGxpc3RzIHRvIG1lcmdlLgorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgX19xc2l6ZSA9IF9faW5zaXplOworCisgICAgICAgICAgICAgICAgLy8gTm93IHdlIGhhdmUgdHdvIGxpc3RzOyBtZXJnZSB0aGVtLgorICAgICAgICAgICAgICAgIHdoaWxlIChfX3BzaXplID4gMCB8fCAoX19xc2l6ZSA+IDAgJiYgX19xKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRGVjaWRlIHdoZXRoZXIgbmV4dCBub2RlIG9mIG1lcmdlIGNvbWVzIGZyb20gcCBvciBxLgorICAgICAgICAgICAgICAgICAgICBfTm9kZSogX19lOworICAgICAgICAgICAgICAgICAgICBpZiAoX19wc2l6ZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHAgaXMgZW1wdHk7IGUgbXVzdCBjb21lIGZyb20gcS4KKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZSA9IF9fcTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fcSA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oX19xLT5fTV9uZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tX19xc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9fcXNpemUgPT0gMCB8fCAhX19xKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHEgaXMgZW1wdHk7IGUgbXVzdCBjb21lIGZyb20gcC4KKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZSA9IF9fcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fcCA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oX19wLT5fTV9uZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tX19wc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9fY29tcCgqX19wLT5fTV92YWxwdHIoKSwgKl9fcS0+X01fdmFscHRyKCkpKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IG5vZGUgb2YgcCBpcyBsb3dlcjsgZSBtdXN0IGNvbWUgZnJvbSBwLgorICAgICAgICAgICAgICAgICAgICAgICAgX19lID0gX19wOworICAgICAgICAgICAgICAgICAgICAgICAgX19wID0gc3RhdGljX2Nhc3Q8X05vZGUqPihfX3AtPl9NX25leHQpOworICAgICAgICAgICAgICAgICAgICAgICAgLS1fX3BzaXplOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IG5vZGUgb2YgcSBpcyBsb3dlcjsgZSBtdXN0IGNvbWUgZnJvbSBxLgorICAgICAgICAgICAgICAgICAgICAgICAgX19lID0gX19xOworICAgICAgICAgICAgICAgICAgICAgICAgX19xID0gc3RhdGljX2Nhc3Q8X05vZGUqPihfX3EtPl9NX25leHQpOworICAgICAgICAgICAgICAgICAgICAgICAgLS1fX3FzaXplOworICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5leHQgbm9kZSB0byB0aGUgbWVyZ2VkIGxpc3QuCisgICAgICAgICAgICAgICAgICAgIGlmIChfX3RhaWwpCisgICAgICAgICAgICAgICAgICAgICAgX190YWlsLT5fTV9uZXh0ID0gX19lOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgX19saXN0ID0gX19lOworICAgICAgICAgICAgICAgICAgICBfX3RhaWwgPSBfX2U7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBOb3cgcCBoYXMgc3RlcHBlZCBgaW5zaXplJyBwbGFjZXMgYWxvbmcsIGFuZCBxIGhhcyB0b28uCisgICAgICAgICAgICAgICAgX19wID0gX19xOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBfX3RhaWwtPl9NX25leHQgPSAwOworCisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGRvbmUgb25seSBvbmUgbWVyZ2UsIHdlJ3JlIGZpbmlzaGVkLgorICAgICAgICAgICAgLy8gQWxsb3cgZm9yIG5tZXJnZXMgPT0gMCwgdGhlIGVtcHR5IGxpc3QgY2FzZS4KKyAgICAgICAgICAgIGlmIChfX25tZXJnZXMgPD0gMSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPl9NX2ltcGwuX01faGVhZC5fTV9uZXh0ID0gX19saXN0OworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBPdGhlcndpc2UgcmVwZWF0LCBtZXJnaW5nIGxpc3RzIHR3aWNlIHRoZSBzaXplLgorICAgICAgICAgICAgX19pbnNpemUgKj0gMjsKKyAgICAgICAgICB9CisgICAgICB9CisgCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvKiBfRk9SV0FSRF9MSVNUX1RDQyAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvZnN0cmVhbS50Y2MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvZnN0cmVhbS50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzYTU3NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9mc3RyZWFtLnRjYwpAQCAtMCwwICsxLDk4MiBAQAorLy8gRmlsZSBiYXNlZCBzdHJlYW1zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2ZzdHJlYW0udGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZnN0cmVhbX0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjcuOCAgRmlsZS1iYXNlZCBzdHJlYW1zCisvLworCisjaWZuZGVmIF9GU1RSRUFNX1RDQworI2RlZmluZSBfRlNUUkVBTV9UQ0MgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2N4eGFiaV9mb3JjZWQuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB2b2lkCisgICAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBfTV9hbGxvY2F0ZV9pbnRlcm5hbF9idWZmZXIoKQorICAgIHsKKyAgICAgIC8vIEFsbG9jYXRlIGludGVybmFsIGJ1ZmZlciBvbmx5IGlmIG9uZSBkb2Vzbid0IGFscmVhZHkgZXhpc3QKKyAgICAgIC8vIChlaXRoZXIgYWxsb2NhdGVkIG9yIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIHZpYSBzZXRidWYpLgorICAgICAgaWYgKCFfTV9idWZfYWxsb2NhdGVkICYmICFfTV9idWYpCisJeworCSAgX01fYnVmID0gbmV3IGNoYXJfdHlwZVtfTV9idWZfc2l6ZV07CisJICBfTV9idWZfYWxsb2NhdGVkID0gdHJ1ZTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB2b2lkCisgICAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBfTV9kZXN0cm95X2ludGVybmFsX2J1ZmZlcigpIHRocm93KCkKKyAgICB7CisgICAgICBpZiAoX01fYnVmX2FsbG9jYXRlZCkKKwl7CisJICBkZWxldGUgW10gX01fYnVmOworCSAgX01fYnVmID0gMDsKKwkgIF9NX2J1Zl9hbGxvY2F0ZWQgPSBmYWxzZTsKKwl9CisgICAgICBkZWxldGUgW10gX01fZXh0X2J1ZjsKKyAgICAgIF9NX2V4dF9idWYgPSAwOworICAgICAgX01fZXh0X2J1Zl9zaXplID0gMDsKKyAgICAgIF9NX2V4dF9uZXh0ID0gMDsKKyAgICAgIF9NX2V4dF9lbmQgPSAwOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBiYXNpY19maWxlYnVmKCkgOiBfX3N0cmVhbWJ1Zl90eXBlKCksIF9NX2xvY2soKSwgX01fZmlsZSgmX01fbG9jayksCisgICAgX01fbW9kZShpb3NfYmFzZTo6b3Blbm1vZGUoMCkpLCBfTV9zdGF0ZV9iZWcoKSwgX01fc3RhdGVfY3VyKCksCisgICAgX01fc3RhdGVfbGFzdCgpLCBfTV9idWYoMCksIF9NX2J1Zl9zaXplKEJVRlNJWiksCisgICAgX01fYnVmX2FsbG9jYXRlZChmYWxzZSksIF9NX3JlYWRpbmcoZmFsc2UpLCBfTV93cml0aW5nKGZhbHNlKSwgX01fcGJhY2soKSwgCisgICAgX01fcGJhY2tfY3VyX3NhdmUoMCksIF9NX3BiYWNrX2VuZF9zYXZlKDApLCBfTV9wYmFja19pbml0KGZhbHNlKSwKKyAgICBfTV9jb2RlY3Z0KDApLCBfTV9leHRfYnVmKDApLCBfTV9leHRfYnVmX3NpemUoMCksIF9NX2V4dF9uZXh0KDApLAorICAgIF9NX2V4dF9lbmQoMCkKKyAgICB7CisgICAgICBpZiAoaGFzX2ZhY2V0PF9fY29kZWN2dF90eXBlPih0aGlzLT5fTV9idWZfbG9jYWxlKSkKKwlfTV9jb2RlY3Z0ID0gJnVzZV9mYWNldDxfX2NvZGVjdnRfdHlwZT4odGhpcy0+X01fYnVmX2xvY2FsZSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9fZmlsZWJ1Zl90eXBlKgorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgb3Blbihjb25zdCBjaGFyKiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCisgICAgeworICAgICAgX19maWxlYnVmX3R5cGUgKl9fcmV0ID0gMDsKKyAgICAgIGlmICghdGhpcy0+aXNfb3BlbigpKQorCXsKKwkgIF9NX2ZpbGUub3BlbihfX3MsIF9fbW9kZSk7CisJICBpZiAodGhpcy0+aXNfb3BlbigpKQorCSAgICB7CisJICAgICAgX01fYWxsb2NhdGVfaW50ZXJuYWxfYnVmZmVyKCk7CisJICAgICAgX01fbW9kZSA9IF9fbW9kZTsKKworCSAgICAgIC8vIFNldHVwIGluaXRpYWwgYnVmZmVyIHRvICd1bmNvbW1pdHRlZCcgbW9kZS4KKwkgICAgICBfTV9yZWFkaW5nID0gZmFsc2U7CisJICAgICAgX01fd3JpdGluZyA9IGZhbHNlOworCSAgICAgIF9NX3NldF9idWZmZXIoLTEpOworCisJICAgICAgLy8gUmVzZXQgdG8gaW5pdGlhbCBzdGF0ZS4KKwkgICAgICBfTV9zdGF0ZV9sYXN0ID0gX01fc3RhdGVfY3VyID0gX01fc3RhdGVfYmVnOworCisJICAgICAgLy8gMjcuOC4xLjMsNAorCSAgICAgIGlmICgoX19tb2RlICYgaW9zX2Jhc2U6OmF0ZSkKKwkJICAmJiB0aGlzLT5zZWVrb2ZmKDAsIGlvc19iYXNlOjplbmQsIF9fbW9kZSkKKwkJICA9PSBwb3NfdHlwZShvZmZfdHlwZSgtMSkpKQorCQl0aGlzLT5jbG9zZSgpOworCSAgICAgIGVsc2UKKwkJX19yZXQgPSB0aGlzOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpfX2ZpbGVidWZfdHlwZSoKKyAgICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIGNsb3NlKCkKKyAgICB7CisgICAgICBpZiAoIXRoaXMtPmlzX29wZW4oKSkKKwlyZXR1cm4gMDsKKworICAgICAgYm9vbCBfX3Rlc3RmYWlsID0gZmFsc2U7CisgICAgICB7CisJLy8gTkI6IERvIHRoaXMgaGVyZSBzbyB0aGF0IHJlLW9wZW5lZCBmaWxlYnVmcyB3aWxsIGJlIGNvb2wuLi4KKwlzdHJ1Y3QgX19jbG9zZV9zZW50cnkKKwl7CisJICBiYXNpY19maWxlYnVmICpfX2ZiOworCSAgX19jbG9zZV9zZW50cnkgKGJhc2ljX2ZpbGVidWYgKl9fZmJpKTogX19mYihfX2ZiaSkgeyB9CisJICB+X19jbG9zZV9zZW50cnkgKCkKKwkgIHsKKwkgICAgX19mYi0+X01fbW9kZSA9IGlvc19iYXNlOjpvcGVubW9kZSgwKTsKKwkgICAgX19mYi0+X01fcGJhY2tfaW5pdCA9IGZhbHNlOworCSAgICBfX2ZiLT5fTV9kZXN0cm95X2ludGVybmFsX2J1ZmZlcigpOworCSAgICBfX2ZiLT5fTV9yZWFkaW5nID0gZmFsc2U7CisJICAgIF9fZmItPl9NX3dyaXRpbmcgPSBmYWxzZTsKKwkgICAgX19mYi0+X01fc2V0X2J1ZmZlcigtMSk7CisJICAgIF9fZmItPl9NX3N0YXRlX2xhc3QgPSBfX2ZiLT5fTV9zdGF0ZV9jdXIgPSBfX2ZiLT5fTV9zdGF0ZV9iZWc7CisJICB9CisJfSBfX2NzICh0aGlzKTsKKworCV9fdHJ5CisJICB7CisJICAgIGlmICghX01fdGVybWluYXRlX291dHB1dCgpKQorCSAgICAgIF9fdGVzdGZhaWwgPSB0cnVlOworCSAgfQorCV9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgIHsKKwkgICAgX01fZmlsZS5jbG9zZSgpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsgX190ZXN0ZmFpbCA9IHRydWU7IH0KKyAgICAgIH0KKworICAgICAgaWYgKCFfTV9maWxlLmNsb3NlKCkpCisJX190ZXN0ZmFpbCA9IHRydWU7CisKKyAgICAgIGlmIChfX3Rlc3RmYWlsKQorCXJldHVybiAwOworICAgICAgZWxzZQorCXJldHVybiB0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RyZWFtc2l6ZQorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgc2hvd21hbnljKCkKKyAgICB7CisgICAgICBzdHJlYW1zaXplIF9fcmV0ID0gLTE7CisgICAgICBjb25zdCBib29sIF9fdGVzdGluID0gX01fbW9kZSAmIGlvc19iYXNlOjppbjsKKyAgICAgIGlmIChfX3Rlc3RpbiAmJiB0aGlzLT5pc19vcGVuKCkpCisJeworCSAgLy8gRm9yIGEgc3RhdGVmdWwgZW5jb2RpbmcgKC0xKSB0aGUgcGVuZGluZyBzZXF1ZW5jZSBtaWdodCBiZSBqdXN0CisJICAvLyBzaGlmdCBhbmQgdW5zaGlmdCBwcmVmaXhlcyB3aXRoIG5vIGFjdHVhbCBjaGFyYWN0ZXIuCisJICBfX3JldCA9IHRoaXMtPmVncHRyKCkgLSB0aGlzLT5ncHRyKCk7CisKKyNpZiBfR0xJQkNYWF9IQVZFX0RPU19CQVNFRF9GSUxFU1lTVEVNCisJICAvLyBBYm91dCB0aGlzIHdvcmthcm91bmQsIHNlZSBsaWJzdGRjKysvMjA4MDYuCisJICBjb25zdCBib29sIF9fdGVzdGJpbmFyeSA9IF9NX21vZGUgJiBpb3NfYmFzZTo6YmluYXJ5OworCSAgaWYgKF9fY2hlY2tfZmFjZXQoX01fY29kZWN2dCkuZW5jb2RpbmcoKSA+PSAwCisJICAgICAgJiYgX190ZXN0YmluYXJ5KQorI2Vsc2UKKwkgIGlmIChfX2NoZWNrX2ZhY2V0KF9NX2NvZGVjdnQpLmVuY29kaW5nKCkgPj0gMCkKKyNlbmRpZgorCSAgICBfX3JldCArPSBfTV9maWxlLnNob3dtYW55YygpIC8gX01fY29kZWN2dC0+bWF4X2xlbmd0aCgpOworCX0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6aW50X3R5cGUKKyAgICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHVuZGVyZmxvdygpCisgICAgeworICAgICAgaW50X3R5cGUgX19yZXQgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgICBjb25zdCBib29sIF9fdGVzdGluID0gX01fbW9kZSAmIGlvc19iYXNlOjppbjsKKyAgICAgIGlmIChfX3Rlc3RpbikKKwl7CisJICBpZiAoX01fd3JpdGluZykKKwkgICAgeworCSAgICAgIGlmIChvdmVyZmxvdygpID09IHRyYWl0c190eXBlOjplb2YoKSkKKwkJcmV0dXJuIF9fcmV0OworCSAgICAgIF9NX3NldF9idWZmZXIoLTEpOworCSAgICAgIF9NX3dyaXRpbmcgPSBmYWxzZTsKKwkgICAgfQorCSAgLy8gQ2hlY2sgZm9yIHBiYWNrIG1hZG5lc3MsIGFuZCBpZiBzbyBzd2l0Y2ggYmFjayB0byB0aGUKKwkgIC8vIG5vcm1hbCBidWZmZXJzIGFuZCBqZXQgb3V0dGEgaGVyZSBiZWZvcmUgZXhwZW5zaXZlCisJICAvLyBmaWxlb3BzIGhhcHBlbi4uLgorCSAgX01fZGVzdHJveV9wYmFjaygpOworCisJICBpZiAodGhpcy0+Z3B0cigpIDwgdGhpcy0+ZWdwdHIoKSkKKwkgICAgcmV0dXJuIHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqdGhpcy0+Z3B0cigpKTsKKworCSAgLy8gR2V0IGFuZCBjb252ZXJ0IGlucHV0IHNlcXVlbmNlLgorCSAgY29uc3Qgc2l6ZV90IF9fYnVmbGVuID0gX01fYnVmX3NpemUgPiAxID8gX01fYnVmX3NpemUgLSAxIDogMTsKKworCSAgLy8gV2lsbCBiZSBzZXQgdG8gdHJ1ZSBpZiA6OnJlYWQoKSByZXR1cm5zIDAgaW5kaWNhdGluZyBFT0YuCisJICBib29sIF9fZ290X2VvZiA9IGZhbHNlOworCSAgLy8gTnVtYmVyIG9mIGludGVybmFsIGNoYXJhY3RlcnMgcHJvZHVjZWQuCisJICBzdHJlYW1zaXplIF9faWxlbiA9IDA7CisJICBjb2RlY3Z0X2Jhc2U6OnJlc3VsdCBfX3IgPSBjb2RlY3Z0X2Jhc2U6Om9rOworCSAgaWYgKF9fY2hlY2tfZmFjZXQoX01fY29kZWN2dCkuYWx3YXlzX25vY29udigpKQorCSAgICB7CisJICAgICAgX19pbGVuID0gX01fZmlsZS54c2dldG4ocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4odGhpcy0+ZWJhY2soKSksCisJCQkJICAgICAgX19idWZsZW4pOworCSAgICAgIGlmIChfX2lsZW4gPT0gMCkKKwkJX19nb3RfZW9mID0gdHJ1ZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisgICAgICAgICAgICAgIC8vIFdvcnN0LWNhc2UgbnVtYmVyIG9mIGV4dGVybmFsIGJ5dGVzLgorCSAgICAgIC8vIFhYWCBOb3QgZG9uZSBlbmNvZGluZygpID09IC0xLgorCSAgICAgIGNvbnN0IGludCBfX2VuYyA9IF9NX2NvZGVjdnQtPmVuY29kaW5nKCk7CisJICAgICAgc3RyZWFtc2l6ZSBfX2JsZW47IC8vIE1pbmltdW0gYnVmZmVyIHNpemUuCisJICAgICAgc3RyZWFtc2l6ZSBfX3JsZW47IC8vIE51bWJlciBvZiBjaGFycyB0byByZWFkLgorCSAgICAgIGlmIChfX2VuYyA+IDApCisJCV9fYmxlbiA9IF9fcmxlbiA9IF9fYnVmbGVuICogX19lbmM7CisJICAgICAgZWxzZQorCQl7CisJCSAgX19ibGVuID0gX19idWZsZW4gKyBfTV9jb2RlY3Z0LT5tYXhfbGVuZ3RoKCkgLSAxOworCQkgIF9fcmxlbiA9IF9fYnVmbGVuOworCQl9CisJICAgICAgY29uc3Qgc3RyZWFtc2l6ZSBfX3JlbWFpbmRlciA9IF9NX2V4dF9lbmQgLSBfTV9leHRfbmV4dDsKKwkgICAgICBfX3JsZW4gPSBfX3JsZW4gPiBfX3JlbWFpbmRlciA/IF9fcmxlbiAtIF9fcmVtYWluZGVyIDogMDsKKworCSAgICAgIC8vIEFuIGltYnVlIGluICdyZWFkJyBtb2RlIGltcGxpZXMgZmlyc3QgY29udmVydGluZyB0aGUgZXh0ZXJuYWwKKwkgICAgICAvLyBjaGFycyBhbHJlYWR5IHByZXNlbnQuCisJICAgICAgaWYgKF9NX3JlYWRpbmcgJiYgdGhpcy0+ZWdwdHIoKSA9PSB0aGlzLT5lYmFjaygpICYmIF9fcmVtYWluZGVyKQorCQlfX3JsZW4gPSAwOworCisJICAgICAgLy8gQWxsb2NhdGUgYnVmZmVyIGlmIG5lY2Vzc2FyeSBhbmQgbW92ZSB1bmNvbnZlcnRlZAorCSAgICAgIC8vIGJ5dGVzIHRvIGZyb250LgorCSAgICAgIGlmIChfTV9leHRfYnVmX3NpemUgPCBfX2JsZW4pCisJCXsKKwkJICBjaGFyKiBfX2J1ZiA9IG5ldyBjaGFyW19fYmxlbl07CisJCSAgaWYgKF9fcmVtYWluZGVyKQorCQkgICAgX19idWlsdGluX21lbWNweShfX2J1ZiwgX01fZXh0X25leHQsIF9fcmVtYWluZGVyKTsKKworCQkgIGRlbGV0ZSBbXSBfTV9leHRfYnVmOworCQkgIF9NX2V4dF9idWYgPSBfX2J1ZjsKKwkJICBfTV9leHRfYnVmX3NpemUgPSBfX2JsZW47CisJCX0KKwkgICAgICBlbHNlIGlmIChfX3JlbWFpbmRlcikKKwkJX19idWlsdGluX21lbW1vdmUoX01fZXh0X2J1ZiwgX01fZXh0X25leHQsIF9fcmVtYWluZGVyKTsKKworCSAgICAgIF9NX2V4dF9uZXh0ID0gX01fZXh0X2J1ZjsKKwkgICAgICBfTV9leHRfZW5kID0gX01fZXh0X2J1ZiArIF9fcmVtYWluZGVyOworCSAgICAgIF9NX3N0YXRlX2xhc3QgPSBfTV9zdGF0ZV9jdXI7CisKKwkgICAgICBkbworCQl7CisJCSAgaWYgKF9fcmxlbiA+IDApCisJCSAgICB7CisJCSAgICAgIC8vIFNhbml0eSBjaGVjayEKKwkJICAgICAgLy8gVGhpcyBtYXkgZmFpbCBpZiB0aGUgcmV0dXJuIHZhbHVlIG9mCisJCSAgICAgIC8vIGNvZGVjdnQ6Om1heF9sZW5ndGgoKSBpcyBib2d1cy4KKwkJICAgICAgaWYgKF9NX2V4dF9lbmQgLSBfTV9leHRfYnVmICsgX19ybGVuID4gX01fZXh0X2J1Zl9zaXplKQorCQkJeworCQkJICBfX3Rocm93X2lvc19mYWlsdXJlKF9fTigiYmFzaWNfZmlsZWJ1Zjo6dW5kZXJmbG93ICIKKwkJCQkJICAgICAgImNvZGVjdnQ6Om1heF9sZW5ndGgoKSAiCisJCQkJCSAgICAgICJpcyBub3QgdmFsaWQiKSk7CisJCQl9CisJCSAgICAgIHN0cmVhbXNpemUgX19lbGVuID0gX01fZmlsZS54c2dldG4oX01fZXh0X2VuZCwgX19ybGVuKTsKKwkJICAgICAgaWYgKF9fZWxlbiA9PSAwKQorCQkJX19nb3RfZW9mID0gdHJ1ZTsKKwkJICAgICAgZWxzZSBpZiAoX19lbGVuID09IC0xKQorCQkJYnJlYWs7CisJCSAgICAgIF9NX2V4dF9lbmQgKz0gX19lbGVuOworCQkgICAgfQorCisJCSAgY2hhcl90eXBlKiBfX2llbmQgPSB0aGlzLT5lYmFjaygpOworCQkgIGlmIChfTV9leHRfbmV4dCA8IF9NX2V4dF9lbmQpCisJCSAgICBfX3IgPSBfTV9jb2RlY3Z0LT5pbihfTV9zdGF0ZV9jdXIsIF9NX2V4dF9uZXh0LAorCQkJCQkgX01fZXh0X2VuZCwgX01fZXh0X25leHQsCisJCQkJCSB0aGlzLT5lYmFjaygpLAorCQkJCQkgdGhpcy0+ZWJhY2soKSArIF9fYnVmbGVuLCBfX2llbmQpOworCQkgIGlmIChfX3IgPT0gY29kZWN2dF9iYXNlOjpub2NvbnYpCisJCSAgICB7CisJCSAgICAgIHNpemVfdCBfX2F2YWlsID0gX01fZXh0X2VuZCAtIF9NX2V4dF9idWY7CisJCSAgICAgIF9faWxlbiA9IHN0ZDo6bWluKF9fYXZhaWwsIF9fYnVmbGVuKTsKKwkJICAgICAgdHJhaXRzX3R5cGU6OmNvcHkodGhpcy0+ZWJhY2soKSwKKwkJCQkJcmVpbnRlcnByZXRfY2FzdDxjaGFyX3R5cGUqPgorCQkJCQkoX01fZXh0X2J1ZiksIF9faWxlbik7CisJCSAgICAgIF9NX2V4dF9uZXh0ID0gX01fZXh0X2J1ZiArIF9faWxlbjsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICBfX2lsZW4gPSBfX2llbmQgLSB0aGlzLT5lYmFjaygpOworCisJCSAgLy8gX01fY29kZWN2dC0+aW4gbWF5IHJldHVybiBlcnJvciB3aGlsZSBfX2lsZW4gPiAwOiB0aGlzIGlzCisJCSAgLy8gb2ssIGFuZCBhY3R1YWxseSBvY2N1cnMgaW4gY2FzZSBvZiBtaXhlZCBlbmNvZGluZ3MgKGUuZy4sCisJCSAgLy8gWE1MIGZpbGVzKS4KKwkJICBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6ZXJyb3IpCisJCSAgICBicmVhazsKKworCQkgIF9fcmxlbiA9IDE7CisJCX0KKwkgICAgICB3aGlsZSAoX19pbGVuID09IDAgJiYgIV9fZ290X2VvZik7CisJICAgIH0KKworCSAgaWYgKF9faWxlbiA+IDApCisJICAgIHsKKwkgICAgICBfTV9zZXRfYnVmZmVyKF9faWxlbik7CisJICAgICAgX01fcmVhZGluZyA9IHRydWU7CisJICAgICAgX19yZXQgPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKnRoaXMtPmdwdHIoKSk7CisJICAgIH0KKwkgIGVsc2UgaWYgKF9fZ290X2VvZikKKwkgICAgeworCSAgICAgIC8vIElmIHRoZSBhY3R1YWwgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZCwgc2V0ICd1bmNvbW1pdHRlZCcKKwkgICAgICAvLyBtb2RlLCB0aHVzIGFsbG93aW5nIGFuIGltbWVkaWF0ZSB3cml0ZSB3aXRob3V0IGFuCisJICAgICAgLy8gaW50ZXJ2ZW5pbmcgc2Vlay4KKwkgICAgICBfTV9zZXRfYnVmZmVyKC0xKTsKKwkgICAgICBfTV9yZWFkaW5nID0gZmFsc2U7CisJICAgICAgLy8gSG93ZXZlciwgcmVhY2hpbmcgaXQgd2hpbGUgbG9vcGluZyBvbiBwYXJ0aWFsIG1lYW5zIHRoYXQKKwkgICAgICAvLyB0aGUgZmlsZSBoYXMgZ290IGFuIGluY29tcGxldGUgY2hhcmFjdGVyLgorCSAgICAgIGlmIChfX3IgPT0gY29kZWN2dF9iYXNlOjpwYXJ0aWFsKQorCQlfX3Rocm93X2lvc19mYWlsdXJlKF9fTigiYmFzaWNfZmlsZWJ1Zjo6dW5kZXJmbG93ICIKKwkJCQkgICAgImluY29tcGxldGUgY2hhcmFjdGVyIGluIGZpbGUiKSk7CisJICAgIH0KKwkgIGVsc2UgaWYgKF9fciA9PSBjb2RlY3Z0X2Jhc2U6OmVycm9yKQorCSAgICBfX3Rocm93X2lvc19mYWlsdXJlKF9fTigiYmFzaWNfZmlsZWJ1Zjo6dW5kZXJmbG93ICIKKwkJCQkiaW52YWxpZCBieXRlIHNlcXVlbmNlIGluIGZpbGUiKSk7CisJICBlbHNlCisJICAgIF9fdGhyb3dfaW9zX2ZhaWx1cmUoX19OKCJiYXNpY19maWxlYnVmOjp1bmRlcmZsb3cgIgorCQkJCSJlcnJvciByZWFkaW5nIHRoZSBmaWxlIikpOworCX0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6aW50X3R5cGUKKyAgICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHBiYWNrZmFpbChpbnRfdHlwZSBfX2kpCisgICAgeworICAgICAgaW50X3R5cGUgX19yZXQgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgICBjb25zdCBib29sIF9fdGVzdGluID0gX01fbW9kZSAmIGlvc19iYXNlOjppbjsKKyAgICAgIGlmIChfX3Rlc3RpbikKKwl7CisJICBpZiAoX01fd3JpdGluZykKKwkgICAgeworCSAgICAgIGlmIChvdmVyZmxvdygpID09IHRyYWl0c190eXBlOjplb2YoKSkKKwkJcmV0dXJuIF9fcmV0OworCSAgICAgIF9NX3NldF9idWZmZXIoLTEpOworCSAgICAgIF9NX3dyaXRpbmcgPSBmYWxzZTsKKwkgICAgfQorCSAgLy8gUmVtZW1iZXIgd2hldGhlciB0aGUgcGJhY2sgYnVmZmVyIGlzIGFjdGl2ZSwgb3RoZXJ3aXNlIGJlbG93CisJICAvLyB3ZSBtYXkgdHJ5IHRvIHN0b3JlIGluIGl0IGEgc2Vjb25kIGNoYXIgKGxpYnN0ZGMrKy85NzYxKS4KKwkgIGNvbnN0IGJvb2wgX190ZXN0cGIgPSBfTV9wYmFja19pbml0OworCSAgY29uc3QgYm9vbCBfX3Rlc3Rlb2YgPSB0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19pLCBfX3JldCk7CisJICBpbnRfdHlwZSBfX3RtcDsKKwkgIGlmICh0aGlzLT5lYmFjaygpIDwgdGhpcy0+Z3B0cigpKQorCSAgICB7CisJICAgICAgdGhpcy0+Z2J1bXAoLTEpOworCSAgICAgIF9fdG1wID0gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCp0aGlzLT5ncHRyKCkpOworCSAgICB9CisJICBlbHNlIGlmICh0aGlzLT5zZWVrb2ZmKC0xLCBpb3NfYmFzZTo6Y3VyKSAhPSBwb3NfdHlwZShvZmZfdHlwZSgtMSkpKQorCSAgICB7CisJICAgICAgX190bXAgPSB0aGlzLT51bmRlcmZsb3coKTsKKwkgICAgICBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fdG1wLCBfX3JldCkpCisJCXJldHVybiBfX3JldDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLy8gQXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLCBuZWVkIHRvIG1ha2UgYQorCSAgICAgIC8vIHB1dGJhY2sgcG9zaXRpb24gYXZhaWxhYmxlLiAgQnV0IHRoZSBzZWVrIG1heSBmYWlsCisJICAgICAgLy8gKGYuaS4sIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBmaWxlLCBzZWUKKwkgICAgICAvLyBsaWJzdGRjKysvOTQzOSkgYW5kIGluIHRoYXQgY2FzZSB3ZSByZXR1cm4KKwkgICAgICAvLyB0cmFpdHNfdHlwZTo6ZW9mKCkuCisJICAgICAgcmV0dXJuIF9fcmV0OworCSAgICB9CisKKwkgIC8vIFRyeSB0byBwdXQgYmFjayBfX2kgaW50byBpbnB1dCBzZXF1ZW5jZSBpbiBvbmUgb2YgdGhyZWUgd2F5cy4KKwkgIC8vIE9yZGVyIHRoZXNlIHRlc3RzIGRvbmUgaW4gaXMgdW5zcGVjaWZpZWQgYnkgdGhlIHN0YW5kYXJkLgorCSAgaWYgKCFfX3Rlc3Rlb2YgJiYgdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9faSwgX190bXApKQorCSAgICBfX3JldCA9IF9faTsKKwkgIGVsc2UgaWYgKF9fdGVzdGVvZikKKwkgICAgX19yZXQgPSB0cmFpdHNfdHlwZTo6bm90X2VvZihfX2kpOworCSAgZWxzZSBpZiAoIV9fdGVzdHBiKQorCSAgICB7CisJICAgICAgX01fY3JlYXRlX3BiYWNrKCk7CisJICAgICAgX01fcmVhZGluZyA9IHRydWU7CisJICAgICAgKnRoaXMtPmdwdHIoKSA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19pKTsKKwkgICAgICBfX3JldCA9IF9faTsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6aW50X3R5cGUKKyAgICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIG92ZXJmbG93KGludF90eXBlIF9fYykKKyAgICB7CisgICAgICBpbnRfdHlwZSBfX3JldCA9IHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgIGNvbnN0IGJvb2wgX190ZXN0ZW9mID0gdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19yZXQpOworICAgICAgY29uc3QgYm9vbCBfX3Rlc3RvdXQgPSBfTV9tb2RlICYgaW9zX2Jhc2U6Om91dDsKKyAgICAgIGlmIChfX3Rlc3RvdXQpCisJeworICAgICAgICAgIGlmIChfTV9yZWFkaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfTV9kZXN0cm95X3BiYWNrKCk7CisgICAgICAgICAgICAgIGNvbnN0IGludCBfX2dwdHJfb2ZmID0gX01fZ2V0X2V4dF9wb3MoX01fc3RhdGVfbGFzdCk7CisgICAgICAgICAgICAgIGlmIChfTV9zZWVrKF9fZ3B0cl9vZmYsIGlvc19iYXNlOjpjdXIsIF9NX3N0YXRlX2xhc3QpCisgICAgICAgICAgICAgICAgICA9PSBwb3NfdHlwZShvZmZfdHlwZSgtMSkpKQorICAgICAgICAgICAgICAgIHJldHVybiBfX3JldDsKKyAgICAgICAgICAgIH0KKwkgIGlmICh0aGlzLT5wYmFzZSgpIDwgdGhpcy0+cHB0cigpKQorCSAgICB7CisJICAgICAgLy8gSWYgYXBwcm9wcmlhdGUsIGFwcGVuZCB0aGUgb3ZlcmZsb3cgY2hhci4KKwkgICAgICBpZiAoIV9fdGVzdGVvZikKKwkJeworCQkgICp0aGlzLT5wcHRyKCkgPSB0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYyk7CisJCSAgdGhpcy0+cGJ1bXAoMSk7CisJCX0KKworCSAgICAgIC8vIENvbnZlcnQgcGVuZGluZyBzZXF1ZW5jZSB0byBleHRlcm5hbCByZXByZXNlbnRhdGlvbiwKKwkgICAgICAvLyBhbmQgb3V0cHV0LgorCSAgICAgIGlmIChfTV9jb252ZXJ0X3RvX2V4dGVybmFsKHRoaXMtPnBiYXNlKCksCisJCQkJCSB0aGlzLT5wcHRyKCkgLSB0aGlzLT5wYmFzZSgpKSkKKwkJeworCQkgIF9NX3NldF9idWZmZXIoMCk7CisJCSAgX19yZXQgPSB0cmFpdHNfdHlwZTo6bm90X2VvZihfX2MpOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKF9NX2J1Zl9zaXplID4gMSkKKwkgICAgeworCSAgICAgIC8vIE92ZXJmbG93IGluICd1bmNvbW1pdHRlZCcgbW9kZTogc2V0IF9NX3dyaXRpbmcsIHNldAorCSAgICAgIC8vIHRoZSBidWZmZXIgdG8gdGhlIGluaXRpYWwgJ3dyaXRlJyBtb2RlLCBhbmQgcHV0IF9fYworCSAgICAgIC8vIGludG8gdGhlIGJ1ZmZlci4KKwkgICAgICBfTV9zZXRfYnVmZmVyKDApOworCSAgICAgIF9NX3dyaXRpbmcgPSB0cnVlOworCSAgICAgIGlmICghX190ZXN0ZW9mKQorCQl7CisJCSAgKnRoaXMtPnBwdHIoKSA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKTsKKwkJICB0aGlzLT5wYnVtcCgxKTsKKwkJfQorCSAgICAgIF9fcmV0ID0gdHJhaXRzX3R5cGU6Om5vdF9lb2YoX19jKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLy8gVW5idWZmZXJlZC4KKwkgICAgICBjaGFyX3R5cGUgX19jb252ID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpOworCSAgICAgIGlmIChfX3Rlc3Rlb2YgfHwgX01fY29udmVydF90b19leHRlcm5hbCgmX19jb252LCAxKSkKKwkJeworCQkgIF9NX3dyaXRpbmcgPSB0cnVlOworCQkgIF9fcmV0ID0gdHJhaXRzX3R5cGU6Om5vdF9lb2YoX19jKTsKKwkJfQorCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYm9vbAorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgX01fY29udmVydF90b19leHRlcm5hbChfQ2hhclQqIF9faWJ1Ziwgc3RyZWFtc2l6ZSBfX2lsZW4pCisgICAgeworICAgICAgLy8gU2l6ZXMgb2YgZXh0ZXJuYWwgYW5kIHBlbmRpbmcgb3V0cHV0LgorICAgICAgc3RyZWFtc2l6ZSBfX2VsZW47CisgICAgICBzdHJlYW1zaXplIF9fcGxlbjsKKyAgICAgIGlmIChfX2NoZWNrX2ZhY2V0KF9NX2NvZGVjdnQpLmFsd2F5c19ub2NvbnYoKSkKKwl7CisJICBfX2VsZW4gPSBfTV9maWxlLnhzcHV0bihyZWludGVycHJldF9jYXN0PGNoYXIqPihfX2lidWYpLCBfX2lsZW4pOworCSAgX19wbGVuID0gX19pbGVuOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvLyBXb3JzdC1jYXNlIG51bWJlciBvZiBleHRlcm5hbCBieXRlcyBuZWVkZWQuCisJICAvLyBYWFggTm90IGRvbmUgZW5jb2RpbmcoKSA9PSAtMS4KKwkgIHN0cmVhbXNpemUgX19ibGVuID0gX19pbGVuICogX01fY29kZWN2dC0+bWF4X2xlbmd0aCgpOworCSAgY2hhciogX19idWYgPSBzdGF0aWNfY2FzdDxjaGFyKj4oX19idWlsdGluX2FsbG9jYShfX2JsZW4pKTsKKworCSAgY2hhciogX19iZW5kOworCSAgY29uc3QgY2hhcl90eXBlKiBfX2llbmQ7CisJICBjb2RlY3Z0X2Jhc2U6OnJlc3VsdCBfX3I7CisJICBfX3IgPSBfTV9jb2RlY3Z0LT5vdXQoX01fc3RhdGVfY3VyLCBfX2lidWYsIF9faWJ1ZiArIF9faWxlbiwKKwkJCQlfX2llbmQsIF9fYnVmLCBfX2J1ZiArIF9fYmxlbiwgX19iZW5kKTsKKworCSAgaWYgKF9fciA9PSBjb2RlY3Z0X2Jhc2U6Om9rIHx8IF9fciA9PSBjb2RlY3Z0X2Jhc2U6OnBhcnRpYWwpCisJICAgIF9fYmxlbiA9IF9fYmVuZCAtIF9fYnVmOworCSAgZWxzZSBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6bm9jb252KQorCSAgICB7CisJICAgICAgLy8gU2FtZSBhcyB0aGUgYWx3YXlzX25vY29udiBjYXNlIGFib3ZlLgorCSAgICAgIF9fYnVmID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oX19pYnVmKTsKKwkgICAgICBfX2JsZW4gPSBfX2lsZW47CisJICAgIH0KKwkgIGVsc2UKKwkgICAgX190aHJvd19pb3NfZmFpbHVyZShfX04oImJhc2ljX2ZpbGVidWY6Ol9NX2NvbnZlcnRfdG9fZXh0ZXJuYWwgIgorCQkJCSAgICAiY29udmVyc2lvbiBlcnJvciIpKTsKKyAgCisJICBfX2VsZW4gPSBfTV9maWxlLnhzcHV0bihfX2J1ZiwgX19ibGVuKTsKKwkgIF9fcGxlbiA9IF9fYmxlbjsKKworCSAgLy8gVHJ5IG9uY2UgbW9yZSBmb3IgcGFydGlhbCBjb252ZXJzaW9ucy4KKwkgIGlmIChfX3IgPT0gY29kZWN2dF9iYXNlOjpwYXJ0aWFsICYmIF9fZWxlbiA9PSBfX3BsZW4pCisJICAgIHsKKwkgICAgICBjb25zdCBjaGFyX3R5cGUqIF9faXJlc3VtZSA9IF9faWVuZDsKKwkgICAgICBzdHJlYW1zaXplIF9fcmxlbiA9IHRoaXMtPnBwdHIoKSAtIF9faWVuZDsKKwkgICAgICBfX3IgPSBfTV9jb2RlY3Z0LT5vdXQoX01fc3RhdGVfY3VyLCBfX2lyZXN1bWUsCisJCQkJICAgIF9faXJlc3VtZSArIF9fcmxlbiwgX19pZW5kLCBfX2J1ZiwKKwkJCQkgICAgX19idWYgKyBfX2JsZW4sIF9fYmVuZCk7CisJICAgICAgaWYgKF9fciAhPSBjb2RlY3Z0X2Jhc2U6OmVycm9yKQorCQl7CisJCSAgX19ybGVuID0gX19iZW5kIC0gX19idWY7CisJCSAgX19lbGVuID0gX01fZmlsZS54c3B1dG4oX19idWYsIF9fcmxlbik7CisJCSAgX19wbGVuID0gX19ybGVuOworCQl9CisJICAgICAgZWxzZQorCQlfX3Rocm93X2lvc19mYWlsdXJlKF9fTigiYmFzaWNfZmlsZWJ1Zjo6X01fY29udmVydF90b19leHRlcm5hbCAiCisJCQkJCSJjb252ZXJzaW9uIGVycm9yIikpOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fZWxlbiA9PSBfX3BsZW47CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdHJlYW1zaXplCisgICAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICB4c2dldG4oX0NoYXJUKiBfX3MsIHN0cmVhbXNpemUgX19uKQorICAgIHsKKyAgICAgIC8vIENsZWFyIG91dCBwYmFjayBidWZmZXIgYmVmb3JlIGdvaW5nIG9uIHRvIHRoZSByZWFsIGRlYWwuLi4KKyAgICAgIHN0cmVhbXNpemUgX19yZXQgPSAwOworICAgICAgaWYgKF9NX3BiYWNrX2luaXQpCisJeworCSAgaWYgKF9fbiA+IDAgJiYgdGhpcy0+Z3B0cigpID09IHRoaXMtPmViYWNrKCkpCisJICAgIHsKKwkgICAgICAqX19zKysgPSAqdGhpcy0+Z3B0cigpOyAvLyBlbXVsYXRlIG5vbi11bmRlcmZsb3dpbmcgc2J1bXBjCisJICAgICAgdGhpcy0+Z2J1bXAoMSk7CisJICAgICAgX19yZXQgPSAxOworCSAgICAgIC0tX19uOworCSAgICB9CisJICBfTV9kZXN0cm95X3BiYWNrKCk7CisJfQorICAgICAgZWxzZSBpZiAoX01fd3JpdGluZykKKwl7CisgCSAgaWYgKG92ZXJmbG93KCkgPT0gdHJhaXRzX3R5cGU6OmVvZigpKQorIAkgICAgcmV0dXJuIF9fcmV0OworIAkgIF9NX3NldF9idWZmZXIoLTEpOworIAkgIF9NX3dyaXRpbmcgPSBmYWxzZTsKKyAJfQorIAorICAgICAgLy8gT3B0aW1pemF0aW9uIGluIHRoZSBhbHdheXNfbm9jb252KCkgY2FzZSwgdG8gYmUgZ2VuZXJhbGl6ZWQgaW4gdGhlCisgICAgICAvLyBmdXR1cmU6IHdoZW4gX19uID4gX19idWZsZW4gd2UgcmVhZCBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nIHRoZQorICAgICAgLy8gYnVmZmVyIHJlcGVhdGVkbHkuCisgICAgICBjb25zdCBib29sIF9fdGVzdGluID0gX01fbW9kZSAmIGlvc19iYXNlOjppbjsKKyAgICAgIGNvbnN0IHN0cmVhbXNpemUgX19idWZsZW4gPSBfTV9idWZfc2l6ZSA+IDEgPyBfTV9idWZfc2l6ZSAtIDEgOiAxOworIAorICAgICAgaWYgKF9fbiA+IF9fYnVmbGVuICYmIF9fY2hlY2tfZmFjZXQoX01fY29kZWN2dCkuYWx3YXlzX25vY29udigpCisgCSAgICYmIF9fdGVzdGluKQorIAkgeworIAkgICAvLyBGaXJzdCwgY29weSB0aGUgY2hhcnMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBidWZmZXIuCisgCSAgIGNvbnN0IHN0cmVhbXNpemUgX19hdmFpbCA9IHRoaXMtPmVncHRyKCkgLSB0aGlzLT5ncHRyKCk7CisgCSAgIGlmIChfX2F2YWlsICE9IDApCisgCSAgICAgeworCSAgICAgICB0cmFpdHNfdHlwZTo6Y29weShfX3MsIHRoaXMtPmdwdHIoKSwgX19hdmFpbCk7CisgCSAgICAgICBfX3MgKz0gX19hdmFpbDsKKwkgICAgICAgdGhpcy0+c2V0Zyh0aGlzLT5lYmFjaygpLCB0aGlzLT5ncHRyKCkgKyBfX2F2YWlsLAorCQkJICB0aGlzLT5lZ3B0cigpKTsKKwkgICAgICAgX19yZXQgKz0gX19hdmFpbDsKKwkgICAgICAgX19uIC09IF9fYXZhaWw7CisgCSAgICAgfQorIAorIAkgICAvLyBOZWVkIHRvIGxvb3AgaW4gY2FzZSBvZiBzaG9ydCByZWFkcyAocmVsYXRpdmVseSBjb21tb24KKyAJICAgLy8gd2l0aCBwaXBlcykuCisgCSAgIHN0cmVhbXNpemUgX19sZW47CisgCSAgIGZvciAoOzspCisgCSAgICAgeworIAkgICAgICAgX19sZW4gPSBfTV9maWxlLnhzZ2V0bihyZWludGVycHJldF9jYXN0PGNoYXIqPihfX3MpLAorIAkJCQkgICAgICBfX24pOworIAkgICAgICAgaWYgKF9fbGVuID09IC0xKQorIAkJIF9fdGhyb3dfaW9zX2ZhaWx1cmUoX19OKCJiYXNpY19maWxlYnVmOjp4c2dldG4gIgorIAkJCQkJICJlcnJvciByZWFkaW5nIHRoZSBmaWxlIikpOworIAkgICAgICAgaWYgKF9fbGVuID09IDApCisgCQkgYnJlYWs7CisgCisgCSAgICAgICBfX24gLT0gX19sZW47CisgCSAgICAgICBfX3JldCArPSBfX2xlbjsKKyAJICAgICAgIGlmIChfX24gPT0gMCkKKyAJCSBicmVhazsKKyAKKyAJICAgICAgIF9fcyArPSBfX2xlbjsKKyAJICAgICB9CisgCisgCSAgIGlmIChfX24gPT0gMCkKKyAJICAgICB7CisgCSAgICAgICBfTV9zZXRfYnVmZmVyKDApOworIAkgICAgICAgX01fcmVhZGluZyA9IHRydWU7CisgCSAgICAgfQorIAkgICBlbHNlIGlmIChfX2xlbiA9PSAwKQorIAkgICAgIHsKKyAJICAgICAgIC8vIElmIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQsIHNldCAndW5jb21taXR0ZWQnCisgCSAgICAgICAvLyBtb2RlLCB0aHVzIGFsbG93aW5nIGFuIGltbWVkaWF0ZSB3cml0ZSB3aXRob3V0CisgCSAgICAgICAvLyBhbiBpbnRlcnZlbmluZyBzZWVrLgorIAkgICAgICAgX01fc2V0X2J1ZmZlcigtMSk7CisgCSAgICAgICBfTV9yZWFkaW5nID0gZmFsc2U7CisgCSAgICAgfQorIAkgfQorICAgICAgZWxzZQorIAkgX19yZXQgKz0gX19zdHJlYW1idWZfdHlwZTo6eHNnZXRuKF9fcywgX19uKTsKKyAKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0cmVhbXNpemUKKyAgICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHhzcHV0bihjb25zdCBfQ2hhclQqIF9fcywgc3RyZWFtc2l6ZSBfX24pCisgICAgeworICAgICAgc3RyZWFtc2l6ZSBfX3JldCA9IDA7CisgICAgICAvLyBPcHRpbWl6YXRpb24gaW4gdGhlIGFsd2F5c19ub2NvbnYoKSBjYXNlLCB0byBiZSBnZW5lcmFsaXplZCBpbiB0aGUKKyAgICAgIC8vIGZ1dHVyZTogd2hlbiBfX24gaXMgc3VmZmljaWVudGx5IGxhcmdlIHdlIHdyaXRlIGRpcmVjdGx5IGluc3RlYWQgb2YKKyAgICAgIC8vIHVzaW5nIHRoZSBidWZmZXIuCisgICAgICBjb25zdCBib29sIF9fdGVzdG91dCA9IF9NX21vZGUgJiBpb3NfYmFzZTo6b3V0OworICAgICAgaWYgKF9fY2hlY2tfZmFjZXQoX01fY29kZWN2dCkuYWx3YXlzX25vY29udigpCisgCSAgICYmIF9fdGVzdG91dCAmJiAhX01fcmVhZGluZykKKwl7CisJICAvLyBNZWFzdXJlbWVudCB3b3VsZCByZXZlYWwgdGhlIGJlc3QgY2hvaWNlLgorCSAgY29uc3Qgc3RyZWFtc2l6ZSBfX2NodW5rID0gMXVsIDw8IDEwOworCSAgc3RyZWFtc2l6ZSBfX2J1ZmF2YWlsID0gdGhpcy0+ZXBwdHIoKSAtIHRoaXMtPnBwdHIoKTsKKworCSAgLy8gRG9uJ3QgbWlzdGFrZSAndW5jb21taXR0ZWQnIG1vZGUgYnVmZmVyZWQgd2l0aCB1bmJ1ZmZlcmVkLgorCSAgaWYgKCFfTV93cml0aW5nICYmIF9NX2J1Zl9zaXplID4gMSkKKwkgICAgX19idWZhdmFpbCA9IF9NX2J1Zl9zaXplIC0gMTsKKworCSAgY29uc3Qgc3RyZWFtc2l6ZSBfX2xpbWl0ID0gc3RkOjptaW4oX19jaHVuaywgX19idWZhdmFpbCk7CisJICBpZiAoX19uID49IF9fbGltaXQpCisJICAgIHsKKwkgICAgICBjb25zdCBzdHJlYW1zaXplIF9fYnVmZmlsbCA9IHRoaXMtPnBwdHIoKSAtIHRoaXMtPnBiYXNlKCk7CisJICAgICAgY29uc3QgY2hhciogX19idWYgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih0aGlzLT5wYmFzZSgpKTsKKwkgICAgICBfX3JldCA9IF9NX2ZpbGUueHNwdXRuXzIoX19idWYsIF9fYnVmZmlsbCwKKwkJCQkgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oX19zKSwKKwkJCQkgICAgICAgX19uKTsKKwkgICAgICBpZiAoX19yZXQgPT0gX19idWZmaWxsICsgX19uKQorCQl7CisJCSAgX01fc2V0X2J1ZmZlcigwKTsKKwkJICBfTV93cml0aW5nID0gdHJ1ZTsKKwkJfQorCSAgICAgIGlmIChfX3JldCA+IF9fYnVmZmlsbCkKKwkJX19yZXQgLT0gX19idWZmaWxsOworCSAgICAgIGVsc2UKKwkJX19yZXQgPSAwOworCSAgICB9CisJICBlbHNlCisJICAgIF9fcmV0ID0gX19zdHJlYW1idWZfdHlwZTo6eHNwdXRuKF9fcywgX19uKTsKKwl9CisgICAgICAgZWxzZQorCSBfX3JldCA9IF9fc3RyZWFtYnVmX3R5cGU6OnhzcHV0bihfX3MsIF9fbik7CisgICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjpfX3N0cmVhbWJ1Zl90eXBlKgorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgc2V0YnVmKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICB7CisgICAgICBpZiAoIXRoaXMtPmlzX29wZW4oKSkKKwl7CisJICBpZiAoX19zID09IDAgJiYgX19uID09IDApCisJICAgIF9NX2J1Zl9zaXplID0gMTsKKwkgIGVsc2UgaWYgKF9fcyAmJiBfX24gPiAwKQorCSAgICB7CisJICAgICAgLy8gVGhpcyBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGJlaGF2aW9yLCBhbmQgYXNzdW1lcyB0aGF0CisJICAgICAgLy8gYW4gZXh0ZXJuYWwgY2hhcl90eXBlIGFycmF5IG9mIGxlbmd0aCBfX24gZXhpc3RzIGFuZCBoYXMKKwkgICAgICAvLyBiZWVuIHByZS1hbGxvY2F0ZWQuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCB0aGluZ3Mgd2lsbAorCSAgICAgIC8vIHF1aWNrbHkgYmxvdyB1cC4gV2hlbiBfX24gPiAxLCBfX24gLSAxIHBvc2l0aW9ucyB3aWxsIGJlCisJICAgICAgLy8gdXNlZCBmb3IgdGhlIGdldCBhcmVhLCBfX24gLSAxIGZvciB0aGUgcHV0IGFyZWEgYW5kIDEKKwkgICAgICAvLyBwb3NpdGlvbiB0byBob3N0IHRoZSBvdmVyZmxvdyBjaGFyIG9mIGEgZnVsbCBwdXQgYXJlYS4KKwkgICAgICAvLyBXaGVuIF9fbiA9PSAxLCAxIHBvc2l0aW9uIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGdldCBhcmVhCisJICAgICAgLy8gYW5kIDAgZm9yIHRoZSBwdXQgYXJlYSwgYXMgaW4gdGhlIHVuYnVmZmVyZWQgY2FzZSBhYm92ZS4KKwkgICAgICBfTV9idWYgPSBfX3M7CisJICAgICAgX01fYnVmX3NpemUgPSBfX247CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKworICAvLyBBY2NvcmRpbmcgdG8gMjcuOC4xLjQgcDExIC0gMTMsIHNlZWtvZmYgc2hvdWxkIGlnbm9yZSB0aGUgbGFzdAorICAvLyBhcmd1bWVudCAob2YgdHlwZSBvcGVubW9kZSkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OnBvc190eXBlCisgICAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBzZWVrb2ZmKG9mZl90eXBlIF9fb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciBfX3dheSwgaW9zX2Jhc2U6Om9wZW5tb2RlKQorICAgIHsKKyAgICAgIGludCBfX3dpZHRoID0gMDsKKyAgICAgIGlmIChfTV9jb2RlY3Z0KQorCV9fd2lkdGggPSBfTV9jb2RlY3Z0LT5lbmNvZGluZygpOworICAgICAgaWYgKF9fd2lkdGggPCAwKQorCV9fd2lkdGggPSAwOworCisgICAgICBwb3NfdHlwZSBfX3JldCA9IHBvc190eXBlKG9mZl90eXBlKC0xKSk7CisgICAgICBjb25zdCBib29sIF9fdGVzdGZhaWwgPSBfX29mZiAhPSAwICYmIF9fd2lkdGggPD0gMDsKKyAgICAgIGlmICh0aGlzLT5pc19vcGVuKCkgJiYgIV9fdGVzdGZhaWwpCisJeworCSAgLy8gdGVsbGcgYW5kIHRlbGxwIHF1ZXJpZXMgZG8gbm90IGFmZmVjdCBhbnkgc3RhdGUsIHVubGVzcworCSAgLy8gISBhbHdheXNfbm9jb252IGFuZCB0aGUgcHV0IHNlcXVlbmNlIGlzIG5vdCBlbXB0eS4KKwkgIC8vIEluIHRoYXQgY2FzZSwgZGV0ZXJtaW5pbmcgdGhlIHBvc2l0aW9uIHJlcXVpcmVzIGNvbnZlcnRpbmcgdGhlCisJICAvLyBwdXQgc2VxdWVuY2UuIFRoYXQgZG9lc24ndCB1c2UgZXh0X2J1Ziwgc28gcmVxdWlyZXMgYSBmbHVzaC4KKwkgIGJvb2wgX19ub19tb3ZlbWVudCA9IF9fd2F5ID09IGlvc19iYXNlOjpjdXIgJiYgX19vZmYgPT0gMAorCSAgICAmJiAoIV9NX3dyaXRpbmcgfHwgX01fY29kZWN2dC0+YWx3YXlzX25vY29udigpKTsKKworCSAgLy8gRGl0Y2ggYW55IHBiYWNrIGJ1ZmZlcnMgdG8gYXZvaWQgY29uZnVzaW9uLgorCSAgaWYgKCFfX25vX21vdmVtZW50KQorCSAgICBfTV9kZXN0cm95X3BiYWNrKCk7CisKKwkgIC8vIENvcnJlY3Qgc3RhdGUgYXQgZGVzdGluYXRpb24uIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBjb3JyZWN0CisJICAvLyBzdGF0ZSBmb3IgdGhlIGN1cnJlbnQgcG9zaXRpb24gZHVyaW5nIG91dHB1dCwgYmVjYXVzZQorCSAgLy8gY29kZWN2dDo6dW5zaGlmdCgpIHJldHVybnMgdGhlIHN0YXRlIHRvIHRoZSBpbml0aWFsIHN0YXRlLgorCSAgLy8gVGhpcyBpcyBhbHNvIHRoZSBjb3JyZWN0IHN0YXRlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYmVjYXVzZQorCSAgLy8gYW4gdW5zaGlmdCBzZXF1ZW5jZSBzaG91bGQgaGF2ZSBiZWVuIHdyaXR0ZW4gYXQgdGhlIGVuZC4KKwkgIF9fc3RhdGVfdHlwZSBfX3N0YXRlID0gX01fc3RhdGVfYmVnOworCSAgb2ZmX3R5cGUgX19jb21wdXRlZF9vZmYgPSBfX29mZiAqIF9fd2lkdGg7CisJICBpZiAoX01fcmVhZGluZyAmJiBfX3dheSA9PSBpb3NfYmFzZTo6Y3VyKQorCSAgICB7CisJICAgICAgX19zdGF0ZSA9IF9NX3N0YXRlX2xhc3Q7CisJICAgICAgX19jb21wdXRlZF9vZmYgKz0gX01fZ2V0X2V4dF9wb3MoX19zdGF0ZSk7CisJICAgIH0KKwkgIGlmICghX19ub19tb3ZlbWVudCkKKwkgICAgX19yZXQgPSBfTV9zZWVrKF9fY29tcHV0ZWRfb2ZmLCBfX3dheSwgX19zdGF0ZSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoX01fd3JpdGluZykKKwkJX19jb21wdXRlZF9vZmYgPSB0aGlzLT5wcHRyKCkgLSB0aGlzLT5wYmFzZSgpOworCSAgICAgIAorIAkgICAgICBvZmZfdHlwZSBfX2ZpbGVfb2ZmID0gX01fZmlsZS5zZWVrb2ZmKDAsIGlvc19iYXNlOjpjdXIpOworIAkgICAgICBpZiAoX19maWxlX29mZiAhPSBvZmZfdHlwZSgtMSkpCisJCXsKKwkJICBfX3JldCA9IF9fZmlsZV9vZmYgKyBfX2NvbXB1dGVkX29mZjsKKwkJICBfX3JldC5zdGF0ZShfX3N0YXRlKTsKKwkJfQorCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIDE3MS4gU3RyYW5nZSBzZWVrcG9zKCkgc2VtYW50aWNzIGR1ZSB0byBqb2ludCBwb3NpdGlvbgorICAvLyBBY2NvcmRpbmcgdG8gdGhlIHJlc29sdXRpb24gb2YgRFIgMTcxLCBzZWVrcG9zIHNob3VsZCBpZ25vcmUgdGhlIGxhc3QKKyAgLy8gYXJndW1lbnQgKG9mIHR5cGUgb3Blbm1vZGUpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+Ojpwb3NfdHlwZQorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgc2Vla3Bvcyhwb3NfdHlwZSBfX3BvcywgaW9zX2Jhc2U6Om9wZW5tb2RlKQorICAgIHsKKyAgICAgIHBvc190eXBlIF9fcmV0ID0gIHBvc190eXBlKG9mZl90eXBlKC0xKSk7CisgICAgICBpZiAodGhpcy0+aXNfb3BlbigpKQorCXsKKwkgIC8vIERpdGNoIGFueSBwYmFjayBidWZmZXJzIHRvIGF2b2lkIGNvbmZ1c2lvbi4KKwkgIF9NX2Rlc3Ryb3lfcGJhY2soKTsKKwkgIF9fcmV0ID0gX01fc2VlayhvZmZfdHlwZShfX3BvcyksIGlvc19iYXNlOjpiZWcsIF9fcG9zLnN0YXRlKCkpOworCX0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6cG9zX3R5cGUKKyAgICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIF9NX3NlZWsob2ZmX3R5cGUgX19vZmYsIGlvc19iYXNlOjpzZWVrZGlyIF9fd2F5LCBfX3N0YXRlX3R5cGUgX19zdGF0ZSkKKyAgICB7CisgICAgICBwb3NfdHlwZSBfX3JldCA9IHBvc190eXBlKG9mZl90eXBlKC0xKSk7CisgICAgICBpZiAoX01fdGVybWluYXRlX291dHB1dCgpKQorCXsKKwkgIG9mZl90eXBlIF9fZmlsZV9vZmYgPSBfTV9maWxlLnNlZWtvZmYoX19vZmYsIF9fd2F5KTsKKwkgIGlmIChfX2ZpbGVfb2ZmICE9IG9mZl90eXBlKC0xKSkKKwkgICAgeworCSAgICAgIF9NX3JlYWRpbmcgPSBmYWxzZTsKKwkgICAgICBfTV93cml0aW5nID0gZmFsc2U7CisJICAgICAgX01fZXh0X25leHQgPSBfTV9leHRfZW5kID0gX01fZXh0X2J1ZjsKKwkgICAgICBfTV9zZXRfYnVmZmVyKC0xKTsKKwkgICAgICBfTV9zdGF0ZV9jdXIgPSBfX3N0YXRlOworCSAgICAgIF9fcmV0ID0gX19maWxlX29mZjsKKwkgICAgICBfX3JldC5zdGF0ZShfTV9zdGF0ZV9jdXIpOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICAvLyBSZXR1cm5zIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBlbmQgb2YgdGhlIGV4dCBidWZmZXIgdG8gdGhlIHBvaW50CisgIC8vIGNvcnJlc3BvbmRpbmcgdG8gZ3B0cigpLiBUaGlzIGlzIGEgbmVnYXRpdmUgdmFsdWUuIFVwZGF0ZXMgX19zdGF0ZQorICAvLyBmcm9tIGViYWNrKCkgY29ycmVzcG9uZGVuY2UgdG8gZ3B0cigpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW50IGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgX01fZ2V0X2V4dF9wb3MoX19zdGF0ZV90eXBlJiBfX3N0YXRlKQorICAgIHsKKyAgICAgIGlmIChfTV9jb2RlY3Z0LT5hbHdheXNfbm9jb252KCkpCisgICAgICAgIHJldHVybiB0aGlzLT5ncHRyKCkgLSB0aGlzLT5lZ3B0cigpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLy8gQ2FsY3VsYXRlIG9mZnNldCBmcm9tIF9NX2V4dF9idWYgdGhhdCBjb3JyZXNwb25kcyB0bworICAgICAgICAgIC8vIGdwdHIoKS4gUHJlY29uZGl0aW9uOiBfX3N0YXRlID09IF9NX3N0YXRlX2xhc3QsIHdoaWNoCisgICAgICAgICAgLy8gY29ycmVzcG9uZHMgdG8gZWJhY2soKS4KKyAgICAgICAgICBjb25zdCBpbnQgX19ncHRyX29mZiA9CisgICAgICAgICAgICBfTV9jb2RlY3Z0LT5sZW5ndGgoX19zdGF0ZSwgX01fZXh0X2J1ZiwgX01fZXh0X25leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+Z3B0cigpIC0gdGhpcy0+ZWJhY2soKSk7CisgICAgICAgICAgcmV0dXJuIF9NX2V4dF9idWYgKyBfX2dwdHJfb2ZmIC0gX01fZXh0X2VuZDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJvb2wKKyAgICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIF9NX3Rlcm1pbmF0ZV9vdXRwdXQoKQorICAgIHsKKyAgICAgIC8vIFBhcnQgb25lOiB1cGRhdGUgdGhlIG91dHB1dCBzZXF1ZW5jZS4KKyAgICAgIGJvb2wgX190ZXN0dmFsaWQgPSB0cnVlOworICAgICAgaWYgKHRoaXMtPnBiYXNlKCkgPCB0aGlzLT5wcHRyKCkpCisJeworCSAgY29uc3QgaW50X3R5cGUgX190bXAgPSB0aGlzLT5vdmVyZmxvdygpOworCSAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX3RtcCwgdHJhaXRzX3R5cGU6OmVvZigpKSkKKwkgICAgX190ZXN0dmFsaWQgPSBmYWxzZTsKKwl9CisKKyAgICAgIC8vIFBhcnQgdHdvOiBvdXRwdXQgdW5zaGlmdCBzZXF1ZW5jZS4KKyAgICAgIGlmIChfTV93cml0aW5nICYmICFfX2NoZWNrX2ZhY2V0KF9NX2NvZGVjdnQpLmFsd2F5c19ub2NvbnYoKQorCSAgJiYgX190ZXN0dmFsaWQpCisJeworCSAgLy8gTm90ZTogdGhpcyB2YWx1ZSBpcyBhcmJpdHJhcnksIHNpbmNlIHRoZXJlIGlzIG5vIHdheSB0bworCSAgLy8gZ2V0IHRoZSBsZW5ndGggb2YgdGhlIHVuc2hpZnQgc2VxdWVuY2UgZnJvbSBjb2RlY3Z0LAorCSAgLy8gd2l0aG91dCBjYWxsaW5nIHVuc2hpZnQuCisJICBjb25zdCBzaXplX3QgX19ibGVuID0gMTI4OworCSAgY2hhciBfX2J1ZltfX2JsZW5dOworCSAgY29kZWN2dF9iYXNlOjpyZXN1bHQgX19yOworCSAgc3RyZWFtc2l6ZSBfX2lsZW4gPSAwOworCisJICBkbworCSAgICB7CisJICAgICAgY2hhciogX19uZXh0OworCSAgICAgIF9fciA9IF9NX2NvZGVjdnQtPnVuc2hpZnQoX01fc3RhdGVfY3VyLCBfX2J1ZiwKKwkJCQkJX19idWYgKyBfX2JsZW4sIF9fbmV4dCk7CisJICAgICAgaWYgKF9fciA9PSBjb2RlY3Z0X2Jhc2U6OmVycm9yKQorCQlfX3Rlc3R2YWxpZCA9IGZhbHNlOworCSAgICAgIGVsc2UgaWYgKF9fciA9PSBjb2RlY3Z0X2Jhc2U6Om9rIHx8CisJCSAgICAgICBfX3IgPT0gY29kZWN2dF9iYXNlOjpwYXJ0aWFsKQorCQl7CisJCSAgX19pbGVuID0gX19uZXh0IC0gX19idWY7CisJCSAgaWYgKF9faWxlbiA+IDApCisJCSAgICB7CisJCSAgICAgIGNvbnN0IHN0cmVhbXNpemUgX19lbGVuID0gX01fZmlsZS54c3B1dG4oX19idWYsIF9faWxlbik7CisJCSAgICAgIGlmIChfX2VsZW4gIT0gX19pbGVuKQorCQkJX190ZXN0dmFsaWQgPSBmYWxzZTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICB3aGlsZSAoX19yID09IGNvZGVjdnRfYmFzZTo6cGFydGlhbCAmJiBfX2lsZW4gPiAwICYmIF9fdGVzdHZhbGlkKTsKKworCSAgaWYgKF9fdGVzdHZhbGlkKQorCSAgICB7CisJICAgICAgLy8gVGhpcyBzZWNvbmQgY2FsbCB0byBvdmVyZmxvdygpIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZCwKKwkgICAgICAvLyBidXQgaXQncyBub3QgY2xlYXIgd2h5IGl0J3MgbmVlZGVkLCBzaW5jZSB0aGUgb3V0cHV0IGJ1ZmZlcgorCSAgICAgIC8vIHNob3VsZCBiZSBlbXB0eSBieSB0aGlzIHBvaW50IChpdCBzaG91bGQgaGF2ZSBiZWVuIGVtcHRpZWQKKwkgICAgICAvLyBpbiB0aGUgZmlyc3QgY2FsbCB0byBvdmVyZmxvdygpKS4KKwkgICAgICBjb25zdCBpbnRfdHlwZSBfX3RtcCA9IHRoaXMtPm92ZXJmbG93KCk7CisJICAgICAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX3RtcCwgdHJhaXRzX3R5cGU6OmVvZigpKSkKKwkJX190ZXN0dmFsaWQgPSBmYWxzZTsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBfX3Rlc3R2YWxpZDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGludAorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgc3luYygpCisgICAgeworICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGludGVybmFsIGJ1ZmZlciByZXN5bmNzIGl0cyBpZGVhIG9mCisgICAgICAvLyB0aGUgZmlsZSBwb3NpdGlvbiB3aXRoIHRoZSBleHRlcm5hbCBmaWxlLgorICAgICAgaW50IF9fcmV0ID0gMDsKKyAgICAgIGlmICh0aGlzLT5wYmFzZSgpIDwgdGhpcy0+cHB0cigpKQorCXsKKwkgIGNvbnN0IGludF90eXBlIF9fdG1wID0gdGhpcy0+b3ZlcmZsb3coKTsKKwkgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX190bXAsIHRyYWl0c190eXBlOjplb2YoKSkpCisJICAgIF9fcmV0ID0gLTE7CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdm9pZAorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgaW1idWUoY29uc3QgbG9jYWxlJiBfX2xvYykKKyAgICB7CisgICAgICBib29sIF9fdGVzdHZhbGlkID0gdHJ1ZTsKKworICAgICAgY29uc3QgX19jb2RlY3Z0X3R5cGUqIF9NX2NvZGVjdnRfdG1wID0gMDsKKyAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGhhc19mYWNldDxfX2NvZGVjdnRfdHlwZT4oX19sb2MpLCB0cnVlKSkKKwlfTV9jb2RlY3Z0X3RtcCA9ICZ1c2VfZmFjZXQ8X19jb2RlY3Z0X3R5cGU+KF9fbG9jKTsKKworICAgICAgaWYgKHRoaXMtPmlzX29wZW4oKSkKKwl7CisJICAvLyBlbmNvZGluZygpID09IC0xIGlzIG9rIG9ubHkgYXQgdGhlIGJlZ2lubmluZy4KKwkgIGlmICgoX01fcmVhZGluZyB8fCBfTV93cml0aW5nKQorCSAgICAgICYmIF9fY2hlY2tfZmFjZXQoX01fY29kZWN2dCkuZW5jb2RpbmcoKSA9PSAtMSkKKwkgICAgX190ZXN0dmFsaWQgPSBmYWxzZTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChfTV9yZWFkaW5nKQorCQl7CisJCSAgaWYgKF9fY2hlY2tfZmFjZXQoX01fY29kZWN2dCkuYWx3YXlzX25vY29udigpKQorCQkgICAgeworCQkgICAgICBpZiAoX01fY29kZWN2dF90bXAKKwkJCSAgJiYgIV9fY2hlY2tfZmFjZXQoX01fY29kZWN2dF90bXApLmFsd2F5c19ub2NvbnYoKSkKKwkJCV9fdGVzdHZhbGlkID0gdGhpcy0+c2Vla29mZigwLCBpb3NfYmFzZTo6Y3VyLCBfTV9tb2RlKQorCQkJICAgICAgICAgICAgICAhPSBwb3NfdHlwZShvZmZfdHlwZSgtMSkpOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgLy8gRXh0ZXJuYWwgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byBncHRyKCkuCisJCSAgICAgIF9NX2V4dF9uZXh0ID0gX01fZXh0X2J1ZgorCQkJKyBfTV9jb2RlY3Z0LT5sZW5ndGgoX01fc3RhdGVfbGFzdCwgX01fZXh0X2J1ZiwKKwkJCQkJICAgICBfTV9leHRfbmV4dCwKKwkJCQkJICAgICB0aGlzLT5ncHRyKCkgLSB0aGlzLT5lYmFjaygpKTsKKwkJICAgICAgY29uc3Qgc3RyZWFtc2l6ZSBfX3JlbWFpbmRlciA9IF9NX2V4dF9lbmQgLSBfTV9leHRfbmV4dDsKKwkJICAgICAgaWYgKF9fcmVtYWluZGVyKQorCQkJX19idWlsdGluX21lbW1vdmUoX01fZXh0X2J1ZiwgX01fZXh0X25leHQsIF9fcmVtYWluZGVyKTsKKworCQkgICAgICBfTV9leHRfbmV4dCA9IF9NX2V4dF9idWY7CisJCSAgICAgIF9NX2V4dF9lbmQgPSBfTV9leHRfYnVmICsgX19yZW1haW5kZXI7CisJCSAgICAgIF9NX3NldF9idWZmZXIoLTEpOworCQkgICAgICBfTV9zdGF0ZV9sYXN0ID0gX01fc3RhdGVfY3VyID0gX01fc3RhdGVfYmVnOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZSBpZiAoX01fd3JpdGluZyAmJiAoX190ZXN0dmFsaWQgPSBfTV90ZXJtaW5hdGVfb3V0cHV0KCkpKQorCQlfTV9zZXRfYnVmZmVyKC0xKTsKKwkgICAgfQorCX0KKworICAgICAgaWYgKF9fdGVzdHZhbGlkKQorCV9NX2NvZGVjdnQgPSBfTV9jb2RlY3Z0X3RtcDsKKyAgICAgIGVsc2UKKwlfTV9jb2RlY3Z0ID0gMDsKKyAgICB9CisKKyAgLy8gSW5oaWJpdCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBmb3IgcmVxdWlyZWQgaW5zdGFudGlhdGlvbnMsCisgIC8vIHdoaWNoIGFyZSBkZWZpbmVkIHZpYSBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBlbHNld2hlcmUuCisjaWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19maWxlYnVmPGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfaWZzdHJlYW08Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19vZnN0cmVhbTxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX2ZzdHJlYW08Y2hhcj47CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfZmlsZWJ1Zjx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX2lmc3RyZWFtPHdjaGFyX3Q+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfb2ZzdHJlYW08d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19mc3RyZWFtPHdjaGFyX3Q+OworI2VuZGlmCisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvZnVuY3RleGNlcHQuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9mdW5jdGV4Y2VwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MTQwNTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvZnVuY3RleGNlcHQuaApAQCAtMCwwICsxLDEwNiBAQAorLy8gRnVuY3Rpb24tQmFzZWQgRXhjZXB0aW9uIFN1cHBvcnQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvZnVuY3RleGNlcHQuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2V4Y2VwdGlvbn0KKyAqCisgKiAgVGhpcyBoZWFkZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgLWZuby1leGNlcHRpb25zLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAxOS4xICBFeGNlcHRpb24gY2xhc3NlcworLy8KKworI2lmbmRlZiBfRlVOQ1RFWENFUFRfSAorI2RlZmluZSBfRlVOQ1RFWENFUFRfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvZXhjZXB0aW9uX2RlZmluZXMuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIEhlbHBlciBmb3IgZXhjZXB0aW9uIG9iamVjdHMgaW4gPGV4Y2VwdD4KKyAgdm9pZAorICBfX3Rocm93X2JhZF9leGNlcHRpb24odm9pZCkgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKKyAgLy8gSGVscGVyIGZvciBleGNlcHRpb24gb2JqZWN0cyBpbiA8bmV3PgorICB2b2lkCisgIF9fdGhyb3dfYmFkX2FsbG9jKHZvaWQpIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCisgIC8vIEhlbHBlciBmb3IgZXhjZXB0aW9uIG9iamVjdHMgaW4gPHR5cGVpbmZvPgorICB2b2lkCisgIF9fdGhyb3dfYmFkX2Nhc3Qodm9pZCkgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKKyAgdm9pZAorICBfX3Rocm93X2JhZF90eXBlaWQodm9pZCkgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKKyAgLy8gSGVscGVycyBmb3IgZXhjZXB0aW9uIG9iamVjdHMgaW4gPHN0ZGV4Y2VwdD4KKyAgdm9pZAorICBfX3Rocm93X2xvZ2ljX2Vycm9yKGNvbnN0IGNoYXIqKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworICB2b2lkCisgIF9fdGhyb3dfZG9tYWluX2Vycm9yKGNvbnN0IGNoYXIqKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworICB2b2lkCisgIF9fdGhyb3dfaW52YWxpZF9hcmd1bWVudChjb25zdCBjaGFyKikgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKKyAgdm9pZAorICBfX3Rocm93X2xlbmd0aF9lcnJvcihjb25zdCBjaGFyKikgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKKyAgdm9pZAorICBfX3Rocm93X291dF9vZl9yYW5nZShjb25zdCBjaGFyKikgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKKyAgdm9pZAorICBfX3Rocm93X3J1bnRpbWVfZXJyb3IoY29uc3QgY2hhciopIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCisgIHZvaWQKKyAgX190aHJvd19yYW5nZV9lcnJvcihjb25zdCBjaGFyKikgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKKyAgdm9pZAorICBfX3Rocm93X292ZXJmbG93X2Vycm9yKGNvbnN0IGNoYXIqKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworICB2b2lkCisgIF9fdGhyb3dfdW5kZXJmbG93X2Vycm9yKGNvbnN0IGNoYXIqKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworICAvLyBIZWxwZXJzIGZvciBleGNlcHRpb24gb2JqZWN0cyBpbiA8aW9zPgorICB2b2lkCisgIF9fdGhyb3dfaW9zX2ZhaWx1cmUoY29uc3QgY2hhciopIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCisgIHZvaWQKKyAgX190aHJvd19zeXN0ZW1fZXJyb3IoaW50KSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworICB2b2lkCisgIF9fdGhyb3dfZnV0dXJlX2Vycm9yKGludCkgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKKyAgLy8gSGVscGVycyBmb3IgZXhjZXB0aW9uIG9iamVjdHMgaW4gPGZ1bmN0aW9uYWw+CisgIHZvaWQKKyAgX190aHJvd19iYWRfZnVuY3Rpb25fY2FsbCgpIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2Z1bmN0aW9uYWxfaGFzaC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2Z1bmN0aW9uYWxfaGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMjkyMzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvZnVuY3Rpb25hbF9oYXNoLmgKQEAgLTAsMCArMSwyMTIgQEAKKy8vIGZ1bmN0aW9uYWxfaGFzaC5oIGhlYWRlciAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9mdW5jdGlvbmFsX2hhc2guaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2Z1bmN0aW9uYWx9CisgKi8KKworI2lmbmRlZiBfRlVOQ1RJT05BTF9IQVNIX0gKKyNkZWZpbmUgX0ZVTkNUSU9OQUxfSEFTSF9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9oYXNoX2J5dGVzLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKiogQGRlZmdyb3VwIGhhc2hlcyBIYXNoZXMKKyAgICogIEBpbmdyb3VwIGZ1bmN0b3JzCisgICAqCisgICAqICAgSGFzaGluZyBmdW5jdG9ycyB0YWtpbmcgYSB2YXJpYWJsZSB0eXBlIGFuZCByZXR1cm5pbmcgYSBAYyBzdGQ6OnNpemVfdC4KKyAgICoKKyAgICogIEB7CisgICAqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9Bcmc+CisgICAgc3RydWN0IF9faGFzaF9iYXNlCisgICAgeworICAgICAgdHlwZWRlZiBfUmVzdWx0ICAgICByZXN1bHRfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0FyZyAgICAgIGFyZ3VtZW50X3R5cGU7CisgICAgfTsKKworICAvLy8gUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZSBoYXNoLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGhhc2g7CisKKyAgLy8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb25zIGZvciBwb2ludGVyIHR5cGVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGhhc2g8X1RwKj4gOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBfVHAqPgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShfVHAqIF9fcCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90PihfX3ApOyB9CisgICAgfTsKKworICAvLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbnMgZm9yIGludGVnZXIgdHlwZXMuCisjZGVmaW5lIF9DeHhfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2goX1RwKSAJXAorICB0ZW1wbGF0ZTw+CQkJCQkJXAorICAgIHN0cnVjdCBoYXNoPF9UcD4gOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBfVHA+ICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgb3BlcmF0b3IoKShfVHAgX192YWwpIGNvbnN0IG5vZXhjZXB0ICAgICAgICAgICAgICBcCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fdmFsKTsgfSAgICAgICAgICAgIFwKKyAgICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgYm9vbC4KKyAgX0N4eF9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChib29sKQorCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgY2hhci4KKyAgX0N4eF9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChjaGFyKQorCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3Igc2lnbmVkIGNoYXIuCisgIF9DeHhfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2goc2lnbmVkIGNoYXIpCisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciB1bnNpZ25lZCBjaGFyLgorICBfQ3h4X2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHVuc2lnbmVkIGNoYXIpCisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciB3Y2hhcl90LgorICBfQ3h4X2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHdjaGFyX3QpCisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBjaGFyMTZfdC4KKyAgX0N4eF9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChjaGFyMTZfdCkKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIGNoYXIzMl90LgorICBfQ3h4X2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKGNoYXIzMl90KQorCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3Igc2hvcnQuCisgIF9DeHhfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2goc2hvcnQpCisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBpbnQuCisgIF9DeHhfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2goaW50KQorCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgbG9uZy4KKyAgX0N4eF9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChsb25nKQorCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgbG9uZyBsb25nLgorICBfQ3h4X2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKGxvbmcgbG9uZykKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHVuc2lnbmVkIHNob3J0LgorICBfQ3h4X2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHVuc2lnbmVkIHNob3J0KQorCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgdW5zaWduZWQgaW50LgorICBfQ3h4X2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHVuc2lnbmVkIGludCkKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHVuc2lnbmVkIGxvbmcuCisgIF9DeHhfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2godW5zaWduZWQgbG9uZykKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHVuc2lnbmVkIGxvbmcgbG9uZy4KKyAgX0N4eF9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaCh1bnNpZ25lZCBsb25nIGxvbmcpCisKKyN1bmRlZiBfQ3h4X2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoCisKKyAgc3RydWN0IF9IYXNoX2ltcGwKKyAgeworICAgIHN0YXRpYyBzaXplX3QKKyAgICBoYXNoKGNvbnN0IHZvaWQqIF9fcHRyLCBzaXplX3QgX19jbGVuZ3RoLAorCSBzaXplX3QgX19zZWVkID0gc3RhdGljX2Nhc3Q8c2l6ZV90PigweGM3MGY2OTA3VUwpKQorICAgIHsgcmV0dXJuIF9IYXNoX2J5dGVzKF9fcHRyLCBfX2NsZW5ndGgsIF9fc2VlZCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIHN0YXRpYyBzaXplX3QKKyAgICAgIGhhc2goY29uc3QgX1RwJiBfX3ZhbCkKKyAgICAgIHsgcmV0dXJuIGhhc2goJl9fdmFsLCBzaXplb2YoX192YWwpKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgc3RhdGljIHNpemVfdAorICAgICAgX19oYXNoX2NvbWJpbmUoY29uc3QgX1RwJiBfX3ZhbCwgc2l6ZV90IF9faGFzaCkKKyAgICAgIHsgcmV0dXJuIGhhc2goJl9fdmFsLCBzaXplb2YoX192YWwpLCBfX2hhc2gpOyB9CisgIH07CisKKyAgc3RydWN0IF9GbnZfaGFzaF9pbXBsCisgIHsKKyAgICBzdGF0aWMgc2l6ZV90CisgICAgaGFzaChjb25zdCB2b2lkKiBfX3B0ciwgc2l6ZV90IF9fY2xlbmd0aCwKKwkgc2l6ZV90IF9fc2VlZCA9IHN0YXRpY19jYXN0PHNpemVfdD4oMjE2NjEzNjI2MVVMKSkKKyAgICB7IHJldHVybiBfRm52X2hhc2hfYnl0ZXMoX19wdHIsIF9fY2xlbmd0aCwgX19zZWVkKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgc3RhdGljIHNpemVfdAorICAgICAgaGFzaChjb25zdCBfVHAmIF9fdmFsKQorICAgICAgeyByZXR1cm4gaGFzaCgmX192YWwsIHNpemVvZihfX3ZhbCkpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBzdGF0aWMgc2l6ZV90CisgICAgICBfX2hhc2hfY29tYmluZShjb25zdCBfVHAmIF9fdmFsLCBzaXplX3QgX19oYXNoKQorICAgICAgeyByZXR1cm4gaGFzaCgmX192YWwsIHNpemVvZihfX3ZhbCksIF9faGFzaCk7IH0KKyAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGZsb2F0LgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8ZmxvYXQ+IDogcHVibGljIF9faGFzaF9iYXNlPHNpemVfdCwgZmxvYXQ+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGZsb2F0IF9fdmFsKSBjb25zdCBub2V4Y2VwdAorICAgICAgeworCS8vIDAgYW5kIC0wIGJvdGggaGFzaCB0byB6ZXJvLgorCXJldHVybiBfX3ZhbCAhPSAwLjBmID8gc3RkOjpfSGFzaF9pbXBsOjpoYXNoKF9fdmFsKSA6IDA7CisgICAgICB9CisgICAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGRvdWJsZS4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPGRvdWJsZT4gOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBkb3VibGU+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGRvdWJsZSBfX3ZhbCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsKKwkvLyAwIGFuZCAtMCBib3RoIGhhc2ggdG8gemVyby4KKwlyZXR1cm4gX192YWwgIT0gMC4wID8gc3RkOjpfSGFzaF9pbXBsOjpoYXNoKF9fdmFsKSA6IDA7CisgICAgICB9CisgICAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGxvbmcgZG91YmxlLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8bG9uZyBkb3VibGU+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBsb25nIGRvdWJsZT4KKyAgICB7CisgICAgICBfR0xJQkNYWF9QVVJFIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShsb25nIGRvdWJsZSBfX3ZhbCkgY29uc3Qgbm9leGNlcHQ7CisgICAgfTsKKworICAvLyBAfSBncm91cCBoYXNoZXMKKworICAvLyBIaW50IGFib3V0IHBlcmZvcm1hbmNlIG9mIGhhc2ggZnVuY3Rvci4gSWYgbm90IGZhc3QgdGhlIGhhc2ggYmFzZWQKKyAgLy8gY29udGFpbmVycyB3aWxsIGNhY2hlIHRoZSBoYXNoIGNvZGUuCisgIC8vIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gY29uc2lkZXIgdGhhdCBoYXNoZXIgYXJlIGZhc3QgdW5sZXNzIHNwZWNpZmllZAorICAvLyBvdGhlcndpc2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9IYXNoPgorICAgIHN0cnVjdCBfX2lzX2Zhc3RfaGFzaCA6IHB1YmxpYyBzdGQ6OnRydWVfdHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfZmFzdF9oYXNoPGhhc2g8bG9uZyBkb3VibGU+PiA6IHB1YmxpYyBzdGQ6OmZhbHNlX3R5cGUKKyAgICB7IH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIF9GVU5DVElPTkFMX0hBU0hfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2dzbGljZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2dzbGljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNWVjZmUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvZ3NsaWNlLmgKQEAgLTAsMCArMSwxODUgQEAKKy8vIFRoZSB0ZW1wbGF0ZSBhbmQgaW5saW5lcyBmb3IgdGhlIC0qLSBDKysgLSotIGdzbGljZSBjbGFzcy4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvZ3NsaWNlLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt2YWxhcnJheX0KKyAqLworCisvLyBXcml0dGVuIGJ5IEdhYnJpZWwgRG9zIFJlaXMgPEdhYnJpZWwuRG9zLVJlaXNARFBUTWF0aHMuRU5TLUNhY2hhbi5Gcj4KKworI2lmbmRlZiBfR1NMSUNFX0gKKyNkZWZpbmUgX0dTTElDRV9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIG51bWVyaWNfYXJyYXlzCisgICAqIEB7CisgICAqLworCisgIC8qKgorICAgKiAgQGJyaWVmICBDbGFzcyBkZWZpbmluZyBtdWx0aS1kaW1lbnNpb25hbCBzdWJzZXQgb2YgYW4gYXJyYXkuCisgICAqCisgICAqICBUaGUgc2xpY2UgY2xhc3MgcmVwcmVzZW50cyBhIG11bHRpLWRpbWVuc2lvbmFsIHN1YnNldCBvZiBhbiBhcnJheSwKKyAgICogIHNwZWNpZmllZCBieSB0aHJlZSBwYXJhbWV0ZXIgc2V0czogc3RhcnQgb2Zmc2V0LCBzaXplIGFycmF5LCBhbmQgc3RyaWRlCisgICAqICBhcnJheS4gIFRoZSBzdGFydCBvZmZzZXQgaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBhcnJheQorICAgKiAgdGhhdCBpcyBwYXJ0IG9mIHRoZSBzdWJzZXQuICBUaGUgc2l6ZSBhbmQgc3RyaWRlIGFycmF5IGRlc2NyaWJlIGVhY2gKKyAgICogIGRpbWVuc2lvbiBvZiB0aGUgc2xpY2UuICBTaXplIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhhdAorICAgKiAgZGltZW5zaW9uLCBhbmQgc3RyaWRlIGlzIHRoZSBkaXN0YW5jZSBpbiB0aGUgYXJyYXkgYmV0d2VlbiBzdWNjZXNzaXZlCisgICAqICBlbGVtZW50cyBpbiB0aGF0IGRpbWVuc2lvbi4gIEVhY2ggZGltZW5zaW9uJ3Mgc2l6ZSBhbmQgc3RyaWRlIGlzIHRha2VuCisgICAqICB0byBiZWdpbiBhdCBhbiBhcnJheSBlbGVtZW50IGRlc2NyaWJlZCBieSB0aGUgcHJldmlvdXMgZGltZW5zaW9uLiAgVGhlCisgICAqICBzaXplIGFycmF5IGFuZCBzdHJpZGUgYXJyYXkgbXVzdCBiZSB0aGUgc2FtZSBzaXplLgorICAgKgorICAgKiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIG9mZnNldD09Mywgc3RyaWRlWzBdPT0xMSwgc2l6ZVsxXT09MywKKyAgICogIHN0cmlkZVsxXT09MywgdGhlbiBzbGljZVswLDBdPT1hcnJheVszXSwgc2xpY2VbMCwxXT09YXJyYXlbNl0sCisgICAqICBzbGljZVswLDJdPT1hcnJheVs5XSwgc2xpY2VbMSwwXT09YXJyYXlbMTRdLCBzbGljZVsxLDFdPT1hcnJheVsxN10sCisgICAqICBzbGljZVsxLDJdPT1hcnJheVsyMF0uCisgICAqLworICBjbGFzcyBnc2xpY2UKKyAgeworICBwdWJsaWM6CisgICAgLy8vICBDb25zdHJ1Y3QgYW4gZW1wdHkgc2xpY2UuCisgICAgZ3NsaWNlKCk7CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3QgYSBzbGljZS4KKyAgICAgKgorICAgICAqICBDb25zdHJ1Y3RzIGEgc2xpY2Ugd2l0aCBhcyBtYW55IGRpbWVuc2lvbnMgYXMgdGhlIGxlbmd0aCBvZiB0aGUgQGEgbAorICAgICAqICBhbmQgQGEgcyBhcnJheXMuCisgICAgICoKKyAgICAgKiAgQHBhcmFtICBfX28gIE9mZnNldCBpbiBhcnJheSBvZiBmaXJzdCBlbGVtZW50LgorICAgICAqICBAcGFyYW0gIF9fbCAgQXJyYXkgb2YgZGltZW5zaW9uIGxlbmd0aHMuCisgICAgICogIEBwYXJhbSAgX19zICBBcnJheSBvZiBkaW1lbnNpb24gc3RyaWRlcyBiZXR3ZWVuIGFycmF5IGVsZW1lbnRzLgorICAgICAqLworICAgIGdzbGljZShzaXplX3QgX19vLCBjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfX2wsIAorCSAgIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9fcyk7CisKKyAgICAvLyBYWFg6IHRoZSBJUyBzYXlzIHRoZSBjb3B5LWN0b3IgYW5kIGNvcHktYXNzaWdubWVudCBvcGVyYXRvcnMgYXJlCisgICAgLy8gICAgICBzeW50aGVzaXplZCBieSB0aGUgY29tcGlsZXIgYnV0IHRoZXkgYXJlIGp1c3QgdW5zdWl0YWJsZQorICAgIC8vICAgICAgZm9yIGEgcmVmLWNvdW50ZWQgc2VtYW50aWMKKyAgICAvLy8gIENvcHkgY29uc3RydWN0b3IuCisgICAgZ3NsaWNlKGNvbnN0IGdzbGljZSYpOworCisgICAgLy8vICBEZXN0cnVjdG9yLgorICAgIH5nc2xpY2UoKTsKKworICAgIC8vIFhYWDogU2VlIHRoZSBub3RlIGFib3ZlLgorICAgIC8vLyAgQXNzaWdubWVudCBvcGVyYXRvci4KKyAgICBnc2xpY2UmIG9wZXJhdG9yPShjb25zdCBnc2xpY2UmKTsKKworICAgIC8vLyAgUmV0dXJuIGFycmF5IG9mZnNldCBvZiBmaXJzdCBzbGljZSBlbGVtZW50LgorICAgIHNpemVfdCAgICAgICAgICAgc3RhcnQoKSBjb25zdDsKKworICAgIC8vLyAgUmV0dXJuIGFycmF5IG9mIHNpemVzIG9mIHNsaWNlIGRpbWVuc2lvbnMuCisgICAgdmFsYXJyYXk8c2l6ZV90PiBzaXplKCkgY29uc3Q7CisgICAgCisgICAgLy8vICBSZXR1cm4gYXJyYXkgb2YgYXJyYXkgc3RyaWRlcyBmb3IgZWFjaCBkaW1lbnNpb24uCisgICAgdmFsYXJyYXk8c2l6ZV90PiBzdHJpZGUoKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIHN0cnVjdCBfSW5kZXhlcgorICAgIHsKKyAgICAgIHNpemVfdCBfTV9jb3VudDsKKyAgICAgIHNpemVfdCBfTV9zdGFydDsKKyAgICAgIHZhbGFycmF5PHNpemVfdD4gX01fc2l6ZTsKKyAgICAgIHZhbGFycmF5PHNpemVfdD4gX01fc3RyaWRlOworICAgICAgdmFsYXJyYXk8c2l6ZV90PiBfTV9pbmRleDsgLy8gTGluZWFyIGFycmF5IG9mIHJlZmVyZW5jZWQgaW5kaWNlcworCisgICAgICBfSW5kZXhlcigpCisgICAgICA6IF9NX2NvdW50KDEpLCBfTV9zdGFydCgwKSwgX01fc2l6ZSgpLCBfTV9zdHJpZGUoKSwgX01faW5kZXgoKSB7fQorCisgICAgICBfSW5kZXhlcihzaXplX3QsIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mLAorCSAgICAgICBjb25zdCB2YWxhcnJheTxzaXplX3Q+Jik7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luY3JlbWVudF91c2UoKQorICAgICAgeyArK19NX2NvdW50OyB9CisgICAgICAKKyAgICAgIHNpemVfdAorICAgICAgX01fZGVjcmVtZW50X3VzZSgpCisgICAgICB7IHJldHVybiAtLV9NX2NvdW50OyB9CisgICAgfTsKKworICAgIF9JbmRleGVyKiBfTV9pbmRleDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gZnJpZW5kIGNsYXNzIHZhbGFycmF5OworICB9OworCisgIGlubGluZSBzaXplX3QKKyAgZ3NsaWNlOjpzdGFydCgpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2luZGV4ID8gX01faW5kZXgtPl9NX3N0YXJ0IDogMDsgfQorCisgIGlubGluZSB2YWxhcnJheTxzaXplX3Q+CisgIGdzbGljZTo6c2l6ZSgpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2luZGV4ID8gX01faW5kZXgtPl9NX3NpemUgOiB2YWxhcnJheTxzaXplX3Q+KCk7IH0KKworICBpbmxpbmUgdmFsYXJyYXk8c2l6ZV90PgorICBnc2xpY2U6OnN0cmlkZSgpIGNvbnN0CisgIHsgcmV0dXJuIF9NX2luZGV4ID8gX01faW5kZXgtPl9NX3N0cmlkZSA6IHZhbGFycmF5PHNpemVfdD4oKTsgfQorCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gNTQzLiB2YWxhcnJheSBzbGljZSBkZWZhdWx0IGNvbnN0cnVjdG9yCisgIGlubGluZQorICBnc2xpY2U6OmdzbGljZSgpCisgIDogX01faW5kZXgobmV3IGdzbGljZTo6X0luZGV4ZXIoKSkge30KKworICBpbmxpbmUKKyAgZ3NsaWNlOjpnc2xpY2Uoc2l6ZV90IF9fbywgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX19sLAorCQkgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX19zKQorICA6IF9NX2luZGV4KG5ldyBnc2xpY2U6Ol9JbmRleGVyKF9fbywgX19sLCBfX3MpKSB7fQorCisgIGlubGluZQorICBnc2xpY2U6OmdzbGljZShjb25zdCBnc2xpY2UmIF9fZykKKyAgOiBfTV9pbmRleChfX2cuX01faW5kZXgpCisgIHsgaWYgKF9NX2luZGV4KSBfTV9pbmRleC0+X01faW5jcmVtZW50X3VzZSgpOyB9CisKKyAgaW5saW5lCisgIGdzbGljZTo6fmdzbGljZSgpCisgIHsKKyAgICBpZiAoX01faW5kZXggJiYgX01faW5kZXgtPl9NX2RlY3JlbWVudF91c2UoKSA9PSAwKQorICAgICAgZGVsZXRlIF9NX2luZGV4OworICB9CisKKyAgaW5saW5lIGdzbGljZSYKKyAgZ3NsaWNlOjpvcGVyYXRvcj0oY29uc3QgZ3NsaWNlJiBfX2cpCisgIHsKKyAgICBpZiAoX19nLl9NX2luZGV4KQorICAgICAgX19nLl9NX2luZGV4LT5fTV9pbmNyZW1lbnRfdXNlKCk7CisgICAgaWYgKF9NX2luZGV4ICYmIF9NX2luZGV4LT5fTV9kZWNyZW1lbnRfdXNlKCkgPT0gMCkKKyAgICAgIGRlbGV0ZSBfTV9pbmRleDsKKyAgICBfTV9pbmRleCA9IF9fZy5fTV9pbmRleDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBAfSBncm91cCBudW1lcmljX2FycmF5cworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfR1NMSUNFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9nc2xpY2VfYXJyYXkuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9nc2xpY2VfYXJyYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2IxODg2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2dzbGljZV9hcnJheS5oCkBAIC0wLDAgKzEsMjE4IEBACisvLyBUaGUgdGVtcGxhdGUgYW5kIGlubGluZXMgZm9yIHRoZSAtKi0gQysrIC0qLSBnc2xpY2VfYXJyYXkgY2xhc3MuCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2dzbGljZV9hcnJheS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dmFsYXJyYXl9CisgKi8KKworLy8gV3JpdHRlbiBieSBHYWJyaWVsIERvcyBSZWlzIDxHYWJyaWVsLkRvcy1SZWlzQERQVE1hdGhzLkVOUy1DYWNoYW4uRnI+CisKKyNpZm5kZWYgX0dTTElDRV9BUlJBWV9ICisjZGVmaW5lIF9HU0xJQ0VfQVJSQVlfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBudW1lcmljX2FycmF5cworICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogIEBicmllZiAgUmVmZXJlbmNlIHRvIG11bHRpLWRpbWVuc2lvbmFsIHN1YnNldCBvZiBhbiBhcnJheS4KKyAgICoKKyAgICogIEEgZ3NsaWNlX2FycmF5IGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBhY3R1YWwgZWxlbWVudHMgb2YgYW4gYXJyYXkKKyAgICogIHNwZWNpZmllZCBieSBhIGdzbGljZS4gIFRoZSB3YXkgdG8gZ2V0IGEgZ3NsaWNlX2FycmF5IGlzIHRvIGNhbGwKKyAgICogIG9wZXJhdG9yW10oZ3NsaWNlKSBvbiBhIHZhbGFycmF5LiAgVGhlIHJldHVybmVkIGdzbGljZV9hcnJheSB0aGVuCisgICAqICBwZXJtaXRzIGNhcnJ5aW5nIG9wZXJhdGlvbnMgb3V0IG9uIHRoZSByZWZlcmVuY2VkIHN1YnNldCBvZiBlbGVtZW50cyBpbgorICAgKiAgdGhlIG9yaWdpbmFsIHZhbGFycmF5LiAgRm9yIGV4YW1wbGUsIG9wZXJhdG9yKz0odmFsYXJyYXkpIHdpbGwgYWRkCisgICAqICB2YWx1ZXMgdG8gdGhlIHN1YnNldCBvZiBlbGVtZW50cyBpbiB0aGUgdW5kZXJseWluZyB2YWxhcnJheSB0aGlzCisgICAqICBnc2xpY2VfYXJyYXkgcmVmZXJzIHRvLgorICAgKgorICAgKiAgQHBhcmFtICBUcCAgRWxlbWVudCB0eXBlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIGdzbGljZV9hcnJheQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyNTMuIHZhbGFycmF5IGhlbHBlciBmdW5jdGlvbnMgYXJlIGFsbW9zdCBlbnRpcmVseSB1c2VsZXNzCisKKyAgICAgIC8vLyAgQ29weSBjb25zdHJ1Y3Rvci4gIEJvdGggc2xpY2VzIHJlZmVyIHRvIHRoZSBzYW1lIHVuZGVybHlpbmcgYXJyYXkuCisgICAgICBnc2xpY2VfYXJyYXkoY29uc3QgZ3NsaWNlX2FycmF5Jik7CisKKyAgICAgIC8vLyAgQXNzaWdubWVudCBvcGVyYXRvci4gIEFzc2lnbnMgc2xpY2UgZWxlbWVudHMgdG8gY29ycmVzcG9uZGluZworICAgICAgLy8vICBlbGVtZW50cyBvZiBAYSBhLgorICAgICAgZ3NsaWNlX2FycmF5JiBvcGVyYXRvcj0oY29uc3QgZ3NsaWNlX2FycmF5Jik7CisKKyAgICAgIC8vLyAgQXNzaWduIHNsaWNlIGVsZW1lbnRzIHRvIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTXVsdGlwbHkgc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcio9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgRGl2aWRlIHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3IvPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIE1vZHVsbyBzbGljZSBlbGVtZW50cyBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yJT0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBBZGQgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2IHRvIHNsaWNlIGVsZW1lbnRzLgorICAgICAgdm9pZCBvcGVyYXRvcis9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgU3VidHJhY3QgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2IGZyb20gc2xpY2UgZWxlbWVudHMuCisgICAgICB2b2lkIG9wZXJhdG9yLT0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBMb2dpY2FsIHhvciBzbGljZSBlbGVtZW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3JePShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIExvZ2ljYWwgYW5kIHNsaWNlIGVsZW1lbnRzIHdpdGggY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvciY9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTG9naWNhbCBvciBzbGljZSBlbGVtZW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3J8PShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIExlZnQgc2hpZnQgc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcjw8PShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIFJpZ2h0IHNoaWZ0IHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3I+Pj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBBc3NpZ24gYWxsIHNsaWNlIGVsZW1lbnRzIHRvIEBhIHQuCisgICAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBfVHAmKSBjb25zdDsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvcio9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3IvPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yJT0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvcis9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3ItPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yXj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvciY9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3J8PShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yPDw9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3I+Pj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgIF9BcnJheTxfVHA+ICAgIF9NX2FycmF5OworICAgICAgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX01faW5kZXg7CisKKyAgICAgIGZyaWVuZCBjbGFzcyB2YWxhcnJheTxfVHA+OworCisgICAgICBnc2xpY2VfYXJyYXkoX0FycmF5PF9UcD4sIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mKTsKKworICAgICAgLy8gbm90IGltcGxlbWVudGVkCisgICAgICBnc2xpY2VfYXJyYXkoKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICBnc2xpY2VfYXJyYXk8X1RwPjo6Z3NsaWNlX2FycmF5KF9BcnJheTxfVHA+IF9fYSwKKwkJCQkgICAgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX19pKQorICAgIDogX01fYXJyYXkoX19hKSwgX01faW5kZXgoX19pKSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICBnc2xpY2VfYXJyYXk8X1RwPjo6Z3NsaWNlX2FycmF5KGNvbnN0IGdzbGljZV9hcnJheTxfVHA+JiBfX2EpCisgICAgOiBfTV9hcnJheShfX2EuX01fYXJyYXkpLCBfTV9pbmRleChfX2EuX01faW5kZXgpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBnc2xpY2VfYXJyYXk8X1RwPiYKKyAgICBnc2xpY2VfYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IGdzbGljZV9hcnJheTxfVHA+JiBfX2EpCisgICAgeworICAgICAgc3RkOjpfX3ZhbGFycmF5X2NvcHkoX0FycmF5PF9UcD4oX19hLl9NX2FycmF5KSwKKwkJCSAgIF9BcnJheTxzaXplX3Q+KF9fYS5fTV9pbmRleCksIF9NX2luZGV4LnNpemUoKSwKKwkJCSAgIF9NX2FycmF5LCBfQXJyYXk8c2l6ZV90PihfTV9pbmRleCkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBnc2xpY2VfYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IF9UcCYgX190KSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6X192YWxhcnJheV9maWxsKF9NX2FycmF5LCBfQXJyYXk8c2l6ZV90PihfTV9pbmRleCksCisJCQkgICBfTV9pbmRleC5zaXplKCksIF9fdCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIGdzbGljZV9hcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgdmFsYXJyYXk8X1RwPiYgX192KSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6X192YWxhcnJheV9jb3B5KF9BcnJheTxfVHA+KF9fdiksIF9fdi5zaXplKCksCisJCQkgICBfTV9hcnJheSwgX0FycmF5PHNpemVfdD4oX01faW5kZXgpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICBpbmxpbmUgdm9pZAorICAgICAgZ3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JiBfX2UpIGNvbnN0CisgICAgICB7CisJc3RkOjpfX3ZhbGFycmF5X2NvcHkgKF9fZSwgX01faW5kZXguc2l6ZSgpLCBfTV9hcnJheSwKKwkJCSAgICAgIF9BcnJheTxzaXplX3Q+KF9NX2luZGV4KSk7CisgICAgICB9CisKKyN1bmRlZiBfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SCisjZGVmaW5lIF9ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoX09wLCBfTmFtZSkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CQkJCQkJXAorICAgIGlubGluZSB2b2lkCQkJCQkJCQlcCisgICAgZ3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yIF9PcCMjPShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YpIGNvbnN0CVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9NX2FycmF5LCBfQXJyYXk8c2l6ZV90PihfTV9pbmRleCksCVwKKwkJCSAgICAgICBfQXJyYXk8X1RwPihfX3YpLCBfX3Yuc2l6ZSgpKTsJCVwKKyAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CQkJCSAgICAgICAgICAgICAgICBcCisgICAgICBpbmxpbmUgdm9pZAkJCQkJCQlcCisgICAgICBnc2xpY2VfYXJyYXk8X1RwPjo6b3BlcmF0b3IgX09wIyM9IChjb25zdCBfRXhwcjxfRG9tLCBfVHA+JiBfX2UpIGNvbnN0XAorICAgICAgewkJCQkJCQkJCVwKKwlfQXJyYXlfYXVnbWVudGVkXyMjX05hbWUoX01fYXJyYXksIF9BcnJheTxzaXplX3Q+KF9NX2luZGV4KSwgX19lLFwKKwkJCQkgX01faW5kZXguc2l6ZSgpKTsJCQlcCisgICAgICB9CisKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoKiwgX19tdWx0aXBsaWVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigvLCBfX2RpdmlkZXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKCUsIF9fbW9kdWx1cykKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoKywgX19wbHVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigtLCBfX21pbnVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUiheLCBfX2JpdHdpc2VfeG9yKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigmLCBfX2JpdHdpc2VfYW5kKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUih8LCBfX2JpdHdpc2Vfb3IpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKDw8LCBfX3NoaWZ0X2xlZnQpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKD4+LCBfX3NoaWZ0X3JpZ2h0KQorCisjdW5kZWYgX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUgorCisgIC8vIEB9IGdyb3VwIG51bWVyaWNfYXJyYXlzCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9HU0xJQ0VfQVJSQVlfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2hhc2hfYnl0ZXMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9oYXNoX2J5dGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNlNGUwNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9oYXNoX2J5dGVzLmgKQEAgLTAsMCArMSw1OSBAQAorLy8gRGVjbGFyYXRpb25zIGZvciBoYXNoIGZ1bmN0aW9ucy4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvaGFzaF9ieXRlcy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZnVuY3Rpb25hbH0KKyAqLworCisjaWZuZGVmIF9IQVNIX0JZVEVTX0gKKyNkZWZpbmUgX0hBU0hfQllURVNfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKK25hbWVzcGFjZSBzdGQKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gSGFzaCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIG5vbnRyaXZpYWwgc3BlY2lhbGl6YXRpb24uCisgIC8vIEFsbCBvZiB0aGVtIGFyZSBiYXNlZCBvbiBhIHByaW1pdGl2ZSB0aGF0IGhhc2hlcyBhIHBvaW50ZXIgdG8gYQorICAvLyBieXRlIGFycmF5LiBUaGUgYWN0dWFsIGhhc2ggYWxnb3JpdGhtIGlzIG5vdCBndWFyYW50ZWVkIHRvIHN0YXkKKyAgLy8gdGhlIHNhbWUgZnJvbSByZWxlYXNlIHRvIHJlbGVhc2UgLS0gaXQgbWF5IGJlIHVwZGF0ZWQgb3IgdHVuZWQgdG8KKyAgLy8gaW1wcm92ZSBoYXNoIHF1YWxpdHkgb3Igc3BlZWQuCisgIHNpemVfdAorICBfSGFzaF9ieXRlcyhjb25zdCB2b2lkKiBfX3B0ciwgc2l6ZV90IF9fbGVuLCBzaXplX3QgX19zZWVkKTsKKworICAvLyBBIHNpbWlsYXIgaGFzaCBwcmltaXRpdmUsIHVzaW5nIHRoZSBGTlYgaGFzaCBhbGdvcml0aG0uIFRoaXMKKyAgLy8gYWxnb3JpdGhtIGlzIGd1YXJhbnRlZWQgdG8gc3RheSB0aGUgc2FtZSBmcm9tIHJlbGVhc2UgdG8gcmVsZWFzZS4KKyAgLy8gKGFsdGhvdWdoIGl0IG1pZ2h0IG5vdCBwcm9kdWNlIHRoZSBzYW1lIHZhbHVlcyBvbiBkaWZmZXJlbnQKKyAgLy8gbWFjaGluZXMuKQorICBzaXplX3QKKyAgX0Zudl9oYXNoX2J5dGVzKGNvbnN0IHZvaWQqIF9fcHRyLCBzaXplX3QgX19sZW4sIHNpemVfdCBfX3NlZWQpOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2hhc2h0YWJsZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2hhc2h0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NmU5YmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvaGFzaHRhYmxlLmgKQEAgLTAsMCArMSwxODIzIEBACisvLyBoYXNodGFibGUuaCBoZWFkZXIgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvaGFzaHRhYmxlLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt1bm9yZGVyZWRfbWFwLCB1bm9yZGVyZWRfc2V0fQorICovCisKKyNpZm5kZWYgX0hBU0hUQUJMRV9ICisjZGVmaW5lIF9IQVNIVEFCTEVfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvaGFzaHRhYmxlX3BvbGljeS5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSGFzaD4KKyAgICB1c2luZyBfX2NhY2hlX2RlZmF1bHQKKyAgICAgID0gIF9fbm90XzxfX2FuZF88Ly8gRG8gbm90IGNhY2hlIGZvciBmYXN0IGhhc2hlci4KKwkJICAgICAgIF9faXNfZmFzdF9oYXNoPF9IYXNoPiwKKwkJICAgICAgIC8vIE1hbmRhdG9yeSB0byBtYWtlIGxvY2FsX2l0ZXJhdG9yIGRlZmF1bHQKKwkJICAgICAgIC8vIGNvbnN0cnVjdGlibGUgYW5kIGFzc2lnbmFibGUuCisJCSAgICAgICBpc19kZWZhdWx0X2NvbnN0cnVjdGlibGU8X0hhc2g+LAorCQkgICAgICAgaXNfY29weV9hc3NpZ25hYmxlPF9IYXNoPiwKKwkJICAgICAgIC8vIE1hbmRhdG9yeSB0byBoYXZlIGVyYXNlIG5vdCB0aHJvd2luZy4KKwkJICAgICAgIF9fZGV0YWlsOjpfX2lzX25vZXhjZXB0X2hhc2g8X1RwLCBfSGFzaD4+PjsKKworICAvKioKKyAgICogIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUgX0hhc2h0YWJsZS4KKyAgICoKKyAgICogIEBpbmdyb3VwIGhhc2h0YWJsZS1kZXRhaWwKKyAgICoKKyAgICogIEB0cGFyYW0gX1ZhbHVlICBDb3B5Q29uc3RydWN0aWJsZSB0eXBlLgorICAgKgorICAgKiAgQHRwYXJhbSBfS2V5ICAgIENvcHlDb25zdHJ1Y3RpYmxlIHR5cGUuCisgICAqCisgICAqICBAdHBhcmFtIF9BbGxvYyAgQW4gYWxsb2NhdG9yIHR5cGUKKyAgICogIChbbGliLmFsbG9jYXRvci5yZXF1aXJlbWVudHNdKSB3aG9zZSBfQWxsb2M6OnZhbHVlX3R5cGUgaXMKKyAgICogIF9WYWx1ZS4gIEFzIGEgY29uZm9ybWluZyBleHRlbnNpb24sIHdlIGFsbG93IGZvcgorICAgKiAgX0FsbG9jOjp2YWx1ZV90eXBlICE9IF9WYWx1ZS4KKyAgICoKKyAgICogIEB0cGFyYW0gX0V4dHJhY3RLZXkgIEZ1bmN0aW9uIG9iamVjdCB0aGF0IHRha2VzIGFuIG9iamVjdCBvZiB0eXBlCisgICAqICBfVmFsdWUgYW5kIHJldHVybnMgYSB2YWx1ZSBvZiB0eXBlIF9LZXkuCisgICAqCisgICAqICBAdHBhcmFtIF9FcXVhbCAgRnVuY3Rpb24gb2JqZWN0IHRoYXQgdGFrZXMgdHdvIG9iamVjdHMgb2YgdHlwZSBrCisgICAqICBhbmQgcmV0dXJucyBhIGJvb2wtbGlrZSB2YWx1ZSB0aGF0IGlzIHRydWUgaWYgdGhlIHR3byBvYmplY3RzCisgICAqICBhcmUgY29uc2lkZXJlZCBlcXVhbC4KKyAgICoKKyAgICogIEB0cGFyYW0gX0gxICBUaGUgaGFzaCBmdW5jdGlvbi4gQSB1bmFyeSBmdW5jdGlvbiBvYmplY3Qgd2l0aAorICAgKiAgYXJndW1lbnQgdHlwZSBfS2V5IGFuZCByZXN1bHQgdHlwZSBzaXplX3QuIFJldHVybiB2YWx1ZXMgc2hvdWxkCisgICAqICBiZSBkaXN0cmlidXRlZCBvdmVyIHRoZSBlbnRpcmUgcmFuZ2UgWzAsIG51bWVyaWNfbGltaXRzPHNpemVfdD46OjptYXgoKV0uCisgICAqCisgICAqICBAdHBhcmFtIF9IMiAgVGhlIHJhbmdlLWhhc2hpbmcgZnVuY3Rpb24gKGluIHRoZSB0ZXJtaW5vbG9neSBvZgorICAgKiAgVGF2b3JpIGFuZCBEcmVpemluKS4gIEEgYmluYXJ5IGZ1bmN0aW9uIG9iamVjdCB3aG9zZSBhcmd1bWVudAorICAgKiAgdHlwZXMgYW5kIHJlc3VsdCB0eXBlIGFyZSBhbGwgc2l6ZV90LiAgR2l2ZW4gYXJndW1lbnRzIHIgYW5kIE4sCisgICAqICB0aGUgcmV0dXJuIHZhbHVlIGlzIGluIHRoZSByYW5nZSBbMCwgTikuCisgICAqCisgICAqICBAdHBhcmFtIF9IYXNoICBUaGUgcmFuZ2VkIGhhc2ggZnVuY3Rpb24gKFRhdm9yaSBhbmQgRHJlaXppbikuIEEKKyAgICogIGJpbmFyeSBmdW5jdGlvbiB3aG9zZSBhcmd1bWVudCB0eXBlcyBhcmUgX0tleSBhbmQgc2l6ZV90IGFuZAorICAgKiAgd2hvc2UgcmVzdWx0IHR5cGUgaXMgc2l6ZV90LiAgR2l2ZW4gYXJndW1lbnRzIGsgYW5kIE4sIHRoZQorICAgKiAgcmV0dXJuIHZhbHVlIGlzIGluIHRoZSByYW5nZSBbMCwgTikuICBEZWZhdWx0OiBoYXNoKGssIE4pID0KKyAgICogIGgyKGgxKGspLCBOKS4gIElmIF9IYXNoIGlzIGFueXRoaW5nIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQsIF9IMQorICAgKiAgYW5kIF9IMiBhcmUgaWdub3JlZC4KKyAgICoKKyAgICogIEB0cGFyYW0gX1JlaGFzaFBvbGljeSAgUG9saWN5IGNsYXNzIHdpdGggdGhyZWUgbWVtYmVycywgYWxsIG9mCisgICAqICB3aGljaCBnb3Zlcm4gdGhlIGJ1Y2tldCBjb3VudC4gX01fbmV4dF9ia3QobikgcmV0dXJucyBhIGJ1Y2tldAorICAgKiAgY291bnQgbm8gc21hbGxlciB0aGFuIG4uICBfTV9ia3RfZm9yX2VsZW1lbnRzKG4pIHJldHVybnMgYQorICAgKiAgYnVja2V0IGNvdW50IGFwcHJvcHJpYXRlIGZvciBhbiBlbGVtZW50IGNvdW50IG9mIG4uCisgICAqICBfTV9uZWVkX3JlaGFzaChuX2JrdCwgbl9lbHQsIG5faW5zKSBkZXRlcm1pbmVzIHdoZXRoZXIsIGlmIHRoZQorICAgKiAgY3VycmVudCBidWNrZXQgY291bnQgaXMgbl9ia3QgYW5kIHRoZSBjdXJyZW50IGVsZW1lbnQgY291bnQgaXMKKyAgICogIG5fZWx0LCB3ZSBuZWVkIHRvIGluY3JlYXNlIHRoZSBidWNrZXQgY291bnQuICBJZiBzbywgcmV0dXJucworICAgKiAgbWFrZV9wYWlyKHRydWUsIG4pLCB3aGVyZSBuIGlzIHRoZSBuZXcgYnVja2V0IGNvdW50LiAgSWYgbm90LAorICAgKiAgcmV0dXJucyBtYWtlX3BhaXIoZmFsc2UsIDxhbnl0aGluZz4pCisgICAqCisgICAqICBAdHBhcmFtIF9UcmFpdHMgIENvbXBpbGUtdGltZSBjbGFzcyB3aXRoIHRocmVlIGJvb2xlYW4KKyAgICogIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQgbWVtYmVyczogIF9fY2FjaGVfaGFzaF9jb2RlLCBfX2NvbnN0YW50X2l0ZXJhdG9ycywKKyAgICogICBfX3VuaXF1ZV9rZXlzLgorICAgKgorICAgKiAgRWFjaCBfSGFzaHRhYmxlIGRhdGEgc3RydWN0dXJlIGhhczoKKyAgICoKKyAgICogIC0gX0J1Y2tldFtdICAgICAgIF9NX2J1Y2tldHMKKyAgICogIC0gX0hhc2hfbm9kZV9iYXNlIF9NX2JiZWdpbgorICAgKiAgLSBzaXplX3R5cGUgICAgICAgX01fYnVja2V0X2NvdW50CisgICAqICAtIHNpemVfdHlwZSAgICAgICBfTV9lbGVtZW50X2NvdW50CisgICAqCisgICAqICB3aXRoIF9CdWNrZXQgYmVpbmcgX0hhc2hfbm9kZSogYW5kIF9IYXNoX25vZGUgY29udGFpbmluZzoKKyAgICoKKyAgICogIC0gX0hhc2hfbm9kZSogICBfTV9uZXh0CisgICAqICAtIFRwICAgICAgICAgICAgX01fdmFsdWUKKyAgICogIC0gc2l6ZV90ICAgICAgICBfTV9oYXNoX2NvZGUgaWYgY2FjaGVfaGFzaF9jb2RlIGlzIHRydWUKKyAgICoKKyAgICogIEluIHRlcm1zIG9mIFN0YW5kYXJkIGNvbnRhaW5lcnMgdGhlIGhhc2h0YWJsZSBpcyBsaWtlIHRoZSBhZ2dyZWdhdGlvbiBvZjoKKyAgICoKKyAgICogIC0gc3RkOjpmb3J3YXJkX2xpc3Q8X05vZGU+IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzCisgICAqICAtIHN0ZDo6dmVjdG9yPHN0ZDo6Zm9yd2FyZF9saXN0PF9Ob2RlPjo6aXRlcmF0b3I+IHJlcHJlc2VudGluZyB0aGUgYnVja2V0cworICAgKgorICAgKiAgVGhlIG5vbi1lbXB0eSBidWNrZXRzIGNvbnRhaW4gdGhlIG5vZGUgYmVmb3JlIHRoZSBmaXJzdCBub2RlIGluIHRoZQorICAgKiAgYnVja2V0LiBUaGlzIGRlc2lnbiBtYWtlcyBpdCBwb3NzaWJsZSB0byBpbXBsZW1lbnQgc29tZXRoaW5nIGxpa2UgYQorICAgKiAgc3RkOjpmb3J3YXJkX2xpc3Q6Omluc2VydF9hZnRlciBvbiBjb250YWluZXIgaW5zZXJ0aW9uIGFuZAorICAgKiAgc3RkOjpmb3J3YXJkX2xpc3Q6OmVyYXNlX2FmdGVyIG9uIGNvbnRhaW5lciBlcmFzZQorICAgKiAgY2FsbHMuIF9NX2JlZm9yZV9iZWdpbiBpcyBlcXVpdmFsZW50IHRvCisgICAqICBzdGQ6OmZvcndhcmRfbGlzdDo6YmVmb3JlX2JlZ2luLiBFbXB0eSBidWNrZXRzIGNvbnRhaW4KKyAgICogIG51bGxwdHIuICBOb3RlIHRoYXQgb25lIG9mIHRoZSBub24tZW1wdHkgYnVja2V0cyBjb250YWlucworICAgKiAgJl9NX2JlZm9yZV9iZWdpbiB3aGljaCBpcyBub3QgYSBkZXJlZmVyZW5jZWFibGUgbm9kZSBzbyB0aGUKKyAgICogIG5vZGUgcG9pbnRlciBpbiBhIGJ1Y2tldCBzaGFsbCBuZXZlciBiZSBkZXJlZmVyZW5jZWQsIG9ubHkgaXRzCisgICAqICBuZXh0IG5vZGUgY2FuIGJlLgorICAgKgorICAgKiAgV2Fsa2luZyB0aHJvdWdoIGEgYnVja2V0J3Mgbm9kZXMgcmVxdWlyZXMgYSBjaGVjayBvbiB0aGUgaGFzaCBjb2RlIHRvCisgICAqICBzZWUgaWYgZWFjaCBub2RlIGlzIHN0aWxsIGluIHRoZSBidWNrZXQuIFN1Y2ggYSBkZXNpZ24gYXNzdW1lcyBhCisgICAqICBxdWl0ZSBlZmZpY2llbnQgaGFzaCBmdW5jdG9yIGFuZCBpcyBvbmUgb2YgdGhlIHJlYXNvbnMgaXQgaXMKKyAgICogIGhpZ2hseSBhZHZpc2FibGUgdG8gc2V0IF9fY2FjaGVfaGFzaF9jb2RlIHRvIHRydWUuCisgICAqCisgICAqICBUaGUgY29udGFpbmVyIGl0ZXJhdG9ycyBhcmUgc2ltcGx5IGJ1aWx0IGZyb20gbm9kZXMuIFRoaXMgd2F5CisgICAqICBpbmNyZW1lbnRpbmcgdGhlIGl0ZXJhdG9yIGlzIHBlcmZlY3RseSBlZmZpY2llbnQgaW5kZXBlbmRlbnQgb2YKKyAgICogIGhvdyBtYW55IGVtcHR5IGJ1Y2tldHMgdGhlcmUgYXJlIGluIHRoZSBjb250YWluZXIuCisgICAqCisgICAqICBPbiBpbnNlcnQgd2UgY29tcHV0ZSB0aGUgZWxlbWVudCdzIGhhc2ggY29kZSBhbmQgdXNlIGl0IHRvIGZpbmQgdGhlCisgICAqICBidWNrZXQgaW5kZXguIElmIHRoZSBlbGVtZW50IG11c3QgYmUgaW5zZXJ0ZWQgaW4gYW4gZW1wdHkgYnVja2V0CisgICAqICB3ZSBhZGQgaXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2luZ2x5IGxpbmtlZCBsaXN0IGFuZCBtYWtlIHRoZQorICAgKiAgYnVja2V0IHBvaW50IHRvIF9NX2JlZm9yZV9iZWdpbi4gVGhlIGJ1Y2tldCB0aGF0IHVzZWQgdG8gcG9pbnQgdG8KKyAgICogIF9NX2JlZm9yZV9iZWdpbiwgaWYgYW55LCBpcyB1cGRhdGVkIHRvIHBvaW50IHRvIGl0cyBuZXcgYmVmb3JlCisgICAqICBiZWdpbiBub2RlLgorICAgKgorICAgKiAgT24gZXJhc2UsIHRoZSBzaW1wbGUgaXRlcmF0b3IgZGVzaWduIHJlcXVpcmVzIHVzaW5nIHRoZSBoYXNoCisgICAqICBmdW5jdG9yIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGJ1Y2tldCB0byB1cGRhdGUuIEZvciB0aGlzCisgICAqICByZWFzb24sIHdoZW4gX19jYWNoZV9oYXNoX2NvZGUgaXMgc2V0IHRvIGZhbHNlIHRoZSBoYXNoIGZ1bmN0b3IgbXVzdAorICAgKiAgbm90IHRocm93IGFuZCB0aGlzIGlzIGVuZm9yY2VkIGJ5IGEgc3RhdGljIGFzc2VydGlvbi4KKyAgICoKKyAgICogIEZ1bmN0aW9uYWxpdHkgaXMgaW1wbGVtZW50ZWQgYnkgZGVjb21wb3NpdGlvbiBpbnRvIGJhc2UgY2xhc3NlcywKKyAgICogIHdoZXJlIHRoZSBkZXJpdmVkIF9IYXNodGFibGUgY2xhc3MgaXMgdXNlZCBpbiBfTWFwX2Jhc2UsCisgICAqICBfSW5zZXJ0LCBfUmVoYXNoX2Jhc2UsIGFuZCBfRXF1YWxpdHkgYmFzZSBjbGFzc2VzIHRvIGFjY2VzcyB0aGUKKyAgICogICJ0aGlzIiBwb2ludGVyLiBfSGFzaHRhYmxlX2Jhc2UgaXMgdXNlZCBpbiB0aGUgYmFzZSBjbGFzc2VzIGFzIGEKKyAgICogIG5vbi1yZWN1cnNpdmUsIGZ1bGx5LWNvbXBsZXRlZC10eXBlIHNvIHRoYXQgZGV0YWlsZWQgbmVzdGVkIHR5cGUKKyAgICogIGluZm9ybWF0aW9uLCBzdWNoIGFzIGl0ZXJhdG9yIHR5cGUgYW5kIG5vZGUgdHlwZSwgY2FuIGJlCisgICAqICB1c2VkLiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlICJDdXJpb3VzbHkgUmVjdXJyaW5nIFRlbXBsYXRlCisgICAqICBQYXR0ZXJuIiAoQ1JUUCkgdGVjaG5pcXVlLCBidXQgdXNlcyBhIHJlY29uc3RydWN0ZWQsIG5vdAorICAgKiAgZXhwbGljaXRseSBwYXNzZWQsIHRlbXBsYXRlIHBhdHRlcm4uCisgICAqCisgICAqICBCYXNlIGNsYXNzIHRlbXBsYXRlcyBhcmU6IAorICAgKiAgICAtIF9fZGV0YWlsOjpfSGFzaHRhYmxlX2Jhc2UKKyAgICogICAgLSBfX2RldGFpbDo6X01hcF9iYXNlCisgICAqICAgIC0gX19kZXRhaWw6Ol9JbnNlcnQKKyAgICogICAgLSBfX2RldGFpbDo6X1JlaGFzaF9iYXNlCisgICAqICAgIC0gX19kZXRhaWw6Ol9FcXVhbGl0eQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBjbGFzcyBfSGFzaHRhYmxlCisgICAgOiBwdWJsaWMgX19kZXRhaWw6Ol9IYXNodGFibGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQkJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1RyYWl0cz4sCisgICAgICBwdWJsaWMgX19kZXRhaWw6Ol9NYXBfYmFzZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCQkgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPiwKKyAgICAgIHB1YmxpYyBfX2RldGFpbDo6X0luc2VydDxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+LAorICAgICAgcHVibGljIF9fZGV0YWlsOjpfUmVoYXNoX2Jhc2U8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQkJICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz4sCisgICAgICBwdWJsaWMgX19kZXRhaWw6Ol9FcXVhbGl0eTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCQkgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9LZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1ZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9BbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0VxdWFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9lcXVhbDsKKworICAgICAgLy8gbWFwcGVkX3R5cGUsIGlmIHByZXNlbnQsIGNvbWVzIGZyb20gX01hcF9iYXNlLgorICAgICAgLy8gaGFzaGVyLCBpZiBwcmVzZW50LCBjb21lcyBmcm9tIF9IYXNoX2NvZGVfYmFzZS9fSGFzaHRhYmxlX2Jhc2UuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6cG9pbnRlcgkJICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpjb25zdF9wb2ludGVyICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6cmVmZXJlbmNlICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6Y29uc3RfcmVmZXJlbmNlICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICBwcml2YXRlOgorICAgICAgdXNpbmcgX19yZWhhc2hfdHlwZSA9IF9SZWhhc2hQb2xpY3k7CisgICAgICB1c2luZyBfX3JlaGFzaF9zdGF0ZSA9IHR5cGVuYW1lIF9fcmVoYXNoX3R5cGU6Ol9TdGF0ZTsKKworICAgICAgdXNpbmcgX190cmFpdHNfdHlwZSA9IF9UcmFpdHM7CisgICAgICB1c2luZyBfX2hhc2hfY2FjaGVkID0gdHlwZW5hbWUgX190cmFpdHNfdHlwZTo6X19oYXNoX2NhY2hlZDsKKyAgICAgIHVzaW5nIF9fY29uc3RhbnRfaXRlcmF0b3JzID0gdHlwZW5hbWUgX190cmFpdHNfdHlwZTo6X19jb25zdGFudF9pdGVyYXRvcnM7CisgICAgICB1c2luZyBfX3VuaXF1ZV9rZXlzID0gdHlwZW5hbWUgX190cmFpdHNfdHlwZTo6X191bmlxdWVfa2V5czsKKworICAgICAgdXNpbmcgX19rZXlfZXh0cmFjdCA9IHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8CisJCQkJCSAgICAgX19jb25zdGFudF9pdGVyYXRvcnM6OnZhbHVlLAorCQkJCSAgICAgICAJICAgICBfX2RldGFpbDo6X0lkZW50aXR5LAorCQkJCQkgICAgIF9fZGV0YWlsOjpfU2VsZWN0MXN0Pjo6dHlwZTsKKworICAgICAgdXNpbmcgX19oYXNodGFibGVfYmFzZSA9IF9fZGV0YWlsOjoKKwkJCSAgICAgICBfSGFzaHRhYmxlX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwKKwkJCQkJICAgICAgX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsIF9UcmFpdHM+OworCisgICAgICB1c2luZyBfX2hhc2hfY29kZV9iYXNlID0gIHR5cGVuYW1lIF9faGFzaHRhYmxlX2Jhc2U6Ol9faGFzaF9jb2RlX2Jhc2U7CisgICAgICB1c2luZyBfX2hhc2hfY29kZSA9ICB0eXBlbmFtZSBfX2hhc2h0YWJsZV9iYXNlOjpfX2hhc2hfY29kZTsKKyAgICAgIHVzaW5nIF9fbm9kZV90eXBlID0gdHlwZW5hbWUgX19oYXNodGFibGVfYmFzZTo6X19ub2RlX3R5cGU7CisgICAgICB1c2luZyBfX25vZGVfYmFzZSA9IHR5cGVuYW1lIF9faGFzaHRhYmxlX2Jhc2U6Ol9fbm9kZV9iYXNlOworICAgICAgdXNpbmcgX19idWNrZXRfdHlwZSA9IHR5cGVuYW1lIF9faGFzaHRhYmxlX2Jhc2U6Ol9fYnVja2V0X3R5cGU7CisgICAgICB1c2luZyBfX2lyZXR1cm5fdHlwZSA9IHR5cGVuYW1lIF9faGFzaHRhYmxlX2Jhc2U6Ol9faXJldHVybl90eXBlOworICAgICAgdXNpbmcgX19pY29udl90eXBlID0gdHlwZW5hbWUgX19oYXNodGFibGVfYmFzZTo6X19pY29udl90eXBlOworCisgICAgICB1c2luZyBfX21hcF9iYXNlID0gX19kZXRhaWw6Ol9NYXBfYmFzZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksCisJCQkJCSAgICAgX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsCisJCQkJCSAgICAgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz47CisKKyAgICAgIHVzaW5nIF9fcmVoYXNoX2Jhc2UgPSBfX2RldGFpbDo6X1JlaGFzaF9iYXNlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLAorCQkJCQkJICAgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCQkJCSAgIF9IMSwgX0gyLCBfSGFzaCwKKwkJCQkJCSAgIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OworCisgICAgICB1c2luZyBfX2VxX2Jhc2UgPSBfX2RldGFpbDo6X0VxdWFsaXR5PF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwKKwkJCQkJICAgIF9FcXVhbCwgX0gxLCBfSDIsIF9IYXNoLAorCQkJCQkgICAgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz47CisKKyAgICAgIC8vIE1ldGFwcm9ncmFtbWluZyBmb3IgcGlja2luZyBhcGFydCBoYXNoIGNhY2hpbmcuCisgICAgICB1c2luZyBfX2hhc2hfbm9leGNlcHQgPSBfX2RldGFpbDo6X19pc19ub2V4Y2VwdF9oYXNoPF9LZXksIF9IMT47CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db25kPgorCXVzaW5nIF9faWZfaGFzaF9jYWNoZWQgPSBfX29yXzxfX25vdF88X19oYXNoX2NhY2hlZD4sIF9Db25kPjsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbmQ+CisJdXNpbmcgX19pZl9oYXNoX25vdF9jYWNoZWQgPSBfX29yXzxfX2hhc2hfY2FjaGVkLCBfQ29uZD47CisKKyAgICAgIC8vIENvbXBpbGUtdGltZSBkaWFnbm9zdGljcy4KKworICAgICAgLy8gV2hlbiBoYXNoIGNvZGVzIGFyZSBub3QgY2FjaGVkIHRoZSBoYXNoIGZ1bmN0b3Igc2hhbGwgbm90CisgICAgICAvLyB0aHJvdyBiZWNhdXNlIGl0IGlzIHVzZWQgaW4gbWV0aG9kcyAoZXJhc2UsIHN3YXAuLi4pIHRoYXQKKyAgICAgIC8vIHNoYWxsIG5vdCB0aHJvdy4KKyAgICAgIHN0YXRpY19hc3NlcnQoX19pZl9oYXNoX25vdF9jYWNoZWQ8X19oYXNoX25vZXhjZXB0Pjo6dmFsdWUsCisJCSAgICAiQ2FjaGUgdGhlIGhhc2ggY29kZSIKKwkJICAgICIgb3IgcXVhbGlmeSB5b3VyIGhhc2ggZnVuY3RvciB3aXRoIG5vZXhjZXB0Iik7CisKKyAgICAgIC8vIEZvbGxvd2luZyB0d28gc3RhdGljIGFzc2VydGlvbnMgYXJlIG5lY2Vzc2FyeSB0byBndWFyYW50ZWUKKyAgICAgIC8vIHRoYXQgbG9jYWxfaXRlcmF0b3Igd2lsbCBiZSBkZWZhdWx0IGNvbnN0cnVjdGlibGUuCisKKyAgICAgIC8vIFdoZW4gaGFzaCBjb2RlcyBhcmUgY2FjaGVkIGxvY2FsIGl0ZXJhdG9yIGluaGVyaXRzIGZyb20gSDIgZnVuY3RvcgorICAgICAgLy8gd2hpY2ggbXVzdCB0aGVuIGJlIGRlZmF1bHQgY29uc3RydWN0aWJsZS4KKyAgICAgIHN0YXRpY19hc3NlcnQoX19pZl9oYXNoX2NhY2hlZDxpc19kZWZhdWx0X2NvbnN0cnVjdGlibGU8X0gyPj46OnZhbHVlLAorCQkgICAgIkZ1bmN0b3IgdXNlZCB0byBtYXAgaGFzaCBjb2RlIHRvIGJ1Y2tldCBpbmRleCIKKwkJICAgICIgbXVzdCBiZSBkZWZhdWx0IGNvbnN0cnVjdGlibGUiKTsKKworICAgICAgLy8gV2hlbiBoYXNoIGNvZGVzIGFyZSBub3QgY2FjaGVkIGxvY2FsIGl0ZXJhdG9yIGluaGVyaXRzIGZyb20KKyAgICAgIC8vIF9faGFzaF9jb2RlX2Jhc2UgYWJvdmUgdG8gY29tcHV0ZSBub2RlIGJ1Y2tldCBpbmRleCBzbyBpdCBoYXMgdG8gYmUKKyAgICAgIC8vIGRlZmF1bHQgY29uc3RydWN0aWJsZS4KKyAgICAgIHN0YXRpY19hc3NlcnQoX19pZl9oYXNoX25vdF9jYWNoZWQ8CisJCSAgICBpc19kZWZhdWx0X2NvbnN0cnVjdGlibGU8CisJCSAgICAgIC8vIFdlIHVzZSBfSGFzaHRhYmxlX2Vib19oZWxwZXIgdG8gYWNjZXNzIHRoZSBwcm90ZWN0ZWQKKwkJICAgICAgLy8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkJICAgICAgX19kZXRhaWw6Ol9IYXNodGFibGVfZWJvX2hlbHBlcjwwLCBfX2hhc2hfY29kZV9iYXNlPj4+Ojp2YWx1ZSwKKwkJICAgICJDYWNoZSB0aGUgaGFzaCBjb2RlIG9yIG1ha2UgZnVuY3RvcnMgaW52b2x2ZWQgaW4gaGFzaCBjb2RlIgorCQkgICAgIiBhbmQgYnVja2V0IGluZGV4IGNvbXB1dGF0aW9uIGRlZmF1bHQgY29uc3RydWN0aWJsZSIpOworCisgICAgICAvLyBXaGVuIGhhc2ggY29kZXMgYXJlIG5vdCBjYWNoZWQgbG9jYWwgaXRlcmF0b3IgaW5oZXJpdHMgZnJvbQorICAgICAgLy8gX19oYXNoX2NvZGVfYmFzZSBhYm92ZSB0byBjb21wdXRlIG5vZGUgYnVja2V0IGluZGV4IHNvIGl0IGhhcyB0byBiZQorICAgICAgLy8gYXNzaWduYWJsZS4KKyAgICAgIHN0YXRpY19hc3NlcnQoX19pZl9oYXNoX25vdF9jYWNoZWQ8CisJCSAgICAgIGlzX2NvcHlfYXNzaWduYWJsZTxfX2hhc2hfY29kZV9iYXNlPj46OnZhbHVlLAorCQkgICAgIkNhY2hlIHRoZSBoYXNoIGNvZGUgb3IgbWFrZSBmdW5jdG9ycyBpbnZvbHZlZCBpbiBoYXNoIGNvZGUiCisJCSAgICAiIGFuZCBidWNrZXQgaW5kZXggY29tcHV0YXRpb24gY29weSBhc3NpZ25hYmxlIik7CisKKyAgICBwdWJsaWM6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5YSwgdHlwZW5hbWUgX1ZhbHVlYSwgdHlwZW5hbWUgX0FsbG9jYSwKKwkgICAgICAgdHlwZW5hbWUgX0V4dHJhY3RLZXlhLCB0eXBlbmFtZSBfRXF1YWxhLAorCSAgICAgICB0eXBlbmFtZSBfSDFhLCB0eXBlbmFtZSBfSDJhLCB0eXBlbmFtZSBfSGFzaGEsCisJICAgICAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3lhLCB0eXBlbmFtZSBfVHJhaXRzYSwKKwkgICAgICAgYm9vbCBfVW5pcXVlX2tleXNhPgorCWZyaWVuZCBzdHJ1Y3QgX19kZXRhaWw6Ol9NYXBfYmFzZTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleWEsIHR5cGVuYW1lIF9WYWx1ZWEsIHR5cGVuYW1lIF9BbGxvY2EsCisJICAgICAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5YSwgdHlwZW5hbWUgX0VxdWFsYSwKKwkgICAgICAgdHlwZW5hbWUgX0gxYSwgdHlwZW5hbWUgX0gyYSwgdHlwZW5hbWUgX0hhc2hhLAorCSAgICAgICB0eXBlbmFtZSBfUmVoYXNoUG9saWN5YSwgdHlwZW5hbWUgX1RyYWl0c2E+CisJZnJpZW5kIHN0cnVjdCBfX2RldGFpbDo6X0luc2VydF9iYXNlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5YSwgdHlwZW5hbWUgX1ZhbHVlYSwgdHlwZW5hbWUgX0FsbG9jYSwKKwkgICAgICAgdHlwZW5hbWUgX0V4dHJhY3RLZXlhLCB0eXBlbmFtZSBfRXF1YWxhLAorCSAgICAgICB0eXBlbmFtZSBfSDFhLCB0eXBlbmFtZSBfSDJhLCB0eXBlbmFtZSBfSGFzaGEsCisJICAgICAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3lhLCB0eXBlbmFtZSBfVHJhaXRzYSwKKwkgICAgICAgYm9vbCBfQ29uc3RhbnRfaXRlcmF0b3JzYSwgYm9vbCBfVW5pcXVlX2tleXNhPgorCWZyaWVuZCBzdHJ1Y3QgX19kZXRhaWw6Ol9JbnNlcnQ7CisKKyAgICAgIHVzaW5nIHNpemVfdHlwZSA9IHR5cGVuYW1lIF9faGFzaHRhYmxlX2Jhc2U6OnNpemVfdHlwZTsKKyAgICAgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IHR5cGVuYW1lIF9faGFzaHRhYmxlX2Jhc2U6OmRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgdXNpbmcgaXRlcmF0b3IgPSB0eXBlbmFtZSBfX2hhc2h0YWJsZV9iYXNlOjppdGVyYXRvcjsKKyAgICAgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gdHlwZW5hbWUgX19oYXNodGFibGVfYmFzZTo6Y29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHVzaW5nIGxvY2FsX2l0ZXJhdG9yID0gdHlwZW5hbWUgX19oYXNodGFibGVfYmFzZTo6bG9jYWxfaXRlcmF0b3I7CisgICAgICB1c2luZyBjb25zdF9sb2NhbF9pdGVyYXRvciA9IHR5cGVuYW1lIF9faGFzaHRhYmxlX2Jhc2U6OgorCQkJCSAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yOworCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X19ub2RlX3R5cGU+OjpvdGhlcgorCQkJCQkJCV9Ob2RlX2FsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfX2J1Y2tldF90eXBlPjo6b3RoZXIKKwkJCQkJCQlfQnVja2V0X2FsbG9jYXRvcl90eXBlOworCisgICAgICB1c2luZyBfX2JlZm9yZV9iZWdpbiA9IF9fZGV0YWlsOjpfQmVmb3JlX2JlZ2luPF9Ob2RlX2FsbG9jYXRvcl90eXBlPjsKKworICAgICAgX19idWNrZXRfdHlwZSoJCV9NX2J1Y2tldHM7CisgICAgICBzaXplX3R5cGUJCQlfTV9idWNrZXRfY291bnQ7CisgICAgICBfX2JlZm9yZV9iZWdpbgkJX01fYmJlZ2luOworICAgICAgc2l6ZV90eXBlCQkJX01fZWxlbWVudF9jb3VudDsKKyAgICAgIF9SZWhhc2hQb2xpY3kJCV9NX3JlaGFzaF9wb2xpY3k7CisKKyAgICAgIF9Ob2RlX2FsbG9jYXRvcl90eXBlJgorICAgICAgX01fbm9kZV9hbGxvY2F0b3IoKQorICAgICAgeyByZXR1cm4gX01fYmJlZ2luOyB9CisKKyAgICAgIGNvbnN0IF9Ob2RlX2FsbG9jYXRvcl90eXBlJgorICAgICAgX01fbm9kZV9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYmJlZ2luOyB9CisKKyAgICAgIF9fbm9kZV9iYXNlJgorICAgICAgX01fYmVmb3JlX2JlZ2luKCkKKyAgICAgIHsgcmV0dXJuIF9NX2JiZWdpbi5fTV9ub2RlOyB9CisKKyAgICAgIGNvbnN0IF9fbm9kZV9iYXNlJgorICAgICAgX01fYmVmb3JlX2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2JiZWdpbi5fTV9ub2RlOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCV9fbm9kZV90eXBlKgorCV9NX2FsbG9jYXRlX25vZGUoX0FyZ3MmJi4uLiBfX2FyZ3MpOworCisgICAgICB2b2lkCisgICAgICBfTV9kZWFsbG9jYXRlX25vZGUoX19ub2RlX3R5cGUqIF9fbik7CisKKyAgICAgIC8vIERlYWxsb2NhdGUgdGhlIGxpbmtlZCBsaXN0IG9mIG5vZGVzIHBvaW50ZWQgdG8gYnkgX19uCisgICAgICB2b2lkCisgICAgICBfTV9kZWFsbG9jYXRlX25vZGVzKF9fbm9kZV90eXBlKiBfX24pOworCisgICAgICBfX2J1Y2tldF90eXBlKgorICAgICAgX01fYWxsb2NhdGVfYnVja2V0cyhzaXplX3R5cGUgX19uKTsKKworICAgICAgdm9pZAorICAgICAgX01fZGVhbGxvY2F0ZV9idWNrZXRzKF9fYnVja2V0X3R5cGUqLCBzaXplX3R5cGUgX19uKTsKKworICAgICAgLy8gR2V0cyBidWNrZXQgYmVnaW4sIGRlYWxzIHdpdGggdGhlIGZhY3QgdGhhdCBub24tZW1wdHkgYnVja2V0cyBjb250YWluCisgICAgICAvLyB0aGVpciBiZWZvcmUgYmVnaW4gbm9kZS4KKyAgICAgIF9fbm9kZV90eXBlKgorICAgICAgX01fYnVja2V0X2JlZ2luKHNpemVfdHlwZSBfX2JrdCkgY29uc3Q7CisKKyAgICAgIF9fbm9kZV90eXBlKgorICAgICAgX01fYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X19ub2RlX3R5cGUqPihfTV9iZWZvcmVfYmVnaW4oKS5fTV9ueHQpOyB9CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBDb25zdHJ1Y3RvciwgZGVzdHJ1Y3RvciwgYXNzaWdubWVudCwgc3dhcAorICAgICAgX0hhc2h0YWJsZShzaXplX3R5cGUgX19idWNrZXRfaGludCwKKwkJIGNvbnN0IF9IMSYsIGNvbnN0IF9IMiYsIGNvbnN0IF9IYXNoJiwKKwkJIGNvbnN0IF9FcXVhbCYsIGNvbnN0IF9FeHRyYWN0S2V5JiwKKwkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCV9IYXNodGFibGUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgICBzaXplX3R5cGUgX19idWNrZXRfaGludCwKKwkJICAgY29uc3QgX0gxJiwgY29uc3QgX0gyJiwgY29uc3QgX0hhc2gmLAorCQkgICBjb25zdCBfRXF1YWwmLCBjb25zdCBfRXh0cmFjdEtleSYsCisJCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJik7CisKKyAgICAgIF9IYXNodGFibGUoY29uc3QgX0hhc2h0YWJsZSYpOworCisgICAgICBfSGFzaHRhYmxlKF9IYXNodGFibGUmJik7CisKKyAgICAgIC8vIFVzZSBkZWxlZ2F0aW5nIGNvbnN0cnVjdG9ycy4KKyAgICAgIGV4cGxpY2l0CisgICAgICBfSGFzaHRhYmxlKHNpemVfdHlwZSBfX24gPSAxMCwKKwkJIGNvbnN0IF9IMSYgX19oZiA9IF9IMSgpLAorCQkgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9IYXNodGFibGUoX19uLCBfX2hmLCBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nKCksCisJCSAgIF9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCgpLCBfX2VxbCwKKwkJICAgX19rZXlfZXh0cmFjdCgpLCBfX2EpCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJX0hhc2h0YWJsZShfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKwkJICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCSAgIGNvbnN0IF9IMSYgX19oZiA9IF9IMSgpLAorCQkgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0hhc2h0YWJsZShfX2YsIF9fbCwgX19uLCBfX2hmLCBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nKCksCisJCSAgICAgX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoKCksIF9fZXFsLAorCQkgICAgIF9fa2V5X2V4dHJhY3QoKSwgX19hKQorCXsgfQorCisgICAgICBfSGFzaHRhYmxlKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCQkgc2l6ZV90eXBlIF9fbiA9IDAsCisJCSBjb25zdCBfSDEmIF9faGYgPSBfSDEoKSwKKwkJIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfSGFzaHRhYmxlKF9fbC5iZWdpbigpLCBfX2wuZW5kKCksIF9fbiwgX19oZiwKKwkJICAgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZygpLAorCQkgICBfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2goKSwgX19lcWwsCisJCSAgIF9fa2V5X2V4dHJhY3QoKSwgX19hKQorICAgICAgeyB9CisKKyAgICAgIF9IYXNodGFibGUmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX0hhc2h0YWJsZSYgX19odCkKKyAgICAgIHsKKwlfSGFzaHRhYmxlIF9fdG1wKF9faHQpOworCXRoaXMtPnN3YXAoX190bXApOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX0hhc2h0YWJsZSYKKyAgICAgIG9wZXJhdG9yPShfSGFzaHRhYmxlJiYgX19odCkKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwkvLyBOQjogRFIgNjc1LgorCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+c3dhcChfX2h0KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9IYXNodGFibGUmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB+X0hhc2h0YWJsZSgpIG5vZXhjZXB0OworCisgICAgICB2b2lkIHN3YXAoX0hhc2h0YWJsZSYpOworCisgICAgICAvLyBCYXNpYyBjb250YWluZXIgb3BlcmF0aW9ucworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2JlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfTV9iZWdpbigpKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKG51bGxwdHIpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IobnVsbHB0cik7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfTV9iZWdpbigpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihudWxscHRyKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fZWxlbWVudF9jb3VudDsgfQorCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzaXplKCkgPT0gMDsgfQorCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBhbGxvY2F0b3JfdHlwZShfTV9ub2RlX2FsbG9jYXRvcigpKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX25vZGVfYWxsb2NhdG9yKCkubWF4X3NpemUoKTsgfQorCisgICAgICAvLyBPYnNlcnZlcnMKKyAgICAgIGtleV9lcXVhbAorICAgICAga2V5X2VxKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2VxKCk7IH0KKworICAgICAgLy8gaGFzaF9mdW5jdGlvbiwgaWYgcHJlc2VudCwgY29tZXMgZnJvbSBfSGFzaF9jb2RlX2Jhc2UuCisKKyAgICAgIC8vIEJ1Y2tldCBvcGVyYXRpb25zCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9jb3VudCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9idWNrZXRfY291bnQ7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfYnVja2V0X2NvdW50KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIG1heF9zaXplKCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfc2l6ZShzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpkaXN0YW5jZShiZWdpbihfX24pLCBlbmQoX19uKSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2J1Y2tldF9pbmRleChfX2ssIHRoaXMtPl9NX2hhc2hfY29kZShfX2spKTsgfQorCisgICAgICBsb2NhbF9pdGVyYXRvcgorICAgICAgYmVnaW4oc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlyZXR1cm4gbG9jYWxfaXRlcmF0b3IoKnRoaXMsIF9NX2J1Y2tldF9iZWdpbihfX24pLAorCQkJICAgICAgX19uLCBfTV9idWNrZXRfY291bnQpOworICAgICAgfQorCisgICAgICBsb2NhbF9pdGVyYXRvcgorICAgICAgZW5kKHNpemVfdHlwZSBfX24pCisgICAgICB7IHJldHVybiBsb2NhbF9pdGVyYXRvcigqdGhpcywgbnVsbHB0ciwgX19uLCBfTV9idWNrZXRfY291bnQpOyB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeworCXJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcigqdGhpcywgX01fYnVja2V0X2JlZ2luKF9fbiksCisJCQkJICAgIF9fbiwgX01fYnVja2V0X2NvdW50KTsKKyAgICAgIH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGVuZChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoKnRoaXMsIG51bGxwdHIsIF9fbiwgX01fYnVja2V0X2NvdW50KTsgfQorCisgICAgICAvLyBEUiA2OTEuCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgY2JlZ2luKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7CisJcmV0dXJuIGNvbnN0X2xvY2FsX2l0ZXJhdG9yKCp0aGlzLCBfTV9idWNrZXRfYmVnaW4oX19uKSwKKwkJCQkgICAgX19uLCBfTV9idWNrZXRfY291bnQpOworICAgICAgfQorCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgY2VuZChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoKnRoaXMsIG51bGxwdHIsIF9fbiwgX01fYnVja2V0X2NvdW50KTsgfQorCisgICAgICBmbG9hdAorICAgICAgbG9hZF9mYWN0b3IoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeworCXJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4oc2l6ZSgpKSAvIHN0YXRpY19jYXN0PGZsb2F0PihidWNrZXRfY291bnQoKSk7CisgICAgICB9CisKKyAgICAgIC8vIG1heF9sb2FkX2ZhY3RvciwgaWYgcHJlc2VudCwgY29tZXMgZnJvbSBfUmVoYXNoX2Jhc2UuCisKKyAgICAgIC8vIEdlbmVyYWxpemF0aW9uIG9mIG1heF9sb2FkX2ZhY3Rvci4gIEV4dGVuc2lvbiwgbm90IGZvdW5kIGluCisgICAgICAvLyBUUjEuICBPbmx5IHVzZWZ1bCBpZiBfUmVoYXNoUG9saWN5IGlzIHNvbWV0aGluZyBvdGhlciB0aGFuCisgICAgICAvLyB0aGUgZGVmYXVsdC4KKyAgICAgIGNvbnN0IF9SZWhhc2hQb2xpY3kmCisgICAgICBfX3JlaGFzaF9wb2xpY3koKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcmVoYXNoX3BvbGljeTsgfQorCisgICAgICB2b2lkCisgICAgICBfX3JlaGFzaF9wb2xpY3koY29uc3QgX1JlaGFzaFBvbGljeSYpOworCisgICAgICAvLyBMb29rdXAuCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rKTsKKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Q7CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Q7CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rKTsKKworICAgICAgc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0OworCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8gQnVja2V0IGluZGV4IGNvbXB1dGF0aW9uIGhlbHBlcnMuCisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX2J1Y2tldF9pbmRleChfX25vZGVfdHlwZSogX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX19oYXNoX2NvZGVfYmFzZTo6X01fYnVja2V0X2luZGV4KF9fbiwgX01fYnVja2V0X2NvdW50KTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX2J1Y2tldF9pbmRleChjb25zdCBrZXlfdHlwZSYgX19rLCBfX2hhc2hfY29kZSBfX2MpIGNvbnN0CisgICAgICB7IHJldHVybiBfX2hhc2hfY29kZV9iYXNlOjpfTV9idWNrZXRfaW5kZXgoX19rLCBfX2MsIF9NX2J1Y2tldF9jb3VudCk7IH0KKworICAgICAgLy8gRmluZCBhbmQgaW5zZXJ0IGhlbHBlciBmdW5jdGlvbnMgYW5kIHR5cGVzCisgICAgICAvLyBGaW5kIHRoZSBub2RlIGJlZm9yZSB0aGUgb25lIG1hdGNoaW5nIHRoZSBjcml0ZXJpYS4KKyAgICAgIF9fbm9kZV9iYXNlKgorICAgICAgX01fZmluZF9iZWZvcmVfbm9kZShzaXplX3R5cGUsIGNvbnN0IGtleV90eXBlJiwgX19oYXNoX2NvZGUpIGNvbnN0OworCisgICAgICBfX25vZGVfdHlwZSoKKyAgICAgIF9NX2ZpbmRfbm9kZShzaXplX3R5cGUgX19ia3QsIGNvbnN0IGtleV90eXBlJiBfX2tleSwKKwkJICAgX19oYXNoX2NvZGUgX19jKSBjb25zdAorICAgICAgeworCV9fbm9kZV9iYXNlKiBfX2JlZm9yZV9uID0gX01fZmluZF9iZWZvcmVfbm9kZShfX2JrdCwgX19rZXksIF9fYyk7CisJaWYgKF9fYmVmb3JlX24pCisJICByZXR1cm4gc3RhdGljX2Nhc3Q8X19ub2RlX3R5cGUqPihfX2JlZm9yZV9uLT5fTV9ueHQpOworCXJldHVybiBudWxscHRyOworICAgICAgfQorCisgICAgICAvLyBJbnNlcnQgYSBub2RlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBidWNrZXQuCisgICAgICB2b2lkCisgICAgICBfTV9pbnNlcnRfYnVja2V0X2JlZ2luKHNpemVfdHlwZSwgX19ub2RlX3R5cGUqKTsKKworICAgICAgLy8gUmVtb3ZlIHRoZSBidWNrZXQgZmlyc3Qgbm9kZQorICAgICAgdm9pZAorICAgICAgX01fcmVtb3ZlX2J1Y2tldF9iZWdpbihzaXplX3R5cGUgX19ia3QsIF9fbm9kZV90eXBlKiBfX25leHRfbiwKKwkJCSAgICAgc2l6ZV90eXBlIF9fbmV4dF9ia3QpOworCisgICAgICAvLyBHZXQgdGhlIG5vZGUgYmVmb3JlIF9fbiBpbiB0aGUgYnVja2V0IF9fYmt0CisgICAgICBfX25vZGVfYmFzZSoKKyAgICAgIF9NX2dldF9wcmV2aW91c19ub2RlKHNpemVfdHlwZSBfX2JrdCwgX19ub2RlX2Jhc2UqIF9fbik7CisKKyAgICAgIC8vIEluc2VydCBub2RlIHdpdGggaGFzaCBjb2RlIF9fY29kZSwgaW4gYnVja2V0IGJrdCBpZiBubyByZWhhc2ggKGFzc3VtZXMKKyAgICAgIC8vIG5vIGVsZW1lbnQgd2l0aCBpdHMga2V5IGFscmVhZHkgcHJlc2VudCkuIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBub2RlLAorICAgICAgLy8gZGVhbGxvY2F0ZSBpdCBvbiBleGNlcHRpb24uCisgICAgICBpdGVyYXRvcgorICAgICAgX01faW5zZXJ0X3VuaXF1ZV9ub2RlKHNpemVfdHlwZSBfX2JrdCwgX19oYXNoX2NvZGUgX19jb2RlLAorCQkJICAgIF9fbm9kZV90eXBlKiBfX24pOworCisgICAgICAvLyBJbnNlcnQgbm9kZSB3aXRoIGhhc2ggY29kZSBfX2NvZGUuIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBub2RlLAorICAgICAgLy8gZGVhbGxvY2F0ZSBpdCBvbiBleGNlcHRpb24uCisgICAgICBpdGVyYXRvcgorICAgICAgX01faW5zZXJ0X211bHRpX25vZGUoX19oYXNoX2NvZGUgX19jb2RlLCBfX25vZGVfdHlwZSogX19uKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorCV9NX2VtcGxhY2Uoc3RkOjp0cnVlX3R5cGUsIF9BcmdzJiYuLi4gX19hcmdzKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwlfTV9lbXBsYWNlKHN0ZDo6ZmFsc2VfdHlwZSwgX0FyZ3MmJi4uLiBfX2FyZ3MpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorCXN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKwlfTV9pbnNlcnQoX0FyZyYmLCBzdGQ6OnRydWVfdHlwZSk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisJaXRlcmF0b3IKKwlfTV9pbnNlcnQoX0FyZyYmLCBzdGQ6OmZhbHNlX3R5cGUpOworCisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX2VyYXNlKHN0ZDo6dHJ1ZV90eXBlLCBjb25zdCBrZXlfdHlwZSYpOworCisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX2VyYXNlKHN0ZDo6ZmFsc2VfdHlwZSwgY29uc3Qga2V5X3R5cGUmKTsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX2VyYXNlKHNpemVfdHlwZSBfX2JrdCwgX19ub2RlX2Jhc2UqIF9fcHJldl9uLCBfX25vZGVfdHlwZSogX19uKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIEVtcGxhY2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCV9faXJldHVybl90eXBlCisJZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKwl7IHJldHVybiBfTV9lbXBsYWNlKF9fdW5pcXVlX2tleXMoKSwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyByZXR1cm4gX19pY29udl90eXBlKCkoZW1wbGFjZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKTsgfQorCisgICAgICAvLyBJbnNlcnQgbWVtYmVyIGZ1bmN0aW9ucyB2aWEgaW5oZXJpdGFuY2UuCisKKyAgICAgIC8vIEVyYXNlCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IpOworCisgICAgICAvLyBMV0cgMjA1OS4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX2l0KQorICAgICAgeyByZXR1cm4gZXJhc2UoY29uc3RfaXRlcmF0b3IoX19pdCkpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICAgIHsgcmV0dXJuIF9NX2VyYXNlKF9fdW5pcXVlX2tleXMoKSwgX19rKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yKTsKKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBub2V4Y2VwdDsKKworICAgICAgLy8gU2V0IG51bWJlciBvZiBidWNrZXRzIHRvIGJlIGFwcHJvcHJpYXRlIGZvciBjb250YWluZXIgb2YgbiBlbGVtZW50LgorICAgICAgdm9pZCByZWhhc2goc2l6ZV90eXBlIF9fbik7CisKKyAgICAgIC8vIERSIDExODkuCisgICAgICAvLyByZXNlcnZlLCBpZiBwcmVzZW50LCBjb21lcyBmcm9tIF9SZWhhc2hfYmFzZS4KKworICAgIHByaXZhdGU6CisgICAgICAvLyBIZWxwZXIgcmVoYXNoIG1ldGhvZCB1c2VkIHdoZW4ga2V5cyBhcmUgdW5pcXVlLgorICAgICAgdm9pZCBfTV9yZWhhc2hfYXV4KHNpemVfdHlwZSBfX24sIHN0ZDo6dHJ1ZV90eXBlKTsKKworICAgICAgLy8gSGVscGVyIHJlaGFzaCBtZXRob2QgdXNlZCB3aGVuIGtleXMgY2FuIGJlIG5vbi11bmlxdWUuCisgICAgICB2b2lkIF9NX3JlaGFzaF9hdXgoc2l6ZV90eXBlIF9fbiwgc3RkOjpmYWxzZV90eXBlKTsKKworICAgICAgLy8gVW5jb25kaXRpb25hbGx5IGNoYW5nZSBzaXplIG9mIGJ1Y2tldCBhcnJheSB0byBuLCByZXN0b3JlCisgICAgICAvLyBoYXNoIHBvbGljeSBzdGF0ZSB0byBfX3N0YXRlIG9uIGV4Y2VwdGlvbi4KKyAgICAgIHZvaWQgX01fcmVoYXNoKHNpemVfdHlwZSBfX24sIGNvbnN0IF9fcmVoYXNoX3N0YXRlJiBfX3N0YXRlKTsKKyAgICB9OworCisKKyAgLy8gRGVmaW5pdGlvbnMgb2YgY2xhc3MgdGVtcGxhdGUgX0hhc2h0YWJsZSdzIG91dC1vZi1saW5lIG1lbWJlciBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjpfX25vZGVfdHlwZSoKKyAgICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCSBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICAgIF9NX2FsbG9jYXRlX25vZGUoX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICB7CisJX19ub2RlX3R5cGUqIF9fbiA9IF9NX25vZGVfYWxsb2NhdG9yKCkuYWxsb2NhdGUoMSk7CisJX190cnkKKwkgIHsKKwkgICAgX01fbm9kZV9hbGxvY2F0b3IoKS5jb25zdHJ1Y3QoX19uLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgICByZXR1cm4gX19uOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfTV9ub2RlX2FsbG9jYXRvcigpLmRlYWxsb2NhdGUoX19uLCAxKTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgX01fZGVhbGxvY2F0ZV9ub2RlKF9fbm9kZV90eXBlKiBfX24pCisgICAgeworICAgICAgX01fbm9kZV9hbGxvY2F0b3IoKS5kZXN0cm95KF9fbik7CisgICAgICBfTV9ub2RlX2FsbG9jYXRvcigpLmRlYWxsb2NhdGUoX19uLCAxKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgX01fZGVhbGxvY2F0ZV9ub2RlcyhfX25vZGVfdHlwZSogX19uKQorICAgIHsKKyAgICAgIHdoaWxlIChfX24pCisJeworCSAgX19ub2RlX3R5cGUqIF9fdG1wID0gX19uOworCSAgX19uID0gX19uLT5fTV9uZXh0KCk7CisJICBfTV9kZWFsbG9jYXRlX25vZGUoX190bXApOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6X19idWNrZXRfdHlwZSoKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICBfTV9hbGxvY2F0ZV9idWNrZXRzKHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX0J1Y2tldF9hbGxvY2F0b3JfdHlwZSBfX2FsbG9jKF9NX25vZGVfYWxsb2NhdG9yKCkpOworCisgICAgICBfX2J1Y2tldF90eXBlKiBfX3AgPSBfX2FsbG9jLmFsbG9jYXRlKF9fbik7CisgICAgICBfX2J1aWx0aW5fbWVtc2V0KF9fcCwgMCwgX19uICogc2l6ZW9mKF9fYnVja2V0X3R5cGUpKTsKKyAgICAgIHJldHVybiBfX3A7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdm9pZAorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIF9NX2RlYWxsb2NhdGVfYnVja2V0cyhfX2J1Y2tldF90eXBlKiBfX3AsIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX0J1Y2tldF9hbGxvY2F0b3JfdHlwZSBfX2FsbG9jKF9NX25vZGVfYWxsb2NhdG9yKCkpOworICAgICAgX19hbGxvYy5kZWFsbG9jYXRlKF9fcCwgX19uKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwKKwkJCV9FcXVhbCwgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX1RyYWl0cz46Ol9fbm9kZV90eXBlKgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIF9NX2J1Y2tldF9iZWdpbihzaXplX3R5cGUgX19ia3QpIGNvbnN0CisgICAgeworICAgICAgX19ub2RlX2Jhc2UqIF9fbiA9IF9NX2J1Y2tldHNbX19ia3RdOworICAgICAgcmV0dXJuIF9fbiA/IHN0YXRpY19jYXN0PF9fbm9kZV90eXBlKj4oX19uLT5fTV9ueHQpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICBfSGFzaHRhYmxlKHNpemVfdHlwZSBfX2J1Y2tldF9oaW50LAorCSAgICAgICBjb25zdCBfSDEmIF9faDEsIGNvbnN0IF9IMiYgX19oMiwgY29uc3QgX0hhc2gmIF9faCwKKwkgICAgICAgY29uc3QgX0VxdWFsJiBfX2VxLCBjb25zdCBfRXh0cmFjdEtleSYgX19leGssCisJICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX2hhc2h0YWJsZV9iYXNlKF9fZXhrLCBfX2gxLCBfX2gyLCBfX2gsIF9fZXEpLAorICAgICAgX19tYXBfYmFzZSgpLAorICAgICAgX19yZWhhc2hfYmFzZSgpLAorICAgICAgX01fYnVja2V0X2NvdW50KDApLAorICAgICAgX01fYmJlZ2luKF9fYSksCisgICAgICBfTV9lbGVtZW50X2NvdW50KDApLAorICAgICAgX01fcmVoYXNoX3BvbGljeSgpCisgICAgeworICAgICAgX01fYnVja2V0X2NvdW50ID0gX01fcmVoYXNoX3BvbGljeS5fTV9uZXh0X2JrdChfX2J1Y2tldF9oaW50KTsKKyAgICAgIF9NX2J1Y2tldHMgPSBfTV9hbGxvY2F0ZV9idWNrZXRzKF9NX2J1Y2tldF9jb3VudCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgICBfSGFzaHRhYmxlKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorCQkgc2l6ZV90eXBlIF9fYnVja2V0X2hpbnQsCisJCSBjb25zdCBfSDEmIF9faDEsIGNvbnN0IF9IMiYgX19oMiwgY29uc3QgX0hhc2gmIF9faCwKKwkJIGNvbnN0IF9FcXVhbCYgX19lcSwgY29uc3QgX0V4dHJhY3RLZXkmIF9fZXhrLAorCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogX19oYXNodGFibGVfYmFzZShfX2V4aywgX19oMSwgX19oMiwgX19oLCBfX2VxKSwKKwlfX21hcF9iYXNlKCksCisJX19yZWhhc2hfYmFzZSgpLAorCV9NX2J1Y2tldF9jb3VudCgwKSwKKwlfTV9iYmVnaW4oX19hKSwKKwlfTV9lbGVtZW50X2NvdW50KDApLAorCV9NX3JlaGFzaF9wb2xpY3koKQorICAgICAgeworCWF1dG8gX19uYl9lbGVtcyA9IF9fZGV0YWlsOjpfX2Rpc3RhbmNlX2Z3KF9fZiwgX19sKTsKKwlfTV9idWNrZXRfY291bnQgPQorCSAgX01fcmVoYXNoX3BvbGljeS5fTV9uZXh0X2JrdCgKKwkgICAgc3RkOjptYXgoX01fcmVoYXNoX3BvbGljeS5fTV9ia3RfZm9yX2VsZW1lbnRzKF9fbmJfZWxlbXMpLAorCQkgICAgIF9fYnVja2V0X2hpbnQpKTsKKworCV9NX2J1Y2tldHMgPSBfTV9hbGxvY2F0ZV9idWNrZXRzKF9NX2J1Y2tldF9jb3VudCk7CisJX190cnkKKwkgIHsKKwkgICAgZm9yICg7IF9fZiAhPSBfX2w7ICsrX19mKQorCSAgICAgIHRoaXMtPmluc2VydCgqX19mKTsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgY2xlYXIoKTsKKwkgICAgX01fZGVhbGxvY2F0ZV9idWNrZXRzKF9NX2J1Y2tldHMsIF9NX2J1Y2tldF9jb3VudCk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgX0hhc2h0YWJsZShjb25zdCBfSGFzaHRhYmxlJiBfX2h0KQorICAgIDogX19oYXNodGFibGVfYmFzZShfX2h0KSwKKyAgICAgIF9fbWFwX2Jhc2UoX19odCksCisgICAgICBfX3JlaGFzaF9iYXNlKF9faHQpLAorICAgICAgX01fYnVja2V0X2NvdW50KF9faHQuX01fYnVja2V0X2NvdW50KSwKKyAgICAgIF9NX2JiZWdpbihfX2h0Ll9NX2JiZWdpbiksCisgICAgICBfTV9lbGVtZW50X2NvdW50KF9faHQuX01fZWxlbWVudF9jb3VudCksCisgICAgICBfTV9yZWhhc2hfcG9saWN5KF9faHQuX01fcmVoYXNoX3BvbGljeSkKKyAgICB7CisgICAgICBfTV9idWNrZXRzID0gX01fYWxsb2NhdGVfYnVja2V0cyhfTV9idWNrZXRfY291bnQpOworICAgICAgX190cnkKKwl7CisJICBpZiAoIV9faHQuX01fYmVmb3JlX2JlZ2luKCkuX01fbnh0KQorCSAgICByZXR1cm47CisKKwkgIC8vIEZpcnN0IGRlYWwgd2l0aCB0aGUgc3BlY2lhbCBmaXJzdCBub2RlIHBvaW50ZWQgdG8gYnkKKwkgIC8vIF9NX2JlZm9yZV9iZWdpbi4KKwkgIGNvbnN0IF9fbm9kZV90eXBlKiBfX2h0X24gPSBfX2h0Ll9NX2JlZ2luKCk7CisJICBfX25vZGVfdHlwZSogX190aGlzX24gPSBfTV9hbGxvY2F0ZV9ub2RlKF9faHRfbi0+X01fdik7CisJICB0aGlzLT5fTV9jb3B5X2NvZGUoX190aGlzX24sIF9faHRfbik7CisJICBfTV9iZWZvcmVfYmVnaW4oKS5fTV9ueHQgPSBfX3RoaXNfbjsKKwkgIF9NX2J1Y2tldHNbX01fYnVja2V0X2luZGV4KF9fdGhpc19uKV0gPSAmX01fYmVmb3JlX2JlZ2luKCk7CisKKwkgIC8vIFRoZW4gZGVhbCB3aXRoIG90aGVyIG5vZGVzLgorCSAgX19ub2RlX2Jhc2UqIF9fcHJldl9uID0gX190aGlzX247CisJICBmb3IgKF9faHRfbiA9IF9faHRfbi0+X01fbmV4dCgpOyBfX2h0X247IF9faHRfbiA9IF9faHRfbi0+X01fbmV4dCgpKQorCSAgICB7CisJICAgICAgX190aGlzX24gPSBfTV9hbGxvY2F0ZV9ub2RlKF9faHRfbi0+X01fdik7CisJICAgICAgX19wcmV2X24tPl9NX254dCA9IF9fdGhpc19uOworCSAgICAgIHRoaXMtPl9NX2NvcHlfY29kZShfX3RoaXNfbiwgX19odF9uKTsKKwkgICAgICBzaXplX3R5cGUgX19ia3QgPSBfTV9idWNrZXRfaW5kZXgoX190aGlzX24pOworCSAgICAgIGlmICghX01fYnVja2V0c1tfX2JrdF0pCisJCV9NX2J1Y2tldHNbX19ia3RdID0gX19wcmV2X247CisJICAgICAgX19wcmV2X24gPSBfX3RoaXNfbjsKKwkgICAgfQorCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIGNsZWFyKCk7CisJICBfTV9kZWFsbG9jYXRlX2J1Y2tldHMoX01fYnVja2V0cywgX01fYnVja2V0X2NvdW50KTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICBfSGFzaHRhYmxlKF9IYXNodGFibGUmJiBfX2h0KQorICAgIDogX19oYXNodGFibGVfYmFzZShfX2h0KSwKKyAgICAgIF9fbWFwX2Jhc2UoX19odCksCisgICAgICBfX3JlaGFzaF9iYXNlKF9faHQpLAorICAgICAgX01fYnVja2V0cyhfX2h0Ll9NX2J1Y2tldHMpLAorICAgICAgX01fYnVja2V0X2NvdW50KF9faHQuX01fYnVja2V0X2NvdW50KSwKKyAgICAgIF9NX2JiZWdpbihzdGQ6Om1vdmUoX19odC5fTV9iYmVnaW4pKSwKKyAgICAgIF9NX2VsZW1lbnRfY291bnQoX19odC5fTV9lbGVtZW50X2NvdW50KSwKKyAgICAgIF9NX3JlaGFzaF9wb2xpY3koX19odC5fTV9yZWhhc2hfcG9saWN5KQorICAgIHsKKyAgICAgIC8vIFVwZGF0ZSwgaWYgbmVjZXNzYXJ5LCBidWNrZXQgcG9pbnRpbmcgdG8gYmVmb3JlIGJlZ2luIHRoYXQgaGFzbid0IG1vdmVkLgorICAgICAgaWYgKF9NX2JlZ2luKCkpCisJX01fYnVja2V0c1tfTV9idWNrZXRfaW5kZXgoX01fYmVnaW4oKSldID0gJl9NX2JlZm9yZV9iZWdpbigpOworICAgICAgX19odC5fTV9yZWhhc2hfcG9saWN5ID0gX1JlaGFzaFBvbGljeSgpOworICAgICAgX19odC5fTV9idWNrZXRfY291bnQgPSBfX2h0Ll9NX3JlaGFzaF9wb2xpY3kuX01fbmV4dF9ia3QoMCk7CisgICAgICBfX2h0Ll9NX2J1Y2tldHMgPSBfX2h0Ll9NX2FsbG9jYXRlX2J1Y2tldHMoX19odC5fTV9idWNrZXRfY291bnQpOworICAgICAgX19odC5fTV9iZWZvcmVfYmVnaW4oKS5fTV9ueHQgPSBudWxscHRyOworICAgICAgX19odC5fTV9lbGVtZW50X2NvdW50ID0gMDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICB+X0hhc2h0YWJsZSgpIG5vZXhjZXB0CisgICAgeworICAgICAgY2xlYXIoKTsKKyAgICAgIF9NX2RlYWxsb2NhdGVfYnVja2V0cyhfTV9idWNrZXRzLCBfTV9idWNrZXRfY291bnQpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICBzd2FwKF9IYXNodGFibGUmIF9feCkKKyAgICB7CisgICAgICAvLyBUaGUgb25seSBiYXNlIGNsYXNzIHdpdGggbWVtYmVyIHZhcmlhYmxlcyBpcyBoYXNoX2NvZGVfYmFzZS4KKyAgICAgIC8vIFdlIGRlZmluZSBfSGFzaF9jb2RlX2Jhc2U6Ol9NX3N3YXAgYmVjYXVzZSBkaWZmZXJlbnQKKyAgICAgIC8vIHNwZWNpYWxpemF0aW9ucyBoYXZlIGRpZmZlcmVudCBtZW1iZXJzLgorICAgICAgdGhpcy0+X01fc3dhcChfX3gpOworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzEuIFN3YXBwaW5nIGNvbnRhaW5lcnMgd2l0aCB1bmVxdWFsIGFsbG9jYXRvcnMuCisgICAgICBzdGQ6Ol9fYWxsb2Nfc3dhcDxfTm9kZV9hbGxvY2F0b3JfdHlwZT46Ol9TX2RvX2l0KF9NX25vZGVfYWxsb2NhdG9yKCksCisJCQkJCQkJX194Ll9NX25vZGVfYWxsb2NhdG9yKCkpOworCisgICAgICBzdGQ6OnN3YXAoX01fcmVoYXNoX3BvbGljeSwgX194Ll9NX3JlaGFzaF9wb2xpY3kpOworICAgICAgc3RkOjpzd2FwKF9NX2J1Y2tldHMsIF9feC5fTV9idWNrZXRzKTsKKyAgICAgIHN0ZDo6c3dhcChfTV9idWNrZXRfY291bnQsIF9feC5fTV9idWNrZXRfY291bnQpOworICAgICAgc3RkOjpzd2FwKF9NX2JlZm9yZV9iZWdpbigpLl9NX254dCwgX194Ll9NX2JlZm9yZV9iZWdpbigpLl9NX254dCk7CisgICAgICBzdGQ6OnN3YXAoX01fZWxlbWVudF9jb3VudCwgX194Ll9NX2VsZW1lbnRfY291bnQpOworCisgICAgICAvLyBGaXggYnVja2V0cyBjb250YWluaW5nIHRoZSBfTV9iZWZvcmVfYmVnaW4gcG9pbnRlcnMgdGhhdAorICAgICAgLy8gY2FuJ3QgYmUgc3dhcHBlZC4KKyAgICAgIGlmIChfTV9iZWdpbigpKQorCV9NX2J1Y2tldHNbX01fYnVja2V0X2luZGV4KF9NX2JlZ2luKCkpXSA9ICZfTV9iZWZvcmVfYmVnaW4oKTsKKyAgICAgIGlmIChfX3guX01fYmVnaW4oKSkKKwlfX3guX01fYnVja2V0c1tfX3guX01fYnVja2V0X2luZGV4KF9feC5fTV9iZWdpbigpKV0KKwkgID0gJihfX3guX01fYmVmb3JlX2JlZ2luKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICBfX3JlaGFzaF9wb2xpY3koY29uc3QgX1JlaGFzaFBvbGljeSYgX19wb2wpCisgICAgeworICAgICAgc2l6ZV90eXBlIF9fbl9ia3QgPSBfX3BvbC5fTV9ia3RfZm9yX2VsZW1lbnRzKF9NX2VsZW1lbnRfY291bnQpOworICAgICAgX19uX2JrdCA9IF9fcG9sLl9NX25leHRfYmt0KF9fbl9ia3QpOworICAgICAgaWYgKF9fbl9ia3QgIT0gX01fYnVja2V0X2NvdW50KQorCV9NX3JlaGFzaChfX25fYmt0LCBfTV9yZWhhc2hfcG9saWN5Ll9NX3N0YXRlKCkpOworICAgICAgX01fcmVoYXNoX3BvbGljeSA9IF9fcG9sOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfVHJhaXRzPjo6aXRlcmF0b3IKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgeworICAgICAgX19oYXNoX2NvZGUgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9fayk7CisgICAgICBzdGQ6OnNpemVfdCBfX24gPSBfTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUpOworICAgICAgX19ub2RlX3R5cGUqIF9fcCA9IF9NX2ZpbmRfbm9kZShfX24sIF9faywgX19jb2RlKTsKKyAgICAgIHJldHVybiBfX3AgPyBpdGVyYXRvcihfX3ApIDogdGhpcy0+ZW5kKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9UcmFpdHM+Ojpjb25zdF9pdGVyYXRvcgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICB7CisgICAgICBfX2hhc2hfY29kZSBfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUoX19rKTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fbiA9IF9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSk7CisgICAgICBfX25vZGVfdHlwZSogX19wID0gX01fZmluZF9ub2RlKF9fbiwgX19rLCBfX2NvZGUpOworICAgICAgcmV0dXJuIF9fcCA/IGNvbnN0X2l0ZXJhdG9yKF9fcCkgOiB0aGlzLT5lbmQoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX1RyYWl0cz46OnNpemVfdHlwZQorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0CisgICAgeworICAgICAgX19oYXNoX2NvZGUgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9fayk7CisgICAgICBzdGQ6OnNpemVfdCBfX24gPSBfTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUpOworICAgICAgX19ub2RlX3R5cGUqIF9fcCA9IF9NX2J1Y2tldF9iZWdpbihfX24pOworICAgICAgaWYgKCFfX3ApCisJcmV0dXJuIDA7CisKKyAgICAgIHN0ZDo6c2l6ZV90IF9fcmVzdWx0ID0gMDsKKyAgICAgIGZvciAoOzsgX19wID0gX19wLT5fTV9uZXh0KCkpCisJeworCSAgaWYgKHRoaXMtPl9NX2VxdWFscyhfX2ssIF9fY29kZSwgX19wKSkKKwkgICAgKytfX3Jlc3VsdDsKKwkgIGVsc2UgaWYgKF9fcmVzdWx0KQorCSAgICAvLyBBbGwgZXF1aXZhbGVudCB2YWx1ZXMgYXJlIG5leHQgdG8gZWFjaCBvdGhlciwgaWYgd2UKKwkgICAgLy8gZm91bmQgYSBub24tZXF1aXZhbGVudCB2YWx1ZSBhZnRlciBhbiBlcXVpdmFsZW50IG9uZSBpdAorCSAgICAvLyBtZWFucyB0aGF0IHdlIHdvbid0IGZpbmQgYW55IG1vcmUgZXF1aXZhbGVudCB2YWx1ZXMuCisJICAgIGJyZWFrOworCSAgaWYgKCFfX3AtPl9NX254dCB8fCBfTV9idWNrZXRfaW5kZXgoX19wLT5fTV9uZXh0KCkpICE9IF9fbikKKwkgICAgYnJlYWs7CisJfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6cGFpcjx0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLAorCQkJCSAgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLAorCQkJCSAgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCQkgIF9UcmFpdHM+OjppdGVyYXRvciwKKwkgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLAorCQkJCSAgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLAorCQkJCSAgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCQkgIF9UcmFpdHM+OjppdGVyYXRvcj4KKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rKQorICAgIHsKKyAgICAgIF9faGFzaF9jb2RlIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc3RkOjpzaXplX3QgX19uID0gX01fYnVja2V0X2luZGV4KF9faywgX19jb2RlKTsKKyAgICAgIF9fbm9kZV90eXBlKiBfX3AgPSBfTV9maW5kX25vZGUoX19uLCBfX2ssIF9fY29kZSk7CisKKyAgICAgIGlmIChfX3ApCisJeworCSAgX19ub2RlX3R5cGUqIF9fcDEgPSBfX3AtPl9NX25leHQoKTsKKwkgIHdoaWxlIChfX3AxICYmIF9NX2J1Y2tldF9pbmRleChfX3AxKSA9PSBfX24KKwkJICYmIHRoaXMtPl9NX2VxdWFscyhfX2ssIF9fY29kZSwgX19wMSkpCisJICAgIF9fcDEgPSBfX3AxLT5fTV9uZXh0KCk7CisKKwkgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihfX3ApLCBpdGVyYXRvcihfX3AxKSk7CisJfQorICAgICAgZWxzZQorCXJldHVybiBzdGQ6Om1ha2VfcGFpcih0aGlzLT5lbmQoKSwgdGhpcy0+ZW5kKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6cGFpcjx0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLAorCQkJCSAgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLAorCQkJCSAgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCQkgIF9UcmFpdHM+Ojpjb25zdF9pdGVyYXRvciwKKwkgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLAorCQkJCSAgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLAorCQkJCSAgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCQkgIF9UcmFpdHM+Ojpjb25zdF9pdGVyYXRvcj4KKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgIHsKKyAgICAgIF9faGFzaF9jb2RlIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc3RkOjpzaXplX3QgX19uID0gX01fYnVja2V0X2luZGV4KF9faywgX19jb2RlKTsKKyAgICAgIF9fbm9kZV90eXBlKiBfX3AgPSBfTV9maW5kX25vZGUoX19uLCBfX2ssIF9fY29kZSk7CisKKyAgICAgIGlmIChfX3ApCisJeworCSAgX19ub2RlX3R5cGUqIF9fcDEgPSBfX3AtPl9NX25leHQoKTsKKwkgIHdoaWxlIChfX3AxICYmIF9NX2J1Y2tldF9pbmRleChfX3AxKSA9PSBfX24KKwkJICYmIHRoaXMtPl9NX2VxdWFscyhfX2ssIF9fY29kZSwgX19wMSkpCisJICAgIF9fcDEgPSBfX3AxLT5fTV9uZXh0KCk7CisKKwkgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihjb25zdF9pdGVyYXRvcihfX3ApLCBjb25zdF9pdGVyYXRvcihfX3AxKSk7CisJfQorICAgICAgZWxzZQorCXJldHVybiBzdGQ6Om1ha2VfcGFpcih0aGlzLT5lbmQoKSwgdGhpcy0+ZW5kKCkpOworICAgIH0KKworICAvLyBGaW5kIHRoZSBub2RlIHdob3NlIGtleSBjb21wYXJlcyBlcXVhbCB0byBrIGluIHRoZSBidWNrZXQgbi4KKyAgLy8gUmV0dXJuIG51bGxwdHIgaWYgbm8gbm9kZSBpcyBmb3VuZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwKKwkJCV9FcXVhbCwgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX1RyYWl0cz46Ol9fbm9kZV9iYXNlKgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIF9NX2ZpbmRfYmVmb3JlX25vZGUoc2l6ZV90eXBlIF9fbiwgY29uc3Qga2V5X3R5cGUmIF9faywKKwkJCV9faGFzaF9jb2RlIF9fY29kZSkgY29uc3QKKyAgICB7CisgICAgICBfX25vZGVfYmFzZSogX19wcmV2X3AgPSBfTV9idWNrZXRzW19fbl07CisgICAgICBpZiAoIV9fcHJldl9wKQorCXJldHVybiBudWxscHRyOworICAgICAgX19ub2RlX3R5cGUqIF9fcCA9IHN0YXRpY19jYXN0PF9fbm9kZV90eXBlKj4oX19wcmV2X3AtPl9NX254dCk7CisgICAgICBmb3IgKDs7IF9fcCA9IF9fcC0+X01fbmV4dCgpKQorCXsKKwkgIGlmICh0aGlzLT5fTV9lcXVhbHMoX19rLCBfX2NvZGUsIF9fcCkpCisJICAgIHJldHVybiBfX3ByZXZfcDsKKwkgIGlmICghX19wLT5fTV9ueHQgfHwgX01fYnVja2V0X2luZGV4KF9fcC0+X01fbmV4dCgpKSAhPSBfX24pCisJICAgIGJyZWFrOworCSAgX19wcmV2X3AgPSBfX3A7CisJfQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdm9pZAorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIF9NX2luc2VydF9idWNrZXRfYmVnaW4oc2l6ZV90eXBlIF9fYmt0LCBfX25vZGVfdHlwZSogX19ub2RlKQorICAgIHsKKyAgICAgIGlmIChfTV9idWNrZXRzW19fYmt0XSkKKwl7CisJICAvLyBCdWNrZXQgaXMgbm90IGVtcHR5LCB3ZSBqdXN0IG5lZWQgdG8gaW5zZXJ0IHRoZSBuZXcgbm9kZQorCSAgLy8gYWZ0ZXIgdGhlIGJ1Y2tldCBiZWZvcmUgYmVnaW4uCisJICBfX25vZGUtPl9NX254dCA9IF9NX2J1Y2tldHNbX19ia3RdLT5fTV9ueHQ7CisJICBfTV9idWNrZXRzW19fYmt0XS0+X01fbnh0ID0gX19ub2RlOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvLyBUaGUgYnVja2V0IGlzIGVtcHR5LCB0aGUgbmV3IG5vZGUgaXMgaW5zZXJ0ZWQgYXQgdGhlCisJICAvLyBiZWdpbm5pbmcgb2YgdGhlIHNpbmdseS1saW5rZWQgbGlzdCBhbmQgdGhlIGJ1Y2tldCB3aWxsCisJICAvLyBjb250YWluIF9NX2JlZm9yZV9iZWdpbiBwb2ludGVyLgorCSAgX19ub2RlLT5fTV9ueHQgPSBfTV9iZWZvcmVfYmVnaW4oKS5fTV9ueHQ7CisJICBfTV9iZWZvcmVfYmVnaW4oKS5fTV9ueHQgPSBfX25vZGU7CisJICBpZiAoX19ub2RlLT5fTV9ueHQpCisJICAgIC8vIFdlIG11c3QgdXBkYXRlIGZvcm1lciBiZWdpbiBidWNrZXQgdGhhdCBpcyBwb2ludGluZyB0bworCSAgICAvLyBfTV9iZWZvcmVfYmVnaW4uCisJICAgIF9NX2J1Y2tldHNbX01fYnVja2V0X2luZGV4KF9fbm9kZS0+X01fbmV4dCgpKV0gPSBfX25vZGU7CisJICBfTV9idWNrZXRzW19fYmt0XSA9ICZfTV9iZWZvcmVfYmVnaW4oKTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdm9pZAorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIF9NX3JlbW92ZV9idWNrZXRfYmVnaW4oc2l6ZV90eXBlIF9fYmt0LCBfX25vZGVfdHlwZSogX19uZXh0LAorCQkJICAgc2l6ZV90eXBlIF9fbmV4dF9ia3QpCisgICAgeworICAgICAgaWYgKCFfX25leHQgfHwgX19uZXh0X2JrdCAhPSBfX2JrdCkKKwl7CisJICAvLyBCdWNrZXQgaXMgbm93IGVtcHR5CisJICAvLyBGaXJzdCB1cGRhdGUgbmV4dCBidWNrZXQgaWYgYW55CisJICBpZiAoX19uZXh0KQorCSAgICBfTV9idWNrZXRzW19fbmV4dF9ia3RdID0gX01fYnVja2V0c1tfX2JrdF07CisKKwkgIC8vIFNlY29uZCB1cGRhdGUgYmVmb3JlIGJlZ2luIG5vZGUgaWYgbmVjZXNzYXJ5CisJICBpZiAoJl9NX2JlZm9yZV9iZWdpbigpID09IF9NX2J1Y2tldHNbX19ia3RdKQorCSAgICBfTV9iZWZvcmVfYmVnaW4oKS5fTV9ueHQgPSBfX25leHQ7CisJICBfTV9idWNrZXRzW19fYmt0XSA9IG51bGxwdHI7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LAorCQkJX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfVHJhaXRzPjo6X19ub2RlX2Jhc2UqCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgX01fZ2V0X3ByZXZpb3VzX25vZGUoc2l6ZV90eXBlIF9fYmt0LCBfX25vZGVfYmFzZSogX19uKQorICAgIHsKKyAgICAgIF9fbm9kZV9iYXNlKiBfX3ByZXZfbiA9IF9NX2J1Y2tldHNbX19ia3RdOworICAgICAgd2hpbGUgKF9fcHJldl9uLT5fTV9ueHQgIT0gX19uKQorCV9fcHJldl9uID0gX19wcmV2X24tPl9NX254dDsKKyAgICAgIHJldHVybiBfX3ByZXZfbjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHN0ZDo6cGFpcjx0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLAorCQkJCSAgICBfRXh0cmFjdEtleSwgX0VxdWFsLCBfSDEsCisJCQkJICAgIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQkJICAgIF9UcmFpdHM+OjppdGVyYXRvciwgYm9vbD4KKyAgICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCSBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICAgIF9NX2VtcGxhY2Uoc3RkOjp0cnVlX3R5cGUsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgeworCS8vIEZpcnN0IGJ1aWxkIHRoZSBub2RlIHRvIGdldCBhY2Nlc3MgdG8gdGhlIGhhc2ggY29kZQorCV9fbm9kZV90eXBlKiBfX25vZGUgPSBfTV9hbGxvY2F0ZV9ub2RlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJY29uc3Qga2V5X3R5cGUmIF9fayA9IHRoaXMtPl9NX2V4dHJhY3QoKShfX25vZGUtPl9NX3YpOworCV9faGFzaF9jb2RlIF9fY29kZTsKKwlfX3RyeQorCSAgeworCSAgICBfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUoX19rKTsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX01fZGVhbGxvY2F0ZV9ub2RlKF9fbm9kZSk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorCisJc2l6ZV90eXBlIF9fYmt0ID0gX01fYnVja2V0X2luZGV4KF9faywgX19jb2RlKTsKKwlpZiAoX19ub2RlX3R5cGUqIF9fcCA9IF9NX2ZpbmRfbm9kZShfX2JrdCwgX19rLCBfX2NvZGUpKQorCSAgeworCSAgICAvLyBUaGVyZSBpcyBhbHJlYWR5IGFuIGVxdWl2YWxlbnQgbm9kZSwgbm8gaW5zZXJ0aW9uCisJICAgIF9NX2RlYWxsb2NhdGVfbm9kZShfX25vZGUpOworCSAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoX19wKSwgZmFsc2UpOworCSAgfQorCisJLy8gSW5zZXJ0IHRoZSBub2RlCisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKF9NX2luc2VydF91bmlxdWVfbm9kZShfX2JrdCwgX19jb2RlLCBfX25vZGUpLAorCQkJICAgICAgdHJ1ZSk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQkgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCSAgX1RyYWl0cz46Oml0ZXJhdG9yCisgICAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgICBfTV9lbXBsYWNlKHN0ZDo6ZmFsc2VfdHlwZSwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICB7CisJLy8gRmlyc3QgYnVpbGQgdGhlIG5vZGUgdG8gZ2V0IGl0cyBoYXNoIGNvZGUuCisJX19ub2RlX3R5cGUqIF9fbm9kZSA9IF9NX2FsbG9jYXRlX25vZGUoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKworCV9faGFzaF9jb2RlIF9fY29kZTsKKwlfX3RyeQorCSAgeworCSAgICBfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUodGhpcy0+X01fZXh0cmFjdCgpKF9fbm9kZS0+X01fdikpOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfTV9kZWFsbG9jYXRlX25vZGUoX19ub2RlKTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisKKwlyZXR1cm4gX01faW5zZXJ0X211bHRpX25vZGUoX19jb2RlLCBfX25vZGUpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9UcmFpdHM+OjppdGVyYXRvcgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIF9NX2luc2VydF91bmlxdWVfbm9kZShzaXplX3R5cGUgX19ia3QsIF9faGFzaF9jb2RlIF9fY29kZSwKKwkJCSAgX19ub2RlX3R5cGUqIF9fbm9kZSkKKyAgICB7CisgICAgICBjb25zdCBfX3JlaGFzaF9zdGF0ZSYgX19zYXZlZF9zdGF0ZSA9IF9NX3JlaGFzaF9wb2xpY3kuX01fc3RhdGUoKTsKKyAgICAgIHN0ZDo6cGFpcjxib29sLCBzdGQ6OnNpemVfdD4gX19kb19yZWhhc2gKKwk9IF9NX3JlaGFzaF9wb2xpY3kuX01fbmVlZF9yZWhhc2goX01fYnVja2V0X2NvdW50LCBfTV9lbGVtZW50X2NvdW50LCAxKTsKKworICAgICAgX190cnkKKwl7CisJICBpZiAoX19kb19yZWhhc2guZmlyc3QpCisJICAgIHsKKwkgICAgICBfTV9yZWhhc2goX19kb19yZWhhc2guc2Vjb25kLCBfX3NhdmVkX3N0YXRlKTsKKwkgICAgICBfX2JrdCA9IF9NX2J1Y2tldF9pbmRleCh0aGlzLT5fTV9leHRyYWN0KCkoX19ub2RlLT5fTV92KSwgX19jb2RlKTsKKwkgICAgfQorCisJICB0aGlzLT5fTV9zdG9yZV9jb2RlKF9fbm9kZSwgX19jb2RlKTsKKworCSAgLy8gQWx3YXlzIGluc2VydCBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIGJ1Y2tldC4KKwkgIF9NX2luc2VydF9idWNrZXRfYmVnaW4oX19ia3QsIF9fbm9kZSk7CisJICArK19NX2VsZW1lbnRfY291bnQ7CisJICByZXR1cm4gaXRlcmF0b3IoX19ub2RlKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBfTV9kZWFsbG9jYXRlX25vZGUoX19ub2RlKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgLy8gSW5zZXJ0IG5vZGUsIGluIGJ1Y2tldCBia3QgaWYgbm8gcmVoYXNoIChhc3N1bWVzIG5vIGVsZW1lbnQgd2l0aCBpdHMga2V5CisgIC8vIGFscmVhZHkgcHJlc2VudCkuIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBub2RlLCBkZWFsbG9jYXRlIGl0IG9uIGV4Y2VwdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX1RyYWl0cz46Oml0ZXJhdG9yCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgX01faW5zZXJ0X211bHRpX25vZGUoX19oYXNoX2NvZGUgX19jb2RlLCBfX25vZGVfdHlwZSogX19ub2RlKQorICAgIHsKKyAgICAgIGNvbnN0IF9fcmVoYXNoX3N0YXRlJiBfX3NhdmVkX3N0YXRlID0gX01fcmVoYXNoX3BvbGljeS5fTV9zdGF0ZSgpOworICAgICAgc3RkOjpwYWlyPGJvb2wsIHN0ZDo6c2l6ZV90PiBfX2RvX3JlaGFzaAorCT0gX01fcmVoYXNoX3BvbGljeS5fTV9uZWVkX3JlaGFzaChfTV9idWNrZXRfY291bnQsIF9NX2VsZW1lbnRfY291bnQsIDEpOworCisgICAgICBfX3RyeQorCXsKKwkgIGlmIChfX2RvX3JlaGFzaC5maXJzdCkKKwkgICAgX01fcmVoYXNoKF9fZG9fcmVoYXNoLnNlY29uZCwgX19zYXZlZF9zdGF0ZSk7CisKKwkgIHRoaXMtPl9NX3N0b3JlX2NvZGUoX19ub2RlLCBfX2NvZGUpOworCSAgY29uc3Qga2V5X3R5cGUmIF9fayA9IHRoaXMtPl9NX2V4dHJhY3QoKShfX25vZGUtPl9NX3YpOworCSAgc2l6ZV90eXBlIF9fYmt0ID0gX01fYnVja2V0X2luZGV4KF9faywgX19jb2RlKTsKKworCSAgLy8gRmluZCB0aGUgbm9kZSBiZWZvcmUgYW4gZXF1aXZhbGVudCBvbmUuCisJICBfX25vZGVfYmFzZSogX19wcmV2ID0gX01fZmluZF9iZWZvcmVfbm9kZShfX2JrdCwgX19rLCBfX2NvZGUpOworCSAgaWYgKF9fcHJldikKKwkgICAgeworCSAgICAgIC8vIEluc2VydCBhZnRlciB0aGUgbm9kZSBiZWZvcmUgdGhlIGVxdWl2YWxlbnQgb25lLgorCSAgICAgIF9fbm9kZS0+X01fbnh0ID0gX19wcmV2LT5fTV9ueHQ7CisJICAgICAgX19wcmV2LT5fTV9ueHQgPSBfX25vZGU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgLy8gVGhlIGluc2VydGVkIG5vZGUgaGFzIG5vIGVxdWl2YWxlbnQgaW4gdGhlCisJICAgIC8vIGhhc2h0YWJsZS4gV2UgbXVzdCBpbnNlcnQgdGhlIG5ldyBub2RlIGF0IHRoZQorCSAgICAvLyBiZWdpbm5pbmcgb2YgdGhlIGJ1Y2tldCB0byBwcmVzZXJ2ZSBlcXVpdmFsZW50CisJICAgIC8vIGVsZW1lbnRzJyByZWxhdGl2ZSBwb3NpdGlvbnMuCisJICAgIF9NX2luc2VydF9idWNrZXRfYmVnaW4oX19ia3QsIF9fbm9kZSk7CisJICArK19NX2VsZW1lbnRfY291bnQ7CisJICByZXR1cm4gaXRlcmF0b3IoX19ub2RlKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBfTV9kZWFsbG9jYXRlX25vZGUoX19ub2RlKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgLy8gSW5zZXJ0IHYgaWYgbm8gZWxlbWVudCB3aXRoIGl0cyBrZXkgaXMgYWxyZWFkeSBwcmVzZW50LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisgICAgICBzdGQ6OnBhaXI8dHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywKKwkJCQkgICAgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLAorCQkJCSAgICBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJCSAgICBfVHJhaXRzPjo6aXRlcmF0b3IsIGJvb2w+CisgICAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgICBfTV9pbnNlcnQoX0FyZyYmIF9fdiwgc3RkOjp0cnVlX3R5cGUpCisgICAgICB7CisJY29uc3Qga2V5X3R5cGUmIF9fayA9IHRoaXMtPl9NX2V4dHJhY3QoKShfX3YpOworCV9faGFzaF9jb2RlIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOworCXNpemVfdHlwZSBfX2JrdCA9IF9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSk7CisKKwlfX25vZGVfdHlwZSogX19uID0gX01fZmluZF9ub2RlKF9fYmt0LCBfX2ssIF9fY29kZSk7CisJaWYgKF9fbikKKwkgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihfX24pLCBmYWxzZSk7CisKKwlfX24gPSBfTV9hbGxvY2F0ZV9ub2RlKHN0ZDo6Zm9yd2FyZDxfQXJnPihfX3YpKTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoX01faW5zZXJ0X3VuaXF1ZV9ub2RlKF9fYmt0LCBfX2NvZGUsIF9fbiksIHRydWUpOworICAgICAgfQorCisgIC8vIEluc2VydCB2IHVuY29uZGl0aW9uYWxseS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCSAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJICBfVHJhaXRzPjo6aXRlcmF0b3IKKyAgICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCSBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICAgIF9NX2luc2VydChfQXJnJiYgX192LCBzdGQ6OmZhbHNlX3R5cGUpCisgICAgICB7CisJLy8gRmlyc3QgY29tcHV0ZSB0aGUgaGFzaCBjb2RlIHNvIHRoYXQgd2UgZG9uJ3QgZG8gYW55dGhpbmcgaWYgaXQKKwkvLyB0aHJvd3MuCisJX19oYXNoX2NvZGUgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKHRoaXMtPl9NX2V4dHJhY3QoKShfX3YpKTsKKworCS8vIFNlY29uZCBhbGxvY2F0ZSBuZXcgbm9kZSBzbyB0aGF0IHdlIGRvbid0IHJlaGFzaCBpZiBpdCB0aHJvd3MuCisJX19ub2RlX3R5cGUqIF9fbm9kZSA9IF9NX2FsbG9jYXRlX25vZGUoc3RkOjpmb3J3YXJkPF9Bcmc+KF9fdikpOworCisJcmV0dXJuIF9NX2luc2VydF9tdWx0aV9ub2RlKF9fY29kZSwgX19ub2RlKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfVHJhaXRzPjo6aXRlcmF0b3IKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2l0KQorICAgIHsKKyAgICAgIF9fbm9kZV90eXBlKiBfX24gPSBfX2l0Ll9NX2N1cjsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fYmt0ID0gX01fYnVja2V0X2luZGV4KF9fbik7CisKKyAgICAgIC8vIExvb2sgZm9yIHByZXZpb3VzIG5vZGUgdG8gdW5saW5rIGl0IGZyb20gdGhlIGVyYXNlZCBvbmUsIHRoaXMKKyAgICAgIC8vIGlzIHdoeSB3ZSBuZWVkIGJ1Y2tldHMgdG8gY29udGFpbiB0aGUgYmVmb3JlIGJlZ2luIHRvIG1ha2UKKyAgICAgIC8vIHRoaXMgc2VhcmNoIGZhc3QuCisgICAgICBfX25vZGVfYmFzZSogX19wcmV2X24gPSBfTV9nZXRfcHJldmlvdXNfbm9kZShfX2JrdCwgX19uKTsKKyAgICAgIHJldHVybiBfTV9lcmFzZShfX2JrdCwgX19wcmV2X24sIF9fbik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9UcmFpdHM+OjppdGVyYXRvcgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIF9NX2VyYXNlKHNpemVfdHlwZSBfX2JrdCwgX19ub2RlX2Jhc2UqIF9fcHJldl9uLCBfX25vZGVfdHlwZSogX19uKQorICAgIHsKKyAgICAgIGlmIChfX3ByZXZfbiA9PSBfTV9idWNrZXRzW19fYmt0XSkKKwlfTV9yZW1vdmVfYnVja2V0X2JlZ2luKF9fYmt0LCBfX24tPl9NX25leHQoKSwKKwkgICBfX24tPl9NX254dCA/IF9NX2J1Y2tldF9pbmRleChfX24tPl9NX25leHQoKSkgOiAwKTsKKyAgICAgIGVsc2UgaWYgKF9fbi0+X01fbnh0KQorCXsKKwkgIHNpemVfdHlwZSBfX25leHRfYmt0ID0gX01fYnVja2V0X2luZGV4KF9fbi0+X01fbmV4dCgpKTsKKwkgIGlmIChfX25leHRfYmt0ICE9IF9fYmt0KQorCSAgICBfTV9idWNrZXRzW19fbmV4dF9ia3RdID0gX19wcmV2X247CisJfQorCisgICAgICBfX3ByZXZfbi0+X01fbnh0ID0gX19uLT5fTV9ueHQ7CisgICAgICBpdGVyYXRvciBfX3Jlc3VsdChfX24tPl9NX25leHQoKSk7CisgICAgICBfTV9kZWFsbG9jYXRlX25vZGUoX19uKTsKKyAgICAgIC0tX01fZWxlbWVudF9jb3VudDsKKworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfVHJhaXRzPjo6c2l6ZV90eXBlCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgX01fZXJhc2Uoc3RkOjp0cnVlX3R5cGUsIGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgeworICAgICAgX19oYXNoX2NvZGUgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9fayk7CisgICAgICBzdGQ6OnNpemVfdCBfX2JrdCA9IF9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSk7CisKKyAgICAgIC8vIExvb2sgZm9yIHRoZSBub2RlIGJlZm9yZSB0aGUgZmlyc3QgbWF0Y2hpbmcgbm9kZS4KKyAgICAgIF9fbm9kZV9iYXNlKiBfX3ByZXZfbiA9IF9NX2ZpbmRfYmVmb3JlX25vZGUoX19ia3QsIF9faywgX19jb2RlKTsKKyAgICAgIGlmICghX19wcmV2X24pCisJcmV0dXJuIDA7CisKKyAgICAgIC8vIFdlIGZvdW5kIGEgbWF0Y2hpbmcgbm9kZSwgZXJhc2UgaXQuCisgICAgICBfX25vZGVfdHlwZSogX19uID0gc3RhdGljX2Nhc3Q8X19ub2RlX3R5cGUqPihfX3ByZXZfbi0+X01fbnh0KTsKKyAgICAgIF9NX2VyYXNlKF9fYmt0LCBfX3ByZXZfbiwgX19uKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfVHJhaXRzPjo6c2l6ZV90eXBlCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgX01fZXJhc2Uoc3RkOjpmYWxzZV90eXBlLCBjb25zdCBrZXlfdHlwZSYgX19rKQorICAgIHsKKyAgICAgIF9faGFzaF9jb2RlIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc3RkOjpzaXplX3QgX19ia3QgPSBfTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUpOworCisgICAgICAvLyBMb29rIGZvciB0aGUgbm9kZSBiZWZvcmUgdGhlIGZpcnN0IG1hdGNoaW5nIG5vZGUuCisgICAgICBfX25vZGVfYmFzZSogX19wcmV2X24gPSBfTV9maW5kX2JlZm9yZV9ub2RlKF9fYmt0LCBfX2ssIF9fY29kZSk7CisgICAgICBpZiAoIV9fcHJldl9uKQorCXJldHVybiAwOworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA1MjYuIElzIGl0IHVuZGVmaW5lZCBpZiBhIGZ1bmN0aW9uIGluIHRoZSBzdGFuZGFyZCBjaGFuZ2VzCisgICAgICAvLyBpbiBwYXJhbWV0ZXJzPworICAgICAgLy8gV2UgdXNlIG9uZSBsb29wIHRvIGZpbmQgYWxsIG1hdGNoaW5nIG5vZGVzIGFuZCBhbm90aGVyIHRvIGRlYWxsb2NhdGUKKyAgICAgIC8vIHRoZW0gc28gdGhhdCB0aGUga2V5IHN0YXlzIHZhbGlkIGR1cmluZyB0aGUgZmlyc3QgbG9vcC4gSXQgbWlnaHQgYmUKKyAgICAgIC8vIGludmFsaWRhdGVkIGluZGlyZWN0bHkgd2hlbiBkZXN0cm95aW5nIG5vZGVzLgorICAgICAgX19ub2RlX3R5cGUqIF9fbiA9IHN0YXRpY19jYXN0PF9fbm9kZV90eXBlKj4oX19wcmV2X24tPl9NX254dCk7CisgICAgICBfX25vZGVfdHlwZSogX19uX2xhc3QgPSBfX247CisgICAgICBzdGQ6OnNpemVfdCBfX25fbGFzdF9ia3QgPSBfX2JrdDsKKyAgICAgIGRvCisJeworCSAgX19uX2xhc3QgPSBfX25fbGFzdC0+X01fbmV4dCgpOworCSAgaWYgKCFfX25fbGFzdCkKKwkgICAgYnJlYWs7CisJICBfX25fbGFzdF9ia3QgPSBfTV9idWNrZXRfaW5kZXgoX19uX2xhc3QpOworCX0KKyAgICAgIHdoaWxlIChfX25fbGFzdF9ia3QgPT0gX19ia3QgJiYgdGhpcy0+X01fZXF1YWxzKF9faywgX19jb2RlLCBfX25fbGFzdCkpOworCisgICAgICAvLyBEZWFsbG9jYXRlIG5vZGVzLgorICAgICAgc2l6ZV90eXBlIF9fcmVzdWx0ID0gMDsKKyAgICAgIGRvCisJeworCSAgX19ub2RlX3R5cGUqIF9fcCA9IF9fbi0+X01fbmV4dCgpOworCSAgX01fZGVhbGxvY2F0ZV9ub2RlKF9fbik7CisJICBfX24gPSBfX3A7CisJICArK19fcmVzdWx0OworCSAgLS1fTV9lbGVtZW50X2NvdW50OworCX0KKyAgICAgIHdoaWxlIChfX24gIT0gX19uX2xhc3QpOworCisgICAgICBpZiAoX19wcmV2X24gPT0gX01fYnVja2V0c1tfX2JrdF0pCisJX01fcmVtb3ZlX2J1Y2tldF9iZWdpbihfX2JrdCwgX19uX2xhc3QsIF9fbl9sYXN0X2JrdCk7CisgICAgICBlbHNlIGlmIChfX25fbGFzdCAmJiBfX25fbGFzdF9ia3QgIT0gX19ia3QpCisJX01fYnVja2V0c1tfX25fbGFzdF9ia3RdID0gX19wcmV2X247CisgICAgICBfX3ByZXZfbi0+X01fbnh0ID0gX19uX2xhc3Q7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9UcmFpdHM+OjppdGVyYXRvcgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz46OgorICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICBfX25vZGVfdHlwZSogX19uID0gX19maXJzdC5fTV9jdXI7CisgICAgICBfX25vZGVfdHlwZSogX19sYXN0X24gPSBfX2xhc3QuX01fY3VyOworICAgICAgaWYgKF9fbiA9PSBfX2xhc3RfbikKKwlyZXR1cm4gaXRlcmF0b3IoX19uKTsKKworICAgICAgc3RkOjpzaXplX3QgX19ia3QgPSBfTV9idWNrZXRfaW5kZXgoX19uKTsKKworICAgICAgX19ub2RlX2Jhc2UqIF9fcHJldl9uID0gX01fZ2V0X3ByZXZpb3VzX25vZGUoX19ia3QsIF9fbik7CisgICAgICBib29sIF9faXNfYnVja2V0X2JlZ2luID0gX19uID09IF9NX2J1Y2tldF9iZWdpbihfX2JrdCk7CisgICAgICBzdGQ6OnNpemVfdCBfX25fYmt0ID0gX19ia3Q7CisgICAgICBmb3IgKDs7KQorCXsKKwkgIGRvCisJICAgIHsKKwkgICAgICBfX25vZGVfdHlwZSogX190bXAgPSBfX247CisJICAgICAgX19uID0gX19uLT5fTV9uZXh0KCk7CisJICAgICAgX01fZGVhbGxvY2F0ZV9ub2RlKF9fdG1wKTsKKwkgICAgICAtLV9NX2VsZW1lbnRfY291bnQ7CisJICAgICAgaWYgKCFfX24pCisJCWJyZWFrOworCSAgICAgIF9fbl9ia3QgPSBfTV9idWNrZXRfaW5kZXgoX19uKTsKKwkgICAgfQorCSAgd2hpbGUgKF9fbiAhPSBfX2xhc3RfbiAmJiBfX25fYmt0ID09IF9fYmt0KTsKKwkgIGlmIChfX2lzX2J1Y2tldF9iZWdpbikKKwkgICAgX01fcmVtb3ZlX2J1Y2tldF9iZWdpbihfX2JrdCwgX19uLCBfX25fYmt0KTsKKwkgIGlmIChfX24gPT0gX19sYXN0X24pCisJICAgIGJyZWFrOworCSAgX19pc19idWNrZXRfYmVnaW4gPSB0cnVlOworCSAgX19ia3QgPSBfX25fYmt0OworCX0KKworICAgICAgaWYgKF9fbiAmJiAoX19uX2JrdCAhPSBfX2JrdCB8fCBfX2lzX2J1Y2tldF9iZWdpbikpCisJX01fYnVja2V0c1tfX25fYmt0XSA9IF9fcHJldl9uOworICAgICAgX19wcmV2X24tPl9NX254dCA9IF9fbjsKKyAgICAgIHJldHVybiBpdGVyYXRvcihfX24pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICBjbGVhcigpIG5vZXhjZXB0CisgICAgeworICAgICAgX01fZGVhbGxvY2F0ZV9ub2RlcyhfTV9iZWdpbigpKTsKKyAgICAgIF9fYnVpbHRpbl9tZW1zZXQoX01fYnVja2V0cywgMCwgX01fYnVja2V0X2NvdW50ICogc2l6ZW9mKF9fYnVja2V0X3R5cGUpKTsKKyAgICAgIF9NX2VsZW1lbnRfY291bnQgPSAwOworICAgICAgX01fYmVmb3JlX2JlZ2luKCkuX01fbnh0ID0gbnVsbHB0cjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgcmVoYXNoKHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgY29uc3QgX19yZWhhc2hfc3RhdGUmIF9fc2F2ZWRfc3RhdGUgPSBfTV9yZWhhc2hfcG9saWN5Ll9NX3N0YXRlKCk7CisgICAgICBzdGQ6OnNpemVfdCBfX2J1Y2tldHMKKwk9IHN0ZDo6bWF4KF9NX3JlaGFzaF9wb2xpY3kuX01fYmt0X2Zvcl9lbGVtZW50cyhfTV9lbGVtZW50X2NvdW50ICsgMSksCisJCSAgIF9fbik7CisgICAgICBfX2J1Y2tldHMgPSBfTV9yZWhhc2hfcG9saWN5Ll9NX25leHRfYmt0KF9fYnVja2V0cyk7CisKKyAgICAgIGlmIChfX2J1Y2tldHMgIT0gX01fYnVja2V0X2NvdW50KQorCV9NX3JlaGFzaChfX2J1Y2tldHMsIF9fc2F2ZWRfc3RhdGUpOworICAgICAgZWxzZQorCS8vIE5vIHJlaGFzaCwgcmVzdG9yZSBwcmV2aW91cyBzdGF0ZSB0byBrZWVwIGEgY29uc2lzdGVudCBzdGF0ZS4KKwlfTV9yZWhhc2hfcG9saWN5Ll9NX3Jlc2V0KF9fc2F2ZWRfc3RhdGUpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICBfTV9yZWhhc2goc2l6ZV90eXBlIF9fbiwgY29uc3QgX19yZWhhc2hfc3RhdGUmIF9fc3RhdGUpCisgICAgeworICAgICAgX190cnkKKwl7CisJICBfTV9yZWhhc2hfYXV4KF9fbiwgX191bmlxdWVfa2V5cygpKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICAvLyBBIGZhaWx1cmUgaGVyZSBtZWFucyB0aGF0IGJ1Y2tldHMgYWxsb2NhdGlvbiBmYWlsZWQuICBXZSBvbmx5CisJICAvLyBoYXZlIHRvIHJlc3RvcmUgaGFzaCBwb2xpY3kgcHJldmlvdXMgc3RhdGUuCisJICBfTV9yZWhhc2hfcG9saWN5Ll9NX3Jlc2V0KF9fc3RhdGUpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICAvLyBSZWhhc2ggd2hlbiB0aGVyZSBpcyBubyBlcXVpdmFsZW50IGVsZW1lbnRzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICBfTV9yZWhhc2hfYXV4KHNpemVfdHlwZSBfX24sIHN0ZDo6dHJ1ZV90eXBlKQorICAgIHsKKyAgICAgIF9fYnVja2V0X3R5cGUqIF9fbmV3X2J1Y2tldHMgPSBfTV9hbGxvY2F0ZV9idWNrZXRzKF9fbik7CisgICAgICBfX25vZGVfdHlwZSogX19wID0gX01fYmVnaW4oKTsKKyAgICAgIF9NX2JlZm9yZV9iZWdpbigpLl9NX254dCA9IG51bGxwdHI7CisgICAgICBzdGQ6OnNpemVfdCBfX2JiZWdpbl9ia3QgPSAwOworICAgICAgd2hpbGUgKF9fcCkKKwl7CisJICBfX25vZGVfdHlwZSogX19uZXh0ID0gX19wLT5fTV9uZXh0KCk7CisJICBzdGQ6OnNpemVfdCBfX2JrdCA9IF9faGFzaF9jb2RlX2Jhc2U6Ol9NX2J1Y2tldF9pbmRleChfX3AsIF9fbik7CisJICBpZiAoIV9fbmV3X2J1Y2tldHNbX19ia3RdKQorCSAgICB7CisJICAgICAgX19wLT5fTV9ueHQgPSBfTV9iZWZvcmVfYmVnaW4oKS5fTV9ueHQ7CisJICAgICAgX01fYmVmb3JlX2JlZ2luKCkuX01fbnh0ID0gX19wOworCSAgICAgIF9fbmV3X2J1Y2tldHNbX19ia3RdID0gJl9NX2JlZm9yZV9iZWdpbigpOworCSAgICAgIGlmIChfX3AtPl9NX254dCkKKwkJX19uZXdfYnVja2V0c1tfX2JiZWdpbl9ia3RdID0gX19wOworCSAgICAgIF9fYmJlZ2luX2JrdCA9IF9fYmt0OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfX3AtPl9NX254dCA9IF9fbmV3X2J1Y2tldHNbX19ia3RdLT5fTV9ueHQ7CisJICAgICAgX19uZXdfYnVja2V0c1tfX2JrdF0tPl9NX254dCA9IF9fcDsKKwkgICAgfQorCSAgX19wID0gX19uZXh0OworCX0KKyAgICAgIF9NX2RlYWxsb2NhdGVfYnVja2V0cyhfTV9idWNrZXRzLCBfTV9idWNrZXRfY291bnQpOworICAgICAgX01fYnVja2V0X2NvdW50ID0gX19uOworICAgICAgX01fYnVja2V0cyA9IF9fbmV3X2J1Y2tldHM7CisgICAgfQorCisgIC8vIFJlaGFzaCB3aGVuIHRoZXJlIGNhbiBiZSBlcXVpdmFsZW50IGVsZW1lbnRzLCBwcmVzZXJ2ZSB0aGVpciByZWxhdGl2ZQorICAvLyBvcmRlci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CisgICAgX01fcmVoYXNoX2F1eChzaXplX3R5cGUgX19uLCBzdGQ6OmZhbHNlX3R5cGUpCisgICAgeworICAgICAgX19idWNrZXRfdHlwZSogX19uZXdfYnVja2V0cyA9IF9NX2FsbG9jYXRlX2J1Y2tldHMoX19uKTsKKworICAgICAgX19ub2RlX3R5cGUqIF9fcCA9IF9NX2JlZ2luKCk7CisgICAgICBfTV9iZWZvcmVfYmVnaW4oKS5fTV9ueHQgPSBudWxscHRyOworICAgICAgc3RkOjpzaXplX3QgX19iYmVnaW5fYmt0ID0gMDsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fcHJldl9ia3QgPSAwOworICAgICAgX19ub2RlX3R5cGUqIF9fcHJldl9wID0gbnVsbHB0cjsKKyAgICAgIGJvb2wgX19jaGVja19idWNrZXQgPSBmYWxzZTsKKworICAgICAgd2hpbGUgKF9fcCkKKwl7CisJICBfX25vZGVfdHlwZSogX19uZXh0ID0gX19wLT5fTV9uZXh0KCk7CisJICBzdGQ6OnNpemVfdCBfX2JrdCA9IF9faGFzaF9jb2RlX2Jhc2U6Ol9NX2J1Y2tldF9pbmRleChfX3AsIF9fbik7CisKKwkgIGlmIChfX3ByZXZfcCAmJiBfX3ByZXZfYmt0ID09IF9fYmt0KQorCSAgICB7CisJICAgICAgLy8gUHJldmlvdXMgaW5zZXJ0IHdhcyBhbHJlYWR5IGluIHRoaXMgYnVja2V0LCB3ZSBpbnNlcnQgYWZ0ZXIKKwkgICAgICAvLyB0aGUgcHJldmlvdXNseSBpbnNlcnRlZCBvbmUgdG8gcHJlc2VydmUgZXF1aXZhbGVudCBlbGVtZW50cworCSAgICAgIC8vIHJlbGF0aXZlIG9yZGVyLgorCSAgICAgIF9fcC0+X01fbnh0ID0gX19wcmV2X3AtPl9NX254dDsKKwkgICAgICBfX3ByZXZfcC0+X01fbnh0ID0gX19wOworCisJICAgICAgLy8gSW5zZXJ0aW5nIGFmdGVyIGEgbm9kZSBpbiBhIGJ1Y2tldCByZXF1aXJlIHRvIGNoZWNrIHRoYXQgd2UKKwkgICAgICAvLyBoYXZlbid0IGNoYW5nZSB0aGUgYnVja2V0IGxhc3Qgbm9kZSwgaW4gdGhpcyBjYXNlIG5leHQKKwkgICAgICAvLyBidWNrZXQgY29udGFpbmluZyBpdHMgYmVmb3JlIGJlZ2luIG5vZGUgbXVzdCBiZSB1cGRhdGVkLiBXZQorCSAgICAgIC8vIHNjaGVkdWxlIGEgY2hlY2sgYXMgc29vbiBhcyB3ZSBtb3ZlIG91dCBvZiB0aGUgc2VxdWVuY2Ugb2YKKwkgICAgICAvLyBlcXVpdmFsZW50IG5vZGVzIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY2hlY2tzLgorCSAgICAgIF9fY2hlY2tfYnVja2V0ID0gdHJ1ZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKF9fY2hlY2tfYnVja2V0KQorCQl7CisJCSAgLy8gQ2hlY2sgaWYgd2Ugc2hhbGwgdXBkYXRlIHRoZSBuZXh0IGJ1Y2tldCBiZWNhdXNlIG9mCisJCSAgLy8gaW5zZXJ0aW9ucyBpbnRvIF9fcHJldl9ia3QgYnVja2V0LgorCQkgIGlmIChfX3ByZXZfcC0+X01fbnh0KQorCQkgICAgeworCQkgICAgICBzdGQ6OnNpemVfdCBfX25leHRfYmt0CisJCQk9IF9faGFzaF9jb2RlX2Jhc2U6Ol9NX2J1Y2tldF9pbmRleChfX3ByZXZfcC0+X01fbmV4dCgpLAorCQkJCQkJCSAgICBfX24pOworCQkgICAgICBpZiAoX19uZXh0X2JrdCAhPSBfX3ByZXZfYmt0KQorCQkJX19uZXdfYnVja2V0c1tfX25leHRfYmt0XSA9IF9fcHJldl9wOworCQkgICAgfQorCQkgIF9fY2hlY2tfYnVja2V0ID0gZmFsc2U7CisJCX0KKworCSAgICAgIGlmICghX19uZXdfYnVja2V0c1tfX2JrdF0pCisJCXsKKwkJICBfX3AtPl9NX254dCA9IF9NX2JlZm9yZV9iZWdpbigpLl9NX254dDsKKwkJICBfTV9iZWZvcmVfYmVnaW4oKS5fTV9ueHQgPSBfX3A7CisJCSAgX19uZXdfYnVja2V0c1tfX2JrdF0gPSAmX01fYmVmb3JlX2JlZ2luKCk7CisJCSAgaWYgKF9fcC0+X01fbnh0KQorCQkgICAgX19uZXdfYnVja2V0c1tfX2JiZWdpbl9ia3RdID0gX19wOworCQkgIF9fYmJlZ2luX2JrdCA9IF9fYmt0OworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgX19wLT5fTV9ueHQgPSBfX25ld19idWNrZXRzW19fYmt0XS0+X01fbnh0OworCQkgIF9fbmV3X2J1Y2tldHNbX19ia3RdLT5fTV9ueHQgPSBfX3A7CisJCX0KKwkgICAgfQorCSAgX19wcmV2X3AgPSBfX3A7CisJICBfX3ByZXZfYmt0ID0gX19ia3Q7CisJICBfX3AgPSBfX25leHQ7CisJfQorCisgICAgICBpZiAoX19jaGVja19idWNrZXQgJiYgX19wcmV2X3AtPl9NX254dCkKKwl7CisJICBzdGQ6OnNpemVfdCBfX25leHRfYmt0CisJICAgID0gX19oYXNoX2NvZGVfYmFzZTo6X01fYnVja2V0X2luZGV4KF9fcHJldl9wLT5fTV9uZXh0KCksIF9fbik7CisJICBpZiAoX19uZXh0X2JrdCAhPSBfX3ByZXZfYmt0KQorCSAgICBfX25ld19idWNrZXRzW19fbmV4dF9ia3RdID0gX19wcmV2X3A7CisJfQorCisgICAgICBfTV9kZWFsbG9jYXRlX2J1Y2tldHMoX01fYnVja2V0cywgX01fYnVja2V0X2NvdW50KTsKKyAgICAgIF9NX2J1Y2tldF9jb3VudCA9IF9fbjsKKyAgICAgIF9NX2J1Y2tldHMgPSBfX25ld19idWNrZXRzOworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8vIF9IQVNIVEFCTEVfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2hhc2h0YWJsZV9wb2xpY3kuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9oYXNodGFibGVfcG9saWN5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY5Yjg0MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9oYXNodGFibGVfcG9saWN5LmgKQEAgLTAsMCArMSwxNjcwIEBACisvLyBJbnRlcm5hbCBwb2xpY3kgaGVhZGVyIGZvciB1bm9yZGVyZWRfc2V0IGFuZCB1bm9yZGVyZWRfbWFwIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2hhc2h0YWJsZV9wb2xpY3kuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKiAgQGhlYWRlcm5hbWV7dW5vcmRlcmVkX21hcCx1bm9yZGVyZWRfc2V0fQorICovCisKKyNpZm5kZWYgX0hBU0hUQUJMRV9QT0xJQ1lfSAorI2RlZmluZSBfSEFTSFRBQkxFX1BPTElDWV9IIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgY2xhc3MgX0hhc2h0YWJsZTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisKK25hbWVzcGFjZSBfX2RldGFpbAoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBkZWZncm91cCBoYXNodGFibGUtZGV0YWlsIEJhc2UgYW5kIEltcGxlbWVudGF0aW9uIENsYXNzZXMKKyAgICogIEBpbmdyb3VwIHVub3JkZXJlZF9hc3NvY2lhdGl2ZV9jb250YWluZXJzCisgICAqICBAeworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0cnVjdCBfSGFzaHRhYmxlX2Jhc2U7CisKKyAgLy8gSGVscGVyIGZ1bmN0aW9uOiByZXR1cm4gZGlzdGFuY2UoZmlyc3QsIGxhc3QpIGZvciBmb3J3YXJkCisgIC8vIGl0ZXJhdG9ycywgb3IgMCBmb3IgaW5wdXQgaXRlcmF0b3JzLgorICB0ZW1wbGF0ZTxjbGFzcyBfSXRlcmF0b3I+CisgICAgaW5saW5lIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIF9fZGlzdGFuY2VfZncoX0l0ZXJhdG9yIF9fZmlyc3QsIF9JdGVyYXRvciBfX2xhc3QsCisJCSAgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpCisgICAgeyByZXR1cm4gMDsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgX19kaXN0YW5jZV9mdyhfSXRlcmF0b3IgX19maXJzdCwgX0l0ZXJhdG9yIF9fbGFzdCwKKwkJICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgIHsgcmV0dXJuIHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgX19kaXN0YW5jZV9mdyhfSXRlcmF0b3IgX19maXJzdCwgX0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46Oml0ZXJhdG9yX2NhdGVnb3J5IF9UYWc7CisgICAgICByZXR1cm4gX19kaXN0YW5jZV9mdyhfX2ZpcnN0LCBfX2xhc3QsIF9UYWcoKSk7CisgICAgfQorCisgIC8vIEhlbHBlciB0eXBlIHVzZWQgdG8gZGV0ZWN0IHdoZXRoZXIgdGhlIGhhc2ggZnVuY3RvciBpcyBub2V4Y2VwdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9IYXNoPgorICAgIHN0cnVjdCBfX2lzX25vZXhjZXB0X2hhc2ggOiBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsCisJbm9leGNlcHQoZGVjbHZhbDxjb25zdCBfSGFzaCY+KCkoZGVjbHZhbDxjb25zdCBfS2V5Jj4oKSkpPgorICAgIHsgfTsKKworICBzdHJ1Y3QgX0lkZW50aXR5CisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAmJgorICAgICAgb3BlcmF0b3IoKShfVHAmJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6OmZvcndhcmQ8X1RwPihfX3gpOyB9CisgIH07CisKKyAgc3RydWN0IF9TZWxlY3Qxc3QKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIGF1dG8KKyAgICAgIG9wZXJhdG9yKCkoX1RwJiYgX194KSBjb25zdAorICAgICAgLT4gZGVjbHR5cGUoc3RkOjpnZXQ8MD4oc3RkOjpmb3J3YXJkPF9UcD4oX194KSkpCisgICAgICB7IHJldHVybiBzdGQ6OmdldDwwPihzdGQ6OmZvcndhcmQ8X1RwPihfX3gpKTsgfQorICB9OworCisgIC8vIEF1eGlsaWFyeSB0eXBlcyB1c2VkIGZvciBhbGwgaW5zdGFudGlhdGlvbnMgb2YgX0hhc2h0YWJsZSBub2RlcworICAvLyBhbmQgaXRlcmF0b3JzLgorCisgIC8qKgorICAgKiAgc3RydWN0IF9IYXNodGFibGVfdHJhaXRzCisgICAqCisgICAqICBJbXBvcnRhbnQgdHJhaXRzIGZvciBoYXNoIHRhYmxlcy4KKyAgICoKKyAgICogIEB0cGFyYW0gX0NhY2hlX2hhc2hfY29kZSAgQm9vbGVhbiB2YWx1ZS4gVHJ1ZSBpZiB0aGUgdmFsdWUgb2YKKyAgICogIHRoZSBoYXNoIGZ1bmN0aW9uIGlzIHN0b3JlZCBhbG9uZyB3aXRoIHRoZSB2YWx1ZS4gVGhpcyBpcyBhCisgICAqICB0aW1lLXNwYWNlIHRyYWRlb2ZmLiAgU3RvcmluZyBpdCBtYXkgaW1wcm92ZSBsb29rdXAgc3BlZWQgYnkKKyAgICogIHJlZHVjaW5nIHRoZSBudW1iZXIgb2YgdGltZXMgd2UgbmVlZCB0byBjYWxsIHRoZSBfRXF1YWwKKyAgICogIGZ1bmN0aW9uLgorICAgKgorICAgKiAgQHRwYXJhbSBfQ29uc3RhbnRfaXRlcmF0b3JzICBCb29sZWFuIHZhbHVlLiBUcnVlIGlmIGl0ZXJhdG9yIGFuZAorICAgKiAgY29uc3RfaXRlcmF0b3IgYXJlIGJvdGggY29uc3RhbnQgaXRlcmF0b3IgdHlwZXMuIFRoaXMgaXMgdHJ1ZQorICAgKiAgZm9yIHVub3JkZXJlZF9zZXQgYW5kIHVub3JkZXJlZF9tdWx0aXNldCwgZmFsc2UgZm9yCisgICAqICB1bm9yZGVyZWRfbWFwIGFuZCB1bm9yZGVyZWRfbXVsdGltYXAuCisgICAqCisgICAqICBAdHBhcmFtIF9VbmlxdWVfa2V5cyAgQm9vbGVhbiB2YWx1ZS4gVHJ1ZSBpZiB0aGUgcmV0dXJuIHZhbHVlCisgICAqICBvZiBfSGFzaHRhYmxlOjpjb3VudChrKSBpcyBhbHdheXMgYXQgbW9zdCBvbmUsIGZhbHNlIGlmIGl0IG1heQorICAgKiAgYmUgYW4gYXJiaXRyYXJ5IG51bWJlci4gVGhpcyBpcyB0cnVlIGZvciB1bm9yZGVyZWRfc2V0IGFuZAorICAgKiAgdW5vcmRlcmVkX21hcCwgZmFsc2UgZm9yIHVub3JkZXJlZF9tdWx0aXNldCBhbmQKKyAgICogIHVub3JkZXJlZF9tdWx0aW1hcC4KKyAgICovCisgIHRlbXBsYXRlPGJvb2wgX0NhY2hlX2hhc2hfY29kZSwgYm9vbCBfQ29uc3RhbnRfaXRlcmF0b3JzLCBib29sIF9VbmlxdWVfa2V5cz4KKyAgICBzdHJ1Y3QgX0hhc2h0YWJsZV90cmFpdHMKKyAgICB7CisgICAgICB0ZW1wbGF0ZTxib29sIF9Db25kPgorCXVzaW5nIF9fYm9vbF9jb25zdGFudCA9IGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9Db25kPjsKKworICAgICAgdXNpbmcgX19oYXNoX2NhY2hlZCA9IF9fYm9vbF9jb25zdGFudDxfQ2FjaGVfaGFzaF9jb2RlPjsKKyAgICAgIHVzaW5nIF9fY29uc3RhbnRfaXRlcmF0b3JzID0gX19ib29sX2NvbnN0YW50PF9Db25zdGFudF9pdGVyYXRvcnM+OworICAgICAgdXNpbmcgX191bmlxdWVfa2V5cyA9IF9fYm9vbF9jb25zdGFudDxfVW5pcXVlX2tleXM+OworICAgIH07CisKKyAgLyoqCisgICAqICBzdHJ1Y3QgX0hhc2hfbm9kZV9iYXNlCisgICAqCisgICAqICBOb2RlcywgdXNlZCB0byB3cmFwIGVsZW1lbnRzIHN0b3JlZCBpbiB0aGUgaGFzaCB0YWJsZS4gIEEgcG9saWN5CisgICAqICB0ZW1wbGF0ZSBwYXJhbWV0ZXIgb2YgY2xhc3MgdGVtcGxhdGUgX0hhc2h0YWJsZSBjb250cm9scyB3aGV0aGVyCisgICAqICBub2RlcyBhbHNvIHN0b3JlIGEgaGFzaCBjb2RlLiBJbiBzb21lIGNhc2VzIChlLmcuIHN0cmluZ3MpIHRoaXMKKyAgICogIG1heSBiZSBhIHBlcmZvcm1hbmNlIHdpbi4KKyAgICovCisgIHN0cnVjdCBfSGFzaF9ub2RlX2Jhc2UKKyAgeworICAgIF9IYXNoX25vZGVfYmFzZSogX01fbnh0OworCisgICAgX0hhc2hfbm9kZV9iYXNlKCkgOiBfTV9ueHQoKSB7IH0KKworICAgIF9IYXNoX25vZGVfYmFzZShfSGFzaF9ub2RlX2Jhc2UqIF9fbmV4dCkgOiBfTV9ueHQoX19uZXh0KSB7IH0KKyAgfTsKKworICAvKioKKyAgICogIFByaW1hcnkgdGVtcGxhdGUgc3RydWN0IF9IYXNoX25vZGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX0NhY2hlX2hhc2hfY29kZT4KKyAgICBzdHJ1Y3QgX0hhc2hfbm9kZTsKKworICAvKioKKyAgICogIFNwZWNpYWxpemF0aW9uIGZvciBub2RlcyB3aXRoIGNhY2hlcywgc3RydWN0IF9IYXNoX25vZGUuCisgICAqCisgICAqICBCYXNlIGNsYXNzIGlzIF9fZGV0YWlsOjpfSGFzaF9ub2RlX2Jhc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWU+CisgICAgc3RydWN0IF9IYXNoX25vZGU8X1ZhbHVlLCB0cnVlPiA6IF9IYXNoX25vZGVfYmFzZQorICAgIHsKKyAgICAgIF9WYWx1ZSAgICAgICBfTV92OworICAgICAgc3RkOjpzaXplX3QgIF9NX2hhc2hfY29kZTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJX0hhc2hfbm9kZShfQXJncyYmLi4uIF9fYXJncykKKwk6IF9NX3Yoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSwgX01faGFzaF9jb2RlKCkgeyB9CisKKyAgICAgIF9IYXNoX25vZGUqCisgICAgICBfTV9uZXh0KCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X0hhc2hfbm9kZSo+KF9NX254dCk7IH0KKyAgICB9OworCisgIC8qKgorICAgKiAgU3BlY2lhbGl6YXRpb24gZm9yIG5vZGVzIHdpdGhvdXQgY2FjaGVzLCBzdHJ1Y3QgX0hhc2hfbm9kZS4KKyAgICoKKyAgICogIEJhc2UgY2xhc3MgaXMgX19kZXRhaWw6Ol9IYXNoX25vZGVfYmFzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZT4KKyAgICBzdHJ1Y3QgX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiA6IF9IYXNoX25vZGVfYmFzZQorICAgIHsKKyAgICAgIF9WYWx1ZSAgICAgICBfTV92OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlfSGFzaF9ub2RlKF9BcmdzJiYuLi4gX19hcmdzKQorCTogX01fdihzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pIHsgfQorCisgICAgICBfSGFzaF9ub2RlKgorICAgICAgX01fbmV4dCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PF9IYXNoX25vZGUqPihfTV9ueHQpOyB9CisgICAgfTsKKworICAvLy8gQmFzZSBjbGFzcyBmb3Igbm9kZSBpdGVyYXRvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfQ2FjaGVfaGFzaF9jb2RlPgorICAgIHN0cnVjdCBfTm9kZV9pdGVyYXRvcl9iYXNlCisgICAgeworICAgICAgdXNpbmcgX19ub2RlX3R5cGUgPSBfSGFzaF9ub2RlPF9WYWx1ZSwgX0NhY2hlX2hhc2hfY29kZT47CisKKyAgICAgIF9fbm9kZV90eXBlKiAgX01fY3VyOworCisgICAgICBfTm9kZV9pdGVyYXRvcl9iYXNlKF9fbm9kZV90eXBlKiBfX3ApCisgICAgICA6IF9NX2N1cihfX3ApIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9pbmNyKCkKKyAgICAgIHsgX01fY3VyID0gX01fY3VyLT5fTV9uZXh0KCk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfQ2FjaGVfaGFzaF9jb2RlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX0NhY2hlX2hhc2hfY29kZT4mIF9feCwKKwkgICAgICAgY29uc3QgX05vZGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9DYWNoZV9oYXNoX2NvZGUgPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9jdXIgPT0gX195Ll9NX2N1cjsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfQ2FjaGVfaGFzaF9jb2RlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX0NhY2hlX2hhc2hfY29kZT4mIF9feCwKKwkgICAgICAgY29uc3QgX05vZGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9DYWNoZV9oYXNoX2NvZGU+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2N1ciAhPSBfX3kuX01fY3VyOyB9CisKKyAgLy8vIE5vZGUgaXRlcmF0b3JzLCB1c2VkIHRvIGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIGhhc2h0YWJsZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCBib29sIF9fY29uc3RhbnRfaXRlcmF0b3JzLCBib29sIF9fY2FjaGU+CisgICAgc3RydWN0IF9Ob2RlX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgX05vZGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZSA9IF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPjsKKyAgICAgIHVzaW5nIF9fbm9kZV90eXBlID0gdHlwZW5hbWUgX19iYXNlX3R5cGU6Ol9fbm9kZV90eXBlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgICB1c2luZyBwb2ludGVyID0gdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxfX2NvbnN0YW50X2l0ZXJhdG9ycywKKwkJCQkJCWNvbnN0IF9WYWx1ZSosIF9WYWx1ZSo+Ojp0eXBlOworCisgICAgICB1c2luZyByZWZlcmVuY2UgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCQkJCQkJICBjb25zdCBfVmFsdWUmLCBfVmFsdWUmPjo6dHlwZTsKKworICAgICAgX05vZGVfaXRlcmF0b3IoKQorICAgICAgOiBfX2Jhc2VfdHlwZSgwKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIF9Ob2RlX2l0ZXJhdG9yKF9fbm9kZV90eXBlKiBfX3ApCisgICAgICA6IF9fYmFzZV90eXBlKF9fcCkgeyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2N1ci0+X01fdjsgfQorCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YodGhpcy0+X01fY3VyLT5fTV92KTsgfQorCisgICAgICBfTm9kZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9Ob2RlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlfTm9kZV9pdGVyYXRvciBfX3RtcCgqdGhpcyk7CisJdGhpcy0+X01faW5jcigpOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKyAgICB9OworCisgIC8vLyBOb2RlIGNvbnN0X2l0ZXJhdG9ycywgdXNlZCB0byBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBoYXNodGFibGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NvbnN0YW50X2l0ZXJhdG9ycywgYm9vbCBfX2NhY2hlPgorICAgIHN0cnVjdCBfTm9kZV9jb25zdF9pdGVyYXRvcgorICAgIDogcHVibGljIF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdXNpbmcgX19iYXNlX3R5cGUgPSBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT47CisgICAgICB1c2luZyBfX25vZGVfdHlwZSA9IHR5cGVuYW1lIF9fYmFzZV90eXBlOjpfX25vZGVfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1ZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgdHlwZWRlZiBjb25zdCBfVmFsdWUqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9WYWx1ZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworCisgICAgICBfTm9kZV9jb25zdF9pdGVyYXRvcigpCisgICAgICA6IF9fYmFzZV90eXBlKDApIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgX05vZGVfY29uc3RfaXRlcmF0b3IoX19ub2RlX3R5cGUqIF9fcCkKKyAgICAgIDogX19iYXNlX3R5cGUoX19wKSB7IH0KKworICAgICAgX05vZGVfY29uc3RfaXRlcmF0b3IoY29uc3QgX05vZGVfaXRlcmF0b3I8X1ZhbHVlLCBfX2NvbnN0YW50X2l0ZXJhdG9ycywKKwkJCSAgIF9fY2FjaGU+JiBfX3gpCisgICAgICA6IF9fYmFzZV90eXBlKF9feC5fTV9jdXIpIHsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9jdXItPl9NX3Y7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKHRoaXMtPl9NX2N1ci0+X01fdik7IH0KKworICAgICAgX05vZGVfY29uc3RfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwl0aGlzLT5fTV9pbmNyKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfTm9kZV9jb25zdF9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisJX05vZGVfY29uc3RfaXRlcmF0b3IgX190bXAoKnRoaXMpOworCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisgICAgfTsKKworICAvLyBNYW55IG9mIGNsYXNzIHRlbXBsYXRlIF9IYXNodGFibGUncyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSBwb2xpY3kKKyAgLy8gY2xhc3Nlcy4gIFRoZXNlIGFyZSBkZWZhdWx0cyBmb3IgdGhlIHBvbGljaWVzLgorCisgIC8vLyBEZWZhdWx0IHJhbmdlIGhhc2hpbmcgZnVuY3Rpb246IHVzZSBkaXZpc2lvbiB0byBmb2xkIGEgbGFyZ2UgbnVtYmVyCisgIC8vLyBpbnRvIHRoZSByYW5nZSBbMCwgTikuCisgIHN0cnVjdCBfTW9kX3JhbmdlX2hhc2hpbmcKKyAgeworICAgIHR5cGVkZWYgc3RkOjpzaXplX3QgZmlyc3RfYXJndW1lbnRfdHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IHNlY29uZF9hcmd1bWVudF90eXBlOworICAgIHR5cGVkZWYgc3RkOjpzaXplX3QgcmVzdWx0X3R5cGU7CisKKyAgICByZXN1bHRfdHlwZQorICAgIG9wZXJhdG9yKCkoZmlyc3RfYXJndW1lbnRfdHlwZSBfX251bSwgc2Vjb25kX2FyZ3VtZW50X3R5cGUgX19kZW4pIGNvbnN0CisgICAgeyByZXR1cm4gX19udW0gJSBfX2RlbjsgfQorICB9OworCisgIC8vLyBEZWZhdWx0IHJhbmdlZCBoYXNoIGZ1bmN0aW9uIEguICBJbiBwcmluY2lwbGUgaXQgc2hvdWxkIGJlIGEKKyAgLy8vIGZ1bmN0aW9uIG9iamVjdCBjb21wb3NlZCBmcm9tIG9iamVjdHMgb2YgdHlwZSBIMSBhbmQgSDIgc3VjaCB0aGF0CisgIC8vLyBoKGssIE4pID0gaDIoaDEoayksIE4pLCBidXQgdGhhdCB3b3VsZCBtZWFuIG1ha2luZyBleHRyYSBjb3BpZXMgb2YKKyAgLy8vIGgxIGFuZCBoMi4gIFNvIGluc3RlYWQgd2UnbGwganVzdCB1c2UgYSB0YWcgdG8gdGVsbCBjbGFzcyB0ZW1wbGF0ZQorICAvLy8gaGFzaHRhYmxlIHRvIGRvIHRoYXQgY29tcG9zaXRpb24uCisgIHN0cnVjdCBfRGVmYXVsdF9yYW5nZWRfaGFzaCB7IH07CisKKyAgLy8vIERlZmF1bHQgdmFsdWUgZm9yIHJlaGFzaCBwb2xpY3kuICBCdWNrZXQgc2l6ZSBpcyAodXN1YWxseSkgdGhlCisgIC8vLyBzbWFsbGVzdCBwcmltZSB0aGF0IGtlZXBzIHRoZSBsb2FkIGZhY3RvciBzbWFsbCBlbm91Z2guCisgIHN0cnVjdCBfUHJpbWVfcmVoYXNoX3BvbGljeQorICB7CisgICAgX1ByaW1lX3JlaGFzaF9wb2xpY3koZmxvYXQgX196ID0gMS4wKQorICAgIDogX01fbWF4X2xvYWRfZmFjdG9yKF9feiksIF9NX25leHRfcmVzaXplKDApIHsgfQorCisgICAgZmxvYXQKKyAgICBtYXhfbG9hZF9mYWN0b3IoKSBjb25zdCBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9NX21heF9sb2FkX2ZhY3RvcjsgfQorCisgICAgLy8gUmV0dXJuIGEgYnVja2V0IHNpemUgbm8gc21hbGxlciB0aGFuIG4uCisgICAgc3RkOjpzaXplX3QKKyAgICBfTV9uZXh0X2JrdChzdGQ6OnNpemVfdCBfX24pIGNvbnN0OworCisgICAgLy8gUmV0dXJuIGEgYnVja2V0IGNvdW50IGFwcHJvcHJpYXRlIGZvciBuIGVsZW1lbnRzCisgICAgc3RkOjpzaXplX3QKKyAgICBfTV9ia3RfZm9yX2VsZW1lbnRzKHN0ZDo6c2l6ZV90IF9fbikgY29uc3QKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fY2VpbChfX24gLyAobG9uZyBkb3VibGUpX01fbWF4X2xvYWRfZmFjdG9yKTsgfQorCisgICAgLy8gX19uX2JrdCBpcyBjdXJyZW50IGJ1Y2tldCBjb3VudCwgX19uX2VsdCBpcyBjdXJyZW50IGVsZW1lbnQgY291bnQsCisgICAgLy8gYW5kIF9fbl9pbnMgaXMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGJlIGluc2VydGVkLiAgRG8gd2UgbmVlZCB0bworICAgIC8vIGluY3JlYXNlIGJ1Y2tldCBjb3VudD8gIElmIHNvLCByZXR1cm4gbWFrZV9wYWlyKHRydWUsIG4pLCB3aGVyZSBuCisgICAgLy8gaXMgdGhlIG5ldyBidWNrZXQgY291bnQuICBJZiBub3QsIHJldHVybiBtYWtlX3BhaXIoZmFsc2UsIDApLgorICAgIHN0ZDo6cGFpcjxib29sLCBzdGQ6OnNpemVfdD4KKyAgICBfTV9uZWVkX3JlaGFzaChzdGQ6OnNpemVfdCBfX25fYmt0LCBzdGQ6OnNpemVfdCBfX25fZWx0LAorCQkgICBzdGQ6OnNpemVfdCBfX25faW5zKSBjb25zdDsKKworICAgIHR5cGVkZWYgc3RkOjpzaXplX3QgX1N0YXRlOworCisgICAgX1N0YXRlCisgICAgX01fc3RhdGUoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX25leHRfcmVzaXplOyB9CisKKyAgICB2b2lkCisgICAgX01fcmVzZXQoX1N0YXRlIF9fc3RhdGUpCisgICAgeyBfTV9uZXh0X3Jlc2l6ZSA9IF9fc3RhdGU7IH0KKworICAgIGVudW0geyBfU19uX3ByaW1lcyA9IHNpemVvZih1bnNpZ25lZCBsb25nKSAhPSA4ID8gMjU2IDogMjU2ICsgNDggfTsKKworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNpemVfdCBfU19ncm93dGhfZmFjdG9yID0gMjsKKworICAgIGZsb2F0ICAgICAgICAgICAgICAgIF9NX21heF9sb2FkX2ZhY3RvcjsKKyAgICBtdXRhYmxlIHN0ZDo6c2l6ZV90ICBfTV9uZXh0X3Jlc2l6ZTsKKyAgfTsKKworICAvLyBCYXNlIGNsYXNzZXMgZm9yIHN0ZDo6X0hhc2h0YWJsZS4gIFdlIGRlZmluZSB0aGVzZSBiYXNlIGNsYXNzZXMKKyAgLy8gYmVjYXVzZSBpbiBzb21lIGNhc2VzIHdlIHdhbnQgdG8gZG8gZGlmZmVyZW50IHRoaW5ncyBkZXBlbmRpbmcgb24KKyAgLy8gdGhlIHZhbHVlIG9mIGEgcG9saWN5IGNsYXNzLiAgSW4gc29tZSBjYXNlcyB0aGUgcG9saWN5IGNsYXNzCisgIC8vIGFmZmVjdHMgd2hpY2ggbWVtYmVyIGZ1bmN0aW9ucyBhbmQgbmVzdGVkIHR5cGVkZWZzIGFyZSBkZWZpbmVkOworICAvLyB3ZSBoYW5kbGUgdGhhdCBieSBzcGVjaWFsaXppbmcgYmFzZSBjbGFzcyB0ZW1wbGF0ZXMuICBTZXZlcmFsIG9mCisgIC8vIHRoZSBiYXNlIGNsYXNzIHRlbXBsYXRlcyBuZWVkIHRvIGFjY2VzcyBvdGhlciBtZW1iZXJzIG9mIGNsYXNzCisgIC8vIHRlbXBsYXRlIF9IYXNodGFibGUsIHNvIHdlIHVzZSBhIHZhcmlhbnQgb2YgdGhlICJDdXJpb3VzbHkKKyAgLy8gUmVjdXJyaW5nIFRlbXBsYXRlIFBhdHRlcm4iIChDUlRQKSB0ZWNobmlxdWUuCisKKyAgLyoqCisgICAqICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIF9NYXBfYmFzZS4KKyAgICoKKyAgICogIElmIHRoZSBoYXNodGFibGUgaGFzIGEgdmFsdWUgdHlwZSBvZiB0aGUgZm9ybSBwYWlyPFQxLCBUMj4gYW5kIGEKKyAgICogIGtleSBleHRyYWN0aW9uIHBvbGljeSAoX0V4dHJhY3RLZXkpIHRoYXQgcmV0dXJucyB0aGUgZmlyc3QgcGFydAorICAgKiAgb2YgdGhlIHBhaXIsIHRoZSBoYXNodGFibGUgZ2V0cyBhIG1hcHBlZF90eXBlIHR5cGVkZWYuICBJZiBpdAorICAgKiAgc2F0aXNmaWVzIHRob3NlIGNyaXRlcmlhIGFuZCBhbHNvIGhhcyB1bmlxdWUga2V5cywgdGhlbiBpdCBhbHNvCisgICAqICBnZXRzIGFuIG9wZXJhdG9yW10uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LCB0eXBlbmFtZSBfVHJhaXRzLAorCSAgIGJvb2wgX1VuaXF1ZV9rZXlzID0gX1RyYWl0czo6X191bmlxdWVfa2V5czo6dmFsdWU+CisgICAgc3RydWN0IF9NYXBfYmFzZSB7IH07CisKKyAgLy8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24sIF9fdW5pcXVlX2tleXMgc2V0IHRvIGZhbHNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RydWN0IF9NYXBfYmFzZTxfS2V5LCBfUGFpciwgX0FsbG9jLCBfU2VsZWN0MXN0LCBfRXF1YWwsCisJCSAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzLCBmYWxzZT4KKyAgICB7CisgICAgICB1c2luZyBtYXBwZWRfdHlwZSA9IHR5cGVuYW1lIHN0ZDo6dHVwbGVfZWxlbWVudDwxLCBfUGFpcj46OnR5cGU7CisgICAgfTsKKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiwgX191bmlxdWVfa2V5cyBzZXQgdG8gdHJ1ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0cnVjdCBfTWFwX2Jhc2U8X0tleSwgX1BhaXIsIF9BbGxvYywgX1NlbGVjdDFzdCwgX0VxdWFsLAorCQkgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cywgdHJ1ZT4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHVzaW5nIF9faGFzaHRhYmxlX2Jhc2UgPSBfX2RldGFpbDo6X0hhc2h0YWJsZV9iYXNlPF9LZXksIF9QYWlyLAorCQkJCQkJCSBfU2VsZWN0MXN0LAorCQkJCQkJCV9FcXVhbCwgX0gxLCBfSDIsIF9IYXNoLAorCQkJCQkJCSAgX1RyYWl0cz47CisKKyAgICAgIHVzaW5nIF9faGFzaHRhYmxlID0gX0hhc2h0YWJsZTxfS2V5LCBfUGFpciwgX0FsbG9jLAorCQkJCSAgICAgX1NlbGVjdDFzdCwgX0VxdWFsLAorCQkJCSAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjsKKworICAgICAgdXNpbmcgX19oYXNoX2NvZGUgPSB0eXBlbmFtZSBfX2hhc2h0YWJsZV9iYXNlOjpfX2hhc2hfY29kZTsKKyAgICAgIHVzaW5nIF9fbm9kZV90eXBlID0gdHlwZW5hbWUgX19oYXNodGFibGVfYmFzZTo6X19ub2RlX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB1c2luZyBrZXlfdHlwZSA9IHR5cGVuYW1lIF9faGFzaHRhYmxlX2Jhc2U6OmtleV90eXBlOworICAgICAgdXNpbmcgaXRlcmF0b3IgPSB0eXBlbmFtZSBfX2hhc2h0YWJsZV9iYXNlOjppdGVyYXRvcjsKKyAgICAgIHVzaW5nIG1hcHBlZF90eXBlID0gdHlwZW5hbWUgc3RkOjp0dXBsZV9lbGVtZW50PDEsIF9QYWlyPjo6dHlwZTsKKworICAgICAgbWFwcGVkX3R5cGUmCisgICAgICBvcGVyYXRvcltdKGNvbnN0IGtleV90eXBlJiBfX2spOworCisgICAgICBtYXBwZWRfdHlwZSYKKyAgICAgIG9wZXJhdG9yW10oa2V5X3R5cGUmJiBfX2spOworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiA3NjEuIHVub3JkZXJlZF9tYXAgbmVlZHMgYW4gYXQoKSBtZW1iZXIgZnVuY3Rpb24uCisgICAgICBtYXBwZWRfdHlwZSYKKyAgICAgIGF0KGNvbnN0IGtleV90eXBlJiBfX2spOworCisgICAgICBjb25zdCBtYXBwZWRfdHlwZSYKKyAgICAgIGF0KGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0OworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIF9NYXBfYmFzZTxfS2V5LCBfUGFpciwgX0FsbG9jLCBfU2VsZWN0MXN0LCBfRXF1YWwsCisJCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHMsIHRydWU+CisJCSAgICAgICA6Om1hcHBlZF90eXBlJgorICAgIF9NYXBfYmFzZTxfS2V5LCBfUGFpciwgX0FsbG9jLCBfU2VsZWN0MXN0LCBfRXF1YWwsCisJICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzLCB0cnVlPjo6CisgICAgb3BlcmF0b3JbXShjb25zdCBrZXlfdHlwZSYgX19rKQorICAgIHsKKyAgICAgIF9faGFzaHRhYmxlKiBfX2ggPSBzdGF0aWNfY2FzdDxfX2hhc2h0YWJsZSo+KHRoaXMpOworICAgICAgX19oYXNoX2NvZGUgX19jb2RlID0gX19oLT5fTV9oYXNoX2NvZGUoX19rKTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fbiA9IF9faC0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlKTsKKyAgICAgIF9fbm9kZV90eXBlKiBfX3AgPSBfX2gtPl9NX2ZpbmRfbm9kZShfX24sIF9faywgX19jb2RlKTsKKworICAgICAgaWYgKCFfX3ApCisJeworCSAgX19wID0gX19oLT5fTV9hbGxvY2F0ZV9ub2RlKHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwKKwkJCQkgICAgICBzdGQ6OnR1cGxlPGNvbnN0IGtleV90eXBlJj4oX19rKSwKKwkJCQkgICAgICBzdGQ6OnR1cGxlPD4oKSk7CisJICByZXR1cm4gX19oLT5fTV9pbnNlcnRfdW5pcXVlX25vZGUoX19uLCBfX2NvZGUsIF9fcCktPnNlY29uZDsKKwl9CisKKyAgICAgIHJldHVybiAoX19wLT5fTV92KS5zZWNvbmQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBfTWFwX2Jhc2U8X0tleSwgX1BhaXIsIF9BbGxvYywgX1NlbGVjdDFzdCwgX0VxdWFsLAorCQkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzLCB0cnVlPgorCQkgICAgICAgOjptYXBwZWRfdHlwZSYKKyAgICBfTWFwX2Jhc2U8X0tleSwgX1BhaXIsIF9BbGxvYywgX1NlbGVjdDFzdCwgX0VxdWFsLAorCSAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cywgdHJ1ZT46OgorICAgIG9wZXJhdG9yW10oa2V5X3R5cGUmJiBfX2spCisgICAgeworICAgICAgX19oYXNodGFibGUqIF9faCA9IHN0YXRpY19jYXN0PF9faGFzaHRhYmxlKj4odGhpcyk7CisgICAgICBfX2hhc2hfY29kZSBfX2NvZGUgPSBfX2gtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc3RkOjpzaXplX3QgX19uID0gX19oLT5fTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUpOworICAgICAgX19ub2RlX3R5cGUqIF9fcCA9IF9faC0+X01fZmluZF9ub2RlKF9fbiwgX19rLCBfX2NvZGUpOworCisgICAgICBpZiAoIV9fcCkKKwl7CisJICBfX3AgPSBfX2gtPl9NX2FsbG9jYXRlX25vZGUoc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LAorCQkJCSAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShzdGQ6Om1vdmUoX19rKSksCisJCQkJICAgICAgc3RkOjp0dXBsZTw+KCkpOworCSAgcmV0dXJuIF9faC0+X01faW5zZXJ0X3VuaXF1ZV9ub2RlKF9fbiwgX19jb2RlLCBfX3ApLT5zZWNvbmQ7CisJfQorCisgICAgICByZXR1cm4gKF9fcC0+X01fdikuc2Vjb25kOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgX01hcF9iYXNlPF9LZXksIF9QYWlyLCBfQWxsb2MsIF9TZWxlY3Qxc3QsIF9FcXVhbCwKKwkJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cywgdHJ1ZT4KKwkJICAgICAgIDo6bWFwcGVkX3R5cGUmCisgICAgX01hcF9iYXNlPF9LZXksIF9QYWlyLCBfQWxsb2MsIF9TZWxlY3Qxc3QsIF9FcXVhbCwKKwkgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHMsIHRydWU+OjoKKyAgICBhdChjb25zdCBrZXlfdHlwZSYgX19rKQorICAgIHsKKyAgICAgIF9faGFzaHRhYmxlKiBfX2ggPSBzdGF0aWNfY2FzdDxfX2hhc2h0YWJsZSo+KHRoaXMpOworICAgICAgX19oYXNoX2NvZGUgX19jb2RlID0gX19oLT5fTV9oYXNoX2NvZGUoX19rKTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fbiA9IF9faC0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlKTsKKyAgICAgIF9fbm9kZV90eXBlKiBfX3AgPSBfX2gtPl9NX2ZpbmRfbm9kZShfX24sIF9faywgX19jb2RlKTsKKworICAgICAgaWYgKCFfX3ApCisJX190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJfTWFwX2Jhc2U6OmF0IikpOworICAgICAgcmV0dXJuIChfX3AtPl9NX3YpLnNlY29uZDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGNvbnN0IHR5cGVuYW1lIF9NYXBfYmFzZTxfS2V5LCBfUGFpciwgX0FsbG9jLCBfU2VsZWN0MXN0LAorCQkJICAgICBfRXF1YWwsIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCSAgICAgX1RyYWl0cywgdHJ1ZT46Om1hcHBlZF90eXBlJgorICAgIF9NYXBfYmFzZTxfS2V5LCBfUGFpciwgX0FsbG9jLCBfU2VsZWN0MXN0LCBfRXF1YWwsCisJICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzLCB0cnVlPjo6CisgICAgYXQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBfX2hhc2h0YWJsZSogX19oID0gc3RhdGljX2Nhc3Q8Y29uc3QgX19oYXNodGFibGUqPih0aGlzKTsKKyAgICAgIF9faGFzaF9jb2RlIF9fY29kZSA9IF9faC0+X01faGFzaF9jb2RlKF9fayk7CisgICAgICBzdGQ6OnNpemVfdCBfX24gPSBfX2gtPl9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSk7CisgICAgICBfX25vZGVfdHlwZSogX19wID0gX19oLT5fTV9maW5kX25vZGUoX19uLCBfX2ssIF9fY29kZSk7CisKKyAgICAgIGlmICghX19wKQorCV9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiX01hcF9iYXNlOjphdCIpKTsKKyAgICAgIHJldHVybiAoX19wLT5fTV92KS5zZWNvbmQ7CisgICAgfQorCisgIC8qKgorICAgKiAgUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZSBfSW5zZXJ0X2Jhc2UuCisgICAqCisgICAqICBpbnNlcnQgbWVtYmVyIGZ1bmN0aW9ucyBhcHByb3ByaWF0ZSB0byBhbGwgX0hhc2h0YWJsZXMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0cnVjdCBfSW5zZXJ0X2Jhc2UKKyAgICB7CisgICAgICB1c2luZyBfX2hhc2h0YWJsZSA9IF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LAorCQkJCSAgICAgX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsCisJCQkJICAgICBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjsKKworICAgICAgdXNpbmcgX19oYXNodGFibGVfYmFzZSA9IF9IYXNodGFibGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LAorCQkJCQkgICAgICAgX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsCisJCQkJCSAgICAgICBfVHJhaXRzPjsKKworICAgICAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIF9faGFzaHRhYmxlX2Jhc2U6OnZhbHVlX3R5cGU7CisgICAgICB1c2luZyBpdGVyYXRvciA9IHR5cGVuYW1lIF9faGFzaHRhYmxlX2Jhc2U6Oml0ZXJhdG9yOworICAgICAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSAgdHlwZW5hbWUgX19oYXNodGFibGVfYmFzZTo6Y29uc3RfaXRlcmF0b3I7CisgICAgICB1c2luZyBzaXplX3R5cGUgPSB0eXBlbmFtZSBfX2hhc2h0YWJsZV9iYXNlOjpzaXplX3R5cGU7CisKKyAgICAgIHVzaW5nIF9fdW5pcXVlX2tleXMgPSB0eXBlbmFtZSBfX2hhc2h0YWJsZV9iYXNlOjpfX3VuaXF1ZV9rZXlzOworICAgICAgdXNpbmcgX19pcmV0dXJuX3R5cGUgPSB0eXBlbmFtZSBfX2hhc2h0YWJsZV9iYXNlOjpfX2lyZXR1cm5fdHlwZTsKKyAgICAgIHVzaW5nIF9faWNvbnZfdHlwZSA9IHR5cGVuYW1lIF9faGFzaHRhYmxlX2Jhc2U6Ol9faWNvbnZfdHlwZTsKKworICAgICAgX19oYXNodGFibGUmCisgICAgICBfTV9jb25qdXJlX2hhc2h0YWJsZSgpCisgICAgICB7IHJldHVybiAqKHN0YXRpY19jYXN0PF9faGFzaHRhYmxlKj4odGhpcykpOyB9CisKKyAgICAgIF9faXJldHVybl90eXBlCisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX192KQorICAgICAgeworCV9faGFzaHRhYmxlJiBfX2ggPSBfTV9jb25qdXJlX2hhc2h0YWJsZSgpOworCXJldHVybiBfX2guX01faW5zZXJ0KF9fdiwgX191bmlxdWVfa2V5cygpKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciwgY29uc3QgdmFsdWVfdHlwZSYgX192KQorICAgICAgeyByZXR1cm4gX19pY29udl90eXBlKCkoaW5zZXJ0KF9fdikpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgdGhpcy0+aW5zZXJ0KF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXZvaWQKKwlpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBfSW5zZXJ0X2Jhc2U8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsIF9IMSwgX0gyLCBfSGFzaCwKKwkJICAgIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKKyAgICAgIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJdXNpbmcgX19yZWhhc2hfdHlwZSA9IHR5cGVuYW1lIF9faGFzaHRhYmxlOjpfX3JlaGFzaF90eXBlOworCXVzaW5nIF9fcmVoYXNoX3N0YXRlID0gdHlwZW5hbWUgX19oYXNodGFibGU6Ol9fcmVoYXNoX3N0YXRlOworCXVzaW5nIHBhaXJfdHlwZSA9IHN0ZDo6cGFpcjxib29sLCBzdGQ6OnNpemVfdD47CisKKwlzaXplX3R5cGUgX19uX2VsdCA9IF9fZGV0YWlsOjpfX2Rpc3RhbmNlX2Z3KF9fZmlyc3QsIF9fbGFzdCk7CisKKwlfX2hhc2h0YWJsZSYgX19oID0gX01fY29uanVyZV9oYXNodGFibGUoKTsKKwlfX3JlaGFzaF90eXBlJiBfX3JlaGFzaCA9IF9faC5fTV9yZWhhc2hfcG9saWN5OworCWNvbnN0IF9fcmVoYXNoX3N0YXRlJiBfX3NhdmVkX3N0YXRlID0gX19yZWhhc2guX01fc3RhdGUoKTsKKwlwYWlyX3R5cGUgX19kb19yZWhhc2ggPSBfX3JlaGFzaC5fTV9uZWVkX3JlaGFzaChfX2guX01fYnVja2V0X2NvdW50LAorCQkJCQkJCV9faC5fTV9lbGVtZW50X2NvdW50LAorCQkJCQkJCV9fbl9lbHQpOworCisJaWYgKF9fZG9fcmVoYXNoLmZpcnN0KQorCSAgX19oLl9NX3JlaGFzaChfX2RvX3JlaGFzaC5zZWNvbmQsIF9fc2F2ZWRfc3RhdGUpOworCisJZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJICBfX2guX01faW5zZXJ0KCpfX2ZpcnN0LCBfX3VuaXF1ZV9rZXlzKCkpOworICAgICAgfQorCisgIC8qKgorICAgKiAgUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZSBfSW5zZXJ0LgorICAgKgorICAgKiAgU2VsZWN0IGluc2VydCBtZW1iZXIgZnVuY3Rpb25zIGFwcHJvcHJpYXRlIHRvIF9IYXNodGFibGUgcG9saWN5IGNob2ljZXMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LCB0eXBlbmFtZSBfVHJhaXRzLAorCSAgIGJvb2wgX0NvbnN0YW50X2l0ZXJhdG9ycyA9IF9UcmFpdHM6Ol9fY29uc3RhbnRfaXRlcmF0b3JzOjp2YWx1ZSwKKwkgICBib29sIF9VbmlxdWVfa2V5cyA9IF9UcmFpdHM6Ol9fdW5pcXVlX2tleXM6OnZhbHVlPgorICAgIHN0cnVjdCBfSW5zZXJ0OworCisgIC8vLyBTcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdHJ1Y3QgX0luc2VydDxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLCBfSDIsIF9IYXNoLAorCQkgICBfUmVoYXNoUG9saWN5LCBfVHJhaXRzLCB0cnVlLCB0cnVlPgorICAgIDogcHVibGljIF9JbnNlcnRfYmFzZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCSAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz4KKyAgICB7CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZSA9IF9JbnNlcnRfYmFzZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksCisJCQkJCV9FcXVhbCwgX0gxLCBfSDIsIF9IYXNoLAorCQkJCQlfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjsKKyAgICAgIHVzaW5nIHZhbHVlX3R5cGUgPSB0eXBlbmFtZSBfX2Jhc2VfdHlwZTo6dmFsdWVfdHlwZTsKKyAgICAgIHVzaW5nIGl0ZXJhdG9yID0gdHlwZW5hbWUgX19iYXNlX3R5cGU6Oml0ZXJhdG9yOworICAgICAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSAgdHlwZW5hbWUgX19iYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yOworCisgICAgICB1c2luZyBfX3VuaXF1ZV9rZXlzID0gdHlwZW5hbWUgX19iYXNlX3R5cGU6Ol9fdW5pcXVlX2tleXM7CisgICAgICB1c2luZyBfX2hhc2h0YWJsZSA9IHR5cGVuYW1lIF9fYmFzZV90eXBlOjpfX2hhc2h0YWJsZTsKKworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Omluc2VydDsKKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX3YpCisgICAgICB7CisJX19oYXNodGFibGUmIF9faCA9IHRoaXMtPl9NX2Nvbmp1cmVfaGFzaHRhYmxlKCk7CisJcmV0dXJuIF9faC5fTV9pbnNlcnQoc3RkOjptb3ZlKF9fdiksIF9fdW5pcXVlX2tleXMoKSk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IsIHZhbHVlX3R5cGUmJiBfX3YpCisgICAgICB7IHJldHVybiBpbnNlcnQoc3RkOjptb3ZlKF9fdikpLmZpcnN0OyB9CisgICAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RydWN0IF9JbnNlcnQ8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsIF9IMSwgX0gyLCBfSGFzaCwKKwkJICAgX1JlaGFzaFBvbGljeSwgX1RyYWl0cywgdHJ1ZSwgZmFsc2U+CisgICAgOiBwdWJsaWMgX0luc2VydF9iYXNlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPgorICAgIHsKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlID0gX0luc2VydF9iYXNlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwKKwkJCQkJX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsCisJCQkJCV9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OworICAgICAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIF9fYmFzZV90eXBlOjp2YWx1ZV90eXBlOworICAgICAgdXNpbmcgaXRlcmF0b3IgPSB0eXBlbmFtZSBfX2Jhc2VfdHlwZTo6aXRlcmF0b3I7CisgICAgICB1c2luZyBjb25zdF9pdGVyYXRvciA9ICB0eXBlbmFtZSBfX2Jhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHVzaW5nIF9fdW5pcXVlX2tleXMgPSB0eXBlbmFtZSBfX2Jhc2VfdHlwZTo6X191bmlxdWVfa2V5czsKKyAgICAgIHVzaW5nIF9faGFzaHRhYmxlID0gdHlwZW5hbWUgX19iYXNlX3R5cGU6Ol9faGFzaHRhYmxlOworCisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6aW5zZXJ0OworCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX3YpCisgICAgICB7CisJX19oYXNodGFibGUmIF9faCA9IHRoaXMtPl9NX2Nvbmp1cmVfaGFzaHRhYmxlKCk7CisJcmV0dXJuIF9faC5fTV9pbnNlcnQoc3RkOjptb3ZlKF9fdiksIF9fdW5pcXVlX2tleXMoKSk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IsIHZhbHVlX3R5cGUmJiBfX3YpCisgICAgICB7IHJldHVybiBpbnNlcnQoc3RkOjptb3ZlKF9fdikpOyB9CisgICAgIH07CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LCB0eXBlbmFtZSBfVHJhaXRzLCBib29sIF9VbmlxdWVfa2V5cz4KKyAgICBzdHJ1Y3QgX0luc2VydDxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLCBfSDIsIF9IYXNoLAorCQkgICBfUmVoYXNoUG9saWN5LCBfVHJhaXRzLCBmYWxzZSwgX1VuaXF1ZV9rZXlzPgorICAgIDogcHVibGljIF9JbnNlcnRfYmFzZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCSAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz4KKyAgICB7CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZSA9IF9JbnNlcnRfYmFzZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksCisJCQkJICAgICAgIF9FcXVhbCwgX0gxLCBfSDIsIF9IYXNoLAorCQkJCSAgICAgICBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjsKKyAgICAgIHVzaW5nIHZhbHVlX3R5cGUgPSB0eXBlbmFtZSBfX2Jhc2VfdHlwZTo6dmFsdWVfdHlwZTsKKyAgICAgIHVzaW5nIGl0ZXJhdG9yID0gdHlwZW5hbWUgX19iYXNlX3R5cGU6Oml0ZXJhdG9yOworICAgICAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSAgdHlwZW5hbWUgX19iYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yOworCisgICAgICB1c2luZyBfX3VuaXF1ZV9rZXlzID0gdHlwZW5hbWUgX19iYXNlX3R5cGU6Ol9fdW5pcXVlX2tleXM7CisgICAgICB1c2luZyBfX2hhc2h0YWJsZSA9IHR5cGVuYW1lIF9fYmFzZV90eXBlOjpfX2hhc2h0YWJsZTsKKyAgICAgIHVzaW5nIF9faXJldHVybl90eXBlID0gdHlwZW5hbWUgX19iYXNlX3R5cGU6Ol9faXJldHVybl90eXBlOworICAgICAgdXNpbmcgX19pY29udl90eXBlID0gdHlwZW5hbWUgX19iYXNlX3R5cGU6Ol9faWNvbnZfdHlwZTsKKworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Omluc2VydDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXI+CisJdXNpbmcgX19pc19jb25zID0gc3RkOjppc19jb25zdHJ1Y3RpYmxlPHZhbHVlX3R5cGUsIF9QYWlyJiY+OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpcj4KKwl1c2luZyBfSUZjb25zID0gc3RkOjplbmFibGVfaWY8X19pc19jb25zPF9QYWlyPjo6dmFsdWU+OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpcj4KKwl1c2luZyBfSUZjb25zcCA9IHR5cGVuYW1lIF9JRmNvbnM8X1BhaXI+Ojp0eXBlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSBfSUZjb25zcDxfUGFpcj4+CisJX19pcmV0dXJuX3R5cGUKKwlpbnNlcnQoX1BhaXImJiBfX3YpCisJeworCSAgX19oYXNodGFibGUmIF9faCA9IHRoaXMtPl9NX2Nvbmp1cmVfaGFzaHRhYmxlKCk7CisJICByZXR1cm4gX19oLl9NX2VtcGxhY2UoX191bmlxdWVfa2V5cygpLCBzdGQ6OmZvcndhcmQ8X1BhaXI+KF9fdikpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gX0lGY29uc3A8X1BhaXI+PgorCWl0ZXJhdG9yCisJaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yLCBfUGFpciYmIF9fdikKKwl7IHJldHVybiBfX2ljb252X3R5cGUoKShpbnNlcnQoc3RkOjpmb3J3YXJkPF9QYWlyPihfX3YpKSk7IH0KKyAgIH07CisKKyAgLyoqCisgICAqICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlICBfUmVoYXNoX2Jhc2UuCisgICAqCisgICAqICBHaXZlIGhhc2h0YWJsZSB0aGUgbWF4X2xvYWRfZmFjdG9yIGZ1bmN0aW9ucyBhbmQgcmVzZXJ2ZSBpZmYgdGhlCisgICAqICByZWhhc2ggcG9saWN5IGlzIF9QcmltZV9yZWhhc2hfcG9saWN5LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0cnVjdCBfUmVoYXNoX2Jhc2U7CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdHJ1Y3QgX1JlaGFzaF9iYXNlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUHJpbWVfcmVoYXNoX3BvbGljeSwgX1RyYWl0cz4KKyAgICB7CisgICAgICB1c2luZyBfX2hhc2h0YWJsZSA9IF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LAorCQkJCSAgICAgX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsCisJCQkJICAgICBfUHJpbWVfcmVoYXNoX3BvbGljeSwgX1RyYWl0cz47CisKKyAgICAgIGZsb2F0CisgICAgICBtYXhfbG9hZF9mYWN0b3IoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeworCWNvbnN0IF9faGFzaHRhYmxlKiBfX3RoaXMgPSBzdGF0aWNfY2FzdDxjb25zdCBfX2hhc2h0YWJsZSo+KHRoaXMpOworCXJldHVybiBfX3RoaXMtPl9fcmVoYXNoX3BvbGljeSgpLm1heF9sb2FkX2ZhY3RvcigpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBtYXhfbG9hZF9mYWN0b3IoZmxvYXQgX196KQorICAgICAgeworCV9faGFzaHRhYmxlKiBfX3RoaXMgPSBzdGF0aWNfY2FzdDxfX2hhc2h0YWJsZSo+KHRoaXMpOworCV9fdGhpcy0+X19yZWhhc2hfcG9saWN5KF9QcmltZV9yZWhhc2hfcG9saWN5KF9feikpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICByZXNlcnZlKHN0ZDo6c2l6ZV90IF9fbikKKyAgICAgIHsKKwlfX2hhc2h0YWJsZSogX190aGlzID0gc3RhdGljX2Nhc3Q8X19oYXNodGFibGUqPih0aGlzKTsKKwlfX3RoaXMtPnJlaGFzaChfX2J1aWx0aW5fY2VpbChfX24gLyBtYXhfbG9hZF9mYWN0b3IoKSkpOworICAgICAgfQorICAgIH07CisKKyAgLyoqCisgICAqICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIF9IYXNodGFibGVfZWJvX2hlbHBlci4KKyAgICoKKyAgICogIEhlbHBlciBjbGFzcyB1c2luZyBFQk8gd2hlbiBpdCBpcyBub3QgZm9yYmlkZGVuLCB0eXBlIGlzIG5vdAorICAgKiAgZmluYWwsIGFuZCB3aGVuIGl0IHdvcnRoIGl0LCB0eXBlIGlzIGVtcHR5LgorICAgKi8KKyAgdGVtcGxhdGU8aW50IF9ObSwgdHlwZW5hbWUgX1RwLAorCSAgIGJvb2wgX191c2VfZWJvID0gIV9faXNfZmluYWwoX1RwKSAmJiBfX2lzX2VtcHR5KF9UcCk+CisgICAgc3RydWN0IF9IYXNodGFibGVfZWJvX2hlbHBlcjsKKworICAvLy8gU3BlY2lhbGl6YXRpb24gdXNpbmcgRUJPLgorICB0ZW1wbGF0ZTxpbnQgX05tLCB0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9IYXNodGFibGVfZWJvX2hlbHBlcjxfTm0sIF9UcCwgdHJ1ZT4KKyAgICA6IHByaXZhdGUgX1RwCisgICAgeworICAgICAgX0hhc2h0YWJsZV9lYm9faGVscGVyKCkgPSBkZWZhdWx0OworCisgICAgICBfSGFzaHRhYmxlX2Vib19oZWxwZXIoY29uc3QgX1RwJiBfX3RwKSA6IF9UcChfX3RwKQorICAgICAgeyB9CisKKyAgICAgIHN0YXRpYyBjb25zdCBfVHAmCisgICAgICBfU19jZ2V0KGNvbnN0IF9IYXNodGFibGVfZWJvX2hlbHBlciYgX19lYm9oKQorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgX1RwJj4oX19lYm9oKTsgfQorCisgICAgICBzdGF0aWMgX1RwJgorICAgICAgX1NfZ2V0KF9IYXNodGFibGVfZWJvX2hlbHBlciYgX19lYm9oKQorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwJj4oX19lYm9oKTsgfQorICAgIH07CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uIG5vdCB1c2luZyBFQk8uCisgIHRlbXBsYXRlPGludCBfTm0sIHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0hhc2h0YWJsZV9lYm9faGVscGVyPF9ObSwgX1RwLCBmYWxzZT4KKyAgICB7CisgICAgICBfSGFzaHRhYmxlX2Vib19oZWxwZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAgIF9IYXNodGFibGVfZWJvX2hlbHBlcihjb25zdCBfVHAmIF9fdHApIDogX01fdHAoX190cCkKKyAgICAgIHsgfQorCisgICAgICBzdGF0aWMgY29uc3QgX1RwJgorICAgICAgX1NfY2dldChjb25zdCBfSGFzaHRhYmxlX2Vib19oZWxwZXImIF9fZWJvaCkKKyAgICAgIHsgcmV0dXJuIF9fZWJvaC5fTV90cDsgfQorCisgICAgICBzdGF0aWMgX1RwJgorICAgICAgX1NfZ2V0KF9IYXNodGFibGVfZWJvX2hlbHBlciYgX19lYm9oKQorICAgICAgeyByZXR1cm4gX19lYm9oLl9NX3RwOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX1RwIF9NX3RwOworICAgIH07CisKKyAgLyoqCisgICAqICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIF9Mb2NhbF9pdGVyYXRvcl9iYXNlLgorICAgKgorICAgKiAgQmFzZSBjbGFzcyBmb3IgbG9jYWwgaXRlcmF0b3JzLCB1c2VkIHRvIGl0ZXJhdGUgd2l0aGluIGEgYnVja2V0CisgICAqICBidXQgbm90IGJldHdlZW4gYnVja2V0cy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0V4dHJhY3RLZXksCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIGJvb2wgX19jYWNoZV9oYXNoX2NvZGU+CisgICAgc3RydWN0IF9Mb2NhbF9pdGVyYXRvcl9iYXNlOworCisgIC8qKgorICAgKiAgUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZSBfSGFzaF9jb2RlX2Jhc2UuCisgICAqCisgICAqICBFbmNhcHN1bGF0ZXMgdHdvIHBvbGljeSBpc3N1ZXMgdGhhdCBhcmVuJ3QgcXVpdGUgb3J0aG9nb25hbC4KKyAgICogICAoMSkgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB1c2luZyBhIHJhbmdlZCBoYXNoIGZ1bmN0aW9uIGFuZCB1c2luZworICAgKiAgICAgICB0aGUgY29tYmluYXRpb24gb2YgYSBoYXNoIGZ1bmN0aW9uIGFuZCBhIHJhbmdlLWhhc2hpbmcgZnVuY3Rpb24uCisgICAqICAgICAgIEluIHRoZSBmb3JtZXIgY2FzZSB3ZSBkb24ndCBoYXZlIHN1Y2ggdGhpbmdzIGFzIGhhc2ggY29kZXMsIHNvCisgICAqICAgICAgIHdlIGhhdmUgYSBkdW1teSB0eXBlIGFzIHBsYWNlaG9sZGVyLgorICAgKiAgICgyKSBXaGV0aGVyIG9yIG5vdCB3ZSBjYWNoZSBoYXNoIGNvZGVzLiAgQ2FjaGluZyBoYXNoIGNvZGVzIGlzCisgICAqICAgICAgIG1lYW5pbmdsZXNzIGlmIHdlIGhhdmUgYSByYW5nZWQgaGFzaCBmdW5jdGlvbi4KKyAgICoKKyAgICogIFdlIGFsc28gcHV0IHRoZSBrZXkgZXh0cmFjdGlvbiBvYmplY3RzIGhlcmUsIGZvciBjb252ZW5pZW5jZS4KKyAgICogIEVhY2ggc3BlY2lhbGl6YXRpb24gZGVyaXZlcyBmcm9tIG9uZSBvciBtb3JlIG9mIHRoZSB0ZW1wbGF0ZQorICAgKiAgcGFyYW1ldGVycyB0byBiZW5lZml0IGZyb20gRWJvLiBUaGlzIGlzIGltcG9ydGFudCBhcyB0aGlzIHR5cGUKKyAgICogIGlzIGluaGVyaXRlZCBpbiBzb21lIGNhc2VzIGJ5IHRoZSBfTG9jYWxfaXRlcmF0b3JfYmFzZSB0eXBlIHVzZWQKKyAgICogIHRvIGltcGxlbWVudCBsb2NhbF9pdGVyYXRvciBhbmQgY29uc3RfbG9jYWxfaXRlcmF0b3IuIEFzIHdpdGgKKyAgICogIGFueSBpdGVyYXRvciB0eXBlIHdlIHByZWZlciB0byBtYWtlIGl0IGFzIHNtYWxsIGFzIHBvc3NpYmxlLgorICAgKgorICAgKiAgUHJpbWFyeSB0ZW1wbGF0ZSBpcyB1bnVzZWQgZXhjZXB0IGFzIGEgaG9vayBmb3Igc3BlY2lhbGl6YXRpb25zLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsCisJICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZT4KKyAgICBzdHJ1Y3QgX0hhc2hfY29kZV9iYXNlOworCisgIC8vLyBTcGVjaWFsaXphdGlvbjogcmFuZ2VkIGhhc2ggZnVuY3Rpb24sIG5vIGNhY2hpbmcgaGFzaCBjb2Rlcy4gIEgxCisgIC8vLyBhbmQgSDIgYXJlIHByb3ZpZGVkIGJ1dCBpZ25vcmVkLiAgV2UgZGVmaW5lIGEgZHVtbXkgaGFzaCBjb2RlIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0V4dHJhY3RLZXksCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoPgorICAgIHN0cnVjdCBfSGFzaF9jb2RlX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX0gxLCBfSDIsIF9IYXNoLCBmYWxzZT4KKyAgICA6IHByaXZhdGUgX0hhc2h0YWJsZV9lYm9faGVscGVyPDAsIF9FeHRyYWN0S2V5PiwKKyAgICAgIHByaXZhdGUgX0hhc2h0YWJsZV9lYm9faGVscGVyPDEsIF9IYXNoPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdXNpbmcgX19lYm9fZXh0cmFjdF9rZXkgPSBfSGFzaHRhYmxlX2Vib19oZWxwZXI8MCwgX0V4dHJhY3RLZXk+OworICAgICAgdXNpbmcgX19lYm9faGFzaCA9IF9IYXNodGFibGVfZWJvX2hlbHBlcjwxLCBfSGFzaD47CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIHZvaWQqIAkJCQkJX19oYXNoX2NvZGU7CisgICAgICB0eXBlZGVmIF9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4JCQlfX25vZGVfdHlwZTsKKworICAgICAgLy8gV2UgbmVlZCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgdGhlIGxvY2FsIGl0ZXJhdG9ycy4KKyAgICAgIF9IYXNoX2NvZGVfYmFzZSgpID0gZGVmYXVsdDsKKworICAgICAgX0hhc2hfY29kZV9iYXNlKGNvbnN0IF9FeHRyYWN0S2V5JiBfX2V4LCBjb25zdCBfSDEmLCBjb25zdCBfSDImLAorCQkgICAgICBjb25zdCBfSGFzaCYgX19oKQorICAgICAgOiBfX2Vib19leHRyYWN0X2tleShfX2V4KSwgX19lYm9faGFzaChfX2gpIHsgfQorCisgICAgICBfX2hhc2hfY29kZQorICAgICAgX01faGFzaF9jb2RlKGNvbnN0IF9LZXkmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGQ6OnNpemVfdAorICAgICAgX01fYnVja2V0X2luZGV4KGNvbnN0IF9LZXkmIF9faywgX19oYXNoX2NvZGUsIHN0ZDo6c2l6ZV90IF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3JhbmdlZF9oYXNoKCkoX19rLCBfX24pOyB9CisKKyAgICAgIHN0ZDo6c2l6ZV90CisgICAgICBfTV9idWNrZXRfaW5kZXgoY29uc3QgX19ub2RlX3R5cGUqIF9fcCwgc3RkOjpzaXplX3QgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcmFuZ2VkX2hhc2goKShfTV9leHRyYWN0KCkoX19wLT5fTV92KSwgX19uKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zdG9yZV9jb2RlKF9fbm9kZV90eXBlKiwgX19oYXNoX2NvZGUpIGNvbnN0CisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fY29weV9jb2RlKF9fbm9kZV90eXBlKiwgY29uc3QgX19ub2RlX3R5cGUqKSBjb25zdAorICAgICAgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N3YXAoX0hhc2hfY29kZV9iYXNlJiBfX3gpCisgICAgICB7CisJc3RkOjpzd2FwKF9NX2V4dHJhY3QoKSwgX194Ll9NX2V4dHJhY3QoKSk7CisJc3RkOjpzd2FwKF9NX3JhbmdlZF9oYXNoKCksIF9feC5fTV9yYW5nZWRfaGFzaCgpKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgX0V4dHJhY3RLZXkmCisgICAgICBfTV9leHRyYWN0KCkgY29uc3QgeyByZXR1cm4gX19lYm9fZXh0cmFjdF9rZXk6Ol9TX2NnZXQoKnRoaXMpOyB9CisKKyAgICAgIF9FeHRyYWN0S2V5JgorICAgICAgX01fZXh0cmFjdCgpIHsgcmV0dXJuIF9fZWJvX2V4dHJhY3Rfa2V5OjpfU19nZXQoKnRoaXMpOyB9CisKKyAgICAgIGNvbnN0IF9IYXNoJgorICAgICAgX01fcmFuZ2VkX2hhc2goKSBjb25zdCB7IHJldHVybiBfX2Vib19oYXNoOjpfU19jZ2V0KCp0aGlzKTsgfQorCisgICAgICBfSGFzaCYKKyAgICAgIF9NX3JhbmdlZF9oYXNoKCkgeyByZXR1cm4gX19lYm9faGFzaDo6X1NfZ2V0KCp0aGlzKTsgfQorICAgIH07CisKKyAgLy8gTm8gc3BlY2lhbGl6YXRpb24gZm9yIHJhbmdlZCBoYXNoIGZ1bmN0aW9uIHdoaWxlIGNhY2hpbmcgaGFzaCBjb2Rlcy4KKyAgLy8gVGhhdCBjb21iaW5hdGlvbiBpcyBtZWFuaW5nbGVzcywgYW5kIHRyeWluZyB0byBkbyBpdCBpcyBhbiBlcnJvci4KKworICAvLy8gU3BlY2lhbGl6YXRpb246IHJhbmdlZCBoYXNoIGZ1bmN0aW9uLCBjYWNoZSBoYXNoIGNvZGVzLiAgVGhpcworICAvLy8gY29tYmluYXRpb24gaXMgbWVhbmluZ2xlc3MsIHNvIHdlIHByb3ZpZGUgb25seSBhIGRlY2xhcmF0aW9uCisgIC8vLyBhbmQgbm8gZGVmaW5pdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2g+CisgICAgc3RydWN0IF9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfSDEsIF9IMiwgX0hhc2gsIHRydWU+OworCisgIC8vLyBTcGVjaWFsaXphdGlvbjogaGFzaCBmdW5jdGlvbiBhbmQgcmFuZ2UtaGFzaGluZyBmdW5jdGlvbiwgbm8KKyAgLy8vIGNhY2hpbmcgb2YgaGFzaCBjb2Rlcy4KKyAgLy8vIFByb3ZpZGVzIHR5cGVkZWYgYW5kIGFjY2Vzc29yIHJlcXVpcmVkIGJ5IEMrKyAxMS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMj4KKyAgICBzdHJ1Y3QgX0hhc2hfY29kZV9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9IMSwgX0gyLAorCQkJICAgX0RlZmF1bHRfcmFuZ2VkX2hhc2gsIGZhbHNlPgorICAgIDogcHJpdmF0ZSBfSGFzaHRhYmxlX2Vib19oZWxwZXI8MCwgX0V4dHJhY3RLZXk+LAorICAgICAgcHJpdmF0ZSBfSGFzaHRhYmxlX2Vib19oZWxwZXI8MSwgX0gxPiwKKyAgICAgIHByaXZhdGUgX0hhc2h0YWJsZV9lYm9faGVscGVyPDIsIF9IMj4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHVzaW5nIF9fZWJvX2V4dHJhY3Rfa2V5ID0gX0hhc2h0YWJsZV9lYm9faGVscGVyPDAsIF9FeHRyYWN0S2V5PjsKKyAgICAgIHVzaW5nIF9fZWJvX2gxID0gX0hhc2h0YWJsZV9lYm9faGVscGVyPDEsIF9IMT47CisgICAgICB1c2luZyBfX2Vib19oMiA9IF9IYXNodGFibGVfZWJvX2hlbHBlcjwyLCBfSDI+OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfSDEgCQkJCQloYXNoZXI7CisKKyAgICAgIGhhc2hlcgorICAgICAgaGFzaF9mdW5jdGlvbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oMSgpOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IAkJCQlfX2hhc2hfY29kZTsKKyAgICAgIHR5cGVkZWYgX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPgkJCV9fbm9kZV90eXBlOworCisgICAgICAvLyBXZSBuZWVkIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGZvciB0aGUgbG9jYWwgaXRlcmF0b3JzLgorICAgICAgX0hhc2hfY29kZV9iYXNlKCkgPSBkZWZhdWx0OworCisgICAgICBfSGFzaF9jb2RlX2Jhc2UoY29uc3QgX0V4dHJhY3RLZXkmIF9fZXgsCisJCSAgICAgIGNvbnN0IF9IMSYgX19oMSwgY29uc3QgX0gyJiBfX2gyLAorCQkgICAgICBjb25zdCBfRGVmYXVsdF9yYW5nZWRfaGFzaCYpCisgICAgICA6IF9fZWJvX2V4dHJhY3Rfa2V5KF9fZXgpLCBfX2Vib19oMShfX2gxKSwgX19lYm9faDIoX19oMikgeyB9CisKKyAgICAgIF9faGFzaF9jb2RlCisgICAgICBfTV9oYXNoX2NvZGUoY29uc3QgX0tleSYgX19rKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faDEoKShfX2spOyB9CisKKyAgICAgIHN0ZDo6c2l6ZV90CisgICAgICBfTV9idWNrZXRfaW5kZXgoY29uc3QgX0tleSYsIF9faGFzaF9jb2RlIF9fYywgc3RkOjpzaXplX3QgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faDIoKShfX2MsIF9fbik7IH0KKworICAgICAgc3RkOjpzaXplX3QKKyAgICAgIF9NX2J1Y2tldF9pbmRleChjb25zdCBfX25vZGVfdHlwZSogX19wLAorCQkgICAgICBzdGQ6OnNpemVfdCBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oMigpKF9NX2gxKCkoX01fZXh0cmFjdCgpKF9fcC0+X01fdikpLCBfX24pOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N0b3JlX2NvZGUoX19ub2RlX3R5cGUqLCBfX2hhc2hfY29kZSkgY29uc3QKKyAgICAgIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9jb3B5X2NvZGUoX19ub2RlX3R5cGUqLCBjb25zdCBfX25vZGVfdHlwZSopIGNvbnN0CisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fc3dhcChfSGFzaF9jb2RlX2Jhc2UmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fZXh0cmFjdCgpLCBfX3guX01fZXh0cmFjdCgpKTsKKwlzdGQ6OnN3YXAoX01faDEoKSwgX194Ll9NX2gxKCkpOworCXN0ZDo6c3dhcChfTV9oMigpLCBfX3guX01faDIoKSk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IF9FeHRyYWN0S2V5JgorICAgICAgX01fZXh0cmFjdCgpIGNvbnN0IHsgcmV0dXJuIF9fZWJvX2V4dHJhY3Rfa2V5OjpfU19jZ2V0KCp0aGlzKTsgfQorCisgICAgICBfRXh0cmFjdEtleSYKKyAgICAgIF9NX2V4dHJhY3QoKSB7IHJldHVybiBfX2Vib19leHRyYWN0X2tleTo6X1NfZ2V0KCp0aGlzKTsgfQorCisgICAgICBjb25zdCBfSDEmCisgICAgICBfTV9oMSgpIGNvbnN0IHsgcmV0dXJuIF9fZWJvX2gxOjpfU19jZ2V0KCp0aGlzKTsgfQorCisgICAgICBfSDEmCisgICAgICBfTV9oMSgpIHsgcmV0dXJuIF9fZWJvX2gxOjpfU19nZXQoKnRoaXMpOyB9CisKKyAgICAgIGNvbnN0IF9IMiYKKyAgICAgIF9NX2gyKCkgY29uc3QgeyByZXR1cm4gX19lYm9faDI6Ol9TX2NnZXQoKnRoaXMpOyB9CisKKyAgICAgIF9IMiYKKyAgICAgIF9NX2gyKCkgeyByZXR1cm4gX19lYm9faDI6Ol9TX2dldCgqdGhpcyk7IH0KKyAgICB9OworCisgIC8vLyBTcGVjaWFsaXphdGlvbjogaGFzaCBmdW5jdGlvbiBhbmQgcmFuZ2UtaGFzaGluZyBmdW5jdGlvbiwKKyAgLy8vIGNhY2hpbmcgaGFzaCBjb2Rlcy4gIEggaXMgcHJvdmlkZWQgYnV0IGlnbm9yZWQuICBQcm92aWRlcworICAvLy8gdHlwZWRlZiBhbmQgYWNjZXNzb3IgcmVxdWlyZWQgYnkgQysrIDExLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyPgorICAgIHN0cnVjdCBfSGFzaF9jb2RlX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX0gxLCBfSDIsCisJCQkgICBfRGVmYXVsdF9yYW5nZWRfaGFzaCwgdHJ1ZT4KKyAgICA6IHByaXZhdGUgX0hhc2h0YWJsZV9lYm9faGVscGVyPDAsIF9FeHRyYWN0S2V5PiwKKyAgICAgIHByaXZhdGUgX0hhc2h0YWJsZV9lYm9faGVscGVyPDEsIF9IMT4sCisgICAgICBwcml2YXRlIF9IYXNodGFibGVfZWJvX2hlbHBlcjwyLCBfSDI+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICAvLyBHaXZlcyBhY2Nlc3MgdG8gX01faDIoKSB0byB0aGUgbG9jYWwgaXRlcmF0b3IgaW1wbGVtZW50YXRpb24uCisgICAgICBmcmllbmQgc3RydWN0IF9Mb2NhbF9pdGVyYXRvcl9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9IMSwgX0gyLAorCQkJCQkgX0RlZmF1bHRfcmFuZ2VkX2hhc2gsIHRydWU+OworCisgICAgICB1c2luZyBfX2Vib19leHRyYWN0X2tleSA9IF9IYXNodGFibGVfZWJvX2hlbHBlcjwwLCBfRXh0cmFjdEtleT47CisgICAgICB1c2luZyBfX2Vib19oMSA9IF9IYXNodGFibGVfZWJvX2hlbHBlcjwxLCBfSDE+OworICAgICAgdXNpbmcgX19lYm9faDIgPSBfSGFzaHRhYmxlX2Vib19oZWxwZXI8MiwgX0gyPjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0gxIAkJCQkJaGFzaGVyOworCisgICAgICBoYXNoZXIKKyAgICAgIGhhc2hfZnVuY3Rpb24oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faDEoKTsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCAJCQkJX19oYXNoX2NvZGU7CisgICAgICB0eXBlZGVmIF9IYXNoX25vZGU8X1ZhbHVlLCB0cnVlPgkJCV9fbm9kZV90eXBlOworCisgICAgICBfSGFzaF9jb2RlX2Jhc2UoY29uc3QgX0V4dHJhY3RLZXkmIF9fZXgsCisJCSAgICAgIGNvbnN0IF9IMSYgX19oMSwgY29uc3QgX0gyJiBfX2gyLAorCQkgICAgICBjb25zdCBfRGVmYXVsdF9yYW5nZWRfaGFzaCYpCisgICAgICA6IF9fZWJvX2V4dHJhY3Rfa2V5KF9fZXgpLCBfX2Vib19oMShfX2gxKSwgX19lYm9faDIoX19oMikgeyB9CisKKyAgICAgIF9faGFzaF9jb2RlCisgICAgICBfTV9oYXNoX2NvZGUoY29uc3QgX0tleSYgX19rKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faDEoKShfX2spOyB9CisKKyAgICAgIHN0ZDo6c2l6ZV90CisgICAgICBfTV9idWNrZXRfaW5kZXgoY29uc3QgX0tleSYsIF9faGFzaF9jb2RlIF9fYywKKwkJICAgICAgc3RkOjpzaXplX3QgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faDIoKShfX2MsIF9fbik7IH0KKworICAgICAgc3RkOjpzaXplX3QKKyAgICAgIF9NX2J1Y2tldF9pbmRleChjb25zdCBfX25vZGVfdHlwZSogX19wLCBzdGQ6OnNpemVfdCBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oMigpKF9fcC0+X01faGFzaF9jb2RlLCBfX24pOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N0b3JlX2NvZGUoX19ub2RlX3R5cGUqIF9fbiwgX19oYXNoX2NvZGUgX19jKSBjb25zdAorICAgICAgeyBfX24tPl9NX2hhc2hfY29kZSA9IF9fYzsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9jb3B5X2NvZGUoX19ub2RlX3R5cGUqIF9fdG8sIGNvbnN0IF9fbm9kZV90eXBlKiBfX2Zyb20pIGNvbnN0CisgICAgICB7IF9fdG8tPl9NX2hhc2hfY29kZSA9IF9fZnJvbS0+X01faGFzaF9jb2RlOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N3YXAoX0hhc2hfY29kZV9iYXNlJiBfX3gpCisgICAgICB7CisJc3RkOjpzd2FwKF9NX2V4dHJhY3QoKSwgX194Ll9NX2V4dHJhY3QoKSk7CisJc3RkOjpzd2FwKF9NX2gxKCksIF9feC5fTV9oMSgpKTsKKwlzdGQ6OnN3YXAoX01faDIoKSwgX194Ll9NX2gyKCkpOworICAgICAgfQorCisgICAgICBjb25zdCBfRXh0cmFjdEtleSYKKyAgICAgIF9NX2V4dHJhY3QoKSBjb25zdCB7IHJldHVybiBfX2Vib19leHRyYWN0X2tleTo6X1NfY2dldCgqdGhpcyk7IH0KKworICAgICAgX0V4dHJhY3RLZXkmCisgICAgICBfTV9leHRyYWN0KCkgeyByZXR1cm4gX19lYm9fZXh0cmFjdF9rZXk6Ol9TX2dldCgqdGhpcyk7IH0KKworICAgICAgY29uc3QgX0gxJgorICAgICAgX01faDEoKSBjb25zdCB7IHJldHVybiBfX2Vib19oMTo6X1NfY2dldCgqdGhpcyk7IH0KKworICAgICAgX0gxJgorICAgICAgX01faDEoKSB7IHJldHVybiBfX2Vib19oMTo6X1NfZ2V0KCp0aGlzKTsgfQorCisgICAgICBjb25zdCBfSDImCisgICAgICBfTV9oMigpIGNvbnN0IHsgcmV0dXJuIF9fZWJvX2gyOjpfU19jZ2V0KCp0aGlzKTsgfQorCisgICAgICBfSDImCisgICAgICBfTV9oMigpIHsgcmV0dXJuIF9fZWJvX2gyOjpfU19nZXQoKnRoaXMpOyB9CisgICAgfTsKKworICAvKioKKyAgICogIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUgX0VxdWFsX2hlbHBlci4KKyAgICoKKyAgICovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LAorCSAgICB0eXBlbmFtZSBfRXF1YWwsIHR5cGVuYW1lIF9IYXNoQ29kZVR5cGUsCisJICAgIGJvb2wgX19jYWNoZV9oYXNoX2NvZGU+CisgIHN0cnVjdCBfRXF1YWxfaGVscGVyOworCisgIC8vLyBTcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwKKwkgICB0eXBlbmFtZSBfRXF1YWwsIHR5cGVuYW1lIF9IYXNoQ29kZVR5cGU+CisgIHN0cnVjdCBfRXF1YWxfaGVscGVyPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0hhc2hDb2RlVHlwZSwgdHJ1ZT4KKyAgeworICAgIHN0YXRpYyBib29sCisgICAgX1NfZXF1YWxzKGNvbnN0IF9FcXVhbCYgX19lcSwgY29uc3QgX0V4dHJhY3RLZXkmIF9fZXh0cmFjdCwKKwkgICAgICBjb25zdCBfS2V5JiBfX2ssIF9IYXNoQ29kZVR5cGUgX19jLCBfSGFzaF9ub2RlPF9WYWx1ZSwgdHJ1ZT4qIF9fbikKKyAgICB7IHJldHVybiBfX2MgPT0gX19uLT5fTV9oYXNoX2NvZGUgJiYgX19lcShfX2ssIF9fZXh0cmFjdChfX24tPl9NX3YpKTsgfQorICB9OworCisgIC8vLyBTcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwKKwkgICB0eXBlbmFtZSBfRXF1YWwsIHR5cGVuYW1lIF9IYXNoQ29kZVR5cGU+CisgIHN0cnVjdCBfRXF1YWxfaGVscGVyPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0hhc2hDb2RlVHlwZSwgZmFsc2U+CisgIHsKKyAgICBzdGF0aWMgYm9vbAorICAgIF9TX2VxdWFscyhjb25zdCBfRXF1YWwmIF9fZXEsIGNvbnN0IF9FeHRyYWN0S2V5JiBfX2V4dHJhY3QsCisJICAgICAgY29uc3QgX0tleSYgX19rLCBfSGFzaENvZGVUeXBlLCBfSGFzaF9ub2RlPF9WYWx1ZSwgZmFsc2U+KiBfX24pCisgICAgeyByZXR1cm4gX19lcShfX2ssIF9fZXh0cmFjdChfX24tPl9NX3YpKTsgfQorICB9OworCisKKyAgLy8vIFNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaD4KKyAgICBzdHJ1Y3QgX0xvY2FsX2l0ZXJhdG9yX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwKKwkJCQlfSDEsIF9IMiwgX0hhc2gsIHRydWU+CisgICAgOiBwcml2YXRlIF9IYXNodGFibGVfZWJvX2hlbHBlcjwwLCBfSDI+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlID0gX0hhc2h0YWJsZV9lYm9faGVscGVyPDAsIF9IMj47CisgICAgICB1c2luZyBfX2hhc2hfY29kZV9iYXNlID0gX0hhc2hfY29kZV9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksCisJCQkJCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIHRydWU+OworCisgICAgcHVibGljOgorICAgICAgX0xvY2FsX2l0ZXJhdG9yX2Jhc2UoKSA9IGRlZmF1bHQ7CisgICAgICBfTG9jYWxfaXRlcmF0b3JfYmFzZShjb25zdCBfX2hhc2hfY29kZV9iYXNlJiBfX2Jhc2UsCisJCQkgICBfSGFzaF9ub2RlPF9WYWx1ZSwgdHJ1ZT4qIF9fcCwKKwkJCSAgIHN0ZDo6c2l6ZV90IF9fYmt0LCBzdGQ6OnNpemVfdCBfX2JrdF9jb3VudCkKKyAgICAgIDogX19iYXNlX3R5cGUoX19iYXNlLl9NX2gyKCkpLAorCV9NX2N1cihfX3ApLCBfTV9idWNrZXQoX19ia3QpLCBfTV9idWNrZXRfY291bnQoX19ia3RfY291bnQpIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9pbmNyKCkKKyAgICAgIHsKKwlfTV9jdXIgPSBfTV9jdXItPl9NX25leHQoKTsKKwlpZiAoX01fY3VyKQorCSAgeworCSAgICBzdGQ6OnNpemVfdCBfX2JrdAorCSAgICAgID0gX19iYXNlX3R5cGU6Ol9TX2dldCgqdGhpcykoX01fY3VyLT5fTV9oYXNoX2NvZGUsCisJCQkJCSAgIF9NX2J1Y2tldF9jb3VudCk7CisJICAgIGlmIChfX2JrdCAhPSBfTV9idWNrZXQpCisJICAgICAgX01fY3VyID0gbnVsbHB0cjsKKwkgIH0KKyAgICAgIH0KKworICAgICAgX0hhc2hfbm9kZTxfVmFsdWUsIHRydWU+KiAgX01fY3VyOworICAgICAgc3RkOjpzaXplX3QgX01fYnVja2V0OworICAgICAgc3RkOjpzaXplX3QgX01fYnVja2V0X2NvdW50OworICAgIH07CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaD4KKyAgICBzdHJ1Y3QgX0xvY2FsX2l0ZXJhdG9yX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwKKwkJCQlfSDEsIF9IMiwgX0hhc2gsIGZhbHNlPgorICAgIDogcHJpdmF0ZSBfSGFzaF9jb2RlX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwKKwkJCSAgICAgIF9IMSwgX0gyLCBfSGFzaCwgZmFsc2U+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHVzaW5nIF9faGFzaF9jb2RlX2Jhc2UgPSBfSGFzaF9jb2RlX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwKKwkJCQkJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgZmFsc2U+OworCisgICAgcHVibGljOgorICAgICAgX0xvY2FsX2l0ZXJhdG9yX2Jhc2UoKSA9IGRlZmF1bHQ7CisgICAgICBfTG9jYWxfaXRlcmF0b3JfYmFzZShjb25zdCBfX2hhc2hfY29kZV9iYXNlJiBfX2Jhc2UsCisJCQkgICBfSGFzaF9ub2RlPF9WYWx1ZSwgZmFsc2U+KiBfX3AsCisJCQkgICBzdGQ6OnNpemVfdCBfX2JrdCwgc3RkOjpzaXplX3QgX19ia3RfY291bnQpCisJOiBfX2hhc2hfY29kZV9iYXNlKF9fYmFzZSksCisJICBfTV9jdXIoX19wKSwgX01fYnVja2V0KF9fYmt0KSwgX01fYnVja2V0X2NvdW50KF9fYmt0X2NvdW50KSB7IH0KKworICAgICAgdm9pZAorICAgICAgX01faW5jcigpCisgICAgICB7CisJX01fY3VyID0gX01fY3VyLT5fTV9uZXh0KCk7CisJaWYgKF9NX2N1cikKKwkgIHsKKwkgICAgc3RkOjpzaXplX3QgX19ia3QgPSB0aGlzLT5fTV9idWNrZXRfaW5kZXgoX01fY3VyLCBfTV9idWNrZXRfY291bnQpOworCSAgICBpZiAoX19ia3QgIT0gX01fYnVja2V0KQorCSAgICAgIF9NX2N1ciA9IG51bGxwdHI7CisJICB9CisgICAgICB9CisKKyAgICAgIF9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4qICBfTV9jdXI7CisgICAgICBzdGQ6OnNpemVfdCBfTV9idWNrZXQ7CisgICAgICBzdGQ6OnNpemVfdCBfTV9idWNrZXRfY291bnQ7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgYm9vbCBfX2NhY2hlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfTG9jYWxfaXRlcmF0b3JfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LAorCQkJCQkgIF9IMSwgX0gyLCBfSGFzaCwgX19jYWNoZT4mIF9feCwKKwkgICAgICAgY29uc3QgX0xvY2FsX2l0ZXJhdG9yX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwKKwkJCQkJICBfSDEsIF9IMiwgX0hhc2gsIF9fY2FjaGU+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2N1ciA9PSBfX3kuX01fY3VyOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIGJvb2wgX19jYWNoZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX0xvY2FsX2l0ZXJhdG9yX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwKKwkJCQkJICBfSDEsIF9IMiwgX0hhc2gsIF9fY2FjaGU+JiBfX3gsCisJICAgICAgIGNvbnN0IF9Mb2NhbF9pdGVyYXRvcl9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksCisJCQkJCSAgX0gxLCBfSDIsIF9IYXNoLCBfX2NhY2hlPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9jdXIgIT0gX195Ll9NX2N1cjsgfQorCisgIC8vLyBsb2NhbCBpdGVyYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsCisJICAgYm9vbCBfX2NvbnN0YW50X2l0ZXJhdG9ycywgYm9vbCBfX2NhY2hlPgorICAgIHN0cnVjdCBfTG9jYWxfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBfTG9jYWxfaXRlcmF0b3JfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LAorCQkJCSAgX0gxLCBfSDIsIF9IYXNoLCBfX2NhY2hlPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdXNpbmcgX19iYXNlX3R5cGUgPSBfTG9jYWxfaXRlcmF0b3JfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LAorCQkJCQkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfX2NhY2hlPjsKKyAgICAgIHVzaW5nIF9faGFzaF9jb2RlX2Jhc2UgPSB0eXBlbmFtZSBfX2Jhc2VfdHlwZTo6X19oYXNoX2NvZGVfYmFzZTsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9WYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxfX2NvbnN0YW50X2l0ZXJhdG9ycywKKwkJCQkJY29uc3QgX1ZhbHVlKiwgX1ZhbHVlKj46OnR5cGUKKwkJCQkJCSAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCQkJCQljb25zdCBfVmFsdWUmLCBfVmFsdWUmPjo6dHlwZQorCQkJCQkJICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgICAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIF9Mb2NhbF9pdGVyYXRvcigpID0gZGVmYXVsdDsKKworICAgICAgX0xvY2FsX2l0ZXJhdG9yKGNvbnN0IF9faGFzaF9jb2RlX2Jhc2UmIF9fYmFzZSwKKwkJICAgICAgX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiBfX3AsCisJCSAgICAgIHN0ZDo6c2l6ZV90IF9fYmt0LCBzdGQ6OnNpemVfdCBfX2JrdF9jb3VudCkKKwk6IF9fYmFzZV90eXBlKF9fYmFzZSwgX19wLCBfX2JrdCwgX19ia3RfY291bnQpCisgICAgICB7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fY3VyLT5fTV92OyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZih0aGlzLT5fTV9jdXItPl9NX3YpOyB9CisKKyAgICAgIF9Mb2NhbF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9Mb2NhbF9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisJX0xvY2FsX2l0ZXJhdG9yIF9fdG1wKCp0aGlzKTsKKwl0aGlzLT5fTV9pbmNyKCk7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorICAgIH07CisKKyAgLy8vIGxvY2FsIGNvbnN0X2l0ZXJhdG9ycworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICBib29sIF9fY29uc3RhbnRfaXRlcmF0b3JzLCBib29sIF9fY2FjaGU+CisgICAgc3RydWN0IF9Mb2NhbF9jb25zdF9pdGVyYXRvcgorICAgIDogcHVibGljIF9Mb2NhbF9pdGVyYXRvcl9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksCisJCQkJICBfSDEsIF9IMiwgX0hhc2gsIF9fY2FjaGU+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZSA9IF9Mb2NhbF9pdGVyYXRvcl9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksCisJCQkJCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9fY2FjaGU+OworICAgICAgdXNpbmcgX19oYXNoX2NvZGVfYmFzZSA9IHR5cGVuYW1lIF9fYmFzZV90eXBlOjpfX2hhc2hfY29kZV9iYXNlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIGNvbnN0IF9WYWx1ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1ZhbHVlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgICBfTG9jYWxfY29uc3RfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICAgIF9Mb2NhbF9jb25zdF9pdGVyYXRvcihjb25zdCBfX2hhc2hfY29kZV9iYXNlJiBfX2Jhc2UsCisJCQkgICAgX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiBfX3AsCisJCQkgICAgc3RkOjpzaXplX3QgX19ia3QsIHN0ZDo6c2l6ZV90IF9fYmt0X2NvdW50KQorCTogX19iYXNlX3R5cGUoX19iYXNlLCBfX3AsIF9fYmt0LCBfX2JrdF9jb3VudCkKKyAgICAgIHsgfQorCisgICAgICBfTG9jYWxfY29uc3RfaXRlcmF0b3IoY29uc3QgX0xvY2FsX2l0ZXJhdG9yPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksCisJCQkJCQkgIF9IMSwgX0gyLCBfSGFzaCwKKwkJCQkJCSAgX19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkJCQkgIF9fY2FjaGU+JiBfX3gpCisJOiBfX2Jhc2VfdHlwZShfX3gpCisgICAgICB7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fY3VyLT5fTV92OyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZih0aGlzLT5fTV9jdXItPl9NX3YpOyB9CisKKyAgICAgIF9Mb2NhbF9jb25zdF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9Mb2NhbF9jb25zdF9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisJX0xvY2FsX2NvbnN0X2l0ZXJhdG9yIF9fdG1wKCp0aGlzKTsKKwl0aGlzLT5fTV9pbmNyKCk7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorICAgIH07CisKKyAgLyoqCisgICAqICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIF9IYXNodGFibGVfYmFzZS4KKyAgICoKKyAgICogIEhlbHBlciBjbGFzcyBhZGRpbmcgbWFuYWdlbWVudCBvZiBfRXF1YWwgZnVuY3RvciB0bworICAgKiAgX0hhc2hfY29kZV9iYXNlIHR5cGUuCisgICAqCisgICAqICBCYXNlIGNsYXNzIHRlbXBsYXRlcyBhcmU6CisgICAqICAgIC0gX19kZXRhaWw6Ol9IYXNoX2NvZGVfYmFzZQorICAgKiAgICAtIF9fZGV0YWlsOjpfSGFzaHRhYmxlX2Vib19oZWxwZXIKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgc3RydWN0IF9IYXNodGFibGVfYmFzZQorICA6IHB1YmxpYyBfSGFzaF9jb2RlX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX0gxLCBfSDIsIF9IYXNoLAorCQkJICAgX1RyYWl0czo6X19oYXNoX2NhY2hlZDo6dmFsdWU+LAorICAgIHByaXZhdGUgX0hhc2h0YWJsZV9lYm9faGVscGVyPDAsIF9FcXVhbD4KKyAgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGU7CisgICAgdHlwZWRlZiBfVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9FcXVhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfZXF1YWw7CisgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKworICAgIHVzaW5nIF9fdHJhaXRzX3R5cGUgPSBfVHJhaXRzOworICAgIHVzaW5nIF9faGFzaF9jYWNoZWQgPSB0eXBlbmFtZSBfX3RyYWl0c190eXBlOjpfX2hhc2hfY2FjaGVkOworICAgIHVzaW5nIF9fY29uc3RhbnRfaXRlcmF0b3JzID0gdHlwZW5hbWUgX190cmFpdHNfdHlwZTo6X19jb25zdGFudF9pdGVyYXRvcnM7CisgICAgdXNpbmcgX191bmlxdWVfa2V5cyA9IHR5cGVuYW1lIF9fdHJhaXRzX3R5cGU6Ol9fdW5pcXVlX2tleXM7CisKKyAgICB1c2luZyBfX2hhc2hfY29kZV9iYXNlID0gX0hhc2hfY29kZV9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksCisJCQkJCSAgICAgX0gxLCBfSDIsIF9IYXNoLAorCQkJCQkgICAgIF9faGFzaF9jYWNoZWQ6OnZhbHVlPjsKKworICAgIHVzaW5nIF9faGFzaF9jb2RlID0gdHlwZW5hbWUgX19oYXNoX2NvZGVfYmFzZTo6X19oYXNoX2NvZGU7CisgICAgdXNpbmcgX19ub2RlX3R5cGUgPSB0eXBlbmFtZSBfX2hhc2hfY29kZV9iYXNlOjpfX25vZGVfdHlwZTsKKworICAgIHVzaW5nIGl0ZXJhdG9yID0gX19kZXRhaWw6Ol9Ob2RlX2l0ZXJhdG9yPHZhbHVlX3R5cGUsCisJCQkJCSAgICAgIF9fY29uc3RhbnRfaXRlcmF0b3JzOjp2YWx1ZSwKKwkJCQkJICAgICAgX19oYXNoX2NhY2hlZDo6dmFsdWU+OworCisgICAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBfX2RldGFpbDo6X05vZGVfY29uc3RfaXRlcmF0b3I8dmFsdWVfdHlwZSwKKwkJCQkJCSAgIF9fY29uc3RhbnRfaXRlcmF0b3JzOjp2YWx1ZSwKKwkJCQkJCSAgIF9faGFzaF9jYWNoZWQ6OnZhbHVlPjsKKworICAgIHVzaW5nIGxvY2FsX2l0ZXJhdG9yID0gX19kZXRhaWw6Ol9Mb2NhbF9pdGVyYXRvcjxrZXlfdHlwZSwgdmFsdWVfdHlwZSwKKwkJCQkJCSAgX0V4dHJhY3RLZXksIF9IMSwgX0gyLCBfSGFzaCwKKwkJCQkJCSAgX19jb25zdGFudF9pdGVyYXRvcnM6OnZhbHVlLAorCQkJCQkJICAgICBfX2hhc2hfY2FjaGVkOjp2YWx1ZT47CisKKyAgICB1c2luZyBjb25zdF9sb2NhbF9pdGVyYXRvciA9IF9fZGV0YWlsOjpfTG9jYWxfY29uc3RfaXRlcmF0b3I8a2V5X3R5cGUsCisJCQkJCQkJCSB2YWx1ZV90eXBlLAorCQkJCQlfRXh0cmFjdEtleSwgX0gxLCBfSDIsIF9IYXNoLAorCQkJCQlfX2NvbnN0YW50X2l0ZXJhdG9yczo6dmFsdWUsCisJCQkJCV9faGFzaF9jYWNoZWQ6OnZhbHVlPjsKKworICAgIHVzaW5nIF9faXJldHVybl90eXBlID0gdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxfX3VuaXF1ZV9rZXlzOjp2YWx1ZSwKKwkJCQkJCSAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiwKKwkJCQkJCSAgICAgaXRlcmF0b3I+Ojp0eXBlOworCisgICAgdXNpbmcgX19pY29udl90eXBlID0gdHlwZW5hbWUgIHN0ZDo6Y29uZGl0aW9uYWw8X191bmlxdWVfa2V5czo6dmFsdWUsCisJCQkJCQkgICAgX1NlbGVjdDFzdCwgX0lkZW50aXR5CisJCQkJCQkgICAgPjo6dHlwZTsKKyAgcHJpdmF0ZToKKyAgICB1c2luZyBfRXF1YWxFQk8gPSBfSGFzaHRhYmxlX2Vib19oZWxwZXI8MCwgX0VxdWFsPjsKKyAgICB1c2luZyBfRXF1YWxIZWxwZXIgPSAgX0VxdWFsX2hlbHBlcjxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQkJCV9faGFzaF9jb2RlLCBfX2hhc2hfY2FjaGVkOjp2YWx1ZT47CisKKyAgcHJvdGVjdGVkOgorICAgIHVzaW5nIF9fbm9kZV9iYXNlID0gX19kZXRhaWw6Ol9IYXNoX25vZGVfYmFzZTsKKyAgICB1c2luZyBfX2J1Y2tldF90eXBlID0gX19ub2RlX2Jhc2UqOworCisgICAgX0hhc2h0YWJsZV9iYXNlKGNvbnN0IF9FeHRyYWN0S2V5JiBfX2V4LCBjb25zdCBfSDEmIF9faDEsIGNvbnN0IF9IMiYgX19oMiwKKwkJICAgIGNvbnN0IF9IYXNoJiBfX2hhc2gsIGNvbnN0IF9FcXVhbCYgX19lcSkKKyAgICA6IF9faGFzaF9jb2RlX2Jhc2UoX19leCwgX19oMSwgX19oMiwgX19oYXNoKSwgX0VxdWFsRUJPKF9fZXEpCisgICAgeyB9CisKKyAgICBib29sCisgICAgX01fZXF1YWxzKGNvbnN0IF9LZXkmIF9faywgX19oYXNoX2NvZGUgX19jLCBfX25vZGVfdHlwZSogX19uKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBfRXF1YWxIZWxwZXI6Ol9TX2VxdWFscyhfTV9lcSgpLCB0aGlzLT5fTV9leHRyYWN0KCksCisJCQkJICAgICBfX2ssIF9fYywgX19uKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX01fc3dhcChfSGFzaHRhYmxlX2Jhc2UmIF9feCkKKyAgICB7CisgICAgICBfX2hhc2hfY29kZV9iYXNlOjpfTV9zd2FwKF9feCk7CisgICAgICBzdGQ6OnN3YXAoX01fZXEoKSwgX194Ll9NX2VxKCkpOworICAgIH0KKworICAgIGNvbnN0IF9FcXVhbCYKKyAgICBfTV9lcSgpIGNvbnN0IHsgcmV0dXJuIF9FcXVhbEVCTzo6X1NfY2dldCgqdGhpcyk7IH0KKworICAgIF9FcXVhbCYKKyAgICBfTV9lcSgpIHsgcmV0dXJuIF9FcXVhbEVCTzo6X1NfZ2V0KCp0aGlzKTsgfQorICB9OworCisgIC8qKgorICAgKiAgc3RydWN0IF9FcXVhbGl0eV9iYXNlLgorICAgKgorICAgKiAgQ29tbW9uIHR5cGVzIGFuZCBmdW5jdGlvbnMgZm9yIGNsYXNzIF9FcXVhbGl0eS4KKyAgICovCisgIHN0cnVjdCBfRXF1YWxpdHlfYmFzZQorICB7CisgIHByb3RlY3RlZDoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVWl0ZXJhdG9yPgorICAgICAgc3RhdGljIGJvb2wKKyAgICAgIF9TX2lzX3Blcm11dGF0aW9uKF9VaXRlcmF0b3IsIF9VaXRlcmF0b3IsIF9VaXRlcmF0b3IpOworICB9OworCisgIC8vIFNlZSBzdGQ6OmlzX3Blcm11dGF0aW9uIGluIE4zMDY4LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVWl0ZXJhdG9yPgorICAgIGJvb2wKKyAgICBfRXF1YWxpdHlfYmFzZTo6CisgICAgX1NfaXNfcGVybXV0YXRpb24oX1VpdGVyYXRvciBfX2ZpcnN0MSwgX1VpdGVyYXRvciBfX2xhc3QxLAorCQkgICAgICBfVWl0ZXJhdG9yIF9fZmlyc3QyKQorICAgIHsKKyAgICAgIGZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCArK19fZmlyc3QyKQorCWlmICghKCpfX2ZpcnN0MSA9PSAqX19maXJzdDIpKQorCSAgYnJlYWs7CisKKyAgICAgIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxKQorCXJldHVybiB0cnVlOworCisgICAgICBfVWl0ZXJhdG9yIF9fbGFzdDIgPSBfX2ZpcnN0MjsKKyAgICAgIHN0ZDo6YWR2YW5jZShfX2xhc3QyLCBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QxLCBfX2xhc3QxKSk7CisKKyAgICAgIGZvciAoX1VpdGVyYXRvciBfX2l0MSA9IF9fZmlyc3QxOyBfX2l0MSAhPSBfX2xhc3QxOyArK19faXQxKQorCXsKKwkgIF9VaXRlcmF0b3IgX190bXAgPSAgX19maXJzdDE7CisJICB3aGlsZSAoX190bXAgIT0gX19pdDEgJiYgIWJvb2woKl9fdG1wID09ICpfX2l0MSkpCisJICAgICsrX190bXA7CisKKwkgIC8vIFdlJ3ZlIHNlZW4gdGhpcyBvbmUgYmVmb3JlLgorCSAgaWYgKF9fdG1wICE9IF9faXQxKQorCSAgICBjb250aW51ZTsKKworCSAgc3RkOjpwdHJkaWZmX3QgX19uMiA9IDA7CisJICBmb3IgKF9fdG1wID0gX19maXJzdDI7IF9fdG1wICE9IF9fbGFzdDI7ICsrX190bXApCisJICAgIGlmICgqX190bXAgPT0gKl9faXQxKQorCSAgICAgICsrX19uMjsKKworCSAgaWYgKCFfX24yKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIHN0ZDo6cHRyZGlmZl90IF9fbjEgPSAwOworCSAgZm9yIChfX3RtcCA9IF9faXQxOyBfX3RtcCAhPSBfX2xhc3QxOyArK19fdG1wKQorCSAgICBpZiAoKl9fdG1wID09ICpfX2l0MSkKKwkgICAgICArK19fbjE7CisKKwkgIGlmIChfX24xICE9IF9fbjIpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgLyoqCisgICAqICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlICBfRXF1YWxpdHkuCisgICAqCisgICAqICBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcgZXF1YWxpdHkgY29tcGFyaXNvbiBmb3IgdW5vcmRlcmVkCisgICAqICBjb250YWluZXJzLCBwZXIgTjMwNjgsIGJ5IEpvaG4gTGFrb3MgYW5kIFBhYmxvIEhhbHBlcm4uCisgICAqICBBbGdvcml0aG1pY2FsbHksIHdlIGZvbGxvdyBjbG9zZWx5IHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb25zCisgICAqICB0aGVyZWluLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwgdHlwZW5hbWUgX1RyYWl0cywKKwkgICBib29sIF9VbmlxdWVfa2V5cyA9IF9UcmFpdHM6Ol9fdW5pcXVlX2tleXM6OnZhbHVlPgorICAgIHN0cnVjdCBfRXF1YWxpdHk7CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0cnVjdCBfRXF1YWxpdHk8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCSAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzLCB0cnVlPgorICAgIHsKKyAgICAgIHVzaW5nIF9faGFzaHRhYmxlID0gX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCQkgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0cz47CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2VxdWFsKGNvbnN0IF9faGFzaHRhYmxlJikgY29uc3Q7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJvb2wKKyAgICBfRXF1YWxpdHk8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzLCB0cnVlPjo6CisgICAgX01fZXF1YWwoY29uc3QgX19oYXNodGFibGUmIF9fb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgY29uc3QgX19oYXNodGFibGUqIF9fdGhpcyA9IHN0YXRpY19jYXN0PGNvbnN0IF9faGFzaHRhYmxlKj4odGhpcyk7CisKKyAgICAgIGlmIChfX3RoaXMtPnNpemUoKSAhPSBfX290aGVyLnNpemUoKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGZvciAoYXV0byBfX2l0eCA9IF9fdGhpcy0+YmVnaW4oKTsgX19pdHggIT0gX190aGlzLT5lbmQoKTsgKytfX2l0eCkKKwl7CisJICBjb25zdCBhdXRvIF9faXR5ID0gX19vdGhlci5maW5kKF9FeHRyYWN0S2V5KCkoKl9faXR4KSk7CisJICBpZiAoX19pdHkgPT0gX19vdGhlci5lbmQoKSB8fCAhYm9vbCgqX19pdHkgPT0gKl9faXR4KSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvLy8gU3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RydWN0IF9FcXVhbGl0eTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHMsIGZhbHNlPgorICAgIDogcHVibGljIF9FcXVhbGl0eV9iYXNlCisgICAgeworICAgICAgdXNpbmcgX19oYXNodGFibGUgPSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJCSAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjsKKworICAgICAgYm9vbAorICAgICAgX01fZXF1YWwoY29uc3QgX19oYXNodGFibGUmKSBjb25zdDsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYm9vbAorICAgIF9FcXVhbGl0eTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHMsIGZhbHNlPjo6CisgICAgX01fZXF1YWwoY29uc3QgX19oYXNodGFibGUmIF9fb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgY29uc3QgX19oYXNodGFibGUqIF9fdGhpcyA9IHN0YXRpY19jYXN0PGNvbnN0IF9faGFzaHRhYmxlKj4odGhpcyk7CisKKyAgICAgIGlmIChfX3RoaXMtPnNpemUoKSAhPSBfX290aGVyLnNpemUoKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGZvciAoYXV0byBfX2l0eCA9IF9fdGhpcy0+YmVnaW4oKTsgX19pdHggIT0gX190aGlzLT5lbmQoKTspCisJeworCSAgY29uc3QgYXV0byBfX3hyYW5nZSA9IF9fdGhpcy0+ZXF1YWxfcmFuZ2UoX0V4dHJhY3RLZXkoKSgqX19pdHgpKTsKKwkgIGNvbnN0IGF1dG8gX195cmFuZ2UgPSBfX290aGVyLmVxdWFsX3JhbmdlKF9FeHRyYWN0S2V5KCkoKl9faXR4KSk7CisKKwkgIGlmIChzdGQ6OmRpc3RhbmNlKF9feHJhbmdlLmZpcnN0LCBfX3hyYW5nZS5zZWNvbmQpCisJICAgICAgIT0gc3RkOjpkaXN0YW5jZShfX3lyYW5nZS5maXJzdCwgX195cmFuZ2Uuc2Vjb25kKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICBpZiAoIV9TX2lzX3Blcm11dGF0aW9uKF9feHJhbmdlLmZpcnN0LCBfX3hyYW5nZS5zZWNvbmQsCisJCQkJIF9feXJhbmdlLmZpcnN0KSkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICBfX2l0eCA9IF9feHJhbmdlLnNlY29uZDsKKwl9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgLyoqCisgICAqIFRoaXMgdHlwZSBpcyB0byBjb21iaW5lIGEgX0hhc2hfbm9kZV9iYXNlIGluc3RhbmNlIHdpdGggYW4gYWxsb2NhdG9yCisgICAqIGluc3RhbmNlIHRocm91Z2ggaW5oZXJpdGFuY2UgdG8gYmVuZWZpdCBmcm9tIEVCTyB3aGVuIHBvc3NpYmxlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX05vZGVBbGxvYz4KKyAgICBzdHJ1Y3QgX0JlZm9yZV9iZWdpbiA6IHB1YmxpYyBfTm9kZUFsbG9jCisgICAgeworICAgICAgX0hhc2hfbm9kZV9iYXNlIF9NX25vZGU7CisKKyAgICAgIF9CZWZvcmVfYmVnaW4oY29uc3QgX0JlZm9yZV9iZWdpbiYpID0gZGVmYXVsdDsKKyAgICAgIF9CZWZvcmVfYmVnaW4oX0JlZm9yZV9iZWdpbiYmKSA9IGRlZmF1bHQ7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKwlfQmVmb3JlX2JlZ2luKF9BbGxvYyYmIF9fYSkKKwkgIDogX05vZGVBbGxvYyhzdGQ6OmZvcndhcmQ8X0FsbG9jPihfX2EpKQorCXsgfQorICAgIH07CisKKyAvL0B9IGhhc2h0YWJsZS1kZXRhaWwKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgX19kZXRhaWwKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gX0hBU0hUQUJMRV9QT0xJQ1lfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2luZGlyZWN0X2FycmF5LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvaW5kaXJlY3RfYXJyYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmI4NDU5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2luZGlyZWN0X2FycmF5LmgKQEAgLTAsMCArMSwyMTIgQEAKKy8vIFRoZSB0ZW1wbGF0ZSBhbmQgaW5saW5lcyBmb3IgdGhlIC0qLSBDKysgLSotIGluZGlyZWN0X2FycmF5IGNsYXNzLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9pbmRpcmVjdF9hcnJheS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dmFsYXJyYXl9CisgKi8KKworLy8gV3JpdHRlbiBieSBHYWJyaWVsIERvcyBSZWlzIDxHYWJyaWVsLkRvcy1SZWlzQERQVE1hdGhzLkVOUy1DYWNoYW4uRnI+CisKKyNpZm5kZWYgX0lORElSRUNUX0FSUkFZX0gKKyNkZWZpbmUgX0lORElSRUNUX0FSUkFZX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgbnVtZXJpY19hcnJheXMKKyAgICogQHsKKyAgICovCisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJlZmVyZW5jZSB0byBhcmJpdHJhcnkgc3Vic2V0IG9mIGFuIGFycmF5LgorICAgKgorICAgKiAgQW4gaW5kaXJlY3RfYXJyYXkgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGFjdHVhbCBlbGVtZW50cyBvZiBhbiBhcnJheQorICAgKiAgc3BlY2lmaWVkIGJ5IGFuIG9yZGVyZWQgYXJyYXkgb2YgaW5kaWNlcy4gIFRoZSB3YXkgdG8gZ2V0IGFuCisgICAqICBpbmRpcmVjdF9hcnJheSBpcyB0byBjYWxsIG9wZXJhdG9yW10odmFsYXJyYXk8c2l6ZV90Pikgb24gYSB2YWxhcnJheS4KKyAgICogIFRoZSByZXR1cm5lZCBpbmRpcmVjdF9hcnJheSB0aGVuIHBlcm1pdHMgY2Fycnlpbmcgb3BlcmF0aW9ucyBvdXQgb24gdGhlCisgICAqICByZWZlcmVuY2VkIHN1YnNldCBvZiBlbGVtZW50cyBpbiB0aGUgb3JpZ2luYWwgdmFsYXJyYXkuCisgICAqCisgICAqICBGb3IgZXhhbXBsZSwgaWYgYW4gaW5kaXJlY3RfYXJyYXkgaXMgb2J0YWluZWQgdXNpbmcgdGhlIGFycmF5ICg0LDIsMCkgYXMKKyAgICogIGFuIGFyZ3VtZW50LCBhbmQgdGhlbiBhc3NpZ25lZCB0byBhbiBhcnJheSBjb250YWluaW5nICgxLDIsMyksIHRoZW4gdGhlCisgICAqICB1bmRlcmx5aW5nIGFycmF5IHdpbGwgaGF2ZSBhcnJheVswXT09MywgYXJyYXlbMl09PTIsIGFuZCBhcnJheVs0XT09MS4KKyAgICoKKyAgICogIEBwYXJhbSAgVHAgIEVsZW1lbnQgdHlwZS4KKyAgICovCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgY2xhc3MgaW5kaXJlY3RfYXJyYXkKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjUzLiB2YWxhcnJheSBoZWxwZXIgZnVuY3Rpb25zIGFyZSBhbG1vc3QgZW50aXJlbHkgdXNlbGVzcworCisgICAgICAvLy8gIENvcHkgY29uc3RydWN0b3IuICBCb3RoIHNsaWNlcyByZWZlciB0byB0aGUgc2FtZSB1bmRlcmx5aW5nIGFycmF5LgorICAgICAgaW5kaXJlY3RfYXJyYXkoY29uc3QgaW5kaXJlY3RfYXJyYXkmKTsKKworICAgICAgLy8vICBBc3NpZ25tZW50IG9wZXJhdG9yLiAgQXNzaWducyBlbGVtZW50cyB0byBjb3JyZXNwb25kaW5nIGVsZW1lbnRzCisgICAgICAvLy8gIG9mIEBhIGEuCisgICAgICBpbmRpcmVjdF9hcnJheSYgb3BlcmF0b3I9KGNvbnN0IGluZGlyZWN0X2FycmF5Jik7CisKKyAgICAgIC8vLyAgQXNzaWduIHNsaWNlIGVsZW1lbnRzIHRvIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTXVsdGlwbHkgc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcio9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgRGl2aWRlIHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3IvPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIE1vZHVsbyBzbGljZSBlbGVtZW50cyBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yJT0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBBZGQgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2IHRvIHNsaWNlIGVsZW1lbnRzLgorICAgICAgdm9pZCBvcGVyYXRvcis9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgU3VidHJhY3QgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2IGZyb20gc2xpY2UgZWxlbWVudHMuCisgICAgICB2b2lkIG9wZXJhdG9yLT0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBMb2dpY2FsIHhvciBzbGljZSBlbGVtZW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3JePShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIExvZ2ljYWwgYW5kIHNsaWNlIGVsZW1lbnRzIHdpdGggY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvciY9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTG9naWNhbCBvciBzbGljZSBlbGVtZW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3J8PShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIExlZnQgc2hpZnQgc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcjw8PShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIFJpZ2h0IHNoaWZ0IHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3I+Pj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBBc3NpZ24gYWxsIHNsaWNlIGVsZW1lbnRzIHRvIEBhIHQuCisgICAgICB2b2lkIG9wZXJhdG9yPSAoY29uc3QgX1RwJikgY29uc3Q7CisgICAgICAvLyAgICB+aW5kaXJlY3RfYXJyYXkoKTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICB2b2lkIG9wZXJhdG9yKj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgIHZvaWQgb3BlcmF0b3IvPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgdm9pZCBvcGVyYXRvciU9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICB2b2lkIG9wZXJhdG9yKz0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgIHZvaWQgb3BlcmF0b3ItPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgdm9pZCBvcGVyYXRvcl49KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICB2b2lkIG9wZXJhdG9yJj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgIHZvaWQgb3BlcmF0b3J8PShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgdm9pZCBvcGVyYXRvcjw8PShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgdm9pZCBvcGVyYXRvcj4+PShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgLy8vICBDb3B5IGNvbnN0cnVjdG9yLiAgQm90aCBzbGljZXMgcmVmZXIgdG8gdGhlIHNhbWUgdW5kZXJseWluZyBhcnJheS4KKyAgICAgIGluZGlyZWN0X2FycmF5KF9BcnJheTxfVHA+LCBzaXplX3QsIF9BcnJheTxzaXplX3Q+KTsKKworICAgICAgZnJpZW5kIGNsYXNzIHZhbGFycmF5PF9UcD47CisgICAgICBmcmllbmQgY2xhc3MgZ3NsaWNlX2FycmF5PF9UcD47CisKKyAgICAgIGNvbnN0IHNpemVfdAkgX01fc3o7CisgICAgICBjb25zdCBfQXJyYXk8c2l6ZV90PiBfTV9pbmRleDsKKyAgICAgIGNvbnN0IF9BcnJheTxfVHA+CSBfTV9hcnJheTsKKworICAgICAgLy8gbm90IGltcGxlbWVudGVkCisgICAgICBpbmRpcmVjdF9hcnJheSgpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIGluZGlyZWN0X2FycmF5PF9UcD46OmluZGlyZWN0X2FycmF5KGNvbnN0IGluZGlyZWN0X2FycmF5PF9UcD4mIF9fYSkKKyAgICA6IF9NX3N6KF9fYS5fTV9zeiksIF9NX2luZGV4KF9fYS5fTV9pbmRleCksIF9NX2FycmF5KF9fYS5fTV9hcnJheSkge30KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lCisgICAgaW5kaXJlY3RfYXJyYXk8X1RwPjo6aW5kaXJlY3RfYXJyYXkoX0FycmF5PF9UcD4gX19hLCBzaXplX3QgX19zLAorCQkJCQlfQXJyYXk8c2l6ZV90PiBfX2kpCisgICAgOiBfTV9zeihfX3MpLCBfTV9pbmRleChfX2kpLCBfTV9hcnJheShfX2EpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBpbmRpcmVjdF9hcnJheTxfVHA+JgorICAgIGluZGlyZWN0X2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBpbmRpcmVjdF9hcnJheTxfVHA+JiBfX2EpCisgICAgeworICAgICAgc3RkOjpfX3ZhbGFycmF5X2NvcHkoX19hLl9NX2FycmF5LCBfTV9zeiwgX19hLl9NX2luZGV4LCBfTV9hcnJheSwKKwkJCSAgIF9NX2luZGV4KTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgaW5kaXJlY3RfYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IF9UcCYgX190KSBjb25zdAorICAgIHsgc3RkOjpfX3ZhbGFycmF5X2ZpbGwoX01fYXJyYXksIF9NX2luZGV4LCBfTV9zeiwgX190KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIGluZGlyZWN0X2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YpIGNvbnN0CisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weShfQXJyYXk8X1RwPihfX3YpLCBfTV9zeiwgX01fYXJyYXksIF9NX2luZGV4KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGluZGlyZWN0X2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JiBfX2UpIGNvbnN0CisgICAgICB7IHN0ZDo6X192YWxhcnJheV9jb3B5KF9fZSwgX01fc3osIF9NX2FycmF5LCBfTV9pbmRleCk7IH0KKworI3VuZGVmIF9ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IKKyNkZWZpbmUgX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUihfT3AsIF9OYW1lKQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4JCQkJCQlcCisgICAgaW5saW5lIHZvaWQJCQkJCQkJCVwKKyAgICBpbmRpcmVjdF9hcnJheTxfVHA+OjpvcGVyYXRvciBfT3AjIz0oY29uc3QgdmFsYXJyYXk8X1RwPiYgX192KSBjb25zdFwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9NX2FycmF5LCBfTV9pbmRleCwgX0FycmF5PF9UcD4oX192KSwgX01fc3opOyBcCisgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgkJCQkgICAgICAgICAgICAgICAgXAorICAgICAgaW5saW5lIHZvaWQJCQkJCQkJXAorICAgICAgaW5kaXJlY3RfYXJyYXk8X1RwPjo6b3BlcmF0b3IgX09wIyM9KGNvbnN0IF9FeHByPF9Eb20sX1RwPiYgX19lKSBjb25zdFwKKyAgICAgIHsJCQkJCQkJCQlcCisJX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9NX2FycmF5LCBfTV9pbmRleCwgX19lLCBfTV9zeik7CVwKKyAgICAgIH0KKworX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigqLCBfX211bHRpcGxpZXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKC8sIF9fZGl2aWRlcykKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoJSwgX19tb2R1bHVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigrLCBfX3BsdXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKC0sIF9fbWludXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKF4sIF9fYml0d2lzZV94b3IpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKCYsIF9fYml0d2lzZV9hbmQpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKHwsIF9fYml0d2lzZV9vcikKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoPDwsIF9fc2hpZnRfbGVmdCkKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoPj4sIF9fc2hpZnRfcmlnaHQpCisKKyN1bmRlZiBfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SCisKKyAgLy8gQH0gZ3JvdXAgbnVtZXJpY19hcnJheXMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0lORElSRUNUX0FSUkFZX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9pb3NfYmFzZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2lvc19iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI3YjlhNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9pb3NfYmFzZS5oCkBAIC0wLDAgKzEsOTc1IEBACisvLyBJb3N0cmVhbXMgYmFzZSBjbGFzc2VzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2lvc19iYXNlLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpb3N9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDI3LjQgIElvc3RyZWFtcyBiYXNlIGNsYXNzZXMKKy8vCisKKyNpZm5kZWYgX0lPU19CQVNFX0gKKyNkZWZpbmUgX0lPU19CQVNFX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxleHQvYXRvbWljaXR5Lmg+CisjaW5jbHVkZSA8Yml0cy9sb2NhbGVmd2QuaD4KKyNpbmNsdWRlIDxiaXRzL2xvY2FsZV9jbGFzc2VzLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIG9mIGJpdG1hc2sgdHlwZXMgYXJlIGVudW1zLCBub3QgaW50cywKKyAgLy8gYXMgcGVybWl0dGVkIChidXQgbm90IHJlcXVpcmVkKSBpbiB0aGUgc3RhbmRhcmQsIGluIG9yZGVyIHRvIHByb3ZpZGUKKyAgLy8gYmV0dGVyIHR5cGUgc2FmZXR5IGluIGlvc3RyZWFtIGNhbGxzLiAgQSBzaWRlIGVmZmVjdCBpcyB0aGF0CisgIC8vIGV4cHJlc3Npb25zIGludm9sdmluZyB0aGVtIGFyZSBubyBsb25nZXIgY29tcGlsZS10aW1lIGNvbnN0YW50cy4KKyAgZW51bSBfSW9zX0ZtdGZsYWdzIAorICAgIHsgCisgICAgICBfU19ib29sYWxwaGEgCT0gMUwgPDwgMCwKKyAgICAgIF9TX2RlYyAJCT0gMUwgPDwgMSwKKyAgICAgIF9TX2ZpeGVkIAkJPSAxTCA8PCAyLAorICAgICAgX1NfaGV4IAkJPSAxTCA8PCAzLAorICAgICAgX1NfaW50ZXJuYWwgCT0gMUwgPDwgNCwKKyAgICAgIF9TX2xlZnQgCQk9IDFMIDw8IDUsCisgICAgICBfU19vY3QgCQk9IDFMIDw8IDYsCisgICAgICBfU19yaWdodCAJCT0gMUwgPDwgNywKKyAgICAgIF9TX3NjaWVudGlmaWMgCT0gMUwgPDwgOCwKKyAgICAgIF9TX3Nob3diYXNlIAk9IDFMIDw8IDksCisgICAgICBfU19zaG93cG9pbnQgCT0gMUwgPDwgMTAsCisgICAgICBfU19zaG93cG9zIAk9IDFMIDw8IDExLAorICAgICAgX1Nfc2tpcHdzIAk9IDFMIDw8IDEyLAorICAgICAgX1NfdW5pdGJ1ZiAJPSAxTCA8PCAxMywKKyAgICAgIF9TX3VwcGVyY2FzZSAJPSAxTCA8PCAxNCwKKyAgICAgIF9TX2FkanVzdGZpZWxkIAk9IF9TX2xlZnQgfCBfU19yaWdodCB8IF9TX2ludGVybmFsLAorICAgICAgX1NfYmFzZWZpZWxkIAk9IF9TX2RlYyB8IF9TX29jdCB8IF9TX2hleCwKKyAgICAgIF9TX2Zsb2F0ZmllbGQgCT0gX1Nfc2NpZW50aWZpYyB8IF9TX2ZpeGVkLAorICAgICAgX1NfaW9zX2ZtdGZsYWdzX2VuZCA9IDFMIDw8IDE2IAorICAgIH07CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBfSW9zX0ZtdGZsYWdzCisgIG9wZXJhdG9yJihfSW9zX0ZtdGZsYWdzIF9fYSwgX0lvc19GbXRmbGFncyBfX2IpCisgIHsgcmV0dXJuIF9Jb3NfRm10ZmxhZ3Moc3RhdGljX2Nhc3Q8aW50PihfX2EpICYgc3RhdGljX2Nhc3Q8aW50PihfX2IpKTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgX0lvc19GbXRmbGFncworICBvcGVyYXRvcnwoX0lvc19GbXRmbGFncyBfX2EsIF9Jb3NfRm10ZmxhZ3MgX19iKQorICB7IHJldHVybiBfSW9zX0ZtdGZsYWdzKHN0YXRpY19jYXN0PGludD4oX19hKSB8IHN0YXRpY19jYXN0PGludD4oX19iKSk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIF9Jb3NfRm10ZmxhZ3MKKyAgb3BlcmF0b3JeKF9Jb3NfRm10ZmxhZ3MgX19hLCBfSW9zX0ZtdGZsYWdzIF9fYikKKyAgeyByZXR1cm4gX0lvc19GbXRmbGFncyhzdGF0aWNfY2FzdDxpbnQ+KF9fYSkgXiBzdGF0aWNfY2FzdDxpbnQ+KF9fYikpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBfSW9zX0ZtdGZsYWdzCisgIG9wZXJhdG9yfihfSW9zX0ZtdGZsYWdzIF9fYSkKKyAgeyByZXR1cm4gX0lvc19GbXRmbGFncyh+c3RhdGljX2Nhc3Q8aW50PihfX2EpKTsgfQorCisgIGlubGluZSBjb25zdCBfSW9zX0ZtdGZsYWdzJgorICBvcGVyYXRvcnw9KF9Jb3NfRm10ZmxhZ3MmIF9fYSwgX0lvc19GbXRmbGFncyBfX2IpCisgIHsgcmV0dXJuIF9fYSA9IF9fYSB8IF9fYjsgfQorCisgIGlubGluZSBjb25zdCBfSW9zX0ZtdGZsYWdzJgorICBvcGVyYXRvciY9KF9Jb3NfRm10ZmxhZ3MmIF9fYSwgX0lvc19GbXRmbGFncyBfX2IpCisgIHsgcmV0dXJuIF9fYSA9IF9fYSAmIF9fYjsgfQorCisgIGlubGluZSBjb25zdCBfSW9zX0ZtdGZsYWdzJgorICBvcGVyYXRvcl49KF9Jb3NfRm10ZmxhZ3MmIF9fYSwgX0lvc19GbXRmbGFncyBfX2IpCisgIHsgcmV0dXJuIF9fYSA9IF9fYSBeIF9fYjsgfQorCisKKyAgZW51bSBfSW9zX09wZW5tb2RlIAorICAgIHsgCisgICAgICBfU19hcHAgCQk9IDFMIDw8IDAsCisgICAgICBfU19hdGUgCQk9IDFMIDw8IDEsCisgICAgICBfU19iaW4gCQk9IDFMIDw8IDIsCisgICAgICBfU19pbiAJCT0gMUwgPDwgMywKKyAgICAgIF9TX291dCAJCT0gMUwgPDwgNCwKKyAgICAgIF9TX3RydW5jIAkJPSAxTCA8PCA1LAorICAgICAgX1NfaW9zX29wZW5tb2RlX2VuZCA9IDFMIDw8IDE2IAorICAgIH07CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBfSW9zX09wZW5tb2RlCisgIG9wZXJhdG9yJihfSW9zX09wZW5tb2RlIF9fYSwgX0lvc19PcGVubW9kZSBfX2IpCisgIHsgcmV0dXJuIF9Jb3NfT3Blbm1vZGUoc3RhdGljX2Nhc3Q8aW50PihfX2EpICYgc3RhdGljX2Nhc3Q8aW50PihfX2IpKTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgX0lvc19PcGVubW9kZQorICBvcGVyYXRvcnwoX0lvc19PcGVubW9kZSBfX2EsIF9Jb3NfT3Blbm1vZGUgX19iKQorICB7IHJldHVybiBfSW9zX09wZW5tb2RlKHN0YXRpY19jYXN0PGludD4oX19hKSB8IHN0YXRpY19jYXN0PGludD4oX19iKSk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIF9Jb3NfT3Blbm1vZGUKKyAgb3BlcmF0b3JeKF9Jb3NfT3Blbm1vZGUgX19hLCBfSW9zX09wZW5tb2RlIF9fYikKKyAgeyByZXR1cm4gX0lvc19PcGVubW9kZShzdGF0aWNfY2FzdDxpbnQ+KF9fYSkgXiBzdGF0aWNfY2FzdDxpbnQ+KF9fYikpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBfSW9zX09wZW5tb2RlCisgIG9wZXJhdG9yfihfSW9zX09wZW5tb2RlIF9fYSkKKyAgeyByZXR1cm4gX0lvc19PcGVubW9kZSh+c3RhdGljX2Nhc3Q8aW50PihfX2EpKTsgfQorCisgIGlubGluZSBjb25zdCBfSW9zX09wZW5tb2RlJgorICBvcGVyYXRvcnw9KF9Jb3NfT3Blbm1vZGUmIF9fYSwgX0lvc19PcGVubW9kZSBfX2IpCisgIHsgcmV0dXJuIF9fYSA9IF9fYSB8IF9fYjsgfQorCisgIGlubGluZSBjb25zdCBfSW9zX09wZW5tb2RlJgorICBvcGVyYXRvciY9KF9Jb3NfT3Blbm1vZGUmIF9fYSwgX0lvc19PcGVubW9kZSBfX2IpCisgIHsgcmV0dXJuIF9fYSA9IF9fYSAmIF9fYjsgfQorCisgIGlubGluZSBjb25zdCBfSW9zX09wZW5tb2RlJgorICBvcGVyYXRvcl49KF9Jb3NfT3Blbm1vZGUmIF9fYSwgX0lvc19PcGVubW9kZSBfX2IpCisgIHsgcmV0dXJuIF9fYSA9IF9fYSBeIF9fYjsgfQorCisKKyAgZW51bSBfSW9zX0lvc3RhdGUKKyAgICB7IAorICAgICAgX1NfZ29vZGJpdCAJCT0gMCwKKyAgICAgIF9TX2JhZGJpdCAJCT0gMUwgPDwgMCwKKyAgICAgIF9TX2VvZmJpdCAJCT0gMUwgPDwgMSwKKyAgICAgIF9TX2ZhaWxiaXQJCT0gMUwgPDwgMiwKKyAgICAgIF9TX2lvc19pb3N0YXRlX2VuZCA9IDFMIDw8IDE2IAorICAgIH07CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBfSW9zX0lvc3RhdGUKKyAgb3BlcmF0b3ImKF9Jb3NfSW9zdGF0ZSBfX2EsIF9Jb3NfSW9zdGF0ZSBfX2IpCisgIHsgcmV0dXJuIF9Jb3NfSW9zdGF0ZShzdGF0aWNfY2FzdDxpbnQ+KF9fYSkgJiBzdGF0aWNfY2FzdDxpbnQ+KF9fYikpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBfSW9zX0lvc3RhdGUKKyAgb3BlcmF0b3J8KF9Jb3NfSW9zdGF0ZSBfX2EsIF9Jb3NfSW9zdGF0ZSBfX2IpCisgIHsgcmV0dXJuIF9Jb3NfSW9zdGF0ZShzdGF0aWNfY2FzdDxpbnQ+KF9fYSkgfCBzdGF0aWNfY2FzdDxpbnQ+KF9fYikpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBfSW9zX0lvc3RhdGUKKyAgb3BlcmF0b3JeKF9Jb3NfSW9zdGF0ZSBfX2EsIF9Jb3NfSW9zdGF0ZSBfX2IpCisgIHsgcmV0dXJuIF9Jb3NfSW9zdGF0ZShzdGF0aWNfY2FzdDxpbnQ+KF9fYSkgXiBzdGF0aWNfY2FzdDxpbnQ+KF9fYikpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBfSW9zX0lvc3RhdGUKKyAgb3BlcmF0b3J+KF9Jb3NfSW9zdGF0ZSBfX2EpCisgIHsgcmV0dXJuIF9Jb3NfSW9zdGF0ZSh+c3RhdGljX2Nhc3Q8aW50PihfX2EpKTsgfQorCisgIGlubGluZSBjb25zdCBfSW9zX0lvc3RhdGUmCisgIG9wZXJhdG9yfD0oX0lvc19Jb3N0YXRlJiBfX2EsIF9Jb3NfSW9zdGF0ZSBfX2IpCisgIHsgcmV0dXJuIF9fYSA9IF9fYSB8IF9fYjsgfQorCisgIGlubGluZSBjb25zdCBfSW9zX0lvc3RhdGUmCisgIG9wZXJhdG9yJj0oX0lvc19Jb3N0YXRlJiBfX2EsIF9Jb3NfSW9zdGF0ZSBfX2IpCisgIHsgcmV0dXJuIF9fYSA9IF9fYSAmIF9fYjsgfQorCisgIGlubGluZSBjb25zdCAgX0lvc19Jb3N0YXRlJgorICBvcGVyYXRvcl49KF9Jb3NfSW9zdGF0ZSYgX19hLCBfSW9zX0lvc3RhdGUgX19iKQorICB7IHJldHVybiBfX2EgPSBfX2EgXiBfX2I7IH0KKworCisgIGVudW0gX0lvc19TZWVrZGlyIAorICAgIHsgCisgICAgICBfU19iZWcgPSAwLAorICAgICAgX1NfY3VyID0gX0dMSUJDWFhfU1RESU9fU0VFS19DVVIsCisgICAgICBfU19lbmQgPSBfR0xJQkNYWF9TVERJT19TRUVLX0VORCwKKyAgICAgIF9TX2lvc19zZWVrZGlyX2VuZCA9IDFMIDw8IDE2IAorICAgIH07CisKKyAgLy8gMjcuNC4yICBDbGFzcyBpb3NfYmFzZQorICAvKioKKyAgICogIEBicmllZiAgVGhlIGJhc2Ugb2YgdGhlIEkvTyBjbGFzcyBoaWVyYXJjaHkuCisgICAqICBAaW5ncm91cCBpbworICAgKgorICAgKiAgVGhpcyBjbGFzcyBkZWZpbmVzIGV2ZXJ5dGhpbmcgdGhhdCBjYW4gYmUgZGVmaW5lZCBhYm91dCBJL08gdGhhdCBkb2VzCisgICAqICBub3QgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIGNoYXJhY3RlcnMgYmVpbmcgaW5wdXQgb3Igb3V0cHV0LiAgTW9zdAorICAgKiAgcGVvcGxlIHdpbGwgb25seSBzZWUgQGMgaW9zX2Jhc2Ugd2hlbiB0aGV5IG5lZWQgdG8gc3BlY2lmeSB0aGUgZnVsbAorICAgKiAgbmFtZSBvZiB0aGUgdmFyaW91cyBJL08gZmxhZ3MgKGUuZy4sIHRoZSBvcGVubW9kZXMpLgorICAqLworICBjbGFzcyBpb3NfYmFzZQorICB7CisgIHB1YmxpYzoKKworICAgIC8qKiAKKyAgICAgKiAgQGJyaWVmIFRoZXNlIGFyZSB0aHJvd24gdG8gaW5kaWNhdGUgcHJvYmxlbXMgd2l0aCBpby4KKyAgICAgKiAgQGluZ3JvdXAgZXhjZXB0aW9ucworICAgICAqCisgICAgICogIDI3LjQuMi4xLjEgIENsYXNzIGlvc19iYXNlOjpmYWlsdXJlCisgICAgICovCisgICAgY2xhc3MgZmFpbHVyZSA6IHB1YmxpYyBleGNlcHRpb24KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDguICBVc2Ugb2Ygbm9uLWV4aXN0ZW50IGV4Y2VwdGlvbiBjb25zdHJ1Y3RvcgorICAgICAgZXhwbGljaXQKKyAgICAgIGZhaWx1cmUoY29uc3Qgc3RyaW5nJiBfX3N0cikgdGhyb3coKTsKKworICAgICAgLy8gVGhpcyBkZWNsYXJhdGlvbiBpcyBub3QgdXNlbGVzczoKKyAgICAgIC8vIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2djYy00LjMuMi9nY2MvVmFndWUtTGlua2FnZS5odG1sCisgICAgICB2aXJ0dWFsCisgICAgICB+ZmFpbHVyZSgpIHRocm93KCk7CisKKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcioKKyAgICAgIHdoYXQoKSBjb25zdCB0aHJvdygpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHN0cmluZyBfTV9tc2c7CisgICAgfTsKKworICAgIC8vIDI3LjQuMi4xLjIgIFR5cGUgaW9zX2Jhc2U6OmZtdGZsYWdzCisgICAgLyoqCisgICAgICogIEBicmllZiBUaGlzIGlzIGEgYml0bWFzayB0eXBlLgorICAgICAqCisgICAgICogIEBjIEBhIF9Jb3NfRm10ZmxhZ3MgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZCwgYnV0IGl0IGlzIHZhbGlkIHRvCisgICAgICogIHBlcmZvcm0gYml0d2lzZSBvcGVyYXRpb25zIG9uIHRoZXNlIHZhbHVlcyBhbmQgZXhwZWN0IHRoZSBSaWdodAorICAgICAqICBUaGluZyB0byBoYXBwZW4uICBEZWZpbmVkIG9iamVjdHMgb2YgdHlwZSBmbXRmbGFncyBhcmU6CisgICAgICogIC0gYm9vbGFscGhhCisgICAgICogIC0gZGVjCisgICAgICogIC0gZml4ZWQKKyAgICAgKiAgLSBoZXgKKyAgICAgKiAgLSBpbnRlcm5hbAorICAgICAqICAtIGxlZnQKKyAgICAgKiAgLSBvY3QKKyAgICAgKiAgLSByaWdodAorICAgICAqICAtIHNjaWVudGlmaWMKKyAgICAgKiAgLSBzaG93YmFzZQorICAgICAqICAtIHNob3dwb2ludAorICAgICAqICAtIHNob3dwb3MKKyAgICAgKiAgLSBza2lwd3MKKyAgICAgKiAgLSB1bml0YnVmCisgICAgICogIC0gdXBwZXJjYXNlCisgICAgICogIC0gYWRqdXN0ZmllbGQKKyAgICAgKiAgLSBiYXNlZmllbGQKKyAgICAgKiAgLSBmbG9hdGZpZWxkCisgICAgKi8KKyAgICB0eXBlZGVmIF9Jb3NfRm10ZmxhZ3MgZm10ZmxhZ3M7CisKKyAgICAvLy8gSW5zZXJ0L2V4dHJhY3QgQGMgYm9vbCBpbiBhbHBoYWJldGljIHJhdGhlciB0aGFuIG51bWVyaWMgZm9ybWF0LgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBib29sYWxwaGEgPSAgIF9TX2Jvb2xhbHBoYTsKKworICAgIC8vLyBDb252ZXJ0cyBpbnRlZ2VyIGlucHV0IG9yIGdlbmVyYXRlcyBpbnRlZ2VyIG91dHB1dCBpbiBkZWNpbWFsIGJhc2UuCisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIGRlYyA9ICAgICAgICAgX1NfZGVjOworCisgICAgLy8vIEdlbmVyYXRlIGZsb2F0aW5nLXBvaW50IG91dHB1dCBpbiBmaXhlZC1wb2ludCBub3RhdGlvbi4KKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgZml4ZWQgPSAgICAgICBfU19maXhlZDsKKworICAgIC8vLyBDb252ZXJ0cyBpbnRlZ2VyIGlucHV0IG9yIGdlbmVyYXRlcyBpbnRlZ2VyIG91dHB1dCBpbiBoZXhhZGVjaW1hbCBiYXNlLgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBoZXggPSAgICAgICAgIF9TX2hleDsKKworICAgIC8vLyBBZGRzIGZpbGwgY2hhcmFjdGVycyBhdCBhIGRlc2lnbmF0ZWQgaW50ZXJuYWwgcG9pbnQgaW4gY2VydGFpbgorICAgIC8vLyBnZW5lcmF0ZWQgb3V0cHV0LCBvciBpZGVudGljYWwgdG8gQGMgcmlnaHQgaWYgbm8gc3VjaCBwb2ludCBpcworICAgIC8vLyBkZXNpZ25hdGVkLgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBpbnRlcm5hbCA9ICAgIF9TX2ludGVybmFsOworCisgICAgLy8vIEFkZHMgZmlsbCBjaGFyYWN0ZXJzIG9uIHRoZSByaWdodCAoZmluYWwgcG9zaXRpb25zKSBvZiBjZXJ0YWluCisgICAgLy8vIGdlbmVyYXRlZCBvdXRwdXQuICAoSS5lLiwgdGhlIHRoaW5nIHlvdSBwcmludCBpcyBmbHVzaCBsZWZ0LikKKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgbGVmdCA9ICAgICAgICBfU19sZWZ0OworCisgICAgLy8vIENvbnZlcnRzIGludGVnZXIgaW5wdXQgb3IgZ2VuZXJhdGVzIGludGVnZXIgb3V0cHV0IGluIG9jdGFsIGJhc2UuCisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIG9jdCA9ICAgICAgICAgX1Nfb2N0OworCisgICAgLy8vIEFkZHMgZmlsbCBjaGFyYWN0ZXJzIG9uIHRoZSBsZWZ0IChpbml0aWFsIHBvc2l0aW9ucykgb2YgY2VydGFpbgorICAgIC8vLyBnZW5lcmF0ZWQgb3V0cHV0LiAgKEkuZS4sIHRoZSB0aGluZyB5b3UgcHJpbnQgaXMgZmx1c2ggcmlnaHQuKQorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyByaWdodCA9ICAgICAgIF9TX3JpZ2h0OworCisgICAgLy8vIEdlbmVyYXRlcyBmbG9hdGluZy1wb2ludCBvdXRwdXQgaW4gc2NpZW50aWZpYyBub3RhdGlvbi4KKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3Mgc2NpZW50aWZpYyA9ICBfU19zY2llbnRpZmljOworCisgICAgLy8vIEdlbmVyYXRlcyBhIHByZWZpeCBpbmRpY2F0aW5nIHRoZSBudW1lcmljIGJhc2Ugb2YgZ2VuZXJhdGVkIGludGVnZXIKKyAgICAvLy8gb3V0cHV0LgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBzaG93YmFzZSA9ICAgIF9TX3Nob3diYXNlOworCisgICAgLy8vIEdlbmVyYXRlcyBhIGRlY2ltYWwtcG9pbnQgY2hhcmFjdGVyIHVuY29uZGl0aW9uYWxseSBpbiBnZW5lcmF0ZWQKKyAgICAvLy8gZmxvYXRpbmctcG9pbnQgb3V0cHV0LgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBzaG93cG9pbnQgPSAgIF9TX3Nob3dwb2ludDsKKworICAgIC8vLyBHZW5lcmF0ZXMgYSArIHNpZ24gaW4gbm9uLW5lZ2F0aXZlIGdlbmVyYXRlZCBudW1lcmljIG91dHB1dC4KKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3Mgc2hvd3BvcyA9ICAgICBfU19zaG93cG9zOworCisgICAgLy8vIFNraXBzIGxlYWRpbmcgd2hpdGUgc3BhY2UgYmVmb3JlIGNlcnRhaW4gaW5wdXQgb3BlcmF0aW9ucy4KKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3Mgc2tpcHdzID0gICAgICBfU19za2lwd3M7CisKKyAgICAvLy8gRmx1c2hlcyBvdXRwdXQgYWZ0ZXIgZWFjaCBvdXRwdXQgb3BlcmF0aW9uLgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyB1bml0YnVmID0gICAgIF9TX3VuaXRidWY7CisKKyAgICAvLy8gUmVwbGFjZXMgY2VydGFpbiBsb3dlcmNhc2UgbGV0dGVycyB3aXRoIHRoZWlyIHVwcGVyY2FzZSBlcXVpdmFsZW50cworICAgIC8vLyBpbiBnZW5lcmF0ZWQgb3V0cHV0LgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyB1cHBlcmNhc2UgPSAgIF9TX3VwcGVyY2FzZTsKKworICAgIC8vLyBBIG1hc2sgb2YgbGVmdHxyaWdodHxpbnRlcm5hbC4gIFVzZWZ1bCBmb3IgdGhlIDItYXJnIGZvcm0gb2YgQGMgc2V0Zi4KKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgYWRqdXN0ZmllbGQgPSBfU19hZGp1c3RmaWVsZDsKKworICAgIC8vLyBBIG1hc2sgb2YgZGVjfG9jdHxoZXguICBVc2VmdWwgZm9yIHRoZSAyLWFyZyBmb3JtIG9mIEBjIHNldGYuCisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIGJhc2VmaWVsZCA9ICAgX1NfYmFzZWZpZWxkOworCisgICAgLy8vIEEgbWFzayBvZiBzY2llbnRpZmljfGZpeGVkLiAgVXNlZnVsIGZvciB0aGUgMi1hcmcgZm9ybSBvZiBAYyBzZXRmLgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBmbG9hdGZpZWxkID0gIF9TX2Zsb2F0ZmllbGQ7CisKKyAgICAvLyAyNy40LjIuMS4zICBUeXBlIGlvc19iYXNlOjppb3N0YXRlCisgICAgLyoqCisgICAgICogIEBicmllZiBUaGlzIGlzIGEgYml0bWFzayB0eXBlLgorICAgICAqCisgICAgICogIEBjIEBhIF9Jb3NfSW9zdGF0ZSBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLCBidXQgaXQgaXMgdmFsaWQgdG8KKyAgICAgKiAgcGVyZm9ybSBiaXR3aXNlIG9wZXJhdGlvbnMgb24gdGhlc2UgdmFsdWVzIGFuZCBleHBlY3QgdGhlIFJpZ2h0CisgICAgICogIFRoaW5nIHRvIGhhcHBlbi4gIERlZmluZWQgb2JqZWN0cyBvZiB0eXBlIGlvc3RhdGUgYXJlOgorICAgICAqICAtIGJhZGJpdAorICAgICAqICAtIGVvZmJpdAorICAgICAqICAtIGZhaWxiaXQKKyAgICAgKiAgLSBnb29kYml0CisgICAgKi8KKyAgICB0eXBlZGVmIF9Jb3NfSW9zdGF0ZSBpb3N0YXRlOworCisgICAgLy8vIEluZGljYXRlcyBhIGxvc3Mgb2YgaW50ZWdyaXR5IGluIGFuIGlucHV0IG9yIG91dHB1dCBzZXF1ZW5jZSAoc3VjaAorICAgIC8vLyBhcyBhbiBpcnJlY292ZXJhYmxlIHJlYWQgZXJyb3IgZnJvbSBhIGZpbGUpLgorICAgIHN0YXRpYyBjb25zdCBpb3N0YXRlIGJhZGJpdCA9CV9TX2JhZGJpdDsKKworICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCBhbiBpbnB1dCBvcGVyYXRpb24gcmVhY2hlZCB0aGUgZW5kIG9mIGFuIGlucHV0IHNlcXVlbmNlLgorICAgIHN0YXRpYyBjb25zdCBpb3N0YXRlIGVvZmJpdCA9CV9TX2VvZmJpdDsKKworICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCBhbiBpbnB1dCBvcGVyYXRpb24gZmFpbGVkIHRvIHJlYWQgdGhlIGV4cGVjdGVkCisgICAgLy8vIGNoYXJhY3RlcnMsIG9yIHRoYXQgYW4gb3V0cHV0IG9wZXJhdGlvbiBmYWlsZWQgdG8gZ2VuZXJhdGUgdGhlCisgICAgLy8vIGRlc2lyZWQgY2hhcmFjdGVycy4KKyAgICBzdGF0aWMgY29uc3QgaW9zdGF0ZSBmYWlsYml0ID0JX1NfZmFpbGJpdDsKKworICAgIC8vLyBJbmRpY2F0ZXMgYWxsIGlzIHdlbGwuCisgICAgc3RhdGljIGNvbnN0IGlvc3RhdGUgZ29vZGJpdCA9CV9TX2dvb2RiaXQ7CisKKyAgICAvLyAyNy40LjIuMS40ICBUeXBlIGlvc19iYXNlOjpvcGVubW9kZQorICAgIC8qKgorICAgICAqICBAYnJpZWYgVGhpcyBpcyBhIGJpdG1hc2sgdHlwZS4KKyAgICAgKgorICAgICAqICBAYyBAYSBfSW9zX09wZW5tb2RlIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQsIGJ1dCBpdCBpcyB2YWxpZCB0bworICAgICAqICBwZXJmb3JtIGJpdHdpc2Ugb3BlcmF0aW9ucyBvbiB0aGVzZSB2YWx1ZXMgYW5kIGV4cGVjdCB0aGUgUmlnaHQKKyAgICAgKiAgVGhpbmcgdG8gaGFwcGVuLiAgRGVmaW5lZCBvYmplY3RzIG9mIHR5cGUgb3Blbm1vZGUgYXJlOgorICAgICAqICAtIGFwcAorICAgICAqICAtIGF0ZQorICAgICAqICAtIGJpbmFyeQorICAgICAqICAtIGluCisgICAgICogIC0gb3V0CisgICAgICogIC0gdHJ1bmMKKyAgICAqLworICAgIHR5cGVkZWYgX0lvc19PcGVubW9kZSBvcGVubW9kZTsKKworICAgIC8vLyBTZWVrIHRvIGVuZCBiZWZvcmUgZWFjaCB3cml0ZS4KKyAgICBzdGF0aWMgY29uc3Qgb3Blbm1vZGUgYXBwID0JCV9TX2FwcDsKKworICAgIC8vLyBPcGVuIGFuZCBzZWVrIHRvIGVuZCBpbW1lZGlhdGVseSBhZnRlciBvcGVuaW5nLgorICAgIHN0YXRpYyBjb25zdCBvcGVubW9kZSBhdGUgPQkJX1NfYXRlOworCisgICAgLy8vIFBlcmZvcm0gaW5wdXQgYW5kIG91dHB1dCBpbiBiaW5hcnkgbW9kZSAoYXMgb3Bwb3NlZCB0byB0ZXh0IG1vZGUpLgorICAgIC8vLyBUaGlzIGlzIHByb2JhYmx5IG5vdCB3aGF0IHlvdSB0aGluayBpdCBpczsgc2VlCisgICAgLy8vIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MTFjaDI3czAyLmh0bWwKKyAgICBzdGF0aWMgY29uc3Qgb3Blbm1vZGUgYmluYXJ5ID0JX1NfYmluOworCisgICAgLy8vIE9wZW4gZm9yIGlucHV0LiAgRGVmYXVsdCBmb3IgQGMgaWZzdHJlYW0gYW5kIGZzdHJlYW0uCisgICAgc3RhdGljIGNvbnN0IG9wZW5tb2RlIGluID0JCV9TX2luOworCisgICAgLy8vIE9wZW4gZm9yIG91dHB1dC4gIERlZmF1bHQgZm9yIEBjIG9mc3RyZWFtIGFuZCBmc3RyZWFtLgorICAgIHN0YXRpYyBjb25zdCBvcGVubW9kZSBvdXQgPQkJX1Nfb3V0OworCisgICAgLy8vIE9wZW4gZm9yIGlucHV0LiAgRGVmYXVsdCBmb3IgQGMgb2ZzdHJlYW0uCisgICAgc3RhdGljIGNvbnN0IG9wZW5tb2RlIHRydW5jID0JX1NfdHJ1bmM7CisKKyAgICAvLyAyNy40LjIuMS41ICBUeXBlIGlvc19iYXNlOjpzZWVrZGlyCisgICAgLyoqCisgICAgICogIEBicmllZiBUaGlzIGlzIGFuIGVudW1lcmF0ZWQgdHlwZS4KKyAgICAgKgorICAgICAqICBAYyBAYSBfSW9zX1NlZWtkaXIgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4gIERlZmluZWQgdmFsdWVzCisgICAgICogIG9mIHR5cGUgc2Vla2RpciBhcmU6CisgICAgICogIC0gYmVnCisgICAgICogIC0gY3VyLCBlcXVpdmFsZW50IHRvIEBjIFNFRUtfQ1VSIGluIHRoZSBDIHN0YW5kYXJkIGxpYnJhcnkuCisgICAgICogIC0gZW5kLCBlcXVpdmFsZW50IHRvIEBjIFNFRUtfRU5EIGluIHRoZSBDIHN0YW5kYXJkIGxpYnJhcnkuCisgICAgKi8KKyAgICB0eXBlZGVmIF9Jb3NfU2Vla2RpciBzZWVrZGlyOworCisgICAgLy8vIFJlcXVlc3QgYSBzZWVrIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbS4KKyAgICBzdGF0aWMgY29uc3Qgc2Vla2RpciBiZWcgPQkJX1NfYmVnOworCisgICAgLy8vIFJlcXVlc3QgYSBzZWVrIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgc2VxdWVuY2UuCisgICAgc3RhdGljIGNvbnN0IHNlZWtkaXIgY3VyID0JCV9TX2N1cjsKKworICAgIC8vLyBSZXF1ZXN0IGEgc2VlayByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBlbmQgb2YgdGhlIHNlcXVlbmNlLgorICAgIHN0YXRpYyBjb25zdCBzZWVrZGlyIGVuZCA9CQlfU19lbmQ7CisKKyAgICAvLyBBbm5leCBELjYKKyAgICB0eXBlZGVmIGludCBpb19zdGF0ZTsKKyAgICB0eXBlZGVmIGludCBvcGVuX21vZGU7CisgICAgdHlwZWRlZiBpbnQgc2Vla19kaXI7CisKKyAgICB0eXBlZGVmIHN0ZDo6c3RyZWFtcG9zIHN0cmVhbXBvczsKKyAgICB0eXBlZGVmIHN0ZDo6c3RyZWFtb2ZmIHN0cmVhbW9mZjsKKworICAgIC8vIENhbGxiYWNrczsKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBUaGUgc2V0IG9mIGV2ZW50cyB0aGF0IG1heSBiZSBwYXNzZWQgdG8gYW4gZXZlbnQgY2FsbGJhY2suCisgICAgICoKKyAgICAgKiAgZXJhc2VfZXZlbnQgaXMgdXNlZCBkdXJpbmcgfmlvcygpIGFuZCBjb3B5Zm10KCkuICBpbWJ1ZV9ldmVudCBpcyB1c2VkCisgICAgICogIGR1cmluZyBpbWJ1ZSgpLiAgY29weWZtdF9ldmVudCBpcyB1c2VkIGR1cmluZyBjb3B5Zm10KCkuCisgICAgKi8KKyAgICBlbnVtIGV2ZW50CisgICAgeworICAgICAgZXJhc2VfZXZlbnQsCisgICAgICBpbWJ1ZV9ldmVudCwKKyAgICAgIGNvcHlmbXRfZXZlbnQKKyAgICB9OworCisgICAgLyoqCisgICAgICogIEBicmllZiAgVGhlIHR5cGUgb2YgYW4gZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24uCisgICAgICogIEBwYXJhbSAgX19lICBPbmUgb2YgdGhlIG1lbWJlcnMgb2YgdGhlIGV2ZW50IGVudW0uCisgICAgICogIEBwYXJhbSAgX19iICBSZWZlcmVuY2UgdG8gdGhlIGlvc19iYXNlIG9iamVjdC4KKyAgICAgKiAgQHBhcmFtICBfX2kgIFRoZSBpbnRlZ2VyIHByb3ZpZGVkIHdoZW4gdGhlIGNhbGxiYWNrIHdhcyByZWdpc3RlcmVkLgorICAgICAqCisgICAgICogIEV2ZW50IGNhbGxiYWNrcyBhcmUgdXNlciBkZWZpbmVkIGZ1bmN0aW9ucyB0aGF0IGdldCBjYWxsZWQgZHVyaW5nCisgICAgICogIHNldmVyYWwgaW9zX2Jhc2UgYW5kIGJhc2ljX2lvcyBmdW5jdGlvbnMsIHNwZWNpZmljYWxseSBpbWJ1ZSgpLAorICAgICAqICBjb3B5Zm10KCksIGFuZCB+aW9zKCkuCisgICAgKi8KKyAgICB0eXBlZGVmIHZvaWQgKCpldmVudF9jYWxsYmFjaykgKGV2ZW50IF9fZSwgaW9zX2Jhc2UmIF9fYiwgaW50IF9faSk7CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBBZGQgdGhlIGNhbGxiYWNrIF9fZm4gd2l0aCBwYXJhbWV0ZXIgX19pbmRleC4KKyAgICAgKiAgQHBhcmFtICBfX2ZuICBUaGUgZnVuY3Rpb24gdG8gYWRkLgorICAgICAqICBAcGFyYW0gIF9faW5kZXggIFRoZSBpbnRlZ2VyIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uIHdoZW4gaW52b2tlZC4KKyAgICAgKgorICAgICAqICBSZWdpc3RlcnMgYSBmdW5jdGlvbiBhcyBhbiBldmVudCBjYWxsYmFjayB3aXRoIGFuIGludGVnZXIgcGFyYW1ldGVyIHRvCisgICAgICogIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gd2hlbiBpbnZva2VkLiAgTXVsdGlwbGUgY29waWVzIG9mIHRoZQorICAgICAqICBmdW5jdGlvbiBhcmUgYWxsb3dlZC4gIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBjYWxsYmFja3MsIHRoZXkgYXJlCisgICAgICogIGludm9rZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSByZWdpc3RlcmVkLgorICAgICovCisgICAgdm9pZAorICAgIHJlZ2lzdGVyX2NhbGxiYWNrKGV2ZW50X2NhbGxiYWNrIF9fZm4sIGludCBfX2luZGV4KTsKKworICBwcm90ZWN0ZWQ6CisgICAgc3RyZWFtc2l6ZQkJX01fcHJlY2lzaW9uOworICAgIHN0cmVhbXNpemUJCV9NX3dpZHRoOworICAgIGZtdGZsYWdzCQlfTV9mbGFnczsKKyAgICBpb3N0YXRlCQlfTV9leGNlcHRpb247CisgICAgaW9zdGF0ZQkJX01fc3RyZWFtYnVmX3N0YXRlOworCisgICAgLy8gMjcuNC4yLjYgIE1lbWJlcnMgZm9yIGNhbGxiYWNrcworICAgIC8vIDI3LjQuMi42ICBpb3NfYmFzZSBjYWxsYmFja3MKKyAgICBzdHJ1Y3QgX0NhbGxiYWNrX2xpc3QKKyAgICB7CisgICAgICAvLyBEYXRhIE1lbWJlcnMKKyAgICAgIF9DYWxsYmFja19saXN0KgkJX01fbmV4dDsKKyAgICAgIGlvc19iYXNlOjpldmVudF9jYWxsYmFjawlfTV9mbjsKKyAgICAgIGludAkJCV9NX2luZGV4OworICAgICAgX0F0b21pY193b3JkCQlfTV9yZWZjb3VudDsgIC8vIDAgbWVhbnMgb25lIHJlZmVyZW5jZS4KKworICAgICAgX0NhbGxiYWNrX2xpc3QoaW9zX2Jhc2U6OmV2ZW50X2NhbGxiYWNrIF9fZm4sIGludCBfX2luZGV4LAorCQkgICAgIF9DYWxsYmFja19saXN0KiBfX2NiKQorICAgICAgOiBfTV9uZXh0KF9fY2IpLCBfTV9mbihfX2ZuKSwgX01faW5kZXgoX19pbmRleCksIF9NX3JlZmNvdW50KDApIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9hZGRfcmVmZXJlbmNlKCkgeyBfX2dudV9jeHg6Ol9fYXRvbWljX2FkZF9kaXNwYXRjaCgmX01fcmVmY291bnQsIDEpOyB9CisKKyAgICAgIC8vIDAgPT4gT0sgdG8gZGVsZXRlLgorICAgICAgaW50CisgICAgICBfTV9yZW1vdmVfcmVmZXJlbmNlKCkgCisgICAgICB7CisgICAgICAgIC8vIEJlIHJhY2UtZGV0ZWN0b3ItZnJpZW5kbHkuICBGb3IgbW9yZSBpbmZvIHNlZSBiaXRzL2MrK2NvbmZpZy4KKyAgICAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQkVGT1JFKCZfTV9yZWZjb3VudCk7CisgICAgICAgIGludCBfX3JlcyA9IF9fZ251X2N4eDo6X19leGNoYW5nZV9hbmRfYWRkX2Rpc3BhdGNoKCZfTV9yZWZjb3VudCwgLTEpOworICAgICAgICBpZiAoX19yZXMgPT0gMCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19BRlRFUigmX01fcmVmY291bnQpOworICAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fcmVzOworICAgICAgfQorICAgIH07CisKKyAgICAgX0NhbGxiYWNrX2xpc3QqCV9NX2NhbGxiYWNrczsKKworICAgIHZvaWQKKyAgICBfTV9jYWxsX2NhbGxiYWNrcyhldmVudCBfX2V2KSB0aHJvdygpOworCisgICAgdm9pZAorICAgIF9NX2Rpc3Bvc2VfY2FsbGJhY2tzKHZvaWQpIHRocm93KCk7CisKKyAgICAvLyAyNy40LjIuNSAgTWVtYmVycyBmb3IgaXdvcmQvcHdvcmQgc3RvcmFnZQorICAgIHN0cnVjdCBfV29yZHMKKyAgICB7CisgICAgICB2b2lkKglfTV9wd29yZDsKKyAgICAgIGxvbmcJX01faXdvcmQ7CisgICAgICBfV29yZHMoKSA6IF9NX3B3b3JkKDApLCBfTV9pd29yZCgwKSB7IH0KKyAgICB9OworCisgICAgLy8gT25seSBmb3IgZmFpbGVkIGl3b3JkL3B3b3JkIGNhbGxzLgorICAgIF9Xb3JkcwkJX01fd29yZF96ZXJvOworCisgICAgLy8gR3VhcmFudGVlZCBzdG9yYWdlLgorICAgIC8vIFRoZSBmaXJzdCA1IGl3b3JkIGFuZCBwd29yZCBzbG90cyBhcmUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZS4KKyAgICBlbnVtIHsgX1NfbG9jYWxfd29yZF9zaXplID0gOCB9OworICAgIF9Xb3JkcwkJX01fbG9jYWxfd29yZFtfU19sb2NhbF93b3JkX3NpemVdOworCisgICAgLy8gQWxsb2NhdGVkIHN0b3JhZ2UuCisgICAgaW50CQkJX01fd29yZF9zaXplOworICAgIF9Xb3JkcyoJCV9NX3dvcmQ7CisKKyAgICBfV29yZHMmCisgICAgX01fZ3Jvd193b3JkcyhpbnQgX19pbmRleCwgYm9vbCBfX2l3b3JkKTsKKworICAgIC8vIE1lbWJlcnMgZm9yIGxvY2FsZSBhbmQgbG9jYWxlIGNhY2hpbmcuCisgICAgbG9jYWxlCQlfTV9pb3NfbG9jYWxlOworCisgICAgdm9pZAorICAgIF9NX2luaXQoKSB0aHJvdygpOworCisgIHB1YmxpYzoKKworICAgIC8vIDI3LjQuMi4xLjYgIENsYXNzIGlvc19iYXNlOjpJbml0CisgICAgLy8gVXNlZCB0byBpbml0aWFsaXplIHN0YW5kYXJkIHN0cmVhbXMuIEluIHRoZW9yeSwgZysrIGNvdWxkIHVzZQorICAgIC8vIC1maW5pdC1wcmlvcml0eSB0byBvcmRlciB0aGlzIHN0dWZmIGNvcnJlY3RseSB3aXRob3V0IGdvaW5nCisgICAgLy8gdGhyb3VnaCB0aGVzZSBtYWNoaW5hdGlvbnMuCisgICAgY2xhc3MgSW5pdAorICAgIHsKKyAgICAgIGZyaWVuZCBjbGFzcyBpb3NfYmFzZTsKKyAgICBwdWJsaWM6CisgICAgICBJbml0KCk7CisgICAgICB+SW5pdCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHN0YXRpYyBfQXRvbWljX3dvcmQJX1NfcmVmY291bnQ7CisgICAgICBzdGF0aWMgYm9vbAkJX1Nfc3luY2VkX3dpdGhfc3RkaW87CisgICAgfTsKKworICAgIC8vIFsyNy40LjIuMl0gZm10ZmxhZ3Mgc3RhdGUgZnVuY3Rpb25zCisgICAgLyoqCisgICAgICogIEBicmllZiAgQWNjZXNzIHRvIGZvcm1hdCBmbGFncy4KKyAgICAgKiAgQHJldHVybiAgVGhlIGZvcm1hdCBjb250cm9sIGZsYWdzIGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQuCisgICAgKi8KKyAgICBmbXRmbGFncworICAgIGZsYWdzKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9mbGFnczsgfQorCisgICAgLyoqCisgICAgICogIEBicmllZiAgU2V0dGluZyBuZXcgZm9ybWF0IGZsYWdzIGFsbCBhdCBvbmNlLgorICAgICAqICBAcGFyYW0gIF9fZm10ZmwgIFRoZSBuZXcgZmxhZ3MgdG8gc2V0LgorICAgICAqICBAcmV0dXJuICBUaGUgcHJldmlvdXMgZm9ybWF0IGNvbnRyb2wgZmxhZ3MuCisgICAgICoKKyAgICAgKiAgVGhpcyBmdW5jdGlvbiBvdmVyd3JpdGVzIGFsbCB0aGUgZm9ybWF0IGZsYWdzIHdpdGggQGEgX19mbXRmbC4KKyAgICAqLworICAgIGZtdGZsYWdzCisgICAgZmxhZ3MoZm10ZmxhZ3MgX19mbXRmbCkKKyAgICB7CisgICAgICBmbXRmbGFncyBfX29sZCA9IF9NX2ZsYWdzOworICAgICAgX01fZmxhZ3MgPSBfX2ZtdGZsOworICAgICAgcmV0dXJuIF9fb2xkOworICAgIH0KKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIFNldHRpbmcgbmV3IGZvcm1hdCBmbGFncy4KKyAgICAgKiAgQHBhcmFtICBfX2ZtdGZsICBBZGRpdGlvbmFsIGZsYWdzIHRvIHNldC4KKyAgICAgKiAgQHJldHVybiAgVGhlIHByZXZpb3VzIGZvcm1hdCBjb250cm9sIGZsYWdzLgorICAgICAqCisgICAgICogIFRoaXMgZnVuY3Rpb24gc2V0cyBhZGRpdGlvbmFsIGZsYWdzIGluIGZvcm1hdCBjb250cm9sLiAgRmxhZ3MgdGhhdAorICAgICAqICB3ZXJlIHByZXZpb3VzbHkgc2V0IHJlbWFpbiBzZXQuCisgICAgKi8KKyAgICBmbXRmbGFncworICAgIHNldGYoZm10ZmxhZ3MgX19mbXRmbCkKKyAgICB7CisgICAgICBmbXRmbGFncyBfX29sZCA9IF9NX2ZsYWdzOworICAgICAgX01fZmxhZ3MgfD0gX19mbXRmbDsKKyAgICAgIHJldHVybiBfX29sZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBTZXR0aW5nIG5ldyBmb3JtYXQgZmxhZ3MuCisgICAgICogIEBwYXJhbSAgX19mbXRmbCAgQWRkaXRpb25hbCBmbGFncyB0byBzZXQuCisgICAgICogIEBwYXJhbSAgX19tYXNrICBUaGUgZmxhZ3MgbWFzayBmb3IgQGEgZm10ZmwuCisgICAgICogIEByZXR1cm4gIFRoZSBwcmV2aW91cyBmb3JtYXQgY29udHJvbCBmbGFncy4KKyAgICAgKgorICAgICAqICBUaGlzIGZ1bmN0aW9uIGNsZWFycyBAYSBtYXNrIGluIHRoZSBmb3JtYXQgZmxhZ3MsIHRoZW4gc2V0cworICAgICAqICBAYSBmbXRmbCBAYyAmIEBhIG1hc2suICBBbiBleGFtcGxlIG1hc2sgaXMgQGMgaW9zX2Jhc2U6OmFkanVzdGZpZWxkLgorICAgICovCisgICAgZm10ZmxhZ3MKKyAgICBzZXRmKGZtdGZsYWdzIF9fZm10ZmwsIGZtdGZsYWdzIF9fbWFzaykKKyAgICB7CisgICAgICBmbXRmbGFncyBfX29sZCA9IF9NX2ZsYWdzOworICAgICAgX01fZmxhZ3MgJj0gfl9fbWFzazsKKyAgICAgIF9NX2ZsYWdzIHw9IChfX2ZtdGZsICYgX19tYXNrKTsKKyAgICAgIHJldHVybiBfX29sZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBDbGVhcmluZyBmb3JtYXQgZmxhZ3MuCisgICAgICogIEBwYXJhbSAgX19tYXNrICBUaGUgZmxhZ3MgdG8gdW5zZXQuCisgICAgICoKKyAgICAgKiAgVGhpcyBmdW5jdGlvbiBjbGVhcnMgQGEgX19tYXNrIGluIHRoZSBmb3JtYXQgZmxhZ3MuCisgICAgKi8KKyAgICB2b2lkCisgICAgdW5zZXRmKGZtdGZsYWdzIF9fbWFzaykKKyAgICB7IF9NX2ZsYWdzICY9IH5fX21hc2s7IH0KKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIEZsYWdzIGFjY2Vzcy4KKyAgICAgKiAgQHJldHVybiAgVGhlIHByZWNpc2lvbiB0byBnZW5lcmF0ZSBvbiBjZXJ0YWluIG91dHB1dCBvcGVyYXRpb25zLgorICAgICAqCisgICAgICogIEJlIGNhcmVmdWwgaWYgeW91IHRyeSB0byBnaXZlIGEgZGVmaW5pdGlvbiBvZiBAYSBwcmVjaXNpb24gaGVyZTsgc2VlCisgICAgICogIERSIDE4OS4KKyAgICAqLworICAgIHN0cmVhbXNpemUKKyAgICBwcmVjaXNpb24oKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3ByZWNpc2lvbjsgfQorCisgICAgLyoqCisgICAgICogIEBicmllZiAgQ2hhbmdpbmcgZmxhZ3MuCisgICAgICogIEBwYXJhbSAgX19wcmVjICBUaGUgbmV3IHByZWNpc2lvbiB2YWx1ZS4KKyAgICAgKiAgQHJldHVybiAgVGhlIHByZXZpb3VzIHZhbHVlIG9mIHByZWNpc2lvbigpLgorICAgICovCisgICAgc3RyZWFtc2l6ZQorICAgIHByZWNpc2lvbihzdHJlYW1zaXplIF9fcHJlYykKKyAgICB7CisgICAgICBzdHJlYW1zaXplIF9fb2xkID0gX01fcHJlY2lzaW9uOworICAgICAgX01fcHJlY2lzaW9uID0gX19wcmVjOworICAgICAgcmV0dXJuIF9fb2xkOworICAgIH0KKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIEZsYWdzIGFjY2Vzcy4KKyAgICAgKiAgQHJldHVybiAgVGhlIG1pbmltdW0gZmllbGQgd2lkdGggdG8gZ2VuZXJhdGUgb24gb3V0cHV0IG9wZXJhdGlvbnMuCisgICAgICoKKyAgICAgKiAgPGVtPk1pbmltdW0gZmllbGQgd2lkdGg8L2VtPiByZWZlcnMgdG8gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzLgorICAgICovCisgICAgc3RyZWFtc2l6ZQorICAgIHdpZHRoKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV93aWR0aDsgfQorCisgICAgLyoqCisgICAgICogIEBicmllZiAgQ2hhbmdpbmcgZmxhZ3MuCisgICAgICogIEBwYXJhbSAgX193aWRlICBUaGUgbmV3IHdpZHRoIHZhbHVlLgorICAgICAqICBAcmV0dXJuICBUaGUgcHJldmlvdXMgdmFsdWUgb2Ygd2lkdGgoKS4KKyAgICAqLworICAgIHN0cmVhbXNpemUKKyAgICB3aWR0aChzdHJlYW1zaXplIF9fd2lkZSkKKyAgICB7CisgICAgICBzdHJlYW1zaXplIF9fb2xkID0gX01fd2lkdGg7CisgICAgICBfTV93aWR0aCA9IF9fd2lkZTsKKyAgICAgIHJldHVybiBfX29sZDsKKyAgICB9CisKKyAgICAvLyBbMjcuNC4yLjRdIGlvc19iYXNlIHN0YXRpYyBtZW1iZXJzCisgICAgLyoqCisgICAgICogIEBicmllZiAgSW50ZXJhY3Rpb24gd2l0aCB0aGUgc3RhbmRhcmQgQyBJL08gb2JqZWN0cy4KKyAgICAgKiAgQHBhcmFtICBfX3N5bmMgIFdoZXRoZXIgdG8gc3luY2hyb25pemUgb3Igbm90LgorICAgICAqICBAcmV0dXJuICBUcnVlIGlmIHRoZSBzdGFuZGFyZCBzdHJlYW1zIHdlcmUgcHJldmlvdXNseSBzeW5jaHJvbml6ZWQuCisgICAgICoKKyAgICAgKiAgVGhlIHN5bmNocm9uaXphdGlvbiByZWZlcnJlZCB0byBpcyBAZSBvbmx5IHRoYXQgYmV0d2VlbiB0aGUgc3RhbmRhcmQKKyAgICAgKiAgQyBmYWNpbGl0aWVzIChlLmcuLCBzdGRvdXQpIGFuZCB0aGUgc3RhbmRhcmQgQysrIG9iamVjdHMgKGUuZy4sCisgICAgICogIGNvdXQpLiAgVXNlci1kZWNsYXJlZCBzdHJlYW1zIGFyZSB1bmFmZmVjdGVkLiAgU2VlCisgICAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MTFjaDI4czAyLmh0bWwKKyAgICAqLworICAgIHN0YXRpYyBib29sCisgICAgc3luY193aXRoX3N0ZGlvKGJvb2wgX19zeW5jID0gdHJ1ZSk7CisKKyAgICAvLyBbMjcuNC4yLjNdIGlvc19iYXNlIGxvY2FsZSBmdW5jdGlvbnMKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBTZXR0aW5nIGEgbmV3IGxvY2FsZS4KKyAgICAgKiAgQHBhcmFtICBfX2xvYyAgVGhlIG5ldyBsb2NhbGUuCisgICAgICogIEByZXR1cm4gIFRoZSBwcmV2aW91cyBsb2NhbGUuCisgICAgICoKKyAgICAgKiAgU2V0cyB0aGUgbmV3IGxvY2FsZSBmb3IgdGhpcyBzdHJlYW0sIGFuZCB0aGVuIGludm9rZXMgZWFjaCBjYWxsYmFjaworICAgICAqICB3aXRoIGltYnVlX2V2ZW50LgorICAgICovCisgICAgbG9jYWxlCisgICAgaW1idWUoY29uc3QgbG9jYWxlJiBfX2xvYykgdGhyb3coKTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIExvY2FsZSBhY2Nlc3MKKyAgICAgKiAgQHJldHVybiAgQSBjb3B5IG9mIHRoZSBjdXJyZW50IGxvY2FsZS4KKyAgICAgKgorICAgICAqICBJZiBAYyBpbWJ1ZShsb2MpIGhhcyBwcmV2aW91c2x5IGJlZW4gY2FsbGVkLCB0aGVuIHRoaXMgZnVuY3Rpb24KKyAgICAgKiAgcmV0dXJucyBAYyBsb2MuICBPdGhlcndpc2UsIGl0IHJldHVybnMgYSBjb3B5IG9mIEBjIHN0ZDo6bG9jYWxlKCksCisgICAgICogIHRoZSBnbG9iYWwgQysrIGxvY2FsZS4KKyAgICAqLworICAgIGxvY2FsZQorICAgIGdldGxvYygpIGNvbnN0CisgICAgeyByZXR1cm4gX01faW9zX2xvY2FsZTsgfQorCisgICAgLyoqCisgICAgICogIEBicmllZiAgTG9jYWxlIGFjY2VzcworICAgICAqICBAcmV0dXJuICBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBsb2NhbGUuCisgICAgICoKKyAgICAgKiAgTGlrZSBnZXRsb2MgYWJvdmUsIGJ1dCByZXR1cm5zIGEgcmVmZXJlbmNlIGluc3RlYWQgb2YKKyAgICAgKiAgZ2VuZXJhdGluZyBhIGNvcHkuCisgICAgKi8KKyAgICBjb25zdCBsb2NhbGUmCisgICAgX01fZ2V0bG9jKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9pb3NfbG9jYWxlOyB9CisKKyAgICAvLyBbMjcuNC4yLjVdIGlvc19iYXNlIHN0b3JhZ2UgZnVuY3Rpb25zCisgICAgLyoqCisgICAgICogIEBicmllZiAgQWNjZXNzIHRvIHVuaXF1ZSBpbmRpY2VzLgorICAgICAqICBAcmV0dXJuICBBbiBpbnRlZ2VyIGRpZmZlcmVudCBmcm9tIGFsbCBwcmV2aW91cyBjYWxscy4KKyAgICAgKgorICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSB1bmlxdWUgaW50ZWdlciBldmVyeSB0aW1lIGl0IGlzIGNhbGxlZC4gIEl0CisgICAgICogIGNhbiBiZSB1c2VkIGZvciBhbnkgcHVycG9zZSwgYnV0IGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byBiZSBhIHVuaXF1ZQorICAgICAqICBpbmRleCBmb3IgdGhlIGl3b3JkIGFuZCBwd29yZCBmdW5jdGlvbnMuICBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdCBhbgorICAgICAqICBhcHBsaWNhdGlvbiBjYWxscyB4YWxsb2MgaW4gb3JkZXIgdG8gb2J0YWluIGFuIGluZGV4IGluIHRoZSBpd29yZCBhbmQKKyAgICAgKiAgcHdvcmQgYXJyYXlzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aG91dCBmZWFyIG9mIGNvbmZsaWN0LgorICAgICAqCisgICAgICogIFRoZSBpbXBsZW1lbnRhdGlvbiBtYWludGFpbnMgYSBzdGF0aWMgdmFyaWFibGUgdGhhdCBpcyBpbmNyZW1lbnRlZCBhbmQKKyAgICAgKiAgcmV0dXJuZWQgb24gZWFjaCBpbnZvY2F0aW9uLiAgeGFsbG9jIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIGFuIGluZGV4CisgICAgICogIHRoYXQgaXMgc2FmZSB0byB1c2UgaW4gdGhlIGl3b3JkIGFuZCBwd29yZCBhcnJheXMuCisgICAgKi8KKyAgICBzdGF0aWMgaW50CisgICAgeGFsbG9jKCkgdGhyb3coKTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIEFjY2VzcyB0byBpbnRlZ2VyIGFycmF5LgorICAgICAqICBAcGFyYW0gIF9faXggIEluZGV4IGludG8gdGhlIGFycmF5LgorICAgICAqICBAcmV0dXJuICBBIHJlZmVyZW5jZSB0byBhbiBpbnRlZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5kZXguCisgICAgICoKKyAgICAgKiAgVGhlIGl3b3JkIGZ1bmN0aW9uIHByb3ZpZGVzIGFjY2VzcyB0byBhbiBhcnJheSBvZiBpbnRlZ2VycyB0aGF0IGNhbiBiZQorICAgICAqICB1c2VkIGZvciBhbnkgcHVycG9zZS4gIFRoZSBhcnJheSBncm93cyBhcyByZXF1aXJlZCB0byBob2xkIHRoZQorICAgICAqICBzdXBwbGllZCBpbmRleC4gIEFsbCBpbnRlZ2VycyBpbiB0aGUgYXJyYXkgYXJlIGluaXRpYWxpemVkIHRvIDAuCisgICAgICoKKyAgICAgKiAgVGhlIGltcGxlbWVudGF0aW9uIHJlc2VydmVzIHNldmVyYWwgaW5kaWNlcy4gIFlvdSBzaG91bGQgdXNlIHhhbGxvYyB0bworICAgICAqICBvYnRhaW4gYW4gaW5kZXggdGhhdCBpcyBzYWZlIHRvIHVzZS4gIEFsc28gbm90ZSB0aGF0IHNpbmNlIHRoZSBhcnJheQorICAgICAqICBjYW4gZ3JvdyBkeW5hbWljYWxseSwgaXQgaXMgbm90IHNhZmUgdG8gaG9sZCBvbnRvIHRoZSByZWZlcmVuY2UuCisgICAgKi8KKyAgICBsb25nJgorICAgIGl3b3JkKGludCBfX2l4KQorICAgIHsKKyAgICAgIF9Xb3JkcyYgX193b3JkID0gKF9faXggPCBfTV93b3JkX3NpemUpCisJCQk/IF9NX3dvcmRbX19peF0gOiBfTV9ncm93X3dvcmRzKF9faXgsIHRydWUpOworICAgICAgcmV0dXJuIF9fd29yZC5fTV9pd29yZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBBY2Nlc3MgdG8gdm9pZCBwb2ludGVyIGFycmF5LgorICAgICAqICBAcGFyYW0gIF9faXggIEluZGV4IGludG8gdGhlIGFycmF5LgorICAgICAqICBAcmV0dXJuICBBIHJlZmVyZW5jZSB0byBhIHZvaWQqIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5kZXguCisgICAgICoKKyAgICAgKiAgVGhlIHB3b3JkIGZ1bmN0aW9uIHByb3ZpZGVzIGFjY2VzcyB0byBhbiBhcnJheSBvZiBwb2ludGVycyB0aGF0IGNhbiBiZQorICAgICAqICB1c2VkIGZvciBhbnkgcHVycG9zZS4gIFRoZSBhcnJheSBncm93cyBhcyByZXF1aXJlZCB0byBob2xkIHRoZQorICAgICAqICBzdXBwbGllZCBpbmRleC4gIEFsbCBwb2ludGVycyBpbiB0aGUgYXJyYXkgYXJlIGluaXRpYWxpemVkIHRvIDAuCisgICAgICoKKyAgICAgKiAgVGhlIGltcGxlbWVudGF0aW9uIHJlc2VydmVzIHNldmVyYWwgaW5kaWNlcy4gIFlvdSBzaG91bGQgdXNlIHhhbGxvYyB0bworICAgICAqICBvYnRhaW4gYW4gaW5kZXggdGhhdCBpcyBzYWZlIHRvIHVzZS4gIEFsc28gbm90ZSB0aGF0IHNpbmNlIHRoZSBhcnJheQorICAgICAqICBjYW4gZ3JvdyBkeW5hbWljYWxseSwgaXQgaXMgbm90IHNhZmUgdG8gaG9sZCBvbnRvIHRoZSByZWZlcmVuY2UuCisgICAgKi8KKyAgICB2b2lkKiYKKyAgICBwd29yZChpbnQgX19peCkKKyAgICB7CisgICAgICBfV29yZHMmIF9fd29yZCA9IChfX2l4IDwgX01fd29yZF9zaXplKQorCQkJPyBfTV93b3JkW19faXhdIDogX01fZ3Jvd193b3JkcyhfX2l4LCBmYWxzZSk7CisgICAgICByZXR1cm4gX193b3JkLl9NX3B3b3JkOworICAgIH0KKworICAgIC8vIERlc3RydWN0b3IKKyAgICAvKioKKyAgICAgKiAgSW52b2tlcyBlYWNoIGNhbGxiYWNrIHdpdGggZXJhc2VfZXZlbnQuICBEZXN0cm95cyBsb2NhbCBzdG9yYWdlLgorICAgICAqCisgICAgICogIE5vdGUgdGhhdCB0aGUgaW9zX2Jhc2Ugb2JqZWN0IGZvciB0aGUgc3RhbmRhcmQgc3RyZWFtcyBuZXZlciBnZXRzCisgICAgICogIGRlc3Ryb3llZC4gIEFzIGEgcmVzdWx0LCBhbnkgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc3RhbmRhcmQKKyAgICAgKiAgc3RyZWFtcyB3aWxsIG5vdCBnZXQgaW52b2tlZCB3aXRoIGVyYXNlX2V2ZW50ICh1bmxlc3MgY29weWZtdCBpcworICAgICAqICB1c2VkKS4KKyAgICAqLworICAgIHZpcnR1YWwgfmlvc19iYXNlKCk7CisKKyAgcHJvdGVjdGVkOgorICAgIGlvc19iYXNlKCkgdGhyb3cgKCk7CisKKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyA1MC4gIENvcHkgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3Igb2YgaW9zX2Jhc2UKKyAgcHJpdmF0ZToKKyAgICBpb3NfYmFzZShjb25zdCBpb3NfYmFzZSYpOworCisgICAgaW9zX2Jhc2UmCisgICAgb3BlcmF0b3I9KGNvbnN0IGlvc19iYXNlJik7CisgIH07CisKKyAgLy8gWzI3LjQuNS4xXSBmbXRmbGFncyBtYW5pcHVsYXRvcnMKKyAgLy8vIENhbGxzIGJhc2Uuc2V0Zihpb3NfYmFzZTo6Ym9vbGFscGhhKS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBib29sYWxwaGEoaW9zX2Jhc2UmIF9fYmFzZSkKKyAgeworICAgIF9fYmFzZS5zZXRmKGlvc19iYXNlOjpib29sYWxwaGEpOworICAgIHJldHVybiBfX2Jhc2U7CisgIH0KKworICAvLy8gQ2FsbHMgYmFzZS51bnNldGYoaW9zX2Jhc2U6OmJvb2xhbHBoYSkuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgbm9ib29sYWxwaGEoaW9zX2Jhc2UmIF9fYmFzZSkKKyAgeworICAgIF9fYmFzZS51bnNldGYoaW9zX2Jhc2U6OmJvb2xhbHBoYSk7CisgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnNldGYoaW9zX2Jhc2U6OnNob3diYXNlKS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBzaG93YmFzZShpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OnNob3diYXNlKTsKKyAgICByZXR1cm4gX19iYXNlOworICB9CisKKyAgLy8vIENhbGxzIGJhc2UudW5zZXRmKGlvc19iYXNlOjpzaG93YmFzZSkuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgbm9zaG93YmFzZShpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnVuc2V0Zihpb3NfYmFzZTo6c2hvd2Jhc2UpOworICAgIHJldHVybiBfX2Jhc2U7CisgIH0KKworICAvLy8gQ2FsbHMgYmFzZS5zZXRmKGlvc19iYXNlOjpzaG93cG9pbnQpLgorICBpbmxpbmUgaW9zX2Jhc2UmCisgIHNob3dwb2ludChpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OnNob3dwb2ludCk7CisgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnVuc2V0Zihpb3NfYmFzZTo6c2hvd3BvaW50KS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBub3Nob3dwb2ludChpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnVuc2V0Zihpb3NfYmFzZTo6c2hvd3BvaW50KTsKKyAgICByZXR1cm4gX19iYXNlOworICB9CisKKyAgLy8vIENhbGxzIGJhc2Uuc2V0Zihpb3NfYmFzZTo6c2hvd3BvcykuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgc2hvd3Bvcyhpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OnNob3dwb3MpOworICAgIHJldHVybiBfX2Jhc2U7CisgIH0KKworICAvLy8gQ2FsbHMgYmFzZS51bnNldGYoaW9zX2Jhc2U6OnNob3dwb3MpLgorICBpbmxpbmUgaW9zX2Jhc2UmCisgIG5vc2hvd3Bvcyhpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnVuc2V0Zihpb3NfYmFzZTo6c2hvd3Bvcyk7CisgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnNldGYoaW9zX2Jhc2U6OnNraXB3cykuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgc2tpcHdzKGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICBfX2Jhc2Uuc2V0Zihpb3NfYmFzZTo6c2tpcHdzKTsKKyAgICByZXR1cm4gX19iYXNlOworICB9CisKKyAgLy8vIENhbGxzIGJhc2UudW5zZXRmKGlvc19iYXNlOjpza2lwd3MpLgorICBpbmxpbmUgaW9zX2Jhc2UmCisgIG5vc2tpcHdzKGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICBfX2Jhc2UudW5zZXRmKGlvc19iYXNlOjpza2lwd3MpOworICAgIHJldHVybiBfX2Jhc2U7CisgIH0KKworICAvLy8gQ2FsbHMgYmFzZS5zZXRmKGlvc19iYXNlOjp1cHBlcmNhc2UpLgorICBpbmxpbmUgaW9zX2Jhc2UmCisgIHVwcGVyY2FzZShpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OnVwcGVyY2FzZSk7CisgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnVuc2V0Zihpb3NfYmFzZTo6dXBwZXJjYXNlKS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBub3VwcGVyY2FzZShpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnVuc2V0Zihpb3NfYmFzZTo6dXBwZXJjYXNlKTsKKyAgICByZXR1cm4gX19iYXNlOworICB9CisKKyAgLy8vIENhbGxzIGJhc2Uuc2V0Zihpb3NfYmFzZTo6dW5pdGJ1ZikuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgdW5pdGJ1Zihpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgIF9fYmFzZS5zZXRmKGlvc19iYXNlOjp1bml0YnVmKTsKKyAgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnVuc2V0Zihpb3NfYmFzZTo6dW5pdGJ1ZikuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgbm91bml0YnVmKGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICAgX19iYXNlLnVuc2V0Zihpb3NfYmFzZTo6dW5pdGJ1Zik7CisgICAgIHJldHVybiBfX2Jhc2U7CisgIH0KKworICAvLyBbMjcuNC41LjJdIGFkanVzdGZpZWxkIG1hbmlwdWxhdG9ycworICAvLy8gQ2FsbHMgYmFzZS5zZXRmKGlvc19iYXNlOjppbnRlcm5hbCwgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBpbnRlcm5hbChpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgIF9fYmFzZS5zZXRmKGlvc19iYXNlOjppbnRlcm5hbCwgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKTsKKyAgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnNldGYoaW9zX2Jhc2U6OmxlZnQsIGlvc19iYXNlOjphZGp1c3RmaWVsZCkuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgbGVmdChpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OmxlZnQsIGlvc19iYXNlOjphZGp1c3RmaWVsZCk7CisgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnNldGYoaW9zX2Jhc2U6OnJpZ2h0LCBpb3NfYmFzZTo6YWRqdXN0ZmllbGQpLgorICBpbmxpbmUgaW9zX2Jhc2UmCisgIHJpZ2h0KGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICBfX2Jhc2Uuc2V0Zihpb3NfYmFzZTo6cmlnaHQsIGlvc19iYXNlOjphZGp1c3RmaWVsZCk7CisgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vIFsyNy40LjUuM10gYmFzZWZpZWxkIG1hbmlwdWxhdG9ycworICAvLy8gQ2FsbHMgYmFzZS5zZXRmKGlvc19iYXNlOjpkZWMsIGlvc19iYXNlOjpiYXNlZmllbGQpLgorICBpbmxpbmUgaW9zX2Jhc2UmCisgIGRlYyhpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OmRlYywgaW9zX2Jhc2U6OmJhc2VmaWVsZCk7CisgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnNldGYoaW9zX2Jhc2U6OmhleCwgaW9zX2Jhc2U6OmJhc2VmaWVsZCkuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgaGV4KGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICBfX2Jhc2Uuc2V0Zihpb3NfYmFzZTo6aGV4LCBpb3NfYmFzZTo6YmFzZWZpZWxkKTsKKyAgICByZXR1cm4gX19iYXNlOworICB9CisKKyAgLy8vIENhbGxzIGJhc2Uuc2V0Zihpb3NfYmFzZTo6b2N0LCBpb3NfYmFzZTo6YmFzZWZpZWxkKS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBvY3QoaW9zX2Jhc2UmIF9fYmFzZSkKKyAgeworICAgIF9fYmFzZS5zZXRmKGlvc19iYXNlOjpvY3QsIGlvc19iYXNlOjpiYXNlZmllbGQpOworICAgIHJldHVybiBfX2Jhc2U7CisgIH0KKworICAvLyBbMjcuNC41LjRdIGZsb2F0ZmllbGQgbWFuaXB1bGF0b3JzCisgIC8vLyBDYWxscyBiYXNlLnNldGYoaW9zX2Jhc2U6OmZpeGVkLCBpb3NfYmFzZTo6ZmxvYXRmaWVsZCkuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgZml4ZWQoaW9zX2Jhc2UmIF9fYmFzZSkKKyAgeworICAgIF9fYmFzZS5zZXRmKGlvc19iYXNlOjpmaXhlZCwgaW9zX2Jhc2U6OmZsb2F0ZmllbGQpOworICAgIHJldHVybiBfX2Jhc2U7CisgIH0KKworICAvLy8gQ2FsbHMgYmFzZS5zZXRmKGlvc19iYXNlOjpzY2llbnRpZmljLCBpb3NfYmFzZTo6ZmxvYXRmaWVsZCkuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgc2NpZW50aWZpYyhpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OnNjaWVudGlmaWMsIGlvc19iYXNlOjpmbG9hdGZpZWxkKTsKKyAgICByZXR1cm4gX19iYXNlOworICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9JT1NfQkFTRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvaXN0cmVhbS50Y2MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvaXN0cmVhbS50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEwNzMwMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9pc3RyZWFtLnRjYwpAQCAtMCwwICsxLDEwOTIgQEAKKy8vIGlzdHJlYW0gY2xhc3NlcyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9pc3RyZWFtLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2lzdHJlYW19CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDI3LjYuMSAgSW5wdXQgc3RyZWFtcworLy8KKworI2lmbmRlZiBfSVNUUkVBTV9UQ0MKKyNkZWZpbmUgX0lTVFJFQU1fVENDIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jeHhhYmlfZm9yY2VkLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnk6OgorICAgIHNlbnRyeShiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faW4sIGJvb2wgX19ub3NraXApIDogX01fb2soZmFsc2UpCisgICAgeworICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgIGlmIChfX2luLmdvb2QoKSkKKwl7CisJICBpZiAoX19pbi50aWUoKSkKKwkgICAgX19pbi50aWUoKS0+Zmx1c2goKTsKKwkgIGlmICghX19ub3NraXAgJiYgYm9vbChfX2luLmZsYWdzKCkgJiBpb3NfYmFzZTo6c2tpcHdzKSkKKwkgICAgeworCSAgICAgIGNvbnN0IF9faW50X3R5cGUgX19lb2YgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisJICAgICAgX19zdHJlYW1idWZfdHlwZSogX19zYiA9IF9faW4ucmRidWYoKTsKKwkgICAgICBfX2ludF90eXBlIF9fYyA9IF9fc2ItPnNnZXRjKCk7CisKKwkgICAgICBjb25zdCBfX2N0eXBlX3R5cGUmIF9fY3QgPSBfX2NoZWNrX2ZhY2V0KF9faW4uX01fY3R5cGUpOworCSAgICAgIHdoaWxlICghdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19lb2YpCisJCSAgICAgJiYgX19jdC5pcyhjdHlwZV9iYXNlOjpzcGFjZSwgCisJCQkJdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpKSkKKwkJX19jID0gX19zYi0+c25leHRjKCk7CisKKwkgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAgICAgLy8gMTk1LiBTaG91bGQgYmFzaWNfaXN0cmVhbTo6c2VudHJ5J3MgY29uc3RydWN0b3IgZXZlcgorCSAgICAgIC8vIHNldCBlb2ZiaXQ/CisJICAgICAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKSkKKwkJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKwkgICAgfQorCX0KKworICAgICAgaWYgKF9faW4uZ29vZCgpICYmIF9fZXJyID09IGlvc19iYXNlOjpnb29kYml0KQorCV9NX29rID0gdHJ1ZTsKKyAgICAgIGVsc2UKKwl7CisJICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKwkgIF9faW4uc2V0c3RhdGUoX19lcnIpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZVQ+CisgICAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgICAgX01fZXh0cmFjdChfVmFsdWVUJiBfX3YpCisgICAgICB7CisJc2VudHJ5IF9fY2VyYigqdGhpcywgZmFsc2UpOworCWlmIChfX2NlcmIpCisJICB7CisJICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisJICAgIF9fdHJ5CisJICAgICAgeworCQljb25zdCBfX251bV9nZXRfdHlwZSYgX19uZyA9IF9fY2hlY2tfZmFjZXQodGhpcy0+X01fbnVtX2dldCk7CisJCV9fbmcuZ2V0KCp0aGlzLCAwLCAqdGhpcywgX19lcnIsIF9fdik7CisJICAgICAgfQorCSAgICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgICAgeworCQl0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkJX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgICAgfQorCSAgICBfX2NhdGNoKC4uLikKKwkgICAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJICAgIGlmIChfX2VycikKKwkgICAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisJICB9CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBvcGVyYXRvcj4+KHNob3J0JiBfX24pCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTE4LiBiYXNpY19pc3RyZWFtIHVzZXMgbm9uZXhpc3RlbnQgbnVtX2dldCBtZW1iZXIgZnVuY3Rpb25zLgorICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywgZmFsc2UpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIGxvbmcgX19sOworCSAgICAgIGNvbnN0IF9fbnVtX2dldF90eXBlJiBfX25nID0gX19jaGVja19mYWNldCh0aGlzLT5fTV9udW1fZ2V0KTsKKwkgICAgICBfX25nLmdldCgqdGhpcywgMCwgKnRoaXMsIF9fZXJyLCBfX2wpOworCisJICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgICAgIC8vIDY5Ni4gaXN0cmVhbTo6b3BlcmF0b3I+PihpbnQmKSBicm9rZW4uCisJICAgICAgaWYgKF9fbCA8IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxzaG9ydD46Ol9fbWluKQorCQl7CisJCSAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJCSAgX19uID0gX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPHNob3J0Pjo6X19taW47CisJCX0KKwkgICAgICBlbHNlIGlmIChfX2wgPiBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8c2hvcnQ+OjpfX21heCkKKwkJeworCQkgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCQkgIF9fbiA9IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxzaG9ydD46Ol9fbWF4OworCQl9CisJICAgICAgZWxzZQorCQlfX24gPSBzaG9ydChfX2wpOworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwkgIGlmIChfX2VycikKKwkgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIG9wZXJhdG9yPj4oaW50JiBfX24pCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTE4LiBiYXNpY19pc3RyZWFtIHVzZXMgbm9uZXhpc3RlbnQgbnVtX2dldCBtZW1iZXIgZnVuY3Rpb25zLgorICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywgZmFsc2UpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIGxvbmcgX19sOworCSAgICAgIGNvbnN0IF9fbnVtX2dldF90eXBlJiBfX25nID0gX19jaGVja19mYWNldCh0aGlzLT5fTV9udW1fZ2V0KTsKKwkgICAgICBfX25nLmdldCgqdGhpcywgMCwgKnRoaXMsIF9fZXJyLCBfX2wpOworCisJICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgICAgIC8vIDY5Ni4gaXN0cmVhbTo6b3BlcmF0b3I+PihpbnQmKSBicm9rZW4uCisJICAgICAgaWYgKF9fbCA8IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxpbnQ+OjpfX21pbikKKwkJeworCQkgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCQkgIF9fbiA9IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxpbnQ+OjpfX21pbjsKKwkJfQorCSAgICAgIGVsc2UgaWYgKF9fbCA+IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxpbnQ+OjpfX21heCkKKwkJeworCQkgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OwkgICAgICAKKwkJICBfX24gPSBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8aW50Pjo6X19tYXg7CisJCX0KKwkgICAgICBlbHNlCisJCV9fbiA9IGludChfX2wpOworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwkgIGlmIChfX2VycikKKwkgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIG9wZXJhdG9yPj4oX19zdHJlYW1idWZfdHlwZSogX19zYm91dCkKKyAgICB7CisgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywgZmFsc2UpOworICAgICAgaWYgKF9fY2VyYiAmJiBfX3Nib3V0KQorCXsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBib29sIF9faW5lb2Y7CisJICAgICAgaWYgKCFfX2NvcHlfc3RyZWFtYnVmc19lb2YodGhpcy0+cmRidWYoKSwgX19zYm91dCwgX19pbmVvZikpCisJCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCSAgICAgIGlmIChfX2luZW9mKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsgfQorCX0KKyAgICAgIGVsc2UgaWYgKCFfX3Nib3V0KQorCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgaWYgKF9fZXJyKQorCXRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6aW50X3R5cGUKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIGdldCh2b2lkKQorICAgIHsKKyAgICAgIGNvbnN0IGludF90eXBlIF9fZW9mID0gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgaW50X3R5cGUgX19jID0gX19lb2Y7CisgICAgICBfTV9nY291bnQgPSAwOworICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgX19jID0gdGhpcy0+cmRidWYoKS0+c2J1bXBjKCk7CisJICAgICAgLy8gMjcuNi4xLjEgcGFyYWdyYXBoIDMKKwkgICAgICBpZiAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKSkKKwkJX01fZ2NvdW50ID0gMTsKKwkgICAgICBlbHNlCisJCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCX0KKyAgICAgIGlmICghX01fZ2NvdW50KQorCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgaWYgKF9fZXJyKQorCXRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgIHJldHVybiBfX2M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBnZXQoY2hhcl90eXBlJiBfX2MpCisgICAgeworICAgICAgX01fZ2NvdW50ID0gMDsKKyAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgX190cnkKKwkgICAgeworCSAgICAgIGNvbnN0IGludF90eXBlIF9fY2IgPSB0aGlzLT5yZGJ1ZigpLT5zYnVtcGMoKTsKKwkgICAgICAvLyAyNy42LjEuMSBwYXJhZ3JhcGggMworCSAgICAgIGlmICghdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fY2IsIHRyYWl0c190eXBlOjplb2YoKSkpCisJCXsKKwkJICBfTV9nY291bnQgPSAxOworCQkgIF9fYyA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jYik7CisJCX0KKwkgICAgICBlbHNlCisJCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCX0KKyAgICAgIGlmICghX01fZ2NvdW50KQorCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgaWYgKF9fZXJyKQorCXRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIGdldChjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24sIGNoYXJfdHlwZSBfX2RlbGltKQorICAgIHsKKyAgICAgIF9NX2djb3VudCA9IDA7CisgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywgdHJ1ZSk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBjb25zdCBpbnRfdHlwZSBfX2lkZWxpbSA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZShfX2RlbGltKTsKKwkgICAgICBjb25zdCBpbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKwkgICAgICBfX3N0cmVhbWJ1Zl90eXBlKiBfX3NiID0gdGhpcy0+cmRidWYoKTsKKwkgICAgICBpbnRfdHlwZSBfX2MgPSBfX3NiLT5zZ2V0YygpOworCisJICAgICAgd2hpbGUgKF9NX2djb3VudCArIDEgPCBfX24KKwkJICAgICAmJiAhdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19lb2YpCisJCSAgICAgJiYgIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9faWRlbGltKSkKKwkJeworCQkgICpfX3MrKyA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKTsKKwkJICArK19NX2djb3VudDsKKwkJICBfX2MgPSBfX3NiLT5zbmV4dGMoKTsKKwkJfQorCSAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikpCisJCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCX0KKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDI0My4gZ2V0IGFuZCBnZXRsaW5lIHdoZW4gc2VudHJ5IHJlcG9ydHMgZmFpbHVyZS4KKyAgICAgIGlmIChfX24gPiAwKQorCSpfX3MgPSBjaGFyX3R5cGUoKTsKKyAgICAgIGlmICghX01fZ2NvdW50KQorCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgaWYgKF9fZXJyKQorCXRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIGdldChfX3N0cmVhbWJ1Zl90eXBlJiBfX3NiLCBjaGFyX3R5cGUgX19kZWxpbSkKKyAgICB7CisgICAgICBfTV9nY291bnQgPSAwOworICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgY29uc3QgaW50X3R5cGUgX19pZGVsaW0gPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoX19kZWxpbSk7CisJICAgICAgY29uc3QgaW50X3R5cGUgX19lb2YgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisJICAgICAgX19zdHJlYW1idWZfdHlwZSogX190aGlzX3NiID0gdGhpcy0+cmRidWYoKTsKKwkgICAgICBpbnRfdHlwZSBfX2MgPSBfX3RoaXNfc2ItPnNnZXRjKCk7CisJICAgICAgY2hhcl90eXBlIF9fYzIgPSB0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYyk7CisKKwkgICAgICB3aGlsZSAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKQorCQkgICAgICYmICF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2lkZWxpbSkKKwkJICAgICAmJiAhdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fc2Iuc3B1dGMoX19jMiksIF9fZW9mKSkKKwkJeworCQkgICsrX01fZ2NvdW50OworCQkgIF9fYyA9IF9fdGhpc19zYi0+c25leHRjKCk7CisJCSAgX19jMiA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKTsKKwkJfQorCSAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikpCisJCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCX0KKyAgICAgIGlmICghX01fZ2NvdW50KQorCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgaWYgKF9fZXJyKQorCXRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIGdldGxpbmUoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uLCBjaGFyX3R5cGUgX19kZWxpbSkKKyAgICB7CisgICAgICBfTV9nY291bnQgPSAwOworICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYikKKyAgICAgICAgeworICAgICAgICAgIF9fdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IGludF90eXBlIF9faWRlbGltID0gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKF9fZGVsaW0pOworICAgICAgICAgICAgICBjb25zdCBpbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgICAgICAgICAgX19zdHJlYW1idWZfdHlwZSogX19zYiA9IHRoaXMtPnJkYnVmKCk7CisgICAgICAgICAgICAgIGludF90eXBlIF9fYyA9IF9fc2ItPnNnZXRjKCk7CisKKyAgICAgICAgICAgICAgd2hpbGUgKF9NX2djb3VudCArIDEgPCBfX24KKyAgICAgICAgICAgICAgICAgICAgICYmICF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikKKyAgICAgICAgICAgICAgICAgICAgICYmICF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2lkZWxpbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgKl9fcysrID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpOworICAgICAgICAgICAgICAgICAgX19jID0gX19zYi0+c25leHRjKCk7CisgICAgICAgICAgICAgICAgICArK19NX2djb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikpCisgICAgICAgICAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2lkZWxpbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBfX3NiLT5zYnVtcGMoKTsKKyAgICAgICAgICAgICAgICAgICAgICArK19NX2djb3VudDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorICAgICAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICAgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorICAgICAgICB9CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyNDMuIGdldCBhbmQgZ2V0bGluZSB3aGVuIHNlbnRyeSByZXBvcnRzIGZhaWx1cmUuCisgICAgICBpZiAoX19uID4gMCkKKwkqX19zID0gY2hhcl90eXBlKCk7CisgICAgICBpZiAoIV9NX2djb3VudCkKKyAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICBpZiAoX19lcnIpCisgICAgICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgLy8gV2UgcHJvdmlkZSB0aHJlZSBvdmVybG9hZHMsIHNpbmNlIHRoZSBmaXJzdCB0d28gYXJlIG11Y2ggc2ltcGxlcgorICAvLyB0aGFuIHRoZSBnZW5lcmFsIGNhc2UuIEFsc28sIHRoZSBsYXR0ZXIgdHdvIGNhbiB0aHVzIGFkb3B0IHRoZQorICAvLyBzYW1lICJiYXRjaHkiIHN0cmF0ZWd5IHVzZWQgYnkgZ2V0bGluZSBhYm92ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIGlnbm9yZSh2b2lkKQorICAgIHsKKyAgICAgIF9NX2djb3VudCA9IDA7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBjb25zdCBpbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKwkgICAgICBfX3N0cmVhbWJ1Zl90eXBlKiBfX3NiID0gdGhpcy0+cmRidWYoKTsKKworCSAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19zYi0+c2J1bXBjKCksIF9fZW9mKSkKKwkJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKwkgICAgICBlbHNlCisJCV9NX2djb3VudCA9IDE7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCSAgaWYgKF9fZXJyKQorCSAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgaWdub3JlKHN0cmVhbXNpemUgX19uKQorICAgIHsKKyAgICAgIF9NX2djb3VudCA9IDA7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIgJiYgX19uID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICAgICAgX190cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29uc3QgaW50X3R5cGUgX19lb2YgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgICAgICAgICAgIF9fc3RyZWFtYnVmX3R5cGUqIF9fc2IgPSB0aGlzLT5yZGJ1ZigpOworICAgICAgICAgICAgICBpbnRfdHlwZSBfX2MgPSBfX3NiLT5zZ2V0YygpOworCisJICAgICAgLy8gTi5CLiBPbiBMRlMtZW5hYmxlZCBwbGF0Zm9ybXMgc3RyZWFtc2l6ZSBpcyBzdGlsbCAzMiBiaXRzCisJICAgICAgLy8gd2lkZTogaWYgd2Ugd2FudCB0byBpbXBsZW1lbnQgdGhlIHN0YW5kYXJkIG1hbmRhdGVkIGJlaGF2aW9yCisJICAgICAgLy8gZm9yIG4gPT0gbWF4KCkgKHNlZSAyNy42LjEuMy8yNCkgd2UgYXJlIGF0IHJpc2sgb2Ygc2lnbmVkCisJICAgICAgLy8gaW50ZWdlciBvdmVyZmxvdzogdGh1cyB0aGVzZSBjb250b3J0aW9ucy4gQWxzbyBub3RlIHRoYXQsCisJICAgICAgLy8gYnkgZGVmaW5pdGlvbiwgd2hlbiBtb3JlIHRoYW4gMkcgY2hhcnMgYXJlIGFjdHVhbGx5IGlnbm9yZWQsCisJICAgICAgLy8gX01fZ2NvdW50ICh0aGUgcmV0dXJuIHZhbHVlIG9mIGdjb3VudCwgdGhhdCBpcykgY2Fubm90IGJlCisJICAgICAgLy8gcmVhbGx5IGNvcnJlY3QsIGJlaW5nIHVuYXZvaWRhYmx5IHRvbyBzbWFsbC4KKwkgICAgICBib29sIF9fbGFyZ2VfaWdub3JlID0gZmFsc2U7CisJICAgICAgd2hpbGUgKHRydWUpCisJCXsKKwkJICB3aGlsZSAoX01fZ2NvdW50IDwgX19uCisJCQkgJiYgIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKSkKKwkJICAgIHsKKwkJICAgICAgKytfTV9nY291bnQ7CisJCSAgICAgIF9fYyA9IF9fc2ItPnNuZXh0YygpOworCQkgICAgfQorCQkgIGlmIChfX24gPT0gX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPHN0cmVhbXNpemU+OjpfX21heAorCQkgICAgICAmJiAhdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKQorCQkgICAgeworCQkgICAgICBfTV9nY291bnQgPQorCQkJX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPHN0cmVhbXNpemU+OjpfX21pbjsKKwkJICAgICAgX19sYXJnZV9pZ25vcmUgPSB0cnVlOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIGJyZWFrOworCQl9CisKKwkgICAgICBpZiAoX19sYXJnZV9pZ25vcmUpCisJCV9NX2djb3VudCA9IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxzdHJlYW1zaXplPjo6X19tYXg7CisKKwkgICAgICBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKQorICAgICAgICAgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgICAgICAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorICAgICAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICAgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorICAgICAgICAgIGlmIChfX2VycikKKyAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgaWdub3JlKHN0cmVhbXNpemUgX19uLCBpbnRfdHlwZSBfX2RlbGltKQorICAgIHsKKyAgICAgIF9NX2djb3VudCA9IDA7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIgJiYgX19uID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICAgICAgX190cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29uc3QgaW50X3R5cGUgX19lb2YgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgICAgICAgICAgIF9fc3RyZWFtYnVmX3R5cGUqIF9fc2IgPSB0aGlzLT5yZGJ1ZigpOworICAgICAgICAgICAgICBpbnRfdHlwZSBfX2MgPSBfX3NiLT5zZ2V0YygpOworCisJICAgICAgLy8gU2VlIGNvbW1lbnQgYWJvdmUuCisJICAgICAgYm9vbCBfX2xhcmdlX2lnbm9yZSA9IGZhbHNlOworCSAgICAgIHdoaWxlICh0cnVlKQorCQl7CisJCSAgd2hpbGUgKF9NX2djb3VudCA8IF9fbgorCQkJICYmICF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikKKwkJCSAmJiAhdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19kZWxpbSkpCisJCSAgICB7CisJCSAgICAgICsrX01fZ2NvdW50OworCQkgICAgICBfX2MgPSBfX3NiLT5zbmV4dGMoKTsKKwkJICAgIH0KKwkJICBpZiAoX19uID09IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxzdHJlYW1zaXplPjo6X19tYXgKKwkJICAgICAgJiYgIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKQorCQkgICAgICAmJiAhdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19kZWxpbSkpCisJCSAgICB7CisJCSAgICAgIF9NX2djb3VudCA9CisJCQlfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8c3RyZWFtc2l6ZT46Ol9fbWluOworCQkgICAgICBfX2xhcmdlX2lnbm9yZSA9IHRydWU7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgYnJlYWs7CisJCX0KKworCSAgICAgIGlmIChfX2xhcmdlX2lnbm9yZSkKKwkJX01fZ2NvdW50ID0gX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPHN0cmVhbXNpemU+OjpfX21heDsKKworICAgICAgICAgICAgICBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKQorICAgICAgICAgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisJICAgICAgZWxzZSBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19kZWxpbSkpCisJCXsKKwkJICBpZiAoX01fZ2NvdW50CisJCSAgICAgIDwgX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPHN0cmVhbXNpemU+OjpfX21heCkKKwkJICAgICsrX01fZ2NvdW50OworCQkgIF9fc2ItPnNidW1wYygpOworCQl9CisgICAgICAgICAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorICAgICAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICAgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorICAgICAgICAgIGlmIChfX2VycikKKyAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZQorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgcGVlayh2b2lkKQorICAgIHsKKyAgICAgIGludF90eXBlIF9fYyA9IHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgIF9NX2djb3VudCA9IDA7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBfX2MgPSB0aGlzLT5yZGJ1ZigpLT5zZ2V0YygpOworCSAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwkgIGlmIChfX2VycikKKwkgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworCX0KKyAgICAgIHJldHVybiBfX2M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICByZWFkKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICB7CisgICAgICBfTV9nY291bnQgPSAwOworICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywgdHJ1ZSk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgX01fZ2NvdW50ID0gdGhpcy0+cmRidWYoKS0+c2dldG4oX19zLCBfX24pOworCSAgICAgIGlmIChfTV9nY291bnQgIT0gX19uKQorCQlfX2VyciB8PSAoaW9zX2Jhc2U6OmVvZmJpdCB8IGlvc19iYXNlOjpmYWlsYml0KTsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJICBpZiAoX19lcnIpCisJICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdHJlYW1zaXplCisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICByZWFkc29tZShjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pCisgICAgeworICAgICAgX01fZ2NvdW50ID0gMDsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIC8vIENhbm5vdCBjb21wYXJlIGludF90eXBlIHdpdGggc3RyZWFtc2l6ZSBnZW5lcmljYWxseS4KKwkgICAgICBjb25zdCBzdHJlYW1zaXplIF9fbnVtID0gdGhpcy0+cmRidWYoKS0+aW5fYXZhaWwoKTsKKwkgICAgICBpZiAoX19udW0gPiAwKQorCQlfTV9nY291bnQgPSB0aGlzLT5yZGJ1ZigpLT5zZ2V0bihfX3MsIHN0ZDo6bWluKF9fbnVtLCBfX24pKTsKKwkgICAgICBlbHNlIGlmIChfX251bSA9PSAtMSkKKwkJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJICBpZiAoX19lcnIpCisJICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKwl9CisgICAgICByZXR1cm4gX01fZ2NvdW50OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgcHV0YmFjayhjaGFyX3R5cGUgX19jKQorICAgIHsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDYwLiBXaGF0IGlzIGEgZm9ybWF0dGVkIGlucHV0IGZ1bmN0aW9uPworICAgICAgX01fZ2NvdW50ID0gMDsKKyAgICAgIC8vIENsZWFyIGVvZmJpdCBwZXIgTjMxNjguCisgICAgICB0aGlzLT5jbGVhcih0aGlzLT5yZHN0YXRlKCkgJiB+aW9zX2Jhc2U6OmVvZmJpdCk7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBjb25zdCBpbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKwkgICAgICBfX3N0cmVhbWJ1Zl90eXBlKiBfX3NiID0gdGhpcy0+cmRidWYoKTsKKwkgICAgICBpZiAoIV9fc2IKKwkJICB8fCB0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19zYi0+c3B1dGJhY2tjKF9fYyksIF9fZW9mKSkKKwkJX19lcnIgfD0gaW9zX2Jhc2U6OmJhZGJpdDsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJICBpZiAoX19lcnIpCisJICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICB1bmdldCh2b2lkKQorICAgIHsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDYwLiBXaGF0IGlzIGEgZm9ybWF0dGVkIGlucHV0IGZ1bmN0aW9uPworICAgICAgX01fZ2NvdW50ID0gMDsKKyAgICAgIC8vIENsZWFyIGVvZmJpdCBwZXIgTjMxNjguCisgICAgICB0aGlzLT5jbGVhcih0aGlzLT5yZHN0YXRlKCkgJiB+aW9zX2Jhc2U6OmVvZmJpdCk7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBjb25zdCBpbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKwkgICAgICBfX3N0cmVhbWJ1Zl90eXBlKiBfX3NiID0gdGhpcy0+cmRidWYoKTsKKwkgICAgICBpZiAoIV9fc2IKKwkJICB8fCB0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19zYi0+c3VuZ2V0YygpLCBfX2VvZikpCisJCV9fZXJyIHw9IGlvc19iYXNlOjpiYWRiaXQ7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCSAgaWYgKF9fZXJyKQorCSAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW50CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBzeW5jKHZvaWQpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFI2MC4gIERvIG5vdCBjaGFuZ2UgX01fZ2NvdW50LgorICAgICAgaW50IF9fcmV0ID0gLTE7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBfX3N0cmVhbWJ1Zl90eXBlKiBfX3NiID0gdGhpcy0+cmRidWYoKTsKKwkgICAgICBpZiAoX19zYikKKwkJeworCQkgIGlmIChfX3NiLT5wdWJzeW5jKCkgPT0gLTEpCisJCSAgICBfX2VyciB8PSBpb3NfYmFzZTo6YmFkYml0OworCQkgIGVsc2UKKwkJICAgIF9fcmV0ID0gMDsKKwkJfQorCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwkgIGlmIChfX2VycikKKwkgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworCX0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6cG9zX3R5cGUKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHRlbGxnKHZvaWQpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFI2MC4gIERvIG5vdCBjaGFuZ2UgX01fZ2NvdW50LgorICAgICAgcG9zX3R5cGUgX19yZXQgPSBwb3NfdHlwZSgtMSk7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgX190cnkKKwkgICAgeworCSAgICAgIGlmICghdGhpcy0+ZmFpbCgpKQorCQlfX3JldCA9IHRoaXMtPnJkYnVmKCktPnB1YnNlZWtvZmYoMCwgaW9zX2Jhc2U6OmN1ciwKKwkJCQkJCSAgaW9zX2Jhc2U6OmluKTsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgc2Vla2cocG9zX3R5cGUgX19wb3MpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFI2MC4gIERvIG5vdCBjaGFuZ2UgX01fZ2NvdW50LgorICAgICAgLy8gQ2xlYXIgZW9mYml0IHBlciBOMzE2OC4KKyAgICAgIHRoaXMtPmNsZWFyKHRoaXMtPnJkc3RhdGUoKSAmIH5pb3NfYmFzZTo6ZW9mYml0KTsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIGlmICghdGhpcy0+ZmFpbCgpKQorCQl7CisJCSAgLy8gMTM2LiAgc2Vla3AsIHNlZWtnIHNldHRpbmcgd3Jvbmcgc3RyZWFtcz8KKwkJICBjb25zdCBwb3NfdHlwZSBfX3AgPSB0aGlzLT5yZGJ1ZigpLT5wdWJzZWVrcG9zKF9fcG9zLAorCQkJCQkJCQkgaW9zX2Jhc2U6OmluKTsKKwkJICAKKwkJICAvLyAxMjkuICBOZWVkIGVycm9yIGluZGljYXRpb24gZnJvbSBzZWVrcCgpIGFuZCBzZWVrZygpCisJCSAgaWYgKF9fcCA9PSBwb3NfdHlwZShvZmZfdHlwZSgtMSkpKQorCQkgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJCX0KKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJICBpZiAoX19lcnIpCisJICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBzZWVrZyhvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX19kaXIpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFI2MC4gIERvIG5vdCBjaGFuZ2UgX01fZ2NvdW50LgorICAgICAgLy8gQ2xlYXIgZW9mYml0IHBlciBOMzE2OC4KKyAgICAgIHRoaXMtPmNsZWFyKHRoaXMtPnJkc3RhdGUoKSAmIH5pb3NfYmFzZTo6ZW9mYml0KTsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIGlmICghdGhpcy0+ZmFpbCgpKQorCQl7CisJCSAgLy8gMTM2LiAgc2Vla3AsIHNlZWtnIHNldHRpbmcgd3Jvbmcgc3RyZWFtcz8KKwkJICBjb25zdCBwb3NfdHlwZSBfX3AgPSB0aGlzLT5yZGJ1ZigpLT5wdWJzZWVrb2ZmKF9fb2ZmLCBfX2RpciwKKwkJCQkJCQkJIGlvc19iYXNlOjppbik7CisJICAgICAgCisJCSAgLy8gMTI5LiAgTmVlZCBlcnJvciBpbmRpY2F0aW9uIGZyb20gc2Vla3AoKSBhbmQgc2Vla2coKQorCQkgIGlmIChfX3AgPT0gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKSkKKwkJICAgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCQl9CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCSAgaWYgKF9fZXJyKQorCSAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAvLyAyNy42LjEuMi4zIENoYXJhY3RlciBleHRyYWN0aW9uIHRlbXBsYXRlcworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2luLCBfQ2hhclQmIF9fYykKKyAgICB7CisgICAgICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPgkJX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppbnRfdHlwZSAgICAgICAgIF9faW50X3R5cGU7CisKKyAgICAgIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjpzZW50cnkgX19jZXJiKF9faW4sIGZhbHNlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBjb25zdCBfX2ludF90eXBlIF9fY2IgPSBfX2luLnJkYnVmKCktPnNidW1wYygpOworCSAgICAgIGlmICghX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jYiwgX1RyYWl0czo6ZW9mKCkpKQorCQlfX2MgPSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jYik7CisJICAgICAgZWxzZQorCQlfX2VyciB8PSAoaW9zX2Jhc2U6OmVvZmJpdCB8IGlvc19iYXNlOjpmYWlsYml0KTsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgX19pbi5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgX19pbi5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCSAgaWYgKF9fZXJyKQorCSAgICBfX2luLnNldHN0YXRlKF9fZXJyKTsKKwl9CisgICAgICByZXR1cm4gX19pbjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pbiwgX0NoYXJUKiBfX3MpCisgICAgeworICAgICAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4JCV9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICBfX3N0cmVhbWJ1Zl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZQkJaW50X3R5cGU7CisgICAgICB0eXBlZGVmIF9DaGFyVAkJCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBjdHlwZTxfQ2hhclQ+CQkJCV9fY3R5cGVfdHlwZTsKKworICAgICAgc3RyZWFtc2l6ZSBfX2V4dHJhY3RlZCA9IDA7CisgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6OnNlbnRyeSBfX2NlcmIoX19pbiwgZmFsc2UpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgLy8gRmlndXJlIG91dCBob3cgbWFueSBjaGFyYWN0ZXJzIHRvIGV4dHJhY3QuCisJICAgICAgc3RyZWFtc2l6ZSBfX251bSA9IF9faW4ud2lkdGgoKTsKKwkgICAgICBpZiAoX19udW0gPD0gMCkKKwkJX19udW0gPSBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8c3RyZWFtc2l6ZT46Ol9fbWF4OworCisJICAgICAgY29uc3QgX19jdHlwZV90eXBlJiBfX2N0ID0gdXNlX2ZhY2V0PF9fY3R5cGVfdHlwZT4oX19pbi5nZXRsb2MoKSk7CisKKwkgICAgICBjb25zdCBpbnRfdHlwZSBfX2VvZiA9IF9UcmFpdHM6OmVvZigpOworCSAgICAgIF9fc3RyZWFtYnVmX3R5cGUqIF9fc2IgPSBfX2luLnJkYnVmKCk7CisJICAgICAgaW50X3R5cGUgX19jID0gX19zYi0+c2dldGMoKTsKKworCSAgICAgIHdoaWxlIChfX2V4dHJhY3RlZCA8IF9fbnVtIC0gMQorCQkgICAgICYmICFfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKQorCQkgICAgICYmICFfX2N0LmlzKGN0eXBlX2Jhc2U6OnNwYWNlLAorCQkJCSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKSkpCisJCXsKKwkJICAqX19zKysgPSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKTsKKwkJICArK19fZXh0cmFjdGVkOworCQkgIF9fYyA9IF9fc2ItPnNuZXh0YygpOworCQl9CisJICAgICAgaWYgKF9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworCisJICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgICAgIC8vIDY4LiAgRXh0cmFjdG9ycyBmb3IgY2hhciogc2hvdWxkIHN0b3JlIG51bGwgYXQgZW5kCisJICAgICAgKl9fcyA9IGNoYXJfdHlwZSgpOworCSAgICAgIF9faW4ud2lkdGgoMCk7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIF9faW4uX01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IF9faW4uX01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwl9CisgICAgICBpZiAoIV9fZXh0cmFjdGVkKQorCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgaWYgKF9fZXJyKQorCV9faW4uc2V0c3RhdGUoX19lcnIpOworICAgICAgcmV0dXJuIF9faW47CisgICAgfQorCisgIC8vIDI3LjYuMS40IFN0YW5kYXJkIGJhc2ljX2lzdHJlYW0gbWFuaXB1bGF0b3JzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgd3MoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2luKQorICAgIHsKKyAgICAgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+CQlfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4gICAgICAgICAgX19zdHJlYW1idWZfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6OmludF90eXBlCQlfX2ludF90eXBlOworICAgICAgdHlwZWRlZiBjdHlwZTxfQ2hhclQ+CQkJCV9fY3R5cGVfdHlwZTsKKworICAgICAgY29uc3QgX19jdHlwZV90eXBlJiBfX2N0ID0gdXNlX2ZhY2V0PF9fY3R5cGVfdHlwZT4oX19pbi5nZXRsb2MoKSk7CisgICAgICBjb25zdCBfX2ludF90eXBlIF9fZW9mID0gX1RyYWl0czo6ZW9mKCk7CisgICAgICBfX3N0cmVhbWJ1Zl90eXBlKiBfX3NiID0gX19pbi5yZGJ1ZigpOworICAgICAgX19pbnRfdHlwZSBfX2MgPSBfX3NiLT5zZ2V0YygpOworCisgICAgICB3aGlsZSAoIV9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX19lb2YpCisJICAgICAmJiBfX2N0LmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKSkpCisJX19jID0gX19zYi0+c25leHRjKCk7CisKKyAgICAgICBpZiAoX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikpCisJIF9faW4uc2V0c3RhdGUoaW9zX2Jhc2U6OmVvZmJpdCk7CisgICAgICByZXR1cm4gX19pbjsKKyAgICB9CisKKyAgLy8gSW5oaWJpdCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBmb3IgcmVxdWlyZWQgaW5zdGFudGlhdGlvbnMsCisgIC8vIHdoaWNoIGFyZSBkZWZpbmVkIHZpYSBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBlbHNld2hlcmUuCisjaWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19pc3RyZWFtPGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgd3MoaXN0cmVhbSYpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgY2hhciYpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgY2hhciopOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgdW5zaWduZWQgY2hhciYpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgc2lnbmVkIGNoYXImKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIG9wZXJhdG9yPj4oaXN0cmVhbSYsIHVuc2lnbmVkIGNoYXIqKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIG9wZXJhdG9yPj4oaXN0cmVhbSYsIHNpZ25lZCBjaGFyKik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIGlzdHJlYW06Ol9NX2V4dHJhY3QodW5zaWduZWQgc2hvcnQmKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIGlzdHJlYW06Ol9NX2V4dHJhY3QodW5zaWduZWQgaW50Jik7ICAKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIGlzdHJlYW06Ol9NX2V4dHJhY3QobG9uZyYpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgaXN0cmVhbTo6X01fZXh0cmFjdCh1bnNpZ25lZCBsb25nJik7CisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBpc3RyZWFtOjpfTV9leHRyYWN0KGJvb2wmKTsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfTE9OR19MT05HCisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBpc3RyZWFtOjpfTV9leHRyYWN0KGxvbmcgbG9uZyYpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgaXN0cmVhbTo6X01fZXh0cmFjdCh1bnNpZ25lZCBsb25nIGxvbmcmKTsKKyNlbmRpZgorICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgaXN0cmVhbTo6X01fZXh0cmFjdChmbG9hdCYpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgaXN0cmVhbTo6X01fZXh0cmFjdChkb3VibGUmKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIGlzdHJlYW06Ol9NX2V4dHJhY3QobG9uZyBkb3VibGUmKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIGlzdHJlYW06Ol9NX2V4dHJhY3Qodm9pZComKTsKKworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfaW9zdHJlYW08Y2hhcj47CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfaXN0cmVhbTx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiB3cyh3aXN0cmVhbSYpOworICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIG9wZXJhdG9yPj4od2lzdHJlYW0mLCB3Y2hhcl90Jik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgb3BlcmF0b3I+Pih3aXN0cmVhbSYsIHdjaGFyX3QqKTsKKworICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIHdpc3RyZWFtOjpfTV9leHRyYWN0KHVuc2lnbmVkIHNob3J0Jik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgd2lzdHJlYW06Ol9NX2V4dHJhY3QodW5zaWduZWQgaW50Jik7ICAKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiB3aXN0cmVhbTo6X01fZXh0cmFjdChsb25nJik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgd2lzdHJlYW06Ol9NX2V4dHJhY3QodW5zaWduZWQgbG9uZyYpOworICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIHdpc3RyZWFtOjpfTV9leHRyYWN0KGJvb2wmKTsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfTE9OR19MT05HCisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgd2lzdHJlYW06Ol9NX2V4dHJhY3QobG9uZyBsb25nJik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgd2lzdHJlYW06Ol9NX2V4dHJhY3QodW5zaWduZWQgbG9uZyBsb25nJik7CisjZW5kaWYKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiB3aXN0cmVhbTo6X01fZXh0cmFjdChmbG9hdCYpOworICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIHdpc3RyZWFtOjpfTV9leHRyYWN0KGRvdWJsZSYpOworICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIHdpc3RyZWFtOjpfTV9leHRyYWN0KGxvbmcgZG91YmxlJik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgd2lzdHJlYW06Ol9NX2V4dHJhY3Qodm9pZComKTsKKworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfaW9zdHJlYW08d2NoYXJfdD47CisjZW5kaWYKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9saXN0LnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9saXN0LnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWE2YTc2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2xpc3QudGNjCkBAIC0wLDAgKzEsNDY5IEBACisvLyBMaXN0IGltcGxlbWVudGF0aW9uIChvdXQgb2YgbGluZSkgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvbGlzdC50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtsaXN0fQorICovCisKKyNpZm5kZWYgX0xJU1RfVENDCisjZGVmaW5lIF9MSVNUX1RDQyAxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfTGlzdF9iYXNlPF9UcCwgX0FsbG9jPjo6CisgICAgX01fY2xlYXIoKQorICAgIHsKKyAgICAgIHR5cGVkZWYgX0xpc3Rfbm9kZTxfVHA+ICBfTm9kZTsKKyAgICAgIF9Ob2RlKiBfX2N1ciA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oX01faW1wbC5fTV9ub2RlLl9NX25leHQpOworICAgICAgd2hpbGUgKF9fY3VyICE9ICZfTV9pbXBsLl9NX25vZGUpCisJeworCSAgX05vZGUqIF9fdG1wID0gX19jdXI7CisJICBfX2N1ciA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oX19jdXItPl9NX25leHQpOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKwkgIF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpLmRlc3Ryb3koX190bXApOworI2Vsc2UKKwkgIF9NX2dldF9UcF9hbGxvY2F0b3IoKS5kZXN0cm95KHN0ZDo6X19hZGRyZXNzb2YoX190bXAtPl9NX2RhdGEpKTsKKyNlbmRpZgorCSAgX01fcHV0X25vZGUoX190bXApOworCX0KKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgdHlwZW5hbWUgbGlzdDxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgICBsaXN0PF9UcCwgX0FsbG9jPjo6CisgICAgICBlbXBsYWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgeworCV9Ob2RlKiBfX3RtcCA9IF9NX2NyZWF0ZV9ub2RlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJX190bXAtPl9NX2hvb2soX19wb3NpdGlvbi5fTV9ub2RlKTsKKwlyZXR1cm4gaXRlcmF0b3IoX190bXApOworICAgICAgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgbGlzdDxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgeworICAgICAgX05vZGUqIF9fdG1wID0gX01fY3JlYXRlX25vZGUoX194KTsKKyAgICAgIF9fdG1wLT5fTV9ob29rKF9fcG9zaXRpb24uX01fbm9kZSk7CisgICAgICByZXR1cm4gaXRlcmF0b3IoX190bXApOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBsaXN0PF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICBsaXN0PF9UcCwgX0FsbG9jPjo6CisgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICB7CisgICAgICBpdGVyYXRvciBfX3JldCA9IGl0ZXJhdG9yKF9fcG9zaXRpb24uX01fbm9kZS0+X01fbmV4dCk7CisgICAgICBfTV9lcmFzZShfX3Bvc2l0aW9uKTsKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBsaXN0PF9UcCwgX0FsbG9jPjo6CisgICAgX01fZGVmYXVsdF9hcHBlbmQoc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBzaXplX3R5cGUgX19pID0gMDsKKyAgICAgIF9fdHJ5CisJeworCSAgZm9yICg7IF9faSA8IF9fbjsgKytfX2kpCisJICAgIGVtcGxhY2VfYmFjaygpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIGZvciAoOyBfX2k7IC0tX19pKQorCSAgICBwb3BfYmFjaygpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSkKKyAgICB7CisgICAgICBpdGVyYXRvciBfX2kgPSBiZWdpbigpOworICAgICAgc2l6ZV90eXBlIF9fbGVuID0gMDsKKyAgICAgIGZvciAoOyBfX2kgIT0gZW5kKCkgJiYgX19sZW4gPCBfX25ld19zaXplOyArK19faSwgKytfX2xlbikKKyAgICAgICAgOworICAgICAgaWYgKF9fbGVuID09IF9fbmV3X3NpemUpCisgICAgICAgIGVyYXNlKF9faSwgZW5kKCkpOworICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gX19pID09IGVuZCgpCisJX01fZGVmYXVsdF9hcHBlbmQoX19uZXdfc2l6ZSAtIF9fbGVuKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGxpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICB7CisgICAgICBpdGVyYXRvciBfX2kgPSBiZWdpbigpOworICAgICAgc2l6ZV90eXBlIF9fbGVuID0gMDsKKyAgICAgIGZvciAoOyBfX2kgIT0gZW5kKCkgJiYgX19sZW4gPCBfX25ld19zaXplOyArK19faSwgKytfX2xlbikKKyAgICAgICAgOworICAgICAgaWYgKF9fbGVuID09IF9fbmV3X3NpemUpCisgICAgICAgIGVyYXNlKF9faSwgZW5kKCkpOworICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gX19pID09IGVuZCgpCisgICAgICAgIGluc2VydChlbmQoKSwgX19uZXdfc2l6ZSAtIF9fbGVuLCBfX3gpOworICAgIH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBsaXN0PF9UcCwgX0FsbG9jPjo6CisgICAgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCB2YWx1ZV90eXBlIF9feCkKKyAgICB7CisgICAgICBpdGVyYXRvciBfX2kgPSBiZWdpbigpOworICAgICAgc2l6ZV90eXBlIF9fbGVuID0gMDsKKyAgICAgIGZvciAoOyBfX2kgIT0gZW5kKCkgJiYgX19sZW4gPCBfX25ld19zaXplOyArK19faSwgKytfX2xlbikKKyAgICAgICAgOworICAgICAgaWYgKF9fbGVuID09IF9fbmV3X3NpemUpCisgICAgICAgIGVyYXNlKF9faSwgZW5kKCkpOworICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gX19pID09IGVuZCgpCisgICAgICAgIGluc2VydChlbmQoKSwgX19uZXdfc2l6ZSAtIF9fbGVuLCBfX3gpOworICAgIH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGxpc3Q8X1RwLCBfQWxsb2M+JgorICAgIGxpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICBvcGVyYXRvcj0oY29uc3QgbGlzdCYgX194KQorICAgIHsKKyAgICAgIGlmICh0aGlzICE9ICZfX3gpCisJeworCSAgaXRlcmF0b3IgX19maXJzdDEgPSBiZWdpbigpOworCSAgaXRlcmF0b3IgX19sYXN0MSA9IGVuZCgpOworCSAgY29uc3RfaXRlcmF0b3IgX19maXJzdDIgPSBfX3guYmVnaW4oKTsKKwkgIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdDIgPSBfX3guZW5kKCk7CisJICBmb3IgKDsgX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyOworCSAgICAgICArK19fZmlyc3QxLCArK19fZmlyc3QyKQorCSAgICAqX19maXJzdDEgPSAqX19maXJzdDI7CisJICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKKwkgICAgZXJhc2UoX19maXJzdDEsIF9fbGFzdDEpOworCSAgZWxzZQorCSAgICBpbnNlcnQoX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIpOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGxpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9maWxsX2Fzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCkKKyAgICB7CisgICAgICBpdGVyYXRvciBfX2kgPSBiZWdpbigpOworICAgICAgZm9yICg7IF9faSAhPSBlbmQoKSAmJiBfX24gPiAwOyArK19faSwgLS1fX24pCisgICAgICAgICpfX2kgPSBfX3ZhbDsKKyAgICAgIGlmIChfX24gPiAwKQorICAgICAgICBpbnNlcnQoZW5kKCksIF9fbiwgX192YWwpOworICAgICAgZWxzZQorICAgICAgICBlcmFzZShfX2ksIGVuZCgpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgbGlzdDxfVHAsIF9BbGxvYz46OgorICAgICAgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvciBfX2xhc3QyLAorCQkJIF9fZmFsc2VfdHlwZSkKKyAgICAgIHsKKyAgICAgICAgaXRlcmF0b3IgX19maXJzdDEgPSBiZWdpbigpOworICAgICAgICBpdGVyYXRvciBfX2xhc3QxID0gZW5kKCk7CisgICAgICAgIGZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDI7CisJICAgICArK19fZmlyc3QxLCArK19fZmlyc3QyKQorICAgICAgICAgICpfX2ZpcnN0MSA9ICpfX2ZpcnN0MjsKKyAgICAgICAgaWYgKF9fZmlyc3QyID09IF9fbGFzdDIpCisgICAgICAgICAgZXJhc2UoX19maXJzdDEsIF9fbGFzdDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgaW5zZXJ0KF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIHJlbW92ZShjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbHVlKQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9fZmlyc3QgPSBiZWdpbigpOworICAgICAgaXRlcmF0b3IgX19sYXN0ID0gZW5kKCk7CisgICAgICBpdGVyYXRvciBfX2V4dHJhID0gX19sYXN0OworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgIGl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisJICArK19fbmV4dDsKKwkgIGlmICgqX19maXJzdCA9PSBfX3ZhbHVlKQorCSAgICB7CisJICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgICAgIC8vIDUyNi4gSXMgaXQgdW5kZWZpbmVkIGlmIGEgZnVuY3Rpb24gaW4gdGhlIHN0YW5kYXJkIGNoYW5nZXMKKwkgICAgICAvLyBpbiBwYXJhbWV0ZXJzPworCSAgICAgIGlmIChzdGQ6Ol9fYWRkcmVzc29mKCpfX2ZpcnN0KSAhPSBzdGQ6Ol9fYWRkcmVzc29mKF9fdmFsdWUpKQorCQlfTV9lcmFzZShfX2ZpcnN0KTsKKwkgICAgICBlbHNlCisJCV9fZXh0cmEgPSBfX2ZpcnN0OworCSAgICB9CisJICBfX2ZpcnN0ID0gX19uZXh0OworCX0KKyAgICAgIGlmIChfX2V4dHJhICE9IF9fbGFzdCkKKwlfTV9lcmFzZShfX2V4dHJhKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGxpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICB1bmlxdWUoKQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9fZmlyc3QgPSBiZWdpbigpOworICAgICAgaXRlcmF0b3IgX19sYXN0ID0gZW5kKCk7CisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuOworICAgICAgaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKyAgICAgIHdoaWxlICgrK19fbmV4dCAhPSBfX2xhc3QpCisJeworCSAgaWYgKCpfX2ZpcnN0ID09ICpfX25leHQpCisJICAgIF9NX2VyYXNlKF9fbmV4dCk7CisJICBlbHNlCisJICAgIF9fZmlyc3QgPSBfX25leHQ7CisJICBfX25leHQgPSBfX2ZpcnN0OworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGxpc3Q8X1RwLCBfQWxsb2M+OjoKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgbWVyZ2UobGlzdCYmIF9feCkKKyNlbHNlCisgICAgbWVyZ2UobGlzdCYgX194KQorI2VuZGlmCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMzAwLiBsaXN0OjptZXJnZSgpIHNwZWNpZmljYXRpb24gaW5jb21wbGV0ZQorICAgICAgaWYgKHRoaXMgIT0gJl9feCkKKwl7CisJICBfTV9jaGVja19lcXVhbF9hbGxvY2F0b3JzKF9feCk7IAorCisJICBpdGVyYXRvciBfX2ZpcnN0MSA9IGJlZ2luKCk7CisJICBpdGVyYXRvciBfX2xhc3QxID0gZW5kKCk7CisJICBpdGVyYXRvciBfX2ZpcnN0MiA9IF9feC5iZWdpbigpOworCSAgaXRlcmF0b3IgX19sYXN0MiA9IF9feC5lbmQoKTsKKwkgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJICAgIGlmICgqX19maXJzdDIgPCAqX19maXJzdDEpCisJICAgICAgeworCQlpdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0MjsKKwkJX01fdHJhbnNmZXIoX19maXJzdDEsIF9fZmlyc3QyLCArK19fbmV4dCk7CisJCV9fZmlyc3QyID0gX19uZXh0OworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgICsrX19maXJzdDE7CisJICBpZiAoX19maXJzdDIgIT0gX19sYXN0MikKKwkgICAgX01fdHJhbnNmZXIoX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgICAgICB2b2lkCisgICAgICBsaXN0PF9UcCwgX0FsbG9jPjo6CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgbWVyZ2UobGlzdCYmIF9feCwgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApCisjZWxzZQorICAgICAgbWVyZ2UobGlzdCYgX194LCBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyNlbmRpZgorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAzMDAuIGxpc3Q6Om1lcmdlKCkgc3BlY2lmaWNhdGlvbiBpbmNvbXBsZXRlCisJaWYgKHRoaXMgIT0gJl9feCkKKwkgIHsKKwkgICAgX01fY2hlY2tfZXF1YWxfYWxsb2NhdG9ycyhfX3gpOworCisJICAgIGl0ZXJhdG9yIF9fZmlyc3QxID0gYmVnaW4oKTsKKwkgICAgaXRlcmF0b3IgX19sYXN0MSA9IGVuZCgpOworCSAgICBpdGVyYXRvciBfX2ZpcnN0MiA9IF9feC5iZWdpbigpOworCSAgICBpdGVyYXRvciBfX2xhc3QyID0gX194LmVuZCgpOworCSAgICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKQorCSAgICAgIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKQorCQl7CisJCSAgaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDI7CisJCSAgX01fdHJhbnNmZXIoX19maXJzdDEsIF9fZmlyc3QyLCArK19fbmV4dCk7CisJCSAgX19maXJzdDIgPSBfX25leHQ7CisJCX0KKwkgICAgICBlbHNlCisJCSsrX19maXJzdDE7CisJICAgIGlmIChfX2ZpcnN0MiAhPSBfX2xhc3QyKQorCSAgICAgIF9NX3RyYW5zZmVyKF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyKTsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIHNvcnQoKQorICAgIHsKKyAgICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlIGxpc3QgaGFzIGxlbmd0aCAwIG9yIDEuCisgICAgICBpZiAodGhpcy0+X01faW1wbC5fTV9ub2RlLl9NX25leHQgIT0gJnRoaXMtPl9NX2ltcGwuX01fbm9kZQorCSAgJiYgdGhpcy0+X01faW1wbC5fTV9ub2RlLl9NX25leHQtPl9NX25leHQgIT0gJnRoaXMtPl9NX2ltcGwuX01fbm9kZSkKKyAgICAgIHsKKyAgICAgICAgbGlzdCBfX2NhcnJ5OworICAgICAgICBsaXN0IF9fdG1wWzY0XTsKKyAgICAgICAgbGlzdCAqIF9fZmlsbCA9ICZfX3RtcFswXTsKKyAgICAgICAgbGlzdCAqIF9fY291bnRlcjsKKworICAgICAgICBkbworCSAgeworCSAgICBfX2NhcnJ5LnNwbGljZShfX2NhcnJ5LmJlZ2luKCksICp0aGlzLCBiZWdpbigpKTsKKworCSAgICBmb3IoX19jb3VudGVyID0gJl9fdG1wWzBdOworCQlfX2NvdW50ZXIgIT0gX19maWxsICYmICFfX2NvdW50ZXItPmVtcHR5KCk7CisJCSsrX19jb3VudGVyKQorCSAgICAgIHsKKwkJX19jb3VudGVyLT5tZXJnZShfX2NhcnJ5KTsKKwkJX19jYXJyeS5zd2FwKCpfX2NvdW50ZXIpOworCSAgICAgIH0KKwkgICAgX19jYXJyeS5zd2FwKCpfX2NvdW50ZXIpOworCSAgICBpZiAoX19jb3VudGVyID09IF9fZmlsbCkKKwkgICAgICArK19fZmlsbDsKKwkgIH0KKwl3aGlsZSAoICFlbXB0eSgpICk7CisKKyAgICAgICAgZm9yIChfX2NvdW50ZXIgPSAmX190bXBbMV07IF9fY291bnRlciAhPSBfX2ZpbGw7ICsrX19jb3VudGVyKQorICAgICAgICAgIF9fY291bnRlci0+bWVyZ2UoKihfX2NvdW50ZXIgLSAxKSk7CisgICAgICAgIHN3YXAoICooX19maWxsIC0gMSkgKTsKKyAgICAgIH0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgICB2b2lkCisgICAgICBsaXN0PF9UcCwgX0FsbG9jPjo6CisgICAgICByZW1vdmVfaWYoX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgICB7CisgICAgICAgIGl0ZXJhdG9yIF9fZmlyc3QgPSBiZWdpbigpOworICAgICAgICBpdGVyYXRvciBfX2xhc3QgPSBlbmQoKTsKKyAgICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorCSAgeworCSAgICBpdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworCSAgICArK19fbmV4dDsKKwkgICAgaWYgKF9fcHJlZCgqX19maXJzdCkpCisJICAgICAgX01fZXJhc2UoX19maXJzdCk7CisJICAgIF9fZmlyc3QgPSBfX25leHQ7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgICB2b2lkCisgICAgICBsaXN0PF9UcCwgX0FsbG9jPjo6CisgICAgICB1bmlxdWUoX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKQorICAgICAgeworICAgICAgICBpdGVyYXRvciBfX2ZpcnN0ID0gYmVnaW4oKTsKKyAgICAgICAgaXRlcmF0b3IgX19sYXN0ID0gZW5kKCk7CisgICAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwkgIHJldHVybjsKKyAgICAgICAgaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKyAgICAgICAgd2hpbGUgKCsrX19uZXh0ICE9IF9fbGFzdCkKKwkgIHsKKwkgICAgaWYgKF9fYmluYXJ5X3ByZWQoKl9fZmlyc3QsICpfX25leHQpKQorCSAgICAgIF9NX2VyYXNlKF9fbmV4dCk7CisJICAgIGVsc2UKKwkgICAgICBfX2ZpcnN0ID0gX19uZXh0OworCSAgICBfX25leHQgPSBfX2ZpcnN0OworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfU3RyaWN0V2Vha09yZGVyaW5nPgorICAgICAgdm9pZAorICAgICAgbGlzdDxfVHAsIF9BbGxvYz46OgorICAgICAgc29ydChfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyAgICAgIHsKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBsaXN0IGhhcyBsZW5ndGggMCBvciAxLgorCWlmICh0aGlzLT5fTV9pbXBsLl9NX25vZGUuX01fbmV4dCAhPSAmdGhpcy0+X01faW1wbC5fTV9ub2RlCisJICAgICYmIHRoaXMtPl9NX2ltcGwuX01fbm9kZS5fTV9uZXh0LT5fTV9uZXh0ICE9ICZ0aGlzLT5fTV9pbXBsLl9NX25vZGUpCisJICB7CisJICAgIGxpc3QgX19jYXJyeTsKKwkgICAgbGlzdCBfX3RtcFs2NF07CisJICAgIGxpc3QgKiBfX2ZpbGwgPSAmX190bXBbMF07CisJICAgIGxpc3QgKiBfX2NvdW50ZXI7CisKKwkgICAgZG8KKwkgICAgICB7CisJCV9fY2Fycnkuc3BsaWNlKF9fY2FycnkuYmVnaW4oKSwgKnRoaXMsIGJlZ2luKCkpOworCisJCWZvcihfX2NvdW50ZXIgPSAmX190bXBbMF07CisJCSAgICBfX2NvdW50ZXIgIT0gX19maWxsICYmICFfX2NvdW50ZXItPmVtcHR5KCk7CisJCSAgICArK19fY291bnRlcikKKwkJICB7CisJCSAgICBfX2NvdW50ZXItPm1lcmdlKF9fY2FycnksIF9fY29tcCk7CisJCSAgICBfX2NhcnJ5LnN3YXAoKl9fY291bnRlcik7CisJCSAgfQorCQlfX2NhcnJ5LnN3YXAoKl9fY291bnRlcik7CisJCWlmIChfX2NvdW50ZXIgPT0gX19maWxsKQorCQkgICsrX19maWxsOworCSAgICAgIH0KKwkgICAgd2hpbGUgKCAhZW1wdHkoKSApOworCisJICAgIGZvciAoX19jb3VudGVyID0gJl9fdG1wWzFdOyBfX2NvdW50ZXIgIT0gX19maWxsOyArK19fY291bnRlcikKKwkgICAgICBfX2NvdW50ZXItPm1lcmdlKCooX19jb3VudGVyIC0gMSksIF9fY29tcCk7CisJICAgIHN3YXAoKihfX2ZpbGwgLSAxKSk7CisJICB9CisgICAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8qIF9MSVNUX1RDQyAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvbG9jYWxlX2NsYXNzZXMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9sb2NhbGVfY2xhc3Nlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGU3ZTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvbG9jYWxlX2NsYXNzZXMuaApAQCAtMCwwICsxLDc4OSBAQAorLy8gTG9jYWxlIHN1cHBvcnQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvbG9jYWxlX2NsYXNzZXMuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2xvY2FsZX0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjIuMSAgTG9jYWxlcworLy8KKworI2lmbmRlZiBfTE9DQUxFX0NMQVNTRVNfSAorI2RlZmluZSBfTE9DQUxFX0NMQVNTRVNfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvbG9jYWxlZndkLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGV4dC9hdG9taWNpdHkuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIDIyLjEuMSBDbGFzcyBsb2NhbGUKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbnRhaW5lciBjbGFzcyBmb3IgbG9jYWxpemF0aW9uIGZ1bmN0aW9uYWxpdHkuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBUaGUgbG9jYWxlIGNsYXNzIGlzIGZpcnN0IGEgY2xhc3Mgd3JhcHBlciBmb3IgQyBsaWJyYXJ5IGxvY2FsZXMuICBJdCBpcworICAgKiAgYWxzbyBhbiBleHRlbnNpYmxlIGNvbnRhaW5lciBmb3IgdXNlci1kZWZpbmVkIGxvY2FsaXphdGlvbi4gIEEgbG9jYWxlIGlzCisgICAqICBhIGNvbGxlY3Rpb24gb2YgZmFjZXRzIHRoYXQgaW1wbGVtZW50IHZhcmlvdXMgbG9jYWxpemF0aW9uIGZlYXR1cmVzIHN1Y2gKKyAgICogIGFzIG1vbmV5LCB0aW1lLCBhbmQgbnVtYmVyIHByaW50aW5nLgorICAgKgorICAgKiAgQ29uc3RydWN0aW5nIEMrKyBsb2NhbGVzIGRvZXMgbm90IGNoYW5nZSB0aGUgQyBsaWJyYXJ5IGxvY2FsZS4KKyAgICoKKyAgICogIFRoaXMgbGlicmFyeSBzdXBwb3J0cyBlZmZpY2llbnQgY29uc3RydWN0aW9uIGFuZCBjb3B5aW5nIG9mIGxvY2FsZXMKKyAgICogIHRocm91Z2ggYSByZWZlcmVuY2UgY291bnRpbmcgaW1wbGVtZW50YXRpb24gb2YgdGhlIGxvY2FsZSBjbGFzcy4KKyAgKi8KKyAgY2xhc3MgbG9jYWxlCisgIHsKKyAgcHVibGljOgorICAgIC8vIFR5cGVzOgorICAgIC8vLyBEZWZpbml0aW9uIG9mIGxvY2FsZTo6Y2F0ZWdvcnkuCisgICAgdHlwZWRlZiBpbnQJY2F0ZWdvcnk7CisKKyAgICAvLyBGb3J3YXJkIGRlY2xzIGFuZCBmcmllbmRzOgorICAgIGNsYXNzIGZhY2V0OworICAgIGNsYXNzIGlkOworICAgIGNsYXNzIF9JbXBsOworCisgICAgZnJpZW5kIGNsYXNzIGZhY2V0OworICAgIGZyaWVuZCBjbGFzcyBfSW1wbDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBoYXNfZmFjZXQoY29uc3QgbG9jYWxlJikgdGhyb3coKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4KKyAgICAgIGZyaWVuZCBjb25zdCBfRmFjZXQmCisgICAgICB1c2VfZmFjZXQoY29uc3QgbG9jYWxlJik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2FjaGU+CisgICAgICBmcmllbmQgc3RydWN0IF9fdXNlX2NhY2hlOworCisgICAgLy9AeworICAgIC8qKgorICAgICAqICBAYnJpZWYgIENhdGVnb3J5IHZhbHVlcy4KKyAgICAgKgorICAgICAqICBUaGUgc3RhbmRhcmQgY2F0ZWdvcnkgdmFsdWVzIGFyZSBub25lLCBjdHlwZSwgbnVtZXJpYywgY29sbGF0ZSwgdGltZSwKKyAgICAgKiAgbW9uZXRhcnksIGFuZCBtZXNzYWdlcy4gIFRoZXkgZm9ybSBhIGJpdG1hc2sgdGhhdCBzdXBwb3J0cyB1bmlvbiBhbmQKKyAgICAgKiAgaW50ZXJzZWN0aW9uLiAgVGhlIGNhdGVnb3J5IGFsbCBpcyB0aGUgdW5pb24gb2YgdGhlc2UgdmFsdWVzLgorICAgICAqCisgICAgICogIE5COiBPcmRlciBtdXN0IG1hdGNoIF9TX2ZhY2V0X2NhdGVnb3JpZXMgZGVmaW5pdGlvbiBpbiBsb2NhbGUuY2MKKyAgICAqLworICAgIHN0YXRpYyBjb25zdCBjYXRlZ29yeSBub25lCQk9IDA7CisgICAgc3RhdGljIGNvbnN0IGNhdGVnb3J5IGN0eXBlCQk9IDFMIDw8IDA7CisgICAgc3RhdGljIGNvbnN0IGNhdGVnb3J5IG51bWVyaWMJPSAxTCA8PCAxOworICAgIHN0YXRpYyBjb25zdCBjYXRlZ29yeSBjb2xsYXRlCT0gMUwgPDwgMjsKKyAgICBzdGF0aWMgY29uc3QgY2F0ZWdvcnkgdGltZQkJPSAxTCA8PCAzOworICAgIHN0YXRpYyBjb25zdCBjYXRlZ29yeSBtb25ldGFyeQk9IDFMIDw8IDQ7CisgICAgc3RhdGljIGNvbnN0IGNhdGVnb3J5IG1lc3NhZ2VzCT0gMUwgPDwgNTsKKyAgICBzdGF0aWMgY29uc3QgY2F0ZWdvcnkgYWxsCQk9IChjdHlwZSB8IG51bWVyaWMgfCBjb2xsYXRlIHwKKwkJCQkJICAgdGltZSAgfCBtb25ldGFyeSB8IG1lc3NhZ2VzKTsKKyAgICAvL0B9CisKKyAgICAvLyBDb25zdHJ1Y3QvY29weS9kZXN0cm95OgorCisgICAgLyoqCisgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqICBDb25zdHJ1Y3RzIGEgY29weSBvZiB0aGUgZ2xvYmFsIGxvY2FsZS4gIElmIG5vIGxvY2FsZSBoYXMgYmVlbgorICAgICAqICBleHBsaWNpdGx5IHNldCwgdGhpcyBpcyB0aGUgQyBsb2NhbGUuCisgICAgKi8KKyAgICBsb2NhbGUoKSB0aHJvdygpOworCisgICAgLyoqCisgICAgICogIEBicmllZiAgQ29weSBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqICBDb25zdHJ1Y3RzIGEgY29weSBvZiBAYSBvdGhlci4KKyAgICAgKgorICAgICAqICBAcGFyYW0gIF9fb3RoZXIgIFRoZSBsb2NhbGUgdG8gY29weS4KKyAgICAqLworICAgIGxvY2FsZShjb25zdCBsb2NhbGUmIF9fb3RoZXIpIHRocm93KCk7CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBOYW1lZCBsb2NhbGUgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiAgQ29uc3RydWN0cyBhIGNvcHkgb2YgdGhlIG5hbWVkIEMgbGlicmFyeSBsb2NhbGUuCisgICAgICoKKyAgICAgKiAgQHBhcmFtICBfX3MgIE5hbWUgb2YgdGhlIGxvY2FsZSB0byBjb25zdHJ1Y3QuCisgICAgICogIEB0aHJvdyAgc3RkOjpydW50aW1lX2Vycm9yIGlmIF9fcyBpcyBudWxsIG9yIGFuIHVuZGVmaW5lZCBsb2NhbGUuCisgICAgKi8KKyAgICBleHBsaWNpdAorICAgIGxvY2FsZShjb25zdCBjaGFyKiBfX3MpOworCisgICAgLyoqCisgICAgICogIEBicmllZiAgQ29uc3RydWN0IGxvY2FsZSB3aXRoIGZhY2V0cyBmcm9tIGFub3RoZXIgbG9jYWxlLgorICAgICAqCisgICAgICogIENvbnN0cnVjdHMgYSBjb3B5IG9mIHRoZSBsb2NhbGUgQGEgYmFzZS4gIFRoZSBmYWNldHMgc3BlY2lmaWVkIGJ5IEBhCisgICAgICogIGNhdCBhcmUgcmVwbGFjZWQgd2l0aCB0aG9zZSBmcm9tIHRoZSBsb2NhbGUgbmFtZWQgYnkgQGEgcy4gIElmIGJhc2UgaXMKKyAgICAgKiAgbmFtZWQsIHRoaXMgbG9jYWxlIGluc3RhbmNlIHdpbGwgYWxzbyBiZSBuYW1lZC4KKyAgICAgKgorICAgICAqICBAcGFyYW0gIF9fYmFzZSAgVGhlIGxvY2FsZSB0byBjb3B5LgorICAgICAqICBAcGFyYW0gIF9fcyAgTmFtZSBvZiB0aGUgbG9jYWxlIHRvIHVzZSBmYWNldHMgZnJvbS4KKyAgICAgKiAgQHBhcmFtICBfX2NhdCAgU2V0IG9mIGNhdGVnb3JpZXMgZGVmaW5pbmcgdGhlIGZhY2V0cyB0byB1c2UgZnJvbSBfX3MuCisgICAgICogIEB0aHJvdyAgc3RkOjpydW50aW1lX2Vycm9yIGlmIF9fcyBpcyBudWxsIG9yIGFuIHVuZGVmaW5lZCBsb2NhbGUuCisgICAgKi8KKyAgICBsb2NhbGUoY29uc3QgbG9jYWxlJiBfX2Jhc2UsIGNvbnN0IGNoYXIqIF9fcywgY2F0ZWdvcnkgX19jYXQpOworCisgICAgLyoqCisgICAgICogIEBicmllZiAgQ29uc3RydWN0IGxvY2FsZSB3aXRoIGZhY2V0cyBmcm9tIGFub3RoZXIgbG9jYWxlLgorICAgICAqCisgICAgICogIENvbnN0cnVjdHMgYSBjb3B5IG9mIHRoZSBsb2NhbGUgQGEgYmFzZS4gIFRoZSBmYWNldHMgc3BlY2lmaWVkIGJ5IEBhCisgICAgICogIGNhdCBhcmUgcmVwbGFjZWQgd2l0aCB0aG9zZSBmcm9tIHRoZSBsb2NhbGUgQGEgYWRkLiAgSWYgQGEgYmFzZSBhbmQgQGEKKyAgICAgKiAgYWRkIGFyZSBuYW1lZCwgdGhpcyBsb2NhbGUgaW5zdGFuY2Ugd2lsbCBhbHNvIGJlIG5hbWVkLgorICAgICAqCisgICAgICogIEBwYXJhbSAgX19iYXNlICBUaGUgbG9jYWxlIHRvIGNvcHkuCisgICAgICogIEBwYXJhbSAgX19hZGQgIFRoZSBsb2NhbGUgdG8gdXNlIGZhY2V0cyBmcm9tLgorICAgICAqICBAcGFyYW0gIF9fY2F0ICBTZXQgb2YgY2F0ZWdvcmllcyBkZWZpbmluZyB0aGUgZmFjZXRzIHRvIHVzZSBmcm9tIGFkZC4KKyAgICAqLworICAgIGxvY2FsZShjb25zdCBsb2NhbGUmIF9fYmFzZSwgY29uc3QgbG9jYWxlJiBfX2FkZCwgY2F0ZWdvcnkgX19jYXQpOworCisgICAgLyoqCisgICAgICogIEBicmllZiAgQ29uc3RydWN0IGxvY2FsZSB3aXRoIGFub3RoZXIgZmFjZXQuCisgICAgICoKKyAgICAgKiAgQ29uc3RydWN0cyBhIGNvcHkgb2YgdGhlIGxvY2FsZSBAYSBfX290aGVyLiAgVGhlIGZhY2V0IEBhIF9fZgorICAgICAqICBpcyBhZGRlZCB0byBAYSBfX290aGVyLCByZXBsYWNpbmcgYW4gZXhpc3RpbmcgZmFjZXQgb2YgdHlwZQorICAgICAqICBGYWNldCBpZiB0aGVyZSBpcyBvbmUuICBJZiBAYSBfX2YgaXMgbnVsbCwgdGhpcyBsb2NhbGUgaXMgYQorICAgICAqICBjb3B5IG9mIEBhIF9fb3RoZXIuCisgICAgICoKKyAgICAgKiAgQHBhcmFtICBfX290aGVyICBUaGUgbG9jYWxlIHRvIGNvcHkuCisgICAgICogIEBwYXJhbSAgX19mICBUaGUgZmFjZXQgdG8gYWRkIGluLgorICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgICAgbG9jYWxlKGNvbnN0IGxvY2FsZSYgX19vdGhlciwgX0ZhY2V0KiBfX2YpOworCisgICAgLy8vIExvY2FsZSBkZXN0cnVjdG9yLgorICAgIH5sb2NhbGUoKSB0aHJvdygpOworCisgICAgLyoqCisgICAgICogIEBicmllZiAgQXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgKgorICAgICAqICBTZXQgdGhpcyBsb2NhbGUgdG8gYmUgYSBjb3B5IG9mIEBhIG90aGVyLgorICAgICAqCisgICAgICogIEBwYXJhbSAgX19vdGhlciAgVGhlIGxvY2FsZSB0byBjb3B5LgorICAgICAqICBAcmV0dXJuICBBIHJlZmVyZW5jZSB0byB0aGlzIGxvY2FsZS4KKyAgICAqLworICAgIGNvbnN0IGxvY2FsZSYKKyAgICBvcGVyYXRvcj0oY29uc3QgbG9jYWxlJiBfX290aGVyKSB0aHJvdygpOworCisgICAgLyoqCisgICAgICogIEBicmllZiAgQ29uc3RydWN0IGxvY2FsZSB3aXRoIGFub3RoZXIgZmFjZXQuCisgICAgICoKKyAgICAgKiAgQ29uc3RydWN0cyBhbmQgcmV0dXJucyBhIG5ldyBjb3B5IG9mIHRoaXMgbG9jYWxlLiAgQWRkcyBvciByZXBsYWNlcyBhbgorICAgICAqICBleGlzdGluZyBmYWNldCBvZiB0eXBlIEZhY2V0IGZyb20gdGhlIGxvY2FsZSBAYSBvdGhlciBpbnRvIHRoZSBuZXcKKyAgICAgKiAgbG9jYWxlLgorICAgICAqCisgICAgICogIEB0cGFyYW0gIF9GYWNldCAgVGhlIGZhY2V0IHR5cGUgdG8gY29weSBmcm9tIG90aGVyCisgICAgICogIEBwYXJhbSAgX19vdGhlciAgVGhlIGxvY2FsZSB0byBjb3B5IGZyb20uCisgICAgICogIEByZXR1cm4gIE5ld2x5IGNvbnN0cnVjdGVkIGxvY2FsZS4KKyAgICAgKiAgQHRocm93ICBzdGQ6OnJ1bnRpbWVfZXJyb3IgaWYgX19vdGhlciBoYXMgbm8gZmFjZXQgb2YgdHlwZSBfRmFjZXQuCisgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRmFjZXQ+CisgICAgICBsb2NhbGUKKyAgICAgIGNvbWJpbmUoY29uc3QgbG9jYWxlJiBfX290aGVyKSBjb25zdDsKKworICAgIC8vIExvY2FsZSBvcGVyYXRpb25zOgorICAgIC8qKgorICAgICAqICBAYnJpZWYgIFJldHVybiBsb2NhbGUgbmFtZS4KKyAgICAgKiAgQHJldHVybiAgTG9jYWxlIG5hbWUgb3IgIioiIGlmIHVubmFtZWQuCisgICAgKi8KKyAgICBzdHJpbmcKKyAgICBuYW1lKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBMb2NhbGUgZXF1YWxpdHkuCisgICAgICoKKyAgICAgKiAgQHBhcmFtICBfX290aGVyICBUaGUgbG9jYWxlIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBvdGhlciBhbmQgdGhpcyByZWZlciB0byB0aGUgc2FtZSBsb2NhbGUgaW5zdGFuY2UsIGFyZQorICAgICAqCQkgY29waWVzLCBvciBoYXZlIHRoZSBzYW1lIG5hbWUuICBGYWxzZSBvdGhlcndpc2UuCisgICAgKi8KKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBsb2NhbGUmIF9fb3RoZXIpIGNvbnN0IHRocm93KCk7CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBMb2NhbGUgaW5lcXVhbGl0eS4KKyAgICAgKgorICAgICAqICBAcGFyYW0gIF9fb3RoZXIgIFRoZSBsb2NhbGUgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAqICBAcmV0dXJuICAhICgqdGhpcyA9PSBfX290aGVyKQorICAgICovCisgICAgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgbG9jYWxlJiBfX290aGVyKSBjb25zdCB0aHJvdygpCisgICAgeyByZXR1cm4gISh0aGlzLT5vcGVyYXRvcj09KF9fb3RoZXIpKTsgfQorCisgICAgLyoqCisgICAgICogIEBicmllZiAgQ29tcGFyZSB0d28gc3RyaW5ncyBhY2NvcmRpbmcgdG8gY29sbGF0ZS4KKyAgICAgKgorICAgICAqICBUZW1wbGF0ZSBvcGVyYXRvciB0byBjb21wYXJlIHR3byBzdHJpbmdzIHVzaW5nIHRoZSBjb21wYXJlIGZ1bmN0aW9uIG9mCisgICAgICogIHRoZSBjb2xsYXRlIGZhY2V0IGluIHRoaXMgbG9jYWxlLiAgT25lIHVzZSBpcyB0byBwcm92aWRlIHRoZSBsb2NhbGUgdG8KKyAgICAgKiAgdGhlIHNvcnQgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSwgYSB2ZWN0b3IgdiBvZiBzdHJpbmdzIGNvdWxkIGJlIHNvcnRlZAorICAgICAqICBhY2NvcmRpbmcgdG8gbG9jYWxlIGxvYyBieSBkb2luZzoKKyAgICAgKiAgQGNvZGUKKyAgICAgKiAgc3RkOjpzb3J0KHYuYmVnaW4oKSwgdi5lbmQoKSwgbG9jKTsKKyAgICAgKiAgQGVuZGNvZGUKKyAgICAgKgorICAgICAqICBAcGFyYW0gIF9fczEgIEZpcnN0IHN0cmluZyB0byBjb21wYXJlLgorICAgICAqICBAcGFyYW0gIF9fczIgIFNlY29uZCBzdHJpbmcgdG8gY29tcGFyZS4KKyAgICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBjb2xsYXRlPF9DaGFyPiBmYWNldCBjb21wYXJlcyBfX3MxIDwgX19zMiwgZWxzZSBmYWxzZS4KKyAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyLCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhciwgX1RyYWl0cywgX0FsbG9jPiYgX19zMSwKKwkJIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhciwgX1RyYWl0cywgX0FsbG9jPiYgX19zMikgY29uc3Q7CisKKyAgICAvLyBHbG9iYWwgbG9jYWxlIG9iamVjdHM6CisgICAgLyoqCisgICAgICogIEBicmllZiAgU2V0IGdsb2JhbCBsb2NhbGUKKyAgICAgKgorICAgICAqICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGdsb2JhbCBsb2NhbGUgdG8gdGhlIGFyZ3VtZW50IGFuZCByZXR1cm5zIGEKKyAgICAgKiAgY29weSBvZiB0aGUgcHJldmlvdXMgZ2xvYmFsIGxvY2FsZS4gIElmIHRoZSBhcmd1bWVudCBoYXMgYSBuYW1lLCBpdAorICAgICAqICB3aWxsIGFsc28gY2FsbCBzdGQ6OnNldGxvY2FsZShMQ19BTEwsIGxvYy5uYW1lKCkpLgorICAgICAqCisgICAgICogIEBwYXJhbSAgX19sb2MgIFRoZSBuZXcgbG9jYWxlIHRvIG1ha2UgZ2xvYmFsLgorICAgICAqICBAcmV0dXJuICBDb3B5IG9mIHRoZSBvbGQgZ2xvYmFsIGxvY2FsZS4KKyAgICAqLworICAgIHN0YXRpYyBsb2NhbGUKKyAgICBnbG9iYWwoY29uc3QgbG9jYWxlJiBfX2xvYyk7CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBSZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBDIGxvY2FsZS4KKyAgICAqLworICAgIHN0YXRpYyBjb25zdCBsb2NhbGUmCisgICAgY2xhc3NpYygpOworCisgIHByaXZhdGU6CisgICAgLy8gVGhlIChzaGFyZWQpIGltcGxlbWVudGF0aW9uCisgICAgX0ltcGwqCQlfTV9pbXBsOworCisgICAgLy8gVGhlICJDIiByZWZlcmVuY2UgbG9jYWxlCisgICAgc3RhdGljIF9JbXBsKiAgICAgICBfU19jbGFzc2ljOworCisgICAgLy8gQ3VycmVudCBnbG9iYWwgbG9jYWxlCisgICAgc3RhdGljIF9JbXBsKglfU19nbG9iYWw7CisKKyAgICAvLyBOYW1lcyBvZiB1bmRlcmx5aW5nIGxvY2FsZSBjYXRlZ29yaWVzLgorICAgIC8vIE5COiBsb2NhbGU6Omdsb2JhbCgpIGhhcyB0byBrbm93IGhvdyB0byBtb2RpZnkgYWxsIHRoZQorICAgIC8vIHVuZGVybHlpbmcgY2F0ZWdvcmllcywgbm90IGp1c3QgdGhlIG9uZXMgcmVxdWlyZWQgYnkgdGhlIEMrKworICAgIC8vIHN0YW5kYXJkLgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCogY29uc3QgX1NfY2F0ZWdvcmllczsKKworICAgIC8vIE51bWJlciBvZiBzdGFuZGFyZCBjYXRlZ29yaWVzLiBGb3IgQysrLCB0aGVzZSBjYXRlZ29yaWVzIGFyZQorICAgIC8vIGNvbGxhdGUsIGN0eXBlLCBtb25ldGFyeSwgbnVtZXJpYywgdGltZSwgYW5kIG1lc3NhZ2VzLiBUaGVzZQorICAgIC8vIGRpcmVjdGx5IGNvcnJlc3BvbmQgdG8gSVNPIEM5OSBtYWNyb3MgTENfQ09MTEFURSwgTENfQ1RZUEUsCisgICAgLy8gTENfTU9ORVRBUlksIExDX05VTUVSSUMsIGFuZCBMQ19USU1FLiBJbiBhZGRpdGlvbiwgUE9TSVggKElFRUUKKyAgICAvLyAxMDAzLjEtMjAwMSkgc3BlY2lmaWVzIExDX01FU1NBR0VTLgorICAgIC8vIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBjYXRlZ29yaWVzLCB0aGUgdW5kZXJseWluZworICAgIC8vIG9wZXJhdGluZyBzeXN0ZW0gaXMgYWxsb3dlZCB0byBkZWZpbmUgZXh0cmEgTENfKgorICAgIC8vIG1hY3Jvcy4gRm9yIEdOVSBzeXN0ZW1zLCB0aGUgZm9sbG93aW5nIGFyZSBhbHNvIHZhbGlkOgorICAgIC8vIExDX1BBUEVSLCBMQ19OQU1FLCBMQ19BRERSRVNTLCBMQ19URUxFUEhPTkUsIExDX01FQVNVUkVNRU5ULAorICAgIC8vIGFuZCBMQ19JREVOVElGSUNBVElPTi4KKyAgICBlbnVtIHsgX1NfY2F0ZWdvcmllc19zaXplID0gNiArIF9HTElCQ1hYX05VTV9DQVRFR09SSUVTIH07CisKKyNpZmRlZiBfX0dUSFJFQURTCisgICAgc3RhdGljIF9fZ3RocmVhZF9vbmNlX3QgX1Nfb25jZTsKKyNlbmRpZgorCisgICAgZXhwbGljaXQKKyAgICBsb2NhbGUoX0ltcGwqKSB0aHJvdygpOworCisgICAgc3RhdGljIHZvaWQKKyAgICBfU19pbml0aWFsaXplKCk7CisKKyAgICBzdGF0aWMgdm9pZAorICAgIF9TX2luaXRpYWxpemVfb25jZSgpIHRocm93KCk7CisKKyAgICBzdGF0aWMgY2F0ZWdvcnkKKyAgICBfU19ub3JtYWxpemVfY2F0ZWdvcnkoY2F0ZWdvcnkpOworCisgICAgdm9pZAorICAgIF9NX2NvYWxlc2NlKGNvbnN0IGxvY2FsZSYgX19iYXNlLCBjb25zdCBsb2NhbGUmIF9fYWRkLCBjYXRlZ29yeSBfX2NhdCk7CisgIH07CisKKworICAvLyAyMi4xLjEuMS4yICBDbGFzcyBsb2NhbGU6OmZhY2V0CisgIC8qKgorICAgKiAgQGJyaWVmICBMb2NhbGl6YXRpb24gZnVuY3Rpb25hbGl0eSBiYXNlIGNsYXNzLgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKgorICAgKiAgVGhlIGZhY2V0IGNsYXNzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhIGxvY2FsaXphdGlvbiBmZWF0dXJlLCBzdWNoIGFzCisgICAqICBtb25leSwgdGltZSwgYW5kIG51bWJlciBwcmludGluZy4gIEl0IHByb3ZpZGVzIGNvbW1vbiBzdXBwb3J0IGZvciBmYWNldHMKKyAgICogIGFuZCByZWZlcmVuY2UgbWFuYWdlbWVudC4KKyAgICoKKyAgICogIEZhY2V0cyBtYXkgbm90IGJlIGNvcGllZCBvciBhc3NpZ25lZC4KKyAgKi8KKyAgY2xhc3MgbG9jYWxlOjpmYWNldAorICB7CisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIGxvY2FsZTsKKyAgICBmcmllbmQgY2xhc3MgbG9jYWxlOjpfSW1wbDsKKworICAgIG11dGFibGUgX0F0b21pY193b3JkCQlfTV9yZWZjb3VudDsKKworICAgIC8vIENvbnRhaW5zIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyAiQyIgbGlicmFyeSBmb3IgdGhlIGNsYXNzaWMgbG9jYWxlLgorICAgIHN0YXRpYyBfX2NfbG9jYWxlICAgICAgICAgICAgICAgICAgIF9TX2NfbG9jYWxlOworCisgICAgLy8gU3RyaW5nIGxpdGVyYWwgZm9yIHRoZSBuYW1lIG9mIHRoZSBjbGFzc2ljIGxvY2FsZS4KKyAgICBzdGF0aWMgY29uc3QgY2hhcgkJCV9TX2NfbmFtZVsyXTsKKworI2lmZGVmIF9fR1RIUkVBRFMKKyAgICBzdGF0aWMgX19ndGhyZWFkX29uY2VfdAkJX1Nfb25jZTsKKyNlbmRpZgorCisgICAgc3RhdGljIHZvaWQKKyAgICBfU19pbml0aWFsaXplX29uY2UoKTsKKworICBwcm90ZWN0ZWQ6CisgICAgLyoqCisgICAgICogIEBicmllZiAgRmFjZXQgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiAgVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgcHJvdmlkZWQgYnkgdGhlIHN0YW5kYXJkLiAgSWYgcmVmcyBpcyAwLCB0aGUKKyAgICAgKiAgZmFjZXQgaXMgZGVzdHJveWVkIHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNpbmcgbG9jYWxlIGlzIGRlc3Ryb3llZC4KKyAgICAgKiAgT3RoZXJ3aXNlIHRoZSBmYWNldCB3aWxsIG5ldmVyIGJlIGRlc3Ryb3llZC4KKyAgICAgKgorICAgICAqICBAcGFyYW0gX19yZWZzICBUaGUgaW5pdGlhbCB2YWx1ZSBmb3IgcmVmZXJlbmNlIGNvdW50LgorICAgICovCisgICAgZXhwbGljaXQKKyAgICBmYWNldChzaXplX3QgX19yZWZzID0gMCkgdGhyb3coKSA6IF9NX3JlZmNvdW50KF9fcmVmcyA/IDEgOiAwKQorICAgIHsgfQorCisgICAgLy8vIEZhY2V0IGRlc3RydWN0b3IuCisgICAgdmlydHVhbAorICAgIH5mYWNldCgpOworCisgICAgc3RhdGljIHZvaWQKKyAgICBfU19jcmVhdGVfY19sb2NhbGUoX19jX2xvY2FsZSYgX19jbG9jLCBjb25zdCBjaGFyKiBfX3MsCisJCSAgICAgICBfX2NfbG9jYWxlIF9fb2xkID0gMCk7CisKKyAgICBzdGF0aWMgX19jX2xvY2FsZQorICAgIF9TX2Nsb25lX2NfbG9jYWxlKF9fY19sb2NhbGUmIF9fY2xvYykgdGhyb3coKTsKKworICAgIHN0YXRpYyB2b2lkCisgICAgX1NfZGVzdHJveV9jX2xvY2FsZShfX2NfbG9jYWxlJiBfX2Nsb2MpOworCisgICAgc3RhdGljIF9fY19sb2NhbGUKKyAgICBfU19sY19jdHlwZV9jX2xvY2FsZShfX2NfbG9jYWxlIF9fY2xvYywgY29uc3QgY2hhciogX19zKTsKKworICAgIC8vIFJldHVybnMgZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nICJDIiBsaWJyYXJ5IGRhdGEgZm9yIHRoZQorICAgIC8vIGNsYXNzaWMgbG9jYWxlLgorICAgIHN0YXRpYyBfX2NfbG9jYWxlCisgICAgX1NfZ2V0X2NfbG9jYWxlKCk7CisKKyAgICBfR0xJQkNYWF9DT05TVCBzdGF0aWMgY29uc3QgY2hhcioKKyAgICBfU19nZXRfY19uYW1lKCkgdGhyb3coKTsKKworICBwcml2YXRlOgorICAgIHZvaWQKKyAgICBfTV9hZGRfcmVmZXJlbmNlKCkgY29uc3QgdGhyb3coKQorICAgIHsgX19nbnVfY3h4OjpfX2F0b21pY19hZGRfZGlzcGF0Y2goJl9NX3JlZmNvdW50LCAxKTsgfQorCisgICAgdm9pZAorICAgIF9NX3JlbW92ZV9yZWZlcmVuY2UoKSBjb25zdCB0aHJvdygpCisgICAgeworICAgICAgLy8gQmUgcmFjZS1kZXRlY3Rvci1mcmllbmRseS4gIEZvciBtb3JlIGluZm8gc2VlIGJpdHMvYysrY29uZmlnLgorICAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQkVGT1JFKCZfTV9yZWZjb3VudCk7CisgICAgICBpZiAoX19nbnVfY3h4OjpfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2goJl9NX3JlZmNvdW50LCAtMSkgPT0gMSkKKwl7CisgICAgICAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQUZURVIoJl9NX3JlZmNvdW50KTsKKwkgIF9fdHJ5CisJICAgIHsgZGVsZXRlIHRoaXM7IH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IH0KKwl9CisgICAgfQorCisgICAgZmFjZXQoY29uc3QgZmFjZXQmKTsgIC8vIE5vdCBkZWZpbmVkLgorCisgICAgZmFjZXQmCisgICAgb3BlcmF0b3I9KGNvbnN0IGZhY2V0Jik7ICAvLyBOb3QgZGVmaW5lZC4KKyAgfTsKKworCisgIC8vIDIyLjEuMS4xLjMgQ2xhc3MgbG9jYWxlOjppZAorICAvKioKKyAgICogIEBicmllZiAgRmFjZXQgSUQgY2xhc3MuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBUaGUgSUQgY2xhc3MgcHJvdmlkZXMgZmFjZXRzIHdpdGggYW4gaW5kZXggdXNlZCB0byBpZGVudGlmeSB0aGVtLgorICAgKiAgRXZlcnkgZmFjZXQgY2xhc3MgbXVzdCBkZWZpbmUgYSBwdWJsaWMgc3RhdGljIG1lbWJlciBsb2NhbGU6OmlkLCBvciBiZQorICAgKiAgZGVyaXZlZCBmcm9tIGEgZmFjZXQgdGhhdCBwcm92aWRlcyB0aGlzIG1lbWJlciwgb3RoZXJ3aXNlIHRoZSBmYWNldAorICAgKiAgY2Fubm90IGJlIHVzZWQgaW4gYSBsb2NhbGUuICBUaGUgbG9jYWxlOjppZCBlbnN1cmVzIHRoYXQgZWFjaCBjbGFzcworICAgKiAgdHlwZSBnZXRzIGEgdW5pcXVlIGlkZW50aWZpZXIuCisgICovCisgIGNsYXNzIGxvY2FsZTo6aWQKKyAgeworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBsb2NhbGU7CisgICAgZnJpZW5kIGNsYXNzIGxvY2FsZTo6X0ltcGw7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRmFjZXQ+CisgICAgICBmcmllbmQgY29uc3QgX0ZhY2V0JgorICAgICAgdXNlX2ZhY2V0KGNvbnN0IGxvY2FsZSYpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIGhhc19mYWNldChjb25zdCBsb2NhbGUmKSB0aHJvdygpOworCisgICAgLy8gTkI6IFRoZXJlIGlzIG5vIGFjY2Vzc29yIGZvciBfTV9pbmRleCBiZWNhdXNlIGl0IG1heSBiZSB1c2VkCisgICAgLy8gYmVmb3JlIHRoZSBjb25zdHJ1Y3RvciBpcyBydW47IHRoZSBlZmZlY3Qgb2YgY2FsbGluZyBhIG1lbWJlcgorICAgIC8vIGZ1bmN0aW9uIChldmVuIGFuIGlubGluZSkgd291bGQgYmUgdW5kZWZpbmVkLgorICAgIG11dGFibGUgc2l6ZV90CQlfTV9pbmRleDsKKworICAgIC8vIExhc3QgaWQgbnVtYmVyIGFzc2lnbmVkLgorICAgIHN0YXRpYyBfQXRvbWljX3dvcmQJCV9TX3JlZmNvdW50OworCisgICAgdm9pZAorICAgIG9wZXJhdG9yPShjb25zdCBpZCYpOyAgLy8gTm90IGRlZmluZWQuCisKKyAgICBpZChjb25zdCBpZCYpOyAgLy8gTm90IGRlZmluZWQuCisKKyAgcHVibGljOgorICAgIC8vIE5COiBUaGlzIGNsYXNzIGlzIGFsd2F5cyBhIHN0YXRpYyBkYXRhIG1lbWJlciwgYW5kIHRodXMgY2FuIGJlCisgICAgLy8gY291bnRlZCBvbiB0byBiZSB6ZXJvLWluaXRpYWxpemVkLgorICAgIC8vLyBDb25zdHJ1Y3Rvci4KKyAgICBpZCgpIHsgfQorCisgICAgc2l6ZV90CisgICAgX01faWQoKSBjb25zdCB0aHJvdygpOworICB9OworCisKKyAgLy8gSW1wbGVtZW50YXRpb24gb2JqZWN0IGZvciBsb2NhbGUuCisgIGNsYXNzIGxvY2FsZTo6X0ltcGwKKyAgeworICBwdWJsaWM6CisgICAgLy8gRnJpZW5kcy4KKyAgICBmcmllbmQgY2xhc3MgbG9jYWxlOworICAgIGZyaWVuZCBjbGFzcyBsb2NhbGU6OmZhY2V0OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIGhhc19mYWNldChjb25zdCBsb2NhbGUmKSB0aHJvdygpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgICAgZnJpZW5kIGNvbnN0IF9GYWNldCYKKyAgICAgIHVzZV9mYWNldChjb25zdCBsb2NhbGUmKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DYWNoZT4KKyAgICAgIGZyaWVuZCBzdHJ1Y3QgX191c2VfY2FjaGU7CisKKyAgcHJpdmF0ZToKKyAgICAvLyBEYXRhIE1lbWJlcnMuCisgICAgX0F0b21pY193b3JkCQkJX01fcmVmY291bnQ7CisgICAgY29uc3QgZmFjZXQqKgkJCV9NX2ZhY2V0czsKKyAgICBzaXplX3QJCQkJX01fZmFjZXRzX3NpemU7CisgICAgY29uc3QgZmFjZXQqKgkJCV9NX2NhY2hlczsKKyAgICBjaGFyKioJCQkJX01fbmFtZXM7CisgICAgc3RhdGljIGNvbnN0IGxvY2FsZTo6aWQqIGNvbnN0CV9TX2lkX2N0eXBlW107CisgICAgc3RhdGljIGNvbnN0IGxvY2FsZTo6aWQqIGNvbnN0CV9TX2lkX251bWVyaWNbXTsKKyAgICBzdGF0aWMgY29uc3QgbG9jYWxlOjppZCogY29uc3QJX1NfaWRfY29sbGF0ZVtdOworICAgIHN0YXRpYyBjb25zdCBsb2NhbGU6OmlkKiBjb25zdAlfU19pZF90aW1lW107CisgICAgc3RhdGljIGNvbnN0IGxvY2FsZTo6aWQqIGNvbnN0CV9TX2lkX21vbmV0YXJ5W107CisgICAgc3RhdGljIGNvbnN0IGxvY2FsZTo6aWQqIGNvbnN0CV9TX2lkX21lc3NhZ2VzW107CisgICAgc3RhdGljIGNvbnN0IGxvY2FsZTo6aWQqIGNvbnN0KiBjb25zdCBfU19mYWNldF9jYXRlZ29yaWVzW107CisKKyAgICB2b2lkCisgICAgX01fYWRkX3JlZmVyZW5jZSgpIHRocm93KCkKKyAgICB7IF9fZ251X2N4eDo6X19hdG9taWNfYWRkX2Rpc3BhdGNoKCZfTV9yZWZjb3VudCwgMSk7IH0KKworICAgIHZvaWQKKyAgICBfTV9yZW1vdmVfcmVmZXJlbmNlKCkgdGhyb3coKQorICAgIHsKKyAgICAgIC8vIEJlIHJhY2UtZGV0ZWN0b3ItZnJpZW5kbHkuICBGb3IgbW9yZSBpbmZvIHNlZSBiaXRzL2MrK2NvbmZpZy4KKyAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0JFRk9SRSgmX01fcmVmY291bnQpOworICAgICAgaWYgKF9fZ251X2N4eDo6X19leGNoYW5nZV9hbmRfYWRkX2Rpc3BhdGNoKCZfTV9yZWZjb3VudCwgLTEpID09IDEpCisJeworICAgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0FGVEVSKCZfTV9yZWZjb3VudCk7CisJICBfX3RyeQorCSAgICB7IGRlbGV0ZSB0aGlzOyB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB9CisJfQorICAgIH0KKworICAgIF9JbXBsKGNvbnN0IF9JbXBsJiwgc2l6ZV90KTsKKyAgICBfSW1wbChjb25zdCBjaGFyKiwgc2l6ZV90KTsKKyAgICBfSW1wbChzaXplX3QpIHRocm93KCk7CisKKyAgIH5fSW1wbCgpIHRocm93KCk7CisKKyAgICBfSW1wbChjb25zdCBfSW1wbCYpOyAgLy8gTm90IGRlZmluZWQuCisKKyAgICB2b2lkCisgICAgb3BlcmF0b3I9KGNvbnN0IF9JbXBsJik7ICAvLyBOb3QgZGVmaW5lZC4KKworICAgIGJvb2wKKyAgICBfTV9jaGVja19zYW1lX25hbWUoKQorICAgIHsKKyAgICAgIGJvb2wgX19yZXQgPSB0cnVlOworICAgICAgaWYgKF9NX25hbWVzWzFdKQorCS8vIFdlIG11c3QgYWN0dWFsbHkgY29tcGFyZSBhbGwgdGhlIF9NX25hbWVzOiBjYW4gYmUgYWxsIGVxdWFsIQorCWZvciAoc2l6ZV90IF9faSA9IDA7IF9fcmV0ICYmIF9faSA8IF9TX2NhdGVnb3JpZXNfc2l6ZSAtIDE7ICsrX19pKQorCSAgX19yZXQgPSBfX2J1aWx0aW5fc3RyY21wKF9NX25hbWVzW19faV0sIF9NX25hbWVzW19faSArIDFdKSA9PSAwOworICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICAgIHZvaWQKKyAgICBfTV9yZXBsYWNlX2NhdGVnb3JpZXMoY29uc3QgX0ltcGwqLCBjYXRlZ29yeSk7CisKKyAgICB2b2lkCisgICAgX01fcmVwbGFjZV9jYXRlZ29yeShjb25zdCBfSW1wbCosIGNvbnN0IGxvY2FsZTo6aWQqIGNvbnN0Kik7CisKKyAgICB2b2lkCisgICAgX01fcmVwbGFjZV9mYWNldChjb25zdCBfSW1wbCosIGNvbnN0IGxvY2FsZTo6aWQqKTsKKworICAgIHZvaWQKKyAgICBfTV9pbnN0YWxsX2ZhY2V0KGNvbnN0IGxvY2FsZTo6aWQqLCBjb25zdCBmYWNldCopOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgICAgdm9pZAorICAgICAgX01faW5pdF9mYWNldChfRmFjZXQqIF9fZmFjZXQpCisgICAgICB7IF9NX2luc3RhbGxfZmFjZXQoJl9GYWNldDo6aWQsIF9fZmFjZXQpOyB9CisKKyAgICB2b2lkCisgICAgX01faW5zdGFsbF9jYWNoZShjb25zdCBmYWNldCosIHNpemVfdCk7CisgIH07CisKKworICAvKioKKyAgICogIEBicmllZiAgRmFjZXQgZm9yIGxvY2FsaXplZCBzdHJpbmcgY29tcGFyaXNvbi4KKyAgICoKKyAgICogIFRoaXMgZmFjZXQgZW5jYXBzdWxhdGVzIHRoZSBjb2RlIHRvIGNvbXBhcmUgc3RyaW5ncyBpbiBhIGxvY2FsaXplZAorICAgKiAgbWFubmVyLgorICAgKgorICAgKiAgVGhlIGNvbGxhdGUgdGVtcGxhdGUgdXNlcyBwcm90ZWN0ZWQgdmlydHVhbCBmdW5jdGlvbnMgdG8gcHJvdmlkZQorICAgKiAgdGhlIGFjdHVhbCByZXN1bHRzLiAgVGhlIHB1YmxpYyBhY2Nlc3NvcnMgZm9yd2FyZCB0aGUgY2FsbCB0bworICAgKiAgdGhlIHZpcnR1YWwgZnVuY3Rpb25zLiAgVGhlc2UgdmlydHVhbCBmdW5jdGlvbnMgYXJlIGhvb2tzIGZvcgorICAgKiAgZGV2ZWxvcGVycyB0byBpbXBsZW1lbnQgdGhlIGJlaGF2aW9yIHRoZXkgcmVxdWlyZSBmcm9tIHRoZQorICAgKiAgY29sbGF0ZSBmYWNldC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGNsYXNzIGNvbGxhdGUgOiBwdWJsaWMgbG9jYWxlOjpmYWNldAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBQdWJsaWMgdHlwZWRlZnMKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJUPglzdHJpbmdfdHlwZTsKKyAgICAgIC8vQH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIFVuZGVybHlpbmcgIkMiIGxpYnJhcnkgbG9jYWxlIGluZm9ybWF0aW9uIHNhdmVkIGZyb20KKyAgICAgIC8vIGluaXRpYWxpemF0aW9uLCBuZWVkZWQgYnkgY29sbGF0ZV9ieW5hbWUgYXMgd2VsbC4KKyAgICAgIF9fY19sb2NhbGUJCQlfTV9jX2xvY2FsZV9jb2xsYXRlOworCisgICAgcHVibGljOgorICAgICAgLy8vIE51bXB1bmN0IGZhY2V0IGlkLgorICAgICAgc3RhdGljIGxvY2FsZTo6aWQJCQlpZDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RvciBwZXJmb3JtcyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgcHJvdmlkZWQgYnkgdGhlIHN0YW5kYXJkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19yZWZzICBQYXNzZWQgdG8gdGhlIGJhc2UgZmFjZXQgY2xhc3MuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGNvbGxhdGUoc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IGZhY2V0KF9fcmVmcyksIF9NX2NfbG9jYWxlX2NvbGxhdGUoX1NfZ2V0X2NfbG9jYWxlKCkpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnRlcm5hbCBjb25zdHJ1Y3Rvci4gTm90IGZvciBnZW5lcmFsIHVzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIGNvbnN0cnVjdG9yIGZvciB1c2UgYnkgdGhlIGxpYnJhcnkgaXRzZWxmIHRvIHNldCB1cCBuZXcKKyAgICAgICAqICBsb2NhbGVzLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jbG9jICBUaGUgQyBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtIF9fcmVmcyAgUGFzc2VkIHRvIHRoZSBiYXNlIGZhY2V0IGNsYXNzLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBjb2xsYXRlKF9fY19sb2NhbGUgX19jbG9jLCBzaXplX3QgX19yZWZzID0gMCkKKyAgICAgIDogZmFjZXQoX19yZWZzKSwgX01fY19sb2NhbGVfY29sbGF0ZShfU19jbG9uZV9jX2xvY2FsZShfX2Nsb2MpKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29tcGFyZSB0d28gc3RyaW5ncy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb21wYXJlcyB0d28gc3RyaW5ncyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGJ5IGNhbGxpbmcKKyAgICAgICAqICBjb2xsYXRlOjpkb19jb21wYXJlKCkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvMSAgU3RhcnQgb2Ygc3RyaW5nIDEuCisgICAgICAgKiAgQHBhcmFtIF9faGkxICBFbmQgb2Ygc3RyaW5nIDEuCisgICAgICAgKiAgQHBhcmFtIF9fbG8yICBTdGFydCBvZiBzdHJpbmcgMi4KKyAgICAgICAqICBAcGFyYW0gX19oaTIgIEVuZCBvZiBzdHJpbmcgMi4KKyAgICAgICAqICBAcmV0dXJuICAxIGlmIHN0cmluZzEgPiBzdHJpbmcyLCAtMSBpZiBzdHJpbmcxIDwgc3RyaW5nMiwgZWxzZSAwLgorICAgICAgKi8KKyAgICAgIGludAorICAgICAgY29tcGFyZShjb25zdCBfQ2hhclQqIF9fbG8xLCBjb25zdCBfQ2hhclQqIF9faGkxLAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19sbzIsIGNvbnN0IF9DaGFyVCogX19oaTIpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19jb21wYXJlKF9fbG8xLCBfX2hpMSwgX19sbzIsIF9faGkyKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRyYW5zZm9ybSBzdHJpbmcgdG8gY29tcGFyYWJsZSBmb3JtLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBmb3Igc3RyeGZybSBmdW5jdGlvbmFsaXR5LiAgSXQgdGFrZXMgdGhlCisgICAgICAgKiAgaW5wdXQgc3RyaW5nIGFuZCByZXR1cm5zIGEgbW9kaWZpZWQgc3RyaW5nIHRoYXQgY2FuIGJlIGRpcmVjdGx5CisgICAgICAgKiAgY29tcGFyZWQgdG8gb3RoZXIgdHJhbnNmb3JtZWQgc3RyaW5ncy4gIEluIHRoZSBDIGxvY2FsZSwgdGhpcworICAgICAgICogIGZ1bmN0aW9uIGp1c3QgcmV0dXJucyBhIGNvcHkgb2YgdGhlIGlucHV0IHN0cmluZy4gIEluIHNvbWUgb3RoZXIKKyAgICAgICAqICBsb2NhbGVzLCBpdCBtYXkgcmVwbGFjZSB0d28gY2hhcnMgd2l0aCBvbmUsIGNoYW5nZSBhIGNoYXIgZm9yCisgICAgICAgKiAgYW5vdGhlciwgZXRjLiAgSXQgZG9lcyBzbyBieSByZXR1cm5pbmcgY29sbGF0ZTo6ZG9fdHJhbnNmb3JtKCkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBTdGFydCBvZiBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIEVuZCBvZiBzdHJpbmcuCisgICAgICAgKiAgQHJldHVybiAgVHJhbnNmb3JtZWQgc3RyaW5nX3R5cGUuCisgICAgICAqLworICAgICAgc3RyaW5nX3R5cGUKKyAgICAgIHRyYW5zZm9ybShjb25zdCBfQ2hhclQqIF9fbG8sIGNvbnN0IF9DaGFyVCogX19oaSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3RyYW5zZm9ybShfX2xvLCBfX2hpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBoYXNoIG9mIGEgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIGFuZCByZXR1cm5zIGEgaGFzaCBvbiB0aGUgaW5wdXQgc3RyaW5nLiAgSXQKKyAgICAgICAqICBkb2VzIHNvIGJ5IHJldHVybmluZyBjb2xsYXRlOjpkb19oYXNoKCkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBTdGFydCBvZiBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIEVuZCBvZiBzdHJpbmcuCisgICAgICAgKiAgQHJldHVybiAgSGFzaCB2YWx1ZS4KKyAgICAgICovCisgICAgICBsb25nCisgICAgICBoYXNoKGNvbnN0IF9DaGFyVCogX19sbywgY29uc3QgX0NoYXJUKiBfX2hpKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9faGFzaChfX2xvLCBfX2hpKTsgfQorCisgICAgICAvLyBVc2VkIHRvIGFic3RyYWN0IG91dCBfQ2hhclQgYml0cyBpbiB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbnMsIGJlbG93LgorICAgICAgaW50CisgICAgICBfTV9jb21wYXJlKGNvbnN0IF9DaGFyVCosIGNvbnN0IF9DaGFyVCopIGNvbnN0IHRocm93KCk7CisKKyAgICAgIHNpemVfdAorICAgICAgX01fdHJhbnNmb3JtKF9DaGFyVCosIGNvbnN0IF9DaGFyVCosIHNpemVfdCkgY29uc3QgdGhyb3coKTsKKworICBwcm90ZWN0ZWQ6CisgICAgICAvLy8gRGVzdHJ1Y3Rvci4KKyAgICAgIHZpcnR1YWwKKyAgICAgIH5jb2xsYXRlKCkKKyAgICAgIHsgX1NfZGVzdHJveV9jX2xvY2FsZShfTV9jX2xvY2FsZV9jb2xsYXRlKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbXBhcmUgdHdvIHN0cmluZ3MuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZQorICAgICAgICogIHJldHVybmVkLiAgQHNlZSBjb21wYXJlKCkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvMSAgU3RhcnQgb2Ygc3RyaW5nIDEuCisgICAgICAgKiAgQHBhcmFtIF9faGkxICBFbmQgb2Ygc3RyaW5nIDEuCisgICAgICAgKiAgQHBhcmFtIF9fbG8yICBTdGFydCBvZiBzdHJpbmcgMi4KKyAgICAgICAqICBAcGFyYW0gX19oaTIgIEVuZCBvZiBzdHJpbmcgMi4KKyAgICAgICAqICBAcmV0dXJuICAxIGlmIHN0cmluZzEgPiBzdHJpbmcyLCAtMSBpZiBzdHJpbmcxIDwgc3RyaW5nMiwgZWxzZSAwLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgaW50CisgICAgICBkb19jb21wYXJlKGNvbnN0IF9DaGFyVCogX19sbzEsIGNvbnN0IF9DaGFyVCogX19oaTEsCisJCSBjb25zdCBfQ2hhclQqIF9fbG8yLCBjb25zdCBfQ2hhclQqIF9faGkyKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUcmFuc2Zvcm0gc3RyaW5nIHRvIGNvbXBhcmFibGUgZm9ybS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlCisgICAgICAgKiAgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBTdGFydC4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgRW5kLgorICAgICAgICogIEByZXR1cm4gIHRyYW5zZm9ybWVkIHN0cmluZy4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIHN0cmluZ190eXBlCisgICAgICBkb190cmFuc2Zvcm0oY29uc3QgX0NoYXJUKiBfX2xvLCBjb25zdCBfQ2hhclQqIF9faGkpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBoYXNoIG9mIGEgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIGFuZCByZXR1cm5zIGEgaGFzaCBvbiB0aGUgaW5wdXQgc3RyaW5nLiAgVGhpcworICAgICAgICogIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBTdGFydCBvZiBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIEVuZCBvZiBzdHJpbmcuCisgICAgICAgKiAgQHJldHVybiAgSGFzaCB2YWx1ZS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGxvbmcKKyAgICAgIGRvX2hhc2goY29uc3QgX0NoYXJUKiBfX2xvLCBjb25zdCBfQ2hhclQqIF9faGkpIGNvbnN0OworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGxvY2FsZTo6aWQgY29sbGF0ZTxfQ2hhclQ+OjppZDsKKworICAvLyBTcGVjaWFsaXphdGlvbnMuCisgIHRlbXBsYXRlPD4KKyAgICBpbnQKKyAgICBjb2xsYXRlPGNoYXI+OjpfTV9jb21wYXJlKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKikgY29uc3QgdGhyb3coKTsKKworICB0ZW1wbGF0ZTw+CisgICAgc2l6ZV90CisgICAgY29sbGF0ZTxjaGFyPjo6X01fdHJhbnNmb3JtKGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90KSBjb25zdCB0aHJvdygpOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdGVtcGxhdGU8PgorICAgIGludAorICAgIGNvbGxhdGU8d2NoYXJfdD46Ol9NX2NvbXBhcmUoY29uc3Qgd2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqKSBjb25zdCB0aHJvdygpOworCisgIHRlbXBsYXRlPD4KKyAgICBzaXplX3QKKyAgICBjb2xsYXRlPHdjaGFyX3Q+OjpfTV90cmFuc2Zvcm0od2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqLCBzaXplX3QpIGNvbnN0IHRocm93KCk7CisjZW5kaWYKKworICAvLy8gY2xhc3MgY29sbGF0ZV9ieW5hbWUgWzIyLjIuNC4yXS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGNsYXNzIGNvbGxhdGVfYnluYW1lIDogcHVibGljIGNvbGxhdGU8X0NoYXJUPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvL0B7CisgICAgICAvLy8gUHVibGljIHR5cGVkZWZzCisgICAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVD4gc3RyaW5nX3R5cGU7CisgICAgICAvL0B9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBjb2xsYXRlX2J5bmFtZShjb25zdCBjaGFyKiBfX3MsIHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiBjb2xsYXRlPF9DaGFyVD4oX19yZWZzKQorICAgICAgeworCWlmIChfX2J1aWx0aW5fc3RyY21wKF9fcywgIkMiKSAhPSAwCisJICAgICYmIF9fYnVpbHRpbl9zdHJjbXAoX19zLCAiUE9TSVgiKSAhPSAwKQorCSAgeworCSAgICB0aGlzLT5fU19kZXN0cm95X2NfbG9jYWxlKHRoaXMtPl9NX2NfbG9jYWxlX2NvbGxhdGUpOworCSAgICB0aGlzLT5fU19jcmVhdGVfY19sb2NhbGUodGhpcy0+X01fY19sb2NhbGVfY29sbGF0ZSwgX19zKTsKKwkgIH0KKyAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5jb2xsYXRlX2J5bmFtZSgpIHsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworIyBpbmNsdWRlIDxiaXRzL2xvY2FsZV9jbGFzc2VzLnRjYz4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvbG9jYWxlX2NsYXNzZXMudGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2xvY2FsZV9jbGFzc2VzLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDRkMmFkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2xvY2FsZV9jbGFzc2VzLnRjYwpAQCAtMCwwICsxLDI5OCBAQAorLy8gTG9jYWxlIHN1cHBvcnQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvbG9jYWxlX2NsYXNzZXMudGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bG9jYWxlfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMi4xICBMb2NhbGVzCisvLworCisjaWZuZGVmIF9MT0NBTEVfQ0xBU1NFU19UQ0MKKyNkZWZpbmUgX0xPQ0FMRV9DTEFTU0VTX1RDQyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4KKyAgICBsb2NhbGU6OgorICAgIGxvY2FsZShjb25zdCBsb2NhbGUmIF9fb3RoZXIsIF9GYWNldCogX19mKQorICAgIHsKKyAgICAgIF9NX2ltcGwgPSBuZXcgX0ltcGwoKl9fb3RoZXIuX01faW1wbCwgMSk7CisKKyAgICAgIF9fdHJ5CisJeyBfTV9pbXBsLT5fTV9pbnN0YWxsX2ZhY2V0KCZfRmFjZXQ6OmlkLCBfX2YpOyB9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBfTV9pbXBsLT5fTV9yZW1vdmVfcmVmZXJlbmNlKCk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgICBkZWxldGUgW10gX01faW1wbC0+X01fbmFtZXNbMF07CisgICAgICBfTV9pbXBsLT5fTV9uYW1lc1swXSA9IDA7ICAgLy8gVW5uYW1lZC4KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgIGxvY2FsZQorICAgIGxvY2FsZTo6CisgICAgY29tYmluZShjb25zdCBsb2NhbGUmIF9fb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgX0ltcGwqIF9fdG1wID0gbmV3IF9JbXBsKCpfTV9pbXBsLCAxKTsKKyAgICAgIF9fdHJ5CisJeworCSAgX190bXAtPl9NX3JlcGxhY2VfZmFjZXQoX19vdGhlci5fTV9pbXBsLCAmX0ZhY2V0OjppZCk7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgX190bXAtPl9NX3JlbW92ZV9yZWZlcmVuY2UoKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICAgIHJldHVybiBsb2NhbGUoX190bXApOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBib29sCisgICAgbG9jYWxlOjoKKyAgICBvcGVyYXRvcigpKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fczEsCisJICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fczIpIGNvbnN0CisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmNvbGxhdGU8X0NoYXJUPiBfX2NvbGxhdGVfdHlwZTsKKyAgICAgIGNvbnN0IF9fY29sbGF0ZV90eXBlJiBfX2NvbGxhdGUgPSB1c2VfZmFjZXQ8X19jb2xsYXRlX3R5cGU+KCp0aGlzKTsKKyAgICAgIHJldHVybiAoX19jb2xsYXRlLmNvbXBhcmUoX19zMS5kYXRhKCksIF9fczEuZGF0YSgpICsgX19zMS5sZW5ndGgoKSwKKwkJCQlfX3MyLmRhdGEoKSwgX19zMi5kYXRhKCkgKyBfX3MyLmxlbmd0aCgpKSA8IDApOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBmb3IgdGhlIHByZXNlbmNlIG9mIGEgZmFjZXQuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBoYXNfZmFjZXQgdGVzdHMgdGhlIGxvY2FsZSBhcmd1bWVudCBmb3IgdGhlIHByZXNlbmNlIG9mIHRoZSBmYWNldCB0eXBlCisgICAqICBwcm92aWRlZCBhcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyLiAgRmFjZXRzIGRlcml2ZWQgZnJvbSB0aGUgZmFjZXQKKyAgICogIHBhcmFtZXRlciB3aWxsIGFsc28gcmV0dXJuIHRydWUuCisgICAqCisgICAqICBAdHBhcmFtICBfRmFjZXQgIFRoZSBmYWNldCB0eXBlIHRvIHRlc3QgdGhlIHByZXNlbmNlIG9mLgorICAgKiAgQHBhcmFtICBfX2xvYyAgVGhlIGxvY2FsZSB0byB0ZXN0LgorICAgKiAgQHJldHVybiAgdHJ1ZSBpZiBAcCBfX2xvYyBjb250YWlucyBhIGZhY2V0IG9mIHR5cGUgX0ZhY2V0LCBlbHNlIGZhbHNlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRmFjZXQ+CisgICAgYm9vbAorICAgIGhhc19mYWNldChjb25zdCBsb2NhbGUmIF9fbG9jKSB0aHJvdygpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90IF9faSA9IF9GYWNldDo6aWQuX01faWQoKTsKKyAgICAgIGNvbnN0IGxvY2FsZTo6ZmFjZXQqKiBfX2ZhY2V0cyA9IF9fbG9jLl9NX2ltcGwtPl9NX2ZhY2V0czsKKyAgICAgIHJldHVybiAoX19pIDwgX19sb2MuX01faW1wbC0+X01fZmFjZXRzX3NpemUKKyNpZmRlZiBfX0dYWF9SVFRJCisJICAgICAgJiYgZHluYW1pY19jYXN0PGNvbnN0IF9GYWNldCo+KF9fZmFjZXRzW19faV0pKTsKKyNlbHNlCisgICAgICAgICAgICAgICYmIHN0YXRpY19jYXN0PGNvbnN0IF9GYWNldCo+KF9fZmFjZXRzW19faV0pKTsKKyNlbmRpZgorICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIGEgZmFjZXQuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICB1c2VfZmFjZXQgbG9va3MgZm9yIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgZmFjZXQgb2YgdHlwZSBGYWNldAorICAgKiAgd2hlcmUgRmFjZXQgaXMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlci4gIElmIGhhc19mYWNldChsb2NhbGUpIGlzIHRydWUsCisgICAqICB0aGVyZSBpcyBhIHN1aXRhYmxlIGZhY2V0IHRvIHJldHVybi4gIEl0IHRocm93cyBzdGQ6OmJhZF9jYXN0IGlmIHRoZQorICAgKiAgbG9jYWxlIGRvZXNuJ3QgY29udGFpbiBhIGZhY2V0IG9mIHR5cGUgRmFjZXQuCisgICAqCisgICAqICBAdHBhcmFtICBfRmFjZXQgIFRoZSBmYWNldCB0eXBlIHRvIGFjY2Vzcy4KKyAgICogIEBwYXJhbSAgX19sb2MgIFRoZSBsb2NhbGUgdG8gdXNlLgorICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIGZhY2V0IG9mIHR5cGUgRmFjZXQuCisgICAqICBAdGhyb3cgIHN0ZDo6YmFkX2Nhc3QgaWYgQHAgX19sb2MgZG9lc24ndCBjb250YWluIGEgZmFjZXQgb2YgdHlwZSBfRmFjZXQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4KKyAgICBjb25zdCBfRmFjZXQmCisgICAgdXNlX2ZhY2V0KGNvbnN0IGxvY2FsZSYgX19sb2MpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90IF9faSA9IF9GYWNldDo6aWQuX01faWQoKTsKKyAgICAgIGNvbnN0IGxvY2FsZTo6ZmFjZXQqKiBfX2ZhY2V0cyA9IF9fbG9jLl9NX2ltcGwtPl9NX2ZhY2V0czsKKyAgICAgIGlmIChfX2kgPj0gX19sb2MuX01faW1wbC0+X01fZmFjZXRzX3NpemUgfHwgIV9fZmFjZXRzW19faV0pCisgICAgICAgIF9fdGhyb3dfYmFkX2Nhc3QoKTsKKyNpZmRlZiBfX0dYWF9SVFRJCisgICAgICByZXR1cm4gZHluYW1pY19jYXN0PGNvbnN0IF9GYWNldCY+KCpfX2ZhY2V0c1tfX2ldKTsKKyNlbHNlCisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgX0ZhY2V0Jj4oKl9fZmFjZXRzW19faV0pOworI2VuZGlmCisgICAgfQorCisKKyAgLy8gR2VuZXJpYyB2ZXJzaW9uIGRvZXMgbm90aGluZy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGludAorICAgIGNvbGxhdGU8X0NoYXJUPjo6X01fY29tcGFyZShjb25zdCBfQ2hhclQqLCBjb25zdCBfQ2hhclQqKSBjb25zdCB0aHJvdyAoKQorICAgIHsgcmV0dXJuIDA7IH0KKworICAvLyBHZW5lcmljIHZlcnNpb24gZG9lcyBub3RoaW5nLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgc2l6ZV90CisgICAgY29sbGF0ZTxfQ2hhclQ+OjpfTV90cmFuc2Zvcm0oX0NoYXJUKiwgY29uc3QgX0NoYXJUKiwgc2l6ZV90KSBjb25zdCB0aHJvdyAoKQorICAgIHsgcmV0dXJuIDA7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgaW50CisgICAgY29sbGF0ZTxfQ2hhclQ+OjoKKyAgICBkb19jb21wYXJlKGNvbnN0IF9DaGFyVCogX19sbzEsIGNvbnN0IF9DaGFyVCogX19oaTEsCisJICAgICAgIGNvbnN0IF9DaGFyVCogX19sbzIsIGNvbnN0IF9DaGFyVCogX19oaTIpIGNvbnN0CisgICAgeworICAgICAgLy8gc3RyY29sbCBhc3N1bWVzIHplcm8tdGVybWluYXRlZCBzdHJpbmdzIHNvIHdlIG1ha2UgYSBjb3B5CisgICAgICAvLyBhbmQgdGhlbiBwdXQgYSB6ZXJvIGF0IHRoZSBlbmQuCisgICAgICBjb25zdCBzdHJpbmdfdHlwZSBfX29uZShfX2xvMSwgX19oaTEpOworICAgICAgY29uc3Qgc3RyaW5nX3R5cGUgX190d28oX19sbzIsIF9faGkyKTsKKworICAgICAgY29uc3QgX0NoYXJUKiBfX3AgPSBfX29uZS5jX3N0cigpOworICAgICAgY29uc3QgX0NoYXJUKiBfX3BlbmQgPSBfX29uZS5kYXRhKCkgKyBfX29uZS5sZW5ndGgoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCogX19xID0gX190d28uY19zdHIoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCogX19xZW5kID0gX190d28uZGF0YSgpICsgX190d28ubGVuZ3RoKCk7CisKKyAgICAgIC8vIHN0cmNvbGwgc3RvcHMgd2hlbiBpdCBzZWVzIGEgbnVsIGNoYXJhY3RlciBzbyB3ZSBicmVhaworICAgICAgLy8gdGhlIHN0cmluZ3MgaW50byB6ZXJvLXRlcm1pbmF0ZWQgc3Vic3RyaW5ncyBhbmQgcGFzcyB0aG9zZQorICAgICAgLy8gdG8gc3RyY29sbC4KKyAgICAgIGZvciAoOzspCisJeworCSAgY29uc3QgaW50IF9fcmVzID0gX01fY29tcGFyZShfX3AsIF9fcSk7CisJICBpZiAoX19yZXMpCisJICAgIHJldHVybiBfX3JlczsKKworCSAgX19wICs9IGNoYXJfdHJhaXRzPF9DaGFyVD46Omxlbmd0aChfX3ApOworCSAgX19xICs9IGNoYXJfdHJhaXRzPF9DaGFyVD46Omxlbmd0aChfX3EpOworCSAgaWYgKF9fcCA9PSBfX3BlbmQgJiYgX19xID09IF9fcWVuZCkKKwkgICAgcmV0dXJuIDA7CisJICBlbHNlIGlmIChfX3AgPT0gX19wZW5kKQorCSAgICByZXR1cm4gLTE7CisJICBlbHNlIGlmIChfX3EgPT0gX19xZW5kKQorCSAgICByZXR1cm4gMTsKKworCSAgX19wKys7CisJICBfX3ErKzsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICB0eXBlbmFtZSBjb2xsYXRlPF9DaGFyVD46OnN0cmluZ190eXBlCisgICAgY29sbGF0ZTxfQ2hhclQ+OjoKKyAgICBkb190cmFuc2Zvcm0oY29uc3QgX0NoYXJUKiBfX2xvLCBjb25zdCBfQ2hhclQqIF9faGkpIGNvbnN0CisgICAgeworICAgICAgc3RyaW5nX3R5cGUgX19yZXQ7CisKKyAgICAgIC8vIHN0cnhmcm0gYXNzdW1lcyB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5ncyBzbyB3ZSBtYWtlIGEgY29weQorICAgICAgY29uc3Qgc3RyaW5nX3R5cGUgX19zdHIoX19sbywgX19oaSk7CisKKyAgICAgIGNvbnN0IF9DaGFyVCogX19wID0gX19zdHIuY19zdHIoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCogX19wZW5kID0gX19zdHIuZGF0YSgpICsgX19zdHIubGVuZ3RoKCk7CisKKyAgICAgIHNpemVfdCBfX2xlbiA9IChfX2hpIC0gX19sbykgKiAyOworCisgICAgICBfQ2hhclQqIF9fYyA9IG5ldyBfQ2hhclRbX19sZW5dOworCisgICAgICBfX3RyeQorCXsKKwkgIC8vIHN0cnhmcm0gc3RvcHMgd2hlbiBpdCBzZWVzIGEgbnVsIGNoYXJhY3RlciBzbyB3ZSBicmVhaworCSAgLy8gdGhlIHN0cmluZyBpbnRvIHplcm8tdGVybWluYXRlZCBzdWJzdHJpbmdzIGFuZCBwYXNzIHRob3NlCisJICAvLyB0byBzdHJ4ZnJtLgorCSAgZm9yICg7OykKKwkgICAgeworCSAgICAgIC8vIEZpcnN0IHRyeSBhIGJ1ZmZlciBwZXJoYXBzIGJpZyBlbm91Z2guCisJICAgICAgc2l6ZV90IF9fcmVzID0gX01fdHJhbnNmb3JtKF9fYywgX19wLCBfX2xlbik7CisJICAgICAgLy8gSWYgdGhlIGJ1ZmZlciB3YXMgbm90IGxhcmdlIGVub3VnaCwgdHJ5IGFnYWluIHdpdGggdGhlCisJICAgICAgLy8gY29ycmVjdCBzaXplLgorCSAgICAgIGlmIChfX3JlcyA+PSBfX2xlbikKKwkJeworCQkgIF9fbGVuID0gX19yZXMgKyAxOworCQkgIGRlbGV0ZSBbXSBfX2MsIF9fYyA9IDA7CisJCSAgX19jID0gbmV3IF9DaGFyVFtfX2xlbl07CisJCSAgX19yZXMgPSBfTV90cmFuc2Zvcm0oX19jLCBfX3AsIF9fbGVuKTsKKwkJfQorCisJICAgICAgX19yZXQuYXBwZW5kKF9fYywgX19yZXMpOworCSAgICAgIF9fcCArPSBjaGFyX3RyYWl0czxfQ2hhclQ+OjpsZW5ndGgoX19wKTsKKwkgICAgICBpZiAoX19wID09IF9fcGVuZCkKKwkJYnJlYWs7CisKKwkgICAgICBfX3ArKzsKKwkgICAgICBfX3JldC5wdXNoX2JhY2soX0NoYXJUKCkpOworCSAgICB9CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgZGVsZXRlIFtdIF9fYzsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKworICAgICAgZGVsZXRlIFtdIF9fYzsKKworICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgbG9uZworICAgIGNvbGxhdGU8X0NoYXJUPjo6CisgICAgZG9faGFzaChjb25zdCBfQ2hhclQqIF9fbG8sIGNvbnN0IF9DaGFyVCogX19oaSkgY29uc3QKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIF9fdmFsID0gMDsKKyAgICAgIGZvciAoOyBfX2xvIDwgX19oaTsgKytfX2xvKQorCV9fdmFsID0KKwkgICpfX2xvICsgKChfX3ZhbCA8PCA3KQorCQkgICB8IChfX3ZhbCA+PiAoX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPHVuc2lnbmVkIGxvbmc+OjoKKwkJCQlfX2RpZ2l0cyAtIDcpKSk7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bG9uZz4oX192YWwpOworICAgIH0KKworICAvLyBJbmhpYml0IGltcGxpY2l0IGluc3RhbnRpYXRpb25zIGZvciByZXF1aXJlZCBpbnN0YW50aWF0aW9ucywKKyAgLy8gd2hpY2ggYXJlIGRlZmluZWQgdmlhIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGVsc2V3aGVyZS4KKyNpZiBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGNvbGxhdGU8Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBjb2xsYXRlX2J5bmFtZTxjaGFyPjsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBjb2xsYXRlPGNoYXI+JgorICAgIHVzZV9mYWNldDxjb2xsYXRlPGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxjb2xsYXRlPGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgY29sbGF0ZTx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGNvbGxhdGVfYnluYW1lPHdjaGFyX3Q+OworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IGNvbGxhdGU8d2NoYXJfdD4mCisgICAgdXNlX2ZhY2V0PGNvbGxhdGU8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PGNvbGxhdGU8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKyNlbmRpZgorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2xvY2FsZV9mYWNldHMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9sb2NhbGVfZmFjZXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmY2FjMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9sb2NhbGVfZmFjZXRzLmgKQEAgLTAsMCArMSwyNjEwIEBACisvLyBMb2NhbGUgc3VwcG9ydCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9sb2NhbGVfZmFjZXRzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtsb2NhbGV9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIyLjEgIExvY2FsZXMKKy8vCisKKyNpZm5kZWYgX0xPQ0FMRV9GQUNFVFNfSAorI2RlZmluZSBfTE9DQUxFX0ZBQ0VUU19IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Y3djdHlwZT4JLy8gRm9yIHdjdHlwZV90CisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPGJpdHMvY3R5cGVfYmFzZS5oPgorI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxiaXRzL2lvc19iYXNlLmg+ICAvLyBGb3IgaW9zX2Jhc2UsIGlvc19iYXNlOjppb3N0YXRlCisjaW5jbHVkZSA8c3RyZWFtYnVmPgorI2luY2x1ZGUgPGJpdHMvY3BwX3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8ZXh0L251bWVyaWNfdHJhaXRzLmg+CisjaW5jbHVkZSA8Yml0cy9zdHJlYW1idWZfaXRlcmF0b3IuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIE5COiBEb24ndCBpbnN0YW50aWF0ZSByZXF1aXJlZCB3Y2hhcl90IGZhY2V0cyBpZiBubyB3Y2hhcl90IHN1cHBvcnQuCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyMgZGVmaW5lICBfR0xJQkNYWF9OVU1fRkFDRVRTIDI4CisjZWxzZQorIyBkZWZpbmUgIF9HTElCQ1hYX05VTV9GQUNFVFMgMTQKKyNlbmRpZgorCisgIC8vIENvbnZlcnQgc3RyaW5nIHRvIG51bWVyaWMgdmFsdWUgb2YgdHlwZSBfVHAgYW5kIHN0b3JlIHJlc3VsdHMuCisgIC8vIE5COiBUaGlzIGlzIHNwZWNpYWxpemVkIGZvciBhbGwgcmVxdWlyZWQgdHlwZXMsIHRoZXJlIGlzIG5vCisgIC8vIGdlbmVyaWMgZGVmaW5pdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX2NvbnZlcnRfdG9fdihjb25zdCBjaGFyKiwgX1RwJiwgaW9zX2Jhc2U6Omlvc3RhdGUmLAorCQkgICBjb25zdCBfX2NfbG9jYWxlJikgdGhyb3coKTsKKworICAvLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbnMgZm9yIHJlcXVpcmVkIHR5cGVzLgorICB0ZW1wbGF0ZTw+CisgICAgdm9pZAorICAgIF9fY29udmVydF90b192KGNvbnN0IGNoYXIqLCBmbG9hdCYsIGlvc19iYXNlOjppb3N0YXRlJiwKKwkJICAgY29uc3QgX19jX2xvY2FsZSYpIHRocm93KCk7CisKKyAgdGVtcGxhdGU8PgorICAgIHZvaWQKKyAgICBfX2NvbnZlcnRfdG9fdihjb25zdCBjaGFyKiwgZG91YmxlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmLAorCQkgICBjb25zdCBfX2NfbG9jYWxlJikgdGhyb3coKTsKKworICB0ZW1wbGF0ZTw+CisgICAgdm9pZAorICAgIF9fY29udmVydF90b192KGNvbnN0IGNoYXIqLCBsb25nIGRvdWJsZSYsIGlvc19iYXNlOjppb3N0YXRlJiwKKwkJICAgY29uc3QgX19jX2xvY2FsZSYpIHRocm93KCk7CisKKyAgLy8gTkI6IF9fcGFkIGlzIGEgc3RydWN0LCByYXRoZXIgdGhhbiBhIGZ1bmN0aW9uLCBzbyBpdCBjYW4gYmUKKyAgLy8gcGFydGlhbGx5LXNwZWNpYWxpemVkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RydWN0IF9fcGFkCisgICAgeworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX3BhZChpb3NfYmFzZSYgX19pbywgX0NoYXJUIF9fZmlsbCwgX0NoYXJUKiBfX25ld3MsCisJICAgICBjb25zdCBfQ2hhclQqIF9fb2xkcywgc3RyZWFtc2l6ZSBfX25ld2xlbiwgc3RyZWFtc2l6ZSBfX29sZGxlbik7CisgICAgfTsKKworICAvLyBVc2VkIGJ5IGJvdGggbnVtZXJpYyBhbmQgbW9uZXRhcnkgZmFjZXRzLgorICAvLyBJbnNlcnRzICJncm91cCBzZXBhcmF0b3IiIGNoYXJhY3RlcnMgaW50byBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLgorICAvLyBJdCdzIHJlY3Vyc2l2ZSwgb25lIGl0ZXJhdGlvbiBwZXIgZ3JvdXAuICBJdCBtb3ZlcyB0aGUgY2hhcmFjdGVycworICAvLyBpbiB0aGUgYnVmZmVyIHRoaXMgd2F5OiAieHh4eDEyMzQ1IiAtPiAiMTIsMzQ1eHh4Ii4gIENhbGwgdGhpcworICAvLyBvbmx5IHdpdGggX19nc2l6ZSAhPSAwLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgX0NoYXJUKgorICAgIF9fYWRkX2dyb3VwaW5nKF9DaGFyVCogX19zLCBfQ2hhclQgX19zZXAsCisJCSAgIGNvbnN0IGNoYXIqIF9fZ2JlZywgc2l6ZV90IF9fZ3NpemUsCisJCSAgIGNvbnN0IF9DaGFyVCogX19maXJzdCwgY29uc3QgX0NoYXJUKiBfX2xhc3QpOworCisgIC8vIFRoaXMgdGVtcGxhdGUgcGVybWl0cyBzcGVjaWFsaXppbmcgZmFjZXQgb3V0cHV0IGNvZGUgZm9yCisgIC8vIG9zdHJlYW1idWZfaXRlcmF0b3IuICBGb3Igb3N0cmVhbWJ1Zl9pdGVyYXRvciwgc3B1dG4gaXMKKyAgLy8gc2lnbmlmaWNhbnRseSBtb3JlIGVmZmljaWVudCB0aGFuIGluY3JlbWVudGluZyBpdGVyYXRvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBpbmxpbmUKKyAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4KKyAgICBfX3dyaXRlKG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiBfX3MsIGNvbnN0IF9DaGFyVCogX193cywgaW50IF9fbGVuKQorICAgIHsKKyAgICAgIF9fcy5fTV9wdXQoX193cywgX19sZW4pOworICAgICAgcmV0dXJuIF9fczsKKyAgICB9CisKKyAgLy8gVGhpcyBpcyB0aGUgdW5zcGVjaWFsaXplZCBmb3JtIG9mIHRoZSB0ZW1wbGF0ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICBpbmxpbmUKKyAgICBfT3V0SXRlcgorICAgIF9fd3JpdGUoX091dEl0ZXIgX19zLCBjb25zdCBfQ2hhclQqIF9fd3MsIGludCBfX2xlbikKKyAgICB7CisgICAgICBmb3IgKGludCBfX2ogPSAwOyBfX2ogPCBfX2xlbjsgX19qKyssICsrX19zKQorCSpfX3MgPSBfX3dzW19fal07CisgICAgICByZXR1cm4gX19zOworICAgIH0KKworCisgIC8vIDIyLjIuMS4xICBUZW1wbGF0ZSBjbGFzcyBjdHlwZQorICAvLyBJbmNsdWRlIGhvc3QgYW5kIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgY3R5cGUgZW51bXMgZm9yIGN0eXBlX2Jhc2UuCisKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbW1vbiBiYXNlIGZvciBjdHlwZSBmYWNldAorICAgKgorICAgKiAgVGhpcyB0ZW1wbGF0ZSBjbGFzcyBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHB1YmxpYyBmdW5jdGlvbnMKKyAgICogIHRoYXQgZm9yd2FyZCB0byB0aGUgcHJvdGVjdGVkIHZpcnR1YWwgZnVuY3Rpb25zLgorICAgKgorICAgKiAgVGhpcyB0ZW1wbGF0ZSBhbHNvIHByb3ZpZGVzIGFic3RyYWN0IHN0dWJzIGZvciB0aGUgcHJvdGVjdGVkIHZpcnR1YWwKKyAgICogIGZ1bmN0aW9ucy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGNsYXNzIF9fY3R5cGVfYWJzdHJhY3RfYmFzZSA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LCBwdWJsaWMgY3R5cGVfYmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIC8vLyBUeXBlZGVmIGZvciB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyCisgICAgICB0eXBlZGVmIF9DaGFyVCBjaGFyX3R5cGU7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGVzdCBjaGFyX3R5cGUgY2xhc3NpZmljYXRpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmluZHMgYSBtYXNrIE0gZm9yIEBhIF9fYyBhbmQgY29tcGFyZXMgaXQgdG8KKyAgICAgICAqICBtYXNrIEBhIF9fbS4gIEl0IGRvZXMgc28gYnkgcmV0dXJuaW5nIHRoZSB2YWx1ZSBvZgorICAgICAgICogIGN0eXBlPGNoYXJfdHlwZT46OmRvX2lzKCkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyX3R5cGUgdG8gY29tcGFyZSB0aGUgbWFzayBvZi4KKyAgICAgICAqICBAcGFyYW0gX19tICBUaGUgbWFzayB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHJldHVybiAgKE0gJiBfX20pICE9IDAuCisgICAgICAqLworICAgICAgYm9vbAorICAgICAgaXMobWFzayBfX20sIGNoYXJfdHlwZSBfX2MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19pcyhfX20sIF9fYyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gYSBtYXNrIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBtYXNrIGZvciBlYWNoIGNoYXJfdHlwZSBpbiB0aGUgcmFuZ2UgW2xvLGhpKQorICAgICAgICogIGFuZCBzdWNjZXNzaXZlbHkgd3JpdGVzIGl0IHRvIHZlYy4gIHZlYyBtdXN0IGhhdmUgYXMgbWFueSBlbGVtZW50cworICAgICAgICogIGFzIHRoZSBjaGFyIGFycmF5LiAgSXQgZG9lcyBzbyBieSByZXR1cm5pbmcgdGhlIHZhbHVlIG9mCisgICAgICAgKiAgY3R5cGU8Y2hhcl90eXBlPjo6ZG9faXMoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX3ZlYyAgUG9pbnRlciB0byBhbiBhcnJheSBvZiBtYXNrIHN0b3JhZ2UuCisgICAgICAgKiAgQHJldHVybiAgQGEgX19oaS4KKyAgICAgICovCisgICAgICBjb25zdCBjaGFyX3R5cGUqCisgICAgICBpcyhjb25zdCBjaGFyX3R5cGUgKl9fbG8sIGNvbnN0IGNoYXJfdHlwZSAqX19oaSwgbWFzayAqX192ZWMpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19pcyhfX2xvLCBfX2hpLCBfX3ZlYyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGNoYXJfdHlwZSBtYXRjaGluZyBhIG1hc2sKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgYW5kIHJldHVybnMgdGhlIGZpcnN0IGNoYXJfdHlwZSBjIGluCisgICAgICAgKiAgW2xvLGhpKSBmb3Igd2hpY2ggaXMobSxjKSBpcyB0cnVlLiAgSXQgZG9lcyBzbyBieSByZXR1cm5pbmcKKyAgICAgICAqICBjdHlwZTxjaGFyX3R5cGU+Ojpkb19zY2FuX2lzKCkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX20gIFRoZSBtYXNrIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcGFyYW0gX19sbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgUG9pbnRlciB0byBtYXRjaGluZyBjaGFyX3R5cGUgaWYgZm91bmQsIGVsc2UgQGEgX19oaS4KKyAgICAgICovCisgICAgICBjb25zdCBjaGFyX3R5cGUqCisgICAgICBzY2FuX2lzKG1hc2sgX19tLCBjb25zdCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3NjYW5faXMoX19tLCBfX2xvLCBfX2hpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgY2hhcl90eXBlIG5vdCBtYXRjaGluZyBhIG1hc2sKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgYW5kIHJldHVybnMgdGhlIGZpcnN0IGNoYXJfdHlwZSBjIGluCisgICAgICAgKiAgW2xvLGhpKSBmb3Igd2hpY2ggaXMobSxjKSBpcyBmYWxzZS4gIEl0IGRvZXMgc28gYnkgcmV0dXJuaW5nCisgICAgICAgKiAgY3R5cGU8Y2hhcl90eXBlPjo6ZG9fc2Nhbl9ub3QoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbSAgVGhlIG1hc2sgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIGZpcnN0IGNoYXIgaW4gcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIFBvaW50ZXIgdG8gbm9uLW1hdGNoaW5nIGNoYXIgaWYgZm91bmQsIGVsc2UgQGEgX19oaS4KKyAgICAgICovCisgICAgICBjb25zdCBjaGFyX3R5cGUqCisgICAgICBzY2FuX25vdChtYXNrIF9fbSwgY29uc3QgY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19zY2FuX25vdChfX20sIF9fbG8sIF9faGkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCB0byB1cHBlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIGFyZ3VtZW50IHRvIHVwcGVyY2FzZSBpZiBwb3NzaWJsZS4KKyAgICAgICAqICBJZiBub3QgcG9zc2libGUgKGZvciBleGFtcGxlLCAnMicpLCByZXR1cm5zIHRoZSBhcmd1bWVudC4gIEl0IGRvZXMKKyAgICAgICAqICBzbyBieSByZXR1cm5pbmcgY3R5cGU8Y2hhcl90eXBlPjo6ZG9fdG91cHBlcigpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhcl90eXBlIHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIHVwcGVyY2FzZSBjaGFyX3R5cGUgaWYgY29udmVydGlibGUsIGVsc2UgQGEgX19jLgorICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZQorICAgICAgdG91cHBlcihjaGFyX3R5cGUgX19jKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fdG91cHBlcihfX2MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCBhcnJheSB0byB1cHBlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gY29udmVydHMgZWFjaCBjaGFyX3R5cGUgaW4gdGhlIHJhbmdlIFtsbyxoaSkgdG8KKyAgICAgICAqICB1cHBlcmNhc2UgaWYgcG9zc2libGUuICBPdGhlciBlbGVtZW50cyByZW1haW4gdW50b3VjaGVkLiAgSXQgZG9lcyBzbworICAgICAgICogIGJ5IHJldHVybmluZyBjdHlwZTxjaGFyX3R5cGU+OjogZG9fdG91cHBlcihsbywgaGkpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19sbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgQGEgX19oaS4KKyAgICAgICovCisgICAgICBjb25zdCBjaGFyX3R5cGUqCisgICAgICB0b3VwcGVyKGNoYXJfdHlwZSAqX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fdG91cHBlcihfX2xvLCBfX2hpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnZlcnQgdG8gbG93ZXJjYXNlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBhcmd1bWVudCB0byBsb3dlcmNhc2UgaWYgcG9zc2libGUuICBJZgorICAgICAgICogIG5vdCBwb3NzaWJsZSAoZm9yIGV4YW1wbGUsICcyJyksIHJldHVybnMgdGhlIGFyZ3VtZW50LiAgSXQgZG9lcyBzbworICAgICAgICogIGJ5IHJldHVybmluZyBjdHlwZTxjaGFyX3R5cGU+Ojpkb190b2xvd2VyKGMpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhcl90eXBlIHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGxvd2VyY2FzZSBjaGFyX3R5cGUgaWYgY29udmVydGlibGUsIGVsc2UgQGEgX19jLgorICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZQorICAgICAgdG9sb3dlcihjaGFyX3R5cGUgX19jKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fdG9sb3dlcihfX2MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCBhcnJheSB0byBsb3dlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gY29udmVydHMgZWFjaCBjaGFyX3R5cGUgaW4gdGhlIHJhbmdlIFtfX2xvLF9faGkpIHRvCisgICAgICAgKiAgbG93ZXJjYXNlIGlmIHBvc3NpYmxlLiAgT3RoZXIgZWxlbWVudHMgcmVtYWluIHVudG91Y2hlZC4gIEl0IGRvZXMgc28KKyAgICAgICAqICBieSByZXR1cm5pbmcgY3R5cGU8Y2hhcl90eXBlPjo6IGRvX3RvbG93ZXIoX19sbywgX19oaSkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIHRvbG93ZXIoY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb190b2xvd2VyKF9fbG8sIF9faGkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgV2lkZW4gY2hhciB0byBjaGFyX3R5cGUKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgY2hhciBhcmd1bWVudCB0byBjaGFyX3R5cGUgdXNpbmcgdGhlCisgICAgICAgKiAgc2ltcGxlc3QgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbi4gIEl0IGRvZXMgc28gYnkgcmV0dXJuaW5nCisgICAgICAgKiAgY3R5cGU8Y2hhcl90eXBlPjo6ZG9fd2lkZW4oYykuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQgZm9yIGNvZGVwYWdlIGNvbnZlcnNpb25zLiAgU2VlCisgICAgICAgKiAgY29kZWN2dCBmb3IgdGhhdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fYyAgVGhlIGNoYXIgdG8gY29udmVydC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY29udmVydGVkIGNoYXJfdHlwZS4KKyAgICAgICovCisgICAgICBjaGFyX3R5cGUKKyAgICAgIHdpZGVuKGNoYXIgX19jKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fd2lkZW4oX19jKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFdpZGVuIGFycmF5IHRvIGNoYXJfdHlwZQorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGVhY2ggY2hhciBpbiB0aGUgaW5wdXQgdG8gY2hhcl90eXBlIHVzaW5nIHRoZQorICAgICAgICogIHNpbXBsZXN0IHJlYXNvbmFibGUgdHJhbnNmb3JtYXRpb24uICBJdCBkb2VzIHNvIGJ5IHJldHVybmluZworICAgICAgICogIGN0eXBlPGNoYXJfdHlwZT46OmRvX3dpZGVuKGMpLgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX190byAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYXJyYXkuCisgICAgICAgKiAgQHJldHVybiAgQGEgX19oaS4KKyAgICAgICovCisgICAgICBjb25zdCBjaGFyKgorICAgICAgd2lkZW4oY29uc3QgY2hhciogX19sbywgY29uc3QgY2hhciogX19oaSwgY2hhcl90eXBlKiBfX3RvKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fd2lkZW4oX19sbywgX19oaSwgX190byk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOYXJyb3cgY2hhcl90eXBlIHRvIGNoYXIKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgY2hhcl90eXBlIHRvIGNoYXIgdXNpbmcgdGhlIHNpbXBsZXN0CisgICAgICAgKiAgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbi4gIElmIHRoZSBjb252ZXJzaW9uIGZhaWxzLCBkZmF1bHQgaXMKKyAgICAgICAqICByZXR1cm5lZCBpbnN0ZWFkLiAgSXQgZG9lcyBzbyBieSByZXR1cm5pbmcKKyAgICAgICAqICBjdHlwZTxjaGFyX3R5cGU+Ojpkb19uYXJyb3coX19jKS4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCBmb3IgY29kZXBhZ2UgY29udmVyc2lvbnMuICBTZWUKKyAgICAgICAqICBjb2RlY3Z0IGZvciB0aGF0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhcl90eXBlIHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHBhcmFtIF9fZGZhdWx0ICBDaGFyIHRvIHJldHVybiBpZiBjb252ZXJzaW9uIGZhaWxzLgorICAgICAgICogIEByZXR1cm4gIFRoZSBjb252ZXJ0ZWQgY2hhci4KKyAgICAgICovCisgICAgICBjaGFyCisgICAgICBuYXJyb3coY2hhcl90eXBlIF9fYywgY2hhciBfX2RmYXVsdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX25hcnJvdyhfX2MsIF9fZGZhdWx0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE5hcnJvdyBhcnJheSB0byBjaGFyIGFycmF5CisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gY29udmVydHMgZWFjaCBjaGFyX3R5cGUgaW4gdGhlIGlucHV0IHRvIGNoYXIgdXNpbmcgdGhlCisgICAgICAgKiAgc2ltcGxlc3QgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbiBhbmQgd3JpdGVzIHRoZSByZXN1bHRzIHRvIHRoZQorICAgICAgICogIGRlc3RpbmF0aW9uIGFycmF5LiAgRm9yIGFueSBjaGFyX3R5cGUgaW4gdGhlIGlucHV0IHRoYXQgY2Fubm90IGJlCisgICAgICAgKiAgY29udmVydGVkLCBAYSBkZmF1bHQgaXMgdXNlZCBpbnN0ZWFkLiAgSXQgZG9lcyBzbyBieSByZXR1cm5pbmcKKyAgICAgICAqICBjdHlwZTxjaGFyX3R5cGU+Ojpkb19uYXJyb3coX19sbywgX19oaSwgX19kZmF1bHQsIF9fdG8pLgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19kZmF1bHQgIENoYXIgdG8gdXNlIGlmIGNvbnZlcnNpb24gZmFpbHMuCisgICAgICAgKiAgQHBhcmFtIF9fdG8gIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGFycmF5LgorICAgICAgICogIEByZXR1cm4gIEBhIF9faGkuCisgICAgICAqLworICAgICAgY29uc3QgY2hhcl90eXBlKgorICAgICAgbmFycm93KGNvbnN0IGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpLAorCSAgICAgIGNoYXIgX19kZmF1bHQsIGNoYXIqIF9fdG8pIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19uYXJyb3coX19sbywgX19oaSwgX19kZmF1bHQsIF9fdG8pOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBleHBsaWNpdAorICAgICAgX19jdHlwZV9hYnN0cmFjdF9iYXNlKHNpemVfdCBfX3JlZnMgPSAwKTogZmFjZXQoX19yZWZzKSB7IH0KKworICAgICAgdmlydHVhbAorICAgICAgfl9fY3R5cGVfYWJzdHJhY3RfYmFzZSgpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRlc3QgY2hhcl90eXBlIGNsYXNzaWZpY2F0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbmRzIGEgbWFzayBNIGZvciBAYSBjIGFuZCBjb21wYXJlcyBpdCB0byBtYXNrIEBhIG0uCisgICAgICAgKgorICAgICAgICogIGRvX2lzKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIGNsYXNzaWZ5aW5nLiAgZG9faXMoKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUKKyAgICAgICAqICBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhcl90eXBlIHRvIGZpbmQgdGhlIG1hc2sgb2YuCisgICAgICAgKiAgQHBhcmFtIF9fbSAgVGhlIG1hc2sgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEByZXR1cm4gIChNICYgX19tKSAhPSAwLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgYm9vbAorICAgICAgZG9faXMobWFzayBfX20sIGNoYXJfdHlwZSBfX2MpIGNvbnN0ID0gMDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gYSBtYXNrIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBtYXNrIGZvciBlYWNoIGNoYXJfdHlwZSBpbiB0aGUgcmFuZ2UgW2xvLGhpKQorICAgICAgICogIGFuZCBzdWNjZXNzaXZlbHkgd3JpdGVzIGl0IHRvIHZlYy4gIHZlYyBtdXN0IGhhdmUgYXMgbWFueSBlbGVtZW50cworICAgICAgICogIGFzIHRoZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgZG9faXMoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgY2xhc3NpZnlpbmcuICBkb19pcygpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZQorICAgICAgICogIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX192ZWMgIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgbWFzayBzdG9yYWdlLgorICAgICAgICogIEByZXR1cm4gIEBhIF9faGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb19pcyhjb25zdCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSwKKwkgICAgbWFzayogX192ZWMpIGNvbnN0ID0gMDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGNoYXJfdHlwZSBtYXRjaGluZyBtYXNrCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBjaGFyX3R5cGUgYyBpbgorICAgICAgICogIFtfX2xvLF9faGkpIGZvciB3aGljaCBpcyhfX20sYykgaXMgdHJ1ZS4KKyAgICAgICAqCisgICAgICAgKiAgZG9fc2Nhbl9pcygpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICBtYXRjaCBzZWFyY2hpbmcuICBkb19pcygpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZQorICAgICAgICogIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX20gIFRoZSBtYXNrIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcGFyYW0gX19sbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgUG9pbnRlciB0byBhIG1hdGNoaW5nIGNoYXJfdHlwZSBpZiBmb3VuZCwgZWxzZSBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fc2Nhbl9pcyhtYXNrIF9fbSwgY29uc3QgY2hhcl90eXBlKiBfX2xvLAorCQkgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdCA9IDA7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBjaGFyX3R5cGUgbm90IG1hdGNoaW5nIG1hc2sKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdAorICAgICAgICogIGNoYXJfdHlwZSBjIG9mIFtsbyxoaSkgZm9yIHdoaWNoIGlzKG0sYykgaXMgZmFsc2UuCisgICAgICAgKgorICAgICAgICogIGRvX3NjYW5faXMoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgbWF0Y2ggc2VhcmNoaW5nLiAgZG9faXMoKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUKKyAgICAgICAqICBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19tICBUaGUgbWFzayB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIFBvaW50ZXIgdG8gYSBub24tbWF0Y2hpbmcgY2hhcl90eXBlIGlmIGZvdW5kLCBlbHNlIEBhIF9faGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb19zY2FuX25vdChtYXNrIF9fbSwgY29uc3QgY2hhcl90eXBlKiBfX2xvLAorCQkgIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3QgPSAwOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnZlcnQgdG8gdXBwZXJjYXNlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIHZpcnR1YWwgZnVuY3Rpb24gY29udmVydHMgdGhlIGNoYXJfdHlwZSBhcmd1bWVudCB0byB1cHBlcmNhc2UKKyAgICAgICAqICBpZiBwb3NzaWJsZS4gIElmIG5vdCBwb3NzaWJsZSAoZm9yIGV4YW1wbGUsICcyJyksIHJldHVybnMgdGhlCisgICAgICAgKiAgYXJndW1lbnQuCisgICAgICAgKgorICAgICAgICogIGRvX3RvdXBwZXIoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgdXBwZXJjYXNpbmcuICBkb190b3VwcGVyKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IKKyAgICAgICAqICB0aGUgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fYyAgVGhlIGNoYXJfdHlwZSB0byBjb252ZXJ0LgorICAgICAgICogIEByZXR1cm4gIFRoZSB1cHBlcmNhc2UgY2hhcl90eXBlIGlmIGNvbnZlcnRpYmxlLCBlbHNlIEBhIF9fYy4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNoYXJfdHlwZQorICAgICAgZG9fdG91cHBlcihjaGFyX3R5cGUgX19jKSBjb25zdCA9IDA7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCBhcnJheSB0byB1cHBlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXJfdHlwZSBpbiB0aGUgcmFuZ2UgW19fbG8sX19oaSkKKyAgICAgICAqICB0byB1cHBlcmNhc2UgaWYgcG9zc2libGUuICBPdGhlciBlbGVtZW50cyByZW1haW4gdW50b3VjaGVkLgorICAgICAgICoKKyAgICAgICAqICBkb190b3VwcGVyKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIHVwcGVyY2FzaW5nLiAgZG9fdG91cHBlcigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yCisgICAgICAgKiAgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fdG91cHBlcihjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3QgPSAwOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnZlcnQgdG8gbG93ZXJjYXNlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIHZpcnR1YWwgZnVuY3Rpb24gY29udmVydHMgdGhlIGFyZ3VtZW50IHRvIGxvd2VyY2FzZSBpZgorICAgICAgICogIHBvc3NpYmxlLiAgSWYgbm90IHBvc3NpYmxlIChmb3IgZXhhbXBsZSwgJzInKSwgcmV0dXJucyB0aGUgYXJndW1lbnQuCisgICAgICAgKgorICAgICAgICogIGRvX3RvbG93ZXIoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgbG93ZXJjYXNpbmcuICBkb190b2xvd2VyKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IKKyAgICAgICAqICB0aGUgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fYyAgVGhlIGNoYXJfdHlwZSB0byBjb252ZXJ0LgorICAgICAgICogIEByZXR1cm4gIFRoZSBsb3dlcmNhc2UgY2hhcl90eXBlIGlmIGNvbnZlcnRpYmxlLCBlbHNlIEBhIF9fYy4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNoYXJfdHlwZQorICAgICAgZG9fdG9sb3dlcihjaGFyX3R5cGUgX19jKSBjb25zdCA9IDA7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCBhcnJheSB0byBsb3dlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXJfdHlwZSBpbiB0aGUgcmFuZ2UgW19fbG8sX19oaSkKKyAgICAgICAqICB0byBsb3dlcmNhc2UgaWYgcG9zc2libGUuICBPdGhlciBlbGVtZW50cyByZW1haW4gdW50b3VjaGVkLgorICAgICAgICoKKyAgICAgICAqICBkb190b2xvd2VyKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIGxvd2VyY2FzaW5nLiAgZG9fdG9sb3dlcigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yCisgICAgICAgKiAgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fdG9sb3dlcihjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3QgPSAwOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFdpZGVuIGNoYXIKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBjaGFyIHRvIGNoYXJfdHlwZSB1c2luZyB0aGUKKyAgICAgICAqICBzaW1wbGVzdCByZWFzb25hYmxlIHRyYW5zZm9ybWF0aW9uLgorICAgICAgICoKKyAgICAgICAqICBkb193aWRlbigpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICB3aWRlbmluZy4gIGRvX3dpZGVuKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCBmb3IgY29kZXBhZ2UgY29udmVyc2lvbnMuICBTZWUKKyAgICAgICAqICBjb2RlY3Z0IGZvciB0aGF0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhciB0byBjb252ZXJ0LgorICAgICAgICogIEByZXR1cm4gIFRoZSBjb252ZXJ0ZWQgY2hhcl90eXBlCisgICAgICAqLworICAgICAgdmlydHVhbCBjaGFyX3R5cGUKKyAgICAgIGRvX3dpZGVuKGNoYXIgX19jKSBjb25zdCA9IDA7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgV2lkZW4gY2hhciBhcnJheQorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGVhY2ggY2hhciBpbiB0aGUgaW5wdXQgdG8gY2hhcl90eXBlIHVzaW5nIHRoZQorICAgICAgICogIHNpbXBsZXN0IHJlYXNvbmFibGUgdHJhbnNmb3JtYXRpb24uCisgICAgICAgKgorICAgICAgICogIGRvX3dpZGVuKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIHdpZGVuaW5nLiAgZG9fd2lkZW4oKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUKKyAgICAgICAqICBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX190byAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYXJyYXkuCisgICAgICAgKiAgQHJldHVybiAgQGEgX19oaS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqCisgICAgICBkb193aWRlbihjb25zdCBjaGFyKiBfX2xvLCBjb25zdCBjaGFyKiBfX2hpLCBjaGFyX3R5cGUqIF9fdG8pIGNvbnN0ID0gMDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOYXJyb3cgY2hhcl90eXBlIHRvIGNoYXIKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBhcmd1bWVudCB0byBjaGFyIHVzaW5nIHRoZQorICAgICAgICogIHNpbXBsZXN0IHJlYXNvbmFibGUgdHJhbnNmb3JtYXRpb24uICBJZiB0aGUgY29udmVyc2lvbiBmYWlscywgZGZhdWx0CisgICAgICAgKiAgaXMgcmV0dXJuZWQgaW5zdGVhZC4KKyAgICAgICAqCisgICAgICAgKiAgZG9fbmFycm93KCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIG5hcnJvd2luZy4gIGRvX25hcnJvdygpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZQorICAgICAgICogIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQgZm9yIGNvZGVwYWdlIGNvbnZlcnNpb25zLiAgU2VlCisgICAgICAgKiAgY29kZWN2dCBmb3IgdGhhdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fYyAgVGhlIGNoYXJfdHlwZSB0byBjb252ZXJ0LgorICAgICAgICogIEBwYXJhbSBfX2RmYXVsdCAgQ2hhciB0byByZXR1cm4gaWYgY29udmVyc2lvbiBmYWlscy4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY29udmVydGVkIGNoYXIuCisgICAgICAqLworICAgICAgdmlydHVhbCBjaGFyCisgICAgICBkb19uYXJyb3coY2hhcl90eXBlIF9fYywgY2hhciBfX2RmYXVsdCkgY29uc3QgPSAwOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE5hcnJvdyBjaGFyX3R5cGUgYXJyYXkgdG8gY2hhcgorICAgICAgICoKKyAgICAgICAqICBUaGlzIHZpcnR1YWwgZnVuY3Rpb24gY29udmVydHMgZWFjaCBjaGFyX3R5cGUgaW4gdGhlIHJhbmdlCisgICAgICAgKiAgW19fbG8sX19oaSkgdG8gY2hhciB1c2luZyB0aGUgc2ltcGxlc3QgcmVhc29uYWJsZQorICAgICAgICogIHRyYW5zZm9ybWF0aW9uIGFuZCB3cml0ZXMgdGhlIHJlc3VsdHMgdG8gdGhlIGRlc3RpbmF0aW9uCisgICAgICAgKiAgYXJyYXkuICBGb3IgYW55IGVsZW1lbnQgaW4gdGhlIGlucHV0IHRoYXQgY2Fubm90IGJlCisgICAgICAgKiAgY29udmVydGVkLCBAYSBfX2RmYXVsdCBpcyB1c2VkIGluc3RlYWQuCisgICAgICAgKgorICAgICAgICogIGRvX25hcnJvdygpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICBuYXJyb3dpbmcuICBkb19uYXJyb3coKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUKKyAgICAgICAqICBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19kZmF1bHQgIENoYXIgdG8gdXNlIGlmIGNvbnZlcnNpb24gZmFpbHMuCisgICAgICAgKiAgQHBhcmFtIF9fdG8gIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGFycmF5LgorICAgICAgICogIEByZXR1cm4gIEBhIF9faGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb19uYXJyb3coY29uc3QgY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGksCisJCWNoYXIgX19kZmF1bHQsIGNoYXIqIF9fdG8pIGNvbnN0ID0gMDsKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIGN0eXBlIGZhY2V0LgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKgorICAgKiAgVGhpcyB0ZW1wbGF0ZSBjbGFzcyBkZWZpbmVzIGNsYXNzaWZpY2F0aW9uIGFuZCBjb252ZXJzaW9uIGZ1bmN0aW9ucyBmb3IKKyAgICogIGNoYXJhY3RlciBzZXRzLiAgSXQgd3JhcHMgY2N0eXBlIGZ1bmN0aW9uYWxpdHkuICBDdHlwZSBnZXRzIHVzZWQgYnkKKyAgICogIHN0cmVhbXMgZm9yIG1hbnkgSS9PIG9wZXJhdGlvbnMuCisgICAqCisgICAqICBUaGlzIHRlbXBsYXRlIHByb3ZpZGVzIHRoZSBwcm90ZWN0ZWQgdmlydHVhbCBmdW5jdGlvbnMgdGhlIGRldmVsb3BlcgorICAgKiAgd2lsbCBoYXZlIHRvIHJlcGxhY2UgaW4gYSBkZXJpdmVkIGNsYXNzIG9yIHNwZWNpYWxpemF0aW9uIHRvIG1ha2UgYQorICAgKiAgd29ya2luZyBmYWNldC4gIFRoZSBwdWJsaWMgZnVuY3Rpb25zIHRoYXQgYWNjZXNzIHRoZW0gYXJlIGRlZmluZWQgaW4KKyAgICogIF9fY3R5cGVfYWJzdHJhY3RfYmFzZSwgdG8gYWxsb3cgZm9yIGltcGxlbWVudGF0aW9uIGZsZXhpYmlsaXR5LiAgU2VlCisgICAqICBjdHlwZTx3Y2hhcl90PiBmb3IgYW4gZXhhbXBsZS4gIFRoZSBmdW5jdGlvbnMgYXJlIGRvY3VtZW50ZWQgaW4KKyAgICogIF9fY3R5cGVfYWJzdHJhY3RfYmFzZS4KKyAgICoKKyAgICogIE5vdGU6IGltcGxlbWVudGF0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIGFsbCB0aGUgcHJvdGVjdGVkIHZpcnR1YWwKKyAgICogIGZ1bmN0aW9ucywgYnV0IHdpbGwgbGlrZWx5IG5vdCBiZSB1c2VmdWwuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBjbGFzcyBjdHlwZSA6IHB1YmxpYyBfX2N0eXBlX2Fic3RyYWN0X2Jhc2U8X0NoYXJUPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2N0eXBlX2Fic3RyYWN0X2Jhc2U8X0NoYXJUPjo6bWFzayBtYXNrOworCisgICAgICAvLy8gVGhlIGZhY2V0IGlkIGZvciBjdHlwZTxjaGFyX3R5cGU+CisgICAgICBzdGF0aWMgbG9jYWxlOjppZAkJCWlkOworCisgICAgICBleHBsaWNpdAorICAgICAgY3R5cGUoc2l6ZV90IF9fcmVmcyA9IDApIDogX19jdHlwZV9hYnN0cmFjdF9iYXNlPF9DaGFyVD4oX19yZWZzKSB7IH0KKworICAgcHJvdGVjdGVkOgorICAgICAgdmlydHVhbAorICAgICAgfmN0eXBlKCk7CisKKyAgICAgIHZpcnR1YWwgYm9vbAorICAgICAgZG9faXMobWFzayBfX20sIGNoYXJfdHlwZSBfX2MpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIGRvX2lzKGNvbnN0IGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpLCBtYXNrKiBfX3ZlYykgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fc2Nhbl9pcyhtYXNrIF9fbSwgY29uc3QgY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIGRvX3NjYW5fbm90KG1hc2sgX19tLCBjb25zdCBjaGFyX3R5cGUqIF9fbG8sCisJCSAgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdDsKKworICAgICAgdmlydHVhbCBjaGFyX3R5cGUKKyAgICAgIGRvX3RvdXBwZXIoY2hhcl90eXBlIF9fYykgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fdG91cHBlcihjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgY2hhcl90eXBlCisgICAgICBkb190b2xvd2VyKGNoYXJfdHlwZSBfX2MpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIGRvX3RvbG93ZXIoY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIGNoYXJfdHlwZQorICAgICAgZG9fd2lkZW4oY2hhciBfX2MpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqCisgICAgICBkb193aWRlbihjb25zdCBjaGFyKiBfX2xvLCBjb25zdCBjaGFyKiBfX2hpLCBjaGFyX3R5cGUqIF9fZGVzdCkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgY2hhcgorICAgICAgZG9fbmFycm93KGNoYXJfdHlwZSwgY2hhciBfX2RmYXVsdCkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fbmFycm93KGNvbnN0IGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpLAorCQljaGFyIF9fZGZhdWx0LCBjaGFyKiBfX3RvKSBjb25zdDsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBsb2NhbGU6OmlkIGN0eXBlPF9DaGFyVD46OmlkOworCisgIC8qKgorICAgKiAgQGJyaWVmICBUaGUgY3R5cGU8Y2hhcj4gc3BlY2lhbGl6YXRpb24uCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBUaGlzIGNsYXNzIGRlZmluZXMgY2xhc3NpZmljYXRpb24gYW5kIGNvbnZlcnNpb24gZnVuY3Rpb25zIGZvcgorICAgKiAgdGhlIGNoYXIgdHlwZS4gIEl0IGdldHMgdXNlZCBieSBjaGFyIHN0cmVhbXMgZm9yIG1hbnkgSS9PCisgICAqICBvcGVyYXRpb25zLiAgVGhlIGNoYXIgc3BlY2lhbGl6YXRpb24gcHJvdmlkZXMgYSBudW1iZXIgb2YKKyAgICogIG9wdGltaXphdGlvbnMgYXMgd2VsbC4KKyAgKi8KKyAgdGVtcGxhdGU8PgorICAgIGNsYXNzIGN0eXBlPGNoYXI+IDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyBjdHlwZV9iYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgLy8vIFR5cGVkZWYgZm9yIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgY2hhci4KKyAgICAgIHR5cGVkZWYgY2hhcgkJY2hhcl90eXBlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8gRGF0YSBNZW1iZXJzOgorICAgICAgX19jX2xvY2FsZQkJX01fY19sb2NhbGVfY3R5cGU7CisgICAgICBib29sCQkJX01fZGVsOworICAgICAgX190b190eXBlCQkJX01fdG91cHBlcjsKKyAgICAgIF9fdG9fdHlwZQkJCV9NX3RvbG93ZXI7CisgICAgICBjb25zdCBtYXNrKgkJX01fdGFibGU7CisgICAgICBtdXRhYmxlIGNoYXIJCV9NX3dpZGVuX29rOworICAgICAgbXV0YWJsZSBjaGFyCQlfTV93aWRlblsxICsgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oLTEpXTsKKyAgICAgIG11dGFibGUgY2hhcgkJX01fbmFycm93WzEgKyBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigtMSldOworICAgICAgbXV0YWJsZSBjaGFyCQlfTV9uYXJyb3dfb2s7CS8vIDAgdW5pbml0aWFsaXplZCwgMSBpbml0LAorCQkJCQkJLy8gMiBtZW1jcHkgY2FuJ3QgYmUgdXNlZAorCisgICAgcHVibGljOgorICAgICAgLy8vIFRoZSBmYWNldCBpZCBmb3IgY3R5cGU8Y2hhcj4KKyAgICAgIHN0YXRpYyBsb2NhbGU6OmlkICAgICAgICBpZDsKKyAgICAgIC8vLyBUaGUgc2l6ZSBvZiB0aGUgbWFzayB0YWJsZS4gIEl0IGlzIFNDSEFSX01BWCArIDEuCisgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICAgdGFibGVfc2l6ZSA9IDEgKyBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigtMSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0b3IgcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIHByb3ZpZGVkIGJ5IHRoZSBzdGFuZGFyZC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fdGFibGUgSWYgbm9uLXplcm8sIHRhYmxlIGlzIHVzZWQgYXMgdGhlIHBlci1jaGFyIG1hc2suCisgICAgICAgKiAgICAgICAgICAgICAgIEVsc2UgY2xhc3NpY190YWJsZSgpIGlzIHVzZWQuCisgICAgICAgKiAgQHBhcmFtIF9fZGVsICAgSWYgdHJ1ZSwgcGFzc2VzIG93bmVyc2hpcCBvZiB0YWJsZSB0byB0aGlzIGZhY2V0LgorICAgICAgICogIEBwYXJhbSBfX3JlZnMgIFBhc3NlZCB0byB0aGUgYmFzZSBmYWNldCBjbGFzcy4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgY3R5cGUoY29uc3QgbWFzayogX190YWJsZSA9IDAsIGJvb2wgX19kZWwgPSBmYWxzZSwgc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdG9yIHBlcmZvcm1zIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgaW5pdGlhbCBDIGxvY2FsZSBmYWNldC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fY2xvYyAgSGFuZGxlIHRvIEMgbG9jYWxlIGRhdGEuCisgICAgICAgKiAgQHBhcmFtIF9fdGFibGUgSWYgbm9uLXplcm8sIHRhYmxlIGlzIHVzZWQgYXMgdGhlIHBlci1jaGFyIG1hc2suCisgICAgICAgKiAgQHBhcmFtIF9fZGVsICAgSWYgdHJ1ZSwgcGFzc2VzIG93bmVyc2hpcCBvZiB0YWJsZSB0byB0aGlzIGZhY2V0LgorICAgICAgICogIEBwYXJhbSBfX3JlZnMgIFBhc3NlZCB0byB0aGUgYmFzZSBmYWNldCBjbGFzcy4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgY3R5cGUoX19jX2xvY2FsZSBfX2Nsb2MsIGNvbnN0IG1hc2sqIF9fdGFibGUgPSAwLCBib29sIF9fZGVsID0gZmFsc2UsCisJICAgIHNpemVfdCBfX3JlZnMgPSAwKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUZXN0IGNoYXIgY2xhc3NpZmljYXRpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gY29tcGFyZXMgdGhlIG1hc2sgdGFibGVbY10gdG8gQGEgX19tLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhciB0byBjb21wYXJlIHRoZSBtYXNrIG9mLgorICAgICAgICogIEBwYXJhbSBfX20gIFRoZSBtYXNrIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcmV0dXJuICBUcnVlIGlmIF9fbSAmIHRhYmxlW19fY10gaXMgdHJ1ZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgKi8KKyAgICAgIGlubGluZSBib29sCisgICAgICBpcyhtYXNrIF9fbSwgY2hhciBfX2MpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBhIG1hc2sgYXJyYXkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIG1hc2sgZm9yIGVhY2ggY2hhciBpbiB0aGUgcmFuZ2UgW2xvLCBoaSkgYW5kCisgICAgICAgKiAgc3VjY2Vzc2l2ZWx5IHdyaXRlcyBpdCB0byB2ZWMuICB2ZWMgbXVzdCBoYXZlIGFzIG1hbnkgZWxlbWVudHMgYXMKKyAgICAgICAqICB0aGUgY2hhciBhcnJheS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX3ZlYyAgUG9pbnRlciB0byBhbiBhcnJheSBvZiBtYXNrIHN0b3JhZ2UuCisgICAgICAgKiAgQHJldHVybiAgQGEgX19oaS4KKyAgICAgICovCisgICAgICBpbmxpbmUgY29uc3QgY2hhcioKKyAgICAgIGlzKGNvbnN0IGNoYXIqIF9fbG8sIGNvbnN0IGNoYXIqIF9faGksIG1hc2sqIF9fdmVjKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGNoYXIgbWF0Y2hpbmcgYSBtYXNrCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBjaGFyIGluIFtsbyxoaSkgZm9yCisgICAgICAgKiAgd2hpY2ggaXMobSxjaGFyKSBpcyB0cnVlLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19tICBUaGUgbWFzayB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIFBvaW50ZXIgdG8gYSBtYXRjaGluZyBjaGFyIGlmIGZvdW5kLCBlbHNlIEBhIF9faGkuCisgICAgICAqLworICAgICAgaW5saW5lIGNvbnN0IGNoYXIqCisgICAgICBzY2FuX2lzKG1hc2sgX19tLCBjb25zdCBjaGFyKiBfX2xvLCBjb25zdCBjaGFyKiBfX2hpKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGNoYXIgbm90IG1hdGNoaW5nIGEgbWFzaworICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoYXIKKyAgICAgICAqICBpbiBbX19sbyxfX2hpKSBmb3Igd2hpY2ggaXMobSxjaGFyKSBpcyBmYWxzZS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbSAgVGhlIG1hc2sgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBQb2ludGVyIHRvIGEgbm9uLW1hdGNoaW5nIGNoYXIgaWYgZm91bmQsIGVsc2UgQGEgX19oaS4KKyAgICAgICovCisgICAgICBpbmxpbmUgY29uc3QgY2hhcioKKyAgICAgIHNjYW5fbm90KG1hc2sgX19tLCBjb25zdCBjaGFyKiBfX2xvLCBjb25zdCBjaGFyKiBfX2hpKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IHRvIHVwcGVyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgY2hhciBhcmd1bWVudCB0byB1cHBlcmNhc2UgaWYgcG9zc2libGUuCisgICAgICAgKiAgSWYgbm90IHBvc3NpYmxlIChmb3IgZXhhbXBsZSwgJzInKSwgcmV0dXJucyB0aGUgYXJndW1lbnQuCisgICAgICAgKgorICAgICAgICogIHRvdXBwZXIoKSBhY3RzIGFzIGlmIGl0IHJldHVybnMgY3R5cGU8Y2hhcj46OmRvX3RvdXBwZXIoYykuCisgICAgICAgKiAgZG9fdG91cHBlcigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZSBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhciB0byBjb252ZXJ0LgorICAgICAgICogIEByZXR1cm4gIFRoZSB1cHBlcmNhc2UgY2hhciBpZiBjb252ZXJ0aWJsZSwgZWxzZSBAYSBfX2MuCisgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICB0b3VwcGVyKGNoYXJfdHlwZSBfX2MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb190b3VwcGVyKF9fYyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IGFycmF5IHRvIHVwcGVyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXIgaW4gdGhlIHJhbmdlIFtfX2xvLF9faGkpIHRvIHVwcGVyY2FzZQorICAgICAgICogIGlmIHBvc3NpYmxlLiAgT3RoZXIgY2hhcnMgcmVtYWluIHVudG91Y2hlZC4KKyAgICAgICAqCisgICAgICAgKiAgdG91cHBlcigpIGFjdHMgYXMgaWYgaXQgcmV0dXJucyBjdHlwZTxjaGFyPjo6IGRvX3RvdXBwZXIoX19sbywgX19oaSkuCisgICAgICAgKiAgZG9fdG91cHBlcigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZSBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19sbyAgUG9pbnRlciB0byBmaXJzdCBjaGFyIGluIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIHRvdXBwZXIoY2hhcl90eXBlICpfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb190b3VwcGVyKF9fbG8sIF9faGkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCB0byBsb3dlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIGNoYXIgYXJndW1lbnQgdG8gbG93ZXJjYXNlIGlmIHBvc3NpYmxlLgorICAgICAgICogIElmIG5vdCBwb3NzaWJsZSAoZm9yIGV4YW1wbGUsICcyJyksIHJldHVybnMgdGhlIGFyZ3VtZW50LgorICAgICAgICoKKyAgICAgICAqICB0b2xvd2VyKCkgYWN0cyBhcyBpZiBpdCByZXR1cm5zIGN0eXBlPGNoYXI+Ojpkb190b2xvd2VyKF9fYykuCisgICAgICAgKiAgZG9fdG9sb3dlcigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZSBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhciB0byBjb252ZXJ0LgorICAgICAgICogIEByZXR1cm4gIFRoZSBsb3dlcmNhc2UgY2hhciBpZiBjb252ZXJ0aWJsZSwgZWxzZSBAYSBfX2MuCisgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICB0b2xvd2VyKGNoYXJfdHlwZSBfX2MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb190b2xvd2VyKF9fYyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IGFycmF5IHRvIGxvd2VyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXIgaW4gdGhlIHJhbmdlIFtsbyxoaSkgdG8gbG93ZXJjYXNlCisgICAgICAgKiAgaWYgcG9zc2libGUuICBPdGhlciBjaGFycyByZW1haW4gdW50b3VjaGVkLgorICAgICAgICoKKyAgICAgICAqICB0b2xvd2VyKCkgYWN0cyBhcyBpZiBpdCByZXR1cm5zIGN0eXBlPGNoYXI+OjogZG9fdG9sb3dlcihfX2xvLCBfX2hpKS4KKyAgICAgICAqICBkb190b2xvd2VyKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIGZpcnN0IGNoYXIgaW4gcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIEBhIF9faGkuCisgICAgICAqLworICAgICAgY29uc3QgY2hhcl90eXBlKgorICAgICAgdG9sb3dlcihjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3RvbG93ZXIoX19sbywgX19oaSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBXaWRlbiBjaGFyCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIGNoYXIgdG8gY2hhcl90eXBlIHVzaW5nIHRoZSBzaW1wbGVzdAorICAgICAgICogIHJlYXNvbmFibGUgdHJhbnNmb3JtYXRpb24uICBGb3IgYW4gdW5kZXJpdmVkIGN0eXBlPGNoYXI+IGZhY2V0LCB0aGUKKyAgICAgICAqICBhcmd1bWVudCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3b3JrcyBhcyBpZiBpdCByZXR1cm5zIGN0eXBlPGNoYXI+Ojpkb193aWRlbihjKS4KKyAgICAgICAqICBkb193aWRlbigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZSBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyIHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGNvbnZlcnRlZCBjaGFyYWN0ZXIuCisgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICB3aWRlbihjaGFyIF9fYykgY29uc3QKKyAgICAgIHsKKwlpZiAoX01fd2lkZW5fb2spCisJICByZXR1cm4gX01fd2lkZW5bc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oX19jKV07CisJdGhpcy0+X01fd2lkZW5faW5pdCgpOworCXJldHVybiB0aGlzLT5kb193aWRlbihfX2MpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFdpZGVuIGNoYXIgYXJyYXkKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXIgaW4gdGhlIGlucHV0IHRvIGNoYXIgdXNpbmcgdGhlCisgICAgICAgKiAgc2ltcGxlc3QgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbi4gIEZvciBhbiB1bmRlcml2ZWQgY3R5cGU8Y2hhcj4KKyAgICAgICAqICBmYWNldCwgdGhlIGFyZ3VtZW50IHdpbGwgYmUgY29waWVkIHVuY2hhbmdlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3b3JrcyBhcyBpZiBpdCByZXR1cm5zIGN0eXBlPGNoYXI+Ojpkb193aWRlbihjKS4KKyAgICAgICAqICBkb193aWRlbigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZSBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIGZpcnN0IGNoYXIgaW4gcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX3RvICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIGNvbnN0IGNoYXIqCisgICAgICB3aWRlbihjb25zdCBjaGFyKiBfX2xvLCBjb25zdCBjaGFyKiBfX2hpLCBjaGFyX3R5cGUqIF9fdG8pIGNvbnN0CisgICAgICB7CisJaWYgKF9NX3dpZGVuX29rID09IDEpCisJICB7CisJICAgIF9fYnVpbHRpbl9tZW1jcHkoX190bywgX19sbywgX19oaSAtIF9fbG8pOworCSAgICByZXR1cm4gX19oaTsKKwkgIH0KKwlpZiAoIV9NX3dpZGVuX29rKQorCSAgX01fd2lkZW5faW5pdCgpOworCXJldHVybiB0aGlzLT5kb193aWRlbihfX2xvLCBfX2hpLCBfX3RvKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOYXJyb3cgY2hhcgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBjaGFyIHRvIGNoYXIgdXNpbmcgdGhlIHNpbXBsZXN0CisgICAgICAgKiAgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbi4gIElmIHRoZSBjb252ZXJzaW9uIGZhaWxzLCBkZmF1bHQgaXMKKyAgICAgICAqICByZXR1cm5lZCBpbnN0ZWFkLiAgRm9yIGFuIHVuZGVyaXZlZCBjdHlwZTxjaGFyPiBmYWNldCwgQGEgYworICAgICAgICogIHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdvcmtzIGFzIGlmIGl0IHJldHVybnMgY3R5cGU8Y2hhcj46OmRvX25hcnJvdyhjKS4KKyAgICAgICAqICBkb19uYXJyb3coKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCBmb3IgY29kZXBhZ2UgY29udmVyc2lvbnMuICBTZWUKKyAgICAgICAqICBjb2RlY3Z0IGZvciB0aGF0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhciB0byBjb252ZXJ0LgorICAgICAgICogIEBwYXJhbSBfX2RmYXVsdCAgQ2hhciB0byByZXR1cm4gaWYgY29udmVyc2lvbiBmYWlscy4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY29udmVydGVkIGNoYXJhY3Rlci4KKyAgICAgICovCisgICAgICBjaGFyCisgICAgICBuYXJyb3coY2hhcl90eXBlIF9fYywgY2hhciBfX2RmYXVsdCkgY29uc3QKKyAgICAgIHsKKwlpZiAoX01fbmFycm93W3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KF9fYyldKQorCSAgcmV0dXJuIF9NX25hcnJvd1tzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihfX2MpXTsKKwljb25zdCBjaGFyIF9fdCA9IGRvX25hcnJvdyhfX2MsIF9fZGZhdWx0KTsKKwlpZiAoX190ICE9IF9fZGZhdWx0KQorCSAgX01fbmFycm93W3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KF9fYyldID0gX190OworCXJldHVybiBfX3Q7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTmFycm93IGNoYXIgYXJyYXkKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXIgaW4gdGhlIGlucHV0IHRvIGNoYXIgdXNpbmcgdGhlCisgICAgICAgKiAgc2ltcGxlc3QgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbiBhbmQgd3JpdGVzIHRoZSByZXN1bHRzIHRvIHRoZQorICAgICAgICogIGRlc3RpbmF0aW9uIGFycmF5LiAgRm9yIGFueSBjaGFyIGluIHRoZSBpbnB1dCB0aGF0IGNhbm5vdCBiZQorICAgICAgICogIGNvbnZlcnRlZCwgQGEgZGZhdWx0IGlzIHVzZWQgaW5zdGVhZC4gIEZvciBhbiB1bmRlcml2ZWQgY3R5cGU8Y2hhcj4KKyAgICAgICAqICBmYWNldCwgdGhlIGFyZ3VtZW50IHdpbGwgYmUgY29waWVkIHVuY2hhbmdlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3b3JrcyBhcyBpZiBpdCByZXR1cm5zIGN0eXBlPGNoYXI+Ojpkb19uYXJyb3cobG8sIGhpLAorICAgICAgICogIGRmYXVsdCwgdG8pLiAgZG9fbmFycm93KCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCBmb3IgY29kZXBhZ2UgY29udmVyc2lvbnMuICBTZWUKKyAgICAgICAqICBjb2RlY3Z0IGZvciB0aGF0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19sbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9fZGZhdWx0ICBDaGFyIHRvIHVzZSBpZiBjb252ZXJzaW9uIGZhaWxzLgorICAgICAgICogIEBwYXJhbSBfX3RvICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIG5hcnJvdyhjb25zdCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSwKKwkgICAgIGNoYXIgX19kZmF1bHQsIGNoYXIqIF9fdG8pIGNvbnN0CisgICAgICB7CisJaWYgKF9fYnVpbHRpbl9leHBlY3QoX01fbmFycm93X29rID09IDEsIHRydWUpKQorCSAgeworCSAgICBfX2J1aWx0aW5fbWVtY3B5KF9fdG8sIF9fbG8sIF9faGkgLSBfX2xvKTsKKwkgICAgcmV0dXJuIF9faGk7CisJICB9CisJaWYgKCFfTV9uYXJyb3dfb2spCisJICBfTV9uYXJyb3dfaW5pdCgpOworCXJldHVybiB0aGlzLT5kb19uYXJyb3coX19sbywgX19oaSwgX19kZmF1bHQsIF9fdG8pOworICAgICAgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiA2OTUuIGN0eXBlPGNoYXI+OjpjbGFzc2ljX3RhYmxlKCkgbm90IGFjY2Vzc2libGUuCisgICAgICAvLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG1hc2sgdGFibGUgcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLCBvcgorICAgICAgLy8vIHRoZSBkZWZhdWx0IGZyb20gY2xhc3NpY190YWJsZSgpIGlmIG5vbmUgd2FzIHByb3ZpZGVkLgorICAgICAgY29uc3QgbWFzayoKKyAgICAgIHRhYmxlKCkgY29uc3QgdGhyb3coKQorICAgICAgeyByZXR1cm4gX01fdGFibGU7IH0KKworICAgICAgLy8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBDIGxvY2FsZSBtYXNrIHRhYmxlLgorICAgICAgc3RhdGljIGNvbnN0IG1hc2sqCisgICAgICBjbGFzc2ljX3RhYmxlKCkgdGhyb3coKTsKKyAgICBwcm90ZWN0ZWQ6CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVzdHJ1Y3Rvci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBkZWxldGVzIHRhYmxlKCkgaWYgQGEgZGVsIHdhcyB0cnVlIGluIHRoZQorICAgICAgICogIGNvbnN0cnVjdG9yLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwKKyAgICAgIH5jdHlwZSgpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnZlcnQgdG8gdXBwZXJjYXNlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIHZpcnR1YWwgZnVuY3Rpb24gY29udmVydHMgdGhlIGNoYXIgYXJndW1lbnQgdG8gdXBwZXJjYXNlIGlmCisgICAgICAgKiAgcG9zc2libGUuICBJZiBub3QgcG9zc2libGUgKGZvciBleGFtcGxlLCAnMicpLCByZXR1cm5zIHRoZSBhcmd1bWVudC4KKyAgICAgICAqCisgICAgICAgKiAgZG9fdG91cHBlcigpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICB1cHBlcmNhc2luZy4gIGRvX3RvdXBwZXIoKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvcgorICAgICAgICogIHRoZSBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhciB0byBjb252ZXJ0LgorICAgICAgICogIEByZXR1cm4gIFRoZSB1cHBlcmNhc2UgY2hhciBpZiBjb252ZXJ0aWJsZSwgZWxzZSBAYSBfX2MuCisgICAgICAqLworICAgICAgdmlydHVhbCBjaGFyX3R5cGUKKyAgICAgIGRvX3RvdXBwZXIoY2hhcl90eXBlIF9fYykgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCBhcnJheSB0byB1cHBlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXIgaW4gdGhlIHJhbmdlIFtsbyxoaSkgdG8KKyAgICAgICAqICB1cHBlcmNhc2UgaWYgcG9zc2libGUuICBPdGhlciBjaGFycyByZW1haW4gdW50b3VjaGVkLgorICAgICAgICoKKyAgICAgICAqICBkb190b3VwcGVyKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIHVwcGVyY2FzaW5nLiAgZG9fdG91cHBlcigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yCisgICAgICAgKiAgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fdG91cHBlcihjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCB0byBsb3dlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgY2hhciBhcmd1bWVudCB0byBsb3dlcmNhc2UgaWYKKyAgICAgICAqICBwb3NzaWJsZS4gIElmIG5vdCBwb3NzaWJsZSAoZm9yIGV4YW1wbGUsICcyJyksIHJldHVybnMgdGhlIGFyZ3VtZW50LgorICAgICAgICoKKyAgICAgICAqICBkb190b2xvd2VyKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIGxvd2VyY2FzaW5nLiAgZG9fdG9sb3dlcigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yCisgICAgICAgKiAgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyIHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGxvd2VyY2FzZSBjaGFyIGlmIGNvbnZlcnRpYmxlLCBlbHNlIEBhIF9fYy4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNoYXJfdHlwZQorICAgICAgZG9fdG9sb3dlcihjaGFyX3R5cGUgX19jKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IGFycmF5IHRvIGxvd2VyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNvbnZlcnRzIGVhY2ggY2hhciBpbiB0aGUgcmFuZ2UgW2xvLGhpKSB0bworICAgICAgICogIGxvd2VyY2FzZSBpZiBwb3NzaWJsZS4gIE90aGVyIGNoYXJzIHJlbWFpbiB1bnRvdWNoZWQuCisgICAgICAgKgorICAgICAgICogIGRvX3RvbG93ZXIoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgbG93ZXJjYXNpbmcuICBkb190b2xvd2VyKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IKKyAgICAgICAqICB0aGUgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gZmlyc3QgY2hhciBpbiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgQGEgX19oaS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIGRvX3RvbG93ZXIoY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFdpZGVuIGNoYXIKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBjaGFyIHRvIGNoYXIgdXNpbmcgdGhlIHNpbXBsZXN0CisgICAgICAgKiAgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbi4gIEZvciBhbiB1bmRlcml2ZWQgY3R5cGU8Y2hhcj4gZmFjZXQsIHRoZQorICAgICAgICogIGFyZ3VtZW50IHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLgorICAgICAgICoKKyAgICAgICAqICBkb193aWRlbigpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICB3aWRlbmluZy4gIGRvX3dpZGVuKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCBmb3IgY29kZXBhZ2UgY29udmVyc2lvbnMuICBTZWUKKyAgICAgICAqICBjb2RlY3Z0IGZvciB0aGF0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhciB0byBjb252ZXJ0LgorICAgICAgICogIEByZXR1cm4gIFRoZSBjb252ZXJ0ZWQgY2hhcmFjdGVyLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY2hhcl90eXBlCisgICAgICBkb193aWRlbihjaGFyIF9fYykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fYzsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFdpZGVuIGNoYXIgYXJyYXkKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXIgaW4gdGhlIHJhbmdlIFtsbyxoaSkgdG8gY2hhciB1c2luZworICAgICAgICogIHRoZSBzaW1wbGVzdCByZWFzb25hYmxlIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGFuIHVuZGVyaXZlZAorICAgICAgICogIGN0eXBlPGNoYXI+IGZhY2V0LCB0aGUgYXJndW1lbnQgd2lsbCBiZSBjb3BpZWQgdW5jaGFuZ2VkLgorICAgICAgICoKKyAgICAgICAqICBkb193aWRlbigpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICB3aWRlbmluZy4gIGRvX3dpZGVuKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCBmb3IgY29kZXBhZ2UgY29udmVyc2lvbnMuICBTZWUKKyAgICAgICAqICBjb2RlY3Z0IGZvciB0aGF0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19sbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9fdG8gIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGFycmF5LgorICAgICAgICogIEByZXR1cm4gIEBhIF9faGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyKgorICAgICAgZG9fd2lkZW4oY29uc3QgY2hhciogX19sbywgY29uc3QgY2hhciogX19oaSwgY2hhcl90eXBlKiBfX3RvKSBjb25zdAorICAgICAgeworCV9fYnVpbHRpbl9tZW1jcHkoX190bywgX19sbywgX19oaSAtIF9fbG8pOworCXJldHVybiBfX2hpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE5hcnJvdyBjaGFyCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgY2hhciB0byBjaGFyIHVzaW5nIHRoZSBzaW1wbGVzdAorICAgICAgICogIHJlYXNvbmFibGUgdHJhbnNmb3JtYXRpb24uICBJZiB0aGUgY29udmVyc2lvbiBmYWlscywgZGZhdWx0IGlzCisgICAgICAgKiAgcmV0dXJuZWQgaW5zdGVhZC4gIEZvciBhbiB1bmRlcml2ZWQgY3R5cGU8Y2hhcj4gZmFjZXQsIEBhIGMgd2lsbCBiZQorICAgICAgICogIHJldHVybmVkIHVuY2hhbmdlZC4KKyAgICAgICAqCisgICAgICAgKiAgZG9fbmFycm93KCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIG5hcnJvd2luZy4gIGRvX25hcnJvdygpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZQorICAgICAgICogIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQgZm9yIGNvZGVwYWdlIGNvbnZlcnNpb25zLiAgU2VlCisgICAgICAgKiAgY29kZWN2dCBmb3IgdGhhdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fYyAgVGhlIGNoYXIgdG8gY29udmVydC4KKyAgICAgICAqICBAcGFyYW0gX19kZmF1bHQgIENoYXIgdG8gcmV0dXJuIGlmIGNvbnZlcnNpb24gZmFpbHMuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGNvbnZlcnRlZCBjaGFyLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY2hhcgorICAgICAgZG9fbmFycm93KGNoYXJfdHlwZSBfX2MsIGNoYXIgX19kZmF1bHQpIGNvbnN0CisgICAgICB7IHJldHVybiBfX2M7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOYXJyb3cgY2hhciBhcnJheSB0byBjaGFyIGFycmF5CisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXIgaW4gdGhlIHJhbmdlIFtsbyxoaSkgdG8KKyAgICAgICAqICBjaGFyIHVzaW5nIHRoZSBzaW1wbGVzdCByZWFzb25hYmxlIHRyYW5zZm9ybWF0aW9uIGFuZCB3cml0ZXMgdGhlCisgICAgICAgKiAgcmVzdWx0cyB0byB0aGUgZGVzdGluYXRpb24gYXJyYXkuICBGb3IgYW55IGNoYXIgaW4gdGhlIGlucHV0IHRoYXQKKyAgICAgICAqICBjYW5ub3QgYmUgY29udmVydGVkLCBAYSBkZmF1bHQgaXMgdXNlZCBpbnN0ZWFkLiAgRm9yIGFuIHVuZGVyaXZlZAorICAgICAgICogIGN0eXBlPGNoYXI+IGZhY2V0LCB0aGUgYXJndW1lbnQgd2lsbCBiZSBjb3BpZWQgdW5jaGFuZ2VkLgorICAgICAgICoKKyAgICAgICAqICBkb19uYXJyb3coKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgbmFycm93aW5nLiAgZG9fbmFycm93KCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCBmb3IgY29kZXBhZ2UgY29udmVyc2lvbnMuICBTZWUKKyAgICAgICAqICBjb2RlY3Z0IGZvciB0aGF0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19sbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9fZGZhdWx0ICBDaGFyIHRvIHVzZSBpZiBjb252ZXJzaW9uIGZhaWxzLgorICAgICAgICogIEBwYXJhbSBfX3RvICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fbmFycm93KGNvbnN0IGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpLAorCQljaGFyIF9fZGZhdWx0LCBjaGFyKiBfX3RvKSBjb25zdAorICAgICAgeworCV9fYnVpbHRpbl9tZW1jcHkoX190bywgX19sbywgX19oaSAtIF9fbG8pOworCXJldHVybiBfX2hpOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQgX01fbmFycm93X2luaXQoKSBjb25zdDsKKyAgICAgIHZvaWQgX01fd2lkZW5faW5pdCgpIGNvbnN0OworICAgIH07CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICAvKioKKyAgICogIEBicmllZiAgVGhlIGN0eXBlPHdjaGFyX3Q+IHNwZWNpYWxpemF0aW9uLgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKgorICAgKiAgVGhpcyBjbGFzcyBkZWZpbmVzIGNsYXNzaWZpY2F0aW9uIGFuZCBjb252ZXJzaW9uIGZ1bmN0aW9ucyBmb3IgdGhlCisgICAqICB3Y2hhcl90IHR5cGUuICBJdCBnZXRzIHVzZWQgYnkgd2NoYXJfdCBzdHJlYW1zIGZvciBtYW55IEkvTyBvcGVyYXRpb25zLgorICAgKiAgVGhlIHdjaGFyX3Qgc3BlY2lhbGl6YXRpb24gcHJvdmlkZXMgYSBudW1iZXIgb2Ygb3B0aW1pemF0aW9ucyBhcyB3ZWxsLgorICAgKgorICAgKiAgY3R5cGU8d2NoYXJfdD4gaW5oZXJpdHMgaXRzIHB1YmxpYyBtZXRob2RzIGZyb20KKyAgICogIF9fY3R5cGVfYWJzdHJhY3RfYmFzZTx3Y2hhcl90Pi4KKyAgKi8KKyAgdGVtcGxhdGU8PgorICAgIGNsYXNzIGN0eXBlPHdjaGFyX3Q+IDogcHVibGljIF9fY3R5cGVfYWJzdHJhY3RfYmFzZTx3Y2hhcl90PgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIC8vLyBUeXBlZGVmIGZvciB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIHdjaGFyX3QuCisgICAgICB0eXBlZGVmIHdjaGFyX3QJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgd2N0eXBlX3QJCV9fd21hc2tfdHlwZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9fY19sb2NhbGUJCV9NX2NfbG9jYWxlX2N0eXBlOworCisgICAgICAvLyBQcmUtY29tcHV0ZWQgbmFycm93ZWQgYW5kIHdpZGVuZWQgY2hhcnMuCisgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgIF9NX25hcnJvd19vazsKKyAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgX01fbmFycm93WzEyOF07CisgICAgICB3aW50X3QgICAgICAgICAgICAgICAgICAgIF9NX3dpZGVuWzEgKyBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigtMSldOworCisgICAgICAvLyBQcmUtY29tcHV0ZWQgZWxlbWVudHMgZm9yIGRvX2lzLgorICAgICAgbWFzayAgICAgICAgICAgICAgICAgICAgICBfTV9iaXRbMTZdOworICAgICAgX193bWFza190eXBlICAgICAgICAgICAgICBfTV93bWFza1sxNl07CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBEYXRhIE1lbWJlcnM6CisgICAgICAvLy8gVGhlIGZhY2V0IGlkIGZvciBjdHlwZTx3Y2hhcl90PgorICAgICAgc3RhdGljIGxvY2FsZTo6aWQJCWlkOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdG9yIHBlcmZvcm1zIGluaXRpYWxpemF0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciBwcm92aWRlZCBieSB0aGUgc3RhbmRhcmQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX3JlZnMgIFBhc3NlZCB0byB0aGUgYmFzZSBmYWNldCBjbGFzcy4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgY3R5cGUoc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdG9yIHBlcmZvcm1zIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgaW5pdGlhbCBDIGxvY2FsZSBmYWNldC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fY2xvYyAgSGFuZGxlIHRvIEMgbG9jYWxlIGRhdGEuCisgICAgICAgKiAgQHBhcmFtIF9fcmVmcyAgUGFzc2VkIHRvIHRoZSBiYXNlIGZhY2V0IGNsYXNzLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBjdHlwZShfX2NfbG9jYWxlIF9fY2xvYywgc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgcHJvdGVjdGVkOgorICAgICAgX193bWFza190eXBlCisgICAgICBfTV9jb252ZXJ0X3RvX3dtYXNrKGNvbnN0IG1hc2sgX19tKSBjb25zdCB0aHJvdygpOworCisgICAgICAvLy8gRGVzdHJ1Y3RvcgorICAgICAgdmlydHVhbAorICAgICAgfmN0eXBlKCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGVzdCB3Y2hhcl90IGNsYXNzaWZpY2F0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbmRzIGEgbWFzayBNIGZvciBAYSBjIGFuZCBjb21wYXJlcyBpdCB0byBtYXNrIEBhIG0uCisgICAgICAgKgorICAgICAgICogIGRvX2lzKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIGNsYXNzaWZ5aW5nLiAgZG9faXMoKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUKKyAgICAgICAqICBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgd2NoYXJfdCB0byBmaW5kIHRoZSBtYXNrIG9mLgorICAgICAgICogIEBwYXJhbSBfX20gIFRoZSBtYXNrIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcmV0dXJuICAoTSAmIF9fbSkgIT0gMC4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGJvb2wKKyAgICAgIGRvX2lzKG1hc2sgX19tLCBjaGFyX3R5cGUgX19jKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gYSBtYXNrIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBtYXNrIGZvciBlYWNoIHdjaGFyX3QgaW4gdGhlIHJhbmdlIFtsbyxoaSkKKyAgICAgICAqICBhbmQgc3VjY2Vzc2l2ZWx5IHdyaXRlcyBpdCB0byB2ZWMuICB2ZWMgbXVzdCBoYXZlIGFzIG1hbnkgZWxlbWVudHMKKyAgICAgICAqICBhcyB0aGUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIGRvX2lzKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIGNsYXNzaWZ5aW5nLiAgZG9faXMoKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUKKyAgICAgICAqICBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19sbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9fdmVjICBQb2ludGVyIHRvIGFuIGFycmF5IG9mIG1hc2sgc3RvcmFnZS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9faXMoY29uc3QgY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGksIG1hc2sqIF9fdmVjKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHdjaGFyX3QgbWF0Y2hpbmcgbWFzaworICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBhbmQgcmV0dXJucyB0aGUgZmlyc3Qgd2NoYXJfdCBjIGluCisgICAgICAgKiAgW19fbG8sX19oaSkgZm9yIHdoaWNoIGlzKF9fbSxjKSBpcyB0cnVlLgorICAgICAgICoKKyAgICAgICAqICBkb19zY2FuX2lzKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIG1hdGNoIHNlYXJjaGluZy4gIGRvX2lzKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbSAgVGhlIG1hc2sgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBQb2ludGVyIHRvIGEgbWF0Y2hpbmcgd2NoYXJfdCBpZiBmb3VuZCwgZWxzZSBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fc2Nhbl9pcyhtYXNrIF9fbSwgY29uc3QgY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgd2NoYXJfdCBub3QgbWF0Y2hpbmcgbWFzaworICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgd2NoYXJfdCBjIG9mIFtfX2xvLF9faGkpIGZvciB3aGljaCBpcyhfX20sYykgaXMgZmFsc2UuCisgICAgICAgKgorICAgICAgICogIGRvX3NjYW5faXMoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgbWF0Y2ggc2VhcmNoaW5nLiAgZG9faXMoKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUKKyAgICAgICAqICBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19tICBUaGUgbWFzayB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIFBvaW50ZXIgdG8gYSBub24tbWF0Y2hpbmcgd2NoYXJfdCBpZiBmb3VuZCwgZWxzZSBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fc2Nhbl9ub3QobWFzayBfX20sIGNvbnN0IGNoYXJfdHlwZSogX19sbywKKwkJICBjb25zdCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnZlcnQgdG8gdXBwZXJjYXNlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIHZpcnR1YWwgZnVuY3Rpb24gY29udmVydHMgdGhlIHdjaGFyX3QgYXJndW1lbnQgdG8gdXBwZXJjYXNlIGlmCisgICAgICAgKiAgcG9zc2libGUuICBJZiBub3QgcG9zc2libGUgKGZvciBleGFtcGxlLCAnMicpLCByZXR1cm5zIHRoZSBhcmd1bWVudC4KKyAgICAgICAqCisgICAgICAgKiAgZG9fdG91cHBlcigpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICB1cHBlcmNhc2luZy4gIGRvX3RvdXBwZXIoKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvcgorICAgICAgICogIHRoZSBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgd2NoYXJfdCB0byBjb252ZXJ0LgorICAgICAgICogIEByZXR1cm4gIFRoZSB1cHBlcmNhc2Ugd2NoYXJfdCBpZiBjb252ZXJ0aWJsZSwgZWxzZSBAYSBfX2MuCisgICAgICAqLworICAgICAgdmlydHVhbCBjaGFyX3R5cGUKKyAgICAgIGRvX3RvdXBwZXIoY2hhcl90eXBlIF9fYykgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCBhcnJheSB0byB1cHBlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIHdjaGFyX3QgaW4gdGhlIHJhbmdlIFtsbyxoaSkgdG8KKyAgICAgICAqICB1cHBlcmNhc2UgaWYgcG9zc2libGUuICBPdGhlciBlbGVtZW50cyByZW1haW4gdW50b3VjaGVkLgorICAgICAgICoKKyAgICAgICAqICBkb190b3VwcGVyKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIHVwcGVyY2FzaW5nLiAgZG9fdG91cHBlcigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yCisgICAgICAgKiAgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fdG91cHBlcihjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCB0byBsb3dlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgYXJndW1lbnQgdG8gbG93ZXJjYXNlIGlmCisgICAgICAgKiAgcG9zc2libGUuICBJZiBub3QgcG9zc2libGUgKGZvciBleGFtcGxlLCAnMicpLCByZXR1cm5zIHRoZSBhcmd1bWVudC4KKyAgICAgICAqCisgICAgICAgKiAgZG9fdG9sb3dlcigpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICBsb3dlcmNhc2luZy4gIGRvX3RvbG93ZXIoKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvcgorICAgICAgICogIHRoZSBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgd2NoYXJfdCB0byBjb252ZXJ0LgorICAgICAgICogIEByZXR1cm4gIFRoZSBsb3dlcmNhc2Ugd2NoYXJfdCBpZiBjb252ZXJ0aWJsZSwgZWxzZSBAYSBfX2MuCisgICAgICAqLworICAgICAgdmlydHVhbCBjaGFyX3R5cGUKKyAgICAgIGRvX3RvbG93ZXIoY2hhcl90eXBlIF9fYykgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCBhcnJheSB0byBsb3dlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIHdjaGFyX3QgaW4gdGhlIHJhbmdlIFtsbyxoaSkgdG8KKyAgICAgICAqICBsb3dlcmNhc2UgaWYgcG9zc2libGUuICBPdGhlciBlbGVtZW50cyByZW1haW4gdW50b3VjaGVkLgorICAgICAgICoKKyAgICAgICAqICBkb190b2xvd2VyKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIGxvd2VyY2FzaW5nLiAgZG9fdG9sb3dlcigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yCisgICAgICAgKiAgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2xvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2hpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBfX2hpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fdG9sb3dlcihjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgV2lkZW4gY2hhciB0byB3Y2hhcl90CisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgY2hhciB0byB3Y2hhcl90IHVzaW5nIHRoZQorICAgICAgICogIHNpbXBsZXN0IHJlYXNvbmFibGUgdHJhbnNmb3JtYXRpb24uICBGb3IgYW4gdW5kZXJpdmVkIGN0eXBlPHdjaGFyX3Q+CisgICAgICAgKiAgZmFjZXQsIHRoZSBhcmd1bWVudCB3aWxsIGJlIGNhc3QgdG8gd2NoYXJfdC4KKyAgICAgICAqCisgICAgICAgKiAgZG9fd2lkZW4oKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgd2lkZW5pbmcuICBkb193aWRlbigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZQorICAgICAgICogIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQgZm9yIGNvZGVwYWdlIGNvbnZlcnNpb25zLiAgU2VlCisgICAgICAgKiAgY29kZWN2dCBmb3IgdGhhdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fYyAgVGhlIGNoYXIgdG8gY29udmVydC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY29udmVydGVkIHdjaGFyX3QuCisgICAgICAqLworICAgICAgdmlydHVhbCBjaGFyX3R5cGUKKyAgICAgIGRvX3dpZGVuKGNoYXIgX19jKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBXaWRlbiBjaGFyIGFycmF5IHRvIHdjaGFyX3QgYXJyYXkKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXIgaW4gdGhlIGlucHV0IHRvIHdjaGFyX3QgdXNpbmcgdGhlCisgICAgICAgKiAgc2ltcGxlc3QgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbi4gIEZvciBhbiB1bmRlcml2ZWQgY3R5cGU8d2NoYXJfdD4KKyAgICAgICAqICBmYWNldCwgdGhlIGFyZ3VtZW50IHdpbGwgYmUgY29waWVkLCBjYXN0aW5nIGVhY2ggZWxlbWVudCB0byB3Y2hhcl90LgorICAgICAgICoKKyAgICAgICAqICBkb193aWRlbigpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICB3aWRlbmluZy4gIGRvX3dpZGVuKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCBmb3IgY29kZXBhZ2UgY29udmVyc2lvbnMuICBTZWUKKyAgICAgICAqICBjb2RlY3Z0IGZvciB0aGF0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19sbyAgUG9pbnRlciB0byBzdGFydCByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19oaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9fdG8gIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGFycmF5LgorICAgICAgICogIEByZXR1cm4gIEBhIF9faGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyKgorICAgICAgZG9fd2lkZW4oY29uc3QgY2hhciogX19sbywgY29uc3QgY2hhciogX19oaSwgY2hhcl90eXBlKiBfX3RvKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOYXJyb3cgd2NoYXJfdCB0byBjaGFyCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgYXJndW1lbnQgdG8gY2hhciB1c2luZworICAgICAgICogIHRoZSBzaW1wbGVzdCByZWFzb25hYmxlIHRyYW5zZm9ybWF0aW9uLiAgSWYgdGhlIGNvbnZlcnNpb24KKyAgICAgICAqICBmYWlscywgZGZhdWx0IGlzIHJldHVybmVkIGluc3RlYWQuICBGb3IgYW4gdW5kZXJpdmVkCisgICAgICAgKiAgY3R5cGU8d2NoYXJfdD4gZmFjZXQsIEBhIGMgd2lsbCBiZSBjYXN0IHRvIGNoYXIgYW5kCisgICAgICAgKiAgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIGRvX25hcnJvdygpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUKKyAgICAgICAqICBiZWhhdmlvciBvZiBuYXJyb3dpbmcuICBkb19uYXJyb3coKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlCisgICAgICAgKiAgc2FtZSByZXN1bHQgZm9yIHRoZSBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSB3Y2hhcl90IHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHBhcmFtIF9fZGZhdWx0ICBDaGFyIHRvIHJldHVybiBpZiBjb252ZXJzaW9uIGZhaWxzLgorICAgICAgICogIEByZXR1cm4gIFRoZSBjb252ZXJ0ZWQgY2hhci4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNoYXIKKyAgICAgIGRvX25hcnJvdyhjaGFyX3R5cGUgX19jLCBjaGFyIF9fZGZhdWx0KSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOYXJyb3cgd2NoYXJfdCBhcnJheSB0byBjaGFyIGFycmF5CisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIHdjaGFyX3QgaW4gdGhlIHJhbmdlIFtsbyxoaSkgdG8KKyAgICAgICAqICBjaGFyIHVzaW5nIHRoZSBzaW1wbGVzdCByZWFzb25hYmxlIHRyYW5zZm9ybWF0aW9uIGFuZCB3cml0ZXMgdGhlCisgICAgICAgKiAgcmVzdWx0cyB0byB0aGUgZGVzdGluYXRpb24gYXJyYXkuICBGb3IgYW55IHdjaGFyX3QgaW4gdGhlIGlucHV0IHRoYXQKKyAgICAgICAqICBjYW5ub3QgYmUgY29udmVydGVkLCBAYSBkZmF1bHQgaXMgdXNlZCBpbnN0ZWFkLiAgRm9yIGFuIHVuZGVyaXZlZAorICAgICAgICogIGN0eXBlPHdjaGFyX3Q+IGZhY2V0LCB0aGUgYXJndW1lbnQgd2lsbCBiZSBjb3BpZWQsIGNhc3RpbmcgZWFjaAorICAgICAgICogIGVsZW1lbnQgdG8gY2hhci4KKyAgICAgICAqCisgICAgICAgKiAgZG9fbmFycm93KCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIG5hcnJvd2luZy4gIGRvX25hcnJvdygpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZQorICAgICAgICogIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQgZm9yIGNvZGVwYWdlIGNvbnZlcnNpb25zLiAgU2VlCisgICAgICAgKiAgY29kZWN2dCBmb3IgdGhhdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2RmYXVsdCAgQ2hhciB0byB1c2UgaWYgY29udmVyc2lvbiBmYWlscy4KKyAgICAgICAqICBAcGFyYW0gX190byAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYXJyYXkuCisgICAgICAgKiAgQHJldHVybiAgQGEgX19oaS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIGRvX25hcnJvdyhjb25zdCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSwKKwkJY2hhciBfX2RmYXVsdCwgY2hhciogX190bykgY29uc3Q7CisKKyAgICAgIC8vIEZvciB1c2UgYXQgY29uc3RydWN0aW9uIHRpbWUgb25seS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2luaXRpYWxpemVfY3R5cGUoKSB0aHJvdygpOworICAgIH07CisjZW5kaWYgLy9fR0xJQkNYWF9VU0VfV0NIQVJfVAorCisgIC8vLyBjbGFzcyBjdHlwZV9ieW5hbWUgWzIyLjIuMS4yXS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGNsYXNzIGN0eXBlX2J5bmFtZSA6IHB1YmxpYyBjdHlwZTxfQ2hhclQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY3R5cGU8X0NoYXJUPjo6bWFzayAgbWFzazsKKworICAgICAgZXhwbGljaXQKKyAgICAgIGN0eXBlX2J5bmFtZShjb25zdCBjaGFyKiBfX3MsIHNpemVfdCBfX3JlZnMgPSAwKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5jdHlwZV9ieW5hbWUoKSB7IH07CisgICAgfTsKKworICAvLy8gMjIuMi4xLjQgIENsYXNzIGN0eXBlX2J5bmFtZSBzcGVjaWFsaXphdGlvbnMuCisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBjdHlwZV9ieW5hbWU8Y2hhcj4gOiBwdWJsaWMgY3R5cGU8Y2hhcj4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIGN0eXBlX2J5bmFtZShjb25zdCBjaGFyKiBfX3MsIHNpemVfdCBfX3JlZnMgPSAwKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5jdHlwZV9ieW5hbWUoKTsKKyAgICB9OworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdGVtcGxhdGU8PgorICAgIGNsYXNzIGN0eXBlX2J5bmFtZTx3Y2hhcl90PiA6IHB1YmxpYyBjdHlwZTx3Y2hhcl90PgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdAorICAgICAgY3R5cGVfYnluYW1lKGNvbnN0IGNoYXIqIF9fcywgc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgcHJvdGVjdGVkOgorICAgICAgdmlydHVhbAorICAgICAgfmN0eXBlX2J5bmFtZSgpOworICAgIH07CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisvLyBJbmNsdWRlIGhvc3QgYW5kIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgY3R5cGUgaW5saW5lcy4KKyNpbmNsdWRlIDxiaXRzL2N0eXBlX2lubGluZS5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gMjIuMi4yICBUaGUgbnVtZXJpYyBjYXRlZ29yeS4KKyAgY2xhc3MgX19udW1fYmFzZQorICB7CisgIHB1YmxpYzoKKyAgICAvLyBOQjogQ29kZSBkZXBlbmRzIG9uIHRoZSBvcmRlciBvZiBfU19hdG9tc19vdXQgZWxlbWVudHMuCisgICAgLy8gQmVsb3cgYXJlIHRoZSBpbmRpY2VzIGludG8gX1NfYXRvbXNfb3V0LgorICAgIGVudW0KKyAgICAgIHsKKwlfU19vbWludXMsCisJX1Nfb3BsdXMsCisJX1Nfb3gsCisJX1Nfb1gsCisJX1Nfb2RpZ2l0cywKKwlfU19vZGlnaXRzX2VuZCA9IF9TX29kaWdpdHMgKyAxNiwKKwlfU19vdWRpZ2l0cyA9IF9TX29kaWdpdHNfZW5kLAorCV9TX291ZGlnaXRzX2VuZCA9IF9TX291ZGlnaXRzICsgMTYsCisJX1Nfb2UgPSBfU19vZGlnaXRzICsgMTQsICAvLyBGb3Igc2NpZW50aWZpYyBub3RhdGlvbiwgJ2UnCisJX1Nfb0UgPSBfU19vdWRpZ2l0cyArIDE0LCAvLyBGb3Igc2NpZW50aWZpYyBub3RhdGlvbiwgJ0UnCisJX1Nfb2VuZCA9IF9TX291ZGlnaXRzX2VuZAorICAgICAgfTsKKworICAgIC8vIEEgbGlzdCBvZiB2YWxpZCBudW1lcmljIGxpdGVyYWxzIGZvciBvdXRwdXQuICBUaGlzIGFycmF5CisgICAgLy8gY29udGFpbnMgY2hhcnMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0aHJvdWdoIHRoZSBjdXJyZW50IGxvY2FsZSdzCisgICAgLy8gY3R5cGU8X0NoYXJUPi53aWRlbigpIGFuZCB0aGVuIHVzZWQgdG8gcmVuZGVyIG51bWJlcnMuCisgICAgLy8gRm9yIHRoZSBzdGFuZGFyZCAiQyIgbG9jYWxlLCB0aGlzIGlzCisgICAgLy8gIi0reFgwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OUFCQ0RFRiIuCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIF9TX2F0b21zX291dDsKKworICAgIC8vIFN0cmluZyBsaXRlcmFsIG9mIGFjY2VwdGFibGUgKG5hcnJvdykgaW5wdXQsIGZvciBudW1fZ2V0LgorICAgIC8vICItK3hYMDEyMzQ1Njc4OWFiY2RlZkFCQ0RFRiIKKyAgICBzdGF0aWMgY29uc3QgY2hhciogX1NfYXRvbXNfaW47CisKKyAgICBlbnVtCisgICAgeworICAgICAgX1NfaW1pbnVzLAorICAgICAgX1NfaXBsdXMsCisgICAgICBfU19peCwKKyAgICAgIF9TX2lYLAorICAgICAgX1NfaXplcm8sCisgICAgICBfU19pZSA9IF9TX2l6ZXJvICsgMTQsCisgICAgICBfU19pRSA9IF9TX2l6ZXJvICsgMjAsCisgICAgICBfU19pZW5kID0gMjYKKyAgICB9OworCisgICAgLy8gbnVtX3B1dAorICAgIC8vIENvbnN0cnVjdCBhbmQgcmV0dXJuIHZhbGlkIHNjYW5mIGZvcm1hdCBmb3IgZmxvYXRpbmcgcG9pbnQgdHlwZXMuCisgICAgc3RhdGljIHZvaWQKKyAgICBfU19mb3JtYXRfZmxvYXQoY29uc3QgaW9zX2Jhc2UmIF9faW8sIGNoYXIqIF9fZnB0ciwgY2hhciBfX21vZCkgdGhyb3coKTsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgc3RydWN0IF9fbnVtcHVuY3RfY2FjaGUgOiBwdWJsaWMgbG9jYWxlOjpmYWNldAorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIqCQkJX01fZ3JvdXBpbmc7CisgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fZ3JvdXBpbmdfc2l6ZTsKKyAgICAgIGJvb2wJCQkJX01fdXNlX2dyb3VwaW5nOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX3RydWVuYW1lOworICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX3RydWVuYW1lX3NpemU7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fZmFsc2VuYW1lOworICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2ZhbHNlbmFtZV9zaXplOworICAgICAgX0NoYXJUCQkJCV9NX2RlY2ltYWxfcG9pbnQ7CisgICAgICBfQ2hhclQJCQkJX01fdGhvdXNhbmRzX3NlcDsKKworICAgICAgLy8gQSBsaXN0IG9mIHZhbGlkIG51bWVyaWMgbGl0ZXJhbHMgZm9yIG91dHB1dDogaW4gdGhlIHN0YW5kYXJkCisgICAgICAvLyAiQyIgbG9jYWxlLCB0aGlzIGlzICItK3hYMDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlBQkNERUYiLgorICAgICAgLy8gVGhpcyBhcnJheSBjb250YWlucyB0aGUgY2hhcnMgYWZ0ZXIgaGF2aW5nIGJlZW4gcGFzc2VkCisgICAgICAvLyB0aHJvdWdoIHRoZSBjdXJyZW50IGxvY2FsZSdzIGN0eXBlPF9DaGFyVD4ud2lkZW4oKS4KKyAgICAgIF9DaGFyVAkJCQlfTV9hdG9tc19vdXRbX19udW1fYmFzZTo6X1Nfb2VuZF07CisKKyAgICAgIC8vIEEgbGlzdCBvZiB2YWxpZCBudW1lcmljIGxpdGVyYWxzIGZvciBpbnB1dDogaW4gdGhlIHN0YW5kYXJkCisgICAgICAvLyAiQyIgbG9jYWxlLCB0aGlzIGlzICItK3hYMDEyMzQ1Njc4OWFiY2RlZkFCQ0RFRiIKKyAgICAgIC8vIFRoaXMgYXJyYXkgY29udGFpbnMgdGhlIGNoYXJzIGFmdGVyIGhhdmluZyBiZWVuIHBhc3NlZAorICAgICAgLy8gdGhyb3VnaCB0aGUgY3VycmVudCBsb2NhbGUncyBjdHlwZTxfQ2hhclQ+LndpZGVuKCkuCisgICAgICBfQ2hhclQJCQkJX01fYXRvbXNfaW5bX19udW1fYmFzZTo6X1NfaWVuZF07CisKKyAgICAgIGJvb2wJCQkJX01fYWxsb2NhdGVkOworCisgICAgICBfX251bXB1bmN0X2NhY2hlKHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiBmYWNldChfX3JlZnMpLCBfTV9ncm91cGluZygwKSwgX01fZ3JvdXBpbmdfc2l6ZSgwKSwKKwlfTV91c2VfZ3JvdXBpbmcoZmFsc2UpLAorCV9NX3RydWVuYW1lKDApLCBfTV90cnVlbmFtZV9zaXplKDApLCBfTV9mYWxzZW5hbWUoMCksCisJX01fZmFsc2VuYW1lX3NpemUoMCksIF9NX2RlY2ltYWxfcG9pbnQoX0NoYXJUKCkpLAorCV9NX3Rob3VzYW5kc19zZXAoX0NoYXJUKCkpLCBfTV9hbGxvY2F0ZWQoZmFsc2UpCisJeyB9CisKKyAgICAgIH5fX251bXB1bmN0X2NhY2hlKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2NhY2hlKGNvbnN0IGxvY2FsZSYgX19sb2MpOworCisgICAgcHJpdmF0ZToKKyAgICAgIF9fbnVtcHVuY3RfY2FjaGUmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX19udW1wdW5jdF9jYWNoZSYpOworCisgICAgICBleHBsaWNpdAorICAgICAgX19udW1wdW5jdF9jYWNoZShjb25zdCBfX251bXB1bmN0X2NhY2hlJik7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgX19udW1wdW5jdF9jYWNoZTxfQ2hhclQ+Ojp+X19udW1wdW5jdF9jYWNoZSgpCisgICAgeworICAgICAgaWYgKF9NX2FsbG9jYXRlZCkKKwl7CisJICBkZWxldGUgW10gX01fZ3JvdXBpbmc7CisJICBkZWxldGUgW10gX01fdHJ1ZW5hbWU7CisJICBkZWxldGUgW10gX01fZmFsc2VuYW1lOworCX0KKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUgbnVtcHVuY3QuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBUaGlzIGZhY2V0IHN0b3JlcyBzZXZlcmFsIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHByaW50aW5nIGFuZAorICAgKiAgc2Nhbm5pbmcgbnVtYmVycywgc3VjaCBhcyB0aGUgZGVjaW1hbCBwb2ludCBjaGFyYWN0ZXIuICBJdCB0YWtlcyBhCisgICAqICB0ZW1wbGF0ZSBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgY2hhciB0eXBlLiAgVGhlIG51bXB1bmN0IGZhY2V0IGlzCisgICAqICB1c2VkIGJ5IHN0cmVhbXMgZm9yIG1hbnkgSS9PIG9wZXJhdGlvbnMgaW52b2x2aW5nIG51bWJlcnMuCisgICAqCisgICAqICBUaGUgbnVtcHVuY3QgdGVtcGxhdGUgdXNlcyBwcm90ZWN0ZWQgdmlydHVhbCBmdW5jdGlvbnMgdG8gcHJvdmlkZSB0aGUKKyAgICogIGFjdHVhbCByZXN1bHRzLiAgVGhlIHB1YmxpYyBhY2Nlc3NvcnMgZm9yd2FyZCB0aGUgY2FsbCB0byB0aGUgdmlydHVhbAorICAgKiAgZnVuY3Rpb25zLiAgVGhlc2UgdmlydHVhbCBmdW5jdGlvbnMgYXJlIGhvb2tzIGZvciBkZXZlbG9wZXJzIHRvCisgICAqICBpbXBsZW1lbnQgdGhlIGJlaGF2aW9yIHRoZXkgcmVxdWlyZSBmcm9tIGEgbnVtcHVuY3QgZmFjZXQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBjbGFzcyBudW1wdW5jdCA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgLy9AeworICAgICAgLy8vIFB1YmxpYyB0eXBlZGVmcworICAgICAgdHlwZWRlZiBfQ2hhclQJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQ+CXN0cmluZ190eXBlOworICAgICAgLy9AfQorICAgICAgdHlwZWRlZiBfX251bXB1bmN0X2NhY2hlPF9DaGFyVD4gIF9fY2FjaGVfdHlwZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9fY2FjaGVfdHlwZSoJCQlfTV9kYXRhOworCisgICAgcHVibGljOgorICAgICAgLy8vIE51bXB1bmN0IGZhY2V0IGlkLgorICAgICAgc3RhdGljIGxvY2FsZTo6aWQJCQlpZDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOdW1wdW5jdCBjb25zdHJ1Y3Rvci4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3JlZnMgIFJlZmNvdW50IHRvIHBhc3MgdG8gdGhlIGJhc2UgY2xhc3MuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBudW1wdW5jdChzaXplX3QgX19yZWZzID0gMCkKKyAgICAgIDogZmFjZXQoX19yZWZzKSwgX01fZGF0YSgwKQorICAgICAgeyBfTV9pbml0aWFsaXplX251bXB1bmN0KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnRlcm5hbCBjb25zdHJ1Y3Rvci4gIE5vdCBmb3IgZ2VuZXJhbCB1c2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSBjb25zdHJ1Y3RvciBmb3IgdXNlIGJ5IHRoZSBsaWJyYXJ5IGl0c2VsZiB0byBzZXQgdXAgdGhlCisgICAgICAgKiAgcHJlZGVmaW5lZCBsb2NhbGUgZmFjZXRzLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fY2FjaGUgIF9fbnVtcHVuY3RfY2FjaGUgb2JqZWN0LgorICAgICAgICogIEBwYXJhbSAgX19yZWZzICBSZWZjb3VudCB0byBwYXNzIHRvIHRoZSBiYXNlIGNsYXNzLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgbnVtcHVuY3QoX19jYWNoZV90eXBlKiBfX2NhY2hlLCBzaXplX3QgX19yZWZzID0gMCkKKyAgICAgIDogZmFjZXQoX19yZWZzKSwgX01fZGF0YShfX2NhY2hlKQorICAgICAgeyBfTV9pbml0aWFsaXplX251bXB1bmN0KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnRlcm5hbCBjb25zdHJ1Y3Rvci4gIE5vdCBmb3IgZ2VuZXJhbCB1c2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSBjb25zdHJ1Y3RvciBmb3IgdXNlIGJ5IHRoZSBsaWJyYXJ5IGl0c2VsZiB0byBzZXQgdXAgbmV3CisgICAgICAgKiAgbG9jYWxlcy4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX2Nsb2MgIFRoZSBDIGxvY2FsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fcmVmcyAgUmVmY291bnQgdG8gcGFzcyB0byB0aGUgYmFzZSBjbGFzcy4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG51bXB1bmN0KF9fY19sb2NhbGUgX19jbG9jLCBzaXplX3QgX19yZWZzID0gMCkKKyAgICAgIDogZmFjZXQoX19yZWZzKSwgX01fZGF0YSgwKQorICAgICAgeyBfTV9pbml0aWFsaXplX251bXB1bmN0KF9fY2xvYyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gZGVjaW1hbCBwb2ludCBjaGFyYWN0ZXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGNoYXJfdHlwZSB0byB1c2UgYXMgYSBkZWNpbWFsIHBvaW50LiAgSXQKKyAgICAgICAqICBkb2VzIHNvIGJ5IHJldHVybmluZyByZXR1cm5pbmcKKyAgICAgICAqICBudW1wdW5jdDxjaGFyX3R5cGU+Ojpkb19kZWNpbWFsX3BvaW50KCkuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIEBhIGNoYXJfdHlwZSByZXByZXNlbnRpbmcgYSBkZWNpbWFsIHBvaW50LgorICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZQorICAgICAgZGVjaW1hbF9wb2ludCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19kZWNpbWFsX3BvaW50KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gdGhvdXNhbmRzIHNlcGFyYXRvciBjaGFyYWN0ZXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGNoYXJfdHlwZSB0byB1c2UgYXMgYSB0aG91c2FuZHMKKyAgICAgICAqICBzZXBhcmF0b3IuICBJdCBkb2VzIHNvIGJ5IHJldHVybmluZyByZXR1cm5pbmcKKyAgICAgICAqICBudW1wdW5jdDxjaGFyX3R5cGU+Ojpkb190aG91c2FuZHNfc2VwKCkuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIGNoYXJfdHlwZSByZXByZXNlbnRpbmcgYSB0aG91c2FuZHMgc2VwYXJhdG9yLgorICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZQorICAgICAgdGhvdXNhbmRzX3NlcCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb190aG91c2FuZHNfc2VwKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gZ3JvdXBpbmcgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyBncm91cGluZ3MgZm9yIHRoZQorICAgICAgICogIGludGVnZXIgcGFydCBvZiBhIG51bWJlci4gIEdyb3VwaW5ncyBpbmRpY2F0ZSB3aGVyZSB0aG91c2FuZHMKKyAgICAgICAqICBzZXBhcmF0b3JzIHNob3VsZCBiZSBpbnNlcnRlZCBpbiB0aGUgaW50ZWdlciBwYXJ0IG9mIGEgbnVtYmVyLgorICAgICAgICoKKyAgICAgICAqICBFYWNoIGNoYXIgaW4gdGhlIHJldHVybiBzdHJpbmcgaXMgaW50ZXJwcmV0IGFzIGFuIGludGVnZXIKKyAgICAgICAqICByYXRoZXIgdGhhbiBhIGNoYXJhY3Rlci4gIFRoZXNlIG51bWJlcnMgcmVwcmVzZW50IHRoZSBudW1iZXIKKyAgICAgICAqICBvZiBkaWdpdHMgaW4gYSBncm91cC4gIFRoZSBmaXJzdCBjaGFyIGluIHRoZSBzdHJpbmcKKyAgICAgICAqICByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgZGlnaXRzIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudAorICAgICAgICogIGdyb3VwLiAgSWYgYSBjaGFyIGlzIG5lZ2F0aXZlLCBpdCBpbmRpY2F0ZXMgYW4gdW5saW1pdGVkCisgICAgICAgKiAgbnVtYmVyIG9mIGRpZ2l0cyBmb3IgdGhlIGdyb3VwLiAgSWYgbW9yZSBjaGFycyBmcm9tIHRoZQorICAgICAgICogIHN0cmluZyBhcmUgcmVxdWlyZWQgdG8gZ3JvdXAgYSBudW1iZXIsIHRoZSBsYXN0IGNoYXIgaXMgdXNlZAorICAgICAgICogIHJlcGVhdGVkbHkuCisgICAgICAgKgorICAgICAgICogIEZvciBleGFtcGxlLCBpZiB0aGUgZ3JvdXBpbmcoKSByZXR1cm5zICJcMDAzXDAwMiIgYW5kIGlzCisgICAgICAgKiAgYXBwbGllZCB0byB0aGUgbnVtYmVyIDEyMzQ1Njc4OSwgdGhpcyBjb3JyZXNwb25kcyB0bworICAgICAgICogIDEyLDM0LDU2LDc4OS4gIE5vdGUgdGhhdCBpZiB0aGUgc3RyaW5nIHdhcyAiMzIiLCB0aGlzIHdvdWxkCisgICAgICAgKiAgcHV0IG1vcmUgdGhhbiA1MCBkaWdpdHMgaW50byB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgZ3JvdXAgaWYKKyAgICAgICAqICB0aGUgY2hhcmFjdGVyIHNldCBpcyBBU0NJSS4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIHN0cmluZyBpcyByZXR1cm5lZCBieSBjYWxsaW5nCisgICAgICAgKiAgbnVtcHVuY3Q8Y2hhcl90eXBlPjo6ZG9fZ3JvdXBpbmcoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgc3RyaW5nIHJlcHJlc2VudGluZyBncm91cGluZyBzcGVjaWZpY2F0aW9uLgorICAgICAgKi8KKyAgICAgIHN0cmluZworICAgICAgZ3JvdXBpbmcoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZ3JvdXBpbmcoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYm9vbCB0cnVlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmdfdHlwZSBjb250YWluaW5nIHRoZSB0ZXh0CisgICAgICAgKiAgcmVwcmVzZW50YXRpb24gZm9yIHRydWUgYm9vbCB2YXJpYWJsZXMuICBJdCBkb2VzIHNvIGJ5IGNhbGxpbmcKKyAgICAgICAqICBudW1wdW5jdDxjaGFyX3R5cGU+Ojpkb190cnVlbmFtZSgpLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBzdHJpbmdfdHlwZSByZXByZXNlbnRpbmcgcHJpbnRlZCBmb3JtIG9mIHRydWUuCisgICAgICAqLworICAgICAgc3RyaW5nX3R5cGUKKyAgICAgIHRydWVuYW1lKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3RydWVuYW1lKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGJvb2wgZmFsc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHN0cmluZ190eXBlIGNvbnRhaW5pbmcgdGhlIHRleHQKKyAgICAgICAqICByZXByZXNlbnRhdGlvbiBmb3IgZmFsc2UgYm9vbCB2YXJpYWJsZXMuICBJdCBkb2VzIHNvIGJ5IGNhbGxpbmcKKyAgICAgICAqICBudW1wdW5jdDxjaGFyX3R5cGU+Ojpkb19mYWxzZW5hbWUoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgc3RyaW5nX3R5cGUgcmVwcmVzZW50aW5nIHByaW50ZWQgZm9ybSBvZiBmYWxzZS4KKyAgICAgICovCisgICAgICBzdHJpbmdfdHlwZQorICAgICAgZmFsc2VuYW1lKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2ZhbHNlbmFtZSgpOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLy8gRGVzdHJ1Y3Rvci4KKyAgICAgIHZpcnR1YWwKKyAgICAgIH5udW1wdW5jdCgpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBkZWNpbWFsIHBvaW50IGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIGNoYXJfdHlwZSB0byB1c2UgYXMgYSBkZWNpbWFsIHBvaW50LiAgVGhpcyBmdW5jdGlvbiBpcyBhCisgICAgICAgKiAgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIEBhIGNoYXJfdHlwZSByZXByZXNlbnRpbmcgYSBkZWNpbWFsIHBvaW50LgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY2hhcl90eXBlCisgICAgICBkb19kZWNpbWFsX3BvaW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGEtPl9NX2RlY2ltYWxfcG9pbnQ7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gdGhvdXNhbmRzIHNlcGFyYXRvciBjaGFyYWN0ZXIuCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgYSBjaGFyX3R5cGUgdG8gdXNlIGFzIGEgdGhvdXNhbmRzIHNlcGFyYXRvci4gIFRoaXMgZnVuY3Rpb24KKyAgICAgICAqICBpcyBhIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBAYSBjaGFyX3R5cGUgcmVwcmVzZW50aW5nIGEgdGhvdXNhbmRzIHNlcGFyYXRvci4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNoYXJfdHlwZQorICAgICAgZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kYXRhLT5fTV90aG91c2FuZHNfc2VwOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGdyb3VwaW5nIHNwZWNpZmljYXRpb24uCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGdyb3VwaW5ncyBmb3IgdGhlIGludGVnZXIgcGFydCBvZiBhCisgICAgICAgKiAgbnVtYmVyLiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlCisgICAgICAgKiAgdmFsdWUgcmV0dXJuZWQuICBAc2VlIGdyb3VwaW5nKCkgZm9yIGRldGFpbHMuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIFN0cmluZyByZXByZXNlbnRpbmcgZ3JvdXBpbmcgc3BlY2lmaWNhdGlvbi4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIHN0cmluZworICAgICAgZG9fZ3JvdXBpbmcoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGF0YS0+X01fZ3JvdXBpbmc7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGJvb2wgdHJ1ZS4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIHN0cmluZ190eXBlIGNvbnRhaW5pbmcgdGhlIHRleHQgcmVwcmVzZW50YXRpb24gZm9yIHRydWUKKyAgICAgICAqICBib29sIHZhcmlhYmxlcy4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8KKyAgICAgICAqICBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBzdHJpbmdfdHlwZSByZXByZXNlbnRpbmcgcHJpbnRlZCBmb3JtIG9mIHRydWUuCisgICAgICAqLworICAgICAgdmlydHVhbCBzdHJpbmdfdHlwZQorICAgICAgZG9fdHJ1ZW5hbWUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGF0YS0+X01fdHJ1ZW5hbWU7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGJvb2wgZmFsc2UuCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgYSBzdHJpbmdfdHlwZSBjb250YWluaW5nIHRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uIGZvciBmYWxzZQorICAgICAgICogIGJvb2wgdmFyaWFibGVzLiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0bworICAgICAgICogIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIHN0cmluZ190eXBlIHJlcHJlc2VudGluZyBwcmludGVkIGZvcm0gb2YgZmFsc2UuCisgICAgICAqLworICAgICAgdmlydHVhbCBzdHJpbmdfdHlwZQorICAgICAgZG9fZmFsc2VuYW1lKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGEtPl9NX2ZhbHNlbmFtZTsgfQorCisgICAgICAvLyBGb3IgdXNlIGF0IGNvbnN0cnVjdGlvbiB0aW1lIG9ubHkuCisgICAgICB2b2lkCisgICAgICBfTV9pbml0aWFsaXplX251bXB1bmN0KF9fY19sb2NhbGUgX19jbG9jID0gMCk7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgbG9jYWxlOjppZCBudW1wdW5jdDxfQ2hhclQ+OjppZDsKKworICB0ZW1wbGF0ZTw+CisgICAgbnVtcHVuY3Q8Y2hhcj46On5udW1wdW5jdCgpOworCisgIHRlbXBsYXRlPD4KKyAgICB2b2lkCisgICAgbnVtcHVuY3Q8Y2hhcj46Ol9NX2luaXRpYWxpemVfbnVtcHVuY3QoX19jX2xvY2FsZSBfX2Nsb2MpOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdGVtcGxhdGU8PgorICAgIG51bXB1bmN0PHdjaGFyX3Q+Ojp+bnVtcHVuY3QoKTsKKworICB0ZW1wbGF0ZTw+CisgICAgdm9pZAorICAgIG51bXB1bmN0PHdjaGFyX3Q+OjpfTV9pbml0aWFsaXplX251bXB1bmN0KF9fY19sb2NhbGUgX19jbG9jKTsKKyNlbmRpZgorCisgIC8vLyBjbGFzcyBudW1wdW5jdF9ieW5hbWUgWzIyLjIuMy4yXS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGNsYXNzIG51bXB1bmN0X2J5bmFtZSA6IHB1YmxpYyBudW1wdW5jdDxfQ2hhclQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJUPglzdHJpbmdfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIG51bXB1bmN0X2J5bmFtZShjb25zdCBjaGFyKiBfX3MsIHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiBudW1wdW5jdDxfQ2hhclQ+KF9fcmVmcykKKyAgICAgIHsKKwlpZiAoX19idWlsdGluX3N0cmNtcChfX3MsICJDIikgIT0gMAorCSAgICAmJiBfX2J1aWx0aW5fc3RyY21wKF9fcywgIlBPU0lYIikgIT0gMCkKKwkgIHsKKwkgICAgX19jX2xvY2FsZSBfX3RtcDsKKwkgICAgdGhpcy0+X1NfY3JlYXRlX2NfbG9jYWxlKF9fdG1wLCBfX3MpOworCSAgICB0aGlzLT5fTV9pbml0aWFsaXplX251bXB1bmN0KF9fdG1wKTsKKwkgICAgdGhpcy0+X1NfZGVzdHJveV9jX2xvY2FsZShfX3RtcCk7CisJICB9CisgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2aXJ0dWFsCisgICAgICB+bnVtcHVuY3RfYnluYW1lKCkgeyB9CisgICAgfTsKKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0xEQkwKKworICAvKioKKyAgICogIEBicmllZiAgUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZSBudW1fZ2V0LgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKgorICAgKiAgVGhpcyBmYWNldCBlbmNhcHN1bGF0ZXMgdGhlIGNvZGUgdG8gcGFyc2UgYW5kIHJldHVybiBhIG51bWJlcgorICAgKiAgZnJvbSBhIHN0cmluZy4gIEl0IGlzIHVzZWQgYnkgdGhlIGlzdHJlYW0gbnVtZXJpYyBleHRyYWN0aW9uCisgICAqICBvcGVyYXRvcnMuCisgICAqCisgICAqICBUaGUgbnVtX2dldCB0ZW1wbGF0ZSB1c2VzIHByb3RlY3RlZCB2aXJ0dWFsIGZ1bmN0aW9ucyB0byBwcm92aWRlIHRoZQorICAgKiAgYWN0dWFsIHJlc3VsdHMuICBUaGUgcHVibGljIGFjY2Vzc29ycyBmb3J3YXJkIHRoZSBjYWxsIHRvIHRoZSB2aXJ0dWFsCisgICAqICBmdW5jdGlvbnMuICBUaGVzZSB2aXJ0dWFsIGZ1bmN0aW9ucyBhcmUgaG9va3MgZm9yIGRldmVsb3BlcnMgdG8KKyAgICogIGltcGxlbWVudCB0aGUgYmVoYXZpb3IgdGhleSByZXF1aXJlIGZyb20gdGhlIG51bV9nZXQgZmFjZXQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBjbGFzcyBudW1fZ2V0IDogcHVibGljIGxvY2FsZTo6ZmFjZXQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICAvL0B7CisgICAgICAvLy8gUHVibGljIHR5cGVkZWZzCisgICAgICB0eXBlZGVmIF9DaGFyVAkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0luSXRlcgkJCWl0ZXJfdHlwZTsKKyAgICAgIC8vQH0KKworICAgICAgLy8vIE51bXB1bmN0IGZhY2V0IGlkLgorICAgICAgc3RhdGljIGxvY2FsZTo6aWQJCQlpZDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RvciBwZXJmb3JtcyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgcHJvdmlkZWQgYnkgdGhlIHN0YW5kYXJkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19yZWZzICBQYXNzZWQgdG8gdGhlIGJhc2UgZmFjZXQgY2xhc3MuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG51bV9nZXQoc2l6ZV90IF9fcmVmcyA9IDApIDogZmFjZXQoX19yZWZzKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOdW1lcmljIHBhcnNpbmcuCisgICAgICAgKgorICAgICAgICogIFBhcnNlcyB0aGUgaW5wdXQgc3RyZWFtIGludG8gdGhlIGJvb2wgQGEgdi4gIEl0IGRvZXMgc28gYnkgY2FsbGluZworICAgICAgICogIG51bV9nZXQ6OmRvX2dldCgpLgorICAgICAgICoKKyAgICAgICAqICBJZiBpb3NfYmFzZTo6Ym9vbGFscGhhIGlzIHNldCwgYXR0ZW1wdHMgdG8gcmVhZAorICAgICAgICogIGN0eXBlPENoYXJUPjo6dHJ1ZW5hbWUoKSBvciBjdHlwZTxDaGFyVD46OmZhbHNlbmFtZSgpLiAgU2V0cworICAgICAgICogIEBhIHYgdG8gdHJ1ZSBvciBmYWxzZSBpZiBzdWNjZXNzZnVsLiAgU2V0cyBlcnIgdG8KKyAgICAgICAqICBpb3NfYmFzZTo6ZmFpbGJpdCBpZiByZWFkaW5nIHRoZSBzdHJpbmcgZmFpbHMuICBTZXRzIGVyciB0bworICAgICAgICogIGlvc19iYXNlOjplb2ZiaXQgaWYgdGhlIHN0cmVhbSBpcyBlbXB0aWVkLgorICAgICAgICoKKyAgICAgICAqICBJZiBpb3NfYmFzZTo6Ym9vbGFscGhhIGlzIG5vdCBzZXQsIHByb2NlZWRzIGFzIHdpdGggcmVhZGluZyBhIGxvbmcsCisgICAgICAgKiAgZXhjZXB0IGlmIHRoZSB2YWx1ZSBpcyAxLCBzZXRzIEBhIHYgdG8gdHJ1ZSwgaWYgdGhlIHZhbHVlIGlzIDAsIHNldHMKKyAgICAgICAqICBAYSB2IHRvIGZhbHNlLCBhbmQgb3RoZXJ3aXNlIHNldCBlcnIgdG8gaW9zX2Jhc2U6OmZhaWxiaXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19pbiAgU3RhcnQgb2YgaW5wdXQgc3RyZWFtLgorICAgICAgICogIEBwYXJhbSAgX19lbmQgIEVuZCBvZiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgbG9jYWxlIGFuZCBmbGFncy4KKyAgICAgICAqICBAcGFyYW0gIF9fZXJyICBFcnJvciBmbGFncyB0byBzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3YgIFZhbHVlIHRvIGZvcm1hdCBhbmQgaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIGFmdGVyIHJlYWRpbmcuCisgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBnZXQoaXRlcl90eXBlIF9faW4sIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGJvb2wmIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldChfX2luLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdik7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOdW1lcmljIHBhcnNpbmcuCisgICAgICAgKgorICAgICAgICogIFBhcnNlcyB0aGUgaW5wdXQgc3RyZWFtIGludG8gdGhlIGludGVncmFsIHZhcmlhYmxlIEBhIHYuICBJdCBkb2VzIHNvCisgICAgICAgKiAgYnkgY2FsbGluZyBudW1fZ2V0Ojpkb19nZXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgUGFyc2luZyBpcyBhZmZlY3RlZCBieSB0aGUgZmxhZyBzZXR0aW5ncyBpbiBAYSBpby4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGJhc2ljIHBhcnNlIGlzIGFmZmVjdGVkIGJ5IHRoZSB2YWx1ZSBvZiBpby5mbGFncygpICYKKyAgICAgICAqICBpb3NfYmFzZTo6YmFzZWZpZWxkLiAgSWYgZXF1YWwgdG8gaW9zX2Jhc2U6Om9jdCwgcGFyc2VzIGxpa2UgdGhlCisgICAgICAgKiAgc2NhbmYgJW8gc3BlY2lmaWVyLiAgRWxzZSBpZiBlcXVhbCB0byBpb3NfYmFzZTo6aGV4LCBwYXJzZXMgbGlrZSAlWAorICAgICAgICogIHNwZWNpZmllci4gIEVsc2UgaWYgYmFzZWZpZWxkIGVxdWFsIHRvIDAsIHBhcnNlcyBsaWtlIHRoZSAlaQorICAgICAgICogIHNwZWNpZmllci4gIE90aGVyd2lzZSwgcGFyc2VzIGxpa2UgJWQgZm9yIHNpZ25lZCBhbmQgJXUgZm9yIHVuc2lnbmVkCisgICAgICAgKiAgdHlwZXMuICBUaGUgbWF0Y2hpbmcgdHlwZSBsZW5ndGggbW9kaWZpZXIgaXMgYWxzbyB1c2VkLgorICAgICAgICoKKyAgICAgICAqICBEaWdpdCBncm91cGluZyBpcyBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8KKyAgICAgICAqICBudW1wdW5jdDo6Z3JvdXBpbmcoKSBhbmQgbnVtcHVuY3Q6OnRob3VzYW5kc19zZXAoKS4gIElmIHRoZQorICAgICAgICogIHBhdHRlcm4gb2YgZGlnaXQgZ3JvdXBzIGlzbid0IGNvbnNpc3RlbnQsIHNldHMgZXJyIHRvCisgICAgICAgKiAgaW9zX2Jhc2U6OmZhaWxiaXQuCisgICAgICAgKgorICAgICAgICogIElmIHBhcnNpbmcgdGhlIHN0cmluZyB5aWVsZHMgYSB2YWxpZCB2YWx1ZSBmb3IgQGEgdiwgQGEgdiBpcyBzZXQuCisgICAgICAgKiAgT3RoZXJ3aXNlLCBzZXRzIGVyciB0byBpb3NfYmFzZTo6ZmFpbGJpdCBhbmQgbGVhdmVzIEBhIHYgdW5hbHRlcmVkLgorICAgICAgICogIFNldHMgZXJyIHRvIGlvc19iYXNlOjplb2ZiaXQgaWYgdGhlIHN0cmVhbSBpcyBlbXB0aWVkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9faW4gIFN0YXJ0IG9mIGlucHV0IHN0cmVhbS4KKyAgICAgICAqICBAcGFyYW0gIF9fZW5kICBFbmQgb2YgaW5wdXQgc3RyZWFtLgorICAgICAgICogIEBwYXJhbSAgX19pbyAgU291cmNlIG9mIGxvY2FsZSBhbmQgZmxhZ3MuCisgICAgICAgKiAgQHBhcmFtICBfX2VyciAgRXJyb3IgZmxhZ3MgdG8gc2V0LgorICAgICAgICogIEBwYXJhbSAgX192ICBWYWx1ZSB0byBmb3JtYXQgYW5kIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBhZnRlciByZWFkaW5nLgorICAgICAgKi8KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgZ2V0KGl0ZXJfdHlwZSBfX2luLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nJiBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19nZXQoX19pbiwgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisKKyAgICAgIGl0ZXJfdHlwZQorICAgICAgZ2V0KGl0ZXJfdHlwZSBfX2luLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNpZ25lZCBzaG9ydCYgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZ2V0KF9faW4sIF9fZW5kLCBfX2lvLCBfX2VyciwgX192KTsgfQorCisgICAgICBpdGVyX3R5cGUKKyAgICAgIGdldChpdGVyX3R5cGUgX19pbiwgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgaW50JiBfX3YpICAgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldChfX2luLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdik7IH0KKworICAgICAgaXRlcl90eXBlCisgICAgICBnZXQoaXRlcl90eXBlIF9faW4sIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHVuc2lnbmVkIGxvbmcmIF9fdikgIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19nZXQoX19pbiwgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfTE9OR19MT05HCisgICAgICBpdGVyX3R5cGUKKyAgICAgIGdldChpdGVyX3R5cGUgX19pbiwgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgbG9uZyBsb25nJiBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19nZXQoX19pbiwgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisKKyAgICAgIGl0ZXJfdHlwZQorICAgICAgZ2V0KGl0ZXJfdHlwZSBfX2luLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNpZ25lZCBsb25nIGxvbmcmIF9fdikgIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19nZXQoX19pbiwgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisjZW5kaWYKKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOdW1lcmljIHBhcnNpbmcuCisgICAgICAgKgorICAgICAgICogIFBhcnNlcyB0aGUgaW5wdXQgc3RyZWFtIGludG8gdGhlIGludGVncmFsIHZhcmlhYmxlIEBhIHYuICBJdCBkb2VzIHNvCisgICAgICAgKiAgYnkgY2FsbGluZyBudW1fZ2V0Ojpkb19nZXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGlucHV0IGNoYXJhY3RlcnMgYXJlIHBhcnNlZCBsaWtlIHRoZSBzY2FuZiAlZyBzcGVjaWZpZXIuICBUaGUKKyAgICAgICAqICBtYXRjaGluZyB0eXBlIGxlbmd0aCBtb2RpZmllciBpcyBhbHNvIHVzZWQuCisgICAgICAgKgorICAgICAgICogIFRoZSBkZWNpbWFsIHBvaW50IGNoYXJhY3RlciB1c2VkIGlzIG51bXB1bmN0OjpkZWNpbWFsX3BvaW50KCkuCisgICAgICAgKiAgRGlnaXQgZ3JvdXBpbmcgaXMgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvCisgICAgICAgKiAgbnVtcHVuY3Q6Omdyb3VwaW5nKCkgYW5kIG51bXB1bmN0Ojp0aG91c2FuZHNfc2VwKCkuICBJZiB0aGUKKyAgICAgICAqICBwYXR0ZXJuIG9mIGRpZ2l0IGdyb3VwcyBpc24ndCBjb25zaXN0ZW50LCBzZXRzIGVyciB0bworICAgICAgICogIGlvc19iYXNlOjpmYWlsYml0LgorICAgICAgICoKKyAgICAgICAqICBJZiBwYXJzaW5nIHRoZSBzdHJpbmcgeWllbGRzIGEgdmFsaWQgdmFsdWUgZm9yIEBhIHYsIEBhIHYgaXMgc2V0LgorICAgICAgICogIE90aGVyd2lzZSwgc2V0cyBlcnIgdG8gaW9zX2Jhc2U6OmZhaWxiaXQgYW5kIGxlYXZlcyBAYSB2IHVuYWx0ZXJlZC4KKyAgICAgICAqICBTZXRzIGVyciB0byBpb3NfYmFzZTo6ZW9mYml0IGlmIHRoZSBzdHJlYW0gaXMgZW1wdGllZC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX2luICBTdGFydCBvZiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiAgQHBhcmFtICBfX2VuZCAgRW5kIG9mIGlucHV0IHN0cmVhbS4KKyAgICAgICAqICBAcGFyYW0gIF9faW8gIFNvdXJjZSBvZiBsb2NhbGUgYW5kIGZsYWdzLgorICAgICAgICogIEBwYXJhbSAgX19lcnIgIEVycm9yIGZsYWdzIHRvIHNldC4KKyAgICAgICAqICBAcGFyYW0gIF9fdiAgVmFsdWUgdG8gZm9ybWF0IGFuZCBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgYWZ0ZXIgcmVhZGluZy4KKyAgICAgICovCisgICAgICBpdGVyX3R5cGUKKyAgICAgIGdldChpdGVyX3R5cGUgX19pbiwgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgZmxvYXQmIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldChfX2luLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdik7IH0KKworICAgICAgaXRlcl90eXBlCisgICAgICBnZXQoaXRlcl90eXBlIF9faW4sIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGRvdWJsZSYgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZ2V0KF9faW4sIF9fZW5kLCBfX2lvLCBfX2VyciwgX192KTsgfQorCisgICAgICBpdGVyX3R5cGUKKyAgICAgIGdldChpdGVyX3R5cGUgX19pbiwgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgbG9uZyBkb3VibGUmIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldChfX2luLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdik7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOdW1lcmljIHBhcnNpbmcuCisgICAgICAgKgorICAgICAgICogIFBhcnNlcyB0aGUgaW5wdXQgc3RyZWFtIGludG8gdGhlIHBvaW50ZXIgdmFyaWFibGUgQGEgdi4gIEl0IGRvZXMgc28KKyAgICAgICAqICBieSBjYWxsaW5nIG51bV9nZXQ6OmRvX2dldCgpLgorICAgICAgICoKKyAgICAgICAqICBUaGUgaW5wdXQgY2hhcmFjdGVycyBhcmUgcGFyc2VkIGxpa2UgdGhlIHNjYW5mICVwIHNwZWNpZmllci4KKyAgICAgICAqCisgICAgICAgKiAgRGlnaXQgZ3JvdXBpbmcgaXMgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvCisgICAgICAgKiAgbnVtcHVuY3Q6Omdyb3VwaW5nKCkgYW5kIG51bXB1bmN0Ojp0aG91c2FuZHNfc2VwKCkuICBJZiB0aGUKKyAgICAgICAqICBwYXR0ZXJuIG9mIGRpZ2l0IGdyb3VwcyBpc24ndCBjb25zaXN0ZW50LCBzZXRzIGVyciB0bworICAgICAgICogIGlvc19iYXNlOjpmYWlsYml0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGRpZ2l0IGdyb3VwaW5nIGVmZmVjdCBmb3IgcG9pbnRlcnMgaXMgYSBiaXQgYW1iaWd1b3VzCisgICAgICAgKiAgaW4gdGhlIHN0YW5kYXJkIGFuZCBzaG91bGRuJ3QgYmUgcmVsaWVkIG9uLiAgU2VlIERSIDM0NC4KKyAgICAgICAqCisgICAgICAgKiAgSWYgcGFyc2luZyB0aGUgc3RyaW5nIHlpZWxkcyBhIHZhbGlkIHZhbHVlIGZvciBAYSB2LCBAYSB2IGlzIHNldC4KKyAgICAgICAqICBPdGhlcndpc2UsIHNldHMgZXJyIHRvIGlvc19iYXNlOjpmYWlsYml0IGFuZCBsZWF2ZXMgQGEgdiB1bmFsdGVyZWQuCisgICAgICAgKiAgU2V0cyBlcnIgdG8gaW9zX2Jhc2U6OmVvZmJpdCBpZiB0aGUgc3RyZWFtIGlzIGVtcHRpZWQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19pbiAgU3RhcnQgb2YgaW5wdXQgc3RyZWFtLgorICAgICAgICogIEBwYXJhbSAgX19lbmQgIEVuZCBvZiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgbG9jYWxlIGFuZCBmbGFncy4KKyAgICAgICAqICBAcGFyYW0gIF9fZXJyICBFcnJvciBmbGFncyB0byBzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3YgIFZhbHVlIHRvIGZvcm1hdCBhbmQgaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIGFmdGVyIHJlYWRpbmcuCisgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBnZXQoaXRlcl90eXBlIF9faW4sIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHZvaWQqJiBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19nZXQoX19pbiwgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLy8gRGVzdHJ1Y3Rvci4KKyAgICAgIHZpcnR1YWwgfm51bV9nZXQoKSB7IH0KKworICAgICAgaXRlcl90eXBlCisgICAgICBfTV9leHRyYWN0X2Zsb2F0KGl0ZXJfdHlwZSwgaXRlcl90eXBlLCBpb3NfYmFzZSYsIGlvc19iYXNlOjppb3N0YXRlJiwKKwkJICAgICAgIHN0cmluZyYpIGNvbnN0OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWVUPgorCWl0ZXJfdHlwZQorCV9NX2V4dHJhY3RfaW50KGl0ZXJfdHlwZSwgaXRlcl90eXBlLCBpb3NfYmFzZSYsIGlvc19iYXNlOjppb3N0YXRlJiwKKwkJICAgICAgIF9WYWx1ZVQmKSBjb25zdDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUMj4KKyAgICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19jaGFyPF9DaGFyVDI+OjpfX3ZhbHVlLCBpbnQ+OjpfX3R5cGUKKwlfTV9maW5kKGNvbnN0IF9DaGFyVDIqLCBzaXplX3QgX19sZW4sIF9DaGFyVDIgX19jKSBjb25zdAorCXsKKwkgIGludCBfX3JldCA9IC0xOworCSAgaWYgKF9fbGVuIDw9IDEwKQorCSAgICB7CisJICAgICAgaWYgKF9fYyA+PSBfQ2hhclQyKCcwJykgJiYgX19jIDwgX0NoYXJUMihfQ2hhclQyKCcwJykgKyBfX2xlbikpCisJCV9fcmV0ID0gX19jIC0gX0NoYXJUMignMCcpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoX19jID49IF9DaGFyVDIoJzAnKSAmJiBfX2MgPD0gX0NoYXJUMignOScpKQorCQlfX3JldCA9IF9fYyAtIF9DaGFyVDIoJzAnKTsKKwkgICAgICBlbHNlIGlmIChfX2MgPj0gX0NoYXJUMignYScpICYmIF9fYyA8PSBfQ2hhclQyKCdmJykpCisJCV9fcmV0ID0gMTAgKyAoX19jIC0gX0NoYXJUMignYScpKTsKKwkgICAgICBlbHNlIGlmIChfX2MgPj0gX0NoYXJUMignQScpICYmIF9fYyA8PSBfQ2hhclQyKCdGJykpCisJCV9fcmV0ID0gMTAgKyAoX19jIC0gX0NoYXJUMignQScpKTsKKwkgICAgfQorCSAgcmV0dXJuIF9fcmV0OworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUMj4KKyAgICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8IV9faXNfY2hhcjxfQ2hhclQyPjo6X192YWx1ZSwKKwkJCQkgICAgICBpbnQ+OjpfX3R5cGUKKwlfTV9maW5kKGNvbnN0IF9DaGFyVDIqIF9femVybywgc2l6ZV90IF9fbGVuLCBfQ2hhclQyIF9fYykgY29uc3QKKwl7CisJICBpbnQgX19yZXQgPSAtMTsKKwkgIGNvbnN0IGNoYXJfdHlwZSogX19xID0gY2hhcl90cmFpdHM8X0NoYXJUMj46OmZpbmQoX196ZXJvLCBfX2xlbiwgX19jKTsKKwkgIGlmIChfX3EpCisJICAgIHsKKwkgICAgICBfX3JldCA9IF9fcSAtIF9femVybzsKKwkgICAgICBpZiAoX19yZXQgPiAxNSkKKwkJX19yZXQgLT0gNjsKKwkgICAgfQorCSAgcmV0dXJuIF9fcmV0OworCX0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOdW1lcmljIHBhcnNpbmcuCisgICAgICAgKgorICAgICAgICogIFBhcnNlcyB0aGUgaW5wdXQgc3RyZWFtIGludG8gdGhlIHZhcmlhYmxlIEBhIHYuICBUaGlzIGZ1bmN0aW9uIGlzIGEKKyAgICAgICAqICBob29rIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZC4gIEBzZWUgZ2V0KCkKKyAgICAgICAqICBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fYmVnICBTdGFydCBvZiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiAgQHBhcmFtICBfX2VuZCAgRW5kIG9mIGlucHV0IHN0cmVhbS4KKyAgICAgICAqICBAcGFyYW0gIF9faW8gIFNvdXJjZSBvZiBsb2NhbGUgYW5kIGZsYWdzLgorICAgICAgICogIEBwYXJhbSAgX19lcnIgIEVycm9yIGZsYWdzIHRvIHNldC4KKyAgICAgICAqICBAcGFyYW0gIF9fdiAgVmFsdWUgdG8gZm9ybWF0IGFuZCBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgYWZ0ZXIgcmVhZGluZy4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0KGl0ZXJfdHlwZSwgaXRlcl90eXBlLCBpb3NfYmFzZSYsIGlvc19iYXNlOjppb3N0YXRlJiwgYm9vbCYpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgbG9uZyYgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZXh0cmFjdF9pbnQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX192KTsgfQorCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgc2hvcnQmIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2V4dHJhY3RfaW50KF9fYmVnLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdik7IH0KKworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX2dldChpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHVuc2lnbmVkIGludCYgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZXh0cmFjdF9pbnQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX192KTsgfQorCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgbG9uZyYgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZXh0cmFjdF9pbnQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX192KTsgfQorCisjaWZkZWYgX0dMSUJDWFhfVVNFX0xPTkdfTE9ORworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX2dldChpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGxvbmcgbG9uZyYgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZXh0cmFjdF9pbnQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX192KTsgfQorCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgbG9uZyBsb25nJiBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9leHRyYWN0X2ludChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisjZW5kaWYKKworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX2dldChpdGVyX3R5cGUsIGl0ZXJfdHlwZSwgaW9zX2Jhc2UmLCBpb3NfYmFzZTo6aW9zdGF0ZSYsIGZsb2F0JikgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXQoaXRlcl90eXBlLCBpdGVyX3R5cGUsIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmLAorCSAgICAgZG91YmxlJikgY29uc3Q7CisKKyAgICAgIC8vIFhYWCBHTElCQ1hYX0FCSSBEZXByZWNhdGVkCisjaWYgZGVmaW5lZCBfR0xJQkNYWF9MT05HX0RPVUJMRV9DT01QQVQgJiYgZGVmaW5lZCBfX0xPTkdfRE9VQkxFXzEyOF9fCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgX19kb19nZXQoaXRlcl90eXBlLCBpdGVyX3R5cGUsIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmLAorCSAgICAgICBkb3VibGUmKSBjb25zdDsKKyNlbHNlCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0KGl0ZXJfdHlwZSwgaXRlcl90eXBlLCBpb3NfYmFzZSYsIGlvc19iYXNlOjppb3N0YXRlJiwKKwkgICAgIGxvbmcgZG91YmxlJikgY29uc3Q7CisjZW5kaWYKKworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX2dldChpdGVyX3R5cGUsIGl0ZXJfdHlwZSwgaW9zX2Jhc2UmLCBpb3NfYmFzZTo6aW9zdGF0ZSYsIHZvaWQqJikgY29uc3Q7CisKKyAgICAgIC8vIFhYWCBHTElCQ1hYX0FCSSBEZXByZWNhdGVkCisjaWYgZGVmaW5lZCBfR0xJQkNYWF9MT05HX0RPVUJMRV9DT01QQVQgJiYgZGVmaW5lZCBfX0xPTkdfRE9VQkxFXzEyOF9fCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0KGl0ZXJfdHlwZSwgaXRlcl90eXBlLCBpb3NfYmFzZSYsIGlvc19iYXNlOjppb3N0YXRlJiwKKwkgICAgIGxvbmcgZG91YmxlJikgY29uc3Q7CisjZW5kaWYKKyAgICAgIC8vQH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBsb2NhbGU6OmlkIG51bV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6aWQ7CisKKworICAvKioKKyAgICogIEBicmllZiAgUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZSBudW1fcHV0LgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKgorICAgKiAgVGhpcyBmYWNldCBlbmNhcHN1bGF0ZXMgdGhlIGNvZGUgdG8gY29udmVydCBhIG51bWJlciB0byBhIHN0cmluZy4gIEl0IGlzCisgICAqICB1c2VkIGJ5IHRoZSBvc3RyZWFtIG51bWVyaWMgaW5zZXJ0aW9uIG9wZXJhdG9ycy4KKyAgICoKKyAgICogIFRoZSBudW1fcHV0IHRlbXBsYXRlIHVzZXMgcHJvdGVjdGVkIHZpcnR1YWwgZnVuY3Rpb25zIHRvIHByb3ZpZGUgdGhlCisgICAqICBhY3R1YWwgcmVzdWx0cy4gIFRoZSBwdWJsaWMgYWNjZXNzb3JzIGZvcndhcmQgdGhlIGNhbGwgdG8gdGhlIHZpcnR1YWwKKyAgICogIGZ1bmN0aW9ucy4gIFRoZXNlIHZpcnR1YWwgZnVuY3Rpb25zIGFyZSBob29rcyBmb3IgZGV2ZWxvcGVycyB0bworICAgKiAgaW1wbGVtZW50IHRoZSBiZWhhdmlvciB0aGV5IHJlcXVpcmUgZnJvbSB0aGUgbnVtX3B1dCBmYWNldC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICBjbGFzcyBudW1fcHV0IDogcHVibGljIGxvY2FsZTo6ZmFjZXQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICAvL0B7CisgICAgICAvLy8gUHVibGljIHR5cGVkZWZzCisgICAgICB0eXBlZGVmIF9DaGFyVAkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfT3V0SXRlcgkJaXRlcl90eXBlOworICAgICAgLy9AfQorCisgICAgICAvLy8gTnVtcHVuY3QgZmFjZXQgaWQuCisgICAgICBzdGF0aWMgbG9jYWxlOjppZAkJaWQ7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0b3IgcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIHByb3ZpZGVkIGJ5IHRoZSBzdGFuZGFyZC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fcmVmcyAgUGFzc2VkIHRvIHRoZSBiYXNlIGZhY2V0IGNsYXNzLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBudW1fcHV0KHNpemVfdCBfX3JlZnMgPSAwKSA6IGZhY2V0KF9fcmVmcykgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTnVtZXJpYyBmb3JtYXR0aW5nLgorICAgICAgICoKKyAgICAgICAqICBGb3JtYXRzIHRoZSBib29sZWFuIEBhIHYgYW5kIGluc2VydHMgaXQgaW50byBhIHN0cmVhbS4gIEl0IGRvZXMgc28KKyAgICAgICAqICBieSBjYWxsaW5nIG51bV9wdXQ6OmRvX3B1dCgpLgorICAgICAgICoKKyAgICAgICAqICBJZiBpb3NfYmFzZTo6Ym9vbGFscGhhIGlzIHNldCwgd3JpdGVzIGN0eXBlPENoYXJUPjo6dHJ1ZW5hbWUoKSBvcgorICAgICAgICogIGN0eXBlPENoYXJUPjo6ZmFsc2VuYW1lKCkuICBPdGhlcndpc2UgZm9ybWF0cyBAYSB2IGFzIGFuIGludC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFN0cmVhbSB0byB3cml0ZSB0by4KKyAgICAgICAqICBAcGFyYW0gIF9faW8gIFNvdXJjZSBvZiBsb2NhbGUgYW5kIGZsYWdzLgorICAgICAgICogIEBwYXJhbSAgX19maWxsICBDaGFyX3R5cGUgdG8gdXNlIGZvciBmaWxsaW5nLgorICAgICAgICogIEBwYXJhbSAgX192ICBWYWx1ZSB0byBmb3JtYXQgYW5kIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBhZnRlciB3cml0aW5nLgorICAgICAgKi8KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLCBib29sIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3B1dChfX3MsIF9faW8sIF9fZmlsbCwgX192KTsgfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE51bWVyaWMgZm9ybWF0dGluZy4KKyAgICAgICAqCisgICAgICAgKiAgRm9ybWF0cyB0aGUgaW50ZWdyYWwgdmFsdWUgQGEgdiBhbmQgaW5zZXJ0cyBpdCBpbnRvIGEKKyAgICAgICAqICBzdHJlYW0uICBJdCBkb2VzIHNvIGJ5IGNhbGxpbmcgbnVtX3B1dDo6ZG9fcHV0KCkuCisgICAgICAgKgorICAgICAgICogIEZvcm1hdHRpbmcgaXMgYWZmZWN0ZWQgYnkgdGhlIGZsYWcgc2V0dGluZ3MgaW4gQGEgaW8uCisgICAgICAgKgorICAgICAgICogIFRoZSBiYXNpYyBmb3JtYXQgaXMgYWZmZWN0ZWQgYnkgdGhlIHZhbHVlIG9mIGlvLmZsYWdzKCkgJgorICAgICAgICogIGlvc19iYXNlOjpiYXNlZmllbGQuICBJZiBlcXVhbCB0byBpb3NfYmFzZTo6b2N0LCBmb3JtYXRzIGxpa2UgdGhlCisgICAgICAgKiAgcHJpbnRmICVvIHNwZWNpZmllci4gIEVsc2UgaWYgZXF1YWwgdG8gaW9zX2Jhc2U6OmhleCwgZm9ybWF0cyBsaWtlCisgICAgICAgKiAgJXggb3IgJVggd2l0aCBpb3NfYmFzZTo6dXBwZXJjYXNlIHVuc2V0IG9yIHNldCByZXNwZWN0aXZlbHkuCisgICAgICAgKiAgT3RoZXJ3aXNlLCBmb3JtYXRzIGxpa2UgJWQsICVsZCwgJWxsZCBmb3Igc2lnbmVkIGFuZCAldSwgJWx1LCAlbGx1CisgICAgICAgKiAgZm9yIHVuc2lnbmVkIHZhbHVlcy4gIE5vdGUgdGhhdCBpZiBib3RoIG9jdCBhbmQgaGV4IGFyZSBzZXQsIG5laXRoZXIKKyAgICAgICAqICB3aWxsIHRha2UgZWZmZWN0LgorICAgICAgICoKKyAgICAgICAqICBJZiBpb3NfYmFzZTo6c2hvd3BvcyBpcyBzZXQsICcrJyBpcyBvdXRwdXQgYmVmb3JlIHBvc2l0aXZlIHZhbHVlcy4KKyAgICAgICAqICBJZiBpb3NfYmFzZTo6c2hvd2Jhc2UgaXMgc2V0LCAnMCcgcHJlY2VkZXMgb2N0YWwgdmFsdWVzIChleGNlcHQgMCkKKyAgICAgICAqICBhbmQgJzBbeFhdJyBwcmVjZWRlcyBoZXggdmFsdWVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgZGVjaW1hbCBwb2ludCBjaGFyYWN0ZXIgdXNlZCBpcyBudW1wdW5jdDo6ZGVjaW1hbF9wb2ludCgpLgorICAgICAgICogIFRob3VzYW5kcyBzZXBhcmF0b3JzIGFyZSBpbnNlcnRlZCBhY2NvcmRpbmcgdG8KKyAgICAgICAqICBudW1wdW5jdDo6Z3JvdXBpbmcoKSBhbmQgbnVtcHVuY3Q6OnRob3VzYW5kc19zZXAoKS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgaW8ud2lkdGgoKSBpcyBub24temVybywgZW5vdWdoIEBhIGZpbGwgY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQgdG8KKyAgICAgICAqICBtYWtlIHRoZSByZXN1bHQgYXQgbGVhc3QgdGhhdCB3aWRlLiAgSWYKKyAgICAgICAqICAoaW8uZmxhZ3MoKSAmIGlvc19iYXNlOjphZGp1c3RmaWVsZCkgPT0gaW9zX2Jhc2U6OmxlZnQsIHJlc3VsdCBpcworICAgICAgICogIHBhZGRlZCBhdCB0aGUgZW5kLiAgSWYgaW9zX2Jhc2U6OmludGVybmFsLCB0aGVuIHBhZGRpbmcgb2NjdXJzCisgICAgICAgKiAgaW1tZWRpYXRlbHkgYWZ0ZXIgZWl0aGVyIGEgJysnIG9yICctJyBvciBhZnRlciAnMHgnIG9yICcwWCcuCisgICAgICAgKiAgT3RoZXJ3aXNlLCBwYWRkaW5nIG9jY3VycyBhdCB0aGUgYmVnaW5uaW5nLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fcyAgU3RyZWFtIHRvIHdyaXRlIHRvLgorICAgICAgICogIEBwYXJhbSAgX19pbyAgU291cmNlIG9mIGxvY2FsZSBhbmQgZmxhZ3MuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpbGwgIENoYXJfdHlwZSB0byB1c2UgZm9yIGZpbGxpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3YgIFZhbHVlIHRvIGZvcm1hdCBhbmQgaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIGFmdGVyIHdyaXRpbmcuCisgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsIGxvbmcgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fcHV0KF9fcywgX19pbywgX19maWxsLCBfX3YpOyB9CisKKyAgICAgIGl0ZXJfdHlwZQorICAgICAgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLAorCSAgdW5zaWduZWQgbG9uZyBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19wdXQoX19zLCBfX2lvLCBfX2ZpbGwsIF9fdik7IH0KKworI2lmZGVmIF9HTElCQ1hYX1VTRV9MT05HX0xPTkcKKyAgICAgIGl0ZXJfdHlwZQorICAgICAgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLCBsb25nIGxvbmcgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fcHV0KF9fcywgX19pbywgX19maWxsLCBfX3YpOyB9CisKKyAgICAgIGl0ZXJfdHlwZQorICAgICAgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLAorCSAgdW5zaWduZWQgbG9uZyBsb25nIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3B1dChfX3MsIF9faW8sIF9fZmlsbCwgX192KTsgfQorI2VuZGlmCisgICAgICAvL0B9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTnVtZXJpYyBmb3JtYXR0aW5nLgorICAgICAgICoKKyAgICAgICAqICBGb3JtYXRzIHRoZSBmbG9hdGluZyBwb2ludCB2YWx1ZSBAYSB2IGFuZCBpbnNlcnRzIGl0IGludG8gYSBzdHJlYW0uCisgICAgICAgKiAgSXQgZG9lcyBzbyBieSBjYWxsaW5nIG51bV9wdXQ6OmRvX3B1dCgpLgorICAgICAgICoKKyAgICAgICAqICBGb3JtYXR0aW5nIGlzIGFmZmVjdGVkIGJ5IHRoZSBmbGFnIHNldHRpbmdzIGluIEBhIGlvLgorICAgICAgICoKKyAgICAgICAqICBUaGUgYmFzaWMgZm9ybWF0IGlzIGFmZmVjdGVkIGJ5IHRoZSB2YWx1ZSBvZiBpby5mbGFncygpICYKKyAgICAgICAqICBpb3NfYmFzZTo6ZmxvYXRmaWVsZC4gIElmIGVxdWFsIHRvIGlvc19iYXNlOjpmaXhlZCwgZm9ybWF0cyBsaWtlIHRoZQorICAgICAgICogIHByaW50ZiAlZiBzcGVjaWZpZXIuICBFbHNlIGlmIGVxdWFsIHRvIGlvc19iYXNlOjpzY2llbnRpZmljLCBmb3JtYXRzCisgICAgICAgKiAgbGlrZSAlZSBvciAlRSB3aXRoIGlvc19iYXNlOjp1cHBlcmNhc2UgdW5zZXQgb3Igc2V0IHJlc3BlY3RpdmVseS4KKyAgICAgICAqICBPdGhlcndpc2UsIGZvcm1hdHMgbGlrZSAlZyBvciAlRyBkZXBlbmRpbmcgb24gdXBwZXJjYXNlLiAgTm90ZSB0aGF0CisgICAgICAgKiAgaWYgYm90aCBmaXhlZCBhbmQgc2NpZW50aWZpYyBhcmUgc2V0LCB0aGUgZWZmZWN0IHdpbGwgYWxzbyBiZSBsaWtlCisgICAgICAgKiAgJWcgb3IgJUcuCisgICAgICAgKgorICAgICAgICogIFRoZSBvdXRwdXQgcHJlY2lzaW9uIGlzIGdpdmVuIGJ5IGlvLnByZWNpc2lvbigpLiAgVGhpcyBwcmVjaXNpb24gaXMKKyAgICAgICAqICBjYXBwZWQgYXQgbnVtZXJpY19saW1pdHM6OmRpZ2l0czEwICsgMiAoZGlmZmVyZW50IGZvciBkb3VibGUgYW5kCisgICAgICAgKiAgbG9uZyBkb3VibGUpLiAgVGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlzIDYuCisgICAgICAgKgorICAgICAgICogIElmIGlvc19iYXNlOjpzaG93cG9zIGlzIHNldCwgJysnIGlzIG91dHB1dCBiZWZvcmUgcG9zaXRpdmUgdmFsdWVzLgorICAgICAgICogIElmIGlvc19iYXNlOjpzaG93cG9pbnQgaXMgc2V0LCBhIGRlY2ltYWwgcG9pbnQgd2lsbCBhbHdheXMgYmUKKyAgICAgICAqICBvdXRwdXQuCisgICAgICAgKgorICAgICAgICogIFRoZSBkZWNpbWFsIHBvaW50IGNoYXJhY3RlciB1c2VkIGlzIG51bXB1bmN0OjpkZWNpbWFsX3BvaW50KCkuCisgICAgICAgKiAgVGhvdXNhbmRzIHNlcGFyYXRvcnMgYXJlIGluc2VydGVkIGFjY29yZGluZyB0bworICAgICAgICogIG51bXB1bmN0Ojpncm91cGluZygpIGFuZCBudW1wdW5jdDo6dGhvdXNhbmRzX3NlcCgpLgorICAgICAgICoKKyAgICAgICAqICBJZiBpby53aWR0aCgpIGlzIG5vbi16ZXJvLCBlbm91Z2ggQGEgZmlsbCBjaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZCB0bworICAgICAgICogIG1ha2UgdGhlIHJlc3VsdCBhdCBsZWFzdCB0aGF0IHdpZGUuICBJZgorICAgICAgICogIChpby5mbGFncygpICYgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKSA9PSBpb3NfYmFzZTo6bGVmdCwgcmVzdWx0IGlzCisgICAgICAgKiAgcGFkZGVkIGF0IHRoZSBlbmQuICBJZiBpb3NfYmFzZTo6aW50ZXJuYWwsIHRoZW4gcGFkZGluZyBvY2N1cnMKKyAgICAgICAqICBpbW1lZGlhdGVseSBhZnRlciBlaXRoZXIgYSAnKycgb3IgJy0nIG9yIGFmdGVyICcweCcgb3IgJzBYJy4KKyAgICAgICAqICBPdGhlcndpc2UsIHBhZGRpbmcgb2NjdXJzIGF0IHRoZSBiZWdpbm5pbmcuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19zICBTdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgbG9jYWxlIGFuZCBmbGFncy4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlsbCAgQ2hhcl90eXBlIHRvIHVzZSBmb3IgZmlsbGluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fdiAgVmFsdWUgdG8gZm9ybWF0IGFuZCBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgYWZ0ZXIgd3JpdGluZy4KKyAgICAgICovCisgICAgICBpdGVyX3R5cGUKKyAgICAgIHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwgZG91YmxlIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3B1dChfX3MsIF9faW8sIF9fZmlsbCwgX192KTsgfQorCisgICAgICBpdGVyX3R5cGUKKyAgICAgIHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwKKwkgIGxvbmcgZG91YmxlIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3B1dChfX3MsIF9faW8sIF9fZmlsbCwgX192KTsgfQorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE51bWVyaWMgZm9ybWF0dGluZy4KKyAgICAgICAqCisgICAgICAgKiAgRm9ybWF0cyB0aGUgcG9pbnRlciB2YWx1ZSBAYSB2IGFuZCBpbnNlcnRzIGl0IGludG8gYSBzdHJlYW0uICBJdAorICAgICAgICogIGRvZXMgc28gYnkgY2FsbGluZyBudW1fcHV0Ojpkb19wdXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmb3JtYXRzIEBhIHYgYXMgYW4gdW5zaWduZWQgbG9uZyB3aXRoIGlvc19iYXNlOjpoZXgKKyAgICAgICAqICBhbmQgaW9zX2Jhc2U6OnNob3diYXNlIHNldC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFN0cmVhbSB0byB3cml0ZSB0by4KKyAgICAgICAqICBAcGFyYW0gIF9faW8gIFNvdXJjZSBvZiBsb2NhbGUgYW5kIGZsYWdzLgorICAgICAgICogIEBwYXJhbSAgX19maWxsICBDaGFyX3R5cGUgdG8gdXNlIGZvciBmaWxsaW5nLgorICAgICAgICogIEBwYXJhbSAgX192ICBWYWx1ZSB0byBmb3JtYXQgYW5kIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBhZnRlciB3cml0aW5nLgorICAgICAgKi8KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLAorCSAgY29uc3Qgdm9pZCogX192KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fcHV0KF9fcywgX19pbywgX19maWxsLCBfX3YpOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWVUPgorCWl0ZXJfdHlwZQorCV9NX2luc2VydF9mbG9hdChpdGVyX3R5cGUsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLAorCQkJY2hhciBfX21vZCwgX1ZhbHVlVCBfX3YpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBfTV9ncm91cF9mbG9hdChjb25zdCBjaGFyKiBfX2dyb3VwaW5nLCBzaXplX3QgX19ncm91cGluZ19zaXplLAorCQkgICAgIGNoYXJfdHlwZSBfX3NlcCwgY29uc3QgY2hhcl90eXBlKiBfX3AsIGNoYXJfdHlwZSogX19uZXcsCisJCSAgICAgY2hhcl90eXBlKiBfX2NzLCBpbnQmIF9fbGVuKSBjb25zdDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlVD4KKwlpdGVyX3R5cGUKKwlfTV9pbnNlcnRfaW50KGl0ZXJfdHlwZSwgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCisJCSAgICAgIF9WYWx1ZVQgX192KSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgX01fZ3JvdXBfaW50KGNvbnN0IGNoYXIqIF9fZ3JvdXBpbmcsIHNpemVfdCBfX2dyb3VwaW5nX3NpemUsCisJCSAgIGNoYXJfdHlwZSBfX3NlcCwgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSogX19uZXcsCisJCSAgIGNoYXJfdHlwZSogX19jcywgaW50JiBfX2xlbikgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3BhZChjaGFyX3R5cGUgX19maWxsLCBzdHJlYW1zaXplIF9fdywgaW9zX2Jhc2UmIF9faW8sCisJICAgICBjaGFyX3R5cGUqIF9fbmV3LCBjb25zdCBjaGFyX3R5cGUqIF9fY3MsIGludCYgX19sZW4pIGNvbnN0OworCisgICAgICAvLy8gRGVzdHJ1Y3Rvci4KKyAgICAgIHZpcnR1YWwKKyAgICAgIH5udW1fcHV0KCkgeyB9OworCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE51bWVyaWMgZm9ybWF0dGluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlc2UgZnVuY3Rpb25zIGRvIHRoZSB3b3JrIG9mIGZvcm1hdHRpbmcgbnVtZXJpYyB2YWx1ZXMgYW5kCisgICAgICAgKiAgaW5zZXJ0aW5nIHRoZW0gaW50byBhIHN0cmVhbS4gVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQKKyAgICAgICAqICBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19zICBTdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgbG9jYWxlIGFuZCBmbGFncy4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlsbCAgQ2hhcl90eXBlIHRvIHVzZSBmb3IgZmlsbGluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fdiAgVmFsdWUgdG8gZm9ybWF0IGFuZCBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgYWZ0ZXIgd3JpdGluZy4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLCBib29sIF9fdikgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsIGxvbmcgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faW5zZXJ0X2ludChfX3MsIF9faW8sIF9fZmlsbCwgX192KTsgfQorCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLAorCSAgICAgdW5zaWduZWQgbG9uZyBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9pbnNlcnRfaW50KF9fcywgX19pbywgX19maWxsLCBfX3YpOyB9CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfTE9OR19MT05HCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLAorCSAgICAgbG9uZyBsb25nIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2luc2VydF9pbnQoX19zLCBfX2lvLCBfX2ZpbGwsIF9fdik7IH0KKworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX3B1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwKKwkgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9pbnNlcnRfaW50KF9fcywgX19pbywgX19maWxsLCBfX3YpOyB9CisjZW5kaWYKKworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX3B1dChpdGVyX3R5cGUsIGlvc19iYXNlJiwgY2hhcl90eXBlLCBkb3VibGUpIGNvbnN0OworCisgICAgICAvLyBYWFggR0xJQkNYWF9BQkkgRGVwcmVjYXRlZAorI2lmIGRlZmluZWQgX0dMSUJDWFhfTE9OR19ET1VCTEVfQ09NUEFUICYmIGRlZmluZWQgX19MT05HX0RPVUJMRV8xMjhfXworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIF9fZG9fcHV0KGl0ZXJfdHlwZSwgaW9zX2Jhc2UmLCBjaGFyX3R5cGUsIGRvdWJsZSkgY29uc3Q7CisjZWxzZQorICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX3B1dChpdGVyX3R5cGUsIGlvc19iYXNlJiwgY2hhcl90eXBlLCBsb25nIGRvdWJsZSkgY29uc3Q7CisjZW5kaWYKKworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX3B1dChpdGVyX3R5cGUsIGlvc19iYXNlJiwgY2hhcl90eXBlLCBjb25zdCB2b2lkKikgY29uc3Q7CisKKyAgICAgIC8vIFhYWCBHTElCQ1hYX0FCSSBEZXByZWNhdGVkCisjaWYgZGVmaW5lZCBfR0xJQkNYWF9MT05HX0RPVUJMRV9DT01QQVQgJiYgZGVmaW5lZCBfX0xPTkdfRE9VQkxFXzEyOF9fCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fcHV0KGl0ZXJfdHlwZSwgaW9zX2Jhc2UmLCBjaGFyX3R5cGUsIGxvbmcgZG91YmxlKSBjb25zdDsKKyNlbmRpZgorICAgICAgLy9AfQorICAgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgbG9jYWxlOjppZCBudW1fcHV0PF9DaGFyVCwgX091dEl0ZXI+OjppZDsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9MREJMCisKKyAgLy8gU3ViY2xhdXNlIGNvbnZlbmllbmNlIGludGVyZmFjZXMsIGlubGluZXMuCisgIC8vIE5COiBUaGVzZSBhcmUgaW5saW5lIGJlY2F1c2UsIHdoZW4gdXNlZCBpbiBhIGxvb3AsIHNvbWUgY29tcGlsZXJzCisgIC8vIGNhbiBob2lzdCB0aGUgYm9keSBvdXQgb2YgdGhlIGxvb3A7IHRoZW4gaXQncyBqdXN0IGFzIGZhc3QgYXMgdGhlCisgIC8vIEMgaXMqKCkgZnVuY3Rpb24uCisKKyAgLy8vIENvbnZlbmllbmNlIGludGVyZmFjZSB0byBjdHlwZS5pcyhjdHlwZV9iYXNlOjpzcGFjZSwgX19jKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZSBib29sCisgICAgaXNzcGFjZShfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCBfX2MpOyB9CisKKyAgLy8vIENvbnZlbmllbmNlIGludGVyZmFjZSB0byBjdHlwZS5pcyhjdHlwZV9iYXNlOjpwcmludCwgX19jKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZSBib29sCisgICAgaXNwcmludChfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6OnByaW50LCBfX2MpOyB9CisKKyAgLy8vIENvbnZlbmllbmNlIGludGVyZmFjZSB0byBjdHlwZS5pcyhjdHlwZV9iYXNlOjpjbnRybCwgX19jKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZSBib29sCisgICAgaXNjbnRybChfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6OmNudHJsLCBfX2MpOyB9CisKKyAgLy8vIENvbnZlbmllbmNlIGludGVyZmFjZSB0byBjdHlwZS5pcyhjdHlwZV9iYXNlOjp1cHBlciwgX19jKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZSBib29sCisgICAgaXN1cHBlcihfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6OnVwcGVyLCBfX2MpOyB9CisKKyAgLy8vIENvbnZlbmllbmNlIGludGVyZmFjZSB0byBjdHlwZS5pcyhjdHlwZV9iYXNlOjpsb3dlciwgX19jKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZSBib29sCisgICAgaXNsb3dlcihfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6Omxvd2VyLCBfX2MpOyB9CisKKyAgLy8vIENvbnZlbmllbmNlIGludGVyZmFjZSB0byBjdHlwZS5pcyhjdHlwZV9iYXNlOjphbHBoYSwgX19jKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZSBib29sCisgICAgaXNhbHBoYShfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6OmFscGhhLCBfX2MpOyB9CisKKyAgLy8vIENvbnZlbmllbmNlIGludGVyZmFjZSB0byBjdHlwZS5pcyhjdHlwZV9iYXNlOjpkaWdpdCwgX19jKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZSBib29sCisgICAgaXNkaWdpdChfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6OmRpZ2l0LCBfX2MpOyB9CisKKyAgLy8vIENvbnZlbmllbmNlIGludGVyZmFjZSB0byBjdHlwZS5pcyhjdHlwZV9iYXNlOjpwdW5jdCwgX19jKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZSBib29sCisgICAgaXNwdW5jdChfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6OnB1bmN0LCBfX2MpOyB9CisKKyAgLy8vIENvbnZlbmllbmNlIGludGVyZmFjZSB0byBjdHlwZS5pcyhjdHlwZV9iYXNlOjp4ZGlnaXQsIF9fYykuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBpbmxpbmUgYm9vbAorICAgIGlzeGRpZ2l0KF9DaGFyVCBfX2MsIGNvbnN0IGxvY2FsZSYgX19sb2MpCisgICAgeyByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykuaXMoY3R5cGVfYmFzZTo6eGRpZ2l0LCBfX2MpOyB9CisKKyAgLy8vIENvbnZlbmllbmNlIGludGVyZmFjZSB0byBjdHlwZS5pcyhjdHlwZV9iYXNlOjphbG51bSwgX19jKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZSBib29sCisgICAgaXNhbG51bShfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6OmFsbnVtLCBfX2MpOyB9CisKKyAgLy8vIENvbnZlbmllbmNlIGludGVyZmFjZSB0byBjdHlwZS5pcyhjdHlwZV9iYXNlOjpncmFwaCwgX19jKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZSBib29sCisgICAgaXNncmFwaChfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6OmdyYXBoLCBfX2MpOyB9CisKKyAgLy8vIENvbnZlbmllbmNlIGludGVyZmFjZSB0byBjdHlwZS50b3VwcGVyKF9fYykuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBpbmxpbmUgX0NoYXJUCisgICAgdG91cHBlcihfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLnRvdXBwZXIoX19jKTsgfQorCisgIC8vLyBDb252ZW5pZW5jZSBpbnRlcmZhY2UgdG8gY3R5cGUudG9sb3dlcihfX2MpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgaW5saW5lIF9DaGFyVAorICAgIHRvbG93ZXIoX0NoYXJUIF9fYywgY29uc3QgbG9jYWxlJiBfX2xvYykKKyAgICB7IHJldHVybiB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKS50b2xvd2VyKF9fYyk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworIyBpbmNsdWRlIDxiaXRzL2xvY2FsZV9mYWNldHMudGNjPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9sb2NhbGVfZmFjZXRzLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9sb2NhbGVfZmFjZXRzLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWNiYTNjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2xvY2FsZV9mYWNldHMudGNjCkBAIC0wLDAgKzEsMTM2MCBAQAorLy8gTG9jYWxlIHN1cHBvcnQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvbG9jYWxlX2ZhY2V0cy50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtsb2NhbGV9CisgKi8KKworI2lmbmRlZiBfTE9DQUxFX0ZBQ0VUU19UQ0MKKyNkZWZpbmUgX0xPQ0FMRV9GQUNFVFNfVENDIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gUm91dGluZSB0byBhY2Nlc3MgYSBjYWNoZSBmb3IgdGhlIGZhY2V0LiAgSWYgdGhlIGNhY2hlIGRpZG4ndAorICAvLyBleGlzdCBiZWZvcmUsIGl0IGdldHMgY29uc3RydWN0ZWQgb24gdGhlIGZseS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgIHN0cnVjdCBfX3VzZV9jYWNoZQorICAgIHsKKyAgICAgIGNvbnN0IF9GYWNldCoKKyAgICAgIG9wZXJhdG9yKCkgKGNvbnN0IGxvY2FsZSYgX19sb2MpIGNvbnN0OworICAgIH07CisKKyAgLy8gU3BlY2lhbGl6YXRpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgc3RydWN0IF9fdXNlX2NhY2hlPF9fbnVtcHVuY3RfY2FjaGU8X0NoYXJUPiA+CisgICAgeworICAgICAgY29uc3QgX19udW1wdW5jdF9jYWNoZTxfQ2hhclQ+KgorICAgICAgb3BlcmF0b3IoKSAoY29uc3QgbG9jYWxlJiBfX2xvYykgY29uc3QKKyAgICAgIHsKKwljb25zdCBzaXplX3QgX19pID0gbnVtcHVuY3Q8X0NoYXJUPjo6aWQuX01faWQoKTsKKwljb25zdCBsb2NhbGU6OmZhY2V0KiogX19jYWNoZXMgPSBfX2xvYy5fTV9pbXBsLT5fTV9jYWNoZXM7CisJaWYgKCFfX2NhY2hlc1tfX2ldKQorCSAgeworCSAgICBfX251bXB1bmN0X2NhY2hlPF9DaGFyVD4qIF9fdG1wID0gMDsKKwkgICAgX190cnkKKwkgICAgICB7CisJCV9fdG1wID0gbmV3IF9fbnVtcHVuY3RfY2FjaGU8X0NoYXJUPjsKKwkJX190bXAtPl9NX2NhY2hlKF9fbG9jKTsKKwkgICAgICB9CisJICAgIF9fY2F0Y2goLi4uKQorCSAgICAgIHsKKwkJZGVsZXRlIF9fdG1wOworCQlfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgICB9CisJICAgIF9fbG9jLl9NX2ltcGwtPl9NX2luc3RhbGxfY2FjaGUoX190bXAsIF9faSk7CisJICB9CisJcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IF9fbnVtcHVuY3RfY2FjaGU8X0NoYXJUPio+KF9fY2FjaGVzW19faV0pOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIHZvaWQKKyAgICBfX251bXB1bmN0X2NhY2hlPF9DaGFyVD46Ol9NX2NhY2hlKGNvbnN0IGxvY2FsZSYgX19sb2MpCisgICAgeworICAgICAgX01fYWxsb2NhdGVkID0gdHJ1ZTsKKworICAgICAgY29uc3QgbnVtcHVuY3Q8X0NoYXJUPiYgX19ucCA9IHVzZV9mYWNldDxudW1wdW5jdDxfQ2hhclQ+ID4oX19sb2MpOworCisgICAgICBjaGFyKiBfX2dyb3VwaW5nID0gMDsKKyAgICAgIF9DaGFyVCogX190cnVlbmFtZSA9IDA7CisgICAgICBfQ2hhclQqIF9fZmFsc2VuYW1lID0gMDsKKyAgICAgIF9fdHJ5CisJeworCSAgX01fZ3JvdXBpbmdfc2l6ZSA9IF9fbnAuZ3JvdXBpbmcoKS5zaXplKCk7CisJICBfX2dyb3VwaW5nID0gbmV3IGNoYXJbX01fZ3JvdXBpbmdfc2l6ZV07CisJICBfX25wLmdyb3VwaW5nKCkuY29weShfX2dyb3VwaW5nLCBfTV9ncm91cGluZ19zaXplKTsKKwkgIF9NX2dyb3VwaW5nID0gX19ncm91cGluZzsKKwkgIF9NX3VzZV9ncm91cGluZyA9IChfTV9ncm91cGluZ19zaXplCisJCQkgICAgICYmIHN0YXRpY19jYXN0PHNpZ25lZCBjaGFyPihfTV9ncm91cGluZ1swXSkgPiAwCisJCQkgICAgICYmIChfTV9ncm91cGluZ1swXQorCQkJCSAhPSBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8Y2hhcj46Ol9fbWF4KSk7CisKKwkgIF9NX3RydWVuYW1lX3NpemUgPSBfX25wLnRydWVuYW1lKCkuc2l6ZSgpOworCSAgX190cnVlbmFtZSA9IG5ldyBfQ2hhclRbX01fdHJ1ZW5hbWVfc2l6ZV07CisJICBfX25wLnRydWVuYW1lKCkuY29weShfX3RydWVuYW1lLCBfTV90cnVlbmFtZV9zaXplKTsKKwkgIF9NX3RydWVuYW1lID0gX190cnVlbmFtZTsKKworCSAgX01fZmFsc2VuYW1lX3NpemUgPSBfX25wLmZhbHNlbmFtZSgpLnNpemUoKTsKKwkgIF9fZmFsc2VuYW1lID0gbmV3IF9DaGFyVFtfTV9mYWxzZW5hbWVfc2l6ZV07CisJICBfX25wLmZhbHNlbmFtZSgpLmNvcHkoX19mYWxzZW5hbWUsIF9NX2ZhbHNlbmFtZV9zaXplKTsKKwkgIF9NX2ZhbHNlbmFtZSA9IF9fZmFsc2VuYW1lOworCisJICBfTV9kZWNpbWFsX3BvaW50ID0gX19ucC5kZWNpbWFsX3BvaW50KCk7CisJICBfTV90aG91c2FuZHNfc2VwID0gX19ucC50aG91c2FuZHNfc2VwKCk7CisKKwkgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3QgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKTsKKwkgIF9fY3Qud2lkZW4oX19udW1fYmFzZTo6X1NfYXRvbXNfb3V0LAorCQkgICAgIF9fbnVtX2Jhc2U6Ol9TX2F0b21zX291dAorCQkgICAgICsgX19udW1fYmFzZTo6X1Nfb2VuZCwgX01fYXRvbXNfb3V0KTsKKwkgIF9fY3Qud2lkZW4oX19udW1fYmFzZTo6X1NfYXRvbXNfaW4sCisJCSAgICAgX19udW1fYmFzZTo6X1NfYXRvbXNfaW4KKwkJICAgICArIF9fbnVtX2Jhc2U6Ol9TX2llbmQsIF9NX2F0b21zX2luKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBkZWxldGUgW10gX19ncm91cGluZzsKKwkgIGRlbGV0ZSBbXSBfX3RydWVuYW1lOworCSAgZGVsZXRlIFtdIF9fZmFsc2VuYW1lOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICAvLyBVc2VkIGJ5IGJvdGggbnVtZXJpYyBhbmQgbW9uZXRhcnkgZmFjZXRzLgorICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgX19ncm91cGluZ190bXAgc3RyaW5nIGNvbnN0cnVjdGVkIGluCisgIC8vIG1vbmV5X2dldCBvciBudW1fZ2V0IG1hdGNoZXMgdGhlIGNhbm9uaWNhbCBncm91cGluZyBmb3IgYSBnaXZlbgorICAvLyBsb2NhbGUuCisgIC8vIF9fZ3JvdXBpbmdfdG1wIGlzIHBhcnNlZCBMIHRvIFIKKyAgLy8gMSwyMjIsNDQ0ID09IF9fZ3JvdXBpbmdfdG1wIG9mICJcMVwzXDMiCisgIC8vIF9fZ3JvdXBpbmcgaXMgcGFyc2VkIFIgdG8gTAorICAvLyAxLDIyMiw0NDQgPT0gX19ncm91cGluZyBvZiAiXDMiID09ICJcM1wzXDMiCisgIF9HTElCQ1hYX1BVUkUgYm9vbAorICBfX3ZlcmlmeV9ncm91cGluZyhjb25zdCBjaGFyKiBfX2dyb3VwaW5nLCBzaXplX3QgX19ncm91cGluZ19zaXplLAorCQkgICAgY29uc3Qgc3RyaW5nJiBfX2dyb3VwaW5nX3RtcCkgdGhyb3cgKCk7CisKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9MREJMCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIF9Jbkl0ZXIKKyAgICBudW1fZ2V0PF9DaGFyVCwgX0luSXRlcj46OgorICAgIF9NX2V4dHJhY3RfZmxvYXQoX0luSXRlciBfX2JlZywgX0luSXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJCSAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBzdHJpbmcmIF9feHRyYykgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIGNoYXJfdHJhaXRzPF9DaGFyVD4JCQlfX3RyYWl0c190eXBlOworICAgICAgdHlwZWRlZiBfX251bXB1bmN0X2NhY2hlPF9DaGFyVD4gICAgICAgICAgICAgICAgICBfX2NhY2hlX3R5cGU7CisgICAgICBfX3VzZV9jYWNoZTxfX2NhY2hlX3R5cGU+IF9fdWM7CisgICAgICBjb25zdCBsb2NhbGUmIF9fbG9jID0gX19pby5fTV9nZXRsb2MoKTsKKyAgICAgIGNvbnN0IF9fY2FjaGVfdHlwZSogX19sYyA9IF9fdWMoX19sb2MpOworICAgICAgY29uc3QgX0NoYXJUKiBfX2xpdCA9IF9fbGMtPl9NX2F0b21zX2luOworICAgICAgY2hhcl90eXBlIF9fYyA9IGNoYXJfdHlwZSgpOworCisgICAgICAvLyBUcnVlIGlmIF9fYmVnIGJlY29tZXMgZXF1YWwgdG8gX19lbmQuCisgICAgICBib29sIF9fdGVzdGVvZiA9IF9fYmVnID09IF9fZW5kOworCisgICAgICAvLyBGaXJzdCBjaGVjayBmb3Igc2lnbi4KKyAgICAgIGlmICghX190ZXN0ZW9mKQorCXsKKwkgIF9fYyA9ICpfX2JlZzsKKwkgIGNvbnN0IGJvb2wgX19wbHVzID0gX19jID09IF9fbGl0W19fbnVtX2Jhc2U6Ol9TX2lwbHVzXTsKKwkgIGlmICgoX19wbHVzIHx8IF9fYyA9PSBfX2xpdFtfX251bV9iYXNlOjpfU19pbWludXNdKQorCSAgICAgICYmICEoX19sYy0+X01fdXNlX2dyb3VwaW5nICYmIF9fYyA9PSBfX2xjLT5fTV90aG91c2FuZHNfc2VwKQorCSAgICAgICYmICEoX19jID09IF9fbGMtPl9NX2RlY2ltYWxfcG9pbnQpKQorCSAgICB7CisJICAgICAgX194dHJjICs9IF9fcGx1cyA/ICcrJyA6ICctJzsKKwkgICAgICBpZiAoKytfX2JlZyAhPSBfX2VuZCkKKwkJX19jID0gKl9fYmVnOworCSAgICAgIGVsc2UKKwkJX190ZXN0ZW9mID0gdHJ1ZTsKKwkgICAgfQorCX0KKworICAgICAgLy8gTmV4dCwgbG9vayBmb3IgbGVhZGluZyB6ZXJvcy4KKyAgICAgIGJvb2wgX19mb3VuZF9tYW50aXNzYSA9IGZhbHNlOworICAgICAgaW50IF9fc2VwX3BvcyA9IDA7CisgICAgICB3aGlsZSAoIV9fdGVzdGVvZikKKwl7CisJICBpZiAoKF9fbGMtPl9NX3VzZV9ncm91cGluZyAmJiBfX2MgPT0gX19sYy0+X01fdGhvdXNhbmRzX3NlcCkKKwkgICAgICB8fCBfX2MgPT0gX19sYy0+X01fZGVjaW1hbF9wb2ludCkKKwkgICAgYnJlYWs7CisJICBlbHNlIGlmIChfX2MgPT0gX19saXRbX19udW1fYmFzZTo6X1NfaXplcm9dKQorCSAgICB7CisJICAgICAgaWYgKCFfX2ZvdW5kX21hbnRpc3NhKQorCQl7CisJCSAgX194dHJjICs9ICcwJzsKKwkJICBfX2ZvdW5kX21hbnRpc3NhID0gdHJ1ZTsKKwkJfQorCSAgICAgICsrX19zZXBfcG9zOworCisJICAgICAgaWYgKCsrX19iZWcgIT0gX19lbmQpCisJCV9fYyA9ICpfX2JlZzsKKwkgICAgICBlbHNlCisJCV9fdGVzdGVvZiA9IHRydWU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgYnJlYWs7CisJfQorCisgICAgICAvLyBPbmx5IG5lZWQgYWNjZXB0YWJsZSBkaWdpdHMgZm9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuCisgICAgICBib29sIF9fZm91bmRfZGVjID0gZmFsc2U7CisgICAgICBib29sIF9fZm91bmRfc2NpID0gZmFsc2U7CisgICAgICBzdHJpbmcgX19mb3VuZF9ncm91cGluZzsKKyAgICAgIGlmIChfX2xjLT5fTV91c2VfZ3JvdXBpbmcpCisJX19mb3VuZF9ncm91cGluZy5yZXNlcnZlKDMyKTsKKyAgICAgIGNvbnN0IGNoYXJfdHlwZSogX19saXRfemVybyA9IF9fbGl0ICsgX19udW1fYmFzZTo6X1NfaXplcm87CisKKyAgICAgIGlmICghX19sYy0+X01fYWxsb2NhdGVkKQorCS8vICJDIiBsb2NhbGUKKwl3aGlsZSAoIV9fdGVzdGVvZikKKwkgIHsKKwkgICAgY29uc3QgaW50IF9fZGlnaXQgPSBfTV9maW5kKF9fbGl0X3plcm8sIDEwLCBfX2MpOworCSAgICBpZiAoX19kaWdpdCAhPSAtMSkKKwkgICAgICB7CisJCV9feHRyYyArPSAnMCcgKyBfX2RpZ2l0OworCQlfX2ZvdW5kX21hbnRpc3NhID0gdHJ1ZTsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKF9fYyA9PSBfX2xjLT5fTV9kZWNpbWFsX3BvaW50CisJCSAgICAgJiYgIV9fZm91bmRfZGVjICYmICFfX2ZvdW5kX3NjaSkKKwkgICAgICB7CisJCV9feHRyYyArPSAnLic7CisJCV9fZm91bmRfZGVjID0gdHJ1ZTsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKChfX2MgPT0gX19saXRbX19udW1fYmFzZTo6X1NfaWVdIAorCQkgICAgICB8fCBfX2MgPT0gX19saXRbX19udW1fYmFzZTo6X1NfaUVdKQorCQkgICAgICYmICFfX2ZvdW5kX3NjaSAmJiBfX2ZvdW5kX21hbnRpc3NhKQorCSAgICAgIHsKKwkJLy8gU2NpZW50aWZpYyBub3RhdGlvbi4KKwkJX194dHJjICs9ICdlJzsKKwkJX19mb3VuZF9zY2kgPSB0cnVlOworCQkKKwkJLy8gUmVtb3ZlIG9wdGlvbmFsIHBsdXMgb3IgbWludXMgc2lnbiwgaWYgdGhleSBleGlzdC4KKwkJaWYgKCsrX19iZWcgIT0gX19lbmQpCisJCSAgeworCQkgICAgX19jID0gKl9fYmVnOworCQkgICAgY29uc3QgYm9vbCBfX3BsdXMgPSBfX2MgPT0gX19saXRbX19udW1fYmFzZTo6X1NfaXBsdXNdOworCQkgICAgaWYgKF9fcGx1cyB8fCBfX2MgPT0gX19saXRbX19udW1fYmFzZTo6X1NfaW1pbnVzXSkKKwkJICAgICAgX194dHJjICs9IF9fcGx1cyA/ICcrJyA6ICctJzsKKwkJICAgIGVsc2UKKwkJICAgICAgY29udGludWU7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgX190ZXN0ZW9mID0gdHJ1ZTsKKwkJICAgIGJyZWFrOworCQkgIH0KKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICBicmVhazsKKworCSAgICBpZiAoKytfX2JlZyAhPSBfX2VuZCkKKwkgICAgICBfX2MgPSAqX19iZWc7CisJICAgIGVsc2UKKwkgICAgICBfX3Rlc3Rlb2YgPSB0cnVlOworCSAgfQorICAgICAgZWxzZQorCXdoaWxlICghX190ZXN0ZW9mKQorCSAgeworCSAgICAvLyBBY2NvcmRpbmcgdG8gMjIuMi4yLjEuMiwgcDgtOSwgZmlyc3QgbG9vayBmb3IgdGhvdXNhbmRzX3NlcAorCSAgICAvLyBhbmQgZGVjaW1hbF9wb2ludC4KKwkgICAgaWYgKF9fbGMtPl9NX3VzZV9ncm91cGluZyAmJiBfX2MgPT0gX19sYy0+X01fdGhvdXNhbmRzX3NlcCkKKwkgICAgICB7CisJCWlmICghX19mb3VuZF9kZWMgJiYgIV9fZm91bmRfc2NpKQorCQkgIHsKKwkJICAgIC8vIE5COiBUaG91c2FuZHMgc2VwYXJhdG9yIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJpbmcKKwkJICAgIC8vIGlzIGEgbm8tbm8sIGFzIGlzIHR3byBjb25zZWN1dGl2ZSB0aG91c2FuZHMgc2VwYXJhdG9ycy4KKwkJICAgIGlmIChfX3NlcF9wb3MpCisJCSAgICAgIHsKKwkJCV9fZm91bmRfZ3JvdXBpbmcgKz0gc3RhdGljX2Nhc3Q8Y2hhcj4oX19zZXBfcG9zKTsKKwkJCV9fc2VwX3BvcyA9IDA7CisJCSAgICAgIH0KKwkJICAgIGVsc2UKKwkJICAgICAgeworCQkJLy8gTkI6IF9fY29udmVydF90b192IHdpbGwgbm90IGFzc2lnbiBfX3YgYW5kIHdpbGwKKwkJCS8vIHNldCB0aGUgZmFpbGJpdC4KKwkJCV9feHRyYy5jbGVhcigpOworCQkJYnJlYWs7CisJCSAgICAgIH0KKwkJICB9CisJCWVsc2UKKwkJICBicmVhazsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKF9fYyA9PSBfX2xjLT5fTV9kZWNpbWFsX3BvaW50KQorCSAgICAgIHsKKwkJaWYgKCFfX2ZvdW5kX2RlYyAmJiAhX19mb3VuZF9zY2kpCisJCSAgeworCQkgICAgLy8gSWYgbm8gZ3JvdXBpbmcgY2hhcnMgYXJlIHNlZW4sIG5vIGdyb3VwaW5nIGNoZWNrCisJCSAgICAvLyBpcyBhcHBsaWVkLiBUaGVyZWZvcmUgX19mb3VuZF9ncm91cGluZyBpcyBhZGp1c3RlZAorCQkgICAgLy8gb25seSBpZiBkZWNpbWFsX3BvaW50IGNvbWVzIGFmdGVyIHNvbWUgdGhvdXNhbmRzX3NlcC4KKwkJICAgIGlmIChfX2ZvdW5kX2dyb3VwaW5nLnNpemUoKSkKKwkJICAgICAgX19mb3VuZF9ncm91cGluZyArPSBzdGF0aWNfY2FzdDxjaGFyPihfX3NlcF9wb3MpOworCQkgICAgX194dHJjICs9ICcuJzsKKwkJICAgIF9fZm91bmRfZGVjID0gdHJ1ZTsKKwkJICB9CisJCWVsc2UKKwkJICBicmVhazsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCWNvbnN0IGNoYXJfdHlwZSogX19xID0KKwkJICBfX3RyYWl0c190eXBlOjpmaW5kKF9fbGl0X3plcm8sIDEwLCBfX2MpOworCQlpZiAoX19xKQorCQkgIHsKKwkJICAgIF9feHRyYyArPSAnMCcgKyAoX19xIC0gX19saXRfemVybyk7CisJCSAgICBfX2ZvdW5kX21hbnRpc3NhID0gdHJ1ZTsKKwkJICAgICsrX19zZXBfcG9zOworCQkgIH0KKwkJZWxzZSBpZiAoKF9fYyA9PSBfX2xpdFtfX251bV9iYXNlOjpfU19pZV0gCisJCQkgIHx8IF9fYyA9PSBfX2xpdFtfX251bV9iYXNlOjpfU19pRV0pCisJCQkgJiYgIV9fZm91bmRfc2NpICYmIF9fZm91bmRfbWFudGlzc2EpCisJCSAgeworCQkgICAgLy8gU2NpZW50aWZpYyBub3RhdGlvbi4KKwkJICAgIGlmIChfX2ZvdW5kX2dyb3VwaW5nLnNpemUoKSAmJiAhX19mb3VuZF9kZWMpCisJCSAgICAgIF9fZm91bmRfZ3JvdXBpbmcgKz0gc3RhdGljX2Nhc3Q8Y2hhcj4oX19zZXBfcG9zKTsKKwkJICAgIF9feHRyYyArPSAnZSc7CisJCSAgICBfX2ZvdW5kX3NjaSA9IHRydWU7CisJCSAgICAKKwkJICAgIC8vIFJlbW92ZSBvcHRpb25hbCBwbHVzIG9yIG1pbnVzIHNpZ24sIGlmIHRoZXkgZXhpc3QuCisJCSAgICBpZiAoKytfX2JlZyAhPSBfX2VuZCkKKwkJICAgICAgeworCQkJX19jID0gKl9fYmVnOworCQkJY29uc3QgYm9vbCBfX3BsdXMgPSBfX2MgPT0gX19saXRbX19udW1fYmFzZTo6X1NfaXBsdXNdOworCQkJaWYgKChfX3BsdXMgfHwgX19jID09IF9fbGl0W19fbnVtX2Jhc2U6Ol9TX2ltaW51c10pCisJCQkgICAgJiYgIShfX2xjLT5fTV91c2VfZ3JvdXBpbmcKKwkJCQkgJiYgX19jID09IF9fbGMtPl9NX3Rob3VzYW5kc19zZXApCisJCQkgICAgJiYgIShfX2MgPT0gX19sYy0+X01fZGVjaW1hbF9wb2ludCkpCisJCSAgICAgIF9feHRyYyArPSBfX3BsdXMgPyAnKycgOiAnLSc7CisJCQllbHNlCisJCQkgIGNvbnRpbnVlOworCQkgICAgICB9CisJCSAgICBlbHNlCisJCSAgICAgIHsKKwkJCV9fdGVzdGVvZiA9IHRydWU7CisJCQlicmVhazsKKwkJICAgICAgfQorCQkgIH0KKwkJZWxzZQorCQkgIGJyZWFrOworCSAgICAgIH0KKwkgICAgCisJICAgIGlmICgrK19fYmVnICE9IF9fZW5kKQorCSAgICAgIF9fYyA9ICpfX2JlZzsKKwkgICAgZWxzZQorCSAgICAgIF9fdGVzdGVvZiA9IHRydWU7CisJICB9CisKKyAgICAgIC8vIERpZ2l0IGdyb3VwaW5nIGlzIGNoZWNrZWQuIElmIGdyb3VwaW5nIGFuZCBmb3VuZF9ncm91cGluZyBkb24ndAorICAgICAgLy8gbWF0Y2gsIHRoZW4gZ2V0IHZlcnkgdmVyeSB1cHNldCwgYW5kIHNldCBmYWlsYml0LgorICAgICAgaWYgKF9fZm91bmRfZ3JvdXBpbmcuc2l6ZSgpKQorICAgICAgICB7CisgICAgICAgICAgLy8gQWRkIHRoZSBlbmRpbmcgZ3JvdXBpbmcgaWYgYSBkZWNpbWFsIG9yICdlJy8nRScgd2Fzbid0IGZvdW5kLgorCSAgaWYgKCFfX2ZvdW5kX2RlYyAmJiAhX19mb3VuZF9zY2kpCisJICAgIF9fZm91bmRfZ3JvdXBpbmcgKz0gc3RhdGljX2Nhc3Q8Y2hhcj4oX19zZXBfcG9zKTsKKworICAgICAgICAgIGlmICghc3RkOjpfX3ZlcmlmeV9ncm91cGluZyhfX2xjLT5fTV9ncm91cGluZywgCisJCQkJICAgICAgX19sYy0+X01fZ3JvdXBpbmdfc2l6ZSwKKwkJCQkgICAgICBfX2ZvdW5kX2dyb3VwaW5nKSkKKwkgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gX19iZWc7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWVUPgorICAgICAgX0luSXRlcgorICAgICAgbnVtX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICAgIF9NX2V4dHJhY3RfaW50KF9Jbkl0ZXIgX19iZWcsIF9Jbkl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCQkgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgX1ZhbHVlVCYgX192KSBjb25zdAorICAgICAgeworICAgICAgICB0eXBlZGVmIGNoYXJfdHJhaXRzPF9DaGFyVD4JCQkgICAgIF9fdHJhaXRzX3R5cGU7CisJdXNpbmcgX19nbnVfY3h4OjpfX2FkZF91bnNpZ25lZDsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fYWRkX3Vuc2lnbmVkPF9WYWx1ZVQ+OjpfX3R5cGUgX191bnNpZ25lZF90eXBlOworCXR5cGVkZWYgX19udW1wdW5jdF9jYWNoZTxfQ2hhclQ+ICAgICAgICAgICAgICAgICAgICAgX19jYWNoZV90eXBlOworCV9fdXNlX2NhY2hlPF9fY2FjaGVfdHlwZT4gX191YzsKKwljb25zdCBsb2NhbGUmIF9fbG9jID0gX19pby5fTV9nZXRsb2MoKTsKKwljb25zdCBfX2NhY2hlX3R5cGUqIF9fbGMgPSBfX3VjKF9fbG9jKTsKKwljb25zdCBfQ2hhclQqIF9fbGl0ID0gX19sYy0+X01fYXRvbXNfaW47CisJY2hhcl90eXBlIF9fYyA9IGNoYXJfdHlwZSgpOworCisJLy8gTkI6IElmZiBfX2Jhc2VmaWVsZCA9PSAwLCBfX2Jhc2UgY2FuIGNoYW5nZSBiYXNlZCBvbiBjb250ZW50cy4KKwljb25zdCBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19iYXNlZmllbGQgPSBfX2lvLmZsYWdzKCkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIGlvc19iYXNlOjpiYXNlZmllbGQ7CisJY29uc3QgYm9vbCBfX29jdCA9IF9fYmFzZWZpZWxkID09IGlvc19iYXNlOjpvY3Q7CisJaW50IF9fYmFzZSA9IF9fb2N0ID8gOCA6IChfX2Jhc2VmaWVsZCA9PSBpb3NfYmFzZTo6aGV4ID8gMTYgOiAxMCk7CisKKwkvLyBUcnVlIGlmIF9fYmVnIGJlY29tZXMgZXF1YWwgdG8gX19lbmQuCisJYm9vbCBfX3Rlc3Rlb2YgPSBfX2JlZyA9PSBfX2VuZDsKKworCS8vIEZpcnN0IGNoZWNrIGZvciBzaWduLgorCWJvb2wgX19uZWdhdGl2ZSA9IGZhbHNlOworCWlmICghX190ZXN0ZW9mKQorCSAgeworCSAgICBfX2MgPSAqX19iZWc7CisJICAgIF9fbmVnYXRpdmUgPSBfX2MgPT0gX19saXRbX19udW1fYmFzZTo6X1NfaW1pbnVzXTsKKwkgICAgaWYgKChfX25lZ2F0aXZlIHx8IF9fYyA9PSBfX2xpdFtfX251bV9iYXNlOjpfU19pcGx1c10pCisJCSYmICEoX19sYy0+X01fdXNlX2dyb3VwaW5nICYmIF9fYyA9PSBfX2xjLT5fTV90aG91c2FuZHNfc2VwKQorCQkmJiAhKF9fYyA9PSBfX2xjLT5fTV9kZWNpbWFsX3BvaW50KSkKKwkgICAgICB7CisJCWlmICgrK19fYmVnICE9IF9fZW5kKQorCQkgIF9fYyA9ICpfX2JlZzsKKwkJZWxzZQorCQkgIF9fdGVzdGVvZiA9IHRydWU7CisJICAgICAgfQorCSAgfQorCisJLy8gTmV4dCwgbG9vayBmb3IgbGVhZGluZyB6ZXJvcyBhbmQgY2hlY2sgcmVxdWlyZWQgZGlnaXRzCisJLy8gZm9yIGJhc2UgZm9ybWF0cy4KKwlib29sIF9fZm91bmRfemVybyA9IGZhbHNlOworCWludCBfX3NlcF9wb3MgPSAwOworCXdoaWxlICghX190ZXN0ZW9mKQorCSAgeworCSAgICBpZiAoKF9fbGMtPl9NX3VzZV9ncm91cGluZyAmJiBfX2MgPT0gX19sYy0+X01fdGhvdXNhbmRzX3NlcCkKKwkJfHwgX19jID09IF9fbGMtPl9NX2RlY2ltYWxfcG9pbnQpCisJICAgICAgYnJlYWs7CisJICAgIGVsc2UgaWYgKF9fYyA9PSBfX2xpdFtfX251bV9iYXNlOjpfU19pemVyb10gCisJCSAgICAgJiYgKCFfX2ZvdW5kX3plcm8gfHwgX19iYXNlID09IDEwKSkKKwkgICAgICB7CisJCV9fZm91bmRfemVybyA9IHRydWU7CisJCSsrX19zZXBfcG9zOworCQlpZiAoX19iYXNlZmllbGQgPT0gMCkKKwkJICBfX2Jhc2UgPSA4OworCQlpZiAoX19iYXNlID09IDgpCisJCSAgX19zZXBfcG9zID0gMDsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKF9fZm91bmRfemVybworCQkgICAgICYmIChfX2MgPT0gX19saXRbX19udW1fYmFzZTo6X1NfaXhdCisJCQkgfHwgX19jID09IF9fbGl0W19fbnVtX2Jhc2U6Ol9TX2lYXSkpCisJICAgICAgeworCQlpZiAoX19iYXNlZmllbGQgPT0gMCkKKwkJICBfX2Jhc2UgPSAxNjsKKwkJaWYgKF9fYmFzZSA9PSAxNikKKwkJICB7CisJCSAgICBfX2ZvdW5kX3plcm8gPSBmYWxzZTsKKwkJICAgIF9fc2VwX3BvcyA9IDA7CisJCSAgfQorCQllbHNlCisJCSAgYnJlYWs7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgYnJlYWs7CisKKwkgICAgaWYgKCsrX19iZWcgIT0gX19lbmQpCisJICAgICAgeworCQlfX2MgPSAqX19iZWc7CisJCWlmICghX19mb3VuZF96ZXJvKQorCQkgIGJyZWFrOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIF9fdGVzdGVvZiA9IHRydWU7CisJICB9CisJCisJLy8gQXQgdGhpcyBwb2ludCwgYmFzZSBpcyBkZXRlcm1pbmVkLiBJZiBub3QgaGV4LCBvbmx5IGFsbG93CisJLy8gYmFzZSBkaWdpdHMgYXMgdmFsaWQgaW5wdXQuCisJY29uc3Qgc2l6ZV90IF9fbGVuID0gKF9fYmFzZSA9PSAxNiA/IF9fbnVtX2Jhc2U6Ol9TX2llbmQKKwkJCSAgICAgIC0gX19udW1fYmFzZTo6X1NfaXplcm8gOiBfX2Jhc2UpOworCisJLy8gRXh0cmFjdC4KKwlzdHJpbmcgX19mb3VuZF9ncm91cGluZzsKKwlpZiAoX19sYy0+X01fdXNlX2dyb3VwaW5nKQorCSAgX19mb3VuZF9ncm91cGluZy5yZXNlcnZlKDMyKTsKKwlib29sIF9fdGVzdGZhaWwgPSBmYWxzZTsKKwlib29sIF9fdGVzdG92ZXJmbG93ID0gZmFsc2U7CisJY29uc3QgX191bnNpZ25lZF90eXBlIF9fbWF4ID0KKwkgIChfX25lZ2F0aXZlICYmIF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxfVmFsdWVUPjo6X19pc19zaWduZWQpCisJICA/IC1fX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1ZhbHVlVD46Ol9fbWluCisJICA6IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxfVmFsdWVUPjo6X19tYXg7CisJY29uc3QgX191bnNpZ25lZF90eXBlIF9fc21heCA9IF9fbWF4IC8gX19iYXNlOworCV9fdW5zaWduZWRfdHlwZSBfX3Jlc3VsdCA9IDA7CisJaW50IF9fZGlnaXQgPSAwOworCWNvbnN0IGNoYXJfdHlwZSogX19saXRfemVybyA9IF9fbGl0ICsgX19udW1fYmFzZTo6X1NfaXplcm87CisKKwlpZiAoIV9fbGMtPl9NX2FsbG9jYXRlZCkKKwkgIC8vICJDIiBsb2NhbGUKKwkgIHdoaWxlICghX190ZXN0ZW9mKQorCSAgICB7CisJICAgICAgX19kaWdpdCA9IF9NX2ZpbmQoX19saXRfemVybywgX19sZW4sIF9fYyk7CisJICAgICAgaWYgKF9fZGlnaXQgPT0gLTEpCisJCWJyZWFrOworCSAgICAgIAorCSAgICAgIGlmIChfX3Jlc3VsdCA+IF9fc21heCkKKwkJX190ZXN0b3ZlcmZsb3cgPSB0cnVlOworCSAgICAgIGVsc2UKKwkJeworCQkgIF9fcmVzdWx0ICo9IF9fYmFzZTsKKwkJICBfX3Rlc3RvdmVyZmxvdyB8PSBfX3Jlc3VsdCA+IF9fbWF4IC0gX19kaWdpdDsKKwkJICBfX3Jlc3VsdCArPSBfX2RpZ2l0OworCQkgICsrX19zZXBfcG9zOworCQl9CisJICAgICAgCisJICAgICAgaWYgKCsrX19iZWcgIT0gX19lbmQpCisJCV9fYyA9ICpfX2JlZzsKKwkgICAgICBlbHNlCisJCV9fdGVzdGVvZiA9IHRydWU7CisJICAgIH0KKwllbHNlCisJICB3aGlsZSAoIV9fdGVzdGVvZikKKwkgICAgeworCSAgICAgIC8vIEFjY29yZGluZyB0byAyMi4yLjIuMS4yLCBwOC05LCBmaXJzdCBsb29rIGZvciB0aG91c2FuZHNfc2VwCisJICAgICAgLy8gYW5kIGRlY2ltYWxfcG9pbnQuCisJICAgICAgaWYgKF9fbGMtPl9NX3VzZV9ncm91cGluZyAmJiBfX2MgPT0gX19sYy0+X01fdGhvdXNhbmRzX3NlcCkKKwkJeworCQkgIC8vIE5COiBUaG91c2FuZHMgc2VwYXJhdG9yIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJpbmcKKwkJICAvLyBpcyBhIG5vLW5vLCBhcyBpcyB0d28gY29uc2VjdXRpdmUgdGhvdXNhbmRzIHNlcGFyYXRvcnMuCisJCSAgaWYgKF9fc2VwX3BvcykKKwkJICAgIHsKKwkJICAgICAgX19mb3VuZF9ncm91cGluZyArPSBzdGF0aWNfY2FzdDxjaGFyPihfX3NlcF9wb3MpOworCQkgICAgICBfX3NlcF9wb3MgPSAwOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgX190ZXN0ZmFpbCA9IHRydWU7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZSBpZiAoX19jID09IF9fbGMtPl9NX2RlY2ltYWxfcG9pbnQpCisJCWJyZWFrOworCSAgICAgIGVsc2UKKwkJeworCQkgIGNvbnN0IGNoYXJfdHlwZSogX19xID0KKwkJICAgIF9fdHJhaXRzX3R5cGU6OmZpbmQoX19saXRfemVybywgX19sZW4sIF9fYyk7CisJCSAgaWYgKCFfX3EpCisJCSAgICBicmVhazsKKwkJICAKKwkJICBfX2RpZ2l0ID0gX19xIC0gX19saXRfemVybzsKKwkJICBpZiAoX19kaWdpdCA+IDE1KQorCQkgICAgX19kaWdpdCAtPSA2OworCQkgIGlmIChfX3Jlc3VsdCA+IF9fc21heCkKKwkJICAgIF9fdGVzdG92ZXJmbG93ID0gdHJ1ZTsKKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIF9fcmVzdWx0ICo9IF9fYmFzZTsKKwkJICAgICAgX190ZXN0b3ZlcmZsb3cgfD0gX19yZXN1bHQgPiBfX21heCAtIF9fZGlnaXQ7CisJCSAgICAgIF9fcmVzdWx0ICs9IF9fZGlnaXQ7CisJCSAgICAgICsrX19zZXBfcG9zOworCQkgICAgfQorCQl9CisJICAgICAgCisJICAgICAgaWYgKCsrX19iZWcgIT0gX19lbmQpCisJCV9fYyA9ICpfX2JlZzsKKwkgICAgICBlbHNlCisJCV9fdGVzdGVvZiA9IHRydWU7CisJICAgIH0KKwkKKwkvLyBEaWdpdCBncm91cGluZyBpcyBjaGVja2VkLiBJZiBncm91cGluZyBhbmQgZm91bmRfZ3JvdXBpbmcgZG9uJ3QKKwkvLyBtYXRjaCwgdGhlbiBnZXQgdmVyeSB2ZXJ5IHVwc2V0LCBhbmQgc2V0IGZhaWxiaXQuCisJaWYgKF9fZm91bmRfZ3JvdXBpbmcuc2l6ZSgpKQorCSAgeworCSAgICAvLyBBZGQgdGhlIGVuZGluZyBncm91cGluZy4KKwkgICAgX19mb3VuZF9ncm91cGluZyArPSBzdGF0aWNfY2FzdDxjaGFyPihfX3NlcF9wb3MpOworCisJICAgIGlmICghc3RkOjpfX3ZlcmlmeV9ncm91cGluZyhfX2xjLT5fTV9ncm91cGluZywKKwkJCQkJX19sYy0+X01fZ3JvdXBpbmdfc2l6ZSwKKwkJCQkJX19mb3VuZF9ncm91cGluZykpCisJICAgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKwkgIH0KKworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAyMy4gTnVtX2dldCBvdmVyZmxvdyByZXN1bHQuCisJaWYgKCghX19zZXBfcG9zICYmICFfX2ZvdW5kX3plcm8gJiYgIV9fZm91bmRfZ3JvdXBpbmcuc2l6ZSgpKQorCSAgICB8fCBfX3Rlc3RmYWlsKQorCSAgeworCSAgICBfX3YgPSAwOworCSAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworCSAgfQorCWVsc2UgaWYgKF9fdGVzdG92ZXJmbG93KQorCSAgeworCSAgICBpZiAoX19uZWdhdGl2ZQorCQkmJiBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1ZhbHVlVD46Ol9faXNfc2lnbmVkKQorCSAgICAgIF9fdiA9IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxfVmFsdWVUPjo6X19taW47CisJICAgIGVsc2UKKwkgICAgICBfX3YgPSBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1ZhbHVlVD46Ol9fbWF4OworCSAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworCSAgfQorCWVsc2UKKwkgIF9fdiA9IF9fbmVnYXRpdmUgPyAtX19yZXN1bHQgOiBfX3Jlc3VsdDsKKworCWlmIChfX3Rlc3Rlb2YpCisJICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworCXJldHVybiBfX2JlZzsKKyAgICAgIH0KKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIDE3LiAgQmFkIGJvb2wgcGFyc2luZworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgX0luSXRlcgorICAgIG51bV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKyAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBib29sJiBfX3YpIGNvbnN0CisgICAgeworICAgICAgaWYgKCEoX19pby5mbGFncygpICYgaW9zX2Jhc2U6OmJvb2xhbHBoYSkpCisgICAgICAgIHsKKwkgIC8vIFBhcnNlIGJvb2wgdmFsdWVzIGFzIGxvbmcuCisgICAgICAgICAgLy8gTkI6IFdlIGNhbid0IGp1c3QgY2FsbCBkb19nZXQobG9uZykgaGVyZSwgYXMgaXQgbWlnaHQKKyAgICAgICAgICAvLyByZWZlciB0byBhIGRlcml2ZWQgY2xhc3MuCisJICBsb25nIF9fbCA9IC0xOworICAgICAgICAgIF9fYmVnID0gX01fZXh0cmFjdF9pbnQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX19sKTsKKwkgIGlmIChfX2wgPT0gMCB8fCBfX2wgPT0gMSkKKwkgICAgX192ID0gYm9vbChfX2wpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgICAgIC8vIDIzLiBOdW1fZ2V0IG92ZXJmbG93IHJlc3VsdC4KKwkgICAgICBfX3YgPSB0cnVlOworCSAgICAgIF9fZXJyID0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJICAgICAgaWYgKF9fYmVnID09IF9fZW5kKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworCSAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworCSAgLy8gUGFyc2UgYm9vbCB2YWx1ZXMgYXMgYWxwaGFudW1lcmljLgorCSAgdHlwZWRlZiBfX251bXB1bmN0X2NhY2hlPF9DaGFyVD4gIF9fY2FjaGVfdHlwZTsKKwkgIF9fdXNlX2NhY2hlPF9fY2FjaGVfdHlwZT4gX191YzsKKwkgIGNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworCSAgY29uc3QgX19jYWNoZV90eXBlKiBfX2xjID0gX191YyhfX2xvYyk7CisKKwkgIGJvb2wgX190ZXN0ZiA9IHRydWU7CisJICBib29sIF9fdGVzdHQgPSB0cnVlOworCSAgYm9vbCBfX2RvbmVmID0gX19sYy0+X01fZmFsc2VuYW1lX3NpemUgPT0gMDsKKwkgIGJvb2wgX19kb25ldCA9IF9fbGMtPl9NX3RydWVuYW1lX3NpemUgPT0gMDsKKwkgIGJvb2wgX190ZXN0ZW9mID0gZmFsc2U7CisJICBzaXplX3QgX19uID0gMDsKKwkgIHdoaWxlICghX19kb25lZiB8fCAhX19kb25ldCkKKwkgICAgeworCSAgICAgIGlmIChfX2JlZyA9PSBfX2VuZCkKKwkJeworCQkgIF9fdGVzdGVvZiA9IHRydWU7CisJCSAgYnJlYWs7CisJCX0KKworCSAgICAgIGNvbnN0IGNoYXJfdHlwZSBfX2MgPSAqX19iZWc7CisKKwkgICAgICBpZiAoIV9fZG9uZWYpCisJCV9fdGVzdGYgPSBfX2MgPT0gX19sYy0+X01fZmFsc2VuYW1lW19fbl07CisKKwkgICAgICBpZiAoIV9fdGVzdGYgJiYgX19kb25ldCkKKwkJYnJlYWs7CisKKwkgICAgICBpZiAoIV9fZG9uZXQpCisJCV9fdGVzdHQgPSBfX2MgPT0gX19sYy0+X01fdHJ1ZW5hbWVbX19uXTsKKworCSAgICAgIGlmICghX190ZXN0dCAmJiBfX2RvbmVmKQorCQlicmVhazsKKworCSAgICAgIGlmICghX190ZXN0dCAmJiAhX190ZXN0ZikKKwkJYnJlYWs7CisKKwkgICAgICArK19fbjsKKwkgICAgICArK19fYmVnOworCisJICAgICAgX19kb25lZiA9ICFfX3Rlc3RmIHx8IF9fbiA+PSBfX2xjLT5fTV9mYWxzZW5hbWVfc2l6ZTsKKwkgICAgICBfX2RvbmV0ID0gIV9fdGVzdHQgfHwgX19uID49IF9fbGMtPl9NX3RydWVuYW1lX3NpemU7CisJICAgIH0KKwkgIGlmIChfX3Rlc3RmICYmIF9fbiA9PSBfX2xjLT5fTV9mYWxzZW5hbWVfc2l6ZSAmJiBfX24pCisJICAgIHsKKwkgICAgICBfX3YgPSBmYWxzZTsKKwkgICAgICBpZiAoX190ZXN0dCAmJiBfX24gPT0gX19sYy0+X01fdHJ1ZW5hbWVfc2l6ZSkKKwkJX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKwkgICAgICBlbHNlCisJCV9fZXJyID0gX190ZXN0ZW9mID8gaW9zX2Jhc2U6OmVvZmJpdCA6IGlvc19iYXNlOjpnb29kYml0OworCSAgICB9CisJICBlbHNlIGlmIChfX3Rlc3R0ICYmIF9fbiA9PSBfX2xjLT5fTV90cnVlbmFtZV9zaXplICYmIF9fbikKKwkgICAgeworCSAgICAgIF9fdiA9IHRydWU7CisJICAgICAgX19lcnIgPSBfX3Rlc3Rlb2YgPyBpb3NfYmFzZTo6ZW9mYml0IDogaW9zX2Jhc2U6Omdvb2RiaXQ7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgICAgICAvLyAyMy4gTnVtX2dldCBvdmVyZmxvdyByZXN1bHQuCisJICAgICAgX192ID0gZmFsc2U7CisJICAgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKwkgICAgICBpZiAoX190ZXN0ZW9mKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fYmVnOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgX0luSXRlcgorICAgIG51bV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGZsb2F0JiBfX3YpIGNvbnN0CisgICAgeworICAgICAgc3RyaW5nIF9feHRyYzsKKyAgICAgIF9feHRyYy5yZXNlcnZlKDMyKTsKKyAgICAgIF9fYmVnID0gX01fZXh0cmFjdF9mbG9hdChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3h0cmMpOworICAgICAgc3RkOjpfX2NvbnZlcnRfdG9fdihfX3h0cmMuY19zdHIoKSwgX192LCBfX2VyciwgX1NfZ2V0X2NfbG9jYWxlKCkpOworICAgICAgaWYgKF9fYmVnID09IF9fZW5kKQorCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgICByZXR1cm4gX19iZWc7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgbnVtX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBkb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGRvdWJsZSYgX192KSBjb25zdAorICAgIHsKKyAgICAgIHN0cmluZyBfX3h0cmM7CisgICAgICBfX3h0cmMucmVzZXJ2ZSgzMik7CisgICAgICBfX2JlZyA9IF9NX2V4dHJhY3RfZmxvYXQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX194dHJjKTsKKyAgICAgIHN0ZDo6X19jb252ZXJ0X3RvX3YoX194dHJjLmNfc3RyKCksIF9fdiwgX19lcnIsIF9TX2dldF9jX2xvY2FsZSgpKTsKKyAgICAgIGlmIChfX2JlZyA9PSBfX2VuZCkKKwlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgcmV0dXJuIF9fYmVnOworICAgIH0KKworI2lmIGRlZmluZWQgX0dMSUJDWFhfTE9OR19ET1VCTEVfQ09NUEFUICYmIGRlZmluZWQgX19MT05HX0RPVUJMRV8xMjhfXworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgX0luSXRlcgorICAgIG51bV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgX19kb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBkb3VibGUmIF9fdikgY29uc3QKKyAgICB7CisgICAgICBzdHJpbmcgX194dHJjOworICAgICAgX194dHJjLnJlc2VydmUoMzIpOworICAgICAgX19iZWcgPSBfTV9leHRyYWN0X2Zsb2F0KF9fYmVnLCBfX2VuZCwgX19pbywgX19lcnIsIF9feHRyYyk7CisgICAgICBzdGQ6Ol9fY29udmVydF90b192KF9feHRyYy5jX3N0cigpLCBfX3YsIF9fZXJyLCBfU19nZXRfY19sb2NhbGUoKSk7CisgICAgICBpZiAoX19iZWcgPT0gX19lbmQpCisJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgX0luSXRlcgorICAgIG51bV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKyAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nIGRvdWJsZSYgX192KSBjb25zdAorICAgIHsKKyAgICAgIHN0cmluZyBfX3h0cmM7CisgICAgICBfX3h0cmMucmVzZXJ2ZSgzMik7CisgICAgICBfX2JlZyA9IF9NX2V4dHJhY3RfZmxvYXQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX194dHJjKTsKKyAgICAgIHN0ZDo6X19jb252ZXJ0X3RvX3YoX194dHJjLmNfc3RyKCksIF9fdiwgX19lcnIsIF9TX2dldF9jX2xvY2FsZSgpKTsKKyAgICAgIGlmIChfX2JlZyA9PSBfX2VuZCkKKwlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgcmV0dXJuIF9fYmVnOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgX0luSXRlcgorICAgIG51bV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKyAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB2b2lkKiYgX192KSBjb25zdAorICAgIHsKKyAgICAgIC8vIFByZXBhcmUgZm9yIGhleCBmb3JtYXR0ZWQgaW5wdXQuCisgICAgICB0eXBlZGVmIGlvc19iYXNlOjpmbXRmbGFncyAgICAgICAgZm10ZmxhZ3M7CisgICAgICBjb25zdCBmbXRmbGFncyBfX2ZtdCA9IF9faW8uZmxhZ3MoKTsKKyAgICAgIF9faW8uZmxhZ3MoKF9fZm10ICYgfmlvc19iYXNlOjpiYXNlZmllbGQpIHwgaW9zX2Jhc2U6OmhleCk7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX2NvbmRpdGlvbmFsX3R5cGU8KHNpemVvZih2b2lkKikKKwkJCQkJICAgICA8PSBzaXplb2YodW5zaWduZWQgbG9uZykpLAorCXVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZz46Ol9fdHlwZSBfVUludFB0clR5cGU7ICAgICAgIAorCisgICAgICBfVUludFB0clR5cGUgX191bDsKKyAgICAgIF9fYmVnID0gX01fZXh0cmFjdF9pbnQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX191bCk7CisKKyAgICAgIC8vIFJlc2V0IGZyb20gaGV4IGZvcm1hdHRlZCBpbnB1dC4KKyAgICAgIF9faW8uZmxhZ3MoX19mbXQpOworCisgICAgICBfX3YgPSByZWludGVycHJldF9jYXN0PHZvaWQqPihfX3VsKTsKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisKKyAgLy8gRm9yIHVzZSBieSBpbnRlZ2VyIGFuZCBmbG9hdGluZy1wb2ludCB0eXBlcyBhZnRlciB0aGV5IGhhdmUgYmVlbgorICAvLyBjb252ZXJ0ZWQgaW50byBhIGNoYXJfdHlwZSBzdHJpbmcuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgdm9pZAorICAgIG51bV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OgorICAgIF9NX3BhZChfQ2hhclQgX19maWxsLCBzdHJlYW1zaXplIF9fdywgaW9zX2Jhc2UmIF9faW8sCisJICAgX0NoYXJUKiBfX25ldywgY29uc3QgX0NoYXJUKiBfX2NzLCBpbnQmIF9fbGVuKSBjb25zdAorICAgIHsKKyAgICAgIC8vIFsyMi4yLjIuMi4yXSBTdGFnZSAzLgorICAgICAgLy8gSWYgbmVjZXNzYXJ5LCBwYWQuCisgICAgICBfX3BhZDxfQ2hhclQsIGNoYXJfdHJhaXRzPF9DaGFyVD4gPjo6X1NfcGFkKF9faW8sIF9fZmlsbCwgX19uZXcsCisJCQkJCQkgIF9fY3MsIF9fdywgX19sZW4pOworICAgICAgX19sZW4gPSBzdGF0aWNfY2FzdDxpbnQ+KF9fdyk7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0xEQkwKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9WYWx1ZVQ+CisgICAgaW50CisgICAgX19pbnRfdG9fY2hhcihfQ2hhclQqIF9fYnVmZW5kLCBfVmFsdWVUIF9fdiwgY29uc3QgX0NoYXJUKiBfX2xpdCwKKwkJICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncywgYm9vbCBfX2RlYykKKyAgICB7CisgICAgICBfQ2hhclQqIF9fYnVmID0gX19idWZlbmQ7CisgICAgICBpZiAoX19idWlsdGluX2V4cGVjdChfX2RlYywgdHJ1ZSkpCisJeworCSAgLy8gRGVjaW1hbC4KKwkgIGRvCisJICAgIHsKKwkgICAgICAqLS1fX2J1ZiA9IF9fbGl0WyhfX3YgJSAxMCkgKyBfX251bV9iYXNlOjpfU19vZGlnaXRzXTsKKwkgICAgICBfX3YgLz0gMTA7CisJICAgIH0KKwkgIHdoaWxlIChfX3YgIT0gMCk7CisJfQorICAgICAgZWxzZSBpZiAoKF9fZmxhZ3MgJiBpb3NfYmFzZTo6YmFzZWZpZWxkKSA9PSBpb3NfYmFzZTo6b2N0KQorCXsKKwkgIC8vIE9jdGFsLgorCSAgZG8KKwkgICAgeworCSAgICAgICotLV9fYnVmID0gX19saXRbKF9fdiAmIDB4NykgKyBfX251bV9iYXNlOjpfU19vZGlnaXRzXTsKKwkgICAgICBfX3YgPj49IDM7CisJICAgIH0KKwkgIHdoaWxlIChfX3YgIT0gMCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8vIEhleC4KKwkgIGNvbnN0IGJvb2wgX191cHBlcmNhc2UgPSBfX2ZsYWdzICYgaW9zX2Jhc2U6OnVwcGVyY2FzZTsKKwkgIGNvbnN0IGludCBfX2Nhc2Vfb2Zmc2V0ID0gX191cHBlcmNhc2UgPyBfX251bV9iYXNlOjpfU19vdWRpZ2l0cworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fbnVtX2Jhc2U6Ol9TX29kaWdpdHM7CisJICBkbworCSAgICB7CisJICAgICAgKi0tX19idWYgPSBfX2xpdFsoX192ICYgMHhmKSArIF9fY2FzZV9vZmZzZXRdOworCSAgICAgIF9fdiA+Pj0gNDsKKwkgICAgfQorCSAgd2hpbGUgKF9fdiAhPSAwKTsKKwl9CisgICAgICByZXR1cm4gX19idWZlbmQgLSBfX2J1ZjsKKyAgICB9CisKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9MREJMCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICB2b2lkCisgICAgbnVtX3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6CisgICAgX01fZ3JvdXBfaW50KGNvbnN0IGNoYXIqIF9fZ3JvdXBpbmcsIHNpemVfdCBfX2dyb3VwaW5nX3NpemUsIF9DaGFyVCBfX3NlcCwKKwkJIGlvc19iYXNlJiwgX0NoYXJUKiBfX25ldywgX0NoYXJUKiBfX2NzLCBpbnQmIF9fbGVuKSBjb25zdAorICAgIHsKKyAgICAgIF9DaGFyVCogX19wID0gc3RkOjpfX2FkZF9ncm91cGluZyhfX25ldywgX19zZXAsIF9fZ3JvdXBpbmcsCisJCQkJCV9fZ3JvdXBpbmdfc2l6ZSwgX19jcywgX19jcyArIF9fbGVuKTsKKyAgICAgIF9fbGVuID0gX19wIC0gX19uZXc7CisgICAgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWVUPgorICAgICAgX091dEl0ZXIKKyAgICAgIG51bV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OgorICAgICAgX01faW5zZXJ0X2ludChfT3V0SXRlciBfX3MsIGlvc19iYXNlJiBfX2lvLCBfQ2hhclQgX19maWxsLAorCQkgICAgX1ZhbHVlVCBfX3YpIGNvbnN0CisgICAgICB7CisJdXNpbmcgX19nbnVfY3h4OjpfX2FkZF91bnNpZ25lZDsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fYWRkX3Vuc2lnbmVkPF9WYWx1ZVQ+OjpfX3R5cGUgX191bnNpZ25lZF90eXBlOworCXR5cGVkZWYgX19udW1wdW5jdF9jYWNoZTxfQ2hhclQ+CSAgICAgICAgICAgICBfX2NhY2hlX3R5cGU7CisJX191c2VfY2FjaGU8X19jYWNoZV90eXBlPiBfX3VjOworCWNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworCWNvbnN0IF9fY2FjaGVfdHlwZSogX19sYyA9IF9fdWMoX19sb2MpOworCWNvbnN0IF9DaGFyVCogX19saXQgPSBfX2xjLT5fTV9hdG9tc19vdXQ7CisJY29uc3QgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lvLmZsYWdzKCk7CisKKwkvLyBMb25nIGVub3VnaCB0byBob2xkIGhleCwgZGVjLCBhbmQgb2N0YWwgcmVwcmVzZW50YXRpb25zLgorCWNvbnN0IGludCBfX2lsZW4gPSA1ICogc2l6ZW9mKF9WYWx1ZVQpOworCV9DaGFyVCogX19jcyA9IHN0YXRpY19jYXN0PF9DaGFyVCo+KF9fYnVpbHRpbl9hbGxvY2Eoc2l6ZW9mKF9DaGFyVCkKKwkJCQkJCQkgICAgICogX19pbGVuKSk7CisKKwkvLyBbMjIuMi4yLjIuMl0gU3RhZ2UgMSwgbnVtZXJpYyBjb252ZXJzaW9uIHRvIGNoYXJhY3Rlci4KKwkvLyBSZXN1bHQgaXMgcmV0dXJuZWQgcmlnaHQtanVzdGlmaWVkIGluIHRoZSBidWZmZXIuCisJY29uc3QgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fYmFzZWZpZWxkID0gX19mbGFncyAmIGlvc19iYXNlOjpiYXNlZmllbGQ7CisJY29uc3QgYm9vbCBfX2RlYyA9IChfX2Jhc2VmaWVsZCAhPSBpb3NfYmFzZTo6b2N0CisJCQkgICAgJiYgX19iYXNlZmllbGQgIT0gaW9zX2Jhc2U6OmhleCk7CisJY29uc3QgX191bnNpZ25lZF90eXBlIF9fdSA9ICgoX192ID4gMCB8fCAhX19kZWMpCisJCQkJICAgICA/IF9fdW5zaWduZWRfdHlwZShfX3YpCisJCQkJICAgICA6IC1fX3Vuc2lnbmVkX3R5cGUoX192KSk7CisgCWludCBfX2xlbiA9IF9faW50X3RvX2NoYXIoX19jcyArIF9faWxlbiwgX191LCBfX2xpdCwgX19mbGFncywgX19kZWMpOworCV9fY3MgKz0gX19pbGVuIC0gX19sZW47CisKKwkvLyBBZGQgZ3JvdXBpbmcsIGlmIG5lY2Vzc2FyeS4KKwlpZiAoX19sYy0+X01fdXNlX2dyb3VwaW5nKQorCSAgeworCSAgICAvLyBHcm91cGluZyBjYW4gYWRkIChhbG1vc3QpIGFzIG1hbnkgc2VwYXJhdG9ycyBhcyB0aGUgbnVtYmVyCisJICAgIC8vIG9mIGRpZ2l0cyArIHNwYWNlIGlzIHJlc2VydmVkIGZvciBudW1lcmljIGJhc2Ugb3Igc2lnbi4KKwkgICAgX0NoYXJUKiBfX2NzMiA9IHN0YXRpY19jYXN0PF9DaGFyVCo+KF9fYnVpbHRpbl9hbGxvY2Eoc2l6ZW9mKF9DaGFyVCkKKwkJCQkJCQkJICAqIChfX2xlbiArIDEpCisJCQkJCQkJCSAgKiAyKSk7CisJICAgIF9NX2dyb3VwX2ludChfX2xjLT5fTV9ncm91cGluZywgX19sYy0+X01fZ3JvdXBpbmdfc2l6ZSwKKwkJCSBfX2xjLT5fTV90aG91c2FuZHNfc2VwLCBfX2lvLCBfX2NzMiArIDIsIF9fY3MsIF9fbGVuKTsKKwkgICAgX19jcyA9IF9fY3MyICsgMjsKKwkgIH0KKworCS8vIENvbXBsZXRlIFN0YWdlIDEsIHByZXBlbmQgbnVtZXJpYyBiYXNlIG9yIHNpZ24uCisJaWYgKF9fYnVpbHRpbl9leHBlY3QoX19kZWMsIHRydWUpKQorCSAgeworCSAgICAvLyBEZWNpbWFsLgorCSAgICBpZiAoX192ID49IDApCisJICAgICAgeworCQlpZiAoYm9vbChfX2ZsYWdzICYgaW9zX2Jhc2U6OnNob3dwb3MpCisJCSAgICAmJiBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1ZhbHVlVD46Ol9faXNfc2lnbmVkKQorCQkgICotLV9fY3MgPSBfX2xpdFtfX251bV9iYXNlOjpfU19vcGx1c10sICsrX19sZW47CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgKi0tX19jcyA9IF9fbGl0W19fbnVtX2Jhc2U6Ol9TX29taW51c10sICsrX19sZW47CisJICB9CisJZWxzZSBpZiAoYm9vbChfX2ZsYWdzICYgaW9zX2Jhc2U6OnNob3diYXNlKSAmJiBfX3YpCisJICB7CisJICAgIGlmIChfX2Jhc2VmaWVsZCA9PSBpb3NfYmFzZTo6b2N0KQorCSAgICAgICotLV9fY3MgPSBfX2xpdFtfX251bV9iYXNlOjpfU19vZGlnaXRzXSwgKytfX2xlbjsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJLy8gJ3gnIG9yICdYJworCQljb25zdCBib29sIF9fdXBwZXJjYXNlID0gX19mbGFncyAmIGlvc19iYXNlOjp1cHBlcmNhc2U7CisJCSotLV9fY3MgPSBfX2xpdFtfX251bV9iYXNlOjpfU19veCArIF9fdXBwZXJjYXNlXTsKKwkJLy8gJzAnCisJCSotLV9fY3MgPSBfX2xpdFtfX251bV9iYXNlOjpfU19vZGlnaXRzXTsKKwkJX19sZW4gKz0gMjsKKwkgICAgICB9CisJICB9CisKKwkvLyBQYWQuCisJY29uc3Qgc3RyZWFtc2l6ZSBfX3cgPSBfX2lvLndpZHRoKCk7CisJaWYgKF9fdyA+IHN0YXRpY19jYXN0PHN0cmVhbXNpemU+KF9fbGVuKSkKKwkgIHsKKwkgICAgX0NoYXJUKiBfX2NzMyA9IHN0YXRpY19jYXN0PF9DaGFyVCo+KF9fYnVpbHRpbl9hbGxvY2Eoc2l6ZW9mKF9DaGFyVCkKKwkJCQkJCQkJICAqIF9fdykpOworCSAgICBfTV9wYWQoX19maWxsLCBfX3csIF9faW8sIF9fY3MzLCBfX2NzLCBfX2xlbik7CisJICAgIF9fY3MgPSBfX2NzMzsKKwkgIH0KKwlfX2lvLndpZHRoKDApOworCisJLy8gWzIyLjIuMi4yLjJdIFN0YWdlIDQuCisJLy8gV3JpdGUgcmVzdWx0aW5nLCBmdWxseS1mb3JtYXR0ZWQgc3RyaW5nIHRvIG91dHB1dCBpdGVyYXRvci4KKwlyZXR1cm4gc3RkOjpfX3dyaXRlKF9fcywgX19jcywgX19sZW4pOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgdm9pZAorICAgIG51bV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OgorICAgIF9NX2dyb3VwX2Zsb2F0KGNvbnN0IGNoYXIqIF9fZ3JvdXBpbmcsIHNpemVfdCBfX2dyb3VwaW5nX3NpemUsCisJCSAgIF9DaGFyVCBfX3NlcCwgY29uc3QgX0NoYXJUKiBfX3AsIF9DaGFyVCogX19uZXcsCisJCSAgIF9DaGFyVCogX19jcywgaW50JiBfX2xlbikgY29uc3QKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyODIuIFdoYXQgdHlwZXMgZG9lcyBudW1wdW5jdCBncm91cGluZyByZWZlciB0bz8KKyAgICAgIC8vIEFkZCBncm91cGluZywgaWYgbmVjZXNzYXJ5LgorICAgICAgY29uc3QgaW50IF9fZGVjbGVuID0gX19wID8gX19wIC0gX19jcyA6IF9fbGVuOworICAgICAgX0NoYXJUKiBfX3AyID0gc3RkOjpfX2FkZF9ncm91cGluZyhfX25ldywgX19zZXAsIF9fZ3JvdXBpbmcsCisJCQkJCSBfX2dyb3VwaW5nX3NpemUsCisJCQkJCSBfX2NzLCBfX2NzICsgX19kZWNsZW4pOworCisgICAgICAvLyBUYWNrIG9uIGRlY2ltYWwgcGFydC4KKyAgICAgIGludCBfX25ld2xlbiA9IF9fcDIgLSBfX25ldzsKKyAgICAgIGlmIChfX3ApCisJeworCSAgY2hhcl90cmFpdHM8X0NoYXJUPjo6Y29weShfX3AyLCBfX3AsIF9fbGVuIC0gX19kZWNsZW4pOworCSAgX19uZXdsZW4gKz0gX19sZW4gLSBfX2RlY2xlbjsKKwl9CisgICAgICBfX2xlbiA9IF9fbmV3bGVuOworICAgIH0KKworICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgdXNlcyB2c25wcmludGYgKG9yIHZzcHJpbnRmKCksIHdoZW4KKyAgLy8gX0dMSUJDWFhfVVNFX0M5OSBpcyBub3QgZGVmaW5lZCkgdG8gY29udmVydCBmbG9hdGluZyBwb2ludCB2YWx1ZXMKKyAgLy8gZm9yIGluc2VydGlvbiBpbnRvIGEgc3RyZWFtLiAgQW4gb3B0aW1pemF0aW9uIHdvdWxkIGJlIHRvIHJlcGxhY2UKKyAgLy8gdGhlbSB3aXRoIGNvZGUgdGhhdCB3b3JrcyBkaXJlY3RseSBvbiBhIHdpZGUgYnVmZmVyIGFuZCB0aGVuIHVzZQorICAvLyBfX3BhZCB0byBkbyB0aGUgcGFkZGluZy4gIEl0IHdvdWxkIGJlIGdvb2QgdG8gcmVwbGFjZSB0aGVtIGFueXdheQorICAvLyB0byBnYWluIGJhY2sgdGhlIGVmZmljaWVuY3kgdGhhdCBDKysgcHJvdmlkZXMgYnkga25vd2luZyB1cCBmcm9udAorICAvLyB0aGUgdHlwZSBvZiB0aGUgdmFsdWVzIHRvIGluc2VydC4gIEFsc28sIHNwcmludGYgaXMgZGFuZ2Vyb3VzCisgIC8vIHNpbmNlIG1heSBsZWFkIHRvIGFjY2lkZW50YWwgYnVmZmVyIG92ZXJydW5zLiAgVGhpcworICAvLyBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBDKysgc3RhbmRhcmQgZmFpcmx5IGRpcmVjdGx5IGFzCisgIC8vIG91dGxpbmVkIGluIDIyLjIuMi4yIFtsaWIubG9jYWxlLm51bS5wdXRdCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlVD4KKyAgICAgIF9PdXRJdGVyCisgICAgICBudW1fcHV0PF9DaGFyVCwgX091dEl0ZXI+OjoKKyAgICAgIF9NX2luc2VydF9mbG9hdChfT3V0SXRlciBfX3MsIGlvc19iYXNlJiBfX2lvLCBfQ2hhclQgX19maWxsLCBjaGFyIF9fbW9kLAorCQkgICAgICAgX1ZhbHVlVCBfX3YpIGNvbnN0CisgICAgICB7CisJdHlwZWRlZiBfX251bXB1bmN0X2NhY2hlPF9DaGFyVD4gICAgICAgICAgICAgICAgX19jYWNoZV90eXBlOworCV9fdXNlX2NhY2hlPF9fY2FjaGVfdHlwZT4gX191YzsKKwljb25zdCBsb2NhbGUmIF9fbG9jID0gX19pby5fTV9nZXRsb2MoKTsKKwljb25zdCBfX2NhY2hlX3R5cGUqIF9fbGMgPSBfX3VjKF9fbG9jKTsKKworCS8vIFVzZSBkZWZhdWx0IHByZWNpc2lvbiBpZiBvdXQgb2YgcmFuZ2UuCisJY29uc3Qgc3RyZWFtc2l6ZSBfX3ByZWMgPSBfX2lvLnByZWNpc2lvbigpIDwgMCA/IDYgOiBfX2lvLnByZWNpc2lvbigpOworCisJY29uc3QgaW50IF9fbWF4X2RpZ2l0cyA9CisJICBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1ZhbHVlVD46Ol9fZGlnaXRzMTA7CisKKwkvLyBbMjIuMi4yLjIuMl0gU3RhZ2UgMSwgbnVtZXJpYyBjb252ZXJzaW9uIHRvIGNoYXJhY3Rlci4KKwlpbnQgX19sZW47CisJLy8gTG9uZyBlbm91Z2ggZm9yIHRoZSBtYXggZm9ybWF0IHNwZWMuCisJY2hhciBfX2ZidWZbMTZdOworCV9fbnVtX2Jhc2U6Ol9TX2Zvcm1hdF9mbG9hdChfX2lvLCBfX2ZidWYsIF9fbW9kKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTkKKwkvLyBGaXJzdCB0cnkgYSBidWZmZXIgcGVyaGFwcyBiaWcgZW5vdWdoIChtb3N0IHByb2JhYmx5IHN1ZmZpY2llbnQKKwkvLyBmb3Igbm9uLWlvc19iYXNlOjpmaXhlZCBvdXRwdXRzKQorCWludCBfX2NzX3NpemUgPSBfX21heF9kaWdpdHMgKiAzOworCWNoYXIqIF9fY3MgPSBzdGF0aWNfY2FzdDxjaGFyKj4oX19idWlsdGluX2FsbG9jYShfX2NzX3NpemUpKTsKKwlfX2xlbiA9IHN0ZDo6X19jb252ZXJ0X2Zyb21fdihfU19nZXRfY19sb2NhbGUoKSwgX19jcywgX19jc19zaXplLAorCQkJCSAgICAgIF9fZmJ1ZiwgX19wcmVjLCBfX3YpOworCisJLy8gSWYgdGhlIGJ1ZmZlciB3YXMgbm90IGxhcmdlIGVub3VnaCwgdHJ5IGFnYWluIHdpdGggdGhlIGNvcnJlY3Qgc2l6ZS4KKwlpZiAoX19sZW4gPj0gX19jc19zaXplKQorCSAgeworCSAgICBfX2NzX3NpemUgPSBfX2xlbiArIDE7CisJICAgIF9fY3MgPSBzdGF0aWNfY2FzdDxjaGFyKj4oX19idWlsdGluX2FsbG9jYShfX2NzX3NpemUpKTsKKwkgICAgX19sZW4gPSBzdGQ6Ol9fY29udmVydF9mcm9tX3YoX1NfZ2V0X2NfbG9jYWxlKCksIF9fY3MsIF9fY3Nfc2l6ZSwKKwkJCQkJICBfX2ZidWYsIF9fcHJlYywgX192KTsKKwkgIH0KKyNlbHNlCisJLy8gQ29uc2lkZXIgdGhlIHBvc3NpYmlsaXR5IG9mIGxvbmcgaW9zX2Jhc2U6OmZpeGVkIG91dHB1dHMKKwljb25zdCBib29sIF9fZml4ZWQgPSBfX2lvLmZsYWdzKCkgJiBpb3NfYmFzZTo6Zml4ZWQ7CisJY29uc3QgaW50IF9fbWF4X2V4cCA9CisJICBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1ZhbHVlVD46Ol9fbWF4X2V4cG9uZW50MTA7CisKKwkvLyBUaGUgc2l6ZSBvZiB0aGUgb3V0cHV0IHN0cmluZyBpcyBjb21wdXRlZCBhcyBmb2xsb3dzLgorCS8vIGlvc19iYXNlOjpmaXhlZCBvdXRwdXRzIG1heSBuZWVkIHVwIHRvIF9fbWF4X2V4cCArIDEgY2hhcnMKKwkvLyBmb3IgdGhlIGludGVnZXIgcGFydCArIF9fcHJlYyBjaGFycyBmb3IgdGhlIGZyYWN0aW9uYWwgcGFydAorCS8vICsgMyBjaGFycyBmb3Igc2lnbiwgZGVjaW1hbCBwb2ludCwgJ1wwJy4gT24gdGhlIG90aGVyIGhhbmQsCisJLy8gZm9yIG5vbi1maXhlZCBvdXRwdXRzIF9fbWF4X2RpZ2l0cyAqIDIgKyBfX3ByZWMgY2hhcnMgYXJlCisJLy8gbGFyZ2VseSBzdWZmaWNpZW50LgorCWNvbnN0IGludCBfX2NzX3NpemUgPSBfX2ZpeGVkID8gX19tYXhfZXhwICsgX19wcmVjICsgNAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19tYXhfZGlnaXRzICogMiArIF9fcHJlYzsKKwljaGFyKiBfX2NzID0gc3RhdGljX2Nhc3Q8Y2hhcio+KF9fYnVpbHRpbl9hbGxvY2EoX19jc19zaXplKSk7CisJX19sZW4gPSBzdGQ6Ol9fY29udmVydF9mcm9tX3YoX1NfZ2V0X2NfbG9jYWxlKCksIF9fY3MsIDAsIF9fZmJ1ZiwgCisJCQkJICAgICAgX19wcmVjLCBfX3YpOworI2VuZGlmCisKKwkvLyBbMjIuMi4yLjIuMl0gU3RhZ2UgMiwgY29udmVydCB0byBjaGFyX3R5cGUsIHVzaW5nIGNvcnJlY3QKKwkvLyBudW1wdW5jdC5kZWNpbWFsX3BvaW50KCkgdmFsdWVzIGZvciAnLicgYW5kIGFkZGluZyBncm91cGluZy4KKwljb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0eXBlID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYyk7CisJCisJX0NoYXJUKiBfX3dzID0gc3RhdGljX2Nhc3Q8X0NoYXJUKj4oX19idWlsdGluX2FsbG9jYShzaXplb2YoX0NoYXJUKQorCQkJCQkJCSAgICAgKiBfX2xlbikpOworCV9fY3R5cGUud2lkZW4oX19jcywgX19jcyArIF9fbGVuLCBfX3dzKTsKKwkKKwkvLyBSZXBsYWNlIGRlY2ltYWwgcG9pbnQuCisJX0NoYXJUKiBfX3dwID0gMDsKKwljb25zdCBjaGFyKiBfX3AgPSBjaGFyX3RyYWl0czxjaGFyPjo6ZmluZChfX2NzLCBfX2xlbiwgJy4nKTsKKwlpZiAoX19wKQorCSAgeworCSAgICBfX3dwID0gX193cyArIChfX3AgLSBfX2NzKTsKKwkgICAgKl9fd3AgPSBfX2xjLT5fTV9kZWNpbWFsX3BvaW50OworCSAgfQorCQorCS8vIEFkZCBncm91cGluZywgaWYgbmVjZXNzYXJ5LgorCS8vIE4uQi4gTWFrZSBzdXJlIHRvIG5vdCBncm91cCB0aGluZ3MgbGlrZSAyZTIwLCBpLmUuLCBubyBkZWNpbWFsCisJLy8gcG9pbnQsIHNjaWVudGlmaWMgbm90YXRpb24uCisJaWYgKF9fbGMtPl9NX3VzZV9ncm91cGluZworCSAgICAmJiAoX193cCB8fCBfX2xlbiA8IDMgfHwgKF9fY3NbMV0gPD0gJzknICYmIF9fY3NbMl0gPD0gJzknCisJCQkJICAgICAgJiYgX19jc1sxXSA+PSAnMCcgJiYgX19jc1syXSA+PSAnMCcpKSkKKwkgIHsKKwkgICAgLy8gR3JvdXBpbmcgY2FuIGFkZCAoYWxtb3N0KSBhcyBtYW55IHNlcGFyYXRvcnMgYXMgdGhlCisJICAgIC8vIG51bWJlciBvZiBkaWdpdHMsIGJ1dCBubyBtb3JlLgorCSAgICBfQ2hhclQqIF9fd3MyID0gc3RhdGljX2Nhc3Q8X0NoYXJUKj4oX19idWlsdGluX2FsbG9jYShzaXplb2YoX0NoYXJUKQorCQkJCQkJCQkgICogX19sZW4gKiAyKSk7CisJICAgIAorCSAgICBzdHJlYW1zaXplIF9fb2ZmID0gMDsKKwkgICAgaWYgKF9fY3NbMF0gPT0gJy0nIHx8IF9fY3NbMF0gPT0gJysnKQorCSAgICAgIHsKKwkJX19vZmYgPSAxOworCQlfX3dzMlswXSA9IF9fd3NbMF07CisJCV9fbGVuIC09IDE7CisJICAgICAgfQorCSAgICAKKwkgICAgX01fZ3JvdXBfZmxvYXQoX19sYy0+X01fZ3JvdXBpbmcsIF9fbGMtPl9NX2dyb3VwaW5nX3NpemUsCisJCQkgICBfX2xjLT5fTV90aG91c2FuZHNfc2VwLCBfX3dwLCBfX3dzMiArIF9fb2ZmLAorCQkJICAgX193cyArIF9fb2ZmLCBfX2xlbik7CisJICAgIF9fbGVuICs9IF9fb2ZmOworCSAgICAKKwkgICAgX193cyA9IF9fd3MyOworCSAgfQorCisJLy8gUGFkLgorCWNvbnN0IHN0cmVhbXNpemUgX193ID0gX19pby53aWR0aCgpOworCWlmIChfX3cgPiBzdGF0aWNfY2FzdDxzdHJlYW1zaXplPihfX2xlbikpCisJICB7CisJICAgIF9DaGFyVCogX193czMgPSBzdGF0aWNfY2FzdDxfQ2hhclQqPihfX2J1aWx0aW5fYWxsb2NhKHNpemVvZihfQ2hhclQpCisJCQkJCQkJCSAgKiBfX3cpKTsKKwkgICAgX01fcGFkKF9fZmlsbCwgX193LCBfX2lvLCBfX3dzMywgX193cywgX19sZW4pOworCSAgICBfX3dzID0gX193czM7CisJICB9CisJX19pby53aWR0aCgwKTsKKwkKKwkvLyBbMjIuMi4yLjIuMl0gU3RhZ2UgNC4KKwkvLyBXcml0ZSByZXN1bHRpbmcsIGZ1bGx5LWZvcm1hdHRlZCBzdHJpbmcgdG8gb3V0cHV0IGl0ZXJhdG9yLgorCXJldHVybiBzdGQ6Ol9fd3JpdGUoX19zLCBfX3dzLCBfX2xlbik7CisgICAgICB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgorICAgIF9PdXRJdGVyCisgICAgbnVtX3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6CisgICAgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLCBib29sIF9fdikgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faW8uZmxhZ3MoKTsKKyAgICAgIGlmICgoX19mbGFncyAmIGlvc19iYXNlOjpib29sYWxwaGEpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBsb25nIF9fbCA9IF9fdjsKKyAgICAgICAgICBfX3MgPSBfTV9pbnNlcnRfaW50KF9fcywgX19pbywgX19maWxsLCBfX2wpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIHR5cGVkZWYgX19udW1wdW5jdF9jYWNoZTxfQ2hhclQ+ICAgICAgICAgICAgICBfX2NhY2hlX3R5cGU7CisJICBfX3VzZV9jYWNoZTxfX2NhY2hlX3R5cGU+IF9fdWM7CisJICBjb25zdCBsb2NhbGUmIF9fbG9jID0gX19pby5fTV9nZXRsb2MoKTsKKwkgIGNvbnN0IF9fY2FjaGVfdHlwZSogX19sYyA9IF9fdWMoX19sb2MpOworCisJICBjb25zdCBfQ2hhclQqIF9fbmFtZSA9IF9fdiA/IF9fbGMtPl9NX3RydWVuYW1lCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fbGMtPl9NX2ZhbHNlbmFtZTsKKwkgIGludCBfX2xlbiA9IF9fdiA/IF9fbGMtPl9NX3RydWVuYW1lX3NpemUKKwkgICAgICAgICAgICAgICAgICA6IF9fbGMtPl9NX2ZhbHNlbmFtZV9zaXplOworCisJICBjb25zdCBzdHJlYW1zaXplIF9fdyA9IF9faW8ud2lkdGgoKTsKKwkgIGlmIChfX3cgPiBzdGF0aWNfY2FzdDxzdHJlYW1zaXplPihfX2xlbikpCisJICAgIHsKKwkgICAgICBjb25zdCBzdHJlYW1zaXplIF9fcGxlbiA9IF9fdyAtIF9fbGVuOworCSAgICAgIF9DaGFyVCogX19wcworCQk9IHN0YXRpY19jYXN0PF9DaGFyVCo+KF9fYnVpbHRpbl9hbGxvY2Eoc2l6ZW9mKF9DaGFyVCkKKwkJCQkJCQkqIF9fcGxlbikpOworCisJICAgICAgY2hhcl90cmFpdHM8X0NoYXJUPjo6YXNzaWduKF9fcHMsIF9fcGxlbiwgX19maWxsKTsKKwkgICAgICBfX2lvLndpZHRoKDApOworCisJICAgICAgaWYgKChfX2ZsYWdzICYgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKSA9PSBpb3NfYmFzZTo6bGVmdCkKKwkJeworCQkgIF9fcyA9IHN0ZDo6X193cml0ZShfX3MsIF9fbmFtZSwgX19sZW4pOworCQkgIF9fcyA9IHN0ZDo6X193cml0ZShfX3MsIF9fcHMsIF9fcGxlbik7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBfX3MgPSBzdGQ6Ol9fd3JpdGUoX19zLCBfX3BzLCBfX3BsZW4pOworCQkgIF9fcyA9IHN0ZDo6X193cml0ZShfX3MsIF9fbmFtZSwgX19sZW4pOworCQl9CisJICAgICAgcmV0dXJuIF9fczsKKwkgICAgfQorCSAgX19pby53aWR0aCgwKTsKKwkgIF9fcyA9IHN0ZDo6X193cml0ZShfX3MsIF9fbmFtZSwgX19sZW4pOworCX0KKyAgICAgIHJldHVybiBfX3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgX091dEl0ZXIKKyAgICBudW1fcHV0PF9DaGFyVCwgX091dEl0ZXI+OjoKKyAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsIGRvdWJsZSBfX3YpIGNvbnN0CisgICAgeyByZXR1cm4gX01faW5zZXJ0X2Zsb2F0KF9fcywgX19pbywgX19maWxsLCBjaGFyKCksIF9fdik7IH0KKworI2lmIGRlZmluZWQgX0dMSUJDWFhfTE9OR19ET1VCTEVfQ09NUEFUICYmIGRlZmluZWQgX19MT05HX0RPVUJMRV8xMjhfXworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgorICAgIF9PdXRJdGVyCisgICAgbnVtX3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6CisgICAgX19kb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsIGRvdWJsZSBfX3YpIGNvbnN0CisgICAgeyByZXR1cm4gX01faW5zZXJ0X2Zsb2F0KF9fcywgX19pbywgX19maWxsLCBjaGFyKCksIF9fdik7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgX091dEl0ZXIKKyAgICBudW1fcHV0PF9DaGFyVCwgX091dEl0ZXI+OjoKKyAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCisJICAgbG9uZyBkb3VibGUgX192KSBjb25zdAorICAgIHsgcmV0dXJuIF9NX2luc2VydF9mbG9hdChfX3MsIF9faW8sIF9fZmlsbCwgJ0wnLCBfX3YpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICBfT3V0SXRlcgorICAgIG51bV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OgorICAgIGRvX3B1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwKKyAgICAgICAgICAgY29uc3Qgdm9pZCogX192KSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pby5mbGFncygpOworICAgICAgY29uc3QgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZm10ID0gfihpb3NfYmFzZTo6YmFzZWZpZWxkCisJCQkJCSB8IGlvc19iYXNlOjp1cHBlcmNhc2UpOworICAgICAgX19pby5mbGFncygoX19mbGFncyAmIF9fZm10KSB8IChpb3NfYmFzZTo6aGV4IHwgaW9zX2Jhc2U6OnNob3diYXNlKSk7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX2NvbmRpdGlvbmFsX3R5cGU8KHNpemVvZihjb25zdCB2b2lkKikKKwkJCQkJICAgICA8PSBzaXplb2YodW5zaWduZWQgbG9uZykpLAorCXVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZz46Ol9fdHlwZSBfVUludFB0clR5cGU7ICAgICAgIAorCisgICAgICBfX3MgPSBfTV9pbnNlcnRfaW50KF9fcywgX19pbywgX19maWxsLAorCQkJICByZWludGVycHJldF9jYXN0PF9VSW50UHRyVHlwZT4oX192KSk7CisgICAgICBfX2lvLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9fczsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfTERCTAorCisgIC8vIENvbnN0cnVjdCBjb3JyZWN0bHkgcGFkZGVkIHN0cmluZywgYXMgcGVyIDIyLjIuMi4yLjIKKyAgLy8gQXNzdW1lcworICAvLyBfX25ld2xlbiA+IF9fb2xkbGVuCisgIC8vIF9fbmV3cyBpcyBhbGxvY2F0ZWQgZm9yIF9fbmV3bGVuIHNpemUKKworICAvLyBOQjogT2YgdGhlIHR3byBwYXJhbWV0ZXJzLCBfQ2hhclQgY2FuIGJlIGRlZHVjZWQgZnJvbSB0aGUKKyAgLy8gZnVuY3Rpb24gYXJndW1lbnRzLiBUaGUgb3RoZXIgKF9UcmFpdHMpIGhhcyB0byBiZSBleHBsaWNpdGx5IHNwZWNpZmllZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHZvaWQKKyAgICBfX3BhZDxfQ2hhclQsIF9UcmFpdHM+OjpfU19wYWQoaW9zX2Jhc2UmIF9faW8sIF9DaGFyVCBfX2ZpbGwsCisJCQkJICAgX0NoYXJUKiBfX25ld3MsIGNvbnN0IF9DaGFyVCogX19vbGRzLAorCQkJCSAgIHN0cmVhbXNpemUgX19uZXdsZW4sIHN0cmVhbXNpemUgX19vbGRsZW4pCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90IF9fcGxlbiA9IHN0YXRpY19jYXN0PHNpemVfdD4oX19uZXdsZW4gLSBfX29sZGxlbik7CisgICAgICBjb25zdCBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19hZGp1c3QgPSBfX2lvLmZsYWdzKCkgJiBpb3NfYmFzZTo6YWRqdXN0ZmllbGQ7CisKKyAgICAgIC8vIFBhZGRpbmcgbGFzdC4KKyAgICAgIGlmIChfX2FkanVzdCA9PSBpb3NfYmFzZTo6bGVmdCkKKwl7CisJICBfVHJhaXRzOjpjb3B5KF9fbmV3cywgX19vbGRzLCBfX29sZGxlbik7CisJICBfVHJhaXRzOjphc3NpZ24oX19uZXdzICsgX19vbGRsZW4sIF9fcGxlbiwgX19maWxsKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIHNpemVfdCBfX21vZCA9IDA7CisgICAgICBpZiAoX19hZGp1c3QgPT0gaW9zX2Jhc2U6OmludGVybmFsKQorCXsKKwkgIC8vIFBhZCBhZnRlciB0aGUgc2lnbiwgaWYgdGhlcmUgaXMgb25lLgorCSAgLy8gUGFkIGFmdGVyIDBbeFhdLCBpZiB0aGVyZSBpcyBvbmUuCisJICAvLyBXaG8gY2FtZSB1cCB3aXRoIHRoZXNlIHJ1bGVzLCBhbnl3YXk/IEplZXplLgorICAgICAgICAgIGNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworCSAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdHlwZSA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpOworCisJICBpZiAoX19jdHlwZS53aWRlbignLScpID09IF9fb2xkc1swXQorCSAgICAgIHx8IF9fY3R5cGUud2lkZW4oJysnKSA9PSBfX29sZHNbMF0pCisJICAgIHsKKwkgICAgICBfX25ld3NbMF0gPSBfX29sZHNbMF07CisJICAgICAgX19tb2QgPSAxOworCSAgICAgICsrX19uZXdzOworCSAgICB9CisJICBlbHNlIGlmIChfX2N0eXBlLndpZGVuKCcwJykgPT0gX19vbGRzWzBdCisJCSAgICYmIF9fb2xkbGVuID4gMQorCQkgICAmJiAoX19jdHlwZS53aWRlbigneCcpID09IF9fb2xkc1sxXQorCQkgICAgICAgfHwgX19jdHlwZS53aWRlbignWCcpID09IF9fb2xkc1sxXSkpCisJICAgIHsKKwkgICAgICBfX25ld3NbMF0gPSBfX29sZHNbMF07CisJICAgICAgX19uZXdzWzFdID0gX19vbGRzWzFdOworCSAgICAgIF9fbW9kID0gMjsKKwkgICAgICBfX25ld3MgKz0gMjsKKwkgICAgfQorCSAgLy8gZWxzZSBQYWRkaW5nIGZpcnN0LgorCX0KKyAgICAgIF9UcmFpdHM6OmFzc2lnbihfX25ld3MsIF9fcGxlbiwgX19maWxsKTsKKyAgICAgIF9UcmFpdHM6OmNvcHkoX19uZXdzICsgX19wbGVuLCBfX29sZHMgKyBfX21vZCwgX19vbGRsZW4gLSBfX21vZCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBfQ2hhclQqCisgICAgX19hZGRfZ3JvdXBpbmcoX0NoYXJUKiBfX3MsIF9DaGFyVCBfX3NlcCwKKwkJICAgY29uc3QgY2hhciogX19nYmVnLCBzaXplX3QgX19nc2l6ZSwKKwkJICAgY29uc3QgX0NoYXJUKiBfX2ZpcnN0LCBjb25zdCBfQ2hhclQqIF9fbGFzdCkKKyAgICB7CisgICAgICBzaXplX3QgX19pZHggPSAwOworICAgICAgc2l6ZV90IF9fY3RyID0gMDsKKworICAgICAgd2hpbGUgKF9fbGFzdCAtIF9fZmlyc3QgPiBfX2diZWdbX19pZHhdCisJICAgICAmJiBzdGF0aWNfY2FzdDxzaWduZWQgY2hhcj4oX19nYmVnW19faWR4XSkgPiAwCisJICAgICAmJiBfX2diZWdbX19pZHhdICE9IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxjaGFyPjo6X19tYXgpCisJeworCSAgX19sYXN0IC09IF9fZ2JlZ1tfX2lkeF07CisJICBfX2lkeCA8IF9fZ3NpemUgLSAxID8gKytfX2lkeCA6ICsrX19jdHI7CisJfQorCisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJKl9fcysrID0gKl9fZmlyc3QrKzsKKworICAgICAgd2hpbGUgKF9fY3RyLS0pCisJeworCSAgKl9fcysrID0gX19zZXA7CSAgCisJICBmb3IgKGNoYXIgX19pID0gX19nYmVnW19faWR4XTsgX19pID4gMDsgLS1fX2kpCisJICAgICpfX3MrKyA9ICpfX2ZpcnN0Kys7CisJfQorCisgICAgICB3aGlsZSAoX19pZHgtLSkKKwl7CisJICAqX19zKysgPSBfX3NlcDsJICAKKwkgIGZvciAoY2hhciBfX2kgPSBfX2diZWdbX19pZHhdOyBfX2kgPiAwOyAtLV9faSkKKwkgICAgKl9fcysrID0gKl9fZmlyc3QrKzsKKwl9CisKKyAgICAgIHJldHVybiBfX3M7CisgICAgfQorCisgIC8vIEluaGliaXQgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgZm9yIHJlcXVpcmVkIGluc3RhbnRpYXRpb25zLAorICAvLyB3aGljaCBhcmUgZGVmaW5lZCB2aWEgZXhwbGljaXQgaW5zdGFudGlhdGlvbnMgZWxzZXdoZXJlLgorI2lmIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURQorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgbnVtcHVuY3Q8Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBudW1wdW5jdF9ieW5hbWU8Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBfR0xJQkNYWF9OQU1FU1BBQ0VfTERCTCBudW1fZ2V0PGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgX0dMSUJDWFhfTkFNRVNQQUNFX0xEQkwgbnVtX3B1dDxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGN0eXBlX2J5bmFtZTxjaGFyPjsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBjdHlwZTxjaGFyPiYKKyAgICB1c2VfZmFjZXQ8Y3R5cGU8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBudW1wdW5jdDxjaGFyPiYKKyAgICB1c2VfZmFjZXQ8bnVtcHVuY3Q8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBudW1fcHV0PGNoYXI+JgorICAgIHVzZV9mYWNldDxudW1fcHV0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgbnVtX2dldDxjaGFyPiYKKyAgICB1c2VfZmFjZXQ8bnVtX2dldDxjaGFyPiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8Y3R5cGU8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PG51bXB1bmN0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxudW1fcHV0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxudW1fZ2V0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgbnVtcHVuY3Q8d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBudW1wdW5jdF9ieW5hbWU8d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBfR0xJQkNYWF9OQU1FU1BBQ0VfTERCTCBudW1fZ2V0PHdjaGFyX3Q+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgX0dMSUJDWFhfTkFNRVNQQUNFX0xEQkwgbnVtX3B1dDx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGN0eXBlX2J5bmFtZTx3Y2hhcl90PjsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBjdHlwZTx3Y2hhcl90PiYKKyAgICB1c2VfZmFjZXQ8Y3R5cGU8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBudW1wdW5jdDx3Y2hhcl90PiYKKyAgICB1c2VfZmFjZXQ8bnVtcHVuY3Q8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBudW1fcHV0PHdjaGFyX3Q+JgorICAgIHVzZV9mYWNldDxudW1fcHV0PHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgbnVtX2dldDx3Y2hhcl90PiYKKyAgICB1c2VfZmFjZXQ8bnVtX2dldDx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxjdHlwZTx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8bnVtcHVuY3Q8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PG51bV9wdXQ8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PG51bV9nZXQ8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKyNlbmRpZgorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvbG9jYWxlX2ZhY2V0c19ub25pby5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2xvY2FsZV9mYWNldHNfbm9uaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWIxZDJlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2xvY2FsZV9mYWNldHNfbm9uaW8uaApAQCAtMCwwICsxLDE5MDUgQEAKKy8vIExvY2FsZSBzdXBwb3J0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2xvY2FsZV9mYWNldHNfbm9uaW8uaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2xvY2FsZX0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjIuMSAgTG9jYWxlcworLy8KKworI2lmbmRlZiBfTE9DQUxFX0ZBQ0VUU19OT05JT19ICisjZGVmaW5lIF9MT0NBTEVfRkFDRVRTX05PTklPX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxjdGltZT4JLy8gRm9yIHN0cnVjdCB0bQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRpbWUgZm9ybWF0IG9yZGVyaW5nIGRhdGEuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGVudW0gcmVwcmVzZW50aW5nIGRpZmZlcmVudCBvcmRlcmluZ3Mgb2YKKyAgICogIHRpbWU6IGRheSwgbW9udGgsIGFuZCB5ZWFyLgorICAqLworICBjbGFzcyB0aW1lX2Jhc2UKKyAgeworICBwdWJsaWM6CisgICAgZW51bSBkYXRlb3JkZXIgeyBub19vcmRlciwgZG15LCBtZHksIHltZCwgeWRtIH07CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIHN0cnVjdCBfX3RpbWVwdW5jdF9jYWNoZSA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0CisgICAgeworICAgICAgLy8gTGlzdCBvZiBhbGwga25vd24gdGltZXpvbmVzLCB3aXRoIEdNVCBmaXJzdC4KKyAgICAgIHN0YXRpYyBjb25zdCBfQ2hhclQqCQlfU190aW1lem9uZXNbMTRdOworCisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fZGF0ZV9mb3JtYXQ7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fZGF0ZV9lcmFfZm9ybWF0OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX3RpbWVfZm9ybWF0OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX3RpbWVfZXJhX2Zvcm1hdDsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9kYXRlX3RpbWVfZm9ybWF0OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2RhdGVfdGltZV9lcmFfZm9ybWF0OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2FtOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX3BtOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2FtX3BtX2Zvcm1hdDsKKworICAgICAgLy8gRGF5IG5hbWVzLCBzdGFydGluZyB3aXRoICJDIidzIFN1bmRheS4KKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9kYXkxOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2RheTI7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fZGF5MzsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9kYXk0OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2RheTU7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fZGF5NjsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9kYXk3OworCisgICAgICAvLyBBYmJyZXZpYXRlZCBkYXkgbmFtZXMsIHN0YXJ0aW5nIHdpdGggIkMiJ3MgU3VuLgorICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2FkYXkxOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2FkYXkyOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2FkYXkzOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2FkYXk0OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2FkYXk1OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2FkYXk2OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2FkYXk3OworCisgICAgICAvLyBNb250aCBuYW1lcywgc3RhcnRpbmcgd2l0aCAiQyIncyBKYW51YXJ5LgorICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX21vbnRoMDE7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fbW9udGgwMjsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9tb250aDAzOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX21vbnRoMDQ7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fbW9udGgwNTsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9tb250aDA2OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX21vbnRoMDc7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fbW9udGgwODsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9tb250aDA5OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX21vbnRoMTA7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fbW9udGgxMTsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9tb250aDEyOworCisgICAgICAvLyBBYmJyZXZpYXRlZCBtb250aCBuYW1lcywgc3RhcnRpbmcgd2l0aCAiQyIncyBKYW4uCisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYW1vbnRoMDE7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYW1vbnRoMDI7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYW1vbnRoMDM7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYW1vbnRoMDQ7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYW1vbnRoMDU7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYW1vbnRoMDY7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYW1vbnRoMDc7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYW1vbnRoMDg7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYW1vbnRoMDk7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYW1vbnRoMTA7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYW1vbnRoMTE7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fYW1vbnRoMTI7CisKKyAgICAgIGJvb2wJCQkJX01fYWxsb2NhdGVkOworCisgICAgICBfX3RpbWVwdW5jdF9jYWNoZShzaXplX3QgX19yZWZzID0gMCkgOiBmYWNldChfX3JlZnMpLAorICAgICAgX01fZGF0ZV9mb3JtYXQoMCksIF9NX2RhdGVfZXJhX2Zvcm1hdCgwKSwgX01fdGltZV9mb3JtYXQoMCksCisgICAgICBfTV90aW1lX2VyYV9mb3JtYXQoMCksIF9NX2RhdGVfdGltZV9mb3JtYXQoMCksCisgICAgICBfTV9kYXRlX3RpbWVfZXJhX2Zvcm1hdCgwKSwgX01fYW0oMCksIF9NX3BtKDApLAorICAgICAgX01fYW1fcG1fZm9ybWF0KDApLCBfTV9kYXkxKDApLCBfTV9kYXkyKDApLCBfTV9kYXkzKDApLAorICAgICAgX01fZGF5NCgwKSwgX01fZGF5NSgwKSwgX01fZGF5NigwKSwgX01fZGF5NygwKSwKKyAgICAgIF9NX2FkYXkxKDApLCBfTV9hZGF5MigwKSwgX01fYWRheTMoMCksIF9NX2FkYXk0KDApLAorICAgICAgX01fYWRheTUoMCksIF9NX2FkYXk2KDApLCBfTV9hZGF5NygwKSwgX01fbW9udGgwMSgwKSwKKyAgICAgIF9NX21vbnRoMDIoMCksIF9NX21vbnRoMDMoMCksIF9NX21vbnRoMDQoMCksIF9NX21vbnRoMDUoMCksCisgICAgICBfTV9tb250aDA2KDApLCBfTV9tb250aDA3KDApLCBfTV9tb250aDA4KDApLCBfTV9tb250aDA5KDApLAorICAgICAgX01fbW9udGgxMCgwKSwgX01fbW9udGgxMSgwKSwgX01fbW9udGgxMigwKSwgX01fYW1vbnRoMDEoMCksCisgICAgICBfTV9hbW9udGgwMigwKSwgX01fYW1vbnRoMDMoMCksIF9NX2Ftb250aDA0KDApLAorICAgICAgX01fYW1vbnRoMDUoMCksIF9NX2Ftb250aDA2KDApLCBfTV9hbW9udGgwNygwKSwKKyAgICAgIF9NX2Ftb250aDA4KDApLCBfTV9hbW9udGgwOSgwKSwgX01fYW1vbnRoMTAoMCksCisgICAgICBfTV9hbW9udGgxMSgwKSwgX01fYW1vbnRoMTIoMCksIF9NX2FsbG9jYXRlZChmYWxzZSkKKyAgICAgIHsgfQorCisgICAgICB+X190aW1lcHVuY3RfY2FjaGUoKTsKKworICAgICAgdm9pZAorICAgICAgX01fY2FjaGUoY29uc3QgbG9jYWxlJiBfX2xvYyk7CisKKyAgICBwcml2YXRlOgorICAgICAgX190aW1lcHVuY3RfY2FjaGUmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX190aW1lcHVuY3RfY2FjaGUmKTsKKyAgICAgIAorICAgICAgZXhwbGljaXQKKyAgICAgIF9fdGltZXB1bmN0X2NhY2hlKGNvbnN0IF9fdGltZXB1bmN0X2NhY2hlJik7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgX190aW1lcHVuY3RfY2FjaGU8X0NoYXJUPjo6fl9fdGltZXB1bmN0X2NhY2hlKCkKKyAgICB7CisgICAgICBpZiAoX01fYWxsb2NhdGVkKQorCXsKKwkgIC8vIFVudXNlZC4KKwl9CisgICAgfQorCisgIC8vIFNwZWNpYWxpemF0aW9ucy4KKyAgdGVtcGxhdGU8PgorICAgIGNvbnN0IGNoYXIqCisgICAgX190aW1lcHVuY3RfY2FjaGU8Y2hhcj46Ol9TX3RpbWV6b25lc1sxNF07CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+CisgICAgY29uc3Qgd2NoYXJfdCoKKyAgICBfX3RpbWVwdW5jdF9jYWNoZTx3Y2hhcl90Pjo6X1NfdGltZXpvbmVzWzE0XTsKKyNlbmRpZgorCisgIC8vIEdlbmVyaWMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBjb25zdCBfQ2hhclQqIF9fdGltZXB1bmN0X2NhY2hlPF9DaGFyVD46Ol9TX3RpbWV6b25lc1sxNF07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGNsYXNzIF9fdGltZXB1bmN0IDogcHVibGljIGxvY2FsZTo6ZmFjZXQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICB0eXBlZGVmIF9DaGFyVAkJCV9fY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJUPglfX3N0cmluZ190eXBlOworICAgICAgdHlwZWRlZiBfX3RpbWVwdW5jdF9jYWNoZTxfQ2hhclQ+CV9fY2FjaGVfdHlwZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9fY2FjaGVfdHlwZSoJCQlfTV9kYXRhOworICAgICAgX19jX2xvY2FsZQkJCV9NX2NfbG9jYWxlX3RpbWVwdW5jdDsKKyAgICAgIGNvbnN0IGNoYXIqCQkJX01fbmFtZV90aW1lcHVuY3Q7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gTnVtcHVuY3QgZmFjZXQgaWQuCisgICAgICBzdGF0aWMgbG9jYWxlOjppZAkJCWlkOworCisgICAgICBleHBsaWNpdAorICAgICAgX190aW1lcHVuY3Qoc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgICBleHBsaWNpdAorICAgICAgX190aW1lcHVuY3QoX19jYWNoZV90eXBlKiBfX2NhY2hlLCBzaXplX3QgX19yZWZzID0gMCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW50ZXJuYWwgY29uc3RydWN0b3IuIE5vdCBmb3IgZ2VuZXJhbCB1c2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSBjb25zdHJ1Y3RvciBmb3IgdXNlIGJ5IHRoZSBsaWJyYXJ5IGl0c2VsZiB0byBzZXQgdXAgbmV3CisgICAgICAgKiAgbG9jYWxlcy4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fY2xvYyAgVGhlIEMgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSBfX3MgIFRoZSBuYW1lIG9mIGEgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSByZWZzICBQYXNzZWQgdG8gdGhlIGJhc2UgZmFjZXQgY2xhc3MuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIF9fdGltZXB1bmN0KF9fY19sb2NhbGUgX19jbG9jLCBjb25zdCBjaGFyKiBfX3MsIHNpemVfdCBfX3JlZnMgPSAwKTsKKworICAgICAgLy8gRklYTUU6IGZvciBlcnJvciBjaGVja2luZyBwdXJwb3NlcyBfTV9wdXQgc2hvdWxkIHJldHVybiB0aGUgcmV0dXJuCisgICAgICAvLyB2YWx1ZSBvZiBzdHJmdGltZS93Y3NmdGltZS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX3B1dChfQ2hhclQqIF9fcywgc2l6ZV90IF9fbWF4bGVuLCBjb25zdCBfQ2hhclQqIF9fZm9ybWF0LAorCSAgICAgY29uc3QgdG0qIF9fdG0pIGNvbnN0IHRocm93ICgpOworCisgICAgICB2b2lkCisgICAgICBfTV9kYXRlX2Zvcm1hdHMoY29uc3QgX0NoYXJUKiogX19kYXRlKSBjb25zdAorICAgICAgeworCS8vIEFsd2F5cyBoYXZlIGRlZmF1bHQgZmlyc3QuCisJX19kYXRlWzBdID0gX01fZGF0YS0+X01fZGF0ZV9mb3JtYXQ7CisJX19kYXRlWzFdID0gX01fZGF0YS0+X01fZGF0ZV9lcmFfZm9ybWF0OworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV90aW1lX2Zvcm1hdHMoY29uc3QgX0NoYXJUKiogX190aW1lKSBjb25zdAorICAgICAgeworCS8vIEFsd2F5cyBoYXZlIGRlZmF1bHQgZmlyc3QuCisJX190aW1lWzBdID0gX01fZGF0YS0+X01fdGltZV9mb3JtYXQ7CisJX190aW1lWzFdID0gX01fZGF0YS0+X01fdGltZV9lcmFfZm9ybWF0OworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kYXRlX3RpbWVfZm9ybWF0cyhjb25zdCBfQ2hhclQqKiBfX2R0KSBjb25zdAorICAgICAgeworCS8vIEFsd2F5cyBoYXZlIGRlZmF1bHQgZmlyc3QuCisJX19kdFswXSA9IF9NX2RhdGEtPl9NX2RhdGVfdGltZV9mb3JtYXQ7CisJX19kdFsxXSA9IF9NX2RhdGEtPl9NX2RhdGVfdGltZV9lcmFfZm9ybWF0OworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9hbV9wbV9mb3JtYXQoY29uc3QgX0NoYXJUKiBfX2FtcG0pIGNvbnN0CisgICAgICB7IF9fYW1wbSA9IF9NX2RhdGEtPl9NX2FtX3BtX2Zvcm1hdDsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9hbV9wbShjb25zdCBfQ2hhclQqKiBfX2FtcG0pIGNvbnN0CisgICAgICB7CisJX19hbXBtWzBdID0gX01fZGF0YS0+X01fYW07CisJX19hbXBtWzFdID0gX01fZGF0YS0+X01fcG07CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RheXMoY29uc3QgX0NoYXJUKiogX19kYXlzKSBjb25zdAorICAgICAgeworCV9fZGF5c1swXSA9IF9NX2RhdGEtPl9NX2RheTE7CisJX19kYXlzWzFdID0gX01fZGF0YS0+X01fZGF5MjsKKwlfX2RheXNbMl0gPSBfTV9kYXRhLT5fTV9kYXkzOworCV9fZGF5c1szXSA9IF9NX2RhdGEtPl9NX2RheTQ7CisJX19kYXlzWzRdID0gX01fZGF0YS0+X01fZGF5NTsKKwlfX2RheXNbNV0gPSBfTV9kYXRhLT5fTV9kYXk2OworCV9fZGF5c1s2XSA9IF9NX2RhdGEtPl9NX2RheTc7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RheXNfYWJicmV2aWF0ZWQoY29uc3QgX0NoYXJUKiogX19kYXlzKSBjb25zdAorICAgICAgeworCV9fZGF5c1swXSA9IF9NX2RhdGEtPl9NX2FkYXkxOworCV9fZGF5c1sxXSA9IF9NX2RhdGEtPl9NX2FkYXkyOworCV9fZGF5c1syXSA9IF9NX2RhdGEtPl9NX2FkYXkzOworCV9fZGF5c1szXSA9IF9NX2RhdGEtPl9NX2FkYXk0OworCV9fZGF5c1s0XSA9IF9NX2RhdGEtPl9NX2FkYXk1OworCV9fZGF5c1s1XSA9IF9NX2RhdGEtPl9NX2FkYXk2OworCV9fZGF5c1s2XSA9IF9NX2RhdGEtPl9NX2FkYXk3OworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9tb250aHMoY29uc3QgX0NoYXJUKiogX19tb250aHMpIGNvbnN0CisgICAgICB7CisJX19tb250aHNbMF0gPSBfTV9kYXRhLT5fTV9tb250aDAxOworCV9fbW9udGhzWzFdID0gX01fZGF0YS0+X01fbW9udGgwMjsKKwlfX21vbnRoc1syXSA9IF9NX2RhdGEtPl9NX21vbnRoMDM7CisJX19tb250aHNbM10gPSBfTV9kYXRhLT5fTV9tb250aDA0OworCV9fbW9udGhzWzRdID0gX01fZGF0YS0+X01fbW9udGgwNTsKKwlfX21vbnRoc1s1XSA9IF9NX2RhdGEtPl9NX21vbnRoMDY7CisJX19tb250aHNbNl0gPSBfTV9kYXRhLT5fTV9tb250aDA3OworCV9fbW9udGhzWzddID0gX01fZGF0YS0+X01fbW9udGgwODsKKwlfX21vbnRoc1s4XSA9IF9NX2RhdGEtPl9NX21vbnRoMDk7CisJX19tb250aHNbOV0gPSBfTV9kYXRhLT5fTV9tb250aDEwOworCV9fbW9udGhzWzEwXSA9IF9NX2RhdGEtPl9NX21vbnRoMTE7CisJX19tb250aHNbMTFdID0gX01fZGF0YS0+X01fbW9udGgxMjsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fbW9udGhzX2FiYnJldmlhdGVkKGNvbnN0IF9DaGFyVCoqIF9fbW9udGhzKSBjb25zdAorICAgICAgeworCV9fbW9udGhzWzBdID0gX01fZGF0YS0+X01fYW1vbnRoMDE7CisJX19tb250aHNbMV0gPSBfTV9kYXRhLT5fTV9hbW9udGgwMjsKKwlfX21vbnRoc1syXSA9IF9NX2RhdGEtPl9NX2Ftb250aDAzOworCV9fbW9udGhzWzNdID0gX01fZGF0YS0+X01fYW1vbnRoMDQ7CisJX19tb250aHNbNF0gPSBfTV9kYXRhLT5fTV9hbW9udGgwNTsKKwlfX21vbnRoc1s1XSA9IF9NX2RhdGEtPl9NX2Ftb250aDA2OworCV9fbW9udGhzWzZdID0gX01fZGF0YS0+X01fYW1vbnRoMDc7CisJX19tb250aHNbN10gPSBfTV9kYXRhLT5fTV9hbW9udGgwODsKKwlfX21vbnRoc1s4XSA9IF9NX2RhdGEtPl9NX2Ftb250aDA5OworCV9fbW9udGhzWzldID0gX01fZGF0YS0+X01fYW1vbnRoMTA7CisJX19tb250aHNbMTBdID0gX01fZGF0YS0+X01fYW1vbnRoMTE7CisJX19tb250aHNbMTFdID0gX01fZGF0YS0+X01fYW1vbnRoMTI7CisgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2aXJ0dWFsCisgICAgICB+X190aW1lcHVuY3QoKTsKKworICAgICAgLy8gRm9yIHVzZSBhdCBjb25zdHJ1Y3Rpb24gdGltZSBvbmx5LgorICAgICAgdm9pZAorICAgICAgX01faW5pdGlhbGl6ZV90aW1lcHVuY3QoX19jX2xvY2FsZSBfX2Nsb2MgPSAwKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBsb2NhbGU6OmlkIF9fdGltZXB1bmN0PF9DaGFyVD46OmlkOworCisgIC8vIFNwZWNpYWxpemF0aW9ucy4KKyAgdGVtcGxhdGU8PgorICAgIHZvaWQKKyAgICBfX3RpbWVwdW5jdDxjaGFyPjo6X01faW5pdGlhbGl6ZV90aW1lcHVuY3QoX19jX2xvY2FsZSBfX2Nsb2MpOworCisgIHRlbXBsYXRlPD4KKyAgICB2b2lkCisgICAgX190aW1lcHVuY3Q8Y2hhcj46Ol9NX3B1dChjaGFyKiwgc2l6ZV90LCBjb25zdCBjaGFyKiwgY29uc3QgdG0qKSBjb25zdCB0aHJvdyAoKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHRlbXBsYXRlPD4KKyAgICB2b2lkCisgICAgX190aW1lcHVuY3Q8d2NoYXJfdD46Ol9NX2luaXRpYWxpemVfdGltZXB1bmN0KF9fY19sb2NhbGUgX19jbG9jKTsKKworICB0ZW1wbGF0ZTw+CisgICAgdm9pZAorICAgIF9fdGltZXB1bmN0PHdjaGFyX3Q+OjpfTV9wdXQod2NoYXJfdCosIHNpemVfdCwgY29uc3Qgd2NoYXJfdCosCisJCQkJIGNvbnN0IHRtKikgY29uc3QgdGhyb3cgKCk7CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisgIC8vIEluY2x1ZGUgaG9zdCBhbmQgY29uZmlndXJhdGlvbiBzcGVjaWZpYyB0aW1lcHVuY3QgZnVuY3Rpb25zLgorICAjaW5jbHVkZSA8Yml0cy90aW1lX21lbWJlcnMuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIHRpbWVfZ2V0LgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKgorICAgKiAgVGhpcyBmYWNldCBlbmNhcHN1bGF0ZXMgdGhlIGNvZGUgdG8gcGFyc2UgYW5kIHJldHVybiBhIGRhdGUgb3IKKyAgICogIHRpbWUgZnJvbSBhIHN0cmluZy4gIEl0IGlzIHVzZWQgYnkgdGhlIGlzdHJlYW0gbnVtZXJpYworICAgKiAgZXh0cmFjdGlvbiBvcGVyYXRvcnMuCisgICAqCisgICAqICBUaGUgdGltZV9nZXQgdGVtcGxhdGUgdXNlcyBwcm90ZWN0ZWQgdmlydHVhbCBmdW5jdGlvbnMgdG8gcHJvdmlkZSB0aGUKKyAgICogIGFjdHVhbCByZXN1bHRzLiAgVGhlIHB1YmxpYyBhY2Nlc3NvcnMgZm9yd2FyZCB0aGUgY2FsbCB0byB0aGUgdmlydHVhbAorICAgKiAgZnVuY3Rpb25zLiAgVGhlc2UgdmlydHVhbCBmdW5jdGlvbnMgYXJlIGhvb2tzIGZvciBkZXZlbG9wZXJzIHRvCisgICAqICBpbXBsZW1lbnQgdGhlIGJlaGF2aW9yIHRoZXkgcmVxdWlyZSBmcm9tIHRoZSB0aW1lX2dldCBmYWNldC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIGNsYXNzIHRpbWVfZ2V0IDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyB0aW1lX2Jhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICAvL0B7CisgICAgICAvLy8gUHVibGljIHR5cGVkZWZzCisgICAgICB0eXBlZGVmIF9DaGFyVAkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0luSXRlcgkJCWl0ZXJfdHlwZTsKKyAgICAgIC8vQH0KKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVD4JX19zdHJpbmdfdHlwZTsKKworICAgICAgLy8vIE51bXB1bmN0IGZhY2V0IGlkLgorICAgICAgc3RhdGljIGxvY2FsZTo6aWQJCQlpZDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RvciBwZXJmb3JtcyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgcHJvdmlkZWQgYnkgdGhlIHN0YW5kYXJkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19yZWZzICBQYXNzZWQgdG8gdGhlIGJhc2UgZmFjZXQgY2xhc3MuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHRpbWVfZ2V0KHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiBmYWNldCAoX19yZWZzKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gcHJlZmVycmVkIG9yZGVyIG9mIG1vbnRoLCBkYXksIGFuZCB5ZWFyLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZW51bSBmcm9tIHRpbWViYXNlOjpkYXRlb3JkZXIgZ2l2aW5nIHRoZQorICAgICAgICogIHByZWZlcnJlZCBvcmRlcmluZyBpZiB0aGUgZm9ybWF0IEBhIHggZ2l2ZW4gdG8gdGltZV9wdXQ6OnB1dCgpIG9ubHkKKyAgICAgICAqICB1c2VzIG1vbnRoLCBkYXksIGFuZCB5ZWFyLiAgSWYgdGhlIGZvcm1hdCBAYSB4IGZvciB0aGUgYXNzb2NpYXRlZAorICAgICAgICogIGxvY2FsZSB1c2VzIG90aGVyIGZpZWxkcywgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgICAgICAgKiAgdGltZWJhc2U6OmRhdGVvcmRlcjo6bm9vcmRlci4KKyAgICAgICAqCisgICAgICAgKiAgTk9URTogVGhlIGxpYnJhcnkgYWx3YXlzIHJldHVybnMgbm9vcmRlciBhdCB0aGUgbW9tZW50LgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBBIG1lbWJlciBvZiB0aW1lYmFzZTo6ZGF0ZW9yZGVyLgorICAgICAgKi8KKyAgICAgIGRhdGVvcmRlcgorICAgICAgZGF0ZV9vcmRlcigpICBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZGF0ZV9vcmRlcigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUGFyc2UgaW5wdXQgdGltZSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGEgdGltZSBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdCBAYSBYIGFuZCBwdXRzIHRoZQorICAgICAgICogIHJlc3VsdHMgaW50byBhIHVzZXItc3VwcGxpZWQgc3RydWN0IHRtLiAgVGhlIHJlc3VsdCBpcyByZXR1cm5lZCBieQorICAgICAgICogIGNhbGxpbmcgdGltZV9nZXQ6OmRvX2dldF90aW1lKCkuCisgICAgICAgKgorICAgICAgICogIElmIHRoZXJlIGlzIGEgdmFsaWQgdGltZSBzdHJpbmcgYWNjb3JkaW5nIHRvIGZvcm1hdCBAYSBYLCBAYSB0bSB3aWxsCisgICAgICAgKiAgYmUgZmlsbGVkIGluIGFjY29yZGluZ2x5IGFuZCB0aGUgcmV0dXJuZWQgaXRlcmF0b3Igd2lsbCBwb2ludCB0byB0aGUKKyAgICAgICAqICBmaXJzdCBjaGFyYWN0ZXIgYmV5b25kIHRoZSB0aW1lIHN0cmluZy4gIElmIGFuIGVycm9yIG9jY3VycyBiZWZvcmUKKyAgICAgICAqICB0aGUgZW5kLCBlcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQuICBJZiBwYXJzaW5nIHJlYWRzIGFsbCB0aGUKKyAgICAgICAqICBjaGFyYWN0ZXJzLCBlcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX2JlZyAgU3RhcnQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgX19lbmQgIEVuZCBvZiBzdHJpbmcgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgdGhlIGxvY2FsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZXJyICBFcnJvciBmbGFncyB0byBzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3RtICBQb2ludGVyIHRvIHN0cnVjdCB0bSB0byBmaWxsIGluLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHRvIGZpcnN0IGNoYXIgYmV5b25kIHRpbWUgc3RyaW5nLgorICAgICAgKi8KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgZ2V0X3RpbWUoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtKSAgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldF90aW1lKF9fYmVnLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdG0pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUGFyc2UgaW5wdXQgZGF0ZSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGEgZGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdCBAYSB4IGFuZCBwdXRzIHRoZQorICAgICAgICogIHJlc3VsdHMgaW50byBhIHVzZXItc3VwcGxpZWQgc3RydWN0IHRtLiAgVGhlIHJlc3VsdCBpcyByZXR1cm5lZCBieQorICAgICAgICogIGNhbGxpbmcgdGltZV9nZXQ6OmRvX2dldF9kYXRlKCkuCisgICAgICAgKgorICAgICAgICogIElmIHRoZXJlIGlzIGEgdmFsaWQgZGF0ZSBzdHJpbmcgYWNjb3JkaW5nIHRvIGZvcm1hdCBAYSB4LCBAYSB0bSB3aWxsCisgICAgICAgKiAgYmUgZmlsbGVkIGluIGFjY29yZGluZ2x5IGFuZCB0aGUgcmV0dXJuZWQgaXRlcmF0b3Igd2lsbCBwb2ludCB0byB0aGUKKyAgICAgICAqICBmaXJzdCBjaGFyYWN0ZXIgYmV5b25kIHRoZSBkYXRlIHN0cmluZy4gIElmIGFuIGVycm9yIG9jY3VycyBiZWZvcmUKKyAgICAgICAqICB0aGUgZW5kLCBlcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQuICBJZiBwYXJzaW5nIHJlYWRzIGFsbCB0aGUKKyAgICAgICAqICBjaGFyYWN0ZXJzLCBlcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX2JlZyAgU3RhcnQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgX19lbmQgIEVuZCBvZiBzdHJpbmcgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgdGhlIGxvY2FsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZXJyICBFcnJvciBmbGFncyB0byBzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3RtICBQb2ludGVyIHRvIHN0cnVjdCB0bSB0byBmaWxsIGluLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHRvIGZpcnN0IGNoYXIgYmV5b25kIGRhdGUgc3RyaW5nLgorICAgICAgKi8KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgZ2V0X2RhdGUoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtKSAgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldF9kYXRlKF9fYmVnLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdG0pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUGFyc2UgaW5wdXQgd2Vla2RheSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGEgd2Vla2RheSBuYW1lIGFuZCBwdXRzIHRoZSByZXN1bHRzIGludG8gYQorICAgICAgICogIHVzZXItc3VwcGxpZWQgc3RydWN0IHRtLiAgVGhlIHJlc3VsdCBpcyByZXR1cm5lZCBieSBjYWxsaW5nCisgICAgICAgKiAgdGltZV9nZXQ6OmRvX2dldF93ZWVrZGF5KCkuCisgICAgICAgKgorICAgICAgICogIFBhcnNpbmcgc3RhcnRzIGJ5IHBhcnNpbmcgYW4gYWJicmV2aWF0ZWQgd2Vla2RheSBuYW1lLiAgSWYgYSB2YWxpZAorICAgICAgICogIGFiYnJldmlhdGlvbiBpcyBmb2xsb3dlZCBieSBhIGNoYXJhY3RlciB0aGF0IHdvdWxkIGxlYWQgdG8gdGhlIGZ1bGwKKyAgICAgICAqICB3ZWVrZGF5IG5hbWUsIHBhcnNpbmcgY29udGludWVzIHVudGlsIHRoZSBmdWxsIG5hbWUgaXMgZm91bmQgb3IgYW4KKyAgICAgICAqICBlcnJvciBvY2N1cnMuICBPdGhlcndpc2UgcGFyc2luZyBmaW5pc2hlcyBhdCB0aGUgZW5kIG9mIHRoZQorICAgICAgICogIGFiYnJldmlhdGVkIG5hbWUuCisgICAgICAgKgorICAgICAgICogIElmIGFuIGVycm9yIG9jY3VycyBiZWZvcmUgdGhlIGVuZCwgZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0LiAgSWYKKyAgICAgICAqICBwYXJzaW5nIHJlYWRzIGFsbCB0aGUgY2hhcmFjdGVycywgZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19iZWcgIFN0YXJ0IG9mIHN0cmluZyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZW5kICBFbmQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgX19pbyAgU291cmNlIG9mIHRoZSBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtICBfX2VyciAgRXJyb3IgZmxhZ3MgdG8gc2V0LgorICAgICAgICogIEBwYXJhbSAgX190bSAgUG9pbnRlciB0byBzdHJ1Y3QgdG0gdG8gZmlsbCBpbi4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciB0byBmaXJzdCBjaGFyIGJleW9uZCB3ZWVrZGF5IG5hbWUuCisgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBnZXRfd2Vla2RheShpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190bSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldF93ZWVrZGF5KF9fYmVnLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdG0pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUGFyc2UgaW5wdXQgbW9udGggc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHBhcnNlcyBhIG1vbnRoIG5hbWUgYW5kIHB1dHMgdGhlIHJlc3VsdHMgaW50byBhCisgICAgICAgKiAgdXNlci1zdXBwbGllZCBzdHJ1Y3QgdG0uICBUaGUgcmVzdWx0IGlzIHJldHVybmVkIGJ5IGNhbGxpbmcKKyAgICAgICAqICB0aW1lX2dldDo6ZG9fZ2V0X21vbnRobmFtZSgpLgorICAgICAgICoKKyAgICAgICAqICBQYXJzaW5nIHN0YXJ0cyBieSBwYXJzaW5nIGFuIGFiYnJldmlhdGVkIG1vbnRoIG5hbWUuICBJZiBhIHZhbGlkCisgICAgICAgKiAgYWJicmV2aWF0aW9uIGlzIGZvbGxvd2VkIGJ5IGEgY2hhcmFjdGVyIHRoYXQgd291bGQgbGVhZCB0byB0aGUgZnVsbAorICAgICAgICogIG1vbnRoIG5hbWUsIHBhcnNpbmcgY29udGludWVzIHVudGlsIHRoZSBmdWxsIG5hbWUgaXMgZm91bmQgb3IgYW4KKyAgICAgICAqICBlcnJvciBvY2N1cnMuICBPdGhlcndpc2UgcGFyc2luZyBmaW5pc2hlcyBhdCB0aGUgZW5kIG9mIHRoZQorICAgICAgICogIGFiYnJldmlhdGVkIG5hbWUuCisgICAgICAgKgorICAgICAgICogIElmIGFuIGVycm9yIG9jY3VycyBiZWZvcmUgdGhlIGVuZCwgZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0LiAgSWYKKyAgICAgICAqICBwYXJzaW5nIHJlYWRzIGFsbCB0aGUgY2hhcmFjdGVycywgZXJyIHw9CisgICAgICAgKiAgaW9zX2Jhc2U6OmVvZmJpdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX2JlZyAgU3RhcnQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgX19lbmQgIEVuZCBvZiBzdHJpbmcgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgdGhlIGxvY2FsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZXJyICBFcnJvciBmbGFncyB0byBzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3RtICBQb2ludGVyIHRvIHN0cnVjdCB0bSB0byBmaWxsIGluLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHRvIGZpcnN0IGNoYXIgYmV5b25kIG1vbnRoIG5hbWUuCisgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBnZXRfbW9udGhuYW1lKGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkJICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19nZXRfbW9udGhuYW1lKF9fYmVnLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdG0pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUGFyc2UgaW5wdXQgeWVhciBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmVhZHMgdXAgdG8gNCBjaGFyYWN0ZXJzIHRvIHBhcnNlIGEgeWVhciBzdHJpbmcgYW5kCisgICAgICAgKiAgcHV0cyB0aGUgcmVzdWx0cyBpbnRvIGEgdXNlci1zdXBwbGllZCBzdHJ1Y3QgdG0uICBUaGUgcmVzdWx0IGlzCisgICAgICAgKiAgcmV0dXJuZWQgYnkgY2FsbGluZyB0aW1lX2dldDo6ZG9fZ2V0X3llYXIoKS4KKyAgICAgICAqCisgICAgICAgKiAgNCBjb25zZWN1dGl2ZSBkaWdpdHMgYXJlIGludGVycHJldGVkIGFzIGEgZnVsbCB5ZWFyLiAgSWYgdGhlcmUgYXJlCisgICAgICAgKiAgZXhhY3RseSAyIGNvbnNlY3V0aXZlIGRpZ2l0cywgdGhlIGxpYnJhcnkgaW50ZXJwcmV0cyB0aGlzIGFzIHRoZQorICAgICAgICogIG51bWJlciBvZiB5ZWFycyBzaW5jZSAxOTAwLgorICAgICAgICoKKyAgICAgICAqICBJZiBhbiBlcnJvciBvY2N1cnMgYmVmb3JlIHRoZSBlbmQsIGVyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdC4gIElmCisgICAgICAgKiAgcGFyc2luZyByZWFkcyBhbGwgdGhlIGNoYXJhY3RlcnMsIGVyciB8PSBpb3NfYmFzZTo6ZW9mYml0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fYmVnICBTdGFydCBvZiBzdHJpbmcgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBfX2VuZCAgRW5kIG9mIHN0cmluZyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIF9faW8gIFNvdXJjZSBvZiB0aGUgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSAgX19lcnIgIEVycm9yIGZsYWdzIHRvIHNldC4KKyAgICAgICAqICBAcGFyYW0gIF9fdG0gIFBvaW50ZXIgdG8gc3RydWN0IHRtIHRvIGZpbGwgaW4uCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgdG8gZmlyc3QgY2hhciBiZXlvbmQgeWVhci4KKyAgICAgICovCisgICAgICBpdGVyX3R5cGUKKyAgICAgIGdldF95ZWFyKGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190bSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldF95ZWFyKF9fYmVnLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdG0pOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLy8gRGVzdHJ1Y3Rvci4KKyAgICAgIHZpcnR1YWwKKyAgICAgIH50aW1lX2dldCgpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBwcmVmZXJyZWQgb3JkZXIgb2YgbW9udGgsIGRheSwgYW5kIHllYXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlbnVtIGZyb20gdGltZWJhc2U6OmRhdGVvcmRlciBnaXZpbmcgdGhlCisgICAgICAgKiAgcHJlZmVycmVkIG9yZGVyaW5nIGlmIHRoZSBmb3JtYXQgQGEgeCBnaXZlbiB0byB0aW1lX3B1dDo6cHV0KCkgb25seQorICAgICAgICogIHVzZXMgbW9udGgsIGRheSwgYW5kIHllYXIuICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IgZGVyaXZlZAorICAgICAgICogIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgQSBtZW1iZXIgb2YgdGltZWJhc2U6OmRhdGVvcmRlci4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGRhdGVvcmRlcgorICAgICAgZG9fZGF0ZV9vcmRlcigpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFBhcnNlIGlucHV0IHRpbWUgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHBhcnNlcyBhIHRpbWUgYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQgQGEgeCBhbmQgcHV0cyB0aGUKKyAgICAgICAqICByZXN1bHRzIGludG8gYSB1c2VyLXN1cHBsaWVkIHN0cnVjdCB0bS4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvcgorICAgICAgICogIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLiAgQHNlZSBnZXRfdGltZSgpIGZvcgorICAgICAgICogIGRldGFpbHMuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19iZWcgIFN0YXJ0IG9mIHN0cmluZyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZW5kICBFbmQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgX19pbyAgU291cmNlIG9mIHRoZSBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtICBfX2VyciAgRXJyb3IgZmxhZ3MgdG8gc2V0LgorICAgICAgICogIEBwYXJhbSAgX190bSAgUG9pbnRlciB0byBzdHJ1Y3QgdG0gdG8gZmlsbCBpbi4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciB0byBmaXJzdCBjaGFyIGJleW9uZCB0aW1lIHN0cmluZy4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0X3RpbWUoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCQkgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFBhcnNlIGlucHV0IGRhdGUgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHBhcnNlcyBhIGRhdGUgYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQgQGEgWCBhbmQgcHV0cyB0aGUKKyAgICAgICAqICByZXN1bHRzIGludG8gYSB1c2VyLXN1cHBsaWVkIHN0cnVjdCB0bS4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvcgorICAgICAgICogIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLiAgQHNlZSBnZXRfZGF0ZSgpIGZvcgorICAgICAgICogIGRldGFpbHMuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19iZWcgIFN0YXJ0IG9mIHN0cmluZyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZW5kICBFbmQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgX19pbyAgU291cmNlIG9mIHRoZSBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtICBfX2VyciAgRXJyb3IgZmxhZ3MgdG8gc2V0LgorICAgICAgICogIEBwYXJhbSAgX190bSAgUG9pbnRlciB0byBzdHJ1Y3QgdG0gdG8gZmlsbCBpbi4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciB0byBmaXJzdCBjaGFyIGJleW9uZCBkYXRlIHN0cmluZy4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0X2RhdGUoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCQkgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFBhcnNlIGlucHV0IHdlZWtkYXkgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHBhcnNlcyBhIHdlZWtkYXkgbmFtZSBhbmQgcHV0cyB0aGUgcmVzdWx0cyBpbnRvIGEKKyAgICAgICAqICB1c2VyLXN1cHBsaWVkIHN0cnVjdCB0bS4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkCisgICAgICAgKiAgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLiAgQHNlZSBnZXRfd2Vla2RheSgpIGZvcgorICAgICAgICogIGRldGFpbHMuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19iZWcgIFN0YXJ0IG9mIHN0cmluZyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZW5kICBFbmQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgX19pbyAgU291cmNlIG9mIHRoZSBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtICBfX2VyciAgRXJyb3IgZmxhZ3MgdG8gc2V0LgorICAgICAgICogIEBwYXJhbSAgX190bSAgUG9pbnRlciB0byBzdHJ1Y3QgdG0gdG8gZmlsbCBpbi4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciB0byBmaXJzdCBjaGFyIGJleW9uZCB3ZWVrZGF5IG5hbWUuCisgICAgICAqLworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX2dldF93ZWVrZGF5KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYsCisJCSAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190bSkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUGFyc2UgaW5wdXQgbW9udGggc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHBhcnNlcyBhIG1vbnRoIG5hbWUgYW5kIHB1dHMgdGhlIHJlc3VsdHMgaW50byBhCisgICAgICAgKiAgdXNlci1zdXBwbGllZCBzdHJ1Y3QgdG0uICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IgZGVyaXZlZAorICAgICAgICogIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZC4gIEBzZWUgZ2V0X21vbnRobmFtZSgpIGZvcgorICAgICAgICogIGRldGFpbHMuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19iZWcgIFN0YXJ0IG9mIHN0cmluZyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZW5kICBFbmQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgX19pbyAgU291cmNlIG9mIHRoZSBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtICBfX2VyciAgRXJyb3IgZmxhZ3MgdG8gc2V0LgorICAgICAgICogIEBwYXJhbSAgX190bSAgUG9pbnRlciB0byBzdHJ1Y3QgdG0gdG8gZmlsbCBpbi4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciB0byBmaXJzdCBjaGFyIGJleW9uZCBtb250aCBuYW1lLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXRfbW9udGhuYW1lKGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYsCisJCSAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQYXJzZSBpbnB1dCB5ZWFyIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZWFkcyB1cCB0byA0IGNoYXJhY3RlcnMgdG8gcGFyc2UgYSB5ZWFyIHN0cmluZyBhbmQKKyAgICAgICAqICBwdXRzIHRoZSByZXN1bHRzIGludG8gYSB1c2VyLXN1cHBsaWVkIHN0cnVjdCB0bS4gIFRoaXMgZnVuY3Rpb24gaXMgYQorICAgICAgICogIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLiAgQHNlZQorICAgICAgICogIGdldF95ZWFyKCkgZm9yIGRldGFpbHMuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19iZWcgIFN0YXJ0IG9mIHN0cmluZyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZW5kICBFbmQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgX19pbyAgU291cmNlIG9mIHRoZSBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtICBfX2VyciAgRXJyb3IgZmxhZ3MgdG8gc2V0LgorICAgICAgICogIEBwYXJhbSAgX190bSAgUG9pbnRlciB0byBzdHJ1Y3QgdG0gdG8gZmlsbCBpbi4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciB0byBmaXJzdCBjaGFyIGJleW9uZCB5ZWFyLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXRfeWVhcihpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190bSkgY29uc3Q7CisKKyAgICAgIC8vIEV4dHJhY3QgbnVtZXJpYyBjb21wb25lbnQgb2YgbGVuZ3RoIF9fbGVuLgorICAgICAgaXRlcl90eXBlCisgICAgICBfTV9leHRyYWN0X251bShpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW50JiBfX21lbWJlciwKKwkJICAgICBpbnQgX19taW4sIGludCBfX21heCwgc2l6ZV90IF9fbGVuLAorCQkgICAgIGlvc19iYXNlJiBfX2lvLCBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIpIGNvbnN0OworCisgICAgICAvLyBFeHRyYWN0IGFueSB1bmlxdWUgYXJyYXkgb2Ygc3RyaW5nIGxpdGVyYWxzIGluIGEgY29uc3QgX0NoYXJUKiBhcnJheS4KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgX01fZXh0cmFjdF9uYW1lKGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpbnQmIF9fbWVtYmVyLAorCQkgICAgICBjb25zdCBfQ2hhclQqKiBfX25hbWVzLCBzaXplX3QgX19pbmRleGxlbiwKKwkJICAgICAgaW9zX2Jhc2UmIF9faW8sIGlvc19iYXNlOjppb3N0YXRlJiBfX2VycikgY29uc3Q7CisKKyAgICAgIC8vIEV4dHJhY3QgZGF5IG9yIG1vbnRoIG5hbWUgaW4gYSBjb25zdCBfQ2hhclQqIGFycmF5LgorICAgICAgaXRlcl90eXBlCisgICAgICBfTV9leHRyYWN0X3dkYXlfb3JfbW9udGgoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGludCYgX19tZW1iZXIsCisJCQkgICAgICAgY29uc3QgX0NoYXJUKiogX19uYW1lcywgc2l6ZV90IF9faW5kZXhsZW4sCisJCQkgICAgICAgaW9zX2Jhc2UmIF9faW8sIGlvc19iYXNlOjppb3N0YXRlJiBfX2VycikgY29uc3Q7CisKKyAgICAgIC8vIEV4dHJhY3Qgb24gYSBjb21wb25lbnQtYnktY29tcG9uZW50IGJhc2lzLCB2aWEgX19mb3JtYXQgYXJndW1lbnQuCisgICAgICBpdGVyX3R5cGUKKyAgICAgIF9NX2V4dHJhY3RfdmlhX2Zvcm1hdChpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJCQkgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190bSwKKwkJCSAgICBjb25zdCBfQ2hhclQqIF9fZm9ybWF0KSBjb25zdDsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBsb2NhbGU6OmlkIHRpbWVfZ2V0PF9DaGFyVCwgX0luSXRlcj46OmlkOworCisgIC8vLyBjbGFzcyB0aW1lX2dldF9ieW5hbWUgWzIyLjIuNS4yXS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIGNsYXNzIHRpbWVfZ2V0X2J5bmFtZSA6IHB1YmxpYyB0aW1lX2dldDxfQ2hhclQsIF9Jbkl0ZXI+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiBfQ2hhclQJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9Jbkl0ZXIJCQlpdGVyX3R5cGU7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB0aW1lX2dldF9ieW5hbWUoY29uc3QgY2hhciosIHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiB0aW1lX2dldDxfQ2hhclQsIF9Jbkl0ZXI+KF9fcmVmcykgeyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2aXJ0dWFsCisgICAgICB+dGltZV9nZXRfYnluYW1lKCkgeyB9CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiAgUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZSB0aW1lX3B1dC4KKyAgICogIEBpbmdyb3VwIGxvY2FsZXMKKyAgICoKKyAgICogIFRoaXMgZmFjZXQgZW5jYXBzdWxhdGVzIHRoZSBjb2RlIHRvIGZvcm1hdCBhbmQgb3V0cHV0IGRhdGVzIGFuZCB0aW1lcworICAgKiAgYWNjb3JkaW5nIHRvIGZvcm1hdHMgdXNlZCBieSBzdHJmdGltZSgpLgorICAgKgorICAgKiAgVGhlIHRpbWVfcHV0IHRlbXBsYXRlIHVzZXMgcHJvdGVjdGVkIHZpcnR1YWwgZnVuY3Rpb25zIHRvIHByb3ZpZGUgdGhlCisgICAqICBhY3R1YWwgcmVzdWx0cy4gIFRoZSBwdWJsaWMgYWNjZXNzb3JzIGZvcndhcmQgdGhlIGNhbGwgdG8gdGhlIHZpcnR1YWwKKyAgICogIGZ1bmN0aW9ucy4gIFRoZXNlIHZpcnR1YWwgZnVuY3Rpb25zIGFyZSBob29rcyBmb3IgZGV2ZWxvcGVycyB0bworICAgKiAgaW1wbGVtZW50IHRoZSBiZWhhdmlvciB0aGV5IHJlcXVpcmUgZnJvbSB0aGUgdGltZV9wdXQgZmFjZXQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgY2xhc3MgdGltZV9wdXQgOiBwdWJsaWMgbG9jYWxlOjpmYWNldAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBQdWJsaWMgdHlwZWRlZnMKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfT3V0SXRlcgkJCWl0ZXJfdHlwZTsKKyAgICAgIC8vQH0KKworICAgICAgLy8vIE51bXB1bmN0IGZhY2V0IGlkLgorICAgICAgc3RhdGljIGxvY2FsZTo6aWQJCQlpZDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RvciBwZXJmb3JtcyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgcHJvdmlkZWQgYnkgdGhlIHN0YW5kYXJkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gX19yZWZzICBQYXNzZWQgdG8gdGhlIGJhc2UgZmFjZXQgY2xhc3MuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHRpbWVfcHV0KHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiBmYWNldChfX3JlZnMpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZvcm1hdCBhbmQgb3V0cHV0IGEgdGltZSBvciBkYXRlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZvcm1hdHMgdGhlIGRhdGEgaW4gc3RydWN0IHRtIGFjY29yZGluZyB0byB0aGUKKyAgICAgICAqICBwcm92aWRlZCBmb3JtYXQgc3RyaW5nLiAgVGhlIGZvcm1hdCBzdHJpbmcgaXMgaW50ZXJwcmV0ZWQgYXMgYnkKKyAgICAgICAqICBzdHJmdGltZSgpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fcyAgVGhlIHN0cmVhbSB0byB3cml0ZSB0by4KKyAgICAgICAqICBAcGFyYW0gIF9faW8gIFNvdXJjZSBvZiBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpbGwgIGNoYXJfdHlwZSB0byB1c2UgZm9yIHBhZGRpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3RtICBTdHJ1Y3QgdG0gd2l0aCBkYXRlIGFuZCB0aW1lIGluZm8gdG8gZm9ybWF0LgorICAgICAgICogIEBwYXJhbSAgX19iZWcgIFN0YXJ0IG9mIGZvcm1hdCBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX2VuZCAgRW5kIG9mIGZvcm1hdCBzdHJpbmcuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgYWZ0ZXIgd3JpdGluZy4KKyAgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsIGNvbnN0IHRtKiBfX3RtLAorCSAgY29uc3QgX0NoYXJUKiBfX2JlZywgY29uc3QgX0NoYXJUKiBfX2VuZCkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRm9ybWF0IGFuZCBvdXRwdXQgYSB0aW1lIG9yIGRhdGUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZm9ybWF0cyB0aGUgZGF0YSBpbiBzdHJ1Y3QgdG0gYWNjb3JkaW5nIHRvIHRoZQorICAgICAgICogIHByb3ZpZGVkIGZvcm1hdCBjaGFyIGFuZCBvcHRpb25hbCBtb2RpZmllci4gIFRoZSBmb3JtYXQgYW5kIG1vZGlmaWVyCisgICAgICAgKiAgYXJlIGludGVycHJldGVkIGFzIGJ5IHN0cmZ0aW1lKCkuICBJdCBkb2VzIHNvIGJ5IHJldHVybmluZworICAgICAgICogIHRpbWVfcHV0Ojpkb19wdXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBzdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSAgX19maWxsICBjaGFyX3R5cGUgdG8gdXNlIGZvciBwYWRkaW5nLgorICAgICAgICogIEBwYXJhbSAgX190bSAgU3RydWN0IHRtIHdpdGggZGF0ZSBhbmQgdGltZSBpbmZvIHRvIGZvcm1hdC4KKyAgICAgICAqICBAcGFyYW0gIF9fZm9ybWF0ICBGb3JtYXQgY2hhci4KKyAgICAgICAqICBAcGFyYW0gIF9fbW9kICBPcHRpb25hbCBtb2RpZmllciBjaGFyLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIGFmdGVyIHdyaXRpbmcuCisgICAgICAgKi8KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLAorCSAgY29uc3QgdG0qIF9fdG0sIGNoYXIgX19mb3JtYXQsIGNoYXIgX19tb2QgPSAwKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fcHV0KF9fcywgX19pbywgX19maWxsLCBfX3RtLCBfX2Zvcm1hdCwgX19tb2QpOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLy8gRGVzdHJ1Y3Rvci4KKyAgICAgIHZpcnR1YWwKKyAgICAgIH50aW1lX3B1dCgpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGb3JtYXQgYW5kIG91dHB1dCBhIHRpbWUgb3IgZGF0ZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmb3JtYXRzIHRoZSBkYXRhIGluIHN0cnVjdCB0bSBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgKiAgcHJvdmlkZWQgZm9ybWF0IGNoYXIgYW5kIG9wdGlvbmFsIG1vZGlmaWVyLiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sKKyAgICAgICAqICBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuICBAc2VlIHB1dCgpIGZvcgorICAgICAgICogIG1vcmUgZGV0YWlscy4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBzdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSAgX19maWxsICBjaGFyX3R5cGUgdG8gdXNlIGZvciBwYWRkaW5nLgorICAgICAgICogIEBwYXJhbSAgX190bSAgU3RydWN0IHRtIHdpdGggZGF0ZSBhbmQgdGltZSBpbmZvIHRvIGZvcm1hdC4KKyAgICAgICAqICBAcGFyYW0gIF9fZm9ybWF0ICBGb3JtYXQgY2hhci4KKyAgICAgICAqICBAcGFyYW0gIF9fbW9kICBPcHRpb25hbCBtb2RpZmllciBjaGFyLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIGFmdGVyIHdyaXRpbmcuCisgICAgICAgKi8KKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsIGNvbnN0IHRtKiBfX3RtLAorCSAgICAgY2hhciBfX2Zvcm1hdCwgY2hhciBfX21vZCkgY29uc3Q7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgorICAgIGxvY2FsZTo6aWQgdGltZV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OmlkOworCisgIC8vLyBjbGFzcyB0aW1lX3B1dF9ieW5hbWUgWzIyLjIuNS40XS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICBjbGFzcyB0aW1lX3B1dF9ieW5hbWUgOiBwdWJsaWMgdGltZV9wdXQ8X0NoYXJULCBfT3V0SXRlcj4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICB0eXBlZGVmIF9DaGFyVAkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX091dEl0ZXIJCQlpdGVyX3R5cGU7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB0aW1lX3B1dF9ieW5hbWUoY29uc3QgY2hhciosIHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiB0aW1lX3B1dDxfQ2hhclQsIF9PdXRJdGVyPihfX3JlZnMpCisgICAgICB7IH07CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2aXJ0dWFsCisgICAgICB+dGltZV9wdXRfYnluYW1lKCkgeyB9CisgICAgfTsKKworCisgIC8qKgorICAgKiAgQGJyaWVmICBNb25leSBmb3JtYXQgb3JkZXJpbmcgZGF0YS4KKyAgICogIEBpbmdyb3VwIGxvY2FsZXMKKyAgICoKKyAgICogIFRoaXMgY2xhc3MgY29udGFpbnMgYW4gb3JkZXJlZCBhcnJheSBvZiA0IGZpZWxkcyB0byByZXByZXNlbnQgdGhlCisgICAqICBwYXR0ZXJuIGZvciBmb3JtYXR0aW5nIGEgbW9uZXkgYW1vdW50LiAgRWFjaCBmaWVsZCBtYXkgY29udGFpbiBvbmUgZW50cnkKKyAgICogIGZyb20gdGhlIHBhcnQgZW51bS4gIHN5bWJvbCwgc2lnbiwgYW5kIHZhbHVlIG11c3QgYmUgcHJlc2VudCBhbmQgdGhlCisgICAqICByZW1haW5pbmcgZmllbGQgbXVzdCBjb250YWluIGVpdGhlciBub25lIG9yIHNwYWNlLiAgQHNlZQorICAgKiAgbW9uZXlwdW5jdDo6cG9zX2Zvcm1hdCgpIGFuZCBtb25leXB1bmN0OjpuZWdfZm9ybWF0KCkgZm9yIGRldGFpbHMgb2YgaG93CisgICAqICB0aGVzZSBmaWVsZHMgYXJlIGludGVycHJldGVkLgorICAqLworICBjbGFzcyBtb25leV9iYXNlCisgIHsKKyAgcHVibGljOgorICAgIGVudW0gcGFydCB7IG5vbmUsIHNwYWNlLCBzeW1ib2wsIHNpZ24sIHZhbHVlIH07CisgICAgc3RydWN0IHBhdHRlcm4geyBjaGFyIGZpZWxkWzRdOyB9OworCisgICAgc3RhdGljIGNvbnN0IHBhdHRlcm4gX1NfZGVmYXVsdF9wYXR0ZXJuOworCisgICAgZW51bQorICAgIHsKKyAgICAgIF9TX21pbnVzLAorICAgICAgX1NfemVybywKKyAgICAgIF9TX2VuZCA9IDExCisgICAgfTsKKworICAgIC8vIFN0cmluZyBsaXRlcmFsIG9mIGFjY2VwdGFibGUgKG5hcnJvdykgaW5wdXQvb3V0cHV0LCBmb3IKKyAgICAvLyBtb25leV9nZXQvbW9uZXlfcHV0LiAiLTAxMjM0NTY3ODkiCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIF9TX2F0b21zOworCisgICAgLy8gQ29uc3RydWN0IGFuZCByZXR1cm4gdmFsaWQgcGF0dGVybiBjb25zaXN0aW5nIG9mIHNvbWUgY29tYmluYXRpb24gb2Y6CisgICAgLy8gc3BhY2Ugbm9uZSBzeW1ib2wgc2lnbiB2YWx1ZQorICAgIF9HTElCQ1hYX0NPTlNUIHN0YXRpYyBwYXR0ZXJuCisgICAgX1NfY29uc3RydWN0X3BhdHRlcm4oY2hhciBfX3ByZWNlZGVzLCBjaGFyIF9fc3BhY2UsIGNoYXIgX19wb3NuKSB0aHJvdyAoKTsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIGJvb2wgX0ludGw+CisgICAgc3RydWN0IF9fbW9uZXlwdW5jdF9jYWNoZSA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0CisgICAgeworICAgICAgY29uc3QgY2hhcioJCQlfTV9ncm91cGluZzsKKyAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9ncm91cGluZ19zaXplOworICAgICAgYm9vbAkJCQlfTV91c2VfZ3JvdXBpbmc7CisgICAgICBfQ2hhclQJCQkJX01fZGVjaW1hbF9wb2ludDsKKyAgICAgIF9DaGFyVAkJCQlfTV90aG91c2FuZHNfc2VwOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2N1cnJfc3ltYm9sOworICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2N1cnJfc3ltYm9sX3NpemU7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fcG9zaXRpdmVfc2lnbjsKKyAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9wb3NpdGl2ZV9zaWduX3NpemU7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fbmVnYXRpdmVfc2lnbjsKKyAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9uZWdhdGl2ZV9zaWduX3NpemU7CisgICAgICBpbnQJCQkJX01fZnJhY19kaWdpdHM7CisgICAgICBtb25leV9iYXNlOjpwYXR0ZXJuCQlfTV9wb3NfZm9ybWF0OworICAgICAgbW9uZXlfYmFzZTo6cGF0dGVybgkgICAgICAgIF9NX25lZ19mb3JtYXQ7CisKKyAgICAgIC8vIEEgbGlzdCBvZiB2YWxpZCBudW1lcmljIGxpdGVyYWxzIGZvciBpbnB1dCBhbmQgb3V0cHV0OiBpbiB0aGUgc3RhbmRhcmQKKyAgICAgIC8vICJDIiBsb2NhbGUsIHRoaXMgaXMgIi0wMTIzNDU2Nzg5Ii4gVGhpcyBhcnJheSBjb250YWlucyB0aGUgY2hhcnMgYWZ0ZXIKKyAgICAgIC8vIGhhdmluZyBiZWVuIHBhc3NlZCB0aHJvdWdoIHRoZSBjdXJyZW50IGxvY2FsZSdzIGN0eXBlPF9DaGFyVD4ud2lkZW4oKS4KKyAgICAgIF9DaGFyVAkJCQlfTV9hdG9tc1ttb25leV9iYXNlOjpfU19lbmRdOworCisgICAgICBib29sCQkJCV9NX2FsbG9jYXRlZDsKKworICAgICAgX19tb25leXB1bmN0X2NhY2hlKHNpemVfdCBfX3JlZnMgPSAwKSA6IGZhY2V0KF9fcmVmcyksCisgICAgICBfTV9ncm91cGluZygwKSwgX01fZ3JvdXBpbmdfc2l6ZSgwKSwgX01fdXNlX2dyb3VwaW5nKGZhbHNlKSwKKyAgICAgIF9NX2RlY2ltYWxfcG9pbnQoX0NoYXJUKCkpLCBfTV90aG91c2FuZHNfc2VwKF9DaGFyVCgpKSwKKyAgICAgIF9NX2N1cnJfc3ltYm9sKDApLCBfTV9jdXJyX3N5bWJvbF9zaXplKDApLAorICAgICAgX01fcG9zaXRpdmVfc2lnbigwKSwgX01fcG9zaXRpdmVfc2lnbl9zaXplKDApLAorICAgICAgX01fbmVnYXRpdmVfc2lnbigwKSwgX01fbmVnYXRpdmVfc2lnbl9zaXplKDApLAorICAgICAgX01fZnJhY19kaWdpdHMoMCksCisgICAgICBfTV9wb3NfZm9ybWF0KG1vbmV5X2Jhc2U6OnBhdHRlcm4oKSksCisgICAgICBfTV9uZWdfZm9ybWF0KG1vbmV5X2Jhc2U6OnBhdHRlcm4oKSksIF9NX2FsbG9jYXRlZChmYWxzZSkKKyAgICAgIHsgfQorCisgICAgICB+X19tb25leXB1bmN0X2NhY2hlKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2NhY2hlKGNvbnN0IGxvY2FsZSYgX19sb2MpOworCisgICAgcHJpdmF0ZToKKyAgICAgIF9fbW9uZXlwdW5jdF9jYWNoZSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfX21vbmV5cHVuY3RfY2FjaGUmKTsKKyAgICAgIAorICAgICAgZXhwbGljaXQKKyAgICAgIF9fbW9uZXlwdW5jdF9jYWNoZShjb25zdCBfX21vbmV5cHVuY3RfY2FjaGUmKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgYm9vbCBfSW50bD4KKyAgICBfX21vbmV5cHVuY3RfY2FjaGU8X0NoYXJULCBfSW50bD46On5fX21vbmV5cHVuY3RfY2FjaGUoKQorICAgIHsKKyAgICAgIGlmIChfTV9hbGxvY2F0ZWQpCisJeworCSAgZGVsZXRlIFtdIF9NX2dyb3VwaW5nOworCSAgZGVsZXRlIFtdIF9NX2N1cnJfc3ltYm9sOworCSAgZGVsZXRlIFtdIF9NX3Bvc2l0aXZlX3NpZ247CisJICBkZWxldGUgW10gX01fbmVnYXRpdmVfc2lnbjsKKwl9CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIG1vbmV5cHVuY3QuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBUaGlzIGZhY2V0IGVuY2Fwc3VsYXRlcyB0aGUgcHVuY3R1YXRpb24sIGdyb3VwaW5nIGFuZCBvdGhlciBmb3JtYXR0aW5nCisgICAqICBmZWF0dXJlcyBvZiBtb25leSBhbW91bnQgc3RyaW5nIHJlcHJlc2VudGF0aW9ucy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCBib29sIF9JbnRsPgorICAgIGNsYXNzIG1vbmV5cHVuY3QgOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwgcHVibGljIG1vbmV5X2Jhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICAvL0B7CisgICAgICAvLy8gUHVibGljIHR5cGVkZWZzCisgICAgICB0eXBlZGVmIF9DaGFyVAkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVD4Jc3RyaW5nX3R5cGU7CisgICAgICAvL0B9CisgICAgICB0eXBlZGVmIF9fbW9uZXlwdW5jdF9jYWNoZTxfQ2hhclQsIF9JbnRsPiAgICAgX19jYWNoZV90eXBlOworCisgICAgcHJpdmF0ZToKKyAgICAgIF9fY2FjaGVfdHlwZSoJCQlfTV9kYXRhOworCisgICAgcHVibGljOgorICAgICAgLy8vIFRoaXMgdmFsdWUgaXMgcHJvdmlkZWQgYnkgdGhlIHN0YW5kYXJkLCBidXQgbm8gcmVhc29uIGZvciBpdHMKKyAgICAgIC8vLyBleGlzdGVuY2UuCisgICAgICBzdGF0aWMgY29uc3QgYm9vbAkJCWludGwgPSBfSW50bDsKKyAgICAgIC8vLyBOdW1wdW5jdCBmYWNldCBpZC4KKyAgICAgIHN0YXRpYyBsb2NhbGU6OmlkCQkJaWQ7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0b3IgcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIHByb3ZpZGVkIGJ5IHRoZSBzdGFuZGFyZC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fcmVmcyAgUGFzc2VkIHRvIHRoZSBiYXNlIGZhY2V0IGNsYXNzLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBtb25leXB1bmN0KHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiBmYWNldChfX3JlZnMpLCBfTV9kYXRhKDApCisgICAgICB7IF9NX2luaXRpYWxpemVfbW9uZXlwdW5jdCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0b3IgcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgY29uc3RydWN0b3IuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2NhY2hlICBDYWNoZSBmb3Igb3B0aW1pemF0aW9uLgorICAgICAgICogIEBwYXJhbSBfX3JlZnMgIFBhc3NlZCB0byB0aGUgYmFzZSBmYWNldCBjbGFzcy4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgbW9uZXlwdW5jdChfX2NhY2hlX3R5cGUqIF9fY2FjaGUsIHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiBmYWNldChfX3JlZnMpLCBfTV9kYXRhKF9fY2FjaGUpCisgICAgICB7IF9NX2luaXRpYWxpemVfbW9uZXlwdW5jdCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW50ZXJuYWwgY29uc3RydWN0b3IuIE5vdCBmb3IgZ2VuZXJhbCB1c2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSBjb25zdHJ1Y3RvciBmb3IgdXNlIGJ5IHRoZSBsaWJyYXJ5IGl0c2VsZiB0byBzZXQgdXAgbmV3CisgICAgICAgKiAgbG9jYWxlcy4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fY2xvYyAgVGhlIEMgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSBfX3MgIFRoZSBuYW1lIG9mIGEgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSBfX3JlZnMgIFBhc3NlZCB0byB0aGUgYmFzZSBmYWNldCBjbGFzcy4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgbW9uZXlwdW5jdChfX2NfbG9jYWxlIF9fY2xvYywgY29uc3QgY2hhciogX19zLCBzaXplX3QgX19yZWZzID0gMCkKKyAgICAgIDogZmFjZXQoX19yZWZzKSwgX01fZGF0YSgwKQorICAgICAgeyBfTV9pbml0aWFsaXplX21vbmV5cHVuY3QoX19jbG9jLCBfX3MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGRlY2ltYWwgcG9pbnQgY2hhcmFjdGVyLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBjaGFyX3R5cGUgdG8gdXNlIGFzIGEgZGVjaW1hbCBwb2ludC4gIEl0CisgICAgICAgKiAgZG9lcyBzbyBieSByZXR1cm5pbmcgcmV0dXJuaW5nCisgICAgICAgKiAgbW9uZXlwdW5jdDxjaGFyX3R5cGU+Ojpkb19kZWNpbWFsX3BvaW50KCkuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIEBhIGNoYXJfdHlwZSByZXByZXNlbnRpbmcgYSBkZWNpbWFsIHBvaW50LgorICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZQorICAgICAgZGVjaW1hbF9wb2ludCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19kZWNpbWFsX3BvaW50KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gdGhvdXNhbmRzIHNlcGFyYXRvciBjaGFyYWN0ZXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGNoYXJfdHlwZSB0byB1c2UgYXMgYSB0aG91c2FuZHMKKyAgICAgICAqICBzZXBhcmF0b3IuICBJdCBkb2VzIHNvIGJ5IHJldHVybmluZyByZXR1cm5pbmcKKyAgICAgICAqICBtb25leXB1bmN0PGNoYXJfdHlwZT46OmRvX3Rob3VzYW5kc19zZXAoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgY2hhcl90eXBlIHJlcHJlc2VudGluZyBhIHRob3VzYW5kcyBzZXBhcmF0b3IuCisgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICB0aG91c2FuZHNfc2VwKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3Rob3VzYW5kc19zZXAoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBncm91cGluZyBzcGVjaWZpY2F0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGdyb3VwaW5ncyBmb3IgdGhlCisgICAgICAgKiAgaW50ZWdlciBwYXJ0IG9mIGFuIGFtb3VudC4gIEdyb3VwaW5ncyBpbmRpY2F0ZSB3aGVyZSB0aG91c2FuZHMKKyAgICAgICAqICBzZXBhcmF0b3JzIHNob3VsZCBiZSBpbnNlcnRlZC4KKyAgICAgICAqCisgICAgICAgKiAgRWFjaCBjaGFyIGluIHRoZSByZXR1cm4gc3RyaW5nIGlzIGludGVycHJldCBhcyBhbiBpbnRlZ2VyIHJhdGhlcgorICAgICAgICogIHRoYW4gYSBjaGFyYWN0ZXIuICBUaGVzZSBudW1iZXJzIHJlcHJlc2VudCB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBpbiBhCisgICAgICAgKiAgZ3JvdXAuICBUaGUgZmlyc3QgY2hhciBpbiB0aGUgc3RyaW5nIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBkaWdpdHMKKyAgICAgICAqICBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgZ3JvdXAuICBJZiBhIGNoYXIgaXMgbmVnYXRpdmUsIGl0IGluZGljYXRlcworICAgICAgICogIGFuIHVubGltaXRlZCBudW1iZXIgb2YgZGlnaXRzIGZvciB0aGUgZ3JvdXAuICBJZiBtb3JlIGNoYXJzIGZyb20gdGhlCisgICAgICAgKiAgc3RyaW5nIGFyZSByZXF1aXJlZCB0byBncm91cCBhIG51bWJlciwgdGhlIGxhc3QgY2hhciBpcyB1c2VkCisgICAgICAgKiAgcmVwZWF0ZWRseS4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBncm91cGluZygpIHJldHVybnMgPGNvZGU+XDAwM1wwMDI8L2NvZGU+CisgICAgICAgKiAgYW5kIGlzIGFwcGxpZWQgdG8gdGhlIG51bWJlciAxMjM0NTY3ODksIHRoaXMgY29ycmVzcG9uZHMgdG8KKyAgICAgICAqICAxMiwzNCw1Niw3ODkuICBOb3RlIHRoYXQgaWYgdGhlIHN0cmluZyB3YXMgPGNvZGU+MzI8L2NvZGU+LCB0aGlzIHdvdWxkCisgICAgICAgKiAgcHV0IG1vcmUgdGhhbiA1MCBkaWdpdHMgaW50byB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgZ3JvdXAgaWYKKyAgICAgICAqICB0aGUgY2hhcmFjdGVyIHNldCBpcyBBU0NJSS4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIHN0cmluZyBpcyByZXR1cm5lZCBieSBjYWxsaW5nCisgICAgICAgKiAgbW9uZXlwdW5jdDxjaGFyX3R5cGU+Ojpkb19ncm91cGluZygpLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBzdHJpbmcgcmVwcmVzZW50aW5nIGdyb3VwaW5nIHNwZWNpZmljYXRpb24uCisgICAgICAqLworICAgICAgc3RyaW5nCisgICAgICBncm91cGluZygpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19ncm91cGluZygpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGN1cnJlbmN5IHN5bWJvbCBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHN0cmluZ190eXBlIHRvIHVzZSBhcyBhIGN1cnJlbmN5IHN5bWJvbC4gIEl0CisgICAgICAgKiAgZG9lcyBzbyBieSByZXR1cm5pbmcgcmV0dXJuaW5nCisgICAgICAgKiAgbW9uZXlwdW5jdDxjaGFyX3R5cGU+Ojpkb19jdXJyX3N5bWJvbCgpLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBAYSBzdHJpbmdfdHlwZSByZXByZXNlbnRpbmcgYSBjdXJyZW5jeSBzeW1ib2wuCisgICAgICAqLworICAgICAgc3RyaW5nX3R5cGUKKyAgICAgIGN1cnJfc3ltYm9sKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2N1cnJfc3ltYm9sKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gcG9zaXRpdmUgc2lnbiBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHN0cmluZ190eXBlIHRvIHVzZSBhcyBhIHNpZ24gZm9yIHBvc2l0aXZlCisgICAgICAgKiAgYW1vdW50cy4gIEl0IGRvZXMgc28gYnkgcmV0dXJuaW5nIHJldHVybmluZworICAgICAgICogIG1vbmV5cHVuY3Q8Y2hhcl90eXBlPjo6ZG9fcG9zaXRpdmVfc2lnbigpLgorICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgcmV0dXJuIHZhbHVlIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVyLCB0aGUgZmlyc3QKKyAgICAgICAqICBjaGFyYWN0ZXIgYXBwZWFycyBpbiB0aGUgcG9zaXRpb24gaW5kaWNhdGVkIGJ5IHBvc19mb3JtYXQoKSBhbmQgdGhlCisgICAgICAgKiAgcmVtYWluZGVyIGFwcGVhciBhdCB0aGUgZW5kIG9mIHRoZSBmb3JtYXR0ZWQgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBAYSBzdHJpbmdfdHlwZSByZXByZXNlbnRpbmcgYSBwb3NpdGl2ZSBzaWduLgorICAgICAgKi8KKyAgICAgIHN0cmluZ190eXBlCisgICAgICBwb3NpdGl2ZV9zaWduKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3Bvc2l0aXZlX3NpZ24oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBuZWdhdGl2ZSBzaWduIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nX3R5cGUgdG8gdXNlIGFzIGEgc2lnbiBmb3IgbmVnYXRpdmUKKyAgICAgICAqICBhbW91bnRzLiAgSXQgZG9lcyBzbyBieSByZXR1cm5pbmcgcmV0dXJuaW5nCisgICAgICAgKiAgbW9uZXlwdW5jdDxjaGFyX3R5cGU+Ojpkb19uZWdhdGl2ZV9zaWduKCkuCisgICAgICAgKgorICAgICAgICogIElmIHRoZSByZXR1cm4gdmFsdWUgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXIsIHRoZSBmaXJzdAorICAgICAgICogIGNoYXJhY3RlciBhcHBlYXJzIGluIHRoZSBwb3NpdGlvbiBpbmRpY2F0ZWQgYnkgbmVnX2Zvcm1hdCgpIGFuZCB0aGUKKyAgICAgICAqICByZW1haW5kZXIgYXBwZWFyIGF0IHRoZSBlbmQgb2YgdGhlIGZvcm1hdHRlZCBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIEBhIHN0cmluZ190eXBlIHJlcHJlc2VudGluZyBhIG5lZ2F0aXZlIHNpZ24uCisgICAgICAqLworICAgICAgc3RyaW5nX3R5cGUKKyAgICAgIG5lZ2F0aXZlX3NpZ24oKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fbmVnYXRpdmVfc2lnbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIG51bWJlciBvZiBkaWdpdHMgaW4gZnJhY3Rpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZXhhY3QgbnVtYmVyIG9mIGRpZ2l0cyB0aGF0IG1ha2UgdXAgdGhlCisgICAgICAgKiAgZnJhY3Rpb25hbCBwYXJ0IG9mIGEgbW9uZXkgYW1vdW50LiAgSXQgZG9lcyBzbyBieSByZXR1cm5pbmcKKyAgICAgICAqICByZXR1cm5pbmcgbW9uZXlwdW5jdDxjaGFyX3R5cGU+Ojpkb19mcmFjX2RpZ2l0cygpLgorICAgICAgICoKKyAgICAgICAqICBUaGUgZnJhY3Rpb25hbCBwYXJ0IG9mIGEgbW9uZXkgYW1vdW50IGlzIG9wdGlvbmFsLiAgQnV0IGlmIGl0IGlzCisgICAgICAgKiAgcHJlc2VudCwgdGhlcmUgbXVzdCBiZSBmcmFjX2RpZ2l0cygpIGRpZ2l0cy4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgTnVtYmVyIG9mIGRpZ2l0cyBpbiBhbW91bnQgZnJhY3Rpb24uCisgICAgICAqLworICAgICAgaW50CisgICAgICBmcmFjX2RpZ2l0cygpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19mcmFjX2RpZ2l0cygpOyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIHBhdHRlcm4gZm9yIG1vbmV5IHZhbHVlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcGF0dGVybiBkZXNjcmliaW5nIHRoZSBmb3JtYXR0aW5nIG9mIGEKKyAgICAgICAqICBwb3NpdGl2ZSBvciBuZWdhdGl2ZSB2YWx1ZWQgbW9uZXkgYW1vdW50LiAgSXQgZG9lcyBzbyBieSByZXR1cm5pbmcKKyAgICAgICAqICByZXR1cm5pbmcgbW9uZXlwdW5jdDxjaGFyX3R5cGU+Ojpkb19wb3NfZm9ybWF0KCkgb3IKKyAgICAgICAqICBtb25leXB1bmN0PGNoYXJfdHlwZT46OmRvX25lZ19mb3JtYXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIHBhdHRlcm4gaGFzIDQgZmllbGRzIGRlc2NyaWJpbmcgdGhlIG9yZGVyaW5nIG9mIHN5bWJvbCwgc2lnbiwKKyAgICAgICAqICB2YWx1ZSwgYW5kIG5vbmUgb3Igc3BhY2UuICBUaGVyZSBtdXN0IGJlIG9uZSBvZiBlYWNoIGluIHRoZSBwYXR0ZXJuLgorICAgICAgICogIFRoZSBub25lIGFuZCBzcGFjZSBlbnVtcyBtYXkgbm90IGFwcGVhciBpbiB0aGUgZmlyc3QgZmllbGQgYW5kIHNwYWNlCisgICAgICAgKiAgbWF5IG5vdCBhcHBlYXIgaW4gdGhlIGZpbmFsIGZpZWxkLgorICAgICAgICoKKyAgICAgICAqICBUaGUgcGFydHMgb2YgYSBtb25leSBzdHJpbmcgbXVzdCBhcHBlYXIgaW4gdGhlIG9yZGVyIGluZGljYXRlZCBieQorICAgICAgICogIHRoZSBmaWVsZHMgb2YgdGhlIHBhdHRlcm4uICBUaGUgc3ltYm9sIGZpZWxkIGluZGljYXRlcyB0aGF0IHRoZQorICAgICAgICogIHZhbHVlIG9mIGN1cnJfc3ltYm9sKCkgbWF5IGJlIHByZXNlbnQuICBUaGUgc2lnbiBmaWVsZCBpbmRpY2F0ZXMKKyAgICAgICAqICB0aGF0IHRoZSB2YWx1ZSBvZiBwb3NpdGl2ZV9zaWduKCkgb3IgbmVnYXRpdmVfc2lnbigpIG11c3QgYmUKKyAgICAgICAqICBwcmVzZW50LiAgVGhlIHZhbHVlIGZpZWxkIGluZGljYXRlcyB0aGF0IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUKKyAgICAgICAqICBtb25leSBhbW91bnQgaXMgcHJlc2VudC4gIG5vbmUgaW5kaWNhdGVzIDAgb3IgbW9yZSB3aGl0ZXNwYWNlCisgICAgICAgKiAgY2hhcmFjdGVycywgZXhjZXB0IGF0IHRoZSBlbmQsIHdoZXJlIGl0IHBlcm1pdHMgbm8gd2hpdGVzcGFjZS4KKyAgICAgICAqICBzcGFjZSBpbmRpY2F0ZXMgdGhhdCAxIG9yIG1vcmUgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIG11c3QgYmUKKyAgICAgICAqICBwcmVzZW50LgorICAgICAgICoKKyAgICAgICAqICBGb3IgZXhhbXBsZSwgZm9yIHRoZSBVUyBsb2NhbGUgYW5kIHBvc19mb3JtYXQoKSBwYXR0ZXJuCisgICAgICAgKiAge3N5bWJvbCxzaWduLHZhbHVlLG5vbmV9LCBjdXJyX3N5bWJvbCgpID09ICZhcG9zOyQmYXBvczsKKyAgICAgICAqICBwb3NpdGl2ZV9zaWduKCkgPT0gJmFwb3M7KyZhcG9zOywgYW5kIHZhbHVlIDEwLjAxLCBhbmQKKyAgICAgICAqICBvcHRpb25zIHNldCB0byBmb3JjZSB0aGUgc3ltYm9sLCB0aGUgY29ycmVzcG9uZGluZyBzdHJpbmcgaXMKKyAgICAgICAqICA8Y29kZT4kKzEwLjAxPC9jb2RlPi4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgUGF0dGVybiBmb3IgbW9uZXkgdmFsdWVzLgorICAgICAgKi8KKyAgICAgIHBhdHRlcm4KKyAgICAgIHBvc19mb3JtYXQoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fcG9zX2Zvcm1hdCgpOyB9CisKKyAgICAgIHBhdHRlcm4KKyAgICAgIG5lZ19mb3JtYXQoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fbmVnX2Zvcm1hdCgpOyB9CisgICAgICAvL0B9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLy8gRGVzdHJ1Y3Rvci4KKyAgICAgIHZpcnR1YWwKKyAgICAgIH5tb25leXB1bmN0KCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGRlY2ltYWwgcG9pbnQgY2hhcmFjdGVyLgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGEgY2hhcl90eXBlIHRvIHVzZSBhcyBhIGRlY2ltYWwgcG9pbnQuICBUaGlzIGZ1bmN0aW9uIGlzIGEKKyAgICAgICAqICBob29rIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgQGEgY2hhcl90eXBlIHJlcHJlc2VudGluZyBhIGRlY2ltYWwgcG9pbnQuCisgICAgICAqLworICAgICAgdmlydHVhbCBjaGFyX3R5cGUKKyAgICAgIGRvX2RlY2ltYWxfcG9pbnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGF0YS0+X01fZGVjaW1hbF9wb2ludDsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiB0aG91c2FuZHMgc2VwYXJhdG9yIGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIGNoYXJfdHlwZSB0byB1c2UgYXMgYSB0aG91c2FuZHMgc2VwYXJhdG9yLiAgVGhpcyBmdW5jdGlvbgorICAgICAgICogIGlzIGEgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIEBhIGNoYXJfdHlwZSByZXByZXNlbnRpbmcgYSB0aG91c2FuZHMgc2VwYXJhdG9yLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY2hhcl90eXBlCisgICAgICBkb190aG91c2FuZHNfc2VwKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGEtPl9NX3Rob3VzYW5kc19zZXA7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gZ3JvdXBpbmcgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgZ3JvdXBpbmdzIGZvciB0aGUgaW50ZWdlciBwYXJ0IG9mIGEKKyAgICAgICAqICBudW1iZXIuICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUKKyAgICAgICAqICB2YWx1ZSByZXR1cm5lZC4gIEBzZWUgZ3JvdXBpbmcoKSBmb3IgZGV0YWlscy4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgU3RyaW5nIHJlcHJlc2VudGluZyBncm91cGluZyBzcGVjaWZpY2F0aW9uLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgc3RyaW5nCisgICAgICBkb19ncm91cGluZygpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kYXRhLT5fTV9ncm91cGluZzsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBjdXJyZW5jeSBzeW1ib2wgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmdfdHlwZSB0byB1c2UgYXMgYSBjdXJyZW5jeSBzeW1ib2wuCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlCisgICAgICAgKiAgcmV0dXJuZWQuICBAc2VlIGN1cnJfc3ltYm9sKCkgZm9yIGRldGFpbHMuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIEBhIHN0cmluZ190eXBlIHJlcHJlc2VudGluZyBhIGN1cnJlbmN5IHN5bWJvbC4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIHN0cmluZ190eXBlCisgICAgICBkb19jdXJyX3N5bWJvbCgpICAgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGEtPl9NX2N1cnJfc3ltYm9sOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIHBvc2l0aXZlIHNpZ24gc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmdfdHlwZSB0byB1c2UgYXMgYSBzaWduIGZvciBwb3NpdGl2ZQorICAgICAgICogIGFtb3VudHMuICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUKKyAgICAgICAqICB2YWx1ZSByZXR1cm5lZC4gIEBzZWUgcG9zaXRpdmVfc2lnbigpIGZvciBkZXRhaWxzLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBAYSBzdHJpbmdfdHlwZSByZXByZXNlbnRpbmcgYSBwb3NpdGl2ZSBzaWduLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgc3RyaW5nX3R5cGUKKyAgICAgIGRvX3Bvc2l0aXZlX3NpZ24oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGF0YS0+X01fcG9zaXRpdmVfc2lnbjsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBuZWdhdGl2ZSBzaWduIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nX3R5cGUgdG8gdXNlIGFzIGEgc2lnbiBmb3IgbmVnYXRpdmUKKyAgICAgICAqICBhbW91bnRzLiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlCisgICAgICAgKiAgdmFsdWUgcmV0dXJuZWQuICBAc2VlIG5lZ2F0aXZlX3NpZ24oKSBmb3IgZGV0YWlscy4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgQGEgc3RyaW5nX3R5cGUgcmVwcmVzZW50aW5nIGEgbmVnYXRpdmUgc2lnbi4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIHN0cmluZ190eXBlCisgICAgICBkb19uZWdhdGl2ZV9zaWduKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGEtPl9NX25lZ2F0aXZlX3NpZ247IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gbnVtYmVyIG9mIGRpZ2l0cyBpbiBmcmFjdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBleGFjdCBudW1iZXIgb2YgZGlnaXRzIHRoYXQgbWFrZSB1cCB0aGUKKyAgICAgICAqICBmcmFjdGlvbmFsIHBhcnQgb2YgYSBtb25leSBhbW91bnQuICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IKKyAgICAgICAqICBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZC4gIEBzZWUgZnJhY19kaWdpdHMoKQorICAgICAgICogIGZvciBkZXRhaWxzLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBOdW1iZXIgb2YgZGlnaXRzIGluIGFtb3VudCBmcmFjdGlvbi4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGludAorICAgICAgZG9fZnJhY19kaWdpdHMoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGF0YS0+X01fZnJhY19kaWdpdHM7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gcGF0dGVybiBmb3IgbW9uZXkgdmFsdWVzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGZvcm1hdHRpbmcgb2YgYQorICAgICAgICogIHBvc2l0aXZlIHZhbHVlZCBtb25leSBhbW91bnQuICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IgZGVyaXZlZAorICAgICAgICogIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZC4gIEBzZWUgcG9zX2Zvcm1hdCgpIGZvcgorICAgICAgICogIGRldGFpbHMuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIFBhdHRlcm4gZm9yIG1vbmV5IHZhbHVlcy4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIHBhdHRlcm4KKyAgICAgIGRvX3Bvc19mb3JtYXQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGF0YS0+X01fcG9zX2Zvcm1hdDsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBwYXR0ZXJuIGZvciBtb25leSB2YWx1ZXMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBhdHRlcm4gZGVzY3JpYmluZyB0aGUgZm9ybWF0dGluZyBvZiBhCisgICAgICAgKiAgbmVnYXRpdmUgdmFsdWVkIG1vbmV5IGFtb3VudC4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkCisgICAgICAgKiAgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLiAgQHNlZSBuZWdfZm9ybWF0KCkgZm9yCisgICAgICAgKiAgZGV0YWlscy4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgUGF0dGVybiBmb3IgbW9uZXkgdmFsdWVzLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgcGF0dGVybgorICAgICAgZG9fbmVnX2Zvcm1hdCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kYXRhLT5fTV9uZWdfZm9ybWF0OyB9CisKKyAgICAgIC8vIEZvciB1c2UgYXQgY29uc3RydWN0aW9uIHRpbWUgb25seS4KKyAgICAgICB2b2lkCisgICAgICAgX01faW5pdGlhbGl6ZV9tb25leXB1bmN0KF9fY19sb2NhbGUgX19jbG9jID0gMCwKKwkJCQljb25zdCBjaGFyKiBfX25hbWUgPSAwKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgYm9vbCBfSW50bD4KKyAgICBsb2NhbGU6OmlkIG1vbmV5cHVuY3Q8X0NoYXJULCBfSW50bD46OmlkOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgYm9vbCBfSW50bD4KKyAgICBjb25zdCBib29sIG1vbmV5cHVuY3Q8X0NoYXJULCBfSW50bD46OmludGw7CisKKyAgdGVtcGxhdGU8PgorICAgIG1vbmV5cHVuY3Q8Y2hhciwgdHJ1ZT46On5tb25leXB1bmN0KCk7CisKKyAgdGVtcGxhdGU8PgorICAgIG1vbmV5cHVuY3Q8Y2hhciwgZmFsc2U+Ojp+bW9uZXlwdW5jdCgpOworCisgIHRlbXBsYXRlPD4KKyAgICB2b2lkCisgICAgbW9uZXlwdW5jdDxjaGFyLCB0cnVlPjo6X01faW5pdGlhbGl6ZV9tb25leXB1bmN0KF9fY19sb2NhbGUsIGNvbnN0IGNoYXIqKTsKKworICB0ZW1wbGF0ZTw+CisgICAgdm9pZAorICAgIG1vbmV5cHVuY3Q8Y2hhciwgZmFsc2U+OjpfTV9pbml0aWFsaXplX21vbmV5cHVuY3QoX19jX2xvY2FsZSwgY29uc3QgY2hhciopOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdGVtcGxhdGU8PgorICAgIG1vbmV5cHVuY3Q8d2NoYXJfdCwgdHJ1ZT46On5tb25leXB1bmN0KCk7CisKKyAgdGVtcGxhdGU8PgorICAgIG1vbmV5cHVuY3Q8d2NoYXJfdCwgZmFsc2U+Ojp+bW9uZXlwdW5jdCgpOworCisgIHRlbXBsYXRlPD4KKyAgICB2b2lkCisgICAgbW9uZXlwdW5jdDx3Y2hhcl90LCB0cnVlPjo6X01faW5pdGlhbGl6ZV9tb25leXB1bmN0KF9fY19sb2NhbGUsCisJCQkJCQkJY29uc3QgY2hhciopOworCisgIHRlbXBsYXRlPD4KKyAgICB2b2lkCisgICAgbW9uZXlwdW5jdDx3Y2hhcl90LCBmYWxzZT46Ol9NX2luaXRpYWxpemVfbW9uZXlwdW5jdChfX2NfbG9jYWxlLAorCQkJCQkJCSBjb25zdCBjaGFyKik7CisjZW5kaWYKKworICAvLy8gY2xhc3MgbW9uZXlwdW5jdF9ieW5hbWUgWzIyLjIuNi40XS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCBib29sIF9JbnRsPgorICAgIGNsYXNzIG1vbmV5cHVuY3RfYnluYW1lIDogcHVibGljIG1vbmV5cHVuY3Q8X0NoYXJULCBfSW50bD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQ2hhclQJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQ+CXN0cmluZ190eXBlOworCisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBpbnRsID0gX0ludGw7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBtb25leXB1bmN0X2J5bmFtZShjb25zdCBjaGFyKiBfX3MsIHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiBtb25leXB1bmN0PF9DaGFyVCwgX0ludGw+KF9fcmVmcykKKyAgICAgIHsKKwlpZiAoX19idWlsdGluX3N0cmNtcChfX3MsICJDIikgIT0gMAorCSAgICAmJiBfX2J1aWx0aW5fc3RyY21wKF9fcywgIlBPU0lYIikgIT0gMCkKKwkgIHsKKwkgICAgX19jX2xvY2FsZSBfX3RtcDsKKwkgICAgdGhpcy0+X1NfY3JlYXRlX2NfbG9jYWxlKF9fdG1wLCBfX3MpOworCSAgICB0aGlzLT5fTV9pbml0aWFsaXplX21vbmV5cHVuY3QoX190bXApOworCSAgICB0aGlzLT5fU19kZXN0cm95X2NfbG9jYWxlKF9fdG1wKTsKKwkgIH0KKyAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5tb25leXB1bmN0X2J5bmFtZSgpIHsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCBib29sIF9JbnRsPgorICAgIGNvbnN0IGJvb2wgbW9uZXlwdW5jdF9ieW5hbWU8X0NoYXJULCBfSW50bD46OmludGw7CisKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9MREJMCisKKyAgLyoqCisgICAqICBAYnJpZWYgIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUgbW9uZXlfZ2V0LgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKgorICAgKiAgVGhpcyBmYWNldCBlbmNhcHN1bGF0ZXMgdGhlIGNvZGUgdG8gcGFyc2UgYW5kIHJldHVybiBhIG1vbmV0YXJ5CisgICAqICBhbW91bnQgZnJvbSBhIHN0cmluZy4KKyAgICoKKyAgICogIFRoZSBtb25leV9nZXQgdGVtcGxhdGUgdXNlcyBwcm90ZWN0ZWQgdmlydHVhbCBmdW5jdGlvbnMgdG8KKyAgICogIHByb3ZpZGUgdGhlIGFjdHVhbCByZXN1bHRzLiAgVGhlIHB1YmxpYyBhY2Nlc3NvcnMgZm9yd2FyZCB0aGUKKyAgICogIGNhbGwgdG8gdGhlIHZpcnR1YWwgZnVuY3Rpb25zLiAgVGhlc2UgdmlydHVhbCBmdW5jdGlvbnMgYXJlCisgICAqICBob29rcyBmb3IgZGV2ZWxvcGVycyB0byBpbXBsZW1lbnQgdGhlIGJlaGF2aW9yIHRoZXkgcmVxdWlyZSBmcm9tCisgICAqICB0aGUgbW9uZXlfZ2V0IGZhY2V0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgY2xhc3MgbW9uZXlfZ2V0IDogcHVibGljIGxvY2FsZTo6ZmFjZXQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICAvL0B7CisgICAgICAvLy8gUHVibGljIHR5cGVkZWZzCisgICAgICB0eXBlZGVmIF9DaGFyVAkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0luSXRlcgkJCWl0ZXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVD4Jc3RyaW5nX3R5cGU7CisgICAgICAvL0B9CisKKyAgICAgIC8vLyBOdW1wdW5jdCBmYWNldCBpZC4KKyAgICAgIHN0YXRpYyBsb2NhbGU6OmlkCQkJaWQ7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0b3IgcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIHByb3ZpZGVkIGJ5IHRoZSBzdGFuZGFyZC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fcmVmcyAgUGFzc2VkIHRvIHRoZSBiYXNlIGZhY2V0IGNsYXNzLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBtb25leV9nZXQoc2l6ZV90IF9fcmVmcyA9IDApIDogZmFjZXQoX19yZWZzKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZWFkIGFuZCBwYXJzZSBhIG1vbmV0YXJ5IHZhbHVlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJlYWRzIGNoYXJhY3RlcnMgZnJvbSBAYSBfX3MsIGludGVycHJldHMgdGhlbSBhcyBhCisgICAgICAgKiAgbW9uZXRhcnkgdmFsdWUgYWNjb3JkaW5nIHRvIG1vbmV5cHVuY3QgYW5kIGN0eXBlIGZhY2V0cyByZXRyaWV2ZWQKKyAgICAgICAqICBmcm9tIGlvLmdldGxvYygpLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGluIEBhIHVuaXRzIGFzIGFuIGludGVncmFsCisgICAgICAgKiAgdmFsdWUgbW9uZXlwdW5jdDo6ZnJhY19kaWdpdHMoKSAqIHRoZSBhY3R1YWwgYW1vdW50LiAgRm9yIGV4YW1wbGUsCisgICAgICAgKiAgdGhlIHN0cmluZyAkMTAuMDEgaW4gYSBVUyBsb2NhbGUgd291bGQgc3RvcmUgMTAwMSBpbiBAYSB1bml0cy4KKyAgICAgICAqCisgICAgICAgKiAgQW55IGNoYXJhY3RlcnMgbm90IHBhcnQgb2YgYSB2YWxpZCBtb25leSBhbW91bnQgYXJlIG5vdCBjb25zdW1lZC4KKyAgICAgICAqCisgICAgICAgKiAgSWYgYSBtb25leSB2YWx1ZSBjYW5ub3QgYmUgcGFyc2VkIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgc2V0cworICAgICAgICogIGVycj0oZXJyfGlvLmZhaWxiaXQpLiAgSWYgdGhlIHN0cmVhbSBpcyBjb25zdW1lZCBiZWZvcmUgZmluaXNoaW5nCisgICAgICAgKiAgcGFyc2luZywgIHNldHMgZXJyPShlcnJ8aW8uZmFpbGJpdHxpby5lb2ZiaXQpLiAgQGEgdW5pdHMgaXMKKyAgICAgICAqICB1bmNoYW5nZWQgaWYgcGFyc2luZyBmYWlscy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3b3JrcyBieSByZXR1cm5pbmcgdGhlIHJlc3VsdCBvZiBkb19nZXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFN0YXJ0IG9mIGNoYXJhY3RlcnMgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBfX2VuZCAgRW5kIG9mIGNoYXJhY3RlcnMgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBfX2ludGwgIFBhcmFtZXRlciB0byB1c2VfZmFjZXQ8bW9uZXlwdW5jdDxDaGFyVCxpbnRsPiA+LgorICAgICAgICogIEBwYXJhbSAgX19pbyAgU291cmNlIG9mIGZhY2V0cyBhbmQgaW8gc3RhdGUuCisgICAgICAgKiAgQHBhcmFtICBfX2VyciAgRXJyb3IgZmllbGQgdG8gc2V0IGlmIHBhcnNpbmcgZmFpbHMuCisgICAgICAgKiAgQHBhcmFtICBfX3VuaXRzICBQbGFjZSB0byBzdG9yZSByZXN1bHQgb2YgcGFyc2luZy4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciByZWZlcmVuY2luZyBmaXJzdCBjaGFyYWN0ZXIgYmV5b25kIHZhbGlkIG1vbmV5CisgICAgICAgKgkgICBhbW91bnQuCisgICAgICAgKi8KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgZ2V0KGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSBfX2VuZCwgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvLAorCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nIGRvdWJsZSYgX191bml0cykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldChfX3MsIF9fZW5kLCBfX2ludGwsIF9faW8sIF9fZXJyLCBfX3VuaXRzKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlYWQgYW5kIHBhcnNlIGEgbW9uZXRhcnkgdmFsdWUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmVhZHMgY2hhcmFjdGVycyBmcm9tIEBhIF9fcywgaW50ZXJwcmV0cyB0aGVtIGFzCisgICAgICAgKiAgYSBtb25ldGFyeSB2YWx1ZSBhY2NvcmRpbmcgdG8gbW9uZXlwdW5jdCBhbmQgY3R5cGUgZmFjZXRzCisgICAgICAgKiAgcmV0cmlldmVkIGZyb20gaW8uZ2V0bG9jKCksIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgaW4gQGEKKyAgICAgICAqICBkaWdpdHMuICBGb3IgZXhhbXBsZSwgdGhlIHN0cmluZyAkMTAuMDEgaW4gYSBVUyBsb2NhbGUgd291bGQKKyAgICAgICAqICBzdG9yZSA8Y29kZT4xMDAxPC9jb2RlPiBpbiBAYSBkaWdpdHMuCisgICAgICAgKgorICAgICAgICogIEFueSBjaGFyYWN0ZXJzIG5vdCBwYXJ0IG9mIGEgdmFsaWQgbW9uZXkgYW1vdW50IGFyZSBub3QgY29uc3VtZWQuCisgICAgICAgKgorICAgICAgICogIElmIGEgbW9uZXkgdmFsdWUgY2Fubm90IGJlIHBhcnNlZCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHNldHMKKyAgICAgICAqICBlcnI9KGVycnxpby5mYWlsYml0KS4gIElmIHRoZSBzdHJlYW0gaXMgY29uc3VtZWQgYmVmb3JlIGZpbmlzaGluZworICAgICAgICogIHBhcnNpbmcsICBzZXRzIGVycj0oZXJyfGlvLmZhaWxiaXR8aW8uZW9mYml0KS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3b3JrcyBieSByZXR1cm5pbmcgdGhlIHJlc3VsdCBvZiBkb19nZXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFN0YXJ0IG9mIGNoYXJhY3RlcnMgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBfX2VuZCAgRW5kIG9mIGNoYXJhY3RlcnMgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBfX2ludGwgIFBhcmFtZXRlciB0byB1c2VfZmFjZXQ8bW9uZXlwdW5jdDxDaGFyVCxpbnRsPiA+LgorICAgICAgICogIEBwYXJhbSAgX19pbyAgU291cmNlIG9mIGZhY2V0cyBhbmQgaW8gc3RhdGUuCisgICAgICAgKiAgQHBhcmFtICBfX2VyciAgRXJyb3IgZmllbGQgdG8gc2V0IGlmIHBhcnNpbmcgZmFpbHMuCisgICAgICAgKiAgQHBhcmFtICBfX2RpZ2l0cyAgUGxhY2UgdG8gc3RvcmUgcmVzdWx0IG9mIHBhcnNpbmcuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgZmlyc3QgY2hhcmFjdGVyIGJleW9uZCB2YWxpZCBtb25leQorICAgICAgICoJICAgYW1vdW50LgorICAgICAgICovCisgICAgICBpdGVyX3R5cGUKKyAgICAgIGdldChpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgX19lbmQsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19pbywKKwkgIGlvc19iYXNlOjppb3N0YXRlJiBfX2Vyciwgc3RyaW5nX3R5cGUmIF9fZGlnaXRzKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZ2V0KF9fcywgX19lbmQsIF9faW50bCwgX19pbywgX19lcnIsIF9fZGlnaXRzKTsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8vIERlc3RydWN0b3IuCisgICAgICB2aXJ0dWFsCisgICAgICB+bW9uZXlfZ2V0KCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVhZCBhbmQgcGFyc2UgYSBtb25ldGFyeSB2YWx1ZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZWFkcyBhbmQgcGFyc2VzIGNoYXJhY3RlcnMgcmVwcmVzZW50aW5nIGEgbW9uZXRhcnkKKyAgICAgICAqICB2YWx1ZS4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZQorICAgICAgICogIHZhbHVlIHJldHVybmVkLiAgQHNlZSBnZXQoKSBmb3IgZGV0YWlscy4KKyAgICAgICAqLworICAgICAgLy8gWFhYIEdMSUJDWFhfQUJJIERlcHJlY2F0ZWQKKyNpZiBkZWZpbmVkIF9HTElCQ1hYX0xPTkdfRE9VQkxFX0NPTVBBVCAmJiBkZWZpbmVkIF9fTE9OR19ET1VCTEVfMTI4X18KKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBfX2RvX2dldChpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgX19lbmQsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19pbywKKwkgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBkb3VibGUmIF9fdW5pdHMpIGNvbnN0OworI2Vsc2UKKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXQoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlIF9fZW5kLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9faW8sCisJICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGxvbmcgZG91YmxlJiBfX3VuaXRzKSBjb25zdDsKKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlYWQgYW5kIHBhcnNlIGEgbW9uZXRhcnkgdmFsdWUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmVhZHMgYW5kIHBhcnNlcyBjaGFyYWN0ZXJzIHJlcHJlc2VudGluZyBhIG1vbmV0YXJ5CisgICAgICAgKiAgdmFsdWUuICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUKKyAgICAgICAqICB2YWx1ZSByZXR1cm5lZC4gIEBzZWUgZ2V0KCkgZm9yIGRldGFpbHMuCisgICAgICAgKi8KKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXQoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlIF9fZW5kLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9faW8sCisJICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHN0cmluZ190eXBlJiBfX2RpZ2l0cykgY29uc3Q7CisKKyAgICAgIC8vIFhYWCBHTElCQ1hYX0FCSSBEZXByZWNhdGVkCisjaWYgZGVmaW5lZCBfR0xJQkNYWF9MT05HX0RPVUJMRV9DT01QQVQgJiYgZGVmaW5lZCBfX0xPTkdfRE9VQkxFXzEyOF9fCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSBfX2VuZCwgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvLAorCSAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nIGRvdWJsZSYgX191bml0cykgY29uc3Q7CisjZW5kaWYKKworICAgICAgdGVtcGxhdGU8Ym9vbCBfSW50bD4KKyAgICAgICAgaXRlcl90eXBlCisgICAgICAgIF9NX2V4dHJhY3QoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkJICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBzdHJpbmcmIF9fZGlnaXRzKSBjb25zdDsgICAgIAorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIGxvY2FsZTo6aWQgbW9uZXlfZ2V0PF9DaGFyVCwgX0luSXRlcj46OmlkOworCisgIC8qKgorICAgKiAgQGJyaWVmICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIG1vbmV5X3B1dC4KKyAgICogIEBpbmdyb3VwIGxvY2FsZXMKKyAgICoKKyAgICogIFRoaXMgZmFjZXQgZW5jYXBzdWxhdGVzIHRoZSBjb2RlIHRvIGZvcm1hdCBhbmQgb3V0cHV0IGEgbW9uZXRhcnkKKyAgICogIGFtb3VudC4KKyAgICoKKyAgICogIFRoZSBtb25leV9wdXQgdGVtcGxhdGUgdXNlcyBwcm90ZWN0ZWQgdmlydHVhbCBmdW5jdGlvbnMgdG8KKyAgICogIHByb3ZpZGUgdGhlIGFjdHVhbCByZXN1bHRzLiAgVGhlIHB1YmxpYyBhY2Nlc3NvcnMgZm9yd2FyZCB0aGUKKyAgICogIGNhbGwgdG8gdGhlIHZpcnR1YWwgZnVuY3Rpb25zLiAgVGhlc2UgdmlydHVhbCBmdW5jdGlvbnMgYXJlCisgICAqICBob29rcyBmb3IgZGV2ZWxvcGVycyB0byBpbXBsZW1lbnQgdGhlIGJlaGF2aW9yIHRoZXkgcmVxdWlyZSBmcm9tCisgICAqICB0aGUgbW9uZXlfcHV0IGZhY2V0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgorICAgIGNsYXNzIG1vbmV5X3B1dCA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBQdWJsaWMgdHlwZWRlZnMKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfT3V0SXRlcgkJCWl0ZXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVD4Jc3RyaW5nX3R5cGU7CisgICAgICAvL0B9CisKKyAgICAgIC8vLyBOdW1wdW5jdCBmYWNldCBpZC4KKyAgICAgIHN0YXRpYyBsb2NhbGU6OmlkCQkJaWQ7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0b3IgcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIHByb3ZpZGVkIGJ5IHRoZSBzdGFuZGFyZC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fcmVmcyAgUGFzc2VkIHRvIHRoZSBiYXNlIGZhY2V0IGNsYXNzLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBtb25leV9wdXQoc2l6ZV90IF9fcmVmcyA9IDApIDogZmFjZXQoX19yZWZzKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGb3JtYXQgYW5kIG91dHB1dCBhIG1vbmV0YXJ5IHZhbHVlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZvcm1hdHMgQGEgdW5pdHMgYXMgYSBtb25ldGFyeSB2YWx1ZSBhY2NvcmRpbmcgdG8KKyAgICAgICAqICBtb25leXB1bmN0IGFuZCBjdHlwZSBmYWNldHMgcmV0cmlldmVkIGZyb20gaW8uZ2V0bG9jKCksIGFuZCB3cml0ZXMKKyAgICAgICAqICB0aGUgcmVzdWx0aW5nIGNoYXJhY3RlcnMgdG8gQGEgX19zLiAgRm9yIGV4YW1wbGUsIHRoZSB2YWx1ZSAxMDAxIGluIGEKKyAgICAgICAqICBVUyBsb2NhbGUgd291bGQgd3JpdGUgPGNvZGU+JDEwLjAxPC9jb2RlPiB0byBAYSBfX3MuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd29ya3MgYnkgcmV0dXJuaW5nIHRoZSByZXN1bHQgb2YgZG9fcHV0KCkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19zICBUaGUgc3RyZWFtIHRvIHdyaXRlIHRvLgorICAgICAgICogIEBwYXJhbSAgX19pbnRsICBQYXJhbWV0ZXIgdG8gdXNlX2ZhY2V0PG1vbmV5cHVuY3Q8Q2hhclQsaW50bD4gPi4KKyAgICAgICAqICBAcGFyYW0gIF9faW8gIFNvdXJjZSBvZiBmYWNldHMgYW5kIGlvIHN0YXRlLgorICAgICAgICogIEBwYXJhbSAgX19maWxsICBjaGFyX3R5cGUgdG8gdXNlIGZvciBwYWRkaW5nLgorICAgICAgICogIEBwYXJhbSAgX191bml0cyAgUGxhY2UgdG8gc3RvcmUgcmVzdWx0IG9mIHBhcnNpbmcuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgYWZ0ZXIgd3JpdGluZy4KKyAgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBwdXQoaXRlcl90eXBlIF9fcywgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvLAorCSAgY2hhcl90eXBlIF9fZmlsbCwgbG9uZyBkb3VibGUgX191bml0cykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3B1dChfX3MsIF9faW50bCwgX19pbywgX19maWxsLCBfX3VuaXRzKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZvcm1hdCBhbmQgb3V0cHV0IGEgbW9uZXRhcnkgdmFsdWUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZm9ybWF0cyBAYSBkaWdpdHMgYXMgYSBtb25ldGFyeSB2YWx1ZQorICAgICAgICogIGFjY29yZGluZyB0byBtb25leXB1bmN0IGFuZCBjdHlwZSBmYWNldHMgcmV0cmlldmVkIGZyb20KKyAgICAgICAqICBpby5nZXRsb2MoKSwgYW5kIHdyaXRlcyB0aGUgcmVzdWx0aW5nIGNoYXJhY3RlcnMgdG8gQGEgX19zLgorICAgICAgICogIEZvciBleGFtcGxlLCB0aGUgc3RyaW5nIDxjb2RlPjEwMDE8L2NvZGU+IGluIGEgVVMgbG9jYWxlCisgICAgICAgKiAgd291bGQgd3JpdGUgPGNvZGU+JDEwLjAxPC9jb2RlPiB0byBAYSBfX3MuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd29ya3MgYnkgcmV0dXJuaW5nIHRoZSByZXN1bHQgb2YgZG9fcHV0KCkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19zICBUaGUgc3RyZWFtIHRvIHdyaXRlIHRvLgorICAgICAgICogIEBwYXJhbSAgX19pbnRsICBQYXJhbWV0ZXIgdG8gdXNlX2ZhY2V0PG1vbmV5cHVuY3Q8Q2hhclQsaW50bD4gPi4KKyAgICAgICAqICBAcGFyYW0gIF9faW8gIFNvdXJjZSBvZiBmYWNldHMgYW5kIGlvIHN0YXRlLgorICAgICAgICogIEBwYXJhbSAgX19maWxsICBjaGFyX3R5cGUgdG8gdXNlIGZvciBwYWRkaW5nLgorICAgICAgICogIEBwYXJhbSAgX19kaWdpdHMgIFBsYWNlIHRvIHN0b3JlIHJlc3VsdCBvZiBwYXJzaW5nLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIGFmdGVyIHdyaXRpbmcuCisgICAgICAgKi8KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgcHV0KGl0ZXJfdHlwZSBfX3MsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19pbywKKwkgIGNoYXJfdHlwZSBfX2ZpbGwsIGNvbnN0IHN0cmluZ190eXBlJiBfX2RpZ2l0cykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3B1dChfX3MsIF9faW50bCwgX19pbywgX19maWxsLCBfX2RpZ2l0cyk7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vLyBEZXN0cnVjdG9yLgorICAgICAgdmlydHVhbAorICAgICAgfm1vbmV5X3B1dCgpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZvcm1hdCBhbmQgb3V0cHV0IGEgbW9uZXRhcnkgdmFsdWUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZm9ybWF0cyBAYSB1bml0cyBhcyBhIG1vbmV0YXJ5IHZhbHVlIGFjY29yZGluZyB0bworICAgICAgICogIG1vbmV5cHVuY3QgYW5kIGN0eXBlIGZhY2V0cyByZXRyaWV2ZWQgZnJvbSBpby5nZXRsb2MoKSwgYW5kIHdyaXRlcworICAgICAgICogIHRoZSByZXN1bHRpbmcgY2hhcmFjdGVycyB0byBAYSBfX3MuICBGb3IgZXhhbXBsZSwgdGhlIHZhbHVlIDEwMDEgaW4gYQorICAgICAgICogIFVTIGxvY2FsZSB3b3VsZCB3cml0ZSA8Y29kZT4kMTAuMDE8L2NvZGU+IHRvIEBhIF9fcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlCisgICAgICAgKiAgcmV0dXJuZWQuICBAc2VlIHB1dCgpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fcyAgVGhlIHN0cmVhbSB0byB3cml0ZSB0by4KKyAgICAgICAqICBAcGFyYW0gIF9faW50bCAgUGFyYW1ldGVyIHRvIHVzZV9mYWNldDxtb25leXB1bmN0PENoYXJULGludGw+ID4uCisgICAgICAgKiAgQHBhcmFtICBfX2lvICBTb3VyY2Ugb2YgZmFjZXRzIGFuZCBpbyBzdGF0ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlsbCAgY2hhcl90eXBlIHRvIHVzZSBmb3IgcGFkZGluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fdW5pdHMgIFBsYWNlIHRvIHN0b3JlIHJlc3VsdCBvZiBwYXJzaW5nLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIGFmdGVyIHdyaXRpbmcuCisgICAgICAgKi8KKyAgICAgIC8vIFhYWCBHTElCQ1hYX0FCSSBEZXByZWNhdGVkCisjaWYgZGVmaW5lZCBfR0xJQkNYWF9MT05HX0RPVUJMRV9DT01QQVQgJiYgZGVmaW5lZCBfX0xPTkdfRE9VQkxFXzEyOF9fCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgX19kb19wdXQoaXRlcl90eXBlIF9fcywgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLAorCSAgICAgICBkb3VibGUgX191bml0cykgY29uc3Q7CisjZWxzZQorICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX3B1dChpdGVyX3R5cGUgX19zLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCisJICAgICBsb25nIGRvdWJsZSBfX3VuaXRzKSBjb25zdDsKKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZvcm1hdCBhbmQgb3V0cHV0IGEgbW9uZXRhcnkgdmFsdWUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZm9ybWF0cyBAYSBkaWdpdHMgYXMgYSBtb25ldGFyeSB2YWx1ZQorICAgICAgICogIGFjY29yZGluZyB0byBtb25leXB1bmN0IGFuZCBjdHlwZSBmYWNldHMgcmV0cmlldmVkIGZyb20KKyAgICAgICAqICBpby5nZXRsb2MoKSwgYW5kIHdyaXRlcyB0aGUgcmVzdWx0aW5nIGNoYXJhY3RlcnMgdG8gQGEgX19zLgorICAgICAgICogIEZvciBleGFtcGxlLCB0aGUgc3RyaW5nIDxjb2RlPjEwMDE8L2NvZGU+IGluIGEgVVMgbG9jYWxlCisgICAgICAgKiAgd291bGQgd3JpdGUgPGNvZGU+JDEwLjAxPC9jb2RlPiB0byBAYSBfX3MuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZQorICAgICAgICogIHJldHVybmVkLiAgQHNlZSBwdXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBzdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICAgKiAgQHBhcmFtICBfX2ludGwgIFBhcmFtZXRlciB0byB1c2VfZmFjZXQ8bW9uZXlwdW5jdDxDaGFyVCxpbnRsPiA+LgorICAgICAgICogIEBwYXJhbSAgX19pbyAgU291cmNlIG9mIGZhY2V0cyBhbmQgaW8gc3RhdGUuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpbGwgIGNoYXJfdHlwZSB0byB1c2UgZm9yIHBhZGRpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX2RpZ2l0cyAgUGxhY2UgdG8gc3RvcmUgcmVzdWx0IG9mIHBhcnNpbmcuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgYWZ0ZXIgd3JpdGluZy4KKyAgICAgICAqLworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX3B1dChpdGVyX3R5cGUgX19zLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCisJICAgICBjb25zdCBzdHJpbmdfdHlwZSYgX19kaWdpdHMpIGNvbnN0OworCisgICAgICAvLyBYWFggR0xJQkNYWF9BQkkgRGVwcmVjYXRlZAorI2lmIGRlZmluZWQgX0dMSUJDWFhfTE9OR19ET1VCTEVfQ09NUEFUICYmIGRlZmluZWQgX19MT05HX0RPVUJMRV8xMjhfXworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX3B1dChpdGVyX3R5cGUgX19zLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCisJICAgICBsb25nIGRvdWJsZSBfX3VuaXRzKSBjb25zdDsKKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTxib29sIF9JbnRsPgorICAgICAgICBpdGVyX3R5cGUKKyAgICAgICAgX01faW5zZXJ0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLAorCQkgIGNvbnN0IHN0cmluZ190eXBlJiBfX2RpZ2l0cykgY29uc3Q7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgorICAgIGxvY2FsZTo6aWQgbW9uZXlfcHV0PF9DaGFyVCwgX091dEl0ZXI+OjppZDsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9MREJMCisKKyAgLyoqCisgICAqICBAYnJpZWYgIE1lc3NhZ2VzIGZhY2V0IGJhc2UgY2xhc3MgcHJvdmlkaW5nIGNhdGFsb2cgdHlwZWRlZi4KKyAgICogIEBpbmdyb3VwIGxvY2FsZXMKKyAgICovCisgIHN0cnVjdCBtZXNzYWdlc19iYXNlCisgIHsKKyAgICB0eXBlZGVmIGludCBjYXRhbG9nOworICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIG1lc3NhZ2VzLgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKgorICAgKiAgVGhpcyBmYWNldCBlbmNhcHN1bGF0ZXMgdGhlIGNvZGUgdG8gcmV0cmlldmUgbWVzc2FnZXMgZnJvbQorICAgKiAgbWVzc2FnZSBjYXRhbG9ncy4gIFRoZSBvbmx5IHRoaW5nIGRlZmluZWQgYnkgdGhlIHN0YW5kYXJkIGZvciB0aGlzIGZhY2V0CisgICAqICBpcyB0aGUgaW50ZXJmYWNlLiAgQWxsIHVuZGVybHlpbmcgZnVuY3Rpb25hbGl0eSBpcworICAgKiAgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KKyAgICoKKyAgICogIFRoaXMgbGlicmFyeSBjdXJyZW50bHkgaW1wbGVtZW50cyAzIHZlcnNpb25zIG9mIHRoZSBtZXNzYWdlIGZhY2V0LiAgVGhlCisgICAqICBmaXJzdCB2ZXJzaW9uIChnbnUpIGlzIGEgd3JhcHBlciBhcm91bmQgZ2V0dGV4dCwgcHJvdmlkZWQgYnkgbGliaW50bC4KKyAgICogIFRoZSBzZWNvbmQgdmVyc2lvbiAoaWVlZSkgaXMgYSB3cmFwcGVyIGFyb3VuZCBjYXRnZXRzLiAgVGhlIGZpbmFsCisgICAqICB2ZXJzaW9uIChkZWZhdWx0KSBkb2VzIG5vIGFjdHVhbCB0cmFuc2xhdGlvbi4gIFRoZXNlIGltcGxlbWVudGF0aW9ucyBhcmUKKyAgICogIG9ubHkgcHJvdmlkZWQgZm9yIGNoYXIgYW5kIHdjaGFyX3QgaW5zdGFudGlhdGlvbnMuCisgICAqCisgICAqICBUaGUgbWVzc2FnZXMgdGVtcGxhdGUgdXNlcyBwcm90ZWN0ZWQgdmlydHVhbCBmdW5jdGlvbnMgdG8KKyAgICogIHByb3ZpZGUgdGhlIGFjdHVhbCByZXN1bHRzLiAgVGhlIHB1YmxpYyBhY2Nlc3NvcnMgZm9yd2FyZCB0aGUKKyAgICogIGNhbGwgdG8gdGhlIHZpcnR1YWwgZnVuY3Rpb25zLiAgVGhlc2UgdmlydHVhbCBmdW5jdGlvbnMgYXJlCisgICAqICBob29rcyBmb3IgZGV2ZWxvcGVycyB0byBpbXBsZW1lbnQgdGhlIGJlaGF2aW9yIHRoZXkgcmVxdWlyZSBmcm9tCisgICAqICB0aGUgbWVzc2FnZXMgZmFjZXQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBjbGFzcyBtZXNzYWdlcyA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LCBwdWJsaWMgbWVzc2FnZXNfYmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBQdWJsaWMgdHlwZWRlZnMKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJUPglzdHJpbmdfdHlwZTsKKyAgICAgIC8vQH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIFVuZGVybHlpbmcgIkMiIGxpYnJhcnkgbG9jYWxlIGluZm9ybWF0aW9uIHNhdmVkIGZyb20KKyAgICAgIC8vIGluaXRpYWxpemF0aW9uLCBuZWVkZWQgYnkgbWVzc2FnZXNfYnluYW1lIGFzIHdlbGwuCisgICAgICBfX2NfbG9jYWxlCQkJX01fY19sb2NhbGVfbWVzc2FnZXM7CisgICAgICBjb25zdCBjaGFyKgkJCV9NX25hbWVfbWVzc2FnZXM7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gTnVtcHVuY3QgZmFjZXQgaWQuCisgICAgICBzdGF0aWMgbG9jYWxlOjppZAkJCWlkOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdG9yIHBlcmZvcm1zIGluaXRpYWxpemF0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciBwcm92aWRlZCBieSB0aGUgc3RhbmRhcmQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX3JlZnMgIFBhc3NlZCB0byB0aGUgYmFzZSBmYWNldCBjbGFzcy4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgbWVzc2FnZXMoc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgICAvLyBOb24tc3RhbmRhcmQuCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEludGVybmFsIGNvbnN0cnVjdG9yLiAgTm90IGZvciBnZW5lcmFsIHVzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIGNvbnN0cnVjdG9yIGZvciB1c2UgYnkgdGhlIGxpYnJhcnkgaXRzZWxmIHRvIHNldCB1cCBuZXcKKyAgICAgICAqICBsb2NhbGVzLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fY2xvYyAgVGhlIEMgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSAgX19zICBUaGUgbmFtZSBvZiBhIGxvY2FsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fcmVmcyAgUmVmY291bnQgdG8gcGFzcyB0byB0aGUgYmFzZSBjbGFzcy4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG1lc3NhZ2VzKF9fY19sb2NhbGUgX19jbG9jLCBjb25zdCBjaGFyKiBfX3MsIHNpemVfdCBfX3JlZnMgPSAwKTsKKworICAgICAgLyoKKyAgICAgICAqICBAYnJpZWYgIE9wZW4gYSBtZXNzYWdlIGNhdGFsb2cuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gb3BlbnMgYW5kIHJldHVybnMgYSBoYW5kbGUgdG8gYSBtZXNzYWdlIGNhdGFsb2cgYnkKKyAgICAgICAqICByZXR1cm5pbmcgZG9fb3BlbihfX3MsIF9fbG9jKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBjYXRhbG9nIHRvIG9wZW4uCisgICAgICAgKiAgQHBhcmFtICBfX2xvYyAgTG9jYWxlIHRvIHVzZSBmb3IgY2hhcmFjdGVyIHNldCBjb252ZXJzaW9ucy4KKyAgICAgICAqICBAcmV0dXJuICBIYW5kbGUgdG8gdGhlIGNhdGFsb2cgb3IgdmFsdWUgPCAwIGlmIG9wZW4gZmFpbHMuCisgICAgICAqLworICAgICAgY2F0YWxvZworICAgICAgb3Blbihjb25zdCBiYXNpY19zdHJpbmc8Y2hhcj4mIF9fcywgY29uc3QgbG9jYWxlJiBfX2xvYykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX29wZW4oX19zLCBfX2xvYyk7IH0KKworICAgICAgLy8gTm9uLXN0YW5kYXJkIGFuZCB1bm9ydGhvZG94LCB5ZXQgZWZmZWN0aXZlLgorICAgICAgLyoKKyAgICAgICAqICBAYnJpZWYgIE9wZW4gYSBtZXNzYWdlIGNhdGFsb2cuCisgICAgICAgKgorICAgICAgICogIFRoaXMgbm9uLXN0YW5kYXJkIGZ1bmN0aW9uIG9wZW5zIGFuZCByZXR1cm5zIGEgaGFuZGxlIHRvIGEgbWVzc2FnZQorICAgICAgICogIGNhdGFsb2cgYnkgcmV0dXJuaW5nIGRvX29wZW4ocywgbG9jKS4gIFRoZSB0aGlyZCBhcmd1bWVudCBwcm92aWRlcyBhCisgICAgICAgKiAgbWVzc2FnZSBjYXRhbG9nIHJvb3QgZGlyZWN0b3J5IGZvciBnbnUgZ2V0dGV4dCBhbmQgaXMgaWdub3JlZAorICAgICAgICogIG90aGVyd2lzZS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBjYXRhbG9nIHRvIG9wZW4uCisgICAgICAgKiAgQHBhcmFtICBfX2xvYyAgTG9jYWxlIHRvIHVzZSBmb3IgY2hhcmFjdGVyIHNldCBjb252ZXJzaW9ucy4KKyAgICAgICAqICBAcGFyYW0gIF9fZGlyICBNZXNzYWdlIGNhdGFsb2cgcm9vdCBkaXJlY3RvcnkuCisgICAgICAgKiAgQHJldHVybiAgSGFuZGxlIHRvIHRoZSBjYXRhbG9nIG9yIHZhbHVlIDwgMCBpZiBvcGVuIGZhaWxzLgorICAgICAgKi8KKyAgICAgIGNhdGFsb2cKKyAgICAgIG9wZW4oY29uc3QgYmFzaWNfc3RyaW5nPGNoYXI+JiwgY29uc3QgbG9jYWxlJiwgY29uc3QgY2hhciopIGNvbnN0OworCisgICAgICAvKgorICAgICAgICogIEBicmllZiAgTG9vayB1cCBhIHN0cmluZyBpbiBhIG1lc3NhZ2UgY2F0YWxvZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgYW5kIHJldHVybnMgYSBtZXNzYWdlIGZyb20gYSBjYXRhbG9nIGJ5CisgICAgICAgKiAgcmV0dXJuaW5nIGRvX2dldChjLCBzZXQsIG1zZ2lkLCBzKS4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIGdudSwgQGEgX19zZXQgYW5kIEBhIG1zZ2lkIGFyZSBpZ25vcmVkLiAgUmV0dXJucyBnZXR0ZXh0KHMpLgorICAgICAgICogIEZvciBkZWZhdWx0LCByZXR1cm5zIHMuIEZvciBpZWVlLCByZXR1cm5zIGNhdGdldHMoYyxzZXQsbXNnaWQscykuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19jICBUaGUgY2F0YWxvZyB0byBhY2Nlc3MuCisgICAgICAgKiAgQHBhcmFtICBfX3NldCAgSW1wbGVtZW50YXRpb24tZGVmaW5lZC4KKyAgICAgICAqICBAcGFyYW0gIF9fbXNnaWQgIEltcGxlbWVudGF0aW9uLWRlZmluZWQuCisgICAgICAgKiAgQHBhcmFtICBfX3MgIERlZmF1bHQgcmV0dXJuIHZhbHVlIGlmIHJldHJpZXZhbCBmYWlscy4KKyAgICAgICAqICBAcmV0dXJuICBSZXRyaWV2ZWQgbWVzc2FnZSBvciBAYSBfX3MgaWYgZ2V0IGZhaWxzLgorICAgICAgKi8KKyAgICAgIHN0cmluZ190eXBlCisgICAgICBnZXQoY2F0YWxvZyBfX2MsIGludCBfX3NldCwgaW50IF9fbXNnaWQsIGNvbnN0IHN0cmluZ190eXBlJiBfX3MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19nZXQoX19jLCBfX3NldCwgX19tc2dpZCwgX19zKTsgfQorCisgICAgICAvKgorICAgICAgICogIEBicmllZiAgQ2xvc2UgYSBtZXNzYWdlIGNhdGFsb2cuCisgICAgICAgKgorICAgICAgICogIENsb3NlcyBjYXRhbG9nIEBhIGMgYnkgY2FsbGluZyBkb19jbG9zZShjKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX2MgIFRoZSBjYXRhbG9nIHRvIGNsb3NlLgorICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGNsb3NlKGNhdGFsb2cgX19jKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fY2xvc2UoX19jKTsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8vIERlc3RydWN0b3IuCisgICAgICB2aXJ0dWFsCisgICAgICB+bWVzc2FnZXMoKTsKKworICAgICAgLyoKKyAgICAgICAqICBAYnJpZWYgIE9wZW4gYSBtZXNzYWdlIGNhdGFsb2cuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gb3BlbnMgYW5kIHJldHVybnMgYSBoYW5kbGUgdG8gYSBtZXNzYWdlIGNhdGFsb2cgaW4gYW4KKyAgICAgICAqICBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIG1hbm5lci4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkCisgICAgICAgKiAgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fcyAgVGhlIGNhdGFsb2cgdG8gb3Blbi4KKyAgICAgICAqICBAcGFyYW0gIF9fbG9jICBMb2NhbGUgdG8gdXNlIGZvciBjaGFyYWN0ZXIgc2V0IGNvbnZlcnNpb25zLgorICAgICAgICogIEByZXR1cm4gIEhhbmRsZSB0byB0aGUgb3BlbmVkIGNhdGFsb2csIHZhbHVlIDwgMCBpZiBvcGVuIGZhaWxlZC4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNhdGFsb2cKKyAgICAgIGRvX29wZW4oY29uc3QgYmFzaWNfc3RyaW5nPGNoYXI+JiwgY29uc3QgbG9jYWxlJikgY29uc3Q7CisKKyAgICAgIC8qCisgICAgICAgKiAgQGJyaWVmICBMb29rIHVwIGEgc3RyaW5nIGluIGEgbWVzc2FnZSBjYXRhbG9nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyBhbmQgcmV0dXJucyBhIG1lc3NhZ2UgZnJvbSBhIGNhdGFsb2cgaW4gYW4KKyAgICAgICAqICBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIG1hbm5lci4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkCisgICAgICAgKiAgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBGb3IgZ251LCBAYSBfX3NldCBhbmQgQGEgX19tc2dpZCBhcmUgaWdub3JlZC4gIFJldHVybnMgZ2V0dGV4dChzKS4KKyAgICAgICAqICBGb3IgZGVmYXVsdCwgcmV0dXJucyBzLiBGb3IgaWVlZSwgcmV0dXJucyBjYXRnZXRzKGMsc2V0LG1zZ2lkLHMpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fYyAgVGhlIGNhdGFsb2cgdG8gYWNjZXNzLgorICAgICAgICogIEBwYXJhbSAgX19zZXQgIEltcGxlbWVudGF0aW9uLWRlZmluZWQuCisgICAgICAgKiAgQHBhcmFtICBfX21zZ2lkICBJbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgorICAgICAgICogIEBwYXJhbSAgX19zICBEZWZhdWx0IHJldHVybiB2YWx1ZSBpZiByZXRyaWV2YWwgZmFpbHMuCisgICAgICAgKiAgQHJldHVybiAgUmV0cmlldmVkIG1lc3NhZ2Ugb3IgQGEgX19zIGlmIGdldCBmYWlscy4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIHN0cmluZ190eXBlCisgICAgICBkb19nZXQoY2F0YWxvZywgaW50LCBpbnQsIGNvbnN0IHN0cmluZ190eXBlJiBfX2RmYXVsdCkgY29uc3Q7CisKKyAgICAgIC8qCisgICAgICAgKiAgQGJyaWVmICBDbG9zZSBhIG1lc3NhZ2UgY2F0YWxvZy4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX2MgIFRoZSBjYXRhbG9nIHRvIGNsb3NlLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgdm9pZAorICAgICAgZG9fY2xvc2UoY2F0YWxvZykgY29uc3Q7CisKKyAgICAgIC8vIFJldHVybnMgYSBsb2NhbGUgYW5kIGNvZGVzZXQtY29udmVydGVkIHN0cmluZywgZ2l2ZW4gYSBjaGFyKiBtZXNzYWdlLgorICAgICAgY2hhcioKKyAgICAgIF9NX2NvbnZlcnRfdG9fY2hhcihjb25zdCBzdHJpbmdfdHlwZSYgX19tc2cpIGNvbnN0CisgICAgICB7CisJLy8gWFhYCisJcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGNvbnN0X2Nhc3Q8X0NoYXJUKj4oX19tc2cuY19zdHIoKSkpOworICAgICAgfQorCisgICAgICAvLyBSZXR1cm5zIGEgbG9jYWxlIGFuZCBjb2Rlc2V0LWNvbnZlcnRlZCBzdHJpbmcsIGdpdmVuIGEgY2hhciogbWVzc2FnZS4KKyAgICAgIHN0cmluZ190eXBlCisgICAgICBfTV9jb252ZXJ0X2Zyb21fY2hhcihjaGFyKikgY29uc3QKKyAgICAgIHsKKwkvLyBYWFgKKwlyZXR1cm4gc3RyaW5nX3R5cGUoKTsKKyAgICAgIH0KKyAgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgbG9jYWxlOjppZCBtZXNzYWdlczxfQ2hhclQ+OjppZDsKKworICAvLy8gU3BlY2lhbGl6YXRpb25zIGZvciByZXF1aXJlZCBpbnN0YW50aWF0aW9ucy4KKyAgdGVtcGxhdGU8PgorICAgIHN0cmluZworICAgIG1lc3NhZ2VzPGNoYXI+Ojpkb19nZXQoY2F0YWxvZywgaW50LCBpbnQsIGNvbnN0IHN0cmluZyYpIGNvbnN0OworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdGVtcGxhdGU8PgorICAgIHdzdHJpbmcKKyAgICBtZXNzYWdlczx3Y2hhcl90Pjo6ZG9fZ2V0KGNhdGFsb2csIGludCwgaW50LCBjb25zdCB3c3RyaW5nJikgY29uc3Q7CisjZW5kaWYKKworICAgLy8vIGNsYXNzIG1lc3NhZ2VzX2J5bmFtZSBbMjIuMi43LjJdLgorICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGNsYXNzIG1lc3NhZ2VzX2J5bmFtZSA6IHB1YmxpYyBtZXNzYWdlczxfQ2hhclQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJUPglzdHJpbmdfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIG1lc3NhZ2VzX2J5bmFtZShjb25zdCBjaGFyKiBfX3MsIHNpemVfdCBfX3JlZnMgPSAwKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5tZXNzYWdlc19ieW5hbWUoKQorICAgICAgeyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisvLyBJbmNsdWRlIGhvc3QgYW5kIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgbWVzc2FnZXMgZnVuY3Rpb25zLgorI2luY2x1ZGUgPGJpdHMvbWVzc2FnZXNfbWVtYmVycy5oPgorCisvLyAyMi4yLjEuNSAgVGVtcGxhdGUgY2xhc3MgY29kZWN2dAorI2luY2x1ZGUgPGJpdHMvY29kZWN2dC5oPgorCisjaW5jbHVkZSA8Yml0cy9sb2NhbGVfZmFjZXRzX25vbmlvLnRjYz4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvbG9jYWxlX2ZhY2V0c19ub25pby50Y2MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvbG9jYWxlX2ZhY2V0c19ub25pby50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YyZDgzZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9sb2NhbGVfZmFjZXRzX25vbmlvLnRjYwpAQCAtMCwwICsxLDEzNzMgQEAKKy8vIExvY2FsZSBzdXBwb3J0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2xvY2FsZV9mYWNldHNfbm9uaW8udGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bG9jYWxlfQorICovCisKKyNpZm5kZWYgX0xPQ0FMRV9GQUNFVFNfTk9OSU9fVENDCisjZGVmaW5lIF9MT0NBTEVfRkFDRVRTX05PTklPX1RDQyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgYm9vbCBfSW50bD4KKyAgICBzdHJ1Y3QgX191c2VfY2FjaGU8X19tb25leXB1bmN0X2NhY2hlPF9DaGFyVCwgX0ludGw+ID4KKyAgICB7CisgICAgICBjb25zdCBfX21vbmV5cHVuY3RfY2FjaGU8X0NoYXJULCBfSW50bD4qCisgICAgICBvcGVyYXRvcigpIChjb25zdCBsb2NhbGUmIF9fbG9jKSBjb25zdAorICAgICAgeworCWNvbnN0IHNpemVfdCBfX2kgPSBtb25leXB1bmN0PF9DaGFyVCwgX0ludGw+OjppZC5fTV9pZCgpOworCWNvbnN0IGxvY2FsZTo6ZmFjZXQqKiBfX2NhY2hlcyA9IF9fbG9jLl9NX2ltcGwtPl9NX2NhY2hlczsKKwlpZiAoIV9fY2FjaGVzW19faV0pCisJICB7CisJICAgIF9fbW9uZXlwdW5jdF9jYWNoZTxfQ2hhclQsIF9JbnRsPiogX190bXAgPSAwOworCSAgICBfX3RyeQorCSAgICAgIHsKKwkJX190bXAgPSBuZXcgX19tb25leXB1bmN0X2NhY2hlPF9DaGFyVCwgX0ludGw+OworCQlfX3RtcC0+X01fY2FjaGUoX19sb2MpOworCSAgICAgIH0KKwkgICAgX19jYXRjaCguLi4pCisJICAgICAgeworCQlkZWxldGUgX190bXA7CisJCV9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICAgIH0KKwkgICAgX19sb2MuX01faW1wbC0+X01faW5zdGFsbF9jYWNoZShfX3RtcCwgX19pKTsKKwkgIH0KKwlyZXR1cm4gc3RhdGljX2Nhc3Q8CisJICBjb25zdCBfX21vbmV5cHVuY3RfY2FjaGU8X0NoYXJULCBfSW50bD4qPihfX2NhY2hlc1tfX2ldKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgYm9vbCBfSW50bD4KKyAgICB2b2lkCisgICAgX19tb25leXB1bmN0X2NhY2hlPF9DaGFyVCwgX0ludGw+OjpfTV9jYWNoZShjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsKKyAgICAgIF9NX2FsbG9jYXRlZCA9IHRydWU7CisKKyAgICAgIGNvbnN0IG1vbmV5cHVuY3Q8X0NoYXJULCBfSW50bD4mIF9fbXAgPQorCXVzZV9mYWNldDxtb25leXB1bmN0PF9DaGFyVCwgX0ludGw+ID4oX19sb2MpOworCisgICAgICBfTV9kZWNpbWFsX3BvaW50ID0gX19tcC5kZWNpbWFsX3BvaW50KCk7CisgICAgICBfTV90aG91c2FuZHNfc2VwID0gX19tcC50aG91c2FuZHNfc2VwKCk7CisgICAgICBfTV9mcmFjX2RpZ2l0cyA9IF9fbXAuZnJhY19kaWdpdHMoKTsKKworICAgICAgY2hhciogX19ncm91cGluZyA9IDA7CisgICAgICBfQ2hhclQqIF9fY3Vycl9zeW1ib2wgPSAwOworICAgICAgX0NoYXJUKiBfX3Bvc2l0aXZlX3NpZ24gPSAwOworICAgICAgX0NoYXJUKiBfX25lZ2F0aXZlX3NpZ24gPSAwOyAgICAgCisgICAgICBfX3RyeQorCXsKKwkgIF9NX2dyb3VwaW5nX3NpemUgPSBfX21wLmdyb3VwaW5nKCkuc2l6ZSgpOworCSAgX19ncm91cGluZyA9IG5ldyBjaGFyW19NX2dyb3VwaW5nX3NpemVdOworCSAgX19tcC5ncm91cGluZygpLmNvcHkoX19ncm91cGluZywgX01fZ3JvdXBpbmdfc2l6ZSk7CisJICBfTV9ncm91cGluZyA9IF9fZ3JvdXBpbmc7CisJICBfTV91c2VfZ3JvdXBpbmcgPSAoX01fZ3JvdXBpbmdfc2l6ZQorCQkJICAgICAmJiBzdGF0aWNfY2FzdDxzaWduZWQgY2hhcj4oX01fZ3JvdXBpbmdbMF0pID4gMAorCQkJICAgICAmJiAoX01fZ3JvdXBpbmdbMF0KKwkJCQkgIT0gX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPGNoYXI+OjpfX21heCkpOworCisJICBfTV9jdXJyX3N5bWJvbF9zaXplID0gX19tcC5jdXJyX3N5bWJvbCgpLnNpemUoKTsKKwkgIF9fY3Vycl9zeW1ib2wgPSBuZXcgX0NoYXJUW19NX2N1cnJfc3ltYm9sX3NpemVdOworCSAgX19tcC5jdXJyX3N5bWJvbCgpLmNvcHkoX19jdXJyX3N5bWJvbCwgX01fY3Vycl9zeW1ib2xfc2l6ZSk7CisJICBfTV9jdXJyX3N5bWJvbCA9IF9fY3Vycl9zeW1ib2w7CisKKwkgIF9NX3Bvc2l0aXZlX3NpZ25fc2l6ZSA9IF9fbXAucG9zaXRpdmVfc2lnbigpLnNpemUoKTsKKwkgIF9fcG9zaXRpdmVfc2lnbiA9IG5ldyBfQ2hhclRbX01fcG9zaXRpdmVfc2lnbl9zaXplXTsKKwkgIF9fbXAucG9zaXRpdmVfc2lnbigpLmNvcHkoX19wb3NpdGl2ZV9zaWduLCBfTV9wb3NpdGl2ZV9zaWduX3NpemUpOworCSAgX01fcG9zaXRpdmVfc2lnbiA9IF9fcG9zaXRpdmVfc2lnbjsKKworCSAgX01fbmVnYXRpdmVfc2lnbl9zaXplID0gX19tcC5uZWdhdGl2ZV9zaWduKCkuc2l6ZSgpOworCSAgX19uZWdhdGl2ZV9zaWduID0gbmV3IF9DaGFyVFtfTV9uZWdhdGl2ZV9zaWduX3NpemVdOworCSAgX19tcC5uZWdhdGl2ZV9zaWduKCkuY29weShfX25lZ2F0aXZlX3NpZ24sIF9NX25lZ2F0aXZlX3NpZ25fc2l6ZSk7CisJICBfTV9uZWdhdGl2ZV9zaWduID0gX19uZWdhdGl2ZV9zaWduOworCisJICBfTV9wb3NfZm9ybWF0ID0gX19tcC5wb3NfZm9ybWF0KCk7CisJICBfTV9uZWdfZm9ybWF0ID0gX19tcC5uZWdfZm9ybWF0KCk7CisKKwkgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3QgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKTsKKwkgIF9fY3Qud2lkZW4obW9uZXlfYmFzZTo6X1NfYXRvbXMsCisJCSAgICAgbW9uZXlfYmFzZTo6X1NfYXRvbXMgKyBtb25leV9iYXNlOjpfU19lbmQsIF9NX2F0b21zKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBkZWxldGUgW10gX19ncm91cGluZzsKKwkgIGRlbGV0ZSBbXSBfX2N1cnJfc3ltYm9sOworCSAgZGVsZXRlIFtdIF9fcG9zaXRpdmVfc2lnbjsKKwkgIGRlbGV0ZSBbXSBfX25lZ2F0aXZlX3NpZ247CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfTERCTAorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICB0ZW1wbGF0ZTxib29sIF9JbnRsPgorICAgICAgX0luSXRlcgorICAgICAgbW9uZXlfZ2V0PF9DaGFyVCwgX0luSXRlcj46OgorICAgICAgX01fZXh0cmFjdChpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJCSBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHN0cmluZyYgX191bml0cykgY29uc3QKKyAgICAgIHsKKwl0eXBlZGVmIGNoYXJfdHJhaXRzPF9DaGFyVD4JCQkgIF9fdHJhaXRzX3R5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBzdHJpbmdfdHlwZTo6c2l6ZV90eXBlCSAgICAgICAgICBzaXplX3R5cGU7CQorCXR5cGVkZWYgbW9uZXlfYmFzZTo6cGFydAkJCSAgcGFydDsKKwl0eXBlZGVmIF9fbW9uZXlwdW5jdF9jYWNoZTxfQ2hhclQsIF9JbnRsPiAgICAgICAgIF9fY2FjaGVfdHlwZTsKKwkKKwljb25zdCBsb2NhbGUmIF9fbG9jID0gX19pby5fTV9nZXRsb2MoKTsKKwljb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0eXBlID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYyk7CisKKwlfX3VzZV9jYWNoZTxfX2NhY2hlX3R5cGU+IF9fdWM7CisJY29uc3QgX19jYWNoZV90eXBlKiBfX2xjID0gX191YyhfX2xvYyk7CisJY29uc3QgY2hhcl90eXBlKiBfX2xpdCA9IF9fbGMtPl9NX2F0b21zOworCisJLy8gRGVkdWNlZCBzaWduLgorCWJvb2wgX19uZWdhdGl2ZSA9IGZhbHNlOworCS8vIFNpZ24gc2l6ZS4KKwlzaXplX3R5cGUgX19zaWduX3NpemUgPSAwOworCS8vIFRydWUgaWYgc2lnbiBpcyBtYW5kYXRvcnkuCisJY29uc3QgYm9vbCBfX21hbmRhdG9yeV9zaWduID0gKF9fbGMtPl9NX3Bvc2l0aXZlX3NpZ25fc2l6ZQorCQkJCSAgICAgICAmJiBfX2xjLT5fTV9uZWdhdGl2ZV9zaWduX3NpemUpOworCS8vIFN0cmluZyBvZiBncm91cGluZyBpbmZvIGZyb20gdGhvdXNhbmRzX3NlcCBwbHVja2VkIGZyb20gX191bml0cy4KKwlzdHJpbmcgX19ncm91cGluZ190bXA7CisJaWYgKF9fbGMtPl9NX3VzZV9ncm91cGluZykKKwkgIF9fZ3JvdXBpbmdfdG1wLnJlc2VydmUoMzIpOworCS8vIExhc3QgcG9zaXRpb24gYmVmb3JlIHRoZSBkZWNpbWFsIHBvaW50LgorCWludCBfX2xhc3RfcG9zID0gMDsKKwkvLyBTZXBhcmF0b3IgcG9zaXRpb25zLCB0aGVuLCBwb3NzaWJseSwgZnJhY3Rpb25hbCBkaWdpdHMuCisJaW50IF9fbiA9IDA7CisJLy8gSWYgaW5wdXQgaXRlcmF0b3IgaXMgaW4gYSB2YWxpZCBzdGF0ZS4KKwlib29sIF9fdGVzdHZhbGlkID0gdHJ1ZTsKKwkvLyBGbGFnIG1hcmtpbmcgd2hlbiBhIGRlY2ltYWwgcG9pbnQgaXMgZm91bmQuCisJYm9vbCBfX3Rlc3RkZWNmb3VuZCA9IGZhbHNlOworCisJLy8gVGhlIHRlbnRhdGl2ZSByZXR1cm5lZCBzdHJpbmcgaXMgc3RvcmVkIGhlcmUuCisJc3RyaW5nIF9fcmVzOworCV9fcmVzLnJlc2VydmUoMzIpOworCisJY29uc3QgY2hhcl90eXBlKiBfX2xpdF96ZXJvID0gX19saXQgKyBtb25leV9iYXNlOjpfU196ZXJvOworCWNvbnN0IG1vbmV5X2Jhc2U6OnBhdHRlcm4gX19wID0gX19sYy0+X01fbmVnX2Zvcm1hdDsKKwlmb3IgKGludCBfX2kgPSAwOyBfX2kgPCA0ICYmIF9fdGVzdHZhbGlkOyArK19faSkKKwkgIHsKKwkgICAgY29uc3QgcGFydCBfX3doaWNoID0gc3RhdGljX2Nhc3Q8cGFydD4oX19wLmZpZWxkW19faV0pOworCSAgICBzd2l0Y2ggKF9fd2hpY2gpCisJICAgICAgeworCSAgICAgIGNhc2UgbW9uZXlfYmFzZTo6c3ltYm9sOgorCQkvLyBBY2NvcmRpbmcgdG8gMjIuMi42LjEuMiwgcDIsIHN5bWJvbCBpcyByZXF1aXJlZAorCQkvLyBpZiAoX19pby5mbGFncygpICYgaW9zX2Jhc2U6OnNob3diYXNlKSwgb3RoZXJ3aXNlCisJCS8vIGlzIG9wdGlvbmFsIGFuZCBjb25zdW1lZCBvbmx5IGlmIG90aGVyIGNoYXJhY3RlcnMKKwkJLy8gYXJlIG5lZWRlZCB0byBjb21wbGV0ZSB0aGUgZm9ybWF0LgorCQlpZiAoX19pby5mbGFncygpICYgaW9zX2Jhc2U6OnNob3diYXNlIHx8IF9fc2lnbl9zaXplID4gMQorCQkgICAgfHwgX19pID09IDAKKwkJICAgIHx8IChfX2kgPT0gMSAmJiAoX19tYW5kYXRvcnlfc2lnbgorCQkJCSAgICAgfHwgKHN0YXRpY19jYXN0PHBhcnQ+KF9fcC5maWVsZFswXSkKKwkJCQkJID09IG1vbmV5X2Jhc2U6OnNpZ24pCisJCQkJICAgICB8fCAoc3RhdGljX2Nhc3Q8cGFydD4oX19wLmZpZWxkWzJdKQorCQkJCQkgPT0gbW9uZXlfYmFzZTo6c3BhY2UpKSkKKwkJICAgIHx8IChfX2kgPT0gMiAmJiAoKHN0YXRpY19jYXN0PHBhcnQ+KF9fcC5maWVsZFszXSkKKwkJCQkgICAgICA9PSBtb25leV9iYXNlOjp2YWx1ZSkKKwkJCQkgICAgIHx8IChfX21hbmRhdG9yeV9zaWduCisJCQkJCSAmJiAoc3RhdGljX2Nhc3Q8cGFydD4oX19wLmZpZWxkWzNdKQorCQkJCQkgICAgID09IG1vbmV5X2Jhc2U6OnNpZ24pKSkpKQorCQkgIHsKKwkJICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IF9fbGMtPl9NX2N1cnJfc3ltYm9sX3NpemU7CisJCSAgICBzaXplX3R5cGUgX19qID0gMDsKKwkJICAgIGZvciAoOyBfX2JlZyAhPSBfX2VuZCAmJiBfX2ogPCBfX2xlbgorCQkJICAgJiYgKl9fYmVnID09IF9fbGMtPl9NX2N1cnJfc3ltYm9sW19fal07CisJCQkgKytfX2JlZywgKytfX2opOworCQkgICAgaWYgKF9faiAhPSBfX2xlbgorCQkJJiYgKF9faiB8fCBfX2lvLmZsYWdzKCkgJiBpb3NfYmFzZTo6c2hvd2Jhc2UpKQorCQkgICAgICBfX3Rlc3R2YWxpZCA9IGZhbHNlOworCQkgIH0KKwkJYnJlYWs7CisJICAgICAgY2FzZSBtb25leV9iYXNlOjpzaWduOgorCQkvLyBTaWduIG1pZ2h0IG5vdCBleGlzdCwgb3IgYmUgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXIgbG9uZy4KKwkJaWYgKF9fbGMtPl9NX3Bvc2l0aXZlX3NpZ25fc2l6ZSAmJiBfX2JlZyAhPSBfX2VuZAorCQkgICAgJiYgKl9fYmVnID09IF9fbGMtPl9NX3Bvc2l0aXZlX3NpZ25bMF0pCisJCSAgeworCQkgICAgX19zaWduX3NpemUgPSBfX2xjLT5fTV9wb3NpdGl2ZV9zaWduX3NpemU7CisJCSAgICArK19fYmVnOworCQkgIH0KKwkJZWxzZSBpZiAoX19sYy0+X01fbmVnYXRpdmVfc2lnbl9zaXplICYmIF9fYmVnICE9IF9fZW5kCisJCQkgJiYgKl9fYmVnID09IF9fbGMtPl9NX25lZ2F0aXZlX3NpZ25bMF0pCisJCSAgeworCQkgICAgX19uZWdhdGl2ZSA9IHRydWU7CisJCSAgICBfX3NpZ25fc2l6ZSA9IF9fbGMtPl9NX25lZ2F0aXZlX3NpZ25fc2l6ZTsKKwkJICAgICsrX19iZWc7CisJCSAgfQorCQllbHNlIGlmIChfX2xjLT5fTV9wb3NpdGl2ZV9zaWduX3NpemUKKwkJCSAmJiAhX19sYy0+X01fbmVnYXRpdmVfc2lnbl9zaXplKQorCQkgIC8vICIuLi4gaWYgbm8gc2lnbiBpcyBkZXRlY3RlZCwgdGhlIHJlc3VsdCBpcyBnaXZlbiB0aGUgc2lnbgorCQkgIC8vIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHNvdXJjZSBvZiB0aGUgZW1wdHkgc3RyaW5nIgorCQkgIF9fbmVnYXRpdmUgPSB0cnVlOworCQllbHNlIGlmIChfX21hbmRhdG9yeV9zaWduKQorCQkgIF9fdGVzdHZhbGlkID0gZmFsc2U7CisJCWJyZWFrOworCSAgICAgIGNhc2UgbW9uZXlfYmFzZTo6dmFsdWU6CisJCS8vIEV4dHJhY3QgZGlnaXRzLCByZW1vdmUgYW5kIHN0YXNoIGF3YXkgdGhlCisJCS8vIGdyb3VwaW5nIG9mIGZvdW5kIHRob3VzYW5kcyBzZXBhcmF0b3JzLgorCQlmb3IgKDsgX19iZWcgIT0gX19lbmQ7ICsrX19iZWcpCisJCSAgeworCQkgICAgY29uc3QgY2hhcl90eXBlIF9fYyA9ICpfX2JlZzsKKwkJICAgIGNvbnN0IGNoYXJfdHlwZSogX19xID0gX190cmFpdHNfdHlwZTo6ZmluZChfX2xpdF96ZXJvLCAKKwkJCQkJCQkgICAgICAgMTAsIF9fYyk7CisJCSAgICBpZiAoX19xICE9IDApCisJCSAgICAgIHsKKwkJCV9fcmVzICs9IG1vbmV5X2Jhc2U6Ol9TX2F0b21zW19fcSAtIF9fbGl0XTsKKwkJCSsrX19uOworCQkgICAgICB9CisJCSAgICBlbHNlIGlmIChfX2MgPT0gX19sYy0+X01fZGVjaW1hbF9wb2ludCAKKwkJCSAgICAgJiYgIV9fdGVzdGRlY2ZvdW5kKQorCQkgICAgICB7CisJCQlpZiAoX19sYy0+X01fZnJhY19kaWdpdHMgPD0gMCkKKwkJCSAgYnJlYWs7CisKKwkJCV9fbGFzdF9wb3MgPSBfX247CisJCQlfX24gPSAwOworCQkJX190ZXN0ZGVjZm91bmQgPSB0cnVlOworCQkgICAgICB9CisJCSAgICBlbHNlIGlmIChfX2xjLT5fTV91c2VfZ3JvdXBpbmcKKwkJCSAgICAgJiYgX19jID09IF9fbGMtPl9NX3Rob3VzYW5kc19zZXAKKwkJCSAgICAgJiYgIV9fdGVzdGRlY2ZvdW5kKQorCQkgICAgICB7CisJCQlpZiAoX19uKQorCQkJICB7CisJCQkgICAgLy8gTWFyayBwb3NpdGlvbiBmb3IgbGF0ZXIgYW5hbHlzaXMuCisJCQkgICAgX19ncm91cGluZ190bXAgKz0gc3RhdGljX2Nhc3Q8Y2hhcj4oX19uKTsKKwkJCSAgICBfX24gPSAwOworCQkJICB9CisJCQllbHNlCisJCQkgIHsKKwkJCSAgICBfX3Rlc3R2YWxpZCA9IGZhbHNlOworCQkJICAgIGJyZWFrOworCQkJICB9CisJCSAgICAgIH0KKwkJICAgIGVsc2UKKwkJICAgICAgYnJlYWs7CisJCSAgfQorCQlpZiAoX19yZXMuZW1wdHkoKSkKKwkJICBfX3Rlc3R2YWxpZCA9IGZhbHNlOworCQlicmVhazsKKwkgICAgICBjYXNlIG1vbmV5X2Jhc2U6OnNwYWNlOgorCQkvLyBBdCBsZWFzdCBvbmUgc3BhY2UgaXMgcmVxdWlyZWQuCisJCWlmIChfX2JlZyAhPSBfX2VuZCAmJiBfX2N0eXBlLmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCAqX19iZWcpKQorCQkgICsrX19iZWc7CisJCWVsc2UKKwkJICBfX3Rlc3R2YWxpZCA9IGZhbHNlOworCSAgICAgIGNhc2UgbW9uZXlfYmFzZTo6bm9uZToKKwkJLy8gT25seSBpZiBub3QgYXQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybi4KKwkJaWYgKF9faSAhPSAzKQorCQkgIGZvciAoOyBfX2JlZyAhPSBfX2VuZAorCQkJICYmIF9fY3R5cGUuaXMoY3R5cGVfYmFzZTo6c3BhY2UsICpfX2JlZyk7ICsrX19iZWcpOworCQlicmVhazsKKwkgICAgICB9CisJICB9CisKKwkvLyBOZWVkIHRvIGdldCB0aGUgcmVzdCBvZiB0aGUgc2lnbiBjaGFyYWN0ZXJzLCBpZiB0aGV5IGV4aXN0LgorCWlmIChfX3NpZ25fc2l6ZSA+IDEgJiYgX190ZXN0dmFsaWQpCisJICB7CisJICAgIGNvbnN0IGNoYXJfdHlwZSogX19zaWduID0gX19uZWdhdGl2ZSA/IF9fbGMtPl9NX25lZ2F0aXZlX3NpZ24KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19sYy0+X01fcG9zaXRpdmVfc2lnbjsKKwkgICAgc2l6ZV90eXBlIF9faSA9IDE7CisJICAgIGZvciAoOyBfX2JlZyAhPSBfX2VuZCAmJiBfX2kgPCBfX3NpZ25fc2l6ZQorCQkgICAmJiAqX19iZWcgPT0gX19zaWduW19faV07ICsrX19iZWcsICsrX19pKTsKKwkgICAgCisJICAgIGlmIChfX2kgIT0gX19zaWduX3NpemUpCisJICAgICAgX190ZXN0dmFsaWQgPSBmYWxzZTsKKwkgIH0KKworCWlmIChfX3Rlc3R2YWxpZCkKKwkgIHsKKwkgICAgLy8gU3RyaXAgbGVhZGluZyB6ZXJvcy4KKwkgICAgaWYgKF9fcmVzLnNpemUoKSA+IDEpCisJICAgICAgeworCQljb25zdCBzaXplX3R5cGUgX19maXJzdCA9IF9fcmVzLmZpbmRfZmlyc3Rfbm90X29mKCcwJyk7CisJCWNvbnN0IGJvb2wgX19vbmx5X3plcm9zID0gX19maXJzdCA9PSBzdHJpbmc6Om5wb3M7CisJCWlmIChfX2ZpcnN0KQorCQkgIF9fcmVzLmVyYXNlKDAsIF9fb25seV96ZXJvcyA/IF9fcmVzLnNpemUoKSAtIDEgOiBfX2ZpcnN0KTsKKwkgICAgICB9CisKKwkgICAgLy8gMjIuMi42LjEuMiwgcDQKKwkgICAgaWYgKF9fbmVnYXRpdmUgJiYgX19yZXNbMF0gIT0gJzAnKQorCSAgICAgIF9fcmVzLmluc2VydChfX3Jlcy5iZWdpbigpLCAnLScpOworCSAgICAKKwkgICAgLy8gVGVzdCBmb3IgZ3JvdXBpbmcgZmlkZWxpdHkuCisJICAgIGlmIChfX2dyb3VwaW5nX3RtcC5zaXplKCkpCisJICAgICAgeworCQkvLyBBZGQgdGhlIGVuZGluZyBncm91cGluZy4KKwkJX19ncm91cGluZ190bXAgKz0gc3RhdGljX2Nhc3Q8Y2hhcj4oX190ZXN0ZGVjZm91bmQgPyBfX2xhc3RfcG9zCisJCQkJCQkgICAgICAgICAgICAgICAgICAgOiBfX24pOworCQlpZiAoIXN0ZDo6X192ZXJpZnlfZ3JvdXBpbmcoX19sYy0+X01fZ3JvdXBpbmcsCisJCQkJCSAgICBfX2xjLT5fTV9ncm91cGluZ19zaXplLAorCQkJCQkgICAgX19ncm91cGluZ190bXApKQorCQkgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCSAgICAgIH0KKwkgICAgCisJICAgIC8vIElmZiBub3QgZW5vdWdoIGRpZ2l0cyB3ZXJlIHN1cHBsaWVkIGFmdGVyIHRoZSBkZWNpbWFsLXBvaW50LgorCSAgICBpZiAoX190ZXN0ZGVjZm91bmQgJiYgX19uICE9IF9fbGMtPl9NX2ZyYWNfZGlnaXRzKQorCSAgICAgIF9fdGVzdHZhbGlkID0gZmFsc2U7CisJICB9CisKKwkvLyBJZmYgdmFsaWQgc2VxdWVuY2UgaXMgbm90IHJlY29nbml6ZWQuCisJaWYgKCFfX3Rlc3R2YWxpZCkKKwkgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCWVsc2UKKwkgIF9fdW5pdHMuc3dhcChfX3Jlcyk7CisJCisJLy8gSWZmIG5vIG1vcmUgY2hhcmFjdGVycyBhcmUgYXZhaWxhYmxlLgorCWlmIChfX2JlZyA9PSBfX2VuZCkKKwkgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisJcmV0dXJuIF9fYmVnOworICAgICAgfQorCisjaWYgZGVmaW5lZCBfR0xJQkNYWF9MT05HX0RPVUJMRV9DT01QQVQgJiYgZGVmaW5lZCBfX0xPTkdfRE9VQkxFXzEyOF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgbW9uZXlfZ2V0PF9DaGFyVCwgX0luSXRlcj46OgorICAgIF9fZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9faW8sCisJICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGRvdWJsZSYgX191bml0cykgY29uc3QKKyAgICB7CisgICAgICBzdHJpbmcgX19zdHI7CisgICAgICBfX2JlZyA9IF9faW50bCA/IF9NX2V4dHJhY3Q8dHJ1ZT4oX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX19zdHIpCisgICAgICAgICAgICAgICAgICAgICA6IF9NX2V4dHJhY3Q8ZmFsc2U+KF9fYmVnLCBfX2VuZCwgX19pbywgX19lcnIsIF9fc3RyKTsKKyAgICAgIHN0ZDo6X19jb252ZXJ0X3RvX3YoX19zdHIuY19zdHIoKSwgX191bml0cywgX19lcnIsIF9TX2dldF9jX2xvY2FsZSgpKTsKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgX0luSXRlcgorICAgIG1vbmV5X2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBkb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19pbywKKwkgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGxvbmcgZG91YmxlJiBfX3VuaXRzKSBjb25zdAorICAgIHsKKyAgICAgIHN0cmluZyBfX3N0cjsKKyAgICAgIF9fYmVnID0gX19pbnRsID8gX01fZXh0cmFjdDx0cnVlPihfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3N0cikKKwkgICAgICAgICAgICAgOiBfTV9leHRyYWN0PGZhbHNlPihfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3N0cik7CisgICAgICBzdGQ6Ol9fY29udmVydF90b192KF9fc3RyLmNfc3RyKCksIF9fdW5pdHMsIF9fZXJyLCBfU19nZXRfY19sb2NhbGUoKSk7CisgICAgICByZXR1cm4gX19iZWc7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgbW9uZXlfZ2V0PF9DaGFyVCwgX0luSXRlcj46OgorICAgIGRvX2dldChpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvLAorCSAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2Vyciwgc3RyaW5nX3R5cGUmIF9fZGlnaXRzKSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RyaW5nOjpzaXplX3R5cGUgICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisKKyAgICAgIGNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworICAgICAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdHlwZSA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpOworCisgICAgICBzdHJpbmcgX19zdHI7CisgICAgICBfX2JlZyA9IF9faW50bCA/IF9NX2V4dHJhY3Q8dHJ1ZT4oX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX19zdHIpCisJICAgICAgICAgICAgIDogX01fZXh0cmFjdDxmYWxzZT4oX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX19zdHIpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gX19zdHIuc2l6ZSgpOworICAgICAgaWYgKF9fbGVuKQorCXsKKwkgIF9fZGlnaXRzLnJlc2l6ZShfX2xlbik7CisJICBfX2N0eXBlLndpZGVuKF9fc3RyLmRhdGEoKSwgX19zdHIuZGF0YSgpICsgX19sZW4sICZfX2RpZ2l0c1swXSk7CisJfQorICAgICAgcmV0dXJuIF9fYmVnOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgorICAgIHRlbXBsYXRlPGJvb2wgX0ludGw+CisgICAgICBfT3V0SXRlcgorICAgICAgbW9uZXlfcHV0PF9DaGFyVCwgX091dEl0ZXI+OjoKKyAgICAgIF9NX2luc2VydChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwKKwkJY29uc3Qgc3RyaW5nX3R5cGUmIF9fZGlnaXRzKSBjb25zdAorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgc3RyaW5nX3R5cGU6OnNpemVfdHlwZQkgICAgICAgICAgc2l6ZV90eXBlOworCXR5cGVkZWYgbW9uZXlfYmFzZTo6cGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydDsKKwl0eXBlZGVmIF9fbW9uZXlwdW5jdF9jYWNoZTxfQ2hhclQsIF9JbnRsPiAgICAgICAgIF9fY2FjaGVfdHlwZTsKKyAgICAgIAorCWNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworCWNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3R5cGUgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKTsKKworCV9fdXNlX2NhY2hlPF9fY2FjaGVfdHlwZT4gX191YzsKKwljb25zdCBfX2NhY2hlX3R5cGUqIF9fbGMgPSBfX3VjKF9fbG9jKTsKKwljb25zdCBjaGFyX3R5cGUqIF9fbGl0ID0gX19sYy0+X01fYXRvbXM7CisKKwkvLyBEZXRlcm1pbmUgaWYgbmVnYXRpdmUgb3IgcG9zaXRpdmUgZm9ybWF0cyBhcmUgdG8gYmUgdXNlZCwgYW5kCisJLy8gZGlzY2FyZCBsZWFkaW5nIG5lZ2F0aXZlX3NpZ24gaWYgaXQgaXMgcHJlc2VudC4KKwljb25zdCBjaGFyX3R5cGUqIF9fYmVnID0gX19kaWdpdHMuZGF0YSgpOworCisJbW9uZXlfYmFzZTo6cGF0dGVybiBfX3A7CisJY29uc3QgY2hhcl90eXBlKiBfX3NpZ247CisJc2l6ZV90eXBlIF9fc2lnbl9zaXplOworCWlmICghKCpfX2JlZyA9PSBfX2xpdFttb25leV9iYXNlOjpfU19taW51c10pKQorCSAgeworCSAgICBfX3AgPSBfX2xjLT5fTV9wb3NfZm9ybWF0OworCSAgICBfX3NpZ24gPSBfX2xjLT5fTV9wb3NpdGl2ZV9zaWduOworCSAgICBfX3NpZ25fc2l6ZSA9IF9fbGMtPl9NX3Bvc2l0aXZlX3NpZ25fc2l6ZTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIF9fcCA9IF9fbGMtPl9NX25lZ19mb3JtYXQ7CisJICAgIF9fc2lnbiA9IF9fbGMtPl9NX25lZ2F0aXZlX3NpZ247CisJICAgIF9fc2lnbl9zaXplID0gX19sYy0+X01fbmVnYXRpdmVfc2lnbl9zaXplOworCSAgICBpZiAoX19kaWdpdHMuc2l6ZSgpKQorCSAgICAgICsrX19iZWc7CisJICB9CisgICAgICAgCisJLy8gTG9vayBmb3IgdmFsaWQgbnVtYmVycyBpbiB0aGUgY3R5cGUgZmFjZXQgd2l0aGluIGlucHV0IGRpZ2l0cy4KKwlzaXplX3R5cGUgX19sZW4gPSBfX2N0eXBlLnNjYW5fbm90KGN0eXBlX2Jhc2U6OmRpZ2l0LCBfX2JlZywKKwkJCQkJICAgX19iZWcgKyBfX2RpZ2l0cy5zaXplKCkpIC0gX19iZWc7CisJaWYgKF9fbGVuKQorCSAgeworCSAgICAvLyBBc3N1bWUgdmFsaWQgaW5wdXQsIGFuZCBhdHRlbXB0IHRvIGZvcm1hdC4KKwkgICAgLy8gQnJlYWsgZG93biBpbnB1dCBudW1iZXJzIGludG8gYmFzZSBjb21wb25lbnRzLCBhcyBmb2xsb3dzOgorCSAgICAvLyAgIGZpbmFsX3ZhbHVlID0gZ3JvdXBlZCB1bml0cyArIChkZWNpbWFsIHBvaW50KSArIChkaWdpdHMpCisJICAgIHN0cmluZ190eXBlIF9fdmFsdWU7CisJICAgIF9fdmFsdWUucmVzZXJ2ZSgyICogX19sZW4pOworCisJICAgIC8vIEFkZCB0aG91c2FuZHMgc2VwYXJhdG9ycyB0byBub24tZGVjaW1hbCBkaWdpdHMsIHBlcgorCSAgICAvLyBncm91cGluZyBydWxlcy4KKwkgICAgbG9uZyBfX3BhZGRlYyA9IF9fbGVuIC0gX19sYy0+X01fZnJhY19kaWdpdHM7CisJICAgIGlmIChfX3BhZGRlYyA+IDApCisgIAkgICAgICB7CisJCWlmIChfX2xjLT5fTV9mcmFjX2RpZ2l0cyA8IDApCisJCSAgX19wYWRkZWMgPSBfX2xlbjsKKyAgCQlpZiAoX19sYy0+X01fZ3JvdXBpbmdfc2l6ZSkKKyAgCQkgIHsKKwkJICAgIF9fdmFsdWUuYXNzaWduKDIgKiBfX3BhZGRlYywgY2hhcl90eXBlKCkpOworIAkJICAgIF9DaGFyVCogX192ZW5kID0gCisJCSAgICAgIHN0ZDo6X19hZGRfZ3JvdXBpbmcoJl9fdmFsdWVbMF0sIF9fbGMtPl9NX3Rob3VzYW5kc19zZXAsCisJCQkJCSAgX19sYy0+X01fZ3JvdXBpbmcsCisJCQkJCSAgX19sYy0+X01fZ3JvdXBpbmdfc2l6ZSwKKwkJCQkJICBfX2JlZywgX19iZWcgKyBfX3BhZGRlYyk7CisJCSAgICBfX3ZhbHVlLmVyYXNlKF9fdmVuZCAtICZfX3ZhbHVlWzBdKTsKKyAgCQkgIH0KKyAgCQllbHNlCisJCSAgX192YWx1ZS5hc3NpZ24oX19iZWcsIF9fcGFkZGVjKTsKKwkgICAgICB9CisKKwkgICAgLy8gRGVhbCB3aXRoIGRlY2ltYWwgcG9pbnQsIGRlY2ltYWwgZGlnaXRzLgorCSAgICBpZiAoX19sYy0+X01fZnJhY19kaWdpdHMgPiAwKQorCSAgICAgIHsKKwkJX192YWx1ZSArPSBfX2xjLT5fTV9kZWNpbWFsX3BvaW50OworCQlpZiAoX19wYWRkZWMgPj0gMCkKKwkJICBfX3ZhbHVlLmFwcGVuZChfX2JlZyArIF9fcGFkZGVjLCBfX2xjLT5fTV9mcmFjX2RpZ2l0cyk7CisJCWVsc2UKKwkJICB7CisJCSAgICAvLyBIYXZlIHRvIHBhZCB6ZXJvcyBpbiB0aGUgZGVjaW1hbCBwb3NpdGlvbi4KKwkJICAgIF9fdmFsdWUuYXBwZW5kKC1fX3BhZGRlYywgX19saXRbbW9uZXlfYmFzZTo6X1NfemVyb10pOworCQkgICAgX192YWx1ZS5hcHBlbmQoX19iZWcsIF9fbGVuKTsKKwkJICB9CisgIAkgICAgICB9CisgIAorCSAgICAvLyBDYWxjdWxhdGUgbGVuZ3RoIG9mIHJlc3VsdGluZyBzdHJpbmcuCisJICAgIGNvbnN0IGlvc19iYXNlOjpmbXRmbGFncyBfX2YgPSBfX2lvLmZsYWdzKCkgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIGlvc19iYXNlOjphZGp1c3RmaWVsZDsKKwkgICAgX19sZW4gPSBfX3ZhbHVlLnNpemUoKSArIF9fc2lnbl9zaXplOworCSAgICBfX2xlbiArPSAoKF9faW8uZmxhZ3MoKSAmIGlvc19iYXNlOjpzaG93YmFzZSkKKwkJICAgICAgPyBfX2xjLT5fTV9jdXJyX3N5bWJvbF9zaXplIDogMCk7CisKKwkgICAgc3RyaW5nX3R5cGUgX19yZXM7CisJICAgIF9fcmVzLnJlc2VydmUoMiAqIF9fbGVuKTsKKwkgICAgCisJICAgIGNvbnN0IHNpemVfdHlwZSBfX3dpZHRoID0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX2lvLndpZHRoKCkpOyAgCisJICAgIGNvbnN0IGJvb2wgX190ZXN0aXBhZCA9IChfX2YgPT0gaW9zX2Jhc2U6OmludGVybmFsCisJCQkJICAgICAmJiBfX2xlbiA8IF9fd2lkdGgpOworCSAgICAvLyBGaXQgZm9ybWF0dGVkIGRpZ2l0cyBpbnRvIHRoZSByZXF1aXJlZCBwYXR0ZXJuLgorCSAgICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCA0OyArK19faSkKKwkgICAgICB7CisJCWNvbnN0IHBhcnQgX193aGljaCA9IHN0YXRpY19jYXN0PHBhcnQ+KF9fcC5maWVsZFtfX2ldKTsKKwkJc3dpdGNoIChfX3doaWNoKQorCQkgIHsKKwkJICBjYXNlIG1vbmV5X2Jhc2U6OnN5bWJvbDoKKwkJICAgIGlmIChfX2lvLmZsYWdzKCkgJiBpb3NfYmFzZTo6c2hvd2Jhc2UpCisJCSAgICAgIF9fcmVzLmFwcGVuZChfX2xjLT5fTV9jdXJyX3N5bWJvbCwKKwkJCQkgICBfX2xjLT5fTV9jdXJyX3N5bWJvbF9zaXplKTsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgbW9uZXlfYmFzZTo6c2lnbjoKKwkJICAgIC8vIFNpZ24gbWlnaHQgbm90IGV4aXN0LCBvciBiZSBtb3JlIHRoYW4gb25lCisJCSAgICAvLyBjaGFyYWN0ZXIgbG9uZy4gSW4gdGhhdCBjYXNlLCBhZGQgaW4gdGhlIHJlc3QKKwkJICAgIC8vIGJlbG93LgorCQkgICAgaWYgKF9fc2lnbl9zaXplKQorCQkgICAgICBfX3JlcyArPSBfX3NpZ25bMF07CisJCSAgICBicmVhazsKKwkJICBjYXNlIG1vbmV5X2Jhc2U6OnZhbHVlOgorCQkgICAgX19yZXMgKz0gX192YWx1ZTsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgbW9uZXlfYmFzZTo6c3BhY2U6CisJCSAgICAvLyBBdCBsZWFzdCBvbmUgc3BhY2UgaXMgcmVxdWlyZWQsIGJ1dCBpZiBpbnRlcm5hbAorCQkgICAgLy8gZm9ybWF0dGluZyBpcyByZXF1aXJlZCwgYW4gYXJiaXRyYXJ5IG51bWJlciBvZgorCQkgICAgLy8gZmlsbCBzcGFjZXMgd2lsbCBiZSBuZWNlc3NhcnkuCisJCSAgICBpZiAoX190ZXN0aXBhZCkKKwkJICAgICAgX19yZXMuYXBwZW5kKF9fd2lkdGggLSBfX2xlbiwgX19maWxsKTsKKwkJICAgIGVsc2UKKwkJICAgICAgX19yZXMgKz0gX19maWxsOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBtb25leV9iYXNlOjpub25lOgorCQkgICAgaWYgKF9fdGVzdGlwYWQpCisJCSAgICAgIF9fcmVzLmFwcGVuZChfX3dpZHRoIC0gX19sZW4sIF9fZmlsbCk7CisJCSAgICBicmVhazsKKwkJICB9CisJICAgICAgfQorCSAgICAKKwkgICAgLy8gU3BlY2lhbCBjYXNlIG9mIG11bHRpLXBhcnQgc2lnbiBwYXJ0cy4KKwkgICAgaWYgKF9fc2lnbl9zaXplID4gMSkKKwkgICAgICBfX3Jlcy5hcHBlbmQoX19zaWduICsgMSwgX19zaWduX3NpemUgLSAxKTsKKwkgICAgCisJICAgIC8vIFBhZCwgaWYgc3RpbGwgbmVjZXNzYXJ5LgorCSAgICBfX2xlbiA9IF9fcmVzLnNpemUoKTsKKwkgICAgaWYgKF9fd2lkdGggPiBfX2xlbikKKwkgICAgICB7CisJCWlmIChfX2YgPT0gaW9zX2Jhc2U6OmxlZnQpCisJCSAgLy8gQWZ0ZXIuCisJCSAgX19yZXMuYXBwZW5kKF9fd2lkdGggLSBfX2xlbiwgX19maWxsKTsKKwkJZWxzZQorCQkgIC8vIEJlZm9yZS4KKwkJICBfX3Jlcy5pbnNlcnQoMCwgX193aWR0aCAtIF9fbGVuLCBfX2ZpbGwpOworCQlfX2xlbiA9IF9fd2lkdGg7CisJICAgICAgfQorCSAgICAKKwkgICAgLy8gV3JpdGUgcmVzdWx0aW5nLCBmdWxseS1mb3JtYXR0ZWQgc3RyaW5nIHRvIG91dHB1dCBpdGVyYXRvci4KKwkgICAgX19zID0gc3RkOjpfX3dyaXRlKF9fcywgX19yZXMuZGF0YSgpLCBfX2xlbik7CisJICB9CisJX19pby53aWR0aCgwKTsKKwlyZXR1cm4gX19zOyAgICAKKyAgICAgIH0KKworI2lmIGRlZmluZWQgX0dMSUJDWFhfTE9OR19ET1VCTEVfQ09NUEFUICYmIGRlZmluZWQgX19MT05HX0RPVUJMRV8xMjhfXworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgorICAgIF9PdXRJdGVyCisgICAgbW9uZXlfcHV0PF9DaGFyVCwgX091dEl0ZXI+OjoKKyAgICBfX2RvX3B1dChpdGVyX3R5cGUgX19zLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCisJICAgICBkb3VibGUgX191bml0cykgY29uc3QKKyAgICB7IHJldHVybiB0aGlzLT5kb19wdXQoX19zLCBfX2ludGwsIF9faW8sIF9fZmlsbCwgKGxvbmcgZG91YmxlKSBfX3VuaXRzKTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICBfT3V0SXRlcgorICAgIG1vbmV5X3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6CisgICAgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwKKwkgICBsb25nIGRvdWJsZSBfX3VuaXRzKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IGxvY2FsZSBfX2xvYyA9IF9faW8uZ2V0bG9jKCk7CisgICAgICBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0eXBlID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYyk7CisjaWZkZWYgX0dMSUJDWFhfVVNFX0M5OQorICAgICAgLy8gRmlyc3QgdHJ5IGEgYnVmZmVyIHBlcmhhcHMgYmlnIGVub3VnaC4KKyAgICAgIGludCBfX2NzX3NpemUgPSA2NDsKKyAgICAgIGNoYXIqIF9fY3MgPSBzdGF0aWNfY2FzdDxjaGFyKj4oX19idWlsdGluX2FsbG9jYShfX2NzX3NpemUpKTsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDMyOC4gQmFkIHNwcmludGYgZm9ybWF0IG1vZGlmaWVyIGluIG1vbmV5X3B1dDw+Ojpkb19wdXQoKQorICAgICAgaW50IF9fbGVuID0gc3RkOjpfX2NvbnZlcnRfZnJvbV92KF9TX2dldF9jX2xvY2FsZSgpLCBfX2NzLCBfX2NzX3NpemUsCisJCQkJCSIlLipMZiIsIDAsIF9fdW5pdHMpOworICAgICAgLy8gSWYgdGhlIGJ1ZmZlciB3YXMgbm90IGxhcmdlIGVub3VnaCwgdHJ5IGFnYWluIHdpdGggdGhlIGNvcnJlY3Qgc2l6ZS4KKyAgICAgIGlmIChfX2xlbiA+PSBfX2NzX3NpemUpCisJeworCSAgX19jc19zaXplID0gX19sZW4gKyAxOworCSAgX19jcyA9IHN0YXRpY19jYXN0PGNoYXIqPihfX2J1aWx0aW5fYWxsb2NhKF9fY3Nfc2l6ZSkpOworCSAgX19sZW4gPSBzdGQ6Ol9fY29udmVydF9mcm9tX3YoX1NfZ2V0X2NfbG9jYWxlKCksIF9fY3MsIF9fY3Nfc2l6ZSwKKwkJCQkJIiUuKkxmIiwgMCwgX191bml0cyk7CisJfQorI2Vsc2UKKyAgICAgIC8vIG1heF9leHBvbmVudDEwICsgMSBmb3IgdGhlIGludGVnZXIgcGFydCwgKyAyIGZvciBzaWduIGFuZCAnXDAnLgorICAgICAgY29uc3QgaW50IF9fY3Nfc2l6ZSA9CisJX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPGxvbmcgZG91YmxlPjo6X19tYXhfZXhwb25lbnQxMCArIDM7CisgICAgICBjaGFyKiBfX2NzID0gc3RhdGljX2Nhc3Q8Y2hhcio+KF9fYnVpbHRpbl9hbGxvY2EoX19jc19zaXplKSk7CisgICAgICBpbnQgX19sZW4gPSBzdGQ6Ol9fY29udmVydF9mcm9tX3YoX1NfZ2V0X2NfbG9jYWxlKCksIF9fY3MsIDAsICIlLipMZiIsIAorCQkJCQkwLCBfX3VuaXRzKTsKKyNlbmRpZgorICAgICAgc3RyaW5nX3R5cGUgX19kaWdpdHMoX19sZW4sIGNoYXJfdHlwZSgpKTsKKyAgICAgIF9fY3R5cGUud2lkZW4oX19jcywgX19jcyArIF9fbGVuLCAmX19kaWdpdHNbMF0pOworICAgICAgcmV0dXJuIF9faW50bCA/IF9NX2luc2VydDx0cnVlPihfX3MsIF9faW8sIF9fZmlsbCwgX19kaWdpdHMpCisJICAgICAgICAgICAgOiBfTV9pbnNlcnQ8ZmFsc2U+KF9fcywgX19pbywgX19maWxsLCBfX2RpZ2l0cyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgX091dEl0ZXIKKyAgICBtb25leV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OgorICAgIGRvX3B1dChpdGVyX3R5cGUgX19zLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCisJICAgY29uc3Qgc3RyaW5nX3R5cGUmIF9fZGlnaXRzKSBjb25zdAorICAgIHsgcmV0dXJuIF9faW50bCA/IF9NX2luc2VydDx0cnVlPihfX3MsIF9faW8sIF9fZmlsbCwgX19kaWdpdHMpCisJICAgICAgICAgICAgOiBfTV9pbnNlcnQ8ZmFsc2U+KF9fcywgX19pbywgX19maWxsLCBfX2RpZ2l0cyk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9MREJMCisKKyAgLy8gTkI6IE5vdCBlc3BlY2lhbGx5IHVzZWZ1bC4gV2l0aG91dCBhbiBpb3NfYmFzZSBvYmplY3Qgb3Igc29tZQorICAvLyBraW5kIG9mIGxvY2FsZSByZWZlcmVuY2UsIHdlIGFyZSBsZWZ0IGNsYXdpbmcgYXQgdGhlIGFpciB3aGVyZQorICAvLyB0aGUgc2lkZSBvZiB0aGUgbW91bnRhaW4gdXNlZCB0byBiZS4uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgdGltZV9iYXNlOjpkYXRlb3JkZXIKKyAgICB0aW1lX2dldDxfQ2hhclQsIF9Jbkl0ZXI+Ojpkb19kYXRlX29yZGVyKCkgY29uc3QKKyAgICB7IHJldHVybiB0aW1lX2Jhc2U6Om5vX29yZGVyOyB9CisKKyAgLy8gRXhwYW5kIGEgc3RyZnRpbWUgZm9ybWF0IHN0cmluZyBhbmQgcGFyc2UgaXQuICBFLmcuLCBkb19nZXRfZGF0ZSgpIG1heQorICAvLyBwYXNzICVtLyVkLyVZID0+IGV4dHJhY3RlZCBjaGFyYWN0ZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgX0luSXRlcgorICAgIHRpbWVfZ2V0PF9DaGFyVCwgX0luSXRlcj46OgorICAgIF9NX2V4dHJhY3RfdmlhX2Zvcm1hdChpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJCQkgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0sCisJCQkgIGNvbnN0IF9DaGFyVCogX19mb3JtYXQpIGNvbnN0CisgICAgeworICAgICAgY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisgICAgICBjb25zdCBfX3RpbWVwdW5jdDxfQ2hhclQ+JiBfX3RwID0gdXNlX2ZhY2V0PF9fdGltZXB1bmN0PF9DaGFyVD4gPihfX2xvYyk7CisgICAgICBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0eXBlID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYyk7CisgICAgICBjb25zdCBzaXplX3QgX19sZW4gPSBjaGFyX3RyYWl0czxfQ2hhclQ+OjpsZW5ndGgoX19mb3JtYXQpOworCisgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX3RtcGVyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgc2l6ZV90IF9faSA9IDA7CisgICAgICBmb3IgKDsgX19iZWcgIT0gX19lbmQgJiYgX19pIDwgX19sZW4gJiYgIV9fdG1wZXJyOyArK19faSkKKwl7CisJICBpZiAoX19jdHlwZS5uYXJyb3coX19mb3JtYXRbX19pXSwgMCkgPT0gJyUnKQorCSAgICB7CisJICAgICAgLy8gVmVyaWZ5IHZhbGlkIGZvcm1hdHRpbmcgY29kZSwgYXR0ZW1wdCB0byBleHRyYWN0LgorCSAgICAgIGNoYXIgX19jID0gX19jdHlwZS5uYXJyb3coX19mb3JtYXRbKytfX2ldLCAwKTsKKwkgICAgICBpbnQgX19tZW0gPSAwOworCSAgICAgIGlmIChfX2MgPT0gJ0UnIHx8IF9fYyA9PSAnTycpCisJCV9fYyA9IF9fY3R5cGUubmFycm93KF9fZm9ybWF0WysrX19pXSwgMCk7CisJICAgICAgc3dpdGNoIChfX2MpCisJCXsKKwkJICBjb25zdCBjaGFyKiBfX2NzOworCQkgIF9DaGFyVCBfX3djc1sxMF07CisJCWNhc2UgJ2EnOgorCQkgIC8vIEFiYnJldmlhdGVkIHdlZWtkYXkgbmFtZSBbdG1fd2RheV0KKwkJICBjb25zdCBjaGFyX3R5cGUqICBfX2RheXMxWzddOworCQkgIF9fdHAuX01fZGF5c19hYmJyZXZpYXRlZChfX2RheXMxKTsKKwkJICBfX2JlZyA9IF9NX2V4dHJhY3RfbmFtZShfX2JlZywgX19lbmQsIF9fdG0tPnRtX3dkYXksIF9fZGF5czEsCisJCQkJCSAgNywgX19pbywgX190bXBlcnIpOworCQkgIGJyZWFrOworCQljYXNlICdBJzoKKwkJICAvLyBXZWVrZGF5IG5hbWUgW3RtX3dkYXldLgorCQkgIGNvbnN0IGNoYXJfdHlwZSogIF9fZGF5czJbN107CisJCSAgX190cC5fTV9kYXlzKF9fZGF5czIpOworCQkgIF9fYmVnID0gX01fZXh0cmFjdF9uYW1lKF9fYmVnLCBfX2VuZCwgX190bS0+dG1fd2RheSwgX19kYXlzMiwKKwkJCQkJICA3LCBfX2lvLCBfX3RtcGVycik7CisJCSAgYnJlYWs7CisJCWNhc2UgJ2gnOgorCQljYXNlICdiJzoKKwkJICAvLyBBYmJyZXZpYXRlZCBtb250aCBuYW1lIFt0bV9tb25dCisJCSAgY29uc3QgY2hhcl90eXBlKiAgX19tb250aHMxWzEyXTsKKwkJICBfX3RwLl9NX21vbnRoc19hYmJyZXZpYXRlZChfX21vbnRoczEpOworCQkgIF9fYmVnID0gX01fZXh0cmFjdF9uYW1lKF9fYmVnLCBfX2VuZCwgX190bS0+dG1fbW9uLCAKKwkJCQkJICBfX21vbnRoczEsIDEyLCBfX2lvLCBfX3RtcGVycik7CisJCSAgYnJlYWs7CisJCWNhc2UgJ0InOgorCQkgIC8vIE1vbnRoIG5hbWUgW3RtX21vbl0uCisJCSAgY29uc3QgY2hhcl90eXBlKiAgX19tb250aHMyWzEyXTsKKwkJICBfX3RwLl9NX21vbnRocyhfX21vbnRoczIpOworCQkgIF9fYmVnID0gX01fZXh0cmFjdF9uYW1lKF9fYmVnLCBfX2VuZCwgX190bS0+dG1fbW9uLCAKKwkJCQkJICBfX21vbnRoczIsIDEyLCBfX2lvLCBfX3RtcGVycik7CisJCSAgYnJlYWs7CisJCWNhc2UgJ2MnOgorCQkgIC8vIERlZmF1bHQgdGltZSBhbmQgZGF0ZSByZXByZXNlbnRhdGlvbi4KKwkJICBjb25zdCBjaGFyX3R5cGUqICBfX2R0WzJdOworCQkgIF9fdHAuX01fZGF0ZV90aW1lX2Zvcm1hdHMoX19kdCk7CisJCSAgX19iZWcgPSBfTV9leHRyYWN0X3ZpYV9mb3JtYXQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX3RtcGVyciwgCisJCQkJCQlfX3RtLCBfX2R0WzBdKTsKKwkJICBicmVhazsKKwkJY2FzZSAnZCc6CisJCSAgLy8gRGF5IFswMSwgMzFdLiBbdG1fbWRheV0KKwkJICBfX2JlZyA9IF9NX2V4dHJhY3RfbnVtKF9fYmVnLCBfX2VuZCwgX190bS0+dG1fbWRheSwgMSwgMzEsIDIsCisJCQkJCSBfX2lvLCBfX3RtcGVycik7CisJCSAgYnJlYWs7CisJCWNhc2UgJ2UnOgorCQkgIC8vIERheSBbMSwgMzFdLCB3aXRoIHNpbmdsZSBkaWdpdHMgcHJlY2VkZWQgYnkKKwkJICAvLyBzcGFjZS4gW3RtX21kYXldCisJCSAgaWYgKF9fY3R5cGUuaXMoY3R5cGVfYmFzZTo6c3BhY2UsICpfX2JlZykpCisJCSAgICBfX2JlZyA9IF9NX2V4dHJhY3RfbnVtKCsrX19iZWcsIF9fZW5kLCBfX3RtLT50bV9tZGF5LCAxLCA5LAorCQkJCQkgICAxLCBfX2lvLCBfX3RtcGVycik7CisJCSAgZWxzZQorCQkgICAgX19iZWcgPSBfTV9leHRyYWN0X251bShfX2JlZywgX19lbmQsIF9fdG0tPnRtX21kYXksIDEwLCAzMSwKKwkJCQkJICAgMiwgX19pbywgX190bXBlcnIpOworCQkgIGJyZWFrOworCQljYXNlICdEJzoKKwkJICAvLyBFcXVpdmFsZW50IHRvICVtLyVkLyV5Llt0bV9tb24sIHRtX21kYXksIHRtX3llYXJdCisJCSAgX19jcyA9ICIlbS8lZC8leSI7CisJCSAgX19jdHlwZS53aWRlbihfX2NzLCBfX2NzICsgOSwgX193Y3MpOworCQkgIF9fYmVnID0gX01fZXh0cmFjdF92aWFfZm9ybWF0KF9fYmVnLCBfX2VuZCwgX19pbywgX190bXBlcnIsIAorCQkJCQkJX190bSwgX193Y3MpOworCQkgIGJyZWFrOworCQljYXNlICdIJzoKKwkJICAvLyBIb3VyIFswMCwgMjNdLiBbdG1faG91cl0KKwkJICBfX2JlZyA9IF9NX2V4dHJhY3RfbnVtKF9fYmVnLCBfX2VuZCwgX190bS0+dG1faG91ciwgMCwgMjMsIDIsCisJCQkJCSBfX2lvLCBfX3RtcGVycik7CisJCSAgYnJlYWs7CisJCWNhc2UgJ0knOgorCQkgIC8vIEhvdXIgWzAxLCAxMl0uIFt0bV9ob3VyXQorCQkgIF9fYmVnID0gX01fZXh0cmFjdF9udW0oX19iZWcsIF9fZW5kLCBfX3RtLT50bV9ob3VyLCAxLCAxMiwgMiwKKwkJCQkJIF9faW8sIF9fdG1wZXJyKTsKKwkJICBicmVhazsKKwkJY2FzZSAnbSc6CisJCSAgLy8gTW9udGggWzAxLCAxMl0uIFt0bV9tb25dCisJCSAgX19iZWcgPSBfTV9leHRyYWN0X251bShfX2JlZywgX19lbmQsIF9fbWVtLCAxLCAxMiwgMiwgCisJCQkJCSBfX2lvLCBfX3RtcGVycik7CisJCSAgaWYgKCFfX3RtcGVycikKKwkJICAgIF9fdG0tPnRtX21vbiA9IF9fbWVtIC0gMTsKKwkJICBicmVhazsKKwkJY2FzZSAnTSc6CisJCSAgLy8gTWludXRlIFswMCwgNTldLiBbdG1fbWluXQorCQkgIF9fYmVnID0gX01fZXh0cmFjdF9udW0oX19iZWcsIF9fZW5kLCBfX3RtLT50bV9taW4sIDAsIDU5LCAyLAorCQkJCQkgX19pbywgX190bXBlcnIpOworCQkgIGJyZWFrOworCQljYXNlICduJzoKKwkJICBpZiAoX19jdHlwZS5uYXJyb3coKl9fYmVnLCAwKSA9PSAnXG4nKQorCQkgICAgKytfX2JlZzsKKwkJICBlbHNlCisJCSAgICBfX3RtcGVyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKwkJICBicmVhazsKKwkJY2FzZSAnUic6CisJCSAgLy8gRXF1aXZhbGVudCB0byAoJUg6JU0pLgorCQkgIF9fY3MgPSAiJUg6JU0iOworCQkgIF9fY3R5cGUud2lkZW4oX19jcywgX19jcyArIDYsIF9fd2NzKTsKKwkJICBfX2JlZyA9IF9NX2V4dHJhY3RfdmlhX2Zvcm1hdChfX2JlZywgX19lbmQsIF9faW8sIF9fdG1wZXJyLCAKKwkJCQkJCV9fdG0sIF9fd2NzKTsKKwkJICBicmVhazsKKwkJY2FzZSAnUyc6CisJCSAgLy8gU2Vjb25kcy4gW3RtX3NlY10KKwkJICAvLyBbMDAsIDYwXSBpbiBDOTkgKG9uZSBsZWFwLXNlY29uZCksIFswMCwgNjFdIGluIEM4OS4KKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5CisJCSAgX19iZWcgPSBfTV9leHRyYWN0X251bShfX2JlZywgX19lbmQsIF9fdG0tPnRtX3NlYywgMCwgNjAsIDIsCisjZWxzZQorCQkgIF9fYmVnID0gX01fZXh0cmFjdF9udW0oX19iZWcsIF9fZW5kLCBfX3RtLT50bV9zZWMsIDAsIDYxLCAyLAorI2VuZGlmCisJCQkJCSBfX2lvLCBfX3RtcGVycik7CisJCSAgYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkgIGlmIChfX2N0eXBlLm5hcnJvdygqX19iZWcsIDApID09ICdcdCcpCisJCSAgICArK19fYmVnOworCQkgIGVsc2UKKwkJICAgIF9fdG1wZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCQkgIGJyZWFrOworCQljYXNlICdUJzoKKwkJICAvLyBFcXVpdmFsZW50IHRvICglSDolTTolUykuCisJCSAgX19jcyA9ICIlSDolTTolUyI7CisJCSAgX19jdHlwZS53aWRlbihfX2NzLCBfX2NzICsgOSwgX193Y3MpOworCQkgIF9fYmVnID0gX01fZXh0cmFjdF92aWFfZm9ybWF0KF9fYmVnLCBfX2VuZCwgX19pbywgX190bXBlcnIsIAorCQkJCQkJX190bSwgX193Y3MpOworCQkgIGJyZWFrOworCQljYXNlICd4JzoKKwkJICAvLyBMb2NhbGUncyBkYXRlLgorCQkgIGNvbnN0IGNoYXJfdHlwZSogIF9fZGF0ZXNbMl07CisJCSAgX190cC5fTV9kYXRlX2Zvcm1hdHMoX19kYXRlcyk7CisJCSAgX19iZWcgPSBfTV9leHRyYWN0X3ZpYV9mb3JtYXQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX3RtcGVyciwgCisJCQkJCQlfX3RtLCBfX2RhdGVzWzBdKTsKKwkJICBicmVhazsKKwkJY2FzZSAnWCc6CisJCSAgLy8gTG9jYWxlJ3MgdGltZS4KKwkJICBjb25zdCBjaGFyX3R5cGUqICBfX3RpbWVzWzJdOworCQkgIF9fdHAuX01fdGltZV9mb3JtYXRzKF9fdGltZXMpOworCQkgIF9fYmVnID0gX01fZXh0cmFjdF92aWFfZm9ybWF0KF9fYmVnLCBfX2VuZCwgX19pbywgX190bXBlcnIsIAorCQkJCQkJX190bSwgX190aW1lc1swXSk7CisJCSAgYnJlYWs7CisJCWNhc2UgJ3knOgorCQljYXNlICdDJzogLy8gQzk5CisJCSAgLy8gVHdvIGRpZ2l0IHllYXIuCisJCWNhc2UgJ1knOgorCQkgIC8vIFllYXIgWzE5MDApLgorCQkgIC8vIE5COiBXZSBwYXJzZSBlaXRoZXIgdHdvIGRpZ2l0cywgaW1wbGljaXRseSB5ZWFycyBzaW5jZQorCQkgIC8vIDE5MDAsIG9yIDQgZGlnaXRzLCBmdWxsIHllYXIuICBJbiBib3RoIGNhc2VzIHdlIGNhbiAKKwkJICAvLyByZWNvbnN0cnVjdCBbdG1feWVhcl0uICBTZWUgYWxzbyBsaWJzdGRjKysvMjY3MDEuCisJCSAgX19iZWcgPSBfTV9leHRyYWN0X251bShfX2JlZywgX19lbmQsIF9fbWVtLCAwLCA5OTk5LCA0LAorCQkJCQkgX19pbywgX190bXBlcnIpOworCQkgIGlmICghX190bXBlcnIpCisJCSAgICBfX3RtLT50bV95ZWFyID0gX19tZW0gPCAwID8gX19tZW0gKyAxMDAgOiBfX21lbSAtIDE5MDA7CisJCSAgYnJlYWs7CisJCWNhc2UgJ1onOgorCQkgIC8vIFRpbWV6b25lIGluZm8uCisJCSAgaWYgKF9fY3R5cGUuaXMoY3R5cGVfYmFzZTo6dXBwZXIsICpfX2JlZykpCisJCSAgICB7CisJCSAgICAgIGludCBfX3RtcDsKKwkJICAgICAgX19iZWcgPSBfTV9leHRyYWN0X25hbWUoX19iZWcsIF9fZW5kLCBfX3RtcCwKKwkJCQkgICAgICAgX190aW1lcHVuY3RfY2FjaGU8X0NoYXJUPjo6X1NfdGltZXpvbmVzLAorCQkJCQkgICAgICAxNCwgX19pbywgX190bXBlcnIpOworCisJCSAgICAgIC8vIEdNVCByZXF1aXJlcyBzcGVjaWFsIGVmZm9ydC4KKwkJICAgICAgaWYgKF9fYmVnICE9IF9fZW5kICYmICFfX3RtcGVyciAmJiBfX3RtcCA9PSAwCisJCQkgICYmICgqX19iZWcgPT0gX19jdHlwZS53aWRlbignLScpCisJCQkgICAgICB8fCAqX19iZWcgPT0gX19jdHlwZS53aWRlbignKycpKSkKKwkJCXsKKwkJCSAgX19iZWcgPSBfTV9leHRyYWN0X251bShfX2JlZywgX19lbmQsIF9fdG1wLCAwLCAyMywgMiwKKwkJCQkJCSBfX2lvLCBfX3RtcGVycik7CisJCQkgIF9fYmVnID0gX01fZXh0cmFjdF9udW0oX19iZWcsIF9fZW5kLCBfX3RtcCwgMCwgNTksIDIsCisJCQkJCQkgX19pbywgX190bXBlcnIpOworCQkJfQorCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIF9fdG1wZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCQkgIGJyZWFrOworCQlkZWZhdWx0OgorCQkgIC8vIE5vdCByZWNvZ25pemVkLgorCQkgIF9fdG1wZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8vIFZlcmlmeSBmb3JtYXQgYW5kIGlucHV0IG1hdGNoLCBleHRyYWN0IGFuZCBkaXNjYXJkLgorCSAgICAgIGlmIChfX2Zvcm1hdFtfX2ldID09ICpfX2JlZykKKwkJKytfX2JlZzsKKwkgICAgICBlbHNlCisJCV9fdG1wZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCSAgICB9CisJfQorCisgICAgICBpZiAoX190bXBlcnIgfHwgX19pICE9IF9fbGVuKQorCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIF9Jbkl0ZXIKKyAgICB0aW1lX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBfTV9leHRyYWN0X251bShpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW50JiBfX21lbWJlciwKKwkJICAgaW50IF9fbWluLCBpbnQgX19tYXgsIHNpemVfdCBfX2xlbiwKKwkJICAgaW9zX2Jhc2UmIF9faW8sIGlvc19iYXNlOjppb3N0YXRlJiBfX2VycikgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBsb2NhbGUmIF9fbG9jID0gX19pby5fTV9nZXRsb2MoKTsKKyAgICAgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3R5cGUgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKTsKKworICAgICAgLy8gQXMtaXMgd29ya3MgZm9yIF9fbGVuID0gMSwgMiwgNCwgdGhlIHZhbHVlcyBhY3R1YWxseSB1c2VkLgorICAgICAgaW50IF9fbXVsdCA9IF9fbGVuID09IDIgPyAxMCA6IChfX2xlbiA9PSA0ID8gMTAwMCA6IDEpOworCisgICAgICArK19fbWluOworICAgICAgc2l6ZV90IF9faSA9IDA7CisgICAgICBpbnQgX192YWx1ZSA9IDA7CisgICAgICBmb3IgKDsgX19iZWcgIT0gX19lbmQgJiYgX19pIDwgX19sZW47ICsrX19iZWcsICsrX19pKQorCXsKKwkgIGNvbnN0IGNoYXIgX19jID0gX19jdHlwZS5uYXJyb3coKl9fYmVnLCAnKicpOworCSAgaWYgKF9fYyA+PSAnMCcgJiYgX19jIDw9ICc5JykKKwkgICAgeworCSAgICAgIF9fdmFsdWUgPSBfX3ZhbHVlICogMTAgKyAoX19jIC0gJzAnKTsKKwkgICAgICBjb25zdCBpbnQgX192YWx1ZWMgPSBfX3ZhbHVlICogX19tdWx0OworCSAgICAgIGlmIChfX3ZhbHVlYyA+IF9fbWF4IHx8IF9fdmFsdWVjICsgX19tdWx0IDwgX19taW4pCisJCWJyZWFrOworCSAgICAgIF9fbXVsdCAvPSAxMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICBicmVhazsKKwl9CisgICAgICBpZiAoX19pID09IF9fbGVuKQorCV9fbWVtYmVyID0gX192YWx1ZTsKKyAgICAgIC8vIFNwZWNpYWwgZW5jb2RpbmcgZm9yIGRvX2dldF95ZWFyLCAneScsIGFuZCAnWScgYWJvdmUuCisgICAgICBlbHNlIGlmIChfX2xlbiA9PSA0ICYmIF9faSA9PSAyKQorCV9fbWVtYmVyID0gX192YWx1ZSAtIDEwMDsKKyAgICAgIGVsc2UKKwlfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKworICAgICAgcmV0dXJuIF9fYmVnOworICAgIH0KKworICAvLyBBc3N1bXB0aW9uczoKKyAgLy8gQWxsIGVsZW1lbnRzIGluIF9fbmFtZXMgYXJlIHVuaXF1ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIF9Jbkl0ZXIKKyAgICB0aW1lX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBfTV9leHRyYWN0X25hbWUoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGludCYgX19tZW1iZXIsCisJCSAgICBjb25zdCBfQ2hhclQqKiBfX25hbWVzLCBzaXplX3QgX19pbmRleGxlbiwKKwkJICAgIGlvc19iYXNlJiBfX2lvLCBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIpIGNvbnN0CisgICAgeworICAgICAgdHlwZWRlZiBjaGFyX3RyYWl0czxfQ2hhclQ+CQlfX3RyYWl0c190eXBlOworICAgICAgY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisgICAgICBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0eXBlID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYyk7CisKKyAgICAgIGludCogX19tYXRjaGVzID0gc3RhdGljX2Nhc3Q8aW50Kj4oX19idWlsdGluX2FsbG9jYShzaXplb2YoaW50KQorCQkJCQkJCSAgKiBfX2luZGV4bGVuKSk7CisgICAgICBzaXplX3QgX19ubWF0Y2hlcyA9IDA7CisgICAgICBzaXplX3QgX19wb3MgPSAwOworICAgICAgYm9vbCBfX3Rlc3R2YWxpZCA9IHRydWU7CisgICAgICBjb25zdCBjaGFyX3R5cGUqIF9fbmFtZTsKKworICAgICAgLy8gTG9vayBmb3IgaW5pdGlhbCBtYXRjaGVzLgorICAgICAgLy8gTkI6IFNvbWUgb2YgdGhlIGxvY2FsZSBkYXRhIGlzIGluIHRoZSBmb3JtIG9mIGFsbCBsb3dlcmNhc2UKKyAgICAgIC8vIG5hbWVzLCBhbmQgc29tZSBpcyBpbiB0aGUgZm9ybSBvZiBpbml0aWFsbHktY2FwaXRhbGl6ZWQKKyAgICAgIC8vIG5hbWVzLiBMb29rIGZvciBib3RoLgorICAgICAgaWYgKF9fYmVnICE9IF9fZW5kKQorCXsKKwkgIGNvbnN0IGNoYXJfdHlwZSBfX2MgPSAqX19iZWc7CisJICBmb3IgKHNpemVfdCBfX2kxID0gMDsgX19pMSA8IF9faW5kZXhsZW47ICsrX19pMSkKKwkgICAgaWYgKF9fYyA9PSBfX25hbWVzW19faTFdWzBdCisJCXx8IF9fYyA9PSBfX2N0eXBlLnRvdXBwZXIoX19uYW1lc1tfX2kxXVswXSkpCisJICAgICAgX19tYXRjaGVzW19fbm1hdGNoZXMrK10gPSBfX2kxOworCX0KKworICAgICAgd2hpbGUgKF9fbm1hdGNoZXMgPiAxKQorCXsKKwkgIC8vIEZpbmQgc21hbGxlc3QgbWF0Y2hpbmcgc3RyaW5nLgorCSAgc2l6ZV90IF9fbWlubGVuID0gX190cmFpdHNfdHlwZTo6bGVuZ3RoKF9fbmFtZXNbX19tYXRjaGVzWzBdXSk7CisJICBmb3IgKHNpemVfdCBfX2kyID0gMTsgX19pMiA8IF9fbm1hdGNoZXM7ICsrX19pMikKKwkgICAgX19taW5sZW4gPSBzdGQ6Om1pbihfX21pbmxlbiwKKwkJCSAgICAgIF9fdHJhaXRzX3R5cGU6Omxlbmd0aChfX25hbWVzW19fbWF0Y2hlc1tfX2kyXV0pKTsKKwkgICsrX19iZWcsICsrX19wb3M7CisJICBpZiAoX19wb3MgPCBfX21pbmxlbiAmJiBfX2JlZyAhPSBfX2VuZCkKKwkgICAgZm9yIChzaXplX3QgX19pMyA9IDA7IF9faTMgPCBfX25tYXRjaGVzOykKKwkgICAgICB7CisJCV9fbmFtZSA9IF9fbmFtZXNbX19tYXRjaGVzW19faTNdXTsKKwkJaWYgKCEoX19uYW1lW19fcG9zXSA9PSAqX19iZWcpKQorCQkgIF9fbWF0Y2hlc1tfX2kzXSA9IF9fbWF0Y2hlc1stLV9fbm1hdGNoZXNdOworCQllbHNlCisJCSAgKytfX2kzOworCSAgICAgIH0KKwkgIGVsc2UKKwkgICAgYnJlYWs7CisJfQorCisgICAgICBpZiAoX19ubWF0Y2hlcyA9PSAxKQorCXsKKwkgIC8vIE1ha2Ugc3VyZSBmb3VuZCBuYW1lIGlzIGNvbXBsZXRlbHkgZXh0cmFjdGVkLgorCSAgKytfX2JlZywgKytfX3BvczsKKwkgIF9fbmFtZSA9IF9fbmFtZXNbX19tYXRjaGVzWzBdXTsKKwkgIGNvbnN0IHNpemVfdCBfX2xlbiA9IF9fdHJhaXRzX3R5cGU6Omxlbmd0aChfX25hbWUpOworCSAgd2hpbGUgKF9fcG9zIDwgX19sZW4gJiYgX19iZWcgIT0gX19lbmQgJiYgX19uYW1lW19fcG9zXSA9PSAqX19iZWcpCisJICAgICsrX19iZWcsICsrX19wb3M7CisKKwkgIGlmIChfX2xlbiA9PSBfX3BvcykKKwkgICAgX19tZW1iZXIgPSBfX21hdGNoZXNbMF07CisJICBlbHNlCisJICAgIF9fdGVzdHZhbGlkID0gZmFsc2U7CisJfQorICAgICAgZWxzZQorCV9fdGVzdHZhbGlkID0gZmFsc2U7CisgICAgICBpZiAoIV9fdGVzdHZhbGlkKQorCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCisgICAgICByZXR1cm4gX19iZWc7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgdGltZV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgX01fZXh0cmFjdF93ZGF5X29yX21vbnRoKGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpbnQmIF9fbWVtYmVyLAorCQkJICAgICBjb25zdCBfQ2hhclQqKiBfX25hbWVzLCBzaXplX3QgX19pbmRleGxlbiwKKwkJCSAgICAgaW9zX2Jhc2UmIF9faW8sIGlvc19iYXNlOjppb3N0YXRlJiBfX2VycikgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIGNoYXJfdHJhaXRzPF9DaGFyVD4JCV9fdHJhaXRzX3R5cGU7CisgICAgICBjb25zdCBsb2NhbGUmIF9fbG9jID0gX19pby5fTV9nZXRsb2MoKTsKKyAgICAgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3R5cGUgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKTsKKworICAgICAgaW50KiBfX21hdGNoZXMgPSBzdGF0aWNfY2FzdDxpbnQqPihfX2J1aWx0aW5fYWxsb2NhKDIgKiBzaXplb2YoaW50KQorCQkJCQkJCSAgKiBfX2luZGV4bGVuKSk7CisgICAgICBzaXplX3QgX19ubWF0Y2hlcyA9IDA7CisgICAgICBzaXplX3QqIF9fbWF0Y2hlc19sZW5ndGhzID0gMDsKKyAgICAgIHNpemVfdCBfX3BvcyA9IDA7CisKKyAgICAgIGlmIChfX2JlZyAhPSBfX2VuZCkKKwl7CisJICBjb25zdCBjaGFyX3R5cGUgX19jID0gKl9fYmVnOworCSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgMiAqIF9faW5kZXhsZW47ICsrX19pKQorCSAgICBpZiAoX19jID09IF9fbmFtZXNbX19pXVswXQorCQl8fCBfX2MgPT0gX19jdHlwZS50b3VwcGVyKF9fbmFtZXNbX19pXVswXSkpCisJICAgICAgX19tYXRjaGVzW19fbm1hdGNoZXMrK10gPSBfX2k7CisJfQorCisgICAgICBpZiAoX19ubWF0Y2hlcykKKwl7CisJICArK19fYmVnLCArK19fcG9zOworCisJICBfX21hdGNoZXNfbGVuZ3RocworCSAgICA9IHN0YXRpY19jYXN0PHNpemVfdCo+KF9fYnVpbHRpbl9hbGxvY2Eoc2l6ZW9mKHNpemVfdCkKKwkJCQkJCSAgICAqIF9fbm1hdGNoZXMpKTsKKwkgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbm1hdGNoZXM7ICsrX19pKQorCSAgICBfX21hdGNoZXNfbGVuZ3Roc1tfX2ldCisJICAgICAgPSBfX3RyYWl0c190eXBlOjpsZW5ndGgoX19uYW1lc1tfX21hdGNoZXNbX19pXV0pOworCX0KKworICAgICAgZm9yICg7IF9fYmVnICE9IF9fZW5kOyArK19fYmVnLCArK19fcG9zKQorCXsKKwkgIHNpemVfdCBfX25za2lwcGVkID0gMDsKKwkgIGNvbnN0IGNoYXJfdHlwZSBfX2MgPSAqX19iZWc7CisJICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX25tYXRjaGVzOykKKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXJfdHlwZSogX19uYW1lID0gX19uYW1lc1tfX21hdGNoZXNbX19pXV07CisJICAgICAgaWYgKF9fcG9zID49IF9fbWF0Y2hlc19sZW5ndGhzW19faV0pCisJCSsrX19uc2tpcHBlZCwgKytfX2k7CisJICAgICAgZWxzZSBpZiAoIShfX25hbWVbX19wb3NdID09IF9fYykpCisJCXsKKwkJICAtLV9fbm1hdGNoZXM7CisJCSAgX19tYXRjaGVzW19faV0gPSBfX21hdGNoZXNbX19ubWF0Y2hlc107CisJCSAgX19tYXRjaGVzX2xlbmd0aHNbX19pXSA9IF9fbWF0Y2hlc19sZW5ndGhzW19fbm1hdGNoZXNdOworCQl9CisJICAgICAgZWxzZQorCQkrK19faTsKKwkgICAgfQorCSAgaWYgKF9fbnNraXBwZWQgPT0gX19ubWF0Y2hlcykKKwkgICAgYnJlYWs7CisJfQorCisgICAgICBpZiAoKF9fbm1hdGNoZXMgPT0gMSAmJiBfX21hdGNoZXNfbGVuZ3Roc1swXSA9PSBfX3BvcykKKwkgIHx8IChfX25tYXRjaGVzID09IDIgJiYgKF9fbWF0Y2hlc19sZW5ndGhzWzBdID09IF9fcG9zCisJCQkJICB8fCBfX21hdGNoZXNfbGVuZ3Roc1sxXSA9PSBfX3BvcykpKQorCV9fbWVtYmVyID0gKF9fbWF0Y2hlc1swXSA+PSBfX2luZGV4bGVuCisJCSAgICA/IF9fbWF0Y2hlc1swXSAtIF9faW5kZXhsZW4gOiBfX21hdGNoZXNbMF0pOworICAgICAgZWxzZQorCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCisgICAgICByZXR1cm4gX19iZWc7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgdGltZV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgZG9fZ2V0X3RpbWUoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCQlpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworICAgICAgY29uc3QgX190aW1lcHVuY3Q8X0NoYXJUPiYgX190cCA9IHVzZV9mYWNldDxfX3RpbWVwdW5jdDxfQ2hhclQ+ID4oX19sb2MpOworICAgICAgY29uc3QgY2hhcl90eXBlKiAgX190aW1lc1syXTsKKyAgICAgIF9fdHAuX01fdGltZV9mb3JtYXRzKF9fdGltZXMpOworICAgICAgX19iZWcgPSBfTV9leHRyYWN0X3ZpYV9mb3JtYXQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgCisJCQkJICAgIF9fdG0sIF9fdGltZXNbMF0pOworICAgICAgaWYgKF9fYmVnID09IF9fZW5kKQorCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgICByZXR1cm4gX19iZWc7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgdGltZV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgZG9fZ2V0X2RhdGUoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCQlpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworICAgICAgY29uc3QgX190aW1lcHVuY3Q8X0NoYXJUPiYgX190cCA9IHVzZV9mYWNldDxfX3RpbWVwdW5jdDxfQ2hhclQ+ID4oX19sb2MpOworICAgICAgY29uc3QgY2hhcl90eXBlKiAgX19kYXRlc1syXTsKKyAgICAgIF9fdHAuX01fZGF0ZV9mb3JtYXRzKF9fZGF0ZXMpOworICAgICAgX19iZWcgPSBfTV9leHRyYWN0X3ZpYV9mb3JtYXQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgCisJCQkJICAgIF9fdG0sIF9fZGF0ZXNbMF0pOworICAgICAgaWYgKF9fYmVnID09IF9fZW5kKQorCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgICByZXR1cm4gX19iZWc7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgdGltZV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgZG9fZ2V0X3dlZWtkYXkoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCQkgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtKSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVkZWYgY2hhcl90cmFpdHM8X0NoYXJUPgkJX190cmFpdHNfdHlwZTsKKyAgICAgIGNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworICAgICAgY29uc3QgX190aW1lcHVuY3Q8X0NoYXJUPiYgX190cCA9IHVzZV9mYWNldDxfX3RpbWVwdW5jdDxfQ2hhclQ+ID4oX19sb2MpOworICAgICAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdHlwZSA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpOworICAgICAgY29uc3QgY2hhcl90eXBlKiBfX2RheXNbMTRdOworICAgICAgX190cC5fTV9kYXlzX2FiYnJldmlhdGVkKF9fZGF5cyk7CisgICAgICBfX3RwLl9NX2RheXMoX19kYXlzICsgNyk7CisgICAgICBpbnQgX190bXB3ZGF5OworICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX190bXBlcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKworICAgICAgX19iZWcgPSBfTV9leHRyYWN0X3dkYXlfb3JfbW9udGgoX19iZWcsIF9fZW5kLCBfX3RtcHdkYXksIF9fZGF5cywgNywKKwkJCQkgICAgICAgX19pbywgX190bXBlcnIpOworICAgICAgaWYgKCFfX3RtcGVycikKKwlfX3RtLT50bV93ZGF5ID0gX190bXB3ZGF5OworICAgICAgZWxzZQorCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCisgICAgICBpZiAoX19iZWcgPT0gX19lbmQpCisJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgdGltZV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgZG9fZ2V0X21vbnRobmFtZShpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlJiBfX2lvLCBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtKSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVkZWYgY2hhcl90cmFpdHM8X0NoYXJUPgkJX190cmFpdHNfdHlwZTsKKyAgICAgIGNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworICAgICAgY29uc3QgX190aW1lcHVuY3Q8X0NoYXJUPiYgX190cCA9IHVzZV9mYWNldDxfX3RpbWVwdW5jdDxfQ2hhclQ+ID4oX19sb2MpOworICAgICAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdHlwZSA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpOworICAgICAgY29uc3QgY2hhcl90eXBlKiAgX19tb250aHNbMjRdOworICAgICAgX190cC5fTV9tb250aHNfYWJicmV2aWF0ZWQoX19tb250aHMpOworICAgICAgX190cC5fTV9tb250aHMoX19tb250aHMgKyAxMik7CisgICAgICBpbnQgX190bXBtb247CisgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX3RtcGVyciA9IGlvc19iYXNlOjpnb29kYml0OworCisgICAgICBfX2JlZyA9IF9NX2V4dHJhY3Rfd2RheV9vcl9tb250aChfX2JlZywgX19lbmQsIF9fdG1wbW9uLCBfX21vbnRocywgMTIsCisJCQkJICAgICAgIF9faW8sIF9fdG1wZXJyKTsKKyAgICAgIGlmICghX190bXBlcnIpCisJX190bS0+dG1fbW9uID0gX190bXBtb247CisgICAgICBlbHNlCisJX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisKKyAgICAgIGlmIChfX2JlZyA9PSBfX2VuZCkKKwlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgcmV0dXJuIF9fYmVnOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgX0luSXRlcgorICAgIHRpbWVfZ2V0PF9DaGFyVCwgX0luSXRlcj46OgorICAgIGRvX2dldF95ZWFyKGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkJaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190bSkgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBsb2NhbGUmIF9fbG9jID0gX19pby5fTV9nZXRsb2MoKTsKKyAgICAgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3R5cGUgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKTsKKyAgICAgIGludCBfX3RtcHllYXI7CisgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX3RtcGVyciA9IGlvc19iYXNlOjpnb29kYml0OworCisgICAgICBfX2JlZyA9IF9NX2V4dHJhY3RfbnVtKF9fYmVnLCBfX2VuZCwgX190bXB5ZWFyLCAwLCA5OTk5LCA0LAorCQkJICAgICBfX2lvLCBfX3RtcGVycik7CisgICAgICBpZiAoIV9fdG1wZXJyKQorCV9fdG0tPnRtX3llYXIgPSBfX3RtcHllYXIgPCAwID8gX190bXB5ZWFyICsgMTAwIDogX190bXB5ZWFyIC0gMTkwMDsKKyAgICAgIGVsc2UKKwlfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKworICAgICAgaWYgKF9fYmVnID09IF9fZW5kKQorCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgICByZXR1cm4gX19iZWc7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgX091dEl0ZXIKKyAgICB0aW1lX3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6CisgICAgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLCBjb25zdCB0bSogX190bSwKKwljb25zdCBfQ2hhclQqIF9fYmVnLCBjb25zdCBfQ2hhclQqIF9fZW5kKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworICAgICAgY3R5cGU8X0NoYXJUPiBjb25zdCYgX19jdHlwZSA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpOworICAgICAgZm9yICg7IF9fYmVnICE9IF9fZW5kOyArK19fYmVnKQorCWlmIChfX2N0eXBlLm5hcnJvdygqX19iZWcsIDApICE9ICclJykKKwkgIHsKKwkgICAgKl9fcyA9ICpfX2JlZzsKKwkgICAgKytfX3M7CisJICB9CisJZWxzZSBpZiAoKytfX2JlZyAhPSBfX2VuZCkKKwkgIHsKKwkgICAgY2hhciBfX2Zvcm1hdDsKKwkgICAgY2hhciBfX21vZCA9IDA7CisJICAgIGNvbnN0IGNoYXIgX19jID0gX19jdHlwZS5uYXJyb3coKl9fYmVnLCAwKTsKKwkgICAgaWYgKF9fYyAhPSAnRScgJiYgX19jICE9ICdPJykKKwkgICAgICBfX2Zvcm1hdCA9IF9fYzsKKwkgICAgZWxzZSBpZiAoKytfX2JlZyAhPSBfX2VuZCkKKwkgICAgICB7CisJCV9fbW9kID0gX19jOworCQlfX2Zvcm1hdCA9IF9fY3R5cGUubmFycm93KCpfX2JlZywgMCk7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgYnJlYWs7CisJICAgIF9fcyA9IHRoaXMtPmRvX3B1dChfX3MsIF9faW8sIF9fZmlsbCwgX190bSwgX19mb3JtYXQsIF9fbW9kKTsKKwkgIH0KKwllbHNlCisJICBicmVhazsKKyAgICAgIHJldHVybiBfX3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgX091dEl0ZXIKKyAgICB0aW1lX3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6CisgICAgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUsIGNvbnN0IHRtKiBfX3RtLAorCSAgIGNoYXIgX19mb3JtYXQsIGNoYXIgX19tb2QpIGNvbnN0CisgICAgeworICAgICAgY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisgICAgICBjdHlwZTxfQ2hhclQ+IGNvbnN0JiBfX2N0eXBlID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYyk7CisgICAgICBfX3RpbWVwdW5jdDxfQ2hhclQ+IGNvbnN0JiBfX3RwID0gdXNlX2ZhY2V0PF9fdGltZXB1bmN0PF9DaGFyVD4gPihfX2xvYyk7CisKKyAgICAgIC8vIE5COiBUaGlzIHNpemUgaXMgYXJiaXRyYXJ5LiBTaG91bGQgdGhpcyBiZSBhIGRhdGEgbWVtYmVyLAorICAgICAgLy8gaW5pdGlhbGl6ZWQgYXQgY29uc3RydWN0aW9uPworICAgICAgY29uc3Qgc2l6ZV90IF9fbWF4bGVuID0gMTI4OworICAgICAgY2hhcl90eXBlIF9fcmVzW19fbWF4bGVuXTsKKworICAgICAgLy8gTkI6IEluIElFRSAxMDAzLjEtMjAweCwgYW5kIHBlcmhhcHMgb3RoZXIgbG9jYWxlIG1vZGVscywgaXQKKyAgICAgIC8vIGlzIHBvc3NpYmxlIHRoYXQgdGhlIGZvcm1hdCBjaGFyYWN0ZXIgd2lsbCBiZSBsb25nZXIgdGhhbiBvbmUKKyAgICAgIC8vIGNoYXJhY3Rlci4gUG9zc2liaWxpdGllcyBpbmNsdWRlICdFJyBvciAnTycgZm9sbG93ZWQgYnkgYQorICAgICAgLy8gZm9ybWF0IGNoYXJhY3RlcjogaWYgX19tb2QgaXMgbm90IHRoZSBkZWZhdWx0IGFyZ3VtZW50LCBhc3N1bWUKKyAgICAgIC8vIGl0J3MgYSB2YWxpZCBtb2RpZmllci4KKyAgICAgIGNoYXJfdHlwZSBfX2ZtdFs0XTsKKyAgICAgIF9fZm10WzBdID0gX19jdHlwZS53aWRlbignJScpOworICAgICAgaWYgKCFfX21vZCkKKwl7CisJICBfX2ZtdFsxXSA9IF9fZm9ybWF0OworCSAgX19mbXRbMl0gPSBjaGFyX3R5cGUoKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgX19mbXRbMV0gPSBfX21vZDsKKwkgIF9fZm10WzJdID0gX19mb3JtYXQ7CisJICBfX2ZtdFszXSA9IGNoYXJfdHlwZSgpOworCX0KKworICAgICAgX190cC5fTV9wdXQoX19yZXMsIF9fbWF4bGVuLCBfX2ZtdCwgX190bSk7CisKKyAgICAgIC8vIFdyaXRlIHJlc3VsdGluZywgZnVsbHktZm9ybWF0dGVkIHN0cmluZyB0byBvdXRwdXQgaXRlcmF0b3IuCisgICAgICByZXR1cm4gc3RkOjpfX3dyaXRlKF9fcywgX19yZXMsIGNoYXJfdHJhaXRzPGNoYXJfdHlwZT46Omxlbmd0aChfX3JlcykpOworICAgIH0KKworCisgIC8vIEluaGliaXQgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgZm9yIHJlcXVpcmVkIGluc3RhbnRpYXRpb25zLAorICAvLyB3aGljaCBhcmUgZGVmaW5lZCB2aWEgZXhwbGljaXQgaW5zdGFudGlhdGlvbnMgZWxzZXdoZXJlLgorI2lmIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURQorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgbW9uZXlwdW5jdDxjaGFyLCBmYWxzZT47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBtb25leXB1bmN0PGNoYXIsIHRydWU+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgZmFsc2U+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgbW9uZXlwdW5jdF9ieW5hbWU8Y2hhciwgdHJ1ZT47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBfR0xJQkNYWF9OQU1FU1BBQ0VfTERCTCBtb25leV9nZXQ8Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBfR0xJQkNYWF9OQU1FU1BBQ0VfTERCTCBtb25leV9wdXQ8Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBfX3RpbWVwdW5jdDxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIHRpbWVfcHV0PGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgdGltZV9wdXRfYnluYW1lPGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgdGltZV9nZXQ8Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyB0aW1lX2dldF9ieW5hbWU8Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBtZXNzYWdlczxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIG1lc3NhZ2VzX2J5bmFtZTxjaGFyPjsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBtb25leXB1bmN0PGNoYXIsIHRydWU+JgorICAgIHVzZV9mYWNldDxtb25leXB1bmN0PGNoYXIsIHRydWU+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgbW9uZXlwdW5jdDxjaGFyLCBmYWxzZT4mCisgICAgdXNlX2ZhY2V0PG1vbmV5cHVuY3Q8Y2hhciwgZmFsc2U+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgbW9uZXlfcHV0PGNoYXI+JgorICAgIHVzZV9mYWNldDxtb25leV9wdXQ8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBtb25leV9nZXQ8Y2hhcj4mCisgICAgdXNlX2ZhY2V0PG1vbmV5X2dldDxjaGFyPiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IF9fdGltZXB1bmN0PGNoYXI+JgorICAgIHVzZV9mYWNldDxfX3RpbWVwdW5jdDxjaGFyPiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IHRpbWVfcHV0PGNoYXI+JgorICAgIHVzZV9mYWNldDx0aW1lX3B1dDxjaGFyPiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IHRpbWVfZ2V0PGNoYXI+JgorICAgIHVzZV9mYWNldDx0aW1lX2dldDxjaGFyPiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IG1lc3NhZ2VzPGNoYXI+JgorICAgIHVzZV9mYWNldDxtZXNzYWdlczxjaGFyPiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8bW9uZXlwdW5jdDxjaGFyPiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8bW9uZXlfcHV0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxtb25leV9nZXQ8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PF9fdGltZXB1bmN0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDx0aW1lX3B1dDxjaGFyPiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8dGltZV9nZXQ8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PG1lc3NhZ2VzPGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgbW9uZXlwdW5jdDx3Y2hhcl90LCBmYWxzZT47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBtb25leXB1bmN0PHdjaGFyX3QsIHRydWU+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgbW9uZXlwdW5jdF9ieW5hbWU8d2NoYXJfdCwgZmFsc2U+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgbW9uZXlwdW5jdF9ieW5hbWU8d2NoYXJfdCwgdHJ1ZT47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBfR0xJQkNYWF9OQU1FU1BBQ0VfTERCTCBtb25leV9nZXQ8d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBfR0xJQkNYWF9OQU1FU1BBQ0VfTERCTCBtb25leV9wdXQ8d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBfX3RpbWVwdW5jdDx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIHRpbWVfcHV0PHdjaGFyX3Q+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgdGltZV9wdXRfYnluYW1lPHdjaGFyX3Q+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgdGltZV9nZXQ8d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyB0aW1lX2dldF9ieW5hbWU8d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBtZXNzYWdlczx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIG1lc3NhZ2VzX2J5bmFtZTx3Y2hhcl90PjsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBtb25leXB1bmN0PHdjaGFyX3QsIHRydWU+JgorICAgIHVzZV9mYWNldDxtb25leXB1bmN0PHdjaGFyX3QsIHRydWU+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgbW9uZXlwdW5jdDx3Y2hhcl90LCBmYWxzZT4mCisgICAgdXNlX2ZhY2V0PG1vbmV5cHVuY3Q8d2NoYXJfdCwgZmFsc2U+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgbW9uZXlfcHV0PHdjaGFyX3Q+JgorICAgIHVzZV9mYWNldDxtb25leV9wdXQ8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBtb25leV9nZXQ8d2NoYXJfdD4mCisgICAgdXNlX2ZhY2V0PG1vbmV5X2dldDx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IF9fdGltZXB1bmN0PHdjaGFyX3Q+JgorICAgIHVzZV9mYWNldDxfX3RpbWVwdW5jdDx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IHRpbWVfcHV0PHdjaGFyX3Q+JgorICAgIHVzZV9mYWNldDx0aW1lX3B1dDx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IHRpbWVfZ2V0PHdjaGFyX3Q+JgorICAgIHVzZV9mYWNldDx0aW1lX2dldDx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IG1lc3NhZ2VzPHdjaGFyX3Q+JgorICAgIHVzZV9mYWNldDxtZXNzYWdlczx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8bW9uZXlwdW5jdDx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8bW9uZXlfcHV0PHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxtb25leV9nZXQ8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PF9fdGltZXB1bmN0PHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDx0aW1lX3B1dDx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8dGltZV9nZXQ8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PG1lc3NhZ2VzPHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisjZW5kaWYKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9sb2NhbGVmd2QuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9sb2NhbGVmd2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTA2ZGMxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL2xvY2FsZWZ3ZC5oCkBAIC0wLDAgKzEsMTkwIEBACisvLyA8bG9jYWxlPiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9sb2NhbGVmd2QuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2xvY2FsZX0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjIuMSAgTG9jYWxlcworLy8KKworI2lmbmRlZiBfTE9DQUxFX0ZXRF9ICisjZGVmaW5lIF9MT0NBTEVfRldEX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvYysrbG9jYWxlLmg+ICAvLyBEZWZpbmVzIF9fY19sb2NhbGUsIGNvbmZpZy1zcGVjaWZpYyBpbmNsdWRlCisjaW5jbHVkZSA8aW9zZndkPiAgICAgICAgICAgIC8vIEZvciBvc3RyZWFtYnVmX2l0ZXJhdG9yLCBpc3RyZWFtYnVmX2l0ZXJhdG9yCisjaW5jbHVkZSA8Y2N0eXBlPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqIAorICAgKiAgQGRlZmdyb3VwIGxvY2FsZXMgTG9jYWxlcworICAgKgorICAgKiAgQ2xhc3NlcyBhbmQgZnVuY3Rpb25zIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgbG9jYWxpemF0aW9uLgorICAgKi8KKworICAvLyAyMi4xLjEgTG9jYWxlCisgIGNsYXNzIGxvY2FsZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRmFjZXQ+CisgICAgYm9vbAorICAgIGhhc19mYWNldChjb25zdCBsb2NhbGUmKSB0aHJvdygpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4KKyAgICBjb25zdCBfRmFjZXQmCisgICAgdXNlX2ZhY2V0KGNvbnN0IGxvY2FsZSYpOworCisgIC8vIDIyLjEuMyBDb252ZW5pZW5jZSBpbnRlcmZhY2VzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBib29sCisgICAgaXNzcGFjZShfQ2hhclQsIGNvbnN0IGxvY2FsZSYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBib29sCisgICAgaXNwcmludChfQ2hhclQsIGNvbnN0IGxvY2FsZSYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBib29sCisgICAgaXNjbnRybChfQ2hhclQsIGNvbnN0IGxvY2FsZSYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBib29sCisgICAgaXN1cHBlcihfQ2hhclQsIGNvbnN0IGxvY2FsZSYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBib29sCisgICAgaXNsb3dlcihfQ2hhclQsIGNvbnN0IGxvY2FsZSYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBib29sCisgICAgaXNhbHBoYShfQ2hhclQsIGNvbnN0IGxvY2FsZSYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBib29sCisgICAgaXNkaWdpdChfQ2hhclQsIGNvbnN0IGxvY2FsZSYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBib29sCisgICAgaXNwdW5jdChfQ2hhclQsIGNvbnN0IGxvY2FsZSYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBib29sCisgICAgaXN4ZGlnaXQoX0NoYXJULCBjb25zdCBsb2NhbGUmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgYm9vbAorICAgIGlzYWxudW0oX0NoYXJULCBjb25zdCBsb2NhbGUmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgYm9vbAorICAgIGlzZ3JhcGgoX0NoYXJULCBjb25zdCBsb2NhbGUmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgX0NoYXJUCisgICAgdG91cHBlcihfQ2hhclQsIGNvbnN0IGxvY2FsZSYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBfQ2hhclQKKyAgICB0b2xvd2VyKF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CisKKyAgLy8gMjIuMi4xIGFuZCAyMi4yLjEuMyBjdHlwZQorICBjbGFzcyBjdHlwZV9iYXNlOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY2xhc3MgY3R5cGU7CisgIHRlbXBsYXRlPD4gY2xhc3MgY3R5cGU8Y2hhcj47CisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdGVtcGxhdGU8PiBjbGFzcyBjdHlwZTx3Y2hhcl90PjsKKyNlbmRpZgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY2xhc3MgY3R5cGVfYnluYW1lOworICAvLyBOQjogU3BlY2lhbGl6ZWQgZm9yIGNoYXIgYW5kIHdjaGFyX3QgaW4gbG9jYWxlX2ZhY2V0cy5oLgorCisgIGNsYXNzIGNvZGVjdnRfYmFzZTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVyblQsIHR5cGVuYW1lIF9FeHRlcm5ULCB0eXBlbmFtZSBfU3RhdGVUPgorICAgIGNsYXNzIGNvZGVjdnQ7CisgIHRlbXBsYXRlPD4gY2xhc3MgY29kZWN2dDxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+OworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHRlbXBsYXRlPD4gY2xhc3MgY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+OworI2VuZGlmCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlcm5ULCB0eXBlbmFtZSBfRXh0ZXJuVCwgdHlwZW5hbWUgX1N0YXRlVD4KKyAgICBjbGFzcyBjb2RlY3Z0X2J5bmFtZTsKKworICAvLyAyMi4yLjIgYW5kIDIyLjIuMyBudW1lcmljCitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfTERCTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXIgPSBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gPgorICAgIGNsYXNzIG51bV9nZXQ7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXIgPSBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gPgorICAgIGNsYXNzIG51bV9wdXQ7CitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0xEQkwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPiBjbGFzcyBudW1wdW5jdDsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPiBjbGFzcyBudW1wdW5jdF9ieW5hbWU7CisKKyAgLy8gMjIuMi40IGNvbGxhdGlvbgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY2xhc3MgY29sbGF0ZTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPiBjbGFzcworICAgIGNvbGxhdGVfYnluYW1lOworCisgIC8vIDIyLjIuNSBkYXRlIGFuZCB0aW1lCisgIGNsYXNzIHRpbWVfYmFzZTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyID0gIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+CisgICAgY2xhc3MgdGltZV9nZXQ7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlciA9ICBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gPgorICAgIGNsYXNzIHRpbWVfZ2V0X2J5bmFtZTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlciA9IG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+CisgICAgY2xhc3MgdGltZV9wdXQ7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXIgPSBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gPgorICAgIGNsYXNzIHRpbWVfcHV0X2J5bmFtZTsKKworICAvLyAyMi4yLjYgbW9uZXkKKyAgY2xhc3MgbW9uZXlfYmFzZTsKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9MREJMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlciA9ICBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gPgorICAgIGNsYXNzIG1vbmV5X2dldDsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlciA9IG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+CisgICAgY2xhc3MgbW9uZXlfcHV0OworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9MREJMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgYm9vbCBfSW50bCA9IGZhbHNlPgorICAgIGNsYXNzIG1vbmV5cHVuY3Q7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgYm9vbCBfSW50bCA9IGZhbHNlPgorICAgIGNsYXNzIG1vbmV5cHVuY3RfYnluYW1lOworCisgIC8vIDIyLjIuNyBtZXNzYWdlIHJldHJpZXZhbAorICBjbGFzcyBtZXNzYWdlc19iYXNlOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY2xhc3MgbWVzc2FnZXM7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBjbGFzcyBtZXNzYWdlc19ieW5hbWU7CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL21hc2tfYXJyYXkuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9tYXNrX2FycmF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNiZWE4YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9tYXNrX2FycmF5LmgKQEAgLTAsMCArMSwyMDggQEAKKy8vIFRoZSB0ZW1wbGF0ZSBhbmQgaW5saW5lcyBmb3IgdGhlIC0qLSBDKysgLSotIG1hc2tfYXJyYXkgY2xhc3MuCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL21hc2tfYXJyYXkuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3ZhbGFycmF5fQorICovCisKKy8vIFdyaXR0ZW4gYnkgR2FicmllbCBEb3MgUmVpcyA8R2FicmllbC5Eb3MtUmVpc0BEUFRNYXRocy5FTlMtQ2FjaGFuLkZyPgorCisjaWZuZGVmIF9NQVNLX0FSUkFZX0gKKyNkZWZpbmUgX01BU0tfQVJSQVlfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBudW1lcmljX2FycmF5cworICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogIEBicmllZiAgUmVmZXJlbmNlIHRvIHNlbGVjdGVkIHN1YnNldCBvZiBhbiBhcnJheS4KKyAgICoKKyAgICogIEEgbWFza19hcnJheSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgYWN0dWFsIGVsZW1lbnRzIG9mIGFuIGFycmF5IHNwZWNpZmllZAorICAgKiAgYnkgYSBiaXRtYXNrIGluIHRoZSBmb3JtIG9mIGFuIGFycmF5IG9mIGJvb2wuICBUaGUgd2F5IHRvIGdldCBhCisgICAqICBtYXNrX2FycmF5IGlzIHRvIGNhbGwgb3BlcmF0b3JbXSh2YWxhcnJheTxib29sPikgb24gYSB2YWxhcnJheS4gIFRoZQorICAgKiAgcmV0dXJuZWQgbWFza19hcnJheSB0aGVuIHBlcm1pdHMgY2Fycnlpbmcgb3BlcmF0aW9ucyBvdXQgb24gdGhlCisgICAqICByZWZlcmVuY2VkIHN1YnNldCBvZiBlbGVtZW50cyBpbiB0aGUgb3JpZ2luYWwgdmFsYXJyYXkuCisgICAqCisgICAqICBGb3IgZXhhbXBsZSwgaWYgYSBtYXNrX2FycmF5IGlzIG9idGFpbmVkIHVzaW5nIHRoZSBhcnJheSAoZmFsc2UsIHRydWUsCisgICAqICBmYWxzZSwgdHJ1ZSkgYXMgYW4gYXJndW1lbnQsIHRoZSBtYXNrIGFycmF5IGhhcyB0d28gZWxlbWVudHMgcmVmZXJyaW5nCisgICAqICB0byBhcnJheVsxXSBhbmQgYXJyYXlbM10gaW4gdGhlIHVuZGVybHlpbmcgYXJyYXkuCisgICAqCisgICAqICBAcGFyYW0gIFRwICBFbGVtZW50IHR5cGUuCisgICAqLworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIGNsYXNzIG1hc2tfYXJyYXkKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjUzLiB2YWxhcnJheSBoZWxwZXIgZnVuY3Rpb25zIGFyZSBhbG1vc3QgZW50aXJlbHkgdXNlbGVzcworCisgICAgICAvLy8gIENvcHkgY29uc3RydWN0b3IuICBCb3RoIHNsaWNlcyByZWZlciB0byB0aGUgc2FtZSB1bmRlcmx5aW5nIGFycmF5LgorICAgICAgbWFza19hcnJheSAoY29uc3QgbWFza19hcnJheSYpOworICAgICAgCisgICAgICAvLy8gIEFzc2lnbm1lbnQgb3BlcmF0b3IuICBBc3NpZ25zIGVsZW1lbnRzIHRvIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMKKyAgICAgIC8vLyAgb2YgQGEgYS4KKyAgICAgIG1hc2tfYXJyYXkmIG9wZXJhdG9yPShjb25zdCBtYXNrX2FycmF5Jik7CisKKyAgICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTXVsdGlwbHkgc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcio9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgRGl2aWRlIHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3IvPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIE1vZHVsbyBzbGljZSBlbGVtZW50cyBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yJT0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBBZGQgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2IHRvIHNsaWNlIGVsZW1lbnRzLgorICAgICAgdm9pZCBvcGVyYXRvcis9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgU3VidHJhY3QgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2IGZyb20gc2xpY2UgZWxlbWVudHMuCisgICAgICB2b2lkIG9wZXJhdG9yLT0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBMb2dpY2FsIHhvciBzbGljZSBlbGVtZW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3JePShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIExvZ2ljYWwgYW5kIHNsaWNlIGVsZW1lbnRzIHdpdGggY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvciY9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTG9naWNhbCBvciBzbGljZSBlbGVtZW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3J8PShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIExlZnQgc2hpZnQgc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcjw8PShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIFJpZ2h0IHNoaWZ0IHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3I+Pj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBBc3NpZ24gYWxsIHNsaWNlIGVsZW1lbnRzIHRvIEBhIHQuCisgICAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBfVHAmKSBjb25zdDsKKworICAgICAgICAvLyAgICAgICAgfm1hc2tfYXJyYXkgKCk7CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IF9FeHByPF9Eb20sX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvcio9KGNvbnN0IF9FeHByPF9Eb20sX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvci89KGNvbnN0IF9FeHByPF9Eb20sX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvciU9KGNvbnN0IF9FeHByPF9Eb20sX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvcis9KGNvbnN0IF9FeHByPF9Eb20sX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvci09KGNvbnN0IF9FeHByPF9Eb20sX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvcl49KGNvbnN0IF9FeHByPF9Eb20sX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvciY9KGNvbnN0IF9FeHByPF9Eb20sX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvcnw9KGNvbnN0IF9FeHByPF9Eb20sX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvcjw8PShjb25zdCBfRXhwcjxfRG9tLF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3I+Pj0oY29uc3QgX0V4cHI8X0RvbSxfVHA+JikgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgbWFza19hcnJheShfQXJyYXk8X1RwPiwgc2l6ZV90LCBfQXJyYXk8Ym9vbD4pOworICAgICAgZnJpZW5kIGNsYXNzIHZhbGFycmF5PF9UcD47CisKKyAgICAgIGNvbnN0IHNpemVfdCAgICAgICBfTV9zejsKKyAgICAgIGNvbnN0IF9BcnJheTxib29sPiBfTV9tYXNrOworICAgICAgY29uc3QgX0FycmF5PF9UcD4gIF9NX2FycmF5OworCisgICAgICAvLyBub3QgaW1wbGVtZW50ZWQKKyAgICAgIG1hc2tfYXJyYXkoKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgbWFza19hcnJheTxfVHA+OjptYXNrX2FycmF5KGNvbnN0IG1hc2tfYXJyYXk8X1RwPiYgYSkKKyAgICA6IF9NX3N6KGEuX01fc3opLCBfTV9tYXNrKGEuX01fbWFzayksIF9NX2FycmF5KGEuX01fYXJyYXkpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIG1hc2tfYXJyYXk8X1RwPjo6bWFza19hcnJheShfQXJyYXk8X1RwPiBfX2EsIHNpemVfdCBfX3MsIF9BcnJheTxib29sPiBfX20pCisgICAgOiBfTV9zeihfX3MpLCBfTV9tYXNrKF9fbSksIF9NX2FycmF5KF9fYSkge30KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIG1hc2tfYXJyYXk8X1RwPiYKKyAgICBtYXNrX2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBtYXNrX2FycmF5PF9UcD4mIF9fYSkKKyAgICB7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfY29weShfX2EuX01fYXJyYXksIF9fYS5fTV9tYXNrLAorCQkJICAgX01fc3osIF9NX2FycmF5LCBfTV9tYXNrKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgbWFza19hcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfZmlsbChfTV9hcnJheSwgX01fc3osIF9NX21hc2ssIF9fdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBtYXNrX2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YpIGNvbnN0CisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weShfQXJyYXk8X1RwPihfX3YpLCBfX3Yuc2l6ZSgpLCBfTV9hcnJheSwgX01fbWFzayk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdGVtcGxhdGU8Y2xhc3MgX0V4PgorICAgICAgaW5saW5lIHZvaWQKKyAgICAgIG1hc2tfYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IF9FeHByPF9FeCwgX1RwPiYgX19lKSBjb25zdAorICAgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weShfX2UsIF9fZS5zaXplKCksIF9NX2FycmF5LCBfTV9tYXNrKTsgfQorCisjdW5kZWYgX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUgorI2RlZmluZSBfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKF9PcCwgX05hbWUpCQkJCVwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgkJCQkJCVwKKyAgICBpbmxpbmUgdm9pZAkJCQkJCQkJXAorICAgIG1hc2tfYXJyYXk8X1RwPjo6b3BlcmF0b3IgX09wIyM9KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdikgY29uc3QJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBfQXJyYXlfYXVnbWVudGVkXyMjX05hbWUoX01fYXJyYXksIF9NX21hc2ssCQkJXAorCQkJICAgICAgIF9BcnJheTxfVHA+KF9fdiksIF9fdi5zaXplKCkpOwkJXAorICAgIH0JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4JCQkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbmxpbmUgdm9pZAkJCQkJCQlcCisgICAgICBtYXNrX2FycmF5PF9UcD46Om9wZXJhdG9yIF9PcCMjPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JiBfX2UpIGNvbnN0XAorICAgICAgewkJCQkJCQkJCVwKKwlfQXJyYXlfYXVnbWVudGVkXyMjX05hbWUoX01fYXJyYXksIF9NX21hc2ssIF9fZSwgX19lLnNpemUoKSk7ICAgXAorICAgICAgfQorCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKCosIF9fbXVsdGlwbGllcykKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoLywgX19kaXZpZGVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUiglLCBfX21vZHVsdXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKCssIF9fcGx1cykKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoLSwgX19taW51cykKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoXiwgX19iaXR3aXNlX3hvcikKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoJiwgX19iaXR3aXNlX2FuZCkKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IofCwgX19iaXR3aXNlX29yKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUig8PCwgX19zaGlmdF9sZWZ0KQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUig+PiwgX19zaGlmdF9yaWdodCkKKworI3VuZGVmIF9ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IKKworICAvLyBAfSBncm91cCBudW1lcmljX2FycmF5cworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfTUFTS19BUlJBWV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvbWVtb3J5ZndkLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvbWVtb3J5ZndkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4NTk3MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9tZW1vcnlmd2QuaApAQCAtMCwwICsxLDc4IEBACisvLyA8bWVtb3J5PiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL21lbW9yeWZ3ZC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bWVtb3J5fQorICovCisKKyNpZm5kZWYgX01FTU9SWUZXRF9ICisjZGVmaW5lIF9NRU1PUllGV0RfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGRlZmdyb3VwIGFsbG9jYXRvcnMgQWxsb2NhdG9ycworICAgKiBAaW5ncm91cCBtZW1vcnkKKyAgICoKKyAgICogQ2xhc3NlcyBlbmNhcHN1bGF0aW5nIG1lbW9yeSBvcGVyYXRpb25zLgorICAgKgorICAgKiBAeworICAgKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBjbGFzcyBhbGxvY2F0b3I7CisKKyAgdGVtcGxhdGU8PgorICAgIGNsYXNzIGFsbG9jYXRvcjx2b2lkPjsKKworICAvLy8gRGVjbGFyZSB1c2VzX2FsbG9jYXRvciBzbyBpdCBjYW4gYmUgc3BlY2lhbGl6ZWQgaW4gXDxxdWV1ZVw+IGV0Yy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPgorICAgIHN0cnVjdCB1c2VzX2FsbG9jYXRvcjsKKworICAvLy8gQH0gZ3JvdXAgbWVtb3J5CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL21vdmUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9tb3ZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI2YzYxZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9tb3ZlLmgKQEAgLTAsMCArMSwxOTggQEAKKy8vIE1vdmUsIGZvcndhcmQgYW5kIGlkZW50aXR5IGZvciBDKysweCArIHN3YXAgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvbW92ZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dXRpbGl0eX0KKyAqLworCisjaWZuZGVmIF9NT1ZFX0gKKyNkZWZpbmUgX01PVkVfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gVXNlZCwgaW4gQysrMDMgbW9kZSB0b28sIGJ5IGFsbG9jYXRvcnMsIGV0Yy4KKyAgLyoqCisgICAqICBAYnJpZWYgU2FtZSBhcyBDKysxMSBzdGQ6OmFkZHJlc3NvZgorICAgKiAgQGluZ3JvdXAgdXRpbGl0aWVzCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcCoKKyAgICBfX2FkZHJlc3NvZihfVHAmIF9fcikgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxfVHAqPgorCSgmY29uc3RfY2FzdDxjaGFyJj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2xhdGlsZSBjaGFyJj4oX19yKSkpOworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPiAvLyBCcmluZ3MgaW4gc3RkOjpkZWNsdmFsIHRvby4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGFkZHRvZ3JvdXAgdXRpbGl0aWVzCisgICAqICBAeworICAgKi8KKworICAvKioKKyAgICogIEBicmllZiAgRm9yd2FyZCBhbiBsdmFsdWUuCisgICAqICBAcmV0dXJuIFRoZSBwYXJhbWV0ZXIgY2FzdCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICAqCisgICAqICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW1wbGVtZW50ICJwZXJmZWN0IGZvcndhcmRpbmciLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciBfVHAmJgorICAgIGZvcndhcmQodHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPF9UcD46OnR5cGUmIF9fdCkgbm9leGNlcHQKKyAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfVHAmJj4oX190KTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBGb3J3YXJkIGFuIHJ2YWx1ZS4KKyAgICogIEByZXR1cm4gVGhlIHBhcmFtZXRlciBjYXN0IHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICoKKyAgICogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbXBsZW1lbnQgInBlcmZlY3QgZm9yd2FyZGluZyIuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIF9UcCYmCisgICAgZm9yd2FyZCh0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZSYmIF9fdCkgbm9leGNlcHQKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX2x2YWx1ZV9yZWZlcmVuY2U8X1RwPjo6dmFsdWUsICJ0ZW1wbGF0ZSBhcmd1bWVudCIKKwkJICAgICIgc3Vic3RpdHV0aW5nIF9UcCBpcyBhbiBsdmFsdWUgcmVmZXJlbmNlIHR5cGUiKTsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxfVHAmJj4oX190KTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbnZlcnQgYSB2YWx1ZSB0byBhbiBydmFsdWUuCisgICAqICBAcGFyYW0gIF9fdCAgQSB0aGluZyBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEByZXR1cm4gVGhlIHBhcmFtZXRlciBjYXN0IHRvIGFuIHJ2YWx1ZS1yZWZlcmVuY2UgdG8gYWxsb3cgbW92aW5nIGl0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlJiYKKyAgICBtb3ZlKF9UcCYmIF9fdCkgbm9leGNlcHQKKyAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZSYmPihfX3QpOyB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fbW92ZV9pZl9ub2V4Y2VwdF9jb25kCisgICAgOiBwdWJsaWMgX19hbmRfPF9fbm90Xzxpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxfVHA+PiwKKyAgICAgICAgICAgICAgICAgICAgaXNfY29weV9jb25zdHJ1Y3RpYmxlPF9UcD4+Ojp0eXBlIHsgfTsKKworICAvKioKKyAgICogIEBicmllZiAgQ29uZGl0aW9uYWxseSBjb252ZXJ0IGEgdmFsdWUgdG8gYW4gcnZhbHVlLgorICAgKiAgQHBhcmFtICBfX3ggIEEgdGhpbmcgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqICBAcmV0dXJuIFRoZSBwYXJhbWV0ZXIsIHBvc3NpYmx5IGNhc3QgdG8gYW4gcnZhbHVlLXJlZmVyZW5jZS4KKyAgICoKKyAgICogIFNhbWUgYXMgc3RkOjptb3ZlIHVubGVzcyB0aGUgdHlwZSdzIG1vdmUgY29uc3RydWN0b3IgY291bGQgdGhyb3cgYW5kIHRoZQorICAgKiAgdHlwZSBpcyBjb3B5YWJsZSwgaW4gd2hpY2ggY2FzZSBhbiBsdmFsdWUtcmVmZXJlbmNlIGlzIHJldHVybmVkIGluc3RlYWQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbnN0ZXhwciB0eXBlbmFtZQorICAgIGNvbmRpdGlvbmFsPF9fbW92ZV9pZl9ub2V4Y2VwdF9jb25kPF9UcD46OnZhbHVlLCBjb25zdCBfVHAmLCBfVHAmJj46OnR5cGUKKyAgICBtb3ZlX2lmX25vZXhjZXB0KF9UcCYgX194KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIHN0ZDo6bW92ZShfX3gpOyB9CisKKyAgLy8gZGVjbHZhbCwgZnJvbSB0eXBlX3RyYWl0cy4KKworICAvKioKKyAgICogIEBicmllZiBSZXR1cm5zIHRoZSBhY3R1YWwgYWRkcmVzcyBvZiB0aGUgb2JqZWN0IG9yIGZ1bmN0aW9uCisgICAqICAgICAgICAgcmVmZXJlbmNlZCBieSByLCBldmVuIGluIHRoZSBwcmVzZW5jZSBvZiBhbiBvdmVybG9hZGVkCisgICAqICAgICAgICAgb3BlcmF0b3ImLgorICAgKiAgQHBhcmFtICBfX3IgIFJlZmVyZW5jZSB0byBhbiBvYmplY3Qgb3IgZnVuY3Rpb24uCisgICAqICBAcmV0dXJuICAgVGhlIGFjdHVhbCBhZGRyZXNzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcCoKKyAgICBhZGRyZXNzb2YoX1RwJiBfX3IpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3IpOyB9CisKKyAgLy8vIEB9IGdyb3VwIHV0aWxpdGllcworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZGVmaW5lIF9HTElCQ1hYX01PVkUoX192YWwpIHN0ZDo6bW92ZShfX3ZhbCkKKyNkZWZpbmUgX0dMSUJDWFhfRk9SV0FSRChfVHAsIF9fdmFsKSBzdGQ6OmZvcndhcmQ8X1RwPihfX3ZhbCkKKyNlbHNlCisjZGVmaW5lIF9HTElCQ1hYX01PVkUoX192YWwpIChfX3ZhbCkKKyNkZWZpbmUgX0dMSUJDWFhfRk9SV0FSRChfVHAsIF9fdmFsKSAoX192YWwpCisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGFkZHRvZ3JvdXAgdXRpbGl0aWVzCisgICAqICBAeworICAgKi8KKworICAvKioKKyAgICogIEBicmllZiBTd2FwcyB0d28gdmFsdWVzLgorICAgKiAgQHBhcmFtICBfX2EgIEEgdGhpbmcgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqICBAcGFyYW0gIF9fYiAgQW5vdGhlciB0aGluZyBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEByZXR1cm4gICBOb3RoaW5nLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKF9UcCYgX19hLCBfVHAmIF9fYikKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgbm9leGNlcHQoX19hbmRfPGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPF9UcD4sCisJICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8X1RwPj46OnZhbHVlKQorI2VuZGlmCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfU0dJQXNzaWduYWJsZUNvbmNlcHQ8X1RwPikKKworICAgICAgX1RwIF9fdG1wID0gX0dMSUJDWFhfTU9WRShfX2EpOworICAgICAgX19hID0gX0dMSUJDWFhfTU9WRShfX2IpOworICAgICAgX19iID0gX0dMSUJDWFhfTU9WRShfX3RtcCk7CisgICAgfQorCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gRFIgODA5LiBzdGQ6OnN3YXAgc2hvdWxkIGJlIG92ZXJsb2FkZWQgZm9yIGFycmF5IHR5cGVzLgorICAvLy8gU3dhcCB0aGUgY29udGVudHMgb2YgdHdvIGFycmF5cy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzaXplX3QgX05tPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfVHAgKCZfX2EpW19ObV0sIF9UcCAoJl9fYilbX05tXSkKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgbm9leGNlcHQobm9leGNlcHQoc3dhcCgqX19hLCAqX19iKSkpCisjZW5kaWYKKyAgICB7CisgICAgICBmb3IgKHNpemVfdCBfX24gPSAwOyBfX24gPCBfTm07ICsrX19uKQorCXN3YXAoX19hW19fbl0sIF9fYltfX25dKTsKKyAgICB9CisKKyAgLy8vIEB9IGdyb3VwIHV0aWxpdGllcworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX01PVkVfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL25lc3RlZF9leGNlcHRpb24uaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9uZXN0ZWRfZXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhNWQwZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9uZXN0ZWRfZXhjZXB0aW9uLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8vIE5lc3RlZCBFeGNlcHRpb24gc3VwcG9ydCBoZWFkZXIgKG5lc3RlZF9leGNlcHRpb24gY2xhc3MpIGZvciAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9uZXN0ZWRfZXhjZXB0aW9uLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtleGNlcHRpb259CisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ORVNURURfRVhDRVBUSU9OX0gKKyNkZWZpbmUgX0dMSUJDWFhfTkVTVEVEX0VYQ0VQVElPTl9IIDEKKworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwdXNoKGRlZmF1bHQpCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworI2lmIEFUT01JQ19JTlRfTE9DS19GUkVFIDwgMgorIyAgZXJyb3IgVGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IGV4Y2VwdGlvbiBwcm9wYWdhdGlvbi4KKyNlbmRpZgorCitleHRlcm4gIkMrKyIgeworCituYW1lc3BhY2Ugc3RkCit7CisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBleGNlcHRpb25zCisgICAqIEB7CisgICAqLworCisgIC8vLyBFeGNlcHRpb24gY2xhc3Mgd2l0aCBleGNlcHRpb25fcHRyIGRhdGEgbWVtYmVyLgorICBjbGFzcyBuZXN0ZWRfZXhjZXB0aW9uCisgIHsKKyAgICBleGNlcHRpb25fcHRyIF9NX3B0cjsKKworICBwdWJsaWM6CisgICAgbmVzdGVkX2V4Y2VwdGlvbigpIG5vZXhjZXB0IDogX01fcHRyKGN1cnJlbnRfZXhjZXB0aW9uKCkpIHsgfQorCisgICAgbmVzdGVkX2V4Y2VwdGlvbihjb25zdCBuZXN0ZWRfZXhjZXB0aW9uJikgPSBkZWZhdWx0OworCisgICAgbmVzdGVkX2V4Y2VwdGlvbiYgb3BlcmF0b3I9KGNvbnN0IG5lc3RlZF9leGNlcHRpb24mKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIH5uZXN0ZWRfZXhjZXB0aW9uKCkgbm9leGNlcHQ7CisKKyAgICB2b2lkCisgICAgcmV0aHJvd19uZXN0ZWQoKSBjb25zdCBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSkKKyAgICB7IHJldGhyb3dfZXhjZXB0aW9uKF9NX3B0cik7IH0KKworICAgIGV4Y2VwdGlvbl9wdHIKKyAgICBuZXN0ZWRfcHRyKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9wdHI7IH0KKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXhjZXB0PgorICAgIHN0cnVjdCBfTmVzdGVkX2V4Y2VwdGlvbiA6IHB1YmxpYyBfRXhjZXB0LCBwdWJsaWMgbmVzdGVkX2V4Y2VwdGlvbgorICAgIHsKKyAgICAgIGV4cGxpY2l0IF9OZXN0ZWRfZXhjZXB0aW9uKF9FeGNlcHQmJiBfX2V4KQorICAgICAgOiBfRXhjZXB0KHN0YXRpY19jYXN0PF9FeGNlcHQmJj4oX19leCkpCisgICAgICB7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9FeD4KKyAgICBzdHJ1Y3QgX19nZXRfbmVzdGVkX2hlbHBlcgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCBuZXN0ZWRfZXhjZXB0aW9uKgorICAgICAgX1NfZ2V0KGNvbnN0IF9FeCYgX19leCkKKyAgICAgIHsgcmV0dXJuIGR5bmFtaWNfY2FzdDxjb25zdCBuZXN0ZWRfZXhjZXB0aW9uKj4oJl9fZXgpOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXg+CisgICAgc3RydWN0IF9fZ2V0X25lc3RlZF9oZWxwZXI8X0V4Kj4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgbmVzdGVkX2V4Y2VwdGlvbioKKyAgICAgIF9TX2dldChjb25zdCBfRXgqIF9fZXgpCisgICAgICB7IHJldHVybiBkeW5hbWljX2Nhc3Q8Y29uc3QgbmVzdGVkX2V4Y2VwdGlvbio+KF9fZXgpOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXg+CisgICAgaW5saW5lIGNvbnN0IG5lc3RlZF9leGNlcHRpb24qCisgICAgX19nZXRfbmVzdGVkX2V4Y2VwdGlvbihjb25zdCBfRXgmIF9fZXgpCisgICAgeyByZXR1cm4gX19nZXRfbmVzdGVkX2hlbHBlcjxfRXg+OjpfU19nZXQoX19leCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXg+CisgICAgdm9pZAorICAgIF9fdGhyb3dfd2l0aF9uZXN0ZWQoX0V4JiYsIGNvbnN0IG5lc3RlZF9leGNlcHRpb24qID0gMCkKKyAgICBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0V4PgorICAgIHZvaWQKKyAgICBfX3Rocm93X3dpdGhfbmVzdGVkKF9FeCYmLCAuLi4pIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKworICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBuZXZlciBiZSBjYWxsZWQsIGJ1dCBpcyBuZWVkZWQgdG8gYXZvaWQgYSB3YXJuaW5nCisgIC8vIGFib3V0IGFtYmlndW91cyBiYXNlIGNsYXNzZXMgd2hlbiBpbnN0YW50aWF0aW5nIHRocm93X3dpdGhfbmVzdGVkPF9FeD4oKQorICAvLyB3aXRoIGEgdHlwZSB0aGF0IGhhcyBhbiBhY2Nlc3NpYmxlIG5lc3RlZF9leGNlcHRpb24gYmFzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0V4PgorICAgIGlubGluZSB2b2lkCisgICAgX190aHJvd193aXRoX25lc3RlZChfRXgmJiBfX2V4LCBjb25zdCBuZXN0ZWRfZXhjZXB0aW9uKikKKyAgICB7IHRocm93IF9fZXg7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXg+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3Rocm93X3dpdGhfbmVzdGVkKF9FeCYmIF9fZXgsIC4uLikKKyAgICB7IHRocm93IF9OZXN0ZWRfZXhjZXB0aW9uPF9FeD4oc3RhdGljX2Nhc3Q8X0V4JiY+KF9fZXgpKTsgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0V4PgorICAgIHZvaWQKKyAgICB0aHJvd193aXRoX25lc3RlZChfRXggX19leCkgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworCisgIC8vLyBJZiBAcCBfX2V4IGlzIGRlcml2ZWQgZnJvbSBuZXN0ZWRfZXhjZXB0aW9uLCBAcCBfX2V4LiAKKyAgLy8vIEVsc2UsIGFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQgb2JqZWN0IGRlcml2ZWQgZnJvbSBib3RoLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXg+CisgICAgaW5saW5lIHZvaWQKKyAgICB0aHJvd193aXRoX25lc3RlZChfRXggX19leCkKKyAgICB7CisgICAgICBpZiAoX19nZXRfbmVzdGVkX2V4Y2VwdGlvbihfX2V4KSkKKyAgICAgICAgdGhyb3cgX19leDsKKyAgICAgIF9fdGhyb3dfd2l0aF9uZXN0ZWQoc3RhdGljX2Nhc3Q8X0V4JiY+KF9fZXgpLCAmX19leCk7CisgICAgfQorCisgIC8vLyBJZiBAcCBfX2V4IGlzIGRlcml2ZWQgZnJvbSBuZXN0ZWRfZXhjZXB0aW9uLCBAcCBfX2V4LnJldGhyb3dfbmVzdGVkKCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9FeD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHJldGhyb3dfaWZfbmVzdGVkKGNvbnN0IF9FeCYgX19leCkKKyAgICB7CisgICAgICBpZiAoY29uc3QgbmVzdGVkX2V4Y2VwdGlvbiogX19uZXN0ZWQgPSBfX2dldF9uZXN0ZWRfZXhjZXB0aW9uKF9fZXgpKQorICAgICAgICBfX25lc3RlZC0+cmV0aHJvd19uZXN0ZWQoKTsKKyAgICB9CisKKyAgLy8vIE92ZXJsb2FkLCBTZWUgTjI2MTkKKyAgaW5saW5lIHZvaWQKKyAgcmV0aHJvd19pZl9uZXN0ZWQoY29uc3QgbmVzdGVkX2V4Y2VwdGlvbiYgX19leCkKKyAgeyBfX2V4LnJldGhyb3dfbmVzdGVkKCk7IH0KKworICAvLyBAfSBncm91cCBleGNlcHRpb25zCit9IC8vIG5hbWVzcGFjZSBzdGQKKworfSAvLyBleHRlcm4gIkMrKyIKKworI2VuZGlmIC8vIEMrKzExCisKKyNwcmFnbWEgR0NDIHZpc2liaWxpdHkgcG9wCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9ORVNURURfRVhDRVBUSU9OX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9vc3RyZWFtLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9vc3RyZWFtLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTA0YTI1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL29zdHJlYW0udGNjCkBAIC0wLDAgKzEsNDA3IEBACisvLyBvc3RyZWFtIGNsYXNzZXMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvb3N0cmVhbS50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtvc3RyZWFtfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy42LjIgIE91dHB1dCBzdHJlYW1zCisvLworCisjaWZuZGVmIF9PU1RSRUFNX1RDQworI2RlZmluZSBfT1NUUkVBTV9UQ0MgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2N4eGFiaV9mb3JjZWQuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlbnRyeTo6CisgICAgc2VudHJ5KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcykKKyAgICA6IF9NX29rKGZhbHNlKSwgX01fb3MoX19vcykKKyAgICB7CisgICAgICAvLyBYWFggTVQKKyAgICAgIGlmIChfX29zLnRpZSgpICYmIF9fb3MuZ29vZCgpKQorCV9fb3MudGllKCktPmZsdXNoKCk7CisKKyAgICAgIGlmIChfX29zLmdvb2QoKSkKKwlfTV9vayA9IHRydWU7CisgICAgICBlbHNlCisJX19vcy5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWVUPgorICAgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICAgIF9NX2luc2VydChfVmFsdWVUIF9fdikKKyAgICAgIHsKKwlzZW50cnkgX19jZXJiKCp0aGlzKTsKKwlpZiAoX19jZXJiKQorCSAgeworCSAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworCSAgICBfX3RyeQorCSAgICAgIHsKKwkJY29uc3QgX19udW1fcHV0X3R5cGUmIF9fbnAgPSBfX2NoZWNrX2ZhY2V0KHRoaXMtPl9NX251bV9wdXQpOworCQlpZiAoX19ucC5wdXQoKnRoaXMsICp0aGlzLCB0aGlzLT5maWxsKCksIF9fdikuZmFpbGVkKCkpCisJCSAgX19lcnIgfD0gaW9zX2Jhc2U6OmJhZGJpdDsKKwkgICAgICB9CisJICAgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgICB7CisJCXRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwkJCisJCV9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICAgIH0KKwkgICAgX19jYXRjaCguLi4pCisJICAgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCSAgICBpZiAoX19lcnIpCisJICAgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworCSAgfQorCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgb3BlcmF0b3I8PChzaG9ydCBfX24pCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTE3LiBiYXNpY19vc3RyZWFtIHVzZXMgbm9uZXhpc3RlbnQgbnVtX3B1dCBtZW1iZXIgZnVuY3Rpb25zLgorICAgICAgY29uc3QgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZm10ID0gdGhpcy0+ZmxhZ3MoKSAmIGlvc19iYXNlOjpiYXNlZmllbGQ7CisgICAgICBpZiAoX19mbXQgPT0gaW9zX2Jhc2U6Om9jdCB8fCBfX2ZtdCA9PSBpb3NfYmFzZTo6aGV4KQorCXJldHVybiBfTV9pbnNlcnQoc3RhdGljX2Nhc3Q8bG9uZz4oc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KF9fbikpKTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gX01faW5zZXJ0KHN0YXRpY19jYXN0PGxvbmc+KF9fbikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgb3BlcmF0b3I8PChpbnQgX19uKQorICAgIHsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDExNy4gYmFzaWNfb3N0cmVhbSB1c2VzIG5vbmV4aXN0ZW50IG51bV9wdXQgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgICAgIGNvbnN0IGlvc19iYXNlOjpmbXRmbGFncyBfX2ZtdCA9IHRoaXMtPmZsYWdzKCkgJiBpb3NfYmFzZTo6YmFzZWZpZWxkOworICAgICAgaWYgKF9fZm10ID09IGlvc19iYXNlOjpvY3QgfHwgX19mbXQgPT0gaW9zX2Jhc2U6OmhleCkKKwlyZXR1cm4gX01faW5zZXJ0KHN0YXRpY19jYXN0PGxvbmc+KHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oX19uKSkpOworICAgICAgZWxzZQorCXJldHVybiBfTV9pbnNlcnQoc3RhdGljX2Nhc3Q8bG9uZz4oX19uKSk7CisgICAgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIG9wZXJhdG9yPDwoX19zdHJlYW1idWZfdHlwZSogX19zYmluKQorICAgIHsKKyAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzKTsKKyAgICAgIGlmIChfX2NlcmIgJiYgX19zYmluKQorCXsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBpZiAoIV9fY29weV9zdHJlYW1idWZzKF9fc2JpbiwgdGhpcy0+cmRidWYoKSkpCisJCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsJCQorCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7IH0KKwl9CisgICAgICBlbHNlIGlmICghX19zYmluKQorCV9fZXJyIHw9IGlvc19iYXNlOjpiYWRiaXQ7CisgICAgICBpZiAoX19lcnIpCisJdGhpcy0+c2V0c3RhdGUoX19lcnIpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgcHV0KGNoYXJfdHlwZSBfX2MpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgNjAuIFdoYXQgaXMgYSBmb3JtYXR0ZWQgaW5wdXQgZnVuY3Rpb24/CisgICAgICAvLyBiYXNpY19vc3RyZWFtOjpwdXQoY2hhcl90eXBlKSBpcyBhbiB1bmZvcm1hdHRlZCBvdXRwdXQgZnVuY3Rpb24uCisgICAgICAvLyBEUiA2My4gRXhjZXB0aW9uLWhhbmRsaW5nIHBvbGljeSBmb3IgdW5mb3JtYXR0ZWQgb3V0cHV0LgorICAgICAgLy8gVW5mb3JtYXR0ZWQgb3V0cHV0IGZ1bmN0aW9ucyBzaG91bGQgY2F0Y2ggZXhjZXB0aW9ucyB0aHJvd24KKyAgICAgIC8vIGZyb20gc3RyZWFtYnVmIG1lbWJlcnMuCisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBjb25zdCBpbnRfdHlwZSBfX3B1dCA9IHRoaXMtPnJkYnVmKCktPnNwdXRjKF9fYyk7CisJICAgICAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX3B1dCwgdHJhaXRzX3R5cGU6OmVvZigpKSkKKwkJX19lcnIgfD0gaW9zX2Jhc2U6OmJhZGJpdDsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CQkKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwkgIGlmIChfX2VycikKKwkgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHdyaXRlKGNvbnN0IF9DaGFyVCogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiA2MC4gV2hhdCBpcyBhIGZvcm1hdHRlZCBpbnB1dCBmdW5jdGlvbj8KKyAgICAgIC8vIGJhc2ljX29zdHJlYW06OndyaXRlKGNvbnN0IGNoYXJfdHlwZSosIHN0cmVhbXNpemUpIGlzIGFuCisgICAgICAvLyB1bmZvcm1hdHRlZCBvdXRwdXQgZnVuY3Rpb24uCisgICAgICAvLyBEUiA2My4gRXhjZXB0aW9uLWhhbmRsaW5nIHBvbGljeSBmb3IgdW5mb3JtYXR0ZWQgb3V0cHV0LgorICAgICAgLy8gVW5mb3JtYXR0ZWQgb3V0cHV0IGZ1bmN0aW9ucyBzaG91bGQgY2F0Y2ggZXhjZXB0aW9ucyB0aHJvd24KKyAgICAgIC8vIGZyb20gc3RyZWFtYnVmIG1lbWJlcnMuCisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgX190cnkKKwkgICAgeyBfTV93cml0ZShfX3MsIF9fbik7IH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwkJCisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgZmx1c2goKQorICAgIHsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDYwLiBXaGF0IGlzIGEgZm9ybWF0dGVkIGlucHV0IGZ1bmN0aW9uPworICAgICAgLy8gYmFzaWNfb3N0cmVhbTo6Zmx1c2goKSBpcyAqbm90KiBhbiB1bmZvcm1hdHRlZCBvdXRwdXQgZnVuY3Rpb24uCisgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgX190cnkKKwl7CisJICBpZiAodGhpcy0+cmRidWYoKSAmJiB0aGlzLT5yZGJ1ZigpLT5wdWJzeW5jKCkgPT0gLTEpCisJICAgIF9fZXJyIHw9IGlvc19iYXNlOjpiYWRiaXQ7CisJfQorICAgICAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCXsKKwkgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwkJCisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisgICAgICBpZiAoX19lcnIpCisJdGhpcy0+c2V0c3RhdGUoX19lcnIpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Ojpwb3NfdHlwZQorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgdGVsbHAoKQorICAgIHsKKyAgICAgIHBvc190eXBlIF9fcmV0ID0gcG9zX3R5cGUoLTEpOworICAgICAgX190cnkKKwl7CisJICBpZiAoIXRoaXMtPmZhaWwoKSkKKwkgICAgX19yZXQgPSB0aGlzLT5yZGJ1ZigpLT5wdWJzZWVrb2ZmKDAsIGlvc19iYXNlOjpjdXIsIGlvc19iYXNlOjpvdXQpOworCX0KKyAgICAgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwl7CisJICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsJCQorCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgc2Vla3AocG9zX3R5cGUgX19wb3MpCisgICAgeworICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgIF9fdHJ5CisJeworCSAgaWYgKCF0aGlzLT5mYWlsKCkpCisJICAgIHsKKwkgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAgICAgLy8gMTM2LiAgc2Vla3AsIHNlZWtnIHNldHRpbmcgd3Jvbmcgc3RyZWFtcz8KKwkgICAgICBjb25zdCBwb3NfdHlwZSBfX3AgPSB0aGlzLT5yZGJ1ZigpLT5wdWJzZWVrcG9zKF9fcG9zLAorCQkJCQkJCSAgICAgaW9zX2Jhc2U6Om91dCk7CisKKwkgICAgICAvLyAxMjkuIE5lZWQgZXJyb3IgaW5kaWNhdGlvbiBmcm9tIHNlZWtwKCkgYW5kIHNlZWtnKCkKKwkgICAgICBpZiAoX19wID09IHBvc190eXBlKG9mZl90eXBlKC0xKSkpCisJCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCSAgICB9CisJfQorICAgICAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCXsKKwkgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwkJCisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisgICAgICBpZiAoX19lcnIpCisJdGhpcy0+c2V0c3RhdGUoX19lcnIpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgc2Vla3Aob2ZmX3R5cGUgX19vZmYsIGlvc19iYXNlOjpzZWVrZGlyIF9fZGlyKQorICAgIHsKKyAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICBfX3RyeQorCXsKKwkgIGlmICghdGhpcy0+ZmFpbCgpKQorCSAgICB7CisJICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgICAgIC8vIDEzNi4gIHNlZWtwLCBzZWVrZyBzZXR0aW5nIHdyb25nIHN0cmVhbXM/CisJICAgICAgY29uc3QgcG9zX3R5cGUgX19wID0gdGhpcy0+cmRidWYoKS0+cHVic2Vla29mZihfX29mZiwgX19kaXIsCisJCQkJCQkJICAgICBpb3NfYmFzZTo6b3V0KTsKKworCSAgICAgIC8vIDEyOS4gTmVlZCBlcnJvciBpbmRpY2F0aW9uIGZyb20gc2Vla3AoKSBhbmQgc2Vla2coKQorCSAgICAgIGlmIChfX3AgPT0gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKSkKKwkJX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJICAgIH0KKwl9CisgICAgICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJeworCSAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CQkKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKyAgICAgIGlmIChfX2VycikKKwl0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3V0LCBjb25zdCBjaGFyKiBfX3MpCisgICAgeworICAgICAgaWYgKCFfX3MpCisJX19vdXQuc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgICBlbHNlCisJeworCSAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgLy8gMTY3LiAgSW1wcm9wZXIgdXNlIG9mIHRyYWl0c190eXBlOjpsZW5ndGgoKQorCSAgY29uc3Qgc2l6ZV90IF9fY2xlbiA9IGNoYXJfdHJhaXRzPGNoYXI+OjpsZW5ndGgoX19zKTsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBzdHJ1Y3QgX19wdHJfZ3VhcmQKKwkgICAgICB7CisJCV9DaGFyVCAqX19wOworCQlfX3B0cl9ndWFyZCAoX0NoYXJUICpfX2lwKTogX19wKF9faXApIHsgfQorCQl+X19wdHJfZ3VhcmQoKSB7IGRlbGV0ZVtdIF9fcDsgfQorCQlfQ2hhclQqIF9fZ2V0KCkgeyByZXR1cm4gX19wOyB9CisJICAgICAgfSBfX3BnIChuZXcgX0NoYXJUW19fY2xlbl0pOworCisJICAgICAgX0NoYXJUICpfX3dzID0gX19wZy5fX2dldCgpOworCSAgICAgIGZvciAoc2l6ZV90ICBfX2kgPSAwOyBfX2kgPCBfX2NsZW47ICsrX19pKQorCQlfX3dzW19faV0gPSBfX291dC53aWRlbihfX3NbX19pXSk7CisJICAgICAgX19vc3RyZWFtX2luc2VydChfX291dCwgX193cywgX19jbGVuKTsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgX19vdXQuX01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IF9fb3V0Ll9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJfQorICAgICAgcmV0dXJuIF9fb3V0OworICAgIH0KKworICAvLyBJbmhpYml0IGltcGxpY2l0IGluc3RhbnRpYXRpb25zIGZvciByZXF1aXJlZCBpbnN0YW50aWF0aW9ucywKKyAgLy8gd2hpY2ggYXJlIGRlZmluZWQgdmlhIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGVsc2V3aGVyZS4KKyNpZiBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX29zdHJlYW08Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBlbmRsKG9zdHJlYW0mKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIGVuZHMob3N0cmVhbSYpOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgZmx1c2gob3N0cmVhbSYpOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiwgY2hhcik7CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mLCB1bnNpZ25lZCBjaGFyKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYsIHNpZ25lZCBjaGFyKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYsIGNvbnN0IGNoYXIqKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYsIGNvbnN0IHVuc2lnbmVkIGNoYXIqKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYsIGNvbnN0IHNpZ25lZCBjaGFyKik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIG9zdHJlYW06Ol9NX2luc2VydChsb25nKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIG9zdHJlYW06Ol9NX2luc2VydCh1bnNpZ25lZCBsb25nKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIG9zdHJlYW06Ol9NX2luc2VydChib29sKTsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfTE9OR19MT05HCisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvc3RyZWFtOjpfTV9pbnNlcnQobG9uZyBsb25nKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIG9zdHJlYW06Ol9NX2luc2VydCh1bnNpZ25lZCBsb25nIGxvbmcpOworI2VuZGlmCisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvc3RyZWFtOjpfTV9pbnNlcnQoZG91YmxlKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIG9zdHJlYW06Ol9NX2luc2VydChsb25nIGRvdWJsZSk7CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvc3RyZWFtOjpfTV9pbnNlcnQoY29uc3Qgdm9pZCopOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX29zdHJlYW08d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgZW5kbCh3b3N0cmVhbSYpOworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIGVuZHMod29zdHJlYW0mKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiBmbHVzaCh3b3N0cmVhbSYpOworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIG9wZXJhdG9yPDwod29zdHJlYW0mLCB3Y2hhcl90KTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiBvcGVyYXRvcjw8KHdvc3RyZWFtJiwgY2hhcik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgb3BlcmF0b3I8PCh3b3N0cmVhbSYsIGNvbnN0IHdjaGFyX3QqKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiBvcGVyYXRvcjw8KHdvc3RyZWFtJiwgY29uc3QgY2hhciopOworCisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgd29zdHJlYW06Ol9NX2luc2VydChsb25nKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiB3b3N0cmVhbTo6X01faW5zZXJ0KHVuc2lnbmVkIGxvbmcpOworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIHdvc3RyZWFtOjpfTV9pbnNlcnQoYm9vbCk7CisjaWZkZWYgX0dMSUJDWFhfVVNFX0xPTkdfTE9ORworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIHdvc3RyZWFtOjpfTV9pbnNlcnQobG9uZyBsb25nKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiB3b3N0cmVhbTo6X01faW5zZXJ0KHVuc2lnbmVkIGxvbmcgbG9uZyk7CisjZW5kaWYKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiB3b3N0cmVhbTo6X01faW5zZXJ0KGRvdWJsZSk7CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgd29zdHJlYW06Ol9NX2luc2VydChsb25nIGRvdWJsZSk7CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgd29zdHJlYW06Ol9NX2luc2VydChjb25zdCB2b2lkKik7CisjZW5kaWYKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9vc3RyZWFtX2luc2VydC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL29zdHJlYW1faW5zZXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhMDlmYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9vc3RyZWFtX2luc2VydC5oCkBAIC0wLDAgKzEsMTI5IEBACisvLyBIZWxwZXJzIGZvciBvc3RyZWFtIGluc2VydGVycyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9vc3RyZWFtX2luc2VydC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7b3N0cmVhbX0KKyAqLworCisjaWZuZGVmIF9PU1RSRUFNX0lOU0VSVF9ICisjZGVmaW5lIF9PU1RSRUFNX0lOU0VSVF9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPGJpdHMvY3h4YWJpX2ZvcmNlZC5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSB2b2lkCisgICAgX19vc3RyZWFtX3dyaXRlKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vdXQsCisJCSAgICBjb25zdCBfQ2hhclQqIF9fcywgc3RyZWFtc2l6ZSBfX24pCisgICAgeworICAgICAgdHlwZWRlZiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gICAgICAgX19vc3RyZWFtX3R5cGU7ICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCBzdHJlYW1zaXplIF9fcHV0ID0gX19vdXQucmRidWYoKS0+c3B1dG4oX19zLCBfX24pOworICAgICAgaWYgKF9fcHV0ICE9IF9fbikKKwlfX291dC5zZXRzdGF0ZShfX2lvc19iYXNlOjpiYWRiaXQpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX29zdHJlYW1fZmlsbChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3V0LCBzdHJlYW1zaXplIF9fbikKKyAgICB7CisgICAgICB0eXBlZGVmIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgICAgICBfX29zdHJlYW1fdHlwZTsgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2MgPSBfX291dC5maWxsKCk7CisgICAgICBmb3IgKDsgX19uID4gMDsgLS1fX24pCisJeworCSAgY29uc3QgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgX19wdXQgPSBfX291dC5yZGJ1ZigpLT5zcHV0YyhfX2MpOworCSAgaWYgKF9UcmFpdHM6OmVxX2ludF90eXBlKF9fcHV0LCBfVHJhaXRzOjplb2YoKSkpCisJICAgIHsKKwkgICAgICBfX291dC5zZXRzdGF0ZShfX2lvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIF9fb3N0cmVhbV9pbnNlcnQoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX291dCwKKwkJICAgICBjb25zdCBfQ2hhclQqIF9fcywgc3RyZWFtc2l6ZSBfX24pCisgICAgeworICAgICAgdHlwZWRlZiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gICAgICAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6c2VudHJ5IF9fY2VyYihfX291dCk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBjb25zdCBzdHJlYW1zaXplIF9fdyA9IF9fb3V0LndpZHRoKCk7CisJICAgICAgaWYgKF9fdyA+IF9fbikKKwkJeworCQkgIGNvbnN0IGJvb2wgX19sZWZ0ID0gKChfX291dC5mbGFncygpCisJCQkJCSYgX19pb3NfYmFzZTo6YWRqdXN0ZmllbGQpCisJCQkJICAgICAgID09IF9faW9zX2Jhc2U6OmxlZnQpOworCQkgIGlmICghX19sZWZ0KQorCQkgICAgX19vc3RyZWFtX2ZpbGwoX19vdXQsIF9fdyAtIF9fbik7CisJCSAgaWYgKF9fb3V0Lmdvb2QoKSkKKwkJICAgIF9fb3N0cmVhbV93cml0ZShfX291dCwgX19zLCBfX24pOworCQkgIGlmIChfX2xlZnQgJiYgX19vdXQuZ29vZCgpKQorCQkgICAgX19vc3RyZWFtX2ZpbGwoX19vdXQsIF9fdyAtIF9fbik7CisJCX0KKwkgICAgICBlbHNlCisJCV9fb3N0cmVhbV93cml0ZShfX291dCwgX19zLCBfX24pOworCSAgICAgIF9fb3V0LndpZHRoKDApOworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICBfX291dC5fTV9zZXRzdGF0ZShfX2lvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyBfX291dC5fTV9zZXRzdGF0ZShfX2lvc19iYXNlOjpiYWRiaXQpOyB9CisJfQorICAgICAgcmV0dXJuIF9fb3V0OworICAgIH0KKworICAvLyBJbmhpYml0IGltcGxpY2l0IGluc3RhbnRpYXRpb25zIGZvciByZXF1aXJlZCBpbnN0YW50aWF0aW9ucywKKyAgLy8gd2hpY2ggYXJlIGRlZmluZWQgdmlhIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGVsc2V3aGVyZS4KKyNpZiBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIF9fb3N0cmVhbV9pbnNlcnQob3N0cmVhbSYsIGNvbnN0IGNoYXIqLCBzdHJlYW1zaXplKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgX19vc3RyZWFtX2luc2VydCh3b3N0cmVhbSYsIGNvbnN0IHdjaGFyX3QqLAorCQkJCQkgICAgIHN0cmVhbXNpemUpOworI2VuZGlmCisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8qIF9PU1RSRUFNX0lOU0VSVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcG9zdHlwZXMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9wb3N0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OGRmZTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcG9zdHlwZXMuaApAQCAtMCwwICsxLDI0MiBAQAorLy8gUG9zaXRpb24gdHlwZXMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvcG9zdHlwZXMuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2lvc2Z3ZH0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjcuNC4xIC0gVHlwZXMKKy8vIElTTyBDKysgMTQ4ODI6IDI3LjQuMyAtIFRlbXBsYXRlIGNsYXNzIGZwb3MKKy8vCisKKyNpZm5kZWYgX0dMSUJDWFhfUE9TVFlQRVNfSAorI2RlZmluZSBfR0xJQkNYWF9QT1NUWVBFU19IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Y3djaGFyPiAvLyBGb3IgbWJzdGF0ZV90CisKKy8vIFhYWCBJZiA8c3RkaW50Lmg+IGlzIHJlYWxseSBuZWVkZWQsIG1ha2Ugc3VyZSB0byBkZWZpbmUgdGhlIG1hY3JvcworLy8gYmVmb3JlIGluY2x1ZGluZyBpdCwgaW4gb3JkZXIgbm90IHRvIGJyZWFrIDx0cjEvY3N0ZGludD4gKGFuZCA8Y3N0ZGludD4KKy8vIGluIEMrKzB4KS4gIFJlY29uc2lkZXIgYWxsIHRoaXMgYXMgc29vbiBhcyBwb3NzaWJsZS4uLgorI2lmIChkZWZpbmVkKF9HTElCQ1hYX0hBVkVfSU5UNjRfVCkgJiYgIWRlZmluZWQoX0dMSUJDWFhfSEFWRV9JTlQ2NF9UX0xPTkcpIFwKKyAgICAgJiYgIWRlZmluZWQoX0dMSUJDWFhfSEFWRV9JTlQ2NF9UX0xPTkdfTE9ORykpCisKKyNpZm5kZWYgX19TVERDX0xJTUlUX01BQ1JPUworIyBkZWZpbmUgX1VOREVGX19TVERDX0xJTUlUX01BQ1JPUworIyBkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUworI2VuZGlmCisjaWZuZGVmIF9fU1REQ19DT05TVEFOVF9NQUNST1MKKyMgZGVmaW5lIF9VTkRFRl9fU1REQ19DT05TVEFOVF9NQUNST1MKKyMgZGVmaW5lIF9fU1REQ19DT05TVEFOVF9NQUNST1MKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGludC5oPiAvLyBGb3IgaW50NjRfdAorI2lmZGVmIF9VTkRFRl9fU1REQ19MSU1JVF9NQUNST1MKKyMgdW5kZWYgX19TVERDX0xJTUlUX01BQ1JPUworIyB1bmRlZiBfVU5ERUZfX1NURENfTElNSVRfTUFDUk9TCisjZW5kaWYKKyNpZmRlZiBfVU5ERUZfX1NURENfQ09OU1RBTlRfTUFDUk9TCisjIHVuZGVmIF9fU1REQ19DT05TVEFOVF9NQUNST1MKKyMgdW5kZWYgX1VOREVGX19TVERDX0NPTlNUQU5UX01BQ1JPUworI2VuZGlmCisKKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gVGhlIHR5cGVzIHN0cmVhbW9mZiwgc3RyZWFtcG9zIGFuZCB3c3RyZWFtcG9zIGFuZCB0aGUgY2xhc3MKKyAgLy8gdGVtcGxhdGUgZnBvczw+IGFyZSBkZXNjcmliZWQgaW4gY2xhdXNlcyAyMS4xLjIsIDIxLjEuMywgMjcuMS4yLAorICAvLyAyNy4yLCAyNy40LjEsIDI3LjQuMyBhbmQgRC42LiBEZXNwaXRlIGFsbCB0aGlzIHZlcmJpYWdlLCB0aGUKKyAgLy8gYmVoYXZpb3VyIG9mIHRoZXNlIHR5cGVzIGlzIG1vc3RseSBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIG9yCisgIC8vIHVuc3BlY2lmaWVkLiBUaGUgYmVoYXZpb3VyIGluIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgYXMgbm90ZWQKKyAgLy8gYmVsb3cuCisKKyAgLyoqCisgICAqICBAYnJpZWYgIFR5cGUgdXNlZCBieSBmcG9zLCBjaGFyX3RyYWl0czxjaGFyPiwgYW5kIGNoYXJfdHJhaXRzPHdjaGFyX3Q+LgorICAgKgorICAgKiAgSW4gY2xhdXNlcyAyMS4xLjMuMSBhbmQgMjcuNC4xIHN0cmVhbW9mZiBpcyBkZXNjcmliZWQgYXMgYW4KKyAgICogIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4KKyAgICogIE5vdGU6IEluIHZlcnNpb25zIG9mIEdDQyB1cCB0byBhbmQgaW5jbHVkaW5nIEdDQyAzLjMsIHN0cmVhbW9mZgorICAgKiAgd2FzIHR5cGVkZWYgbG9uZy4KKyAgKi8gIAorI2lmZGVmIF9HTElCQ1hYX0hBVkVfSU5UNjRfVF9MT05HCisgIHR5cGVkZWYgbG9uZyAgICAgICAgICBzdHJlYW1vZmY7CisjZWxpZiBkZWZpbmVkKF9HTElCQ1hYX0hBVkVfSU5UNjRfVF9MT05HX0xPTkcpCisgIHR5cGVkZWYgbG9uZyBsb25nICAgICBzdHJlYW1vZmY7CisjZWxpZiBkZWZpbmVkKF9HTElCQ1hYX0hBVkVfSU5UNjRfVCkgCisgIHR5cGVkZWYgaW50NjRfdCAgICAgICBzdHJlYW1vZmY7CisjZWxzZQorICB0eXBlZGVmIGxvbmcgbG9uZyAgICAgc3RyZWFtb2ZmOworI2VuZGlmCisKKyAgLy8vIEludGVncmFsIHR5cGUgZm9yIEkvTyBvcGVyYXRpb24gY291bnRzIGFuZCBidWZmZXIgc2l6ZXMuCisgIHR5cGVkZWYgcHRyZGlmZl90CXN0cmVhbXNpemU7IC8vIFNpZ25lZCBpbnRlZ3JhbCB0eXBlCisKKyAgLyoqCisgICAqICBAYnJpZWYgIENsYXNzIHJlcHJlc2VudGluZyBzdHJlYW0gcG9zaXRpb25zLgorICAgKgorICAgKiAgVGhlIHN0YW5kYXJkIHBsYWNlcyBubyByZXF1aXJlbWVudHMgdXBvbiB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIFN0YXRlVC4KKyAgICogIEluIHRoaXMgaW1wbGVtZW50YXRpb24gU3RhdGVUIG11c3QgYmUgRGVmYXVsdENvbnN0cnVjdGlibGUsCisgICAqICBDb3B5Q29uc3RydWN0aWJsZSBhbmQgQXNzaWduYWJsZS4gIFRoZSBzdGFuZGFyZCBvbmx5IHJlcXVpcmVzIHRoYXQgZnBvcworICAgKiAgc2hvdWxkIGNvbnRhaW4gYSBtZW1iZXIgb2YgdHlwZSBTdGF0ZVQuIEluIHRoaXMgaW1wbGVtZW50YXRpb24gaXQgYWxzbworICAgKiAgY29udGFpbnMgYW4gb2Zmc2V0IHN0b3JlZCBhcyBhIHNpZ25lZCBpbnRlZ2VyLgorICAgKgorICAgKiAgQHBhcmFtICBTdGF0ZVQgIFR5cGUgcGFzc2VkIHRvIGFuZCByZXR1cm5lZCBmcm9tIHN0YXRlKCkuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3RhdGVUPgorICAgIGNsYXNzIGZwb3MKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHN0cmVhbW9mZgkgICAgICAgICAgICAgICAgX01fb2ZmOworICAgICAgX1N0YXRlVAkJCV9NX3N0YXRlOworCisgICAgcHVibGljOgorICAgICAgLy8gVGhlIHN0YW5kYXJkIGRvZXNuJ3QgcmVxdWlyZSB0aGF0IGZwb3Mgb2JqZWN0cyBjYW4gYmUgZGVmYXVsdAorICAgICAgLy8gY29uc3RydWN0ZWQuIFRoaXMgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgYSBkZWZhdWx0CisgICAgICAvLyBjb25zdHJ1Y3RvciB0aGF0IGluaXRpYWxpemVzIHRoZSBvZmZzZXQgdG8gMCBhbmQgZGVmYXVsdAorICAgICAgLy8gY29uc3RydWN0cyB0aGUgc3RhdGUuCisgICAgICBmcG9zKCkKKyAgICAgIDogX01fb2ZmKDApLCBfTV9zdGF0ZSgpIHsgfQorCisgICAgICAvLyBUaGUgc3RhbmRhcmQgcmVxdWlyZXMgdGhhdCBmcG9zIG9iamVjdHMgY2FuIGJlIGNvbnN0cnVjdGVkCisgICAgICAvLyBmcm9tIHN0cmVhbW9mZiBvYmplY3RzIHVzaW5nIHRoZSBjb25zdHJ1Y3RvciBzeW50YXgsIGFuZAorICAgICAgLy8gZmFpbHMgdG8gZ2l2ZSBhbnkgbWVhbmluZ2Z1bCBzZW1hbnRpY3MuIEluIHRoaXMKKyAgICAgIC8vIGltcGxlbWVudGF0aW9uIGltcGxpY2l0IGNvbnZlcnNpb24gaXMgYWxzbyBhbGxvd2VkLCBhbmQgdGhpcworICAgICAgLy8gY29uc3RydWN0b3Igc3RvcmVzIHRoZSBzdHJlYW1vZmYgYXMgdGhlIG9mZnNldCBhbmQgZGVmYXVsdAorICAgICAgLy8gY29uc3RydWN0cyB0aGUgc3RhdGUuCisgICAgICAvLy8gQ29uc3RydWN0IHBvc2l0aW9uIGZyb20gb2Zmc2V0LgorICAgICAgZnBvcyhzdHJlYW1vZmYgX19vZmYpCisgICAgICA6IF9NX29mZihfX29mZiksIF9NX3N0YXRlKCkgeyB9CisKKyAgICAgIC8vLyBDb252ZXJ0IHRvIHN0cmVhbW9mZi4KKyAgICAgIG9wZXJhdG9yIHN0cmVhbW9mZigpIGNvbnN0IHsgcmV0dXJuIF9NX29mZjsgfQorCisgICAgICAvLy8gUmVtZW1iZXIgdGhlIHZhbHVlIG9mIEBhIHN0LgorICAgICAgdm9pZAorICAgICAgc3RhdGUoX1N0YXRlVCBfX3N0KQorICAgICAgeyBfTV9zdGF0ZSA9IF9fc3Q7IH0KKworICAgICAgLy8vIFJldHVybiB0aGUgbGFzdCBzZXQgdmFsdWUgb2YgQGEgc3QuCisgICAgICBfU3RhdGVUCisgICAgICBzdGF0ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9zdGF0ZTsgfQorCisgICAgICAvLyBUaGUgc3RhbmRhcmQgcmVxdWlyZXMgdGhhdCB0aGlzIG9wZXJhdG9yIG11c3QgYmUgZGVmaW5lZCwgYnV0CisgICAgICAvLyBnaXZlcyBubyBzZW1hbnRpY3MuIEluIHRoaXMgaW1wbGVtZW50YXRpb24gaXQganVzdCBhZGRzIGl0cworICAgICAgLy8gYXJndW1lbnQgdG8gdGhlIHN0b3JlZCBvZmZzZXQgYW5kIHJldHVybnMgKnRoaXMuCisgICAgICAvLy8gQWRkIG9mZnNldCB0byB0aGlzIHBvc2l0aW9uLgorICAgICAgZnBvcyYKKyAgICAgIG9wZXJhdG9yKz0oc3RyZWFtb2ZmIF9fb2ZmKQorICAgICAgeworCV9NX29mZiArPSBfX29mZjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vIFRoZSBzdGFuZGFyZCByZXF1aXJlcyB0aGF0IHRoaXMgb3BlcmF0b3IgbXVzdCBiZSBkZWZpbmVkLCBidXQKKyAgICAgIC8vIGdpdmVzIG5vIHNlbWFudGljcy4gSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBpdCBqdXN0IHN1YnRyYWN0cworICAgICAgLy8gaXRzIGFyZ3VtZW50IGZyb20gdGhlIHN0b3JlZCBvZmZzZXQgYW5kIHJldHVybnMgKnRoaXMuCisgICAgICAvLy8gU3VidHJhY3Qgb2Zmc2V0IGZyb20gdGhpcyBwb3NpdGlvbi4KKyAgICAgIGZwb3MmCisgICAgICBvcGVyYXRvci09KHN0cmVhbW9mZiBfX29mZikKKyAgICAgIHsKKwlfTV9vZmYgLT0gX19vZmY7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLyBUaGUgc3RhbmRhcmQgcmVxdWlyZXMgdGhhdCB0aGlzIG9wZXJhdG9yIG11c3QgYmUgZGVmaW5lZCwgYnV0CisgICAgICAvLyBkZWZpbmVzIGl0cyBzZW1hbnRpY3Mgb25seSBpbiB0ZXJtcyBvZiBvcGVyYXRvci0uIEluIHRoaXMKKyAgICAgIC8vIGltcGxlbWVudGF0aW9uIGl0IGNvbnN0cnVjdHMgYSBjb3B5IG9mICp0aGlzLCBhZGRzIHRoZQorICAgICAgLy8gYXJndW1lbnQgdG8gdGhhdCBjb3B5IHVzaW5nIG9wZXJhdG9yKz0gYW5kIHRoZW4gcmV0dXJucyB0aGUKKyAgICAgIC8vIGNvcHkuCisgICAgICAvLy8gQWRkIHBvc2l0aW9uIGFuZCBvZmZzZXQuCisgICAgICBmcG9zCisgICAgICBvcGVyYXRvcisoc3RyZWFtb2ZmIF9fb2ZmKSBjb25zdAorICAgICAgeworCWZwb3MgX19wb3MoKnRoaXMpOworCV9fcG9zICs9IF9fb2ZmOworCXJldHVybiBfX3BvczsKKyAgICAgIH0KKworICAgICAgLy8gVGhlIHN0YW5kYXJkIHJlcXVpcmVzIHRoYXQgdGhpcyBvcGVyYXRvciBtdXN0IGJlIGRlZmluZWQsIGJ1dAorICAgICAgLy8gZGVmaW5lcyBpdHMgc2VtYW50aWNzIG9ubHkgaW4gdGVybXMgb2Ygb3BlcmF0b3IrLiBJbiB0aGlzCisgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBpdCBjb25zdHJ1Y3RzIGEgY29weSBvZiAqdGhpcywgc3VidHJhY3RzIHRoZQorICAgICAgLy8gYXJndW1lbnQgZnJvbSB0aGF0IGNvcHkgdXNpbmcgb3BlcmF0b3ItPSBhbmQgdGhlbiByZXR1cm5zIHRoZQorICAgICAgLy8gY29weS4KKyAgICAgIC8vLyBTdWJ0cmFjdCBvZmZzZXQgZnJvbSBwb3NpdGlvbi4KKyAgICAgIGZwb3MKKyAgICAgIG9wZXJhdG9yLShzdHJlYW1vZmYgX19vZmYpIGNvbnN0CisgICAgICB7CisJZnBvcyBfX3BvcygqdGhpcyk7CisJX19wb3MgLT0gX19vZmY7CisJcmV0dXJuIF9fcG9zOworICAgICAgfQorCisgICAgICAvLyBUaGUgc3RhbmRhcmQgcmVxdWlyZXMgdGhhdCB0aGlzIG9wZXJhdG9yIG11c3QgYmUgZGVmaW5lZCwgYnV0CisgICAgICAvLyBkZWZpbmVzIGl0cyBzZW1hbnRpY3Mgb25seSBpbiB0ZXJtcyBvZiBvcGVyYXRvcisuIEluIHRoaXMKKyAgICAgIC8vIGltcGxlbWVudGF0aW9uIGl0IHJldHVybnMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgb2Zmc2V0CisgICAgICAvLyBzdG9yZWQgaW4gKnRoaXMgYW5kIGluIHRoZSBhcmd1bWVudC4KKyAgICAgIC8vLyBTdWJ0cmFjdCBwb3NpdGlvbiB0byByZXR1cm4gb2Zmc2V0LgorICAgICAgc3RyZWFtb2ZmCisgICAgICBvcGVyYXRvci0oY29uc3QgZnBvcyYgX19vdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX29mZiAtIF9fb3RoZXIuX01fb2ZmOyB9CisgICAgfTsKKworICAvLyBUaGUgc3RhbmRhcmQgb25seSByZXF1aXJlcyB0aGF0IG9wZXJhdG9yPT0gbXVzdCBiZSBhbgorICAvLyBlcXVpdmFsZW5jZSByZWxhdGlvbi4gSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiB0d28gZnBvczxTdGF0ZVQ+CisgIC8vIG9iamVjdHMgYmVsb25nIHRvIHRoZSBzYW1lIGVxdWl2YWxlbmNlIGNsYXNzIGlmIHRoZSBjb250YWluZWQKKyAgLy8gb2Zmc2V0cyBjb21wYXJlIGVxdWFsLgorICAvLy8gVGVzdCBpZiBlcXVpdmFsZW50IHRvIGFub3RoZXIgcG9zaXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TdGF0ZVQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGZwb3M8X1N0YXRlVD4mIF9fbGhzLCBjb25zdCBmcG9zPF9TdGF0ZVQ+JiBfX3JocykKKyAgICB7IHJldHVybiBzdHJlYW1vZmYoX19saHMpID09IHN0cmVhbW9mZihfX3Jocyk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3RhdGVUPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBmcG9zPF9TdGF0ZVQ+JiBfX2xocywgY29uc3QgZnBvczxfU3RhdGVUPiYgX19yaHMpCisgICAgeyByZXR1cm4gc3RyZWFtb2ZmKF9fbGhzKSAhPSBzdHJlYW1vZmYoX19yaHMpOyB9CisKKyAgLy8gQ2xhdXNlcyAyMS4xLjMuMSBhbmQgMjEuMS4zLjIgZGVzY3JpYmUgc3RyZWFtcG9zIGFuZCB3c3RyZWFtcG9zCisgIC8vIGFzIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZXMsIGJ1dCBjbGF1c2UgMjcuMiByZXF1aXJlcyB0aGF0CisgIC8vIHRoZXkgbXVzdCBib3RoIGJlIHR5cGVkZWZzIGZvciBmcG9zPG1ic3RhdGVfdD4KKyAgLy8vIEZpbGUgcG9zaXRpb24gZm9yIGNoYXIgc3RyZWFtcy4KKyAgdHlwZWRlZiBmcG9zPG1ic3RhdGVfdD4gc3RyZWFtcG9zOworICAvLy8gRmlsZSBwb3NpdGlvbiBmb3Igd2NoYXJfdCBzdHJlYW1zLgorICB0eXBlZGVmIGZwb3M8bWJzdGF0ZV90PiB3c3RyZWFtcG9zOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAvLy8gRmlsZSBwb3NpdGlvbiBmb3IgY2hhcjE2X3Qgc3RyZWFtcy4KKyAgdHlwZWRlZiBmcG9zPG1ic3RhdGVfdD4gdTE2c3RyZWFtcG9zOworICAvLy8gRmlsZSBwb3NpdGlvbiBmb3IgY2hhcjMyX3Qgc3RyZWFtcy4KKyAgdHlwZWRlZiBmcG9zPG1ic3RhdGVfdD4gdTMyc3RyZWFtcG9zOworI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcHRyX3RyYWl0cy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3B0cl90cmFpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTg1ZmIyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3B0cl90cmFpdHMuaApAQCAtMCwwICsxLDE4MiBAQAorLy8gUG9pbnRlciBUcmFpdHMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvcHRyX3RyYWl0cy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bWVtb3J5fQorICovCisKKyNpZm5kZWYgX1BUUl9UUkFJVFNfSAorI2RlZmluZSBfUFRSX1RSQUlUU19IIDEKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPiAvLyBGb3IgX0dMSUJDWFhfSEFTX05FU1RFRF9UWVBFCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworX0dMSUJDWFhfSEFTX05FU1RFRF9UWVBFKGVsZW1lbnRfdHlwZSkKK19HTElCQ1hYX0hBU19ORVNURURfVFlQRShkaWZmZXJlbmNlX3R5cGUpCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBib29sID0gX19oYXNfZWxlbWVudF90eXBlPF9UcD46OnZhbHVlPgorICAgIHN0cnVjdCBfX3B0cnRyX2VsdF90eXBlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19wdHJ0cl9lbHRfdHlwZTxfVHAsIHRydWU+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHA6OmVsZW1lbnRfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWUuLi4+IGNsYXNzIF9Tb21lUHRyLCB0eXBlbmFtZSBfVHAsCisgICAgICAgICAgICB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgX19wdHJ0cl9lbHRfdHlwZTxfU29tZVB0cjxfVHAsIF9BcmdzLi4uPiwgZmFsc2U+CisgICAgeworICAgICAgdHlwZWRlZiBfVHAgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBib29sID0gX19oYXNfZGlmZmVyZW5jZV90eXBlPF9UcD46OnZhbHVlPgorICAgIHN0cnVjdCBfX3B0cnRyX2RpZmZfdHlwZQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RwOjpkaWZmZXJlbmNlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX3B0cnRyX2RpZmZfdHlwZTxfVHAsIGZhbHNlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90IF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9QdHIsIHR5cGVuYW1lIF9VcD4KKyAgICBjbGFzcyBfX3B0cnRyX3JlYmluZF9oZWxwZXIKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHRyMiwgdHlwZW5hbWUgX1VwMj4KKwlzdGF0aWMgY29uc3RleHByIGJvb2wKKyAgICAgICAJX1NfY2hrKHR5cGVuYW1lIF9QdHIyOjp0ZW1wbGF0ZSByZWJpbmQ8X1VwMj4qKQorICAgICAgIAl7IHJldHVybiB0cnVlOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sCisgICAgICAgCV9TX2NoayguLi4pCisgICAgICAgCXsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBfX3ZhbHVlID0gX1NfY2hrPF9QdHIsIF9VcD4obnVsbHB0cik7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHRyLCB0eXBlbmFtZSBfVXA+CisgICAgY29uc3QgYm9vbCBfX3B0cnRyX3JlYmluZF9oZWxwZXI8X1B0ciwgX1VwPjo6X192YWx1ZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcCwKKyAgICAgICAgICAgYm9vbCA9IF9fcHRydHJfcmViaW5kX2hlbHBlcjxfVHAsIF9VcD46Ol9fdmFsdWU+CisgICAgc3RydWN0IF9fcHRydHJfcmViaW5kOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIHN0cnVjdCBfX3B0cnRyX3JlYmluZDxfVHAsIF9VcCwgdHJ1ZT4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcDo6dGVtcGxhdGUgcmViaW5kPF9VcD4gX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lLi4uPiBjbGFzcyBfU29tZVB0ciwgdHlwZW5hbWUgX1VwLAorICAgICAgICAgICAgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgX19wdHJ0cl9yZWJpbmQ8X1NvbWVQdHI8X1RwLCBfQXJncy4uLj4sIF9VcCwgZmFsc2U+CisgICAgeworICAgICAgdHlwZWRlZiBfU29tZVB0cjxfVXAsIF9BcmdzLi4uPiBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lID0gdHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+CisgICAgc3RydWN0IF9fcHRydHJfbm90X3ZvaWQKKyAgICB7CisgICAgICB0eXBlZGVmIF9UcCBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fcHRydHJfbm90X3ZvaWQ8X1RwLCB2b2lkPgorICAgIHsKKyAgICAgIHN0cnVjdCBfX3R5cGUgeyB9OworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1B0cj4KKyAgICBjbGFzcyBfX3B0cnRyX3BvaW50ZXJfdG8KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcHRydHJfZWx0X3R5cGU8X1B0cj46Ol9fdHlwZSAgIF9fb3JpZ190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3B0cnRyX25vdF92b2lkPF9fb3JpZ190eXBlPjo6X190eXBlIF9fZWxlbWVudF90eXBlOworCisgICAgcHVibGljOgorICAgICAgc3RhdGljIF9QdHIgcG9pbnRlcl90byhfX2VsZW1lbnRfdHlwZSYgX19lKQorICAgICAgeyByZXR1cm4gX1B0cjo6cG9pbnRlcl90byhfX2UpOyB9CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmICBVbmlmb3JtIGludGVyZmFjZSB0byBhbGwgcG9pbnRlci1saWtlIHR5cGVzCisgICAqIEBpbmdyb3VwIHBvaW50ZXJfYWJzdHJhY3Rpb25zCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9QdHI+CisgICAgc3RydWN0IHBvaW50ZXJfdHJhaXRzIDogX19wdHJ0cl9wb2ludGVyX3RvPF9QdHI+CisgICAgeworICAgICAgLy8vIFRoZSBwb2ludGVyIHR5cGUKKyAgICAgIHR5cGVkZWYgX1B0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIC8vLyBUaGUgdHlwZSBwb2ludGVkIHRvCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcHRydHJfZWx0X3R5cGU8X1B0cj46Ol9fdHlwZSAgIGVsZW1lbnRfdHlwZTsKKyAgICAgIC8vLyBUeXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHBvaW50ZXJzCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcHRydHJfZGlmZl90eXBlPF9QdHI+OjpfX3R5cGUgIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICB1c2luZyByZWJpbmQgPSB0eXBlbmFtZSBfX3B0cnRyX3JlYmluZDxfUHRyLCBfVXA+OjpfX3R5cGU7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmICBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciBidWlsdC1pbiBwb2ludGVycy4KKyAgICogQGluZ3JvdXAgcG9pbnRlcl9hYnN0cmFjdGlvbnMKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBwb2ludGVyX3RyYWl0czxfVHAqPgorICAgIHsKKyAgICAgIC8vLyBUaGUgcG9pbnRlciB0eXBlCisgICAgICB0eXBlZGVmIF9UcCogcG9pbnRlcjsKKyAgICAgIC8vLyBUaGUgdHlwZSBwb2ludGVkIHRvCisgICAgICB0eXBlZGVmIF9UcCAgZWxlbWVudF90eXBlOworICAgICAgLy8vIFR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gcG9pbnRlcnMKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICB1c2luZyByZWJpbmQgPSBfVXAqOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE9idGFpbiBhIHBvaW50ZXIgdG8gYW4gb2JqZWN0CisgICAgICAgKiAgQHBhcmFtICBfX3IgIEEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBvZiB0eXBlIEBjIGVsZW1lbnRfdHlwZQorICAgICAgICogIEByZXR1cm4gQGMgYWRkcmVzc29mKF9fcikKKyAgICAgICovCisgICAgICBzdGF0aWMgcG9pbnRlcgorICAgICAgcG9pbnRlcl90byh0eXBlbmFtZSBfX3B0cnRyX25vdF92b2lkPGVsZW1lbnRfdHlwZT46Ol9fdHlwZSYgX19yKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjphZGRyZXNzb2YoX19yKTsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yYW5kb20uaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yYW5kb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzdkMmYzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JhbmRvbS5oCkBAIC0wLDAgKzEsNjA2OSBAQAorLy8gcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKgorICogQGZpbGUgYml0cy9yYW5kb20uaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3JhbmRvbX0KKyAqLworCisjaWZuZGVmIF9SQU5ET01fSAorI2RlZmluZSBfUkFORE9NX0ggMQorCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gWzI2LjRdIFJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbgorCisgIC8qKgorICAgKiBAZGVmZ3JvdXAgcmFuZG9tIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgorICAgKiBAaW5ncm91cCBudW1lcmljcworICAgKgorICAgKiBBIGZhY2lsaXR5IGZvciBnZW5lcmF0aW5nIHJhbmRvbSBudW1iZXJzIG9uIHNlbGVjdGVkIGRpc3RyaWJ1dGlvbnMuCisgICAqIEB7CisgICAqLworCisgIC8qKgorICAgKiBAYnJpZWYgQSBmdW5jdGlvbiB0ZW1wbGF0ZSBmb3IgY29udmVydGluZyB0aGUgb3V0cHV0IG9mIGEgKGludGVncmFsKQorICAgKiB1bmlmb3JtIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRvIGEgZmxvYXRuZyBwb2ludCByZXN1bHQgaW4gdGhlIHJhbmdlCisgICAqIFswLTEpLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCBzaXplX3QgX19iaXRzLAorCSAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgIF9SZWFsVHlwZQorICAgIGdlbmVyYXRlX2Nhbm9uaWNhbChfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX19nKTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoKKyAgICogSW1wbGVtZW50YXRpb24tc3BhY2UgZGV0YWlscy4KKyAgICovCisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX3csCisJICAgICBib29sID0gX193IDwgc3RhdGljX2Nhc3Q8c2l6ZV90PgorCQkJICAoc3RkOjpudW1lcmljX2xpbWl0czxfVUludFR5cGU+OjpkaWdpdHMpPgorICAgICAgc3RydWN0IF9TaGlmdAorICAgICAgeyBzdGF0aWMgY29uc3QgX1VJbnRUeXBlIF9fdmFsdWUgPSAwOyB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193PgorICAgICAgc3RydWN0IF9TaGlmdDxfVUludFR5cGUsIF9fdywgdHJ1ZT4KKyAgICAgIHsgc3RhdGljIGNvbnN0IF9VSW50VHlwZSBfX3ZhbHVlID0gX1VJbnRUeXBlKDEpIDw8IF9fdzsgfTsKKworICAgIHRlbXBsYXRlPGludCBfX3MsCisJICAgICBpbnQgX193aGljaCA9ICgoX19zIDw9IF9fQ0hBUl9CSVRfXyAqIHNpemVvZiAoaW50KSkKKwkJCSAgICArIChfX3MgPD0gX19DSEFSX0JJVF9fICogc2l6ZW9mIChsb25nKSkKKwkJCSAgICArIChfX3MgPD0gX19DSEFSX0JJVF9fICogc2l6ZW9mIChsb25nIGxvbmcpKQorCQkJICAgIC8qIGFzc3VtZSBsb25nIGxvbmcgbm8gYmlnZ2VyIHRoYW4gX19pbnQxMjggKi8KKwkJCSAgICArIChfX3MgPD0gMTI4KSk+CisgICAgICBzdHJ1Y3QgX1NlbGVjdF91aW50X2xlYXN0X3QKKyAgICAgIHsKKwlzdGF0aWNfYXNzZXJ0KF9fd2hpY2ggPCAwLCAvKiBuZWVkcyB0byBiZSBkZXBlbmRlbnQgKi8KKwkJICAgICAgInNvcnJ5LCB3b3VsZCBiZSB0b28gbXVjaCB0cm91YmxlIGZvciBhIHNsb3cgcmVzdWx0Iik7CisgICAgICB9OworCisgICAgdGVtcGxhdGU8aW50IF9fcz4KKyAgICAgIHN0cnVjdCBfU2VsZWN0X3VpbnRfbGVhc3RfdDxfX3MsIDQ+CisgICAgICB7IHR5cGVkZWYgdW5zaWduZWQgaW50IHR5cGU7IH07CisKKyAgICB0ZW1wbGF0ZTxpbnQgX19zPgorICAgICAgc3RydWN0IF9TZWxlY3RfdWludF9sZWFzdF90PF9fcywgMz4KKyAgICAgIHsgdHlwZWRlZiB1bnNpZ25lZCBsb25nIHR5cGU7IH07CisKKyAgICB0ZW1wbGF0ZTxpbnQgX19zPgorICAgICAgc3RydWN0IF9TZWxlY3RfdWludF9sZWFzdF90PF9fcywgMj4KKyAgICAgIHsgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdHlwZTsgfTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9JTlQxMjgKKyAgICB0ZW1wbGF0ZTxpbnQgX19zPgorICAgICAgc3RydWN0IF9TZWxlY3RfdWludF9sZWFzdF90PF9fcywgMT4KKyAgICAgIHsgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDEyOCB0eXBlOyB9OworI2VuZGlmCisKKyAgICAvLyBBc3N1bWUgYSAhPSAwLCBhIDwgbSwgYyA8IG0sIHggPCBtLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX1RwIF9fbSwgX1RwIF9fYSwgX1RwIF9fYywKKwkgICAgIGJvb2wgX19iaWdfZW5vdWdoID0gKCEoX19tICYgKF9fbSAtIDEpKQorCQkJCSAgfHwgKF9UcCgtMSkgLSBfX2MpIC8gX19hID49IF9fbSAtIDEpLAorICAgICAgICAgICAgIGJvb2wgX19zY2hyYWdlX29rID0gX19tICUgX19hIDwgX19tIC8gX19hPgorICAgICAgc3RydWN0IF9Nb2QKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9TZWxlY3RfdWludF9sZWFzdF90PHN0ZDo6X19sZyhfX2EpCisJCQkJCSAgICAgICsgc3RkOjpfX2xnKF9fbSkgKyAyPjo6dHlwZSBfVHAyOworCXN0YXRpYyBfVHAKKwlfX2NhbGMoX1RwIF9feCkKKwl7IHJldHVybiBzdGF0aWNfY2FzdDxfVHA+KChfVHAyKF9fYSkgKiBfX3ggKyBfX2MpICUgX19tKTsgfQorICAgICAgfTsKKworICAgIC8vIFNjaHJhZ2UuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfVHAgX19tLCBfVHAgX19hLCBfVHAgX19jPgorICAgICAgc3RydWN0IF9Nb2Q8X1RwLCBfX20sIF9fYSwgX19jLCBmYWxzZSwgdHJ1ZT4KKyAgICAgIHsKKwlzdGF0aWMgX1RwCisJX19jYWxjKF9UcCBfX3gpOworICAgICAgfTsKKworICAgIC8vIFNwZWNpYWwgY2FzZXM6CisgICAgLy8gLSBmb3IgbSA9PSAyXm4gb3IgbSA9PSAwLCB1bnNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93IGlzIHNhZmUuCisgICAgLy8gLSBhICogKG0gLSAxKSArIGMgZml0cyBpbiBfVHAsIHRoZXJlIGlzIG5vIG92ZXJmbG93LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX1RwIF9fbSwgX1RwIF9fYSwgX1RwIF9fYywgYm9vbCBfX3M+CisgICAgICBzdHJ1Y3QgX01vZDxfVHAsIF9fbSwgX19hLCBfX2MsIHRydWUsIF9fcz4KKyAgICAgIHsKKwlzdGF0aWMgX1RwCisJX19jYWxjKF9UcCBfX3gpCisJeworCSAgX1RwIF9fcmVzID0gX19hICogX194ICsgX19jOworCSAgaWYgKF9fbSkKKwkgICAgX19yZXMgJT0gX19tOworCSAgcmV0dXJuIF9fcmVzOworCX0KKyAgICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9UcCBfX20sIF9UcCBfX2EgPSAxLCBfVHAgX19jID0gMD4KKyAgICAgIGlubGluZSBfVHAKKyAgICAgIF9fbW9kKF9UcCBfX3gpCisgICAgICB7IHJldHVybiBfTW9kPF9UcCwgX19tLCBfX2EsIF9fYz46Ol9fY2FsYyhfX3gpOyB9CisKKyAgICAvKiBEZXRlcm1pbmUgd2hldGhlciBudW1iZXIgaXMgYSBwb3dlciBvZiAyLiAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBpbmxpbmUgYm9vbAorICAgICAgX1Bvd2VyX29mXzIoX1RwIF9feCkKKyAgICAgIHsKKwlyZXR1cm4gKChfX3ggLSAxKSAmIF9feCkgPT0gMDsKKyAgICAgIH07CisKKyAgICAvKgorICAgICAqIEFuIGFkYXB0b3IgY2xhc3MgZm9yIGNvbnZlcnRpbmcgdGhlIG91dHB1dCBvZiBhbnkgR2VuZXJhdG9yIGludG8KKyAgICAgKiB0aGUgaW5wdXQgZm9yIGEgc3BlY2lmaWMgRGlzdHJpYnV0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9FbmdpbmUsIHR5cGVuYW1lIF9ESW5wdXRUeXBlPgorICAgICAgc3RydWN0IF9BZGFwdG9yCisgICAgICB7CisKKyAgICAgIHB1YmxpYzoKKwlfQWRhcHRvcihfRW5naW5lJiBfX2cpCisJOiBfTV9nKF9fZykgeyB9CisKKwlfRElucHV0VHlwZQorCW1pbigpIGNvbnN0CisJeyByZXR1cm4gX0RJbnB1dFR5cGUoMCk7IH0KKworCV9ESW5wdXRUeXBlCisJbWF4KCkgY29uc3QKKwl7IHJldHVybiBfRElucHV0VHlwZSgxKTsgfQorCisJLyoKKwkgKiBDb252ZXJ0cyBhIHZhbHVlIGdlbmVyYXRlZCBieSB0aGUgYWRhcHRlZCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorCSAqIGludG8gYSB2YWx1ZSBpbiB0aGUgaW5wdXQgZG9tYWluIGZvciB0aGUgZGVwZW5kZW50IHJhbmRvbSBudW1iZXIKKwkgKiBkaXN0cmlidXRpb24uCisJICovCisJX0RJbnB1dFR5cGUKKwlvcGVyYXRvcigpKCkKKwl7CisJICByZXR1cm4gc3RkOjpnZW5lcmF0ZV9jYW5vbmljYWw8X0RJbnB1dFR5cGUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8X0RJbnB1dFR5cGU+OjpkaWdpdHMsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9FbmdpbmU+KF9NX2cpOworCX0KKworICAgICAgcHJpdmF0ZToKKwlfRW5naW5lJiBfTV9nOworICAgICAgfTsKKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2UgX19kZXRhaWwKKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgcmFuZG9tX2dlbmVyYXRvcnMgUmFuZG9tIE51bWJlciBHZW5lcmF0b3JzCisgICAqIEBpbmdyb3VwIHJhbmRvbQorICAgKgorICAgKiBUaGVzZSBjbGFzc2VzIGRlZmluZSBvYmplY3RzIHdoaWNoIHByb3ZpZGUgcmFuZG9tIG9yIHBzZXVkb3JhbmRvbQorICAgKiBudW1iZXJzLCBlaXRoZXIgZnJvbSBhIGRpc2NyZXRlIG9yIGEgY29udGludW91cyBpbnRlcnZhbC4gIFRoZQorICAgKiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBzdXBwbGllZCBhcyBhIHBhcnQgb2YgdGhpcyBsaWJyYXJ5IGFyZQorICAgKiBhbGwgdW5pZm9ybSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgd2hpY2ggcHJvdmlkZSBhIHNlcXVlbmNlIG9mCisgICAqIHJhbmRvbSBudW1iZXIgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIG92ZXIgdGhlaXIgcmFuZ2UuCisgICAqCisgICAqIEEgbnVtYmVyIGdlbmVyYXRvciBpcyBhIGZ1bmN0aW9uIG9iamVjdCB3aXRoIGFuIG9wZXJhdG9yKCkgdGhhdAorICAgKiB0YWtlcyB6ZXJvIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhIG51bWJlci4KKyAgICoKKyAgICogQSBjb21wbGlhbnQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgbXVzdCBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcKKyAgICogcmVxdWlyZW1lbnRzLiAgPHRhYmxlIGJvcmRlcj0xIGNlbGxwYWRkaW5nPTEwIGNlbGxzcGFjaW5nPTA+CisgICAqIDxjYXB0aW9uIGFsaWduPXRvcD5SYW5kb20gTnVtYmVyIEdlbmVyYXRvciBSZXF1aXJlbWVudHM8L2NhcHRpb24+CisgICAqIDx0cj48dGQ+VG8gYmUgZG9jdW1lbnRlZC48L3RkPjwvdHI+IDwvdGFibGU+CisgICAqCisgICAqIEB7CisgICAqLworCisgIC8qKgorICAgKiBAYnJpZWYgQSBtb2RlbCBvZiBhIGxpbmVhciBjb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAqCisgICAqIEEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdGhhdCBwcm9kdWNlcyBwc2V1ZG9yYW5kb20gbnVtYmVycyB2aWEKKyAgICogbGluZWFyIGZ1bmN0aW9uOgorICAgKiBAZlsKKyAgICogICAgIHhfe2krMX1cbGVmdGFycm93KGF4X3tpfSArIGMpIFxibW9kIG0gCisgICAqIEBmXQorICAgKgorICAgKiBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIEBwIF9VSW50VHlwZSBtdXN0IGJlIGFuIHVuc2lnbmVkIGludGVncmFsIHR5cGUKKyAgICogbGFyZ2UgZW5vdWdoIHRvIHN0b3JlIHZhbHVlcyB1cCB0byAoX19tLTEpLiBJZiB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyCisgICAqIEBwIF9fbSBpcyAwLCB0aGUgbW9kdWx1cyBAcCBfX20gdXNlZCBpcworICAgKiBzdGQ6Om51bWVyaWNfbGltaXRzPF9VSW50VHlwZT46Om1heCgpIHBsdXMgMS4gT3RoZXJ3aXNlLCB0aGUgdGVtcGxhdGUKKyAgICogcGFyYW1ldGVycyBAcCBfX2EgYW5kIEBwIF9fYyBtdXN0IGJlIGxlc3MgdGhhbiBAcCBfX20uCisgICAqCisgICAqIFRoZSBzaXplIG9mIHRoZSBzdGF0ZSBpcyBAZiQxQGYkLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tPgorICAgIGNsYXNzIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3Vuc2lnbmVkPF9VSW50VHlwZT46OnZhbHVlLCAidGVtcGxhdGUgYXJndW1lbnQgIgorCQkgICAgInN1YnN0aXR1dGluZyBfVUludFR5cGUgbm90IGFuIHVuc2lnbmVkIGludGVncmFsIHR5cGUiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19tID09IDB1IHx8IChfX2EgPCBfX20gJiYgX19jIDwgX19tKSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgX19tIG91dCBvZiBib3VuZHMiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSB2YWx1ZS4gKi8KKyAgICAgIHR5cGVkZWYgX1VJbnRUeXBlIHJlc3VsdF90eXBlOworCisgICAgICAvKiogVGhlIG11bHRpcGxpZXIuICovCisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIG11bHRpcGxpZXIgICA9IF9fYTsKKyAgICAgIC8qKiBBbiBpbmNyZW1lbnQuICovCisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIGluY3JlbWVudCAgICA9IF9fYzsKKyAgICAgIC8qKiBUaGUgbW9kdWx1cy4gKi8KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgbW9kdWx1cyAgICAgID0gX19tOworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSBkZWZhdWx0X3NlZWQgPSAxdTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhICVsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZSByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZSB3aXRoIHNlZWQgQHAgX19zLiAgVGhlIGRlZmF1bHQgc2VlZCB2YWx1ZQorICAgICAgICogICAgICAgIGlzIDEuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcyBUaGUgaW5pdGlhbCBzZWVkIHZhbHVlLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmUocmVzdWx0X3R5cGUgX19zID0gZGVmYXVsdF9zZWVkKQorICAgICAgeyBzZWVkKF9fcyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhICVsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZSByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZSBzZWVkZWQgZnJvbSB0aGUgc2VlZCBzZXF1ZW5jZSBAcCBfX3EuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcSB0aGUgc2VlZCBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXEsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwlzdGQ6OmVuYWJsZV9pZjwhc3RkOjppc19zYW1lPF9Tc2VxLCBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZT46OnZhbHVlPgorCSAgICAgICA6OnR5cGU+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lKF9Tc2VxJiBfX3EpCisgICAgICAgIHsgc2VlZChfX3EpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2VlZHMgdGhlICVsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgIGVuZ2luZSBzZXF1ZW5jZSB0byB0aGUgc2VlZCBAcCBfX3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcyBUaGUgbmV3IHNlZWQuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHNlZWQocmVzdWx0X3R5cGUgX19zID0gZGVmYXVsdF9zZWVkKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZWVkcyB0aGUgJWxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgZW5naW5lCisgICAgICAgKiBzZXF1ZW5jZSB1c2luZyB2YWx1ZXMgZnJvbSB0aGUgc2VlZCBzZXF1ZW5jZSBAcCBfX3EuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcSB0aGUgc2VlZCBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXE+CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY2xhc3M8X1NzZXE+Ojp2YWx1ZT46OnR5cGUKKyAgICAgICAgc2VlZChfU3NlcSYgX19xKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgc21hbGxlc3QgcG9zc2libGUgdmFsdWUgaW4gdGhlIG91dHB1dCByYW5nZS4KKyAgICAgICAqCisgICAgICAgKiBUaGUgbWluaW11bSBkZXBlbmRzIG9uIHRoZSBAcCBfX2MgcGFyYW1ldGVyOiBpZiBpdCBpcyB6ZXJvLCB0aGUKKyAgICAgICAqIG1pbmltdW0gZ2VuZXJhdGVkIG11c3QgYmUgPiAwLCBvdGhlcndpc2UgMCBpcyBhbGxvd2VkLgorICAgICAgICovCisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlCisgICAgICBtaW4oKQorICAgICAgeyByZXR1cm4gX19jID09IDB1ID8gMXUgOiAwdTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBsYXJnZXN0IHBvc3NpYmxlIHZhbHVlIGluIHRoZSBvdXRwdXQgcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpCisgICAgICB7IHJldHVybiBfX20gLSAxdTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBEaXNjYXJkIGEgc2VxdWVuY2Ugb2YgcmFuZG9tIG51bWJlcnMuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGRpc2NhcmQodW5zaWduZWQgbG9uZyBsb25nIF9feikKKyAgICAgIHsKKwlmb3IgKDsgX196ICE9IDBVTEw7IC0tX196KQorCSAgKCp0aGlzKSgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBuZXh0IHJhbmRvbSBudW1iZXIgaW4gdGhlIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKSgpCisgICAgICB7CisJX01feCA9IF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIF9fbSwgX19hLCBfX2M+KF9NX3gpOworCXJldHVybiBfTV94OworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb21wYXJlcyB0d28gbGluZWFyIGNvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGZvciBlcXVhbGl0eS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19saHMgQSBsaW5lYXIgY29uZ3J1ZW50aWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICAgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyIGxpbmVhciBjb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5maW5pdGUgc2VxdWVuY2VzIG9mIGdlbmVyYXRlZCB2YWx1ZXMKKyAgICAgICAqICAgICAgICAgIHdvdWxkIGJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lJiBfX2xocywKKwkJIGNvbnN0IGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lJiBfX3JocykKKyAgICAgIHsgcmV0dXJuIF9fbGhzLl9NX3ggPT0gX19yaHMuX01feDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBXcml0ZXMgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0YXRlIHgoaSkgb2YgeCB0bworICAgICAgICogICAgICAgIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgIFRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9fbGNyIEEgJSBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICAgICAqIEByZXR1cm5zIF9fb3MuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZTEsIF9VSW50VHlwZTEgX19hMSwgX1VJbnRUeXBlMSBfX2MxLAorCSAgICAgICBfVUludFR5cGUxIF9fbTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3Qgc3RkOjpsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxfVUludFR5cGUxLAorCQkgICBfX2ExLCBfX2MxLCBfX20xPiYgX19sY3IpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgZW5naW5lIGJ5IHJlYWRpbmcgaXRzIHRleHR1YWwKKyAgICAgICAqICAgICAgICByZXByZXNlbnRhdGlvbiBmcm9tIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogVGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSB3cml0dGVuIHVzaW5nCisgICAgICAgKiBhbiBvdXRwdXQgc3RyZWFtIHdob3NlIGltYnVlZCBsb2NhbGUgYW5kIHdob3NlIHR5cGUncyB0ZW1wbGF0ZQorICAgICAgICogc3BlY2lhbGl6YXRpb24gYXJndW1lbnRzIF9DaGFyVCBhbmQgX1RyYWl0cyB3ZXJlIHRoZSBzYW1lIGFzIHRob3NlCisgICAgICAgKiBvZiBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzICBUaGUgaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9fbGNyIEEgJSBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICAgICAqIEByZXR1cm5zIF9faXMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZTEsIF9VSW50VHlwZTEgX19hMSwgX1VJbnRUeXBlMSBfX2MxLAorCSAgICAgICBfVUludFR5cGUxIF9fbTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgc3RkOjpsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxfVUludFR5cGUxLCBfX2ExLAorCQkgICBfX2MxLCBfX20xPiYgX19sY3IpOworCisgICAgcHJpdmF0ZToKKyAgICAgIF9VSW50VHlwZSBfTV94OworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBDb21wYXJlcyB0d28gbGluZWFyIGNvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgKiBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgZm9yIGluZXF1YWxpdHkuCisgICAqCisgICAqIEBwYXJhbSBfX2xocyBBIGxpbmVhciBjb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0LgorICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciBsaW5lYXIgY29uZ3J1ZW50aWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAqCisgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGluZmluaXRlIHNlcXVlbmNlcyBvZiBnZW5lcmF0ZWQgdmFsdWVzCisgICAqICAgICAgICAgIHdvdWxkIGJlIGRpZmZlcmVudCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OmxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPF9VSW50VHlwZSwgX19hLAorCSAgICAgICBfX2MsIF9fbT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzdGQ6OmxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPF9VSW50VHlwZSwgX19hLAorCSAgICAgICBfX2MsIF9fbT4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKworICAvKioKKyAgICogQSBnZW5lcmFsaXplZCBmZWVkYmFjayBzaGlmdCByZWdpc3RlciBkaXNjcmV0ZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICoKKyAgICogVGhpcyBhbGdvcml0aG0gYXZvaWRzIG11bHRpcGxpY2F0aW9uIGFuZCBkaXZpc2lvbiBhbmQgaXMgZGVzaWduZWQgdG8gYmUKKyAgICogZnJpZW5kbHkgdG8gYSBwaXBlbGluZWQgYXJjaGl0ZWN0dXJlLiAgSWYgdGhlIHBhcmFtZXRlcnMgYXJlIGNob3NlbgorICAgKiBjb3JyZWN0bHksIHRoaXMgZ2VuZXJhdG9yIHdpbGwgcHJvZHVjZSBudW1iZXJzIHdpdGggYSB2ZXJ5IGxvbmcgcGVyaW9kIGFuZAorICAgKiBmYWlybHkgZ29vZCBhcHBhcmVudCBlbnRyb3B5LCBhbHRob3VnaCBzdGlsbCBub3QgY3J5cHRvZ3JhcGhpY2FsbHkgc3Ryb25nLgorICAgKgorICAgKiBUaGUgYmVzdCB3YXkgdG8gdXNlIHRoaXMgZ2VuZXJhdG9yIGlzIHdpdGggdGhlIHByZWRlZmluZWQgbXQxOTkzNyBjbGFzcy4KKyAgICoKKyAgICogVGhpcyBhbGdvcml0aG0gd2FzIG9yaWdpbmFsbHkgaW52ZW50ZWQgYnkgTWFrb3RvIE1hdHN1bW90byBhbmQKKyAgICogVGFrdWppIE5pc2hpbXVyYS4KKyAgICoKKyAgICogQHRwYXJhbSBfX3cgIFdvcmQgc2l6ZSwgdGhlIG51bWJlciBvZiBiaXRzIGluIGVhY2ggZWxlbWVudCBvZiAKKyAgICogICAgICAgICAgICAgIHRoZSBzdGF0ZSB2ZWN0b3IuCisgICAqIEB0cGFyYW0gX19uICBUaGUgZGVncmVlIG9mIHJlY3Vyc2lvbi4KKyAgICogQHRwYXJhbSBfX20gIFRoZSBwZXJpb2QgcGFyYW1ldGVyLgorICAgKiBAdHBhcmFtIF9fciAgVGhlIHNlcGFyYXRpb24gcG9pbnQgYml0IGluZGV4LgorICAgKiBAdHBhcmFtIF9fYSAgVGhlIGxhc3Qgcm93IG9mIHRoZSB0d2lzdCBtYXRyaXguCisgICAqIEB0cGFyYW0gX191ICBUaGUgZmlyc3QgcmlnaHQtc2hpZnQgdGVtcGVyaW5nIG1hdHJpeCBwYXJhbWV0ZXIuCisgICAqIEB0cGFyYW0gX19kICBUaGUgZmlyc3QgcmlnaHQtc2hpZnQgdGVtcGVyaW5nIG1hdHJpeCBtYXNrLgorICAgKiBAdHBhcmFtIF9fcyAgVGhlIGZpcnN0IGxlZnQtc2hpZnQgdGVtcGVyaW5nIG1hdHJpeCBwYXJhbWV0ZXIuCisgICAqIEB0cGFyYW0gX19iICBUaGUgZmlyc3QgbGVmdC1zaGlmdCB0ZW1wZXJpbmcgbWF0cml4IG1hc2suCisgICAqIEB0cGFyYW0gX190ICBUaGUgc2Vjb25kIGxlZnQtc2hpZnQgdGVtcGVyaW5nIG1hdHJpeCBwYXJhbWV0ZXIuCisgICAqIEB0cGFyYW0gX19jICBUaGUgc2Vjb25kIGxlZnQtc2hpZnQgdGVtcGVyaW5nIG1hdHJpeCBtYXNrLgorICAgKiBAdHBhcmFtIF9fbCAgVGhlIHNlY29uZCByaWdodC1zaGlmdCB0ZW1wZXJpbmcgbWF0cml4IHBhcmFtZXRlci4KKyAgICogQHRwYXJhbSBfX2YgIEluaXRpYWxpemF0aW9uIG11bHRpcGxpZXIuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX3csCisJICAgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsCisJICAgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwgX1VJbnRUeXBlIF9fZj4KKyAgICBjbGFzcyBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZQorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc191bnNpZ25lZDxfVUludFR5cGU+Ojp2YWx1ZSwgInRlbXBsYXRlIGFyZ3VtZW50ICIKKwkJICAgICJzdWJzdGl0dXRpbmcgX1VJbnRUeXBlIG5vdCBhbiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KDF1IDw9IF9fbSAmJiBfX20gPD0gX19uLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IHN1YnN0aXR1dGluZyBfX20gb3V0IG9mIGJvdW5kcyIpOworICAgICAgc3RhdGljX2Fzc2VydChfX3IgPD0gX193LCAidGVtcGxhdGUgYXJndW1lbnQgc3Vic3RpdHV0aW5nICIKKwkJICAgICJfX3Igb3V0IG9mIGJvdW5kIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fdSA8PSBfX3csICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgIgorCQkgICAgIl9fdSBvdXQgb2YgYm91bmQiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19zIDw9IF9fdywgInRlbXBsYXRlIGFyZ3VtZW50IHN1YnN0aXR1dGluZyAiCisJCSAgICAiX19zIG91dCBvZiBib3VuZCIpOworICAgICAgc3RhdGljX2Fzc2VydChfX3QgPD0gX193LCAidGVtcGxhdGUgYXJndW1lbnQgc3Vic3RpdHV0aW5nICIKKwkJICAgICJfX3Qgb3V0IG9mIGJvdW5kIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fbCA8PSBfX3csICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgIgorCQkgICAgIl9fbCBvdXQgb2YgYm91bmQiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX193IDw9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1VJbnRUeXBlPjo6ZGlnaXRzLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IHN1YnN0aXR1dGluZyBfX3cgb3V0IG9mIGJvdW5kIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fYSA8PSAoX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIF9fdz46Ol9fdmFsdWUgLSAxKSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgX19hIG91dCBvZiBib3VuZCIpOworICAgICAgc3RhdGljX2Fzc2VydChfX2IgPD0gKF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCBfX3c+OjpfX3ZhbHVlIC0gMSksCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgc3Vic3RpdHV0aW5nIF9fYiBvdXQgb2YgYm91bmQiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19jIDw9IChfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgX193Pjo6X192YWx1ZSAtIDEpLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IHN1YnN0aXR1dGluZyBfX2Mgb3V0IG9mIGJvdW5kIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fZCA8PSAoX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIF9fdz46Ol9fdmFsdWUgLSAxKSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgX19kIG91dCBvZiBib3VuZCIpOworICAgICAgc3RhdGljX2Fzc2VydChfX2YgPD0gKF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCBfX3c+OjpfX3ZhbHVlIC0gMSksCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgc3Vic3RpdHV0aW5nIF9fZiBvdXQgb2YgYm91bmQiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSB2YWx1ZS4gKi8KKyAgICAgIHR5cGVkZWYgX1VJbnRUeXBlIHJlc3VsdF90eXBlOworCisgICAgICAvLyBwYXJhbWV0ZXIgdmFsdWVzCisgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCAgICAgIHdvcmRfc2l6ZSAgICAgICAgICAgICAgICAgPSBfX3c7CisgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCAgICAgIHN0YXRlX3NpemUgICAgICAgICAgICAgICAgPSBfX247CisgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCAgICAgIHNoaWZ0X3NpemUgICAgICAgICAgICAgICAgPSBfX207CisgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCAgICAgIG1hc2tfYml0cyAgICAgICAgICAgICAgICAgPSBfX3I7CisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIHhvcl9tYXNrICAgICAgICAgICAgICAgICAgPSBfX2E7CisgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCAgICAgIHRlbXBlcmluZ191ICAgICAgICAgICAgICAgPSBfX3U7CisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIHRlbXBlcmluZ19kICAgICAgICAgICAgICAgPSBfX2Q7CisgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCAgICAgIHRlbXBlcmluZ19zICAgICAgICAgICAgICAgPSBfX3M7CisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIHRlbXBlcmluZ19iICAgICAgICAgICAgICAgPSBfX2I7CisgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCAgICAgIHRlbXBlcmluZ190ICAgICAgICAgICAgICAgPSBfX3Q7CisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIHRlbXBlcmluZ19jICAgICAgICAgICAgICAgPSBfX2M7CisgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCAgICAgIHRlbXBlcmluZ19sICAgICAgICAgICAgICAgPSBfX2w7CisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIGluaXRpYWxpemF0aW9uX211bHRpcGxpZXIgPSBfX2Y7CisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIGRlZmF1bHRfc2VlZCA9IDU0ODl1OworCisgICAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIG1lbWJlciBmdW5jdGlvbgorICAgICAgZXhwbGljaXQKKyAgICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lKHJlc3VsdF90eXBlIF9fc2QgPSBkZWZhdWx0X3NlZWQpCisgICAgICB7IHNlZWQoX19zZCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhICVtZXJzZW5uZV90d2lzdGVyX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgIGVuZ2luZSBzZWVkZWQgZnJvbSB0aGUgc2VlZCBzZXF1ZW5jZSBAcCBfX3EuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcSB0aGUgc2VlZCBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXEsIHR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfc2FtZTxfU3NlcSwgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU+Ojp2YWx1ZT4KKwkgICAgICAgOjp0eXBlPgorICAgICAgICBleHBsaWNpdAorICAgICAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZShfU3NlcSYgX19xKQorICAgICAgICB7IHNlZWQoX19xKTsgfQorCisgICAgICB2b2lkCisgICAgICBzZWVkKHJlc3VsdF90eXBlIF9fc2QgPSBkZWZhdWx0X3NlZWQpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3NlcT4KKwl0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NsYXNzPF9Tc2VxPjo6dmFsdWU+Ojp0eXBlCisgICAgICAgIHNlZWQoX1NzZXEmIF9fcSk7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIHZhbHVlIGluIHRoZSBvdXRwdXQgcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpCisgICAgICB7IHJldHVybiAwOyB9OworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBsYXJnZXN0IHBvc3NpYmxlIHZhbHVlIGluIHRoZSBvdXRwdXQgcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpCisgICAgICB7IHJldHVybiBfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgX193Pjo6X192YWx1ZSAtIDE7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRGlzY2FyZCBhIHNlcXVlbmNlIG9mIHJhbmRvbSBudW1iZXJzLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBkaXNjYXJkKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3opOworCisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKSgpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb21wYXJlcyB0d28gJSBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBmb3IgZXF1YWxpdHkuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fbGhzIEEgJSBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICAgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICUgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUgcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICAgIGdlbmVyYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5maW5pdGUgc2VxdWVuY2VzIG9mIGdlbmVyYXRlZCB2YWx1ZXMKKyAgICAgICAqICAgICAgICAgIHdvdWxkIGJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lJiBfX2xocywKKwkJIGNvbnN0IG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lJiBfX3JocykKKyAgICAgIHsgcmV0dXJuIChzdGQ6OmVxdWFsKF9fbGhzLl9NX3gsIF9fbGhzLl9NX3ggKyBzdGF0ZV9zaXplLCBfX3Jocy5fTV94KQorCQkmJiBfX2xocy5fTV9wID09IF9fcmhzLl9NX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAlIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lCisgICAgICAgKiAgICAgICAgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICAgKiAgICAgICAgQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlMSwKKwkgICAgICAgc2l6ZV90IF9fdzEsIHNpemVfdCBfX24xLAorCSAgICAgICBzaXplX3QgX19tMSwgc2l6ZV90IF9fcjEsCisJICAgICAgIF9VSW50VHlwZTEgX19hMSwgc2l6ZV90IF9fdTEsCisJICAgICAgIF9VSW50VHlwZTEgX19kMSwgc2l6ZV90IF9fczEsCisJICAgICAgIF9VSW50VHlwZTEgX19iMSwgc2l6ZV90IF9fdDEsCisJICAgICAgIF9VSW50VHlwZTEgX19jMSwgc2l6ZV90IF9fbDEsIF9VSW50VHlwZTEgX19mMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBzdGQ6Om1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZTEsIF9fdzEsIF9fbjEsCisJCSAgIF9fbTEsIF9fcjEsIF9fYTEsIF9fdTEsIF9fZDEsIF9fczEsIF9fYjEsIF9fdDEsIF9fYzEsCisJCSAgIF9fbDEsIF9fZjE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhICUgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUKKyAgICAgICAqICAgICAgICByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUgQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbQorICAgICAgICogICAgICAgIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggZXh0cmFjdGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlMSwKKwkgICAgICAgc2l6ZV90IF9fdzEsIHNpemVfdCBfX24xLAorCSAgICAgICBzaXplX3QgX19tMSwgc2l6ZV90IF9fcjEsCisJICAgICAgIF9VSW50VHlwZTEgX19hMSwgc2l6ZV90IF9fdTEsCisJICAgICAgIF9VSW50VHlwZTEgX19kMSwgc2l6ZV90IF9fczEsCisJICAgICAgIF9VSW50VHlwZTEgX19iMSwgc2l6ZV90IF9fdDEsCisJICAgICAgIF9VSW50VHlwZTEgX19jMSwgc2l6ZV90IF9fbDEsIF9VSW50VHlwZTEgX19mMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBzdGQ6Om1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZTEsIF9fdzEsIF9fbjEsIF9fbTEsCisJCSAgIF9fcjEsIF9fYTEsIF9fdTEsIF9fZDEsIF9fczEsIF9fYjEsIF9fdDEsIF9fYzEsCisJCSAgIF9fbDEsIF9fZjE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQgX01fZ2VuX3JhbmQoKTsKKworICAgICAgX1VJbnRUeXBlIF9NX3hbc3RhdGVfc2l6ZV07CisgICAgICBzaXplX3QgICAgX01fcDsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgQ29tcGFyZXMgdHdvICUgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICogICAgICAgIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBmb3IgaW5lcXVhbGl0eS4KKyAgICoKKyAgICogQHBhcmFtIF9fbGhzIEEgJSBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAlIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lIHJhbmRvbSBudW1iZXIKKyAgICogICAgICAgICAgICAgIGdlbmVyYXRvciBvYmplY3QuCisgICAqCisgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGluZmluaXRlIHNlcXVlbmNlcyBvZiBnZW5lcmF0ZWQgdmFsdWVzCisgICAqICAgICAgICAgIHdvdWxkIGJlIGRpZmZlcmVudCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LAorCSAgIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LAorCSAgIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsIF9VSW50VHlwZSBfX2Y+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6bWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLAorCSAgICAgICBfX3IsIF9fYSwgX191LCBfX2QsIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3RkOjptZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sCisJICAgICAgIF9fciwgX19hLCBfX3UsIF9fZCwgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKworICAvKioKKyAgICogQGJyaWVmIFRoZSBNYXJzYWdsaWEtWmFtYW4gZ2VuZXJhdG9yLgorICAgKgorICAgKiBUaGlzIGlzIGEgbW9kZWwgb2YgYSBHZW5lcmFsaXplZCBGaWJvbmFjY2kgZGlzY3JldGUgcmFuZG9tIG51bWJlcgorICAgKiBnZW5lcmF0b3IsIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyB0aGUgU1dDIGdlbmVyYXRvci4KKyAgICoKKyAgICogQSBkaXNjcmV0ZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB0aGF0IHByb2R1Y2VzIHBzZXVkb3JhbmRvbQorICAgKiBudW1iZXJzIHVzaW5nOgorICAgKiBAZlsKKyAgICogICAgIHhfe2l9XGxlZnRhcnJvdyh4X3tpIC0gc30gLSB4X3tpIC0gcn0gLSBjYXJyeV97aS0xfSkgXGJtb2QgbSAKKyAgICogQGZdCisgICAqCisgICAqIFRoZSBzaXplIG9mIHRoZSBzdGF0ZSBpcyBAZiRyQGYkCisgICAqIGFuZCB0aGUgbWF4aW11bSBwZXJpb2Qgb2YgdGhlIGdlbmVyYXRvciBpcyBAZiQobV5yIC0gbV5zIC0gMSlAZiQuCisgICAqCisgICAqIEB2YXIgX01feCAgICAgVGhlIHN0YXRlIG9mIHRoZSBnZW5lcmF0b3IuICBUaGlzIGlzIGEgcmluZyBidWZmZXIuCisgICAqIEB2YXIgX01fY2FycnkgVGhlIGNhcnJ5LgorICAgKiBAdmFyIF9NX3AgICAgIEN1cnJlbnQgaW5kZXggb2YgeChpIC0gcikuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX3MsIHNpemVfdCBfX3I+CisgICAgY2xhc3Mgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdW5zaWduZWQ8X1VJbnRUeXBlPjo6dmFsdWUsICJ0ZW1wbGF0ZSBhcmd1bWVudCAiCisJCSAgICAic3Vic3RpdHV0aW5nIF9VSW50VHlwZSBub3QgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSIpOworICAgICAgc3RhdGljX2Fzc2VydCgwdSA8IF9fcyAmJiBfX3MgPCBfX3IsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgc3Vic3RpdHV0aW5nIF9fcyBvdXQgb2YgYm91bmRzIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KDB1IDwgX193ICYmIF9fdyA8PSBzdGQ6Om51bWVyaWNfbGltaXRzPF9VSW50VHlwZT46OmRpZ2l0cywKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgX193IG91dCBvZiBib3VuZHMiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSB2YWx1ZS4gKi8KKyAgICAgIHR5cGVkZWYgX1VJbnRUeXBlIHJlc3VsdF90eXBlOworCisgICAgICAvLyBwYXJhbWV0ZXIgdmFsdWVzCisgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCAgICAgIHdvcmRfc2l6ZSAgICA9IF9fdzsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90ICAgICAgc2hvcnRfbGFnICAgID0gX19zOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgICAgICBsb25nX2xhZyAgICAgPSBfX3I7CisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIGRlZmF1bHRfc2VlZCA9IDE5NzgwNTAzdTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhbiBleHBsaWNpdGx5IHNlZWRlZCAlIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lCisgICAgICAgKiAgICAgICAgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZShyZXN1bHRfdHlwZSBfX3NkID0gZGVmYXVsdF9zZWVkKQorICAgICAgeyBzZWVkKF9fc2QpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSAlc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUgcmFuZG9tIG51bWJlciBlbmdpbmUKKyAgICAgICAqICAgICAgICBzZWVkZWQgZnJvbSB0aGUgc2VlZCBzZXF1ZW5jZSBAcCBfX3EuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcSB0aGUgc2VlZCBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXEsIHR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfc2FtZTxfU3NlcSwgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU+Ojp2YWx1ZT4KKwkgICAgICAgOjp0eXBlPgorICAgICAgICBleHBsaWNpdAorICAgICAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZShfU3NlcSYgX19xKQorICAgICAgICB7IHNlZWQoX19xKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZWVkcyB0aGUgaW5pdGlhbCBzdGF0ZSBAZiR4XzBAZiQgb2YgdGhlIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICBnZW5lcmF0b3IuCisgICAgICAgKgorICAgICAgICogTjE2ODhbNC4xOV0gbW9kaWZpZXMgdGhpcyBhcyBmb2xsb3dzLiAgSWYgQHAgX192YWx1ZSA9PSAwLAorICAgICAgICogc2V0cyB2YWx1ZSB0byAxOTc4MDUwMy4gIEluIGFueSBjYXNlLCB3aXRoIGEgbGluZWFyCisgICAgICAgKiBjb25ncnVlbnRpYWwgZ2VuZXJhdG9yIGxjZyhpKSBoYXZpbmcgcGFyYW1ldGVycyBAZiQgbV97bGNnfSA9CisgICAgICAgKiAyMTQ3NDgzNTYzLCBhX3tsY2d9ID0gNDAwMTQsIGNfe2xjZ30gPSAwLCBhbmQgbGNnKDApID0gdmFsdWUKKyAgICAgICAqIEBmJCwgc2V0cyBAZiQgeF97LXJ9IFxkb3RzIHhfey0xfSBAZiQgdG8gQGYkIGxjZygxKSBcYm1vZCBtCisgICAgICAgKiBcZG90cyBsY2cocikgXGJtb2QgbSBAZiQgcmVzcGVjdGl2ZWx5LiAgSWYgQGYkIHhfey0xfSA9IDAgQGYkCisgICAgICAgKiBzZXQgY2FycnkgdG8gMSwgb3RoZXJ3aXNlIHNldHMgY2FycnkgdG8gMC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc2VlZChyZXN1bHRfdHlwZSBfX3NkID0gZGVmYXVsdF9zZWVkKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2VlZHMgdGhlIGluaXRpYWwgc3RhdGUgQGYkeF8wQGYkIG9mIHRoZQorICAgICAgICogJSBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXE+CisJdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jbGFzczxfU3NlcT46OnZhbHVlPjo6dHlwZQorICAgICAgICBzZWVkKF9Tc2VxJiBfX3EpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBpbmNsdXNpdmUgbWluaW11bSB2YWx1ZSBvZiB0aGUgcmFuZ2Ugb2YgcmFuZG9tCisgICAgICAgKiBpbnRlZ2VycyByZXR1cm5lZCBieSB0aGlzIGdlbmVyYXRvci4KKyAgICAgICAqLworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZQorICAgICAgbWluKCkKKyAgICAgIHsgcmV0dXJuIDA7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgaW5jbHVzaXZlIG1heGltdW0gdmFsdWUgb2YgdGhlIHJhbmdlIG9mIHJhbmRvbQorICAgICAgICogaW50ZWdlcnMgcmV0dXJuZWQgYnkgdGhpcyBnZW5lcmF0b3IuCisgICAgICAgKi8KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpCisgICAgICB7IHJldHVybiBfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgX193Pjo6X192YWx1ZSAtIDE7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRGlzY2FyZCBhIHNlcXVlbmNlIG9mIHJhbmRvbSBudW1iZXJzLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBkaXNjYXJkKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3opCisgICAgICB7CisJZm9yICg7IF9feiAhPSAwVUxMOyAtLV9feikKKwkgICgqdGhpcykoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbmV4dCByYW5kb20gbnVtYmVyIGluIHRoZSBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29tcGFyZXMgdHdvICUgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUgcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgIGdlbmVyYXRvciBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgZm9yIGVxdWFsaXR5LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2xocyBBICUgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAgICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAlIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICAgICAgICBnZW5lcmF0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGluZmluaXRlIHNlcXVlbmNlcyBvZiBnZW5lcmF0ZWQgdmFsdWVzCisgICAgICAgKiAgICAgICAgICB3b3VsZCBiZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lJiBfX2xocywKKwkJIGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lJiBfX3JocykKKyAgICAgIHsgcmV0dXJuIChzdGQ6OmVxdWFsKF9fbGhzLl9NX3gsIF9fbGhzLl9NX3ggKyBsb25nX2xhZywgX19yaHMuX01feCkKKwkJJiYgX19saHMuX01fY2FycnkgPT0gX19yaHMuX01fY2FycnkKKwkJJiYgX19saHMuX01fcCA9PSBfX3Jocy5fTV9wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZQorICAgICAgICogICAgICAgIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZSBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICogICAgICAgIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZTEsIHNpemVfdCBfX3cxLCBzaXplX3QgX19zMSwgc2l6ZV90IF9fcjEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJCSAgIGNvbnN0IHN0ZDo6c3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnRUeXBlMSwgX193MSwKKwkJICAgX19zMSwgX19yMT4mKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAlIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lCisgICAgICAgKiAgICAgICAgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgICAqICAgICAgICBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGV4dHJhY3RlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZTEsIHNpemVfdCBfX3cxLCBzaXplX3QgX19zMSwgc2l6ZV90IF9fcjEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJCSAgIHN0ZDo6c3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnRUeXBlMSwgX193MSwKKwkJICAgX19zMSwgX19yMT4mKTsKKworICAgIHByaXZhdGU6CisgICAgICBfVUludFR5cGUgIF9NX3hbbG9uZ19sYWddOworICAgICAgX1VJbnRUeXBlICBfTV9jYXJyeTsKKyAgICAgIHNpemVfdCAgICAgX01fcDsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgQ29tcGFyZXMgdHdvICUgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUgcmFuZG9tIG51bWJlcgorICAgKiAgICAgICAgZ2VuZXJhdG9yIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBmb3IgaW5lcXVhbGl0eS4KKyAgICoKKyAgICogQHBhcmFtIF9fbGhzIEEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAlIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lIHJhbmRvbSBudW1iZXIKKyAgICogICAgICAgICAgICAgIGdlbmVyYXRvciBvYmplY3QuCisgICAqCisgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGluZmluaXRlIHNlcXVlbmNlcyBvZiBnZW5lcmF0ZWQgdmFsdWVzCisgICAqICAgICAgICAgIHdvdWxkIGJlIGRpZmZlcmVudCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19zLCBzaXplX3QgX19yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OnN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50VHlwZSwgX193LAorCSAgICAgICBfX3MsIF9fcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzdGQ6OnN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50VHlwZSwgX193LAorCSAgICAgICBfX3MsIF9fcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKworICAvKioKKyAgICogUHJvZHVjZXMgcmFuZG9tIG51bWJlcnMgZnJvbSBzb21lIGJhc2UgZW5naW5lIGJ5IGRpc2NhcmRpbmcgYmxvY2tzIG9mCisgICAqIGRhdGEuCisgICAqCisgICAqIDAgPD0gQHAgX19yIDw9IEBwIF9fcAorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZSwgc2l6ZV90IF9fcCwgc2l6ZV90IF9fcj4KKyAgICBjbGFzcyBkaXNjYXJkX2Jsb2NrX2VuZ2luZQorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoMSA8PSBfX3IgJiYgX19yIDw9IF9fcCwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgX19yIG91dCBvZiBib3VuZHMiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSB2YWx1ZS4gKi8KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZTo6cmVzdWx0X3R5cGUgcmVzdWx0X3R5cGU7CisKKyAgICAgIC8vIHBhcmFtZXRlciB2YWx1ZXMKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGJsb2NrX3NpemUgPSBfX3A7CisgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCB1c2VkX2Jsb2NrID0gX19yOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgZGVmYXVsdCAlZGlzY2FyZF9ibG9ja19lbmdpbmUgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIFRoZSB1bmRlcmx5aW5nIGVuZ2luZSBpcyBkZWZhdWx0IGNvbnN0cnVjdGVkIGFzIHdlbGwuCisgICAgICAgKi8KKyAgICAgIGRpc2NhcmRfYmxvY2tfZW5naW5lKCkKKyAgICAgIDogX01fYigpLCBfTV9uKDApIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb3B5IGNvbnN0cnVjdHMgYSAlZGlzY2FyZF9ibG9ja19lbmdpbmUgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIENvcGllcyBhbiBleGlzdGluZyBiYXNlIGNsYXNzIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICogQHBhcmFtIF9fcm5nIEFuIGV4aXN0aW5nIChiYXNlIGNsYXNzKSBlbmdpbmUgb2JqZWN0LgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgZGlzY2FyZF9ibG9ja19lbmdpbmUoY29uc3QgX1JhbmRvbU51bWJlckVuZ2luZSYgX19ybmcpCisgICAgICA6IF9NX2IoX19ybmcpLCBfTV9uKDApIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBNb3ZlIGNvbnN0cnVjdHMgYSAlZGlzY2FyZF9ibG9ja19lbmdpbmUgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIENvcGllcyBhbiBleGlzdGluZyBiYXNlIGNsYXNzIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICogQHBhcmFtIF9fcm5nIEFuIGV4aXN0aW5nIChiYXNlIGNsYXNzKSBlbmdpbmUgb2JqZWN0LgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgZGlzY2FyZF9ibG9ja19lbmdpbmUoX1JhbmRvbU51bWJlckVuZ2luZSYmIF9fcm5nKQorICAgICAgOiBfTV9iKHN0ZDo6bW92ZShfX3JuZykpLCBfTV9uKDApIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZWVkIGNvbnN0cnVjdHMgYSAlZGlzY2FyZF9ibG9ja19lbmdpbmUgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIENvbnN0cnVjdHMgdGhlIHVuZGVybHlpbmcgZ2VuZXJhdG9yIGVuZ2luZSBzZWVkZWQgd2l0aCBAcCBfX3MuCisgICAgICAgKiBAcGFyYW0gX19zIEEgc2VlZCB2YWx1ZSBmb3IgdGhlIGJhc2UgY2xhc3MgZW5naW5lLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgZGlzY2FyZF9ibG9ja19lbmdpbmUocmVzdWx0X3R5cGUgX19zKQorICAgICAgOiBfTV9iKF9fcyksIF9NX24oMCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRvciBjb25zdHJ1Y3QgYSAlZGlzY2FyZF9ibG9ja19lbmdpbmUgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX3EgQSBzZWVkIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3NlcSwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCXN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX3NhbWU8X1NzZXEsIGRpc2NhcmRfYmxvY2tfZW5naW5lPjo6dmFsdWUKKwkJICAgICAgICYmICFzdGQ6OmlzX3NhbWU8X1NzZXEsIF9SYW5kb21OdW1iZXJFbmdpbmU+Ojp2YWx1ZT4KKwkgICAgICAgOjp0eXBlPgorICAgICAgICBleHBsaWNpdAorICAgICAgICBkaXNjYXJkX2Jsb2NrX2VuZ2luZShfU3NlcSYgX19xKQorCTogX01fYihfX3EpLCBfTV9uKDApCisgICAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNlZWRzIHRoZSAlZGlzY2FyZF9ibG9ja19lbmdpbmUgb2JqZWN0IHdpdGggdGhlIGRlZmF1bHQKKyAgICAgICAqICAgICAgICBzZWVkIGZvciB0aGUgdW5kZXJseWluZyBiYXNlIGNsYXNzIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHNlZWQoKQorICAgICAgeworCV9NX2Iuc2VlZCgpOworCV9NX24gPSAwOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNlZWRzIHRoZSAlZGlzY2FyZF9ibG9ja19lbmdpbmUgb2JqZWN0IHdpdGggdGhlIGRlZmF1bHQKKyAgICAgICAqICAgICAgICBzZWVkIGZvciB0aGUgdW5kZXJseWluZyBiYXNlIGNsYXNzIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHNlZWQocmVzdWx0X3R5cGUgX19zKQorICAgICAgeworCV9NX2Iuc2VlZChfX3MpOworCV9NX24gPSAwOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNlZWRzIHRoZSAlZGlzY2FyZF9ibG9ja19lbmdpbmUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHNlZWQKKyAgICAgICAqICAgICAgICBzZXF1ZW5jZS4KKyAgICAgICAqIEBwYXJhbSBfX3EgQSBzZWVkIGdlbmVyYXRvciBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXE+CisgICAgICAgIHZvaWQKKyAgICAgICAgc2VlZChfU3NlcSYgX19xKQorICAgICAgICB7CisJICBfTV9iLnNlZWQoX19xKTsKKwkgIF9NX24gPSAwOworCX0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBnZW5lcmF0b3IgZW5naW5lCisgICAgICAgKiAgICAgICAgb2JqZWN0LgorICAgICAgICovCisgICAgICBjb25zdCBfUmFuZG9tTnVtYmVyRW5naW5lJgorICAgICAgYmFzZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9iOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG1pbmltdW0gdmFsdWUgaW4gdGhlIGdlbmVyYXRlZCByYW5kb20gbnVtYmVyIHJhbmdlLgorICAgICAgICovCisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlCisgICAgICBtaW4oKQorICAgICAgeyByZXR1cm4gX1JhbmRvbU51bWJlckVuZ2luZTo6bWluKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbWF4aW11bSB2YWx1ZSBpbiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSBudW1iZXIgcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpCisgICAgICB7IHJldHVybiBfUmFuZG9tTnVtYmVyRW5naW5lOjptYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBEaXNjYXJkIGEgc2VxdWVuY2Ugb2YgcmFuZG9tIG51bWJlcnMuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGRpc2NhcmQodW5zaWduZWQgbG9uZyBsb25nIF9feikKKyAgICAgIHsKKwlmb3IgKDsgX196ICE9IDBVTEw7IC0tX196KQorCSAgKCp0aGlzKSgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBuZXh0IHZhbHVlIGluIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIG51bWJlciBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29tcGFyZXMgdHdvICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBmb3IgZXF1YWxpdHkuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fbGhzIEEgJWRpc2NhcmRfYmxvY2tfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICAgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbmZpbml0ZSBzZXF1ZW5jZXMgb2YgZ2VuZXJhdGVkIHZhbHVlcworICAgICAgICogICAgICAgICAgd291bGQgYmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgZGlzY2FyZF9ibG9ja19lbmdpbmUmIF9fbGhzLAorCQkgY29uc3QgZGlzY2FyZF9ibG9ja19lbmdpbmUmIF9fcmhzKQorICAgICAgeyByZXR1cm4gX19saHMuX01fYiA9PSBfX3Jocy5fTV9iICYmIF9fbGhzLl9NX24gPT0gX19yaHMuX01fbjsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgJWRpc2NhcmRfYmxvY2tfZW5naW5lIHJhbmRvbQorICAgICAgICogICAgICAgIG51bWJlciBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICAgKiAgICAgICAgQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlZGlzY2FyZF9ibG9ja19lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUxLCBzaXplX3QgX19wMSwgc2l6ZV90IF9fcjEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3Qgc3RkOjpkaXNjYXJkX2Jsb2NrX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lMSwKKwkJICAgX19wMSwgX19yMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEV4dHJhY3RzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZQorICAgICAgICogICAgICAgIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZSBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgKiAgICAgICAgQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggZXh0cmFjdGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZTEsIHNpemVfdCBfX3AxLCBzaXplX3QgX19yMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBzdGQ6OmRpc2NhcmRfYmxvY2tfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUxLAorCQkgICBfX3AxLCBfX3IxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICBfUmFuZG9tTnVtYmVyRW5naW5lIF9NX2I7CisgICAgICBzaXplX3QgX01fbjsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgQ29tcGFyZXMgdHdvICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgKiAgICAgICAgb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGZvciBpbmVxdWFsaXR5LgorICAgKgorICAgKiBAcGFyYW0gX19saHMgQSAlZGlzY2FyZF9ibG9ja19lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0LgorICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAlZGlzY2FyZF9ibG9ja19lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICoKKyAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5maW5pdGUgc2VxdWVuY2VzIG9mIGdlbmVyYXRlZCB2YWx1ZXMKKyAgICogICAgICAgICAgd291bGQgYmUgZGlmZmVyZW50LCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lLCBzaXplX3QgX19wLCBzaXplX3QgX19yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OmRpc2NhcmRfYmxvY2tfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUsIF9fcCwKKwkgICAgICAgX19yPiYgX19saHMsCisJICAgICAgIGNvbnN0IHN0ZDo6ZGlzY2FyZF9ibG9ja19lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZSwgX19wLAorCSAgICAgICBfX3I+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisKKyAgLyoqCisgICAqIFByb2R1Y2VzIHJhbmRvbSBudW1iZXJzIGJ5IGNvbWJpbmluZyByYW5kb20gbnVtYmVycyBmcm9tIHNvbWUgYmFzZQorICAgKiBlbmdpbmUgdG8gcHJvZHVjZSByYW5kb20gbnVtYmVycyB3aXRoIGEgc3BlY2lmaWVzIG51bWJlciBvZiBiaXRzIEBwIF9fdy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUsIHNpemVfdCBfX3csIHR5cGVuYW1lIF9VSW50VHlwZT4KKyAgICBjbGFzcyBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZQorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc191bnNpZ25lZDxfVUludFR5cGU+Ojp2YWx1ZSwgInRlbXBsYXRlIGFyZ3VtZW50ICIKKwkJICAgICJzdWJzdGl0dXRpbmcgX1VJbnRUeXBlIG5vdCBhbiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KDB1IDwgX193ICYmIF9fdyA8PSBzdGQ6Om51bWVyaWNfbGltaXRzPF9VSW50VHlwZT46OmRpZ2l0cywKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgX193IG91dCBvZiBib3VuZHMiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSB2YWx1ZS4gKi8KKyAgICAgIHR5cGVkZWYgX1VJbnRUeXBlIHJlc3VsdF90eXBlOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgZGVmYXVsdCAlaW5kZXBlbmRlbnRfYml0c19lbmdpbmUgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIFRoZSB1bmRlcmx5aW5nIGVuZ2luZSBpcyBkZWZhdWx0IGNvbnN0cnVjdGVkIGFzIHdlbGwuCisgICAgICAgKi8KKyAgICAgIGluZGVwZW5kZW50X2JpdHNfZW5naW5lKCkKKyAgICAgIDogX01fYigpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb3B5IGNvbnN0cnVjdHMgYSAlaW5kZXBlbmRlbnRfYml0c19lbmdpbmUgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIENvcGllcyBhbiBleGlzdGluZyBiYXNlIGNsYXNzIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICogQHBhcmFtIF9fcm5nIEFuIGV4aXN0aW5nIChiYXNlIGNsYXNzKSBlbmdpbmUgb2JqZWN0LgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgaW5kZXBlbmRlbnRfYml0c19lbmdpbmUoY29uc3QgX1JhbmRvbU51bWJlckVuZ2luZSYgX19ybmcpCisgICAgICA6IF9NX2IoX19ybmcpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBNb3ZlIGNvbnN0cnVjdHMgYSAlaW5kZXBlbmRlbnRfYml0c19lbmdpbmUgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIENvcGllcyBhbiBleGlzdGluZyBiYXNlIGNsYXNzIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICogQHBhcmFtIF9fcm5nIEFuIGV4aXN0aW5nIChiYXNlIGNsYXNzKSBlbmdpbmUgb2JqZWN0LgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgaW5kZXBlbmRlbnRfYml0c19lbmdpbmUoX1JhbmRvbU51bWJlckVuZ2luZSYmIF9fcm5nKQorICAgICAgOiBfTV9iKHN0ZDo6bW92ZShfX3JuZykpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZWVkIGNvbnN0cnVjdHMgYSAlaW5kZXBlbmRlbnRfYml0c19lbmdpbmUgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIENvbnN0cnVjdHMgdGhlIHVuZGVybHlpbmcgZ2VuZXJhdG9yIGVuZ2luZSBzZWVkZWQgd2l0aCBAcCBfX3MuCisgICAgICAgKiBAcGFyYW0gX19zIEEgc2VlZCB2YWx1ZSBmb3IgdGhlIGJhc2UgY2xhc3MgZW5naW5lLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgaW5kZXBlbmRlbnRfYml0c19lbmdpbmUocmVzdWx0X3R5cGUgX19zKQorICAgICAgOiBfTV9iKF9fcykgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRvciBjb25zdHJ1Y3QgYSAlaW5kZXBlbmRlbnRfYml0c19lbmdpbmUgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX3EgQSBzZWVkIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3NlcSwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCXN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX3NhbWU8X1NzZXEsIGluZGVwZW5kZW50X2JpdHNfZW5naW5lPjo6dmFsdWUKKwkJICAgICAgICYmICFzdGQ6OmlzX3NhbWU8X1NzZXEsIF9SYW5kb21OdW1iZXJFbmdpbmU+Ojp2YWx1ZT4KKyAgICAgICAgICAgICAgIDo6dHlwZT4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgaW5kZXBlbmRlbnRfYml0c19lbmdpbmUoX1NzZXEmIF9fcSkKKyAgICAgICAgOiBfTV9iKF9fcSkKKyAgICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2VlZHMgdGhlICVpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSBvYmplY3Qgd2l0aCB0aGUgZGVmYXVsdAorICAgICAgICogICAgICAgIHNlZWQgZm9yIHRoZSB1bmRlcmx5aW5nIGJhc2UgY2xhc3MgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc2VlZCgpCisgICAgICB7IF9NX2Iuc2VlZCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2VlZHMgdGhlICVpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSBvYmplY3Qgd2l0aCB0aGUgZGVmYXVsdAorICAgICAgICogICAgICAgIHNlZWQgZm9yIHRoZSB1bmRlcmx5aW5nIGJhc2UgY2xhc3MgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc2VlZChyZXN1bHRfdHlwZSBfX3MpCisgICAgICB7IF9NX2Iuc2VlZChfX3MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2VlZHMgdGhlICVpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4KKyAgICAgICAqICAgICAgICBzZWVkIHNlcXVlbmNlLgorICAgICAgICogQHBhcmFtIF9fcSBBIHNlZWQgZ2VuZXJhdG9yIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3NlcT4KKyAgICAgICAgdm9pZAorICAgICAgICBzZWVkKF9Tc2VxJiBfX3EpCisgICAgICAgIHsgX01fYi5zZWVkKF9fcSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBnZW5lcmF0b3IgZW5naW5lCisgICAgICAgKiAgICAgICAgb2JqZWN0LgorICAgICAgICovCisgICAgICBjb25zdCBfUmFuZG9tTnVtYmVyRW5naW5lJgorICAgICAgYmFzZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9iOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG1pbmltdW0gdmFsdWUgaW4gdGhlIGdlbmVyYXRlZCByYW5kb20gbnVtYmVyIHJhbmdlLgorICAgICAgICovCisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlCisgICAgICBtaW4oKQorICAgICAgeyByZXR1cm4gMFU7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbWF4aW11bSB2YWx1ZSBpbiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSBudW1iZXIgcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpCisgICAgICB7IHJldHVybiBfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgX193Pjo6X192YWx1ZSAtIDE7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRGlzY2FyZCBhIHNlcXVlbmNlIG9mIHJhbmRvbSBudW1iZXJzLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBkaXNjYXJkKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3opCisgICAgICB7CisJZm9yICg7IF9feiAhPSAwVUxMOyAtLV9feikKKwkgICgqdGhpcykoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbmV4dCB2YWx1ZSBpbiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSBudW1iZXIgc2VxdWVuY2UuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBvcGVyYXRvcigpKCk7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbXBhcmVzIHR3byAlaW5kZXBlbmRlbnRfYml0c19lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBmb3IgZXF1YWxpdHkuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fbGhzIEEgJWluZGVwZW5kZW50X2JpdHNfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgJWluZGVwZW5kZW50X2JpdHNfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGluZmluaXRlIHNlcXVlbmNlcyBvZiBnZW5lcmF0ZWQgdmFsdWVzCisgICAgICAgKiAgICAgICAgICB3b3VsZCBiZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSYgX19saHMsCisJCSBjb25zdCBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSYgX19yaHMpCisgICAgICB7IHJldHVybiBfX2xocy5fTV9iID09IF9fcmhzLl9NX2I7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAlIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lCisgICAgICAgKiAgICAgICAgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgICAqICAgICAgICBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWluZGVwZW5kZW50X2JpdHNfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggZXh0cmFjdGVkIG9yIGluCisgICAgICAgKiAgICAgICAgICBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBzdGQ6OmluZGVwZW5kZW50X2JpdHNfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUsCisJCSAgIF9fdywgX1VJbnRUeXBlPiYgX194KQorCXsKKwkgIF9faXMgPj4gX194Ll9NX2I7CisJICByZXR1cm4gX19pczsKKwl9CisKKyAgICBwcml2YXRlOgorICAgICAgX1JhbmRvbU51bWJlckVuZ2luZSBfTV9iOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBDb21wYXJlcyB0d28gJWluZGVwZW5kZW50X2JpdHNfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAqIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBmb3IgaW5lcXVhbGl0eS4KKyAgICoKKyAgICogQHBhcmFtIF9fbGhzIEEgJWluZGVwZW5kZW50X2JpdHNfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICVpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgKgorICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbmZpbml0ZSBzZXF1ZW5jZXMgb2YgZ2VuZXJhdGVkIHZhbHVlcworICAgKiAgICAgICAgICB3b3VsZCBiZSBkaWZmZXJlbnQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUsIHNpemVfdCBfX3csIHR5cGVuYW1lIF9VSW50VHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjppbmRlcGVuZGVudF9iaXRzX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLCBfX3csCisJICAgICAgIF9VSW50VHlwZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzdGQ6OmluZGVwZW5kZW50X2JpdHNfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUsIF9fdywKKwkgICAgICAgX1VJbnRUeXBlPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIEluc2VydHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAlaW5kZXBlbmRlbnRfYml0c19lbmdpbmUgcmFuZG9tCisgICAqICAgICAgICBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZSBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgKgorICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgKiBAcGFyYW0gX194ICBBICVpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAqCisgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgKiAgICAgICAgICBhbiBlcnJvciBzdGF0ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUsIHNpemVfdCBfX3csIHR5cGVuYW1lIF9VSW50VHlwZSwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3Qgc3RkOjppbmRlcGVuZGVudF9iaXRzX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLAorCSAgICAgICBfX3csIF9VSW50VHlwZT4mIF9feCkKKyAgICB7CisgICAgICBfX29zIDw8IF9feC5iYXNlKCk7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKworICAvKioKKyAgICogQGJyaWVmIFByb2R1Y2VzIHJhbmRvbSBudW1iZXJzIGJ5IGNvbWJpbmluZyByYW5kb20gbnVtYmVycyBmcm9tIHNvbWUKKyAgICogYmFzZSBlbmdpbmUgdG8gcHJvZHVjZSByYW5kb20gbnVtYmVycyB3aXRoIGEgc3BlY2lmaWVzIG51bWJlciBvZiBiaXRzCisgICAqIEBwIF9fdy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUsIHNpemVfdCBfX2s+CisgICAgY2xhc3Mgc2h1ZmZsZV9vcmRlcl9lbmdpbmUKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KDF1IDw9IF9faywgInRlbXBsYXRlIGFyZ3VtZW50IHN1YnN0aXR1dGluZyAiCisJCSAgICAiX19rIG91dCBvZiBib3VuZCIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIHZhbHVlLiAqLworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgdGFibGVfc2l6ZSA9IF9fazsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhIGRlZmF1bHQgJXNodWZmbGVfb3JkZXJfZW5naW5lIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBUaGUgdW5kZXJseWluZyBlbmdpbmUgaXMgZGVmYXVsdCBjb25zdHJ1Y3RlZCBhcyB3ZWxsLgorICAgICAgICovCisgICAgICBzaHVmZmxlX29yZGVyX2VuZ2luZSgpCisgICAgICA6IF9NX2IoKQorICAgICAgeyBfTV9pbml0aWFsaXplKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29weSBjb25zdHJ1Y3RzIGEgJXNodWZmbGVfb3JkZXJfZW5naW5lIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBDb3BpZXMgYW4gZXhpc3RpbmcgYmFzZSBjbGFzcyByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICAgICAqIEBwYXJhbSBfX3JuZyBBbiBleGlzdGluZyAoYmFzZSBjbGFzcykgZW5naW5lIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHNodWZmbGVfb3JkZXJfZW5naW5lKGNvbnN0IF9SYW5kb21OdW1iZXJFbmdpbmUmIF9fcm5nKQorICAgICAgOiBfTV9iKF9fcm5nKQorICAgICAgeyBfTV9pbml0aWFsaXplKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgTW92ZSBjb25zdHJ1Y3RzIGEgJXNodWZmbGVfb3JkZXJfZW5naW5lIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBDb3BpZXMgYW4gZXhpc3RpbmcgYmFzZSBjbGFzcyByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICAgICAqIEBwYXJhbSBfX3JuZyBBbiBleGlzdGluZyAoYmFzZSBjbGFzcykgZW5naW5lIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHNodWZmbGVfb3JkZXJfZW5naW5lKF9SYW5kb21OdW1iZXJFbmdpbmUmJiBfX3JuZykKKyAgICAgIDogX01fYihzdGQ6Om1vdmUoX19ybmcpKQorICAgICAgeyBfTV9pbml0aWFsaXplKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2VlZCBjb25zdHJ1Y3RzIGEgJXNodWZmbGVfb3JkZXJfZW5naW5lIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBDb25zdHJ1Y3RzIHRoZSB1bmRlcmx5aW5nIGdlbmVyYXRvciBlbmdpbmUgc2VlZGVkIHdpdGggQHAgX19zLgorICAgICAgICogQHBhcmFtIF9fcyBBIHNlZWQgdmFsdWUgZm9yIHRoZSBiYXNlIGNsYXNzIGVuZ2luZS4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHNodWZmbGVfb3JkZXJfZW5naW5lKHJlc3VsdF90eXBlIF9fcykKKyAgICAgIDogX01fYihfX3MpCisgICAgICB7IF9NX2luaXRpYWxpemUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0b3IgY29uc3RydWN0IGEgJXNodWZmbGVfb3JkZXJfZW5naW5lIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19xIEEgc2VlZCBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXEsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwlzdGQ6OmVuYWJsZV9pZjwhc3RkOjppc19zYW1lPF9Tc2VxLCBzaHVmZmxlX29yZGVyX2VuZ2luZT46OnZhbHVlCisJCSAgICAgICAmJiAhc3RkOjppc19zYW1lPF9Tc2VxLCBfUmFuZG9tTnVtYmVyRW5naW5lPjo6dmFsdWU+CisJICAgICAgIDo6dHlwZT4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgc2h1ZmZsZV9vcmRlcl9lbmdpbmUoX1NzZXEmIF9fcSkKKyAgICAgICAgOiBfTV9iKF9fcSkKKyAgICAgICAgeyBfTV9pbml0aWFsaXplKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZWVkcyB0aGUgJXNodWZmbGVfb3JkZXJfZW5naW5lIG9iamVjdCB3aXRoIHRoZSBkZWZhdWx0IHNlZWQKKyAgICAgICAgICAgICAgICBmb3IgdGhlIHVuZGVybHlpbmcgYmFzZSBjbGFzcyBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzZWVkKCkKKyAgICAgIHsKKwlfTV9iLnNlZWQoKTsKKwlfTV9pbml0aWFsaXplKCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2VlZHMgdGhlICVzaHVmZmxlX29yZGVyX2VuZ2luZSBvYmplY3Qgd2l0aCB0aGUgZGVmYXVsdCBzZWVkCisgICAgICAgKiAgICAgICAgZm9yIHRoZSB1bmRlcmx5aW5nIGJhc2UgY2xhc3MgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc2VlZChyZXN1bHRfdHlwZSBfX3MpCisgICAgICB7CisJX01fYi5zZWVkKF9fcyk7CisJX01faW5pdGlhbGl6ZSgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNlZWRzIHRoZSAlc2h1ZmZsZV9vcmRlcl9lbmdpbmUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHNlZWQKKyAgICAgICAqICAgICAgICBzZXF1ZW5jZS4KKyAgICAgICAqIEBwYXJhbSBfX3EgQSBzZWVkIGdlbmVyYXRvciBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXE+CisgICAgICAgIHZvaWQKKyAgICAgICAgc2VlZChfU3NlcSYgX19xKQorICAgICAgICB7CisJICBfTV9iLnNlZWQoX19xKTsKKwkgIF9NX2luaXRpYWxpemUoKTsKKwl9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBnZW5lcmF0b3IgZW5naW5lIG9iamVjdC4KKyAgICAgICAqLworICAgICAgY29uc3QgX1JhbmRvbU51bWJlckVuZ2luZSYKKyAgICAgIGJhc2UoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fYjsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIG1pbmltdW0gdmFsdWUgaW4gdGhlIGdlbmVyYXRlZCByYW5kb20gbnVtYmVyIHJhbmdlLgorICAgICAgICovCisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlCisgICAgICBtaW4oKQorICAgICAgeyByZXR1cm4gX1JhbmRvbU51bWJlckVuZ2luZTo6bWluKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHZhbHVlIGluIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIG51bWJlciByYW5nZS4KKyAgICAgICAqLworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZQorICAgICAgbWF4KCkKKyAgICAgIHsgcmV0dXJuIF9SYW5kb21OdW1iZXJFbmdpbmU6Om1heCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogRGlzY2FyZCBhIHNlcXVlbmNlIG9mIHJhbmRvbSBudW1iZXJzLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBkaXNjYXJkKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3opCisgICAgICB7CisJZm9yICg7IF9feiAhPSAwVUxMOyAtLV9feikKKwkgICgqdGhpcykoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBuZXh0IHZhbHVlIGluIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIG51bWJlciBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoKTsKKworICAgICAgLyoqCisgICAgICAgKiBDb21wYXJlcyB0d28gJXNodWZmbGVfb3JkZXJfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdHMKKyAgICAgICAqIG9mIHRoZSBzYW1lIHR5cGUgZm9yIGVxdWFsaXR5LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2xocyBBICVzaHVmZmxlX29yZGVyX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3QuCisgICAgICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAlc2h1ZmZsZV9vcmRlcl9lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5maW5pdGUgc2VxdWVuY2VzIG9mIGdlbmVyYXRlZCB2YWx1ZXMKKyAgICAgICAqICAgICAgICAgIHdvdWxkIGJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3Qgc2h1ZmZsZV9vcmRlcl9lbmdpbmUmIF9fbGhzLAorCQkgY29uc3Qgc2h1ZmZsZV9vcmRlcl9lbmdpbmUmIF9fcmhzKQorICAgICAgeyByZXR1cm4gKF9fbGhzLl9NX2IgPT0gX19yaHMuX01fYgorCQkmJiBzdGQ6OmVxdWFsKF9fbGhzLl9NX3YsIF9fbGhzLl9NX3YgKyBfX2ssIF9fcmhzLl9NX3YpCisJCSYmIF9fbGhzLl9NX3kgPT0gX19yaHMuX01feSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhICVzaHVmZmxlX29yZGVyX2VuZ2luZSByYW5kb20KKyAgICAgICAqICAgICAgICBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZSBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbQorCUBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJXNodWZmbGVfb3JkZXJfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lMSwgc2l6ZV90IF9fazEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3Qgc3RkOjpzaHVmZmxlX29yZGVyX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lMSwKKwkJICAgX19rMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEV4dHJhY3RzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZQorICAgICAgICogICAgICAgIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZSBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgKiAgICAgICAgQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVzaHVmZmxlX29yZGVyX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggZXh0cmFjdGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZTEsIHNpemVfdCBfX2sxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIHN0ZDo6c2h1ZmZsZV9vcmRlcl9lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZTEsIF9fazE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQgX01faW5pdGlhbGl6ZSgpCisgICAgICB7CisJZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19rOyArK19faSkKKwkgIF9NX3ZbX19pXSA9IF9NX2IoKTsKKwlfTV95ID0gX01fYigpOworICAgICAgfQorCisgICAgICBfUmFuZG9tTnVtYmVyRW5naW5lIF9NX2I7CisgICAgICByZXN1bHRfdHlwZSBfTV92W19fa107CisgICAgICByZXN1bHRfdHlwZSBfTV95OworICAgIH07CisKKyAgLyoqCisgICAqIENvbXBhcmVzIHR3byAlc2h1ZmZsZV9vcmRlcl9lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0cworICAgKiBvZiB0aGUgc2FtZSB0eXBlIGZvciBpbmVxdWFsaXR5LgorICAgKgorICAgKiBAcGFyYW0gX19saHMgQSAlc2h1ZmZsZV9vcmRlcl9lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0LgorICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAlc2h1ZmZsZV9vcmRlcl9lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICoKKyAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5maW5pdGUgc2VxdWVuY2VzIG9mIGdlbmVyYXRlZCB2YWx1ZXMKKyAgICogICAgICAgICAgd291bGQgYmUgZGlmZmVyZW50LCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lLCBzaXplX3QgX19rPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OnNodWZmbGVfb3JkZXJfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUsCisJICAgICAgIF9faz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzdGQ6OnNodWZmbGVfb3JkZXJfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUsCisJICAgICAgIF9faz4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKworICAvKioKKyAgICogVGhlIGNsYXNzaWMgTWluaW11bSBTdGFuZGFyZCByYW5kMCBvZiBMZXdpcywgR29vZG1hbiwgYW5kIE1pbGxlci4KKyAgICovCisgIHR5cGVkZWYgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8dWludF9mYXN0MzJfdCwgMTY4MDdVTCwgMFVMLCAyMTQ3NDgzNjQ3VUw+CisgIG1pbnN0ZF9yYW5kMDsKKworICAvKioKKyAgICogQW4gYWx0ZXJuYXRpdmUgTENSIChMZWhtZXIgR2VuZXJhdG9yIGZ1bmN0aW9uKS4KKyAgICovCisgIHR5cGVkZWYgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8dWludF9mYXN0MzJfdCwgNDgyNzFVTCwgMFVMLCAyMTQ3NDgzNjQ3VUw+CisgIG1pbnN0ZF9yYW5kOworCisgIC8qKgorICAgKiBUaGUgY2xhc3NpYyBNZXJzZW5uZSBUd2lzdGVyLgorICAgKgorICAgKiBSZWZlcmVuY2U6CisgICAqIE0uIE1hdHN1bW90byBhbmQgVC4gTmlzaGltdXJhLCBNZXJzZW5uZSBUd2lzdGVyOiBBIDYyMy1EaW1lbnNpb25hbGx5CisgICAqIEVxdWlkaXN0cmlidXRlZCBVbmlmb3JtIFBzZXVkby1SYW5kb20gTnVtYmVyIEdlbmVyYXRvciwgQUNNIFRyYW5zYWN0aW9ucworICAgKiBvbiBNb2RlbGluZyBhbmQgQ29tcHV0ZXIgU2ltdWxhdGlvbiwgVm9sLiA4LCBOby4gMSwgSmFudWFyeSAxOTk4LCBwcCAzLTMwLgorICAgKi8KKyAgdHlwZWRlZiBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTwKKyAgICB1aW50X2Zhc3QzMl90LAorICAgIDMyLCA2MjQsIDM5NywgMzEsCisgICAgMHg5OTA4YjBkZlVMLCAxMSwKKyAgICAweGZmZmZmZmZmVUwsIDcsCisgICAgMHg5ZDJjNTY4MFVMLCAxNSwKKyAgICAweGVmYzYwMDAwVUwsIDE4LCAxODEyNDMzMjUzVUw+IG10MTk5Mzc7CisKKyAgLyoqCisgICAqIEFuIGFsdGVybmF0aXZlIE1lcnNlbm5lIFR3aXN0ZXIuCisgICAqLworICB0eXBlZGVmIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPAorICAgIHVpbnRfZmFzdDY0X3QsCisgICAgNjQsIDMxMiwgMTU2LCAzMSwKKyAgICAweGI1MDI2ZjVhYTk2NjE5ZTlVTEwsIDI5LAorICAgIDB4NTU1NTU1NTU1NTU1NTU1NVVMTCwgMTcsCisgICAgMHg3MWQ2N2ZmZmVkYTYwMDAwVUxMLCAzNywKKyAgICAweGZmZjdlZWUwMDAwMDAwMDBVTEwsIDQzLAorICAgIDYzNjQxMzYyMjM4NDY3OTMwMDVVTEw+IG10MTk5MzdfNjQ7CisKKyAgdHlwZWRlZiBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTx1aW50X2Zhc3QzMl90LCAyNCwgMTAsIDI0PgorICAgIHJhbmx1eDI0X2Jhc2U7CisKKyAgdHlwZWRlZiBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTx1aW50X2Zhc3Q2NF90LCA0OCwgNSwgMTI+CisgICAgcmFubHV4NDhfYmFzZTsKKworICB0eXBlZGVmIGRpc2NhcmRfYmxvY2tfZW5naW5lPHJhbmx1eDI0X2Jhc2UsIDIyMywgMjM+IHJhbmx1eDI0OworCisgIHR5cGVkZWYgZGlzY2FyZF9ibG9ja19lbmdpbmU8cmFubHV4NDhfYmFzZSwgMzg5LCAxMT4gcmFubHV4NDg7CisKKyAgdHlwZWRlZiBzaHVmZmxlX29yZGVyX2VuZ2luZTxtaW5zdGRfcmFuZDAsIDI1Nj4ga251dGhfYjsKKworICB0eXBlZGVmIG1pbnN0ZF9yYW5kMCBkZWZhdWx0X3JhbmRvbV9lbmdpbmU7CisKKyAgLyoqCisgICAqIEEgc3RhbmRhcmQgaW50ZXJmYWNlIHRvIGEgcGxhdGZvcm0tc3BlY2lmaWMgbm9uLWRldGVybWluaXN0aWMKKyAgICogcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgKGlmIGFueSBhcmUgYXZhaWxhYmxlKS4KKyAgICovCisgIGNsYXNzIHJhbmRvbV9kZXZpY2UKKyAgeworICBwdWJsaWM6CisgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIHZhbHVlLiAqLworICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IHJlc3VsdF90eXBlOworCisgICAgLy8gY29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycyBhbmQgbWVtYmVyIGZ1bmN0aW9ucworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1JBTkRPTV9UUjEKKworICAgIGV4cGxpY2l0CisgICAgcmFuZG9tX2RldmljZShjb25zdCBzdGQ6OnN0cmluZyYgX190b2tlbiA9ICJkZWZhdWx0IikKKyAgICB7CisgICAgICBfTV9pbml0KF9fdG9rZW4pOworICAgIH0KKworICAgIH5yYW5kb21fZGV2aWNlKCkKKyAgICB7IF9NX2ZpbmkoKTsgfQorCisjZWxzZQorCisgICAgZXhwbGljaXQKKyAgICByYW5kb21fZGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBfX3Rva2VuID0gIm10MTk5MzciKQorICAgIHsgX01faW5pdF9wcmV0cjEoX190b2tlbik7IH0KKworICBwdWJsaWM6CisKKyNlbmRpZgorCisgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZQorICAgIG1pbigpCisgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1pbigpOyB9CisKKyAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlCisgICAgbWF4KCkKKyAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgIGRvdWJsZQorICAgIGVudHJvcHkoKSBjb25zdCBub2V4Y2VwdAorICAgIHsgcmV0dXJuIDAuMDsgfQorCisgICAgcmVzdWx0X3R5cGUKKyAgICBvcGVyYXRvcigpKCkKKyAgICB7CisjaWZkZWYgX0dMSUJDWFhfVVNFX1JBTkRPTV9UUjEKKyAgICAgIHJldHVybiB0aGlzLT5fTV9nZXR2YWwoKTsKKyNlbHNlCisgICAgICByZXR1cm4gdGhpcy0+X01fZ2V0dmFsX3ByZXRyMSgpOworI2VuZGlmCisgICAgfQorCisgICAgLy8gTm8gY29weSBmdW5jdGlvbnMuCisgICAgcmFuZG9tX2RldmljZShjb25zdCByYW5kb21fZGV2aWNlJikgPSBkZWxldGU7CisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgcmFuZG9tX2RldmljZSYpID0gZGVsZXRlOworCisgIHByaXZhdGU6CisKKyAgICB2b2lkIF9NX2luaXQoY29uc3Qgc3RkOjpzdHJpbmcmIF9fdG9rZW4pOworICAgIHZvaWQgX01faW5pdF9wcmV0cjEoY29uc3Qgc3RkOjpzdHJpbmcmIF9fdG9rZW4pOworICAgIHZvaWQgX01fZmluaSgpOworCisgICAgcmVzdWx0X3R5cGUgX01fZ2V0dmFsKCk7CisgICAgcmVzdWx0X3R5cGUgX01fZ2V0dmFsX3ByZXRyMSgpOworCisgICAgdW5pb24KKyAgICB7CisgICAgRklMRSogICAgICAgIF9NX2ZpbGU7CisgICAgbXQxOTkzNyAgICAgIF9NX210OworICB9OworICB9OworCisgIC8qIEB9ICovIC8vIGdyb3VwIHJhbmRvbV9nZW5lcmF0b3JzCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIHJhbmRvbV9kaXN0cmlidXRpb25zIFJhbmRvbSBOdW1iZXIgRGlzdHJpYnV0aW9ucworICAgKiBAaW5ncm91cCByYW5kb20KKyAgICogQHsKKyAgICovCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIHJhbmRvbV9kaXN0cmlidXRpb25zX3VuaWZvcm0gVW5pZm9ybSBEaXN0cmlidXRpb25zCisgICAqIEBpbmdyb3VwIHJhbmRvbV9kaXN0cmlidXRpb25zCisgICAqIEB7CisgICAqLworCisgIC8qKgorICAgKiBAYnJpZWYgVW5pZm9ybSBkaXNjcmV0ZSBkaXN0cmlidXRpb24gZm9yIHJhbmRvbSBudW1iZXJzLgorICAgKiBBIGRpc2NyZXRlIHJhbmRvbSBkaXN0cmlidXRpb24gb24gdGhlIHJhbmdlIEBmJFttaW4sIG1heF1AZiQgd2l0aCBlcXVhbAorICAgKiBwcm9iYWJpbGl0eSB0aHJvdWdob3V0IHRoZSByYW5nZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlID0gaW50PgorICAgIGNsYXNzIHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19pbnRlZ3JhbDxfSW50VHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhbiBpbnRlZ3JhbCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9JbnRUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisKKwlleHBsaWNpdAorCXBhcmFtX3R5cGUoX0ludFR5cGUgX19hID0gMCwKKwkJICAgX0ludFR5cGUgX19iID0gc3RkOjpudW1lcmljX2xpbWl0czxfSW50VHlwZT46Om1heCgpKQorCTogX01fYShfX2EpLCBfTV9iKF9fYikKKwl7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fYSA8PSBfTV9iKTsKKwl9CisKKwlyZXN1bHRfdHlwZQorCWEoKSBjb25zdAorCXsgcmV0dXJuIF9NX2E7IH0KKworCXJlc3VsdF90eXBlCisJYigpIGNvbnN0CisJeyByZXR1cm4gX01fYjsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gX19wMS5fTV9hID09IF9fcDIuX01fYSAmJiBfX3AxLl9NX2IgPT0gX19wMi5fTV9iOyB9CisKKyAgICAgIHByaXZhdGU6CisJX0ludFR5cGUgX01fYTsKKwlfSW50VHlwZSBfTV9iOworICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSB1bmlmb3JtIGRpc3RyaWJ1dGlvbiBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICB1bmlmb3JtX2ludF9kaXN0cmlidXRpb24oX0ludFR5cGUgX19hID0gMCwKKwkJCSAgIF9JbnRUeXBlIF9fYiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X0ludFR5cGU+OjptYXgoKSkKKyAgICAgIDogX01fcGFyYW0oX19hLCBfX2IpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqCisgICAgICAgKiBEb2VzIG5vdGhpbmcgZm9yIHRoZSB1bmlmb3JtIGludGVnZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpIHsgfQorCisgICAgICByZXN1bHRfdHlwZQorICAgICAgYSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5hKCk7IH0KKworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIGIoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0uYigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBpbmNsdXNpdmUgbG93ZXIgYm91bmQgb2YgdGhlIGRpc3RyaWJ1dGlvbiByYW5nZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5hKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgaW5jbHVzaXZlIHVwcGVyIGJvdW5kIG9mIHRoZSBkaXN0cmlidXRpb24gcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+YigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgICAgeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZShfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gdW5pZm9ybSBpbnRlZ2VyIGRpc3RyaWJ1dGlvbnMgaGF2ZQorICAgICAgICogICAgICAgIHRoZSBzYW1lIHBhcmFtZXRlcnMuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkJIGNvbnN0IHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbiYgX19kMikKKyAgICAgIHsgcmV0dXJuIF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byB1bmlmb3JtIGludGVnZXIgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAqICAgICAgICBkaWZmZXJlbnQgcGFyYW1ldGVycy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworICAvKioKKyAgICogQGJyaWVmIEluc2VydHMgYSAldW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICogICAgICAgIGRpc3RyaWJ1dGlvbiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBvcy4KKyAgICoKKyAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIF9feCAgQSAldW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICogYW4gZXJyb3Igc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCSAgICAgICBjb25zdCBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mKTsKKworICAvKioKKyAgICogQGJyaWVmIEV4dHJhY3RzIGEgJXVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAqCisgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIF9feCAgQSAldW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCSAgICAgICBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mKTsKKworCisgIC8qKgorICAgKiBAYnJpZWYgVW5pZm9ybSBjb250aW51b3VzIGRpc3RyaWJ1dGlvbiBmb3IgcmFuZG9tIG51bWJlcnMuCisgICAqCisgICAqIEEgY29udGludW91cyByYW5kb20gZGlzdHJpYnV0aW9uIG9uIHRoZSByYW5nZSBbbWluLCBtYXgpIHdpdGggZXF1YWwKKyAgICogcHJvYmFiaWxpdHkgdGhyb3VnaG91dCB0aGUgcmFuZ2UuICBUaGUgVVJORyBzaG91bGQgYmUgcmVhbC12YWx1ZWQgYW5kCisgICAqIGRlbGl2ZXIgbnVtYmVyIGluIHRoZSByYW5nZSBbMCwgMSkuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MgdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19mbG9hdGluZ19wb2ludDxfUmVhbFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYSBmbG9hdGluZyBwb2ludCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisKKwlleHBsaWNpdAorCXBhcmFtX3R5cGUoX1JlYWxUeXBlIF9fYSA9IF9SZWFsVHlwZSgwKSwKKwkJICAgX1JlYWxUeXBlIF9fYiA9IF9SZWFsVHlwZSgxKSkKKwk6IF9NX2EoX19hKSwgX01fYihfX2IpCisJeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX2EgPD0gX01fYik7CisJfQorCisJcmVzdWx0X3R5cGUKKwlhKCkgY29uc3QKKwl7IHJldHVybiBfTV9hOyB9CisKKwlyZXN1bHRfdHlwZQorCWIoKSBjb25zdAorCXsgcmV0dXJuIF9NX2I7IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fYSA9PSBfX3AyLl9NX2EgJiYgX19wMS5fTV9iID09IF9fcDIuX01fYjsgfQorCisgICAgICBwcml2YXRlOgorCV9SZWFsVHlwZSBfTV9hOworCV9SZWFsVHlwZSBfTV9iOworICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19hIFtJTl0gIFRoZSBsb3dlciBib3VuZCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fYiBbSU5dICBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb24oX1JlYWxUeXBlIF9fYSA9IF9SZWFsVHlwZSgwKSwKKwkJCQlfUmVhbFR5cGUgX19iID0gX1JlYWxUeXBlKDEpKQorICAgICAgOiBfTV9wYXJhbShfX2EsIF9fYikKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqCisgICAgICAgKiBEb2VzIG5vdGhpbmcgZm9yIHRoZSB1bmlmb3JtIHJlYWwgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpIHsgfQorCisgICAgICByZXN1bHRfdHlwZQorICAgICAgYSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5hKCk7IH0KKworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIGIoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0uYigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBpbmNsdXNpdmUgbG93ZXIgYm91bmQgb2YgdGhlIGRpc3RyaWJ1dGlvbiByYW5nZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5hKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgaW5jbHVzaXZlIHVwcGVyIGJvdW5kIG9mIHRoZSBkaXN0cmlidXRpb24gcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+YigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgICAgeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsKKwkgIF9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgcmVzdWx0X3R5cGU+CisJICAgIF9fYXVybmcoX191cm5nKTsKKwkgIHJldHVybiAoX19hdXJuZygpICogKF9fcC5iKCkgLSBfX3AuYSgpKSkgKyBfX3AuYSgpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZShfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gdW5pZm9ybSByZWFsIGRpc3RyaWJ1dGlvbnMgaGF2ZQorICAgICAgICogICAgICAgIHRoZSBzYW1lIHBhcmFtZXRlcnMuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb24mIF9fZDEsCisJCSBjb25zdCB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkJY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIHVuaWZvcm0gcmVhbCBkaXN0cmlidXRpb25zIGhhdmUKKyAgICogICAgICAgIGRpZmZlcmVudCBwYXJhbWV0ZXJzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBJbnNlcnRzIGEgJXVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgKiAgICAgICAgZGlzdHJpYnV0aW9uIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAqCisgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAqIEBwYXJhbSBfX3ggIEEgJXVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgKiAgICAgICAgICBhbiBlcnJvciBzdGF0ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCSAgICAgICBjb25zdCBzdGQ6OnVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYpOworCisgIC8qKgorICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAldW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAqCisgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIF9feCAgQSAldW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAqCisgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJICAgICAgIHN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+Jik7CisKKyAgLyogQH0gKi8gLy8gZ3JvdXAgcmFuZG9tX2Rpc3RyaWJ1dGlvbnNfdW5pZm9ybQorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCByYW5kb21fZGlzdHJpYnV0aW9uc19ub3JtYWwgTm9ybWFsIERpc3RyaWJ1dGlvbnMKKyAgICogQGluZ3JvdXAgcmFuZG9tX2Rpc3RyaWJ1dGlvbnMKKyAgICogQHsKKyAgICovCisKKyAgLyoqCisgICAqIEBicmllZiBBIG5vcm1hbCBjb250aW51b3VzIGRpc3RyaWJ1dGlvbiBmb3IgcmFuZG9tIG51bWJlcnMuCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgbm9ybWFsIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gaXMKKyAgICogQGZbCisgICAqICAgICBwKHh8XG11LFxzaWdtYSkgPSBcZnJhY3sxfXtcc2lnbWEgXHNxcnR7MiBccGl9fQorICAgKiAgICAgICAgICAgIGVeey0gXGZyYWN7e3ggLSBcbXV9XiB7Mn19ezIgXHNpZ21hIF4gezJ9fSB9IAorICAgKiBAZl0KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcyBub3JtYWxfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIG5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKworCWV4cGxpY2l0CisJcGFyYW1fdHlwZShfUmVhbFR5cGUgX19tZWFuID0gX1JlYWxUeXBlKDApLAorCQkgICBfUmVhbFR5cGUgX19zdGRkZXYgPSBfUmVhbFR5cGUoMSkpCisJOiBfTV9tZWFuKF9fbWVhbiksIF9NX3N0ZGRldihfX3N0ZGRldikKKwl7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fc3RkZGV2ID4gX1JlYWxUeXBlKDApKTsKKwl9CisKKwlfUmVhbFR5cGUKKwltZWFuKCkgY29uc3QKKwl7IHJldHVybiBfTV9tZWFuOyB9CisKKwlfUmVhbFR5cGUKKwlzdGRkZXYoKSBjb25zdAorCXsgcmV0dXJuIF9NX3N0ZGRldjsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gKF9fcDEuX01fbWVhbiA9PSBfX3AyLl9NX21lYW4KKwkJICAmJiBfX3AxLl9NX3N0ZGRldiA9PSBfX3AyLl9NX3N0ZGRldik7IH0KKworICAgICAgcHJpdmF0ZToKKwlfUmVhbFR5cGUgX01fbWVhbjsKKwlfUmVhbFR5cGUgX01fc3RkZGV2OworICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhIG5vcm1hbCBkaXN0cmlidXRpb24gd2l0aCBwYXJhbWV0ZXJzIEBmJG1lYW5AZiQgYW5kCisgICAgICAgKiBzdGFuZGFyZCBkZXZpYXRpb24uCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBub3JtYWxfZGlzdHJpYnV0aW9uKHJlc3VsdF90eXBlIF9fbWVhbiA9IHJlc3VsdF90eXBlKDApLAorCQkJICByZXN1bHRfdHlwZSBfX3N0ZGRldiA9IHJlc3VsdF90eXBlKDEpKQorICAgICAgOiBfTV9wYXJhbShfX21lYW4sIF9fc3RkZGV2KSwgX01fc2F2ZWRfYXZhaWxhYmxlKGZhbHNlKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBub3JtYWxfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKSwgX01fc2F2ZWRfYXZhaWxhYmxlKGZhbHNlKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpCisgICAgICB7IF9NX3NhdmVkX2F2YWlsYWJsZSA9IGZhbHNlOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIG1lYW4gb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgX1JlYWxUeXBlCisgICAgICBtZWFuKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLm1lYW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgX1JlYWxUeXBlCisgICAgICBzdGRkZXYoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0uc3RkZGV2KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Omxvd2VzdCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1heCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHJldHVybiB0aGlzLT5vcGVyYXRvcigpKF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyB0aGlzLT5fX2dlbmVyYXRlKF9fZiwgX190LCBfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKHJlc3VsdF90eXBlKiBfX2YsIHJlc3VsdF90eXBlKiBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBub3JtYWwgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAgICAgKiAgICAgICAgdGhlIHNhbWUgcGFyYW1ldGVycyBhbmQgdGhlIHNlcXVlbmNlcyB0aGF0IHdvdWxkCisgICAgICAgKiAgICAgICAgYmUgZ2VuZXJhdGVkIGFyZSBlcXVhbC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMT4KKwlmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcj09KGNvbnN0IHN0ZDo6bm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX19kMSwKKwkJICAgY29uc3Qgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX2QyKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVub3JtYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVub3JtYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3Qgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyBhICVub3JtYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlbm9ybWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3IKKyAgICAgICAqICAgICAgICAgIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIHN0ZDo6bm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlICBfTV9wYXJhbTsKKyAgICAgIHJlc3VsdF90eXBlIF9NX3NhdmVkOworICAgICAgYm9vbCAgICAgICAgX01fc2F2ZWRfYXZhaWxhYmxlOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gbm9ybWFsIGRpc3RyaWJ1dGlvbnMgYXJlIGRpZmZlcmVudC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6bm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisKKyAgLyoqCisgICAqIEBicmllZiBBIGxvZ25vcm1hbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgbm9ybWFsIHByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb24gaXMKKyAgICogQGZbCisgICAqICAgICBwKHh8bSxzKSA9IFxmcmFjezF9e3N4XHNxcnR7MlxwaX19CisgICAqICAgICAgICAgICAgICAgIFxleHB7LVxmcmFjeyhcbG57eH0gLSBtKV4yfXsyc14yfX0gCisgICAqIEBmXQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIGxvZ25vcm1hbF9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCisJZXhwbGljaXQKKwlwYXJhbV90eXBlKF9SZWFsVHlwZSBfX20gPSBfUmVhbFR5cGUoMCksCisJCSAgIF9SZWFsVHlwZSBfX3MgPSBfUmVhbFR5cGUoMSkpCisJOiBfTV9tKF9fbSksIF9NX3MoX19zKQorCXsgfQorCisJX1JlYWxUeXBlCisJbSgpIGNvbnN0CisJeyByZXR1cm4gX01fbTsgfQorCisJX1JlYWxUeXBlCisJcygpIGNvbnN0CisJeyByZXR1cm4gX01fczsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gX19wMS5fTV9tID09IF9fcDIuX01fbSAmJiBfX3AxLl9NX3MgPT0gX19wMi5fTV9zOyB9CisKKyAgICAgIHByaXZhdGU6CisJX1JlYWxUeXBlIF9NX207CisJX1JlYWxUeXBlIF9NX3M7CisgICAgICB9OworCisgICAgICBleHBsaWNpdAorICAgICAgbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbihfUmVhbFR5cGUgX19tID0gX1JlYWxUeXBlKDApLAorCQkJICAgICBfUmVhbFR5cGUgX19zID0gX1JlYWxUeXBlKDEpKQorICAgICAgOiBfTV9wYXJhbShfX20sIF9fcyksIF9NX25kKCkKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCksIF9NX25kKCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpCisgICAgICB7IF9NX25kLnJlc2V0KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIG0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0ubSgpOyB9CisKKyAgICAgIF9SZWFsVHlwZQorICAgICAgcygpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5zKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gcmVzdWx0X3R5cGUoMCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgICB7IHJldHVybiB0aGlzLT5vcGVyYXRvcigpKF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICAgIHsgcmV0dXJuIHN0ZDo6ZXhwKF9fcC5zKCkgKiBfTV9uZChfX3VybmcpICsgX19wLm0oKSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZShfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gbG9nbm9ybWFsIGRpc3RyaWJ1dGlvbnMgaGF2ZQorICAgICAgICogICAgICAgIHRoZSBzYW1lIHBhcmFtZXRlcnMgYW5kIHRoZSBzZXF1ZW5jZXMgdGhhdCB3b3VsZAorICAgICAgICogICAgICAgIGJlIGdlbmVyYXRlZCBhcmUgZXF1YWwuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGxvZ25vcm1hbF9kaXN0cmlidXRpb24mIF9fZDEsCisJCSBjb25zdCBsb2dub3JtYWxfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gKF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbQorCQkmJiBfX2QxLl9NX25kID09IF9fZDIuX01fbmQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgYSAlbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IHN0ZDo6bG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggQSAlbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgICAgIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgc3RkOjpsb2dub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisKKyAgICAgIHN0ZDo6bm9ybWFsX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gX01fbmQ7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBsb2dub3JtYWwgZGlzdHJpYnV0aW9ucyBhcmUgZGlmZmVyZW50LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OmxvZ25vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjpsb2dub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKworICAvKioKKyAgICogQGJyaWVmIEEgZ2FtbWEgY29udGludW91cyBkaXN0cmlidXRpb24gZm9yIHJhbmRvbSBudW1iZXJzLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIGdhbW1hIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gaXM6CisgICAqIEBmWworICAgKiAgICAgcCh4fFxhbHBoYSxcYmV0YSkgPSBcZnJhY3sxfXtcYmV0YVxHYW1tYShcYWxwaGEpfQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAoeC9cYmV0YSlee1xhbHBoYSAtIDF9IGVeey14L1xiZXRhfSAKKyAgICogQGZdCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MgZ2FtbWFfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIGdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCWZyaWVuZCBjbGFzcyBnYW1tYV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjsKKworCWV4cGxpY2l0CisJcGFyYW1fdHlwZShfUmVhbFR5cGUgX19hbHBoYV92YWwgPSBfUmVhbFR5cGUoMSksCisJCSAgIF9SZWFsVHlwZSBfX2JldGFfdmFsID0gX1JlYWxUeXBlKDEpKQorCTogX01fYWxwaGEoX19hbHBoYV92YWwpLCBfTV9iZXRhKF9fYmV0YV92YWwpCisJeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX2FscGhhID4gX1JlYWxUeXBlKDApKTsKKwkgIF9NX2luaXRpYWxpemUoKTsKKwl9CisKKwlfUmVhbFR5cGUKKwlhbHBoYSgpIGNvbnN0CisJeyByZXR1cm4gX01fYWxwaGE7IH0KKworCV9SZWFsVHlwZQorCWJldGEoKSBjb25zdAorCXsgcmV0dXJuIF9NX2JldGE7IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIChfX3AxLl9NX2FscGhhID09IF9fcDIuX01fYWxwaGEKKwkJICAmJiBfX3AxLl9NX2JldGEgPT0gX19wMi5fTV9iZXRhKTsgfQorCisgICAgICBwcml2YXRlOgorCXZvaWQKKwlfTV9pbml0aWFsaXplKCk7CisKKwlfUmVhbFR5cGUgX01fYWxwaGE7CisJX1JlYWxUeXBlIF9NX2JldGE7CisKKwlfUmVhbFR5cGUgX01fbWFscGhhLCBfTV9hMjsKKyAgICAgIH07CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgZ2FtbWEgZGlzdHJpYnV0aW9uIHdpdGggcGFyYW1ldGVycworICAgICAgICogQGYkXGFscGhhQGYkIGFuZCBAZiRcYmV0YUBmJC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGdhbW1hX2Rpc3RyaWJ1dGlvbihfUmVhbFR5cGUgX19hbHBoYV92YWwgPSBfUmVhbFR5cGUoMSksCisJCQkgX1JlYWxUeXBlIF9fYmV0YV92YWwgPSBfUmVhbFR5cGUoMSkpCisgICAgICA6IF9NX3BhcmFtKF9fYWxwaGFfdmFsLCBfX2JldGFfdmFsKSwgX01fbmQoKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBnYW1tYV9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApLCBfTV9uZCgpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgX01fbmQucmVzZXQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBAZiRcYWxwaGFAZiQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgX1JlYWxUeXBlCisgICAgICBhbHBoYSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5hbHBoYSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIEBmJFxiZXRhQGYkIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgYmV0YSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5iZXRhKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gcmVzdWx0X3R5cGUoMCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgcmV0dXJuIHRoaXMtPm9wZXJhdG9yKCkoX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHRoaXMtPl9fZ2VuZXJhdGUoX19mLCBfX3QsIF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIGdhbW1hIGRpc3RyaWJ1dGlvbnMgaGF2ZSB0aGUgc2FtZQorICAgICAgICogICAgICAgIHBhcmFtZXRlcnMgYW5kIHRoZSBzZXF1ZW5jZXMgdGhhdCB3b3VsZCBiZSBnZW5lcmF0ZWQKKyAgICAgICAqICAgICAgICBhcmUgZXF1YWwuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGdhbW1hX2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkJIGNvbnN0IGdhbW1hX2Rpc3RyaWJ1dGlvbiYgX19kMikKKyAgICAgIHsgcmV0dXJuIChfX2QxLl9NX3BhcmFtID09IF9fZDIuX01fcGFyYW0KKwkJJiYgX19kMS5fTV9uZCA9PSBfX2QyLl9NX25kKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIGEgJWdhbW1hX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlZ2FtbWFfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3Qgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEV4dHJhY3RzIGEgJWdhbW1hX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWdhbW1hX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkJY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKworICAgICAgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBfTV9uZDsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIGdhbW1hIGRpc3RyaWJ1dGlvbnMgYXJlIGRpZmZlcmVudC4KKyAgICovCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgIGlubGluZSBib29sCisgICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkJY29uc3Qgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBjaGlfc3F1YXJlZF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgbm9ybWFsIHByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb24gaXMKKyAgICogQGYkcCh4fG4pID0gXGZyYWN7eF57KG4vMikgLSAxfWVeey14LzJ9fXtcR2FtbWEobi8yKSAyXntuLzJ9fUBmJAorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19mbG9hdGluZ19wb2ludDxfUmVhbFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYSBmbG9hdGluZyBwb2ludCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBjaGlfc3F1YXJlZF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKworCWV4cGxpY2l0CisJcGFyYW1fdHlwZShfUmVhbFR5cGUgX19uID0gX1JlYWxUeXBlKDEpKQorCTogX01fbihfX24pCisJeyB9CisKKwlfUmVhbFR5cGUKKwluKCkgY29uc3QKKwl7IHJldHVybiBfTV9uOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiBfX3AxLl9NX24gPT0gX19wMi5fTV9uOyB9CisKKyAgICAgIHByaXZhdGU6CisJX1JlYWxUeXBlIF9NX247CisgICAgICB9OworCisgICAgICBleHBsaWNpdAorICAgICAgY2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uKF9SZWFsVHlwZSBfX24gPSBfUmVhbFR5cGUoMSkpCisgICAgICA6IF9NX3BhcmFtKF9fbiksIF9NX2dkKF9fbiAvIDIpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCksIF9NX2dkKF9fcC5uKCkgLyAyKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpCisgICAgICB7IF9NX2dkLnJlc2V0KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIG4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0ubigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHJlc3VsdF90eXBlKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1heCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHJldHVybiAyICogX01fZ2QoX191cm5nKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Z2FtbWFfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPjo6cGFyYW1fdHlwZQorCSAgICBwYXJhbV90eXBlOworCSAgcmV0dXJuIDIgKiBfTV9nZChfX3VybmcsIHBhcmFtX3R5cGUoX19wLm4oKSAvIDIpKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgICAgeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZyk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0eXBlbmFtZSBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT46OnBhcmFtX3R5cGUKKwkgICAgX19wMihfX3AubigpIC8gMik7CisJICB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wMik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgICAgeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZyk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdHlwZW5hbWUgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+OjpwYXJhbV90eXBlCisJICAgIF9fcDIoX19wLm4oKSAvIDIpOworCSAgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcDIpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBDaGktc3F1YXJlZCBkaXN0cmlidXRpb25zIGhhdmUKKyAgICAgICAqICAgICAgICB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFuZCB0aGUgc2VxdWVuY2VzIHRoYXQgd291bGQgYmUKKyAgICAgICAqICAgICAgICBnZW5lcmF0ZWQgYXJlIGVxdWFsLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBjaGlfc3F1YXJlZF9kaXN0cmlidXRpb24mIF9fZDEsCisJCSBjb25zdCBjaGlfc3F1YXJlZF9kaXN0cmlidXRpb24mIF9fZDIpCisgICAgICB7IHJldHVybiBfX2QxLl9NX3BhcmFtID09IF9fZDIuX01fcGFyYW0gJiYgX19kMS5fTV9nZCA9PSBfX2QyLl9NX2dkOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgYSAlY2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVjaGlfc3F1YXJlZF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBzdGQ6OmNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlY2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCBBICVjaGlfc3F1YXJlZF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIHN0ZDo6Y2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZyk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHR5cGVuYW1lCisJCQlzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT46OnBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisKKyAgICAgIHN0ZDo6Z2FtbWFfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBfTV9nZDsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIENoaS1zcXVhcmVkIGRpc3RyaWJ1dGlvbnMgYXJlIGRpZmZlcmVudC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjpjaGlfc3F1YXJlZF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjpjaGlfc3F1YXJlZF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBjYXVjaHlfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIG5vcm1hbCBwcm9iYWJpbGl0eSBtYXNzIGZ1bmN0aW9uIGlzCisgICAqIEBmJHAoeHxhLGIpID0gKFxwaSBiICgxICsgKFxmcmFje3gtYX17Yn0pXjIpKV57LTF9QGYkCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MgY2F1Y2h5X2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19mbG9hdGluZ19wb2ludDxfUmVhbFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYSBmbG9hdGluZyBwb2ludCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBjYXVjaHlfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisKKwlleHBsaWNpdAorCXBhcmFtX3R5cGUoX1JlYWxUeXBlIF9fYSA9IF9SZWFsVHlwZSgwKSwKKwkJICAgX1JlYWxUeXBlIF9fYiA9IF9SZWFsVHlwZSgxKSkKKwk6IF9NX2EoX19hKSwgX01fYihfX2IpCisJeyB9CisKKwlfUmVhbFR5cGUKKwlhKCkgY29uc3QKKwl7IHJldHVybiBfTV9hOyB9CisKKwlfUmVhbFR5cGUKKwliKCkgY29uc3QKKwl7IHJldHVybiBfTV9iOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiBfX3AxLl9NX2EgPT0gX19wMi5fTV9hICYmIF9fcDEuX01fYiA9PSBfX3AyLl9NX2I7IH0KKworICAgICAgcHJpdmF0ZToKKwlfUmVhbFR5cGUgX01fYTsKKwlfUmVhbFR5cGUgX01fYjsKKyAgICAgIH07CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBjYXVjaHlfZGlzdHJpYnV0aW9uKF9SZWFsVHlwZSBfX2EgPSBfUmVhbFR5cGUoMCksCisJCQkgIF9SZWFsVHlwZSBfX2IgPSBfUmVhbFR5cGUoMSkpCisgICAgICA6IF9NX3BhcmFtKF9fYSwgX19iKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBjYXVjaHlfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0uYSgpOyB9CisKKyAgICAgIF9SZWFsVHlwZQorICAgICAgYigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5iKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Omxvd2VzdCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1heCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHJldHVybiB0aGlzLT5vcGVyYXRvcigpKF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyB0aGlzLT5fX2dlbmVyYXRlKF9fZiwgX190LCBfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKHJlc3VsdF90eXBlKiBfX2YsIHJlc3VsdF90eXBlKiBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBDYXVjaHkgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAgICAgKiAgICAgICAgdGhlIHNhbWUgcGFyYW1ldGVycy4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgY2F1Y2h5X2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkJIGNvbnN0IGNhdWNoeV9kaXN0cmlidXRpb24mIF9fZDIpCisgICAgICB7IHJldHVybiBfX2QxLl9NX3BhcmFtID09IF9fZDIuX01fcGFyYW07IH0KKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gQ2F1Y2h5IGRpc3RyaWJ1dGlvbnMgaGF2ZQorICAgKiAgICAgICAgZGlmZmVyZW50IHBhcmFtZXRlcnMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6Y2F1Y2h5X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QxLAorCSAgICAgICBjb25zdCBzdGQ6OmNhdWNoeV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworICAvKioKKyAgICogQGJyaWVmIEluc2VydHMgYSAlY2F1Y2h5X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgKgorICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgKiBAcGFyYW0gX194ICBBICVjYXVjaHlfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICogYW4gZXJyb3Igc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBzdGQ6OmNhdWNoeV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KTsKKworICAvKioKKyAgICogQGJyaWVmIEV4dHJhY3RzIGEgJWNhdWNoeV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgKgorICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAqIEBwYXJhbSBfX3ggQSAlY2F1Y2h5X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAqICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBzdGQ6OmNhdWNoeV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KTsKKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBmaXNoZXJfZl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgbm9ybWFsIHByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb24gaXMKKyAgICogQGZbCisgICAqICAgICBwKHh8bSxuKSA9IFxmcmFje1xHYW1tYSgobStuKS8yKX17XEdhbW1hKG0vMilcR2FtbWEobi8yKX0KKyAgICogICAgICAgICAgICAgICAgKFxmcmFje219e259KV57bS8yfSB4XnsobS8yKS0xfQorICAgKiAgICAgICAgICAgICAgICAoMSArIFxmcmFje214fXtufSleey0obStuKS8yfSAKKyAgICogQGZdCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MgZmlzaGVyX2ZfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIGZpc2hlcl9mX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCisJZXhwbGljaXQKKwlwYXJhbV90eXBlKF9SZWFsVHlwZSBfX20gPSBfUmVhbFR5cGUoMSksCisJCSAgIF9SZWFsVHlwZSBfX24gPSBfUmVhbFR5cGUoMSkpCisJOiBfTV9tKF9fbSksIF9NX24oX19uKQorCXsgfQorCisJX1JlYWxUeXBlCisJbSgpIGNvbnN0CisJeyByZXR1cm4gX01fbTsgfQorCisJX1JlYWxUeXBlCisJbigpIGNvbnN0CisJeyByZXR1cm4gX01fbjsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gX19wMS5fTV9tID09IF9fcDIuX01fbSAmJiBfX3AxLl9NX24gPT0gX19wMi5fTV9uOyB9CisKKyAgICAgIHByaXZhdGU6CisJX1JlYWxUeXBlIF9NX207CisJX1JlYWxUeXBlIF9NX247CisgICAgICB9OworCisgICAgICBleHBsaWNpdAorICAgICAgZmlzaGVyX2ZfZGlzdHJpYnV0aW9uKF9SZWFsVHlwZSBfX20gPSBfUmVhbFR5cGUoMSksCisJCQkgICAgX1JlYWxUeXBlIF9fbiA9IF9SZWFsVHlwZSgxKSkKKyAgICAgIDogX01fcGFyYW0oX19tLCBfX24pLCBfTV9nZF94KF9fbSAvIDIpLCBfTV9nZF95KF9fbiAvIDIpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGZpc2hlcl9mX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCksIF9NX2dkX3goX19wLm0oKSAvIDIpLCBfTV9nZF95KF9fcC5uKCkgLyAyKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpCisgICAgICB7CisJX01fZ2RfeC5yZXNldCgpOworCV9NX2dkX3kucmVzZXQoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIG0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0ubSgpOyB9CisKKyAgICAgIF9SZWFsVHlwZQorICAgICAgbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5uKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gcmVzdWx0X3R5cGUoMCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgcmV0dXJuIChfTV9nZF94KF9fdXJuZykgKiBuKCkpIC8gKF9NX2dkX3koX191cm5nKSAqIG0oKSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgICAgeworCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT46OnBhcmFtX3R5cGUKKwkgICAgcGFyYW1fdHlwZTsKKwkgIHJldHVybiAoKF9NX2dkX3goX191cm5nLCBwYXJhbV90eXBlKF9fcC5tKCkgLyAyKSkgKiBuKCkpCisJCSAgLyAoX01fZ2RfeShfX3VybmcsIHBhcmFtX3R5cGUoX19wLm4oKSAvIDIpKSAqIG0oKSkpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gRmlzaGVyIGYgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAgICAgKiAgICAgICAgdGhlIHNhbWUgcGFyYW1ldGVycyBhbmQgdGhlIHNlcXVlbmNlcyB0aGF0IHdvdWxkCisgICAgICAgKiAgICAgICAgYmUgZ2VuZXJhdGVkIGFyZSBlcXVhbC4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgZmlzaGVyX2ZfZGlzdHJpYnV0aW9uJiBfX2QxLAorCQkgY29uc3QgZmlzaGVyX2ZfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gKF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbQorCQkmJiBfX2QxLl9NX2dkX3ggPT0gX19kMi5fTV9nZF94CisJCSYmIF9fZDEuX01fZ2RfeSA9PSBfX2QyLl9NX2dkX3kpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgYSAlZmlzaGVyX2ZfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVmaXNoZXJfZl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBzdGQ6OmZpc2hlcl9mX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlZmlzaGVyX2ZfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCBBICVmaXNoZXJfZl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIHN0ZDo6ZmlzaGVyX2ZfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZyk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisKKyAgICAgIHN0ZDo6Z2FtbWFfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBfTV9nZF94LCBfTV9nZF95OworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gRmlzaGVyIGYgZGlzdHJpYnV0aW9ucyBhcmUgZGlmZXJlbnQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6ZmlzaGVyX2ZfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6ZmlzaGVyX2ZfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBBIHN0dWRlbnRfdF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgbm9ybWFsIHByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb24gaXM6CisgICAqIEBmWworICAgKiAgICAgcCh4fG4pID0gXGZyYWN7MX17XHNxcnQoblxwaSl9IFxmcmFje1xHYW1tYSgobisxKS8yKX17XEdhbW1hKG4vMil9CisgICAqICAgICAgICAgICAgICAoMSArIFxmcmFje3heMn17bn0pIF57LShuKzEpLzJ9IAorICAgKiBAZl0KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcyBzdHVkZW50X3RfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIHN0dWRlbnRfdF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKworCWV4cGxpY2l0CisJcGFyYW1fdHlwZShfUmVhbFR5cGUgX19uID0gX1JlYWxUeXBlKDEpKQorCTogX01fbihfX24pCisJeyB9CisKKwlfUmVhbFR5cGUKKwluKCkgY29uc3QKKwl7IHJldHVybiBfTV9uOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiBfX3AxLl9NX24gPT0gX19wMi5fTV9uOyB9CisKKyAgICAgIHByaXZhdGU6CisJX1JlYWxUeXBlIF9NX247CisgICAgICB9OworCisgICAgICBleHBsaWNpdAorICAgICAgc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbihfUmVhbFR5cGUgX19uID0gX1JlYWxUeXBlKDEpKQorICAgICAgOiBfTV9wYXJhbShfX24pLCBfTV9uZCgpLCBfTV9nZChfX24gLyAyLCAyKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBzdHVkZW50X3RfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKSwgX01fbmQoKSwgX01fZ2QoX19wLm4oKSAvIDIsIDIpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsKKwlfTV9uZC5yZXNldCgpOworCV9NX2dkLnJlc2V0KCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICoKKyAgICAgICAqLworICAgICAgX1JlYWxUeXBlCisgICAgICBuKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLm4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bG93ZXN0KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgICAgeyByZXR1cm4gX01fbmQoX191cm5nKSAqIHN0ZDo6c3FydChuKCkgLyBfTV9nZChfX3VybmcpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Z2FtbWFfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPjo6cGFyYW1fdHlwZQorCSAgICBwYXJhbV90eXBlOworCQorCSAgY29uc3QgcmVzdWx0X3R5cGUgX19nID0gX01fZ2QoX191cm5nLCBwYXJhbV90eXBlKF9fcC5uKCkgLyAyLCAyKSk7CisJICByZXR1cm4gX01fbmQoX191cm5nKSAqIHN0ZDo6c3FydChfX3AubigpIC8gX19nKTsKKyAgICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZyk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKHJlc3VsdF90eXBlKiBfX2YsIHJlc3VsdF90eXBlKiBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBTdHVkZW50IHQgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAgICAgKiAgICAgICAgdGhlIHNhbWUgcGFyYW1ldGVycyBhbmQgdGhlIHNlcXVlbmNlcyB0aGF0IHdvdWxkCisgICAgICAgKiAgICAgICAgYmUgZ2VuZXJhdGVkIGFyZSBlcXVhbC4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3Qgc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkJIGNvbnN0IHN0dWRlbnRfdF9kaXN0cmlidXRpb24mIF9fZDIpCisgICAgICB7IHJldHVybiAoX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtCisJCSYmIF9fZDEuX01fbmQgPT0gX19kMi5fTV9uZCAmJiBfX2QxLl9NX2dkID09IF9fZDIuX01fZ2QpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgYSAlc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IHN0ZDo6c3R1ZGVudF90X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggQSAlc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgICAgIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgc3RkOjpzdHVkZW50X3RfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZyk7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworCisgICAgICBzdGQ6Om5vcm1hbF9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9NX25kOworICAgICAgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9NX2dkOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gU3R1ZGVudCB0IGRpc3RyaWJ1dGlvbnMgYXJlIGRpZmZlcmVudC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjpzdHVkZW50X3RfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6c3R1ZGVudF90X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisKKyAgLyogQH0gKi8gLy8gZ3JvdXAgcmFuZG9tX2Rpc3RyaWJ1dGlvbnNfbm9ybWFsCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIHJhbmRvbV9kaXN0cmlidXRpb25zX2Jlcm5vdWxsaSBCZXJub3VsbGkgRGlzdHJpYnV0aW9ucworICAgKiBAaW5ncm91cCByYW5kb21fZGlzdHJpYnV0aW9ucworICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogQGJyaWVmIEEgQmVybm91bGxpIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBHZW5lcmF0ZXMgYSBzZXF1ZW5jZSBvZiB0cnVlIGFuZCBmYWxzZSB2YWx1ZXMgd2l0aCBsaWtlbGlob29kIEBmJHBAZiQKKyAgICogdGhhdCB0cnVlIHdpbGwgY29tZSB1cCBhbmQgQGYkKDEgLSBwKUBmJCB0aGF0IGZhbHNlIHdpbGwgYXBwZWFyLgorICAgKi8KKyAgY2xhc3MgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbgorICB7CisgIHB1YmxpYzoKKyAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgdHlwZWRlZiBib29sIHJlc3VsdF90eXBlOworICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgIHsKKyAgICAgIHR5cGVkZWYgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiBkaXN0cmlidXRpb25fdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHBhcmFtX3R5cGUoZG91YmxlIF9fcCA9IDAuNSkKKyAgICAgIDogX01fcChfX3ApCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKChfTV9wID49IDAuMCkgJiYgKF9NX3AgPD0gMS4wKSk7CisgICAgICB9CisKKyAgICAgIGRvdWJsZQorICAgICAgcCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wOyB9CisKKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisgICAgICB7IHJldHVybiBfX3AxLl9NX3AgPT0gX19wMi5fTV9wOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgZG91YmxlIF9NX3A7CisgICAgfTsKKworICBwdWJsaWM6CisgICAgLyoqCisgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBCZXJub3VsbGkgZGlzdHJpYnV0aW9uIHdpdGggbGlrZWxpaG9vZCBAcCBwLgorICAgICAqCisgICAgICogQHBhcmFtIF9fcCAgW0lOXSAgVGhlIGxpa2VsaWhvb2Qgb2YgYSB0cnVlIHJlc3VsdCBiZWluZyByZXR1cm5lZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICBNdXN0IGJlIGluIHRoZSBpbnRlcnZhbCBAZiRbMCwgMV1AZiQuCisgICAgICovCisgICAgZXhwbGljaXQKKyAgICBiZXJub3VsbGlfZGlzdHJpYnV0aW9uKGRvdWJsZSBfX3AgPSAwLjUpCisgICAgOiBfTV9wYXJhbShfX3ApCisgICAgeyB9CisKKyAgICBleHBsaWNpdAorICAgIGJlcm5vdWxsaV9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgIDogX01fcGFyYW0oX19wKQorICAgIHsgfQorCisgICAgLyoqCisgICAgICogQGJyaWVmIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAqCisgICAgICogRG9lcyBub3RoaW5nIGZvciBhIEJlcm5vdWxsaSBkaXN0cmlidXRpb24uCisgICAgICovCisgICAgdm9pZAorICAgIHJlc2V0KCkgeyB9CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgQHAgcCBwYXJhbWV0ZXIgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgKi8KKyAgICBkb3VibGUKKyAgICBwKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9wYXJhbS5wKCk7IH0KKworICAgIC8qKgorICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICovCisgICAgcGFyYW1fdHlwZQorICAgIHBhcmFtKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgLyoqCisgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgKi8KKyAgICB2b2lkCisgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgLyoqCisgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICovCisgICAgcmVzdWx0X3R5cGUKKyAgICBtaW4oKSBjb25zdAorICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptaW4oKTsgfQorCisgICAgLyoqCisgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICovCisgICAgcmVzdWx0X3R5cGUKKyAgICBtYXgoKSBjb25zdAorICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgLyoqCisgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgIHsgcmV0dXJuIHRoaXMtPm9wZXJhdG9yKCkoX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIHsKKwlfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIGRvdWJsZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKwlpZiAoKF9fYXVybmcoKSAtIF9fYXVybmcubWluKCkpCisJICAgICA8IF9fcC5wKCkgKiAoX19hdXJuZy5tYXgoKSAtIF9fYXVybmcubWluKCkpKQorCSAgcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgeyB0aGlzLT5fX2dlbmVyYXRlKF9fZiwgX190LCBfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLCBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICB7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIF9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICB7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIEJlcm5vdWxsaSBkaXN0cmlidXRpb25zIGhhdmUKKyAgICAgKiAgICAgICAgdGhlIHNhbWUgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBmcmllbmQgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkgICAgICAgY29uc3QgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiYgX19kMikKKyAgICB7IHJldHVybiBfX2QxLl9NX3BhcmFtID09IF9fZDIuX01fcGFyYW07IH0KKworICBwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIEJlcm5vdWxsaSBkaXN0cmlidXRpb25zIGhhdmUKKyAgICogICAgICAgIGRpZmZlcmVudCBwYXJhbWV0ZXJzLgorICAgKi8KKyAgaW5saW5lIGJvb2wKKyAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OmJlcm5vdWxsaV9kaXN0cmlidXRpb24mIF9fZDEsCisJICAgICBjb25zdCBzdGQ6OmJlcm5vdWxsaV9kaXN0cmlidXRpb24mIF9fZDIpCisgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgSW5zZXJ0cyBhICViZXJub3VsbGlfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAqCisgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAqIEBwYXJhbSBfX3ggIEEgJWJlcm5vdWxsaV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBzdGQ6OmJlcm5vdWxsaV9kaXN0cmlidXRpb24mIF9feCk7CisKKyAgLyoqCisgICAqIEBicmllZiBFeHRyYWN0cyBhICViZXJub3VsbGlfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICoKKyAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgKiBAcGFyYW0gX194ICBBICViZXJub3VsbGlfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgc3RkOjpiZXJub3VsbGlfZGlzdHJpYnV0aW9uJiBfX3gpCisgICAgeworICAgICAgZG91YmxlIF9fcDsKKyAgICAgIF9faXMgPj4gX19wOworICAgICAgX194LnBhcmFtKGJlcm5vdWxsaV9kaXN0cmlidXRpb246OnBhcmFtX3R5cGUoX19wKSk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICAvKioKKyAgICogQGJyaWVmIEEgZGlzY3JldGUgYmlub21pYWwgcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgYmlub21pYWwgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBpcworICAgKiBAZiRwKGl8dCxwKSA9IFxiaW5vbXt0fXtpfSBwXmkgKDEgLSBwKV57dCAtIGl9QGYkIHdoZXJlIEBmJHRAZiQKKyAgICogYW5kIEBmJHBAZiQgYXJlIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSA9IGludD4KKyAgICBjbGFzcyBiaW5vbWlhbF9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfaW50ZWdyYWw8X0ludFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYW4gaW50ZWdyYWwgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfSW50VHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCWZyaWVuZCBjbGFzcyBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+OworCisJZXhwbGljaXQKKwlwYXJhbV90eXBlKF9JbnRUeXBlIF9fdCA9IF9JbnRUeXBlKDEpLCBkb3VibGUgX19wID0gMC41KQorCTogX01fdChfX3QpLCBfTV9wKF9fcCkKKwl7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoKF9NX3QgPj0gX0ludFR5cGUoMCkpCisJCQkJJiYgKF9NX3AgPj0gMC4wKQorCQkJCSYmIChfTV9wIDw9IDEuMCkpOworCSAgX01faW5pdGlhbGl6ZSgpOworCX0KKworCV9JbnRUeXBlCisJdCgpIGNvbnN0CisJeyByZXR1cm4gX01fdDsgfQorCisJZG91YmxlCisJcCgpIGNvbnN0CisJeyByZXR1cm4gX01fcDsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gX19wMS5fTV90ID09IF9fcDIuX01fdCAmJiBfX3AxLl9NX3AgPT0gX19wMi5fTV9wOyB9CisKKyAgICAgIHByaXZhdGU6CisJdm9pZAorCV9NX2luaXRpYWxpemUoKTsKKworCV9JbnRUeXBlIF9NX3Q7CisJZG91YmxlIF9NX3A7CisKKwlkb3VibGUgX01fcTsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisJZG91YmxlIF9NX2QxLCBfTV9kMiwgX01fczEsIF9NX3MyLCBfTV9jLAorCSAgICAgICBfTV9hMSwgX01fYTEyMywgX01fcywgX01fbGYsIF9NX2xwMXA7CisjZW5kaWYKKwlib29sICAgX01fZWFzeTsKKyAgICAgIH07CisKKyAgICAgIC8vIGNvbnN0cnVjdG9ycyBhbmQgbWVtYmVyIGZ1bmN0aW9uCisgICAgICBleHBsaWNpdAorICAgICAgYmlub21pYWxfZGlzdHJpYnV0aW9uKF9JbnRUeXBlIF9fdCA9IF9JbnRUeXBlKDEpLAorCQkJICAgIGRvdWJsZSBfX3AgPSAwLjUpCisgICAgICA6IF9NX3BhcmFtKF9fdCwgX19wKSwgX01fbmQoKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBiaW5vbWlhbF9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApLCBfTV9uZCgpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgX01fbmQucmVzZXQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBkaXN0cmlidXRpb24gQHAgdCBwYXJhbWV0ZXIuCisgICAgICAgKi8KKyAgICAgIF9JbnRUeXBlCisgICAgICB0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLnQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBkaXN0cmlidXRpb24gQHAgcCBwYXJhbWV0ZXIuCisgICAgICAgKi8KKyAgICAgIGRvdWJsZQorICAgICAgcCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5wKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gMDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLnQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZShfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gYmlub21pYWwgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAgICAgKiAgICAgICAgdGhlIHNhbWUgcGFyYW1ldGVycyBhbmQgdGhlIHNlcXVlbmNlcyB0aGF0IHdvdWxkCisgICAgICAgKiAgICAgICAgYmUgZ2VuZXJhdGVkIGFyZSBlcXVhbC4KKyAgICAgICAqLworCWZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgYmlub21pYWxfZGlzdHJpYnV0aW9uJiBfX2QxLAorCQkgICBjb25zdCBiaW5vbWlhbF9kaXN0cmlidXRpb24mIF9fZDIpCisjaWZkZWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorCXsgcmV0dXJuIF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbSAmJiBfX2QxLl9NX25kID09IF9fZDIuX01fbmQ7IH0KKyNlbHNlCisgICAgICAgIHsgcmV0dXJuIF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgYSAlYmlub21pYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICViaW5vbWlhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IHN0ZDo6Ymlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEV4dHJhY3RzIGEgJWJpbm9taWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWJpbm9taWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3IKKyAgICAgICAqICAgICAgICAgIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZTEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgc3RkOjpiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCV9NX3dhaXRpbmcoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgX0ludFR5cGUgX190LCBkb3VibGUgX19xKTsKKworICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKworICAgICAgLy8gTkI6IFVudXNlZCB3aGVuIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEgaXMgdW5kZWZpbmVkLgorICAgICAgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4gX01fbmQ7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBiaW5vbWlhbCBkaXN0cmlidXRpb25zIGFyZSBkaWZmZXJlbnQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjpiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX2QxLAorCSAgICAgICBjb25zdCBzdGQ6OmJpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKworICAvKioKKyAgICogQGJyaWVmIEEgZGlzY3JldGUgZ2VvbWV0cmljIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIGdlb21ldHJpYyBwcm9iYWJpbGl0eSBkZW5zaXR5IGZ1bmN0aW9uIGlzCisgICAqIEBmJHAoaXxwKSA9IHAoMSAtIHApXntpfUBmJCB3aGVyZSBAZiRwQGYkIGlzIHRoZSBwYXJhbWV0ZXIgb2YgdGhlCisgICAqIGRpc3RyaWJ1dGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlID0gaW50PgorICAgIGNsYXNzIGdlb21ldHJpY19kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfaW50ZWdyYWw8X0ludFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYW4gaW50ZWdyYWwgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfSW50VHlwZSAgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisJZnJpZW5kIGNsYXNzIGdlb21ldHJpY19kaXN0cmlidXRpb248X0ludFR5cGU+OworCisJZXhwbGljaXQKKwlwYXJhbV90eXBlKGRvdWJsZSBfX3AgPSAwLjUpCisJOiBfTV9wKF9fcCkKKwl7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoKF9NX3AgPiAwLjApICYmIChfTV9wIDwgMS4wKSk7CisJICBfTV9pbml0aWFsaXplKCk7CisJfQorCisJZG91YmxlCisJcCgpIGNvbnN0CisJeyByZXR1cm4gX01fcDsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gX19wMS5fTV9wID09IF9fcDIuX01fcDsgfQorCisgICAgICBwcml2YXRlOgorCXZvaWQKKwlfTV9pbml0aWFsaXplKCkKKwl7IF9NX2xvZ18xX3AgPSBzdGQ6OmxvZygxLjAgLSBfTV9wKTsgfQorCisJZG91YmxlIF9NX3A7CisKKwlkb3VibGUgX01fbG9nXzFfcDsKKyAgICAgIH07CisKKyAgICAgIC8vIGNvbnN0cnVjdG9ycyBhbmQgbWVtYmVyIGZ1bmN0aW9uCisgICAgICBleHBsaWNpdAorICAgICAgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbihkb3VibGUgX19wID0gMC41KQorICAgICAgOiBfTV9wYXJhbShfX3ApCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGdlb21ldHJpY19kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKgorICAgICAgICogRG9lcyBub3RoaW5nIGZvciB0aGUgZ2VvbWV0cmljIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZGlzdHJpYnV0aW9uIHBhcmFtZXRlciBAcCBwLgorICAgICAgICovCisgICAgICBkb3VibGUKKyAgICAgIHAoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0ucCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIDA7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgcmV0dXJuIHRoaXMtPm9wZXJhdG9yKCkoX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHRoaXMtPl9fZ2VuZXJhdGUoX19mLCBfX3QsIF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIGdlb21ldHJpYyBkaXN0cmlidXRpb25zIGhhdmUKKyAgICAgICAqICAgICAgICB0aGUgc2FtZSBwYXJhbWV0ZXJzLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uJiBfX2QxLAorCQkgY29uc3QgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbiYgX19kMikKKyAgICAgIHsgcmV0dXJuIF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBnZW9tZXRyaWMgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAqICAgICAgICBkaWZmZXJlbnQgcGFyYW1ldGVycy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6Omdlb21ldHJpY19kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX2QxLAorCSAgICAgICBjb25zdCBzdGQ6Omdlb21ldHJpY19kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVnZW9tZXRyaWNfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAqCisgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAqIEBwYXJhbSBfX3ggIEEgJWdlb21ldHJpY19kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBzdGQ6Omdlb21ldHJpY19kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX3gpOworCisgIC8qKgorICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAqCisgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIF9feCAgQSAlZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAqCisgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHN0ZDo6Z2VvbWV0cmljX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9feCk7CisKKworICAvKioKKyAgICogQGJyaWVmIEEgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIG5lZ2F0aXZlIGJpbm9taWFsIHByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb24gaXMKKyAgICogQGYkcChpKSA9IFxiaW5vbXtufXtpfSBwXmkgKDEgLSBwKV57dCAtIGl9QGYkIHdoZXJlIEBmJHRAZiQKKyAgICogYW5kIEBmJHBAZiQgYXJlIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSA9IGludD4KKyAgICBjbGFzcyBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfaW50ZWdyYWw8X0ludFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYW4gaW50ZWdyYWwgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfSW50VHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCisJZXhwbGljaXQKKwlwYXJhbV90eXBlKF9JbnRUeXBlIF9fayA9IDEsIGRvdWJsZSBfX3AgPSAwLjUpCisJOiBfTV9rKF9fayksIF9NX3AoX19wKQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCgoX01fayA+IDApICYmIChfTV9wID4gMC4wKSAmJiAoX01fcCA8PSAxLjApKTsKKwl9CisKKwlfSW50VHlwZQorCWsoKSBjb25zdAorCXsgcmV0dXJuIF9NX2s7IH0KKworCWRvdWJsZQorCXAoKSBjb25zdAorCXsgcmV0dXJuIF9NX3A7IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fayA9PSBfX3AyLl9NX2sgJiYgX19wMS5fTV9wID09IF9fcDIuX01fcDsgfQorCisgICAgICBwcml2YXRlOgorCV9JbnRUeXBlIF9NX2s7CisJZG91YmxlIF9NX3A7CisgICAgICB9OworCisgICAgICBleHBsaWNpdAorICAgICAgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uKF9JbnRUeXBlIF9fayA9IDEsIGRvdWJsZSBfX3AgPSAwLjUpCisgICAgICA6IF9NX3BhcmFtKF9faywgX19wKSwgX01fZ2QoX19rLCAoMS4wIC0gX19wKSAvIF9fcCkKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKSwgX01fZ2QoX19wLmsoKSwgKDEuMCAtIF9fcC5wKCkpIC8gX19wLnAoKSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeyBfTV9nZC5yZXNldCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0aGUgQGYka0BmJCBwYXJhbWV0ZXIgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgX0ludFR5cGUKKyAgICAgIGsoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0uaygpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0aGUgQGYkcEBmJCBwYXJhbWV0ZXIgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgZG91YmxlCisgICAgICBwKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLnAoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiByZXN1bHRfdHlwZSgwKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKHJlc3VsdF90eXBlKiBfX2YsIHJlc3VsdF90eXBlKiBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZyk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIG5lZ2F0aXZlIGJpbm9taWFsIGRpc3RyaWJ1dGlvbnMgaGF2ZQorICAgICAgICogICAgICAgIHRoZSBzYW1lIHBhcmFtZXRlcnMgYW5kIHRoZSBzZXF1ZW5jZXMgdGhhdCB3b3VsZCBiZQorICAgICAgICogICAgICAgIGdlbmVyYXRlZCBhcmUgZXF1YWwuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkJIGNvbnN0IG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbiYgX19kMikKKyAgICAgIHsgcmV0dXJuIF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbSAmJiBfX2QxLl9NX2dkID09IF9fZDIuX01fZ2Q7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb24gcmFuZG9tCisgICAgICAgKiAgICAgICAgbnVtYmVyIGRpc3RyaWJ1dGlvbiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICAgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogICAgICAgICAgYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBzdGQ6Om5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZTE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyBhICVuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgIGRpc3RyaWJ1dGlvbiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCBBICVuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgc3RkOjpuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpOworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkJY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKworICAgICAgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248ZG91YmxlPiBfTV9nZDsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIG5lZ2F0aXZlIGJpbm9taWFsIGRpc3RyaWJ1dGlvbnMgYXJlIGRpZmZlcmVudC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6Om5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6bmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworCisgIC8qIEB9ICovIC8vIGdyb3VwIHJhbmRvbV9kaXN0cmlidXRpb25zX2Jlcm5vdWxsaQorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCByYW5kb21fZGlzdHJpYnV0aW9uc19wb2lzc29uIFBvaXNzb24gRGlzdHJpYnV0aW9ucworICAgKiBAaW5ncm91cCByYW5kb21fZGlzdHJpYnV0aW9ucworICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogQGJyaWVmIEEgZGlzY3JldGUgUG9pc3NvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBQb2lzc29uIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gaXMKKyAgICogQGYkcChpfFxtdSkgPSBcZnJhY3tcbXVeaX17aSF9IGVeey1cbXV9QGYkIHdoZXJlIEBmJFxtdUBmJCBpcyB0aGUKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSA9IGludD4KKyAgICBjbGFzcyBwb2lzc29uX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19pbnRlZ3JhbDxfSW50VHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhbiBpbnRlZ3JhbCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9JbnRUeXBlICByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisJZnJpZW5kIGNsYXNzIHBvaXNzb25fZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjsKKworCWV4cGxpY2l0CisJcGFyYW1fdHlwZShkb3VibGUgX19tZWFuID0gMS4wKQorCTogX01fbWVhbihfX21lYW4pCisJeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX21lYW4gPiAwLjApOworCSAgX01faW5pdGlhbGl6ZSgpOworCX0KKworCWRvdWJsZQorCW1lYW4oKSBjb25zdAorCXsgcmV0dXJuIF9NX21lYW47IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fbWVhbiA9PSBfX3AyLl9NX21lYW47IH0KKworICAgICAgcHJpdmF0ZToKKwkvLyBIb3N0cyBlaXRoZXIgbG9nKG1lYW4pIG9yIHRoZSB0aHJlc2hvbGQgb2YgdGhlIHNpbXBsZSBtZXRob2QuCisJdm9pZAorCV9NX2luaXRpYWxpemUoKTsKKworCWRvdWJsZSBfTV9tZWFuOworCisJZG91YmxlIF9NX2xtX3RocjsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisJZG91YmxlIF9NX2xmbSwgX01fc20sIF9NX2QsIF9NX3NjeCwgX01fMWN4LCBfTV9jMmIsIF9NX2NiOworI2VuZGlmCisgICAgICB9OworCisgICAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIG1lbWJlciBmdW5jdGlvbgorICAgICAgZXhwbGljaXQKKyAgICAgIHBvaXNzb25fZGlzdHJpYnV0aW9uKGRvdWJsZSBfX21lYW4gPSAxLjApCisgICAgICA6IF9NX3BhcmFtKF9fbWVhbiksIF9NX25kKCkKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgcG9pc3Nvbl9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApLCBfTV9uZCgpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgX01fbmQucmVzZXQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBkaXN0cmlidXRpb24gcGFyYW1ldGVyIEBwIG1lYW4uCisgICAgICAgKi8KKyAgICAgIGRvdWJsZQorICAgICAgbWVhbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5tZWFuKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gMDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZShfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAgLyoqCisJKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIFBvaXNzb24gZGlzdHJpYnV0aW9ucyBoYXZlIHRoZSBzYW1lCisJKiAgICAgICAgcGFyYW1ldGVycyBhbmQgdGhlIHNlcXVlbmNlcyB0aGF0IHdvdWxkIGJlIGdlbmVyYXRlZAorCSogICAgICAgIGFyZSBlcXVhbC4KKwkqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgcG9pc3Nvbl9kaXN0cmlidXRpb24mIF9fZDEsCisJCSBjb25zdCBwb2lzc29uX2Rpc3RyaWJ1dGlvbiYgX19kMikKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICB7IHJldHVybiBfX2QxLl9NX3BhcmFtID09IF9fZDIuX01fcGFyYW0gJiYgX19kMS5fTV9uZCA9PSBfX2QyLl9NX25kOyB9CisjZWxzZQorICAgICAgeyByZXR1cm4gX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVwb2lzc29uX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlcG9pc3Nvbl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IHN0ZDo6cG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGUxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlcG9pc3Nvbl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVwb2lzc29uX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3IKKyAgICAgICAqICAgICAgICAgIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgc3RkOjpwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZTE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisKKyAgICAgIC8vIE5COiBVbnVzZWQgd2hlbiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxIGlzIHVuZGVmaW5lZC4KKyAgICAgIHN0ZDo6bm9ybWFsX2Rpc3RyaWJ1dGlvbjxkb3VibGU+IF9NX25kOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gUG9pc3NvbiBkaXN0cmlidXRpb25zIGFyZSBkaWZmZXJlbnQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjpwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6cG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisKKyAgLyoqCisgICAqIEBicmllZiBBbiBleHBvbmVudGlhbCBjb250aW51b3VzIGRpc3RyaWJ1dGlvbiBmb3IgcmFuZG9tIG51bWJlcnMuCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgZXhwb25lbnRpYWwgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBpcworICAgKiBAZiRwKHh8XGxhbWJkYSkgPSBcbGFtYmRhIGVeey1cbGFtYmRhIHh9QGYkLgorICAgKgorICAgKiA8dGFibGUgYm9yZGVyPTEgY2VsbHBhZGRpbmc9MTAgY2VsbHNwYWNpbmc9MD4KKyAgICogPGNhcHRpb24gYWxpZ249dG9wPkRpc3RyaWJ1dGlvbiBTdGF0aXN0aWNzPC9jYXB0aW9uPgorICAgKiA8dHI+PHRkPk1lYW48L3RkPjx0ZD5AZiRcZnJhY3sxfXtcbGFtYmRhfUBmJDwvdGQ+PC90cj4KKyAgICogPHRyPjx0ZD5NZWRpYW48L3RkPjx0ZD5AZiRcZnJhY3tcbG4gMn17XGxhbWJkYX1AZiQ8L3RkPjwvdHI+CisgICAqIDx0cj48dGQ+TW9kZTwvdGQ+PHRkPkBmJHplcm9AZiQ8L3RkPjwvdHI+CisgICAqIDx0cj48dGQ+UmFuZ2U8L3RkPjx0ZD5AZiRbMCwgXGluZnR5XUBmJDwvdGQ+PC90cj4KKyAgICogPHRyPjx0ZD5TdGFuZGFyZCBEZXZpYXRpb248L3RkPjx0ZD5AZiRcZnJhY3sxfXtcbGFtYmRhfUBmJDwvdGQ+PC90cj4KKyAgICogPC90YWJsZT4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcyBleHBvbmVudGlhbF9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisKKwlleHBsaWNpdAorCXBhcmFtX3R5cGUoX1JlYWxUeXBlIF9fbGFtYmRhID0gX1JlYWxUeXBlKDEpKQorCTogX01fbGFtYmRhKF9fbGFtYmRhKQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9sYW1iZGEgPiBfUmVhbFR5cGUoMCkpOworCX0KKworCV9SZWFsVHlwZQorCWxhbWJkYSgpIGNvbnN0CisJeyByZXR1cm4gX01fbGFtYmRhOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiBfX3AxLl9NX2xhbWJkYSA9PSBfX3AyLl9NX2xhbWJkYTsgfQorCisgICAgICBwcml2YXRlOgorCV9SZWFsVHlwZSBfTV9sYW1iZGE7CisgICAgICB9OworCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhbiBleHBvbmVudGlhbCBkaXN0cmlidXRpb24gd2l0aCBpbnZlcnNlIHNjYWxlCisgICAgICAgKiAgICAgICAgcGFyYW1ldGVyIEBmJFxsYW1iZGFAZiQuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBleHBvbmVudGlhbF9kaXN0cmlidXRpb24oY29uc3QgcmVzdWx0X3R5cGUmIF9fbGFtYmRhID0gcmVzdWx0X3R5cGUoMSkpCisgICAgICA6IF9NX3BhcmFtKF9fbGFtYmRhKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBleHBvbmVudGlhbF9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKgorICAgICAgICogSGFzIG5vIGVmZmVjdCBvbiBleHBvbmVudGlhbCBkaXN0cmlidXRpb25zLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBpbnZlcnNlIHNjYWxlIHBhcmFtZXRlciBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIGxhbWJkYSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5sYW1iZGEoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiByZXN1bHRfdHlwZSgwKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgICAgIHsgcmV0dXJuIHRoaXMtPm9wZXJhdG9yKCkoX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7CisJICBfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIHJlc3VsdF90eXBlPgorCSAgICBfX2F1cm5nKF9fdXJuZyk7CisJICByZXR1cm4gLXN0ZDo6bG9nKHJlc3VsdF90eXBlKDEpIC0gX19hdXJuZygpKSAvIF9fcC5sYW1iZGEoKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHRoaXMtPl9fZ2VuZXJhdGUoX19mLCBfX3QsIF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIGV4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbnMgaGF2ZSB0aGUgc2FtZQorICAgICAgICogICAgICAgIHBhcmFtZXRlcnMuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkJIGNvbnN0IGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbiYgX19kMikKKyAgICAgIHsgcmV0dXJuIF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBleHBvbmVudGlhbCBkaXN0cmlidXRpb25zIGhhdmUgZGlmZmVyZW50CisgICAqICAgICAgICBwYXJhbWV0ZXJzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OmV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QxLAorCSAgICAgICBjb25zdCBzdGQ6OmV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVleHBvbmVudGlhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICoKKyAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIF9feCAgQSAlZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICogYW4gZXJyb3Igc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBzdGQ6OmV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpOworCisgIC8qKgorICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICoKKyAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgKiBAcGFyYW0gX194IEEgJWV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAqICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBzdGQ6OmV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpOworCisKKyAgLyoqCisgICAqIEBicmllZiBBIHdlaWJ1bGxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIG5vcm1hbCBwcm9iYWJpbGl0eSBkZW5zaXR5IGZ1bmN0aW9uIGlzOgorICAgKiBAZlsKKyAgICogICAgIHAoeHxcYWxwaGEsXGJldGEpID0gXGZyYWN7XGFscGhhfXtcYmV0YX0gKFxmcmFje3h9e1xiZXRhfSlee1xhbHBoYS0xfQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBcZXhweygtKFxmcmFje3h9e1xiZXRhfSleXGFscGhhKX0gCisgICAqIEBmXQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIHdlaWJ1bGxfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIHdlaWJ1bGxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisKKwlleHBsaWNpdAorCXBhcmFtX3R5cGUoX1JlYWxUeXBlIF9fYSA9IF9SZWFsVHlwZSgxKSwKKwkJICAgX1JlYWxUeXBlIF9fYiA9IF9SZWFsVHlwZSgxKSkKKwk6IF9NX2EoX19hKSwgX01fYihfX2IpCisJeyB9CisKKwlfUmVhbFR5cGUKKwlhKCkgY29uc3QKKwl7IHJldHVybiBfTV9hOyB9CisKKwlfUmVhbFR5cGUKKwliKCkgY29uc3QKKwl7IHJldHVybiBfTV9iOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiBfX3AxLl9NX2EgPT0gX19wMi5fTV9hICYmIF9fcDEuX01fYiA9PSBfX3AyLl9NX2I7IH0KKworICAgICAgcHJpdmF0ZToKKwlfUmVhbFR5cGUgX01fYTsKKwlfUmVhbFR5cGUgX01fYjsKKyAgICAgIH07CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB3ZWlidWxsX2Rpc3RyaWJ1dGlvbihfUmVhbFR5cGUgX19hID0gX1JlYWxUeXBlKDEpLAorCQkJICAgX1JlYWxUeXBlIF9fYiA9IF9SZWFsVHlwZSgxKSkKKyAgICAgIDogX01fcGFyYW0oX19hLCBfX2IpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIHdlaWJ1bGxfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRoZSBAZiRhQGYkIHBhcmFtZXRlciBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0uYSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0aGUgQGYkYkBmJCBwYXJhbWV0ZXIgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgX1JlYWxUeXBlCisgICAgICBiKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmIoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiByZXN1bHRfdHlwZSgwKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZShfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gV2VpYnVsbCBkaXN0cmlidXRpb25zIGhhdmUgdGhlIHNhbWUKKyAgICAgICAqICAgICAgICBwYXJhbWV0ZXJzLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCB3ZWlidWxsX2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkJIGNvbnN0IHdlaWJ1bGxfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkJY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKyAgICB9OworCisgICAvKioKKyAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gV2VpYnVsbCBkaXN0cmlidXRpb25zIGhhdmUgZGlmZmVyZW50CisgICAgKiAgICAgICAgcGFyYW1ldGVycy4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6d2VpYnVsbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjp3ZWlidWxsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgSW5zZXJ0cyBhICV3ZWlidWxsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgKgorICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgKiBAcGFyYW0gX194ICBBICV3ZWlidWxsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAqIGFuIGVycm9yIHN0YXRlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3Qgc3RkOjp3ZWlidWxsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpOworCisgIC8qKgorICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAld2VpYnVsbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgKgorICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAqIEBwYXJhbSBfX3ggQSAld2VpYnVsbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgKiAgICAgICAgICAgIGdlbmVyYXRvciBlbmdpbmUuCisgICAqCisgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgc3RkOjp3ZWlidWxsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpOworCisKKyAgLyoqCisgICAqIEBicmllZiBBIGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIG5vcm1hbCBwcm9iYWJpbGl0eSBtYXNzIGZ1bmN0aW9uIGlzCisgICAqIEBmWworICAgKiAgICAgcCh4fGEsYikgPSBcZnJhY3sxfXtifQorICAgKiAgICAgICAgICAgICAgICBcZXhwKCBcZnJhY3thLXh9e2J9IC0gXGV4cChcZnJhY3thLXh9e2J9KSkgCisgICAqIEBmXQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisKKwlleHBsaWNpdAorCXBhcmFtX3R5cGUoX1JlYWxUeXBlIF9fYSA9IF9SZWFsVHlwZSgwKSwKKwkJICAgX1JlYWxUeXBlIF9fYiA9IF9SZWFsVHlwZSgxKSkKKwk6IF9NX2EoX19hKSwgX01fYihfX2IpCisJeyB9CisKKwlfUmVhbFR5cGUKKwlhKCkgY29uc3QKKwl7IHJldHVybiBfTV9hOyB9CisKKwlfUmVhbFR5cGUKKwliKCkgY29uc3QKKwl7IHJldHVybiBfTV9iOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiBfX3AxLl9NX2EgPT0gX19wMi5fTV9hICYmIF9fcDEuX01fYiA9PSBfX3AyLl9NX2I7IH0KKworICAgICAgcHJpdmF0ZToKKwlfUmVhbFR5cGUgX01fYTsKKwlfUmVhbFR5cGUgX01fYjsKKyAgICAgIH07CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbihfUmVhbFR5cGUgX19hID0gX1JlYWxUeXBlKDApLAorCQkJCSBfUmVhbFR5cGUgX19iID0gX1JlYWxUeXBlKDEpKQorICAgICAgOiBfTV9wYXJhbShfX2EsIF9fYikKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdGhlIEBmJGFAZiQgcGFyYW1ldGVyIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgYSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5hKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRoZSBAZiRiQGYkIHBhcmFtZXRlciBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIGIoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0uYigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+Ojpsb3dlc3QoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZShfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gZXh0cmVtZSB2YWx1ZSBkaXN0cmlidXRpb25zIGhhdmUgdGhlIHNhbWUKKyAgICAgICAqICAgICAgICBwYXJhbWV0ZXJzLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkJIGNvbnN0IGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkJY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKyAgICB9OworCisgIC8qKgorICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBleHRyZW1lIHZhbHVlIGRpc3RyaWJ1dGlvbnMgaGF2ZSBkaWZmZXJlbnQKKyAgICAqICAgICAgICBwYXJhbWV0ZXJzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OmV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6ZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworICAvKioKKyAgICogQGJyaWVmIEluc2VydHMgYSAlZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICoKKyAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIF9feCAgQSAlZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHN0ZDo6ZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KTsKKworICAvKioKKyAgICogQGJyaWVmIEV4dHJhY3RzIGEgJWV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICogICAgICAgIGRpc3RyaWJ1dGlvbiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAqCisgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIF9feCBBICVleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAqICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBzdGQ6OmV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCk7CisKKworICAvKioKKyAgICogQGJyaWVmIEEgZGlzY3JldGVfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIGRpc2NyZXRlIHByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb24gaXMKKyAgICoKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlID0gaW50PgorICAgIGNsYXNzIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19pbnRlZ3JhbDxfSW50VHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhbiBpbnRlZ3JhbCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9JbnRUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisJZnJpZW5kIGNsYXNzIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT47CisKKwlwYXJhbV90eXBlKCkKKwk6IF9NX3Byb2IoKSwgX01fY3AoKQorCXsgfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJICBwYXJhbV90eXBlKF9JbnB1dEl0ZXJhdG9yIF9fd2JlZ2luLAorCQkgICAgIF9JbnB1dEl0ZXJhdG9yIF9fd2VuZCkKKwkgIDogX01fcHJvYihfX3diZWdpbiwgX193ZW5kKSwgX01fY3AoKQorCSAgeyBfTV9pbml0aWFsaXplKCk7IH0KKworCXBhcmFtX3R5cGUoaW5pdGlhbGl6ZXJfbGlzdDxkb3VibGU+IF9fd2lsKQorCTogX01fcHJvYihfX3dpbC5iZWdpbigpLCBfX3dpbC5lbmQoKSksIF9NX2NwKCkKKwl7IF9NX2luaXRpYWxpemUoKTsgfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmM+CisJICBwYXJhbV90eXBlKHNpemVfdCBfX253LCBkb3VibGUgX194bWluLCBkb3VibGUgX194bWF4LAorCQkgICAgIF9GdW5jIF9fZncpOworCisJLy8gU2VlOiBodHRwOi8vY3BwLW5leHQuY29tL2FyY2hpdmUvMjAxMC8xMC9pbXBsaWNpdC1tb3ZlLW11c3QtZ28vCisJcGFyYW1fdHlwZShjb25zdCBwYXJhbV90eXBlJikgPSBkZWZhdWx0OworCXBhcmFtX3R5cGUmIG9wZXJhdG9yPShjb25zdCBwYXJhbV90eXBlJikgPSBkZWZhdWx0OworCisJc3RkOjp2ZWN0b3I8ZG91YmxlPgorCXByb2JhYmlsaXRpZXMoKSBjb25zdAorCXsgcmV0dXJuIF9NX3Byb2IuZW1wdHkoKSA/IHN0ZDo6dmVjdG9yPGRvdWJsZT4oMSwgMS4wKSA6IF9NX3Byb2I7IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fcHJvYiA9PSBfX3AyLl9NX3Byb2I7IH0KKworICAgICAgcHJpdmF0ZToKKwl2b2lkCisJX01faW5pdGlhbGl6ZSgpOworCisJc3RkOjp2ZWN0b3I8ZG91YmxlPiBfTV9wcm9iOworCXN0ZDo6dmVjdG9yPGRvdWJsZT4gX01fY3A7CisgICAgICB9OworCisgICAgICBkaXNjcmV0ZV9kaXN0cmlidXRpb24oKQorICAgICAgOiBfTV9wYXJhbSgpCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJZGlzY3JldGVfZGlzdHJpYnV0aW9uKF9JbnB1dEl0ZXJhdG9yIF9fd2JlZ2luLAorCQkJICAgICAgX0lucHV0SXRlcmF0b3IgX193ZW5kKQorCTogX01fcGFyYW0oX193YmVnaW4sIF9fd2VuZCkKKwl7IH0KKworICAgICAgZGlzY3JldGVfZGlzdHJpYnV0aW9uKGluaXRpYWxpemVyX2xpc3Q8ZG91YmxlPiBfX3dsKQorICAgICAgOiBfTV9wYXJhbShfX3dsKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jPgorCWRpc2NyZXRlX2Rpc3RyaWJ1dGlvbihzaXplX3QgX19udywgZG91YmxlIF9feG1pbiwgZG91YmxlIF9feG1heCwKKwkJCSAgICAgIF9GdW5jIF9fZncpCisJOiBfTV9wYXJhbShfX253LCBfX3htaW4sIF9feG1heCwgX19mdykKKwl7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHByb2JhYmlsaXRpZXMgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgc3RkOjp2ZWN0b3I8ZG91YmxlPgorICAgICAgcHJvYmFiaWxpdGllcygpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9NX3BhcmFtLl9NX3Byb2IuZW1wdHkoKQorCSAgPyBzdGQ6OnZlY3Rvcjxkb3VibGU+KDEsIDEuMCkgOiBfTV9wYXJhbS5fTV9wcm9iOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiByZXN1bHRfdHlwZSgwKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX01fcGFyYW0uX01fcHJvYi5lbXB0eSgpCisJICA/IHJlc3VsdF90eXBlKDApIDogcmVzdWx0X3R5cGUoX01fcGFyYW0uX01fcHJvYi5zaXplKCkgLSAxKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgcmV0dXJuIHRoaXMtPm9wZXJhdG9yKCkoX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHRoaXMtPl9fZ2VuZXJhdGUoX19mLCBfX3QsIF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIGRpc2NyZXRlIGRpc3RyaWJ1dGlvbnMgaGF2ZSB0aGUgc2FtZQorICAgICAgICogICAgICAgIHBhcmFtZXRlcnMuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkJIGNvbnN0IGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbiYgX19kMikKKyAgICAgIHsgcmV0dXJuIF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIGEgJWRpc2NyZXRlX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlZGlzY3JldGVfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBzdGQ6OmRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZTE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyBhICVkaXNjcmV0ZV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194IEEgJWRpc2NyZXRlX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgICAgIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3IKKyAgICAgICAqICAgICAgICAgIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgc3RkOjpkaXNjcmV0ZV9kaXN0cmlidXRpb248X0ludFR5cGUxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworICAgIH07CisKKyAgLyoqCisgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIGRpc2NyZXRlIGRpc3RyaWJ1dGlvbnMgaGF2ZSBkaWZmZXJlbnQKKyAgICAqICAgICAgICBwYXJhbWV0ZXJzLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OmRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6ZGlzY3JldGVfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIHBpZWNld2lzZSBjb25zdGFudCBwcm9iYWJpbGl0eSBtYXNzIGZ1bmN0aW9uIGlzCisgICAqCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19mbG9hdGluZ19wb2ludDxfUmVhbFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYSBmbG9hdGluZyBwb2ludCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisJZnJpZW5kIGNsYXNzIHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjsKKworCXBhcmFtX3R5cGUoKQorCTogX01faW50KCksIF9NX2RlbigpLCBfTV9jcCgpCisJeyB9CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvckIsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yVz4KKwkgIHBhcmFtX3R5cGUoX0lucHV0SXRlcmF0b3JCIF9fYmZpcnN0LAorCQkgICAgIF9JbnB1dEl0ZXJhdG9yQiBfX2JlbmQsCisJCSAgICAgX0lucHV0SXRlcmF0b3JXIF9fd2JlZ2luKTsKKworCXRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jPgorCSAgcGFyYW1fdHlwZShpbml0aWFsaXplcl9saXN0PF9SZWFsVHlwZT4gX19iaSwgX0Z1bmMgX19mdyk7CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYz4KKwkgIHBhcmFtX3R5cGUoc2l6ZV90IF9fbncsIF9SZWFsVHlwZSBfX3htaW4sIF9SZWFsVHlwZSBfX3htYXgsCisJCSAgICAgX0Z1bmMgX19mdyk7CisKKwkvLyBTZWU6IGh0dHA6Ly9jcHAtbmV4dC5jb20vYXJjaGl2ZS8yMDEwLzEwL2ltcGxpY2l0LW1vdmUtbXVzdC1nby8KKwlwYXJhbV90eXBlKGNvbnN0IHBhcmFtX3R5cGUmKSA9IGRlZmF1bHQ7CisJcGFyYW1fdHlwZSYgb3BlcmF0b3I9KGNvbnN0IHBhcmFtX3R5cGUmKSA9IGRlZmF1bHQ7CisKKwlzdGQ6OnZlY3RvcjxfUmVhbFR5cGU+CisJaW50ZXJ2YWxzKCkgY29uc3QKKwl7CisJICBpZiAoX01faW50LmVtcHR5KCkpCisJICAgIHsKKwkgICAgICBzdGQ6OnZlY3RvcjxfUmVhbFR5cGU+IF9fdG1wKDIpOworCSAgICAgIF9fdG1wWzFdID0gX1JlYWxUeXBlKDEpOworCSAgICAgIHJldHVybiBfX3RtcDsKKwkgICAgfQorCSAgZWxzZQorCSAgICByZXR1cm4gX01faW50OworCX0KKworCXN0ZDo6dmVjdG9yPGRvdWJsZT4KKwlkZW5zaXRpZXMoKSBjb25zdAorCXsgcmV0dXJuIF9NX2Rlbi5lbXB0eSgpID8gc3RkOjp2ZWN0b3I8ZG91YmxlPigxLCAxLjApIDogX01fZGVuOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiBfX3AxLl9NX2ludCA9PSBfX3AyLl9NX2ludCAmJiBfX3AxLl9NX2RlbiA9PSBfX3AyLl9NX2RlbjsgfQorCisgICAgICBwcml2YXRlOgorCXZvaWQKKwlfTV9pbml0aWFsaXplKCk7CisKKwlzdGQ6OnZlY3RvcjxfUmVhbFR5cGU+IF9NX2ludDsKKwlzdGQ6OnZlY3Rvcjxkb3VibGU+IF9NX2RlbjsKKwlzdGQ6OnZlY3Rvcjxkb3VibGU+IF9NX2NwOworICAgICAgfTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb24oKQorICAgICAgOiBfTV9wYXJhbSgpCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3JCLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvclc+CisJcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbihfSW5wdXRJdGVyYXRvckIgX19iZmlyc3QsCisJCQkJCV9JbnB1dEl0ZXJhdG9yQiBfX2JlbmQsCisJCQkJCV9JbnB1dEl0ZXJhdG9yVyBfX3diZWdpbikKKwk6IF9NX3BhcmFtKF9fYmZpcnN0LCBfX2JlbmQsIF9fd2JlZ2luKQorCXsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYz4KKwlwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uKGluaXRpYWxpemVyX2xpc3Q8X1JlYWxUeXBlPiBfX2JsLAorCQkJCQlfRnVuYyBfX2Z3KQorCTogX01fcGFyYW0oX19ibCwgX19mdykKKwl7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmM+CisJcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbihzaXplX3QgX19udywKKwkJCQkJX1JlYWxUeXBlIF9feG1pbiwgX1JlYWxUeXBlIF9feG1heCwKKwkJCQkJX0Z1bmMgX19mdykKKwk6IF9NX3BhcmFtKF9fbncsIF9feG1pbiwgX194bWF4LCBfX2Z3KQorCXsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgYSB2ZWN0b3Igb2YgdGhlIGludGVydmFscy4KKyAgICAgICAqLworICAgICAgc3RkOjp2ZWN0b3I8X1JlYWxUeXBlPgorICAgICAgaW50ZXJ2YWxzKCkgY29uc3QKKyAgICAgIHsKKwlpZiAoX01fcGFyYW0uX01faW50LmVtcHR5KCkpCisJICB7CisJICAgIHN0ZDo6dmVjdG9yPF9SZWFsVHlwZT4gX190bXAoMik7CisJICAgIF9fdG1wWzFdID0gX1JlYWxUeXBlKDEpOworCSAgICByZXR1cm4gX190bXA7CisJICB9CisJZWxzZQorCSAgcmV0dXJuIF9NX3BhcmFtLl9NX2ludDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyBhIHZlY3RvciBvZiB0aGUgcHJvYmFiaWxpdHkgZGVuc2l0aWVzLgorICAgICAgICovCisgICAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+CisgICAgICBkZW5zaXRpZXMoKSBjb25zdAorICAgICAgeworCXJldHVybiBfTV9wYXJhbS5fTV9kZW4uZW1wdHkoKQorCSAgPyBzdGQ6OnZlY3Rvcjxkb3VibGU+KDEsIDEuMCkgOiBfTV9wYXJhbS5fTV9kZW47CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX01fcGFyYW0uX01faW50LmVtcHR5KCkKKwkgID8gcmVzdWx0X3R5cGUoMCkgOiBfTV9wYXJhbS5fTV9pbnQuZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9NX3BhcmFtLl9NX2ludC5lbXB0eSgpCisJICA/IHJlc3VsdF90eXBlKDEpIDogX01fcGFyYW0uX01faW50LmJhY2soKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgcmV0dXJuIHRoaXMtPm9wZXJhdG9yKCkoX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHRoaXMtPl9fZ2VuZXJhdGUoX19mLCBfX3QsIF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIHBpZWNld2lzZSBjb25zdGFudCBkaXN0cmlidXRpb25zIGhhdmUgdGhlCisgICAgICAgKiAgICAgICAgc2FtZSBwYXJhbWV0ZXJzLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uJiBfX2QxLAorCQkgY29uc3QgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbiYgX19kMikKKyAgICAgIHsgcmV0dXJuIF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIGEgJXBpZWNld2lzZV9jb25zdGFuX2Rpc3RyaWJ1dGlvbiByYW5kb20KKyAgICAgICAqICAgICAgICBudW1iZXIgZGlzdHJpYnV0aW9uIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJXBpZWNld2lzZV9jb25zdGFuX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgICAgICBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBzdGQ6OnBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEV4dHJhY3RzIGEgJXBpZWNld2lzZV9jb25zdGFuX2Rpc3RyaWJ1dGlvbiByYW5kb20KKyAgICAgICAqICAgICAgICBudW1iZXIgZGlzdHJpYnV0aW9uIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194IEEgJXBpZWNld2lzZV9jb25zdGFuX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgICAgIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3IKKyAgICAgICAqICAgICAgICAgIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIHN0ZDo6cGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworICAgIH07CisKKyAgLyoqCisgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIHBpZWNld2lzZSBjb25zdGFudCBkaXN0cmlidXRpb25zIGhhdmUgCisgICAgKiAgICAgICAgZGlmZmVyZW50IHBhcmFtZXRlcnMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6cGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QxLAorCSAgICAgICBjb25zdCBzdGQ6OnBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBwaWVjZXdpc2UgbGluZWFyIHByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb24gaXMKKyAgICoKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcyBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19mbG9hdGluZ19wb2ludDxfUmVhbFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYSBmbG9hdGluZyBwb2ludCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCWZyaWVuZCBjbGFzcyBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OworCisJcGFyYW1fdHlwZSgpCisJOiBfTV9pbnQoKSwgX01fZGVuKCksIF9NX2NwKCksIF9NX20oKQorCXsgfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3JCLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvclc+CisJICBwYXJhbV90eXBlKF9JbnB1dEl0ZXJhdG9yQiBfX2JmaXJzdCwKKwkJICAgICBfSW5wdXRJdGVyYXRvckIgX19iZW5kLAorCQkgICAgIF9JbnB1dEl0ZXJhdG9yVyBfX3diZWdpbik7CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYz4KKwkgIHBhcmFtX3R5cGUoaW5pdGlhbGl6ZXJfbGlzdDxfUmVhbFR5cGU+IF9fYmwsIF9GdW5jIF9fZncpOworCisJdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmM+CisJICBwYXJhbV90eXBlKHNpemVfdCBfX253LCBfUmVhbFR5cGUgX194bWluLCBfUmVhbFR5cGUgX194bWF4LAorCQkgICAgIF9GdW5jIF9fZncpOworCisJLy8gU2VlOiBodHRwOi8vY3BwLW5leHQuY29tL2FyY2hpdmUvMjAxMC8xMC9pbXBsaWNpdC1tb3ZlLW11c3QtZ28vCisJcGFyYW1fdHlwZShjb25zdCBwYXJhbV90eXBlJikgPSBkZWZhdWx0OworCXBhcmFtX3R5cGUmIG9wZXJhdG9yPShjb25zdCBwYXJhbV90eXBlJikgPSBkZWZhdWx0OworCisJc3RkOjp2ZWN0b3I8X1JlYWxUeXBlPgorCWludGVydmFscygpIGNvbnN0CisJeworCSAgaWYgKF9NX2ludC5lbXB0eSgpKQorCSAgICB7CisJICAgICAgc3RkOjp2ZWN0b3I8X1JlYWxUeXBlPiBfX3RtcCgyKTsKKwkgICAgICBfX3RtcFsxXSA9IF9SZWFsVHlwZSgxKTsKKwkgICAgICByZXR1cm4gX190bXA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgcmV0dXJuIF9NX2ludDsKKwl9CisKKwlzdGQ6OnZlY3Rvcjxkb3VibGU+CisJZGVuc2l0aWVzKCkgY29uc3QKKwl7IHJldHVybiBfTV9kZW4uZW1wdHkoKSA/IHN0ZDo6dmVjdG9yPGRvdWJsZT4oMiwgMS4wKSA6IF9NX2RlbjsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gKF9fcDEuX01faW50ID09IF9fcDIuX01faW50CisJCSAgJiYgX19wMS5fTV9kZW4gPT0gX19wMi5fTV9kZW4pOyB9CisKKyAgICAgIHByaXZhdGU6CisJdm9pZAorCV9NX2luaXRpYWxpemUoKTsKKworCXN0ZDo6dmVjdG9yPF9SZWFsVHlwZT4gX01faW50OworCXN0ZDo6dmVjdG9yPGRvdWJsZT4gX01fZGVuOworCXN0ZDo6dmVjdG9yPGRvdWJsZT4gX01fY3A7CisJc3RkOjp2ZWN0b3I8ZG91YmxlPiBfTV9tOworICAgICAgfTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uKCkKKyAgICAgIDogX01fcGFyYW0oKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yQiwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3JXPgorCXBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uKF9JbnB1dEl0ZXJhdG9yQiBfX2JmaXJzdCwKKwkJCQkgICAgICBfSW5wdXRJdGVyYXRvckIgX19iZW5kLAorCQkJCSAgICAgIF9JbnB1dEl0ZXJhdG9yVyBfX3diZWdpbikKKwk6IF9NX3BhcmFtKF9fYmZpcnN0LCBfX2JlbmQsIF9fd2JlZ2luKQorCXsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYz4KKwlwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbihpbml0aWFsaXplcl9saXN0PF9SZWFsVHlwZT4gX19ibCwKKwkJCQkgICAgICBfRnVuYyBfX2Z3KQorCTogX01fcGFyYW0oX19ibCwgX19mdykKKwl7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmM+CisJcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb24oc2l6ZV90IF9fbncsCisJCQkJICAgICAgX1JlYWxUeXBlIF9feG1pbiwgX1JlYWxUeXBlIF9feG1heCwKKwkJCQkgICAgICBfRnVuYyBfX2Z3KQorCTogX01fcGFyYW0oX19udywgX194bWluLCBfX3htYXgsIF9fZncpCisJeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRoZSBpbnRlcnZhbHMgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgc3RkOjp2ZWN0b3I8X1JlYWxUeXBlPgorICAgICAgaW50ZXJ2YWxzKCkgY29uc3QKKyAgICAgIHsKKwlpZiAoX01fcGFyYW0uX01faW50LmVtcHR5KCkpCisJICB7CisJICAgIHN0ZDo6dmVjdG9yPF9SZWFsVHlwZT4gX190bXAoMik7CisJICAgIF9fdG1wWzFdID0gX1JlYWxUeXBlKDEpOworCSAgICByZXR1cm4gX190bXA7CisJICB9CisJZWxzZQorCSAgcmV0dXJuIF9NX3BhcmFtLl9NX2ludDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIGEgdmVjdG9yIG9mIHRoZSBwcm9iYWJpbGl0eSBkZW5zaXRpZXMgb2YgdGhlCisgICAgICAgKiAgICAgICAgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+CisgICAgICBkZW5zaXRpZXMoKSBjb25zdAorICAgICAgeworCXJldHVybiBfTV9wYXJhbS5fTV9kZW4uZW1wdHkoKQorCSAgPyBzdGQ6OnZlY3Rvcjxkb3VibGU+KDIsIDEuMCkgOiBfTV9wYXJhbS5fTV9kZW47CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX01fcGFyYW0uX01faW50LmVtcHR5KCkKKwkgID8gcmVzdWx0X3R5cGUoMCkgOiBfTV9wYXJhbS5fTV9pbnQuZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9NX3BhcmFtLl9NX2ludC5lbXB0eSgpCisJICA/IHJlc3VsdF90eXBlKDEpIDogX01fcGFyYW0uX01faW50LmJhY2soKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgcmV0dXJuIHRoaXMtPm9wZXJhdG9yKCkoX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHRoaXMtPl9fZ2VuZXJhdGUoX19mLCBfX3QsIF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIHBpZWNld2lzZSBsaW5lYXIgZGlzdHJpYnV0aW9ucyBoYXZlIHRoZQorICAgICAgICogICAgICAgIHNhbWUgcGFyYW1ldGVycy4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb24mIF9fZDEsCisJCSBjb25zdCBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbiYgX19kMikKKyAgICAgIHsgcmV0dXJuIF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIGEgJXBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICBkaXN0cmlidXRpb24gQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICAgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogICAgICAgICAgYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3Qgc3RkOjpwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgIGRpc3RyaWJ1dGlvbiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvcgorICAgICAgICogICAgICAgICAgc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgc3RkOjpwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworICAgIH07CisKKyAgLyoqCisgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIHBpZWNld2lzZSBsaW5lYXIgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAgKiAgICAgICAgZGlmZmVyZW50IHBhcmFtZXRlcnMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6cGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjpwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisKKyAgLyogQH0gKi8gLy8gZ3JvdXAgcmFuZG9tX2Rpc3RyaWJ1dGlvbnNfcG9pc3NvbgorCisgIC8qIEB9ICovIC8vIGdyb3VwIHJhbmRvbV9kaXN0cmlidXRpb25zCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIHJhbmRvbV91dGlsaXRpZXMgUmFuZG9tIE51bWJlciBVdGlsaXRpZXMKKyAgICogQGluZ3JvdXAgcmFuZG9tCisgICAqIEB7CisgICAqLworCisgIC8qKgorICAgKiBAYnJpZWYgVGhlIHNlZWRfc2VxIGNsYXNzIGdlbmVyYXRlcyBzZXF1ZW5jZXMgb2Ygc2VlZHMgZm9yIHJhbmRvbQorICAgKiAgICAgICAgbnVtYmVyIGdlbmVyYXRvcnMuCisgICAqLworICBjbGFzcyBzZWVkX3NlcQorICB7CisKKyAgcHVibGljOgorICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgc2VlZCB2YWxlcy4gKi8KKyAgICB0eXBlZGVmIHVpbnRfbGVhc3QzMl90IHJlc3VsdF90eXBlOworCisgICAgLyoqIERlZmF1bHQgY29uc3RydWN0b3IuICovCisgICAgc2VlZF9zZXEoKQorICAgIDogX01fdigpCisgICAgeyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICAgIHNlZWRfc2VxKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfSW50VHlwZT4gaWwpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICBzZWVkX3NlcShfSW5wdXRJdGVyYXRvciBfX2JlZ2luLCBfSW5wdXRJdGVyYXRvciBfX2VuZCk7CisKKyAgICAvLyBnZW5lcmF0aW5nIGZ1bmN0aW9ucworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIGdlbmVyYXRlKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2JlZ2luLCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19lbmQpOworCisgICAgLy8gcHJvcGVydHkgZnVuY3Rpb25zCisgICAgc2l6ZV90IHNpemUoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3Yuc2l6ZSgpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdXRwdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKE91dHB1dEl0ZXJhdG9yIF9fZGVzdCkgY29uc3QKKyAgICAgIHsgc3RkOjpjb3B5KF9NX3YuYmVnaW4oKSwgX01fdi5lbmQoKSwgX19kZXN0KTsgfQorCisgIHByaXZhdGU6CisgICAgLy8vCisgICAgc3RkOjp2ZWN0b3I8cmVzdWx0X3R5cGU+IF9NX3Y7CisgIH07CisKKyAgLyogQH0gKi8gLy8gZ3JvdXAgcmFuZG9tX3V0aWxpdGllcworCisgIC8qIEB9ICovIC8vIGdyb3VwIHJhbmRvbQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yYW5kb20udGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JhbmRvbS50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBjNjU1MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yYW5kb20udGNjCkBAIC0wLDAgKzEsMzQ4NiBAQAorLy8gcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIChvdXQgb2YgbGluZSkgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvcmFuZG9tLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3JhbmRvbX0KKyAqLworCisjaWZuZGVmIF9SQU5ET01fVENDCisjZGVmaW5lIF9SQU5ET01fVENDIDEKKworI2luY2x1ZGUgPG51bWVyaWM+IC8vIHN0ZDo6YWNjdW11bGF0ZSBhbmQgc3RkOjpwYXJ0aWFsX3N1bQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKKyAgLyoKKyAgICogKEZ1cnRoZXIpIGltcGxlbWVudGF0aW9uLXNwYWNlIGRldGFpbHMuCisgICAqLworICBuYW1lc3BhY2UgX19kZXRhaWwKKyAgeworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgICAgLy8gR2VuZXJhbCBjYXNlIGZvciB4ID0gKGF4ICsgYykgbW9kIG0gLS0gdXNlIFNjaHJhZ2UncyBhbGdvcml0aG0KKyAgICAvLyB0byBhdm9pZCBpbnRlZ2VyIG92ZXJmbG93LgorICAgIC8vCisgICAgLy8gUHJlY29uZGl0aW9uczogIGEgPiAwLCBtID4gMC4KKyAgICAvLworICAgIC8vIE5vdGU6IG9ubHkgd29ya3MgY29ycmVjdGx5IGZvciBfX20gJSBfX2EgPCBfX20gLyBfX2EuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfVHAgX19tLCBfVHAgX19hLCBfVHAgX19jPgorICAgICAgX1RwCisgICAgICBfTW9kPF9UcCwgX19tLCBfX2EsIF9fYywgZmFsc2UsIHRydWU+OjoKKyAgICAgIF9fY2FsYyhfVHAgX194KQorICAgICAgeworCWlmIChfX2EgPT0gMSkKKwkgIF9feCAlPSBfX207CisJZWxzZQorCSAgeworCSAgICBzdGF0aWMgY29uc3QgX1RwIF9fcSA9IF9fbSAvIF9fYTsKKwkgICAgc3RhdGljIGNvbnN0IF9UcCBfX3IgPSBfX20gJSBfX2E7CisKKwkgICAgX1RwIF9fdDEgPSBfX2EgKiAoX194ICUgX19xKTsKKwkgICAgX1RwIF9fdDIgPSBfX3IgKiAoX194IC8gX19xKTsKKwkgICAgaWYgKF9fdDEgPj0gX190MikKKwkgICAgICBfX3ggPSBfX3QxIC0gX190MjsKKwkgICAgZWxzZQorCSAgICAgIF9feCA9IF9fbSAtIF9fdDIgKyBfX3QxOworCSAgfQorCisJaWYgKF9fYyAhPSAwKQorCSAgeworCSAgICBjb25zdCBfVHAgX19kID0gX19tIC0gX194OworCSAgICBpZiAoX19kID4gX19jKQorCSAgICAgIF9feCArPSBfX2M7CisJICAgIGVsc2UKKwkgICAgICBfX3ggPSBfX2MgLSBfX2Q7CisJICB9CisJcmV0dXJuIF9feDsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVHA+CisgICAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICAgIF9fbm9ybWFsaXplKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIGNvbnN0IF9UcCYgX19mYWN0b3IpCisgICAgICB7CisJZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICsrX19yZXN1bHQpCisJICAqX19yZXN1bHQgPSAqX19maXJzdCAvIF9fZmFjdG9yOworCXJldHVybiBfX3Jlc3VsdDsKKyAgICAgIH0KKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2UgX19kZXRhaWwKKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20+CisgICAgY29uc3RleHByIF9VSW50VHlwZQorICAgIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT46Om11bHRpcGxpZXI7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tPgorICAgIGNvbnN0ZXhwciBfVUludFR5cGUKKyAgICBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxfVUludFR5cGUsIF9fYSwgX19jLCBfX20+OjppbmNyZW1lbnQ7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tPgorICAgIGNvbnN0ZXhwciBfVUludFR5cGUKKyAgICBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxfVUludFR5cGUsIF9fYSwgX19jLCBfX20+Ojptb2R1bHVzOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbT4KKyAgICBjb25zdGV4cHIgX1VJbnRUeXBlCisgICAgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8X1VJbnRUeXBlLCBfX2EsIF9fYywgX19tPjo6ZGVmYXVsdF9zZWVkOworCisgIC8qKgorICAgKiBTZWVkcyB0aGUgTENSIHdpdGggaW50ZWdyYWwgdmFsdWUgQHAgX19zLCBhZGp1c3RlZCBzbyB0aGF0IHRoZQorICAgKiByaW5nIGlkZW50aXR5IGlzIG5ldmVyIGEgbWVtYmVyIG9mIHRoZSBjb252ZXJnZW5jZSBzZXQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20+CisgICAgdm9pZAorICAgIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT46OgorICAgIHNlZWQocmVzdWx0X3R5cGUgX19zKQorICAgIHsKKyAgICAgIGlmICgoX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgX19tPihfX2MpID09IDApCisJICAmJiAoX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgX19tPihfX3MpID09IDApKQorCV9NX3ggPSAxOworICAgICAgZWxzZQorCV9NX3ggPSBfX2RldGFpbDo6X19tb2Q8X1VJbnRUeXBlLCBfX20+KF9fcyk7CisgICAgfQorCisgIC8qKgorICAgKiBTZWVkcyB0aGUgTENSIGVuZ2luZSB3aXRoIGEgdmFsdWUgZ2VuZXJhdGVkIGJ5IEBwIF9fcS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3NlcT4KKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY2xhc3M8X1NzZXE+Ojp2YWx1ZT46OnR5cGUKKyAgICAgIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT46OgorICAgICAgc2VlZChfU3NlcSYgX19xKQorICAgICAgeworCWNvbnN0IF9VSW50VHlwZSBfX2swID0gX19tID09IDAgPyBzdGQ6Om51bWVyaWNfbGltaXRzPF9VSW50VHlwZT46OmRpZ2l0cworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzdGQ6Ol9fbGcoX19tKTsKKwljb25zdCBfVUludFR5cGUgX19rID0gKF9fazAgKyAzMSkgLyAzMjsKKwl1aW50X2xlYXN0MzJfdCBfX2FycltfX2sgKyAzXTsKKwlfX3EuZ2VuZXJhdGUoX19hcnIgKyAwLCBfX2FyciArIF9fayArIDMpOworCV9VSW50VHlwZSBfX2ZhY3RvciA9IDF1OworCV9VSW50VHlwZSBfX3N1bSA9IDB1OworCWZvciAoc2l6ZV90IF9faiA9IDA7IF9faiA8IF9fazsgKytfX2opCisJICB7CisJICAgIF9fc3VtICs9IF9fYXJyW19faiArIDNdICogX19mYWN0b3I7CisJICAgIF9fZmFjdG9yICo9IF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCAzMj46Ol9fdmFsdWU7CisJICB9CisJc2VlZChfX3N1bSk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxfVUludFR5cGUsCisJCQkJCQlfX2EsIF9fYywgX19tPiYgX19sY3IpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpmaXhlZCB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fb3Mud2lkZW4oJyAnKSk7CisKKyAgICAgIF9fb3MgPDwgX19sY3IuX01feDsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbSwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8X1VJbnRUeXBlLCBfX2EsIF9fYywgX19tPiYgX19sY3IpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMpOworCisgICAgICBfX2lzID4+IF9fbGNyLl9NX3g7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsCisJICAgc2l6ZV90IF9fdywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsCisJICAgX1VJbnRUeXBlIF9fZj4KKyAgICBjb25zdGV4cHIgc2l6ZV90CisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsCisJCQkgICAgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46OndvcmRfc2l6ZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsCisJICAgc2l6ZV90IF9fdywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsCisJICAgX1VJbnRUeXBlIF9fZj4KKyAgICBjb25zdGV4cHIgc2l6ZV90CisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsCisJCQkgICAgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46OnN0YXRlX3NpemU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLAorCSAgIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2Y+CisgICAgY29uc3RleHByIHNpemVfdAorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+OjpzaGlmdF9zaXplOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwKKwkgICBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwKKwkgICBfVUludFR5cGUgX19mPgorICAgIGNvbnN0ZXhwciBzaXplX3QKKyAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwKKwkJCSAgICBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6bWFza19iaXRzOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwKKwkgICBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwKKwkgICBfVUludFR5cGUgX19mPgorICAgIGNvbnN0ZXhwciBfVUludFR5cGUKKyAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwKKwkJCSAgICBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6eG9yX21hc2s7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLAorCSAgIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2Y+CisgICAgY29uc3RleHByIHNpemVfdAorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+Ojp0ZW1wZXJpbmdfdTsKKyAgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsCisJICAgc2l6ZV90IF9fdywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsCisJICAgX1VJbnRUeXBlIF9fZj4KKyAgICBjb25zdGV4cHIgX1VJbnRUeXBlCisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsCisJCQkgICAgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46OnRlbXBlcmluZ19kOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwKKwkgICBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwKKwkgICBfVUludFR5cGUgX19mPgorICAgIGNvbnN0ZXhwciBzaXplX3QKKyAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwKKwkJCSAgICBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6dGVtcGVyaW5nX3M7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLAorCSAgIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2Y+CisgICAgY29uc3RleHByIF9VSW50VHlwZQorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+Ojp0ZW1wZXJpbmdfYjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsCisJICAgc2l6ZV90IF9fdywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsCisJICAgX1VJbnRUeXBlIF9fZj4KKyAgICBjb25zdGV4cHIgc2l6ZV90CisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsCisJCQkgICAgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46OnRlbXBlcmluZ190OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwKKwkgICBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwKKwkgICBfVUludFR5cGUgX19mPgorICAgIGNvbnN0ZXhwciBfVUludFR5cGUKKyAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwKKwkJCSAgICBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6dGVtcGVyaW5nX2M7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLAorCSAgIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2Y+CisgICAgY29uc3RleHByIHNpemVfdAorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+Ojp0ZW1wZXJpbmdfbDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsCisJICAgc2l6ZV90IF9fdywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsCisJICAgX1VJbnRUeXBlIF9fZj4KKyAgICBjb25zdGV4cHIgX1VJbnRUeXBlCisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsCisJCQkgICAgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uX211bHRpcGxpZXI7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLAorCSAgIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2Y+CisgICAgY29uc3RleHByIF9VSW50VHlwZQorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+OjpkZWZhdWx0X3NlZWQ7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLAorCSAgIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2Y+CisgICAgdm9pZAorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+OjoKKyAgICBzZWVkKHJlc3VsdF90eXBlIF9fc2QpCisgICAgeworICAgICAgX01feFswXSA9IF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsCisJX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIF9fdz46Ol9fdmFsdWU+KF9fc2QpOworCisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAxOyBfX2kgPCBzdGF0ZV9zaXplOyArK19faSkKKwl7CisJICBfVUludFR5cGUgX194ID0gX01feFtfX2kgLSAxXTsKKwkgIF9feCBePSBfX3ggPj4gKF9fdyAtIDIpOworCSAgX194ICo9IF9fZjsKKwkgIF9feCArPSBfX2RldGFpbDo6X19tb2Q8X1VJbnRUeXBlLCBfX24+KF9faSk7CisJICBfTV94W19faV0gPSBfX2RldGFpbDo6X19tb2Q8X1VJbnRUeXBlLAorCSAgICBfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgX193Pjo6X192YWx1ZT4oX194KTsKKwl9CisgICAgICBfTV9wID0gc3RhdGVfc2l6ZTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLAorCSAgIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2Y+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXE+CisgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NsYXNzPF9Tc2VxPjo6dmFsdWU+Ojp0eXBlCisgICAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwKKwkJCSAgICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+OjoKKyAgICAgIHNlZWQoX1NzZXEmIF9fcSkKKyAgICAgIHsKKwljb25zdCBfVUludFR5cGUgX191cHBlcl9tYXNrID0gKH5fVUludFR5cGUoKSkgPDwgX19yOworCWNvbnN0IHNpemVfdCBfX2sgPSAoX193ICsgMzEpIC8gMzI7CisJdWludF9sZWFzdDMyX3QgX19hcnJbX19uICogX19rXTsKKwlfX3EuZ2VuZXJhdGUoX19hcnIgKyAwLCBfX2FyciArIF9fbiAqIF9fayk7CisKKwlib29sIF9femVybyA9IHRydWU7CisJZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgc3RhdGVfc2l6ZTsgKytfX2kpCisJICB7CisJICAgIF9VSW50VHlwZSBfX2ZhY3RvciA9IDF1OworCSAgICBfVUludFR5cGUgX19zdW0gPSAwdTsKKwkgICAgZm9yIChzaXplX3QgX19qID0gMDsgX19qIDwgX19rOyArK19faikKKwkgICAgICB7CisJCV9fc3VtICs9IF9fYXJyW19fayAqIF9faSArIF9fal0gKiBfX2ZhY3RvcjsKKwkJX19mYWN0b3IgKj0gX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIDMyPjo6X192YWx1ZTsKKwkgICAgICB9CisJICAgIF9NX3hbX19pXSA9IF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsCisJICAgICAgX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIF9fdz46Ol9fdmFsdWU+KF9fc3VtKTsKKworCSAgICBpZiAoX196ZXJvKQorCSAgICAgIHsKKwkJaWYgKF9faSA9PSAwKQorCQkgIHsKKwkJICAgIGlmICgoX01feFswXSAmIF9fdXBwZXJfbWFzaykgIT0gMHUpCisJCSAgICAgIF9femVybyA9IGZhbHNlOworCQkgIH0KKwkJZWxzZSBpZiAoX01feFtfX2ldICE9IDB1KQorCQkgIF9femVybyA9IGZhbHNlOworCSAgICAgIH0KKwkgIH0KKyAgICAgICAgaWYgKF9femVybykKKyAgICAgICAgICBfTV94WzBdID0gX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIF9fdyAtIDE+OjpfX3ZhbHVlOworCV9NX3AgPSBzdGF0ZV9zaXplOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fdywKKwkgICBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwKKwkgICBfVUludFR5cGUgX19mPgorICAgIHZvaWQKKyAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwKKwkJCSAgICBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6CisgICAgX01fZ2VuX3JhbmQodm9pZCkKKyAgICB7CisgICAgICBjb25zdCBfVUludFR5cGUgX191cHBlcl9tYXNrID0gKH5fVUludFR5cGUoKSkgPDwgX19yOworICAgICAgY29uc3QgX1VJbnRUeXBlIF9fbG93ZXJfbWFzayA9IH5fX3VwcGVyX21hc2s7CisKKyAgICAgIGZvciAoc2l6ZV90IF9fayA9IDA7IF9fayA8IChfX24gLSBfX20pOyArK19faykKKyAgICAgICAgeworCSAgX1VJbnRUeXBlIF9feSA9ICgoX01feFtfX2tdICYgX191cHBlcl9tYXNrKQorCQkJICAgfCAoX01feFtfX2sgKyAxXSAmIF9fbG93ZXJfbWFzaykpOworCSAgX01feFtfX2tdID0gKF9NX3hbX19rICsgX19tXSBeIChfX3kgPj4gMSkKKwkJICAgICAgIF4gKChfX3kgJiAweDAxKSA/IF9fYSA6IDApKTsKKyAgICAgICAgfQorCisgICAgICBmb3IgKHNpemVfdCBfX2sgPSAoX19uIC0gX19tKTsgX19rIDwgKF9fbiAtIDEpOyArK19faykKKwl7CisJICBfVUludFR5cGUgX195ID0gKChfTV94W19fa10gJiBfX3VwcGVyX21hc2spCisJCQkgICB8IChfTV94W19fayArIDFdICYgX19sb3dlcl9tYXNrKSk7CisJICBfTV94W19fa10gPSAoX01feFtfX2sgKyAoX19tIC0gX19uKV0gXiAoX195ID4+IDEpCisJCSAgICAgICBeICgoX195ICYgMHgwMSkgPyBfX2EgOiAwKSk7CisJfQorCisgICAgICBfVUludFR5cGUgX195ID0gKChfTV94W19fbiAtIDFdICYgX191cHBlcl9tYXNrKQorCQkgICAgICAgfCAoX01feFswXSAmIF9fbG93ZXJfbWFzaykpOworICAgICAgX01feFtfX24gLSAxXSA9IChfTV94W19fbSAtIDFdIF4gKF9feSA+PiAxKQorCQkgICAgICAgXiAoKF9feSAmIDB4MDEpID8gX19hIDogMCkpOworICAgICAgX01fcCA9IDA7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fdywKKwkgICBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwKKwkgICBfVUludFR5cGUgX19mPgorICAgIHZvaWQKKyAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwKKwkJCSAgICBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6CisgICAgZGlzY2FyZCh1bnNpZ25lZCBsb25nIGxvbmcgX196KQorICAgIHsKKyAgICAgIHdoaWxlIChfX3ogPiBzdGF0ZV9zaXplIC0gX01fcCkKKwl7CisJICBfX3ogLT0gc3RhdGVfc2l6ZSAtIF9NX3A7CisJICBfTV9nZW5fcmFuZCgpOworCX0KKyAgICAgIF9NX3AgKz0gX196OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX3csCisJICAgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsCisJICAgX1VJbnRUeXBlIF9fZj4KKyAgICB0eXBlbmFtZQorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+OjpyZXN1bHRfdHlwZQorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+OjoKKyAgICBvcGVyYXRvcigpKCkKKyAgICB7CisgICAgICAvLyBSZWxvYWQgdGhlIHZlY3RvciAtIGNvc3QgaXMgTyhuKSBhbW9ydGl6ZWQgb3ZlciBuIGNhbGxzLgorICAgICAgaWYgKF9NX3AgPj0gc3RhdGVfc2l6ZSkKKwlfTV9nZW5fcmFuZCgpOworCisgICAgICAvLyBDYWxjdWxhdGUgbyh4KGkpKS4KKyAgICAgIHJlc3VsdF90eXBlIF9feiA9IF9NX3hbX01fcCsrXTsKKyAgICAgIF9feiBePSAoX196ID4+IF9fdSkgJiBfX2Q7CisgICAgICBfX3ogXj0gKF9feiA8PCBfX3MpICYgX19iOworICAgICAgX196IF49IChfX3ogPDwgX190KSAmIF9fYzsKKyAgICAgIF9feiBePSAoX196ID4+IF9fbCk7CisKKyAgICAgIHJldHVybiBfX3o7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fdywKKwkgICBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwKKwkgICBfVUludFR5cGUgX19mLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLAorCSAgICAgICBfX3IsIF9fYSwgX191LCBfX2QsIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OmZpeGVkIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisJX19vcyA8PCBfX3guX01feFtfX2ldIDw8IF9fc3BhY2U7CisgICAgICBfX29zIDw8IF9feC5fTV9wOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LAorCSAgIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2YsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sCisJICAgICAgIF9fciwgX19hLCBfX3UsIF9fZCwgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisJX19pcyA+PiBfX3guX01feFtfX2ldOworICAgICAgX19pcyA+PiBfX3guX01fcDsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fdywgc2l6ZV90IF9fcywgc2l6ZV90IF9fcj4KKyAgICBjb25zdGV4cHIgc2l6ZV90CisgICAgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fcywgX19yPjo6d29yZF9zaXplOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fdywgc2l6ZV90IF9fcywgc2l6ZV90IF9fcj4KKyAgICBjb25zdGV4cHIgc2l6ZV90CisgICAgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fcywgX19yPjo6c2hvcnRfbGFnOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fdywgc2l6ZV90IF9fcywgc2l6ZV90IF9fcj4KKyAgICBjb25zdGV4cHIgc2l6ZV90CisgICAgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fcywgX19yPjo6bG9uZ19sYWc7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19zLCBzaXplX3QgX19yPgorICAgIGNvbnN0ZXhwciBfVUludFR5cGUKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19zLCBfX3I+OjpkZWZhdWx0X3NlZWQ7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19zLCBzaXplX3QgX19yPgorICAgIHZvaWQKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19zLCBfX3I+OjoKKyAgICBzZWVkKHJlc3VsdF90eXBlIF9fdmFsdWUpCisgICAgeworICAgICAgc3RkOjpsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxyZXN1bHRfdHlwZSwgNDAwMTR1LCAwdSwgMjE0NzQ4MzU2M3U+CisJX19sY2coX192YWx1ZSA9PSAwdSA/IGRlZmF1bHRfc2VlZCA6IF9fdmFsdWUpOworCisgICAgICBjb25zdCBzaXplX3QgX19uID0gKF9fdyArIDMxKSAvIDMyOworCisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBsb25nX2xhZzsgKytfX2kpCisJeworCSAgX1VJbnRUeXBlIF9fc3VtID0gMHU7CisJICBfVUludFR5cGUgX19mYWN0b3IgPSAxdTsKKwkgIGZvciAoc2l6ZV90IF9faiA9IDA7IF9faiA8IF9fbjsgKytfX2opCisJICAgIHsKKwkgICAgICBfX3N1bSArPSBfX2RldGFpbDo6X19tb2Q8dWludF9sZWFzdDMyX3QsCisJCSAgICAgICBfX2RldGFpbDo6X1NoaWZ0PHVpbnRfbGVhc3QzMl90LCAzMj46Ol9fdmFsdWU+CisJCQkgKF9fbGNnKCkpICogX19mYWN0b3I7CisJICAgICAgX19mYWN0b3IgKj0gX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIDMyPjo6X192YWx1ZTsKKwkgICAgfQorCSAgX01feFtfX2ldID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwKKwkgICAgX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIF9fdz46Ol9fdmFsdWU+KF9fc3VtKTsKKwl9CisgICAgICBfTV9jYXJyeSA9IChfTV94W2xvbmdfbGFnIC0gMV0gPT0gMCkgPyAxIDogMDsKKyAgICAgIF9NX3AgPSAwOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX3MsIHNpemVfdCBfX3I+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXE+CisgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NsYXNzPF9Tc2VxPjo6dmFsdWU+Ojp0eXBlCisgICAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19zLCBfX3I+OjoKKyAgICAgIHNlZWQoX1NzZXEmIF9fcSkKKyAgICAgIHsKKwljb25zdCBzaXplX3QgX19rID0gKF9fdyArIDMxKSAvIDMyOworCXVpbnRfbGVhc3QzMl90IF9fYXJyW19fciAqIF9fa107CisJX19xLmdlbmVyYXRlKF9fYXJyICsgMCwgX19hcnIgKyBfX3IgKiBfX2spOworCisJZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgbG9uZ19sYWc7ICsrX19pKQorCSAgeworCSAgICBfVUludFR5cGUgX19zdW0gPSAwdTsKKwkgICAgX1VJbnRUeXBlIF9fZmFjdG9yID0gMXU7CisJICAgIGZvciAoc2l6ZV90IF9faiA9IDA7IF9faiA8IF9fazsgKytfX2opCisJICAgICAgeworCQlfX3N1bSArPSBfX2FycltfX2sgKiBfX2kgKyBfX2pdICogX19mYWN0b3I7CisJCV9fZmFjdG9yICo9IF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCAzMj46Ol9fdmFsdWU7CisJICAgICAgfQorCSAgICBfTV94W19faV0gPSBfX2RldGFpbDo6X19tb2Q8X1VJbnRUeXBlLAorCSAgICAgIF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCBfX3c+OjpfX3ZhbHVlPihfX3N1bSk7CisJICB9CisJX01fY2FycnkgPSAoX01feFtsb25nX2xhZyAtIDFdID09IDApID8gMSA6IDA7CisJX01fcCA9IDA7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19zLCBzaXplX3QgX19yPgorICAgIHR5cGVuYW1lIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX3MsIF9fcj46OgorCSAgICAgcmVzdWx0X3R5cGUKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19zLCBfX3I+OjoKKyAgICBvcGVyYXRvcigpKCkKKyAgICB7CisgICAgICAvLyBEZXJpdmUgc2hvcnQgbGFnIGluZGV4IGZyb20gY3VycmVudCBpbmRleC4KKyAgICAgIGxvbmcgX19wcyA9IF9NX3AgLSBzaG9ydF9sYWc7CisgICAgICBpZiAoX19wcyA8IDApCisJX19wcyArPSBsb25nX2xhZzsKKworICAgICAgLy8gQ2FsY3VsYXRlIG5ldyB4KGkpIHdpdGhvdXQgb3ZlcmZsb3cgb3IgZGl2aXNpb24uCisgICAgICAvLyBOQjogVGhhbmtzIHRvIHRoZSByZXF1aXJlbWVudHMgZm9yIF9VSW50VHlwZSwgX01feFtfTV9wXSArIF9NX2NhcnJ5CisgICAgICAvLyBjYW5ub3Qgb3ZlcmZsb3cuCisgICAgICBfVUludFR5cGUgX194aTsKKyAgICAgIGlmIChfTV94W19fcHNdID49IF9NX3hbX01fcF0gKyBfTV9jYXJyeSkKKwl7CisJICBfX3hpID0gX01feFtfX3BzXSAtIF9NX3hbX01fcF0gLSBfTV9jYXJyeTsKKwkgIF9NX2NhcnJ5ID0gMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgX194aSA9IChfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgX193Pjo6X192YWx1ZQorCQkgIC0gX01feFtfTV9wXSAtIF9NX2NhcnJ5ICsgX01feFtfX3BzXSk7CisJICBfTV9jYXJyeSA9IDE7CisJfQorICAgICAgX01feFtfTV9wXSA9IF9feGk7CisKKyAgICAgIC8vIEFkanVzdCBjdXJyZW50IGluZGV4IHRvIGxvb3AgYXJvdW5kIGluIHJpbmcgYnVmZmVyLgorICAgICAgaWYgKCsrX01fcCA+PSBsb25nX2xhZykKKwlfTV9wID0gMDsKKworICAgICAgcmV0dXJuIF9feGk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fdywgc2l6ZV90IF9fcywgc2l6ZV90IF9fciwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnRUeXBlLAorCQkJCQkJX193LCBfX3MsIF9fcj4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6Zml4ZWQgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19yOyArK19faSkKKwlfX29zIDw8IF9feC5fTV94W19faV0gPDwgX19zcGFjZTsKKyAgICAgIF9fb3MgPDwgX194Ll9NX2NhcnJ5IDw8IF9fc3BhY2UgPDwgX194Ll9NX3A7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX3MsIHNpemVfdCBfX3IsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX3MsIF9fcj4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fcjsgKytfX2kpCisJX19pcyA+PiBfX3guX01feFtfX2ldOworICAgICAgX19pcyA+PiBfX3guX01fY2Fycnk7CisgICAgICBfX2lzID4+IF9feC5fTV9wOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZSwgc2l6ZV90IF9fcCwgc2l6ZV90IF9fcj4KKyAgICBjb25zdGV4cHIgc2l6ZV90CisgICAgZGlzY2FyZF9ibG9ja19lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZSwgX19wLCBfX3I+OjpibG9ja19zaXplOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUsIHNpemVfdCBfX3AsIHNpemVfdCBfX3I+CisgICAgY29uc3RleHByIHNpemVfdAorICAgIGRpc2NhcmRfYmxvY2tfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUsIF9fcCwgX19yPjo6dXNlZF9ibG9jazsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lLCBzaXplX3QgX19wLCBzaXplX3QgX19yPgorICAgIHR5cGVuYW1lIGRpc2NhcmRfYmxvY2tfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUsCisJCQkgICBfX3AsIF9fcj46OnJlc3VsdF90eXBlCisgICAgZGlzY2FyZF9ibG9ja19lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZSwgX19wLCBfX3I+OjoKKyAgICBvcGVyYXRvcigpKCkKKyAgICB7CisgICAgICBpZiAoX01fbiA+PSB1c2VkX2Jsb2NrKQorCXsKKwkgIF9NX2IuZGlzY2FyZChibG9ja19zaXplIC0gX01fbik7CisJICBfTV9uID0gMDsKKwl9CisgICAgICArK19NX247CisgICAgICByZXR1cm4gX01fYigpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lLCBzaXplX3QgX19wLCBzaXplX3QgX19yLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBkaXNjYXJkX2Jsb2NrX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLAorCSAgICAgICBfX3AsIF9fcj4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6Zml4ZWQgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKworICAgICAgX19vcyA8PCBfX3guYmFzZSgpIDw8IF9fc3BhY2UgPDwgX194Ll9NX247CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lLCBzaXplX3QgX19wLCBzaXplX3QgX19yLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBkaXNjYXJkX2Jsb2NrX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLCBfX3AsIF9fcj4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9faXMgPj4gX194Ll9NX2IgPj4gX194Ll9NX247CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lLCBzaXplX3QgX193LCB0eXBlbmFtZSBfVUludFR5cGU+CisgICAgdHlwZW5hbWUgaW5kZXBlbmRlbnRfYml0c19lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZSwgX193LCBfVUludFR5cGU+OjoKKyAgICAgIHJlc3VsdF90eXBlCisgICAgaW5kZXBlbmRlbnRfYml0c19lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZSwgX193LCBfVUludFR5cGU+OjoKKyAgICBvcGVyYXRvcigpKCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmU6OnJlc3VsdF90eXBlIF9FcmVzdWx0X3R5cGU7CisgICAgICBjb25zdCBfRXJlc3VsdF90eXBlIF9fcgorCT0gKF9NX2IubWF4KCkgLSBfTV9iLm1pbigpIDwgc3RkOjpudW1lcmljX2xpbWl0czxfRXJlc3VsdF90eXBlPjo6bWF4KCkKKwkgICA/IF9NX2IubWF4KCkgLSBfTV9iLm1pbigpICsgMSA6IDApOworICAgICAgY29uc3QgdW5zaWduZWQgX19lZGlnID0gc3RkOjpudW1lcmljX2xpbWl0czxfRXJlc3VsdF90eXBlPjo6ZGlnaXRzOworICAgICAgY29uc3QgdW5zaWduZWQgX19tID0gX19yID8gc3RkOjpfX2xnKF9fcikgOiBfX2VkaWc7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpjb21tb25fdHlwZTxfRXJlc3VsdF90eXBlLCByZXN1bHRfdHlwZT46OnR5cGUKKwlfX2N0eXBlOworICAgICAgY29uc3QgdW5zaWduZWQgX19jZGlnID0gc3RkOjpudW1lcmljX2xpbWl0czxfX2N0eXBlPjo6ZGlnaXRzOworCisgICAgICB1bnNpZ25lZCBfX24sIF9fbjA7CisgICAgICBfX2N0eXBlIF9fczAsIF9fczEsIF9feTAsIF9feTE7CisKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IDI7ICsrX19pKQorCXsKKwkgIF9fbiA9IChfX3cgKyBfX20gLSAxKSAvIF9fbSArIF9faTsKKwkgIF9fbjAgPSBfX24gLSBfX3cgJSBfX247CisJICBjb25zdCB1bnNpZ25lZCBfX3cwID0gX193IC8gX19uOyAgLy8gX193MCA8PSBfX20KKworCSAgX19zMCA9IDA7CisJICBfX3MxID0gMDsKKwkgIGlmIChfX3cwIDwgX19jZGlnKQorCSAgICB7CisJICAgICAgX19zMCA9IF9fY3R5cGUoMSkgPDwgX193MDsKKwkgICAgICBfX3MxID0gX19zMCA8PCAxOworCSAgICB9CisKKwkgIF9feTAgPSAwOworCSAgX195MSA9IDA7CisJICBpZiAoX19yKQorCSAgICB7CisJICAgICAgX195MCA9IF9fczAgKiAoX19yIC8gX19zMCk7CisJICAgICAgaWYgKF9fczEpCisJCV9feTEgPSBfX3MxICogKF9fciAvIF9fczEpOworCisJICAgICAgaWYgKF9fciAtIF9feTAgPD0gX195MCAvIF9fbikKKwkJYnJlYWs7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgYnJlYWs7CisJfQorCisgICAgICByZXN1bHRfdHlwZSBfX3N1bSA9IDA7CisgICAgICBmb3IgKHNpemVfdCBfX2sgPSAwOyBfX2sgPCBfX24wOyArK19faykKKwl7CisJICBfX2N0eXBlIF9fdTsKKwkgIGRvCisJICAgIF9fdSA9IF9NX2IoKSAtIF9NX2IubWluKCk7CisJICB3aGlsZSAoX195MCAmJiBfX3UgPj0gX195MCk7CisJICBfX3N1bSA9IF9fczAgKiBfX3N1bSArIChfX3MwID8gX191ICUgX19zMCA6IF9fdSk7CisJfQorICAgICAgZm9yIChzaXplX3QgX19rID0gX19uMDsgX19rIDwgX19uOyArK19faykKKwl7CisJICBfX2N0eXBlIF9fdTsKKwkgIGRvCisJICAgIF9fdSA9IF9NX2IoKSAtIF9NX2IubWluKCk7CisJICB3aGlsZSAoX195MSAmJiBfX3UgPj0gX195MSk7CisJICBfX3N1bSA9IF9fczEgKiBfX3N1bSArIChfX3MxID8gX191ICUgX19zMSA6IF9fdSk7CisJfQorICAgICAgcmV0dXJuIF9fc3VtOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUsIHNpemVfdCBfX2s+CisgICAgY29uc3RleHByIHNpemVfdAorICAgIHNodWZmbGVfb3JkZXJfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUsIF9faz46OnRhYmxlX3NpemU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZSwgc2l6ZV90IF9faz4KKyAgICB0eXBlbmFtZSBzaHVmZmxlX29yZGVyX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLCBfX2s+OjpyZXN1bHRfdHlwZQorICAgIHNodWZmbGVfb3JkZXJfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUsIF9faz46OgorICAgIG9wZXJhdG9yKCkoKQorICAgIHsKKyAgICAgIHNpemVfdCBfX2ogPSBfX2sgKiAoKF9NX3kgLSBfTV9iLm1pbigpKQorCQkJICAvIChfTV9iLm1heCgpIC0gX01fYi5taW4oKSArIDEuMEwpKTsKKyAgICAgIF9NX3kgPSBfTV92W19fal07CisgICAgICBfTV92W19fal0gPSBfTV9iKCk7CisKKyAgICAgIHJldHVybiBfTV95OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lLCBzaXplX3QgX19rLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBzaHVmZmxlX29yZGVyX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLCBfX2s+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OmZpeGVkIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisKKyAgICAgIF9fb3MgPDwgX194LmJhc2UoKTsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fazsgKytfX2kpCisJX19vcyA8PCBfX3NwYWNlIDw8IF9feC5fTV92W19faV07CisgICAgICBfX29zIDw8IF9fc3BhY2UgPDwgX194Ll9NX3k7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lLCBzaXplX3QgX19rLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBzaHVmZmxlX29yZGVyX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLCBfX2s+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfX2lzID4+IF9feC5fTV9iOworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19rOyArK19faSkKKwlfX2lzID4+IF9feC5fTV92W19faV07CisgICAgICBfX2lzID4+IF9feC5fTV95OworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSB1bmlmb3JtX2ludF9kaXN0cmlidXRpb248X0ludFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6CisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSBjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I6OnJlc3VsdF90eXBlCisJICBfR3Jlc3VsdF90eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgc3RkOjptYWtlX3Vuc2lnbmVkPHJlc3VsdF90eXBlPjo6dHlwZSBfX3V0eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgc3RkOjpjb21tb25fdHlwZTxfR3Jlc3VsdF90eXBlLCBfX3V0eXBlPjo6dHlwZQorCSAgX191Y3R5cGU7CisKKwljb25zdCBfX3VjdHlwZSBfX3VybmdtaW4gPSBfX3VybmcubWluKCk7CisJY29uc3QgX191Y3R5cGUgX191cm5nbWF4ID0gX191cm5nLm1heCgpOworCWNvbnN0IF9fdWN0eXBlIF9fdXJuZ3JhbmdlID0gX191cm5nbWF4IC0gX191cm5nbWluOworCWNvbnN0IF9fdWN0eXBlIF9fdXJhbmdlCisJICA9IF9fdWN0eXBlKF9fcGFyYW0uYigpKSAtIF9fdWN0eXBlKF9fcGFyYW0uYSgpKTsKKworCV9fdWN0eXBlIF9fcmV0OworCisJaWYgKF9fdXJuZ3JhbmdlID4gX191cmFuZ2UpCisJICB7CisJICAgIC8vIGRvd25zY2FsaW5nCisJICAgIGNvbnN0IF9fdWN0eXBlIF9fdWVyYW5nZSA9IF9fdXJhbmdlICsgMTsgLy8gX191cmFuZ2UgY2FuIGJlIHplcm8KKwkgICAgY29uc3QgX191Y3R5cGUgX19zY2FsaW5nID0gX191cm5ncmFuZ2UgLyBfX3VlcmFuZ2U7CisJICAgIGNvbnN0IF9fdWN0eXBlIF9fcGFzdCA9IF9fdWVyYW5nZSAqIF9fc2NhbGluZzsKKwkgICAgZG8KKwkgICAgICBfX3JldCA9IF9fdWN0eXBlKF9fdXJuZygpKSAtIF9fdXJuZ21pbjsKKwkgICAgd2hpbGUgKF9fcmV0ID49IF9fcGFzdCk7CisJICAgIF9fcmV0IC89IF9fc2NhbGluZzsKKwkgIH0KKwllbHNlIGlmIChfX3VybmdyYW5nZSA8IF9fdXJhbmdlKQorCSAgeworCSAgICAvLyB1cHNjYWxpbmcKKwkgICAgLyoKKwkgICAgICBOb3RlIHRoYXQgZXZlcnkgdmFsdWUgaW4gWzAsIHVyYW5nZV0KKwkgICAgICBjYW4gYmUgd3JpdHRlbiB1bmlxdWVseSBhcworCisJICAgICAgKHVybmdyYW5nZSArIDEpICogaGlnaCArIGxvdworCisJICAgICAgd2hlcmUKKworCSAgICAgIGhpZ2ggaW4gWzAsIHVyYW5nZSAvICh1cm5ncmFuZ2UgKyAxKV0KKworCSAgICAgIGFuZAorCQorCSAgICAgIGxvdyBpbiBbMCwgdXJuZ3JhbmdlXS4KKwkgICAgKi8KKwkgICAgX191Y3R5cGUgX190bXA7IC8vIHdyYXBhcm91bmQgY29udHJvbAorCSAgICBkbworCSAgICAgIHsKKwkJY29uc3QgX191Y3R5cGUgX191ZXJuZ3JhbmdlID0gX191cm5ncmFuZ2UgKyAxOworCQlfX3RtcCA9IChfX3Vlcm5ncmFuZ2UgKiBvcGVyYXRvcigpCisJCQkgKF9fdXJuZywgcGFyYW1fdHlwZSgwLCBfX3VyYW5nZSAvIF9fdWVybmdyYW5nZSkpKTsKKwkJX19yZXQgPSBfX3RtcCArIChfX3VjdHlwZShfX3VybmcoKSkgLSBfX3VybmdtaW4pOworCSAgICAgIH0KKwkgICAgd2hpbGUgKF9fcmV0ID4gX191cmFuZ2UgfHwgX19yZXQgPCBfX3RtcCk7CisJICB9CisJZWxzZQorCSAgX19yZXQgPSBfX3VjdHlwZShfX3VybmcoKSkgLSBfX3VybmdtaW47CisKKwlyZXR1cm4gX19yZXQgKyBfX3BhcmFtLmEoKTsKKyAgICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisJdHlwZWRlZiB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjo6cmVzdWx0X3R5cGUKKwkgIF9HcmVzdWx0X3R5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Om1ha2VfdW5zaWduZWQ8cmVzdWx0X3R5cGU+Ojp0eXBlIF9fdXR5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbW1vbl90eXBlPF9HcmVzdWx0X3R5cGUsIF9fdXR5cGU+Ojp0eXBlCisJICBfX3VjdHlwZTsKKworCWNvbnN0IF9fdWN0eXBlIF9fdXJuZ21pbiA9IF9fdXJuZy5taW4oKTsKKwljb25zdCBfX3VjdHlwZSBfX3VybmdtYXggPSBfX3VybmcubWF4KCk7CisJY29uc3QgX191Y3R5cGUgX191cm5ncmFuZ2UgPSBfX3VybmdtYXggLSBfX3VybmdtaW47CisJY29uc3QgX191Y3R5cGUgX191cmFuZ2UKKwkgID0gX191Y3R5cGUoX19wYXJhbS5iKCkpIC0gX191Y3R5cGUoX19wYXJhbS5hKCkpOworCisJX191Y3R5cGUgX19yZXQ7CisKKwlpZiAoX191cm5ncmFuZ2UgPiBfX3VyYW5nZSkKKwkgIHsKKwkgICAgaWYgKF9fZGV0YWlsOjpfUG93ZXJfb2ZfMihfX3VybmdyYW5nZSArIDEpCisJCSYmIF9fZGV0YWlsOjpfUG93ZXJfb2ZfMihfX3VyYW5nZSArIDEpKQorCSAgICAgIHsKKwkJd2hpbGUgKF9fZiAhPSBfX3QpCisJCSAgeworCQkgICAgX19yZXQgPSBfX3VjdHlwZShfX3VybmcoKSkgLSBfX3VybmdtaW47CisJCSAgICAqX19mKysgPSAoX19yZXQgJiBfX3VyYW5nZSkgKyBfX3BhcmFtLmEoKTsKKwkJICB9CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQkvLyBkb3duc2NhbGluZworCQljb25zdCBfX3VjdHlwZSBfX3VlcmFuZ2UgPSBfX3VyYW5nZSArIDE7IC8vIF9fdXJhbmdlIGNhbiBiZSB6ZXJvCisJCWNvbnN0IF9fdWN0eXBlIF9fc2NhbGluZyA9IF9fdXJuZ3JhbmdlIC8gX191ZXJhbmdlOworCQljb25zdCBfX3VjdHlwZSBfX3Bhc3QgPSBfX3VlcmFuZ2UgKiBfX3NjYWxpbmc7CisJCXdoaWxlIChfX2YgIT0gX190KQorCQkgIHsKKwkJICAgIGRvCisJCSAgICAgIF9fcmV0ID0gX191Y3R5cGUoX191cm5nKCkpIC0gX191cm5nbWluOworCQkgICAgd2hpbGUgKF9fcmV0ID49IF9fcGFzdCk7CisJCSAgICAqX19mKysgPSBfX3JldCAvIF9fc2NhbGluZyArIF9fcGFyYW0uYSgpOworCQkgIH0KKwkgICAgICB9CisJICB9CisJZWxzZSBpZiAoX191cm5ncmFuZ2UgPCBfX3VyYW5nZSkKKwkgIHsKKwkgICAgLy8gdXBzY2FsaW5nCisJICAgIC8qCisJICAgICAgTm90ZSB0aGF0IGV2ZXJ5IHZhbHVlIGluIFswLCB1cmFuZ2VdCisJICAgICAgY2FuIGJlIHdyaXR0ZW4gdW5pcXVlbHkgYXMKKworCSAgICAgICh1cm5ncmFuZ2UgKyAxKSAqIGhpZ2ggKyBsb3cKKworCSAgICAgIHdoZXJlCisKKwkgICAgICBoaWdoIGluIFswLCB1cmFuZ2UgLyAodXJuZ3JhbmdlICsgMSldCisKKwkgICAgICBhbmQKKworCSAgICAgIGxvdyBpbiBbMCwgdXJuZ3JhbmdlXS4KKwkgICAgKi8KKwkgICAgX191Y3R5cGUgX190bXA7IC8vIHdyYXBhcm91bmQgY29udHJvbAorCSAgICB3aGlsZSAoX19mICE9IF9fdCkKKwkgICAgICB7CisJCWRvCisJCSAgeworCQkgICAgY29uc3QgX191Y3R5cGUgX191ZXJuZ3JhbmdlID0gX191cm5ncmFuZ2UgKyAxOworCQkgICAgX190bXAgPSAoX191ZXJuZ3JhbmdlICogb3BlcmF0b3IoKQorCQkJICAgICAoX191cm5nLCBwYXJhbV90eXBlKDAsIF9fdXJhbmdlIC8gX191ZXJuZ3JhbmdlKSkpOworCQkgICAgX19yZXQgPSBfX3RtcCArIChfX3VjdHlwZShfX3VybmcoKSkgLSBfX3VybmdtaW4pOworCQkgIH0KKwkJd2hpbGUgKF9fcmV0ID4gX191cmFuZ2UgfHwgX19yZXQgPCBfX3RtcCk7CisJCSpfX2YrKyA9IF9fcmV0OworCSAgICAgIH0KKwkgIH0KKwllbHNlCisJICB3aGlsZSAoX19mICE9IF9fdCkKKwkgICAgKl9fZisrID0gX191Y3R5cGUoX191cm5nKCkpIC0gX191cm5nbWluICsgX19wYXJhbS5hKCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCB1bmlmb3JtX2ludF9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKworICAgICAgX19vcyA8PCBfX3guYSgpIDw8IF9fc3BhY2UgPDwgX194LmIoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX0ludFR5cGUgX19hLCBfX2I7CisgICAgICBfX2lzID4+IF9fYSA+PiBfX2I7CisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19hLCBfX2IpKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKwlfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIHJlc3VsdF90eXBlPgorCSAgX19hdXJuZyhfX3VybmcpOworCWF1dG8gX19yYW5nZSA9IF9fcC5iKCkgLSBfX3AuYSgpOworCXdoaWxlIChfX2YgIT0gX190KQorCSAgKl9fZisrID0gX19hdXJuZygpICogX19yYW5nZSArIF9fcC5hKCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194LmEoKSA8PCBfX3NwYWNlIDw8IF9feC5iKCk7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9SZWFsVHlwZSBfX2EsIF9fYjsKKyAgICAgIF9faXMgPj4gX19hID4+IF9fYjsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorCQlwYXJhbV90eXBlKF9fYSwgX19iKSk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgIHZvaWQKKyAgICBzdGQ6OmJlcm5vdWxsaV9kaXN0cmlidXRpb246OgorICAgIF9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgZG91YmxlPgorCV9fYXVybmcoX191cm5nKTsKKyAgICAgIGF1dG8gX19saW1pdCA9IF9fcC5wKCkgKiAoX19hdXJuZy5tYXgoKSAtIF9fYXVybmcubWluKCkpOworCisgICAgICB3aGlsZSAoX19mICE9IF9fdCkKKwkqX19mKysgPSAoX19hdXJuZygpIC0gX19hdXJuZy5taW4oKSkgPCBfX2xpbWl0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX29zLndpZGVuKCcgJykpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5wKCk7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OnJlc3VsdF90eXBlCisgICAgICBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6CisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSBjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeworCS8vIEFib3V0IHRoZSBlcHNpbG9uIHRoaW5nIHNlZSB0aGlzIHRocmVhZDoKKwkvLyBodHRwOi8vZ2NjLmdudS5vcmcvbWwvZ2NjLXBhdGNoZXMvMjAwNi0xMC9tc2cwMDk3MS5odG1sCisJY29uc3QgZG91YmxlIF9fbmFmID0KKwkgICgxIC0gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjplcHNpbG9uKCkpIC8gMjsKKwkvLyBUaGUgbGFyZ2VzdCBfUmVhbFR5cGUgY29udmVydGlibGUgdG8gX0ludFR5cGUuCisJY29uc3QgZG91YmxlIF9fdGhyID0KKwkgIHN0ZDo6bnVtZXJpY19saW1pdHM8X0ludFR5cGU+OjptYXgoKSArIF9fbmFmOworCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgZG91YmxlPgorCSAgX19hdXJuZyhfX3VybmcpOworCisJZG91YmxlIF9fY2FuZDsKKwlkbworCSAgX19jYW5kID0gc3RkOjpmbG9vcihzdGQ6OmxvZygxLjAgLSBfX2F1cm5nKCkpIC8gX19wYXJhbS5fTV9sb2dfMV9wKTsKKwl3aGlsZSAoX19jYW5kID49IF9fdGhyKTsKKworCXJldHVybiByZXN1bHRfdHlwZShfX2NhbmQgKyBfX25hZik7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisJLy8gQWJvdXQgdGhlIGVwc2lsb24gdGhpbmcgc2VlIHRoaXMgdGhyZWFkOgorCS8vIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9nY2MtcGF0Y2hlcy8yMDA2LTEwL21zZzAwOTcxLmh0bWwKKwljb25zdCBkb3VibGUgX19uYWYgPQorCSAgKDEgLSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmVwc2lsb24oKSkgLyAyOworCS8vIFRoZSBsYXJnZXN0IF9SZWFsVHlwZSBjb252ZXJ0aWJsZSB0byBfSW50VHlwZS4KKwljb25zdCBkb3VibGUgX190aHIgPQorCSAgc3RkOjpudW1lcmljX2xpbWl0czxfSW50VHlwZT46Om1heCgpICsgX19uYWY7CisJX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBkb3VibGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisKKwl3aGlsZSAoX19mICE9IF9fdCkKKwkgIHsKKwkgICAgZG91YmxlIF9fY2FuZDsKKwkgICAgZG8KKwkgICAgICBfX2NhbmQgPSBzdGQ6OmZsb29yKHN0ZDo6bG9nKDEuMCAtIF9fYXVybmcoKSkKKwkJCQkgIC8gX19wYXJhbS5fTV9sb2dfMV9wKTsKKwkgICAgd2hpbGUgKF9fY2FuZCA+PSBfX3Rocik7CisKKwkgICAgKl9fZisrID0gX19jYW5kICsgX19uYWY7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGdlb21ldHJpY19kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fb3Mud2lkZW4oJyAnKSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194LnAoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgZG91YmxlIF9fcDsKKyAgICAgIF9faXMgPj4gX19wOworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIGdlb21ldHJpY19kaXN0cmlidXRpb248X0ludFR5cGU+OjpwYXJhbV90eXBlKF9fcCkpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisgIC8vIFRoaXMgaXMgTGVnZXIncyBhbGdvcml0aG0sIGFsc28gaW4gRGV2cm95ZSwgQ2guIFgsIEV4YW1wbGUgMS41LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OnJlc3VsdF90eXBlCisgICAgICBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgIHsKKwljb25zdCBkb3VibGUgX195ID0gX01fZ2QoX191cm5nKTsKKworCS8vIFhYWCBJcyB0aGUgY29uc3RydWN0b3IgdG9vIHNsb3c/CisJc3RkOjpwb2lzc29uX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gX19wb2lzc29uKF9feSk7CisJcmV0dXJuIF9fcG9pc3NvbihfX3VybmcpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248ZG91YmxlPjo6cGFyYW1fdHlwZQorCSAgcGFyYW1fdHlwZTsKKwkKKwljb25zdCBkb3VibGUgX195ID0KKwkgIF9NX2dkKF9fdXJuZywgcGFyYW1fdHlwZShfX3AuaygpLCAoMS4wIC0gX19wLnAoKSkgLyBfX3AucCgpKSk7CisKKwlzdGQ6OnBvaXNzb25fZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBfX3BvaXNzb24oX195KTsKKwlyZXR1cm4gX19wb2lzc29uKF9fdXJuZyk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKwl3aGlsZSAoX19mICE9IF9fdCkKKwkgIHsKKwkgICAgY29uc3QgZG91YmxlIF9feSA9IF9NX2dkKF9fdXJuZyk7CisKKwkgICAgLy8gWFhYIElzIHRoZSBjb25zdHJ1Y3RvciB0b28gc2xvdz8KKwkgICAgc3RkOjpwb2lzc29uX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gX19wb2lzc29uKF9feSk7CisJICAgICpfX2YrKyA9IF9fcG9pc3NvbihfX3VybmcpOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKwl0eXBlbmFtZSBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT46OnBhcmFtX3R5cGUKKwkgIF9fcDIoX19wLmsoKSwgKDEuMCAtIF9fcC5wKCkpIC8gX19wLnAoKSk7CisKKwl3aGlsZSAoX19mICE9IF9fdCkKKwkgIHsKKwkgICAgY29uc3QgZG91YmxlIF9feSA9IF9NX2dkKF9fdXJuZywgX19wMik7CisKKwkgICAgc3RkOjpwb2lzc29uX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gX19wb2lzc29uKF9feSk7CisJICAgICpfX2YrKyA9IF9fcG9pc3NvbihfX3VybmcpOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fb3Mud2lkZW4oJyAnKSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194LmsoKSA8PCBfX3NwYWNlIDw8IF9feC5wKCkKKwkgICA8PCBfX3NwYWNlIDw8IF9feC5fTV9nZDsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX0ludFR5cGUgX19rOworICAgICAgZG91YmxlIF9fcDsKKyAgICAgIF9faXMgPj4gX19rID4+IF9fcCA+PiBfX3guX01fZ2Q7CisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19rLCBfX3ApKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIHZvaWQKKyAgICBwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OnBhcmFtX3R5cGU6OgorICAgIF9NX2luaXRpYWxpemUoKQorICAgIHsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICBpZiAoX01fbWVhbiA+PSAxMikKKwl7CisJICBjb25zdCBkb3VibGUgX19tID0gc3RkOjpmbG9vcihfTV9tZWFuKTsKKwkgIF9NX2xtX3RociA9IHN0ZDo6bG9nKF9NX21lYW4pOworCSAgX01fbGZtID0gc3RkOjpsZ2FtbWEoX19tICsgMSk7CisJICBfTV9zbSA9IHN0ZDo6c3FydChfX20pOworCisJICBjb25zdCBkb3VibGUgX19waV80ID0gMC43ODUzOTgxNjMzOTc0NDgzMDk2MTU2NjA4NDU4MTk4NzU3TDsKKwkgIGNvbnN0IGRvdWJsZSBfX2R4ID0gc3RkOjpzcXJ0KDIgKiBfX20gKiBzdGQ6OmxvZygzMiAqIF9fbQorCQkJCQkJCSAgICAgIC8gX19waV80KSk7CisJICBfTV9kID0gc3RkOjpyb3VuZChzdGQ6Om1heCg2LjAsIHN0ZDo6bWluKF9fbSwgX19keCkpKTsKKwkgIGNvbnN0IGRvdWJsZSBfX2N4ID0gMiAqIF9fbSArIF9NX2Q7CisJICBfTV9zY3ggPSBzdGQ6OnNxcnQoX19jeCAvIDIpOworCSAgX01fMWN4ID0gMSAvIF9fY3g7CisKKwkgIF9NX2MyYiA9IHN0ZDo6c3FydChfX3BpXzQgKiBfX2N4KSAqIHN0ZDo6ZXhwKF9NXzFjeCk7CisJICBfTV9jYiA9IDIgKiBfX2N4ICogc3RkOjpleHAoLV9NX2QgKiBfTV8xY3ggKiAoMSArIF9NX2QgLyAyKSkKKwkJLyBfTV9kOworCX0KKyAgICAgIGVsc2UKKyNlbmRpZgorCV9NX2xtX3RociA9IHN0ZDo6ZXhwKC1fTV9tZWFuKTsKKyAgICAgIH0KKworICAvKioKKyAgICogQSByZWplY3Rpb24gYWxnb3JpdGhtIHdoZW4gbWVhbiA+PSAxMiBhbmQgYSBzaW1wbGUgbWV0aG9kIGJhc2VkCisgICAqIHVwb24gdGhlIG11bHRpcGxpY2F0aW9uIG9mIHVuaWZvcm0gcmFuZG9tIHZhcmlhdGVzIG90aGVyd2lzZS4KKyAgICogTkI6IFRoZSBmb3JtZXIgaXMgYXZhaWxhYmxlIG9ubHkgaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgKiBpcyBkZWZpbmVkLgorICAgKgorICAgKiBSZWZlcmVuY2U6CisgICAqIERldnJveWUsIEwuIE5vbi1Vbmlmb3JtIFJhbmRvbSBWYXJpYXRlcyBHZW5lcmF0aW9uLiBTcHJpbmdlci1WZXJsYWcsCisgICAqIE5ldyBZb3JrLCAxOTg2LCBDaC4gWCwgU2VjdHMuIDMuMyAmIDMuNCAoKyBFcnJhdGEhKS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgcG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgcG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBkb3VibGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorCWlmIChfX3BhcmFtLm1lYW4oKSA+PSAxMikKKwkgIHsKKwkgICAgZG91YmxlIF9feDsKKworCSAgICAvLyBTZWUgY29tbWVudHMgYWJvdmUuLi4KKwkgICAgY29uc3QgZG91YmxlIF9fbmFmID0KKwkgICAgICAoMSAtIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZXBzaWxvbigpKSAvIDI7CisJICAgIGNvbnN0IGRvdWJsZSBfX3RociA9CisJICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxfSW50VHlwZT46Om1heCgpICsgX19uYWY7CisKKwkgICAgY29uc3QgZG91YmxlIF9fbSA9IHN0ZDo6Zmxvb3IoX19wYXJhbS5tZWFuKCkpOworCSAgICAvLyBzcXJ0KHBpIC8gMikKKwkgICAgY29uc3QgZG91YmxlIF9fc3BpXzIgPSAxLjI1MzMxNDEzNzMxNTUwMDI1MTIwNzg4MjY0MjQwNTUyMjZMOworCSAgICBjb25zdCBkb3VibGUgX19jMSA9IF9fcGFyYW0uX01fc20gKiBfX3NwaV8yOworCSAgICBjb25zdCBkb3VibGUgX19jMiA9IF9fcGFyYW0uX01fYzJiICsgX19jMTsKKwkgICAgY29uc3QgZG91YmxlIF9fYzMgPSBfX2MyICsgMTsKKwkgICAgY29uc3QgZG91YmxlIF9fYzQgPSBfX2MzICsgMTsKKwkgICAgLy8gZV4oMSAvIDc4KQorCSAgICBjb25zdCBkb3VibGUgX19lMTc4ID0gMS4wMTI5MDMwNDc5MzIwMDE4NTgzMTg1NTE0Nzc3NTEyOTgzTDsKKwkgICAgY29uc3QgZG91YmxlIF9fYzUgPSBfX2M0ICsgX19lMTc4OworCSAgICBjb25zdCBkb3VibGUgX19jID0gX19wYXJhbS5fTV9jYiArIF9fYzU7CisJICAgIGNvbnN0IGRvdWJsZSBfXzJjeCA9IDIgKiAoMiAqIF9fbSArIF9fcGFyYW0uX01fZCk7CisKKwkgICAgYm9vbCBfX3JlamVjdCA9IHRydWU7CisJICAgIGRvCisJICAgICAgeworCQljb25zdCBkb3VibGUgX191ID0gX19jICogX19hdXJuZygpOworCQljb25zdCBkb3VibGUgX19lID0gLXN0ZDo6bG9nKDEuMCAtIF9fYXVybmcoKSk7CisKKwkJZG91YmxlIF9fdyA9IDAuMDsKKworCQlpZiAoX191IDw9IF9fYzEpCisJCSAgeworCQkgICAgY29uc3QgZG91YmxlIF9fbiA9IF9NX25kKF9fdXJuZyk7CisJCSAgICBjb25zdCBkb3VibGUgX195ID0gLXN0ZDo6YWJzKF9fbikgKiBfX3BhcmFtLl9NX3NtIC0gMTsKKwkJICAgIF9feCA9IHN0ZDo6Zmxvb3IoX195KTsKKwkJICAgIF9fdyA9IC1fX24gKiBfX24gLyAyOworCQkgICAgaWYgKF9feCA8IC1fX20pCisJCSAgICAgIGNvbnRpbnVlOworCQkgIH0KKwkJZWxzZSBpZiAoX191IDw9IF9fYzIpCisJCSAgeworCQkgICAgY29uc3QgZG91YmxlIF9fbiA9IF9NX25kKF9fdXJuZyk7CisJCSAgICBjb25zdCBkb3VibGUgX195ID0gMSArIHN0ZDo6YWJzKF9fbikgKiBfX3BhcmFtLl9NX3NjeDsKKwkJICAgIF9feCA9IHN0ZDo6Y2VpbChfX3kpOworCQkgICAgX193ID0gX195ICogKDIgLSBfX3kpICogX19wYXJhbS5fTV8xY3g7CisJCSAgICBpZiAoX194ID4gX19wYXJhbS5fTV9kKQorCQkgICAgICBjb250aW51ZTsKKwkJICB9CisJCWVsc2UgaWYgKF9fdSA8PSBfX2MzKQorCQkgIC8vIE5COiBUaGlzIGNhc2Ugbm90IGluIHRoZSBib29rLCBub3IgaW4gdGhlIEVycmF0YSwKKwkJICAvLyBidXQgc2hvdWxkIGJlIG9rLi4uCisJCSAgX194ID0gLTE7CisJCWVsc2UgaWYgKF9fdSA8PSBfX2M0KQorCQkgIF9feCA9IDA7CisJCWVsc2UgaWYgKF9fdSA8PSBfX2M1KQorCQkgIF9feCA9IDE7CisJCWVsc2UKKwkJICB7CisJCSAgICBjb25zdCBkb3VibGUgX192ID0gLXN0ZDo6bG9nKDEuMCAtIF9fYXVybmcoKSk7CisJCSAgICBjb25zdCBkb3VibGUgX195ID0gX19wYXJhbS5fTV9kCisJCQkJICAgICArIF9fdiAqIF9fMmN4IC8gX19wYXJhbS5fTV9kOworCQkgICAgX194ID0gc3RkOjpjZWlsKF9feSk7CisJCSAgICBfX3cgPSAtX19wYXJhbS5fTV9kICogX19wYXJhbS5fTV8xY3ggKiAoMSArIF9feSAvIDIpOworCQkgIH0KKworCQlfX3JlamVjdCA9IChfX3cgLSBfX2UgLSBfX3ggKiBfX3BhcmFtLl9NX2xtX3RocgorCQkJICAgID4gX19wYXJhbS5fTV9sZm0gLSBzdGQ6OmxnYW1tYShfX3ggKyBfX20gKyAxKSk7CisKKwkJX19yZWplY3QgfD0gX194ICsgX19tID49IF9fdGhyOworCisJICAgICAgfSB3aGlsZSAoX19yZWplY3QpOworCisJICAgIHJldHVybiByZXN1bHRfdHlwZShfX3ggKyBfX20gKyBfX25hZik7CisJICB9CisJZWxzZQorI2VuZGlmCisJICB7CisJICAgIF9JbnRUeXBlICAgICBfX3ggPSAwOworCSAgICBkb3VibGUgX19wcm9kID0gMS4wOworCisJICAgIGRvCisJICAgICAgeworCQlfX3Byb2QgKj0gX19hdXJuZygpOworCQlfX3ggKz0gMTsKKwkgICAgICB9CisJICAgIHdoaWxlIChfX3Byb2QgPiBfX3BhcmFtLl9NX2xtX3Rocik7CisKKwkgICAgcmV0dXJuIF9feCAtIDE7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgcG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorCS8vIFdlIGNvdWxkIGR1cGxpY2F0ZSBldmVyeXRoaW5nIGZyb20gb3BlcmF0b3IoKS4uLgorCXdoaWxlIChfX2YgIT0gX190KQorCSAgKl9fZisrID0gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9fcGFyYW0pOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3gubWVhbigpIDw8IF9fc3BhY2UgPDwgX194Ll9NX25kOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHBvaXNzb25fZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgZG91YmxlIF9fbWVhbjsKKyAgICAgIF9faXMgPj4gX19tZWFuID4+IF9feC5fTV9uZDsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OnBhcmFtX3R5cGUoX19tZWFuKSk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICB2b2lkCisgICAgYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6cGFyYW1fdHlwZTo6CisgICAgX01faW5pdGlhbGl6ZSgpCisgICAgeworICAgICAgY29uc3QgZG91YmxlIF9fcDEyID0gX01fcCA8PSAwLjUgPyBfTV9wIDogMS4wIC0gX01fcDsKKworICAgICAgX01fZWFzeSA9IHRydWU7CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICBpZiAoX01fdCAqIF9fcDEyID49IDgpCisJeworCSAgX01fZWFzeSA9IGZhbHNlOworCSAgY29uc3QgZG91YmxlIF9fbnAgPSBzdGQ6OmZsb29yKF9NX3QgKiBfX3AxMik7CisJICBjb25zdCBkb3VibGUgX19wYSA9IF9fbnAgLyBfTV90OworCSAgY29uc3QgZG91YmxlIF9fMXAgPSAxIC0gX19wYTsKKworCSAgY29uc3QgZG91YmxlIF9fcGlfNCA9IDAuNzg1Mzk4MTYzMzk3NDQ4MzA5NjE1NjYwODQ1ODE5ODc1N0w7CisJICBjb25zdCBkb3VibGUgX19kMXggPQorCSAgICBzdGQ6OnNxcnQoX19ucCAqIF9fMXAgKiBzdGQ6OmxvZygzMiAqIF9fbnAKKwkJCQkJICAgICAvICg4MSAqIF9fcGlfNCAqIF9fMXApKSk7CisJICBfTV9kMSA9IHN0ZDo6cm91bmQoc3RkOjptYXgoMS4wLCBfX2QxeCkpOworCSAgY29uc3QgZG91YmxlIF9fZDJ4ID0KKwkgICAgc3RkOjpzcXJ0KF9fbnAgKiBfXzFwICogc3RkOjpsb2coMzIgKiBfTV90ICogX18xcAorCQkJCQkgICAgIC8gKF9fcGlfNCAqIF9fcGEpKSk7CisJICBfTV9kMiA9IHN0ZDo6cm91bmQoc3RkOjptYXgoMS4wLCBfX2QyeCkpOworCisJICAvLyBzcXJ0KHBpIC8gMikKKwkgIGNvbnN0IGRvdWJsZSBfX3NwaV8yID0gMS4yNTMzMTQxMzczMTU1MDAyNTEyMDc4ODI2NDI0MDU1MjI2TDsKKwkgIF9NX3MxID0gc3RkOjpzcXJ0KF9fbnAgKiBfXzFwKSAqICgxICsgX01fZDEgLyAoNCAqIF9fbnApKTsKKwkgIF9NX3MyID0gc3RkOjpzcXJ0KF9fbnAgKiBfXzFwKSAqICgxICsgX01fZDIgLyAoNCAqIF9NX3QgKiBfXzFwKSk7CisJICBfTV9jID0gMiAqIF9NX2QxIC8gX19ucDsKKwkgIF9NX2ExID0gc3RkOjpleHAoX01fYykgKiBfTV9zMSAqIF9fc3BpXzI7CisJICBjb25zdCBkb3VibGUgX19hMTIgPSBfTV9hMSArIF9NX3MyICogX19zcGlfMjsKKwkgIGNvbnN0IGRvdWJsZSBfX3MxcyA9IF9NX3MxICogX01fczE7CisJICBfTV9hMTIzID0gX19hMTIgKyAoc3RkOjpleHAoX01fZDEgLyAoX01fdCAqIF9fMXApKQorCQkJICAgICAqIDIgKiBfX3MxcyAvIF9NX2QxCisJCQkgICAgICogc3RkOjpleHAoLV9NX2QxICogX01fZDEgLyAoMiAqIF9fczFzKSkpOworCSAgY29uc3QgZG91YmxlIF9fczJzID0gX01fczIgKiBfTV9zMjsKKwkgIF9NX3MgPSAoX01fYTEyMyArIDIgKiBfX3MycyAvIF9NX2QyCisJCSAgKiBzdGQ6OmV4cCgtX01fZDIgKiBfTV9kMiAvICgyICogX19zMnMpKSk7CisJICBfTV9sZiA9IChzdGQ6OmxnYW1tYShfX25wICsgMSkKKwkJICAgKyBzdGQ6OmxnYW1tYShfTV90IC0gX19ucCArIDEpKTsKKwkgIF9NX2xwMXAgPSBzdGQ6OmxvZyhfX3BhIC8gX18xcCk7CisKKwkgIF9NX3EgPSAtc3RkOjpsb2coMSAtIChfX3AxMiAtIF9fcGEpIC8gX18xcCk7CisJfQorICAgICAgZWxzZQorI2VuZGlmCisJX01fcSA9IC1zdGQ6OmxvZygxIC0gX19wMTIpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIGJpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OnJlc3VsdF90eXBlCisgICAgICBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+OjoKKyAgICAgIF9NX3dhaXRpbmcoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIF9JbnRUeXBlIF9fdCwgZG91YmxlIF9fcSkKKyAgICAgIHsKKwlfSW50VHlwZSBfX3ggPSAwOworCWRvdWJsZSBfX3N1bSA9IDAuMDsKKwlfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIGRvdWJsZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKworCWRvCisJICB7CisJICAgIGlmIChfX3QgPT0gX194KQorCSAgICAgIHJldHVybiBfX3g7CisJICAgIGNvbnN0IGRvdWJsZSBfX2UgPSAtc3RkOjpsb2coMS4wIC0gX19hdXJuZygpKTsKKwkgICAgX19zdW0gKz0gX19lIC8gKF9fdCAtIF9feCk7CisJICAgIF9feCArPSAxOworCSAgfQorCXdoaWxlIChfX3N1bSA8PSBfX3EpOworCisJcmV0dXJuIF9feCAtIDE7CisgICAgICB9CisKKyAgLyoqCisgICAqIEEgcmVqZWN0aW9uIGFsZ29yaXRobSB3aGVuIHQgKiBwID49IDggYW5kIGEgc2ltcGxlIHdhaXRpbmcgdGltZQorICAgKiBtZXRob2QgLSB0aGUgc2Vjb25kIGluIHRoZSByZWZlcmVuY2VkIGJvb2sgLSBvdGhlcndpc2UuCisgICAqIE5COiBUaGUgZm9ybWVyIGlzIGF2YWlsYWJsZSBvbmx5IGlmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICogaXMgZGVmaW5lZC4KKyAgICoKKyAgICogUmVmZXJlbmNlOgorICAgKiBEZXZyb3llLCBMLiBOb24tVW5pZm9ybSBSYW5kb20gVmFyaWF0ZXMgR2VuZXJhdGlvbi4gU3ByaW5nZXItVmVybGFnLAorICAgKiBOZXcgWW9yaywgMTk4NiwgQ2guIFgsIFNlY3QuIDQgKCsgRXJyYXRhISkuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIGJpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OnJlc3VsdF90eXBlCisgICAgICBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJcmVzdWx0X3R5cGUgX19yZXQ7CisJY29uc3QgX0ludFR5cGUgX190ID0gX19wYXJhbS50KCk7CisJY29uc3QgZG91YmxlIF9fcCA9IF9fcGFyYW0ucCgpOworCWNvbnN0IGRvdWJsZSBfX3AxMiA9IF9fcCA8PSAwLjUgPyBfX3AgOiAxLjAgLSBfX3A7CisJX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBkb3VibGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisJaWYgKCFfX3BhcmFtLl9NX2Vhc3kpCisJICB7CisJICAgIGRvdWJsZSBfX3g7CisKKwkgICAgLy8gU2VlIGNvbW1lbnRzIGFib3ZlLi4uCisJICAgIGNvbnN0IGRvdWJsZSBfX25hZiA9CisJICAgICAgKDEgLSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmVwc2lsb24oKSkgLyAyOworCSAgICBjb25zdCBkb3VibGUgX190aHIgPQorCSAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8X0ludFR5cGU+OjptYXgoKSArIF9fbmFmOworCisJICAgIGNvbnN0IGRvdWJsZSBfX25wID0gc3RkOjpmbG9vcihfX3QgKiBfX3AxMik7CisKKwkgICAgLy8gc3FydChwaSAvIDIpCisJICAgIGNvbnN0IGRvdWJsZSBfX3NwaV8yID0gMS4yNTMzMTQxMzczMTU1MDAyNTEyMDc4ODI2NDI0MDU1MjI2TDsKKwkgICAgY29uc3QgZG91YmxlIF9fYTEgPSBfX3BhcmFtLl9NX2ExOworCSAgICBjb25zdCBkb3VibGUgX19hMTIgPSBfX2ExICsgX19wYXJhbS5fTV9zMiAqIF9fc3BpXzI7CisJICAgIGNvbnN0IGRvdWJsZSBfX2ExMjMgPSBfX3BhcmFtLl9NX2ExMjM7CisJICAgIGNvbnN0IGRvdWJsZSBfX3MxcyA9IF9fcGFyYW0uX01fczEgKiBfX3BhcmFtLl9NX3MxOworCSAgICBjb25zdCBkb3VibGUgX19zMnMgPSBfX3BhcmFtLl9NX3MyICogX19wYXJhbS5fTV9zMjsKKworCSAgICBib29sIF9fcmVqZWN0OworCSAgICBkbworCSAgICAgIHsKKwkJY29uc3QgZG91YmxlIF9fdSA9IF9fcGFyYW0uX01fcyAqIF9fYXVybmcoKTsKKworCQlkb3VibGUgX192OworCisJCWlmIChfX3UgPD0gX19hMSkKKwkJICB7CisJCSAgICBjb25zdCBkb3VibGUgX19uID0gX01fbmQoX191cm5nKTsKKwkJICAgIGNvbnN0IGRvdWJsZSBfX3kgPSBfX3BhcmFtLl9NX3MxICogc3RkOjphYnMoX19uKTsKKwkJICAgIF9fcmVqZWN0ID0gX195ID49IF9fcGFyYW0uX01fZDE7CisJCSAgICBpZiAoIV9fcmVqZWN0KQorCQkgICAgICB7CisJCQljb25zdCBkb3VibGUgX19lID0gLXN0ZDo6bG9nKDEuMCAtIF9fYXVybmcoKSk7CisJCQlfX3ggPSBzdGQ6OmZsb29yKF9feSk7CisJCQlfX3YgPSAtX19lIC0gX19uICogX19uIC8gMiArIF9fcGFyYW0uX01fYzsKKwkJICAgICAgfQorCQkgIH0KKwkJZWxzZSBpZiAoX191IDw9IF9fYTEyKQorCQkgIHsKKwkJICAgIGNvbnN0IGRvdWJsZSBfX24gPSBfTV9uZChfX3VybmcpOworCQkgICAgY29uc3QgZG91YmxlIF9feSA9IF9fcGFyYW0uX01fczIgKiBzdGQ6OmFicyhfX24pOworCQkgICAgX19yZWplY3QgPSBfX3kgPj0gX19wYXJhbS5fTV9kMjsKKwkJICAgIGlmICghX19yZWplY3QpCisJCSAgICAgIHsKKwkJCWNvbnN0IGRvdWJsZSBfX2UgPSAtc3RkOjpsb2coMS4wIC0gX19hdXJuZygpKTsKKwkJCV9feCA9IHN0ZDo6Zmxvb3IoLV9feSk7CisJCQlfX3YgPSAtX19lIC0gX19uICogX19uIC8gMjsKKwkJICAgICAgfQorCQkgIH0KKwkJZWxzZSBpZiAoX191IDw9IF9fYTEyMykKKwkJICB7CisJCSAgICBjb25zdCBkb3VibGUgX19lMSA9IC1zdGQ6OmxvZygxLjAgLSBfX2F1cm5nKCkpOworCQkgICAgY29uc3QgZG91YmxlIF9fZTIgPSAtc3RkOjpsb2coMS4wIC0gX19hdXJuZygpKTsKKworCQkgICAgY29uc3QgZG91YmxlIF9feSA9IF9fcGFyYW0uX01fZDEKKwkJCQkgICAgICsgMiAqIF9fczFzICogX19lMSAvIF9fcGFyYW0uX01fZDE7CisJCSAgICBfX3ggPSBzdGQ6OmZsb29yKF9feSk7CisJCSAgICBfX3YgPSAoLV9fZTIgKyBfX3BhcmFtLl9NX2QxICogKDEgLyAoX190IC0gX19ucCkKKwkJCQkJCSAgICAtX195IC8gKDIgKiBfX3MxcykpKTsKKwkJICAgIF9fcmVqZWN0ID0gZmFsc2U7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgY29uc3QgZG91YmxlIF9fZTEgPSAtc3RkOjpsb2coMS4wIC0gX19hdXJuZygpKTsKKwkJICAgIGNvbnN0IGRvdWJsZSBfX2UyID0gLXN0ZDo6bG9nKDEuMCAtIF9fYXVybmcoKSk7CisKKwkJICAgIGNvbnN0IGRvdWJsZSBfX3kgPSBfX3BhcmFtLl9NX2QyCisJCQkJICAgICArIDIgKiBfX3MycyAqIF9fZTEgLyBfX3BhcmFtLl9NX2QyOworCQkgICAgX194ID0gc3RkOjpmbG9vcigtX195KTsKKwkJICAgIF9fdiA9IC1fX2UyIC0gX19wYXJhbS5fTV9kMiAqIF9feSAvICgyICogX19zMnMpOworCQkgICAgX19yZWplY3QgPSBmYWxzZTsKKwkJICB9CisKKwkJX19yZWplY3QgPSBfX3JlamVjdCB8fCBfX3ggPCAtX19ucCB8fCBfX3ggPiBfX3QgLSBfX25wOworCQlpZiAoIV9fcmVqZWN0KQorCQkgIHsKKwkJICAgIGNvbnN0IGRvdWJsZSBfX2xmeCA9CisJCSAgICAgIHN0ZDo6bGdhbW1hKF9fbnAgKyBfX3ggKyAxKQorCQkgICAgICArIHN0ZDo6bGdhbW1hKF9fdCAtIChfX25wICsgX194KSArIDEpOworCQkgICAgX19yZWplY3QgPSBfX3YgPiBfX3BhcmFtLl9NX2xmIC0gX19sZngKKwkJCSAgICAgKyBfX3ggKiBfX3BhcmFtLl9NX2xwMXA7CisJCSAgfQorCisJCV9fcmVqZWN0IHw9IF9feCArIF9fbnAgPj0gX190aHI7CisJICAgICAgfQorCSAgICB3aGlsZSAoX19yZWplY3QpOworCisJICAgIF9feCArPSBfX25wICsgX19uYWY7CisKKwkgICAgY29uc3QgX0ludFR5cGUgX196ID0gX01fd2FpdGluZyhfX3VybmcsIF9fdCAtIF9JbnRUeXBlKF9feCksCisJCQkJCSAgICBfX3BhcmFtLl9NX3EpOworCSAgICBfX3JldCA9IF9JbnRUeXBlKF9feCkgKyBfX3o7CisJICB9CisJZWxzZQorI2VuZGlmCisJICBfX3JldCA9IF9NX3dhaXRpbmcoX191cm5nLCBfX3QsIF9fcGFyYW0uX01fcSk7CisKKwlpZiAoX19wMTIgIT0gX19wKQorCSAgX19yZXQgPSBfX3QgLSBfX3JldDsKKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICAgICBjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKwkvLyBXZSBjb3VsZCBkdXBsaWNhdGUgZXZlcnl0aGluZyBmcm9tIG9wZXJhdG9yKCkuLi4KKwl3aGlsZSAoX19mICE9IF9fdCkKKwkgICpfX2YrKyA9IHRoaXMtPm9wZXJhdG9yKCkoX191cm5nLCBfX3BhcmFtKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC50KCkgPDwgX19zcGFjZSA8PCBfX3gucCgpCisJICAgPDwgX19zcGFjZSA8PCBfX3guX01fbmQ7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX0ludFR5cGUgX190OworICAgICAgZG91YmxlIF9fcDsKKyAgICAgIF9faXMgPj4gX190ID4+IF9fcCA+PiBfX3guX01fbmQ7CisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6CisJCXBhcmFtX3R5cGUoX190LCBfX3ApKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBzdGQ6OmV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisJX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCByZXN1bHRfdHlwZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKwl3aGlsZSAoX19mICE9IF9fdCkKKwkgICpfX2YrKyA9IC1zdGQ6OmxvZyhyZXN1bHRfdHlwZSgxKSAtIF9fYXVybmcoKSkgLyBfX3AubGFtYmRhKCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19vcy53aWRlbignICcpKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3gubGFtYmRhKCk7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBleHBvbmVudGlhbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fbGFtYmRhOworICAgICAgX19pcyA+PiBfX2xhbWJkYTsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBleHBvbmVudGlhbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19sYW1iZGEpKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIC8qKgorICAgKiBQb2xhciBtZXRob2QgZHVlIHRvIE1hcnNhZ2xpYS4KKyAgICoKKyAgICogRGV2cm95ZSwgTC4gTm9uLVVuaWZvcm0gUmFuZG9tIFZhcmlhdGVzIEdlbmVyYXRpb24uIFNwcmluZ2VyLVZlcmxhZywKKyAgICogTmV3IFlvcmssIDE5ODYsIENoLiBWLCBTZWN0LiA0LjQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnJlc3VsdF90eXBlCisgICAgICBub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwlyZXN1bHRfdHlwZSBfX3JldDsKKwlfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIHJlc3VsdF90eXBlPgorCSAgX19hdXJuZyhfX3VybmcpOworCisJaWYgKF9NX3NhdmVkX2F2YWlsYWJsZSkKKwkgIHsKKwkgICAgX01fc2F2ZWRfYXZhaWxhYmxlID0gZmFsc2U7CisJICAgIF9fcmV0ID0gX01fc2F2ZWQ7CisJICB9CisJZWxzZQorCSAgeworCSAgICByZXN1bHRfdHlwZSBfX3gsIF9feSwgX19yMjsKKwkgICAgZG8KKwkgICAgICB7CisJCV9feCA9IHJlc3VsdF90eXBlKDIuMCkgKiBfX2F1cm5nKCkgLSAxLjA7CisJCV9feSA9IHJlc3VsdF90eXBlKDIuMCkgKiBfX2F1cm5nKCkgLSAxLjA7CisJCV9fcjIgPSBfX3ggKiBfX3ggKyBfX3kgKiBfX3k7CisJICAgICAgfQorCSAgICB3aGlsZSAoX19yMiA+IDEuMCB8fCBfX3IyID09IDAuMCk7CisKKwkgICAgY29uc3QgcmVzdWx0X3R5cGUgX19tdWx0ID0gc3RkOjpzcXJ0KC0yICogc3RkOjpsb2coX19yMikgLyBfX3IyKTsKKwkgICAgX01fc2F2ZWQgPSBfX3ggKiBfX211bHQ7CisJICAgIF9NX3NhdmVkX2F2YWlsYWJsZSA9IHRydWU7CisJICAgIF9fcmV0ID0gX195ICogX19tdWx0OworCSAgfQorCisJX19yZXQgPSBfX3JldCAqIF9fcGFyYW0uc3RkZGV2KCkgKyBfX3BhcmFtLm1lYW4oKTsKKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIG5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICAgICBjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKworCWlmIChfX2YgPT0gX190KQorCSAgcmV0dXJuOworCisJaWYgKF9NX3NhdmVkX2F2YWlsYWJsZSkKKwkgIHsKKwkgICAgX01fc2F2ZWRfYXZhaWxhYmxlID0gZmFsc2U7CisJICAgICpfX2YrKyA9IF9NX3NhdmVkICogX19wYXJhbS5zdGRkZXYoKSArIF9fcGFyYW0ubWVhbigpOworCisJICAgIGlmIChfX2YgPT0gX190KQorCSAgICAgIHJldHVybjsKKwkgIH0KKworCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgcmVzdWx0X3R5cGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisKKwl3aGlsZSAoX19mICsgMSA8IF9fdCkKKwkgIHsKKwkgICAgcmVzdWx0X3R5cGUgX194LCBfX3ksIF9fcjI7CisJICAgIGRvCisJICAgICAgeworCQlfX3ggPSByZXN1bHRfdHlwZSgyLjApICogX19hdXJuZygpIC0gMS4wOworCQlfX3kgPSByZXN1bHRfdHlwZSgyLjApICogX19hdXJuZygpIC0gMS4wOworCQlfX3IyID0gX194ICogX194ICsgX195ICogX195OworCSAgICAgIH0KKwkgICAgd2hpbGUgKF9fcjIgPiAxLjAgfHwgX19yMiA9PSAwLjApOworCisJICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fbXVsdCA9IHN0ZDo6c3FydCgtMiAqIHN0ZDo6bG9nKF9fcjIpIC8gX19yMik7CisJICAgICpfX2YrKyA9IF9feSAqIF9fbXVsdCAqIF9fcGFyYW0uc3RkZGV2KCkgKyBfX3BhcmFtLm1lYW4oKTsKKwkgICAgKl9fZisrID0gX194ICogX19tdWx0ICogX19wYXJhbS5zdGRkZXYoKSArIF9fcGFyYW0ubWVhbigpOworCSAgfQorCisJaWYgKF9fZiAhPSBfX3QpCisJICB7CisJICAgIHJlc3VsdF90eXBlIF9feCwgX195LCBfX3IyOworCSAgICBkbworCSAgICAgIHsKKwkJX194ID0gcmVzdWx0X3R5cGUoMi4wKSAqIF9fYXVybmcoKSAtIDEuMDsKKwkJX195ID0gcmVzdWx0X3R5cGUoMi4wKSAqIF9fYXVybmcoKSAtIDEuMDsKKwkJX19yMiA9IF9feCAqIF9feCArIF9feSAqIF9feTsKKwkgICAgICB9CisJICAgIHdoaWxlIChfX3IyID4gMS4wIHx8IF9fcjIgPT0gMC4wKTsKKworCSAgICBjb25zdCByZXN1bHRfdHlwZSBfX211bHQgPSBzdGQ6OnNxcnQoLTIgKiBzdGQ6OmxvZyhfX3IyKSAvIF9fcjIpOworCSAgICBfTV9zYXZlZCA9IF9feCAqIF9fbXVsdDsKKwkgICAgX01fc2F2ZWRfYXZhaWxhYmxlID0gdHJ1ZTsKKwkgICAgKl9fZiA9IF9feSAqIF9fbXVsdCAqIF9fcGFyYW0uc3RkZGV2KCkgKyBfX3BhcmFtLm1lYW4oKTsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6bm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsKKyAgICAgIGlmIChfX2QxLl9NX3BhcmFtID09IF9fZDIuX01fcGFyYW0KKwkgICYmIF9fZDEuX01fc2F2ZWRfYXZhaWxhYmxlID09IF9fZDIuX01fc2F2ZWRfYXZhaWxhYmxlKQorCXsKKwkgIGlmIChfX2QxLl9NX3NhdmVkX2F2YWlsYWJsZQorCSAgICAgICYmIF9fZDEuX01fc2F2ZWQgPT0gX19kMi5fTV9zYXZlZCkKKwkgICAgcmV0dXJuIHRydWU7CisJICBlbHNlIGlmKCFfX2QxLl9NX3NhdmVkX2F2YWlsYWJsZSkKKwkgICAgcmV0dXJuIHRydWU7CisJICBlbHNlCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3gubWVhbigpIDw8IF9fc3BhY2UgPDwgX194LnN0ZGRldigpCisJICAgPDwgX19zcGFjZSA8PCBfX3guX01fc2F2ZWRfYXZhaWxhYmxlOworICAgICAgaWYgKF9feC5fTV9zYXZlZF9hdmFpbGFibGUpCisJX19vcyA8PCBfX3NwYWNlIDw8IF9feC5fTV9zYXZlZDsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIG5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgZG91YmxlIF9fbWVhbiwgX19zdGRkZXY7CisgICAgICBfX2lzID4+IF9fbWVhbiA+PiBfX3N0ZGRldgorCSAgID4+IF9feC5fTV9zYXZlZF9hdmFpbGFibGU7CisgICAgICBpZiAoX194Ll9NX3NhdmVkX2F2YWlsYWJsZSkKKwlfX2lzID4+IF9feC5fTV9zYXZlZDsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorCQlwYXJhbV90eXBlKF9fbWVhbiwgX19zdGRkZXYpKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBsb2dub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKwkgIHdoaWxlIChfX2YgIT0gX190KQorCSAgICAqX19mKysgPSBzdGQ6OmV4cChfX3AucygpICogX01fbmQoX191cm5nKSArIF9fcC5tKCkpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGxvZ25vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5tKCkgPDwgX19zcGFjZSA8PCBfX3gucygpCisJICAgPDwgX19zcGFjZSA8PCBfX3guX01fbmQ7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBsb2dub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9SZWFsVHlwZSBfX20sIF9fczsKKyAgICAgIF9faXMgPj4gX19tID4+IF9fcyA+PiBfX3guX01fbmQ7CisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX20sIF9fcykpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBzdGQ6OmNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorCXdoaWxlIChfX2YgIT0gX190KQorCSAgKl9fZisrID0gMiAqIF9NX2dkKF9fdXJuZyk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHN0ZDo6Y2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgdHlwZW5hbWUKKwkJICAgICAgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+OjpwYXJhbV90eXBlJiBfX3ApCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorCXdoaWxlIChfX2YgIT0gX190KQorCSAgKl9fZisrID0gMiAqIF9NX2dkKF9fdXJuZywgX19wKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBjaGlfc3F1YXJlZF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5uKCkgPDwgX19zcGFjZSA8PCBfX3guX01fZ2Q7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBjaGlfc3F1YXJlZF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fbjsKKyAgICAgIF9faXMgPj4gX19uID4+IF9feC5fTV9nZDsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBjaGlfc3F1YXJlZF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19uKSk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBjYXVjaHlfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnJlc3VsdF90eXBlCisgICAgICBjYXVjaHlfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgcmVzdWx0X3R5cGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisJX1JlYWxUeXBlIF9fdTsKKwlkbworCSAgX191ID0gX19hdXJuZygpOworCXdoaWxlIChfX3UgPT0gMC41KTsKKworCWNvbnN0IF9SZWFsVHlwZSBfX3BpID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI5TDsKKwlyZXR1cm4gX19wLmEoKSArIF9fcC5iKCkgKiBzdGQ6OnRhbihfX3BpICogX191KTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgY2F1Y2h5X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisJY29uc3QgX1JlYWxUeXBlIF9fcGkgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUwMjlMOworCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgcmVzdWx0X3R5cGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisJd2hpbGUgKF9fZiAhPSBfX3QpCisJICB7CisJICAgIF9SZWFsVHlwZSBfX3U7CisJICAgIGRvCisJICAgICAgX191ID0gX19hdXJuZygpOworCSAgICB3aGlsZSAoX191ID09IDAuNSk7CisKKwkgICAgKl9fZisrID0gX19wLmEoKSArIF9fcC5iKCkgKiBzdGQ6OnRhbihfX3BpICogX191KTsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBjYXVjaHlfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3guYSgpIDw8IF9fc3BhY2UgPDwgX194LmIoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGNhdWNoeV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fYSwgX19iOworICAgICAgX19pcyA+PiBfX2EgPj4gX19iOworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIGNhdWNoeV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19hLCBfX2IpKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBzdGQ6OmZpc2hlcl9mX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorCXdoaWxlIChfX2YgIT0gX190KQorCSAgKl9fZisrID0gKChfTV9nZF94KF9fdXJuZykgKiBuKCkpIC8gKF9NX2dkX3koX191cm5nKSAqIG0oKSkpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBzdGQ6OmZpc2hlcl9mX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisJdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT46OnBhcmFtX3R5cGUKKwkgIHBhcmFtX3R5cGU7CisJcGFyYW1fdHlwZSBfX3AxKF9fcC5tKCkgLyAyKTsKKwlwYXJhbV90eXBlIF9fcDIoX19wLm4oKSAvIDIpOworCXdoaWxlIChfX2YgIT0gX190KQorCSAgKl9fZisrID0gKChfTV9nZF94KF9fdXJuZywgX19wMSkgKiBuKCkpCisJCSAgICAvIChfTV9nZF95KF9fdXJuZywgX19wMikgKiBtKCkpKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBmaXNoZXJfZl9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5tKCkgPDwgX19zcGFjZSA8PCBfX3gubigpCisJICAgPDwgX19zcGFjZSA8PCBfX3guX01fZ2RfeCA8PCBfX3NwYWNlIDw8IF9feC5fTV9nZF95OworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgZmlzaGVyX2ZfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9SZWFsVHlwZSBfX20sIF9fbjsKKyAgICAgIF9faXMgPj4gX19tID4+IF9fbiA+PiBfX3guX01fZ2RfeCA+PiBfX3guX01fZ2RfeTsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBmaXNoZXJfZl9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19tLCBfX24pKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBzdGQ6OnN0dWRlbnRfdF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKwl3aGlsZSAoX19mICE9IF9fdCkKKwkgICpfX2YrKyA9IF9NX25kKF9fdXJuZykgKiBzdGQ6OnNxcnQobigpIC8gX01fZ2QoX191cm5nKSk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHN0ZDo6c3R1ZGVudF90X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisJdHlwZW5hbWUgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+OjpwYXJhbV90eXBlCisJICBfX3AyKF9fcC5uKCkgLyAyLCAyKTsKKwl3aGlsZSAoX19mICE9IF9fdCkKKwkgICpfX2YrKyA9ICBfTV9uZChfX3VybmcpICogc3RkOjpzcXJ0KF9fcC5uKCkgLyBfTV9nZChfX3VybmcsIF9fcDIpKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBzdHVkZW50X3RfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3gubigpIDw8IF9fc3BhY2UgPDwgX194Ll9NX25kIDw8IF9fc3BhY2UgPDwgX194Ll9NX2dkOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfUmVhbFR5cGUgX19uOworICAgICAgX19pcyA+PiBfX24gPj4gX194Ll9NX25kID4+IF9feC5fTV9nZDsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBzdHVkZW50X3RfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnBhcmFtX3R5cGUoX19uKSk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdm9pZAorICAgIGdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpwYXJhbV90eXBlOjoKKyAgICBfTV9pbml0aWFsaXplKCkKKyAgICB7CisgICAgICBfTV9tYWxwaGEgPSBfTV9hbHBoYSA8IDEuMCA/IF9NX2FscGhhICsgX1JlYWxUeXBlKDEuMCkgOiBfTV9hbHBoYTsKKworICAgICAgY29uc3QgX1JlYWxUeXBlIF9fYTEgPSBfTV9tYWxwaGEgLSBfUmVhbFR5cGUoMS4wKSAvIF9SZWFsVHlwZSgzLjApOworICAgICAgX01fYTIgPSBfUmVhbFR5cGUoMS4wKSAvIHN0ZDo6c3FydChfUmVhbFR5cGUoOS4wKSAqIF9fYTEpOworICAgIH0KKworICAvKioKKyAgICogTWFyc2FnbGlhLCBHLiBhbmQgVHNhbmcsIFcuIFcuCisgICAqICJBIFNpbXBsZSBNZXRob2QgZm9yIEdlbmVyYXRpbmcgR2FtbWEgVmFyaWFibGVzIgorICAgKiBBQ00gVHJhbnNhY3Rpb25zIG9uIE1hdGhlbWF0aWNhbCBTb2Z0d2FyZSwgMjYsIDMsIDM2My0zNzIsIDIwMDAuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBnYW1tYV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIGdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCByZXN1bHRfdHlwZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKworCXJlc3VsdF90eXBlIF9fdSwgX192LCBfX247CisJY29uc3QgcmVzdWx0X3R5cGUgX19hMSA9IChfX3BhcmFtLl9NX21hbHBoYQorCQkJCSAgLSBfUmVhbFR5cGUoMS4wKSAvIF9SZWFsVHlwZSgzLjApKTsKKworCWRvCisJICB7CisJICAgIGRvCisJICAgICAgeworCQlfX24gPSBfTV9uZChfX3VybmcpOworCQlfX3YgPSByZXN1bHRfdHlwZSgxLjApICsgX19wYXJhbS5fTV9hMiAqIF9fbjsgCisJICAgICAgfQorCSAgICB3aGlsZSAoX192IDw9IDAuMCk7CisKKwkgICAgX192ID0gX192ICogX192ICogX192OworCSAgICBfX3UgPSBfX2F1cm5nKCk7CisJICB9CisJd2hpbGUgKF9fdSA+IHJlc3VsdF90eXBlKDEuMCkgLSAwLjMzMSAqIF9fbiAqIF9fbiAqIF9fbiAqIF9fbgorCSAgICAgICAmJiAoc3RkOjpsb2coX191KSA+ICgwLjUgKiBfX24gKiBfX24gKyBfX2ExCisJCQkJICAgICogKDEuMCAtIF9fdiArIHN0ZDo6bG9nKF9fdikpKSkpOworCisJaWYgKF9fcGFyYW0uYWxwaGEoKSA9PSBfX3BhcmFtLl9NX21hbHBoYSkKKwkgIHJldHVybiBfX2ExICogX192ICogX19wYXJhbS5iZXRhKCk7CisJZWxzZQorCSAgeworCSAgICBkbworCSAgICAgIF9fdSA9IF9fYXVybmcoKTsKKwkgICAgd2hpbGUgKF9fdSA9PSAwLjApOworCSAgICAKKwkgICAgcmV0dXJuIChzdGQ6OnBvdyhfX3UsIHJlc3VsdF90eXBlKDEuMCkgLyBfX3BhcmFtLmFscGhhKCkpCisJCSAgICAqIF9fYTEgKiBfX3YgKiBfX3BhcmFtLmJldGEoKSk7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIGdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgcmVzdWx0X3R5cGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisKKwlyZXN1bHRfdHlwZSBfX3UsIF9fdiwgX19uOworCWNvbnN0IHJlc3VsdF90eXBlIF9fYTEgPSAoX19wYXJhbS5fTV9tYWxwaGEKKwkJCQkgIC0gX1JlYWxUeXBlKDEuMCkgLyBfUmVhbFR5cGUoMy4wKSk7CisKKwlpZiAoX19wYXJhbS5hbHBoYSgpID09IF9fcGFyYW0uX01fbWFscGhhKQorCSAgd2hpbGUgKF9fZiAhPSBfX3QpCisJICAgIHsKKwkgICAgICBkbworCQl7CisJCSAgZG8KKwkJICAgIHsKKwkJICAgICAgX19uID0gX01fbmQoX191cm5nKTsKKwkJICAgICAgX192ID0gcmVzdWx0X3R5cGUoMS4wKSArIF9fcGFyYW0uX01fYTIgKiBfX247CisJCSAgICB9CisJCSAgd2hpbGUgKF9fdiA8PSAwLjApOworCisJCSAgX192ID0gX192ICogX192ICogX192OworCQkgIF9fdSA9IF9fYXVybmcoKTsKKwkJfQorCSAgICAgIHdoaWxlIChfX3UgPiByZXN1bHRfdHlwZSgxLjApIC0gMC4zMzEgKiBfX24gKiBfX24gKiBfX24gKiBfX24KKwkJICAgICAmJiAoc3RkOjpsb2coX191KSA+ICgwLjUgKiBfX24gKiBfX24gKyBfX2ExCisJCQkJCSAgKiAoMS4wIC0gX192ICsgc3RkOjpsb2coX192KSkpKSk7CisKKwkgICAgICAqX19mKysgPSBfX2ExICogX192ICogX19wYXJhbS5iZXRhKCk7CisJICAgIH0KKwllbHNlCisJICB3aGlsZSAoX19mICE9IF9fdCkKKwkgICAgeworCSAgICAgIGRvCisJCXsKKwkJICBkbworCQkgICAgeworCQkgICAgICBfX24gPSBfTV9uZChfX3VybmcpOworCQkgICAgICBfX3YgPSByZXN1bHRfdHlwZSgxLjApICsgX19wYXJhbS5fTV9hMiAqIF9fbjsKKwkJICAgIH0KKwkJICB3aGlsZSAoX192IDw9IDAuMCk7CisKKwkJICBfX3YgPSBfX3YgKiBfX3YgKiBfX3Y7CisJCSAgX191ID0gX19hdXJuZygpOworCQl9CisJICAgICAgd2hpbGUgKF9fdSA+IHJlc3VsdF90eXBlKDEuMCkgLSAwLjMzMSAqIF9fbiAqIF9fbiAqIF9fbiAqIF9fbgorCQkgICAgICYmIChzdGQ6OmxvZyhfX3UpID4gKDAuNSAqIF9fbiAqIF9fbiArIF9fYTEKKwkJCQkJICAqICgxLjAgLSBfX3YgKyBzdGQ6OmxvZyhfX3YpKSkpKTsKKworCSAgICAgIGRvCisJCV9fdSA9IF9fYXVybmcoKTsKKwkgICAgICB3aGlsZSAoX191ID09IDAuMCk7CisKKwkgICAgICAqX19mKysgPSAoc3RkOjpwb3coX191LCByZXN1bHRfdHlwZSgxLjApIC8gX19wYXJhbS5hbHBoYSgpKQorCQkJKiBfX2ExICogX192ICogX19wYXJhbS5iZXRhKCkpOworCSAgICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgZ2FtbWFfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3guYWxwaGEoKSA8PCBfX3NwYWNlIDw8IF9feC5iZXRhKCkKKwkgICA8PCBfX3NwYWNlIDw8IF9feC5fTV9uZDsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfUmVhbFR5cGUgX19hbHBoYV92YWwsIF9fYmV0YV92YWw7CisgICAgICBfX2lzID4+IF9fYWxwaGFfdmFsID4+IF9fYmV0YV92YWwgPj4gX194Ll9NX25kOworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIGdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX2FscGhhX3ZhbCwgX19iZXRhX3ZhbCkpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgd2VpYnVsbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIHdlaWJ1bGxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgcmVzdWx0X3R5cGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisJcmV0dXJuIF9fcC5iKCkgKiBzdGQ6OnBvdygtc3RkOjpsb2cocmVzdWx0X3R5cGUoMSkgLSBfX2F1cm5nKCkpLAorCQkJCSAgcmVzdWx0X3R5cGUoMSkgLyBfX3AuYSgpKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgd2VpYnVsbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICAgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgcmVzdWx0X3R5cGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisJYXV0byBfX2ludl9hID0gcmVzdWx0X3R5cGUoMSkgLyBfX3AuYSgpOworCisJd2hpbGUgKF9fZiAhPSBfX3QpCisJICAqX19mKysgPSBfX3AuYigpICogc3RkOjpwb3coLXN0ZDo6bG9nKHJlc3VsdF90eXBlKDEpIC0gX19hdXJuZygpKSwKKwkJCQkgICAgICBfX2ludl9hKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCB3ZWlidWxsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194LmEoKSA8PCBfX3NwYWNlIDw8IF9feC5iKCk7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICB3ZWlidWxsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfUmVhbFR5cGUgX19hLCBfX2I7CisgICAgICBfX2lzID4+IF9fYSA+PiBfX2I7CisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgd2VpYnVsbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19hLCBfX2IpKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnJlc3VsdF90eXBlCisgICAgICBleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIHsKKwlfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIHJlc3VsdF90eXBlPgorCSAgX19hdXJuZyhfX3VybmcpOworCXJldHVybiBfX3AuYSgpIC0gX19wLmIoKSAqIHN0ZDo6bG9nKC1zdGQ6OmxvZyhyZXN1bHRfdHlwZSgxKQorCQkJCQkJICAgICAgLSBfX2F1cm5nKCkpKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICAgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgcmVzdWx0X3R5cGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisKKwl3aGlsZSAoX19mICE9IF9fdCkKKwkgICpfX2YrKyA9IF9fcC5hKCkgLSBfX3AuYigpICogc3RkOjpsb2coLXN0ZDo6bG9nKHJlc3VsdF90eXBlKDEpCisJCQkJCQkJICAtIF9fYXVybmcoKSkpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3guYSgpIDw8IF9fc3BhY2UgPDwgX194LmIoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9SZWFsVHlwZSBfX2EsIF9fYjsKKyAgICAgIF9faXMgPj4gX19hID4+IF9fYjsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX2EsIF9fYikpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdm9pZAorICAgIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OnBhcmFtX3R5cGU6OgorICAgIF9NX2luaXRpYWxpemUoKQorICAgIHsKKyAgICAgIGlmIChfTV9wcm9iLnNpemUoKSA8IDIpCisJeworCSAgX01fcHJvYi5jbGVhcigpOworCSAgcmV0dXJuOworCX0KKworICAgICAgY29uc3QgZG91YmxlIF9fc3VtID0gc3RkOjphY2N1bXVsYXRlKF9NX3Byb2IuYmVnaW4oKSwKKwkJCQkJICAgX01fcHJvYi5lbmQoKSwgMC4wKTsKKyAgICAgIC8vIE5vdyBub3JtYWxpemUgdGhlIHByb2JhYmlsaXRlcy4KKyAgICAgIF9fZGV0YWlsOjpfX25vcm1hbGl6ZShfTV9wcm9iLmJlZ2luKCksIF9NX3Byb2IuZW5kKCksIF9NX3Byb2IuYmVnaW4oKSwKKwkJCSAgICBfX3N1bSk7CisgICAgICAvLyBBY2N1bXVsYXRlIHBhcnRpYWwgc3Vtcy4KKyAgICAgIF9NX2NwLnJlc2VydmUoX01fcHJvYi5zaXplKCkpOworICAgICAgc3RkOjpwYXJ0aWFsX3N1bShfTV9wcm9iLmJlZ2luKCksIF9NX3Byb2IuZW5kKCksCisJCSAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoX01fY3ApKTsKKyAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgbGFzdCBjdW11bGF0aXZlIHByb2JhYmlsaXR5IGlzIG9uZS4KKyAgICAgIF9NX2NwW19NX2NwLnNpemUoKSAtIDFdID0gMS4wOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYz4KKyAgICAgIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OnBhcmFtX3R5cGU6OgorICAgICAgcGFyYW1fdHlwZShzaXplX3QgX19udywgZG91YmxlIF9feG1pbiwgZG91YmxlIF9feG1heCwgX0Z1bmMgX19mdykKKyAgICAgIDogX01fcHJvYigpLCBfTV9jcCgpCisgICAgICB7CisJY29uc3Qgc2l6ZV90IF9fbiA9IF9fbncgPT0gMCA/IDEgOiBfX253OworCWNvbnN0IGRvdWJsZSBfX2RlbHRhID0gKF9feG1heCAtIF9feG1pbikgLyBfX247CisKKwlfTV9wcm9iLnJlc2VydmUoX19uKTsKKwlmb3IgKHNpemVfdCBfX2sgPSAwOyBfX2sgPCBfX253OyArK19faykKKwkgIF9NX3Byb2IucHVzaF9iYWNrKF9fZncoX194bWluICsgX19rICogX19kZWx0YSArIDAuNSAqIF9fZGVsdGEpKTsKKworCV9NX2luaXRpYWxpemUoKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OnJlc3VsdF90eXBlCisgICAgICBkaXNjcmV0ZV9kaXN0cmlidXRpb248X0ludFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJaWYgKF9fcGFyYW0uX01fY3AuZW1wdHkoKSkKKwkgIHJldHVybiByZXN1bHRfdHlwZSgwKTsKKworCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgZG91YmxlPgorCSAgX19hdXJuZyhfX3VybmcpOworCisJY29uc3QgZG91YmxlIF9fcCA9IF9fYXVybmcoKTsKKwlhdXRvIF9fcG9zID0gc3RkOjpsb3dlcl9ib3VuZChfX3BhcmFtLl9NX2NwLmJlZ2luKCksCisJCQkJICAgICAgX19wYXJhbS5fTV9jcC5lbmQoKSwgX19wKTsKKworCXJldHVybiBfX3BvcyAtIF9fcGFyYW0uX01fY3AuYmVnaW4oKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBkaXNjcmV0ZV9kaXN0cmlidXRpb248X0ludFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorCisJaWYgKF9fcGFyYW0uX01fY3AuZW1wdHkoKSkKKwkgIHsKKwkgICAgd2hpbGUgKF9fZiAhPSBfX3QpCisJICAgICAgKl9fZisrID0gcmVzdWx0X3R5cGUoMCk7CisJICAgIHJldHVybjsKKwkgIH0KKworCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgZG91YmxlPgorCSAgX19hdXJuZyhfX3VybmcpOworCisJd2hpbGUgKF9fZiAhPSBfX3QpCisJICB7CisJICAgIGNvbnN0IGRvdWJsZSBfX3AgPSBfX2F1cm5nKCk7CisJICAgIGF1dG8gX19wb3MgPSBzdGQ6Omxvd2VyX2JvdW5kKF9fcGFyYW0uX01fY3AuYmVnaW4oKSwKKwkJCQkJICBfX3BhcmFtLl9NX2NwLmVuZCgpLCBfX3ApOworCisJICAgICpfX2YrKyA9IF9fcG9zIC0gX19wYXJhbS5fTV9jcC5iZWdpbigpOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgZGlzY3JldGVfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+IF9fcHJvYiA9IF9feC5wcm9iYWJpbGl0aWVzKCk7CisgICAgICBfX29zIDw8IF9fcHJvYi5zaXplKCk7CisgICAgICBmb3IgKGF1dG8gX19kaXQgPSBfX3Byb2IuYmVnaW4oKTsgX19kaXQgIT0gX19wcm9iLmVuZCgpOyArK19fZGl0KQorCV9fb3MgPDwgX19zcGFjZSA8PCAqX19kaXQ7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIHNpemVfdCBfX247CisgICAgICBfX2lzID4+IF9fbjsKKworICAgICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiBfX3Byb2JfdmVjOworICAgICAgX19wcm9iX3ZlYy5yZXNlcnZlKF9fbik7CisgICAgICBmb3IgKDsgX19uICE9IDA7IC0tX19uKQorCXsKKwkgIGRvdWJsZSBfX3Byb2I7CisJICBfX2lzID4+IF9fcHJvYjsKKwkgIF9fcHJvYl92ZWMucHVzaF9iYWNrKF9fcHJvYik7CisJfQorCisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgZGlzY3JldGVfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19wcm9iX3ZlYy5iZWdpbigpLCBfX3Byb2JfdmVjLmVuZCgpKSk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdm9pZAorICAgIHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cGFyYW1fdHlwZTo6CisgICAgX01faW5pdGlhbGl6ZSgpCisgICAgeworICAgICAgaWYgKF9NX2ludC5zaXplKCkgPCAyCisJICB8fCAoX01faW50LnNpemUoKSA9PSAyCisJICAgICAgJiYgX01faW50WzBdID09IF9SZWFsVHlwZSgwKQorCSAgICAgICYmIF9NX2ludFsxXSA9PSBfUmVhbFR5cGUoMSkpKQorCXsKKwkgIF9NX2ludC5jbGVhcigpOworCSAgX01fZGVuLmNsZWFyKCk7CisJICByZXR1cm47CisJfQorCisgICAgICBjb25zdCBkb3VibGUgX19zdW0gPSBzdGQ6OmFjY3VtdWxhdGUoX01fZGVuLmJlZ2luKCksCisJCQkJCSAgIF9NX2Rlbi5lbmQoKSwgMC4wKTsKKworICAgICAgX19kZXRhaWw6Ol9fbm9ybWFsaXplKF9NX2Rlbi5iZWdpbigpLCBfTV9kZW4uZW5kKCksIF9NX2Rlbi5iZWdpbigpLAorCQkJICAgIF9fc3VtKTsKKworICAgICAgX01fY3AucmVzZXJ2ZShfTV9kZW4uc2l6ZSgpKTsKKyAgICAgIHN0ZDo6cGFydGlhbF9zdW0oX01fZGVuLmJlZ2luKCksIF9NX2Rlbi5lbmQoKSwKKwkJICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihfTV9jcCkpOworCisgICAgICAvLyBNYWtlIHN1cmUgdGhlIGxhc3QgY3VtdWxhdGl2ZSBwcm9iYWJpbGl0eSBpcyBvbmUuCisgICAgICBfTV9jcFtfTV9jcC5zaXplKCkgLSAxXSA9IDEuMDsKKworICAgICAgZm9yIChzaXplX3QgX19rID0gMDsgX19rIDwgX01fZGVuLnNpemUoKTsgKytfX2spCisJX01fZGVuW19fa10gLz0gX01faW50W19fayArIDFdIC0gX01faW50W19fa107CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvckIsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yVz4KKyAgICAgIHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cGFyYW1fdHlwZTo6CisgICAgICBwYXJhbV90eXBlKF9JbnB1dEl0ZXJhdG9yQiBfX2JiZWdpbiwKKwkJIF9JbnB1dEl0ZXJhdG9yQiBfX2JlbmQsCisJCSBfSW5wdXRJdGVyYXRvclcgX193YmVnaW4pCisgICAgICA6IF9NX2ludCgpLCBfTV9kZW4oKSwgX01fY3AoKQorICAgICAgeworCWlmIChfX2JiZWdpbiAhPSBfX2JlbmQpCisJICB7CisJICAgIGZvciAoOzspCisJICAgICAgeworCQlfTV9pbnQucHVzaF9iYWNrKCpfX2JiZWdpbik7CisJCSsrX19iYmVnaW47CisJCWlmIChfX2JiZWdpbiA9PSBfX2JlbmQpCisJCSAgYnJlYWs7CisKKwkJX01fZGVuLnB1c2hfYmFjaygqX193YmVnaW4pOworCQkrK19fd2JlZ2luOworCSAgICAgIH0KKwkgIH0KKworCV9NX2luaXRpYWxpemUoKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmM+CisgICAgICBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnBhcmFtX3R5cGU6OgorICAgICAgcGFyYW1fdHlwZShpbml0aWFsaXplcl9saXN0PF9SZWFsVHlwZT4gX19ibCwgX0Z1bmMgX19mdykKKyAgICAgIDogX01faW50KCksIF9NX2RlbigpLCBfTV9jcCgpCisgICAgICB7CisJX01faW50LnJlc2VydmUoX19ibC5zaXplKCkpOworCWZvciAoYXV0byBfX2JpdGVyID0gX19ibC5iZWdpbigpOyBfX2JpdGVyICE9IF9fYmwuZW5kKCk7ICsrX19iaXRlcikKKwkgIF9NX2ludC5wdXNoX2JhY2soKl9fYml0ZXIpOworCisJX01fZGVuLnJlc2VydmUoX01faW50LnNpemUoKSAtIDEpOworCWZvciAoc2l6ZV90IF9fayA9IDA7IF9fayA8IF9NX2ludC5zaXplKCkgLSAxOyArK19faykKKwkgIF9NX2Rlbi5wdXNoX2JhY2soX19mdygwLjUgKiAoX01faW50W19fayArIDFdICsgX01faW50W19fa10pKSk7CisKKwlfTV9pbml0aWFsaXplKCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jPgorICAgICAgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpwYXJhbV90eXBlOjoKKyAgICAgIHBhcmFtX3R5cGUoc2l6ZV90IF9fbncsIF9SZWFsVHlwZSBfX3htaW4sIF9SZWFsVHlwZSBfX3htYXgsIF9GdW5jIF9fZncpCisgICAgICA6IF9NX2ludCgpLCBfTV9kZW4oKSwgX01fY3AoKQorICAgICAgeworCWNvbnN0IHNpemVfdCBfX24gPSBfX253ID09IDAgPyAxIDogX19udzsKKwljb25zdCBfUmVhbFR5cGUgX19kZWx0YSA9IChfX3htYXggLSBfX3htaW4pIC8gX19uOworCisJX01faW50LnJlc2VydmUoX19uICsgMSk7CisJZm9yIChzaXplX3QgX19rID0gMDsgX19rIDw9IF9fbnc7ICsrX19rKQorCSAgX01faW50LnB1c2hfYmFjayhfX3htaW4gKyBfX2sgKiBfX2RlbHRhKTsKKworCV9NX2Rlbi5yZXNlcnZlKF9fbik7CisJZm9yIChzaXplX3QgX19rID0gMDsgX19rIDwgX19udzsgKytfX2spCisJICBfTV9kZW4ucHVzaF9iYWNrKF9fZncoX01faW50W19fa10gKyAwLjUgKiBfX2RlbHRhKSk7CisKKwlfTV9pbml0aWFsaXplKCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBkb3VibGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisKKwljb25zdCBkb3VibGUgX19wID0gX19hdXJuZygpOworCWlmIChfX3BhcmFtLl9NX2NwLmVtcHR5KCkpCisJICByZXR1cm4gX19wOworCisJYXV0byBfX3BvcyA9IHN0ZDo6bG93ZXJfYm91bmQoX19wYXJhbS5fTV9jcC5iZWdpbigpLAorCQkJCSAgICAgIF9fcGFyYW0uX01fY3AuZW5kKCksIF9fcCk7CisJY29uc3Qgc2l6ZV90IF9faSA9IF9fcG9zIC0gX19wYXJhbS5fTV9jcC5iZWdpbigpOworCisJY29uc3QgZG91YmxlIF9fcHJlZiA9IF9faSA+IDAgPyBfX3BhcmFtLl9NX2NwW19faSAtIDFdIDogMC4wOworCisJcmV0dXJuIF9fcGFyYW0uX01faW50W19faV0gKyAoX19wIC0gX19wcmVmKSAvIF9fcGFyYW0uX01fZGVuW19faV07CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICAgICBjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKwlfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIGRvdWJsZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKworCWlmIChfX3BhcmFtLl9NX2NwLmVtcHR5KCkpCisJICB7CisJICAgIHdoaWxlIChfX2YgIT0gX190KQorCSAgICAgICpfX2YrKyA9IF9fYXVybmcoKTsKKwkgICAgcmV0dXJuOworCSAgfQorCisJd2hpbGUgKF9fZiAhPSBfX3QpCisJICB7CisJICAgIGNvbnN0IGRvdWJsZSBfX3AgPSBfX2F1cm5nKCk7CisKKwkgICAgYXV0byBfX3BvcyA9IHN0ZDo6bG93ZXJfYm91bmQoX19wYXJhbS5fTV9jcC5iZWdpbigpLAorCQkJCQkgIF9fcGFyYW0uX01fY3AuZW5kKCksIF9fcCk7CisJICAgIGNvbnN0IHNpemVfdCBfX2kgPSBfX3BvcyAtIF9fcGFyYW0uX01fY3AuYmVnaW4oKTsKKworCSAgICBjb25zdCBkb3VibGUgX19wcmVmID0gX19pID4gMCA/IF9fcGFyYW0uX01fY3BbX19pIC0gMV0gOiAwLjA7CisKKwkgICAgKl9fZisrID0gKF9fcGFyYW0uX01faW50W19faV0KKwkJICAgICAgKyAoX19wIC0gX19wcmVmKSAvIF9fcGFyYW0uX01fZGVuW19faV0pOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBzdGQ6OnZlY3RvcjxfUmVhbFR5cGU+IF9faW50ID0gX194LmludGVydmFscygpOworICAgICAgX19vcyA8PCBfX2ludC5zaXplKCkgLSAxOworCisgICAgICBmb3IgKGF1dG8gX194aXQgPSBfX2ludC5iZWdpbigpOyBfX3hpdCAhPSBfX2ludC5lbmQoKTsgKytfX3hpdCkKKwlfX29zIDw8IF9fc3BhY2UgPDwgKl9feGl0OworCisgICAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+IF9fZGVuID0gX194LmRlbnNpdGllcygpOworICAgICAgZm9yIChhdXRvIF9fZGl0ID0gX19kZW4uYmVnaW4oKTsgX19kaXQgIT0gX19kZW4uZW5kKCk7ICsrX19kaXQpCisJX19vcyA8PCBfX3NwYWNlIDw8ICpfX2RpdDsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgc2l6ZV90IF9fbjsKKyAgICAgIF9faXMgPj4gX19uOworCisgICAgICBzdGQ6OnZlY3RvcjxfUmVhbFR5cGU+IF9faW50X3ZlYzsKKyAgICAgIF9faW50X3ZlYy5yZXNlcnZlKF9fbiArIDEpOworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDw9IF9fbjsgKytfX2kpCisJeworCSAgX1JlYWxUeXBlIF9faW50OworCSAgX19pcyA+PiBfX2ludDsKKwkgIF9faW50X3ZlYy5wdXNoX2JhY2soX19pbnQpOworCX0KKworICAgICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiBfX2Rlbl92ZWM7CisgICAgICBfX2Rlbl92ZWMucmVzZXJ2ZShfX24pOworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKwl7CisJICBkb3VibGUgX19kZW47CisJICBfX2lzID4+IF9fZGVuOworCSAgX19kZW5fdmVjLnB1c2hfYmFjayhfX2Rlbik7CisJfQorCisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKwkgIHBhcmFtX3R5cGUoX19pbnRfdmVjLmJlZ2luKCksIF9faW50X3ZlYy5lbmQoKSwgX19kZW5fdmVjLmJlZ2luKCkpKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB2b2lkCisgICAgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cGFyYW1fdHlwZTo6CisgICAgX01faW5pdGlhbGl6ZSgpCisgICAgeworICAgICAgaWYgKF9NX2ludC5zaXplKCkgPCAyCisJICB8fCAoX01faW50LnNpemUoKSA9PSAyCisJICAgICAgJiYgX01faW50WzBdID09IF9SZWFsVHlwZSgwKQorCSAgICAgICYmIF9NX2ludFsxXSA9PSBfUmVhbFR5cGUoMSkKKwkgICAgICAmJiBfTV9kZW5bMF0gPT0gX01fZGVuWzFdKSkKKwl7CisJICBfTV9pbnQuY2xlYXIoKTsKKwkgIF9NX2Rlbi5jbGVhcigpOworCSAgcmV0dXJuOworCX0KKworICAgICAgZG91YmxlIF9fc3VtID0gMC4wOworICAgICAgX01fY3AucmVzZXJ2ZShfTV9pbnQuc2l6ZSgpIC0gMSk7CisgICAgICBfTV9tLnJlc2VydmUoX01faW50LnNpemUoKSAtIDEpOworICAgICAgZm9yIChzaXplX3QgX19rID0gMDsgX19rIDwgX01faW50LnNpemUoKSAtIDE7ICsrX19rKQorCXsKKwkgIGNvbnN0IF9SZWFsVHlwZSBfX2RlbHRhID0gX01faW50W19fayArIDFdIC0gX01faW50W19fa107CisJICBfX3N1bSArPSAwLjUgKiAoX01fZGVuW19fayArIDFdICsgX01fZGVuW19fa10pICogX19kZWx0YTsKKwkgIF9NX2NwLnB1c2hfYmFjayhfX3N1bSk7CisJICBfTV9tLnB1c2hfYmFjaygoX01fZGVuW19fayArIDFdIC0gX01fZGVuW19fa10pIC8gX19kZWx0YSk7CisJfQorCisgICAgICAvLyAgTm93IG5vcm1hbGl6ZSB0aGUgZGVuc2l0aWVzLi4uCisgICAgICBfX2RldGFpbDo6X19ub3JtYWxpemUoX01fZGVuLmJlZ2luKCksIF9NX2Rlbi5lbmQoKSwgX01fZGVuLmJlZ2luKCksCisJCQkgICAgX19zdW0pOworICAgICAgLy8gIC4uLiBhbmQgcGFydGlhbCBzdW1zLi4uIAorICAgICAgX19kZXRhaWw6Ol9fbm9ybWFsaXplKF9NX2NwLmJlZ2luKCksIF9NX2NwLmVuZCgpLCBfTV9jcC5iZWdpbigpLCBfX3N1bSk7CisgICAgICAvLyAgLi4uIGFuZCBzbG9wZXMuCisgICAgICBfX2RldGFpbDo6X19ub3JtYWxpemUoX01fbS5iZWdpbigpLCBfTV9tLmVuZCgpLCBfTV9tLmJlZ2luKCksIF9fc3VtKTsKKworICAgICAgLy8gIE1ha2Ugc3VyZSB0aGUgbGFzdCBjdW11bGF0aXZlIHByb2JhYmxpbGl0eSBpcyBvbmUuCisgICAgICBfTV9jcFtfTV9jcC5zaXplKCkgLSAxXSA9IDEuMDsKKyAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvckIsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yVz4KKyAgICAgIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnBhcmFtX3R5cGU6OgorICAgICAgcGFyYW1fdHlwZShfSW5wdXRJdGVyYXRvckIgX19iYmVnaW4sCisJCSBfSW5wdXRJdGVyYXRvckIgX19iZW5kLAorCQkgX0lucHV0SXRlcmF0b3JXIF9fd2JlZ2luKQorICAgICAgOiBfTV9pbnQoKSwgX01fZGVuKCksIF9NX2NwKCksIF9NX20oKQorICAgICAgeworCWZvciAoOyBfX2JiZWdpbiAhPSBfX2JlbmQ7ICsrX19iYmVnaW4sICsrX193YmVnaW4pCisJICB7CisJICAgIF9NX2ludC5wdXNoX2JhY2soKl9fYmJlZ2luKTsKKwkgICAgX01fZGVuLnB1c2hfYmFjaygqX193YmVnaW4pOworCSAgfQorCisJX01faW5pdGlhbGl6ZSgpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYz4KKyAgICAgIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnBhcmFtX3R5cGU6OgorICAgICAgcGFyYW1fdHlwZShpbml0aWFsaXplcl9saXN0PF9SZWFsVHlwZT4gX19ibCwgX0Z1bmMgX19mdykKKyAgICAgIDogX01faW50KCksIF9NX2RlbigpLCBfTV9jcCgpLCBfTV9tKCkKKyAgICAgIHsKKwlfTV9pbnQucmVzZXJ2ZShfX2JsLnNpemUoKSk7CisJX01fZGVuLnJlc2VydmUoX19ibC5zaXplKCkpOworCWZvciAoYXV0byBfX2JpdGVyID0gX19ibC5iZWdpbigpOyBfX2JpdGVyICE9IF9fYmwuZW5kKCk7ICsrX19iaXRlcikKKwkgIHsKKwkgICAgX01faW50LnB1c2hfYmFjaygqX19iaXRlcik7CisJICAgIF9NX2Rlbi5wdXNoX2JhY2soX19mdygqX19iaXRlcikpOworCSAgfQorCisJX01faW5pdGlhbGl6ZSgpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYz4KKyAgICAgIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnBhcmFtX3R5cGU6OgorICAgICAgcGFyYW1fdHlwZShzaXplX3QgX19udywgX1JlYWxUeXBlIF9feG1pbiwgX1JlYWxUeXBlIF9feG1heCwgX0Z1bmMgX19mdykKKyAgICAgIDogX01faW50KCksIF9NX2RlbigpLCBfTV9jcCgpLCBfTV9tKCkKKyAgICAgIHsKKwljb25zdCBzaXplX3QgX19uID0gX19udyA9PSAwID8gMSA6IF9fbnc7CisJY29uc3QgX1JlYWxUeXBlIF9fZGVsdGEgPSAoX194bWF4IC0gX194bWluKSAvIF9fbjsKKworCV9NX2ludC5yZXNlcnZlKF9fbiArIDEpOworCV9NX2Rlbi5yZXNlcnZlKF9fbiArIDEpOworCWZvciAoc2l6ZV90IF9fayA9IDA7IF9fayA8PSBfX253OyArK19faykKKwkgIHsKKwkgICAgX01faW50LnB1c2hfYmFjayhfX3htaW4gKyBfX2sgKiBfX2RlbHRhKTsKKwkgICAgX01fZGVuLnB1c2hfYmFjayhfX2Z3KF9NX2ludFtfX2tdICsgX19kZWx0YSkpOworCSAgfQorCisJX01faW5pdGlhbGl6ZSgpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnJlc3VsdF90eXBlCisgICAgICBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBkb3VibGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisKKwljb25zdCBkb3VibGUgX19wID0gX19hdXJuZygpOworCWlmIChfX3BhcmFtLl9NX2NwLmVtcHR5KCkpCisJICByZXR1cm4gX19wOworCisJYXV0byBfX3BvcyA9IHN0ZDo6bG93ZXJfYm91bmQoX19wYXJhbS5fTV9jcC5iZWdpbigpLAorCQkJCSAgICAgIF9fcGFyYW0uX01fY3AuZW5kKCksIF9fcCk7CisJY29uc3Qgc2l6ZV90IF9faSA9IF9fcG9zIC0gX19wYXJhbS5fTV9jcC5iZWdpbigpOworCisJY29uc3QgZG91YmxlIF9fcHJlZiA9IF9faSA+IDAgPyBfX3BhcmFtLl9NX2NwW19faSAtIDFdIDogMC4wOworCisJY29uc3QgZG91YmxlIF9fYSA9IDAuNSAqIF9fcGFyYW0uX01fbVtfX2ldOworCWNvbnN0IGRvdWJsZSBfX2IgPSBfX3BhcmFtLl9NX2RlbltfX2ldOworCWNvbnN0IGRvdWJsZSBfX2NtID0gX19wIC0gX19wcmVmOworCisJX1JlYWxUeXBlIF9feCA9IF9fcGFyYW0uX01faW50W19faV07CisJaWYgKF9fYSA9PSAwKQorCSAgX194ICs9IF9fY20gLyBfX2I7CisJZWxzZQorCSAgeworCSAgICBjb25zdCBkb3VibGUgX19kID0gX19iICogX19iICsgNC4wICogX19hICogX19jbTsKKwkgICAgX194ICs9IDAuNSAqIChzdGQ6OnNxcnQoX19kKSAtIF9fYikgLyBfX2E7CisgICAgICAgICAgfQorCisgICAgICAgIHJldHVybiBfX3g7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisJLy8gV2UgY291bGQgZHVwbGljYXRlIGV2ZXJ5dGhpbmcgZnJvbSBvcGVyYXRvcigpLi4uCisJd2hpbGUgKF9fZiAhPSBfX3QpCisJICAqX19mKysgPSB0aGlzLT5vcGVyYXRvcigpKF9fdXJuZywgX19wYXJhbSk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBzdGQ6OnZlY3RvcjxfUmVhbFR5cGU+IF9faW50ID0gX194LmludGVydmFscygpOworICAgICAgX19vcyA8PCBfX2ludC5zaXplKCkgLSAxOworCisgICAgICBmb3IgKGF1dG8gX194aXQgPSBfX2ludC5iZWdpbigpOyBfX3hpdCAhPSBfX2ludC5lbmQoKTsgKytfX3hpdCkKKwlfX29zIDw8IF9fc3BhY2UgPDwgKl9feGl0OworCisgICAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+IF9fZGVuID0gX194LmRlbnNpdGllcygpOworICAgICAgZm9yIChhdXRvIF9fZGl0ID0gX19kZW4uYmVnaW4oKTsgX19kaXQgIT0gX19kZW4uZW5kKCk7ICsrX19kaXQpCisJX19vcyA8PCBfX3NwYWNlIDw8ICpfX2RpdDsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIHNpemVfdCBfX247CisgICAgICBfX2lzID4+IF9fbjsKKworICAgICAgc3RkOjp2ZWN0b3I8X1JlYWxUeXBlPiBfX2ludF92ZWM7CisgICAgICBfX2ludF92ZWMucmVzZXJ2ZShfX24gKyAxKTsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8PSBfX247ICsrX19pKQorCXsKKwkgIF9SZWFsVHlwZSBfX2ludDsKKwkgIF9faXMgPj4gX19pbnQ7CisJICBfX2ludF92ZWMucHVzaF9iYWNrKF9faW50KTsKKwl9CisKKyAgICAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gX19kZW5fdmVjOworICAgICAgX19kZW5fdmVjLnJlc2VydmUoX19uICsgMSk7CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPD0gX19uOyArK19faSkKKwl7CisJICBkb3VibGUgX19kZW47CisJICBfX2lzID4+IF9fZGVuOworCSAgX19kZW5fdmVjLnB1c2hfYmFjayhfX2Rlbik7CisJfQorCisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJICBwYXJhbV90eXBlKF9faW50X3ZlYy5iZWdpbigpLCBfX2ludF92ZWMuZW5kKCksIF9fZGVuX3ZlYy5iZWdpbigpKSk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICBzZWVkX3NlcTo6c2VlZF9zZXEoc3RkOjppbml0aWFsaXplcl9saXN0PF9JbnRUeXBlPiBfX2lsKQorICAgIHsKKyAgICAgIGZvciAoYXV0byBfX2l0ZXIgPSBfX2lsLmJlZ2luKCk7IF9faXRlciAhPSBfX2lsLmVuZCgpOyArK19faXRlcikKKwlfTV92LnB1c2hfYmFjayhfX2RldGFpbDo6X19tb2Q8cmVzdWx0X3R5cGUsCisJCSAgICAgICBfX2RldGFpbDo6X1NoaWZ0PHJlc3VsdF90eXBlLCAzMj46Ol9fdmFsdWU+KCpfX2l0ZXIpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgc2VlZF9zZXE6OnNlZWRfc2VxKF9JbnB1dEl0ZXJhdG9yIF9fYmVnaW4sIF9JbnB1dEl0ZXJhdG9yIF9fZW5kKQorICAgIHsKKyAgICAgIGZvciAoX0lucHV0SXRlcmF0b3IgX19pdGVyID0gX19iZWdpbjsgX19pdGVyICE9IF9fZW5kOyArK19faXRlcikKKwlfTV92LnB1c2hfYmFjayhfX2RldGFpbDo6X19tb2Q8cmVzdWx0X3R5cGUsCisJCSAgICAgICBfX2RldGFpbDo6X1NoaWZ0PHJlc3VsdF90eXBlLCAzMj46Ol9fdmFsdWU+KCpfX2l0ZXIpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBzZWVkX3NlcTo6Z2VuZXJhdGUoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fYmVnaW4sCisJCSAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19lbmQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorICAgICAgICBfVHlwZTsKKworICAgICAgaWYgKF9fYmVnaW4gPT0gX19lbmQpCisJcmV0dXJuOworCisgICAgICBzdGQ6OmZpbGwoX19iZWdpbiwgX19lbmQsIF9UeXBlKDB4OGI4YjhiOGJ1KSk7CisKKyAgICAgIGNvbnN0IHNpemVfdCBfX24gPSBfX2VuZCAtIF9fYmVnaW47CisgICAgICBjb25zdCBzaXplX3QgX19zID0gX01fdi5zaXplKCk7CisgICAgICBjb25zdCBzaXplX3QgX190ID0gKF9fbiA+PSA2MjMpID8gMTEKKwkJICAgICAgIDogKF9fbiA+PSAgNjgpID8gNworCQkgICAgICAgOiAoX19uID49ICAzOSkgPyA1CisJCSAgICAgICA6IChfX24gPj0gICA3KSA/IDMKKwkJICAgICAgIDogKF9fbiAtIDEpIC8gMjsKKyAgICAgIGNvbnN0IHNpemVfdCBfX3AgPSAoX19uIC0gX190KSAvIDI7CisgICAgICBjb25zdCBzaXplX3QgX19xID0gX19wICsgX190OworICAgICAgY29uc3Qgc2l6ZV90IF9fbSA9IHN0ZDo6bWF4KHNpemVfdChfX3MgKyAxKSwgX19uKTsKKworICAgICAgZm9yIChzaXplX3QgX19rID0gMDsgX19rIDwgX19tOyArK19faykKKwl7CisJICBfVHlwZSBfX2FyZyA9IChfX2JlZ2luW19fayAlIF9fbl0KKwkJCSBeIF9fYmVnaW5bKF9fayArIF9fcCkgJSBfX25dCisJCQkgXiBfX2JlZ2luWyhfX2sgLSAxKSAlIF9fbl0pOworCSAgX1R5cGUgX19yMSA9IF9fYXJnIF4gKF9fYXJnID4+IDI3KTsKKwkgIF9fcjEgPSBfX2RldGFpbDo6X19tb2Q8X1R5cGUsCisJCSAgICBfX2RldGFpbDo6X1NoaWZ0PF9UeXBlLCAzMj46Ol9fdmFsdWU+KDE2NjQ1MjV1ICogX19yMSk7CisJICBfVHlwZSBfX3IyID0gX19yMTsKKwkgIGlmIChfX2sgPT0gMCkKKwkgICAgX19yMiArPSBfX3M7CisJICBlbHNlIGlmIChfX2sgPD0gX19zKQorCSAgICBfX3IyICs9IF9fayAlIF9fbiArIF9NX3ZbX19rIC0gMV07CisJICBlbHNlCisJICAgIF9fcjIgKz0gX19rICUgX19uOworCSAgX19yMiA9IF9fZGV0YWlsOjpfX21vZDxfVHlwZSwKKwkgICAgICAgICAgIF9fZGV0YWlsOjpfU2hpZnQ8X1R5cGUsIDMyPjo6X192YWx1ZT4oX19yMik7CisJICBfX2JlZ2luWyhfX2sgKyBfX3ApICUgX19uXSArPSBfX3IxOworCSAgX19iZWdpblsoX19rICsgX19xKSAlIF9fbl0gKz0gX19yMjsKKwkgIF9fYmVnaW5bX19rICUgX19uXSA9IF9fcjI7CisJfQorCisgICAgICBmb3IgKHNpemVfdCBfX2sgPSBfX207IF9fayA8IF9fbSArIF9fbjsgKytfX2spCisJeworCSAgX1R5cGUgX19hcmcgPSAoX19iZWdpbltfX2sgJSBfX25dCisJCQkgKyBfX2JlZ2luWyhfX2sgKyBfX3ApICUgX19uXQorCQkJICsgX19iZWdpblsoX19rIC0gMSkgJSBfX25dKTsKKwkgIF9UeXBlIF9fcjMgPSBfX2FyZyBeIChfX2FyZyA+PiAyNyk7CisJICBfX3IzID0gX19kZXRhaWw6Ol9fbW9kPF9UeXBlLAorCQkgICBfX2RldGFpbDo6X1NoaWZ0PF9UeXBlLCAzMj46Ol9fdmFsdWU+KDE1NjYwODM5NDF1ICogX19yMyk7CisJICBfVHlwZSBfX3I0ID0gX19yMyAtIF9fayAlIF9fbjsKKwkgIF9fcjQgPSBfX2RldGFpbDo6X19tb2Q8X1R5cGUsCisJICAgICAgICAgICBfX2RldGFpbDo6X1NoaWZ0PF9UeXBlLCAzMj46Ol9fdmFsdWU+KF9fcjQpOworCSAgX19iZWdpblsoX19rICsgX19wKSAlIF9fbl0gXj0gX19yMzsKKwkgIF9fYmVnaW5bKF9fayArIF9fcSkgJSBfX25dIF49IF9fcjQ7CisJICBfX2JlZ2luW19fayAlIF9fbl0gPSBfX3I0OworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCBzaXplX3QgX19iaXRzLAorCSAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgIF9SZWFsVHlwZQorICAgIGdlbmVyYXRlX2Nhbm9uaWNhbChfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdCBfX2IKKwk9IHN0ZDo6bWluKHN0YXRpY19jYXN0PHNpemVfdD4oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjpkaWdpdHMpLAorICAgICAgICAgICAgICAgICAgIF9fYml0cyk7CisgICAgICBjb25zdCBsb25nIGRvdWJsZSBfX3IgPSBzdGF0aWNfY2FzdDxsb25nIGRvdWJsZT4oX191cm5nLm1heCgpKQorCQkJICAgIC0gc3RhdGljX2Nhc3Q8bG9uZyBkb3VibGU+KF9fdXJuZy5taW4oKSkgKyAxLjBMOworICAgICAgY29uc3Qgc2l6ZV90IF9fbG9nMnIgPSBzdGQ6OmxvZyhfX3IpIC8gc3RkOjpsb2coMi4wTCk7CisgICAgICBzaXplX3QgX19rID0gc3RkOjptYXg8c2l6ZV90PigxVUwsIChfX2IgKyBfX2xvZzJyIC0gMVVMKSAvIF9fbG9nMnIpOworICAgICAgX1JlYWxUeXBlIF9fc3VtID0gX1JlYWxUeXBlKDApOworICAgICAgX1JlYWxUeXBlIF9fdG1wID0gX1JlYWxUeXBlKDEpOworICAgICAgZm9yICg7IF9fayAhPSAwOyAtLV9faykKKwl7CisJICBfX3N1bSArPSBfUmVhbFR5cGUoX191cm5nKCkgLSBfX3VybmcubWluKCkpICogX190bXA7CisJICBfX3RtcCAqPSBfX3I7CisJfQorICAgICAgcmV0dXJuIF9fc3VtIC8gX190bXA7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JhbmdlX2FjY2Vzcy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JhbmdlX2FjY2Vzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YTc5NTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmFuZ2VfYWNjZXNzLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8vIDxyYW5nZV9hY2Nlc3MuaD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvcmFuZ2VfYWNjZXNzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpdGVyYXRvcn0KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1JBTkdFX0FDQ0VTU19ICisjZGVmaW5lIF9HTElCQ1hYX1JBTkdFX0FDQ0VTU19IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBhbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudCBvZgorICAgKiAgICAgICAgICB0aGUgY29udGFpbmVyLgorICAgKiAgQHBhcmFtICBfX2NvbnQgIENvbnRhaW5lci4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9Db250YWluZXI+CisgICAgaW5saW5lIGF1dG8KKyAgICBiZWdpbihfQ29udGFpbmVyJiBfX2NvbnQpIC0+IGRlY2x0eXBlKF9fY29udC5iZWdpbigpKQorICAgIHsgcmV0dXJuIF9fY29udC5iZWdpbigpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBhbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudCBvZgorICAgKiAgICAgICAgICB0aGUgY29uc3QgY29udGFpbmVyLgorICAgKiAgQHBhcmFtICBfX2NvbnQgIENvbnRhaW5lci4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9Db250YWluZXI+CisgICAgaW5saW5lIGF1dG8KKyAgICBiZWdpbihjb25zdCBfQ29udGFpbmVyJiBfX2NvbnQpIC0+IGRlY2x0eXBlKF9fY29udC5iZWdpbigpKQorICAgIHsgcmV0dXJuIF9fY29udC5iZWdpbigpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBhbiBpdGVyYXRvciBwb2ludGluZyB0byBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50IG9mCisgICAqICAgICAgICAgIHRoZSBjb250YWluZXIuCisgICAqICBAcGFyYW0gIF9fY29udCAgQ29udGFpbmVyLgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgYXV0bworICAgIGVuZChfQ29udGFpbmVyJiBfX2NvbnQpIC0+IGRlY2x0eXBlKF9fY29udC5lbmQoKSkKKyAgICB7IHJldHVybiBfX2NvbnQuZW5kKCk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIG9uZSBwYXN0IHRoZSBsYXN0IGVsZW1lbnQgb2YKKyAgICogICAgICAgICAgdGhlIGNvbnN0IGNvbnRhaW5lci4KKyAgICogIEBwYXJhbSAgX19jb250ICBDb250YWluZXIuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfQ29udGFpbmVyPgorICAgIGlubGluZSBhdXRvCisgICAgZW5kKGNvbnN0IF9Db250YWluZXImIF9fY29udCkgLT4gZGVjbHR5cGUoX19jb250LmVuZCgpKQorICAgIHsgcmV0dXJuIF9fY29udC5lbmQoKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZXR1cm4gYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGFycmF5LgorICAgKiAgQHBhcmFtICBfX2FyciAgQXJyYXkuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVHAsIHNpemVfdCBfTm0+CisgICAgaW5saW5lIF9UcCoKKyAgICBiZWdpbihfVHAgKCZfX2FycilbX05tXSkKKyAgICB7IHJldHVybiBfX2FycjsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZXR1cm4gYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gb25lIHBhc3QgdGhlIGxhc3QgZWxlbWVudAorICAgKiAgICAgICAgICBvZiB0aGUgYXJyYXkuCisgICAqICBAcGFyYW0gIF9fYXJyICBBcnJheS4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9UcCwgc2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgX1RwKgorICAgIGVuZChfVHAgKCZfX2FycilbX05tXSkKKyAgICB7IHJldHVybiBfX2FyciArIF9ObTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy8gX0dMSUJDWFhfUkFOR0VfQUNDRVNTX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yZWdleC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JlZ2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxOTI1YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yZWdleC5oCkBAIC0wLDAgKzEsMjQ4NSBAQAorLy8gY2xhc3MgdGVtcGxhdGUgcmVnZXggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqCisgKiAgQGZpbGUgYml0cy9yZWdleC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7cmVnZXh9CisgKi8KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCByZWdleAorICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogQGJyaWVmIENsYXNzIHJlZ2V4X3RyYWl0cy4gRGVzY3JpYmVzIGFzcGVjdHMgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqCisgICAqIEEgcmVndWxhciBleHByZXNzaW9uIHRyYWl0cyBjbGFzcyB0aGF0IHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnRzIG9mIAorICAgKiBzZWN0aW9uIFsyOC43XS4KKyAgICoKKyAgICogVGhlIGNsYXNzICVyZWdleCBpcyBwYXJhbWV0ZXJpemVkIGFyb3VuZCBhIHNldCBvZiByZWxhdGVkIHR5cGVzIGFuZAorICAgKiBmdW5jdGlvbnMgdXNlZCB0byBjb21wbGV0ZSB0aGUgZGVmaW5pdGlvbiBvZiBpdHMgc2VtYW50aWNzLiAgVGhpcyBjbGFzcworICAgKiBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50cyBvZiBzdWNoIGEgdHJhaXRzIGNsYXNzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3R5cGU+CisgICAgc3RydWN0IHJlZ2V4X3RyYWl0cworICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9DaF90eXBlICAgICAgICAgICAgICAgICAgICAgCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19zdHJpbmc8Y2hhcl90eXBlPiAJc3RyaW5nX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6bG9jYWxlICAgICAgICAgICAgICAgICAgCWxvY2FsZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmN0eXBlX2Jhc2U6Om1hc2sgICAgICAgIAljaGFyX2NsYXNzX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgZGVmYXVsdCB0cmFpdHMgb2JqZWN0LgorICAgICAgICovCisgICAgICByZWdleF90cmFpdHMoKSB7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2l2ZXMgdGhlIGxlbmd0aCBvZiBhIEMtc3R5bGUgc3RyaW5nIHN0YXJ0aW5nIGF0IEBwIF9fcC4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19wIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgYSBjaGFyYWN0ZXIgc2VxdWVuY2UuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGJldHdlZW4gQHAgKl9fcCBhbmQgdGhlIGZpcnN0CisgICAgICAgKiBkZWZhdWx0LWluaXRpYWxpemVkIHZhbHVlIG9mIHR5cGUgQHAgY2hhcl90eXBlLiAgSW4gb3RoZXIgd29yZHMsIHVzZXMKKyAgICAgICAqIHRoZSBDLXN0cmluZyBhbGdvcml0aG0gZm9yIGRldGVybWluaW5nIHRoZSBsZW5ndGggb2YgYSBzZXF1ZW5jZSBvZgorICAgICAgICogY2hhcmFjdGVycy4KKyAgICAgICAqLworICAgICAgc3RhdGljIHN0ZDo6c2l6ZV90CisgICAgICBsZW5ndGgoY29uc3QgY2hhcl90eXBlKiBfX3ApCisgICAgICB7IHJldHVybiBzdHJpbmdfdHlwZTo6dHJhaXRzX3R5cGU6Omxlbmd0aChfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFBlcmZvcm1zIHRoZSBpZGVudGl0eSB0cmFuc2xhdGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19jIEEgY2hhcmFjdGVyIHRvIHRoZSBsb2NhbGUtc3BlY2lmaWMgY2hhcmFjdGVyIHNldC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBfX2MuCisgICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZQorICAgICAgdHJhbnNsYXRlKGNoYXJfdHlwZSBfX2MpIGNvbnN0CisgICAgICB7IHJldHVybiBfX2M7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgVHJhbnNsYXRlcyBhIGNoYXJhY3RlciBpbnRvIGEgY2FzZS1pbnNlbnNpdGl2ZSBlcXVpdmFsZW50LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2MgQSBjaGFyYWN0ZXIgdG8gdGhlIGxvY2FsZS1zcGVjaWZpYyBjaGFyYWN0ZXIgc2V0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgbG93ZXItY2FzZSBlcXVpdmFsZW50IG9mIF9fYy4KKyAgICAgICAqIEB0aHJvd3Mgc3RkOjpiYWRfY2FzdCBpZiB0aGUgaW1idWVkIGxvY2FsZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjdHlwZQorICAgICAgICogICAgICAgICBmYWNldC4KKyAgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICB0cmFuc2xhdGVfbm9jYXNlKGNoYXJfdHlwZSBfX2MpIGNvbnN0CisgICAgICB7IAorCXR5cGVkZWYgc3RkOjpjdHlwZTxjaGFyX3R5cGU+IF9fY3R5cGVfdHlwZTsKKwljb25zdCBfX2N0eXBlX3R5cGUmIF9fZmN0eXAodXNlX2ZhY2V0PF9fY3R5cGVfdHlwZT4oX01fbG9jYWxlKSk7CisJcmV0dXJuIF9fZmN0eXAudG9sb3dlcihfX2MpOyAKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhIHNvcnQga2V5IGZvciBhIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19maXJzdCBiZWdpbm5pbmcgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgICAqIEBwYXJhbSBfX2xhc3QgIG9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiBSZXR1cm5zIGEgc29ydCBrZXkgZm9yIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgZGVzaWduYXRlZCBieSB0aGUKKyAgICAgICAqIGl0ZXJhdG9yIHJhbmdlIFtGMSwgRjIpIHN1Y2ggdGhhdCBpZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIFtHMSwgRzIpCisgICAgICAgKiBzb3J0cyBiZWZvcmUgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBbSDEsIEgyKSB0aGVuCisgICAgICAgKiB2LnRyYW5zZm9ybShHMSwgRzIpIDwgdi50cmFuc2Zvcm0oSDEsIEgyKS4KKyAgICAgICAqCisgICAgICAgKiBXaGF0IHRoaXMgcmVhbGx5IGRvZXMgaXMgcHJvdmlkZSBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBjb21wYXJlIGEKKyAgICAgICAqIHN0cmluZyB0byBtdWx0aXBsZSBvdGhlciBzdHJpbmdzIGluIGxvY2FsZXMgd2l0aCBmYW5jeSBjb2xsYXRpb24KKyAgICAgICAqIHJ1bGVzIGFuZCBlcXVpdmFsZW5jZSBjbGFzc2VzLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIGEgbG9jYWxlLXNwZWNpZmljIHNvcnQga2V5IGVxdWl2YWxlbnQgdG8gdGhlIGlucHV0IHJhbmdlLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3Mgc3RkOjpiYWRfY2FzdCBpZiB0aGUgY3VycmVudCBsb2NhbGUgZG9lcyBub3QgaGF2ZSBhIGNvbGxhdGUKKyAgICAgICAqICAgICAgICAgZmFjZXQuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gd2RfaXRlcj4KKyAgICAgICAgc3RyaW5nX3R5cGUKKyAgICAgICAgdHJhbnNmb3JtKF9Gd2RfaXRlciBfX2ZpcnN0LCBfRndkX2l0ZXIgX19sYXN0KSBjb25zdAorICAgICAgICB7CisJICB0eXBlZGVmIHN0ZDo6Y29sbGF0ZTxjaGFyX3R5cGU+IF9fY29sbGF0ZV90eXBlOworCSAgY29uc3QgX19jb2xsYXRlX3R5cGUmIF9fZmNsdCh1c2VfZmFjZXQ8X19jb2xsYXRlX3R5cGU+KF9NX2xvY2FsZSkpOworCSAgc3RyaW5nX3R5cGUgX19zKF9fZmlyc3QsIF9fbGFzdCk7CisJICByZXR1cm4gX19mY2x0LnRyYW5zZm9ybShfX3MuZGF0YSgpLCBfX3MuZGF0YSgpICsgX19zLnNpemUoKSk7CisJfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGEgc29ydCBrZXkgZm9yIGEgY2hhcmFjdGVyIHNlcXVlbmNlLCBpbmRlcGVuZGVudCBvZiBjYXNlLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2ZpcnN0IGJlZ2lubmluZyBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgICAgICogQHBhcmFtIF9fbGFzdCAgb25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqIEVmZmVjdHM6IGlmIHR5cGVpZCh1c2VfZmFjZXQ8Y29sbGF0ZTxfQ2hfdHlwZT4gPikgPT0KKyAgICAgICAqIHR5cGVpZChjb2xsYXRlX2J5bmFtZTxfQ2hfdHlwZT4pIGFuZCB0aGUgZm9ybSBvZiB0aGUgc29ydCBrZXkKKyAgICAgICAqIHJldHVybmVkIGJ5IGNvbGxhdGVfYnluYW1lPF9DaF90eXBlPjo6dHJhbnNmb3JtKF9fZmlyc3QsIF9fbGFzdCkgCisgICAgICAgKiBpcyBrbm93biBhbmQgY2FuIGJlIGNvbnZlcnRlZCBpbnRvIGEgcHJpbWFyeSBzb3J0IGtleQorICAgICAgICogdGhlbiByZXR1cm5zIHRoYXQga2V5LCBvdGhlcndpc2UgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gd2RfaXRlcj4KKyAgICAgICAgc3RyaW5nX3R5cGUKKyAgICAgICAgdHJhbnNmb3JtX3ByaW1hcnkoX0Z3ZF9pdGVyIF9fZmlyc3QsIF9Gd2RfaXRlciBfX2xhc3QpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIHN0cmluZ190eXBlKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhIGNvbGxhdGlvbiBlbGVtZW50IGJ5IG5hbWUuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fZmlyc3QgYmVnaW5uaW5nIG9mIHRoZSBjb2xsYXRpb24gZWxlbWVudCBuYW1lLgorICAgICAgICogQHBhcmFtIF9fbGFzdCAgb25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgY29sbGF0aW9uIGVsZW1lbnQgbmFtZS4KKyAgICAgICAqIAorICAgICAgICogQHJldHVybnMgYSBzZXF1ZW5jZSBvZiBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIHRoYXQgcmVwcmVzZW50cyB0aGUKKyAgICAgICAqIGNvbGxhdGluZyBlbGVtZW50IGNvbnNpc3Rpbmcgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBkZXNpZ25hdGVkIGJ5CisgICAgICAgKiB0aGUgaXRlcmF0b3IgcmFuZ2UgW19fZmlyc3QsIF9fbGFzdCkuIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZQorICAgICAgICogY2hhcmFjdGVyIHNlcXVlbmNlIGlzIG5vdCBhIHZhbGlkIGNvbGxhdGluZyBlbGVtZW50LgorICAgICAgICoKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRndkX2l0ZXI+CisgICAgICAgIHN0cmluZ190eXBlCisgICAgICAgIGxvb2t1cF9jb2xsYXRlbmFtZShfRndkX2l0ZXIgX19maXJzdCwgX0Z3ZF9pdGVyIF9fbGFzdCkgY29uc3QKKyAgICAgICAgeyByZXR1cm4gc3RyaW5nX3R5cGUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBNYXBzIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgdG8gYSBuYW1lZCBjaGFyYWN0ZXIKKyAgICAgICAqICAgICAgICBjbGFzc2lmaWNhdGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19maXJzdCBiZWdpbm5pbmcgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgICAqIEBwYXJhbSBfX2xhc3QgIG9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgICAqIEBwYXJhbSBfX2ljYXNlIGlnbm9yZXMgdGhlIGNhc2Ugb2YgdGhlIGNsYXNzaWZpY2F0aW9uIG5hbWUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgYW4gdW5zcGVjaWZpZWQgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBjaGFyYWN0ZXIKKyAgICAgICAqIGNsYXNzaWZpY2F0aW9uIG5hbWVkIGJ5IHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgZGVzaWduYXRlZCBieQorICAgICAgICogdGhlIGl0ZXJhdG9yIHJhbmdlIFtfX2ZpcnN0LCBfX2xhc3QpLiBJZiBAcCBpY2FzZSBpcyB0cnVlLAorICAgICAgICogdGhlIHJldHVybmVkIG1hc2sgaWRlbnRpZmllcyB0aGUgY2xhc3NpZmljYXRpb24gcmVnYXJkbGVzcyBvZgorICAgICAgICogdGhlIGNhc2Ugb2YgdGhlIGNoYXJhY3RlcnMgdG8gYmUgbWF0Y2hlZCAoZm9yIGV4YW1wbGUsCisgICAgICAgKiBbWzpsb3dlcjpdXSBpcyB0aGUgc2FtZSBhcyBbWzphbHBoYTpdXSksIG90aGVyd2lzZSBhCisgICAgICAgKiBjYXNlLWRlcGVuZGVudCBjbGFzc2lmaWNhdGlvbiBpcyByZXR1cm5lZC4gIFRoZSB2YWx1ZQorICAgICAgICogcmV0dXJuZWQgc2hhbGwgYmUgaW5kZXBlbmRlbnQgb2YgdGhlIGNhc2Ugb2YgdGhlIGNoYXJhY3RlcnMKKyAgICAgICAqIGluIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UuIElmIHRoZSBuYW1lIGlzIG5vdCByZWNvZ25pemVkIHRoZW4KKyAgICAgICAqIHJldHVybnMgYSB2YWx1ZSB0aGF0IGNvbXBhcmVzIGVxdWFsIHRvIDAuCisgICAgICAgKgorICAgICAgICogQXQgbGVhc3QgdGhlIGZvbGxvd2luZyBuYW1lcyAob3IgdGhlaXIgd2lkZS1jaGFyYWN0ZXIgZXF1aXZhbGVudCkgYXJlCisgICAgICAgKiBzdXBwb3J0ZWQuCisgICAgICAgKiAtIGQKKyAgICAgICAqIC0gdworICAgICAgICogLSBzCisgICAgICAgKiAtIGFsbnVtCisgICAgICAgKiAtIGFscGhhCisgICAgICAgKiAtIGJsYW5rCisgICAgICAgKiAtIGNudHJsCisgICAgICAgKiAtIGRpZ2l0CisgICAgICAgKiAtIGdyYXBoCisgICAgICAgKiAtIGxvd2VyCisgICAgICAgKiAtIHByaW50CisgICAgICAgKiAtIHB1bmN0CisgICAgICAgKiAtIHNwYWNlCisgICAgICAgKiAtIHVwcGVyCisgICAgICAgKiAtIHhkaWdpdAorICAgICAgICoKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRndkX2l0ZXI+CisgICAgICAgIGNoYXJfY2xhc3NfdHlwZQorICAgICAgICBsb29rdXBfY2xhc3NuYW1lKF9Gd2RfaXRlciBfX2ZpcnN0LCBfRndkX2l0ZXIgX19sYXN0LAorCSAgICAgICAgICAgICAgICAgYm9vbCBfX2ljYXNlID0gZmFsc2UpIGNvbnN0CisJeyByZXR1cm4gMDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBEZXRlcm1pbmVzIGlmIEBwIGMgaXMgYSBtZW1iZXIgb2YgYW4gaWRlbnRpZmllZCBjbGFzcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19jIGEgY2hhcmFjdGVyLgorICAgICAgICogQHBhcmFtIF9fZiBhIGNsYXNzIHR5cGUgKGFzIHJldHVybmVkIGZyb20gbG9va3VwX2NsYXNzbmFtZSkuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIEBwIF9fYyBpcyBhIG1lbWJlciBvZiB0aGUgY2xhc3NpZmljYXRpb24KKyAgICAgICAqIHJlcHJlc2VudGVkIGJ5IEBwIF9fZiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3Mgc3RkOjpiYWRfY2FzdCBpZiB0aGUgY3VycmVudCBsb2NhbGUgZG9lcyBub3QgaGF2ZSBhIGN0eXBlCisgICAgICAgKiAgICAgICAgIGZhY2V0LgorICAgICAgICovCisgICAgICBib29sCisgICAgICBpc2N0eXBlKF9DaF90eXBlIF9fYywgY2hhcl9jbGFzc190eXBlIF9fZikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnZlcnRzIGEgZGlnaXQgdG8gYW4gaW50LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2NoICAgIGEgY2hhcmFjdGVyIHJlcHJlc2VudGluZyBhIGRpZ2l0LgorICAgICAgICogQHBhcmFtIF9fcmFkaXggdGhlIHJhZGl4IGlmIHRoZSBudW1lcmljIGNvbnZlcnNpb24gKGxpbWl0ZWQgdG8gOCwgMTAsCisgICAgICAgKiAgICAgICAgICAgICAgb3IgMTYpLgorICAgICAgICogCisgICAgICAgKiBAcmV0dXJucyB0aGUgdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlIGRpZ2l0IF9fY2ggaW4gYmFzZSByYWRpeCBpZiB0aGUKKyAgICAgICAqIGNoYXJhY3RlciBfX2NoIGlzIGEgdmFsaWQgZGlnaXQgaW4gYmFzZSByYWRpeDsgb3RoZXJ3aXNlIHJldHVybnMgLTEuCisgICAgICAgKi8KKyAgICAgIGludAorICAgICAgdmFsdWUoX0NoX3R5cGUgX19jaCwgaW50IF9fcmFkaXgpIGNvbnN0OworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbWJ1ZXMgdGhlIHJlZ2V4X3RyYWl0cyBvYmplY3Qgd2l0aCBhIGNvcHkgb2YgYSBuZXcgbG9jYWxlLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2xvYyBBIGxvY2FsZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBhIGNvcHkgb2YgdGhlIHByZXZpb3VzIGxvY2FsZSBpbiB1c2UgYnkgdGhlIHJlZ2V4X3RyYWl0cworICAgICAgICogICAgICAgICAgb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEBub3RlIENhbGxpbmcgaW1idWUgd2l0aCBhIGRpZmZlcmVudCBsb2NhbGUgdGhhbiB0aGUgb25lIGN1cnJlbnRseSBpbgorICAgICAgICogICAgICAgdXNlIGludmFsaWRhdGVzIGFsbCBjYWNoZWQgZGF0YSBoZWxkIGJ5ICp0aGlzLgorICAgICAgICovCisgICAgICBsb2NhbGVfdHlwZQorICAgICAgaW1idWUobG9jYWxlX3R5cGUgX19sb2MpCisgICAgICB7CisJc3RkOjpzd2FwKF9NX2xvY2FsZSwgX19sb2MpOworCXJldHVybiBfX2xvYzsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgbG9jYWxlIGluIHVzZSBieSB0aGUgcmVnZXhfdHJhaXRzCisgICAgICAgKiBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGxvY2FsZV90eXBlCisgICAgICBnZXRsb2MoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbG9jYWxlOyB9CisgICAgICAKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBsb2NhbGVfdHlwZSBfTV9sb2NhbGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZT4KKyAgICBib29sCisgICAgcmVnZXhfdHJhaXRzPF9DaF90eXBlPjo6CisgICAgaXNjdHlwZShfQ2hfdHlwZSBfX2MsIGNoYXJfY2xhc3NfdHlwZSBfX2YpIGNvbnN0CisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmN0eXBlPGNoYXJfdHlwZT4gX19jdHlwZV90eXBlOworICAgICAgY29uc3QgX19jdHlwZV90eXBlJiBfX2ZjdHlwKHVzZV9mYWNldDxfX2N0eXBlX3R5cGU+KF9NX2xvY2FsZSkpOworICAgICAgCisgICAgICBpZiAoX19mY3R5cC5pcyhfX2YsIF9fYykpCisJcmV0dXJuIHRydWU7CisgICAgICAKKyAgICAgIC8vIHNwZWNpYWwgY2FzZSBvZiB1bmRlcnNjb3JlIGluIFtbOnc6XV0KKyAgICAgIGlmIChfX2MgPT0gX19mY3R5cC53aWRlbignXycpKQorCXsKKwkgIGNvbnN0IGNoYXIgX193YltdID0gInciOworCSAgY2hhcl9jbGFzc190eXBlIF9fd3QgPSB0aGlzLT5sb29rdXBfY2xhc3NuYW1lKF9fd2IsCisJCQkJCQkJX193YiArIHNpemVvZihfX3diKSk7CisJICBpZiAoX19mIHwgX193dCkKKwkgICAgcmV0dXJuIHRydWU7CisJfQorICAgIAorICAgICAgLy8gc3BlY2lhbCBjYXNlIG9mIFtbOnNwYWNlOl1dIGluIFtbOmJsYW5rOl1dCisgICAgICBpZiAoX19mY3R5cC5pcyhzdGQ6OmN0eXBlX2Jhc2U6OnNwYWNlLCBfX2MpKQorCXsKKwkgIGNvbnN0IGNoYXIgX19iYltdID0gImJsYW5rIjsKKwkgIGNoYXJfY2xhc3NfdHlwZSBfX2J0ID0gdGhpcy0+bG9va3VwX2NsYXNzbmFtZShfX2JiLAorCQkJCQkJCV9fYmIgKyBzaXplb2YoX19iYikpOworCSAgaWYgKF9fZiB8IF9fYnQpCisJICAgIHJldHVybiB0cnVlOworCX0KKyAgICAgIAorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZT4KKyAgICBpbnQKKyAgICByZWdleF90cmFpdHM8X0NoX3R5cGU+OjoKKyAgICB2YWx1ZShfQ2hfdHlwZSBfX2NoLCBpbnQgX19yYWRpeCkgY29uc3QKKyAgICB7CisgICAgICBzdGQ6OmJhc2ljX2lzdHJpbmdzdHJlYW08Y2hhcl90eXBlPiBfX2lzKHN0cmluZ190eXBlKDEsIF9fY2gpKTsKKyAgICAgIGludCBfX3Y7CisgICAgICBpZiAoX19yYWRpeCA9PSA4KQorCV9faXMgPj4gc3RkOjpvY3Q7CisgICAgICBlbHNlIGlmIChfX3JhZGl4ID09IDE2KQorCV9faXMgPj4gc3RkOjpoZXg7CisgICAgICBfX2lzID4+IF9fdjsKKyAgICAgIHJldHVybiBfX2lzLmZhaWwoKSA/IC0xIDogX192OworICAgIH0KKworICAvLyBbNy44XSBDbGFzcyBiYXNpY19yZWdleAorICAvKioKKyAgICogT2JqZWN0cyBvZiBzcGVjaWFsaXphdGlvbnMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgcmVndWxhciBleHByZXNzaW9ucworICAgKiBjb25zdHJ1Y3RlZCBmcm9tIHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXIgdHlwZSBAcCBfQ2hfdHlwZS4KKyAgICoKKyAgICogU3RvcmFnZSBmb3IgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBhbGxvY2F0ZWQgYW5kIGRlYWxsb2NhdGVkIGFzCisgICAqIG5lY2Vzc2FyeSBieSB0aGUgbWVtYmVyIGZ1bmN0aW9ucyBvZiB0aGlzIGNsYXNzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHMgPSByZWdleF90cmFpdHM8X0NoX3R5cGU+ID4KKyAgICBjbGFzcyBiYXNpY19yZWdleAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlczoKKyAgICAgIHR5cGVkZWYgX0NoX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1J4X3RyYWl0cyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpzdHJpbmdfdHlwZSAgIHN0cmluZ190eXBlOworICAgICAgdHlwZWRlZiByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBmbGFnX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpsb2NhbGVfdHlwZSAgIGxvY2FsZV90eXBlOworCisgICAgICAvKioKKyAgICAgICAqIEBuYW1lIENvbnN0YW50cworICAgICAgICogc3RkIFsyOC44LjFdKDEpCisgICAgICAgKi8KKyAgICAgIC8vQHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgZmxhZ190eXBlIGljYXNlID0gcmVnZXhfY29uc3RhbnRzOjppY2FzZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgZmxhZ190eXBlIG5vc3VicyA9IHJlZ2V4X2NvbnN0YW50czo6bm9zdWJzOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBmbGFnX3R5cGUgb3B0aW1pemUgPSByZWdleF9jb25zdGFudHM6Om9wdGltaXplOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBmbGFnX3R5cGUgY29sbGF0ZSA9IHJlZ2V4X2NvbnN0YW50czo6Y29sbGF0ZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgZmxhZ190eXBlIEVDTUFTY3JpcHQgPSByZWdleF9jb25zdGFudHM6OkVDTUFTY3JpcHQ7CisgICAgICBzdGF0aWMgY29uc3RleHByIGZsYWdfdHlwZSBiYXNpYyA9IHJlZ2V4X2NvbnN0YW50czo6YmFzaWM7CisgICAgICBzdGF0aWMgY29uc3RleHByIGZsYWdfdHlwZSBleHRlbmRlZCA9IHJlZ2V4X2NvbnN0YW50czo6ZXh0ZW5kZWQ7CisgICAgICBzdGF0aWMgY29uc3RleHByIGZsYWdfdHlwZSBhd2sgPSByZWdleF9jb25zdGFudHM6OmF3azsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgZmxhZ190eXBlIGdyZXAgPSByZWdleF9jb25zdGFudHM6OmdyZXA7CisgICAgICBzdGF0aWMgY29uc3RleHByIGZsYWdfdHlwZSBlZ3JlcCA9IHJlZ2V4X2NvbnN0YW50czo6ZWdyZXA7CisgICAgICAvL0B9CisKKyAgICAgIC8vIFs3LjguMl0gY29uc3RydWN0L2NvcHkvZGVzdHJveQorICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uIHRoYXQgZG9lcyBub3QgbWF0Y2ggYW55CisgICAgICAgKiBjaGFyYWN0ZXIgc2VxdWVuY2UuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4KCkKKyAgICAgIDogX01fZmxhZ3MoRUNNQVNjcmlwdCksCisgICAgICAgIF9NX2F1dG9tYXRvbihfX2RldGFpbDo6X19jb21waWxlPGNvbnN0IF9DaF90eXBlKiwgX1J4X3RyYWl0cz4oMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgIF9NX3RyYWl0cywgX01fZmxhZ3MpKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSB0aGUKKyAgICAgICAqIHNlcXVlbmNlIFtfX3AsIF9fcCArIGNoYXJfdHJhaXRzPF9DaF90eXBlPjo6bGVuZ3RoKF9fcCkpCisgICAgICAgKiBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gdGhlIGZsYWdzIGluIEBwIF9fZi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19wIEEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgYSBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcKKyAgICAgICAqICAgICAgICAgIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gX19mIEZsYWdzIGluZGljYXRpbmcgdGhlIHN5bnRheCBydWxlcyBhbmQgb3B0aW9ucy4KKyAgICAgICAqCisgICAgICAgKiBAdGhyb3dzIHJlZ2V4X2Vycm9yIGlmIEBwIF9fcCBpcyBub3QgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19yZWdleChjb25zdCBfQ2hfdHlwZSogX19wLCBmbGFnX3R5cGUgX19mID0gRUNNQVNjcmlwdCkKKyAgICAgIDogX01fZmxhZ3MoX19mKSwKKyAgICAgICAgX01fYXV0b21hdG9uKF9fZGV0YWlsOjpfX2NvbXBpbGUoX19wLCBfX3AgKyBfUnhfdHJhaXRzOjpsZW5ndGgoX19wKSwKKyAgICAgICAgCQkJCV9NX3RyYWl0cywgX01fZmxhZ3MpKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSB0aGUgc2VxdWVuY2UKKyAgICAgICAqIFtwLCBwICsgbGVuKSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gdGhlIGZsYWdzIGluIEBwIGYuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcCAgIEEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgYSBzdHJpbmcgY29udGFpbmluZyBhIHJlZ3VsYXIKKyAgICAgICAqICAgICAgICAgICAgICBleHByZXNzaW9uLgorICAgICAgICogQHBhcmFtIF9fbGVuIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSByZWd1bGFyCisgICAgICAgKiAgICAgICAgICAgICAgZXhwcmVzc2lvbi4KKyAgICAgICAqIEBwYXJhbSBfX2YgICBGbGFncyBpbmRpY2F0aW5nIHRoZSBzeW50YXggcnVsZXMgYW5kIG9wdGlvbnMuCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBAcCBfX3AgaXMgbm90IGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleChjb25zdCBfQ2hfdHlwZSogX19wLCBzdGQ6OnNpemVfdCBfX2xlbiwgZmxhZ190eXBlIF9fZikKKyAgICAgIDogX01fZmxhZ3MoX19mKSwKKyAgICAgICAgX01fYXV0b21hdG9uKF9fZGV0YWlsOjpfX2NvbXBpbGUoX19wLCBfX3AgKyBfX2xlbiwgX01fdHJhaXRzLCBfTV9mbGFncykpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29weS1jb25zdHJ1Y3RzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX3JocyBBIEBwIHJlZ2V4IG9iamVjdC4KKyAgICAgICAqLworICAgICAgYmFzaWNfcmVnZXgoY29uc3QgYmFzaWNfcmVnZXgmIF9fcmhzKQorICAgICAgOiBfTV9mbGFncyhfX3Jocy5fTV9mbGFncyksIF9NX3RyYWl0cyhfX3Jocy5fTV90cmFpdHMpLAorICAgICAgICBfTV9hdXRvbWF0b24oX19yaHMuX01fYXV0b21hdG9uKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIE1vdmUtY29uc3RydWN0cyBhIGJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19yaHMgQSBAcCByZWdleCBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4KGNvbnN0IGJhc2ljX3JlZ2V4JiYgX19yaHMpIG5vZXhjZXB0CisgICAgICA6IF9NX2ZsYWdzKF9fcmhzLl9NX2ZsYWdzKSwgX01fdHJhaXRzKF9fcmhzLl9NX3RyYWl0cyksCisgICAgICAgIF9NX2F1dG9tYXRvbihzdGQ6Om1vdmUoX19yaHMuX01fYXV0b21hdG9uKSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIHN0cmluZworICAgICAgICogQHAgcyBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gdGhlIGZsYWdzIGluIEBwIGYuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcyBBIHN0cmluZyBjb250YWluaW5nIGEgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICogQHBhcmFtIF9fZiBGbGFncyBpbmRpY2F0aW5nIHRoZSBzeW50YXggcnVsZXMgYW5kIG9wdGlvbnMuCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBAcCBfX3MgaXMgbm90IGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2M+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIGJhc2ljX3JlZ2V4KGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPF9DaF90eXBlLCBfQ2hfdHJhaXRzLCAKKwkJCQkJICAgIF9DaF9hbGxvYz4mIF9fcywKKwkJICAgIGZsYWdfdHlwZSBfX2YgPSBFQ01BU2NyaXB0KQorCTogX01fZmxhZ3MoX19mKSwKKwkgIF9NX2F1dG9tYXRvbihfX2RldGFpbDo6X19jb21waWxlKF9fcy5iZWdpbigpLCBfX3MuZW5kKCksCisJICAJCQkJICBfTV90cmFpdHMsIF9NX2ZsYWdzKSkKKyAgICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSB0aGUgcmFuZ2UKKyAgICAgICAqIFtmaXJzdCwgbGFzdCkgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBmbGFncyBpbiBAcCBmLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2ZpcnN0IFRoZSBzdGFydCBvZiBhIHJhbmdlIGNvbnRhaW5pbmcgYSB2YWxpZCByZWd1bGFyCisgICAgICAgKiAgICAgICAgICAgICAgICBleHByZXNzaW9uLgorICAgICAgICogQHBhcmFtIF9fbGFzdCAgVGhlIGVuZCBvZiBhIHJhbmdlIGNvbnRhaW5pbmcgYSB2YWxpZCByZWd1bGFyCisgICAgICAgKiAgICAgICAgICAgICAgICBleHByZXNzaW9uLgorICAgICAgICogQHBhcmFtIF9fZiAgICAgVGhlIGZvcm1hdCBmbGFncyBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgcmVnZXhfZXJyb3IgaWYgQHAgW19fZmlyc3QsIF9fbGFzdCkgaXMgbm90IGEgdmFsaWQgcmVndWxhcgorICAgICAgICogICAgICAgICBleHByZXNzaW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgYmFzaWNfcmVnZXgoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCAKKwkJICAgIGZsYWdfdHlwZSBfX2YgPSBFQ01BU2NyaXB0KQorCTogX01fZmxhZ3MoX19mKSwKKwkgIF9NX2F1dG9tYXRvbihfX2RldGFpbDo6X19jb21waWxlKF9fZmlyc3QsIF9fbGFzdCwgX01fdHJhaXRzLCBfTV9mbGFncykpCisgICAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uIGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19sICBUaGUgaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICAgICAqIEBwYXJhbSBfX2YgIFRoZSBmb3JtYXQgZmxhZ3Mgb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqCisgICAgICAgKiBAdGhyb3dzIHJlZ2V4X2Vycm9yIGlmIEBwIF9fbCBpcyBub3QgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4KGluaXRpYWxpemVyX2xpc3Q8X0NoX3R5cGU+IF9fbCwKKwkJICBmbGFnX3R5cGUgX19mID0gRUNNQVNjcmlwdCkKKyAgICAgIDogX01fZmxhZ3MoX19mKSwKKyAgICAgICAgX01fYXV0b21hdG9uKF9fZGV0YWlsOjpfX2NvbXBpbGUoX19sLmJlZ2luKCksIF9fbC5lbmQoKSwKKyAgICAgICAgCQkJCV9NX3RyYWl0cywgX01fZmxhZ3MpKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIERlc3Ryb3lzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICovCisgICAgICB+YmFzaWNfcmVnZXgoKQorICAgICAgeyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEFzc2lnbnMgb25lIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBhbm90aGVyLgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBiYXNpY19yZWdleCYgX19yaHMpCisgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oX19yaHMpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIE1vdmUtYXNzaWducyBvbmUgcmVndWxhciBleHByZXNzaW9uIHRvIGFub3RoZXIuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgb3BlcmF0b3I9KGJhc2ljX3JlZ2V4JiYgX19yaHMpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oc3RkOjptb3ZlKF9fcmhzKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVwbGFjZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCBhIG5ldyBvbmUgY29uc3RydWN0ZWQgZnJvbQorICAgICAgICogYSBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcCBBIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGEgbnVsbC10ZXJtaW5hdGVkIEMtc3R5bGUgc3RyaW5nCisgICAgICAgKiAgICAgICAgY29udGFpbmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqLworICAgICAgYmFzaWNfcmVnZXgmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX0NoX3R5cGUqIF9fcCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihfX3AsIGZsYWdzKCkpOyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlcGxhY2VzIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGggYSBuZXcgb25lIGNvbnN0cnVjdGVkIGZyb20KKyAgICAgICAqIGEgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX3MgQSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgICAgYmFzaWNfcmVnZXgmCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBiYXNpY19zdHJpbmc8X0NoX3R5cGUsIF9DaF90eXBlcmFpdHMsIF9BbGxvYz4mIF9fcykKKyAgICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKF9fcywgZmxhZ3MoKSk7IH0KKworICAgICAgLy8gWzcuOC4zXSBhc3NpZ24KKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIHRoZSByZWFsIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgcmVndWxhciBleHByZXNzaW9uIG9iamVjdC4KKyAgICAgICAqLworICAgICAgYmFzaWNfcmVnZXgmCisgICAgICBhc3NpZ24oY29uc3QgYmFzaWNfcmVnZXgmIF9fcmhzKQorICAgICAgeworCWJhc2ljX3JlZ2V4IF9fdG1wKF9fcmhzKTsKKwl0aGlzLT5zd2FwKF9fdG1wKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFRoZSBtb3ZlLWFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgcmVndWxhciBleHByZXNzaW9uIG9iamVjdC4KKyAgICAgICAqLworICAgICAgYmFzaWNfcmVnZXgmCisgICAgICBhc3NpZ24oYmFzaWNfcmVnZXgmJiBfX3Jocykgbm9leGNlcHQKKyAgICAgIHsKKwliYXNpY19yZWdleCBfX3RtcChzdGQ6Om1vdmUoX19yaHMpKTsKKwl0aGlzLT5zd2FwKF9fdG1wKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEFzc2lnbnMgYSBuZXcgcmVndWxhciBleHByZXNzaW9uIHRvIGEgcmVnZXggb2JqZWN0IGZyb20gYQorICAgICAgICogQy1zdHlsZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAqIHBhdHRlcm4uCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcCAgICAgQSBwb2ludGVyIHRvIGEgQy1zdHlsZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcKKyAgICAgICAqICAgICAgICAgICAgICBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgorICAgICAgICogQHBhcmFtIF9fZmxhZ3MgU3ludGF4IG9wdGlvbiBmbGFncy4KKyAgICAgICAqCisgICAgICAgKiBAdGhyb3dzIHJlZ2V4X2Vycm9yIGlmIF9fcCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgcmVndWxhcgorICAgICAgICogZXhwcmVzc2lvbiBwYXR0ZXJuIGludGVycHJldGVkIGFjY29yZGluZyB0byBAcCBfX2ZsYWdzLiAgSWYKKyAgICAgICAqIHJlZ2V4X2Vycm9yIGlzIHRocm93biwgKnRoaXMgcmVtYWlucyB1bmNoYW5nZWQuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgYXNzaWduKGNvbnN0IF9DaF90eXBlKiBfX3AsIGZsYWdfdHlwZSBfX2ZsYWdzID0gRUNNQVNjcmlwdCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihzdHJpbmdfdHlwZShfX3ApLCBfX2ZsYWdzKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBBc3NpZ25zIGEgbmV3IHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBhIHJlZ2V4IG9iamVjdCBmcm9tIGEKKyAgICAgICAqIEMtc3R5bGUgc3RyaW5nIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19wICAgICBBIHBvaW50ZXIgdG8gYSBDLXN0eWxlIHN0cmluZyBjb250YWluaW5nIGEKKyAgICAgICAqICAgICAgICAgICAgICAgIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgorICAgICAgICogQHBhcmFtIF9fbGVuICAgVGhlIGxlbmd0aCBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gc3RyaW5nLgorICAgICAgICogQHBhcmFtIF9fZmxhZ3MgU3ludGF4IG9wdGlvbiBmbGFncy4KKyAgICAgICAqCisgICAgICAgKiBAdGhyb3dzIHJlZ2V4X2Vycm9yIGlmIHAgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIHJlZ3VsYXIKKyAgICAgICAqIGV4cHJlc3Npb24gcGF0dGVybiBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gQHAgX19mbGFncy4gIElmCisgICAgICAgKiByZWdleF9lcnJvciBpcyB0aHJvd24sICp0aGlzIHJlbWFpbnMgdW5jaGFuZ2VkLgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleCYKKyAgICAgIGFzc2lnbihjb25zdCBfQ2hfdHlwZSogX19wLCBzdGQ6OnNpemVfdCBfX2xlbiwgZmxhZ190eXBlIF9fZmxhZ3MpCisgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oc3RyaW5nX3R5cGUoX19wLCBfX2xlbiksIF9fZmxhZ3MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEFzc2lnbnMgYSBuZXcgcmVndWxhciBleHByZXNzaW9uIHRvIGEgcmVnZXggb2JqZWN0IGZyb20gYSAKKyAgICAgICAqIHN0cmluZyBjb250YWluaW5nIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcyAgICAgQSBzdHJpbmcgY29udGFpbmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgorICAgICAgICogQHBhcmFtIF9fZmxhZ3MgU3ludGF4IG9wdGlvbiBmbGFncy4KKyAgICAgICAqCisgICAgICAgKiBAdGhyb3dzIHJlZ2V4X2Vycm9yIGlmIF9fcyBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgcmVndWxhcgorICAgICAgICogZXhwcmVzc2lvbiBwYXR0ZXJuIGludGVycHJldGVkIGFjY29yZGluZyB0byBAcCBfX2ZsYWdzLiAgSWYKKyAgICAgICAqIHJlZ2V4X2Vycm9yIGlzIHRocm93biwgKnRoaXMgcmVtYWlucyB1bmNoYW5nZWQuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgICAgYmFzaWNfcmVnZXgmCisgICAgICAgIGFzc2lnbihjb25zdCBiYXNpY19zdHJpbmc8X0NoX3R5cGUsIF9DaF90eXBlcmFpdHMsIF9BbGxvYz4mIF9fcywKKwkgICAgICAgZmxhZ190eXBlIF9fZmxhZ3MgPSBFQ01BU2NyaXB0KQorICAgICAgICB7IAorCSAgYmFzaWNfcmVnZXggX190bXAoX19zLCBfX2ZsYWdzKTsKKwkgIHRoaXMtPnN3YXAoX190bXApOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQXNzaWducyBhIG5ldyByZWd1bGFyIGV4cHJlc3Npb24gdG8gYSByZWdleCBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fZmlyc3QgVGhlIHN0YXJ0IG9mIGEgcmFuZ2UgY29udGFpbmluZyBhIHZhbGlkIHJlZ3VsYXIKKyAgICAgICAqICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gX19sYXN0ICBUaGUgZW5kIG9mIGEgcmFuZ2UgY29udGFpbmluZyBhIHZhbGlkIHJlZ3VsYXIKKyAgICAgICAqICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gX19mbGFncyBTeW50YXggb3B0aW9uIGZsYWdzLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgcmVnZXhfZXJyb3IgaWYgcCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgcmVndWxhcgorICAgICAgICogZXhwcmVzc2lvbiBwYXR0ZXJuIGludGVycHJldGVkIGFjY29yZGluZyB0byBAcCBfX2ZsYWdzLiAgSWYKKyAgICAgICAqIHJlZ2V4X2Vycm9yIGlzIHRocm93biwgdGhlIG9iamVjdCByZW1haW5zIHVuY2hhbmdlZC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBmbGFnX3R5cGUgX19mbGFncyA9IEVDTUFTY3JpcHQpCisgICAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihzdHJpbmdfdHlwZShfX2ZpcnN0LCBfX2xhc3QpLCBfX2ZsYWdzKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBBc3NpZ25zIGEgbmV3IHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBhIHJlZ2V4IG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19sICAgICBBbiBpbml0aWFsaXplciBsaXN0IHJlcHJlc2VudGluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqIEBwYXJhbSBfX2ZsYWdzIFN5bnRheCBvcHRpb24gZmxhZ3MuCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBAcCBfX2wgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkCisgICAgICAgKiByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gQHAKKyAgICAgICAqIF9fZmxhZ3MuICBJZiByZWdleF9lcnJvciBpcyB0aHJvd24sIHRoZSBvYmplY3QgcmVtYWlucworICAgICAgICogdW5jaGFuZ2VkLgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleCYKKyAgICAgIGFzc2lnbihpbml0aWFsaXplcl9saXN0PF9DaF90eXBlPiBfX2wsIGZsYWdfdHlwZSBfX2ZsYWdzID0gRUNNQVNjcmlwdCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihfX2wuYmVnaW4oKSwgX19sLmVuZCgpLCBfX2ZsYWdzKTsgfQorCisgICAgICAvLyBbNy44LjRdIGNvbnN0IG9wZXJhdGlvbnMKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG51bWJlciBvZiBtYXJrZWQgc3ViZXhwcmVzc2lvbnMgd2l0aGluIHRoZSByZWd1bGFyCisgICAgICAgKiBleHByZXNzaW9uLgorICAgICAgICovCisgICAgICB1bnNpZ25lZCBpbnQKKyAgICAgIG1hcmtfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYXV0b21hdG9uLT5fTV9zdWJfY291bnQoKSAtIDE7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgZmxhZ3MgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICAgICogb3IgaW4gdGhlIGxhc3QgY2FsbCB0byBhc3NpZ24oKS4KKyAgICAgICAqLworICAgICAgZmxhZ190eXBlCisgICAgICBmbGFncygpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9mbGFnczsgfQorICAgICAgCisgICAgICAvLyBbNy44LjVdIGxvY2FsZQorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW1idWVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0IHdpdGggdGhlIGdpdmVuIGxvY2FsZS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19sb2MgQSBsb2NhbGUuCisgICAgICAgKi8KKyAgICAgIGxvY2FsZV90eXBlCisgICAgICBpbWJ1ZShsb2NhbGVfdHlwZSBfX2xvYykKKyAgICAgIHsgcmV0dXJuIF9NX3RyYWl0cy5pbWJ1ZShfX2xvYyk7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbG9jYWxlIGN1cnJlbnRseSBpbWJ1ZWQgaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICAgICogICAgICAgIG9iamVjdC4KKyAgICAgICAqLworICAgICAgbG9jYWxlX3R5cGUKKyAgICAgIGdldGxvYygpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90cmFpdHMuZ2V0bG9jKCk7IH0KKyAgICAgIAorICAgICAgLy8gWzcuOC42XSBzd2FwCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTd2FwcyB0aGUgY29udGVudHMgb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3RzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoYmFzaWNfcmVnZXgmIF9fcmhzKQorICAgICAgeworCXN0ZDo6c3dhcChfTV9mbGFncywgX19yaHMuX01fZmxhZ3MpOworCXN0ZDo6c3dhcChfTV90cmFpdHMsIF9fcmhzLl9NX3RyYWl0cyk7CisJc3RkOjpzd2FwKF9NX2F1dG9tYXRvbiwgX19yaHMuX01fYXV0b21hdG9uKTsKKyAgICAgIH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBfTV9kb3Qoc3RkOjpvc3RyZWFtJiBfX29zdHIpCisgICAgICB7IF9NX2F1dG9tYXRvbi0+X01fZG90KF9fb3N0cik7IH0KKyNlbmRpZgorICAgICAgCisgICAgICBjb25zdCBfX2RldGFpbDo6X0F1dG9tYXRvblB0ciYKKyAgICAgIF9NX2dldF9hdXRvbWF0b24oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYXV0b21hdG9uOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBmbGFnX3R5cGUgICAgICAgICAgICAgIF9NX2ZsYWdzOworICAgICAgX1J4X3RyYWl0cyAgICAgICAgICAgICBfTV90cmFpdHM7CisgICAgICBfX2RldGFpbDo6X0F1dG9tYXRvblB0ciBfTV9hdXRvbWF0b247CisgICAgfTsKKyAgCisgIC8qKiBAYnJpZWYgU3RhbmRhcmQgcmVndWxhciBleHByZXNzaW9ucy4gKi8KKyAgdHlwZWRlZiBiYXNpY19yZWdleDxjaGFyPiAgICByZWdleDsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIC8qKiBAYnJpZWYgU3RhbmRhcmQgd2lkZS1jaGFyYWN0ZXIgcmVndWxhciBleHByZXNzaW9ucy4gKi8KKyAgdHlwZWRlZiBiYXNpY19yZWdleDx3Y2hhcl90PiB3cmVnZXg7CisjZW5kaWYKKworCisgIC8vIFs3LjguNl0gYmFzaWNfcmVnZXggc3dhcAorICAvKioKKyAgICogQGJyaWVmIFN3YXBzIHRoZSBjb250ZW50cyBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIG9iamVjdHMuCisgICAqIEBwYXJhbSBfX2xocyBGaXJzdCByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqIEBwYXJhbSBfX3JocyBTZWNvbmQgcmVndWxhciBleHByZXNzaW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19saHMsCisJIGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorCisKKyAgLy8gWzcuOV0gQ2xhc3MgdGVtcGxhdGUgc3ViX21hdGNoCisgIC8qKgorICAgKiBBIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgbWF0Y2hlZCBieSBhIHBhcnRpY3VsYXIgbWFya2VkIHN1Yi1leHByZXNzaW9uLgorICAgKgorICAgKiBBbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBlc3NlbnRpYWxseSBhIHBhaXIgb2YgaXRlcmF0b3JzIG1hcmtpbmcgYQorICAgKiBtYXRjaGVkIHN1YmV4cHJlc3Npb24gd2l0aGluIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gbWF0Y2guIFN1Y2gKKyAgICogb2JqZWN0cyBjYW4gYmUgY29udmVydGVkIHRvIGFuZCBjb21wYXJlZCB3aXRoIHN0ZDo6YmFzaWNfc3RyaW5nIG9iamVjdHMKKyAgICogb2YgYSBzaW1pbGFyIGJhc2UgY2hhcmFjdGVyIHR5cGUgYXMgdGhlIHBhdHRlcm4gbWF0Y2hlZCBieSB0aGUgcmVndWxhcgorICAgKiBleHByZXNzaW9uLgorICAgKgorICAgKiBUaGUgaXRlcmF0b3JzIHRoYXQgbWFrZSB1cCB0aGUgcGFpciBhcmUgdGhlIHVzdWFsIGhhbGYtb3BlbiBpbnRlcnZhbAorICAgKiByZWZlcmVuY2luZyB0aGUgYWN0dWFsIG9yaWdpbmFsIHBhdHRlcm4gbWF0Y2hlZC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaUl0ZXI+CisgICAgY2xhc3Mgc3ViX21hdGNoIDogcHVibGljIHN0ZDo6cGFpcjxfQmlJdGVyLCBfQmlJdGVyPgorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9CaUl0ZXI+CQkJX19pdGVyX3RyYWl0czsKKwkKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXRlcl90cmFpdHM6OnZhbHVlX3R5cGUgICAgICAJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pdGVyX3RyYWl0czo6ZGlmZmVyZW5jZV90eXBlIAlkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9CaUl0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX3N0cmluZzx2YWx1ZV90eXBlPiAgICAgICAgICAgICBzdHJpbmdfdHlwZTsKKworICAgICAgYm9vbCBtYXRjaGVkOworICAgICAgCisgICAgICBjb25zdGV4cHIgc3ViX21hdGNoKCkgOiBtYXRjaGVkKCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGluZyBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgZGlmZmVyZW5jZV90eXBlCisgICAgICBsZW5ndGgoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+bWF0Y2hlZCA/IHN0ZDo6ZGlzdGFuY2UodGhpcy0+Zmlyc3QsIHRoaXMtPnNlY29uZCkgOiAwOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG1hdGNoaW5nIHNlcXVlbmNlIGFzIGEgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRoZSBtYXRjaGluZyBzZXF1ZW5jZSBhcyBhIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGlzIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIG9wZXJhdG9yLiAgSXQgaXMgaWRlbnRpY2FsIHRvIHRoZQorICAgICAgICogc3RyKCkgbWVtYmVyIGZ1bmN0aW9uIGV4Y2VwdCB0aGF0IGl0IHdpbGwgd2FudCB0byBwb3AgdXAgaW4KKyAgICAgICAqIHVuZXhwZWN0ZWQgcGxhY2VzIGFuZCBjYXVzZSBhIGdyZWF0IGRlYWwgb2YgY29uZnVzaW9uIGFuZCBjdXJzaW5nCisgICAgICAgKiBmcm9tIHRoZSB1bndhcnkuCisgICAgICAgKi8KKyAgICAgIG9wZXJhdG9yIHN0cmluZ190eXBlKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gdGhpcy0+bWF0Y2hlZAorCSAgPyBzdHJpbmdfdHlwZSh0aGlzLT5maXJzdCwgdGhpcy0+c2Vjb25kKQorCSAgOiBzdHJpbmdfdHlwZSgpOworICAgICAgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBtYXRjaGluZyBzZXF1ZW5jZSBhcyBhIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0aGUgbWF0Y2hpbmcgc2VxdWVuY2UgYXMgYSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIHN0cmluZ190eXBlCisgICAgICBzdHIoKSBjb25zdAorICAgICAgeworCXJldHVybiB0aGlzLT5tYXRjaGVkCisJICA/IHN0cmluZ190eXBlKHRoaXMtPmZpcnN0LCB0aGlzLT5zZWNvbmQpCisJICA6IHN0cmluZ190eXBlKCk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbXBhcmVzIHRoaXMgYW5kIGFub3RoZXIgbWF0Y2hlZCBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19zIEFub3RoZXIgbWF0Y2hlZCBzZXF1ZW5jZSB0byBjb21wYXJlIHRvIHRoaXMgb25lLgorICAgICAgICoKKyAgICAgICAqIEByZXR2YWwgPDAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIHdpbGwgY29sbGF0ZSBiZWZvcmUgQHAgX19zLgorICAgICAgICogQHJldHZhbCA9MCB0aGlzIG1hdGNoZWQgc2VxdWVuY2UgaXMgZXF1aXZhbGVudCB0byBAcCBfX3MuCisgICAgICAgKiBAcmV0dmFsIDwwIHRoaXMgbWF0Y2hlZCBzZXF1ZW5jZSB3aWxsIGNvbGxhdGUgYWZ0ZXIgQHAgX19zLgorICAgICAgICovCisgICAgICBpbnQKKyAgICAgIGNvbXBhcmUoY29uc3Qgc3ViX21hdGNoJiBfX3MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5zdHIoKS5jb21wYXJlKF9fcy5zdHIoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29tcGFyZXMgdGhpcyBzdWJfbWF0Y2ggdG8gYSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcyBBIHN0cmluZyB0byBjb21wYXJlIHRvIHRoaXMgc3ViX21hdGNoLgorICAgICAgICoKKyAgICAgICAqIEByZXR2YWwgPDAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIHdpbGwgY29sbGF0ZSBiZWZvcmUgQHAgX19zLgorICAgICAgICogQHJldHZhbCA9MCB0aGlzIG1hdGNoZWQgc2VxdWVuY2UgaXMgZXF1aXZhbGVudCB0byBAcCBfX3MuCisgICAgICAgKiBAcmV0dmFsIDwwIHRoaXMgbWF0Y2hlZCBzZXF1ZW5jZSB3aWxsIGNvbGxhdGUgYWZ0ZXIgQHAgX19zLgorICAgICAgICovCisgICAgICBpbnQKKyAgICAgIGNvbXBhcmUoY29uc3Qgc3RyaW5nX3R5cGUmIF9fcykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnN0cigpLmNvbXBhcmUoX19zKTsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb21wYXJlcyB0aGlzIHN1Yl9tYXRjaCB0byBhIEMtc3R5bGUgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX3MgQSBDLXN0eWxlIHN0cmluZyB0byBjb21wYXJlIHRvIHRoaXMgc3ViX21hdGNoLgorICAgICAgICoKKyAgICAgICAqIEByZXR2YWwgPDAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIHdpbGwgY29sbGF0ZSBiZWZvcmUgQHAgX19zLgorICAgICAgICogQHJldHZhbCA9MCB0aGlzIG1hdGNoZWQgc2VxdWVuY2UgaXMgZXF1aXZhbGVudCB0byBAcCBfX3MuCisgICAgICAgKiBAcmV0dmFsIDwwIHRoaXMgbWF0Y2hlZCBzZXF1ZW5jZSB3aWxsIGNvbGxhdGUgYWZ0ZXIgQHAgX19zLgorICAgICAgICovCisgICAgICBpbnQKKyAgICAgIGNvbXBhcmUoY29uc3QgdmFsdWVfdHlwZSogX19zKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+c3RyKCkuY29tcGFyZShfX3MpOyB9CisgICAgfTsKKyAgCisgIAorICAvKiogQGJyaWVmIFN0YW5kYXJkIHJlZ2V4IHN1Ym1hdGNoIG92ZXIgYSBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcuICovCisgIHR5cGVkZWYgc3ViX21hdGNoPGNvbnN0IGNoYXIqPiAgICAgICAgICAgICBjc3ViX21hdGNoOworCisgIC8qKiBAYnJpZWYgU3RhbmRhcmQgcmVnZXggc3VibWF0Y2ggb3ZlciBhIHN0YW5kYXJkIHN0cmluZy4gKi8KKyAgdHlwZWRlZiBzdWJfbWF0Y2g8c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gIHNzdWJfbWF0Y2g7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICAvKiogQGJyaWVmIFJlZ2V4IHN1Ym1hdGNoIG92ZXIgYSBDLXN0eWxlIG51bGwtdGVybWluYXRlZCB3aWRlIHN0cmluZy4gKi8KKyAgdHlwZWRlZiBzdWJfbWF0Y2g8Y29uc3Qgd2NoYXJfdCo+ICAgICAgICAgIHdjc3ViX21hdGNoOworCisgIC8qKiBAYnJpZWYgUmVnZXggc3VibWF0Y2ggb3ZlciBhIHN0YW5kYXJkIHdpZGUgc3RyaW5nLiAqLworICB0eXBlZGVmIHN1Yl9tYXRjaDx3c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gd3NzdWJfbWF0Y2g7CisjZW5kaWYKKworICAvLyBbNy45LjJdIHN1Yl9tYXRjaCBub24tbWVtYmVyIG9wZXJhdG9ycworICAKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgZXF1aXZhbGVuY2Ugb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaGVzLgorICAgKiBAcGFyYW0gX19saHMgRmlyc3QgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19yaHMgU2Vjb25kIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyAgaXMgZXF1aXZhbGVudCB0byBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpSXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX2xocywgY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA9PSAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgaW5lcXVpdmFsZW5jZSBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoZXMuCisgICAqIEBwYXJhbSBfX2xocyBGaXJzdCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX3JocyBTZWNvbmQgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzICBpcyBub3QgZXF1aXZhbGVudCB0byBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpSXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX2xocywgY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSAhPSAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaGVzLgorICAgKiBAcGFyYW0gX19saHMgRmlyc3QgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19yaHMgU2Vjb25kIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBwcmVjZWRlcyBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpSXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fbGhzLCBjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpIDwgMDsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIHR3byByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2hlcy4KKyAgICogQHBhcmFtIF9fbGhzIEZpcnN0IHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fcmhzIFNlY29uZCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgZG9lcyBub3Qgc3VjY2VlZCBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpSXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX2xocywgY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA8PSAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaGVzLgorICAgKiBAcGFyYW0gX19saHMgRmlyc3QgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19yaHMgU2Vjb25kIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBkb2VzIG5vdCBwcmVjZWRlIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlJdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fbGhzLCBjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID49IDA7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoZXMuCisgICAqIEBwYXJhbSBfX2xocyBGaXJzdCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX3JocyBTZWNvbmQgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIHN1Y2NlZWRzIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlJdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX19saHMsIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPiAwOyB9CisKKyAgLy8gQWxpYXMgZm9yIHN1Yl9tYXRjaCdkIHN0cmluZy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYz4KKyAgICB1c2luZyBfX3N1Yl9tYXRjaF9zdHJpbmcgPSBiYXNpY19zdHJpbmc8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NoX3RyYWl0cywgX0NoX2FsbG9jPjsKKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBlcXVpdmFsZW5jZSBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICogICAgICAgIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19saHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSBfX3JocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyAgaXMgZXF1aXZhbGVudCB0byBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX19zdWJfbWF0Y2hfc3RyaW5nPF9CaV9pdGVyLCBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19yaHMuY29tcGFyZShfX2xocy5jX3N0cigpKSA9PSAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgaW5lcXVpdmFsZW5jZSBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICogICAgICAgIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19saHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSBfX3JocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyAgaXMgbm90IGVxdWl2YWxlbnQgdG8gQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9fc3ViX21hdGNoX3N0cmluZzxfQmlfaXRlciwgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19saHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSBfX3JocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBwcmVjZWRlcyBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfX3N1Yl9tYXRjaF9zdHJpbmc8X0JpX2l0ZXIsIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fbGhzLAorCSAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgICB7IHJldHVybiBfX3Jocy5jb21wYXJlKF9fbGhzLmNfc3RyKCkpID4gMDsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gX19yaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgc3VjY2VlZHMgQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX19zdWJfbWF0Y2hfc3RyaW5nPF9CaV9pdGVyLCBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX2xocywKKwkgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX3JocyA8IF9fbGhzOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19saHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSBfX3JocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBkb2VzIG5vdCBwcmVjZWRlIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfX3N1Yl9tYXRjaF9zdHJpbmc8X0JpX2l0ZXIsIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzIDwgX19yaHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19saHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSBfX3JocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBkb2VzIG5vdCBzdWNjZWVkIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBfX3N1Yl9tYXRjaF9zdHJpbmc8X0JpX2l0ZXIsIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fcmhzIDwgX19saHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgZXF1aXZhbGVuY2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEKKyAgICogICAgICAgIHN0cmluZy4KKyAgICogQHBhcmFtIF9fbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19yaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgaXMgZXF1aXZhbGVudCB0byBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fc3ViX21hdGNoX3N0cmluZzxfQmlfaXRlciwgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3Jocy5jX3N0cigpKSA9PSAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgaW5lcXVpdmFsZW5jZSBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYQorICAgKiAgICAgICAgc3RyaW5nLgorICAgKiBAcGFyYW0gX19saHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX3JocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBpcyBub3QgZXF1aXZhbGVudCB0byBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fc3ViX21hdGNoX3N0cmluZzxfQmlfaXRlciwgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYSBzdHJpbmcuCisgICAqIEBwYXJhbSBfX2xocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fcmhzIEEgc3RyaW5nLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIHByZWNlZGVzIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgY2xhc3MgX0NoX3RyYWl0cywgY2xhc3MgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9fc3ViX21hdGNoX3N0cmluZzxfQmlfaXRlciwgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3Jocy5jX3N0cigpKSA8IDA7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYSBzdHJpbmcuCisgICAqIEBwYXJhbSBfX2xocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fcmhzIEEgc3RyaW5nLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIHN1Y2NlZWRzIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgY2xhc3MgX0NoX3RyYWl0cywgY2xhc3MgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9fc3ViX21hdGNoX3N0cmluZzxfQmlfaXRlciwgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19yaHMgPCBfX2xoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIF9fbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19yaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgZG9lcyBub3QgcHJlY2VkZSBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIGNsYXNzIF9DaF90cmFpdHMsIGNsYXNzIF9DaF9hbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fc3ViX21hdGNoX3N0cmluZzxfQmlfaXRlciwgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA8IF9fcmhzKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIF9fbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19yaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgZG9lcyBub3Qgc3VjY2VlZCBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIGNsYXNzIF9DaF90cmFpdHMsIGNsYXNzIF9DaF9hbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fc3ViX21hdGNoX3N0cmluZzxfQmlfaXRlciwgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX3JocyA8IF9fbGhzKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGVxdWl2YWxlbmNlIG9mIGEgQyBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uCisgICAqICAgICAgICBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fbGhzIEEgQyBzdHJpbmcuCisgICAqIEBwYXJhbSBfX3JocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyAgaXMgZXF1aXZhbGVudCB0byBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX3Jocy5jb21wYXJlKF9fbGhzKSA9PSAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgaW5lcXVpdmFsZW5jZSBvZiBhbiBpdGVyYXRvciB2YWx1ZSBhbmQgYSByZWd1bGFyCisgICAqICAgICAgICBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19saHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX3JocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBpcyBub3QgZXF1aXZhbGVudCB0byBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gX19yaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgcHJlY2VkZXMgQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fbGhzLAorCSAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzLmNvbXBhcmUoX19saHMpID4gMDsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gX19yaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgc3VjY2VlZHMgQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fbGhzLAorCSAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzIDwgX19saHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX2xocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIF9fcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIGRvZXMgbm90IHByZWNlZGUgQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PSh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA8IF9fcmhzKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gX19yaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgZG9lcyBub3Qgc3VjY2VlZCBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fcmhzIDwgX19saHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgZXF1aXZhbGVuY2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEKKyAgICogICAgICAgIHN0cmluZy4KKyAgICogQHBhcmFtIF9fbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19yaHMgQSBwb2ludGVyIHRvIGEgc3RyaW5nPworICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzICBpcyBlcXVpdmFsZW50IHRvIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID09IDA7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBpbmVxdWl2YWxlbmNlIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhCisgICAqICAgICAgICBzdHJpbmcuCisgICAqIEBwYXJhbSBfX2xocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fcmhzIEEgcG9pbnRlciB0byBhIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBpcyBub3QgZXF1aXZhbGVudCB0byBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIF9fbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19yaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgcHJlY2VkZXMgQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpIDwgMDsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIF9fbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19yaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgc3VjY2VlZHMgQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzIDwgX19saHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYSBzdHJpbmcuCisgICAqIEBwYXJhbSBfX2xocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fcmhzIEEgc3RyaW5nLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIGRvZXMgbm90IHByZWNlZGUgQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA8IF9fcmhzKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIF9fbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19yaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgZG9lcyBub3Qgc3VjY2VlZCBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fcmhzIDwgX19saHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgZXF1aXZhbGVuY2Ugb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uCisgICAqICAgICAgICBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gX19yaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgaXMgZXF1aXZhbGVudCB0byBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN1Yl9tYXRjaDxfQmlfaXRlcj46OnN0cmluZ190eXBlIHN0cmluZ190eXBlOworICAgICAgcmV0dXJuIF9fcmhzLmNvbXBhcmUoc3RyaW5nX3R5cGUoMSwgX19saHMpKSA9PSAwOworICAgIH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBpbmVxdWl2YWxlbmNlIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgKiAgICAgICAgc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX2xocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIF9fcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIGlzIG5vdCBlcXVpdmFsZW50IHRvIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19saHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSBfX3JocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBwcmVjZWRlcyBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwodHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19saHMsCisJICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdWJfbWF0Y2g8X0JpX2l0ZXI+OjpzdHJpbmdfdHlwZSBzdHJpbmdfdHlwZTsKKyAgICAgIHJldHVybiBfX3Jocy5jb21wYXJlKHN0cmluZ190eXBlKDEsIF9fbGhzKSkgPiAwOworICAgIH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX2xocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIF9fcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIHN1Y2NlZWRzIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPih0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX2xocywKKwkgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX3JocyA8IF9fbGhzOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19saHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSBfX3JocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBkb2VzIG5vdCBwcmVjZWRlIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPCBfX3Jocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX2xocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIF9fcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIGRvZXMgbm90IHN1Y2NlZWQgQGEgX19yaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PSh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX3JocyA8IF9fbGhzKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGVxdWl2YWxlbmNlIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhCisgICAqICAgICAgICBzdHJpbmcuCisgICAqIEBwYXJhbSBfX2xocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fcmhzIEEgY29uc3Qgc3RyaW5nIHJlZmVyZW5jZS4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyAgaXMgZXF1aXZhbGVudCB0byBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX3JocykKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN1Yl9tYXRjaDxfQmlfaXRlcj46OnN0cmluZ190eXBlIHN0cmluZ190eXBlOworICAgICAgcmV0dXJuIF9fbGhzLmNvbXBhcmUoc3RyaW5nX3R5cGUoMSwgX19yaHMpKSA9PSAwOworICAgIH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBpbmVxdWl2YWxlbmNlIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhCisgICAqICAgICAgICBzdHJpbmcuCisgICAqIEBwYXJhbSBfX2xocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIF9fcmhzIEEgY29uc3Qgc3RyaW5nIHJlZmVyZW5jZS4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBfX2xocyBpcyBub3QgZXF1aXZhbGVudCB0byBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIF9fbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19yaHMgQSBjb25zdCBzdHJpbmcgcmVmZXJlbmNlLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIHByZWNlZGVzIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX3JocykKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN1Yl9tYXRjaDxfQmlfaXRlcj46OnN0cmluZ190eXBlIHN0cmluZ190eXBlOworICAgICAgcmV0dXJuIF9fbGhzLmNvbXBhcmUoc3RyaW5nX3R5cGUoMSwgX19yaHMpKSA8IDA7CisgICAgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIF9fbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gX19yaHMgQSBjb25zdCBzdHJpbmcgcmVmZXJlbmNlLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIF9fbGhzIHN1Y2NlZWRzIEBhIF9fcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX3JocykKKyAgICB7IHJldHVybiBfX3JocyA8IF9fbGhzOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gX19saHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX3JocyBBIGNvbnN0IHN0cmluZyByZWZlcmVuY2UuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgZG9lcyBub3QgcHJlY2VkZSBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzIDwgX19yaHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gX19saHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBfX3JocyBBIGNvbnN0IHN0cmluZyByZWZlcmVuY2UuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgX19saHMgZG9lcyBub3Qgc3VjY2VlZCBAYSBfX3JocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fcmhzIDwgX19saHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBJbnNlcnRzIGEgbWF0Y2hlZCBzdHJpbmcgaW50byBhbiBvdXRwdXQgc3RyZWFtLgorICAgKgorICAgKiBAcGFyYW0gX19vcyBUaGUgb3V0cHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIF9fbSAgQSBzdWJtYXRjaCBzdHJpbmcuCisgICAqCisgICAqIEByZXR1cm5zIHRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN1Ym1hdGNoIHN0cmluZyBpbnNlcnRlZC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUKKyAgICBiYXNpY19vc3RyZWFtPF9DaF90eXBlLCBfQ2hfdHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoX3R5cGUsIF9DaF90cmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX20pCisgICAgeyByZXR1cm4gX19vcyA8PCBfX20uc3RyKCk7IH0KKworICAvLyBbNy4xMF0gQ2xhc3MgdGVtcGxhdGUgbWF0Y2hfcmVzdWx0cworCisgIC8qCisgICAqIFNwZWNpYWwgc3ViX21hdGNoIG9iamVjdCByZXByZXNlbnRpbmcgYW4gdW5tYXRjaGVkIHN1Yi1leHByZXNzaW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mCisgICAgX191bm1hdGNoZWRfc3ViKCkKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiBfX3VubWF0Y2hlZCA9IHN1Yl9tYXRjaDxfQmlfaXRlcj4oKTsKKyAgICAgIHJldHVybiBfX3VubWF0Y2hlZDsKKyAgICB9CisKKyAgLyoqCisgICAqIEBicmllZiBUaGUgcmVzdWx0cyBvZiBhIG1hdGNoIG9yIHNlYXJjaCBvcGVyYXRpb24uCisgICAqCisgICAqIEEgY29sbGVjdGlvbiBvZiBjaGFyYWN0ZXIgc2VxdWVuY2VzIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0IG9mIGEgcmVndWxhcgorICAgKiBleHByZXNzaW9uIG1hdGNoLiAgU3RvcmFnZSBmb3IgdGhlIGNvbGxlY3Rpb24gaXMgYWxsb2NhdGVkIGFuZCBmcmVlZCBhcworICAgKiBuZWNlc3NhcnkgYnkgdGhlIG1lbWJlciBmdW5jdGlvbnMgb2YgY2xhc3MgdGVtcGxhdGUgbWF0Y2hfcmVzdWx0cy4KKyAgICoKKyAgICogVGhpcyBjbGFzcyBzYXRpc2ZpZXMgdGhlIFNlcXVlbmNlIHJlcXVpcmVtZW50cywgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQKKyAgICogb25seSB0aGUgb3BlcmF0aW9ucyBkZWZpbmVkIGZvciBhIGNvbnN0LXF1YWxpZmllZCBTZXF1ZW5jZSBhcmUgc3VwcG9ydGVkLgorICAgKgorICAgKiBUaGUgc3ViX21hdGNoIG9iamVjdCBzdG9yZWQgYXQgaW5kZXggMCByZXByZXNlbnRzIHN1Yi1leHByZXNzaW9uIDAsIGkuZS4KKyAgICogdGhlIHdob2xlIG1hdGNoLiBJbiB0aGlzIGNhc2UgdGhlICVzdWJfbWF0Y2ggbWVtYmVyIG1hdGNoZWQgaXMgYWx3YXlzIHRydWUuCisgICAqIFRoZSBzdWJfbWF0Y2ggb2JqZWN0IHN0b3JlZCBhdCBpbmRleCBuIGRlbm90ZXMgd2hhdCBtYXRjaGVkIHRoZSBtYXJrZWQKKyAgICogc3ViLWV4cHJlc3Npb24gbiB3aXRoaW4gdGhlIG1hdGNoZWQgZXhwcmVzc2lvbi4gSWYgdGhlIHN1Yi1leHByZXNzaW9uIG4KKyAgICogcGFydGljaXBhdGVkIGluIGEgcmVndWxhciBleHByZXNzaW9uIG1hdGNoIHRoZW4gdGhlICVzdWJfbWF0Y2ggbWVtYmVyCisgICAqIG1hdGNoZWQgZXZhbHVhdGVzIHRvIHRydWUsIGFuZCBtZW1iZXJzIGZpcnN0IGFuZCBzZWNvbmQgZGVub3RlIHRoZSByYW5nZQorICAgKiBvZiBjaGFyYWN0ZXJzIFtmaXJzdCwgc2Vjb25kKSB3aGljaCBmb3JtZWQgdGhhdCBtYXRjaC4gT3RoZXJ3aXNlIG1hdGNoZWQKKyAgICogaXMgZmFsc2UsIGFuZCBtZW1iZXJzIGZpcnN0IGFuZCBzZWNvbmQgcG9pbnQgdG8gdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UKKyAgICogdGhhdCB3YXMgc2VhcmNoZWQuCisgICAqCisgICAqIEBub3N1Ymdyb3VwaW5nCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSBhbGxvY2F0b3I8c3ViX21hdGNoPF9CaV9pdGVyPiA+ID4KKyAgICBjbGFzcyBtYXRjaF9yZXN1bHRzCisgICAgOiBwcml2YXRlIHN0ZDo6dmVjdG9yPHN1Yl9tYXRjaDxfQmlfaXRlcj4sIF9BbGxvYz4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIC8qCisgICAgICAgKiBUaGUgdmVjdG9yIGJhc2UgaXMgZW1wdHkgaWYgdGhpcyBkb2VzIG5vdCByZXByZXNlbnQgYSBzdWNjZXNzZnVsIG1hdGNoLgorICAgICAgICogT3RoZXJ3aXNlIGl0IGNvbnRhaW5zIG4rMyBlbGVtZW50cyB3aGVyZSBuIGlzIHRoZSBudW1iZXIgb2YgbWFya2VkCisgICAgICAgKiBzdWItZXhwcmVzc2lvbnM6CisgICAgICAgKiBbMF0gZW50aXJlIG1hdGNoCisgICAgICAgKiBbMV0gMXN0IG1hcmtlZCBzdWJleHByZXNzaW9uCisgICAgICAgKiAuLi4KKyAgICAgICAqIFtuXSBudGggbWFya2VkIHN1YmV4cHJlc3Npb24KKyAgICAgICAqIFtuKzFdIHByZWZpeAorICAgICAgICogW24rMl0gc3VmZml4CisgICAgICAgKi8KKyAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3ViX21hdGNoPF9CaV9pdGVyPiwgX0FsbG9jPiAgICAgX0Jhc2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+ICAgCSAgIAkgICBfX2l0ZXJfdHJhaXRzOworICAgICAgdHlwZWRlZiByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZQkJICAgbWF0Y2hfZmxhZ190eXBlOworCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBAbmFtZSAxMC4/IFB1YmxpYyBUeXBlcworICAgICAgICovCisgICAgICAvL0B7CisgICAgICB0eXBlZGVmIF9BbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiBzdWJfbWF0Y2g8X0JpX2l0ZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0X3JlZmVyZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2l0ZXJfdHJhaXRzOjpkaWZmZXJlbmNlX3R5cGUJICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2l0ZXJfdHJhaXRzOjp2YWx1ZV90eXBlIAkgICBjaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPjo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKworCisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXJfdHlwZT4gICAgICAgICAgICAgICAgIHN0cmluZ190eXBlOworICAgICAgLy9AfQorICAKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqIEBuYW1lIDI4LjEwLjEgQ29uc3RydWN0aW9uLCBDb3B5aW5nLCBhbmQgRGVzdHJ1Y3Rpb24KKyAgICAgICAqLworICAgICAgLy9AeworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgZGVmYXVsdCAlbWF0Y2hfcmVzdWx0cyBjb250YWluZXIuCisgICAgICAgKiBAcG9zdCBzaXplKCkgcmV0dXJucyAwIGFuZCBzdHIoKSByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG1hdGNoX3Jlc3VsdHMoY29uc3QgX0FsbG9jJiBfX2EgPSBfQWxsb2MoKSkKKyAgICAgIDogX0Jhc2VfdHlwZShfX2EpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29weSBjb25zdHJ1Y3RzIGEgJW1hdGNoX3Jlc3VsdHMuCisgICAgICAgKi8KKyAgICAgIG1hdGNoX3Jlc3VsdHMoY29uc3QgbWF0Y2hfcmVzdWx0cyYgX19yaHMpCisgICAgICA6IF9CYXNlX3R5cGUoX19yaHMpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgTW92ZSBjb25zdHJ1Y3RzIGEgJW1hdGNoX3Jlc3VsdHMuCisgICAgICAgKi8KKyAgICAgIG1hdGNoX3Jlc3VsdHMobWF0Y2hfcmVzdWx0cyYmIF9fcmhzKSBub2V4Y2VwdAorICAgICAgOiBfQmFzZV90eXBlKHN0ZDo6bW92ZShfX3JocykpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQXNzaWducyByaHMgdG8gKnRoaXMuCisgICAgICAgKi8KKyAgICAgIG1hdGNoX3Jlc3VsdHMmCisgICAgICBvcGVyYXRvcj0oY29uc3QgbWF0Y2hfcmVzdWx0cyYgX19yaHMpCisgICAgICB7CisJbWF0Y2hfcmVzdWx0cyhfX3Jocykuc3dhcCgqdGhpcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBNb3ZlLWFzc2lnbnMgcmhzIHRvICp0aGlzLgorICAgICAgICovCisgICAgICBtYXRjaF9yZXN1bHRzJgorICAgICAgb3BlcmF0b3I9KG1hdGNoX3Jlc3VsdHMmJiBfX3JocykKKyAgICAgIHsKKwltYXRjaF9yZXN1bHRzKHN0ZDo6bW92ZShfX3JocykpLnN3YXAoKnRoaXMpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRGVzdHJveXMgYSAlbWF0Y2hfcmVzdWx0cyBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIH5tYXRjaF9yZXN1bHRzKCkKKyAgICAgIHsgfQorICAgICAgCisgICAgICAvL0B9CisKKyAgICAgIC8vIDI4LjEwLjIsIHN0YXRlOgorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5kaWNhdGVzIGlmIHRoZSAlbWF0Y2hfcmVzdWx0cyBpcyByZWFkeS4KKyAgICAgICAqIEByZXR2YWwgdHJ1ZSAgIFRoZSBvYmplY3QgaGFzIGEgZnVsbHktZXN0YWJsaXNoZWQgcmVzdWx0IHN0YXRlLgorICAgICAgICogQHJldHZhbCBmYWxzZSAgVGhlIG9iamVjdCBpcyBub3QgcmVhZHkuCisgICAgICAgKi8KKyAgICAgIGJvb2wgcmVhZHkoKSBjb25zdCB7IHJldHVybiAhX0Jhc2VfdHlwZTo6ZW1wdHkoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBuYW1lIDI4LjEwLjIgU2l6ZQorICAgICAgICovCisgICAgICAvL0B7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG51bWJlciBvZiBtYXRjaGVzIGFuZCBzdWJtYXRjaGVzLgorICAgICAgICoKKyAgICAgICAqIFRoZSBudW1iZXIgb2YgbWF0Y2hlcyBmb3IgYSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24gd2lsbCBiZSBlaXRoZXIgMAorICAgICAgICogaWYgdGhlcmUgd2FzIG5vIG1hdGNoIG9yIG1hcmtfY291bnQoKSArIDEgaWYgYSBtYXRjaCB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgICAqIFNvbWUgbWF0Y2hlcyBtYXkgYmUgZW1wdHkuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdGhlIG51bWJlciBvZiBtYXRjaGVzIGZvdW5kLgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeworICAgICAgCXNpemVfdHlwZSBfX3NpemUgPSBfQmFzZV90eXBlOjpzaXplKCk7CisgICAgICAJcmV0dXJuIChfX3NpemUgJiYgX0Jhc2VfdHlwZTo6b3BlcmF0b3JbXSgwKS5tYXRjaGVkKSA/IF9fc2l6ZSAtIDIgOiAwOworICAgICAgfQorICAgICAgCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9CYXNlX3R5cGU6Om1heF9zaXplKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5kaWNhdGVzIGlmIHRoZSAlbWF0Y2hfcmVzdWx0cyBjb250YWlucyBubyByZXN1bHRzLgorICAgICAgICogQHJldHZhbCB0cnVlIFRoZSAlbWF0Y2hfcmVzdWx0cyBvYmplY3QgaXMgZW1wdHkuCisgICAgICAgKiBAcmV0dmFsIGZhbHNlIFRoZSAlbWF0Y2hfcmVzdWx0cyBvYmplY3QgaXMgbm90IGVtcHR5LgorICAgICAgICovCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBzaXplKCkgPT0gMDsgfQorICAgICAgCisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogQG5hbWUgMTAuMyBFbGVtZW50IEFjY2VzcworICAgICAgICovCisgICAgICAvL0B7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIGxlbmd0aCBvZiB0aGUgaW5kaWNhdGVkIHN1Ym1hdGNoLgorICAgICAgICogQHBhcmFtIF9fc3ViIGluZGljYXRlcyB0aGUgc3VibWF0Y2guCisgICAgICAgKiBAcHJlICAgcmVhZHkoKSA9PSB0cnVlCisgICAgICAgKgorICAgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGluZGljYXRlZCBzdWJtYXRjaCwgb3IgdGhlCisgICAgICAgKiBsZW5ndGggb2YgdGhlIGVudGlyZSBtYXRjaCBpZiBAcCBfX3N1YiBpcyB6ZXJvICh0aGUgZGVmYXVsdCkuCisgICAgICAgKi8KKyAgICAgIGRpZmZlcmVuY2VfdHlwZQorICAgICAgbGVuZ3RoKHNpemVfdHlwZSBfX3N1YiA9IDApIGNvbnN0CisgICAgICB7IHJldHVybiAoKnRoaXMpW19fc3ViXS5sZW5ndGgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBvZmZzZXQgb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5kaWNhdGVkIHN1Ym1hdGNoLgorICAgICAgICogQHBhcmFtIF9fc3ViIGluZGljYXRlcyB0aGUgc3VibWF0Y2guCisgICAgICAgKiBAcHJlICAgcmVhZHkoKSA9PSB0cnVlCisgICAgICAgKgorICAgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YXJnZXQKKyAgICAgICAqIHNlcXVlbmNlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN1Ym1hdGNoLCB1bmxlc3MgdGhlIHZhbHVlIG9mIEBwIF9fc3ViCisgICAgICAgKiBpcyB6ZXJvICh0aGUgZGVmYXVsdCksIGluIHdoaWNoIGNhc2UgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBvZmZzZXQKKyAgICAgICAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgdGFyZ2V0IHNlcXVlbmNlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICAgICAgKiBtYXRjaC4KKyAgICAgICAqCisgICAgICAgKiBSZXR1cm5zIC0xIGlmIEBwIF9fc3ViIGlzIG91dCBvZiByYW5nZS4KKyAgICAgICAqLworICAgICAgZGlmZmVyZW5jZV90eXBlCisgICAgICBwb3NpdGlvbihzaXplX3R5cGUgX19zdWIgPSAwKSBjb25zdAorICAgICAgeworCXJldHVybiBfX3N1YiA8IHNpemUoKSA/IHN0ZDo6ZGlzdGFuY2UodGhpcy0+cHJlZml4KCkuZmlyc3QsCisJCQkJCSAgICAgICgqdGhpcylbX19zdWJdLmZpcnN0KSA6IC0xOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBtYXRjaCBvciBzdWJtYXRjaCBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgdHlwZS4KKyAgICAgICAqIEBwYXJhbSBfX3N1YiBpbmRpY2F0ZXMgdGhlIHN1Ym1hdGNoLgorICAgICAgICogQHByZSAgIHJlYWR5KCkgPT0gdHJ1ZQorICAgICAgICoKKyAgICAgICAqIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgc3VibWF0Y2ggKG9yIG1hdGNoLCBpZiBAcCBfX3N1YiBpcworICAgICAgICogemVybykgZXh0cmFjdGVkIGZyb20gdGhlIHRhcmdldCByYW5nZSBhbmQgY29udmVydGVkIHRvIHRoZQorICAgICAgICogYXNzb2NpYXRlZCBzdHJpbmcgdHlwZS4KKyAgICAgICAqLworICAgICAgc3RyaW5nX3R5cGUKKyAgICAgIHN0cihzaXplX3R5cGUgX19zdWIgPSAwKSBjb25zdAorICAgICAgeyByZXR1cm4gKCp0aGlzKVtfX3N1Yl0uc3RyKCk7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhICVzdWJfbWF0Y2ggcmVmZXJlbmNlIGZvciB0aGUgbWF0Y2ggb3Igc3VibWF0Y2guCisgICAgICAgKiBAcGFyYW0gX19zdWIgaW5kaWNhdGVzIHRoZSBzdWJtYXRjaC4KKyAgICAgICAqIEBwcmUgICByZWFkeSgpID09IHRydWUKKyAgICAgICAqCisgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGdldHMgYSByZWZlcmVuY2UgdG8gdGhlIGluZGljYXRlZCBzdWJtYXRjaCwgb3IKKyAgICAgICAqIHRoZSBlbnRpcmUgbWF0Y2ggaWYgQHAgX19zdWIgaXMgemVyby4KKyAgICAgICAqCisgICAgICAgKiBJZiBAcCBfX3N1YiA+PSBzaXplKCkgdGhlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSAlc3ViX21hdGNoIHdpdGggYQorICAgICAgICogc3BlY2lhbCB2YWx1ZSBpbmRpY2F0aW5nIG5vIHN1Ym1hdGNoLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fc3ViKSBjb25zdAorICAgICAgeyAKKyAgICAgIAlfR0xJQkNYWF9ERUJVR19BU1NFUlQoIHJlYWR5KCkgKTsKKyAgICAgIAlyZXR1cm4gX19zdWIgPCBzaXplKCkKKwkgICAgICAgPyAgX0Jhc2VfdHlwZTo6b3BlcmF0b3JbXShfX3N1YikKKwkgICAgICAgOiBfX3VubWF0Y2hlZF9zdWI8X0JpX2l0ZXI+KCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgYSAlc3ViX21hdGNoIHJlcHJlc2VudGluZyB0aGUgbWF0Y2ggcHJlZml4LgorICAgICAgICogQHByZSAgIHJlYWR5KCkgPT0gdHJ1ZQorICAgICAgICoKKyAgICAgICAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIHJlZmVyZW5jZSB0byBhICVzdWJfbWF0Y2ggb2JqZWN0IHJlcHJlc2VudGluZyB0aGUKKyAgICAgICAqIHBhcnQgb2YgdGhlIHRhcmdldCByYW5nZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiB0aGUgdGFyZ2V0IHJhbmdlIGFuZCB0aGUKKyAgICAgICAqIHN0YXJ0IG9mIHRoZSBtYXRjaC4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBwcmVmaXgoKSBjb25zdAorICAgICAgeworICAgICAgCV9HTElCQ1hYX0RFQlVHX0FTU0VSVCggcmVhZHkoKSApOworICAgICAgCXJldHVybiAhZW1wdHkoKQorICAgICAgCSAgICAgICA/IF9CYXNlX3R5cGU6Om9wZXJhdG9yW10oX0Jhc2VfdHlwZTo6c2l6ZSgpIC0gMikKKwkgICAgICAgOiBfX3VubWF0Y2hlZF9zdWI8X0JpX2l0ZXI+KCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgYSAlc3ViX21hdGNoIHJlcHJlc2VudGluZyB0aGUgbWF0Y2ggc3VmZml4LgorICAgICAgICogQHByZSAgIHJlYWR5KCkgPT0gdHJ1ZQorICAgICAgICoKKyAgICAgICAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIHJlZmVyZW5jZSB0byBhICVzdWJfbWF0Y2ggb2JqZWN0IHJlcHJlc2VudGluZyB0aGUKKyAgICAgICAqIHBhcnQgb2YgdGhlIHRhcmdldCByYW5nZSBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIG1hdGNoIGFuZCB0aGUgZW5kIG9mCisgICAgICAgKiB0aGUgdGFyZ2V0IHJhbmdlLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIHN1ZmZpeCgpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKCByZWFkeSgpICk7CisJcmV0dXJuICFlbXB0eSgpCisJICAgICAgID8gX0Jhc2VfdHlwZTo6b3BlcmF0b3JbXShfQmFzZV90eXBlOjpzaXplKCkgLSAxKQorCSAgICAgICA6IF9fdW5tYXRjaGVkX3N1YjxfQmlfaXRlcj4oKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhbiBpdGVyYXRvciB0byB0aGUgc3RhcnQgb2YgdGhlICVzdWJfbWF0Y2ggY29sbGVjdGlvbi4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9CYXNlX3R5cGU6OmJlZ2luKCk7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhbiBpdGVyYXRvciB0byB0aGUgc3RhcnQgb2YgdGhlICVzdWJfbWF0Y2ggY29sbGVjdGlvbi4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfQmFzZV90eXBlOjpjYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGFuIGl0ZXJhdG9yIHRvIG9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNvbGxlY3Rpb24uCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gIWVtcHR5KCkgPyBfQmFzZV90eXBlOjplbmQoKSAtIDIgOiBfQmFzZV90eXBlOjplbmQoKTsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGFuIGl0ZXJhdG9yIHRvIG9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNvbGxlY3Rpb24uCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGVuZCgpOyB9CisKKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiBAbmFtZSAxMC40IEZvcm1hdHRpbmcKKyAgICAgICAqCisgICAgICAgKiBUaGVzZSBmdW5jdGlvbnMgcGVyZm9ybSBmb3JtYXR0ZWQgc3Vic3RpdHV0aW9uIG9mIHRoZSBtYXRjaGVkCisgICAgICAgKiBjaGFyYWN0ZXIgc2VxdWVuY2VzIGludG8gdGhlaXIgdGFyZ2V0LiAgVGhlIGZvcm1hdCBzcGVjaWZpZXJzIGFuZAorICAgICAgICogZXNjYXBlIHNlcXVlbmNlcyBhY2NlcHRlZCBieSB0aGVzZSBmdW5jdGlvbnMgYXJlIGRldGVybWluZWQgYnkKKyAgICAgICAqIHRoZWlyIEBwIGZsYWdzIHBhcmFtZXRlciBhcyBkb2N1bWVudGVkIGFib3ZlLgorICAgICAgICovCisgICAgICAgLy9AeworCisgICAgICAvKioKKyAgICAgICAqIEBwcmUgICByZWFkeSgpID09IHRydWUKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0X2l0ZXI+CisgICAgICAgIF9PdXRfaXRlcgorICAgICAgICBmb3JtYXQoX091dF9pdGVyIF9fb3V0LCBjb25zdCBjaGFyX3R5cGUqIF9fZm10X2ZpcnN0LAorCSAgICAgICBjb25zdCBjaGFyX3R5cGUqIF9fZm10X2xhc3QsCisJICAgICAgIG1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjpmb3JtYXRfZGVmYXVsdCkgY29uc3QKKyAgICAgICAgeyByZXR1cm4gX19vdXQ7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAcHJlICAgcmVhZHkoKSA9PSB0cnVlCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRfaXRlciwgdHlwZW5hbWUgX1N0LCB0eXBlbmFtZSBfU2E+CisgICAgICAgIF9PdXRfaXRlcgorICAgICAgICBmb3JtYXQoX091dF9pdGVyIF9fb3V0LCBjb25zdCBiYXNpY19zdHJpbmc8Y2hhcl90eXBlLCBfU3QsIF9TYT4mIF9fZm10LAorCSAgICAgICBtYXRjaF9mbGFnX3R5cGUgX19mbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6Zm9ybWF0X2RlZmF1bHQpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gZm9ybWF0KF9fb3V0LCBfX2ZtdC5kYXRhKCksIF9fZm10LmRhdGEoKSArIF9fZm10LnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZmxhZ3MpOworICAgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQHByZSAgIHJlYWR5KCkgPT0gdHJ1ZQorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0X2l0ZXIsIHR5cGVuYW1lIF9TdCwgdHlwZW5hbWUgX1NhPgorICAgICAgICBiYXNpY19zdHJpbmc8Y2hhcl90eXBlLCBfU3QsIF9TYT4KKyAgICAgICAgZm9ybWF0KGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyX3R5cGUsIF9TdCwgX1NhPiYgX19mbXQsCisJICAgICAgIG1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjpmb3JtYXRfZGVmYXVsdCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgIGJhc2ljX3N0cmluZzxjaGFyX3R5cGUsIF9TdCwgX1NhPiBfX3Jlc3VsdDsKKyAgICAgICAgICBmb3JtYXQoc3RkOjpiYWNrX2luc2VydGVyKF9fcmVzdWx0KSwgX19mbXQsIF9fZmxhZ3MpOworICAgICAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBwcmUgICByZWFkeSgpID09IHRydWUKKyAgICAgICAqLworICAgICAgc3RyaW5nX3R5cGUKKyAgICAgIGZvcm1hdChjb25zdCBjaGFyX3R5cGUqIF9fZm10LAorCSAgICAgbWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MgPSByZWdleF9jb25zdGFudHM6OmZvcm1hdF9kZWZhdWx0KSBjb25zdAorICAgICAgeworICAgICAgICBzdHJpbmdfdHlwZSBfX3Jlc3VsdDsKKyAgICAgICAgZm9ybWF0KHN0ZDo6YmFja19pbnNlcnRlcihfX3Jlc3VsdCksCisgICAgICAgICAgICAgICBfX2ZtdCArIGNoYXJfdHJhaXRzPGNoYXJfdHlwZT46Omxlbmd0aChfX2ZtdCksCisgICAgICAgICAgICAgICBfX2ZsYWdzKTsKKyAgICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgICAgfQorCisgICAgICAvL0B9IAorCisgICAgICAvKioKKyAgICAgICAqIEBuYW1lIDEwLjUgQWxsb2NhdG9yCisgICAgICAgKi8KKyAgICAgIC8vQHsgCisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgYSBjb3B5IG9mIHRoZSBhbGxvY2F0b3IuCisgICAgICAgKi8KKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9CYXNlX3R5cGU6OmdldF9hbGxvY2F0b3IoKTsgfQorICAgICAgCisgICAgICAvL0B9IAorCisgICAgICAvKioKKyAgICAgICAqIEBuYW1lIDEwLjYgU3dhcAorICAgICAgICovCisgICAgICAgLy9AeyAKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU3dhcHMgdGhlIGNvbnRlbnRzIG9mIHR3byBtYXRjaF9yZXN1bHRzLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzd2FwKG1hdGNoX3Jlc3VsdHMmIF9fdGhhdCkKKyAgICAgIHsgX0Jhc2VfdHlwZTo6c3dhcChfX3RoYXQpOyB9CisgICAgICAvL0B9IAorICAgICAgCisgICAgcHJpdmF0ZToKKyAgICAgIGZyaWVuZCBjbGFzcyBfX2RldGFpbDo6X1NwZWNpYWxpemVkUmVzdWx0czxfQmlfaXRlciwgX0FsbG9jPjsKKyAgICB9OworICAKKyAgdHlwZWRlZiBtYXRjaF9yZXN1bHRzPGNvbnN0IGNoYXIqPiAgICAgICAgICAgICBjbWF0Y2g7CisgIHR5cGVkZWYgbWF0Y2hfcmVzdWx0czxzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPiAgc21hdGNoOworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHR5cGVkZWYgbWF0Y2hfcmVzdWx0czxjb25zdCB3Y2hhcl90Kj4gICAgICAgICAgd2NtYXRjaDsKKyAgdHlwZWRlZiBtYXRjaF9yZXN1bHRzPHdzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPiB3c21hdGNoOworI2VuZGlmCisKKyAgLy8gbWF0Y2hfcmVzdWx0cyBjb21wYXJpc29ucworICAvKioKKyAgICogQGJyaWVmIENvbXBhcmVzIHR3byBtYXRjaF9yZXN1bHRzIGZvciBlcXVhbGl0eS4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgcmVmZXIgdG8gdGhlIHNhbWUgbWF0Y2gsCisgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXIsIF9BbGxvYz4mIF9fbTEsCisJICAgICAgIGNvbnN0IG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXIsIF9BbGxvYz4mIF9fbTIpCisgICAgeworICAgICAgaWYgKF9fbTEucmVhZHkoKSAhPSBfX20yLnJlYWR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghX19tMS5yZWFkeSgpKSAgLy8gYm90aCBhcmUgbm90IHJlYWR5CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKF9fbTEuZW1wdHkoKSAhPSBfX20yLmVtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmIChfX20xLmVtcHR5KCkpICAgLy8gYm90aCBhcmUgZW1wdHkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gX19tMS5wcmVmaXgoKSA9PSBfX20yLnByZWZpeCgpCisgICAgICAgICYmIF9fbTEuc2l6ZSgpID09IF9fbTIuc2l6ZSgpCisgICAgICAgICYmIHN0ZDo6ZXF1YWwoX19tMS5iZWdpbigpLCBfX20xLmVuZCgpLCBfX20yLmJlZ2luKCkpCisgICAgICAgICYmIF9fbTEuc3VmZml4KCkgPT0gX19tMi5zdWZmaXgoKTsKKyAgICB9CisKKyAgLyoqCisgICAqIEBicmllZiBDb21wYXJlcyB0d28gbWF0Y2hfcmVzdWx0cyBmb3IgaW5lcXVhbGl0eS4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgZG8gbm90IHJlZmVyIHRvIHRoZSBzYW1lIG1hdGNoLAorICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBtYXRjaF9yZXN1bHRzPF9CaV9pdGVyLCBfQWxsb2M+JiBfX20xLAorCSAgICAgICBjb25zdCBtYXRjaF9yZXN1bHRzPF9CaV9pdGVyLCBfQWxsb2M+JiBfX20yKQorICAgIHsgcmV0dXJuICEoX19tMSA9PSBfX20yKTsgfQorCisgIC8vIFs3LjEwLjZdIG1hdGNoX3Jlc3VsdHMgc3dhcAorICAvKioKKyAgICogQGJyaWVmIFN3YXBzIHR3byBtYXRjaCByZXN1bHRzLgorICAgKiBAcGFyYW0gX19saHMgQSBtYXRjaCByZXN1bHQuCisgICAqIEBwYXJhbSBfX3JocyBBIG1hdGNoIHJlc3VsdC4KKyAgICoKKyAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSB0d28gbWF0Y2hfcmVzdWx0cyBvYmplY3RzIGFyZSBzd2FwcGVkLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAobWF0Y2hfcmVzdWx0czxfQmlfaXRlciwgX0FsbG9jPiYgX19saHMsCisJIG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXIsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgX19saHMuc3dhcChfX3Jocyk7IH0KKworICAvLyBbNy4xMS4yXSBGdW5jdGlvbiB0ZW1wbGF0ZSByZWdleF9tYXRjaAorICAvKioKKyAgICogQG5hbWUgTWF0Y2hpbmcsIFNlYXJjaGluZywgYW5kIFJlcGxhY2luZworICAgKi8KKyAgLy9AeworCisgIC8qKgorICAgKiBAYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGVyZSBpcyBhIG1hdGNoIGJldHdlZW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBAcCBlCisgICAqIGFuZCBhbGwgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBbZmlyc3QsIGxhc3QpLgorICAgKgorICAgKiBAcGFyYW0gX19zICAgICBTdGFydCBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIHRvIG1hdGNoLgorICAgKiBAcGFyYW0gX19lICAgICBPbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgdG8gbWF0Y2guCisgICAqIEBwYXJhbSBfX20gICAgIFRoZSBtYXRjaCByZXN1bHRzLgorICAgKiBAcGFyYW0gX19yZSAgICBUaGUgcmVndWxhciBleHByZXNzaW9uLgorICAgKiBAcGFyYW0gX19mbGFncyBDb250cm9scyBob3cgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLgorICAgKgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggZXhpc3RzLgorICAgKiBAcmV0dmFsIGZhbHNlIE90aGVyd2lzZS4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICoKKyAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfUnhfdHJhaXRzPgorICAgIGJvb2wKKyAgICByZWdleF9tYXRjaChfQmlfaXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcywKKyAgICAgICAgICAgICAgICBfQmlfaXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZSwKKyAgICAgICAgICAgICAgICBtYXRjaF9yZXN1bHRzPF9CaV9pdGVyLCBfQWxsb2M+JiAgICAgX19tLAorICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yZSwKKyAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSAgICAgICAgIF9fZmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKKyAgICB7CisgICAgICBfX2RldGFpbDo6X0F1dG9tYXRvblB0ciBfX2EgPSBfX3JlLl9NX2dldF9hdXRvbWF0b24oKTsKKyAgICAgIF9fZGV0YWlsOjpfQXV0b21hdG9uOjpfU2l6ZVQgX19zeiA9IF9fYS0+X01fc3ViX2NvdW50KCk7CisgICAgICBfX2RldGFpbDo6X1NwZWNpYWxpemVkQ3Vyc29yPF9CaV9pdGVyPiBfX2NzKF9fcywgX19lKTsKKyAgICAgIF9fZGV0YWlsOjpfU3BlY2lhbGl6ZWRSZXN1bHRzPF9CaV9pdGVyLCBfQWxsb2M+IF9fcihfX3N6LCBfX2NzLCBfX20pOworICAgICAgX19kZXRhaWw6Ol9HcmVwX21hdGNoZXIgX19tYXRjaGVyKF9fY3MsIF9fciwgX19hLCBfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX21bMF0ubWF0Y2hlZDsKKyAgICB9CisKKyAgLyoqCisgICAqIEBicmllZiBJbmRpY2F0ZXMgaWYgdGhlcmUgaXMgYSBtYXRjaCBiZXR3ZWVuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gQHAgZQorICAgKiBhbmQgYWxsIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgW2ZpcnN0LCBsYXN0KS4KKyAgICoKKyAgICogQHBhcmFtIF9fZmlyc3QgQmVnaW5uaW5nIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgdG8gbWF0Y2guCisgICAqIEBwYXJhbSBfX2xhc3QgIE9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSB0byBtYXRjaC4KKyAgICogQHBhcmFtIF9fcmUgICAgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICogQHBhcmFtIF9fZmxhZ3MgQ29udHJvbHMgaG93IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZC4KKyAgICoKKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIGV4aXN0cy4KKyAgICogQHJldHZhbCBmYWxzZSBPdGhlcndpc2UuCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgYm9vbAorICAgIHJlZ2V4X21hdGNoKF9CaV9pdGVyIF9fZmlyc3QsIF9CaV9pdGVyIF9fbGFzdCwKKwkJY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX3JlLAorCQlyZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzCisJCT0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgCisgICAgICBtYXRjaF9yZXN1bHRzPF9CaV9pdGVyPiBfX3doYXQ7CisgICAgICByZXR1cm4gcmVnZXhfbWF0Y2goX19maXJzdCwgX19sYXN0LCBfX3doYXQsIF9fcmUsIF9fZmxhZ3MpOworICAgIH0KKworICAvKioKKyAgICogQGJyaWVmIERldGVybWluZXMgaWYgdGhlcmUgaXMgYSBtYXRjaCBiZXR3ZWVuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gQHAgZQorICAgKiBhbmQgYSBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcuCisgICAqCisgICAqIEBwYXJhbSBfX3MgIFRoZSBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcgdG8gbWF0Y2guCisgICAqIEBwYXJhbSBfX20gIFRoZSBtYXRjaCByZXN1bHRzLgorICAgKiBAcGFyYW0gX19yZSBUaGUgcmVndWxhciBleHByZXNzaW9uLgorICAgKiBAcGFyYW0gX19mICBDb250cm9scyBob3cgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLgorICAgKgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggZXhpc3RzLgorICAgKiBAcmV0dmFsIGZhbHNlIE90aGVyd2lzZS4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICByZWdleF9tYXRjaChjb25zdCBfQ2hfdHlwZSogX19zLAorCQltYXRjaF9yZXN1bHRzPGNvbnN0IF9DaF90eXBlKiwgX0FsbG9jPiYgX19tLAorCQljb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fcmUsCisJCXJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZgorCQk9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKKyAgICB7IHJldHVybiByZWdleF9tYXRjaChfX3MsIF9fcyArIF9SeF90cmFpdHM6Omxlbmd0aChfX3MpLCBfX20sIF9fcmUsIF9fZik7IH0KKworICAvKioKKyAgICogQGJyaWVmIERldGVybWluZXMgaWYgdGhlcmUgaXMgYSBtYXRjaCBiZXR3ZWVuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gQHAgZQorICAgKiBhbmQgYSBzdHJpbmcuCisgICAqCisgICAqIEBwYXJhbSBfX3MgICAgIFRoZSBzdHJpbmcgdG8gbWF0Y2guCisgICAqIEBwYXJhbSBfX20gICAgIFRoZSBtYXRjaCByZXN1bHRzLgorICAgKiBAcGFyYW0gX19yZSAgICBUaGUgcmVndWxhciBleHByZXNzaW9uLgorICAgKiBAcGFyYW0gX19mbGFncyBDb250cm9scyBob3cgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLgorICAgKgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggZXhpc3RzLgorICAgKiBAcmV0dmFsIGZhbHNlIE90aGVyd2lzZS4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYywKKwkgICB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfbWF0Y2goY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlLCBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3MsCisJCW1hdGNoX3Jlc3VsdHM8dHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaF90eXBlLCAKKwkJX0NoX3RyYWl0cywgX0NoX2FsbG9jPjo6Y29uc3RfaXRlcmF0b3IsIF9BbGxvYz4mIF9fbSwKKwkJY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX3JlLAorCQlyZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzCisJCT0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgcmV0dXJuIHJlZ2V4X21hdGNoKF9fcy5iZWdpbigpLCBfX3MuZW5kKCksIF9fbSwgX19yZSwgX19mbGFncyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIEluZGljYXRlcyBpZiB0aGVyZSBpcyBhIG1hdGNoIGJldHdlZW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBAcCBlCisgICAqIGFuZCBhIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KKyAgICoKKyAgICogQHBhcmFtIF9fcyAgVGhlIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byBtYXRjaC4KKyAgICogQHBhcmFtIF9fcmUgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICogQHBhcmFtIF9fZiAgQ29udHJvbHMgaG93IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZC4KKyAgICoKKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIGV4aXN0cy4KKyAgICogQHJldHZhbCBmYWxzZSBPdGhlcndpc2UuCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZSwgY2xhc3MgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlZ2V4X21hdGNoKGNvbnN0IF9DaF90eXBlKiBfX3MsCisJCWNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yZSwKKwkJcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mCisJCT0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgcmV0dXJuIHJlZ2V4X21hdGNoKF9fcywgX19zICsgX1J4X3RyYWl0czo6bGVuZ3RoKF9fcyksIF9fcmUsIF9fZik7IH0KKworICAvKioKKyAgICogQGJyaWVmIEluZGljYXRlcyBpZiB0aGVyZSBpcyBhIG1hdGNoIGJldHdlZW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBAcCBlCisgICAqIGFuZCBhIHN0cmluZy4KKyAgICoKKyAgICogQHBhcmFtIF9fcyAgICAgW0lOXSBUaGUgc3RyaW5nIHRvIG1hdGNoLgorICAgKiBAcGFyYW0gX19yZSAgICBbSU5dIFRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqIEBwYXJhbSBfX2ZsYWdzIFtJTl0gQ29udHJvbHMgaG93IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZC4KKyAgICoKKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIGV4aXN0cy4KKyAgICogQHJldHZhbCBmYWxzZSBPdGhlcndpc2UuCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfU3RyX2FsbG9jYXRvciwKKwkgICB0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlZ2V4X21hdGNoKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hfdHlwZSwgX0NoX3RyYWl0cywgX1N0cl9hbGxvY2F0b3I+JiBfX3MsCisJCWNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yZSwKKwkJcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncworCQk9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKKyAgICB7IHJldHVybiByZWdleF9tYXRjaChfX3MuYmVnaW4oKSwgX19zLmVuZCgpLCBfX3JlLCBfX2ZsYWdzKTsgfQorCisgIC8vIFs3LjExLjNdIEZ1bmN0aW9uIHRlbXBsYXRlIHJlZ2V4X3NlYXJjaAorICAvKioKKyAgICogU2VhcmNoZXMgZm9yIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGhpbiBhIHJhbmdlLgorICAgKiBAcGFyYW0gX19maXJzdCBbSU5dICBUaGUgc3RhcnQgb2YgdGhlIHN0cmluZyB0byBzZWFyY2guCisgICAqIEBwYXJhbSBfX2xhc3QgIFtJTl0gIE9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIHN0cmluZyB0byBzZWFyY2guCisgICAqIEBwYXJhbSBfX20gICAgIFtPVVRdIFRoZSBtYXRjaCByZXN1bHRzLgorICAgKiBAcGFyYW0gX19yZSAgICBbSU5dICBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIHNlYXJjaCBmb3IuCisgICAqIEBwYXJhbSBfX2ZsYWdzIFtJTl0gIFNlYXJjaCBwb2xpY3kgZmxhZ3MuCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEByZXR2YWwgZmFsc2UgTm8gbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLCB0aGUgY29udGVudCBvZiAlbSBpcworICAgKiAgICAgICAgICAgICAgIHVuZGVmaW5lZC4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICoKKyAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfc2VhcmNoKF9CaV9pdGVyIF9fZmlyc3QsIF9CaV9pdGVyIF9fbGFzdCwKKwkJIG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXIsIF9BbGxvYz4mIF9fbSwKKwkJIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yZSwKKwkJIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLyoqCisgICAqIFNlYXJjaGVzIGZvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gYSByYW5nZS4KKyAgICogQHBhcmFtIF9fZmlyc3QgW0lOXSAgVGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcgdG8gc2VhcmNoLgorICAgKiBAcGFyYW0gX19sYXN0ICBbSU5dICBPbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBzdHJpbmcgdG8gc2VhcmNoLgorICAgKiBAcGFyYW0gX19yZSAgICBbSU5dICBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIHNlYXJjaCBmb3IuCisgICAqIEBwYXJhbSBfX2ZsYWdzIFtJTl0gIFNlYXJjaCBwb2xpY3kgZmxhZ3MuCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEByZXR2YWwgZmFsc2UgTm8gbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLgorICAgKiBAZG9jdG9kbworICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfc2VhcmNoKF9CaV9pdGVyIF9fZmlyc3QsIF9CaV9pdGVyIF9fbGFzdCwKKwkJIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yZSwKKwkJIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsKKyAgICAgIG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXI+IF9fd2hhdDsKKyAgICAgIHJldHVybiByZWdleF9zZWFyY2goX19maXJzdCwgX19sYXN0LCBfX3doYXQsIF9fcmUsIF9fZmxhZ3MpOworICAgIH0KKworICAvKioKKyAgICogQGJyaWVmIFNlYXJjaGVzIGZvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gYSBDLXN0cmluZy4KKyAgICogQHBhcmFtIF9fcyBbSU5dICBBIEMtc3RyaW5nIHRvIHNlYXJjaCBmb3IgdGhlIHJlZ2V4LgorICAgKiBAcGFyYW0gX19tIFtPVVRdIFRoZSBzZXQgb2YgcmVnZXggbWF0Y2hlcy4KKyAgICogQHBhcmFtIF9fZSBbSU5dICBUaGUgcmVnZXggdG8gc2VhcmNoIGZvciBpbiBAcCBzLgorICAgKiBAcGFyYW0gX19mIFtJTl0gIFRoZSBzZWFyY2ggZmxhZ3MuCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEByZXR2YWwgZmFsc2UgTm8gbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLCB0aGUgY29udGVudCBvZiAlbSBpcworICAgKiAgICAgICAgICAgICAgIHVuZGVmaW5lZC4KKyAgICogQGRvY3RvZG8KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlLCBjbGFzcyBfQWxsb2MsIGNsYXNzIF9SeF90cmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICByZWdleF9zZWFyY2goY29uc3QgX0NoX3R5cGUqIF9fcywKKwkJIG1hdGNoX3Jlc3VsdHM8Y29uc3QgX0NoX3R5cGUqLCBfQWxsb2M+JiBfX20sCisJCSBjb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fZSwKKwkJIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZgorCQkgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gcmVnZXhfc2VhcmNoKF9fcywgX19zICsgX1J4X3RyYWl0czo6bGVuZ3RoKF9fcyksIF9fbSwgX19lLCBfX2YpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBTZWFyY2hlcyBmb3IgYSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aGluIGEgQy1zdHJpbmcuCisgICAqIEBwYXJhbSBfX3MgW0lOXSAgVGhlIEMtc3RyaW5nIHRvIHNlYXJjaC4KKyAgICogQHBhcmFtIF9fZSBbSU5dICBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIHNlYXJjaCBmb3IuCisgICAqIEBwYXJhbSBfX2YgW0lOXSAgU2VhcmNoIHBvbGljeSBmbGFncy4KKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZy4KKyAgICogQHJldHZhbCBmYWxzZSBObyBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEBkb2N0b2RvCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlZ2V4X3NlYXJjaChjb25zdCBfQ2hfdHlwZSogX19zLAorCQkgY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX2UsCisJCSByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2YKKwkJID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgcmV0dXJuIHJlZ2V4X3NlYXJjaChfX3MsIF9fcyArIF9SeF90cmFpdHM6Omxlbmd0aChfX3MpLCBfX2UsIF9fZik7IH0KKworICAvKioKKyAgICogQGJyaWVmIFNlYXJjaGVzIGZvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gYSBzdHJpbmcuCisgICAqIEBwYXJhbSBfX3MgICAgIFtJTl0gIFRoZSBzdHJpbmcgdG8gc2VhcmNoLgorICAgKiBAcGFyYW0gX19lICAgICBbSU5dICBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIHNlYXJjaCBmb3IuCisgICAqIEBwYXJhbSBfX2ZsYWdzIFtJTl0gIFNlYXJjaCBwb2xpY3kgZmxhZ3MuCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEByZXR2YWwgZmFsc2UgTm8gbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLgorICAgKiBAZG9jdG9kbworICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX1N0cmluZ19hbGxvY2F0b3IsCisJICAgdHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICByZWdleF9zZWFyY2goY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlLCBfQ2hfdHJhaXRzLAorCQkgX1N0cmluZ19hbGxvY2F0b3I+JiBfX3MsCisJCSBjb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fZSwKKwkJIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgcmV0dXJuIHJlZ2V4X3NlYXJjaChfX3MuYmVnaW4oKSwgX19zLmVuZCgpLCBfX2UsIF9fZmxhZ3MpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBTZWFyY2hlcyBmb3IgYSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aGluIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gX19zIFtJTl0gIEEgQysrIHN0cmluZyB0byBzZWFyY2ggZm9yIHRoZSByZWdleC4KKyAgICogQHBhcmFtIF9fbSBbT1VUXSBUaGUgc2V0IG9mIHJlZ2V4IG1hdGNoZXMuCisgICAqIEBwYXJhbSBfX2UgW0lOXSAgVGhlIHJlZ2V4IHRvIHNlYXJjaCBmb3IgaW4gQHAgcy4KKyAgICogQHBhcmFtIF9fZiBbSU5dICBUaGUgc2VhcmNoIGZsYWdzLgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLgorICAgKiBAcmV0dmFsIGZhbHNlIE5vIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZywgdGhlIGNvbnRlbnQgb2YgJW0gaXMKKyAgICogICAgICAgICAgICAgICB1bmRlZmluZWQuCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2MsCisJICAgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfQ2hfdHlwZSwKKwkgICB0eXBlbmFtZSBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfc2VhcmNoKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hfdHlwZSwgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19zLAorCQkgbWF0Y2hfcmVzdWx0czx0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoX3R5cGUsCisJCSBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+Ojpjb25zdF9pdGVyYXRvciwgX0FsbG9jPiYgX19tLAorCQkgY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX2UsCisJCSByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2YKKwkJID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgcmV0dXJuIHJlZ2V4X3NlYXJjaChfX3MuYmVnaW4oKSwgX19zLmVuZCgpLCBfX20sIF9fZSwgX19mKTsgfQorCisgIC8vIHN0ZCBbMjguMTEuNF0gRnVuY3Rpb24gdGVtcGxhdGUgcmVnZXhfcmVwbGFjZQorICAvKioKKyAgICogQGRvY3RvZG8KKyAgICogQHBhcmFtIF9fb3V0CisgICAqIEBwYXJhbSBfX2ZpcnN0CisgICAqIEBwYXJhbSBfX2xhc3QKKyAgICogQHBhcmFtIF9fZQorICAgKiBAcGFyYW0gX19mbXQKKyAgICogQHBhcmFtIF9fZmxhZ3MKKyAgICoKKyAgICogQHJldHVybnMgb3V0CisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqCisgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX091dF9pdGVyLCB0eXBlbmFtZSBfQmlfaXRlciwKKwkgICB0eXBlbmFtZSBfUnhfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfdHlwZT4KKyAgICBpbmxpbmUgX091dF9pdGVyCisgICAgcmVnZXhfcmVwbGFjZShfT3V0X2l0ZXIgX19vdXQsIF9CaV9pdGVyIF9fZmlyc3QsIF9CaV9pdGVyIF9fbGFzdCwKKwkJICBjb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fZSwKKwkJICBjb25zdCBiYXNpY19zdHJpbmc8X0NoX3R5cGU+JiBfX2ZtdCwKKwkJICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzCisJCSAgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gX19vdXQ7IH0KKworICAvKioKKyAgICogQGRvY3RvZG8KKyAgICogQHBhcmFtIF9fcworICAgKiBAcGFyYW0gX19lCisgICAqIEBwYXJhbSBfX2ZtdAorICAgKiBAcGFyYW0gX19mbGFncworICAgKgorICAgKiBAcmV0dXJucyBhIGNvcHkgb2Ygc3RyaW5nIEBwIHMgd2l0aCByZXBsYWNlbWVudHMuCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUnhfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfdHlwZT4KKyAgICBpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaF90eXBlPgorICAgIHJlZ2V4X3JlcGxhY2UoY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlPiYgX19zLAorCQkgIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19lLAorCQkgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hfdHlwZT4mIF9fZm10LAorCQkgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJICA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKKyAgICB7CisgICAgICBiYXNpY19zdHJpbmc8X0NoX3R5cGU+IF9fcmVzdWx0OworICAgICAgcmVnZXhfcmVwbGFjZShzdGQ6OmJhY2tfaW5zZXJ0ZXIoX19yZXN1bHQpLAorCQkgICAgX19zLmJlZ2luKCksIF9fcy5lbmQoKSwgX19lLCBfX2ZtdCwgX19mbGFncyk7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8vQH0KKworICAvLyBzdGQgWzI4LjEyXSBDbGFzcyB0ZW1wbGF0ZSByZWdleF9pdGVyYXRvcgorICAvKioKKyAgICogQW4gaXRlcmF0b3IgYWRhcHRvciB0aGF0IHdpbGwgcHJvdmlkZSByZXBlYXRlZCBjYWxscyBvZiByZWdleF9zZWFyY2ggb3ZlciAKKyAgICogYSByYW5nZSB1bnRpbCBubyBtb3JlIG1hdGNoZXMgcmVtYWluLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsCisJICAgdHlwZW5hbWUgX0NoX3R5cGUgPSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgIHR5cGVuYW1lIF9SeF90cmFpdHMgPSByZWdleF90cmFpdHM8X0NoX3R5cGU+ID4KKyAgICBjbGFzcyByZWdleF9pdGVyYXRvcgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiAgcmVnZXhfdHlwZTsKKyAgICAgIHR5cGVkZWYgbWF0Y2hfcmVzdWx0czxfQmlfaXRlcj4gICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUHJvdmlkZXMgYSBzaW5ndWxhciBpdGVyYXRvciwgdXNlZnVsIGZvciBpbmRpY2F0aW5nCisgICAgICAgKiBvbmUtcGFzdC10aGUtZW5kIG9mIGEgcmFuZ2UuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIEBkb2N0b2RvCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X2l0ZXJhdG9yKCk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhICVyZWdleF9pdGVyYXRvci4uLgorICAgICAgICogQHBhcmFtIF9fYSAgW0lOXSBUaGUgc3RhcnQgb2YgYSB0ZXh0IHJhbmdlIHRvIHNlYXJjaC4KKyAgICAgICAqIEBwYXJhbSBfX2IgIFtJTl0gT25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgdGV4dCByYW5nZSB0byBzZWFyY2guCisgICAgICAgKiBAcGFyYW0gX19yZSBbSU5dIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2guCisgICAgICAgKiBAcGFyYW0gX19tICBbSU5dIFBvbGljeSBmbGFncyBmb3IgbWF0Y2ggcnVsZXMuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIEBkb2N0b2RvCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X2l0ZXJhdG9yKF9CaV9pdGVyIF9fYSwgX0JpX2l0ZXIgX19iLCBjb25zdCByZWdleF90eXBlJiBfX3JlLAorCQkgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fbQorCQkgICAgID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KTsKKworICAgICAgLyoqCisgICAgICAgKiBDb3B5IGNvbnN0cnVjdHMgYSAlcmVnZXhfaXRlcmF0b3IuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIEBkb2N0b2RvCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X2l0ZXJhdG9yKGNvbnN0IHJlZ2V4X2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICByZWdleF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCByZWdleF9pdGVyYXRvciYgX19yaHMpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCByZWdleF9pdGVyYXRvciYgX19yaHMpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCByZWdleF9pdGVyYXRvciYgX19yaHMpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgY29uc3QgdmFsdWVfdHlwZSYKKyAgICAgIG9wZXJhdG9yKigpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgY29uc3QgdmFsdWVfdHlwZSoKKyAgICAgIG9wZXJhdG9yLT4oKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIEBkb2N0b2RvCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgcmVnZXhfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKysoaW50KTsKKyAgICAgIAorICAgIHByaXZhdGU6CisgICAgICAvLyB0aGVzZSBtZW1iZXJzIGFyZSBzaG93biBmb3IgZXhwb3NpdGlvbiBvbmx5OgorICAgICAgX0JpX2l0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW47CisgICAgICBfQmlfaXRlciAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ7CisgICAgICBjb25zdCByZWdleF90eXBlKiAgICAgICAgICAgICAgICBwcmVnZXg7CisgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBmbGFnczsKKyAgICAgIG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXI+ICAgICAgICAgIG1hdGNoOworICAgIH07CisgIAorICB0eXBlZGVmIHJlZ2V4X2l0ZXJhdG9yPGNvbnN0IGNoYXIqPiAgICAgICAgICAgICBjcmVnZXhfaXRlcmF0b3I7CisgIHR5cGVkZWYgcmVnZXhfaXRlcmF0b3I8c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gIHNyZWdleF9pdGVyYXRvcjsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0eXBlZGVmIHJlZ2V4X2l0ZXJhdG9yPGNvbnN0IHdjaGFyX3QqPiAgICAgICAgICB3Y3JlZ2V4X2l0ZXJhdG9yOworICB0eXBlZGVmIHJlZ2V4X2l0ZXJhdG9yPHdzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPiB3c3JlZ2V4X2l0ZXJhdG9yOworI2VuZGlmCisKKyAgLy8gWzcuMTIuMl0gQ2xhc3MgdGVtcGxhdGUgcmVnZXhfdG9rZW5faXRlcmF0b3IKKyAgLyoqCisgICAqIEl0ZXJhdGVzIG92ZXIgc3VibWF0Y2hlcyBpbiBhIHJhbmdlIChvciBAYSBzcGxpdHMgYSB0ZXh0IHN0cmluZykuCisgICAqCisgICAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgaXRlcmF0b3IgaXMgdG8gZW51bWVyYXRlIGFsbCwgb3IgYWxsIHNwZWNpZmllZCwKKyAgICogbWF0Y2hlcyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gYSB0ZXh0IHJhbmdlLiAgVGhlIGRlcmVmZXJlbmNlZAorICAgKiB2YWx1ZSBvZiBhbiBpdGVyYXRvciBvZiB0aGlzIGNsYXNzIGlzIGEgc3RkOjpzdWJfbWF0Y2ggb2JqZWN0LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsCisJICAgdHlwZW5hbWUgX0NoX3R5cGUgPSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgIHR5cGVuYW1lIF9SeF90cmFpdHMgPSByZWdleF90cmFpdHM8X0NoX3R5cGU+ID4KKyAgICBjbGFzcyByZWdleF90b2tlbl9pdGVyYXRvcgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiByZWdleF90eXBlOworICAgICAgdHlwZWRlZiBzdWJfbWF0Y2g8X0JpX2l0ZXI+ICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIAorICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIERlZmF1bHQgY29uc3RydWN0cyBhICVyZWdleF90b2tlbl9pdGVyYXRvci4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogCisgICAgICAgKiBBIGRlZmF1bHQtY29uc3RydWN0ZWQgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yIGlzIGEgc2luZ3VsYXIgaXRlcmF0b3IKKyAgICAgICAqIHRoYXQgd2lsbCBjb21wYXJlIGVxdWFsIHRvIHRoZSBvbmUtcGFzdC10aGUtZW5kIHZhbHVlIGZvciBhbnkKKyAgICAgICAqIGl0ZXJhdG9yIG9mIHRoZSBzYW1lIHR5cGUuCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKCk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhICVyZWdleF90b2tlbl9pdGVyYXRvci4uLgorICAgICAgICogQHBhcmFtIF9fYSAgICAgICAgICBbSU5dIFRoZSBzdGFydCBvZiB0aGUgdGV4dCB0byBzZWFyY2guCisgICAgICAgKiBAcGFyYW0gX19iICAgICAgICAgIFtJTl0gT25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgdGV4dCB0byBzZWFyY2guCisgICAgICAgKiBAcGFyYW0gX19yZSAgICAgICAgIFtJTl0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzZWFyY2ggZm9yLgorICAgICAgICogQHBhcmFtIF9fc3VibWF0Y2ggICBbSU5dIFdoaWNoIHN1Ym1hdGNoIHRvIHJldHVybi4gIFRoZXJlIGFyZSBzb21lCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwgdmFsdWVzIGZvciB0aGlzIHBhcmFtZXRlcjoKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgLSAtMSBlYWNoIGVudW1lcmF0ZWQgc3ViZXhwcmVzc2lvbiBkb2VzIE5PVAorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gKGFrYSBmaWVsZAorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0dGluZykKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgLSAwIHRoZSBlbnRpcmUgc3RyaW5nIG1hdGNoaW5nIHRoZQorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmV4cHJlc3Npb24gaXMgcmV0dXJuZWQgZm9yIGVhY2ggbWF0Y2gKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoaW4gdGhlIHRleHQuCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIC0gPjAgZW51bWVyYXRlcyBvbmx5IHRoZSBpbmRpY2F0ZWQKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJleHByZXNzaW9uIGZyb20gYSBtYXRjaCB3aXRoaW4gdGhlIHRleHQuCisgICAgICAgKiBAcGFyYW0gX19tICAgICAgICAgIFtJTl0gUG9saWN5IGZsYWdzIGZvciBtYXRjaCBydWxlcy4KKyAgICAgICAqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIEBkb2N0b2RvCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKF9CaV9pdGVyIF9fYSwgX0JpX2l0ZXIgX19iLCBjb25zdCByZWdleF90eXBlJiBfX3JlLAorCQkJICAgaW50IF9fc3VibWF0Y2ggPSAwLAorCQkJICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19tCisJCQkgICA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCk7CisKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhICVyZWdleF90b2tlbl9pdGVyYXRvci4uLgorICAgICAgICogQHBhcmFtIF9fYSAgICAgICAgICBbSU5dIFRoZSBzdGFydCBvZiB0aGUgdGV4dCB0byBzZWFyY2guCisgICAgICAgKiBAcGFyYW0gX19iICAgICAgICAgIFtJTl0gT25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgdGV4dCB0byBzZWFyY2guCisgICAgICAgKiBAcGFyYW0gX19yZSAgICAgICAgIFtJTl0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzZWFyY2ggZm9yLgorICAgICAgICogQHBhcmFtIF9fc3VibWF0Y2hlcyBbSU5dIEEgbGlzdCBvZiBzdWJleHByZXNzaW9ucyB0byByZXR1cm4gZm9yIGVhY2gKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhciBleHByZXNzaW9uIG1hdGNoIHdpdGhpbiB0aGUgdGV4dC4KKyAgICAgICAqIEBwYXJhbSBfX20gICAgICAgICAgW0lOXSBQb2xpY3kgZmxhZ3MgZm9yIG1hdGNoIHJ1bGVzLgorICAgICAgICoKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoX0JpX2l0ZXIgX19hLCBfQmlfaXRlciBfX2IsCisJCQkgICBjb25zdCByZWdleF90eXBlJiBfX3JlLAorCQkJICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgX19zdWJtYXRjaGVzLAorCQkJICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19tCisJCQkgICAgID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KTsKKworICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yLi4uCisgICAgICAgKiBAcGFyYW0gX19hICAgICAgICAgIFtJTl0gVGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHNlYXJjaC4KKyAgICAgICAqIEBwYXJhbSBfX2IgICAgICAgICAgW0lOXSBPbmUtcGFzdC10aGUtZW5kIG9mIHRoZSB0ZXh0IHRvIHNlYXJjaC4KKyAgICAgICAqIEBwYXJhbSBfX3JlICAgICAgICAgW0lOXSBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIHNlYXJjaCBmb3IuCisgICAgICAgKiBAcGFyYW0gX19zdWJtYXRjaGVzIFtJTl0gQSBsaXN0IG9mIHN1YmV4cHJlc3Npb25zIHRvIHJldHVybiBmb3IgZWFjaAorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCB3aXRoaW4gdGhlIHRleHQuCisgICAgICAgKiBAcGFyYW0gX19tICAgICAgICAgIFtJTl0gUG9saWN5IGZsYWdzIGZvciBtYXRjaCBydWxlcy4KKyAgICAgICAKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX05tPgorICAgICAgICByZWdleF90b2tlbl9pdGVyYXRvcihfQmlfaXRlciBfX2EsIF9CaV9pdGVyIF9fYiwKKwkJCSAgICAgY29uc3QgcmVnZXhfdHlwZSYgX19yZSwKKwkJCSAgICAgY29uc3QgaW50ICgmX19zdWJtYXRjaGVzKVtfTm1dLAorCQkJICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX20KKwkJCSAgICAgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb3B5IGNvbnN0cnVjdHMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IuCisgICAgICAgKiBAcGFyYW0gX19yaHMgW0lOXSBBICVyZWdleF90b2tlbl9pdGVyYXRvciB0byBjb3B5LgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKGNvbnN0IHJlZ2V4X3Rva2VuX2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEFzc2lnbnMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IgdG8gYW5vdGhlci4KKyAgICAgICAqIEBwYXJhbSBfX3JocyBbSU5dIEEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yIHRvIGNvcHkuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgcmVnZXhfdG9rZW5faXRlcmF0b3ImCisgICAgICBvcGVyYXRvcj0oY29uc3QgcmVnZXhfdG9rZW5faXRlcmF0b3ImIF9fcmhzKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29tcGFyZXMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IgdG8gYW5vdGhlciBmb3IgZXF1YWxpdHkuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCByZWdleF90b2tlbl9pdGVyYXRvciYgX19yaHMpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb21wYXJlcyBhICVyZWdleF90b2tlbl9pdGVyYXRvciB0byBhbm90aGVyIGZvciBpbmVxdWFsaXR5LgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgcmVnZXhfdG9rZW5faXRlcmF0b3ImIF9fcmhzKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRGVyZWZlcmVuY2VzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yLgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIGNvbnN0IHZhbHVlX3R5cGUmCisgICAgICBvcGVyYXRvciooKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2VsZWN0cyBhICVyZWdleF90b2tlbl9pdGVyYXRvciBtZW1iZXIuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgY29uc3QgdmFsdWVfdHlwZSoKKyAgICAgIG9wZXJhdG9yLT4oKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5jcmVtZW50cyBhICVyZWdleF90b2tlbl9pdGVyYXRvci4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICByZWdleF90b2tlbl9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUG9zdGluY3JlbWVudHMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKysoaW50KTsKKyAgICAgIAorICAgIHByaXZhdGU6IC8vIGRhdGEgbWVtYmVycyBmb3IgZXhwb3NpdGlvbiBvbmx5OgorICAgICAgdHlwZWRlZiByZWdleF9pdGVyYXRvcjxfQmlfaXRlciwgX0NoX3R5cGUsIF9SeF90cmFpdHM+IHBvc2l0aW9uX2l0ZXJhdG9yOworCisgICAgICBwb3NpdGlvbl9pdGVyYXRvciBfX3Bvc2l0aW9uOworICAgICAgY29uc3QgdmFsdWVfdHlwZSogX19yZXN1bHQ7CisgICAgICB2YWx1ZV90eXBlICAgICAgICBfX3N1ZmZpeDsKKyAgICAgIHN0ZDo6c2l6ZV90ICAgICAgIF9fbjsKKyAgICAgIHN0ZDo6dmVjdG9yPGludD4gIF9fc3ViczsKKyAgICB9OworCisgIC8qKiBAYnJpZWYgVG9rZW4gaXRlcmF0b3IgZm9yIEMtc3R5bGUgTlVMTC10ZXJtaW5hdGVkIHN0cmluZ3MuICovCisgIHR5cGVkZWYgcmVnZXhfdG9rZW5faXRlcmF0b3I8Y29uc3QgY2hhcio+ICAgICAgICAgICAgIGNyZWdleF90b2tlbl9pdGVyYXRvcjsKKworICAvKiogQGJyaWVmIFRva2VuIGl0ZXJhdG9yIGZvciBzdGFuZGFyZCBzdHJpbmdzLiAqLworICB0eXBlZGVmIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yPHN0cmluZzo6Y29uc3RfaXRlcmF0b3I+ICBzcmVnZXhfdG9rZW5faXRlcmF0b3I7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICAvKiogQGJyaWVmIFRva2VuIGl0ZXJhdG9yIGZvciBDLXN0eWxlIE5VTEwtdGVybWluYXRlZCB3aWRlIHN0cmluZ3MuICovCisgIHR5cGVkZWYgcmVnZXhfdG9rZW5faXRlcmF0b3I8Y29uc3Qgd2NoYXJfdCo+ICAgICAgICAgIHdjcmVnZXhfdG9rZW5faXRlcmF0b3I7CisKKyAgLyoqIEBicmllZiBUb2tlbiBpdGVyYXRvciBmb3Igc3RhbmRhcmQgd2lkZS1jaGFyYWN0ZXIgc3RyaW5ncy4gKi8KKyAgdHlwZWRlZiByZWdleF90b2tlbl9pdGVyYXRvcjx3c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gd3NyZWdleF90b2tlbl9pdGVyYXRvcjsKKyNlbmRpZgorICAKKyAgLy9AfSAvLyBncm91cCByZWdleAorX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmVnZXhfY29tcGlsZXIuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yZWdleF9jb21waWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZTA5NDgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmVnZXhfY29tcGlsZXIuaApAQCAtMCwwICsxLDExMTAgQEAKKy8vIGNsYXNzIHRlbXBsYXRlIHJlZ2V4IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKgorICogIEBmaWxlIGJpdHMvcmVnZXhfY29tcGlsZXIuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3JlZ2V4fQorICovCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fZGV0YWlsCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCByZWdleC1kZXRhaWwKKyAgICogQHsKKyAgICovCisKKyAgLy8vIEJhc2UgY2xhc3MgZm9yIHNjYW5uZXIuCisgIHN0cnVjdCBfU2Nhbm5lcl9iYXNlCisgIHsKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGludCBfU3RhdGVUOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBfU3RhdGVUIF9TX3N0YXRlX2F0X3N0YXJ0ICAgID0gMSA8PCAwOworICAgIHN0YXRpYyBjb25zdGV4cHIgX1N0YXRlVCBfU19zdGF0ZV9pbl9icmFjZSAgICA9IDEgPDwgMjsKKyAgICBzdGF0aWMgY29uc3RleHByIF9TdGF0ZVQgX1Nfc3RhdGVfaW5fYnJhY2tldCAgPSAxIDw8IDM7CisKKyAgICB2aXJ0dWFsIH5fU2Nhbm5lcl9iYXNlKCkgeyB9OworICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgc3RydWN0IF9TY2FubmVyLiBTY2FucyBhbiBpbnB1dCByYW5nZSBmb3IgcmVnZXggdG9rZW5zLgorICAgKgorICAgKiBUaGUgJV9TY2FubmVyIGNsYXNzIGludGVycHJldHMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIGluCisgICAqIHRoZSBpbnB1dCByYW5nZSBwYXNzZWQgdG8gaXRzIGNvbnN0cnVjdG9yIGFzIGEgc2VxdWVuY2Ugb2YgcGFyc2UKKyAgICogdG9rZW5zIHBhc3NlZCB0byB0aGUgcmVndWxhciBleHByZXNzaW9uIGNvbXBpbGVyLiAgVGhlIHNlcXVlbmNlCisgICAqIG9mIHRva2VucyBwcm92aWRlZCBkZXBlbmRzIG9uIHRoZSBmbGFnIHNldHRpbmdzIHBhc3NlZCB0byB0aGUKKyAgICogY29uc3RydWN0b3I6IGRpZmZlcmVudCByZWd1bGFyIGV4cHJlc3Npb24gZ3JhbW1hcnMgd2lsbCBpbnRlcnByZXQKKyAgICogdGhlIHNhbWUgaW5wdXQgcGF0dGVybiBpbiBzeW50YWN0aWNhbGx5IGRpZmZlcmVudCB3YXlzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgY2xhc3MgX1NjYW5uZXI6IHB1YmxpYyBfU2Nhbm5lcl9iYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0lucHV0SXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0l0ZXJhdG9yVDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yVD46OnZhbHVlX3R5cGUgX0NoYXJUOworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU3RyaW5nVDsKKyAgICAgIHR5cGVkZWYgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgICAgICAgICAgICAgICAgICAgX0ZsYWdUOworICAgICAgdHlwZWRlZiBjb25zdCBzdGQ6OmN0eXBlPF9DaGFyVD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ3R5cGVUOworCisgICAgICAvLy8gVG9rZW4gdHlwZXMgcmV0dXJuZWQgZnJvbSB0aGUgc2Nhbm5lci4KKyAgICAgIGVudW0gX1Rva2VuVAorICAgICAgeworCV9TX3Rva2VuX2FueWNoYXIsCisJX1NfdG9rZW5fYmFja3JlZiwKKwlfU190b2tlbl9icmFja2V0X2JlZ2luLAorCV9TX3Rva2VuX2JyYWNrZXRfZW5kLAorCV9TX3Rva2VuX2ludmVyc2VfY2xhc3MsCisJX1NfdG9rZW5fY2hhcl9jbGFzc19uYW1lLAorCV9TX3Rva2VuX2Nsb3N1cmUwLAorCV9TX3Rva2VuX2Nsb3N1cmUxLAorCV9TX3Rva2VuX2NvbGxlbGVtX211bHRpLAorCV9TX3Rva2VuX2NvbGxlbGVtX3NpbmdsZSwKKwlfU190b2tlbl9jb2xsc3ltYm9sLAorCV9TX3Rva2VuX2NvbW1hLAorCV9TX3Rva2VuX2Rhc2gsCisJX1NfdG9rZW5fZHVwX2NvdW50LAorCV9TX3Rva2VuX2VvZiwKKwlfU190b2tlbl9lcXVpdl9jbGFzc19uYW1lLAorCV9TX3Rva2VuX2ludGVydmFsX2JlZ2luLAorCV9TX3Rva2VuX2ludGVydmFsX2VuZCwKKwlfU190b2tlbl9saW5lX2JlZ2luLAorCV9TX3Rva2VuX2xpbmVfZW5kLAorCV9TX3Rva2VuX29wdCwKKwlfU190b2tlbl9vciwKKwlfU190b2tlbl9vcmRfY2hhciwKKwlfU190b2tlbl9xdW90ZWRfY2hhciwKKwlfU190b2tlbl9zdWJleHByX2JlZ2luLAorCV9TX3Rva2VuX3N1YmV4cHJfZW5kLAorCV9TX3Rva2VuX3dvcmRfYmVnaW4sCisJX1NfdG9rZW5fd29yZF9lbmQsCisJX1NfdG9rZW5fdW5rbm93bgorICAgICAgfTsKKworICAgICAgX1NjYW5uZXIoX0l0ZXJhdG9yVCBfX2JlZ2luLCBfSXRlcmF0b3JUIF9fZW5kLCBfRmxhZ1QgX19mbGFncywKKwkgICAgICAgc3RkOjpsb2NhbGUgX19sb2MpCisgICAgICA6IF9NX2N1cnJlbnQoX19iZWdpbikgLCBfTV9lbmQoX19lbmQpICwgX01fZmxhZ3MoX19mbGFncyksCisgICAgICAgIF9NX2N0eXBlKHN0ZDo6dXNlX2ZhY2V0PF9DdHlwZVQ+KF9fbG9jKSksIF9NX3N0YXRlKF9TX3N0YXRlX2F0X3N0YXJ0KQorICAgICAgeyBfTV9hZHZhbmNlKCk7IH0KKworICAgICAgdm9pZAorICAgICAgX01fYWR2YW5jZSgpOworCisgICAgICBfVG9rZW5UCisgICAgICBfTV90b2tlbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9jdXJUb2tlbjsgfQorCisgICAgICBjb25zdCBfU3RyaW5nVCYKKyAgICAgIF9NX3ZhbHVlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2N1clZhbHVlOyB9CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgc3RkOjpvc3RyZWFtJgorICAgICAgX01fcHJpbnQoc3RkOjpvc3RyZWFtJik7CisjZW5kaWYKKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9lYXRfZXNjYXBlKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3NjYW5faW5fYnJhY2UoKTsKKworICAgICAgdm9pZAorICAgICAgX01fc2Nhbl9pbl9icmFja2V0KCk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2VhdF9jaGFyY2xhc3MoKTsKKworICAgICAgdm9pZAorICAgICAgX01fZWF0X2VxdWl2Y2xhc3MoKTsKKworICAgICAgdm9pZAorICAgICAgX01fZWF0X2NvbGxzeW1ib2woKTsKKworICAgICAgX0l0ZXJhdG9yVCAgX01fY3VycmVudDsKKyAgICAgIF9JdGVyYXRvclQgIF9NX2VuZDsKKyAgICAgIF9GbGFnVCAgICAgIF9NX2ZsYWdzOworICAgICAgX0N0eXBlVCYgICAgX01fY3R5cGU7CisgICAgICBfVG9rZW5UICAgICBfTV9jdXJUb2tlbjsKKyAgICAgIF9TdHJpbmdUICAgIF9NX2N1clZhbHVlOworICAgICAgX1N0YXRlVCAgICAgX01fc3RhdGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgX1NjYW5uZXI8X0lucHV0SXRlcmF0b3I+OjoKKyAgICBfTV9hZHZhbmNlKCkKKyAgICB7CisgICAgICBpZiAoX01fY3VycmVudCA9PSBfTV9lbmQpCisJeworCSAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9lb2Y7CisJICByZXR1cm47CisJfQorCisgICAgICBfQ2hhclQgX19jID0gKl9NX2N1cnJlbnQ7CisgICAgICBpZiAoX01fc3RhdGUgJiBfU19zdGF0ZV9pbl9icmFja2V0KQorCXsKKwkgIF9NX3NjYW5faW5fYnJhY2tldCgpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGlmIChfTV9zdGF0ZSAmIF9TX3N0YXRlX2luX2JyYWNlKQorCXsKKwkgIF9NX3NjYW5faW5fYnJhY2UoKTsKKwkgIHJldHVybjsKKwl9CisjaWYgMAorICAgICAgLy8gVE9ETzogcmUtZW5hYmxlIGxpbmUgYW5jaG9ycyB3aGVuIF9NX2Fzc2VydGlvbiBpcyBpbXBsZW1lbnRlZC4KKyAgICAgIC8vIFNlZSBQUiBsaWJzdGRjKysvNDc3MjQKKyAgICAgIGVsc2UgaWYgKF9NX3N0YXRlICYgX1Nfc3RhdGVfYXRfc3RhcnQgJiYgX19jID09IF9NX2N0eXBlLndpZGVuKCdeJykpCisJeworCSAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9saW5lX2JlZ2luOworCSAgKytfTV9jdXJyZW50OworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKF9fYyA9PSBfTV9jdHlwZS53aWRlbignJCcpKQorCXsKKwkgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fbGluZV9lbmQ7CisJICArK19NX2N1cnJlbnQ7CisJICByZXR1cm47CisJfQorI2VuZGlmCisgICAgICBlbHNlIGlmIChfX2MgPT0gX01fY3R5cGUud2lkZW4oJy4nKSkKKwl7CisJICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2FueWNoYXI7CisJICArK19NX2N1cnJlbnQ7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZSBpZiAoX19jID09IF9NX2N0eXBlLndpZGVuKCcqJykpCisJeworCSAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9jbG9zdXJlMDsKKwkgICsrX01fY3VycmVudDsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlIGlmIChfX2MgPT0gX01fY3R5cGUud2lkZW4oJysnKSkKKwl7CisJICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2Nsb3N1cmUxOworCSAgKytfTV9jdXJyZW50OworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKF9fYyA9PSBfTV9jdHlwZS53aWRlbignfCcpKQorCXsKKwkgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fb3I7CisJICArK19NX2N1cnJlbnQ7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZSBpZiAoX19jID09IF9NX2N0eXBlLndpZGVuKCdbJykpCisJeworCSAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9icmFja2V0X2JlZ2luOworCSAgX01fc3RhdGUgfD0gKF9TX3N0YXRlX2luX2JyYWNrZXQgfCBfU19zdGF0ZV9hdF9zdGFydCk7CisJICArK19NX2N1cnJlbnQ7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZSBpZiAoX19jID09IF9NX2N0eXBlLndpZGVuKCdcXCcpKQorCXsKKwkgIF9NX2VhdF9lc2NhcGUoKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlIGlmICghKF9NX2ZsYWdzICYgKHJlZ2V4X2NvbnN0YW50czo6YmFzaWMgfCByZWdleF9jb25zdGFudHM6OmdyZXApKSkKKwl7CisJICBpZiAoX19jID09IF9NX2N0eXBlLndpZGVuKCcoJykpCisJICAgIHsKKwkgICAgICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX3N1YmV4cHJfYmVnaW47CisJICAgICAgKytfTV9jdXJyZW50OworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgZWxzZSBpZiAoX19jID09IF9NX2N0eXBlLndpZGVuKCcpJykpCisJICAgIHsKKwkgICAgICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX3N1YmV4cHJfZW5kOworCSAgICAgICsrX01fY3VycmVudDsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIGVsc2UgaWYgKF9fYyA9PSBfTV9jdHlwZS53aWRlbigneycpKQorCSAgICB7CisJICAgICAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9pbnRlcnZhbF9iZWdpbjsKKwkgICAgICBfTV9zdGF0ZSB8PSBfU19zdGF0ZV9pbl9icmFjZTsKKwkgICAgICArK19NX2N1cnJlbnQ7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJfQorCisgICAgICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX29yZF9jaGFyOworICAgICAgX01fY3VyVmFsdWUuYXNzaWduKDEsIF9fYyk7CisgICAgICArK19NX2N1cnJlbnQ7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgdm9pZAorICAgIF9TY2FubmVyPF9JbnB1dEl0ZXJhdG9yPjo6CisgICAgX01fc2Nhbl9pbl9icmFjZSgpCisgICAgeworICAgICAgaWYgKF9NX2N0eXBlLmlzKF9DdHlwZVQ6OmRpZ2l0LCAqX01fY3VycmVudCkpCisJeworCSAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9kdXBfY291bnQ7CisJICBfTV9jdXJWYWx1ZS5hc3NpZ24oMSwgKl9NX2N1cnJlbnQpOworCSAgKytfTV9jdXJyZW50OworCSAgd2hpbGUgKF9NX2N1cnJlbnQgIT0gX01fZW5kCisJCSAmJiBfTV9jdHlwZS5pcyhfQ3R5cGVUOjpkaWdpdCwgKl9NX2N1cnJlbnQpKQorCSAgICB7CisJICAgICAgX01fY3VyVmFsdWUgKz0gKl9NX2N1cnJlbnQ7CisJICAgICAgKytfTV9jdXJyZW50OworCSAgICB9CisJICByZXR1cm47CisJfQorICAgICAgZWxzZSBpZiAoKl9NX2N1cnJlbnQgPT0gX01fY3R5cGUud2lkZW4oJywnKSkKKwl7CisJICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2NvbW1hOworCSAgKytfTV9jdXJyZW50OworCSAgcmV0dXJuOworCX0KKyAgICAgIGlmIChfTV9mbGFncyAmIChyZWdleF9jb25zdGFudHM6OmJhc2ljIHwgcmVnZXhfY29uc3RhbnRzOjpncmVwKSkKKwl7CisJICBpZiAoKl9NX2N1cnJlbnQgPT0gX01fY3R5cGUud2lkZW4oJ1xcJykpCisJICAgIF9NX2VhdF9lc2NhcGUoKTsKKwl9CisgICAgICBlbHNlIAorCXsKKwkgIGlmICgqX01fY3VycmVudCA9PSBfTV9jdHlwZS53aWRlbignfScpKQorCSAgICB7CisJICAgICAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9pbnRlcnZhbF9lbmQ7CisJICAgICAgX01fc3RhdGUgJj0gfl9TX3N0YXRlX2luX2JyYWNlOworCSAgICAgICsrX01fY3VycmVudDsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfU2Nhbm5lcjxfSW5wdXRJdGVyYXRvcj46OgorICAgIF9NX3NjYW5faW5fYnJhY2tldCgpCisgICAgeworICAgICAgaWYgKF9NX3N0YXRlICYgX1Nfc3RhdGVfYXRfc3RhcnQgJiYgKl9NX2N1cnJlbnQgPT0gX01fY3R5cGUud2lkZW4oJ14nKSkKKwl7CisJICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2ludmVyc2VfY2xhc3M7CisJICBfTV9zdGF0ZSAmPSB+X1Nfc3RhdGVfYXRfc3RhcnQ7CisJICArK19NX2N1cnJlbnQ7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZSBpZiAoKl9NX2N1cnJlbnQgPT0gX01fY3R5cGUud2lkZW4oJ1snKSkKKwl7CisJICArK19NX2N1cnJlbnQ7CisJICBpZiAoX01fY3VycmVudCA9PSBfTV9lbmQpCisJICAgIHsKKwkgICAgICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2VvZjsKKwkgICAgICByZXR1cm47CisJICAgIH0KKworCSAgaWYgKCpfTV9jdXJyZW50ID09IF9NX2N0eXBlLndpZGVuKCcuJykpCisJICAgIHsKKwkgICAgICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2NvbGxzeW1ib2w7CisJICAgICAgX01fZWF0X2NvbGxzeW1ib2woKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIGVsc2UgaWYgKCpfTV9jdXJyZW50ID09IF9NX2N0eXBlLndpZGVuKCc6JykpCisJICAgIHsKKwkgICAgICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2NoYXJfY2xhc3NfbmFtZTsKKwkgICAgICBfTV9lYXRfY2hhcmNsYXNzKCk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICBlbHNlIGlmICgqX01fY3VycmVudCA9PSBfTV9jdHlwZS53aWRlbignPScpKQorCSAgICB7CisJICAgICAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9lcXVpdl9jbGFzc19uYW1lOworCSAgICAgIF9NX2VhdF9lcXVpdmNsYXNzKCk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoKl9NX2N1cnJlbnQgPT0gX01fY3R5cGUud2lkZW4oJy0nKSkKKwl7CisJICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2Rhc2g7CisJICArK19NX2N1cnJlbnQ7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZSBpZiAoKl9NX2N1cnJlbnQgPT0gX01fY3R5cGUud2lkZW4oJ10nKSkKKwl7CisJICBpZiAoIShfTV9mbGFncyAmIHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKwkgICAgICB8fCAhKF9NX3N0YXRlICYgX1Nfc3RhdGVfYXRfc3RhcnQpKQorCSAgICB7CisJICAgICAgLy8gc3BlY2lhbCBjYXNlOiBvbmx5IGlmICBfbm90XyBjaHIgZmlyc3QgYWZ0ZXIKKwkgICAgICAvLyAnWycgb3IgJ1teJyBhbmQgaWYgbm90IEVDTUFzY3JpcHQKKwkgICAgICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2JyYWNrZXRfZW5kOworCSAgICAgICsrX01fY3VycmVudDsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwl9CisgICAgICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2NvbGxlbGVtX3NpbmdsZTsKKyAgICAgIF9NX2N1clZhbHVlLmFzc2lnbigxLCAqX01fY3VycmVudCk7CisgICAgICArK19NX2N1cnJlbnQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfU2Nhbm5lcjxfSW5wdXRJdGVyYXRvcj46OgorICAgIF9NX2VhdF9lc2NhcGUoKQorICAgIHsKKyAgICAgICsrX01fY3VycmVudDsKKyAgICAgIGlmIChfTV9jdXJyZW50ID09IF9NX2VuZCkKKwl7CisJICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2VvZjsKKwkgIHJldHVybjsKKwl9CisgICAgICBfQ2hhclQgX19jID0gKl9NX2N1cnJlbnQ7CisgICAgICArK19NX2N1cnJlbnQ7CisKKyAgICAgIGlmIChfX2MgPT0gX01fY3R5cGUud2lkZW4oJygnKSkKKwl7CisJICBpZiAoIShfTV9mbGFncyAmIChyZWdleF9jb25zdGFudHM6OmJhc2ljIHwgcmVnZXhfY29uc3RhbnRzOjpncmVwKSkpCisJICAgIHsKKwkgICAgICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX29yZF9jaGFyOworCSAgICAgIF9NX2N1clZhbHVlLmFzc2lnbigxLCBfX2MpOworCSAgICB9CisJICBlbHNlCisJICAgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fc3ViZXhwcl9iZWdpbjsKKwl9CisgICAgICBlbHNlIGlmIChfX2MgPT0gX01fY3R5cGUud2lkZW4oJyknKSkKKwl7CisJICBpZiAoIShfTV9mbGFncyAmIChyZWdleF9jb25zdGFudHM6OmJhc2ljIHwgcmVnZXhfY29uc3RhbnRzOjpncmVwKSkpCisJICAgIHsKKwkgICAgICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX29yZF9jaGFyOworCSAgICAgIF9NX2N1clZhbHVlLmFzc2lnbigxLCBfX2MpOworCSAgICB9CisJICBlbHNlCisJICAgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fc3ViZXhwcl9lbmQ7CisJfQorICAgICAgZWxzZSBpZiAoX19jID09IF9NX2N0eXBlLndpZGVuKCd7JykpCisJeworCSAgaWYgKCEoX01fZmxhZ3MgJiAocmVnZXhfY29uc3RhbnRzOjpiYXNpYyB8IHJlZ2V4X2NvbnN0YW50czo6Z3JlcCkpKQorCSAgICB7CisJICAgICAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9vcmRfY2hhcjsKKwkgICAgICBfTV9jdXJWYWx1ZS5hc3NpZ24oMSwgX19jKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9pbnRlcnZhbF9iZWdpbjsKKwkgICAgICBfTV9zdGF0ZSB8PSBfU19zdGF0ZV9pbl9icmFjZTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKF9fYyA9PSBfTV9jdHlwZS53aWRlbignfScpKQorCXsKKwkgIGlmICghKF9NX2ZsYWdzICYgKHJlZ2V4X2NvbnN0YW50czo6YmFzaWMgfCByZWdleF9jb25zdGFudHM6OmdyZXApKSkKKwkgICAgeworCSAgICAgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fb3JkX2NoYXI7CisJICAgICAgX01fY3VyVmFsdWUuYXNzaWduKDEsIF9fYyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICghKF9NX3N0YXRlICYmIF9TX3N0YXRlX2luX2JyYWNlKSkKKwkJX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX2JhZGJyYWNlKTsKKwkgICAgICBfTV9zdGF0ZSAmPSB+X1Nfc3RhdGVfaW5fYnJhY2U7CisJICAgICAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9pbnRlcnZhbF9lbmQ7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChfX2MgPT0gX01fY3R5cGUud2lkZW4oJ3gnKSkKKwl7CisJICArK19NX2N1cnJlbnQ7CisJICBpZiAoX01fY3VycmVudCA9PSBfTV9lbmQpCisJICAgIHsKKwkgICAgICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2VvZjsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIGlmIChfTV9jdHlwZS5pcyhfQ3R5cGVUOjpkaWdpdCwgKl9NX2N1cnJlbnQpKQorCSAgICB7CisJICAgICAgX01fY3VyVmFsdWUuYXNzaWduKDEsICpfTV9jdXJyZW50KTsKKwkgICAgICArK19NX2N1cnJlbnQ7CisJICAgICAgaWYgKF9NX2N1cnJlbnQgPT0gX01fZW5kKQorCQl7CisJCSAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9lb2Y7CisJCSAgcmV0dXJuOworCQl9CisJICAgICAgaWYgKF9NX2N0eXBlLmlzKF9DdHlwZVQ6OmRpZ2l0LCAqX01fY3VycmVudCkpCisJCXsKKwkJICBfTV9jdXJWYWx1ZSArPSAqX01fY3VycmVudDsKKwkJICArK19NX2N1cnJlbnQ7CisJCSAgcmV0dXJuOworCQl9CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChfX2MgPT0gX01fY3R5cGUud2lkZW4oJ14nKQorCSAgICAgICB8fCBfX2MgPT0gX01fY3R5cGUud2lkZW4oJy4nKQorCSAgICAgICB8fCBfX2MgPT0gX01fY3R5cGUud2lkZW4oJyonKQorCSAgICAgICB8fCBfX2MgPT0gX01fY3R5cGUud2lkZW4oJyQnKQorCSAgICAgICB8fCBfX2MgPT0gX01fY3R5cGUud2lkZW4oJ1xcJykpCisJeworCSAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9vcmRfY2hhcjsKKwkgIF9NX2N1clZhbHVlLmFzc2lnbigxLCBfX2MpOworCX0KKyAgICAgIGVsc2UgaWYgKF9NX2N0eXBlLmlzKF9DdHlwZVQ6OmRpZ2l0LCBfX2MpKQorCXsKKwkgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fYmFja3JlZjsKKwkgIF9NX2N1clZhbHVlLmFzc2lnbigxLCBfX2MpOworCX0KKyAgICAgIGVsc2UKKwlfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfZXNjYXBlKTsKKyAgICB9CisKKworICAvLyBFYXRzIGEgY2hhcmFjdGVyIGNsYXNzIG9yIHRocm93bnMgYW4gZXhjZXB0aW9uLgorICAvLyBjdXJyZW50IHBvaW50IHRvICc6JyBkZWxpbWl0ZXIgb24gZW50cnksIGNoYXIgYWZ0ZXIgJ10nIG9uIHJldHVybgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgX1NjYW5uZXI8X0lucHV0SXRlcmF0b3I+OjoKKyAgICBfTV9lYXRfY2hhcmNsYXNzKCkKKyAgICB7CisgICAgICArK19NX2N1cnJlbnQ7IC8vIHNraXAgJzonCisgICAgICBpZiAoX01fY3VycmVudCA9PSBfTV9lbmQpCisJX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX2N0eXBlKTsKKyAgICAgIGZvciAoX01fY3VyVmFsdWUuY2xlYXIoKTsKKwkgICBfTV9jdXJyZW50ICE9IF9NX2VuZCAmJiAqX01fY3VycmVudCAhPSBfTV9jdHlwZS53aWRlbignOicpOworCSAgICsrX01fY3VycmVudCkKKwlfTV9jdXJWYWx1ZSArPSAqX01fY3VycmVudDsKKyAgICAgIGlmIChfTV9jdXJyZW50ID09IF9NX2VuZCkKKwlfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfY3R5cGUpOworICAgICAgKytfTV9jdXJyZW50OyAvLyBza2lwICc6JworICAgICAgaWYgKCpfTV9jdXJyZW50ICE9IF9NX2N0eXBlLndpZGVuKCddJykpCisJX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX2N0eXBlKTsKKyAgICAgICsrX01fY3VycmVudDsgLy8gc2tpcCAnXScKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgX1NjYW5uZXI8X0lucHV0SXRlcmF0b3I+OjoKKyAgICBfTV9lYXRfZXF1aXZjbGFzcygpCisgICAgeworICAgICAgKytfTV9jdXJyZW50OyAvLyBza2lwICc9JworICAgICAgaWYgKF9NX2N1cnJlbnQgPT0gX01fZW5kKQorCV9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl9jb2xsYXRlKTsKKyAgICAgIGZvciAoX01fY3VyVmFsdWUuY2xlYXIoKTsKKwkgICBfTV9jdXJyZW50ICE9IF9NX2VuZCAmJiAqX01fY3VycmVudCAhPSBfTV9jdHlwZS53aWRlbignPScpOworCSAgICsrX01fY3VycmVudCkKKwlfTV9jdXJWYWx1ZSArPSAqX01fY3VycmVudDsKKyAgICAgIGlmIChfTV9jdXJyZW50ID09IF9NX2VuZCkKKwlfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfY29sbGF0ZSk7CisgICAgICArK19NX2N1cnJlbnQ7IC8vIHNraXAgJz0nCisgICAgICBpZiAoKl9NX2N1cnJlbnQgIT0gX01fY3R5cGUud2lkZW4oJ10nKSkKKwlfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfY29sbGF0ZSk7CisgICAgICArK19NX2N1cnJlbnQ7IC8vIHNraXAgJ10nCisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgdm9pZAorICAgIF9TY2FubmVyPF9JbnB1dEl0ZXJhdG9yPjo6CisgICAgX01fZWF0X2NvbGxzeW1ib2woKQorICAgIHsKKyAgICAgICsrX01fY3VycmVudDsgLy8gc2tpcCAnLicKKyAgICAgIGlmIChfTV9jdXJyZW50ID09IF9NX2VuZCkKKwlfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfY29sbGF0ZSk7CisgICAgICBmb3IgKF9NX2N1clZhbHVlLmNsZWFyKCk7CisJICAgX01fY3VycmVudCAhPSBfTV9lbmQgJiYgKl9NX2N1cnJlbnQgIT0gX01fY3R5cGUud2lkZW4oJy4nKTsKKwkgICArK19NX2N1cnJlbnQpCisJX01fY3VyVmFsdWUgKz0gKl9NX2N1cnJlbnQ7CisgICAgICBpZiAoX01fY3VycmVudCA9PSBfTV9lbmQpCisJX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX2NvbGxhdGUpOworICAgICAgKytfTV9jdXJyZW50OyAvLyBza2lwICcuJworICAgICAgaWYgKCpfTV9jdXJyZW50ICE9IF9NX2N0eXBlLndpZGVuKCddJykpCisJX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX2NvbGxhdGUpOworICAgICAgKytfTV9jdXJyZW50OyAvLyBza2lwICddJworICAgIH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgIHN0ZDo6b3N0cmVhbSYKKyAgICBfU2Nhbm5lcjxfSW5wdXRJdGVyYXRvcj46OgorICAgIF9NX3ByaW50KHN0ZDo6b3N0cmVhbSYgb3N0cikKKyAgICB7CisgICAgICBzd2l0Y2ggKF9NX2N1clRva2VuKQorICAgICAgeworCWNhc2UgX1NfdG9rZW5fYW55Y2hhcjoKKwkgIG9zdHIgPDwgImFueS1jaGFyYWN0ZXJcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX2JhY2tyZWY6CisJICBvc3RyIDw8ICJiYWNrcmVmXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9icmFja2V0X2JlZ2luOgorCSAgb3N0ciA8PCAiYnJhY2tldC1iZWdpblxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fYnJhY2tldF9lbmQ6CisJICBvc3RyIDw8ICJicmFja2V0LWVuZFxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fY2hhcl9jbGFzc19uYW1lOgorCSAgb3N0ciA8PCAiY2hhci1jbGFzcy1uYW1lIFwiIiA8PCBfTV9jdXJWYWx1ZSA8PCAiXCJcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX2Nsb3N1cmUwOgorCSAgb3N0ciA8PCAiY2xvc3VyZTBcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX2Nsb3N1cmUxOgorCSAgb3N0ciA8PCAiY2xvc3VyZTFcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX2NvbGxlbGVtX211bHRpOgorCSAgb3N0ciA8PCAiY29sbC1lbGVtLW11bHRpIFwiIiA8PCBfTV9jdXJWYWx1ZSA8PCAiXCJcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX2NvbGxlbGVtX3NpbmdsZToKKwkgIG9zdHIgPDwgImNvbGwtZWxlbS1zaW5nbGUgXCIiIDw8IF9NX2N1clZhbHVlIDw8ICJcIlxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fY29sbHN5bWJvbDoKKwkgIG9zdHIgPDwgImNvbGxzeW1ib2wgXCIiIDw8IF9NX2N1clZhbHVlIDw8ICJcIlxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fY29tbWE6CisJICBvc3RyIDw8ICJjb21tYVxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fZGFzaDoKKwkgIG9zdHIgPDwgImRhc2hcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX2R1cF9jb3VudDoKKwkgIG9zdHIgPDwgImR1cCBjb3VudDogIiA8PCBfTV9jdXJWYWx1ZSA8PCAiXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9lb2Y6CisJICBvc3RyIDw8ICJFT0ZcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX2VxdWl2X2NsYXNzX25hbWU6CisJICBvc3RyIDw8ICJlcXVpdi1jbGFzcy1uYW1lIFwiIiA8PCBfTV9jdXJWYWx1ZSA8PCAiXCJcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX2ludGVydmFsX2JlZ2luOgorCSAgb3N0ciA8PCAiaW50ZXJ2YWwgYmVnaW5cbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX2ludGVydmFsX2VuZDoKKwkgIG9zdHIgPDwgImludGVydmFsIGVuZFxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fbGluZV9iZWdpbjoKKwkgIG9zdHIgPDwgImxpbmUgYmVnaW5cbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX2xpbmVfZW5kOgorCSAgb3N0ciA8PCAibGluZSBlbmRcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX29wdDoKKwkgIG9zdHIgPDwgIm9wdFxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fb3I6CisJICBvc3RyIDw8ICJvclxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fb3JkX2NoYXI6CisJICBvc3RyIDw8ICJvcmRpbmFyeSBjaGFyYWN0ZXI6IFwiIiA8PCBfTV92YWx1ZSgpIDw8ICJcIlxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fcXVvdGVkX2NoYXI6CisJICBvc3RyIDw8ICJxdW90ZWQgY2hhclxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fc3ViZXhwcl9iZWdpbjoKKwkgIG9zdHIgPDwgInN1YmV4cHIgYmVnaW5cbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX3N1YmV4cHJfZW5kOgorCSAgb3N0ciA8PCAic3ViZXhwciBlbmRcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX3dvcmRfYmVnaW46CisJICBvc3RyIDw8ICJ3b3JkIGJlZ2luXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl93b3JkX2VuZDoKKwkgIG9zdHIgPDwgIndvcmQgZW5kXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl91bmtub3duOgorCSAgb3N0ciA8PCAiLS0gdW5rbm93biB0b2tlbiAtLVxuIjsKKwkgIGJyZWFrOworICAgICAgfQorICAgICAgcmV0dXJuIG9zdHI7CisgICAgfQorI2VuZGlmCisKKyAgLy8vIEJ1aWxkcyBhbiBORkEgZnJvbSBhbiBpbnB1dCBpdGVyYXRvciBpbnRlcnZhbC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgY2xhc3MgX0NvbXBpbGVyCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0luSXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0l0ZXJUOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSW5JdGVyPjo6dmFsdWVfdHlwZSBfQ2hhclQ7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVD4gICAgICAgICAgICAgICAgICAgICAgICAgIF9TdHJpbmdUOworICAgICAgdHlwZWRlZiByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSAgICAgICAgICAgICAgICBfRmxhZ1Q7CisKKyAgICAgIF9Db21waWxlcihjb25zdCBfSW5JdGVyJiBfX2IsIGNvbnN0IF9Jbkl0ZXImIF9fZSwKKwkJX1RyYWl0c1QmIF9fdHJhaXRzLCBfRmxhZ1QgX19mbGFncyk7CisKKyAgICAgIGNvbnN0IF9OZmEmCisgICAgICBfTV9uZmEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fc3RhdGVfc3RvcmU7IH0KKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9TY2FubmVyPF9Jbkl0ZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NjYW5uZXJUOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2Nhbm5lclQ6Ol9Ub2tlblQgICAgICAgICAgICAgICAgICAgIF9Ub2tlblQ7CisgICAgICB0eXBlZGVmIHN0ZDo6c3RhY2s8X1N0YXRlU2VxLCBzdGQ6OnZlY3RvcjxfU3RhdGVTZXE+ID4gX1N0YWNrVDsKKyAgICAgIHR5cGVkZWYgX1JhbmdlTWF0Y2hlcjxfSW5JdGVyLCBfVHJhaXRzVD4gICAgICAgICAgICAgICBfUk1hdGNoZXJUOworCisgICAgICAvLyBhY2NlcHRzIGEgc3BlY2lmaWMgdG9rZW4gb3IgcmV0dXJucyBmYWxzZS4KKyAgICAgIGJvb2wKKyAgICAgIF9NX21hdGNoX3Rva2VuKF9Ub2tlblQgX190b2tlbik7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2Rpc2p1bmN0aW9uKCk7CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2FsdGVybmF0aXZlKCk7CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX3Rlcm0oKTsKKworICAgICAgYm9vbAorICAgICAgX01fYXNzZXJ0aW9uKCk7CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX3F1YW50aWZpZXIoKTsKKworICAgICAgYm9vbAorICAgICAgX01fYXRvbSgpOworCisgICAgICBib29sCisgICAgICBfTV9icmFja2V0X2V4cHJlc3Npb24oKTsKKworICAgICAgYm9vbAorICAgICAgX01fYnJhY2tldF9saXN0KF9STWF0Y2hlclQmIF9fbWF0Y2hlcik7CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2ZvbGxvd19saXN0KF9STWF0Y2hlclQmIF9fbWF0Y2hlcik7CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2ZvbGxvd19saXN0MihfUk1hdGNoZXJUJiBfX21hdGNoZXIpOworCisgICAgICBib29sCisgICAgICBfTV9leHByZXNzaW9uX3Rlcm0oX1JNYXRjaGVyVCYgX19tYXRjaGVyKTsKKworICAgICAgYm9vbAorICAgICAgX01fcmFuZ2VfZXhwcmVzc2lvbihfUk1hdGNoZXJUJiBfX21hdGNoZXIpOworCisgICAgICBib29sCisgICAgICBfTV9zdGFydF9yYW5nZShfUk1hdGNoZXJUJiBfX21hdGNoZXIpOworCisgICAgICBib29sCisgICAgICBfTV9jb2xsYXRpbmdfc3ltYm9sKF9STWF0Y2hlclQmIF9fbWF0Y2hlcik7CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2VxdWl2YWxlbmNlX2NsYXNzKF9STWF0Y2hlclQmIF9fbWF0Y2hlcik7CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2NoYXJhY3Rlcl9jbGFzcyhfUk1hdGNoZXJUJiBfX21hdGNoZXIpOworCisgICAgICBpbnQKKyAgICAgIF9NX2N1cl9pbnRfdmFsdWUoaW50IF9fcmFkaXgpOworCisgICAgICBfVHJhaXRzVCYgICAgICBfTV90cmFpdHM7CisgICAgICBfU2Nhbm5lclQgICAgICBfTV9zY2FubmVyOworICAgICAgX1N0cmluZ1QgICAgICAgX01fY3VyX3ZhbHVlOworICAgICAgX05mYSAgICAgICAgICAgX01fc3RhdGVfc3RvcmU7CisgICAgICBfU3RhY2tUICAgICAgICBfTV9zdGFjazsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXIsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9Db21waWxlcihjb25zdCBfSW5JdGVyJiBfX2IsIGNvbnN0IF9Jbkl0ZXImIF9fZSwgX1RyYWl0c1QmIF9fdHJhaXRzLAorCSAgICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46Ol9GbGFnVCBfX2ZsYWdzKQorICAgIDogX01fdHJhaXRzKF9fdHJhaXRzKSwgX01fc2Nhbm5lcihfX2IsIF9fZSwgX19mbGFncywgX01fdHJhaXRzLmdldGxvYygpKSwKKyAgICAgIF9NX3N0YXRlX3N0b3JlKF9fZmxhZ3MpCisgICAgeworICAgICAgdHlwZWRlZiBfU3RhcnRUYWdnZXI8X0luSXRlciwgX1RyYWl0c1Q+IF9TdGFydDsKKyAgICAgIHR5cGVkZWYgX0VuZFRhZ2dlcjxfSW5JdGVyLCBfVHJhaXRzVD4gX0VuZDsKKworICAgICAgX1N0YXRlU2VxIF9fcihfTV9zdGF0ZV9zdG9yZSwKKyAgICAgIAkJICAgIF9NX3N0YXRlX3N0b3JlLl9NX2luc2VydF9zdWJleHByX2JlZ2luKF9TdGFydCgwKSkpOworICAgICAgX01fZGlzanVuY3Rpb24oKTsKKyAgICAgIGlmICghX01fc3RhY2suZW1wdHkoKSkKKwl7CisJICBfX3IuX01fYXBwZW5kKF9NX3N0YWNrLnRvcCgpKTsKKwkgIF9NX3N0YWNrLnBvcCgpOworCX0KKyAgICAgIF9fci5fTV9hcHBlbmQoX01fc3RhdGVfc3RvcmUuX01faW5zZXJ0X3N1YmV4cHJfZW5kKDAsIF9FbmQoMCkpKTsKKyAgICAgIF9fci5fTV9hcHBlbmQoX01fc3RhdGVfc3RvcmUuX01faW5zZXJ0X2FjY2VwdCgpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgYm9vbAorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9NX21hdGNoX3Rva2VuKF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46Ol9Ub2tlblQgdG9rZW4pCisgICAgeyAKKyAgICAgIGlmICh0b2tlbiA9PSBfTV9zY2FubmVyLl9NX3Rva2VuKCkpCisJeworCSAgX01fY3VyX3ZhbHVlID0gX01fc2Nhbm5lci5fTV92YWx1ZSgpOworCSAgX01fc2Nhbm5lci5fTV9hZHZhbmNlKCk7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXIsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIHZvaWQKKyAgICBfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+OjoKKyAgICBfTV9kaXNqdW5jdGlvbigpCisgICAgeworICAgICAgdGhpcy0+X01fYWx0ZXJuYXRpdmUoKTsKKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX29yKSkKKwl7CisJICBfU3RhdGVTZXEgX19hbHQxID0gX01fc3RhY2sudG9wKCk7IF9NX3N0YWNrLnBvcCgpOworCSAgdGhpcy0+X01fZGlzanVuY3Rpb24oKTsKKwkgIF9TdGF0ZVNlcSBfX2FsdDIgPSBfTV9zdGFjay50b3AoKTsgX01fc3RhY2sucG9wKCk7CisJICBfTV9zdGFjay5wdXNoKF9TdGF0ZVNlcShfX2FsdDEsIF9fYWx0MikpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgYm9vbAorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9NX2FsdGVybmF0aXZlKCkKKyAgICB7CisgICAgICBpZiAodGhpcy0+X01fdGVybSgpKQorCXsKKwkgIF9TdGF0ZVNlcSBfX3JlID0gX01fc3RhY2sudG9wKCk7IF9NX3N0YWNrLnBvcCgpOworCSAgdGhpcy0+X01fYWx0ZXJuYXRpdmUoKTsKKwkgIGlmICghX01fc3RhY2suZW1wdHkoKSkKKwkgICAgeworCSAgICAgIF9fcmUuX01fYXBwZW5kKF9NX3N0YWNrLnRvcCgpKTsKKwkgICAgICBfTV9zdGFjay5wb3AoKTsKKwkgICAgfQorCSAgX01fc3RhY2sucHVzaChfX3JlKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgYm9vbAorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9NX3Rlcm0oKQorICAgIHsKKyAgICAgIGlmICh0aGlzLT5fTV9hc3NlcnRpb24oKSkKKwlyZXR1cm4gdHJ1ZTsKKyAgICAgIGlmICh0aGlzLT5fTV9hdG9tKCkpCisJeworCSAgdGhpcy0+X01fcXVhbnRpZmllcigpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBib29sCisgICAgX0NvbXBpbGVyPF9Jbkl0ZXIsIF9UcmFpdHNUPjo6CisgICAgX01fYXNzZXJ0aW9uKCkKKyAgICB7CisgICAgICBpZiAoX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9saW5lX2JlZ2luKSkKKwl7CisJICAvLyBfX20ucHVzaChfTWF0Y2hlcjo6X1Nfb3Bjb2RlX2xpbmVfYmVnaW4pOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fbGluZV9lbmQpKQorCXsKKwkgIC8vIF9fbS5wdXNoKF9NYXRjaGVyOjpfU19vcGNvZGVfbGluZV9lbmQpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fd29yZF9iZWdpbikpCisJeworCSAgLy8gX19tLnB1c2goX01hdGNoZXI6Ol9TX29wY29kZV93b3JkX2JlZ2luKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX3dvcmRfZW5kKSkKKwl7CisJICAvLyBfX20ucHVzaChfTWF0Y2hlcjo6X1Nfb3Bjb2RlX3dvcmRfZW5kKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgYm9vbAorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9NX3F1YW50aWZpZXIoKQorICAgIHsKKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX2Nsb3N1cmUwKSkKKwl7CisJICBpZiAoX01fc3RhY2suZW1wdHkoKSkKKwkgICAgX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX2JhZHJlcGVhdCk7CisJICBfU3RhdGVTZXEgX19yKF9NX3N0YWNrLnRvcCgpLCAtMSk7CisJICBfX3IuX01fYXBwZW5kKF9fci5fTV9mcm9udCgpKTsKKwkgIF9NX3N0YWNrLnBvcCgpOworCSAgX01fc3RhY2sucHVzaChfX3IpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fY2xvc3VyZTEpKQorCXsKKwkgIGlmIChfTV9zdGFjay5lbXB0eSgpKQorCSAgICBfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfYmFkcmVwZWF0KTsKKwkgIF9TdGF0ZVNlcSBfX3IoX01fc3RhdGVfc3RvcmUsCisJCQlfTV9zdGF0ZV9zdG9yZS4KKwkJCV9NX2luc2VydF9hbHQoX1NfaW52YWxpZF9zdGF0ZV9pZCwKKwkJCQkgICAgICBfTV9zdGFjay50b3AoKS5fTV9mcm9udCgpKSk7CisJICBfTV9zdGFjay50b3AoKS5fTV9hcHBlbmQoX19yKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX29wdCkpCisJeworCSAgaWYgKF9NX3N0YWNrLmVtcHR5KCkpCisJICBfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfYmFkcmVwZWF0KTsKKwkgIF9TdGF0ZVNlcSBfX3IoX01fc3RhY2sudG9wKCksIC0xKTsKKwkgIF9NX3N0YWNrLnBvcCgpOworCSAgX01fc3RhY2sucHVzaChfX3IpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5faW50ZXJ2YWxfYmVnaW4pKQorCXsKKwkgIGlmIChfTV9zdGFjay5lbXB0eSgpKQorCSAgICBfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfYmFkcmVwZWF0KTsKKwkgIGlmICghX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9kdXBfY291bnQpKQorCSAgICBfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfYmFkYnJhY2UpOworCSAgX1N0YXRlU2VxIF9fcihfTV9zdGFjay50b3AoKSk7CisJICBpbnQgX19taW5fcmVwID0gX01fY3VyX2ludF92YWx1ZSgxMCk7CisJICBmb3IgKGludCBfX2kgPSAxOyBfX2kgPCBfX21pbl9yZXA7ICsrX19pKQorCSAgICBfTV9zdGFjay50b3AoKS5fTV9hcHBlbmQoX19yLl9NX2Nsb25lKCkpOyAKKwkgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX2NvbW1hKSkKKwkgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fZHVwX2NvdW50KSkKKwkgICAgICB7CisJCWludCBfX24gPSBfTV9jdXJfaW50X3ZhbHVlKDEwKSAtIF9fbWluX3JlcDsKKwkJaWYgKF9fbiA8IDApCisJCSAgX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX2JhZGJyYWNlKTsKKwkJZm9yIChpbnQgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKwkJICB7CisJCSAgICBfU3RhdGVTZXEgX19yKF9NX3N0YXRlX3N0b3JlLAorCQkJCSAgX01fc3RhdGVfc3RvcmUuCisJCQkJICBfTV9pbnNlcnRfYWx0KF9TX2ludmFsaWRfc3RhdGVfaWQsCisJCQkJCQlfTV9zdGFjay50b3AoKS5fTV9mcm9udCgpKSk7CisJCSAgICBfTV9zdGFjay50b3AoKS5fTV9hcHBlbmQoX19yKTsKKwkJICB9CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlfU3RhdGVTZXEgX19yKF9NX3N0YWNrLnRvcCgpLCAtMSk7CisJCV9fci5fTV9wdXNoX2JhY2soX19yLl9NX2Zyb250KCkpOworCQlfTV9zdGFjay5wb3AoKTsKKwkJX01fc3RhY2sucHVzaChfX3IpOworCSAgICAgIH0KKwkgIGlmICghX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9pbnRlcnZhbF9lbmQpKQorCSAgICBfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfYnJhY2UpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBib29sCisgICAgX0NvbXBpbGVyPF9Jbkl0ZXIsIF9UcmFpdHNUPjo6CisgICAgX01fYXRvbSgpCisgICAgeworICAgICAgdHlwZWRlZiBfQ2hhck1hdGNoZXI8X0luSXRlciwgX1RyYWl0c1Q+IF9DTWF0Y2hlcjsKKyAgICAgIHR5cGVkZWYgX1N0YXJ0VGFnZ2VyPF9Jbkl0ZXIsIF9UcmFpdHNUPiBfU3RhcnQ7CisgICAgICB0eXBlZGVmIF9FbmRUYWdnZXI8X0luSXRlciwgX1RyYWl0c1Q+IF9FbmQ7CisKKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX2FueWNoYXIpKQorCXsKKwkgIF9NX3N0YWNrLnB1c2goX1N0YXRlU2VxKF9NX3N0YXRlX3N0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX3N0YXRlX3N0b3JlLl9NX2luc2VydF9tYXRjaGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9BbnlNYXRjaGVyKSkpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fb3JkX2NoYXIpKQorCXsKKwkgIF9NX3N0YWNrLnB1c2goX1N0YXRlU2VxKF9NX3N0YXRlX3N0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX3N0YXRlX3N0b3JlLl9NX2luc2VydF9tYXRjaGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9DTWF0Y2hlcihfTV9jdXJfdmFsdWVbMF0sIF9NX3RyYWl0cykpKSk7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICBpZiAoX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9xdW90ZWRfY2hhcikpCisJeworCSAgLy8gbm90ZSB0aGF0IGluIHRoZSBFQ01BIGdyYW1tYXIsIHRoaXMgY2FzZSBjb3ZlcnMgYmFja3JlZnMuCisJICBfTV9zdGFjay5wdXNoKF9TdGF0ZVNlcShfTV9zdGF0ZV9zdG9yZSwKKwkJCQkgIF9NX3N0YXRlX3N0b3JlLl9NX2luc2VydF9tYXRjaGVyCisJCQkJICAoX0NNYXRjaGVyKF9NX2N1cl92YWx1ZVswXSwgX01fdHJhaXRzKSkpKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX2JhY2tyZWYpKQorCXsKKwkgIC8vIF9fbS5wdXNoKF9NYXRjaGVyOjpfU19vcGNvZGVfb3JkY2hhciwgX01fY3VyX3ZhbHVlKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX3N1YmV4cHJfYmVnaW4pKQorCXsKKwkgIGludCBfX21hcmsgPSBfTV9zdGF0ZV9zdG9yZS5fTV9zdWJfY291bnQoKTsKKwkgIF9TdGF0ZVNlcSBfX3IoX01fc3RhdGVfc3RvcmUsCisJCQlfTV9zdGF0ZV9zdG9yZS4KKwkJCV9NX2luc2VydF9zdWJleHByX2JlZ2luKF9TdGFydChfX21hcmspKSk7CisJICB0aGlzLT5fTV9kaXNqdW5jdGlvbigpOworCSAgaWYgKCFfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX3N1YmV4cHJfZW5kKSkKKwkgICAgX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX3BhcmVuKTsKKwkgIGlmICghX01fc3RhY2suZW1wdHkoKSkKKwkgICAgeworCSAgICAgIF9fci5fTV9hcHBlbmQoX01fc3RhY2sudG9wKCkpOworCSAgICAgIF9NX3N0YWNrLnBvcCgpOworCSAgICB9CisJICBfX3IuX01fYXBwZW5kKF9NX3N0YXRlX3N0b3JlLl9NX2luc2VydF9zdWJleHByX2VuZAorCQkJKF9fbWFyaywgX0VuZChfX21hcmspKSk7CisJICBfTV9zdGFjay5wdXNoKF9fcik7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICByZXR1cm4gX01fYnJhY2tldF9leHByZXNzaW9uKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXIsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIGJvb2wKKyAgICBfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+OjoKKyAgICBfTV9icmFja2V0X2V4cHJlc3Npb24oKQorICAgIHsKKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX2JyYWNrZXRfYmVnaW4pKQorCXsKKwkgIF9STWF0Y2hlclQgX19tYXRjaGVyKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fbGluZV9iZWdpbiksCisJCQkgICAgICAgX01fdHJhaXRzKTsKKwkgIGlmICghX01fYnJhY2tldF9saXN0KF9fbWF0Y2hlcikKKwkgICAgICB8fCAhX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9icmFja2V0X2VuZCkpCisJICAgIF9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl9icmFjayk7CisJICBfTV9zdGFjay5wdXNoKF9TdGF0ZVNlcShfTV9zdGF0ZV9zdG9yZSwKKwkJCQkgIF9NX3N0YXRlX3N0b3JlLl9NX2luc2VydF9tYXRjaGVyKF9fbWF0Y2hlcikpKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLy8gSWYgdGhlIGRhc2ggaXMgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBicmFja2V0IGV4cHJlc3Npb24sIGl0IGlzIG5vdAorICAvLyBzcGVjaWFsLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBib29sCisgICAgX0NvbXBpbGVyPF9Jbkl0ZXIsIF9UcmFpdHNUPjo6CisgICAgX01fYnJhY2tldF9saXN0KF9STWF0Y2hlclQmIF9fbWF0Y2hlcikKKyAgICB7CisgICAgICBpZiAoX01fZm9sbG93X2xpc3QoX19tYXRjaGVyKSkKKwl7CisJICBpZiAoX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9kYXNoKSkKKwkgICAgX19tYXRjaGVyLl9NX2FkZF9jaGFyKF9NX2N1cl92YWx1ZVswXSk7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXIsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIGJvb2wKKyAgICBfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+OjoKKyAgICBfTV9mb2xsb3dfbGlzdChfUk1hdGNoZXJUJiBfX21hdGNoZXIpCisgICAgeyByZXR1cm4gX01fZXhwcmVzc2lvbl90ZXJtKF9fbWF0Y2hlcikgJiYgX01fZm9sbG93X2xpc3QyKF9fbWF0Y2hlcik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBib29sCisgICAgX0NvbXBpbGVyPF9Jbkl0ZXIsIF9UcmFpdHNUPjo6CisgICAgX01fZm9sbG93X2xpc3QyKF9STWF0Y2hlclQmIF9fbWF0Y2hlcikKKyAgICB7CisgICAgICBpZiAoX01fZXhwcmVzc2lvbl90ZXJtKF9fbWF0Y2hlcikpCisJcmV0dXJuIF9NX2ZvbGxvd19saXN0MihfX21hdGNoZXIpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXIsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIGJvb2wKKyAgICBfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+OjoKKyAgICBfTV9leHByZXNzaW9uX3Rlcm0oX1JNYXRjaGVyVCYgX19tYXRjaGVyKQorICAgIHsKKyAgICAgIHJldHVybiAoX01fY29sbGF0aW5nX3N5bWJvbChfX21hdGNoZXIpCisJICAgICAgfHwgX01fY2hhcmFjdGVyX2NsYXNzKF9fbWF0Y2hlcikKKwkgICAgICB8fCBfTV9lcXVpdmFsZW5jZV9jbGFzcyhfX21hdGNoZXIpCisJICAgICAgfHwgKF9NX3N0YXJ0X3JhbmdlKF9fbWF0Y2hlcikKKwkJICAmJiBfTV9yYW5nZV9leHByZXNzaW9uKF9fbWF0Y2hlcikpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgYm9vbAorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9NX3JhbmdlX2V4cHJlc3Npb24oX1JNYXRjaGVyVCYgX19tYXRjaGVyKQorICAgIHsKKyAgICAgIGlmICghX01fY29sbGF0aW5nX3N5bWJvbChfX21hdGNoZXIpKQorCWlmICghX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9kYXNoKSkKKwkgIF9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl9yYW5nZSk7CisgICAgICBfX21hdGNoZXIuX01fbWFrZV9yYW5nZSgpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXIsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIGJvb2wKKyAgICBfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+OjoKKyAgICBfTV9zdGFydF9yYW5nZShfUk1hdGNoZXJUJiBfX21hdGNoZXIpCisgICAgeyByZXR1cm4gX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9kYXNoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXIsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIGJvb2wKKyAgICBfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+OjoKKyAgICBfTV9jb2xsYXRpbmdfc3ltYm9sKF9STWF0Y2hlclQmIF9fbWF0Y2hlcikKKyAgICB7CisgICAgICBpZiAoX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9jb2xsZWxlbV9zaW5nbGUpKQorCXsKKwkgIF9fbWF0Y2hlci5fTV9hZGRfY2hhcihfTV9jdXJfdmFsdWVbMF0pOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fY29sbHN5bWJvbCkpCisJeworCSAgX19tYXRjaGVyLl9NX2FkZF9jb2xsYXRpbmdfZWxlbWVudChfTV9jdXJfdmFsdWUpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBib29sCisgICAgX0NvbXBpbGVyPF9Jbkl0ZXIsIF9UcmFpdHNUPjo6CisgICAgX01fZXF1aXZhbGVuY2VfY2xhc3MoX1JNYXRjaGVyVCYgX19tYXRjaGVyKQorICAgIHsKKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX2VxdWl2X2NsYXNzX25hbWUpKQorCXsKKwkgIF9fbWF0Y2hlci5fTV9hZGRfZXF1aXZhbGVuY2VfY2xhc3MoX01fY3VyX3ZhbHVlKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgYm9vbAorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9NX2NoYXJhY3Rlcl9jbGFzcyhfUk1hdGNoZXJUJiBfX21hdGNoZXIpCisgICAgeworICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fY2hhcl9jbGFzc19uYW1lKSkKKwl7CisJICBfX21hdGNoZXIuX01fYWRkX2NoYXJhY3Rlcl9jbGFzcyhfTV9jdXJfdmFsdWUpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBpbnQKKyAgICBfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+OjoKKyAgICBfTV9jdXJfaW50X3ZhbHVlKGludCBfX3JhZGl4KQorICAgIHsKKyAgICAgIGludCBfX3YgPSAwOworICAgICAgZm9yICh0eXBlbmFtZSBfU3RyaW5nVDo6c2l6ZV90eXBlIF9faSA9IDA7CisJICAgX19pIDwgX01fY3VyX3ZhbHVlLmxlbmd0aCgpOyArK19faSkKKwlfX3YgPV9fdiAqIF9fcmFkaXggKyBfTV90cmFpdHMudmFsdWUoX01fY3VyX3ZhbHVlW19faV0sIF9fcmFkaXgpOworICAgICAgcmV0dXJuIF9fdjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgX0F1dG9tYXRvblB0cgorICAgIF9fY29tcGlsZShjb25zdCBfSW5JdGVyJiBfX2IsIGNvbnN0IF9Jbkl0ZXImIF9fZSwgX1RyYWl0c1QmIF9fdCwKKwkgICAgICByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBfX2YpCisgICAgeyByZXR1cm4gX0F1dG9tYXRvblB0cihuZXcgX05mYShfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+KF9fYiwgX19lLCBfX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mKS5fTV9uZmEoKSkpOyB9CisKKyAvL0B9IHJlZ2V4LWRldGFpbAorX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBfX2RldGFpbAorfSAvLyBuYW1lc3BhY2Ugc3RkCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmVnZXhfY29uc3RhbnRzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmVnZXhfY29uc3RhbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVhMmE1YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yZWdleF9jb25zdGFudHMuaApAQCAtMCwwICsxLDMxMCBAQAorLy8gY2xhc3MgdGVtcGxhdGUgcmVnZXggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqCisgKiAgQGZpbGUgYml0cy9yZWdleF9jb25zdGFudHMuaAorICogIEBicmllZiBDb25zdGFudCBkZWZpbml0aW9ucyBmb3IgdGhlIHN0ZCByZWdleCBsaWJyYXJ5LgorICoKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtyZWdleH0KKyAqLworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKKy8qKgorICogQGRlZmdyb3VwIHJlZ2V4IFJlZ3VsYXIgRXhwcmVzc2lvbnMKKyAqCisgKiBBIGZhY2lsaXR5IGZvciBwZXJmb3JtaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIG1hdGNoaW5nLgorICogQHsKKyAqLworCisvKioKKyAqIEBuYW1lc3BhY2Ugc3RkOjpyZWdleF9jb25zdGFudHMKKyAqIEBicmllZiBJU08gQysrLTB4IGVudGl0aWVzIHN1YiBuYW1lc3BhY2UgZm9yIHJlZ2V4LgorICovCituYW1lc3BhY2UgcmVnZXhfY29uc3RhbnRzCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAbmFtZSA1LjEgUmVndWxhciBFeHByZXNzaW9uIFN5bnRheCBPcHRpb25zCisgICAqLworICAvL0B7CisgIGVudW0gX19zeW50YXhfb3B0aW9uCisgICAgeworICAgICAgX1NfaWNhc2UsCisgICAgICBfU19ub3N1YnMsCisgICAgICBfU19vcHRpbWl6ZSwKKyAgICAgIF9TX2NvbGxhdGUsCisgICAgICBfU19FQ01BU2NyaXB0LAorICAgICAgX1NfYmFzaWMsCisgICAgICBfU19leHRlbmRlZCwKKyAgICAgIF9TX2F3aywKKyAgICAgIF9TX2dyZXAsCisgICAgICBfU19lZ3JlcCwKKyAgICAgIF9TX3N5bnRheF9sYXN0CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFRoaXMgaXMgYSBiaXRtYXNrIHR5cGUgaW5kaWNhdGluZyBob3cgdG8gaW50ZXJwcmV0IHRoZSByZWdleC4KKyAgICoKKyAgICogVGhlIEBjIHN5bnRheF9vcHRpb25fdHlwZSBpcyBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJ1dCBpdCBpcyB2YWxpZCB0bworICAgKiBwZXJmb3JtIGJpdHdpc2Ugb3BlcmF0aW9ucyBvbiB0aGVzZSB2YWx1ZXMgYW5kIGV4cGVjdCB0aGUgcmlnaHQgdGhpbmcgdG8KKyAgICogaGFwcGVuLgorICAgKgorICAgKiBBIHZhbGlkIHZhbHVlIG9mIHR5cGUgc3ludGF4X29wdGlvbl90eXBlIHNoYWxsIGhhdmUgZXhhY3RseSBvbmUgb2YgdGhlCisgICAqIGVsZW1lbnRzIEBjIEVDTUFTY3JpcHQsIEBjIGJhc2ljLCBAYyBleHRlbmRlZCwgQGMgYXdrLCBAYyBncmVwLCBAYyBlZ3JlcAorICAgKiAlc2V0LgorICAgKi8KKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgc3ludGF4X29wdGlvbl90eXBlOworCisgIC8qKiAKKyAgICogU3BlY2lmaWVzIHRoYXQgdGhlIG1hdGNoaW5nIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYWdhaW5zdCBhIGNoYXJhY3RlcgorICAgKiBzZXF1ZW5jZSBzaGFsbCBiZSBwZXJmb3JtZWQgd2l0aG91dCByZWdhcmQgdG8gY2FzZS4KKyAgICovCisgIGNvbnN0ZXhwciBzeW50YXhfb3B0aW9uX3R5cGUgaWNhc2UgICAgICA9IDEgPDwgX1NfaWNhc2U7CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyB0aGF0IHdoZW4gYSByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCBhZ2FpbnN0IGEgY2hhcmFjdGVyCisgICAqIGNvbnRhaW5lciBzZXF1ZW5jZSwgbm8gc3ViLWV4cHJlc3Npb24gbWF0Y2hlcyBhcmUgdG8gYmUgc3RvcmVkIGluIHRoZQorICAgKiBzdXBwbGllZCBtYXRjaF9yZXN1bHRzIHN0cnVjdHVyZS4KKyAgICovCisgIGNvbnN0ZXhwciBzeW50YXhfb3B0aW9uX3R5cGUgbm9zdWJzICAgICA9IDEgPDwgX1Nfbm9zdWJzOworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZSBzaG91bGQgcGF5IG1vcmUgYXR0ZW50aW9uIHRvCisgICAqIHRoZSBzcGVlZCB3aXRoIHdoaWNoIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIG1hdGNoZWQsIGFuZCBsZXNzIHRvIHRoZQorICAgKiBzcGVlZCB3aXRoIHdoaWNoIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3RzIGFyZSBjb25zdHJ1Y3RlZC4gT3RoZXJ3aXNlCisgICAqIGl0IGhhcyBubyBkZXRlY3RhYmxlIGVmZmVjdCBvbiB0aGUgcHJvZ3JhbSBvdXRwdXQuCisgICAqLworICBjb25zdGV4cHIgc3ludGF4X29wdGlvbl90eXBlIG9wdGltaXplICAgPSAxIDw8IF9TX29wdGltaXplOworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhhdCBjaGFyYWN0ZXIgcmFuZ2VzIG9mIHRoZSBmb3JtIFthLWJdIHNob3VsZCBiZSBsb2NhbGUKKyAgICogc2Vuc2l0aXZlLgorICAgKi8KKyAgY29uc3RleHByIHN5bnRheF9vcHRpb25fdHlwZSBjb2xsYXRlICAgID0gMSA8PCBfU19jb2xsYXRlOworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgZ3JhbW1hciByZWNvZ25pemVkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lIGlzCisgICAqIHRoYXQgdXNlZCBieSBFQ01BU2NyaXB0IGluIEVDTUEtMjYyIFtFY21hIEludGVybmF0aW9uYWwsIEVDTUFTY3JpcHQKKyAgICogTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgU3RhbmRhcmQgRWNtYS0yNjIsIHRoaXJkIGVkaXRpb24sIDE5OTldLCBhcworICAgKiBtb2RpZmllZCBpbiBzZWN0aW9uIFsyOC4xM10uICBUaGlzIGdyYW1tYXIgaXMgc2ltaWxhciB0byB0aGF0IGRlZmluZWQKKyAgICogaW4gdGhlIFBFUkwgc2NyaXB0aW5nIGxhbmd1YWdlIGJ1dCBleHRlbmRlZCB3aXRoIGVsZW1lbnRzIGZvdW5kIGluIHRoZQorICAgKiBQT1NJWCByZWd1bGFyIGV4cHJlc3Npb24gZ3JhbW1hci4KKyAgICovCisgIGNvbnN0ZXhwciBzeW50YXhfb3B0aW9uX3R5cGUgRUNNQVNjcmlwdCA9IDEgPDwgX1NfRUNNQVNjcmlwdDsKKworICAvKioKKyAgICogU3BlY2lmaWVzIHRoYXQgdGhlIGdyYW1tYXIgcmVjb2duaXplZCBieSB0aGUgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZSBpcworICAgKiB0aGF0IHVzZWQgYnkgUE9TSVggYmFzaWMgcmVndWxhciBleHByZXNzaW9ucyBpbiBJRUVFIFN0ZCAxMDAzLjEtMjAwMSwKKyAgICogUG9ydGFibGUgT3BlcmF0aW5nIFN5c3RlbSBJbnRlcmZhY2UgKFBPU0lYKSwgQmFzZSBEZWZpbml0aW9ucyBhbmQKKyAgICogSGVhZGVycywgU2VjdGlvbiA5LCBSZWd1bGFyIEV4cHJlc3Npb25zIFtJRUVFLCBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IC0tCisgICAqIFBvcnRhYmxlIE9wZXJhdGluZyBTeXN0ZW0gSW50ZXJmYWNlIChQT1NJWCksIElFRUUgU3RhbmRhcmQgMTAwMy4xLTIwMDFdLgorICAgKi8KKyAgY29uc3RleHByIHN5bnRheF9vcHRpb25fdHlwZSBiYXNpYyAgICAgID0gMSA8PCBfU19iYXNpYzsKKworICAvKioKKyAgICogU3BlY2lmaWVzIHRoYXQgdGhlIGdyYW1tYXIgcmVjb2duaXplZCBieSB0aGUgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZSBpcworICAgKiB0aGF0IHVzZWQgYnkgUE9TSVggZXh0ZW5kZWQgcmVndWxhciBleHByZXNzaW9ucyBpbiBJRUVFIFN0ZCAxMDAzLjEtMjAwMSwKKyAgICogUG9ydGFibGUgT3BlcmF0aW5nIFN5c3RlbSBJbnRlcmZhY2UgKFBPU0lYKSwgQmFzZSBEZWZpbml0aW9ucyBhbmQgSGVhZGVycywKKyAgICogU2VjdGlvbiA5LCBSZWd1bGFyIEV4cHJlc3Npb25zLgorICAgKi8KKyAgY29uc3RleHByIHN5bnRheF9vcHRpb25fdHlwZSBleHRlbmRlZCAgID0gMSA8PCBfU19leHRlbmRlZDsKKworICAvKioKKyAgICogU3BlY2lmaWVzIHRoYXQgdGhlIGdyYW1tYXIgcmVjb2duaXplZCBieSB0aGUgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZSBpcworICAgKiB0aGF0IHVzZWQgYnkgUE9TSVggdXRpbGl0eSBhd2sgaW4gSUVFRSBTdGQgMTAwMy4xLTIwMDEuICBUaGlzIG9wdGlvbiBpcworICAgKiBpZGVudGljYWwgdG8gc3ludGF4X29wdGlvbl90eXBlIGV4dGVuZGVkLCBleGNlcHQgdGhhdCBDLXN0eWxlIGVzY2FwZQorICAgKiBzZXF1ZW5jZXMgYXJlIHN1cHBvcnRlZC4gIFRoZXNlIHNlcXVlbmNlcyBhcmU6CisgICAqIFxcXFwsIFxcYSwgXFxiLCBcXGYsIFxcbiwgXFxyLCBcXHQgLCBcXHYsIFxcJmFwb3M7LCAmYXBvczssCisgICAqIGFuZCBcXGRkZCAod2hlcmUgZGRkIGlzIG9uZSwgdHdvLCBvciB0aHJlZSBvY3RhbCBkaWdpdHMpLiAgCisgICAqLworICBjb25zdGV4cHIgc3ludGF4X29wdGlvbl90eXBlIGF3ayAgICAgICAgPSAxIDw8IF9TX2F3azsKKworICAvKioKKyAgICogU3BlY2lmaWVzIHRoYXQgdGhlIGdyYW1tYXIgcmVjb2duaXplZCBieSB0aGUgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZSBpcworICAgKiB0aGF0IHVzZWQgYnkgUE9TSVggdXRpbGl0eSBncmVwIGluIElFRUUgU3RkIDEwMDMuMS0yMDAxLiAgVGhpcyBvcHRpb24gaXMKKyAgICogaWRlbnRpY2FsIHRvIHN5bnRheF9vcHRpb25fdHlwZSBiYXNpYywgZXhjZXB0IHRoYXQgbmV3bGluZXMgYXJlIHRyZWF0ZWQKKyAgICogYXMgd2hpdGVzcGFjZS4KKyAgICovCisgIGNvbnN0ZXhwciBzeW50YXhfb3B0aW9uX3R5cGUgZ3JlcCAgICAgICA9IDEgPDwgX1NfZ3JlcDsKKworICAvKioKKyAgICogU3BlY2lmaWVzIHRoYXQgdGhlIGdyYW1tYXIgcmVjb2duaXplZCBieSB0aGUgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZSBpcworICAgKiB0aGF0IHVzZWQgYnkgUE9TSVggdXRpbGl0eSBncmVwIHdoZW4gZ2l2ZW4gdGhlIC1FIG9wdGlvbiBpbgorICAgKiBJRUVFIFN0ZCAxMDAzLjEtMjAwMS4gIFRoaXMgb3B0aW9uIGlzIGlkZW50aWNhbCB0byBzeW50YXhfb3B0aW9uX3R5cGUgCisgICAqIGV4dGVuZGVkLCBleGNlcHQgdGhhdCBuZXdsaW5lcyBhcmUgdHJlYXRlZCBhcyB3aGl0ZXNwYWNlLgorICAgKi8KKyAgY29uc3RleHByIHN5bnRheF9vcHRpb25fdHlwZSBlZ3JlcCAgICAgID0gMSA8PCBfU19lZ3JlcDsKKworICAvL0B9CisKKyAgLyoqCisgICAqIEBuYW1lIDUuMiBNYXRjaGluZyBSdWxlcworICAgKgorICAgKiBNYXRjaGluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhZ2FpbnN0IGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBbZmlyc3QsCisgICAqIGxhc3QpIHByb2NlZWRzIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgdGhlIGdyYW1tYXIgc3BlY2lmaWVkIGZvciB0aGUKKyAgICogcmVndWxhciBleHByZXNzaW9uIG9iamVjdCwgbW9kaWZpZWQgYWNjb3JkaW5nIHRvIHRoZSBlZmZlY3RzIGxpc3RlZAorICAgKiBiZWxvdyBmb3IgYW55IGJpdG1hc2sgZWxlbWVudHMgc2V0LgorICAgKgorICAgKi8KKyAgLy9AeworCisgIGVudW0gX19tYXRjaF9mbGFnCisgICAgeworICAgICAgX1Nfbm90X2JvbCwKKyAgICAgIF9TX25vdF9lb2wsCisgICAgICBfU19ub3RfYm93LAorICAgICAgX1Nfbm90X2VvdywKKyAgICAgIF9TX2FueSwKKyAgICAgIF9TX25vdF9udWxsLAorICAgICAgX1NfY29udGludW91cywKKyAgICAgIF9TX3ByZXZfYXZhaWwsCisgICAgICBfU19zZWQsCisgICAgICBfU19ub19jb3B5LAorICAgICAgX1NfZmlyc3Rfb25seSwKKyAgICAgIF9TX21hdGNoX2ZsYWdfbGFzdAorICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBUaGlzIGlzIGEgYml0bWFzayB0eXBlIGluZGljYXRpbmcgcmVnZXggbWF0Y2hpbmcgcnVsZXMuCisgICAqCisgICAqIFRoZSBAYyBtYXRjaF9mbGFnX3R5cGUgaXMgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBidXQgaXQgaXMgdmFsaWQgdG8KKyAgICogcGVyZm9ybSBiaXR3aXNlIG9wZXJhdGlvbnMgb24gdGhlc2UgdmFsdWVzIGFuZCBleHBlY3QgdGhlIHJpZ2h0IHRoaW5nIHRvCisgICAqIGhhcHBlbi4KKyAgICovCisgIHR5cGVkZWYgc3RkOjpiaXRzZXQ8X1NfbWF0Y2hfZmxhZ19sYXN0PiBtYXRjaF9mbGFnX3R5cGU7CisKKyAgLyoqCisgICAqIFRoZSBkZWZhdWx0IG1hdGNoaW5nIHJ1bGVzLgorICAgKi8KKyAgY29uc3RleHByIG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9kZWZhdWx0ICAgICA9IDA7CisKKyAgLyoqCisgICAqIFRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHNlcXVlbmNlIFtmaXJzdCwgbGFzdCkgaXMgdHJlYXRlZCBhcyB0aG91Z2ggaXQKKyAgICogaXMgbm90IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLCBzbyB0aGUgY2hhcmFjdGVyICheKSBpbiB0aGUgcmVndWxhcgorICAgKiBleHByZXNzaW9uIHNoYWxsIG5vdCBtYXRjaCBbZmlyc3QsIGZpcnN0KS4KKyAgICovCisgIGNvbnN0ZXhwciBtYXRjaF9mbGFnX3R5cGUgbWF0Y2hfbm90X2JvbCAgICAgPSAxIDw8IF9TX25vdF9ib2w7CisKKyAgLyoqCisgICAqIFRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgc2VxdWVuY2UgW2ZpcnN0LCBsYXN0KSBpcyB0cmVhdGVkIGFzIHRob3VnaCBpdAorICAgKiBpcyBub3QgYXQgdGhlIGVuZCBvZiBhIGxpbmUsIHNvIHRoZSBjaGFyYWN0ZXIgKCQpIGluIHRoZSByZWd1bGFyCisgICAqIGV4cHJlc3Npb24gc2hhbGwgbm90IG1hdGNoIFtsYXN0LCBsYXN0KS4KKyAgICovCisgIGNvbnN0ZXhwciBtYXRjaF9mbGFnX3R5cGUgbWF0Y2hfbm90X2VvbCAgICAgPSAxIDw8IF9TX25vdF9lb2w7CisgICAKKyAgLyoqCisgICAqIFRoZSBleHByZXNzaW9uIFxcYiBpcyBub3QgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBzdWItc2VxdWVuY2UKKyAgICogW2ZpcnN0LGZpcnN0KS4KKyAgICovCisgIGNvbnN0ZXhwciBtYXRjaF9mbGFnX3R5cGUgbWF0Y2hfbm90X2JvdyAgICAgPSAxIDw8IF9TX25vdF9ib3c7CisgICAKKyAgLyoqCisgICAqIFRoZSBleHByZXNzaW9uIFxcYiBzaG91bGQgbm90IGJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgc3ViLXNlcXVlbmNlCisgICAqIFtsYXN0LGxhc3QpLgorICAgKi8KKyAgY29uc3RleHByIG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9ub3RfZW93ICAgICA9IDEgPDwgX1Nfbm90X2VvdzsKKyAgIAorICAvKioKKyAgICogSWYgbW9yZSB0aGFuIG9uZSBtYXRjaCBpcyBwb3NzaWJsZSB0aGVuIGFueSBtYXRjaCBpcyBhbiBhY2NlcHRhYmxlCisgICAqIHJlc3VsdC4KKyAgICovCisgIGNvbnN0ZXhwciBtYXRjaF9mbGFnX3R5cGUgbWF0Y2hfYW55ICAgICAgICAgPSAxIDw8IF9TX2FueTsKKyAgIAorICAvKioKKyAgICogVGhlIGV4cHJlc3Npb24gZG9lcyBub3QgbWF0Y2ggYW4gZW1wdHkgc2VxdWVuY2UuCisgICAqLworICBjb25zdGV4cHIgbWF0Y2hfZmxhZ190eXBlIG1hdGNoX25vdF9udWxsICAgID0gMSA8PCBfU19ub3RfbnVsbDsKKyAgIAorICAvKioKKyAgICogVGhlIGV4cHJlc3Npb24gb25seSBtYXRjaGVzIGEgc3ViLXNlcXVlbmNlIHRoYXQgYmVnaW5zIGF0IGZpcnN0IC4KKyAgICovCisgIGNvbnN0ZXhwciBtYXRjaF9mbGFnX3R5cGUgbWF0Y2hfY29udGludW91cyAgPSAxIDw8IF9TX2NvbnRpbnVvdXM7CisgICAKKyAgLyoqCisgICAqIC0tZmlyc3QgaXMgYSB2YWxpZCBpdGVyYXRvciBwb3NpdGlvbi4gIFdoZW4gdGhpcyBmbGFnIGlzIHNldCB0aGVuIHRoZQorICAgKiBmbGFncyBtYXRjaF9ub3RfYm9sIGFuZCBtYXRjaF9ub3RfYm93IGFyZSBpZ25vcmVkIGJ5IHRoZSByZWd1bGFyCisgICAqIGV4cHJlc3Npb24gYWxnb3JpdGhtcyAyOC4xMSBhbmQgaXRlcmF0b3JzIDI4LjEyLgorICAgKi8KKyAgY29uc3RleHByIG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9wcmV2X2F2YWlsICA9IDEgPDwgX1NfcHJldl9hdmFpbDsKKworICAvKioKKyAgICogV2hlbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCBpcyB0byBiZSByZXBsYWNlZCBieSBhIG5ldyBzdHJpbmcsIHRoZQorICAgKiBuZXcgc3RyaW5nIGlzIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBydWxlcyB1c2VkIGJ5IHRoZSBFQ01BU2NyaXB0IHJlcGxhY2UKKyAgICogZnVuY3Rpb24gaW4gRUNNQS0gMjYyIFtFY21hIEludGVybmF0aW9uYWwsIEVDTUFTY3JpcHQgTGFuZ3VhZ2UKKyAgICogU3BlY2lmaWNhdGlvbiwgU3RhbmRhcmQgRWNtYS0yNjIsIHRoaXJkIGVkaXRpb24sIDE5OTldLCBwYXJ0IDE1LjUuNC4xMQorICAgKiBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UuIEluIGFkZGl0aW9uLCBkdXJpbmcgc2VhcmNoIGFuZCByZXBsYWNlCisgICAqIG9wZXJhdGlvbnMgYWxsIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uCisgICAqIGFyZSBsb2NhdGVkIGFuZCByZXBsYWNlZCwgYW5kIHNlY3Rpb25zIG9mIHRoZSBpbnB1dCB0aGF0IGRpZCBub3QgbWF0Y2gKKyAgICogdGhlIGV4cHJlc3Npb24gYXJlIGNvcGllZCB1bmNoYW5nZWQgdG8gdGhlIG91dHB1dCBzdHJpbmcuCisgICAqIAorICAgKiBGb3JtYXQgc3RyaW5ncyAoZnJvbSBFQ01BLTI2MiBbMTUuNS40LjExXSk6CisgICAqIEBsaSAkJCAgVGhlIGRvbGxhci1zaWduIGl0c2VsZiAoJCkKKyAgICogQGxpICQmICBUaGUgbWF0Y2hlZCBzdWJzdHJpbmcuCisgICAqIEBsaSAkYCAgVGhlIHBvcnRpb24gb2YgQGEgc3RyaW5nIHRoYXQgcHJlY2VkZXMgdGhlIG1hdGNoZWQgc3Vic3RyaW5nLgorICAgKiAgICAgICAgIFRoaXMgd291bGQgYmUgbWF0Y2hfcmVzdWx0czo6cHJlZml4KCkuCisgICAqIEBsaSAkJyAgVGhlIHBvcnRpb24gb2YgQGEgc3RyaW5nIHRoYXQgZm9sbG93cyB0aGUgbWF0Y2hlZCBzdWJzdHJpbmcuCisgICAqICAgICAgICAgVGhpcyB3b3VsZCBiZSBtYXRjaF9yZXN1bHRzOjpzdWZmaXgoKS4KKyAgICogQGxpICRuICBUaGUgbnRoIGNhcHR1cmUsIHdoZXJlIG4gaXMgaW4gWzEsOV0gYW5kICRuIGlzIG5vdCBmb2xsb3dlZCBieSBhCisgICAqICAgICAgICAgZGVjaW1hbCBkaWdpdC4gIElmIG4gPD0gbWF0Y2hfcmVzdWx0czo6c2l6ZSgpIGFuZCB0aGUgbnRoIGNhcHR1cmUKKyAgICogICAgICAgICBpcyB1bmRlZmluZWQsIHVzZSB0aGUgZW1wdHkgc3RyaW5nIGluc3RlYWQuICBJZiBuID4KKyAgICogICAgICAgICBtYXRjaF9yZXN1bHRzOjpzaXplKCksIHRoZSByZXN1bHQgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KKyAgICogQGxpICRubiBUaGUgbm50aCBjYXB0dXJlLCB3aGVyZSBubiBpcyBhIHR3by1kaWdpdCBkZWNpbWFsIG51bWJlciBvbgorICAgKiAgICAgICAgIFswMSwgOTldLiAgSWYgbm4gPD0gbWF0Y2hfcmVzdWx0czo6c2l6ZSgpIGFuZCB0aGUgbnRoIGNhcHR1cmUgaXMKKyAgICogICAgICAgICB1bmRlZmluZWQsIHVzZSB0aGUgZW1wdHkgc3RyaW5nIGluc3RlYWQuIElmCisgICAqICAgICAgICAgbm4gPiBtYXRjaF9yZXN1bHRzOjpzaXplKCksIHRoZSByZXN1bHQgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KKyAgICovCisgIGNvbnN0ZXhwciBtYXRjaF9mbGFnX3R5cGUgZm9ybWF0X2RlZmF1bHQgICAgPSAwOworCisgIC8qKgorICAgKiBXaGVuIGEgcmVndWxhciBleHByZXNzaW9uIG1hdGNoIGlzIHRvIGJlIHJlcGxhY2VkIGJ5IGEgbmV3IHN0cmluZywgdGhlCisgICAqIG5ldyBzdHJpbmcgaXMgY29uc3RydWN0ZWQgdXNpbmcgdGhlIHJ1bGVzIHVzZWQgYnkgdGhlIFBPU0lYIHNlZCB1dGlsaXR5CisgICAqIGluIElFRUUgU3RkIDEwMDMuMS0gMjAwMSBbSUVFRSwgSW5mb3JtYXRpb24gVGVjaG5vbG9neSAtLSBQb3J0YWJsZQorICAgKiBPcGVyYXRpbmcgU3lzdGVtIEludGVyZmFjZSAoUE9TSVgpLCBJRUVFIFN0YW5kYXJkIDEwMDMuMS0yMDAxXS4KKyAgICovCisgIGNvbnN0ZXhwciBtYXRjaF9mbGFnX3R5cGUgZm9ybWF0X3NlZCAgICAgICAgPSAxIDw8IF9TX3NlZDsKKworICAvKioKKyAgICogRHVyaW5nIGEgc2VhcmNoIGFuZCByZXBsYWNlIG9wZXJhdGlvbiwgc2VjdGlvbnMgb2YgdGhlIGNoYXJhY3RlcgorICAgKiBjb250YWluZXIgc2VxdWVuY2UgYmVpbmcgc2VhcmNoZWQgdGhhdCBkbyBub3QgbWF0Y2ggdGhlIHJlZ3VsYXIKKyAgICogZXhwcmVzc2lvbiBzaGFsbCBub3QgYmUgY29waWVkIHRvIHRoZSBvdXRwdXQgc3RyaW5nLgorICAgKi8KKyAgY29uc3RleHByIG1hdGNoX2ZsYWdfdHlwZSBmb3JtYXRfbm9fY29weSAgICA9IDEgPDwgX1Nfbm9fY29weTsKKworICAvKioKKyAgICogV2hlbiBzcGVjaWZpZWQgZHVyaW5nIGEgc2VhcmNoIGFuZCByZXBsYWNlIG9wZXJhdGlvbiwgb25seSB0aGUgZmlyc3QKKyAgICogb2NjdXJyZW5jZSBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uIHNoYWxsIGJlIHJlcGxhY2VkLgorICAgKi8KKyAgY29uc3RleHByIG1hdGNoX2ZsYWdfdHlwZSBmb3JtYXRfZmlyc3Rfb25seSA9IDEgPDwgX1NfZmlyc3Rfb25seTsKKworICAvL0B9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgcmVnZXhfY29uc3RhbnRzCisKKy8qIEB9ICovIC8vIGdyb3VwIHJlZ2V4Cit9IC8vIG5hbWVzcGFjZSBzdGQKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JlZ2V4X2N1cnNvci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JlZ2V4X2N1cnNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZTlkMWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmVnZXhfY3Vyc29yLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8vIGNsYXNzIHRlbXBsYXRlIHJlZ2V4IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKgorICogIEBmaWxlIGJpdHMvcmVnZXhfY3Vyc29yLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtyZWdleH0KKyAqLworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX2RldGFpbAoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBkZWZncm91cCByZWdleC1kZXRhaWwgQmFzZSBhbmQgSW1wbGVtZW50YXRpb24gQ2xhc3NlcworICAgKiAgQGluZ3JvdXAgcmVnZXgKKyAgICogIEB7CisgICAqLworCisgIC8vLyBBQkMgZm9yIHBhdHRlcm4gbWF0Y2hpbmcKKyAgc3RydWN0IF9QYXR0ZXJuQ3Vyc29yCisgIHsKKyAgICB2aXJ0dWFsIH5fUGF0dGVybkN1cnNvcigpIHsgfTsKKyAgICB2aXJ0dWFsIHZvaWQgX01fbmV4dCgpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgX01fYXRfZW5kKCkgY29uc3QgPSAwOworICB9OworCisgIC8vLyBQcm92aWRlcyBhIGN1cnNvciBpbnRvIHRoZSBzcGVjaWZpYyB0YXJnZXQgc3RyaW5nLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRndkSXRlclQ+CisgICAgY2xhc3MgX1NwZWNpYWxpemVkQ3Vyc29yCisgICAgOiBwdWJsaWMgX1BhdHRlcm5DdXJzb3IKKyAgICB7CisgICAgcHVibGljOgorICAgICAgX1NwZWNpYWxpemVkQ3Vyc29yKGNvbnN0IF9Gd2RJdGVyVCYgX19iLCBjb25zdCBfRndkSXRlclQgX19lKQorICAgICAgOiBfTV9iKF9fYiksIF9NX2MoX19iKSwgX01fZShfX2UpCisgICAgICB7IH0KKworICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0Z3ZEl0ZXJUPjo6dmFsdWVfdHlwZQorICAgICAgX01fY3VycmVudCgpIGNvbnN0CisgICAgICB7IHJldHVybiAqX01fYzsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9uZXh0KCkKKyAgICAgIHsgKytfTV9jOyB9CisKKyAgICAgIF9Gd2RJdGVyVAorICAgICAgX01fcG9zKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2M7IH0KKworICAgICAgY29uc3QgX0Z3ZEl0ZXJUJgorICAgICAgX01fYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYjsgfQorCisgICAgICBjb25zdCBfRndkSXRlclQmCisgICAgICBfTV9lbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZTsgfQorCisgICAgICBib29sCisgICAgICBfTV9hdF9lbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYyA9PSBfTV9lOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX0Z3ZEl0ZXJUIF9NX2I7CisgICAgICBfRndkSXRlclQgX01fYzsKKyAgICAgIF9Gd2RJdGVyVCBfTV9lOworICAgIH07CisKKyAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGN1cnNvciBzcGVjaWFsaXplZCBmb3IgYW4gaXRlcmF0b3IgY2xhc3MuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gd2RJdGVyVD4KKyAgICBpbmxpbmUgX1NwZWNpYWxpemVkQ3Vyc29yPF9Gd2RJdGVyVD4KKyAgICBfX2N1cnNvcihjb25zdCBfRndkSXRlclQmIF9fYiwgY29uc3QgX0Z3ZEl0ZXJUIF9fZSkKKyAgICB7IHJldHVybiBfU3BlY2lhbGl6ZWRDdXJzb3I8X0Z3ZEl0ZXJUPihfX2IsIF9fZSk7IH0KKworIC8vQH0gcmVnZXgtZGV0YWlsCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIF9fZGV0YWlsCit9IC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JlZ2V4X2Vycm9yLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmVnZXhfZXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTBiMjAyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JlZ2V4X2Vycm9yLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8vIGNsYXNzIHRlbXBsYXRlIHJlZ2V4IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKgorICogQGZpbGUgYml0cy9yZWdleF9lcnJvci5oCisgKiBAYnJpZWYgRXJyb3IgYW5kIGV4Y2VwdGlvbiBvYmplY3RzIGZvciB0aGUgc3RkIHJlZ2V4IGxpYnJhcnkuCisgKgorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3JlZ2V4fQorICovCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworLyoqCisgKiBAYWRkdG9ncm91cCByZWdleAorICogQHsKKyAqLworCituYW1lc3BhY2UgcmVnZXhfY29uc3RhbnRzCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAbmFtZSA1LjMgRXJyb3IgVHlwZXMKKyAgICovCisgIC8vQHsKKyAKKyAgZW51bSBlcnJvcl90eXBlCisgICAgeworICAgICAgX1NfZXJyb3JfY29sbGF0ZSwKKyAgICAgIF9TX2Vycm9yX2N0eXBlLAorICAgICAgX1NfZXJyb3JfZXNjYXBlLAorICAgICAgX1NfZXJyb3JfYmFja3JlZiwKKyAgICAgIF9TX2Vycm9yX2JyYWNrLAorICAgICAgX1NfZXJyb3JfcGFyZW4sCisgICAgICBfU19lcnJvcl9icmFjZSwKKyAgICAgIF9TX2Vycm9yX2JhZGJyYWNlLAorICAgICAgX1NfZXJyb3JfcmFuZ2UsCisgICAgICBfU19lcnJvcl9zcGFjZSwKKyAgICAgIF9TX2Vycm9yX2JhZHJlcGVhdCwKKyAgICAgIF9TX2Vycm9yX2NvbXBsZXhpdHksCisgICAgICBfU19lcnJvcl9zdGFjaywKKyAgICAgIF9TX2Vycm9yX2xhc3QKKyAgICB9OworCisgIC8qKiBUaGUgZXhwcmVzc2lvbiBjb250YWluZWQgYW4gaW52YWxpZCBjb2xsYXRpbmcgZWxlbWVudCBuYW1lLiAqLworICBjb25zdGV4cHIgZXJyb3JfdHlwZSBlcnJvcl9jb2xsYXRlKF9TX2Vycm9yX2NvbGxhdGUpOworCisgIC8qKiBUaGUgZXhwcmVzc2lvbiBjb250YWluZWQgYW4gaW52YWxpZCBjaGFyYWN0ZXIgY2xhc3MgbmFtZS4gKi8KKyAgY29uc3RleHByIGVycm9yX3R5cGUgZXJyb3JfY3R5cGUoX1NfZXJyb3JfY3R5cGUpOworCisgIC8qKgorICAgKiBUaGUgZXhwcmVzc2lvbiBjb250YWluZWQgYW4gaW52YWxpZCBlc2NhcGVkIGNoYXJhY3Rlciwgb3IgYSB0cmFpbGluZworICAgKiBlc2NhcGUuCisgICAqLworICBjb25zdGV4cHIgZXJyb3JfdHlwZSBlcnJvcl9lc2NhcGUoX1NfZXJyb3JfZXNjYXBlKTsKKworICAvKiogVGhlIGV4cHJlc3Npb24gY29udGFpbmVkIGFuIGludmFsaWQgYmFjayByZWZlcmVuY2UuICovCisgIGNvbnN0ZXhwciBlcnJvcl90eXBlIGVycm9yX2JhY2tyZWYoX1NfZXJyb3JfYmFja3JlZik7CisKKyAgLyoqIFRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBtaXNtYXRjaGVkIFsgYW5kIF0uICovCisgIGNvbnN0ZXhwciBlcnJvcl90eXBlIGVycm9yX2JyYWNrKF9TX2Vycm9yX2JyYWNrKTsKKworICAvKiogVGhlIGV4cHJlc3Npb24gY29udGFpbmVkIG1pc21hdGNoZWQgKCBhbmQgKS4gKi8KKyAgY29uc3RleHByIGVycm9yX3R5cGUgZXJyb3JfcGFyZW4oX1NfZXJyb3JfcGFyZW4pOworCisgIC8qKiBUaGUgZXhwcmVzc2lvbiBjb250YWluZWQgbWlzbWF0Y2hlZCB7IGFuZCB9ICovCisgIGNvbnN0ZXhwciBlcnJvcl90eXBlIGVycm9yX2JyYWNlKF9TX2Vycm9yX2JyYWNlKTsKKworICAvKiogVGhlIGV4cHJlc3Npb24gY29udGFpbmVkIGFuIGludmFsaWQgcmFuZ2UgaW4gYSB7fSBleHByZXNzaW9uLiAqLworICBjb25zdGV4cHIgZXJyb3JfdHlwZSBlcnJvcl9iYWRicmFjZShfU19lcnJvcl9iYWRicmFjZSk7CisKKyAgLyoqCisgICAqIFRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBhbiBpbnZhbGlkIGNoYXJhY3RlciByYW5nZSwKKyAgICogc3VjaCBhcyBbYi1hXSBpbiBtb3N0IGVuY29kaW5ncy4KKyAgICovCisgIGNvbnN0ZXhwciBlcnJvcl90eXBlIGVycm9yX3JhbmdlKF9TX2Vycm9yX3JhbmdlKTsKKworICAvKioKKyAgICogVGhlcmUgd2FzIGluc3VmZmljaWVudCBtZW1vcnkgdG8gY29udmVydCB0aGUgZXhwcmVzc2lvbiBpbnRvIGEKKyAgICogZmluaXRlIHN0YXRlIG1hY2hpbmUuCisgICAqLworICBjb25zdGV4cHIgZXJyb3JfdHlwZSBlcnJvcl9zcGFjZShfU19lcnJvcl9zcGFjZSk7CisKKyAgLyoqCisgICAqIE9uZSBvZiA8ZW0+Kj8rezwvZW0+IHdhcyBub3QgcHJlY2VkZWQgYnkgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqLworICBjb25zdGV4cHIgZXJyb3JfdHlwZSBlcnJvcl9iYWRyZXBlYXQoX1NfZXJyb3JfYmFkcmVwZWF0KTsKKworICAvKioKKyAgICogVGhlIGNvbXBsZXhpdHkgb2YgYW4gYXR0ZW1wdGVkIG1hdGNoIGFnYWluc3QgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICogZXhjZWVkZWQgYSBwcmUtc2V0IGxldmVsLgorICAgKi8KKyAgY29uc3RleHByIGVycm9yX3R5cGUgZXJyb3JfY29tcGxleGl0eShfU19lcnJvcl9jb21wbGV4aXR5KTsKKworICAvKioKKyAgICogVGhlcmUgd2FzIGluc3VmZmljaWVudCBtZW1vcnkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlCisgICAqIHJlZ3VsYXIgZXhwcmVzc2lvbiBjb3VsZCBtYXRjaCB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICovCisgIGNvbnN0ZXhwciBlcnJvcl90eXBlIGVycm9yX3N0YWNrKF9TX2Vycm9yX3N0YWNrKTsKKworICAvL0B9CitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHJlZ2V4X2NvbnN0YW50cworCitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFs3LjhdIENsYXNzIHJlZ2V4X2Vycm9yCisgIC8qKgorICAgKiBAYnJpZWYgQSByZWd1bGFyIGV4cHJlc3Npb24gZXhjZXB0aW9uIGNsYXNzLgorICAgKiBAaW5ncm91cCBleGNlcHRpb25zCisgICAqCisgICAqIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gbGlicmFyeSB0aHJvd3Mgb2JqZWN0cyBvZiB0aGlzIGNsYXNzIG9uIGVycm9yLgorICAgKi8KKyAgY2xhc3MgcmVnZXhfZXJyb3IgOiBwdWJsaWMgc3RkOjpydW50aW1lX2Vycm9yCisgIHsKKyAgICByZWdleF9jb25zdGFudHM6OmVycm9yX3R5cGUgX01fY29kZTsKKworICBwdWJsaWM6CisgICAgLyoqCisgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSByZWdleF9lcnJvciBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gX19lY29kZSB0aGUgcmVnZXggZXJyb3IgY29kZS4KKyAgICAgKi8KKyAgICBleHBsaWNpdAorICAgIHJlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfdHlwZSBfX2Vjb2RlKTsKKworICAgIHZpcnR1YWwgfnJlZ2V4X2Vycm9yKCkgdGhyb3coKTsKKworICAgIC8qKgorICAgICAqIEBicmllZiBHZXRzIHRoZSByZWdleCBlcnJvciBjb2RlLgorICAgICAqCisgICAgICogQHJldHVybnMgdGhlIHJlZ2V4IGVycm9yIGNvZGUuCisgICAgICovCisgICAgcmVnZXhfY29uc3RhbnRzOjplcnJvcl90eXBlCisgICAgY29kZSgpIGNvbnN0CisgICAgeyByZXR1cm4gX01fY29kZTsgfQorICB9OworCisgIC8vQH0gLy8gZ3JvdXAgcmVnZXgKKworICB2b2lkCisgIF9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl90eXBlIF9fZWNvZGUpOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JlZ2V4X2dyZXBfbWF0Y2hlci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JlZ2V4X2dyZXBfbWF0Y2hlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOTdmYzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmVnZXhfZ3JlcF9tYXRjaGVyLmgKQEAgLTAsMCArMSwxMzggQEAKKy8vIGNsYXNzIHRlbXBsYXRlIHJlZ2V4IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKgorICogIEBmaWxlIGJpdHMvcmVnZXhfZ3JlcF9tYXRjaGVyLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtyZWdleH0KKyAqLworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpSXRlcj4KKyAgICBjbGFzcyBzdWJfbWF0Y2g7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgY2xhc3MgbWF0Y2hfcmVzdWx0czsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIAorbmFtZXNwYWNlIF9fZGV0YWlsCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGRlZmdyb3VwIHJlZ2V4LWRldGFpbCBCYXNlIGFuZCBJbXBsZW1lbnRhdGlvbiBDbGFzc2VzCisgICAqICBAaW5ncm91cCByZWdleAorICAgKiAgQHsKKyAgICovCisKKyAgLy8vIEEgX1Jlc3VsdHMgZmFjYWRlIHNwZWNpYWxpemVkIGZvciB3cmFwcGluZyBhIHRlbXBsYXRlZCBtYXRjaF9yZXN1bHRzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRndkSXRlclQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBfU3BlY2lhbGl6ZWRSZXN1bHRzCisgICAgOiBwdWJsaWMgX1Jlc3VsdHMKKyAgICB7CisgICAgcHVibGljOgorICAgICAgX1NwZWNpYWxpemVkUmVzdWx0cyhjb25zdCBfQXV0b21hdG9uOjpfU2l6ZVQgX19zaXplLAorCQkJICBjb25zdCBfU3BlY2lhbGl6ZWRDdXJzb3I8X0Z3ZEl0ZXJUPiYgX19jdXJzb3IsCisJCQkgIG1hdGNoX3Jlc3VsdHM8X0Z3ZEl0ZXJULCBfQWxsb2M+JiBfX20pOworCisgICAgICB2b2lkCisgICAgICBfTV9zZXRfcG9zKGludCBfX2ksIGludCBfX2osIGNvbnN0IF9QYXR0ZXJuQ3Vyc29yJiBfX3BjKTsKKworICAgICAgdm9pZAorICAgICAgX01fc2V0X21hdGNoZWQoaW50IF9faSwgYm9vbCBfX2lzX21hdGNoZWQpCisgICAgICB7IF9NX3Jlc3VsdHMuYXQoX19pKS5tYXRjaGVkID0gX19pc19tYXRjaGVkOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgbWF0Y2hfcmVzdWx0czxfRndkSXRlclQsIF9BbGxvYz4mIF9NX3Jlc3VsdHM7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRndkSXRlclQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBfU3BlY2lhbGl6ZWRSZXN1bHRzPF9Gd2RJdGVyVCwgX0FsbG9jPjo6CisgICAgX1NwZWNpYWxpemVkUmVzdWx0cyhjb25zdCBfQXV0b21hdG9uOjpfU2l6ZVQgX19zaXplLAorICAgIAkJCWNvbnN0IF9TcGVjaWFsaXplZEN1cnNvcjxfRndkSXRlclQ+JiBfX2N1cnNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX3Jlc3VsdHM8X0Z3ZEl0ZXJULCBfQWxsb2M+JiBfX20pCisgICAgOiBfTV9yZXN1bHRzKF9fbSkKKyAgICB7CisgICAgICBfTV9yZXN1bHRzLmNsZWFyKCk7CisgICAgICBfTV9yZXN1bHRzLnJlc2VydmUoX19zaXplICsgMik7CisgICAgICBfTV9yZXN1bHRzLnJlc2l6ZShfX3NpemUpOworICAgICAgdHlwZW5hbWUgbWF0Y2hfcmVzdWx0czxfRndkSXRlclQsIF9BbGxvYz46OnZhbHVlX3R5cGUgX19zbTsKKyAgICAgIF9fc20uZmlyc3QgPSBfX3NtLnNlY29uZCA9IF9fY3Vyc29yLl9NX2JlZ2luKCk7CisgICAgICBfTV9yZXN1bHRzLnB1c2hfYmFjayhfX3NtKTsKKyAgICAgIF9fc20uZmlyc3QgPSBfX3NtLnNlY29uZCA9IF9fY3Vyc29yLl9NX2VuZCgpOworICAgICAgX01fcmVzdWx0cy5wdXNoX2JhY2soX19zbSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gd2RJdGVyVCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfU3BlY2lhbGl6ZWRSZXN1bHRzPF9Gd2RJdGVyVCwgX0FsbG9jPjo6CisgICAgX01fc2V0X3BvcyhpbnQgX19pLCBpbnQgX19qLCBjb25zdCBfUGF0dGVybkN1cnNvciYgX19wYykKKyAgICB7IAorICAgICAgdHlwZWRlZiBjb25zdCBfU3BlY2lhbGl6ZWRDdXJzb3I8X0Z3ZEl0ZXJUPiYgX0N1cnNvclQ7CisgICAgICBfQ3Vyc29yVCBfX2MgPSBzdGF0aWNfY2FzdDxfQ3Vyc29yVD4oX19wYyk7CisgICAgICBpZiAoX19qID09IDApCisJX01fcmVzdWx0cy5hdChfX2kpLmZpcnN0ID0gX19jLl9NX3BvcygpOworICAgICAgZWxzZQorCV9NX3Jlc3VsdHMuYXQoX19pKS5zZWNvbmQgPSBfX2MuX01fcG9zKCkrMTsKKyAgICB9CisKKyAgLy8vIEEgc3RhY2sgb2Ygc3RhdGVzIHVzZWQgaW4gZXZhbHVhdGluZyB0aGUgTkZBLgorICB0eXBlZGVmIHN0ZDo6c3RhY2s8X1N0YXRlSWRULCBzdGQ6OnZlY3RvcjxfU3RhdGVJZFQ+ID4gX1N0YXRlU3RhY2s7CisKKyAgLy8vIEV4ZWN1dGVzIGEgcmVndWxhciBleHByZXNzaW9uIE5GQS9ERkEgb3ZlciBhIHJhbmdlIHVzaW5nIGEKKyAgLy8vIHZhcmlhbnQgb2YgdGhlIHBhcmFsbGVsIGV4ZWN1dGlvbiBhbGdvcml0aG0gZmVhdHVyZWQgaW4gdGhlIGdyZXAKKyAgLy8vIHV0aWxpdHksIG1vZGlmaWVkIHRvIHVzZSBMYXVyaWthcmkgdGFncy4KKyAgY2xhc3MgX0dyZXBfbWF0Y2hlcgorICB7CisgIHB1YmxpYzoKKyAgICBfR3JlcF9tYXRjaGVyKF9QYXR0ZXJuQ3Vyc29yJiAgICAgICAgICAgICAgICAgICBfX3AsCisJCSAgX1Jlc3VsdHMmICAgICAgICAgICAgICAgICAgICAgICAgIF9fciwKKwkJICBjb25zdCBfQXV0b21hdG9uUHRyJiAgICAgICAgICAgICAgX19hdXRvbWF0b24sCisJCSAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgIF9fZmxhZ3MpOworCisgIHByaXZhdGU6CisgICAgX1N0YXRlU2V0CisgICAgX01fZV9jbG9zdXJlKF9TdGF0ZUlkVCBfX2kpOworCisgICAgX1N0YXRlU2V0CisgICAgX01fZV9jbG9zdXJlKGNvbnN0IF9TdGF0ZVNldCYgX19zKTsKKworICAgIF9TdGF0ZVNldAorICAgIF9NX2VfY2xvc3VyZShfU3RhdGVTdGFjayYgX19zdGFjaywgY29uc3QgX1N0YXRlU2V0JiBfX3MpOworCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9OZmE+ICAgICAgICBfTV9uZmE7CisgICAgX1BhdHRlcm5DdXJzb3ImICAgICAgICAgICAgICAgICAgICBfTV9wYXR0ZXJuOworICAgIF9SZXN1bHRzJiAgICAgICAgICAgICAgICAgICAgICAgICAgX01fcmVzdWx0czsKKyAgfTsKKworIC8vQH0gcmVnZXgtZGV0YWlsCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIF9fZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2luY2x1ZGUgPGJpdHMvcmVnZXhfZ3JlcF9tYXRjaGVyLnRjYz4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yZWdleF9ncmVwX21hdGNoZXIudGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JlZ2V4X2dyZXBfbWF0Y2hlci50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEzODJkNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yZWdleF9ncmVwX21hdGNoZXIudGNjCkBAIC0wLDAgKzEsMTc5IEBACisvLyBjbGFzcyB0ZW1wbGF0ZSByZWdleCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKioKKyAqICBAZmlsZSBiaXRzL3JlZ2V4X2dyZXBfbWF0Y2hlci50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtyZWdleH0KKyAqLworCisjaW5jbHVkZSA8cmVnZXg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlCit7CisgIC8vIEEgc3RhY2sgb2Ygc3RhdGVzIHVzZWQgaW4gZXZhbHVhdGluZyB0aGUgTkZBLgorICB0eXBlZGVmIHN0ZDo6c3RhY2s8c3RkOjpfX2RldGFpbDo6X1N0YXRlSWRULAorICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpfX2RldGFpbDo6X1N0YXRlSWRUPgorCQkgICAgID4gX1N0YXRlU3RhY2s7CisKKyAgLy8gT2J0YWlucyB0aGUgbmV4dCBzdGF0ZSBzZXQgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUgc2V0IF9fcyBhbmQgdGhlIGN1cnJlbnQKKyAgLy8gaW5wdXQgY2hhcmFjdGVyLgorICBpbmxpbmUgc3RkOjpfX2RldGFpbDo6X1N0YXRlU2V0CisgIF9fbW92ZShjb25zdCBzdGQ6Ol9fZGV0YWlsOjpfUGF0dGVybkN1cnNvciYgX19wLAorICAgICAgICAgY29uc3Qgc3RkOjpfX2RldGFpbDo6X05mYSYgX19uZmEsCisgICAgICAgICBjb25zdCBzdGQ6Ol9fZGV0YWlsOjpfU3RhdGVTZXQmIF9fcykKKyAgeworICAgIHN0ZDo6X19kZXRhaWw6Ol9TdGF0ZVNldCBfX207CisgICAgZm9yIChzdGQ6Ol9fZGV0YWlsOjpfU3RhdGVTZXQ6OmNvbnN0X2l0ZXJhdG9yIF9faSA9IF9fcy5iZWdpbigpOworCSBfX2kgIT0gX19zLmVuZCgpOyArK19faSkKKyAgICAgIHsKKwlpZiAoKl9faSA9PSBzdGQ6Ol9fZGV0YWlsOjpfU19pbnZhbGlkX3N0YXRlX2lkKQorCSAgY29udGludWU7CisKKwljb25zdCBzdGQ6Ol9fZGV0YWlsOjpfU3RhdGUmIF9fc3RhdGUgPSBfX25mYVsqX19pXTsKKwlpZiAoX19zdGF0ZS5fTV9vcGNvZGUgPT0gc3RkOjpfX2RldGFpbDo6X1Nfb3Bjb2RlX21hdGNoCisJICAgICYmIF9fc3RhdGUuX01fbWF0Y2hlcyhfX3ApKQorCSAgX19tLmluc2VydChfX3N0YXRlLl9NX25leHQpOworICAgICAgfQorICAgIHJldHVybiBfX207CisgIH0KKworICAvLyByZXR1cm5zIHRydWUgaWYgKF9fcyBpbnRlcnNlY3QgX190KSBpcyBub3QgZW1wdHkKKyAgaW5saW5lIGJvb2wKKyAgX19pbmNsdWRlc19zb21lKGNvbnN0IHN0ZDo6X19kZXRhaWw6Ol9TdGF0ZVNldCYgX19zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpfX2RldGFpbDo6X1N0YXRlU2V0JiBfX3QpCisgIHsKKyAgICBpZiAoX19zLnNpemUoKSA+IDAgJiYgX190LnNpemUoKSA+IDApCisgICAgICB7CisJc3RkOjpfX2RldGFpbDo6X1N0YXRlU2V0Ojpjb25zdF9pdGVyYXRvciBfX2ZpcnN0ID0gX19zLmJlZ2luKCk7CisJc3RkOjpfX2RldGFpbDo6X1N0YXRlU2V0Ojpjb25zdF9pdGVyYXRvciBfX3NlY29uZCA9IF9fdC5iZWdpbigpOworCXdoaWxlIChfX2ZpcnN0ICE9IF9fcy5lbmQoKSAmJiBfX3NlY29uZCAhPSBfX3QuZW5kKCkpCisJICB7CisJICAgIGlmICgqX19maXJzdCA8ICpfX3NlY29uZCkKKwkgICAgICArK19fZmlyc3Q7CisJICAgIGVsc2UgaWYgKCpfX3NlY29uZCA8ICpfX2ZpcnN0KQorCSAgICAgICsrX19zZWNvbmQ7CisJICAgIGVsc2UKKwkgICAgICByZXR1cm4gdHJ1ZTsKKwkgIH0KKyAgICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBJZiBhbiBpZGVudGlmaWVkIHN0YXRlIF9fdSBpcyBub3QgYWxyZWFkeSBpbiB0aGUgY3VycmVudCBzdGF0ZSBzZXQgX19lLAorICAvLyBpbnNlcnQgaXQgYW5kIHB1c2ggaXQgb24gdGhlIGN1cnJlbnQgc3RhdGUgc3RhY2sgX19zLgorICBpbmxpbmUgdm9pZAorICBfX2FkZF92aXNpdGVkX3N0YXRlKGNvbnN0IHN0ZDo6X19kZXRhaWw6Ol9TdGF0ZUlkVCBfX3UsCisgICAgICAgICAgICAgICAgICAgICAgX1N0YXRlU3RhY2smICAgICAgICAgICAgICAgICAgX19zLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6X19kZXRhaWw6Ol9TdGF0ZVNldCYgICAgICBfX2UpCisgIHsKKyAgICBpZiAoX19lLmNvdW50KF9fdSkgPT0gMCkKKyAgICAgIHsKKwlfX2UuaW5zZXJ0KF9fdSk7CisJX19zLnB1c2goX191KTsKKyAgICAgIH0KKyAgfQorCit9IC8vIGFub255bW91cyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIF9fZGV0YWlsCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIGlubGluZSBfR3JlcF9tYXRjaGVyOjoKKyAgX0dyZXBfbWF0Y2hlcihfUGF0dGVybkN1cnNvciYgX19wLCBfUmVzdWx0cyYgX19yLAorCQljb25zdCBfQXV0b21hdG9uUHRyJiBfX25mYSwKKwkJcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncykKKyAgOiBfTV9uZmEoc3RhdGljX3BvaW50ZXJfY2FzdDxfTmZhPihfX25mYSkpLCBfTV9wYXR0ZXJuKF9fcCksIF9NX3Jlc3VsdHMoX19yKQorICB7CisgICAgX19kZXRhaWw6Ol9TdGF0ZVNldCBfX3QgPSB0aGlzLT5fTV9lX2Nsb3N1cmUoX01fbmZhLT5fTV9zdGFydCgpKTsKKyAgICBmb3IgKDsgIV9NX3BhdHRlcm4uX01fYXRfZW5kKCk7IF9NX3BhdHRlcm4uX01fbmV4dCgpKQorICAgICAgX190ID0gdGhpcy0+X01fZV9jbG9zdXJlKF9fbW92ZShfTV9wYXR0ZXJuLCAqX01fbmZhLCBfX3QpKTsKKworICAgIF9NX3Jlc3VsdHMuX01fc2V0X21hdGNoZWQoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faW5jbHVkZXNfc29tZShfTV9uZmEtPl9NX2ZpbmFsX3N0YXRlcygpLCBfX3QpKTsKKyAgfQorCisgIC8vIENyZWF0ZXMgdGhlIGUtY2xvc3VyZSBzZXQgZm9yIHRoZSBpbml0aWFsIHN0YXRlIF9faS4KKyAgaW5saW5lIF9TdGF0ZVNldCBfR3JlcF9tYXRjaGVyOjoKKyAgX01fZV9jbG9zdXJlKF9TdGF0ZUlkVCBfX2kpCisgIHsKKyAgICBfU3RhdGVTZXQgX19zOworICAgIF9fcy5pbnNlcnQoX19pKTsKKyAgICBfU3RhdGVTdGFjayBfX3N0YWNrOworICAgIF9fc3RhY2sucHVzaChfX2kpOworICAgIHJldHVybiB0aGlzLT5fTV9lX2Nsb3N1cmUoX19zdGFjaywgX19zKTsKKyAgfQorCisgIC8vIENyZWF0ZXMgdGhlIGUtY2xvc3VyZSBzZXQgZm9yIGFuIGFyYml0cmFyeSBzdGF0ZSBzZXQgX19zLgorICBpbmxpbmUgX1N0YXRlU2V0IF9HcmVwX21hdGNoZXI6OgorICBfTV9lX2Nsb3N1cmUoY29uc3QgX1N0YXRlU2V0JiBfX3MpCisgIHsKKyAgICBfU3RhdGVTdGFjayBfX3N0YWNrOworICAgIGZvciAoX1N0YXRlU2V0Ojpjb25zdF9pdGVyYXRvciBfX2kgPSBfX3MuYmVnaW4oKTsgX19pICE9IF9fcy5lbmQoKTsgKytfX2kpCisgICAgICBfX3N0YWNrLnB1c2goKl9faSk7CisgICAgcmV0dXJuIHRoaXMtPl9NX2VfY2xvc3VyZShfX3N0YWNrLCBfX3MpOworICB9CisKKyAgaW5saW5lIF9TdGF0ZVNldCBfR3JlcF9tYXRjaGVyOjoKKyAgX01fZV9jbG9zdXJlKF9TdGF0ZVN0YWNrJiBfX3N0YWNrLCBjb25zdCBfU3RhdGVTZXQmIF9fcykKKyAgeworICAgIF9TdGF0ZVNldCBfX2UgPSBfX3M7CisgICAgd2hpbGUgKCFfX3N0YWNrLmVtcHR5KCkpCisgICAgICB7CisJX1N0YXRlSWRUIF9fdCA9IF9fc3RhY2sudG9wKCk7IF9fc3RhY2sucG9wKCk7CisJaWYgKF9fdCA9PSBfU19pbnZhbGlkX3N0YXRlX2lkKQorCSAgY29udGludWU7CisJLy8gZm9yIGVhY2ggX191IHdpdGggZWRnZSBmcm9tIF9fdCB0byBfX3UgbGFiZWxlZCBlIGRvIC4uLgorCWNvbnN0IF9TdGF0ZSYgX19zdGF0ZSA9IF9NX25mYS0+b3BlcmF0b3JbXShfX3QpOworCXN3aXRjaCAoX19zdGF0ZS5fTV9vcGNvZGUpCisJICB7CisJICBjYXNlIF9TX29wY29kZV9hbHRlcm5hdGl2ZToKKwkgICAgX19hZGRfdmlzaXRlZF9zdGF0ZShfX3N0YXRlLl9NX25leHQsIF9fc3RhY2ssIF9fZSk7CisJICAgIF9fYWRkX3Zpc2l0ZWRfc3RhdGUoX19zdGF0ZS5fTV9hbHQsIF9fc3RhY2ssIF9fZSk7CisJICAgIGJyZWFrOworCSAgY2FzZSBfU19vcGNvZGVfc3ViZXhwcl9iZWdpbjoKKwkgICAgX19hZGRfdmlzaXRlZF9zdGF0ZShfX3N0YXRlLl9NX25leHQsIF9fc3RhY2ssIF9fZSk7CisJICAgIF9fc3RhdGUuX01fdGFnZ2VyKF9NX3BhdHRlcm4sIF9NX3Jlc3VsdHMpOworCSAgICBicmVhazsKKwkgIGNhc2UgX1Nfb3Bjb2RlX3N1YmV4cHJfZW5kOgorCSAgICBfX2FkZF92aXNpdGVkX3N0YXRlKF9fc3RhdGUuX01fbmV4dCwgX19zdGFjaywgX19lKTsKKwkgICAgX19zdGF0ZS5fTV90YWdnZXIoX01fcGF0dGVybiwgX01fcmVzdWx0cyk7CisJICAgIF9NX3Jlc3VsdHMuX01fc2V0X21hdGNoZWQoX19zdGF0ZS5fTV9zdWJleHByLCB0cnVlKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIF9TX29wY29kZV9hY2NlcHQ6CisJICAgIF9fYWRkX3Zpc2l0ZWRfc3RhdGUoX19zdGF0ZS5fTV9uZXh0LCBfX3N0YWNrLCBfX2UpOworCSAgICBicmVhazsKKwkgIGRlZmF1bHQ6CisJICAgIGJyZWFrOworCSAgfQorICAgICAgfQorICAgIHJldHVybiBfX2U7CisgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBfX2RldGFpbAorfSAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yZWdleF9uZmEuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yZWdleF9uZmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzMwMjM3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3JlZ2V4X25mYS5oCkBAIC0wLDAgKzEsNDE1IEBACisvLyBjbGFzcyB0ZW1wbGF0ZSByZWdleCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKioKKyAqICBAZmlsZSBiaXRzL3JlZ2V4X25mYS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7cmVnZXh9CisgKi8KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19kZXRhaWwKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIHJlZ2V4LWRldGFpbAorICAgKiBAeworICAgKi8KKworICAvLy8gQmFzZSBjbGFzcyBmb3IsIHVtLCBhdXRvbWF0YS4gIENvdWxkIGJlIGFuIE5GQSBvciBhIERGQS4gIFlvdXIgY2hvaWNlLgorICBjbGFzcyBfQXV0b21hdG9uCisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IF9TaXplVDsKKworICBwdWJsaWM6CisgICAgdmlydHVhbAorICAgIH5fQXV0b21hdG9uKCkgeyB9CisKKyAgICB2aXJ0dWFsIF9TaXplVAorICAgIF9NX3N1Yl9jb3VudCgpIGNvbnN0ID0gMDsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mCisgICAgX01fZG90KHN0ZDo6b3N0cmVhbSYgX19vc3RyKSBjb25zdCA9IDA7CisjZW5kaWYKKyAgfTsKKworICAvLy8gR2VuZXJpYyBzaGFyZWQgcG9pbnRlciB0byBhbiBhdXRvbWF0b24uICAKKyAgdHlwZWRlZiBzdGQ6OnNoYXJlZF9wdHI8X0F1dG9tYXRvbj4gX0F1dG9tYXRvblB0cjsKKworICAvLy8gT3BlcmF0aW9uIGNvZGVzIHRoYXQgZGVmaW5lIHRoZSB0eXBlIG9mIHRyYW5zaXRpb25zIHdpdGhpbiB0aGUgYmFzZSBORkEKKyAgLy8vIHRoYXQgcmVwcmVzZW50cyB0aGUgcmVndWxhciBleHByZXNzaW9uLgorICBlbnVtIF9PcGNvZGUKKyAgeworICAgICAgX1Nfb3Bjb2RlX3Vua25vd24gICAgICAgPSAgIDAsCisgICAgICBfU19vcGNvZGVfYWx0ZXJuYXRpdmUgICA9ICAgMSwKKyAgICAgIF9TX29wY29kZV9zdWJleHByX2JlZ2luID0gICA0LAorICAgICAgX1Nfb3Bjb2RlX3N1YmV4cHJfZW5kICAgPSAgIDUsCisgICAgICBfU19vcGNvZGVfbWF0Y2ggICAgICAgICA9IDEwMCwKKyAgICAgIF9TX29wY29kZV9hY2NlcHQgICAgICAgID0gMjU1CisgIH07CisKKyAgLy8vIFByb3ZpZGVzIGEgZ2VuZXJpYyBmYWNhZGUgZm9yIGEgdGVtcGxhdGVkIG1hdGNoX3Jlc3VsdHMuCisgIHN0cnVjdCBfUmVzdWx0cworICB7CisgICAgdmlydHVhbCB2b2lkIF9NX3NldF9wb3MoaW50IF9faSwgaW50IF9faiwgY29uc3QgX1BhdHRlcm5DdXJzb3ImIF9fcCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBfTV9zZXRfbWF0Y2hlZChpbnQgX19pLCBib29sIF9faXNfbWF0Y2hlZCkgPSAwOworICB9OworCisgIC8vLyBUYWdzIGN1cnJlbnQgc3RhdGUgKGZvciBzdWJleHByIGJlZ2luL2VuZCkuCisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkIChjb25zdCBfUGF0dGVybkN1cnNvciYsIF9SZXN1bHRzJik+IF9UYWdnZXI7CisKKyAgLy8vIFN0YXJ0IHN0YXRlIHRhZy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z3ZEl0ZXJULCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBzdHJ1Y3QgX1N0YXJ0VGFnZ2VyCisgICAgeworICAgICAgZXhwbGljaXQKKyAgICAgIF9TdGFydFRhZ2dlcihpbnQgX19pKQorICAgICAgOiBfTV9pbmRleChfX2kpCisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfUGF0dGVybkN1cnNvciYgX19wYywgX1Jlc3VsdHMmIF9fcikKKyAgICAgIHsgX19yLl9NX3NldF9wb3MoX01faW5kZXgsIDAsIF9fcGMpOyB9CisKKyAgICAgIGludCAgICAgICBfTV9pbmRleDsKKyAgICB9OworCisgIC8vLyBFbmQgc3RhdGUgdGFnLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRndkSXRlclQsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIHN0cnVjdCBfRW5kVGFnZ2VyCisgICAgeworICAgICAgZXhwbGljaXQKKyAgICAgIF9FbmRUYWdnZXIoaW50IF9faSkKKyAgICAgIDogX01faW5kZXgoX19pKQorICAgICAgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1BhdHRlcm5DdXJzb3ImIF9fcGMsIF9SZXN1bHRzJiBfX3IpCisgICAgICB7IF9fci5fTV9zZXRfcG9zKF9NX2luZGV4LCAxLCBfX3BjKTsgfQorCisgICAgICBpbnQgICAgICAgX01faW5kZXg7CisgICAgICBfRndkSXRlclQgX01fcG9zOworICAgIH07CisKKyAgLy8vIEluZGljYXRlcyBpZiBjdXJyZW50IHN0YXRlIG1hdGNoZXMgY3Vyc29yIGN1cnJlbnQuCisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjxib29sIChjb25zdCBfUGF0dGVybkN1cnNvciYpPiBfTWF0Y2hlcjsKKworICAvLy8gTWF0Y2hlcyBhbnkgY2hhcmFjdGVyCisgIGlubGluZSBib29sCisgIF9BbnlNYXRjaGVyKGNvbnN0IF9QYXR0ZXJuQ3Vyc29yJikKKyAgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vLyBNYXRjaGVzIGEgc2luZ2xlIGNoYXJhY3RlcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyVCwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgc3RydWN0IF9DaGFyTWF0Y2hlcgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1Q6OmNoYXJfdHlwZSBjaGFyX3R5cGU7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfQ2hhck1hdGNoZXIoY2hhcl90eXBlIF9fYywgY29uc3QgX1RyYWl0c1QmIF9fdCA9IF9UcmFpdHNUKCkpCisgICAgICA6IF9NX3RyYWl0cyhfX3QpLCBfTV9jKF9NX3RyYWl0cy50cmFuc2xhdGUoX19jKSkKKyAgICAgIHsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9QYXR0ZXJuQ3Vyc29yJiBfX3BjKSBjb25zdAorICAgICAgeworCXR5cGVkZWYgY29uc3QgX1NwZWNpYWxpemVkQ3Vyc29yPF9Jbkl0ZXJUPiYgX0N1cnNvclQ7CisJX0N1cnNvclQgX19jID0gc3RhdGljX2Nhc3Q8X0N1cnNvclQ+KF9fcGMpOworCXJldHVybiBfTV90cmFpdHMudHJhbnNsYXRlKF9fYy5fTV9jdXJyZW50KCkpID09IF9NX2M7CisgICAgICB9CisKKyAgICAgIGNvbnN0IF9UcmFpdHNUJiBfTV90cmFpdHM7CisgICAgICBjaGFyX3R5cGUgICAgICAgX01fYzsKKyAgICB9OworCisgIC8vLyBNYXRjaGVzIGEgY2hhcmFjdGVyIHJhbmdlIChicmFja2V0IGV4cHJlc3Npb24pCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXJULCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBzdHJ1Y3QgX1JhbmdlTWF0Y2hlcgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1Q6OmNoYXJfdHlwZSBfQ2hhclQ7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVD4gICAgX1N0cmluZ1Q7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfUmFuZ2VNYXRjaGVyKGJvb2wgX19pc19ub25fbWF0Y2hpbmcsIGNvbnN0IF9UcmFpdHNUJiBfX3QgPSBfVHJhaXRzVCgpKQorICAgICAgOiBfTV90cmFpdHMoX190KSwgX01faXNfbm9uX21hdGNoaW5nKF9faXNfbm9uX21hdGNoaW5nKQorICAgICAgeyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1BhdHRlcm5DdXJzb3ImIF9fcGMpIGNvbnN0CisgICAgICB7CisJdHlwZWRlZiBjb25zdCBfU3BlY2lhbGl6ZWRDdXJzb3I8X0luSXRlclQ+JiBfQ3Vyc29yVDsKKwlfQ3Vyc29yVCBfX2MgPSBzdGF0aWNfY2FzdDxfQ3Vyc29yVD4oX19wYyk7CisJcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2FkZF9jaGFyKF9DaGFyVCBfX2MpCisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fYWRkX2NvbGxhdGluZ19lbGVtZW50KGNvbnN0IF9TdHJpbmdUJiBfX3MpCisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fYWRkX2VxdWl2YWxlbmNlX2NsYXNzKGNvbnN0IF9TdHJpbmdUJiBfX3MpCisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fYWRkX2NoYXJhY3Rlcl9jbGFzcyhjb25zdCBfU3RyaW5nVCYgX19zKQorICAgICAgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX21ha2VfcmFuZ2UoKQorICAgICAgeyB9CisKKyAgICAgIGNvbnN0IF9UcmFpdHNUJiBfTV90cmFpdHM7CisgICAgICBib29sICAgICAgICAgICAgX01faXNfbm9uX21hdGNoaW5nOworICAgIH07CisKKyAgLy8vIElkZW50aWZpZXMgYSBzdGF0ZSBpbiB0aGUgTkZBLgorICB0eXBlZGVmIGludCBfU3RhdGVJZFQ7CisKKyAgLy8vIFRoZSBzcGVjaWFsIGNhc2UgaW4gd2hpY2ggYSBzdGF0ZSBpZGVudGlmaWVyIGlzIG5vdCBhbiBpbmRleC4KKyAgc3RhdGljIGNvbnN0IF9TdGF0ZUlkVCBfU19pbnZhbGlkX3N0YXRlX2lkICA9IC0xOworCisKKyAgLyoqCisgICAqIEBicmllZiBzdHJ1Y3QgX1N0YXRlCisgICAqCisgICAqIEFuIGluZGl2aWR1YWwgc3RhdGUgaW4gYW4gTkZBCisgICAqCisgICAqIEluIHRoaXMgY2FzZSBhICJzdGF0ZSIgaXMgYW4gZW50cnkgaW4gdGhlIE5GQSBkZWZpbml0aW9uIGNvdXBsZWQKKyAgICogd2l0aCBpdHMgb3V0Z29pbmcgdHJhbnNpdGlvbihzKS4gIEFsbCBzdGF0ZXMgaGF2ZSBhIHNpbmdsZSBvdXRnb2luZworICAgKiB0cmFuc2l0aW9uLCBleGNlcHQgZm9yIGFjY2VwdGluZyBzdGF0ZXMgKHdoaWNoIGhhdmUgbm8gb3V0Z29pbmcKKyAgICogdHJhbnNpdGlvbnMpIGFuZCBhbHQgc3RhdGVzLCB3aGljaCBoYXZlIHR3byBvdXRnb2luZyB0cmFuc2l0aW9ucy4KKyAgICovCisgIHN0cnVjdCBfU3RhdGUKKyAgeworICAgIHR5cGVkZWYgaW50ICBfT3Bjb2RlVDsKKworICAgIF9PcGNvZGVUICAgICBfTV9vcGNvZGU7ICAgIC8vIHR5cGUgb2Ygb3V0Z29pbmcgdHJhbnNpdGlvbgorICAgIF9TdGF0ZUlkVCAgICBfTV9uZXh0OyAgICAgIC8vIG91dGdvaW5nIHRyYW5zaXRpb24KKyAgICBfU3RhdGVJZFQgICAgX01fYWx0OyAgICAgICAvLyBmb3IgX1Nfb3Bjb2RlX2FsdGVybmF0aXZlCisgICAgdW5zaWduZWQgaW50IF9NX3N1YmV4cHI7ICAgLy8gZm9yIF9TX29wY29kZV9zdWJleHByXyoKKyAgICBfVGFnZ2VyICAgICAgX01fdGFnZ2VyOyAgICAvLyBmb3IgX1Nfb3Bjb2RlX3N1YmV4cHJfKgorICAgIF9NYXRjaGVyICAgICBfTV9tYXRjaGVzOyAgIC8vIGZvciBfU19vcGNvZGVfbWF0Y2gKKworICAgIGV4cGxpY2l0IF9TdGF0ZShfT3Bjb2RlVCBfX29wY29kZSkKKyAgICA6IF9NX29wY29kZShfX29wY29kZSksIF9NX25leHQoX1NfaW52YWxpZF9zdGF0ZV9pZCkKKyAgICB7IH0KKworICAgIF9TdGF0ZShjb25zdCBfTWF0Y2hlciYgX19tKQorICAgIDogX01fb3Bjb2RlKF9TX29wY29kZV9tYXRjaCksIF9NX25leHQoX1NfaW52YWxpZF9zdGF0ZV9pZCksIF9NX21hdGNoZXMoX19tKQorICAgIHsgfQorCisgICAgX1N0YXRlKF9PcGNvZGVUIF9fb3Bjb2RlLCB1bnNpZ25lZCBpbnQgX19zLCBjb25zdCBfVGFnZ2VyJiBfX3QpCisgICAgOiBfTV9vcGNvZGUoX19vcGNvZGUpLCBfTV9uZXh0KF9TX2ludmFsaWRfc3RhdGVfaWQpLCBfTV9zdWJleHByKF9fcyksCisgICAgICBfTV90YWdnZXIoX190KQorICAgIHsgfQorCisgICAgX1N0YXRlKF9TdGF0ZUlkVCBfX25leHQsIF9TdGF0ZUlkVCBfX2FsdCkKKyAgICA6IF9NX29wY29kZShfU19vcGNvZGVfYWx0ZXJuYXRpdmUpLCBfTV9uZXh0KF9fbmV4dCksIF9NX2FsdChfX2FsdCkKKyAgICB7IH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgc3RkOjpvc3RyZWFtJgorICAgIF9NX3ByaW50KHN0ZDo6b3N0cmVhbSYgb3N0cikgY29uc3Q7CisKKyAgICAvLyBQcmludHMgZ3JhcGh2aXogZG90IGNvbW1hbmRzIGZvciBzdGF0ZS4KKyAgICBzdGQ6Om9zdHJlYW0mCisgICAgX01fZG90KHN0ZDo6b3N0cmVhbSYgX19vc3RyLCBfU3RhdGVJZFQgX19pZCkgY29uc3Q7CisjZW5kaWYKKyAgfTsKKworICAKKyAgLy8vIFRoZSBHcmVwIE1hdGNoZXIgd29ya3Mgb24gc2V0cyBvZiBzdGF0ZXMuICBIZXJlIGFyZSBzZXRzIG9mIHN0YXRlcy4KKyAgdHlwZWRlZiBzdGQ6OnNldDxfU3RhdGVJZFQ+IF9TdGF0ZVNldDsKKworICAvKioKKyAgICogQGJyaWVmIHN0cnVjdCBfTmZhCisgICAqCisgICAqIEEgY29sbGVjdGlvbiBvZiBhbGwgc3RhdGVzIG1ha2luZyB1cCBhbiBORkEuCisgICAqCisgICAqIEFuIE5GQSBpcyBhIDQtdHVwbGUgTSA9IChLLCBTLCBzLCBGKSwgd2hlcmUKKyAgICogICAgSyBpcyBhIGZpbml0ZSBzZXQgb2Ygc3RhdGVzLAorICAgKiAgICBTIGlzIHRoZSBhbHBoYWJldCBvZiB0aGUgTkZBLAorICAgKiAgICBzIGlzIHRoZSBpbml0aWFsIHN0YXRlLAorICAgKiAgICBGIGlzIGEgc2V0IG9mIGZpbmFsIChhY2NlcHRpbmcpIHN0YXRlcy4KKyAgICoKKyAgICogVGhpcyBORkEgY2xhc3MgaXMgdGVtcGxhdGVkIG9uIFMsIGEgdHlwZSB0aGF0IHdpbGwgaG9sZCB2YWx1ZXMgb2YgdGhlCisgICAqIHVuZGVybHlpbmcgYWxwaGFiZXQgKHdpdGhvdXQgcmVnYXJkIHRvIHNlbWFudGljcyBvZiB0aGF0IGFscGhhYmV0KS4gIFRoZQorICAgKiBvdGhlciBlbGVtZW50cyBvZiB0aGUgdHVwbGUgYXJlIGdlbmVyYXRlZCBkdXJpbmcgY29uc3RydWN0aW9uIG9mIHRoZSBORkEKKyAgICogYW5kIGFyZSBhdmFpbGFibGUgdGhyb3VnaCBhY2Nlc3NvciBtZW1iZXIgZnVuY3Rpb25zLgorICAgKi8KKyAgY2xhc3MgX05mYQorICA6IHB1YmxpYyBfQXV0b21hdG9uLCBwdWJsaWMgc3RkOjp2ZWN0b3I8X1N0YXRlPgorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9TdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TdGF0ZVQ7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgICAgICBfU2l6ZVQ7CisgICAgdHlwZWRlZiByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBfRmxhZ1Q7CisKKyAgICBfTmZhKF9GbGFnVCBfX2YpCisgICAgOiBfTV9mbGFncyhfX2YpLCBfTV9zdGFydF9zdGF0ZSgwKSwgX01fc3ViZXhwcl9jb3VudCgwKQorICAgIHsgfQorCisgICAgfl9OZmEoKQorICAgIHsgfQorCisgICAgX0ZsYWdUCisgICAgX01fb3B0aW9ucygpIGNvbnN0CisgICAgeyByZXR1cm4gX01fZmxhZ3M7IH0KKworICAgIF9TdGF0ZUlkVAorICAgIF9NX3N0YXJ0KCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9zdGFydF9zdGF0ZTsgfQorCisgICAgY29uc3QgX1N0YXRlU2V0JgorICAgIF9NX2ZpbmFsX3N0YXRlcygpIGNvbnN0CisgICAgeyByZXR1cm4gX01fYWNjZXB0aW5nX3N0YXRlczsgfQorCisgICAgX1NpemVUCisgICAgX01fc3ViX2NvdW50KCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9zdWJleHByX2NvdW50OyB9CisKKyAgICBfU3RhdGVJZFQKKyAgICBfTV9pbnNlcnRfYWNjZXB0KCkKKyAgICB7CisgICAgICB0aGlzLT5wdXNoX2JhY2soX1N0YXRlVChfU19vcGNvZGVfYWNjZXB0KSk7CisgICAgICBfTV9hY2NlcHRpbmdfc3RhdGVzLmluc2VydCh0aGlzLT5zaXplKCktMSk7CisgICAgICByZXR1cm4gdGhpcy0+c2l6ZSgpLTE7CisgICAgfQorCisgICAgX1N0YXRlSWRUCisgICAgX01faW5zZXJ0X2FsdChfU3RhdGVJZFQgX19uZXh0LCBfU3RhdGVJZFQgX19hbHQpCisgICAgeworICAgICAgdGhpcy0+cHVzaF9iYWNrKF9TdGF0ZVQoX19uZXh0LCBfX2FsdCkpOworICAgICAgcmV0dXJuIHRoaXMtPnNpemUoKS0xOworICAgIH0KKworICAgIF9TdGF0ZUlkVAorICAgIF9NX2luc2VydF9tYXRjaGVyKF9NYXRjaGVyIF9fbSkKKyAgICB7CisgICAgICB0aGlzLT5wdXNoX2JhY2soX1N0YXRlVChfX20pKTsKKyAgICAgIHJldHVybiB0aGlzLT5zaXplKCktMTsKKyAgICB9CisKKyAgICBfU3RhdGVJZFQKKyAgICBfTV9pbnNlcnRfc3ViZXhwcl9iZWdpbihjb25zdCBfVGFnZ2VyJiBfX3QpCisgICAgeworICAgICAgdGhpcy0+cHVzaF9iYWNrKF9TdGF0ZVQoX1Nfb3Bjb2RlX3N1YmV4cHJfYmVnaW4sIF9NX3N1YmV4cHJfY291bnQrKywKKwkJCSAgICAgIF9fdCkpOworICAgICAgcmV0dXJuIHRoaXMtPnNpemUoKS0xOworICAgIH0KKworICAgIF9TdGF0ZUlkVCAKKyAgICBfTV9pbnNlcnRfc3ViZXhwcl9lbmQodW5zaWduZWQgaW50IF9faSwgY29uc3QgX1RhZ2dlciYgX190KQorICAgIHsKKyAgICAgIHRoaXMtPnB1c2hfYmFjayhfU3RhdGVUKF9TX29wY29kZV9zdWJleHByX2VuZCwgX19pLCBfX3QpKTsKKyAgICAgIHJldHVybiB0aGlzLT5zaXplKCktMTsKKyAgICB9CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgIHN0ZDo6b3N0cmVhbSYKKyAgICBfTV9kb3Qoc3RkOjpvc3RyZWFtJiBfX29zdHIpIGNvbnN0OworI2VuZGlmCisKKyAgcHJpdmF0ZToKKyAgICBfRmxhZ1QgICAgIF9NX2ZsYWdzOworICAgIF9TdGF0ZUlkVCAgX01fc3RhcnRfc3RhdGU7CisgICAgX1N0YXRlU2V0ICBfTV9hY2NlcHRpbmdfc3RhdGVzOworICAgIF9TaXplVCAgICAgX01fc3ViZXhwcl9jb3VudDsKKyAgfTsKKworICAvLy8gRGVzY3JpYmVzIGEgc2VxdWVuY2Ugb2Ygb25lIG9yIG1vcmUgJV9TdGF0ZSwgaXRzIGN1cnJlbnQgc3RhcnQKKyAgLy8vIGFuZCBlbmQocykuICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBmcmFnbWVudHMgb2YgYW4gTkZBIGR1cmluZworICAvLy8gY29uc3RydWN0aW9uLgorICBjbGFzcyBfU3RhdGVTZXEKKyAgeworICBwdWJsaWM6CisgICAgLy8gQ29uc3RydWN0cyBhIHNpbmdsZS1ub2RlIHNlcXVlbmNlCisgICAgX1N0YXRlU2VxKF9OZmEmIF9fc3MsIF9TdGF0ZUlkVCBfX3MsIF9TdGF0ZUlkVCBfX2UgPSBfU19pbnZhbGlkX3N0YXRlX2lkKQorICAgIDogX01fbmZhKF9fc3MpLCBfTV9zdGFydChfX3MpLCBfTV9lbmQxKF9fcyksIF9NX2VuZDIoX19lKQorICAgIHsgfQorICAgIC8vIENvbnN0cnVjdHMgYSBzcGxpdCBzZXF1ZW5jZSBmcm9tIHR3byBvdGhlciBzZXF1ZW5jY2VzCisgICAgX1N0YXRlU2VxKGNvbnN0IF9TdGF0ZVNlcSYgX19lMSwgY29uc3QgX1N0YXRlU2VxJiBfX2UyKQorICAgIDogX01fbmZhKF9fZTEuX01fbmZhKSwKKyAgICAgIF9NX3N0YXJ0KF9NX25mYS5fTV9pbnNlcnRfYWx0KF9fZTEuX01fc3RhcnQsIF9fZTIuX01fc3RhcnQpKSwKKyAgICAgIF9NX2VuZDEoX19lMS5fTV9lbmQxKSwgX01fZW5kMihfX2UyLl9NX2VuZDEpCisgICAgeyB9CisKKyAgICAvLyBDb25zdHJ1Y3RzIGEgc3BsaXQgc2VxdWVuY2UgZnJvbSBhIHNpbmdsZSBzZXF1ZW5jZQorICAgIF9TdGF0ZVNlcShjb25zdCBfU3RhdGVTZXEmIF9fZSwgX1N0YXRlSWRUIF9faWQpCisgICAgOiBfTV9uZmEoX19lLl9NX25mYSksCisgICAgICBfTV9zdGFydChfTV9uZmEuX01faW5zZXJ0X2FsdChfX2lkLCBfX2UuX01fc3RhcnQpKSwKKyAgICAgIF9NX2VuZDEoX19pZCksIF9NX2VuZDIoX19lLl9NX2VuZDEpCisgICAgeyB9CisKKyAgICAvLyBDb25zdHJ1Y3RzIGEgY29weSBvZiBhICVfU3RhdGVTZXEKKyAgICBfU3RhdGVTZXEoY29uc3QgX1N0YXRlU2VxJiBfX3JocykKKyAgICA6IF9NX25mYShfX3Jocy5fTV9uZmEpLCBfTV9zdGFydChfX3Jocy5fTV9zdGFydCksCisgICAgICBfTV9lbmQxKF9fcmhzLl9NX2VuZDEpLCBfTV9lbmQyKF9fcmhzLl9NX2VuZDIpCisgICAgeyB9CisKKworICAgIF9TdGF0ZVNlcSYgb3BlcmF0b3I9KGNvbnN0IF9TdGF0ZVNlcSYgX19yaHMpOworCisgICAgX1N0YXRlSWRUCisgICAgX01fZnJvbnQoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3N0YXJ0OyB9CisKKyAgICAvLyBFeHRlbmRzIGEgc2VxdWVuY2UgYnkgb25lLgorICAgIHZvaWQKKyAgICBfTV9wdXNoX2JhY2soX1N0YXRlSWRUIF9faWQpOworCisgICAgLy8gRXh0ZW5kcyBhbmQgbWF5YmUgam9pbnMgYSBzZXF1ZW5jZS4KKyAgICB2b2lkCisgICAgX01fYXBwZW5kKF9TdGF0ZUlkVCBfX2lkKTsKKworICAgIHZvaWQKKyAgICBfTV9hcHBlbmQoX1N0YXRlU2VxJiBfX3Jocyk7CisKKyAgICAvLyBDbG9uZXMgYW4gZW50aXJlIHNlcXVlbmNlLgorICAgIF9TdGF0ZUlkVAorICAgIF9NX2Nsb25lKCk7CisKKyAgcHJpdmF0ZToKKyAgICBfTmZhJiAgICAgX01fbmZhOworICAgIF9TdGF0ZUlkVCBfTV9zdGFydDsKKyAgICBfU3RhdGVJZFQgX01fZW5kMTsKKyAgICBfU3RhdGVJZFQgX01fZW5kMjsKKworICB9OworCisgLy9AfSByZWdleC1kZXRhaWwKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgX19kZXRhaWwKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjaW5jbHVkZSA8Yml0cy9yZWdleF9uZmEudGNjPgorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmVnZXhfbmZhLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9yZWdleF9uZmEudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4Mjc3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvcmVnZXhfbmZhLnRjYwpAQCAtMCwwICsxLDE3NCBAQAorLy8gY2xhc3MgdGVtcGxhdGUgcmVnZXggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqCisgKiBAZmlsZSBiaXRzL3JlZ2V4X25mYS50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtyZWdleH0KKyAqLworI2luY2x1ZGUgPHJlZ2V4PgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX2RldGFpbAoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBfU3RhdGU6OgorX01fcHJpbnQoc3RkOjpvc3RyZWFtJiBvc3RyKSBjb25zdAoreworICBzd2l0Y2ggKF9NX29wY29kZSkKKyAgeworICAgIGNhc2UgX1Nfb3Bjb2RlX2FsdGVybmF0aXZlOgorICAgICAgb3N0ciA8PCAiYWx0IG5leHQ9IiA8PCBfTV9uZXh0IDw8ICIgYWx0PSIgPDwgX01fYWx0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBfU19vcGNvZGVfc3ViZXhwcl9iZWdpbjoKKyAgICAgIG9zdHIgPDwgInN1YmV4cHIgYmVnaW4gbmV4dD0iIDw8IF9NX25leHQgPDwgIiBpbmRleD0iIDw8IF9NX3N1YmV4cHI7CisgICAgICBicmVhazsKKyAgICBjYXNlIF9TX29wY29kZV9zdWJleHByX2VuZDoKKyAgICAgIG9zdHIgPDwgInN1YmV4cHIgZW5kIG5leHQ9IiA8PCBfTV9uZXh0IDw8ICIgaW5kZXg9IiA8PCBfTV9zdWJleHByOworICAgICAgYnJlYWs7CisgICAgY2FzZSBfU19vcGNvZGVfbWF0Y2g6CisgICAgICBvc3RyIDw8ICJtYXRjaCBuZXh0PSIgPDwgX01fbmV4dDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgX1Nfb3Bjb2RlX2FjY2VwdDoKKyAgICAgIG9zdHIgPDwgImFjY2VwdCBuZXh0PSIgPDwgX01fbmV4dDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBvc3RyIDw8ICJ1bmtub3duIG5leHQ9IiA8PCBfTV9uZXh0OworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIG9zdHI7Cit9CisKKy8vIFByaW50cyBncmFwaHZpeiBkb3QgY29tbWFuZHMgZm9yIHN0YXRlLgoraW5saW5lIHN0ZDo6b3N0cmVhbSYgX1N0YXRlOjoKK19NX2RvdChzdGQ6Om9zdHJlYW0mIF9fb3N0ciwgX1N0YXRlSWRUIF9faWQpIGNvbnN0Cit7CisgIHN3aXRjaCAoX01fb3Bjb2RlKQorICB7CisgICAgY2FzZSBfU19vcGNvZGVfYWx0ZXJuYXRpdmU6CisgICAgICBfX29zdHIgPDwgX19pZCA8PCAiIFtsYWJlbD1cIiIgPDwgX19pZCA8PCAiXFxuQUxUXCJdO1xuIiAKKyAgICAgICAgICAgICA8PCBfX2lkIDw8ICIgLT4gIiA8PCBfTV9uZXh0CisgICAgICAgICAgICAgPDwgIiBbbGFiZWw9XCJlcHNpbG9uXCIsIHRhaWxwb3J0PVwic1wiXTtcbiIKKyAgICAgICAgICAgICA8PCBfX2lkIDw8ICIgLT4gIiA8PCBfTV9hbHQgCisgICAgICAgICAgICAgPDwgIiBbbGFiZWw9XCJlcHNpbG9uXCIsIHRhaWxwb3J0PVwiblwiXTtcbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIF9TX29wY29kZV9zdWJleHByX2JlZ2luOgorICAgICAgX19vc3RyIDw8IF9faWQgPDwgIiBbbGFiZWw9XCIiIDw8IF9faWQgPDwgIlxcblNCRUdJTiAiCisgICAgICAgICAgICAgPDwgX01fc3ViZXhwciA8PCAiXCJdO1xuIiAKKyAgICAgICAgICAgICA8PCBfX2lkIDw8ICIgLT4gIiA8PCBfTV9uZXh0IDw8ICIgW2xhYmVsPVwiZXBzaWxvblwiXTtcbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIF9TX29wY29kZV9zdWJleHByX2VuZDoKKyAgICAgIF9fb3N0ciA8PCBfX2lkIDw8ICIgW2xhYmVsPVwiIiA8PCBfX2lkIDw8ICJcXG5TRU5EICIKKyAgICAgICAgICAgICA8PCBfTV9zdWJleHByIDw8ICJcIl07XG4iIAorICAgICAgICAgICAgIDw8IF9faWQgPDwgIiAtPiAiIDw8IF9NX25leHQgPDwgIiBbbGFiZWw9XCJlcHNpbG9uXCJdO1xuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgX1Nfb3Bjb2RlX21hdGNoOgorICAgICAgX19vc3RyIDw8IF9faWQgPDwgIiBbbGFiZWw9XCIiIDw8IF9faWQgPDwgIlxcbk1BVENIXCJdO1xuIiAKKyAgICAgICAgICAgICA8PCBfX2lkIDw8ICIgLT4gIiA8PCBfTV9uZXh0IDw8ICIgW2xhYmVsPVwiPG1hdGNoPlwiXTtcbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIF9TX29wY29kZV9hY2NlcHQ6CisgICAgICBfX29zdHIgPDwgX19pZCA8PCAiIFtsYWJlbD1cIiIgPDwgX19pZCA8PCAiXFxuQUNDXCJdO1xuIiA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgX19vc3RyIDw8IF9faWQgPDwgIiBbbGFiZWw9XCIiIDw8IF9faWQgPDwgIlxcblVOS1wiXTtcbiIgCisgICAgICAgICAgICAgPDwgX19pZCA8PCAiIC0+ICIgPDwgX01fbmV4dCA8PCAiIFtsYWJlbD1cIj9cIl07XG4iOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIF9fb3N0cjsKK30KKworaW5saW5lIHN0ZDo6b3N0cmVhbSYgX05mYTo6CitfTV9kb3Qoc3RkOjpvc3RyZWFtJiBfX29zdHIpIGNvbnN0Cit7CisgIF9fb3N0ciA8PCAiZGlncmFwaCBfTmZhIHtcbiIKKyAgIDw8ICIgIHJhbmtkaXI9TFI7XG4iOworICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5zaXplKCk7ICsrX19pKQorICB7IHRoaXMtPmF0KF9faSkuX01fZG90KF9fb3N0ciwgX19pKTsgfQorICBfX29zdHIgPDwgIn1cbiI7CisgIHJldHVybiBfX29zdHI7Cit9CisjZW5kaWYKKworaW5saW5lIF9TdGF0ZVNlcSYgX1N0YXRlU2VxOjoKK29wZXJhdG9yPShjb25zdCBfU3RhdGVTZXEmIF9fcmhzKQoreworICBfTV9zdGFydCA9IF9fcmhzLl9NX3N0YXJ0OworICBfTV9lbmQxICA9IF9fcmhzLl9NX2VuZDE7CisgIF9NX2VuZDIgID0gX19yaHMuX01fZW5kMjsKKyAgcmV0dXJuICp0aGlzOworfQorCitpbmxpbmUgdm9pZCBfU3RhdGVTZXE6OgorX01fcHVzaF9iYWNrKF9TdGF0ZUlkVCBfX2lkKQoreworICBpZiAoX01fZW5kMSAhPSBfU19pbnZhbGlkX3N0YXRlX2lkKQorICAgIF9NX25mYVtfTV9lbmQxXS5fTV9uZXh0ID0gX19pZDsKKyAgX01fZW5kMSA9IF9faWQ7Cit9CisKK2lubGluZSB2b2lkIF9TdGF0ZVNlcTo6CitfTV9hcHBlbmQoX1N0YXRlSWRUIF9faWQpCit7CisgIGlmIChfTV9lbmQyICE9IF9TX2ludmFsaWRfc3RhdGVfaWQpCisgIHsKKyAgICBpZiAoX01fZW5kMiA9PSBfTV9lbmQxKQorICAgICAgX01fbmZhW19NX2VuZDJdLl9NX2FsdCA9IF9faWQ7CisgICAgZWxzZQorICAgICAgX01fbmZhW19NX2VuZDJdLl9NX25leHQgPSBfX2lkOworICAgIF9NX2VuZDIgPSBfU19pbnZhbGlkX3N0YXRlX2lkOworICB9CisgIGlmIChfTV9lbmQxICE9IF9TX2ludmFsaWRfc3RhdGVfaWQpCisgICAgX01fbmZhW19NX2VuZDFdLl9NX25leHQgPSBfX2lkOworICBfTV9lbmQxID0gX19pZDsKK30KKworaW5saW5lIHZvaWQgX1N0YXRlU2VxOjoKK19NX2FwcGVuZChfU3RhdGVTZXEmIF9fcmhzKQoreworICBpZiAoX01fZW5kMiAhPSBfU19pbnZhbGlkX3N0YXRlX2lkKQorICB7CisgICAgaWYgKF9NX2VuZDIgPT0gX01fZW5kMSkKKyAgICAgIF9NX25mYVtfTV9lbmQyXS5fTV9hbHQgPSBfX3Jocy5fTV9zdGFydDsKKyAgICBlbHNlCisgICAgICBfTV9uZmFbX01fZW5kMl0uX01fbmV4dCA9IF9fcmhzLl9NX3N0YXJ0OworICAgIF9NX2VuZDIgPSBfU19pbnZhbGlkX3N0YXRlX2lkOworICB9CisgIGlmIChfX3Jocy5fTV9lbmQyICE9IF9TX2ludmFsaWRfc3RhdGVfaWQpCisgICAgX01fZW5kMiA9IF9fcmhzLl9NX2VuZDI7CisgIGlmIChfTV9lbmQxICE9IF9TX2ludmFsaWRfc3RhdGVfaWQpCisgICAgX01fbmZhW19NX2VuZDFdLl9NX25leHQgPSBfX3Jocy5fTV9zdGFydDsKKyAgX01fZW5kMSA9IF9fcmhzLl9NX2VuZDE7Cit9CisKKy8vIEB0b2RvIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgoraW5saW5lIF9TdGF0ZUlkVCBfU3RhdGVTZXE6OgorX01fY2xvbmUoKQoreyByZXR1cm4gMDsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIF9fZGV0YWlsCit9IC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3NoYXJlZF9wdHIuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zaGFyZWRfcHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmMWI2OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zaGFyZWRfcHRyLmgKQEAgLTAsMCArMSw2MzIgQEAKKy8vIHNoYXJlZF9wdHIgYW5kIHdlYWtfcHRyIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIEdDQyBOb3RlOiBCYXNlZCBvbiBmaWxlcyBmcm9tIHZlcnNpb24gMS4zMi4wIG9mIHRoZSBCb29zdCBsaWJyYXJ5LgorCisvLyAgc2hhcmVkX2NvdW50LmhwcAorLy8gIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiwgMjAwMyBQZXRlciBEaW1vdiBhbmQgTXVsdGkgTWVkaWEgTHRkLgorCisvLyAgc2hhcmVkX3B0ci5ocHAKKy8vICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgR3JlZyBDb2x2aW4gYW5kIEJlbWFuIERhd2VzLgorLy8gIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMyBQZXRlciBEaW1vdgorCisvLyAgd2Vha19wdHIuaHBwCisvLyAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzIFBldGVyIERpbW92CisKKy8vICBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcy5ocHAKKy8vICBDb3B5cmlnaHQgKEMpIDIwMDIgUGV0ZXIgRGltb3YKKworLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlCisvLyBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvKiogQGZpbGUgYml0cy9zaGFyZWRfcHRyLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXttZW1vcnl9CisgKi8KKworI2lmbmRlZiBfU0hBUkVEX1BUUl9ICisjZGVmaW5lIF9TSEFSRURfUFRSX0ggMQorCisjaW5jbHVkZSA8Yml0cy9zaGFyZWRfcHRyX2Jhc2UuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBwb2ludGVyX2Fic3RyYWN0aW9ucworICAgKiBAeworICAgKi8KKworICAvLy8gMi4yLjMuNyBzaGFyZWRfcHRyIEkvTworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2gsIHR5cGVuYW1lIF9UciwgdHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBzdGQ6OmJhc2ljX29zdHJlYW08X0NoLCBfVHI+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaCwgX1RyPiYgX19vcywKKwkgICAgICAgY29uc3QgX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19wKQorICAgIHsKKyAgICAgIF9fb3MgPDwgX19wLmdldCgpOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIC8vLyAyLjIuMy4xMCBzaGFyZWRfcHRyIGdldF9kZWxldGVyIChleHBlcmltZW50YWwpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9EZWwsIHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgX0RlbCoKKyAgICBnZXRfZGVsZXRlcihjb25zdCBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX3ApIG5vZXhjZXB0CisgICAgeworI2lmZGVmIF9fR1hYX1JUVEkKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxfRGVsKj4oX19wLl9NX2dldF9kZWxldGVyKHR5cGVpZChfRGVsKSkpOworI2Vsc2UKKyAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgfQorCisKKyAgLyoqCisgICAqICBAYnJpZWYgIEEgc21hcnQgcG9pbnRlciB3aXRoIHJlZmVyZW5jZS1jb3VudGVkIGNvcHkgc2VtYW50aWNzLgorICAgKgorICAgKiAgVGhlIG9iamVjdCBwb2ludGVkIHRvIGlzIGRlbGV0ZWQgd2hlbiB0aGUgbGFzdCBzaGFyZWRfcHRyIHBvaW50aW5nIHRvCisgICAqICBpdCBpcyBkZXN0cm95ZWQgb3IgcmVzZXQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBzaGFyZWRfcHRyIDogcHVibGljIF9fc2hhcmVkX3B0cjxfVHA+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IGFuIGVtcHR5ICVzaGFyZWRfcHRyLgorICAgICAgICogIEBwb3N0ICAgdXNlX2NvdW50KCk9PTAgJiYgZ2V0KCk9PTAKKyAgICAgICAqLworICAgICAgY29uc3RleHByIHNoYXJlZF9wdHIoKSBub2V4Y2VwdAorICAgICAgOiBfX3NoYXJlZF9wdHI8X1RwPigpIHsgfQorCisgICAgICBzaGFyZWRfcHRyKGNvbnN0IHNoYXJlZF9wdHImKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IGEgJXNoYXJlZF9wdHIgdGhhdCBvd25zIHRoZSBwb2ludGVyIEBhIF9fcC4KKyAgICAgICAqICBAcGFyYW0gIF9fcCAgQSBwb2ludGVyIHRoYXQgaXMgY29udmVydGlibGUgdG8gZWxlbWVudF90eXBlKi4KKyAgICAgICAqICBAcG9zdCAgIHVzZV9jb3VudCgpID09IDEgJiYgZ2V0KCkgPT0gX19wCisgICAgICAgKiAgQHRocm93ICBzdGQ6OmJhZF9hbGxvYywgaW4gd2hpY2ggY2FzZSBAYyBkZWxldGUgQGEgX19wIGlzIGNhbGxlZC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlleHBsaWNpdCBzaGFyZWRfcHRyKF9UcDEqIF9fcCkKKyAgICAgICAgOiBfX3NoYXJlZF9wdHI8X1RwPihfX3ApIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBhICVzaGFyZWRfcHRyIHRoYXQgb3ducyB0aGUgcG9pbnRlciBAYSBfX3AKKyAgICAgICAqICAgICAgICAgIGFuZCB0aGUgZGVsZXRlciBAYSBfX2QuCisgICAgICAgKiAgQHBhcmFtICBfX3AgIEEgcG9pbnRlci4KKyAgICAgICAqICBAcGFyYW0gIF9fZCAgQSBkZWxldGVyLgorICAgICAgICogIEBwb3N0ICAgdXNlX2NvdW50KCkgPT0gMSAmJiBnZXQoKSA9PSBfX3AKKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6YmFkX2FsbG9jLCBpbiB3aGljaCBjYXNlIEBhIF9fZChfX3ApIGlzIGNhbGxlZC4KKyAgICAgICAqCisgICAgICAgKiAgUmVxdWlyZW1lbnRzOiBfRGVsZXRlcidzIGNvcHkgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgbXVzdAorICAgICAgICogIG5vdCB0aHJvdworICAgICAgICoKKyAgICAgICAqICBfX3NoYXJlZF9wdHIgd2lsbCByZWxlYXNlIF9fcCBieSBjYWxsaW5nIF9fZChfX3ApCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9EZWxldGVyPgorCXNoYXJlZF9wdHIoX1RwMSogX19wLCBfRGVsZXRlciBfX2QpCisgICAgICAgIDogX19zaGFyZWRfcHRyPF9UcD4oX19wLCBfX2QpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBhICVzaGFyZWRfcHRyIHRoYXQgb3ducyBhIG51bGwgcG9pbnRlcgorICAgICAgICogICAgICAgICAgYW5kIHRoZSBkZWxldGVyIEBhIF9fZC4KKyAgICAgICAqICBAcGFyYW0gIF9fcCAgQSBudWxsIHBvaW50ZXIgY29uc3RhbnQuCisgICAgICAgKiAgQHBhcmFtICBfX2QgIEEgZGVsZXRlci4KKyAgICAgICAqICBAcG9zdCAgIHVzZV9jb3VudCgpID09IDEgJiYgZ2V0KCkgPT0gX19wCisgICAgICAgKiAgQHRocm93ICBzdGQ6OmJhZF9hbGxvYywgaW4gd2hpY2ggY2FzZSBAYSBfX2QoX19wKSBpcyBjYWxsZWQuCisgICAgICAgKgorICAgICAgICogIFJlcXVpcmVtZW50czogX0RlbGV0ZXIncyBjb3B5IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIG11c3QKKyAgICAgICAqICBub3QgdGhyb3cKKyAgICAgICAqCisgICAgICAgKiAgVGhlIGxhc3Qgb3duZXIgd2lsbCBjYWxsIF9fZChfX3ApCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9EZWxldGVyPgorCXNoYXJlZF9wdHIobnVsbHB0cl90IF9fcCwgX0RlbGV0ZXIgX19kKQorICAgICAgICA6IF9fc2hhcmVkX3B0cjxfVHA+KF9fcCwgX19kKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3QgYSAlc2hhcmVkX3B0ciB0aGF0IG93bnMgdGhlIHBvaW50ZXIgQGEgX19wCisgICAgICAgKiAgICAgICAgICBhbmQgdGhlIGRlbGV0ZXIgQGEgX19kLgorICAgICAgICogIEBwYXJhbSAgX19wICBBIHBvaW50ZXIuCisgICAgICAgKiAgQHBhcmFtICBfX2QgIEEgZGVsZXRlci4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yLgorICAgICAgICogIEBwb3N0ICAgdXNlX2NvdW50KCkgPT0gMSAmJiBnZXQoKSA9PSBfX3AKKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6YmFkX2FsbG9jLCBpbiB3aGljaCBjYXNlIEBhIF9fZChfX3ApIGlzIGNhbGxlZC4KKyAgICAgICAqCisgICAgICAgKiAgUmVxdWlyZW1lbnRzOiBfRGVsZXRlcidzIGNvcHkgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgbXVzdAorICAgICAgICogIG5vdCB0aHJvdyBfQWxsb2MncyBjb3B5IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIG11c3Qgbm90CisgICAgICAgKiAgdGhyb3cuCisgICAgICAgKgorICAgICAgICogIF9fc2hhcmVkX3B0ciB3aWxsIHJlbGVhc2UgX19wIGJ5IGNhbGxpbmcgX19kKF9fcCkKKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX0RlbGV0ZXIsIHR5cGVuYW1lIF9BbGxvYz4KKwlzaGFyZWRfcHRyKF9UcDEqIF9fcCwgX0RlbGV0ZXIgX19kLCBfQWxsb2MgX19hKQorCTogX19zaGFyZWRfcHRyPF9UcD4oX19wLCBfX2QsIHN0ZDo6bW92ZShfX2EpKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3QgYSAlc2hhcmVkX3B0ciB0aGF0IG93bnMgYSBudWxsIHBvaW50ZXIKKyAgICAgICAqICAgICAgICAgIGFuZCB0aGUgZGVsZXRlciBAYSBfX2QuCisgICAgICAgKiAgQHBhcmFtICBfX3AgIEEgbnVsbCBwb2ludGVyIGNvbnN0YW50LgorICAgICAgICogIEBwYXJhbSAgX19kICBBIGRlbGV0ZXIuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvci4KKyAgICAgICAqICBAcG9zdCAgIHVzZV9jb3VudCgpID09IDEgJiYgZ2V0KCkgPT0gX19wCisgICAgICAgKiAgQHRocm93ICBzdGQ6OmJhZF9hbGxvYywgaW4gd2hpY2ggY2FzZSBAYSBfX2QoX19wKSBpcyBjYWxsZWQuCisgICAgICAgKgorICAgICAgICogIFJlcXVpcmVtZW50czogX0RlbGV0ZXIncyBjb3B5IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIG11c3QKKyAgICAgICAqICBub3QgdGhyb3cgX0FsbG9jJ3MgY29weSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBtdXN0IG5vdAorICAgICAgICogIHRocm93LgorICAgICAgICoKKyAgICAgICAqICBUaGUgbGFzdCBvd25lciB3aWxsIGNhbGwgX19kKF9fcCkKKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0RlbGV0ZXIsIHR5cGVuYW1lIF9BbGxvYz4KKwlzaGFyZWRfcHRyKG51bGxwdHJfdCBfX3AsIF9EZWxldGVyIF9fZCwgX0FsbG9jIF9fYSkKKwk6IF9fc2hhcmVkX3B0cjxfVHA+KF9fcCwgX19kLCBzdGQ6Om1vdmUoX19hKSkgeyB9CisKKyAgICAgIC8vIEFsaWFzaW5nIGNvbnN0cnVjdG9yCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0cyBhICVzaGFyZWRfcHRyIGluc3RhbmNlIHRoYXQgc3RvcmVzIEBhIF9fcAorICAgICAgICogICAgICAgICAgYW5kIHNoYXJlcyBvd25lcnNoaXAgd2l0aCBAYSBfX3IuCisgICAgICAgKiAgQHBhcmFtICBfX3IgIEEgJXNoYXJlZF9wdHIuCisgICAgICAgKiAgQHBhcmFtICBfX3AgIEEgcG9pbnRlciB0aGF0IHdpbGwgcmVtYWluIHZhbGlkIHdoaWxlIEBhICpfX3IgaXMgdmFsaWQuCisgICAgICAgKiAgQHBvc3QgICBnZXQoKSA9PSBfX3AgJiYgdXNlX2NvdW50KCkgPT0gX19yLnVzZV9jb3VudCgpCisgICAgICAgKgorICAgICAgICogIFRoaXMgY2FuIGJlIHVzZWQgdG8gY29uc3RydWN0IGEgQGMgc2hhcmVkX3B0ciB0byBhIHN1Yi1vYmplY3QKKyAgICAgICAqICBvZiBhbiBvYmplY3QgbWFuYWdlZCBieSBhbiBleGlzdGluZyBAYyBzaGFyZWRfcHRyLgorICAgICAgICoKKyAgICAgICAqIEBjb2RlCisgICAgICAgKiBzaGFyZWRfcHRyPCBwYWlyPGludCxpbnQ+ID4gcGlpKG5ldyBwYWlyPGludCxpbnQ+KCkpOworICAgICAgICogc2hhcmVkX3B0cjxpbnQ+IHBpKHBpaSwgJnBpaS0+Zmlyc3QpOworICAgICAgICogYXNzZXJ0KHBpaS51c2VfY291bnQoKSA9PSAyKTsKKyAgICAgICAqIEBlbmRjb2RlCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJc2hhcmVkX3B0cihjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IsIF9UcCogX19wKSBub2V4Y2VwdAorCTogX19zaGFyZWRfcHRyPF9UcD4oX19yLCBfX3ApIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIElmIEBhIF9fciBpcyBlbXB0eSwgY29uc3RydWN0cyBhbiBlbXB0eSAlc2hhcmVkX3B0cjsKKyAgICAgICAqICAgICAgICAgIG90aGVyd2lzZSBjb25zdHJ1Y3QgYSAlc2hhcmVkX3B0ciB0aGF0IHNoYXJlcyBvd25lcnNoaXAKKyAgICAgICAqICAgICAgICAgIHdpdGggQGEgX19yLgorICAgICAgICogIEBwYXJhbSAgX19yICBBICVzaGFyZWRfcHRyLgorICAgICAgICogIEBwb3N0ICAgZ2V0KCkgPT0gX19yLmdldCgpICYmIHVzZV9jb3VudCgpID09IF9fci51c2VfY291bnQoKQorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1RwMSosIF9UcCo+Ojp2YWx1ZT46OnR5cGU+CisJc2hhcmVkX3B0cihjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IpIG5vZXhjZXB0CisgICAgICAgIDogX19zaGFyZWRfcHRyPF9UcD4oX19yKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNb3ZlLWNvbnN0cnVjdHMgYSAlc2hhcmVkX3B0ciBpbnN0YW5jZSBmcm9tIEBhIF9fci4KKyAgICAgICAqICBAcGFyYW0gIF9fciAgQSAlc2hhcmVkX3B0ciBydmFsdWUuCisgICAgICAgKiAgQHBvc3QgICAqdGhpcyBjb250YWlucyB0aGUgb2xkIHZhbHVlIG9mIEBhIF9fciwgQGEgX19yIGlzIGVtcHR5LgorICAgICAgICovCisgICAgICBzaGFyZWRfcHRyKHNoYXJlZF9wdHImJiBfX3IpIG5vZXhjZXB0CisgICAgICA6IF9fc2hhcmVkX3B0cjxfVHA+KHN0ZDo6bW92ZShfX3IpKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNb3ZlLWNvbnN0cnVjdHMgYSAlc2hhcmVkX3B0ciBpbnN0YW5jZSBmcm9tIEBhIF9fci4KKyAgICAgICAqICBAcGFyYW0gIF9fciAgQSAlc2hhcmVkX3B0ciBydmFsdWUuCisgICAgICAgKiAgQHBvc3QgICAqdGhpcyBjb250YWlucyB0aGUgb2xkIHZhbHVlIG9mIEBhIF9fciwgQGEgX19yIGlzIGVtcHR5LgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1RwMSosIF9UcCo+Ojp2YWx1ZT46OnR5cGU+CisJc2hhcmVkX3B0cihzaGFyZWRfcHRyPF9UcDE+JiYgX19yKSBub2V4Y2VwdAorCTogX19zaGFyZWRfcHRyPF9UcD4oc3RkOjptb3ZlKF9fcikpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdHMgYSAlc2hhcmVkX3B0ciB0aGF0IHNoYXJlcyBvd25lcnNoaXAgd2l0aCBAYSBfX3IKKyAgICAgICAqICAgICAgICAgIGFuZCBzdG9yZXMgYSBjb3B5IG9mIHRoZSBwb2ludGVyIHN0b3JlZCBpbiBAYSBfX3IuCisgICAgICAgKiAgQHBhcmFtICBfX3IgIEEgd2Vha19wdHIuCisgICAgICAgKiAgQHBvc3QgICB1c2VfY291bnQoKSA9PSBfX3IudXNlX2NvdW50KCkKKyAgICAgICAqICBAdGhyb3cgIGJhZF93ZWFrX3B0ciB3aGVuIF9fci5leHBpcmVkKCksCisgICAgICAgKiAgICAgICAgICBpbiB3aGljaCBjYXNlIHRoZSBjb25zdHJ1Y3RvciBoYXMgbm8gZWZmZWN0LgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCWV4cGxpY2l0IHNoYXJlZF9wdHIoY29uc3Qgd2Vha19wdHI8X1RwMT4mIF9fcikKKwk6IF9fc2hhcmVkX3B0cjxfVHA+KF9fcikgeyB9CisKKyNpZiBfR0xJQkNYWF9VU0VfREVQUkVDQVRFRAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlzaGFyZWRfcHRyKHN0ZDo6YXV0b19wdHI8X1RwMT4mJiBfX3IpOworI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9EZWw+CisJc2hhcmVkX3B0cihzdGQ6OnVuaXF1ZV9wdHI8X1RwMSwgX0RlbD4mJiBfX3IpCisJOiBfX3NoYXJlZF9wdHI8X1RwPihzdGQ6Om1vdmUoX19yKSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IGFuIGVtcHR5ICVzaGFyZWRfcHRyLgorICAgICAgICogIEBwYXJhbSAgX19wICBBIG51bGwgcG9pbnRlciBjb25zdGFudC4KKyAgICAgICAqICBAcG9zdCAgIHVzZV9jb3VudCgpID09IDAgJiYgZ2V0KCkgPT0gbnVsbHB0cgorICAgICAgICovCisgICAgICBjb25zdGV4cHIgc2hhcmVkX3B0cihudWxscHRyX3QgX19wKSBub2V4Y2VwdAorICAgICAgOiBfX3NoYXJlZF9wdHI8X1RwPihfX3ApIHsgfQorCisgICAgICBzaGFyZWRfcHRyJiBvcGVyYXRvcj0oY29uc3Qgc2hhcmVkX3B0ciYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlzaGFyZWRfcHRyJgorCW9wZXJhdG9yPShjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IpIG5vZXhjZXB0CisJeworCSAgdGhpcy0+X19zaGFyZWRfcHRyPF9UcD46Om9wZXJhdG9yPShfX3IpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworI2lmIF9HTElCQ1hYX1VTRV9ERVBSRUNBVEVECisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCXNoYXJlZF9wdHImCisJb3BlcmF0b3I9KHN0ZDo6YXV0b19wdHI8X1RwMT4mJiBfX3IpCisJeworCSAgdGhpcy0+X19zaGFyZWRfcHRyPF9UcD46Om9wZXJhdG9yPShzdGQ6Om1vdmUoX19yKSk7CisJICByZXR1cm4gKnRoaXM7CisJfQorI2VuZGlmCisKKyAgICAgIHNoYXJlZF9wdHImCisgICAgICBvcGVyYXRvcj0oc2hhcmVkX3B0ciYmIF9fcikgbm9leGNlcHQKKyAgICAgIHsKKwl0aGlzLT5fX3NoYXJlZF9wdHI8X1RwPjo6b3BlcmF0b3I9KHN0ZDo6bW92ZShfX3IpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9UcDE+CisJc2hhcmVkX3B0ciYKKwlvcGVyYXRvcj0oc2hhcmVkX3B0cjxfVHAxPiYmIF9fcikgbm9leGNlcHQKKwl7CisJICB0aGlzLT5fX3NoYXJlZF9wdHI8X1RwPjo6b3BlcmF0b3I9KHN0ZDo6bW92ZShfX3IpKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9EZWw+CisJc2hhcmVkX3B0ciYKKwlvcGVyYXRvcj0oc3RkOjp1bmlxdWVfcHRyPF9UcDEsIF9EZWw+JiYgX19yKQorCXsKKwkgIHRoaXMtPl9fc2hhcmVkX3B0cjxfVHA+OjpvcGVyYXRvcj0oc3RkOjptb3ZlKF9fcikpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgIHByaXZhdGU6CisgICAgICAvLyBUaGlzIGNvbnN0cnVjdG9yIGlzIG5vbi1zdGFuZGFyZCwgaXQgaXMgdXNlZCBieSBhbGxvY2F0ZV9zaGFyZWQuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lLi4uIF9BcmdzPgorCXNoYXJlZF9wdHIoX1NwX21ha2Vfc2hhcmVkX3RhZyBfX3RhZywgY29uc3QgX0FsbG9jJiBfX2EsCisJCSAgIF9BcmdzJiYuLi4gX19hcmdzKQorCTogX19zaGFyZWRfcHRyPF9UcD4oX190YWcsIF9fYSwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKQorCXsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lLi4uIF9BcmdzPgorCWZyaWVuZCBzaGFyZWRfcHRyPF9UcDE+CisJYWxsb2NhdGVfc2hhcmVkKGNvbnN0IF9BbGxvYyYgX19hLCBfQXJncyYmLi4uIF9fYXJncyk7CisgICAgfTsKKworICAvLyAyMC43LjIuMi43IHNoYXJlZF9wdHIgY29tcGFyaXNvbnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19hLAorCSAgICAgICBjb25zdCBzaGFyZWRfcHRyPF9UcDI+JiBfX2IpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19hLmdldCgpID09IF9fYi5nZXQoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc2hhcmVkX3B0cjxfVHA+JiBfX2EsIG51bGxwdHJfdCkgbm9leGNlcHQKKyAgICB7IHJldHVybiAhX19hOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShudWxscHRyX3QsIGNvbnN0IHNoYXJlZF9wdHI8X1RwPiYgX19hKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuICFfX2E7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX2EsCisJICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8X1RwMj4mIF9fYikgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2EuZ2V0KCkgIT0gX19iLmdldCgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9fYSwgbnVsbHB0cl90KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIChib29sKV9fYTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0obnVsbHB0cl90LCBjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9fYSkgbm9leGNlcHQKKyAgICB7IHJldHVybiAoYm9vbClfX2E7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fYSwKKwkgICAgICBjb25zdCBzaGFyZWRfcHRyPF9UcDI+JiBfX2IpIG5vZXhjZXB0CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbW1vbl90eXBlPF9UcDEqLCBfVHAyKj46OnR5cGUgX0NUOworICAgICAgcmV0dXJuIHN0ZDo6bGVzczxfQ1Q+KCkoX19hLmdldCgpLCBfX2IuZ2V0KCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3Qgc2hhcmVkX3B0cjxfVHA+JiBfX2EsIG51bGxwdHJfdCkgbm9leGNlcHQKKyAgICB7IHJldHVybiBzdGQ6Omxlc3M8X1RwKj4oKShfX2EuZ2V0KCksIG51bGxwdHIpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KG51bGxwdHJfdCwgY29uc3Qgc2hhcmVkX3B0cjxfVHA+JiBfX2EpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gc3RkOjpsZXNzPF9UcCo+KCkobnVsbHB0ciwgX19hLmdldCgpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fYSwKKwkgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxfVHAyPiYgX19iKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuICEoX19iIDwgX19hKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3Qgc2hhcmVkX3B0cjxfVHA+JiBfX2EsIG51bGxwdHJfdCkgbm9leGNlcHQKKyAgICB7IHJldHVybiAhKG51bGxwdHIgPCBfX2EpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShudWxscHRyX3QsIGNvbnN0IHNoYXJlZF9wdHI8X1RwPiYgX19hKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuICEoX19hIDwgbnVsbHB0cik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fYSwKKwkgICAgICBjb25zdCBzaGFyZWRfcHRyPF9UcDI+JiBfX2IpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gKF9fYiA8IF9fYSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3Qgc2hhcmVkX3B0cjxfVHA+JiBfX2EsIG51bGxwdHJfdCkgbm9leGNlcHQKKyAgICB7IHJldHVybiBzdGQ6Omxlc3M8X1RwKj4oKShudWxscHRyLCBfX2EuZ2V0KCkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KG51bGxwdHJfdCwgY29uc3Qgc2hhcmVkX3B0cjxfVHA+JiBfX2EpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gc3RkOjpsZXNzPF9UcCo+KCkoX19hLmdldCgpLCBudWxscHRyKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fYSwKKwkgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxfVHAyPiYgX19iKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuICEoX19hIDwgX19iKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc2hhcmVkX3B0cjxfVHA+JiBfX2EsIG51bGxwdHJfdCkgbm9leGNlcHQKKyAgICB7IHJldHVybiAhKF9fYSA8IG51bGxwdHIpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShudWxscHRyX3QsIGNvbnN0IHNoYXJlZF9wdHI8X1RwPiYgX19hKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuICEobnVsbHB0ciA8IF9fYSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGxlc3M8c2hhcmVkX3B0cjxfVHA+PiA6IHB1YmxpYyBfU3BfbGVzczxzaGFyZWRfcHRyPF9UcD4+CisgICAgeyB9OworCisgIC8vIDIwLjcuMi4yLjggc2hhcmVkX3B0ciBzcGVjaWFsaXplZCBhbGdvcml0aG1zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHNoYXJlZF9wdHI8X1RwPiYgX19hLCBzaGFyZWRfcHRyPF9UcD4mIF9fYikgbm9leGNlcHQKKyAgICB7IF9fYS5zd2FwKF9fYik7IH0KKworICAvLyAyMC43LjIuMi45IHNoYXJlZF9wdHIgY2FzdHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwMT4KKyAgICBpbmxpbmUgc2hhcmVkX3B0cjxfVHA+CisgICAgc3RhdGljX3BvaW50ZXJfY2FzdChjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gc2hhcmVkX3B0cjxfVHA+KF9fciwgc3RhdGljX2Nhc3Q8X1RwKj4oX19yLmdldCgpKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UcDE+CisgICAgaW5saW5lIHNoYXJlZF9wdHI8X1RwPgorICAgIGNvbnN0X3BvaW50ZXJfY2FzdChjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gc2hhcmVkX3B0cjxfVHA+KF9fciwgY29uc3RfY2FzdDxfVHAqPihfX3IuZ2V0KCkpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwMT4KKyAgICBpbmxpbmUgc2hhcmVkX3B0cjxfVHA+CisgICAgZHluYW1pY19wb2ludGVyX2Nhc3QoY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19yKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIGlmIChfVHAqIF9fcCA9IGR5bmFtaWNfY2FzdDxfVHAqPihfX3IuZ2V0KCkpKQorCXJldHVybiBzaGFyZWRfcHRyPF9UcD4oX19yLCBfX3ApOworICAgICAgcmV0dXJuIHNoYXJlZF9wdHI8X1RwPigpOworICAgIH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmICBBIHNtYXJ0IHBvaW50ZXIgd2l0aCB3ZWFrIHNlbWFudGljcy4KKyAgICoKKyAgICogIFdpdGggZm9yd2FyZGluZyBjb25zdHJ1Y3RvcnMgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3JzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIHdlYWtfcHRyIDogcHVibGljIF9fd2Vha19wdHI8X1RwPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBjb25zdGV4cHIgd2Vha19wdHIoKSBub2V4Y2VwdAorICAgICAgOiBfX3dlYWtfcHRyPF9UcD4oKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPF9UcDEqLCBfVHAqPjo6dmFsdWU+Ojp0eXBlPgorCXdlYWtfcHRyKGNvbnN0IHdlYWtfcHRyPF9UcDE+JiBfX3IpIG5vZXhjZXB0CisJOiBfX3dlYWtfcHRyPF9UcD4oX19yKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPF9UcDEqLCBfVHAqPjo6dmFsdWU+Ojp0eXBlPgorCXdlYWtfcHRyKGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fcikgbm9leGNlcHQKKwk6IF9fd2Vha19wdHI8X1RwPihfX3IpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCXdlYWtfcHRyJgorCW9wZXJhdG9yPShjb25zdCB3ZWFrX3B0cjxfVHAxPiYgX19yKSBub2V4Y2VwdAorCXsKKwkgIHRoaXMtPl9fd2Vha19wdHI8X1RwPjo6b3BlcmF0b3I9KF9fcik7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCXdlYWtfcHRyJgorCW9wZXJhdG9yPShjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IpIG5vZXhjZXB0CisJeworCSAgdGhpcy0+X193ZWFrX3B0cjxfVHA+OjpvcGVyYXRvcj0oX19yKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHNoYXJlZF9wdHI8X1RwPgorICAgICAgbG9jaygpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7CisjaWZkZWYgX19HVEhSRUFEUworCWlmICh0aGlzLT5leHBpcmVkKCkpCisJICByZXR1cm4gc2hhcmVkX3B0cjxfVHA+KCk7CisKKwlfX3RyeQorCSAgeworCSAgICByZXR1cm4gc2hhcmVkX3B0cjxfVHA+KCp0aGlzKTsKKwkgIH0KKwlfX2NhdGNoKGNvbnN0IGJhZF93ZWFrX3B0ciYpCisJICB7CisJICAgIHJldHVybiBzaGFyZWRfcHRyPF9UcD4oKTsKKwkgIH0KKyNlbHNlCisJcmV0dXJuIHRoaXMtPmV4cGlyZWQoKSA/IHNoYXJlZF9wdHI8X1RwPigpIDogc2hhcmVkX3B0cjxfVHA+KCp0aGlzKTsKKyNlbmRpZgorICAgICAgfQorICAgIH07CisKKyAgLy8gMjAuNy4yLjMuNiB3ZWFrX3B0ciBzcGVjaWFsaXplZCBhbGdvcml0aG1zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHdlYWtfcHRyPF9UcD4mIF9fYSwgd2Vha19wdHI8X1RwPiYgX19iKSBub2V4Y2VwdAorICAgIHsgX19hLnN3YXAoX19iKTsgfQorCisKKyAgLy8vIFByaW1hcnkgdGVtcGxhdGUgb3duZXJfbGVzcworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IG93bmVyX2xlc3M7CisKKyAgLy8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gb2Ygb3duZXJfbGVzcyBmb3Igc2hhcmVkX3B0ci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBvd25lcl9sZXNzPHNoYXJlZF9wdHI8X1RwPj4KKyAgICA6IHB1YmxpYyBfU3Bfb3duZXJfbGVzczxzaGFyZWRfcHRyPF9UcD4sIHdlYWtfcHRyPF9UcD4+CisgICAgeyB9OworCisgIC8vLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG9mIG93bmVyX2xlc3MgZm9yIHdlYWtfcHRyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IG93bmVyX2xlc3M8d2Vha19wdHI8X1RwPj4KKyAgICA6IHB1YmxpYyBfU3Bfb3duZXJfbGVzczx3ZWFrX3B0cjxfVHA+LCBzaGFyZWRfcHRyPF9UcD4+CisgICAgeyB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIEJhc2UgY2xhc3MgYWxsb3dpbmcgdXNlIG9mIG1lbWJlciBmdW5jdGlvbiBzaGFyZWRfZnJvbV90aGlzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIGNvbnN0ZXhwciBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcygpIG5vZXhjZXB0IHsgfQorCisgICAgICBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyhjb25zdCBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYpIG5vZXhjZXB0IHsgfQorCisgICAgICBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICB+ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMoKSB7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIHNoYXJlZF9wdHI8X1RwPgorICAgICAgc2hhcmVkX2Zyb21fdGhpcygpCisgICAgICB7IHJldHVybiBzaGFyZWRfcHRyPF9UcD4odGhpcy0+X01fd2Vha190aGlzKTsgfQorCisgICAgICBzaGFyZWRfcHRyPGNvbnN0IF9UcD4KKyAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSBjb25zdAorICAgICAgeyByZXR1cm4gc2hhcmVkX3B0cjxjb25zdCBfVHA+KHRoaXMtPl9NX3dlYWtfdGhpcyk7IH0KKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCXZvaWQKKwlfTV93ZWFrX2Fzc2lnbihfVHAxKiBfX3AsIGNvbnN0IF9fc2hhcmVkX2NvdW50PD4mIF9fbikgY29uc3Qgbm9leGNlcHQKKwl7IF9NX3dlYWtfdGhpcy5fTV9hc3NpZ24oX19wLCBfX24pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJZnJpZW5kIHZvaWQKKwlfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzX2hlbHBlcihjb25zdCBfX3NoYXJlZF9jb3VudDw+JiBfX3BuLAorCQkJCQkgY29uc3QgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMqIF9fcGUsCisJCQkJCSBjb25zdCBfVHAxKiBfX3B4KSBub2V4Y2VwdAorCXsKKwkgIGlmIChfX3BlICE9IDApCisJICAgIF9fcGUtPl9NX3dlYWtfYXNzaWduKGNvbnN0X2Nhc3Q8X1RwMSo+KF9fcHgpLCBfX3BuKTsKKwl9CisKKyAgICAgIG11dGFibGUgd2Vha19wdHI8X1RwPiAgX01fd2Vha190aGlzOworICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENyZWF0ZSBhbiBvYmplY3QgdGhhdCBpcyBvd25lZCBieSBhIHNoYXJlZF9wdHIuCisgICAqICBAcGFyYW0gIF9fYSAgICAgQW4gYWxsb2NhdG9yLgorICAgKiAgQHBhcmFtICBfX2FyZ3MgIEFyZ3VtZW50cyBmb3IgdGhlIEBhIF9UcCBvYmplY3QncyBjb25zdHJ1Y3Rvci4KKyAgICogIEByZXR1cm4gQSBzaGFyZWRfcHRyIHRoYXQgb3ducyB0aGUgbmV3bHkgY3JlYXRlZCBvYmplY3QuCisgICAqICBAdGhyb3cgIEFuIGV4Y2VwdGlvbiB0aHJvd24gZnJvbSBAYSBfQWxsb2M6OmFsbG9jYXRlIG9yIGZyb20gdGhlCisgICAqICAgICAgICAgIGNvbnN0cnVjdG9yIG9mIEBhIF9UcC4KKyAgICoKKyAgICogIEEgY29weSBvZiBAYSBfX2Egd2lsbCBiZSB1c2VkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNoYXJlZF9wdHIKKyAgICogIGFuZCB0aGUgbmV3IG9iamVjdC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBpbmxpbmUgc2hhcmVkX3B0cjxfVHA+CisgICAgYWxsb2NhdGVfc2hhcmVkKGNvbnN0IF9BbGxvYyYgX19hLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICB7CisgICAgICByZXR1cm4gc2hhcmVkX3B0cjxfVHA+KF9TcF9tYWtlX3NoYXJlZF90YWcoKSwgX19hLAorCQkJICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgQ3JlYXRlIGFuIG9iamVjdCB0aGF0IGlzIG93bmVkIGJ5IGEgc2hhcmVkX3B0ci4KKyAgICogIEBwYXJhbSAgX19hcmdzICBBcmd1bWVudHMgZm9yIHRoZSBAYSBfVHAgb2JqZWN0J3MgY29uc3RydWN0b3IuCisgICAqICBAcmV0dXJuIEEgc2hhcmVkX3B0ciB0aGF0IG93bnMgdGhlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LgorICAgKiAgQHRocm93ICBzdGQ6OmJhZF9hbGxvYywgb3IgYW4gZXhjZXB0aW9uIHRocm93biBmcm9tIHRoZQorICAgKiAgICAgICAgICBjb25zdHJ1Y3RvciBvZiBAYSBfVHAuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGlubGluZSBzaGFyZWRfcHRyPF9UcD4KKyAgICBtYWtlX3NoYXJlZChfQXJncyYmLi4uIF9fYXJncykKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2NvbnN0PF9UcD46OnR5cGUgX1RwX25jOworICAgICAgcmV0dXJuIHN0ZDo6YWxsb2NhdGVfc2hhcmVkPF9UcD4oc3RkOjphbGxvY2F0b3I8X1RwX25jPigpLAorCQkJCSAgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIH0KKworICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciBzaGFyZWRfcHRyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGhhc2g8c2hhcmVkX3B0cjxfVHA+PgorICAgIDogcHVibGljIF9faGFzaF9iYXNlPHNpemVfdCwgc2hhcmVkX3B0cjxfVHA+PgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9fcykgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6aGFzaDxfVHAqPigpKF9fcy5nZXQoKSk7IH0KKyAgICB9OworCisgIC8vIEB9IGdyb3VwIHBvaW50ZXJfYWJzdHJhY3Rpb25zCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIF9TSEFSRURfUFRSX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zaGFyZWRfcHRyX2Jhc2UuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zaGFyZWRfcHRyX2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjYxYjY1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3NoYXJlZF9wdHJfYmFzZS5oCkBAIC0wLDAgKzEsMTQyNCBAQAorLy8gc2hhcmVkX3B0ciBhbmQgd2Vha19wdHIgaW1wbGVtZW50YXRpb24gZGV0YWlscyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBHQ0MgTm90ZTogQmFzZWQgb24gZmlsZXMgZnJvbSB2ZXJzaW9uIDEuMzIuMCBvZiB0aGUgQm9vc3QgbGlicmFyeS4KKworLy8gIHNoYXJlZF9jb3VudC5ocHAKKy8vICBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMgUGV0ZXIgRGltb3YgYW5kIE11bHRpIE1lZGlhIEx0ZC4KKworLy8gIHNoYXJlZF9wdHIuaHBwCisvLyAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEdyZWcgQ29sdmluIGFuZCBCZW1hbiBEYXdlcy4KKy8vICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMgUGV0ZXIgRGltb3YKKworLy8gIHdlYWtfcHRyLmhwcAorLy8gIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMyBQZXRlciBEaW1vdgorCisvLyAgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMuaHBwCisvLyAgQ29weXJpZ2h0IChDKSAyMDAyIFBldGVyIERpbW92CisKKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZQorLy8gYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLyoqIEBmaWxlIGJpdHMvc2hhcmVkX3B0cl9iYXNlLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXttZW1vcnl9CisgKi8KKworI2lmbmRlZiBfU0hBUkVEX1BUUl9CQVNFX0gKKyNkZWZpbmUgX1NIQVJFRF9QVFJfQkFTRV9IIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisjaWYgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQKKyAgdGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzIGF1dG9fcHRyOworI2VuZGlmCisKKyAvKioKKyAgICogIEBicmllZiAgRXhjZXB0aW9uIHBvc3NpYmx5IHRocm93biBieSBAYyBzaGFyZWRfcHRyLgorICAgKiAgQGluZ3JvdXAgZXhjZXB0aW9ucworICAgKi8KKyAgY2xhc3MgYmFkX3dlYWtfcHRyIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uCisgIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgY2hhciBjb25zdCoKKyAgICB3aGF0KCkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICB2aXJ0dWFsIH5iYWRfd2Vha19wdHIoKSBub2V4Y2VwdDsgICAgCisgIH07CisKKyAgLy8gU3Vic3RpdHV0ZSBmb3IgYmFkX3dlYWtfcHRyIG9iamVjdCBpbiB0aGUgY2FzZSBvZiAtZm5vLWV4Y2VwdGlvbnMuCisgIGlubGluZSB2b2lkCisgIF9fdGhyb3dfYmFkX3dlYWtfcHRyKCkKKyAgeyBfR0xJQkNYWF9USFJPV19PUl9BQk9SVChiYWRfd2Vha19wdHIoKSk7IH0KKworICB1c2luZyBfX2dudV9jeHg6Ol9Mb2NrX3BvbGljeTsKKyAgdXNpbmcgX19nbnVfY3h4OjpfX2RlZmF1bHRfbG9ja19wb2xpY3k7CisgIHVzaW5nIF9fZ251X2N4eDo6X1Nfc2luZ2xlOworICB1c2luZyBfX2dudV9jeHg6Ol9TX211dGV4OworICB1c2luZyBfX2dudV9jeHg6Ol9TX2F0b21pYzsKKworICAvLyBFbXB0eSBoZWxwZXIgY2xhc3MgZXhjZXB0IHdoZW4gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IGlzIF9TX211dGV4LgorICB0ZW1wbGF0ZTxfTG9ja19wb2xpY3kgX0xwPgorICAgIGNsYXNzIF9NdXRleF9iYXNlCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIFRoZSBhdG9taWMgcG9saWN5IHVzZXMgZnVsbHktZmVuY2VkIGJ1aWx0aW5zLCBzaW5nbGUgZG9lc24ndCBjYXJlLgorICAgICAgZW51bSB7IF9TX25lZWRfYmFycmllcnMgPSAwIH07CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgX011dGV4X2Jhc2U8X1NfbXV0ZXg+CisgICAgOiBwdWJsaWMgX19nbnVfY3h4OjpfX211dGV4CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIFRoaXMgcG9saWN5IGlzIHVzZWQgd2hlbiBhdG9taWMgYnVpbHRpbnMgYXJlIG5vdCBhdmFpbGFibGUuCisgICAgICAvLyBUaGUgcmVwbGFjZW1lbnQgYXRvbWljIG9wZXJhdGlvbnMgbWlnaHQgbm90IGhhdmUgdGhlIG5lY2Vzc2FyeQorICAgICAgLy8gbWVtb3J5IGJhcnJpZXJzLgorICAgICAgZW51bSB7IF9TX25lZWRfYmFycmllcnMgPSAxIH07CisgICAgfTsKKworICB0ZW1wbGF0ZTxfTG9ja19wb2xpY3kgX0xwID0gX19kZWZhdWx0X2xvY2tfcG9saWN5PgorICAgIGNsYXNzIF9TcF9jb3VudGVkX2Jhc2UKKyAgICA6IHB1YmxpYyBfTXV0ZXhfYmFzZTxfTHA+CisgICAgeworICAgIHB1YmxpYzogIAorICAgICAgX1NwX2NvdW50ZWRfYmFzZSgpIG5vZXhjZXB0CisgICAgICA6IF9NX3VzZV9jb3VudCgxKSwgX01fd2Vha19jb3VudCgxKSB7IH0KKyAgICAgIAorICAgICAgdmlydHVhbAorICAgICAgfl9TcF9jb3VudGVkX2Jhc2UoKSBub2V4Y2VwdAorICAgICAgeyB9CisgIAorICAgICAgLy8gQ2FsbGVkIHdoZW4gX01fdXNlX2NvdW50IGRyb3BzIHRvIHplcm8sIHRvIHJlbGVhc2UgdGhlIHJlc291cmNlcworICAgICAgLy8gbWFuYWdlZCBieSAqdGhpcy4KKyAgICAgIHZpcnR1YWwgdm9pZAorICAgICAgX01fZGlzcG9zZSgpIG5vZXhjZXB0ID0gMDsKKyAgICAgIAorICAgICAgLy8gQ2FsbGVkIHdoZW4gX01fd2Vha19jb3VudCBkcm9wcyB0byB6ZXJvLgorICAgICAgdmlydHVhbCB2b2lkCisgICAgICBfTV9kZXN0cm95KCkgbm9leGNlcHQKKyAgICAgIHsgZGVsZXRlIHRoaXM7IH0KKyAgICAgIAorICAgICAgdmlydHVhbCB2b2lkKgorICAgICAgX01fZ2V0X2RlbGV0ZXIoY29uc3Qgc3RkOjp0eXBlX2luZm8mKSA9IDA7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2FkZF9yZWZfY29weSgpCisgICAgICB7IF9fZ251X2N4eDo6X19hdG9taWNfYWRkX2Rpc3BhdGNoKCZfTV91c2VfY291bnQsIDEpOyB9CisgIAorICAgICAgdm9pZAorICAgICAgX01fYWRkX3JlZl9sb2NrKCk7CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX3JlbGVhc2UoKSBub2V4Y2VwdAorICAgICAgeworICAgICAgICAvLyBCZSByYWNlLWRldGVjdG9yLWZyaWVuZGx5LiAgRm9yIG1vcmUgaW5mbyBzZWUgYml0cy9jKytjb25maWcuCisgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0JFRk9SRSgmX01fdXNlX2NvdW50KTsKKwlpZiAoX19nbnVfY3h4OjpfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2goJl9NX3VzZV9jb3VudCwgLTEpID09IDEpCisJICB7CisgICAgICAgICAgICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19BRlRFUigmX01fdXNlX2NvdW50KTsKKwkgICAgX01fZGlzcG9zZSgpOworCSAgICAvLyBUaGVyZSBtdXN0IGJlIGEgbWVtb3J5IGJhcnJpZXIgYmV0d2VlbiBkaXNwb3NlKCkgYW5kIGRlc3Ryb3koKQorCSAgICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgZWZmZWN0cyBvZiBkaXNwb3NlKCkgYXJlIG9ic2VydmVkIGluIHRoZQorCSAgICAvLyB0aHJlYWQgdGhhdCBydW5zIGRlc3Ryb3koKS4KKwkgICAgLy8gU2VlIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9saWJzdGRjKysvMjAwNS0xMS9tc2cwMDEzNi5odG1sCisJICAgIGlmIChfTXV0ZXhfYmFzZTxfTHA+OjpfU19uZWVkX2JhcnJpZXJzKQorCSAgICAgIHsKKwkgICAgICAgIF9HTElCQ1hYX1JFQURfTUVNX0JBUlJJRVI7CisJICAgICAgICBfR0xJQkNYWF9XUklURV9NRU1fQkFSUklFUjsKKwkgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJlIHJhY2UtZGV0ZWN0b3ItZnJpZW5kbHkuICBGb3IgbW9yZSBpbmZvIHNlZSBiaXRzL2MrK2NvbmZpZy4KKyAgICAgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0JFRk9SRSgmX01fd2Vha19jb3VudCk7CisJICAgIGlmIChfX2dudV9jeHg6Ol9fZXhjaGFuZ2VfYW5kX2FkZF9kaXNwYXRjaCgmX01fd2Vha19jb3VudCwKKwkJCQkJCSAgICAgICAtMSkgPT0gMSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0FGVEVSKCZfTV93ZWFrX2NvdW50KTsKKwkgICAgICAgIF9NX2Rlc3Ryb3koKTsKKyAgICAgICAgICAgICAgfQorCSAgfQorICAgICAgfQorICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX3dlYWtfYWRkX3JlZigpIG5vZXhjZXB0CisgICAgICB7IF9fZ251X2N4eDo6X19hdG9taWNfYWRkX2Rpc3BhdGNoKCZfTV93ZWFrX2NvdW50LCAxKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV93ZWFrX3JlbGVhc2UoKSBub2V4Y2VwdAorICAgICAgeworICAgICAgICAvLyBCZSByYWNlLWRldGVjdG9yLWZyaWVuZGx5LiBGb3IgbW9yZSBpbmZvIHNlZSBiaXRzL2MrK2NvbmZpZy4KKyAgICAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQkVGT1JFKCZfTV93ZWFrX2NvdW50KTsKKwlpZiAoX19nbnVfY3h4OjpfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2goJl9NX3dlYWtfY291bnQsIC0xKSA9PSAxKQorCSAgeworICAgICAgICAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQUZURVIoJl9NX3dlYWtfY291bnQpOworCSAgICBpZiAoX011dGV4X2Jhc2U8X0xwPjo6X1NfbmVlZF9iYXJyaWVycykKKwkgICAgICB7CisJICAgICAgICAvLyBTZWUgX01fcmVsZWFzZSgpLAorCSAgICAgICAgLy8gZGVzdHJveSgpIG11c3Qgb2JzZXJ2ZSByZXN1bHRzIG9mIGRpc3Bvc2UoKQorCSAgICAgICAgX0dMSUJDWFhfUkVBRF9NRU1fQkFSUklFUjsKKwkgICAgICAgIF9HTElCQ1hYX1dSSVRFX01FTV9CQVJSSUVSOworCSAgICAgIH0KKwkgICAgX01fZGVzdHJveSgpOworCSAgfQorICAgICAgfQorICAKKyAgICAgIGxvbmcKKyAgICAgIF9NX2dldF91c2VfY291bnQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeworICAgICAgICAvLyBObyBtZW1vcnkgYmFycmllciBpcyB1c2VkIGhlcmUgc28gdGhlcmUgaXMgbm8gc3luY2hyb25pemF0aW9uCisgICAgICAgIC8vIHdpdGggb3RoZXIgdGhyZWFkcy4KKyAgICAgICAgcmV0dXJuIF9fYXRvbWljX2xvYWRfbigmX01fdXNlX2NvdW50LCBfX0FUT01JQ19SRUxBWEVEKTsKKyAgICAgIH0KKworICAgIHByaXZhdGU6ICAKKyAgICAgIF9TcF9jb3VudGVkX2Jhc2UoX1NwX2NvdW50ZWRfYmFzZSBjb25zdCYpID0gZGVsZXRlOworICAgICAgX1NwX2NvdW50ZWRfYmFzZSYgb3BlcmF0b3I9KF9TcF9jb3VudGVkX2Jhc2UgY29uc3QmKSA9IGRlbGV0ZTsKKworICAgICAgX0F0b21pY193b3JkICBfTV91c2VfY291bnQ7ICAgICAvLyAjc2hhcmVkCisgICAgICBfQXRvbWljX3dvcmQgIF9NX3dlYWtfY291bnQ7ICAgIC8vICN3ZWFrICsgKCNzaGFyZWQgIT0gMCkKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9TcF9jb3VudGVkX2Jhc2U8X1Nfc2luZ2xlPjo6CisgICAgX01fYWRkX3JlZl9sb2NrKCkKKyAgICB7CisgICAgICBpZiAoX19nbnVfY3h4OjpfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2goJl9NX3VzZV9jb3VudCwgMSkgPT0gMCkKKwl7CisJICBfTV91c2VfY291bnQgPSAwOworCSAgX190aHJvd19iYWRfd2Vha19wdHIoKTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9TcF9jb3VudGVkX2Jhc2U8X1NfbXV0ZXg+OjoKKyAgICBfTV9hZGRfcmVmX2xvY2soKQorICAgIHsKKyAgICAgIF9fZ251X2N4eDo6X19zY29wZWRfbG9jayBzZW50cnkoKnRoaXMpOworICAgICAgaWYgKF9fZ251X2N4eDo6X19leGNoYW5nZV9hbmRfYWRkX2Rpc3BhdGNoKCZfTV91c2VfY291bnQsIDEpID09IDApCisJeworCSAgX01fdXNlX2NvdW50ID0gMDsKKwkgIF9fdGhyb3dfYmFkX3dlYWtfcHRyKCk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTw+IAorICAgIGlubGluZSB2b2lkCisgICAgX1NwX2NvdW50ZWRfYmFzZTxfU19hdG9taWM+OjoKKyAgICBfTV9hZGRfcmVmX2xvY2soKQorICAgIHsKKyAgICAgIC8vIFBlcmZvcm0gbG9jay1mcmVlIGFkZC1pZi1ub3QtemVybyBvcGVyYXRpb24uCisgICAgICBfQXRvbWljX3dvcmQgX19jb3VudCA9IF9NX2dldF91c2VfY291bnQoKTsKKyAgICAgIGRvCisJeworCSAgaWYgKF9fY291bnQgPT0gMCkKKwkgICAgX190aHJvd19iYWRfd2Vha19wdHIoKTsKKwkgIC8vIFJlcGxhY2UgdGhlIGN1cnJlbnQgY291bnRlciB2YWx1ZSB3aXRoIHRoZSBvbGQgdmFsdWUgKyAxLCBhcworCSAgLy8gbG9uZyBhcyBpdCdzIG5vdCBjaGFuZ2VkIG1lYW53aGlsZS4gCisJfQorICAgICAgd2hpbGUgKCFfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX24oJl9NX3VzZV9jb3VudCwgJl9fY291bnQsIF9fY291bnQgKyAxLAorCQkJCQkgIHRydWUsIF9fQVRPTUlDX0FDUV9SRUwsIAorCQkJCQkgIF9fQVRPTUlDX1JFTEFYRUQpKTsKKyAgICB9CisKKworICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwID0gX19kZWZhdWx0X2xvY2tfcG9saWN5PgorICAgIGNsYXNzIF9fc2hhcmVkX3B0cjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHAgPSBfX2RlZmF1bHRfbG9ja19wb2xpY3k+CisgICAgY2xhc3MgX193ZWFrX3B0cjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHAgPSBfX2RlZmF1bHRfbG9ja19wb2xpY3k+CisgICAgY2xhc3MgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpczsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3Mgc2hhcmVkX3B0cjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3Mgd2Vha19wdHI7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBvd25lcl9sZXNzOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBlbmFibGVfc2hhcmVkX2Zyb21fdGhpczsKKworICB0ZW1wbGF0ZTxfTG9ja19wb2xpY3kgX0xwID0gX19kZWZhdWx0X2xvY2tfcG9saWN5PgorICAgIGNsYXNzIF9fd2Vha19jb3VudDsKKworICB0ZW1wbGF0ZTxfTG9ja19wb2xpY3kgX0xwID0gX19kZWZhdWx0X2xvY2tfcG9saWN5PgorICAgIGNsYXNzIF9fc2hhcmVkX2NvdW50OworCisKKyAgLy8gQ291bnRlZCBwdHIgd2l0aCBubyBkZWxldGVyIG9yIGFsbG9jYXRvciBzdXBwb3J0CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9QdHIsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgY2xhc3MgX1NwX2NvdW50ZWRfcHRyIGZpbmFsIDogcHVibGljIF9TcF9jb3VudGVkX2Jhc2U8X0xwPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdAorICAgICAgX1NwX2NvdW50ZWRfcHRyKF9QdHIgX19wKQorICAgICAgOiBfTV9wdHIoX19wKSB7IH0KKworICAgICAgdmlydHVhbCB2b2lkCisgICAgICBfTV9kaXNwb3NlKCkgbm9leGNlcHQKKyAgICAgIHsgZGVsZXRlIF9NX3B0cjsgfQorCisgICAgICB2aXJ0dWFsIHZvaWQKKyAgICAgIF9NX2Rlc3Ryb3koKSBub2V4Y2VwdAorICAgICAgeyBkZWxldGUgdGhpczsgfQorCisgICAgICB2aXJ0dWFsIHZvaWQqCisgICAgICBfTV9nZXRfZGVsZXRlcihjb25zdCBzdGQ6OnR5cGVfaW5mbyYpCisgICAgICB7IHJldHVybiAwOyB9CisKKyAgICAgIF9TcF9jb3VudGVkX3B0cihjb25zdCBfU3BfY291bnRlZF9wdHImKSA9IGRlbGV0ZTsKKyAgICAgIF9TcF9jb3VudGVkX3B0ciYgb3BlcmF0b3I9KGNvbnN0IF9TcF9jb3VudGVkX3B0ciYpID0gZGVsZXRlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgX1B0ciAgICAgICAgICAgICBfTV9wdHI7ICAvLyBjb3B5IGNvbnN0cnVjdG9yIG11c3Qgbm90IHRocm93CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIHZvaWQKKyAgICBfU3BfY291bnRlZF9wdHI8bnVsbHB0cl90LCBfU19zaW5nbGU+OjpfTV9kaXNwb3NlKCkgbm9leGNlcHQgeyB9CisKKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSB2b2lkCisgICAgX1NwX2NvdW50ZWRfcHRyPG51bGxwdHJfdCwgX1NfbXV0ZXg+OjpfTV9kaXNwb3NlKCkgbm9leGNlcHQgeyB9CisKKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSB2b2lkCisgICAgX1NwX2NvdW50ZWRfcHRyPG51bGxwdHJfdCwgX1NfYXRvbWljPjo6X01fZGlzcG9zZSgpIG5vZXhjZXB0IHsgfQorCisgIC8vIFN1cHBvcnQgZm9yIGN1c3RvbSBkZWxldGVyIGFuZC9vciBhbGxvY2F0b3IKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1B0ciwgdHlwZW5hbWUgX0RlbGV0ZXIsIHR5cGVuYW1lIF9BbGxvYywgX0xvY2tfcG9saWN5IF9McD4KKyAgICBjbGFzcyBfU3BfY291bnRlZF9kZWxldGVyIGZpbmFsIDogcHVibGljIF9TcF9jb3VudGVkX2Jhc2U8X0xwPgorICAgIHsKKyAgICAgIC8vIEhlbHBlciBjbGFzcyB0aGF0IHN0b3JlcyB0aGUgRGVsZXRlciBhbmQgYWxzbyBhY3RzIGFzIGFuIGFsbG9jYXRvci4KKyAgICAgIC8vIFVzZWQgdG8gZGlzcG9zZSBvZiB0aGUgb3duZWQgcG9pbnRlciBhbmQgdGhlIGludGVybmFsIHJlZmNvdW50CisgICAgICAvLyBSZXF1aXJlcyB0aGF0IGNvcGllcyBvZiBfQWxsb2MgY2FuIGZyZWUgZWFjaCBvdGhlcidzIG1lbW9yeS4KKyAgICAgIHN0cnVjdCBfTXlfRGVsZXRlcgorICAgICAgOiBwdWJsaWMgX0FsbG9jICAgICAgICAgICAvLyBjb3B5IGNvbnN0cnVjdG9yIG11c3Qgbm90IHRocm93CisgICAgICB7CisJX0RlbGV0ZXIgX01fZGVsOyAgICAgICAgLy8gY29weSBjb25zdHJ1Y3RvciBtdXN0IG5vdCB0aHJvdworCV9NeV9EZWxldGVyKF9EZWxldGVyIF9fZCwgY29uc3QgX0FsbG9jJiBfX2EpCisJOiBfQWxsb2MoX19hKSwgX01fZGVsKF9fZCkgeyB9CisgICAgICB9OworCisgICAgcHVibGljOgorICAgICAgLy8gX19kKF9fcCkgbXVzdCBub3QgdGhyb3cuCisgICAgICBfU3BfY291bnRlZF9kZWxldGVyKF9QdHIgX19wLCBfRGVsZXRlciBfX2QpCisgICAgICA6IF9NX3B0cihfX3ApLCBfTV9kZWwoX19kLCBfQWxsb2MoKSkgeyB9CisKKyAgICAgIC8vIF9fZChfX3ApIG11c3Qgbm90IHRocm93LgorICAgICAgX1NwX2NvdW50ZWRfZGVsZXRlcihfUHRyIF9fcCwgX0RlbGV0ZXIgX19kLCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICAgIDogX01fcHRyKF9fcCksIF9NX2RlbChfX2QsIF9fYSkgeyB9CisKKyAgICAgIH5fU3BfY291bnRlZF9kZWxldGVyKCkgbm9leGNlcHQgeyB9CisKKyAgICAgIHZpcnR1YWwgdm9pZAorICAgICAgX01fZGlzcG9zZSgpIG5vZXhjZXB0CisgICAgICB7IF9NX2RlbC5fTV9kZWwoX01fcHRyKTsgfQorCisgICAgICB2aXJ0dWFsIHZvaWQKKyAgICAgIF9NX2Rlc3Ryb3koKSBub2V4Y2VwdAorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+Ojp0ZW1wbGF0ZQorCSAgcmViaW5kX3RyYWl0czxfU3BfY291bnRlZF9kZWxldGVyPiBfQWxsb2NfdHJhaXRzOworCXR5cGVuYW1lIF9BbGxvY190cmFpdHM6OmFsbG9jYXRvcl90eXBlIF9fYShfTV9kZWwpOworCV9BbGxvY190cmFpdHM6OmRlc3Ryb3koX19hLCB0aGlzKTsKKwlfQWxsb2NfdHJhaXRzOjpkZWFsbG9jYXRlKF9fYSwgdGhpcywgMSk7CisgICAgICB9CisKKyAgICAgIHZpcnR1YWwgdm9pZCoKKyAgICAgIF9NX2dldF9kZWxldGVyKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiBfX3RpKQorICAgICAgeworI2lmZGVmIF9fR1hYX1JUVEkKKyAgICAgICAgcmV0dXJuIF9fdGkgPT0gdHlwZWlkKF9EZWxldGVyKSA/ICZfTV9kZWwuX01fZGVsIDogMDsKKyNlbHNlCisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfUHRyICAgICAgICAgICAgIF9NX3B0cjsgIC8vIGNvcHkgY29uc3RydWN0b3IgbXVzdCBub3QgdGhyb3cKKyAgICAgIF9NeV9EZWxldGVyICAgICAgX01fZGVsOyAgLy8gY29weSBjb25zdHJ1Y3RvciBtdXN0IG5vdCB0aHJvdworICAgIH07CisKKyAgLy8gaGVscGVycyBmb3IgbWFrZV9zaGFyZWQgLyBhbGxvY2F0ZV9zaGFyZWQKKworICBzdHJ1Y3QgX1NwX21ha2Vfc2hhcmVkX3RhZyB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2MsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgY2xhc3MgX1NwX2NvdW50ZWRfcHRyX2lucGxhY2UgZmluYWwgOiBwdWJsaWMgX1NwX2NvdW50ZWRfYmFzZTxfTHA+CisgICAgeworICAgICAgLy8gSGVscGVyIGNsYXNzIHRoYXQgc3RvcmVzIHRoZSBwb2ludGVyIGFuZCBhbHNvIGFjdHMgYXMgYW4gYWxsb2NhdG9yLgorICAgICAgLy8gVXNlZCB0byBkaXNwb3NlIG9mIHRoZSBvd25lZCBwb2ludGVyIGFuZCB0aGUgaW50ZXJuYWwgcmVmY291bnQKKyAgICAgIC8vIFJlcXVpcmVzIHRoYXQgY29waWVzIG9mIF9BbGxvYyBjYW4gZnJlZSBlYWNoIG90aGVyJ3MgbWVtb3J5LgorICAgICAgc3RydWN0IF9JbXBsCisgICAgICA6IHB1YmxpYyBfQWxsb2MgICAgICAgICAgIC8vIGNvcHkgY29uc3RydWN0b3IgbXVzdCBub3QgdGhyb3cKKyAgICAgIHsKKwlfSW1wbChfQWxsb2MgX19hKSA6IF9BbGxvYyhfX2EpLCBfTV9wdHIoKSB7IH0KKwlfVHAqIF9NX3B0cjsKKyAgICAgIH07CisKKyAgICBwdWJsaWM6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlfU3BfY291bnRlZF9wdHJfaW5wbGFjZShfQWxsb2MgX19hLCBfQXJncyYmLi4uIF9fYXJncykKKwk6IF9NX2ltcGwoX19hKQorCXsKKwkgIF9NX2ltcGwuX01fcHRyID0gc3RhdGljX2Nhc3Q8X1RwKj4oc3RhdGljX2Nhc3Q8dm9pZCo+KCZfTV9zdG9yYWdlKSk7CisJICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAvLyAyMDcwLiAgYWxsb2NhdGVfc2hhcmVkIHNob3VsZCB1c2UgYWxsb2NhdG9yX3RyYWl0czxBPjo6Y29uc3RydWN0CisJICBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz46OmNvbnN0cnVjdChfX2EsIF9NX2ltcGwuX01fcHRyLAorCSAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IC8vIG1pZ2h0IHRocm93CisJfQorCisgICAgICB+X1NwX2NvdW50ZWRfcHRyX2lucGxhY2UoKSBub2V4Y2VwdCB7IH0KKworICAgICAgdmlydHVhbCB2b2lkCisgICAgICBfTV9kaXNwb3NlKCkgbm9leGNlcHQKKyAgICAgIHsgYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+OjpkZXN0cm95KF9NX2ltcGwsIF9NX2ltcGwuX01fcHRyKTsgfQorCisgICAgICAvLyBPdmVycmlkZSBiZWNhdXNlIHRoZSBhbGxvY2F0b3IgbmVlZHMgdG8ga25vdyB0aGUgZHluYW1pYyB0eXBlCisgICAgICB2aXJ0dWFsIHZvaWQKKyAgICAgIF9NX2Rlc3Ryb3koKSBub2V4Y2VwdAorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+Ojp0ZW1wbGF0ZQorCSAgcmViaW5kX3RyYWl0czxfU3BfY291bnRlZF9wdHJfaW5wbGFjZT4gX0FsbG9jX3RyYWl0czsKKwl0eXBlbmFtZSBfQWxsb2NfdHJhaXRzOjphbGxvY2F0b3JfdHlwZSBfX2EoX01faW1wbCk7CisJX0FsbG9jX3RyYWl0czo6ZGVzdHJveShfX2EsIHRoaXMpOworCV9BbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoX19hLCB0aGlzLCAxKTsKKyAgICAgIH0KKworICAgICAgLy8gU25lYWt5IHRyaWNrIHNvIF9fc2hhcmVkX3B0ciBjYW4gZ2V0IHRoZSBtYW5hZ2VkIHBvaW50ZXIKKyAgICAgIHZpcnR1YWwgdm9pZCoKKyAgICAgIF9NX2dldF9kZWxldGVyKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiBfX3RpKSBub2V4Y2VwdAorICAgICAgeworI2lmZGVmIF9fR1hYX1JUVEkKKwlyZXR1cm4gX190aSA9PSB0eXBlaWQoX1NwX21ha2Vfc2hhcmVkX3RhZykKKwkgICAgICAgPyBzdGF0aWNfY2FzdDx2b2lkKj4oJl9NX3N0b3JhZ2UpCisJICAgICAgIDogMDsKKyNlbHNlCisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgX0ltcGwgX01faW1wbDsKKyAgICAgIHR5cGVuYW1lIGFsaWduZWRfc3RvcmFnZTxzaXplb2YoX1RwKSwgYWxpZ25tZW50X29mPF9UcD46OnZhbHVlPjo6dHlwZQorCV9NX3N0b3JhZ2U7CisgICAgfTsKKworICB0ZW1wbGF0ZTxfTG9ja19wb2xpY3kgX0xwPgorICAgIGNsYXNzIF9fc2hhcmVkX2NvdW50CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIGNvbnN0ZXhwciBfX3NoYXJlZF9jb3VudCgpIG5vZXhjZXB0IDogX01fcGkoMCkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHRyPgorICAgICAgICBleHBsaWNpdAorCV9fc2hhcmVkX2NvdW50KF9QdHIgX19wKSA6IF9NX3BpKDApCisJeworCSAgX190cnkKKwkgICAgeworCSAgICAgIF9NX3BpID0gbmV3IF9TcF9jb3VudGVkX3B0cjxfUHRyLCBfTHA+KF9fcCk7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgZGVsZXRlIF9fcDsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1B0ciwgdHlwZW5hbWUgX0RlbGV0ZXI+CisJX19zaGFyZWRfY291bnQoX1B0ciBfX3AsIF9EZWxldGVyIF9fZCkKKwk6IF9fc2hhcmVkX2NvdW50KF9fcCwgc3RkOjptb3ZlKF9fZCksIGFsbG9jYXRvcjxpbnQ+KCkpCisJeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QdHIsIHR5cGVuYW1lIF9EZWxldGVyLCB0eXBlbmFtZSBfQWxsb2M+CisJX19zaGFyZWRfY291bnQoX1B0ciBfX3AsIF9EZWxldGVyIF9fZCwgX0FsbG9jIF9fYSkgOiBfTV9waSgwKQorCXsKKwkgIHR5cGVkZWYgX1NwX2NvdW50ZWRfZGVsZXRlcjxfUHRyLCBfRGVsZXRlciwgX0FsbG9jLCBfTHA+IF9TcF9jZF90eXBlOworCSAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz46OnRlbXBsYXRlCisJICAgIHJlYmluZF90cmFpdHM8X1NwX2NkX3R5cGU+IF9BbGxvY190cmFpdHM7CisJICB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzOjphbGxvY2F0b3JfdHlwZSBfX2EyKF9fYSk7CisJICBfU3BfY2RfdHlwZSogX19tZW0gPSAwOworCSAgX190cnkKKwkgICAgeworCSAgICAgIF9fbWVtID0gX0FsbG9jX3RyYWl0czo6YWxsb2NhdGUoX19hMiwgMSk7CisJICAgICAgX0FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYTIsIF9fbWVtLAorCQkgIF9fcCwgc3RkOjptb3ZlKF9fZCksIHN0ZDo6bW92ZShfX2EpKTsKKwkgICAgICBfTV9waSA9IF9fbWVtOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIF9fZChfX3ApOyAvLyBDYWxsIF9EZWxldGVyIG9uIF9fcC4KKwkgICAgICBpZiAoX19tZW0pCisJICAgICAgICBfQWxsb2NfdHJhaXRzOjpkZWFsbG9jYXRlKF9fYTIsIF9fbWVtLCAxKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lLi4uIF9BcmdzPgorCV9fc2hhcmVkX2NvdW50KF9TcF9tYWtlX3NoYXJlZF90YWcsIF9UcCosIGNvbnN0IF9BbGxvYyYgX19hLAorCQkgICAgICAgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJOiBfTV9waSgwKQorCXsKKwkgIHR5cGVkZWYgX1NwX2NvdW50ZWRfcHRyX2lucGxhY2U8X1RwLCBfQWxsb2MsIF9McD4gX1NwX2NwX3R5cGU7CisJICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPjo6dGVtcGxhdGUKKwkgICAgcmViaW5kX3RyYWl0czxfU3BfY3BfdHlwZT4gX0FsbG9jX3RyYWl0czsKKwkgIHR5cGVuYW1lIF9BbGxvY190cmFpdHM6OmFsbG9jYXRvcl90eXBlIF9fYTIoX19hKTsKKwkgIF9TcF9jcF90eXBlKiBfX21lbSA9IF9BbGxvY190cmFpdHM6OmFsbG9jYXRlKF9fYTIsIDEpOworCSAgX190cnkKKwkgICAgeworCSAgICAgIF9BbGxvY190cmFpdHM6OmNvbnN0cnVjdChfX2EyLCBfX21lbSwgc3RkOjptb3ZlKF9fYSksCisJCSAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgICAgIF9NX3BpID0gX19tZW07CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgX0FsbG9jX3RyYWl0czo6ZGVhbGxvY2F0ZShfX2EyLCBfX21lbSwgMSk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwl9CisKKyNpZiBfR0xJQkNYWF9VU0VfREVQUkVDQVRFRAorICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBhdXRvX3B0cjxfVHA+IHRvIHByb3ZpZGUgdGhlIHN0cm9uZyBndWFyYW50ZWUuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIGV4cGxpY2l0CisJX19zaGFyZWRfY291bnQoc3RkOjphdXRvX3B0cjxfVHA+JiYgX19yKTsKKyNlbmRpZgorCisgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHVuaXF1ZV9wdHI8X1RwLF9EZWw+IHRvIHByb3ZpZGUgdGhlIHN0cm9uZyBndWFyYW50ZWUuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EZWw+CisgICAgICAgIGV4cGxpY2l0CisJX19zaGFyZWRfY291bnQoc3RkOjp1bmlxdWVfcHRyPF9UcCwgX0RlbD4mJiBfX3IpIDogX01fcGkoMCkKKwl7CisJICB1c2luZyBfUHRyID0gdHlwZW5hbWUgdW5pcXVlX3B0cjxfVHAsIF9EZWw+Ojpwb2ludGVyOworCSAgdXNpbmcgX0RlbDIgPSB0eXBlbmFtZSBjb25kaXRpb25hbDxpc19yZWZlcmVuY2U8X0RlbD46OnZhbHVlLAorCSAgICAgIHJlZmVyZW5jZV93cmFwcGVyPHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X0RlbD46OnR5cGU+LAorCSAgICAgIF9EZWw+Ojp0eXBlOworCSAgdXNpbmcgX1NwX2NkX3R5cGUKKwkgICAgPSBfU3BfY291bnRlZF9kZWxldGVyPF9QdHIsIF9EZWwyLCBhbGxvY2F0b3I8dm9pZD4sIF9McD47CisJICB1c2luZyBfQWxsb2MgPSBhbGxvY2F0b3I8X1NwX2NkX3R5cGU+OworCSAgdXNpbmcgX0FsbG9jX3RyYWl0cyA9IGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPjsKKwkgIF9BbGxvYyBfX2E7CisJICBfU3BfY2RfdHlwZSogX19tZW0gPSBfQWxsb2NfdHJhaXRzOjphbGxvY2F0ZShfX2EsIDEpOworCSAgX0FsbG9jX3RyYWl0czo6Y29uc3RydWN0KF9fYSwgX19tZW0sIF9fci5yZWxlYXNlKCksCisJCQkJICAgX19yLmdldF9kZWxldGVyKCkpOyAgLy8gbm9uLXRocm93aW5nCisJICBfTV9waSA9IF9fbWVtOworCX0KKworICAgICAgLy8gVGhyb3cgYmFkX3dlYWtfcHRyIHdoZW4gX19yLl9NX2dldF91c2VfY291bnQoKSA9PSAwLgorICAgICAgZXhwbGljaXQgX19zaGFyZWRfY291bnQoY29uc3QgX193ZWFrX2NvdW50PF9McD4mIF9fcik7CisKKyAgICAgIH5fX3NoYXJlZF9jb3VudCgpIG5vZXhjZXB0CisgICAgICB7CisJaWYgKF9NX3BpICE9IG51bGxwdHIpCisJICBfTV9waS0+X01fcmVsZWFzZSgpOworICAgICAgfQorCisgICAgICBfX3NoYXJlZF9jb3VudChjb25zdCBfX3NoYXJlZF9jb3VudCYgX19yKSBub2V4Y2VwdAorICAgICAgOiBfTV9waShfX3IuX01fcGkpCisgICAgICB7CisJaWYgKF9NX3BpICE9IDApCisJICBfTV9waS0+X01fYWRkX3JlZl9jb3B5KCk7CisgICAgICB9CisKKyAgICAgIF9fc2hhcmVkX2NvdW50JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9fc2hhcmVkX2NvdW50JiBfX3IpIG5vZXhjZXB0CisgICAgICB7CisJX1NwX2NvdW50ZWRfYmFzZTxfTHA+KiBfX3RtcCA9IF9fci5fTV9waTsKKwlpZiAoX190bXAgIT0gX01fcGkpCisJICB7CisJICAgIGlmIChfX3RtcCAhPSAwKQorCSAgICAgIF9fdG1wLT5fTV9hZGRfcmVmX2NvcHkoKTsKKwkgICAgaWYgKF9NX3BpICE9IDApCisJICAgICAgX01fcGktPl9NX3JlbGVhc2UoKTsKKwkgICAgX01fcGkgPSBfX3RtcDsKKwkgIH0KKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N3YXAoX19zaGFyZWRfY291bnQmIF9fcikgbm9leGNlcHQKKyAgICAgIHsKKwlfU3BfY291bnRlZF9iYXNlPF9McD4qIF9fdG1wID0gX19yLl9NX3BpOworCV9fci5fTV9waSA9IF9NX3BpOworCV9NX3BpID0gX190bXA7CisgICAgICB9CisKKyAgICAgIGxvbmcKKyAgICAgIF9NX2dldF91c2VfY291bnQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fcGkgIT0gMCA/IF9NX3BpLT5fTV9nZXRfdXNlX2NvdW50KCkgOiAwOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX3VuaXF1ZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9nZXRfdXNlX2NvdW50KCkgPT0gMTsgfQorCisgICAgICB2b2lkKgorICAgICAgX01fZ2V0X2RlbGV0ZXIoY29uc3Qgc3RkOjp0eXBlX2luZm8mIF9fdGkpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9waSA/IF9NX3BpLT5fTV9nZXRfZGVsZXRlcihfX3RpKSA6IDA7IH0KKworICAgICAgYm9vbAorICAgICAgX01fbGVzcyhjb25zdCBfX3NoYXJlZF9jb3VudCYgX19yaHMpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Omxlc3M8X1NwX2NvdW50ZWRfYmFzZTxfTHA+Kj4oKSh0aGlzLT5fTV9waSwgX19yaHMuX01fcGkpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2xlc3MoY29uc3QgX193ZWFrX2NvdW50PF9McD4mIF9fcmhzKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpsZXNzPF9TcF9jb3VudGVkX2Jhc2U8X0xwPio+KCkodGhpcy0+X01fcGksIF9fcmhzLl9NX3BpKTsgfQorCisgICAgICAvLyBGcmllbmQgZnVuY3Rpb24gaW5qZWN0ZWQgaW50byBlbmNsb3NpbmcgbmFtZXNwYWNlIGFuZCBmb3VuZCBieSBBREwKKyAgICAgIGZyaWVuZCBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBfX3NoYXJlZF9jb3VudCYgX19hLCBjb25zdCBfX3NoYXJlZF9jb3VudCYgX19iKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19hLl9NX3BpID09IF9fYi5fTV9waTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGZyaWVuZCBjbGFzcyBfX3dlYWtfY291bnQ8X0xwPjsKKworICAgICAgX1NwX2NvdW50ZWRfYmFzZTxfTHA+KiAgX01fcGk7CisgICAgfTsKKworCisgIHRlbXBsYXRlPF9Mb2NrX3BvbGljeSBfTHA+CisgICAgY2xhc3MgX193ZWFrX2NvdW50CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIGNvbnN0ZXhwciBfX3dlYWtfY291bnQoKSBub2V4Y2VwdCA6IF9NX3BpKDApCisgICAgICB7IH0KKworICAgICAgX193ZWFrX2NvdW50KGNvbnN0IF9fc2hhcmVkX2NvdW50PF9McD4mIF9fcikgbm9leGNlcHQKKyAgICAgIDogX01fcGkoX19yLl9NX3BpKQorICAgICAgeworCWlmIChfTV9waSAhPSAwKQorCSAgX01fcGktPl9NX3dlYWtfYWRkX3JlZigpOworICAgICAgfQorCisgICAgICBfX3dlYWtfY291bnQoY29uc3QgX193ZWFrX2NvdW50PF9McD4mIF9fcikgbm9leGNlcHQKKyAgICAgIDogX01fcGkoX19yLl9NX3BpKQorICAgICAgeworCWlmIChfTV9waSAhPSAwKQorCSAgX01fcGktPl9NX3dlYWtfYWRkX3JlZigpOworICAgICAgfQorCisgICAgICB+X193ZWFrX2NvdW50KCkgbm9leGNlcHQKKyAgICAgIHsKKwlpZiAoX01fcGkgIT0gMCkKKwkgIF9NX3BpLT5fTV93ZWFrX3JlbGVhc2UoKTsKKyAgICAgIH0KKworICAgICAgX193ZWFrX2NvdW50PF9McD4mCisgICAgICBvcGVyYXRvcj0oY29uc3QgX19zaGFyZWRfY291bnQ8X0xwPiYgX19yKSBub2V4Y2VwdAorICAgICAgeworCV9TcF9jb3VudGVkX2Jhc2U8X0xwPiogX190bXAgPSBfX3IuX01fcGk7CisJaWYgKF9fdG1wICE9IDApCisJICBfX3RtcC0+X01fd2Vha19hZGRfcmVmKCk7CisJaWYgKF9NX3BpICE9IDApCisJICBfTV9waS0+X01fd2Vha19yZWxlYXNlKCk7CisJX01fcGkgPSBfX3RtcDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9fd2Vha19jb3VudDxfTHA+JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9fd2Vha19jb3VudDxfTHA+JiBfX3IpIG5vZXhjZXB0CisgICAgICB7CisJX1NwX2NvdW50ZWRfYmFzZTxfTHA+KiBfX3RtcCA9IF9fci5fTV9waTsKKwlpZiAoX190bXAgIT0gMCkKKwkgIF9fdG1wLT5fTV93ZWFrX2FkZF9yZWYoKTsKKwlpZiAoX01fcGkgIT0gMCkKKwkgIF9NX3BpLT5fTV93ZWFrX3JlbGVhc2UoKTsKKwlfTV9waSA9IF9fdG1wOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fc3dhcChfX3dlYWtfY291bnQ8X0xwPiYgX19yKSBub2V4Y2VwdAorICAgICAgeworCV9TcF9jb3VudGVkX2Jhc2U8X0xwPiogX190bXAgPSBfX3IuX01fcGk7CisJX19yLl9NX3BpID0gX01fcGk7CisJX01fcGkgPSBfX3RtcDsKKyAgICAgIH0KKworICAgICAgbG9uZworICAgICAgX01fZ2V0X3VzZV9jb3VudCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9waSAhPSAwID8gX01fcGktPl9NX2dldF91c2VfY291bnQoKSA6IDA7IH0KKworICAgICAgYm9vbAorICAgICAgX01fbGVzcyhjb25zdCBfX3dlYWtfY291bnQmIF9fcmhzKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpsZXNzPF9TcF9jb3VudGVkX2Jhc2U8X0xwPio+KCkodGhpcy0+X01fcGksIF9fcmhzLl9NX3BpKTsgfQorCisgICAgICBib29sCisgICAgICBfTV9sZXNzKGNvbnN0IF9fc2hhcmVkX2NvdW50PF9McD4mIF9fcmhzKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpsZXNzPF9TcF9jb3VudGVkX2Jhc2U8X0xwPio+KCkodGhpcy0+X01fcGksIF9fcmhzLl9NX3BpKTsgfQorCisgICAgICAvLyBGcmllbmQgZnVuY3Rpb24gaW5qZWN0ZWQgaW50byBlbmNsb3NpbmcgbmFtZXNwYWNlIGFuZCBmb3VuZCBieSBBREwKKyAgICAgIGZyaWVuZCBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBfX3dlYWtfY291bnQmIF9fYSwgY29uc3QgX193ZWFrX2NvdW50JiBfX2IpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2EuX01fcGkgPT0gX19iLl9NX3BpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgZnJpZW5kIGNsYXNzIF9fc2hhcmVkX2NvdW50PF9McD47CisKKyAgICAgIF9TcF9jb3VudGVkX2Jhc2U8X0xwPiogIF9NX3BpOworICAgIH07CisKKyAgLy8gTm93IHRoYXQgX193ZWFrX2NvdW50IGlzIGRlZmluZWQgd2UgY2FuIGRlZmluZSB0aGlzIGNvbnN0cnVjdG9yOgorICB0ZW1wbGF0ZTxfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBfX3NoYXJlZF9jb3VudDxfTHA+OjogX19zaGFyZWRfY291bnQoY29uc3QgX193ZWFrX2NvdW50PF9McD4mIF9fcikKKyAgICA6IF9NX3BpKF9fci5fTV9waSkKKyAgICB7CisgICAgICBpZiAoX01fcGkgIT0gMCkKKwlfTV9waS0+X01fYWRkX3JlZl9sb2NrKCk7CisgICAgICBlbHNlCisJX190aHJvd19iYWRfd2Vha19wdHIoKTsKKyAgICB9CisKKworICAvLyBTdXBwb3J0IGZvciBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcy4KKworICAvLyBGcmllbmQgb2YgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcy4KKyAgdGVtcGxhdGU8X0xvY2tfcG9saWN5IF9McCwgdHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICB2b2lkCisgICAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoY29uc3QgX19zaGFyZWRfY291bnQ8X0xwPiYsCisJCQkJICAgICBjb25zdCBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzPF9UcDEsCisJCQkJICAgICBfTHA+KiwgY29uc3QgX1RwMiopIG5vZXhjZXB0OworCisgIC8vIEZyaWVuZCBvZiBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICB2b2lkCisgICAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoY29uc3QgX19zaGFyZWRfY291bnQ8PiYsCisJCQkJICAgICBjb25zdCBlbmFibGVfc2hhcmVkX2Zyb21fdGhpczxfVHAxPiosCisJCQkJICAgICBjb25zdCBfVHAyKikgbm9leGNlcHQ7CisKKyAgdGVtcGxhdGU8X0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXNfaGVscGVyKGNvbnN0IF9fc2hhcmVkX2NvdW50PF9McD4mLCAuLi4pIG5vZXhjZXB0CisgICAgeyB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgY2xhc3MgX19zaGFyZWRfcHRyCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwICAgZWxlbWVudF90eXBlOworCisgICAgICBjb25zdGV4cHIgX19zaGFyZWRfcHRyKCkgbm9leGNlcHQKKyAgICAgIDogX01fcHRyKDApLCBfTV9yZWZjb3VudCgpCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlleHBsaWNpdCBfX3NoYXJlZF9wdHIoX1RwMSogX19wKQorICAgICAgICA6IF9NX3B0cihfX3ApLCBfTV9yZWZjb3VudChfX3ApCisJeworCSAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Db252ZXJ0aWJsZUNvbmNlcHQ8X1RwMSosIF9UcCo+KQorCSAgc3RhdGljX2Fzc2VydCggc2l6ZW9mKF9UcDEpID4gMCwgImluY29tcGxldGUgdHlwZSIgKTsKKwkgIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXNfaGVscGVyKF9NX3JlZmNvdW50LCBfX3AsIF9fcCk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfRGVsZXRlcj4KKwlfX3NoYXJlZF9wdHIoX1RwMSogX19wLCBfRGVsZXRlciBfX2QpCisJOiBfTV9wdHIoX19wKSwgX01fcmVmY291bnQoX19wLCBfX2QpCisJeworCSAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Db252ZXJ0aWJsZUNvbmNlcHQ8X1RwMSosIF9UcCo+KQorCSAgLy8gVE9ETyByZXF1aXJlcyBfRGVsZXRlciBDb3B5Q29uc3RydWN0aWJsZSBhbmQgX19kKF9fcCkgd2VsbC1mb3JtZWQKKwkgIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXNfaGVscGVyKF9NX3JlZmNvdW50LCBfX3AsIF9fcCk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfRGVsZXRlciwgdHlwZW5hbWUgX0FsbG9jPgorCV9fc2hhcmVkX3B0cihfVHAxKiBfX3AsIF9EZWxldGVyIF9fZCwgX0FsbG9jIF9fYSkKKwk6IF9NX3B0cihfX3ApLCBfTV9yZWZjb3VudChfX3AsIF9fZCwgc3RkOjptb3ZlKF9fYSkpCisJeworCSAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Db252ZXJ0aWJsZUNvbmNlcHQ8X1RwMSosIF9UcCo+KQorCSAgLy8gVE9ETyByZXF1aXJlcyBfRGVsZXRlciBDb3B5Q29uc3RydWN0aWJsZSBhbmQgX19kKF9fcCkgd2VsbC1mb3JtZWQKKwkgIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXNfaGVscGVyKF9NX3JlZmNvdW50LCBfX3AsIF9fcCk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRGVsZXRlcj4KKwlfX3NoYXJlZF9wdHIobnVsbHB0cl90IF9fcCwgX0RlbGV0ZXIgX19kKQorCTogX01fcHRyKDApLCBfTV9yZWZjb3VudChfX3AsIF9fZCkKKwl7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0RlbGV0ZXIsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgICAgX19zaGFyZWRfcHRyKG51bGxwdHJfdCBfX3AsIF9EZWxldGVyIF9fZCwgX0FsbG9jIF9fYSkKKwk6IF9NX3B0cigwKSwgX01fcmVmY291bnQoX19wLCBfX2QsIHN0ZDo6bW92ZShfX2EpKQorCXsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCV9fc2hhcmVkX3B0cihjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yLCBfVHAqIF9fcCkgbm9leGNlcHQKKwk6IF9NX3B0cihfX3ApLCBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpIC8vIG5ldmVyIHRocm93cworCXsgfQorCisgICAgICBfX3NoYXJlZF9wdHIoY29uc3QgX19zaGFyZWRfcHRyJikgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgX19zaGFyZWRfcHRyJiBvcGVyYXRvcj0oY29uc3QgX19zaGFyZWRfcHRyJikgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgfl9fc2hhcmVkX3B0cigpID0gZGVmYXVsdDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPF9UcDEqLCBfVHAqPjo6dmFsdWU+Ojp0eXBlPgorCV9fc2hhcmVkX3B0cihjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yKSBub2V4Y2VwdAorCTogX01fcHRyKF9fci5fTV9wdHIpLCBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpCisJeyB9CisKKyAgICAgIF9fc2hhcmVkX3B0cihfX3NoYXJlZF9wdHImJiBfX3IpIG5vZXhjZXB0CisgICAgICA6IF9NX3B0cihfX3IuX01fcHRyKSwgX01fcmVmY291bnQoKQorICAgICAgeworCV9NX3JlZmNvdW50Ll9NX3N3YXAoX19yLl9NX3JlZmNvdW50KTsKKwlfX3IuX01fcHRyID0gMDsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPF9UcDEqLCBfVHAqPjo6dmFsdWU+Ojp0eXBlPgorCV9fc2hhcmVkX3B0cihfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYmIF9fcikgbm9leGNlcHQKKwk6IF9NX3B0cihfX3IuX01fcHRyKSwgX01fcmVmY291bnQoKQorCXsKKwkgIF9NX3JlZmNvdW50Ll9NX3N3YXAoX19yLl9NX3JlZmNvdW50KTsKKwkgIF9fci5fTV9wdHIgPSAwOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlleHBsaWNpdCBfX3NoYXJlZF9wdHIoY29uc3QgX193ZWFrX3B0cjxfVHAxLCBfTHA+JiBfX3IpCisJOiBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpIC8vIG1heSB0aHJvdworCXsKKwkgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9UcDEqLCBfVHAqPikKKworCSAgLy8gSXQgaXMgbm93IHNhZmUgdG8gY29weSBfX3IuX01fcHRyLCBhcworCSAgLy8gX01fcmVmY291bnQoX19yLl9NX3JlZmNvdW50KSBkaWQgbm90IHRocm93LgorCSAgX01fcHRyID0gX19yLl9NX3B0cjsKKwl9CisKKyAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gdGhpcyBjb25zdHJ1Y3RvciBoYXMgbm8gZWZmZWN0LgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX0RlbD4KKwlfX3NoYXJlZF9wdHIoc3RkOjp1bmlxdWVfcHRyPF9UcDEsIF9EZWw+JiYgX19yKQorCTogX01fcHRyKF9fci5nZXQoKSksIF9NX3JlZmNvdW50KCkKKwl7CisJICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVHAxKiwgX1RwKj4pCisJICBhdXRvIF9fdG1wID0gX19yLmdldCgpOworCSAgX01fcmVmY291bnQgPSBfX3NoYXJlZF9jb3VudDxfTHA+KHN0ZDo6bW92ZShfX3IpKTsKKwkgIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXNfaGVscGVyKF9NX3JlZmNvdW50LCBfX3RtcCwgX190bXApOworCX0KKworI2lmIF9HTElCQ1hYX1VTRV9ERVBSRUNBVEVECisgICAgICAvLyBQb3N0Y29uZGl0aW9uOiB1c2VfY291bnQoKSA9PSAxIGFuZCBfX3IuZ2V0KCkgPT0gMAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlfX3NoYXJlZF9wdHIoc3RkOjphdXRvX3B0cjxfVHAxPiYmIF9fcik7CisjZW5kaWYKKworICAgICAgLyogVE9ETzogdXNlIGRlbGVnYXRpbmcgY29uc3RydWN0b3IgKi8KKyAgICAgIGNvbnN0ZXhwciBfX3NoYXJlZF9wdHIobnVsbHB0cl90KSBub2V4Y2VwdAorICAgICAgOiBfTV9wdHIoMCksIF9NX3JlZmNvdW50KCkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCV9fc2hhcmVkX3B0ciYKKwlvcGVyYXRvcj0oY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fcikgbm9leGNlcHQKKwl7CisJICBfTV9wdHIgPSBfX3IuX01fcHRyOworCSAgX01fcmVmY291bnQgPSBfX3IuX01fcmVmY291bnQ7IC8vIF9fc2hhcmVkX2NvdW50OjpvcD0gZG9lc24ndCB0aHJvdworCSAgcmV0dXJuICp0aGlzOworCX0KKworI2lmIF9HTElCQ1hYX1VTRV9ERVBSRUNBVEVECisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCV9fc2hhcmVkX3B0ciYKKwlvcGVyYXRvcj0oc3RkOjphdXRvX3B0cjxfVHAxPiYmIF9fcikKKwl7CisJICBfX3NoYXJlZF9wdHIoc3RkOjptb3ZlKF9fcikpLnN3YXAoKnRoaXMpOworCSAgcmV0dXJuICp0aGlzOworCX0KKyNlbmRpZgorCisgICAgICBfX3NoYXJlZF9wdHImCisgICAgICBvcGVyYXRvcj0oX19zaGFyZWRfcHRyJiYgX19yKSBub2V4Y2VwdAorICAgICAgeworCV9fc2hhcmVkX3B0cihzdGQ6Om1vdmUoX19yKSkuc3dhcCgqdGhpcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVHAxPgorCV9fc2hhcmVkX3B0ciYKKwlvcGVyYXRvcj0oX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mJiBfX3IpIG5vZXhjZXB0CisJeworCSAgX19zaGFyZWRfcHRyKHN0ZDo6bW92ZShfX3IpKS5zd2FwKCp0aGlzKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9EZWw+CisJX19zaGFyZWRfcHRyJgorCW9wZXJhdG9yPShzdGQ6OnVuaXF1ZV9wdHI8X1RwMSwgX0RlbD4mJiBfX3IpCisJeworCSAgX19zaGFyZWRfcHRyKHN0ZDo6bW92ZShfX3IpKS5zd2FwKCp0aGlzKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkgbm9leGNlcHQKKyAgICAgIHsgX19zaGFyZWRfcHRyKCkuc3dhcCgqdGhpcyk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwl2b2lkCisJcmVzZXQoX1RwMSogX19wKSAvLyBfVHAxIG11c3QgYmUgY29tcGxldGUuCisJeworCSAgLy8gQ2F0Y2ggc2VsZi1yZXNldCBlcnJvcnMuCisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX19wID09IDAgfHwgX19wICE9IF9NX3B0cik7CisJICBfX3NoYXJlZF9wdHIoX19wKS5zd2FwKCp0aGlzKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9EZWxldGVyPgorCXZvaWQKKwlyZXNldChfVHAxKiBfX3AsIF9EZWxldGVyIF9fZCkKKwl7IF9fc2hhcmVkX3B0cihfX3AsIF9fZCkuc3dhcCgqdGhpcyk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX0RlbGV0ZXIsIHR5cGVuYW1lIF9BbGxvYz4KKwl2b2lkCisgICAgICAgIHJlc2V0KF9UcDEqIF9fcCwgX0RlbGV0ZXIgX19kLCBfQWxsb2MgX19hKQorICAgICAgICB7IF9fc2hhcmVkX3B0cihfX3AsIF9fZCwgc3RkOjptb3ZlKF9fYSkpLnN3YXAoKnRoaXMpOyB9CisKKyAgICAgIC8vIEFsbG93IGNsYXNzIGluc3RhbnRpYXRpb24gd2hlbiBfVHAgaXMgW2N2LXF1YWxdIHZvaWQuCisgICAgICB0eXBlbmFtZSBzdGQ6OmFkZF9sdmFsdWVfcmVmZXJlbmNlPF9UcD46OnR5cGUKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX3B0ciAhPSAwKTsKKwlyZXR1cm4gKl9NX3B0cjsKKyAgICAgIH0KKworICAgICAgX1RwKgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX3B0ciAhPSAwKTsKKwlyZXR1cm4gX01fcHRyOworICAgICAgfQorCisgICAgICBfVHAqCisgICAgICBnZXQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fcHRyOyB9CisKKyAgICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsgcmV0dXJuIF9NX3B0ciA9PSAwID8gZmFsc2UgOiB0cnVlOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIHVuaXF1ZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9yZWZjb3VudC5fTV91bmlxdWUoKTsgfQorCisgICAgICBsb25nCisgICAgICB1c2VfY291bnQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fcmVmY291bnQuX01fZ2V0X3VzZV9jb3VudCgpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19vdGhlcikgbm9leGNlcHQKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fcHRyLCBfX290aGVyLl9NX3B0cik7CisJX01fcmVmY291bnQuX01fc3dhcChfX290aGVyLl9NX3JlZmNvdW50KTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlib29sCisJb3duZXJfYmVmb3JlKF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+IGNvbnN0JiBfX3JocykgY29uc3QKKwl7IHJldHVybiBfTV9yZWZjb3VudC5fTV9sZXNzKF9fcmhzLl9NX3JlZmNvdW50KTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCWJvb2wKKwlvd25lcl9iZWZvcmUoX193ZWFrX3B0cjxfVHAxLCBfTHA+IGNvbnN0JiBfX3JocykgY29uc3QKKwl7IHJldHVybiBfTV9yZWZjb3VudC5fTV9sZXNzKF9fcmhzLl9NX3JlZmNvdW50KTsgfQorCisjaWZkZWYgX19HWFhfUlRUSQorICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIFRoaXMgY29uc3RydWN0b3IgaXMgbm9uLXN0YW5kYXJkLCBpdCBpcyB1c2VkIGJ5IGFsbG9jYXRlX3NoYXJlZC4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUuLi4gX0FyZ3M+CisJX19zaGFyZWRfcHRyKF9TcF9tYWtlX3NoYXJlZF90YWcgX190YWcsIGNvbnN0IF9BbGxvYyYgX19hLAorCQkgICAgIF9BcmdzJiYuLi4gX19hcmdzKQorCTogX01fcHRyKCksIF9NX3JlZmNvdW50KF9fdGFnLCAoX1RwKikwLCBfX2EsCisJCQkJc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKQorCXsKKwkgIC8vIF9NX3B0ciBuZWVkcyB0byBwb2ludCB0byB0aGUgbmV3bHkgY29uc3RydWN0ZWQgb2JqZWN0LgorCSAgLy8gVGhpcyByZWxpZXMgb24gX1NwX2NvdW50ZWRfcHRyX2lucGxhY2U6Ol9NX2dldF9kZWxldGVyLgorCSAgdm9pZCogX19wID0gX01fcmVmY291bnQuX01fZ2V0X2RlbGV0ZXIodHlwZWlkKF9fdGFnKSk7CisJICBfTV9wdHIgPSBzdGF0aWNfY2FzdDxfVHAqPihfX3ApOworCSAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoX01fcmVmY291bnQsIF9NX3B0ciwgX01fcHRyKTsKKwl9CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgICAgICBzdHJ1Y3QgX0RlbGV0ZXIKKyAgICAgICAgeworICAgICAgICAgIHZvaWQgb3BlcmF0b3IoKShfVHAqIF9fcHRyKQorICAgICAgICAgIHsKKwkgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz4gX0FsbG9jX3RyYWl0czsKKwkgICAgX0FsbG9jX3RyYWl0czo6ZGVzdHJveShfTV9hbGxvYywgX19wdHIpOworCSAgICBfQWxsb2NfdHJhaXRzOjpkZWFsbG9jYXRlKF9NX2FsbG9jLCBfX3B0ciwgMSk7CisgICAgICAgICAgfQorICAgICAgICAgIF9BbGxvYyBfTV9hbGxvYzsKKyAgICAgICAgfTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZS4uLiBfQXJncz4KKwlfX3NoYXJlZF9wdHIoX1NwX21ha2Vfc2hhcmVkX3RhZyBfX3RhZywgY29uc3QgX0FsbG9jJiBfX2EsCisJCSAgICAgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJOiBfTV9wdHIoKSwgX01fcmVmY291bnQoKQorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9UcD46Om90aGVyIF9BbGxvYzI7CisgICAgICAgICAgX0RlbGV0ZXI8X0FsbG9jMj4gX19kZWwgPSB7IF9BbGxvYzIoX19hKSB9OworCSAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYzI+IF9fdHJhaXRzOworICAgICAgICAgIF9NX3B0ciA9IF9fdHJhaXRzOjphbGxvY2F0ZShfX2RlbC5fTV9hbGxvYywgMSk7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgICAgIC8vIDIwNzAuIGFsbG9jYXRlX3NoYXJlZCBzaG91bGQgdXNlIGFsbG9jYXRvcl90cmFpdHM8QT46OmNvbnN0cnVjdAorCSAgICAgIF9fdHJhaXRzOjpjb25zdHJ1Y3QoX19kZWwuX01fYWxsb2MsIF9NX3B0ciwKKwkJICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBfX3RyYWl0czo6ZGVhbGxvY2F0ZShfX2RlbC5fTV9hbGxvYywgX01fcHRyLCAxKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorICAgICAgICAgIF9fc2hhcmVkX2NvdW50PF9McD4gX19jb3VudChfTV9wdHIsIF9fZGVsLCBfX2RlbC5fTV9hbGxvYyk7CisgICAgICAgICAgX01fcmVmY291bnQuX01fc3dhcChfX2NvdW50KTsKKwkgIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXNfaGVscGVyKF9NX3JlZmNvdW50LCBfTV9wdHIsIF9NX3B0cik7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCBfTG9ja19wb2xpY3kgX0xwMSwgdHlwZW5hbWUgX0FsbG9jLAorCSAgICAgICB0eXBlbmFtZS4uLiBfQXJncz4KKwlmcmllbmQgX19zaGFyZWRfcHRyPF9UcDEsIF9McDE+CisJX19hbGxvY2F0ZV9zaGFyZWQoY29uc3QgX0FsbG9jJiBfX2EsIF9BcmdzJiYuLi4gX19hcmdzKTsKKworICAgIHByaXZhdGU6CisgICAgICB2b2lkKgorICAgICAgX01fZ2V0X2RlbGV0ZXIoY29uc3Qgc3RkOjp0eXBlX2luZm8mIF9fdGkpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9yZWZjb3VudC5fTV9nZXRfZGVsZXRlcihfX3RpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCBfTG9ja19wb2xpY3kgX0xwMT4gZnJpZW5kIGNsYXNzIF9fc2hhcmVkX3B0cjsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIF9Mb2NrX3BvbGljeSBfTHAxPiBmcmllbmQgY2xhc3MgX193ZWFrX3B0cjsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0RlbCwgdHlwZW5hbWUgX1RwMSwgX0xvY2tfcG9saWN5IF9McDE+CisJZnJpZW5kIF9EZWwqIGdldF9kZWxldGVyKGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHAxPiYpIG5vZXhjZXB0OworCisgICAgICBfVHAqCSAgIAkgICBfTV9wdHI7ICAgICAgICAgLy8gQ29udGFpbmVkIHBvaW50ZXIuCisgICAgICBfX3NoYXJlZF9jb3VudDxfTHA+ICBfTV9yZWZjb3VudDsgICAgLy8gUmVmZXJlbmNlIGNvdW50ZXIuCisgICAgfTsKKworCisgIC8vIDIwLjcuMi4yLjcgc2hhcmVkX3B0ciBjb21wYXJpc29ucworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19hLAorCSAgICAgICBjb25zdCBfX3NoYXJlZF9wdHI8X1RwMiwgX0xwPiYgX19iKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS5nZXQoKSA9PSBfX2IuZ2V0KCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAsIF9McD4mIF9fYSwgbnVsbHB0cl90KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuICFfX2E7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KG51bGxwdHJfdCwgY29uc3QgX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19hKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuICFfX2E7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19hLAorCSAgICAgICBjb25zdCBfX3NoYXJlZF9wdHI8X1RwMiwgX0xwPiYgX19iKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fYS5nZXQoKSAhPSBfX2IuZ2V0KCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAsIF9McD4mIF9fYSwgbnVsbHB0cl90KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIChib29sKV9fYTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0obnVsbHB0cl90LCBjb25zdCBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX2EpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gKGJvb2wpX19hOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMiwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19hLAorCSAgICAgIGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAyLCBfTHA+JiBfX2IpIG5vZXhjZXB0CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbW1vbl90eXBlPF9UcDEqLCBfVHAyKj46OnR5cGUgX0NUOworICAgICAgcmV0dXJuIHN0ZDo6bGVzczxfQ1Q+KCkoX19hLmdldCgpLCBfX2IuZ2V0KCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19hLCBudWxscHRyX3QpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gc3RkOjpsZXNzPF9UcCo+KCkoX19hLmdldCgpLCBudWxscHRyKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChudWxscHRyX3QsIGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAsIF9McD4mIF9fYSkgbm9leGNlcHQKKyAgICB7IHJldHVybiBzdGQ6Omxlc3M8X1RwKj4oKShudWxscHRyLCBfX2EuZ2V0KCkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMiwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fYSwKKwkgICAgICAgY29uc3QgX19zaGFyZWRfcHRyPF9UcDIsIF9McD4mIF9fYikgbm9leGNlcHQKKyAgICB7IHJldHVybiAhKF9fYiA8IF9fYSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAsIF9McD4mIF9fYSwgbnVsbHB0cl90KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuICEobnVsbHB0ciA8IF9fYSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KG51bGxwdHJfdCwgY29uc3QgX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19hKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuICEoX19hIDwgbnVsbHB0cik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX2EsCisJICAgICAgY29uc3QgX19zaGFyZWRfcHRyPF9UcDIsIF9McD4mIF9fYikgbm9leGNlcHQKKyAgICB7IHJldHVybiAoX19iIDwgX19hKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX2EsIG51bGxwdHJfdCkgbm9leGNlcHQKKyAgICB7IHJldHVybiBzdGQ6Omxlc3M8X1RwKj4oKShudWxscHRyLCBfX2EuZ2V0KCkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KG51bGxwdHJfdCwgY29uc3QgX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19hKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIHN0ZDo6bGVzczxfVHAqPigpKF9fYS5nZXQoKSwgbnVsbHB0cik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19hLAorCSAgICAgICBjb25zdCBfX3NoYXJlZF9wdHI8X1RwMiwgX0xwPiYgX19iKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuICEoX19hIDwgX19iKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19hLCBudWxscHRyX3QpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gIShfX2EgPCBudWxscHRyKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0obnVsbHB0cl90LCBjb25zdCBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX2EpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gIShudWxscHRyIDwgX19hKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TcD4KKyAgICBzdHJ1Y3QgX1NwX2xlc3MgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9TcCwgX1NwLCBib29sPgorICAgIHsKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1NwJiBfX2xocywgY29uc3QgX1NwJiBfX3JocykgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9TcDo6ZWxlbWVudF90eXBlIGVsZW1lbnRfdHlwZTsKKwlyZXR1cm4gc3RkOjpsZXNzPGVsZW1lbnRfdHlwZSo+KCkoX19saHMuZ2V0KCksIF9fcmhzLmdldCgpKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBzdHJ1Y3QgbGVzczxfX3NoYXJlZF9wdHI8X1RwLCBfTHA+PgorICAgIDogcHVibGljIF9TcF9sZXNzPF9fc2hhcmVkX3B0cjxfVHAsIF9McD4+CisgICAgeyB9OworCisgIC8vIDIuMi4zLjggc2hhcmVkX3B0ciBzcGVjaWFsaXplZCBhbGdvcml0aG1zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKF9fc2hhcmVkX3B0cjxfVHAsIF9McD4mIF9fYSwgX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19iKSBub2V4Y2VwdAorICAgIHsgX19hLnN3YXAoX19iKTsgfQorCisgIC8vIDIuMi4zLjkgc2hhcmVkX3B0ciBjYXN0cworCisgIC8vIFRoZSBzZWVtaW5nbHkgZXF1aXZhbGVudCBjb2RlOgorICAvLyBzaGFyZWRfcHRyPF9UcCwgX0xwPihzdGF0aWNfY2FzdDxfVHAqPihfX3IuZ2V0KCkpKQorICAvLyB3aWxsIGV2ZW50dWFsbHkgcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvdXIsIGF0dGVtcHRpbmcgdG8KKyAgLy8gZGVsZXRlIHRoZSBzYW1lIG9iamVjdCB0d2ljZS4KKyAgLy8vIHN0YXRpY19wb2ludGVyX2Nhc3QKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVHAxLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+CisgICAgc3RhdGljX3BvaW50ZXJfY2FzdChjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4oX19yLCBzdGF0aWNfY2FzdDxfVHAqPihfX3IuZ2V0KCkpKTsgfQorCisgIC8vIFRoZSBzZWVtaW5nbHkgZXF1aXZhbGVudCBjb2RlOgorICAvLyBzaGFyZWRfcHRyPF9UcCwgX0xwPihjb25zdF9jYXN0PF9UcCo+KF9fci5nZXQoKSkpCisgIC8vIHdpbGwgZXZlbnR1YWxseSByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW91ciwgYXR0ZW1wdGluZyB0bworICAvLyBkZWxldGUgdGhlIHNhbWUgb2JqZWN0IHR3aWNlLgorICAvLy8gY29uc3RfcG9pbnRlcl9jYXN0CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwMSwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgX19zaGFyZWRfcHRyPF9UcCwgX0xwPgorICAgIGNvbnN0X3BvaW50ZXJfY2FzdChjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4oX19yLCBjb25zdF9jYXN0PF9UcCo+KF9fci5nZXQoKSkpOyB9CisKKyAgLy8gVGhlIHNlZW1pbmdseSBlcXVpdmFsZW50IGNvZGU6CisgIC8vIHNoYXJlZF9wdHI8X1RwLCBfTHA+KGR5bmFtaWNfY2FzdDxfVHAqPihfX3IuZ2V0KCkpKQorICAvLyB3aWxsIGV2ZW50dWFsbHkgcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvdXIsIGF0dGVtcHRpbmcgdG8KKyAgLy8gZGVsZXRlIHRoZSBzYW1lIG9iamVjdCB0d2ljZS4KKyAgLy8vIGR5bmFtaWNfcG9pbnRlcl9jYXN0CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwMSwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgX19zaGFyZWRfcHRyPF9UcCwgX0xwPgorICAgIGR5bmFtaWNfcG9pbnRlcl9jYXN0KGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX3IpIG5vZXhjZXB0CisgICAgeworICAgICAgaWYgKF9UcCogX19wID0gZHluYW1pY19jYXN0PF9UcCo+KF9fci5nZXQoKSkpCisJcmV0dXJuIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4oX19yLCBfX3ApOworICAgICAgcmV0dXJuIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4oKTsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgY2xhc3MgX193ZWFrX3B0cgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCBlbGVtZW50X3R5cGU7CisKKyAgICAgIGNvbnN0ZXhwciBfX3dlYWtfcHRyKCkgbm9leGNlcHQKKyAgICAgIDogX01fcHRyKDApLCBfTV9yZWZjb3VudCgpCisgICAgICB7IH0KKworICAgICAgX193ZWFrX3B0cihjb25zdCBfX3dlYWtfcHRyJikgbm9leGNlcHQgPSBkZWZhdWx0OworICAgICAgX193ZWFrX3B0ciYgb3BlcmF0b3I9KGNvbnN0IF9fd2Vha19wdHImKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisgICAgICB+X193ZWFrX3B0cigpID0gZGVmYXVsdDsKKworICAgICAgLy8gVGhlICJvYnZpb3VzIiBjb252ZXJ0aW5nIGNvbnN0cnVjdG9yIGltcGxlbWVudGF0aW9uOgorICAgICAgLy8KKyAgICAgIC8vICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgLy8gICAgX193ZWFrX3B0cihjb25zdCBfX3dlYWtfcHRyPF9UcDEsIF9McD4mIF9fcikKKyAgICAgIC8vICAgIDogX01fcHRyKF9fci5fTV9wdHIpLCBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpIC8vIG5ldmVyIHRocm93cworICAgICAgLy8gICAgeyB9CisgICAgICAvLworICAgICAgLy8gaGFzIGEgc2VyaW91cyBwcm9ibGVtLgorICAgICAgLy8KKyAgICAgIC8vICBfX3IuX01fcHRyIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBpbnZhbGlkYXRlZC4gVGhlIF9NX3B0cihfX3IuX01fcHRyKQorICAgICAgLy8gIGNvbnZlcnNpb24gbWF5IHJlcXVpcmUgYWNjZXNzIHRvICpfX3IuX01fcHRyICh2aXJ0dWFsIGluaGVyaXRhbmNlKS4KKyAgICAgIC8vCisgICAgICAvLyBJdCBpcyBub3QgcG9zc2libGUgdG8gYXZvaWQgc3B1cmlvdXMgYWNjZXNzIHZpb2xhdGlvbnMgc2luY2UKKyAgICAgIC8vIGluIG11bHRpdGhyZWFkZWQgcHJvZ3JhbXMgX19yLl9NX3B0ciBtYXkgYmUgaW52YWxpZGF0ZWQgYXQgYW55IHBvaW50LgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPF9UcDEqLCBfVHAqPjo6dmFsdWU+Ojp0eXBlPgorCV9fd2Vha19wdHIoY29uc3QgX193ZWFrX3B0cjxfVHAxLCBfTHA+JiBfX3IpIG5vZXhjZXB0CisJOiBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpCisgICAgICAgIHsgX01fcHRyID0gX19yLmxvY2soKS5nZXQoKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1RwMSosIF9UcCo+Ojp2YWx1ZT46OnR5cGU+CisJX193ZWFrX3B0cihjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yKSBub2V4Y2VwdAorCTogX01fcHRyKF9fci5fTV9wdHIpLCBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpCisJeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJX193ZWFrX3B0ciYKKwlvcGVyYXRvcj0oY29uc3QgX193ZWFrX3B0cjxfVHAxLCBfTHA+JiBfX3IpIG5vZXhjZXB0CisJeworCSAgX01fcHRyID0gX19yLmxvY2soKS5nZXQoKTsKKwkgIF9NX3JlZmNvdW50ID0gX19yLl9NX3JlZmNvdW50OworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlfX3dlYWtfcHRyJgorCW9wZXJhdG9yPShjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yKSBub2V4Y2VwdAorCXsKKwkgIF9NX3B0ciA9IF9fci5fTV9wdHI7CisJICBfTV9yZWZjb3VudCA9IF9fci5fTV9yZWZjb3VudDsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4KKyAgICAgIGxvY2soKSBjb25zdCBub2V4Y2VwdAorICAgICAgeworI2lmZGVmIF9fR1RIUkVBRFMKKwkvLyBPcHRpbWl6YXRpb246IGF2b2lkIHRocm93IG92ZXJoZWFkLgorCWlmIChleHBpcmVkKCkpCisJICByZXR1cm4gX19zaGFyZWRfcHRyPGVsZW1lbnRfdHlwZSwgX0xwPigpOworCisJX190cnkKKwkgIHsKKwkgICAgcmV0dXJuIF9fc2hhcmVkX3B0cjxlbGVtZW50X3R5cGUsIF9McD4oKnRoaXMpOworCSAgfQorCV9fY2F0Y2goY29uc3QgYmFkX3dlYWtfcHRyJikKKwkgIHsKKwkgICAgLy8gUTogSG93IGNhbiB3ZSBnZXQgaGVyZT8KKwkgICAgLy8gQTogQW5vdGhlciB0aHJlYWQgbWF5IGhhdmUgaW52YWxpZGF0ZWQgciBhZnRlciB0aGUKKwkgICAgLy8gICAgdXNlX2NvdW50IHRlc3QgYWJvdmUuCisJICAgIHJldHVybiBfX3NoYXJlZF9wdHI8ZWxlbWVudF90eXBlLCBfTHA+KCk7CisJICB9CisKKyNlbHNlCisJLy8gT3B0aW1pemF0aW9uOiBhdm9pZCB0cnkvY2F0Y2ggb3ZlcmhlYWQgd2hlbiBzaW5nbGUgdGhyZWFkZWQuCisJcmV0dXJuIGV4cGlyZWQoKSA/IF9fc2hhcmVkX3B0cjxlbGVtZW50X3R5cGUsIF9McD4oKQorCQkJIDogX19zaGFyZWRfcHRyPGVsZW1lbnRfdHlwZSwgX0xwPigqdGhpcyk7CisKKyNlbmRpZgorICAgICAgfSAvLyBYWFggTVQKKworICAgICAgbG9uZworICAgICAgdXNlX2NvdW50KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX3JlZmNvdW50Ll9NX2dldF91c2VfY291bnQoKTsgfQorCisgICAgICBib29sCisgICAgICBleHBpcmVkKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX3JlZmNvdW50Ll9NX2dldF91c2VfY291bnQoKSA9PSAwOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJYm9vbAorCW93bmVyX2JlZm9yZShjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yaHMpIGNvbnN0CisJeyByZXR1cm4gX01fcmVmY291bnQuX01fbGVzcyhfX3Jocy5fTV9yZWZjb3VudCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlib29sCisJb3duZXJfYmVmb3JlKGNvbnN0IF9fd2Vha19wdHI8X1RwMSwgX0xwPiYgX19yaHMpIGNvbnN0CisJeyByZXR1cm4gX01fcmVmY291bnQuX01fbGVzcyhfX3Jocy5fTV9yZWZjb3VudCk7IH0KKworICAgICAgdm9pZAorICAgICAgcmVzZXQoKSBub2V4Y2VwdAorICAgICAgeyBfX3dlYWtfcHRyKCkuc3dhcCgqdGhpcyk7IH0KKworICAgICAgdm9pZAorICAgICAgc3dhcChfX3dlYWtfcHRyJiBfX3MpIG5vZXhjZXB0CisgICAgICB7CisJc3RkOjpzd2FwKF9NX3B0ciwgX19zLl9NX3B0cik7CisJX01fcmVmY291bnQuX01fc3dhcChfX3MuX01fcmVmY291bnQpOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIFVzZWQgYnkgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcy4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2Fzc2lnbihfVHAqIF9fcHRyLCBjb25zdCBfX3NoYXJlZF9jb3VudDxfTHA+JiBfX3JlZmNvdW50KSBub2V4Y2VwdAorICAgICAgeworCV9NX3B0ciA9IF9fcHRyOworCV9NX3JlZmNvdW50ID0gX19yZWZjb3VudDsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgX0xvY2tfcG9saWN5IF9McDE+IGZyaWVuZCBjbGFzcyBfX3NoYXJlZF9wdHI7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCBfTG9ja19wb2xpY3kgX0xwMT4gZnJpZW5kIGNsYXNzIF9fd2Vha19wdHI7CisgICAgICBmcmllbmQgY2xhc3MgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpczxfVHAsIF9McD47CisgICAgICBmcmllbmQgY2xhc3MgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8X1RwPjsKKworICAgICAgX1RwKgkgCSBfTV9wdHI7ICAgICAgICAgLy8gQ29udGFpbmVkIHBvaW50ZXIuCisgICAgICBfX3dlYWtfY291bnQ8X0xwPiAgX01fcmVmY291bnQ7ICAgIC8vIFJlZmVyZW5jZSBjb3VudGVyLgorICAgIH07CisKKyAgLy8gMjAuNy4yLjMuNiB3ZWFrX3B0ciBzcGVjaWFsaXplZCBhbGdvcml0aG1zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKF9fd2Vha19wdHI8X1RwLCBfTHA+JiBfX2EsIF9fd2Vha19wdHI8X1RwLCBfTHA+JiBfX2IpIG5vZXhjZXB0CisgICAgeyBfX2Euc3dhcChfX2IpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVHAxPgorICAgIHN0cnVjdCBfU3Bfb3duZXJfbGVzcyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIGJvb2w+CisgICAgeworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fbGhzLCBjb25zdCBfVHAmIF9fcmhzKSBjb25zdAorICAgICAgeyByZXR1cm4gX19saHMub3duZXJfYmVmb3JlKF9fcmhzKTsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX19saHMsIGNvbnN0IF9UcDEmIF9fcmhzKSBjb25zdAorICAgICAgeyByZXR1cm4gX19saHMub3duZXJfYmVmb3JlKF9fcmhzKTsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcDEmIF9fbGhzLCBjb25zdCBfVHAmIF9fcmhzKSBjb25zdAorICAgICAgeyByZXR1cm4gX19saHMub3duZXJfYmVmb3JlKF9fcmhzKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIHN0cnVjdCBvd25lcl9sZXNzPF9fc2hhcmVkX3B0cjxfVHAsIF9McD4+CisgICAgOiBwdWJsaWMgX1NwX293bmVyX2xlc3M8X19zaGFyZWRfcHRyPF9UcCwgX0xwPiwgX193ZWFrX3B0cjxfVHAsIF9McD4+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBzdHJ1Y3Qgb3duZXJfbGVzczxfX3dlYWtfcHRyPF9UcCwgX0xwPj4KKyAgICA6IHB1YmxpYyBfU3Bfb3duZXJfbGVzczxfX3dlYWtfcHRyPF9UcCwgX0xwPiwgX19zaGFyZWRfcHRyPF9UcCwgX0xwPj4KKyAgICB7IH07CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgY2xhc3MgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcworICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBjb25zdGV4cHIgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcygpIG5vZXhjZXB0IHsgfQorCisgICAgICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzKGNvbnN0IF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMmKSBub2V4Y2VwdCB7IH0KKworICAgICAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzJikgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIH5fX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzKCkgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+CisgICAgICBzaGFyZWRfZnJvbV90aGlzKCkKKyAgICAgIHsgcmV0dXJuIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4odGhpcy0+X01fd2Vha190aGlzKTsgfQorCisgICAgICBfX3NoYXJlZF9wdHI8Y29uc3QgX1RwLCBfTHA+CisgICAgICBzaGFyZWRfZnJvbV90aGlzKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fc2hhcmVkX3B0cjxjb25zdCBfVHAsIF9McD4odGhpcy0+X01fd2Vha190aGlzKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJdm9pZAorCV9NX3dlYWtfYXNzaWduKF9UcDEqIF9fcCwgY29uc3QgX19zaGFyZWRfY291bnQ8X0xwPiYgX19uKSBjb25zdCBub2V4Y2VwdAorCXsgX01fd2Vha190aGlzLl9NX2Fzc2lnbihfX3AsIF9fbik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlmcmllbmQgdm9pZAorCV9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXNfaGVscGVyKGNvbnN0IF9fc2hhcmVkX2NvdW50PF9McD4mIF9fcG4sCisJCQkJCSBjb25zdCBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzKiBfX3BlLAorCQkJCQkgY29uc3QgX1RwMSogX19weCkgbm9leGNlcHQKKwl7CisJICBpZiAoX19wZSAhPSAwKQorCSAgICBfX3BlLT5fTV93ZWFrX2Fzc2lnbihjb25zdF9jYXN0PF9UcDEqPihfX3B4KSwgX19wbik7CisJfQorCisgICAgICBtdXRhYmxlIF9fd2Vha19wdHI8X1RwLCBfTHA+ICBfTV93ZWFrX3RoaXM7CisgICAgfTsKKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McCwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBpbmxpbmUgX19zaGFyZWRfcHRyPF9UcCwgX0xwPgorICAgIF9fYWxsb2NhdGVfc2hhcmVkKGNvbnN0IF9BbGxvYyYgX19hLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICB7CisgICAgICByZXR1cm4gX19zaGFyZWRfcHRyPF9UcCwgX0xwPihfU3BfbWFrZV9zaGFyZWRfdGFnKCksIF9fYSwKKwkJCQkgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBpbmxpbmUgX19zaGFyZWRfcHRyPF9UcCwgX0xwPgorICAgIF9fbWFrZV9zaGFyZWQoX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDxfVHA+Ojp0eXBlIF9UcF9uYzsKKyAgICAgIHJldHVybiBzdGQ6Ol9fYWxsb2NhdGVfc2hhcmVkPF9UcCwgX0xwPihzdGQ6OmFsbG9jYXRvcjxfVHBfbmM+KCksCisJCQkJCSAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgfQorCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIF9fc2hhcmVkX3B0ci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIHN0cnVjdCBoYXNoPF9fc2hhcmVkX3B0cjxfVHAsIF9McD4+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+PgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX3MpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Omhhc2g8X1RwKj4oKShfX3MuZ2V0KCkpOyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gX1NIQVJFRF9QVFJfQkFTRV9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc2xpY2VfYXJyYXkuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zbGljZV9hcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNGQwZmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc2xpY2VfYXJyYXkuaApAQCAtMCwwICsxLDI3NCBAQAorLy8gVGhlIHRlbXBsYXRlIGFuZCBpbmxpbmVzIGZvciB0aGUgLSotIEMrKyAtKi0gc2xpY2VfYXJyYXkgY2xhc3MuCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL3NsaWNlX2FycmF5LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt2YWxhcnJheX0KKyAqLworCisvLyBXcml0dGVuIGJ5IEdhYnJpZWwgRG9zIFJlaXMgPEdhYnJpZWwuRG9zLVJlaXNARFBUTWF0aHMuRU5TLUNhY2hhbi5Gcj4KKworI2lmbmRlZiBfU0xJQ0VfQVJSQVlfSAorI2RlZmluZSBfU0xJQ0VfQVJSQVlfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBudW1lcmljX2FycmF5cworICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogIEBicmllZiAgQ2xhc3MgZGVmaW5pbmcgb25lLWRpbWVuc2lvbmFsIHN1YnNldCBvZiBhbiBhcnJheS4KKyAgICoKKyAgICogIFRoZSBzbGljZSBjbGFzcyByZXByZXNlbnRzIGEgb25lLWRpbWVuc2lvbmFsIHN1YnNldCBvZiBhbiBhcnJheSwKKyAgICogIHNwZWNpZmllZCBieSB0aHJlZSBwYXJhbWV0ZXJzOiBzdGFydCBvZmZzZXQsIHNpemUsIGFuZCBzdHJpZGUuICBUaGUKKyAgICogIHN0YXJ0IG9mZnNldCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGFycmF5IHRoYXQgaXMgcGFydAorICAgKiAgb2YgdGhlIHN1YnNldC4gIFRoZSBzaXplIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHN1YnNldC4KKyAgICogIFN0cmlkZSBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiBlYWNoIHN1Y2Nlc3NpdmUgYXJyYXkgZWxlbWVudCB0byBpbmNsdWRlCisgICAqICBpbiB0aGUgc3Vic2V0LgorICAgKgorICAgKiAgRm9yIGV4YW1wbGUsIHdpdGggYW4gYXJyYXkgb2Ygc2l6ZSAxMCwgYW5kIGEgc2xpY2Ugd2l0aCBvZmZzZXQgMSwgc2l6ZSAzCisgICAqICBhbmQgc3RyaWRlIDIsIHRoZSBzdWJzZXQgY29uc2lzdHMgb2YgYXJyYXkgZWxlbWVudHMgMSwgMywgYW5kIDUuCisgICAqLworICBjbGFzcyBzbGljZQorICB7CisgIHB1YmxpYzoKKyAgICAvLy8gIENvbnN0cnVjdCBhbiBlbXB0eSBzbGljZS4KKyAgICBzbGljZSgpOworCisgICAgLyoqCisgICAgICogIEBicmllZiAgQ29uc3RydWN0IGEgc2xpY2UuCisgICAgICoKKyAgICAgKiAgQHBhcmFtICBfX28gIE9mZnNldCBpbiBhcnJheSBvZiBmaXJzdCBlbGVtZW50LgorICAgICAqICBAcGFyYW0gIF9fZCAgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHNsaWNlLgorICAgICAqICBAcGFyYW0gIF9fcyAgU3RyaWRlIGJldHdlZW4gYXJyYXkgZWxlbWVudHMuCisgICAgICovCisgICAgc2xpY2Uoc2l6ZV90IF9fbywgc2l6ZV90IF9fZCwgc2l6ZV90IF9fcyk7CisKKyAgICAvLy8gIFJldHVybiBhcnJheSBvZmZzZXQgb2YgZmlyc3Qgc2xpY2UgZWxlbWVudC4KKyAgICBzaXplX3Qgc3RhcnQoKSBjb25zdDsKKyAgICAvLy8gIFJldHVybiBzaXplIG9mIHNsaWNlLgorICAgIHNpemVfdCBzaXplKCkgY29uc3Q7CisgICAgLy8vICBSZXR1cm4gYXJyYXkgc3RyaWRlIG9mIHNsaWNlLgorICAgIHNpemVfdCBzdHJpZGUoKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIHNpemVfdCBfTV9vZmY7ICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgIHNpemVfdCBfTV9zejsJCQkvLyBzaXplCisgICAgc2l6ZV90IF9NX3N0OwkJCS8vIHN0cmlkZSB1bml0CisgIH07CisKKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyA1NDMuIHZhbGFycmF5IHNsaWNlIGRlZmF1bHQgY29uc3RydWN0b3IKKyAgaW5saW5lCisgIHNsaWNlOjpzbGljZSgpIAorICA6IF9NX29mZigwKSwgX01fc3ooMCksIF9NX3N0KDApIHt9CisKKyAgaW5saW5lCisgIHNsaWNlOjpzbGljZShzaXplX3QgX19vLCBzaXplX3QgX19kLCBzaXplX3QgX19zKQorICA6IF9NX29mZihfX28pLCBfTV9zeihfX2QpLCBfTV9zdChfX3MpIHt9CisKKyAgaW5saW5lIHNpemVfdAorICBzbGljZTo6c3RhcnQoKSBjb25zdAorICB7IHJldHVybiBfTV9vZmY7IH0KKworICBpbmxpbmUgc2l6ZV90CisgIHNsaWNlOjpzaXplKCkgY29uc3QKKyAgeyByZXR1cm4gX01fc3o7IH0KKworICBpbmxpbmUgc2l6ZV90CisgIHNsaWNlOjpzdHJpZGUoKSBjb25zdAorICB7IHJldHVybiBfTV9zdDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZWZlcmVuY2UgdG8gb25lLWRpbWVuc2lvbmFsIHN1YnNldCBvZiBhbiBhcnJheS4KKyAgICoKKyAgICogIEEgc2xpY2VfYXJyYXkgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGFjdHVhbCBlbGVtZW50cyBvZiBhbiBhcnJheQorICAgKiAgc3BlY2lmaWVkIGJ5IGEgc2xpY2UuICBUaGUgd2F5IHRvIGdldCBhIHNsaWNlX2FycmF5IGlzIHRvIGNhbGwKKyAgICogIG9wZXJhdG9yW10oc2xpY2UpIG9uIGEgdmFsYXJyYXkuICBUaGUgcmV0dXJuZWQgc2xpY2VfYXJyYXkgdGhlbiBwZXJtaXRzCisgICAqICBjYXJyeWluZyBvcGVyYXRpb25zIG91dCBvbiB0aGUgcmVmZXJlbmNlZCBzdWJzZXQgb2YgZWxlbWVudHMgaW4gdGhlCisgICAqICBvcmlnaW5hbCB2YWxhcnJheS4gIEZvciBleGFtcGxlLCBvcGVyYXRvcis9KHZhbGFycmF5KSB3aWxsIGFkZCB2YWx1ZXMKKyAgICogIHRvIHRoZSBzdWJzZXQgb2YgZWxlbWVudHMgaW4gdGhlIHVuZGVybHlpbmcgdmFsYXJyYXkgdGhpcyBzbGljZV9hcnJheQorICAgKiAgcmVmZXJzIHRvLgorICAgKgorICAgKiAgQHBhcmFtICBUcCAgRWxlbWVudCB0eXBlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIHNsaWNlX2FycmF5CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDI1My4gdmFsYXJyYXkgaGVscGVyIGZ1bmN0aW9ucyBhcmUgYWxtb3N0IGVudGlyZWx5IHVzZWxlc3MKKworICAgICAgLy8vICBDb3B5IGNvbnN0cnVjdG9yLiAgQm90aCBzbGljZXMgcmVmZXIgdG8gdGhlIHNhbWUgdW5kZXJseWluZyBhcnJheS4KKyAgICAgIHNsaWNlX2FycmF5KGNvbnN0IHNsaWNlX2FycmF5Jik7CisKKyAgICAgIC8vLyAgQXNzaWdubWVudCBvcGVyYXRvci4gIEFzc2lnbnMgc2xpY2UgZWxlbWVudHMgdG8gY29ycmVzcG9uZGluZworICAgICAgLy8vICBlbGVtZW50cyBvZiBAYSBhLgorICAgICAgc2xpY2VfYXJyYXkmIG9wZXJhdG9yPShjb25zdCBzbGljZV9hcnJheSYpOworCisgICAgICAvLy8gIEFzc2lnbiBzbGljZSBlbGVtZW50cyB0byBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIE11bHRpcGx5IHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3IqPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIERpdmlkZSBzbGljZSBlbGVtZW50cyBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yLz0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBNb2R1bG8gc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvciU9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgQWRkIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdiB0byBzbGljZSBlbGVtZW50cy4KKyAgICAgIHZvaWQgb3BlcmF0b3IrPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIFN1YnRyYWN0IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdiBmcm9tIHNsaWNlIGVsZW1lbnRzLgorICAgICAgdm9pZCBvcGVyYXRvci09KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTG9naWNhbCB4b3Igc2xpY2UgZWxlbWVudHMgd2l0aCBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yXj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBMb2dpY2FsIGFuZCBzbGljZSBlbGVtZW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3ImPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIExvZ2ljYWwgb3Igc2xpY2UgZWxlbWVudHMgd2l0aCBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yfD0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBMZWZ0IHNoaWZ0IHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3I8PD0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBSaWdodCBzaGlmdCBzbGljZSBlbGVtZW50cyBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yPj49KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgQXNzaWduIGFsbCBzbGljZSBlbGVtZW50cyB0byBAYSB0LgorICAgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgX1RwICYpIGNvbnN0OworICAgICAgLy8gICAgICAgIH5zbGljZV9hcnJheSAoKTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2b2lkIG9wZXJhdG9yKj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2b2lkIG9wZXJhdG9yLz0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2b2lkIG9wZXJhdG9yJT0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2b2lkIG9wZXJhdG9yKz0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2b2lkIG9wZXJhdG9yLT0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2b2lkIG9wZXJhdG9yXj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2b2lkIG9wZXJhdG9yJj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2b2lkIG9wZXJhdG9yfD0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2b2lkIG9wZXJhdG9yPDw9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisJdm9pZCBvcGVyYXRvcj4+PShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgZnJpZW5kIGNsYXNzIHZhbGFycmF5PF9UcD47CisgICAgICBzbGljZV9hcnJheShfQXJyYXk8X1RwPiwgY29uc3Qgc2xpY2UmKTsKKworICAgICAgY29uc3Qgc2l6ZV90ICAgICAgX01fc3o7CisgICAgICBjb25zdCBzaXplX3QgICAgICBfTV9zdHJpZGU7CisgICAgICBjb25zdCBfQXJyYXk8X1RwPiBfTV9hcnJheTsKKworICAgICAgLy8gbm90IGltcGxlbWVudGVkCisgICAgICBzbGljZV9hcnJheSgpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIHNsaWNlX2FycmF5PF9UcD46OnNsaWNlX2FycmF5KF9BcnJheTxfVHA+IF9fYSwgY29uc3Qgc2xpY2UmIF9fcykKKyAgICA6IF9NX3N6KF9fcy5zaXplKCkpLCBfTV9zdHJpZGUoX19zLnN0cmlkZSgpKSwKKyAgICAgIF9NX2FycmF5KF9fYS5iZWdpbigpICsgX19zLnN0YXJ0KCkpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIHNsaWNlX2FycmF5PF9UcD46OnNsaWNlX2FycmF5KGNvbnN0IHNsaWNlX2FycmF5PF9UcD4mIGEpCisgICAgOiBfTV9zeihhLl9NX3N6KSwgX01fc3RyaWRlKGEuX01fc3RyaWRlKSwgX01fYXJyYXkoYS5fTV9hcnJheSkge30KKworICAvLyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgIC8vICAgIGlubGluZSBzbGljZV9hcnJheTxfVHA+Ojp+c2xpY2VfYXJyYXkgKCkge30KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHNsaWNlX2FycmF5PF9UcD4mCisgICAgc2xpY2VfYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IHNsaWNlX2FycmF5PF9UcD4mIF9fYSkKKyAgICB7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfY29weShfX2EuX01fYXJyYXksIF9fYS5fTV9zeiwgX19hLl9NX3N0cmlkZSwKKwkJCSAgIF9NX2FycmF5LCBfTV9zdHJpZGUpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBzbGljZV9hcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfZmlsbChfTV9hcnJheSwgX01fc3osIF9NX3N0cmlkZSwgX190KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHNsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YpIGNvbnN0CisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weShfQXJyYXk8X1RwPihfX3YpLCBfTV9hcnJheSwgX01fc3osIF9NX3N0cmlkZSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgaW5saW5lIHZvaWQKKyAgICBzbGljZV9hcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgX0V4cHI8X0RvbSxfVHA+JiBfX2UpIGNvbnN0CisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weShfX2UsIF9NX3N6LCBfTV9hcnJheSwgX01fc3RyaWRlKTsgfQorCisjdW5kZWYgX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUgorI2RlZmluZSBfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKF9PcCxfTmFtZSkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CQkJCQkJXAorICAgIGlubGluZSB2b2lkCQkJCQkJCQlcCisgICAgc2xpY2VfYXJyYXk8X1RwPjo6b3BlcmF0b3IgX09wIyM9KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdikgY29uc3QJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBfQXJyYXlfYXVnbWVudGVkXyMjX05hbWUoX01fYXJyYXksIF9NX3N6LCBfTV9zdHJpZGUsIF9BcnJheTxfVHA+KF9fdikpO1wKKyAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CQkJCSAgICAgICAgICAgICAgICBcCisgICAgICBpbmxpbmUgdm9pZAkJCQkJCQlcCisgICAgICBzbGljZV9hcnJheTxfVHA+OjpvcGVyYXRvciBfT3AjIz0oY29uc3QgX0V4cHI8X0RvbSxfVHA+JiBfX2UpIGNvbnN0XAorICAgICAgewkJCQkJCQkJCVwKKwkgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfTV9hcnJheSwgX01fc3RyaWRlLCBfX2UsIF9NX3N6KTsJXAorICAgICAgfQorCisKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoKiwgX19tdWx0aXBsaWVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigvLCBfX2RpdmlkZXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKCUsIF9fbW9kdWx1cykKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoKywgX19wbHVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigtLCBfX21pbnVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUiheLCBfX2JpdHdpc2VfeG9yKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigmLCBfX2JpdHdpc2VfYW5kKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUih8LCBfX2JpdHdpc2Vfb3IpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKDw8LCBfX3NoaWZ0X2xlZnQpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKD4+LCBfX3NoaWZ0X3JpZ2h0KQorCisjdW5kZWYgX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUgorCisgIC8vIEB9IGdyb3VwIG51bWVyaWNfYXJyYXlzCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9TTElDRV9BUlJBWV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3N0cmVhbS50Y2MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3N0cmVhbS50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgzYjRmZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zc3RyZWFtLnRjYwpAQCAtMCwwICsxLDI4OCBAQAorLy8gU3RyaW5nIGJhc2VkIHN0cmVhbXMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvc3N0cmVhbS50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtzc3RyZWFtfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy43ICBTdHJpbmctYmFzZWQgc3RyZWFtcworLy8KKworI2lmbmRlZiBfU1NUUkVBTV9UQ0MKKyNkZWZpbmUgX1NTVFJFQU1fVENDIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OmludF90eXBlCisgICAgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgcGJhY2tmYWlsKGludF90eXBlIF9fYykKKyAgICB7CisgICAgICBpbnRfdHlwZSBfX3JldCA9IHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgIGlmICh0aGlzLT5lYmFjaygpIDwgdGhpcy0+Z3B0cigpKQorCXsKKwkgIC8vIFRyeSB0byBwdXQgYmFjayBfX2MgaW50byBpbnB1dCBzZXF1ZW5jZSBpbiBvbmUgb2YgdGhyZWUgd2F5cy4KKwkgIC8vIE9yZGVyIHRoZXNlIHRlc3RzIGRvbmUgaW4gaXMgdW5zcGVjaWZpZWQgYnkgdGhlIHN0YW5kYXJkLgorCSAgY29uc3QgYm9vbCBfX3Rlc3Rlb2YgPSB0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX3JldCk7CisJICBpZiAoIV9fdGVzdGVvZikKKwkgICAgeworCSAgICAgIGNvbnN0IGJvb2wgX190ZXN0ZXEgPSB0cmFpdHNfdHlwZTo6ZXEodHJhaXRzX3R5cGU6OgorCQkJCQkJICAgIHRvX2NoYXJfdHlwZShfX2MpLAorCQkJCQkJICAgIHRoaXMtPmdwdHIoKVstMV0pOwkgIAorCSAgICAgIGNvbnN0IGJvb2wgX190ZXN0b3V0ID0gdGhpcy0+X01fbW9kZSAmIGlvc19iYXNlOjpvdXQ7CisJICAgICAgaWYgKF9fdGVzdGVxIHx8IF9fdGVzdG91dCkKKwkJeworCQkgIHRoaXMtPmdidW1wKC0xKTsKKwkJICBpZiAoIV9fdGVzdGVxKQorCQkgICAgKnRoaXMtPmdwdHIoKSA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKTsKKwkJICBfX3JldCA9IF9fYzsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICB0aGlzLT5nYnVtcCgtMSk7CisJICAgICAgX19yZXQgPSB0cmFpdHNfdHlwZTo6bm90X2VvZihfX2MpOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6aW50X3R5cGUKKyAgICBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBvdmVyZmxvdyhpbnRfdHlwZSBfX2MpCisgICAgeworICAgICAgY29uc3QgYm9vbCBfX3Rlc3RvdXQgPSB0aGlzLT5fTV9tb2RlICYgaW9zX2Jhc2U6Om91dDsKKyAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KCFfX3Rlc3RvdXQsIGZhbHNlKSkKKwlyZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworCisgICAgICBjb25zdCBib29sIF9fdGVzdGVvZiA9IHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIHRyYWl0c190eXBlOjplb2YoKSk7CisgICAgICBpZiAoX19idWlsdGluX2V4cGVjdChfX3Rlc3Rlb2YsIGZhbHNlKSkKKwlyZXR1cm4gdHJhaXRzX3R5cGU6Om5vdF9lb2YoX19jKTsKKworICAgICAgY29uc3QgX19zaXplX3R5cGUgX19jYXBhY2l0eSA9IF9NX3N0cmluZy5jYXBhY2l0eSgpOworICAgICAgY29uc3QgX19zaXplX3R5cGUgX19tYXhfc2l6ZSA9IF9NX3N0cmluZy5tYXhfc2l6ZSgpOworICAgICAgY29uc3QgYm9vbCBfX3Rlc3RwdXQgPSB0aGlzLT5wcHRyKCkgPCB0aGlzLT5lcHB0cigpOworICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoIV9fdGVzdHB1dCAmJiBfX2NhcGFjaXR5ID09IF9fbWF4X3NpemUsIGZhbHNlKSkKKwlyZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworCisgICAgICAvLyBUcnkgdG8gYXBwZW5kIF9fYyBpbnRvIG91dHB1dCBzZXF1ZW5jZSBpbiBvbmUgb2YgdHdvIHdheXMuCisgICAgICAvLyBPcmRlciB0aGVzZSB0ZXN0cyBkb25lIGluIGlzIHVuc3BlY2lmaWVkIGJ5IHRoZSBzdGFuZGFyZC4KKyAgICAgIGNvbnN0IGNoYXJfdHlwZSBfX2NvbnYgPSB0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYyk7CisgICAgICBpZiAoIV9fdGVzdHB1dCkKKwl7CisJICAvLyBOQjogU3RhcnQgb3N0cmluZ3N0cmVhbSBidWZmZXJzIGF0IDUxMiBjaGFycy4gIFRoaXMgaXMgYW4KKwkgIC8vIGV4cGVyaW1lbnRhbCB2YWx1ZSAocHJvbm91bmNlZCAiYXJiaXRyYXJ5IiBpbiBzb21lIG9mIHRoZQorCSAgLy8gaGlwcGVyIEVuZ2xpc2gtc3BlYWtpbmcgY291bnRyaWVzKSwgYW5kIGNhbiBiZSBjaGFuZ2VkIHRvCisJICAvLyBzdWl0IHBhcnRpY3VsYXIgbmVlZHMuCisJICAvLworCSAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgLy8gMTY5LiBCYWQgZWZmaWNpZW5jeSBvZiBvdmVyZmxvdygpIG1hbmRhdGVkCisJICAvLyA0MzIuIHN0cmluZ2J1Zjo6b3ZlcmZsb3coKSBtYWtlcyBvbmx5IG9uZSB3cml0ZSBwb3NpdGlvbgorCSAgLy8gICAgICBhdmFpbGFibGUKKwkgIGNvbnN0IF9fc2l6ZV90eXBlIF9fb3B0X2xlbiA9IHN0ZDo6bWF4KF9fc2l6ZV90eXBlKDIgKiBfX2NhcGFjaXR5KSwKKwkJCQkJCSBfX3NpemVfdHlwZSg1MTIpKTsKKwkgIGNvbnN0IF9fc2l6ZV90eXBlIF9fbGVuID0gc3RkOjptaW4oX19vcHRfbGVuLCBfX21heF9zaXplKTsKKwkgIF9fc3RyaW5nX3R5cGUgX190bXA7CisJICBfX3RtcC5yZXNlcnZlKF9fbGVuKTsKKwkgIGlmICh0aGlzLT5wYmFzZSgpKQorCSAgICBfX3RtcC5hc3NpZ24odGhpcy0+cGJhc2UoKSwgdGhpcy0+ZXBwdHIoKSAtIHRoaXMtPnBiYXNlKCkpOworCSAgX190bXAucHVzaF9iYWNrKF9fY29udik7CisJICBfTV9zdHJpbmcuc3dhcChfX3RtcCk7CisJICBfTV9zeW5jKGNvbnN0X2Nhc3Q8Y2hhcl90eXBlKj4oX01fc3RyaW5nLmRhdGEoKSksCisJCSAgdGhpcy0+Z3B0cigpIC0gdGhpcy0+ZWJhY2soKSwgdGhpcy0+cHB0cigpIC0gdGhpcy0+cGJhc2UoKSk7CisJfQorICAgICAgZWxzZQorCSp0aGlzLT5wcHRyKCkgPSBfX2NvbnY7CisgICAgICB0aGlzLT5wYnVtcCgxKTsKKyAgICAgIHJldHVybiBfX2M7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjppbnRfdHlwZQorICAgIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIHVuZGVyZmxvdygpCisgICAgeworICAgICAgaW50X3R5cGUgX19yZXQgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgICBjb25zdCBib29sIF9fdGVzdGluID0gdGhpcy0+X01fbW9kZSAmIGlvc19iYXNlOjppbjsKKyAgICAgIGlmIChfX3Rlc3RpbikKKwl7CisJICAvLyBVcGRhdGUgZWdwdHIoKSB0byBtYXRjaCB0aGUgYWN0dWFsIHN0cmluZyBlbmQuCisJICBfTV91cGRhdGVfZWdwdHIoKTsKKworCSAgaWYgKHRoaXMtPmdwdHIoKSA8IHRoaXMtPmVncHRyKCkpCisJICAgIF9fcmV0ID0gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCp0aGlzLT5ncHRyKCkpOworCX0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnBvc190eXBlCisgICAgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgc2Vla29mZihvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX193YXksIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCisgICAgeworICAgICAgcG9zX3R5cGUgX19yZXQgPSAgcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKKyAgICAgIGJvb2wgX190ZXN0aW4gPSAoaW9zX2Jhc2U6OmluICYgdGhpcy0+X01fbW9kZSAmIF9fbW9kZSkgIT0gMDsKKyAgICAgIGJvb2wgX190ZXN0b3V0ID0gKGlvc19iYXNlOjpvdXQgJiB0aGlzLT5fTV9tb2RlICYgX19tb2RlKSAhPSAwOworICAgICAgY29uc3QgYm9vbCBfX3Rlc3Rib3RoID0gX190ZXN0aW4gJiYgX190ZXN0b3V0ICYmIF9fd2F5ICE9IGlvc19iYXNlOjpjdXI7CisgICAgICBfX3Rlc3RpbiAmPSAhKF9fbW9kZSAmIGlvc19iYXNlOjpvdXQpOworICAgICAgX190ZXN0b3V0ICY9ICEoX19tb2RlICYgaW9zX2Jhc2U6OmluKTsKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDUzLiBiYXNpY19zdHJpbmdidWY6OnNlZWtvZmYgbmVlZCBub3QgYWx3YXlzIGZhaWwgZm9yIGFuIGVtcHR5IHN0cmVhbS4KKyAgICAgIGNvbnN0IGNoYXJfdHlwZSogX19iZWcgPSBfX3Rlc3RpbiA/IHRoaXMtPmViYWNrKCkgOiB0aGlzLT5wYmFzZSgpOworICAgICAgaWYgKChfX2JlZyB8fCAhX19vZmYpICYmIChfX3Rlc3RpbiB8fCBfX3Rlc3RvdXQgfHwgX190ZXN0Ym90aCkpCisJeworCSAgX01fdXBkYXRlX2VncHRyKCk7CisKKwkgIG9mZl90eXBlIF9fbmV3b2ZmaSA9IF9fb2ZmOworCSAgb2ZmX3R5cGUgX19uZXdvZmZvID0gX19uZXdvZmZpOworCSAgaWYgKF9fd2F5ID09IGlvc19iYXNlOjpjdXIpCisJICAgIHsKKwkgICAgICBfX25ld29mZmkgKz0gdGhpcy0+Z3B0cigpIC0gX19iZWc7CisJICAgICAgX19uZXdvZmZvICs9IHRoaXMtPnBwdHIoKSAtIF9fYmVnOworCSAgICB9CisJICBlbHNlIGlmIChfX3dheSA9PSBpb3NfYmFzZTo6ZW5kKQorCSAgICBfX25ld29mZm8gPSBfX25ld29mZmkgKz0gdGhpcy0+ZWdwdHIoKSAtIF9fYmVnOworCisJICBpZiAoKF9fdGVzdGluIHx8IF9fdGVzdGJvdGgpCisJICAgICAgJiYgX19uZXdvZmZpID49IDAKKwkgICAgICAmJiB0aGlzLT5lZ3B0cigpIC0gX19iZWcgPj0gX19uZXdvZmZpKQorCSAgICB7CisJICAgICAgdGhpcy0+c2V0Zyh0aGlzLT5lYmFjaygpLCB0aGlzLT5lYmFjaygpICsgX19uZXdvZmZpLAorCQkJIHRoaXMtPmVncHRyKCkpOworCSAgICAgIF9fcmV0ID0gcG9zX3R5cGUoX19uZXdvZmZpKTsKKwkgICAgfQorCSAgaWYgKChfX3Rlc3RvdXQgfHwgX190ZXN0Ym90aCkKKwkgICAgICAmJiBfX25ld29mZm8gPj0gMAorCSAgICAgICYmIHRoaXMtPmVncHRyKCkgLSBfX2JlZyA+PSBfX25ld29mZm8pCisJICAgIHsKKwkgICAgICBfTV9wYnVtcCh0aGlzLT5wYmFzZSgpLCB0aGlzLT5lcHB0cigpLCBfX25ld29mZm8pOworCSAgICAgIF9fcmV0ID0gcG9zX3R5cGUoX19uZXdvZmZvKTsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnBvc190eXBlCisgICAgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgc2Vla3Bvcyhwb3NfdHlwZSBfX3NwLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKQorICAgIHsKKyAgICAgIHBvc190eXBlIF9fcmV0ID0gIHBvc190eXBlKG9mZl90eXBlKC0xKSk7CisgICAgICBjb25zdCBib29sIF9fdGVzdGluID0gKGlvc19iYXNlOjppbiAmIHRoaXMtPl9NX21vZGUgJiBfX21vZGUpICE9IDA7CisgICAgICBjb25zdCBib29sIF9fdGVzdG91dCA9IChpb3NfYmFzZTo6b3V0ICYgdGhpcy0+X01fbW9kZSAmIF9fbW9kZSkgIT0gMDsKKworICAgICAgY29uc3QgY2hhcl90eXBlKiBfX2JlZyA9IF9fdGVzdGluID8gdGhpcy0+ZWJhY2soKSA6IHRoaXMtPnBiYXNlKCk7CisgICAgICBpZiAoKF9fYmVnIHx8ICFvZmZfdHlwZShfX3NwKSkgJiYgKF9fdGVzdGluIHx8IF9fdGVzdG91dCkpCisJeworCSAgX01fdXBkYXRlX2VncHRyKCk7CisKKwkgIGNvbnN0IG9mZl90eXBlIF9fcG9zKF9fc3ApOworCSAgY29uc3QgYm9vbCBfX3Rlc3Rwb3MgPSAoMCA8PSBfX3BvcworCQkJCSAgJiYgX19wb3MgPD0gdGhpcy0+ZWdwdHIoKSAtIF9fYmVnKTsKKwkgIGlmIChfX3Rlc3Rwb3MpCisJICAgIHsKKwkgICAgICBpZiAoX190ZXN0aW4pCisJCXRoaXMtPnNldGcodGhpcy0+ZWJhY2soKSwgdGhpcy0+ZWJhY2soKSArIF9fcG9zLAorCQkJICAgdGhpcy0+ZWdwdHIoKSk7CisJICAgICAgaWYgKF9fdGVzdG91dCkKKwkJX01fcGJ1bXAodGhpcy0+cGJhc2UoKSwgdGhpcy0+ZXBwdHIoKSwgX19wb3MpOworCSAgICAgIF9fcmV0ID0gX19zcDsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorICAgIHZvaWQKKyAgICBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfTV9zeW5jKGNoYXJfdHlwZSogX19iYXNlLCBfX3NpemVfdHlwZSBfX2ksIF9fc2l6ZV90eXBlIF9fbykKKyAgICB7CisgICAgICBjb25zdCBib29sIF9fdGVzdGluID0gX01fbW9kZSAmIGlvc19iYXNlOjppbjsKKyAgICAgIGNvbnN0IGJvb2wgX190ZXN0b3V0ID0gX01fbW9kZSAmIGlvc19iYXNlOjpvdXQ7CisgICAgICBjaGFyX3R5cGUqIF9fZW5kZyA9IF9fYmFzZSArIF9NX3N0cmluZy5zaXplKCk7CisgICAgICBjaGFyX3R5cGUqIF9fZW5kcCA9IF9fYmFzZSArIF9NX3N0cmluZy5jYXBhY2l0eSgpOworCisgICAgICBpZiAoX19iYXNlICE9IF9NX3N0cmluZy5kYXRhKCkpCisJeworCSAgLy8gc2V0YnVmOiBfX2kgPT0gc2l6ZSBvZiBidWZmZXIgYXJlYSAoX01fc3RyaW5nLnNpemUoKSA9PSAwKS4KKwkgIF9fZW5kZyArPSBfX2k7CisJICBfX2kgPSAwOworCSAgX19lbmRwID0gX19lbmRnOworCX0KKworICAgICAgaWYgKF9fdGVzdGluKQorCXRoaXMtPnNldGcoX19iYXNlLCBfX2Jhc2UgKyBfX2ksIF9fZW5kZyk7CisgICAgICBpZiAoX190ZXN0b3V0KQorCXsKKwkgIF9NX3BidW1wKF9fYmFzZSwgX19lbmRwLCBfX28pOworCSAgLy8gZWdwdHIoKSBhbHdheXMgdHJhY2tzIHRoZSBzdHJpbmcgZW5kLiAgV2hlbiAhX190ZXN0aW4sCisJICAvLyBmb3IgdGhlIGNvcnJlY3QgZnVuY3Rpb25pbmcgb2YgdGhlIHN0cmVhbWJ1ZiBpbmxpbmVzCisJICAvLyB0aGUgb3RoZXIgZ2V0IGFyZWEgcG9pbnRlcnMgYXJlIGlkZW50aWNhbC4KKwkgIGlmICghX190ZXN0aW4pCisJICAgIHRoaXMtPnNldGcoX19lbmRnLCBfX2VuZGcsIF9fZW5kZyk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX3BidW1wKGNoYXJfdHlwZSogX19wYmVnLCBjaGFyX3R5cGUqIF9fcGVuZCwgb2ZmX3R5cGUgX19vZmYpCisgICAgeworICAgICAgdGhpcy0+c2V0cChfX3BiZWcsIF9fcGVuZCk7CisgICAgICB3aGlsZSAoX19vZmYgPiBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8aW50Pjo6X19tYXgpCisJeworCSAgdGhpcy0+cGJ1bXAoX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPGludD46Ol9fbWF4KTsKKwkgIF9fb2ZmIC09IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxpbnQ+OjpfX21heDsKKwl9CisgICAgICB0aGlzLT5wYnVtcChfX29mZik7CisgICAgfQorCisgIC8vIEluaGliaXQgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgZm9yIHJlcXVpcmVkIGluc3RhbnRpYXRpb25zLAorICAvLyB3aGljaCBhcmUgZGVmaW5lZCB2aWEgZXhwbGljaXQgaW5zdGFudGlhdGlvbnMgZWxzZXdoZXJlLgorI2lmIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURQorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfc3RyaW5nYnVmPGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfaXN0cmluZ3N0cmVhbTxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX29zdHJpbmdzdHJlYW08Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19zdHJpbmdzdHJlYW08Y2hhcj47CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfc3RyaW5nYnVmPHdjaGFyX3Q+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfaXN0cmluZ3N0cmVhbTx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX29zdHJpbmdzdHJlYW08d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19zdHJpbmdzdHJlYW08d2NoYXJfdD47CisjZW5kaWYKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfYWxnby5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9hbGdvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZhNzEzMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfYWxnby5oCkBAIC0wLDAgKzEsNjMyNCBAQAorLy8gQWxnb3JpdGhtIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfYWxnby5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7YWxnb3JpdGhtfQorICovCisKKyNpZm5kZWYgX1NUTF9BTEdPX0gKKyNkZWZpbmUgX1NUTF9BTEdPX0ggMQorCisjaW5jbHVkZSA8Y3N0ZGxpYj4gICAgICAgICAgICAgLy8gZm9yIHJhbmQKKyNpbmNsdWRlIDxiaXRzL2FsZ29yaXRobWZ3ZC5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2hlYXAuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF90ZW1wYnVmLmg+ICAvLyBmb3IgX1RlbXBvcmFyeV9idWZmZXIKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNpbmNsdWRlIDxyYW5kb20+ICAgICAvLyBmb3Igc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb24KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPiAvLyBmb3Igc3RkOjpiaW5kCisjZW5kaWYKKworLy8gU2VlIGNvbmNlcHRfY2hlY2suaCBmb3IgdGhlIF9fZ2xpYmN4eF8qX3JlcXVpcmVzIG1hY3Jvcy4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vLyBTd2FwcyB0aGUgbWVkaWFuIHZhbHVlIG9mICpfX2EsICpfX2IgYW5kICpfX2MgdG8gKl9fcmVzdWx0CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICB2b2lkCisgICAgX19tb3ZlX21lZGlhbl90b19maXJzdChfSXRlcmF0b3IgX19yZXN1bHQsIF9JdGVyYXRvciBfX2EsCisJCQkgICBfSXRlcmF0b3IgX19iLCBfSXRlcmF0b3IgX19jKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKworICAgICAgaWYgKCpfX2EgPCAqX19iKQorCXsKKwkgIGlmICgqX19iIDwgKl9fYykKKwkgICAgc3RkOjppdGVyX3N3YXAoX19yZXN1bHQsIF9fYik7CisJICBlbHNlIGlmICgqX19hIDwgKl9fYykKKwkgICAgc3RkOjppdGVyX3N3YXAoX19yZXN1bHQsIF9fYyk7CisJICBlbHNlCisJICAgIHN0ZDo6aXRlcl9zd2FwKF9fcmVzdWx0LCBfX2EpOworCX0KKyAgICAgIGVsc2UgaWYgKCpfX2EgPCAqX19jKQorICAgICAgCXN0ZDo6aXRlcl9zd2FwKF9fcmVzdWx0LCBfX2EpOworICAgICAgZWxzZSBpZiAoKl9fYiA8ICpfX2MpCisJc3RkOjppdGVyX3N3YXAoX19yZXN1bHQsIF9fYyk7CisgICAgICBlbHNlCisJc3RkOjppdGVyX3N3YXAoX19yZXN1bHQsIF9fYik7CisgICAgfQorCisgIC8vLyBTd2FwcyB0aGUgbWVkaWFuIHZhbHVlIG9mICpfX2EsICpfX2IgYW5kICpfX2MgdW5kZXIgX19jb21wIHRvICpfX3Jlc3VsdAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX21vdmVfbWVkaWFuX3RvX2ZpcnN0KF9JdGVyYXRvciBfX3Jlc3VsdCwgX0l0ZXJhdG9yIF9fYSwKKwkJCSAgIF9JdGVyYXRvciBfX2IsIF9JdGVyYXRvciBfX2MsCisJCQkgICBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5RnVuY3Rpb25Db25jZXB0PF9Db21wYXJlLCBib29sLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6dmFsdWVfdHlwZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorCisgICAgICBpZiAoX19jb21wKCpfX2EsICpfX2IpKQorCXsKKwkgIGlmIChfX2NvbXAoKl9fYiwgKl9fYykpCisJICAgIHN0ZDo6aXRlcl9zd2FwKF9fcmVzdWx0LCBfX2IpOworCSAgZWxzZSBpZiAoX19jb21wKCpfX2EsICpfX2MpKQorCSAgICBzdGQ6Oml0ZXJfc3dhcChfX3Jlc3VsdCwgX19jKTsKKwkgIGVsc2UKKwkgICAgc3RkOjppdGVyX3N3YXAoX19yZXN1bHQsIF9fYSk7CisJfQorICAgICAgZWxzZSBpZiAoX19jb21wKCpfX2EsICpfX2MpKQorCXN0ZDo6aXRlcl9zd2FwKF9fcmVzdWx0LCBfX2EpOworICAgICAgZWxzZSBpZiAoX19jb21wKCpfX2IsICpfX2MpKQorCXN0ZDo6aXRlcl9zd2FwKF9fcmVzdWx0LCBfX2MpOworICAgICAgZWxzZQorCXN0ZDo6aXRlcl9zd2FwKF9fcmVzdWx0LCBfX2IpOworICAgIH0KKworICAvLyBmb3JfZWFjaAorCisgIC8vLyBUaGlzIGlzIGFuIG92ZXJsb2FkIHVzZWQgYnkgZmluZCgpIGZvciB0aGUgSW5wdXQgSXRlcmF0b3IgY2FzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0lucHV0SXRlcmF0b3IKKyAgICBfX2ZpbmQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgIGNvbnN0IF9UcCYgX192YWwsIGlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgISgqX19maXJzdCA9PSBfX3ZhbCkpCisJKytfX2ZpcnN0OworICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGFuIG92ZXJsb2FkIHVzZWQgYnkgZmluZF9pZigpIGZvciB0aGUgSW5wdXQgSXRlcmF0b3IgY2FzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIF9JbnB1dEl0ZXJhdG9yCisgICAgX19maW5kX2lmKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgaW5wdXRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiAhYm9vbChfX3ByZWQoKl9fZmlyc3QpKSkKKwkrK19fZmlyc3Q7CisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYW4gb3ZlcmxvYWQgdXNlZCBieSBmaW5kKCkgZm9yIHRoZSBSQUkgY2FzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCisgICAgX19maW5kKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCSAgIGNvbnN0IF9UcCYgX192YWwsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfX3RyaXBfY291bnQgPSAoX19sYXN0IC0gX19maXJzdCkgPj4gMjsKKworICAgICAgZm9yICg7IF9fdHJpcF9jb3VudCA+IDA7IC0tX190cmlwX2NvdW50KQorCXsKKwkgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisKKwkgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisKKwkgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisKKwkgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisJfQorCisgICAgICBzd2l0Y2ggKF9fbGFzdCAtIF9fZmlyc3QpCisJeworCWNhc2UgMzoKKwkgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisJY2FzZSAyOgorCSAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKwljYXNlIDE6CisJICBpZiAoKl9fZmlyc3QgPT0gX192YWwpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCWNhc2UgMDoKKwlkZWZhdWx0OgorCSAgcmV0dXJuIF9fbGFzdDsKKwl9CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGFuIG92ZXJsb2FkIHVzZWQgYnkgZmluZF9pZigpIGZvciB0aGUgUkFJIGNhc2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IKKyAgICBfX2ZpbmRfaWYoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfX3RyaXBfY291bnQgPSAoX19sYXN0IC0gX19maXJzdCkgPj4gMjsKKworICAgICAgZm9yICg7IF9fdHJpcF9jb3VudCA+IDA7IC0tX190cmlwX2NvdW50KQorCXsKKwkgIGlmIChfX3ByZWQoKl9fZmlyc3QpKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKworCSAgaWYgKF9fcHJlZCgqX19maXJzdCkpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCisJICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisKKwkgIGlmIChfX3ByZWQoKl9fZmlyc3QpKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKwl9CisKKyAgICAgIHN3aXRjaCAoX19sYXN0IC0gX19maXJzdCkKKwl7CisJY2FzZSAzOgorCSAgaWYgKF9fcHJlZCgqX19maXJzdCkpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCWNhc2UgMjoKKwkgIGlmIChfX3ByZWQoKl9fZmlyc3QpKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKwljYXNlIDE6CisJICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisJY2FzZSAwOgorCWRlZmF1bHQ6CisJICByZXR1cm4gX19sYXN0OworCX0KKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYW4gb3ZlcmxvYWQgdXNlZCBieSBmaW5kX2lmX25vdCgpIGZvciB0aGUgSW5wdXQgSXRlcmF0b3IgY2FzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIF9JbnB1dEl0ZXJhdG9yCisgICAgX19maW5kX2lmX25vdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgX1ByZWRpY2F0ZSBfX3ByZWQsIGlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgYm9vbChfX3ByZWQoKl9fZmlyc3QpKSkKKwkrK19fZmlyc3Q7CisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYW4gb3ZlcmxvYWQgdXNlZCBieSBmaW5kX2lmX25vdCgpIGZvciB0aGUgUkFJIGNhc2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IKKyAgICBfX2ZpbmRfaWZfbm90KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCQkgIF9QcmVkaWNhdGUgX19wcmVkLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJX190cmlwX2NvdW50ID0gKF9fbGFzdCAtIF9fZmlyc3QpID4+IDI7CisKKyAgICAgIGZvciAoOyBfX3RyaXBfY291bnQgPiAwOyAtLV9fdHJpcF9jb3VudCkKKwl7CisJICBpZiAoIWJvb2woX19wcmVkKCpfX2ZpcnN0KSkpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCisJICBpZiAoIWJvb2woX19wcmVkKCpfX2ZpcnN0KSkpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCisJICBpZiAoIWJvb2woX19wcmVkKCpfX2ZpcnN0KSkpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCisJICBpZiAoIWJvb2woX19wcmVkKCpfX2ZpcnN0KSkpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCX0KKworICAgICAgc3dpdGNoIChfX2xhc3QgLSBfX2ZpcnN0KQorCXsKKwljYXNlIDM6CisJICBpZiAoIWJvb2woX19wcmVkKCpfX2ZpcnN0KSkpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCWNhc2UgMjoKKwkgIGlmICghYm9vbChfX3ByZWQoKl9fZmlyc3QpKSkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisJY2FzZSAxOgorCSAgaWYgKCFib29sKF9fcHJlZCgqX19maXJzdCkpKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKwljYXNlIDA6CisJZGVmYXVsdDoKKwkgIHJldHVybiBfX2xhc3Q7CisJfQorICAgIH0KKworICAvLy8gUHJvdmlkZWQgZm9yIHN0YWJsZV9wYXJ0aXRpb24gdG8gdXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX0lucHV0SXRlcmF0b3IKKyAgICBfX2ZpbmRfaWZfbm90KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICByZXR1cm4gc3RkOjpfX2ZpbmRfaWZfbm90KF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkLAorCQkJCXN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7CisgICAgfQorCisgIC8vLyBMaWtlIGZpbmRfaWZfbm90KCksIGJ1dCB1c2VzIGFuZCB1cGRhdGVzIGEgY291bnQgb2YgdGhlCisgIC8vLyByZW1haW5pbmcgcmFuZ2UgbGVuZ3RoIGluc3RlYWQgb2YgY29tcGFyaW5nIGFnYWluc3QgYW4gZW5kCisgIC8vLyBpdGVyYXRvci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGUsIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICBfSW5wdXRJdGVyYXRvcgorICAgIF9fZmluZF9pZl9ub3RfbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfRGlzdGFuY2UmIF9fbGVuLCBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICBmb3IgKDsgX19sZW47IC0tX19sZW4sICsrX19maXJzdCkKKwlpZiAoIWJvb2woX19wcmVkKCpfX2ZpcnN0KSkpCisJICBicmVhazsKKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0KKworICAvLyBzZXRfZGlmZmVyZW5jZQorICAvLyBzZXRfaW50ZXJzZWN0aW9uCisgIC8vIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZQorICAvLyBzZXRfdW5pb24KKyAgLy8gZm9yX2VhY2gKKyAgLy8gZmluZAorICAvLyBmaW5kX2lmCisgIC8vIGZpbmRfZmlyc3Rfb2YKKyAgLy8gYWRqYWNlbnRfZmluZAorICAvLyBjb3VudAorICAvLyBjb3VudF9pZgorICAvLyBzZWFyY2gKKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gdWdsaWZpZWQKKyAgICogIHNlYXJjaF9uKF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3IsIF9JbnRlZ2VyLCBjb25zdCBfVHAmKQorICAgKiAgb3ZlcmxvYWRlZCBmb3IgZm9yd2FyZCBpdGVyYXRvcnMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9JbnRlZ2VyLCB0eXBlbmFtZSBfVHA+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIF9fc2VhcmNoX24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICAgX0ludGVnZXIgX19jb3VudCwgY29uc3QgX1RwJiBfX3ZhbCwKKwkgICAgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBfX2ZpcnN0ID0gX0dMSUJDWFhfU1REX0E6OmZpbmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbCk7CisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJeworCSAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwkgICAgX19uID0gX19jb3VudDsKKwkgIF9Gb3J3YXJkSXRlcmF0b3IgX19pID0gX19maXJzdDsKKwkgICsrX19pOworCSAgd2hpbGUgKF9faSAhPSBfX2xhc3QgJiYgX19uICE9IDEgJiYgKl9faSA9PSBfX3ZhbCkKKwkgICAgeworCSAgICAgICsrX19pOworCSAgICAgIC0tX19uOworCSAgICB9CisJICBpZiAoX19uID09IDEpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgaWYgKF9faSA9PSBfX2xhc3QpCisJICAgIHJldHVybiBfX2xhc3Q7CisJICBfX2ZpcnN0ID0gX0dMSUJDWFhfU1REX0E6OmZpbmQoKytfX2ksIF9fbGFzdCwgX192YWwpOworCX0KKyAgICAgIHJldHVybiBfX2xhc3Q7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiB1Z2xpZmllZAorICAgKiAgc2VhcmNoX24oX0ZvcndhcmRJdGVyYXRvciwgX0ZvcndhcmRJdGVyYXRvciwgX0ludGVnZXIsIGNvbnN0IF9UcCYpCisgICAqICBvdmVybG9hZGVkIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXIsIHR5cGVuYW1lIF9JbnRlZ2VyLCB0eXBlbmFtZSBfVHA+CisgICAgX1JhbmRvbUFjY2Vzc0l0ZXIKKyAgICBfX3NlYXJjaF9uKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwKKwkgICAgICAgX0ludGVnZXIgX19jb3VudCwgY29uc3QgX1RwJiBfX3ZhbCwgCisJICAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisJX0Rpc3RhbmNlVHlwZTsKKworICAgICAgX0Rpc3RhbmNlVHlwZSBfX3RhaWxTaXplID0gX19sYXN0IC0gX19maXJzdDsKKyAgICAgIF9EaXN0YW5jZVR5cGUgX19yZW1haW5kZXIgPSBfX2NvdW50OworCisgICAgICB3aGlsZSAoX19yZW1haW5kZXIgPD0gX190YWlsU2l6ZSkgLy8gdGhlIG1haW4gbG9vcC4uLgorCXsKKwkgIF9fZmlyc3QgKz0gX19yZW1haW5kZXI7CisJICBfX3RhaWxTaXplIC09IF9fcmVtYWluZGVyOworCSAgLy8gX19maXJzdCBoZXJlIGlzIGFsd2F5cyBwb2ludGluZyB0byBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50IG9mCisJICAvLyBuZXh0IHBvc3NpYmxlIG1hdGNoLgorCSAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19iYWNrVHJhY2sgPSBfX2ZpcnN0OyAKKwkgIHdoaWxlICgqLS1fX2JhY2tUcmFjayA9PSBfX3ZhbCkKKwkgICAgeworCSAgICAgIGlmICgtLV9fcmVtYWluZGVyID09IDApCisJICAgICAgICByZXR1cm4gKF9fZmlyc3QgLSBfX2NvdW50KTsgLy8gU3VjY2VzcworCSAgICB9CisJICBfX3JlbWFpbmRlciA9IF9fY291bnQgKyAxIC0gKF9fZmlyc3QgLSBfX2JhY2tUcmFjayk7CisJfQorICAgICAgcmV0dXJuIF9fbGFzdDsgLy8gRmFpbHVyZQorICAgIH0KKworICAvLyBzZWFyY2hfbgorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiB1Z2xpZmllZAorICAgKiAgc2VhcmNoX24oX0ZvcndhcmRJdGVyYXRvciwgX0ZvcndhcmRJdGVyYXRvciwgX0ludGVnZXIsIGNvbnN0IF9UcCYsCisgICAqCSAgICAgICBfQmluYXJ5UHJlZGljYXRlKQorICAgKiAgb3ZlcmxvYWRlZCBmb3IgZm9yd2FyZCBpdGVyYXRvcnMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9JbnRlZ2VyLCB0eXBlbmFtZSBfVHAsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIF9fc2VhcmNoX24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICAgX0ludGVnZXIgX19jb3VudCwgY29uc3QgX1RwJiBfX3ZhbCwKKwkgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkLCBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiAhYm9vbChfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0LCBfX3ZhbCkpKQorICAgICAgICArK19fZmlyc3Q7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCSAgICBfX24gPSBfX2NvdW50OworCSAgX0ZvcndhcmRJdGVyYXRvciBfX2kgPSBfX2ZpcnN0OworCSAgKytfX2k7CisJICB3aGlsZSAoX19pICE9IF9fbGFzdCAmJiBfX24gIT0gMSAmJiBib29sKF9fYmluYXJ5X3ByZWQoKl9faSwgX192YWwpKSkKKwkgICAgeworCSAgICAgICsrX19pOworCSAgICAgIC0tX19uOworCSAgICB9CisJICBpZiAoX19uID09IDEpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgaWYgKF9faSA9PSBfX2xhc3QpCisJICAgIHJldHVybiBfX2xhc3Q7CisJICBfX2ZpcnN0ID0gKytfX2k7CisJICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QKKwkJICYmICFib29sKF9fYmluYXJ5X3ByZWQoKl9fZmlyc3QsIF9fdmFsKSkpCisJICAgICsrX19maXJzdDsKKwl9CisgICAgICByZXR1cm4gX19sYXN0OworICAgIH0KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gdWdsaWZpZWQKKyAgICogIHNlYXJjaF9uKF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3IsIF9JbnRlZ2VyLCBjb25zdCBfVHAmLAorICAgKgkgICAgICAgX0JpbmFyeVByZWRpY2F0ZSkKKyAgICogIG92ZXJsb2FkZWQgZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlciwgdHlwZW5hbWUgX0ludGVnZXIsIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIF9SYW5kb21BY2Nlc3NJdGVyCisgICAgX19zZWFyY2hfbihfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCisJICAgICAgIF9JbnRlZ2VyIF9fY291bnQsIGNvbnN0IF9UcCYgX192YWwsCisJICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCwgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2VUeXBlOworCisgICAgICBfRGlzdGFuY2VUeXBlIF9fdGFpbFNpemUgPSBfX2xhc3QgLSBfX2ZpcnN0OworICAgICAgX0Rpc3RhbmNlVHlwZSBfX3JlbWFpbmRlciA9IF9fY291bnQ7CisKKyAgICAgIHdoaWxlIChfX3JlbWFpbmRlciA8PSBfX3RhaWxTaXplKSAvLyB0aGUgbWFpbiBsb29wLi4uCisJeworCSAgX19maXJzdCArPSBfX3JlbWFpbmRlcjsKKwkgIF9fdGFpbFNpemUgLT0gX19yZW1haW5kZXI7CisJICAvLyBfX2ZpcnN0IGhlcmUgaXMgYWx3YXlzIHBvaW50aW5nIHRvIG9uZSBwYXN0IHRoZSBsYXN0IGVsZW1lbnQgb2YKKwkgIC8vIG5leHQgcG9zc2libGUgbWF0Y2guCisJICBfUmFuZG9tQWNjZXNzSXRlciBfX2JhY2tUcmFjayA9IF9fZmlyc3Q7IAorCSAgd2hpbGUgKF9fYmluYXJ5X3ByZWQoKi0tX19iYWNrVHJhY2ssIF9fdmFsKSkKKwkgICAgeworCSAgICAgIGlmICgtLV9fcmVtYWluZGVyID09IDApCisJICAgICAgICByZXR1cm4gKF9fZmlyc3QgLSBfX2NvdW50KTsgLy8gU3VjY2VzcworCSAgICB9CisJICBfX3JlbWFpbmRlciA9IF9fY291bnQgKyAxIC0gKF9fZmlyc3QgLSBfX2JhY2tUcmFjayk7CisJfQorICAgICAgcmV0dXJuIF9fbGFzdDsgLy8gRmFpbHVyZQorICAgIH0KKworICAvLyBmaW5kX2VuZCBmb3IgZm9yd2FyZCBpdGVyYXRvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IxLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMj4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yMQorICAgIF9fZmluZF9lbmQoX0ZvcndhcmRJdGVyYXRvcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcmF0b3IxIF9fbGFzdDEsCisJICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXJhdG9yMiBfX2xhc3QyLAorCSAgICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZywgZm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgaWYgKF9fZmlyc3QyID09IF9fbGFzdDIpCisJcmV0dXJuIF9fbGFzdDE7CisgICAgICBlbHNlCisJeworCSAgX0ZvcndhcmRJdGVyYXRvcjEgX19yZXN1bHQgPSBfX2xhc3QxOworCSAgd2hpbGUgKDEpCisJICAgIHsKKwkgICAgICBfRm9yd2FyZEl0ZXJhdG9yMSBfX25ld19yZXN1bHQKKwkJPSBfR0xJQkNYWF9TVERfQTo6c2VhcmNoKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0Mik7CisJICAgICAgaWYgKF9fbmV3X3Jlc3VsdCA9PSBfX2xhc3QxKQorCQlyZXR1cm4gX19yZXN1bHQ7CisJICAgICAgZWxzZQorCQl7CisJCSAgX19yZXN1bHQgPSBfX25ld19yZXN1bHQ7CisJCSAgX19maXJzdDEgPSBfX25ld19yZXN1bHQ7CisJCSAgKytfX2ZpcnN0MTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yMQorICAgIF9fZmluZF9lbmQoX0ZvcndhcmRJdGVyYXRvcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcmF0b3IxIF9fbGFzdDEsCisJICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXJhdG9yMiBfX2xhc3QyLAorCSAgICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZywgZm9yd2FyZF9pdGVyYXRvcl90YWcsCisJICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19jb21wKQorICAgIHsKKyAgICAgIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQorCXJldHVybiBfX2xhc3QxOworICAgICAgZWxzZQorCXsKKwkgIF9Gb3J3YXJkSXRlcmF0b3IxIF9fcmVzdWx0ID0gX19sYXN0MTsKKwkgIHdoaWxlICgxKQorCSAgICB7CisJICAgICAgX0ZvcndhcmRJdGVyYXRvcjEgX19uZXdfcmVzdWx0CisJCT0gX0dMSUJDWFhfU1REX0E6OnNlYXJjaChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsCisJCQkJCSBfX2xhc3QyLCBfX2NvbXApOworCSAgICAgIGlmIChfX25ld19yZXN1bHQgPT0gX19sYXN0MSkKKwkJcmV0dXJuIF9fcmVzdWx0OworCSAgICAgIGVsc2UKKwkJeworCQkgIF9fcmVzdWx0ID0gX19uZXdfcmVzdWx0OworCQkgIF9fZmlyc3QxID0gX19uZXdfcmVzdWx0OworCQkgICsrX19maXJzdDE7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgLy8gZmluZF9lbmQgZm9yIGJpZGlyZWN0aW9uYWwgaXRlcmF0b3JzIChtdWNoIGZhc3RlcikuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxLCB0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMj4KKyAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMQorICAgIF9fZmluZF9lbmQoX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEgX19maXJzdDEsCisJICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxIF9fbGFzdDEsCisJICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyIF9fZmlyc3QyLAorCSAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMiBfX2xhc3QyLAorCSAgICAgICBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZywgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyPikKKworICAgICAgdHlwZWRlZiByZXZlcnNlX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxPiBfUmV2SXRlcmF0b3IxOworICAgICAgdHlwZWRlZiByZXZlcnNlX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyPiBfUmV2SXRlcmF0b3IyOworCisgICAgICBfUmV2SXRlcmF0b3IxIF9fcmxhc3QxKF9fZmlyc3QxKTsKKyAgICAgIF9SZXZJdGVyYXRvcjIgX19ybGFzdDIoX19maXJzdDIpOworICAgICAgX1Jldkl0ZXJhdG9yMSBfX3JyZXN1bHQgPSBfR0xJQkNYWF9TVERfQTo6c2VhcmNoKF9SZXZJdGVyYXRvcjEoX19sYXN0MSksCisJCQkJCQkgICAgICAgX19ybGFzdDEsCisJCQkJCQkgICAgICAgX1Jldkl0ZXJhdG9yMihfX2xhc3QyKSwKKwkJCQkJCSAgICAgICBfX3JsYXN0Mik7CisKKyAgICAgIGlmIChfX3JyZXN1bHQgPT0gX19ybGFzdDEpCisJcmV0dXJuIF9fbGFzdDE7CisgICAgICBlbHNlCisJeworCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEgX19yZXN1bHQgPSBfX3JyZXN1bHQuYmFzZSgpOworCSAgc3RkOjphZHZhbmNlKF9fcmVzdWx0LCAtc3RkOjpkaXN0YW5jZShfX2ZpcnN0MiwgX19sYXN0MikpOworCSAgcmV0dXJuIF9fcmVzdWx0OworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEsIHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEKKyAgICBfX2ZpbmRfZW5kKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxIF9fZmlyc3QxLAorCSAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMSBfX2xhc3QxLAorCSAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMiBfX2ZpcnN0MiwKKwkgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjIgX19sYXN0MiwKKwkgICAgICAgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcsIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnLAorCSAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fY29tcCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjI+KQorCisgICAgICB0eXBlZGVmIHJldmVyc2VfaXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcjE+IF9SZXZJdGVyYXRvcjE7CisgICAgICB0eXBlZGVmIHJldmVyc2VfaXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcjI+IF9SZXZJdGVyYXRvcjI7CisKKyAgICAgIF9SZXZJdGVyYXRvcjEgX19ybGFzdDEoX19maXJzdDEpOworICAgICAgX1Jldkl0ZXJhdG9yMiBfX3JsYXN0MihfX2ZpcnN0Mik7CisgICAgICBfUmV2SXRlcmF0b3IxIF9fcnJlc3VsdCA9IHN0ZDo6c2VhcmNoKF9SZXZJdGVyYXRvcjEoX19sYXN0MSksIF9fcmxhc3QxLAorCQkJCQkgICAgX1Jldkl0ZXJhdG9yMihfX2xhc3QyKSwgX19ybGFzdDIsCisJCQkJCSAgICBfX2NvbXApOworCisgICAgICBpZiAoX19ycmVzdWx0ID09IF9fcmxhc3QxKQorCXJldHVybiBfX2xhc3QxOworICAgICAgZWxzZQorCXsKKwkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxIF9fcmVzdWx0ID0gX19ycmVzdWx0LmJhc2UoKTsKKwkgIHN0ZDo6YWR2YW5jZShfX3Jlc3VsdCwgLXN0ZDo6ZGlzdGFuY2UoX19maXJzdDIsIF9fbGFzdDIpKTsKKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgbWF0Y2hpbmcgc3Vic2VxdWVuY2UgaW4gYSBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QxICBTdGFydCBvZiByYW5nZSB0byBzZWFyY2guCisgICAqICBAcGFyYW0gIF9fbGFzdDEgICBFbmQgb2YgcmFuZ2UgdG8gc2VhcmNoLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgU3RhcnQgb2Ygc2VxdWVuY2UgdG8gbWF0Y2guCisgICAqICBAcGFyYW0gIF9fbGFzdDIgICBFbmQgb2Ygc2VxdWVuY2UgdG8gbWF0Y2guCisgICAqICBAcmV0dXJuICAgVGhlIGxhc3QgaXRlcmF0b3IgQGMgaSBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtfX2ZpcnN0MSxfX2xhc3QxLShfX2xhc3QyLV9fZmlyc3QyKSkgc3VjaCB0aGF0IEBjICooaStOKSA9PQorICAgKiAgQHAgKihfX2ZpcnN0MitOKSBmb3IgZWFjaCBAYyBOIGluIHRoZSByYW5nZSBAcAorICAgKiAgWzAsX19sYXN0Mi1fX2ZpcnN0MiksIG9yIEBwIF9fbGFzdDEgaWYgbm8gc3VjaCBpdGVyYXRvciBleGlzdHMuCisgICAqCisgICAqICBTZWFyY2hlcyB0aGUgcmFuZ2UgQHAgW19fZmlyc3QxLF9fbGFzdDEpIGZvciBhIHN1Yi1zZXF1ZW5jZSB0aGF0CisgICAqICBjb21wYXJlcyBlcXVhbCB2YWx1ZS1ieS12YWx1ZSB3aXRoIHRoZSBzZXF1ZW5jZSBnaXZlbiBieSBAcAorICAgKiAgW19fZmlyc3QyLF9fbGFzdDIpIGFuZCByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBfX2ZpcnN0CisgICAqICBlbGVtZW50IG9mIHRoZSBzdWItc2VxdWVuY2UsIG9yIEBwIF9fbGFzdDEgaWYgdGhlIHN1Yi1zZXF1ZW5jZQorICAgKiAgaXMgbm90IGZvdW5kLiAgVGhlIHN1Yi1zZXF1ZW5jZSB3aWxsIGJlIHRoZSBsYXN0IHN1Y2gKKyAgICogIHN1YnNlcXVlbmNlIGNvbnRhaW5lZCBpbiBbX19maXJzdCxfX2xhc3QxKS4KKyAgICoKKyAgICogIEJlY2F1c2UgdGhlIHN1Yi1zZXF1ZW5jZSBtdXN0IGxpZSBjb21wbGV0ZWx5IHdpdGhpbiB0aGUgcmFuZ2UgQHAKKyAgICogIFtfX2ZpcnN0MSxfX2xhc3QxKSBpdCBtdXN0IHN0YXJ0IGF0IGEgcG9zaXRpb24gbGVzcyB0aGFuIEBwCisgICAqICBfX2xhc3QxLShfX2xhc3QyLV9fZmlyc3QyKSB3aGVyZSBAcCBfX2xhc3QyLV9fZmlyc3QyIGlzIHRoZQorICAgKiAgbGVuZ3RoIG9mIHRoZSBzdWItc2VxdWVuY2UuICBUaGlzIG1lYW5zIHRoYXQgdGhlIHJldHVybmVkCisgICAqICBpdGVyYXRvciBAYyBpIHdpbGwgYmUgaW4gdGhlIHJhbmdlIEBwCisgICAqICBbX19maXJzdDEsX19sYXN0MS0oX19sYXN0Mi1fX2ZpcnN0MikpCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IxLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMj4KKyAgICBpbmxpbmUgX0ZvcndhcmRJdGVyYXRvcjEKKyAgICBmaW5kX2VuZChfRm9yd2FyZEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyYXRvcjEgX19sYXN0MSwKKwkgICAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXJhdG9yMiBfX2xhc3QyKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRXF1YWxPcENvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MiwgX19sYXN0Mik7CisKKyAgICAgIHJldHVybiBzdGQ6Ol9fZmluZF9lbmQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLAorCQkJICAgICBzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdDEpLAorCQkJICAgICBzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdDIpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBtYXRjaGluZyBzdWJzZXF1ZW5jZSBpbiBhIHNlcXVlbmNlIHVzaW5nIGEgcHJlZGljYXRlLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdDEgIFN0YXJ0IG9mIHJhbmdlIHRvIHNlYXJjaC4KKyAgICogIEBwYXJhbSAgX19sYXN0MSAgIEVuZCBvZiByYW5nZSB0byBzZWFyY2guCisgICAqICBAcGFyYW0gIF9fZmlyc3QyICBTdGFydCBvZiBzZXF1ZW5jZSB0byBtYXRjaC4KKyAgICogIEBwYXJhbSAgX19sYXN0MiAgIEVuZCBvZiBzZXF1ZW5jZSB0byBtYXRjaC4KKyAgICogIEBwYXJhbSAgX19jb21wICAgIFRoZSBwcmVkaWNhdGUgdG8gdXNlLgorICAgKiAgQHJldHVybiBUaGUgbGFzdCBpdGVyYXRvciBAYyBpIGluIHRoZSByYW5nZSBAcAorICAgKiAgW19fZmlyc3QxLF9fbGFzdDEtKF9fbGFzdDItX19maXJzdDIpKSBzdWNoIHRoYXQgQGMKKyAgICogIHByZWRpY2F0ZSgqKGkrTiksIEBwIChfX2ZpcnN0MitOKSkgaXMgdHJ1ZSBmb3IgZWFjaCBAYyBOIGluIHRoZQorICAgKiAgcmFuZ2UgQHAgWzAsX19sYXN0Mi1fX2ZpcnN0MiksIG9yIEBwIF9fbGFzdDEgaWYgbm8gc3VjaCBpdGVyYXRvcgorICAgKiAgZXhpc3RzLgorICAgKgorICAgKiAgU2VhcmNoZXMgdGhlIHJhbmdlIEBwIFtfX2ZpcnN0MSxfX2xhc3QxKSBmb3IgYSBzdWItc2VxdWVuY2UgdGhhdAorICAgKiAgY29tcGFyZXMgZXF1YWwgdmFsdWUtYnktdmFsdWUgd2l0aCB0aGUgc2VxdWVuY2UgZ2l2ZW4gYnkgQHAKKyAgICogIFtfX2ZpcnN0MixfX2xhc3QyKSB1c2luZyBjb21wIGFzIGEgcHJlZGljYXRlIGFuZCByZXR1cm5zIGFuCisgICAqICBpdGVyYXRvciB0byB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgc3ViLXNlcXVlbmNlLCBvciBAcCBfX2xhc3QxCisgICAqICBpZiB0aGUgc3ViLXNlcXVlbmNlIGlzIG5vdCBmb3VuZC4gIFRoZSBzdWItc2VxdWVuY2Ugd2lsbCBiZSB0aGUKKyAgICogIGxhc3Qgc3VjaCBzdWJzZXF1ZW5jZSBjb250YWluZWQgaW4gW19fZmlyc3QsX19sYXN0MSkuCisgICAqCisgICAqICBCZWNhdXNlIHRoZSBzdWItc2VxdWVuY2UgbXVzdCBsaWUgY29tcGxldGVseSB3aXRoaW4gdGhlIHJhbmdlIEBwCisgICAqICBbX19maXJzdDEsX19sYXN0MSkgaXQgbXVzdCBzdGFydCBhdCBhIHBvc2l0aW9uIGxlc3MgdGhhbiBAcAorICAgKiAgX19sYXN0MS0oX19sYXN0Mi1fX2ZpcnN0Mikgd2hlcmUgQHAgX19sYXN0Mi1fX2ZpcnN0MiBpcyB0aGUKKyAgICogIGxlbmd0aCBvZiB0aGUgc3ViLXNlcXVlbmNlLiAgVGhpcyBtZWFucyB0aGF0IHRoZSByZXR1cm5lZAorICAgKiAgaXRlcmF0b3IgQGMgaSB3aWxsIGJlIGluIHRoZSByYW5nZSBAcAorICAgKiAgW19fZmlyc3QxLF9fbGFzdDEtKF9fbGFzdDItX19maXJzdDIpKQorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX0ZvcndhcmRJdGVyYXRvcjEKKyAgICBmaW5kX2VuZChfRm9yd2FyZEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyYXRvcjEgX19sYXN0MSwKKwkgICAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXJhdG9yMiBfX2xhc3QyLAorCSAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2NvbXApCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcjI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9CaW5hcnlQcmVkaWNhdGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MiwgX19sYXN0Mik7CisKKyAgICAgIHJldHVybiBzdGQ6Ol9fZmluZF9lbmQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLAorCQkJICAgICBzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdDEpLAorCQkJICAgICBzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdDIpLAorCQkJICAgICBfX2NvbXApOworICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgLyoqCisgICAqICBAYnJpZWYgIENoZWNrcyB0aGF0IGEgcHJlZGljYXRlIGlzIHRydWUgZm9yIGFsbCB0aGUgZWxlbWVudHMKKyAgICogICAgICAgICAgb2YgYSBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ByZWQgICAgQSBwcmVkaWNhdGUuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIHRoZSBjaGVjayBpcyB0cnVlLCBmYWxzZSBvdGhlcndpc2UuCisgICAqCisgICAqICBSZXR1cm5zIHRydWUgaWYgQHAgX19wcmVkIGlzIHRydWUgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtfX2ZpcnN0LF9fbGFzdCksIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBib29sCisgICAgYWxsX29mKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgeyByZXR1cm4gX19sYXN0ID09IHN0ZDo6ZmluZF9pZl9ub3QoX19maXJzdCwgX19sYXN0LCBfX3ByZWQpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENoZWNrcyB0aGF0IGEgcHJlZGljYXRlIGlzIGZhbHNlIGZvciBhbGwgdGhlIGVsZW1lbnRzCisgICAqICAgICAgICAgIG9mIGEgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19wcmVkICAgIEEgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiB0aGUgY2hlY2sgaXMgdHJ1ZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKgorICAgKiAgUmV0dXJucyB0cnVlIGlmIEBwIF9fcHJlZCBpcyBmYWxzZSBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSByYW5nZQorICAgKiAgQHAgW19fZmlyc3QsX19sYXN0KSwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBub25lX29mKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgeyByZXR1cm4gX19sYXN0ID09IF9HTElCQ1hYX1NURF9BOjpmaW5kX2lmKF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBDaGVja3MgdGhhdCBhIHByZWRpY2F0ZSBpcyBmYWxzZSBmb3IgYXQgbGVhc3QgYW4gZWxlbWVudAorICAgKiAgICAgICAgICBvZiBhIHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcHJlZCAgICBBIHByZWRpY2F0ZS4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgdGhlIGNoZWNrIGlzIHRydWUsIGZhbHNlIG90aGVyd2lzZS4KKyAgICoKKyAgICogIFJldHVybnMgdHJ1ZSBpZiBhbiBlbGVtZW50IGV4aXN0cyBpbiB0aGUgcmFuZ2UgQHAKKyAgICogIFtfX2ZpcnN0LF9fbGFzdCkgc3VjaCB0aGF0IEBwIF9fcHJlZCBpcyB0cnVlLCBhbmQgZmFsc2UKKyAgICogIG90aGVyd2lzZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBhbnlfb2YoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7IHJldHVybiAhc3RkOjpub25lX29mKF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBGaW5kIHRoZSBmaXJzdCBlbGVtZW50IGluIGEgc2VxdWVuY2UgZm9yIHdoaWNoIGEKKyAgICogICAgICAgICAgcHJlZGljYXRlIGlzIGZhbHNlLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ByZWQgICBBIHByZWRpY2F0ZS4KKyAgICogIEByZXR1cm4gICBUaGUgZmlyc3QgaXRlcmF0b3IgQGMgaSBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KQorICAgKiAgc3VjaCB0aGF0IEBwIF9fcHJlZCgqaSkgaXMgZmFsc2UsIG9yIEBwIF9fbGFzdCBpZiBubyBzdWNoIGl0ZXJhdG9yIGV4aXN0cy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIF9JbnB1dEl0ZXJhdG9yCisgICAgZmluZF9pZl9ub3QoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQlfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1VuYXJ5UHJlZGljYXRlQ29uY2VwdDxfUHJlZGljYXRlLAorCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICByZXR1cm4gc3RkOjpfX2ZpbmRfaWZfbm90KF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzZXF1ZW5jZSBpcyBwYXJ0aXRpb25lZC4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ByZWQgICBBIHByZWRpY2F0ZS4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LF9fbGFzdCkgaXMgcGFydGlvbmVkIGJ5IEBwIF9fcHJlZCwKKyAgICogIGkuZS4gaWYgYWxsIGVsZW1lbnRzIHRoYXQgc2F0aXNmeSBAcCBfX3ByZWQgYXBwZWFyIGJlZm9yZSB0aG9zZSB0aGF0CisgICAqICBkbyBub3QuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBib29sCisgICAgaXNfcGFydGl0aW9uZWQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgICBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICBfX2ZpcnN0ID0gc3RkOjpmaW5kX2lmX25vdChfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCk7CisgICAgICByZXR1cm4gc3RkOjpub25lX29mKF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEZpbmQgdGhlIHBhcnRpdGlvbiBwb2ludCBvZiBhIHBhcnRpdGlvbmVkIHJhbmdlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ByZWQgICAgQSBwcmVkaWNhdGUuCisgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciBAcCBtaWQgc3VjaCB0aGF0IEBwIGFsbF9vZihfX2ZpcnN0LCBtaWQsIF9fcHJlZCkKKyAgICogICAgICAgICAgIGFuZCBAcCBub25lX29mKG1pZCwgX19sYXN0LCBfX3ByZWQpIGFyZSBib3RoIHRydWUuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIHBhcnRpdGlvbl9wb2ludChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgICAgX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfVW5hcnlQcmVkaWNhdGVDb25jZXB0PF9QcmVkaWNhdGUsCisJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKworICAgICAgLy8gQSBzcGVjaWZpYyBkZWJ1Zy1tb2RlIHRlc3Qgd2lsbCBiZSBuZWNlc3NhcnkuLi4KKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJX0Rpc3RhbmNlVHlwZTsKKworICAgICAgX0Rpc3RhbmNlVHlwZSBfX2xlbiA9IHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIF9EaXN0YW5jZVR5cGUgX19oYWxmOworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX21pZGRsZTsKKworICAgICAgd2hpbGUgKF9fbGVuID4gMCkKKwl7CisJICBfX2hhbGYgPSBfX2xlbiA+PiAxOworCSAgX19taWRkbGUgPSBfX2ZpcnN0OworCSAgc3RkOjphZHZhbmNlKF9fbWlkZGxlLCBfX2hhbGYpOworCSAgaWYgKF9fcHJlZCgqX19taWRkbGUpKQorCSAgICB7CisJICAgICAgX19maXJzdCA9IF9fbWlkZGxlOworCSAgICAgICsrX19maXJzdDsKKwkgICAgICBfX2xlbiA9IF9fbGVuIC0gX19oYWxmIC0gMTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBfX2xlbiA9IF9faGFsZjsKKwl9CisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICB9CisjZW5kaWYKKworCisgIC8qKgorICAgKiAgQGJyaWVmIENvcHkgYSBzZXF1ZW5jZSwgcmVtb3ZpbmcgZWxlbWVudHMgb2YgYSBnaXZlbiB2YWx1ZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcmVzdWx0ICBBbiBvdXRwdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fdmFsdWUgICBUaGUgdmFsdWUgdG8gYmUgcmVtb3ZlZC4KKyAgICogIEByZXR1cm4gICBBbiBpdGVyYXRvciBkZXNpZ25hdGluZyB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UuCisgICAqCisgICAqICBDb3BpZXMgZWFjaCBlbGVtZW50IGluIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpIG5vdCBlcXVhbAorICAgKiAgdG8gQHAgX192YWx1ZSB0byB0aGUgcmFuZ2UgYmVnaW5uaW5nIGF0IEBwIF9fcmVzdWx0LgorICAgKiAgcmVtb3ZlX2NvcHkoKSBpcyBzdGFibGUsIHNvIHRoZSByZWxhdGl2ZSBvcmRlciBvZiBlbGVtZW50cyB0aGF0CisgICAqICBhcmUgY29waWVkIGlzIHVuY2hhbmdlZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHJlbW92ZV9jb3B5KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBjb25zdCBfVHAmIF9fdmFsdWUpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRXF1YWxPcENvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGUsIF9UcD4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJaWYgKCEoKl9fZmlyc3QgPT0gX192YWx1ZSkpCisJICB7CisJICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworCSAgICArK19fcmVzdWx0OworCSAgfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBDb3B5IGEgc2VxdWVuY2UsIHJlbW92aW5nIGVsZW1lbnRzIGZvciB3aGljaCBhIHByZWRpY2F0ZSBpcyB0cnVlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19yZXN1bHQgIEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19wcmVkICAgIEEgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiAgIEFuIGl0ZXJhdG9yIGRlc2lnbmF0aW5nIHRoZSBlbmQgb2YgdGhlIHJlc3VsdGluZyBzZXF1ZW5jZS4KKyAgICoKKyAgICogIENvcGllcyBlYWNoIGVsZW1lbnQgaW4gdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LF9fbGFzdCkgZm9yIHdoaWNoCisgICAqICBAcCBfX3ByZWQgcmV0dXJucyBmYWxzZSB0byB0aGUgcmFuZ2UgYmVnaW5uaW5nIGF0IEBwIF9fcmVzdWx0LgorICAgKgorICAgKiAgcmVtb3ZlX2NvcHlfaWYoKSBpcyBzdGFibGUsIHNvIHRoZSByZWxhdGl2ZSBvcmRlciBvZiBlbGVtZW50cyB0aGF0IGFyZQorICAgKiAgY29waWVkIGlzIHVuY2hhbmdlZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHJlbW92ZV9jb3B5X2lmKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9VbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X1ByZWRpY2F0ZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJaWYgKCFib29sKF9fcHJlZCgqX19maXJzdCkpKQorCSAgeworCSAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKwkgICAgKytfX3Jlc3VsdDsKKwkgIH0KKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIC8qKgorICAgKiAgQGJyaWVmIENvcHkgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgZm9yIHdoaWNoIGEgcHJlZGljYXRlIGlzIHRydWUuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3Jlc3VsdCAgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ByZWQgICAgQSBwcmVkaWNhdGUuCisgICAqICBAcmV0dXJuICAgQW4gaXRlcmF0b3IgZGVzaWduYXRpbmcgdGhlIGVuZCBvZiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlLgorICAgKgorICAgKiAgQ29waWVzIGVhY2ggZWxlbWVudCBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSBmb3Igd2hpY2gKKyAgICogIEBwIF9fcHJlZCByZXR1cm5zIHRydWUgdG8gdGhlIHJhbmdlIGJlZ2lubmluZyBhdCBAcCBfX3Jlc3VsdC4KKyAgICoKKyAgICogIGNvcHlfaWYoKSBpcyBzdGFibGUsIHNvIHRoZSByZWxhdGl2ZSBvcmRlciBvZiBlbGVtZW50cyB0aGF0IGFyZQorICAgKiAgY29waWVkIGlzIHVuY2hhbmdlZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIGNvcHlfaWYoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1VuYXJ5UHJlZGljYXRlQ29uY2VwdDxfUHJlZGljYXRlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwlpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKwkgIHsKKwkgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisJICAgICsrX19yZXN1bHQ7CisJICB9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgX19jb3B5X24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19uLAorCSAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBpbnB1dF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgaWYgKF9fbiA+IDApCisJeworCSAgd2hpbGUgKHRydWUpCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKwkgICAgICArK19fcmVzdWx0OworCSAgICAgIGlmICgtLV9fbiA+IDApCisJCSsrX19maXJzdDsKKwkgICAgICBlbHNlCisJCWJyZWFrOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLAorCSAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgX19jb3B5X24oX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fbiwKKwkgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeyByZXR1cm4gc3RkOjpjb3B5KF9fZmlyc3QsIF9fZmlyc3QgKyBfX24sIF9fcmVzdWx0KTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENvcGllcyB0aGUgcmFuZ2UgW2ZpcnN0LGZpcnN0K24pIGludG8gW3Jlc3VsdCxyZXN1bHQrbikuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX24gICAgICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGNvcHkuCisgICAqICBAcGFyYW0gIF9fcmVzdWx0IEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gIHJlc3VsdCtuLgorICAgKgorICAgKiAgVGhpcyBpbmxpbmUgZnVuY3Rpb24gd2lsbCBib2lsIGRvd24gdG8gYSBjYWxsIHRvIEBjIG1lbW1vdmUgd2hlbmV2ZXIKKyAgICogIHBvc3NpYmxlLiAgRmFpbGluZyB0aGF0LCBpZiByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycyBhcmUgcGFzc2VkLCB0aGVuIHRoZQorICAgKiAgbG9vcCBjb3VudCB3aWxsIGJlIGtub3duIChhbmQgdGhlcmVmb3JlIGEgY2FuZGlkYXRlIGZvciBjb21waWxlcgorICAgKiAgb3B0aW1pemF0aW9ucyBzdWNoIGFzIHVucm9sbGluZykuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBjb3B5X24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19uLCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKworICAgICAgcmV0dXJuIHN0ZDo6X19jb3B5X24oX19maXJzdCwgX19uLCBfX3Jlc3VsdCwKKwkJCSAgIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENvcHkgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgdG8gc2VwYXJhdGUgb3V0cHV0IHNlcXVlbmNlcworICAgKiAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgdHJ1dGggdmFsdWUgb2YgYSBwcmVkaWNhdGUuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX291dF90cnVlICAgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX291dF9mYWxzZSAgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ByZWQgICAgQSBwcmVkaWNhdGUuCisgICAqICBAcmV0dXJuICAgQSBwYWlyIGRlc2lnbmF0aW5nIHRoZSBlbmRzIG9mIHRoZSByZXN1bHRpbmcgc2VxdWVuY2VzLgorICAgKgorICAgKiAgQ29waWVzIGVhY2ggZWxlbWVudCBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSBmb3Igd2hpY2gKKyAgICogIEBwIF9fcHJlZCByZXR1cm5zIHRydWUgdG8gdGhlIHJhbmdlIGJlZ2lubmluZyBhdCBAcCBvdXRfdHJ1ZQorICAgKiAgYW5kIGVhY2ggZWxlbWVudCBmb3Igd2hpY2ggQHAgX19wcmVkIHJldHVybnMgZmFsc2UgdG8gQHAgX19vdXRfZmFsc2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IxLAorCSAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcjIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgcGFpcjxfT3V0cHV0SXRlcmF0b3IxLCBfT3V0cHV0SXRlcmF0b3IyPgorICAgIHBhcnRpdGlvbl9jb3B5KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgX091dHB1dEl0ZXJhdG9yMSBfX291dF90cnVlLCBfT3V0cHV0SXRlcmF0b3IyIF9fb3V0X2ZhbHNlLAorCQkgICBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IxLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvcjIsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9VbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X1ByZWRpY2F0ZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIAorICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJaWYgKF9fcHJlZCgqX19maXJzdCkpCisJICB7CisJICAgICpfX291dF90cnVlID0gKl9fZmlyc3Q7CisJICAgICsrX19vdXRfdHJ1ZTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgICpfX291dF9mYWxzZSA9ICpfX2ZpcnN0OworCSAgICArK19fb3V0X2ZhbHNlOworCSAgfQorCisgICAgICByZXR1cm4gcGFpcjxfT3V0cHV0SXRlcmF0b3IxLCBfT3V0cHV0SXRlcmF0b3IyPihfX291dF90cnVlLCBfX291dF9mYWxzZSk7CisgICAgfQorI2VuZGlmCisKKyAgLyoqCisgICAqICBAYnJpZWYgUmVtb3ZlIGVsZW1lbnRzIGZyb20gYSBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ZhbHVlICBUaGUgdmFsdWUgdG8gYmUgcmVtb3ZlZC4KKyAgICogIEByZXR1cm4gICBBbiBpdGVyYXRvciBkZXNpZ25hdGluZyB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UuCisgICAqCisgICAqICBBbGwgZWxlbWVudHMgZXF1YWwgdG8gQHAgX192YWx1ZSBhcmUgcmVtb3ZlZCBmcm9tIHRoZSByYW5nZQorICAgKiAgQHAgW19fZmlyc3QsX19sYXN0KS4KKyAgICoKKyAgICogIHJlbW92ZSgpIGlzIHN0YWJsZSwgc28gdGhlIHJlbGF0aXZlIG9yZGVyIG9mIGVsZW1lbnRzIHRoYXQgYXJlCisgICAqICBub3QgcmVtb3ZlZCBpcyB1bmNoYW5nZWQuCisgICAqCisgICAqICBFbGVtZW50cyBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIHJlc3VsdGluZyBzZXF1ZW5jZSBhbmQgQHAgX19sYXN0CisgICAqICBhcmUgc3RpbGwgcHJlc2VudCwgYnV0IHRoZWlyIHZhbHVlIGlzIHVuc3BlY2lmaWVkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIHJlbW92ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCSAgIGNvbnN0IF9UcCYgX192YWx1ZSkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRXF1YWxPcENvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwgX1RwPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBfX2ZpcnN0ID0gX0dMSUJDWFhfU1REX0E6OmZpbmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbHVlKTsKKyAgICAgIGlmKF9fZmlyc3QgPT0gX19sYXN0KQorICAgICAgICByZXR1cm4gX19maXJzdDsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQgPSBfX2ZpcnN0OworICAgICAgKytfX2ZpcnN0OworICAgICAgZm9yKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICAgaWYoISgqX19maXJzdCA9PSBfX3ZhbHVlKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAqX19yZXN1bHQgPSBfR0xJQkNYWF9NT1ZFKCpfX2ZpcnN0KTsKKyAgICAgICAgICAgICsrX19yZXN1bHQ7CisgICAgICAgICAgfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBSZW1vdmUgZWxlbWVudHMgZnJvbSBhIHNlcXVlbmNlIHVzaW5nIGEgcHJlZGljYXRlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19wcmVkICAgQSBwcmVkaWNhdGUuCisgICAqICBAcmV0dXJuICAgQW4gaXRlcmF0b3IgZGVzaWduYXRpbmcgdGhlIGVuZCBvZiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlLgorICAgKgorICAgKiAgQWxsIGVsZW1lbnRzIGZvciB3aGljaCBAcCBfX3ByZWQgcmV0dXJucyB0cnVlIGFyZSByZW1vdmVkIGZyb20gdGhlIHJhbmdlCisgICAqICBAcCBbX19maXJzdCxfX2xhc3QpLgorICAgKgorICAgKiAgcmVtb3ZlX2lmKCkgaXMgc3RhYmxlLCBzbyB0aGUgcmVsYXRpdmUgb3JkZXIgb2YgZWxlbWVudHMgdGhhdCBhcmUKKyAgICogIG5vdCByZW1vdmVkIGlzIHVuY2hhbmdlZC4KKyAgICoKKyAgICogIEVsZW1lbnRzIGJldHdlZW4gdGhlIGVuZCBvZiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlIGFuZCBAcCBfX2xhc3QKKyAgICogIGFyZSBzdGlsbCBwcmVzZW50LCBidXQgdGhlaXIgdmFsdWUgaXMgdW5zcGVjaWZpZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIHJlbW92ZV9pZihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCSAgICAgIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9VbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X1ByZWRpY2F0ZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBfX2ZpcnN0ID0gX0dMSUJDWFhfU1REX0E6OmZpbmRfaWYoX19maXJzdCwgX19sYXN0LCBfX3ByZWQpOworICAgICAgaWYoX19maXJzdCA9PSBfX2xhc3QpCisgICAgICAgIHJldHVybiBfX2ZpcnN0OworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCA9IF9fZmlyc3Q7CisgICAgICArK19fZmlyc3Q7CisgICAgICBmb3IoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgICBpZighYm9vbChfX3ByZWQoKl9fZmlyc3QpKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAqX19yZXN1bHQgPSBfR0xJQkNYWF9NT1ZFKCpfX2ZpcnN0KTsKKyAgICAgICAgICAgICsrX19yZXN1bHQ7CisgICAgICAgICAgfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBSZW1vdmUgY29uc2VjdXRpdmUgZHVwbGljYXRlIHZhbHVlcyBmcm9tIGEgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgZGVzaWduYXRpbmcgdGhlIGVuZCBvZiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlLgorICAgKgorICAgKiAgUmVtb3ZlcyBhbGwgYnV0IHRoZSBmaXJzdCBlbGVtZW50IGZyb20gZWFjaCBncm91cCBvZiBjb25zZWN1dGl2ZQorICAgKiAgdmFsdWVzIHRoYXQgY29tcGFyZSBlcXVhbC4KKyAgICogIHVuaXF1ZSgpIGlzIHN0YWJsZSwgc28gdGhlIHJlbGF0aXZlIG9yZGVyIG9mIGVsZW1lbnRzIHRoYXQgYXJlCisgICAqICBub3QgcmVtb3ZlZCBpcyB1bmNoYW5nZWQuCisgICAqICBFbGVtZW50cyBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIHJlc3VsdGluZyBzZXF1ZW5jZSBhbmQgQHAgX19sYXN0CisgICAqICBhcmUgc3RpbGwgcHJlc2VudCwgYnV0IHRoZWlyIHZhbHVlIGlzIHVuc3BlY2lmaWVkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICB1bmlxdWUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRXF1YWxpdHlDb21wYXJhYmxlQ29uY2VwdDwKKwkJICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIC8vIFNraXAgdGhlIGJlZ2lubmluZywgaWYgYWxyZWFkeSB1bmlxdWUuCisgICAgICBfX2ZpcnN0ID0gX0dMSUJDWFhfU1REX0E6OmFkamFjZW50X2ZpbmQoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gX19sYXN0OworCisgICAgICAvLyBEbyB0aGUgcmVhbCBjb3B5IHdvcmsuCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZGVzdCA9IF9fZmlyc3Q7CisgICAgICArK19fZmlyc3Q7CisgICAgICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKKwlpZiAoISgqX19kZXN0ID09ICpfX2ZpcnN0KSkKKwkgICorK19fZGVzdCA9IF9HTElCQ1hYX01PVkUoKl9fZmlyc3QpOworICAgICAgcmV0dXJuICsrX19kZXN0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBSZW1vdmUgY29uc2VjdXRpdmUgdmFsdWVzIGZyb20gYSBzZXF1ZW5jZSB1c2luZyBhIHByZWRpY2F0ZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgICAgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgICAgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fYmluYXJ5X3ByZWQgIEEgYmluYXJ5IHByZWRpY2F0ZS4KKyAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIGRlc2lnbmF0aW5nIHRoZSBlbmQgb2YgdGhlIHJlc3VsdGluZyBzZXF1ZW5jZS4KKyAgICoKKyAgICogIFJlbW92ZXMgYWxsIGJ1dCB0aGUgZmlyc3QgZWxlbWVudCBmcm9tIGVhY2ggZ3JvdXAgb2YgY29uc2VjdXRpdmUKKyAgICogIHZhbHVlcyBmb3Igd2hpY2ggQHAgX19iaW5hcnlfcHJlZCByZXR1cm5zIHRydWUuCisgICAqICB1bmlxdWUoKSBpcyBzdGFibGUsIHNvIHRoZSByZWxhdGl2ZSBvcmRlciBvZiBlbGVtZW50cyB0aGF0IGFyZQorICAgKiAgbm90IHJlbW92ZWQgaXMgdW5jaGFuZ2VkLgorICAgKiAgRWxlbWVudHMgYmV0d2VlbiB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UgYW5kIEBwIF9fbGFzdAorICAgKiAgYXJlIHN0aWxsIHByZXNlbnQsIGJ1dCB0aGVpciB2YWx1ZSBpcyB1bnNwZWNpZmllZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgdW5pcXVlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQmluYXJ5UHJlZGljYXRlLAorCQl0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUsCisJCXR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgLy8gU2tpcCB0aGUgYmVnaW5uaW5nLCBpZiBhbHJlYWR5IHVuaXF1ZS4KKyAgICAgIF9fZmlyc3QgPSBfR0xJQkNYWF9TVERfQTo6YWRqYWNlbnRfZmluZChfX2ZpcnN0LCBfX2xhc3QsIF9fYmluYXJ5X3ByZWQpOworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX2xhc3Q7CisKKyAgICAgIC8vIERvIHRoZSByZWFsIGNvcHkgd29yay4KKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19kZXN0ID0gX19maXJzdDsKKyAgICAgICsrX19maXJzdDsKKyAgICAgIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQorCWlmICghYm9vbChfX2JpbmFyeV9wcmVkKCpfX2Rlc3QsICpfX2ZpcnN0KSkpCisJICAqKytfX2Rlc3QgPSBfR0xJQkNYWF9NT1ZFKCpfX2ZpcnN0KTsKKyAgICAgIHJldHVybiArK19fZGVzdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIHVnbGlmaWVkIHVuaXF1ZV9jb3B5KF9JbnB1dEl0ZXJhdG9yLCBfSW5wdXRJdGVyYXRvciwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yKQorICAgKiAgb3ZlcmxvYWRlZCBmb3IgZm9yd2FyZCBpdGVyYXRvcnMgYW5kIG91dHB1dCBpdGVyYXRvciBhcyByZXN1bHQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX3VuaXF1ZV9jb3B5KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCSAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorCQkgIGZvcndhcmRfaXRlcmF0b3JfdGFnLCBvdXRwdXRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzIC0tIHRha2VuIGNhcmUgb2YgaW4gZGlzcGF0Y2hpbmcgZnVuY3Rpb24KKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKyAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworICAgICAgd2hpbGUgKCsrX19uZXh0ICE9IF9fbGFzdCkKKwlpZiAoISgqX19maXJzdCA9PSAqX19uZXh0KSkKKwkgIHsKKwkgICAgX19maXJzdCA9IF9fbmV4dDsKKwkgICAgKisrX19yZXN1bHQgPSAqX19maXJzdDsKKwkgIH0KKyAgICAgIHJldHVybiArK19fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gdWdsaWZpZWQgdW5pcXVlX2NvcHkoX0lucHV0SXRlcmF0b3IsIF9JbnB1dEl0ZXJhdG9yLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IpCisgICAqICBvdmVybG9hZGVkIGZvciBpbnB1dCBpdGVyYXRvcnMgYW5kIG91dHB1dCBpdGVyYXRvciBhcyByZXN1bHQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgX191bmlxdWVfY29weShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorCQkgIGlucHV0X2l0ZXJhdG9yX3RhZywgb3V0cHV0X2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cyAtLSB0YWtlbiBjYXJlIG9mIGluIGRpc3BhdGNoaW5nIGZ1bmN0aW9uCisgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlIF9fdmFsdWUgPSAqX19maXJzdDsKKyAgICAgICpfX3Jlc3VsdCA9IF9fdmFsdWU7CisgICAgICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKKwlpZiAoIShfX3ZhbHVlID09ICpfX2ZpcnN0KSkKKwkgIHsKKwkgICAgX192YWx1ZSA9ICpfX2ZpcnN0OworCSAgICAqKytfX3Jlc3VsdCA9IF9fdmFsdWU7CisJICB9CisgICAgICByZXR1cm4gKytfX3Jlc3VsdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIHVnbGlmaWVkIHVuaXF1ZV9jb3B5KF9JbnB1dEl0ZXJhdG9yLCBfSW5wdXRJdGVyYXRvciwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yKQorICAgKiAgb3ZlcmxvYWRlZCBmb3IgaW5wdXQgaXRlcmF0b3JzIGFuZCBmb3J3YXJkIGl0ZXJhdG9yIGFzIHJlc3VsdC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIF9fdW5pcXVlX2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQsCisJCSAgaW5wdXRfaXRlcmF0b3JfdGFnLCBmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cyAtLSB0YWtlbiBjYXJlIG9mIGluIGRpc3BhdGNoaW5nIGZ1bmN0aW9uCisgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKyAgICAgIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQorCWlmICghKCpfX3Jlc3VsdCA9PSAqX19maXJzdCkpCisJICAqKytfX3Jlc3VsdCA9ICpfX2ZpcnN0OworICAgICAgcmV0dXJuICsrX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiB1Z2xpZmllZAorICAgKiAgdW5pcXVlX2NvcHkoX0lucHV0SXRlcmF0b3IsIF9JbnB1dEl0ZXJhdG9yLCBfT3V0cHV0SXRlcmF0b3IsCisgICAqICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlKQorICAgKiAgb3ZlcmxvYWRlZCBmb3IgZm9yd2FyZCBpdGVyYXRvcnMgYW5kIG91dHB1dCBpdGVyYXRvciBhcyByZXN1bHQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fdW5pcXVlX2NvcHkoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCwKKwkJICBmb3J3YXJkX2l0ZXJhdG9yX3RhZywgb3V0cHV0X2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cyAtLSBpdGVyYXRvcnMgYWxyZWFkeSBjaGVja2VkCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0JpbmFyeVByZWRpY2F0ZSwKKwkgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwKKwkgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKyAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworICAgICAgd2hpbGUgKCsrX19uZXh0ICE9IF9fbGFzdCkKKwlpZiAoIWJvb2woX19iaW5hcnlfcHJlZCgqX19maXJzdCwgKl9fbmV4dCkpKQorCSAgeworCSAgICBfX2ZpcnN0ID0gX19uZXh0OworCSAgICAqKytfX3Jlc3VsdCA9ICpfX2ZpcnN0OworCSAgfQorICAgICAgcmV0dXJuICsrX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiB1Z2xpZmllZAorICAgKiAgdW5pcXVlX2NvcHkoX0lucHV0SXRlcmF0b3IsIF9JbnB1dEl0ZXJhdG9yLCBfT3V0cHV0SXRlcmF0b3IsCisgICAqICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlKQorICAgKiAgb3ZlcmxvYWRlZCBmb3IgaW5wdXQgaXRlcmF0b3JzIGFuZCBvdXRwdXQgaXRlcmF0b3IgYXMgcmVzdWx0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgX191bmlxdWVfY29weShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQsCisJCSAgaW5wdXRfaXRlcmF0b3JfdGFnLCBvdXRwdXRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzIC0tIGl0ZXJhdG9ycyBhbHJlYWR5IGNoZWNrZWQKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQmluYXJ5UHJlZGljYXRlLAorCSAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwKKwkgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorCisgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlIF9fdmFsdWUgPSAqX19maXJzdDsKKyAgICAgICpfX3Jlc3VsdCA9IF9fdmFsdWU7CisgICAgICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKKwlpZiAoIWJvb2woX19iaW5hcnlfcHJlZChfX3ZhbHVlLCAqX19maXJzdCkpKQorCSAgeworCSAgICBfX3ZhbHVlID0gKl9fZmlyc3Q7CisJICAgICorK19fcmVzdWx0ID0gX192YWx1ZTsKKwkgIH0KKyAgICAgIHJldHVybiArK19fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gdWdsaWZpZWQKKyAgICogIHVuaXF1ZV9jb3B5KF9JbnB1dEl0ZXJhdG9yLCBfSW5wdXRJdGVyYXRvciwgX091dHB1dEl0ZXJhdG9yLAorICAgKiAgICAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSkKKyAgICogIG92ZXJsb2FkZWQgZm9yIGlucHV0IGl0ZXJhdG9ycyBhbmQgZm9yd2FyZCBpdGVyYXRvciBhcyByZXN1bHQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIF9fdW5pcXVlX2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQsIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCwKKwkJICBpbnB1dF9pdGVyYXRvcl90YWcsIGZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzIC0tIGl0ZXJhdG9ycyBhbHJlYWR5IGNoZWNrZWQKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQmluYXJ5UHJlZGljYXRlLAorCSAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorCSAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisKKyAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworICAgICAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCisJaWYgKCFib29sKF9fYmluYXJ5X3ByZWQoKl9fcmVzdWx0LCAqX19maXJzdCkpKQorCSAgKisrX19yZXN1bHQgPSAqX19maXJzdDsKKyAgICAgIHJldHVybiArK19fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gdWdsaWZpZWQgcmV2ZXJzZShfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IpCisgICAqICBvdmVybG9hZGVkIGZvciBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9ycy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgX19yZXZlcnNlKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xhc3QsCisJICAgICAgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgd2hpbGUgKHRydWUpCisJaWYgKF9fZmlyc3QgPT0gX19sYXN0IHx8IF9fZmlyc3QgPT0gLS1fX2xhc3QpCisJICByZXR1cm47CisJZWxzZQorCSAgeworCSAgICBzdGQ6Oml0ZXJfc3dhcChfX2ZpcnN0LCBfX2xhc3QpOworCSAgICArK19fZmlyc3Q7CisJICB9CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiB1Z2xpZmllZCByZXZlcnNlKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcikKKyAgICogIG92ZXJsb2FkZWQgZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgdm9pZAorICAgIF9fcmV2ZXJzZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuOworICAgICAgLS1fX2xhc3Q7CisgICAgICB3aGlsZSAoX19maXJzdCA8IF9fbGFzdCkKKwl7CisJICBzdGQ6Oml0ZXJfc3dhcChfX2ZpcnN0LCBfX2xhc3QpOworCSAgKytfX2ZpcnN0OworCSAgLS1fX2xhc3Q7CisJfQorICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBSZXZlcnNlIGEgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIEEgYmlkaXJlY3Rpb25hbCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgQSBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgIHJldmVyc2UoKSByZXR1cm5zIG5vIHZhbHVlLgorICAgKgorICAgKiAgUmV2ZXJzZXMgdGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSwKKyAgICogIHNvIHRoYXQgdGhlIGZpcnN0IGVsZW1lbnQgYmVjb21lcyB0aGUgbGFzdCBldGMuCisgICAqICBGb3IgZXZlcnkgQGMgaSBzdWNoIHRoYXQgQHAgMDw9aTw9KF9fbGFzdC1fX2ZpcnN0KS8yKSwgQHAgcmV2ZXJzZSgpCisgICAqICBzd2FwcyBAcCAqKF9fZmlyc3QraSkgYW5kIEBwICooX19sYXN0LShpKzEpKQorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgcmV2ZXJzZShfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBzdGQ6Ol9fcmV2ZXJzZShfX2ZpcnN0LCBfX2xhc3QsIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENvcHkgYSBzZXF1ZW5jZSwgcmV2ZXJzaW5nIGl0cyBlbGVtZW50cy4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEEgYmlkaXJlY3Rpb25hbCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEEgYmlkaXJlY3Rpb25hbCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19yZXN1bHQgIEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIGRlc2lnbmF0aW5nIHRoZSBlbmQgb2YgdGhlIHJlc3VsdGluZyBzZXF1ZW5jZS4KKyAgICoKKyAgICogIENvcGllcyB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LF9fbGFzdCkgdG8gdGhlCisgICAqICByYW5nZSBAcCBbX19yZXN1bHQsX19yZXN1bHQrKF9fbGFzdC1fX2ZpcnN0KSkgc3VjaCB0aGF0IHRoZQorICAgKiAgb3JkZXIgb2YgdGhlIGVsZW1lbnRzIGlzIHJldmVyc2VkLiAgRm9yIGV2ZXJ5IEBjIGkgc3VjaCB0aGF0IEBwCisgICAqICAwPD1pPD0oX19sYXN0LV9fZmlyc3QpLCBAcCByZXZlcnNlX2NvcHkoKSBwZXJmb3JtcyB0aGUKKyAgICogIGFzc2lnbm1lbnQgQHAgKihfX3Jlc3VsdCsoX19sYXN0LV9fZmlyc3QpLTEtaSkgPSAqKF9fZmlyc3QraSkuCisgICAqICBUaGUgcmFuZ2VzIEBwIFtfX2ZpcnN0LF9fbGFzdCkgYW5kIEBwCisgICAqICBbX19yZXN1bHQsX19yZXN1bHQrKF9fbGFzdC1fX2ZpcnN0KSkgbXVzdCBub3Qgb3ZlcmxhcC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHJldmVyc2VfY29weShfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0LAorCQkgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJeworCSAgLS1fX2xhc3Q7CisJICAqX19yZXN1bHQgPSAqX19sYXN0OworCSAgKytfX3Jlc3VsdDsKKwl9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIHJvdGF0ZSBhbGdvcml0aG0gc3BlY2lhbGl6ZWQgb24gUkFJcy4KKyAgICogIEl0IHJldHVybnMgdGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIG9mIHR3byBpbnRlZ2VyIHZhbHVlcy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0V1Y2xpZGVhblJpbmdFbGVtZW50PgorICAgIF9FdWNsaWRlYW5SaW5nRWxlbWVudAorICAgIF9fZ2NkKF9FdWNsaWRlYW5SaW5nRWxlbWVudCBfX20sIF9FdWNsaWRlYW5SaW5nRWxlbWVudCBfX24pCisgICAgeworICAgICAgd2hpbGUgKF9fbiAhPSAwKQorCXsKKwkgIF9FdWNsaWRlYW5SaW5nRWxlbWVudCBfX3QgPSBfX20gJSBfX247CisJICBfX20gPSBfX247CisJICBfX24gPSBfX3Q7CisJfQorICAgICAgcmV0dXJuIF9fbTsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSByb3RhdGUgYWxnb3JpdGhtLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfX3JvdGF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisJICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkZGxlLAorCSAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBpZiAoX19maXJzdCA9PSBfX21pZGRsZSB8fCBfX2xhc3QgID09IF9fbWlkZGxlKQorCXJldHVybjsKKworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0MiA9IF9fbWlkZGxlOworICAgICAgZG8KKwl7CisJICBzdGQ6Oml0ZXJfc3dhcChfX2ZpcnN0LCBfX2ZpcnN0Mik7CisJICArK19fZmlyc3Q7CisJICArK19fZmlyc3QyOworCSAgaWYgKF9fZmlyc3QgPT0gX19taWRkbGUpCisJICAgIF9fbWlkZGxlID0gX19maXJzdDI7CisJfQorICAgICAgd2hpbGUgKF9fZmlyc3QyICE9IF9fbGFzdCk7CisKKyAgICAgIF9fZmlyc3QyID0gX19taWRkbGU7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0MiAhPSBfX2xhc3QpCisJeworCSAgc3RkOjppdGVyX3N3YXAoX19maXJzdCwgX19maXJzdDIpOworCSAgKytfX2ZpcnN0OworCSAgKytfX2ZpcnN0MjsKKwkgIGlmIChfX2ZpcnN0ID09IF9fbWlkZGxlKQorCSAgICBfX21pZGRsZSA9IF9fZmlyc3QyOworCSAgZWxzZSBpZiAoX19maXJzdDIgPT0gX19sYXN0KQorCSAgICBfX2ZpcnN0MiA9IF9fbWlkZGxlOworCX0KKyAgICB9CisKKyAgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgcm90YXRlIGFsZ29yaXRobS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgX19yb3RhdGUoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LAorCSAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX21pZGRsZSwKKwkgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0LAorCSAgICAgIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+KQorCisgICAgICBpZiAoX19maXJzdCA9PSBfX21pZGRsZSB8fCBfX2xhc3QgID09IF9fbWlkZGxlKQorCXJldHVybjsKKworICAgICAgc3RkOjpfX3JldmVyc2UoX19maXJzdCwgIF9fbWlkZGxlLCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZygpKTsKKyAgICAgIHN0ZDo6X19yZXZlcnNlKF9fbWlkZGxlLCBfX2xhc3QsICAgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKSk7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbWlkZGxlICYmIF9fbWlkZGxlICE9IF9fbGFzdCkKKwl7CisJICBzdGQ6Oml0ZXJfc3dhcChfX2ZpcnN0LCAtLV9fbGFzdCk7CisJICArK19fZmlyc3Q7CisJfQorCisgICAgICBpZiAoX19maXJzdCA9PSBfX21pZGRsZSkKKwlzdGQ6Ol9fcmV2ZXJzZShfX21pZGRsZSwgX19sYXN0LCAgIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnKCkpOworICAgICAgZWxzZQorCXN0ZDo6X19yZXZlcnNlKF9fZmlyc3QsICBfX21pZGRsZSwgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKSk7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgcm90YXRlIGFsZ29yaXRobS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfX3JvdGF0ZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX21pZGRsZSwKKwkgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbWlkZGxlIHx8IF9fbGFzdCAgPT0gX19taWRkbGUpCisJcmV0dXJuOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKworICAgICAgX0Rpc3RhbmNlIF9fbiA9IF9fbGFzdCAgIC0gX19maXJzdDsKKyAgICAgIF9EaXN0YW5jZSBfX2sgPSBfX21pZGRsZSAtIF9fZmlyc3Q7CisKKyAgICAgIGlmIChfX2sgPT0gX19uIC0gX19rKQorCXsKKwkgIHN0ZDo6c3dhcF9yYW5nZXMoX19maXJzdCwgX19taWRkbGUsIF9fbWlkZGxlKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3AgPSBfX2ZpcnN0OworCisgICAgICBmb3IgKDs7KQorCXsKKwkgIGlmIChfX2sgPCBfX24gLSBfX2spCisJICAgIHsKKwkgICAgICBpZiAoX19pc19wb2QoX1ZhbHVlVHlwZSkgJiYgX19rID09IDEpCisJCXsKKwkJICBfVmFsdWVUeXBlIF9fdCA9IF9HTElCQ1hYX01PVkUoKl9fcCk7CisJCSAgX0dMSUJDWFhfTU9WRTMoX19wICsgMSwgX19wICsgX19uLCBfX3ApOworCQkgICooX19wICsgX19uIC0gMSkgPSBfR0xJQkNYWF9NT1ZFKF9fdCk7CisJCSAgcmV0dXJuOworCQl9CisJICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fcSA9IF9fcCArIF9fazsKKwkgICAgICBmb3IgKF9EaXN0YW5jZSBfX2kgPSAwOyBfX2kgPCBfX24gLSBfX2s7ICsrIF9faSkKKwkJeworCQkgIHN0ZDo6aXRlcl9zd2FwKF9fcCwgX19xKTsKKwkJICArK19fcDsKKwkJICArK19fcTsKKwkJfQorCSAgICAgIF9fbiAlPSBfX2s7CisJICAgICAgaWYgKF9fbiA9PSAwKQorCQlyZXR1cm47CisJICAgICAgc3RkOjpzd2FwKF9fbiwgX19rKTsKKwkgICAgICBfX2sgPSBfX24gLSBfX2s7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9fayA9IF9fbiAtIF9fazsKKwkgICAgICBpZiAoX19pc19wb2QoX1ZhbHVlVHlwZSkgJiYgX19rID09IDEpCisJCXsKKwkJICBfVmFsdWVUeXBlIF9fdCA9IF9HTElCQ1hYX01PVkUoKihfX3AgKyBfX24gLSAxKSk7CisJCSAgX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoX19wLCBfX3AgKyBfX24gLSAxLCBfX3AgKyBfX24pOworCQkgICpfX3AgPSBfR0xJQkNYWF9NT1ZFKF9fdCk7CisJCSAgcmV0dXJuOworCQl9CisJICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fcSA9IF9fcCArIF9fbjsKKwkgICAgICBfX3AgPSBfX3EgLSBfX2s7CisJICAgICAgZm9yIChfRGlzdGFuY2UgX19pID0gMDsgX19pIDwgX19uIC0gX19rOyArKyBfX2kpCisJCXsKKwkJICAtLV9fcDsKKwkJICAtLV9fcTsKKwkJICBzdGQ6Oml0ZXJfc3dhcChfX3AsIF9fcSk7CisJCX0KKwkgICAgICBfX24gJT0gX19rOworCSAgICAgIGlmIChfX24gPT0gMCkKKwkJcmV0dXJuOworCSAgICAgIHN0ZDo6c3dhcChfX24sIF9fayk7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFJvdGF0ZSB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19taWRkbGUgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gIE5vdGhpbmcuCisgICAqCisgICAqICBSb3RhdGVzIHRoZSBlbGVtZW50cyBvZiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSBieSAKKyAgICogIEBwIChfX21pZGRsZSAtIF9fZmlyc3QpIHBvc2l0aW9ucyBzbyB0aGF0IHRoZSBlbGVtZW50IGF0IEBwIF9fbWlkZGxlCisgICAqICBpcyBtb3ZlZCB0byBAcCBfX2ZpcnN0LCB0aGUgZWxlbWVudCBhdCBAcCBfX21pZGRsZSsxIGlzIG1vdmVkIHRvCisgICAqICBAcCBfX2ZpcnN0KzEgYW5kIHNvIG9uIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHJhbmdlCisgICAqICBAcCBbX19maXJzdCxfX2xhc3QpLgorICAgKgorICAgKiAgVGhpcyBlZmZlY3RpdmVseSBzd2FwcyB0aGUgcmFuZ2VzIEBwIFtfX2ZpcnN0LF9fbWlkZGxlKSBhbmQKKyAgICogIEBwIFtfX21pZGRsZSxfX2xhc3QpLgorICAgKgorICAgKiAgUGVyZm9ybXMKKyAgICogICBAcCAqKF9fZmlyc3QrKG4rKF9fbGFzdC1fX21pZGRsZSkpJShfX2xhc3QtX19maXJzdCkpPSooX19maXJzdCtuKQorICAgKiAgZm9yIGVhY2ggQHAgbiBpbiB0aGUgcmFuZ2UgQHAgWzAsX19sYXN0LV9fZmlyc3QpLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgcm90YXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX21pZGRsZSwKKwkgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX21pZGRsZSk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19taWRkbGUsIF9fbGFzdCk7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeQorCV9JdGVyVHlwZTsKKyAgICAgIHN0ZDo6X19yb3RhdGUoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwgX0l0ZXJUeXBlKCkpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBDb3B5IGEgc2VxdWVuY2UsIHJvdGF0aW5nIGl0cyBlbGVtZW50cy4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19taWRkbGUgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19yZXN1bHQgIEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gICBBbiBpdGVyYXRvciBkZXNpZ25hdGluZyB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UuCisgICAqCisgICAqICBDb3BpZXMgdGhlIGVsZW1lbnRzIG9mIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpIHRvIHRoZQorICAgKiAgcmFuZ2UgYmVnaW5uaW5nIGF0IEByZXN1bHQsIHJvdGF0aW5nIHRoZSBjb3BpZWQgZWxlbWVudHMgYnkgCisgICAqICBAcCAoX19taWRkbGUtX19maXJzdCkgcG9zaXRpb25zIHNvIHRoYXQgdGhlIGVsZW1lbnQgYXQgQHAgX19taWRkbGUKKyAgICogIGlzIG1vdmVkIHRvIEBwIF9fcmVzdWx0LCB0aGUgZWxlbWVudCBhdCBAcCBfX21pZGRsZSsxIGlzIG1vdmVkCisgICAqICB0byBAcCBfX3Jlc3VsdCsxIGFuZCBzbyBvbiBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSByYW5nZSBAcAorICAgKiAgW19fZmlyc3QsX19sYXN0KS4KKyAgICoKKyAgICogIFBlcmZvcm1zIAorICAgKiAgQHAgKihfX3Jlc3VsdCsobisoX19sYXN0LV9fbWlkZGxlKSklKF9fbGFzdC1fX2ZpcnN0KSk9KihfX2ZpcnN0K24pCisgICAqICBmb3IgZWFjaCBAcCBuIGluIHRoZSByYW5nZSBAcCBbMCxfX2xhc3QtX19maXJzdCkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICByb3RhdGVfY29weShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19taWRkbGUsCisgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCQl0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbWlkZGxlKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX21pZGRsZSwgX19sYXN0KTsKKworICAgICAgcmV0dXJuIHN0ZDo6Y29weShfX2ZpcnN0LCBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb3B5KF9fbWlkZGxlLCBfX2xhc3QsIF9fcmVzdWx0KSk7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uLi4uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIF9fcGFydGl0aW9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCV9QcmVkaWNhdGUgX19wcmVkLCBmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIF9fZmlyc3Q7CisKKyAgICAgIHdoaWxlIChfX3ByZWQoKl9fZmlyc3QpKQorCWlmICgrK19fZmlyc3QgPT0gX19sYXN0KQorCSAgcmV0dXJuIF9fZmlyc3Q7CisKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKworICAgICAgd2hpbGUgKCsrX19uZXh0ICE9IF9fbGFzdCkKKwlpZiAoX19wcmVkKCpfX25leHQpKQorCSAgeworCSAgICBzdGQ6Oml0ZXJfc3dhcChfX2ZpcnN0LCBfX25leHQpOworCSAgICArK19fZmlyc3Q7CisJICB9CisKKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbi4uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IKKyAgICBfX3BhcnRpdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0LAorCQlfUHJlZGljYXRlIF9fcHJlZCwgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgd2hpbGUgKHRydWUpCisJeworCSAgd2hpbGUgKHRydWUpCisJICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwkgICAgICByZXR1cm4gX19maXJzdDsKKwkgICAgZWxzZSBpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKwkgICAgICArK19fZmlyc3Q7CisJICAgIGVsc2UKKwkgICAgICBicmVhazsKKwkgIC0tX19sYXN0OworCSAgd2hpbGUgKHRydWUpCisJICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwkgICAgICByZXR1cm4gX19maXJzdDsKKwkgICAgZWxzZSBpZiAoIWJvb2woX19wcmVkKCpfX2xhc3QpKSkKKwkgICAgICAtLV9fbGFzdDsKKwkgICAgZWxzZQorCSAgICAgIGJyZWFrOworCSAgc3RkOjppdGVyX3N3YXAoX19maXJzdCwgX19sYXN0KTsKKwkgICsrX19maXJzdDsKKwl9CisgICAgfQorCisgIC8vIHBhcnRpdGlvbgorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uLi4uCisgIC8vLyBSZXF1aXJlcyBfX2xlbiAhPSAwIGFuZCAhX19wcmVkKCpfX2ZpcnN0KSwKKyAgLy8vIHNhbWUgYXMgX19zdGFibGVfcGFydGl0aW9uX2FkYXB0aXZlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfRGlzdGFuY2U+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIF9faW5wbGFjZV9zdGFibGVfcGFydGl0aW9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgX0Rpc3RhbmNlIF9fbGVuKQorICAgIHsKKyAgICAgIGlmIChfX2xlbiA9PSAxKQorCXJldHVybiBfX2ZpcnN0OworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX21pZGRsZSA9IF9fZmlyc3Q7CisgICAgICBzdGQ6OmFkdmFuY2UoX19taWRkbGUsIF9fbGVuIC8gMik7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGVmdF9zcGxpdCA9CisJc3RkOjpfX2lucGxhY2Vfc3RhYmxlX3BhcnRpdGlvbihfX2ZpcnN0LCBfX3ByZWQsIF9fbGVuIC8gMik7CisgICAgICAvLyBBZHZhbmNlIHBhc3QgdHJ1ZS1wcmVkaWNhdGUgdmFsdWVzIHRvIHNhdGlzZnkgdGhpcworICAgICAgLy8gZnVuY3Rpb24ncyBwcmVjb25kaXRpb25zLgorICAgICAgX0Rpc3RhbmNlIF9fcmlnaHRfbGVuID0gX19sZW4gLSBfX2xlbiAvIDI7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmlnaHRfc3BsaXQgPQorCXN0ZDo6X19maW5kX2lmX25vdF9uKF9fbWlkZGxlLCBfX3JpZ2h0X2xlbiwgX19wcmVkKTsKKyAgICAgIGlmIChfX3JpZ2h0X2xlbikKKwlfX3JpZ2h0X3NwbGl0ID0gc3RkOjpfX2lucGxhY2Vfc3RhYmxlX3BhcnRpdGlvbihfX21pZGRsZSwKKwkJCQkJCQlfX3ByZWQsCisJCQkJCQkJX19yaWdodF9sZW4pOworICAgICAgc3RkOjpyb3RhdGUoX19sZWZ0X3NwbGl0LCBfX21pZGRsZSwgX19yaWdodF9zcGxpdCk7CisgICAgICBzdGQ6OmFkdmFuY2UoX19sZWZ0X3NwbGl0LCBzdGQ6OmRpc3RhbmNlKF9fbWlkZGxlLCBfX3JpZ2h0X3NwbGl0KSk7CisgICAgICByZXR1cm4gX19sZWZ0X3NwbGl0OworICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbi4uLgorICAvLy8gUmVxdWlyZXMgX19maXJzdCAhPSBfX2xhc3QgYW5kICFfX3ByZWQoKl9fZmlyc3QpCisgIC8vLyBhbmQgX19sZW4gPT0gZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KS4KKyAgLy8vCisgIC8vLyAhX19wcmVkKCpfX2ZpcnN0KSBhbGxvd3MgdXMgdG8gZ3VhcmFudGVlIHRoYXQgd2UgZG9uJ3QKKyAgLy8vIG1vdmUtYXNzaWduIGFuIGVsZW1lbnQgb250byBpdHNlbGYuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9Qb2ludGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlLAorCSAgIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgX19zdGFibGVfcGFydGl0aW9uX2FkYXB0aXZlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKwkJCQlfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJCQlfUHJlZGljYXRlIF9fcHJlZCwgX0Rpc3RhbmNlIF9fbGVuLAorCQkJCV9Qb2ludGVyIF9fYnVmZmVyLAorCQkJCV9EaXN0YW5jZSBfX2J1ZmZlcl9zaXplKQorICAgIHsKKyAgICAgIGlmIChfX2xlbiA8PSBfX2J1ZmZlcl9zaXplKQorCXsKKwkgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQxID0gX19maXJzdDsKKwkgIF9Qb2ludGVyIF9fcmVzdWx0MiA9IF9fYnVmZmVyOworCSAgLy8gVGhlIHByZWNvbmRpdGlvbiBndWFyYW50ZWVzIHRoYXQgIV9fcHJlZCgqX19maXJzdCksIHNvCisJICAvLyBtb3ZlIHRoYXQgZWxlbWVudCB0byB0aGUgYnVmZmVyIGJlZm9yZSBzdGFydGluZyB0aGUgbG9vcC4KKwkgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdlIG9ubHkgY2FsbCBfX3ByZWQgb25jZSBwZXIgZWxlbWVudC4KKwkgICpfX3Jlc3VsdDIgPSBfR0xJQkNYWF9NT1ZFKCpfX2ZpcnN0KTsKKwkgICsrX19yZXN1bHQyOworCSAgKytfX2ZpcnN0OworCSAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKQorCSAgICAgIHsKKwkJKl9fcmVzdWx0MSA9IF9HTElCQ1hYX01PVkUoKl9fZmlyc3QpOworCQkrK19fcmVzdWx0MTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCSpfX3Jlc3VsdDIgPSBfR0xJQkNYWF9NT1ZFKCpfX2ZpcnN0KTsKKwkJKytfX3Jlc3VsdDI7CisJICAgICAgfQorCSAgX0dMSUJDWFhfTU9WRTMoX19idWZmZXIsIF9fcmVzdWx0MiwgX19yZXN1bHQxKTsKKwkgIHJldHVybiBfX3Jlc3VsdDE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWRkbGUgPSBfX2ZpcnN0OworCSAgc3RkOjphZHZhbmNlKF9fbWlkZGxlLCBfX2xlbiAvIDIpOworCSAgX0ZvcndhcmRJdGVyYXRvciBfX2xlZnRfc3BsaXQgPQorCSAgICBzdGQ6Ol9fc3RhYmxlX3BhcnRpdGlvbl9hZGFwdGl2ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19wcmVkLAorCQkJCQkgICAgIF9fbGVuIC8gMiwgX19idWZmZXIsCisJCQkJCSAgICAgX19idWZmZXJfc2l6ZSk7CisJICAvLyBBZHZhbmNlIHBhc3QgdHJ1ZS1wcmVkaWNhdGUgdmFsdWVzIHRvIHNhdGlzZnkgdGhpcworCSAgLy8gZnVuY3Rpb24ncyBwcmVjb25kaXRpb25zLgorCSAgX0Rpc3RhbmNlIF9fcmlnaHRfbGVuID0gX19sZW4gLSBfX2xlbiAvIDI7CisJICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmlnaHRfc3BsaXQgPQorCSAgICBzdGQ6Ol9fZmluZF9pZl9ub3RfbihfX21pZGRsZSwgX19yaWdodF9sZW4sIF9fcHJlZCk7CisJICBpZiAoX19yaWdodF9sZW4pCisJICAgIF9fcmlnaHRfc3BsaXQgPQorCSAgICAgIHN0ZDo6X19zdGFibGVfcGFydGl0aW9uX2FkYXB0aXZlKF9fcmlnaHRfc3BsaXQsIF9fbGFzdCwgX19wcmVkLAorCQkJCQkgICAgICAgX19yaWdodF9sZW4sCisJCQkJCSAgICAgICBfX2J1ZmZlciwgX19idWZmZXJfc2l6ZSk7CisJICBzdGQ6OnJvdGF0ZShfX2xlZnRfc3BsaXQsIF9fbWlkZGxlLCBfX3JpZ2h0X3NwbGl0KTsKKwkgIHN0ZDo6YWR2YW5jZShfX2xlZnRfc3BsaXQsIHN0ZDo6ZGlzdGFuY2UoX19taWRkbGUsIF9fcmlnaHRfc3BsaXQpKTsKKwkgIHJldHVybiBfX2xlZnRfc3BsaXQ7CisJfQorICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBNb3ZlIGVsZW1lbnRzIGZvciB3aGljaCBhIHByZWRpY2F0ZSBpcyB0cnVlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICogICAgICAgICBvZiBhIHNlcXVlbmNlLCBwcmVzZXJ2aW5nIHJlbGF0aXZlIG9yZGVyaW5nLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ByZWQgICAgQSBwcmVkaWNhdGUgZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIEBwIG1pZGRsZSBzdWNoIHRoYXQgQHAgX19wcmVkKGkpIGlzIHRydWUgZm9yIGVhY2gKKyAgICogIGl0ZXJhdG9yIEBwIGkgaW4gdGhlIHJhbmdlIEBwIFtmaXJzdCxtaWRkbGUpIGFuZCBmYWxzZSBmb3IgZWFjaCBAcCBpCisgICAqICBpbiB0aGUgcmFuZ2UgQHAgW21pZGRsZSxsYXN0KS4KKyAgICoKKyAgICogIFBlcmZvcm1zIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIEBwIHBhcnRpdGlvbigpIHdpdGggdGhlIGFkZGl0aW9uYWwKKyAgICogIGd1YXJhbnRlZSB0aGF0IHRoZSByZWxhdGl2ZSBvcmRlcmluZyBvZiBlbGVtZW50cyBpbiBlYWNoIGdyb3VwIGlzCisgICAqICBwcmVzZXJ2ZWQsIHNvIGFueSB0d28gZWxlbWVudHMgQHAgeCBhbmQgQHAgeSBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtfX2ZpcnN0LF9fbGFzdCkgc3VjaCB0aGF0IEBwIF9fcHJlZCh4KT09X19wcmVkKHkpIHdpbGwgaGF2ZSB0aGUgc2FtZQorICAgKiAgcmVsYXRpdmUgb3JkZXJpbmcgYWZ0ZXIgY2FsbGluZyBAcCBzdGFibGVfcGFydGl0aW9uKCkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIHN0YWJsZV9wYXJ0aXRpb24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfVW5hcnlQcmVkaWNhdGVDb25jZXB0PF9QcmVkaWNhdGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgX19maXJzdCA9IHN0ZDo6X19maW5kX2lmX25vdChfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gX19maXJzdDsKKyAgICAgIGVsc2UKKwl7CisJICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCSAgICBfVmFsdWVUeXBlOworCSAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCSAgICBfRGlzdGFuY2VUeXBlOworCisJICBfVGVtcG9yYXJ5X2J1ZmZlcjxfRm9yd2FyZEl0ZXJhdG9yLCBfVmFsdWVUeXBlPiBfX2J1ZihfX2ZpcnN0LAorCQkJCQkJCQlfX2xhc3QpOworCWlmIChfX2J1Zi5zaXplKCkgPiAwKQorCSAgcmV0dXJuCisJICAgIHN0ZDo6X19zdGFibGVfcGFydGl0aW9uX2FkYXB0aXZlKF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkLAorCQkJCQkgIF9EaXN0YW5jZVR5cGUoX19idWYucmVxdWVzdGVkX3NpemUoKSksCisJCQkJCSAgX19idWYuYmVnaW4oKSwKKwkJCQkJICBfRGlzdGFuY2VUeXBlKF9fYnVmLnNpemUoKSkpOworCWVsc2UKKwkgIHJldHVybgorCSAgICBzdGQ6Ol9faW5wbGFjZV9zdGFibGVfcGFydGl0aW9uKF9fZmlyc3QsIF9fcHJlZCwKKwkJCQkJIF9EaXN0YW5jZVR5cGUoX19idWYucmVxdWVzdGVkX3NpemUoKSkpOworCX0KKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBzb3J0IHJvdXRpbmVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgdm9pZAorICAgIF9faGVhcF9zZWxlY3QoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbWlkZGxlLAorCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgc3RkOjptYWtlX2hlYXAoX19maXJzdCwgX19taWRkbGUpOworICAgICAgZm9yIChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19pID0gX19taWRkbGU7IF9faSA8IF9fbGFzdDsgKytfX2kpCisJaWYgKCpfX2kgPCAqX19maXJzdCkKKwkgIHN0ZDo6X19wb3BfaGVhcChfX2ZpcnN0LCBfX21pZGRsZSwgX19pKTsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBzb3J0IHJvdXRpbmVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX2hlYXBfc2VsZWN0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX21pZGRsZSwKKwkJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgc3RkOjptYWtlX2hlYXAoX19maXJzdCwgX19taWRkbGUsIF9fY29tcCk7CisgICAgICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2kgPSBfX21pZGRsZTsgX19pIDwgX19sYXN0OyArK19faSkKKwlpZiAoX19jb21wKCpfX2ksICpfX2ZpcnN0KSkKKwkgIHN0ZDo6X19wb3BfaGVhcChfX2ZpcnN0LCBfX21pZGRsZSwgX19pLCBfX2NvbXApOworICAgIH0KKworICAvLyBwYXJ0aWFsX3NvcnQKKworICAvKioKKyAgICogIEBicmllZiBDb3B5IHRoZSBzbWFsbGVzdCBlbGVtZW50cyBvZiBhIHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcmVzdWx0X2ZpcnN0ICAgQSByYW5kb20tYWNjZXNzIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3Jlc3VsdF9sYXN0ICAgIEFub3RoZXIgcmFuZG9tLWFjY2VzcyBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gICBBbiBpdGVyYXRvciBpbmRpY2F0aW5nIHRoZSBlbmQgb2YgdGhlIHJlc3VsdGluZyBzZXF1ZW5jZS4KKyAgICoKKyAgICogIENvcGllcyBhbmQgc29ydHMgdGhlIHNtYWxsZXN0IE4gdmFsdWVzIGZyb20gdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LF9fbGFzdCkKKyAgICogIHRvIHRoZSByYW5nZSBiZWdpbm5pbmcgYXQgQHAgX19yZXN1bHRfZmlyc3QsIHdoZXJlIHRoZSBudW1iZXIgb2YKKyAgICogIGVsZW1lbnRzIHRvIGJlIGNvcGllZCwgQHAgTiwgaXMgdGhlIHNtYWxsZXIgb2YgQHAgKF9fbGFzdC1fX2ZpcnN0KSBhbmQKKyAgICogIEBwIChfX3Jlc3VsdF9sYXN0LV9fcmVzdWx0X2ZpcnN0KS4KKyAgICogIEFmdGVyIHRoZSBzb3J0IGlmIEBlIGkgYW5kIEBlIGogYXJlIGl0ZXJhdG9ycyBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtfX3Jlc3VsdF9maXJzdCxfX3Jlc3VsdF9maXJzdCtOKSBzdWNoIHRoYXQgaSBwcmVjZWRlcyBqIHRoZW4KKyAgICogICpqPCppIGlzIGZhbHNlLgorICAgKiAgVGhlIHZhbHVlIHJldHVybmVkIGlzIEBwIF9fcmVzdWx0X2ZpcnN0K04uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCisgICAgcGFydGlhbF9zb3J0X2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19yZXN1bHRfZmlyc3QsCisJCSAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3Jlc3VsdF9sYXN0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9JbnB1dFZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfT3V0cHV0VmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJX0Rpc3RhbmNlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Db252ZXJ0aWJsZUNvbmNlcHQ8X0lucHV0VmFsdWVUeXBlLAorCQkJCSAgX091dHB1dFZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9JbnB1dFZhbHVlVHlwZSwKKwkJCQkgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0VmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDxfT3V0cHV0VmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fcmVzdWx0X2ZpcnN0LCBfX3Jlc3VsdF9sYXN0KTsKKworICAgICAgaWYgKF9fcmVzdWx0X2ZpcnN0ID09IF9fcmVzdWx0X2xhc3QpCisJcmV0dXJuIF9fcmVzdWx0X2xhc3Q7CisgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19yZXN1bHRfcmVhbF9sYXN0ID0gX19yZXN1bHRfZmlyc3Q7CisgICAgICB3aGlsZShfX2ZpcnN0ICE9IF9fbGFzdCAmJiBfX3Jlc3VsdF9yZWFsX2xhc3QgIT0gX19yZXN1bHRfbGFzdCkKKwl7CisJICAqX19yZXN1bHRfcmVhbF9sYXN0ID0gKl9fZmlyc3Q7CisJICArK19fcmVzdWx0X3JlYWxfbGFzdDsKKwkgICsrX19maXJzdDsKKwl9CisgICAgICBzdGQ6Om1ha2VfaGVhcChfX3Jlc3VsdF9maXJzdCwgX19yZXN1bHRfcmVhbF9sYXN0KTsKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICBpZiAoKl9fZmlyc3QgPCAqX19yZXN1bHRfZmlyc3QpCisJICAgIHN0ZDo6X19hZGp1c3RfaGVhcChfX3Jlc3VsdF9maXJzdCwgX0Rpc3RhbmNlVHlwZSgwKSwKKwkJCSAgICAgICBfRGlzdGFuY2VUeXBlKF9fcmVzdWx0X3JlYWxfbGFzdAorCQkJCQkgICAgIC0gX19yZXN1bHRfZmlyc3QpLAorCQkJICAgICAgIF9JbnB1dFZhbHVlVHlwZSgqX19maXJzdCkpOworCSAgKytfX2ZpcnN0OworCX0KKyAgICAgIHN0ZDo6c29ydF9oZWFwKF9fcmVzdWx0X2ZpcnN0LCBfX3Jlc3VsdF9yZWFsX2xhc3QpOworICAgICAgcmV0dXJuIF9fcmVzdWx0X3JlYWxfbGFzdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29weSB0aGUgc21hbGxlc3QgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSB1c2luZyBhIHByZWRpY2F0ZSBmb3IKKyAgICogICAgICAgICBjb21wYXJpc29uLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFub3RoZXIgaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcmVzdWx0X2ZpcnN0ICAgQSByYW5kb20tYWNjZXNzIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3Jlc3VsdF9sYXN0ICAgIEFub3RoZXIgcmFuZG9tLWFjY2VzcyBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19jb21wICAgIEEgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHJldHVybiAgIEFuIGl0ZXJhdG9yIGluZGljYXRpbmcgdGhlIGVuZCBvZiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlLgorICAgKgorICAgKiAgQ29waWVzIGFuZCBzb3J0cyB0aGUgc21hbGxlc3QgTiB2YWx1ZXMgZnJvbSB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KQorICAgKiAgdG8gdGhlIHJhbmdlIGJlZ2lubmluZyBhdCBAcCByZXN1bHRfZmlyc3QsIHdoZXJlIHRoZSBudW1iZXIgb2YKKyAgICogIGVsZW1lbnRzIHRvIGJlIGNvcGllZCwgQHAgTiwgaXMgdGhlIHNtYWxsZXIgb2YgQHAgKF9fbGFzdC1fX2ZpcnN0KSBhbmQKKyAgICogIEBwIChfX3Jlc3VsdF9sYXN0LV9fcmVzdWx0X2ZpcnN0KS4KKyAgICogIEFmdGVyIHRoZSBzb3J0IGlmIEBlIGkgYW5kIEBlIGogYXJlIGl0ZXJhdG9ycyBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtfX3Jlc3VsdF9maXJzdCxfX3Jlc3VsdF9maXJzdCtOKSBzdWNoIHRoYXQgaSBwcmVjZWRlcyBqIHRoZW4KKyAgICogIEBwIF9fY29tcCgqaiwqaSkgaXMgZmFsc2UuCisgICAqICBUaGUgdmFsdWUgcmV0dXJuZWQgaXMgQHAgX19yZXN1bHRfZmlyc3QrTi4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCisgICAgcGFydGlhbF9zb3J0X2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19yZXN1bHRfZmlyc3QsCisJCSAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3Jlc3VsdF9sYXN0LAorCQkgICAgICBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX0lucHV0VmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9PdXRwdXRWYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2VUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9JbnB1dFZhbHVlVHlwZSwKKwkJCQkgIF9PdXRwdXRWYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCQkJCSAgX0lucHV0VmFsdWVUeXBlLCBfT3V0cHV0VmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9PdXRwdXRWYWx1ZVR5cGUsIF9PdXRwdXRWYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19yZXN1bHRfZmlyc3QsIF9fcmVzdWx0X2xhc3QpOworCisgICAgICBpZiAoX19yZXN1bHRfZmlyc3QgPT0gX19yZXN1bHRfbGFzdCkKKwlyZXR1cm4gX19yZXN1bHRfbGFzdDsKKyAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3Jlc3VsdF9yZWFsX2xhc3QgPSBfX3Jlc3VsdF9maXJzdDsKKyAgICAgIHdoaWxlKF9fZmlyc3QgIT0gX19sYXN0ICYmIF9fcmVzdWx0X3JlYWxfbGFzdCAhPSBfX3Jlc3VsdF9sYXN0KQorCXsKKwkgICpfX3Jlc3VsdF9yZWFsX2xhc3QgPSAqX19maXJzdDsKKwkgICsrX19yZXN1bHRfcmVhbF9sYXN0OworCSAgKytfX2ZpcnN0OworCX0KKyAgICAgIHN0ZDo6bWFrZV9oZWFwKF9fcmVzdWx0X2ZpcnN0LCBfX3Jlc3VsdF9yZWFsX2xhc3QsIF9fY29tcCk7CisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJeworCSAgaWYgKF9fY29tcCgqX19maXJzdCwgKl9fcmVzdWx0X2ZpcnN0KSkKKwkgICAgc3RkOjpfX2FkanVzdF9oZWFwKF9fcmVzdWx0X2ZpcnN0LCBfRGlzdGFuY2VUeXBlKDApLAorCQkJICAgICAgIF9EaXN0YW5jZVR5cGUoX19yZXN1bHRfcmVhbF9sYXN0CisJCQkJCSAgICAgLSBfX3Jlc3VsdF9maXJzdCksCisJCQkgICAgICAgX0lucHV0VmFsdWVUeXBlKCpfX2ZpcnN0KSwKKwkJCSAgICAgICBfX2NvbXApOworCSAgKytfX2ZpcnN0OworCX0KKyAgICAgIHN0ZDo6c29ydF9oZWFwKF9fcmVzdWx0X2ZpcnN0LCBfX3Jlc3VsdF9yZWFsX2xhc3QsIF9fY29tcCk7CisgICAgICByZXR1cm4gX19yZXN1bHRfcmVhbF9sYXN0OworICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIHNvcnQgcm91dGluZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfX3VuZ3VhcmRlZF9saW5lYXJfaW5zZXJ0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfX3ZhbCA9IF9HTElCQ1hYX01PVkUoKl9fbGFzdCk7CisgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19uZXh0ID0gX19sYXN0OworICAgICAgLS1fX25leHQ7CisgICAgICB3aGlsZSAoX192YWwgPCAqX19uZXh0KQorCXsKKwkgICpfX2xhc3QgPSBfR0xJQkNYWF9NT1ZFKCpfX25leHQpOworCSAgX19sYXN0ID0gX19uZXh0OworCSAgLS1fX25leHQ7CisJfQorICAgICAgKl9fbGFzdCA9IF9HTElCQ1hYX01PVkUoX192YWwpOworICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIHNvcnQgcm91dGluZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgX191bmd1YXJkZWRfbGluZWFyX2luc2VydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCQkJICAgICAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX192YWwgPSBfR0xJQkNYWF9NT1ZFKCpfX2xhc3QpOworICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbmV4dCA9IF9fbGFzdDsKKyAgICAgIC0tX19uZXh0OworICAgICAgd2hpbGUgKF9fY29tcChfX3ZhbCwgKl9fbmV4dCkpCisJeworCSAgKl9fbGFzdCA9IF9HTElCQ1hYX01PVkUoKl9fbmV4dCk7CisJICBfX2xhc3QgPSBfX25leHQ7CisJICAtLV9fbmV4dDsKKwl9CisgICAgICAqX19sYXN0ID0gX0dMSUJDWFhfTU9WRShfX3ZhbCk7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgc29ydCByb3V0aW5lLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgdm9pZAorICAgIF9faW5zZXJ0aW9uX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCSAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuOworCisgICAgICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2kgPSBfX2ZpcnN0ICsgMTsgX19pICE9IF9fbGFzdDsgKytfX2kpCisJeworCSAgaWYgKCpfX2kgPCAqX19maXJzdCkKKwkgICAgeworCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJCV9fdmFsID0gX0dMSUJDWFhfTU9WRSgqX19pKTsKKwkgICAgICBfR0xJQkNYWF9NT1ZFX0JBQ0tXQVJEMyhfX2ZpcnN0LCBfX2ksIF9faSArIDEpOworCSAgICAgICpfX2ZpcnN0ID0gX0dMSUJDWFhfTU9WRShfX3ZhbCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgc3RkOjpfX3VuZ3VhcmRlZF9saW5lYXJfaW5zZXJ0KF9faSk7CisJfQorICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIHNvcnQgcm91dGluZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgX19pbnNlcnRpb25fc29ydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1cm47CisKKyAgICAgIGZvciAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9faSA9IF9fZmlyc3QgKyAxOyBfX2kgIT0gX19sYXN0OyArK19faSkKKwl7CisJICBpZiAoX19jb21wKCpfX2ksICpfX2ZpcnN0KSkKKwkgICAgeworCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJCV9fdmFsID0gX0dMSUJDWFhfTU9WRSgqX19pKTsKKwkgICAgICBfR0xJQkNYWF9NT1ZFX0JBQ0tXQVJEMyhfX2ZpcnN0LCBfX2ksIF9faSArIDEpOworCSAgICAgICpfX2ZpcnN0ID0gX0dMSUJDWFhfTU9WRShfX3ZhbCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgc3RkOjpfX3VuZ3VhcmRlZF9saW5lYXJfaW5zZXJ0KF9faSwgX19jb21wKTsKKwl9CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgc29ydCByb3V0aW5lLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3VuZ3VhcmRlZF9pbnNlcnRpb25fc29ydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2kgPSBfX2ZpcnN0OyBfX2kgIT0gX19sYXN0OyArK19faSkKKwlzdGQ6Ol9fdW5ndWFyZGVkX2xpbmVhcl9pbnNlcnQoX19pKTsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBzb3J0IHJvdXRpbmUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3VuZ3VhcmRlZF9pbnNlcnRpb25fc29ydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIGZvciAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9faSA9IF9fZmlyc3Q7IF9faSAhPSBfX2xhc3Q7ICsrX19pKQorCXN0ZDo6X191bmd1YXJkZWRfbGluZWFyX2luc2VydChfX2ksIF9fY29tcCk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGRvY3RvZG8KKyAgICogIFRoaXMgY29udHJvbHMgc29tZSBhc3BlY3Qgb2YgdGhlIHNvcnQgcm91dGluZXMuCisgICovCisgIGVudW0geyBfU190aHJlc2hvbGQgPSAxNiB9OworCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgc29ydCByb3V0aW5lLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgdm9pZAorICAgIF9fZmluYWxfaW5zZXJ0aW9uX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIGlmIChfX2xhc3QgLSBfX2ZpcnN0ID4gaW50KF9TX3RocmVzaG9sZCkpCisJeworCSAgc3RkOjpfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fZmlyc3QgKyBpbnQoX1NfdGhyZXNob2xkKSk7CisJICBzdGQ6Ol9fdW5ndWFyZGVkX2luc2VydGlvbl9zb3J0KF9fZmlyc3QgKyBpbnQoX1NfdGhyZXNob2xkKSwgX19sYXN0KTsKKwl9CisgICAgICBlbHNlCisJc3RkOjpfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCk7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgc29ydCByb3V0aW5lLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX2ZpbmFsX2luc2VydGlvbl9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIGlmIChfX2xhc3QgLSBfX2ZpcnN0ID4gaW50KF9TX3RocmVzaG9sZCkpCisJeworCSAgc3RkOjpfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fZmlyc3QgKyBpbnQoX1NfdGhyZXNob2xkKSwgX19jb21wKTsKKwkgIHN0ZDo6X191bmd1YXJkZWRfaW5zZXJ0aW9uX3NvcnQoX19maXJzdCArIGludChfU190aHJlc2hvbGQpLCBfX2xhc3QsCisJCQkJCSAgX19jb21wKTsKKwl9CisgICAgICBlbHNlCisJc3RkOjpfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19jb21wKTsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24uLi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCisgICAgX191bmd1YXJkZWRfcGFydGl0aW9uKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LCBjb25zdCBfVHAmIF9fcGl2b3QpCisgICAgeworICAgICAgd2hpbGUgKHRydWUpCisJeworCSAgd2hpbGUgKCpfX2ZpcnN0IDwgX19waXZvdCkKKwkgICAgKytfX2ZpcnN0OworCSAgLS1fX2xhc3Q7CisJICB3aGlsZSAoX19waXZvdCA8ICpfX2xhc3QpCisJICAgIC0tX19sYXN0OworCSAgaWYgKCEoX19maXJzdCA8IF9fbGFzdCkpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgc3RkOjppdGVyX3N3YXAoX19maXJzdCwgX19sYXN0KTsKKwkgICsrX19maXJzdDsKKwl9CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uLi4uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IKKyAgICBfX3VuZ3VhcmRlZF9wYXJ0aXRpb24oX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJCQkgIGNvbnN0IF9UcCYgX19waXZvdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHdoaWxlICh0cnVlKQorCXsKKwkgIHdoaWxlIChfX2NvbXAoKl9fZmlyc3QsIF9fcGl2b3QpKQorCSAgICArK19fZmlyc3Q7CisJICAtLV9fbGFzdDsKKwkgIHdoaWxlIChfX2NvbXAoX19waXZvdCwgKl9fbGFzdCkpCisJICAgIC0tX19sYXN0OworCSAgaWYgKCEoX19maXJzdCA8IF9fbGFzdCkpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgc3RkOjppdGVyX3N3YXAoX19maXJzdCwgX19sYXN0KTsKKwkgICsrX19maXJzdDsKKwl9CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uLi4uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBpbmxpbmUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCisgICAgX191bmd1YXJkZWRfcGFydGl0aW9uX3Bpdm90KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkJCV9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbWlkID0gX19maXJzdCArIChfX2xhc3QgLSBfX2ZpcnN0KSAvIDI7CisgICAgICBzdGQ6Ol9fbW92ZV9tZWRpYW5fdG9fZmlyc3QoX19maXJzdCwgX19maXJzdCArIDEsIF9fbWlkLCBfX2xhc3QgLSAxKTsKKyAgICAgIHJldHVybiBzdGQ6Ol9fdW5ndWFyZGVkX3BhcnRpdGlvbihfX2ZpcnN0ICsgMSwgX19sYXN0LCAqX19maXJzdCk7CisgICAgfQorCisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24uLi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCisgICAgX191bmd1YXJkZWRfcGFydGl0aW9uX3Bpdm90KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkJCV9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0ICsgKF9fbGFzdCAtIF9fZmlyc3QpIC8gMjsKKyAgICAgIHN0ZDo6X19tb3ZlX21lZGlhbl90b19maXJzdChfX2ZpcnN0LCBfX2ZpcnN0ICsgMSwgX19taWQsIF9fbGFzdCAtIDEsCisJCQkJICBfX2NvbXApOworICAgICAgcmV0dXJuIHN0ZDo6X191bmd1YXJkZWRfcGFydGl0aW9uKF9fZmlyc3QgKyAxLCBfX2xhc3QsICpfX2ZpcnN0LCBfX2NvbXApOworICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIHNvcnQgcm91dGluZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZT4KKyAgICB2b2lkCisgICAgX19pbnRyb3NvcnRfbG9vcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCQkgICAgIF9TaXplIF9fZGVwdGhfbGltaXQpCisgICAgeworICAgICAgd2hpbGUgKF9fbGFzdCAtIF9fZmlyc3QgPiBpbnQoX1NfdGhyZXNob2xkKSkKKwl7CisJICBpZiAoX19kZXB0aF9saW1pdCA9PSAwKQorCSAgICB7CisJICAgICAgX0dMSUJDWFhfU1REX0E6OnBhcnRpYWxfc29ydChfX2ZpcnN0LCBfX2xhc3QsIF9fbGFzdCk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICAtLV9fZGVwdGhfbGltaXQ7CisJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19jdXQgPQorCSAgICBzdGQ6Ol9fdW5ndWFyZGVkX3BhcnRpdGlvbl9waXZvdChfX2ZpcnN0LCBfX2xhc3QpOworCSAgc3RkOjpfX2ludHJvc29ydF9sb29wKF9fY3V0LCBfX2xhc3QsIF9fZGVwdGhfbGltaXQpOworCSAgX19sYXN0ID0gX19jdXQ7CisJfQorICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIHNvcnQgcm91dGluZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9faW50cm9zb3J0X2xvb3AoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCSAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICBfU2l6ZSBfX2RlcHRoX2xpbWl0LCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgd2hpbGUgKF9fbGFzdCAtIF9fZmlyc3QgPiBpbnQoX1NfdGhyZXNob2xkKSkKKwl7CisJICBpZiAoX19kZXB0aF9saW1pdCA9PSAwKQorCSAgICB7CisJICAgICAgX0dMSUJDWFhfU1REX0E6OnBhcnRpYWxfc29ydChfX2ZpcnN0LCBfX2xhc3QsIF9fbGFzdCwgX19jb21wKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIC0tX19kZXB0aF9saW1pdDsKKwkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2N1dCA9CisJICAgIHN0ZDo6X191bmd1YXJkZWRfcGFydGl0aW9uX3Bpdm90KF9fZmlyc3QsIF9fbGFzdCwgX19jb21wKTsKKwkgIHN0ZDo6X19pbnRyb3NvcnRfbG9vcChfX2N1dCwgX19sYXN0LCBfX2RlcHRoX2xpbWl0LCBfX2NvbXApOworCSAgX19sYXN0ID0gX19jdXQ7CisJfQorICAgIH0KKworICAvLyBzb3J0CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZT4KKyAgICB2b2lkCisgICAgX19pbnRyb3NlbGVjdChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbnRoLAorCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9TaXplIF9fZGVwdGhfbGltaXQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIHdoaWxlIChfX2xhc3QgLSBfX2ZpcnN0ID4gMykKKwl7CisJICBpZiAoX19kZXB0aF9saW1pdCA9PSAwKQorCSAgICB7CisJICAgICAgc3RkOjpfX2hlYXBfc2VsZWN0KF9fZmlyc3QsIF9fbnRoICsgMSwgX19sYXN0KTsKKworCSAgICAgIC8vIFBsYWNlIHRoZSBudGggbGFyZ2VzdCBlbGVtZW50IGluIGl0cyBmaW5hbCBwb3NpdGlvbi4KKwkgICAgICBzdGQ6Oml0ZXJfc3dhcChfX2ZpcnN0LCBfX250aCk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICAtLV9fZGVwdGhfbGltaXQ7CisJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19jdXQgPQorCSAgICBzdGQ6Ol9fdW5ndWFyZGVkX3BhcnRpdGlvbl9waXZvdChfX2ZpcnN0LCBfX2xhc3QpOworCSAgaWYgKF9fY3V0IDw9IF9fbnRoKQorCSAgICBfX2ZpcnN0ID0gX19jdXQ7CisJICBlbHNlCisJICAgIF9fbGFzdCA9IF9fY3V0OworCX0KKyAgICAgIHN0ZDo6X19pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2xhc3QpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgX19pbnRyb3NlbGVjdChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbnRoLAorCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9TaXplIF9fZGVwdGhfbGltaXQsCisJCSAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+IDMpCisJeworCSAgaWYgKF9fZGVwdGhfbGltaXQgPT0gMCkKKwkgICAgeworCSAgICAgIHN0ZDo6X19oZWFwX3NlbGVjdChfX2ZpcnN0LCBfX250aCArIDEsIF9fbGFzdCwgX19jb21wKTsKKwkgICAgICAvLyBQbGFjZSB0aGUgbnRoIGxhcmdlc3QgZWxlbWVudCBpbiBpdHMgZmluYWwgcG9zaXRpb24uCisJICAgICAgc3RkOjppdGVyX3N3YXAoX19maXJzdCwgX19udGgpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgLS1fX2RlcHRoX2xpbWl0OworCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fY3V0ID0KKwkgICAgc3RkOjpfX3VuZ3VhcmRlZF9wYXJ0aXRpb25fcGl2b3QoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworCSAgaWYgKF9fY3V0IDw9IF9fbnRoKQorCSAgICBfX2ZpcnN0ID0gX19jdXQ7CisJICBlbHNlCisJICAgIF9fbGFzdCA9IF9fY3V0OworCX0KKyAgICAgIHN0ZDo6X19pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCk7CisgICAgfQorCisgIC8vIG50aF9lbGVtZW50CisKKyAgLy8gbG93ZXJfYm91bmQgbW92ZWQgdG8gc3RsX2FsZ29iYXNlLmgKKworICAvKioKKyAgICogIEBicmllZiBGaW5kcyB0aGUgZmlyc3QgcG9zaXRpb24gaW4gd2hpY2ggQHAgX192YWwgY291bGQgYmUgaW5zZXJ0ZWQKKyAgICogICAgICAgICB3aXRob3V0IGNoYW5naW5nIHRoZSBvcmRlcmluZy4KKyAgICogIEBpbmdyb3VwIGJpbmFyeV9zZWFyY2hfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ZhbCAgICAgVGhlIHNlYXJjaCB0ZXJtLgorICAgKiAgQHBhcmFtICBfX2NvbXAgICAgQSBmdW5jdG9yIHRvIHVzZSBmb3IgY29tcGFyaXNvbnMuCisgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IDxlbT5ub3QgbGVzcworICAgKiAgICAgICAgICAgdGhhbjwvZW0+IEBwIF9fdmFsLCBvciBlbmQoKSBpZiBldmVyeSBlbGVtZW50IGlzIGxlc3MKKyAgICogICAgICAgICAgIHRoYW4gQHAgX192YWwuCisgICAqICBAaW5ncm91cCBiaW5hcnlfc2VhcmNoX2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoZSBjb21wYXJpc29uIGZ1bmN0aW9uIHNob3VsZCBoYXZlIHRoZSBzYW1lIGVmZmVjdHMgb24gb3JkZXJpbmcgYXMKKyAgICogIHRoZSBmdW5jdGlvbiB1c2VkIGZvciB0aGUgaW5pdGlhbCBzb3J0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBsb3dlcl9ib3VuZChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQljb25zdCBfVHAmIF9fdmFsLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaXN0YW5jZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfVmFsdWVUeXBlLCBfVHA+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3BhcnRpdGlvbmVkX2xvd2VyX3ByZWQoX19maXJzdCwgX19sYXN0LAorCQkJCQkJX192YWwsIF9fY29tcCk7CisKKyAgICAgIF9EaXN0YW5jZVR5cGUgX19sZW4gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHdoaWxlIChfX2xlbiA+IDApCisJeworCSAgX0Rpc3RhbmNlVHlwZSBfX2hhbGYgPSBfX2xlbiA+PiAxOworCSAgX0ZvcndhcmRJdGVyYXRvciBfX21pZGRsZSA9IF9fZmlyc3Q7CisJICBzdGQ6OmFkdmFuY2UoX19taWRkbGUsIF9faGFsZik7CisJICBpZiAoX19jb21wKCpfX21pZGRsZSwgX192YWwpKQorCSAgICB7CisJICAgICAgX19maXJzdCA9IF9fbWlkZGxlOworCSAgICAgICsrX19maXJzdDsKKwkgICAgICBfX2xlbiA9IF9fbGVuIC0gX19oYWxmIC0gMTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBfX2xlbiA9IF9faGFsZjsKKwl9CisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRmluZHMgdGhlIGxhc3QgcG9zaXRpb24gaW4gd2hpY2ggQHAgX192YWwgY291bGQgYmUgaW5zZXJ0ZWQKKyAgICogICAgICAgICB3aXRob3V0IGNoYW5naW5nIHRoZSBvcmRlcmluZy4KKyAgICogIEBpbmdyb3VwIGJpbmFyeV9zZWFyY2hfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ZhbCAgICAgVGhlIHNlYXJjaCB0ZXJtLgorICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgZ3JlYXRlciB0aGFuIEBwIF9fdmFsLAorICAgKiAgICAgICAgICAgb3IgZW5kKCkgaWYgbm8gZWxlbWVudHMgYXJlIGdyZWF0ZXIgdGhhbiBAcCBfX3ZhbC4KKyAgICogIEBpbmdyb3VwIGJpbmFyeV9zZWFyY2hfYWxnb3JpdGhtcworICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIHVwcGVyX2JvdW5kKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCWNvbnN0IF9UcCYgX192YWwpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaXN0YW5jZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9UcCwgX1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfdXBwZXIoX19maXJzdCwgX19sYXN0LCBfX3ZhbCk7CisKKyAgICAgIF9EaXN0YW5jZVR5cGUgX19sZW4gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHdoaWxlIChfX2xlbiA+IDApCisJeworCSAgX0Rpc3RhbmNlVHlwZSBfX2hhbGYgPSBfX2xlbiA+PiAxOworCSAgX0ZvcndhcmRJdGVyYXRvciBfX21pZGRsZSA9IF9fZmlyc3Q7CisJICBzdGQ6OmFkdmFuY2UoX19taWRkbGUsIF9faGFsZik7CisJICBpZiAoX192YWwgPCAqX19taWRkbGUpCisJICAgIF9fbGVuID0gX19oYWxmOworCSAgZWxzZQorCSAgICB7CisJICAgICAgX19maXJzdCA9IF9fbWlkZGxlOworCSAgICAgICsrX19maXJzdDsKKwkgICAgICBfX2xlbiA9IF9fbGVuIC0gX19oYWxmIC0gMTsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBGaW5kcyB0aGUgbGFzdCBwb3NpdGlvbiBpbiB3aGljaCBAcCBfX3ZhbCBjb3VsZCBiZSBpbnNlcnRlZAorICAgKiAgICAgICAgIHdpdGhvdXQgY2hhbmdpbmcgdGhlIG9yZGVyaW5nLgorICAgKiAgQGluZ3JvdXAgYmluYXJ5X3NlYXJjaF9hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fdmFsICAgICBUaGUgc2VhcmNoIHRlcm0uCisgICAqICBAcGFyYW0gIF9fY29tcCAgICBBIGZ1bmN0b3IgdG8gdXNlIGZvciBjb21wYXJpc29ucy4KKyAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IGdyZWF0ZXIgdGhhbiBAcCBfX3ZhbCwKKyAgICogICAgICAgICAgIG9yIGVuZCgpIGlmIG5vIGVsZW1lbnRzIGFyZSBncmVhdGVyIHRoYW4gQHAgX192YWwuCisgICAqICBAaW5ncm91cCBiaW5hcnlfc2VhcmNoX2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoZSBjb21wYXJpc29uIGZ1bmN0aW9uIHNob3VsZCBoYXZlIHRoZSBzYW1lIGVmZmVjdHMgb24gb3JkZXJpbmcgYXMKKyAgICogIHRoZSBmdW5jdGlvbiB1c2VkIGZvciB0aGUgaW5pdGlhbCBzb3J0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICB1cHBlcl9ib3VuZChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQljb25zdCBfVHAmIF9fdmFsLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaXN0YW5jZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfVHAsIF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3BhcnRpdGlvbmVkX3VwcGVyX3ByZWQoX19maXJzdCwgX19sYXN0LAorCQkJCQkJX192YWwsIF9fY29tcCk7CisKKyAgICAgIF9EaXN0YW5jZVR5cGUgX19sZW4gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHdoaWxlIChfX2xlbiA+IDApCisJeworCSAgX0Rpc3RhbmNlVHlwZSBfX2hhbGYgPSBfX2xlbiA+PiAxOworCSAgX0ZvcndhcmRJdGVyYXRvciBfX21pZGRsZSA9IF9fZmlyc3Q7CisJICBzdGQ6OmFkdmFuY2UoX19taWRkbGUsIF9faGFsZik7CisJICBpZiAoX19jb21wKF9fdmFsLCAqX19taWRkbGUpKQorCSAgICBfX2xlbiA9IF9faGFsZjsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9fZmlyc3QgPSBfX21pZGRsZTsKKwkgICAgICArK19fZmlyc3Q7CisJICAgICAgX19sZW4gPSBfX2xlbiAtIF9faGFsZiAtIDE7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRmluZHMgdGhlIGxhcmdlc3Qgc3VicmFuZ2UgaW4gd2hpY2ggQHAgX192YWwgY291bGQgYmUgaW5zZXJ0ZWQKKyAgICogICAgICAgICBhdCBhbnkgcGxhY2UgaW4gaXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgb3JkZXJpbmcuCisgICAqICBAaW5ncm91cCBiaW5hcnlfc2VhcmNoX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX192YWwgICAgIFRoZSBzZWFyY2ggdGVybS4KKyAgICogIEByZXR1cm4gIEFuIHBhaXIgb2YgaXRlcmF0b3JzIGRlZmluaW5nIHRoZSBzdWJyYW5nZS4KKyAgICogIEBpbmdyb3VwIGJpbmFyeV9zZWFyY2hfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvCisgICAqICBAY29kZQorICAgKiAgICBzdGQ6Om1ha2VfcGFpcihsb3dlcl9ib3VuZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsKSwKKyAgICogICAgICAgICAgICAgICAgICAgdXBwZXJfYm91bmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbCkpCisgICAqICBAZW5kY29kZQorICAgKiAgYnV0IGRvZXMgbm90IGFjdHVhbGx5IGNhbGwgdGhvc2UgZnVuY3Rpb25zLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgcGFpcjxfRm9yd2FyZEl0ZXJhdG9yLCBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIGVxdWFsX3JhbmdlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCWNvbnN0IF9UcCYgX192YWwpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaXN0YW5jZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9WYWx1ZVR5cGUsIF9UcD4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9UcCwgX1ZhbHVlVHlwZT4pCQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3BhcnRpdGlvbmVkX2xvd2VyKF9fZmlyc3QsIF9fbGFzdCwgX192YWwpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3BhcnRpdGlvbmVkX3VwcGVyKF9fZmlyc3QsIF9fbGFzdCwgX192YWwpOyAgICAgIAorCisgICAgICBfRGlzdGFuY2VUeXBlIF9fbGVuID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworIAorICAgICAgd2hpbGUgKF9fbGVuID4gMCkKKwl7CisJICBfRGlzdGFuY2VUeXBlIF9faGFsZiA9IF9fbGVuID4+IDE7CisJICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkZGxlID0gX19maXJzdDsKKwkgIHN0ZDo6YWR2YW5jZShfX21pZGRsZSwgX19oYWxmKTsKKwkgIGlmICgqX19taWRkbGUgPCBfX3ZhbCkKKwkgICAgeworCSAgICAgIF9fZmlyc3QgPSBfX21pZGRsZTsKKwkgICAgICArK19fZmlyc3Q7CisJICAgICAgX19sZW4gPSBfX2xlbiAtIF9faGFsZiAtIDE7CisJICAgIH0KKwkgIGVsc2UgaWYgKF9fdmFsIDwgKl9fbWlkZGxlKQorCSAgICBfX2xlbiA9IF9faGFsZjsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sZWZ0ID0gc3RkOjpsb3dlcl9ib3VuZChfX2ZpcnN0LCBfX21pZGRsZSwKKwkJCQkJCQkgX192YWwpOworCSAgICAgIHN0ZDo6YWR2YW5jZShfX2ZpcnN0LCBfX2xlbik7CisJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3JpZ2h0ID0gc3RkOjp1cHBlcl9ib3VuZCgrK19fbWlkZGxlLCBfX2ZpcnN0LAorCQkJCQkJCSAgX192YWwpOworCSAgICAgIHJldHVybiBwYWlyPF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3I+KF9fbGVmdCwgX19yaWdodCk7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gcGFpcjxfRm9yd2FyZEl0ZXJhdG9yLCBfRm9yd2FyZEl0ZXJhdG9yPihfX2ZpcnN0LCBfX2ZpcnN0KTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRmluZHMgdGhlIGxhcmdlc3Qgc3VicmFuZ2UgaW4gd2hpY2ggQHAgX192YWwgY291bGQgYmUgaW5zZXJ0ZWQKKyAgICogICAgICAgICBhdCBhbnkgcGxhY2UgaW4gaXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgb3JkZXJpbmcuCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fdmFsICAgICBUaGUgc2VhcmNoIHRlcm0uCisgICAqICBAcGFyYW0gIF9fY29tcCAgICBBIGZ1bmN0b3IgdG8gdXNlIGZvciBjb21wYXJpc29ucy4KKyAgICogIEByZXR1cm4gIEFuIHBhaXIgb2YgaXRlcmF0b3JzIGRlZmluaW5nIHRoZSBzdWJyYW5nZS4KKyAgICogIEBpbmdyb3VwIGJpbmFyeV9zZWFyY2hfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvCisgICAqICBAY29kZQorICAgKiAgICBzdGQ6Om1ha2VfcGFpcihsb3dlcl9ib3VuZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsLCBfX2NvbXApLAorICAgKiAgICAgICAgICAgICAgICAgICB1cHBlcl9ib3VuZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsLCBfX2NvbXApKQorICAgKiAgQGVuZGNvZGUKKyAgICogIGJ1dCBkb2VzIG5vdCBhY3R1YWxseSBjYWxsIHRob3NlIGZ1bmN0aW9ucy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBwYWlyPF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgZXF1YWxfcmFuZ2UoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJY29uc3QgX1RwJiBfX3ZhbCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2VUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCQkJCSAgX1ZhbHVlVHlwZSwgX1RwPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9UcCwgX1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfbG93ZXJfcHJlZChfX2ZpcnN0LCBfX2xhc3QsCisJCQkJCQlfX3ZhbCwgX19jb21wKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19wYXJ0aXRpb25lZF91cHBlcl9wcmVkKF9fZmlyc3QsIF9fbGFzdCwKKwkJCQkJCV9fdmFsLCBfX2NvbXApOworCisgICAgICBfRGlzdGFuY2VUeXBlIF9fbGVuID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICB3aGlsZSAoX19sZW4gPiAwKQorCXsKKwkgIF9EaXN0YW5jZVR5cGUgX19oYWxmID0gX19sZW4gPj4gMTsKKwkgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWRkbGUgPSBfX2ZpcnN0OworCSAgc3RkOjphZHZhbmNlKF9fbWlkZGxlLCBfX2hhbGYpOworCSAgaWYgKF9fY29tcCgqX19taWRkbGUsIF9fdmFsKSkKKwkgICAgeworCSAgICAgIF9fZmlyc3QgPSBfX21pZGRsZTsKKwkgICAgICArK19fZmlyc3Q7CisJICAgICAgX19sZW4gPSBfX2xlbiAtIF9faGFsZiAtIDE7CisJICAgIH0KKwkgIGVsc2UgaWYgKF9fY29tcChfX3ZhbCwgKl9fbWlkZGxlKSkKKwkgICAgX19sZW4gPSBfX2hhbGY7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGVmdCA9IHN0ZDo6bG93ZXJfYm91bmQoX19maXJzdCwgX19taWRkbGUsCisJCQkJCQkJIF9fdmFsLCBfX2NvbXApOworCSAgICAgIHN0ZDo6YWR2YW5jZShfX2ZpcnN0LCBfX2xlbik7CisJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3JpZ2h0ID0gc3RkOjp1cHBlcl9ib3VuZCgrK19fbWlkZGxlLCBfX2ZpcnN0LAorCQkJCQkJCSAgX192YWwsIF9fY29tcCk7CisJICAgICAgcmV0dXJuIHBhaXI8X0ZvcndhcmRJdGVyYXRvciwgX0ZvcndhcmRJdGVyYXRvcj4oX19sZWZ0LCBfX3JpZ2h0KTsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBwYWlyPF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3I+KF9fZmlyc3QsIF9fZmlyc3QpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZWxlbWVudCBleGlzdHMgaW4gYSByYW5nZS4KKyAgICogIEBpbmdyb3VwIGJpbmFyeV9zZWFyY2hfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ZhbCAgICAgVGhlIHNlYXJjaCB0ZXJtLgorICAgKiAgQHJldHVybiBUcnVlIGlmIEBwIF9fdmFsIChvciBpdHMgZXF1aXZhbGVudCkgaXMgaW4gW0BwCisgICAqICBfX2ZpcnN0LEBwIF9fbGFzdCBdLgorICAgKgorICAgKiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgYWN0dWFsbHkgcmV0dXJuIGFuIGl0ZXJhdG9yIHRvIEBwIF9fdmFsLiAgRm9yCisgICAqICB0aGF0LCB1c2Ugc3RkOjpmaW5kIG9yIGEgY29udGFpbmVyJ3Mgc3BlY2lhbGl6ZWQgZmluZCBtZW1iZXIgZnVuY3Rpb25zLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgYm9vbAorICAgIGJpbmFyeV9zZWFyY2goX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX192YWwpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbk9wQ29uY2VwdDxfVHAsIF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3BhcnRpdGlvbmVkX2xvd2VyKF9fZmlyc3QsIF9fbGFzdCwgX192YWwpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3BhcnRpdGlvbmVkX3VwcGVyKF9fZmlyc3QsIF9fbGFzdCwgX192YWwpOworCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9faSA9IHN0ZDo6bG93ZXJfYm91bmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbCk7CisgICAgICByZXR1cm4gX19pICE9IF9fbGFzdCAmJiAhKF9fdmFsIDwgKl9faSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIERldGVybWluZXMgd2hldGhlciBhbiBlbGVtZW50IGV4aXN0cyBpbiBhIHJhbmdlLgorICAgKiAgQGluZ3JvdXAgYmluYXJ5X3NlYXJjaF9hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fdmFsICAgICBUaGUgc2VhcmNoIHRlcm0uCisgICAqICBAcGFyYW0gIF9fY29tcCAgICBBIGZ1bmN0b3IgdG8gdXNlIGZvciBjb21wYXJpc29ucy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQHAgX192YWwgKG9yIGl0cyBlcXVpdmFsZW50KSBpcyBpbiBAcCBbX19maXJzdCxfX2xhc3RdLgorICAgKgorICAgKiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgYWN0dWFsbHkgcmV0dXJuIGFuIGl0ZXJhdG9yIHRvIEBwIF9fdmFsLiAgRm9yCisgICAqICB0aGF0LCB1c2Ugc3RkOjpmaW5kIG9yIGEgY29udGFpbmVyJ3Mgc3BlY2lhbGl6ZWQgZmluZCBtZW1iZXIgZnVuY3Rpb25zLgorICAgKgorICAgKiAgVGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gc2hvdWxkIGhhdmUgdGhlIHNhbWUgZWZmZWN0cyBvbiBvcmRlcmluZyBhcworICAgKiAgdGhlIGZ1bmN0aW9uIHVzZWQgZm9yIHRoZSBpbml0aWFsIHNvcnQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgYm9vbAorICAgIGJpbmFyeV9zZWFyY2goX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX192YWwsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfVHAsIF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3BhcnRpdGlvbmVkX2xvd2VyX3ByZWQoX19maXJzdCwgX19sYXN0LAorCQkJCQkJX192YWwsIF9fY29tcCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfdXBwZXJfcHJlZChfX2ZpcnN0LCBfX2xhc3QsCisJCQkJCQlfX3ZhbCwgX19jb21wKTsKKworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2kgPSBzdGQ6Omxvd2VyX2JvdW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWwsIF9fY29tcCk7CisgICAgICByZXR1cm4gX19pICE9IF9fbGFzdCAmJiAhYm9vbChfX2NvbXAoX192YWwsICpfX2kpKTsKKyAgICB9CisKKyAgLy8gbWVyZ2UKKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIF9fbWVyZ2VfYWRhcHRpdmUgcm91dGluZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgX19tb3ZlX21lcmdlX2FkYXB0aXZlKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJCQkgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsCisJCQkgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKQorCXsKKwkgIGlmICgqX19maXJzdDIgPCAqX19maXJzdDEpCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSBfR0xJQkNYWF9NT1ZFKCpfX2ZpcnN0Mik7CisJICAgICAgKytfX2ZpcnN0MjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgKl9fcmVzdWx0ID0gX0dMSUJDWFhfTU9WRSgqX19maXJzdDEpOworCSAgICAgICsrX19maXJzdDE7CisJICAgIH0KKwkgICsrX19yZXN1bHQ7CisJfQorICAgICAgaWYgKF9fZmlyc3QxICE9IF9fbGFzdDEpCisJX0dMSUJDWFhfTU9WRTMoX19maXJzdDEsIF9fbGFzdDEsIF9fcmVzdWx0KTsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBfX21lcmdlX2FkYXB0aXZlIHJvdXRpbmVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX21vdmVfbWVyZ2VfYWRhcHRpdmUoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkJCSAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwKKwkJCSAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwl7CisJICBpZiAoX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSkKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9IF9HTElCQ1hYX01PVkUoKl9fZmlyc3QyKTsKKwkgICAgICArK19fZmlyc3QyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSBfR0xJQkNYWF9NT1ZFKCpfX2ZpcnN0MSk7CisJICAgICAgKytfX2ZpcnN0MTsKKwkgICAgfQorCSAgKytfX3Jlc3VsdDsKKwl9CisgICAgICBpZiAoX19maXJzdDEgIT0gX19sYXN0MSkKKwlfR0xJQkNYWF9NT1ZFMyhfX2ZpcnN0MSwgX19sYXN0MSwgX19yZXN1bHQpOworICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIF9fbWVyZ2VfYWRhcHRpdmUgcm91dGluZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxLCB0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMz4KKyAgICB2b2lkCisgICAgX19tb3ZlX21lcmdlX2FkYXB0aXZlX2JhY2t3YXJkKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxIF9fZmlyc3QxLAorCQkJCSAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxIF9fbGFzdDEsCisJCQkJICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjIgX19maXJzdDIsCisJCQkJICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjIgX19sYXN0MiwKKwkJCQkgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMyBfX3Jlc3VsdCkKKyAgICB7CisgICAgICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSkKKwl7CisJICBfR0xJQkNYWF9NT1ZFX0JBQ0tXQVJEMyhfX2ZpcnN0MiwgX19sYXN0MiwgX19yZXN1bHQpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKF9fZmlyc3QyID09IF9fbGFzdDIpCisJcmV0dXJuOworCisgICAgICAtLV9fbGFzdDE7CisgICAgICAtLV9fbGFzdDI7CisgICAgICB3aGlsZSAodHJ1ZSkKKwl7CisJICBpZiAoKl9fbGFzdDIgPCAqX19sYXN0MSkKKwkgICAgeworCSAgICAgICotLV9fcmVzdWx0ID0gX0dMSUJDWFhfTU9WRSgqX19sYXN0MSk7CisJICAgICAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEpCisJCXsKKwkJICBfR0xJQkNYWF9NT1ZFX0JBQ0tXQVJEMyhfX2ZpcnN0MiwgKytfX2xhc3QyLCBfX3Jlc3VsdCk7CisJCSAgcmV0dXJuOworCQl9CisJICAgICAgLS1fX2xhc3QxOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAqLS1fX3Jlc3VsdCA9IF9HTElCQ1hYX01PVkUoKl9fbGFzdDIpOworCSAgICAgIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQorCQlyZXR1cm47CisJICAgICAgLS1fX2xhc3QyOworCSAgICB9CisJfQorICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIF9fbWVyZ2VfYWRhcHRpdmUgcm91dGluZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxLCB0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMywgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9fbW92ZV9tZXJnZV9hZGFwdGl2ZV9iYWNrd2FyZChfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMSBfX2ZpcnN0MSwKKwkJCQkgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMSBfX2xhc3QxLAorCQkJCSAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyIF9fZmlyc3QyLAorCQkJCSAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyIF9fbGFzdDIsCisJCQkJICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjMgX19yZXN1bHQsCisJCQkJICAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxKQorCXsKKwkgIF9HTElCQ1hYX01PVkVfQkFDS1dBUkQzKF9fZmlyc3QyLCBfX2xhc3QyLCBfX3Jlc3VsdCk7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZSBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKKwlyZXR1cm47CisKKyAgICAgIC0tX19sYXN0MTsKKyAgICAgIC0tX19sYXN0MjsKKyAgICAgIHdoaWxlICh0cnVlKQorCXsKKwkgIGlmIChfX2NvbXAoKl9fbGFzdDIsICpfX2xhc3QxKSkKKwkgICAgeworCSAgICAgICotLV9fcmVzdWx0ID0gX0dMSUJDWFhfTU9WRSgqX19sYXN0MSk7CisJICAgICAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEpCisJCXsKKwkJICBfR0xJQkNYWF9NT1ZFX0JBQ0tXQVJEMyhfX2ZpcnN0MiwgKytfX2xhc3QyLCBfX3Jlc3VsdCk7CisJCSAgcmV0dXJuOworCQl9CisJICAgICAgLS1fX2xhc3QxOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAqLS1fX3Jlc3VsdCA9IF9HTElCQ1hYX01PVkUoKl9fbGFzdDIpOworCSAgICAgIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQorCQlyZXR1cm47CisJICAgICAgLS1fX2xhc3QyOworCSAgICB9CisJfQorICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIG1lcmdlIHJvdXRpbmVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX0Rpc3RhbmNlPgorICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxCisgICAgX19yb3RhdGVfYWRhcHRpdmUoX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEgX19maXJzdCwKKwkJICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEgX19taWRkbGUsCisJCSAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxIF9fbGFzdCwKKwkJICAgICAgX0Rpc3RhbmNlIF9fbGVuMSwgX0Rpc3RhbmNlIF9fbGVuMiwKKwkJICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjIgX19idWZmZXIsCisJCSAgICAgIF9EaXN0YW5jZSBfX2J1ZmZlcl9zaXplKQorICAgIHsKKyAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyIF9fYnVmZmVyX2VuZDsKKyAgICAgIGlmIChfX2xlbjEgPiBfX2xlbjIgJiYgX19sZW4yIDw9IF9fYnVmZmVyX3NpemUpCisJeworCSAgaWYgKF9fbGVuMikKKwkgICAgeworCSAgICAgIF9fYnVmZmVyX2VuZCA9IF9HTElCQ1hYX01PVkUzKF9fbWlkZGxlLCBfX2xhc3QsIF9fYnVmZmVyKTsKKwkgICAgICBfR0xJQkNYWF9NT1ZFX0JBQ0tXQVJEMyhfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0KTsKKwkgICAgICByZXR1cm4gX0dMSUJDWFhfTU9WRTMoX19idWZmZXIsIF9fYnVmZmVyX2VuZCwgX19maXJzdCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJfQorICAgICAgZWxzZSBpZiAoX19sZW4xIDw9IF9fYnVmZmVyX3NpemUpCisJeworCSAgaWYgKF9fbGVuMSkKKwkgICAgeworCSAgICAgIF9fYnVmZmVyX2VuZCA9IF9HTElCQ1hYX01PVkUzKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2J1ZmZlcik7CisJICAgICAgX0dMSUJDWFhfTU9WRTMoX19taWRkbGUsIF9fbGFzdCwgX19maXJzdCk7CisJICAgICAgcmV0dXJuIF9HTElCQ1hYX01PVkVfQkFDS1dBUkQzKF9fYnVmZmVyLCBfX2J1ZmZlcl9lbmQsIF9fbGFzdCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgcmV0dXJuIF9fbGFzdDsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3RkOjpyb3RhdGUoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCk7CisJICBzdGQ6OmFkdmFuY2UoX19maXJzdCwgc3RkOjpkaXN0YW5jZShfX21pZGRsZSwgX19sYXN0KSk7CisJICByZXR1cm4gX19maXJzdDsKKwl9CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgbWVyZ2Ugcm91dGluZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZSwKKwkgICB0eXBlbmFtZSBfUG9pbnRlcj4KKyAgICB2b2lkCisgICAgX19tZXJnZV9hZGFwdGl2ZShfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbWlkZGxlLAorCQkgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0LAorCQkgICAgIF9EaXN0YW5jZSBfX2xlbjEsIF9EaXN0YW5jZSBfX2xlbjIsCisJCSAgICAgX1BvaW50ZXIgX19idWZmZXIsIF9EaXN0YW5jZSBfX2J1ZmZlcl9zaXplKQorICAgIHsKKyAgICAgIGlmIChfX2xlbjEgPD0gX19sZW4yICYmIF9fbGVuMSA8PSBfX2J1ZmZlcl9zaXplKQorCXsKKwkgIF9Qb2ludGVyIF9fYnVmZmVyX2VuZCA9IF9HTElCQ1hYX01PVkUzKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2J1ZmZlcik7CisJICBzdGQ6Ol9fbW92ZV9tZXJnZV9hZGFwdGl2ZShfX2J1ZmZlciwgX19idWZmZXJfZW5kLCBfX21pZGRsZSwgX19sYXN0LAorCQkJCSAgICAgX19maXJzdCk7CisJfQorICAgICAgZWxzZSBpZiAoX19sZW4yIDw9IF9fYnVmZmVyX3NpemUpCisJeworCSAgX1BvaW50ZXIgX19idWZmZXJfZW5kID0gX0dMSUJDWFhfTU9WRTMoX19taWRkbGUsIF9fbGFzdCwgX19idWZmZXIpOworCSAgc3RkOjpfX21vdmVfbWVyZ2VfYWRhcHRpdmVfYmFja3dhcmQoX19maXJzdCwgX19taWRkbGUsIF9fYnVmZmVyLAorCQkJCQkgICAgICBfX2J1ZmZlcl9lbmQsIF9fbGFzdCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdF9jdXQgPSBfX2ZpcnN0OworCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX3NlY29uZF9jdXQgPSBfX21pZGRsZTsKKwkgIF9EaXN0YW5jZSBfX2xlbjExID0gMDsKKwkgIF9EaXN0YW5jZSBfX2xlbjIyID0gMDsKKwkgIGlmIChfX2xlbjEgPiBfX2xlbjIpCisJICAgIHsKKwkgICAgICBfX2xlbjExID0gX19sZW4xIC8gMjsKKwkgICAgICBzdGQ6OmFkdmFuY2UoX19maXJzdF9jdXQsIF9fbGVuMTEpOworCSAgICAgIF9fc2Vjb25kX2N1dCA9IHN0ZDo6bG93ZXJfYm91bmQoX19taWRkbGUsIF9fbGFzdCwKKwkJCQkJICAgICAgKl9fZmlyc3RfY3V0KTsKKwkgICAgICBfX2xlbjIyID0gc3RkOjpkaXN0YW5jZShfX21pZGRsZSwgX19zZWNvbmRfY3V0KTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgX19sZW4yMiA9IF9fbGVuMiAvIDI7CisJICAgICAgc3RkOjphZHZhbmNlKF9fc2Vjb25kX2N1dCwgX19sZW4yMik7CisJICAgICAgX19maXJzdF9jdXQgPSBzdGQ6OnVwcGVyX2JvdW5kKF9fZmlyc3QsIF9fbWlkZGxlLAorCQkJCQkgICAgICpfX3NlY29uZF9jdXQpOworCSAgICAgIF9fbGVuMTEgPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fZmlyc3RfY3V0KTsKKwkgICAgfQorCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX25ld19taWRkbGUgPQorCSAgICBzdGQ6Ol9fcm90YXRlX2FkYXB0aXZlKF9fZmlyc3RfY3V0LCBfX21pZGRsZSwgX19zZWNvbmRfY3V0LAorCQkJCSAgIF9fbGVuMSAtIF9fbGVuMTEsIF9fbGVuMjIsIF9fYnVmZmVyLAorCQkJCSAgIF9fYnVmZmVyX3NpemUpOworCSAgc3RkOjpfX21lcmdlX2FkYXB0aXZlKF9fZmlyc3QsIF9fZmlyc3RfY3V0LCBfX25ld19taWRkbGUsIF9fbGVuMTEsCisJCQkJX19sZW4yMiwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUpOworCSAgc3RkOjpfX21lcmdlX2FkYXB0aXZlKF9fbmV3X21pZGRsZSwgX19zZWNvbmRfY3V0LCBfX2xhc3QsCisJCQkJX19sZW4xIC0gX19sZW4xMSwKKwkJCQlfX2xlbjIgLSBfX2xlbjIyLCBfX2J1ZmZlciwgX19idWZmZXJfc2l6ZSk7CisJfQorICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIG1lcmdlIHJvdXRpbmVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCB0eXBlbmFtZSBfRGlzdGFuY2UsIAorCSAgIHR5cGVuYW1lIF9Qb2ludGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgX19tZXJnZV9hZGFwdGl2ZShfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbWlkZGxlLAorCQkgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0LAorCQkgICAgIF9EaXN0YW5jZSBfX2xlbjEsIF9EaXN0YW5jZSBfX2xlbjIsCisJCSAgICAgX1BvaW50ZXIgX19idWZmZXIsIF9EaXN0YW5jZSBfX2J1ZmZlcl9zaXplLAorCQkgICAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBpZiAoX19sZW4xIDw9IF9fbGVuMiAmJiBfX2xlbjEgPD0gX19idWZmZXJfc2l6ZSkKKwl7CisJICBfUG9pbnRlciBfX2J1ZmZlcl9lbmQgPSBfR0xJQkNYWF9NT1ZFMyhfX2ZpcnN0LCBfX21pZGRsZSwgX19idWZmZXIpOworCSAgc3RkOjpfX21vdmVfbWVyZ2VfYWRhcHRpdmUoX19idWZmZXIsIF9fYnVmZmVyX2VuZCwgX19taWRkbGUsIF9fbGFzdCwKKwkJCQkgICAgIF9fZmlyc3QsIF9fY29tcCk7CisJfQorICAgICAgZWxzZSBpZiAoX19sZW4yIDw9IF9fYnVmZmVyX3NpemUpCisJeworCSAgX1BvaW50ZXIgX19idWZmZXJfZW5kID0gX0dMSUJDWFhfTU9WRTMoX19taWRkbGUsIF9fbGFzdCwgX19idWZmZXIpOworCSAgc3RkOjpfX21vdmVfbWVyZ2VfYWRhcHRpdmVfYmFja3dhcmQoX19maXJzdCwgX19taWRkbGUsIF9fYnVmZmVyLAorCQkJCQkgICAgICBfX2J1ZmZlcl9lbmQsIF9fbGFzdCwgX19jb21wKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0X2N1dCA9IF9fZmlyc3Q7CisJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fc2Vjb25kX2N1dCA9IF9fbWlkZGxlOworCSAgX0Rpc3RhbmNlIF9fbGVuMTEgPSAwOworCSAgX0Rpc3RhbmNlIF9fbGVuMjIgPSAwOworCSAgaWYgKF9fbGVuMSA+IF9fbGVuMikKKwkgICAgeworCSAgICAgIF9fbGVuMTEgPSBfX2xlbjEgLyAyOworCSAgICAgIHN0ZDo6YWR2YW5jZShfX2ZpcnN0X2N1dCwgX19sZW4xMSk7CisJICAgICAgX19zZWNvbmRfY3V0ID0gc3RkOjpsb3dlcl9ib3VuZChfX21pZGRsZSwgX19sYXN0LCAqX19maXJzdF9jdXQsCisJCQkJCSAgICAgIF9fY29tcCk7CisJICAgICAgX19sZW4yMiA9IHN0ZDo6ZGlzdGFuY2UoX19taWRkbGUsIF9fc2Vjb25kX2N1dCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9fbGVuMjIgPSBfX2xlbjIgLyAyOworCSAgICAgIHN0ZDo6YWR2YW5jZShfX3NlY29uZF9jdXQsIF9fbGVuMjIpOworCSAgICAgIF9fZmlyc3RfY3V0ID0gc3RkOjp1cHBlcl9ib3VuZChfX2ZpcnN0LCBfX21pZGRsZSwgKl9fc2Vjb25kX2N1dCwKKwkJCQkJICAgICBfX2NvbXApOworCSAgICAgIF9fbGVuMTEgPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fZmlyc3RfY3V0KTsKKwkgICAgfQorCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX25ld19taWRkbGUgPQorCSAgICBzdGQ6Ol9fcm90YXRlX2FkYXB0aXZlKF9fZmlyc3RfY3V0LCBfX21pZGRsZSwgX19zZWNvbmRfY3V0LAorCQkJCSAgIF9fbGVuMSAtIF9fbGVuMTEsIF9fbGVuMjIsIF9fYnVmZmVyLAorCQkJCSAgIF9fYnVmZmVyX3NpemUpOworCSAgc3RkOjpfX21lcmdlX2FkYXB0aXZlKF9fZmlyc3QsIF9fZmlyc3RfY3V0LCBfX25ld19taWRkbGUsIF9fbGVuMTEsCisJCQkJX19sZW4yMiwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUsIF9fY29tcCk7CisJICBzdGQ6Ol9fbWVyZ2VfYWRhcHRpdmUoX19uZXdfbWlkZGxlLCBfX3NlY29uZF9jdXQsIF9fbGFzdCwKKwkJCQlfX2xlbjEgLSBfX2xlbjExLAorCQkJCV9fbGVuMiAtIF9fbGVuMjIsIF9fYnVmZmVyLAorCQkJCV9fYnVmZmVyX3NpemUsIF9fY29tcCk7CisJfQorICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIG1lcmdlIHJvdXRpbmVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCB0eXBlbmFtZSBfRGlzdGFuY2U+CisgICAgdm9pZAorICAgIF9fbWVyZ2Vfd2l0aG91dF9idWZmZXIoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX21pZGRsZSwKKwkJCSAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0LAorCQkJICAgX0Rpc3RhbmNlIF9fbGVuMSwgX0Rpc3RhbmNlIF9fbGVuMikKKyAgICB7CisgICAgICBpZiAoX19sZW4xID09IDAgfHwgX19sZW4yID09IDApCisJcmV0dXJuOworICAgICAgaWYgKF9fbGVuMSArIF9fbGVuMiA9PSAyKQorCXsKKwkgIGlmICgqX19taWRkbGUgPCAqX19maXJzdCkKKwkgICAgc3RkOjppdGVyX3N3YXAoX19maXJzdCwgX19taWRkbGUpOworCSAgcmV0dXJuOworCX0KKyAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdF9jdXQgPSBfX2ZpcnN0OworICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX3NlY29uZF9jdXQgPSBfX21pZGRsZTsKKyAgICAgIF9EaXN0YW5jZSBfX2xlbjExID0gMDsKKyAgICAgIF9EaXN0YW5jZSBfX2xlbjIyID0gMDsKKyAgICAgIGlmIChfX2xlbjEgPiBfX2xlbjIpCisJeworCSAgX19sZW4xMSA9IF9fbGVuMSAvIDI7CisJICBzdGQ6OmFkdmFuY2UoX19maXJzdF9jdXQsIF9fbGVuMTEpOworCSAgX19zZWNvbmRfY3V0ID0gc3RkOjpsb3dlcl9ib3VuZChfX21pZGRsZSwgX19sYXN0LCAqX19maXJzdF9jdXQpOworCSAgX19sZW4yMiA9IHN0ZDo6ZGlzdGFuY2UoX19taWRkbGUsIF9fc2Vjb25kX2N1dCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIF9fbGVuMjIgPSBfX2xlbjIgLyAyOworCSAgc3RkOjphZHZhbmNlKF9fc2Vjb25kX2N1dCwgX19sZW4yMik7CisJICBfX2ZpcnN0X2N1dCA9IHN0ZDo6dXBwZXJfYm91bmQoX19maXJzdCwgX19taWRkbGUsICpfX3NlY29uZF9jdXQpOworCSAgX19sZW4xMSA9IHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19maXJzdF9jdXQpOworCX0KKyAgICAgIHN0ZDo6cm90YXRlKF9fZmlyc3RfY3V0LCBfX21pZGRsZSwgX19zZWNvbmRfY3V0KTsKKyAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19uZXdfbWlkZGxlID0gX19maXJzdF9jdXQ7CisgICAgICBzdGQ6OmFkdmFuY2UoX19uZXdfbWlkZGxlLCBzdGQ6OmRpc3RhbmNlKF9fbWlkZGxlLCBfX3NlY29uZF9jdXQpKTsKKyAgICAgIHN0ZDo6X19tZXJnZV93aXRob3V0X2J1ZmZlcihfX2ZpcnN0LCBfX2ZpcnN0X2N1dCwgX19uZXdfbWlkZGxlLAorCQkJCSAgX19sZW4xMSwgX19sZW4yMik7CisgICAgICBzdGQ6Ol9fbWVyZ2Vfd2l0aG91dF9idWZmZXIoX19uZXdfbWlkZGxlLCBfX3NlY29uZF9jdXQsIF9fbGFzdCwKKwkJCQkgIF9fbGVuMSAtIF9fbGVuMTEsIF9fbGVuMiAtIF9fbGVuMjIpOworICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIG1lcmdlIHJvdXRpbmVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCB0eXBlbmFtZSBfRGlzdGFuY2UsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9fbWVyZ2Vfd2l0aG91dF9idWZmZXIoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX21pZGRsZSwKKwkJCSAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0LAorCQkJICAgX0Rpc3RhbmNlIF9fbGVuMSwgX0Rpc3RhbmNlIF9fbGVuMiwKKwkJCSAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBpZiAoX19sZW4xID09IDAgfHwgX19sZW4yID09IDApCisJcmV0dXJuOworICAgICAgaWYgKF9fbGVuMSArIF9fbGVuMiA9PSAyKQorCXsKKwkgIGlmIChfX2NvbXAoKl9fbWlkZGxlLCAqX19maXJzdCkpCisJICAgIHN0ZDo6aXRlcl9zd2FwKF9fZmlyc3QsIF9fbWlkZGxlKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3RfY3V0ID0gX19maXJzdDsKKyAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19zZWNvbmRfY3V0ID0gX19taWRkbGU7CisgICAgICBfRGlzdGFuY2UgX19sZW4xMSA9IDA7CisgICAgICBfRGlzdGFuY2UgX19sZW4yMiA9IDA7CisgICAgICBpZiAoX19sZW4xID4gX19sZW4yKQorCXsKKwkgIF9fbGVuMTEgPSBfX2xlbjEgLyAyOworCSAgc3RkOjphZHZhbmNlKF9fZmlyc3RfY3V0LCBfX2xlbjExKTsKKwkgIF9fc2Vjb25kX2N1dCA9IHN0ZDo6bG93ZXJfYm91bmQoX19taWRkbGUsIF9fbGFzdCwgKl9fZmlyc3RfY3V0LAorCQkJCQkgIF9fY29tcCk7CisJICBfX2xlbjIyID0gc3RkOjpkaXN0YW5jZShfX21pZGRsZSwgX19zZWNvbmRfY3V0KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgX19sZW4yMiA9IF9fbGVuMiAvIDI7CisJICBzdGQ6OmFkdmFuY2UoX19zZWNvbmRfY3V0LCBfX2xlbjIyKTsKKwkgIF9fZmlyc3RfY3V0ID0gc3RkOjp1cHBlcl9ib3VuZChfX2ZpcnN0LCBfX21pZGRsZSwgKl9fc2Vjb25kX2N1dCwKKwkJCQkJIF9fY29tcCk7CisJICBfX2xlbjExID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2ZpcnN0X2N1dCk7CisJfQorICAgICAgc3RkOjpyb3RhdGUoX19maXJzdF9jdXQsIF9fbWlkZGxlLCBfX3NlY29uZF9jdXQpOworICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX25ld19taWRkbGUgPSBfX2ZpcnN0X2N1dDsKKyAgICAgIHN0ZDo6YWR2YW5jZShfX25ld19taWRkbGUsIHN0ZDo6ZGlzdGFuY2UoX19taWRkbGUsIF9fc2Vjb25kX2N1dCkpOworICAgICAgc3RkOjpfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9fZmlyc3QsIF9fZmlyc3RfY3V0LCBfX25ld19taWRkbGUsCisJCQkJICBfX2xlbjExLCBfX2xlbjIyLCBfX2NvbXApOworICAgICAgc3RkOjpfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9fbmV3X21pZGRsZSwgX19zZWNvbmRfY3V0LCBfX2xhc3QsCisJCQkJICBfX2xlbjEgLSBfX2xlbjExLCBfX2xlbjIgLSBfX2xlbjIyLCBfX2NvbXApOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBNZXJnZXMgdHdvIHNvcnRlZCByYW5nZXMgaW4gcGxhY2UuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX21pZGRsZSAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICBOb3RoaW5nLgorICAgKgorICAgKiAgTWVyZ2VzIHR3byBzb3J0ZWQgYW5kIGNvbnNlY3V0aXZlIHJhbmdlcywgW19fZmlyc3QsX19taWRkbGUpIGFuZAorICAgKiAgW19fbWlkZGxlLF9fbGFzdCksIGFuZCBwdXRzIHRoZSByZXN1bHQgaW4gW19fZmlyc3QsX19sYXN0KS4gIFRoZQorICAgKiAgb3V0cHV0IHdpbGwgYmUgc29ydGVkLiAgVGhlIHNvcnQgaXMgQGUgc3RhYmxlLCB0aGF0IGlzLCBmb3IKKyAgICogIGVxdWl2YWxlbnQgZWxlbWVudHMgaW4gdGhlIHR3byByYW5nZXMsIGVsZW1lbnRzIGZyb20gdGhlIGZpcnN0CisgICAqICByYW5nZSB3aWxsIGFsd2F5cyBjb21lIGJlZm9yZSBlbGVtZW50cyBmcm9tIHRoZSBzZWNvbmQuCisgICAqCisgICAqICBJZiBlbm91Z2ggYWRkaXRpb25hbCBtZW1vcnkgaXMgYXZhaWxhYmxlLCB0aGlzIHRha2VzIChfX2xhc3QtX19maXJzdCktMQorICAgKiAgY29tcGFyaXNvbnMuICBPdGhlcndpc2UgYW4gTmxvZ04gYWxnb3JpdGhtIGlzIHVzZWQsIHdoZXJlIE4gaXMKKyAgICogIGRpc3RhbmNlKF9fZmlyc3QsX19sYXN0KS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgaW5wbGFjZV9tZXJnZShfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsCisJCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX21pZGRsZSwKKwkJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorICAgICAgICAgIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgICAgICAgX0Rpc3RhbmNlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PAorCSAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDxfVmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWQoX19maXJzdCwgX19taWRkbGUpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZChfX21pZGRsZSwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19taWRkbGUgfHwgX19taWRkbGUgPT0gX19sYXN0KQorCXJldHVybjsKKworICAgICAgX0Rpc3RhbmNlVHlwZSBfX2xlbjEgPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbWlkZGxlKTsKKyAgICAgIF9EaXN0YW5jZVR5cGUgX19sZW4yID0gc3RkOjpkaXN0YW5jZShfX21pZGRsZSwgX19sYXN0KTsKKworICAgICAgX1RlbXBvcmFyeV9idWZmZXI8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX1ZhbHVlVHlwZT4gX19idWYoX19maXJzdCwKKwkJCQkJCQkJICBfX2xhc3QpOworICAgICAgaWYgKF9fYnVmLmJlZ2luKCkgPT0gMCkKKwlzdGQ6Ol9fbWVyZ2Vfd2l0aG91dF9idWZmZXIoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwgX19sZW4xLCBfX2xlbjIpOworICAgICAgZWxzZQorCXN0ZDo6X19tZXJnZV9hZGFwdGl2ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LCBfX2xlbjEsIF9fbGVuMiwKKwkJCSAgICAgIF9fYnVmLmJlZ2luKCksIF9EaXN0YW5jZVR5cGUoX19idWYuc2l6ZSgpKSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIE1lcmdlcyB0d28gc29ydGVkIHJhbmdlcyBpbiBwbGFjZS4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbWlkZGxlICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19jb21wICAgIEEgZnVuY3RvciB0byB1c2UgZm9yIGNvbXBhcmlzb25zLgorICAgKiAgQHJldHVybiAgTm90aGluZy4KKyAgICoKKyAgICogIE1lcmdlcyB0d28gc29ydGVkIGFuZCBjb25zZWN1dGl2ZSByYW5nZXMsIFtfX2ZpcnN0LF9fbWlkZGxlKSBhbmQKKyAgICogIFttaWRkbGUsbGFzdCksIGFuZCBwdXRzIHRoZSByZXN1bHQgaW4gW19fZmlyc3QsX19sYXN0KS4gIFRoZSBvdXRwdXQgd2lsbAorICAgKiAgYmUgc29ydGVkLiAgVGhlIHNvcnQgaXMgQGUgc3RhYmxlLCB0aGF0IGlzLCBmb3IgZXF1aXZhbGVudAorICAgKiAgZWxlbWVudHMgaW4gdGhlIHR3byByYW5nZXMsIGVsZW1lbnRzIGZyb20gdGhlIGZpcnN0IHJhbmdlIHdpbGwgYWx3YXlzCisgICAqICBjb21lIGJlZm9yZSBlbGVtZW50cyBmcm9tIHRoZSBzZWNvbmQuCisgICAqCisgICAqICBJZiBlbm91Z2ggYWRkaXRpb25hbCBtZW1vcnkgaXMgYXZhaWxhYmxlLCB0aGlzIHRha2VzIChfX2xhc3QtX19maXJzdCktMQorICAgKiAgY29tcGFyaXNvbnMuICBPdGhlcndpc2UgYW4gTmxvZ04gYWxnb3JpdGhtIGlzIHVzZWQsIHdoZXJlIE4gaXMKKyAgICogIGRpc3RhbmNlKF9fZmlyc3QsX19sYXN0KS4KKyAgICoKKyAgICogIFRoZSBjb21wYXJpc29uIGZ1bmN0aW9uIHNob3VsZCBoYXZlIHRoZSBzYW1lIGVmZmVjdHMgb24gb3JkZXJpbmcgYXMKKyAgICogIHRoZSBmdW5jdGlvbiB1c2VkIGZvciB0aGUgaW5pdGlhbCBzb3J0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgaW5wbGFjZV9tZXJnZShfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsCisJCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX21pZGRsZSwKKwkJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCwKKwkJICBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OnZhbHVlX3R5cGUKKyAgICAgICAgICBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorICAgICAgICAgIF9EaXN0YW5jZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDwKKwkgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJICAgIF9WYWx1ZVR5cGUsIF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9wcmVkKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2NvbXApOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9wcmVkKF9fbWlkZGxlLCBfX2xhc3QsIF9fY29tcCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbWlkZGxlIHx8IF9fbWlkZGxlID09IF9fbGFzdCkKKwlyZXR1cm47CisKKyAgICAgIGNvbnN0IF9EaXN0YW5jZVR5cGUgX19sZW4xID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX21pZGRsZSk7CisgICAgICBjb25zdCBfRGlzdGFuY2VUeXBlIF9fbGVuMiA9IHN0ZDo6ZGlzdGFuY2UoX19taWRkbGUsIF9fbGFzdCk7CisKKyAgICAgIF9UZW1wb3JhcnlfYnVmZmVyPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIF9WYWx1ZVR5cGU+IF9fYnVmKF9fZmlyc3QsCisJCQkJCQkJCSAgX19sYXN0KTsKKyAgICAgIGlmIChfX2J1Zi5iZWdpbigpID09IDApCisJc3RkOjpfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsIF9fbGVuMSwKKwkJCQkgICAgX19sZW4yLCBfX2NvbXApOworICAgICAgZWxzZQorCXN0ZDo6X19tZXJnZV9hZGFwdGl2ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LCBfX2xlbjEsIF9fbGVuMiwKKwkJCSAgICAgIF9fYnVmLmJlZ2luKCksIF9EaXN0YW5jZVR5cGUoX19idWYuc2l6ZSgpKSwKKwkJCSAgICAgIF9fY29tcCk7CisgICAgfQorCisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBfX21lcmdlX3NvcnRfbG9vcCByb3V0aW5lcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fbW92ZV9tZXJnZShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCQkgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwKKwkJIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKQorCXsKKwkgIGlmICgqX19maXJzdDIgPCAqX19maXJzdDEpCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSBfR0xJQkNYWF9NT1ZFKCpfX2ZpcnN0Mik7CisJICAgICAgKytfX2ZpcnN0MjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgKl9fcmVzdWx0ID0gX0dMSUJDWFhfTU9WRSgqX19maXJzdDEpOworCSAgICAgICsrX19maXJzdDE7CisJICAgIH0KKwkgICsrX19yZXN1bHQ7CisJfQorICAgICAgcmV0dXJuIF9HTElCQ1hYX01PVkUzKF9fZmlyc3QyLCBfX2xhc3QyLAorCQkJICAgIF9HTElCQ1hYX01PVkUzKF9fZmlyc3QxLCBfX2xhc3QxLAorCQkJCQkgICBfX3Jlc3VsdCkpOworICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIF9fbWVyZ2Vfc29ydF9sb29wIHJvdXRpbmVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fbW92ZV9tZXJnZShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCQkgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwKKwkJIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJeworCSAgaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSBfR0xJQkNYWF9NT1ZFKCpfX2ZpcnN0Mik7CisJICAgICAgKytfX2ZpcnN0MjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgKl9fcmVzdWx0ID0gX0dMSUJDWFhfTU9WRSgqX19maXJzdDEpOworCSAgICAgICsrX19maXJzdDE7CisJICAgIH0KKwkgICsrX19yZXN1bHQ7CisJfQorICAgICAgcmV0dXJuIF9HTElCQ1hYX01PVkUzKF9fZmlyc3QyLCBfX2xhc3QyLAorCQkJICAgIF9HTElCQ1hYX01PVkUzKF9fZmlyc3QxLCBfX2xhc3QxLAorCQkJCQkgICBfX3Jlc3VsdCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IxLCB0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICB2b2lkCisgICAgX19tZXJnZV9zb3J0X2xvb3AoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMSBfX2ZpcnN0LAorCQkgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IxIF9fbGFzdCwKKwkJICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMiBfX3Jlc3VsdCwKKwkJICAgICAgX0Rpc3RhbmNlIF9fc3RlcF9zaXplKQorICAgIHsKKyAgICAgIGNvbnN0IF9EaXN0YW5jZSBfX3R3b19zdGVwID0gMiAqIF9fc3RlcF9zaXplOworCisgICAgICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+PSBfX3R3b19zdGVwKQorCXsKKwkgIF9fcmVzdWx0ID0gc3RkOjpfX21vdmVfbWVyZ2UoX19maXJzdCwgX19maXJzdCArIF9fc3RlcF9zaXplLAorCQkJCSAgICAgICBfX2ZpcnN0ICsgX19zdGVwX3NpemUsCisJCQkJICAgICAgIF9fZmlyc3QgKyBfX3R3b19zdGVwLCBfX3Jlc3VsdCk7CisJICBfX2ZpcnN0ICs9IF9fdHdvX3N0ZXA7CisJfQorCisgICAgICBfX3N0ZXBfc2l6ZSA9IHN0ZDo6bWluKF9EaXN0YW5jZShfX2xhc3QgLSBfX2ZpcnN0KSwgX19zdGVwX3NpemUpOworICAgICAgc3RkOjpfX21vdmVfbWVyZ2UoX19maXJzdCwgX19maXJzdCArIF9fc3RlcF9zaXplLAorCQkJX19maXJzdCArIF9fc3RlcF9zaXplLCBfX2xhc3QsIF9fcmVzdWx0KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMSwgdHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfRGlzdGFuY2UsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX21lcmdlX3NvcnRfbG9vcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IxIF9fZmlyc3QsCisJCSAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjEgX19sYXN0LAorCQkgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IyIF9fcmVzdWx0LCBfRGlzdGFuY2UgX19zdGVwX3NpemUsCisJCSAgICAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBjb25zdCBfRGlzdGFuY2UgX190d29fc3RlcCA9IDIgKiBfX3N0ZXBfc2l6ZTsKKworICAgICAgd2hpbGUgKF9fbGFzdCAtIF9fZmlyc3QgPj0gX190d29fc3RlcCkKKwl7CisJICBfX3Jlc3VsdCA9IHN0ZDo6X19tb3ZlX21lcmdlKF9fZmlyc3QsIF9fZmlyc3QgKyBfX3N0ZXBfc2l6ZSwKKwkJCQkgICAgICAgX19maXJzdCArIF9fc3RlcF9zaXplLAorCQkJCSAgICAgICBfX2ZpcnN0ICsgX190d29fc3RlcCwKKwkJCQkgICAgICAgX19yZXN1bHQsIF9fY29tcCk7CisJICBfX2ZpcnN0ICs9IF9fdHdvX3N0ZXA7CisJfQorICAgICAgX19zdGVwX3NpemUgPSBzdGQ6Om1pbihfRGlzdGFuY2UoX19sYXN0IC0gX19maXJzdCksIF9fc3RlcF9zaXplKTsKKworICAgICAgc3RkOjpfX21vdmVfbWVyZ2UoX19maXJzdCxfX2ZpcnN0ICsgX19zdGVwX3NpemUsCisJCQlfX2ZpcnN0ICsgX19zdGVwX3NpemUsIF9fbGFzdCwgX19yZXN1bHQsIF9fY29tcCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0Rpc3RhbmNlPgorICAgIHZvaWQKKyAgICBfX2NodW5rX2luc2VydGlvbl9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgIF9EaXN0YW5jZSBfX2NodW5rX3NpemUpCisgICAgeworICAgICAgd2hpbGUgKF9fbGFzdCAtIF9fZmlyc3QgPj0gX19jaHVua19zaXplKQorCXsKKwkgIHN0ZDo6X19pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2ZpcnN0ICsgX19jaHVua19zaXplKTsKKwkgIF9fZmlyc3QgKz0gX19jaHVua19zaXplOworCX0KKyAgICAgIHN0ZDo6X19pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2xhc3QpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZSwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgX19jaHVua19pbnNlcnRpb25fc29ydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJCQkgICBfRGlzdGFuY2UgX19jaHVua19zaXplLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgd2hpbGUgKF9fbGFzdCAtIF9fZmlyc3QgPj0gX19jaHVua19zaXplKQorCXsKKwkgIHN0ZDo6X19pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2ZpcnN0ICsgX19jaHVua19zaXplLCBfX2NvbXApOworCSAgX19maXJzdCArPSBfX2NodW5rX3NpemU7CisJfQorICAgICAgc3RkOjpfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19jb21wKTsKKyAgICB9CisKKyAgZW51bSB7IF9TX2NodW5rX3NpemUgPSA3IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfUG9pbnRlcj4KKyAgICB2b2lkCisgICAgX19tZXJnZV9zb3J0X3dpdGhfYnVmZmVyKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUG9pbnRlciBfX2J1ZmZlcikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2U7CisKKyAgICAgIGNvbnN0IF9EaXN0YW5jZSBfX2xlbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgICBjb25zdCBfUG9pbnRlciBfX2J1ZmZlcl9sYXN0ID0gX19idWZmZXIgKyBfX2xlbjsKKworICAgICAgX0Rpc3RhbmNlIF9fc3RlcF9zaXplID0gX1NfY2h1bmtfc2l6ZTsKKyAgICAgIHN0ZDo6X19jaHVua19pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2xhc3QsIF9fc3RlcF9zaXplKTsKKworICAgICAgd2hpbGUgKF9fc3RlcF9zaXplIDwgX19sZW4pCisJeworCSAgc3RkOjpfX21lcmdlX3NvcnRfbG9vcChfX2ZpcnN0LCBfX2xhc3QsIF9fYnVmZmVyLCBfX3N0ZXBfc2l6ZSk7CisJICBfX3N0ZXBfc2l6ZSAqPSAyOworCSAgc3RkOjpfX21lcmdlX3NvcnRfbG9vcChfX2J1ZmZlciwgX19idWZmZXJfbGFzdCwgX19maXJzdCwgX19zdGVwX3NpemUpOworCSAgX19zdGVwX3NpemUgKj0gMjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX1BvaW50ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX21lcmdlX3NvcnRfd2l0aF9idWZmZXIoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Qb2ludGVyIF9fYnVmZmVyLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJX0Rpc3RhbmNlOworCisgICAgICBjb25zdCBfRGlzdGFuY2UgX19sZW4gPSBfX2xhc3QgLSBfX2ZpcnN0OworICAgICAgY29uc3QgX1BvaW50ZXIgX19idWZmZXJfbGFzdCA9IF9fYnVmZmVyICsgX19sZW47CisKKyAgICAgIF9EaXN0YW5jZSBfX3N0ZXBfc2l6ZSA9IF9TX2NodW5rX3NpemU7CisgICAgICBzdGQ6Ol9fY2h1bmtfaW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0LCBfX3N0ZXBfc2l6ZSwgX19jb21wKTsKKworICAgICAgd2hpbGUgKF9fc3RlcF9zaXplIDwgX19sZW4pCisJeworCSAgc3RkOjpfX21lcmdlX3NvcnRfbG9vcChfX2ZpcnN0LCBfX2xhc3QsIF9fYnVmZmVyLAorCQkJCSBfX3N0ZXBfc2l6ZSwgX19jb21wKTsKKwkgIF9fc3RlcF9zaXplICo9IDI7CisJICBzdGQ6Ol9fbWVyZ2Vfc29ydF9sb29wKF9fYnVmZmVyLCBfX2J1ZmZlcl9sYXN0LCBfX2ZpcnN0LAorCQkJCSBfX3N0ZXBfc2l6ZSwgX19jb21wKTsKKwkgIF9fc3RlcF9zaXplICo9IDI7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9Qb2ludGVyLAorCSAgIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICB2b2lkCisgICAgX19zdGFibGVfc29ydF9hZGFwdGl2ZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfUG9pbnRlciBfX2J1ZmZlciwgX0Rpc3RhbmNlIF9fYnVmZmVyX3NpemUpCisgICAgeworICAgICAgY29uc3QgX0Rpc3RhbmNlIF9fbGVuID0gKF9fbGFzdCAtIF9fZmlyc3QgKyAxKSAvIDI7CisgICAgICBjb25zdCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19taWRkbGUgPSBfX2ZpcnN0ICsgX19sZW47CisgICAgICBpZiAoX19sZW4gPiBfX2J1ZmZlcl9zaXplKQorCXsKKwkgIHN0ZDo6X19zdGFibGVfc29ydF9hZGFwdGl2ZShfX2ZpcnN0LCBfX21pZGRsZSwKKwkJCQkgICAgICBfX2J1ZmZlciwgX19idWZmZXJfc2l6ZSk7CisJICBzdGQ6Ol9fc3RhYmxlX3NvcnRfYWRhcHRpdmUoX19taWRkbGUsIF9fbGFzdCwKKwkJCQkgICAgICBfX2J1ZmZlciwgX19idWZmZXJfc2l6ZSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHN0ZDo6X19tZXJnZV9zb3J0X3dpdGhfYnVmZmVyKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2J1ZmZlcik7CisJICBzdGQ6Ol9fbWVyZ2Vfc29ydF93aXRoX2J1ZmZlcihfX21pZGRsZSwgX19sYXN0LCBfX2J1ZmZlcik7CisJfQorICAgICAgc3RkOjpfX21lcmdlX2FkYXB0aXZlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsCisJCQkgICAgX0Rpc3RhbmNlKF9fbWlkZGxlIC0gX19maXJzdCksCisJCQkgICAgX0Rpc3RhbmNlKF9fbGFzdCAtIF9fbWlkZGxlKSwKKwkJCSAgICBfX2J1ZmZlciwgX19idWZmZXJfc2l6ZSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX1BvaW50ZXIsCisJICAgdHlwZW5hbWUgX0Rpc3RhbmNlLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgX19zdGFibGVfc29ydF9hZGFwdGl2ZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfUG9pbnRlciBfX2J1ZmZlciwgX0Rpc3RhbmNlIF9fYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgY29uc3QgX0Rpc3RhbmNlIF9fbGVuID0gKF9fbGFzdCAtIF9fZmlyc3QgKyAxKSAvIDI7CisgICAgICBjb25zdCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19taWRkbGUgPSBfX2ZpcnN0ICsgX19sZW47CisgICAgICBpZiAoX19sZW4gPiBfX2J1ZmZlcl9zaXplKQorCXsKKwkgIHN0ZDo6X19zdGFibGVfc29ydF9hZGFwdGl2ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19idWZmZXIsCisJCQkJICAgICAgX19idWZmZXJfc2l6ZSwgX19jb21wKTsKKwkgIHN0ZDo6X19zdGFibGVfc29ydF9hZGFwdGl2ZShfX21pZGRsZSwgX19sYXN0LCBfX2J1ZmZlciwKKwkJCQkgICAgICBfX2J1ZmZlcl9zaXplLCBfX2NvbXApOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzdGQ6Ol9fbWVyZ2Vfc29ydF93aXRoX2J1ZmZlcihfX2ZpcnN0LCBfX21pZGRsZSwgX19idWZmZXIsIF9fY29tcCk7CisJICBzdGQ6Ol9fbWVyZ2Vfc29ydF93aXRoX2J1ZmZlcihfX21pZGRsZSwgX19sYXN0LCBfX2J1ZmZlciwgX19jb21wKTsKKwl9CisgICAgICBzdGQ6Ol9fbWVyZ2VfYWRhcHRpdmUoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwKKwkJCSAgICBfRGlzdGFuY2UoX19taWRkbGUgLSBfX2ZpcnN0KSwKKwkJCSAgICBfRGlzdGFuY2UoX19sYXN0IC0gX19taWRkbGUpLAorCQkJICAgIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplLAorCQkJICAgIF9fY29tcCk7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgc3RhYmxlIHNvcnRpbmcgcm91dGluZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgX19pbnBsYWNlX3N0YWJsZV9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIGlmIChfX2xhc3QgLSBfX2ZpcnN0IDwgMTUpCisJeworCSAgc3RkOjpfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCk7CisJICByZXR1cm47CisJfQorICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbWlkZGxlID0gX19maXJzdCArIChfX2xhc3QgLSBfX2ZpcnN0KSAvIDI7CisgICAgICBzdGQ6Ol9faW5wbGFjZV9zdGFibGVfc29ydChfX2ZpcnN0LCBfX21pZGRsZSk7CisgICAgICBzdGQ6Ol9faW5wbGFjZV9zdGFibGVfc29ydChfX21pZGRsZSwgX19sYXN0KTsKKyAgICAgIHN0ZDo6X19tZXJnZV93aXRob3V0X2J1ZmZlcihfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LAorCQkJCSAgX19taWRkbGUgLSBfX2ZpcnN0LAorCQkJCSAgX19sYXN0IC0gX19taWRkbGUpOworICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIHN0YWJsZSBzb3J0aW5nIHJvdXRpbmVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX2lucGxhY2Vfc3RhYmxlX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBpZiAoX19sYXN0IC0gX19maXJzdCA8IDE1KQorCXsKKwkgIHN0ZDo6X19pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCk7CisJICByZXR1cm47CisJfQorICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbWlkZGxlID0gX19maXJzdCArIChfX2xhc3QgLSBfX2ZpcnN0KSAvIDI7CisgICAgICBzdGQ6Ol9faW5wbGFjZV9zdGFibGVfc29ydChfX2ZpcnN0LCBfX21pZGRsZSwgX19jb21wKTsKKyAgICAgIHN0ZDo6X19pbnBsYWNlX3N0YWJsZV9zb3J0KF9fbWlkZGxlLCBfX2xhc3QsIF9fY29tcCk7CisgICAgICBzdGQ6Ol9fbWVyZ2Vfd2l0aG91dF9idWZmZXIoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwKKwkJCQkgIF9fbWlkZGxlIC0gX19maXJzdCwKKwkJCQkgIF9fbGFzdCAtIF9fbWlkZGxlLAorCQkJCSAgX19jb21wKTsKKyAgICB9CisKKyAgLy8gc3RhYmxlX3NvcnQKKworICAvLyBTZXQgYWxnb3JpdGhtczogaW5jbHVkZXMsIHNldF91bmlvbiwgc2V0X2ludGVyc2VjdGlvbiwgc2V0X2RpZmZlcmVuY2UsCisgIC8vIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZS4gIEFsbCBvZiB0aGVzZSBhbGdvcml0aG1zIGhhdmUgdGhlIHByZWNvbmRpdGlvbgorICAvLyB0aGF0IHRoZWlyIGlucHV0IHJhbmdlcyBhcmUgc29ydGVkIGFuZCB0aGUgcG9zdGNvbmRpdGlvbiB0aGF0IHRoZWlyIG91dHB1dAorICAvLyByYW5nZXMgYXJlIHNvcnRlZC4KKworICAvKioKKyAgICogIEBicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgYWxsIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgZXhpc3RzIGluIGEgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fZmlyc3QxICBTdGFydCBvZiBzZWFyY2ggcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdDEgICBFbmQgb2Ygc2VhcmNoIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgU3RhcnQgb2Ygc2VxdWVuY2UKKyAgICogIEBwYXJhbSAgX19sYXN0MiAgIEVuZCBvZiBzZXF1ZW5jZS4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgZWFjaCBlbGVtZW50IGluIFtfX2ZpcnN0MixfX2xhc3QyKSBpcyBjb250YWluZWQgaW4gb3JkZXIKKyAgICogIHdpdGhpbiBbX19maXJzdDEsX19sYXN0MSkuICBGYWxzZSBvdGhlcndpc2UuCisgICAqICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gZXhwZWN0cyBib3RoIFtfX2ZpcnN0MSxfX2xhc3QxKSBhbmQKKyAgICogIFtfX2ZpcnN0MixfX2xhc3QyKSB0byBiZSBzb3J0ZWQuICBTZWFyY2hlcyBmb3IgdGhlIHByZXNlbmNlIG9mCisgICAqICBlYWNoIGVsZW1lbnQgaW4gW19fZmlyc3QyLF9fbGFzdDIpIHdpdGhpbiBbX19maXJzdDEsX19sYXN0MSkuCisgICAqICBUaGUgaXRlcmF0b3JzIG92ZXIgZWFjaCByYW5nZSBvbmx5IG1vdmUgZm9yd2FyZCwgc28gdGhpcyBpcyBhCisgICAqICBsaW5lYXIgYWxnb3JpdGhtLiAgSWYgYW4gZWxlbWVudCBpbiBbX19maXJzdDIsX19sYXN0MikgaXMgbm90CisgICAqICBmb3VuZCBiZWZvcmUgdGhlIHNlYXJjaCBpdGVyYXRvciByZWFjaGVzIEBwIF9fbGFzdDIsIGZhbHNlIGlzCisgICAqICByZXR1cm5lZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjI+CisgICAgYm9vbAorICAgIGluY2x1ZGVzKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMjsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5PcENvbmNlcHQ8X1ZhbHVlVHlwZTEsIF9WYWx1ZVR5cGUyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5PcENvbmNlcHQ8X1ZhbHVlVHlwZTIsIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0KF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0Mik7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldChfX2ZpcnN0MiwgX19sYXN0MiwgX19maXJzdDEpOworCisgICAgICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKQorCWlmICgqX19maXJzdDIgPCAqX19maXJzdDEpCisJICByZXR1cm4gZmFsc2U7CisJZWxzZSBpZigqX19maXJzdDEgPCAqX19maXJzdDIpCisJICArK19fZmlyc3QxOworCWVsc2UKKwkgICsrX19maXJzdDEsICsrX19maXJzdDI7CisKKyAgICAgIHJldHVybiBfX2ZpcnN0MiA9PSBfX2xhc3QyOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgYWxsIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgZXhpc3RzIGluIGEgcmFuZ2UKKyAgICogIHVzaW5nIGNvbXBhcmlzb24uCisgICAqICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgU3RhcnQgb2Ygc2VhcmNoIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgRW5kIG9mIHNlYXJjaCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgIFN0YXJ0IG9mIHNlcXVlbmNlCisgICAqICBAcGFyYW0gIF9fbGFzdDIgICBFbmQgb2Ygc2VxdWVuY2UuCisgICAqICBAcGFyYW0gIF9fY29tcCAgICBDb21wYXJpc29uIGZ1bmN0aW9uIHRvIHVzZS4KKyAgICogIEByZXR1cm4gVHJ1ZSBpZiBlYWNoIGVsZW1lbnQgaW4gW19fZmlyc3QyLF9fbGFzdDIpIGlzIGNvbnRhaW5lZAorICAgKiAgaW4gb3JkZXIgd2l0aGluIFtfX2ZpcnN0MSxfX2xhc3QxKSBhY2NvcmRpbmcgdG8gY29tcC4gIEZhbHNlCisgICAqICBvdGhlcndpc2UuICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gZXhwZWN0cyBib3RoIFtfX2ZpcnN0MSxfX2xhc3QxKSBhbmQKKyAgICogIFtfX2ZpcnN0MixfX2xhc3QyKSB0byBiZSBzb3J0ZWQuICBTZWFyY2hlcyBmb3IgdGhlIHByZXNlbmNlIG9mCisgICAqICBlYWNoIGVsZW1lbnQgaW4gW19fZmlyc3QyLF9fbGFzdDIpIHdpdGhpbiBbX19maXJzdDEsX19sYXN0MSksCisgICAqICB1c2luZyBjb21wIHRvIGRlY2lkZS4gIFRoZSBpdGVyYXRvcnMgb3ZlciBlYWNoIHJhbmdlIG9ubHkgbW92ZQorICAgKiAgZm9yd2FyZCwgc28gdGhpcyBpcyBhIGxpbmVhciBhbGdvcml0aG0uICBJZiBhbiBlbGVtZW50IGluCisgICAqICBbX19maXJzdDIsX19sYXN0MikgaXMgbm90IGZvdW5kIGJlZm9yZSB0aGUgc2VhcmNoIGl0ZXJhdG9yCisgICAqICByZWFjaGVzIEBwIF9fbGFzdDIsIGZhbHNlIGlzIHJldHVybmVkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBib29sCisgICAgaW5jbHVkZXMoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsCisJICAgICBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IxPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IyPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUyOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCQkJCSAgX1ZhbHVlVHlwZTEsIF9WYWx1ZVR5cGUyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9WYWx1ZVR5cGUyLCBfVmFsdWVUeXBlMT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldF9wcmVkKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19jb21wKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0X3ByZWQoX19maXJzdDIsIF9fbGFzdDIsIF9fZmlyc3QxLCBfX2NvbXApOworCisgICAgICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKQorCWlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKQorCSAgcmV0dXJuIGZhbHNlOworCWVsc2UgaWYoX19jb21wKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkKKwkgICsrX19maXJzdDE7CisJZWxzZQorCSAgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MjsKKworICAgICAgcmV0dXJuIF9fZmlyc3QyID09IF9fbGFzdDI7CisgICAgfQorCisgIC8vIG50aF9lbGVtZW50CisgIC8vIG1lcmdlCisgIC8vIHNldF9kaWZmZXJlbmNlCisgIC8vIHNldF9pbnRlcnNlY3Rpb24KKyAgLy8gc2V0X3VuaW9uCisgIC8vIHN0YWJsZV9zb3J0CisgIC8vIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZQorICAvLyBtaW5fZWxlbWVudAorICAvLyBtYXhfZWxlbWVudAorCisgIC8qKgorICAgKiAgQGJyaWVmICBQZXJtdXRlIHJhbmdlIGludG8gdGhlIG5leHQgQGUgZGljdGlvbmFyeSBvcmRlcmluZy4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBTdGFydCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgRW5kIG9mIHJhbmdlLgorICAgKiAgQHJldHVybiAgRmFsc2UgaWYgd3JhcHBlZCB0byBmaXJzdCBwZXJtdXRhdGlvbiwgdHJ1ZSBvdGhlcndpc2UuCisgICAqCisgICAqICBUcmVhdHMgYWxsIHBlcm11dGF0aW9ucyBvZiB0aGUgcmFuZ2UgYXMgYSBzZXQgb2YgQGUgZGljdGlvbmFyeSBzb3J0ZWQKKyAgICogIHNlcXVlbmNlcy4gIFBlcm11dGVzIHRoZSBjdXJyZW50IHNlcXVlbmNlIGludG8gdGhlIG5leHQgb25lIG9mIHRoaXMgc2V0LgorICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBtb3JlIHNlcXVlbmNlcyB0byBnZW5lcmF0ZS4gIElmIHRoZSBzZXF1ZW5jZQorICAgKiAgaXMgdGhlIGxhcmdlc3Qgb2YgdGhlIHNldCwgdGhlIHNtYWxsZXN0IGlzIGdlbmVyYXRlZCBhbmQgZmFsc2UgcmV0dXJuZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+CisgICAgYm9vbAorICAgIG5leHRfcGVybXV0YXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LAorCQkgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIGZhbHNlOworICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2kgPSBfX2ZpcnN0OworICAgICAgKytfX2k7CisgICAgICBpZiAoX19pID09IF9fbGFzdCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBfX2kgPSBfX2xhc3Q7CisgICAgICAtLV9faTsKKworICAgICAgZm9yKDs7KQorCXsKKwkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19paSA9IF9faTsKKwkgIC0tX19pOworCSAgaWYgKCpfX2kgPCAqX19paSkKKwkgICAgeworCSAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19qID0gX19sYXN0OworCSAgICAgIHdoaWxlICghKCpfX2kgPCAqLS1fX2opKQorCQl7fQorCSAgICAgIHN0ZDo6aXRlcl9zd2FwKF9faSwgX19qKTsKKwkgICAgICBzdGQ6OnJldmVyc2UoX19paSwgX19sYXN0KTsKKwkgICAgICByZXR1cm4gdHJ1ZTsKKwkgICAgfQorCSAgaWYgKF9faSA9PSBfX2ZpcnN0KQorCSAgICB7CisJICAgICAgc3RkOjpyZXZlcnNlKF9fZmlyc3QsIF9fbGFzdCk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUGVybXV0ZSByYW5nZSBpbnRvIHRoZSBuZXh0IEBlIGRpY3Rpb25hcnkgb3JkZXJpbmcgdXNpbmcKKyAgICogICAgICAgICAgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIFN0YXJ0IG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBFbmQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fY29tcCAgIEEgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHJldHVybiAgRmFsc2UgaWYgd3JhcHBlZCB0byBmaXJzdCBwZXJtdXRhdGlvbiwgdHJ1ZSBvdGhlcndpc2UuCisgICAqCisgICAqICBUcmVhdHMgYWxsIHBlcm11dGF0aW9ucyBvZiB0aGUgcmFuZ2UgW19fZmlyc3QsX19sYXN0KSBhcyBhIHNldCBvZgorICAgKiAgQGUgZGljdGlvbmFyeSBzb3J0ZWQgc2VxdWVuY2VzIG9yZGVyZWQgYnkgQHAgX19jb21wLiAgUGVybXV0ZXMgdGhlIGN1cnJlbnQKKyAgICogIHNlcXVlbmNlIGludG8gdGhlIG5leHQgb25lIG9mIHRoaXMgc2V0LiAgUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBtb3JlCisgICAqICBzZXF1ZW5jZXMgdG8gZ2VuZXJhdGUuICBJZiB0aGUgc2VxdWVuY2UgaXMgdGhlIGxhcmdlc3Qgb2YgdGhlIHNldCwgdGhlCisgICAqICBzbWFsbGVzdCBpcyBnZW5lcmF0ZWQgYW5kIGZhbHNlIHJldHVybmVkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBib29sCisgICAgbmV4dF9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsCisJCSAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIGZhbHNlOworICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2kgPSBfX2ZpcnN0OworICAgICAgKytfX2k7CisgICAgICBpZiAoX19pID09IF9fbGFzdCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBfX2kgPSBfX2xhc3Q7CisgICAgICAtLV9faTsKKworICAgICAgZm9yKDs7KQorCXsKKwkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19paSA9IF9faTsKKwkgIC0tX19pOworCSAgaWYgKF9fY29tcCgqX19pLCAqX19paSkpCisJICAgIHsKKwkgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9faiA9IF9fbGFzdDsKKwkgICAgICB3aGlsZSAoIWJvb2woX19jb21wKCpfX2ksICotLV9faikpKQorCQl7fQorCSAgICAgIHN0ZDo6aXRlcl9zd2FwKF9faSwgX19qKTsKKwkgICAgICBzdGQ6OnJldmVyc2UoX19paSwgX19sYXN0KTsKKwkgICAgICByZXR1cm4gdHJ1ZTsKKwkgICAgfQorCSAgaWYgKF9faSA9PSBfX2ZpcnN0KQorCSAgICB7CisJICAgICAgc3RkOjpyZXZlcnNlKF9fZmlyc3QsIF9fbGFzdCk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUGVybXV0ZSByYW5nZSBpbnRvIHRoZSBwcmV2aW91cyBAZSBkaWN0aW9uYXJ5IG9yZGVyaW5nLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIFN0YXJ0IG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBFbmQgb2YgcmFuZ2UuCisgICAqICBAcmV0dXJuICBGYWxzZSBpZiB3cmFwcGVkIHRvIGxhc3QgcGVybXV0YXRpb24sIHRydWUgb3RoZXJ3aXNlLgorICAgKgorICAgKiAgVHJlYXRzIGFsbCBwZXJtdXRhdGlvbnMgb2YgdGhlIHJhbmdlIGFzIGEgc2V0IG9mIEBlIGRpY3Rpb25hcnkgc29ydGVkCisgICAqICBzZXF1ZW5jZXMuICBQZXJtdXRlcyB0aGUgY3VycmVudCBzZXF1ZW5jZSBpbnRvIHRoZSBwcmV2aW91cyBvbmUgb2YgdGhpcworICAgKiAgc2V0LiAgUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBtb3JlIHNlcXVlbmNlcyB0byBnZW5lcmF0ZS4gIElmIHRoZQorICAgKiAgc2VxdWVuY2UgaXMgdGhlIHNtYWxsZXN0IG9mIHRoZSBzZXQsIHRoZSBsYXJnZXN0IGlzIGdlbmVyYXRlZCBhbmQgZmFsc2UKKyAgICogIHJldHVybmVkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPgorICAgIGJvb2wKKyAgICBwcmV2X3Blcm11dGF0aW9uKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwKKwkJICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBmYWxzZTsKKyAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19pID0gX19maXJzdDsKKyAgICAgICsrX19pOworICAgICAgaWYgKF9faSA9PSBfX2xhc3QpCisJcmV0dXJuIGZhbHNlOworICAgICAgX19pID0gX19sYXN0OworICAgICAgLS1fX2k7CisKKyAgICAgIGZvcig7OykKKwl7CisJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9faWkgPSBfX2k7CisJICAtLV9faTsKKwkgIGlmICgqX19paSA8ICpfX2kpCisJICAgIHsKKwkgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9faiA9IF9fbGFzdDsKKwkgICAgICB3aGlsZSAoISgqLS1fX2ogPCAqX19pKSkKKwkJe30KKwkgICAgICBzdGQ6Oml0ZXJfc3dhcChfX2ksIF9faik7CisJICAgICAgc3RkOjpyZXZlcnNlKF9faWksIF9fbGFzdCk7CisJICAgICAgcmV0dXJuIHRydWU7CisJICAgIH0KKwkgIGlmIChfX2kgPT0gX19maXJzdCkKKwkgICAgeworCSAgICAgIHN0ZDo6cmV2ZXJzZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFBlcm11dGUgcmFuZ2UgaW50byB0aGUgcHJldmlvdXMgQGUgZGljdGlvbmFyeSBvcmRlcmluZyB1c2luZworICAgKiAgICAgICAgICBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEVuZCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgX19jb21wICAgQSBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAcmV0dXJuICBGYWxzZSBpZiB3cmFwcGVkIHRvIGxhc3QgcGVybXV0YXRpb24sIHRydWUgb3RoZXJ3aXNlLgorICAgKgorICAgKiAgVHJlYXRzIGFsbCBwZXJtdXRhdGlvbnMgb2YgdGhlIHJhbmdlIFtfX2ZpcnN0LF9fbGFzdCkgYXMgYSBzZXQgb2YKKyAgICogIEBlIGRpY3Rpb25hcnkgc29ydGVkIHNlcXVlbmNlcyBvcmRlcmVkIGJ5IEBwIF9fY29tcC4gIFBlcm11dGVzIHRoZSBjdXJyZW50CisgICAqICBzZXF1ZW5jZSBpbnRvIHRoZSBwcmV2aW91cyBvbmUgb2YgdGhpcyBzZXQuICBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlCisgICAqICBtb3JlIHNlcXVlbmNlcyB0byBnZW5lcmF0ZS4gIElmIHRoZSBzZXF1ZW5jZSBpcyB0aGUgc21hbGxlc3Qgb2YgdGhlIHNldCwKKyAgICogIHRoZSBsYXJnZXN0IGlzIGdlbmVyYXRlZCBhbmQgZmFsc2UgcmV0dXJuZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGJvb2wKKyAgICBwcmV2X3Blcm11dGF0aW9uKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwKKwkJICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9faSA9IF9fZmlyc3Q7CisgICAgICArK19faTsKKyAgICAgIGlmIChfX2kgPT0gX19sYXN0KQorCXJldHVybiBmYWxzZTsKKyAgICAgIF9faSA9IF9fbGFzdDsKKyAgICAgIC0tX19pOworCisgICAgICBmb3IoOzspCisJeworCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2lpID0gX19pOworCSAgLS1fX2k7CisJICBpZiAoX19jb21wKCpfX2lpLCAqX19pKSkKKwkgICAgeworCSAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19qID0gX19sYXN0OworCSAgICAgIHdoaWxlICghYm9vbChfX2NvbXAoKi0tX19qLCAqX19pKSkpCisJCXt9CisJICAgICAgc3RkOjppdGVyX3N3YXAoX19pLCBfX2opOworCSAgICAgIHN0ZDo6cmV2ZXJzZShfX2lpLCBfX2xhc3QpOworCSAgICAgIHJldHVybiB0cnVlOworCSAgICB9CisJICBpZiAoX19pID09IF9fZmlyc3QpCisJICAgIHsKKwkgICAgICBzdGQ6OnJldmVyc2UoX19maXJzdCwgX19sYXN0KTsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8vIHJlcGxhY2UKKyAgLy8gcmVwbGFjZV9pZgorCisgIC8qKgorICAgKiAgQGJyaWVmIENvcHkgYSBzZXF1ZW5jZSwgcmVwbGFjaW5nIGVhY2ggZWxlbWVudCBvZiBvbmUgdmFsdWUgd2l0aCBhbm90aGVyCisgICAqICAgICAgICAgdmFsdWUuCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICAgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgICAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3Jlc3VsdCAgICAgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX29sZF92YWx1ZSAgVGhlIHZhbHVlIHRvIGJlIHJlcGxhY2VkLgorICAgKiAgQHBhcmFtICBfX25ld192YWx1ZSAgVGhlIHJlcGxhY2VtZW50IHZhbHVlLgorICAgKiAgQHJldHVybiAgIFRoZSBlbmQgb2YgdGhlIG91dHB1dCBzZXF1ZW5jZSwgQHAgcmVzdWx0KyhsYXN0LWZpcnN0KS4KKyAgICoKKyAgICogIENvcGllcyBlYWNoIGVsZW1lbnQgaW4gdGhlIGlucHV0IHJhbmdlIEBwIFtfX2ZpcnN0LF9fbGFzdCkgdG8gdGhlCisgICAqICBvdXRwdXQgcmFuZ2UgQHAgW19fcmVzdWx0LF9fcmVzdWx0KyhfX2xhc3QtX19maXJzdCkpIHJlcGxhY2luZyBlbGVtZW50cworICAgKiAgZXF1YWwgdG8gQHAgX19vbGRfdmFsdWUgd2l0aCBAcCBfX25ld192YWx1ZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHJlcGxhY2VfY29weShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisJCSBjb25zdCBfVHAmIF9fb2xkX3ZhbHVlLCBjb25zdCBfVHAmIF9fbmV3X3ZhbHVlKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0VxdWFsT3BDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlLCBfVHA+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0LCArK19fcmVzdWx0KQorCWlmICgqX19maXJzdCA9PSBfX29sZF92YWx1ZSkKKwkgICpfX3Jlc3VsdCA9IF9fbmV3X3ZhbHVlOworCWVsc2UKKwkgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBDb3B5IGEgc2VxdWVuY2UsIHJlcGxhY2luZyBlYWNoIHZhbHVlIGZvciB3aGljaCBhIHByZWRpY2F0ZQorICAgKiAgICAgICAgIHJldHVybnMgdHJ1ZSB3aXRoIGFub3RoZXIgdmFsdWUuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICAgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgICAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3Jlc3VsdCAgICAgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ByZWQgICAgICAgQSBwcmVkaWNhdGUuCisgICAqICBAcGFyYW0gIF9fbmV3X3ZhbHVlICBUaGUgcmVwbGFjZW1lbnQgdmFsdWUuCisgICAqICBAcmV0dXJuICAgVGhlIGVuZCBvZiB0aGUgb3V0cHV0IHNlcXVlbmNlLCBAcCBfX3Jlc3VsdCsoX19sYXN0LV9fZmlyc3QpLgorICAgKgorICAgKiAgQ29waWVzIGVhY2ggZWxlbWVudCBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSB0byB0aGUgcmFuZ2UKKyAgICogIEBwIFtfX3Jlc3VsdCxfX3Jlc3VsdCsoX19sYXN0LV9fZmlyc3QpKSByZXBsYWNpbmcgZWxlbWVudHMgZm9yIHdoaWNoCisgICAqICBAcCBfX3ByZWQgcmV0dXJucyB0cnVlIHdpdGggQHAgX19uZXdfdmFsdWUuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX1RwPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHJlcGxhY2VfY29weV9pZihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisJCSAgICBfUHJlZGljYXRlIF9fcHJlZCwgY29uc3QgX1RwJiBfX25ld192YWx1ZSkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9VbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X1ByZWRpY2F0ZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICsrX19yZXN1bHQpCisJaWYgKF9fcHJlZCgqX19maXJzdCkpCisJICAqX19yZXN1bHQgPSBfX25ld192YWx1ZTsKKwllbHNlCisJICAqX19yZXN1bHQgPSAqX19maXJzdDsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIC8qKgorICAgKiAgQGJyaWVmICBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgYXJlIHNvcnRlZC4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiB0aGUgZWxlbWVudHMgYXJlIHNvcnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgaXNfc29ydGVkKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisgICAgeyByZXR1cm4gc3RkOjppc19zb3J0ZWRfdW50aWwoX19maXJzdCwgX19sYXN0KSA9PSBfX2xhc3Q7IH0KKworICAvKioKKyAgICogIEBicmllZiAgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIGFyZSBzb3J0ZWQKKyAgICogICAgICAgICAgYWNjb3JkaW5nIHRvIGEgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fY29tcCAgICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgdGhlIGVsZW1lbnRzIGFyZSBzb3J0ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIGJvb2wKKyAgICBpc19zb3J0ZWQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICBfQ29tcGFyZSBfX2NvbXApCisgICAgeyByZXR1cm4gc3RkOjppc19zb3J0ZWRfdW50aWwoX19maXJzdCwgX19sYXN0LCBfX2NvbXApID09IF9fbGFzdDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBEZXRlcm1pbmVzIHRoZSBlbmQgb2YgYSBzb3J0ZWQgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGl0ZXJhdG9yIGkgaW4gW19fZmlyc3QsIF9fbGFzdCkKKyAgICogICAgICAgICAgIGZvciB3aGljaCB0aGUgcmFuZ2UgW19fZmlyc3QsIGkpIGlzIHNvcnRlZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgaXNfc29ydGVkX3VudGlsKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIF9fbGFzdDsKKworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworICAgICAgZm9yICgrK19fbmV4dDsgX19uZXh0ICE9IF9fbGFzdDsgX19maXJzdCA9IF9fbmV4dCwgKytfX25leHQpCisJaWYgKCpfX25leHQgPCAqX19maXJzdCkKKwkgIHJldHVybiBfX25leHQ7CisgICAgICByZXR1cm4gX19uZXh0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgRGV0ZXJtaW5lcyB0aGUgZW5kIG9mIGEgc29ydGVkIHNlcXVlbmNlIHVzaW5nIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2NvbXAgICAgQSBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBpdGVyYXRvciBpIGluIFtfX2ZpcnN0LCBfX2xhc3QpCisgICAqICAgICAgICAgICBmb3Igd2hpY2ggdGhlIHJhbmdlIFtfX2ZpcnN0LCBpKSBpcyBzb3J0ZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBpc19zb3J0ZWRfdW50aWwoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX2xhc3Q7CisKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKyAgICAgIGZvciAoKytfX25leHQ7IF9fbmV4dCAhPSBfX2xhc3Q7IF9fZmlyc3QgPSBfX25leHQsICsrX19uZXh0KQorCWlmIChfX2NvbXAoKl9fbmV4dCwgKl9fZmlyc3QpKQorCSAgcmV0dXJuIF9fbmV4dDsKKyAgICAgIHJldHVybiBfX25leHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBEZXRlcm1pbmVzIG1pbiBhbmQgbWF4IGF0IG9uY2UgYXMgYW4gb3JkZXJlZCBwYWlyLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fYSAgQSB0aGluZyBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEBwYXJhbSAgX19iICBBbm90aGVyIHRoaW5nIG9mIGFyYml0cmFyeSB0eXBlLgorICAgKiAgQHJldHVybiBBIHBhaXIoX19iLCBfX2EpIGlmIF9fYiBpcyBzbWFsbGVyIHRoYW4gX19hLCBwYWlyKF9fYSwKKyAgICogIF9fYikgb3RoZXJ3aXNlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHBhaXI8Y29uc3QgX1RwJiwgY29uc3QgX1RwJj4KKyAgICBtaW5tYXgoY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19iKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQ8X1RwPikKKworICAgICAgcmV0dXJuIF9fYiA8IF9fYSA/IHBhaXI8Y29uc3QgX1RwJiwgY29uc3QgX1RwJj4oX19iLCBfX2EpCisJICAgICAgICAgICAgICAgOiBwYWlyPGNvbnN0IF9UcCYsIGNvbnN0IF9UcCY+KF9fYSwgX19iKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIERldGVybWluZXMgbWluIGFuZCBtYXggYXQgb25jZSBhcyBhbiBvcmRlcmVkIHBhaXIuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19hICBBIHRoaW5nIG9mIGFyYml0cmFyeSB0eXBlLgorICAgKiAgQHBhcmFtICBfX2IgIEFub3RoZXIgdGhpbmcgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqICBAcGFyYW0gIF9fY29tcCAgQSBAbGluayBjb21wYXJpc29uX2Z1bmN0b3JzIGNvbXBhcmlzb24gZnVuY3RvciBAZW5kbGluay4KKyAgICogIEByZXR1cm4gQSBwYWlyKF9fYiwgX19hKSBpZiBfX2IgaXMgc21hbGxlciB0aGFuIF9fYSwgcGFpcihfX2EsCisgICAqICBfX2IpIG90aGVyd2lzZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgcGFpcjxjb25zdCBfVHAmLCBjb25zdCBfVHAmPgorICAgIG1pbm1heChjb25zdCBfVHAmIF9fYSwgY29uc3QgX1RwJiBfX2IsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICByZXR1cm4gX19jb21wKF9fYiwgX19hKSA/IHBhaXI8Y29uc3QgX1RwJiwgY29uc3QgX1RwJj4oX19iLCBfX2EpCisJICAgICAgICAgICAgICAgICAgICAgIDogcGFpcjxjb25zdCBfVHAmLCBjb25zdCBfVHAmPihfX2EsIF9fYik7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZXR1cm4gYSBwYWlyIG9mIGl0ZXJhdG9ycyBwb2ludGluZyB0byB0aGUgbWluaW11bSBhbmQgbWF4aW11bQorICAgKiAgICAgICAgICBlbGVtZW50cyBpbiBhIHJhbmdlLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIFN0YXJ0IG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBFbmQgb2YgcmFuZ2UuCisgICAqICBAcmV0dXJuICBtYWtlX3BhaXIobSwgTSksIHdoZXJlIG0gaXMgdGhlIGZpcnN0IGl0ZXJhdG9yIGkgaW4gCisgICAqICAgICAgICAgICBbX19maXJzdCwgX19sYXN0KSBzdWNoIHRoYXQgbm8gb3RoZXIgZWxlbWVudCBpbiB0aGUgcmFuZ2UgaXMKKyAgICogICAgICAgICAgIHNtYWxsZXIsIGFuZCB3aGVyZSBNIGlzIHRoZSBsYXN0IGl0ZXJhdG9yIGkgaW4gW19fZmlyc3QsIF9fbGFzdCkKKyAgICogICAgICAgICAgIHN1Y2ggdGhhdCBubyBvdGhlciBlbGVtZW50IGluIHRoZSByYW5nZSBpcyBsYXJnZXIuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgcGFpcjxfRm9yd2FyZEl0ZXJhdG9yLCBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIG1pbm1heF9lbGVtZW50KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QKKwkgIHx8ICsrX19uZXh0ID09IF9fbGFzdCkKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoX19maXJzdCwgX19maXJzdCk7CisKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taW4sIF9fbWF4OworICAgICAgaWYgKCpfX25leHQgPCAqX19maXJzdCkKKwl7CisJICBfX21pbiA9IF9fbmV4dDsKKwkgIF9fbWF4ID0gX19maXJzdDsKKwl9CisgICAgICBlbHNlCisJeworCSAgX19taW4gPSBfX2ZpcnN0OworCSAgX19tYXggPSBfX25leHQ7CisJfQorCisgICAgICBfX2ZpcnN0ID0gX19uZXh0OworICAgICAgKytfX2ZpcnN0OworCisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJeworCSAgX19uZXh0ID0gX19maXJzdDsKKwkgIGlmICgrK19fbmV4dCA9PSBfX2xhc3QpCisJICAgIHsKKwkgICAgICBpZiAoKl9fZmlyc3QgPCAqX19taW4pCisJCV9fbWluID0gX19maXJzdDsKKwkgICAgICBlbHNlIGlmICghKCpfX2ZpcnN0IDwgKl9fbWF4KSkKKwkJX19tYXggPSBfX2ZpcnN0OworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIGlmICgqX19uZXh0IDwgKl9fZmlyc3QpCisJICAgIHsKKwkgICAgICBpZiAoKl9fbmV4dCA8ICpfX21pbikKKwkJX19taW4gPSBfX25leHQ7CisJICAgICAgaWYgKCEoKl9fZmlyc3QgPCAqX19tYXgpKQorCQlfX21heCA9IF9fZmlyc3Q7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICgqX19maXJzdCA8ICpfX21pbikKKwkJX19taW4gPSBfX2ZpcnN0OworCSAgICAgIGlmICghKCpfX25leHQgPCAqX19tYXgpKQorCQlfX21heCA9IF9fbmV4dDsKKwkgICAgfQorCisJICBfX2ZpcnN0ID0gX19uZXh0OworCSAgKytfX2ZpcnN0OworCX0KKworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKF9fbWluLCBfX21heCk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZXR1cm4gYSBwYWlyIG9mIGl0ZXJhdG9ycyBwb2ludGluZyB0byB0aGUgbWluaW11bSBhbmQgbWF4aW11bQorICAgKiAgICAgICAgICBlbGVtZW50cyBpbiBhIHJhbmdlLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIFN0YXJ0IG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBFbmQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fY29tcCAgIENvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIG1ha2VfcGFpcihtLCBNKSwgd2hlcmUgbSBpcyB0aGUgZmlyc3QgaXRlcmF0b3IgaSBpbiAKKyAgICogICAgICAgICAgIFtfX2ZpcnN0LCBfX2xhc3QpIHN1Y2ggdGhhdCBubyBvdGhlciBlbGVtZW50IGluIHRoZSByYW5nZSBpcworICAgKiAgICAgICAgICAgc21hbGxlciwgYW5kIHdoZXJlIE0gaXMgdGhlIGxhc3QgaXRlcmF0b3IgaSBpbiBbX19maXJzdCwgX19sYXN0KQorICAgKiAgICAgICAgICAgc3VjaCB0aGF0IG5vIG90aGVyIGVsZW1lbnQgaW4gdGhlIHJhbmdlIGlzIGxhcmdlci4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgcGFpcjxfRm9yd2FyZEl0ZXJhdG9yLCBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIG1pbm1heF9lbGVtZW50KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCSAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0CisJICB8fCArK19fbmV4dCA9PSBfX2xhc3QpCisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKF9fZmlyc3QsIF9fZmlyc3QpOworCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWluLCBfX21heDsKKyAgICAgIGlmIChfX2NvbXAoKl9fbmV4dCwgKl9fZmlyc3QpKQorCXsKKwkgIF9fbWluID0gX19uZXh0OworCSAgX19tYXggPSBfX2ZpcnN0OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBfX21pbiA9IF9fZmlyc3Q7CisJICBfX21heCA9IF9fbmV4dDsKKwl9CisKKyAgICAgIF9fZmlyc3QgPSBfX25leHQ7CisgICAgICArK19fZmlyc3Q7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICBfX25leHQgPSBfX2ZpcnN0OworCSAgaWYgKCsrX19uZXh0ID09IF9fbGFzdCkKKwkgICAgeworCSAgICAgIGlmIChfX2NvbXAoKl9fZmlyc3QsICpfX21pbikpCisJCV9fbWluID0gX19maXJzdDsKKwkgICAgICBlbHNlIGlmICghX19jb21wKCpfX2ZpcnN0LCAqX19tYXgpKQorCQlfX21heCA9IF9fZmlyc3Q7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgaWYgKF9fY29tcCgqX19uZXh0LCAqX19maXJzdCkpCisJICAgIHsKKwkgICAgICBpZiAoX19jb21wKCpfX25leHQsICpfX21pbikpCisJCV9fbWluID0gX19uZXh0OworCSAgICAgIGlmICghX19jb21wKCpfX2ZpcnN0LCAqX19tYXgpKQorCQlfX21heCA9IF9fZmlyc3Q7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChfX2NvbXAoKl9fZmlyc3QsICpfX21pbikpCisJCV9fbWluID0gX19maXJzdDsKKwkgICAgICBpZiAoIV9fY29tcCgqX19uZXh0LCAqX19tYXgpKQorCQlfX21heCA9IF9fbmV4dDsKKwkgICAgfQorCisJICBfX2ZpcnN0ID0gX19uZXh0OworCSAgKytfX2ZpcnN0OworCX0KKworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKF9fbWluLCBfX21heCk7CisgICAgfQorCisgIC8vIE4yNzIyICsgRFIgOTE1LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIG1pbihpbml0aWFsaXplcl9saXN0PF9UcD4gX19sKQorICAgIHsgcmV0dXJuICpzdGQ6Om1pbl9lbGVtZW50KF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgX1RwCisgICAgbWluKGluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2wsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7IHJldHVybiAqc3RkOjptaW5fZWxlbWVudChfX2wuYmVnaW4oKSwgX19sLmVuZCgpLCBfX2NvbXApOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBtYXgoaW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9fbCkKKyAgICB7IHJldHVybiAqc3RkOjptYXhfZWxlbWVudChfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIF9UcAorICAgIG1heChpbml0aWFsaXplcl9saXN0PF9UcD4gX19sLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeyByZXR1cm4gKnN0ZDo6bWF4X2VsZW1lbnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSwgX19jb21wKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgcGFpcjxfVHAsIF9UcD4KKyAgICBtaW5tYXgoaW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9fbCkKKyAgICB7CisgICAgICBwYWlyPGNvbnN0IF9UcCosIGNvbnN0IF9UcCo+IF9fcCA9CisJc3RkOjptaW5tYXhfZWxlbWVudChfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigqX19wLmZpcnN0LCAqX19wLnNlY29uZCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHBhaXI8X1RwLCBfVHA+CisgICAgbWlubWF4KGluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2wsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBwYWlyPGNvbnN0IF9UcCosIGNvbnN0IF9UcCo+IF9fcCA9CisJc3RkOjptaW5tYXhfZWxlbWVudChfX2wuYmVnaW4oKSwgX19sLmVuZCgpLCBfX2NvbXApOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKCpfX3AuZmlyc3QsICpfX3Auc2Vjb25kKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIGEgcGVybXV0YWlvbiBvZiB0aGUgc2Vjb25kIHNlcXVlbmNlIGlzIGVxdWFsCisgICAqICAgICAgICAgIHRvIHRoZSBmaXJzdCBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QxICBTdGFydCBvZiBmaXJzdCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19sYXN0MSAgIEVuZCBvZiBmaXJzdCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgIFN0YXJ0IG9mIHNlY29uZCByYW5nZS4KKyAgICogIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBleGlzdHMgYSBwZXJtdXRhdGlvbiBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlCisgICAqICAgICAgICAgIFtfX2ZpcnN0MiwgX19maXJzdDIgKyAoX19sYXN0MSAtIF9fZmlyc3QxKSksIGJlZ2lubmluZyB3aXRoIAorICAgKiAgICAgICAgICBGb3J3YXJkSXRlcmF0b3IyIGJlZ2luLCBzdWNoIHRoYXQgZXF1YWwoX19maXJzdDEsIF9fbGFzdDEsIGJlZ2luKQorICAgKiAgICAgICAgICByZXR1cm5zIHRydWU7IG90aGVyd2lzZSwgcmV0dXJucyBmYWxzZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjEsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IyPgorICAgIGJvb2wKKyAgICBpc19wZXJtdXRhdGlvbihfRm9yd2FyZEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyYXRvcjEgX19sYXN0MSwKKwkJICAgX0ZvcndhcmRJdGVyYXRvcjIgX19maXJzdDIpCisgICAgeworICAgICAgLy8gRWZmaWNpZW50bHkgY29tcGFyZSBpZGVudGljYWwgcHJlZml4ZXM6ICBPKE4pIGlmIHNlcXVlbmNlcworICAgICAgLy8gaGF2ZSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBvcmRlci4KKyAgICAgIGZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCArK19fZmlyc3QyKQorCWlmICghKCpfX2ZpcnN0MSA9PSAqX19maXJzdDIpKQorCSAgYnJlYWs7CisKKyAgICAgIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxKQorCXJldHVybiB0cnVlOworCisgICAgICAvLyBFc3RhYmxpc2ggX19sYXN0MiBhc3N1bWluZyBlcXVhbCByYW5nZXMgYnkgaXRlcmF0aW5nIG92ZXIgdGhlCisgICAgICAvLyByZXN0IG9mIHRoZSBsaXN0LgorICAgICAgX0ZvcndhcmRJdGVyYXRvcjIgX19sYXN0MiA9IF9fZmlyc3QyOworICAgICAgc3RkOjphZHZhbmNlKF9fbGFzdDIsIHN0ZDo6ZGlzdGFuY2UoX19maXJzdDEsIF9fbGFzdDEpKTsKKyAgICAgIGZvciAoX0ZvcndhcmRJdGVyYXRvcjEgX19zY2FuID0gX19maXJzdDE7IF9fc2NhbiAhPSBfX2xhc3QxOyArK19fc2NhbikKKwl7CisJICBpZiAoX19zY2FuICE9IF9HTElCQ1hYX1NURF9BOjpmaW5kKF9fZmlyc3QxLCBfX3NjYW4sICpfX3NjYW4pKQorCSAgICBjb250aW51ZTsgLy8gV2UndmUgc2VlbiB0aGlzIG9uZSBiZWZvcmUuCisKKwkgIGF1dG8gX19tYXRjaGVzID0gc3RkOjpjb3VudChfX2ZpcnN0MiwgX19sYXN0MiwgKl9fc2Nhbik7CisJICBpZiAoMCA9PSBfX21hdGNoZXMKKwkgICAgICB8fCBzdGQ6OmNvdW50KF9fc2NhbiwgX19sYXN0MSwgKl9fc2NhbikgIT0gX19tYXRjaGVzKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBDaGVja3Mgd2hldGhlciBhIHBlcm11dGF0aW9uIG9mIHRoZSBzZWNvbmQgc2VxdWVuY2UgaXMgZXF1YWwKKyAgICogICAgICAgICAgdG8gdGhlIGZpcnN0IHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdDEgIFN0YXJ0IG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgRW5kIG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgU3RhcnQgb2Ygc2Vjb25kIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX3ByZWQgICAgQSBiaW5hcnkgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiB0cnVlIGlmIHRoZXJlIGV4aXN0cyBhIHBlcm11dGF0aW9uIG9mIHRoZSBlbGVtZW50cyBpbgorICAgKiAgICAgICAgICB0aGUgcmFuZ2UgW19fZmlyc3QyLCBfX2ZpcnN0MiArIChfX2xhc3QxIC0gX19maXJzdDEpKSwKKyAgICogICAgICAgICAgYmVnaW5uaW5nIHdpdGggRm9yd2FyZEl0ZXJhdG9yMiBiZWdpbiwgc3VjaCB0aGF0CisgICAqICAgICAgICAgIGVxdWFsKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2JlZ2luLCBfX3ByZWQpIHJldHVybnMgdHJ1ZTsKKyAgICogICAgICAgICAgb3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBib29sCisgICAgaXNfcGVybXV0YXRpb24oX0ZvcndhcmRJdGVyYXRvcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcmF0b3IxIF9fbGFzdDEsCisJCSAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fZmlyc3QyLCBfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICAvLyBFZmZpY2llbnRseSBjb21wYXJlIGlkZW50aWNhbCBwcmVmaXhlczogIE8oTikgaWYgc2VxdWVuY2VzCisgICAgICAvLyBoYXZlIHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIG9yZGVyLgorICAgICAgZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19maXJzdDEsICsrX19maXJzdDIpCisJaWYgKCFib29sKF9fcHJlZCgqX19maXJzdDEsICpfX2ZpcnN0MikpKQorCSAgYnJlYWs7CisKKyAgICAgIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxKQorCXJldHVybiB0cnVlOworCisgICAgICAvLyBFc3RhYmxpc2ggX19sYXN0MiBhc3N1bWluZyBlcXVhbCByYW5nZXMgYnkgaXRlcmF0aW5nIG92ZXIgdGhlCisgICAgICAvLyByZXN0IG9mIHRoZSBsaXN0LgorICAgICAgX0ZvcndhcmRJdGVyYXRvcjIgX19sYXN0MiA9IF9fZmlyc3QyOworICAgICAgc3RkOjphZHZhbmNlKF9fbGFzdDIsIHN0ZDo6ZGlzdGFuY2UoX19maXJzdDEsIF9fbGFzdDEpKTsKKyAgICAgIGZvciAoX0ZvcndhcmRJdGVyYXRvcjEgX19zY2FuID0gX19maXJzdDE7IF9fc2NhbiAhPSBfX2xhc3QxOyArK19fc2NhbikKKwl7CisJICB1c2luZyBzdGQ6OnBsYWNlaG9sZGVyczo6XzE7CisKKwkgIGlmIChfX3NjYW4gIT0gX0dMSUJDWFhfU1REX0E6OmZpbmRfaWYoX19maXJzdDEsIF9fc2NhbiwKKwkJCQkJCXN0ZDo6YmluZChfX3ByZWQsIF8xLCAqX19zY2FuKSkpCisJICAgIGNvbnRpbnVlOyAvLyBXZSd2ZSBzZWVuIHRoaXMgb25lIGJlZm9yZS4KKwkgIAorCSAgYXV0byBfX21hdGNoZXMgPSBzdGQ6OmNvdW50X2lmKF9fZmlyc3QyLCBfX2xhc3QyLAorCQkJCQkgc3RkOjpiaW5kKF9fcHJlZCwgXzEsICpfX3NjYW4pKTsKKwkgIGlmICgwID09IF9fbWF0Y2hlcworCSAgICAgIHx8IHN0ZDo6Y291bnRfaWYoX19zY2FuLCBfX2xhc3QxLAorCQkJICAgICAgIHN0ZDo6YmluZChfX3ByZWQsIF8xLCAqX19zY2FuKSkgIT0gX19tYXRjaGVzKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisjaWZkZWYgX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxCisgIC8qKgorICAgKiAgQGJyaWVmIFNodWZmbGUgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgdXNpbmcgYSB1bmlmb3JtIHJhbmRvbQorICAgKiAgICAgICAgIG51bWJlciBnZW5lcmF0b3IuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fZyAgICAgICBBIFVuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IgKDI2LjUuMS4zKS4KKyAgICogIEByZXR1cm4gIE5vdGhpbmcuCisgICAqCisgICAqICBSZW9yZGVycyB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LF9fbGFzdCkgdXNpbmcgQHAgX19nIHRvCisgICAqICBwcm92aWRlIHJhbmRvbSBudW1iZXJzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgdm9pZAorICAgIHNodWZmbGUoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiYgX19nKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm47CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaXN0YW5jZVR5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjptYWtlX3Vuc2lnbmVkPF9EaXN0YW5jZVR5cGU+Ojp0eXBlIF9fdWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248X191ZF90eXBlPiBfX2Rpc3RyX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZGlzdHJfdHlwZTo6cGFyYW1fdHlwZSBfX3BfdHlwZTsKKyAgICAgIF9fZGlzdHJfdHlwZSBfX2Q7CisKKyAgICAgIGZvciAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9faSA9IF9fZmlyc3QgKyAxOyBfX2kgIT0gX19sYXN0OyArK19faSkKKwlzdGQ6Oml0ZXJfc3dhcChfX2ksIF9fZmlyc3QgKyBfX2QoX19nLCBfX3BfdHlwZSgwLCBfX2kgLSBfX2ZpcnN0KSkpOworICAgIH0KKyNlbmRpZgorCisjZW5kaWYgLy8gQysrMTEKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9BTEdPCisKKyAgLyoqCisgICAqICBAYnJpZWYgQXBwbHkgYSBmdW5jdGlvbiB0byBldmVyeSBlbGVtZW50IG9mIGEgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fZiAgICAgIEEgdW5hcnkgZnVuY3Rpb24gb2JqZWN0LgorICAgKiAgQHJldHVybiAgIEBwIF9fZiAoc3RkOjptb3ZlKEBwIF9fZikgaW4gQysrMHgpLgorICAgKgorICAgKiAgQXBwbGllcyB0aGUgZnVuY3Rpb24gb2JqZWN0IEBwIF9fZiB0byBlYWNoIGVsZW1lbnQgaW4gdGhlIHJhbmdlCisgICAqICBAcCBbZmlyc3QsbGFzdCkuICBAcCBfX2YgbXVzdCBub3QgbW9kaWZ5IHRoZSBvcmRlciBvZiB0aGUgc2VxdWVuY2UuCisgICAqICBJZiBAcCBfX2YgaGFzIGEgcmV0dXJuIHZhbHVlIGl0IGlzIGlnbm9yZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfRnVuY3Rpb24+CisgICAgX0Z1bmN0aW9uCisgICAgZm9yX2VhY2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfRnVuY3Rpb24gX19mKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJX19mKCpfX2ZpcnN0KTsKKyAgICAgIHJldHVybiBfR0xJQkNYWF9NT1ZFKF9fZik7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYSB2YWx1ZSBpbiBhIHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ZhbCAgICBUaGUgdmFsdWUgdG8gZmluZC4KKyAgICogIEByZXR1cm4gICBUaGUgZmlyc3QgaXRlcmF0b3IgQGMgaSBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KQorICAgKiAgc3VjaCB0aGF0IEBjICppID09IEBwIF9fdmFsLCBvciBAcCBfX2xhc3QgaWYgbm8gc3VjaCBpdGVyYXRvciBleGlzdHMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9JbnB1dEl0ZXJhdG9yCisgICAgZmluZChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJIGNvbnN0IF9UcCYgX192YWwpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9FcXVhbE9wQ29uY2VwdDwKKwkJdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwgX1RwPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgcmV0dXJuIHN0ZDo6X19maW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWwsCisJCSAgICAgICAgIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIEZpbmQgdGhlIGZpcnN0IGVsZW1lbnQgaW4gYSBzZXF1ZW5jZSBmb3Igd2hpY2ggYQorICAgKiAgICAgICAgIHByZWRpY2F0ZSBpcyB0cnVlLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ByZWQgICBBIHByZWRpY2F0ZS4KKyAgICogIEByZXR1cm4gICBUaGUgZmlyc3QgaXRlcmF0b3IgQGMgaSBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KQorICAgKiAgc3VjaCB0aGF0IEBwIF9fcHJlZCgqaSkgaXMgdHJ1ZSwgb3IgQHAgX19sYXN0IGlmIG5vIHN1Y2ggaXRlcmF0b3IgZXhpc3RzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX0lucHV0SXRlcmF0b3IKKyAgICBmaW5kX2lmKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9VbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X1ByZWRpY2F0ZSwKKwkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgcmV0dXJuIHN0ZDo6X19maW5kX2lmKF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkLAorCQkJICAgIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBGaW5kIGVsZW1lbnQgZnJvbSBhIHNldCBpbiBhIHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdDEgIFN0YXJ0IG9mIHJhbmdlIHRvIHNlYXJjaC4KKyAgICogIEBwYXJhbSAgX19sYXN0MSAgIEVuZCBvZiByYW5nZSB0byBzZWFyY2guCisgICAqICBAcGFyYW0gIF9fZmlyc3QyICBTdGFydCBvZiBtYXRjaCBjYW5kaWRhdGVzLgorICAgKiAgQHBhcmFtICBfX2xhc3QyICAgRW5kIG9mIG1hdGNoIGNhbmRpZGF0ZXMuCisgICAqICBAcmV0dXJuICAgVGhlIGZpcnN0IGl0ZXJhdG9yIEBjIGkgaW4gdGhlIHJhbmdlCisgICAqICBAcCBbX19maXJzdDEsX19sYXN0MSkgc3VjaCB0aGF0IEBjICppID09IEBwICooaTIpIHN1Y2ggdGhhdCBpMiBpcyBhbgorICAgKiAgaXRlcmF0b3IgaW4gW19fZmlyc3QyLF9fbGFzdDIpLCBvciBAcCBfX2xhc3QxIGlmIG5vIHN1Y2ggaXRlcmF0b3IgZXhpc3RzLgorICAgKgorICAgKiAgU2VhcmNoZXMgdGhlIHJhbmdlIEBwIFtfX2ZpcnN0MSxfX2xhc3QxKSBmb3IgYW4gZWxlbWVudCB0aGF0IGlzCisgICAqICBlcXVhbCB0byBzb21lIGVsZW1lbnQgaW4gdGhlIHJhbmdlIFtfX2ZpcnN0MixfX2xhc3QyKS4gIElmCisgICAqICBmb3VuZCwgcmV0dXJucyBhbiBpdGVyYXRvciBpbiB0aGUgcmFuZ2UgW19fZmlyc3QxLF9fbGFzdDEpLAorICAgKiAgb3RoZXJ3aXNlIHJldHVybnMgQHAgX19sYXN0MS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgX0lucHV0SXRlcmF0b3IKKyAgICBmaW5kX2ZpcnN0X29mKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvciBfX2xhc3QxLAorCQkgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdDIsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0MikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0VxdWFsT3BDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MiwgX19sYXN0Mik7CisKKyAgICAgIGZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxKQorCWZvciAoX0ZvcndhcmRJdGVyYXRvciBfX2l0ZXIgPSBfX2ZpcnN0MjsgX19pdGVyICE9IF9fbGFzdDI7ICsrX19pdGVyKQorCSAgaWYgKCpfX2ZpcnN0MSA9PSAqX19pdGVyKQorCSAgICByZXR1cm4gX19maXJzdDE7CisgICAgICByZXR1cm4gX19sYXN0MTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEZpbmQgZWxlbWVudCBmcm9tIGEgc2V0IGluIGEgc2VxdWVuY2UgdXNpbmcgYSBwcmVkaWNhdGUuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgU3RhcnQgb2YgcmFuZ2UgdG8gc2VhcmNoLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgRW5kIG9mIHJhbmdlIHRvIHNlYXJjaC4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgIFN0YXJ0IG9mIG1hdGNoIGNhbmRpZGF0ZXMuCisgICAqICBAcGFyYW0gIF9fbGFzdDIgICBFbmQgb2YgbWF0Y2ggY2FuZGlkYXRlcy4KKyAgICogIEBwYXJhbSAgX19jb21wICAgIFByZWRpY2F0ZSB0byB1c2UuCisgICAqICBAcmV0dXJuICAgVGhlIGZpcnN0IGl0ZXJhdG9yIEBjIGkgaW4gdGhlIHJhbmdlCisgICAqICBAcCBbX19maXJzdDEsX19sYXN0MSkgc3VjaCB0aGF0IEBjIGNvbXAoKmksIEBwICooaTIpKSBpcyB0cnVlCisgICAqICBhbmQgaTIgaXMgYW4gaXRlcmF0b3IgaW4gW19fZmlyc3QyLF9fbGFzdDIpLCBvciBAcCBfX2xhc3QxIGlmIG5vCisgICAqICBzdWNoIGl0ZXJhdG9yIGV4aXN0cy4KKyAgICoKKworICAgKiAgU2VhcmNoZXMgdGhlIHJhbmdlIEBwIFtfX2ZpcnN0MSxfX2xhc3QxKSBmb3IgYW4gZWxlbWVudCB0aGF0IGlzCisgICAqICBlcXVhbCB0byBzb21lIGVsZW1lbnQgaW4gdGhlIHJhbmdlIFtfX2ZpcnN0MixfX2xhc3QyKS4gIElmCisgICAqICBmb3VuZCwgcmV0dXJucyBhbiBpdGVyYXRvciBpbiB0aGUgcmFuZ2UgW19fZmlyc3QxLF9fbGFzdDEpLAorICAgKiAgb3RoZXJ3aXNlIHJldHVybnMgQHAgX19sYXN0MS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfSW5wdXRJdGVyYXRvcgorICAgIGZpbmRfZmlyc3Rfb2YoX0lucHV0SXRlcmF0b3IgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdDEsCisJCSAgX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QyLAorCQkgIF9CaW5hcnlQcmVkaWNhdGUgX19jb21wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQmluYXJ5UHJlZGljYXRlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MiwgX19sYXN0Mik7CisKKyAgICAgIGZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxKQorCWZvciAoX0ZvcndhcmRJdGVyYXRvciBfX2l0ZXIgPSBfX2ZpcnN0MjsgX19pdGVyICE9IF9fbGFzdDI7ICsrX19pdGVyKQorCSAgaWYgKF9fY29tcCgqX19maXJzdDEsICpfX2l0ZXIpKQorCSAgICByZXR1cm4gX19maXJzdDE7CisgICAgICByZXR1cm4gX19sYXN0MTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRmluZCB0d28gYWRqYWNlbnQgdmFsdWVzIGluIGEgc2VxdWVuY2UgdGhhdCBhcmUgZXF1YWwuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gICBUaGUgZmlyc3QgaXRlcmF0b3IgQGMgaSBzdWNoIHRoYXQgQGMgaSBhbmQgQGMgaSsxIGFyZSBib3RoCisgICAqICB2YWxpZCBpdGVyYXRvcnMgaW4gQHAgW19fZmlyc3QsX19sYXN0KSBhbmQgc3VjaCB0aGF0IEBjICppID09IEBjICooaSsxKSwKKyAgICogIG9yIEBwIF9fbGFzdCBpZiBubyBzdWNoIGl0ZXJhdG9yIGV4aXN0cy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgYWRqYWNlbnRfZmluZChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0VxdWFsaXR5Q29tcGFyYWJsZUNvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gX19sYXN0OworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworICAgICAgd2hpbGUoKytfX25leHQgIT0gX19sYXN0KQorCXsKKwkgIGlmICgqX19maXJzdCA9PSAqX19uZXh0KQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgIF9fZmlyc3QgPSBfX25leHQ7CisJfQorICAgICAgcmV0dXJuIF9fbGFzdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRmluZCB0d28gYWRqYWNlbnQgdmFsdWVzIGluIGEgc2VxdWVuY2UgdXNpbmcgYSBwcmVkaWNhdGUuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgICAgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgICAgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2JpbmFyeV9wcmVkICAgQSBiaW5hcnkgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiAgIFRoZSBmaXJzdCBpdGVyYXRvciBAYyBpIHN1Y2ggdGhhdCBAYyBpIGFuZCBAYyBpKzEgYXJlIGJvdGgKKyAgICogIHZhbGlkIGl0ZXJhdG9ycyBpbiBAcCBbX19maXJzdCxfX2xhc3QpIGFuZCBzdWNoIHRoYXQKKyAgICogIEBwIF9fYmluYXJ5X3ByZWQoKmksKihpKzEpKSBpcyB0cnVlLCBvciBAcCBfX2xhc3QgaWYgbm8gc3VjaCBpdGVyYXRvcgorICAgKiAgZXhpc3RzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBhZGphY2VudF9maW5kKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCSAgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0JpbmFyeVByZWRpY2F0ZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIF9fbGFzdDsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKyAgICAgIHdoaWxlKCsrX19uZXh0ICE9IF9fbGFzdCkKKwl7CisJICBpZiAoX19iaW5hcnlfcHJlZCgqX19maXJzdCwgKl9fbmV4dCkpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgX19maXJzdCA9IF9fbmV4dDsKKwl9CisgICAgICByZXR1cm4gX19sYXN0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBDb3VudCB0aGUgbnVtYmVyIG9mIGNvcGllcyBvZiBhIHZhbHVlIGluIGEgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fdmFsdWUgIFRoZSB2YWx1ZSB0byBiZSBjb3VudGVkLgorICAgKiAgQHJldHVybiAgIFRoZSBudW1iZXIgb2YgaXRlcmF0b3JzIEBjIGkgaW4gdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LF9fbGFzdCkKKyAgICogIGZvciB3aGljaCBAYyAqaSA9PSBAcCBfX3ZhbHVlCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgY291bnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsdWUpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9FcXVhbE9wQ29uY2VwdDwKKwl0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlLCBfVHA+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgX19uID0gMDsKKyAgICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCWlmICgqX19maXJzdCA9PSBfX3ZhbHVlKQorCSAgKytfX247CisgICAgICByZXR1cm4gX19uOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBDb3VudCB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSBmb3Igd2hpY2ggYSBwcmVkaWNhdGUgaXMgdHJ1ZS4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19wcmVkICAgQSBwcmVkaWNhdGUuCisgICAqICBAcmV0dXJuICAgVGhlIG51bWJlciBvZiBpdGVyYXRvcnMgQGMgaSBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KQorICAgKiAgZm9yIHdoaWNoIEBwIF9fcHJlZCgqaSkgaXMgdHJ1ZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgY291bnRfaWYoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1VuYXJ5UHJlZGljYXRlQ29uY2VwdDxfUHJlZGljYXRlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIF9fbiA9IDA7CisgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwlpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKwkgICsrX19uOworICAgICAgcmV0dXJuIF9fbjsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgU2VhcmNoIGEgc2VxdWVuY2UgZm9yIGEgbWF0Y2hpbmcgc3ViLXNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdDEgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0MSAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0MiAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gVGhlIGZpcnN0IGl0ZXJhdG9yIEBjIGkgaW4gdGhlIHJhbmdlIEBwCisgICAqICBbX19maXJzdDEsX19sYXN0MS0oX19sYXN0Mi1fX2ZpcnN0MikpIHN1Y2ggdGhhdCBAYyAqKGkrTikgPT0gQHAKKyAgICogICooX19maXJzdDIrTikgZm9yIGVhY2ggQGMgTiBpbiB0aGUgcmFuZ2UgQHAKKyAgICogIFswLF9fbGFzdDItX19maXJzdDIpLCBvciBAcCBfX2xhc3QxIGlmIG5vIHN1Y2ggaXRlcmF0b3IgZXhpc3RzLgorICAgKgorICAgKiAgU2VhcmNoZXMgdGhlIHJhbmdlIEBwIFtfX2ZpcnN0MSxfX2xhc3QxKSBmb3IgYSBzdWItc2VxdWVuY2UgdGhhdAorICAgKiAgY29tcGFyZXMgZXF1YWwgdmFsdWUtYnktdmFsdWUgd2l0aCB0aGUgc2VxdWVuY2UgZ2l2ZW4gYnkgQHAKKyAgICogIFtfX2ZpcnN0MixfX2xhc3QyKSBhbmQgcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZmlyc3QgZWxlbWVudAorICAgKiAgb2YgdGhlIHN1Yi1zZXF1ZW5jZSwgb3IgQHAgX19sYXN0MSBpZiB0aGUgc3ViLXNlcXVlbmNlIGlzIG5vdAorICAgKiAgZm91bmQuCisgICAqCisgICAqICBCZWNhdXNlIHRoZSBzdWItc2VxdWVuY2UgbXVzdCBsaWUgY29tcGxldGVseSB3aXRoaW4gdGhlIHJhbmdlIEBwCisgICAqICBbX19maXJzdDEsX19sYXN0MSkgaXQgbXVzdCBzdGFydCBhdCBhIHBvc2l0aW9uIGxlc3MgdGhhbiBAcAorICAgKiAgX19sYXN0MS0oX19sYXN0Mi1fX2ZpcnN0Mikgd2hlcmUgQHAgX19sYXN0Mi1fX2ZpcnN0MiBpcyB0aGUKKyAgICogIGxlbmd0aCBvZiB0aGUgc3ViLXNlcXVlbmNlLgorICAgKgorICAgKiAgVGhpcyBtZWFucyB0aGF0IHRoZSByZXR1cm5lZCBpdGVyYXRvciBAYyBpIHdpbGwgYmUgaW4gdGhlIHJhbmdlCisgICAqICBAcCBbX19maXJzdDEsX19sYXN0MS0oX19sYXN0Mi1fX2ZpcnN0MikpCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IxLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMj4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yMQorICAgIHNlYXJjaChfRm9yd2FyZEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyYXRvcjEgX19sYXN0MSwKKwkgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyYXRvcjIgX19sYXN0MikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0VxdWFsT3BDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpOworCisgICAgICAvLyBUZXN0IGZvciBlbXB0eSByYW5nZXMKKyAgICAgIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxIHx8IF9fZmlyc3QyID09IF9fbGFzdDIpCisJcmV0dXJuIF9fZmlyc3QxOworCisgICAgICAvLyBUZXN0IGZvciBhIHBhdHRlcm4gb2YgbGVuZ3RoIDEuCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX3AxKF9fZmlyc3QyKTsKKyAgICAgIGlmICgrK19fcDEgPT0gX19sYXN0MikKKwlyZXR1cm4gX0dMSUJDWFhfU1REX0E6OmZpbmQoX19maXJzdDEsIF9fbGFzdDEsICpfX2ZpcnN0Mik7CisKKyAgICAgIC8vIEdlbmVyYWwgY2FzZS4KKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fcDsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IxIF9fY3VycmVudCA9IF9fZmlyc3QxOworCisgICAgICBmb3IgKDs7KQorCXsKKwkgIF9fZmlyc3QxID0gX0dMSUJDWFhfU1REX0E6OmZpbmQoX19maXJzdDEsIF9fbGFzdDEsICpfX2ZpcnN0Mik7CisJICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSkKKwkgICAgcmV0dXJuIF9fbGFzdDE7CisKKwkgIF9fcCA9IF9fcDE7CisJICBfX2N1cnJlbnQgPSBfX2ZpcnN0MTsKKwkgIGlmICgrK19fY3VycmVudCA9PSBfX2xhc3QxKQorCSAgICByZXR1cm4gX19sYXN0MTsKKworCSAgd2hpbGUgKCpfX2N1cnJlbnQgPT0gKl9fcCkKKwkgICAgeworCSAgICAgIGlmICgrK19fcCA9PSBfX2xhc3QyKQorCQlyZXR1cm4gX19maXJzdDE7CisJICAgICAgaWYgKCsrX19jdXJyZW50ID09IF9fbGFzdDEpCisJCXJldHVybiBfX2xhc3QxOworCSAgICB9CisJICArK19fZmlyc3QxOworCX0KKyAgICAgIHJldHVybiBfX2ZpcnN0MTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgU2VhcmNoIGEgc2VxdWVuY2UgZm9yIGEgbWF0Y2hpbmcgc3ViLXNlcXVlbmNlIHVzaW5nIGEgcHJlZGljYXRlLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdDEgICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0MSAgICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0MiAgICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19wcmVkaWNhdGUgIEEgYmluYXJ5IHByZWRpY2F0ZS4KKyAgICogIEByZXR1cm4gICBUaGUgZmlyc3QgaXRlcmF0b3IgQGMgaSBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtfX2ZpcnN0MSxfX2xhc3QxLShfX2xhc3QyLV9fZmlyc3QyKSkgc3VjaCB0aGF0CisgICAqICBAcCBfX3ByZWRpY2F0ZSgqKGkrTiksKihfX2ZpcnN0MitOKSkgaXMgdHJ1ZSBmb3IgZWFjaCBAYyBOIGluIHRoZSByYW5nZQorICAgKiAgQHAgWzAsX19sYXN0Mi1fX2ZpcnN0MiksIG9yIEBwIF9fbGFzdDEgaWYgbm8gc3VjaCBpdGVyYXRvciBleGlzdHMuCisgICAqCisgICAqICBTZWFyY2hlcyB0aGUgcmFuZ2UgQHAgW19fZmlyc3QxLF9fbGFzdDEpIGZvciBhIHN1Yi1zZXF1ZW5jZSB0aGF0CisgICAqICBjb21wYXJlcyBlcXVhbCB2YWx1ZS1ieS12YWx1ZSB3aXRoIHRoZSBzZXF1ZW5jZSBnaXZlbiBieSBAcAorICAgKiAgW19fZmlyc3QyLF9fbGFzdDIpLCB1c2luZyBAcCBfX3ByZWRpY2F0ZSB0byBkZXRlcm1pbmUgZXF1YWxpdHksCisgICAqICBhbmQgcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUKKyAgICogIHN1Yi1zZXF1ZW5jZSwgb3IgQHAgX19sYXN0MSBpZiBubyBzdWNoIGl0ZXJhdG9yIGV4aXN0cy4KKyAgICoKKyAgICogIEBzZWUgc2VhcmNoKF9Gb3J3YXJkSXRlcjEsIF9Gb3J3YXJkSXRlcjEsIF9Gb3J3YXJkSXRlcjIsIF9Gb3J3YXJkSXRlcjIpCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IxLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IxCisgICAgc2VhcmNoKF9Gb3J3YXJkSXRlcmF0b3IxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXJhdG9yMSBfX2xhc3QxLAorCSAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXJhdG9yMiBfX2xhc3QyLAorCSAgIF9CaW5hcnlQcmVkaWNhdGUgIF9fcHJlZGljYXRlKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQmluYXJ5UHJlZGljYXRlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpOworCisgICAgICAvLyBUZXN0IGZvciBlbXB0eSByYW5nZXMKKyAgICAgIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxIHx8IF9fZmlyc3QyID09IF9fbGFzdDIpCisJcmV0dXJuIF9fZmlyc3QxOworCisgICAgICAvLyBUZXN0IGZvciBhIHBhdHRlcm4gb2YgbGVuZ3RoIDEuCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX3AxKF9fZmlyc3QyKTsKKyAgICAgIGlmICgrK19fcDEgPT0gX19sYXN0MikKKwl7CisJICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MQorCQkgJiYgIWJvb2woX19wcmVkaWNhdGUoKl9fZmlyc3QxLCAqX19maXJzdDIpKSkKKwkgICAgKytfX2ZpcnN0MTsKKwkgIHJldHVybiBfX2ZpcnN0MTsKKwl9CisKKyAgICAgIC8vIEdlbmVyYWwgY2FzZS4KKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fcDsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IxIF9fY3VycmVudCA9IF9fZmlyc3QxOworCisgICAgICBmb3IgKDs7KQorCXsKKwkgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxCisJCSAmJiAhYm9vbChfX3ByZWRpY2F0ZSgqX19maXJzdDEsICpfX2ZpcnN0MikpKQorCSAgICArK19fZmlyc3QxOworCSAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEpCisJICAgIHJldHVybiBfX2xhc3QxOworCisJICBfX3AgPSBfX3AxOworCSAgX19jdXJyZW50ID0gX19maXJzdDE7CisJICBpZiAoKytfX2N1cnJlbnQgPT0gX19sYXN0MSkKKwkgICAgcmV0dXJuIF9fbGFzdDE7CisKKwkgIHdoaWxlIChfX3ByZWRpY2F0ZSgqX19jdXJyZW50LCAqX19wKSkKKwkgICAgeworCSAgICAgIGlmICgrK19fcCA9PSBfX2xhc3QyKQorCQlyZXR1cm4gX19maXJzdDE7CisJICAgICAgaWYgKCsrX19jdXJyZW50ID09IF9fbGFzdDEpCisJCXJldHVybiBfX2xhc3QxOworCSAgICB9CisJICArK19fZmlyc3QxOworCX0KKyAgICAgIHJldHVybiBfX2ZpcnN0MTsKKyAgICB9CisKKworICAvKioKKyAgICogIEBicmllZiBTZWFyY2ggYSBzZXF1ZW5jZSBmb3IgYSBudW1iZXIgb2YgY29uc2VjdXRpdmUgdmFsdWVzLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fY291bnQgIFRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgdmFsdWVzLgorICAgKiAgQHBhcmFtICBfX3ZhbCAgICBUaGUgdmFsdWUgdG8gZmluZC4KKyAgICogIEByZXR1cm4gVGhlIGZpcnN0IGl0ZXJhdG9yIEBjIGkgaW4gdGhlIHJhbmdlIEBwCisgICAqICBbX19maXJzdCxfX2xhc3QtX19jb3VudCkgc3VjaCB0aGF0IEBjICooaStOKSA9PSBAcCBfX3ZhbCBmb3IKKyAgICogIGVhY2ggQGMgTiBpbiB0aGUgcmFuZ2UgQHAgWzAsX19jb3VudCksIG9yIEBwIF9fbGFzdCBpZiBubyBzdWNoCisgICAqICBpdGVyYXRvciBleGlzdHMuCisgICAqCisgICAqICBTZWFyY2hlcyB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSBmb3IgQHAgY291bnQgY29uc2VjdXRpdmUgZWxlbWVudHMKKyAgICogIGVxdWFsIHRvIEBwIF9fdmFsLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfSW50ZWdlciwgdHlwZW5hbWUgX1RwPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBzZWFyY2hfbihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCSAgICAgX0ludGVnZXIgX19jb3VudCwgY29uc3QgX1RwJiBfX3ZhbCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9FcXVhbE9wQ29uY2VwdDwKKwl0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUsIF9UcD4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fY291bnQgPD0gMCkKKwlyZXR1cm4gX19maXJzdDsKKyAgICAgIGlmIChfX2NvdW50ID09IDEpCisJcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpmaW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWwpOworICAgICAgcmV0dXJuIHN0ZDo6X19zZWFyY2hfbihfX2ZpcnN0LCBfX2xhc3QsIF9fY291bnQsIF9fdmFsLAorCQkJICAgICBzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdCkpOworICAgIH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmIFNlYXJjaCBhIHNlcXVlbmNlIGZvciBhIG51bWJlciBvZiBjb25zZWN1dGl2ZSB2YWx1ZXMgdXNpbmcgYQorICAgKiAgICAgICAgIHByZWRpY2F0ZS4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICAgICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgICAgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2NvdW50ICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHZhbHVlcy4KKyAgICogIEBwYXJhbSAgX192YWwgICAgICAgICAgVGhlIHZhbHVlIHRvIGZpbmQuCisgICAqICBAcGFyYW0gIF9fYmluYXJ5X3ByZWQgIEEgYmluYXJ5IHByZWRpY2F0ZS4KKyAgICogIEByZXR1cm4gVGhlIGZpcnN0IGl0ZXJhdG9yIEBjIGkgaW4gdGhlIHJhbmdlIEBwCisgICAqICBbX19maXJzdCxfX2xhc3QtX19jb3VudCkgc3VjaCB0aGF0IEBwCisgICAqICBfX2JpbmFyeV9wcmVkKCooaStOKSxfX3ZhbCkgaXMgdHJ1ZSBmb3IgZWFjaCBAYyBOIGluIHRoZSByYW5nZQorICAgKiAgQHAgWzAsX19jb3VudCksIG9yIEBwIF9fbGFzdCBpZiBubyBzdWNoIGl0ZXJhdG9yIGV4aXN0cy4KKyAgICoKKyAgICogIFNlYXJjaGVzIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpIGZvciBAcCBfX2NvdW50CisgICAqICBjb25zZWN1dGl2ZSBlbGVtZW50cyBmb3Igd2hpY2ggdGhlIHByZWRpY2F0ZSByZXR1cm5zIHRydWUuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9JbnRlZ2VyLCB0eXBlbmFtZSBfVHAsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIHNlYXJjaF9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJICAgICBfSW50ZWdlciBfX2NvdW50LCBjb25zdCBfVHAmIF9fdmFsLAorCSAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0JpbmFyeVByZWRpY2F0ZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLCBfVHA+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2NvdW50IDw9IDApCisJcmV0dXJuIF9fZmlyc3Q7CisgICAgICBpZiAoX19jb3VudCA9PSAxKQorCXsKKwkgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiAhYm9vbChfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0LCBfX3ZhbCkpKQorCSAgICArK19fZmlyc3Q7CisJICByZXR1cm4gX19maXJzdDsKKwl9CisgICAgICByZXR1cm4gc3RkOjpfX3NlYXJjaF9uKF9fZmlyc3QsIF9fbGFzdCwgX19jb3VudCwgX192YWwsIF9fYmluYXJ5X3ByZWQsCisJCQkgICAgIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7CisgICAgfQorCisKKyAgLyoqCisgICAqICBAYnJpZWYgUGVyZm9ybSBhbiBvcGVyYXRpb24gb24gYSBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3Jlc3VsdCAgICBBbiBvdXRwdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fdW5hcnlfb3AgIEEgdW5hcnkgb3BlcmF0b3IuCisgICAqICBAcmV0dXJuICAgQW4gb3V0cHV0IGl0ZXJhdG9yIGVxdWFsIHRvIEBwIF9fcmVzdWx0KyhfX2xhc3QtX19maXJzdCkuCisgICAqCisgICAqICBBcHBsaWVzIHRoZSBvcGVyYXRvciB0byBlYWNoIGVsZW1lbnQgaW4gdGhlIGlucHV0IHJhbmdlIGFuZCBhc3NpZ25zCisgICAqICB0aGUgcmVzdWx0cyB0byBzdWNjZXNzaXZlIGVsZW1lbnRzIG9mIHRoZSBvdXRwdXQgc2VxdWVuY2UuCisgICAqICBFdmFsdWF0ZXMgQHAgKihfX3Jlc3VsdCtOKT11bmFyeV9vcCgqKF9fZmlyc3QrTikpIGZvciBlYWNoIEBjIE4gaW4gdGhlCisgICAqICByYW5nZSBAcCBbMCxfX2xhc3QtX19maXJzdCkuCisgICAqCisgICAqICBAcCB1bmFyeV9vcCBtdXN0IG5vdCBhbHRlciBpdHMgYXJndW1lbnQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1VuYXJ5T3BlcmF0aW9uPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHRyYW5zZm9ybShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfVW5hcnlPcGVyYXRpb24gX191bmFyeV9vcCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICAgICAvLyAidGhlIHR5cGUgcmV0dXJuZWQgYnkgYSBfVW5hcnlPcGVyYXRpb24iCisgICAgICAgICAgICBfX3R5cGVvZl9fKF9fdW5hcnlfb3AoKl9fZmlyc3QpKT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICsrX19yZXN1bHQpCisJKl9fcmVzdWx0ID0gX191bmFyeV9vcCgqX19maXJzdCk7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFBlcmZvcm0gYW4gb3BlcmF0aW9uIG9uIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgdHdvIHNlcXVlbmNlcy4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdDEgICAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fZmlyc3QyICAgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19yZXN1bHQgICAgIEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19iaW5hcnlfb3AgIEEgYmluYXJ5IG9wZXJhdG9yLgorICAgKiAgQHJldHVybiAgIEFuIG91dHB1dCBpdGVyYXRvciBlcXVhbCB0byBAcCByZXN1bHQrKGxhc3QtZmlyc3QpLgorICAgKgorICAgKiAgQXBwbGllcyB0aGUgb3BlcmF0b3IgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHR3bworICAgKiAgaW5wdXQgcmFuZ2VzIGFuZCBhc3NpZ25zIHRoZSByZXN1bHRzIHRvIHN1Y2Nlc3NpdmUgZWxlbWVudHMgb2YgdGhlCisgICAqICBvdXRwdXQgc2VxdWVuY2UuCisgICAqICBFdmFsdWF0ZXMgQHAKKyAgICogICooX19yZXN1bHQrTik9X19iaW5hcnlfb3AoKihfX2ZpcnN0MStOKSwqKF9fZmlyc3QyK04pKSBmb3IgZWFjaAorICAgKiAgQGMgTiBpbiB0aGUgcmFuZ2UgQHAgWzAsX19sYXN0MS1fX2ZpcnN0MSkuCisgICAqCisgICAqICBAcCBiaW5hcnlfb3AgbXVzdCBub3QgYWx0ZXIgZWl0aGVyIG9mIGl0cyBhcmd1bWVudHMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICB0cmFuc2Zvcm0oX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkgICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKwkgICAgICBfQmluYXJ5T3BlcmF0aW9uIF9fYmluYXJ5X29wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICAgICAvLyAidGhlIHR5cGUgcmV0dXJuZWQgYnkgYSBfQmluYXJ5T3BlcmF0aW9uIgorICAgICAgICAgICAgX190eXBlb2ZfXyhfX2JpbmFyeV9vcCgqX19maXJzdDEsKl9fZmlyc3QyKSk+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKworICAgICAgZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19maXJzdDEsICsrX19maXJzdDIsICsrX19yZXN1bHQpCisJKl9fcmVzdWx0ID0gX19iaW5hcnlfb3AoKl9fZmlyc3QxLCAqX19maXJzdDIpOworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBSZXBsYWNlIGVhY2ggb2NjdXJyZW5jZSBvZiBvbmUgdmFsdWUgaW4gYSBzZXF1ZW5jZSB3aXRoIGFub3RoZXIKKyAgICogICAgICAgICB2YWx1ZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19vbGRfdmFsdWUgIFRoZSB2YWx1ZSB0byBiZSByZXBsYWNlZC4KKyAgICogIEBwYXJhbSAgX19uZXdfdmFsdWUgIFRoZSByZXBsYWNlbWVudCB2YWx1ZS4KKyAgICogIEByZXR1cm4gICByZXBsYWNlKCkgcmV0dXJucyBubyB2YWx1ZS4KKyAgICoKKyAgICogIEZvciBlYWNoIGl0ZXJhdG9yIEBjIGkgaW4gdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LF9fbGFzdCkgaWYgQGMgKmkgPT0KKyAgICogIEBwIF9fb2xkX3ZhbHVlIHRoZW4gdGhlIGFzc2lnbm1lbnQgQGMgKmkgPSBAcCBfX25ld192YWx1ZSBpcyBwZXJmb3JtZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgcmVwbGFjZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCSAgICBjb25zdCBfVHAmIF9fb2xkX3ZhbHVlLCBjb25zdCBfVHAmIF9fbmV3X3ZhbHVlKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9FcXVhbE9wQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLCBfVHA+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Db252ZXJ0aWJsZUNvbmNlcHQ8X1RwLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCWlmICgqX19maXJzdCA9PSBfX29sZF92YWx1ZSkKKwkgICpfX2ZpcnN0ID0gX19uZXdfdmFsdWU7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFJlcGxhY2UgZWFjaCB2YWx1ZSBpbiBhIHNlcXVlbmNlIGZvciB3aGljaCBhIHByZWRpY2F0ZSByZXR1cm5zCisgICAqICAgICAgICAgdHJ1ZSB3aXRoIGFub3RoZXIgdmFsdWUuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICAgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICAgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcHJlZCAgICAgICBBIHByZWRpY2F0ZS4KKyAgICogIEBwYXJhbSAgX19uZXdfdmFsdWUgIFRoZSByZXBsYWNlbWVudCB2YWx1ZS4KKyAgICogIEByZXR1cm4gICByZXBsYWNlX2lmKCkgcmV0dXJucyBubyB2YWx1ZS4KKyAgICoKKyAgICogIEZvciBlYWNoIGl0ZXJhdG9yIEBjIGkgaW4gdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LF9fbGFzdCkgaWYgQHAgX19wcmVkKCppKQorICAgKiAgaXMgdHJ1ZSB0aGVuIHRoZSBhc3NpZ25tZW50IEBjICppID0gQHAgX19uZXdfdmFsdWUgaXMgcGVyZm9ybWVkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIHJlcGxhY2VfaWYoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsIGNvbnN0IF9UcCYgX19uZXdfdmFsdWUpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVHAsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1VuYXJ5UHJlZGljYXRlQ29uY2VwdDxfUHJlZGljYXRlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCWlmIChfX3ByZWQoKl9fZmlyc3QpKQorCSAgKl9fZmlyc3QgPSBfX25ld192YWx1ZTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQXNzaWduIHRoZSByZXN1bHQgb2YgYSBmdW5jdGlvbiBvYmplY3QgdG8gZWFjaCB2YWx1ZSBpbiBhCisgICAqICAgICAgICAgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2dlbiAgICBBIGZ1bmN0aW9uIG9iamVjdCB0YWtpbmcgbm8gYXJndW1lbnRzIGFuZCByZXR1cm5pbmcKKyAgICogICAgICAgICAgICAgICAgIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisgICAqICBAcmV0dXJuICAgZ2VuZXJhdGUoKSByZXR1cm5zIG5vIHZhbHVlLgorICAgKgorICAgKiAgUGVyZm9ybXMgdGhlIGFzc2lnbm1lbnQgQGMgKmkgPSBAcCBfX2dlbigpIGZvciBlYWNoIEBjIGkgaW4gdGhlIHJhbmdlCisgICAqICBAcCBbX19maXJzdCxfX2xhc3QpLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfR2VuZXJhdG9yPgorICAgIHZvaWQKKyAgICBnZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCSAgICAgX0dlbmVyYXRvciBfX2dlbikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9HZW5lcmF0b3JDb25jZXB0PF9HZW5lcmF0b3IsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJKl9fZmlyc3QgPSBfX2dlbigpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBBc3NpZ24gdGhlIHJlc3VsdCBvZiBhIGZ1bmN0aW9uIG9iamVjdCB0byBlYWNoIHZhbHVlIGluIGEKKyAgICogICAgICAgICBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX24gICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSAgX19nZW4gICAgQSBmdW5jdGlvbiBvYmplY3QgdGFraW5nIG5vIGFyZ3VtZW50cyBhbmQgcmV0dXJuaW5nCisgICAqICAgICAgICAgICAgICAgICBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorICAgKiAgQHJldHVybiAgIFRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLCBAcCBfX2ZpcnN0K19fbgorICAgKgorICAgKiAgUGVyZm9ybXMgdGhlIGFzc2lnbm1lbnQgQGMgKmkgPSBAcCBfX2dlbigpIGZvciBlYWNoIEBjIGkgaW4gdGhlIHJhbmdlCisgICAqICBAcCBbX19maXJzdCxfX2ZpcnN0K19fbikuCisgICAqCisgICAqICBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAqICBEUiA4NjUuIE1vcmUgYWxnb3JpdGhtcyB0aGF0IHRocm93IGF3YXkgaW5mb3JtYXRpb24KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0dlbmVyYXRvcj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBnZW5lcmF0ZV9uKF9PdXRwdXRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24sIF9HZW5lcmF0b3IgX19nZW4pCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgIC8vICJ0aGUgdHlwZSByZXR1cm5lZCBieSBhIF9HZW5lcmF0b3IiCisgICAgICAgICAgICBfX3R5cGVvZl9fKF9fZ2VuKCkpPikKKworICAgICAgZm9yIChfX2RlY2x0eXBlKF9fbiArIDApIF9fbml0ZXIgPSBfX247CisJICAgX19uaXRlciA+IDA7IC0tX19uaXRlciwgKytfX2ZpcnN0KQorCSpfX2ZpcnN0ID0gX19nZW4oKTsKKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmIENvcHkgYSBzZXF1ZW5jZSwgcmVtb3ZpbmcgY29uc2VjdXRpdmUgZHVwbGljYXRlIHZhbHVlcy4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcmVzdWx0ICBBbiBvdXRwdXQgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICAgQW4gaXRlcmF0b3IgZGVzaWduYXRpbmcgdGhlIGVuZCBvZiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlLgorICAgKgorICAgKiAgQ29waWVzIGVhY2ggZWxlbWVudCBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSB0byB0aGUgcmFuZ2UKKyAgICogIGJlZ2lubmluZyBhdCBAcCBfX3Jlc3VsdCwgZXhjZXB0IHRoYXQgb25seSB0aGUgZmlyc3QgZWxlbWVudCBpcyBjb3BpZWQKKyAgICogIGZyb20gZ3JvdXBzIG9mIGNvbnNlY3V0aXZlIGVsZW1lbnRzIHRoYXQgY29tcGFyZSBlcXVhbC4KKyAgICogIHVuaXF1ZV9jb3B5KCkgaXMgc3RhYmxlLCBzbyB0aGUgcmVsYXRpdmUgb3JkZXIgb2YgZWxlbWVudHMgdGhhdCBhcmUKKyAgICogIGNvcGllZCBpcyB1bmNoYW5nZWQuCisgICAqCisgICAqICBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAqICBEUiAyNDEuIERvZXMgdW5pcXVlX2NvcHkoKSByZXF1aXJlIENvcHlDb25zdHJ1Y3RpYmxlIGFuZCBBc3NpZ25hYmxlPworICAgKiAgCisgICAqICBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAqICBEUiA1MzguIDI0MSBhZ2FpbjogRG9lcyB1bmlxdWVfY29weSgpIHJlcXVpcmUgQ29weUNvbnN0cnVjdGlibGUgYW5kIAorICAgKiAgQXNzaWduYWJsZT8KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgdW5pcXVlX2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQlfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRXF1YWxpdHlDb21wYXJhYmxlQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX3Jlc3VsdDsKKyAgICAgIHJldHVybiBzdGQ6Ol9fdW5pcXVlX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwKKwkJCQlzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdCksCisJCQkJc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fcmVzdWx0KSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENvcHkgYSBzZXF1ZW5jZSwgcmVtb3ZpbmcgY29uc2VjdXRpdmUgdmFsdWVzIHVzaW5nIGEgcHJlZGljYXRlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgICAgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgICAgICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcmVzdWx0ICAgICAgIEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19iaW5hcnlfcHJlZCAgQSBiaW5hcnkgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiAgIEFuIGl0ZXJhdG9yIGRlc2lnbmF0aW5nIHRoZSBlbmQgb2YgdGhlIHJlc3VsdGluZyBzZXF1ZW5jZS4KKyAgICoKKyAgICogIENvcGllcyBlYWNoIGVsZW1lbnQgaW4gdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LF9fbGFzdCkgdG8gdGhlIHJhbmdlCisgICAqICBiZWdpbm5pbmcgYXQgQHAgX19yZXN1bHQsIGV4Y2VwdCB0aGF0IG9ubHkgdGhlIGZpcnN0IGVsZW1lbnQgaXMgY29waWVkCisgICAqICBmcm9tIGdyb3VwcyBvZiBjb25zZWN1dGl2ZSBlbGVtZW50cyBmb3Igd2hpY2ggQHAgX19iaW5hcnlfcHJlZCByZXR1cm5zCisgICAqICB0cnVlLgorICAgKiAgdW5pcXVlX2NvcHkoKSBpcyBzdGFibGUsIHNvIHRoZSByZWxhdGl2ZSBvcmRlciBvZiBlbGVtZW50cyB0aGF0IGFyZQorICAgKiAgY29waWVkIGlzIHVuY2hhbmdlZC4KKyAgICoKKyAgICogIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICogIERSIDI0MS4gRG9lcyB1bmlxdWVfY29weSgpIHJlcXVpcmUgQ29weUNvbnN0cnVjdGlibGUgYW5kIEFzc2lnbmFibGU/CisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgdW5pcXVlX2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQlfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisJCV9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cyAtLSBwcmVkaWNhdGVzIGNoZWNrZWQgbGF0ZXIKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIF9fcmVzdWx0OworICAgICAgcmV0dXJuIHN0ZDo6X191bmlxdWVfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfX2JpbmFyeV9wcmVkLAorCQkJCXN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSwKKwkJCQlzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19yZXN1bHQpKTsKKyAgICB9CisKKworICAvKioKKyAgICogIEBicmllZiBSYW5kb21seSBzaHVmZmxlIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgTm90aGluZy4KKyAgICoKKyAgICogIFJlb3JkZXIgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpIHVzaW5nIGEgcmFuZG9tCisgICAqICBkaXN0cmlidXRpb24sIHNvIHRoYXQgZXZlcnkgcG9zc2libGUgb3JkZXJpbmcgb2YgdGhlIHNlcXVlbmNlIGlzCisgICAqICBlcXVhbGx5IGxpa2VseS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgcmFuZG9tX3NodWZmbGUoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorCWZvciAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9faSA9IF9fZmlyc3QgKyAxOyBfX2kgIT0gX19sYXN0OyArK19faSkKKwkgIHN0ZDo6aXRlcl9zd2FwKF9faSwgX19maXJzdCArIChzdGQ6OnJhbmQoKSAlICgoX19pIC0gX19maXJzdCkgKyAxKSkpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBTaHVmZmxlIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHVzaW5nIGEgcmFuZG9tIG51bWJlcgorICAgKiAgICAgICAgIGdlbmVyYXRvci4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19yYW5kICAgIFRoZSBSTkcgZnVuY3RvciBvciBmdW5jdGlvbi4KKyAgICogIEByZXR1cm4gIE5vdGhpbmcuCisgICAqCisgICAqICBSZW9yZGVycyB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LF9fbGFzdCkgdXNpbmcgQHAgX19yYW5kIHRvCisgICAqICBwcm92aWRlIGEgcmFuZG9tIGRpc3RyaWJ1dGlvbi4gQ2FsbGluZyBAcCBfX3JhbmQoTikgZm9yIGEgcG9zaXRpdmUKKyAgICogIGludGVnZXIgQHAgTiBzaG91bGQgcmV0dXJuIGEgcmFuZG9tbHkgY2hvc2VuIGludGVnZXIgZnJvbSB0aGUKKyAgICogIHJhbmdlIFswLE4pLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgdm9pZAorICAgIHJhbmRvbV9zaHVmZmxlKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKwkJICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYmIF9fcmFuZCkKKyNlbHNlCisJCSAgIF9SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fcmFuZCkKKyNlbmRpZgorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm47CisgICAgICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2kgPSBfX2ZpcnN0ICsgMTsgX19pICE9IF9fbGFzdDsgKytfX2kpCisJc3RkOjppdGVyX3N3YXAoX19pLCBfX2ZpcnN0ICsgX19yYW5kKChfX2kgLSBfX2ZpcnN0KSArIDEpKTsKKyAgICB9CisKKworICAvKioKKyAgICogIEBicmllZiBNb3ZlIGVsZW1lbnRzIGZvciB3aGljaCBhIHByZWRpY2F0ZSBpcyB0cnVlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICogICAgICAgICBvZiBhIHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ByZWQgICAgQSBwcmVkaWNhdGUgZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIEBwIG1pZGRsZSBzdWNoIHRoYXQgQHAgX19wcmVkKGkpIGlzIHRydWUgZm9yIGVhY2gKKyAgICogIGl0ZXJhdG9yIEBwIGkgaW4gdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LG1pZGRsZSkgYW5kIGZhbHNlIGZvciBlYWNoIEBwIGkKKyAgICogIGluIHRoZSByYW5nZSBAcCBbbWlkZGxlLF9fbGFzdCkuCisgICAqCisgICAqICBAcCBfX3ByZWQgbXVzdCBub3QgbW9kaWZ5IGl0cyBvcGVyYW5kLiBAcCBwYXJ0aXRpb24oKSBkb2VzIG5vdCBwcmVzZXJ2ZQorICAgKiAgdGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIGVsZW1lbnRzIGluIGVhY2ggZ3JvdXAsIHVzZQorICAgKiAgQHAgc3RhYmxlX3BhcnRpdGlvbigpIGlmIHRoaXMgaXMgbmVlZGVkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBfRm9yd2FyZEl0ZXJhdG9yCisgICAgcGFydGl0aW9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgX1ByZWRpY2F0ZSAgIF9fcHJlZCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfVW5hcnlQcmVkaWNhdGVDb25jZXB0PF9QcmVkaWNhdGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgcmV0dXJuIHN0ZDo6X19wYXJ0aXRpb24oX19maXJzdCwgX19sYXN0LCBfX3ByZWQsCisJCQkgICAgICBzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdCkpOworICAgIH0KKworCisKKyAgLyoqCisgICAqICBAYnJpZWYgU29ydCB0aGUgc21hbGxlc3QgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbWlkZGxlICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gIE5vdGhpbmcuCisgICAqCisgICAqICBTb3J0cyB0aGUgc21hbGxlc3QgQHAgKF9fbWlkZGxlLV9fZmlyc3QpIGVsZW1lbnRzIGluIHRoZSByYW5nZQorICAgKiAgQHAgW2ZpcnN0LGxhc3QpIGFuZCBtb3ZlcyB0aGVtIHRvIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX21pZGRsZSkuIFRoZQorICAgKiAgb3JkZXIgb2YgdGhlIHJlbWFpbmluZyBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgQHAgW19fbWlkZGxlLF9fbGFzdCkgaXMKKyAgICogIHVuZGVmaW5lZC4KKyAgICogIEFmdGVyIHRoZSBzb3J0IGlmIEBlIGkgYW5kIEBlIGogYXJlIGl0ZXJhdG9ycyBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtfX2ZpcnN0LF9fbWlkZGxlKSBzdWNoIHRoYXQgaSBwcmVjZWRlcyBqIGFuZCBAZSBrIGlzIGFuIGl0ZXJhdG9yIGluCisgICAqICB0aGUgcmFuZ2UgQHAgW19fbWlkZGxlLF9fbGFzdCkgdGhlbiAqajwqaSBhbmQgKms8KmkgYXJlIGJvdGggZmFsc2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHBhcnRpYWxfc29ydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX21pZGRsZSwKKwkJIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbWlkZGxlKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX21pZGRsZSwgX19sYXN0KTsKKworICAgICAgc3RkOjpfX2hlYXBfc2VsZWN0KF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QpOworICAgICAgc3RkOjpzb3J0X2hlYXAoX19maXJzdCwgX19taWRkbGUpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBTb3J0IHRoZSBzbWFsbGVzdCBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHVzaW5nIGEgcHJlZGljYXRlCisgICAqICAgICAgICAgZm9yIGNvbXBhcmlzb24uCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX21pZGRsZSAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fY29tcCAgICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIE5vdGhpbmcuCisgICAqCisgICAqICBTb3J0cyB0aGUgc21hbGxlc3QgQHAgKF9fbWlkZGxlLV9fZmlyc3QpIGVsZW1lbnRzIGluIHRoZSByYW5nZQorICAgKiAgQHAgW19fZmlyc3QsX19sYXN0KSBhbmQgbW92ZXMgdGhlbSB0byB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19taWRkbGUpLiBUaGUKKyAgICogIG9yZGVyIG9mIHRoZSByZW1haW5pbmcgZWxlbWVudHMgaW4gdGhlIHJhbmdlIEBwIFtfX21pZGRsZSxfX2xhc3QpIGlzCisgICAqICB1bmRlZmluZWQuCisgICAqICBBZnRlciB0aGUgc29ydCBpZiBAZSBpIGFuZCBAZSBqIGFyZSBpdGVyYXRvcnMgaW4gdGhlIHJhbmdlCisgICAqICBAcCBbX19maXJzdCxfX21pZGRsZSkgc3VjaCB0aGF0IGkgcHJlY2VkZXMgaiBhbmQgQGUgayBpcyBhbiBpdGVyYXRvciBpbgorICAgKiAgdGhlIHJhbmdlIEBwIFtfX21pZGRsZSxfX2xhc3QpIHRoZW4gQHAgKl9fY29tcChqLCppKSBhbmQgQHAgX19jb21wKCprLCppKQorICAgKiAgYXJlIGJvdGggZmFsc2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBwYXJ0aWFsX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19taWRkbGUsCisJCSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCQkgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9WYWx1ZVR5cGUsIF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbWlkZGxlKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX21pZGRsZSwgX19sYXN0KTsKKworICAgICAgc3RkOjpfX2hlYXBfc2VsZWN0KF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsIF9fY29tcCk7CisgICAgICBzdGQ6OnNvcnRfaGVhcChfX2ZpcnN0LCBfX21pZGRsZSwgX19jb21wKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgU29ydCBhIHNlcXVlbmNlIGp1c3QgZW5vdWdoIHRvIGZpbmQgYSBwYXJ0aWN1bGFyIHBvc2l0aW9uLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19udGggICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgTm90aGluZy4KKyAgICoKKyAgICogIFJlYXJyYW5nZXMgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpIHNvIHRoYXQgQHAgKl9fbnRoCisgICAqICBpcyB0aGUgc2FtZSBlbGVtZW50IHRoYXQgd291bGQgaGF2ZSBiZWVuIGluIHRoYXQgcG9zaXRpb24gaGFkIHRoZQorICAgKiAgd2hvbGUgc2VxdWVuY2UgYmVlbiBzb3J0ZWQuIFRoZSBlbGVtZW50cyBlaXRoZXIgc2lkZSBvZiBAcCAqX19udGggYXJlCisgICAqICBub3QgY29tcGxldGVseSBzb3J0ZWQsIGJ1dCBmb3IgYW55IGl0ZXJhdG9yIEBlIGkgaW4gdGhlIHJhbmdlCisgICAqICBAcCBbX19maXJzdCxfX250aCkgYW5kIGFueSBpdGVyYXRvciBAZSBqIGluIHRoZSByYW5nZSBAcCBbX19udGgsX19sYXN0KSBpdAorICAgKiAgaG9sZHMgdGhhdCAqaiA8ICppIGlzIGZhbHNlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICBudGhfZWxlbWVudChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbnRoLAorCQlfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQ8X1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19udGgpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fbnRoLCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QgfHwgX19udGggPT0gX19sYXN0KQorCXJldHVybjsKKworICAgICAgc3RkOjpfX2ludHJvc2VsZWN0KF9fZmlyc3QsIF9fbnRoLCBfX2xhc3QsCisJCQkgc3RkOjpfX2xnKF9fbGFzdCAtIF9fZmlyc3QpICogMik7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFNvcnQgYSBzZXF1ZW5jZSBqdXN0IGVub3VnaCB0byBmaW5kIGEgcGFydGljdWxhciBwb3NpdGlvbgorICAgKiAgICAgICAgIHVzaW5nIGEgcHJlZGljYXRlIGZvciBjb21wYXJpc29uLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19udGggICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2NvbXAgICAgQSBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAcmV0dXJuICBOb3RoaW5nLgorICAgKgorICAgKiAgUmVhcnJhbmdlcyB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LF9fbGFzdCkgc28gdGhhdCBAcCAqX19udGgKKyAgICogIGlzIHRoZSBzYW1lIGVsZW1lbnQgdGhhdCB3b3VsZCBoYXZlIGJlZW4gaW4gdGhhdCBwb3NpdGlvbiBoYWQgdGhlCisgICAqICB3aG9sZSBzZXF1ZW5jZSBiZWVuIHNvcnRlZC4gVGhlIGVsZW1lbnRzIGVpdGhlciBzaWRlIG9mIEBwICpfX250aCBhcmUKKyAgICogIG5vdCBjb21wbGV0ZWx5IHNvcnRlZCwgYnV0IGZvciBhbnkgaXRlcmF0b3IgQGUgaSBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtfX2ZpcnN0LF9fbnRoKSBhbmQgYW55IGl0ZXJhdG9yIEBlIGogaW4gdGhlIHJhbmdlIEBwIFtfX250aCxfX2xhc3QpIGl0CisgICAqICBob2xkcyB0aGF0IEBwIF9fY29tcCgqaiwqaSkgaXMgZmFsc2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBudGhfZWxlbWVudChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbnRoLAorCQlfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9WYWx1ZVR5cGUsIF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbnRoKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX250aCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0IHx8IF9fbnRoID09IF9fbGFzdCkKKwlyZXR1cm47CisKKyAgICAgIHN0ZDo6X19pbnRyb3NlbGVjdChfX2ZpcnN0LCBfX250aCwgX19sYXN0LAorCQkJIHN0ZDo6X19sZyhfX2xhc3QgLSBfX2ZpcnN0KSAqIDIsIF9fY29tcCk7CisgICAgfQorCisKKyAgLyoqCisgICAqICBAYnJpZWYgU29ydCB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgTm90aGluZy4KKyAgICoKKyAgICogIFNvcnRzIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSBpbiBhc2NlbmRpbmcgb3JkZXIsCisgICAqICBzdWNoIHRoYXQgZm9yIGVhY2ggaXRlcmF0b3IgQGUgaSBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0LTEpLCAgCisgICAqICAqKGkrMSk8KmkgaXMgZmFsc2UuCisgICAqCisgICAqICBUaGUgcmVsYXRpdmUgb3JkZXJpbmcgb2YgZXF1aXZhbGVudCBlbGVtZW50cyBpcyBub3QgcHJlc2VydmVkLCB1c2UKKyAgICogIEBwIHN0YWJsZV9zb3J0KCkgaWYgdGhpcyBpcyBuZWVkZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHNvcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICBzdGQ6Ol9faW50cm9zb3J0X2xvb3AoX19maXJzdCwgX19sYXN0LAorCQkJCXN0ZDo6X19sZyhfX2xhc3QgLSBfX2ZpcnN0KSAqIDIpOworCSAgc3RkOjpfX2ZpbmFsX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCk7CisJfQorICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBTb3J0IHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHVzaW5nIGEgcHJlZGljYXRlIGZvciBjb21wYXJpc29uLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fY29tcCAgICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIE5vdGhpbmcuCisgICAqCisgICAqICBTb3J0cyB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LF9fbGFzdCkgaW4gYXNjZW5kaW5nIG9yZGVyLAorICAgKiAgc3VjaCB0aGF0IEBwIF9fY29tcCgqKGkrMSksKmkpIGlzIGZhbHNlIGZvciBldmVyeSBpdGVyYXRvciBAZSBpIGluIHRoZQorICAgKiAgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0LTEpLgorICAgKgorICAgKiAgVGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIGVxdWl2YWxlbnQgZWxlbWVudHMgaXMgbm90IHByZXNlcnZlZCwgdXNlCisgICAqICBAcCBzdGFibGVfc29ydCgpIGlmIHRoaXMgaXMgbmVlZGVkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSB2b2lkCisgICAgc29ydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwgX1ZhbHVlVHlwZSwKKwkJCQkgIF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICBzdGQ6Ol9faW50cm9zb3J0X2xvb3AoX19maXJzdCwgX19sYXN0LAorCQkJCXN0ZDo6X19sZyhfX2xhc3QgLSBfX2ZpcnN0KSAqIDIsIF9fY29tcCk7CisJICBzdGQ6Ol9fZmluYWxfaW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworCX0KKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgTWVyZ2VzIHR3byBzb3J0ZWQgcmFuZ2VzLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QxICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdDEgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QyICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19yZXN1bHQgIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIG1lcmdlZCByYW5nZS4KKyAgICogIEByZXR1cm4gICAgICAgICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudCA8ZW0+bm90IGxlc3MKKyAgICogICAgICAgICAgICAgICAgICB0aGFuPC9lbT4gQGUgdmFsLgorICAgKgorICAgKiAgTWVyZ2VzIHRoZSByYW5nZXMgQHAgW19fZmlyc3QxLF9fbGFzdDEpIGFuZCBAcCBbX19maXJzdDIsX19sYXN0MikgaW50bworICAgKiAgdGhlIHNvcnRlZCByYW5nZSBAcCBbX19yZXN1bHQsIF9fcmVzdWx0ICsgKF9fbGFzdDEtX19maXJzdDEpICsKKyAgICogIChfX2xhc3QyLV9fZmlyc3QyKSkuICBCb3RoIGlucHV0IHJhbmdlcyBtdXN0IGJlIHNvcnRlZCwgYW5kIHRoZQorICAgKiAgb3V0cHV0IHJhbmdlIG11c3Qgbm90IG92ZXJsYXAgd2l0aCBlaXRoZXIgb2YgdGhlIGlucHV0IHJhbmdlcy4KKyAgICogIFRoZSBzb3J0IGlzIEBlIHN0YWJsZSwgdGhhdCBpcywgZm9yIGVxdWl2YWxlbnQgZWxlbWVudHMgaW4gdGhlCisgICAqICB0d28gcmFuZ2VzLCBlbGVtZW50cyBmcm9tIHRoZSBmaXJzdCByYW5nZSB3aWxsIGFsd2F5cyBjb21lCisgICAqICBiZWZvcmUgZWxlbWVudHMgZnJvbSB0aGUgc2Vjb25kLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgbWVyZ2UoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsCisJICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IxPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IyPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUyOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCQkJCSAgX1ZhbHVlVHlwZTE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCQkJCSAgX1ZhbHVlVHlwZTI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbk9wQ29uY2VwdDxfVmFsdWVUeXBlMiwgX1ZhbHVlVHlwZTE+KQkKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0KF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0Mik7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldChfX2ZpcnN0MiwgX19sYXN0MiwgX19maXJzdDEpOworCisgICAgICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKQorCXsKKwkgIGlmICgqX19maXJzdDIgPCAqX19maXJzdDEpCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDI7CisJICAgICAgKytfX2ZpcnN0MjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QxOworCSAgICAgICsrX19maXJzdDE7CisJICAgIH0KKwkgICsrX19yZXN1bHQ7CisJfQorICAgICAgcmV0dXJuIHN0ZDo6Y29weShfX2ZpcnN0MiwgX19sYXN0Miwgc3RkOjpjb3B5KF9fZmlyc3QxLCBfX2xhc3QxLAorCQkJCQkJICAgIF9fcmVzdWx0KSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIE1lcmdlcyB0d28gc29ydGVkIHJhbmdlcy4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fZmlyc3QyICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0MiAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcmVzdWx0ICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSBtZXJnZWQgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fY29tcCAgICBBIGZ1bmN0b3IgdG8gdXNlIGZvciBjb21wYXJpc29ucy4KKyAgICogIEByZXR1cm4gICAgICAgICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudCAibm90IGxlc3MKKyAgICogICAgICAgICAgICAgICAgICB0aGFuIiBAZSB2YWwuCisgICAqCisgICAqICBNZXJnZXMgdGhlIHJhbmdlcyBAcCBbX19maXJzdDEsX19sYXN0MSkgYW5kIEBwIFtfX2ZpcnN0MixfX2xhc3QyKSBpbnRvCisgICAqICB0aGUgc29ydGVkIHJhbmdlIEBwIFtfX3Jlc3VsdCwgX19yZXN1bHQgKyAoX19sYXN0MS1fX2ZpcnN0MSkgKworICAgKiAgKF9fbGFzdDItX19maXJzdDIpKS4gIEJvdGggaW5wdXQgcmFuZ2VzIG11c3QgYmUgc29ydGVkLCBhbmQgdGhlCisgICAqICBvdXRwdXQgcmFuZ2UgbXVzdCBub3Qgb3ZlcmxhcCB3aXRoIGVpdGhlciBvZiB0aGUgaW5wdXQgcmFuZ2VzLgorICAgKiAgVGhlIHNvcnQgaXMgQGUgc3RhYmxlLCB0aGF0IGlzLCBmb3IgZXF1aXZhbGVudCBlbGVtZW50cyBpbiB0aGUKKyAgICogIHR3byByYW5nZXMsIGVsZW1lbnRzIGZyb20gdGhlIGZpcnN0IHJhbmdlIHdpbGwgYWx3YXlzIGNvbWUKKyAgICogIGJlZm9yZSBlbGVtZW50cyBmcm9tIHRoZSBzZWNvbmQuCisgICAqCisgICAqICBUaGUgY29tcGFyaXNvbiBmdW5jdGlvbiBzaG91bGQgaGF2ZSB0aGUgc2FtZSBlZmZlY3RzIG9uIG9yZGVyaW5nIGFzCisgICAqICB0aGUgZnVuY3Rpb24gdXNlZCBmb3IgdGhlIGluaXRpYWwgc29ydC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBtZXJnZShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCSAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwKKwkgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMjsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9WYWx1ZVR5cGUyLCBfVmFsdWVUeXBlMT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldF9wcmVkKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19jb21wKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0X3ByZWQoX19maXJzdDIsIF9fbGFzdDIsIF9fZmlyc3QxLCBfX2NvbXApOworCisgICAgICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKQorCXsKKwkgIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKQorCSAgICB7CisJICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QyOworCSAgICAgICsrX19maXJzdDI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKwkgICAgICArK19fZmlyc3QxOworCSAgICB9CisJICArK19fcmVzdWx0OworCX0KKyAgICAgIHJldHVybiBzdGQ6OmNvcHkoX19maXJzdDIsIF9fbGFzdDIsIHN0ZDo6Y29weShfX2ZpcnN0MSwgX19sYXN0MSwKKwkJCQkJCSAgICBfX3Jlc3VsdCkpOworICAgIH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmIFNvcnQgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UsIHByZXNlcnZpbmcgdGhlIHJlbGF0aXZlIG9yZGVyCisgICAqICAgICAgICAgb2YgZXF1aXZhbGVudCBlbGVtZW50cy4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgTm90aGluZy4KKyAgICoKKyAgICogIFNvcnRzIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSBpbiBhc2NlbmRpbmcgb3JkZXIsCisgICAqICBzdWNoIHRoYXQgZm9yIGVhY2ggaXRlcmF0b3IgQHAgaSBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0LTEpLAorICAgKiAgQHAgKihpKzEpPCppIGlzIGZhbHNlLgorICAgKgorICAgKiAgVGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIGVxdWl2YWxlbnQgZWxlbWVudHMgaXMgcHJlc2VydmVkLCBzbyBhbnkgdHdvCisgICAqICBlbGVtZW50cyBAcCB4IGFuZCBAcCB5IGluIHRoZSByYW5nZSBAcCBbX19maXJzdCxfX2xhc3QpIHN1Y2ggdGhhdAorICAgKiAgQHAgeDx5IGlzIGZhbHNlIGFuZCBAcCB5PHggaXMgZmFsc2Ugd2lsbCBoYXZlIHRoZSBzYW1lIHJlbGF0aXZlCisgICAqICBvcmRlcmluZyBhZnRlciBjYWxsaW5nIEBwIHN0YWJsZV9zb3J0KCkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN0YWJsZV9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJX0Rpc3RhbmNlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQ8X1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgX1RlbXBvcmFyeV9idWZmZXI8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVmFsdWVUeXBlPiBfX2J1ZihfX2ZpcnN0LAorCQkJCQkJCQkgX19sYXN0KTsKKyAgICAgIGlmIChfX2J1Zi5iZWdpbigpID09IDApCisJc3RkOjpfX2lucGxhY2Vfc3RhYmxlX3NvcnQoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIGVsc2UKKwlzdGQ6Ol9fc3RhYmxlX3NvcnRfYWRhcHRpdmUoX19maXJzdCwgX19sYXN0LCBfX2J1Zi5iZWdpbigpLAorCQkJCSAgICBfRGlzdGFuY2VUeXBlKF9fYnVmLnNpemUoKSkpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBTb3J0IHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHVzaW5nIGEgcHJlZGljYXRlIGZvciBjb21wYXJpc29uLAorICAgKiAgICAgICAgIHByZXNlcnZpbmcgdGhlIHJlbGF0aXZlIG9yZGVyIG9mIGVxdWl2YWxlbnQgZWxlbWVudHMuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19jb21wICAgIEEgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHJldHVybiAgTm90aGluZy4KKyAgICoKKyAgICogIFNvcnRzIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0KSBpbiBhc2NlbmRpbmcgb3JkZXIsCisgICAqICBzdWNoIHRoYXQgZm9yIGVhY2ggaXRlcmF0b3IgQHAgaSBpbiB0aGUgcmFuZ2UgQHAgW19fZmlyc3QsX19sYXN0LTEpLAorICAgKiAgQHAgX19jb21wKCooaSsxKSwqaSkgaXMgZmFsc2UuCisgICAqCisgICAqICBUaGUgcmVsYXRpdmUgb3JkZXJpbmcgb2YgZXF1aXZhbGVudCBlbGVtZW50cyBpcyBwcmVzZXJ2ZWQsIHNvIGFueSB0d28KKyAgICogIGVsZW1lbnRzIEBwIHggYW5kIEBwIHkgaW4gdGhlIHJhbmdlIEBwIFtfX2ZpcnN0LF9fbGFzdCkgc3VjaCB0aGF0CisgICAqICBAcCBfX2NvbXAoeCx5KSBpcyBmYWxzZSBhbmQgQHAgX19jb21wKHkseCkgaXMgZmFsc2Ugd2lsbCBoYXZlIHRoZSBzYW1lCisgICAqICByZWxhdGl2ZSBvcmRlcmluZyBhZnRlciBjYWxsaW5nIEBwIHN0YWJsZV9zb3J0KCkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBzdGFibGVfc29ydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkJX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJX0Rpc3RhbmNlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfVmFsdWVUeXBlLAorCQkJCSAgX1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgX1RlbXBvcmFyeV9idWZmZXI8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVmFsdWVUeXBlPiBfX2J1ZihfX2ZpcnN0LAorCQkJCQkJCQkgX19sYXN0KTsKKyAgICAgIGlmIChfX2J1Zi5iZWdpbigpID09IDApCisJc3RkOjpfX2lucGxhY2Vfc3RhYmxlX3NvcnQoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworICAgICAgZWxzZQorCXN0ZDo6X19zdGFibGVfc29ydF9hZGFwdGl2ZShfX2ZpcnN0LCBfX2xhc3QsIF9fYnVmLmJlZ2luKCksCisJCQkJICAgIF9EaXN0YW5jZVR5cGUoX19idWYuc2l6ZSgpKSwgX19jb21wKTsKKyAgICB9CisKKworICAvKioKKyAgICogIEBicmllZiBSZXR1cm4gdGhlIHVuaW9uIG9mIHR3byBzb3J0ZWQgcmFuZ2VzLgorICAgKiAgQGluZ3JvdXAgc2V0X2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdDEgIFN0YXJ0IG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgRW5kIG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgU3RhcnQgb2Ygc2Vjb25kIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QyICAgRW5kIG9mIHNlY29uZCByYW5nZS4KKyAgICogIEByZXR1cm4gIEVuZCBvZiB0aGUgb3V0cHV0IHJhbmdlLgorICAgKiAgQGluZ3JvdXAgc2V0X2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoaXMgb3BlcmF0aW9uIGl0ZXJhdGVzIG92ZXIgYm90aCByYW5nZXMsIGNvcHlpbmcgZWxlbWVudHMgcHJlc2VudCBpbgorICAgKiAgZWFjaCByYW5nZSBpbiBvcmRlciB0byB0aGUgb3V0cHV0IHJhbmdlLiAgSXRlcmF0b3JzIGluY3JlbWVudCBmb3IgZWFjaAorICAgKiAgcmFuZ2UuICBXaGVuIHRoZSBjdXJyZW50IGVsZW1lbnQgb2Ygb25lIHJhbmdlIGlzIGxlc3MgdGhhbiB0aGUgb3RoZXIsCisgICAqICB0aGF0IGVsZW1lbnQgaXMgY29waWVkIGFuZCB0aGUgaXRlcmF0b3IgYWR2YW5jZWQuICBJZiBhbiBlbGVtZW50IGlzCisgICAqICBjb250YWluZWQgaW4gYm90aCByYW5nZXMsIHRoZSBlbGVtZW50IGZyb20gdGhlIGZpcnN0IHJhbmdlIGlzIGNvcGllZCBhbmQKKyAgICogIGJvdGggcmFuZ2VzIGFkdmFuY2UuICBUaGUgb3V0cHV0IHJhbmdlIG1heSBub3Qgb3ZlcmxhcCBlaXRoZXIgaW5wdXQKKyAgICogIHJhbmdlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgc2V0X3VuaW9uKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJICAgICAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwKKwkgICAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IxPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IyPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUyOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCQkJCSAgX1ZhbHVlVHlwZTE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCQkJCSAgX1ZhbHVlVHlwZTI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbk9wQ29uY2VwdDxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbk9wQ29uY2VwdDxfVmFsdWVUeXBlMiwgX1ZhbHVlVHlwZTE+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0KF9fZmlyc3QyLCBfX2xhc3QyLCBfX2ZpcnN0MSk7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJeworCSAgaWYgKCpfX2ZpcnN0MSA8ICpfX2ZpcnN0MikKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKwkgICAgICArK19fZmlyc3QxOworCSAgICB9CisJICBlbHNlIGlmICgqX19maXJzdDIgPCAqX19maXJzdDEpCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDI7CisJICAgICAgKytfX2ZpcnN0MjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QxOworCSAgICAgICsrX19maXJzdDE7CisJICAgICAgKytfX2ZpcnN0MjsKKwkgICAgfQorCSAgKytfX3Jlc3VsdDsKKwl9CisgICAgICByZXR1cm4gc3RkOjpjb3B5KF9fZmlyc3QyLCBfX2xhc3QyLCBzdGQ6OmNvcHkoX19maXJzdDEsIF9fbGFzdDEsCisJCQkJCQkgICAgX19yZXN1bHQpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgUmV0dXJuIHRoZSB1bmlvbiBvZiB0d28gc29ydGVkIHJhbmdlcyB1c2luZyBhIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEBpbmdyb3VwIHNldF9hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QxICBTdGFydCBvZiBmaXJzdCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19sYXN0MSAgIEVuZCBvZiBmaXJzdCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgIFN0YXJ0IG9mIHNlY29uZCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19sYXN0MiAgIEVuZCBvZiBzZWNvbmQgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fY29tcCAgICBUaGUgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHJldHVybiAgRW5kIG9mIHRoZSBvdXRwdXQgcmFuZ2UuCisgICAqICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gaXRlcmF0ZXMgb3ZlciBib3RoIHJhbmdlcywgY29weWluZyBlbGVtZW50cyBwcmVzZW50IGluCisgICAqICBlYWNoIHJhbmdlIGluIG9yZGVyIHRvIHRoZSBvdXRwdXQgcmFuZ2UuICBJdGVyYXRvcnMgaW5jcmVtZW50IGZvciBlYWNoCisgICAqICByYW5nZS4gIFdoZW4gdGhlIGN1cnJlbnQgZWxlbWVudCBvZiBvbmUgcmFuZ2UgaXMgbGVzcyB0aGFuIHRoZSBvdGhlcgorICAgKiAgYWNjb3JkaW5nIHRvIEBwIF9fY29tcCwgdGhhdCBlbGVtZW50IGlzIGNvcGllZCBhbmQgdGhlIGl0ZXJhdG9yIGFkdmFuY2VkLgorICAgKiAgSWYgYW4gZXF1aXZhbGVudCBlbGVtZW50IGFjY29yZGluZyB0byBAcCBfX2NvbXAgaXMgY29udGFpbmVkIGluIGJvdGgKKyAgICogIHJhbmdlcywgdGhlIGVsZW1lbnQgZnJvbSB0aGUgZmlyc3QgcmFuZ2UgaXMgY29waWVkIGFuZCBib3RoIHJhbmdlcworICAgKiAgYWR2YW5jZS4gIFRoZSBvdXRwdXQgcmFuZ2UgbWF5IG5vdCBvdmVybGFwIGVpdGhlciBpbnB1dCByYW5nZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBzZXRfdW5pb24oX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkgICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorCSAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMjsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfVmFsdWVUeXBlMiwgX1ZhbHVlVHlwZTE+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXRfcHJlZChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fY29tcCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldF9wcmVkKF9fZmlyc3QyLCBfX2xhc3QyLCBfX2ZpcnN0MSwgX19jb21wKTsKKworICAgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwl7CisJICBpZiAoX19jb21wKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKwkgICAgICArK19fZmlyc3QxOworCSAgICB9CisJICBlbHNlIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKQorCSAgICB7CisJICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QyOworCSAgICAgICsrX19maXJzdDI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKwkgICAgICArK19fZmlyc3QxOworCSAgICAgICsrX19maXJzdDI7CisJICAgIH0KKwkgICsrX19yZXN1bHQ7CisJfQorICAgICAgcmV0dXJuIHN0ZDo6Y29weShfX2ZpcnN0MiwgX19sYXN0Miwgc3RkOjpjb3B5KF9fZmlyc3QxLCBfX2xhc3QxLAorCQkJCQkJICAgIF9fcmVzdWx0KSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFJldHVybiB0aGUgaW50ZXJzZWN0aW9uIG9mIHR3byBzb3J0ZWQgcmFuZ2VzLgorICAgKiAgQGluZ3JvdXAgc2V0X2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdDEgIFN0YXJ0IG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgRW5kIG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgU3RhcnQgb2Ygc2Vjb25kIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QyICAgRW5kIG9mIHNlY29uZCByYW5nZS4KKyAgICogIEByZXR1cm4gIEVuZCBvZiB0aGUgb3V0cHV0IHJhbmdlLgorICAgKiAgQGluZ3JvdXAgc2V0X2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoaXMgb3BlcmF0aW9uIGl0ZXJhdGVzIG92ZXIgYm90aCByYW5nZXMsIGNvcHlpbmcgZWxlbWVudHMgcHJlc2VudCBpbgorICAgKiAgYm90aCByYW5nZXMgaW4gb3JkZXIgdG8gdGhlIG91dHB1dCByYW5nZS4gIEl0ZXJhdG9ycyBpbmNyZW1lbnQgZm9yIGVhY2gKKyAgICogIHJhbmdlLiAgV2hlbiB0aGUgY3VycmVudCBlbGVtZW50IG9mIG9uZSByYW5nZSBpcyBsZXNzIHRoYW4gdGhlIG90aGVyLAorICAgKiAgdGhhdCBpdGVyYXRvciBhZHZhbmNlcy4gIElmIGFuIGVsZW1lbnQgaXMgY29udGFpbmVkIGluIGJvdGggcmFuZ2VzLCB0aGUKKyAgICogIGVsZW1lbnQgZnJvbSB0aGUgZmlyc3QgcmFuZ2UgaXMgY29waWVkIGFuZCBib3RoIHJhbmdlcyBhZHZhbmNlLiAgVGhlCisgICAqICBvdXRwdXQgcmFuZ2UgbWF5IG5vdCBvdmVybGFwIGVpdGhlciBpbnB1dCByYW5nZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHNldF9pbnRlcnNlY3Rpb24oX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkJICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorCQkgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTI7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICBfVmFsdWVUeXBlMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9WYWx1ZVR5cGUyLCBfVmFsdWVUeXBlMT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXQoX19maXJzdDIsIF9fbGFzdDIsIF9fZmlyc3QxKTsKKworICAgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwlpZiAoKl9fZmlyc3QxIDwgKl9fZmlyc3QyKQorCSAgKytfX2ZpcnN0MTsKKwllbHNlIGlmICgqX19maXJzdDIgPCAqX19maXJzdDEpCisJICArK19fZmlyc3QyOworCWVsc2UKKwkgIHsKKwkgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QxOworCSAgICArK19fZmlyc3QxOworCSAgICArK19fZmlyc3QyOworCSAgICArK19fcmVzdWx0OworCSAgfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBSZXR1cm4gdGhlIGludGVyc2VjdGlvbiBvZiB0d28gc29ydGVkIHJhbmdlcyB1c2luZyBjb21wYXJpc29uCisgICAqICBmdW5jdG9yLgorICAgKiAgQGluZ3JvdXAgc2V0X2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdDEgIFN0YXJ0IG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgRW5kIG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgU3RhcnQgb2Ygc2Vjb25kIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QyICAgRW5kIG9mIHNlY29uZCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19jb21wICAgIFRoZSBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAcmV0dXJuICBFbmQgb2YgdGhlIG91dHB1dCByYW5nZS4KKyAgICogIEBpbmdyb3VwIHNldF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIG9wZXJhdGlvbiBpdGVyYXRlcyBvdmVyIGJvdGggcmFuZ2VzLCBjb3B5aW5nIGVsZW1lbnRzIHByZXNlbnQgaW4KKyAgICogIGJvdGggcmFuZ2VzIGluIG9yZGVyIHRvIHRoZSBvdXRwdXQgcmFuZ2UuICBJdGVyYXRvcnMgaW5jcmVtZW50IGZvciBlYWNoCisgICAqICByYW5nZS4gIFdoZW4gdGhlIGN1cnJlbnQgZWxlbWVudCBvZiBvbmUgcmFuZ2UgaXMgbGVzcyB0aGFuIHRoZSBvdGhlcgorICAgKiAgYWNjb3JkaW5nIHRvIEBwIF9fY29tcCwgdGhhdCBpdGVyYXRvciBhZHZhbmNlcy4gIElmIGFuIGVsZW1lbnQgaXMKKyAgICogIGNvbnRhaW5lZCBpbiBib3RoIHJhbmdlcyBhY2NvcmRpbmcgdG8gQHAgX19jb21wLCB0aGUgZWxlbWVudCBmcm9tIHRoZQorICAgKiAgZmlyc3QgcmFuZ2UgaXMgY29waWVkIGFuZCBib3RoIHJhbmdlcyBhZHZhbmNlLiAgVGhlIG91dHB1dCByYW5nZSBtYXkgbm90CisgICAqICBvdmVybGFwIGVpdGhlciBpbnB1dCByYW5nZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBzZXRfaW50ZXJzZWN0aW9uKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJCSAgICAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwKKwkJICAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTI7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICBfVmFsdWVUeXBlMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCQkJCSAgX1ZhbHVlVHlwZTIsIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0X3ByZWQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2NvbXApOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXRfcHJlZChfX2ZpcnN0MiwgX19sYXN0MiwgX19maXJzdDEsIF9fY29tcCk7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJaWYgKF9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MikpCisJICArK19fZmlyc3QxOworCWVsc2UgaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpCisJICArK19fZmlyc3QyOworCWVsc2UKKwkgIHsKKwkgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QxOworCSAgICArK19fZmlyc3QxOworCSAgICArK19fZmlyc3QyOworCSAgICArK19fcmVzdWx0OworCSAgfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBSZXR1cm4gdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHNvcnRlZCByYW5nZXMuCisgICAqICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgU3RhcnQgb2YgZmlyc3QgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdDEgICBFbmQgb2YgZmlyc3QgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fZmlyc3QyICBTdGFydCBvZiBzZWNvbmQgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdDIgICBFbmQgb2Ygc2Vjb25kIHJhbmdlLgorICAgKiAgQHJldHVybiAgRW5kIG9mIHRoZSBvdXRwdXQgcmFuZ2UuCisgICAqICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gaXRlcmF0ZXMgb3ZlciBib3RoIHJhbmdlcywgY29weWluZyBlbGVtZW50cyBwcmVzZW50IGluCisgICAqICB0aGUgZmlyc3QgcmFuZ2UgYnV0IG5vdCB0aGUgc2Vjb25kIGluIG9yZGVyIHRvIHRoZSBvdXRwdXQgcmFuZ2UuCisgICAqICBJdGVyYXRvcnMgaW5jcmVtZW50IGZvciBlYWNoIHJhbmdlLiAgV2hlbiB0aGUgY3VycmVudCBlbGVtZW50IG9mIHRoZQorICAgKiAgZmlyc3QgcmFuZ2UgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQsIHRoYXQgZWxlbWVudCBpcyBjb3BpZWQgYW5kIHRoZQorICAgKiAgaXRlcmF0b3IgYWR2YW5jZXMuICBJZiB0aGUgY3VycmVudCBlbGVtZW50IG9mIHRoZSBzZWNvbmQgcmFuZ2UgaXMgbGVzcywKKyAgICogIHRoZSBpdGVyYXRvciBhZHZhbmNlcywgYnV0IG5vIGVsZW1lbnQgaXMgY29waWVkLiAgSWYgYW4gZWxlbWVudCBpcworICAgKiAgY29udGFpbmVkIGluIGJvdGggcmFuZ2VzLCBubyBlbGVtZW50cyBhcmUgY29waWVkIGFuZCBib3RoIHJhbmdlcworICAgKiAgYWR2YW5jZS4gIFRoZSBvdXRwdXQgcmFuZ2UgbWF5IG5vdCBvdmVybGFwIGVpdGhlciBpbnB1dCByYW5nZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHNldF9kaWZmZXJlbmNlKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJCSAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsCisJCSAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTI7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICBfVmFsdWVUeXBlMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9WYWx1ZVR5cGUyLCBfVmFsdWVUeXBlMT4pCQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0KF9fZmlyc3QyLCBfX2xhc3QyLCBfX2ZpcnN0MSk7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJaWYgKCpfX2ZpcnN0MSA8ICpfX2ZpcnN0MikKKwkgIHsKKwkgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QxOworCSAgICArK19fZmlyc3QxOworCSAgICArK19fcmVzdWx0OworCSAgfQorCWVsc2UgaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkKKwkgICsrX19maXJzdDI7CisJZWxzZQorCSAgeworCSAgICArK19fZmlyc3QxOworCSAgICArK19fZmlyc3QyOworCSAgfQorICAgICAgcmV0dXJuIHN0ZDo6Y29weShfX2ZpcnN0MSwgX19sYXN0MSwgX19yZXN1bHQpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzb3J0ZWQgcmFuZ2VzIHVzaW5nIGNvbXBhcmlzb24KKyAgICogIGZ1bmN0b3IuCisgICAqICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgU3RhcnQgb2YgZmlyc3QgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdDEgICBFbmQgb2YgZmlyc3QgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fZmlyc3QyICBTdGFydCBvZiBzZWNvbmQgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdDIgICBFbmQgb2Ygc2Vjb25kIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2NvbXAgICAgVGhlIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIEVuZCBvZiB0aGUgb3V0cHV0IHJhbmdlLgorICAgKiAgQGluZ3JvdXAgc2V0X2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoaXMgb3BlcmF0aW9uIGl0ZXJhdGVzIG92ZXIgYm90aCByYW5nZXMsIGNvcHlpbmcgZWxlbWVudHMgcHJlc2VudCBpbgorICAgKiAgdGhlIGZpcnN0IHJhbmdlIGJ1dCBub3QgdGhlIHNlY29uZCBpbiBvcmRlciB0byB0aGUgb3V0cHV0IHJhbmdlLgorICAgKiAgSXRlcmF0b3JzIGluY3JlbWVudCBmb3IgZWFjaCByYW5nZS4gIFdoZW4gdGhlIGN1cnJlbnQgZWxlbWVudCBvZiB0aGUKKyAgICogIGZpcnN0IHJhbmdlIGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kIGFjY29yZGluZyB0byBAcCBfX2NvbXAsIHRoYXQgZWxlbWVudAorICAgKiAgaXMgY29waWVkIGFuZCB0aGUgaXRlcmF0b3IgYWR2YW5jZXMuICBJZiB0aGUgY3VycmVudCBlbGVtZW50IG9mIHRoZQorICAgKiAgc2Vjb25kIHJhbmdlIGlzIGxlc3MsIG5vIGVsZW1lbnQgaXMgY29waWVkIGFuZCB0aGUgaXRlcmF0b3IgYWR2YW5jZXMuCisgICAqICBJZiBhbiBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbiBib3RoIHJhbmdlcyBhY2NvcmRpbmcgdG8gQHAgX19jb21wLCBubworICAgKiAgZWxlbWVudHMgYXJlIGNvcGllZCBhbmQgYm90aCByYW5nZXMgYWR2YW5jZS4gIFRoZSBvdXRwdXQgcmFuZ2UgbWF5IG5vdAorICAgKiAgb3ZlcmxhcCBlaXRoZXIgaW5wdXQgcmFuZ2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgc2V0X2RpZmZlcmVuY2UoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkJICAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwKKwkJICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IxPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IyPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUyOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCQkJCSAgX1ZhbHVlVHlwZTE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCQkJCSAgX1ZhbHVlVHlwZTEsIF9WYWx1ZVR5cGUyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9WYWx1ZVR5cGUyLCBfVmFsdWVUeXBlMT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldF9wcmVkKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19jb21wKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0X3ByZWQoX19maXJzdDIsIF9fbGFzdDIsIF9fZmlyc3QxLCBfX2NvbXApOworCisgICAgICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKQorCWlmIChfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpKQorCSAgeworCSAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CisJICAgICsrX19maXJzdDE7CisJICAgICsrX19yZXN1bHQ7CisJICB9CisJZWxzZSBpZiAoX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSkKKwkgICsrX19maXJzdDI7CisJZWxzZQorCSAgeworCSAgICArK19fZmlyc3QxOworCSAgICArK19fZmlyc3QyOworCSAgfQorICAgICAgcmV0dXJuIHN0ZDo6Y29weShfX2ZpcnN0MSwgX19sYXN0MSwgX19yZXN1bHQpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZSBvZiB0d28gc29ydGVkIHJhbmdlcy4KKyAgICogIEBpbmdyb3VwIHNldF9hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QxICBTdGFydCBvZiBmaXJzdCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19sYXN0MSAgIEVuZCBvZiBmaXJzdCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgIFN0YXJ0IG9mIHNlY29uZCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19sYXN0MiAgIEVuZCBvZiBzZWNvbmQgcmFuZ2UuCisgICAqICBAcmV0dXJuICBFbmQgb2YgdGhlIG91dHB1dCByYW5nZS4KKyAgICogIEBpbmdyb3VwIHNldF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIG9wZXJhdGlvbiBpdGVyYXRlcyBvdmVyIGJvdGggcmFuZ2VzLCBjb3B5aW5nIGVsZW1lbnRzIHByZXNlbnQgaW4KKyAgICogIG9uZSByYW5nZSBidXQgbm90IHRoZSBvdGhlciBpbiBvcmRlciB0byB0aGUgb3V0cHV0IHJhbmdlLiAgSXRlcmF0b3JzCisgICAqICBpbmNyZW1lbnQgZm9yIGVhY2ggcmFuZ2UuICBXaGVuIHRoZSBjdXJyZW50IGVsZW1lbnQgb2Ygb25lIHJhbmdlIGlzIGxlc3MKKyAgICogIHRoYW4gdGhlIG90aGVyLCB0aGF0IGVsZW1lbnQgaXMgY29waWVkIGFuZCB0aGUgaXRlcmF0b3IgYWR2YW5jZXMuICBJZiBhbgorICAgKiAgZWxlbWVudCBpcyBjb250YWluZWQgaW4gYm90aCByYW5nZXMsIG5vIGVsZW1lbnRzIGFyZSBjb3BpZWQgYW5kIGJvdGgKKyAgICogIHJhbmdlcyBhZHZhbmNlLiAgVGhlIG91dHB1dCByYW5nZSBtYXkgbm90IG92ZXJsYXAgZWl0aGVyIGlucHV0IHJhbmdlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJCQkgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsCisJCQkgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTI7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICBfVmFsdWVUeXBlMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICBfVmFsdWVUeXBlMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9WYWx1ZVR5cGUyLCBfVmFsdWVUeXBlMT4pCQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0KF9fZmlyc3QyLCBfX2xhc3QyLCBfX2ZpcnN0MSk7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJaWYgKCpfX2ZpcnN0MSA8ICpfX2ZpcnN0MikKKwkgIHsKKwkgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QxOworCSAgICArK19fZmlyc3QxOworCSAgICArK19fcmVzdWx0OworCSAgfQorCWVsc2UgaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkKKwkgIHsKKwkgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QyOworCSAgICArK19fZmlyc3QyOworCSAgICArK19fcmVzdWx0OworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgKytfX2ZpcnN0MTsKKwkgICAgKytfX2ZpcnN0MjsKKwkgIH0KKyAgICAgIHJldHVybiBzdGQ6OmNvcHkoX19maXJzdDIsIF9fbGFzdDIsIHN0ZDo6Y29weShfX2ZpcnN0MSwKKwkJCQkJCSAgICBfX2xhc3QxLCBfX3Jlc3VsdCkpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZSBvZiB0d28gc29ydGVkIHJhbmdlcyB1c2luZworICAgKiAgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQGluZ3JvdXAgc2V0X2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdDEgIFN0YXJ0IG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgRW5kIG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgU3RhcnQgb2Ygc2Vjb25kIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QyICAgRW5kIG9mIHNlY29uZCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19jb21wICAgIFRoZSBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAcmV0dXJuICBFbmQgb2YgdGhlIG91dHB1dCByYW5nZS4KKyAgICogIEBpbmdyb3VwIHNldF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIG9wZXJhdGlvbiBpdGVyYXRlcyBvdmVyIGJvdGggcmFuZ2VzLCBjb3B5aW5nIGVsZW1lbnRzIHByZXNlbnQgaW4KKyAgICogIG9uZSByYW5nZSBidXQgbm90IHRoZSBvdGhlciBpbiBvcmRlciB0byB0aGUgb3V0cHV0IHJhbmdlLiAgSXRlcmF0b3JzCisgICAqICBpbmNyZW1lbnQgZm9yIGVhY2ggcmFuZ2UuICBXaGVuIHRoZSBjdXJyZW50IGVsZW1lbnQgb2Ygb25lIHJhbmdlIGlzIGxlc3MKKyAgICogIHRoYW4gdGhlIG90aGVyIGFjY29yZGluZyB0byBAcCBjb21wLCB0aGF0IGVsZW1lbnQgaXMgY29waWVkIGFuZCB0aGUKKyAgICogIGl0ZXJhdG9yIGFkdmFuY2VzLiAgSWYgYW4gZWxlbWVudCBpcyBjb250YWluZWQgaW4gYm90aCByYW5nZXMgYWNjb3JkaW5nCisgICAqICB0byBAcCBfX2NvbXAsIG5vIGVsZW1lbnRzIGFyZSBjb3BpZWQgYW5kIGJvdGggcmFuZ2VzIGFkdmFuY2UuICBUaGUgb3V0cHV0CisgICAqICByYW5nZSBtYXkgbm90IG92ZXJsYXAgZWl0aGVyIGlucHV0IHJhbmdlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCQkJICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorCQkJICAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisJCQkgICAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTI7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICBfVmFsdWVUeXBlMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICBfVmFsdWVUeXBlMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCQkJCSAgX1ZhbHVlVHlwZTIsIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0X3ByZWQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2NvbXApOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXRfcHJlZChfX2ZpcnN0MiwgX19sYXN0MiwgX19maXJzdDEsIF9fY29tcCk7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJaWYgKF9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MikpCisJICB7CisJICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKwkgICAgKytfX2ZpcnN0MTsKKwkgICAgKytfX3Jlc3VsdDsKKwkgIH0KKwllbHNlIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKQorCSAgeworCSAgICAqX19yZXN1bHQgPSAqX19maXJzdDI7CisJICAgICsrX19maXJzdDI7CisJICAgICsrX19yZXN1bHQ7CisJICB9CisJZWxzZQorCSAgeworCSAgICArK19fZmlyc3QxOworCSAgICArK19fZmlyc3QyOworCSAgfQorICAgICAgcmV0dXJuIHN0ZDo6Y29weShfX2ZpcnN0MiwgX19sYXN0MiwgCisJCSAgICAgICBzdGQ6OmNvcHkoX19maXJzdDEsIF9fbGFzdDEsIF9fcmVzdWx0KSk7CisgICAgfQorCisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiB0aGUgbWluaW11bSBlbGVtZW50IGluIGEgcmFuZ2UuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEVuZCBvZiByYW5nZS4KKyAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgc21hbGxlc3QgdmFsdWUuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIG1pbl9lbGVtZW50KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIF9fZmlyc3Q7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0ID0gX19maXJzdDsKKyAgICAgIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQorCWlmICgqX19maXJzdCA8ICpfX3Jlc3VsdCkKKwkgIF9fcmVzdWx0ID0gX19maXJzdDsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiB0aGUgbWluaW11bSBlbGVtZW50IGluIGEgcmFuZ2UgdXNpbmcgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIFN0YXJ0IG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBFbmQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fY29tcCAgIENvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgc21hbGxlc3QgdmFsdWUKKyAgICogIGFjY29yZGluZyB0byBfX2NvbXAuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBtaW5fZWxlbWVudChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQlfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gX19maXJzdDsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQgPSBfX2ZpcnN0OworICAgICAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCisJaWYgKF9fY29tcCgqX19maXJzdCwgKl9fcmVzdWx0KSkKKwkgIF9fcmVzdWx0ID0gX19maXJzdDsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiB0aGUgbWF4aW11bSBlbGVtZW50IGluIGEgcmFuZ2UuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEVuZCBvZiByYW5nZS4KKyAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgbGFyZ2VzdCB2YWx1ZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgbWF4X2VsZW1lbnQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gX19maXJzdDsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQgPSBfX2ZpcnN0OworICAgICAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCisJaWYgKCpfX3Jlc3VsdCA8ICpfX2ZpcnN0KQorCSAgX19yZXN1bHQgPSBfX2ZpcnN0OworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIHRoZSBtYXhpbXVtIGVsZW1lbnQgaW4gYSByYW5nZSB1c2luZyBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEVuZCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgX19jb21wICAgQ29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBsYXJnZXN0IHZhbHVlCisgICAqICBhY2NvcmRpbmcgdG8gX19jb21wLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgbWF4X2VsZW1lbnQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybiBfX2ZpcnN0OworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCA9IF9fZmlyc3Q7CisgICAgICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKKwlpZiAoX19jb21wKCpfX3Jlc3VsdCwgKl9fZmlyc3QpKQorCSAgX19yZXN1bHQgPSBfX2ZpcnN0OworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9BTEdPCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8qIF9TVExfQUxHT19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX2FsZ29iYXNlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX2FsZ29iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdkZDE3MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfYWxnb2Jhc2UuaApAQCAtMCwwICsxLDEyMjQgQEAKKy8vIENvcmUgYWxnb3JpdGhtaWMgZmFjaWxpdGllcyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk4CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfYWxnb2Jhc2UuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2FsZ29yaXRobX0KKyAqLworCisjaWZuZGVmIF9TVExfQUxHT0JBU0VfSAorI2RlZmluZSBfU1RMX0FMR09CQVNFX0ggMQorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+CisjaW5jbHVkZSA8Yml0cy9jcHBfdHlwZV90cmFpdHMuaD4KKyNpbmNsdWRlIDxleHQvdHlwZV90cmFpdHMuaD4KKyNpbmNsdWRlIDxleHQvbnVtZXJpY190cmFpdHMuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9wYWlyLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3JfYmFzZV90eXBlcy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfZnVuY3MuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9pdGVyYXRvci5oPgorI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisjaW5jbHVkZSA8Yml0cy9tb3ZlLmg+IC8vIEZvciBzdGQ6OnN3YXAgYW5kIF9HTElCQ1hYX01PVkUKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgIC8vIFNlZSBodHRwOi8vZ2NjLmdudS5vcmcvbWwvbGlic3RkYysrLzIwMDQtMDgvbXNnMDAxNjcuaHRtbDogaW4gYQorICAvLyBudXRzaGVsbCwgd2UgYXJlIHBhcnRpYWxseSBpbXBsZW1lbnRpbmcgdGhlIHJlc29sdXRpb24gb2YgRFIgMTg3LAorICAvLyB3aGVuIGl0J3Mgc2FmZSwgaS5lLiwgdGhlIHZhbHVlX3R5cGVzIGFyZSBlcXVhbC4KKyAgdGVtcGxhdGU8Ym9vbCBfQm9vbFR5cGU+CisgICAgc3RydWN0IF9faXRlcl9zd2FwCisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjEsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IyPgorICAgICAgICBzdGF0aWMgdm9pZAorICAgICAgICBpdGVyX3N3YXAoX0ZvcndhcmRJdGVyYXRvcjEgX19hLCBfRm9yd2FyZEl0ZXJhdG9yMiBfX2IpCisgICAgICAgIHsKKyAgICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUKKyAgICAgICAgICAgIF9WYWx1ZVR5cGUxOworICAgICAgICAgIF9WYWx1ZVR5cGUxIF9fdG1wID0gX0dMSUJDWFhfTU9WRSgqX19hKTsKKyAgICAgICAgICAqX19hID0gX0dMSUJDWFhfTU9WRSgqX19iKTsKKyAgICAgICAgICAqX19iID0gX0dMSUJDWFhfTU9WRShfX3RtcCk7CisJfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2l0ZXJfc3dhcDx0cnVlPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IxLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMj4KKyAgICAgICAgc3RhdGljIHZvaWQgCisgICAgICAgIGl0ZXJfc3dhcChfRm9yd2FyZEl0ZXJhdG9yMSBfX2EsIF9Gb3J3YXJkSXRlcmF0b3IyIF9fYikKKyAgICAgICAgeworICAgICAgICAgIHN3YXAoKl9fYSwgKl9fYik7CisgICAgICAgIH0KKyAgICB9OworI2VuZGlmCisKKyAgLyoqCisgICAqICBAYnJpZWYgU3dhcHMgdGhlIGNvbnRlbnRzIG9mIHR3byBpdGVyYXRvcnMuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fYSAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fYiAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gICBOb3RoaW5nLgorICAgKgorICAgKiAgVGhpcyBmdW5jdGlvbiBzd2FwcyB0aGUgdmFsdWVzIHBvaW50ZWQgdG8gYnkgdHdvIGl0ZXJhdG9ycywgbm90IHRoZQorICAgKiAgaXRlcmF0b3JzIHRoZW1zZWx2ZXMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IxLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMj4KKyAgICBpbmxpbmUgdm9pZAorICAgIGl0ZXJfc3dhcChfRm9yd2FyZEl0ZXJhdG9yMSBfX2EsIF9Gb3J3YXJkSXRlcmF0b3IyIF9fYikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfRm9yd2FyZEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9Gb3J3YXJkSXRlcmF0b3IyPikKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMjsKKworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Db252ZXJ0aWJsZUNvbmNlcHQ8X1ZhbHVlVHlwZTEsCisJCQkJICBfVmFsdWVUeXBlMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVmFsdWVUeXBlMiwKKwkJCQkgIF9WYWx1ZVR5cGUxPikKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcjE+OjpyZWZlcmVuY2UKKwlfUmVmZXJlbmNlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMj46OnJlZmVyZW5jZQorCV9SZWZlcmVuY2VUeXBlMjsKKyAgICAgIHN0ZDo6X19pdGVyX3N3YXA8X19hcmVfc2FtZTxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+OjpfX3ZhbHVlCisJJiYgX19hcmVfc2FtZTxfVmFsdWVUeXBlMSYsIF9SZWZlcmVuY2VUeXBlMT46Ol9fdmFsdWUKKwkmJiBfX2FyZV9zYW1lPF9WYWx1ZVR5cGUyJiwgX1JlZmVyZW5jZVR5cGUyPjo6X192YWx1ZT46OgorCWl0ZXJfc3dhcChfX2EsIF9fYik7CisjZWxzZQorICAgICAgc3dhcCgqX19hLCAqX19iKTsKKyNlbmRpZgorICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBTd2FwIHRoZSBlbGVtZW50cyBvZiB0d28gc2VxdWVuY2VzLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgIEFuIGl0ZXJhdG9yIGVxdWFsIHRvIEBwIGZpcnN0MisobGFzdDEtZmlyc3QxKS4KKyAgICoKKyAgICogIFN3YXBzIGVhY2ggZWxlbWVudCBpbiB0aGUgcmFuZ2UgQHAgW2ZpcnN0MSxsYXN0MSkgd2l0aCB0aGUKKyAgICogIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBpbiB0aGUgcmFuZ2UgQHAgW2ZpcnN0MiwobGFzdDEtZmlyc3QxKSkuCisgICAqICBUaGUgcmFuZ2VzIG11c3Qgbm90IG92ZXJsYXAuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IxLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMj4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yMgorICAgIHN3YXBfcmFuZ2VzKF9Gb3J3YXJkSXRlcmF0b3IxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXJhdG9yMSBfX2xhc3QxLAorCQlfRm9yd2FyZEl0ZXJhdG9yMiBfX2ZpcnN0MikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfRm9yd2FyZEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9Gb3J3YXJkSXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSk7CisKKyAgICAgIGZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCArK19fZmlyc3QyKQorCXN0ZDo6aXRlcl9zd2FwKF9fZmlyc3QxLCBfX2ZpcnN0Mik7CisgICAgICByZXR1cm4gX19maXJzdDI7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFRoaXMgZG9lcyB3aGF0IHlvdSB0aGluayBpdCBkb2VzLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fYSAgQSB0aGluZyBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEBwYXJhbSAgX19iICBBbm90aGVyIHRoaW5nIG9mIGFyYml0cmFyeSB0eXBlLgorICAgKiAgQHJldHVybiAgIFRoZSBsZXNzZXIgb2YgdGhlIHBhcmFtZXRlcnMuCisgICAqCisgICAqICBUaGlzIGlzIHRoZSBzaW1wbGUgY2xhc3NpYyBnZW5lcmljIGltcGxlbWVudGF0aW9uLiAgSXQgd2lsbCB3b3JrIG9uCisgICAqICB0ZW1wb3JhcnkgZXhwcmVzc2lvbnMsIHNpbmNlIHRoZXkgYXJlIG9ubHkgZXZhbHVhdGVkIG9uY2UsIHVubGlrZSBhCisgICAqICBwcmVwcm9jZXNzb3IgbWFjcm8uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29uc3QgX1RwJgorICAgIG1pbihjb25zdCBfVHAmIF9fYSwgY29uc3QgX1RwJiBfX2IpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDxfVHA+KQorICAgICAgLy9yZXR1cm4gX19iIDwgX19hID8gX19iIDogX19hOworICAgICAgaWYgKF9fYiA8IF9fYSkKKwlyZXR1cm4gX19iOworICAgICAgcmV0dXJuIF9fYTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgVGhpcyBkb2VzIHdoYXQgeW91IHRoaW5rIGl0IGRvZXMuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19hICBBIHRoaW5nIG9mIGFyYml0cmFyeSB0eXBlLgorICAgKiAgQHBhcmFtICBfX2IgIEFub3RoZXIgdGhpbmcgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqICBAcmV0dXJuICAgVGhlIGdyZWF0ZXIgb2YgdGhlIHBhcmFtZXRlcnMuCisgICAqCisgICAqICBUaGlzIGlzIHRoZSBzaW1wbGUgY2xhc3NpYyBnZW5lcmljIGltcGxlbWVudGF0aW9uLiAgSXQgd2lsbCB3b3JrIG9uCisgICAqICB0ZW1wb3JhcnkgZXhwcmVzc2lvbnMsIHNpbmNlIHRoZXkgYXJlIG9ubHkgZXZhbHVhdGVkIG9uY2UsIHVubGlrZSBhCisgICAqICBwcmVwcm9jZXNzb3IgbWFjcm8uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29uc3QgX1RwJgorICAgIG1heChjb25zdCBfVHAmIF9fYSwgY29uc3QgX1RwJiBfX2IpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDxfVHA+KQorICAgICAgLy9yZXR1cm4gIF9fYSA8IF9fYiA/IF9fYiA6IF9fYTsKKyAgICAgIGlmIChfX2EgPCBfX2IpCisJcmV0dXJuIF9fYjsKKyAgICAgIHJldHVybiBfX2E7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFRoaXMgZG9lcyB3aGF0IHlvdSB0aGluayBpdCBkb2VzLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fYSAgQSB0aGluZyBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEBwYXJhbSAgX19iICBBbm90aGVyIHRoaW5nIG9mIGFyYml0cmFyeSB0eXBlLgorICAgKiAgQHBhcmFtICBfX2NvbXAgIEEgQGxpbmsgY29tcGFyaXNvbl9mdW5jdG9ycyBjb21wYXJpc29uIGZ1bmN0b3JAZW5kbGluay4KKyAgICogIEByZXR1cm4gICBUaGUgbGVzc2VyIG9mIHRoZSBwYXJhbWV0ZXJzLgorICAgKgorICAgKiAgVGhpcyB3aWxsIHdvcmsgb24gdGVtcG9yYXJ5IGV4cHJlc3Npb25zLCBzaW5jZSB0aGV5IGFyZSBvbmx5IGV2YWx1YXRlZAorICAgKiAgb25jZSwgdW5saWtlIGEgcHJlcHJvY2Vzc29yIG1hY3JvLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSBjb25zdCBfVHAmCisgICAgbWluKGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYiwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIC8vcmV0dXJuIF9fY29tcChfX2IsIF9fYSkgPyBfX2IgOiBfX2E7CisgICAgICBpZiAoX19jb21wKF9fYiwgX19hKSkKKwlyZXR1cm4gX19iOworICAgICAgcmV0dXJuIF9fYTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgVGhpcyBkb2VzIHdoYXQgeW91IHRoaW5rIGl0IGRvZXMuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19hICBBIHRoaW5nIG9mIGFyYml0cmFyeSB0eXBlLgorICAgKiAgQHBhcmFtICBfX2IgIEFub3RoZXIgdGhpbmcgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqICBAcGFyYW0gIF9fY29tcCAgQSBAbGluayBjb21wYXJpc29uX2Z1bmN0b3JzIGNvbXBhcmlzb24gZnVuY3RvckBlbmRsaW5rLgorICAgKiAgQHJldHVybiAgIFRoZSBncmVhdGVyIG9mIHRoZSBwYXJhbWV0ZXJzLgorICAgKgorICAgKiAgVGhpcyB3aWxsIHdvcmsgb24gdGVtcG9yYXJ5IGV4cHJlc3Npb25zLCBzaW5jZSB0aGV5IGFyZSBvbmx5IGV2YWx1YXRlZAorICAgKiAgb25jZSwgdW5saWtlIGEgcHJlcHJvY2Vzc29yIG1hY3JvLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSBjb25zdCBfVHAmCisgICAgbWF4KGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYiwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIC8vcmV0dXJuIF9fY29tcChfX2EsIF9fYikgPyBfX2IgOiBfX2E7CisgICAgICBpZiAoX19jb21wKF9fYSwgX19iKSkKKwlyZXR1cm4gX19iOworICAgICAgcmV0dXJuIF9fYTsKKyAgICB9CisKKyAgLy8gSWYgX0l0ZXJhdG9yIGlzIGEgX19ub3JtYWxfaXRlcmF0b3IgcmV0dXJuIGl0cyBiYXNlIChhIHBsYWluIHBvaW50ZXIsCisgIC8vIG5vcm1hbGx5KSBvdGhlcndpc2UgcmV0dXJuIGl0IHVudG91Y2hlZC4gIFNlZSBjb3B5LCBmaWxsLCAuLi4gCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBzdHJ1Y3QgX05pdGVyX2Jhc2UKKyAgICA6IF9JdGVyX2Jhc2U8X0l0ZXJhdG9yLCBfX2lzX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3I+OjpfX3ZhbHVlPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIHR5cGVuYW1lIF9OaXRlcl9iYXNlPF9JdGVyYXRvcj46Oml0ZXJhdG9yX3R5cGUKKyAgICBfX25pdGVyX2Jhc2UoX0l0ZXJhdG9yIF9faXQpCisgICAgeyByZXR1cm4gc3RkOjpfTml0ZXJfYmFzZTxfSXRlcmF0b3I+OjpfU19iYXNlKF9faXQpOyB9CisKKyAgLy8gTGlrZXdpc2UsIGZvciBtb3ZlX2l0ZXJhdG9yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgc3RydWN0IF9NaXRlcl9iYXNlCisgICAgOiBfSXRlcl9iYXNlPF9JdGVyYXRvciwgX19pc19tb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj46Ol9fdmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX01pdGVyX2Jhc2U8X0l0ZXJhdG9yPjo6aXRlcmF0b3JfdHlwZQorICAgIF9fbWl0ZXJfYmFzZShfSXRlcmF0b3IgX19pdCkKKyAgICB7IHJldHVybiBzdGQ6Ol9NaXRlcl9iYXNlPF9JdGVyYXRvcj46Ol9TX2Jhc2UoX19pdCk7IH0KKworICAvLyBBbGwgb2YgdGhlc2UgYXV4aWxpYXJ5IHN0cnVjdHMgc2VydmUgdHdvIHB1cnBvc2VzLiAgKDEpIFJlcGxhY2UKKyAgLy8gY2FsbHMgdG8gY29weSB3aXRoIG1lbW1vdmUgd2hlbmV2ZXIgcG9zc2libGUuICAoTWVtbW92ZSwgbm90IG1lbWNweSwKKyAgLy8gYmVjYXVzZSB0aGUgaW5wdXQgYW5kIG91dHB1dCByYW5nZXMgYXJlIHBlcm1pdHRlZCB0byBvdmVybGFwLikKKyAgLy8gKDIpIElmIHdlJ3JlIHVzaW5nIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLCB0aGVuIHdyaXRlIHRoZSBsb29wIGFzCisgIC8vIGEgZm9yIGxvb3Agd2l0aCBhbiBleHBsaWNpdCBjb3VudC4KKworICB0ZW1wbGF0ZTxib29sLCBib29sLCB0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19jb3B5X21vdmUKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUksIHR5cGVuYW1lIF9PST4KKyAgICAgICAgc3RhdGljIF9PSQorICAgICAgICBfX2NvcHlfbShfSUkgX19maXJzdCwgX0lJIF9fbGFzdCwgX09JIF9fcmVzdWx0KQorICAgICAgICB7CisJICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19yZXN1bHQsICsrX19maXJzdCkKKwkgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisJICByZXR1cm4gX19yZXN1bHQ7CisJfQorICAgIH07CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DYXRlZ29yeT4KKyAgICBzdHJ1Y3QgX19jb3B5X21vdmU8dHJ1ZSwgZmFsc2UsIF9DYXRlZ29yeT4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUksIHR5cGVuYW1lIF9PST4KKyAgICAgICAgc3RhdGljIF9PSQorICAgICAgICBfX2NvcHlfbShfSUkgX19maXJzdCwgX0lJIF9fbGFzdCwgX09JIF9fcmVzdWx0KQorICAgICAgICB7CisJICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19yZXN1bHQsICsrX19maXJzdCkKKwkgICAgKl9fcmVzdWx0ID0gc3RkOjptb3ZlKCpfX2ZpcnN0KTsKKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisgICAgfTsKKyNlbmRpZgorCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19jb3B5X21vdmU8ZmFsc2UsIGZhbHNlLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZz4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUksIHR5cGVuYW1lIF9PST4KKyAgICAgICAgc3RhdGljIF9PSQorICAgICAgICBfX2NvcHlfbShfSUkgX19maXJzdCwgX0lJIF9fbGFzdCwgX09JIF9fcmVzdWx0KQorICAgICAgICB7IAorCSAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJPjo6ZGlmZmVyZW5jZV90eXBlIF9EaXN0YW5jZTsKKwkgIGZvcihfRGlzdGFuY2UgX19uID0gX19sYXN0IC0gX19maXJzdDsgX19uID4gMDsgLS1fX24pCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKwkgICAgICArK19fZmlyc3Q7CisJICAgICAgKytfX3Jlc3VsdDsKKwkgICAgfQorCSAgcmV0dXJuIF9fcmVzdWx0OworCX0KKyAgICB9OworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fY29weV9tb3ZlPHRydWUsIGZhbHNlLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZz4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUksIHR5cGVuYW1lIF9PST4KKyAgICAgICAgc3RhdGljIF9PSQorICAgICAgICBfX2NvcHlfbShfSUkgX19maXJzdCwgX0lJIF9fbGFzdCwgX09JIF9fcmVzdWx0KQorICAgICAgICB7IAorCSAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJPjo6ZGlmZmVyZW5jZV90eXBlIF9EaXN0YW5jZTsKKwkgIGZvcihfRGlzdGFuY2UgX19uID0gX19sYXN0IC0gX19maXJzdDsgX19uID4gMDsgLS1fX24pCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSBzdGQ6Om1vdmUoKl9fZmlyc3QpOworCSAgICAgICsrX19maXJzdDsKKwkgICAgICArK19fcmVzdWx0OworCSAgICB9CisJICByZXR1cm4gX19yZXN1bHQ7CisJfQorICAgIH07CisjZW5kaWYKKworICB0ZW1wbGF0ZTxib29sIF9Jc01vdmU+CisgICAgc3RydWN0IF9fY29weV9tb3ZlPF9Jc01vdmUsIHRydWUsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgc3RhdGljIF9UcCoKKyAgICAgICAgX19jb3B5X20oY29uc3QgX1RwKiBfX2ZpcnN0LCBjb25zdCBfVHAqIF9fbGFzdCwgX1RwKiBfX3Jlc3VsdCkKKyAgICAgICAgeworCSAgY29uc3QgcHRyZGlmZl90IF9OdW0gPSBfX2xhc3QgLSBfX2ZpcnN0OworCSAgaWYgKF9OdW0pCisJICAgIF9fYnVpbHRpbl9tZW1tb3ZlKF9fcmVzdWx0LCBfX2ZpcnN0LCBzaXplb2YoX1RwKSAqIF9OdW0pOworCSAgcmV0dXJuIF9fcmVzdWx0ICsgX051bTsKKwl9CisgICAgfTsKKworICB0ZW1wbGF0ZTxib29sIF9Jc01vdmUsIHR5cGVuYW1lIF9JSSwgdHlwZW5hbWUgX09JPgorICAgIGlubGluZSBfT0kKKyAgICBfX2NvcHlfbW92ZV9hKF9JSSBfX2ZpcnN0LCBfSUkgX19sYXN0LCBfT0kgX19yZXN1bHQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlSTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9PST46OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZU87CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUk+OjppdGVyYXRvcl9jYXRlZ29yeSBfQ2F0ZWdvcnk7CisgICAgICBjb25zdCBib29sIF9fc2ltcGxlID0gKF9faXNfdHJpdmlhbChfVmFsdWVUeXBlSSkKKwkgICAgICAgICAgICAgICAgICAgICAmJiBfX2lzX3BvaW50ZXI8X0lJPjo6X192YWx1ZQorCSAgICAgICAgICAgICAgICAgICAgICYmIF9faXNfcG9pbnRlcjxfT0k+OjpfX3ZhbHVlCisJCQkgICAgICYmIF9fYXJlX3NhbWU8X1ZhbHVlVHlwZUksIF9WYWx1ZVR5cGVPPjo6X192YWx1ZSk7CisKKyAgICAgIHJldHVybiBzdGQ6Ol9fY29weV9tb3ZlPF9Jc01vdmUsIF9fc2ltcGxlLAorCSAgICAgICAgICAgICAgICAgICAgICBfQ2F0ZWdvcnk+OjpfX2NvcHlfbShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsKKyAgICB9CisKKyAgLy8gSGVscGVycyBmb3Igc3RyZWFtYnVmIGl0ZXJhdG9ycyAoZWl0aGVyIGlzdHJlYW0gb3Igb3N0cmVhbSkuCisgIC8vIE5COiBhdm9pZCBpbmNsdWRpbmcgPGlvc2Z3ZD4sIHJlbGF0aXZlbHkgbGFyZ2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBzdHJ1Y3QgY2hhcl90cmFpdHM7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGNsYXNzIGlzdHJlYW1idWZfaXRlcmF0b3I7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGNsYXNzIG9zdHJlYW1idWZfaXRlcmF0b3I7CisKKyAgdGVtcGxhdGU8Ym9vbCBfSXNNb3ZlLCB0eXBlbmFtZSBfQ2hhclQ+CisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2NoYXI8X0NoYXJUPjo6X192YWx1ZSwgCisJICAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgY2hhcl90cmFpdHM8X0NoYXJUPiA+ID46Ol9fdHlwZQorICAgIF9fY29weV9tb3ZlX2EyKF9DaGFyVCosIF9DaGFyVCosCisJCSAgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBjaGFyX3RyYWl0czxfQ2hhclQ+ID4pOworCisgIHRlbXBsYXRlPGJvb2wgX0lzTW92ZSwgdHlwZW5hbWUgX0NoYXJUPgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19jaGFyPF9DaGFyVD46Ol9fdmFsdWUsIAorCSAgICAgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIGNoYXJfdHJhaXRzPF9DaGFyVD4gPiA+OjpfX3R5cGUKKyAgICBfX2NvcHlfbW92ZV9hMihjb25zdCBfQ2hhclQqLCBjb25zdCBfQ2hhclQqLAorCQkgICBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgY2hhcl90cmFpdHM8X0NoYXJUPiA+KTsKKworICB0ZW1wbGF0ZTxib29sIF9Jc01vdmUsIHR5cGVuYW1lIF9DaGFyVD4KKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfY2hhcjxfQ2hhclQ+OjpfX3ZhbHVlLAorCQkJCSAgICBfQ2hhclQqPjo6X190eXBlCisgICAgX19jb3B5X21vdmVfYTIoaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIGNoYXJfdHJhaXRzPF9DaGFyVD4gPiwKKwkJICAgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIGNoYXJfdHJhaXRzPF9DaGFyVD4gPiwgX0NoYXJUKik7CisKKyAgdGVtcGxhdGU8Ym9vbCBfSXNNb3ZlLCB0eXBlbmFtZSBfSUksIHR5cGVuYW1lIF9PST4KKyAgICBpbmxpbmUgX09JCisgICAgX19jb3B5X21vdmVfYTIoX0lJIF9fZmlyc3QsIF9JSSBfX2xhc3QsIF9PSSBfX3Jlc3VsdCkKKyAgICB7CisgICAgICByZXR1cm4gX09JKHN0ZDo6X19jb3B5X21vdmVfYTxfSXNNb3ZlPihzdGQ6Ol9fbml0ZXJfYmFzZShfX2ZpcnN0KSwKKwkJCQkJICAgICBzdGQ6Ol9fbml0ZXJfYmFzZShfX2xhc3QpLAorCQkJCQkgICAgIHN0ZDo6X19uaXRlcl9iYXNlKF9fcmVzdWx0KSkpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBDb3BpZXMgdGhlIHJhbmdlIFtmaXJzdCxsYXN0KSBpbnRvIHJlc3VsdC4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3Jlc3VsdCBBbiBvdXRwdXQgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICAgcmVzdWx0ICsgKGZpcnN0IC0gbGFzdCkKKyAgICoKKyAgICogIFRoaXMgaW5saW5lIGZ1bmN0aW9uIHdpbGwgYm9pbCBkb3duIHRvIGEgY2FsbCB0byBAYyBtZW1tb3ZlIHdoZW5ldmVyCisgICAqICBwb3NzaWJsZS4gIEZhaWxpbmcgdGhhdCwgaWYgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMgYXJlIHBhc3NlZCwgdGhlbiB0aGUKKyAgICogIGxvb3AgY291bnQgd2lsbCBiZSBrbm93biAoYW5kIHRoZXJlZm9yZSBhIGNhbmRpZGF0ZSBmb3IgY29tcGlsZXIKKyAgICogIG9wdGltaXphdGlvbnMgc3VjaCBhcyB1bnJvbGxpbmcpLiAgUmVzdWx0IG1heSBub3QgYmUgY29udGFpbmVkIHdpdGhpbgorICAgKiAgW2ZpcnN0LGxhc3QpOyB0aGUgY29weV9iYWNrd2FyZCBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorICAgKgorICAgKiAgTm90ZSB0aGF0IHRoZSBlbmQgb2YgdGhlIG91dHB1dCByYW5nZSBpcyBwZXJtaXR0ZWQgdG8gYmUgY29udGFpbmVkCisgICAqICB3aXRoaW4gW2ZpcnN0LGxhc3QpLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUksIHR5cGVuYW1lIF9PST4KKyAgICBpbmxpbmUgX09JCisgICAgY29weShfSUkgX19maXJzdCwgX0lJIF9fbGFzdCwgX09JIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JST4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT0ksCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUk+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICByZXR1cm4gKHN0ZDo6X19jb3B5X21vdmVfYTI8X19pc19tb3ZlX2l0ZXJhdG9yPF9JST46Ol9fdmFsdWU+CisJICAgICAgKHN0ZDo6X19taXRlcl9iYXNlKF9fZmlyc3QpLCBzdGQ6Ol9fbWl0ZXJfYmFzZShfX2xhc3QpLAorCSAgICAgICBfX3Jlc3VsdCkpOworICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgLyoqCisgICAqICBAYnJpZWYgTW92ZXMgdGhlIHJhbmdlIFtmaXJzdCxsYXN0KSBpbnRvIHJlc3VsdC4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3Jlc3VsdCBBbiBvdXRwdXQgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICAgcmVzdWx0ICsgKGZpcnN0IC0gbGFzdCkKKyAgICoKKyAgICogIFRoaXMgaW5saW5lIGZ1bmN0aW9uIHdpbGwgYm9pbCBkb3duIHRvIGEgY2FsbCB0byBAYyBtZW1tb3ZlIHdoZW5ldmVyCisgICAqICBwb3NzaWJsZS4gIEZhaWxpbmcgdGhhdCwgaWYgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMgYXJlIHBhc3NlZCwgdGhlbiB0aGUKKyAgICogIGxvb3AgY291bnQgd2lsbCBiZSBrbm93biAoYW5kIHRoZXJlZm9yZSBhIGNhbmRpZGF0ZSBmb3IgY29tcGlsZXIKKyAgICogIG9wdGltaXphdGlvbnMgc3VjaCBhcyB1bnJvbGxpbmcpLiAgUmVzdWx0IG1heSBub3QgYmUgY29udGFpbmVkIHdpdGhpbgorICAgKiAgW2ZpcnN0LGxhc3QpOyB0aGUgbW92ZV9iYWNrd2FyZCBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorICAgKgorICAgKiAgTm90ZSB0aGF0IHRoZSBlbmQgb2YgdGhlIG91dHB1dCByYW5nZSBpcyBwZXJtaXR0ZWQgdG8gYmUgY29udGFpbmVkCisgICAqICB3aXRoaW4gW2ZpcnN0LGxhc3QpLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUksIHR5cGVuYW1lIF9PST4KKyAgICBpbmxpbmUgX09JCisgICAgbW92ZShfSUkgX19maXJzdCwgX0lJIF9fbGFzdCwgX09JIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JST4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT0ksCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUk+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICByZXR1cm4gc3RkOjpfX2NvcHlfbW92ZV9hMjx0cnVlPihzdGQ6Ol9fbWl0ZXJfYmFzZShfX2ZpcnN0KSwKKwkJCQkgICAgICAgc3RkOjpfX21pdGVyX2Jhc2UoX19sYXN0KSwgX19yZXN1bHQpOworICAgIH0KKworI2RlZmluZSBfR0xJQkNYWF9NT1ZFMyhfVHAsIF9VcCwgX1ZwKSBzdGQ6Om1vdmUoX1RwLCBfVXAsIF9WcCkKKyNlbHNlCisjZGVmaW5lIF9HTElCQ1hYX01PVkUzKF9UcCwgX1VwLCBfVnApIHN0ZDo6Y29weShfVHAsIF9VcCwgX1ZwKQorI2VuZGlmCisKKyAgdGVtcGxhdGU8Ym9vbCwgYm9vbCwgdHlwZW5hbWU+CisgICAgc3RydWN0IF9fY29weV9tb3ZlX2JhY2t3YXJkCisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0JJMSwgdHlwZW5hbWUgX0JJMj4KKyAgICAgICAgc3RhdGljIF9CSTIKKyAgICAgICAgX19jb3B5X21vdmVfYihfQkkxIF9fZmlyc3QsIF9CSTEgX19sYXN0LCBfQkkyIF9fcmVzdWx0KQorICAgICAgICB7CisJICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJICAgICotLV9fcmVzdWx0ID0gKi0tX19sYXN0OworCSAgcmV0dXJuIF9fcmVzdWx0OworCX0KKyAgICB9OworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2F0ZWdvcnk+CisgICAgc3RydWN0IF9fY29weV9tb3ZlX2JhY2t3YXJkPHRydWUsIGZhbHNlLCBfQ2F0ZWdvcnk+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0JJMSwgdHlwZW5hbWUgX0JJMj4KKyAgICAgICAgc3RhdGljIF9CSTIKKyAgICAgICAgX19jb3B5X21vdmVfYihfQkkxIF9fZmlyc3QsIF9CSTEgX19sYXN0LCBfQkkyIF9fcmVzdWx0KQorICAgICAgICB7CisJICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJICAgICotLV9fcmVzdWx0ID0gc3RkOjptb3ZlKCotLV9fbGFzdCk7CisJICByZXR1cm4gX19yZXN1bHQ7CisJfQorICAgIH07CisjZW5kaWYKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fY29weV9tb3ZlX2JhY2t3YXJkPGZhbHNlLCBmYWxzZSwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWc+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0JJMSwgdHlwZW5hbWUgX0JJMj4KKyAgICAgICAgc3RhdGljIF9CSTIKKyAgICAgICAgX19jb3B5X21vdmVfYihfQkkxIF9fZmlyc3QsIF9CSTEgX19sYXN0LCBfQkkyIF9fcmVzdWx0KQorICAgICAgICB7CisJICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JJMT46OmRpZmZlcmVuY2VfdHlwZSBfX247CisJICBmb3IgKF9fbiA9IF9fbGFzdCAtIF9fZmlyc3Q7IF9fbiA+IDA7IC0tX19uKQorCSAgICAqLS1fX3Jlc3VsdCA9ICotLV9fbGFzdDsKKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisgICAgfTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2NvcHlfbW92ZV9iYWNrd2FyZDx0cnVlLCBmYWxzZSwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWc+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0JJMSwgdHlwZW5hbWUgX0JJMj4KKyAgICAgICAgc3RhdGljIF9CSTIKKyAgICAgICAgX19jb3B5X21vdmVfYihfQkkxIF9fZmlyc3QsIF9CSTEgX19sYXN0LCBfQkkyIF9fcmVzdWx0KQorICAgICAgICB7CisJICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JJMT46OmRpZmZlcmVuY2VfdHlwZSBfX247CisJICBmb3IgKF9fbiA9IF9fbGFzdCAtIF9fZmlyc3Q7IF9fbiA+IDA7IC0tX19uKQorCSAgICAqLS1fX3Jlc3VsdCA9IHN0ZDo6bW92ZSgqLS1fX2xhc3QpOworCSAgcmV0dXJuIF9fcmVzdWx0OworCX0KKyAgICB9OworI2VuZGlmCisKKyAgdGVtcGxhdGU8Ym9vbCBfSXNNb3ZlPgorICAgIHN0cnVjdCBfX2NvcHlfbW92ZV9iYWNrd2FyZDxfSXNNb3ZlLCB0cnVlLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZz4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0YXRpYyBfVHAqCisgICAgICAgIF9fY29weV9tb3ZlX2IoY29uc3QgX1RwKiBfX2ZpcnN0LCBjb25zdCBfVHAqIF9fbGFzdCwgX1RwKiBfX3Jlc3VsdCkKKyAgICAgICAgeworCSAgY29uc3QgcHRyZGlmZl90IF9OdW0gPSBfX2xhc3QgLSBfX2ZpcnN0OworCSAgaWYgKF9OdW0pCisJICAgIF9fYnVpbHRpbl9tZW1tb3ZlKF9fcmVzdWx0IC0gX051bSwgX19maXJzdCwgc2l6ZW9mKF9UcCkgKiBfTnVtKTsKKwkgIHJldHVybiBfX3Jlc3VsdCAtIF9OdW07CisJfQorICAgIH07CisKKyAgdGVtcGxhdGU8Ym9vbCBfSXNNb3ZlLCB0eXBlbmFtZSBfQkkxLCB0eXBlbmFtZSBfQkkyPgorICAgIGlubGluZSBfQkkyCisgICAgX19jb3B5X21vdmVfYmFja3dhcmRfYShfQkkxIF9fZmlyc3QsIF9CSTEgX19sYXN0LCBfQkkyIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CSTE+Ojp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JJMj46OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQkkxPjo6aXRlcmF0b3JfY2F0ZWdvcnkgX0NhdGVnb3J5OworICAgICAgY29uc3QgYm9vbCBfX3NpbXBsZSA9IChfX2lzX3RyaXZpYWwoX1ZhbHVlVHlwZTEpCisJICAgICAgICAgICAgICAgICAgICAgJiYgX19pc19wb2ludGVyPF9CSTE+OjpfX3ZhbHVlCisJICAgICAgICAgICAgICAgICAgICAgJiYgX19pc19wb2ludGVyPF9CSTI+OjpfX3ZhbHVlCisJCQkgICAgICYmIF9fYXJlX3NhbWU8X1ZhbHVlVHlwZTEsIF9WYWx1ZVR5cGUyPjo6X192YWx1ZSk7CisKKyAgICAgIHJldHVybiBzdGQ6Ol9fY29weV9tb3ZlX2JhY2t3YXJkPF9Jc01vdmUsIF9fc2ltcGxlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ2F0ZWdvcnk+OjpfX2NvcHlfbW92ZV9iKF9fZmlyc3QsCisJCQkJCQkJCSBfX2xhc3QsCisJCQkJCQkJCSBfX3Jlc3VsdCk7CisgICAgfQorCisgIHRlbXBsYXRlPGJvb2wgX0lzTW92ZSwgdHlwZW5hbWUgX0JJMSwgdHlwZW5hbWUgX0JJMj4KKyAgICBpbmxpbmUgX0JJMgorICAgIF9fY29weV9tb3ZlX2JhY2t3YXJkX2EyKF9CSTEgX19maXJzdCwgX0JJMSBfX2xhc3QsIF9CSTIgX19yZXN1bHQpCisgICAgeworICAgICAgcmV0dXJuIF9CSTIoc3RkOjpfX2NvcHlfbW92ZV9iYWNrd2FyZF9hPF9Jc01vdmU+CisJCSAgKHN0ZDo6X19uaXRlcl9iYXNlKF9fZmlyc3QpLCBzdGQ6Ol9fbml0ZXJfYmFzZShfX2xhc3QpLAorCQkgICBzdGQ6Ol9fbml0ZXJfYmFzZShfX3Jlc3VsdCkpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29waWVzIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkgaW50byByZXN1bHQuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIEEgYmlkaXJlY3Rpb25hbCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgQSBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3Jlc3VsdCBBIGJpZGlyZWN0aW9uYWwgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICAgcmVzdWx0IC0gKGZpcnN0IC0gbGFzdCkKKyAgICoKKyAgICogIFRoZSBmdW5jdGlvbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGNvcHksIGJ1dCBzdGFydHMgYXQgdGhlIGVuZCBvZiB0aGUKKyAgICogIHJhbmdlIGFuZCB3b3JrcyBpdHMgd2F5IHRvIHRoZSBzdGFydCwgcmV0dXJuaW5nIHRoZSBzdGFydCBvZiB0aGUgcmVzdWx0LgorICAgKiAgVGhpcyBpbmxpbmUgZnVuY3Rpb24gd2lsbCBib2lsIGRvd24gdG8gYSBjYWxsIHRvIEBjIG1lbW1vdmUgd2hlbmV2ZXIKKyAgICogIHBvc3NpYmxlLiAgRmFpbGluZyB0aGF0LCBpZiByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycyBhcmUgcGFzc2VkLCB0aGVuIHRoZQorICAgKiAgbG9vcCBjb3VudCB3aWxsIGJlIGtub3duIChhbmQgdGhlcmVmb3JlIGEgY2FuZGlkYXRlIGZvciBjb21waWxlcgorICAgKiAgb3B0aW1pemF0aW9ucyBzdWNoIGFzIHVucm9sbGluZykuCisgICAqCisgICAqICBSZXN1bHQgbWF5IG5vdCBiZSBpbiB0aGUgcmFuZ2UgKGZpcnN0LGxhc3RdLiAgVXNlIGNvcHkgaW5zdGVhZC4gIE5vdGUKKyAgICogIHRoYXQgdGhlIHN0YXJ0IG9mIHRoZSBvdXRwdXQgcmFuZ2UgbWF5IG92ZXJsYXAgW2ZpcnN0LGxhc3QpLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQkkxLCB0eXBlbmFtZSBfQkkyPgorICAgIGlubGluZSBfQkkyCisgICAgY29weV9iYWNrd2FyZChfQkkxIF9fZmlyc3QsIF9CSTEgX19sYXN0LCBfQkkyIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8X0JJMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDxfQkkyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JJMT46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQkkyPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgcmV0dXJuIChzdGQ6Ol9fY29weV9tb3ZlX2JhY2t3YXJkX2EyPF9faXNfbW92ZV9pdGVyYXRvcjxfQkkxPjo6X192YWx1ZT4KKwkgICAgICAoc3RkOjpfX21pdGVyX2Jhc2UoX19maXJzdCksIHN0ZDo6X19taXRlcl9iYXNlKF9fbGFzdCksCisJICAgICAgIF9fcmVzdWx0KSk7CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAvKioKKyAgICogIEBicmllZiBNb3ZlcyB0aGUgcmFuZ2UgW2ZpcnN0LGxhc3QpIGludG8gcmVzdWx0LgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBIGJpZGlyZWN0aW9uYWwgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEEgYmlkaXJlY3Rpb25hbCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19yZXN1bHQgQSBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgIHJlc3VsdCAtIChmaXJzdCAtIGxhc3QpCisgICAqCisgICAqICBUaGUgZnVuY3Rpb24gaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBtb3ZlLCBidXQgc3RhcnRzIGF0IHRoZSBlbmQgb2YgdGhlCisgICAqICByYW5nZSBhbmQgd29ya3MgaXRzIHdheSB0byB0aGUgc3RhcnQsIHJldHVybmluZyB0aGUgc3RhcnQgb2YgdGhlIHJlc3VsdC4KKyAgICogIFRoaXMgaW5saW5lIGZ1bmN0aW9uIHdpbGwgYm9pbCBkb3duIHRvIGEgY2FsbCB0byBAYyBtZW1tb3ZlIHdoZW5ldmVyCisgICAqICBwb3NzaWJsZS4gIEZhaWxpbmcgdGhhdCwgaWYgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMgYXJlIHBhc3NlZCwgdGhlbiB0aGUKKyAgICogIGxvb3AgY291bnQgd2lsbCBiZSBrbm93biAoYW5kIHRoZXJlZm9yZSBhIGNhbmRpZGF0ZSBmb3IgY29tcGlsZXIKKyAgICogIG9wdGltaXphdGlvbnMgc3VjaCBhcyB1bnJvbGxpbmcpLgorICAgKgorICAgKiAgUmVzdWx0IG1heSBub3QgYmUgaW4gdGhlIHJhbmdlIChmaXJzdCxsYXN0XS4gIFVzZSBtb3ZlIGluc3RlYWQuICBOb3RlCisgICAqICB0aGF0IHRoZSBzdGFydCBvZiB0aGUgb3V0cHV0IHJhbmdlIG1heSBvdmVybGFwIFtmaXJzdCxsYXN0KS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JJMSwgdHlwZW5hbWUgX0JJMj4KKyAgICBpbmxpbmUgX0JJMgorICAgIG1vdmVfYmFja3dhcmQoX0JJMSBfX2ZpcnN0LCBfQkkxIF9fbGFzdCwgX0JJMiBfX3Jlc3VsdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PF9CSTE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8X0JJMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CSTE+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JJMj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHJldHVybiBzdGQ6Ol9fY29weV9tb3ZlX2JhY2t3YXJkX2EyPHRydWU+KHN0ZDo6X19taXRlcl9iYXNlKF9fZmlyc3QpLAorCQkJCQkJc3RkOjpfX21pdGVyX2Jhc2UoX19sYXN0KSwKKwkJCQkJCV9fcmVzdWx0KTsKKyAgICB9CisKKyNkZWZpbmUgX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoX1RwLCBfVXAsIF9WcCkgc3RkOjptb3ZlX2JhY2t3YXJkKF9UcCwgX1VwLCBfVnApCisjZWxzZQorI2RlZmluZSBfR0xJQkNYWF9NT1ZFX0JBQ0tXQVJEMyhfVHAsIF9VcCwgX1ZwKSBzdGQ6OmNvcHlfYmFja3dhcmQoX1RwLCBfVXAsIF9WcCkKKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUKKyAgICBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPCFfX2lzX3NjYWxhcjxfVHA+OjpfX3ZhbHVlLCB2b2lkPjo6X190eXBlCisgICAgX19maWxsX2EoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAJICAgICBjb25zdCBfVHAmIF9fdmFsdWUpCisgICAgeworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJKl9fZmlyc3QgPSBfX3ZhbHVlOworICAgIH0KKyAgICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZQorICAgIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19zY2FsYXI8X1RwPjo6X192YWx1ZSwgdm9pZD46Ol9fdHlwZQorICAgIF9fZmlsbF9hKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJICAgICBjb25zdCBfVHAmIF9fdmFsdWUpCisgICAgeworICAgICAgY29uc3QgX1RwIF9fdG1wID0gX192YWx1ZTsKKyAgICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCSpfX2ZpcnN0ID0gX190bXA7CisgICAgfQorCisgIC8vIFNwZWNpYWxpemF0aW9uOiBmb3IgY2hhciB0eXBlcyB3ZSBjYW4gdXNlIG1lbXNldC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZQorICAgIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19ieXRlPF9UcD46Ol9fdmFsdWUsIHZvaWQ+OjpfX3R5cGUKKyAgICBfX2ZpbGxfYShfVHAqIF9fZmlyc3QsIF9UcCogX19sYXN0LCBjb25zdCBfVHAmIF9fYykKKyAgICB7CisgICAgICBjb25zdCBfVHAgX190bXAgPSBfX2M7CisgICAgICBfX2J1aWx0aW5fbWVtc2V0KF9fZmlyc3QsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KF9fdG1wKSwKKwkJICAgICAgIF9fbGFzdCAtIF9fZmlyc3QpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBGaWxscyB0aGUgcmFuZ2UgW2ZpcnN0LGxhc3QpIHdpdGggY29waWVzIG9mIHZhbHVlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX192YWx1ZSAgQSByZWZlcmVuY2UtdG8tY29uc3Qgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqICBAcmV0dXJuICAgTm90aGluZy4KKyAgICoKKyAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSByYW5nZSB3aXRoIGNvcGllcyBvZiB0aGUgc2FtZSB2YWx1ZS4gIEZvciBjaGFyCisgICAqICB0eXBlcyBmaWxsaW5nIGNvbnRpZ3VvdXMgYXJlYXMgb2YgbWVtb3J5LCB0aGlzIGJlY29tZXMgYW4gaW5saW5lIGNhbGwKKyAgICogIHRvIEBjIG1lbXNldCBvciBAYyB3bWVtc2V0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBmaWxsKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWx1ZSkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBzdGQ6Ol9fZmlsbF9hKHN0ZDo6X19uaXRlcl9iYXNlKF9fZmlyc3QpLCBzdGQ6Ol9fbml0ZXJfYmFzZShfX2xhc3QpLAorCQkgICAgX192YWx1ZSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUKKyAgICBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPCFfX2lzX3NjYWxhcjxfVHA+OjpfX3ZhbHVlLCBfT3V0cHV0SXRlcmF0b3I+OjpfX3R5cGUKKyAgICBfX2ZpbGxfbl9hKF9PdXRwdXRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24sIGNvbnN0IF9UcCYgX192YWx1ZSkKKyAgICB7CisgICAgICBmb3IgKF9fZGVjbHR5cGUoX19uICsgMCkgX19uaXRlciA9IF9fbjsKKwkgICBfX25pdGVyID4gMDsgLS1fX25pdGVyLCArK19fZmlyc3QpCisJKl9fZmlyc3QgPSBfX3ZhbHVlOworICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUKKyAgICBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfc2NhbGFyPF9UcD46Ol9fdmFsdWUsIF9PdXRwdXRJdGVyYXRvcj46Ol9fdHlwZQorICAgIF9fZmlsbF9uX2EoX091dHB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgX1RwJiBfX3ZhbHVlKQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX3RtcCA9IF9fdmFsdWU7CisgICAgICBmb3IgKF9fZGVjbHR5cGUoX19uICsgMCkgX19uaXRlciA9IF9fbjsKKwkgICBfX25pdGVyID4gMDsgLS1fX25pdGVyLCArK19fZmlyc3QpCisJKl9fZmlyc3QgPSBfX3RtcDsKKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZQorICAgIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19ieXRlPF9UcD46Ol9fdmFsdWUsIF9UcCo+OjpfX3R5cGUKKyAgICBfX2ZpbGxfbl9hKF9UcCogX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9fYykKKyAgICB7CisgICAgICBzdGQ6Ol9fZmlsbF9hKF9fZmlyc3QsIF9fZmlyc3QgKyBfX24sIF9fYyk7CisgICAgICByZXR1cm4gX19maXJzdCArIF9fbjsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRmlsbHMgdGhlIHJhbmdlIFtmaXJzdCxmaXJzdCtuKSB3aXRoIGNvcGllcyBvZiB2YWx1ZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX24gICAgICBUaGUgY291bnQgb2YgY29waWVzIHRvIHBlcmZvcm0uCisgICAqICBAcGFyYW0gIF9fdmFsdWUgIEEgcmVmZXJlbmNlLXRvLWNvbnN0IG9mIGFyYml0cmFyeSB0eXBlLgorICAgKiAgQHJldHVybiAgIFRoZSBpdGVyYXRvciBhdCBmaXJzdCtuLgorICAgKgorICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhIHJhbmdlIHdpdGggY29waWVzIG9mIHRoZSBzYW1lIHZhbHVlLiAgRm9yIGNoYXIKKyAgICogIHR5cGVzIGZpbGxpbmcgY29udGlndW91cyBhcmVhcyBvZiBtZW1vcnksIHRoaXMgYmVjb21lcyBhbiBpbmxpbmUgY2FsbAorICAgKiAgdG8gQGMgbWVtc2V0IG9yIEAgd21lbXNldC4KKyAgICoKKyAgICogIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICogIERSIDg2NS4gTW9yZSBhbGdvcml0aG1zIHRoYXQgdGhyb3cgYXdheSBpbmZvcm1hdGlvbgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT0ksIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9PSQorICAgIGZpbGxfbihfT0kgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PSSwgX1RwPikKKworICAgICAgcmV0dXJuIF9PSShzdGQ6Ol9fZmlsbF9uX2Eoc3RkOjpfX25pdGVyX2Jhc2UoX19maXJzdCksIF9fbiwgX192YWx1ZSkpOworICAgIH0KKworICB0ZW1wbGF0ZTxib29sIF9Cb29sVHlwZT4KKyAgICBzdHJ1Y3QgX19lcXVhbAorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSTEsIHR5cGVuYW1lIF9JSTI+CisgICAgICAgIHN0YXRpYyBib29sCisgICAgICAgIGVxdWFsKF9JSTEgX19maXJzdDEsIF9JSTEgX19sYXN0MSwgX0lJMiBfX2ZpcnN0MikKKyAgICAgICAgeworCSAgZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19maXJzdDEsICsrX19maXJzdDIpCisJICAgIGlmICghKCpfX2ZpcnN0MSA9PSAqX19maXJzdDIpKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19lcXVhbDx0cnVlPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgc3RhdGljIGJvb2wKKyAgICAgICAgZXF1YWwoY29uc3QgX1RwKiBfX2ZpcnN0MSwgY29uc3QgX1RwKiBfX2xhc3QxLCBjb25zdCBfVHAqIF9fZmlyc3QyKQorICAgICAgICB7CisJICByZXR1cm4gIV9fYnVpbHRpbl9tZW1jbXAoX19maXJzdDEsIF9fZmlyc3QyLCBzaXplb2YoX1RwKQorCQkJCSAgICogKF9fbGFzdDEgLSBfX2ZpcnN0MSkpOworCX0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSTEsIHR5cGVuYW1lIF9JSTI+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2VxdWFsX2F1eChfSUkxIF9fZmlyc3QxLCBfSUkxIF9fbGFzdDEsIF9JSTIgX19maXJzdDIpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJMT46OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUkyPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMjsKKyAgICAgIGNvbnN0IGJvb2wgX19zaW1wbGUgPSAoKF9faXNfaW50ZWdlcjxfVmFsdWVUeXBlMT46Ol9fdmFsdWUKKwkJCSAgICAgIHx8IF9faXNfcG9pbnRlcjxfVmFsdWVUeXBlMT46Ol9fdmFsdWUpCisJICAgICAgICAgICAgICAgICAgICAgJiYgX19pc19wb2ludGVyPF9JSTE+OjpfX3ZhbHVlCisJICAgICAgICAgICAgICAgICAgICAgJiYgX19pc19wb2ludGVyPF9JSTI+OjpfX3ZhbHVlCisJCQkgICAgICYmIF9fYXJlX3NhbWU8X1ZhbHVlVHlwZTEsIF9WYWx1ZVR5cGUyPjo6X192YWx1ZSk7CisKKyAgICAgIHJldHVybiBzdGQ6Ol9fZXF1YWw8X19zaW1wbGU+OjplcXVhbChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIpOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19sY19yYWkKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUkxLCB0eXBlbmFtZSBfSUkyPgorICAgICAgICBzdGF0aWMgX0lJMQorICAgICAgICBfX25ld2xhc3QxKF9JSTEsIF9JSTEgX19sYXN0MSwgX0lJMiwgX0lJMikKKyAgICAgICAgeyByZXR1cm4gX19sYXN0MTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUk+CisgICAgICAgIHN0YXRpYyBib29sCisgICAgICAgIF9fY25kMihfSUkgX19maXJzdCwgX0lJIF9fbGFzdCkKKyAgICAgICAgeyByZXR1cm4gX19maXJzdCAhPSBfX2xhc3Q7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19sY19yYWk8cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUkxLCB0eXBlbmFtZSBfUkFJMj4KKyAgICAgICAgc3RhdGljIF9SQUkxCisgICAgICAgIF9fbmV3bGFzdDEoX1JBSTEgX19maXJzdDEsIF9SQUkxIF9fbGFzdDEsCisJCSAgIF9SQUkyIF9fZmlyc3QyLCBfUkFJMiBfX2xhc3QyKQorICAgICAgICB7CisJICBjb25zdCB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JBSTE+OjpkaWZmZXJlbmNlX3R5cGUKKwkgICAgX19kaWZmMSA9IF9fbGFzdDEgLSBfX2ZpcnN0MTsKKwkgIGNvbnN0IHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUkFJMj46OmRpZmZlcmVuY2VfdHlwZQorCSAgICBfX2RpZmYyID0gX19sYXN0MiAtIF9fZmlyc3QyOworCSAgcmV0dXJuIF9fZGlmZjIgPCBfX2RpZmYxID8gX19maXJzdDEgKyBfX2RpZmYyIDogX19sYXN0MTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUk+CisgICAgICAgIHN0YXRpYyBib29sCisgICAgICAgIF9fY25kMihfUkFJLCBfUkFJKQorICAgICAgICB7IHJldHVybiB0cnVlOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxib29sIF9Cb29sVHlwZT4KKyAgICBzdHJ1Y3QgX19sZXhpY29ncmFwaGljYWxfY29tcGFyZQorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSTEsIHR5cGVuYW1lIF9JSTI+CisgICAgICAgIHN0YXRpYyBib29sIF9fbGMoX0lJMSwgX0lJMSwgX0lJMiwgX0lJMik7CisgICAgfTsKKworICB0ZW1wbGF0ZTxib29sIF9Cb29sVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUkxLCB0eXBlbmFtZSBfSUkyPgorICAgICAgYm9vbAorICAgICAgX19sZXhpY29ncmFwaGljYWxfY29tcGFyZTxfQm9vbFR5cGU+OjoKKyAgICAgIF9fbGMoX0lJMSBfX2ZpcnN0MSwgX0lJMSBfX2xhc3QxLCBfSUkyIF9fZmlyc3QyLCBfSUkyIF9fbGFzdDIpCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJMT46Oml0ZXJhdG9yX2NhdGVnb3J5IF9DYXRlZ29yeTE7CisJdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJMj46Oml0ZXJhdG9yX2NhdGVnb3J5IF9DYXRlZ29yeTI7CisJdHlwZWRlZiBzdGQ6Ol9fbGNfcmFpPF9DYXRlZ29yeTEsIF9DYXRlZ29yeTI+IAlfX3JhaV90eXBlOworCQorCV9fbGFzdDEgPSBfX3JhaV90eXBlOjpfX25ld2xhc3QxKF9fZmlyc3QxLCBfX2xhc3QxLAorCQkJCQkgX19maXJzdDIsIF9fbGFzdDIpOworCWZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fcmFpX3R5cGU6Ol9fY25kMihfX2ZpcnN0MiwgX19sYXN0Mik7CisJICAgICArK19fZmlyc3QxLCArK19fZmlyc3QyKQorCSAgeworCSAgICBpZiAoKl9fZmlyc3QxIDwgKl9fZmlyc3QyKQorCSAgICAgIHJldHVybiB0cnVlOworCSAgICBpZiAoKl9fZmlyc3QyIDwgKl9fZmlyc3QxKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgIH0KKwlyZXR1cm4gX19maXJzdDEgPT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyOworICAgICAgfQorCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19sZXhpY29ncmFwaGljYWxfY29tcGFyZTx0cnVlPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgICAgICBzdGF0aWMgYm9vbAorICAgICAgICBfX2xjKGNvbnN0IF9UcCogX19maXJzdDEsIGNvbnN0IF9UcCogX19sYXN0MSwKKwkgICAgIGNvbnN0IF9VcCogX19maXJzdDIsIGNvbnN0IF9VcCogX19sYXN0MikKKwl7CisJICBjb25zdCBzaXplX3QgX19sZW4xID0gX19sYXN0MSAtIF9fZmlyc3QxOworCSAgY29uc3Qgc2l6ZV90IF9fbGVuMiA9IF9fbGFzdDIgLSBfX2ZpcnN0MjsKKwkgIGNvbnN0IGludCBfX3Jlc3VsdCA9IF9fYnVpbHRpbl9tZW1jbXAoX19maXJzdDEsIF9fZmlyc3QyLAorCQkJCQkJc3RkOjptaW4oX19sZW4xLCBfX2xlbjIpKTsKKwkgIHJldHVybiBfX3Jlc3VsdCAhPSAwID8gX19yZXN1bHQgPCAwIDogX19sZW4xIDwgX19sZW4yOworCX0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSTEsIHR5cGVuYW1lIF9JSTI+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlX2F1eChfSUkxIF9fZmlyc3QxLCBfSUkxIF9fbGFzdDEsCisJCQkJICBfSUkyIF9fZmlyc3QyLCBfSUkyIF9fbGFzdDIpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJMT46OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUkyPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMjsKKyAgICAgIGNvbnN0IGJvb2wgX19zaW1wbGUgPQorCShfX2lzX2J5dGU8X1ZhbHVlVHlwZTE+OjpfX3ZhbHVlICYmIF9faXNfYnl0ZTxfVmFsdWVUeXBlMj46Ol9fdmFsdWUKKwkgJiYgIV9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxfVmFsdWVUeXBlMT46Ol9faXNfc2lnbmVkCisJICYmICFfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1ZhbHVlVHlwZTI+OjpfX2lzX3NpZ25lZAorCSAmJiBfX2lzX3BvaW50ZXI8X0lJMT46Ol9fdmFsdWUKKwkgJiYgX19pc19wb2ludGVyPF9JSTI+OjpfX3ZhbHVlKTsKKworICAgICAgcmV0dXJuIHN0ZDo6X19sZXhpY29ncmFwaGljYWxfY29tcGFyZTxfX3NpbXBsZT46Ol9fbGMoX19maXJzdDEsIF9fbGFzdDEsCisJCQkJCQkJICAgIF9fZmlyc3QyLCBfX2xhc3QyKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRmluZHMgdGhlIGZpcnN0IHBvc2l0aW9uIGluIHdoaWNoIEBhIHZhbCBjb3VsZCBiZSBpbnNlcnRlZAorICAgKiAgICAgICAgIHdpdGhvdXQgY2hhbmdpbmcgdGhlIG9yZGVyaW5nLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ZhbCAgICAgVGhlIHNlYXJjaCB0ZXJtLgorICAgKiAgQHJldHVybiAgICAgICAgIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IDxlbT5ub3QgbGVzcworICAgKiAgICAgICAgICAgICAgICAgIHRoYW48L2VtPiBAYSB2YWwsIG9yIGVuZCgpIGlmIGV2ZXJ5IGVsZW1lbnQgaXMgbGVzcyB0aGFuIAorICAgKiAgICAgICAgICAgICAgICAgIEBhIHZhbC4KKyAgICogIEBpbmdyb3VwIGJpbmFyeV9zZWFyY2hfYWxnb3JpdGhtcworICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIGxvd2VyX2JvdW5kKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCWNvbnN0IF9UcCYgX192YWwpCisgICAgeworI2lmZGVmIF9HTElCQ1hYX0NPTkNFUFRfQ0hFQ0tTCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisjZW5kaWYKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2VUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbk9wQ29uY2VwdDxfVmFsdWVUeXBlLCBfVHA+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3BhcnRpdGlvbmVkX2xvd2VyKF9fZmlyc3QsIF9fbGFzdCwgX192YWwpOworCisgICAgICBfRGlzdGFuY2VUeXBlIF9fbGVuID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICB3aGlsZSAoX19sZW4gPiAwKQorCXsKKwkgIF9EaXN0YW5jZVR5cGUgX19oYWxmID0gX19sZW4gPj4gMTsKKwkgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWRkbGUgPSBfX2ZpcnN0OworCSAgc3RkOjphZHZhbmNlKF9fbWlkZGxlLCBfX2hhbGYpOworCSAgaWYgKCpfX21pZGRsZSA8IF9fdmFsKQorCSAgICB7CisJICAgICAgX19maXJzdCA9IF9fbWlkZGxlOworCSAgICAgICsrX19maXJzdDsKKwkgICAgICBfX2xlbiA9IF9fbGVuIC0gX19oYWxmIC0gMTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBfX2xlbiA9IF9faGFsZjsKKwl9CisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBzb3J0IHJvdXRpbmVzIGFuZCBmb3IgcmFuZG9tLnRjYy4KKyAgLy8gIFByZWNvbmRpdGlvbjogX19uID4gMC4KKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBpbnQKKyAgX19sZyhpbnQgX19uKQorICB7IHJldHVybiBzaXplb2YoaW50KSAqIF9fQ0hBUl9CSVRfXyAgLSAxIC0gX19idWlsdGluX2NseihfX24pOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZAorICBfX2xnKHVuc2lnbmVkIF9fbikKKyAgeyByZXR1cm4gc2l6ZW9mKGludCkgKiBfX0NIQVJfQklUX18gIC0gMSAtIF9fYnVpbHRpbl9jbHooX19uKTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZworICBfX2xnKGxvbmcgX19uKQorICB7IHJldHVybiBzaXplb2YobG9uZykgKiBfX0NIQVJfQklUX18gLSAxIC0gX19idWlsdGluX2NsemwoX19uKTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgbG9uZworICBfX2xnKHVuc2lnbmVkIGxvbmcgX19uKQorICB7IHJldHVybiBzaXplb2YobG9uZykgKiBfX0NIQVJfQklUX18gLSAxIC0gX19idWlsdGluX2NsemwoX19uKTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBsb25nCisgIF9fbGcobG9uZyBsb25nIF9fbikKKyAgeyByZXR1cm4gc2l6ZW9mKGxvbmcgbG9uZykgKiBfX0NIQVJfQklUX18gLSAxIC0gX19idWlsdGluX2NsemxsKF9fbik7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgbG9uZworICBfX2xnKHVuc2lnbmVkIGxvbmcgbG9uZyBfX24pCisgIHsgcmV0dXJuIHNpemVvZihsb25nIGxvbmcpICogX19DSEFSX0JJVF9fIC0gMSAtIF9fYnVpbHRpbl9jbHpsbChfX24pOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorCitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQUxHTworCisgIC8qKgorICAgKiAgQGJyaWVmIFRlc3RzIGEgcmFuZ2UgZm9yIGVsZW1lbnQtd2lzZSBlcXVhbGl0eS4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QxICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0MSAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICAgQSBib29sZWFuIHRydWUgb3IgZmFsc2UuCisgICAqCisgICAqICBUaGlzIGNvbXBhcmVzIHRoZSBlbGVtZW50cyBvZiB0d28gcmFuZ2VzIHVzaW5nIEBjID09IGFuZCByZXR1cm5zIHRydWUgb3IKKyAgICogIGZhbHNlIGRlcGVuZGluZyBvbiB3aGV0aGVyIGFsbCBvZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiB0aGUKKyAgICogIHJhbmdlcyBhcmUgZXF1YWwuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSTEsIHR5cGVuYW1lIF9JSTI+CisgICAgaW5saW5lIGJvb2wKKyAgICBlcXVhbChfSUkxIF9fZmlyc3QxLCBfSUkxIF9fbGFzdDEsIF9JSTIgX19maXJzdDIpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lJMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JSTI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9FcXVhbE9wQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSTE+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJMj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKworICAgICAgcmV0dXJuIHN0ZDo6X19lcXVhbF9hdXgoc3RkOjpfX25pdGVyX2Jhc2UoX19maXJzdDEpLAorCQkJICAgICAgc3RkOjpfX25pdGVyX2Jhc2UoX19sYXN0MSksCisJCQkgICAgICBzdGQ6Ol9fbml0ZXJfYmFzZShfX2ZpcnN0MikpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBUZXN0cyBhIHJhbmdlIGZvciBlbGVtZW50LXdpc2UgZXF1YWxpdHkuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdDEgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtIF9fYmluYXJ5X3ByZWQgQSBiaW5hcnkgcHJlZGljYXRlIEBsaW5rIGZ1bmN0b3JzCisgICAqICAgICAgICAgICAgICAgICAgZnVuY3RvckBlbmRsaW5rLgorICAgKiAgQHJldHVybiAgICAgICAgIEEgYm9vbGVhbiB0cnVlIG9yIGZhbHNlLgorICAgKgorICAgKiAgVGhpcyBjb21wYXJlcyB0aGUgZWxlbWVudHMgb2YgdHdvIHJhbmdlcyB1c2luZyB0aGUgYmluYXJ5X3ByZWQKKyAgICogIHBhcmFtZXRlciwgYW5kIHJldHVybnMgdHJ1ZSBvcgorICAgKiAgZmFsc2UgZGVwZW5kaW5nIG9uIHdoZXRoZXIgYWxsIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIHRoZQorICAgKiAgcmFuZ2VzIGFyZSBlcXVhbC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIGVxdWFsKF9JSXRlcjEgX19maXJzdDEsIF9JSXRlcjEgX19sYXN0MSwKKwkgIF9JSXRlcjIgX19maXJzdDIsIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSUl0ZXIxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lJdGVyMj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpOworCisgICAgICBmb3IgKDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikKKwlpZiAoIWJvb2woX19iaW5hcnlfcHJlZCgqX19maXJzdDEsICpfX2ZpcnN0MikpKQorCSAgcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFBlcmZvcm1zIEBiIGRpY3Rpb25hcnkgY29tcGFyaXNvbiBvbiByYW5nZXMuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdDEgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fZmlyc3QyICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0MiAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgIEEgYm9vbGVhbiB0cnVlIG9yIGZhbHNlLgorICAgKgorICAgKiAgPGVtPlJldHVybnMgdHJ1ZSBpZiB0aGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMgZGVmaW5lZCBieSB0aGUgcmFuZ2UKKyAgICogIFtmaXJzdDEsbGFzdDEpIGlzIGxleGljb2dyYXBoaWNhbGx5IGxlc3MgdGhhbiB0aGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMKKyAgICogIGRlZmluZWQgYnkgdGhlIHJhbmdlIFtmaXJzdDIsbGFzdDIpLiAgUmV0dXJucyBmYWxzZSBvdGhlcndpc2UuPC9lbT4KKyAgICogIChRdW90ZWQgZnJvbSBbMjUuMy44XS8xLikgIElmIHRoZSBpdGVyYXRvcnMgYXJlIGFsbCBjaGFyYWN0ZXIgcG9pbnRlcnMsCisgICAqICB0aGVuIHRoaXMgaXMgYW4gaW5saW5lIGNhbGwgdG8gQGMgbWVtY21wLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUkxLCB0eXBlbmFtZSBfSUkyPgorICAgIGlubGluZSBib29sCisgICAgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX0lJMSBfX2ZpcnN0MSwgX0lJMSBfX2xhc3QxLAorCQkJICAgIF9JSTIgX19maXJzdDIsIF9JSTIgX19sYXN0MikKKyAgICB7CisjaWZkZWYgX0dMSUJDWFhfQ09OQ0VQVF9DSEVDS1MKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUkxPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSTI+Ojp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUyOworI2VuZGlmCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JSTE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSUkyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5PcENvbmNlcHQ8X1ZhbHVlVHlwZTEsIF9WYWx1ZVR5cGUyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5PcENvbmNlcHQ8X1ZhbHVlVHlwZTIsIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpOworCisgICAgICByZXR1cm4gc3RkOjpfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlX2F1eChzdGQ6Ol9fbml0ZXJfYmFzZShfX2ZpcnN0MSksCisJCQkJCQlzdGQ6Ol9fbml0ZXJfYmFzZShfX2xhc3QxKSwKKwkJCQkJCXN0ZDo6X19uaXRlcl9iYXNlKF9fZmlyc3QyKSwKKwkJCQkJCXN0ZDo6X19uaXRlcl9iYXNlKF9fbGFzdDIpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgUGVyZm9ybXMgQGIgZGljdGlvbmFyeSBjb21wYXJpc29uIG9uIHJhbmdlcy4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdDEgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QyICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fY29tcCAgQSBAbGluayBjb21wYXJpc29uX2Z1bmN0b3JzIGNvbXBhcmlzb24gZnVuY3RvckBlbmRsaW5rLgorICAgKiAgQHJldHVybiAgIEEgYm9vbGVhbiB0cnVlIG9yIGZhbHNlLgorICAgKgorICAgKiAgVGhlIHNhbWUgYXMgdGhlIGZvdXItcGFyYW1ldGVyIEBjIGxleGljb2dyYXBoaWNhbF9jb21wYXJlLCBidXQgdXNlcyB0aGUKKyAgICogIGNvbXAgcGFyYW1ldGVyIGluc3RlYWQgb2YgQGMgPC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJMSwgdHlwZW5hbWUgX0lJMiwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgYm9vbAorICAgIGxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9JSTEgX19maXJzdDEsIF9JSTEgX19sYXN0MSwKKwkJCSAgICBfSUkyIF9fZmlyc3QyLCBfSUkyIF9fbGFzdDIsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUkxPjo6aXRlcmF0b3JfY2F0ZWdvcnkgX0NhdGVnb3J5MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSTI+OjppdGVyYXRvcl9jYXRlZ29yeSBfQ2F0ZWdvcnkyOworICAgICAgdHlwZWRlZiBzdGQ6Ol9fbGNfcmFpPF9DYXRlZ29yeTEsIF9DYXRlZ29yeTI+IAlfX3JhaV90eXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSUkxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lJMj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKTsKKworICAgICAgX19sYXN0MSA9IF9fcmFpX3R5cGU6Ol9fbmV3bGFzdDEoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyKTsKKyAgICAgIGZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fcmFpX3R5cGU6Ol9fY25kMihfX2ZpcnN0MiwgX19sYXN0Mik7CisJICAgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikKKwl7CisJICBpZiAoX19jb21wKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkKKwkgICAgcmV0dXJuIHRydWU7CisJICBpZiAoX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIHJldHVybiBfX2ZpcnN0MSA9PSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDI7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIEZpbmRzIHRoZSBwbGFjZXMgaW4gcmFuZ2VzIHdoaWNoIGRvbid0IG1hdGNoLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX19maXJzdDEgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fZmlyc3QyICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gICBBIHBhaXIgb2YgaXRlcmF0b3JzIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBtaXNtYXRjaC4KKyAgICoKKyAgICogIFRoaXMgY29tcGFyZXMgdGhlIGVsZW1lbnRzIG9mIHR3byByYW5nZXMgdXNpbmcgQGMgPT0gYW5kIHJldHVybnMgYSBwYWlyCisgICAqICBvZiBpdGVyYXRvcnMuICBUaGUgZmlyc3QgaXRlcmF0b3IgcG9pbnRzIGludG8gdGhlIGZpcnN0IHJhbmdlLCB0aGUKKyAgICogIHNlY29uZCBpdGVyYXRvciBwb2ludHMgaW50byB0aGUgc2Vjb25kIHJhbmdlLCBhbmQgdGhlIGVsZW1lbnRzIHBvaW50ZWQKKyAgICogIHRvIGJ5IHRoZSBpdGVyYXRvcnMgYXJlIG5vdCBlcXVhbC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjI+CisgICAgcGFpcjxfSW5wdXRJdGVyYXRvcjEsIF9JbnB1dEl0ZXJhdG9yMj4KKyAgICBtaXNtYXRjaChfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCSAgICAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0VxdWFsT3BDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IxPjo6dmFsdWVfdHlwZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKworICAgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgKl9fZmlyc3QxID09ICpfX2ZpcnN0MikKKyAgICAgICAgeworCSAgKytfX2ZpcnN0MTsKKwkgICsrX19maXJzdDI7CisgICAgICAgIH0KKyAgICAgIHJldHVybiBwYWlyPF9JbnB1dEl0ZXJhdG9yMSwgX0lucHV0SXRlcmF0b3IyPihfX2ZpcnN0MSwgX19maXJzdDIpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBGaW5kcyB0aGUgcGxhY2VzIGluIHJhbmdlcyB3aGljaCBkb24ndCBtYXRjaC4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fZmlyc3QxICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0MSAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MiAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gX19iaW5hcnlfcHJlZCBBIGJpbmFyeSBwcmVkaWNhdGUgQGxpbmsgZnVuY3RvcnMKKyAgICogICAgICAgICBmdW5jdG9yQGVuZGxpbmsuCisgICAqICBAcmV0dXJuICAgQSBwYWlyIG9mIGl0ZXJhdG9ycyBwb2ludGluZyB0byB0aGUgZmlyc3QgbWlzbWF0Y2guCisgICAqCisgICAqICBUaGlzIGNvbXBhcmVzIHRoZSBlbGVtZW50cyBvZiB0d28gcmFuZ2VzIHVzaW5nIHRoZSBiaW5hcnlfcHJlZAorICAgKiAgcGFyYW1ldGVyLCBhbmQgcmV0dXJucyBhIHBhaXIKKyAgICogIG9mIGl0ZXJhdG9ycy4gIFRoZSBmaXJzdCBpdGVyYXRvciBwb2ludHMgaW50byB0aGUgZmlyc3QgcmFuZ2UsIHRoZQorICAgKiAgc2Vjb25kIGl0ZXJhdG9yIHBvaW50cyBpbnRvIHRoZSBzZWNvbmQgcmFuZ2UsIGFuZCB0aGUgZWxlbWVudHMgcG9pbnRlZAorICAgKiAgdG8gYnkgdGhlIGl0ZXJhdG9ycyBhcmUgbm90IGVxdWFsLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIHBhaXI8X0lucHV0SXRlcmF0b3IxLCBfSW5wdXRJdGVyYXRvcjI+CisgICAgbWlzbWF0Y2goX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpOworCisgICAgICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBib29sKF9fYmluYXJ5X3ByZWQoKl9fZmlyc3QxLCAqX19maXJzdDIpKSkKKyAgICAgICAgeworCSAgKytfX2ZpcnN0MTsKKwkgICsrX19maXJzdDI7CisgICAgICAgIH0KKyAgICAgIHJldHVybiBwYWlyPF9JbnB1dEl0ZXJhdG9yMSwgX0lucHV0SXRlcmF0b3IyPihfX2ZpcnN0MSwgX19maXJzdDIpOworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9BTEdPCit9IC8vIG5hbWVzcGFjZSBzdGQKKworLy8gTkI6IFRoaXMgZmlsZSBpcyBpbmNsdWRlZCB3aXRoaW4gbWFueSBvdGhlciBDKysgaW5jbHVkZXMsIGFzIGEgd2F5CisvLyBvZiBnZXR0aW5nIHRoZSBiYXNlIGFsZ29yaXRobXMuIFNvLCBtYWtlIHN1cmUgdGhhdCBwYXJhbGxlbCBiaXRzCisvLyBjb21lIGluIHRvbyBpZiByZXF1ZXN0ZWQuIAorI2lmZGVmIF9HTElCQ1hYX1BBUkFMTEVMCisjIGluY2x1ZGUgPHBhcmFsbGVsL2FsZ29iYXNlLmg+CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX2J2ZWN0b3IuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfYnZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMmE5OGEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX2J2ZWN0b3IuaApAQCAtMCwwICsxLDExNTUgQEAKKy8vIHZlY3Rvcjxib29sPiBzcGVjaWFsaXphdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk5CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfYnZlY3Rvci5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dmVjdG9yfQorICovCisKKyNpZm5kZWYgX1NUTF9CVkVDVE9SX0gKKyNkZWZpbmUgX1NUTF9CVkVDVE9SX0ggMQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9CaXRfdHlwZTsKKyAgZW51bSB7IF9TX3dvcmRfYml0ID0gaW50KF9fQ0hBUl9CSVRfXyAqIHNpemVvZihfQml0X3R5cGUpKSB9OworCisgIHN0cnVjdCBfQml0X3JlZmVyZW5jZQorICB7CisgICAgX0JpdF90eXBlICogX01fcDsKKyAgICBfQml0X3R5cGUgX01fbWFzazsKKworICAgIF9CaXRfcmVmZXJlbmNlKF9CaXRfdHlwZSAqIF9feCwgX0JpdF90eXBlIF9feSkKKyAgICA6IF9NX3AoX194KSwgX01fbWFzayhfX3kpIHsgfQorCisgICAgX0JpdF9yZWZlcmVuY2UoKSBfR0xJQkNYWF9OT0VYQ0VQVCA6IF9NX3AoMCksIF9NX21hc2soMCkgeyB9CisKKyAgICBvcGVyYXRvciBib29sKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiAhISgqX01fcCAmIF9NX21hc2spOyB9CisKKyAgICBfQml0X3JlZmVyZW5jZSYKKyAgICBvcGVyYXRvcj0oYm9vbCBfX3gpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgaWYgKF9feCkKKwkqX01fcCB8PSBfTV9tYXNrOworICAgICAgZWxzZQorCSpfTV9wICY9IH5fTV9tYXNrOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIF9CaXRfcmVmZXJlbmNlJgorICAgIG9wZXJhdG9yPShjb25zdCBfQml0X3JlZmVyZW5jZSYgX194KSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuICp0aGlzID0gYm9vbChfX3gpOyB9CisKKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfQml0X3JlZmVyZW5jZSYgX194KSBjb25zdAorICAgIHsgcmV0dXJuIGJvb2woKnRoaXMpID09IGJvb2woX194KTsgfQorCisgICAgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfQml0X3JlZmVyZW5jZSYgX194KSBjb25zdAorICAgIHsgcmV0dXJuICFib29sKCp0aGlzKSAmJiBib29sKF9feCk7IH0KKworICAgIHZvaWQKKyAgICBmbGlwKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7ICpfTV9wIF49IF9NX21hc2s7IH0KKyAgfTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgaW5saW5lIHZvaWQKKyAgc3dhcChfQml0X3JlZmVyZW5jZSBfX3gsIF9CaXRfcmVmZXJlbmNlIF9feSkgbm9leGNlcHQKKyAgeworICAgIGJvb2wgX190bXAgPSBfX3g7CisgICAgX194ID0gX195OworICAgIF9feSA9IF9fdG1wOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgc3dhcChfQml0X3JlZmVyZW5jZSBfX3gsIGJvb2wmIF9feSkgbm9leGNlcHQKKyAgeworICAgIGJvb2wgX190bXAgPSBfX3g7CisgICAgX194ID0gX195OworICAgIF9feSA9IF9fdG1wOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgc3dhcChib29sJiBfX3gsIF9CaXRfcmVmZXJlbmNlIF9feSkgbm9leGNlcHQKKyAgeworICAgIGJvb2wgX190bXAgPSBfX3g7CisgICAgX194ID0gX195OworICAgIF9feSA9IF9fdG1wOworICB9CisjZW5kaWYKKworICBzdHJ1Y3QgX0JpdF9pdGVyYXRvcl9iYXNlCisgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgYm9vbD4KKyAgeworICAgIF9CaXRfdHlwZSAqIF9NX3A7CisgICAgdW5zaWduZWQgaW50IF9NX29mZnNldDsKKworICAgIF9CaXRfaXRlcmF0b3JfYmFzZShfQml0X3R5cGUgKiBfX3gsIHVuc2lnbmVkIGludCBfX3kpCisgICAgOiBfTV9wKF9feCksIF9NX29mZnNldChfX3kpIHsgfQorCisgICAgdm9pZAorICAgIF9NX2J1bXBfdXAoKQorICAgIHsKKyAgICAgIGlmIChfTV9vZmZzZXQrKyA9PSBpbnQoX1Nfd29yZF9iaXQpIC0gMSkKKwl7CisJICBfTV9vZmZzZXQgPSAwOworCSAgKytfTV9wOworCX0KKyAgICB9CisKKyAgICB2b2lkCisgICAgX01fYnVtcF9kb3duKCkKKyAgICB7CisgICAgICBpZiAoX01fb2Zmc2V0LS0gPT0gMCkKKwl7CisJICBfTV9vZmZzZXQgPSBpbnQoX1Nfd29yZF9iaXQpIC0gMTsKKwkgIC0tX01fcDsKKwl9CisgICAgfQorCisgICAgdm9pZAorICAgIF9NX2luY3IocHRyZGlmZl90IF9faSkKKyAgICB7CisgICAgICBkaWZmZXJlbmNlX3R5cGUgX19uID0gX19pICsgX01fb2Zmc2V0OworICAgICAgX01fcCArPSBfX24gLyBpbnQoX1Nfd29yZF9iaXQpOworICAgICAgX19uID0gX19uICUgaW50KF9TX3dvcmRfYml0KTsKKyAgICAgIGlmIChfX24gPCAwKQorCXsKKwkgIF9fbiArPSBpbnQoX1Nfd29yZF9iaXQpOworCSAgLS1fTV9wOworCX0KKyAgICAgIF9NX29mZnNldCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oX19uKTsKKyAgICB9CisKKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9faSkgY29uc3QKKyAgICB7IHJldHVybiBfTV9wID09IF9faS5fTV9wICYmIF9NX29mZnNldCA9PSBfX2kuX01fb2Zmc2V0OyB9CisKKyAgICBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX19pKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBfTV9wIDwgX19pLl9NX3AKKwkgICAgIHx8IChfTV9wID09IF9faS5fTV9wICYmIF9NX29mZnNldCA8IF9faS5fTV9vZmZzZXQpOworICAgIH0KKworICAgIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX19pKSBjb25zdAorICAgIHsgcmV0dXJuICEoKnRoaXMgPT0gX19pKTsgfQorCisgICAgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9faSkgY29uc3QKKyAgICB7IHJldHVybiBfX2kgPCAqdGhpczsgfQorCisgICAgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX2kpIGNvbnN0CisgICAgeyByZXR1cm4gIShfX2kgPCAqdGhpcyk7IH0KKworICAgIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX19pKSBjb25zdAorICAgIHsgcmV0dXJuICEoKnRoaXMgPCBfX2kpOyB9CisgIH07CisKKyAgaW5saW5lIHB0cmRpZmZfdAorICBvcGVyYXRvci0oY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX3gsIGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX195KQorICB7CisgICAgcmV0dXJuIChpbnQoX1Nfd29yZF9iaXQpICogKF9feC5fTV9wIC0gX195Ll9NX3ApCisJICAgICsgX194Ll9NX29mZnNldCAtIF9feS5fTV9vZmZzZXQpOworICB9CisKKyAgc3RydWN0IF9CaXRfaXRlcmF0b3IgOiBwdWJsaWMgX0JpdF9pdGVyYXRvcl9iYXNlCisgIHsKKyAgICB0eXBlZGVmIF9CaXRfcmVmZXJlbmNlICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBfQml0X3JlZmVyZW5jZSogcG9pbnRlcjsKKyAgICB0eXBlZGVmIF9CaXRfaXRlcmF0b3IgICBpdGVyYXRvcjsKKworICAgIF9CaXRfaXRlcmF0b3IoKSA6IF9CaXRfaXRlcmF0b3JfYmFzZSgwLCAwKSB7IH0KKworICAgIF9CaXRfaXRlcmF0b3IoX0JpdF90eXBlICogX194LCB1bnNpZ25lZCBpbnQgX195KQorICAgIDogX0JpdF9pdGVyYXRvcl9iYXNlKF9feCwgX195KSB7IH0KKworICAgIHJlZmVyZW5jZQorICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgeyByZXR1cm4gcmVmZXJlbmNlKF9NX3AsIDFVTCA8PCBfTV9vZmZzZXQpOyB9CisKKyAgICBpdGVyYXRvciYKKyAgICBvcGVyYXRvcisrKCkKKyAgICB7CisgICAgICBfTV9idW1wX3VwKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgaXRlcmF0b3IKKyAgICBvcGVyYXRvcisrKGludCkKKyAgICB7CisgICAgICBpdGVyYXRvciBfX3RtcCA9ICp0aGlzOworICAgICAgX01fYnVtcF91cCgpOworICAgICAgcmV0dXJuIF9fdG1wOworICAgIH0KKworICAgIGl0ZXJhdG9yJgorICAgIG9wZXJhdG9yLS0oKQorICAgIHsKKyAgICAgIF9NX2J1bXBfZG93bigpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGl0ZXJhdG9yCisgICAgb3BlcmF0b3ItLShpbnQpCisgICAgeworICAgICAgaXRlcmF0b3IgX190bXAgPSAqdGhpczsKKyAgICAgIF9NX2J1bXBfZG93bigpOworICAgICAgcmV0dXJuIF9fdG1wOworICAgIH0KKworICAgIGl0ZXJhdG9yJgorICAgIG9wZXJhdG9yKz0oZGlmZmVyZW5jZV90eXBlIF9faSkKKyAgICB7CisgICAgICBfTV9pbmNyKF9faSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgaXRlcmF0b3ImCisgICAgb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgX19pKQorICAgIHsKKyAgICAgICp0aGlzICs9IC1fX2k7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgaXRlcmF0b3IKKyAgICBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIF9faSkgY29uc3QKKyAgICB7CisgICAgICBpdGVyYXRvciBfX3RtcCA9ICp0aGlzOworICAgICAgcmV0dXJuIF9fdG1wICs9IF9faTsKKyAgICB9CisKKyAgICBpdGVyYXRvcgorICAgIG9wZXJhdG9yLShkaWZmZXJlbmNlX3R5cGUgX19pKSBjb25zdAorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CisgICAgICByZXR1cm4gX190bXAgLT0gX19pOworICAgIH0KKworICAgIHJlZmVyZW5jZQorICAgIG9wZXJhdG9yW10oZGlmZmVyZW5jZV90eXBlIF9faSkgY29uc3QKKyAgICB7IHJldHVybiAqKCp0aGlzICsgX19pKTsgfQorICB9OworCisgIGlubGluZSBfQml0X2l0ZXJhdG9yCisgIG9wZXJhdG9yKyhwdHJkaWZmX3QgX19uLCBjb25zdCBfQml0X2l0ZXJhdG9yJiBfX3gpCisgIHsgcmV0dXJuIF9feCArIF9fbjsgfQorCisgIHN0cnVjdCBfQml0X2NvbnN0X2l0ZXJhdG9yIDogcHVibGljIF9CaXRfaXRlcmF0b3JfYmFzZQorICB7CisgICAgdHlwZWRlZiBib29sICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBib29sICAgICAgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiBjb25zdCBib29sKiAgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgX0JpdF9jb25zdF9pdGVyYXRvciAgY29uc3RfaXRlcmF0b3I7CisKKyAgICBfQml0X2NvbnN0X2l0ZXJhdG9yKCkgOiBfQml0X2l0ZXJhdG9yX2Jhc2UoMCwgMCkgeyB9CisKKyAgICBfQml0X2NvbnN0X2l0ZXJhdG9yKF9CaXRfdHlwZSAqIF9feCwgdW5zaWduZWQgaW50IF9feSkKKyAgICA6IF9CaXRfaXRlcmF0b3JfYmFzZShfX3gsIF9feSkgeyB9CisKKyAgICBfQml0X2NvbnN0X2l0ZXJhdG9yKGNvbnN0IF9CaXRfaXRlcmF0b3ImIF9feCkKKyAgICA6IF9CaXRfaXRlcmF0b3JfYmFzZShfX3guX01fcCwgX194Ll9NX29mZnNldCkgeyB9CisKKyAgICBjb25zdF9yZWZlcmVuY2UKKyAgICBvcGVyYXRvciooKSBjb25zdAorICAgIHsgcmV0dXJuIF9CaXRfcmVmZXJlbmNlKF9NX3AsIDFVTCA8PCBfTV9vZmZzZXQpOyB9CisKKyAgICBjb25zdF9pdGVyYXRvciYKKyAgICBvcGVyYXRvcisrKCkKKyAgICB7CisgICAgICBfTV9idW1wX3VwKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgY29uc3RfaXRlcmF0b3IKKyAgICBvcGVyYXRvcisrKGludCkKKyAgICB7CisgICAgICBjb25zdF9pdGVyYXRvciBfX3RtcCA9ICp0aGlzOworICAgICAgX01fYnVtcF91cCgpOworICAgICAgcmV0dXJuIF9fdG1wOworICAgIH0KKworICAgIGNvbnN0X2l0ZXJhdG9yJgorICAgIG9wZXJhdG9yLS0oKQorICAgIHsKKyAgICAgIF9NX2J1bXBfZG93bigpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgb3BlcmF0b3ItLShpbnQpCisgICAgeworICAgICAgY29uc3RfaXRlcmF0b3IgX190bXAgPSAqdGhpczsKKyAgICAgIF9NX2J1bXBfZG93bigpOworICAgICAgcmV0dXJuIF9fdG1wOworICAgIH0KKworICAgIGNvbnN0X2l0ZXJhdG9yJgorICAgIG9wZXJhdG9yKz0oZGlmZmVyZW5jZV90eXBlIF9faSkKKyAgICB7CisgICAgICBfTV9pbmNyKF9faSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgY29uc3RfaXRlcmF0b3ImCisgICAgb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgX19pKQorICAgIHsKKyAgICAgICp0aGlzICs9IC1fX2k7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgY29uc3RfaXRlcmF0b3IgCisgICAgb3BlcmF0b3IrKGRpZmZlcmVuY2VfdHlwZSBfX2kpIGNvbnN0CisgICAgeworICAgICAgY29uc3RfaXRlcmF0b3IgX190bXAgPSAqdGhpczsKKyAgICAgIHJldHVybiBfX3RtcCArPSBfX2k7CisgICAgfQorCisgICAgY29uc3RfaXRlcmF0b3IKKyAgICBvcGVyYXRvci0oZGlmZmVyZW5jZV90eXBlIF9faSkgY29uc3QKKyAgICB7CisgICAgICBjb25zdF9pdGVyYXRvciBfX3RtcCA9ICp0aGlzOworICAgICAgcmV0dXJuIF9fdG1wIC09IF9faTsKKyAgICB9CisKKyAgICBjb25zdF9yZWZlcmVuY2UKKyAgICBvcGVyYXRvcltdKGRpZmZlcmVuY2VfdHlwZSBfX2kpIGNvbnN0CisgICAgeyByZXR1cm4gKigqdGhpcyArIF9faSk7IH0KKyAgfTsKKworICBpbmxpbmUgX0JpdF9jb25zdF9pdGVyYXRvcgorICBvcGVyYXRvcisocHRyZGlmZl90IF9fbiwgY29uc3QgX0JpdF9jb25zdF9pdGVyYXRvciYgX194KQorICB7IHJldHVybiBfX3ggKyBfX247IH0KKworICBpbmxpbmUgdm9pZAorICBfX2ZpbGxfYnZlY3RvcihfQml0X2l0ZXJhdG9yIF9fZmlyc3QsIF9CaXRfaXRlcmF0b3IgX19sYXN0LCBib29sIF9feCkKKyAgeworICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgKl9fZmlyc3QgPSBfX3g7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBmaWxsKF9CaXRfaXRlcmF0b3IgX19maXJzdCwgX0JpdF9pdGVyYXRvciBfX2xhc3QsIGNvbnN0IGJvb2wmIF9feCkKKyAgeworICAgIGlmIChfX2ZpcnN0Ll9NX3AgIT0gX19sYXN0Ll9NX3ApCisgICAgICB7CisJc3RkOjpmaWxsKF9fZmlyc3QuX01fcCArIDEsIF9fbGFzdC5fTV9wLCBfX3ggPyB+MCA6IDApOworCV9fZmlsbF9idmVjdG9yKF9fZmlyc3QsIF9CaXRfaXRlcmF0b3IoX19maXJzdC5fTV9wICsgMSwgMCksIF9feCk7CisJX19maWxsX2J2ZWN0b3IoX0JpdF9pdGVyYXRvcihfX2xhc3QuX01fcCwgMCksIF9fbGFzdCwgX194KTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBfX2ZpbGxfYnZlY3RvcihfX2ZpcnN0LCBfX2xhc3QsIF9feCk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IF9CdmVjdG9yX2Jhc2UKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9CaXRfdHlwZT46Om90aGVyCisgICAgICAgIF9CaXRfYWxsb2NfdHlwZTsKKyAgICAgIAorICAgICAgc3RydWN0IF9CdmVjdG9yX2ltcGwKKyAgICAgIDogcHVibGljIF9CaXRfYWxsb2NfdHlwZQorICAgICAgeworCV9CaXRfaXRlcmF0b3IgCV9NX3N0YXJ0OworCV9CaXRfaXRlcmF0b3IgCV9NX2ZpbmlzaDsKKwlfQml0X3R5cGUqIAlfTV9lbmRfb2Zfc3RvcmFnZTsKKworCV9CdmVjdG9yX2ltcGwoKQorCTogX0JpdF9hbGxvY190eXBlKCksIF9NX3N0YXJ0KCksIF9NX2ZpbmlzaCgpLCBfTV9lbmRfb2Zfc3RvcmFnZSgwKQorCXsgfQorIAorCV9CdmVjdG9yX2ltcGwoY29uc3QgX0JpdF9hbGxvY190eXBlJiBfX2EpCisJOiBfQml0X2FsbG9jX3R5cGUoX19hKSwgX01fc3RhcnQoKSwgX01fZmluaXNoKCksIF9NX2VuZF9vZl9zdG9yYWdlKDApCisJeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisJX0J2ZWN0b3JfaW1wbChfQml0X2FsbG9jX3R5cGUmJiBfX2EpCisJOiBfQml0X2FsbG9jX3R5cGUoc3RkOjptb3ZlKF9fYSkpLCBfTV9zdGFydCgpLCBfTV9maW5pc2goKSwKKwkgIF9NX2VuZF9vZl9zdG9yYWdlKDApCisJeyB9CisjZW5kaWYKKyAgICAgIH07CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9BbGxvYyBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgX0JpdF9hbGxvY190eXBlJgorICAgICAgX01fZ2V0X0JpdF9hbGxvY2F0b3IoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PF9CaXRfYWxsb2NfdHlwZSo+KCZ0aGlzLT5fTV9pbXBsKTsgfQorCisgICAgICBjb25zdCBfQml0X2FsbG9jX3R5cGUmCisgICAgICBfTV9nZXRfQml0X2FsbG9jYXRvcigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgX0JpdF9hbGxvY190eXBlKj4oJnRoaXMtPl9NX2ltcGwpOyB9CisKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGFsbG9jYXRvcl90eXBlKF9NX2dldF9CaXRfYWxsb2NhdG9yKCkpOyB9CisKKyAgICAgIF9CdmVjdG9yX2Jhc2UoKQorICAgICAgOiBfTV9pbXBsKCkgeyB9CisgICAgICAKKyAgICAgIF9CdmVjdG9yX2Jhc2UoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogX01faW1wbChfX2EpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgX0J2ZWN0b3JfYmFzZShfQnZlY3Rvcl9iYXNlJiYgX194KSBub2V4Y2VwdAorICAgICAgOiBfTV9pbXBsKHN0ZDo6bW92ZShfX3guX01fZ2V0X0JpdF9hbGxvY2F0b3IoKSkpCisgICAgICB7CisJdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IF9feC5fTV9pbXBsLl9NX3N0YXJ0OworCXRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gX194Ll9NX2ltcGwuX01fZmluaXNoOworCXRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgPSBfX3guX01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZTsKKwlfX3guX01faW1wbC5fTV9zdGFydCA9IF9CaXRfaXRlcmF0b3IoKTsKKwlfX3guX01faW1wbC5fTV9maW5pc2ggPSBfQml0X2l0ZXJhdG9yKCk7CisJX194Ll9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgPSAwOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIH5fQnZlY3Rvcl9iYXNlKCkKKyAgICAgIHsgdGhpcy0+X01fZGVhbGxvY2F0ZSgpOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfQnZlY3Rvcl9pbXBsIF9NX2ltcGw7CisKKyAgICAgIF9CaXRfdHlwZSoKKyAgICAgIF9NX2FsbG9jYXRlKHNpemVfdCBfX24pCisgICAgICB7IHJldHVybiBfTV9pbXBsLmFsbG9jYXRlKF9TX253b3JkKF9fbikpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RlYWxsb2NhdGUoKQorICAgICAgeworCWlmIChfTV9pbXBsLl9NX3N0YXJ0Ll9NX3ApCisJICBfTV9pbXBsLmRlYWxsb2NhdGUoX01faW1wbC5fTV9zdGFydC5fTV9wLAorCQkJICAgICBfTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlIC0gX01faW1wbC5fTV9zdGFydC5fTV9wKTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIHNpemVfdAorICAgICAgX1NfbndvcmQoc2l6ZV90IF9fbikKKyAgICAgIHsgcmV0dXJuIChfX24gKyBpbnQoX1Nfd29yZF9iaXQpIC0gMSkgLyBpbnQoX1Nfd29yZF9iaXQpOyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisvLyBEZWNsYXJlIGEgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBvZiB2ZWN0b3I8VCwgQWxsb2M+LgorI2luY2x1ZGUgPGJpdHMvc3RsX3ZlY3Rvci5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKKworICAvKioKKyAgICogIEBicmllZiAgQSBzcGVjaWFsaXphdGlvbiBvZiB2ZWN0b3IgZm9yIGJvb2xlYW5zIHdoaWNoIG9mZmVycyBmaXhlZCB0aW1lCisgICAqICBhY2Nlc3MgdG8gaW5kaXZpZHVhbCBlbGVtZW50cyBpbiBhbnkgb3JkZXIuCisgICAqCisgICAqICBAaW5ncm91cCBzZXF1ZW5jZXMKKyAgICoKKyAgICogIEB0cGFyYW0gX0FsbG9jICBBbGxvY2F0b3IgdHlwZS4KKyAgICoKKyAgICogIE5vdGUgdGhhdCB2ZWN0b3I8Ym9vbD4gZG9lcyBub3QgYWN0dWFsbHkgbWVldCB0aGUgcmVxdWlyZW1lbnRzIGZvciBiZWluZworICAgKiAgYSBjb250YWluZXIuICBUaGlzIGlzIGJlY2F1c2UgdGhlIHJlZmVyZW5jZSBhbmQgcG9pbnRlciB0eXBlcyBhcmUgbm90CisgICAqICByZWFsbHkgcmVmZXJlbmNlcyBhbmQgcG9pbnRlcnMgdG8gYm9vbC4gIFNlZSBEUjk2IGZvciBkZXRhaWxzLiAgQHNlZQorICAgKiAgdmVjdG9yIGZvciBmdW5jdGlvbiBkb2N1bWVudGF0aW9uLgorICAgKgorICAgKiAgSW4gc29tZSB0ZXJtaW5vbG9neSBhICV2ZWN0b3IgY2FuIGJlIGRlc2NyaWJlZCBhcyBhIGR5bmFtaWMKKyAgICogIEMtc3R5bGUgYXJyYXksIGl0IG9mZmVycyBmYXN0IGFuZCBlZmZpY2llbnQgYWNjZXNzIHRvIGluZGl2aWR1YWwKKyAgICogIGVsZW1lbnRzIGluIGFueSBvcmRlciBhbmQgc2F2ZXMgdGhlIHVzZXIgZnJvbSB3b3JyeWluZyBhYm91dAorICAgKiAgbWVtb3J5IGFuZCBzaXplIGFsbG9jYXRpb24uICBTdWJzY3JpcHRpbmcgKCBAYyBbXSApIGFjY2VzcyBpcworICAgKiAgYWxzbyBwcm92aWRlZCBhcyB3aXRoIEMtc3R5bGUgYXJyYXlzLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICBjbGFzcyB2ZWN0b3I8Ym9vbCwgX0FsbG9jPiA6IHByb3RlY3RlZCBfQnZlY3Rvcl9iYXNlPF9BbGxvYz4KKyAgeworICAgIHR5cGVkZWYgX0J2ZWN0b3JfYmFzZTxfQWxsb2M+CQkJIF9CYXNlOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHRlbXBsYXRlPHR5cGVuYW1lPiBmcmllbmQgc3RydWN0IGhhc2g7CisjZW5kaWYKKworICBwdWJsaWM6CisgICAgdHlwZWRlZiBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgX0JpdF9yZWZlcmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgX0JpdF9yZWZlcmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIGNvbnN0IGJvb2wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiBfQml0X2l0ZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9CaXRfY29uc3RfaXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiAgICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBfQWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAJCSBhbGxvY2F0b3JfdHlwZTsKKworICAgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgIHsgcmV0dXJuIF9CYXNlOjpnZXRfYWxsb2NhdG9yKCk7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgdXNpbmcgX0Jhc2U6Ol9NX2FsbG9jYXRlOworICAgIHVzaW5nIF9CYXNlOjpfTV9kZWFsbG9jYXRlOworICAgIHVzaW5nIF9CYXNlOjpfU19ud29yZDsKKyAgICB1c2luZyBfQmFzZTo6X01fZ2V0X0JpdF9hbGxvY2F0b3I7CisKKyAgcHVibGljOgorICAgIHZlY3RvcigpCisgICAgOiBfQmFzZSgpIHsgfQorCisgICAgZXhwbGljaXQKKyAgICB2ZWN0b3IoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICA6IF9CYXNlKF9fYSkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgZXhwbGljaXQKKyAgICB2ZWN0b3Ioc2l6ZV90eXBlIF9fbiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiB2ZWN0b3IoX19uLCBmYWxzZSwgX19hKQorICAgIHsgfQorCisgICAgdmVjdG9yKHNpemVfdHlwZSBfX24sIGNvbnN0IGJvb2wmIF9fdmFsdWUsIAorCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX0Jhc2UoX19hKQorICAgIHsKKyAgICAgIF9NX2luaXRpYWxpemUoX19uKTsKKyAgICAgIHN0ZDo6ZmlsbCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX3AsIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UsIAorCQlfX3ZhbHVlID8gfjAgOiAwKTsKKyAgICB9CisjZWxzZQorICAgIGV4cGxpY2l0CisgICAgdmVjdG9yKHNpemVfdHlwZSBfX24sIGNvbnN0IGJvb2wmIF9fdmFsdWUgPSBib29sKCksIAorCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX0Jhc2UoX19hKQorICAgIHsKKyAgICAgIF9NX2luaXRpYWxpemUoX19uKTsKKyAgICAgIHN0ZDo6ZmlsbCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX3AsIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UsIAorCQlfX3ZhbHVlID8gfjAgOiAwKTsKKyAgICB9CisjZW5kaWYKKworICAgIHZlY3Rvcihjb25zdCB2ZWN0b3ImIF9feCkKKyAgICA6IF9CYXNlKF9feC5fTV9nZXRfQml0X2FsbG9jYXRvcigpKQorICAgIHsKKyAgICAgIF9NX2luaXRpYWxpemUoX194LnNpemUoKSk7CisgICAgICBfTV9jb3B5X2FsaWduZWQoX194LmJlZ2luKCksIF9feC5lbmQoKSwgdGhpcy0+X01faW1wbC5fTV9zdGFydCk7CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHZlY3Rvcih2ZWN0b3ImJiBfX3gpIG5vZXhjZXB0CisgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSkgeyB9CisKKyAgICB2ZWN0b3IoaW5pdGlhbGl6ZXJfbGlzdDxib29sPiBfX2wsCisJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgOiBfQmFzZShfX2EpCisgICAgeworICAgICAgX01faW5pdGlhbGl6ZV9yYW5nZShfX2wuYmVnaW4oKSwgX19sLmVuZCgpLAorCQkJICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpKTsKKyAgICB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisgICAgICB2ZWN0b3IoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fYSkKKyAgICAgIHsgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9fZmFsc2VfdHlwZSgpKTsgfQorI2Vsc2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZlY3RvcihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hKQorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+OjpfX3R5cGUgX0ludGVncmFsOworCV9NX2luaXRpYWxpemVfZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgICAgICB9CisjZW5kaWYKKworICAgIH52ZWN0b3IoKSBfR0xJQkNYWF9OT0VYQ0VQVCB7IH0KKworICAgIHZlY3RvciYKKyAgICBvcGVyYXRvcj0oY29uc3QgdmVjdG9yJiBfX3gpCisgICAgeworICAgICAgaWYgKCZfX3ggPT0gdGhpcykKKwlyZXR1cm4gKnRoaXM7CisgICAgICBpZiAoX194LnNpemUoKSA+IGNhcGFjaXR5KCkpCisJeworCSAgdGhpcy0+X01fZGVhbGxvY2F0ZSgpOworCSAgX01faW5pdGlhbGl6ZShfX3guc2l6ZSgpKTsKKwl9CisgICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IF9NX2NvcHlfYWxpZ25lZChfX3guYmVnaW4oKSwgX194LmVuZCgpLAorCQkJCQkJYmVnaW4oKSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHZlY3RvciYKKyAgICBvcGVyYXRvcj0odmVjdG9yJiYgX194KQorICAgIHsKKyAgICAgIC8vIE5COiBEUiAxMjA0LgorICAgICAgLy8gTkI6IERSIDY3NS4KKyAgICAgIHRoaXMtPmNsZWFyKCk7CisgICAgICB0aGlzLT5zd2FwKF9feCk7IAorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHZlY3RvciYKKyAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDxib29sPiBfX2wpCisgICAgeworICAgICAgdGhpcy0+YXNzaWduIChfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIGFzc2lnbigpLCBhIGdlbmVyYWxpemVkIGFzc2lnbm1lbnQgbWVtYmVyIGZ1bmN0aW9uLiAgVHdvCisgICAgLy8gdmVyc2lvbnM6IG9uZSB0aGF0IHRha2VzIGEgY291bnQsIGFuZCBvbmUgdGhhdCB0YWtlcyBhIHJhbmdlLgorICAgIC8vIFRoZSByYW5nZSB2ZXJzaW9uIGlzIGEgbWVtYmVyIHRlbXBsYXRlLCBzbyB3ZSBkaXNwYXRjaCBvbiB3aGV0aGVyCisgICAgLy8gb3Igbm90IHRoZSB0eXBlIGlzIGFuIGludGVnZXIuCisgICAgdm9pZAorICAgIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBib29sJiBfX3gpCisgICAgeyBfTV9maWxsX2Fzc2lnbihfX24sIF9feCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisgICAgICB2b2lkCisgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgeyBfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfX2ZhbHNlX3R5cGUoKSk7IH0KKyNlbHNlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+OjpfX3R5cGUgX0ludGVncmFsOworCV9NX2Fzc2lnbl9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyAgICAgIH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHZvaWQKKyAgICBhc3NpZ24oaW5pdGlhbGl6ZXJfbGlzdDxib29sPiBfX2wpCisgICAgeyB0aGlzLT5hc3NpZ24oX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZgorCisgICAgaXRlcmF0b3IKKyAgICBiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9zdGFydDsgfQorCisgICAgY29uc3RfaXRlcmF0b3IKKyAgICBiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9zdGFydDsgfQorCisgICAgaXRlcmF0b3IKKyAgICBlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoOyB9CisKKyAgICBjb25zdF9pdGVyYXRvcgorICAgIGVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9maW5pc2g7IH0KKworICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICByYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgcmJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgIHJlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICByZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgY29uc3RfaXRlcmF0b3IKKyAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQ7IH0KKworICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9maW5pc2g7IH0KKworICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgIGNyZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisjZW5kaWYKKworICAgIHNpemVfdHlwZQorICAgIHNpemUoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIHNpemVfdHlwZShlbmQoKSAtIGJlZ2luKCkpOyB9CisKKyAgICBzaXplX3R5cGUKKyAgICBtYXhfc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9faXNpemUgPQorCV9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxkaWZmZXJlbmNlX3R5cGU+OjpfX21heAorCS0gaW50KF9TX3dvcmRfYml0KSArIDE7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19hc2l6ZSA9IF9NX2dldF9CaXRfYWxsb2NhdG9yKCkubWF4X3NpemUoKTsKKyAgICAgIHJldHVybiAoX19hc2l6ZSA8PSBfX2lzaXplIC8gaW50KF9TX3dvcmRfYml0KQorCSAgICAgID8gX19hc2l6ZSAqIGludChfU193b3JkX2JpdCkgOiBfX2lzaXplKTsKKyAgICB9CisKKyAgICBzaXplX3R5cGUKKyAgICBjYXBhY2l0eSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gc2l6ZV90eXBlKGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UsIDApCisJCSAgICAgICAtIGJlZ2luKCkpOyB9CisKKyAgICBib29sCisgICAgZW1wdHkoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIGJlZ2luKCkgPT0gZW5kKCk7IH0KKworICAgIHJlZmVyZW5jZQorICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICByZXR1cm4gKml0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fcAorCQkgICAgICAgKyBfX24gLyBpbnQoX1Nfd29yZF9iaXQpLCBfX24gJSBpbnQoX1Nfd29yZF9iaXQpKTsKKyAgICB9CisKKyAgICBjb25zdF9yZWZlcmVuY2UKKyAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuICpjb25zdF9pdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX3AKKwkJCSAgICAgKyBfX24gLyBpbnQoX1Nfd29yZF9iaXQpLCBfX24gJSBpbnQoX1Nfd29yZF9iaXQpKTsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQKKyAgICBfTV9yYW5nZV9jaGVjayhzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChfX24gPj0gdGhpcy0+c2l6ZSgpKQorICAgICAgICBfX3Rocm93X291dF9vZl9yYW5nZShfX04oInZlY3Rvcjxib29sPjo6X01fcmFuZ2VfY2hlY2siKSk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICByZWZlcmVuY2UKKyAgICBhdChzaXplX3R5cGUgX19uKQorICAgIHsgX01fcmFuZ2VfY2hlY2soX19uKTsgcmV0dXJuICgqdGhpcylbX19uXTsgfQorCisgICAgY29uc3RfcmVmZXJlbmNlCisgICAgYXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7IF9NX3JhbmdlX2NoZWNrKF9fbik7IHJldHVybiAoKnRoaXMpW19fbl07IH0KKworICAgIHZvaWQKKyAgICByZXNlcnZlKHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgaWYgKF9fbiA+IG1heF9zaXplKCkpCisJX190aHJvd19sZW5ndGhfZXJyb3IoX19OKCJ2ZWN0b3I6OnJlc2VydmUiKSk7CisgICAgICBpZiAoY2FwYWNpdHkoKSA8IF9fbikKKwlfTV9yZWFsbG9jYXRlKF9fbik7CisgICAgfQorCisgICAgcmVmZXJlbmNlCisgICAgZnJvbnQoKQorICAgIHsgcmV0dXJuICpiZWdpbigpOyB9CisKKyAgICBjb25zdF9yZWZlcmVuY2UKKyAgICBmcm9udCgpIGNvbnN0CisgICAgeyByZXR1cm4gKmJlZ2luKCk7IH0KKworICAgIHJlZmVyZW5jZQorICAgIGJhY2soKQorICAgIHsgcmV0dXJuICooZW5kKCkgLSAxKTsgfQorCisgICAgY29uc3RfcmVmZXJlbmNlCisgICAgYmFjaygpIGNvbnN0CisgICAgeyByZXR1cm4gKihlbmQoKSAtIDEpOyB9CisKKyAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgLy8gRFIgNDY0LiBTdWdnZXN0aW9uIGZvciBuZXcgbWVtYmVyIGZ1bmN0aW9ucyBpbiBzdGFuZGFyZCBjb250YWluZXJzLgorICAgIC8vIE4uQi4gRFIgNDY0IHNheXMgbm90aGluZyBhYm91dCB2ZWN0b3I8Ym9vbD4gYnV0IHdlIG5lZWQgc29tZXRoaW5nCisgICAgLy8gaGVyZSBkdWUgdG8gdGhlIHdheSB3ZSBhcmUgaW1wbGVtZW50aW5nIERSIDQ2NCBpbiB0aGUgZGVidWctbW9kZQorICAgIC8vIHZlY3RvciBjbGFzcy4KKyAgICB2b2lkCisgICAgZGF0YSgpIF9HTElCQ1hYX05PRVhDRVBUIHsgfQorCisgICAgdm9pZAorICAgIHB1c2hfYmFjayhib29sIF9feCkKKyAgICB7CisgICAgICBpZiAodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fcCAhPSB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlKQorICAgICAgICAqdGhpcy0+X01faW1wbC5fTV9maW5pc2grKyA9IF9feDsKKyAgICAgIGVsc2UKKyAgICAgICAgX01faW5zZXJ0X2F1eChlbmQoKSwgX194KTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgc3dhcCh2ZWN0b3ImIF9feCkKKyAgICB7CisgICAgICBzdGQ6OnN3YXAodGhpcy0+X01faW1wbC5fTV9zdGFydCwgX194Ll9NX2ltcGwuX01fc3RhcnQpOworICAgICAgc3RkOjpzd2FwKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLCBfX3guX01faW1wbC5fTV9maW5pc2gpOworICAgICAgc3RkOjpzd2FwKHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UsIAorCQlfX3guX01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSk7CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQzMS4gU3dhcHBpbmcgY29udGFpbmVycyB3aXRoIHVuZXF1YWwgYWxsb2NhdG9ycy4KKyAgICAgIHN0ZDo6X19hbGxvY19zd2FwPHR5cGVuYW1lIF9CYXNlOjpfQml0X2FsbG9jX3R5cGU+OjoKKwlfU19kb19pdChfTV9nZXRfQml0X2FsbG9jYXRvcigpLCBfX3guX01fZ2V0X0JpdF9hbGxvY2F0b3IoKSk7CisgICAgfQorCisgICAgLy8gWzIzLjIuNV0vMSwgdGhpcmQtdG8tbGFzdCBlbnRyeSBpbiBzeW5vcHNpcyBsaXN0aW5nCisgICAgc3RhdGljIHZvaWQKKyAgICBzd2FwKHJlZmVyZW5jZSBfX3gsIHJlZmVyZW5jZSBfX3kpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgYm9vbCBfX3RtcCA9IF9feDsKKyAgICAgIF9feCA9IF9feTsKKyAgICAgIF9feSA9IF9fdG1wOworICAgIH0KKworICAgIGl0ZXJhdG9yCisgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IGJvb2wmIF9feCA9IGJvb2woKSkKKyAgICB7CisgICAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19uID0gX19wb3NpdGlvbiAtIGJlZ2luKCk7CisgICAgICBpZiAodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fcCAhPSB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJICAmJiBfX3Bvc2l0aW9uID09IGVuZCgpKQorICAgICAgICAqdGhpcy0+X01faW1wbC5fTV9maW5pc2grKyA9IF9feDsKKyAgICAgIGVsc2UKKyAgICAgICAgX01faW5zZXJ0X2F1eChfX3Bvc2l0aW9uLCBfX3gpOworICAgICAgcmV0dXJuIGJlZ2luKCkgKyBfX247CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLAorCSAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgeyBfTV9pbnNlcnRfZGlzcGF0Y2goX19wb3NpdGlvbiwgX19maXJzdCwgX19sYXN0LCBfX2ZhbHNlX3R5cGUoKSk7IH0KKyNlbHNlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwKKwkgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19pc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9yPjo6X190eXBlIF9JbnRlZ3JhbDsKKwlfTV9pbnNlcnRfZGlzcGF0Y2goX19wb3NpdGlvbiwgX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgICAgICB9CisjZW5kaWYKKworICAgIHZvaWQKKyAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBlIF9fbiwgY29uc3QgYm9vbCYgX194KQorICAgIHsgX01fZmlsbF9pbnNlcnQoX19wb3NpdGlvbiwgX19uLCBfX3gpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wLCBpbml0aWFsaXplcl9saXN0PGJvb2w+IF9fbCkKKyAgICB7IHRoaXMtPmluc2VydChfX3AsIF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYKKworICAgIHZvaWQKKyAgICBwb3BfYmFjaygpCisgICAgeyAtLXRoaXMtPl9NX2ltcGwuX01fZmluaXNoOyB9CisKKyAgICBpdGVyYXRvcgorICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgeworICAgICAgaWYgKF9fcG9zaXRpb24gKyAxICE9IGVuZCgpKQorICAgICAgICBzdGQ6OmNvcHkoX19wb3NpdGlvbiArIDEsIGVuZCgpLCBfX3Bvc2l0aW9uKTsKKyAgICAgIC0tdGhpcy0+X01faW1wbC5fTV9maW5pc2g7CisgICAgICByZXR1cm4gX19wb3NpdGlvbjsKKyAgICB9CisKKyAgICBpdGVyYXRvcgorICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisJX01fZXJhc2VfYXRfZW5kKHN0ZDo6Y29weShfX2xhc3QsIGVuZCgpLCBfX2ZpcnN0KSk7CisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICB9CisKKyAgICB2b2lkCisgICAgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBib29sIF9feCA9IGJvb2woKSkKKyAgICB7CisgICAgICBpZiAoX19uZXdfc2l6ZSA8IHNpemUoKSkKKyAgICAgICAgX01fZXJhc2VfYXRfZW5kKGJlZ2luKCkgKyBkaWZmZXJlbmNlX3R5cGUoX19uZXdfc2l6ZSkpOworICAgICAgZWxzZQorICAgICAgICBpbnNlcnQoZW5kKCksIF9fbmV3X3NpemUgLSBzaXplKCksIF9feCk7CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHZvaWQKKyAgICBzaHJpbmtfdG9fZml0KCkKKyAgICB7IF9NX3Nocmlua190b19maXQoKTsgfQorI2VuZGlmCisKKyAgICB2b2lkCisgICAgZmxpcCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgZm9yIChfQml0X3R5cGUgKiBfX3AgPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX3A7CisJICAgX19wICE9IHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2U7ICsrX19wKQorICAgICAgICAqX19wID0gfipfX3A7CisgICAgfQorCisgICAgdm9pZAorICAgIGNsZWFyKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IF9NX2VyYXNlX2F0X2VuZChiZWdpbigpKTsgfQorCisgICAKKyAgcHJvdGVjdGVkOgorICAgIC8vIFByZWNvbmRpdGlvbjogX19maXJzdC5fTV9vZmZzZXQgPT0gMCAmJiBfX3Jlc3VsdC5fTV9vZmZzZXQgPT0gMC4KKyAgICBpdGVyYXRvcgorICAgIF9NX2NvcHlfYWxpZ25lZChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QsCisJCSAgICBpdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICBfQml0X3R5cGUqIF9fcSA9IHN0ZDo6Y29weShfX2ZpcnN0Ll9NX3AsIF9fbGFzdC5fTV9wLCBfX3Jlc3VsdC5fTV9wKTsKKyAgICAgIHJldHVybiBzdGQ6OmNvcHkoY29uc3RfaXRlcmF0b3IoX19sYXN0Ll9NX3AsIDApLCBfX2xhc3QsCisJCSAgICAgICBpdGVyYXRvcihfX3EsIDApKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX01faW5pdGlhbGl6ZShzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIF9CaXRfdHlwZSogX19xID0gdGhpcy0+X01fYWxsb2NhdGUoX19uKTsKKyAgICAgIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgPSBfX3EgKyBfU19ud29yZChfX24pOworICAgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IGl0ZXJhdG9yKF9fcSwgMCk7CisgICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBkaWZmZXJlbmNlX3R5cGUoX19uKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX01fcmVhbGxvY2F0ZShzaXplX3R5cGUgX19uKTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICBib29sCisgICAgX01fc2hyaW5rX3RvX2ZpdCgpOworI2VuZGlmCisKKyAgICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKworICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAvLyA0MzguIEFtYmlndWl0eSBpbiB0aGUgImRvIHRoZSByaWdodCB0aGluZyIgY2xhdXNlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVnZXI+CisgICAgICB2b2lkCisgICAgICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LCBfX3RydWVfdHlwZSkKKyAgICAgIHsKKwlfTV9pbml0aWFsaXplKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19uKSk7CisJc3RkOjpmaWxsKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fcCwgCisJCSAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSwgX194ID8gfjAgOiAwKTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgdm9pZCAKKyAgICAgIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkJICAgICBfX2ZhbHNlX3R5cGUpCisgICAgICB7IF9NX2luaXRpYWxpemVfcmFuZ2UoX19maXJzdCwgX19sYXN0LCAKKwkJCSAgICBzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdCkpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2luaXRpYWxpemVfcmFuZ2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkJICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKwlmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwkgIHB1c2hfYmFjaygqX19maXJzdCk7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgX01faW5pdGlhbGl6ZV9yYW5nZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkJICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgICAgeworCWNvbnN0IHNpemVfdHlwZSBfX24gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisJX01faW5pdGlhbGl6ZShfX24pOworCXN0ZDo6Y29weShfX2ZpcnN0LCBfX2xhc3QsIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOworICAgICAgfQorCisgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgIC8vIDQzOC4gQW1iaWd1aXR5IGluIHRoZSAiZG8gdGhlIHJpZ2h0IHRoaW5nIiBjbGF1c2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZWdlcj4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsLCBfX3RydWVfdHlwZSkKKyAgICAgIHsgX01fZmlsbF9hc3NpZ24oX19uLCBfX3ZhbCk7IH0KKworICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSBfX2ZhbHNlX3R5cGUpCisgICAgICB7IF9NX2Fzc2lnbl9hdXgoX19maXJzdCwgX19sYXN0LCBzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdCkpOyB9CisKKyAgICB2b2lkCisgICAgX01fZmlsbF9hc3NpZ24oc2l6ZV90IF9fbiwgYm9vbCBfX3gpCisgICAgeworICAgICAgaWYgKF9fbiA+IHNpemUoKSkKKwl7CisJICBzdGQ6OmZpbGwodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9wLCAKKwkJICAgIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UsIF9feCA/IH4wIDogMCk7CisJICBpbnNlcnQoZW5kKCksIF9fbiAtIHNpemUoKSwgX194KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgX01fZXJhc2VfYXRfZW5kKGJlZ2luKCkgKyBfX24pOworCSAgc3RkOjpmaWxsKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fcCwgCisJCSAgICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlLCBfX3ggPyB+MCA6IDApOworCX0KKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2Fzc2lnbl9hdXgoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgICAgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpCisgICAgICB7CisJaXRlcmF0b3IgX19jdXIgPSBiZWdpbigpOworCWZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdCAmJiBfX2N1ciAhPSBlbmQoKTsgKytfX2N1ciwgKytfX2ZpcnN0KQorCSAgKl9fY3VyID0gKl9fZmlyc3Q7CisJaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCSAgX01fZXJhc2VfYXRfZW5kKF9fY3VyKTsKKwllbHNlCisJICBpbnNlcnQoZW5kKCksIF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2Fzc2lnbl9hdXgoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgICB7CisJY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworCWlmIChfX2xlbiA8IHNpemUoKSkKKwkgIF9NX2VyYXNlX2F0X2VuZChzdGQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBiZWdpbigpKSk7CisJZWxzZQorCSAgeworCSAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkID0gX19maXJzdDsKKwkgICAgc3RkOjphZHZhbmNlKF9fbWlkLCBzaXplKCkpOworCSAgICBzdGQ6OmNvcHkoX19maXJzdCwgX19taWQsIGJlZ2luKCkpOworCSAgICBpbnNlcnQoZW5kKCksIF9fbWlkLCBfX2xhc3QpOworCSAgfQorICAgICAgfQorCisgICAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCisKKyAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgLy8gNDM4LiBBbWJpZ3VpdHkgaW4gdGhlICJkbyB0aGUgcmlnaHQgdGhpbmciIGNsYXVzZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlZ2VyPgorICAgICAgdm9pZAorICAgICAgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLCBfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwKKwkJCSBfX3RydWVfdHlwZSkKKyAgICAgIHsgX01fZmlsbF9pbnNlcnQoX19wb3MsIF9fbiwgX194KTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsCisJCQkgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkJIF9fZmFsc2VfdHlwZSkKKyAgICAgIHsgX01faW5zZXJ0X3JhbmdlKF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsCisJCQlzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdCkpOyB9CisKKyAgICB2b2lkCisgICAgX01fZmlsbF9pbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBlIF9fbiwgYm9vbCBfX3gpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBfTV9pbnNlcnRfcmFuZ2UoaXRlcmF0b3IgX19wb3MsIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIAorCQkgICAgICBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKQorICAgICAgeworCWZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCSAgeworCSAgICBfX3BvcyA9IGluc2VydChfX3BvcywgKl9fZmlyc3QpOworCSAgICArK19fcG9zOworCSAgfQorICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2luc2VydF9yYW5nZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIAorCQkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyk7CisKKyAgICB2b2lkCisgICAgX01faW5zZXJ0X2F1eChpdGVyYXRvciBfX3Bvc2l0aW9uLCBib29sIF9feCk7CisKKyAgICBzaXplX3R5cGUKKyAgICBfTV9jaGVja19sZW4oc2l6ZV90eXBlIF9fbiwgY29uc3QgY2hhciogX19zKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChtYXhfc2l6ZSgpIC0gc2l6ZSgpIDwgX19uKQorCV9fdGhyb3dfbGVuZ3RoX2Vycm9yKF9fTihfX3MpKTsKKworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc2l6ZSgpICsgc3RkOjptYXgoc2l6ZSgpLCBfX24pOworICAgICAgcmV0dXJuIChfX2xlbiA8IHNpemUoKSB8fCBfX2xlbiA+IG1heF9zaXplKCkpID8gbWF4X3NpemUoKSA6IF9fbGVuOworICAgIH0KKworICAgIHZvaWQKKyAgICBfTV9lcmFzZV9hdF9lbmQoaXRlcmF0b3IgX19wb3MpCisgICAgeyB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IF9fcG9zOyB9CisgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworI2luY2x1ZGUgPGJpdHMvZnVuY3Rpb25hbF9oYXNoLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBEUiAxMTgyLgorICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciB2ZWN0b3I8Ym9vbD4uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgaGFzaDxfR0xJQkNYWF9TVERfQzo6dmVjdG9yPGJvb2wsIF9BbGxvYz4+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBfR0xJQkNYWF9TVERfQzo6dmVjdG9yPGJvb2wsIF9BbGxvYz4+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9HTElCQ1hYX1NURF9DOjp2ZWN0b3I8Ym9vbCwgX0FsbG9jPiYpIGNvbnN0IG5vZXhjZXB0OworICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfS8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8vIEMrKzExCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9jb25zdHJ1Y3QuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfY29uc3RydWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE4NjNlNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfY29uc3RydWN0LmgKQEAgLTAsMCArMSwxNTggQEAKKy8vIG5vbnN0YW5kYXJkIGNvbnN0cnVjdCBhbmQgZGVzdHJveSBmdW5jdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX2NvbnN0cnVjdC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bWVtb3J5fQorICovCisKKyNpZm5kZWYgX1NUTF9DT05TVFJVQ1RfSAorI2RlZmluZSBfU1RMX0NPTlNUUlVDVF9IIDEKKworI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxiaXRzL21vdmUuaD4KKyNpbmNsdWRlIDxleHQvYWxsb2NfdHJhaXRzLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhbiBvYmplY3QgaW4gZXhpc3RpbmcgbWVtb3J5IGJ5IGludm9raW5nIGFuIGFsbG9jYXRlZAorICAgKiBvYmplY3QncyBjb25zdHJ1Y3RvciB3aXRoIGFuIGluaXRpYWxpemVyLgorICAgKi8KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgaW5saW5lIHZvaWQKKyAgICBfQ29uc3RydWN0KF9UMSogX19wLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICB7IDo6bmV3KHN0YXRpY19jYXN0PHZvaWQqPihfX3ApKSBfVDEoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgICAgaW5saW5lIHZvaWQKKyAgICBfQ29uc3RydWN0KF9UMSogX19wLCBjb25zdCBfVDImIF9fdmFsdWUpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDAyLiB3cm9uZyBuZXcgZXhwcmVzc2lvbiBpbiBbc29tZV9dYWxsb2NhdG9yOjpjb25zdHJ1Y3QKKyAgICAgIDo6bmV3KHN0YXRpY19jYXN0PHZvaWQqPihfX3ApKSBfVDEoX192YWx1ZSk7CisgICAgfQorI2VuZGlmCisKKyAgLyoqCisgICAqIERlc3Ryb3kgdGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5IGEgcG9pbnRlciB0eXBlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX0Rlc3Ryb3koX1RwKiBfX3BvaW50ZXIpCisgICAgeyBfX3BvaW50ZXItPn5fVHAoKTsgfQorCisgIHRlbXBsYXRlPGJvb2w+CisgICAgc3RydWN0IF9EZXN0cm95X2F1eAorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHN0YXRpYyB2b2lkCisgICAgICAgIF9fZGVzdHJveShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQorCXsKKwkgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCSAgICBzdGQ6Ol9EZXN0cm95KHN0ZDo6X19hZGRyZXNzb2YoKl9fZmlyc3QpKTsKKwl9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9EZXN0cm95X2F1eDx0cnVlPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHN0YXRpYyB2b2lkCisgICAgICAgIF9fZGVzdHJveShfRm9yd2FyZEl0ZXJhdG9yLCBfRm9yd2FyZEl0ZXJhdG9yKSB7IH0KKyAgICB9OworCisgIC8qKgorICAgKiBEZXN0cm95IGEgcmFuZ2Ugb2Ygb2JqZWN0cy4gIElmIHRoZSB2YWx1ZV90eXBlIG9mIHRoZSBvYmplY3QgaGFzCisgICAqIGEgdHJpdmlhbCBkZXN0cnVjdG9yLCB0aGUgY29tcGlsZXIgc2hvdWxkIG9wdGltaXplIGFsbCBvZiB0aGlzCisgICAqIGF3YXksIG90aGVyd2lzZSB0aGUgb2JqZWN0cycgZGVzdHJ1Y3RvcnMgbXVzdCBiZSBpbnZva2VkLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9EZXN0cm95KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgX1ZhbHVlX3R5cGU7CisgICAgICBzdGQ6Ol9EZXN0cm95X2F1eDxfX2hhc190cml2aWFsX2Rlc3RydWN0b3IoX1ZhbHVlX3R5cGUpPjo6CisJX19kZXN0cm95KF9fZmlyc3QsIF9fbGFzdCk7CisgICAgfQorCisgIC8qKgorICAgKiBEZXN0cm95IGEgcmFuZ2Ugb2Ygb2JqZWN0cyB1c2luZyB0aGUgc3VwcGxpZWQgYWxsb2NhdG9yLiAgRm9yCisgICAqIG5vbmRlZmF1bHQgYWxsb2NhdG9ycyB3ZSBkbyBub3Qgb3B0aW1pemUgYXdheSBpbnZvY2F0aW9uIG9mIAorICAgKiBkZXN0cm95KCkgZXZlbiBpZiBfVHAgaGFzIGEgdHJpdmlhbCBkZXN0cnVjdG9yLgorICAgKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIHZvaWQKKyAgICBfRGVzdHJveShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCSAgICAgX0FsbG9jYXRvciYgX19hbGxvYykKKyAgICB7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6X19hbGxvY190cmFpdHM8X0FsbG9jYXRvcj4gX190cmFpdHM7CisgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwlfX3RyYWl0czo6ZGVzdHJveShfX2FsbG9jLCBzdGQ6Ol9fYWRkcmVzc29mKCpfX2ZpcnN0KSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9EZXN0cm95KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJICAgICBhbGxvY2F0b3I8X1RwPiYpCisgICAgeworICAgICAgX0Rlc3Ryb3koX19maXJzdCwgX19sYXN0KTsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvKiBfU1RMX0NPTlNUUlVDVF9IICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfZGVxdWUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfZGVxdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDdiYzRkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9kZXF1ZS5oCkBAIC0wLDAgKzEsMjAxOSBAQAorLy8gRGVxdWUgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9kZXF1ZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZGVxdWV9CisgKi8KKworI2lmbmRlZiBfU1RMX0RFUVVFX0gKKyNkZWZpbmUgX1NUTF9ERVFVRV9IIDEKKworI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9pdGVyYXRvcl9iYXNlX2Z1bmNzLmg+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyAgLyoqCisgICAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBjb250cm9scyB0aGUgc2l6ZSBvZiBtZW1vcnkgbm9kZXMuCisgICAqICBAcGFyYW0gIF9fc2l6ZSAgVGhlIHNpemUgb2YgYW4gZWxlbWVudC4KKyAgICogIEByZXR1cm4gICBUaGUgbnVtYmVyIChub3QgYnl0ZSBzaXplKSBvZiBlbGVtZW50cyBwZXIgbm9kZS4KKyAgICoKKyAgICogIFRoaXMgZnVuY3Rpb24gc3RhcnRlZCBvZmYgYXMgYSBjb21waWxlciBrbHVkZ2UgZnJvbSBTR0ksIGJ1dAorICAgKiAgc2VlbXMgdG8gYmUgYSB1c2VmdWwgd3JhcHBlciBhcm91bmQgYSByZXBlYXRlZCBjb25zdGFudAorICAgKiAgZXhwcmVzc2lvbi4gIFRoZSBAYiA1MTIgaXMgdHVuYWJsZSAoYW5kIG5vIG90aGVyIGNvZGUgbmVlZHMgdG8KKyAgICogIGNoYW5nZSksIGJ1dCBubyBpbnZlc3RpZ2F0aW9uIGhhcyBiZWVuIGRvbmUgc2luY2UgaW5oZXJpdGluZyB0aGUKKyAgICogIFNHSSBjb2RlLiAgVG91Y2ggX0dMSUJDWFhfREVRVUVfQlVGX1NJWkUgb25seSBpZiB5b3Uga25vdyB3aGF0CisgICAqICB5b3UgYXJlIGRvaW5nLCBob3dldmVyOiBjaGFuZ2luZyBpdCBicmVha3MgdGhlIGJpbmFyeQorICAgKiAgY29tcGF0aWJpbGl0eSEhCisgICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVRVUVfQlVGX1NJWkUKKyNkZWZpbmUgX0dMSUJDWFhfREVRVUVfQlVGX1NJWkUgNTEyCisjZW5kaWYKKworICBpbmxpbmUgc2l6ZV90CisgIF9fZGVxdWVfYnVmX3NpemUoc2l6ZV90IF9fc2l6ZSkKKyAgeyByZXR1cm4gKF9fc2l6ZSA8IF9HTElCQ1hYX0RFUVVFX0JVRl9TSVpFCisJICAgID8gc2l6ZV90KF9HTElCQ1hYX0RFUVVFX0JVRl9TSVpFIC8gX19zaXplKSA6IHNpemVfdCgxKSk7IH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmIEEgZGVxdWU6Oml0ZXJhdG9yLgorICAgKgorICAgKiAgUXVpdGUgYSBiaXQgb2YgaW50ZWxsaWdlbmNlIGhlcmUuICBNdWNoIG9mIHRoZSBmdW5jdGlvbmFsaXR5IG9mCisgICAqICBkZXF1ZSBpcyBhY3R1YWxseSBwYXNzZWQgb2ZmIHRvIHRoaXMgY2xhc3MuICBBIGRlcXVlIGhvbGRzIHR3bworICAgKiAgb2YgdGhlc2UgaW50ZXJuYWxseSwgbWFya2luZyBpdHMgdmFsaWQgcmFuZ2UuICBBY2Nlc3MgdG8KKyAgICogIGVsZW1lbnRzIGlzIGRvbmUgYXMgb2Zmc2V0cyBvZiBlaXRoZXIgb2YgdGhvc2UgdHdvLCByZWx5aW5nIG9uCisgICAqICBvcGVyYXRvciBvdmVybG9hZGluZyBpbiB0aGlzIGNsYXNzLgorICAgKgorICAgKiAgQWxsIHRoZSBmdW5jdGlvbnMgYXJlIG9wIG92ZXJsb2FkcyBleGNlcHQgZm9yIF9NX3NldF9ub2RlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9SZWYsIHR5cGVuYW1lIF9QdHI+CisgICAgc3RydWN0IF9EZXF1ZV9pdGVyYXRvcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4gICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+IGNvbnN0X2l0ZXJhdG9yOworCisgICAgICBzdGF0aWMgc2l6ZV90IF9TX2J1ZmZlcl9zaXplKCkKKyAgICAgIHsgcmV0dXJuIF9fZGVxdWVfYnVmX3NpemUoc2l6ZW9mKF9UcCkpOyB9CisKKyAgICAgIHR5cGVkZWYgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfUHRyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIF9SZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCoqICAgICAgICAgICAgICAgICAgICAgICAgICAgX01hcF9wb2ludGVyOworICAgICAgdHlwZWRlZiBfRGVxdWVfaXRlcmF0b3IgICAgICAgICAgICAgICAgIF9TZWxmOworCisgICAgICBfVHAqIF9NX2N1cjsKKyAgICAgIF9UcCogX01fZmlyc3Q7CisgICAgICBfVHAqIF9NX2xhc3Q7CisgICAgICBfTWFwX3BvaW50ZXIgX01fbm9kZTsKKworICAgICAgX0RlcXVlX2l0ZXJhdG9yKF9UcCogX194LCBfTWFwX3BvaW50ZXIgX195KQorICAgICAgOiBfTV9jdXIoX194KSwgX01fZmlyc3QoKl9feSksCisgICAgICAgIF9NX2xhc3QoKl9feSArIF9TX2J1ZmZlcl9zaXplKCkpLCBfTV9ub2RlKF9feSkgeyB9CisKKyAgICAgIF9EZXF1ZV9pdGVyYXRvcigpCisgICAgICA6IF9NX2N1cigwKSwgX01fZmlyc3QoMCksIF9NX2xhc3QoMCksIF9NX25vZGUoMCkgeyB9CisKKyAgICAgIF9EZXF1ZV9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX194KQorICAgICAgOiBfTV9jdXIoX194Ll9NX2N1ciksIF9NX2ZpcnN0KF9feC5fTV9maXJzdCksCisgICAgICAgIF9NX2xhc3QoX194Ll9NX2xhc3QpLCBfTV9ub2RlKF9feC5fTV9ub2RlKSB7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gKl9NX2N1cjsgfQorCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2N1cjsgfQorCisgICAgICBfU2VsZiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCSsrX01fY3VyOworCWlmIChfTV9jdXIgPT0gX01fbGFzdCkKKwkgIHsKKwkgICAgX01fc2V0X25vZGUoX01fbm9kZSArIDEpOworCSAgICBfTV9jdXIgPSBfTV9maXJzdDsKKwkgIH0KKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9TZWxmCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlfU2VsZiBfX3RtcCA9ICp0aGlzOworCSsrKnRoaXM7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICBfU2VsZiYKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeworCWlmIChfTV9jdXIgPT0gX01fZmlyc3QpCisJICB7CisJICAgIF9NX3NldF9ub2RlKF9NX25vZGUgLSAxKTsKKwkgICAgX01fY3VyID0gX01fbGFzdDsKKwkgIH0KKwktLV9NX2N1cjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9TZWxmCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsKKwlfU2VsZiBfX3RtcCA9ICp0aGlzOworCS0tKnRoaXM7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICBfU2VsZiYKKyAgICAgIG9wZXJhdG9yKz0oZGlmZmVyZW5jZV90eXBlIF9fbikKKyAgICAgIHsKKwljb25zdCBkaWZmZXJlbmNlX3R5cGUgX19vZmZzZXQgPSBfX24gKyAoX01fY3VyIC0gX01fZmlyc3QpOworCWlmIChfX29mZnNldCA+PSAwICYmIF9fb2Zmc2V0IDwgZGlmZmVyZW5jZV90eXBlKF9TX2J1ZmZlcl9zaXplKCkpKQorCSAgX01fY3VyICs9IF9fbjsKKwllbHNlCisJICB7CisJICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX25vZGVfb2Zmc2V0ID0KKwkgICAgICBfX29mZnNldCA+IDAgPyBfX29mZnNldCAvIGRpZmZlcmVuY2VfdHlwZShfU19idWZmZXJfc2l6ZSgpKQorCSAgICAgICAgICAgICAgICAgICA6IC1kaWZmZXJlbmNlX3R5cGUoKC1fX29mZnNldCAtIDEpCisJCQkJCSAgICAgIC8gX1NfYnVmZmVyX3NpemUoKSkgLSAxOworCSAgICBfTV9zZXRfbm9kZShfTV9ub2RlICsgX19ub2RlX29mZnNldCk7CisJICAgIF9NX2N1ciA9IF9NX2ZpcnN0ICsgKF9fb2Zmc2V0IC0gX19ub2RlX29mZnNldAorCQkJCSAqIGRpZmZlcmVuY2VfdHlwZShfU19idWZmZXJfc2l6ZSgpKSk7CisJICB9CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfU2VsZgorICAgICAgb3BlcmF0b3IrKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0CisgICAgICB7CisJX1NlbGYgX190bXAgPSAqdGhpczsKKwlyZXR1cm4gX190bXAgKz0gX19uOworICAgICAgfQorCisgICAgICBfU2VsZiYKKyAgICAgIG9wZXJhdG9yLT0oZGlmZmVyZW5jZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuICp0aGlzICs9IC1fX247IH0KKworICAgICAgX1NlbGYKKyAgICAgIG9wZXJhdG9yLShkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdAorICAgICAgeworCV9TZWxmIF9fdG1wID0gKnRoaXM7CisJcmV0dXJuIF9fdG1wIC09IF9fbjsKKyAgICAgIH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiAqKCp0aGlzICsgX19uKTsgfQorCisgICAgICAvKiogCisgICAgICAgKiAgUHJlcGFyZXMgdG8gdHJhdmVyc2UgbmV3X25vZGUuICBTZXRzIGV2ZXJ5dGhpbmcgZXhjZXB0CisgICAgICAgKiAgX01fY3VyLCB3aGljaCBzaG91bGQgdGhlcmVmb3JlIGJlIHNldCBieSB0aGUgY2FsbGVyCisgICAgICAgKiAgaW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkcywgYmFzZWQgb24gX01fZmlyc3QgYW5kIF9NX2xhc3QuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIF9NX3NldF9ub2RlKF9NYXBfcG9pbnRlciBfX25ld19ub2RlKQorICAgICAgeworCV9NX25vZGUgPSBfX25ld19ub2RlOworCV9NX2ZpcnN0ID0gKl9fbmV3X25vZGU7CisJX01fbGFzdCA9IF9NX2ZpcnN0ICsgZGlmZmVyZW5jZV90eXBlKF9TX2J1ZmZlcl9zaXplKCkpOworICAgICAgfQorICAgIH07CisKKyAgLy8gTm90ZTogd2UgYWxzbyBwcm92aWRlIG92ZXJsb2FkcyB3aG9zZSBvcGVyYW5kcyBhcmUgb2YgdGhlIHNhbWUgdHlwZSBpbgorICAvLyBvcmRlciB0byBhdm9pZCBhbWJpZ3VvdXMgb3ZlcmxvYWQgcmVzb2x1dGlvbiB3aGVuIHN0ZDo6cmVsX29wcyBvcGVyYXRvcnMKKyAgLy8gYXJlIGluIHNjb3BlIChmb3IgYWRkaXRpb25hbCBkZXRhaWxzLCBzZWUgbGlic3RkYysrLzM2MjgpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1JlZiwgdHlwZW5hbWUgX1B0cj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj4mIF9feCwKKwkgICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fY3VyID09IF9feS5fTV9jdXI7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9SZWZMLCB0eXBlbmFtZSBfUHRyTCwKKwkgICB0eXBlbmFtZSBfUmVmUiwgdHlwZW5hbWUgX1B0clI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWZMLCBfUHRyTD4mIF9feCwKKwkgICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZlIsIF9QdHJSPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9jdXIgPT0gX195Ll9NX2N1cjsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1JlZiwgdHlwZW5hbWUgX1B0cj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj4mIF9feCwKKwkgICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUmVmTCwgdHlwZW5hbWUgX1B0ckwsCisJICAgdHlwZW5hbWUgX1JlZlIsIHR5cGVuYW1lIF9QdHJSPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmTCwgX1B0ckw+JiBfX3gsCisJICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWZSLCBfUHRyUj4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUmVmLCB0eXBlbmFtZSBfUHRyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWYsIF9QdHI+JiBfX3gsCisJICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj4mIF9feSkKKyAgICB7IHJldHVybiAoX194Ll9NX25vZGUgPT0gX195Ll9NX25vZGUpID8gKF9feC5fTV9jdXIgPCBfX3kuX01fY3VyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoX194Ll9NX25vZGUgPCBfX3kuX01fbm9kZSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9SZWZMLCB0eXBlbmFtZSBfUHRyTCwKKwkgICB0eXBlbmFtZSBfUmVmUiwgdHlwZW5hbWUgX1B0clI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZkwsIF9QdHJMPiYgX194LAorCSAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWZSLCBfUHRyUj4mIF9feSkKKyAgICB7IHJldHVybiAoX194Ll9NX25vZGUgPT0gX195Ll9NX25vZGUpID8gKF9feC5fTV9jdXIgPCBfX3kuX01fY3VyKQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChfX3guX01fbm9kZSA8IF9feS5fTV9ub2RlKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1JlZiwgdHlwZW5hbWUgX1B0cj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmLCBfUHRyPiYgX194LAorCSAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWYsIF9QdHI+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUmVmTCwgdHlwZW5hbWUgX1B0ckwsCisJICAgdHlwZW5hbWUgX1JlZlIsIHR5cGVuYW1lIF9QdHJSPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWZMLCBfUHRyTD4mIF9feCwKKwkgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmUiwgX1B0clI+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUmVmLCB0eXBlbmFtZSBfUHRyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmLCBfUHRyPiYgX194LAorCSAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmLCBfUHRyPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1JlZkwsIHR5cGVuYW1lIF9QdHJMLAorCSAgIHR5cGVuYW1lIF9SZWZSLCB0eXBlbmFtZSBfUHRyUj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZkwsIF9QdHJMPiYgX194LAorCSAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmUiwgX1B0clI+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUmVmLCB0eXBlbmFtZSBfUHRyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmLCBfUHRyPiYgX194LAorCSAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmLCBfUHRyPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1JlZkwsIHR5cGVuYW1lIF9QdHJMLAorCSAgIHR5cGVuYW1lIF9SZWZSLCB0eXBlbmFtZSBfUHRyUj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZkwsIF9QdHJMPiYgX194LAorCSAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmUiwgX1B0clI+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyBBY2NvcmRpbmcgdG8gdGhlIHJlc29sdXRpb24gb2YgRFIxNzkgbm90IG9ubHkgdGhlIHZhcmlvdXMgY29tcGFyaXNvbgorICAvLyBvcGVyYXRvcnMgYnV0IGFsc28gb3BlcmF0b3ItIG11c3QgYWNjZXB0IG1peGVkIGl0ZXJhdG9yL2NvbnN0X2l0ZXJhdG9yCisgIC8vIHBhcmFtZXRlcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1JlZiwgdHlwZW5hbWUgX1B0cj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj46OmRpZmZlcmVuY2VfdHlwZQorICAgIG9wZXJhdG9yLShjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmLCBfUHRyPiYgX194LAorCSAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWYsIF9QdHI+JiBfX3kpCisgICAgeworICAgICAgcmV0dXJuIHR5cGVuYW1lIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWYsIF9QdHI+OjpkaWZmZXJlbmNlX3R5cGUKKwkoX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj46Ol9TX2J1ZmZlcl9zaXplKCkpCisJKiAoX194Ll9NX25vZGUgLSBfX3kuX01fbm9kZSAtIDEpICsgKF9feC5fTV9jdXIgLSBfX3guX01fZmlyc3QpCisJKyAoX195Ll9NX2xhc3QgLSBfX3kuX01fY3VyKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUmVmTCwgdHlwZW5hbWUgX1B0ckwsCisJICAgdHlwZW5hbWUgX1JlZlIsIHR5cGVuYW1lIF9QdHJSPgorICAgIGlubGluZSB0eXBlbmFtZSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmTCwgX1B0ckw+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBvcGVyYXRvci0oY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZkwsIF9QdHJMPiYgX194LAorCSAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWZSLCBfUHRyUj4mIF9feSkKKyAgICB7CisgICAgICByZXR1cm4gdHlwZW5hbWUgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZkwsIF9QdHJMPjo6ZGlmZmVyZW5jZV90eXBlCisJKF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWZMLCBfUHRyTD46Ol9TX2J1ZmZlcl9zaXplKCkpCisJKiAoX194Ll9NX25vZGUgLSBfX3kuX01fbm9kZSAtIDEpICsgKF9feC5fTV9jdXIgLSBfX3guX01fZmlyc3QpCisJKyAoX195Ll9NX2xhc3QgLSBfX3kuX01fY3VyKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUmVmLCB0eXBlbmFtZSBfUHRyPgorICAgIGlubGluZSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmLCBfUHRyPgorICAgIG9wZXJhdG9yKyhwdHJkaWZmX3QgX19uLCBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmLCBfUHRyPiYgX194KQorICAgIHsgcmV0dXJuIF9feCArIF9fbjsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgZmlsbChjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiYsCisJIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+JiwgY29uc3QgX1RwJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+CisgICAgY29weShfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiwKKwkgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgY29uc3QgX1RwJiwgY29uc3QgX1RwKj4sCisJIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+KTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+CisgICAgY29weShfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiBfX2ZpcnN0LAorCSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiBfX2xhc3QsCisJIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+IF9fcmVzdWx0KQorICAgIHsgcmV0dXJuIHN0ZDo6Y29weShfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPihfX2ZpcnN0KSwKKwkJICAgICAgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+KF9fbGFzdCksCisJCSAgICAgICBfX3Jlc3VsdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4KKyAgICBjb3B5X2JhY2t3YXJkKF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+LAorCQkgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+LAorCQkgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+KTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+CisgICAgY29weV9iYWNrd2FyZChfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiBfX2ZpcnN0LAorCQkgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+IF9fbGFzdCwKKwkJICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiBfX3Jlc3VsdCkKKyAgICB7IHJldHVybiBzdGQ6OmNvcHlfYmFja3dhcmQoX0RlcXVlX2l0ZXJhdG9yPF9UcCwKKwkJCQljb25zdCBfVHAmLCBjb25zdCBfVHAqPihfX2ZpcnN0KSwKKwkJCQlfRGVxdWVfaXRlcmF0b3I8X1RwLAorCQkJCWNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+KF9fbGFzdCksCisJCQkJX19yZXN1bHQpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPgorICAgIG1vdmUoX0RlcXVlX2l0ZXJhdG9yPF9UcCwgY29uc3QgX1RwJiwgY29uc3QgX1RwKj4sCisJIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+LAorCSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPgorICAgIG1vdmUoX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4gX19maXJzdCwKKwkgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4gX19sYXN0LAorCSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiBfX3Jlc3VsdCkKKyAgICB7IHJldHVybiBzdGQ6Om1vdmUoX0RlcXVlX2l0ZXJhdG9yPF9UcCwgY29uc3QgX1RwJiwgY29uc3QgX1RwKj4oX19maXJzdCksCisJCSAgICAgICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPihfX2xhc3QpLAorCQkgICAgICAgX19yZXN1bHQpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+CisgICAgbW92ZV9iYWNrd2FyZChfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiwKKwkJICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiwKKwkJICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPgorICAgIG1vdmVfYmFja3dhcmQoX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4gX19maXJzdCwKKwkJICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiBfX2xhc3QsCisJCSAgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4gX19yZXN1bHQpCisgICAgeyByZXR1cm4gc3RkOjptb3ZlX2JhY2t3YXJkKF9EZXF1ZV9pdGVyYXRvcjxfVHAsCisJCQkJY29uc3QgX1RwJiwgY29uc3QgX1RwKj4oX19maXJzdCksCisJCQkJX0RlcXVlX2l0ZXJhdG9yPF9UcCwKKwkJCQljb25zdCBfVHAmLCBjb25zdCBfVHAqPihfX2xhc3QpLAorCQkJCV9fcmVzdWx0KTsgfQorI2VuZGlmCisKKyAgLyoqCisgICAqICBEZXF1ZSBiYXNlIGNsYXNzLiAgVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgdW5pZmllZCBmYWNlIGZvciAlZGVxdWUncworICAgKiAgYWxsb2NhdGlvbi4gIFRoaXMgY2xhc3MncyBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBhbGxvY2F0ZSBhbmQKKyAgICogIGRlYWxsb2NhdGUgKGJ1dCBkbyBub3QgaW5pdGlhbGl6ZSkgc3RvcmFnZS4gIFRoaXMgbWFrZXMgJWV4Y2VwdGlvbgorICAgKiAgc2FmZXR5IGVhc2llci4KKyAgICoKKyAgICogIE5vdGhpbmcgaW4gdGhpcyBjbGFzcyBldmVyIGNvbnN0cnVjdHMgb3IgZGVzdHJveXMgYW4gYWN0dWFsIFRwIGVsZW1lbnQuCisgICAqICAoRGVxdWUgaGFuZGxlcyB0aGF0IGl0c2VsZi4pICBPbmx5L0FsbCBtZW1vcnkgbWFuYWdlbWVudCBpcyBwZXJmb3JtZWQKKyAgICogIGhlcmUuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIF9EZXF1ZV9iYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0FsbG9jICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGFsbG9jYXRvcl90eXBlKF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7IH0KKworICAgICAgdHlwZWRlZiBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgY29uc3QgX1RwJiwgY29uc3QgX1RwKj4gY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIF9EZXF1ZV9iYXNlKCkKKyAgICAgIDogX01faW1wbCgpCisgICAgICB7IF9NX2luaXRpYWxpemVfbWFwKDApOyB9CisKKyAgICAgIF9EZXF1ZV9iYXNlKHNpemVfdCBfX251bV9lbGVtZW50cykKKyAgICAgIDogX01faW1wbCgpCisgICAgICB7IF9NX2luaXRpYWxpemVfbWFwKF9fbnVtX2VsZW1lbnRzKTsgfQorCisgICAgICBfRGVxdWVfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hLCBzaXplX3QgX19udW1fZWxlbWVudHMpCisgICAgICA6IF9NX2ltcGwoX19hKQorICAgICAgeyBfTV9pbml0aWFsaXplX21hcChfX251bV9lbGVtZW50cyk7IH0KKworICAgICAgX0RlcXVlX2Jhc2UoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogX01faW1wbChfX2EpCisgICAgICB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIF9EZXF1ZV9iYXNlKF9EZXF1ZV9iYXNlJiYgX194KQorICAgICAgOiBfTV9pbXBsKHN0ZDo6bW92ZShfX3guX01fZ2V0X1RwX2FsbG9jYXRvcigpKSkKKyAgICAgIHsKKwlfTV9pbml0aWFsaXplX21hcCgwKTsKKwlpZiAoX194Ll9NX2ltcGwuX01fbWFwKQorCSAgeworCSAgICBzdGQ6OnN3YXAodGhpcy0+X01faW1wbC5fTV9zdGFydCwgX194Ll9NX2ltcGwuX01fc3RhcnQpOworCSAgICBzdGQ6OnN3YXAodGhpcy0+X01faW1wbC5fTV9maW5pc2gsIF9feC5fTV9pbXBsLl9NX2ZpbmlzaCk7CisJICAgIHN0ZDo6c3dhcCh0aGlzLT5fTV9pbXBsLl9NX21hcCwgX194Ll9NX2ltcGwuX01fbWFwKTsKKwkgICAgc3RkOjpzd2FwKHRoaXMtPl9NX2ltcGwuX01fbWFwX3NpemUsIF9feC5fTV9pbXBsLl9NX21hcF9zaXplKTsKKwkgIH0KKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB+X0RlcXVlX2Jhc2UoKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vVGhpcyBzdHJ1Y3QgZW5jYXBzdWxhdGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3RkOjpkZXF1ZQorICAgICAgLy9zdGFuZGFyZCBjb250YWluZXIgYW5kIGF0IHRoZSBzYW1lIHRpbWUgbWFrZXMgdXNlIG9mIHRoZSBFQk8KKyAgICAgIC8vZm9yIGVtcHR5IGFsbG9jYXRvcnMuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9UcCo+OjpvdGhlciBfTWFwX2FsbG9jX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X1RwPjo6b3RoZXIgIF9UcF9hbGxvY190eXBlOworCisgICAgICBzdHJ1Y3QgX0RlcXVlX2ltcGwKKyAgICAgIDogcHVibGljIF9UcF9hbGxvY190eXBlCisgICAgICB7CisJX1RwKiogX01fbWFwOworCXNpemVfdCBfTV9tYXBfc2l6ZTsKKwlpdGVyYXRvciBfTV9zdGFydDsKKwlpdGVyYXRvciBfTV9maW5pc2g7CisKKwlfRGVxdWVfaW1wbCgpCisJOiBfVHBfYWxsb2NfdHlwZSgpLCBfTV9tYXAoMCksIF9NX21hcF9zaXplKDApLAorCSAgX01fc3RhcnQoKSwgX01fZmluaXNoKCkKKwl7IH0KKworCV9EZXF1ZV9pbXBsKGNvbnN0IF9UcF9hbGxvY190eXBlJiBfX2EpCisJOiBfVHBfYWxsb2NfdHlwZShfX2EpLCBfTV9tYXAoMCksIF9NX21hcF9zaXplKDApLAorCSAgX01fc3RhcnQoKSwgX01fZmluaXNoKCkKKwl7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKwlfRGVxdWVfaW1wbChfVHBfYWxsb2NfdHlwZSYmIF9fYSkKKwk6IF9UcF9hbGxvY190eXBlKHN0ZDo6bW92ZShfX2EpKSwgX01fbWFwKDApLCBfTV9tYXBfc2l6ZSgwKSwKKwkgIF9NX3N0YXJ0KCksIF9NX2ZpbmlzaCgpCisJeyB9CisjZW5kaWYKKyAgICAgIH07CisKKyAgICAgIF9UcF9hbGxvY190eXBlJgorICAgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8X1RwX2FsbG9jX3R5cGUqPigmdGhpcy0+X01faW1wbCk7IH0KKworICAgICAgY29uc3QgX1RwX2FsbG9jX3R5cGUmCisgICAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBfVHBfYWxsb2NfdHlwZSo+KCZ0aGlzLT5fTV9pbXBsKTsgfQorCisgICAgICBfTWFwX2FsbG9jX3R5cGUKKyAgICAgIF9NX2dldF9tYXBfYWxsb2NhdG9yKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NYXBfYWxsb2NfdHlwZShfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOyB9CisKKyAgICAgIF9UcCoKKyAgICAgIF9NX2FsbG9jYXRlX25vZGUoKQorICAgICAgeyAKKwlyZXR1cm4gX01faW1wbC5fVHBfYWxsb2NfdHlwZTo6YWxsb2NhdGUoX19kZXF1ZV9idWZfc2l6ZShzaXplb2YoX1RwKSkpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kZWFsbG9jYXRlX25vZGUoX1RwKiBfX3ApCisgICAgICB7CisJX01faW1wbC5fVHBfYWxsb2NfdHlwZTo6ZGVhbGxvY2F0ZShfX3AsIF9fZGVxdWVfYnVmX3NpemUoc2l6ZW9mKF9UcCkpKTsKKyAgICAgIH0KKworICAgICAgX1RwKioKKyAgICAgIF9NX2FsbG9jYXRlX21hcChzaXplX3QgX19uKQorICAgICAgeyByZXR1cm4gX01fZ2V0X21hcF9hbGxvY2F0b3IoKS5hbGxvY2F0ZShfX24pOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RlYWxsb2NhdGVfbWFwKF9UcCoqIF9fcCwgc2l6ZV90IF9fbikKKyAgICAgIHsgX01fZ2V0X21hcF9hbGxvY2F0b3IoKS5kZWFsbG9jYXRlKF9fcCwgX19uKTsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgdm9pZCBfTV9pbml0aWFsaXplX21hcChzaXplX3QpOworICAgICAgdm9pZCBfTV9jcmVhdGVfbm9kZXMoX1RwKiogX19uc3RhcnQsIF9UcCoqIF9fbmZpbmlzaCk7CisgICAgICB2b2lkIF9NX2Rlc3Ryb3lfbm9kZXMoX1RwKiogX19uc3RhcnQsIF9UcCoqIF9fbmZpbmlzaCk7CisgICAgICBlbnVtIHsgX1NfaW5pdGlhbF9tYXBfc2l6ZSA9IDggfTsKKworICAgICAgX0RlcXVlX2ltcGwgX01faW1wbDsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9EZXF1ZV9iYXNlPF9UcCwgX0FsbG9jPjo6CisgICAgfl9EZXF1ZV9iYXNlKCkKKyAgICB7CisgICAgICBpZiAodGhpcy0+X01faW1wbC5fTV9tYXApCisJeworCSAgX01fZGVzdHJveV9ub2Rlcyh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX25vZGUsCisJCQkgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlICsgMSk7CisJICBfTV9kZWFsbG9jYXRlX21hcCh0aGlzLT5fTV9pbXBsLl9NX21hcCwgdGhpcy0+X01faW1wbC5fTV9tYXBfc2l6ZSk7CisJfQorICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBMYXlvdXQgc3RvcmFnZS4KKyAgICogIEBwYXJhbSAgX19udW1fZWxlbWVudHMgIFRoZSBjb3VudCBvZiBUJ3MgZm9yIHdoaWNoIHRvIGFsbG9jYXRlIHNwYWNlCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgYXQgZmlyc3QuCisgICAqICBAcmV0dXJuICAgTm90aGluZy4KKyAgICoKKyAgICogIFRoZSBpbml0aWFsIHVuZGVybHlpbmcgbWVtb3J5IGxheW91dCBpcyBhIGJpdCBjb21wbGljYXRlZC4uLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9pbml0aWFsaXplX21hcChzaXplX3QgX19udW1fZWxlbWVudHMpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90IF9fbnVtX25vZGVzID0gKF9fbnVtX2VsZW1lbnRzLyBfX2RlcXVlX2J1Zl9zaXplKHNpemVvZihfVHApKQorCQkJCSAgKyAxKTsKKworICAgICAgdGhpcy0+X01faW1wbC5fTV9tYXBfc2l6ZSA9IHN0ZDo6bWF4KChzaXplX3QpIF9TX2luaXRpYWxfbWFwX3NpemUsCisJCQkJCSAgIHNpemVfdChfX251bV9ub2RlcyArIDIpKTsKKyAgICAgIHRoaXMtPl9NX2ltcGwuX01fbWFwID0gX01fYWxsb2NhdGVfbWFwKHRoaXMtPl9NX2ltcGwuX01fbWFwX3NpemUpOworCisgICAgICAvLyBGb3IgInNtYWxsIiBtYXBzIChuZWVkaW5nIGxlc3MgdGhhbiBfTV9tYXBfc2l6ZSBub2RlcyksIGFsbG9jYXRpb24KKyAgICAgIC8vIHN0YXJ0cyBpbiB0aGUgbWlkZGxlIGVsZW1lbnRzIGFuZCBncm93cyBvdXR3YXJkcy4gIFNvIG5zdGFydCBtYXkgYmUKKyAgICAgIC8vIHRoZSBiZWdpbm5pbmcgb2YgX01fbWFwLCBidXQgZm9yIHNtYWxsIG1hcHMgaXQgbWF5IGJlIGFzIGZhciBpbiBhcworICAgICAgLy8gX01fbWFwKzMuCisKKyAgICAgIF9UcCoqIF9fbnN0YXJ0ID0gKHRoaXMtPl9NX2ltcGwuX01fbWFwCisJCQkrICh0aGlzLT5fTV9pbXBsLl9NX21hcF9zaXplIC0gX19udW1fbm9kZXMpIC8gMik7CisgICAgICBfVHAqKiBfX25maW5pc2ggPSBfX25zdGFydCArIF9fbnVtX25vZGVzOworCisgICAgICBfX3RyeQorCXsgX01fY3JlYXRlX25vZGVzKF9fbnN0YXJ0LCBfX25maW5pc2gpOyB9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBfTV9kZWFsbG9jYXRlX21hcCh0aGlzLT5fTV9pbXBsLl9NX21hcCwgdGhpcy0+X01faW1wbC5fTV9tYXBfc2l6ZSk7CisJICB0aGlzLT5fTV9pbXBsLl9NX21hcCA9IDA7CisJICB0aGlzLT5fTV9pbXBsLl9NX21hcF9zaXplID0gMDsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKworICAgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9zZXRfbm9kZShfX25zdGFydCk7CisgICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9zZXRfbm9kZShfX25maW5pc2ggLSAxKTsKKyAgICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyID0gX01faW1wbC5fTV9zdGFydC5fTV9maXJzdDsKKyAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2N1ciA9ICh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9maXJzdAorCQkJCQkrIF9fbnVtX2VsZW1lbnRzCisJCQkJCSUgX19kZXF1ZV9idWZfc2l6ZShzaXplb2YoX1RwKSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9jcmVhdGVfbm9kZXMoX1RwKiogX19uc3RhcnQsIF9UcCoqIF9fbmZpbmlzaCkKKyAgICB7CisgICAgICBfVHAqKiBfX2N1cjsKKyAgICAgIF9fdHJ5CisJeworCSAgZm9yIChfX2N1ciA9IF9fbnN0YXJ0OyBfX2N1ciA8IF9fbmZpbmlzaDsgKytfX2N1cikKKwkgICAgKl9fY3VyID0gdGhpcy0+X01fYWxsb2NhdGVfbm9kZSgpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIF9NX2Rlc3Ryb3lfbm9kZXMoX19uc3RhcnQsIF9fY3VyKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9EZXF1ZV9iYXNlPF9UcCwgX0FsbG9jPjo6CisgICAgX01fZGVzdHJveV9ub2RlcyhfVHAqKiBfX25zdGFydCwgX1RwKiogX19uZmluaXNoKQorICAgIHsKKyAgICAgIGZvciAoX1RwKiogX19uID0gX19uc3RhcnQ7IF9fbiA8IF9fbmZpbmlzaDsgKytfX24pCisJX01fZGVhbGxvY2F0ZV9ub2RlKCpfX24pOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgQSBzdGFuZGFyZCBjb250YWluZXIgdXNpbmcgZml4ZWQtc2l6ZSBtZW1vcnkgYWxsb2NhdGlvbiBhbmQKKyAgICogIGNvbnN0YW50LXRpbWUgbWFuaXB1bGF0aW9uIG9mIGVsZW1lbnRzIGF0IGVpdGhlciBlbmQuCisgICAqCisgICAqICBAaW5ncm91cCBzZXF1ZW5jZXMKKyAgICoKKyAgICogIEB0cGFyYW0gX1RwICBUeXBlIG9mIGVsZW1lbnQuCisgICAqICBAdHBhcmFtIF9BbGxvYyAgQWxsb2NhdG9yIHR5cGUsIGRlZmF1bHRzIHRvIGFsbG9jYXRvcjxfVHA+LgorICAgKgorICAgKiAgTWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LCBhCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NiI+cmV2ZXJzaWJsZSBjb250YWluZXI8L2E+LCBhbmQgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjciPnNlcXVlbmNlPC9hPiwgaW5jbHVkaW5nIHRoZQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjgiPm9wdGlvbmFsIHNlcXVlbmNlIHJlcXVpcmVtZW50czwvYT4uCisgICAqCisgICAqICBJbiBwcmV2aW91cyBIUC9TR0kgdmVyc2lvbnMgb2YgZGVxdWUsIHRoZXJlIHdhcyBhbiBleHRyYSB0ZW1wbGF0ZQorICAgKiAgcGFyYW1ldGVyIHNvIHVzZXJzIGNvdWxkIGNvbnRyb2wgdGhlIG5vZGUgc2l6ZS4gIFRoaXMgZXh0ZW5zaW9uIHR1cm5lZAorICAgKiAgb3V0IHRvIHZpb2xhdGUgdGhlIEMrKyBzdGFuZGFyZCAoaXQgY2FuIGJlIGRldGVjdGVkIHVzaW5nIHRlbXBsYXRlCisgICAqICB0ZW1wbGF0ZSBwYXJhbWV0ZXJzKSwgYW5kIGl0IHdhcyByZW1vdmVkLgorICAgKgorICAgKiAgSGVyZSdzIGhvdyBhIGRlcXVlPFRwPiBtYW5hZ2VzIG1lbW9yeS4gIEVhY2ggZGVxdWUgaGFzIDQgbWVtYmVyczoKKyAgICoKKyAgICogIC0gVHAqKiAgICAgICAgX01fbWFwCisgICAqICAtIHNpemVfdCAgICAgIF9NX21hcF9zaXplCisgICAqICAtIGl0ZXJhdG9yICAgIF9NX3N0YXJ0LCBfTV9maW5pc2gKKyAgICoKKyAgICogIG1hcF9zaXplIGlzIGF0IGxlYXN0IDguICAlbWFwIGlzIGFuIGFycmF5IG9mIG1hcF9zaXplCisgICAqICBwb2ludGVycy10by1AYSBub2Rlcy4gIChUaGUgbmFtZSAlbWFwIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggdGhlCisgICAqICBzdGQ6Om1hcCBjbGFzcywgYW5kIEBiIG5vZGVzIHNob3VsZCBub3QgYmUgY29uZnVzZWQgd2l0aAorICAgKiAgc3RkOjpsaXN0J3MgdXNhZ2Ugb2YgQGEgbm9kZS4pCisgICAqCisgICAqICBBIEBhIG5vZGUgaGFzIG5vIHNwZWNpZmljIHR5cGUgbmFtZSBhcyBzdWNoLCBidXQgaXQgaXMgcmVmZXJyZWQKKyAgICogIHRvIGFzIEBhIG5vZGUgaW4gdGhpcyBmaWxlLiAgSXQgaXMgYSBzaW1wbGUgYXJyYXktb2YtVHAuICBJZiBUcAorICAgKiAgaXMgdmVyeSBsYXJnZSwgdGhlcmUgd2lsbCBiZSBvbmUgVHAgZWxlbWVudCBwZXIgbm9kZSAoaS5lLiwgYW4KKyAgICogIEBhIGFycmF5IG9mIG9uZSkuICBGb3Igbm9uLWh1Z2UgVHAncywgbm9kZSBzaXplIGlzIGludmVyc2VseQorICAgKiAgcmVsYXRlZCB0byBUcCBzaXplOiB0aGUgbGFyZ2VyIHRoZSBUcCwgdGhlIGZld2VyIFRwJ3Mgd2lsbCBmaXQKKyAgICogIGluIGEgbm9kZS4gIFRoZSBnb2FsIGhlcmUgaXMgdG8ga2VlcCB0aGUgdG90YWwgc2l6ZSBvZiBhIG5vZGUKKyAgICogIHJlbGF0aXZlbHkgc21hbGwgYW5kIGNvbnN0YW50IG92ZXIgZGlmZmVyZW50IFRwJ3MsIHRvIGltcHJvdmUKKyAgICogIGFsbG9jYXRvciBlZmZpY2llbmN5LgorICAgKgorICAgKiAgTm90IGV2ZXJ5IHBvaW50ZXIgaW4gdGhlICVtYXAgYXJyYXkgd2lsbCBwb2ludCB0byBhIG5vZGUuICBJZgorICAgKiAgdGhlIGluaXRpYWwgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBkZXF1ZSBpcyBzbWFsbCwgdGhlCisgICAqICAvbWlkZGxlLyAlbWFwIHBvaW50ZXJzIHdpbGwgYmUgdmFsaWQsIGFuZCB0aGUgb25lcyBhdCB0aGUgZWRnZXMKKyAgICogIHdpbGwgYmUgdW51c2VkLiAgVGhpcyBzYW1lIHNpdHVhdGlvbiB3aWxsIGFyaXNlIGFzIHRoZSAlbWFwCisgICAqICBncm93czogYXZhaWxhYmxlICVtYXAgcG9pbnRlcnMsIGlmIGFueSwgd2lsbCBiZSBvbiB0aGUgZW5kcy4gIEFzCisgICAqICBuZXcgbm9kZXMgYXJlIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2YgdGhlICVtYXAncyBwb2ludGVycyBuZWVkCisgICAqICB0byBiZSBjb3BpZWQgQGEgb3V0d2FyZC4KKyAgICoKKyAgICogIENsYXNzIGludmFyaWFudHM6CisgICAqIC0gRm9yIGFueSBub25zaW5ndWxhciBpdGVyYXRvciBpOgorICAgKiAgICAtIGkubm9kZSBwb2ludHMgdG8gYSBtZW1iZXIgb2YgdGhlICVtYXAgYXJyYXkuICAoWWVzLCB5b3UgcmVhZCB0aGF0CisgICAqICAgICAgY29ycmVjdGx5OiAgaS5ub2RlIGRvZXMgbm90IGFjdHVhbGx5IHBvaW50IHRvIGEgbm9kZS4pICBUaGUgbWVtYmVyIG9mCisgICAqICAgICAgdGhlICVtYXAgYXJyYXkgaXMgd2hhdCBhY3R1YWxseSBwb2ludHMgdG8gdGhlIG5vZGUuCisgICAqICAgIC0gaS5maXJzdCA9PSAqKGkubm9kZSkgICAgKFRoaXMgcG9pbnRzIHRvIHRoZSBub2RlIChmaXJzdCBUcCBlbGVtZW50KS4pCisgICAqICAgIC0gaS5sYXN0ICA9PSBpLmZpcnN0ICsgbm9kZV9zaXplCisgICAqICAgIC0gaS5jdXIgaXMgYSBwb2ludGVyIGluIHRoZSByYW5nZSBbaS5maXJzdCwgaS5sYXN0KS4gIE5PVEU6CisgICAqICAgICAgdGhlIGltcGxpY2F0aW9uIG9mIHRoaXMgaXMgdGhhdCBpLmN1ciBpcyBhbHdheXMgYSBkZXJlZmVyZW5jZWFibGUKKyAgICogICAgICBwb2ludGVyLCBldmVuIGlmIGkgaXMgYSBwYXN0LXRoZS1lbmQgaXRlcmF0b3IuCisgICAqIC0gU3RhcnQgYW5kIEZpbmlzaCBhcmUgYWx3YXlzIG5vbnNpbmd1bGFyIGl0ZXJhdG9ycy4gIE5PVEU6IHRoaXMKKyAgICogbWVhbnMgdGhhdCBhbiBlbXB0eSBkZXF1ZSBtdXN0IGhhdmUgb25lIG5vZGUsIGEgZGVxdWUgd2l0aCA8TgorICAgKiBlbGVtZW50cyAod2hlcmUgTiBpcyB0aGUgbm9kZSBidWZmZXIgc2l6ZSkgbXVzdCBoYXZlIG9uZSBub2RlLCBhCisgICAqIGRlcXVlIHdpdGggTiB0aHJvdWdoICgyTi0xKSBlbGVtZW50cyBtdXN0IGhhdmUgdHdvIG5vZGVzLCBldGMuCisgICAqIC0gRm9yIGV2ZXJ5IG5vZGUgb3RoZXIgdGhhbiBzdGFydC5ub2RlIGFuZCBmaW5pc2gubm9kZSwgZXZlcnkKKyAgICogZWxlbWVudCBpbiB0aGUgbm9kZSBpcyBhbiBpbml0aWFsaXplZCBvYmplY3QuICBJZiBzdGFydC5ub2RlID09CisgICAqIGZpbmlzaC5ub2RlLCB0aGVuIFtzdGFydC5jdXIsIGZpbmlzaC5jdXIpIGFyZSBpbml0aWFsaXplZAorICAgKiBvYmplY3RzLCBhbmQgdGhlIGVsZW1lbnRzIG91dHNpZGUgdGhhdCByYW5nZSBhcmUgdW5pbml0aWFsaXplZAorICAgKiBzdG9yYWdlLiAgT3RoZXJ3aXNlLCBbc3RhcnQuY3VyLCBzdGFydC5sYXN0KSBhbmQgW2ZpbmlzaC5maXJzdCwKKyAgICogZmluaXNoLmN1cikgYXJlIGluaXRpYWxpemVkIG9iamVjdHMsIGFuZCBbc3RhcnQuZmlyc3QsIHN0YXJ0LmN1cikKKyAgICogYW5kIFtmaW5pc2guY3VyLCBmaW5pc2gubGFzdCkgYXJlIHVuaW5pdGlhbGl6ZWQgc3RvcmFnZS4KKyAgICogLSBbJW1hcCwgJW1hcCArIG1hcF9zaXplKSBpcyBhIHZhbGlkLCBub24tZW1wdHkgcmFuZ2UuCisgICAqIC0gW3N0YXJ0Lm5vZGUsIGZpbmlzaC5ub2RlXSBpcyBhIHZhbGlkIHJhbmdlIGNvbnRhaW5lZCB3aXRoaW4KKyAgICogICBbJW1hcCwgJW1hcCArIG1hcF9zaXplKS4KKyAgICogLSBBIHBvaW50ZXIgaW4gdGhlIHJhbmdlIFslbWFwLCAlbWFwICsgbWFwX3NpemUpIHBvaW50cyB0byBhbiBhbGxvY2F0ZWQKKyAgICogICBub2RlIGlmIGFuZCBvbmx5IGlmIHRoZSBwb2ludGVyIGlzIGluIHRoZSByYW5nZQorICAgKiAgIFtzdGFydC5ub2RlLCBmaW5pc2gubm9kZV0uCisgICAqCisgICAqICBIZXJlJ3MgdGhlIG1hZ2ljOiAgbm90aGluZyBpbiBkZXF1ZSBpcyBAYiBhd2FyZSBvZiB0aGUgZGlzY29udGlndW91cworICAgKiAgc3RvcmFnZSEKKyAgICoKKyAgICogIFRoZSBtZW1vcnkgc2V0dXAgYW5kIGxheW91dCBvY2N1cnMgaW4gdGhlIHBhcmVudCwgX0Jhc2UsIGFuZCB0aGUgaXRlcmF0b3IKKyAgICogIGNsYXNzIGlzIGVudGlyZWx5IHJlc3BvbnNpYmxlIGZvciBAYSBsZWFwaW5nIGZyb20gb25lIG5vZGUgdG8gdGhlIG5leHQuCisgICAqICBBbGwgdGhlIGltcGxlbWVudGF0aW9uIHJvdXRpbmVzIGZvciBkZXF1ZSBpdHNlbGYgd29yayBvbmx5IHRocm91Z2ggdGhlCisgICAqICBzdGFydCBhbmQgZmluaXNoIGl0ZXJhdG9ycy4gIFRoaXMga2VlcHMgdGhlIHJvdXRpbmVzIHNpbXBsZSBhbmQgc2FuZSwKKyAgICogIGFuZCB3ZSBjYW4gdXNlIG90aGVyIHN0YW5kYXJkIGFsZ29yaXRobXMgYXMgd2VsbC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyBkZXF1ZSA6IHByb3RlY3RlZCBfRGVxdWVfYmFzZTxfVHAsIF9BbGxvYz4KKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnZhbHVlX3R5cGUgICAgICAgIF9BbGxvY192YWx1ZV90eXBlOworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9UcCwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMihfVHAsIF9BbGxvY192YWx1ZV90eXBlLCBfU2FtZVR5cGVDb25jZXB0KQorCisgICAgICB0eXBlZGVmIF9EZXF1ZV9iYXNlPF9UcCwgX0FsbG9jPiAgICAgICAgICAgX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpfVHBfYWxsb2NfdHlwZQkgX1RwX2FsbG9jX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHBfYWxsb2NfdHlwZTo6cG9pbnRlciAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RwX2FsbG9jX3R5cGU6OmNvbnN0X3BvaW50ZXIgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcF9hbGxvY190eXBlOjpyZWZlcmVuY2UgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcF9hbGxvY190eXBlOjpjb25zdF9yZWZlcmVuY2UgICBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+ICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgcG9pbnRlciogICAgICAgICAgICAgICAgICAgICAgICAgICBfTWFwX3BvaW50ZXI7CisKKyAgICAgIHN0YXRpYyBzaXplX3QgX1NfYnVmZmVyX3NpemUoKQorICAgICAgeyByZXR1cm4gX19kZXF1ZV9idWZfc2l6ZShzaXplb2YoX1RwKSk7IH0KKworICAgICAgLy8gRnVuY3Rpb25zIGNvbnRyb2xsaW5nIG1lbW9yeSBsYXlvdXQsIGFuZCBub3RoaW5nIGVsc2UuCisgICAgICB1c2luZyBfQmFzZTo6X01faW5pdGlhbGl6ZV9tYXA7CisgICAgICB1c2luZyBfQmFzZTo6X01fY3JlYXRlX25vZGVzOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2Rlc3Ryb3lfbm9kZXM7CisgICAgICB1c2luZyBfQmFzZTo6X01fYWxsb2NhdGVfbm9kZTsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9kZWFsbG9jYXRlX25vZGU7CisgICAgICB1c2luZyBfQmFzZTo6X01fYWxsb2NhdGVfbWFwOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2RlYWxsb2NhdGVfbWFwOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2dldF9UcF9hbGxvY2F0b3I7CisKKyAgICAgIC8qKiAKKyAgICAgICAqICBBIHRvdGFsIG9mIGZvdXIgZGF0YSBtZW1iZXJzIGFjY3VtdWxhdGVkIGRvd24gdGhlIGhpZXJhcmNoeS4KKyAgICAgICAqICBNYXkgYmUgYWNjZXNzZWQgdmlhIF9NX2ltcGwuKgorICAgICAgICovCisgICAgICB1c2luZyBfQmFzZTo6X01faW1wbDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIFsyMy4yLjEuMV0gY29uc3RydWN0L2NvcHkvZGVzdHJveQorICAgICAgLy8gKGFzc2lnbigpIGFuZCBnZXRfYWxsb2NhdG9yKCkgYXJlIGFsc28gbGlzdGVkIGluIHRoaXMgc2VjdGlvbikKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIG5vIGVsZW1lbnRzLgorICAgICAgICovCisgICAgICBkZXF1ZSgpCisgICAgICA6IF9CYXNlKCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICVkZXF1ZSB3aXRoIG5vIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgZGVxdWUoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogX0Jhc2UoX19hLCAwKSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICVkZXF1ZSB3aXRoIGRlZmF1bHQgY29uc3RydWN0ZWQgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX24gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gaW5pdGlhbGx5IGNyZWF0ZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBjb25zdHJ1Y3RvciBmaWxscyB0aGUgJWRlcXVlIHdpdGggQGEgbiBkZWZhdWx0CisgICAgICAgKiAgY29uc3RydWN0ZWQgZWxlbWVudHMuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBkZXF1ZShzaXplX3R5cGUgX19uKQorICAgICAgOiBfQmFzZShfX24pCisgICAgICB7IF9NX2RlZmF1bHRfaW5pdGlhbGl6ZSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICVkZXF1ZSB3aXRoIGNvcGllcyBvZiBhbiBleGVtcGxhciBlbGVtZW50LgorICAgICAgICogIEBwYXJhbSAgX19uICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGluaXRpYWxseSBjcmVhdGUuCisgICAgICAgKiAgQHBhcmFtICBfX3ZhbHVlICBBbiBlbGVtZW50IHRvIGNvcHkuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBjb25zdHJ1Y3RvciBmaWxscyB0aGUgJWRlcXVlIHdpdGggQGEgX19uIGNvcGllcyBvZiBAYSBfX3ZhbHVlLgorICAgICAgICovCisgICAgICBkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbHVlLAorCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hLCBfX24pCisgICAgICB7IF9NX2ZpbGxfaW5pdGlhbGl6ZShfX3ZhbHVlKTsgfQorI2Vsc2UKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICVkZXF1ZSB3aXRoIGNvcGllcyBvZiBhbiBleGVtcGxhciBlbGVtZW50LgorICAgICAgICogIEBwYXJhbSAgX19uICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGluaXRpYWxseSBjcmVhdGUuCisgICAgICAgKiAgQHBhcmFtICBfX3ZhbHVlICBBbiBlbGVtZW50IHRvIGNvcHkuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBjb25zdHJ1Y3RvciBmaWxscyB0aGUgJWRlcXVlIHdpdGggQGEgX19uIGNvcGllcyBvZiBAYSBfX3ZhbHVlLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgZGVxdWUoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWx1ZSA9IHZhbHVlX3R5cGUoKSwKKwkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fYSwgX19uKQorICAgICAgeyBfTV9maWxsX2luaXRpYWxpemUoX192YWx1ZSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVEZXF1ZSBjb3B5IGNvbnN0cnVjdG9yLgorICAgICAgICogIEBwYXJhbSAgX194ICBBICVkZXF1ZSBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY3JlYXRlZCAlZGVxdWUgdXNlcyBhIGNvcHkgb2YgdGhlIGFsbG9jYXRpb24gb2JqZWN0IHVzZWQKKyAgICAgICAqICBieSBAYSBfX3guCisgICAgICAgKi8KKyAgICAgIGRlcXVlKGNvbnN0IGRlcXVlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feC5fTV9nZXRfVHBfYWxsb2NhdG9yKCksIF9feC5zaXplKCkpCisgICAgICB7IHN0ZDo6X191bmluaXRpYWxpemVkX2NvcHlfYShfX3guYmVnaW4oKSwgX194LmVuZCgpLCAKKwkJCQkgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCQkgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlRGVxdWUgbW92ZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSAlZGVxdWUgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJWRlcXVlIGNvbnRhaW5zIHRoZSBleGFjdCBjb250ZW50cyBvZiBAYSBfX3guCisgICAgICAgKiAgVGhlIGNvbnRlbnRzIG9mIEBhIF9feCBhcmUgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkICVkZXF1ZS4KKyAgICAgICAqLworICAgICAgZGVxdWUoZGVxdWUmJiBfX3gpCisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3gpKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlZGVxdWUgZnJvbSBhbiBpbml0aWFsaXplciBsaXN0LgorICAgICAgICogIEBwYXJhbSAgX19sICBBbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAlZGVxdWUgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQorICAgICAgICogIGluaXRpYWxpemVyX2xpc3QgQGEgX19sLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIHdpbGwgY2FsbCB0aGUgZWxlbWVudCB0eXBlJ3MgY29weSBjb25zdHJ1Y3RvciBOIHRpbWVzCisgICAgICAgKiAgKHdoZXJlIE4gaXMgX19sLnNpemUoKSkgYW5kIGRvIG5vIG1lbW9yeSByZWFsbG9jYXRpb24uCisgICAgICAgKi8KKyAgICAgIGRlcXVlKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hKQorICAgICAgeworCV9NX3JhbmdlX2luaXRpYWxpemUoX19sLmJlZ2luKCksIF9fbC5lbmQoKSwKKwkJCSAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICVkZXF1ZSBmcm9tIGEgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVkZXF1ZSBjb25zaXN0aW5nIG9mIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgZnJvbSBbX19maXJzdCwKKyAgICAgICAqICBfX2xhc3QpLgorICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgaXRlcmF0b3JzIGFyZSBmb3J3YXJkLCBiaWRpcmVjdGlvbmFsLCBvciByYW5kb20tYWNjZXNzLCB0aGVuCisgICAgICAgKiAgdGhpcyB3aWxsIGNhbGwgdGhlIGVsZW1lbnRzJyBjb3B5IGNvbnN0cnVjdG9yIE4gdGltZXMgKHdoZXJlIE4gaXMKKyAgICAgICAqICBkaXN0YW5jZShfX2ZpcnN0LF9fbGFzdCkpIGFuZCBkbyBubyBtZW1vcnkgcmVhbGxvY2F0aW9uLiAgQnV0IGlmIG9ubHkKKyAgICAgICAqICBpbnB1dCBpdGVyYXRvcnMgYXJlIHVzZWQsIHRoZW4gdGhpcyB3aWxsIGRvIGF0IG1vc3QgMk4gY2FsbHMgdG8gdGhlCisgICAgICAgKiAgY29weSBjb25zdHJ1Y3RvciwgYW5kIGxvZ04gbWVtb3J5IHJlYWxsb2NhdGlvbnMuCisgICAgICAgKi8KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyAgICAgICAgZGVxdWUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19hKQorICAgICAgICB7IF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfX2ZhbHNlX3R5cGUoKSk7IH0KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgZGVxdWUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19hKQorICAgICAgICB7CisJICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+OjpfX3R5cGUgX0ludGVncmFsOworCSAgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKwl9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgVGhlIGR0b3Igb25seSBlcmFzZXMgdGhlIGVsZW1lbnRzLCBhbmQgbm90ZSB0aGF0IGlmIHRoZSBlbGVtZW50cworICAgICAgICogIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55CisgICAgICAgKiAgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgfmRlcXVlKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgX01fZGVzdHJveV9kYXRhKGJlZ2luKCksIGVuZCgpLCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJURlcXVlIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJWRlcXVlIG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIEFsbCB0aGUgZWxlbWVudHMgb2YgQGEgeCBhcmUgY29waWVkLCBidXQgdW5saWtlIHRoZSBjb3B5IGNvbnN0cnVjdG9yLAorICAgICAgICogIHRoZSBhbGxvY2F0b3Igb2JqZWN0IGlzIG5vdCBjb3BpZWQuCisgICAgICAgKi8KKyAgICAgIGRlcXVlJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IGRlcXVlJiBfX3gpOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlRGVxdWUgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX194ICBBICVkZXF1ZSBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgY29udGVudHMgb2YgQGEgX194IGFyZSBtb3ZlZCBpbnRvIHRoaXMgZGVxdWUgKHdpdGhvdXQgY29weWluZykuCisgICAgICAgKiAgQGEgX194IGlzIGEgdmFsaWQsIGJ1dCB1bnNwZWNpZmllZCAlZGVxdWUuCisgICAgICAgKi8KKyAgICAgIGRlcXVlJgorICAgICAgb3BlcmF0b3I9KGRlcXVlJiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5zd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbnMgYW4gaW5pdGlhbGl6ZXIgbGlzdCB0byBhICVkZXF1ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhICVkZXF1ZSB3aXRoIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlCisgICAgICAgKiAgaW5pdGlhbGl6ZXJfbGlzdCBAYSBfX2wuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgYXNzaWdubWVudCBjb21wbGV0ZWx5IGNoYW5nZXMgdGhlICVkZXF1ZSBhbmQgdGhhdCB0aGUKKyAgICAgICAqICByZXN1bHRpbmcgJWRlcXVlJ3Mgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCisgICAgICAgKiAgYXNzaWduZWQuICBPbGQgZGF0YSBtYXkgYmUgbG9zdC4KKyAgICAgICAqLworICAgICAgZGVxdWUmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+YXNzaWduKF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbnMgYSBnaXZlbiB2YWx1ZSB0byBhICVkZXF1ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIGJlIGFzc2lnbmVkLgorICAgICAgICogIEBwYXJhbSAgX192YWwgIFZhbHVlIHRvIGJlIGFzc2lnbmVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGEgJWRlcXVlIHdpdGggQGEgbiBjb3BpZXMgb2YgdGhlIGdpdmVuCisgICAgICAgKiAgdmFsdWUuICBOb3RlIHRoYXQgdGhlIGFzc2lnbm1lbnQgY29tcGxldGVseSBjaGFuZ2VzIHRoZQorICAgICAgICogICVkZXF1ZSBhbmQgdGhhdCB0aGUgcmVzdWx0aW5nICVkZXF1ZSdzIHNpemUgaXMgdGhlIHNhbWUgYXMKKyAgICAgICAqICB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFzc2lnbmVkLiAgT2xkIGRhdGEgbWF5IGJlIGxvc3QuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCkKKyAgICAgIHsgX01fZmlsbF9hc3NpZ24oX19uLCBfX3ZhbCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBc3NpZ25zIGEgcmFuZ2UgdG8gYSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGEgJWRlcXVlIHdpdGggY29waWVzIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUKKyAgICAgICAqICByYW5nZSBbX19maXJzdCxfX2xhc3QpLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGFzc2lnbm1lbnQgY29tcGxldGVseSBjaGFuZ2VzIHRoZSAlZGVxdWUgYW5kIHRoYXQgdGhlCisgICAgICAgKiAgcmVzdWx0aW5nICVkZXF1ZSdzIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBlbGVtZW50cworICAgICAgICogIGFzc2lnbmVkLiAgT2xkIGRhdGEgbWF5IGJlIGxvc3QuCisgICAgICAgKi8KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyAgICAgICAgdm9pZAorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7IF9NX2Fzc2lnbl9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9fZmFsc2VfdHlwZSgpKTsgfQorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+OjpfX3R5cGUgX0ludGVncmFsOworCSAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworCX0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBc3NpZ25zIGFuIGluaXRpYWxpemVyIGxpc3QgdG8gYSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSAlZGVxdWUgd2l0aCBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQorICAgICAgICogIGluaXRpYWxpemVyX2xpc3QgQGEgX19sLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGFzc2lnbm1lbnQgY29tcGxldGVseSBjaGFuZ2VzIHRoZSAlZGVxdWUgYW5kIHRoYXQgdGhlCisgICAgICAgKiAgcmVzdWx0aW5nICVkZXF1ZSdzIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBlbGVtZW50cworICAgICAgICogIGFzc2lnbmVkLiAgT2xkIGRhdGEgbWF5IGJlIGxvc3QuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGFzc2lnbihpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgdGhpcy0+YXNzaWduKF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYKKworICAgICAgLy8vIEdldCBhIGNvcHkgb2YgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIG9iamVjdC4KKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9CYXNlOjpnZXRfYWxsb2NhdG9yKCk7IH0KKworICAgICAgLy8gaXRlcmF0b3JzCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUKKyAgICAgICAqICAlZGVxdWUuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9zdGFydDsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJWRlcXVlLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQ7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAlZGVxdWUuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9maW5pc2g7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0CisgICAgICAgKiAgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgJWRlcXVlLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4KKyAgICAgICAqICBvcmRpbmFyeSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlCisgICAgICAgKiAgbGFzdCBlbGVtZW50IGluIHRoZSAlZGVxdWUuICBJdGVyYXRpb24gaXMgZG9uZSBpbiByZXZlcnNlCisgICAgICAgKiAgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9maW5pc2gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgdG8gdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgJWRlcXVlLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4KKyAgICAgICAqICByZXZlcnNlIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIG9uZQorICAgICAgICogIGJlZm9yZSB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgJWRlcXVlLiAgSXRlcmF0aW9uIGlzIGRvbmUKKyAgICAgICAqICBpbiByZXZlcnNlIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cworICAgICAgICogIHRvIG9uZSBiZWZvcmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlICVkZXF1ZS4gIEl0ZXJhdGlvbiBpcworICAgICAgICogIGRvbmUgaW4gcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9zdGFydCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAlZGVxdWUuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQ7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0CisgICAgICAgKiAgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgJWRlcXVlLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4KKyAgICAgICAqICBvcmRpbmFyeSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cworICAgICAgICogIHRvIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlICVkZXF1ZS4gIEl0ZXJhdGlvbiBpcyBkb25lIGluCisgICAgICAgKiAgcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9maW5pc2gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgdG8gb25lIGJlZm9yZSB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgJWRlcXVlLiAgSXRlcmF0aW9uIGlzCisgICAgICAgKiAgZG9uZSBpbiByZXZlcnNlIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9zdGFydCk7IH0KKyNlbmRpZgorCisgICAgICAvLyBbMjMuMi4xLjJdIGNhcGFjaXR5CisgICAgICAvKiogIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgJWRlcXVlLiAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCAtIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQ7IH0KKworICAgICAgLyoqICBSZXR1cm5zIHRoZSBzaXplKCkgb2YgdGhlIGxhcmdlc3QgcG9zc2libGUgJWRlcXVlLiAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fZ2V0X1RwX2FsbG9jYXRvcigpLm1heF9zaXplKCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVzaXplcyB0aGUgJWRlcXVlIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19uZXdfc2l6ZSAgTnVtYmVyIG9mIGVsZW1lbnRzIHRoZSAlZGVxdWUgc2hvdWxkIGNvbnRhaW4uCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCAlcmVzaXplIHRoZSAlZGVxdWUgdG8gdGhlIHNwZWNpZmllZAorICAgICAgICogIG51bWJlciBvZiBlbGVtZW50cy4gIElmIHRoZSBudW1iZXIgaXMgc21hbGxlciB0aGFuIHRoZQorICAgICAgICogICVkZXF1ZSdzIGN1cnJlbnQgc2l6ZSB0aGUgJWRlcXVlIGlzIHRydW5jYXRlZCwgb3RoZXJ3aXNlCisgICAgICAgKiAgZGVmYXVsdCBjb25zdHJ1Y3RlZCBlbGVtZW50cyBhcmUgYXBwZW5kZWQuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSkKKyAgICAgIHsKKwljb25zdCBzaXplX3R5cGUgX19sZW4gPSBzaXplKCk7CisJaWYgKF9fbmV3X3NpemUgPiBfX2xlbikKKwkgIF9NX2RlZmF1bHRfYXBwZW5kKF9fbmV3X3NpemUgLSBfX2xlbik7CisJZWxzZSBpZiAoX19uZXdfc2l6ZSA8IF9fbGVuKQorCSAgX01fZXJhc2VfYXRfZW5kKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQKKwkJCSAgKyBkaWZmZXJlbmNlX3R5cGUoX19uZXdfc2l6ZSkpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlc2l6ZXMgdGhlICVkZXF1ZSB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9fbmV3X3NpemUgIE51bWJlciBvZiBlbGVtZW50cyB0aGUgJWRlcXVlIHNob3VsZCBjb250YWluLgorICAgICAgICogIEBwYXJhbSAgX194ICBEYXRhIHdpdGggd2hpY2ggbmV3IGVsZW1lbnRzIHNob3VsZCBiZSBwb3B1bGF0ZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCAlcmVzaXplIHRoZSAlZGVxdWUgdG8gdGhlIHNwZWNpZmllZAorICAgICAgICogIG51bWJlciBvZiBlbGVtZW50cy4gIElmIHRoZSBudW1iZXIgaXMgc21hbGxlciB0aGFuIHRoZQorICAgICAgICogICVkZXF1ZSdzIGN1cnJlbnQgc2l6ZSB0aGUgJWRlcXVlIGlzIHRydW5jYXRlZCwgb3RoZXJ3aXNlIHRoZQorICAgICAgICogICVkZXF1ZSBpcyBleHRlbmRlZCBhbmQgbmV3IGVsZW1lbnRzIGFyZSBwb3B1bGF0ZWQgd2l0aCBnaXZlbgorICAgICAgICogIGRhdGEuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeworCWNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKTsKKwlpZiAoX19uZXdfc2l6ZSA+IF9fbGVuKQorCSAgaW5zZXJ0KHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLCBfX25ld19zaXplIC0gX19sZW4sIF9feCk7CisJZWxzZSBpZiAoX19uZXdfc2l6ZSA8IF9fbGVuKQorCSAgX01fZXJhc2VfYXRfZW5kKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQKKwkJCSAgKyBkaWZmZXJlbmNlX3R5cGUoX19uZXdfc2l6ZSkpOworICAgICAgfQorI2Vsc2UKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVzaXplcyB0aGUgJWRlcXVlIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19uZXdfc2l6ZSAgTnVtYmVyIG9mIGVsZW1lbnRzIHRoZSAlZGVxdWUgc2hvdWxkIGNvbnRhaW4uCisgICAgICAgKiAgQHBhcmFtICBfX3ggIERhdGEgd2l0aCB3aGljaCBuZXcgZWxlbWVudHMgc2hvdWxkIGJlIHBvcHVsYXRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsICVyZXNpemUgdGhlICVkZXF1ZSB0byB0aGUgc3BlY2lmaWVkCisgICAgICAgKiAgbnVtYmVyIG9mIGVsZW1lbnRzLiAgSWYgdGhlIG51bWJlciBpcyBzbWFsbGVyIHRoYW4gdGhlCisgICAgICAgKiAgJWRlcXVlJ3MgY3VycmVudCBzaXplIHRoZSAlZGVxdWUgaXMgdHJ1bmNhdGVkLCBvdGhlcndpc2UgdGhlCisgICAgICAgKiAgJWRlcXVlIGlzIGV4dGVuZGVkIGFuZCBuZXcgZWxlbWVudHMgYXJlIHBvcHVsYXRlZCB3aXRoIGdpdmVuCisgICAgICAgKiAgZGF0YS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCB2YWx1ZV90eXBlIF9feCA9IHZhbHVlX3R5cGUoKSkKKyAgICAgIHsKKwljb25zdCBzaXplX3R5cGUgX19sZW4gPSBzaXplKCk7CisJaWYgKF9fbmV3X3NpemUgPiBfX2xlbikKKwkgIGluc2VydCh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwgX19uZXdfc2l6ZSAtIF9fbGVuLCBfX3gpOworCWVsc2UgaWYgKF9fbmV3X3NpemUgPCBfX2xlbikKKwkgIF9NX2VyYXNlX2F0X2VuZCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0CisJCQkgICsgZGlmZmVyZW5jZV90eXBlKF9fbmV3X3NpemUpKTsKKyAgICAgIH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqICBBIG5vbi1iaW5kaW5nIHJlcXVlc3QgdG8gcmVkdWNlIG1lbW9yeSB1c2UuICAqLworICAgICAgdm9pZAorICAgICAgc2hyaW5rX3RvX2ZpdCgpCisgICAgICB7IF9NX3Nocmlua190b19maXQoKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgJWRlcXVlIGlzIGVtcHR5LiAgKFRodXMgYmVnaW4oKSB3b3VsZAorICAgICAgICogIGVxdWFsIGVuZCgpLikKKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPT0gdGhpcy0+X01faW1wbC5fTV9zdGFydDsgfQorCisgICAgICAvLyBlbGVtZW50IGFjY2VzcworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFN1YnNjcmlwdCBhY2Nlc3MgdG8gdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtIF9fbiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlCisgICAgICAgKiAgYWNjZXNzZWQuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC93cml0ZSByZWZlcmVuY2UgdG8gZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRvciBhbGxvd3MgZm9yIGVhc3ksIGFycmF5LXN0eWxlLCBkYXRhIGFjY2Vzcy4KKyAgICAgICAqICBOb3RlIHRoYXQgZGF0YSBhY2Nlc3Mgd2l0aCB0aGlzIG9wZXJhdG9yIGlzIHVuY2hlY2tlZCBhbmQKKyAgICAgICAqICBvdXRfb2ZfcmFuZ2UgbG9va3VwcyBhcmUgbm90IGRlZmluZWQuIChGb3IgY2hlY2tlZCBsb29rdXBzCisgICAgICAgKiAgc2VlIGF0KCkuKQorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fc3RhcnRbZGlmZmVyZW5jZV90eXBlKF9fbildOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBTdWJzY3JpcHQgYWNjZXNzIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJWRlcXVlLgorICAgICAgICogIEBwYXJhbSBfX24gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IGZvciB3aGljaCBkYXRhIHNob3VsZCBiZQorICAgICAgICogIGFjY2Vzc2VkLgorICAgICAgICogIEByZXR1cm4gIFJlYWQtb25seSAoY29uc3RhbnQpIHJlZmVyZW5jZSB0byBkYXRhLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9wZXJhdG9yIGFsbG93cyBmb3IgZWFzeSwgYXJyYXktc3R5bGUsIGRhdGEgYWNjZXNzLgorICAgICAgICogIE5vdGUgdGhhdCBkYXRhIGFjY2VzcyB3aXRoIHRoaXMgb3BlcmF0b3IgaXMgdW5jaGVja2VkIGFuZAorICAgICAgICogIG91dF9vZl9yYW5nZSBsb29rdXBzIGFyZSBub3QgZGVmaW5lZC4gKEZvciBjaGVja2VkIGxvb2t1cHMKKyAgICAgICAqICBzZWUgYXQoKS4pCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9zdGFydFtkaWZmZXJlbmNlX3R5cGUoX19uKV07IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vLyBTYWZldHkgY2hlY2sgdXNlZCBvbmx5IGZyb20gYXQoKS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX3JhbmdlX2NoZWNrKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7CisJaWYgKF9fbiA+PSB0aGlzLT5zaXplKCkpCisJICBfX3Rocm93X291dF9vZl9yYW5nZShfX04oImRlcXVlOjpfTV9yYW5nZV9jaGVjayIpKTsKKyAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJWRlcXVlLgorICAgICAgICogIEBwYXJhbSBfX24gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IGZvciB3aGljaCBkYXRhIHNob3VsZCBiZQorICAgICAgICogIGFjY2Vzc2VkLgorICAgICAgICogIEByZXR1cm4gIFJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIGRhdGEuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19uIGlzIGFuIGludmFsaWQgaW5kZXguCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgZm9yIHNhZmVyIGRhdGEgYWNjZXNzLiAgVGhlIHBhcmFtZXRlcgorICAgICAgICogIGlzIGZpcnN0IGNoZWNrZWQgdGhhdCBpdCBpcyBpbiB0aGUgcmFuZ2Ugb2YgdGhlIGRlcXVlLiAgVGhlCisgICAgICAgKiAgZnVuY3Rpb24gdGhyb3dzIG91dF9vZl9yYW5nZSBpZiB0aGUgY2hlY2sgZmFpbHMuCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgYXQoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlfTV9yYW5nZV9jaGVjayhfX24pOworCXJldHVybiAoKnRoaXMpW19fbl07CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJWRlcXVlLgorICAgICAgICogIEBwYXJhbSBfX24gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IGZvciB3aGljaCBkYXRhIHNob3VsZCBiZQorICAgICAgICogIGFjY2Vzc2VkLgorICAgICAgICogIEByZXR1cm4gIFJlYWQtb25seSAoY29uc3RhbnQpIHJlZmVyZW5jZSB0byBkYXRhLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIF9fbiBpcyBhbiBpbnZhbGlkIGluZGV4LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGZvciBzYWZlciBkYXRhIGFjY2Vzcy4gIFRoZSBwYXJhbWV0ZXIgaXMgZmlyc3QKKyAgICAgICAqICBjaGVja2VkIHRoYXQgaXQgaXMgaW4gdGhlIHJhbmdlIG9mIHRoZSBkZXF1ZS4gIFRoZSBmdW5jdGlvbiB0aHJvd3MKKyAgICAgICAqICBvdXRfb2ZfcmFuZ2UgaWYgdGhlIGNoZWNrIGZhaWxzLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7CisJX01fcmFuZ2VfY2hlY2soX19uKTsKKwlyZXR1cm4gKCp0aGlzKVtfX25dOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJWRlcXVlLgorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIGZyb250KCkKKyAgICAgIHsgcmV0dXJuICpiZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJWRlcXVlLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGZyb250KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpiZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZQorICAgICAgICogICVkZXF1ZS4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBiYWNrKCkKKyAgICAgIHsKKwlpdGVyYXRvciBfX3RtcCA9IGVuZCgpOworCS0tX190bXA7CisJcmV0dXJuICpfX3RtcDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgbGFzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICVkZXF1ZS4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBiYWNrKCkgY29uc3QKKyAgICAgIHsKKwljb25zdF9pdGVyYXRvciBfX3RtcCA9IGVuZCgpOworCS0tX190bXA7CisJcmV0dXJuICpfX3RtcDsKKyAgICAgIH0KKworICAgICAgLy8gWzIzLjIuMS4yXSBtb2RpZmllcnMKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWRkIGRhdGEgdG8gdGhlIGZyb250IG9mIHRoZSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIERhdGEgdG8gYmUgYWRkZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSB0eXBpY2FsIHN0YWNrIG9wZXJhdGlvbi4gIFRoZSBmdW5jdGlvbiBjcmVhdGVzIGFuCisgICAgICAgKiAgZWxlbWVudCBhdCB0aGUgZnJvbnQgb2YgdGhlICVkZXF1ZSBhbmQgYXNzaWducyB0aGUgZ2l2ZW4KKyAgICAgICAqICBkYXRhIHRvIGl0LiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgYSAlZGVxdWUgdGhpcyBvcGVyYXRpb24KKyAgICAgICAqICBjYW4gYmUgZG9uZSBpbiBjb25zdGFudCB0aW1lLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwdXNoX2Zyb250KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlpZiAodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIgIT0gdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9maXJzdCkKKwkgIHsKKwkgICAgdGhpcy0+X01faW1wbC5jb25zdHJ1Y3QodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIgLSAxLCBfX3gpOworCSAgICAtLXRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyOworCSAgfQorCWVsc2UKKwkgIF9NX3B1c2hfZnJvbnRfYXV4KF9feCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBwdXNoX2Zyb250KHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7IGVtcGxhY2VfZnJvbnQoc3RkOjptb3ZlKF9feCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGVtcGxhY2VfZnJvbnQoX0FyZ3MmJi4uLiBfX2FyZ3MpOworI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWRkIGRhdGEgdG8gdGhlIGVuZCBvZiB0aGUgJWRlcXVlLgorICAgICAgICogIEBwYXJhbSAgX194ICBEYXRhIHRvIGJlIGFkZGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgdHlwaWNhbCBzdGFjayBvcGVyYXRpb24uICBUaGUgZnVuY3Rpb24gY3JlYXRlcyBhbgorICAgICAgICogIGVsZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgJWRlcXVlIGFuZCBhc3NpZ25zIHRoZSBnaXZlbiBkYXRhCisgICAgICAgKiAgdG8gaXQuICBEdWUgdG8gdGhlIG5hdHVyZSBvZiBhICVkZXF1ZSB0aGlzIG9wZXJhdGlvbiBjYW4gYmUKKyAgICAgICAqICBkb25lIGluIGNvbnN0YW50IHRpbWUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfYmFjayhjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7CisJaWYgKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2N1cgorCSAgICAhPSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9sYXN0IC0gMSkKKwkgIHsKKwkgICAgdGhpcy0+X01faW1wbC5jb25zdHJ1Y3QodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyLCBfX3gpOworCSAgICArK3RoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2N1cjsKKwkgIH0KKwllbHNlCisJICBfTV9wdXNoX2JhY2tfYXV4KF9feCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBwdXNoX2JhY2sodmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShfX3gpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBlbXBsYWNlX2JhY2soX0FyZ3MmJi4uLiBfX2FyZ3MpOworI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlcyBmaXJzdCBlbGVtZW50LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgdHlwaWNhbCBzdGFjayBvcGVyYXRpb24uICBJdCBzaHJpbmtzIHRoZSAlZGVxdWUgYnkgb25lLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgbm8gZGF0YSBpcyByZXR1cm5lZCwgYW5kIGlmIHRoZSBmaXJzdCBlbGVtZW50J3MgZGF0YSBpcworICAgICAgICogIG5lZWRlZCwgaXQgc2hvdWxkIGJlIHJldHJpZXZlZCBiZWZvcmUgcG9wX2Zyb250KCkgaXMgY2FsbGVkLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwb3BfZnJvbnQoKQorICAgICAgeworCWlmICh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2N1cgorCSAgICAhPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2xhc3QgLSAxKQorCSAgeworCSAgICB0aGlzLT5fTV9pbXBsLmRlc3Ryb3kodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIpOworCSAgICArK3RoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyOworCSAgfQorCWVsc2UKKwkgIF9NX3BvcF9mcm9udF9hdXgoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmVzIGxhc3QgZWxlbWVudC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIHR5cGljYWwgc3RhY2sgb3BlcmF0aW9uLiAgSXQgc2hyaW5rcyB0aGUgJWRlcXVlIGJ5IG9uZS4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IG5vIGRhdGEgaXMgcmV0dXJuZWQsIGFuZCBpZiB0aGUgbGFzdCBlbGVtZW50J3MgZGF0YSBpcworICAgICAgICogIG5lZWRlZCwgaXQgc2hvdWxkIGJlIHJldHJpZXZlZCBiZWZvcmUgcG9wX2JhY2soKSBpcyBjYWxsZWQuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBvcF9iYWNrKCkKKyAgICAgIHsKKwlpZiAodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyCisJICAgICE9IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2ZpcnN0KQorCSAgeworCSAgICAtLXRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2N1cjsKKwkgICAgdGhpcy0+X01faW1wbC5kZXN0cm95KHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2N1cik7CisJICB9CisJZWxzZQorCSAgX01fcG9wX2JhY2tfYXV4KCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydHMgYW4gb2JqZWN0IGluICVkZXF1ZSBiZWZvcmUgc3BlY2lmaWVkIGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgaW50byB0aGUgJWRlcXVlLgorICAgICAgICogIEBwYXJhbSAgX19hcmdzICBBcmd1bWVudHMuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIGRhdGEuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgYW4gb2JqZWN0IG9mIHR5cGUgVCBjb25zdHJ1Y3RlZAorICAgICAgICogIHdpdGggVChzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgZW1wbGFjZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJncyYmLi4uIF9fYXJncyk7CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGdpdmVuIHZhbHVlIGludG8gJWRlcXVlIGJlZm9yZSBzcGVjaWZpZWQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBBbiBpdGVyYXRvciBpbnRvIHRoZSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIERhdGEgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIGRhdGEuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgYSBjb3B5IG9mIHRoZSBnaXZlbiB2YWx1ZSBiZWZvcmUgdGhlCisgICAgICAgKiAgc3BlY2lmaWVkIGxvY2F0aW9uLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydHMgZ2l2ZW4gcnZhbHVlIGludG8gJWRlcXVlIGJlZm9yZSBzcGVjaWZpZWQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBBbiBpdGVyYXRvciBpbnRvIHRoZSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIERhdGEgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIGRhdGEuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgYSBjb3B5IG9mIHRoZSBnaXZlbiBydmFsdWUgYmVmb3JlIHRoZQorICAgICAgICogIHNwZWNpZmllZCBsb2NhdGlvbi4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCB2YWx1ZV90eXBlJiYgX194KQorICAgICAgeyByZXR1cm4gZW1wbGFjZShfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGFuIGluaXRpYWxpemVyIGxpc3QgaW50byB0aGUgJWRlcXVlLgorICAgICAgICogIEBwYXJhbSAgX19wICBBbiBpdGVyYXRvciBpbnRvIHRoZSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgY29waWVzIG9mIHRoZSBkYXRhIGluIHRoZQorICAgICAgICogIGluaXRpYWxpemVyX2xpc3QgQGEgX19sIGludG8gdGhlICVkZXF1ZSBiZWZvcmUgdGhlIGxvY2F0aW9uCisgICAgICAgKiAgc3BlY2lmaWVkIGJ5IEBhIF9fcC4gIFRoaXMgaXMga25vd24gYXMgPGVtPmxpc3QgaW5zZXJ0PC9lbT4uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3AsIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyB0aGlzLT5pbnNlcnQoX19wLCBfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyBhIG51bWJlciBvZiBjb3BpZXMgb2YgZ2l2ZW4gZGF0YSBpbnRvIHRoZSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBBbiBpdGVyYXRvciBpbnRvIHRoZSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBlbGVtZW50cyB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRGF0YSB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhIHNwZWNpZmllZCBudW1iZXIgb2YgY29waWVzIG9mIHRoZSBnaXZlbgorICAgICAgICogIGRhdGEgYmVmb3JlIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgQGEgX19wb3NpdGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgX01fZmlsbF9pbnNlcnQoX19wb3NpdGlvbiwgX19uLCBfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyBhIHJhbmdlIGludG8gdGhlICVkZXF1ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIGludG8gdGhlICVkZXF1ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgY29waWVzIG9mIHRoZSBkYXRhIGluIHRoZSByYW5nZQorICAgICAgICogIFtfX2ZpcnN0LF9fbGFzdCkgaW50byB0aGUgJWRlcXVlIGJlZm9yZSB0aGUgbG9jYXRpb24gc3BlY2lmaWVkCisgICAgICAgKiAgYnkgQGEgX19wb3NpdGlvbi4gIFRoaXMgaXMga25vd24gYXMgPGVtPnJhbmdlIGluc2VydDwvZW0+LgorICAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsCisJICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeyBfTV9pbnNlcnRfZGlzcGF0Y2goX19wb3NpdGlvbiwgX19maXJzdCwgX19sYXN0LCBfX2ZhbHNlX3R5cGUoKSk7IH0KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKwkgICAgICAgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+OjpfX3R5cGUgX0ludGVncmFsOworCSAgX01faW5zZXJ0X2Rpc3BhdGNoKF9fcG9zaXRpb24sIF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworCX0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBlbGVtZW50IGF0IGdpdmVuIHBvc2l0aW9uLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gZWxlbWVudCB0byBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIG5leHQgZWxlbWVudCAob3IgZW5kKCkpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgZXJhc2UgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIGFuZCB0aHVzCisgICAgICAgKiAgc2hvcnRlbiB0aGUgJWRlcXVlIGJ5IG9uZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIHVzZXIgaXMgY2F1dGlvbmVkIHRoYXQKKyAgICAgICAqICB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LCBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudCBpcworICAgICAgICogIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LgorICAgICAgICogIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmUgYSByYW5nZSBvZiBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gb25lIHBhc3QgdGhlIGxhc3QgZWxlbWVudCB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IHBvaW50ZWQgdG8gYnkgQGEgbGFzdAorICAgICAgICogICAgICAgICAgIHByaW9yIHRvIGVyYXNpbmcgKG9yIGVuZCgpKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGVyYXNlIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UKKyAgICAgICAqICBbX19maXJzdCxfX2xhc3QpIGFuZCBzaG9ydGVuIHRoZSAlZGVxdWUgYWNjb3JkaW5nbHkuCisgICAgICAgKgorICAgICAgICogIFRoZSB1c2VyIGlzIGNhdXRpb25lZCB0aGF0CisgICAgICAgKiAgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50cworICAgICAgICogIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55CisgICAgICAgKiAgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3dhcHMgZGF0YSB3aXRoIGFub3RoZXIgJWRlcXVlLgorICAgICAgICogIEBwYXJhbSAgX194ICBBICVkZXF1ZSBvZiB0aGUgc2FtZSBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZXhjaGFuZ2VzIHRoZSBlbGVtZW50cyBiZXR3ZWVuIHR3byBkZXF1ZXMgaW4gY29uc3RhbnQgdGltZS4KKyAgICAgICAqICAoRm91ciBwb2ludGVycywgc28gaXQgc2hvdWxkIGJlIHF1aXRlIGZhc3QuKQorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZ2xvYmFsIHN0ZDo6c3dhcCgpIGZ1bmN0aW9uIGlzIHNwZWNpYWxpemVkIHN1Y2ggdGhhdAorICAgICAgICogIHN0ZDo6c3dhcChkMSxkMikgd2lsbCBmZWVkIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoZGVxdWUmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnN3YXAodGhpcy0+X01faW1wbC5fTV9zdGFydCwgX194Ll9NX2ltcGwuX01fc3RhcnQpOworCXN0ZDo6c3dhcCh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwgX194Ll9NX2ltcGwuX01fZmluaXNoKTsKKwlzdGQ6OnN3YXAodGhpcy0+X01faW1wbC5fTV9tYXAsIF9feC5fTV9pbXBsLl9NX21hcCk7CisJc3RkOjpzd2FwKHRoaXMtPl9NX2ltcGwuX01fbWFwX3NpemUsIF9feC5fTV9pbXBsLl9NX21hcF9zaXplKTsKKworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyA0MzEuIFN3YXBwaW5nIGNvbnRhaW5lcnMgd2l0aCB1bmVxdWFsIGFsbG9jYXRvcnMuCisJc3RkOjpfX2FsbG9jX3N3YXA8X1RwX2FsbG9jX3R5cGU+OjpfU19kb19pdChfTV9nZXRfVHBfYWxsb2NhdG9yKCksCisJCQkJCQkgICAgX194Ll9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEVyYXNlcyBhbGwgdGhlIGVsZW1lbnRzLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlCisgICAgICAgKiAgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywgdGhlCisgICAgICAgKiAgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzCisgICAgICAgKiAgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyBfTV9lcmFzZV9hdF9lbmQoYmVnaW4oKSk7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIEludGVybmFsIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyBmb2xsb3cuCisKKyAgICAgIC8vIGNhbGxlZCBieSB0aGUgcmFuZ2UgY29uc3RydWN0b3IgdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDM4LiBBbWJpZ3VpdHkgaW4gdGhlICJkbyB0aGUgcmlnaHQgdGhpbmciIGNsYXVzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVnZXI+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwgX190cnVlX3R5cGUpCisgICAgICAgIHsKKwkgIF9NX2luaXRpYWxpemVfbWFwKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19uKSk7CisJICBfTV9maWxsX2luaXRpYWxpemUoX194KTsKKwl9CisKKyAgICAgIC8vIGNhbGxlZCBieSB0aGUgcmFuZ2UgY29uc3RydWN0b3IgdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkJICAgICAgIF9fZmFsc2VfdHlwZSkKKyAgICAgICAgeworCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OgorCSAgICBpdGVyYXRvcl9jYXRlZ29yeSBfSXRlckNhdGVnb3J5OworCSAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX2ZpcnN0LCBfX2xhc3QsIF9JdGVyQ2F0ZWdvcnkoKSk7CisJfQorCisgICAgICAvLyBjYWxsZWQgYnkgdGhlIHNlY29uZCBpbml0aWFsaXplX2Rpc3BhdGNoIGFib3ZlCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmlsbHMgdGhlIGRlcXVlIHdpdGggd2hhdGV2ZXIgaXMgaW4gW2ZpcnN0LGxhc3QpLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEByZXR1cm4gICBOb3RoaW5nLgorICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgaXRlcmF0b3JzIGFyZSBhY3R1YWxseSBmb3J3YXJkIGl0ZXJhdG9ycyAob3IgYmV0dGVyKSwgdGhlbiB0aGUKKyAgICAgICAqICBtZW1vcnkgbGF5b3V0IGNhbiBiZSBkb25lIGFsbCBhdCBvbmNlLiAgRWxzZSB3ZSBtb3ZlIGZvcndhcmQgdXNpbmcKKyAgICAgICAqICBwdXNoX2JhY2sgb24gZWFjaCB2YWx1ZSBmcm9tIHRoZSBpdGVyYXRvci4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQkgICAgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpOworCisgICAgICAvLyBjYWxsZWQgYnkgdGhlIHNlY29uZCBpbml0aWFsaXplX2Rpc3BhdGNoIGFib3ZlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX3JhbmdlX2luaXRpYWxpemUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKTsKKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEZpbGxzIHRoZSAlZGVxdWUgd2l0aCBjb3BpZXMgb2YgdmFsdWUuCisgICAgICAgKiAgQHBhcmFtICBfX3ZhbHVlICBJbml0aWFsIHZhbHVlLgorICAgICAgICogIEByZXR1cm4gICBOb3RoaW5nLgorICAgICAgICogIEBwcmUgX01fc3RhcnQgYW5kIF9NX2ZpbmlzaCBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCwKKyAgICAgICAqICBidXQgbm9uZSBvZiB0aGUgJWRlcXVlJ3MgZWxlbWVudHMgaGF2ZSB5ZXQgYmVlbiBjb25zdHJ1Y3RlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSB3aGVuIHRoZSB1c2VyIHByb3ZpZGVzIGFuIGV4cGxpY2l0IHNpemUKKyAgICAgICAqICAod2l0aCBvciB3aXRob3V0IGFuIGV4cGxpY2l0IGV4ZW1wbGFyIHZhbHVlKS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgX01fZmlsbF9pbml0aWFsaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsdWUpOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gY2FsbGVkIGJ5IGRlcXVlKG4pLgorICAgICAgdm9pZAorICAgICAgX01fZGVmYXVsdF9pbml0aWFsaXplKCk7CisjZW5kaWYKKworICAgICAgLy8gSW50ZXJuYWwgYXNzaWduIGZ1bmN0aW9ucyBmb2xsb3cuICBUaGUgKl9hdXggZnVuY3Rpb25zIGRvIHRoZSBhY3R1YWwKKyAgICAgIC8vIGFzc2lnbm1lbnQgd29yayBmb3IgdGhlIHJhbmdlIHZlcnNpb25zLgorCisgICAgICAvLyBjYWxsZWQgYnkgdGhlIHJhbmdlIGFzc2lnbiB0byBpbXBsZW1lbnQgWzIzLjEuMV0vOQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzguIEFtYmlndWl0eSBpbiB0aGUgImRvIHRoZSByaWdodCB0aGluZyIgY2xhdXNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZWdlcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3ZhbCwgX190cnVlX3R5cGUpCisgICAgICAgIHsgX01fZmlsbF9hc3NpZ24oX19uLCBfX3ZhbCk7IH0KKworICAgICAgLy8gY2FsbGVkIGJ5IHRoZSByYW5nZSBhc3NpZ24gdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQkgICBfX2ZhbHNlX3R5cGUpCisgICAgICAgIHsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjoKKwkgICAgaXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJDYXRlZ29yeTsKKwkgIF9NX2Fzc2lnbl9hdXgoX19maXJzdCwgX19sYXN0LCBfSXRlckNhdGVnb3J5KCkpOworCX0KKworICAgICAgLy8gY2FsbGVkIGJ5IHRoZSBzZWNvbmQgYXNzaWduX2Rpc3BhdGNoIGFib3ZlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9hc3NpZ25fYXV4KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICAgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpOworCisgICAgICAvLyBjYWxsZWQgYnkgdGhlIHNlY29uZCBhc3NpZ25fZGlzcGF0Y2ggYWJvdmUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fYXNzaWduX2F1eChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgICAgICB7CisJICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisJICBpZiAoX19sZW4gPiBzaXplKCkpCisJICAgIHsKKwkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkID0gX19maXJzdDsKKwkgICAgICBzdGQ6OmFkdmFuY2UoX19taWQsIHNpemUoKSk7CisJICAgICAgc3RkOjpjb3B5KF9fZmlyc3QsIF9fbWlkLCBiZWdpbigpKTsKKwkgICAgICBpbnNlcnQoZW5kKCksIF9fbWlkLCBfX2xhc3QpOworCSAgICB9CisJICBlbHNlCisJICAgIF9NX2VyYXNlX2F0X2VuZChzdGQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBiZWdpbigpKSk7CisJfQorCisgICAgICAvLyBDYWxsZWQgYnkgYXNzaWduKG4sdCksIGFuZCB0aGUgcmFuZ2UgYXNzaWduIHdoZW4gaXQgdHVybnMgb3V0CisgICAgICAvLyB0byBiZSB0aGUgc2FtZSB0aGluZy4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2ZpbGxfYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsKQorICAgICAgeworCWlmIChfX24gPiBzaXplKCkpCisJICB7CisJICAgIHN0ZDo6ZmlsbChiZWdpbigpLCBlbmQoKSwgX192YWwpOworCSAgICBpbnNlcnQoZW5kKCksIF9fbiAtIHNpemUoKSwgX192YWwpOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgX01fZXJhc2VfYXRfZW5kKGJlZ2luKCkgKyBkaWZmZXJlbmNlX3R5cGUoX19uKSk7CisJICAgIHN0ZDo6ZmlsbChiZWdpbigpLCBlbmQoKSwgX192YWwpOworCSAgfQorICAgICAgfQorCisgICAgICAvL0B7CisgICAgICAvLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgcHVzaF8qIGFuZCBwb3BfKi4KKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgICAgIHZvaWQgX01fcHVzaF9iYWNrX2F1eChjb25zdCB2YWx1ZV90eXBlJik7CisKKyAgICAgIHZvaWQgX01fcHVzaF9mcm9udF9hdXgoY29uc3QgdmFsdWVfdHlwZSYpOworI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkIF9NX3B1c2hfYmFja19hdXgoX0FyZ3MmJi4uLiBfX2FyZ3MpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZCBfTV9wdXNoX2Zyb250X2F1eChfQXJncyYmLi4uIF9fYXJncyk7CisjZW5kaWYKKworICAgICAgdm9pZCBfTV9wb3BfYmFja19hdXgoKTsKKworICAgICAgdm9pZCBfTV9wb3BfZnJvbnRfYXV4KCk7CisgICAgICAvL0B9CisKKyAgICAgIC8vIEludGVybmFsIGluc2VydCBmdW5jdGlvbnMgZm9sbG93LiAgVGhlICpfYXV4IGZ1bmN0aW9ucyBkbyB0aGUgYWN0dWFsCisgICAgICAvLyBpbnNlcnRpb24gd29yayB3aGVuIGFsbCBzaG9ydGN1dHMgZmFpbC4KKworICAgICAgLy8gY2FsbGVkIGJ5IHRoZSByYW5nZSBpbnNlcnQgdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDM4LiBBbWJpZ3VpdHkgaW4gdGhlICJkbyB0aGUgcmlnaHQgdGhpbmciIGNsYXVzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVnZXI+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLAorCQkJICAgX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsIF9fdHJ1ZV90eXBlKQorICAgICAgICB7IF9NX2ZpbGxfaW5zZXJ0KF9fcG9zLCBfX24sIF9feCk7IH0KKworICAgICAgLy8gY2FsbGVkIGJ5IHRoZSByYW5nZSBpbnNlcnQgdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywKKwkJCSAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgIF9fZmFsc2VfdHlwZSkKKyAgICAgICAgeworCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OgorCSAgICBpdGVyYXRvcl9jYXRlZ29yeSBfSXRlckNhdGVnb3J5OworICAgICAgICAgIF9NX3JhbmdlX2luc2VydF9hdXgoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX0l0ZXJDYXRlZ29yeSgpKTsKKwl9CisKKyAgICAgIC8vIGNhbGxlZCBieSB0aGUgc2Vjb25kIGluc2VydF9kaXNwYXRjaCBhYm92ZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fcmFuZ2VfaW5zZXJ0X2F1eChpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKwkJCSAgICBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKTsKKworICAgICAgLy8gY2FsbGVkIGJ5IHRoZSBzZWNvbmQgaW5zZXJ0X2Rpc3BhdGNoIGFib3ZlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX3JhbmdlX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3MsIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyk7CisKKyAgICAgIC8vIENhbGxlZCBieSBpbnNlcnQocCxuLHgpLCBhbmQgdGhlIHJhbmdlIGluc2VydCB3aGVuIGl0IHR1cm5zIG91dCB0byBiZQorICAgICAgLy8gdGhlIHNhbWUgdGhpbmcuICBDYW4gdXNlIGZpbGwgZnVuY3Rpb25zIGluIG9wdGltYWwgc2l0dWF0aW9ucywKKyAgICAgIC8vIG90aGVyd2lzZSBwYXNzZXMgb2ZmIHRvIGluc2VydF9hdXgocCxuLHgpLgorICAgICAgdm9pZAorICAgICAgX01fZmlsbF9pbnNlcnQoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisKKyAgICAgIC8vIGNhbGxlZCBieSBpbnNlcnQocCx4KQorI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIF9NX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3MsIF9BcmdzJiYuLi4gX19hcmdzKTsKKyNlbmRpZgorCisgICAgICAvLyBjYWxsZWQgYnkgaW5zZXJ0KHAsbix4KSB2aWEgZmlsbF9pbnNlcnQKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisKKyAgICAgIC8vIGNhbGxlZCBieSByYW5nZV9pbnNlcnRfYXV4IGZvciBmb3J3YXJkIGl0ZXJhdG9ycworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLAorCQkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgICAgICBzaXplX3R5cGUgX19uKTsKKworCisgICAgICAvLyBJbnRlcm5hbCBlcmFzZSBmdW5jdGlvbnMgZm9sbG93LgorCisgICAgICB2b2lkCisgICAgICBfTV9kZXN0cm95X2RhdGFfYXV4KGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCk7CisKKyAgICAgIC8vIENhbGxlZCBieSB+ZGVxdWUoKS4KKyAgICAgIC8vIE5COiBEb2Vzbid0IGRlYWxsb2NhdGUgdGhlIG5vZGVzLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jMT4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9kZXN0cm95X2RhdGEoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0LCBjb25zdCBfQWxsb2MxJikKKyAgICAgICAgeyBfTV9kZXN0cm95X2RhdGFfYXV4KF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgdm9pZAorICAgICAgX01fZGVzdHJveV9kYXRhKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICAgY29uc3Qgc3RkOjphbGxvY2F0b3I8X1RwPiYpCisgICAgICB7CisJaWYgKCFfX2hhc190cml2aWFsX2Rlc3RydWN0b3IodmFsdWVfdHlwZSkpCisJICBfTV9kZXN0cm95X2RhdGFfYXV4KF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICB9CisKKyAgICAgIC8vIENhbGxlZCBieSBlcmFzZShxMSwgcTIpLgorICAgICAgdm9pZAorICAgICAgX01fZXJhc2VfYXRfYmVnaW4oaXRlcmF0b3IgX19wb3MpCisgICAgICB7CisJX01fZGVzdHJveV9kYXRhKGJlZ2luKCksIF9fcG9zLCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCV9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlLCBfX3Bvcy5fTV9ub2RlKTsKKwl0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gX19wb3M7CisgICAgICB9CisKKyAgICAgIC8vIENhbGxlZCBieSBlcmFzZShxMSwgcTIpLCByZXNpemUoKSwgY2xlYXIoKSwgX01fYXNzaWduX2F1eCwKKyAgICAgIC8vIF9NX2ZpbGxfYXNzaWduLCBvcGVyYXRvcj0uCisgICAgICB2b2lkCisgICAgICBfTV9lcmFzZV9hdF9lbmQoaXRlcmF0b3IgX19wb3MpCisgICAgICB7CisJX01fZGVzdHJveV9kYXRhKF9fcG9zLCBlbmQoKSwgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwlfTV9kZXN0cm95X25vZGVzKF9fcG9zLl9NX25vZGUgKyAxLAorCQkJIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGUgKyAxKTsKKwl0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IF9fcG9zOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gQ2FsbGVkIGJ5IHJlc2l6ZShzeikuCisgICAgICB2b2lkCisgICAgICBfTV9kZWZhdWx0X2FwcGVuZChzaXplX3R5cGUgX19uKTsKKworICAgICAgYm9vbAorICAgICAgX01fc2hyaW5rX3RvX2ZpdCgpOworI2VuZGlmCisKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBNZW1vcnktaGFuZGxpbmcgaGVscGVycyBmb3IgdGhlIHByZXZpb3VzIGludGVybmFsIGluc2VydCBmdW5jdGlvbnMuCisgICAgICBpdGVyYXRvcgorICAgICAgX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9mcm9udChzaXplX3R5cGUgX19uKQorICAgICAgeworCWNvbnN0IHNpemVfdHlwZSBfX3ZhY2FuY2llcyA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2ZpcnN0OworCWlmIChfX24gPiBfX3ZhY2FuY2llcykKKwkgIF9NX25ld19lbGVtZW50c19hdF9mcm9udChfX24gLSBfX3ZhY2FuY2llcyk7CisJcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgLSBkaWZmZXJlbmNlX3R5cGUoX19uKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhzaXplX3R5cGUgX19uKQorICAgICAgeworCWNvbnN0IHNpemVfdHlwZSBfX3ZhY2FuY2llcyA9ICh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9sYXN0CisJCQkJICAgICAgIC0gdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyKSAtIDE7CisJaWYgKF9fbiA+IF9fdmFjYW5jaWVzKQorCSAgX01fbmV3X2VsZW1lbnRzX2F0X2JhY2soX19uIC0gX192YWNhbmNpZXMpOworCXJldHVybiB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCArIGRpZmZlcmVuY2VfdHlwZShfX24pOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9uZXdfZWxlbWVudHNfYXRfZnJvbnQoc2l6ZV90eXBlIF9fbmV3X2VsZW1lbnRzKTsKKworICAgICAgdm9pZAorICAgICAgX01fbmV3X2VsZW1lbnRzX2F0X2JhY2soc2l6ZV90eXBlIF9fbmV3X2VsZW1lbnRzKTsKKyAgICAgIC8vQH0KKworCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgTWVtb3J5LWhhbmRsaW5nIGhlbHBlcnMgZm9yIHRoZSBtYWpvciAlbWFwLgorICAgICAgICoKKyAgICAgICAqICBNYWtlcyBzdXJlIHRoZSBfTV9tYXAgaGFzIHNwYWNlIGZvciBuZXcgbm9kZXMuICBEb2VzIG5vdAorICAgICAgICogIGFjdHVhbGx5IGFkZCB0aGUgbm9kZXMuICBDYW4gaW52YWxpZGF0ZSBfTV9tYXAgcG9pbnRlcnMuCisgICAgICAgKiAgKEFuZCBjb25zZXF1ZW50bHksICVkZXF1ZSBpdGVyYXRvcnMuKQorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBfTV9yZXNlcnZlX21hcF9hdF9iYWNrKHNpemVfdHlwZSBfX25vZGVzX3RvX2FkZCA9IDEpCisgICAgICB7CisJaWYgKF9fbm9kZXNfdG9fYWRkICsgMSA+IHRoaXMtPl9NX2ltcGwuX01fbWFwX3NpemUKKwkgICAgLSAodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fbm9kZSAtIHRoaXMtPl9NX2ltcGwuX01fbWFwKSkKKwkgIF9NX3JlYWxsb2NhdGVfbWFwKF9fbm9kZXNfdG9fYWRkLCBmYWxzZSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3Jlc2VydmVfbWFwX2F0X2Zyb250KHNpemVfdHlwZSBfX25vZGVzX3RvX2FkZCA9IDEpCisgICAgICB7CisJaWYgKF9fbm9kZXNfdG9fYWRkID4gc2l6ZV90eXBlKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZQorCQkJCSAgICAgICAtIHRoaXMtPl9NX2ltcGwuX01fbWFwKSkKKwkgIF9NX3JlYWxsb2NhdGVfbWFwKF9fbm9kZXNfdG9fYWRkLCB0cnVlKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fcmVhbGxvY2F0ZV9tYXAoc2l6ZV90eXBlIF9fbm9kZXNfdG9fYWRkLCBib29sIF9fYWRkX2F0X2Zyb250KTsKKyAgICAgIC8vQH0KKyAgICB9OworCisKKyAgLyoqCisgICAqICBAYnJpZWYgIERlcXVlIGVxdWFsaXR5IGNvbXBhcmlzb24uCisgICAqICBAcGFyYW0gIF9feCAgQSAlZGVxdWUuCisgICAqICBAcGFyYW0gIF9feSAgQSAlZGVxdWUgb2YgdGhlIHNhbWUgdHlwZSBhcyBAYSBfX3guCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiB0aGUgc2l6ZSBhbmQgZWxlbWVudHMgb2YgdGhlIGRlcXVlcyBhcmUgZXF1YWwuCisgICAqCisgICAqICBUaGlzIGlzIGFuIGVxdWl2YWxlbmNlIHJlbGF0aW9uLiAgSXQgaXMgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZQorICAgKiAgZGVxdWVzLiAgRGVxdWVzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgaWYgdGhlaXIgc2l6ZXMgYXJlIGVxdWFsLAorICAgKiAgYW5kIGlmIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgY29tcGFyZSBlcXVhbC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5zaXplKCkgPT0gX195LnNpemUoKQorICAgICAgICAgICAgICYmIHN0ZDo6ZXF1YWwoX194LmJlZ2luKCksIF9feC5lbmQoKSwgX195LmJlZ2luKCkpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIERlcXVlIG9yZGVyaW5nIHJlbGF0aW9uLgorICAgKiAgQHBhcmFtICBfX3ggIEEgJWRlcXVlLgorICAgKiAgQHBhcmFtICBfX3kgIEEgJWRlcXVlIG9mIHRoZSBzYW1lIHR5cGUgYXMgQGEgX194LgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZmYgQGEgeCBpcyBsZXhpY29ncmFwaGljYWxseSBsZXNzIHRoYW4gQGEgX195LgorICAgKgorICAgKiAgVGhpcyBpcyBhIHRvdGFsIG9yZGVyaW5nIHJlbGF0aW9uLiAgSXQgaXMgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZQorICAgKiAgZGVxdWVzLiAgVGhlIGVsZW1lbnRzIG11c3QgYmUgY29tcGFyYWJsZSB3aXRoIEBjIDwuCisgICAqCisgICAqICBTZWUgc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgpIGZvciBob3cgdGhlIGRldGVybWluYXRpb24gaXMgbWFkZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3gsCisJICAgICAgY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZShfX3guYmVnaW4oKSwgX194LmVuZCgpLAorCQkJCQkgIF9feS5iZWdpbigpLCBfX3kuZW5kKCkpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPT0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9feCwKKwkgICAgICBjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisgIC8vLyBTZWUgc3RkOjpkZXF1ZTo6c3dhcCgpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoZGVxdWU8X1RwLF9BbGxvYz4mIF9feCwgZGVxdWU8X1RwLF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworI3VuZGVmIF9HTElCQ1hYX0RFUVVFX0JVRl9TSVpFCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8qIF9TVExfREVRVUVfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9mdW5jdGlvbi5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9mdW5jdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNTI5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX2Z1bmN0aW9uLmgKQEAgLTAsMCArMSw3MzQgQEAKKy8vIEZ1bmN0b3IgaW1wbGVtZW50YXRpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9mdW5jdGlvbi5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZnVuY3Rpb25hbH0KKyAqLworCisjaWZuZGVmIF9TVExfRlVOQ1RJT05fSAorI2RlZmluZSBfU1RMX0ZVTkNUSU9OX0ggMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gMjAuMy4xIGJhc2UgY2xhc3NlcworICAvKiogQGRlZmdyb3VwIGZ1bmN0b3JzIEZ1bmN0aW9uIE9iamVjdHMKKyAgICogQGluZ3JvdXAgdXRpbGl0aWVzCisgICAqCisgICAqICBGdW5jdGlvbiBvYmplY3RzLCBvciBAZSBmdW5jdG9ycywgYXJlIG9iamVjdHMgd2l0aCBhbiBAYyBvcGVyYXRvcigpCisgICAqICBkZWZpbmVkIGFuZCBhY2Nlc3NpYmxlLiAgVGhleSBjYW4gYmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byBhbGdvcml0aG0KKyAgICogIHRlbXBsYXRlcyBhbmQgdXNlZCBpbiBwbGFjZSBvZiBhIGZ1bmN0aW9uIHBvaW50ZXIuICBOb3Qgb25seSBpcyB0aGUKKyAgICogIHJlc3VsdGluZyBleHByZXNzaXZlbmVzcyBvZiB0aGUgbGlicmFyeSBpbmNyZWFzZWQsIGJ1dCB0aGUgZ2VuZXJhdGVkCisgICAqICBjb2RlIGNhbiBiZSBtb3JlIGVmZmljaWVudCB0aGFuIHdoYXQgeW91IG1pZ2h0IHdyaXRlIGJ5IGhhbmQuICBXaGVuIHdlCisgICAqICByZWZlciB0byBAYSBmdW5jdG9ycywgdGhlbiwgZ2VuZXJhbGx5IHdlIGluY2x1ZGUgZnVuY3Rpb24gcG9pbnRlcnMgaW4KKyAgICogIHRoZSBkZXNjcmlwdGlvbiBhcyB3ZWxsLgorICAgKgorICAgKiAgT2Z0ZW4sIGZ1bmN0b3JzIGFyZSBvbmx5IGNyZWF0ZWQgYXMgdGVtcG9yYXJpZXMgcGFzc2VkIHRvIGFsZ29yaXRobQorICAgKiAgY2FsbHMsIHJhdGhlciB0aGFuIGJlaW5nIGNyZWF0ZWQgYXMgbmFtZWQgdmFyaWFibGVzLgorICAgKgorICAgKiAgVHdvIGV4YW1wbGVzIHRha2VuIGZyb20gdGhlIHN0YW5kYXJkIGl0c2VsZiBmb2xsb3cuICBUbyBwZXJmb3JtIGEKKyAgICogIGJ5LWVsZW1lbnQgYWRkaXRpb24gb2YgdHdvIHZlY3RvcnMgQGMgYSBhbmQgQGMgYiBjb250YWluaW5nIEBjIGRvdWJsZSwKKyAgICogIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiBAYyBhLCB1c2UKKyAgICogIFxjb2RlCisgICAqICB0cmFuc2Zvcm0gKGEuYmVnaW4oKSwgYS5lbmQoKSwgYi5iZWdpbigpLCBhLmJlZ2luKCksIHBsdXM8ZG91YmxlPigpKTsKKyAgICogIFxlbmRjb2RlCisgICAqICBUbyBuZWdhdGUgZXZlcnkgZWxlbWVudCBpbiBAYyBhLCB1c2UKKyAgICogIFxjb2RlCisgICAqICB0cmFuc2Zvcm0oYS5iZWdpbigpLCBhLmVuZCgpLCBhLmJlZ2luKCksIG5lZ2F0ZTxkb3VibGU+KCkpOworICAgKiAgXGVuZGNvZGUKKyAgICogIFRoZSBhZGRpdGlvbiBhbmQgbmVnYXRpb24gZnVuY3Rpb25zIHdpbGwgYmUgaW5saW5lZCBkaXJlY3RseS4KKyAgICoKKyAgICogIFRoZSBzdGFuZGFyZCBmdW5jdG9ycyBhcmUgZGVyaXZlZCBmcm9tIHN0cnVjdHMgbmFtZWQgQGMgdW5hcnlfZnVuY3Rpb24KKyAgICogIGFuZCBAYyBiaW5hcnlfZnVuY3Rpb24uICBUaGVzZSB0d28gY2xhc3NlcyBjb250YWluIG5vdGhpbmcgYnV0IHR5cGVkZWZzLAorICAgKiAgdG8gYWlkIGluIGdlbmVyaWMgKHRlbXBsYXRlKSBwcm9ncmFtbWluZy4gIElmIHlvdSB3cml0ZSB5b3VyIG93bgorICAgKiAgZnVuY3RvcnMsIHlvdSBtaWdodCBjb25zaWRlciBkb2luZyB0aGUgc2FtZS4KKyAgICoKKyAgICogIEB7CisgICAqLworICAvKioKKyAgICogIFRoaXMgaXMgb25lIG9mIHRoZSBAbGluayBmdW5jdG9ycyBmdW5jdG9yIGJhc2UgY2xhc3Nlc0BlbmRsaW5rLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZywgdHlwZW5hbWUgX1Jlc3VsdD4KKyAgICBzdHJ1Y3QgdW5hcnlfZnVuY3Rpb24KKyAgICB7CisgICAgICAvLy8gQGMgYXJndW1lbnRfdHlwZSBpcyB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQKKyAgICAgIHR5cGVkZWYgX0FyZyAJYXJndW1lbnRfdHlwZTsgICAKKworICAgICAgLy8vIEBjIHJlc3VsdF90eXBlIGlzIHRoZSByZXR1cm4gdHlwZQorICAgICAgdHlwZWRlZiBfUmVzdWx0IAlyZXN1bHRfdHlwZTsgIAorICAgIH07CisKKyAgLyoqCisgICAqICBUaGlzIGlzIG9uZSBvZiB0aGUgQGxpbmsgZnVuY3RvcnMgZnVuY3RvciBiYXNlIGNsYXNzZXNAZW5kbGluay4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BcmcxLCB0eXBlbmFtZSBfQXJnMiwgdHlwZW5hbWUgX1Jlc3VsdD4KKyAgICBzdHJ1Y3QgYmluYXJ5X2Z1bmN0aW9uCisgICAgeworICAgICAgLy8vIEBjIGZpcnN0X2FyZ3VtZW50X3R5cGUgaXMgdGhlIHR5cGUgb2YgdGhlIGZpcnN0IGFyZ3VtZW50CisgICAgICB0eXBlZGVmIF9BcmcxIAlmaXJzdF9hcmd1bWVudF90eXBlOyAKKworICAgICAgLy8vIEBjIHNlY29uZF9hcmd1bWVudF90eXBlIGlzIHRoZSB0eXBlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQKKyAgICAgIHR5cGVkZWYgX0FyZzIgCXNlY29uZF9hcmd1bWVudF90eXBlOworCisgICAgICAvLy8gQGMgcmVzdWx0X3R5cGUgaXMgdGhlIHJldHVybiB0eXBlCisgICAgICB0eXBlZGVmIF9SZXN1bHQgCXJlc3VsdF90eXBlOworICAgIH07CisgIC8qKiBAfSAgKi8KKworICAvLyAyMC4zLjIgYXJpdGhtZXRpYworICAvKiogQGRlZmdyb3VwIGFyaXRobWV0aWNfZnVuY3RvcnMgQXJpdGhtZXRpYyBDbGFzc2VzCisgICAqIEBpbmdyb3VwIGZ1bmN0b3JzCisgICAqCisgICAqICBCZWNhdXNlIGJhc2ljIG1hdGggb2Z0ZW4gbmVlZHMgdG8gYmUgZG9uZSBkdXJpbmcgYW4gYWxnb3JpdGhtLAorICAgKiAgdGhlIGxpYnJhcnkgcHJvdmlkZXMgZnVuY3RvcnMgZm9yIHRob3NlIG9wZXJhdGlvbnMuICBTZWUgdGhlCisgICAqICBkb2N1bWVudGF0aW9uIGZvciBAbGluayBmdW5jdG9ycyB0aGUgYmFzZSBjbGFzc2VzQGVuZGxpbmsKKyAgICogIGZvciBleGFtcGxlcyBvZiB0aGVpciB1c2UuCisgICAqCisgICAqICBAeworICAgKi8KKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgYXJpdGhtZXRpY19mdW5jdG9ycyBtYXRoIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcGx1cyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIF9UcD4KKyAgICB7CisgICAgICBfVHAKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194ICsgX195OyB9CisgICAgfTsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBhcml0aG1ldGljX2Z1bmN0b3JzIG1hdGggZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBtaW51cyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIF9UcD4KKyAgICB7CisgICAgICBfVHAKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194IC0gX195OyB9CisgICAgfTsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBhcml0aG1ldGljX2Z1bmN0b3JzIG1hdGggZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBtdWx0aXBsaWVzIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgX1RwPgorICAgIHsKKyAgICAgIF9UcAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggKiBfX3k7IH0KKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGFyaXRobWV0aWNfZnVuY3RvcnMgbWF0aCBmdW5jdG9yc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGRpdmlkZXMgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBfVHA+CisgICAgeworICAgICAgX1RwCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCAvIF9feTsgfQorICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgYXJpdGhtZXRpY19mdW5jdG9ycyBtYXRoIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgbW9kdWx1cyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIF9UcD4KKyAgICB7CisgICAgICBfVHAKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194ICUgX195OyB9CisgICAgfTsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBhcml0aG1ldGljX2Z1bmN0b3JzIG1hdGggZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBuZWdhdGUgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLCBfVHA+CisgICAgeworICAgICAgX1RwCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gLV9feDsgfQorICAgIH07CisgIC8qKiBAfSAgKi8KKworICAvLyAyMC4zLjMgY29tcGFyaXNvbnMKKyAgLyoqIEBkZWZncm91cCBjb21wYXJpc29uX2Z1bmN0b3JzIENvbXBhcmlzb24gQ2xhc3NlcworICAgKiBAaW5ncm91cCBmdW5jdG9ycworICAgKgorICAgKiAgVGhlIGxpYnJhcnkgcHJvdmlkZXMgc2l4IHdyYXBwZXIgZnVuY3RvcnMgZm9yIGFsbCB0aGUgYmFzaWMgY29tcGFyaXNvbnMKKyAgICogIGluIEMrKywgbGlrZSBAYyA8LgorICAgKgorICAgKiAgQHsKKyAgICovCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGNvbXBhcmlzb25fZnVuY3RvcnMgY29tcGFyaXNvbiBmdW5jdG9yc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGVxdWFsX3RvIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgYm9vbD4KKyAgICB7CisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCA9PSBfX3k7IH0KKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGNvbXBhcmlzb25fZnVuY3RvcnMgY29tcGFyaXNvbiBmdW5jdG9yc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IG5vdF9lcXVhbF90byA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIGJvb2w+CisgICAgeworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggIT0gX195OyB9CisgICAgfTsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBjb21wYXJpc29uX2Z1bmN0b3JzIGNvbXBhcmlzb24gZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBncmVhdGVyIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgYm9vbD4KKyAgICB7CisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCA+IF9feTsgfQorICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgY29tcGFyaXNvbl9mdW5jdG9ycyBjb21wYXJpc29uIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgbGVzcyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIGJvb2w+CisgICAgeworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggPCBfX3k7IH0KKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGNvbXBhcmlzb25fZnVuY3RvcnMgY29tcGFyaXNvbiBmdW5jdG9yc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGdyZWF0ZXJfZXF1YWwgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBib29sPgorICAgIHsKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194ID49IF9feTsgfQorICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgY29tcGFyaXNvbl9mdW5jdG9ycyBjb21wYXJpc29uIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgbGVzc19lcXVhbCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIGJvb2w+CisgICAgeworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggPD0gX195OyB9CisgICAgfTsKKyAgLyoqIEB9ICAqLworCisgIC8vIDIwLjMuNCBsb2dpY2FsIG9wZXJhdGlvbnMKKyAgLyoqIEBkZWZncm91cCBsb2dpY2FsX2Z1bmN0b3JzIEJvb2xlYW4gT3BlcmF0aW9ucyBDbGFzc2VzCisgICAqIEBpbmdyb3VwIGZ1bmN0b3JzCisgICAqCisgICAqICBIZXJlIGFyZSB3cmFwcGVyIGZ1bmN0b3JzIGZvciBCb29sZWFuIG9wZXJhdGlvbnM6IEBjICYmLCBAYyB8fCwKKyAgICogIGFuZCBAYyAhLgorICAgKgorICAgKiAgQHsKKyAgICovCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGxvZ2ljYWxfZnVuY3RvcnMgQm9vbGVhbiBvcGVyYXRpb25zIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgbG9naWNhbF9hbmQgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBib29sPgorICAgIHsKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194ICYmIF9feTsgfQorICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgbG9naWNhbF9mdW5jdG9ycyBCb29sZWFuIG9wZXJhdGlvbnMgZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBsb2dpY2FsX29yIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgYm9vbD4KKyAgICB7CisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCB8fCBfX3k7IH0KKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGxvZ2ljYWxfZnVuY3RvcnMgQm9vbGVhbiBvcGVyYXRpb25zIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgbG9naWNhbF9ub3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLCBib29sPgorICAgIHsKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiAhX194OyB9CisgICAgfTsKKyAgLyoqIEB9ICAqLworCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gRFIgNjYwLiBNaXNzaW5nIEJpdHdpc2UgT3BlcmF0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBiaXRfYW5kIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgX1RwPgorICAgIHsKKyAgICAgIF9UcAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggJiBfX3k7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYml0X29yIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgX1RwPgorICAgIHsKKyAgICAgIF9UcAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggfCBfX3k7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYml0X3hvciA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIF9UcD4KKyAgICB7CisgICAgICBfVHAKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194IF4gX195OyB9CisgICAgfTsKKworICAvLyAyMC4zLjUgbmVnYXRvcnMKKyAgLyoqIEBkZWZncm91cCBuZWdhdG9ycyBOZWdhdG9ycworICAgKiBAaW5ncm91cCBmdW5jdG9ycworICAgKgorICAgKiAgVGhlIGZ1bmN0aW9ucyBAYyBub3QxIGFuZCBAYyBub3QyIGVhY2ggdGFrZSBhIHByZWRpY2F0ZSBmdW5jdG9yCisgICAqICBhbmQgcmV0dXJuIGFuIGluc3RhbmNlIG9mIEBjIHVuYXJ5X25lZ2F0ZSBvcgorICAgKiAgQGMgYmluYXJ5X25lZ2F0ZSwgcmVzcGVjdGl2ZWx5LiAgVGhlc2UgY2xhc3NlcyBhcmUgZnVuY3RvcnMgd2hvc2UKKyAgICogIEBjIG9wZXJhdG9yKCkgcGVyZm9ybXMgdGhlIHN0b3JlZCBwcmVkaWNhdGUgZnVuY3Rpb24gYW5kIHRoZW4gcmV0dXJucworICAgKiAgdGhlIG5lZ2F0aW9uIG9mIHRoZSByZXN1bHQuCisgICAqCisgICAqICBGb3IgZXhhbXBsZSwgZ2l2ZW4gYSB2ZWN0b3Igb2YgaW50ZWdlcnMgYW5kIGEgdHJpdmlhbCBwcmVkaWNhdGUsCisgICAqICBcY29kZQorICAgKiAgc3RydWN0IEludEdyZWF0ZXJUaGFuVGhyZWUKKyAgICogICAgOiBwdWJsaWMgc3RkOjp1bmFyeV9mdW5jdGlvbjxpbnQsIGJvb2w+CisgICAqICB7CisgICAqICAgICAgYm9vbCBvcGVyYXRvcigpIChpbnQgeCkgeyByZXR1cm4geCA+IDM7IH0KKyAgICogIH07CisgICAqCisgICAqICBzdGQ6OmZpbmRfaWYgKHYuYmVnaW4oKSwgdi5lbmQoKSwgbm90MShJbnRHcmVhdGVyVGhhblRocmVlKCkpKTsKKyAgICogIFxlbmRjb2RlCisgICAqICBUaGUgY2FsbCB0byBAYyBmaW5kX2lmIHdpbGwgbG9jYXRlIHRoZSBmaXJzdCBpbmRleCAoaSkgb2YgQGMgdiBmb3Igd2hpY2gKKyAgICogIDxjb2RlPiEodltpXSA+IDMpPC9jb2RlPiBpcyB0cnVlLgorICAgKgorICAgKiAgVGhlIG5vdDEvdW5hcnlfbmVnYXRlIGNvbWJpbmF0aW9uIHdvcmtzIG9uIHByZWRpY2F0ZXMgdGFraW5nIGEgc2luZ2xlCisgICAqICBhcmd1bWVudC4gIFRoZSBub3QyL2JpbmFyeV9uZWdhdGUgY29tYmluYXRpb24gd29ya3Mgb24gcHJlZGljYXRlcyB3aGljaAorICAgKiAgdGFrZSB0d28gYXJndW1lbnRzLgorICAgKgorICAgKiAgQHsKKyAgICovCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIG5lZ2F0b3JzIG5lZ2F0aW9uIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgY2xhc3MgdW5hcnlfbmVnYXRlCisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX1ByZWRpY2F0ZTo6YXJndW1lbnRfdHlwZSwgYm9vbD4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX1ByZWRpY2F0ZSBfTV9wcmVkOworCisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIHVuYXJ5X25lZ2F0ZShjb25zdCBfUHJlZGljYXRlJiBfX3gpIDogX01fcHJlZChfX3gpIHsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIF9QcmVkaWNhdGU6OmFyZ3VtZW50X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICFfTV9wcmVkKF9feCk7IH0KKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIG5lZ2F0b3JzIG5lZ2F0aW9uIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIHVuYXJ5X25lZ2F0ZTxfUHJlZGljYXRlPgorICAgIG5vdDEoY29uc3QgX1ByZWRpY2F0ZSYgX19wcmVkKQorICAgIHsgcmV0dXJuIHVuYXJ5X25lZ2F0ZTxfUHJlZGljYXRlPihfX3ByZWQpOyB9CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgbmVnYXRvcnMgbmVnYXRpb24gZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBjbGFzcyBiaW5hcnlfbmVnYXRlCisgICAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9QcmVkaWNhdGU6OmZpcnN0X2FyZ3VtZW50X3R5cGUsCisJCQkgICAgIHR5cGVuYW1lIF9QcmVkaWNhdGU6OnNlY29uZF9hcmd1bWVudF90eXBlLCBib29sPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfUHJlZGljYXRlIF9NX3ByZWQ7CisKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdAorICAgICAgYmluYXJ5X25lZ2F0ZShjb25zdCBfUHJlZGljYXRlJiBfX3gpIDogX01fcHJlZChfX3gpIHsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIF9QcmVkaWNhdGU6OmZpcnN0X2FyZ3VtZW50X3R5cGUmIF9feCwKKwkJIGNvbnN0IHR5cGVuYW1lIF9QcmVkaWNhdGU6OnNlY29uZF9hcmd1bWVudF90eXBlJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiAhX01fcHJlZChfX3gsIF9feSk7IH0KKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIG5lZ2F0b3JzIG5lZ2F0aW9uIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIGJpbmFyeV9uZWdhdGU8X1ByZWRpY2F0ZT4KKyAgICBub3QyKGNvbnN0IF9QcmVkaWNhdGUmIF9fcHJlZCkKKyAgICB7IHJldHVybiBiaW5hcnlfbmVnYXRlPF9QcmVkaWNhdGU+KF9fcHJlZCk7IH0KKyAgLyoqIEB9ICAqLworCisgIC8vIDIwLjMuNyBhZGFwdG9ycyBwb2ludGVycyBmdW5jdGlvbnMKKyAgLyoqIEBkZWZncm91cCBwb2ludGVyX2FkYXB0b3JzIEFkYXB0b3JzIGZvciBwb2ludGVycyB0byBmdW5jdGlvbnMKKyAgICogQGluZ3JvdXAgZnVuY3RvcnMKKyAgICoKKyAgICogIFRoZSBhZHZhbnRhZ2Ugb2YgZnVuY3Rpb24gb2JqZWN0cyBvdmVyIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBpcyB0aGF0CisgICAqICB0aGUgb2JqZWN0cyBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeSBkZWNsYXJlIG5lc3RlZCB0eXBlZGVmcyBkZXNjcmliaW5nCisgICAqICB0aGVpciBhcmd1bWVudCBhbmQgcmVzdWx0IHR5cGVzIHdpdGggdW5pZm9ybSBuYW1lcyAoZS5nLiwgQGMgcmVzdWx0X3R5cGUKKyAgICogIGZyb20gdGhlIGJhc2UgY2xhc3NlcyBAYyB1bmFyeV9mdW5jdGlvbiBhbmQgQGMgYmluYXJ5X2Z1bmN0aW9uKS4KKyAgICogIFNvbWV0aW1lcyB0aG9zZSB0eXBlZGVmcyBhcmUgcmVxdWlyZWQsIG5vdCBqdXN0IG9wdGlvbmFsLgorICAgKgorICAgKiAgQWRhcHRvcnMgYXJlIHByb3ZpZGVkIHRvIHR1cm4gcG9pbnRlcnMgdG8gdW5hcnkgKHNpbmdsZS1hcmd1bWVudCkgYW5kCisgICAqICBiaW5hcnkgKGRvdWJsZS1hcmd1bWVudCkgZnVuY3Rpb25zIGludG8gZnVuY3Rpb24gb2JqZWN0cy4gIFRoZQorICAgKiAgbG9uZy13aW5kZWQgZnVuY3RvciBAYyBwb2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uIGlzIGNvbnN0cnVjdGVkIHdpdGggYQorICAgKiAgZnVuY3Rpb24gcG9pbnRlciBAYyBmLCBhbmQgaXRzIEBjIG9wZXJhdG9yKCkgY2FsbGVkIHdpdGggYXJndW1lbnQgQGMgeAorICAgKiAgcmV0dXJucyBAYyBmKHgpLiAgVGhlIGZ1bmN0b3IgQGMgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb24gZG9lcyB0aGUgc2FtZQorICAgKiAgdGhpbmcsIGJ1dCB3aXRoIGEgZG91YmxlLWFyZ3VtZW50IEBjIGYgYW5kIEBjIG9wZXJhdG9yKCkuCisgICAqCisgICAqICBUaGUgZnVuY3Rpb24gQGMgcHRyX2Z1biB0YWtlcyBhIHBvaW50ZXItdG8tZnVuY3Rpb24gQGMgZiBhbmQgY29uc3RydWN0cworICAgKiAgYW4gaW5zdGFuY2Ugb2YgdGhlIGFwcHJvcHJpYXRlIGZ1bmN0b3IuCisgICAqCisgICAqICBAeworICAgKi8KKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgcG9pbnRlcl9hZGFwdG9ycyBhZGFwdG9ycyBmb3IgZnVuY3Rpb24gcG9pbnRlcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZywgdHlwZW5hbWUgX1Jlc3VsdD4KKyAgICBjbGFzcyBwb2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9BcmcsIF9SZXN1bHQ+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIF9SZXN1bHQgKCpfTV9wdHIpKF9BcmcpOworCisgICAgcHVibGljOgorICAgICAgcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbigpIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbihfUmVzdWx0ICgqX194KShfQXJnKSkKKyAgICAgIDogX01fcHRyKF9feCkgeyB9CisKKyAgICAgIF9SZXN1bHQKKyAgICAgIG9wZXJhdG9yKCkoX0FyZyBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wdHIoX194KTsgfQorICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgcG9pbnRlcl9hZGFwdG9ycyBhZGFwdG9ycyBmb3IgZnVuY3Rpb24gcG9pbnRlcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZywgdHlwZW5hbWUgX1Jlc3VsdD4KKyAgICBpbmxpbmUgcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbjxfQXJnLCBfUmVzdWx0PgorICAgIHB0cl9mdW4oX1Jlc3VsdCAoKl9feCkoX0FyZykpCisgICAgeyByZXR1cm4gcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbjxfQXJnLCBfUmVzdWx0PihfX3gpOyB9CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgcG9pbnRlcl9hZGFwdG9ycyBhZGFwdG9ycyBmb3IgZnVuY3Rpb24gcG9pbnRlcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZzEsIHR5cGVuYW1lIF9BcmcyLCB0eXBlbmFtZSBfUmVzdWx0PgorICAgIGNsYXNzIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uCisgICAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9BcmcxLCBfQXJnMiwgX1Jlc3VsdD4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX1Jlc3VsdCAoKl9NX3B0cikoX0FyZzEsIF9BcmcyKTsKKworICAgIHB1YmxpYzoKKyAgICAgIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uKCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbihfUmVzdWx0ICgqX194KShfQXJnMSwgX0FyZzIpKQorICAgICAgOiBfTV9wdHIoX194KSB7IH0KKworICAgICAgX1Jlc3VsdAorICAgICAgb3BlcmF0b3IoKShfQXJnMSBfX3gsIF9BcmcyIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3B0cihfX3gsIF9feSk7IH0KKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIHBvaW50ZXJfYWRhcHRvcnMgYWRhcHRvcnMgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BcmcxLCB0eXBlbmFtZSBfQXJnMiwgdHlwZW5hbWUgX1Jlc3VsdD4KKyAgICBpbmxpbmUgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb248X0FyZzEsIF9BcmcyLCBfUmVzdWx0PgorICAgIHB0cl9mdW4oX1Jlc3VsdCAoKl9feCkoX0FyZzEsIF9BcmcyKSkKKyAgICB7IHJldHVybiBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbjxfQXJnMSwgX0FyZzIsIF9SZXN1bHQ+KF9feCk7IH0KKyAgLyoqIEB9ICAqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0lkZW50aXR5CisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLF9UcD4KKyAgICB7CisgICAgICBfVHAmCisgICAgICBvcGVyYXRvcigpKF9UcCYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX194OyB9CisKKyAgICAgIGNvbnN0IF9UcCYKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3g7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyPgorICAgIHN0cnVjdCBfU2VsZWN0MXN0CisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1BhaXIsIHR5cGVuYW1lIF9QYWlyOjpmaXJzdF90eXBlPgorICAgIHsKKyAgICAgIHR5cGVuYW1lIF9QYWlyOjpmaXJzdF90eXBlJgorICAgICAgb3BlcmF0b3IoKShfUGFpciYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX194LmZpcnN0OyB9CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9QYWlyOjpmaXJzdF90eXBlJgorICAgICAgb3BlcmF0b3IoKShjb25zdCBfUGFpciYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX194LmZpcnN0OyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpcjI+CisgICAgICAgIHR5cGVuYW1lIF9QYWlyMjo6Zmlyc3RfdHlwZSYKKyAgICAgICAgb3BlcmF0b3IoKShfUGFpcjImIF9feCkgY29uc3QKKyAgICAgICAgeyByZXR1cm4gX194LmZpcnN0OyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyMj4KKyAgICAgICAgY29uc3QgdHlwZW5hbWUgX1BhaXIyOjpmaXJzdF90eXBlJgorICAgICAgICBvcGVyYXRvcigpKGNvbnN0IF9QYWlyMiYgX194KSBjb25zdAorICAgICAgICB7IHJldHVybiBfX3guZmlyc3Q7IH0KKyNlbmRpZgorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXI+CisgICAgc3RydWN0IF9TZWxlY3QybmQKKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfUGFpciwgdHlwZW5hbWUgX1BhaXI6OnNlY29uZF90eXBlPgorICAgIHsKKyAgICAgIHR5cGVuYW1lIF9QYWlyOjpzZWNvbmRfdHlwZSYKKyAgICAgIG9wZXJhdG9yKCkoX1BhaXImIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feC5zZWNvbmQ7IH0KKworICAgICAgY29uc3QgdHlwZW5hbWUgX1BhaXI6OnNlY29uZF90eXBlJgorICAgICAgb3BlcmF0b3IoKShjb25zdCBfUGFpciYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX194LnNlY29uZDsgfQorICAgIH07CisKKyAgLy8gMjAuMy44IGFkYXB0b3JzIHBvaW50ZXJzIG1lbWJlcnMKKyAgLyoqIEBkZWZncm91cCBtZW1vcnlfYWRhcHRvcnMgQWRhcHRvcnMgZm9yIHBvaW50ZXJzIHRvIG1lbWJlcnMKKyAgICogQGluZ3JvdXAgZnVuY3RvcnMKKyAgICoKKyAgICogIFRoZXJlIGFyZSBhIHRvdGFsIG9mIDggPSAyXjMgZnVuY3Rpb24gb2JqZWN0cyBpbiB0aGlzIGZhbWlseS4KKyAgICogICAoMSkgTWVtYmVyIGZ1bmN0aW9ucyB0YWtpbmcgbm8gYXJndW1lbnRzIHZzIG1lbWJlciBmdW5jdGlvbnMgdGFraW5nCisgICAqICAgICAgICBvbmUgYXJndW1lbnQuCisgICAqICAgKDIpIENhbGwgdGhyb3VnaCBwb2ludGVyIHZzIGNhbGwgdGhyb3VnaCByZWZlcmVuY2UuCisgICAqICAgKDMpIENvbnN0IHZzIG5vbi1jb25zdCBtZW1iZXIgZnVuY3Rpb24uCisgICAqCisgICAqICBBbGwgb2YgdGhpcyBjb21wbGV4aXR5IGlzIGluIHRoZSBmdW5jdGlvbiBvYmplY3RzIHRoZW1zZWx2ZXMuICBZb3UgY2FuCisgICAqICAgaWdub3JlIGl0IGJ5IHVzaW5nIHRoZSBoZWxwZXIgZnVuY3Rpb24gbWVtX2Z1biBhbmQgbWVtX2Z1bl9yZWYsCisgICAqICAgd2hpY2ggY3JlYXRlIHdoaWNoZXZlciB0eXBlIG9mIGFkYXB0b3IgaXMgYXBwcm9wcmlhdGUuCisgICAqCisgICAqICBAeworICAgKi8KKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgbWVtb3J5X2FkYXB0b3JzIGFkYXB0b3JzIGZvciBtZW1iZXIKKyAgLy8vIHBvaW50ZXJzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXQsIHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBtZW1fZnVuX3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwKiwgX1JldD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIG1lbV9mdW5fdChfUmV0IChfVHA6OipfX3BmKSgpKQorICAgICAgOiBfTV9mKF9fcGYpIHsgfQorCisgICAgICBfUmV0CisgICAgICBvcGVyYXRvcigpKF9UcCogX19wKSBjb25zdAorICAgICAgeyByZXR1cm4gKF9fcC0+Kl9NX2YpKCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfUmV0IChfVHA6OipfTV9mKSgpOworICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgbWVtb3J5X2FkYXB0b3JzIGFkYXB0b3JzIGZvciBtZW1iZXIKKyAgLy8vIHBvaW50ZXJzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXQsIHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBjb25zdF9tZW1fZnVuX3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248Y29uc3QgX1RwKiwgX1JldD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIGNvbnN0X21lbV9mdW5fdChfUmV0IChfVHA6OipfX3BmKSgpIGNvbnN0KQorICAgICAgOiBfTV9mKF9fcGYpIHsgfQorCisgICAgICBfUmV0CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCogX19wKSBjb25zdAorICAgICAgeyByZXR1cm4gKF9fcC0+Kl9NX2YpKCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfUmV0IChfVHA6OipfTV9mKSgpIGNvbnN0OworICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgbWVtb3J5X2FkYXB0b3JzIGFkYXB0b3JzIGZvciBtZW1iZXIKKyAgLy8vIHBvaW50ZXJzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXQsIHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBtZW1fZnVuX3JlZl90IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCwgX1JldD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIG1lbV9mdW5fcmVmX3QoX1JldCAoX1RwOjoqX19wZikoKSkKKyAgICAgIDogX01fZihfX3BmKSB7IH0KKworICAgICAgX1JldAorICAgICAgb3BlcmF0b3IoKShfVHAmIF9fcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfX3IuKl9NX2YpKCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfUmV0IChfVHA6OipfTV9mKSgpOworICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIG1lbW9yeV9hZGFwdG9ycyBhZGFwdG9ycyBmb3IgbWVtYmVyCisgIC8vLyBwb2ludGVyc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmV0LCB0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgY29uc3RfbWVtX2Z1bl9yZWZfdCA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAsIF9SZXQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0CisgICAgICBjb25zdF9tZW1fZnVuX3JlZl90KF9SZXQgKF9UcDo6Kl9fcGYpKCkgY29uc3QpCisgICAgICA6IF9NX2YoX19wZikgeyB9CisKKyAgICAgIF9SZXQKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3IpIGNvbnN0CisgICAgICB7IHJldHVybiAoX19yLipfTV9mKSgpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX1JldCAoX1RwOjoqX01fZikoKSBjb25zdDsKKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIG1lbW9yeV9hZGFwdG9ycyBhZGFwdG9ycyBmb3IgbWVtYmVyCisgIC8vLyBwb2ludGVyc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmV0LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Bcmc+CisgICAgY2xhc3MgbWVtX2Z1bjFfdCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwKiwgX0FyZywgX1JldD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIG1lbV9mdW4xX3QoX1JldCAoX1RwOjoqX19wZikoX0FyZykpCisgICAgICA6IF9NX2YoX19wZikgeyB9CisKKyAgICAgIF9SZXQKKyAgICAgIG9wZXJhdG9yKCkoX1RwKiBfX3AsIF9BcmcgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gKF9fcC0+Kl9NX2YpKF9feCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfUmV0IChfVHA6OipfTV9mKShfQXJnKTsKKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIG1lbW9yeV9hZGFwdG9ycyBhZGFwdG9ycyBmb3IgbWVtYmVyCisgIC8vLyBwb2ludGVyc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmV0LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Bcmc+CisgICAgY2xhc3MgY29uc3RfbWVtX2Z1bjFfdCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248Y29uc3QgX1RwKiwgX0FyZywgX1JldD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIGNvbnN0X21lbV9mdW4xX3QoX1JldCAoX1RwOjoqX19wZikoX0FyZykgY29uc3QpCisgICAgICA6IF9NX2YoX19wZikgeyB9CisKKyAgICAgIF9SZXQKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwKiBfX3AsIF9BcmcgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gKF9fcC0+Kl9NX2YpKF9feCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfUmV0IChfVHA6OipfTV9mKShfQXJnKSBjb25zdDsKKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIG1lbW9yeV9hZGFwdG9ycyBhZGFwdG9ycyBmb3IgbWVtYmVyCisgIC8vLyBwb2ludGVyc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmV0LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Bcmc+CisgICAgY2xhc3MgbWVtX2Z1bjFfcmVmX3QgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX0FyZywgX1JldD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIG1lbV9mdW4xX3JlZl90KF9SZXQgKF9UcDo6Kl9fcGYpKF9BcmcpKQorICAgICAgOiBfTV9mKF9fcGYpIHsgfQorCisgICAgICBfUmV0CisgICAgICBvcGVyYXRvcigpKF9UcCYgX19yLCBfQXJnIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfX3IuKl9NX2YpKF9feCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfUmV0IChfVHA6OipfTV9mKShfQXJnKTsKKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIG1lbW9yeV9hZGFwdG9ycyBhZGFwdG9ycyBmb3IgbWVtYmVyCisgIC8vLyBwb2ludGVyc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmV0LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Bcmc+CisgICAgY2xhc3MgY29uc3RfbWVtX2Z1bjFfcmVmX3QgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX0FyZywgX1JldD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIGNvbnN0X21lbV9mdW4xX3JlZl90KF9SZXQgKF9UcDo6Kl9fcGYpKF9BcmcpIGNvbnN0KQorICAgICAgOiBfTV9mKF9fcGYpIHsgfQorCisgICAgICBfUmV0CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX19yLCBfQXJnIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfX3IuKl9NX2YpKF9feCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfUmV0IChfVHA6OipfTV9mKShfQXJnKSBjb25zdDsKKyAgICB9OworCisgIC8vIE1lbV9mdW4gYWRhcHRvciBoZWxwZXIgZnVuY3Rpb25zLiAgVGhlcmUgYXJlIG9ubHkgdHdvOgorICAvLyBtZW1fZnVuIGFuZCBtZW1fZnVuX3JlZi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JldCwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBtZW1fZnVuX3Q8X1JldCwgX1RwPgorICAgIG1lbV9mdW4oX1JldCAoX1RwOjoqX19mKSgpKQorICAgIHsgcmV0dXJuIG1lbV9mdW5fdDxfUmV0LCBfVHA+KF9fZik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmV0LCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbnN0X21lbV9mdW5fdDxfUmV0LCBfVHA+CisgICAgbWVtX2Z1bihfUmV0IChfVHA6OipfX2YpKCkgY29uc3QpCisgICAgeyByZXR1cm4gY29uc3RfbWVtX2Z1bl90PF9SZXQsIF9UcD4oX19mKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXQsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgbWVtX2Z1bl9yZWZfdDxfUmV0LCBfVHA+CisgICAgbWVtX2Z1bl9yZWYoX1JldCAoX1RwOjoqX19mKSgpKQorICAgIHsgcmV0dXJuIG1lbV9mdW5fcmVmX3Q8X1JldCwgX1RwPihfX2YpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JldCwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb25zdF9tZW1fZnVuX3JlZl90PF9SZXQsIF9UcD4KKyAgICBtZW1fZnVuX3JlZihfUmV0IChfVHA6OipfX2YpKCkgY29uc3QpCisgICAgeyByZXR1cm4gY29uc3RfbWVtX2Z1bl9yZWZfdDxfUmV0LCBfVHA+KF9fZik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmV0LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Bcmc+CisgICAgaW5saW5lIG1lbV9mdW4xX3Q8X1JldCwgX1RwLCBfQXJnPgorICAgIG1lbV9mdW4oX1JldCAoX1RwOjoqX19mKShfQXJnKSkKKyAgICB7IHJldHVybiBtZW1fZnVuMV90PF9SZXQsIF9UcCwgX0FyZz4oX19mKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXQsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FyZz4KKyAgICBpbmxpbmUgY29uc3RfbWVtX2Z1bjFfdDxfUmV0LCBfVHAsIF9Bcmc+CisgICAgbWVtX2Z1bihfUmV0IChfVHA6OipfX2YpKF9BcmcpIGNvbnN0KQorICAgIHsgcmV0dXJuIGNvbnN0X21lbV9mdW4xX3Q8X1JldCwgX1RwLCBfQXJnPihfX2YpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JldCwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQXJnPgorICAgIGlubGluZSBtZW1fZnVuMV9yZWZfdDxfUmV0LCBfVHAsIF9Bcmc+CisgICAgbWVtX2Z1bl9yZWYoX1JldCAoX1RwOjoqX19mKShfQXJnKSkKKyAgICB7IHJldHVybiBtZW1fZnVuMV9yZWZfdDxfUmV0LCBfVHAsIF9Bcmc+KF9fZik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmV0LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Bcmc+CisgICAgaW5saW5lIGNvbnN0X21lbV9mdW4xX3JlZl90PF9SZXQsIF9UcCwgX0FyZz4KKyAgICBtZW1fZnVuX3JlZihfUmV0IChfVHA6OipfX2YpKF9BcmcpIGNvbnN0KQorICAgIHsgcmV0dXJuIGNvbnN0X21lbV9mdW4xX3JlZl90PF9SZXQsIF9UcCwgX0FyZz4oX19mKTsgfQorCisgIC8qKiBAfSAgKi8KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjaWYgKF9fY3BsdXNwbHVzIDwgMjAxMTAzTCkgfHwgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQKKyMgaW5jbHVkZSA8YmFja3dhcmQvYmluZGVycy5oPgorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1RMX0ZVTkNUSU9OX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfaGVhcC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9oZWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA3YThjZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfaGVhcC5oCkBAIC0wLDAgKzEsNTkyIEBACisvLyBIZWFwIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9oZWFwLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtxdWV1ZX0KKyAqLworCisjaWZuZGVmIF9TVExfSEVBUF9ICisjZGVmaW5lIF9TVExfSEVBUF9IIDEKKworI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisjaW5jbHVkZSA8Yml0cy9tb3ZlLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGRlZmdyb3VwIGhlYXBfYWxnb3JpdGhtcyBIZWFwCisgICAqIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICBfRGlzdGFuY2UKKyAgICBfX2lzX2hlYXBfdW50aWwoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9EaXN0YW5jZSBfX24pCisgICAgeworICAgICAgX0Rpc3RhbmNlIF9fcGFyZW50ID0gMDsKKyAgICAgIGZvciAoX0Rpc3RhbmNlIF9fY2hpbGQgPSAxOyBfX2NoaWxkIDwgX19uOyArK19fY2hpbGQpCisJeworCSAgaWYgKF9fZmlyc3RbX19wYXJlbnRdIDwgX19maXJzdFtfX2NoaWxkXSkKKwkgICAgcmV0dXJuIF9fY2hpbGQ7CisJICBpZiAoKF9fY2hpbGQgJiAxKSA9PSAwKQorCSAgICArK19fcGFyZW50OworCX0KKyAgICAgIHJldHVybiBfX247CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0Rpc3RhbmNlLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9EaXN0YW5jZQorICAgIF9faXNfaGVhcF91bnRpbChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX0Rpc3RhbmNlIF9fbiwKKwkJICAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBfRGlzdGFuY2UgX19wYXJlbnQgPSAwOworICAgICAgZm9yIChfRGlzdGFuY2UgX19jaGlsZCA9IDE7IF9fY2hpbGQgPCBfX247ICsrX19jaGlsZCkKKwl7CisJICBpZiAoX19jb21wKF9fZmlyc3RbX19wYXJlbnRdLCBfX2ZpcnN0W19fY2hpbGRdKSkKKwkgICAgcmV0dXJuIF9fY2hpbGQ7CisJICBpZiAoKF9fY2hpbGQgJiAxKSA9PSAwKQorCSAgICArK19fcGFyZW50OworCX0KKyAgICAgIHJldHVybiBfX247CisgICAgfQorCisgIC8vIF9faXNfaGVhcCwgYSBwcmVkaWNhdGUgdGVzdGluZyB3aGV0aGVyIG9yIG5vdCBhIHJhbmdlIGlzIGEgaGVhcC4KKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhbiBleHRlbnNpb24sIG5vdCBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0Rpc3RhbmNlPgorICAgIGlubGluZSBib29sCisgICAgX19pc19oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfRGlzdGFuY2UgX19uKQorICAgIHsgcmV0dXJuIHN0ZDo6X19pc19oZWFwX3VudGlsKF9fZmlyc3QsIF9fbikgPT0gX19uOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZSwKKwkgICB0eXBlbmFtZSBfRGlzdGFuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2lzX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9Db21wYXJlIF9fY29tcCwgX0Rpc3RhbmNlIF9fbikKKyAgICB7IHJldHVybiBzdGQ6Ol9faXNfaGVhcF91bnRpbChfX2ZpcnN0LCBfX24sIF9fY29tcCkgPT0gX19uOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgX19pc19oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQorICAgIHsgcmV0dXJuIHN0ZDo6X19pc19oZWFwKF9fZmlyc3QsIHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSBib29sCisgICAgX19pc19oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCSAgICAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7IHJldHVybiBzdGQ6Ol9faXNfaGVhcChfX2ZpcnN0LCBfX2NvbXAsIHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KSk7IH0KKworICAvLyBIZWFwLW1hbmlwdWxhdGlvbiBmdW5jdGlvbnM6IHB1c2hfaGVhcCwgcG9wX2hlYXAsIG1ha2VfaGVhcCwgc29ydF9oZWFwLAorICAvLyArIGlzX2hlYXAgYW5kIGlzX2hlYXBfdW50aWwgaW4gQysrMHguCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfRGlzdGFuY2UsIHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgX19wdXNoX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCV9EaXN0YW5jZSBfX2hvbGVJbmRleCwgX0Rpc3RhbmNlIF9fdG9wSW5kZXgsIF9UcCBfX3ZhbHVlKQorICAgIHsKKyAgICAgIF9EaXN0YW5jZSBfX3BhcmVudCA9IChfX2hvbGVJbmRleCAtIDEpIC8gMjsKKyAgICAgIHdoaWxlIChfX2hvbGVJbmRleCA+IF9fdG9wSW5kZXggJiYgKihfX2ZpcnN0ICsgX19wYXJlbnQpIDwgX192YWx1ZSkKKwl7CisJICAqKF9fZmlyc3QgKyBfX2hvbGVJbmRleCkgPSBfR0xJQkNYWF9NT1ZFKCooX19maXJzdCArIF9fcGFyZW50KSk7CisJICBfX2hvbGVJbmRleCA9IF9fcGFyZW50OworCSAgX19wYXJlbnQgPSAoX19ob2xlSW5kZXggLSAxKSAvIDI7CisJfQorICAgICAgKihfX2ZpcnN0ICsgX19ob2xlSW5kZXgpID0gX0dMSUJDWFhfTU9WRShfX3ZhbHVlKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFB1c2ggYW4gZWxlbWVudCBvbnRvIGEgaGVhcC4KKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgaGVhcC4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgRW5kIG9mIGhlYXAgKyBlbGVtZW50LgorICAgKiAgQGluZ3JvdXAgaGVhcF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIG9wZXJhdGlvbiBwdXNoZXMgdGhlIGVsZW1lbnQgYXQgbGFzdC0xIG9udG8gdGhlIHZhbGlkIGhlYXAKKyAgICogIG92ZXIgdGhlIHJhbmdlIFtfX2ZpcnN0LF9fbGFzdC0xKS4gIEFmdGVyIGNvbXBsZXRpb24sCisgICAqICBbX19maXJzdCxfX2xhc3QpIGlzIGEgdmFsaWQgaGVhcC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgcHVzaF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwkgIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwkgIF9EaXN0YW5jZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfaGVhcChfX2ZpcnN0LCBfX2xhc3QgLSAxKTsKKworICAgICAgX1ZhbHVlVHlwZSBfX3ZhbHVlID0gX0dMSUJDWFhfTU9WRSgqKF9fbGFzdCAtIDEpKTsKKyAgICAgIHN0ZDo6X19wdXNoX2hlYXAoX19maXJzdCwgX0Rpc3RhbmNlVHlwZSgoX19sYXN0IC0gX19maXJzdCkgLSAxKSwKKwkJICAgICAgIF9EaXN0YW5jZVR5cGUoMCksIF9HTElCQ1hYX01PVkUoX192YWx1ZSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX3B1c2hfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX0Rpc3RhbmNlIF9faG9sZUluZGV4LAorCQlfRGlzdGFuY2UgX190b3BJbmRleCwgX1RwIF9fdmFsdWUsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBfRGlzdGFuY2UgX19wYXJlbnQgPSAoX19ob2xlSW5kZXggLSAxKSAvIDI7CisgICAgICB3aGlsZSAoX19ob2xlSW5kZXggPiBfX3RvcEluZGV4CisJICAgICAmJiBfX2NvbXAoKihfX2ZpcnN0ICsgX19wYXJlbnQpLCBfX3ZhbHVlKSkKKwl7CisJICAqKF9fZmlyc3QgKyBfX2hvbGVJbmRleCkgPSBfR0xJQkNYWF9NT1ZFKCooX19maXJzdCArIF9fcGFyZW50KSk7CisJICBfX2hvbGVJbmRleCA9IF9fcGFyZW50OworCSAgX19wYXJlbnQgPSAoX19ob2xlSW5kZXggLSAxKSAvIDI7CisJfQorICAgICAgKihfX2ZpcnN0ICsgX19ob2xlSW5kZXgpID0gX0dMSUJDWFhfTU9WRShfX3ZhbHVlKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFB1c2ggYW4gZWxlbWVudCBvbnRvIGEgaGVhcCB1c2luZyBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIFN0YXJ0IG9mIGhlYXAuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEVuZCBvZiBoZWFwICsgZWxlbWVudC4KKyAgICogIEBwYXJhbSAgX19jb21wICAgQ29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQGluZ3JvdXAgaGVhcF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIG9wZXJhdGlvbiBwdXNoZXMgdGhlIGVsZW1lbnQgYXQgX19sYXN0LTEgb250byB0aGUgdmFsaWQKKyAgICogIGhlYXAgb3ZlciB0aGUgcmFuZ2UgW19fZmlyc3QsX19sYXN0LTEpLiAgQWZ0ZXIgY29tcGxldGlvbiwKKyAgICogIFtfX2ZpcnN0LF9fbGFzdCkgaXMgYSB2YWxpZCBoZWFwLiAgQ29tcGFyZSBvcGVyYXRpb25zIGFyZQorICAgKiAgcGVyZm9ybWVkIHVzaW5nIGNvbXAuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBwdXNoX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJICAgICAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwkgIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwkgIF9EaXN0YW5jZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfaGVhcF9wcmVkKF9fZmlyc3QsIF9fbGFzdCAtIDEsIF9fY29tcCk7CisKKyAgICAgIF9WYWx1ZVR5cGUgX192YWx1ZSA9IF9HTElCQ1hYX01PVkUoKihfX2xhc3QgLSAxKSk7CisgICAgICBzdGQ6Ol9fcHVzaF9oZWFwKF9fZmlyc3QsIF9EaXN0YW5jZVR5cGUoKF9fbGFzdCAtIF9fZmlyc3QpIC0gMSksCisJCSAgICAgICBfRGlzdGFuY2VUeXBlKDApLCBfR0xJQkNYWF9NT1ZFKF9fdmFsdWUpLCBfX2NvbXApOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZSwgdHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX2FkanVzdF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfRGlzdGFuY2UgX19ob2xlSW5kZXgsCisJCSAgX0Rpc3RhbmNlIF9fbGVuLCBfVHAgX192YWx1ZSkKKyAgICB7CisgICAgICBjb25zdCBfRGlzdGFuY2UgX190b3BJbmRleCA9IF9faG9sZUluZGV4OworICAgICAgX0Rpc3RhbmNlIF9fc2Vjb25kQ2hpbGQgPSBfX2hvbGVJbmRleDsKKyAgICAgIHdoaWxlIChfX3NlY29uZENoaWxkIDwgKF9fbGVuIC0gMSkgLyAyKQorCXsKKwkgIF9fc2Vjb25kQ2hpbGQgPSAyICogKF9fc2Vjb25kQ2hpbGQgKyAxKTsKKwkgIGlmICgqKF9fZmlyc3QgKyBfX3NlY29uZENoaWxkKSA8ICooX19maXJzdCArIChfX3NlY29uZENoaWxkIC0gMSkpKQorCSAgICBfX3NlY29uZENoaWxkLS07CisJICAqKF9fZmlyc3QgKyBfX2hvbGVJbmRleCkgPSBfR0xJQkNYWF9NT1ZFKCooX19maXJzdCArIF9fc2Vjb25kQ2hpbGQpKTsKKwkgIF9faG9sZUluZGV4ID0gX19zZWNvbmRDaGlsZDsKKwl9CisgICAgICBpZiAoKF9fbGVuICYgMSkgPT0gMCAmJiBfX3NlY29uZENoaWxkID09IChfX2xlbiAtIDIpIC8gMikKKwl7CisJICBfX3NlY29uZENoaWxkID0gMiAqIChfX3NlY29uZENoaWxkICsgMSk7CisJICAqKF9fZmlyc3QgKyBfX2hvbGVJbmRleCkgPSBfR0xJQkNYWF9NT1ZFKCooX19maXJzdAorCQkJCQkJICAgICArIChfX3NlY29uZENoaWxkIC0gMSkpKTsKKwkgIF9faG9sZUluZGV4ID0gX19zZWNvbmRDaGlsZCAtIDE7CisJfQorICAgICAgc3RkOjpfX3B1c2hfaGVhcChfX2ZpcnN0LCBfX2hvbGVJbmRleCwgX190b3BJbmRleCwKKwkJICAgICAgIF9HTElCQ1hYX01PVkUoX192YWx1ZSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3BvcF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19yZXN1bHQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2VUeXBlOworCisgICAgICBfVmFsdWVUeXBlIF9fdmFsdWUgPSBfR0xJQkNYWF9NT1ZFKCpfX3Jlc3VsdCk7CisgICAgICAqX19yZXN1bHQgPSBfR0xJQkNYWF9NT1ZFKCpfX2ZpcnN0KTsKKyAgICAgIHN0ZDo6X19hZGp1c3RfaGVhcChfX2ZpcnN0LCBfRGlzdGFuY2VUeXBlKDApLAorCQkJIF9EaXN0YW5jZVR5cGUoX19sYXN0IC0gX19maXJzdCksCisJCQkgX0dMSUJDWFhfTU9WRShfX3ZhbHVlKSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBQb3AgYW4gZWxlbWVudCBvZmYgYSBoZWFwLgorICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBTdGFydCBvZiBoZWFwLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBFbmQgb2YgaGVhcC4KKyAgICogIEBwcmUgICAgW19fZmlyc3QsIF9fbGFzdCkgaXMgYSB2YWxpZCwgbm9uLWVtcHR5IHJhbmdlLgorICAgKiAgQGluZ3JvdXAgaGVhcF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIG9wZXJhdGlvbiBwb3BzIHRoZSB0b3Agb2YgdGhlIGhlYXAuICBUaGUgZWxlbWVudHMgX19maXJzdAorICAgKiAgYW5kIF9fbGFzdC0xIGFyZSBzd2FwcGVkIGFuZCBbX19maXJzdCxfX2xhc3QtMSkgaXMgbWFkZSBpbnRvIGEKKyAgICogIGhlYXAuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHBvcF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDxfVmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19ub25fZW1wdHlfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX2hlYXAoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fbGFzdCAtIF9fZmlyc3QgPiAxKQorCXsKKwkgIC0tX19sYXN0OworCSAgc3RkOjpfX3BvcF9oZWFwKF9fZmlyc3QsIF9fbGFzdCwgX19sYXN0KTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0Rpc3RhbmNlLAorCSAgIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9fYWRqdXN0X2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9EaXN0YW5jZSBfX2hvbGVJbmRleCwKKwkJICBfRGlzdGFuY2UgX19sZW4sIF9UcCBfX3ZhbHVlLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgY29uc3QgX0Rpc3RhbmNlIF9fdG9wSW5kZXggPSBfX2hvbGVJbmRleDsKKyAgICAgIF9EaXN0YW5jZSBfX3NlY29uZENoaWxkID0gX19ob2xlSW5kZXg7CisgICAgICB3aGlsZSAoX19zZWNvbmRDaGlsZCA8IChfX2xlbiAtIDEpIC8gMikKKwl7CisJICBfX3NlY29uZENoaWxkID0gMiAqIChfX3NlY29uZENoaWxkICsgMSk7CisJICBpZiAoX19jb21wKCooX19maXJzdCArIF9fc2Vjb25kQ2hpbGQpLAorCQkgICAgICooX19maXJzdCArIChfX3NlY29uZENoaWxkIC0gMSkpKSkKKwkgICAgX19zZWNvbmRDaGlsZC0tOworCSAgKihfX2ZpcnN0ICsgX19ob2xlSW5kZXgpID0gX0dMSUJDWFhfTU9WRSgqKF9fZmlyc3QgKyBfX3NlY29uZENoaWxkKSk7CisJICBfX2hvbGVJbmRleCA9IF9fc2Vjb25kQ2hpbGQ7CisJfQorICAgICAgaWYgKChfX2xlbiAmIDEpID09IDAgJiYgX19zZWNvbmRDaGlsZCA9PSAoX19sZW4gLSAyKSAvIDIpCisJeworCSAgX19zZWNvbmRDaGlsZCA9IDIgKiAoX19zZWNvbmRDaGlsZCArIDEpOworCSAgKihfX2ZpcnN0ICsgX19ob2xlSW5kZXgpID0gX0dMSUJDWFhfTU9WRSgqKF9fZmlyc3QKKwkJCQkJCSAgICAgKyAoX19zZWNvbmRDaGlsZCAtIDEpKSk7CisJICBfX2hvbGVJbmRleCA9IF9fc2Vjb25kQ2hpbGQgLSAxOworCX0KKyAgICAgIHN0ZDo6X19wdXNoX2hlYXAoX19maXJzdCwgX19ob2xlSW5kZXgsIF9fdG9wSW5kZXgsIAorCQkgICAgICAgX0dMSUJDWFhfTU9WRShfX3ZhbHVlKSwgX19jb21wKTsgICAgICAKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fcG9wX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJX0Rpc3RhbmNlVHlwZTsKKworICAgICAgX1ZhbHVlVHlwZSBfX3ZhbHVlID0gX0dMSUJDWFhfTU9WRSgqX19yZXN1bHQpOworICAgICAgKl9fcmVzdWx0ID0gX0dMSUJDWFhfTU9WRSgqX19maXJzdCk7CisgICAgICBzdGQ6Ol9fYWRqdXN0X2hlYXAoX19maXJzdCwgX0Rpc3RhbmNlVHlwZSgwKSwKKwkJCSBfRGlzdGFuY2VUeXBlKF9fbGFzdCAtIF9fZmlyc3QpLAorCQkJIF9HTElCQ1hYX01PVkUoX192YWx1ZSksIF9fY29tcCk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBQb3AgYW4gZWxlbWVudCBvZmYgYSBoZWFwIHVzaW5nIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgaGVhcC4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgRW5kIG9mIGhlYXAuCisgICAqICBAcGFyYW0gIF9fY29tcCAgIENvbXBhcmlzb24gZnVuY3RvciB0byB1c2UuCisgICAqICBAaW5ncm91cCBoZWFwX2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoaXMgb3BlcmF0aW9uIHBvcHMgdGhlIHRvcCBvZiB0aGUgaGVhcC4gIFRoZSBlbGVtZW50cyBfX2ZpcnN0CisgICAqICBhbmQgX19sYXN0LTEgYXJlIHN3YXBwZWQgYW5kIFtfX2ZpcnN0LF9fbGFzdC0xKSBpcyBtYWRlIGludG8gYQorICAgKiAgaGVhcC4gIENvbXBhcmlzb25zIGFyZSBtYWRlIHVzaW5nIGNvbXAuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBwb3BfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX25vbl9lbXB0eV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX2hlYXBfcHJlZChfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCk7CisKKyAgICAgIGlmIChfX2xhc3QgLSBfX2ZpcnN0ID4gMSkKKwl7CisJICAtLV9fbGFzdDsKKwkgIHN0ZDo6X19wb3BfaGVhcChfX2ZpcnN0LCBfX2xhc3QsIF9fbGFzdCwgX19jb21wKTsKKwl9CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBDb25zdHJ1Y3QgYSBoZWFwIG92ZXIgYSByYW5nZS4KKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgaGVhcC4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgRW5kIG9mIGhlYXAuCisgICAqICBAaW5ncm91cCBoZWFwX2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoaXMgb3BlcmF0aW9uIG1ha2VzIHRoZSBlbGVtZW50cyBpbiBbX19maXJzdCxfX2xhc3QpIGludG8gYSBoZWFwLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgdm9pZAorICAgIG1ha2VfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJICBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJICBfRGlzdGFuY2VUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDxfVmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19sYXN0IC0gX19maXJzdCA8IDIpCisJcmV0dXJuOworCisgICAgICBjb25zdCBfRGlzdGFuY2VUeXBlIF9fbGVuID0gX19sYXN0IC0gX19maXJzdDsKKyAgICAgIF9EaXN0YW5jZVR5cGUgX19wYXJlbnQgPSAoX19sZW4gLSAyKSAvIDI7CisgICAgICB3aGlsZSAodHJ1ZSkKKwl7CisJICBfVmFsdWVUeXBlIF9fdmFsdWUgPSBfR0xJQkNYWF9NT1ZFKCooX19maXJzdCArIF9fcGFyZW50KSk7CisJICBzdGQ6Ol9fYWRqdXN0X2hlYXAoX19maXJzdCwgX19wYXJlbnQsIF9fbGVuLCBfR0xJQkNYWF9NT1ZFKF9fdmFsdWUpKTsKKwkgIGlmIChfX3BhcmVudCA9PSAwKQorCSAgICByZXR1cm47CisJICBfX3BhcmVudC0tOworCX0KKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbnN0cnVjdCBhIGhlYXAgb3ZlciBhIHJhbmdlIHVzaW5nIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgaGVhcC4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgRW5kIG9mIGhlYXAuCisgICAqICBAcGFyYW0gIF9fY29tcCAgIENvbXBhcmlzb24gZnVuY3RvciB0byB1c2UuCisgICAqICBAaW5ncm91cCBoZWFwX2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoaXMgb3BlcmF0aW9uIG1ha2VzIHRoZSBlbGVtZW50cyBpbiBbX19maXJzdCxfX2xhc3QpIGludG8gYSBoZWFwLgorICAgKiAgQ29tcGFyaXNvbnMgYXJlIG1hZGUgdXNpbmcgX19jb21wLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBtYWtlX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJICAgICAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwkgIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwkgIF9EaXN0YW5jZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2xhc3QgLSBfX2ZpcnN0IDwgMikKKwlyZXR1cm47CisKKyAgICAgIGNvbnN0IF9EaXN0YW5jZVR5cGUgX19sZW4gPSBfX2xhc3QgLSBfX2ZpcnN0OworICAgICAgX0Rpc3RhbmNlVHlwZSBfX3BhcmVudCA9IChfX2xlbiAtIDIpIC8gMjsKKyAgICAgIHdoaWxlICh0cnVlKQorCXsKKwkgIF9WYWx1ZVR5cGUgX192YWx1ZSA9IF9HTElCQ1hYX01PVkUoKihfX2ZpcnN0ICsgX19wYXJlbnQpKTsKKwkgIHN0ZDo6X19hZGp1c3RfaGVhcChfX2ZpcnN0LCBfX3BhcmVudCwgX19sZW4sIF9HTElCQ1hYX01PVkUoX192YWx1ZSksCisJCQkgICAgIF9fY29tcCk7CisJICBpZiAoX19wYXJlbnQgPT0gMCkKKwkgICAgcmV0dXJuOworCSAgX19wYXJlbnQtLTsKKwl9CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBTb3J0IGEgaGVhcC4KKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgaGVhcC4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgRW5kIG9mIGhlYXAuCisgICAqICBAaW5ncm91cCBoZWFwX2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoaXMgb3BlcmF0aW9uIHNvcnRzIHRoZSB2YWxpZCBoZWFwIGluIHRoZSByYW5nZSBbX19maXJzdCxfX2xhc3QpLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgdm9pZAorICAgIHNvcnRfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfaGVhcChfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+IDEpCisJeworCSAgLS1fX2xhc3Q7CisJICBzdGQ6Ol9fcG9wX2hlYXAoX19maXJzdCwgX19sYXN0LCBfX2xhc3QpOworCX0KKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFNvcnQgYSBoZWFwIHVzaW5nIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgaGVhcC4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgRW5kIG9mIGhlYXAuCisgICAqICBAcGFyYW0gIF9fY29tcCAgIENvbXBhcmlzb24gZnVuY3RvciB0byB1c2UuCisgICAqICBAaW5ncm91cCBoZWFwX2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoaXMgb3BlcmF0aW9uIHNvcnRzIHRoZSB2YWxpZCBoZWFwIGluIHRoZSByYW5nZSBbX19maXJzdCxfX2xhc3QpLgorICAgKiAgQ29tcGFyaXNvbnMgYXJlIG1hZGUgdXNpbmcgX19jb21wLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBzb3J0X2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJICAgICAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfaGVhcF9wcmVkKF9fZmlyc3QsIF9fbGFzdCwgX19jb21wKTsKKworICAgICAgd2hpbGUgKF9fbGFzdCAtIF9fZmlyc3QgPiAxKQorCXsKKwkgIC0tX19sYXN0OworCSAgc3RkOjpfX3BvcF9oZWFwKF9fZmlyc3QsIF9fbGFzdCwgX19sYXN0LCBfX2NvbXApOworCX0KKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIC8qKgorICAgKiAgQGJyaWVmICBTZWFyY2ggdGhlIGVuZCBvZiBhIGhlYXAuCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIFN0YXJ0IG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBFbmQgb2YgcmFuZ2UuCisgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudCBub3QgaW4gdGhlIGhlYXAuCisgICAqICBAaW5ncm91cCBoZWFwX2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoaXMgb3BlcmF0aW9uIHJldHVybnMgdGhlIGxhc3QgaXRlcmF0b3IgaSBpbiBbX19maXJzdCwgX19sYXN0KSBmb3Igd2hpY2gKKyAgICogIHRoZSByYW5nZSBbX19maXJzdCwgaSkgaXMgYSBoZWFwLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgaW5saW5lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcgorICAgIGlzX2hlYXBfdW50aWwoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgcmV0dXJuIF9fZmlyc3QgKyBzdGQ6Ol9faXNfaGVhcF91bnRpbChfX2ZpcnN0LCBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsCisJCQkJCQkJCSAgIF9fbGFzdCkpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgU2VhcmNoIHRoZSBlbmQgb2YgYSBoZWFwIHVzaW5nIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEVuZCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgX19jb21wICAgQ29tcGFyaXNvbiBmdW5jdG9yIHRvIHVzZS4KKyAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IG5vdCBpbiB0aGUgaGVhcC4KKyAgICogIEBpbmdyb3VwIGhlYXBfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gcmV0dXJucyB0aGUgbGFzdCBpdGVyYXRvciBpIGluIFtfX2ZpcnN0LCBfX2xhc3QpIGZvciB3aGljaAorICAgKiAgdGhlIHJhbmdlIFtfX2ZpcnN0LCBpKSBpcyBhIGhlYXAuICBDb21wYXJpc29ucyBhcmUgbWFkZSB1c2luZyBfX2NvbXAuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcgorICAgIGlzX2hlYXBfdW50aWwoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJCSAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICByZXR1cm4gX19maXJzdCArIHN0ZDo6X19pc19oZWFwX3VudGlsKF9fZmlyc3QsIHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwKKwkJCQkJCQkJICAgX19sYXN0KSwKKwkJCQkJICAgIF9fY29tcCk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBEZXRlcm1pbmVzIHdoZXRoZXIgYSByYW5nZSBpcyBhIGhlYXAuCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIFN0YXJ0IG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBFbmQgb2YgcmFuZ2UuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIHJhbmdlIGlzIGEgaGVhcCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKiAgQGluZ3JvdXAgaGVhcF9hbGdvcml0aG1zCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIGlzX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeyByZXR1cm4gc3RkOjppc19oZWFwX3VudGlsKF9fZmlyc3QsIF9fbGFzdCkgPT0gX19sYXN0OyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIERldGVybWluZXMgd2hldGhlciBhIHJhbmdlIGlzIGEgaGVhcCB1c2luZyBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIFN0YXJ0IG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QgICBFbmQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fY29tcCAgIENvbXBhcmlzb24gZnVuY3RvciB0byB1c2UuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIHJhbmdlIGlzIGEgaGVhcCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKiAgQGluZ3JvdXAgaGVhcF9hbGdvcml0aG1zCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIGJvb2wKKyAgICBpc19oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCSAgICBfQ29tcGFyZSBfX2NvbXApCisgICAgeyByZXR1cm4gc3RkOjppc19oZWFwX3VudGlsKF9fZmlyc3QsIF9fbGFzdCwgX19jb21wKSA9PSBfX2xhc3Q7IH0KKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfU1RMX0hFQVBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9pdGVyYXRvci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9pdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNGYzN2YKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX2l0ZXJhdG9yLmgKQEAgLTAsMCArMSwxMTQ4IEBACisvLyBJdGVyYXRvcnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OAorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX2l0ZXJhdG9yLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpdGVyYXRvcn0KKyAqCisgKiAgVGhpcyBmaWxlIGltcGxlbWVudHMgcmV2ZXJzZV9pdGVyYXRvciwgYmFja19pbnNlcnRfaXRlcmF0b3IsCisgKiAgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yLCBpbnNlcnRfaXRlcmF0b3IsIF9fbm9ybWFsX2l0ZXJhdG9yLCBhbmQgdGhlaXIKKyAqICBzdXBwb3J0aW5nIGZ1bmN0aW9ucyBhbmQgb3ZlcmxvYWRlZCBvcGVyYXRvcnMuCisgKi8KKworI2lmbmRlZiBfU1RMX0lURVJBVE9SX0gKKyNkZWZpbmUgX1NUTF9JVEVSQVRPUl9IIDEKKworI2luY2x1ZGUgPGJpdHMvY3BwX3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8Yml0cy9tb3ZlLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgaXRlcmF0b3JzCisgICAqIEB7CisgICAqLworCisgIC8vIDI0LjQuMSBSZXZlcnNlIGl0ZXJhdG9ycworICAvKioKKyAgICogIEJpZGlyZWN0aW9uYWwgYW5kIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzIGhhdmUgY29ycmVzcG9uZGluZyByZXZlcnNlCisgICAqICAlaXRlcmF0b3IgYWRhcHRvcnMgdGhhdCBpdGVyYXRlIHRocm91Z2ggdGhlIGRhdGEgc3RydWN0dXJlIGluIHRoZQorICAgKiAgb3Bwb3NpdGUgZGlyZWN0aW9uLiAgVGhleSBoYXZlIHRoZSBzYW1lIHNpZ25hdHVyZXMgYXMgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICogIGl0ZXJhdG9ycy4gIFRoZSBmdW5kYW1lbnRhbCByZWxhdGlvbiBiZXR3ZWVuIGEgcmV2ZXJzZSAlaXRlcmF0b3IgYW5kIGl0cworICAgKiAgY29ycmVzcG9uZGluZyAlaXRlcmF0b3IgQGMgaSBpcyBlc3RhYmxpc2hlZCBieSB0aGUgaWRlbnRpdHk6CisgICAqICBAY29kZQorICAgKiAgICAgICYqKHJldmVyc2VfaXRlcmF0b3IoaSkpID09ICYqKGkgLSAxKQorICAgKiAgQGVuZGNvZGUKKyAgICoKKyAgICogIDxlbT5UaGlzIG1hcHBpbmcgaXMgZGljdGF0ZWQgYnkgdGhlIGZhY3QgdGhhdCB3aGlsZSB0aGVyZSBpcyBhbHdheXMgYQorICAgKiAgcG9pbnRlciBwYXN0IHRoZSBlbmQgb2YgYW4gYXJyYXksIHRoZXJlIG1pZ2h0IG5vdCBiZSBhIHZhbGlkIHBvaW50ZXIKKyAgICogIGJlZm9yZSB0aGUgYmVnaW5uaW5nIG9mIGFuIGFycmF5LjwvZW0+IFsyNC40LjFdLzEsMgorICAgKgorICAgKiAgUmV2ZXJzZSBpdGVyYXRvcnMgY2FuIGJlIHRyaWNreSBhbmQgc3VycHJpc2luZyBhdCBmaXJzdC4gIFRoZWlyCisgICAqICBzZW1hbnRpY3MgbWFrZSBzZW5zZSwgaG93ZXZlciwgYW5kIHRoZSB0cmlja2luZXNzIGlzIGEgc2lkZSBlZmZlY3Qgb2YKKyAgICogIHRoZSByZXF1aXJlbWVudCB0aGF0IHRoZSBpdGVyYXRvcnMgbXVzdCBiZSBzYWZlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgY2xhc3MgcmV2ZXJzZV9pdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSwKKwkJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OnZhbHVlX3R5cGUsCisJCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUsCisJCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+Ojpwb2ludGVyLAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+OjpyZWZlcmVuY2U+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIF9JdGVyYXRvciBjdXJyZW50OworCisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+CQlfX3RyYWl0c190eXBlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfSXRlcmF0b3IJCQkJCWl0ZXJhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzX3R5cGU6OmRpZmZlcmVuY2VfdHlwZQlkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzX3R5cGU6OnBvaW50ZXIJCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzX3R5cGU6OnJlZmVyZW5jZQkJcmVmZXJlbmNlOworCisgICAgICAvKioKKyAgICAgICAqICBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciB2YWx1ZS1pbml0aWFsaXplcyBtZW1iZXIgQHAgY3VycmVudC4KKyAgICAgICAqICBJZiBpdCBpcyBhIHBvaW50ZXIsIHRoYXQgbWVhbnMgaXQgaXMgemVyby1pbml0aWFsaXplZC4KKyAgICAgICovCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMzUgTm8gc3BlY2lmaWNhdGlvbiBvZiBkZWZhdWx0IGN0b3IgZm9yIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IoKSA6IGN1cnJlbnQoKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgVGhpcyAlaXRlcmF0b3Igd2lsbCBtb3ZlIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24gdGhhdCBAcCB4IGRvZXMuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IoaXRlcmF0b3JfdHlwZSBfX3gpIDogY3VycmVudChfX3gpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBUaGUgY29weSBjb25zdHJ1Y3RvciBpcyBub3JtYWwuCisgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcihjb25zdCByZXZlcnNlX2l0ZXJhdG9yJiBfX3gpCisgICAgICA6IGN1cnJlbnQoX194LmN1cnJlbnQpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBBICVyZXZlcnNlX2l0ZXJhdG9yIGFjcm9zcyBvdGhlciB0eXBlcyBjYW4gYmUgY29waWVkIGlmIHRoZQorICAgICAgICogIHVuZGVybHlpbmcgJWl0ZXJhdG9yIGNhbiBiZSBjb252ZXJ0ZWQgdG8gdGhlIHR5cGUgb2YgQGMgY3VycmVudC4KKyAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcj4KKyAgICAgICAgcmV2ZXJzZV9pdGVyYXRvcihjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyPiYgX194KQorCTogY3VycmVudChfX3guYmFzZSgpKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQHJldHVybiAgQGMgY3VycmVudCwgdGhlICVpdGVyYXRvciB1c2VkIGZvciB1bmRlcmx5aW5nIHdvcmsuCisgICAgICAqLworICAgICAgaXRlcmF0b3JfdHlwZQorICAgICAgYmFzZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBjdXJyZW50OyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEByZXR1cm4gIEEgcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZSBhdCBAYyAtLWN1cnJlbnQKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyByZXF1aXJlcyB0aGF0IEBjIC0tY3VycmVudCBpcyBkZXJlZmVyZW5jZWFibGUuCisgICAgICAgKgorICAgICAgICogIEB3YXJuaW5nIFRoaXMgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGhhdCBmb3IgYW4gaXRlcmF0b3Igb2YgdGhlCisgICAgICAgKiAgICAgICAgICAgdW5kZXJseWluZyBpdGVyYXRvciB0eXBlLCBAYyB4LCBhIHJlZmVyZW5jZSBvYnRhaW5lZCBieQorICAgICAgICogICAgICAgICAgIEBjICp4IHJlbWFpbnMgdmFsaWQgYWZ0ZXIgQGMgeCBoYXMgYmVlbiBtb2RpZmllZCBvcgorICAgICAgICogICAgICAgICAgIGRlc3Ryb3llZC4gVGhpcyBpcyBhIGJ1ZzogaHR0cDovL2djYy5nbnUub3JnL1BSNTE4MjMKKyAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7CisJX0l0ZXJhdG9yIF9fdG1wID0gY3VycmVudDsKKwlyZXR1cm4gKi0tX190bXA7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEByZXR1cm4gIEEgcG9pbnRlciB0byB0aGUgdmFsdWUgYXQgQGMgLS1jdXJyZW50CisgICAgICAgKgorICAgICAgICogIFRoaXMgcmVxdWlyZXMgdGhhdCBAYyAtLWN1cnJlbnQgaXMgZGVyZWZlcmVuY2VhYmxlLgorICAgICAgKi8KKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeyByZXR1cm4gJihvcGVyYXRvciooKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQHJldHVybiAgQGMgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgRGVjcmVtZW50cyB0aGUgdW5kZXJseWluZyBpdGVyYXRvci4KKyAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJLS1jdXJyZW50OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQHJldHVybiAgVGhlIG9yaWdpbmFsIHZhbHVlIG9mIEBjICp0aGlzCisgICAgICAgKgorICAgICAgICogIERlY3JlbWVudHMgdGhlIHVuZGVybHlpbmcgaXRlcmF0b3IuCisgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisJcmV2ZXJzZV9pdGVyYXRvciBfX3RtcCA9ICp0aGlzOworCS0tY3VycmVudDsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEByZXR1cm4gIEBjICp0aGlzCisgICAgICAgKgorICAgICAgICogIEluY3JlbWVudHMgdGhlIHVuZGVybHlpbmcgaXRlcmF0b3IuCisgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeworCSsrY3VycmVudDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEByZXR1cm4gIEEgcmV2ZXJzZV9pdGVyYXRvciB3aXRoIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiBAYyAqdGhpcworICAgICAgICoKKyAgICAgICAqICBJbmNyZW1lbnRzIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yLgorICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yLS0oaW50KQorICAgICAgeworCXJldmVyc2VfaXRlcmF0b3IgX190bXAgPSAqdGhpczsKKwkrK2N1cnJlbnQ7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAcmV0dXJuICBBIHJldmVyc2VfaXRlcmF0b3IgdGhhdCByZWZlcnMgdG8gQGMgY3VycmVudCAtIEBhIF9fbgorICAgICAgICoKKyAgICAgICAqICBUaGUgdW5kZXJseWluZyBpdGVyYXRvciBtdXN0IGJlIGEgUmFuZG9tIEFjY2VzcyBJdGVyYXRvci4KKyAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoY3VycmVudCAtIF9fbik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQHJldHVybiAgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgTW92ZXMgdGhlIHVuZGVybHlpbmcgaXRlcmF0b3IgYmFja3dhcmRzIEBhIF9fbiBzdGVwcy4KKyAgICAgICAqICBUaGUgdW5kZXJseWluZyBpdGVyYXRvciBtdXN0IGJlIGEgUmFuZG9tIEFjY2VzcyBJdGVyYXRvci4KKyAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgX19uKQorICAgICAgeworCWN1cnJlbnQgLT0gX19uOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQHJldHVybiAgQSByZXZlcnNlX2l0ZXJhdG9yIHRoYXQgcmVmZXJzIHRvIEBjIGN1cnJlbnQgLSBAYSBfX24KKyAgICAgICAqCisgICAgICAgKiAgVGhlIHVuZGVybHlpbmcgaXRlcmF0b3IgbXVzdCBiZSBhIFJhbmRvbSBBY2Nlc3MgSXRlcmF0b3IuCisgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgb3BlcmF0b3ItKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGN1cnJlbnQgKyBfX24pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEByZXR1cm4gICp0aGlzCisgICAgICAgKgorICAgICAgICogIE1vdmVzIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yIGZvcndhcmRzIEBhIF9fbiBzdGVwcy4KKyAgICAgICAqICBUaGUgdW5kZXJseWluZyBpdGVyYXRvciBtdXN0IGJlIGEgUmFuZG9tIEFjY2VzcyBJdGVyYXRvci4KKyAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgX19uKQorICAgICAgeworCWN1cnJlbnQgKz0gX19uOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQHJldHVybiAgVGhlIHZhbHVlIGF0IEBjIGN1cnJlbnQgLSBAYSBfX24gLSAxCisgICAgICAgKgorICAgICAgICogIFRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yIG11c3QgYmUgYSBSYW5kb20gQWNjZXNzIEl0ZXJhdG9yLgorICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gKigqdGhpcyArIF9fbik7IH0KKyAgICB9OworCisgIC8vQHsKKyAgLyoqCisgICAqICBAcGFyYW0gIF9feCAgQSAlcmV2ZXJzZV9pdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX195ICBBICVyZXZlcnNlX2l0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgQSBzaW1wbGUgYm9vbC4KKyAgICoKKyAgICogIFJldmVyc2UgaXRlcmF0b3JzIGZvcndhcmQgbWFueSBvcGVyYXRpb25zIHRvIHRoZWlyIHVuZGVybHlpbmcgYmFzZSgpCisgICAqICBpdGVyYXRvcnMuICBPdGhlcnMgYXJlIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIG9uZSBhbm90aGVyLgorICAgKgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX194LAorCSAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feSkKKyAgICB7IHJldHVybiBfX3guYmFzZSgpID09IF9feS5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisJICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCisgICAgeyByZXR1cm4gX195LmJhc2UoKSA8IF9feC5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX194LAorCSAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX194LAorCSAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195KQorICAgIHsgcmV0dXJuIF9feSA8IF9feDsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisJICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisJICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBvcGVyYXRvci0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisJICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCisgICAgeyByZXR1cm4gX195LmJhc2UoKSAtIF9feC5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPgorICAgIG9wZXJhdG9yKyh0eXBlbmFtZSByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBfX24sCisJICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gpCisgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+KF9feC5iYXNlKCkgLSBfX24pOyB9CisKKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyBEUiAyODAuIENvbXBhcmlzb24gb2YgcmV2ZXJzZV9pdGVyYXRvciB0byBjb25zdCByZXZlcnNlX2l0ZXJhdG9yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvckw+JiBfX3gsCisJICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yUj4mIF9feSkKKyAgICB7IHJldHVybiBfX3guYmFzZSgpID09IF9feS5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yTD4mIF9feCwKKwkgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvclI+JiBfX3kpCisgICAgeyByZXR1cm4gX195LmJhc2UoKSA8IF9feC5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvckw+JiBfX3gsCisJICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yUj4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvckw+JiBfX3gsCisJICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3JSPiYgX195KQorICAgIHsgcmV0dXJuIF9feSA8IF9feDsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yTD4mIF9feCwKKwkgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3JSPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yTD4mIF9feCwKKwkgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3JSPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclI+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIC8vIERSIDY4NS4KKyAgICBpbmxpbmUgYXV0bworICAgIG9wZXJhdG9yLShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvckw+JiBfX3gsCisJICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3JSPiYgX195KQorICAgIC0+IGRlY2x0eXBlKF9feS5iYXNlKCkgLSBfX3guYmFzZSgpKQorI2Vsc2UKKyAgICBpbmxpbmUgdHlwZW5hbWUgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3JMPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgb3BlcmF0b3ItKGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yTD4mIF9feCwKKwkgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvclI+JiBfX3kpCisjZW5kaWYKKyAgICB7IHJldHVybiBfX3kuYmFzZSgpIC0gX194LmJhc2UoKTsgfQorICAvL0B9CisKKyAgLy8gMjQuNC4yLjIuMSBiYWNrX2luc2VydF9pdGVyYXRvcgorICAvKioKKyAgICogIEBicmllZiAgVHVybnMgYXNzaWdubWVudCBpbnRvIGluc2VydGlvbi4KKyAgICoKKyAgICogIFRoZXNlIGFyZSBvdXRwdXQgaXRlcmF0b3JzLCBjb25zdHJ1Y3RlZCBmcm9tIGEgY29udGFpbmVyLW9mLVQuCisgICAqICBBc3NpZ25pbmcgYSBUIHRvIHRoZSBpdGVyYXRvciBhcHBlbmRzIGl0IHRvIHRoZSBjb250YWluZXIgdXNpbmcKKyAgICogIHB1c2hfYmFjay4KKyAgICoKKyAgICogIFRpcDogIFVzaW5nIHRoZSBiYWNrX2luc2VydGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGVzZSBpdGVyYXRvcnMgY2FuCisgICAqICBzYXZlIHR5cGluZy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBjbGFzcyBiYWNrX2luc2VydF9pdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIF9Db250YWluZXIqIGNvbnRhaW5lcjsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBBIG5lc3RlZCB0eXBlZGVmIGZvciB0aGUgdHlwZSBvZiB3aGF0ZXZlciBjb250YWluZXIgeW91IHVzZWQuCisgICAgICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisKKyAgICAgIC8vLyBUaGUgb25seSB3YXkgdG8gY3JlYXRlIHRoaXMgJWl0ZXJhdG9yIGlzIHdpdGggYSBjb250YWluZXIuCisgICAgICBleHBsaWNpdAorICAgICAgYmFja19pbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194KSA6IGNvbnRhaW5lcigmX194KSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQHBhcmFtICBfX3ZhbHVlICBBbiBpbnN0YW5jZSBvZiB3aGF0ZXZlciB0eXBlCisgICAgICAgKiAgICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBpczsgcHJlc3VtYWJseSBhCisgICAgICAgKiAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLXRvLWNvbnN0IFQgZm9yIGNvbnRhaW5lcjxUPi4KKyAgICAgICAqICBAcmV0dXJuICBUaGlzICVpdGVyYXRvciwgZm9yIGNoYWluZWQgb3BlcmF0aW9ucy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBraW5kIG9mICVpdGVyYXRvciBkb2Vzbid0IHJlYWxseSBoYXZlIGEgQGEgcG9zaXRpb24gaW4gdGhlCisgICAgICAgKiAgY29udGFpbmVyICh5b3UgY2FuIHRoaW5rIG9mIHRoZSBwb3NpdGlvbiBhcyBiZWluZyBwZXJtYW5lbnRseSBhdAorICAgICAgICogIHRoZSBlbmQsIGlmIHlvdSBsaWtlKS4gIEFzc2lnbmluZyBhIHZhbHVlIHRvIHRoZSAlaXRlcmF0b3Igd2lsbAorICAgICAgICogIGFsd2F5cyBhcHBlbmQgdGhlIHZhbHVlIHRvIHRoZSBlbmQgb2YgdGhlIGNvbnRhaW5lci4KKyAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgICAgICBiYWNrX2luc2VydF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yPSh0eXBlbmFtZSBfQ29udGFpbmVyOjpjb25zdF9yZWZlcmVuY2UgX192YWx1ZSkKKyAgICAgIHsKKwljb250YWluZXItPnB1c2hfYmFjayhfX3ZhbHVlKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZWxzZQorICAgICAgYmFja19pbnNlcnRfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWx1ZSkKKyAgICAgIHsKKwljb250YWluZXItPnB1c2hfYmFjayhfX3ZhbHVlKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmJiBfX3ZhbHVlKQorICAgICAgeworCWNvbnRhaW5lci0+cHVzaF9iYWNrKHN0ZDo6bW92ZShfX3ZhbHVlKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vLyBTaW1wbHkgcmV0dXJucyAqdGhpcy4KKyAgICAgIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIC8vLyBTaW1wbHkgcmV0dXJucyAqdGhpcy4gIChUaGlzICVpdGVyYXRvciBkb2VzIG5vdCBAYSBtb3ZlLikKKyAgICAgIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICAvLy8gU2ltcGx5IHJldHVybnMgKnRoaXMuICAoVGhpcyAlaXRlcmF0b3IgZG9lcyBub3QgQGEgbW92ZS4pCisgICAgICBiYWNrX2luc2VydF9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKKyAgLyoqCisgICAqICBAcGFyYW0gIF9feCAgQSBjb250YWluZXIgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqICBAcmV0dXJuICBBbiBpbnN0YW5jZSBvZiBiYWNrX2luc2VydF9pdGVyYXRvciB3b3JraW5nIG9uIEBwIF9feC4KKyAgICoKKyAgICogIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBoZWxwcyBpbiBjcmVhdGluZyBiYWNrX2luc2VydF9pdGVyYXRvciBpbnN0YW5jZXMuCisgICAqICBUeXBpbmcgdGhlIG5hbWUgb2YgdGhlICVpdGVyYXRvciByZXF1aXJlcyBrbm93aW5nIHRoZSBwcmVjaXNlIGZ1bGwKKyAgICogIHR5cGUgb2YgdGhlIGNvbnRhaW5lciwgd2hpY2ggY2FuIGJlIHRlZGlvdXMgYW5kIGltcGVkZXMgZ2VuZXJpYworICAgKiAgcHJvZ3JhbW1pbmcuICBVc2luZyB0aGlzIGZ1bmN0aW9uIGxldHMgeW91IHRha2UgYWR2YW50YWdlIG9mIGF1dG9tYXRpYworICAgKiAgdGVtcGxhdGUgcGFyYW1ldGVyIGRlZHVjdGlvbiwgbWFraW5nIHRoZSBjb21waWxlciBtYXRjaCB0aGUgY29ycmVjdAorICAgKiAgdHlwZXMgZm9yIHlvdS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgYmFja19pbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4KKyAgICBiYWNrX2luc2VydGVyKF9Db250YWluZXImIF9feCkKKyAgICB7IHJldHVybiBiYWNrX2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPihfX3gpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFR1cm5zIGFzc2lnbm1lbnQgaW50byBpbnNlcnRpb24uCisgICAqCisgICAqICBUaGVzZSBhcmUgb3V0cHV0IGl0ZXJhdG9ycywgY29uc3RydWN0ZWQgZnJvbSBhIGNvbnRhaW5lci1vZi1ULgorICAgKiAgQXNzaWduaW5nIGEgVCB0byB0aGUgaXRlcmF0b3IgcHJlcGVuZHMgaXQgdG8gdGhlIGNvbnRhaW5lciB1c2luZworICAgKiAgcHVzaF9mcm9udC4KKyAgICoKKyAgICogIFRpcDogIFVzaW5nIHRoZSBmcm9udF9pbnNlcnRlciBmdW5jdGlvbiB0byBjcmVhdGUgdGhlc2UgaXRlcmF0b3JzIGNhbgorICAgKiAgc2F2ZSB0eXBpbmcuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgY2xhc3MgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3I8b3V0cHV0X2l0ZXJhdG9yX3RhZywgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZD4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX0NvbnRhaW5lciogY29udGFpbmVyOworCisgICAgcHVibGljOgorICAgICAgLy8vIEEgbmVzdGVkIHR5cGVkZWYgZm9yIHRoZSB0eXBlIG9mIHdoYXRldmVyIGNvbnRhaW5lciB5b3UgdXNlZC4KKyAgICAgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKworICAgICAgLy8vIFRoZSBvbmx5IHdheSB0byBjcmVhdGUgdGhpcyAlaXRlcmF0b3IgaXMgd2l0aCBhIGNvbnRhaW5lci4KKyAgICAgIGV4cGxpY2l0IGZyb250X2luc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpIDogY29udGFpbmVyKCZfX3gpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAcGFyYW0gIF9fdmFsdWUgIEFuIGluc3RhbmNlIG9mIHdoYXRldmVyIHR5cGUKKyAgICAgICAqICAgICAgICAgICAgICAgICBjb250YWluZXJfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIGlzOyBwcmVzdW1hYmx5IGEKKyAgICAgICAqICAgICAgICAgICAgICAgICByZWZlcmVuY2UtdG8tY29uc3QgVCBmb3IgY29udGFpbmVyPFQ+LgorICAgICAgICogIEByZXR1cm4gIFRoaXMgJWl0ZXJhdG9yLCBmb3IgY2hhaW5lZCBvcGVyYXRpb25zLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGtpbmQgb2YgJWl0ZXJhdG9yIGRvZXNuJ3QgcmVhbGx5IGhhdmUgYSBAYSBwb3NpdGlvbiBpbiB0aGUKKyAgICAgICAqICBjb250YWluZXIgKHlvdSBjYW4gdGhpbmsgb2YgdGhlIHBvc2l0aW9uIGFzIGJlaW5nIHBlcm1hbmVudGx5IGF0CisgICAgICAgKiAgdGhlIGZyb250LCBpZiB5b3UgbGlrZSkuICBBc3NpZ25pbmcgYSB2YWx1ZSB0byB0aGUgJWl0ZXJhdG9yIHdpbGwKKyAgICAgICAqICBhbHdheXMgcHJlcGVuZCB0aGUgdmFsdWUgdG8gdGhlIGZyb250IG9mIHRoZSBjb250YWluZXIuCisgICAgICAqLworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorICAgICAgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KHR5cGVuYW1lIF9Db250YWluZXI6OmNvbnN0X3JlZmVyZW5jZSBfX3ZhbHVlKQorICAgICAgeworCWNvbnRhaW5lci0+cHVzaF9mcm9udChfX3ZhbHVlKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZWxzZQorICAgICAgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsdWUpCisgICAgICB7CisJY29udGFpbmVyLT5wdXNoX2Zyb250KF9fdmFsdWUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmJiBfX3ZhbHVlKQorICAgICAgeworCWNvbnRhaW5lci0+cHVzaF9mcm9udChzdGQ6Om1vdmUoX192YWx1ZSkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvLy8gU2ltcGx5IHJldHVybnMgKnRoaXMuCisgICAgICBmcm9udF9pbnNlcnRfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvciooKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgLy8vIFNpbXBseSByZXR1cm5zICp0aGlzLiAgKFRoaXMgJWl0ZXJhdG9yIGRvZXMgbm90IEBhIG1vdmUuKQorICAgICAgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICAvLy8gU2ltcGx5IHJldHVybnMgKnRoaXMuICAoVGhpcyAlaXRlcmF0b3IgZG9lcyBub3QgQGEgbW92ZS4pCisgICAgICBmcm9udF9pbnNlcnRfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICB9OworCisgIC8qKgorICAgKiAgQHBhcmFtICBfX3ggIEEgY29udGFpbmVyIG9mIGFyYml0cmFyeSB0eXBlLgorICAgKiAgQHJldHVybiAgQW4gaW5zdGFuY2Ugb2YgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yIHdvcmtpbmcgb24gQHAgeC4KKyAgICoKKyAgICogIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBoZWxwcyBpbiBjcmVhdGluZyBmcm9udF9pbnNlcnRfaXRlcmF0b3IgaW5zdGFuY2VzLgorICAgKiAgVHlwaW5nIHRoZSBuYW1lIG9mIHRoZSAlaXRlcmF0b3IgcmVxdWlyZXMga25vd2luZyB0aGUgcHJlY2lzZSBmdWxsCisgICAqICB0eXBlIG9mIHRoZSBjb250YWluZXIsIHdoaWNoIGNhbiBiZSB0ZWRpb3VzIGFuZCBpbXBlZGVzIGdlbmVyaWMKKyAgICogIHByb2dyYW1taW5nLiAgVXNpbmcgdGhpcyBmdW5jdGlvbiBsZXRzIHlvdSB0YWtlIGFkdmFudGFnZSBvZiBhdXRvbWF0aWMKKyAgICogIHRlbXBsYXRlIHBhcmFtZXRlciBkZWR1Y3Rpb24sIG1ha2luZyB0aGUgY29tcGlsZXIgbWF0Y2ggdGhlIGNvcnJlY3QKKyAgICogIHR5cGVzIGZvciB5b3UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgaW5saW5lIGZyb250X2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPgorICAgIGZyb250X2luc2VydGVyKF9Db250YWluZXImIF9feCkKKyAgICB7IHJldHVybiBmcm9udF9pbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4oX194KTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBUdXJucyBhc3NpZ25tZW50IGludG8gaW5zZXJ0aW9uLgorICAgKgorICAgKiAgVGhlc2UgYXJlIG91dHB1dCBpdGVyYXRvcnMsIGNvbnN0cnVjdGVkIGZyb20gYSBjb250YWluZXItb2YtVC4KKyAgICogIEFzc2lnbmluZyBhIFQgdG8gdGhlIGl0ZXJhdG9yIGluc2VydHMgaXQgaW4gdGhlIGNvbnRhaW5lciBhdCB0aGUKKyAgICogICVpdGVyYXRvcidzIHBvc2l0aW9uLCByYXRoZXIgdGhhbiBvdmVyd3JpdGluZyB0aGUgdmFsdWUgYXQgdGhhdAorICAgKiAgcG9zaXRpb24uCisgICAqCisgICAqICAoU2VxdWVuY2VzIHdpbGwgYWN0dWFsbHkgaW5zZXJ0IGEgQGUgY29weSBvZiB0aGUgdmFsdWUgYmVmb3JlIHRoZQorICAgKiAgJWl0ZXJhdG9yJ3MgcG9zaXRpb24uKQorICAgKgorICAgKiAgVGlwOiAgVXNpbmcgdGhlIGluc2VydGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGVzZSBpdGVyYXRvcnMgY2FuCisgICAqICBzYXZlIHR5cGluZy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBjbGFzcyBpbnNlcnRfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcjxvdXRwdXRfaXRlcmF0b3JfdGFnLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfQ29udGFpbmVyKiBjb250YWluZXI7CisgICAgICB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBpdGVyOworCisgICAgcHVibGljOgorICAgICAgLy8vIEEgbmVzdGVkIHR5cGVkZWYgZm9yIHRoZSB0eXBlIG9mIHdoYXRldmVyIGNvbnRhaW5lciB5b3UgdXNlZC4KKyAgICAgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKworICAgICAgLyoqCisgICAgICAgKiAgVGhlIG9ubHkgd2F5IHRvIGNyZWF0ZSB0aGlzICVpdGVyYXRvciBpcyB3aXRoIGEgY29udGFpbmVyIGFuZCBhbgorICAgICAgICogIGluaXRpYWwgcG9zaXRpb24gKGEgbm9ybWFsICVpdGVyYXRvciBpbnRvIHRoZSBjb250YWluZXIpLgorICAgICAgKi8KKyAgICAgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gsIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIF9faSkKKyAgICAgIDogY29udGFpbmVyKCZfX3gpLCBpdGVyKF9faSkge30KKworICAgICAgLyoqCisgICAgICAgKiAgQHBhcmFtICBfX3ZhbHVlICBBbiBpbnN0YW5jZSBvZiB3aGF0ZXZlciB0eXBlCisgICAgICAgKiAgICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBpczsgcHJlc3VtYWJseSBhCisgICAgICAgKiAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLXRvLWNvbnN0IFQgZm9yIGNvbnRhaW5lcjxUPi4KKyAgICAgICAqICBAcmV0dXJuICBUaGlzICVpdGVyYXRvciwgZm9yIGNoYWluZWQgb3BlcmF0aW9ucy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBraW5kIG9mICVpdGVyYXRvciBtYWludGFpbnMgaXRzIG93biBwb3NpdGlvbiBpbiB0aGUKKyAgICAgICAqICBjb250YWluZXIuICBBc3NpZ25pbmcgYSB2YWx1ZSB0byB0aGUgJWl0ZXJhdG9yIHdpbGwgaW5zZXJ0IHRoZQorICAgICAgICogIHZhbHVlIGludG8gdGhlIGNvbnRhaW5lciBhdCB0aGUgcGxhY2UgYmVmb3JlIHRoZSAlaXRlcmF0b3IuCisgICAgICAgKgorICAgICAgICogIFRoZSBwb3NpdGlvbiBpcyBtYWludGFpbmVkIHN1Y2ggdGhhdCBzdWJzZXF1ZW50IGFzc2lnbm1lbnRzIHdpbGwKKyAgICAgICAqICBpbnNlcnQgdmFsdWVzIGltbWVkaWF0ZWx5IGFmdGVyIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsCisgICAgICAgKiAgQGNvZGUKKyAgICAgICAqICAgICAvLyB2ZWN0b3IgdiBjb250YWlucyBBIGFuZCBaCisgICAgICAgKgorICAgICAgICogICAgIGluc2VydF9pdGVyYXRvciBpICh2LCArK3YuYmVnaW4oKSk7CisgICAgICAgKiAgICAgaSA9IDE7CisgICAgICAgKiAgICAgaSA9IDI7CisgICAgICAgKiAgICAgaSA9IDM7CisgICAgICAgKgorICAgICAgICogICAgIC8vIHZlY3RvciB2IGNvbnRhaW5zIEEsIDEsIDIsIDMsIGFuZCBaCisgICAgICAgKiAgQGVuZGNvZGUKKyAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgICAgICBpbnNlcnRfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcj0odHlwZW5hbWUgX0NvbnRhaW5lcjo6Y29uc3RfcmVmZXJlbmNlIF9fdmFsdWUpCisgICAgICB7CisJaXRlciA9IGNvbnRhaW5lci0+aW5zZXJ0KGl0ZXIsIF9fdmFsdWUpOworCSsraXRlcjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZWxzZQorICAgICAgaW5zZXJ0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsdWUpCisgICAgICB7CisJaXRlciA9IGNvbnRhaW5lci0+aW5zZXJ0KGl0ZXIsIF9fdmFsdWUpOworCSsraXRlcjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yPSh0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiYgX192YWx1ZSkKKyAgICAgIHsKKwlpdGVyID0gY29udGFpbmVyLT5pbnNlcnQoaXRlciwgc3RkOjptb3ZlKF9fdmFsdWUpKTsKKwkrK2l0ZXI7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vLyBTaW1wbHkgcmV0dXJucyAqdGhpcy4KKyAgICAgIGluc2VydF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKigpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICAvLy8gU2ltcGx5IHJldHVybnMgKnRoaXMuICAoVGhpcyAlaXRlcmF0b3IgZG9lcyBub3QgQGEgbW92ZS4pCisgICAgICBpbnNlcnRfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIC8vLyBTaW1wbHkgcmV0dXJucyAqdGhpcy4gIChUaGlzICVpdGVyYXRvciBkb2VzIG5vdCBAYSBtb3ZlLikKKyAgICAgIGluc2VydF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICB9OworCisgIC8qKgorICAgKiAgQHBhcmFtIF9feCAgQSBjb250YWluZXIgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqICBAcmV0dXJuICBBbiBpbnN0YW5jZSBvZiBpbnNlcnRfaXRlcmF0b3Igd29ya2luZyBvbiBAcCBfX3guCisgICAqCisgICAqICBUaGlzIHdyYXBwZXIgZnVuY3Rpb24gaGVscHMgaW4gY3JlYXRpbmcgaW5zZXJ0X2l0ZXJhdG9yIGluc3RhbmNlcy4KKyAgICogIFR5cGluZyB0aGUgbmFtZSBvZiB0aGUgJWl0ZXJhdG9yIHJlcXVpcmVzIGtub3dpbmcgdGhlIHByZWNpc2UgZnVsbAorICAgKiAgdHlwZSBvZiB0aGUgY29udGFpbmVyLCB3aGljaCBjYW4gYmUgdGVkaW91cyBhbmQgaW1wZWRlcyBnZW5lcmljCisgICAqICBwcm9ncmFtbWluZy4gIFVzaW5nIHRoaXMgZnVuY3Rpb24gbGV0cyB5b3UgdGFrZSBhZHZhbnRhZ2Ugb2YgYXV0b21hdGljCisgICAqICB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZGVkdWN0aW9uLCBtYWtpbmcgdGhlIGNvbXBpbGVyIG1hdGNoIHRoZSBjb3JyZWN0CisgICAqICB0eXBlcyBmb3IgeW91LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29udGFpbmVyLCB0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPgorICAgIGluc2VydGVyKF9Db250YWluZXImIF9feCwgX0l0ZXJhdG9yIF9faSkKKyAgICB7CisgICAgICByZXR1cm4gaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+KF9feCwKKwkJCQkJIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yKF9faSkpOworICAgIH0KKworICAvLyBAfSBncm91cCBpdGVyYXRvcnMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gVGhpcyBpdGVyYXRvciBhZGFwdGVyIGlzIEBhIG5vcm1hbCBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBkb2VzIG5vdAorICAvLyBjaGFuZ2UgdGhlIHNlbWFudGljcyBvZiBhbnkgb2YgdGhlIG9wZXJhdG9ycyBvZiBpdHMgaXRlcmF0b3IKKyAgLy8gcGFyYW1ldGVyLiAgSXRzIHByaW1hcnkgcHVycG9zZSBpcyB0byBjb252ZXJ0IGFuIGl0ZXJhdG9yIHRoYXQgaXMKKyAgLy8gbm90IGEgY2xhc3MsIGUuZy4gYSBwb2ludGVyLCBpbnRvIGFuIGl0ZXJhdG9yIHRoYXQgaXMgYSBjbGFzcy4KKyAgLy8gVGhlIF9Db250YWluZXIgcGFyYW1ldGVyIGV4aXN0cyBzb2xlbHkgc28gdGhhdCBkaWZmZXJlbnQgY29udGFpbmVycworICAvLyB1c2luZyB0aGlzIHRlbXBsYXRlIGNhbiBpbnN0YW50aWF0ZSBkaWZmZXJlbnQgdHlwZXMsIGV2ZW4gaWYgdGhlCisgIC8vIF9JdGVyYXRvciBwYXJhbWV0ZXIgaXMgdGhlIHNhbWUuCisgIHVzaW5nIHN0ZDo6aXRlcmF0b3JfdHJhaXRzOworICB1c2luZyBzdGQ6Oml0ZXJhdG9yOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgY2xhc3MgX19ub3JtYWxfaXRlcmF0b3IKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX0l0ZXJhdG9yIF9NX2N1cnJlbnQ7CisKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj4JCV9fdHJhaXRzX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9JdGVyYXRvcgkJCQkJaXRlcmF0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHNfdHlwZTo6aXRlcmF0b3JfY2F0ZWdvcnkgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzX3R5cGU6OnZhbHVlX3R5cGUgIAl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0c190eXBlOjpkaWZmZXJlbmNlX3R5cGUgCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHNfdHlwZTo6cmVmZXJlbmNlIAlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzX3R5cGU6OnBvaW50ZXIgICAJcG9pbnRlcjsKKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIF9fbm9ybWFsX2l0ZXJhdG9yKCkgOiBfTV9jdXJyZW50KF9JdGVyYXRvcigpKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIF9fbm9ybWFsX2l0ZXJhdG9yKGNvbnN0IF9JdGVyYXRvciYgX19pKSA6IF9NX2N1cnJlbnQoX19pKSB7IH0KKworICAgICAgLy8gQWxsb3cgaXRlcmF0b3IgdG8gY29uc3RfaXRlcmF0b3IgY29udmVyc2lvbgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXI+CisgICAgICAgIF9fbm9ybWFsX2l0ZXJhdG9yKGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyLAorCQkJICB0eXBlbmFtZSBfX2VuYWJsZV9pZjwKKyAgICAgIAkgICAgICAgKHN0ZDo6X19hcmVfc2FtZTxfSXRlciwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6cG9pbnRlcj46Ol9fdmFsdWUpLAorCQkgICAgICBfQ29udGFpbmVyPjo6X190eXBlPiYgX19pKQorICAgICAgICA6IF9NX2N1cnJlbnQoX19pLmJhc2UoKSkgeyB9CisKKyAgICAgIC8vIEZvcndhcmQgaXRlcmF0b3IgcmVxdWlyZW1lbnRzCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiAqX01fY3VycmVudDsgfQorCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2N1cnJlbnQ7IH0KKworICAgICAgX19ub3JtYWxfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwkrK19NX2N1cnJlbnQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfX25vcm1hbF9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IHJldHVybiBfX25vcm1hbF9pdGVyYXRvcihfTV9jdXJyZW50KyspOyB9CisKKyAgICAgIC8vIEJpZGlyZWN0aW9uYWwgaXRlcmF0b3IgcmVxdWlyZW1lbnRzCisgICAgICBfX25vcm1hbF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeworCS0tX01fY3VycmVudDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9fbm9ybWFsX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsgcmV0dXJuIF9fbm9ybWFsX2l0ZXJhdG9yKF9NX2N1cnJlbnQtLSk7IH0KKworICAgICAgLy8gUmFuZG9tIGFjY2VzcyBpdGVyYXRvciByZXF1aXJlbWVudHMKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2N1cnJlbnRbX19uXTsgfQorCisgICAgICBfX25vcm1hbF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKz0oY29uc3QgZGlmZmVyZW5jZV90eXBlJiBfX24pCisgICAgICB7IF9NX2N1cnJlbnQgKz0gX19uOyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgX19ub3JtYWxfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKyhjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fbm9ybWFsX2l0ZXJhdG9yKF9NX2N1cnJlbnQgKyBfX24pOyB9CisKKyAgICAgIF9fbm9ybWFsX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3ItPShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikKKyAgICAgIHsgX01fY3VycmVudCAtPSBfX247IHJldHVybiAqdGhpczsgfQorCisgICAgICBfX25vcm1hbF9pdGVyYXRvcgorICAgICAgb3BlcmF0b3ItKGNvbnN0IGRpZmZlcmVuY2VfdHlwZSYgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX19ub3JtYWxfaXRlcmF0b3IoX01fY3VycmVudCAtIF9fbik7IH0KKworICAgICAgY29uc3QgX0l0ZXJhdG9yJgorICAgICAgYmFzZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9jdXJyZW50OyB9CisgICAgfTsKKworICAvLyBOb3RlOiBJbiB3aGF0IGZvbGxvd3MsIHRoZSBsZWZ0LSBhbmQgcmlnaHQtaGFuZC1zaWRlIGl0ZXJhdG9ycyBhcmUKKyAgLy8gYWxsb3dlZCB0byB2YXJ5IGluIHR5cGVzIChjb25jZXB0dWFsbHkgaW4gY3YtcXVhbGlmaWNhdGlvbikgc28gdGhhdAorICAvLyBjb21wYXJpc29uIGJldHdlZW4gY3YtcXVhbGlmaWVkIGFuZCBub24tY3YtcXVhbGlmaWVkIGl0ZXJhdG9ycyBiZQorICAvLyB2YWxpZC4gIEhvd2V2ZXIsIHRoZSBncmVlZHkgYW5kIHVuZnJpZW5kbHkgb3BlcmF0b3JzIGluIHN0ZDo6cmVsX29wcworICAvLyB3aWxsIG1ha2Ugb3ZlcmxvYWQgcmVzb2x1dGlvbiBhbWJpZ3VvdXMgKHdoZW4gaW4gc2NvcGUpIGlmIHdlIGRvbid0CisgIC8vIHByb3ZpZGUgb3ZlcmxvYWRzIHdob3NlIG9wZXJhbmRzIGFyZSBvZiB0aGUgc2FtZSB0eXBlLiAgQ2FuIHNvbWVvbmUKKyAgLy8gcmVtaW5kIG1lIHdoYXQgZ2VuZXJpYyBwcm9ncmFtbWluZyBpcyBhYm91dD8gLS0gR2FieQorCisgIC8vIEZvcndhcmQgaXRlcmF0b3IgcmVxdWlyZW1lbnRzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvckwsIF9Db250YWluZXI+JiBfX2xocywKKwkgICAgICAgY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yUiwgX0NvbnRhaW5lcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSA9PSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX0NvbnRhaW5lcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9Db250YWluZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPT0gX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUiwgdHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX0NvbnRhaW5lcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3JSLCBfQ29udGFpbmVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpICE9IF9fcmhzLmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX0NvbnRhaW5lcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSAhPSBfX3Jocy5iYXNlKCk7IH0KKworICAvLyBSYW5kb20gYWNjZXNzIGl0ZXJhdG9yIHJlcXVpcmVtZW50cworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvckwsIF9Db250YWluZXI+JiBfX2xocywKKwkgICAgICBjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3JSLCBfQ29udGFpbmVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpIDwgX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX0NvbnRhaW5lcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX0NvbnRhaW5lcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSA8IF9fcmhzLmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX0NvbnRhaW5lcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvclIsIF9Db250YWluZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPiBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPiYgX19saHMsCisJICAgICAgY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpID4gX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUiwgdHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX0NvbnRhaW5lcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3JSLCBfQ29udGFpbmVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpIDw9IF9fcmhzLmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX0NvbnRhaW5lcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSA8PSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3JMLCBfQ29udGFpbmVyPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvclIsIF9Db250YWluZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPj0gX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9Db250YWluZXI+JiBfX2xocywKKwkgICAgICAgY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpID49IF9fcmhzLmJhc2UoKTsgfQorCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gQWNjb3JkaW5nIHRvIHRoZSByZXNvbHV0aW9uIG9mIERSMTc5IG5vdCBvbmx5IHRoZSB2YXJpb3VzIGNvbXBhcmlzb24KKyAgLy8gb3BlcmF0b3JzIGJ1dCBhbHNvIG9wZXJhdG9yLSBtdXN0IGFjY2VwdCBtaXhlZCBpdGVyYXRvci9jb25zdF9pdGVyYXRvcgorICAvLyBwYXJhbWV0ZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfQ29udGFpbmVyPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAvLyBEUiA2ODUuCisgICAgaW5saW5lIGF1dG8KKyAgICBvcGVyYXRvci0oY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX0NvbnRhaW5lcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvclIsIF9Db250YWluZXI+JiBfX3JocykKKyAgICAtPiBkZWNsdHlwZShfX2xocy5iYXNlKCkgLSBfX3Jocy5iYXNlKCkpCisjZWxzZQorICAgIGlubGluZSB0eXBlbmFtZSBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3JMLCBfQ29udGFpbmVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgb3BlcmF0b3ItKGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvckwsIF9Db250YWluZXI+JiBfX2xocywKKwkgICAgICBjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3JSLCBfQ29udGFpbmVyPiYgX19yaHMpCisjZW5kaWYKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgLSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX0NvbnRhaW5lcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIG9wZXJhdG9yLShjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9Db250YWluZXI+JiBfX2xocywKKwkgICAgICBjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9Db250YWluZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgLSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgaW5saW5lIF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX0NvbnRhaW5lcj4KKyAgICBvcGVyYXRvcisodHlwZW5hbWUgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPjo6ZGlmZmVyZW5jZV90eXBlCisJICAgICAgX19uLCBjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9Db250YWluZXI+JiBfX2kpCisgICAgeyByZXR1cm4gX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPihfX2kuYmFzZSgpICsgX19uKTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgaXRlcmF0b3JzCisgICAqIEB7CisgICAqLworCisgIC8vIDI0LjQuMyAgTW92ZSBpdGVyYXRvcnMKKyAgLyoqCisgICAqICBDbGFzcyB0ZW1wbGF0ZSBtb3ZlX2l0ZXJhdG9yIGlzIGFuIGl0ZXJhdG9yIGFkYXB0ZXIgd2l0aCB0aGUgc2FtZQorICAgKiAgYmVoYXZpb3IgYXMgdGhlIHVuZGVybHlpbmcgaXRlcmF0b3IgZXhjZXB0IHRoYXQgaXRzIGRlcmVmZXJlbmNlCisgICAqICBvcGVyYXRvciBpbXBsaWNpdGx5IGNvbnZlcnRzIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgdW5kZXJseWluZworICAgKiAgaXRlcmF0b3IncyBkZXJlZmVyZW5jZSBvcGVyYXRvciB0byBhbiBydmFsdWUgcmVmZXJlbmNlLiAgU29tZQorICAgKiAgZ2VuZXJpYyBhbGdvcml0aG1zIGNhbiBiZSBjYWxsZWQgd2l0aCBtb3ZlIGl0ZXJhdG9ycyB0byByZXBsYWNlCisgICAqICBjb3B5aW5nIHdpdGggbW92aW5nLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGNsYXNzIG1vdmVfaXRlcmF0b3IKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX0l0ZXJhdG9yIF9NX2N1cnJlbnQ7CisKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj4JCV9fdHJhaXRzX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9JdGVyYXRvcgkJCQkJaXRlcmF0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHNfdHlwZTo6aXRlcmF0b3JfY2F0ZWdvcnkgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzX3R5cGU6OnZhbHVlX3R5cGUgIAl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0c190eXBlOjpkaWZmZXJlbmNlX3R5cGUJZGlmZmVyZW5jZV90eXBlOworICAgICAgLy8gTkI6IERSIDY4MC4KKyAgICAgIHR5cGVkZWYgX0l0ZXJhdG9yCQkJCQlwb2ludGVyOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiYJCQkJcmVmZXJlbmNlOworCisgICAgICBtb3ZlX2l0ZXJhdG9yKCkKKyAgICAgIDogX01fY3VycmVudCgpIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgbW92ZV9pdGVyYXRvcihpdGVyYXRvcl90eXBlIF9faSkKKyAgICAgIDogX01fY3VycmVudChfX2kpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcj4KKwltb3ZlX2l0ZXJhdG9yKGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXI+JiBfX2kpCisJOiBfTV9jdXJyZW50KF9faS5iYXNlKCkpIHsgfQorCisgICAgICBpdGVyYXRvcl90eXBlCisgICAgICBiYXNlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2N1cnJlbnQ7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjptb3ZlKCpfTV9jdXJyZW50KTsgfQorCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2N1cnJlbnQ7IH0KKworICAgICAgbW92ZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCSsrX01fY3VycmVudDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIG1vdmVfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCW1vdmVfaXRlcmF0b3IgX190bXAgPSAqdGhpczsKKwkrK19NX2N1cnJlbnQ7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICBtb3ZlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7CisJLS1fTV9jdXJyZW50OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgbW92ZV9pdGVyYXRvcgorICAgICAgb3BlcmF0b3ItLShpbnQpCisgICAgICB7CisJbW92ZV9pdGVyYXRvciBfX3RtcCA9ICp0aGlzOworCS0tX01fY3VycmVudDsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIG1vdmVfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gbW92ZV9pdGVyYXRvcihfTV9jdXJyZW50ICsgX19uKTsgfQorCisgICAgICBtb3ZlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgX19uKQorICAgICAgeworCV9NX2N1cnJlbnQgKz0gX19uOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgbW92ZV9pdGVyYXRvcgorICAgICAgb3BlcmF0b3ItKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBtb3ZlX2l0ZXJhdG9yKF9NX2N1cnJlbnQgLSBfX24pOyB9CisgICAgCisgICAgICBtb3ZlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgX19uKQorICAgICAgeyAKKwlfTV9jdXJyZW50IC09IF9fbjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjptb3ZlKF9NX2N1cnJlbnRbX19uXSk7IH0KKyAgICB9OworCisgIC8vIE5vdGU6IFNlZSBfX25vcm1hbF9pdGVyYXRvciBvcGVyYXRvcnMgbm90ZSBmcm9tIEdhYnkgdG8gdW5kZXJzdGFuZAorICAvLyB3aHkgdGhlcmUgYXJlIGFsd2F5cyAyIHZlcnNpb25zIGZvciBtb3N0IG9mIHRoZSBtb3ZlX2l0ZXJhdG9yCisgIC8vIG9wZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3JMPiYgX194LAorCSAgICAgICBjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvclI+JiBfX3kpCisgICAgeyByZXR1cm4gX194LmJhc2UoKSA9PSBfX3kuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKKwkgICAgICAgY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCisgICAgeyByZXR1cm4gX194LmJhc2UoKSA9PSBfX3kuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3JMPiYgX194LAorCSAgICAgICBjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvclI+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisJICAgICAgIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yTD4mIF9feCwKKwkgICAgICBjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvclI+JiBfX3kpCisgICAgeyByZXR1cm4gX194LmJhc2UoKSA8IF9feS5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisJICAgICAgY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCisgICAgeyByZXR1cm4gX194LmJhc2UoKSA8IF9feS5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvckw+JiBfX3gsCisJICAgICAgIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yUj4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX194LAorCSAgICAgICBjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yTD4mIF9feCwKKwkgICAgICBjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvclI+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX194LAorCSAgICAgIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195KQorICAgIHsgcmV0dXJuIF9feSA8IF9feDsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yTD4mIF9feCwKKwkgICAgICAgY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3JSPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisJICAgICAgIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisgIC8vIERSIDY4NS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUj4KKyAgICBpbmxpbmUgYXV0bworICAgIG9wZXJhdG9yLShjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvckw+JiBfX3gsCisJICAgICAgY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3JSPiYgX195KQorICAgIC0+IGRlY2x0eXBlKF9feC5iYXNlKCkgLSBfX3kuYmFzZSgpKQorICAgIHsgcmV0dXJuIF9feC5iYXNlKCkgLSBfX3kuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSBhdXRvCisgICAgb3BlcmF0b3ItKGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX194LAorCSAgICAgIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195KQorICAgIC0+IGRlY2x0eXBlKF9feC5iYXNlKCkgLSBfX3kuYmFzZSgpKQorICAgIHsgcmV0dXJuIF9feC5iYXNlKCkgLSBfX3kuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj4KKyAgICBvcGVyYXRvcisodHlwZW5hbWUgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgX19uLAorCSAgICAgIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX194KQorICAgIHsgcmV0dXJuIF9feCArIF9fbjsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+CisgICAgbWFrZV9tb3ZlX2l0ZXJhdG9yKF9JdGVyYXRvciBfX2kpCisgICAgeyByZXR1cm4gbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+KF9faSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9SZXR1cm5UeXBlCisgICAgPSB0eXBlbmFtZSBjb25kaXRpb25hbDxfX21vdmVfaWZfbm9leGNlcHRfY29uZAorICAgICAgPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgX0l0ZXJhdG9yLCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj4+Ojp0eXBlPgorICAgIGlubGluZSBfUmV0dXJuVHlwZQorICAgIF9fbWFrZV9tb3ZlX2lmX25vZXhjZXB0X2l0ZXJhdG9yKF9JdGVyYXRvciBfX2kpCisgICAgeyByZXR1cm4gX1JldHVyblR5cGUoX19pKTsgfQorCisgIC8vIEB9IGdyb3VwIGl0ZXJhdG9ycworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNkZWZpbmUgX0dMSUJDWFhfTUFLRV9NT1ZFX0lURVJBVE9SKF9JdGVyKSBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihfSXRlcikKKyNkZWZpbmUgX0dMSUJDWFhfTUFLRV9NT1ZFX0lGX05PRVhDRVBUX0lURVJBVE9SKF9JdGVyKSBcCisgIHN0ZDo6X19tYWtlX21vdmVfaWZfbm9leGNlcHRfaXRlcmF0b3IoX0l0ZXIpCisjZWxzZQorI2RlZmluZSBfR0xJQkNYWF9NQUtFX01PVkVfSVRFUkFUT1IoX0l0ZXIpIChfSXRlcikKKyNkZWZpbmUgX0dMSUJDWFhfTUFLRV9NT1ZFX0lGX05PRVhDRVBUX0lURVJBVE9SKF9JdGVyKSAoX0l0ZXIpCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfZnVuY3MuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfaXRlcmF0b3JfYmFzZV9mdW5jcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NzFlMjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfZnVuY3MuaApAQCAtMCwwICsxLDIwNSBAQAorLy8gRnVuY3Rpb25zIHVzZWQgYnkgaXRlcmF0b3JzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9pdGVyYXRvcl9iYXNlX2Z1bmNzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpdGVyYXRvcn0KKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBvZiB0aGUgZ2VuZXJhbCBpdGVyYXRvci1yZWxhdGVkIHV0aWxpdHkKKyAqICBmdW5jdGlvbnMsIHN1Y2ggYXMgZGlzdGFuY2UoKSBhbmQgYWR2YW5jZSgpLgorICovCisKKyNpZm5kZWYgX1NUTF9JVEVSQVRPUl9CQVNFX0ZVTkNTX0gKKyNkZWZpbmUgX1NUTF9JVEVSQVRPUl9CQVNFX0ZVTkNTX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2NvbmNlcHRfY2hlY2suaD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgaW5saW5lIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIF9fZGlzdGFuY2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgaW5wdXRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKworICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIF9fbiA9IDA7CisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJeworCSAgKytfX2ZpcnN0OworCSAgKytfX247CisJfQorICAgICAgcmV0dXJuIF9fbjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIGlubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgX19kaXN0YW5jZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICByZXR1cm4gX19sYXN0IC0gX19maXJzdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBnZW5lcmFsaXphdGlvbiBvZiBwb2ludGVyIGFyaXRobWV0aWMuCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgVGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlbS4KKyAgICoKKyAgICogIFJldHVybnMgQGMgbiBzdWNoIHRoYXQgX19maXJzdCArIG4gPT0gX19sYXN0LiAgVGhpcyByZXF1aXJlcworICAgKiAgdGhhdCBAcCBfX2xhc3QgbXVzdCBiZSByZWFjaGFibGUgZnJvbSBAcCBfX2ZpcnN0LiAgTm90ZSB0aGF0IEBjCisgICAqICBuIG1heSBiZSBuZWdhdGl2ZS4KKyAgICoKKyAgICogIEZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycywgdGhpcyB1c2VzIHRoZWlyIEBjICsgYW5kIEBjIC0gb3BlcmF0aW9ucworICAgKiAgYW5kIGFyZSBjb25zdGFudCB0aW1lLiAgRm9yIG90aGVyICVpdGVyYXRvciBjbGFzc2VzIHRoZXkgYXJlIGxpbmVhciB0aW1lLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgZGlzdGFuY2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzIC0tIHRha2VuIGNhcmUgb2YgaW4gX19kaXN0YW5jZQorICAgICAgcmV0dXJuIHN0ZDo6X19kaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QsCisJCQkgICAgIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfRGlzdGFuY2U+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX2FkdmFuY2UoX0lucHV0SXRlcmF0b3ImIF9faSwgX0Rpc3RhbmNlIF9fbiwgaW5wdXRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfX24gPj0gMCk7CisgICAgICB3aGlsZSAoX19uLS0pCisJKytfX2k7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fYWR2YW5jZShfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yJiBfX2ksIF9EaXN0YW5jZSBfX24sCisJICAgICAgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+KQorICAgICAgaWYgKF9fbiA+IDApCisgICAgICAgIHdoaWxlIChfX24tLSkKKwkgICsrX19pOworICAgICAgZWxzZQorICAgICAgICB3aGlsZSAoX19uKyspCisJICAtLV9faTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfRGlzdGFuY2U+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX2FkdmFuY2UoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yJiBfX2ksIF9EaXN0YW5jZSBfX24sCisgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2kgKz0gX19uOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBBIGdlbmVyYWxpemF0aW9uIG9mIHBvaW50ZXIgYXJpdGhtZXRpYy4KKyAgICogIEBwYXJhbSAgX19pICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19uICBUaGUgQGEgZGVsdGEgYnkgd2hpY2ggdG8gY2hhbmdlIEBwIF9faS4KKyAgICogIEByZXR1cm4gIE5vdGhpbmcuCisgICAqCisgICAqICBUaGlzIGluY3JlbWVudHMgQHAgaSBieSBAcCBuLiAgRm9yIGJpZGlyZWN0aW9uYWwgYW5kIHJhbmRvbSBhY2Nlc3MKKyAgICogIGl0ZXJhdG9ycywgQHAgX19uIG1heSBiZSBuZWdhdGl2ZSwgaW4gd2hpY2ggY2FzZSBAcCBfX2kgaXMgZGVjcmVtZW50ZWQuCisgICAqCisgICAqICBGb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMsIHRoaXMgdXNlcyB0aGVpciBAYyArIGFuZCBAYyAtIG9wZXJhdGlvbnMKKyAgICogIGFuZCBhcmUgY29uc3RhbnQgdGltZS4gIEZvciBvdGhlciAlaXRlcmF0b3IgY2xhc3NlcyB0aGV5IGFyZSBsaW5lYXIgdGltZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIGFkdmFuY2UoX0lucHV0SXRlcmF0b3ImIF9faSwgX0Rpc3RhbmNlIF9fbikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cyAtLSB0YWtlbiBjYXJlIG9mIGluIF9fYWR2YW5jZQorICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIF9fZCA9IF9fbjsKKyAgICAgIHN0ZDo6X19hZHZhbmNlKF9faSwgX19kLCBzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19pKSk7CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgaW5saW5lIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBuZXh0KF9Gb3J3YXJkSXRlcmF0b3IgX194LCB0eXBlbmFtZQorCSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBfX24gPSAxKQorICAgIHsKKyAgICAgIHN0ZDo6YWR2YW5jZShfX3gsIF9fbik7CisgICAgICByZXR1cm4gX194OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPgorICAgIGlubGluZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yCisgICAgcHJldihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9feCwgdHlwZW5hbWUKKwkgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgX19uID0gMSkgCisgICAgeworICAgICAgc3RkOjphZHZhbmNlKF9feCwgLV9fbik7CisgICAgICByZXR1cm4gX194OworICAgIH0KKworI2VuZGlmIC8vIEMrKzExCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9TVExfSVRFUkFUT1JfQkFTRV9GVU5DU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfdHlwZXMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfaXRlcmF0b3JfYmFzZV90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZTVmN2IKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfdHlwZXMuaApAQCAtMCwwICsxLDIzNiBAQAorLy8gVHlwZXMgdXNlZCBpbiBpdGVyYXRvciBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk4CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfaXRlcmF0b3JfYmFzZV90eXBlcy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aXRlcmF0b3J9CisgKgorICogIFRoaXMgZmlsZSBjb250YWlucyBhbGwgb2YgdGhlIGdlbmVyYWwgaXRlcmF0b3ItcmVsYXRlZCB1dGlsaXR5IHR5cGVzLAorICogIHN1Y2ggYXMgaXRlcmF0b3JfdHJhaXRzIGFuZCBzdHJ1Y3QgaXRlcmF0b3IuCisgKi8KKworI2lmbmRlZiBfU1RMX0lURVJBVE9SX0JBU0VfVFlQRVNfSAorI2RlZmluZSBfU1RMX0lURVJBVE9SX0JBU0VfVFlQRVNfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjIGluY2x1ZGUgPHR5cGVfdHJhaXRzPiAgLy8gRm9yIF9HTElCQ1hYX0hBU19ORVNURURfVFlQRSwgaXNfY29udmVydGlibGUKKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAZGVmZ3JvdXAgaXRlcmF0b3JzIEl0ZXJhdG9ycworICAgKiAgQWJzdHJhY3Rpb25zIGZvciB1bmlmb3JtIGl0ZXJhdGluZyB0aHJvdWdoIHZhcmlvdXMgdW5kZXJseWluZyB0eXBlcy4KKyAgKi8KKyAgLy9AeyAKKworICAvKioKKyAgICogIEBkZWZncm91cCBpdGVyYXRvcl90YWdzIEl0ZXJhdG9yIFRhZ3MKKyAgICogIFRoZXNlIGFyZSBlbXB0eSB0eXBlcywgdXNlZCB0byBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgaXRlcmF0b3JzLiAgVGhlCisgICAqICBkaXN0aW5jdGlvbiBpcyBub3QgbWFkZSBieSB3aGF0IHRoZXkgY29udGFpbiwgYnV0IHNpbXBseSBieSB3aGF0IHRoZXkKKyAgICogIGFyZS4gIERpZmZlcmVudCB1bmRlcmx5aW5nIGFsZ29yaXRobXMgY2FuIHRoZW4gYmUgdXNlZCBiYXNlZCBvbiB0aGUKKyAgICogIGRpZmZlcmVudCBvcGVyYXRpb25zIHN1cHBvcnRlZCBieSBkaWZmZXJlbnQgaXRlcmF0b3IgdHlwZXMuCisgICovCisgIC8vQHsgCisgIC8vLyAgTWFya2luZyBpbnB1dCBpdGVyYXRvcnMuCisgIHN0cnVjdCBpbnB1dF9pdGVyYXRvcl90YWcgeyB9OworCisgIC8vLyAgTWFya2luZyBvdXRwdXQgaXRlcmF0b3JzLgorICBzdHJ1Y3Qgb3V0cHV0X2l0ZXJhdG9yX3RhZyB7IH07CisKKyAgLy8vIEZvcndhcmQgaXRlcmF0b3JzIHN1cHBvcnQgYSBzdXBlcnNldCBvZiBpbnB1dCBpdGVyYXRvciBvcGVyYXRpb25zLgorICBzdHJ1Y3QgZm9yd2FyZF9pdGVyYXRvcl90YWcgOiBwdWJsaWMgaW5wdXRfaXRlcmF0b3JfdGFnIHsgfTsKKworICAvLy8gQmlkaXJlY3Rpb25hbCBpdGVyYXRvcnMgc3VwcG9ydCBhIHN1cGVyc2V0IG9mIGZvcndhcmQgaXRlcmF0b3IKKyAgLy8vIG9wZXJhdGlvbnMuCisgIHN0cnVjdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyA6IHB1YmxpYyBmb3J3YXJkX2l0ZXJhdG9yX3RhZyB7IH07CisKKyAgLy8vIFJhbmRvbS1hY2Nlc3MgaXRlcmF0b3JzIHN1cHBvcnQgYSBzdXBlcnNldCBvZiBiaWRpcmVjdGlvbmFsCisgIC8vLyBpdGVyYXRvciBvcGVyYXRpb25zLgorICBzdHJ1Y3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgOiBwdWJsaWMgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgeyB9OworICAvL0B9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbW1vbiAlaXRlcmF0b3IgY2xhc3MuCisgICAqCisgICAqICBUaGlzIGNsYXNzIGRvZXMgbm90aGluZyBidXQgZGVmaW5lIG5lc3RlZCB0eXBlZGVmcy4gICVJdGVyYXRvciBjbGFzc2VzCisgICAqICBjYW4gaW5oZXJpdCBmcm9tIHRoaXMgY2xhc3MgdG8gc2F2ZSBzb21lIHdvcmsuICBUaGUgdHlwZWRlZnMgYXJlIHRoZW4KKyAgICogIHVzZWQgaW4gc3BlY2lhbGl6YXRpb25zIGFuZCBvdmVybG9hZGluZy4KKyAgICoKKyAgICogIEluIHBhcnRpY3VsYXIsIHRoZXJlIGFyZSBubyBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiByZXF1aXJlbWVudHMKKyAgICogIHN1Y2ggYXMgQGMgb3BlcmF0b3IrKyBhbmQgdGhlIGxpa2UuICAoSG93IGNvdWxkIHRoZXJlIGJlPykKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NhdGVnb3J5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EaXN0YW5jZSA9IHB0cmRpZmZfdCwKKyAgICAgICAgICAgdHlwZW5hbWUgX1BvaW50ZXIgPSBfVHAqLCB0eXBlbmFtZSBfUmVmZXJlbmNlID0gX1RwJj4KKyAgICBzdHJ1Y3QgaXRlcmF0b3IKKyAgICB7CisgICAgICAvLy8gT25lIG9mIHRoZSBAbGluayBpdGVyYXRvcl90YWdzIHRhZyB0eXBlc0BlbmRsaW5rLgorICAgICAgdHlwZWRlZiBfQ2F0ZWdvcnkgIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgLy8vIFRoZSB0eXBlICJwb2ludGVkIHRvIiBieSB0aGUgaXRlcmF0b3IuCisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIC8vLyBEaXN0YW5jZSBiZXR3ZWVuIGl0ZXJhdG9ycyBpcyByZXByZXNlbnRlZCBhcyB0aGlzIHR5cGUuCisgICAgICB0eXBlZGVmIF9EaXN0YW5jZSAgZGlmZmVyZW5jZV90eXBlOworICAgICAgLy8vIFRoaXMgdHlwZSByZXByZXNlbnRzIGEgcG9pbnRlci10by12YWx1ZV90eXBlLgorICAgICAgdHlwZWRlZiBfUG9pbnRlciAgIHBvaW50ZXI7CisgICAgICAvLy8gVGhpcyB0eXBlIHJlcHJlc2VudHMgYSByZWZlcmVuY2UtdG8tdmFsdWVfdHlwZS4KKyAgICAgIHR5cGVkZWYgX1JlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiAgVHJhaXRzIGNsYXNzIGZvciBpdGVyYXRvcnMuCisgICAqCisgICAqICBUaGlzIGNsYXNzIGRvZXMgbm90aGluZyBidXQgZGVmaW5lIG5lc3RlZCB0eXBlZGVmcy4gIFRoZSBnZW5lcmFsCisgICAqICB2ZXJzaW9uIHNpbXBseSBAYSBmb3J3YXJkcyB0aGUgbmVzdGVkIHR5cGVkZWZzIGZyb20gdGhlIEl0ZXJhdG9yCisgICAqICBhcmd1bWVudC4gIFNwZWNpYWxpemVkIHZlcnNpb25zIGZvciBwb2ludGVycyBhbmQgcG9pbnRlcnMtdG8tY29uc3QKKyAgICogIHByb3ZpZGUgdGlnaHRlciwgbW9yZSBjb3JyZWN0IHNlbWFudGljcy4KKyAgKi8KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKK19HTElCQ1hYX0hBU19ORVNURURfVFlQRShpdGVyYXRvcl9jYXRlZ29yeSkKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsCisJICAgYm9vbCA9IF9faGFzX2l0ZXJhdG9yX2NhdGVnb3J5PF9JdGVyYXRvcj46OnZhbHVlPgorICAgIHN0cnVjdCBfX2l0ZXJhdG9yX3RyYWl0cyB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIHN0cnVjdCBfX2l0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3IsIHRydWU+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6Oml0ZXJhdG9yX2NhdGVnb3J5IGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6OnZhbHVlX3R5cGUgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6ZGlmZmVyZW5jZV90eXBlICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6OnBvaW50ZXIgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6cmVmZXJlbmNlICAgICAgICAgcmVmZXJlbmNlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIHN0cnVjdCBpdGVyYXRvcl90cmFpdHMKKyAgICA6IHB1YmxpYyBfX2l0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+IHsgfTsKKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBzdHJ1Y3QgaXRlcmF0b3JfdHJhaXRzCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6Oml0ZXJhdG9yX2NhdGVnb3J5IGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6OnZhbHVlX3R5cGUgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6ZGlmZmVyZW5jZV90eXBlICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6OnBvaW50ZXIgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6cmVmZXJlbmNlICAgICAgICAgcmVmZXJlbmNlOworICAgIH07CisjZW5kaWYKKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgcG9pbnRlciB0eXBlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpdGVyYXRvcl90cmFpdHM8X1RwKj4KKyAgICB7CisgICAgICB0eXBlZGVmIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwKiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIF9UcCYgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgfTsKKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgY29uc3QgcG9pbnRlciB0eXBlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpdGVyYXRvcl90cmFpdHM8Y29uc3QgX1RwKj4KKyAgICB7CisgICAgICB0eXBlZGVmIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwKiAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCYgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgfTsKKworICAvKioKKyAgICogIFRoaXMgZnVuY3Rpb24gaXMgbm90IGEgcGFydCBvZiB0aGUgQysrIHN0YW5kYXJkIGJ1dCBpcyBzeW50YWN0aWMKKyAgICogIHN1Z2FyIGZvciBpbnRlcm5hbCBsaWJyYXJ5IHVzZSBvbmx5LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6aXRlcmF0b3JfY2F0ZWdvcnkKKyAgICBfX2l0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IF9JdGVyJikKKyAgICB7IHJldHVybiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXI+OjppdGVyYXRvcl9jYXRlZ29yeSgpOyB9CisKKyAgLy9AfQorCisgIC8vIElmIF9JdGVyYXRvciBoYXMgYSBiYXNlIHJldHVybnMgaXQgb3RoZXJ3aXNlIF9JdGVyYXRvciBpcyByZXR1cm5lZAorICAvLyB1bnRvdWNoZWQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCBib29sIF9IYXNCYXNlPgorICAgIHN0cnVjdCBfSXRlcl9iYXNlCisgICAgeworICAgICAgdHlwZWRlZiBfSXRlcmF0b3IgaXRlcmF0b3JfdHlwZTsKKyAgICAgIHN0YXRpYyBpdGVyYXRvcl90eXBlIF9TX2Jhc2UoX0l0ZXJhdG9yIF9faXQpCisgICAgICB7IHJldHVybiBfX2l0OyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgc3RydWN0IF9JdGVyX2Jhc2U8X0l0ZXJhdG9yLCB0cnVlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yOjppdGVyYXRvcl90eXBlIGl0ZXJhdG9yX3R5cGU7CisgICAgICBzdGF0aWMgaXRlcmF0b3JfdHlwZSBfU19iYXNlKF9JdGVyYXRvciBfX2l0KQorICAgICAgeyByZXR1cm4gX19pdC5iYXNlKCk7IH0KKyAgICB9OworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyPgorICAgIHVzaW5nIF9SZXF1aXJlSW5wdXRJdGVyID0gdHlwZW5hbWUKKyAgICAgIGVuYWJsZV9pZjxpc19jb252ZXJ0aWJsZTx0eXBlbmFtZQorCQlpdGVyYXRvcl90cmFpdHM8X0luSXRlcj46Oml0ZXJhdG9yX2NhdGVnb3J5LAorCQkJICAgICAgIGlucHV0X2l0ZXJhdG9yX3RhZz46OnZhbHVlPjo6dHlwZTsKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfU1RMX0lURVJBVE9SX0JBU0VfVFlQRVNfSCAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX2xpc3QuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Njc2MGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX2xpc3QuaApAQCAtMCwwICsxLDE2NjggQEAKKy8vIExpc3QgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX2xpc3QuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2xpc3R9CisgKi8KKworI2lmbmRlZiBfU1RMX0xJU1RfSAorI2RlZmluZSBfU1RMX0xJU1RfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2NvbmNlcHRfY2hlY2suaD4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKKyAgbmFtZXNwYWNlIF9fZGV0YWlsCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIC8vIFN1cHBvcnRpbmcgc3RydWN0dXJlcyBhcmUgc3BsaXQgaW50byBjb21tb24gYW5kIHRlbXBsYXRlZAorICAgIC8vIHR5cGVzOyB0aGUgbGF0dGVyIHB1YmxpY2x5IGluaGVyaXRzIGZyb20gdGhlIGZvcm1lciBpbiBhbgorICAgIC8vIGVmZm9ydCB0byByZWR1Y2UgY29kZSBkdXBsaWNhdGlvbi4gIFRoaXMgcmVzdWx0cyBpbiBzb21lCisgICAgLy8gIm5lZWRsZXNzIiBzdGF0aWNfY2FzdCdpbmcgbGF0ZXIgb24sIGJ1dCBpdCdzIGFsbCBzYWZlCisgICAgLy8gZG93bmNhc3RpbmcuCisKKyAgICAvLy8gQ29tbW9uIHBhcnQgb2YgYSBub2RlIGluIHRoZSAlbGlzdC4gCisgICAgc3RydWN0IF9MaXN0X25vZGVfYmFzZQorICAgIHsKKyAgICAgIF9MaXN0X25vZGVfYmFzZSogX01fbmV4dDsKKyAgICAgIF9MaXN0X25vZGVfYmFzZSogX01fcHJldjsKKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIHN3YXAoX0xpc3Rfbm9kZV9iYXNlJiBfX3gsIF9MaXN0X25vZGVfYmFzZSYgX195KSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3RyYW5zZmVyKF9MaXN0X25vZGVfYmFzZSogY29uc3QgX19maXJzdCwKKwkJICBfTGlzdF9ub2RlX2Jhc2UqIGNvbnN0IF9fbGFzdCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworCisgICAgICB2b2lkCisgICAgICBfTV9yZXZlcnNlKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworCisgICAgICB2b2lkCisgICAgICBfTV9ob29rKF9MaXN0X25vZGVfYmFzZSogY29uc3QgX19wb3NpdGlvbikgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworCisgICAgICB2b2lkCisgICAgICBfTV91bmhvb2soKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisgICAgfTsKKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCisKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKKworICAvLy8gQW4gYWN0dWFsIG5vZGUgaW4gdGhlICVsaXN0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9MaXN0X25vZGUgOiBwdWJsaWMgX19kZXRhaWw6Ol9MaXN0X25vZGVfYmFzZQorICAgIHsKKyAgICAgIC8vLzwgVXNlcidzIGRhdGEuCisgICAgICBfVHAgX01fZGF0YTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICBfTGlzdF9ub2RlKF9BcmdzJiYuLi4gX19hcmdzKQorCTogX19kZXRhaWw6Ol9MaXN0X25vZGVfYmFzZSgpLCBfTV9kYXRhKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikgCisgICAgICAgIHsgfQorI2VuZGlmCisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiBBIGxpc3Q6Oml0ZXJhdG9yLgorICAgKgorICAgKiAgQWxsIHRoZSBmdW5jdGlvbnMgYXJlIG9wIG92ZXJsb2Fkcy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfTGlzdF9pdGVyYXRvcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0xpc3RfaXRlcmF0b3I8X1RwPiAgICAgICAgICAgICAgICBfU2VsZjsKKyAgICAgIHR5cGVkZWYgX0xpc3Rfbm9kZTxfVHA+ICAgICAgICAgICAgICAgICAgICBfTm9kZTsKKworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfVHAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIF9UcCYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworCisgICAgICBfTGlzdF9pdGVyYXRvcigpCisgICAgICA6IF9NX25vZGUoKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIF9MaXN0X2l0ZXJhdG9yKF9fZGV0YWlsOjpfTGlzdF9ub2RlX2Jhc2UqIF9feCkKKyAgICAgIDogX01fbm9kZShfX3gpIHsgfQorCisgICAgICAvLyBNdXN0IGRvd25jYXN0IGZyb20gX0xpc3Rfbm9kZV9iYXNlIHRvIF9MaXN0X25vZGUgdG8gZ2V0IHRvIF9NX2RhdGEuCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfTm9kZSo+KF9NX25vZGUpLT5fTV9kYXRhOyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihzdGF0aWNfY2FzdDxfTm9kZSo+KF9NX25vZGUpLT5fTV9kYXRhKTsgfQorCisgICAgICBfU2VsZiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCV9NX25vZGUgPSBfTV9ub2RlLT5fTV9uZXh0OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1NlbGYKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCV9TZWxmIF9fdG1wID0gKnRoaXM7CisJX01fbm9kZSA9IF9NX25vZGUtPl9NX25leHQ7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICBfU2VsZiYKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeworCV9NX25vZGUgPSBfTV9ub2RlLT5fTV9wcmV2OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1NlbGYKKyAgICAgIG9wZXJhdG9yLS0oaW50KQorICAgICAgeworCV9TZWxmIF9fdG1wID0gKnRoaXM7CisJX01fbm9kZSA9IF9NX25vZGUtPl9NX3ByZXY7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IF9TZWxmJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9ub2RlID09IF9feC5fTV9ub2RlOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgX1NlbGYmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX25vZGUgIT0gX194Ll9NX25vZGU7IH0KKworICAgICAgLy8gVGhlIG9ubHkgbWVtYmVyIHBvaW50cyB0byB0aGUgJWxpc3QgZWxlbWVudC4KKyAgICAgIF9fZGV0YWlsOjpfTGlzdF9ub2RlX2Jhc2UqIF9NX25vZGU7CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiBBIGxpc3Q6OmNvbnN0X2l0ZXJhdG9yLgorICAgKgorICAgKiAgQWxsIHRoZSBmdW5jdGlvbnMgYXJlIG9wIG92ZXJsb2Fkcy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfTGlzdF9jb25zdF9pdGVyYXRvcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0xpc3RfY29uc3RfaXRlcmF0b3I8X1RwPiAgICAgICAgICBfU2VsZjsKKyAgICAgIHR5cGVkZWYgY29uc3QgX0xpc3Rfbm9kZTxfVHA+ICAgICAgICAgICAgICBfTm9kZTsKKyAgICAgIHR5cGVkZWYgX0xpc3RfaXRlcmF0b3I8X1RwPiAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAqICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCYgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworCisgICAgICBfTGlzdF9jb25zdF9pdGVyYXRvcigpCisgICAgICA6IF9NX25vZGUoKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIF9MaXN0X2NvbnN0X2l0ZXJhdG9yKGNvbnN0IF9fZGV0YWlsOjpfTGlzdF9ub2RlX2Jhc2UqIF9feCkKKyAgICAgIDogX01fbm9kZShfX3gpIHsgfQorCisgICAgICBfTGlzdF9jb25zdF9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX194KQorICAgICAgOiBfTV9ub2RlKF9feC5fTV9ub2RlKSB7IH0KKworICAgICAgLy8gTXVzdCBkb3duY2FzdCBmcm9tIExpc3Rfbm9kZV9iYXNlIHRvIF9MaXN0X25vZGUgdG8gZ2V0IHRvCisgICAgICAvLyBfTV9kYXRhLgorICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X05vZGUqPihfTV9ub2RlKS0+X01fZGF0YTsgfQorCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2Yoc3RhdGljX2Nhc3Q8X05vZGUqPihfTV9ub2RlKS0+X01fZGF0YSk7IH0KKworICAgICAgX1NlbGYmCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwlfTV9ub2RlID0gX01fbm9kZS0+X01fbmV4dDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9TZWxmCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlfU2VsZiBfX3RtcCA9ICp0aGlzOworCV9NX25vZGUgPSBfTV9ub2RlLT5fTV9uZXh0OworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgX1NlbGYmCisgICAgICBvcGVyYXRvci0tKCkKKyAgICAgIHsKKwlfTV9ub2RlID0gX01fbm9kZS0+X01fcHJldjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9TZWxmCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsKKwlfU2VsZiBfX3RtcCA9ICp0aGlzOworCV9NX25vZGUgPSBfTV9ub2RlLT5fTV9wcmV2OworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBfU2VsZiYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbm9kZSA9PSBfX3guX01fbm9kZTsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IF9TZWxmJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9ub2RlICE9IF9feC5fTV9ub2RlOyB9CisKKyAgICAgIC8vIFRoZSBvbmx5IG1lbWJlciBwb2ludHMgdG8gdGhlICVsaXN0IGVsZW1lbnQuCisgICAgICBjb25zdCBfX2RldGFpbDo6X0xpc3Rfbm9kZV9iYXNlKiBfTV9ub2RlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX0xpc3RfaXRlcmF0b3I8X1ZhbD4mIF9feCwKKwkgICAgICAgY29uc3QgX0xpc3RfY29uc3RfaXRlcmF0b3I8X1ZhbD4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fbm9kZSA9PSBfX3kuX01fbm9kZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWw+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9MaXN0X2l0ZXJhdG9yPF9WYWw+JiBfX3gsCisgICAgICAgICAgICAgICBjb25zdCBfTGlzdF9jb25zdF9pdGVyYXRvcjxfVmFsPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9ub2RlICE9IF9feS5fTV9ub2RlOyB9CisKKworICAvLy8gU2VlIGJpdHMvc3RsX2RlcXVlLmgncyBfRGVxdWVfYmFzZSBmb3IgYW4gZXhwbGFuYXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIF9MaXN0X2Jhc2UKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgLy8gTk9UQSBCRU5FCisgICAgICAvLyBUaGUgc3RvcmVkIGluc3RhbmNlIGlzIG5vdCBhY3R1YWxseSBvZiAiYWxsb2NhdG9yX3R5cGUiJ3MKKyAgICAgIC8vIHR5cGUuICBJbnN0ZWFkIHdlIHJlYmluZCB0aGUgdHlwZSB0bworICAgICAgLy8gQWxsb2NhdG9yPExpc3Rfbm9kZTxUcD4+LCB3aGljaCBhY2NvcmRpbmcgdG8gWzIwLjEuNV0vNAorICAgICAgLy8gc2hvdWxkIHByb2JhYmx5IGJlIHRoZSBzYW1lLiAgTGlzdF9ub2RlPFRwPiBpcyBub3QgdGhlIHNhbWUKKyAgICAgIC8vIHNpemUgYXMgVHAgKGl0J3MgdHdvIHBvaW50ZXJzIGxhcmdlciksIGFuZCBzcGVjaWFsaXphdGlvbnMgb24KKyAgICAgIC8vIFRwIG1heSBnbyB1bnVzZWQgYmVjYXVzZSBMaXN0X25vZGU8VHA+IGlzIGJlaW5nIGJvdW5kCisgICAgICAvLyBpbnN0ZWFkLgorICAgICAgLy8KKyAgICAgIC8vIFdlIHB1dCB0aGlzIHRvIHRoZSB0ZXN0IGluIHRoZSBjb25zdHJ1Y3RvcnMgYW5kIGluCisgICAgICAvLyBnZXRfYWxsb2NhdG9yLCB3aGVyZSB3ZSB1c2UgY29udmVyc2lvbnMgYmV0d2VlbgorICAgICAgLy8gYWxsb2NhdG9yX3R5cGUgYW5kIF9Ob2RlX2FsbG9jX3R5cGUuIFRoZSBjb252ZXJzaW9uIGlzCisgICAgICAvLyByZXF1aXJlZCBieSB0YWJsZSAzMiBpbiBbMjAuMS41XS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X0xpc3Rfbm9kZTxfVHA+ID46Om90aGVyCisgICAgICAgIF9Ob2RlX2FsbG9jX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X1RwPjo6b3RoZXIgX1RwX2FsbG9jX3R5cGU7CisKKyAgICAgIHN0cnVjdCBfTGlzdF9pbXBsCisgICAgICA6IHB1YmxpYyBfTm9kZV9hbGxvY190eXBlCisgICAgICB7CisJX19kZXRhaWw6Ol9MaXN0X25vZGVfYmFzZSBfTV9ub2RlOworCisJX0xpc3RfaW1wbCgpCisJOiBfTm9kZV9hbGxvY190eXBlKCksIF9NX25vZGUoKQorCXsgfQorCisJX0xpc3RfaW1wbChjb25zdCBfTm9kZV9hbGxvY190eXBlJiBfX2EpCisJOiBfTm9kZV9hbGxvY190eXBlKF9fYSksIF9NX25vZGUoKQorCXsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCV9MaXN0X2ltcGwoX05vZGVfYWxsb2NfdHlwZSYmIF9fYSkKKwk6IF9Ob2RlX2FsbG9jX3R5cGUoc3RkOjptb3ZlKF9fYSkpLCBfTV9ub2RlKCkKKwl7IH0KKyNlbmRpZgorICAgICAgfTsKKworICAgICAgX0xpc3RfaW1wbCBfTV9pbXBsOworCisgICAgICBfTGlzdF9ub2RlPF9UcD4qCisgICAgICBfTV9nZXRfbm9kZSgpCisgICAgICB7IHJldHVybiBfTV9pbXBsLl9Ob2RlX2FsbG9jX3R5cGU6OmFsbG9jYXRlKDEpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3B1dF9ub2RlKF9MaXN0X25vZGU8X1RwPiogX19wKQorICAgICAgeyBfTV9pbXBsLl9Ob2RlX2FsbG9jX3R5cGU6OmRlYWxsb2NhdGUoX19wLCAxKTsgfQorCisgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0FsbG9jIGFsbG9jYXRvcl90eXBlOworCisgICAgICBfTm9kZV9hbGxvY190eXBlJgorICAgICAgX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxfTm9kZV9hbGxvY190eXBlKj4oJl9NX2ltcGwpOyB9CisKKyAgICAgIGNvbnN0IF9Ob2RlX2FsbG9jX3R5cGUmCisgICAgICBfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IF9Ob2RlX2FsbG9jX3R5cGUqPigmX01faW1wbCk7IH0KKworICAgICAgX1RwX2FsbG9jX3R5cGUKKyAgICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX1RwX2FsbG9jX3R5cGUoX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkpOyB9CisKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGFsbG9jYXRvcl90eXBlKF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpKTsgfQorCisgICAgICBfTGlzdF9iYXNlKCkKKyAgICAgIDogX01faW1wbCgpCisgICAgICB7IF9NX2luaXQoKTsgfQorCisgICAgICBfTGlzdF9iYXNlKGNvbnN0IF9Ob2RlX2FsbG9jX3R5cGUmIF9fYSkKKyAgICAgIDogX01faW1wbChfX2EpCisgICAgICB7IF9NX2luaXQoKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgX0xpc3RfYmFzZShfTGlzdF9iYXNlJiYgX194KQorICAgICAgOiBfTV9pbXBsKHN0ZDo6bW92ZShfX3guX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkpKQorICAgICAgeworCV9NX2luaXQoKTsKKwlfX2RldGFpbDo6X0xpc3Rfbm9kZV9iYXNlOjpzd2FwKF9NX2ltcGwuX01fbm9kZSwgX194Ll9NX2ltcGwuX01fbm9kZSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLy8gVGhpcyBpcyB3aGF0IGFjdHVhbGx5IGRlc3Ryb3lzIHRoZSBsaXN0LgorICAgICAgfl9MaXN0X2Jhc2UoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyBfTV9jbGVhcigpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2NsZWFyKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luaXQoKQorICAgICAgeworICAgICAgICB0aGlzLT5fTV9pbXBsLl9NX25vZGUuX01fbmV4dCA9ICZ0aGlzLT5fTV9pbXBsLl9NX25vZGU7CisgICAgICAgIHRoaXMtPl9NX2ltcGwuX01fbm9kZS5fTV9wcmV2ID0gJnRoaXMtPl9NX2ltcGwuX01fbm9kZTsKKyAgICAgIH0KKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIEEgc3RhbmRhcmQgY29udGFpbmVyIHdpdGggbGluZWFyIHRpbWUgYWNjZXNzIHRvIGVsZW1lbnRzLAorICAgKiAgYW5kIGZpeGVkIHRpbWUgaW5zZXJ0aW9uL2RlbGV0aW9uIGF0IGFueSBwb2ludCBpbiB0aGUgc2VxdWVuY2UuCisgICAqCisgICAqICBAaW5ncm91cCBzZXF1ZW5jZXMKKyAgICoKKyAgICogIEB0cGFyYW0gX1RwICBUeXBlIG9mIGVsZW1lbnQuCisgICAqICBAdHBhcmFtIF9BbGxvYyAgQWxsb2NhdG9yIHR5cGUsIGRlZmF1bHRzIHRvIGFsbG9jYXRvcjxfVHA+LgorICAgKgorICAgKiAgTWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LCBhCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NiI+cmV2ZXJzaWJsZSBjb250YWluZXI8L2E+LCBhbmQgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjciPnNlcXVlbmNlPC9hPiwgaW5jbHVkaW5nIHRoZQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjgiPm9wdGlvbmFsIHNlcXVlbmNlIHJlcXVpcmVtZW50czwvYT4gd2l0aCB0aGUKKyAgICogICVleGNlcHRpb24gb2YgQGMgYXQgYW5kIEBjIG9wZXJhdG9yW10uCisgICAqCisgICAqICBUaGlzIGlzIGEgQGUgZG91Ymx5IEBlIGxpbmtlZCAlbGlzdC4gIFRyYXZlcnNhbCB1cCBhbmQgZG93biB0aGUKKyAgICogICVsaXN0IHJlcXVpcmVzIGxpbmVhciB0aW1lLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyBlbGVtZW50cyAob3IKKyAgICogIEBlIG5vZGVzKSBpcyBkb25lIGluIGNvbnN0YW50IHRpbWUsIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgdGhlCisgICAqICBjaGFuZ2UgdGFrZXMgcGxhY2UuICBVbmxpa2Ugc3RkOjp2ZWN0b3IgYW5kIHN0ZDo6ZGVxdWUsCisgICAqICByYW5kb20tYWNjZXNzIGl0ZXJhdG9ycyBhcmUgbm90IHByb3ZpZGVkLCBzbyBzdWJzY3JpcHRpbmcgKCBAYworICAgKiAgW10gKSBhY2Nlc3MgaXMgbm90IGFsbG93ZWQuICBGb3IgYWxnb3JpdGhtcyB3aGljaCBvbmx5IG5lZWQKKyAgICogIHNlcXVlbnRpYWwgYWNjZXNzLCB0aGlzIGxhY2sgbWFrZXMgbm8gZGlmZmVyZW5jZS4KKyAgICoKKyAgICogIEFsc28gdW5saWtlIHRoZSBvdGhlciBzdGFuZGFyZCBjb250YWluZXJzLCBzdGQ6Omxpc3QgcHJvdmlkZXMKKyAgICogIHNwZWNpYWxpemVkIGFsZ29yaXRobXMgJXVuaXF1ZSB0byBsaW5rZWQgbGlzdHMsIHN1Y2ggYXMKKyAgICogIHNwbGljaW5nLCBzb3J0aW5nLCBhbmQgaW4tcGxhY2UgcmV2ZXJzYWwuCisgICAqCisgICAqICBBIGNvdXBsZSBwb2ludHMgb24gbWVtb3J5IGFsbG9jYXRpb24gZm9yIGxpc3Q8VHA+OgorICAgKgorICAgKiAgRmlyc3QsIHdlIG5ldmVyIGFjdHVhbGx5IGFsbG9jYXRlIGEgVHAsIHdlIGFsbG9jYXRlCisgICAqICBMaXN0X25vZGU8VHA+J3MgYW5kIHRydXN0IFsyMC4xLjVdLzQgdG8gRFRSVC4gIFRoaXMgaXMgdG8gZW5zdXJlCisgICAqICB0aGF0IGFmdGVyIGVsZW1lbnRzIGZyb20gJWxpc3Q8WCxBbGxvYzE+IGFyZSBzcGxpY2VkIGludG8KKyAgICogICVsaXN0PFgsQWxsb2MyPiwgZGVzdHJveWluZyB0aGUgbWVtb3J5IG9mIHRoZSBzZWNvbmQgJWxpc3QgaXMgYQorICAgKiAgdmFsaWQgb3BlcmF0aW9uLCBpLmUuLCBBbGxvYzEgZ2l2ZXRoIGFuZCBBbGxvYzIgdGFrZXRoIGF3YXkuCisgICAqCisgICAqICBTZWNvbmQsIGEgJWxpc3QgY29uY2VwdHVhbGx5IHJlcHJlc2VudGVkIGFzCisgICAqICBAY29kZQorICAgKiAgICBBIDwtLS0+IEIgPC0tLT4gQyA8LS0tPiBECisgICAqICBAZW5kY29kZQorICAgKiAgaXMgYWN0dWFsbHkgY2lyY3VsYXI7IGEgbGluayBleGlzdHMgYmV0d2VlbiBBIGFuZCBELiAgVGhlICVsaXN0CisgICAqICBjbGFzcyBob2xkcyAoYXMgaXRzIG9ubHkgZGF0YSBtZW1iZXIpIGEgcHJpdmF0ZSBsaXN0OjppdGVyYXRvcgorICAgKiAgcG9pbnRpbmcgdG8gQGUgRCwgbm90IHRvIEBlIEEhICBUbyBnZXQgdG8gdGhlIGhlYWQgb2YgdGhlICVsaXN0LAorICAgKiAgd2Ugc3RhcnQgYXQgdGhlIHRhaWwgYW5kIG1vdmUgZm9yd2FyZCBieSBvbmUuICBXaGVuIHRoaXMgbWVtYmVyCisgICAqICBpdGVyYXRvcidzIG5leHQvcHJldmlvdXMgcG9pbnRlcnMgcmVmZXIgdG8gaXRzZWxmLCB0aGUgJWxpc3QgaXMKKyAgICogICVlbXB0eS4gCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8X1RwPiA+CisgICAgY2xhc3MgbGlzdCA6IHByb3RlY3RlZCBfTGlzdF9iYXNlPF9UcCwgX0FsbG9jPgorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dmFsdWVfdHlwZSAgICAgICAgICAgICAgICBfQWxsb2NfdmFsdWVfdHlwZTsKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfVHAsIF9TR0lBc3NpZ25hYmxlQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczIoX1RwLCBfQWxsb2NfdmFsdWVfdHlwZSwgX1NhbWVUeXBlQ29uY2VwdCkKKworICAgICAgdHlwZWRlZiBfTGlzdF9iYXNlPF9UcCwgX0FsbG9jPiAgICAgICAgICAgICAgICAgICAgX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpfVHBfYWxsb2NfdHlwZQkJIF9UcF9hbGxvY190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6X05vZGVfYWxsb2NfdHlwZQkJIF9Ob2RlX2FsbG9jX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHBfYWxsb2NfdHlwZTo6cG9pbnRlciAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RwX2FsbG9jX3R5cGU6OmNvbnN0X3BvaW50ZXIgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcF9hbGxvY190eXBlOjpyZWZlcmVuY2UgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcF9hbGxvY190eXBlOjpjb25zdF9yZWZlcmVuY2UgICBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIF9MaXN0X2l0ZXJhdG9yPF9UcD4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX0xpc3RfY29uc3RfaXRlcmF0b3I8X1RwPiAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+ICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9BbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIE5vdGUgdGhhdCBwb2ludGVycy10by1fTm9kZSdzIGNhbiBiZSBjdG9yLWNvbnZlcnRlZCB0bworICAgICAgLy8gaXRlcmF0b3IgdHlwZXMuCisgICAgICB0eXBlZGVmIF9MaXN0X25vZGU8X1RwPgkJCQkgX05vZGU7CisKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9pbXBsOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX3B1dF9ub2RlOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2dldF9ub2RlOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2dldF9UcF9hbGxvY2F0b3I7CisgICAgICB1c2luZyBfQmFzZTo6X01fZ2V0X05vZGVfYWxsb2NhdG9yOworCisgICAgICAvKioKKyAgICAgICAqICBAcGFyYW0gIF9fYXJncyAgQW4gaW5zdGFuY2Ugb2YgdXNlciBkYXRhLgorICAgICAgICoKKyAgICAgICAqICBBbGxvY2F0ZXMgc3BhY2UgZm9yIGEgbmV3IG5vZGUgYW5kIGNvbnN0cnVjdHMgYSBjb3B5IG9mCisgICAgICAgKiAgQGEgX19hcmdzIGluIGl0LgorICAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgICAgICBfTm9kZSoKKyAgICAgIF9NX2NyZWF0ZV9ub2RlKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlfTm9kZSogX19wID0gdGhpcy0+X01fZ2V0X25vZGUoKTsKKwlfX3RyeQorCSAgeworCSAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkuY29uc3RydWN0CisJICAgICAgKHN0ZDo6X19hZGRyZXNzb2YoX19wLT5fTV9kYXRhKSwgX194KTsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX01fcHV0X25vZGUoX19wKTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisJcmV0dXJuIF9fcDsKKyAgICAgIH0KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgX05vZGUqCisgICAgICAgIF9NX2NyZWF0ZV9ub2RlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIF9Ob2RlKiBfX3AgPSB0aGlzLT5fTV9nZXRfbm9kZSgpOworCSAgX190cnkKKwkgICAgeworCSAgICAgIF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpLmNvbnN0cnVjdChfX3AsCisJCQkJCQlzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIF9NX3B1dF9ub2RlKF9fcCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIHJldHVybiBfX3A7CisJfQorI2VuZGlmCisKKyAgICBwdWJsaWM6CisgICAgICAvLyBbMjMuMi4yLjFdIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3kKKyAgICAgIC8vIChhc3NpZ24oKSBhbmQgZ2V0X2FsbG9jYXRvcigpIGFyZSBhbHNvIGxpc3RlZCBpbiB0aGlzIHNlY3Rpb24pCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IgY3JlYXRlcyBubyBlbGVtZW50cy4KKyAgICAgICAqLworICAgICAgbGlzdCgpCisgICAgICA6IF9CYXNlKCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICVsaXN0IHdpdGggbm8gZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBsaXN0KGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICA6IF9CYXNlKF9Ob2RlX2FsbG9jX3R5cGUoX19hKSkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENyZWF0ZXMgYSAlbGlzdCB3aXRoIGRlZmF1bHQgY29uc3RydWN0ZWQgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX24gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gaW5pdGlhbGx5IGNyZWF0ZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBjb25zdHJ1Y3RvciBmaWxscyB0aGUgJWxpc3Qgd2l0aCBAYSBfX24gZGVmYXVsdAorICAgICAgICogIGNvbnN0cnVjdGVkIGVsZW1lbnRzLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgbGlzdChzaXplX3R5cGUgX19uKQorICAgICAgOiBfQmFzZSgpCisgICAgICB7IF9NX2RlZmF1bHRfaW5pdGlhbGl6ZShfX24pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICVsaXN0IHdpdGggY29waWVzIG9mIGFuIGV4ZW1wbGFyIGVsZW1lbnQuCisgICAgICAgKiAgQHBhcmFtICBfX24gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gaW5pdGlhbGx5IGNyZWF0ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fdmFsdWUgIEFuIGVsZW1lbnQgdG8gY29weS4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBjb25zdHJ1Y3RvciBmaWxscyB0aGUgJWxpc3Qgd2l0aCBAYSBfX24gY29waWVzIG9mIEBhIF9fdmFsdWUuCisgICAgICAgKi8KKyAgICAgIGxpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWx1ZSwKKwkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX05vZGVfYWxsb2NfdHlwZShfX2EpKQorICAgICAgeyBfTV9maWxsX2luaXRpYWxpemUoX19uLCBfX3ZhbHVlKTsgfQorI2Vsc2UKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICVsaXN0IHdpdGggY29waWVzIG9mIGFuIGV4ZW1wbGFyIGVsZW1lbnQuCisgICAgICAgKiAgQHBhcmFtICBfX24gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gaW5pdGlhbGx5IGNyZWF0ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fdmFsdWUgIEFuIGVsZW1lbnQgdG8gY29weS4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBjb25zdHJ1Y3RvciBmaWxscyB0aGUgJWxpc3Qgd2l0aCBAYSBfX24gY29waWVzIG9mIEBhIF9fdmFsdWUuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsdWUgPSB2YWx1ZV90eXBlKCksCisJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9Ob2RlX2FsbG9jX3R5cGUoX19hKSkKKyAgICAgIHsgX01fZmlsbF9pbml0aWFsaXplKF9fbiwgX192YWx1ZSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVMaXN0IGNvcHkgY29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJWxpc3Qgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJWxpc3QgdXNlcyBhIGNvcHkgb2YgdGhlIGFsbG9jYXRpb24gb2JqZWN0IHVzZWQKKyAgICAgICAqICBieSBAYSBfX3guCisgICAgICAgKi8KKyAgICAgIGxpc3QoY29uc3QgbGlzdCYgX194KQorICAgICAgOiBfQmFzZShfX3guX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkpCisgICAgICB7IF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX194LmJlZ2luKCksIF9feC5lbmQoKSwgX19mYWxzZV90eXBlKCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVMaXN0IG1vdmUgY29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJWxpc3Qgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJWxpc3QgY29udGFpbnMgdGhlIGV4YWN0IGNvbnRlbnRzIG9mIEBhIF9feC4KKyAgICAgICAqICBUaGUgY29udGVudHMgb2YgQGEgX194IGFyZSBhIHZhbGlkLCBidXQgdW5zcGVjaWZpZWQgJWxpc3QuCisgICAgICAgKi8KKyAgICAgIGxpc3QobGlzdCYmIF9feCkgbm9leGNlcHQKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICVsaXN0IGZyb20gYW4gaW5pdGlhbGl6ZXJfbGlzdAorICAgICAgICogIEBwYXJhbSAgX19sICBBbiBpbml0aWFsaXplcl9saXN0IG9mIHZhbHVlX3R5cGUuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVsaXN0IGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUKKyAgICAgICAqICBpbml0aWFsaXplcl9saXN0IEBhIF9fbC4gIFRoaXMgaXMgbGluZWFyIGluIF9fbC5zaXplKCkuCisgICAgICAgKi8KKyAgICAgIGxpc3QoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfTm9kZV9hbGxvY190eXBlKF9fYSkpCisgICAgICB7IF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX19sLmJlZ2luKCksIF9fbC5lbmQoKSwgX19mYWxzZV90eXBlKCkpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlbGlzdCBmcm9tIGEgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVsaXN0IGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBmcm9tCisgICAgICAgKiAgW0BhIF9fZmlyc3QsQGEgX19sYXN0KS4gIFRoaXMgaXMgbGluZWFyIGluIE4gKHdoZXJlIE4gaXMKKyAgICAgICAqICBkaXN0YW5jZShAYSBfX2ZpcnN0LEBhIF9fbGFzdCkpLgorICAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisgICAgICAgIGxpc3QoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfTm9kZV9hbGxvY190eXBlKF9fYSkpCisgICAgICAgIHsgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9fZmFsc2VfdHlwZSgpKTsgfQorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX05vZGVfYWxsb2NfdHlwZShfX2EpKQorICAgICAgICB7IAorCSAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19pc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9yPjo6X190eXBlIF9JbnRlZ3JhbDsKKwkgIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisJfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIE5vIGV4cGxpY2l0IGR0b3IgbmVlZGVkIGFzIHRoZSBfQmFzZSBkdG9yIHRha2VzIGNhcmUgb2YKKyAgICAgICAqICB0aGluZ3MuICBUaGUgX0Jhc2UgZHRvciBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCBub3RlCisgICAgICAgKiAgdGhhdCBpZiB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvCisgICAgICAgKiAgbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcworICAgICAgICogIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTGlzdCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX194ICBBICVsaXN0IG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIEFsbCB0aGUgZWxlbWVudHMgb2YgQGEgX194IGFyZSBjb3BpZWQsIGJ1dCB1bmxpa2UgdGhlIGNvcHkKKyAgICAgICAqICBjb25zdHJ1Y3RvciwgdGhlIGFsbG9jYXRvciBvYmplY3QgaXMgbm90IGNvcGllZC4KKyAgICAgICAqLworICAgICAgbGlzdCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBsaXN0JiBfX3gpOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTGlzdCBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJWxpc3Qgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGNvbnRlbnRzIG9mIEBhIF9feCBhcmUgbW92ZWQgaW50byB0aGlzICVsaXN0ICh3aXRob3V0IGNvcHlpbmcpLgorICAgICAgICogIEBhIF9feCBpcyBhIHZhbGlkLCBidXQgdW5zcGVjaWZpZWQgJWxpc3QKKyAgICAgICAqLworICAgICAgbGlzdCYKKyAgICAgIG9wZXJhdG9yPShsaXN0JiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5zd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVMaXN0IGluaXRpYWxpemVyIGxpc3QgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiB2YWx1ZV90eXBlLgorICAgICAgICoKKyAgICAgICAqICBSZXBsYWNlIHRoZSBjb250ZW50cyBvZiB0aGUgJWxpc3Qgd2l0aCBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzCisgICAgICAgKiAgaW4gdGhlIGluaXRpYWxpemVyX2xpc3QgQGEgX19sLiAgVGhpcyBpcyBsaW5lYXIgaW4gbC5zaXplKCkuCisgICAgICAgKi8KKyAgICAgIGxpc3QmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+YXNzaWduKF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbnMgYSBnaXZlbiB2YWx1ZSB0byBhICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgX19uICBOdW1iZXIgb2YgZWxlbWVudHMgdG8gYmUgYXNzaWduZWQuCisgICAgICAgKiAgQHBhcmFtICBfX3ZhbCAgVmFsdWUgdG8gYmUgYXNzaWduZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSAlbGlzdCB3aXRoIEBhIF9fbiBjb3BpZXMgb2YgdGhlIGdpdmVuCisgICAgICAgKiAgdmFsdWUuICBOb3RlIHRoYXQgdGhlIGFzc2lnbm1lbnQgY29tcGxldGVseSBjaGFuZ2VzIHRoZSAlbGlzdAorICAgICAgICogIGFuZCB0aGF0IHRoZSByZXN1bHRpbmcgJWxpc3QncyBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIKKyAgICAgICAqICBvZiBlbGVtZW50cyBhc3NpZ25lZC4gIE9sZCBkYXRhIG1heSBiZSBsb3N0LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwpCisgICAgICB7IF9NX2ZpbGxfYXNzaWduKF9fbiwgX192YWwpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWducyBhIHJhbmdlIHRvIGEgJWxpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGEgJWxpc3Qgd2l0aCBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQorICAgICAgICogIHJhbmdlIFtAYSBfX2ZpcnN0LEBhIF9fbGFzdCkuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgYXNzaWdubWVudCBjb21wbGV0ZWx5IGNoYW5nZXMgdGhlICVsaXN0IGFuZAorICAgICAgICogIHRoYXQgdGhlIHJlc3VsdGluZyAlbGlzdCdzIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZgorICAgICAgICogIGVsZW1lbnRzIGFzc2lnbmVkLiAgT2xkIGRhdGEgbWF5IGJlIGxvc3QuCisgICAgICAgKi8KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyAgICAgICAgdm9pZAorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7IF9NX2Fzc2lnbl9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9fZmFsc2VfdHlwZSgpKTsgfQorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJICBfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisJfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbnMgYW4gaW5pdGlhbGl6ZXJfbGlzdCB0byBhICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgX19sICBBbiBpbml0aWFsaXplcl9saXN0IG9mIHZhbHVlX3R5cGUuCisgICAgICAgKgorICAgICAgICogIFJlcGxhY2UgdGhlIGNvbnRlbnRzIG9mIHRoZSAlbGlzdCB3aXRoIGNvcGllcyBvZiB0aGUgZWxlbWVudHMKKyAgICAgICAqICBpbiB0aGUgaW5pdGlhbGl6ZXJfbGlzdCBAYSBfX2wuICBUaGlzIGlzIGxpbmVhciBpbiBfX2wuc2l6ZSgpLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IHRoaXMtPmFzc2lnbihfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmCisKKyAgICAgIC8vLyBHZXQgYSBjb3B5IG9mIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBvYmplY3QuCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfQmFzZTo6Z2V0X2FsbG9jYXRvcigpOyB9CisKKyAgICAgIC8vIGl0ZXJhdG9ycworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlCisgICAgICAgKiAgJWxpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9ub2RlLl9NX25leHQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUKKyAgICAgICAqICBmaXJzdCBlbGVtZW50IGluIHRoZSAlbGlzdC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIG9yZGluYXJ5CisgICAgICAgKiAgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fbm9kZS5fTV9uZXh0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICVsaXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkgZWxlbWVudAorICAgICAgICogIG9yZGVyLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKCZ0aGlzLT5fTV9pbXBsLl9NX25vZGUpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdAorICAgICAgICogIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlICVsaXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZ0aGlzLT5fTV9pbXBsLl9NX25vZGUpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAlbGlzdC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIHJldmVyc2UgZWxlbWVudAorICAgICAgICogIG9yZGVyLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8KKyAgICAgICAqICB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSAlbGlzdC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIHJldmVyc2UKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byBvbmUKKyAgICAgICAqICBiZWZvcmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlICVsaXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4KKyAgICAgICAqICByZXZlcnNlIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byBvbmUKKyAgICAgICAqICBiZWZvcmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlICVsaXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gcmV2ZXJzZQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGZpcnN0IGVsZW1lbnQgaW4gdGhlICVsaXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fbm9kZS5fTV9uZXh0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QKKyAgICAgICAqICB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSAlbGlzdC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIG9yZGluYXJ5CisgICAgICAgKiAgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJnRoaXMtPl9NX2ltcGwuX01fbm9kZSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8KKyAgICAgICAqICB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSAlbGlzdC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIHJldmVyc2UKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIG9uZQorICAgICAgICogIGJlZm9yZSB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgJWxpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbiByZXZlcnNlCisgICAgICAgKiAgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorI2VuZGlmCisKKyAgICAgIC8vIFsyMy4yLjIuMl0gY2FwYWNpdHkKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgJWxpc3QgaXMgZW1wdHkuICAoVGh1cyBiZWdpbigpIHdvdWxkIGVxdWFsCisgICAgICAgKiAgZW5kKCkuKQorICAgICAgICovCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX25vZGUuX01fbmV4dCA9PSAmdGhpcy0+X01faW1wbC5fTV9ub2RlOyB9CisKKyAgICAgIC8qKiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSAlbGlzdC4gICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RkOjpkaXN0YW5jZShiZWdpbigpLCBlbmQoKSk7IH0KKworICAgICAgLyoqICBSZXR1cm5zIHRoZSBzaXplKCkgb2YgdGhlIGxhcmdlc3QgcG9zc2libGUgJWxpc3QuICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKS5tYXhfc2l6ZSgpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgUmVzaXplcyB0aGUgJWxpc3QgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtIF9fbmV3X3NpemUgTnVtYmVyIG9mIGVsZW1lbnRzIHRoZSAlbGlzdCBzaG91bGQgY29udGFpbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsICVyZXNpemUgdGhlICVsaXN0IHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyCisgICAgICAgKiAgb2YgZWxlbWVudHMuICBJZiB0aGUgbnVtYmVyIGlzIHNtYWxsZXIgdGhhbiB0aGUgJWxpc3QncworICAgICAgICogIGN1cnJlbnQgc2l6ZSB0aGUgJWxpc3QgaXMgdHJ1bmNhdGVkLCBvdGhlcndpc2UgZGVmYXVsdAorICAgICAgICogIGNvbnN0cnVjdGVkIGVsZW1lbnRzIGFyZSBhcHBlbmRlZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFJlc2l6ZXMgdGhlICVsaXN0IHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSBfX25ld19zaXplIE51bWJlciBvZiBlbGVtZW50cyB0aGUgJWxpc3Qgc2hvdWxkIGNvbnRhaW4uCisgICAgICAgKiAgQHBhcmFtIF9feCBEYXRhIHdpdGggd2hpY2ggbmV3IGVsZW1lbnRzIHNob3VsZCBiZSBwb3B1bGF0ZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCAlcmVzaXplIHRoZSAlbGlzdCB0byB0aGUgc3BlY2lmaWVkIG51bWJlcgorICAgICAgICogIG9mIGVsZW1lbnRzLiAgSWYgdGhlIG51bWJlciBpcyBzbWFsbGVyIHRoYW4gdGhlICVsaXN0J3MKKyAgICAgICAqICBjdXJyZW50IHNpemUgdGhlICVsaXN0IGlzIHRydW5jYXRlZCwgb3RoZXJ3aXNlIHRoZSAlbGlzdCBpcworICAgICAgICogIGV4dGVuZGVkIGFuZCBuZXcgZWxlbWVudHMgYXJlIHBvcHVsYXRlZCB3aXRoIGdpdmVuIGRhdGEuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKyNlbHNlCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgUmVzaXplcyB0aGUgJWxpc3QgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtIF9fbmV3X3NpemUgTnVtYmVyIG9mIGVsZW1lbnRzIHRoZSAlbGlzdCBzaG91bGQgY29udGFpbi4KKyAgICAgICAqICBAcGFyYW0gX194IERhdGEgd2l0aCB3aGljaCBuZXcgZWxlbWVudHMgc2hvdWxkIGJlIHBvcHVsYXRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsICVyZXNpemUgdGhlICVsaXN0IHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyCisgICAgICAgKiAgb2YgZWxlbWVudHMuICBJZiB0aGUgbnVtYmVyIGlzIHNtYWxsZXIgdGhhbiB0aGUgJWxpc3QncworICAgICAgICogIGN1cnJlbnQgc2l6ZSB0aGUgJWxpc3QgaXMgdHJ1bmNhdGVkLCBvdGhlcndpc2UgdGhlICVsaXN0IGlzCisgICAgICAgKiAgZXh0ZW5kZWQgYW5kIG5ldyBlbGVtZW50cyBhcmUgcG9wdWxhdGVkIHdpdGggZ2l2ZW4gZGF0YS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCB2YWx1ZV90eXBlIF9feCA9IHZhbHVlX3R5cGUoKSk7CisjZW5kaWYKKworICAgICAgLy8gZWxlbWVudCBhY2Nlc3MKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlbGlzdC4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBmcm9udCgpCisgICAgICB7IHJldHVybiAqYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICVsaXN0LgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGZyb250KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpiZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgbGFzdCBlbGVtZW50CisgICAgICAgKiAgb2YgdGhlICVsaXN0LgorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIGJhY2soKQorICAgICAgeyAKKwlpdGVyYXRvciBfX3RtcCA9IGVuZCgpOworCS0tX190bXA7CisJcmV0dXJuICpfX3RtcDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgbGFzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICVsaXN0LgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGJhY2soKSBjb25zdAorICAgICAgeyAKKwljb25zdF9pdGVyYXRvciBfX3RtcCA9IGVuZCgpOworCS0tX190bXA7CisJcmV0dXJuICpfX3RtcDsKKyAgICAgIH0KKworICAgICAgLy8gWzIzLjIuMi4zXSBtb2RpZmllcnMKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWRkIGRhdGEgdG8gdGhlIGZyb250IG9mIHRoZSAlbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRGF0YSB0byBiZSBhZGRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIHR5cGljYWwgc3RhY2sgb3BlcmF0aW9uLiAgVGhlIGZ1bmN0aW9uIGNyZWF0ZXMgYW4KKyAgICAgICAqICBlbGVtZW50IGF0IHRoZSBmcm9udCBvZiB0aGUgJWxpc3QgYW5kIGFzc2lnbnMgdGhlIGdpdmVuIGRhdGEKKyAgICAgICAqICB0byBpdC4gIER1ZSB0byB0aGUgbmF0dXJlIG9mIGEgJWxpc3QgdGhpcyBvcGVyYXRpb24gY2FuIGJlCisgICAgICAgKiAgZG9uZSBpbiBjb25zdGFudCB0aW1lLCBhbmQgZG9lcyBub3QgaW52YWxpZGF0ZSBpdGVyYXRvcnMgYW5kCisgICAgICAgKiAgcmVmZXJlbmNlcy4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcHVzaF9mcm9udChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IHRoaXMtPl9NX2luc2VydChiZWdpbigpLCBfX3gpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBwdXNoX2Zyb250KHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7IHRoaXMtPl9NX2luc2VydChiZWdpbigpLCBzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgZW1wbGFjZV9mcm9udChfQXJncyYmLi4uIF9fYXJncykKKyAgICAgICAgeyB0aGlzLT5fTV9pbnNlcnQoYmVnaW4oKSwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlcyBmaXJzdCBlbGVtZW50LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgdHlwaWNhbCBzdGFjayBvcGVyYXRpb24uICBJdCBzaHJpbmtzIHRoZSAlbGlzdCBieQorICAgICAgICogIG9uZS4gIER1ZSB0byB0aGUgbmF0dXJlIG9mIGEgJWxpc3QgdGhpcyBvcGVyYXRpb24gY2FuIGJlIGRvbmUKKyAgICAgICAqICBpbiBjb25zdGFudCB0aW1lLCBhbmQgb25seSBpbnZhbGlkYXRlcyBpdGVyYXRvcnMvcmVmZXJlbmNlcyB0bworICAgICAgICogIHRoZSBlbGVtZW50IGJlaW5nIHJlbW92ZWQuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCBubyBkYXRhIGlzIHJldHVybmVkLCBhbmQgaWYgdGhlIGZpcnN0IGVsZW1lbnQncyBkYXRhCisgICAgICAgKiAgaXMgbmVlZGVkLCBpdCBzaG91bGQgYmUgcmV0cmlldmVkIGJlZm9yZSBwb3BfZnJvbnQoKSBpcworICAgICAgICogIGNhbGxlZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcG9wX2Zyb250KCkKKyAgICAgIHsgdGhpcy0+X01fZXJhc2UoYmVnaW4oKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBZGQgZGF0YSB0byB0aGUgZW5kIG9mIHRoZSAlbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRGF0YSB0byBiZSBhZGRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIHR5cGljYWwgc3RhY2sgb3BlcmF0aW9uLiAgVGhlIGZ1bmN0aW9uIGNyZWF0ZXMgYW4KKyAgICAgICAqICBlbGVtZW50IGF0IHRoZSBlbmQgb2YgdGhlICVsaXN0IGFuZCBhc3NpZ25zIHRoZSBnaXZlbiBkYXRhIHRvCisgICAgICAgKiAgaXQuICBEdWUgdG8gdGhlIG5hdHVyZSBvZiBhICVsaXN0IHRoaXMgb3BlcmF0aW9uIGNhbiBiZSBkb25lCisgICAgICAgKiAgaW4gY29uc3RhbnQgdGltZSwgYW5kIGRvZXMgbm90IGludmFsaWRhdGUgaXRlcmF0b3JzIGFuZAorICAgICAgICogIHJlZmVyZW5jZXMuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfYmFjayhjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IHRoaXMtPl9NX2luc2VydChlbmQoKSwgX194KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7IHRoaXMtPl9NX2luc2VydChlbmQoKSwgc3RkOjptb3ZlKF9feCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGVtcGxhY2VfYmFjayhfQXJncyYmLi4uIF9fYXJncykKKyAgICAgICAgeyB0aGlzLT5fTV9pbnNlcnQoZW5kKCksIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZXMgbGFzdCBlbGVtZW50LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgdHlwaWNhbCBzdGFjayBvcGVyYXRpb24uICBJdCBzaHJpbmtzIHRoZSAlbGlzdCBieQorICAgICAgICogIG9uZS4gIER1ZSB0byB0aGUgbmF0dXJlIG9mIGEgJWxpc3QgdGhpcyBvcGVyYXRpb24gY2FuIGJlIGRvbmUKKyAgICAgICAqICBpbiBjb25zdGFudCB0aW1lLCBhbmQgb25seSBpbnZhbGlkYXRlcyBpdGVyYXRvcnMvcmVmZXJlbmNlcyB0bworICAgICAgICogIHRoZSBlbGVtZW50IGJlaW5nIHJlbW92ZWQuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCBubyBkYXRhIGlzIHJldHVybmVkLCBhbmQgaWYgdGhlIGxhc3QgZWxlbWVudCdzIGRhdGEKKyAgICAgICAqICBpcyBuZWVkZWQsIGl0IHNob3VsZCBiZSByZXRyaWV2ZWQgYmVmb3JlIHBvcF9iYWNrKCkgaXMgY2FsbGVkLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwb3BfYmFjaygpCisgICAgICB7IHRoaXMtPl9NX2VyYXNlKGl0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fbm9kZS5fTV9wcmV2KSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0cyBvYmplY3QgaW4gJWxpc3QgYmVmb3JlIHNwZWNpZmllZCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEEgY29uc3RfaXRlcmF0b3IgaW50byB0aGUgJWxpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2FyZ3MgIEFyZ3VtZW50cy4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhbiBvYmplY3Qgb2YgdHlwZSBUIGNvbnN0cnVjdGVkCisgICAgICAgKiAgd2l0aCBUKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLikgYmVmb3JlIHRoZSBzcGVjaWZpZWQKKyAgICAgICAqICBsb2NhdGlvbi4gIER1ZSB0byB0aGUgbmF0dXJlIG9mIGEgJWxpc3QgdGhpcyBvcGVyYXRpb24gY2FuCisgICAgICAgKiAgYmUgZG9uZSBpbiBjb25zdGFudCB0aW1lLCBhbmQgZG9lcyBub3QgaW52YWxpZGF0ZSBpdGVyYXRvcnMKKyAgICAgICAqICBhbmQgcmVmZXJlbmNlcy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGVtcGxhY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0FyZ3MmJi4uLiBfX2FyZ3MpOworI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyBnaXZlbiB2YWx1ZSBpbnRvICVsaXN0IGJlZm9yZSBzcGVjaWZpZWQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBBbiBpdGVyYXRvciBpbnRvIHRoZSAlbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRGF0YSB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhIGNvcHkgb2YgdGhlIGdpdmVuIHZhbHVlIGJlZm9yZQorICAgICAgICogIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uICBEdWUgdG8gdGhlIG5hdHVyZSBvZiBhICVsaXN0IHRoaXMKKyAgICAgICAqICBvcGVyYXRpb24gY2FuIGJlIGRvbmUgaW4gY29uc3RhbnQgdGltZSwgYW5kIGRvZXMgbm90CisgICAgICAgKiAgaW52YWxpZGF0ZSBpdGVyYXRvcnMgYW5kIHJlZmVyZW5jZXMuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyBnaXZlbiBydmFsdWUgaW50byAlbGlzdCBiZWZvcmUgc3BlY2lmaWVkIGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgaW50byB0aGUgJWxpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIERhdGEgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIGRhdGEuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgYSBjb3B5IG9mIHRoZSBnaXZlbiBydmFsdWUgYmVmb3JlCisgICAgICAgKiAgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4gIER1ZSB0byB0aGUgbmF0dXJlIG9mIGEgJWxpc3QgdGhpcworICAgICAgICogIG9wZXJhdGlvbiBjYW4gYmUgZG9uZSBpbiBjb25zdGFudCB0aW1lLCBhbmQgZG9lcyBub3QKKyAgICAgICAqICBpbnZhbGlkYXRlIGl0ZXJhdG9ycyBhbmQgcmVmZXJlbmNlcy4KKyAgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgdmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgcmV0dXJuIGVtcGxhY2UoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyB0aGUgY29udGVudHMgb2YgYW4gaW5pdGlhbGl6ZXJfbGlzdCBpbnRvICVsaXN0CisgICAgICAgKiAgICAgICAgICBiZWZvcmUgc3BlY2lmaWVkIGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19wICBBbiBpdGVyYXRvciBpbnRvIHRoZSAlbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiB2YWx1ZV90eXBlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGNvcGllcyBvZiB0aGUgZGF0YSBpbiB0aGUKKyAgICAgICAqICBpbml0aWFsaXplcl9saXN0IEBhIGwgaW50byB0aGUgJWxpc3QgYmVmb3JlIHRoZSBsb2NhdGlvbgorICAgICAgICogIHNwZWNpZmllZCBieSBAYSBwLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9wZXJhdGlvbiBpcyBsaW5lYXIgaW4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbnNlcnRlZCBhbmQKKyAgICAgICAqICBkb2VzIG5vdCBpbnZhbGlkYXRlIGl0ZXJhdG9ycyBhbmQgcmVmZXJlbmNlcy4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IHRoaXMtPmluc2VydChfX3AsIF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGEgbnVtYmVyIG9mIGNvcGllcyBvZiBnaXZlbiBkYXRhIGludG8gdGhlICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgaW50byB0aGUgJWxpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBlbGVtZW50cyB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRGF0YSB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhIHNwZWNpZmllZCBudW1iZXIgb2YgY29waWVzIG9mIHRoZQorICAgICAgICogIGdpdmVuIGRhdGEgYmVmb3JlIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgQGEgcG9zaXRpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgb3BlcmF0aW9uIGlzIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluc2VydGVkIGFuZAorICAgICAgICogIGRvZXMgbm90IGludmFsaWRhdGUgaXRlcmF0b3JzIGFuZCByZWZlcmVuY2VzLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeworCWxpc3QgX190bXAoX19uLCBfX3gsIGdldF9hbGxvY2F0b3IoKSk7CisJc3BsaWNlKF9fcG9zaXRpb24sIF9fdG1wKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGEgcmFuZ2UgaW50byB0aGUgJWxpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBBbiBpdGVyYXRvciBpbnRvIHRoZSAlbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgY29waWVzIG9mIHRoZSBkYXRhIGluIHRoZSByYW5nZSBbQGEKKyAgICAgICAqICBmaXJzdCxAYSBsYXN0KSBpbnRvIHRoZSAlbGlzdCBiZWZvcmUgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieQorICAgICAgICogIEBhIHBvc2l0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9wZXJhdGlvbiBpcyBsaW5lYXIgaW4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbnNlcnRlZCBhbmQKKyAgICAgICAqICBkb2VzIG5vdCBpbnZhbGlkYXRlIGl0ZXJhdG9ycyBhbmQgcmVmZXJlbmNlcy4KKyAgICAgICAqLworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsCisJICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgbGlzdCBfX3RtcChfX2ZpcnN0LCBfX2xhc3QsIGdldF9hbGxvY2F0b3IoKSk7CisJICBzcGxpY2UoX19wb3NpdGlvbiwgX190bXApOworCX0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmUgZWxlbWVudCBhdCBnaXZlbiBwb3NpdGlvbi4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEl0ZXJhdG9yIHBvaW50aW5nIHRvIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBuZXh0IGVsZW1lbnQgKG9yIGVuZCgpKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGVyYXNlIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBhbmQgdGh1cworICAgICAgICogIHNob3J0ZW4gdGhlICVsaXN0IGJ5IG9uZS4KKyAgICAgICAqCisgICAgICAgKiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgYSAlbGlzdCB0aGlzIG9wZXJhdGlvbiBjYW4gYmUgZG9uZSBpbgorICAgICAgICogIGNvbnN0YW50IHRpbWUsIGFuZCBvbmx5IGludmFsaWRhdGVzIGl0ZXJhdG9ycy9yZWZlcmVuY2VzIHRvCisgICAgICAgKiAgdGhlIGVsZW1lbnQgYmVpbmcgcmVtb3ZlZC4gIFRoZSB1c2VyIGlzIGFsc28gY2F1dGlvbmVkIHRoYXQKKyAgICAgICAqICB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LCBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudAorICAgICAgICogIGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbgorICAgICAgICogIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbik7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIGEgcmFuZ2Ugb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudCB0byBiZSBlcmFzZWQuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIG9uZSBwYXN0IHRoZSBsYXN0IGVsZW1lbnQgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZWxlbWVudCBwb2ludGVkIHRvIGJ5IEBhIGxhc3QKKyAgICAgICAqICAgICAgICAgICBwcmlvciB0byBlcmFzaW5nIChvciBlbmQoKSkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBlcmFzZSB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIEBhCisgICAgICAgKiAgW2ZpcnN0LGxhc3QpIGFuZCBzaG9ydGVuIHRoZSAlbGlzdCBhY2NvcmRpbmdseS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRpb24gaXMgbGluZWFyIHRpbWUgaW4gdGhlIHNpemUgb2YgdGhlIHJhbmdlIGFuZCBvbmx5CisgICAgICAgKiAgaW52YWxpZGF0ZXMgaXRlcmF0b3JzL3JlZmVyZW5jZXMgdG8gdGhlIGVsZW1lbnQgYmVpbmcgcmVtb3ZlZC4KKyAgICAgICAqICBUaGUgdXNlciBpcyBhbHNvIGNhdXRpb25lZCB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlCisgICAgICAgKiAgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywgdGhlCisgICAgICAgKiAgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyCisgICAgICAgKiAgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwl3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJICBfX2ZpcnN0ID0gZXJhc2UoX19maXJzdCk7CisJcmV0dXJuIF9fbGFzdDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTd2FwcyBkYXRhIHdpdGggYW5vdGhlciAlbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSAlbGlzdCBvZiB0aGUgc2FtZSBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZXhjaGFuZ2VzIHRoZSBlbGVtZW50cyBiZXR3ZWVuIHR3byBsaXN0cyBpbiBjb25zdGFudAorICAgICAgICogIHRpbWUuICBOb3RlIHRoYXQgdGhlIGdsb2JhbCBzdGQ6OnN3YXAoKSBmdW5jdGlvbiBpcworICAgICAgICogIHNwZWNpYWxpemVkIHN1Y2ggdGhhdCBzdGQ6OnN3YXAobDEsbDIpIHdpbGwgZmVlZCB0byB0aGlzCisgICAgICAgKiAgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAobGlzdCYgX194KQorICAgICAgeworCV9fZGV0YWlsOjpfTGlzdF9ub2RlX2Jhc2U6OnN3YXAodGhpcy0+X01faW1wbC5fTV9ub2RlLCAKKwkJCQkJX194Ll9NX2ltcGwuX01fbm9kZSk7CisKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gNDMxLiBTd2FwcGluZyBjb250YWluZXJzIHdpdGggdW5lcXVhbCBhbGxvY2F0b3JzLgorCXN0ZDo6X19hbGxvY19zd2FwPHR5cGVuYW1lIF9CYXNlOjpfTm9kZV9hbGxvY190eXBlPjo6CisJICBfU19kb19pdChfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSwgX194Ll9NX2dldF9Ob2RlX2FsbG9jYXRvcigpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgRXJhc2VzIGFsbCB0aGUgZWxlbWVudHMuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcworICAgICAgICogIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlCisgICAgICAgKiAgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LgorICAgICAgICogIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKyAgICAgICAgX0Jhc2U6Ol9NX2NsZWFyKCk7CisgICAgICAgIF9CYXNlOjpfTV9pbml0KCk7CisgICAgICB9CisKKyAgICAgIC8vIFsyMy4yLjIuNF0gbGlzdCBvcGVyYXRpb25zCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCBjb250ZW50cyBvZiBhbm90aGVyICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGVsZW1lbnQgdG8gaW5zZXJ0IGJlZm9yZS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgU291cmNlIGxpc3QuCisgICAgICAgKgorICAgICAgICogIFRoZSBlbGVtZW50cyBvZiBAYSBfX3ggYXJlIGluc2VydGVkIGluIGNvbnN0YW50IHRpbWUgaW4gZnJvbnQgb2YKKyAgICAgICAqICB0aGUgZWxlbWVudCByZWZlcmVuY2VkIGJ5IEBhIF9fcG9zaXRpb24uICBAYSBfX3ggYmVjb21lcyBhbiBlbXB0eQorICAgICAgICogIGxpc3QuCisgICAgICAgKgorICAgICAgICogIFJlcXVpcmVzIHRoaXMgIT0gQGEgX194LgorICAgICAgICovCisgICAgICB2b2lkCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmJiBfX3gpCisjZWxzZQorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCkKKyNlbmRpZgorICAgICAgeworCWlmICghX194LmVtcHR5KCkpCisJICB7CisJICAgIF9NX2NoZWNrX2VxdWFsX2FsbG9jYXRvcnMoX194KTsKKworCSAgICB0aGlzLT5fTV90cmFuc2ZlcihfX3Bvc2l0aW9uLCBfX3guYmVnaW4oKSwgX194LmVuZCgpKTsKKwkgIH0KKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiBfX3gpCisgICAgICB7IHNwbGljZShfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194KSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCBlbGVtZW50IGZyb20gYW5vdGhlciAlbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBlbGVtZW50IHRvIGluc2VydCBiZWZvcmUuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIFNvdXJjZSBsaXN0LgorICAgICAgICogIEBwYXJhbSAgX19pICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZWxlbWVudCB0byBtb3ZlLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBlbGVtZW50IGluIGxpc3QgQGEgX194IHJlZmVyZW5jZWQgYnkgQGEgX19pIGFuZAorICAgICAgICogIGluc2VydHMgaXQgaW50byB0aGUgY3VycmVudCBsaXN0IGJlZm9yZSBAYSBfX3Bvc2l0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmJiBfX3gsIGl0ZXJhdG9yIF9faSkKKyNlbHNlCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYgX194LCBpdGVyYXRvciBfX2kpCisjZW5kaWYKKyAgICAgIHsKKwlpdGVyYXRvciBfX2ogPSBfX2k7CisJKytfX2o7CisJaWYgKF9fcG9zaXRpb24gPT0gX19pIHx8IF9fcG9zaXRpb24gPT0gX19qKQorCSAgcmV0dXJuOworCisJaWYgKHRoaXMgIT0gJl9feCkKKwkgIF9NX2NoZWNrX2VxdWFsX2FsbG9jYXRvcnMoX194KTsKKworCXRoaXMtPl9NX3RyYW5zZmVyKF9fcG9zaXRpb24sIF9faSwgX19qKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiBfX3gsIGl0ZXJhdG9yIF9faSkKKyAgICAgIHsgc3BsaWNlKF9fcG9zaXRpb24sIHN0ZDo6bW92ZShfX3gpLCBfX2kpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgcmFuZ2UgZnJvbSBhbm90aGVyICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGVsZW1lbnQgdG8gaW5zZXJ0IGJlZm9yZS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgU291cmNlIGxpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgc3RhcnQgb2YgcmFuZ2UgaW4geC4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGVuZCBvZiByYW5nZSBpbiB4LgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIGVsZW1lbnRzIGluIHRoZSByYW5nZSBbX19maXJzdCxfX2xhc3QpIGFuZCBpbnNlcnRzIHRoZW0KKyAgICAgICAqICBiZWZvcmUgQGEgX19wb3NpdGlvbiBpbiBjb25zdGFudCB0aW1lLgorICAgICAgICoKKyAgICAgICAqICBVbmRlZmluZWQgaWYgQGEgX19wb3NpdGlvbiBpcyBpbiBbX19maXJzdCxfX2xhc3QpLgorICAgICAgICovCisgICAgICB2b2lkCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmJiBfX3gsIGl0ZXJhdG9yIF9fZmlyc3QsCisJICAgICBpdGVyYXRvciBfX2xhc3QpCisjZWxzZQorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCwgaXRlcmF0b3IgX19maXJzdCwKKwkgICAgIGl0ZXJhdG9yIF9fbGFzdCkKKyNlbmRpZgorICAgICAgeworCWlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwkgIHsKKwkgICAgaWYgKHRoaXMgIT0gJl9feCkKKwkgICAgICBfTV9jaGVja19lcXVhbF9hbGxvY2F0b3JzKF9feCk7CisKKwkgICAgdGhpcy0+X01fdHJhbnNmZXIoX19wb3NpdGlvbiwgX19maXJzdCwgX19sYXN0KTsKKwkgIH0KKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiBfX3gsIGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgc3BsaWNlKF9fcG9zaXRpb24sIHN0ZDo6bW92ZShfX3gpLCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmUgYWxsIGVsZW1lbnRzIGVxdWFsIHRvIHZhbHVlLgorICAgICAgICogIEBwYXJhbSAgX192YWx1ZSAgVGhlIHZhbHVlIHRvIHJlbW92ZS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyBldmVyeSBlbGVtZW50IGluIHRoZSBsaXN0IGVxdWFsIHRvIEBhIHZhbHVlLgorICAgICAgICogIFJlbWFpbmluZyBlbGVtZW50cyBzdGF5IGluIGxpc3Qgb3JkZXIuICBOb3RlIHRoYXQgdGhpcworICAgICAgICogIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzCisgICAgICAgKiAgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QKKyAgICAgICAqICB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzCisgICAgICAgKiAgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlbW92ZShjb25zdCBfVHAmIF9fdmFsdWUpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBhbGwgZWxlbWVudHMgc2F0aXNmeWluZyBhIHByZWRpY2F0ZS4KKyAgICAgICAqICBAdHBhcmFtICBfUHJlZGljYXRlICBVbmFyeSBwcmVkaWNhdGUgZnVuY3Rpb24gb3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIGxpc3QgZm9yIHdoaWNoIHRoZSBwcmVkaWNhdGUKKyAgICAgICAqICByZXR1cm5zIHRydWUuICBSZW1haW5pbmcgZWxlbWVudHMgc3RheSBpbiBsaXN0IG9yZGVyLiAgTm90ZQorICAgICAgICogIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZQorICAgICAgICogIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMKKyAgICAgICAqICBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncworICAgICAgICogIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgICAgICB2b2lkCisgICAgICAgIHJlbW92ZV9pZihfUHJlZGljYXRlKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmUgY29uc2VjdXRpdmUgZHVwbGljYXRlIGVsZW1lbnRzLgorICAgICAgICoKKyAgICAgICAqICBGb3IgZWFjaCBjb25zZWN1dGl2ZSBzZXQgb2YgZWxlbWVudHMgd2l0aCB0aGUgc2FtZSB2YWx1ZSwKKyAgICAgICAqICByZW1vdmUgYWxsIGJ1dCB0aGUgZmlyc3Qgb25lLiAgUmVtYWluaW5nIGVsZW1lbnRzIHN0YXkgaW4KKyAgICAgICAqICBsaXN0IG9yZGVyLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlCisgICAgICAgKiAgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywKKyAgICAgICAqICB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nCisgICAgICAgKiAgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgdW5pcXVlKCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIGNvbnNlY3V0aXZlIGVsZW1lbnRzIHNhdGlzZnlpbmcgYSBwcmVkaWNhdGUuCisgICAgICAgKiAgQHRwYXJhbSBfQmluYXJ5UHJlZGljYXRlICBCaW5hcnkgcHJlZGljYXRlIGZ1bmN0aW9uIG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIGVhY2ggY29uc2VjdXRpdmUgc2V0IG9mIGVsZW1lbnRzIFtmaXJzdCxsYXN0KSB0aGF0CisgICAgICAgKiAgc2F0aXNmeSBwcmVkaWNhdGUoZmlyc3QsaSkgd2hlcmUgaSBpcyBhbiBpdGVyYXRvciBpbgorICAgICAgICogIFtmaXJzdCxsYXN0KSwgcmVtb3ZlIGFsbCBidXQgdGhlIGZpcnN0IG9uZS4gIFJlbWFpbmluZworICAgICAgICogIGVsZW1lbnRzIHN0YXkgaW4gbGlzdCBvcmRlci4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkKKyAgICAgICAqICBlcmFzZXMgdGhlIGVsZW1lbnRzLCBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUKKyAgICAgICAqICBwb2ludGVycywgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuCisgICAgICAgKiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICAgICAgdm9pZAorICAgICAgICB1bmlxdWUoX0JpbmFyeVByZWRpY2F0ZSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTWVyZ2Ugc29ydGVkIGxpc3RzLgorICAgICAgICogIEBwYXJhbSAgX194ICBTb3J0ZWQgbGlzdCB0byBtZXJnZS4KKyAgICAgICAqCisgICAgICAgKiAgQXNzdW1lcyB0aGF0IGJvdGggQGEgX194IGFuZCB0aGlzIGxpc3QgYXJlIHNvcnRlZCBhY2NvcmRpbmcgdG8KKyAgICAgICAqICBvcGVyYXRvcjwoKS4gIE1lcmdlcyBlbGVtZW50cyBvZiBAYSBfX3ggaW50byB0aGlzIGxpc3QgaW4KKyAgICAgICAqICBzb3J0ZWQgb3JkZXIsIGxlYXZpbmcgQGEgX194IGVtcHR5IHdoZW4gY29tcGxldGUuICBFbGVtZW50cyBpbgorICAgICAgICogIHRoaXMgbGlzdCBwcmVjZWRlIGVsZW1lbnRzIGluIEBhIF9feCB0aGF0IGFyZSBlcXVhbC4KKyAgICAgICAqLworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIG1lcmdlKGxpc3QmJiBfX3gpOworCisgICAgICB2b2lkCisgICAgICBtZXJnZShsaXN0JiBfX3gpCisgICAgICB7IG1lcmdlKHN0ZDo6bW92ZShfX3gpKTsgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIG1lcmdlKGxpc3QmIF9feCk7CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNZXJnZSBzb3J0ZWQgbGlzdHMgYWNjb3JkaW5nIHRvIGNvbXBhcmlzb24gZnVuY3Rpb24uCisgICAgICAgKiAgQHRwYXJhbSBfU3RyaWN0V2Vha09yZGVyaW5nIENvbXBhcmlzb24gZnVuY3Rpb24gZGVmaW5pbmcKKyAgICAgICAqICBzb3J0IG9yZGVyLgorICAgICAgICogIEBwYXJhbSAgX194ICBTb3J0ZWQgbGlzdCB0byBtZXJnZS4KKyAgICAgICAqICBAcGFyYW0gIF9fY29tcCAgQ29tcGFyaXNvbiBmdW5jdG9yLgorICAgICAgICoKKyAgICAgICAqICBBc3N1bWVzIHRoYXQgYm90aCBAYSBfX3ggYW5kIHRoaXMgbGlzdCBhcmUgc29ydGVkIGFjY29yZGluZyB0bworICAgICAgICogIFN0cmljdFdlYWtPcmRlcmluZy4gIE1lcmdlcyBlbGVtZW50cyBvZiBAYSBfX3ggaW50byB0aGlzIGxpc3QKKyAgICAgICAqICBpbiBzb3J0ZWQgb3JkZXIsIGxlYXZpbmcgQGEgX194IGVtcHR5IHdoZW4gY29tcGxldGUuICBFbGVtZW50cworICAgICAgICogIGluIHRoaXMgbGlzdCBwcmVjZWRlIGVsZW1lbnRzIGluIEBhIF9feCB0aGF0IGFyZSBlcXVpdmFsZW50CisgICAgICAgKiAgYWNjb3JkaW5nIHRvIFN0cmljdFdlYWtPcmRlcmluZygpLgorICAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgICAgICAgdm9pZAorICAgICAgICBtZXJnZShsaXN0JiYgX194LCBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgICAgICAgIHZvaWQKKyAgICAgICAgbWVyZ2UobGlzdCYgX194LCBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyAgICAgICAgeyBtZXJnZShzdGQ6Om1vdmUoX194KSwgX19jb21wKTsgfQorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgICAgICAgIHZvaWQKKyAgICAgICAgbWVyZ2UobGlzdCYgX194LCBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCk7CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXZlcnNlIHRoZSBlbGVtZW50cyBpbiBsaXN0LgorICAgICAgICoKKyAgICAgICAqICBSZXZlcnNlIHRoZSBvcmRlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCBpbiBsaW5lYXIgdGltZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmV2ZXJzZSgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHRoaXMtPl9NX2ltcGwuX01fbm9kZS5fTV9yZXZlcnNlKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTb3J0IHRoZSBlbGVtZW50cy4KKyAgICAgICAqCisgICAgICAgKiAgU29ydHMgdGhlIGVsZW1lbnRzIG9mIHRoaXMgbGlzdCBpbiBObG9nTiB0aW1lLiAgRXF1aXZhbGVudAorICAgICAgICogIGVsZW1lbnRzIHJlbWFpbiBpbiBsaXN0IG9yZGVyLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzb3J0KCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU29ydCB0aGUgZWxlbWVudHMgYWNjb3JkaW5nIHRvIGNvbXBhcmlzb24gZnVuY3Rpb24uCisgICAgICAgKgorICAgICAgICogIFNvcnRzIHRoZSBlbGVtZW50cyBvZiB0aGlzIGxpc3QgaW4gTmxvZ04gdGltZS4gIEVxdWl2YWxlbnQKKyAgICAgICAqICBlbGVtZW50cyByZW1haW4gaW4gbGlzdCBvcmRlci4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgICAgICAgdm9pZAorICAgICAgICBzb3J0KF9TdHJpY3RXZWFrT3JkZXJpbmcpOworCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8gSW50ZXJuYWwgY29uc3RydWN0b3IgZnVuY3Rpb25zIGZvbGxvdy4KKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSByYW5nZSBjb25zdHJ1Y3RvciB0byBpbXBsZW1lbnQgWzIzLjEuMV0vOQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzguIEFtYmlndWl0eSBpbiB0aGUgImRvIHRoZSByaWdodCB0aGluZyIgY2xhdXNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZWdlcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LCBfX3RydWVfdHlwZSkKKyAgICAgICAgeyBfTV9maWxsX2luaXRpYWxpemUoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX24pLCBfX3gpOyB9CisKKyAgICAgIC8vIENhbGxlZCBieSB0aGUgcmFuZ2UgY29uc3RydWN0b3IgdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkJICAgICAgIF9fZmFsc2VfdHlwZSkKKyAgICAgICAgeworCSAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCSAgICBlbXBsYWNlX2JhY2soKl9fZmlyc3QpOworI2Vsc2UKKwkgICAgcHVzaF9iYWNrKCpfX2ZpcnN0KTsKKyNlbmRpZgorCX0KKworICAgICAgLy8gQ2FsbGVkIGJ5IGxpc3Qobix2LGEpLCBhbmQgdGhlIHJhbmdlIGNvbnN0cnVjdG9yIHdoZW4gaXQgdHVybnMgb3V0CisgICAgICAvLyB0byBiZSB0aGUgc2FtZSB0aGluZy4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2ZpbGxfaW5pdGlhbGl6ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7CisJZm9yICg7IF9fbjsgLS1fX24pCisJICBwdXNoX2JhY2soX194KTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8vIENhbGxlZCBieSBsaXN0KG4pLgorICAgICAgdm9pZAorICAgICAgX01fZGVmYXVsdF9pbml0aWFsaXplKHNpemVfdHlwZSBfX24pCisgICAgICB7CisJZm9yICg7IF9fbjsgLS1fX24pCisJICBlbXBsYWNlX2JhY2soKTsKKyAgICAgIH0KKworICAgICAgLy8gQ2FsbGVkIGJ5IHJlc2l6ZShzeikuCisgICAgICB2b2lkCisgICAgICBfTV9kZWZhdWx0X2FwcGVuZChzaXplX3R5cGUgX19uKTsKKyNlbmRpZgorCisgICAgICAvLyBJbnRlcm5hbCBhc3NpZ24gZnVuY3Rpb25zIGZvbGxvdy4KKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSByYW5nZSBhc3NpZ24gdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDM4LiBBbWJpZ3VpdHkgaW4gdGhlICJkbyB0aGUgcmlnaHQgdGhpbmciIGNsYXVzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVnZXI+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsIF9fdHJ1ZV90eXBlKQorICAgICAgICB7IF9NX2ZpbGxfYXNzaWduKF9fbiwgX192YWwpOyB9CisKKyAgICAgIC8vIENhbGxlZCBieSB0aGUgcmFuZ2UgYXNzaWduIHRvIGltcGxlbWVudCBbMjMuMS4xXS85CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkJICAgX19mYWxzZV90eXBlKTsKKworICAgICAgLy8gQ2FsbGVkIGJ5IGFzc2lnbihuLHQpLCBhbmQgdGhlIHJhbmdlIGFzc2lnbiB3aGVuIGl0IHR1cm5zIG91dAorICAgICAgLy8gdG8gYmUgdGhlIHNhbWUgdGhpbmcuCisgICAgICB2b2lkCisgICAgICBfTV9maWxsX2Fzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCk7CisKKworICAgICAgLy8gTW92ZXMgdGhlIGVsZW1lbnRzIGZyb20gW2ZpcnN0LGxhc3QpIGJlZm9yZSBwb3NpdGlvbi4KKyAgICAgIHZvaWQKKyAgICAgIF9NX3RyYW5zZmVyKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgX19wb3NpdGlvbi5fTV9ub2RlLT5fTV90cmFuc2ZlcihfX2ZpcnN0Ll9NX25vZGUsIF9fbGFzdC5fTV9ub2RlKTsgfQorCisgICAgICAvLyBJbnNlcnRzIG5ldyBlbGVtZW50IGF0IHBvc2l0aW9uIGdpdmVuIGFuZCB3aXRoIHZhbHVlIGdpdmVuLgorI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgX01faW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKyAgICAgICAgX05vZGUqIF9fdG1wID0gX01fY3JlYXRlX25vZGUoX194KTsKKyAgICAgICAgX190bXAtPl9NX2hvb2soX19wb3NpdGlvbi5fTV9ub2RlKTsKKyAgICAgIH0KKyNlbHNlCisgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgIHZvaWQKKyAgICAgICBfTV9pbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICAgeworCSBfTm9kZSogX190bXAgPSBfTV9jcmVhdGVfbm9kZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSBfX3RtcC0+X01faG9vayhfX3Bvc2l0aW9uLl9NX25vZGUpOworICAgICAgIH0KKyNlbmRpZgorCisgICAgICAvLyBFcmFzZXMgZWxlbWVudCBhdCBwb3NpdGlvbiBnaXZlbi4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2VyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisgICAgICAgIF9fcG9zaXRpb24uX01fbm9kZS0+X01fdW5ob29rKCk7CisgICAgICAgIF9Ob2RlKiBfX24gPSBzdGF0aWNfY2FzdDxfTm9kZSo+KF9fcG9zaXRpb24uX01fbm9kZSk7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgICBfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKS5kZXN0cm95KF9fbik7CisjZWxzZQorCV9NX2dldF9UcF9hbGxvY2F0b3IoKS5kZXN0cm95KHN0ZDo6X19hZGRyZXNzb2YoX19uLT5fTV9kYXRhKSk7CisjZW5kaWYKKyAgICAgICAgX01fcHV0X25vZGUoX19uKTsKKyAgICAgIH0KKworICAgICAgLy8gVG8gaW1wbGVtZW50IHRoZSBzcGxpY2UgKGFuZCBtZXJnZSkgYml0cyBvZiBOMTU5OS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2NoZWNrX2VxdWFsX2FsbG9jYXRvcnMobGlzdCYgX194KQorICAgICAgeworCWlmIChzdGQ6Ol9fYWxsb2NfbmVxPHR5cGVuYW1lIF9CYXNlOjpfTm9kZV9hbGxvY190eXBlPjo6CisJICAgIF9TX2RvX2l0KF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpLCBfX3guX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkpKQorCSAgX190aHJvd19ydW50aW1lX2Vycm9yKF9fTigibGlzdDo6X01fY2hlY2tfZXF1YWxfYWxsb2NhdG9ycyIpKTsKKyAgICAgIH0KKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBMaXN0IGVxdWFsaXR5IGNvbXBhcmlzb24uCisgICAqICBAcGFyYW0gIF9feCAgQSAlbGlzdC4KKyAgICogIEBwYXJhbSAgX195ICBBICVsaXN0IG9mIHRoZSBzYW1lIHR5cGUgYXMgQGEgX194LgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZmYgdGhlIHNpemUgYW5kIGVsZW1lbnRzIG9mIHRoZSBsaXN0cyBhcmUgZXF1YWwuCisgICAqCisgICAqICBUaGlzIGlzIGFuIGVxdWl2YWxlbmNlIHJlbGF0aW9uLiAgSXQgaXMgbGluZWFyIGluIHRoZSBzaXplIG9mCisgICAqICB0aGUgbGlzdHMuICBMaXN0cyBhcmUgY29uc2lkZXJlZCBlcXVpdmFsZW50IGlmIHRoZWlyIHNpemVzIGFyZQorICAgKiAgZXF1YWwsIGFuZCBpZiBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGNvbXBhcmUgZXF1YWwuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX194LCBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbGlzdDxfVHAsIF9BbGxvYz46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICAgICAgY29uc3RfaXRlcmF0b3IgX19lbmQxID0gX194LmVuZCgpOworICAgICAgY29uc3RfaXRlcmF0b3IgX19lbmQyID0gX195LmVuZCgpOworCisgICAgICBjb25zdF9pdGVyYXRvciBfX2kxID0gX194LmJlZ2luKCk7CisgICAgICBjb25zdF9pdGVyYXRvciBfX2kyID0gX195LmJlZ2luKCk7CisgICAgICB3aGlsZSAoX19pMSAhPSBfX2VuZDEgJiYgX19pMiAhPSBfX2VuZDIgJiYgKl9faTEgPT0gKl9faTIpCisJeworCSAgKytfX2kxOworCSAgKytfX2kyOworCX0KKyAgICAgIHJldHVybiBfX2kxID09IF9fZW5kMSAmJiBfX2kyID09IF9fZW5kMjsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIExpc3Qgb3JkZXJpbmcgcmVsYXRpb24uCisgICAqICBAcGFyYW0gIF9feCAgQSAlbGlzdC4KKyAgICogIEBwYXJhbSAgX195ICBBICVsaXN0IG9mIHRoZSBzYW1lIHR5cGUgYXMgQGEgX194LgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZmYgQGEgX194IGlzIGxleGljb2dyYXBoaWNhbGx5IGxlc3MgdGhhbiBAYSBfX3kuCisgICAqCisgICAqICBUaGlzIGlzIGEgdG90YWwgb3JkZXJpbmcgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlCisgICAqICBsaXN0cy4gIFRoZSBlbGVtZW50cyBtdXN0IGJlIGNvbXBhcmFibGUgd2l0aCBAYyA8LgorICAgKgorICAgKiAgU2VlIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoKSBmb3IgaG93IHRoZSBkZXRlcm1pbmF0aW9uIGlzIG1hZGUuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3gsIGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZShfX3guYmVnaW4oKSwgX194LmVuZCgpLAorCQkJCQkgIF9feS5iZWdpbigpLCBfX3kuZW5kKCkpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPT0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3gsIGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9feCwgY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX194LCBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3gsIGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyAgLy8vIFNlZSBzdGQ6Omxpc3Q6OnN3YXAoKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3gsIGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8qIF9TVExfTElTVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX21hcC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDVlNGI5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9tYXAuaApAQCAtMCwwICsxLDEwMjEgQEAKKy8vIE1hcCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfbWFwLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXttYXB9CisgKi8KKworI2lmbmRlZiBfU1RMX01BUF9ICisjZGVmaW5lIF9TVExfTUFQX0ggMQorCisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPgorI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPHR1cGxlPgorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUgorCisgIC8qKgorICAgKiAgQGJyaWVmIEEgc3RhbmRhcmQgY29udGFpbmVyIG1hZGUgdXAgb2YgKGtleSx2YWx1ZSkgcGFpcnMsIHdoaWNoIGNhbiBiZQorICAgKiAgcmV0cmlldmVkIGJhc2VkIG9uIGEga2V5LCBpbiBsb2dhcml0aG1pYyB0aW1lLgorICAgKgorICAgKiAgQGluZ3JvdXAgYXNzb2NpYXRpdmVfY29udGFpbmVycworICAgKgorICAgKiAgQHRwYXJhbSBfS2V5ICBUeXBlIG9mIGtleSBvYmplY3RzLgorICAgKiAgQHRwYXJhbSAgX1RwICBUeXBlIG9mIG1hcHBlZCBvYmplY3RzLgorICAgKiAgQHRwYXJhbSBfQ29tcGFyZSAgQ29tcGFyaXNvbiBmdW5jdGlvbiBvYmplY3QgdHlwZSwgZGVmYXVsdHMgdG8gbGVzczxfS2V5Pi4KKyAgICogIEB0cGFyYW0gX0FsbG9jICBBbGxvY2F0b3IgdHlwZSwgZGVmYXVsdHMgdG8gCisgICAqICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yPHBhaXI8Y29uc3QgX0tleSwgX1RwPi4KKyAgICoKKyAgICogIE1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgYSA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPiwgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjYiPnJldmVyc2libGUgY29udGFpbmVyPC9hPiwgYW5kIGFuCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2OSI+YXNzb2NpYXRpdmUgY29udGFpbmVyPC9hPiAodXNpbmcgdW5pcXVlIGtleXMpLgorICAgKiAgRm9yIGEgQGMgbWFwPEtleSxUPiB0aGUga2V5X3R5cGUgaXMgS2V5LCB0aGUgbWFwcGVkX3R5cGUgaXMgVCwgYW5kIHRoZQorICAgKiAgdmFsdWVfdHlwZSBpcyBzdGQ6OnBhaXI8Y29uc3QgS2V5LFQ+LgorICAgKgorICAgKiAgTWFwcyBzdXBwb3J0IGJpZGlyZWN0aW9uYWwgaXRlcmF0b3JzLgorICAgKgorICAgKiAgVGhlIHByaXZhdGUgdHJlZSBkYXRhIGlzIGRlY2xhcmVkIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGZvciBtYXAgYW5kCisgICAqICBtdWx0aW1hcDsgdGhlIGRpc3RpbmN0aW9uIGlzIG1hZGUgZW50aXJlbHkgaW4gaG93IHRoZSB0cmVlIGZ1bmN0aW9ucyBhcmUKKyAgICogIGNhbGxlZCAoKl91bmlxdWUgdmVyc3VzICpfZXF1YWwsIHNhbWUgYXMgdGhlIHN0YW5kYXJkKS4KKyAgKi8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleT4sCisgICAgICAgICAgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+ID4KKyAgICBjbGFzcyBtYXAKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9Db21wYXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfY29tcGFyZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dmFsdWVfdHlwZSAgICAgICAgICAgICAgICAgICBfQWxsb2NfdmFsdWVfdHlwZTsKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfVHAsIF9TR0lBc3NpZ25hYmxlQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczQoX0NvbXBhcmUsIGJvb2wsIF9LZXksIF9LZXksCisJCQkJX0JpbmFyeUZ1bmN0aW9uQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczIodmFsdWVfdHlwZSwgX0FsbG9jX3ZhbHVlX3R5cGUsIF9TYW1lVHlwZUNvbmNlcHQpCisKKyAgICBwdWJsaWM6CisgICAgICBjbGFzcyB2YWx1ZV9jb21wYXJlCisgICAgICA6IHB1YmxpYyBzdGQ6OmJpbmFyeV9mdW5jdGlvbjx2YWx1ZV90eXBlLCB2YWx1ZV90eXBlLCBib29sPgorICAgICAgeworCWZyaWVuZCBjbGFzcyBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPjsKKyAgICAgIHByb3RlY3RlZDoKKwlfQ29tcGFyZSBjb21wOworCisJdmFsdWVfY29tcGFyZShfQ29tcGFyZSBfX2MpCisJOiBjb21wKF9fYykgeyB9CisKKyAgICAgIHB1YmxpYzoKKwlib29sIG9wZXJhdG9yKCkoY29uc3QgdmFsdWVfdHlwZSYgX194LCBjb25zdCB2YWx1ZV90eXBlJiBfX3kpIGNvbnN0CisJeyByZXR1cm4gY29tcChfX3guZmlyc3QsIF9feS5maXJzdCk7IH0KKyAgICAgIH07CisKKyAgICBwcml2YXRlOgorICAgICAgLy8vIFRoaXMgdHVybnMgYSByZWQtYmxhY2sgdHJlZSBpbnRvIGEgW211bHRpXW1hcC4gCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPHZhbHVlX3R5cGU+OjpvdGhlciAKKyAgICAgICAgX1BhaXJfYWxsb2NfdHlwZTsKKworICAgICAgdHlwZWRlZiBfUmJfdHJlZTxrZXlfdHlwZSwgdmFsdWVfdHlwZSwgX1NlbGVjdDFzdDx2YWx1ZV90eXBlPiwKKwkJICAgICAgIGtleV9jb21wYXJlLCBfUGFpcl9hbGxvY190eXBlPiBfUmVwX3R5cGU7CisKKyAgICAgIC8vLyBUaGUgYWN0dWFsIHRyZWUgc3RydWN0dXJlLgorICAgICAgX1JlcF90eXBlIF9NX3Q7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBtYW55IG9mIHRoZXNlIGFyZSBzcGVjaWZpZWQgZGlmZmVyZW50bHkgaW4gSVNPLCBidXQgdGhlIGZvbGxvd2luZyBhcmUKKyAgICAgIC8vICJmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCIKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1BhaXJfYWxsb2NfdHlwZTo6cG9pbnRlciAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9QYWlyX2FsbG9jX3R5cGU6OmNvbnN0X3BvaW50ZXIgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUGFpcl9hbGxvY190eXBlOjpyZWZlcmVuY2UgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUGFpcl9hbGxvY190eXBlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6Oml0ZXJhdG9yICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpzaXplX3R5cGUgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpyZXZlcnNlX2l0ZXJhdG9yICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICAvLyBbMjMuMy4xLjFdIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3kKKyAgICAgIC8vIChnZXRfYWxsb2NhdG9yKCkgaXMgbm9ybWFsbHkgbGlzdGVkIGluIHRoaXMgc2VjdGlvbiwgYnV0IHNlZW1zIHRvIGhhdmUKKyAgICAgIC8vIGJlZW4gYWNjaWRlbnRhbGx5IG9taXR0ZWQgaW4gdGhlIHByaW50ZWQgc3RhbmRhcmQpCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IgY3JlYXRlcyBubyBlbGVtZW50cy4KKyAgICAgICAqLworICAgICAgbWFwKCkKKyAgICAgIDogX01fdCgpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENyZWF0ZXMgYSAlbWFwIHdpdGggbm8gZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX2NvbXAgIEEgY29tcGFyaXNvbiBvYmplY3QuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBtYXAoY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKwkgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV90KF9fY29tcCwgX1BhaXJfYWxsb2NfdHlwZShfX2EpKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTWFwIGNvcHkgY29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJW1hcCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY3JlYXRlZCAlbWFwIHVzZXMgYSBjb3B5IG9mIHRoZSBhbGxvY2F0aW9uIG9iamVjdAorICAgICAgICogIHVzZWQgYnkgQGEgX194LgorICAgICAgICovCisgICAgICBtYXAoY29uc3QgbWFwJiBfX3gpCisgICAgICA6IF9NX3QoX194Ll9NX3QpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTWFwIG1vdmUgY29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJW1hcCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY3JlYXRlZCAlbWFwIGNvbnRhaW5zIHRoZSBleGFjdCBjb250ZW50cyBvZiBAYSBfX3guCisgICAgICAgKiAgVGhlIGNvbnRlbnRzIG9mIEBhIF9feCBhcmUgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkICVtYXAuCisgICAgICAgKi8KKyAgICAgIG1hcChtYXAmJiBfX3gpCisgICAgICBub2V4Y2VwdChpc19ub3Rocm93X2NvcHlfY29uc3RydWN0aWJsZTxfQ29tcGFyZT46OnZhbHVlKQorICAgICAgOiBfTV90KHN0ZDo6bW92ZShfX3guX01fdCkpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICVtYXAgZnJvbSBhbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICogIEBwYXJhbSAgX19sICBBbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICogIEBwYXJhbSAgX19jb21wICBBIGNvbXBhcmlzb24gb2JqZWN0LgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAlbWFwIGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUKKyAgICAgICAqICBpbml0aWFsaXplcl9saXN0IEBhIF9fbC4KKyAgICAgICAqICBUaGlzIGlzIGxpbmVhciBpbiBOIGlmIHRoZSByYW5nZSBpcyBhbHJlYWR5IHNvcnRlZCwgYW5kIE5sb2dOCisgICAgICAgKiAgb3RoZXJ3aXNlICh3aGVyZSBOIGlzIEBhIF9fbC5zaXplKCkpLgorICAgICAgICovCisgICAgICBtYXAoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJICBjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV90KF9fY29tcCwgX1BhaXJfYWxsb2NfdHlwZShfX2EpKQorICAgICAgeyBfTV90Ll9NX2luc2VydF91bmlxdWUoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICVtYXAgZnJvbSBhIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAlbWFwIGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBmcm9tCisgICAgICAgKiAgW19fZmlyc3QsX19sYXN0KS4gIFRoaXMgaXMgbGluZWFyIGluIE4gaWYgdGhlIHJhbmdlIGlzCisgICAgICAgKiAgYWxyZWFkeSBzb3J0ZWQsIGFuZCBObG9nTiBvdGhlcndpc2UgKHdoZXJlIE4gaXMKKyAgICAgICAqICBkaXN0YW5jZShfX2ZpcnN0LF9fbGFzdCkpLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKwk6IF9NX3QoKQorICAgICAgICB7IF9NX3QuX01faW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGEgJW1hcCBmcm9tIGEgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2NvbXAgIEEgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAlbWFwIGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBmcm9tCisgICAgICAgKiAgW19fZmlyc3QsX19sYXN0KS4gIFRoaXMgaXMgbGluZWFyIGluIE4gaWYgdGhlIHJhbmdlIGlzCisgICAgICAgKiAgYWxyZWFkeSBzb3J0ZWQsIGFuZCBObG9nTiBvdGhlcndpc2UgKHdoZXJlIE4gaXMKKyAgICAgICAqICBkaXN0YW5jZShfX2ZpcnN0LF9fbGFzdCkpLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKwkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfTV90KF9fY29tcCwgX1BhaXJfYWxsb2NfdHlwZShfX2EpKQorICAgICAgICB7IF9NX3QuX01faW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgICAgIC8vIEZJWE1FIFRoZXJlIGlzIG5vIGR0b3IgZGVjbGFyZWQsIGJ1dCB3ZSBzaG91bGQgaGF2ZSBzb21ldGhpbmcKKyAgICAgIC8vIGdlbmVyYXRlZCBieSBEb3h5Z2VuLiAgSSBkb24ndCBrbm93IHdoYXQgdGFncyB0byBhZGQgdG8gdGhpcworICAgICAgLy8gcGFyYWdyYXBoIHRvIG1ha2UgdGhhdCBoYXBwZW46CisgICAgICAvKioKKyAgICAgICAqICBUaGUgZHRvciBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCBub3RlIHRoYXQgaWYgdGhlIGVsZW1lbnRzCisgICAgICAgKiAgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkKKyAgICAgICAqICB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJU1hcCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX194ICBBICVtYXAgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgQWxsIHRoZSBlbGVtZW50cyBvZiBAYSBfX3ggYXJlIGNvcGllZCwgYnV0IHVubGlrZSB0aGUgY29weQorICAgICAgICogIGNvbnN0cnVjdG9yLCB0aGUgYWxsb2NhdG9yIG9iamVjdCBpcyBub3QgY29waWVkLgorICAgICAgICovCisgICAgICBtYXAmCisgICAgICBvcGVyYXRvcj0oY29uc3QgbWFwJiBfX3gpCisgICAgICB7CisJX01fdCA9IF9feC5fTV90OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJU1hcCBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJW1hcCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgY29udGVudHMgb2YgQGEgX194IGFyZSBtb3ZlZCBpbnRvIHRoaXMgbWFwICh3aXRob3V0IGNvcHlpbmcpLgorICAgICAgICogIEBhIF9feCBpcyBhIHZhbGlkLCBidXQgdW5zcGVjaWZpZWQgJW1hcC4KKyAgICAgICAqLworICAgICAgbWFwJgorICAgICAgb3BlcmF0b3I9KG1hcCYmIF9feCkKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwkvLyBOQjogRFIgNjc1LgorCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+c3dhcChfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTWFwIGxpc3QgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhICVtYXAgd2l0aCBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQorICAgICAgICogIGluaXRpYWxpemVyIGxpc3QgQGEgX19sLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGFzc2lnbm1lbnQgY29tcGxldGVseSBjaGFuZ2VzIHRoZSAlbWFwIGFuZAorICAgICAgICogIHRoYXQgdGhlIHJlc3VsdGluZyAlbWFwJ3Mgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyCisgICAgICAgKiAgb2YgZWxlbWVudHMgYXNzaWduZWQuICBPbGQgZGF0YSBtYXkgYmUgbG9zdC4KKyAgICAgICAqLworICAgICAgbWFwJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+aW5zZXJ0KF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvLy8gR2V0IGEgY29weSBvZiB0aGUgbWVtb3J5IGFsbG9jYXRpb24gb2JqZWN0LgorICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gYWxsb2NhdG9yX3R5cGUoX01fdC5nZXRfYWxsb2NhdG9yKCkpOyB9CisKKyAgICAgIC8vIGl0ZXJhdG9ycworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0IHBhaXIgaW4gdGhlCisgICAgICAgKiAgJW1hcC4KKyAgICAgICAqICBJdGVyYXRpb24gaXMgZG9uZSBpbiBhc2NlbmRpbmcgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5iZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QgcGFpcgorICAgICAgICogIGluIHRoZSAlbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZyB0byB0aGUKKyAgICAgICAqICBrZXlzLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5iZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgcGFpciBpbiB0aGUgJW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlcgorICAgICAgICogIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LmVuZCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdAorICAgICAgICogIHBhaXIgaW4gdGhlICVtYXAuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBhc2NlbmRpbmcgb3JkZXIgYWNjb3JkaW5nIHRvCisgICAgICAgKiAgdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5lbmQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBsYXN0IHBhaXIgaW4KKyAgICAgICAqICB0aGUgJW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGRlc2NlbmRpbmcgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZQorICAgICAgICogIGtleXMuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGxhc3QgcGFpciBpbiB0aGUgJW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGRlc2NlbmRpbmcgb3JkZXIKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gb25lIGJlZm9yZSB0aGUKKyAgICAgICAqICBmaXJzdCBwYWlyIGluIHRoZSAlbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gZGVzY2VuZGluZyBvcmRlcgorICAgICAgICogIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LnJlbmQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byBvbmUKKyAgICAgICAqICBiZWZvcmUgdGhlIGZpcnN0IHBhaXIgaW4gdGhlICVtYXAuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBkZXNjZW5kaW5nCisgICAgICAgKiAgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3QucmVuZCgpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0IHBhaXIKKyAgICAgICAqICBpbiB0aGUgJW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgKiAga2V5cy4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgcGFpciBpbiB0aGUgJW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcgdG8KKyAgICAgICAqICB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fdC5lbmQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUKKyAgICAgICAqICBsYXN0IHBhaXIgaW4gdGhlICVtYXAuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBkZXNjZW5kaW5nIG9yZGVyCisgICAgICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX3QucmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gb25lCisgICAgICAgKiAgYmVmb3JlIHRoZSBmaXJzdCBwYWlyIGluIHRoZSAlbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gZGVzY2VuZGluZworICAgICAgICogIG9yZGVyIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KKyNlbmRpZgorCisgICAgICAvLyBjYXBhY2l0eQorICAgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgJW1hcCBpcyBlbXB0eS4gIChUaHVzIGJlZ2luKCkgd291bGQgZXF1YWwKKyAgICAgICAqICBlbmQoKS4pCisgICAgICAqLworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5lbXB0eSgpOyB9CisKKyAgICAgIC8qKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSAlbWFwLiAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LnNpemUoKTsgfQorCisgICAgICAvKiogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSAlbWFwLiAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5tYXhfc2l6ZSgpOyB9CisKKyAgICAgIC8vIFsyMy4zLjEuMl0gZWxlbWVudCBhY2Nlc3MKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3Vic2NyaXB0ICggQGMgW10gKSBhY2Nlc3MgdG8gJW1hcCBkYXRhLgorICAgICAgICogIEBwYXJhbSAgX19rICBUaGUga2V5IGZvciB3aGljaCBkYXRhIHNob3VsZCBiZSByZXRyaWV2ZWQuCisgICAgICAgKiAgQHJldHVybiAgQSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgb2YgdGhlIChrZXksZGF0YSkgJXBhaXIuCisgICAgICAgKgorICAgICAgICogIEFsbG93cyBmb3IgZWFzeSBsb29rdXAgd2l0aCB0aGUgc3Vic2NyaXB0ICggQGMgW10gKQorICAgICAgICogIG9wZXJhdG9yLiAgUmV0dXJucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IHNwZWNpZmllZCBpbgorICAgICAgICogIHN1YnNjcmlwdC4gIElmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QsIGEgcGFpciB3aXRoIHRoYXQga2V5CisgICAgICAgKiAgaXMgY3JlYXRlZCB1c2luZyBkZWZhdWx0IHZhbHVlcywgd2hpY2ggaXMgdGhlbiByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgTG9va3VwIHJlcXVpcmVzIGxvZ2FyaXRobWljIHRpbWUuCisgICAgICAgKi8KKyAgICAgIG1hcHBlZF90eXBlJgorICAgICAgb3BlcmF0b3JbXShjb25zdCBrZXlfdHlwZSYgX19rKQorICAgICAgeworCS8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9EZWZhdWx0Q29uc3RydWN0aWJsZUNvbmNlcHQ8bWFwcGVkX3R5cGU+KQorCisJaXRlcmF0b3IgX19pID0gbG93ZXJfYm91bmQoX19rKTsKKwkvLyBfX2ktPmZpcnN0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVpdmFsZW50IHRvIF9fay4KKwlpZiAoX19pID09IGVuZCgpIHx8IGtleV9jb21wKCkoX19rLCAoKl9faSkuZmlyc3QpKQorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKwkgIF9faSA9IF9NX3QuX01fZW1wbGFjZV9oaW50X3VuaXF1ZShfX2ksIHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwKKwkJCQkJICAgIHN0ZDo6dHVwbGU8Y29uc3Qga2V5X3R5cGUmPihfX2spLAorCQkJCQkgICAgc3RkOjp0dXBsZTw+KCkpOworI2Vsc2UKKyAgICAgICAgICBfX2kgPSBpbnNlcnQoX19pLCB2YWx1ZV90eXBlKF9faywgbWFwcGVkX3R5cGUoKSkpOworI2VuZGlmCisJcmV0dXJuICgqX19pKS5zZWNvbmQ7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBtYXBwZWRfdHlwZSYKKyAgICAgIG9wZXJhdG9yW10oa2V5X3R5cGUmJiBfX2spCisgICAgICB7CisJLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0RlZmF1bHRDb25zdHJ1Y3RpYmxlQ29uY2VwdDxtYXBwZWRfdHlwZT4pCisKKwlpdGVyYXRvciBfX2kgPSBsb3dlcl9ib3VuZChfX2spOworCS8vIF9faS0+Zmlyc3QgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWl2YWxlbnQgdG8gX19rLgorCWlmIChfX2kgPT0gZW5kKCkgfHwga2V5X2NvbXAoKShfX2ssICgqX19pKS5maXJzdCkpCisJICBfX2kgPSBfTV90Ll9NX2VtcGxhY2VfaGludF91bmlxdWUoX19pLCBzdGQ6OnBpZWNld2lzZV9jb25zdHJ1Y3QsCisJCQkJCXN0ZDo6Zm9yd2FyZF9hc190dXBsZShzdGQ6Om1vdmUoX19rKSksCisJCQkJCXN0ZDo6dHVwbGU8PigpKTsKKwlyZXR1cm4gKCpfX2kpLnNlY29uZDsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiA0NjQuIFN1Z2dlc3Rpb24gZm9yIG5ldyBtZW1iZXIgZnVuY3Rpb25zIGluIHN0YW5kYXJkIGNvbnRhaW5lcnMuCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFjY2VzcyB0byAlbWFwIGRhdGEuCisgICAgICAgKiAgQHBhcmFtICBfX2sgIFRoZSBrZXkgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHJpZXZlZC4KKyAgICAgICAqICBAcmV0dXJuICBBIHJlZmVyZW5jZSB0byB0aGUgZGF0YSB3aG9zZSBrZXkgaXMgZXF1aXZhbGVudCB0byBAYSBfX2ssIGlmCisgICAgICAgKiAgICAgICAgICAgc3VjaCBhIGRhdGEgaXMgcHJlc2VudCBpbiB0aGUgJW1hcC4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBubyBzdWNoIGRhdGEgaXMgcHJlc2VudC4KKyAgICAgICAqLworICAgICAgbWFwcGVkX3R5cGUmCisgICAgICBhdChjb25zdCBrZXlfdHlwZSYgX19rKQorICAgICAgeworCWl0ZXJhdG9yIF9faSA9IGxvd2VyX2JvdW5kKF9fayk7CisJaWYgKF9faSA9PSBlbmQoKSB8fCBrZXlfY29tcCgpKF9faywgKCpfX2kpLmZpcnN0KSkKKwkgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigibWFwOjphdCIpKTsKKwlyZXR1cm4gKCpfX2kpLnNlY29uZDsKKyAgICAgIH0KKworICAgICAgY29uc3QgbWFwcGVkX3R5cGUmCisgICAgICBhdChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgICAgeworCWNvbnN0X2l0ZXJhdG9yIF9faSA9IGxvd2VyX2JvdW5kKF9fayk7CisJaWYgKF9faSA9PSBlbmQoKSB8fCBrZXlfY29tcCgpKF9faywgKCpfX2kpLmZpcnN0KSkKKwkgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigibWFwOjphdCIpKTsKKwlyZXR1cm4gKCpfX2kpLnNlY29uZDsKKyAgICAgIH0KKworICAgICAgLy8gbW9kaWZpZXJzCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGJ1aWxkIGFuZCBpbnNlcnQgYSBzdGQ6OnBhaXIgaW50byB0aGUgJW1hcC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fYXJncyAgQXJndW1lbnRzIHVzZWQgdG8gZ2VuZXJhdGUgYSBuZXcgcGFpciBpbnN0YW5jZSAoc2VlCisgICAgICAgKgkgICAgICAgIHN0ZDo6cGllY2V3aXNlX2NvbnRydWN0IGZvciBwYXNzaW5nIGFyZ3VtZW50cyB0byBlYWNoCisgICAgICAgKgkgICAgICAgIHBhcnQgb2YgdGhlIHBhaXIgY29uc3RydWN0b3IpLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBBIHBhaXIsIG9mIHdoaWNoIHRoZSBmaXJzdCBlbGVtZW50IGlzIGFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgICAgICAgICAgdG8gdGhlIHBvc3NpYmx5IGluc2VydGVkIHBhaXIsIGFuZCB0aGUgc2Vjb25kIGlzIGEgYm9vbCB0aGF0CisgICAgICAgKiAgICAgICAgICAgaXMgdHJ1ZSBpZiB0aGUgcGFpciB3YXMgYWN0dWFsbHkgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gYnVpbGQgYW5kIGluc2VydCBhIChrZXksIHZhbHVlKSAlcGFpciBpbnRvCisgICAgICAgKiAgdGhlICVtYXAuCisgICAgICAgKiAgQSAlbWFwIHJlbGllcyBvbiB1bmlxdWUga2V5cyBhbmQgdGh1cyBhICVwYWlyIGlzIG9ubHkgaW5zZXJ0ZWQgaWYgaXRzCisgICAgICAgKiAgZmlyc3QgZWxlbWVudCAodGhlIGtleSkgaXMgbm90IGFscmVhZHkgcHJlc2VudCBpbiB0aGUgJW1hcC4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGxvZ2FyaXRobWljIHRpbWUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKwllbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsgcmV0dXJuIF9NX3QuX01fZW1wbGFjZV91bmlxdWUoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gYnVpbGQgYW5kIGluc2VydCBhIHN0ZDo6cGFpciBpbnRvIHRoZSAlbWFwLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBBbiBpdGVyYXRvciB0aGF0IHNlcnZlcyBhcyBhIGhpbnQgYXMgdG8gd2hlcmUgdGhlIHBhaXIKKyAgICAgICAqICAgICAgICAgICAgICAgIHNob3VsZCBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIF9fYXJncyAgQXJndW1lbnRzIHVzZWQgdG8gZ2VuZXJhdGUgYSBuZXcgcGFpciBpbnN0YW5jZSAoc2VlCisgICAgICAgKgkgICAgICAgICBzdGQ6OnBpZWNld2lzZV9jb250cnVjdCBmb3IgcGFzc2luZyBhcmd1bWVudHMgdG8gZWFjaAorICAgICAgICoJICAgICAgICAgcGFydCBvZiB0aGUgcGFpciBjb25zdHJ1Y3RvcikuCisgICAgICAgKiAgQHJldHVybiBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZWxlbWVudCB3aXRoIGtleSBvZiB0aGUKKyAgICAgICAqICAgICAgICAgIHN0ZDo6cGFpciBidWlsdCBmcm9tIEBhIF9fYXJncyAobWF5IG9yIG1heSBub3QgYmUgdGhhdAorICAgICAgICogICAgICAgICAgc3RkOjpwYWlyKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBub3QgY29uY2VybmVkIGFib3V0IHdoZXRoZXIgdGhlIGluc2VydGlvbiB0b29rIHBsYWNlLAorICAgICAgICogIGFuZCB0aHVzIGRvZXMgbm90IHJldHVybiBhIGJvb2xlYW4gbGlrZSB0aGUgc2luZ2xlLWFyZ3VtZW50IGVtcGxhY2UoKQorICAgICAgICogIGRvZXMuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgb25seSBhIGhpbnQgYW5kIGNhbiBwb3RlbnRpYWxseQorICAgICAgICogIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBpbnNlcnRpb24gcHJvY2Vzcy4gQSBiYWQgaGludCB3b3VsZAorICAgICAgICogIGNhdXNlIG5vIGdhaW5zIGluIGVmZmljaWVuY3kuCisgICAgICAgKgorICAgICAgICogIFNlZQorICAgICAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MDdjaDE3Lmh0bWwKKyAgICAgICAqICBmb3IgbW9yZSBvbiBAYSBoaW50aW5nLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRpb24gcmVxdWlyZXMgbG9nYXJpdGhtaWMgdGltZSAoaWYgdGhlIGhpbnQgaXMgbm90IHRha2VuKS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlX2hpbnQoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIHJldHVybiBfTV90Ll9NX2VtcGxhY2VfaGludF91bmlxdWUoX19wb3MsCisJCQkJCSAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwl9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGluc2VydCBhIHN0ZDo6cGFpciBpbnRvIHRoZSAlbWFwLgorCisgICAgICAgKiAgQHBhcmFtIF9feCBQYWlyIHRvIGJlIGluc2VydGVkIChzZWUgc3RkOjptYWtlX3BhaXIgZm9yIGVhc3kKKyAgICAgICAqCSAgICAgY3JlYXRpb24gb2YgcGFpcnMpLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBBIHBhaXIsIG9mIHdoaWNoIHRoZSBmaXJzdCBlbGVtZW50IGlzIGFuIGl0ZXJhdG9yIHRoYXQgCisgICAgICAgKiAgICAgICAgICAgcG9pbnRzIHRvIHRoZSBwb3NzaWJseSBpbnNlcnRlZCBwYWlyLCBhbmQgdGhlIHNlY29uZCBpcyAKKyAgICAgICAqICAgICAgICAgICBhIGJvb2wgdGhhdCBpcyB0cnVlIGlmIHRoZSBwYWlyIHdhcyBhY3R1YWxseSBpbnNlcnRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBpbnNlcnQgYSAoa2V5LCB2YWx1ZSkgJXBhaXIgaW50byB0aGUgJW1hcC4KKyAgICAgICAqICBBICVtYXAgcmVsaWVzIG9uIHVuaXF1ZSBrZXlzIGFuZCB0aHVzIGEgJXBhaXIgaXMgb25seSBpbnNlcnRlZCBpZiBpdHMKKyAgICAgICAqICBmaXJzdCBlbGVtZW50ICh0aGUga2V5KSBpcyBub3QgYWxyZWFkeSBwcmVzZW50IGluIHRoZSAlbWFwLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRpb24gcmVxdWlyZXMgbG9nYXJpdGhtaWMgdGltZS4KKyAgICAgICAqLworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuX01faW5zZXJ0X3VuaXF1ZShfX3gpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8dmFsdWVfdHlwZSwKKwkJCQkJCSAgICBfUGFpciYmPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICAgIGluc2VydChfUGFpciYmIF9feCkKKyAgICAgICAgeyByZXR1cm4gX01fdC5fTV9pbnNlcnRfdW5pcXVlKHN0ZDo6Zm9yd2FyZDxfUGFpcj4oX194KSk7IH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGluc2VydCBhIGxpc3Qgb2Ygc3RkOjpwYWlycyBpbnRvIHRoZSAlbWFwLgorICAgICAgICogIEBwYXJhbSAgX19saXN0ICBBIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBvZiBwYWlycyB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgICBpbnNlcnRlZC4KKyAgICAgICAqCisgICAgICAgKiAgQ29tcGxleGl0eSBzaW1pbGFyIHRvIHRoYXQgb2YgdGhlIHJhbmdlIGNvbnN0cnVjdG9yLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbGlzdCkKKyAgICAgIHsgaW5zZXJ0KF9fbGlzdC5iZWdpbigpLCBfX2xpc3QuZW5kKCkpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGluc2VydCBhIHN0ZDo6cGFpciBpbnRvIHRoZSAlbWFwLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgdGhhdCBzZXJ2ZXMgYXMgYSBoaW50IGFzIHRvIHdoZXJlIHRoZQorICAgICAgICogICAgICAgICAgICAgICAgICAgIHBhaXIgc2hvdWxkIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgX194ICBQYWlyIHRvIGJlIGluc2VydGVkIChzZWUgc3RkOjptYWtlX3BhaXIgZm9yIGVhc3kgY3JlYXRpb24KKyAgICAgICAqICAgICAgICAgICAgICAgb2YgcGFpcnMpLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGVsZW1lbnQgd2l0aCBrZXkgb2YKKyAgICAgICAqICAgICAgICAgICBAYSBfX3ggKG1heSBvciBtYXkgbm90IGJlIHRoZSAlcGFpciBwYXNzZWQgaW4pLgorICAgICAgICoKKworICAgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgbm90IGNvbmNlcm5lZCBhYm91dCB3aGV0aGVyIHRoZSBpbnNlcnRpb24KKyAgICAgICAqICB0b29rIHBsYWNlLCBhbmQgdGh1cyBkb2VzIG5vdCByZXR1cm4gYSBib29sZWFuIGxpa2UgdGhlCisgICAgICAgKiAgc2luZ2xlLWFyZ3VtZW50IGluc2VydCgpIGRvZXMuICBOb3RlIHRoYXQgdGhlIGZpcnN0CisgICAgICAgKiAgcGFyYW1ldGVyIGlzIG9ubHkgYSBoaW50IGFuZCBjYW4gcG90ZW50aWFsbHkgaW1wcm92ZSB0aGUKKyAgICAgICAqICBwZXJmb3JtYW5jZSBvZiB0aGUgaW5zZXJ0aW9uIHByb2Nlc3MuICBBIGJhZCBoaW50IHdvdWxkCisgICAgICAgKiAgY2F1c2Ugbm8gZ2FpbnMgaW4gZWZmaWNpZW5jeS4KKyAgICAgICAqCisgICAgICAgKiAgU2VlCisgICAgICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQwN2NoMTcuaHRtbAorICAgICAgICogIGZvciBtb3JlIG9uIEBhIGhpbnRpbmcuCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBsb2dhcml0aG1pYyB0aW1lIChpZiB0aGUgaGludCBpcyBub3QgdGFrZW4pLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZWxzZQorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbmRpZgorICAgICAgeyByZXR1cm4gX01fdC5fTV9pbnNlcnRfdW5pcXVlXyhfX3Bvc2l0aW9uLCBfX3gpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8dmFsdWVfdHlwZSwKKwkJCQkJCSAgICBfUGFpciYmPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgX1BhaXImJiBfX3gpCisgICAgICAgIHsgcmV0dXJuIF9NX3QuX01faW5zZXJ0X3VuaXF1ZV8oX19wb3NpdGlvbiwKKwkJCQkJc3RkOjpmb3J3YXJkPF9QYWlyPihfX3gpKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUZW1wbGF0ZSBmdW5jdGlvbiB0aGF0IGF0dGVtcHRzIHRvIGluc2VydCBhIHJhbmdlIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlLgorICAgICAgICoKKyAgICAgICAqICBDb21wbGV4aXR5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgcmFuZ2UgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsgX01fdC5fTV9pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDEzMC4gQXNzb2NpYXRpdmUgZXJhc2Ugc2hvdWxkIHJldHVybiBhbiBpdGVyYXRvci4KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgYW4gZWxlbWVudCBmcm9tIGEgJW1hcC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IGltbWVkaWF0ZWx5IGZvbGxvd2luZworICAgICAgICogICAgICAgICAgQGEgcG9zaXRpb24gcHJpb3IgdG8gdGhlIGVsZW1lbnQgYmVpbmcgZXJhc2VkLiBJZiBubyBzdWNoIAorICAgICAgICogICAgICAgICAgZWxlbWVudCBleGlzdHMsIGVuZCgpIGlzIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhbiBlbGVtZW50LCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbgorICAgICAgICogIGl0ZXJhdG9yLCBmcm9tIGEgJW1hcC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzCisgICAgICAgKiAgdGhlIGVsZW1lbnQsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsCisgICAgICAgKiAgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZworICAgICAgICogIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyByZXR1cm4gX01fdC5lcmFzZShfX3Bvc2l0aW9uKTsgfQorCisgICAgICAvLyBMV0cgMjA1OQorICAgICAgX0dMSUJDWFhfQUJJX1RBR19DWFgxMQorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IHJldHVybiBfTV90LmVyYXNlKF9fcG9zaXRpb24pOyB9CisjZWxzZQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhbiBlbGVtZW50IGZyb20gYSAlbWFwLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhbiBlbGVtZW50LCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbgorICAgICAgICogIGl0ZXJhdG9yLCBmcm9tIGEgJW1hcC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzCisgICAgICAgKiAgdGhlIGVsZW1lbnQsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsCisgICAgICAgKiAgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZworICAgICAgICogIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IF9NX3QuZXJhc2UoX19wb3NpdGlvbik7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGVsZW1lbnRzIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgb2YgZWxlbWVudCB0byBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyBlcmFzZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGFsbCB0aGUgZWxlbWVudHMgbG9jYXRlZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KKyAgICAgICAqICBhICVtYXAuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGF0IGlmCisgICAgICAgKiAgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkCisgICAgICAgKiAgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXJhc2UoX194KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMTMwLiBBc3NvY2lhdGl2ZSBlcmFzZSBzaG91bGQgcmV0dXJuIGFuIGl0ZXJhdG9yLgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhIFtmaXJzdCxsYXN0KSByYW5nZSBvZiBlbGVtZW50cyBmcm9tIGEgJW1hcC4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgIGVyYXNlZC4KKyAgICAgICAqICBAcGFyYW0gX19sYXN0IEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvCisgICAgICAgKiAgICAgICAgICAgICAgICBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiBUaGUgaXRlcmF0b3IgQGEgX19sYXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhIHNlcXVlbmNlIG9mIGVsZW1lbnRzIGZyb20gYSAlbWFwLgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LCBhbmQgdGhhdCBpZgorICAgICAgICogIHRoZSBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZAorICAgICAgICogIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyByZXR1cm4gX01fdC5lcmFzZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZWxzZQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhIFtfX2ZpcnN0LF9fbGFzdCkgcmFuZ2Ugb2YgZWxlbWVudHMgZnJvbSBhICVtYXAuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgICBlcmFzZWQuCisgICAgICAgKiAgQHBhcmFtIF9fbGFzdCBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSByYW5nZSB0bworICAgICAgICogICAgICAgICAgICAgICAgYmUgZXJhc2VkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhIHNlcXVlbmNlIG9mIGVsZW1lbnRzIGZyb20gYSAlbWFwLgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LCBhbmQgdGhhdCBpZgorICAgICAgICogIHRoZSBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZAorICAgICAgICogIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7IF9NX3QuZXJhc2UoX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3dhcHMgZGF0YSB3aXRoIGFub3RoZXIgJW1hcC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSAlbWFwIG9mIHRoZSBzYW1lIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBleGNoYW5nZXMgdGhlIGVsZW1lbnRzIGJldHdlZW4gdHdvIG1hcHMgaW4gY29uc3RhbnQKKyAgICAgICAqICB0aW1lLiAgKEl0IGlzIG9ubHkgc3dhcHBpbmcgYSBwb2ludGVyLCBhbiBpbnRlZ2VyLCBhbmQgYW4KKyAgICAgICAqICBpbnN0YW5jZSBvZiB0aGUgQGMgQ29tcGFyZSB0eXBlICh3aGljaCBpdHNlbGYgaXMgb2Z0ZW4KKyAgICAgICAqICBzdGF0ZWxlc3MgYW5kIGVtcHR5KSwgc28gaXQgc2hvdWxkIGJlIHF1aXRlIGZhc3QuKSAgTm90ZQorICAgICAgICogIHRoYXQgdGhlIGdsb2JhbCBzdGQ6OnN3YXAoKSBmdW5jdGlvbiBpcyBzcGVjaWFsaXplZCBzdWNoCisgICAgICAgKiAgdGhhdCBzdGQ6OnN3YXAobTEsbTIpIHdpbGwgZmVlZCB0byB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzd2FwKG1hcCYgX194KQorICAgICAgeyBfTV90LnN3YXAoX194Ll9NX3QpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEVyYXNlcyBhbGwgZWxlbWVudHMgaW4gYSAlbWFwLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seQorICAgICAgICogIGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZQorICAgICAgICogIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4KKyAgICAgICAqICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9NX3QuY2xlYXIoKTsgfQorCisgICAgICAvLyBvYnNlcnZlcnMKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgdGhlIGtleSBjb21wYXJpc29uIG9iamVjdCBvdXQgb2Ygd2hpY2ggdGhlICVtYXAgd2FzCisgICAgICAgKiAgY29uc3RydWN0ZWQuCisgICAgICAgKi8KKyAgICAgIGtleV9jb21wYXJlCisgICAgICBrZXlfY29tcCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmtleV9jb21wKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHZhbHVlIGNvbXBhcmlzb24gb2JqZWN0LCBidWlsdCBmcm9tIHRoZSBrZXkgY29tcGFyaXNvbgorICAgICAgICogIG9iamVjdCBvdXQgb2Ygd2hpY2ggdGhlICVtYXAgd2FzIGNvbnN0cnVjdGVkLgorICAgICAgICovCisgICAgICB2YWx1ZV9jb21wYXJlCisgICAgICB2YWx1ZV9jb21wKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHZhbHVlX2NvbXBhcmUoX01fdC5rZXlfY29tcCgpKTsgfQorCisgICAgICAvLyBbMjMuMy4xLjNdIG1hcCBvcGVyYXRpb25zCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgVHJpZXMgdG8gbG9jYXRlIGFuIGVsZW1lbnQgaW4gYSAlbWFwLgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgb2YgKGtleSwgdmFsdWUpICVwYWlyIHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gc291Z2h0LWFmdGVyIGVsZW1lbnQsIG9yIGVuZCgpIGlmIG5vdAorICAgICAgICogICAgICAgICAgIGZvdW5kLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHRha2VzIGEga2V5IGFuZCB0cmllcyB0byBsb2NhdGUgdGhlIGVsZW1lbnQgd2l0aCB3aGljaAorICAgICAgICogIHRoZSBrZXkgbWF0Y2hlcy4gIElmIHN1Y2Nlc3NmdWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gaXRlcmF0b3IKKyAgICAgICAqICBwb2ludGluZyB0byB0aGUgc291Z2h0IGFmdGVyICVwYWlyLiAgSWYgdW5zdWNjZXNzZnVsIGl0IHJldHVybnMgdGhlCisgICAgICAgKiAgcGFzdC10aGUtZW5kICggQGMgZW5kKCkgKSBpdGVyYXRvci4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuZmluZChfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUcmllcyB0byBsb2NhdGUgYW4gZWxlbWVudCBpbiBhICVtYXAuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSBvZiAoa2V5LCB2YWx1ZSkgJXBhaXIgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciBwb2ludGluZyB0byBzb3VnaHQtYWZ0ZXIKKyAgICAgICAqICAgICAgICAgICBlbGVtZW50LCBvciBlbmQoKSBpZiBub3QgZm91bmQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBrZXkgYW5kIHRyaWVzIHRvIGxvY2F0ZSB0aGUgZWxlbWVudCB3aXRoIHdoaWNoCisgICAgICAgKiAgdGhlIGtleSBtYXRjaGVzLiAgSWYgc3VjY2Vzc2Z1bCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIGNvbnN0YW50CisgICAgICAgKiAgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHNvdWdodCBhZnRlciAlcGFpci4gSWYgdW5zdWNjZXNzZnVsIGl0CisgICAgICAgKiAgcmV0dXJucyB0aGUgcGFzdC10aGUtZW5kICggQGMgZW5kKCkgKSBpdGVyYXRvci4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZmluZChfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlycyB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIE51bWJlciBvZiBlbGVtZW50cyB3aXRoIHNwZWNpZmllZCBrZXkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gb25seSBtYWtlcyBzZW5zZSBmb3IgbXVsdGltYXBzOyBmb3IgbWFwIHRoZSByZXN1bHQgd2lsbAorICAgICAgICogIGVpdGhlciBiZSAwIChub3QgcHJlc2VudCkgb3IgMSAocHJlc2VudCkuCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZmluZChfX3gpID09IF9NX3QuZW5kKCkgPyAwIDogMTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgdGhlIGJlZ2lubmluZyBvZiBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlyIHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gZmlyc3QgZWxlbWVudCBlcXVhbCB0byBvciBncmVhdGVyCisgICAgICAgKiAgICAgICAgICAgdGhhbiBrZXksIG9yIGVuZCgpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBzdWJzZXF1ZW5jZSBvZiBlbGVtZW50cworICAgICAgICogIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4ga2V5LiAgSWYgdW5zdWNjZXNzZnVsIGl0IHJldHVybnMgYW4gaXRlcmF0b3IKKyAgICAgICAqICBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGhhcyBhIGdyZWF0ZXIgdmFsdWUgdGhhbiBnaXZlbiBrZXkKKyAgICAgICAqICBvciBlbmQoKSBpZiBubyBzdWNoIGVsZW1lbnQgZXhpc3RzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QubG93ZXJfYm91bmQoX194KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgdGhlIGJlZ2lubmluZyBvZiBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlyIHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgcG9pbnRpbmcgdG8gZmlyc3QgZWxlbWVudAorICAgICAgICogICAgICAgICAgIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiBrZXksIG9yIGVuZCgpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBzdWJzZXF1ZW5jZSBvZiBlbGVtZW50cworICAgICAgICogIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4ga2V5LiAgSWYgdW5zdWNjZXNzZnVsIGl0IHJldHVybnMgYW4gaXRlcmF0b3IKKyAgICAgICAqICBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGhhcyBhIGdyZWF0ZXIgdmFsdWUgdGhhbiBnaXZlbiBrZXkKKyAgICAgICAqICBvciBlbmQoKSBpZiBubyBzdWNoIGVsZW1lbnQgZXhpc3RzLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QubG93ZXJfYm91bmQoX194KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgdGhlIGVuZCBvZiBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlyIHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudAorICAgICAgICogICAgICAgICAgZ3JlYXRlciB0aGFuIGtleSwgb3IgZW5kKCkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC51cHBlcl9ib3VuZChfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyB0aGUgZW5kIG9mIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgb2YgKGtleSwgdmFsdWUpIHBhaXIgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciBwb2ludGluZyB0byBmaXJzdCBpdGVyYXRvcgorICAgICAgICogICAgICAgICAgIGdyZWF0ZXIgdGhhbiBrZXksIG9yIGVuZCgpLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QudXBwZXJfYm91bmQoX194KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgYSBzdWJzZXF1ZW5jZSBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSBvZiAoa2V5LCB2YWx1ZSkgcGFpcnMgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBQYWlyIG9mIGl0ZXJhdG9ycyB0aGF0IHBvc3NpYmx5IHBvaW50cyB0byB0aGUgc3Vic2VxdWVuY2UKKyAgICAgICAqICAgICAgICAgICBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0bworICAgICAgICogIEBjb2RlCisgICAgICAgKiAgICBzdGQ6Om1ha2VfcGFpcihjLmxvd2VyX2JvdW5kKHZhbCksCisgICAgICAgKiAgICAgICAgICAgICAgICAgICBjLnVwcGVyX2JvdW5kKHZhbCkpCisgICAgICAgKiAgQGVuZGNvZGUKKyAgICAgICAqICAoYnV0IGlzIGZhc3RlciB0aGFuIG1ha2luZyB0aGUgY2FsbHMgc2VwYXJhdGVseSkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcHJvYmFibHkgb25seSBtYWtlcyBzZW5zZSBmb3IgbXVsdGltYXBzLgorICAgICAgICovCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2UoX194KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgYSBzdWJzZXF1ZW5jZSBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSBvZiAoa2V5LCB2YWx1ZSkgcGFpcnMgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBQYWlyIG9mIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9ycyB0aGF0IHBvc3NpYmx5IHBvaW50cworICAgICAgICogICAgICAgICAgIHRvIHRoZSBzdWJzZXF1ZW5jZSBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0bworICAgICAgICogIEBjb2RlCisgICAgICAgKiAgICBzdGQ6Om1ha2VfcGFpcihjLmxvd2VyX2JvdW5kKHZhbCksCisgICAgICAgKiAgICAgICAgICAgICAgICAgICBjLnVwcGVyX2JvdW5kKHZhbCkpCisgICAgICAgKiAgQGVuZGNvZGUKKyAgICAgICAqICAoYnV0IGlzIGZhc3RlciB0aGFuIG1ha2luZyB0aGUgY2FsbHMgc2VwYXJhdGVseSkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcHJvYmFibHkgb25seSBtYWtlcyBzZW5zZSBmb3IgbXVsdGltYXBzLgorICAgICAgICovCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2UoX194KTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSzEsIHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX0MxLCB0eXBlbmFtZSBfQTE+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgbWFwPF9LMSwgX1QxLCBfQzEsIF9BMT4mLAorCQkgICBjb25zdCBtYXA8X0sxLCBfVDEsIF9DMSwgX0ExPiYpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSzEsIHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX0MxLCB0eXBlbmFtZSBfQTE+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPChjb25zdCBtYXA8X0sxLCBfVDEsIF9DMSwgX0ExPiYsCisJCSAgY29uc3QgbWFwPF9LMSwgX1QxLCBfQzEsIF9BMT4mKTsKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBNYXAgZXF1YWxpdHkgY29tcGFyaXNvbi4KKyAgICogIEBwYXJhbSAgX194ICBBICVtYXAuCisgICAqICBAcGFyYW0gIF9feSAgQSAlbWFwIG9mIHRoZSBzYW1lIHR5cGUgYXMgQGEgeC4KKyAgICogIEByZXR1cm4gIFRydWUgaWZmIHRoZSBzaXplIGFuZCBlbGVtZW50cyBvZiB0aGUgbWFwcyBhcmUgZXF1YWwuCisgICAqCisgICAqICBUaGlzIGlzIGFuIGVxdWl2YWxlbmNlIHJlbGF0aW9uLiAgSXQgaXMgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZQorICAgKiAgbWFwcy4gIE1hcHMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCBpZiB0aGVpciBzaXplcyBhcmUgZXF1YWwsCisgICAqICBhbmQgaWYgY29ycmVzcG9uZGluZyBlbGVtZW50cyBjb21wYXJlIGVxdWFsLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV90ID09IF9feS5fTV90OyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIE1hcCBvcmRlcmluZyByZWxhdGlvbi4KKyAgICogIEBwYXJhbSAgX194ICBBICVtYXAuCisgICAqICBAcGFyYW0gIF9feSAgQSAlbWFwIG9mIHRoZSBzYW1lIHR5cGUgYXMgQGEgeC4KKyAgICogIEByZXR1cm4gIFRydWUgaWZmIEBhIHggaXMgbGV4aWNvZ3JhcGhpY2FsbHkgbGVzcyB0aGFuIEBhIHkuCisgICAqCisgICAqICBUaGlzIGlzIGEgdG90YWwgb3JkZXJpbmcgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlCisgICAqICBtYXBzLiAgVGhlIGVsZW1lbnRzIG11c3QgYmUgY29tcGFyYWJsZSB3aXRoIEBjIDwuCisgICAqCisgICAqICBTZWUgc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgpIGZvciBob3cgdGhlIGRldGVybWluYXRpb24gaXMgbWFkZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgIGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX3QgPCBfX3kuX01fdDsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcj09CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgIGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgIGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworICAvLy8gU2VlIHN0ZDo6bWFwOjpzd2FwKCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAobWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLyogX1NUTF9NQVBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9tdWx0aW1hcC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9tdWx0aW1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOWVhNTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX211bHRpbWFwLmgKQEAgLTAsMCArMSw5MjMgQEAKKy8vIE11bHRpbWFwIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9tdWx0aW1hcC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bWFwfQorICovCisKKyNpZm5kZWYgX1NUTF9NVUxUSU1BUF9ICisjZGVmaW5lIF9TVExfTVVMVElNQVBfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2NvbmNlcHRfY2hlY2suaD4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKKworICAvKioKKyAgICogIEBicmllZiBBIHN0YW5kYXJkIGNvbnRhaW5lciBtYWRlIHVwIG9mIChrZXksdmFsdWUpIHBhaXJzLCB3aGljaCBjYW4gYmUKKyAgICogIHJldHJpZXZlZCBiYXNlZCBvbiBhIGtleSwgaW4gbG9nYXJpdGhtaWMgdGltZS4KKyAgICoKKyAgICogIEBpbmdyb3VwIGFzc29jaWF0aXZlX2NvbnRhaW5lcnMKKyAgICoKKyAgICogIEB0cGFyYW0gX0tleSAgVHlwZSBvZiBrZXkgb2JqZWN0cy4KKyAgICogIEB0cGFyYW0gIF9UcCAgVHlwZSBvZiBtYXBwZWQgb2JqZWN0cy4KKyAgICogIEB0cGFyYW0gX0NvbXBhcmUgIENvbXBhcmlzb24gZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzIHRvIGxlc3M8X0tleT4uCisgICAqICBAdHBhcmFtIF9BbGxvYyAgQWxsb2NhdG9yIHR5cGUsIGRlZmF1bHRzIHRvIAorICAgKiAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcjxwYWlyPGNvbnN0IF9LZXksIF9UcD4uCisgICAqCisgICAqICBNZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sIGEKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY2Ij5yZXZlcnNpYmxlIGNvbnRhaW5lcjwvYT4sIGFuZCBhbgorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjkiPmFzc29jaWF0aXZlIGNvbnRhaW5lcjwvYT4gKHVzaW5nIGVxdWl2YWxlbnQKKyAgICogIGtleXMpLiAgRm9yIGEgQGMgbXVsdGltYXA8S2V5LFQ+IHRoZSBrZXlfdHlwZSBpcyBLZXksIHRoZSBtYXBwZWRfdHlwZQorICAgKiAgaXMgVCwgYW5kIHRoZSB2YWx1ZV90eXBlIGlzIHN0ZDo6cGFpcjxjb25zdCBLZXksVD4uCisgICAqCisgICAqICBNdWx0aW1hcHMgc3VwcG9ydCBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9ycy4KKyAgICoKKyAgICogIFRoZSBwcml2YXRlIHRyZWUgZGF0YSBpcyBkZWNsYXJlZCBleGFjdGx5IHRoZSBzYW1lIHdheSBmb3IgbWFwIGFuZAorICAgKiAgbXVsdGltYXA7IHRoZSBkaXN0aW5jdGlvbiBpcyBtYWRlIGVudGlyZWx5IGluIGhvdyB0aGUgdHJlZSBmdW5jdGlvbnMgYXJlCisgICAqICBjYWxsZWQgKCpfdW5pcXVlIHZlcnN1cyAqX2VxdWFsLCBzYW1lIGFzIHRoZSBzdGFuZGFyZCkuCisgICovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgIHR5cGVuYW1lIF9Db21wYXJlID0gc3RkOjpsZXNzPF9LZXk+LAorCSAgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+ID4KKyAgICBjbGFzcyBtdWx0aW1hcAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9LZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0NvbXBhcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9jb21wYXJlOworICAgICAgdHlwZWRlZiBfQWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICBwcml2YXRlOgorICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp2YWx1ZV90eXBlICAgICAgICAgICAgICAgICAgIF9BbGxvY192YWx1ZV90eXBlOworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9UcCwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzNChfQ29tcGFyZSwgYm9vbCwgX0tleSwgX0tleSwKKwkJCQlfQmluYXJ5RnVuY3Rpb25Db25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMih2YWx1ZV90eXBlLCBfQWxsb2NfdmFsdWVfdHlwZSwgX1NhbWVUeXBlQ29uY2VwdCkKKworICAgIHB1YmxpYzoKKyAgICAgIGNsYXNzIHZhbHVlX2NvbXBhcmUKKyAgICAgIDogcHVibGljIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPHZhbHVlX3R5cGUsIHZhbHVlX3R5cGUsIGJvb2w+CisgICAgICB7CisJZnJpZW5kIGNsYXNzIG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz47CisgICAgICBwcm90ZWN0ZWQ6CisJX0NvbXBhcmUgY29tcDsKKworCXZhbHVlX2NvbXBhcmUoX0NvbXBhcmUgX19jKQorCTogY29tcChfX2MpIHsgfQorCisgICAgICBwdWJsaWM6CisJYm9vbCBvcGVyYXRvcigpKGNvbnN0IHZhbHVlX3R5cGUmIF9feCwgY29uc3QgdmFsdWVfdHlwZSYgX195KSBjb25zdAorCXsgcmV0dXJuIGNvbXAoX194LmZpcnN0LCBfX3kuZmlyc3QpOyB9CisgICAgICB9OworCisgICAgcHJpdmF0ZToKKyAgICAgIC8vLyBUaGlzIHR1cm5zIGEgcmVkLWJsYWNrIHRyZWUgaW50byBhIFttdWx0aV1tYXAuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPHZhbHVlX3R5cGU+OjpvdGhlciAKKyAgICAgICAgX1BhaXJfYWxsb2NfdHlwZTsKKworICAgICAgdHlwZWRlZiBfUmJfdHJlZTxrZXlfdHlwZSwgdmFsdWVfdHlwZSwgX1NlbGVjdDFzdDx2YWx1ZV90eXBlPiwKKwkJICAgICAgIGtleV9jb21wYXJlLCBfUGFpcl9hbGxvY190eXBlPiBfUmVwX3R5cGU7CisgICAgICAvLy8gVGhlIGFjdHVhbCB0cmVlIHN0cnVjdHVyZS4KKyAgICAgIF9SZXBfdHlwZSBfTV90OworCisgICAgcHVibGljOgorICAgICAgLy8gbWFueSBvZiB0aGVzZSBhcmUgc3BlY2lmaWVkIGRpZmZlcmVudGx5IGluIElTTywgYnV0IHRoZSBmb2xsb3dpbmcgYXJlCisgICAgICAvLyAiZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQiCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9QYWlyX2FsbG9jX3R5cGU6OnBvaW50ZXIgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUGFpcl9hbGxvY190eXBlOjpjb25zdF9wb2ludGVyICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1BhaXJfYWxsb2NfdHlwZTo6cmVmZXJlbmNlICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1BhaXJfYWxsb2NfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjppdGVyYXRvciAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X2l0ZXJhdG9yICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6c2l6ZV90eXBlICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6cmV2ZXJzZV9pdGVyYXRvciAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgLy8gWzIzLjMuMl0gY29uc3RydWN0L2NvcHkvZGVzdHJveQorICAgICAgLy8gKGdldF9hbGxvY2F0b3IoKSBpcyBhbHNvIGxpc3RlZCBpbiB0aGlzIHNlY3Rpb24pCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IgY3JlYXRlcyBubyBlbGVtZW50cy4KKyAgICAgICAqLworICAgICAgbXVsdGltYXAoKQorICAgICAgOiBfTV90KCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICVtdWx0aW1hcCB3aXRoIG5vIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19jb21wICBBIGNvbXBhcmlzb24gb2JqZWN0LgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgbXVsdGltYXAoY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKwkgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX3QoX19jb21wLCBfUGFpcl9hbGxvY190eXBlKF9fYSkpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVNdWx0aW1hcCBjb3B5IGNvbnN0cnVjdG9yLgorICAgICAgICogIEBwYXJhbSAgX194ICBBICVtdWx0aW1hcCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY3JlYXRlZCAlbXVsdGltYXAgdXNlcyBhIGNvcHkgb2YgdGhlIGFsbG9jYXRpb24gb2JqZWN0CisgICAgICAgKiAgdXNlZCBieSBAYSBfX3guCisgICAgICAgKi8KKyAgICAgIG11bHRpbWFwKGNvbnN0IG11bHRpbWFwJiBfX3gpCisgICAgICA6IF9NX3QoX194Ll9NX3QpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTXVsdGltYXAgbW92ZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gICBfX3ggIEEgJW11bHRpbWFwIG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICVtdWx0aW1hcCBjb250YWlucyB0aGUgZXhhY3QgY29udGVudHMgb2YgQGEgX194LgorICAgICAgICogIFRoZSBjb250ZW50cyBvZiBAYSBfX3ggYXJlIGEgdmFsaWQsIGJ1dCB1bnNwZWNpZmllZCAlbXVsdGltYXAuCisgICAgICAgKi8KKyAgICAgIG11bHRpbWFwKG11bHRpbWFwJiYgX194KQorICAgICAgbm9leGNlcHQoaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8X0NvbXBhcmU+Ojp2YWx1ZSkKKyAgICAgIDogX01fdChzdGQ6Om1vdmUoX194Ll9NX3QpKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlbXVsdGltYXAgZnJvbSBhbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICogIEBwYXJhbSAgX19sICBBbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICogIEBwYXJhbSAgX19jb21wICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGEgJW11bHRpbWFwIGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBmcm9tCisgICAgICAgKiAgdGhlIGluaXRpYWxpemVyX2xpc3QuICBUaGlzIGlzIGxpbmVhciBpbiBOIGlmIHRoZSBsaXN0IGlzIGFscmVhZHkKKyAgICAgICAqICBzb3J0ZWQsIGFuZCBObG9nTiBvdGhlcndpc2UgKHdoZXJlIE4gaXMgQGEgX19sLnNpemUoKSkuCisgICAgICAgKi8KKyAgICAgIG11bHRpbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCSAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX3QoX19jb21wLCBfUGFpcl9hbGxvY190eXBlKF9fYSkpCisgICAgICB7IF9NX3QuX01faW5zZXJ0X2VxdWFsKF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlbXVsdGltYXAgZnJvbSBhIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAlbXVsdGltYXAgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGZyb20KKyAgICAgICAqICBbX19maXJzdCxfX2xhc3QpLiAgVGhpcyBpcyBsaW5lYXIgaW4gTiBpZiB0aGUgcmFuZ2UgaXMgYWxyZWFkeSBzb3J0ZWQsCisgICAgICAgKiAgYW5kIE5sb2dOIG90aGVyd2lzZSAod2hlcmUgTiBpcyBkaXN0YW5jZShfX2ZpcnN0LF9fbGFzdCkpLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorCTogX01fdCgpCisgICAgICAgIHsgX01fdC5fTV9pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICVtdWx0aW1hcCBmcm9tIGEgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2NvbXAgIEEgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAlbXVsdGltYXAgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGZyb20KKyAgICAgICAqICBbX19maXJzdCxfX2xhc3QpLiAgVGhpcyBpcyBsaW5lYXIgaW4gTiBpZiB0aGUgcmFuZ2UgaXMgYWxyZWFkeSBzb3J0ZWQsCisgICAgICAgKiAgYW5kIE5sb2dOIG90aGVyd2lzZSAod2hlcmUgTiBpcyBkaXN0YW5jZShfX2ZpcnN0LF9fbGFzdCkpLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKwkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX01fdChfX2NvbXAsIF9QYWlyX2FsbG9jX3R5cGUoX19hKSkKKyAgICAgICAgeyBfTV90Ll9NX2luc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgICAgIC8vIEZJWE1FIFRoZXJlIGlzIG5vIGR0b3IgZGVjbGFyZWQsIGJ1dCB3ZSBzaG91bGQgaGF2ZSBzb21ldGhpbmcgZ2VuZXJhdGVkCisgICAgICAvLyBieSBEb3h5Z2VuLiAgSSBkb24ndCBrbm93IHdoYXQgdGFncyB0byBhZGQgdG8gdGhpcyBwYXJhZ3JhcGggdG8gbWFrZQorICAgICAgLy8gdGhhdCBoYXBwZW46CisgICAgICAvKioKKyAgICAgICAqICBUaGUgZHRvciBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCBub3RlIHRoYXQgaWYgdGhlIGVsZW1lbnRzCisgICAgICAgKiAgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkKKyAgICAgICAqICB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJU11bHRpbWFwIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJW11bHRpbWFwIG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIEFsbCB0aGUgZWxlbWVudHMgb2YgQGEgX194IGFyZSBjb3BpZWQsIGJ1dCB1bmxpa2UgdGhlIGNvcHkKKyAgICAgICAqICBjb25zdHJ1Y3RvciwgdGhlIGFsbG9jYXRvciBvYmplY3QgaXMgbm90IGNvcGllZC4KKyAgICAgICAqLworICAgICAgbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0oY29uc3QgbXVsdGltYXAmIF9feCkKKyAgICAgIHsKKwlfTV90ID0gX194Ll9NX3Q7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTXVsdGltYXAgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX194ICBBICVtdWx0aW1hcCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgY29udGVudHMgb2YgQGEgX194IGFyZSBtb3ZlZCBpbnRvIHRoaXMgbXVsdGltYXAgKHdpdGhvdXQgY29weWluZykuCisgICAgICAgKiAgQGEgX194IGlzIGEgdmFsaWQsIGJ1dCB1bnNwZWNpZmllZCBtdWx0aW1hcC4KKyAgICAgICAqLworICAgICAgbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0obXVsdGltYXAmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPnN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJU11bHRpbWFwIGxpc3QgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhICVtdWx0aW1hcCB3aXRoIGNvcGllcyBvZiB0aGUgZWxlbWVudHMKKyAgICAgICAqICBpbiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBAYSBfX2wuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgYXNzaWdubWVudCBjb21wbGV0ZWx5IGNoYW5nZXMgdGhlICVtdWx0aW1hcCBhbmQKKyAgICAgICAqICB0aGF0IHRoZSByZXN1bHRpbmcgJW11bHRpbWFwJ3Mgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyCisgICAgICAgKiAgb2YgZWxlbWVudHMgYXNzaWduZWQuICBPbGQgZGF0YSBtYXkgYmUgbG9zdC4KKyAgICAgICAqLworICAgICAgbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vLyBHZXQgYSBjb3B5IG9mIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBvYmplY3QuCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUIAorICAgICAgeyByZXR1cm4gYWxsb2NhdG9yX3R5cGUoX01fdC5nZXRfYWxsb2NhdG9yKCkpOyB9CisKKyAgICAgIC8vIGl0ZXJhdG9ycworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0IHBhaXIgaW4gdGhlCisgICAgICAgKiAgJW11bHRpbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZyB0byB0aGUKKyAgICAgICAqICBrZXlzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5iZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QgcGFpcgorICAgICAgICogIGluIHRoZSAlbXVsdGltYXAuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBhc2NlbmRpbmcgb3JkZXIgYWNjb3JkaW5nIHRvCisgICAgICAgKiAgdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QgcGFpciBpbgorICAgICAgICogIHRoZSAlbXVsdGltYXAuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBhc2NlbmRpbmcgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZQorICAgICAgICogIGtleXMuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5lbmQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBwYWlyIGluIHRoZSAlbXVsdGltYXAuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBhc2NlbmRpbmcgb3JkZXIgYWNjb3JkaW5nCisgICAgICAgKiAgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5lbmQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBsYXN0IHBhaXIgaW4KKyAgICAgICAqICB0aGUgJW11bHRpbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gZGVzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgKiAga2V5cy4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3QucmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlCisgICAgICAgKiAgbGFzdCBwYWlyIGluIHRoZSAlbXVsdGltYXAuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBkZXNjZW5kaW5nIG9yZGVyCisgICAgICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIG9uZSBiZWZvcmUgdGhlCisgICAgICAgKiAgZmlyc3QgcGFpciBpbiB0aGUgJW11bHRpbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gZGVzY2VuZGluZyBvcmRlcgorICAgICAgICogIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LnJlbmQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byBvbmUKKyAgICAgICAqICBiZWZvcmUgdGhlIGZpcnN0IHBhaXIgaW4gdGhlICVtdWx0aW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluCisgICAgICAgKiAgZGVzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QgcGFpcgorICAgICAgICogIGluIHRoZSAlbXVsdGltYXAuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBhc2NlbmRpbmcgb3JkZXIgYWNjb3JkaW5nIHRvCisgICAgICAgKiAgdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fdC5iZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdAorICAgICAgICogIHBhaXIgaW4gdGhlICVtdWx0aW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcKKyAgICAgICAqICB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fdC5lbmQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUKKyAgICAgICAqICBsYXN0IHBhaXIgaW4gdGhlICVtdWx0aW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGRlc2NlbmRpbmcgb3JkZXIKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byBvbmUKKyAgICAgICAqICBiZWZvcmUgdGhlIGZpcnN0IHBhaXIgaW4gdGhlICVtdWx0aW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluCisgICAgICAgKiAgZGVzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX3QucmVuZCgpOyB9CisjZW5kaWYKKworICAgICAgLy8gY2FwYWNpdHkKKyAgICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlICVtdWx0aW1hcCBpcyBlbXB0eS4gICovCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LmVtcHR5KCk7IH0KKworICAgICAgLyoqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlICVtdWx0aW1hcC4gICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5zaXplKCk7IH0KKworICAgICAgLyoqIFJldHVybnMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgJW11bHRpbWFwLiAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5tYXhfc2l6ZSgpOyB9CisKKyAgICAgIC8vIG1vZGlmaWVycworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBCdWlsZCBhbmQgaW5zZXJ0IGEgc3RkOjpwYWlyIGludG8gdGhlICVtdWx0aW1hcC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIF9fYXJncyAgQXJndW1lbnRzIHVzZWQgdG8gZ2VuZXJhdGUgYSBuZXcgcGFpciBpbnN0YW5jZSAoc2VlCisgICAgICAgKgkgICAgICAgIHN0ZDo6cGllY2V3aXNlX2NvbnRydWN0IGZvciBwYXNzaW5nIGFyZ3VtZW50cyB0byBlYWNoCisgICAgICAgKgkgICAgICAgIHBhcnQgb2YgdGhlIHBhaXIgY29uc3RydWN0b3IpLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBpbnNlcnRlZCAoa2V5LHZhbHVlKSBwYWlyLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyBhbmQgaW5zZXJ0cyBhIChrZXksIHZhbHVlKSAlcGFpciBpbnRvIHRoZQorICAgICAgICogICVtdWx0aW1hcC4KKyAgICAgICAqICBDb250cmFyeSB0byBhIHN0ZDo6bWFwIHRoZSAlbXVsdGltYXAgZG9lcyBub3QgcmVseSBvbiB1bmlxdWUga2V5cyBhbmQKKyAgICAgICAqICB0aHVzIG11bHRpcGxlIHBhaXJzIHdpdGggdGhlIHNhbWUga2V5IGNhbiBiZSBpbnNlcnRlZC4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGxvZ2FyaXRobWljIHRpbWUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKwl7IHJldHVybiBfTV90Ll9NX2VtcGxhY2VfZXF1YWwoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQnVpbGRzIGFuZCBpbnNlcnRzIGEgc3RkOjpwYWlyIGludG8gdGhlICVtdWx0aW1hcC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgQW4gaXRlcmF0b3IgdGhhdCBzZXJ2ZXMgYXMgYSBoaW50IGFzIHRvIHdoZXJlIHRoZSBwYWlyCisgICAgICAgKiAgICAgICAgICAgICAgICBzaG91bGQgYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHBhcmFtICBfX2FyZ3MgIEFyZ3VtZW50cyB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IHBhaXIgaW5zdGFuY2UgKHNlZQorICAgICAgICoJICAgICAgICAgc3RkOjpwaWVjZXdpc2VfY29udHJ1Y3QgZm9yIHBhc3NpbmcgYXJndW1lbnRzIHRvIGVhY2gKKyAgICAgICAqCSAgICAgICAgIHBhcnQgb2YgdGhlIHBhaXIgY29uc3RydWN0b3IpLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIChrZXksdmFsdWUpIHBhaXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaW5zZXJ0cyBhIChrZXksIHZhbHVlKSBwYWlyIGludG8gdGhlICVtdWx0aW1hcC4KKyAgICAgICAqICBDb250cmFyeSB0byBhIHN0ZDo6bWFwIHRoZSAlbXVsdGltYXAgZG9lcyBub3QgcmVseSBvbiB1bmlxdWUga2V5cyBhbmQKKyAgICAgICAqICB0aHVzIG11bHRpcGxlIHBhaXJzIHdpdGggdGhlIHNhbWUga2V5IGNhbiBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBvbmx5IGEgaGludCBhbmQgY2FuIHBvdGVudGlhbGx5CisgICAgICAgKiAgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGluc2VydGlvbiBwcm9jZXNzLiAgQSBiYWQgaGludCB3b3VsZAorICAgICAgICogIGNhdXNlIG5vIGdhaW5zIGluIGVmZmljaWVuY3kuCisgICAgICAgKgorICAgICAgICogIEZvciBtb3JlIG9uIEBhIGhpbnRpbmcsIHNlZToKKyAgICAgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDA3Y2gxNy5odG1sCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBsb2dhcml0aG1pYyB0aW1lIChpZiB0aGUgaGludCBpcyBub3QgdGFrZW4pLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX3BvcywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgcmV0dXJuIF9NX3QuX01fZW1wbGFjZV9oaW50X2VxdWFsKF9fcG9zLAorCQkJCQkgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwl9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEluc2VydHMgYSBzdGQ6OnBhaXIgaW50byB0aGUgJW11bHRpbWFwLgorICAgICAgICogIEBwYXJhbSAgX194ICBQYWlyIHRvIGJlIGluc2VydGVkIChzZWUgc3RkOjptYWtlX3BhaXIgZm9yIGVhc3kgY3JlYXRpb24KKyAgICAgICAqICAgICAgICAgICAgIG9mIHBhaXJzKS4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBpbnNlcnRlZCAoa2V5LHZhbHVlKSBwYWlyLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGluc2VydHMgYSAoa2V5LCB2YWx1ZSkgcGFpciBpbnRvIHRoZSAlbXVsdGltYXAuCisgICAgICAgKiAgQ29udHJhcnkgdG8gYSBzdGQ6Om1hcCB0aGUgJW11bHRpbWFwIGRvZXMgbm90IHJlbHkgb24gdW5pcXVlIGtleXMgYW5kCisgICAgICAgKiAgdGh1cyBtdWx0aXBsZSBwYWlycyB3aXRoIHRoZSBzYW1lIGtleSBjYW4gYmUgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBsb2dhcml0aG1pYyB0aW1lLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuX01faW5zZXJ0X2VxdWFsKF9feCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLAorCQkJCQkJICAgIF9QYWlyJiY+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGluc2VydChfUGFpciYmIF9feCkKKyAgICAgICAgeyByZXR1cm4gX01fdC5fTV9pbnNlcnRfZXF1YWwoc3RkOjpmb3J3YXJkPF9QYWlyPihfX3gpKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBJbnNlcnRzIGEgc3RkOjpwYWlyIGludG8gdGhlICVtdWx0aW1hcC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIHRoYXQgc2VydmVzIGFzIGEgaGludCBhcyB0byB3aGVyZSB0aGUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBhaXIgc2hvdWxkIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgX194ICBQYWlyIHRvIGJlIGluc2VydGVkIChzZWUgc3RkOjptYWtlX3BhaXIgZm9yIGVhc3kgY3JlYXRpb24KKyAgICAgICAqICAgICAgICAgICAgICAgb2YgcGFpcnMpLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIChrZXksdmFsdWUpIHBhaXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaW5zZXJ0cyBhIChrZXksIHZhbHVlKSBwYWlyIGludG8gdGhlICVtdWx0aW1hcC4KKyAgICAgICAqICBDb250cmFyeSB0byBhIHN0ZDo6bWFwIHRoZSAlbXVsdGltYXAgZG9lcyBub3QgcmVseSBvbiB1bmlxdWUga2V5cyBhbmQKKyAgICAgICAqICB0aHVzIG11bHRpcGxlIHBhaXJzIHdpdGggdGhlIHNhbWUga2V5IGNhbiBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBvbmx5IGEgaGludCBhbmQgY2FuIHBvdGVudGlhbGx5CisgICAgICAgKiAgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGluc2VydGlvbiBwcm9jZXNzLiAgQSBiYWQgaGludCB3b3VsZAorICAgICAgICogIGNhdXNlIG5vIGdhaW5zIGluIGVmZmljaWVuY3kuCisgICAgICAgKgorICAgICAgICogIEZvciBtb3JlIG9uIEBhIGhpbnRpbmcsIHNlZToKKyAgICAgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDA3Y2gxNy5odG1sCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBsb2dhcml0aG1pYyB0aW1lIChpZiB0aGUgaGludCBpcyBub3QgdGFrZW4pLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZWxzZQorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbmRpZgorICAgICAgeyByZXR1cm4gX01fdC5fTV9pbnNlcnRfZXF1YWxfKF9fcG9zaXRpb24sIF9feCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLAorCQkJCQkJICAgIF9QYWlyJiY+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBfUGFpciYmIF9feCkKKyAgICAgICAgeyByZXR1cm4gX01fdC5fTV9pbnNlcnRfZXF1YWxfKF9fcG9zaXRpb24sCisJCQkJICAgICAgIHN0ZDo6Zm9yd2FyZDxfUGFpcj4oX194KSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQSB0ZW1wbGF0ZSBmdW5jdGlvbiB0aGF0IGF0dGVtcHRzIHRvIGluc2VydCBhIHJhbmdlCisgICAgICAgKiAgb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgICBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UuCisgICAgICAgKgorICAgICAgICogIENvbXBsZXhpdHkgc2ltaWxhciB0byB0aGF0IG9mIHRoZSByYW5nZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeyBfTV90Ll9NX2luc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gaW5zZXJ0IGEgbGlzdCBvZiBzdGQ6OnBhaXJzIGludG8gdGhlICVtdWx0aW1hcC4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQSBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gb2YgcGFpcnMgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIENvbXBsZXhpdHkgc2ltaWxhciB0byB0aGF0IG9mIHRoZSByYW5nZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyB0aGlzLT5pbnNlcnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMTMwLiBBc3NvY2lhdGl2ZSBlcmFzZSBzaG91bGQgcmV0dXJuIGFuIGl0ZXJhdG9yLgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhbiBlbGVtZW50IGZyb20gYSAlbXVsdGltYXAuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZWxlbWVudCB0byBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZWxlbWVudCBpbW1lZGlhdGVseSBmb2xsb3dpbmcKKyAgICAgICAqICAgICAgICAgIEBhIHBvc2l0aW9uIHByaW9yIHRvIHRoZSBlbGVtZW50IGJlaW5nIGVyYXNlZC4gSWYgbm8gc3VjaCAKKyAgICAgICAqICAgICAgICAgIGVsZW1lbnQgZXhpc3RzLCBlbmQoKSBpcyByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYW4gZWxlbWVudCwgcG9pbnRlZCB0byBieSB0aGUgZ2l2ZW4gaXRlcmF0b3IsCisgICAgICAgKiAgZnJvbSBhICVtdWx0aW1hcC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LAorICAgICAgICogIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcworICAgICAgICogIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzCisgICAgICAgKiAgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyByZXR1cm4gX01fdC5lcmFzZShfX3Bvc2l0aW9uKTsgfQorCisgICAgICAvLyBMV0cgMjA1OS4KKyAgICAgIF9HTElCQ1hYX0FCSV9UQUdfQ1hYMTEKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyByZXR1cm4gX01fdC5lcmFzZShfX3Bvc2l0aW9uKTsgfQorI2Vsc2UKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgYW4gZWxlbWVudCBmcm9tIGEgJW11bHRpbWFwLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhbiBlbGVtZW50LCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBpdGVyYXRvciwKKyAgICAgICAqICBmcm9tIGEgJW11bHRpbWFwLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsCisgICAgICAgKiAgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzCisgICAgICAgKiAgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MKKyAgICAgICAqICByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgX01fdC5lcmFzZShfX3Bvc2l0aW9uKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgZWxlbWVudHMgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBrZXkuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSBvZiBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGVyYXNlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYWxsIGVsZW1lbnRzIGxvY2F0ZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tIGEKKyAgICAgICAqICAlbXVsdGltYXAuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGF0IGlmCisgICAgICAgKiAgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkCisgICAgICAgKiAgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXJhc2UoX194KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMTMwLiBBc3NvY2lhdGl2ZSBlcmFzZSBzaG91bGQgcmV0dXJuIGFuIGl0ZXJhdG9yLgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhIFtmaXJzdCxsYXN0KSByYW5nZSBvZiBlbGVtZW50cyBmcm9tIGEgJW11bHRpbWFwLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgICAgZXJhc2VkLgorICAgICAgICogIEBwYXJhbSBfX2xhc3QgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgIGVyYXNlZCAuCisgICAgICAgKiAgQHJldHVybiBUaGUgaXRlcmF0b3IgQGEgX19sYXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhIHNlcXVlbmNlIG9mIGVsZW1lbnRzIGZyb20gYSAlbXVsdGltYXAuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnRzLCBhbmQgdGhhdCBpZgorICAgICAgICogIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdAorICAgICAgICogIHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MKKyAgICAgICAqICByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXJhc2UoX19maXJzdCwgX19sYXN0KTsgfQorI2Vsc2UKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDEzMC4gQXNzb2NpYXRpdmUgZXJhc2Ugc2hvdWxkIHJldHVybiBhbiBpdGVyYXRvci4KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgYSBbZmlyc3QsbGFzdCkgcmFuZ2Ugb2YgZWxlbWVudHMgZnJvbSBhICVtdWx0aW1hcC4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICBlcmFzZWQuCisgICAgICAgKiAgQHBhcmFtIF9fbGFzdCBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSByYW5nZSB0bworICAgICAgICogICAgICAgICAgICAgICAgYmUgZXJhc2VkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhIHNlcXVlbmNlIG9mIGVsZW1lbnRzIGZyb20gYSAlbXVsdGltYXAuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnRzLCBhbmQgdGhhdCBpZgorICAgICAgICogIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdAorICAgICAgICogIHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MKKyAgICAgICAqICByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyBfTV90LmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN3YXBzIGRhdGEgd2l0aCBhbm90aGVyICVtdWx0aW1hcC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSAlbXVsdGltYXAgb2YgdGhlIHNhbWUgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGV4Y2hhbmdlcyB0aGUgZWxlbWVudHMgYmV0d2VlbiB0d28gbXVsdGltYXBzIGluIGNvbnN0YW50IHRpbWUuCisgICAgICAgKiAgKEl0IGlzIG9ubHkgc3dhcHBpbmcgYSBwb2ludGVyLCBhbiBpbnRlZ2VyLCBhbmQgYW4gaW5zdGFuY2Ugb2YKKyAgICAgICAqICB0aGUgQGMgQ29tcGFyZSB0eXBlICh3aGljaCBpdHNlbGYgaXMgb2Z0ZW4gc3RhdGVsZXNzIGFuZCBlbXB0eSksIHNvIGl0CisgICAgICAgKiAgc2hvdWxkIGJlIHF1aXRlIGZhc3QuKQorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZ2xvYmFsIHN0ZDo6c3dhcCgpIGZ1bmN0aW9uIGlzIHNwZWNpYWxpemVkIHN1Y2ggdGhhdAorICAgICAgICogIHN0ZDo6c3dhcChtMSxtMikgd2lsbCBmZWVkIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAobXVsdGltYXAmIF9feCkKKyAgICAgIHsgX01fdC5zd2FwKF9feC5fTV90KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBFcmFzZXMgYWxsIGVsZW1lbnRzIGluIGEgJW11bHRpbWFwLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seQorICAgICAgICogIGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywKKyAgICAgICAqICB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyCisgICAgICAgKiAgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyBfTV90LmNsZWFyKCk7IH0KKworICAgICAgLy8gb2JzZXJ2ZXJzCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIHRoZSBrZXkgY29tcGFyaXNvbiBvYmplY3Qgb3V0IG9mIHdoaWNoIHRoZSAlbXVsdGltYXAKKyAgICAgICAqICB3YXMgY29uc3RydWN0ZWQuCisgICAgICAgKi8KKyAgICAgIGtleV9jb21wYXJlCisgICAgICBrZXlfY29tcCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmtleV9jb21wKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHZhbHVlIGNvbXBhcmlzb24gb2JqZWN0LCBidWlsdCBmcm9tIHRoZSBrZXkgY29tcGFyaXNvbgorICAgICAgICogIG9iamVjdCBvdXQgb2Ygd2hpY2ggdGhlICVtdWx0aW1hcCB3YXMgY29uc3RydWN0ZWQuCisgICAgICAgKi8KKyAgICAgIHZhbHVlX2NvbXBhcmUKKyAgICAgIHZhbHVlX2NvbXAoKSBjb25zdAorICAgICAgeyByZXR1cm4gdmFsdWVfY29tcGFyZShfTV90LmtleV9jb21wKCkpOyB9CisKKyAgICAgIC8vIG11bHRpbWFwIG9wZXJhdGlvbnMKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUcmllcyB0byBsb2NhdGUgYW4gZWxlbWVudCBpbiBhICVtdWx0aW1hcC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlyIHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gc291Z2h0LWFmdGVyIGVsZW1lbnQsCisgICAgICAgKiAgICAgICAgICAgb3IgZW5kKCkgaWYgbm90IGZvdW5kLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHRha2VzIGEga2V5IGFuZCB0cmllcyB0byBsb2NhdGUgdGhlIGVsZW1lbnQgd2l0aCB3aGljaAorICAgICAgICogIHRoZSBrZXkgbWF0Y2hlcy4gIElmIHN1Y2Nlc3NmdWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gaXRlcmF0b3IKKyAgICAgICAqICBwb2ludGluZyB0byB0aGUgc291Z2h0IGFmdGVyICVwYWlyLiAgSWYgdW5zdWNjZXNzZnVsIGl0IHJldHVybnMgdGhlCisgICAgICAgKiAgcGFzdC10aGUtZW5kICggQGMgZW5kKCkgKSBpdGVyYXRvci4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuZmluZChfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUcmllcyB0byBsb2NhdGUgYW4gZWxlbWVudCBpbiBhICVtdWx0aW1hcC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlyIHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgcG9pbnRpbmcgdG8gc291Z2h0LWFmdGVyCisgICAgICAgKiAgICAgICAgICAgZWxlbWVudCwgb3IgZW5kKCkgaWYgbm90IGZvdW5kLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHRha2VzIGEga2V5IGFuZCB0cmllcyB0byBsb2NhdGUgdGhlIGVsZW1lbnQgd2l0aCB3aGljaAorICAgICAgICogIHRoZSBrZXkgbWF0Y2hlcy4gIElmIHN1Y2Nlc3NmdWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBjb25zdGFudAorICAgICAgICogIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzb3VnaHQgYWZ0ZXIgJXBhaXIuICBJZiB1bnN1Y2Nlc3NmdWwgaXQKKyAgICAgICAqICByZXR1cm5zIHRoZSBwYXN0LXRoZS1lbmQgKCBAYyBlbmQoKSApIGl0ZXJhdG9yLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5maW5kKF9feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEZpbmRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBnaXZlbiBrZXkuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSBvZiAoa2V5LCB2YWx1ZSkgcGFpcnMgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyB3aXRoIHNwZWNpZmllZCBrZXkuCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuY291bnQoX194KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgdGhlIGJlZ2lubmluZyBvZiBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlyIHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gZmlyc3QgZWxlbWVudCBlcXVhbCB0byBvciBncmVhdGVyCisgICAgICAgKiAgICAgICAgICAgdGhhbiBrZXksIG9yIGVuZCgpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBzdWJzZXF1ZW5jZSBvZiBlbGVtZW50cworICAgICAgICogIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4ga2V5LiAgSWYgdW5zdWNjZXNzZnVsIGl0IHJldHVybnMgYW4gaXRlcmF0b3IKKyAgICAgICAqICBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGhhcyBhIGdyZWF0ZXIgdmFsdWUgdGhhbiBnaXZlbiBrZXkKKyAgICAgICAqICBvciBlbmQoKSBpZiBubyBzdWNoIGVsZW1lbnQgZXhpc3RzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QubG93ZXJfYm91bmQoX194KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgdGhlIGJlZ2lubmluZyBvZiBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlyIHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgcG9pbnRpbmcgdG8gZmlyc3QgZWxlbWVudAorICAgICAgICogICAgICAgICAgIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiBrZXksIG9yIGVuZCgpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBzdWJzZXF1ZW5jZSBvZgorICAgICAgICogIGVsZW1lbnRzIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4ga2V5LiAgSWYgdW5zdWNjZXNzZnVsIHRoZQorICAgICAgICogIGl0ZXJhdG9yIHdpbGwgcG9pbnQgdG8gdGhlIG5leHQgZ3JlYXRlc3QgZWxlbWVudCBvciwgaWYgbm8KKyAgICAgICAqICBzdWNoIGdyZWF0ZXIgZWxlbWVudCBleGlzdHMsIHRvIGVuZCgpLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QubG93ZXJfYm91bmQoX194KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgdGhlIGVuZCBvZiBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlyIHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudAorICAgICAgICogICAgICAgICAgZ3JlYXRlciB0aGFuIGtleSwgb3IgZW5kKCkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC51cHBlcl9ib3VuZChfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyB0aGUgZW5kIG9mIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgb2YgKGtleSwgdmFsdWUpIHBhaXIgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciBwb2ludGluZyB0byBmaXJzdCBpdGVyYXRvcgorICAgICAgICogICAgICAgICAgIGdyZWF0ZXIgdGhhbiBrZXksIG9yIGVuZCgpLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QudXBwZXJfYm91bmQoX194KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgYSBzdWJzZXF1ZW5jZSBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSBvZiAoa2V5LCB2YWx1ZSkgcGFpcnMgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBQYWlyIG9mIGl0ZXJhdG9ycyB0aGF0IHBvc3NpYmx5IHBvaW50cyB0byB0aGUgc3Vic2VxdWVuY2UKKyAgICAgICAqICAgICAgICAgICBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0bworICAgICAgICogIEBjb2RlCisgICAgICAgKiAgICBzdGQ6Om1ha2VfcGFpcihjLmxvd2VyX2JvdW5kKHZhbCksCisgICAgICAgKiAgICAgICAgICAgICAgICAgICBjLnVwcGVyX2JvdW5kKHZhbCkpCisgICAgICAgKiAgQGVuZGNvZGUKKyAgICAgICAqICAoYnV0IGlzIGZhc3RlciB0aGFuIG1ha2luZyB0aGUgY2FsbHMgc2VwYXJhdGVseSkuCisgICAgICAgKi8KKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5lcXVhbF9yYW5nZShfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlycyB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIFBhaXIgb2YgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3JzIHRoYXQgcG9zc2libHkgcG9pbnRzCisgICAgICAgKiAgICAgICAgICAgdG8gdGhlIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvCisgICAgICAgKiAgQGNvZGUKKyAgICAgICAqICAgIHN0ZDo6bWFrZV9wYWlyKGMubG93ZXJfYm91bmQodmFsKSwKKyAgICAgICAqICAgICAgICAgICAgICAgICAgIGMudXBwZXJfYm91bmQodmFsKSkKKyAgICAgICAqICBAZW5kY29kZQorICAgICAgICogIChidXQgaXMgZmFzdGVyIHRoYW4gbWFraW5nIHRoZSBjYWxscyBzZXBhcmF0ZWx5KS4KKyAgICAgICAqLworICAgICAgc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmVxdWFsX3JhbmdlKF9feCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0sxLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9DMSwgdHlwZW5hbWUgX0ExPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcj09KGNvbnN0IG11bHRpbWFwPF9LMSwgX1QxLCBfQzEsIF9BMT4mLAorCQkgICBjb25zdCBtdWx0aW1hcDxfSzEsIF9UMSwgX0MxLCBfQTE+Jik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LMSwgdHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfQzEsIHR5cGVuYW1lIF9BMT4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I8KGNvbnN0IG11bHRpbWFwPF9LMSwgX1QxLCBfQzEsIF9BMT4mLAorCQkgIGNvbnN0IG11bHRpbWFwPF9LMSwgX1QxLCBfQzEsIF9BMT4mKTsKKyAgfTsKKworICAvKioKKyAgICogIEBicmllZiAgTXVsdGltYXAgZXF1YWxpdHkgY29tcGFyaXNvbi4KKyAgICogIEBwYXJhbSAgX194ICBBICVtdWx0aW1hcC4KKyAgICogIEBwYXJhbSAgX195ICBBICVtdWx0aW1hcCBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIF9feC4KKyAgICogIEByZXR1cm4gIFRydWUgaWZmIHRoZSBzaXplIGFuZCBlbGVtZW50cyBvZiB0aGUgbWFwcyBhcmUgZXF1YWwuCisgICAqCisgICAqICBUaGlzIGlzIGFuIGVxdWl2YWxlbmNlIHJlbGF0aW9uLiAgSXQgaXMgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZQorICAgKiAgbXVsdGltYXBzLiAgTXVsdGltYXBzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgaWYgdGhlaXIgc2l6ZXMgYXJlIGVxdWFsLAorICAgKiAgYW5kIGlmIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgY29tcGFyZSBlcXVhbC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX3QgPT0gX195Ll9NX3Q7IH0KKworICAvKioKKyAgICogIEBicmllZiAgTXVsdGltYXAgb3JkZXJpbmcgcmVsYXRpb24uCisgICAqICBAcGFyYW0gIF9feCAgQSAlbXVsdGltYXAuCisgICAqICBAcGFyYW0gIF9feSAgQSAlbXVsdGltYXAgb2YgdGhlIHNhbWUgdHlwZSBhcyBAYSBfX3guCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiBAYSB4IGlzIGxleGljb2dyYXBoaWNhbGx5IGxlc3MgdGhhbiBAYSB5LgorICAgKgorICAgKiAgVGhpcyBpcyBhIHRvdGFsIG9yZGVyaW5nIHJlbGF0aW9uLiAgSXQgaXMgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZQorICAgKiAgbXVsdGltYXBzLiAgVGhlIGVsZW1lbnRzIG11c3QgYmUgY29tcGFyYWJsZSB3aXRoIEBjIDwuCisgICAqCisgICAqICBTZWUgc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgpIGZvciBob3cgdGhlIGRldGVybWluYXRpb24gaXMgbWFkZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV90IDwgX195Ll9NX3Q7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I9PQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgIGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgIGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisgIC8vLyBTZWUgc3RkOjptdWx0aW1hcDo6c3dhcCgpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgIG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLyogX1NUTF9NVUxUSU1BUF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX211bHRpc2V0LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX211bHRpc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlYjAyYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfbXVsdGlzZXQuaApAQCAtMCwwICsxLDc5OCBAQAorLy8gTXVsdGlzZXQgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9tdWx0aXNldC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7c2V0fQorICovCisKKyNpZm5kZWYgX1NUTF9NVUxUSVNFVF9ICisjZGVmaW5lIF9TVExfTVVMVElTRVRfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2NvbmNlcHRfY2hlY2suaD4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKKworICAvKioKKyAgICogIEBicmllZiBBIHN0YW5kYXJkIGNvbnRhaW5lciBtYWRlIHVwIG9mIGVsZW1lbnRzLCB3aGljaCBjYW4gYmUgcmV0cmlldmVkCisgICAqICBpbiBsb2dhcml0aG1pYyB0aW1lLgorICAgKgorICAgKiAgQGluZ3JvdXAgYXNzb2NpYXRpdmVfY29udGFpbmVycworICAgKgorICAgKgorICAgKiAgQHRwYXJhbSBfS2V5ICBUeXBlIG9mIGtleSBvYmplY3RzLgorICAgKiAgQHRwYXJhbSBfQ29tcGFyZSAgQ29tcGFyaXNvbiBmdW5jdGlvbiBvYmplY3QgdHlwZSwgZGVmYXVsdHMgdG8gbGVzczxfS2V5Pi4KKyAgICogIEB0cGFyYW0gX0FsbG9jICBBbGxvY2F0b3IgdHlwZSwgZGVmYXVsdHMgdG8gYWxsb2NhdG9yPF9LZXk+LgorICAgKgorICAgKiAgTWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LCBhCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NiI+cmV2ZXJzaWJsZSBjb250YWluZXI8L2E+LCBhbmQgYW4KKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY5Ij5hc3NvY2lhdGl2ZSBjb250YWluZXI8L2E+ICh1c2luZyBlcXVpdmFsZW50CisgICAqICBrZXlzKS4gIEZvciBhIEBjIG11bHRpc2V0PEtleT4gdGhlIGtleV90eXBlIGFuZCB2YWx1ZV90eXBlIGFyZSBLZXkuCisgICAqCisgICAqICBNdWx0aXNldHMgc3VwcG9ydCBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9ycy4KKyAgICoKKyAgICogIFRoZSBwcml2YXRlIHRyZWUgZGF0YSBpcyBkZWNsYXJlZCBleGFjdGx5IHRoZSBzYW1lIHdheSBmb3Igc2V0IGFuZAorICAgKiAgbXVsdGlzZXQ7IHRoZSBkaXN0aW5jdGlvbiBpcyBtYWRlIGVudGlyZWx5IGluIGhvdyB0aGUgdHJlZSBmdW5jdGlvbnMgYXJlCisgICAqICBjYWxsZWQgKCpfdW5pcXVlIHZlcnN1cyAqX2VxdWFsLCBzYW1lIGFzIHRoZSBzdGFuZGFyZCkuCisgICovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSA9IHN0ZDo6bGVzczxfS2V5PiwKKwkgICAgdHlwZW5hbWUgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8X0tleT4gPgorICAgIGNsYXNzIG11bHRpc2V0CisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp2YWx1ZV90eXBlICAgICAgICAgICAgICAgICAgIF9BbGxvY192YWx1ZV90eXBlOworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9LZXksIF9TR0lBc3NpZ25hYmxlQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczQoX0NvbXBhcmUsIGJvb2wsIF9LZXksIF9LZXksCisJCQkJX0JpbmFyeUZ1bmN0aW9uQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczIoX0tleSwgX0FsbG9jX3ZhbHVlX3R5cGUsIF9TYW1lVHlwZUNvbmNlcHQpCQorCisgICAgcHVibGljOgorICAgICAgLy8gdHlwZWRlZnM6CisgICAgICB0eXBlZGVmIF9LZXkgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfS2V5ICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQ29tcGFyZSBrZXlfY29tcGFyZTsKKyAgICAgIHR5cGVkZWYgX0NvbXBhcmUgdmFsdWVfY29tcGFyZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jICAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICBwcml2YXRlOgorICAgICAgLy8vIFRoaXMgdHVybnMgYSByZWQtYmxhY2sgdHJlZSBpbnRvIGEgW211bHRpXXNldC4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X0tleT46Om90aGVyIF9LZXlfYWxsb2NfdHlwZTsKKworICAgICAgdHlwZWRlZiBfUmJfdHJlZTxrZXlfdHlwZSwgdmFsdWVfdHlwZSwgX0lkZW50aXR5PHZhbHVlX3R5cGU+LAorCQkgICAgICAga2V5X2NvbXBhcmUsIF9LZXlfYWxsb2NfdHlwZT4gX1JlcF90eXBlOworICAgICAgLy8vIFRoZSBhY3R1YWwgdHJlZSBzdHJ1Y3R1cmUuCisgICAgICBfUmVwX3R5cGUgX01fdDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0tleV9hbGxvY190eXBlOjpwb2ludGVyICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9LZXlfYWxsb2NfdHlwZTo6Y29uc3RfcG9pbnRlciAgICAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfS2V5X2FsbG9jX3R5cGU6OnJlZmVyZW5jZSAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfS2V5X2FsbG9jX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSAgICAgY29uc3RfcmVmZXJlbmNlOworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMTAzLiBzZXQ6Oml0ZXJhdG9yIGlzIHJlcXVpcmVkIHRvIGJlIG1vZGlmaWFibGUsCisgICAgICAvLyBidXQgdGhpcyBhbGxvd3MgbW9kaWZpY2F0aW9uIG9mIGtleXMuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9pdGVyYXRvciAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6c2l6ZV90eXBlICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIC8vIGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IgY3JlYXRlcyBubyBlbGVtZW50cy4KKyAgICAgICAqLworICAgICAgbXVsdGlzZXQoKQorICAgICAgOiBfTV90KCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICVtdWx0aXNldCB3aXRoIG5vIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19jb21wICBDb21wYXJhdG9yIHRvIHVzZS4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG11bHRpc2V0KGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCisJICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV90KF9fY29tcCwgX0tleV9hbGxvY190eXBlKF9fYSkpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICVtdWx0aXNldCBmcm9tIGEgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVtdWx0aXNldCBjb25zaXN0aW5nIG9mIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgZnJvbQorICAgICAgICogIFtmaXJzdCxsYXN0KS4gIFRoaXMgaXMgbGluZWFyIGluIE4gaWYgdGhlIHJhbmdlIGlzIGFscmVhZHkgc29ydGVkLAorICAgICAgICogIGFuZCBObG9nTiBvdGhlcndpc2UgKHdoZXJlIE4gaXMgZGlzdGFuY2UoX19maXJzdCxfX2xhc3QpKS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIG11bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKwk6IF9NX3QoKQorICAgICAgICB7IF9NX3QuX01faW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlbXVsdGlzZXQgZnJvbSBhIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19jb21wICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGEgJW11bHRpc2V0IGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBmcm9tCisgICAgICAgKiAgW19fZmlyc3QsX19sYXN0KS4gIFRoaXMgaXMgbGluZWFyIGluIE4gaWYgdGhlIHJhbmdlIGlzIGFscmVhZHkgc29ydGVkLAorICAgICAgICogIGFuZCBObG9nTiBvdGhlcndpc2UgKHdoZXJlIE4gaXMgZGlzdGFuY2UoX19maXJzdCxfX2xhc3QpKS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIG11bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCisJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9NX3QoX19jb21wLCBfS2V5X2FsbG9jX3R5cGUoX19hKSkKKyAgICAgICAgeyBfTV90Ll9NX2luc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJU11bHRpc2V0IGNvcHkgY29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJW11bHRpc2V0IG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICVtdWx0aXNldCB1c2VzIGEgY29weSBvZiB0aGUgYWxsb2NhdGlvbiBvYmplY3QgdXNlZAorICAgICAgICogIGJ5IEBhIF9feC4KKyAgICAgICAqLworICAgICAgbXVsdGlzZXQoY29uc3QgbXVsdGlzZXQmIF9feCkKKyAgICAgIDogX01fdChfX3guX01fdCkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJU11bHRpc2V0IG1vdmUgY29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJW11bHRpc2V0IG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICVtdWx0aXNldCBjb250YWlucyB0aGUgZXhhY3QgY29udGVudHMgb2YgQGEgX194LgorICAgICAgICogIFRoZSBjb250ZW50cyBvZiBAYSBfX3ggYXJlIGEgdmFsaWQsIGJ1dCB1bnNwZWNpZmllZCAlbXVsdGlzZXQuCisgICAgICAgKi8KKyAgICAgIG11bHRpc2V0KG11bHRpc2V0JiYgX194KQorICAgICAgbm9leGNlcHQoaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8X0NvbXBhcmU+Ojp2YWx1ZSkKKyAgICAgIDogX01fdChzdGQ6Om1vdmUoX194Ll9NX3QpKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlbXVsdGlzZXQgZnJvbSBhbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICogIEBwYXJhbSAgX19sICBBbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICogIEBwYXJhbSAgX19jb21wICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGEgJW11bHRpc2V0IGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBmcm9tCisgICAgICAgKiAgdGhlIGxpc3QuICBUaGlzIGlzIGxpbmVhciBpbiBOIGlmIHRoZSBsaXN0IGlzIGFscmVhZHkgc29ydGVkLAorICAgICAgICogIGFuZCBObG9nTiBvdGhlcndpc2UgKHdoZXJlIE4gaXMgQGEgX19sLnNpemUoKSkuCisgICAgICAgKi8KKyAgICAgIG11bHRpc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCSAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX3QoX19jb21wLCBfS2V5X2FsbG9jX3R5cGUoX19hKSkKKyAgICAgIHsgX01fdC5fTV9pbnNlcnRfZXF1YWwoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVNdWx0aXNldCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX194ICBBICVtdWx0aXNldCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBBbGwgdGhlIGVsZW1lbnRzIG9mIEBhIF9feCBhcmUgY29waWVkLCBidXQgdW5saWtlIHRoZSBjb3B5CisgICAgICAgKiAgY29uc3RydWN0b3IsIHRoZSBhbGxvY2F0b3Igb2JqZWN0IGlzIG5vdCBjb3BpZWQuCisgICAgICAgKi8KKyAgICAgIG11bHRpc2V0JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IG11bHRpc2V0JiBfX3gpCisgICAgICB7CisJX01fdCA9IF9feC5fTV90OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJU11bHRpc2V0IG1vdmUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSAlbXVsdGlzZXQgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGNvbnRlbnRzIG9mIEBhIF9feCBhcmUgbW92ZWQgaW50byB0aGlzICVtdWx0aXNldAorICAgICAgICogICh3aXRob3V0IGNvcHlpbmcpLiAgQGEgX194IGlzIGEgdmFsaWQsIGJ1dCB1bnNwZWNpZmllZAorICAgICAgICogICVtdWx0aXNldC4KKyAgICAgICAqLworICAgICAgbXVsdGlzZXQmCisgICAgICBvcGVyYXRvcj0obXVsdGlzZXQmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPnN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJU11bHRpc2V0IGxpc3QgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhICVtdWx0aXNldCB3aXRoIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlCisgICAgICAgKiAgaW5pdGlhbGl6ZXIgbGlzdCBAYSBfX2wuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgYXNzaWdubWVudCBjb21wbGV0ZWx5IGNoYW5nZXMgdGhlICVtdWx0aXNldCBhbmQKKyAgICAgICAqICB0aGF0IHRoZSByZXN1bHRpbmcgJW11bHRpc2V0J3Mgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyCisgICAgICAgKiAgb2YgZWxlbWVudHMgYXNzaWduZWQuICBPbGQgZGF0YSBtYXkgYmUgbG9zdC4KKyAgICAgICAqLworICAgICAgbXVsdGlzZXQmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vIGFjY2Vzc29yczoKKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBjb21wYXJpc29uIG9iamVjdC4KKyAgICAgIGtleV9jb21wYXJlCisgICAgICBrZXlfY29tcCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmtleV9jb21wKCk7IH0KKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgY29tcGFyaXNvbiBvYmplY3QuCisgICAgICB2YWx1ZV9jb21wYXJlCisgICAgICB2YWx1ZV9jb21wKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3Qua2V5X2NvbXAoKTsgfQorICAgICAgLy8vICBSZXR1cm5zIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBvYmplY3QuCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBhbGxvY2F0b3JfdHlwZShfTV90LmdldF9hbGxvY2F0b3IoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICVtdWx0aXNldC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlcgorICAgICAgICogIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAlbXVsdGlzZXQuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBhc2NlbmRpbmcgb3JkZXIKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5lbmQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUKKyAgICAgICAqICBsYXN0IGVsZW1lbnQgaW4gdGhlICVtdWx0aXNldC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGRlc2NlbmRpbmcgb3JkZXIKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGxhc3QgZWxlbWVudCBpbiB0aGUgJW11bHRpc2V0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gZGVzY2VuZGluZyBvcmRlcgorICAgICAgICogIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LnJlbmQoKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICVtdWx0aXNldC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlcgorICAgICAgICogIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJW11bHRpc2V0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyCisgICAgICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV90LmVuZCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGxhc3QgZWxlbWVudCBpbiB0aGUgJW11bHRpc2V0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gZGVzY2VuZGluZyBvcmRlcgorICAgICAgICogIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGxhc3QgZWxlbWVudCBpbiB0aGUgJW11bHRpc2V0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gZGVzY2VuZGluZyBvcmRlcgorICAgICAgICogIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KKyNlbmRpZgorCisgICAgICAvLy8gIFJldHVybnMgdHJ1ZSBpZiB0aGUgJXNldCBpcyBlbXB0eS4KKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3QuZW1wdHkoKTsgfQorCisgICAgICAvLy8gIFJldHVybnMgdGhlIHNpemUgb2YgdGhlICVzZXQuCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5zaXplKCk7IH0KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlICVzZXQuCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3QubWF4X3NpemUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN3YXBzIGRhdGEgd2l0aCBhbm90aGVyICVtdWx0aXNldC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSAlbXVsdGlzZXQgb2YgdGhlIHNhbWUgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGV4Y2hhbmdlcyB0aGUgZWxlbWVudHMgYmV0d2VlbiB0d28gbXVsdGlzZXRzIGluIGNvbnN0YW50IHRpbWUuCisgICAgICAgKiAgKEl0IGlzIG9ubHkgc3dhcHBpbmcgYSBwb2ludGVyLCBhbiBpbnRlZ2VyLCBhbmQgYW4gaW5zdGFuY2Ugb2YgdGhlIEBjCisgICAgICAgKiAgQ29tcGFyZSB0eXBlICh3aGljaCBpdHNlbGYgaXMgb2Z0ZW4gc3RhdGVsZXNzIGFuZCBlbXB0eSksIHNvIGl0IHNob3VsZAorICAgICAgICogIGJlIHF1aXRlIGZhc3QuKQorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZ2xvYmFsIHN0ZDo6c3dhcCgpIGZ1bmN0aW9uIGlzIHNwZWNpYWxpemVkIHN1Y2ggdGhhdAorICAgICAgICogIHN0ZDo6c3dhcChzMSxzMikgd2lsbCBmZWVkIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAobXVsdGlzZXQmIF9feCkKKyAgICAgIHsgX01fdC5zd2FwKF9feC5fTV90KTsgfQorCisgICAgICAvLyBpbnNlcnQvZXJhc2UKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQnVpbGRzIGFuZCBpbnNlcnRzIGFuIGVsZW1lbnQgaW50byB0aGUgJW11bHRpc2V0LgorICAgICAgICogIEBwYXJhbSAgX19hcmdzICBBcmd1bWVudHMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZWxlbWVudCBpbnN0YW5jZSB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgIGluc2VydGVkLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIGVsZW1lbnQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaW5zZXJ0cyBhbiBlbGVtZW50IGludG8gdGhlICVtdWx0aXNldC4gIENvbnRyYXJ5CisgICAgICAgKiAgdG8gYSBzdGQ6OnNldCB0aGUgJW11bHRpc2V0IGRvZXMgbm90IHJlbHkgb24gdW5pcXVlIGtleXMgYW5kIHRodXMKKyAgICAgICAqICBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgZWxlbWVudCBjYW4gYmUgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBsb2dhcml0aG1pYyB0aW1lLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyByZXR1cm4gX01fdC5fTV9lbXBsYWNlX2VxdWFsKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEJ1aWxkcyBhbmQgaW5zZXJ0cyBhbiBlbGVtZW50IGludG8gdGhlICVtdWx0aXNldC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBBbiBpdGVyYXRvciB0aGF0IHNlcnZlcyBhcyBhIGhpbnQgYXMgdG8gd2hlcmUgdGhlCisgICAgICAgKiAgICAgICAgICAgICAgICBlbGVtZW50IHNob3VsZCBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIF9fYXJncyAgQXJndW1lbnRzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGVsZW1lbnQgaW5zdGFuY2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBpbnNlcnRlZCBlbGVtZW50LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGluc2VydHMgYW4gZWxlbWVudCBpbnRvIHRoZSAlbXVsdGlzZXQuICBDb250cmFyeQorICAgICAgICogIHRvIGEgc3RkOjpzZXQgdGhlICVtdWx0aXNldCBkb2VzIG5vdCByZWx5IG9uIHVuaXF1ZSBrZXlzIGFuZCB0aHVzCisgICAgICAgKiAgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIGVsZW1lbnQgY2FuIGJlIGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBvbmx5IGEgaGludCBhbmQgY2FuIHBvdGVudGlhbGx5CisgICAgICAgKiAgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGluc2VydGlvbiBwcm9jZXNzLiAgQSBiYWQgaGludCB3b3VsZAorICAgICAgICogIGNhdXNlIG5vIGdhaW5zIGluIGVmZmljaWVuY3kuCisgICAgICAgKgorICAgICAgICogIFNlZSBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDA3Y2gxNy5odG1sCisgICAgICAgKiAgZm9yIG1vcmUgb24gQGEgaGludGluZy4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGxvZ2FyaXRobWljIHRpbWUgKGlmIHRoZSBoaW50IGlzIG5vdCB0YWtlbikuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICByZXR1cm4gX01fdC5fTV9lbXBsYWNlX2hpbnRfZXF1YWwoX19wb3MsCisJCQkJCSAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCX0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgSW5zZXJ0cyBhbiBlbGVtZW50IGludG8gdGhlICVtdWx0aXNldC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRWxlbWVudCB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBpbnNlcnRlZCBlbGVtZW50LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGluc2VydHMgYW4gZWxlbWVudCBpbnRvIHRoZSAlbXVsdGlzZXQuICBDb250cmFyeQorICAgICAgICogIHRvIGEgc3RkOjpzZXQgdGhlICVtdWx0aXNldCBkb2VzIG5vdCByZWx5IG9uIHVuaXF1ZSBrZXlzIGFuZCB0aHVzCisgICAgICAgKiAgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIGVsZW1lbnQgY2FuIGJlIGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRpb24gcmVxdWlyZXMgbG9nYXJpdGhtaWMgdGltZS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90Ll9NX2luc2VydF9lcXVhbChfX3gpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90Ll9NX2luc2VydF9lcXVhbChzdGQ6Om1vdmUoX194KSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgSW5zZXJ0cyBhbiBlbGVtZW50IGludG8gdGhlICVtdWx0aXNldC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIHRoYXQgc2VydmVzIGFzIGEgaGludCBhcyB0byB3aGVyZSB0aGUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICBlbGVtZW50IHNob3VsZCBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRWxlbWVudCB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBpbnNlcnRlZCBlbGVtZW50LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGluc2VydHMgYW4gZWxlbWVudCBpbnRvIHRoZSAlbXVsdGlzZXQuICBDb250cmFyeQorICAgICAgICogIHRvIGEgc3RkOjpzZXQgdGhlICVtdWx0aXNldCBkb2VzIG5vdCByZWx5IG9uIHVuaXF1ZSBrZXlzIGFuZCB0aHVzCisgICAgICAgKiAgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIGVsZW1lbnQgY2FuIGJlIGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBvbmx5IGEgaGludCBhbmQgY2FuIHBvdGVudGlhbGx5CisgICAgICAgKiAgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGluc2VydGlvbiBwcm9jZXNzLiAgQSBiYWQgaGludCB3b3VsZAorICAgICAgICogIGNhdXNlIG5vIGdhaW5zIGluIGVmZmljaWVuY3kuCisgICAgICAgKgorICAgICAgICogIFNlZSBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDA3Y2gxNy5odG1sCisgICAgICAgKiAgZm9yIG1vcmUgb24gQGEgaGludGluZy4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGxvZ2FyaXRobWljIHRpbWUgKGlmIHRoZSBoaW50IGlzIG5vdCB0YWtlbikuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5fTV9pbnNlcnRfZXF1YWxfKF9fcG9zaXRpb24sIF9feCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgdmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuX01faW5zZXJ0X2VxdWFsXyhfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194KSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQSB0ZW1wbGF0ZSBmdW5jdGlvbiB0aGF0IHRyaWVzIHRvIGluc2VydCBhIHJhbmdlIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlLgorICAgICAgICoKKyAgICAgICAqICBDb21wbGV4aXR5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgcmFuZ2UgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsgX01fdC5fTV9pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGluc2VydCBhIGxpc3Qgb2YgZWxlbWVudHMgaW50byB0aGUgJW11bHRpc2V0LgorICAgICAgICogIEBwYXJhbSAgX19sICBBIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBvZiBlbGVtZW50cworICAgICAgICogICAgICAgICAgICAgICB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqCisgICAgICAgKiAgQ29tcGxleGl0eSBzaW1pbGFyIHRvIHRoYXQgb2YgdGhlIHJhbmdlIGNvbnN0cnVjdG9yLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IHRoaXMtPmluc2VydChfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAxMzAuIEFzc29jaWF0aXZlIGVyYXNlIHNob3VsZCByZXR1cm4gYW4gaXRlcmF0b3IuCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGFuIGVsZW1lbnQgZnJvbSBhICVtdWx0aXNldC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IGltbWVkaWF0ZWx5IGZvbGxvd2luZworICAgICAgICogICAgICAgICAgQGEgcG9zaXRpb24gcHJpb3IgdG8gdGhlIGVsZW1lbnQgYmVpbmcgZXJhc2VkLiBJZiBubyBzdWNoIAorICAgICAgICogICAgICAgICAgZWxlbWVudCBleGlzdHMsIGVuZCgpIGlzIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhbiBlbGVtZW50LCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBpdGVyYXRvciwKKyAgICAgICAqICBmcm9tIGEgJW11bHRpc2V0LiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsCisgICAgICAgKiAgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzCisgICAgICAgKiAgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MKKyAgICAgICAqICByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgX0dMSUJDWFhfQUJJX1RBR19DWFgxMQorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IHJldHVybiBfTV90LmVyYXNlKF9fcG9zaXRpb24pOyB9CisjZWxzZQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhbiBlbGVtZW50IGZyb20gYSAlbXVsdGlzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZWxlbWVudCB0byBiZSBlcmFzZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGFuIGVsZW1lbnQsIHBvaW50ZWQgdG8gYnkgdGhlIGdpdmVuIGl0ZXJhdG9yLAorICAgICAgICogIGZyb20gYSAlbXVsdGlzZXQuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwKKyAgICAgICAqICBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMKKyAgICAgICAqICBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncworICAgICAgICogIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyBfTV90LmVyYXNlKF9fcG9zaXRpb24pOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBlbGVtZW50cyBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IG9mIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgZXJhc2VkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhbGwgZWxlbWVudHMgbG9jYXRlZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20gYQorICAgICAgICogICVtdWx0aXNldC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYKKyAgICAgICAqICB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQKKyAgICAgICAqICBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5lcmFzZShfX3gpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAxMzAuIEFzc29jaWF0aXZlIGVyYXNlIHNob3VsZCByZXR1cm4gYW4gaXRlcmF0b3IuCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGEgW2ZpcnN0LGxhc3QpIHJhbmdlIG9mIGVsZW1lbnRzIGZyb20gYSAlbXVsdGlzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgICBlcmFzZWQuCisgICAgICAgKiAgQHBhcmFtIF9fbGFzdCBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSByYW5nZSB0bworICAgICAgICogICAgICAgICAgICAgICAgYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gVGhlIGl0ZXJhdG9yIEBhIGxhc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMgZnJvbSBhICVtdWx0aXNldC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmCisgICAgICAgKiAgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90CisgICAgICAgKiAgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncworICAgICAgICogIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBfR0xJQkNYWF9BQklfVEFHX0NYWDExCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyByZXR1cm4gX01fdC5lcmFzZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZWxzZQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhIFtmaXJzdCxsYXN0KSByYW5nZSBvZiBlbGVtZW50cyBmcm9tIGEgJW11bHRpc2V0LgorICAgICAgICogIEBwYXJhbSAgZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICBlcmFzZWQuCisgICAgICAgKiAgQHBhcmFtICBsYXN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSByYW5nZSB0byBiZSBlcmFzZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMgZnJvbSBhICVtdWx0aXNldC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmCisgICAgICAgKiAgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90CisgICAgICAgKiAgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncworICAgICAgICogIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7IF9NX3QuZXJhc2UoX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEVyYXNlcyBhbGwgZWxlbWVudHMgaW4gYSAlbXVsdGlzZXQuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5CisgICAgICAgKiAgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLAorICAgICAgICogIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIKKyAgICAgICAqICBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9NX3QuY2xlYXIoKTsgfQorCisgICAgICAvLyBtdWx0aXNldCBvcGVyYXRpb25zOgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IG9mIGVsZW1lbnRzIHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgd2l0aCBzcGVjaWZpZWQga2V5LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmNvdW50KF9feCk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjE0LiAgc2V0OjpmaW5kKCkgbWlzc2luZyBjb25zdCBvdmVybG9hZAorICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFRyaWVzIHRvIGxvY2F0ZSBhbiBlbGVtZW50IGluIGEgJXNldC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRWxlbWVudCB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHNvdWdodC1hZnRlciBlbGVtZW50LCBvciBlbmQoKSBpZiBub3QKKyAgICAgICAqICAgICAgICAgICBmb3VuZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGtleSBhbmQgdHJpZXMgdG8gbG9jYXRlIHRoZSBlbGVtZW50IHdpdGggd2hpY2gKKyAgICAgICAqICB0aGUga2V5IG1hdGNoZXMuICBJZiBzdWNjZXNzZnVsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIGl0ZXJhdG9yCisgICAgICAgKiAgcG9pbnRpbmcgdG8gdGhlIHNvdWdodCBhZnRlciBlbGVtZW50LiAgSWYgdW5zdWNjZXNzZnVsIGl0IHJldHVybnMgdGhlCisgICAgICAgKiAgcGFzdC10aGUtZW5kICggQGMgZW5kKCkgKSBpdGVyYXRvci4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuZmluZChfX3gpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmZpbmQoX194KTsgfQorICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgdGhlIGJlZ2lubmluZyBvZiBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gZmlyc3QgZWxlbWVudCBlcXVhbCB0byBvciBncmVhdGVyCisgICAgICAgKiAgICAgICAgICAgdGhhbiBrZXksIG9yIGVuZCgpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBzdWJzZXF1ZW5jZSBvZiBlbGVtZW50cworICAgICAgICogIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4ga2V5LiAgSWYgdW5zdWNjZXNzZnVsIGl0IHJldHVybnMgYW4gaXRlcmF0b3IKKyAgICAgICAqICBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGhhcyBhIGdyZWF0ZXIgdmFsdWUgdGhhbiBnaXZlbiBrZXkKKyAgICAgICAqICBvciBlbmQoKSBpZiBubyBzdWNoIGVsZW1lbnQgZXhpc3RzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QubG93ZXJfYm91bmQoX194KTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QubG93ZXJfYm91bmQoX194KTsgfQorICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgdGhlIGVuZCBvZiBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudAorICAgICAgICogICAgICAgICAgZ3JlYXRlciB0aGFuIGtleSwgb3IgZW5kKCkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC51cHBlcl9ib3VuZChfX3gpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC51cHBlcl9ib3VuZChfX3gpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgUGFpciBvZiBpdGVyYXRvcnMgdGhhdCBwb3NzaWJseSBwb2ludHMgdG8gdGhlIHN1YnNlcXVlbmNlCisgICAgICAgKiAgICAgICAgICAgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgICAqICBAY29kZQorICAgICAgICogICAgc3RkOjptYWtlX3BhaXIoYy5sb3dlcl9ib3VuZCh2YWwpLAorICAgICAgICogICAgICAgICAgICAgICAgICAgYy51cHBlcl9ib3VuZCh2YWwpKQorICAgICAgICogIEBlbmRjb2RlCisgICAgICAgKiAgKGJ1dCBpcyBmYXN0ZXIgdGhhbiBtYWtpbmcgdGhlIGNhbGxzIHNlcGFyYXRlbHkpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHByb2JhYmx5IG9ubHkgbWFrZXMgc2Vuc2UgZm9yIG11bHRpc2V0cy4KKyAgICAgICAqLworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90LmVxdWFsX3JhbmdlKF9feCk7IH0KKworICAgICAgc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmVxdWFsX3JhbmdlKF9feCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0sxLCB0eXBlbmFtZSBfQzEsIHR5cGVuYW1lIF9BMT4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I9PShjb25zdCBtdWx0aXNldDxfSzEsIF9DMSwgX0ExPiYsCisJCSAgIGNvbnN0IG11bHRpc2V0PF9LMSwgX0MxLCBfQTE+Jik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LMSwgdHlwZW5hbWUgX0MxLCB0eXBlbmFtZSBfQTE+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPCAoY29uc3QgbXVsdGlzZXQ8X0sxLCBfQzEsIF9BMT4mLAorCQkgICBjb25zdCBtdWx0aXNldDxfSzEsIF9DMSwgX0ExPiYpOworICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIE11bHRpc2V0IGVxdWFsaXR5IGNvbXBhcmlzb24uCisgICAqICBAcGFyYW0gIF9feCAgQSAlbXVsdGlzZXQuCisgICAqICBAcGFyYW0gIF9feSAgQSAlbXVsdGlzZXQgb2YgdGhlIHNhbWUgdHlwZSBhcyBAYSBfX3guCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiB0aGUgc2l6ZSBhbmQgZWxlbWVudHMgb2YgdGhlIG11bHRpc2V0cyBhcmUgZXF1YWwuCisgICAqCisgICAqICBUaGlzIGlzIGFuIGVxdWl2YWxlbmNlIHJlbGF0aW9uLiAgSXQgaXMgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZQorICAgKiAgbXVsdGlzZXRzLgorICAgKiAgTXVsdGlzZXRzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgaWYgdGhlaXIgc2l6ZXMgYXJlIGVxdWFsLCBhbmQgaWYKKyAgICogIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgY29tcGFyZSBlcXVhbC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fdCA9PSBfX3kuX01fdDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBNdWx0aXNldCBvcmRlcmluZyByZWxhdGlvbi4KKyAgICogIEBwYXJhbSAgX194ICBBICVtdWx0aXNldC4KKyAgICogIEBwYXJhbSAgX195ICBBICVtdWx0aXNldCBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIF9feC4KKyAgICogIEByZXR1cm4gIFRydWUgaWZmIEBhIF9feCBpcyBsZXhpY29ncmFwaGljYWxseSBsZXNzIHRoYW4gQGEgX195LgorICAgKgorICAgKiAgVGhpcyBpcyBhIHRvdGFsIG9yZGVyaW5nIHJlbGF0aW9uLiAgSXQgaXMgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZQorICAgKiAgbWFwcy4gIFRoZSBlbGVtZW50cyBtdXN0IGJlIGNvbXBhcmFibGUgd2l0aCBAYyA8LgorICAgKgorICAgKiAgU2VlIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoKSBmb3IgaG93IHRoZSBkZXRlcm1pbmF0aW9uIGlzIG1hZGUuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgICAgICBjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV90IDwgX195Ll9NX3Q7IH0KKworICAvLy8gIFJldHVybnMgISh4ID09IHkpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICAvLy8gIFJldHVybnMgeSA8IHguCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgbXVsdGlzZXQ8X0tleSxfQ29tcGFyZSxfQWxsb2M+JiBfX3gsCisJICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSxfQ29tcGFyZSxfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgLy8vICBSZXR1cm5zICEoeSA8IHgpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgLy8vICBSZXR1cm5zICEoeCA8IHkpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyAgLy8vIFNlZSBzdGQ6Om11bHRpc2V0Ojpzd2FwKCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisJIG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8qIF9TVExfTVVMVElTRVRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9udW1lcmljLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX251bWVyaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTg4YzFiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9udW1lcmljLmgKQEAgLTAsMCArMSwzODcgQEAKKy8vIE51bWVyaWMgZnVuY3Rpb25zIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9udW1lcmljLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtudW1lcmljfQorICovCisKKyNpZm5kZWYgX1NUTF9OVU1FUklDX0gKKyNkZWZpbmUgX1NUTF9OVU1FUklDX0ggMQorCisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKyNpbmNsdWRlIDxiaXRzL21vdmUuaD4gLy8gRm9yIF9HTElCQ1hYX01PVkUKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmICBDcmVhdGUgYSByYW5nZSBvZiBzZXF1ZW50aWFsbHkgaW5jcmVhc2luZyB2YWx1ZXMuCisgICAqCisgICAqICBGb3IgZWFjaCBlbGVtZW50IGluIHRoZSByYW5nZSBAcCBbZmlyc3QsbGFzdCkgYXNzaWducyBAcCB2YWx1ZSBhbmQKKyAgICogIGluY3JlbWVudHMgQHAgdmFsdWUgYXMgaWYgYnkgQHAgKyt2YWx1ZS4KKyAgICoKKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgRW5kIG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX3ZhbHVlICBTdGFydGluZyB2YWx1ZS4KKyAgICogIEByZXR1cm4gIE5vdGhpbmcuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIGlvdGEoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgX1RwIF9fdmFsdWUpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVHAsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJeworCSAgKl9fZmlyc3QgPSBfX3ZhbHVlOworCSAgKytfX3ZhbHVlOworCX0KKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9BTEdPCisKKyAgLyoqCisgICAqICBAYnJpZWYgIEFjY3VtdWxhdGUgdmFsdWVzIGluIGEgcmFuZ2UuCisgICAqCisgICAqICBBY2N1bXVsYXRlcyB0aGUgdmFsdWVzIGluIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkgdXNpbmcgb3BlcmF0b3IrKCkuICBUaGUKKyAgICogIGluaXRpYWwgdmFsdWUgaXMgQGEgaW5pdC4gIFRoZSB2YWx1ZXMgYXJlIHByb2Nlc3NlZCBpbiBvcmRlci4KKyAgICoKKyAgICogIEBwYXJhbSAgX19maXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgRW5kIG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2luaXQgIFN0YXJ0aW5nIHZhbHVlIHRvIGFkZCBvdGhlciB2YWx1ZXMgdG8uCisgICAqICBAcmV0dXJuICBUaGUgZmluYWwgc3VtLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgYWNjdW11bGF0ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIF9UcCBfX2luaXQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCV9faW5pdCA9IF9faW5pdCArICpfX2ZpcnN0OworICAgICAgcmV0dXJuIF9faW5pdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEFjY3VtdWxhdGUgdmFsdWVzIGluIGEgcmFuZ2Ugd2l0aCBvcGVyYXRpb24uCisgICAqCisgICAqICBBY2N1bXVsYXRlcyB0aGUgdmFsdWVzIGluIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkgdXNpbmcgdGhlIGZ1bmN0aW9uCisgICAqICBvYmplY3QgQHAgX19iaW5hcnlfb3AuICBUaGUgaW5pdGlhbCB2YWx1ZSBpcyBAcCBfX2luaXQuICBUaGUgdmFsdWVzIGFyZQorICAgKiAgcHJvY2Vzc2VkIGluIG9yZGVyLgorICAgKgorICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBTdGFydCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgX19sYXN0ICBFbmQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9faW5pdCAgU3RhcnRpbmcgdmFsdWUgdG8gYWRkIG90aGVyIHZhbHVlcyB0by4KKyAgICogIEBwYXJhbSAgX19iaW5hcnlfb3AgIEZ1bmN0aW9uIG9iamVjdCB0byBhY2N1bXVsYXRlIHdpdGguCisgICAqICBAcmV0dXJuICBUaGUgZmluYWwgc3VtLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbj4KKyAgICBpbmxpbmUgX1RwCisgICAgYWNjdW11bGF0ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIF9UcCBfX2luaXQsCisJICAgICAgIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3ApCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCV9faW5pdCA9IF9fYmluYXJ5X29wKF9faW5pdCwgKl9fZmlyc3QpOworICAgICAgcmV0dXJuIF9faW5pdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbXB1dGUgaW5uZXIgcHJvZHVjdCBvZiB0d28gcmFuZ2VzLgorICAgKgorICAgKiAgU3RhcnRpbmcgd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mIEBwIF9faW5pdCwgbXVsdGlwbGllcyBzdWNjZXNzaXZlCisgICAqICBlbGVtZW50cyBmcm9tIHRoZSB0d28gcmFuZ2VzIGFuZCBhZGRzIGVhY2ggcHJvZHVjdCBpbnRvIHRoZSBhY2N1bXVsYXRlZAorICAgKiAgdmFsdWUgdXNpbmcgb3BlcmF0b3IrKCkuICBUaGUgdmFsdWVzIGluIHRoZSByYW5nZXMgYXJlIHByb2Nlc3NlZCBpbgorICAgKiAgb3JkZXIuCisgICAqCisgICAqICBAcGFyYW0gIF9fZmlyc3QxICBTdGFydCBvZiByYW5nZSAxLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICBFbmQgb2YgcmFuZ2UgMS4KKyAgICogIEBwYXJhbSAgX19maXJzdDIgIFN0YXJ0IG9mIHJhbmdlIDIuCisgICAqICBAcGFyYW0gIF9faW5pdCAgU3RhcnRpbmcgdmFsdWUgdG8gYWRkIG90aGVyIHZhbHVlcyB0by4KKyAgICogIEByZXR1cm4gIFRoZSBmaW5hbCBpbm5lciBwcm9kdWN0LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjIsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgaW5uZXJfcHJvZHVjdChfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCQkgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX1RwIF9faW5pdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjI+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKworICAgICAgZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19maXJzdDEsICsrX19maXJzdDIpCisJX19pbml0ID0gX19pbml0ICsgKCpfX2ZpcnN0MSAqICpfX2ZpcnN0Mik7CisgICAgICByZXR1cm4gX19pbml0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgQ29tcHV0ZSBpbm5lciBwcm9kdWN0IG9mIHR3byByYW5nZXMuCisgICAqCisgICAqICBTdGFydGluZyB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgQHAgX19pbml0LCBhcHBsaWVzIEBwIF9fYmluYXJ5X29wMiB0bworICAgKiAgc3VjY2Vzc2l2ZSBlbGVtZW50cyBmcm9tIHRoZSB0d28gcmFuZ2VzIGFuZCBhY2N1bXVsYXRlcyBlYWNoIHJlc3VsdCBpbnRvCisgICAqICB0aGUgYWNjdW11bGF0ZWQgdmFsdWUgdXNpbmcgQHAgX19iaW5hcnlfb3AxLiAgVGhlIHZhbHVlcyBpbiB0aGUgcmFuZ2VzIGFyZQorICAgKiAgcHJvY2Vzc2VkIGluIG9yZGVyLgorICAgKgorICAgKiAgQHBhcmFtICBfX2ZpcnN0MSAgU3RhcnQgb2YgcmFuZ2UgMS4KKyAgICogIEBwYXJhbSAgX19sYXN0MSAgRW5kIG9mIHJhbmdlIDEuCisgICAqICBAcGFyYW0gIF9fZmlyc3QyICBTdGFydCBvZiByYW5nZSAyLgorICAgKiAgQHBhcmFtICBfX2luaXQgIFN0YXJ0aW5nIHZhbHVlIHRvIGFkZCBvdGhlciB2YWx1ZXMgdG8uCisgICAqICBAcGFyYW0gIF9fYmluYXJ5X29wMSAgRnVuY3Rpb24gb2JqZWN0IHRvIGFjY3VtdWxhdGUgd2l0aC4KKyAgICogIEBwYXJhbSAgX19iaW5hcnlfb3AyICBGdW5jdGlvbiBvYmplY3QgdG8gYXBwbHkgdG8gcGFpcnMgb2YgaW5wdXQgdmFsdWVzLgorICAgKiAgQHJldHVybiAgVGhlIGZpbmFsIGlubmVyIHByb2R1Y3QuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlPcGVyYXRpb24xLCB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uMj4KKyAgICBpbmxpbmUgX1RwCisgICAgaW5uZXJfcHJvZHVjdChfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCQkgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX1RwIF9faW5pdCwKKwkJICBfQmluYXJ5T3BlcmF0aW9uMSBfX2JpbmFyeV9vcDEsCisJCSAgX0JpbmFyeU9wZXJhdGlvbjIgX19iaW5hcnlfb3AyKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpOworCisgICAgICBmb3IgKDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikKKwlfX2luaXQgPSBfX2JpbmFyeV9vcDEoX19pbml0LCBfX2JpbmFyeV9vcDIoKl9fZmlyc3QxLCAqX19maXJzdDIpKTsKKyAgICAgIHJldHVybiBfX2luaXQ7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZXR1cm4gbGlzdCBvZiBwYXJ0aWFsIHN1bXMKKyAgICoKKyAgICogIEFjY3VtdWxhdGVzIHRoZSB2YWx1ZXMgaW4gdGhlIHJhbmdlIFtmaXJzdCxsYXN0KSB1c2luZyB0aGUgQGMgKyBvcGVyYXRvci4KKyAgICogIEFzIGVhY2ggc3VjY2Vzc2l2ZSBpbnB1dCB2YWx1ZSBpcyBhZGRlZCBpbnRvIHRoZSB0b3RhbCwgdGhhdCBwYXJ0aWFsIHN1bQorICAgKiAgaXMgd3JpdHRlbiB0byBAcCBfX3Jlc3VsdC4gIFRoZXJlZm9yZSwgdGhlIGZpcnN0IHZhbHVlIGluIEBwIF9fcmVzdWx0IGlzCisgICAqICB0aGUgZmlyc3QgdmFsdWUgb2YgdGhlIGlucHV0LCB0aGUgc2Vjb25kIHZhbHVlIGluIEBwIF9fcmVzdWx0IGlzIHRoZSBzdW0KKyAgICogIG9mIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGlucHV0IHZhbHVlcywgYW5kIHNvIG9uLgorICAgKgorICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBTdGFydCBvZiBpbnB1dCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19sYXN0ICBFbmQgb2YgaW5wdXQgcmFuZ2UuCisgICAqICBAcGFyYW0gIF9fcmVzdWx0ICBPdXRwdXQgc3VtLgorICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcG9pbnRpbmcganVzdCBiZXlvbmQgdGhlIHZhbHVlcyB3cml0dGVuIHRvIF9fcmVzdWx0LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBwYXJ0aWFsX3N1bShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCV9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICBfVmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIF9fcmVzdWx0OworICAgICAgX1ZhbHVlVHlwZSBfX3ZhbHVlID0gKl9fZmlyc3Q7CisgICAgICAqX19yZXN1bHQgPSBfX3ZhbHVlOworICAgICAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCisJeworCSAgX192YWx1ZSA9IF9fdmFsdWUgKyAqX19maXJzdDsKKwkgICorK19fcmVzdWx0ID0gX192YWx1ZTsKKwl9CisgICAgICByZXR1cm4gKytfX3Jlc3VsdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBsaXN0IG9mIHBhcnRpYWwgc3VtcworICAgKgorICAgKiAgQWNjdW11bGF0ZXMgdGhlIHZhbHVlcyBpbiB0aGUgcmFuZ2UgW2ZpcnN0LGxhc3QpIHVzaW5nIEBwIF9fYmluYXJ5X29wLgorICAgKiAgQXMgZWFjaCBzdWNjZXNzaXZlIGlucHV0IHZhbHVlIGlzIGFkZGVkIGludG8gdGhlIHRvdGFsLCB0aGF0IHBhcnRpYWwgc3VtCisgICAqICBpcyB3cml0dGVuIHRvIEBwIF9fcmVzdWx0LiAgVGhlcmVmb3JlLCB0aGUgZmlyc3QgdmFsdWUgaW4gQHAgX19yZXN1bHQgaXMKKyAgICogIHRoZSBmaXJzdCB2YWx1ZSBvZiB0aGUgaW5wdXQsIHRoZSBzZWNvbmQgdmFsdWUgaW4gQHAgX19yZXN1bHQgaXMgdGhlIHN1bQorICAgKiAgb2YgdGhlIGZpcnN0IGFuZCBzZWNvbmQgaW5wdXQgdmFsdWVzLCBhbmQgc28gb24uCisgICAqCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIFN0YXJ0IG9mIGlucHV0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QgIEVuZCBvZiBpbnB1dCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19yZXN1bHQgIE91dHB1dCBzdW0uCisgICAqICBAcGFyYW0gIF9fYmluYXJ5X29wICBGdW5jdGlvbiBvYmplY3QuCisgICAqICBAcmV0dXJuICBJdGVyYXRvciBwb2ludGluZyBqdXN0IGJleW9uZCB0aGUgdmFsdWVzIHdyaXR0ZW4gdG8gX19yZXN1bHQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlPcGVyYXRpb24+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgcGFydGlhbF9zdW0oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQlfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3ApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgX1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX3Jlc3VsdDsKKyAgICAgIF9WYWx1ZVR5cGUgX192YWx1ZSA9ICpfX2ZpcnN0OworICAgICAgKl9fcmVzdWx0ID0gX192YWx1ZTsKKyAgICAgIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgIF9fdmFsdWUgPSBfX2JpbmFyeV9vcChfX3ZhbHVlLCAqX19maXJzdCk7CisJICAqKytfX3Jlc3VsdCA9IF9fdmFsdWU7CisJfQorICAgICAgcmV0dXJuICsrX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZXR1cm4gZGlmZmVyZW5jZXMgYmV0d2VlbiBhZGphY2VudCB2YWx1ZXMuCisgICAqCisgICAqICBDb21wdXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGFkamFjZW50IHZhbHVlcyBpbiB0aGUgcmFuZ2UKKyAgICogIFtmaXJzdCxsYXN0KSB1c2luZyBvcGVyYXRvci0oKSBhbmQgd3JpdGVzIHRoZSByZXN1bHQgdG8gQHAgX19yZXN1bHQuCisgICAqCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIFN0YXJ0IG9mIGlucHV0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QgIEVuZCBvZiBpbnB1dCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19yZXN1bHQgIE91dHB1dCBzdW1zLgorICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcG9pbnRpbmcganVzdCBiZXlvbmQgdGhlIHZhbHVlcyB3cml0dGVuIHRvIHJlc3VsdC4KKyAgICoKKyAgICogIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICogIERSIDUzOS4gcGFydGlhbF9zdW0gYW5kIGFkamFjZW50X2RpZmZlcmVuY2Ugc2hvdWxkIG1lbnRpb24gcmVxdWlyZW1lbnRzCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIGFkamFjZW50X2RpZmZlcmVuY2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKwkJCV9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgIF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gX19yZXN1bHQ7CisgICAgICBfVmFsdWVUeXBlIF9fdmFsdWUgPSAqX19maXJzdDsKKyAgICAgICpfX3Jlc3VsdCA9IF9fdmFsdWU7CisgICAgICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICBfVmFsdWVUeXBlIF9fdG1wID0gKl9fZmlyc3Q7CisJICAqKytfX3Jlc3VsdCA9IF9fdG1wIC0gX192YWx1ZTsKKwkgIF9fdmFsdWUgPSBfR0xJQkNYWF9NT1ZFKF9fdG1wKTsKKwl9CisgICAgICByZXR1cm4gKytfX3Jlc3VsdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBkaWZmZXJlbmNlcyBiZXR3ZWVuIGFkamFjZW50IHZhbHVlcy4KKyAgICoKKyAgICogIENvbXB1dGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYWRqYWNlbnQgdmFsdWVzIGluIHRoZSByYW5nZQorICAgKiAgW19fZmlyc3QsX19sYXN0KSB1c2luZyB0aGUgZnVuY3Rpb24gb2JqZWN0IEBwIF9fYmluYXJ5X29wIGFuZCB3cml0ZXMgdGhlCisgICAqICByZXN1bHQgdG8gQHAgX19yZXN1bHQuCisgICAqCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIFN0YXJ0IG9mIGlucHV0IHJhbmdlLgorICAgKiAgQHBhcmFtICBfX2xhc3QgIEVuZCBvZiBpbnB1dCByYW5nZS4KKyAgICogIEBwYXJhbSAgX19yZXN1bHQgIE91dHB1dCBzdW0uCisgICAqICBAcGFyYW0gIF9fYmluYXJ5X29wIEZ1bmN0aW9uIG9iamVjdC4KKyAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHBvaW50aW5nIGp1c3QgYmV5b25kIHRoZSB2YWx1ZXMgd3JpdHRlbiB0byByZXN1bHQuCisgICAqCisgICAqICBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAqICBEUiA1MzkuIHBhcnRpYWxfc3VtIGFuZCBhZGphY2VudF9kaWZmZXJlbmNlIHNob3VsZCBtZW50aW9uIHJlcXVpcmVtZW50cworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIGFkamFjZW50X2RpZmZlcmVuY2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkJX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQmluYXJ5T3BlcmF0aW9uIF9fYmluYXJ5X29wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgIF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gX19yZXN1bHQ7CisgICAgICBfVmFsdWVUeXBlIF9fdmFsdWUgPSAqX19maXJzdDsKKyAgICAgICpfX3Jlc3VsdCA9IF9fdmFsdWU7CisgICAgICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICBfVmFsdWVUeXBlIF9fdG1wID0gKl9fZmlyc3Q7CisJICAqKytfX3Jlc3VsdCA9IF9fYmluYXJ5X29wKF9fdG1wLCBfX3ZhbHVlKTsKKwkgIF9fdmFsdWUgPSBfR0xJQkNYWF9NT1ZFKF9fdG1wKTsKKwl9CisgICAgICByZXR1cm4gKytfX3Jlc3VsdDsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQUxHTworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvKiBfU1RMX05VTUVSSUNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9wYWlyLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3BhaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjI1MDE2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9wYWlyLmgKQEAgLTAsMCArMSwyOTUgQEAKKy8vIFBhaXIgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX3BhaXIuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3V0aWxpdHl9CisgKi8KKworI2lmbmRlZiBfU1RMX1BBSVJfSAorI2RlZmluZSBfU1RMX1BBSVJfSCAxCisKKyNpbmNsdWRlIDxiaXRzL21vdmUuaD4gLy8gZm9yIHN0ZDo6bW92ZSAvIHN0ZDo6Zm9yd2FyZCwgYW5kIHN0ZDo6c3dhcAorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPiAvLyBmb3Igc3RkOjpfX2RlY2F5X2FuZF9zdHJpcCB0b28KKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAYWRkdG9ncm91cCB1dGlsaXRpZXMKKyAgICogIEB7CisgICAqLworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAvLy8gcGllY2V3aXNlX2NvbnN0cnVjdF90CisgIHN0cnVjdCBwaWVjZXdpc2VfY29uc3RydWN0X3QgeyB9OworCisgIC8vLyBwaWVjZXdpc2VfY29uc3RydWN0CisgIGNvbnN0ZXhwciBwaWVjZXdpc2VfY29uc3RydWN0X3QgcGllY2V3aXNlX2NvbnN0cnVjdCA9IHBpZWNld2lzZV9jb25zdHJ1Y3RfdCgpOworCisgIC8vIEZvcndhcmQgZGVjbGFyYXRpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLj4KKyAgICBjbGFzcyB0dXBsZTsKKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdC4uLj4KKyAgICBzdHJ1Y3QgX0luZGV4X3R1cGxlOworI2VuZGlmCisKKyAvKioKKyAgICogIEBicmllZiBTdHJ1Y3QgaG9sZGluZyB0d28gb2JqZWN0cyBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICoKKyAgICogIEB0cGFyYW0gX1QxICBUeXBlIG9mIGZpcnN0IG9iamVjdC4KKyAgICogIEB0cGFyYW0gX1QyICBUeXBlIG9mIHNlY29uZCBvYmplY3QuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBzdHJ1Y3QgcGFpcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1QxIGZpcnN0X3R5cGU7ICAgIC8vLyBAYyBmaXJzdF90eXBlIGlzIHRoZSBmaXJzdCBib3VuZCB0eXBlCisgICAgICB0eXBlZGVmIF9UMiBzZWNvbmRfdHlwZTsgICAvLy8gQGMgc2Vjb25kX3R5cGUgaXMgdGhlIHNlY29uZCBib3VuZCB0eXBlCisKKyAgICAgIF9UMSBmaXJzdDsgICAgICAgICAgICAgICAgIC8vLyBAYyBmaXJzdCBpcyBhIGNvcHkgb2YgdGhlIGZpcnN0IG9iamVjdAorICAgICAgX1QyIHNlY29uZDsgICAgICAgICAgICAgICAgLy8vIEBjIHNlY29uZCBpcyBhIGNvcHkgb2YgdGhlIHNlY29uZCBvYmplY3QKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjY1LiAgc3RkOjpwYWlyOjpwYWlyKCkgZWZmZWN0cyBvdmVybHkgcmVzdHJpY3RpdmUKKyAgICAgIC8qKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIEBjIGZpcnN0IGFuZCBAYyBzZWNvbmQgdXNpbmcgdGhlaXIKKyAgICAgICAqICByZXNwZWN0aXZlIGRlZmF1bHQgY29uc3RydWN0b3JzLiAgKi8KKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBwYWlyKCkKKyAgICAgIDogZmlyc3QoKSwgc2Vjb25kKCkgeyB9CisKKyAgICAgIC8qKiBUd28gb2JqZWN0cyBtYXkgYmUgcGFzc2VkIHRvIGEgQGMgcGFpciBjb25zdHJ1Y3RvciB0byBiZSBjb3BpZWQuICAqLworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIHBhaXIoY29uc3QgX1QxJiBfX2EsIGNvbnN0IF9UMiYgX19iKQorICAgICAgOiBmaXJzdChfX2EpLCBzZWNvbmQoX19iKSB7IH0KKworICAgICAgLyoqIFRoZXJlIGlzIGFsc28gYSB0ZW1wbGF0ZWQgY29weSBjdG9yIGZvciB0aGUgQGMgcGFpciBjbGFzcyBpdHNlbGYuICAqLworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorICAgICAgdGVtcGxhdGU8Y2xhc3MgX1UxLCBjbGFzcyBfVTI+CisJcGFpcihjb25zdCBwYWlyPF9VMSwgX1UyPiYgX19wKQorCTogZmlyc3QoX19wLmZpcnN0KSwgc2Vjb25kKF9fcC5zZWNvbmQpIHsgfQorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9VMSwgY2xhc3MgX1UyLCBjbGFzcyA9IHR5cGVuYW1lCisJICAgICAgIGVuYWJsZV9pZjxfX2FuZF88aXNfY29udmVydGlibGU8Y29uc3QgX1UxJiwgX1QxPiwKKwkJCQlpc19jb252ZXJ0aWJsZTxjb25zdCBfVTImLCBfVDI+Pjo6dmFsdWU+Ojp0eXBlPgorCWNvbnN0ZXhwciBwYWlyKGNvbnN0IHBhaXI8X1UxLCBfVTI+JiBfX3ApCisJOiBmaXJzdChfX3AuZmlyc3QpLCBzZWNvbmQoX19wLnNlY29uZCkgeyB9CisKKyAgICAgIGNvbnN0ZXhwciBwYWlyKGNvbnN0IHBhaXImKSA9IGRlZmF1bHQ7CisgICAgICBjb25zdGV4cHIgcGFpcihwYWlyJiYpID0gZGVmYXVsdDsKKworICAgICAgLy8gRFIgODExLgorICAgICAgdGVtcGxhdGU8Y2xhc3MgX1UxLCBjbGFzcyA9IHR5cGVuYW1lCisJICAgICAgIGVuYWJsZV9pZjxpc19jb252ZXJ0aWJsZTxfVTEsIF9UMT46OnZhbHVlPjo6dHlwZT4KKwljb25zdGV4cHIgcGFpcihfVTEmJiBfX3gsIGNvbnN0IF9UMiYgX195KQorCTogZmlyc3Qoc3RkOjpmb3J3YXJkPF9VMT4oX194KSksIHNlY29uZChfX3kpIHsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVTIsIGNsYXNzID0gdHlwZW5hbWUKKwkgICAgICAgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPF9VMiwgX1QyPjo6dmFsdWU+Ojp0eXBlPgorCWNvbnN0ZXhwciBwYWlyKGNvbnN0IF9UMSYgX194LCBfVTImJiBfX3kpCisJOiBmaXJzdChfX3gpLCBzZWNvbmQoc3RkOjpmb3J3YXJkPF9VMj4oX195KSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9VMSwgY2xhc3MgX1UyLCBjbGFzcyA9IHR5cGVuYW1lCisJICAgICAgIGVuYWJsZV9pZjxfX2FuZF88aXNfY29udmVydGlibGU8X1UxLCBfVDE+LAorCQkJCWlzX2NvbnZlcnRpYmxlPF9VMiwgX1QyPj46OnZhbHVlPjo6dHlwZT4KKwljb25zdGV4cHIgcGFpcihfVTEmJiBfX3gsIF9VMiYmIF9feSkKKwk6IGZpcnN0KHN0ZDo6Zm9yd2FyZDxfVTE+KF9feCkpLCBzZWNvbmQoc3RkOjpmb3J3YXJkPF9VMj4oX195KSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9VMSwgY2xhc3MgX1UyLCBjbGFzcyA9IHR5cGVuYW1lCisJICAgICAgIGVuYWJsZV9pZjxfX2FuZF88aXNfY29udmVydGlibGU8X1UxLCBfVDE+LAorCQkJCWlzX2NvbnZlcnRpYmxlPF9VMiwgX1QyPj46OnZhbHVlPjo6dHlwZT4KKwljb25zdGV4cHIgcGFpcihwYWlyPF9VMSwgX1UyPiYmIF9fcCkKKwk6IGZpcnN0KHN0ZDo6Zm9yd2FyZDxfVTE+KF9fcC5maXJzdCkpLAorCSAgc2Vjb25kKHN0ZDo6Zm9yd2FyZDxfVTI+KF9fcC5zZWNvbmQpKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MxLCB0eXBlbmFtZS4uLiBfQXJnczI+CisgICAgICAgIHBhaXIocGllY2V3aXNlX2NvbnN0cnVjdF90LCB0dXBsZTxfQXJnczEuLi4+LCB0dXBsZTxfQXJnczIuLi4+KTsKKworICAgICAgcGFpciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBwYWlyJiBfX3ApCisgICAgICB7CisJZmlyc3QgPSBfX3AuZmlyc3Q7CisJc2Vjb25kID0gX19wLnNlY29uZDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHBhaXImCisgICAgICBvcGVyYXRvcj0ocGFpciYmIF9fcCkKKyAgICAgIG5vZXhjZXB0KF9fYW5kXzxpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfVDE+LAorCSAgICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8X1QyPj46OnZhbHVlKQorICAgICAgeworCWZpcnN0ID0gc3RkOjpmb3J3YXJkPGZpcnN0X3R5cGU+KF9fcC5maXJzdCk7CisJc2Vjb25kID0gc3RkOjpmb3J3YXJkPHNlY29uZF90eXBlPihfX3Auc2Vjb25kKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9VMSwgY2xhc3MgX1UyPgorCXBhaXImCisJb3BlcmF0b3I9KGNvbnN0IHBhaXI8X1UxLCBfVTI+JiBfX3ApCisJeworCSAgZmlyc3QgPSBfX3AuZmlyc3Q7CisJICBzZWNvbmQgPSBfX3Auc2Vjb25kOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1UxLCBjbGFzcyBfVTI+CisJcGFpciYKKwlvcGVyYXRvcj0ocGFpcjxfVTEsIF9VMj4mJiBfX3ApCisJeworCSAgZmlyc3QgPSBzdGQ6OmZvcndhcmQ8X1UxPihfX3AuZmlyc3QpOworCSAgc2Vjb25kID0gc3RkOjpmb3J3YXJkPF9VMj4oX19wLnNlY29uZCk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHBhaXImIF9fcCkKKyAgICAgIG5vZXhjZXB0KG5vZXhjZXB0KHN3YXAoZmlyc3QsIF9fcC5maXJzdCkpCisJICAgICAgICYmIG5vZXhjZXB0KHN3YXAoc2Vjb25kLCBfX3Auc2Vjb25kKSkpCisgICAgICB7CisJdXNpbmcgc3RkOjpzd2FwOworCXN3YXAoZmlyc3QsIF9fcC5maXJzdCk7CisJc3dhcChzZWNvbmQsIF9fcC5zZWNvbmQpOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzMSwgc3RkOjpzaXplX3QuLi4gX0luZGV4ZXMxLAorICAgICAgICAgICAgICAgdHlwZW5hbWUuLi4gX0FyZ3MyLCBzdGQ6OnNpemVfdC4uLiBfSW5kZXhlczI+CisgICAgICAgIHBhaXIodHVwbGU8X0FyZ3MxLi4uPiYsIHR1cGxlPF9BcmdzMi4uLj4mLAorICAgICAgICAgICAgIF9JbmRleF90dXBsZTxfSW5kZXhlczEuLi4+LCBfSW5kZXhfdHVwbGU8X0luZGV4ZXMyLi4uPik7CisjZW5kaWYKKyAgICB9OworCisgIC8vLyBUd28gcGFpcnMgb2YgdGhlIHNhbWUgdHlwZSBhcmUgZXF1YWwgaWZmIHRoZWlyIG1lbWJlcnMgYXJlIGVxdWFsLgorICB0ZW1wbGF0ZTxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3gsIGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3kpCisgICAgeyByZXR1cm4gX194LmZpcnN0ID09IF9feS5maXJzdCAmJiBfX3guc2Vjb25kID09IF9feS5zZWNvbmQ7IH0KKworICAvLy8gPGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvdXRpbGl0aWVzLmh0bWw+CisgIHRlbXBsYXRlPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBwYWlyPF9UMSwgX1QyPiYgX194LCBjb25zdCBwYWlyPF9UMSwgX1QyPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5maXJzdCA8IF9feS5maXJzdAorCSAgICAgfHwgKCEoX195LmZpcnN0IDwgX194LmZpcnN0KSAmJiBfX3guc2Vjb25kIDwgX195LnNlY29uZCk7IH0KKworICAvLy8gVXNlcyBAYyBvcGVyYXRvcj09IHRvIGZpbmQgdGhlIHJlc3VsdC4KKyAgdGVtcGxhdGU8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBwYWlyPF9UMSwgX1QyPiYgX194LCBjb25zdCBwYWlyPF9UMSwgX1QyPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICAvLy8gVXNlcyBAYyBvcGVyYXRvcjwgdG8gZmluZCB0aGUgcmVzdWx0LgorICB0ZW1wbGF0ZTxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feCwgY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICAvLy8gVXNlcyBAYyBvcGVyYXRvcjwgdG8gZmluZCB0aGUgcmVzdWx0LgorICB0ZW1wbGF0ZTxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3gsIGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgLy8vIFVzZXMgQGMgb3BlcmF0b3I8IHRvIGZpbmQgdGhlIHJlc3VsdC4KKyAgdGVtcGxhdGU8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBwYWlyPF9UMSwgX1QyPiYgX194LCBjb25zdCBwYWlyPF9UMSwgX1QyPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAvLy8gU2VlIHN0ZDo6cGFpcjo6c3dhcCgpLgorICAvLyBOb3RlOiAgbm8gc3RkOjpzd2FwIG92ZXJsb2FkcyBpbiBDKyswMyBtb2RlLCB0aGlzIGhhcyBwZXJmb3JtYW5jZQorICAvLyAgICAgICAgaW1wbGljYXRpb25zLCBzZWUsIGVnLCBsaWJzdGRjKysvMzg0NjYuCisgIHRlbXBsYXRlPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChwYWlyPF9UMSwgX1QyPiYgX194LCBwYWlyPF9UMSwgX1QyPiYgX195KQorICAgIG5vZXhjZXB0KG5vZXhjZXB0KF9feC5zd2FwKF9feSkpKQorICAgIHsgX194LnN3YXAoX195KTsgfQorI2VuZGlmCisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBjb252ZW5pZW5jZSB3cmFwcGVyIGZvciBjcmVhdGluZyBhIHBhaXIgZnJvbSB0d28gb2JqZWN0cy4KKyAgICogIEBwYXJhbSAgX194ICBUaGUgZmlyc3Qgb2JqZWN0LgorICAgKiAgQHBhcmFtICBfX3kgIFRoZSBzZWNvbmQgb2JqZWN0LgorICAgKiAgQHJldHVybiAgIEEgbmV3bHktY29uc3RydWN0ZWQgcGFpcjw+IG9iamVjdCBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZS4KKyAgICoKKyAgICogIFRoZSBzdGFuZGFyZCByZXF1aXJlcyB0aGF0IHRoZSBvYmplY3RzIGJlIHBhc3NlZCBieSByZWZlcmVuY2UtdG8tY29uc3QsCisgICAqICBidXQgTFdHIGlzc3VlICMxODEgc2F5cyB0aGV5IHNob3VsZCBiZSBwYXNzZWQgYnkgY29uc3QgdmFsdWUuICBXZSBmb2xsb3cKKyAgICogIHRoZSBMV0cgYnkgZGVmYXVsdC4KKyAgICovCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gMTgxLiAgbWFrZV9wYWlyKCkgdW5pbnRlbmRlZCBiZWhhdmlvcgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgLy8gTkI6IERSIDcwNi4KKyAgdGVtcGxhdGU8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CisgICAgY29uc3RleHByIHBhaXI8dHlwZW5hbWUgX19kZWNheV9hbmRfc3RyaXA8X1QxPjo6X190eXBlLAorICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fZGVjYXlfYW5kX3N0cmlwPF9UMj46Ol9fdHlwZT4KKyAgICBtYWtlX3BhaXIoX1QxJiYgX194LCBfVDImJiBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2RlY2F5X2FuZF9zdHJpcDxfVDE+OjpfX3R5cGUgX19kc190eXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19kZWNheV9hbmRfc3RyaXA8X1QyPjo6X190eXBlIF9fZHNfdHlwZTI7CisgICAgICB0eXBlZGVmIHBhaXI8X19kc190eXBlMSwgX19kc190eXBlMj4gCSAgICAgIF9fcGFpcl90eXBlOworICAgICAgcmV0dXJuIF9fcGFpcl90eXBlKHN0ZDo6Zm9yd2FyZDxfVDE+KF9feCksIHN0ZDo6Zm9yd2FyZDxfVDI+KF9feSkpOworICAgIH0KKyNlbHNlCisgIHRlbXBsYXRlPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorICAgIGlubGluZSBwYWlyPF9UMSwgX1QyPgorICAgIG1ha2VfcGFpcihfVDEgX194LCBfVDIgX195KQorICAgIHsgcmV0dXJuIHBhaXI8X1QxLCBfVDI+KF9feCwgX195KTsgfQorI2VuZGlmCisKKyAgLy8vIEB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvKiBfU1RMX1BBSVJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9xdWV1ZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMmMwNTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3F1ZXVlLmgKQEAgLTAsMCArMSw1NjkgQEAKKy8vIFF1ZXVlIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9xdWV1ZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7cXVldWV9CisgKi8KKworI2lmbmRlZiBfU1RMX1FVRVVFX0gKKyNkZWZpbmUgX1NUTF9RVUVVRV9IIDEKKworI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBicmllZiAgQSBzdGFuZGFyZCBjb250YWluZXIgZ2l2aW5nIEZJRk8gYmVoYXZpb3IuCisgICAqCisgICAqICBAaW5ncm91cCBzZXF1ZW5jZXMKKyAgICoKKyAgICogIEB0cGFyYW0gX1RwICBUeXBlIG9mIGVsZW1lbnQuCisgICAqICBAdHBhcmFtIF9TZXF1ZW5jZSAgVHlwZSBvZiB1bmRlcmx5aW5nIHNlcXVlbmNlLCBkZWZhdWx0cyB0byBkZXF1ZTxfVHA+LgorICAgKgorICAgKiAgTWVldHMgbWFueSBvZiB0aGUgcmVxdWlyZW1lbnRzIG9mIGEKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LAorICAgKiAgYnV0IGRvZXMgbm90IGRlZmluZSBhbnl0aGluZyB0byBkbyB3aXRoIGl0ZXJhdG9ycy4gIFZlcnkgZmV3IG9mIHRoZQorICAgKiAgb3RoZXIgc3RhbmRhcmQgY29udGFpbmVyIGludGVyZmFjZXMgYXJlIGRlZmluZWQuCisgICAqCisgICAqICBUaGlzIGlzIG5vdCBhIHRydWUgY29udGFpbmVyLCBidXQgYW4gQGUgYWRhcHRvci4gIEl0IGhvbGRzIGFub3RoZXIKKyAgICogIGNvbnRhaW5lciwgYW5kIHByb3ZpZGVzIGEgd3JhcHBlciBpbnRlcmZhY2UgdG8gdGhhdCBjb250YWluZXIuICBUaGUKKyAgICogIHdyYXBwZXIgaXMgd2hhdCBlbmZvcmNlcyBzdHJpY3QgZmlyc3QtaW4tZmlyc3Qtb3V0ICVxdWV1ZSBiZWhhdmlvci4KKyAgICoKKyAgICogIFRoZSBzZWNvbmQgdGVtcGxhdGUgcGFyYW1ldGVyIGRlZmluZXMgdGhlIHR5cGUgb2YgdGhlIHVuZGVybHlpbmcKKyAgICogIHNlcXVlbmNlL2NvbnRhaW5lci4gIEl0IGRlZmF1bHRzIHRvIHN0ZDo6ZGVxdWUsIGJ1dCBpdCBjYW4gYmUgYW55IHR5cGUKKyAgICogIHRoYXQgc3VwcG9ydHMgQGMgZnJvbnQsIEBjIGJhY2ssIEBjIHB1c2hfYmFjaywgYW5kIEBjIHBvcF9mcm9udCwKKyAgICogIHN1Y2ggYXMgc3RkOjpsaXN0IG9yIGFuIGFwcHJvcHJpYXRlIHVzZXItZGVmaW5lZCB0eXBlLgorICAgKgorICAgKiAgTWVtYmVycyBub3QgZm91bmQgaW4gQGEgbm9ybWFsIGNvbnRhaW5lcnMgYXJlIEBjIGNvbnRhaW5lcl90eXBlLAorICAgKiAgd2hpY2ggaXMgYSB0eXBlZGVmIGZvciB0aGUgc2Vjb25kIFNlcXVlbmNlIHBhcmFtZXRlciwgYW5kIEBjIHB1c2ggYW5kCisgICAqICBAYyBwb3AsIHdoaWNoIGFyZSBzdGFuZGFyZCAlcXVldWUvRklGTyBvcGVyYXRpb25zLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXF1ZW5jZSA9IGRlcXVlPF9UcD4gPgorICAgIGNsYXNzIHF1ZXVlCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjp2YWx1ZV90eXBlIF9TZXF1ZW5jZV92YWx1ZV90eXBlOworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9UcCwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9TZXF1ZW5jZSwgX0Zyb250SW5zZXJ0aW9uU2VxdWVuY2VDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9TZXF1ZW5jZSwgX0JhY2tJbnNlcnRpb25TZXF1ZW5jZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMyKF9UcCwgX1NlcXVlbmNlX3ZhbHVlX3R5cGUsIF9TYW1lVHlwZUNvbmNlcHQpCisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9TZXExPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcj09KGNvbnN0IHF1ZXVlPF9UcDEsIF9TZXExPiYsIGNvbnN0IHF1ZXVlPF9UcDEsIF9TZXExPiYpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfU2VxMT4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I8KGNvbnN0IHF1ZXVlPF9UcDEsIF9TZXExPiYsIGNvbnN0IHF1ZXVlPF9UcDEsIF9TZXExPiYpOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnZhbHVlX3R5cGUgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpyZWZlcmVuY2UgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpjb25zdF9yZWZlcmVuY2UgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpzaXplX3R5cGUgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgICAgICAgICAgX1NlcXVlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgLyoqCisgICAgICAgKiAgJ2MnIGlzIHRoZSB1bmRlcmx5aW5nIGNvbnRhaW5lci4gIE1haW50YWluZXJzIHdvbmRlcmluZyB3aHkKKyAgICAgICAqICB0aGlzIGlzbid0IHVnbGlmaWVkIGFzIHBlciBzdHlsZSBndWlkZWxpbmVzIHNob3VsZCBub3RlIHRoYXQKKyAgICAgICAqICB0aGlzIG5hbWUgaXMgc3BlY2lmaWVkIGluIHRoZSBzdGFuZGFyZCwgWzIzLjIuMy4xXS4gIChXaHk/CisgICAgICAgKiAgUHJlc3VtYWJseSBmb3IgdGhlIHNhbWUgcmVhc29uIHRoYXQgaXQncyBwcm90ZWN0ZWQgaW5zdGVhZAorICAgICAgICogIG9mIHByaXZhdGU6IHRvIGFsbG93IGRlcml2YXRpb24uICBCdXQgbm9uZSBvZiB0aGUgb3RoZXIKKyAgICAgICAqICBjb250YWluZXJzIGFsbG93IGZvciBkZXJpdmF0aW9uLiAgT2RkLikKKyAgICAgICAqLworICAgICAgX1NlcXVlbmNlIGM7CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IgY3JlYXRlcyBubyBlbGVtZW50cy4KKyAgICAgICAqLworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorICAgICAgZXhwbGljaXQKKyAgICAgIHF1ZXVlKGNvbnN0IF9TZXF1ZW5jZSYgX19jID0gX1NlcXVlbmNlKCkpCisgICAgICA6IGMoX19jKSB7IH0KKyNlbHNlCisgICAgICBleHBsaWNpdAorICAgICAgcXVldWUoY29uc3QgX1NlcXVlbmNlJiBfX2MpCisgICAgICA6IGMoX19jKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIHF1ZXVlKF9TZXF1ZW5jZSYmIF9fYyA9IF9TZXF1ZW5jZSgpKQorICAgICAgOiBjKHN0ZDo6bW92ZShfX2MpKSB7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlICVxdWV1ZSBpcyBlbXB0eS4KKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gYy5lbXB0eSgpOyB9CisKKyAgICAgIC8qKiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSAlcXVldWUuICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGMuc2l6ZSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlcXVldWUuCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgZnJvbnQoKQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19ub25lbXB0eSgpOworCXJldHVybiBjLmZyb250KCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJXF1ZXVlLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGZyb250KCkgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfbm9uZW1wdHkoKTsKKwlyZXR1cm4gYy5mcm9udCgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlcXVldWUuCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgYmFjaygpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX25vbmVtcHR5KCk7CisJcmV0dXJuIGMuYmFjaygpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJXF1ZXVlLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGJhY2soKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19ub25lbXB0eSgpOworCXJldHVybiBjLmJhY2soKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBZGQgZGF0YSB0byB0aGUgZW5kIG9mIHRoZSAlcXVldWUuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIERhdGEgdG8gYmUgYWRkZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSB0eXBpY2FsICVxdWV1ZSBvcGVyYXRpb24uICBUaGUgZnVuY3Rpb24gY3JlYXRlcyBhbgorICAgICAgICogIGVsZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgJXF1ZXVlIGFuZCBhc3NpZ25zIHRoZSBnaXZlbiBkYXRhCisgICAgICAgKiAgdG8gaXQuICBUaGUgdGltZSBjb21wbGV4aXR5IG9mIHRoZSBvcGVyYXRpb24gZGVwZW5kcyBvbiB0aGUKKyAgICAgICAqICB1bmRlcmx5aW5nIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwdXNoKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgYy5wdXNoX2JhY2soX194KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgcHVzaCh2YWx1ZV90eXBlJiYgX194KQorICAgICAgeyBjLnB1c2hfYmFjayhzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKwl7IGMuZW1wbGFjZV9iYWNrKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZXMgZmlyc3QgZWxlbWVudC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIHR5cGljYWwgJXF1ZXVlIG9wZXJhdGlvbi4gIEl0IHNocmlua3MgdGhlICVxdWV1ZSBieSBvbmUuCisgICAgICAgKiAgVGhlIHRpbWUgY29tcGxleGl0eSBvZiB0aGUgb3BlcmF0aW9uIGRlcGVuZHMgb24gdGhlIHVuZGVybHlpbmcKKyAgICAgICAqICBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IG5vIGRhdGEgaXMgcmV0dXJuZWQsIGFuZCBpZiB0aGUgZmlyc3QgZWxlbWVudCdzCisgICAgICAgKiAgZGF0YSBpcyBuZWVkZWQsIGl0IHNob3VsZCBiZSByZXRyaWV2ZWQgYmVmb3JlIHBvcCgpIGlzCisgICAgICAgKiAgY2FsbGVkLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwb3AoKQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19ub25lbXB0eSgpOworCWMucG9wX2Zyb250KCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBzd2FwKHF1ZXVlJiBfX3EpCisgICAgICBub2V4Y2VwdChub2V4Y2VwdChzd2FwKGMsIF9fcS5jKSkpCisgICAgICB7CisJdXNpbmcgc3RkOjpzd2FwOworCXN3YXAoYywgX19xLmMpOworICAgICAgfQorI2VuZGlmCisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiAgUXVldWUgZXF1YWxpdHkgY29tcGFyaXNvbi4KKyAgICogIEBwYXJhbSAgX194ICBBICVxdWV1ZS4KKyAgICogIEBwYXJhbSAgX195ICBBICVxdWV1ZSBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIF9feC4KKyAgICogIEByZXR1cm4gIFRydWUgaWZmIHRoZSBzaXplIGFuZCBlbGVtZW50cyBvZiB0aGUgcXVldWVzIGFyZSBlcXVhbC4KKyAgICoKKyAgICogIFRoaXMgaXMgYW4gZXF1aXZhbGVuY2UgcmVsYXRpb24uICBDb21wbGV4aXR5IGFuZCBzZW1hbnRpY3MgZGVwZW5kIG9uIHRoZQorICAgKiAgdW5kZXJseWluZyBzZXF1ZW5jZSB0eXBlLCBidXQgdGhlIGV4cGVjdGVkIHJ1bGVzIGFyZTogIHRoaXMgcmVsYXRpb24gaXMKKyAgICogIGxpbmVhciBpbiB0aGUgc2l6ZSBvZiB0aGUgc2VxdWVuY2VzLCBhbmQgcXVldWVzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQKKyAgICogIGlmIHRoZWlyIHNlcXVlbmNlcyBjb21wYXJlIGVxdWFsLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXE+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHF1ZXVlPF9UcCwgX1NlcT4mIF9feCwgY29uc3QgcXVldWU8X1RwLCBfU2VxPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5jID09IF9feS5jOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFF1ZXVlIG9yZGVyaW5nIHJlbGF0aW9uLgorICAgKiAgQHBhcmFtICBfX3ggIEEgJXF1ZXVlLgorICAgKiAgQHBhcmFtICBfX3kgIEEgJXF1ZXVlIG9mIHRoZSBzYW1lIHR5cGUgYXMgQGEgeC4KKyAgICogIEByZXR1cm4gIFRydWUgaWZmIEBhIF9feCBpcyBsZXhpY29ncmFwaGljYWxseSBsZXNzIHRoYW4gQGEgX195LgorICAgKgorICAgKiAgVGhpcyBpcyBhbiB0b3RhbCBvcmRlcmluZyByZWxhdGlvbi4gIENvbXBsZXhpdHkgYW5kIHNlbWFudGljcworICAgKiAgZGVwZW5kIG9uIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlIHR5cGUsIGJ1dCB0aGUgZXhwZWN0ZWQgcnVsZXMKKyAgICogIGFyZTogdGhpcyByZWxhdGlvbiBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlIHNlcXVlbmNlcywgdGhlCisgICAqICBlbGVtZW50cyBtdXN0IGJlIGNvbXBhcmFibGUgd2l0aCBAYyA8LCBhbmQKKyAgICogIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoKSBpcyB1c3VhbGx5IHVzZWQgdG8gbWFrZSB0aGUKKyAgICogIGRldGVybWluYXRpb24uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBxdWV1ZTxfVHAsIF9TZXE+JiBfX3gsIGNvbnN0IHF1ZXVlPF9UcCwgX1NlcT4mIF9feSkKKyAgICB7IHJldHVybiBfX3guYyA8IF9feS5jOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPT0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfU2VxPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBxdWV1ZTxfVHAsIF9TZXE+JiBfX3gsIGNvbnN0IHF1ZXVlPF9UcCwgX1NlcT4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXE+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgcXVldWU8X1RwLCBfU2VxPiYgX194LCBjb25zdCBxdWV1ZTxfVHAsIF9TZXE+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXE+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHF1ZXVlPF9UcCwgX1NlcT4mIF9feCwgY29uc3QgcXVldWU8X1RwLCBfU2VxPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfU2VxPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBxdWV1ZTxfVHAsIF9TZXE+JiBfX3gsIGNvbnN0IHF1ZXVlPF9UcCwgX1NlcT4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfU2VxPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChxdWV1ZTxfVHAsIF9TZXE+JiBfX3gsIHF1ZXVlPF9UcCwgX1NlcT4mIF9feSkKKyAgICBub2V4Y2VwdChub2V4Y2VwdChfX3guc3dhcChfX3kpKSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXEsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgdXNlc19hbGxvY2F0b3I8cXVldWU8X1RwLCBfU2VxPiwgX0FsbG9jPgorICAgIDogcHVibGljIHVzZXNfYWxsb2NhdG9yPF9TZXEsIF9BbGxvYz46OnR5cGUgeyB9OworI2VuZGlmCisKKyAgLyoqCisgICAqICBAYnJpZWYgIEEgc3RhbmRhcmQgY29udGFpbmVyIGF1dG9tYXRpY2FsbHkgc29ydGluZyBpdHMgY29udGVudHMuCisgICAqCisgICAqICBAaW5ncm91cCBzZXF1ZW5jZXMKKyAgICoKKyAgICogIEB0cGFyYW0gX1RwICBUeXBlIG9mIGVsZW1lbnQuCisgICAqICBAdHBhcmFtIF9TZXF1ZW5jZSAgVHlwZSBvZiB1bmRlcmx5aW5nIHNlcXVlbmNlLCBkZWZhdWx0cyB0byB2ZWN0b3I8X1RwPi4KKyAgICogIEB0cGFyYW0gX0NvbXBhcmUgIENvbXBhcmlzb24gZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzIHRvIAorICAgKiAgICAgICAgICAgICAgICAgICAgbGVzczxfU2VxdWVuY2U6OnZhbHVlX3R5cGU+LgorICAgKgorICAgKiAgVGhpcyBpcyBub3QgYSB0cnVlIGNvbnRhaW5lciwgYnV0IGFuIEBlIGFkYXB0b3IuICBJdCBob2xkcworICAgKiAgYW5vdGhlciBjb250YWluZXIsIGFuZCBwcm92aWRlcyBhIHdyYXBwZXIgaW50ZXJmYWNlIHRvIHRoYXQKKyAgICogIGNvbnRhaW5lci4gIFRoZSB3cmFwcGVyIGlzIHdoYXQgZW5mb3JjZXMgcHJpb3JpdHktYmFzZWQgc29ydGluZyAKKyAgICogIGFuZCAlcXVldWUgYmVoYXZpb3IuICBWZXJ5IGZldyBvZiB0aGUgc3RhbmRhcmQgY29udGFpbmVyL3NlcXVlbmNlCisgICAqICBpbnRlcmZhY2UgcmVxdWlyZW1lbnRzIGFyZSBtZXQgKGUuZy4sIGl0ZXJhdG9ycykuCisgICAqCisgICAqICBUaGUgc2Vjb25kIHRlbXBsYXRlIHBhcmFtZXRlciBkZWZpbmVzIHRoZSB0eXBlIG9mIHRoZSB1bmRlcmx5aW5nCisgICAqICBzZXF1ZW5jZS9jb250YWluZXIuICBJdCBkZWZhdWx0cyB0byBzdGQ6OnZlY3RvciwgYnV0IGl0IGNhbiBiZQorICAgKiAgYW55IHR5cGUgdGhhdCBzdXBwb3J0cyBAYyBmcm9udCgpLCBAYyBwdXNoX2JhY2ssIEBjIHBvcF9iYWNrLAorICAgKiAgYW5kIHJhbmRvbS1hY2Nlc3MgaXRlcmF0b3JzLCBzdWNoIGFzIHN0ZDo6ZGVxdWUgb3IgYW4KKyAgICogIGFwcHJvcHJpYXRlIHVzZXItZGVmaW5lZCB0eXBlLgorICAgKgorICAgKiAgVGhlIHRoaXJkIHRlbXBsYXRlIHBhcmFtZXRlciBzdXBwbGllcyB0aGUgbWVhbnMgb2YgbWFraW5nCisgICAqICBwcmlvcml0eSBjb21wYXJpc29ucy4gIEl0IGRlZmF1bHRzIHRvIEBjIGxlc3M8dmFsdWVfdHlwZT4gYnV0CisgICAqICBjYW4gYmUgYW55dGhpbmcgZGVmaW5pbmcgYSBzdHJpY3Qgd2VhayBvcmRlcmluZy4KKyAgICoKKyAgICogIE1lbWJlcnMgbm90IGZvdW5kIGluIEBhIG5vcm1hbCBjb250YWluZXJzIGFyZSBAYyBjb250YWluZXJfdHlwZSwKKyAgICogIHdoaWNoIGlzIGEgdHlwZWRlZiBmb3IgdGhlIHNlY29uZCBTZXF1ZW5jZSBwYXJhbWV0ZXIsIGFuZCBAYworICAgKiAgcHVzaCwgQGMgcG9wLCBhbmQgQGMgdG9wLCB3aGljaCBhcmUgc3RhbmRhcmQgJXF1ZXVlIG9wZXJhdGlvbnMuCisgICAqCisgICAqICBAbm90ZSBObyBlcXVhbGl0eS9jb21wYXJpc29uIG9wZXJhdG9ycyBhcmUgcHJvdmlkZWQgZm9yCisgICAqICAlcHJpb3JpdHlfcXVldWUuCisgICAqCisgICAqICBAbm90ZSBTb3J0aW5nIG9mIHRoZSBlbGVtZW50cyB0YWtlcyBwbGFjZSBhcyB0aGV5IGFyZSBhZGRlZCB0bywKKyAgICogIGFuZCByZW1vdmVkIGZyb20sIHRoZSAlcHJpb3JpdHlfcXVldWUgdXNpbmcgdGhlCisgICAqICAlcHJpb3JpdHlfcXVldWUncyBtZW1iZXIgZnVuY3Rpb25zLiAgSWYgeW91IGFjY2VzcyB0aGUgZWxlbWVudHMKKyAgICogIGJ5IG90aGVyIG1lYW5zLCBhbmQgY2hhbmdlIHRoZWlyIGRhdGEgc3VjaCB0aGF0IHRoZSBzb3J0aW5nCisgICAqICBvcmRlciB3b3VsZCBiZSBkaWZmZXJlbnQsIHRoZSAlcHJpb3JpdHlfcXVldWUgd2lsbCBub3QgcmUtc29ydAorICAgKiAgdGhlIGVsZW1lbnRzIGZvciB5b3UuICAoSG93IGNvdWxkIGl0IGtub3cgdG8gZG8gc28/KQorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXF1ZW5jZSA9IHZlY3RvcjxfVHA+LAorCSAgIHR5cGVuYW1lIF9Db21wYXJlICA9IGxlc3M8dHlwZW5hbWUgX1NlcXVlbmNlOjp2YWx1ZV90eXBlPiA+CisgICAgY2xhc3MgcHJpb3JpdHlfcXVldWUKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnZhbHVlX3R5cGUgX1NlcXVlbmNlX3ZhbHVlX3R5cGU7CisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1RwLCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1NlcXVlbmNlLCBfU2VxdWVuY2VDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9TZXF1ZW5jZSwgX1JhbmRvbUFjY2Vzc0NvbnRhaW5lckNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMyKF9UcCwgX1NlcXVlbmNlX3ZhbHVlX3R5cGUsIF9TYW1lVHlwZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXM0KF9Db21wYXJlLCBib29sLCBfVHAsIF9UcCwKKwkJCQlfQmluYXJ5RnVuY3Rpb25Db25jZXB0KQorCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnZhbHVlX3R5cGUgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpyZWZlcmVuY2UgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpjb25zdF9yZWZlcmVuY2UgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpzaXplX3R5cGUgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgICAgICAgICAgX1NlcXVlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8gIFNlZSBxdWV1ZTo6YyBmb3Igbm90ZXMgb24gdGhlc2UgbmFtZXMuCisgICAgICBfU2VxdWVuY2UgIGM7CisgICAgICBfQ29tcGFyZSAgIGNvbXA7CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IgY3JlYXRlcyBubyBlbGVtZW50cy4KKyAgICAgICAqLworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorICAgICAgZXhwbGljaXQKKyAgICAgIHByaW9yaXR5X3F1ZXVlKGNvbnN0IF9Db21wYXJlJiBfX3ggPSBfQ29tcGFyZSgpLAorCQkgICAgIGNvbnN0IF9TZXF1ZW5jZSYgX19zID0gX1NlcXVlbmNlKCkpCisgICAgICA6IGMoX19zKSwgY29tcChfX3gpCisgICAgICB7IHN0ZDo6bWFrZV9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7IH0KKyNlbHNlCisgICAgICBleHBsaWNpdAorICAgICAgcHJpb3JpdHlfcXVldWUoY29uc3QgX0NvbXBhcmUmIF9feCwKKwkJICAgICBjb25zdCBfU2VxdWVuY2UmIF9fcykKKyAgICAgIDogYyhfX3MpLCBjb21wKF9feCkKKyAgICAgIHsgc3RkOjptYWtlX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgcHJpb3JpdHlfcXVldWUoY29uc3QgX0NvbXBhcmUmIF9feCA9IF9Db21wYXJlKCksCisJCSAgICAgX1NlcXVlbmNlJiYgX19zID0gX1NlcXVlbmNlKCkpCisgICAgICA6IGMoc3RkOjptb3ZlKF9fcykpLCBjb21wKF9feCkKKyAgICAgIHsgc3RkOjptYWtlX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGEgJXF1ZXVlIGZyb20gYSByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSBjb21wYXJpc29uIGZ1bmN0b3IgZGVzY3JpYmluZyBhIHN0cmljdCB3ZWFrIG9yZGVyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19zICBBbiBpbml0aWFsIHNlcXVlbmNlIHdpdGggd2hpY2ggdG8gc3RhcnQuCisgICAgICAgKgorICAgICAgICogIEJlZ2lucyBieSBjb3B5aW5nIEBhIF9fcywgaW5zZXJ0aW5nIGEgY29weSBvZiB0aGUgZWxlbWVudHMKKyAgICAgICAqICBmcm9tIEBhIFtmaXJzdCxsYXN0KSBpbnRvIHRoZSBjb3B5IG9mIEBhIF9fcywgdGhlbiBvcmRlcmluZworICAgICAgICogIHRoZSBjb3B5IGFjY29yZGluZyB0byBAYSBfX3guCisgICAgICAgKgorICAgICAgICogIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGZ1bmN0aW9uIG9iamVjdHMsIHNlZSB0aGUKKyAgICAgICAqICBkb2N1bWVudGF0aW9uIG9uIEBsaW5rIGZ1bmN0b3JzIGZ1bmN0b3IgYmFzZQorICAgICAgICogIGNsYXNzZXNAZW5kbGluay4KKyAgICAgICAqLworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHByaW9yaXR5X3F1ZXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX3ggPSBfQ29tcGFyZSgpLAorCQkgICAgICAgY29uc3QgX1NlcXVlbmNlJiBfX3MgPSBfU2VxdWVuY2UoKSkKKwk6IGMoX19zKSwgY29tcChfX3gpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgYy5pbnNlcnQoYy5lbmQoKSwgX19maXJzdCwgX19sYXN0KTsKKwkgIHN0ZDo6bWFrZV9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7CisJfQorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBwcmlvcml0eV9xdWV1ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgICBjb25zdCBfQ29tcGFyZSYgX194LAorCQkgICAgICAgY29uc3QgX1NlcXVlbmNlJiBfX3MpCisJOiBjKF9fcyksIGNvbXAoX194KQorICAgICAgICB7CisJICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwkgIGMuaW5zZXJ0KGMuZW5kKCksIF9fZmlyc3QsIF9fbGFzdCk7CisJICBzdGQ6Om1ha2VfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHByaW9yaXR5X3F1ZXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX3ggPSBfQ29tcGFyZSgpLAorCQkgICAgICAgX1NlcXVlbmNlJiYgX19zID0gX1NlcXVlbmNlKCkpCisJOiBjKHN0ZDo6bW92ZShfX3MpKSwgY29tcChfX3gpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgYy5pbnNlcnQoYy5lbmQoKSwgX19maXJzdCwgX19sYXN0KTsKKwkgIHN0ZDo6bWFrZV9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7CisJfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgJXF1ZXVlIGlzIGVtcHR5LgorICAgICAgICovCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBjLmVtcHR5KCk7IH0KKworICAgICAgLyoqICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlICVxdWV1ZS4gICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gYy5zaXplKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlcXVldWUuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgdG9wKCkgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfbm9uZW1wdHkoKTsKKwlyZXR1cm4gYy5mcm9udCgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFkZCBkYXRhIHRvIHRoZSAlcXVldWUuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIERhdGEgdG8gYmUgYWRkZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSB0eXBpY2FsICVxdWV1ZSBvcGVyYXRpb24uCisgICAgICAgKiAgVGhlIHRpbWUgY29tcGxleGl0eSBvZiB0aGUgb3BlcmF0aW9uIGRlcGVuZHMgb24gdGhlIHVuZGVybHlpbmcKKyAgICAgICAqICBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcHVzaChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7CisJYy5wdXNoX2JhY2soX194KTsKKwlzdGQ6OnB1c2hfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgcHVzaCh2YWx1ZV90eXBlJiYgX194KQorICAgICAgeworCWMucHVzaF9iYWNrKHN0ZDo6bW92ZShfX3gpKTsKKwlzdGQ6OnB1c2hfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBlbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIGMuZW1wbGFjZV9iYWNrKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICBzdGQ6OnB1c2hfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOworCX0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZXMgZmlyc3QgZWxlbWVudC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIHR5cGljYWwgJXF1ZXVlIG9wZXJhdGlvbi4gIEl0IHNocmlua3MgdGhlICVxdWV1ZQorICAgICAgICogIGJ5IG9uZS4gIFRoZSB0aW1lIGNvbXBsZXhpdHkgb2YgdGhlIG9wZXJhdGlvbiBkZXBlbmRzIG9uIHRoZQorICAgICAgICogIHVuZGVybHlpbmcgc2VxdWVuY2UuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCBubyBkYXRhIGlzIHJldHVybmVkLCBhbmQgaWYgdGhlIGZpcnN0IGVsZW1lbnQncworICAgICAgICogIGRhdGEgaXMgbmVlZGVkLCBpdCBzaG91bGQgYmUgcmV0cmlldmVkIGJlZm9yZSBwb3AoKSBpcworICAgICAgICogIGNhbGxlZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcG9wKCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfbm9uZW1wdHkoKTsKKwlzdGQ6OnBvcF9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7CisJYy5wb3BfYmFjaygpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgc3dhcChwcmlvcml0eV9xdWV1ZSYgX19wcSkKKyAgICAgIG5vZXhjZXB0KG5vZXhjZXB0KHN3YXAoYywgX19wcS5jKSkgJiYgbm9leGNlcHQoc3dhcChjb21wLCBfX3BxLmNvbXApKSkKKyAgICAgIHsKKwl1c2luZyBzdGQ6OnN3YXA7CisJc3dhcChjLCBfX3BxLmMpOworCXN3YXAoY29tcCwgX19wcS5jb21wKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH07CisKKyAgLy8gTm8gZXF1YWxpdHkvY29tcGFyaXNvbiBvcGVyYXRvcnMgYXJlIHByb3ZpZGVkIGZvciBwcmlvcml0eV9xdWV1ZS4KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfU2VxdWVuY2UsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChwcmlvcml0eV9xdWV1ZTxfVHAsIF9TZXF1ZW5jZSwgX0NvbXBhcmU+JiBfX3gsCisJIHByaW9yaXR5X3F1ZXVlPF9UcCwgX1NlcXVlbmNlLCBfQ29tcGFyZT4mIF9feSkKKyAgICBub2V4Y2VwdChub2V4Y2VwdChfX3guc3dhcChfX3kpKSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXF1ZW5jZSwgdHlwZW5hbWUgX0NvbXBhcmUsCisJICAgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCB1c2VzX2FsbG9jYXRvcjxwcmlvcml0eV9xdWV1ZTxfVHAsIF9TZXF1ZW5jZSwgX0NvbXBhcmU+LCBfQWxsb2M+CisgICAgOiBwdWJsaWMgdXNlc19hbGxvY2F0b3I8X1NlcXVlbmNlLCBfQWxsb2M+Ojp0eXBlIHsgfTsKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfU1RMX1FVRVVFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfcmF3X3N0b3JhZ2VfaXRlci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9yYXdfc3RvcmFnZV9pdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA1YzExZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfcmF3X3N0b3JhZ2VfaXRlci5oCkBAIC0wLDAgKzEsMTA4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NgorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX3Jhd19zdG9yYWdlX2l0ZXIuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le21lbW9yeX0KKyAqLworCisjaWZuZGVmIF9TVExfUkFXX1NUT1JBR0VfSVRFUkFUT1JfSAorI2RlZmluZSBfU1RMX1JBV19TVE9SQUdFX0lURVJBVE9SX0ggMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBUaGlzIGl0ZXJhdG9yIGNsYXNzIGxldHMgYWxnb3JpdGhtcyBzdG9yZSB0aGVpciByZXN1bHRzIGludG8KKyAgICogIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LgorICAqLworICB0ZW1wbGF0ZSA8Y2xhc3MgX091dHB1dEl0ZXJhdG9yLCBjbGFzcyBfVHA+CisgICAgY2xhc3MgcmF3X3N0b3JhZ2VfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcjxvdXRwdXRfaXRlcmF0b3JfdGFnLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfT3V0cHV0SXRlcmF0b3IgX01faXRlcjsKKworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0CisgICAgICByYXdfc3RvcmFnZV9pdGVyYXRvcihfT3V0cHV0SXRlcmF0b3IgX194KQorICAgICAgOiBfTV9pdGVyKF9feCkge30KKworICAgICAgcmF3X3N0b3JhZ2VfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQorCisgICAgICByYXdfc3RvcmFnZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfVHAmIF9fZWxlbWVudCkKKyAgICAgIHsKKwlzdGQ6Ol9Db25zdHJ1Y3Qoc3RkOjpfX2FkZHJlc3NvZigqX01faXRlciksIF9fZWxlbWVudCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICByYXdfc3RvcmFnZV9pdGVyYXRvcjxfT3V0cHV0SXRlcmF0b3IsIF9UcD4mCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwkrK19NX2l0ZXI7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICByYXdfc3RvcmFnZV9pdGVyYXRvcjxfT3V0cHV0SXRlcmF0b3IsIF9UcD4KKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCXJhd19zdG9yYWdlX2l0ZXJhdG9yPF9PdXRwdXRJdGVyYXRvciwgX1RwPiBfX3RtcCA9ICp0aGlzOworCSsrX01faXRlcjsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfcmVsb3BzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3JlbG9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNzA4ZDcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3JlbG9wcy5oCkBAIC0wLDAgKzEsMTM0IEBACisvLyBzdGQ6OnJlbF9vcHMgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9yZWxvcHMuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3V0aWxpdHl9CisgKgorICogIEluY2x1c2lvbiBvZiB0aGlzIGZpbGUgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tCisgKiAgYWxsIG9mIHRoZSBvdGhlciBTVEwgaGVhZGVycyBmb3Igc2FmZXR5IHJlYXNvbnMsIGV4Y2VwdCBzdGRfdXRpbGl0eS5oLgorICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIHRocmVhZCBvZiBhYm91dCB0d2VudHkgbWVzc2FnZXMgc3RhcnRpbmcKKyAqICB3aXRoIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9saWJzdGRjKysvMjAwMS0wMS9tc2cwMDIyMy5odG1sLCBvcgorICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9mYXEuaHRtbCNmYXEuYW1iaWd1b3VzX292ZXJsb2FkcworICoKKyAqICBTaG9ydCBzdW1tYXJ5OiB0aGUgcmVsX29wcyBvcGVyYXRvcnMgc2hvdWxkIGJlIGF2b2lkZWQgZm9yIHRoZSBwcmVzZW50LgorICovCisKKyNpZm5kZWYgX1NUTF9SRUxPUFNfSAorI2RlZmluZSBfU1RMX1JFTE9QU19IIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CisgIG5hbWVzcGFjZSByZWxfb3BzCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIC8qKiBAbmFtZXNwYWNlIHN0ZDo6cmVsX29wcworICAgICAqICBAYnJpZWYgIFRoZSBnZW5lcmF0ZWQgcmVsYXRpb25hbCBvcGVyYXRvcnMgYXJlIHNlcXVlc3RlcmVkIGhlcmUuCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmIERlZmluZXMgQGMgIT0gZm9yIGFyYml0cmFyeSB0eXBlcywgaW4gdGVybXMgb2YgQGMgPT0uCisgICAgICogIEBwYXJhbSAgX194ICBBIHRoaW5nLgorICAgICAqICBAcGFyYW0gIF9feSAgQW5vdGhlciB0aGluZy4KKyAgICAgKiAgQHJldHVybiAgIF9feCAhPSBfX3kKKyAgICAgKgorICAgICAqICBUaGlzIGZ1bmN0aW9uIHVzZXMgQGMgPT0gdG8gZGV0ZXJtaW5lIGl0cyByZXN1bHQuCisgICAgICovCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkKKyAgICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICAgIC8qKgorICAgICAqICBAYnJpZWYgRGVmaW5lcyBAYyA+IGZvciBhcmJpdHJhcnkgdHlwZXMsIGluIHRlcm1zIG9mIEBjIDwuCisgICAgICogIEBwYXJhbSAgX194ICBBIHRoaW5nLgorICAgICAqICBAcGFyYW0gIF9feSAgQW5vdGhlciB0aGluZy4KKyAgICAgKiAgQHJldHVybiAgIF9feCA+IF9feQorICAgICAqCisgICAgICogIFRoaXMgZnVuY3Rpb24gdXNlcyBAYyA8IHRvIGRldGVybWluZSBpdHMgcmVzdWx0LgorICAgICAqLworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I+KGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkKKyAgICAgIHsgcmV0dXJuIF9feSA8IF9feDsgfQorCisgICAgLyoqCisgICAgICogIEBicmllZiBEZWZpbmVzIEBjIDw9IGZvciBhcmJpdHJhcnkgdHlwZXMsIGluIHRlcm1zIG9mIEBjIDwuCisgICAgICogIEBwYXJhbSAgX194ICBBIHRoaW5nLgorICAgICAqICBAcGFyYW0gIF9feSAgQW5vdGhlciB0aGluZy4KKyAgICAgKiAgQHJldHVybiAgIF9feCA8PSBfX3kKKyAgICAgKgorICAgICAqICBUaGlzIGZ1bmN0aW9uIHVzZXMgQGMgPCB0byBkZXRlcm1pbmUgaXRzIHJlc3VsdC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPD0oY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KQorICAgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmIERlZmluZXMgQGMgPj0gZm9yIGFyYml0cmFyeSB0eXBlcywgaW4gdGVybXMgb2YgQGMgPC4KKyAgICAgKiAgQHBhcmFtICBfX3ggIEEgdGhpbmcuCisgICAgICogIEBwYXJhbSAgX195ICBBbm90aGVyIHRoaW5nLgorICAgICAqICBAcmV0dXJuICAgX194ID49IF9feQorICAgICAqCisgICAgICogIFRoaXMgZnVuY3Rpb24gdXNlcyBAYyA8IHRvIGRldGVybWluZSBpdHMgcmVzdWx0LgorICAgICAqLworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I+PShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpCisgICAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2UgcmVsX29wcworCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8qIF9TVExfUkVMT1BTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfc2V0LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZWI1ODkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3NldC5oCkBAIC0wLDAgKzEsODExIEBACisvLyBTZXQgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX3NldC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7c2V0fQorICovCisKKyNpZm5kZWYgX1NUTF9TRVRfSAorI2RlZmluZSBfU1RMX1NFVF9IIDEKKworI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUgorCisgIC8qKgorICAgKiAgQGJyaWVmIEEgc3RhbmRhcmQgY29udGFpbmVyIG1hZGUgdXAgb2YgdW5pcXVlIGtleXMsIHdoaWNoIGNhbiBiZQorICAgKiAgcmV0cmlldmVkIGluIGxvZ2FyaXRobWljIHRpbWUuCisgICAqCisgICAqICBAaW5ncm91cCBhc3NvY2lhdGl2ZV9jb250YWluZXJzCisgICAqCisgICAqICBAdHBhcmFtIF9LZXkgIFR5cGUgb2Yga2V5IG9iamVjdHMuCisgICAqICBAdHBhcmFtIF9Db21wYXJlICBDb21wYXJpc29uIGZ1bmN0aW9uIG9iamVjdCB0eXBlLCBkZWZhdWx0cyB0byBsZXNzPF9LZXk+LgorICAgKiAgQHRwYXJhbSBfQWxsb2MgIEFsbG9jYXRvciB0eXBlLCBkZWZhdWx0cyB0byBhbGxvY2F0b3I8X0tleT4uCisgICAqCisgICAqICBNZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sIGEKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY2Ij5yZXZlcnNpYmxlIGNvbnRhaW5lcjwvYT4sIGFuZCBhbgorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjkiPmFzc29jaWF0aXZlIGNvbnRhaW5lcjwvYT4gKHVzaW5nIHVuaXF1ZSBrZXlzKS4KKyAgICoKKyAgICogIFNldHMgc3VwcG9ydCBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9ycy4KKyAgICoKKyAgICogIFRoZSBwcml2YXRlIHRyZWUgZGF0YSBpcyBkZWNsYXJlZCBleGFjdGx5IHRoZSBzYW1lIHdheSBmb3Igc2V0IGFuZAorICAgKiAgbXVsdGlzZXQ7IHRoZSBkaXN0aW5jdGlvbiBpcyBtYWRlIGVudGlyZWx5IGluIGhvdyB0aGUgdHJlZSBmdW5jdGlvbnMgYXJlCisgICAqICBjYWxsZWQgKCpfdW5pcXVlIHZlcnN1cyAqX2VxdWFsLCBzYW1lIGFzIHRoZSBzdGFuZGFyZCkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlID0gc3RkOjpsZXNzPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9LZXk+ID4KKyAgICBjbGFzcyBzZXQKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnZhbHVlX3R5cGUgICAgICAgICAgICAgICAgICAgX0FsbG9jX3ZhbHVlX3R5cGU7CisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX0tleSwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzNChfQ29tcGFyZSwgYm9vbCwgX0tleSwgX0tleSwKKwkJCQlfQmluYXJ5RnVuY3Rpb25Db25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMihfS2V5LCBfQWxsb2NfdmFsdWVfdHlwZSwgX1NhbWVUeXBlQ29uY2VwdCkKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVkZWZzOgorICAgICAgLy9AeworICAgICAgLy8vIFB1YmxpYyB0eXBlZGVmcy4KKyAgICAgIHR5cGVkZWYgX0tleSAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIF9LZXkgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9Db21wYXJlIGtleV9jb21wYXJlOworICAgICAgdHlwZWRlZiBfQ29tcGFyZSB2YWx1ZV9jb21wYXJlOworICAgICAgdHlwZWRlZiBfQWxsb2MgICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIC8vQH0KKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9LZXk+OjpvdGhlciBfS2V5X2FsbG9jX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX1JiX3RyZWU8a2V5X3R5cGUsIHZhbHVlX3R5cGUsIF9JZGVudGl0eTx2YWx1ZV90eXBlPiwKKwkJICAgICAgIGtleV9jb21wYXJlLCBfS2V5X2FsbG9jX3R5cGU+IF9SZXBfdHlwZTsKKyAgICAgIF9SZXBfdHlwZSBfTV90OyAgLy8gUmVkLWJsYWNrIHRyZWUgcmVwcmVzZW50aW5nIHNldC4KKworICAgIHB1YmxpYzoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyAgSXRlcmF0b3ItcmVsYXRlZCB0eXBlZGVmcy4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0tleV9hbGxvY190eXBlOjpwb2ludGVyICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9LZXlfYWxsb2NfdHlwZTo6Y29uc3RfcG9pbnRlciAgICAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfS2V5X2FsbG9jX3R5cGU6OnJlZmVyZW5jZSAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfS2V5X2FsbG9jX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSAgICAgY29uc3RfcmVmZXJlbmNlOworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMTAzLiBzZXQ6Oml0ZXJhdG9yIGlzIHJlcXVpcmVkIHRvIGJlIG1vZGlmaWFibGUsCisgICAgICAvLyBidXQgdGhpcyBhbGxvd3MgbW9kaWZpY2F0aW9uIG9mIGtleXMuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9pdGVyYXRvciAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6c2l6ZV90eXBlICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICAvL0B9CisKKyAgICAgIC8vIGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IgY3JlYXRlcyBubyBlbGVtZW50cy4KKyAgICAgICAqLworICAgICAgc2V0KCkKKyAgICAgIDogX01fdCgpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENyZWF0ZXMgYSAlc2V0IHdpdGggbm8gZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX2NvbXAgIENvbXBhcmF0b3IgdG8gdXNlLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgc2V0KGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCisJICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01fdChfX2NvbXAsIF9LZXlfYWxsb2NfdHlwZShfX2EpKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlc2V0IGZyb20gYSByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGEgJXNldCBjb25zaXN0aW5nIG9mIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgZnJvbQorICAgICAgICogIFtfX2ZpcnN0LF9fbGFzdCkuICBUaGlzIGlzIGxpbmVhciBpbiBOIGlmIHRoZSByYW5nZSBpcworICAgICAgICogIGFscmVhZHkgc29ydGVkLCBhbmQgTmxvZ04gb3RoZXJ3aXNlICh3aGVyZSBOIGlzCisgICAgICAgKiAgZGlzdGFuY2UoX19maXJzdCxfX2xhc3QpKS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKwk6IF9NX3QoKQorCXsgX01fdC5fTV9pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlc2V0IGZyb20gYSByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fY29tcCAgQSBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVzZXQgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGZyb20KKyAgICAgICAqICBbX19maXJzdCxfX2xhc3QpLiAgVGhpcyBpcyBsaW5lYXIgaW4gTiBpZiB0aGUgcmFuZ2UgaXMKKyAgICAgICAqICBhbHJlYWR5IHNvcnRlZCwgYW5kIE5sb2dOIG90aGVyd2lzZSAod2hlcmUgTiBpcworICAgICAgICogIGRpc3RhbmNlKF9fZmlyc3QsX19sYXN0KSkuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXNldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCisJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX01fdChfX2NvbXAsIF9LZXlfYWxsb2NfdHlwZShfX2EpKQorICAgICAgICB7IF9NX3QuX01faW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJVNldCBjb3B5IGNvbnN0cnVjdG9yLgorICAgICAgICogIEBwYXJhbSAgX194ICBBICVzZXQgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJXNldCB1c2VzIGEgY29weSBvZiB0aGUgYWxsb2NhdGlvbiBvYmplY3QgdXNlZAorICAgICAgICogIGJ5IEBhIF9feC4KKyAgICAgICAqLworICAgICAgc2V0KGNvbnN0IHNldCYgX194KQorICAgICAgOiBfTV90KF9feC5fTV90KSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICVTZXQgbW92ZSBjb25zdHJ1Y3RvcgorICAgICAgICogIEBwYXJhbSBfX3ggIEEgJXNldCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY3JlYXRlZCAlc2V0IGNvbnRhaW5zIHRoZSBleGFjdCBjb250ZW50cyBvZiBAYSB4LgorICAgICAgICogIFRoZSBjb250ZW50cyBvZiBAYSB4IGFyZSBhIHZhbGlkLCBidXQgdW5zcGVjaWZpZWQgJXNldC4KKyAgICAgICAqLworICAgICAgc2V0KHNldCYmIF9feCkKKyAgICAgIG5vZXhjZXB0KGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPF9Db21wYXJlPjo6dmFsdWUpCisgICAgICA6IF9NX3Qoc3RkOjptb3ZlKF9feC5fTV90KSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGEgJXNldCBmcm9tIGFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2NvbXAgIEEgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAlc2V0IGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgbGlzdC4KKyAgICAgICAqICBUaGlzIGlzIGxpbmVhciBpbiBOIGlmIHRoZSBsaXN0IGlzIGFscmVhZHkgc29ydGVkLCBhbmQgTmxvZ04KKyAgICAgICAqICBvdGhlcndpc2UgKHdoZXJlIE4gaXMgQGEgX19sLnNpemUoKSkuCisgICAgICAgKi8KKyAgICAgIHNldChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCSAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX3QoX19jb21wLCBfS2V5X2FsbG9jX3R5cGUoX19hKSkKKyAgICAgIHsgX01fdC5fTV9pbnNlcnRfdW5pcXVlKF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlU2V0IGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJXNldCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBBbGwgdGhlIGVsZW1lbnRzIG9mIEBhIF9feCBhcmUgY29waWVkLCBidXQgdW5saWtlIHRoZSBjb3B5CisgICAgICAgKiAgY29uc3RydWN0b3IsIHRoZSBhbGxvY2F0b3Igb2JqZWN0IGlzIG5vdCBjb3BpZWQuCisgICAgICAgKi8KKyAgICAgIHNldCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBzZXQmIF9feCkKKyAgICAgIHsKKwlfTV90ID0gX194Ll9NX3Q7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICVTZXQgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSBfX3ggIEEgJXNldCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgY29udGVudHMgb2YgQGEgX194IGFyZSBtb3ZlZCBpbnRvIHRoaXMgJXNldCAod2l0aG91dCBjb3B5aW5nKS4KKyAgICAgICAqICBAYSBfX3ggaXMgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkICVzZXQuCisgICAgICAgKi8KKyAgICAgIHNldCYKKyAgICAgIG9wZXJhdG9yPShzZXQmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPnN3YXAoX194KTsKKyAgICAgIAlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJVNldCBsaXN0IGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSAlc2V0IHdpdGggY29waWVzIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUKKyAgICAgICAqICBpbml0aWFsaXplciBsaXN0IEBhIF9fbC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBhc3NpZ25tZW50IGNvbXBsZXRlbHkgY2hhbmdlcyB0aGUgJXNldCBhbmQKKyAgICAgICAqICB0aGF0IHRoZSByZXN1bHRpbmcgJXNldCdzIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWJlcgorICAgICAgICogIG9mIGVsZW1lbnRzIGFzc2lnbmVkLiAgT2xkIGRhdGEgbWF5IGJlIGxvc3QuCisgICAgICAgKi8KKyAgICAgIHNldCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLy8gYWNjZXNzb3JzOgorCisgICAgICAvLy8gIFJldHVybnMgdGhlIGNvbXBhcmlzb24gb2JqZWN0IHdpdGggd2hpY2ggdGhlICVzZXQgd2FzIGNvbnN0cnVjdGVkLgorICAgICAga2V5X2NvbXBhcmUKKyAgICAgIGtleV9jb21wKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3Qua2V5X2NvbXAoKTsgfQorICAgICAgLy8vICBSZXR1cm5zIHRoZSBjb21wYXJpc29uIG9iamVjdCB3aXRoIHdoaWNoIHRoZSAlc2V0IHdhcyBjb25zdHJ1Y3RlZC4KKyAgICAgIHZhbHVlX2NvbXBhcmUKKyAgICAgIHZhbHVlX2NvbXAoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5rZXlfY29tcCgpOyB9CisgICAgICAvLy8gIFJldHVybnMgdGhlIGFsbG9jYXRvciBvYmplY3Qgd2l0aCB3aGljaCB0aGUgJXNldCB3YXMgY29uc3RydWN0ZWQuCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBhbGxvY2F0b3JfdHlwZShfTV90LmdldF9hbGxvY2F0b3IoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICVzZXQuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBhc2NlbmRpbmcgb3JkZXIgYWNjb3JkaW5nCisgICAgICAgKiAgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJXNldC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcKKyAgICAgICAqICB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LmVuZCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgbGFzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICVzZXQuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBkZXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZworICAgICAgICogIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUKKyAgICAgICAqICBsYXN0IHBhaXIgaW4gdGhlICVzZXQuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBkZXNjZW5kaW5nIG9yZGVyCisgICAgICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3QucmVuZCgpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJXNldC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcKKyAgICAgICAqICB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJXNldC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcKKyAgICAgICAqICB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fdC5lbmQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAlc2V0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gZGVzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcKKyAgICAgICAqICB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGxhc3QgcGFpciBpbiB0aGUgJXNldC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGRlc2NlbmRpbmcgb3JkZXIKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX3QucmVuZCgpOyB9CisjZW5kaWYKKworICAgICAgLy8vICBSZXR1cm5zIHRydWUgaWYgdGhlICVzZXQgaXMgZW1wdHkuCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90LmVtcHR5KCk7IH0KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSAlc2V0LgorICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3Quc2l6ZSgpOyB9CisKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSAlc2V0LgorICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV90Lm1heF9zaXplKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTd2FwcyBkYXRhIHdpdGggYW5vdGhlciAlc2V0LgorICAgICAgICogIEBwYXJhbSAgX194ICBBICVzZXQgb2YgdGhlIHNhbWUgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGV4Y2hhbmdlcyB0aGUgZWxlbWVudHMgYmV0d2VlbiB0d28gc2V0cyBpbiBjb25zdGFudAorICAgICAgICogIHRpbWUuICAoSXQgaXMgb25seSBzd2FwcGluZyBhIHBvaW50ZXIsIGFuIGludGVnZXIsIGFuZCBhbgorICAgICAgICogIGluc3RhbmNlIG9mIHRoZSBAYyBDb21wYXJlIHR5cGUgKHdoaWNoIGl0c2VsZiBpcyBvZnRlbgorICAgICAgICogIHN0YXRlbGVzcyBhbmQgZW1wdHkpLCBzbyBpdCBzaG91bGQgYmUgcXVpdGUgZmFzdC4pICBOb3RlCisgICAgICAgKiAgdGhhdCB0aGUgZ2xvYmFsIHN0ZDo6c3dhcCgpIGZ1bmN0aW9uIGlzIHNwZWNpYWxpemVkIHN1Y2gKKyAgICAgICAqICB0aGF0IHN0ZDo6c3dhcChzMSxzMikgd2lsbCBmZWVkIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoc2V0JiBfX3gpCisgICAgICB7IF9NX3Quc3dhcChfX3guX01fdCk7IH0KKworICAgICAgLy8gaW5zZXJ0L2VyYXNlCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGJ1aWxkIGFuZCBpbnNlcnQgYW4gZWxlbWVudCBpbnRvIHRoZSAlc2V0LgorICAgICAgICogIEBwYXJhbSBfX2FyZ3MgIEFyZ3VtZW50cyB1c2VkIHRvIGdlbmVyYXRlIGFuIGVsZW1lbnQuCisgICAgICAgKiAgQHJldHVybiAgQSBwYWlyLCBvZiB3aGljaCB0aGUgZmlyc3QgZWxlbWVudCBpcyBhbiBpdGVyYXRvciB0aGF0IHBvaW50cworICAgICAgICogICAgICAgICAgIHRvIHRoZSBwb3NzaWJseSBpbnNlcnRlZCBlbGVtZW50LCBhbmQgdGhlIHNlY29uZCBpcyBhIGJvb2wKKyAgICAgICAqICAgICAgICAgICB0aGF0IGlzIHRydWUgaWYgdGhlIGVsZW1lbnQgd2FzIGFjdHVhbGx5IGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIGJ1aWxkIGFuZCBpbnNlcnQgYW4gZWxlbWVudCBpbnRvIHRoZSAlc2V0LgorICAgICAgICogIEEgJXNldCByZWxpZXMgb24gdW5pcXVlIGtleXMgYW5kIHRodXMgYW4gZWxlbWVudCBpcyBvbmx5IGluc2VydGVkIGlmCisgICAgICAgKiAgaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudCBpbiB0aGUgJXNldC4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGxvZ2FyaXRobWljIHRpbWUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKwllbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsgcmV0dXJuIF9NX3QuX01fZW1wbGFjZV91bmlxdWUoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gaW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUgJXNldC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBBbiBpdGVyYXRvciB0aGF0IHNlcnZlcyBhcyBhIGhpbnQgYXMgdG8gd2hlcmUgdGhlCisgICAgICAgKiAgICAgICAgICAgICAgICBlbGVtZW50IHNob3VsZCBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIF9fYXJncyAgQXJndW1lbnRzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGVsZW1lbnQgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBlbGVtZW50IHdpdGgga2V5IGVxdWl2YWxlbnQgdG8KKyAgICAgICAqICAgICAgICAgIHRoZSBvbmUgZ2VuZXJhdGVkIGZyb20gQGEgX19hcmdzIChtYXkgb3IgbWF5IG5vdCBiZSB0aGUKKyAgICAgICAqICAgICAgICAgIGVsZW1lbnQgaXRzZWxmKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBub3QgY29uY2VybmVkIGFib3V0IHdoZXRoZXIgdGhlIGluc2VydGlvbiB0b29rIHBsYWNlLAorICAgICAgICogIGFuZCB0aHVzIGRvZXMgbm90IHJldHVybiBhIGJvb2xlYW4gbGlrZSB0aGUgc2luZ2xlLWFyZ3VtZW50IGVtcGxhY2UoKQorICAgICAgICogIGRvZXMuICBOb3RlIHRoYXQgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBvbmx5IGEgaGludCBhbmQgY2FuCisgICAgICAgKiAgcG90ZW50aWFsbHkgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGluc2VydGlvbiBwcm9jZXNzLiAgQSBiYWQKKyAgICAgICAqICBoaW50IHdvdWxkIGNhdXNlIG5vIGdhaW5zIGluIGVmZmljaWVuY3kuCisgICAgICAgKgorICAgICAgICogIEZvciBtb3JlIG9uIEBhIGhpbnRpbmcsIHNlZToKKyAgICAgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDA3Y2gxNy5odG1sCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBsb2dhcml0aG1pYyB0aW1lIChpZiB0aGUgaGludCBpcyBub3QgdGFrZW4pLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX3BvcywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgcmV0dXJuIF9NX3QuX01fZW1wbGFjZV9oaW50X3VuaXF1ZShfX3BvcywKKwkJCQkJICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCX0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gaW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUgJXNldC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRWxlbWVudCB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuICBBIHBhaXIsIG9mIHdoaWNoIHRoZSBmaXJzdCBlbGVtZW50IGlzIGFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgICAgICAgICAgdG8gdGhlIHBvc3NpYmx5IGluc2VydGVkIGVsZW1lbnQsIGFuZCB0aGUgc2Vjb25kIGlzIGEgYm9vbAorICAgICAgICogICAgICAgICAgIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgZWxlbWVudCB3YXMgYWN0dWFsbHkgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gaW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUgJXNldC4gIEEgJXNldAorICAgICAgICogIHJlbGllcyBvbiB1bmlxdWUga2V5cyBhbmQgdGh1cyBhbiBlbGVtZW50IGlzIG9ubHkgaW5zZXJ0ZWQgaWYgaXQgaXMKKyAgICAgICAqICBub3QgYWxyZWFkeSBwcmVzZW50IGluIHRoZSAlc2V0LgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRpb24gcmVxdWlyZXMgbG9nYXJpdGhtaWMgdGltZS4KKyAgICAgICAqLworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnBhaXI8dHlwZW5hbWUgX1JlcF90eXBlOjppdGVyYXRvciwgYm9vbD4gX19wID0KKwkgIF9NX3QuX01faW5zZXJ0X3VuaXF1ZShfX3gpOworCXJldHVybiBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+KF9fcC5maXJzdCwgX19wLnNlY29uZCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQodmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnBhaXI8dHlwZW5hbWUgX1JlcF90eXBlOjppdGVyYXRvciwgYm9vbD4gX19wID0KKwkgIF9NX3QuX01faW5zZXJ0X3VuaXF1ZShzdGQ6Om1vdmUoX194KSk7CisJcmV0dXJuIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4oX19wLmZpcnN0LCBfX3Auc2Vjb25kKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gaW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUgJXNldC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIHRoYXQgc2VydmVzIGFzIGEgaGludCBhcyB0byB3aGVyZSB0aGUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICBlbGVtZW50IHNob3VsZCBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRWxlbWVudCB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBlbGVtZW50IHdpdGgga2V5IG9mCisgICAgICAgKiAgICAgICAgICAgQGEgX194IChtYXkgb3IgbWF5IG5vdCBiZSB0aGUgZWxlbWVudCBwYXNzZWQgaW4pLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBjb25jZXJuZWQgYWJvdXQgd2hldGhlciB0aGUgaW5zZXJ0aW9uIHRvb2sgcGxhY2UsCisgICAgICAgKiAgYW5kIHRodXMgZG9lcyBub3QgcmV0dXJuIGEgYm9vbGVhbiBsaWtlIHRoZSBzaW5nbGUtYXJndW1lbnQgaW5zZXJ0KCkKKyAgICAgICAqICBkb2VzLiAgTm90ZSB0aGF0IHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgb25seSBhIGhpbnQgYW5kIGNhbgorICAgICAgICogIHBvdGVudGlhbGx5IGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBpbnNlcnRpb24gcHJvY2Vzcy4gIEEgYmFkCisgICAgICAgKiAgaGludCB3b3VsZCBjYXVzZSBubyBnYWlucyBpbiBlZmZpY2llbmN5LgorICAgICAgICoKKyAgICAgICAqICBGb3IgbW9yZSBvbiBAYSBoaW50aW5nLCBzZWU6CisgICAgICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQwN2NoMTcuaHRtbAorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRpb24gcmVxdWlyZXMgbG9nYXJpdGhtaWMgdGltZSAoaWYgdGhlIGhpbnQgaXMgbm90IHRha2VuKS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90Ll9NX2luc2VydF91bmlxdWVfKF9fcG9zaXRpb24sIF9feCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgdmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuX01faW5zZXJ0X3VuaXF1ZV8oX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCkpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEEgdGVtcGxhdGUgZnVuY3Rpb24gdGhhdCBhdHRlbXB0cyB0byBpbnNlcnQgYSByYW5nZQorICAgICAgICogIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlLgorICAgICAgICoKKyAgICAgICAqICBDb21wbGV4aXR5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgcmFuZ2UgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXZvaWQKKwlpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorCXsgX01fdC5fTV9pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBdHRlbXB0cyB0byBpbnNlcnQgYSBsaXN0IG9mIGVsZW1lbnRzIGludG8gdGhlICVzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEEgc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IG9mIGVsZW1lbnRzCisgICAgICAgKiAgICAgICAgICAgICAgIHRvIGJlIGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBDb21wbGV4aXR5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgcmFuZ2UgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgdGhpcy0+aW5zZXJ0KF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDEzMC4gQXNzb2NpYXRpdmUgZXJhc2Ugc2hvdWxkIHJldHVybiBhbiBpdGVyYXRvci4KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgYW4gZWxlbWVudCBmcm9tIGEgJXNldC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IGltbWVkaWF0ZWx5IGZvbGxvd2luZworICAgICAgICogICAgICAgICAgQGEgX19wb3NpdGlvbiBwcmlvciB0byB0aGUgZWxlbWVudCBiZWluZyBlcmFzZWQuIElmIG5vIHN1Y2gKKyAgICAgICAqICAgICAgICAgIGVsZW1lbnQgZXhpc3RzLCBlbmQoKSBpcyByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYW4gZWxlbWVudCwgcG9pbnRlZCB0byBieSB0aGUgZ2l2ZW4gaXRlcmF0b3IsCisgICAgICAgKiAgZnJvbSBhICVzZXQuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwgYW5kCisgICAgICAgKiAgdGhhdCBpZiB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90CisgICAgICAgKiAgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncworICAgICAgICogIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBfR0xJQkNYWF9BQklfVEFHX0NYWDExCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXJhc2UoX19wb3NpdGlvbik7IH0KKyNlbHNlCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGFuIGVsZW1lbnQgZnJvbSBhICVzZXQuCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhbiBlbGVtZW50LCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBpdGVyYXRvciwKKyAgICAgICAqICBmcm9tIGEgJXNldC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LCBhbmQKKyAgICAgICAqICB0aGF0IGlmIHRoZSBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QKKyAgICAgICAqICB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzCisgICAgICAgKiAgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IF9NX3QuZXJhc2UoX19wb3NpdGlvbik7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGVsZW1lbnRzIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgb2YgZWxlbWVudCB0byBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyBlcmFzZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGFsbCB0aGUgZWxlbWVudHMgbG9jYXRlZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KKyAgICAgICAqICBhICVzZXQuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGF0IGlmCisgICAgICAgKiAgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkCisgICAgICAgKiAgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXJhc2UoX194KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMTMwLiBBc3NvY2lhdGl2ZSBlcmFzZSBzaG91bGQgcmV0dXJuIGFuIGl0ZXJhdG9yLgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhIFtfX2ZpcnN0LF9fbGFzdCkgcmFuZ2Ugb2YgZWxlbWVudHMgZnJvbSBhICVzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgZXJhc2VkLgorCisgICAgICAgKiAgQHBhcmFtIF9fbGFzdCBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSByYW5nZSB0bworICAgICAgICogIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuIFRoZSBpdGVyYXRvciBAYSBfX2xhc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMgZnJvbSBhICVzZXQuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGF0IGlmCisgICAgICAgKiAgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkCisgICAgICAgKiAgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIF9HTElCQ1hYX0FCSV9UQUdfQ1hYMTEKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7IHJldHVybiBfTV90LmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbHNlCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGEgW2ZpcnN0LGxhc3QpIHJhbmdlIG9mIGVsZW1lbnRzIGZyb20gYSAlc2V0LgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgIGVyYXNlZC4KKyAgICAgICAqICBAcGFyYW0gX19sYXN0IEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvCisgICAgICAgKiAgYmUgZXJhc2VkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhIHNlcXVlbmNlIG9mIGVsZW1lbnRzIGZyb20gYSAlc2V0LgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LCBhbmQgdGhhdCBpZgorICAgICAgICogIHRoZSBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZAorICAgICAgICogIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7IF9NX3QuZXJhc2UoX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEVyYXNlcyBhbGwgZWxlbWVudHMgaW4gYSAlc2V0LiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMKKyAgICAgICAqICB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywgdGhlCisgICAgICAgKiAgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzCisgICAgICAgKiAgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyBfTV90LmNsZWFyKCk7IH0KKworICAgICAgLy8gc2V0IG9wZXJhdGlvbnM6CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZHMgdGhlIG51bWJlciBvZiBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRWxlbWVudCB0byBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIE51bWJlciBvZiBlbGVtZW50cyB3aXRoIHNwZWNpZmllZCBrZXkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gb25seSBtYWtlcyBzZW5zZSBmb3IgbXVsdGlzZXRzOyBmb3Igc2V0IHRoZSByZXN1bHQgd2lsbAorICAgICAgICogIGVpdGhlciBiZSAwIChub3QgcHJlc2VudCkgb3IgMSAocHJlc2VudCkuCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZmluZChfX3gpID09IF9NX3QuZW5kKCkgPyAwIDogMTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTQuICBzZXQ6OmZpbmQoKSBtaXNzaW5nIGNvbnN0IG92ZXJsb2FkCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgVHJpZXMgdG8gbG9jYXRlIGFuIGVsZW1lbnQgaW4gYSAlc2V0LgorICAgICAgICogIEBwYXJhbSAgX194ICBFbGVtZW50IHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gc291Z2h0LWFmdGVyIGVsZW1lbnQsIG9yIGVuZCgpIGlmIG5vdAorICAgICAgICogICAgICAgICAgIGZvdW5kLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHRha2VzIGEga2V5IGFuZCB0cmllcyB0byBsb2NhdGUgdGhlIGVsZW1lbnQgd2l0aCB3aGljaAorICAgICAgICogIHRoZSBrZXkgbWF0Y2hlcy4gIElmIHN1Y2Nlc3NmdWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gaXRlcmF0b3IKKyAgICAgICAqICBwb2ludGluZyB0byB0aGUgc291Z2h0IGFmdGVyIGVsZW1lbnQuICBJZiB1bnN1Y2Nlc3NmdWwgaXQgcmV0dXJucyB0aGUKKyAgICAgICAqICBwYXN0LXRoZS1lbmQgKCBAYyBlbmQoKSApIGl0ZXJhdG9yLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5maW5kKF9feCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZmluZChfX3gpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBwb2ludGluZyB0byBmaXJzdCBlbGVtZW50IGVxdWFsIHRvIG9yIGdyZWF0ZXIKKyAgICAgICAqICAgICAgICAgICB0aGFuIGtleSwgb3IgZW5kKCkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiBhIHN1YnNlcXVlbmNlIG9mIGVsZW1lbnRzCisgICAgICAgKiAgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBrZXkuICBJZiB1bnN1Y2Nlc3NmdWwgaXQgcmV0dXJucyBhbiBpdGVyYXRvcgorICAgICAgICogIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaGFzIGEgZ3JlYXRlciB2YWx1ZSB0aGFuIGdpdmVuIGtleQorICAgICAgICogIG9yIGVuZCgpIGlmIG5vIHN1Y2ggZWxlbWVudCBleGlzdHMuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5sb3dlcl9ib3VuZChfX3gpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5sb3dlcl9ib3VuZChfX3gpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyB0aGUgZW5kIG9mIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50CisgICAgICAgKiAgICAgICAgICBncmVhdGVyIHRoYW4ga2V5LCBvciBlbmQoKS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEZpbmRzIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBQYWlyIG9mIGl0ZXJhdG9ycyB0aGF0IHBvc3NpYmx5IHBvaW50cyB0byB0aGUgc3Vic2VxdWVuY2UKKyAgICAgICAqICAgICAgICAgICBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0bworICAgICAgICogIEBjb2RlCisgICAgICAgKiAgICBzdGQ6Om1ha2VfcGFpcihjLmxvd2VyX2JvdW5kKHZhbCksCisgICAgICAgKiAgICAgICAgICAgICAgICAgICBjLnVwcGVyX2JvdW5kKHZhbCkpCisgICAgICAgKiAgQGVuZGNvZGUKKyAgICAgICAqICAoYnV0IGlzIGZhc3RlciB0aGFuIG1ha2luZyB0aGUgY2FsbHMgc2VwYXJhdGVseSkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcHJvYmFibHkgb25seSBtYWtlcyBzZW5zZSBmb3IgbXVsdGlzZXRzLgorICAgICAgICovCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2UoX194KTsgfQorCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2UoX194KTsgfQorICAgICAgLy9AfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSzEsIHR5cGVuYW1lIF9DMSwgdHlwZW5hbWUgX0ExPgorCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBzZXQ8X0sxLCBfQzEsIF9BMT4mLCBjb25zdCBzZXQ8X0sxLCBfQzEsIF9BMT4mKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0sxLCB0eXBlbmFtZSBfQzEsIHR5cGVuYW1lIF9BMT4KKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPChjb25zdCBzZXQ8X0sxLCBfQzEsIF9BMT4mLCBjb25zdCBzZXQ8X0sxLCBfQzEsIF9BMT4mKTsKKyAgICB9OworCisKKyAgLyoqCisgICAqICBAYnJpZWYgIFNldCBlcXVhbGl0eSBjb21wYXJpc29uLgorICAgKiAgQHBhcmFtICBfX3ggIEEgJXNldC4KKyAgICogIEBwYXJhbSAgX195ICBBICVzZXQgb2YgdGhlIHNhbWUgdHlwZSBhcyBAYSB4LgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZmYgdGhlIHNpemUgYW5kIGVsZW1lbnRzIG9mIHRoZSBzZXRzIGFyZSBlcXVhbC4KKyAgICoKKyAgICogIFRoaXMgaXMgYW4gZXF1aXZhbGVuY2UgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlIHNldHMuCisgICAqICBTZXRzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgaWYgdGhlaXIgc2l6ZXMgYXJlIGVxdWFsLCBhbmQgaWYKKyAgICogIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgY29tcGFyZSBlcXVhbC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV90ID09IF9feS5fTV90OyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFNldCBvcmRlcmluZyByZWxhdGlvbi4KKyAgICogIEBwYXJhbSAgX194ICBBICVzZXQuCisgICAqICBAcGFyYW0gIF9feSAgQSAlc2V0IG9mIHRoZSBzYW1lIHR5cGUgYXMgQGEgeC4KKyAgICogIEByZXR1cm4gIFRydWUgaWZmIEBhIF9feCBpcyBsZXhpY29ncmFwaGljYWxseSBsZXNzIHRoYW4gQGEgX195LgorICAgKgorICAgKiAgVGhpcyBpcyBhIHRvdGFsIG9yZGVyaW5nIHJlbGF0aW9uLiAgSXQgaXMgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZQorICAgKiAgbWFwcy4gIFRoZSBlbGVtZW50cyBtdXN0IGJlIGNvbXBhcmFibGUgd2l0aCBAYyA8LgorICAgKgorICAgKiAgU2VlIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoKSBmb3IgaG93IHRoZSBkZXRlcm1pbmF0aW9uIGlzIG1hZGUuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisJICAgICAgY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX3QgPCBfX3kuX01fdDsgfQorCisgIC8vLyAgUmV0dXJucyAhKHggPT0geSkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgLy8vICBSZXR1cm5zIHkgPCB4LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feSA8IF9feDsgfQorCisgIC8vLyAgUmV0dXJucyAhKHkgPCB4KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgLy8vICBSZXR1cm5zICEoeCA8IHkpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworICAvLy8gU2VlIHN0ZDo6c2V0Ojpzd2FwKCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy9uYW1lc3BhY2Ugc3RkCisjZW5kaWYgLyogX1NUTF9TRVRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9zdGFjay5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF9zdGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmY2EwNGEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3N0YWNrLmgKQEAgLTAsMCArMSwzMDMgQEAKKy8vIFN0YWNrIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9zdGFjay5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7c3RhY2t9CisgKi8KKworI2lmbmRlZiBfU1RMX1NUQUNLX0gKKyNkZWZpbmUgX1NUTF9TVEFDS19IIDEKKworI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBicmllZiAgQSBzdGFuZGFyZCBjb250YWluZXIgZ2l2aW5nIEZJTE8gYmVoYXZpb3IuCisgICAqCisgICAqICBAaW5ncm91cCBzZXF1ZW5jZXMKKyAgICoKKyAgICogIEB0cGFyYW0gX1RwICBUeXBlIG9mIGVsZW1lbnQuCisgICAqICBAdHBhcmFtIF9TZXF1ZW5jZSAgVHlwZSBvZiB1bmRlcmx5aW5nIHNlcXVlbmNlLCBkZWZhdWx0cyB0byBkZXF1ZTxfVHA+LgorICAgKgorICAgKiAgTWVldHMgbWFueSBvZiB0aGUgcmVxdWlyZW1lbnRzIG9mIGEKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LAorICAgKiAgYnV0IGRvZXMgbm90IGRlZmluZSBhbnl0aGluZyB0byBkbyB3aXRoIGl0ZXJhdG9ycy4gIFZlcnkgZmV3IG9mIHRoZQorICAgKiAgb3RoZXIgc3RhbmRhcmQgY29udGFpbmVyIGludGVyZmFjZXMgYXJlIGRlZmluZWQuCisgICAqCisgICAqICBUaGlzIGlzIG5vdCBhIHRydWUgY29udGFpbmVyLCBidXQgYW4gQGUgYWRhcHRvci4gIEl0IGhvbGRzCisgICAqICBhbm90aGVyIGNvbnRhaW5lciwgYW5kIHByb3ZpZGVzIGEgd3JhcHBlciBpbnRlcmZhY2UgdG8gdGhhdAorICAgKiAgY29udGFpbmVyLiAgVGhlIHdyYXBwZXIgaXMgd2hhdCBlbmZvcmNlcyBzdHJpY3QKKyAgICogIGZpcnN0LWluLWxhc3Qtb3V0ICVzdGFjayBiZWhhdmlvci4KKyAgICoKKyAgICogIFRoZSBzZWNvbmQgdGVtcGxhdGUgcGFyYW1ldGVyIGRlZmluZXMgdGhlIHR5cGUgb2YgdGhlIHVuZGVybHlpbmcKKyAgICogIHNlcXVlbmNlL2NvbnRhaW5lci4gIEl0IGRlZmF1bHRzIHRvIHN0ZDo6ZGVxdWUsIGJ1dCBpdCBjYW4gYmUKKyAgICogIGFueSB0eXBlIHRoYXQgc3VwcG9ydHMgQGMgYmFjaywgQGMgcHVzaF9iYWNrLCBhbmQgQGMgcG9wX2Zyb250LAorICAgKiAgc3VjaCBhcyBzdGQ6Omxpc3QsIHN0ZDo6dmVjdG9yLCBvciBhbiBhcHByb3ByaWF0ZSB1c2VyLWRlZmluZWQKKyAgICogIHR5cGUuCisgICAqCisgICAqICBNZW1iZXJzIG5vdCBmb3VuZCBpbiBAYSBub3JtYWwgY29udGFpbmVycyBhcmUgQGMgY29udGFpbmVyX3R5cGUsCisgICAqICB3aGljaCBpcyBhIHR5cGVkZWYgZm9yIHRoZSBzZWNvbmQgU2VxdWVuY2UgcGFyYW1ldGVyLCBhbmQgQGMKKyAgICogIHB1c2gsIEBjIHBvcCwgYW5kIEBjIHRvcCwgd2hpY2ggYXJlIHN0YW5kYXJkICVzdGFjay9GSUxPCisgICAqICBvcGVyYXRpb25zLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXF1ZW5jZSA9IGRlcXVlPF9UcD4gPgorICAgIGNsYXNzIHN0YWNrCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjp2YWx1ZV90eXBlIF9TZXF1ZW5jZV92YWx1ZV90eXBlOworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9UcCwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9TZXF1ZW5jZSwgX0JhY2tJbnNlcnRpb25TZXF1ZW5jZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMyKF9UcCwgX1NlcXVlbmNlX3ZhbHVlX3R5cGUsIF9TYW1lVHlwZUNvbmNlcHQpCisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9TZXExPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcj09KGNvbnN0IHN0YWNrPF9UcDEsIF9TZXExPiYsIGNvbnN0IHN0YWNrPF9UcDEsIF9TZXExPiYpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfU2VxMT4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I8KGNvbnN0IHN0YWNrPF9UcDEsIF9TZXExPiYsIGNvbnN0IHN0YWNrPF9UcDEsIF9TZXExPiYpOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnZhbHVlX3R5cGUgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpyZWZlcmVuY2UgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpjb25zdF9yZWZlcmVuY2UgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpzaXplX3R5cGUgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgICAgICAgICAgX1NlcXVlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8gIFNlZSBxdWV1ZTo6YyBmb3Igbm90ZXMgb24gdGhpcyBuYW1lLgorICAgICAgX1NlcXVlbmNlIGM7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBYWFggcmVtb3ZlZCBvbGQgZGVmIGN0b3IsIGFkZGVkIGRlZiBhcmcgdG8gdGhpcyBvbmUgdG8gbWF0Y2ggMTQ4ODIKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIG5vIGVsZW1lbnRzLgorICAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgICAgICBleHBsaWNpdAorICAgICAgc3RhY2soY29uc3QgX1NlcXVlbmNlJiBfX2MgPSBfU2VxdWVuY2UoKSkKKyAgICAgIDogYyhfX2MpIHsgfQorI2Vsc2UKKyAgICAgIGV4cGxpY2l0CisgICAgICBzdGFjayhjb25zdCBfU2VxdWVuY2UmIF9fYykKKyAgICAgIDogYyhfX2MpIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgc3RhY2soX1NlcXVlbmNlJiYgX19jID0gX1NlcXVlbmNlKCkpCisgICAgICA6IGMoc3RkOjptb3ZlKF9fYykpIHsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgJXN0YWNrIGlzIGVtcHR5LgorICAgICAgICovCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBjLmVtcHR5KCk7IH0KKworICAgICAgLyoqICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlICVzdGFjay4gICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gYy5zaXplKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICVzdGFjay4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICB0b3AoKQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19ub25lbXB0eSgpOworCXJldHVybiBjLmJhY2soKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlc3RhY2suCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgdG9wKCkgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfbm9uZW1wdHkoKTsKKwlyZXR1cm4gYy5iYWNrKCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWRkIGRhdGEgdG8gdGhlIHRvcCBvZiB0aGUgJXN0YWNrLgorICAgICAgICogIEBwYXJhbSAgX194ICBEYXRhIHRvIGJlIGFkZGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgdHlwaWNhbCAlc3RhY2sgb3BlcmF0aW9uLiAgVGhlIGZ1bmN0aW9uIGNyZWF0ZXMgYW4KKyAgICAgICAqICBlbGVtZW50IGF0IHRoZSB0b3Agb2YgdGhlICVzdGFjayBhbmQgYXNzaWducyB0aGUgZ2l2ZW4gZGF0YQorICAgICAgICogIHRvIGl0LiAgVGhlIHRpbWUgY29tcGxleGl0eSBvZiB0aGUgb3BlcmF0aW9uIGRlcGVuZHMgb24gdGhlCisgICAgICAgKiAgdW5kZXJseWluZyBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcHVzaChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IGMucHVzaF9iYWNrKF9feCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHB1c2godmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgYy5wdXNoX2JhY2soc3RkOjptb3ZlKF9feCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyBjLmVtcGxhY2VfYmFjayhzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmVzIGZpcnN0IGVsZW1lbnQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSB0eXBpY2FsICVzdGFjayBvcGVyYXRpb24uICBJdCBzaHJpbmtzIHRoZSAlc3RhY2sKKyAgICAgICAqICBieSBvbmUuICBUaGUgdGltZSBjb21wbGV4aXR5IG9mIHRoZSBvcGVyYXRpb24gZGVwZW5kcyBvbiB0aGUKKyAgICAgICAqICB1bmRlcmx5aW5nIHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgbm8gZGF0YSBpcyByZXR1cm5lZCwgYW5kIGlmIHRoZSBmaXJzdCBlbGVtZW50J3MKKyAgICAgICAqICBkYXRhIGlzIG5lZWRlZCwgaXQgc2hvdWxkIGJlIHJldHJpZXZlZCBiZWZvcmUgcG9wKCkgaXMKKyAgICAgICAqICBjYWxsZWQuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBvcCgpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX25vbmVtcHR5KCk7CisJYy5wb3BfYmFjaygpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgc3dhcChzdGFjayYgX19zKQorICAgICAgbm9leGNlcHQobm9leGNlcHQoc3dhcChjLCBfX3MuYykpKQorICAgICAgeworCXVzaW5nIHN0ZDo6c3dhcDsKKwlzd2FwKGMsIF9fcy5jKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFN0YWNrIGVxdWFsaXR5IGNvbXBhcmlzb24uCisgICAqICBAcGFyYW0gIF9feCAgQSAlc3RhY2suCisgICAqICBAcGFyYW0gIF9feSAgQSAlc3RhY2sgb2YgdGhlIHNhbWUgdHlwZSBhcyBAYSBfX3guCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiB0aGUgc2l6ZSBhbmQgZWxlbWVudHMgb2YgdGhlIHN0YWNrcyBhcmUgZXF1YWwuCisgICAqCisgICAqICBUaGlzIGlzIGFuIGVxdWl2YWxlbmNlIHJlbGF0aW9uLiAgQ29tcGxleGl0eSBhbmQgc2VtYW50aWNzCisgICAqICBkZXBlbmQgb24gdGhlIHVuZGVybHlpbmcgc2VxdWVuY2UgdHlwZSwgYnV0IHRoZSBleHBlY3RlZCBydWxlcworICAgKiAgYXJlOiB0aGlzIHJlbGF0aW9uIGlzIGxpbmVhciBpbiB0aGUgc2l6ZSBvZiB0aGUgc2VxdWVuY2VzLCBhbmQKKyAgICogIHN0YWNrcyBhcmUgY29uc2lkZXJlZCBlcXVpdmFsZW50IGlmIHRoZWlyIHNlcXVlbmNlcyBjb21wYXJlCisgICAqICBlcXVhbC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfU2VxPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzdGFjazxfVHAsIF9TZXE+JiBfX3gsIGNvbnN0IHN0YWNrPF9UcCwgX1NlcT4mIF9feSkKKyAgICB7IHJldHVybiBfX3guYyA9PSBfX3kuYzsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBTdGFjayBvcmRlcmluZyByZWxhdGlvbi4KKyAgICogIEBwYXJhbSAgX194ICBBICVzdGFjay4KKyAgICogIEBwYXJhbSAgX195ICBBICVzdGFjayBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIHguCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiBAYSB4IGlzIGxleGljb2dyYXBoaWNhbGx5IGxlc3MgdGhhbiBAYSBfX3kuCisgICAqCisgICAqICBUaGlzIGlzIGFuIHRvdGFsIG9yZGVyaW5nIHJlbGF0aW9uLiAgQ29tcGxleGl0eSBhbmQgc2VtYW50aWNzCisgICAqICBkZXBlbmQgb24gdGhlIHVuZGVybHlpbmcgc2VxdWVuY2UgdHlwZSwgYnV0IHRoZSBleHBlY3RlZCBydWxlcworICAgKiAgYXJlOiB0aGlzIHJlbGF0aW9uIGlzIGxpbmVhciBpbiB0aGUgc2l6ZSBvZiB0aGUgc2VxdWVuY2VzLCB0aGUKKyAgICogIGVsZW1lbnRzIG11c3QgYmUgY29tcGFyYWJsZSB3aXRoIEBjIDwsIGFuZAorICAgKiAgc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgpIGlzIHVzdWFsbHkgdXNlZCB0byBtYWtlIHRoZQorICAgKiAgZGV0ZXJtaW5hdGlvbi4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfU2VxPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHN0YWNrPF9UcCwgX1NlcT4mIF9feCwgY29uc3Qgc3RhY2s8X1RwLCBfU2VxPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5jIDwgX195LmM7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I9PQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXE+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0YWNrPF9UcCwgX1NlcT4mIF9feCwgY29uc3Qgc3RhY2s8X1RwLCBfU2VxPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBzdGFjazxfVHAsIF9TZXE+JiBfX3gsIGNvbnN0IHN0YWNrPF9UcCwgX1NlcT4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3Qgc3RhY2s8X1RwLCBfU2VxPiYgX194LCBjb25zdCBzdGFjazxfVHAsIF9TZXE+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXE+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHN0YWNrPF9UcCwgX1NlcT4mIF9feCwgY29uc3Qgc3RhY2s8X1RwLCBfU2VxPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXE+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHN0YWNrPF9UcCwgX1NlcT4mIF9feCwgc3RhY2s8X1RwLCBfU2VxPiYgX195KQorICAgIG5vZXhjZXB0KG5vZXhjZXB0KF9feC5zd2FwKF9feSkpKQorICAgIHsgX194LnN3YXAoX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCB1c2VzX2FsbG9jYXRvcjxzdGFjazxfVHAsIF9TZXE+LCBfQWxsb2M+CisgICAgOiBwdWJsaWMgdXNlc19hbGxvY2F0b3I8X1NlcSwgX0FsbG9jPjo6dHlwZSB7IH07CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX1NUTF9TVEFDS19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3RlbXBidWYuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfdGVtcGJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZTcwNWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3RlbXBidWYuaApAQCAtMCwwICsxLDI3MSBAQAorLy8gVGVtcG9yYXJ5IGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfdGVtcGJ1Zi5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bWVtb3J5fQorICovCisKKyNpZm5kZWYgX1NUTF9URU1QQlVGX0gKKyNkZWZpbmUgX1NUTF9URU1QQlVGX0ggMQorCisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9jb25zdHJ1Y3QuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmIEFsbG9jYXRlcyBhIHRlbXBvcmFyeSBidWZmZXIuCisgICAqICBAcGFyYW0gIF9fbGVuICBUaGUgbnVtYmVyIG9mIG9iamVjdHMgb2YgdHlwZSBUcC4KKyAgICogIEByZXR1cm4gU2VlIGZ1bGwgZGVzY3JpcHRpb24uCisgICAqCisgICAqICBSZWludmVudGluZyB0aGUgd2hlZWwsIGJ1dCB0aGlzIHRpbWUgd2l0aCBwcmV0dGllciBzcG9rZXMhCisgICAqCisgICAqICBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIG9idGFpbiBzdG9yYWdlIGZvciBAYyBfX2xlbiBhZGphY2VudCBUcAorICAgKiAgb2JqZWN0cy4gIFRoZSBvYmplY3RzIHRoZW1zZWx2ZXMgYXJlIG5vdCBjb25zdHJ1Y3RlZCwgb2YgY291cnNlLgorICAgKiAgQSBwYWlyPD4gaXMgcmV0dXJuZWQgY29udGFpbmluZyA8ZW0+dGhlIGJ1ZmZlciBzIGFkZHJlc3MgYW5kCisgICAqICBjYXBhY2l0eSAoaW4gdGhlIHVuaXRzIG9mIHNpemVvZihfVHApKSwgb3IgYSBwYWlyIG9mIDAgdmFsdWVzIGlmCisgICAqICBubyBzdG9yYWdlIGNhbiBiZSBvYnRhaW5lZC48L2VtPiAgTm90ZSB0aGF0IHRoZSBjYXBhY2l0eSBvYnRhaW5lZAorICAgKiAgbWF5IGJlIGxlc3MgdGhhbiB0aGF0IHJlcXVlc3RlZCBpZiB0aGUgbWVtb3J5IGlzIHVuYXZhaWxhYmxlOworICAgKiAgeW91IHNob3VsZCBjb21wYXJlIGxlbiB3aXRoIHRoZSAuc2Vjb25kIHJldHVybiB2YWx1ZS4KKyAgICoKKyAgICogUHJvdmlkZXMgdGhlIG5vdGhyb3cgZXhjZXB0aW9uIGd1YXJhbnRlZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBwYWlyPF9UcCosIHB0cmRpZmZfdD4KKyAgICBnZXRfdGVtcG9yYXJ5X2J1ZmZlcihwdHJkaWZmX3QgX19sZW4pIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgY29uc3QgcHRyZGlmZl90IF9fbWF4ID0KKwlfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8cHRyZGlmZl90Pjo6X19tYXggLyBzaXplb2YoX1RwKTsKKyAgICAgIGlmIChfX2xlbiA+IF9fbWF4KQorCV9fbGVuID0gX19tYXg7CisgICAgICAKKyAgICAgIHdoaWxlIChfX2xlbiA+IDApIAorCXsKKwkgIF9UcCogX190bXAgPSBzdGF0aWNfY2FzdDxfVHAqPig6Om9wZXJhdG9yIG5ldyhfX2xlbiAqIHNpemVvZihfVHApLCAKKwkJCQkJCQlzdGQ6Om5vdGhyb3cpKTsKKwkgIGlmIChfX3RtcCAhPSAwKQorCSAgICByZXR1cm4gc3RkOjpwYWlyPF9UcCosIHB0cmRpZmZfdD4oX190bXAsIF9fbGVuKTsKKwkgIF9fbGVuIC89IDI7CisJfQorICAgICAgcmV0dXJuIHN0ZDo6cGFpcjxfVHAqLCBwdHJkaWZmX3Q+KHN0YXRpY19jYXN0PF9UcCo+KDApLCAwKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgVGhlIGNvbXBhbmlvbiB0byBnZXRfdGVtcG9yYXJ5X2J1ZmZlcigpLgorICAgKiAgQHBhcmFtICBfX3AgIEEgYnVmZmVyIHByZXZpb3VzbHkgYWxsb2NhdGVkIGJ5IGdldF90ZW1wb3JhcnlfYnVmZmVyLgorICAgKiAgQHJldHVybiAgIE5vbmUuCisgICAqCisgICAqICBGcmVlcyB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgX19wLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgcmV0dXJuX3RlbXBvcmFyeV9idWZmZXIoX1RwKiBfX3ApCisgICAgeyA6Om9wZXJhdG9yIGRlbGV0ZShfX3AsIHN0ZDo6bm90aHJvdyk7IH0KKworCisgIC8qKgorICAgKiAgVGhpcyBjbGFzcyBpcyB1c2VkIGluIHR3byBwbGFjZXM6IHN0bF9hbGdvLmggYW5kIGV4dC9tZW1vcnksCisgICAqICB3aGVyZSBpdCBpcyB3cmFwcGVkIGFzIHRoZSB0ZW1wb3JhcnlfYnVmZmVyIGNsYXNzLiAgU2VlCisgICAqICB0ZW1wb3JhcnlfYnVmZmVyIGRvY3MgZm9yIG1vcmUgbm90ZXMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgX1RlbXBvcmFyeV9idWZmZXIKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0KQorCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOworICAgICAgdHlwZWRlZiBwb2ludGVyICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgc2l6ZV90eXBlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgc2l6ZV90eXBlICBfTV9vcmlnaW5hbF9sZW47CisgICAgICBzaXplX3R5cGUgIF9NX2xlbjsKKyAgICAgIHBvaW50ZXIgICAgX01fYnVmZmVyOworCisgICAgcHVibGljOgorICAgICAgLy8vIEFzIHBlciBUYWJsZSBtdW1ibGUuCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbGVuOyB9CisKKyAgICAgIC8vLyBSZXR1cm5zIHRoZSBzaXplIHJlcXVlc3RlZCBieSB0aGUgY29uc3RydWN0b3I7IG1heSBiZSA+c2l6ZSgpLgorICAgICAgc2l6ZV90eXBlCisgICAgICByZXF1ZXN0ZWRfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9vcmlnaW5hbF9sZW47IH0KKworICAgICAgLy8vIEFzIHBlciBUYWJsZSBtdW1ibGUuCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKQorICAgICAgeyByZXR1cm4gX01fYnVmZmVyOyB9CisKKyAgICAgIC8vLyBBcyBwZXIgVGFibGUgbXVtYmxlLgorICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpCisgICAgICB7IHJldHVybiBfTV9idWZmZXIgKyBfTV9sZW47IH0KKworICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgdGVtcG9yYXJ5IGJ1ZmZlciBvZiBhIHNpemUgc29tZXdoZXJlIGJldHdlZW4KKyAgICAgICAqIHplcm8gYW5kIHRoZSBzaXplIG9mIHRoZSBnaXZlbiByYW5nZS4KKyAgICAgICAqLworICAgICAgX1RlbXBvcmFyeV9idWZmZXIoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCk7CisKKyAgICAgIH5fVGVtcG9yYXJ5X2J1ZmZlcigpCisgICAgICB7CisJc3RkOjpfRGVzdHJveShfTV9idWZmZXIsIF9NX2J1ZmZlciArIF9NX2xlbik7CisJc3RkOjpyZXR1cm5fdGVtcG9yYXJ5X2J1ZmZlcihfTV9idWZmZXIpOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIERpc2FibGUgY29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgIF9UZW1wb3JhcnlfYnVmZmVyKGNvbnN0IF9UZW1wb3JhcnlfYnVmZmVyJik7CisKKyAgICAgIHZvaWQKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfVGVtcG9yYXJ5X2J1ZmZlciYpOworICAgIH07CisKKworICB0ZW1wbGF0ZTxib29sPgorICAgIHN0cnVjdCBfX3VuaW5pdGlhbGl6ZWRfY29uc3RydWN0X2J1Zl9kaXNwYXRjaAorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Qb2ludGVyLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBzdGF0aWMgdm9pZAorICAgICAgICBfX3VjcihfUG9pbnRlciBfX2ZpcnN0LCBfUG9pbnRlciBfX2xhc3QsCisJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3NlZWQpCisgICAgICAgIHsKKwkgIGlmKF9fZmlyc3QgPT0gX19sYXN0KQorCSAgICByZXR1cm47CisKKwkgIF9Qb2ludGVyIF9fY3VyID0gX19maXJzdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBzdGQ6Ol9Db25zdHJ1Y3Qoc3RkOjpfX2FkZHJlc3NvZigqX19maXJzdCksCisJCQkgICAgICBfR0xJQkNYWF9NT1ZFKCpfX3NlZWQpKTsKKwkgICAgICBfUG9pbnRlciBfX3ByZXYgPSBfX2N1cjsKKwkgICAgICArK19fY3VyOworCSAgICAgIGZvcig7IF9fY3VyICE9IF9fbGFzdDsgKytfX2N1ciwgKytfX3ByZXYpCisJCXN0ZDo6X0NvbnN0cnVjdChzdGQ6Ol9fYWRkcmVzc29mKCpfX2N1ciksCisJCQkJX0dMSUJDWFhfTU9WRSgqX19wcmV2KSk7CisJICAgICAgKl9fc2VlZCA9IF9HTElCQ1hYX01PVkUoKl9fcHJldik7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgc3RkOjpfRGVzdHJveShfX2ZpcnN0LCBfX2N1cik7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwl9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fdW5pbml0aWFsaXplZF9jb25zdHJ1Y3RfYnVmX2Rpc3BhdGNoPHRydWU+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BvaW50ZXIsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHN0YXRpYyB2b2lkCisgICAgICAgIF9fdWNyKF9Qb2ludGVyLCBfUG9pbnRlciwgX0ZvcndhcmRJdGVyYXRvcikgeyB9CisgICAgfTsKKworICAvLyBDb25zdHJ1Y3RzIG9iamVjdHMgaW4gdGhlIHJhbmdlIFtmaXJzdCwgbGFzdCkuCisgIC8vIE5vdGUgdGhhdCB3aGlsZSB0aGVzZSBuZXcgb2JqZWN0cyB3aWxsIHRha2UgdmFsaWQgdmFsdWVzLAorICAvLyB0aGVpciBleGFjdCB2YWx1ZSBpcyBub3QgZGVmaW5lZC4gSW4gcGFydGljdWxhciB0aGV5IG1heQorICAvLyBiZSAnbW92ZWQgZnJvbScuCisgIC8vCisgIC8vIFdoaWxlICpfX3NlZWQgbWF5IGJlIGFsdGVyZWQgZHVyaW5nIHRoaXMgYWxnb3JpdGhtLCBpdCB3aWxsIGhhdmUKKyAgLy8gdGhlIHNhbWUgdmFsdWUgd2hlbiB0aGUgYWxnb3JpdGhtIGZpbmlzaGVzLCB1bmxlc3Mgb25lIG9mIHRoZQorICAvLyBjb25zdHJ1Y3Rpb25zIHRocm93cy4KKyAgLy8KKyAgLy8gUmVxdWlyZW1lbnRzOiBfUG9pbnRlcjo6dmFsdWVfdHlwZShfVHAmJikgaXMgdmFsaWQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Qb2ludGVyLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgX191bmluaXRpYWxpemVkX2NvbnN0cnVjdF9idWYoX1BvaW50ZXIgX19maXJzdCwgX1BvaW50ZXIgX19sYXN0LAorCQkJCSAgX0ZvcndhcmRJdGVyYXRvciBfX3NlZWQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUG9pbnRlcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb25zdHJ1Y3RfYnVmX2Rpc3BhdGNoPAorICAgICAgICBfX2hhc190cml2aWFsX2NvbnN0cnVjdG9yKF9WYWx1ZVR5cGUpPjo6CisJICBfX3VjcihfX2ZpcnN0LCBfX2xhc3QsIF9fc2VlZCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBfVGVtcG9yYXJ5X2J1ZmZlcjxfRm9yd2FyZEl0ZXJhdG9yLCBfVHA+OjoKKyAgICBfVGVtcG9yYXJ5X2J1ZmZlcihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQorICAgIDogX01fb3JpZ2luYWxfbGVuKHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KSksCisgICAgICBfTV9sZW4oMCksIF9NX2J1ZmZlcigwKQorICAgIHsKKyAgICAgIF9fdHJ5CisJeworCSAgc3RkOjpwYWlyPHBvaW50ZXIsIHNpemVfdHlwZT4gX19wKHN0ZDo6Z2V0X3RlbXBvcmFyeV9idWZmZXI8CisJCQkJCSAgICB2YWx1ZV90eXBlPihfTV9vcmlnaW5hbF9sZW4pKTsKKwkgIF9NX2J1ZmZlciA9IF9fcC5maXJzdDsKKwkgIF9NX2xlbiA9IF9fcC5zZWNvbmQ7CisJICBpZiAoX01fYnVmZmVyKQorCSAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb25zdHJ1Y3RfYnVmKF9NX2J1ZmZlciwgX01fYnVmZmVyICsgX01fbGVuLAorCQkJCQkgICAgICAgX19maXJzdCk7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgc3RkOjpyZXR1cm5fdGVtcG9yYXJ5X2J1ZmZlcihfTV9idWZmZXIpOworCSAgX01fYnVmZmVyID0gMDsKKwkgIF9NX2xlbiA9IDA7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfU1RMX1RFTVBCVUZfSCAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3RyZWUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfdHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYmY0ZGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3RyZWUuaApAQCAtMCwwICsxLDE4NjcgQEAKKy8vIFJCIHRyZWUgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfdHJlZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bWFwLHNldH0KKyAqLworCisjaWZuZGVmIF9TVExfVFJFRV9ICisjZGVmaW5lIF9TVExfVFJFRV9IIDEKKworI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+CisjaW5jbHVkZSA8Yml0cy9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9mdW5jdGlvbi5oPgorI2luY2x1ZGUgPGJpdHMvY3BwX3R5cGVfdHJhaXRzLmg+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPGJpdHMvYWxsb2NfdHJhaXRzLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFJlZC1ibGFjayB0cmVlIGNsYXNzLCBkZXNpZ25lZCBmb3IgdXNlIGluIGltcGxlbWVudGluZyBTVEwKKyAgLy8gYXNzb2NpYXRpdmUgY29udGFpbmVycyAoc2V0LCBtdWx0aXNldCwgbWFwLCBhbmQgbXVsdGltYXApLiBUaGUKKyAgLy8gaW5zZXJ0aW9uIGFuZCBkZWxldGlvbiBhbGdvcml0aG1zIGFyZSBiYXNlZCBvbiB0aG9zZSBpbiBDb3JtZW4sCisgIC8vIExlaXNlcnNvbiwgYW5kIFJpdmVzdCwgSW50cm9kdWN0aW9uIHRvIEFsZ29yaXRobXMgKE1JVCBQcmVzcywKKyAgLy8gMTk5MCksIGV4Y2VwdCB0aGF0CisgIC8vCisgIC8vICgxKSB0aGUgaGVhZGVyIGNlbGwgaXMgbWFpbnRhaW5lZCB3aXRoIGxpbmtzIG5vdCBvbmx5IHRvIHRoZSByb290CisgIC8vIGJ1dCBhbHNvIHRvIHRoZSBsZWZ0bW9zdCBub2RlIG9mIHRoZSB0cmVlLCB0byBlbmFibGUgY29uc3RhbnQKKyAgLy8gdGltZSBiZWdpbigpLCBhbmQgdG8gdGhlIHJpZ2h0bW9zdCBub2RlIG9mIHRoZSB0cmVlLCB0byBlbmFibGUKKyAgLy8gbGluZWFyIHRpbWUgcGVyZm9ybWFuY2Ugd2hlbiB1c2VkIHdpdGggdGhlIGdlbmVyaWMgc2V0IGFsZ29yaXRobXMKKyAgLy8gKHNldF91bmlvbiwgZXRjLikKKyAgLy8gCisgIC8vICgyKSB3aGVuIGEgbm9kZSBiZWluZyBkZWxldGVkIGhhcyB0d28gY2hpbGRyZW4gaXRzIHN1Y2Nlc3NvciBub2RlCisgIC8vIGlzIHJlbGlua2VkIGludG8gaXRzIHBsYWNlLCByYXRoZXIgdGhhbiBjb3BpZWQsIHNvIHRoYXQgdGhlIG9ubHkKKyAgLy8gaXRlcmF0b3JzIGludmFsaWRhdGVkIGFyZSB0aG9zZSByZWZlcnJpbmcgdG8gdGhlIGRlbGV0ZWQgbm9kZS4KKworICBlbnVtIF9SYl90cmVlX2NvbG9yIHsgX1NfcmVkID0gZmFsc2UsIF9TX2JsYWNrID0gdHJ1ZSB9OworCisgIHN0cnVjdCBfUmJfdHJlZV9ub2RlX2Jhc2UKKyAgeworICAgIHR5cGVkZWYgX1JiX3RyZWVfbm9kZV9iYXNlKiBfQmFzZV9wdHI7CisgICAgdHlwZWRlZiBjb25zdCBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9Db25zdF9CYXNlX3B0cjsKKworICAgIF9SYl90cmVlX2NvbG9yCV9NX2NvbG9yOworICAgIF9CYXNlX3B0cgkJX01fcGFyZW50OworICAgIF9CYXNlX3B0cgkJX01fbGVmdDsKKyAgICBfQmFzZV9wdHIJCV9NX3JpZ2h0OworCisgICAgc3RhdGljIF9CYXNlX3B0cgorICAgIF9TX21pbmltdW0oX0Jhc2VfcHRyIF9feCkKKyAgICB7CisgICAgICB3aGlsZSAoX194LT5fTV9sZWZ0ICE9IDApIF9feCA9IF9feC0+X01fbGVmdDsKKyAgICAgIHJldHVybiBfX3g7CisgICAgfQorCisgICAgc3RhdGljIF9Db25zdF9CYXNlX3B0cgorICAgIF9TX21pbmltdW0oX0NvbnN0X0Jhc2VfcHRyIF9feCkKKyAgICB7CisgICAgICB3aGlsZSAoX194LT5fTV9sZWZ0ICE9IDApIF9feCA9IF9feC0+X01fbGVmdDsKKyAgICAgIHJldHVybiBfX3g7CisgICAgfQorCisgICAgc3RhdGljIF9CYXNlX3B0cgorICAgIF9TX21heGltdW0oX0Jhc2VfcHRyIF9feCkKKyAgICB7CisgICAgICB3aGlsZSAoX194LT5fTV9yaWdodCAhPSAwKSBfX3ggPSBfX3gtPl9NX3JpZ2h0OworICAgICAgcmV0dXJuIF9feDsKKyAgICB9CisKKyAgICBzdGF0aWMgX0NvbnN0X0Jhc2VfcHRyCisgICAgX1NfbWF4aW11bShfQ29uc3RfQmFzZV9wdHIgX194KQorICAgIHsKKyAgICAgIHdoaWxlIChfX3gtPl9NX3JpZ2h0ICE9IDApIF9feCA9IF9feC0+X01fcmlnaHQ7CisgICAgICByZXR1cm4gX194OworICAgIH0KKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsPgorICAgIHN0cnVjdCBfUmJfdHJlZV9ub2RlIDogcHVibGljIF9SYl90cmVlX25vZGVfYmFzZQorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JiX3RyZWVfbm9kZTxfVmFsPiogX0xpbmtfdHlwZTsKKyAgICAgIF9WYWwgX01fdmFsdWVfZmllbGQ7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgX1JiX3RyZWVfbm9kZShfQXJncyYmLi4uIF9fYXJncykKKwk6IF9SYl90cmVlX25vZGVfYmFzZSgpLAorCSAgX01fdmFsdWVfZmllbGQoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSB7IH0KKyNlbmRpZgorICAgIH07CisKKyAgX0dMSUJDWFhfUFVSRSBfUmJfdHJlZV9ub2RlX2Jhc2UqCisgIF9SYl90cmVlX2luY3JlbWVudChfUmJfdHJlZV9ub2RlX2Jhc2UqIF9feCkgdGhyb3cgKCk7CisKKyAgX0dMSUJDWFhfUFVSRSBjb25zdCBfUmJfdHJlZV9ub2RlX2Jhc2UqCisgIF9SYl90cmVlX2luY3JlbWVudChjb25zdCBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9feCkgdGhyb3cgKCk7CisKKyAgX0dMSUJDWFhfUFVSRSBfUmJfdHJlZV9ub2RlX2Jhc2UqCisgIF9SYl90cmVlX2RlY3JlbWVudChfUmJfdHJlZV9ub2RlX2Jhc2UqIF9feCkgdGhyb3cgKCk7CisKKyAgX0dMSUJDWFhfUFVSRSBjb25zdCBfUmJfdHJlZV9ub2RlX2Jhc2UqCisgIF9SYl90cmVlX2RlY3JlbWVudChjb25zdCBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9feCkgdGhyb3cgKCk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfUmJfdHJlZV9pdGVyYXRvcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfVHAmIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgX1RwKiBwb2ludGVyOworCisgICAgICB0eXBlZGVmIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX1JiX3RyZWVfaXRlcmF0b3I8X1RwPiAgICAgICAgX1NlbGY7CisgICAgICB0eXBlZGVmIF9SYl90cmVlX25vZGVfYmFzZTo6X0Jhc2VfcHRyIF9CYXNlX3B0cjsKKyAgICAgIHR5cGVkZWYgX1JiX3RyZWVfbm9kZTxfVHA+KiAgICAgICAgICAgX0xpbmtfdHlwZTsKKworICAgICAgX1JiX3RyZWVfaXRlcmF0b3IoKQorICAgICAgOiBfTV9ub2RlKCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfUmJfdHJlZV9pdGVyYXRvcihfTGlua190eXBlIF9feCkKKyAgICAgIDogX01fbm9kZShfX3gpIHsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfTGlua190eXBlPihfTV9ub2RlKS0+X01fdmFsdWVfZmllbGQ7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKHN0YXRpY19jYXN0PF9MaW5rX3R5cGU+CisJCQkJKF9NX25vZGUpLT5fTV92YWx1ZV9maWVsZCk7IH0KKworICAgICAgX1NlbGYmCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwlfTV9ub2RlID0gX1JiX3RyZWVfaW5jcmVtZW50KF9NX25vZGUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1NlbGYKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCV9TZWxmIF9fdG1wID0gKnRoaXM7CisJX01fbm9kZSA9IF9SYl90cmVlX2luY3JlbWVudChfTV9ub2RlKTsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIF9TZWxmJgorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7CisJX01fbm9kZSA9IF9SYl90cmVlX2RlY3JlbWVudChfTV9ub2RlKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9TZWxmCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsKKwlfU2VsZiBfX3RtcCA9ICp0aGlzOworCV9NX25vZGUgPSBfUmJfdHJlZV9kZWNyZW1lbnQoX01fbm9kZSk7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IF9TZWxmJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9ub2RlID09IF9feC5fTV9ub2RlOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgX1NlbGYmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX25vZGUgIT0gX194Ll9NX25vZGU7IH0KKworICAgICAgX0Jhc2VfcHRyIF9NX25vZGU7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfUmJfdHJlZV9jb25zdF9pdGVyYXRvcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAmIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwKiBwb2ludGVyOworCisgICAgICB0eXBlZGVmIF9SYl90cmVlX2l0ZXJhdG9yPF9UcD4gaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgdHlwZWRlZiBfUmJfdHJlZV9jb25zdF9pdGVyYXRvcjxfVHA+ICAgICAgICBfU2VsZjsKKyAgICAgIHR5cGVkZWYgX1JiX3RyZWVfbm9kZV9iYXNlOjpfQ29uc3RfQmFzZV9wdHIgX0Jhc2VfcHRyOworICAgICAgdHlwZWRlZiBjb25zdCBfUmJfdHJlZV9ub2RlPF9UcD4qICAgICAgICAgICBfTGlua190eXBlOworCisgICAgICBfUmJfdHJlZV9jb25zdF9pdGVyYXRvcigpCisgICAgICA6IF9NX25vZGUoKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIF9SYl90cmVlX2NvbnN0X2l0ZXJhdG9yKF9MaW5rX3R5cGUgX194KQorICAgICAgOiBfTV9ub2RlKF9feCkgeyB9CisKKyAgICAgIF9SYl90cmVlX2NvbnN0X2l0ZXJhdG9yKGNvbnN0IGl0ZXJhdG9yJiBfX2l0KQorICAgICAgOiBfTV9ub2RlKF9faXQuX01fbm9kZSkgeyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9jb25zdF9jYXN0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKHN0YXRpY19jYXN0PHR5cGVuYW1lIGl0ZXJhdG9yOjpfTGlua190eXBlPgorCQkJKGNvbnN0X2Nhc3Q8dHlwZW5hbWUgaXRlcmF0b3I6Ol9CYXNlX3B0cj4oX01fbm9kZSkpKTsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfTGlua190eXBlPihfTV9ub2RlKS0+X01fdmFsdWVfZmllbGQ7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKHN0YXRpY19jYXN0PF9MaW5rX3R5cGU+CisJCQkJKF9NX25vZGUpLT5fTV92YWx1ZV9maWVsZCk7IH0KKworICAgICAgX1NlbGYmCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwlfTV9ub2RlID0gX1JiX3RyZWVfaW5jcmVtZW50KF9NX25vZGUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1NlbGYKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCV9TZWxmIF9fdG1wID0gKnRoaXM7CisJX01fbm9kZSA9IF9SYl90cmVlX2luY3JlbWVudChfTV9ub2RlKTsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIF9TZWxmJgorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7CisJX01fbm9kZSA9IF9SYl90cmVlX2RlY3JlbWVudChfTV9ub2RlKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9TZWxmCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsKKwlfU2VsZiBfX3RtcCA9ICp0aGlzOworCV9NX25vZGUgPSBfUmJfdHJlZV9kZWNyZW1lbnQoX01fbm9kZSk7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IF9TZWxmJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9ub2RlID09IF9feC5fTV9ub2RlOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgX1NlbGYmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX25vZGUgIT0gX194Ll9NX25vZGU7IH0KKworICAgICAgX0Jhc2VfcHRyIF9NX25vZGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfUmJfdHJlZV9pdGVyYXRvcjxfVmFsPiYgX194LAorICAgICAgICAgICAgICAgY29uc3QgX1JiX3RyZWVfY29uc3RfaXRlcmF0b3I8X1ZhbD4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fbm9kZSA9PSBfX3kuX01fbm9kZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWw+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9SYl90cmVlX2l0ZXJhdG9yPF9WYWw+JiBfX3gsCisgICAgICAgICAgICAgICBjb25zdCBfUmJfdHJlZV9jb25zdF9pdGVyYXRvcjxfVmFsPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9ub2RlICE9IF9feS5fTV9ub2RlOyB9CisKKyAgdm9pZAorICBfUmJfdHJlZV9pbnNlcnRfYW5kX3JlYmFsYW5jZShjb25zdCBib29sIF9faW5zZXJ0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYl90cmVlX25vZGVfYmFzZSogX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9fcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JiX3RyZWVfbm9kZV9iYXNlJiBfX2hlYWRlcikgdGhyb3cgKCk7CisKKyAgX1JiX3RyZWVfbm9kZV9iYXNlKgorICBfUmJfdHJlZV9yZWJhbGFuY2VfZm9yX2VyYXNlKF9SYl90cmVlX25vZGVfYmFzZSogY29uc3QgX196LAorCQkJICAgICAgIF9SYl90cmVlX25vZGVfYmFzZSYgX19oZWFkZXIpIHRocm93ICgpOworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2MgPSBhbGxvY2F0b3I8X1ZhbD4gPgorICAgIGNsYXNzIF9SYl90cmVlCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfUmJfdHJlZV9ub2RlPF9WYWw+ID46Om90aGVyCisgICAgICAgICAgICAgIF9Ob2RlX2FsbG9jYXRvcjsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgX1JiX3RyZWVfbm9kZV9iYXNlKiAJCV9CYXNlX3B0cjsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1JiX3RyZWVfbm9kZV9iYXNlKiAJX0NvbnN0X0Jhc2VfcHRyOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfS2V5IAkJCQlrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1ZhbCAJCQkJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdmFsdWVfdHlwZSogCQkJcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogCQljb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAJCQlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIAkJY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfUmJfdHJlZV9ub2RlPF9WYWw+KiAJCV9MaW5rX3R5cGU7CisgICAgICB0eXBlZGVmIGNvbnN0IF9SYl90cmVlX25vZGU8X1ZhbD4qCV9Db25zdF9MaW5rX3R5cGU7CisgICAgICB0eXBlZGVmIHNpemVfdCAJCQkJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgCQkJZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfQWxsb2MgCQkJCWFsbG9jYXRvcl90eXBlOworCisgICAgICBfTm9kZV9hbGxvY2F0b3ImCisgICAgICBfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PF9Ob2RlX2FsbG9jYXRvcio+KCZ0aGlzLT5fTV9pbXBsKTsgfQorICAgICAgCisgICAgICBjb25zdCBfTm9kZV9hbGxvY2F0b3ImCisgICAgICBfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IF9Ob2RlX2FsbG9jYXRvcio+KCZ0aGlzLT5fTV9pbXBsKTsgfQorCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBhbGxvY2F0b3JfdHlwZShfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSk7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9MaW5rX3R5cGUKKyAgICAgIF9NX2dldF9ub2RlKCkKKyAgICAgIHsgcmV0dXJuIF9NX2ltcGwuX05vZGVfYWxsb2NhdG9yOjphbGxvY2F0ZSgxKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9wdXRfbm9kZShfTGlua190eXBlIF9fcCkKKyAgICAgIHsgX01faW1wbC5fTm9kZV9hbGxvY2F0b3I6OmRlYWxsb2NhdGUoX19wLCAxKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgICAgICBfTGlua190eXBlCisgICAgICBfTV9jcmVhdGVfbm9kZShjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7CisJX0xpbmtfdHlwZSBfX3RtcCA9IF9NX2dldF9ub2RlKCk7CisJX190cnkKKwkgIHsgZ2V0X2FsbG9jYXRvcigpLmNvbnN0cnVjdAorCSAgICAgIChzdGQ6Ol9fYWRkcmVzc29mKF9fdG1wLT5fTV92YWx1ZV9maWVsZCksIF9feCk7IH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX01fcHV0X25vZGUoX190bXApOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2Rlc3Ryb3lfbm9kZShfTGlua190eXBlIF9fcCkKKyAgICAgIHsKKwlnZXRfYWxsb2NhdG9yKCkuZGVzdHJveShzdGQ6Ol9fYWRkcmVzc29mKF9fcC0+X01fdmFsdWVfZmllbGQpKTsKKwlfTV9wdXRfbm9kZShfX3ApOworICAgICAgfQorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICBfTGlua190eXBlCisgICAgICAgIF9NX2NyZWF0ZV9ub2RlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIF9MaW5rX3R5cGUgX190bXAgPSBfTV9nZXRfbm9kZSgpOworCSAgX190cnkKKwkgICAgeworCSAgICAgIGFsbG9jYXRvcl90cmFpdHM8X05vZGVfYWxsb2NhdG9yPjo6CisJCWNvbnN0cnVjdChfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSwgX190bXAsCisJCQkgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgX01fcHV0X25vZGUoX190bXApOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICByZXR1cm4gX190bXA7CisJfQorCisgICAgICB2b2lkCisgICAgICBfTV9kZXN0cm95X25vZGUoX0xpbmtfdHlwZSBfX3ApCisgICAgICB7CisJX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkuZGVzdHJveShfX3ApOworCV9NX3B1dF9ub2RlKF9fcCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgX0xpbmtfdHlwZQorICAgICAgX01fY2xvbmVfbm9kZShfQ29uc3RfTGlua190eXBlIF9feCkKKyAgICAgIHsKKwlfTGlua190eXBlIF9fdG1wID0gX01fY3JlYXRlX25vZGUoX194LT5fTV92YWx1ZV9maWVsZCk7CisJX190bXAtPl9NX2NvbG9yID0gX194LT5fTV9jb2xvcjsKKwlfX3RtcC0+X01fbGVmdCA9IDA7CisJX190bXAtPl9NX3JpZ2h0ID0gMDsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5X2NvbXBhcmUsIAorCSAgICAgICBib29sIF9Jc19wb2RfY29tcGFyYXRvciA9IF9faXNfcG9kKF9LZXlfY29tcGFyZSk+CisgICAgICAgIHN0cnVjdCBfUmJfdHJlZV9pbXBsIDogcHVibGljIF9Ob2RlX2FsbG9jYXRvcgorICAgICAgICB7CisJICBfS2V5X2NvbXBhcmUJCV9NX2tleV9jb21wYXJlOworCSAgX1JiX3RyZWVfbm9kZV9iYXNlIAlfTV9oZWFkZXI7CisJICBzaXplX3R5cGUgCQlfTV9ub2RlX2NvdW50OyAvLyBLZWVwcyB0cmFjayBvZiBzaXplIG9mIHRyZWUuCisKKwkgIF9SYl90cmVlX2ltcGwoKQorCSAgOiBfTm9kZV9hbGxvY2F0b3IoKSwgX01fa2V5X2NvbXBhcmUoKSwgX01faGVhZGVyKCksCisJICAgIF9NX25vZGVfY291bnQoMCkKKwkgIHsgX01faW5pdGlhbGl6ZSgpOyB9CisKKwkgIF9SYl90cmVlX2ltcGwoY29uc3QgX0tleV9jb21wYXJlJiBfX2NvbXAsIGNvbnN0IF9Ob2RlX2FsbG9jYXRvciYgX19hKQorCSAgOiBfTm9kZV9hbGxvY2F0b3IoX19hKSwgX01fa2V5X2NvbXBhcmUoX19jb21wKSwgX01faGVhZGVyKCksCisJICAgIF9NX25vZGVfY291bnQoMCkKKwkgIHsgX01faW5pdGlhbGl6ZSgpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisJICBfUmJfdHJlZV9pbXBsKGNvbnN0IF9LZXlfY29tcGFyZSYgX19jb21wLCBfTm9kZV9hbGxvY2F0b3ImJiBfX2EpCisJICA6IF9Ob2RlX2FsbG9jYXRvcihzdGQ6Om1vdmUoX19hKSksIF9NX2tleV9jb21wYXJlKF9fY29tcCksCisJICAgIF9NX2hlYWRlcigpLCBfTV9ub2RlX2NvdW50KDApCisJICB7IF9NX2luaXRpYWxpemUoKTsgfQorI2VuZGlmCisKKwlwcml2YXRlOgorCSAgdm9pZAorCSAgX01faW5pdGlhbGl6ZSgpCisJICB7CisJICAgIHRoaXMtPl9NX2hlYWRlci5fTV9jb2xvciA9IF9TX3JlZDsKKwkgICAgdGhpcy0+X01faGVhZGVyLl9NX3BhcmVudCA9IDA7CisJICAgIHRoaXMtPl9NX2hlYWRlci5fTV9sZWZ0ID0gJnRoaXMtPl9NX2hlYWRlcjsKKwkgICAgdGhpcy0+X01faGVhZGVyLl9NX3JpZ2h0ID0gJnRoaXMtPl9NX2hlYWRlcjsKKwkgIH0JICAgIAorCX07CisKKyAgICAgIF9SYl90cmVlX2ltcGw8X0NvbXBhcmU+IF9NX2ltcGw7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfQmFzZV9wdHImCisgICAgICBfTV9yb290KCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01faGVhZGVyLl9NX3BhcmVudDsgfQorCisgICAgICBfQ29uc3RfQmFzZV9wdHIKKyAgICAgIF9NX3Jvb3QoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9oZWFkZXIuX01fcGFyZW50OyB9CisKKyAgICAgIF9CYXNlX3B0ciYKKyAgICAgIF9NX2xlZnRtb3N0KCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01faGVhZGVyLl9NX2xlZnQ7IH0KKworICAgICAgX0NvbnN0X0Jhc2VfcHRyCisgICAgICBfTV9sZWZ0bW9zdCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX2hlYWRlci5fTV9sZWZ0OyB9CisKKyAgICAgIF9CYXNlX3B0ciYKKyAgICAgIF9NX3JpZ2h0bW9zdCgpCisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX2hlYWRlci5fTV9yaWdodDsgfQorCisgICAgICBfQ29uc3RfQmFzZV9wdHIKKyAgICAgIF9NX3JpZ2h0bW9zdCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX2hlYWRlci5fTV9yaWdodDsgfQorCisgICAgICBfTGlua190eXBlCisgICAgICBfTV9iZWdpbigpCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfTGlua190eXBlPih0aGlzLT5fTV9pbXBsLl9NX2hlYWRlci5fTV9wYXJlbnQpOyB9CisKKyAgICAgIF9Db25zdF9MaW5rX3R5cGUKKyAgICAgIF9NX2JlZ2luKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gc3RhdGljX2Nhc3Q8X0NvbnN0X0xpbmtfdHlwZT4KKwkgICh0aGlzLT5fTV9pbXBsLl9NX2hlYWRlci5fTV9wYXJlbnQpOworICAgICAgfQorCisgICAgICBfTGlua190eXBlCisgICAgICBfTV9lbmQoKQorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X0xpbmtfdHlwZT4oJnRoaXMtPl9NX2ltcGwuX01faGVhZGVyKTsgfQorCisgICAgICBfQ29uc3RfTGlua190eXBlCisgICAgICBfTV9lbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X0NvbnN0X0xpbmtfdHlwZT4oJnRoaXMtPl9NX2ltcGwuX01faGVhZGVyKTsgfQorCisgICAgICBzdGF0aWMgY29uc3RfcmVmZXJlbmNlCisgICAgICBfU192YWx1ZShfQ29uc3RfTGlua190eXBlIF9feCkKKyAgICAgIHsgcmV0dXJuIF9feC0+X01fdmFsdWVfZmllbGQ7IH0KKworICAgICAgc3RhdGljIGNvbnN0IF9LZXkmCisgICAgICBfU19rZXkoX0NvbnN0X0xpbmtfdHlwZSBfX3gpCisgICAgICB7IHJldHVybiBfS2V5T2ZWYWx1ZSgpKF9TX3ZhbHVlKF9feCkpOyB9CisKKyAgICAgIHN0YXRpYyBfTGlua190eXBlCisgICAgICBfU19sZWZ0KF9CYXNlX3B0ciBfX3gpCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfTGlua190eXBlPihfX3gtPl9NX2xlZnQpOyB9CisKKyAgICAgIHN0YXRpYyBfQ29uc3RfTGlua190eXBlCisgICAgICBfU19sZWZ0KF9Db25zdF9CYXNlX3B0ciBfX3gpCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfQ29uc3RfTGlua190eXBlPihfX3gtPl9NX2xlZnQpOyB9CisKKyAgICAgIHN0YXRpYyBfTGlua190eXBlCisgICAgICBfU19yaWdodChfQmFzZV9wdHIgX194KQorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X0xpbmtfdHlwZT4oX194LT5fTV9yaWdodCk7IH0KKworICAgICAgc3RhdGljIF9Db25zdF9MaW5rX3R5cGUKKyAgICAgIF9TX3JpZ2h0KF9Db25zdF9CYXNlX3B0ciBfX3gpCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfQ29uc3RfTGlua190eXBlPihfX3gtPl9NX3JpZ2h0KTsgfQorCisgICAgICBzdGF0aWMgY29uc3RfcmVmZXJlbmNlCisgICAgICBfU192YWx1ZShfQ29uc3RfQmFzZV9wdHIgX194KQorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X0NvbnN0X0xpbmtfdHlwZT4oX194KS0+X01fdmFsdWVfZmllbGQ7IH0KKworICAgICAgc3RhdGljIGNvbnN0IF9LZXkmCisgICAgICBfU19rZXkoX0NvbnN0X0Jhc2VfcHRyIF9feCkKKyAgICAgIHsgcmV0dXJuIF9LZXlPZlZhbHVlKCkoX1NfdmFsdWUoX194KSk7IH0KKworICAgICAgc3RhdGljIF9CYXNlX3B0cgorICAgICAgX1NfbWluaW11bShfQmFzZV9wdHIgX194KQorICAgICAgeyByZXR1cm4gX1JiX3RyZWVfbm9kZV9iYXNlOjpfU19taW5pbXVtKF9feCk7IH0KKworICAgICAgc3RhdGljIF9Db25zdF9CYXNlX3B0cgorICAgICAgX1NfbWluaW11bShfQ29uc3RfQmFzZV9wdHIgX194KQorICAgICAgeyByZXR1cm4gX1JiX3RyZWVfbm9kZV9iYXNlOjpfU19taW5pbXVtKF9feCk7IH0KKworICAgICAgc3RhdGljIF9CYXNlX3B0cgorICAgICAgX1NfbWF4aW11bShfQmFzZV9wdHIgX194KQorICAgICAgeyByZXR1cm4gX1JiX3RyZWVfbm9kZV9iYXNlOjpfU19tYXhpbXVtKF9feCk7IH0KKworICAgICAgc3RhdGljIF9Db25zdF9CYXNlX3B0cgorICAgICAgX1NfbWF4aW11bShfQ29uc3RfQmFzZV9wdHIgX194KQorICAgICAgeyByZXR1cm4gX1JiX3RyZWVfbm9kZV9iYXNlOjpfU19tYXhpbXVtKF9feCk7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1JiX3RyZWVfaXRlcmF0b3I8dmFsdWVfdHlwZT4gICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9SYl90cmVlX2NvbnN0X2l0ZXJhdG9yPHZhbHVlX3R5cGU+IGNvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgcHJpdmF0ZToKKyAgICAgIHBhaXI8X0Jhc2VfcHRyLCBfQmFzZV9wdHI+CisgICAgICBfTV9nZXRfaW5zZXJ0X3VuaXF1ZV9wb3MoY29uc3Qga2V5X3R5cGUmIF9fayk7CisKKyAgICAgIHBhaXI8X0Jhc2VfcHRyLCBfQmFzZV9wdHI+CisgICAgICBfTV9nZXRfaW5zZXJ0X2VxdWFsX3Bvcyhjb25zdCBrZXlfdHlwZSYgX19rKTsKKworICAgICAgcGFpcjxfQmFzZV9wdHIsIF9CYXNlX3B0cj4KKyAgICAgIF9NX2dldF9pbnNlcnRfaGludF91bmlxdWVfcG9zKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLAorCQkJCSAgICBjb25zdCBrZXlfdHlwZSYgX19rKTsKKworICAgICAgcGFpcjxfQmFzZV9wdHIsIF9CYXNlX3B0cj4KKyAgICAgIF9NX2dldF9pbnNlcnRfaGludF9lcXVhbF9wb3MoY29uc3RfaXRlcmF0b3IgX19wb3MsCisJCQkJICAgY29uc3Qga2V5X3R5cGUmIF9fayk7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBfTV9pbnNlcnRfKF9CYXNlX3B0ciBfX3gsIF9CYXNlX3B0ciBfX3ksIF9BcmcmJiBfX3YpOworCisgICAgICBpdGVyYXRvcgorICAgICAgX01faW5zZXJ0X25vZGUoX0Jhc2VfcHRyIF9feCwgX0Jhc2VfcHRyIF9feSwgX0xpbmtfdHlwZSBfX3opOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBfTV9pbnNlcnRfbG93ZXIoX0Jhc2VfcHRyIF9feSwgX0FyZyYmIF9fdik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIF9NX2luc2VydF9lcXVhbF9sb3dlcihfQXJnJiYgX194KTsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX2luc2VydF9sb3dlcl9ub2RlKF9CYXNlX3B0ciBfX3AsIF9MaW5rX3R5cGUgX196KTsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX2luc2VydF9lcXVhbF9sb3dlcl9ub2RlKF9MaW5rX3R5cGUgX196KTsKKyNlbHNlCisgICAgICBpdGVyYXRvcgorICAgICAgX01faW5zZXJ0XyhfQmFzZV9wdHIgX194LCBfQmFzZV9wdHIgX195LAorCQkgY29uc3QgdmFsdWVfdHlwZSYgX192KTsKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjMzLiBJbnNlcnRpb24gaGludHMgaW4gYXNzb2NpYXRpdmUgY29udGFpbmVycy4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9pbnNlcnRfbG93ZXIoX0Jhc2VfcHRyIF9feSwgY29uc3QgdmFsdWVfdHlwZSYgX192KTsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX2luc2VydF9lcXVhbF9sb3dlcihjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworI2VuZGlmCisKKyAgICAgIF9MaW5rX3R5cGUKKyAgICAgIF9NX2NvcHkoX0NvbnN0X0xpbmtfdHlwZSBfX3gsIF9MaW5rX3R5cGUgX19wKTsKKworICAgICAgdm9pZAorICAgICAgX01fZXJhc2UoX0xpbmtfdHlwZSBfX3gpOworCisgICAgICBpdGVyYXRvcgorICAgICAgX01fbG93ZXJfYm91bmQoX0xpbmtfdHlwZSBfX3gsIF9MaW5rX3R5cGUgX195LAorCQkgICAgIGNvbnN0IF9LZXkmIF9fayk7CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBfTV9sb3dlcl9ib3VuZChfQ29uc3RfTGlua190eXBlIF9feCwgX0NvbnN0X0xpbmtfdHlwZSBfX3ksCisJCSAgICAgY29uc3QgX0tleSYgX19rKSBjb25zdDsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX3VwcGVyX2JvdW5kKF9MaW5rX3R5cGUgX194LCBfTGlua190eXBlIF9feSwKKwkJICAgICBjb25zdCBfS2V5JiBfX2spOworCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgX01fdXBwZXJfYm91bmQoX0NvbnN0X0xpbmtfdHlwZSBfX3gsIF9Db25zdF9MaW5rX3R5cGUgX195LAorCQkgICAgIGNvbnN0IF9LZXkmIF9faykgY29uc3Q7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbgorICAgICAgX1JiX3RyZWUoKSB7IH0KKworICAgICAgX1JiX3RyZWUoY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKwkgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX2ltcGwoX19jb21wLCBfTm9kZV9hbGxvY2F0b3IoX19hKSkgeyB9CisKKyAgICAgIF9SYl90cmVlKGNvbnN0IF9SYl90cmVlJiBfX3gpCisgICAgICA6IF9NX2ltcGwoX194Ll9NX2ltcGwuX01fa2V5X2NvbXBhcmUsIF9feC5fTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSkKKyAgICAgIHsKKwlpZiAoX194Ll9NX3Jvb3QoKSAhPSAwKQorCSAgeworCSAgICBfTV9yb290KCkgPSBfTV9jb3B5KF9feC5fTV9iZWdpbigpLCBfTV9lbmQoKSk7CisJICAgIF9NX2xlZnRtb3N0KCkgPSBfU19taW5pbXVtKF9NX3Jvb3QoKSk7CisJICAgIF9NX3JpZ2h0bW9zdCgpID0gX1NfbWF4aW11bShfTV9yb290KCkpOworCSAgICBfTV9pbXBsLl9NX25vZGVfY291bnQgPSBfX3guX01faW1wbC5fTV9ub2RlX2NvdW50OworCSAgfQorICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgX1JiX3RyZWUoX1JiX3RyZWUmJiBfX3gpOworI2VuZGlmCisKKyAgICAgIH5fUmJfdHJlZSgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9NX2VyYXNlKF9NX2JlZ2luKCkpOyB9CisKKyAgICAgIF9SYl90cmVlJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9SYl90cmVlJiBfX3gpOworCisgICAgICAvLyBBY2Nlc3NvcnMuCisgICAgICBfQ29tcGFyZQorICAgICAga2V5X2NvbXAoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faW1wbC5fTV9rZXlfY29tcGFyZTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyAKKwlyZXR1cm4gaXRlcmF0b3Ioc3RhdGljX2Nhc3Q8X0xpbmtfdHlwZT4KKwkJCSh0aGlzLT5fTV9pbXBsLl9NX2hlYWRlci5fTV9sZWZ0KSk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IAorCXJldHVybiBjb25zdF9pdGVyYXRvcihzdGF0aWNfY2FzdDxfQ29uc3RfTGlua190eXBlPgorCQkJICAgICAgKHRoaXMtPl9NX2ltcGwuX01faGVhZGVyLl9NX2xlZnQpKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBpdGVyYXRvcihzdGF0aWNfY2FzdDxfTGlua190eXBlPigmdGhpcy0+X01faW1wbC5fTV9oZWFkZXIpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgCisJcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHN0YXRpY19jYXN0PF9Db25zdF9MaW5rX3R5cGU+CisJCQkgICAgICAoJnRoaXMtPl9NX2ltcGwuX01faGVhZGVyKSk7CisgICAgICB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV9pbXBsLl9NX25vZGVfY291bnQgPT0gMDsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVCAKKyAgICAgIHsgcmV0dXJuIF9NX2ltcGwuX01fbm9kZV9jb3VudDsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpLm1heF9zaXplKCk7IH0KKworICAgICAgdm9pZAorICAgICAgc3dhcChfUmJfdHJlZSYgX190KTsgICAgICAKKworICAgICAgLy8gSW5zZXJ0L2VyYXNlLgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisgICAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICAgIF9NX2luc2VydF91bmlxdWUoX0FyZyYmIF9feCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIF9NX2luc2VydF9lcXVhbChfQXJnJiYgX194KTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgX01faW5zZXJ0X3VuaXF1ZV8oY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgX0FyZyYmIF9feCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIF9NX2luc2VydF9lcXVhbF8oY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgX0FyZyYmIF9feCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXBhaXI8aXRlcmF0b3IsIGJvb2w+CisJX01fZW1wbGFjZV91bmlxdWUoX0FyZ3MmJi4uLiBfX2FyZ3MpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCV9NX2VtcGxhY2VfZXF1YWwoX0FyZ3MmJi4uLiBfX2FyZ3MpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCV9NX2VtcGxhY2VfaGludF91bmlxdWUoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9BcmdzJiYuLi4gX19hcmdzKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwlfTV9lbXBsYWNlX2hpbnRfZXF1YWwoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9BcmdzJiYuLi4gX19hcmdzKTsKKyNlbHNlCisgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgX01faW5zZXJ0X3VuaXF1ZShjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworCisgICAgICBpdGVyYXRvcgorICAgICAgX01faW5zZXJ0X2VxdWFsKGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9pbnNlcnRfdW5pcXVlXyhjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworCisgICAgICBpdGVyYXRvcgorICAgICAgX01faW5zZXJ0X2VxdWFsXyhjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2luc2VydF91bmlxdWUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01faW5zZXJ0X2VxdWFsKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01fZXJhc2VfYXV4KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pOworCisgICAgICB2b2lkCisgICAgICBfTV9lcmFzZV9hdXgoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KTsKKworICAgIHB1YmxpYzoKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAxMzAuIEFzc29jaWF0aXZlIGVyYXNlIHNob3VsZCByZXR1cm4gYW4gaXRlcmF0b3IuCisgICAgICBfR0xJQkNYWF9BQklfVEFHX0NYWDExCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsKKwljb25zdF9pdGVyYXRvciBfX3Jlc3VsdCA9IF9fcG9zaXRpb247CisJKytfX3Jlc3VsdDsKKwlfTV9lcmFzZV9hdXgoX19wb3NpdGlvbik7CisJcmV0dXJuIF9fcmVzdWx0Ll9NX2NvbnN0X2Nhc3QoKTsKKyAgICAgIH0KKworICAgICAgLy8gTFdHIDIwNTkuCisgICAgICBfR0xJQkNYWF9BQklfVEFHX0NYWDExCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsKKwlpdGVyYXRvciBfX3Jlc3VsdCA9IF9fcG9zaXRpb247CisJKytfX3Jlc3VsdDsKKwlfTV9lcmFzZV9hdXgoX19wb3NpdGlvbik7CisJcmV0dXJuIF9fcmVzdWx0OworICAgICAgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IF9NX2VyYXNlX2F1eChfX3Bvc2l0aW9uKTsgfQorCisgICAgICB2b2lkCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyBfTV9lcmFzZV9hdXgoX19wb3NpdGlvbik7IH0KKyNlbmRpZgorICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDEzMC4gQXNzb2NpYXRpdmUgZXJhc2Ugc2hvdWxkIHJldHVybiBhbiBpdGVyYXRvci4KKyAgICAgIF9HTElCQ1hYX0FCSV9UQUdfQ1hYMTEKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJX01fZXJhc2VfYXV4KF9fZmlyc3QsIF9fbGFzdCk7CisJcmV0dXJuIF9fbGFzdC5fTV9jb25zdF9jYXN0KCk7CisgICAgICB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyBfTV9lcmFzZV9hdXgoX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICB2b2lkCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7IF9NX2VyYXNlX2F1eChfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZW5kaWYKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlKiBfX2ZpcnN0LCBjb25zdCBrZXlfdHlwZSogX19sYXN0KTsKKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworICAgICAgICBfTV9lcmFzZShfTV9iZWdpbigpKTsKKyAgICAgICAgX01fbGVmdG1vc3QoKSA9IF9NX2VuZCgpOworICAgICAgICBfTV9yb290KCkgPSAwOworICAgICAgICBfTV9yaWdodG1vc3QoKSA9IF9NX2VuZCgpOworICAgICAgICBfTV9pbXBsLl9NX25vZGVfY291bnQgPSAwOworICAgICAgfQorCisgICAgICAvLyBTZXQgb3BlcmF0aW9ucy4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2spOworCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdDsKKworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdDsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgICB7IHJldHVybiBfTV9sb3dlcl9ib3VuZChfTV9iZWdpbigpLCBfTV9lbmQoKSwgX19rKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2xvd2VyX2JvdW5kKF9NX2JlZ2luKCksIF9NX2VuZCgpLCBfX2spOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX19rKQorICAgICAgeyByZXR1cm4gX01fdXBwZXJfYm91bmQoX01fYmVnaW4oKSwgX01fZW5kKCksIF9fayk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0CisgICAgICB7IHJldHVybiBfTV91cHBlcl9ib3VuZChfTV9iZWdpbigpLCBfTV9lbmQoKSwgX19rKTsgfQorCisgICAgICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2spOworCisgICAgICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0OworCisgICAgICAvLyBEZWJ1Z2dpbmcuCisgICAgICBib29sCisgICAgICBfX3JiX3ZlcmlmeSgpIGNvbnN0OworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7CisgICAgICByZXR1cm4gX194LnNpemUoKSA9PSBfX3kuc2l6ZSgpCisJICAgICAmJiBzdGQ6OmVxdWFsKF9feC5iZWdpbigpLCBfX3guZW5kKCksIF9feS5iZWdpbigpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisJICAgICAgY29uc3QgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeworICAgICAgcmV0dXJuIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX194LmJlZ2luKCksIF9feC5lbmQoKSwgCisJCQkJCSAgX195LmJlZ2luKCksIF9feS5lbmQoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feSA8IF9feDsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisJIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIF9SYl90cmVlKF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPiYmIF9feCkKKyAgICA6IF9NX2ltcGwoX194Ll9NX2ltcGwuX01fa2V5X2NvbXBhcmUsCisJICAgICAgc3RkOjptb3ZlKF9feC5fTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSkpCisgICAgeworICAgICAgaWYgKF9feC5fTV9yb290KCkgIT0gMCkKKwl7CisJICBfTV9yb290KCkgPSBfX3guX01fcm9vdCgpOworCSAgX01fbGVmdG1vc3QoKSA9IF9feC5fTV9sZWZ0bW9zdCgpOworCSAgX01fcmlnaHRtb3N0KCkgPSBfX3guX01fcmlnaHRtb3N0KCk7CisJICBfTV9yb290KCktPl9NX3BhcmVudCA9IF9NX2VuZCgpOworCisJICBfX3guX01fcm9vdCgpID0gMDsKKwkgIF9feC5fTV9sZWZ0bW9zdCgpID0gX194Ll9NX2VuZCgpOworCSAgX194Ll9NX3JpZ2h0bW9zdCgpID0gX194Ll9NX2VuZCgpOworCisJICB0aGlzLT5fTV9pbXBsLl9NX25vZGVfY291bnQgPSBfX3guX01faW1wbC5fTV9ub2RlX2NvdW50OworCSAgX194Ll9NX2ltcGwuX01fbm9kZV9jb3VudCA9IDA7CisJfQorICAgIH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPiYKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIG9wZXJhdG9yPShjb25zdCBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCkKKyAgICB7CisgICAgICBpZiAodGhpcyAhPSAmX194KQorCXsKKwkgIC8vIE5vdGUgdGhhdCBfS2V5IG1heSBiZSBhIGNvbnN0YW50IHR5cGUuCisJICBjbGVhcigpOworCSAgX01faW1wbC5fTV9rZXlfY29tcGFyZSA9IF9feC5fTV9pbXBsLl9NX2tleV9jb21wYXJlOworCSAgaWYgKF9feC5fTV9yb290KCkgIT0gMCkKKwkgICAgeworCSAgICAgIF9NX3Jvb3QoKSA9IF9NX2NvcHkoX194Ll9NX2JlZ2luKCksIF9NX2VuZCgpKTsKKwkgICAgICBfTV9sZWZ0bW9zdCgpID0gX1NfbWluaW11bShfTV9yb290KCkpOworCSAgICAgIF9NX3JpZ2h0bW9zdCgpID0gX1NfbWF4aW11bShfTV9yb290KCkpOworCSAgICAgIF9NX2ltcGwuX01fbm9kZV9jb3VudCA9IF9feC5fTV9pbXBsLl9NX25vZGVfY291bnQ7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorI2VuZGlmCisgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIF9NX2luc2VydF8oX0Jhc2VfcHRyIF9feCwgX0Jhc2VfcHRyIF9fcCwgX0FyZyYmIF9fdikKKyNlbHNlCisgICAgX01faW5zZXJ0XyhfQmFzZV9wdHIgX194LCBfQmFzZV9wdHIgX19wLCBjb25zdCBfVmFsJiBfX3YpCisjZW5kaWYKKyAgICB7CisgICAgICBib29sIF9faW5zZXJ0X2xlZnQgPSAoX194ICE9IDAgfHwgX19wID09IF9NX2VuZCgpCisJCQkgICAgfHwgX01faW1wbC5fTV9rZXlfY29tcGFyZShfS2V5T2ZWYWx1ZSgpKF9fdiksCisJCQkJCQkgICAgICBfU19rZXkoX19wKSkpOworCisgICAgICBfTGlua190eXBlIF9feiA9IF9NX2NyZWF0ZV9ub2RlKF9HTElCQ1hYX0ZPUldBUkQoX0FyZywgX192KSk7CisKKyAgICAgIF9SYl90cmVlX2luc2VydF9hbmRfcmViYWxhbmNlKF9faW5zZXJ0X2xlZnQsIF9feiwgX19wLAorCQkJCSAgICB0aGlzLT5fTV9pbXBsLl9NX2hlYWRlcik7CisgICAgICArK19NX2ltcGwuX01fbm9kZV9jb3VudDsKKyAgICAgIHJldHVybiBpdGVyYXRvcihfX3opOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKyNlbmRpZgorICAgIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICBfTV9pbnNlcnRfbG93ZXIoX0Jhc2VfcHRyIF9fcCwgX0FyZyYmIF9fdikKKyNlbHNlCisgICAgX01faW5zZXJ0X2xvd2VyKF9CYXNlX3B0ciBfX3AsIGNvbnN0IF9WYWwmIF9fdikKKyNlbmRpZgorICAgIHsKKyAgICAgIGJvb2wgX19pbnNlcnRfbGVmdCA9IChfX3AgPT0gX01fZW5kKCkKKwkJCSAgICB8fCAhX01faW1wbC5fTV9rZXlfY29tcGFyZShfU19rZXkoX19wKSwKKwkJCQkJCSAgICAgICBfS2V5T2ZWYWx1ZSgpKF9fdikpKTsKKworICAgICAgX0xpbmtfdHlwZSBfX3ogPSBfTV9jcmVhdGVfbm9kZShfR0xJQkNYWF9GT1JXQVJEKF9BcmcsIF9fdikpOworCisgICAgICBfUmJfdHJlZV9pbnNlcnRfYW5kX3JlYmFsYW5jZShfX2luc2VydF9sZWZ0LCBfX3osIF9fcCwKKwkJCQkgICAgdGhpcy0+X01faW1wbC5fTV9oZWFkZXIpOworICAgICAgKytfTV9pbXBsLl9NX25vZGVfY291bnQ7CisgICAgICByZXR1cm4gaXRlcmF0b3IoX196KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisjZW5kaWYKKyAgICB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgX01faW5zZXJ0X2VxdWFsX2xvd2VyKF9BcmcmJiBfX3YpCisjZWxzZQorICAgIF9NX2luc2VydF9lcXVhbF9sb3dlcihjb25zdCBfVmFsJiBfX3YpCisjZW5kaWYKKyAgICB7CisgICAgICBfTGlua190eXBlIF9feCA9IF9NX2JlZ2luKCk7CisgICAgICBfTGlua190eXBlIF9feSA9IF9NX2VuZCgpOworICAgICAgd2hpbGUgKF9feCAhPSAwKQorCXsKKwkgIF9feSA9IF9feDsKKwkgIF9feCA9ICFfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9TX2tleShfX3gpLCBfS2V5T2ZWYWx1ZSgpKF9fdikpID8KKwkgICAgICAgIF9TX2xlZnQoX194KSA6IF9TX3JpZ2h0KF9feCk7CisJfQorICAgICAgcmV0dXJuIF9NX2luc2VydF9sb3dlcihfX3ksIF9HTElCQ1hYX0ZPUldBUkQoX0FyZywgX192KSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9Lb1YsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tvViwgX0NvbXBhcmUsIF9BbGxvYz46Ol9MaW5rX3R5cGUKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS29WLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgX01fY29weShfQ29uc3RfTGlua190eXBlIF9feCwgX0xpbmtfdHlwZSBfX3ApCisgICAgeworICAgICAgLy8gU3RydWN0dXJhbCBjb3B5LiAgX194IGFuZCBfX3AgbXVzdCBiZSBub24tbnVsbC4KKyAgICAgIF9MaW5rX3R5cGUgX190b3AgPSBfTV9jbG9uZV9ub2RlKF9feCk7CisgICAgICBfX3RvcC0+X01fcGFyZW50ID0gX19wOworCisgICAgICBfX3RyeQorCXsKKwkgIGlmIChfX3gtPl9NX3JpZ2h0KQorCSAgICBfX3RvcC0+X01fcmlnaHQgPSBfTV9jb3B5KF9TX3JpZ2h0KF9feCksIF9fdG9wKTsKKwkgIF9fcCA9IF9fdG9wOworCSAgX194ID0gX1NfbGVmdChfX3gpOworCisJICB3aGlsZSAoX194ICE9IDApCisJICAgIHsKKwkgICAgICBfTGlua190eXBlIF9feSA9IF9NX2Nsb25lX25vZGUoX194KTsKKwkgICAgICBfX3AtPl9NX2xlZnQgPSBfX3k7CisJICAgICAgX195LT5fTV9wYXJlbnQgPSBfX3A7CisJICAgICAgaWYgKF9feC0+X01fcmlnaHQpCisJCV9feS0+X01fcmlnaHQgPSBfTV9jb3B5KF9TX3JpZ2h0KF9feCksIF9feSk7CisJICAgICAgX19wID0gX195OworCSAgICAgIF9feCA9IF9TX2xlZnQoX194KTsKKwkgICAgfQorCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIF9NX2VyYXNlKF9fdG9wKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICAgIHJldHVybiBfX3RvcDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgX01fZXJhc2UoX0xpbmtfdHlwZSBfX3gpCisgICAgeworICAgICAgLy8gRXJhc2Ugd2l0aG91dCByZWJhbGFuY2luZy4KKyAgICAgIHdoaWxlIChfX3ggIT0gMCkKKwl7CisJICBfTV9lcmFzZShfU19yaWdodChfX3gpKTsKKwkgIF9MaW5rX3R5cGUgX195ID0gX1NfbGVmdChfX3gpOworCSAgX01fZGVzdHJveV9ub2RlKF9feCk7CisJICBfX3ggPSBfX3k7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwKKwkJICAgICAgX0NvbXBhcmUsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICBfTV9sb3dlcl9ib3VuZChfTGlua190eXBlIF9feCwgX0xpbmtfdHlwZSBfX3ksCisJCSAgIGNvbnN0IF9LZXkmIF9faykKKyAgICB7CisgICAgICB3aGlsZSAoX194ICE9IDApCisJaWYgKCFfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9TX2tleShfX3gpLCBfX2spKQorCSAgX195ID0gX194LCBfX3ggPSBfU19sZWZ0KF9feCk7CisJZWxzZQorCSAgX194ID0gX1NfcmlnaHQoX194KTsKKyAgICAgIHJldHVybiBpdGVyYXRvcihfX3kpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwKKwkJICAgICAgX0NvbXBhcmUsIF9BbGxvYz46OmNvbnN0X2l0ZXJhdG9yCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICBfTV9sb3dlcl9ib3VuZChfQ29uc3RfTGlua190eXBlIF9feCwgX0NvbnN0X0xpbmtfdHlwZSBfX3ksCisJCSAgIGNvbnN0IF9LZXkmIF9faykgY29uc3QKKyAgICB7CisgICAgICB3aGlsZSAoX194ICE9IDApCisJaWYgKCFfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9TX2tleShfX3gpLCBfX2spKQorCSAgX195ID0gX194LCBfX3ggPSBfU19sZWZ0KF9feCk7CisJZWxzZQorCSAgX194ID0gX1NfcmlnaHQoX194KTsKKyAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihfX3kpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwKKwkJICAgICAgX0NvbXBhcmUsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICBfTV91cHBlcl9ib3VuZChfTGlua190eXBlIF9feCwgX0xpbmtfdHlwZSBfX3ksCisJCSAgIGNvbnN0IF9LZXkmIF9faykKKyAgICB7CisgICAgICB3aGlsZSAoX194ICE9IDApCisJaWYgKF9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX19rLCBfU19rZXkoX194KSkpCisJICBfX3kgPSBfX3gsIF9feCA9IF9TX2xlZnQoX194KTsKKwllbHNlCisJICBfX3ggPSBfU19yaWdodChfX3gpOworICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9feSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLAorCQkgICAgICBfQ29tcGFyZSwgX0FsbG9jPjo6Y29uc3RfaXRlcmF0b3IKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIF9NX3VwcGVyX2JvdW5kKF9Db25zdF9MaW5rX3R5cGUgX194LCBfQ29uc3RfTGlua190eXBlIF9feSwKKwkJICAgY29uc3QgX0tleSYgX19rKSBjb25zdAorICAgIHsKKyAgICAgIHdoaWxlIChfX3ggIT0gMCkKKwlpZiAoX01faW1wbC5fTV9rZXlfY29tcGFyZShfX2ssIF9TX2tleShfX3gpKSkKKwkgIF9feSA9IF9feCwgX194ID0gX1NfbGVmdChfX3gpOworCWVsc2UKKwkgIF9feCA9IF9TX3JpZ2h0KF9feCk7CisgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoX195KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgcGFpcjx0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwKKwkJCSAgIF9Db21wYXJlLCBfQWxsb2M+OjppdGVyYXRvciwKKwkgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsCisJCQkgICBfQ29tcGFyZSwgX0FsbG9jPjo6aXRlcmF0b3I+CisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICBlcXVhbF9yYW5nZShjb25zdCBfS2V5JiBfX2spCisgICAgeworICAgICAgX0xpbmtfdHlwZSBfX3ggPSBfTV9iZWdpbigpOworICAgICAgX0xpbmtfdHlwZSBfX3kgPSBfTV9lbmQoKTsKKyAgICAgIHdoaWxlIChfX3ggIT0gMCkKKwl7CisJICBpZiAoX01faW1wbC5fTV9rZXlfY29tcGFyZShfU19rZXkoX194KSwgX19rKSkKKwkgICAgX194ID0gX1NfcmlnaHQoX194KTsKKwkgIGVsc2UgaWYgKF9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX19rLCBfU19rZXkoX194KSkpCisJICAgIF9feSA9IF9feCwgX194ID0gX1NfbGVmdChfX3gpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgX0xpbmtfdHlwZSBfX3h1KF9feCksIF9feXUoX195KTsKKwkgICAgICBfX3kgPSBfX3gsIF9feCA9IF9TX2xlZnQoX194KTsKKwkgICAgICBfX3h1ID0gX1NfcmlnaHQoX194dSk7CisJICAgICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsCisJCSAgICAgICAgICBpdGVyYXRvcj4oX01fbG93ZXJfYm91bmQoX194LCBfX3ksIF9fayksCisJCQkJICAgIF9NX3VwcGVyX2JvdW5kKF9feHUsIF9feXUsIF9faykpOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPihpdGVyYXRvcihfX3kpLAorCQkJCSAgICAgIGl0ZXJhdG9yKF9feSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBwYWlyPHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLAorCQkJICAgX0NvbXBhcmUsIF9BbGxvYz46OmNvbnN0X2l0ZXJhdG9yLAorCSB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwKKwkJCSAgIF9Db21wYXJlLCBfQWxsb2M+Ojpjb25zdF9pdGVyYXRvcj4KKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIGVxdWFsX3JhbmdlKGNvbnN0IF9LZXkmIF9faykgY29uc3QKKyAgICB7CisgICAgICBfQ29uc3RfTGlua190eXBlIF9feCA9IF9NX2JlZ2luKCk7CisgICAgICBfQ29uc3RfTGlua190eXBlIF9feSA9IF9NX2VuZCgpOworICAgICAgd2hpbGUgKF9feCAhPSAwKQorCXsKKwkgIGlmIChfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9TX2tleShfX3gpLCBfX2spKQorCSAgICBfX3ggPSBfU19yaWdodChfX3gpOworCSAgZWxzZSBpZiAoX01faW1wbC5fTV9rZXlfY29tcGFyZShfX2ssIF9TX2tleShfX3gpKSkKKwkgICAgX195ID0gX194LCBfX3ggPSBfU19sZWZ0KF9feCk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfQ29uc3RfTGlua190eXBlIF9feHUoX194KSwgX195dShfX3kpOworCSAgICAgIF9feSA9IF9feCwgX194ID0gX1NfbGVmdChfX3gpOworCSAgICAgIF9feHUgPSBfU19yaWdodChfX3h1KTsKKwkgICAgICByZXR1cm4gcGFpcjxjb25zdF9pdGVyYXRvciwKKwkJICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yPihfTV9sb3dlcl9ib3VuZChfX3gsIF9feSwgX19rKSwKKwkJCQkJICBfTV91cHBlcl9ib3VuZChfX3h1LCBfX3l1LCBfX2spKTsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4oY29uc3RfaXRlcmF0b3IoX195KSwKKwkJCQkJCSAgY29uc3RfaXRlcmF0b3IoX195KSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIHN3YXAoX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3QpCisgICAgeworICAgICAgaWYgKF9NX3Jvb3QoKSA9PSAwKQorCXsKKwkgIGlmIChfX3QuX01fcm9vdCgpICE9IDApCisJICAgIHsKKwkgICAgICBfTV9yb290KCkgPSBfX3QuX01fcm9vdCgpOworCSAgICAgIF9NX2xlZnRtb3N0KCkgPSBfX3QuX01fbGVmdG1vc3QoKTsKKwkgICAgICBfTV9yaWdodG1vc3QoKSA9IF9fdC5fTV9yaWdodG1vc3QoKTsKKwkgICAgICBfTV9yb290KCktPl9NX3BhcmVudCA9IF9NX2VuZCgpOworCSAgICAgIAorCSAgICAgIF9fdC5fTV9yb290KCkgPSAwOworCSAgICAgIF9fdC5fTV9sZWZ0bW9zdCgpID0gX190Ll9NX2VuZCgpOworCSAgICAgIF9fdC5fTV9yaWdodG1vc3QoKSA9IF9fdC5fTV9lbmQoKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKF9fdC5fTV9yb290KCkgPT0gMCkKKwl7CisJICBfX3QuX01fcm9vdCgpID0gX01fcm9vdCgpOworCSAgX190Ll9NX2xlZnRtb3N0KCkgPSBfTV9sZWZ0bW9zdCgpOworCSAgX190Ll9NX3JpZ2h0bW9zdCgpID0gX01fcmlnaHRtb3N0KCk7CisJICBfX3QuX01fcm9vdCgpLT5fTV9wYXJlbnQgPSBfX3QuX01fZW5kKCk7CisJICAKKwkgIF9NX3Jvb3QoKSA9IDA7CisJICBfTV9sZWZ0bW9zdCgpID0gX01fZW5kKCk7CisJICBfTV9yaWdodG1vc3QoKSA9IF9NX2VuZCgpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzdGQ6OnN3YXAoX01fcm9vdCgpLF9fdC5fTV9yb290KCkpOworCSAgc3RkOjpzd2FwKF9NX2xlZnRtb3N0KCksX190Ll9NX2xlZnRtb3N0KCkpOworCSAgc3RkOjpzd2FwKF9NX3JpZ2h0bW9zdCgpLF9fdC5fTV9yaWdodG1vc3QoKSk7CisJICAKKwkgIF9NX3Jvb3QoKS0+X01fcGFyZW50ID0gX01fZW5kKCk7CisJICBfX3QuX01fcm9vdCgpLT5fTV9wYXJlbnQgPSBfX3QuX01fZW5kKCk7CisJfQorICAgICAgLy8gTm8gbmVlZCB0byBzd2FwIGhlYWRlcidzIGNvbG9yIGFzIGl0IGRvZXMgbm90IGNoYW5nZS4KKyAgICAgIHN0ZDo6c3dhcCh0aGlzLT5fTV9pbXBsLl9NX25vZGVfY291bnQsIF9fdC5fTV9pbXBsLl9NX25vZGVfY291bnQpOworICAgICAgc3RkOjpzd2FwKHRoaXMtPl9NX2ltcGwuX01fa2V5X2NvbXBhcmUsIF9fdC5fTV9pbXBsLl9NX2tleV9jb21wYXJlKTsKKyAgICAgIAorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDMxLiBTd2FwcGluZyBjb250YWluZXJzIHdpdGggdW5lcXVhbCBhbGxvY2F0b3JzLgorICAgICAgc3RkOjpfX2FsbG9jX3N3YXA8X05vZGVfYWxsb2NhdG9yPjo6CisJX1NfZG9faXQoX01fZ2V0X05vZGVfYWxsb2NhdG9yKCksIF9fdC5fTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHBhaXI8dHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsCisJCQkgICBfQ29tcGFyZSwgX0FsbG9jPjo6X0Jhc2VfcHRyLAorCSB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwKKwkJCSAgIF9Db21wYXJlLCBfQWxsb2M+OjpfQmFzZV9wdHI+CisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICBfTV9nZXRfaW5zZXJ0X3VuaXF1ZV9wb3MoY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICB7CisgICAgICB0eXBlZGVmIHBhaXI8X0Jhc2VfcHRyLCBfQmFzZV9wdHI+IF9SZXM7CisgICAgICBfTGlua190eXBlIF9feCA9IF9NX2JlZ2luKCk7CisgICAgICBfTGlua190eXBlIF9feSA9IF9NX2VuZCgpOworICAgICAgYm9vbCBfX2NvbXAgPSB0cnVlOworICAgICAgd2hpbGUgKF9feCAhPSAwKQorCXsKKwkgIF9feSA9IF9feDsKKwkgIF9fY29tcCA9IF9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX19rLCBfU19rZXkoX194KSk7CisJICBfX3ggPSBfX2NvbXAgPyBfU19sZWZ0KF9feCkgOiBfU19yaWdodChfX3gpOworCX0KKyAgICAgIGl0ZXJhdG9yIF9faiA9IGl0ZXJhdG9yKF9feSk7CisgICAgICBpZiAoX19jb21wKQorCXsKKwkgIGlmIChfX2ogPT0gYmVnaW4oKSkKKwkgICAgcmV0dXJuIF9SZXMoX194LCBfX3kpOworCSAgZWxzZQorCSAgICAtLV9fajsKKwl9CisgICAgICBpZiAoX01faW1wbC5fTV9rZXlfY29tcGFyZShfU19rZXkoX19qLl9NX25vZGUpLCBfX2spKQorCXJldHVybiBfUmVzKF9feCwgX195KTsKKyAgICAgIHJldHVybiBfUmVzKF9fai5fTV9ub2RlLCAwKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgcGFpcjx0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwKKwkJCSAgIF9Db21wYXJlLCBfQWxsb2M+OjpfQmFzZV9wdHIsCisJIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLAorCQkJICAgX0NvbXBhcmUsIF9BbGxvYz46Ol9CYXNlX3B0cj4KKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIF9NX2dldF9pbnNlcnRfZXF1YWxfcG9zKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgeworICAgICAgdHlwZWRlZiBwYWlyPF9CYXNlX3B0ciwgX0Jhc2VfcHRyPiBfUmVzOworICAgICAgX0xpbmtfdHlwZSBfX3ggPSBfTV9iZWdpbigpOworICAgICAgX0xpbmtfdHlwZSBfX3kgPSBfTV9lbmQoKTsKKyAgICAgIHdoaWxlIChfX3ggIT0gMCkKKwl7CisJICBfX3kgPSBfX3g7CisJICBfX3ggPSBfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9faywgX1Nfa2V5KF9feCkpID8KKwkgICAgICAgIF9TX2xlZnQoX194KSA6IF9TX3JpZ2h0KF9feCk7CisJfQorICAgICAgcmV0dXJuIF9SZXMoX194LCBfX3kpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKyNlbmRpZgorICAgIHBhaXI8dHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsCisJCQkgICBfQ29tcGFyZSwgX0FsbG9jPjo6aXRlcmF0b3IsIGJvb2w+CisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgX01faW5zZXJ0X3VuaXF1ZShfQXJnJiYgX192KQorI2Vsc2UKKyAgICBfTV9pbnNlcnRfdW5pcXVlKGNvbnN0IF9WYWwmIF9fdikKKyNlbmRpZgorICAgIHsKKyAgICAgIHR5cGVkZWYgcGFpcjxpdGVyYXRvciwgYm9vbD4gX1JlczsKKyAgICAgIHBhaXI8X0Jhc2VfcHRyLCBfQmFzZV9wdHI+IF9fcmVzCisJPSBfTV9nZXRfaW5zZXJ0X3VuaXF1ZV9wb3MoX0tleU9mVmFsdWUoKShfX3YpKTsKKworICAgICAgaWYgKF9fcmVzLnNlY29uZCkKKwlyZXR1cm4gX1JlcyhfTV9pbnNlcnRfKF9fcmVzLmZpcnN0LCBfX3Jlcy5zZWNvbmQsCisJCQkgICAgICAgX0dMSUJDWFhfRk9SV0FSRChfQXJnLCBfX3YpKSwKKwkJICAgIHRydWUpOworCisgICAgICByZXR1cm4gX1JlcyhpdGVyYXRvcihzdGF0aWNfY2FzdDxfTGlua190eXBlPihfX3Jlcy5maXJzdCkpLCBmYWxzZSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorI2VuZGlmCisgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIF9NX2luc2VydF9lcXVhbChfQXJnJiYgX192KQorI2Vsc2UKKyAgICBfTV9pbnNlcnRfZXF1YWwoY29uc3QgX1ZhbCYgX192KQorI2VuZGlmCisgICAgeworICAgICAgcGFpcjxfQmFzZV9wdHIsIF9CYXNlX3B0cj4gX19yZXMKKwk9IF9NX2dldF9pbnNlcnRfZXF1YWxfcG9zKF9LZXlPZlZhbHVlKCkoX192KSk7CisgICAgICByZXR1cm4gX01faW5zZXJ0XyhfX3Jlcy5maXJzdCwgX19yZXMuc2Vjb25kLCBfR0xJQkNYWF9GT1JXQVJEKF9BcmcsIF9fdikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBwYWlyPHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLAorCQkJICAgX0NvbXBhcmUsIF9BbGxvYz46Ol9CYXNlX3B0ciwKKyAgICAgICAgIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLAorCQkJICAgX0NvbXBhcmUsIF9BbGxvYz46Ol9CYXNlX3B0cj4KKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIF9NX2dldF9pbnNlcnRfaGludF91bmlxdWVfcG9zKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sCisJCQkJICBjb25zdCBrZXlfdHlwZSYgX19rKQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9fcG9zID0gX19wb3NpdGlvbi5fTV9jb25zdF9jYXN0KCk7CisgICAgICB0eXBlZGVmIHBhaXI8X0Jhc2VfcHRyLCBfQmFzZV9wdHI+IF9SZXM7CisKKyAgICAgIC8vIGVuZCgpCisgICAgICBpZiAoX19wb3MuX01fbm9kZSA9PSBfTV9lbmQoKSkKKwl7CisJICBpZiAoc2l6ZSgpID4gMAorCSAgICAgICYmIF9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9NX3JpZ2h0bW9zdCgpKSwgX19rKSkKKwkgICAgcmV0dXJuIF9SZXMoMCwgX01fcmlnaHRtb3N0KCkpOworCSAgZWxzZQorCSAgICByZXR1cm4gX01fZ2V0X2luc2VydF91bmlxdWVfcG9zKF9fayk7CisJfQorICAgICAgZWxzZSBpZiAoX01faW1wbC5fTV9rZXlfY29tcGFyZShfX2ssIF9TX2tleShfX3Bvcy5fTV9ub2RlKSkpCisJeworCSAgLy8gRmlyc3QsIHRyeSBiZWZvcmUuLi4KKwkgIGl0ZXJhdG9yIF9fYmVmb3JlID0gX19wb3M7CisJICBpZiAoX19wb3MuX01fbm9kZSA9PSBfTV9sZWZ0bW9zdCgpKSAvLyBiZWdpbigpCisJICAgIHJldHVybiBfUmVzKF9NX2xlZnRtb3N0KCksIF9NX2xlZnRtb3N0KCkpOworCSAgZWxzZSBpZiAoX01faW1wbC5fTV9rZXlfY29tcGFyZShfU19rZXkoKC0tX19iZWZvcmUpLl9NX25vZGUpLCBfX2spKQorCSAgICB7CisJICAgICAgaWYgKF9TX3JpZ2h0KF9fYmVmb3JlLl9NX25vZGUpID09IDApCisJCXJldHVybiBfUmVzKDAsIF9fYmVmb3JlLl9NX25vZGUpOworCSAgICAgIGVsc2UKKwkJcmV0dXJuIF9SZXMoX19wb3MuX01fbm9kZSwgX19wb3MuX01fbm9kZSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgcmV0dXJuIF9NX2dldF9pbnNlcnRfdW5pcXVlX3BvcyhfX2spOworCX0KKyAgICAgIGVsc2UgaWYgKF9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9fcG9zLl9NX25vZGUpLCBfX2spKQorCXsKKwkgIC8vIC4uLiB0aGVuIHRyeSBhZnRlci4KKwkgIGl0ZXJhdG9yIF9fYWZ0ZXIgPSBfX3BvczsKKwkgIGlmIChfX3Bvcy5fTV9ub2RlID09IF9NX3JpZ2h0bW9zdCgpKQorCSAgICByZXR1cm4gX1JlcygwLCBfTV9yaWdodG1vc3QoKSk7CisJICBlbHNlIGlmIChfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9faywgX1Nfa2V5KCgrK19fYWZ0ZXIpLl9NX25vZGUpKSkKKwkgICAgeworCSAgICAgIGlmIChfU19yaWdodChfX3Bvcy5fTV9ub2RlKSA9PSAwKQorCQlyZXR1cm4gX1JlcygwLCBfX3Bvcy5fTV9ub2RlKTsKKwkgICAgICBlbHNlCisJCXJldHVybiBfUmVzKF9fYWZ0ZXIuX01fbm9kZSwgX19hZnRlci5fTV9ub2RlKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICByZXR1cm4gX01fZ2V0X2luc2VydF91bmlxdWVfcG9zKF9fayk7CisJfQorICAgICAgZWxzZQorCS8vIEVxdWl2YWxlbnQga2V5cy4KKwlyZXR1cm4gX1JlcyhfX3Bvcy5fTV9ub2RlLCAwKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisjZW5kaWYKKyAgICB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgX01faW5zZXJ0X3VuaXF1ZV8oY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgX0FyZyYmIF9fdikKKyNlbHNlCisgICAgX01faW5zZXJ0X3VuaXF1ZV8oY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgX1ZhbCYgX192KQorI2VuZGlmCisgICAgeworICAgICAgcGFpcjxfQmFzZV9wdHIsIF9CYXNlX3B0cj4gX19yZXMKKwk9IF9NX2dldF9pbnNlcnRfaGludF91bmlxdWVfcG9zKF9fcG9zaXRpb24sIF9LZXlPZlZhbHVlKCkoX192KSk7CisKKyAgICAgIGlmIChfX3Jlcy5zZWNvbmQpCisJcmV0dXJuIF9NX2luc2VydF8oX19yZXMuZmlyc3QsIF9fcmVzLnNlY29uZCwKKwkJCSAgX0dMSUJDWFhfRk9SV0FSRChfQXJnLCBfX3YpKTsKKyAgICAgIHJldHVybiBpdGVyYXRvcihzdGF0aWNfY2FzdDxfTGlua190eXBlPihfX3Jlcy5maXJzdCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBwYWlyPHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLAorCQkJICAgX0NvbXBhcmUsIF9BbGxvYz46Ol9CYXNlX3B0ciwKKyAgICAgICAgIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLAorCQkJICAgX0NvbXBhcmUsIF9BbGxvYz46Ol9CYXNlX3B0cj4KKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIF9NX2dldF9pbnNlcnRfaGludF9lcXVhbF9wb3MoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICB7CisgICAgICBpdGVyYXRvciBfX3BvcyA9IF9fcG9zaXRpb24uX01fY29uc3RfY2FzdCgpOworICAgICAgdHlwZWRlZiBwYWlyPF9CYXNlX3B0ciwgX0Jhc2VfcHRyPiBfUmVzOworCisgICAgICAvLyBlbmQoKQorICAgICAgaWYgKF9fcG9zLl9NX25vZGUgPT0gX01fZW5kKCkpCisJeworCSAgaWYgKHNpemUoKSA+IDAKKwkgICAgICAmJiAhX01faW1wbC5fTV9rZXlfY29tcGFyZShfX2ssIF9TX2tleShfTV9yaWdodG1vc3QoKSkpKQorCSAgICByZXR1cm4gX1JlcygwLCBfTV9yaWdodG1vc3QoKSk7CisJICBlbHNlCisJICAgIHJldHVybiBfTV9nZXRfaW5zZXJ0X2VxdWFsX3BvcyhfX2spOworCX0KKyAgICAgIGVsc2UgaWYgKCFfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9TX2tleShfX3Bvcy5fTV9ub2RlKSwgX19rKSkKKwl7CisJICAvLyBGaXJzdCwgdHJ5IGJlZm9yZS4uLgorCSAgaXRlcmF0b3IgX19iZWZvcmUgPSBfX3BvczsKKwkgIGlmIChfX3Bvcy5fTV9ub2RlID09IF9NX2xlZnRtb3N0KCkpIC8vIGJlZ2luKCkKKwkgICAgcmV0dXJuIF9SZXMoX01fbGVmdG1vc3QoKSwgX01fbGVmdG1vc3QoKSk7CisJICBlbHNlIGlmICghX01faW1wbC5fTV9rZXlfY29tcGFyZShfX2ssIF9TX2tleSgoLS1fX2JlZm9yZSkuX01fbm9kZSkpKQorCSAgICB7CisJICAgICAgaWYgKF9TX3JpZ2h0KF9fYmVmb3JlLl9NX25vZGUpID09IDApCisJCXJldHVybiBfUmVzKDAsIF9fYmVmb3JlLl9NX25vZGUpOworCSAgICAgIGVsc2UKKwkJcmV0dXJuIF9SZXMoX19wb3MuX01fbm9kZSwgX19wb3MuX01fbm9kZSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgcmV0dXJuIF9NX2dldF9pbnNlcnRfZXF1YWxfcG9zKF9fayk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8vIC4uLiB0aGVuIHRyeSBhZnRlci4gIAorCSAgaXRlcmF0b3IgX19hZnRlciA9IF9fcG9zOworCSAgaWYgKF9fcG9zLl9NX25vZGUgPT0gX01fcmlnaHRtb3N0KCkpCisJICAgIHJldHVybiBfUmVzKDAsIF9NX3JpZ2h0bW9zdCgpKTsKKwkgIGVsc2UgaWYgKCFfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9TX2tleSgoKytfX2FmdGVyKS5fTV9ub2RlKSwgX19rKSkKKwkgICAgeworCSAgICAgIGlmIChfU19yaWdodChfX3Bvcy5fTV9ub2RlKSA9PSAwKQorCQlyZXR1cm4gX1JlcygwLCBfX3Bvcy5fTV9ub2RlKTsKKwkgICAgICBlbHNlCisJCXJldHVybiBfUmVzKF9fYWZ0ZXIuX01fbm9kZSwgX19hZnRlci5fTV9ub2RlKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICByZXR1cm4gX1JlcygwLCAwKTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorI2VuZGlmCisgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIF9NX2luc2VydF9lcXVhbF8oY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgX0FyZyYmIF9fdikKKyNlbHNlCisgICAgX01faW5zZXJ0X2VxdWFsXyhjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCBfVmFsJiBfX3YpCisjZW5kaWYKKyAgICB7CisgICAgICBwYWlyPF9CYXNlX3B0ciwgX0Jhc2VfcHRyPiBfX3JlcworCT0gX01fZ2V0X2luc2VydF9oaW50X2VxdWFsX3BvcyhfX3Bvc2l0aW9uLCBfS2V5T2ZWYWx1ZSgpKF9fdikpOworCisgICAgICBpZiAoX19yZXMuc2Vjb25kKQorCXJldHVybiBfTV9pbnNlcnRfKF9fcmVzLmZpcnN0LCBfX3Jlcy5zZWNvbmQsCisJCQkgIF9HTElCQ1hYX0ZPUldBUkQoX0FyZywgX192KSk7CisKKyAgICAgIHJldHVybiBfTV9pbnNlcnRfZXF1YWxfbG93ZXIoX0dMSUJDWFhfRk9SV0FSRChfQXJnLCBfX3YpKTsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIF9NX2luc2VydF9ub2RlKF9CYXNlX3B0ciBfX3gsIF9CYXNlX3B0ciBfX3AsIF9MaW5rX3R5cGUgX196KQorICAgIHsKKyAgICAgIGJvb2wgX19pbnNlcnRfbGVmdCA9IChfX3ggIT0gMCB8fCBfX3AgPT0gX01fZW5kKCkKKwkJCSAgICB8fCBfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9TX2tleShfX3opLAorCQkJCQkJICAgICAgX1Nfa2V5KF9fcCkpKTsKKworICAgICAgX1JiX3RyZWVfaW5zZXJ0X2FuZF9yZWJhbGFuY2UoX19pbnNlcnRfbGVmdCwgX196LCBfX3AsCisJCQkJICAgIHRoaXMtPl9NX2ltcGwuX01faGVhZGVyKTsKKyAgICAgICsrX01faW1wbC5fTV9ub2RlX2NvdW50OworICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9feik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIF9NX2luc2VydF9sb3dlcl9ub2RlKF9CYXNlX3B0ciBfX3AsIF9MaW5rX3R5cGUgX196KQorICAgIHsKKyAgICAgIGJvb2wgX19pbnNlcnRfbGVmdCA9IChfX3AgPT0gX01fZW5kKCkKKwkJCSAgICB8fCAhX01faW1wbC5fTV9rZXlfY29tcGFyZShfU19rZXkoX19wKSwKKwkJCQkJCSAgICAgICBfU19rZXkoX196KSkpOworCisgICAgICBfUmJfdHJlZV9pbnNlcnRfYW5kX3JlYmFsYW5jZShfX2luc2VydF9sZWZ0LCBfX3osIF9fcCwKKwkJCQkgICAgdGhpcy0+X01faW1wbC5fTV9oZWFkZXIpOworICAgICAgKytfTV9pbXBsLl9NX25vZGVfY291bnQ7CisgICAgICByZXR1cm4gaXRlcmF0b3IoX196KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgX01faW5zZXJ0X2VxdWFsX2xvd2VyX25vZGUoX0xpbmtfdHlwZSBfX3opCisgICAgeworICAgICAgX0xpbmtfdHlwZSBfX3ggPSBfTV9iZWdpbigpOworICAgICAgX0xpbmtfdHlwZSBfX3kgPSBfTV9lbmQoKTsKKyAgICAgIHdoaWxlIChfX3ggIT0gMCkKKwl7CisJICBfX3kgPSBfX3g7CisJICBfX3ggPSAhX01faW1wbC5fTV9rZXlfY29tcGFyZShfU19rZXkoX194KSwgX1Nfa2V5KF9feikpID8KKwkgICAgICAgIF9TX2xlZnQoX194KSA6IF9TX3JpZ2h0KF9feCk7CisJfQorICAgICAgcmV0dXJuIF9NX2luc2VydF9sb3dlcl9ub2RlKF9feSwgX196KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICBwYWlyPHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLAorCQkJICAgICBfQ29tcGFyZSwgX0FsbG9jPjo6aXRlcmF0b3IsIGJvb2w+CisgICAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgICAgX01fZW1wbGFjZV91bmlxdWUoX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICB7CisJX0xpbmtfdHlwZSBfX3ogPSBfTV9jcmVhdGVfbm9kZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCisJX190cnkKKwkgIHsKKwkgICAgdHlwZWRlZiBwYWlyPGl0ZXJhdG9yLCBib29sPiBfUmVzOworCSAgICBhdXRvIF9fcmVzID0gX01fZ2V0X2luc2VydF91bmlxdWVfcG9zKF9TX2tleShfX3opKTsKKwkgICAgaWYgKF9fcmVzLnNlY29uZCkKKwkgICAgICByZXR1cm4gX1JlcyhfTV9pbnNlcnRfbm9kZShfX3Jlcy5maXJzdCwgX19yZXMuc2Vjb25kLCBfX3opLCB0cnVlKTsKKwkKKwkgICAgX01fZGVzdHJveV9ub2RlKF9feik7CisJICAgIHJldHVybiBfUmVzKGl0ZXJhdG9yKHN0YXRpY19jYXN0PF9MaW5rX3R5cGU+KF9fcmVzLmZpcnN0KSksIGZhbHNlKTsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX01fZGVzdHJveV9ub2RlKF9feik7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjppdGVyYXRvcgorICAgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICAgIF9NX2VtcGxhY2VfZXF1YWwoX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICB7CisJX0xpbmtfdHlwZSBfX3ogPSBfTV9jcmVhdGVfbm9kZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCisJX190cnkKKwkgIHsKKwkgICAgYXV0byBfX3JlcyA9IF9NX2dldF9pbnNlcnRfZXF1YWxfcG9zKF9TX2tleShfX3opKTsKKwkgICAgcmV0dXJuIF9NX2luc2VydF9ub2RlKF9fcmVzLmZpcnN0LCBfX3Jlcy5zZWNvbmQsIF9feik7CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIF9NX2Rlc3Ryb3lfbm9kZShfX3opOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgICBfTV9lbXBsYWNlX2hpbnRfdW5pcXVlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIHsKKwlfTGlua190eXBlIF9feiA9IF9NX2NyZWF0ZV9ub2RlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisKKwlfX3RyeQorCSAgeworCSAgICBhdXRvIF9fcmVzID0gX01fZ2V0X2luc2VydF9oaW50X3VuaXF1ZV9wb3MoX19wb3MsIF9TX2tleShfX3opKTsKKworCSAgICBpZiAoX19yZXMuc2Vjb25kKQorCSAgICAgIHJldHVybiBfTV9pbnNlcnRfbm9kZShfX3Jlcy5maXJzdCwgX19yZXMuc2Vjb25kLCBfX3opOworCisJICAgIF9NX2Rlc3Ryb3lfbm9kZShfX3opOworCSAgICByZXR1cm4gaXRlcmF0b3Ioc3RhdGljX2Nhc3Q8X0xpbmtfdHlwZT4oX19yZXMuZmlyc3QpKTsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX01fZGVzdHJveV9ub2RlKF9feik7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjppdGVyYXRvcgorICAgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICAgIF9NX2VtcGxhY2VfaGludF9lcXVhbChjb25zdF9pdGVyYXRvciBfX3BvcywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICB7CisJX0xpbmtfdHlwZSBfX3ogPSBfTV9jcmVhdGVfbm9kZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCisJX190cnkKKwkgIHsKKwkgICAgYXV0byBfX3JlcyA9IF9NX2dldF9pbnNlcnRfaGludF9lcXVhbF9wb3MoX19wb3MsIF9TX2tleShfX3opKTsKKworCSAgICBpZiAoX19yZXMuc2Vjb25kKQorCSAgICAgIHJldHVybiBfTV9pbnNlcnRfbm9kZShfX3Jlcy5maXJzdCwgX19yZXMuc2Vjb25kLCBfX3opOworCisJICAgIHJldHVybiBfTV9pbnNlcnRfZXF1YWxfbG93ZXJfbm9kZShfX3opOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfTV9kZXN0cm95X25vZGUoX196KTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisgICAgICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS29WLAorICAgICAgICAgICB0eXBlbmFtZSBfQ21wLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8Y2xhc3MgX0lJPgorICAgICAgdm9pZAorICAgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tvViwgX0NtcCwgX0FsbG9jPjo6CisgICAgICBfTV9pbnNlcnRfdW5pcXVlKF9JSSBfX2ZpcnN0LCBfSUkgX19sYXN0KQorICAgICAgeworCWZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCSAgX01faW5zZXJ0X3VuaXF1ZV8oZW5kKCksICpfX2ZpcnN0KTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS29WLAorICAgICAgICAgICB0eXBlbmFtZSBfQ21wLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8Y2xhc3MgX0lJPgorICAgICAgdm9pZAorICAgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tvViwgX0NtcCwgX0FsbG9jPjo6CisgICAgICBfTV9pbnNlcnRfZXF1YWwoX0lJIF9fZmlyc3QsIF9JSSBfX2xhc3QpCisgICAgICB7CisJZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJICBfTV9pbnNlcnRfZXF1YWxfKGVuZCgpLCAqX19maXJzdCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgX01fZXJhc2VfYXV4KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgeworICAgICAgX0xpbmtfdHlwZSBfX3kgPQorCXN0YXRpY19jYXN0PF9MaW5rX3R5cGU+KF9SYl90cmVlX3JlYmFsYW5jZV9mb3JfZXJhc2UKKwkJCQkoY29uc3RfY2FzdDxfQmFzZV9wdHI+KF9fcG9zaXRpb24uX01fbm9kZSksCisJCQkJIHRoaXMtPl9NX2ltcGwuX01faGVhZGVyKSk7CisgICAgICBfTV9kZXN0cm95X25vZGUoX195KTsKKyAgICAgIC0tX01faW1wbC5fTV9ub2RlX2NvdW50OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICBfTV9lcmFzZV9hdXgoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIGlmIChfX2ZpcnN0ID09IGJlZ2luKCkgJiYgX19sYXN0ID09IGVuZCgpKQorCWNsZWFyKCk7CisgICAgICBlbHNlCisJd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorCSAgZXJhc2UoX19maXJzdCsrKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjpzaXplX3R5cGUKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIGVyYXNlKGNvbnN0IF9LZXkmIF9feCkKKyAgICB7CisgICAgICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gX19wID0gZXF1YWxfcmFuZ2UoX194KTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX29sZF9zaXplID0gc2l6ZSgpOworICAgICAgZXJhc2UoX19wLmZpcnN0LCBfX3Auc2Vjb25kKTsKKyAgICAgIHJldHVybiBfX29sZF9zaXplIC0gc2l6ZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICBlcmFzZShjb25zdCBfS2V5KiBfX2ZpcnN0LCBjb25zdCBfS2V5KiBfX2xhc3QpCisgICAgeworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorCWVyYXNlKCpfX2ZpcnN0KyspOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwKKwkJICAgICAgX0NvbXBhcmUsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICBmaW5kKGNvbnN0IF9LZXkmIF9faykKKyAgICB7CisgICAgICBpdGVyYXRvciBfX2ogPSBfTV9sb3dlcl9ib3VuZChfTV9iZWdpbigpLCBfTV9lbmQoKSwgX19rKTsKKyAgICAgIHJldHVybiAoX19qID09IGVuZCgpCisJICAgICAgfHwgX01faW1wbC5fTV9rZXlfY29tcGFyZShfX2ssCisJCQkJCV9TX2tleShfX2ouX01fbm9kZSkpKSA/IGVuZCgpIDogX19qOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwKKwkJICAgICAgX0NvbXBhcmUsIF9BbGxvYz46OmNvbnN0X2l0ZXJhdG9yCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICBmaW5kKGNvbnN0IF9LZXkmIF9faykgY29uc3QKKyAgICB7CisgICAgICBjb25zdF9pdGVyYXRvciBfX2ogPSBfTV9sb3dlcl9ib3VuZChfTV9iZWdpbigpLCBfTV9lbmQoKSwgX19rKTsKKyAgICAgIHJldHVybiAoX19qID09IGVuZCgpCisJICAgICAgfHwgX01faW1wbC5fTV9rZXlfY29tcGFyZShfX2ssIAorCQkJCQlfU19rZXkoX19qLl9NX25vZGUpKSkgPyBlbmQoKSA6IF9fajsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjpzaXplX3R5cGUKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIGNvdW50KGNvbnN0IF9LZXkmIF9faykgY29uc3QKKyAgICB7CisgICAgICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4gX19wID0gZXF1YWxfcmFuZ2UoX19rKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBzdGQ6OmRpc3RhbmNlKF9fcC5maXJzdCwgX19wLnNlY29uZCk7CisgICAgICByZXR1cm4gX19uOworICAgIH0KKworICBfR0xJQkNYWF9QVVJFIHVuc2lnbmVkIGludAorICBfUmJfdHJlZV9ibGFja19jb3VudChjb25zdCBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9fbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1JiX3RyZWVfbm9kZV9iYXNlKiBfX3Jvb3QpIHRocm93ICgpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJvb2wKKyAgICBfUmJfdHJlZTxfS2V5LF9WYWwsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPjo6X19yYl92ZXJpZnkoKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChfTV9pbXBsLl9NX25vZGVfY291bnQgPT0gMCB8fCBiZWdpbigpID09IGVuZCgpKQorCXJldHVybiBfTV9pbXBsLl9NX25vZGVfY291bnQgPT0gMCAmJiBiZWdpbigpID09IGVuZCgpCisJICAgICAgICYmIHRoaXMtPl9NX2ltcGwuX01faGVhZGVyLl9NX2xlZnQgPT0gX01fZW5kKCkKKwkgICAgICAgJiYgdGhpcy0+X01faW1wbC5fTV9oZWFkZXIuX01fcmlnaHQgPT0gX01fZW5kKCk7CisKKyAgICAgIHVuc2lnbmVkIGludCBfX2xlbiA9IF9SYl90cmVlX2JsYWNrX2NvdW50KF9NX2xlZnRtb3N0KCksIF9NX3Jvb3QoKSk7CisgICAgICBmb3IgKGNvbnN0X2l0ZXJhdG9yIF9faXQgPSBiZWdpbigpOyBfX2l0ICE9IGVuZCgpOyArK19faXQpCisJeworCSAgX0NvbnN0X0xpbmtfdHlwZSBfX3ggPSBzdGF0aWNfY2FzdDxfQ29uc3RfTGlua190eXBlPihfX2l0Ll9NX25vZGUpOworCSAgX0NvbnN0X0xpbmtfdHlwZSBfX0wgPSBfU19sZWZ0KF9feCk7CisJICBfQ29uc3RfTGlua190eXBlIF9fUiA9IF9TX3JpZ2h0KF9feCk7CisKKwkgIGlmIChfX3gtPl9NX2NvbG9yID09IF9TX3JlZCkKKwkgICAgaWYgKChfX0wgJiYgX19MLT5fTV9jb2xvciA9PSBfU19yZWQpCisJCXx8IChfX1IgJiYgX19SLT5fTV9jb2xvciA9PSBfU19yZWQpKQorCSAgICAgIHJldHVybiBmYWxzZTsKKworCSAgaWYgKF9fTCAmJiBfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9TX2tleShfX3gpLCBfU19rZXkoX19MKSkpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGlmIChfX1IgJiYgX01faW1wbC5fTV9rZXlfY29tcGFyZShfU19rZXkoX19SKSwgX1Nfa2V5KF9feCkpKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIGlmICghX19MICYmICFfX1IgJiYgX1JiX3RyZWVfYmxhY2tfY291bnQoX194LCBfTV9yb290KCkpICE9IF9fbGVuKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBpZiAoX01fbGVmdG1vc3QoKSAhPSBfUmJfdHJlZV9ub2RlX2Jhc2U6Ol9TX21pbmltdW0oX01fcm9vdCgpKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpZiAoX01fcmlnaHRtb3N0KCkgIT0gX1JiX3RyZWVfbm9kZV9iYXNlOjpfU19tYXhpbXVtKF9NX3Jvb3QoKSkpCisJcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF91bmluaXRpYWxpemVkLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RsX3VuaW5pdGlhbGl6ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTBiMTYyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF91bmluaXRpYWxpemVkLmgKQEAgLTAsMCArMSw2NTYgQEAKKy8vIFJhdyBtZW1vcnkgbWFuaXB1bGF0b3JzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF91bmluaXRpYWxpemVkLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXttZW1vcnl9CisgKi8KKworI2lmbmRlZiBfU1RMX1VOSU5JVElBTElaRURfSAorI2RlZmluZSBfU1RMX1VOSU5JVElBTElaRURfSCAxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTxib29sIF9Ucml2aWFsVmFsdWVUeXBlcz4KKyAgICBzdHJ1Y3QgX191bmluaXRpYWxpemVkX2NvcHkKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgc3RhdGljIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICAgICAgX191bmluaXRfY29weShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQpCisgICAgICAgIHsKKwkgIF9Gb3J3YXJkSXRlcmF0b3IgX19jdXIgPSBfX3Jlc3VsdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwgKytfX2N1cikKKwkJc3RkOjpfQ29uc3RydWN0KHN0ZDo6X19hZGRyZXNzb2YoKl9fY3VyKSwgKl9fZmlyc3QpOworCSAgICAgIHJldHVybiBfX2N1cjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBzdGQ6Ol9EZXN0cm95KF9fcmVzdWx0LCBfX2N1cik7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwl9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fdW5pbml0aWFsaXplZF9jb3B5PHRydWU+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHN0YXRpYyBfRm9yd2FyZEl0ZXJhdG9yCisgICAgICAgIF9fdW5pbml0X2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0KQorICAgICAgICB7IHJldHVybiBzdGQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7IH0KKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIENvcGllcyB0aGUgcmFuZ2UgW2ZpcnN0LGxhc3QpIGludG8gcmVzdWx0LgorICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fcmVzdWx0IEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gICBfX3Jlc3VsdCArIChfX2ZpcnN0IC0gX19sYXN0KQorICAgKgorICAgKiAgTGlrZSBjb3B5KCksIGJ1dCBkb2VzIG5vdCByZXF1aXJlIGFuIGluaXRpYWxpemVkIG91dHB1dCByYW5nZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgaW5saW5lIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICB1bmluaXRpYWxpemVkX2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTI7CisKKyAgICAgIHJldHVybiBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5PChfX2lzX3RyaXZpYWwoX1ZhbHVlVHlwZTEpCisJCQkJCSYmIF9faXNfdHJpdmlhbChfVmFsdWVUeXBlMikpPjo6CisJX191bmluaXRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsKKyAgICB9CisKKworICB0ZW1wbGF0ZTxib29sIF9Ucml2aWFsVmFsdWVUeXBlPgorICAgIHN0cnVjdCBfX3VuaW5pdGlhbGl6ZWRfZmlsbAorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICAgICAgc3RhdGljIHZvaWQKKyAgICAgICAgX191bmluaXRfZmlsbChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgICAgICBjb25zdCBfVHAmIF9feCkKKyAgICAgICAgeworCSAgX0ZvcndhcmRJdGVyYXRvciBfX2N1ciA9IF9fZmlyc3Q7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgZm9yICg7IF9fY3VyICE9IF9fbGFzdDsgKytfX2N1cikKKwkJc3RkOjpfQ29uc3RydWN0KHN0ZDo6X19hZGRyZXNzb2YoKl9fY3VyKSwgX194KTsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBzdGQ6Ol9EZXN0cm95KF9fZmlyc3QsIF9fY3VyKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX191bmluaXRpYWxpemVkX2ZpbGw8dHJ1ZT4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0YXRpYyB2b2lkCisgICAgICAgIF9fdW5pbml0X2ZpbGwoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICAgY29uc3QgX1RwJiBfX3gpCisgICAgICAgIHsgc3RkOjpmaWxsKF9fZmlyc3QsIF9fbGFzdCwgX194KTsgfQorICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29waWVzIHRoZSB2YWx1ZSB4IGludG8gdGhlIHJhbmdlIFtmaXJzdCxsYXN0KS4KKyAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX3ggICAgICBUaGUgc291cmNlIHZhbHVlLgorICAgKiAgQHJldHVybiAgIE5vdGhpbmcuCisgICAqCisgICAqICBMaWtlIGZpbGwoKSwgYnV0IGRvZXMgbm90IHJlcXVpcmUgYW4gaW5pdGlhbGl6ZWQgb3V0cHV0IHJhbmdlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICB1bmluaXRpYWxpemVkX2ZpbGwoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICAgIGNvbnN0IF9UcCYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKworICAgICAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZmlsbDxfX2lzX3RyaXZpYWwoX1ZhbHVlVHlwZSk+OjoKKwlfX3VuaW5pdF9maWxsKF9fZmlyc3QsIF9fbGFzdCwgX194KTsKKyAgICB9CisKKworICB0ZW1wbGF0ZTxib29sIF9Ucml2aWFsVmFsdWVUeXBlPgorICAgIHN0cnVjdCBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uCisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9UcD4KKyAgICAgICAgc3RhdGljIHZvaWQKKyAgICAgICAgX191bmluaXRfZmlsbF9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19uLAorCQkJY29uc3QgX1RwJiBfX3gpCisgICAgICAgIHsKKwkgIF9Gb3J3YXJkSXRlcmF0b3IgX19jdXIgPSBfX2ZpcnN0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIGZvciAoOyBfX24gPiAwOyAtLV9fbiwgKytfX2N1cikKKwkJc3RkOjpfQ29uc3RydWN0KHN0ZDo6X19hZGRyZXNzb2YoKl9fY3VyKSwgX194KTsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBzdGQ6Ol9EZXN0cm95KF9fZmlyc3QsIF9fY3VyKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX191bmluaXRpYWxpemVkX2ZpbGxfbjx0cnVlPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0YXRpYyB2b2lkCisgICAgICAgIF9fdW5pbml0X2ZpbGxfbihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fbiwKKwkJCWNvbnN0IF9UcCYgX194KQorICAgICAgICB7IHN0ZDo6ZmlsbF9uKF9fZmlyc3QsIF9fbiwgX194KTsgfQorICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29waWVzIHRoZSB2YWx1ZSB4IGludG8gdGhlIHJhbmdlIFtmaXJzdCxmaXJzdCtuKS4KKyAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fbiAgICAgIFRoZSBudW1iZXIgb2YgY29waWVzIHRvIG1ha2UuCisgICAqICBAcGFyYW0gIF9feCAgICAgIFRoZSBzb3VyY2UgdmFsdWUuCisgICAqICBAcmV0dXJuICAgTm90aGluZy4KKyAgICoKKyAgICogIExpa2UgZmlsbF9uKCksIGJ1dCBkb2VzIG5vdCByZXF1aXJlIGFuIGluaXRpYWxpemVkIG91dHB1dCByYW5nZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHVuaW5pdGlhbGl6ZWRfZmlsbF9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIHN0ZDo6X191bmluaXRpYWxpemVkX2ZpbGxfbjxfX2lzX3RyaXZpYWwoX1ZhbHVlVHlwZSk+OjoKKwlfX3VuaW5pdF9maWxsX24oX19maXJzdCwgX19uLCBfX3gpOworICAgIH0KKworICAvLyBFeHRlbnNpb25zOiB2ZXJzaW9ucyBvZiB1bmluaXRpYWxpemVkX2NvcHksIHVuaW5pdGlhbGl6ZWRfZmlsbCwKKyAgLy8gIGFuZCB1bmluaXRpYWxpemVkX2ZpbGxfbiB0aGF0IHRha2UgYW4gYWxsb2NhdG9yIHBhcmFtZXRlci4KKyAgLy8gIFdlIGRpc3BhdGNoIGJhY2sgdG8gdGhlIHN0YW5kYXJkIHZlcnNpb25zIHdoZW4gd2UncmUgZ2l2ZW4gdGhlCisgIC8vICBkZWZhdWx0IGFsbG9jYXRvci4gIEZvciBub25kZWZhdWx0IGFsbG9jYXRvcnMgd2UgZG8gbm90IHVzZSAKKyAgLy8gIGFueSBvZiB0aGUgUE9EIG9wdGltaXphdGlvbnMuCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgX191bmluaXRpYWxpemVkX2NvcHlfYShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQkgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0LCBfQWxsb2NhdG9yJiBfX2FsbG9jKQorICAgIHsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19jdXIgPSBfX3Jlc3VsdDsKKyAgICAgIF9fdHJ5CisJeworCSAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fYWxsb2NfdHJhaXRzPF9BbGxvY2F0b3I+IF9fdHJhaXRzOworCSAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICsrX19jdXIpCisJICAgIF9fdHJhaXRzOjpjb25zdHJ1Y3QoX19hbGxvYywgc3RkOjpfX2FkZHJlc3NvZigqX19jdXIpLCAqX19maXJzdCk7CisJICByZXR1cm4gX19jdXI7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgc3RkOjpfRGVzdHJveShfX3Jlc3VsdCwgX19jdXIsIF9fYWxsb2MpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfRm9yd2FyZEl0ZXJhdG9yCisgICAgX191bmluaXRpYWxpemVkX2NvcHlfYShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQkgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0LCBhbGxvY2F0b3I8X1RwPiYpCisgICAgeyByZXR1cm4gc3RkOjp1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBfRm9yd2FyZEl0ZXJhdG9yCisgICAgX191bmluaXRpYWxpemVkX21vdmVfYShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQkgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0LCBfQWxsb2NhdG9yJiBfX2FsbG9jKQorICAgIHsKKyAgICAgIHJldHVybiBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5X2EoX0dMSUJDWFhfTUFLRV9NT1ZFX0lURVJBVE9SKF9fZmlyc3QpLAorCQkJCQkgX0dMSUJDWFhfTUFLRV9NT1ZFX0lURVJBVE9SKF9fbGFzdCksCisJCQkJCSBfX3Jlc3VsdCwgX19hbGxvYyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBfX3VuaW5pdGlhbGl6ZWRfbW92ZV9pZl9ub2V4Y2VwdF9hKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsCisJCQkJICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJCQkgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCwKKwkJCQkgICAgICAgX0FsbG9jYXRvciYgX19hbGxvYykKKyAgICB7CisgICAgICByZXR1cm4gc3RkOjpfX3VuaW5pdGlhbGl6ZWRfY29weV9hCisJKF9HTElCQ1hYX01BS0VfTU9WRV9JRl9OT0VYQ0VQVF9JVEVSQVRPUihfX2ZpcnN0KSwKKwkgX0dMSUJDWFhfTUFLRV9NT1ZFX0lGX05PRVhDRVBUX0lURVJBVE9SKF9fbGFzdCksIF9fcmVzdWx0LCBfX2FsbG9jKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIHZvaWQKKyAgICBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9hKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCQkgICBjb25zdCBfVHAmIF9feCwgX0FsbG9jYXRvciYgX19hbGxvYykKKyAgICB7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fY3VyID0gX19maXJzdDsKKyAgICAgIF9fdHJ5CisJeworCSAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fYWxsb2NfdHJhaXRzPF9BbGxvY2F0b3I+IF9fdHJhaXRzOworCSAgZm9yICg7IF9fY3VyICE9IF9fbGFzdDsgKytfX2N1cikKKwkgICAgX190cmFpdHM6OmNvbnN0cnVjdChfX2FsbG9jLCBzdGQ6Ol9fYWRkcmVzc29mKCpfX2N1ciksIF9feCk7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgc3RkOjpfRGVzdHJveShfX2ZpcnN0LCBfX2N1ciwgX19hbGxvYyk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwMj4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdW5pbml0aWFsaXplZF9maWxsX2EoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgIGNvbnN0IF9UcCYgX194LCBhbGxvY2F0b3I8X1RwMj4mKQorICAgIHsgc3RkOjp1bmluaXRpYWxpemVkX2ZpbGwoX19maXJzdCwgX19sYXN0LCBfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIHZvaWQKKyAgICBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uX2EoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24sIAorCQkJICAgICBjb25zdCBfVHAmIF9feCwgX0FsbG9jYXRvciYgX19hbGxvYykKKyAgICB7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fY3VyID0gX19maXJzdDsKKyAgICAgIF9fdHJ5CisJeworCSAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fYWxsb2NfdHJhaXRzPF9BbGxvY2F0b3I+IF9fdHJhaXRzOworCSAgZm9yICg7IF9fbiA+IDA7IC0tX19uLCArK19fY3VyKQorCSAgICBfX3RyYWl0czo6Y29uc3RydWN0KF9fYWxsb2MsIHN0ZDo6X19hZGRyZXNzb2YoKl9fY3VyKSwgX194KTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBzdGQ6Ol9EZXN0cm95KF9fZmlyc3QsIF9fY3VyLCBfX2FsbG9jKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfVHAyPgorICAgIGlubGluZSB2b2lkCisgICAgX191bmluaXRpYWxpemVkX2ZpbGxfbl9hKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19uLCAKKwkJCSAgICAgY29uc3QgX1RwJiBfX3gsIGFsbG9jYXRvcjxfVHAyPiYpCisgICAgeyBzdGQ6OnVuaW5pdGlhbGl6ZWRfZmlsbF9uKF9fZmlyc3QsIF9fbiwgX194KTsgfQorCisKKyAgLy8gRXh0ZW5zaW9uczogX191bmluaXRpYWxpemVkX2NvcHlfbW92ZSwgX191bmluaXRpYWxpemVkX21vdmVfY29weSwKKyAgLy8gX191bmluaXRpYWxpemVkX2ZpbGxfbW92ZSwgX191bmluaXRpYWxpemVkX21vdmVfZmlsbC4KKyAgLy8gQWxsIG9mIHRoZXNlIGFsZ29yaXRobXMgdGFrZSBhIHVzZXItc3VwcGxpZWQgYWxsb2NhdG9yLCB3aGljaCBpcyB1c2VkCisgIC8vIGZvciBjb25zdHJ1Y3Rpb24gYW5kIGRlc3RydWN0aW9uLgorCisgIC8vIF9fdW5pbml0aWFsaXplZF9jb3B5X21vdmUKKyAgLy8gQ29waWVzIFtmaXJzdDEsIGxhc3QxKSBpbnRvIFtyZXN1bHQsIHJlc3VsdCArIChsYXN0MSAtIGZpcnN0MSkpLCBhbmQKKyAgLy8gIG1vdmUgW2ZpcnN0MiwgbGFzdDIpIGludG8KKyAgLy8gIFtyZXN1bHQsIHJlc3VsdCArIChsYXN0MSAtIGZpcnN0MSkgKyAobGFzdDIgLSBmaXJzdDIpKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgX0ZvcndhcmRJdGVyYXRvcgorICAgIF9fdW5pbml0aWFsaXplZF9jb3B5X21vdmUoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLAorCQkJICAgICAgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJCQkgICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsCisJCQkgICAgICBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwKKwkJCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQsCisJCQkgICAgICBfQWxsb2NhdG9yJiBfX2FsbG9jKQorICAgIHsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQgPSBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5X2EoX19maXJzdDEsIF9fbGFzdDEsCisJCQkJCQkJICAgX19yZXN1bHQsCisJCQkJCQkJICAgX19hbGxvYyk7CisgICAgICBfX3RyeQorCXsKKwkgIHJldHVybiBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2EoX19maXJzdDIsIF9fbGFzdDIsIF9fbWlkLCBfX2FsbG9jKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBzdGQ6Ol9EZXN0cm95KF9fcmVzdWx0LCBfX21pZCwgX19hbGxvYyk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisgIC8vIF9fdW5pbml0aWFsaXplZF9tb3ZlX2NvcHkKKyAgLy8gTW92ZXMgW2ZpcnN0MSwgbGFzdDEpIGludG8gW3Jlc3VsdCwgcmVzdWx0ICsgKGxhc3QxIC0gZmlyc3QxKSksIGFuZAorICAvLyAgY29waWVzIFtmaXJzdDIsIGxhc3QyKSBpbnRvCisgIC8vICBbcmVzdWx0LCByZXN1bHQgKyAobGFzdDEgLSBmaXJzdDEpICsgKGxhc3QyIC0gZmlyc3QyKSkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBfX3VuaW5pdGlhbGl6ZWRfbW92ZV9jb3B5KF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwKKwkJCSAgICAgIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCQkJICAgICAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLAorCQkJICAgICAgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsCisJCQkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0LAorCQkJICAgICAgX0FsbG9jYXRvciYgX19hbGxvYykKKyAgICB7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkID0gc3RkOjpfX3VuaW5pdGlhbGl6ZWRfbW92ZV9hKF9fZmlyc3QxLCBfX2xhc3QxLAorCQkJCQkJCSAgIF9fcmVzdWx0LAorCQkJCQkJCSAgIF9fYWxsb2MpOworICAgICAgX190cnkKKwl7CisJICByZXR1cm4gc3RkOjpfX3VuaW5pdGlhbGl6ZWRfY29weV9hKF9fZmlyc3QyLCBfX2xhc3QyLCBfX21pZCwgX19hbGxvYyk7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgc3RkOjpfRGVzdHJveShfX3Jlc3VsdCwgX19taWQsIF9fYWxsb2MpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKyAgCisgIC8vIF9fdW5pbml0aWFsaXplZF9maWxsX21vdmUKKyAgLy8gRmlsbHMgW3Jlc3VsdCwgbWlkKSB3aXRoIHgsIGFuZCBtb3ZlcyBbZmlyc3QsIGxhc3QpIGludG8KKyAgLy8gIFttaWQsIG1pZCArIChsYXN0IC0gZmlyc3QpKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBfRm9yd2FyZEl0ZXJhdG9yCisgICAgX191bmluaXRpYWxpemVkX2ZpbGxfbW92ZShfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkLAorCQkJICAgICAgY29uc3QgX1RwJiBfX3gsIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICAgICBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIF9BbGxvY2F0b3ImIF9fYWxsb2MpCisgICAgeworICAgICAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZmlsbF9hKF9fcmVzdWx0LCBfX21pZCwgX194LCBfX2FsbG9jKTsKKyAgICAgIF9fdHJ5CisJeworCSAgcmV0dXJuIHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfYShfX2ZpcnN0LCBfX2xhc3QsIF9fbWlkLCBfX2FsbG9jKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBzdGQ6Ol9EZXN0cm95KF9fcmVzdWx0LCBfX21pZCwgX19hbGxvYyk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisgIC8vIF9fdW5pbml0aWFsaXplZF9tb3ZlX2ZpbGwKKyAgLy8gTW92ZXMgW2ZpcnN0MSwgbGFzdDEpIGludG8gW2ZpcnN0MiwgZmlyc3QyICsgKGxhc3QxIC0gZmlyc3QxKSksIGFuZAorICAvLyAgZmlsbHMgW2ZpcnN0MiArIChsYXN0MSAtIGZpcnN0MSksIGxhc3QyKSB3aXRoIHguCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdW5pbml0aWFsaXplZF9tb3ZlX2ZpbGwoX0lucHV0SXRlcmF0b3IgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdDEsCisJCQkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QyLAorCQkJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QyLCBjb25zdCBfVHAmIF9feCwKKwkJCSAgICAgIF9BbGxvY2F0b3ImIF9fYWxsb2MpCisgICAgeworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX21pZDIgPSBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2EoX19maXJzdDEsIF9fbGFzdDEsCisJCQkJCQkJICAgIF9fZmlyc3QyLAorCQkJCQkJCSAgICBfX2FsbG9jKTsKKyAgICAgIF9fdHJ5CisJeworCSAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZmlsbF9hKF9fbWlkMiwgX19sYXN0MiwgX194LCBfX2FsbG9jKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBzdGQ6Ol9EZXN0cm95KF9fZmlyc3QyLCBfX21pZDIsIF9fYWxsb2MpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgLy8gRXh0ZW5zaW9uczogX191bmluaXRpYWxpemVkX2RlZmF1bHQsIF9fdW5pbml0aWFsaXplZF9kZWZhdWx0X24sCisgIC8vIF9fdW5pbml0aWFsaXplZF9kZWZhdWx0X2EsIF9fdW5pbml0aWFsaXplZF9kZWZhdWx0X25fYS4KKworICB0ZW1wbGF0ZTxib29sIF9Ucml2aWFsVmFsdWVUeXBlPgorICAgIHN0cnVjdCBfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF8xCisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgc3RhdGljIHZvaWQKKyAgICAgICAgX191bmluaXRfZGVmYXVsdChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICBfRm9yd2FyZEl0ZXJhdG9yIF9fY3VyID0gX19maXJzdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBmb3IgKDsgX19jdXIgIT0gX19sYXN0OyArK19fY3VyKQorCQlzdGQ6Ol9Db25zdHJ1Y3Qoc3RkOjpfX2FkZHJlc3NvZigqX19jdXIpKTsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBzdGQ6Ol9EZXN0cm95KF9fZmlyc3QsIF9fY3VyKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX191bmluaXRpYWxpemVkX2RlZmF1bHRfMTx0cnVlPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHN0YXRpYyB2b2lkCisgICAgICAgIF9fdW5pbml0X2RlZmF1bHQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwkgICAgX1ZhbHVlVHlwZTsKKworCSAgc3RkOjpmaWxsKF9fZmlyc3QsIF9fbGFzdCwgX1ZhbHVlVHlwZSgpKTsKKwl9CisgICAgfTsKKworICB0ZW1wbGF0ZTxib29sIF9Ucml2aWFsVmFsdWVUeXBlPgorICAgIHN0cnVjdCBfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9uXzEKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZT4KKyAgICAgICAgc3RhdGljIHZvaWQKKyAgICAgICAgX191bmluaXRfZGVmYXVsdF9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19uKQorICAgICAgICB7CisJICBfRm9yd2FyZEl0ZXJhdG9yIF9fY3VyID0gX19maXJzdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBmb3IgKDsgX19uID4gMDsgLS1fX24sICsrX19jdXIpCisJCXN0ZDo6X0NvbnN0cnVjdChzdGQ6Ol9fYWRkcmVzc29mKCpfX2N1cikpOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIHN0ZDo6X0Rlc3Ryb3koX19maXJzdCwgX19jdXIpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9uXzE8dHJ1ZT4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZT4KKyAgICAgICAgc3RhdGljIHZvaWQKKyAgICAgICAgX191bmluaXRfZGVmYXVsdF9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19uKQorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCSAgICBfVmFsdWVUeXBlOworCisJICBzdGQ6OmZpbGxfbihfX2ZpcnN0LCBfX24sIF9WYWx1ZVR5cGUoKSk7CisJfQorICAgIH07CisKKyAgLy8gX191bmluaXRpYWxpemVkX2RlZmF1bHQKKyAgLy8gRmlsbHMgW2ZpcnN0LCBsYXN0KSB3aXRoIHN0ZDo6ZGlzdGFuY2UoZmlyc3QsIGxhc3QpIGRlZmF1bHQKKyAgLy8gY29uc3RydWN0ZWQgdmFsdWVfdHlwZXMocykuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9kZWZhdWx0XzE8X19pc190cml2aWFsKF9WYWx1ZVR5cGUpPjo6CisJX191bmluaXRfZGVmYXVsdChfX2ZpcnN0LCBfX2xhc3QpOworICAgIH0KKworICAvLyBfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9uCisgIC8vIEZpbGxzIFtmaXJzdCwgZmlyc3QgKyBuKSB3aXRoIG4gZGVmYXVsdCBjb25zdHJ1Y3RlZCB2YWx1ZV90eXBlKHMpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdW5pbml0aWFsaXplZF9kZWZhdWx0X24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24pCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9kZWZhdWx0X25fMTxfX2lzX3RyaXZpYWwoX1ZhbHVlVHlwZSk+OjoKKwlfX3VuaW5pdF9kZWZhdWx0X24oX19maXJzdCwgX19uKTsKKyAgICB9CisKKworICAvLyBfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9hCisgIC8vIEZpbGxzIFtmaXJzdCwgbGFzdCkgd2l0aCBzdGQ6OmRpc3RhbmNlKGZpcnN0LCBsYXN0KSBkZWZhdWx0CisgIC8vIGNvbnN0cnVjdGVkIHZhbHVlX3R5cGVzKHMpLCBjb25zdHJ1Y3RlZCB3aXRoIHRoZSBhbGxvY2F0b3IgYWxsb2MuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgdm9pZAorICAgIF9fdW5pbml0aWFsaXplZF9kZWZhdWx0X2EoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCQkgICAgICBfQWxsb2NhdG9yJiBfX2FsbG9jKQorICAgIHsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19jdXIgPSBfX2ZpcnN0OworICAgICAgX190cnkKKwl7CisJICB0eXBlZGVmIF9fZ251X2N4eDo6X19hbGxvY190cmFpdHM8X0FsbG9jYXRvcj4gX190cmFpdHM7CisJICBmb3IgKDsgX19jdXIgIT0gX19sYXN0OyArK19fY3VyKQorCSAgICBfX3RyYWl0czo6Y29uc3RydWN0KF9fYWxsb2MsIHN0ZDo6X19hZGRyZXNzb2YoKl9fY3VyKSk7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgc3RkOjpfRGVzdHJveShfX2ZpcnN0LCBfX2N1ciwgX19hbGxvYyk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdW5pbml0aWFsaXplZF9kZWZhdWx0X2EoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCQkgICAgICBhbGxvY2F0b3I8X1RwPiYpCisgICAgeyBzdGQ6Ol9fdW5pbml0aWFsaXplZF9kZWZhdWx0KF9fZmlyc3QsIF9fbGFzdCk7IH0KKworCisgIC8vIF9fdW5pbml0aWFsaXplZF9kZWZhdWx0X25fYQorICAvLyBGaWxscyBbZmlyc3QsIGZpcnN0ICsgbikgd2l0aCBuIGRlZmF1bHQgY29uc3RydWN0ZWQgdmFsdWVfdHlwZXMocyksCisgIC8vIGNvbnN0cnVjdGVkIHdpdGggdGhlIGFsbG9jYXRvciBhbGxvYy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgdm9pZAorICAgIF9fdW5pbml0aWFsaXplZF9kZWZhdWx0X25fYShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fbiwgCisJCQkJX0FsbG9jYXRvciYgX19hbGxvYykKKyAgICB7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fY3VyID0gX19maXJzdDsKKyAgICAgIF9fdHJ5CisJeworCSAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fYWxsb2NfdHJhaXRzPF9BbGxvY2F0b3I+IF9fdHJhaXRzOworCSAgZm9yICg7IF9fbiA+IDA7IC0tX19uLCArK19fY3VyKQorCSAgICBfX3RyYWl0czo6Y29uc3RydWN0KF9fYWxsb2MsIHN0ZDo6X19hZGRyZXNzb2YoKl9fY3VyKSk7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgc3RkOjpfRGVzdHJveShfX2ZpcnN0LCBfX2N1ciwgX19hbGxvYyk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9uX2EoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24sIAorCQkJCWFsbG9jYXRvcjxfVHA+JikKKyAgICB7IHN0ZDo6X191bmluaXRpYWxpemVkX2RlZmF1bHRfbihfX2ZpcnN0LCBfX24pOyB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsCisJICAgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgX191bmluaXRpYWxpemVkX2NvcHlfbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24sCisJCQkgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0LCBpbnB1dF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2N1ciA9IF9fcmVzdWx0OworICAgICAgX190cnkKKwl7CisJICBmb3IgKDsgX19uID4gMDsgLS1fX24sICsrX19maXJzdCwgKytfX2N1cikKKwkgICAgc3RkOjpfQ29uc3RydWN0KHN0ZDo6X19hZGRyZXNzb2YoKl9fY3VyKSwgKl9fZmlyc3QpOworCSAgcmV0dXJuIF9fY3VyOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIHN0ZDo6X0Rlc3Ryb3koX19yZXN1bHQsIF9fY3VyKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwKKwkgICB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIGlubGluZSBfRm9yd2FyZEl0ZXJhdG9yCisgICAgX191bmluaXRpYWxpemVkX2NvcHlfbihfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19uLAorCQkJICAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCwKKwkJCSAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsgcmV0dXJuIHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9fZmlyc3QgKyBfX24sIF9fcmVzdWx0KTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENvcGllcyB0aGUgcmFuZ2UgW2ZpcnN0LGZpcnN0K24pIGludG8gcmVzdWx0LgorICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19uICAgICAgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBjb3B5LgorICAgKiAgQHBhcmFtICBfX3Jlc3VsdCBBbiBvdXRwdXQgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICBfX3Jlc3VsdCArIF9fbgorICAgKgorICAgKiAgTGlrZSBjb3B5X24oKSwgYnV0IGRvZXMgbm90IHJlcXVpcmUgYW4gaW5pdGlhbGl6ZWQgb3V0cHV0IHJhbmdlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgaW5saW5lIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICB1bmluaXRpYWxpemVkX2NvcHlfbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24sCisJCQkgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7IHJldHVybiBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5X24oX19maXJzdCwgX19uLCBfX3Jlc3VsdCwKKwkJCQkJIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7IH0KKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfU1RMX1VOSU5JVElBTElaRURfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0bF92ZWN0b3IuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfdmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRkZTQ2MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdGxfdmVjdG9yLmgKQEAgLTAsMCArMSwxNDU4IEBACisvLyBWZWN0b3IgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzICBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfdmVjdG9yLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt2ZWN0b3J9CisgKi8KKworI2lmbmRlZiBfU1RMX1ZFQ1RPUl9ICisjZGVmaW5lIF9TVExfVkVDVE9SX0ggMQorCisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3JfYmFzZV9mdW5jcy5oPgorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNpbmNsdWRlIDxiaXRzL2NvbmNlcHRfY2hlY2suaD4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKKworICAvLy8gU2VlIGJpdHMvc3RsX2RlcXVlLmgncyBfRGVxdWVfYmFzZSBmb3IgYW4gZXhwbGFuYXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBfVmVjdG9yX2Jhc2UKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19hbGxvY190cmFpdHM8X0FsbG9jPjo6dGVtcGxhdGUKKyAgICAgICAgcmViaW5kPF9UcD46Om90aGVyIF9UcF9hbGxvY190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fYWxsb2NfdHJhaXRzPF9UcF9hbGxvY190eXBlPjo6cG9pbnRlcgorICAgICAgIAlwb2ludGVyOworCisgICAgICBzdHJ1Y3QgX1ZlY3Rvcl9pbXBsIAorICAgICAgOiBwdWJsaWMgX1RwX2FsbG9jX3R5cGUKKyAgICAgIHsKKwlwb2ludGVyIF9NX3N0YXJ0OworCXBvaW50ZXIgX01fZmluaXNoOworCXBvaW50ZXIgX01fZW5kX29mX3N0b3JhZ2U7CisKKwlfVmVjdG9yX2ltcGwoKQorCTogX1RwX2FsbG9jX3R5cGUoKSwgX01fc3RhcnQoMCksIF9NX2ZpbmlzaCgwKSwgX01fZW5kX29mX3N0b3JhZ2UoMCkKKwl7IH0KKworCV9WZWN0b3JfaW1wbChfVHBfYWxsb2NfdHlwZSBjb25zdCYgX19hKQorCTogX1RwX2FsbG9jX3R5cGUoX19hKSwgX01fc3RhcnQoMCksIF9NX2ZpbmlzaCgwKSwgX01fZW5kX29mX3N0b3JhZ2UoMCkKKwl7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKwlfVmVjdG9yX2ltcGwoX1RwX2FsbG9jX3R5cGUmJiBfX2EpCisJOiBfVHBfYWxsb2NfdHlwZShzdGQ6Om1vdmUoX19hKSksCisJICBfTV9zdGFydCgwKSwgX01fZmluaXNoKDApLCBfTV9lbmRfb2Zfc3RvcmFnZSgwKQorCXsgfQorI2VuZGlmCisKKwl2b2lkIF9NX3N3YXBfZGF0YShfVmVjdG9yX2ltcGwmIF9feCkKKwl7CisJICBzdGQ6OnN3YXAoX01fc3RhcnQsIF9feC5fTV9zdGFydCk7CisJICBzdGQ6OnN3YXAoX01fZmluaXNoLCBfX3guX01fZmluaXNoKTsKKwkgIHN0ZDo6c3dhcChfTV9lbmRfb2Zfc3RvcmFnZSwgX194Ll9NX2VuZF9vZl9zdG9yYWdlKTsKKwl9CisgICAgICB9OworICAgICAgCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQWxsb2MgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIF9UcF9hbGxvY190eXBlJgorICAgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8X1RwX2FsbG9jX3R5cGUqPigmdGhpcy0+X01faW1wbCk7IH0KKworICAgICAgY29uc3QgX1RwX2FsbG9jX3R5cGUmCisgICAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBfVHBfYWxsb2NfdHlwZSo+KCZ0aGlzLT5fTV9pbXBsKTsgfQorCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBhbGxvY2F0b3JfdHlwZShfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOyB9CisKKyAgICAgIF9WZWN0b3JfYmFzZSgpCisgICAgICA6IF9NX2ltcGwoKSB7IH0KKworICAgICAgX1ZlY3Rvcl9iYXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICA6IF9NX2ltcGwoX19hKSB7IH0KKworICAgICAgX1ZlY3Rvcl9iYXNlKHNpemVfdCBfX24pCisgICAgICA6IF9NX2ltcGwoKQorICAgICAgeyBfTV9jcmVhdGVfc3RvcmFnZShfX24pOyB9CisKKyAgICAgIF9WZWN0b3JfYmFzZShzaXplX3QgX19uLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfTV9pbXBsKF9fYSkKKyAgICAgIHsgX01fY3JlYXRlX3N0b3JhZ2UoX19uKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgX1ZlY3Rvcl9iYXNlKF9UcF9hbGxvY190eXBlJiYgX19hKQorICAgICAgOiBfTV9pbXBsKHN0ZDo6bW92ZShfX2EpKSB7IH0KKworICAgICAgX1ZlY3Rvcl9iYXNlKF9WZWN0b3JfYmFzZSYmIF9feCkKKyAgICAgIDogX01faW1wbChzdGQ6Om1vdmUoX194Ll9NX2dldF9UcF9hbGxvY2F0b3IoKSkpCisgICAgICB7IHRoaXMtPl9NX2ltcGwuX01fc3dhcF9kYXRhKF9feC5fTV9pbXBsKTsgfQorCisgICAgICBfVmVjdG9yX2Jhc2UoX1ZlY3Rvcl9iYXNlJiYgX194LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfTV9pbXBsKF9fYSkKKyAgICAgIHsKKwlpZiAoX194LmdldF9hbGxvY2F0b3IoKSA9PSBfX2EpCisJICB0aGlzLT5fTV9pbXBsLl9NX3N3YXBfZGF0YShfX3guX01faW1wbCk7CisJZWxzZQorCSAgeworCSAgICBzaXplX3QgX19uID0gX194Ll9NX2ltcGwuX01fZmluaXNoIC0gX194Ll9NX2ltcGwuX01fc3RhcnQ7CisJICAgIF9NX2NyZWF0ZV9zdG9yYWdlKF9fbik7CisJICB9CisgICAgICB9CisjZW5kaWYKKworICAgICAgfl9WZWN0b3JfYmFzZSgpCisgICAgICB7IF9NX2RlYWxsb2NhdGUodGhpcy0+X01faW1wbC5fTV9zdGFydCwgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZQorCQkgICAgICAtIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOyB9CisKKyAgICBwdWJsaWM6CisgICAgICBfVmVjdG9yX2ltcGwgX01faW1wbDsKKworICAgICAgcG9pbnRlcgorICAgICAgX01fYWxsb2NhdGUoc2l6ZV90IF9fbikKKyAgICAgIHsgcmV0dXJuIF9fbiAhPSAwID8gX01faW1wbC5hbGxvY2F0ZShfX24pIDogMDsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kZWFsbG9jYXRlKHBvaW50ZXIgX19wLCBzaXplX3QgX19uKQorICAgICAgeworCWlmIChfX3ApCisJICBfTV9pbXBsLmRlYWxsb2NhdGUoX19wLCBfX24pOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2NyZWF0ZV9zdG9yYWdlKHNpemVfdCBfX24pCisgICAgICB7CisJdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IHRoaXMtPl9NX2FsbG9jYXRlKF9fbik7CisJdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0OworCXRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgX19uOworICAgICAgfQorICAgIH07CisKKworICAvKioKKyAgICogIEBicmllZiBBIHN0YW5kYXJkIGNvbnRhaW5lciB3aGljaCBvZmZlcnMgZml4ZWQgdGltZSBhY2Nlc3MgdG8KKyAgICogIGluZGl2aWR1YWwgZWxlbWVudHMgaW4gYW55IG9yZGVyLgorICAgKgorICAgKiAgQGluZ3JvdXAgc2VxdWVuY2VzCisgICAqCisgICAqICBAdHBhcmFtIF9UcCAgVHlwZSBvZiBlbGVtZW50LgorICAgKiAgQHRwYXJhbSBfQWxsb2MgIEFsbG9jYXRvciB0eXBlLCBkZWZhdWx0cyB0byBhbGxvY2F0b3I8X1RwPi4KKyAgICoKKyAgICogIE1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgYSA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPiwgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjYiPnJldmVyc2libGUgY29udGFpbmVyPC9hPiwgYW5kIGEKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY3Ij5zZXF1ZW5jZTwvYT4sIGluY2x1ZGluZyB0aGUKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY4Ij5vcHRpb25hbCBzZXF1ZW5jZSByZXF1aXJlbWVudHM8L2E+IHdpdGggdGhlCisgICAqICAlZXhjZXB0aW9uIG9mIEBjIHB1c2hfZnJvbnQgYW5kIEBjIHBvcF9mcm9udC4KKyAgICoKKyAgICogIEluIHNvbWUgdGVybWlub2xvZ3kgYSAldmVjdG9yIGNhbiBiZSBkZXNjcmliZWQgYXMgYSBkeW5hbWljCisgICAqICBDLXN0eWxlIGFycmF5LCBpdCBvZmZlcnMgZmFzdCBhbmQgZWZmaWNpZW50IGFjY2VzcyB0byBpbmRpdmlkdWFsCisgICAqICBlbGVtZW50cyBpbiBhbnkgb3JkZXIgYW5kIHNhdmVzIHRoZSB1c2VyIGZyb20gd29ycnlpbmcgYWJvdXQKKyAgICogIG1lbW9yeSBhbmQgc2l6ZSBhbGxvY2F0aW9uLiAgU3Vic2NyaXB0aW5nICggQGMgW10gKSBhY2Nlc3MgaXMKKyAgICogIGFsc28gcHJvdmlkZWQgYXMgd2l0aCBDLXN0eWxlIGFycmF5cy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyB2ZWN0b3IgOiBwcm90ZWN0ZWQgX1ZlY3Rvcl9iYXNlPF9UcCwgX0FsbG9jPgorICAgIHsKKyAgICAgIC8vIENvbmNlcHQgcmVxdWlyZW1lbnRzLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnZhbHVlX3R5cGUgICAgICAgICAgICAgICAgX0FsbG9jX3ZhbHVlX3R5cGU7CisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1RwLCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMyKF9UcCwgX0FsbG9jX3ZhbHVlX3R5cGUsIF9TYW1lVHlwZUNvbmNlcHQpCisgICAgICAKKyAgICAgIHR5cGVkZWYgX1ZlY3Rvcl9iYXNlPF9UcCwgX0FsbG9jPgkJCSBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Ol9UcF9hbGxvY190eXBlCQkgX1RwX2FsbG9jX3R5cGU7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6X19hbGxvY190cmFpdHM8X1RwX2FsbG9jX3R5cGU+ICBfQWxsb2NfdHJhaXRzOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHAJCQkJCSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czo6Y29uc3RfcG9pbnRlciAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM6OnJlZmVyZW5jZSAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM6OmNvbnN0X3JlZmVyZW5jZSAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6X19ub3JtYWxfaXRlcmF0b3I8cG9pbnRlciwgdmVjdG9yPiBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX25vcm1hbF9pdGVyYXRvcjxjb25zdF9wb2ludGVyLCB2ZWN0b3I+CisgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPgkJIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHNpemVfdAkJCQkJIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90CQkJCQkgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfQWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAJCSBhbGxvY2F0b3JfdHlwZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9hbGxvY2F0ZTsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9kZWFsbG9jYXRlOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2ltcGw7CisgICAgICB1c2luZyBfQmFzZTo6X01fZ2V0X1RwX2FsbG9jYXRvcjsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIFsyMy4yLjQuMV0gY29uc3RydWN0L2NvcHkvZGVzdHJveQorICAgICAgLy8gKGFzc2lnbigpIGFuZCBnZXRfYWxsb2NhdG9yKCkgYXJlIGFsc28gbGlzdGVkIGluIHRoaXMgc2VjdGlvbikKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIG5vIGVsZW1lbnRzLgorICAgICAgICovCisgICAgICB2ZWN0b3IoKQorICAgICAgOiBfQmFzZSgpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENyZWF0ZXMgYSAldmVjdG9yIHdpdGggbm8gZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICB2ZWN0b3IoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogX0Jhc2UoX19hKSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICV2ZWN0b3Igd2l0aCBkZWZhdWx0IGNvbnN0cnVjdGVkIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19uICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGluaXRpYWxseSBjcmVhdGUuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBjb25zdHJ1Y3RvciBmaWxscyB0aGUgJXZlY3RvciB3aXRoIEBhIF9fbiBkZWZhdWx0CisgICAgICAgKiAgY29uc3RydWN0ZWQgZWxlbWVudHMuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICB2ZWN0b3Ioc2l6ZV90eXBlIF9fbiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX19hKQorICAgICAgeyBfTV9kZWZhdWx0X2luaXRpYWxpemUoX19uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENyZWF0ZXMgYSAldmVjdG9yIHdpdGggY29waWVzIG9mIGFuIGV4ZW1wbGFyIGVsZW1lbnQuCisgICAgICAgKiAgQHBhcmFtICBfX24gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gaW5pdGlhbGx5IGNyZWF0ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fdmFsdWUgIEFuIGVsZW1lbnQgdG8gY29weS4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGZpbGxzIHRoZSAldmVjdG9yIHdpdGggQGEgX19uIGNvcGllcyBvZiBAYSBfX3ZhbHVlLgorICAgICAgICovCisgICAgICB2ZWN0b3Ioc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWx1ZSwKKwkgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9fYSkKKyAgICAgIHsgX01fZmlsbF9pbml0aWFsaXplKF9fbiwgX192YWx1ZSk7IH0KKyNlbHNlCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENyZWF0ZXMgYSAldmVjdG9yIHdpdGggY29waWVzIG9mIGFuIGV4ZW1wbGFyIGVsZW1lbnQuCisgICAgICAgKiAgQHBhcmFtICBfX24gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gaW5pdGlhbGx5IGNyZWF0ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fdmFsdWUgIEFuIGVsZW1lbnQgdG8gY29weS4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGZpbGxzIHRoZSAldmVjdG9yIHdpdGggQGEgX19uIGNvcGllcyBvZiBAYSBfX3ZhbHVlLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgdmVjdG9yKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsdWUgPSB2YWx1ZV90eXBlKCksCisJICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2EpCisgICAgICB7IF9NX2ZpbGxfaW5pdGlhbGl6ZShfX24sIF9fdmFsdWUpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlVmVjdG9yIGNvcHkgY29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEEgJXZlY3RvciBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY3JlYXRlZCAldmVjdG9yIHVzZXMgYSBjb3B5IG9mIHRoZSBhbGxvY2F0aW9uCisgICAgICAgKiAgb2JqZWN0IHVzZWQgYnkgQGEgX194LiAgQWxsIHRoZSBlbGVtZW50cyBvZiBAYSBfX3ggYXJlIGNvcGllZCwKKyAgICAgICAqICBidXQgYW55IGV4dHJhIG1lbW9yeSBpbgorICAgICAgICogIEBhIF9feCAoZm9yIGZhc3QgZXhwYW5zaW9uKSB3aWxsIG5vdCBiZSBjb3BpZWQuCisgICAgICAgKi8KKyAgICAgIHZlY3Rvcihjb25zdCB2ZWN0b3ImIF9feCkKKyAgICAgIDogX0Jhc2UoX194LnNpemUoKSwKKyAgICAgICAgX0FsbG9jX3RyYWl0czo6X1Nfc2VsZWN0X29uX2NvcHkoX194Ll9NX2dldF9UcF9hbGxvY2F0b3IoKSkpCisgICAgICB7IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0KKwkgIHN0ZDo6X191bmluaXRpYWxpemVkX2NvcHlfYShfX3guYmVnaW4oKSwgX194LmVuZCgpLAorCQkJCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsCisJCQkJICAgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJVZlY3RvciBtb3ZlIGNvbnN0cnVjdG9yLgorICAgICAgICogIEBwYXJhbSAgX194ICBBICV2ZWN0b3Igb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJXZlY3RvciBjb250YWlucyB0aGUgZXhhY3QgY29udGVudHMgb2YgQGEgX194LgorICAgICAgICogIFRoZSBjb250ZW50cyBvZiBAYSBfX3ggYXJlIGEgdmFsaWQsIGJ1dCB1bnNwZWNpZmllZCAldmVjdG9yLgorICAgICAgICovCisgICAgICB2ZWN0b3IodmVjdG9yJiYgX194KSBub2V4Y2VwdAorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSkgeyB9CisKKyAgICAgIC8vLyBDb3B5IGNvbnN0cnVjdG9yIHdpdGggYWx0ZXJuYXRpdmUgYWxsb2NhdG9yCisgICAgICB2ZWN0b3IoY29uc3QgdmVjdG9yJiBfX3gsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICA6IF9CYXNlKF9feC5zaXplKCksIF9fYSkKKyAgICAgIHsgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPQorCSAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfY29weV9hKF9feC5iZWdpbigpLCBfX3guZW5kKCksCisJCQkJICAgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCQkgICAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworICAgICAgfQorCisgICAgICAvLy8gTW92ZSBjb25zdHJ1Y3RvciB3aXRoIGFsdGVybmF0aXZlIGFsbG9jYXRvcgorICAgICAgdmVjdG9yKHZlY3RvciYmIF9fcnYsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX20pCisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3J2KSwgX19tKQorICAgICAgeworCWlmIChfX3J2LmdldF9hbGxvY2F0b3IoKSAhPSBfX20pCisJICB7CisJICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0KKwkgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2EoX19ydi5iZWdpbigpLCBfX3J2LmVuZCgpLAorCQkJCQkgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsCisJCQkJCSAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkgICAgX19ydi5jbGVhcigpOworCSAgfQorICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICV2ZWN0b3IgZnJvbSBhbiBpbml0aWFsaXplciBsaXN0LgorICAgICAgICogIEBwYXJhbSAgX19sICBBbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3IuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICV2ZWN0b3IgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQorICAgICAgICogIGluaXRpYWxpemVyX2xpc3QgQGEgX19sLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIHdpbGwgY2FsbCB0aGUgZWxlbWVudCB0eXBlJ3MgY29weSBjb25zdHJ1Y3RvciBOIHRpbWVzCisgICAgICAgKiAgKHdoZXJlIE4gaXMgQGEgX19sLnNpemUoKSkgYW5kIGRvIG5vIG1lbW9yeSByZWFsbG9jYXRpb24uCisgICAgICAgKi8KKyAgICAgIHZlY3Rvcihpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2EpCisgICAgICB7CisJX01fcmFuZ2VfaW5pdGlhbGl6ZShfX2wuYmVnaW4oKSwgX19sLmVuZCgpLAorCQkJICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCkpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGEgJXZlY3RvciBmcm9tIGEgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvci4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGEgJXZlY3RvciBjb25zaXN0aW5nIG9mIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgZnJvbQorICAgICAgICogIFtmaXJzdCxsYXN0KS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgdGhlIGl0ZXJhdG9ycyBhcmUgZm9yd2FyZCwgYmlkaXJlY3Rpb25hbCwgb3IKKyAgICAgICAqICByYW5kb20tYWNjZXNzLCB0aGVuIHRoaXMgd2lsbCBjYWxsIHRoZSBlbGVtZW50cycgY29weQorICAgICAgICogIGNvbnN0cnVjdG9yIE4gdGltZXMgKHdoZXJlIE4gaXMgZGlzdGFuY2UoZmlyc3QsbGFzdCkpIGFuZCBkbworICAgICAgICogIG5vIG1lbW9yeSByZWFsbG9jYXRpb24uICBCdXQgaWYgb25seSBpbnB1dCBpdGVyYXRvcnMgYXJlCisgICAgICAgKiAgdXNlZCwgdGhlbiB0aGlzIHdpbGwgZG8gYXQgbW9zdCAyTiBjYWxscyB0byB0aGUgY29weQorICAgICAgICogIGNvbnN0cnVjdG9yLCBhbmQgbG9nTiBtZW1vcnkgcmVhbGxvY2F0aW9ucy4KKyAgICAgICAqLworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorICAgICAgICB2ZWN0b3IoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9CYXNlKF9fYSkKKyAgICAgICAgeyBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX19mYWxzZV90eXBlKCkpOyB9CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZlY3RvcihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19hKQorICAgICAgICB7CisJICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+OjpfX3R5cGUgX0ludGVncmFsOworCSAgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKwl9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgVGhlIGR0b3Igb25seSBlcmFzZXMgdGhlIGVsZW1lbnRzLCBhbmQgbm90ZSB0aGF0IGlmIHRoZQorICAgICAgICogIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMKKyAgICAgICAqICBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncworICAgICAgICogIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB+dmVjdG9yKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgc3RkOjpfRGVzdHJveSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJICAgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVWZWN0b3IgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSAldmVjdG9yIG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIEFsbCB0aGUgZWxlbWVudHMgb2YgQGEgX194IGFyZSBjb3BpZWQsIGJ1dCBhbnkgZXh0cmEgbWVtb3J5IGluCisgICAgICAgKiAgQGEgX194IChmb3IgZmFzdCBleHBhbnNpb24pIHdpbGwgbm90IGJlIGNvcGllZC4gIFVubGlrZSB0aGUKKyAgICAgICAqICBjb3B5IGNvbnN0cnVjdG9yLCB0aGUgYWxsb2NhdG9yIG9iamVjdCBpcyBub3QgY29waWVkLgorICAgICAgICovCisgICAgICB2ZWN0b3ImCisgICAgICBvcGVyYXRvcj0oY29uc3QgdmVjdG9yJiBfX3gpOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlVmVjdG9yIG1vdmUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQSAldmVjdG9yIG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBjb250ZW50cyBvZiBAYSBfX3ggYXJlIG1vdmVkIGludG8gdGhpcyAldmVjdG9yICh3aXRob3V0IGNvcHlpbmcsCisgICAgICAgKiAgaWYgdGhlIGFsbG9jYXRvcnMgcGVybWl0IGl0KS4KKyAgICAgICAqICBAYSBfX3ggaXMgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkICV2ZWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZlY3RvciYKKyAgICAgIG9wZXJhdG9yPSh2ZWN0b3ImJiBfX3gpIG5vZXhjZXB0KF9BbGxvY190cmFpdHM6Ol9TX25vdGhyb3dfbW92ZSgpKQorICAgICAgeworICAgICAgICBjb25zdGV4cHIgYm9vbCBfX21vdmVfc3RvcmFnZSA9CisgICAgICAgICAgX0FsbG9jX3RyYWl0czo6X1NfcHJvcGFnYXRlX29uX21vdmVfYXNzaWduKCkKKyAgICAgICAgICB8fCBfQWxsb2NfdHJhaXRzOjpfU19hbHdheXNfZXF1YWwoKTsKKyAgICAgICAgX01fbW92ZV9hc3NpZ24oc3RkOjptb3ZlKF9feCksCisgICAgICAgICAgICAgICAgICAgICAgIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9fbW92ZV9zdG9yYWdlPigpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJVZlY3RvciBsaXN0IGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSAldmVjdG9yIHdpdGggY29waWVzIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUKKyAgICAgICAqICBpbml0aWFsaXplciBsaXN0IEBhIF9fbC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBhc3NpZ25tZW50IGNvbXBsZXRlbHkgY2hhbmdlcyB0aGUgJXZlY3RvciBhbmQKKyAgICAgICAqICB0aGF0IHRoZSByZXN1bHRpbmcgJXZlY3RvcidzIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWJlcgorICAgICAgICogIG9mIGVsZW1lbnRzIGFzc2lnbmVkLiAgT2xkIGRhdGEgbWF5IGJlIGxvc3QuCisgICAgICAgKi8KKyAgICAgIHZlY3RvciYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5hc3NpZ24oX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWducyBhIGdpdmVuIHZhbHVlIHRvIGEgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIGJlIGFzc2lnbmVkLgorICAgICAgICogIEBwYXJhbSAgX192YWwgIFZhbHVlIHRvIGJlIGFzc2lnbmVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGEgJXZlY3RvciB3aXRoIEBhIF9fbiBjb3BpZXMgb2YgdGhlIGdpdmVuCisgICAgICAgKiAgdmFsdWUuICBOb3RlIHRoYXQgdGhlIGFzc2lnbm1lbnQgY29tcGxldGVseSBjaGFuZ2VzIHRoZQorICAgICAgICogICV2ZWN0b3IgYW5kIHRoYXQgdGhlIHJlc3VsdGluZyAldmVjdG9yJ3Mgc2l6ZSBpcyB0aGUgc2FtZSBhcworICAgICAgICogIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgYXNzaWduZWQuICBPbGQgZGF0YSBtYXkgYmUgbG9zdC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsKQorICAgICAgeyBfTV9maWxsX2Fzc2lnbihfX24sIF9fdmFsKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbnMgYSByYW5nZSB0byBhICV2ZWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGEgJXZlY3RvciB3aXRoIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlCisgICAgICAgKiAgcmFuZ2UgW19fZmlyc3QsX19sYXN0KS4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBhc3NpZ25tZW50IGNvbXBsZXRlbHkgY2hhbmdlcyB0aGUgJXZlY3RvciBhbmQKKyAgICAgICAqICB0aGF0IHRoZSByZXN1bHRpbmcgJXZlY3RvcidzIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWJlcgorICAgICAgICogIG9mIGVsZW1lbnRzIGFzc2lnbmVkLiAgT2xkIGRhdGEgbWF5IGJlIGxvc3QuCisgICAgICAgKi8KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyAgICAgICAgdm9pZAorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7IF9NX2Fzc2lnbl9kaXNwYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9fZmFsc2VfdHlwZSgpKTsgfQorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJICBfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisJfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbnMgYW4gaW5pdGlhbGl6ZXIgbGlzdCB0byBhICV2ZWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSAldmVjdG9yIHdpdGggY29waWVzIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUKKyAgICAgICAqICBpbml0aWFsaXplciBsaXN0IEBhIF9fbC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBhc3NpZ25tZW50IGNvbXBsZXRlbHkgY2hhbmdlcyB0aGUgJXZlY3RvciBhbmQKKyAgICAgICAqICB0aGF0IHRoZSByZXN1bHRpbmcgJXZlY3RvcidzIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWJlcgorICAgICAgICogIG9mIGVsZW1lbnRzIGFzc2lnbmVkLiAgT2xkIGRhdGEgbWF5IGJlIGxvc3QuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGFzc2lnbihpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgdGhpcy0+YXNzaWduKF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYKKworICAgICAgLy8vIEdldCBhIGNvcHkgb2YgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIG9iamVjdC4KKyAgICAgIHVzaW5nIF9CYXNlOjpnZXRfYWxsb2NhdG9yOworCisgICAgICAvLyBpdGVyYXRvcnMKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICV2ZWN0b3IuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBpdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlCisgICAgICAgKiAgZmlyc3QgZWxlbWVudCBpbiB0aGUgJXZlY3Rvci4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIG9yZGluYXJ5CisgICAgICAgKiAgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJXZlY3Rvci4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIG9yZGluYXJ5CisgICAgICAgKiAgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBpdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0CisgICAgICAgKiAgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgJXZlY3Rvci4gIEl0ZXJhdGlvbiBpcyBkb25lIGluCisgICAgICAgKiAgb3JkaW5hcnkgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUKKyAgICAgICAqICBsYXN0IGVsZW1lbnQgaW4gdGhlICV2ZWN0b3IuICBJdGVyYXRpb24gaXMgZG9uZSBpbiByZXZlcnNlCisgICAgICAgKiAgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgdG8gdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgJXZlY3Rvci4gIEl0ZXJhdGlvbiBpcyBkb25lIGluCisgICAgICAgKiAgcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byBvbmUKKyAgICAgICAqICBiZWZvcmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlICV2ZWN0b3IuICBJdGVyYXRpb24gaXMgZG9uZQorICAgICAgICogIGluIHJldmVyc2UgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgdG8gb25lIGJlZm9yZSB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgJXZlY3Rvci4gIEl0ZXJhdGlvbgorICAgICAgICogIGlzIGRvbmUgaW4gcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUKKyAgICAgICAqICBmaXJzdCBlbGVtZW50IGluIHRoZSAldmVjdG9yLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdAorICAgICAgICogIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlICV2ZWN0b3IuICBJdGVyYXRpb24gaXMgZG9uZSBpbgorICAgICAgICogIG9yZGluYXJ5IGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cworICAgICAgICogIHRvIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlICV2ZWN0b3IuICBJdGVyYXRpb24gaXMgZG9uZSBpbgorICAgICAgICogIHJldmVyc2UgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cworICAgICAgICogIHRvIG9uZSBiZWZvcmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlICV2ZWN0b3IuICBJdGVyYXRpb24KKyAgICAgICAqICBpcyBkb25lIGluIHJldmVyc2UgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorI2VuZGlmCisKKyAgICAgIC8vIFsyMy4yLjQuMl0gY2FwYWNpdHkKKyAgICAgIC8qKiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSAldmVjdG9yLiAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzaXplX3R5cGUodGhpcy0+X01faW1wbC5fTV9maW5pc2ggLSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsgfQorCisgICAgICAvKiogIFJldHVybnMgdGhlIHNpemUoKSBvZiB0aGUgbGFyZ2VzdCBwb3NzaWJsZSAldmVjdG9yLiAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX0FsbG9jX3RyYWl0czo6bWF4X3NpemUoX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXNpemVzIHRoZSAldmVjdG9yIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19uZXdfc2l6ZSAgTnVtYmVyIG9mIGVsZW1lbnRzIHRoZSAldmVjdG9yIHNob3VsZCBjb250YWluLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgJXJlc2l6ZSB0aGUgJXZlY3RvciB0byB0aGUgc3BlY2lmaWVkCisgICAgICAgKiAgbnVtYmVyIG9mIGVsZW1lbnRzLiAgSWYgdGhlIG51bWJlciBpcyBzbWFsbGVyIHRoYW4gdGhlCisgICAgICAgKiAgJXZlY3RvcidzIGN1cnJlbnQgc2l6ZSB0aGUgJXZlY3RvciBpcyB0cnVuY2F0ZWQsIG90aGVyd2lzZQorICAgICAgICogIGRlZmF1bHQgY29uc3RydWN0ZWQgZWxlbWVudHMgYXJlIGFwcGVuZGVkLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUpCisgICAgICB7CisJaWYgKF9fbmV3X3NpemUgPiBzaXplKCkpCisJICBfTV9kZWZhdWx0X2FwcGVuZChfX25ld19zaXplIC0gc2l6ZSgpKTsKKwllbHNlIGlmIChfX25ld19zaXplIDwgc2l6ZSgpKQorCSAgX01fZXJhc2VfYXRfZW5kKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX25ld19zaXplKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXNpemVzIHRoZSAldmVjdG9yIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19uZXdfc2l6ZSAgTnVtYmVyIG9mIGVsZW1lbnRzIHRoZSAldmVjdG9yIHNob3VsZCBjb250YWluLgorICAgICAgICogIEBwYXJhbSAgX194ICBEYXRhIHdpdGggd2hpY2ggbmV3IGVsZW1lbnRzIHNob3VsZCBiZSBwb3B1bGF0ZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCAlcmVzaXplIHRoZSAldmVjdG9yIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgICAqICBudW1iZXIgb2YgZWxlbWVudHMuICBJZiB0aGUgbnVtYmVyIGlzIHNtYWxsZXIgdGhhbiB0aGUKKyAgICAgICAqICAldmVjdG9yJ3MgY3VycmVudCBzaXplIHRoZSAldmVjdG9yIGlzIHRydW5jYXRlZCwgb3RoZXJ3aXNlCisgICAgICAgKiAgdGhlICV2ZWN0b3IgaXMgZXh0ZW5kZWQgYW5kIG5ldyBlbGVtZW50cyBhcmUgcG9wdWxhdGVkIHdpdGgKKyAgICAgICAqICBnaXZlbiBkYXRhLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlpZiAoX19uZXdfc2l6ZSA+IHNpemUoKSkKKwkgIGluc2VydChlbmQoKSwgX19uZXdfc2l6ZSAtIHNpemUoKSwgX194KTsKKwllbHNlIGlmIChfX25ld19zaXplIDwgc2l6ZSgpKQorCSAgX01fZXJhc2VfYXRfZW5kKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX25ld19zaXplKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlc2l6ZXMgdGhlICV2ZWN0b3IgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX25ld19zaXplICBOdW1iZXIgb2YgZWxlbWVudHMgdGhlICV2ZWN0b3Igc2hvdWxkIGNvbnRhaW4uCisgICAgICAgKiAgQHBhcmFtICBfX3ggIERhdGEgd2l0aCB3aGljaCBuZXcgZWxlbWVudHMgc2hvdWxkIGJlIHBvcHVsYXRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsICVyZXNpemUgdGhlICV2ZWN0b3IgdG8gdGhlIHNwZWNpZmllZAorICAgICAgICogIG51bWJlciBvZiBlbGVtZW50cy4gIElmIHRoZSBudW1iZXIgaXMgc21hbGxlciB0aGFuIHRoZQorICAgICAgICogICV2ZWN0b3IncyBjdXJyZW50IHNpemUgdGhlICV2ZWN0b3IgaXMgdHJ1bmNhdGVkLCBvdGhlcndpc2UKKyAgICAgICAqICB0aGUgJXZlY3RvciBpcyBleHRlbmRlZCBhbmQgbmV3IGVsZW1lbnRzIGFyZSBwb3B1bGF0ZWQgd2l0aAorICAgICAgICogIGdpdmVuIGRhdGEuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgdmFsdWVfdHlwZSBfX3ggPSB2YWx1ZV90eXBlKCkpCisgICAgICB7CisJaWYgKF9fbmV3X3NpemUgPiBzaXplKCkpCisJICBpbnNlcnQoZW5kKCksIF9fbmV3X3NpemUgLSBzaXplKCksIF9feCk7CisJZWxzZSBpZiAoX19uZXdfc2l6ZSA8IHNpemUoKSkKKwkgIF9NX2VyYXNlX2F0X2VuZCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgX19uZXdfc2l6ZSk7CisgICAgICB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKiAgQSBub24tYmluZGluZyByZXF1ZXN0IHRvIHJlZHVjZSBjYXBhY2l0eSgpIHRvIHNpemUoKS4gICovCisgICAgICB2b2lkCisgICAgICBzaHJpbmtfdG9fZml0KCkKKyAgICAgIHsgX01fc2hyaW5rX3RvX2ZpdCgpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgdGhlICV2ZWN0b3IgY2FuCisgICAgICAgKiAgaG9sZCBiZWZvcmUgbmVlZGluZyB0byBhbGxvY2F0ZSBtb3JlIG1lbW9yeS4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBjYXBhY2l0eSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzaXplX3R5cGUodGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZQorCQkJIC0gdGhpcy0+X01faW1wbC5fTV9zdGFydCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSAldmVjdG9yIGlzIGVtcHR5LiAgKFRodXMgYmVnaW4oKSB3b3VsZAorICAgICAgICogIGVxdWFsIGVuZCgpLikKKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gYmVnaW4oKSA9PSBlbmQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEF0dGVtcHQgdG8gcHJlYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSBmb3Igc3BlY2lmaWVkIG51bWJlciBvZgorICAgICAgICogICAgICAgICAgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBlbGVtZW50cyByZXF1aXJlZC4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBAYSBuIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byByZXNlcnZlIGVub3VnaCBtZW1vcnkgZm9yIHRoZQorICAgICAgICogICV2ZWN0b3IgdG8gaG9sZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbGVtZW50cy4gIElmIHRoZQorICAgICAgICogIG51bWJlciByZXF1ZXN0ZWQgaXMgbW9yZSB0aGFuIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcworICAgICAgICogIHRocm93bi4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGFkdmFudGFnZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRoYXQgaWYgb3B0aW1hbCBjb2RlIGlzIGEKKyAgICAgICAqICBuZWNlc3NpdHkgYW5kIHRoZSB1c2VyIGNhbiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBlbGVtZW50cworICAgICAgICogIHRoYXQgd2lsbCBiZSByZXF1aXJlZCwgdGhlIHVzZXIgY2FuIHJlc2VydmUgdGhlIG1lbW9yeSBpbgorICAgICAgICogICVhZHZhbmNlLCBhbmQgdGh1cyBwcmV2ZW50IGEgcG9zc2libGUgcmVhbGxvY2F0aW9uIG9mIG1lbW9yeQorICAgICAgICogIGFuZCBjb3B5aW5nIG9mICV2ZWN0b3IgZGF0YS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXJ2ZShzaXplX3R5cGUgX19uKTsKKworICAgICAgLy8gZWxlbWVudCBhY2Nlc3MKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3Vic2NyaXB0IGFjY2VzcyB0byB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlICV2ZWN0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fbiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlCisgICAgICAgKiAgYWNjZXNzZWQuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC93cml0ZSByZWZlcmVuY2UgdG8gZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRvciBhbGxvd3MgZm9yIGVhc3ksIGFycmF5LXN0eWxlLCBkYXRhIGFjY2Vzcy4KKyAgICAgICAqICBOb3RlIHRoYXQgZGF0YSBhY2Nlc3Mgd2l0aCB0aGlzIG9wZXJhdG9yIGlzIHVuY2hlY2tlZCBhbmQKKyAgICAgICAqICBvdXRfb2ZfcmFuZ2UgbG9va3VwcyBhcmUgbm90IGRlZmluZWQuIChGb3IgY2hlY2tlZCBsb29rdXBzCisgICAgICAgKiAgc2VlIGF0KCkuKQorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuICoodGhpcy0+X01faW1wbC5fTV9zdGFydCArIF9fbik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdWJzY3JpcHQgYWNjZXNzIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gX19uIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUKKyAgICAgICAqICBhY2Nlc3NlZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRvciBhbGxvd3MgZm9yIGVhc3ksIGFycmF5LXN0eWxlLCBkYXRhIGFjY2Vzcy4KKyAgICAgICAqICBOb3RlIHRoYXQgZGF0YSBhY2Nlc3Mgd2l0aCB0aGlzIG9wZXJhdG9yIGlzIHVuY2hlY2tlZCBhbmQKKyAgICAgICAqICBvdXRfb2ZfcmFuZ2UgbG9va3VwcyBhcmUgbm90IGRlZmluZWQuIChGb3IgY2hlY2tlZCBsb29rdXBzCisgICAgICAgKiAgc2VlIGF0KCkuKQorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuICoodGhpcy0+X01faW1wbC5fTV9zdGFydCArIF9fbik7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vLyBTYWZldHkgY2hlY2sgdXNlZCBvbmx5IGZyb20gYXQoKS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX3JhbmdlX2NoZWNrKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7CisJaWYgKF9fbiA+PSB0aGlzLT5zaXplKCkpCisJICBfX3Rocm93X291dF9vZl9yYW5nZShfX04oInZlY3Rvcjo6X01fcmFuZ2VfY2hlY2siKSk7CisgICAgICB9CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlICV2ZWN0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fbiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlCisgICAgICAgKiAgYWNjZXNzZWQuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC93cml0ZSByZWZlcmVuY2UgdG8gZGF0YS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBfX24gaXMgYW4gaW52YWxpZCBpbmRleC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBmb3Igc2FmZXIgZGF0YSBhY2Nlc3MuICBUaGUgcGFyYW1ldGVyCisgICAgICAgKiAgaXMgZmlyc3QgY2hlY2tlZCB0aGF0IGl0IGlzIGluIHRoZSByYW5nZSBvZiB0aGUgdmVjdG9yLiAgVGhlCisgICAgICAgKiAgZnVuY3Rpb24gdGhyb3dzIG91dF9vZl9yYW5nZSBpZiB0aGUgY2hlY2sgZmFpbHMuCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgYXQoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlfTV9yYW5nZV9jaGVjayhfX24pOworCXJldHVybiAoKnRoaXMpW19fbl07IAorICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlICV2ZWN0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fbiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlCisgICAgICAgKiAgYWNjZXNzZWQuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC1vbmx5IChjb25zdGFudCkgcmVmZXJlbmNlIHRvIGRhdGEuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19uIGlzIGFuIGludmFsaWQgaW5kZXguCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgZm9yIHNhZmVyIGRhdGEgYWNjZXNzLiAgVGhlIHBhcmFtZXRlcgorICAgICAgICogIGlzIGZpcnN0IGNoZWNrZWQgdGhhdCBpdCBpcyBpbiB0aGUgcmFuZ2Ugb2YgdGhlIHZlY3Rvci4gIFRoZQorICAgICAgICogIGZ1bmN0aW9uIHRocm93cyBvdXRfb2ZfcmFuZ2UgaWYgdGhlIGNoZWNrIGZhaWxzLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7CisJX01fcmFuZ2VfY2hlY2soX19uKTsKKwlyZXR1cm4gKCp0aGlzKVtfX25dOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJXZlY3Rvci4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBmcm9udCgpCisgICAgICB7IHJldHVybiAqYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICV2ZWN0b3IuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgZnJvbnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gKmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJXZlY3Rvci4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBiYWNrKCkKKyAgICAgIHsgcmV0dXJuICooZW5kKCkgLSAxKTsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZQorICAgICAgICogIGxhc3QgZWxlbWVudCBvZiB0aGUgJXZlY3Rvci4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBiYWNrKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICooZW5kKCkgLSAxKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiA0NjQuIFN1Z2dlc3Rpb24gZm9yIG5ldyBtZW1iZXIgZnVuY3Rpb25zIGluIHN0YW5kYXJkIGNvbnRhaW5lcnMuCisgICAgICAvLyBkYXRhIGFjY2VzcworICAgICAgLyoqCisgICAgICAgKiAgIFJldHVybnMgYSBwb2ludGVyIHN1Y2ggdGhhdCBbZGF0YSgpLCBkYXRhKCkgKyBzaXplKCkpIGlzIGEgdmFsaWQKKyAgICAgICAqICAgcmFuZ2UuICBGb3IgYSBub24tZW1wdHkgJXZlY3RvciwgZGF0YSgpID09ICZmcm9udCgpLgorICAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgX1RwKgorI2Vsc2UKKyAgICAgIHBvaW50ZXIKKyNlbmRpZgorICAgICAgZGF0YSgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKGZyb250KCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBjb25zdCBfVHAqCisjZWxzZQorICAgICAgY29uc3RfcG9pbnRlcgorI2VuZGlmCisgICAgICBkYXRhKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoZnJvbnQoKSk7IH0KKworICAgICAgLy8gWzIzLjIuNC4zXSBtb2RpZmllcnMKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWRkIGRhdGEgdG8gdGhlIGVuZCBvZiB0aGUgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRGF0YSB0byBiZSBhZGRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIHR5cGljYWwgc3RhY2sgb3BlcmF0aW9uLiAgVGhlIGZ1bmN0aW9uIGNyZWF0ZXMgYW4KKyAgICAgICAqICBlbGVtZW50IGF0IHRoZSBlbmQgb2YgdGhlICV2ZWN0b3IgYW5kIGFzc2lnbnMgdGhlIGdpdmVuIGRhdGEKKyAgICAgICAqICB0byBpdC4gIER1ZSB0byB0aGUgbmF0dXJlIG9mIGEgJXZlY3RvciB0aGlzIG9wZXJhdGlvbiBjYW4gYmUKKyAgICAgICAqICBkb25lIGluIGNvbnN0YW50IHRpbWUgaWYgdGhlICV2ZWN0b3IgaGFzIHByZWFsbG9jYXRlZCBzcGFjZQorICAgICAgICogIGF2YWlsYWJsZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlpZiAodGhpcy0+X01faW1wbC5fTV9maW5pc2ggIT0gdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSkKKwkgIHsKKwkgICAgX0FsbG9jX3RyYWl0czo6Y29uc3RydWN0KHRoaXMtPl9NX2ltcGwsIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX194KTsKKwkgICAgKyt0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsKKwkgIH0KKwllbHNlCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCSAgX01fZW1wbGFjZV9iYWNrX2F1eChfX3gpOworI2Vsc2UKKwkgIF9NX2luc2VydF9hdXgoZW5kKCksIF9feCk7CisjZW5kaWYKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfYmFjayh2YWx1ZV90eXBlJiYgX194KQorICAgICAgeyBlbXBsYWNlX2JhY2soc3RkOjptb3ZlKF9feCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGVtcGxhY2VfYmFjayhfQXJncyYmLi4uIF9fYXJncyk7CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmVzIGxhc3QgZWxlbWVudC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIHR5cGljYWwgc3RhY2sgb3BlcmF0aW9uLiBJdCBzaHJpbmtzIHRoZSAldmVjdG9yIGJ5IG9uZS4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IG5vIGRhdGEgaXMgcmV0dXJuZWQsIGFuZCBpZiB0aGUgbGFzdCBlbGVtZW50J3MKKyAgICAgICAqICBkYXRhIGlzIG5lZWRlZCwgaXQgc2hvdWxkIGJlIHJldHJpZXZlZCBiZWZvcmUgcG9wX2JhY2soKSBpcworICAgICAgICogIGNhbGxlZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcG9wX2JhY2soKQorICAgICAgeworCS0tdGhpcy0+X01faW1wbC5fTV9maW5pc2g7CisJX0FsbG9jX3RyYWl0czo6ZGVzdHJveSh0aGlzLT5fTV9pbXBsLCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydHMgYW4gb2JqZWN0IGluICV2ZWN0b3IgYmVmb3JlIHNwZWNpZmllZCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIGludG8gdGhlICV2ZWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2FyZ3MgIEFyZ3VtZW50cy4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhbiBvYmplY3Qgb2YgdHlwZSBUIGNvbnN0cnVjdGVkCisgICAgICAgKiAgd2l0aCBUKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLikgYmVmb3JlIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMga2luZCBvZiBvcGVyYXRpb24gY291bGQgYmUgZXhwZW5zaXZlIGZvciBhICV2ZWN0b3IKKyAgICAgICAqICBhbmQgaWYgaXQgaXMgZnJlcXVlbnRseSB1c2VkIHRoZSB1c2VyIHNob3VsZCBjb25zaWRlciB1c2luZworICAgICAgICogIHN0ZDo6bGlzdC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGVtcGxhY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0FyZ3MmJi4uLiBfX2FyZ3MpOworI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyBnaXZlbiB2YWx1ZSBpbnRvICV2ZWN0b3IgYmVmb3JlIHNwZWNpZmllZCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIGludG8gdGhlICV2ZWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIERhdGEgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIGRhdGEuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgYSBjb3B5IG9mIHRoZSBnaXZlbiB2YWx1ZSBiZWZvcmUKKyAgICAgICAqICB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAgTm90ZSB0aGF0IHRoaXMga2luZCBvZiBvcGVyYXRpb24KKyAgICAgICAqICBjb3VsZCBiZSBleHBlbnNpdmUgZm9yIGEgJXZlY3RvciBhbmQgaWYgaXQgaXMgZnJlcXVlbnRseQorICAgICAgICogIHVzZWQgdGhlIHVzZXIgc2hvdWxkIGNvbnNpZGVyIHVzaW5nIHN0ZDo6bGlzdC4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGdpdmVuIHJ2YWx1ZSBpbnRvICV2ZWN0b3IgYmVmb3JlIHNwZWNpZmllZCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIGludG8gdGhlICV2ZWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIERhdGEgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIGRhdGEuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgYSBjb3B5IG9mIHRoZSBnaXZlbiBydmFsdWUgYmVmb3JlCisgICAgICAgKiAgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4gIE5vdGUgdGhhdCB0aGlzIGtpbmQgb2Ygb3BlcmF0aW9uCisgICAgICAgKiAgY291bGQgYmUgZXhwZW5zaXZlIGZvciBhICV2ZWN0b3IgYW5kIGlmIGl0IGlzIGZyZXF1ZW50bHkKKyAgICAgICAqICB1c2VkIHRoZSB1c2VyIHNob3VsZCBjb25zaWRlciB1c2luZyBzdGQ6Omxpc3QuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgdmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgcmV0dXJuIGVtcGxhY2UoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyBhbiBpbml0aWFsaXplcl9saXN0IGludG8gdGhlICV2ZWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBBbiBpdGVyYXRvciBpbnRvIHRoZSAldmVjdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sICBBbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGNvcGllcyBvZiB0aGUgZGF0YSBpbiB0aGUgCisgICAgICAgKiAgaW5pdGlhbGl6ZXJfbGlzdCBAYSBsIGludG8gdGhlICV2ZWN0b3IgYmVmb3JlIHRoZSBsb2NhdGlvbgorICAgICAgICogIHNwZWNpZmllZCBieSBAYSBwb3NpdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMga2luZCBvZiBvcGVyYXRpb24gY291bGQgYmUgZXhwZW5zaXZlIGZvciBhCisgICAgICAgKiAgJXZlY3RvciBhbmQgaWYgaXQgaXMgZnJlcXVlbnRseSB1c2VkIHRoZSB1c2VyIHNob3VsZAorICAgICAgICogIGNvbnNpZGVyIHVzaW5nIHN0ZDo6bGlzdC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyB0aGlzLT5pbnNlcnQoX19wb3NpdGlvbiwgX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydHMgYSBudW1iZXIgb2YgY29waWVzIG9mIGdpdmVuIGRhdGEgaW50byB0aGUgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIGludG8gdGhlICV2ZWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBlbGVtZW50cyB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRGF0YSB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhIHNwZWNpZmllZCBudW1iZXIgb2YgY29waWVzIG9mCisgICAgICAgKiAgdGhlIGdpdmVuIGRhdGEgYmVmb3JlIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgQGEgcG9zaXRpb24uCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGtpbmQgb2Ygb3BlcmF0aW9uIGNvdWxkIGJlIGV4cGVuc2l2ZSBmb3IgYQorICAgICAgICogICV2ZWN0b3IgYW5kIGlmIGl0IGlzIGZyZXF1ZW50bHkgdXNlZCB0aGUgdXNlciBzaG91bGQKKyAgICAgICAqICBjb25zaWRlciB1c2luZyBzdGQ6Omxpc3QuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IF9NX2ZpbGxfaW5zZXJ0KF9fcG9zaXRpb24sIF9fbiwgX194KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydHMgYSByYW5nZSBpbnRvIHRoZSAldmVjdG9yLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgaW50byB0aGUgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgY29waWVzIG9mIHRoZSBkYXRhIGluIHRoZSByYW5nZQorICAgICAgICogIFtfX2ZpcnN0LF9fbGFzdCkgaW50byB0aGUgJXZlY3RvciBiZWZvcmUgdGhlIGxvY2F0aW9uIHNwZWNpZmllZAorICAgICAgICogIGJ5IEBhIHBvcy4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMga2luZCBvZiBvcGVyYXRpb24gY291bGQgYmUgZXhwZW5zaXZlIGZvciBhCisgICAgICAgKiAgJXZlY3RvciBhbmQgaWYgaXQgaXMgZnJlcXVlbnRseSB1c2VkIHRoZSB1c2VyIHNob3VsZAorICAgICAgICogIGNvbnNpZGVyIHVzaW5nIHN0ZDo6bGlzdC4KKyAgICAgICAqLworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorCSAgICAgICBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsgX01faW5zZXJ0X2Rpc3BhdGNoKF9fcG9zaXRpb24sIF9fZmlyc3QsIF9fbGFzdCwgX19mYWxzZV90eXBlKCkpOyB9CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsCisJICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19pc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9yPjo6X190eXBlIF9JbnRlZ3JhbDsKKwkgIF9NX2luc2VydF9kaXNwYXRjaChfX3Bvc2l0aW9uLCBfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKwl9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmUgZWxlbWVudCBhdCBnaXZlbiBwb3NpdGlvbi4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEl0ZXJhdG9yIHBvaW50aW5nIHRvIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBuZXh0IGVsZW1lbnQgKG9yIGVuZCgpKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGVyYXNlIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBhbmQgdGh1cworICAgICAgICogIHNob3J0ZW4gdGhlICV2ZWN0b3IgYnkgb25lLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIFRoaXMgb3BlcmF0aW9uIGNvdWxkIGJlIGV4cGVuc2l2ZSBhbmQgaWYgaXQgaXMKKyAgICAgICAqICBmcmVxdWVudGx5IHVzZWQgdGhlIHVzZXIgc2hvdWxkIGNvbnNpZGVyIHVzaW5nIHN0ZDo6bGlzdC4KKyAgICAgICAqICBUaGUgdXNlciBpcyBhbHNvIGNhdXRpb25lZCB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMKKyAgICAgICAqICB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwKKyAgICAgICAqICB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nCisgICAgICAgKiAgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBhIHJhbmdlIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBJdGVyYXRvciBwb2ludGluZyB0byBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50IHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZWxlbWVudCBwb2ludGVkIHRvIGJ5IEBhIF9fbGFzdAorICAgICAgICogICAgICAgICAgIHByaW9yIHRvIGVyYXNpbmcgKG9yIGVuZCgpKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGVyYXNlIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UKKyAgICAgICAqICBbX19maXJzdCxfX2xhc3QpIGFuZCBzaG9ydGVuIHRoZSAldmVjdG9yIGFjY29yZGluZ2x5LgorICAgICAgICoKKyAgICAgICAqICBOb3RlIFRoaXMgb3BlcmF0aW9uIGNvdWxkIGJlIGV4cGVuc2l2ZSBhbmQgaWYgaXQgaXMKKyAgICAgICAqICBmcmVxdWVudGx5IHVzZWQgdGhlIHVzZXIgc2hvdWxkIGNvbnNpZGVyIHVzaW5nIHN0ZDo6bGlzdC4KKyAgICAgICAqICBUaGUgdXNlciBpcyBhbHNvIGNhdXRpb25lZCB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMKKyAgICAgICAqICB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZQorICAgICAgICogIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4KKyAgICAgICAqICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTd2FwcyBkYXRhIHdpdGggYW5vdGhlciAldmVjdG9yLgorICAgICAgICogIEBwYXJhbSAgX194ICBBICV2ZWN0b3Igb2YgdGhlIHNhbWUgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGV4Y2hhbmdlcyB0aGUgZWxlbWVudHMgYmV0d2VlbiB0d28gdmVjdG9ycyBpbiBjb25zdGFudCB0aW1lLgorICAgICAgICogIChUaHJlZSBwb2ludGVycywgc28gaXQgc2hvdWxkIGJlIHF1aXRlIGZhc3QuKQorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZ2xvYmFsIHN0ZDo6c3dhcCgpIGZ1bmN0aW9uIGlzIHNwZWNpYWxpemVkIHN1Y2ggdGhhdAorICAgICAgICogIHN0ZDo6c3dhcCh2MSx2Mikgd2lsbCBmZWVkIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodmVjdG9yJiBfX3gpCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCQkJbm9leGNlcHQoX0FsbG9jX3RyYWl0czo6X1Nfbm90aHJvd19zd2FwKCkpCisjZW5kaWYKKyAgICAgIHsKKwl0aGlzLT5fTV9pbXBsLl9NX3N3YXBfZGF0YShfX3guX01faW1wbCk7CisJX0FsbG9jX3RyYWl0czo6X1Nfb25fc3dhcChfTV9nZXRfVHBfYWxsb2NhdG9yKCksCisJICAgICAgICAgICAgICAgICAgICAgICAgICBfX3guX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgRXJhc2VzIGFsbCB0aGUgZWxlbWVudHMuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUKKyAgICAgICAqICBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUKKyAgICAgICAqICBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMKKyAgICAgICAqICB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9NX2VyYXNlX2F0X2VuZCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgLyoqCisgICAgICAgKiAgTWVtb3J5IGV4cGFuc2lvbiBoYW5kbGVyLiAgVXNlcyB0aGUgbWVtYmVyIGFsbG9jYXRpb24gZnVuY3Rpb24gdG8KKyAgICAgICAqICBvYnRhaW4gQGEgbiBieXRlcyBvZiBtZW1vcnksIGFuZCB0aGVuIGNvcGllcyBbZmlyc3QsbGFzdCkgaW50byBpdC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgcG9pbnRlcgorICAgICAgICBfTV9hbGxvY2F0ZV9hbmRfY29weShzaXplX3R5cGUgX19uLAorCQkJICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICBwb2ludGVyIF9fcmVzdWx0ID0gdGhpcy0+X01fYWxsb2NhdGUoX19uKTsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5X2EoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwKKwkJCQkJICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICAgIHJldHVybiBfX3Jlc3VsdDsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBfTV9kZWFsbG9jYXRlKF9fcmVzdWx0LCBfX24pOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJfQorCisKKyAgICAgIC8vIEludGVybmFsIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyBmb2xsb3cuCisKKyAgICAgIC8vIENhbGxlZCBieSB0aGUgcmFuZ2UgY29uc3RydWN0b3IgdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDM4LiBBbWJpZ3VpdHkgaW4gdGhlICJkbyB0aGUgcmlnaHQgdGhpbmciIGNsYXVzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVnZXI+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsdWUsIF9fdHJ1ZV90eXBlKQorICAgICAgICB7CisJICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gX01fYWxsb2NhdGUoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX24pKTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgPQorCSAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX24pOworCSAgX01fZmlsbF9pbml0aWFsaXplKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19uKSwgX192YWx1ZSk7CisJfQorCisgICAgICAvLyBDYWxsZWQgYnkgdGhlIHJhbmdlIGNvbnN0cnVjdG9yIHRvIGltcGxlbWVudCBbMjMuMS4xXS85CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgICAgICBfX2ZhbHNlX3R5cGUpCisgICAgICAgIHsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjoKKwkgICAgaXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJDYXRlZ29yeTsKKwkgIF9NX3JhbmdlX2luaXRpYWxpemUoX19maXJzdCwgX19sYXN0LCBfSXRlckNhdGVnb3J5KCkpOworCX0KKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSBzZWNvbmQgaW5pdGlhbGl6ZV9kaXNwYXRjaCBhYm92ZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpCisgICAgICAgIHsKKwkgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKwkgICAgZW1wbGFjZV9iYWNrKCpfX2ZpcnN0KTsKKyNlbHNlCisJICAgIHB1c2hfYmFjaygqX19maXJzdCk7CisjZW5kaWYKKwl9CisKKyAgICAgIC8vIENhbGxlZCBieSB0aGUgc2Vjb25kIGluaXRpYWxpemVfZGlzcGF0Y2ggYWJvdmUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgICAgIHsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisJICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gdGhpcy0+X01fYWxsb2NhdGUoX19uKTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgX19uOworCSAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPQorCSAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5X2EoX19maXJzdCwgX19sYXN0LAorCQkJCQl0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJCQlfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCX0KKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSBmaXJzdCBpbml0aWFsaXplX2Rpc3BhdGNoIGFib3ZlIGFuZCBieSB0aGUKKyAgICAgIC8vIHZlY3RvcihuLHZhbHVlLGEpIGNvbnN0cnVjdG9yLgorICAgICAgdm9pZAorICAgICAgX01fZmlsbF9pbml0aWFsaXplKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsdWUpCisgICAgICB7CisJc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uX2EodGhpcy0+X01faW1wbC5fTV9zdGFydCwgX19uLCBfX3ZhbHVlLCAKKwkJCQkgICAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCXRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8vIENhbGxlZCBieSB0aGUgdmVjdG9yKG4pIGNvbnN0cnVjdG9yLgorICAgICAgdm9pZAorICAgICAgX01fZGVmYXVsdF9pbml0aWFsaXplKHNpemVfdHlwZSBfX24pCisgICAgICB7CisJc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9uX2EodGhpcy0+X01faW1wbC5fTV9zdGFydCwgX19uLCAKKwkJCQkJIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vIEludGVybmFsIGFzc2lnbiBmdW5jdGlvbnMgZm9sbG93LiAgVGhlICpfYXV4IGZ1bmN0aW9ucyBkbyB0aGUgYWN0dWFsCisgICAgICAvLyBhc3NpZ25tZW50IHdvcmsgZm9yIHRoZSByYW5nZSB2ZXJzaW9ucy4KKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSByYW5nZSBhc3NpZ24gdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDM4LiBBbWJpZ3VpdHkgaW4gdGhlICJkbyB0aGUgcmlnaHQgdGhpbmciIGNsYXVzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVnZXI+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsIF9fdHJ1ZV90eXBlKQorICAgICAgICB7IF9NX2ZpbGxfYXNzaWduKF9fbiwgX192YWwpOyB9CisKKyAgICAgIC8vIENhbGxlZCBieSB0aGUgcmFuZ2UgYXNzaWduIHRvIGltcGxlbWVudCBbMjMuMS4xXS85CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkJICAgX19mYWxzZV90eXBlKQorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6CisJICAgIGl0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyQ2F0ZWdvcnk7CisJICBfTV9hc3NpZ25fYXV4KF9fZmlyc3QsIF9fbGFzdCwgX0l0ZXJDYXRlZ29yeSgpKTsKKwl9CisKKyAgICAgIC8vIENhbGxlZCBieSB0aGUgc2Vjb25kIGFzc2lnbl9kaXNwYXRjaCBhYm92ZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fYXNzaWduX2F1eChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKTsKKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSBzZWNvbmQgYXNzaWduX2Rpc3BhdGNoIGFib3ZlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2Fzc2lnbl9hdXgoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyk7CisKKyAgICAgIC8vIENhbGxlZCBieSBhc3NpZ24obix0KSwgYW5kIHRoZSByYW5nZSBhc3NpZ24gd2hlbiBpdCB0dXJucyBvdXQKKyAgICAgIC8vIHRvIGJlIHRoZSBzYW1lIHRoaW5nLgorICAgICAgdm9pZAorICAgICAgX01fZmlsbF9hc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwpOworCisKKyAgICAgIC8vIEludGVybmFsIGluc2VydCBmdW5jdGlvbnMgZm9sbG93LgorCisgICAgICAvLyBDYWxsZWQgYnkgdGhlIHJhbmdlIGluc2VydCB0byBpbXBsZW1lbnQgWzIzLjEuMV0vOQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzguIEFtYmlndWl0eSBpbiB0aGUgImRvIHRoZSByaWdodCB0aGluZyIgY2xhdXNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZWdlcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCisJCQkgICBfX3RydWVfdHlwZSkKKyAgICAgICAgeyBfTV9maWxsX2luc2VydChfX3BvcywgX19uLCBfX3ZhbCk7IH0KKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSByYW5nZSBpbnNlcnQgdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKwkJCSAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX19mYWxzZV90eXBlKQorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6CisJICAgIGl0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyQ2F0ZWdvcnk7CisJICBfTV9yYW5nZV9pbnNlcnQoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX0l0ZXJDYXRlZ29yeSgpKTsKKwl9CisKKyAgICAgIC8vIENhbGxlZCBieSB0aGUgc2Vjb25kIGluc2VydF9kaXNwYXRjaCBhYm92ZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fcmFuZ2VfaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorCQkJX0lucHV0SXRlcmF0b3IgX19sYXN0LCBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZyk7CisKKyAgICAgIC8vIENhbGxlZCBieSB0aGUgc2Vjb25kIGluc2VydF9kaXNwYXRjaCBhYm92ZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9yYW5nZV9pbnNlcnQoaXRlcmF0b3IgX19wb3MsIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKwkJCV9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKTsKKworICAgICAgLy8gQ2FsbGVkIGJ5IGluc2VydChwLG4seCksIGFuZCB0aGUgcmFuZ2UgaW5zZXJ0IHdoZW4gaXQgdHVybnMgb3V0IHRvIGJlCisgICAgICAvLyB0aGUgc2FtZSB0aGluZy4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2ZpbGxfaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gQ2FsbGVkIGJ5IHJlc2l6ZShuKS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2RlZmF1bHRfYXBwZW5kKHNpemVfdHlwZSBfX24pOworCisgICAgICBib29sCisgICAgICBfTV9zaHJpbmtfdG9fZml0KCk7CisjZW5kaWYKKworICAgICAgLy8gQ2FsbGVkIGJ5IGluc2VydChwLHgpCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01faW5zZXJ0X2F1eChpdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJncyYmLi4uIF9fYXJncyk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2VtcGxhY2VfYmFja19hdXgoX0FyZ3MmJi4uLiBfX2FyZ3MpOworI2VuZGlmCisKKyAgICAgIC8vIENhbGxlZCBieSB0aGUgbGF0dGVyLgorICAgICAgc2l6ZV90eXBlCisgICAgICBfTV9jaGVja19sZW4oc2l6ZV90eXBlIF9fbiwgY29uc3QgY2hhciogX19zKSBjb25zdAorICAgICAgeworCWlmIChtYXhfc2l6ZSgpIC0gc2l6ZSgpIDwgX19uKQorCSAgX190aHJvd19sZW5ndGhfZXJyb3IoX19OKF9fcykpOworCisJY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc2l6ZSgpICsgc3RkOjptYXgoc2l6ZSgpLCBfX24pOworCXJldHVybiAoX19sZW4gPCBzaXplKCkgfHwgX19sZW4gPiBtYXhfc2l6ZSgpKSA/IG1heF9zaXplKCkgOiBfX2xlbjsKKyAgICAgIH0KKworICAgICAgLy8gSW50ZXJuYWwgZXJhc2UgZnVuY3Rpb25zIGZvbGxvdy4KKworICAgICAgLy8gQ2FsbGVkIGJ5IGVyYXNlKHExLHEyKSwgY2xlYXIoKSwgcmVzaXplKCksIF9NX2ZpbGxfYXNzaWduLAorICAgICAgLy8gX01fYXNzaWduX2F1eC4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2VyYXNlX2F0X2VuZChwb2ludGVyIF9fcG9zKQorICAgICAgeworCXN0ZDo6X0Rlc3Ryb3koX19wb3MsIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCXRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gX19wb3M7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIENvbnN0YW50LXRpbWUgbW92ZSBhc3NpZ25tZW50IHdoZW4gc291cmNlIG9iamVjdCdzIG1lbW9yeSBjYW4gYmUKKyAgICAgIC8vIG1vdmVkLCBlaXRoZXIgYmVjYXVzZSB0aGUgc291cmNlJ3MgYWxsb2NhdG9yIHdpbGwgbW92ZSB0b28KKyAgICAgIC8vIG9yIGJlY2F1c2UgdGhlIGFsbG9jYXRvcnMgYXJlIGVxdWFsLgorICAgICAgdm9pZAorICAgICAgX01fbW92ZV9hc3NpZ24odmVjdG9yJiYgX194LCBzdGQ6OnRydWVfdHlwZSkgbm9leGNlcHQKKyAgICAgIHsKKwl2ZWN0b3IgX190bXAoZ2V0X2FsbG9jYXRvcigpKTsKKwl0aGlzLT5fTV9pbXBsLl9NX3N3YXBfZGF0YShfX3RtcC5fTV9pbXBsKTsKKwl0aGlzLT5fTV9pbXBsLl9NX3N3YXBfZGF0YShfX3guX01faW1wbCk7CisJaWYgKF9BbGxvY190cmFpdHM6Ol9TX3Byb3BhZ2F0ZV9vbl9tb3ZlX2Fzc2lnbigpKQorCSAgc3RkOjpfX2FsbG9jX29uX21vdmUoX01fZ2V0X1RwX2FsbG9jYXRvcigpLAorCQkJICAgICAgIF9feC5fTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworICAgICAgfQorCisgICAgICAvLyBEbyBtb3ZlIGFzc2lnbm1lbnQgd2hlbiBpdCBtaWdodCBub3QgYmUgcG9zc2libGUgdG8gbW92ZSBzb3VyY2UKKyAgICAgIC8vIG9iamVjdCdzIG1lbW9yeSwgcmVzdWx0aW5nIGluIGEgbGluZWFyLXRpbWUgb3BlcmF0aW9uLgorICAgICAgdm9pZAorICAgICAgX01fbW92ZV9hc3NpZ24odmVjdG9yJiYgX194LCBzdGQ6OmZhbHNlX3R5cGUpCisgICAgICB7CisJaWYgKF9feC5fTV9nZXRfVHBfYWxsb2NhdG9yKCkgPT0gdGhpcy0+X01fZ2V0X1RwX2FsbG9jYXRvcigpKQorCSAgX01fbW92ZV9hc3NpZ24oc3RkOjptb3ZlKF9feCksIHN0ZDo6dHJ1ZV90eXBlKCkpOworCWVsc2UKKwkgIHsKKwkgICAgLy8gVGhlIHJ2YWx1ZSdzIGFsbG9jYXRvciBjYW5ub3QgYmUgbW92ZWQgYW5kIGlzIG5vdCBlcXVhbCwKKwkgICAgLy8gc28gd2UgbmVlZCB0byBpbmRpdmlkdWFsbHkgbW92ZSBlYWNoIGVsZW1lbnQuCisJICAgIHRoaXMtPmFzc2lnbihzdGQ6Ol9fbWFrZV9tb3ZlX2lmX25vZXhjZXB0X2l0ZXJhdG9yKF9feC5iZWdpbigpKSwKKwkJCSBzdGQ6Ol9fbWFrZV9tb3ZlX2lmX25vZXhjZXB0X2l0ZXJhdG9yKF9feC5lbmQoKSkpOworCSAgICBfX3guY2xlYXIoKTsKKwkgIH0KKyAgICAgIH0KKyNlbmRpZgorICAgIH07CisKKworICAvKioKKyAgICogIEBicmllZiAgVmVjdG9yIGVxdWFsaXR5IGNvbXBhcmlzb24uCisgICAqICBAcGFyYW0gIF9feCAgQSAldmVjdG9yLgorICAgKiAgQHBhcmFtICBfX3kgIEEgJXZlY3RvciBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIF9feC4KKyAgICogIEByZXR1cm4gIFRydWUgaWZmIHRoZSBzaXplIGFuZCBlbGVtZW50cyBvZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwuCisgICAqCisgICAqICBUaGlzIGlzIGFuIGVxdWl2YWxlbmNlIHJlbGF0aW9uLiAgSXQgaXMgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZQorICAgKiAgdmVjdG9ycy4gIFZlY3RvcnMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCBpZiB0aGVpciBzaXplcyBhcmUgZXF1YWwsCisgICAqICBhbmQgaWYgY29ycmVzcG9uZGluZyBlbGVtZW50cyBjb21wYXJlIGVxdWFsLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX194LCBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gKF9feC5zaXplKCkgPT0gX195LnNpemUoKQorCSAgICAgICYmIHN0ZDo6ZXF1YWwoX194LmJlZ2luKCksIF9feC5lbmQoKSwgX195LmJlZ2luKCkpKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBWZWN0b3Igb3JkZXJpbmcgcmVsYXRpb24uCisgICAqICBAcGFyYW0gIF9feCAgQSAldmVjdG9yLgorICAgKiAgQHBhcmFtICBfX3kgIEEgJXZlY3RvciBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIF9feC4KKyAgICogIEByZXR1cm4gIFRydWUgaWZmIEBhIF9feCBpcyBsZXhpY29ncmFwaGljYWxseSBsZXNzIHRoYW4gQGEgX195LgorICAgKgorICAgKiAgVGhpcyBpcyBhIHRvdGFsIG9yZGVyaW5nIHJlbGF0aW9uLiAgSXQgaXMgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZQorICAgKiAgdmVjdG9ycy4gIFRoZSBlbGVtZW50cyBtdXN0IGJlIGNvbXBhcmFibGUgd2l0aCBAYyA8LgorICAgKgorICAgKiAgU2VlIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoKSBmb3IgaG93IHRoZSBkZXRlcm1pbmF0aW9uIGlzIG1hZGUuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCwgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX194LmJlZ2luKCksIF9feC5lbmQoKSwKKwkJCQkJICBfX3kuYmVnaW4oKSwgX195LmVuZCgpKTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcj09CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3gsIGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3gsIGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3gsIGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3gsIGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworICAvLy8gU2VlIHN0ZDo6dmVjdG9yOjpzd2FwKCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3gsIHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLyogX1NUTF9WRUNUT1JfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0cmVhbV9pdGVyYXRvci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0cmVhbV9pdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNzQ3YTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RyZWFtX2l0ZXJhdG9yLmgKQEAgLTAsMCArMSwyMjEgQEAKKy8vIFN0cmVhbSBpdGVyYXRvcnMKKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvc3RyZWFtX2l0ZXJhdG9yLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpdGVyYXRvcn0KKyAqLworCisjaWZuZGVmIF9TVFJFQU1fSVRFUkFUT1JfSAorI2RlZmluZSBfU1RSRUFNX0lURVJBVE9SX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIGl0ZXJhdG9ycworICAgKiBAeworICAgKi8KKworICAvLy8gUHJvdmlkZXMgaW5wdXQgaXRlcmF0b3Igc2VtYW50aWNzIGZvciBzdHJlYW1zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9DaGFyVCA9IGNoYXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+LCB0eXBlbmFtZSBfRGlzdCA9IHB0cmRpZmZfdD4KKyAgICBjbGFzcyBpc3RyZWFtX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3I8aW5wdXRfaXRlcmF0b3JfdGFnLCBfVHAsIF9EaXN0LCBjb25zdCBfVHAqLCBjb25zdCBfVHAmPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IGlzdHJlYW1fdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICBpc3RyZWFtX3R5cGUqCV9NX3N0cmVhbTsKKyAgICAgIF9UcAkJX01fdmFsdWU7CisgICAgICBib29sCQlfTV9vazsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyAgQ29uc3RydWN0IGVuZCBvZiBpbnB1dCBzdHJlYW0gaXRlcmF0b3IuCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgaXN0cmVhbV9pdGVyYXRvcigpCisgICAgICA6IF9NX3N0cmVhbSgwKSwgX01fdmFsdWUoKSwgX01fb2soZmFsc2UpIHt9CisKKyAgICAgIC8vLyAgQ29uc3RydWN0IHN0YXJ0IG9mIGlucHV0IHN0cmVhbSBpdGVyYXRvci4KKyAgICAgIGlzdHJlYW1faXRlcmF0b3IoaXN0cmVhbV90eXBlJiBfX3MpCisgICAgICA6IF9NX3N0cmVhbSgmX19zKQorICAgICAgeyBfTV9yZWFkKCk7IH0KKworICAgICAgaXN0cmVhbV9pdGVyYXRvcihjb25zdCBpc3RyZWFtX2l0ZXJhdG9yJiBfX29iaikKKyAgICAgIDogX01fc3RyZWFtKF9fb2JqLl9NX3N0cmVhbSksIF9NX3ZhbHVlKF9fb2JqLl9NX3ZhbHVlKSwKKyAgICAgICAgX01fb2soX19vYmouX01fb2spCisgICAgICB7IH0KKworICAgICAgY29uc3QgX1RwJgorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfY29uZChfTV9vaywKKwkJCQlfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19kZXJlZl9pc3RyZWFtKQorCQkJCS5fTV9pdGVyYXRvcigqdGhpcykpOworCXJldHVybiBfTV92YWx1ZTsKKyAgICAgIH0KKworICAgICAgY29uc3QgX1RwKgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYob3BlcmF0b3IqKCkpOyB9CisKKyAgICAgIGlzdHJlYW1faXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfY29uZChfTV9vaywKKwkJCQlfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19pbmNfaXN0cmVhbSkKKwkJCQkuX01faXRlcmF0b3IoKnRoaXMpKTsKKwlfTV9yZWFkKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpc3RyZWFtX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfY29uZChfTV9vaywKKwkJCQlfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19pbmNfaXN0cmVhbSkKKwkJCQkuX01faXRlcmF0b3IoKnRoaXMpKTsKKwlpc3RyZWFtX2l0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CisJX01fcmVhZCgpOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgX01fZXF1YWwoY29uc3QgaXN0cmVhbV9pdGVyYXRvciYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gKF9NX29rID09IF9feC5fTV9vaykgJiYgKCFfTV9vayB8fCBfTV9zdHJlYW0gPT0gX194Ll9NX3N0cmVhbSk7IH0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9yZWFkKCkKKyAgICAgIHsKKwlfTV9vayA9IChfTV9zdHJlYW0gJiYgKl9NX3N0cmVhbSkgPyB0cnVlIDogZmFsc2U7CisJaWYgKF9NX29rKQorCSAgeworCSAgICAqX01fc3RyZWFtID4+IF9NX3ZhbHVlOworCSAgICBfTV9vayA9ICpfTV9zdHJlYW0gPyB0cnVlIDogZmFsc2U7CisJICB9CisgICAgICB9CisgICAgfTsKKworICAvLy8gIFJldHVybiB0cnVlIGlmIHggYW5kIHkgYXJlIGJvdGggZW5kIG9yIG5vdCBlbmQsIG9yIHggYW5kIHkgYXJlIHRoZSBzYW1lLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0Rpc3Q+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGlzdHJlYW1faXRlcmF0b3I8X1RwLCBfQ2hhclQsIF9UcmFpdHMsIF9EaXN0PiYgX194LAorCSAgICAgICBjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPF9UcCwgX0NoYXJULCBfVHJhaXRzLCBfRGlzdD4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fZXF1YWwoX195KTsgfQorCisgIC8vLyAgUmV0dXJuIGZhbHNlIGlmIHggYW5kIHkgYXJlIGJvdGggZW5kIG9yIG5vdCBlbmQsIG9yIHggYW5kIHkgYXJlIHRoZSBzYW1lLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9EaXN0PgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPF9UcCwgX0NoYXJULCBfVHJhaXRzLCBfRGlzdD4mIF9feCwKKwkgICAgICAgY29uc3QgaXN0cmVhbV9pdGVyYXRvcjxfVHAsIF9DaGFyVCwgX1RyYWl0cywgX0Rpc3Q+JiBfX3kpCisgICAgeyByZXR1cm4gIV9feC5fTV9lcXVhbChfX3kpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFByb3ZpZGVzIG91dHB1dCBpdGVyYXRvciBzZW1hbnRpY3MgZm9yIHN0cmVhbXMuCisgICAqCisgICAqICBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGl0ZXJhdG9yIHRvIHdyaXRlIHRvIGFuIG9zdHJlYW0uICBUaGUgdHlwZSBUcCBpcworICAgKiAgdGhlIG9ubHkgdHlwZSB3cml0dGVuIGJ5IHRoaXMgaXRlcmF0b3IgYW5kIHRoZXJlIG11c3QgYmUgYW4KKyAgICogIG9wZXJhdG9yPDwoVHApIGRlZmluZWQuCisgICAqCisgICAqICBAdHBhcmFtICBfVHAgIFRoZSB0eXBlIHRvIHdyaXRlIHRvIHRoZSBvc3RyZWFtLgorICAgKiAgQHRwYXJhbSAgX0NoYXJUICBUaGUgb3N0cmVhbSBjaGFyX3R5cGUuCisgICAqICBAdHBhcmFtICBfVHJhaXRzICBUaGUgb3N0cmVhbSBjaGFyX3RyYWl0cy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ2hhclQgPSBjaGFyLAorICAgICAgICAgICB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3Mgb3N0cmVhbV9pdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBQdWJsaWMgdHlwZWRlZgorICAgICAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiBvc3RyZWFtX3R5cGU7CisgICAgICAvL0B9CisKKyAgICBwcml2YXRlOgorICAgICAgb3N0cmVhbV90eXBlKglfTV9zdHJlYW07CisgICAgICBjb25zdCBfQ2hhclQqCV9NX3N0cmluZzsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhbiBvc3RyZWFtLgorICAgICAgb3N0cmVhbV9pdGVyYXRvcihvc3RyZWFtX3R5cGUmIF9fcykgOiBfTV9zdHJlYW0oJl9fcyksIF9NX3N0cmluZygwKSB7fQorCisgICAgICAvKioKKyAgICAgICAqICBDb25zdHJ1Y3QgZnJvbSBhbiBvc3RyZWFtLgorICAgICAgICoKKyAgICAgICAqICBUaGUgZGVsaW1pdGVyIHN0cmluZyBAYSBjIGlzIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbSBhZnRlciBldmVyeSBUcAorICAgICAgICogIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbS4gIFRoZSBkZWxpbWl0ZXIgaXMgbm90IGNvcGllZCwgYW5kIHRodXMgbXVzdAorICAgICAgICogIG5vdCBiZSBkZXN0cm95ZWQgd2hpbGUgdGhpcyBpdGVyYXRvciBpcyBpbiB1c2UuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19zICBVbmRlcmx5aW5nIG9zdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICAgKiAgQHBhcmFtICBfX2MgIENoYXJUIGRlbGltaXRlciBzdHJpbmcgdG8gaW5zZXJ0LgorICAgICAgKi8KKyAgICAgIG9zdHJlYW1faXRlcmF0b3Iob3N0cmVhbV90eXBlJiBfX3MsIGNvbnN0IF9DaGFyVCogX19jKQorICAgICAgOiBfTV9zdHJlYW0oJl9fcyksIF9NX3N0cmluZyhfX2MpICB7IH0KKworICAgICAgLy8vIENvcHkgY29uc3RydWN0b3IuCisgICAgICBvc3RyZWFtX2l0ZXJhdG9yKGNvbnN0IG9zdHJlYW1faXRlcmF0b3ImIF9fb2JqKQorICAgICAgOiBfTV9zdHJlYW0oX19vYmouX01fc3RyZWFtKSwgX01fc3RyaW5nKF9fb2JqLl9NX3N0cmluZykgIHsgfQorCisgICAgICAvLy8gV3JpdGVzIEBhIHZhbHVlIHRvIHVuZGVybHlpbmcgb3N0cmVhbSB1c2luZyBvcGVyYXRvcjw8LiAgSWYKKyAgICAgIC8vLyBjb25zdHJ1Y3RlZCB3aXRoIGRlbGltaXRlciBzdHJpbmcsIHdyaXRlcyBkZWxpbWl0ZXIgdG8gb3N0cmVhbS4KKyAgICAgIG9zdHJlYW1faXRlcmF0b3ImCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1RwJiBfX3ZhbHVlKQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19jb25kKF9NX3N0cmVhbSAhPSAwLAorCQkJCV9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX291dHB1dF9vc3RyZWFtKQorCQkJCS5fTV9pdGVyYXRvcigqdGhpcykpOworCSpfTV9zdHJlYW0gPDwgX192YWx1ZTsKKwlpZiAoX01fc3RyaW5nKSAqX01fc3RyZWFtIDw8IF9NX3N0cmluZzsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIG9zdHJlYW1faXRlcmF0b3ImCisgICAgICBvcGVyYXRvciooKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgb3N0cmVhbV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgb3N0cmVhbV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICB9OworCisgIC8vIEB9IGdyb3VwIGl0ZXJhdG9ycworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0cmVhbWJ1Zi50Y2MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RyZWFtYnVmLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGQ0NTY1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0cmVhbWJ1Zi50Y2MKQEAgLTAsMCArMSwxNzUgQEAKKy8vIFN0cmVhbSBidWZmZXIgY2xhc3NlcyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9zdHJlYW1idWYudGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7c3RyZWFtYnVmfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy41ICBTdHJlYW0gYnVmZmVycworLy8KKworI2lmbmRlZiBfU1RSRUFNQlVGX1RDQworI2RlZmluZSBfU1RSRUFNQlVGX1RDQyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdHJlYW1zaXplCisgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHhzZ2V0bihjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pCisgICAgeworICAgICAgc3RyZWFtc2l6ZSBfX3JldCA9IDA7CisgICAgICB3aGlsZSAoX19yZXQgPCBfX24pCisJeworCSAgY29uc3Qgc3RyZWFtc2l6ZSBfX2J1Zl9sZW4gPSB0aGlzLT5lZ3B0cigpIC0gdGhpcy0+Z3B0cigpOworCSAgaWYgKF9fYnVmX2xlbikKKwkgICAgeworCSAgICAgIGNvbnN0IHN0cmVhbXNpemUgX19yZW1haW5pbmcgPSBfX24gLSBfX3JldDsKKwkgICAgICBjb25zdCBzdHJlYW1zaXplIF9fbGVuID0gc3RkOjptaW4oX19idWZfbGVuLCBfX3JlbWFpbmluZyk7CisJICAgICAgdHJhaXRzX3R5cGU6OmNvcHkoX19zLCB0aGlzLT5ncHRyKCksIF9fbGVuKTsKKwkgICAgICBfX3JldCArPSBfX2xlbjsKKwkgICAgICBfX3MgKz0gX19sZW47CisJICAgICAgdGhpcy0+X19zYWZlX2didW1wKF9fbGVuKTsKKwkgICAgfQorCisJICBpZiAoX19yZXQgPCBfX24pCisJICAgIHsKKwkgICAgICBjb25zdCBpbnRfdHlwZSBfX2MgPSB0aGlzLT51ZmxvdygpOworCSAgICAgIGlmICghdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgdHJhaXRzX3R5cGU6OmVvZigpKSkKKwkJeworCQkgIHRyYWl0c190eXBlOjphc3NpZ24oKl9fcysrLCB0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYykpOworCQkgICsrX19yZXQ7CisJCX0KKwkgICAgICBlbHNlCisJCWJyZWFrOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RyZWFtc2l6ZQorICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICB4c3B1dG4oY29uc3QgY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKQorICAgIHsKKyAgICAgIHN0cmVhbXNpemUgX19yZXQgPSAwOworICAgICAgd2hpbGUgKF9fcmV0IDwgX19uKQorCXsKKwkgIGNvbnN0IHN0cmVhbXNpemUgX19idWZfbGVuID0gdGhpcy0+ZXBwdHIoKSAtIHRoaXMtPnBwdHIoKTsKKwkgIGlmIChfX2J1Zl9sZW4pCisJICAgIHsKKwkgICAgICBjb25zdCBzdHJlYW1zaXplIF9fcmVtYWluaW5nID0gX19uIC0gX19yZXQ7CisJICAgICAgY29uc3Qgc3RyZWFtc2l6ZSBfX2xlbiA9IHN0ZDo6bWluKF9fYnVmX2xlbiwgX19yZW1haW5pbmcpOworCSAgICAgIHRyYWl0c190eXBlOjpjb3B5KHRoaXMtPnBwdHIoKSwgX19zLCBfX2xlbik7CisJICAgICAgX19yZXQgKz0gX19sZW47CisJICAgICAgX19zICs9IF9fbGVuOworCSAgICAgIHRoaXMtPl9fc2FmZV9wYnVtcChfX2xlbik7CisJICAgIH0KKworCSAgaWYgKF9fcmV0IDwgX19uKQorCSAgICB7CisJICAgICAgaW50X3R5cGUgX19jID0gdGhpcy0+b3ZlcmZsb3codHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCpfX3MpKTsKKwkgICAgICBpZiAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIHRyYWl0c190eXBlOjplb2YoKSkpCisJCXsKKwkJICArK19fcmV0OworCQkgICsrX19zOworCQl9CisJICAgICAgZWxzZQorCQlicmVhazsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgLy8gQ29uY2VpdmFibHksIHRoaXMgY291bGQgYmUgdXNlZCB0byBpbXBsZW1lbnQgYnVmZmVyLXRvLWJ1ZmZlcgorICAvLyBjb3BpZXMsIGlmIHRoaXMgd2FzIGV2ZXIgZGVzaXJlZCBpbiBhbiB1bi1hbWJpZ3VvdXMgd2F5IGJ5IHRoZQorICAvLyBzdGFuZGFyZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0cmVhbXNpemUKKyAgICBfX2NvcHlfc3RyZWFtYnVmc19lb2YoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc2JpbiwKKwkJCSAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc2JvdXQsCisJCQkgIGJvb2wmIF9faW5lb2YpCisgICAgeworICAgICAgc3RyZWFtc2l6ZSBfX3JldCA9IDA7CisgICAgICBfX2luZW9mID0gdHJ1ZTsKKyAgICAgIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIF9fYyA9IF9fc2Jpbi0+c2dldGMoKTsKKyAgICAgIHdoaWxlICghX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfVHJhaXRzOjplb2YoKSkpCisJeworCSAgX19jID0gX19zYm91dC0+c3B1dGMoX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYykpOworCSAgaWYgKF9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX1RyYWl0czo6ZW9mKCkpKQorCSAgICB7CisJICAgICAgX19pbmVvZiA9IGZhbHNlOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICArK19fcmV0OworCSAgX19jID0gX19zYmluLT5zbmV4dGMoKTsKKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgc3RyZWFtc2l6ZQorICAgIF9fY29weV9zdHJlYW1idWZzKGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3NiaW4sCisJCSAgICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3Nib3V0KQorICAgIHsKKyAgICAgIGJvb2wgX19pbmVvZjsKKyAgICAgIHJldHVybiBfX2NvcHlfc3RyZWFtYnVmc19lb2YoX19zYmluLCBfX3Nib3V0LCBfX2luZW9mKTsKKyAgICB9CisKKyAgLy8gSW5oaWJpdCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBmb3IgcmVxdWlyZWQgaW5zdGFudGlhdGlvbnMsCisgIC8vIHdoaWNoIGFyZSBkZWZpbmVkIHZpYSBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBlbHNld2hlcmUuCisjaWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19zdHJlYW1idWY8Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIHN0cmVhbXNpemUKKyAgICBfX2NvcHlfc3RyZWFtYnVmcyhiYXNpY19zdHJlYW1idWY8Y2hhcj4qLAorCQkgICAgICBiYXNpY19zdHJlYW1idWY8Y2hhcj4qKTsKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgc3RyZWFtc2l6ZQorICAgIF9fY29weV9zdHJlYW1idWZzX2VvZihiYXNpY19zdHJlYW1idWY8Y2hhcj4qLAorCQkJICBiYXNpY19zdHJlYW1idWY8Y2hhcj4qLCBib29sJik7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfc3RyZWFtYnVmPHdjaGFyX3Q+OworICBleHRlcm4gdGVtcGxhdGUKKyAgICBzdHJlYW1zaXplCisgICAgX19jb3B5X3N0cmVhbWJ1ZnMoYmFzaWNfc3RyZWFtYnVmPHdjaGFyX3Q+KiwKKwkJICAgICAgYmFzaWNfc3RyZWFtYnVmPHdjaGFyX3Q+Kik7CisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIHN0cmVhbXNpemUKKyAgICBfX2NvcHlfc3RyZWFtYnVmc19lb2YoYmFzaWNfc3RyZWFtYnVmPHdjaGFyX3Q+KiwKKwkJCSAgYmFzaWNfc3RyZWFtYnVmPHdjaGFyX3Q+KiwgYm9vbCYpOworI2VuZGlmCisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RyZWFtYnVmX2l0ZXJhdG9yLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvc3RyZWFtYnVmX2l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliZTZlOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdHJlYW1idWZfaXRlcmF0b3IuaApAQCAtMCwwICsxLDQxMiBAQAorLy8gU3RyZWFtYnVmIGl0ZXJhdG9ycworCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9zdHJlYW1idWZfaXRlcmF0b3IuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2l0ZXJhdG9yfQorICovCisKKyNpZm5kZWYgX1NUUkVBTUJVRl9JVEVSQVRPUl9ICisjZGVmaW5lIF9TVFJFQU1CVUZfSVRFUkFUT1JfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPHN0cmVhbWJ1Zj4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisgICAgIAorICAvKioKKyAgICogQGFkZHRvZ3JvdXAgaXRlcmF0b3JzCisgICAqIEB7CisgICAqLworCisgIC8vIDI0LjUuMyBUZW1wbGF0ZSBjbGFzcyBpc3RyZWFtYnVmX2l0ZXJhdG9yCisgIC8vLyBQcm92aWRlcyBpbnB1dCBpdGVyYXRvciBzZW1hbnRpY3MgZm9yIHN0cmVhbWJ1ZnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBjbGFzcyBpc3RyZWFtYnVmX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3I8aW5wdXRfaXRlcmF0b3JfdGFnLCBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM6Om9mZl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgIF9DaGFyVCosCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIC8vIExXRyA0NDUuCisJCSAgICAgIF9DaGFyVD4KKyNlbHNlCisJCSAgICAgIF9DaGFyVCY+CisjZW5kaWYKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICAvL0B7CisgICAgICAvLy8gUHVibGljIHR5cGVkZWZzCisgICAgICB0eXBlZGVmIF9DaGFyVAkJCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfVHJhaXRzCQkJCQl0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUJCWludF90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPgkJc3RyZWFtYnVmX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPgkJaXN0cmVhbV90eXBlOworICAgICAgLy9AfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQyPgorCWZyaWVuZCB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfY2hhcjxfQ2hhclQyPjo6X192YWx1ZSwKKwkJICAgICAgICAgICAgICAgICAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVDI+ID46Ol9fdHlwZQorCWNvcHkoaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQyPiwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQyPiwKKwkgICAgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUMj4pOworCisgICAgICB0ZW1wbGF0ZTxib29sIF9Jc01vdmUsIHR5cGVuYW1lIF9DaGFyVDI+CisJZnJpZW5kIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19jaGFyPF9DaGFyVDI+OjpfX3ZhbHVlLCAKKwkJCQkJICAgICAgIF9DaGFyVDIqPjo6X190eXBlCisJX19jb3B5X21vdmVfYTIoaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQyPiwKKwkJICAgICAgIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUMj4sIF9DaGFyVDIqKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUMj4KKwlmcmllbmQgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2NoYXI8X0NoYXJUMj46Ol9fdmFsdWUsCisJCQkgICAgICAgICAgICBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVDI+ID46Ol9fdHlwZQorCWZpbmQoaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQyPiwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQyPiwKKwkgICAgIGNvbnN0IF9DaGFyVDImKTsKKworICAgIHByaXZhdGU6CisgICAgICAvLyAyNC41LjMgaXN0cmVhbWJ1Zl9pdGVyYXRvcgorICAgICAgLy8gcCAxCisgICAgICAvLyBJZiB0aGUgZW5kIG9mIHN0cmVhbSBpcyByZWFjaGVkIChzdHJlYW1idWZfdHlwZTo6c2dldGMoKQorICAgICAgLy8gcmV0dXJucyB0cmFpdHNfdHlwZTo6ZW9mKCkpLCB0aGUgaXRlcmF0b3IgYmVjb21lcyBlcXVhbCB0bworICAgICAgLy8gdGhlICJlbmQgb2Ygc3RyZWFtIiBpdGVyYXRvciB2YWx1ZS4KKyAgICAgIC8vIE5COiBUaGlzIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhlICJlbmQgb2Ygc3RyZWFtIiB2YWx1ZQorICAgICAgLy8gaXMgRU9GLCBvciAtMS4KKyAgICAgIG11dGFibGUgc3RyZWFtYnVmX3R5cGUqCV9NX3NidWY7CisgICAgICBtdXRhYmxlIGludF90eXBlCQlfTV9jOworCisgICAgcHVibGljOgorICAgICAgLy8vICBDb25zdHJ1Y3QgZW5kIG9mIGlucHV0IHN0cmVhbSBpdGVyYXRvci4KKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBpc3RyZWFtYnVmX2l0ZXJhdG9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICA6IF9NX3NidWYoMCksIF9NX2ModHJhaXRzX3R5cGU6OmVvZigpKSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGlzdHJlYW1idWZfaXRlcmF0b3IoY29uc3QgaXN0cmVhbWJ1Zl9pdGVyYXRvciYpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKworICAgICAgfmlzdHJlYW1idWZfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisjZW5kaWYKKworICAgICAgLy8vICBDb25zdHJ1Y3Qgc3RhcnQgb2YgaW5wdXQgc3RyZWFtIGl0ZXJhdG9yLgorICAgICAgaXN0cmVhbWJ1Zl9pdGVyYXRvcihpc3RyZWFtX3R5cGUmIF9fcykgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICA6IF9NX3NidWYoX19zLnJkYnVmKCkpLCBfTV9jKHRyYWl0c190eXBlOjplb2YoKSkgeyB9CisKKyAgICAgIC8vLyAgQ29uc3RydWN0IHN0YXJ0IG9mIHN0cmVhbWJ1ZiBpdGVyYXRvci4KKyAgICAgIGlzdHJlYW1idWZfaXRlcmF0b3Ioc3RyZWFtYnVmX3R5cGUqIF9fcykgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICA6IF9NX3NidWYoX19zKSwgX01fYyh0cmFpdHNfdHlwZTo6ZW9mKCkpIHsgfQorCisgICAgICAvLy8gIFJldHVybiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgcG9pbnRlZCB0byBieSBpdGVyYXRvci4gIFRoaXMgcmV0dXJucworICAgICAgLy8vICBzdHJlYW1idWYuc2dldGMoKS4gIEl0IGNhbm5vdCBiZSBhc3NpZ25lZC4gIE5COiBUaGUgcmVzdWx0IG9mCisgICAgICAvLy8gIG9wZXJhdG9yKigpIG9uIGFuIGVuZCBvZiBzdHJlYW0gaXMgdW5kZWZpbmVkLgorICAgICAgY2hhcl90eXBlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeworI2lmZGVmIF9HTElCQ1hYX0RFQlVHX1BFREFOVElDCisJLy8gRGVyZWZlcmVuY2luZyBhIHBhc3QtdGhlLWVuZCBpc3RyZWFtYnVmX2l0ZXJhdG9yIGlzIGEKKwkvLyBsaWJzdGRjKysgZXh0ZW5zaW9uCisJX19nbGliY3h4X3JlcXVpcmVzX2NvbmQoIV9NX2F0X2VvZigpLAorCQkJCV9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2RlcmVmX2lzdHJlYW1idWYpCisJCQkJLl9NX2l0ZXJhdG9yKCp0aGlzKSk7CisjZW5kaWYKKwlyZXR1cm4gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfTV9nZXQoKSk7CisgICAgICB9CisKKyAgICAgIC8vLyBBZHZhbmNlIHRoZSBpdGVyYXRvci4gIENhbGxzIHN0cmVhbWJ1Zi5zYnVtcGMoKS4KKyAgICAgIGlzdHJlYW1idWZfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfY29uZCghX01fYXRfZW9mKCksCisJCQkJX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfaW5jX2lzdHJlYW1idWYpCisJCQkJLl9NX2l0ZXJhdG9yKCp0aGlzKSk7CisJaWYgKF9NX3NidWYpCisJICB7CisJICAgIF9NX3NidWYtPnNidW1wYygpOworCSAgICBfTV9jID0gdHJhaXRzX3R5cGU6OmVvZigpOworCSAgfQorCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8vIEFkdmFuY2UgdGhlIGl0ZXJhdG9yLiAgQ2FsbHMgc3RyZWFtYnVmLnNidW1wYygpLgorICAgICAgaXN0cmVhbWJ1Zl9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX2NvbmQoIV9NX2F0X2VvZigpLAorCQkJCV9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2luY19pc3RyZWFtYnVmKQorCQkJCS5fTV9pdGVyYXRvcigqdGhpcykpOworCisJaXN0cmVhbWJ1Zl9pdGVyYXRvciBfX29sZCA9ICp0aGlzOworCWlmIChfTV9zYnVmKQorCSAgeworCSAgICBfX29sZC5fTV9jID0gX01fc2J1Zi0+c2J1bXBjKCk7CisJICAgIF9NX2MgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisJICB9CisJcmV0dXJuIF9fb2xkOworICAgICAgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAxMTAgaXN0cmVhbWJ1Zl9pdGVyYXRvcjo6ZXF1YWwgbm90IGNvbnN0CisgICAgICAvLyBOQjogdGhlcmUgaXMgYWxzbyBudW1iZXIgMTExIChOQUQsIEZ1dHVyZSkgcGVuZGluZyBvbiB0aGlzIGZ1bmN0aW9uLgorICAgICAgLy8vIFJldHVybiB0cnVlIGJvdGggaXRlcmF0b3JzIGFyZSBlbmQgb3IgYm90aCBhcmUgbm90IGVuZC4KKyAgICAgIGJvb2wKKyAgICAgIGVxdWFsKGNvbnN0IGlzdHJlYW1idWZfaXRlcmF0b3ImIF9fYikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2F0X2VvZigpID09IF9fYi5fTV9hdF9lb2YoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGludF90eXBlCisgICAgICBfTV9nZXQoKSBjb25zdAorICAgICAgeworCWNvbnN0IGludF90eXBlIF9fZW9mID0gdHJhaXRzX3R5cGU6OmVvZigpOworCWludF90eXBlIF9fcmV0ID0gX19lb2Y7CisJaWYgKF9NX3NidWYpCisJICB7CisJICAgIGlmICghdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9NX2MsIF9fZW9mKSkKKwkgICAgICBfX3JldCA9IF9NX2M7CisJICAgIGVsc2UgaWYgKCF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoKF9fcmV0ID0gX01fc2J1Zi0+c2dldGMoKSksCisJCQkJCSAgICAgICBfX2VvZikpCisJICAgICAgX01fYyA9IF9fcmV0OworCSAgICBlbHNlCisJICAgICAgX01fc2J1ZiA9IDA7CisJICB9CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgICAgICBib29sCisgICAgICBfTV9hdF9lb2YoKSBjb25zdAorICAgICAgeworCWNvbnN0IGludF90eXBlIF9fZW9mID0gdHJhaXRzX3R5cGU6OmVvZigpOworCXJldHVybiB0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX01fZ2V0KCksIF9fZW9mKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+JiBfX2EsCisJICAgICAgIGNvbnN0IGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiYgX19iKQorICAgIHsgcmV0dXJuIF9fYS5lcXVhbChfX2IpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4mIF9fYSwKKwkgICAgICAgY29uc3QgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+JiBfX2IpCisgICAgeyByZXR1cm4gIV9fYS5lcXVhbChfX2IpOyB9CisKKyAgLy8vIFByb3ZpZGVzIG91dHB1dCBpdGVyYXRvciBzZW1hbnRpY3MgZm9yIHN0cmVhbWJ1ZnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBjbGFzcyBvc3RyZWFtYnVmX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3I8b3V0cHV0X2l0ZXJhdG9yX3RhZywgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICAvL0B7CisgICAgICAvLy8gUHVibGljIHR5cGVkZWZzCisgICAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+IHN0cmVhbWJ1Zl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gICBvc3RyZWFtX3R5cGU7CisgICAgICAvL0B9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVDI+CisJZnJpZW5kIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19jaGFyPF9DaGFyVDI+OjpfX3ZhbHVlLAorCQkgICAgICAgICAgICAgICAgICAgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUMj4gPjo6X190eXBlCisJY29weShpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVDI+LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVDI+LAorCSAgICAgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQyPik7CisKKyAgICBwcml2YXRlOgorICAgICAgc3RyZWFtYnVmX3R5cGUqCV9NX3NidWY7CisgICAgICBib29sCQlfTV9mYWlsZWQ7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gIENvbnN0cnVjdCBvdXRwdXQgaXRlcmF0b3IgZnJvbSBvc3RyZWFtLgorICAgICAgb3N0cmVhbWJ1Zl9pdGVyYXRvcihvc3RyZWFtX3R5cGUmIF9fcykgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICA6IF9NX3NidWYoX19zLnJkYnVmKCkpLCBfTV9mYWlsZWQoIV9NX3NidWYpIHsgfQorCisgICAgICAvLy8gIENvbnN0cnVjdCBvdXRwdXQgaXRlcmF0b3IgZnJvbSBzdHJlYW1idWYuCisgICAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yKHN0cmVhbWJ1Zl90eXBlKiBfX3MpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgOiBfTV9zYnVmKF9fcyksIF9NX2ZhaWxlZCghX01fc2J1ZikgeyB9CisKKyAgICAgIC8vLyAgV3JpdGUgY2hhcmFjdGVyIHRvIHN0cmVhbWJ1Zi4gIENhbGxzIHN0cmVhbWJ1Zi5zcHV0YygpLgorICAgICAgb3N0cmVhbWJ1Zl9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yPShfQ2hhclQgX19jKQorICAgICAgeworCWlmICghX01fZmFpbGVkICYmCisJICAgIF9UcmFpdHM6OmVxX2ludF90eXBlKF9NX3NidWYtPnNwdXRjKF9fYyksIF9UcmFpdHM6OmVvZigpKSkKKwkgIF9NX2ZhaWxlZCA9IHRydWU7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLy8gUmV0dXJuICp0aGlzLgorICAgICAgb3N0cmVhbWJ1Zl9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKigpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICAvLy8gUmV0dXJuICp0aGlzLgorICAgICAgb3N0cmVhbWJ1Zl9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgLy8vIFJldHVybiAqdGhpcy4KKyAgICAgIG9zdHJlYW1idWZfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBwcmV2aW91cyBvcGVyYXRvcj0oKSBmYWlsZWQuCisgICAgICBib29sCisgICAgICBmYWlsZWQoKSBjb25zdCBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX2ZhaWxlZDsgfQorCisgICAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yJgorICAgICAgX01fcHV0KGNvbnN0IF9DaGFyVCogX193cywgc3RyZWFtc2l6ZSBfX2xlbikKKyAgICAgIHsKKwlpZiAoX19idWlsdGluX2V4cGVjdCghX01fZmFpbGVkLCB0cnVlKQorCSAgICAmJiBfX2J1aWx0aW5fZXhwZWN0KHRoaXMtPl9NX3NidWYtPnNwdXRuKF9fd3MsIF9fbGVuKSAhPSBfX2xlbiwKKwkJCQlmYWxzZSkpCisJICBfTV9mYWlsZWQgPSB0cnVlOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICB9OworCisgIC8vIE92ZXJsb2FkcyBmb3Igc3RyZWFtYnVmIGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19jaGFyPF9DaGFyVD46Ol9fdmFsdWUsCisgICAgCSAgICAgICAgICAgICAgICAgCSAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gPjo6X190eXBlCisgICAgY29weShpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gX19maXJzdCwKKwkgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+IF9fbGFzdCwKKwkgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+IF9fcmVzdWx0KQorICAgIHsKKyAgICAgIGlmIChfX2ZpcnN0Ll9NX3NidWYgJiYgIV9fbGFzdC5fTV9zYnVmICYmICFfX3Jlc3VsdC5fTV9mYWlsZWQpCisJeworCSAgYm9vbCBfX2luZW9mOworCSAgX19jb3B5X3N0cmVhbWJ1ZnNfZW9mKF9fZmlyc3QuX01fc2J1ZiwgX19yZXN1bHQuX01fc2J1ZiwgX19pbmVvZik7CisJICBpZiAoIV9faW5lb2YpCisJICAgIF9fcmVzdWx0Ll9NX2ZhaWxlZCA9IHRydWU7CisJfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICB0ZW1wbGF0ZTxib29sIF9Jc01vdmUsIHR5cGVuYW1lIF9DaGFyVD4KKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfY2hhcjxfQ2hhclQ+OjpfX3ZhbHVlLCAKKyAgICAJCQkJICAgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+OjpfX3R5cGUKKyAgICBfX2NvcHlfbW92ZV9hMihfQ2hhclQqIF9fZmlyc3QsIF9DaGFyVCogX19sYXN0LAorCQkgICBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gX19yZXN1bHQpCisgICAgeworICAgICAgY29uc3Qgc3RyZWFtc2l6ZSBfX251bSA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgICBpZiAoX19udW0gPiAwKQorCV9fcmVzdWx0Ll9NX3B1dChfX2ZpcnN0LCBfX251bSk7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlPGJvb2wgX0lzTW92ZSwgdHlwZW5hbWUgX0NoYXJUPgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19jaGFyPF9DaGFyVD46Ol9fdmFsdWUsCisJCQkJICAgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+OjpfX3R5cGUKKyAgICBfX2NvcHlfbW92ZV9hMihjb25zdCBfQ2hhclQqIF9fZmlyc3QsIGNvbnN0IF9DaGFyVCogX19sYXN0LAorCQkgICBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gX19yZXN1bHQpCisgICAgeworICAgICAgY29uc3Qgc3RyZWFtc2l6ZSBfX251bSA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgICBpZiAoX19udW0gPiAwKQorCV9fcmVzdWx0Ll9NX3B1dChfX2ZpcnN0LCBfX251bSk7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlPGJvb2wgX0lzTW92ZSwgdHlwZW5hbWUgX0NoYXJUPgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19jaGFyPF9DaGFyVD46Ol9fdmFsdWUsIAorICAgIAkJCQkgICAgX0NoYXJUKj46Ol9fdHlwZQorICAgIF9fY29weV9tb3ZlX2EyKGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiBfX2ZpcnN0LAorCQkgICBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gX19sYXN0LCBfQ2hhclQqIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ICAgICAgICAgICAgICAgICAgX19pc19pdGVyYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzX2l0ZXJhdG9yX3R5cGU6OnRyYWl0c190eXBlICAgICB0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc19pdGVyYXRvcl90eXBlOjpzdHJlYW1idWZfdHlwZSAgc3RyZWFtYnVmX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSAgICAgICAgICAgICAgIGludF90eXBlOworCisgICAgICBpZiAoX19maXJzdC5fTV9zYnVmICYmICFfX2xhc3QuX01fc2J1ZikKKwl7CisJICBzdHJlYW1idWZfdHlwZSogX19zYiA9IF9fZmlyc3QuX01fc2J1ZjsKKwkgIGludF90eXBlIF9fYyA9IF9fc2ItPnNnZXRjKCk7CisJICB3aGlsZSAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIHRyYWl0c190eXBlOjplb2YoKSkpCisJICAgIHsKKwkgICAgICBjb25zdCBzdHJlYW1zaXplIF9fbiA9IF9fc2ItPmVncHRyKCkgLSBfX3NiLT5ncHRyKCk7CisJICAgICAgaWYgKF9fbiA+IDEpCisJCXsKKwkJICB0cmFpdHNfdHlwZTo6Y29weShfX3Jlc3VsdCwgX19zYi0+Z3B0cigpLCBfX24pOworCQkgIF9fc2ItPl9fc2FmZV9nYnVtcChfX24pOworCQkgIF9fcmVzdWx0ICs9IF9fbjsKKwkJICBfX2MgPSBfX3NiLT51bmRlcmZsb3coKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgICpfX3Jlc3VsdCsrID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpOworCQkgIF9fYyA9IF9fc2ItPnNuZXh0YygpOworCQl9CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfY2hhcjxfQ2hhclQ+OjpfX3ZhbHVlLAorCQkgIAkJICAgIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+OjpfX3R5cGUKKyAgICBmaW5kKGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiBfX2ZpcnN0LAorCSBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gX19sYXN0LCBjb25zdCBfQ2hhclQmIF9fdmFsKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ICAgICAgICAgICAgICAgICAgX19pc19pdGVyYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzX2l0ZXJhdG9yX3R5cGU6OnRyYWl0c190eXBlICAgICB0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc19pdGVyYXRvcl90eXBlOjpzdHJlYW1idWZfdHlwZSAgc3RyZWFtYnVmX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSAgICAgICAgICAgICAgIGludF90eXBlOworCisgICAgICBpZiAoX19maXJzdC5fTV9zYnVmICYmICFfX2xhc3QuX01fc2J1ZikKKwl7CisJICBjb25zdCBpbnRfdHlwZSBfX2l2YWwgPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoX192YWwpOworCSAgc3RyZWFtYnVmX3R5cGUqIF9fc2IgPSBfX2ZpcnN0Ll9NX3NidWY7CisJICBpbnRfdHlwZSBfX2MgPSBfX3NiLT5zZ2V0YygpOworCSAgd2hpbGUgKCF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCB0cmFpdHNfdHlwZTo6ZW9mKCkpCisJCSAmJiAhdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19pdmFsKSkKKwkgICAgeworCSAgICAgIHN0cmVhbXNpemUgX19uID0gX19zYi0+ZWdwdHIoKSAtIF9fc2ItPmdwdHIoKTsKKwkgICAgICBpZiAoX19uID4gMSkKKwkJeworCQkgIGNvbnN0IF9DaGFyVCogX19wID0gdHJhaXRzX3R5cGU6OmZpbmQoX19zYi0+Z3B0cigpLAorCQkJCQkJCV9fbiwgX192YWwpOworCQkgIGlmIChfX3ApCisJCSAgICBfX24gPSBfX3AgLSBfX3NiLT5ncHRyKCk7CisJCSAgX19zYi0+X19zYWZlX2didW1wKF9fbik7CisJCSAgX19jID0gX19zYi0+c2dldGMoKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJX19jID0gX19zYi0+c25leHRjKCk7CisJICAgIH0KKworCSAgaWYgKCF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorCSAgICBfX2ZpcnN0Ll9NX2MgPSBfX2M7CisJICBlbHNlCisJICAgIF9fZmlyc3QuX01fc2J1ZiA9IDA7CisJfQorICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgfQorCisvLyBAfSBncm91cCBpdGVyYXRvcnMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdHJpbmdmd2QuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy9zdHJpbmdmd2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjAxMTE2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3N0cmluZ2Z3ZC5oCkBAIC0wLDAgKzEsODkgQEAKKy8vIDxzdHJpbmc+IEZvcndhcmQgZGVjbGFyYXRpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL3N0cmluZ2Z3ZC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7c3RyaW5nfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMSBTdHJpbmdzIGxpYnJhcnkKKy8vCisKKyNpZm5kZWYgX1NUUklOR0ZXRF9ICisjZGVmaW5lIF9TVFJJTkdGV0RfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9tZW1vcnlmd2QuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGRlZmdyb3VwIHN0cmluZ3MgU3RyaW5ncworICAgKgorICAgKiAgQHsKKyAgKi8KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQ+CisgICAgc3RydWN0IGNoYXJfdHJhaXRzOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4sCisgICAgICAgICAgIHR5cGVuYW1lIF9BbGxvYyA9IGFsbG9jYXRvcjxfQ2hhclQ+ID4KKyAgICBjbGFzcyBiYXNpY19zdHJpbmc7CisKKyAgdGVtcGxhdGU8PiBzdHJ1Y3QgY2hhcl90cmFpdHM8Y2hhcj47CisKKyAgLy8vIEEgc3RyaW5nIG9mIEBjIGNoYXIKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcj4gICAgc3RyaW5nOyAgIAorCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdGVtcGxhdGU8PiBzdHJ1Y3QgY2hhcl90cmFpdHM8d2NoYXJfdD47CisKKyAgLy8vIEEgc3RyaW5nIG9mIEBjIHdjaGFyX3QKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8d2NoYXJfdD4gd3N0cmluZzsgICAKKyNlbmRpZgorCisjaWYgKChfX2NwbHVzcGx1cyA+PSAyMDExMDNMKSBcCisgICAgICYmIGRlZmluZWQoX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxKSkKKworICB0ZW1wbGF0ZTw+IHN0cnVjdCBjaGFyX3RyYWl0czxjaGFyMTZfdD47CisgIHRlbXBsYXRlPD4gc3RydWN0IGNoYXJfdHJhaXRzPGNoYXIzMl90PjsKKworICAvLy8gQSBzdHJpbmcgb2YgQGMgY2hhcjE2X3QKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcjE2X3Q+IHUxNnN0cmluZzsgCisKKyAgLy8vIEEgc3RyaW5nIG9mIEBjIGNoYXIzMl90CisgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPGNoYXIzMl90PiB1MzJzdHJpbmc7IAorCisjZW5kaWYKKyAgLyoqIEB9ICAqLworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYJLy8gX1NUUklOR0ZXRF9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdW5pcXVlX3B0ci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3VuaXF1ZV9wdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmQ3M2IyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3VuaXF1ZV9wdHIuaApAQCAtMCwwICsxLDYxNSBAQAorLy8gdW5pcXVlX3B0ciBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy91bmlxdWVfcHRyLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXttZW1vcnl9CisgKi8KKworI2lmbmRlZiBfVU5JUVVFX1BUUl9ICisjZGVmaW5lIF9VTklRVUVfUFRSX0ggMQorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dHVwbGU+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgcG9pbnRlcl9hYnN0cmFjdGlvbnMKKyAgICogQHsKKyAgICovCisKKyNpZiBfR0xJQkNYWF9VU0VfREVQUkVDQVRFRAorICB0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgYXV0b19wdHI7CisjZW5kaWYKKworICAvLy8gUHJpbWFyeSB0ZW1wbGF0ZSwgZGVmYXVsdF9kZWxldGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgZGVmYXVsdF9kZWxldGUKKyAgICB7CisgICAgICBjb25zdGV4cHIgZGVmYXVsdF9kZWxldGUoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBlbmFibGVfaWY8aXNfY29udmVydGlibGU8X1VwKiwgX1RwKj46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZGVmYXVsdF9kZWxldGUoY29uc3QgZGVmYXVsdF9kZWxldGU8X1VwPiYpIG5vZXhjZXB0IHsgfQorCisgICAgICB2b2lkCisgICAgICBvcGVyYXRvcigpKF9UcCogX19wdHIpIGNvbnN0CisgICAgICB7CisJc3RhdGljX2Fzc2VydChzaXplb2YoX1RwKT4wLAorCQkgICAgICAiY2FuJ3QgZGVsZXRlIHBvaW50ZXIgdG8gaW5jb21wbGV0ZSB0eXBlIik7CisJZGVsZXRlIF9fcHRyOworICAgICAgfQorICAgIH07CisKKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyBEUiA3NDAgLSBvbWl0IHNwZWNpYWxpemF0aW9uIGZvciBhcnJheSBvYmplY3RzIHdpdGggYSBjb21waWxlIHRpbWUgbGVuZ3RoCisgIC8vLyBTcGVjaWFsaXphdGlvbiwgZGVmYXVsdF9kZWxldGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgZGVmYXVsdF9kZWxldGU8X1RwW10+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisJdXNpbmcgX19yZW1vdmVfY3YgPSB0eXBlbmFtZSByZW1vdmVfY3Y8X1VwPjo6dHlwZTsKKworICAgICAgLy8gTGlrZSBpc19iYXNlX29mPF9UcCwgX1VwPiBidXQgZmFsc2UgaWYgdW5xdWFsaWZpZWQgdHlwZXMgYXJlIHRoZSBzYW1lCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisJdXNpbmcgX19pc19kZXJpdmVkX1RwCisJICA9IF9fYW5kXzwgaXNfYmFzZV9vZjxfVHAsIF9VcD4sCisJCSAgICBfX25vdF88aXNfc2FtZTxfX3JlbW92ZV9jdjxfVHA+LCBfX3JlbW92ZV9jdjxfVXA+Pj4gPjsKKworICAgIHB1YmxpYzoKKyAgICAgIGNvbnN0ZXhwciBkZWZhdWx0X2RlbGV0ZSgpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIGVuYWJsZV9pZjwhX19pc19kZXJpdmVkX1RwPF9VcD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZGVmYXVsdF9kZWxldGUoY29uc3QgZGVmYXVsdF9kZWxldGU8X1VwW10+Jikgbm9leGNlcHQgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIG9wZXJhdG9yKCkoX1RwKiBfX3B0cikgY29uc3QKKyAgICAgIHsKKwlzdGF0aWNfYXNzZXJ0KHNpemVvZihfVHApPjAsCisJCSAgICAgICJjYW4ndCBkZWxldGUgcG9pbnRlciB0byBpbmNvbXBsZXRlIHR5cGUiKTsKKwlkZWxldGUgW10gX19wdHI7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKwl0eXBlbmFtZSBlbmFibGVfaWY8X19pc19kZXJpdmVkX1RwPF9VcD46OnZhbHVlPjo6dHlwZQorCW9wZXJhdG9yKCkoX1VwKikgY29uc3QgPSBkZWxldGU7CisgICAgfTsKKworICAvLy8gMjAuNy4xLjIgdW5pcXVlX3B0ciBmb3Igc2luZ2xlIG9iamVjdHMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcCA9IGRlZmF1bHRfZGVsZXRlPF9UcD4gPgorICAgIGNsYXNzIHVuaXF1ZV9wdHIKKyAgICB7CisgICAgICAvLyB1c2UgU0ZJTkFFIHRvIGRldGVybWluZSB3aGV0aGVyIF9EZWw6OnBvaW50ZXIgZXhpc3RzCisgICAgICBjbGFzcyBfUG9pbnRlcgorICAgICAgeworCXRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKwkgIHN0YXRpYyB0eXBlbmFtZSBfVXA6OnBvaW50ZXIgX190ZXN0KHR5cGVuYW1lIF9VcDo6cG9pbnRlciopOworCisJdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorCSAgc3RhdGljIF9UcCogX190ZXN0KC4uLik7CisKKwl0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X0RwPjo6dHlwZSBfRGVsOworCisgICAgICBwdWJsaWM6CisJdHlwZWRlZiBkZWNsdHlwZShfX3Rlc3Q8X0RlbD4oMCkpIHR5cGU7CisgICAgICB9OworCisgICAgICB0eXBlZGVmIHN0ZDo6dHVwbGU8dHlwZW5hbWUgX1BvaW50ZXI6OnR5cGUsIF9EcD4gIF9fdHVwbGVfdHlwZTsKKyAgICAgIF9fdHVwbGVfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fdDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1BvaW50ZXI6OnR5cGUgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0RwICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVyX3R5cGU7CisKKyAgICAgIC8vIENvbnN0cnVjdG9ycy4KKyAgICAgIGNvbnN0ZXhwciB1bmlxdWVfcHRyKCkgbm9leGNlcHQKKyAgICAgIDogX01fdCgpCisgICAgICB7IHN0YXRpY19hc3NlcnQoIWlzX3BvaW50ZXI8ZGVsZXRlcl90eXBlPjo6dmFsdWUsCisJCSAgICAgImNvbnN0cnVjdGVkIHdpdGggbnVsbCBmdW5jdGlvbiBwb2ludGVyIGRlbGV0ZXIiKTsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgdW5pcXVlX3B0cihwb2ludGVyIF9fcCkgbm9leGNlcHQKKyAgICAgIDogX01fdChfX3AsIGRlbGV0ZXJfdHlwZSgpKQorICAgICAgeyBzdGF0aWNfYXNzZXJ0KCFpc19wb2ludGVyPGRlbGV0ZXJfdHlwZT46OnZhbHVlLAorCQkgICAgICJjb25zdHJ1Y3RlZCB3aXRoIG51bGwgZnVuY3Rpb24gcG9pbnRlciBkZWxldGVyIik7IH0KKworICAgICAgdW5pcXVlX3B0cihwb2ludGVyIF9fcCwKKwkgIHR5cGVuYW1lIGNvbmRpdGlvbmFsPGlzX3JlZmVyZW5jZTxkZWxldGVyX3R5cGU+Ojp2YWx1ZSwKKwkgICAgZGVsZXRlcl90eXBlLCBjb25zdCBkZWxldGVyX3R5cGUmPjo6dHlwZSBfX2QpIG5vZXhjZXB0CisgICAgICA6IF9NX3QoX19wLCBfX2QpIHsgfQorCisgICAgICB1bmlxdWVfcHRyKHBvaW50ZXIgX19wLAorCSAgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxkZWxldGVyX3R5cGU+Ojp0eXBlJiYgX19kKSBub2V4Y2VwdAorICAgICAgOiBfTV90KHN0ZDo6bW92ZShfX3ApLCBzdGQ6Om1vdmUoX19kKSkKKyAgICAgIHsgc3RhdGljX2Fzc2VydCghc3RkOjppc19yZWZlcmVuY2U8ZGVsZXRlcl90eXBlPjo6dmFsdWUsCisJCSAgICAgICJydmFsdWUgZGVsZXRlciBib3VuZCB0byByZWZlcmVuY2UiKTsgfQorCisgICAgICBjb25zdGV4cHIgdW5pcXVlX3B0cihudWxscHRyX3QpIG5vZXhjZXB0IDogdW5pcXVlX3B0cigpIHsgfQorCisgICAgICAvLyBNb3ZlIGNvbnN0cnVjdG9ycy4KKyAgICAgIHVuaXF1ZV9wdHIodW5pcXVlX3B0ciYmIF9fdSkgbm9leGNlcHQKKyAgICAgIDogX01fdChfX3UucmVsZWFzZSgpLCBzdGQ6OmZvcndhcmQ8ZGVsZXRlcl90eXBlPihfX3UuZ2V0X2RlbGV0ZXIoKSkpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXAsIHR5cGVuYW1lIF9FcCwgdHlwZW5hbWUgPSBfUmVxdWlyZTwKKwkgICAgICAgaXNfY29udmVydGlibGU8dHlwZW5hbWUgdW5pcXVlX3B0cjxfVXAsIF9FcD46OnBvaW50ZXIsIHBvaW50ZXI+LAorCSAgICAgICBfX25vdF88aXNfYXJyYXk8X1VwPj4sCisJICAgICAgIHR5cGVuYW1lIGNvbmRpdGlvbmFsPGlzX3JlZmVyZW5jZTxfRHA+Ojp2YWx1ZSwKKwkJCQkgICAgaXNfc2FtZTxfRXAsIF9EcD4sCisJCQkJICAgIGlzX2NvbnZlcnRpYmxlPF9FcCwgX0RwPj46OnR5cGU+PgorCXVuaXF1ZV9wdHIodW5pcXVlX3B0cjxfVXAsIF9FcD4mJiBfX3UpIG5vZXhjZXB0CisJOiBfTV90KF9fdS5yZWxlYXNlKCksIHN0ZDo6Zm9yd2FyZDxfRXA+KF9fdS5nZXRfZGVsZXRlcigpKSkKKwl7IH0KKworI2lmIF9HTElCQ1hYX1VTRV9ERVBSRUNBVEVECisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXAsIHR5cGVuYW1lID0gX1JlcXVpcmU8CisJICAgICAgIGlzX2NvbnZlcnRpYmxlPF9VcCosIF9UcCo+LCBpc19zYW1lPF9EcCwgZGVmYXVsdF9kZWxldGU8X1RwPj4+PgorCXVuaXF1ZV9wdHIoYXV0b19wdHI8X1VwPiYmIF9fdSkgbm9leGNlcHQ7CisjZW5kaWYKKworICAgICAgLy8gRGVzdHJ1Y3Rvci4KKyAgICAgIH51bmlxdWVfcHRyKCkgbm9leGNlcHQKKyAgICAgIHsKKwlhdXRvJiBfX3B0ciA9IHN0ZDo6Z2V0PDA+KF9NX3QpOworCWlmIChfX3B0ciAhPSBudWxscHRyKQorCSAgZ2V0X2RlbGV0ZXIoKShfX3B0cik7CisJX19wdHIgPSBwb2ludGVyKCk7CisgICAgICB9CisKKyAgICAgIC8vIEFzc2lnbm1lbnQuCisgICAgICB1bmlxdWVfcHRyJgorICAgICAgb3BlcmF0b3I9KHVuaXF1ZV9wdHImJiBfX3UpIG5vZXhjZXB0CisgICAgICB7CisJcmVzZXQoX191LnJlbGVhc2UoKSk7CisJZ2V0X2RlbGV0ZXIoKSA9IHN0ZDo6Zm9yd2FyZDxkZWxldGVyX3R5cGU+KF9fdS5nZXRfZGVsZXRlcigpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUgX0VwPgorCXR5cGVuYW1lIGVuYWJsZV9pZjwgX19hbmRfPAorCSAgaXNfY29udmVydGlibGU8dHlwZW5hbWUgdW5pcXVlX3B0cjxfVXAsIF9FcD46OnBvaW50ZXIsIHBvaW50ZXI+LAorCSAgX19ub3RfPGlzX2FycmF5PF9VcD4+CisJICA+Ojp2YWx1ZSwKKwkgIHVuaXF1ZV9wdHImPjo6dHlwZQorCW9wZXJhdG9yPSh1bmlxdWVfcHRyPF9VcCwgX0VwPiYmIF9fdSkgbm9leGNlcHQKKwl7CisJICByZXNldChfX3UucmVsZWFzZSgpKTsKKwkgIGdldF9kZWxldGVyKCkgPSBzdGQ6OmZvcndhcmQ8X0VwPihfX3UuZ2V0X2RlbGV0ZXIoKSk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB1bmlxdWVfcHRyJgorICAgICAgb3BlcmF0b3I9KG51bGxwdHJfdCkgbm9leGNlcHQKKyAgICAgIHsKKwlyZXNldCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8gT2JzZXJ2ZXJzLgorICAgICAgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8ZWxlbWVudF90eXBlPjo6dHlwZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoZ2V0KCkgIT0gcG9pbnRlcigpKTsKKwlyZXR1cm4gKmdldCgpOworICAgICAgfQorCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoZ2V0KCkgIT0gcG9pbnRlcigpKTsKKwlyZXR1cm4gZ2V0KCk7CisgICAgICB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIGdldCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6OmdldDwwPihfTV90KTsgfQorCisgICAgICBkZWxldGVyX3R5cGUmCisgICAgICBnZXRfZGVsZXRlcigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6OmdldDwxPihfTV90KTsgfQorCisgICAgICBjb25zdCBkZWxldGVyX3R5cGUmCisgICAgICBnZXRfZGVsZXRlcigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6OmdldDwxPihfTV90KTsgfQorCisgICAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGdldCgpID09IHBvaW50ZXIoKSA/IGZhbHNlIDogdHJ1ZTsgfQorCisgICAgICAvLyBNb2RpZmllcnMuCisgICAgICBwb2ludGVyCisgICAgICByZWxlYXNlKCkgbm9leGNlcHQKKyAgICAgIHsKKwlwb2ludGVyIF9fcCA9IGdldCgpOworCXN0ZDo6Z2V0PDA+KF9NX3QpID0gcG9pbnRlcigpOworCXJldHVybiBfX3A7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KHBvaW50ZXIgX19wID0gcG9pbnRlcigpKSBub2V4Y2VwdAorICAgICAgeworCXVzaW5nIHN0ZDo6c3dhcDsKKwlzd2FwKHN0ZDo6Z2V0PDA+KF9NX3QpLCBfX3ApOworCWlmIChfX3AgIT0gcG9pbnRlcigpKQorCSAgZ2V0X2RlbGV0ZXIoKShfX3ApOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHVuaXF1ZV9wdHImIF9fdSkgbm9leGNlcHQKKyAgICAgIHsKKwl1c2luZyBzdGQ6OnN3YXA7CisJc3dhcChfTV90LCBfX3UuX01fdCk7CisgICAgICB9CisKKyAgICAgIC8vIERpc2FibGUgY29weSBmcm9tIGx2YWx1ZS4KKyAgICAgIHVuaXF1ZV9wdHIoY29uc3QgdW5pcXVlX3B0ciYpID0gZGVsZXRlOworICAgICAgdW5pcXVlX3B0ciYgb3BlcmF0b3I9KGNvbnN0IHVuaXF1ZV9wdHImKSA9IGRlbGV0ZTsKKyAgfTsKKworICAvLy8gMjAuNy4xLjMgdW5pcXVlX3B0ciBmb3IgYXJyYXkgb2JqZWN0cyB3aXRoIGEgcnVudGltZSBsZW5ndGgKKyAgLy8gW3VuaXF1ZS5wdHIucnVudGltZV0KKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyBEUiA3NDAgLSBvbWl0IHNwZWNpYWxpemF0aW9uIGZvciBhcnJheSBvYmplY3RzIHdpdGggYSBjb21waWxlIHRpbWUgbGVuZ3RoCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RwPgorICAgIGNsYXNzIHVuaXF1ZV9wdHI8X1RwW10sIF9EcD4KKyAgICB7CisgICAgICAvLyB1c2UgU0ZJTkFFIHRvIGRldGVybWluZSB3aGV0aGVyIF9EZWw6OnBvaW50ZXIgZXhpc3RzCisgICAgICBjbGFzcyBfUG9pbnRlcgorICAgICAgeworCXRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKwkgIHN0YXRpYyB0eXBlbmFtZSBfVXA6OnBvaW50ZXIgX190ZXN0KHR5cGVuYW1lIF9VcDo6cG9pbnRlciopOworCisJdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorCSAgc3RhdGljIF9UcCogX190ZXN0KC4uLik7CisKKwl0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X0RwPjo6dHlwZSBfRGVsOworCisgICAgICBwdWJsaWM6CisJdHlwZWRlZiBkZWNsdHlwZShfX3Rlc3Q8X0RlbD4oMCkpIHR5cGU7CisgICAgICB9OworCisgICAgICB0eXBlZGVmIHN0ZDo6dHVwbGU8dHlwZW5hbWUgX1BvaW50ZXI6OnR5cGUsIF9EcD4gIF9fdHVwbGVfdHlwZTsKKyAgICAgIF9fdHVwbGVfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fdDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorCXVzaW5nIF9fcmVtb3ZlX2N2ID0gdHlwZW5hbWUgcmVtb3ZlX2N2PF9VcD46OnR5cGU7CisKKyAgICAgIC8vIGxpa2UgaXNfYmFzZV9vZjxfVHAsIF9VcD4gYnV0IGZhbHNlIGlmIHVucXVhbGlmaWVkIHR5cGVzIGFyZSB0aGUgc2FtZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorCXVzaW5nIF9faXNfZGVyaXZlZF9UcAorCSAgPSBfX2FuZF88IGlzX2Jhc2Vfb2Y8X1RwLCBfVXA+LAorCQkgICAgX19ub3RfPGlzX3NhbWU8X19yZW1vdmVfY3Y8X1RwPiwgX19yZW1vdmVfY3Y8X1VwPj4+ID47CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUgX0VwLAorCSAgICAgICB0eXBlbmFtZSBfVHBfcG9pbnRlciA9IHR5cGVuYW1lIF9Qb2ludGVyOjp0eXBlLAorCSAgICAgICB0eXBlbmFtZSBfVXBfcG9pbnRlciA9IHR5cGVuYW1lIHVuaXF1ZV9wdHI8X1VwLCBfRXA+Ojpwb2ludGVyPgorCXVzaW5nIF9fc2FmZV9jb252ZXJzaW9uID0gX19hbmRfPAorCSAgICBpc19jb252ZXJ0aWJsZTxfVXBfcG9pbnRlciwgX1RwX3BvaW50ZXI+LAorCSAgICBpc19hcnJheTxfVXA+LAorCSAgICBfX29yXzxfX25vdF88aXNfcG9pbnRlcjxfVXBfcG9pbnRlcj4+LAorCQkgIF9fbm90Xzxpc19wb2ludGVyPF9UcF9wb2ludGVyPj4sCisJCSAgX19ub3RfPF9faXNfZGVyaXZlZF9UcDx0eXBlbmFtZSByZW1vdmVfZXh0ZW50PF9VcD46OnR5cGU+PgorCSAgICA+CisJICA+OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUG9pbnRlcjo6dHlwZQlwb2ludGVyOworICAgICAgdHlwZWRlZiBfVHAJCSAJZWxlbWVudF90eXBlOworICAgICAgdHlwZWRlZiBfRHAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZXJfdHlwZTsKKworICAgICAgLy8gQ29uc3RydWN0b3JzLgorICAgICAgY29uc3RleHByIHVuaXF1ZV9wdHIoKSBub2V4Y2VwdAorICAgICAgOiBfTV90KCkKKyAgICAgIHsgc3RhdGljX2Fzc2VydCghc3RkOjppc19wb2ludGVyPGRlbGV0ZXJfdHlwZT46OnZhbHVlLAorCQkgICAgICAiY29uc3RydWN0ZWQgd2l0aCBudWxsIGZ1bmN0aW9uIHBvaW50ZXIgZGVsZXRlciIpOyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB1bmlxdWVfcHRyKHBvaW50ZXIgX19wKSBub2V4Y2VwdAorICAgICAgOiBfTV90KF9fcCwgZGVsZXRlcl90eXBlKCkpCisgICAgICB7IHN0YXRpY19hc3NlcnQoIWlzX3BvaW50ZXI8ZGVsZXRlcl90eXBlPjo6dmFsdWUsCisJCSAgICAgICJjb25zdHJ1Y3RlZCB3aXRoIG51bGwgZnVuY3Rpb24gcG9pbnRlciBkZWxldGVyIik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwLCB0eXBlbmFtZSA9IF9SZXF1aXJlPGlzX3BvaW50ZXI8cG9pbnRlcj4sCisJICAgICAgIGlzX2NvbnZlcnRpYmxlPF9VcCosIHBvaW50ZXI+LCBfX2lzX2Rlcml2ZWRfVHA8X1VwPj4+CisJZXhwbGljaXQKKwl1bmlxdWVfcHRyKF9VcCogX19wKSA9IGRlbGV0ZTsKKworICAgICAgdW5pcXVlX3B0cihwb2ludGVyIF9fcCwKKwkgIHR5cGVuYW1lIGNvbmRpdGlvbmFsPGlzX3JlZmVyZW5jZTxkZWxldGVyX3R5cGU+Ojp2YWx1ZSwKKwkgICAgICBkZWxldGVyX3R5cGUsIGNvbnN0IGRlbGV0ZXJfdHlwZSY+Ojp0eXBlIF9fZCkgbm9leGNlcHQKKyAgICAgIDogX01fdChfX3AsIF9fZCkgeyB9CisKKyAgICAgIHVuaXF1ZV9wdHIocG9pbnRlciBfX3AsIHR5cGVuYW1lCisJCSByZW1vdmVfcmVmZXJlbmNlPGRlbGV0ZXJfdHlwZT46OnR5cGUmJiBfX2QpIG5vZXhjZXB0CisgICAgICA6IF9NX3Qoc3RkOjptb3ZlKF9fcCksIHN0ZDo6bW92ZShfX2QpKQorICAgICAgeyBzdGF0aWNfYXNzZXJ0KCFpc19yZWZlcmVuY2U8ZGVsZXRlcl90eXBlPjo6dmFsdWUsCisJCSAgICAgICJydmFsdWUgZGVsZXRlciBib3VuZCB0byByZWZlcmVuY2UiKTsgfQorCisgICAgICAvLyBNb3ZlIGNvbnN0cnVjdG9yLgorICAgICAgdW5pcXVlX3B0cih1bmlxdWVfcHRyJiYgX191KSBub2V4Y2VwdAorICAgICAgOiBfTV90KF9fdS5yZWxlYXNlKCksIHN0ZDo6Zm9yd2FyZDxkZWxldGVyX3R5cGU+KF9fdS5nZXRfZGVsZXRlcigpKSkgeyB9CisKKyAgICAgIGNvbnN0ZXhwciB1bmlxdWVfcHRyKG51bGxwdHJfdCkgbm9leGNlcHQgOiB1bmlxdWVfcHRyKCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUgX0VwLAorCSAgICAgICB0eXBlbmFtZSA9IF9SZXF1aXJlPF9fc2FmZV9jb252ZXJzaW9uPF9VcCwgX0VwPiwKKwkJIHR5cGVuYW1lIGNvbmRpdGlvbmFsPGlzX3JlZmVyZW5jZTxfRHA+Ojp2YWx1ZSwKKwkJCQkgICAgICBpc19zYW1lPF9FcCwgX0RwPiwKKwkJCQkgICAgICBpc19jb252ZXJ0aWJsZTxfRXAsIF9EcD4+Ojp0eXBlCisJICAgICAgID4+CisJdW5pcXVlX3B0cih1bmlxdWVfcHRyPF9VcCwgX0VwPiYmIF9fdSkgbm9leGNlcHQKKwk6IF9NX3QoX191LnJlbGVhc2UoKSwgc3RkOjpmb3J3YXJkPF9FcD4oX191LmdldF9kZWxldGVyKCkpKQorCXsgfQorCisgICAgICAvLyBEZXN0cnVjdG9yLgorICAgICAgfnVuaXF1ZV9wdHIoKQorICAgICAgeworCWF1dG8mIF9fcHRyID0gc3RkOjpnZXQ8MD4oX01fdCk7CisJaWYgKF9fcHRyICE9IG51bGxwdHIpCisJICBnZXRfZGVsZXRlcigpKF9fcHRyKTsKKwlfX3B0ciA9IHBvaW50ZXIoKTsKKyAgICAgIH0KKworICAgICAgLy8gQXNzaWdubWVudC4KKyAgICAgIHVuaXF1ZV9wdHImCisgICAgICBvcGVyYXRvcj0odW5pcXVlX3B0ciYmIF9fdSkgbm9leGNlcHQKKyAgICAgIHsKKwlyZXNldChfX3UucmVsZWFzZSgpKTsKKwlnZXRfZGVsZXRlcigpID0gc3RkOjpmb3J3YXJkPGRlbGV0ZXJfdHlwZT4oX191LmdldF9kZWxldGVyKCkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwLCB0eXBlbmFtZSBfRXA+CisJdHlwZW5hbWUKKwllbmFibGVfaWY8X19zYWZlX2NvbnZlcnNpb248X1VwLCBfRXA+Ojp2YWx1ZSwgdW5pcXVlX3B0ciY+Ojp0eXBlCisJb3BlcmF0b3I9KHVuaXF1ZV9wdHI8X1VwLCBfRXA+JiYgX191KSBub2V4Y2VwdAorCXsKKwkgIHJlc2V0KF9fdS5yZWxlYXNlKCkpOworCSAgZ2V0X2RlbGV0ZXIoKSA9IHN0ZDo6Zm9yd2FyZDxfRXA+KF9fdS5nZXRfZGVsZXRlcigpKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHVuaXF1ZV9wdHImCisgICAgICBvcGVyYXRvcj0obnVsbHB0cl90KSBub2V4Y2VwdAorICAgICAgeworCXJlc2V0KCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLyBPYnNlcnZlcnMuCisgICAgICB0eXBlbmFtZSBzdGQ6OmFkZF9sdmFsdWVfcmVmZXJlbmNlPGVsZW1lbnRfdHlwZT46OnR5cGUKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90IF9faSkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoZ2V0KCkgIT0gcG9pbnRlcigpKTsKKwlyZXR1cm4gZ2V0KClbX19pXTsKKyAgICAgIH0KKworICAgICAgcG9pbnRlcgorICAgICAgZ2V0KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6Z2V0PDA+KF9NX3QpOyB9CisKKyAgICAgIGRlbGV0ZXJfdHlwZSYKKyAgICAgIGdldF9kZWxldGVyKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6Z2V0PDE+KF9NX3QpOyB9CisKKyAgICAgIGNvbnN0IGRlbGV0ZXJfdHlwZSYKKyAgICAgIGdldF9kZWxldGVyKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6Z2V0PDE+KF9NX3QpOyB9CisKKyAgICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gZ2V0KCkgPT0gcG9pbnRlcigpID8gZmFsc2UgOiB0cnVlOyB9CisKKyAgICAgIC8vIE1vZGlmaWVycy4KKyAgICAgIHBvaW50ZXIKKyAgICAgIHJlbGVhc2UoKSBub2V4Y2VwdAorICAgICAgeworCXBvaW50ZXIgX19wID0gZ2V0KCk7CisJc3RkOjpnZXQ8MD4oX01fdCkgPSBwb2ludGVyKCk7CisJcmV0dXJuIF9fcDsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVzZXQoKSBub2V4Y2VwdAorICAgICAgeyByZXNldChwb2ludGVyKCkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KHBvaW50ZXIgX19wKSBub2V4Y2VwdAorICAgICAgeworCXVzaW5nIHN0ZDo6c3dhcDsKKwlzd2FwKHN0ZDo6Z2V0PDA+KF9NX3QpLCBfX3ApOworCWlmIChfX3AgIT0gbnVsbHB0cikKKwkgIGdldF9kZWxldGVyKCkoX19wKTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwLCB0eXBlbmFtZSA9IF9SZXF1aXJlPGlzX3BvaW50ZXI8cG9pbnRlcj4sCisJICAgICAgIGlzX2NvbnZlcnRpYmxlPF9VcCosIHBvaW50ZXI+LCBfX2lzX2Rlcml2ZWRfVHA8X1VwPj4+CisJdm9pZCByZXNldChfVXAqKSA9IGRlbGV0ZTsKKworICAgICAgdm9pZAorICAgICAgc3dhcCh1bmlxdWVfcHRyJiBfX3UpIG5vZXhjZXB0CisgICAgICB7CisJdXNpbmcgc3RkOjpzd2FwOworCXN3YXAoX01fdCwgX191Ll9NX3QpOworICAgICAgfQorCisgICAgICAvLyBEaXNhYmxlIGNvcHkgZnJvbSBsdmFsdWUuCisgICAgICB1bmlxdWVfcHRyKGNvbnN0IHVuaXF1ZV9wdHImKSA9IGRlbGV0ZTsKKyAgICAgIHVuaXF1ZV9wdHImIG9wZXJhdG9yPShjb25zdCB1bmlxdWVfcHRyJikgPSBkZWxldGU7CisKKyAgICAgIC8vIERpc2FibGUgY29uc3RydWN0aW9uIGZyb20gY29udmVydGlibGUgcG9pbnRlciB0eXBlcy4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUgPSBfUmVxdWlyZTxpc19wb2ludGVyPHBvaW50ZXI+LAorCSAgICAgICBpc19jb252ZXJ0aWJsZTxfVXAqLCBwb2ludGVyPiwgX19pc19kZXJpdmVkX1RwPF9VcD4+PgorCXVuaXF1ZV9wdHIoX1VwKiwgdHlwZW5hbWUKKwkJICAgY29uZGl0aW9uYWw8aXNfcmVmZXJlbmNlPGRlbGV0ZXJfdHlwZT46OnZhbHVlLAorCQkgICBkZWxldGVyX3R5cGUsIGNvbnN0IGRlbGV0ZXJfdHlwZSY+Ojp0eXBlKSA9IGRlbGV0ZTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwLCB0eXBlbmFtZSA9IF9SZXF1aXJlPGlzX3BvaW50ZXI8cG9pbnRlcj4sCisJICAgICAgIGlzX2NvbnZlcnRpYmxlPF9VcCosIHBvaW50ZXI+LCBfX2lzX2Rlcml2ZWRfVHA8X1VwPj4+CisJdW5pcXVlX3B0cihfVXAqLCB0eXBlbmFtZQorCQkgICByZW1vdmVfcmVmZXJlbmNlPGRlbGV0ZXJfdHlwZT46OnR5cGUmJikgPSBkZWxldGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feCwKKwkgdW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feSkgbm9leGNlcHQKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcCwKKwkgICB0eXBlbmFtZSBfVXAsIHR5cGVuYW1lIF9FcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feCwKKwkgICAgICAgY29uc3QgdW5pcXVlX3B0cjxfVXAsIF9FcD4mIF9feSkKKyAgICB7IHJldHVybiBfX3guZ2V0KCkgPT0gX195LmdldCgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHVuaXF1ZV9wdHI8X1RwLCBfRHA+JiBfX3gsIG51bGxwdHJfdCkgbm9leGNlcHQKKyAgICB7IHJldHVybiAhX194OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KG51bGxwdHJfdCwgY29uc3QgdW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feCkgbm9leGNlcHQKKyAgICB7IHJldHVybiAhX194OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHAsCisJICAgdHlwZW5hbWUgX1VwLCB0eXBlbmFtZSBfRXA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHVuaXF1ZV9wdHI8X1RwLCBfRHA+JiBfX3gsCisJICAgICAgIGNvbnN0IHVuaXF1ZV9wdHI8X1VwLCBfRXA+JiBfX3kpCisgICAgeyByZXR1cm4gX194LmdldCgpICE9IF9feS5nZXQoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB1bmlxdWVfcHRyPF9UcCwgX0RwPiYgX194LCBudWxscHRyX3QpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gKGJvb2wpX194OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KG51bGxwdHJfdCwgY29uc3QgdW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feCkgbm9leGNlcHQKKyAgICB7IHJldHVybiAoYm9vbClfX3g7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcCwKKwkgICB0eXBlbmFtZSBfVXAsIHR5cGVuYW1lIF9FcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCB1bmlxdWVfcHRyPF9UcCwgX0RwPiYgX194LAorCSAgICAgIGNvbnN0IHVuaXF1ZV9wdHI8X1VwLCBfRXA+JiBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZQorCXN0ZDo6Y29tbW9uX3R5cGU8dHlwZW5hbWUgdW5pcXVlX3B0cjxfVHAsIF9EcD46OnBvaW50ZXIsCisJICAgICAgICAgICAgICAgICB0eXBlbmFtZSB1bmlxdWVfcHRyPF9VcCwgX0VwPjo6cG9pbnRlcj46OnR5cGUgX0NUOworICAgICAgcmV0dXJuIHN0ZDo6bGVzczxfQ1Q+KCkoX194LmdldCgpLCBfX3kuZ2V0KCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCB1bmlxdWVfcHRyPF9UcCwgX0RwPiYgX194LCBudWxscHRyX3QpCisgICAgeyByZXR1cm4gc3RkOjpsZXNzPHR5cGVuYW1lIHVuaXF1ZV9wdHI8X1RwLCBfRHA+Ojpwb2ludGVyPigpKF9feC5nZXQoKSwKKwkJCQkJCQkJIG51bGxwdHIpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwobnVsbHB0cl90LCBjb25zdCB1bmlxdWVfcHRyPF9UcCwgX0RwPiYgX194KQorICAgIHsgcmV0dXJuIHN0ZDo6bGVzczx0eXBlbmFtZSB1bmlxdWVfcHRyPF9UcCwgX0RwPjo6cG9pbnRlcj4oKShudWxscHRyLAorCQkJCQkJCQkgX194LmdldCgpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RwLAorCSAgIHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUgX0VwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCB1bmlxdWVfcHRyPF9UcCwgX0RwPiYgX194LAorCSAgICAgICBjb25zdCB1bmlxdWVfcHRyPF9VcCwgX0VwPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCB1bmlxdWVfcHRyPF9UcCwgX0RwPiYgX194LCBudWxscHRyX3QpCisgICAgeyByZXR1cm4gIShudWxscHRyIDwgX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShudWxscHRyX3QsIGNvbnN0IHVuaXF1ZV9wdHI8X1RwLCBfRHA+JiBfX3gpCisgICAgeyByZXR1cm4gIShfX3ggPCBudWxscHRyKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RwLAorCSAgIHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUgX0VwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHVuaXF1ZV9wdHI8X1RwLCBfRHA+JiBfX3gsCisJICAgICAgY29uc3QgdW5pcXVlX3B0cjxfVXAsIF9FcD4mIF9feSkKKyAgICB7IHJldHVybiAoX195IDwgX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHVuaXF1ZV9wdHI8X1RwLCBfRHA+JiBfX3gsIG51bGxwdHJfdCkKKyAgICB7IHJldHVybiBzdGQ6Omxlc3M8dHlwZW5hbWUgdW5pcXVlX3B0cjxfVHAsIF9EcD46OnBvaW50ZXI+KCkobnVsbHB0ciwKKwkJCQkJCQkJIF9feC5nZXQoKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihudWxscHRyX3QsIGNvbnN0IHVuaXF1ZV9wdHI8X1RwLCBfRHA+JiBfX3gpCisgICAgeyByZXR1cm4gc3RkOjpsZXNzPHR5cGVuYW1lIHVuaXF1ZV9wdHI8X1RwLCBfRHA+Ojpwb2ludGVyPigpKF9feC5nZXQoKSwKKwkJCQkJCQkJIG51bGxwdHIpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHAsCisJICAgdHlwZW5hbWUgX1VwLCB0eXBlbmFtZSBfRXA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHVuaXF1ZV9wdHI8X1RwLCBfRHA+JiBfX3gsCisJICAgICAgIGNvbnN0IHVuaXF1ZV9wdHI8X1VwLCBfRXA+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHVuaXF1ZV9wdHI8X1RwLCBfRHA+JiBfX3gsIG51bGxwdHJfdCkKKyAgICB7IHJldHVybiAhKF9feCA8IG51bGxwdHIpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KG51bGxwdHJfdCwgY29uc3QgdW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feCkKKyAgICB7IHJldHVybiAhKG51bGxwdHIgPCBfX3gpOyB9CisKKyAgLy8vIHN0ZDo6aGFzaCBzcGVjaWFsaXphdGlvbiBmb3IgdW5pcXVlX3B0ci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHA+CisgICAgc3RydWN0IGhhc2g8dW5pcXVlX3B0cjxfVHAsIF9EcD4+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCB1bmlxdWVfcHRyPF9UcCwgX0RwPj4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgdW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9fdSkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsKKwl0eXBlZGVmIHVuaXF1ZV9wdHI8X1RwLCBfRHA+IF9VUDsKKwlyZXR1cm4gc3RkOjpoYXNoPHR5cGVuYW1lIF9VUDo6cG9pbnRlcj4oKShfX3UuZ2V0KCkpOworICAgICAgfQorICAgIH07CisKKyAgLy8gQH0gZ3JvdXAgcG9pbnRlcl9hYnN0cmFjdGlvbnMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX1VOSVFVRV9QVFJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3Vub3JkZXJlZF9tYXAuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy91bm9yZGVyZWRfbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4NWUyNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy91bm9yZGVyZWRfbWFwLmgKQEAgLTAsMCArMSwxNDEzIEBACisvLyB1bm9yZGVyZWRfbWFwIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL3Vub3JkZXJlZF9tYXAuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3Vub3JkZXJlZF9tYXB9CisgKi8KKworI2lmbmRlZiBfVU5PUkRFUkVEX01BUF9ICisjZGVmaW5lIF9VTk9SREVSRURfTUFQX0gKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyAgLy8vIEJhc2UgdHlwZXMgZm9yIHVub3JkZXJlZF9tYXAuCisgIHRlbXBsYXRlPGJvb2wgX0NhY2hlPgorICAgIHVzaW5nIF9fdW1hcF90cmFpdHMgPSBfX2RldGFpbDo6X0hhc2h0YWJsZV90cmFpdHM8X0NhY2hlLCBmYWxzZSwgdHJ1ZT47CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwKKwkgICB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0hhc2ggPSBoYXNoPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9QcmVkID0gc3RkOjplcXVhbF90bzxfS2V5PiwKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+LAorCSAgIHR5cGVuYW1lIF9UciA9IF9fdW1hcF90cmFpdHM8X19jYWNoZV9kZWZhdWx0PF9LZXksIF9IYXNoPjo6dmFsdWU+PgorICAgIHVzaW5nIF9fdW1hcF9oYXNodGFibGUgPSBfSGFzaHRhYmxlPF9LZXksIHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvYywgX19kZXRhaWw6Ol9TZWxlY3Qxc3QsCisJCQkJICAgICAgICBfUHJlZCwgX0hhc2gsCisJCQkJICAgICAgICBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nLAorCQkJCSAgICAgICAgX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoLAorCQkJCSAgICAgICAgX19kZXRhaWw6Ol9QcmltZV9yZWhhc2hfcG9saWN5LCBfVHI+OworCisgIC8vLyBCYXNlIHR5cGVzIGZvciB1bm9yZGVyZWRfbXVsdGltYXAuCisgIHRlbXBsYXRlPGJvb2wgX0NhY2hlPgorICAgIHVzaW5nIF9fdW1tYXBfdHJhaXRzID0gX19kZXRhaWw6Ol9IYXNodGFibGVfdHJhaXRzPF9DYWNoZSwgZmFsc2UsIGZhbHNlPjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LAorCSAgIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfSGFzaCA9IGhhc2g8X0tleT4sCisJICAgdHlwZW5hbWUgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4sCisJICAgdHlwZW5hbWUgX1RyID0gX191bW1hcF90cmFpdHM8X19jYWNoZV9kZWZhdWx0PF9LZXksIF9IYXNoPjo6dmFsdWU+PgorICAgIHVzaW5nIF9fdW1tYXBfaGFzaHRhYmxlID0gX0hhc2h0YWJsZTxfS2V5LCBzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiwKKwkJCQkJIF9BbGxvYywgX19kZXRhaWw6Ol9TZWxlY3Qxc3QsCisJCQkJCSBfUHJlZCwgX0hhc2gsCisJCQkJCSBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nLAorCQkJCQkgX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoLAorCQkJCQkgX19kZXRhaWw6Ol9QcmltZV9yZWhhc2hfcG9saWN5LCBfVHI+OworCisgIC8qKgorICAgKiAgQGJyaWVmIEEgc3RhbmRhcmQgY29udGFpbmVyIGNvbXBvc2VkIG9mIHVuaXF1ZSBrZXlzIChjb250YWluaW5nCisgICAqICBhdCBtb3N0IG9uZSBvZiBlYWNoIGtleSB2YWx1ZSkgdGhhdCBhc3NvY2lhdGVzIHZhbHVlcyBvZiBhbm90aGVyIHR5cGUKKyAgICogIHdpdGggdGhlIGtleXMuCisgICAqCisgICAqICBAaW5ncm91cCB1bm9yZGVyZWRfYXNzb2NpYXRpdmVfY29udGFpbmVycworICAgKgorICAgKiAgQHRwYXJhbSAgX0tleSAgVHlwZSBvZiBrZXkgb2JqZWN0cy4KKyAgICogIEB0cGFyYW0gIF9UcCAgVHlwZSBvZiBtYXBwZWQgb2JqZWN0cy4KKyAgICogIEB0cGFyYW0gIF9IYXNoICBIYXNoaW5nIGZ1bmN0aW9uIG9iamVjdCB0eXBlLCBkZWZhdWx0cyB0byBoYXNoPF9WYWx1ZT4uCisgICAqICBAdHBhcmFtICBfUHJlZCAgUHJlZGljYXRlIGZ1bmN0aW9uIG9iamVjdCB0eXBlLCBkZWZhdWx0cworICAgKiAgICAgICAgICAgICAgICAgIHRvIGVxdWFsX3RvPF9WYWx1ZT4uCisgICAqICBAdHBhcmFtICBfQWxsb2MgIEFsbG9jYXRvciB0eXBlLCBkZWZhdWx0cyB0byBhbGxvY2F0b3I8X0tleT4uCisgICAqCisgICAqICBNZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sIGFuZAorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjeHgiPnVub3JkZXJlZCBhc3NvY2lhdGl2ZSBjb250YWluZXI8L2E+CisgICAqCisgICAqIFRoZSByZXN1bHRpbmcgdmFsdWUgdHlwZSBvZiB0aGUgY29udGFpbmVyIGlzIHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+LgorICAgKgorICAgKiAgQmFzZSBpcyBfSGFzaHRhYmxlLCBkaXNwYXRjaGVkIGF0IGNvbXBpbGUgdGltZSB2aWEgdGVtcGxhdGUKKyAgICogIGFsaWFzIF9fdW1hcF9oYXNodGFibGUuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsCisJICAgY2xhc3MgX0hhc2ggPSBoYXNoPF9LZXk+LAorCSAgIGNsYXNzIF9QcmVkID0gc3RkOjplcXVhbF90bzxfS2V5PiwKKwkgICBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+ID4KKyAgICBjbGFzcyB1bm9yZGVyZWRfbWFwIDogX19jaGVja19jb3B5X2NvbnN0cnVjdGlibGU8X0FsbG9jPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX191bWFwX2hhc2h0YWJsZTxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiAgX0hhc2h0YWJsZTsKKyAgICAgIF9IYXNodGFibGUgX01faDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVkZWZzOgorICAgICAgLy9AeworICAgICAgLy8vIFB1YmxpYyB0eXBlZGVmcy4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6a2V5X3R5cGUJa2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OnZhbHVlX3R5cGUJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6bWFwcGVkX3R5cGUJbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6Omhhc2hlcgloYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmtleV9lcXVhbAlrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvLy8gIEl0ZXJhdG9yLXJlbGF0ZWQgdHlwZWRlZnMuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpwb2ludGVyCQlwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6Y29uc3RfcG9pbnRlcgljb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6cmVmZXJlbmNlCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OmNvbnN0X3JlZmVyZW5jZQljb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6Oml0ZXJhdG9yCQlpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6Y29uc3RfaXRlcmF0b3IJY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmxvY2FsX2l0ZXJhdG9yCWxvY2FsX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjpjb25zdF9sb2NhbF9pdGVyYXRvcgljb25zdF9sb2NhbF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6c2l6ZV90eXBlCQlzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmRpZmZlcmVuY2VfdHlwZQlkaWZmZXJlbmNlX3R5cGU7CisgICAgICAvL0B9CisKKyAgICAgIC8vY29uc3RydWN0L2Rlc3Ryb3kvY29weQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IgY3JlYXRlcyBubyBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gX19uICBJbml0aWFsIG51bWJlciBvZiBidWNrZXRzLgorICAgICAgICogIEBwYXJhbSBfX2hmICBBIGhhc2ggZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gX19lcWwgIEEga2V5IGVxdWFsaXR5IGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHVub3JkZXJlZF9tYXAoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01faChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYW4gJXVub3JkZXJlZF9tYXAgZnJvbSBhIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSBfX24gIE1pbmltYWwgaW5pdGlhbCBudW1iZXIgb2YgYnVja2V0cy4KKyAgICAgICAqICBAcGFyYW0gX19oZiAgQSBoYXNoIGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fZXFsICBBIGtleSBlcXVhbGl0eSBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhbiAldW5vcmRlcmVkX21hcCBjb25zaXN0aW5nIG9mIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgZnJvbQorICAgICAgICogIFtfX2ZpcnN0LF9fbGFzdCkuICBUaGlzIGlzIGxpbmVhciBpbiBOICh3aGVyZSBOIGlzCisgICAgICAgKiAgZGlzdGFuY2UoX19maXJzdCxfX2xhc3QpKS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJdW5vcmRlcmVkX21hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKwkJICAgICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCSAgICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX01faChfX2YsIF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKQorCXsgfQorCisgICAgICAvLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgICAgIHVub3JkZXJlZF9tYXAoY29uc3QgdW5vcmRlcmVkX21hcCYpID0gZGVmYXVsdDsKKworICAgICAgLy8vIE1vdmUgY29uc3RydWN0b3IuCisgICAgICB1bm9yZGVyZWRfbWFwKHVub3JkZXJlZF9tYXAmJikgPSBkZWZhdWx0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhbiAldW5vcmRlcmVkX21hcCBmcm9tIGFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTWluaW1hbCBpbml0aWFsIG51bWJlciBvZiBidWNrZXRzLgorICAgICAgICogIEBwYXJhbSBfX2hmICBBIGhhc2ggZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gX19lcWwgIEEga2V5IGVxdWFsaXR5IGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhbiAldW5vcmRlcmVkX21hcCBjb25zaXN0aW5nIG9mIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlCisgICAgICAgKiAgbGlzdC4gVGhpcyBpcyBsaW5lYXIgaW4gTiAod2hlcmUgTiBpcyBAYSBfX2wuc2l6ZSgpKS4KKyAgICAgICAqLworICAgICAgdW5vcmRlcmVkX21hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkJICAgIHNpemVfdHlwZSBfX24gPSAwLAorCQkgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9NX2goX19sLCBfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7IH0KKworICAgICAgLy8vIENvcHkgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgIHVub3JkZXJlZF9tYXAmCisgICAgICBvcGVyYXRvcj0oY29uc3QgdW5vcmRlcmVkX21hcCYpID0gZGVmYXVsdDsKKworICAgICAgLy8vIE1vdmUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgIHVub3JkZXJlZF9tYXAmCisgICAgICBvcGVyYXRvcj0odW5vcmRlcmVkX21hcCYmKSA9IGRlZmF1bHQ7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJVVub3JkZXJlZF9tYXAgbGlzdCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19sICBBbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGFuICV1bm9yZGVyZWRfbWFwIHdpdGggY29waWVzIG9mIHRoZSBlbGVtZW50cyBpbgorICAgICAgICogIHRoZSBpbml0aWFsaXplciBsaXN0IEBhIF9fbC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBhc3NpZ25tZW50IGNvbXBsZXRlbHkgY2hhbmdlcyB0aGUgJXVub3JkZXJlZF9tYXAgYW5kCisgICAgICAgKiAgdGhhdCB0aGUgcmVzdWx0aW5nICV1bm9yZGVyZWRfbWFwJ3Mgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyCisgICAgICAgKiAgb2YgZWxlbWVudHMgYXNzaWduZWQuICBPbGQgZGF0YSBtYXkgYmUgbG9zdC4KKyAgICAgICAqLworICAgICAgdW5vcmRlcmVkX21hcCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwlfTV9oID0gX19sOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBhbGxvY2F0b3Igb2JqZWN0IHdpdGggd2hpY2ggdGhlICV1bm9yZGVyZWRfbWFwIHdhcworICAgICAgLy8vICBjb25zdHJ1Y3RlZC4KKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guZ2V0X2FsbG9jYXRvcigpOyB9CisKKyAgICAgIC8vIHNpemUgYW5kIGNhcGFjaXR5OgorCisgICAgICAvLy8gIFJldHVybnMgdHJ1ZSBpZiB0aGUgJXVub3JkZXJlZF9tYXAgaXMgZW1wdHkuCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmVtcHR5KCk7IH0KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSAldW5vcmRlcmVkX21hcC4KKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLnNpemUoKTsgfQorCisgICAgICAvLy8gIFJldHVybnMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgJXVub3JkZXJlZF9tYXAuCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2gubWF4X3NpemUoKTsgfQorCisgICAgICAvLyBpdGVyYXRvcnMuCisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZQorICAgICAgICogICV1bm9yZGVyZWRfbWFwLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5iZWdpbigpOyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAldW5vcmRlcmVkX21hcC4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guYmVnaW4oKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guYmVnaW4oKTsgfQorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50IGluCisgICAgICAgKiAgdGhlICV1bm9yZGVyZWRfbWFwLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guZW5kKCk7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJXVub3JkZXJlZF9tYXAuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5lbmQoKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmVuZCgpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8vIG1vZGlmaWVycy4KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGJ1aWxkIGFuZCBpbnNlcnQgYSBzdGQ6OnBhaXIgaW50byB0aGUgJXVub3JkZXJlZF9tYXAuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2FyZ3MgIEFyZ3VtZW50cyB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IHBhaXIgaW5zdGFuY2UgKHNlZQorICAgICAgICoJICAgICAgICBzdGQ6OnBpZWNld2lzZV9jb250cnVjdCBmb3IgcGFzc2luZyBhcmd1bWVudHMgdG8gZWFjaAorICAgICAgICoJICAgICAgICBwYXJ0IG9mIHRoZSBwYWlyIGNvbnN0cnVjdG9yKS4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgQSBwYWlyLCBvZiB3aGljaCB0aGUgZmlyc3QgZWxlbWVudCBpcyBhbiBpdGVyYXRvciB0aGF0IHBvaW50cworICAgICAgICogICAgICAgICAgIHRvIHRoZSBwb3NzaWJseSBpbnNlcnRlZCBwYWlyLCBhbmQgdGhlIHNlY29uZCBpcyBhIGJvb2wgdGhhdAorICAgICAgICogICAgICAgICAgIGlzIHRydWUgaWYgdGhlIHBhaXIgd2FzIGFjdHVhbGx5IGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIGJ1aWxkIGFuZCBpbnNlcnQgYSAoa2V5LCB2YWx1ZSkgJXBhaXIgaW50bworICAgICAgICogIHRoZSAldW5vcmRlcmVkX21hcC4KKyAgICAgICAqICBBbiAldW5vcmRlcmVkX21hcCByZWxpZXMgb24gdW5pcXVlIGtleXMgYW5kIHRodXMgYSAlcGFpciBpcyBvbmx5CisgICAgICAgKiAgaW5zZXJ0ZWQgaWYgaXRzIGZpcnN0IGVsZW1lbnQgKHRoZSBrZXkpIGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgaW4gdGhlCisgICAgICAgKiAgJXVub3JkZXJlZF9tYXAuCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBhbW9ydGl6ZWQgY29uc3RhbnQgdGltZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorCWVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyByZXR1cm4gX01faC5lbXBsYWNlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGJ1aWxkIGFuZCBpbnNlcnQgYSBzdGQ6OnBhaXIgaW50byB0aGUgJXVub3JkZXJlZF9tYXAuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIEFuIGl0ZXJhdG9yIHRoYXQgc2VydmVzIGFzIGEgaGludCBhcyB0byB3aGVyZSB0aGUgcGFpcgorICAgICAgICogICAgICAgICAgICAgICAgc2hvdWxkIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgX19hcmdzICBBcmd1bWVudHMgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBwYWlyIGluc3RhbmNlIChzZWUKKyAgICAgICAqCSAgICAgICAgIHN0ZDo6cGllY2V3aXNlX2NvbnRydWN0IGZvciBwYXNzaW5nIGFyZ3VtZW50cyB0byBlYWNoCisgICAgICAgKgkgICAgICAgICBwYXJ0IG9mIHRoZSBwYWlyIGNvbnN0cnVjdG9yKS4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBlbGVtZW50IHdpdGgga2V5IG9mIHRoZQorICAgICAgICogICAgICAgICAgc3RkOjpwYWlyIGJ1aWx0IGZyb20gQGEgX19hcmdzIChtYXkgb3IgbWF5IG5vdCBiZSB0aGF0CisgICAgICAgKiAgICAgICAgICBzdGQ6OnBhaXIpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBjb25jZXJuZWQgYWJvdXQgd2hldGhlciB0aGUgaW5zZXJ0aW9uIHRvb2sgcGxhY2UsCisgICAgICAgKiAgYW5kIHRodXMgZG9lcyBub3QgcmV0dXJuIGEgYm9vbGVhbiBsaWtlIHRoZSBzaW5nbGUtYXJndW1lbnQgZW1wbGFjZSgpCisgICAgICAgKiAgZG9lcy4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBvbmx5IGEgaGludCBhbmQgY2FuIHBvdGVudGlhbGx5CisgICAgICAgKiAgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGluc2VydGlvbiBwcm9jZXNzLiBBIGJhZCBoaW50IHdvdWxkCisgICAgICAgKiAgY2F1c2Ugbm8gZ2FpbnMgaW4gZWZmaWNpZW5jeS4KKyAgICAgICAqCisgICAgICAgKiAgU2VlCisgICAgICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQwN2NoMTcuaHRtbAorICAgICAgICogIGZvciBtb3JlIG9uIEBhIGhpbnRpbmcuCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBhbW9ydGl6ZWQgY29uc3RhbnQgdGltZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlX2hpbnQoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsgcmV0dXJuIF9NX2guZW1wbGFjZV9oaW50KF9fcG9zLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBdHRlbXB0cyB0byBpbnNlcnQgYSBzdGQ6OnBhaXIgaW50byB0aGUgJXVub3JkZXJlZF9tYXAuCisKKyAgICAgICAqICBAcGFyYW0gX194IFBhaXIgdG8gYmUgaW5zZXJ0ZWQgKHNlZSBzdGQ6Om1ha2VfcGFpciBmb3IgZWFzeQorICAgICAgICoJICAgICBjcmVhdGlvbiBvZiBwYWlycykuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIEEgcGFpciwgb2Ygd2hpY2ggdGhlIGZpcnN0IGVsZW1lbnQgaXMgYW4gaXRlcmF0b3IgdGhhdCAKKyAgICAgICAqICAgICAgICAgICBwb2ludHMgdG8gdGhlIHBvc3NpYmx5IGluc2VydGVkIHBhaXIsIGFuZCB0aGUgc2Vjb25kIGlzIAorICAgICAgICogICAgICAgICAgIGEgYm9vbCB0aGF0IGlzIHRydWUgaWYgdGhlIHBhaXIgd2FzIGFjdHVhbGx5IGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIGluc2VydCBhIChrZXksIHZhbHVlKSAlcGFpciBpbnRvIHRoZQorICAgICAgICogICV1bm9yZGVyZWRfbWFwLiBBbiAldW5vcmRlcmVkX21hcCByZWxpZXMgb24gdW5pcXVlIGtleXMgYW5kIHRodXMgYQorICAgICAgICogICVwYWlyIGlzIG9ubHkgaW5zZXJ0ZWQgaWYgaXRzIGZpcnN0IGVsZW1lbnQgKHRoZSBrZXkpIGlzIG5vdCBhbHJlYWR5CisgICAgICAgKiAgcHJlc2VudCBpbiB0aGUgJXVub3JkZXJlZF9tYXAuCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBhbW9ydGl6ZWQgY29uc3RhbnQgdGltZS4KKyAgICAgICAqLworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX2guaW5zZXJ0KF9feCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPHZhbHVlX3R5cGUsCisJCQkJCQkgICAgX1BhaXImJj46OnZhbHVlPjo6dHlwZT4KKwlzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisJaW5zZXJ0KF9QYWlyJiYgX194KQorICAgICAgICB7IHJldHVybiBfTV9oLmluc2VydChzdGQ6OmZvcndhcmQ8X1BhaXI+KF9feCkpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBdHRlbXB0cyB0byBpbnNlcnQgYSBzdGQ6OnBhaXIgaW50byB0aGUgJXVub3JkZXJlZF9tYXAuCisgICAgICAgKiAgQHBhcmFtICBfX2hpbnQgIEFuIGl0ZXJhdG9yIHRoYXQgc2VydmVzIGFzIGEgaGludCBhcyB0byB3aGVyZSB0aGUKKyAgICAgICAqICAgICAgICAgICAgICAgICBwYWlyIHNob3VsZCBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgUGFpciB0byBiZSBpbnNlcnRlZCAoc2VlIHN0ZDo6bWFrZV9wYWlyIGZvciBlYXN5IGNyZWF0aW9uCisgICAgICAgKiAgICAgICAgICAgICAgIG9mIHBhaXJzKS4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBlbGVtZW50IHdpdGgga2V5IG9mCisgICAgICAgKiAgICAgICAgICAgQGEgX194IChtYXkgb3IgbWF5IG5vdCBiZSB0aGUgJXBhaXIgcGFzc2VkIGluKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBub3QgY29uY2VybmVkIGFib3V0IHdoZXRoZXIgdGhlIGluc2VydGlvbiB0b29rIHBsYWNlLAorICAgICAgICogIGFuZCB0aHVzIGRvZXMgbm90IHJldHVybiBhIGJvb2xlYW4gbGlrZSB0aGUgc2luZ2xlLWFyZ3VtZW50IGluc2VydCgpCisgICAgICAgKiAgZG9lcy4gIE5vdGUgdGhhdCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIG9ubHkgYSBoaW50IGFuZCBjYW4KKyAgICAgICAqICBwb3RlbnRpYWxseSBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgaW5zZXJ0aW9uIHByb2Nlc3MuICBBIGJhZAorICAgICAgICogIGhpbnQgd291bGQgY2F1c2Ugbm8gZ2FpbnMgaW4gZWZmaWNpZW5jeS4KKyAgICAgICAqCisgICAgICAgKiAgU2VlCisgICAgICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQwN2NoMTcuaHRtbAorICAgICAgICogIGZvciBtb3JlIG9uIEBhIGhpbnRpbmcuCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBhbW9ydGl6ZWQgY29uc3RhbnQgdGltZS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2hpbnQsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX2guaW5zZXJ0KF9faGludCwgX194KTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8dmFsdWVfdHlwZSwKKwkJCQkJCSAgICBfUGFpciYmPjo6dmFsdWU+Ojp0eXBlPgorCWl0ZXJhdG9yCisJaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgX1BhaXImJiBfX3gpCisJeyByZXR1cm4gX01faC5pbnNlcnQoX19oaW50LCBzdGQ6OmZvcndhcmQ8X1BhaXI+KF9feCkpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBIHRlbXBsYXRlIGZ1bmN0aW9uIHRoYXQgYXR0ZW1wdHMgdG8gaW5zZXJ0IGEgcmFuZ2Ugb2YKKyAgICAgICAqICBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSByYW5nZS4KKyAgICAgICAqCisgICAgICAgKiAgQ29tcGxleGl0eSBzaW1pbGFyIHRvIHRoYXQgb2YgdGhlIHJhbmdlIGNvbnN0cnVjdG9yLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwl2b2lkCisJaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKwl7IF9NX2guaW5zZXJ0KF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGluc2VydCBhIGxpc3Qgb2YgZWxlbWVudHMgaW50byB0aGUgJXVub3JkZXJlZF9tYXAuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEEgc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IG9mIGVsZW1lbnRzCisgICAgICAgKiAgICAgICAgICAgICAgIHRvIGJlIGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBDb21wbGV4aXR5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgcmFuZ2UgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgX01faC5pbnNlcnQoX19sKTsgfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGFuIGVsZW1lbnQgZnJvbSBhbiAldW5vcmRlcmVkX21hcC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IGltbWVkaWF0ZWx5IGZvbGxvd2luZworICAgICAgICogICAgICAgICAgQGEgX19wb3NpdGlvbiBwcmlvciB0byB0aGUgZWxlbWVudCBiZWluZyBlcmFzZWQuIElmIG5vIHN1Y2gKKyAgICAgICAqICAgICAgICAgIGVsZW1lbnQgZXhpc3RzLCBlbmQoKSBpcyByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYW4gZWxlbWVudCwgcG9pbnRlZCB0byBieSB0aGUgZ2l2ZW4gaXRlcmF0b3IsCisgICAgICAgKiAgZnJvbSBhbiAldW5vcmRlcmVkX21hcC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYgdGhlCisgICAgICAgKiAgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4KKyAgICAgICAqICBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IHJldHVybiBfTV9oLmVyYXNlKF9fcG9zaXRpb24pOyB9CisKKyAgICAgIC8vIExXRyAyMDU5LgorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9faXQpCisgICAgICB7IHJldHVybiBfTV9oLmVyYXNlKF9faXQpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgZWxlbWVudHMgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBrZXkuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSBvZiBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGVyYXNlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYWxsIHRoZSBlbGVtZW50cyBsb2NhdGVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQorICAgICAgICogIGFuICV1bm9yZGVyZWRfbWFwLiBGb3IgYW4gJXVub3JkZXJlZF9tYXAgdGhlIHJlc3VsdCBvZiB0aGlzIGZ1bmN0aW9uCisgICAgICAgKiAgY2FuIG9ubHkgYmUgMCAobm90IHByZXNlbnQpIG9yIDEgKHByZXNlbnQpLgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LCBhbmQgdGhhdCBpZiB0aGUKKyAgICAgICAqICBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbgorICAgICAgICogIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV9oLmVyYXNlKF9feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhIFtfX2ZpcnN0LF9fbGFzdCkgcmFuZ2Ugb2YgZWxlbWVudHMgZnJvbSBhbgorICAgICAgICogICV1bm9yZGVyZWRfbWFwLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgICBlcmFzZWQuCisgICAgICAgKiAgQHBhcmFtIF9fbGFzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UgdG8KKyAgICAgICAqICAgICAgICAgICAgICAgIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuIFRoZSBpdGVyYXRvciBAYSBfX2xhc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMgZnJvbSBhbiAldW5vcmRlcmVkX21hcC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmCisgICAgICAgKiAgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkCisgICAgICAgKiAgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7IHJldHVybiBfTV9oLmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgRXJhc2VzIGFsbCBlbGVtZW50cyBpbiBhbiAldW5vcmRlcmVkX21hcC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZQorICAgICAgICogIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQKKyAgICAgICAqICBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBub2V4Y2VwdAorICAgICAgeyBfTV9oLmNsZWFyKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTd2FwcyBkYXRhIHdpdGggYW5vdGhlciAldW5vcmRlcmVkX21hcC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgQW4gJXVub3JkZXJlZF9tYXAgb2YgdGhlIHNhbWUgZWxlbWVudCBhbmQgYWxsb2NhdG9yCisgICAgICAgKiAgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZXhjaGFuZ2VzIHRoZSBlbGVtZW50cyBiZXR3ZWVuIHR3byAldW5vcmRlcmVkX21hcCBpbiBjb25zdGFudCB0aW1lLgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZ2xvYmFsIHN0ZDo6c3dhcCgpIGZ1bmN0aW9uIGlzIHNwZWNpYWxpemVkIHN1Y2ggdGhhdAorICAgICAgICogIHN0ZDo6c3dhcChtMSxtMikgd2lsbCBmZWVkIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodW5vcmRlcmVkX21hcCYgX194KQorICAgICAgeyBfTV9oLnN3YXAoX194Ll9NX2gpOyB9CisKKyAgICAgIC8vIG9ic2VydmVycy4KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBoYXNoIGZ1bmN0b3Igb2JqZWN0IHdpdGggd2hpY2ggdGhlICV1bm9yZGVyZWRfbWFwIHdhcworICAgICAgLy8vICBjb25zdHJ1Y3RlZC4KKyAgICAgIGhhc2hlcgorICAgICAgaGFzaF9mdW5jdGlvbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmhhc2hfZnVuY3Rpb24oKTsgfQorCisgICAgICAvLy8gIFJldHVybnMgdGhlIGtleSBjb21wYXJpc29uIG9iamVjdCB3aXRoIHdoaWNoIHRoZSAldW5vcmRlcmVkX21hcCB3YXMKKyAgICAgIC8vLyAgY29uc3RydWN0ZWQuCisgICAgICBrZXlfZXF1YWwKKyAgICAgIGtleV9lcSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmtleV9lcSgpOyB9CisKKyAgICAgIC8vIGxvb2t1cC4KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFRyaWVzIHRvIGxvY2F0ZSBhbiBlbGVtZW50IGluIGFuICV1bm9yZGVyZWRfbWFwLgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBwb2ludGluZyB0byBzb3VnaHQtYWZ0ZXIgZWxlbWVudCwgb3IgZW5kKCkgaWYgbm90CisgICAgICAgKiAgICAgICAgICAgZm91bmQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBrZXkgYW5kIHRyaWVzIHRvIGxvY2F0ZSB0aGUgZWxlbWVudCB3aXRoIHdoaWNoCisgICAgICAgKiAgdGhlIGtleSBtYXRjaGVzLiAgSWYgc3VjY2Vzc2Z1bCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBpdGVyYXRvcgorICAgICAgICogIHBvaW50aW5nIHRvIHRoZSBzb3VnaHQgYWZ0ZXIgZWxlbWVudC4gIElmIHVuc3VjY2Vzc2Z1bCBpdCByZXR1cm5zIHRoZQorICAgICAgICogIHBhc3QtdGhlLWVuZCAoIEBjIGVuZCgpICkgaXRlcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV9oLmZpbmQoX194KTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5maW5kKF9feCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgdG8gY291bnQuCisgICAgICAgKiAgQHJldHVybiAgTnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggc3BlY2lmaWVkIGtleS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBvbmx5IG1ha2VzIHNlbnNlIGZvciAldW5vcmRlcmVkX211bHRpbWFwOyBmb3IKKyAgICAgICAqICAldW5vcmRlcmVkX21hcCB0aGUgcmVzdWx0IHdpbGwgZWl0aGVyIGJlIDAgKG5vdCBwcmVzZW50KSBvciAxCisgICAgICAgKiAgKHByZXNlbnQpLgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmNvdW50KF9feCk7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEZpbmRzIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBQYWlyIG9mIGl0ZXJhdG9ycyB0aGF0IHBvc3NpYmx5IHBvaW50cyB0byB0aGUgc3Vic2VxdWVuY2UKKyAgICAgICAqICAgICAgICAgICBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcHJvYmFibHkgb25seSBtYWtlcyBzZW5zZSBmb3IgJXVub3JkZXJlZF9tdWx0aW1hcC4KKyAgICAgICAqLworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV9oLmVxdWFsX3JhbmdlKF9feCk7IH0KKworICAgICAgc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmVxdWFsX3JhbmdlKF9feCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdWJzY3JpcHQgKCBAYyBbXSApIGFjY2VzcyB0byAldW5vcmRlcmVkX21hcCBkYXRhLgorICAgICAgICogIEBwYXJhbSAgX19rICBUaGUga2V5IGZvciB3aGljaCBkYXRhIHNob3VsZCBiZSByZXRyaWV2ZWQuCisgICAgICAgKiAgQHJldHVybiAgQSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgb2YgdGhlIChrZXksZGF0YSkgJXBhaXIuCisgICAgICAgKgorICAgICAgICogIEFsbG93cyBmb3IgZWFzeSBsb29rdXAgd2l0aCB0aGUgc3Vic2NyaXB0ICggQGMgW10gKW9wZXJhdG9yLiAgUmV0dXJucworICAgICAgICogIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgc3BlY2lmaWVkIGluIHN1YnNjcmlwdC4gIElmIHRoZSBrZXkgZG9lcworICAgICAgICogIG5vdCBleGlzdCwgYSBwYWlyIHdpdGggdGhhdCBrZXkgaXMgY3JlYXRlZCB1c2luZyBkZWZhdWx0IHZhbHVlcywgd2hpY2gKKyAgICAgICAqICBpcyB0aGVuIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBMb29rdXAgcmVxdWlyZXMgY29uc3RhbnQgdGltZS4KKyAgICAgICAqLworICAgICAgbWFwcGVkX3R5cGUmCisgICAgICBvcGVyYXRvcltdKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgICB7IHJldHVybiBfTV9oW19fa107IH0KKworICAgICAgbWFwcGVkX3R5cGUmCisgICAgICBvcGVyYXRvcltdKGtleV90eXBlJiYgX19rKQorICAgICAgeyByZXR1cm4gX01faFtzdGQ6Om1vdmUoX19rKV07IH0KKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBY2Nlc3MgdG8gJXVub3JkZXJlZF9tYXAgZGF0YS4KKyAgICAgICAqICBAcGFyYW0gIF9fayAgVGhlIGtleSBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUgcmV0cmlldmVkLgorICAgICAgICogIEByZXR1cm4gIEEgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIHdob3NlIGtleSBpcyBlcXVhbCB0byBAYSBfX2ssIGlmCisgICAgICAgKiAgICAgICAgICAgc3VjaCBhIGRhdGEgaXMgcHJlc2VudCBpbiB0aGUgJXVub3JkZXJlZF9tYXAuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgbm8gc3VjaCBkYXRhIGlzIHByZXNlbnQuCisgICAgICAgKi8KKyAgICAgIG1hcHBlZF90eXBlJgorICAgICAgYXQoY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICAgIHsgcmV0dXJuIF9NX2guYXQoX19rKTsgfQorCisgICAgICBjb25zdCBtYXBwZWRfdHlwZSYKKyAgICAgIGF0KGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmF0KF9fayk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy8gYnVja2V0IGludGVyZmFjZS4KKworICAgICAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBidWNrZXRzIG9mIHRoZSAldW5vcmRlcmVkX21hcC4KKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0X2NvdW50KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guYnVja2V0X2NvdW50KCk7IH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ1Y2tldHMgb2YgdGhlICV1bm9yZGVyZWRfbWFwLgorICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfYnVja2V0X2NvdW50KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2gubWF4X2J1Y2tldF9jb3VudCgpOyB9CisKKyAgICAgIC8qCisgICAgICAgKiBAYnJpZWYgIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIGdpdmVuIGJ1Y2tldC4KKyAgICAgICAqIEBwYXJhbSAgX19uICBBIGJ1Y2tldCBpbmRleC4KKyAgICAgICAqIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGJ1Y2tldC4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfc2l6ZShzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5idWNrZXRfc2l6ZShfX24pOyB9CisKKyAgICAgIC8qCisgICAgICAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGJ1Y2tldCBpbmRleCBvZiBhIGdpdmVuIGVsZW1lbnQuCisgICAgICAgKiBAcGFyYW0gIF9fa2V5ICBBIGtleSBpbnN0YW5jZS4KKyAgICAgICAqIEByZXR1cm4gIFRoZSBrZXkgYnVja2V0IGluZGV4LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmJ1Y2tldChfX2tleSk7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgYnVja2V0CisgICAgICAgKiAgICAgICAgIGVsZW1lbnQuCisgICAgICAgKiAgQHBhcmFtICBfX24gVGhlIGJ1Y2tldCBpbmRleC4KKyAgICAgICAqICBAcmV0dXJuICBBIHJlYWQvd3JpdGUgbG9jYWwgaXRlcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gX01faC5iZWdpbihfX24pOyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdAorICAgICAgICogICAgICAgICBidWNrZXQgZWxlbWVudC4KKyAgICAgICAqICBAcGFyYW0gIF9fbiBUaGUgYnVja2V0IGluZGV4LgorICAgICAgICogIEByZXR1cm4gIEEgcmVhZC1vbmx5IGxvY2FsIGl0ZXJhdG9yLgorICAgICAgICovCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guYmVnaW4oX19uKTsgfQorCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgY2JlZ2luKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmNiZWdpbihfX24pOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICAgICAgICAgYnVja2V0IGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19uIFRoZSBidWNrZXQgaW5kZXguCisgICAgICAgKiAgQHJldHVybiAgQSByZWFkL3dyaXRlIGxvY2FsIGl0ZXJhdG9yLgorICAgICAgICovCisgICAgICBsb2NhbF9pdGVyYXRvcgorICAgICAgZW5kKHNpemVfdHlwZSBfX24pCisgICAgICB7IHJldHVybiBfTV9oLmVuZChfX24pOyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHBvaW50aW5nIHRvIG9uZSBwYXN0CisgICAgICAgKiAgICAgICAgIHRoZSBsYXN0IGJ1Y2tldCBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9fbiBUaGUgYnVja2V0IGluZGV4LgorICAgICAgICogIEByZXR1cm4gIEEgcmVhZC1vbmx5IGxvY2FsIGl0ZXJhdG9yLgorICAgICAgICovCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmVuZChfX24pOyB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBjZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmNlbmQoX19uKTsgfQorICAgICAgLy9AfQorCisgICAgICAvLyBoYXNoIHBvbGljeS4KKworICAgICAgLy8vIFJldHVybnMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGVsZW1lbnRzIHBlciBidWNrZXQuCisgICAgICBmbG9hdAorICAgICAgbG9hZF9mYWN0b3IoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5sb2FkX2ZhY3RvcigpOyB9CisKKyAgICAgIC8vLyBSZXR1cm5zIGEgcG9zaXRpdmUgbnVtYmVyIHRoYXQgdGhlICV1bm9yZGVyZWRfbWFwIHRyaWVzIHRvIGtlZXAgdGhlCisgICAgICAvLy8gbG9hZCBmYWN0b3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvLgorICAgICAgZmxvYXQKKyAgICAgIG1heF9sb2FkX2ZhY3RvcigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLm1heF9sb2FkX2ZhY3RvcigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ2hhbmdlIHRoZSAldW5vcmRlcmVkX21hcCBtYXhpbXVtIGxvYWQgZmFjdG9yLgorICAgICAgICogIEBwYXJhbSAgX196IFRoZSBuZXcgbWF4aW11bSBsb2FkIGZhY3Rvci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgbWF4X2xvYWRfZmFjdG9yKGZsb2F0IF9feikKKyAgICAgIHsgX01faC5tYXhfbG9hZF9mYWN0b3IoX196KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1heSByZWhhc2ggdGhlICV1bm9yZGVyZWRfbWFwLgorICAgICAgICogIEBwYXJhbSAgX19uIFRoZSBuZXcgbnVtYmVyIG9mIGJ1Y2tldHMuCisgICAgICAgKgorICAgICAgICogIFJlaGFzaCB3aWxsIG9jY3VyIG9ubHkgaWYgdGhlIG5ldyBudW1iZXIgb2YgYnVja2V0cyByZXNwZWN0IHRoZQorICAgICAgICogICV1bm9yZGVyZWRfbWFwIG1heGltdW0gbG9hZCBmYWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlaGFzaChzaXplX3R5cGUgX19uKQorICAgICAgeyBfTV9oLnJlaGFzaChfX24pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUHJlcGFyZSB0aGUgJXVub3JkZXJlZF9tYXAgZm9yIGEgc3BlY2lmaWVkIG51bWJlciBvZgorICAgICAgICogICAgICAgICAgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX24gTnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVpcmVkLgorICAgICAgICoKKyAgICAgICAqICBTYW1lIGFzIHJlaGFzaChjZWlsKG4gLyBtYXhfbG9hZF9mYWN0b3IoKSkpLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNlcnZlKHNpemVfdHlwZSBfX24pCisgICAgICB7IF9NX2gucmVzZXJ2ZShfX24pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXkxLCB0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfSGFzaDEsIHR5cGVuYW1lIF9QcmVkMSwKKwkgICAgICAgdHlwZW5hbWUgX0FsbG9jMT4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgdW5vcmRlcmVkX21hcDxfS2V5MSwgX1RwMSwgX0hhc2gxLCBfUHJlZDEsIF9BbGxvYzE+JiwKKwkJIGNvbnN0IHVub3JkZXJlZF9tYXA8X0tleTEsIF9UcDEsIF9IYXNoMSwgX1ByZWQxLCBfQWxsb2MxPiYpOworICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgY29tcG9zZWQgb2YgZXF1aXZhbGVudCBrZXlzCisgICAqICAocG9zc2libHkgY29udGFpbmluZyBtdWx0aXBsZSBvZiBlYWNoIGtleSB2YWx1ZSkgdGhhdCBhc3NvY2lhdGVzCisgICAqICB2YWx1ZXMgb2YgYW5vdGhlciB0eXBlIHdpdGggdGhlIGtleXMuCisgICAqCisgICAqICBAaW5ncm91cCB1bm9yZGVyZWRfYXNzb2NpYXRpdmVfY29udGFpbmVycworICAgKgorICAgKiAgQHRwYXJhbSAgX0tleSAgVHlwZSBvZiBrZXkgb2JqZWN0cy4KKyAgICogIEB0cGFyYW0gIF9UcCAgVHlwZSBvZiBtYXBwZWQgb2JqZWN0cy4KKyAgICogIEB0cGFyYW0gIF9IYXNoICBIYXNoaW5nIGZ1bmN0aW9uIG9iamVjdCB0eXBlLCBkZWZhdWx0cyB0byBoYXNoPF9WYWx1ZT4uCisgICAqICBAdHBhcmFtICBfUHJlZCAgUHJlZGljYXRlIGZ1bmN0aW9uIG9iamVjdCB0eXBlLCBkZWZhdWx0cworICAgKiAgICAgICAgICAgICAgICAgIHRvIGVxdWFsX3RvPF9WYWx1ZT4uCisgICAqICBAdHBhcmFtICBfQWxsb2MgIEFsbG9jYXRvciB0eXBlLCBkZWZhdWx0cyB0byBhbGxvY2F0b3I8X0tleT4uCisgICAqCisgICAqICBNZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sIGFuZAorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjeHgiPnVub3JkZXJlZCBhc3NvY2lhdGl2ZSBjb250YWluZXI8L2E+CisgICAqCisgICAqIFRoZSByZXN1bHRpbmcgdmFsdWUgdHlwZSBvZiB0aGUgY29udGFpbmVyIGlzIHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+LgorICAgKgorICAgKiAgQmFzZSBpcyBfSGFzaHRhYmxlLCBkaXNwYXRjaGVkIGF0IGNvbXBpbGUgdGltZSB2aWEgdGVtcGxhdGUKKyAgICogIGFsaWFzIF9fdW1tYXBfaGFzaHRhYmxlLgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLAorCSAgIGNsYXNzIF9IYXNoID0gaGFzaDxfS2V5PiwKKwkgICBjbGFzcyBfUHJlZCA9IHN0ZDo6ZXF1YWxfdG88X0tleT4sCisJICAgY2xhc3MgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiA+CisgICAgY2xhc3MgdW5vcmRlcmVkX211bHRpbWFwIDogX19jaGVja19jb3B5X2NvbnN0cnVjdGlibGU8X0FsbG9jPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX191bW1hcF9oYXNodGFibGU8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4gIF9IYXNodGFibGU7CisgICAgICBfSGFzaHRhYmxlIF9NX2g7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlZGVmczoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBQdWJsaWMgdHlwZWRlZnMuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmtleV90eXBlCWtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjp2YWx1ZV90eXBlCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6Om1hcHBlZF90eXBlCW1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjpoYXNoZXIJaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjprZXlfZXF1YWwJa2V5X2VxdWFsOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLy8vICBJdGVyYXRvci1yZWxhdGVkIHR5cGVkZWZzLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6cG9pbnRlcgkJcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OmNvbnN0X3BvaW50ZXIJY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnJlZmVyZW5jZQlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpjb25zdF9yZWZlcmVuY2UJY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjppdGVyYXRvcgkJaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmNvbnN0X2l0ZXJhdG9yCWNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjpsb2NhbF9pdGVyYXRvcglsb2NhbF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6Y29uc3RfbG9jYWxfaXRlcmF0b3IJY29uc3RfbG9jYWxfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OnNpemVfdHlwZQkJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjpkaWZmZXJlbmNlX3R5cGUJZGlmZmVyZW5jZV90eXBlOworICAgICAgLy9AfQorCisgICAgICAvL2NvbnN0cnVjdC9kZXN0cm95L2NvcHkKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZWZhdWx0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgbm8gZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgSW5pdGlhbCBudW1iZXIgb2YgYnVja2V0cy4KKyAgICAgICAqICBAcGFyYW0gX19oZiAgQSBoYXNoIGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fZXFsICBBIGtleSBlcXVhbGl0eSBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkJIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01faChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYW4gJXVub3JkZXJlZF9tdWx0aW1hcCBmcm9tIGEgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTWluaW1hbCBpbml0aWFsIG51bWJlciBvZiBidWNrZXRzLgorICAgICAgICogIEBwYXJhbSBfX2hmICBBIGhhc2ggZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gX19lcWwgIEEga2V5IGVxdWFsaXR5IGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGFuICV1bm9yZGVyZWRfbXVsdGltYXAgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzCisgICAgICAgKiAgZnJvbSBbX19maXJzdCxfX2xhc3QpLiAgVGhpcyBpcyBsaW5lYXIgaW4gTiAod2hlcmUgTiBpcworICAgICAgICogIGRpc3RhbmNlKF9fZmlyc3QsX19sYXN0KSkuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXVub3JkZXJlZF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKwkJCSAgIHNpemVfdHlwZSBfX24gPSAwLAorCQkJICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9NX2goX19mLCBfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKwl7IH0KKworICAgICAgLy8vIENvcHkgY29uc3RydWN0b3IuCisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAoY29uc3QgdW5vcmRlcmVkX211bHRpbWFwJikgPSBkZWZhdWx0OworCisgICAgICAvLy8gTW92ZSBjb25zdHJ1Y3Rvci4KKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcCh1bm9yZGVyZWRfbXVsdGltYXAmJikgPSBkZWZhdWx0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhbiAldW5vcmRlcmVkX211bHRpbWFwIGZyb20gYW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gX19uICBNaW5pbWFsIGluaXRpYWwgbnVtYmVyIG9mIGJ1Y2tldHMuCisgICAgICAgKiAgQHBhcmFtIF9faGYgIEEgaGFzaCBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSBfX2VxbCAgQSBrZXkgZXF1YWxpdHkgZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGFuICV1bm9yZGVyZWRfbXVsdGltYXAgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluCisgICAgICAgKiAgdGhlIGxpc3QuIFRoaXMgaXMgbGluZWFyIGluIE4gKHdoZXJlIE4gaXMgQGEgX19sLnNpemUoKSkuCisgICAgICAgKi8KKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkJCSBzaXplX3R5cGUgX19uID0gMCwKKwkJCSBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfTV9oKF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIC8vLyBDb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0oY29uc3QgdW5vcmRlcmVkX211bHRpbWFwJikgPSBkZWZhdWx0OworCisgICAgICAvLy8gTW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgdW5vcmRlcmVkX211bHRpbWFwJgorICAgICAgb3BlcmF0b3I9KHVub3JkZXJlZF9tdWx0aW1hcCYmKSA9IGRlZmF1bHQ7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJVVub3JkZXJlZF9tdWx0aW1hcCBsaXN0IGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYW4gJXVub3JkZXJlZF9tdWx0aW1hcCB3aXRoIGNvcGllcyBvZiB0aGUgZWxlbWVudHMKKyAgICAgICAqICBpbiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBAYSBfX2wuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgYXNzaWdubWVudCBjb21wbGV0ZWx5IGNoYW5nZXMgdGhlICV1bm9yZGVyZWRfbXVsdGltYXAKKyAgICAgICAqICBhbmQgdGhhdCB0aGUgcmVzdWx0aW5nICV1bm9yZGVyZWRfbXVsdGltYXAncyBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZQorICAgICAgICogIG51bWJlciBvZiBlbGVtZW50cyBhc3NpZ25lZC4gIE9sZCBkYXRhIG1heSBiZSBsb3N0LgorICAgICAgICovCisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJX01faCA9IF9fbDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgYWxsb2NhdG9yIG9iamVjdCB3aXRoIHdoaWNoIHRoZSAldW5vcmRlcmVkX211bHRpbWFwIHdhcworICAgICAgLy8vICBjb25zdHJ1Y3RlZC4KKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guZ2V0X2FsbG9jYXRvcigpOyB9CisKKyAgICAgIC8vIHNpemUgYW5kIGNhcGFjaXR5OgorCisgICAgICAvLy8gIFJldHVybnMgdHJ1ZSBpZiB0aGUgJXVub3JkZXJlZF9tdWx0aW1hcCBpcyBlbXB0eS4KKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guZW1wdHkoKTsgfQorCisgICAgICAvLy8gIFJldHVybnMgdGhlIHNpemUgb2YgdGhlICV1bm9yZGVyZWRfbXVsdGltYXAuCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5zaXplKCk7IH0KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlICV1bm9yZGVyZWRfbXVsdGltYXAuCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2gubWF4X3NpemUoKTsgfQorCisgICAgICAvLyBpdGVyYXRvcnMuCisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZQorICAgICAgICogICV1bm9yZGVyZWRfbXVsdGltYXAuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmJlZ2luKCk7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICV1bm9yZGVyZWRfbXVsdGltYXAuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmJlZ2luKCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmJlZ2luKCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QgZWxlbWVudCBpbgorICAgICAgICogIHRoZSAldW5vcmRlcmVkX211bHRpbWFwLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guZW5kKCk7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJXVub3JkZXJlZF9tdWx0aW1hcC4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmVuZCgpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guZW5kKCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy8gbW9kaWZpZXJzLgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gYnVpbGQgYW5kIGluc2VydCBhIHN0ZDo6cGFpciBpbnRvIHRoZQorICAgICAgICogICV1bm9yZGVyZWRfbXVsdGltYXAuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBfX2FyZ3MgIEFyZ3VtZW50cyB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IHBhaXIgaW5zdGFuY2UgKHNlZQorICAgICAgICoJICAgICAgICBzdGQ6OnBpZWNld2lzZV9jb250cnVjdCBmb3IgcGFzc2luZyBhcmd1bWVudHMgdG8gZWFjaAorICAgICAgICoJICAgICAgICBwYXJ0IG9mIHRoZSBwYWlyIGNvbnN0cnVjdG9yKS4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIHBhaXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gYnVpbGQgYW5kIGluc2VydCBhIChrZXksIHZhbHVlKSAlcGFpciBpbnRvCisgICAgICAgKiAgdGhlICV1bm9yZGVyZWRfbXVsdGltYXAuCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBhbW9ydGl6ZWQgY29uc3RhbnQgdGltZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsgcmV0dXJuIF9NX2guZW1wbGFjZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBdHRlbXB0cyB0byBidWlsZCBhbmQgaW5zZXJ0IGEgc3RkOjpwYWlyIGludG8gdGhlICV1bm9yZGVyZWRfbXVsdGltYXAuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIEFuIGl0ZXJhdG9yIHRoYXQgc2VydmVzIGFzIGEgaGludCBhcyB0byB3aGVyZSB0aGUgcGFpcgorICAgICAgICogICAgICAgICAgICAgICAgc2hvdWxkIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgX19hcmdzICBBcmd1bWVudHMgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBwYWlyIGluc3RhbmNlIChzZWUKKyAgICAgICAqCSAgICAgICAgIHN0ZDo6cGllY2V3aXNlX2NvbnRydWN0IGZvciBwYXNzaW5nIGFyZ3VtZW50cyB0byBlYWNoCisgICAgICAgKgkgICAgICAgICBwYXJ0IG9mIHRoZSBwYWlyIGNvbnN0cnVjdG9yKS4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBlbGVtZW50IHdpdGgga2V5IG9mIHRoZQorICAgICAgICogICAgICAgICAgc3RkOjpwYWlyIGJ1aWx0IGZyb20gQGEgX19hcmdzLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBvbmx5IGEgaGludCBhbmQgY2FuIHBvdGVudGlhbGx5CisgICAgICAgKiAgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGluc2VydGlvbiBwcm9jZXNzLiBBIGJhZCBoaW50IHdvdWxkCisgICAgICAgKiAgY2F1c2Ugbm8gZ2FpbnMgaW4gZWZmaWNpZW5jeS4KKyAgICAgICAqCisgICAgICAgKiAgU2VlCisgICAgICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQwN2NoMTcuaHRtbAorICAgICAgICogIGZvciBtb3JlIG9uIEBhIGhpbnRpbmcuCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBhbW9ydGl6ZWQgY29uc3RhbnQgdGltZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlX2hpbnQoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsgcmV0dXJuIF9NX2guZW1wbGFjZV9oaW50KF9fcG9zLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBJbnNlcnRzIGEgc3RkOjpwYWlyIGludG8gdGhlICV1bm9yZGVyZWRfbXVsdGltYXAuCisgICAgICAgKiAgQHBhcmFtIF9feCBQYWlyIHRvIGJlIGluc2VydGVkIChzZWUgc3RkOjptYWtlX3BhaXIgZm9yIGVhc3kKKyAgICAgICAqCSAgICAgY3JlYXRpb24gb2YgcGFpcnMpLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgcGFpci4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGFtb3J0aXplZCBjb25zdGFudCB0aW1lLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX2guaW5zZXJ0KF9feCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPHZhbHVlX3R5cGUsCisJCQkJCQkgICAgX1BhaXImJj46OnZhbHVlPjo6dHlwZT4KKwlpdGVyYXRvcgorCWluc2VydChfUGFpciYmIF9feCkKKyAgICAgICAgeyByZXR1cm4gX01faC5pbnNlcnQoc3RkOjpmb3J3YXJkPF9QYWlyPihfX3gpKTsgfQorICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgSW5zZXJ0cyBhIHN0ZDo6cGFpciBpbnRvIHRoZSAldW5vcmRlcmVkX211bHRpbWFwLgorICAgICAgICogIEBwYXJhbSAgX19oaW50ICBBbiBpdGVyYXRvciB0aGF0IHNlcnZlcyBhcyBhIGhpbnQgYXMgdG8gd2hlcmUgdGhlCisgICAgICAgKiAgICAgICAgICAgICAgICAgcGFpciBzaG91bGQgYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIFBhaXIgdG8gYmUgaW5zZXJ0ZWQgKHNlZSBzdGQ6Om1ha2VfcGFpciBmb3IgZWFzeSBjcmVhdGlvbgorICAgICAgICogICAgICAgICAgICAgICBvZiBwYWlycykuCisgICAgICAgKiAgQHJldHVybiBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZWxlbWVudCB3aXRoIGtleSBvZgorICAgICAgICogICAgICAgICAgIEBhIF9feCAobWF5IG9yIG1heSBub3QgYmUgdGhlICVwYWlyIHBhc3NlZCBpbikuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIG9ubHkgYSBoaW50IGFuZCBjYW4gcG90ZW50aWFsbHkKKyAgICAgICAqICBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgaW5zZXJ0aW9uIHByb2Nlc3MuICBBIGJhZCBoaW50IHdvdWxkCisgICAgICAgKiAgY2F1c2Ugbm8gZ2FpbnMgaW4gZWZmaWNpZW5jeS4KKyAgICAgICAqCisgICAgICAgKiAgU2VlCisgICAgICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQwN2NoMTcuaHRtbAorICAgICAgICogIGZvciBtb3JlIG9uIEBhIGhpbnRpbmcuCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBhbW9ydGl6ZWQgY29uc3RhbnQgdGltZS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2hpbnQsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX2guaW5zZXJ0KF9faGludCwgX194KTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8dmFsdWVfdHlwZSwKKwkJCQkJCSAgICBfUGFpciYmPjo6dmFsdWU+Ojp0eXBlPgorCWl0ZXJhdG9yCisJaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgX1BhaXImJiBfX3gpCisgICAgICAgIHsgcmV0dXJuIF9NX2guaW5zZXJ0KF9faGludCwgc3RkOjpmb3J3YXJkPF9QYWlyPihfX3gpKTsgfQorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQSB0ZW1wbGF0ZSBmdW5jdGlvbiB0aGF0IGF0dGVtcHRzIHRvIGluc2VydCBhIHJhbmdlIG9mCisgICAgICAgKiAgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgICBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UuCisgICAgICAgKgorICAgICAgICogIENvbXBsZXhpdHkgc2ltaWxhciB0byB0aGF0IG9mIHRoZSByYW5nZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJdm9pZAorCWluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisJeyBfTV9oLmluc2VydChfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBdHRlbXB0cyB0byBpbnNlcnQgYSBsaXN0IG9mIGVsZW1lbnRzIGludG8gdGhlCisgICAgICAgKiAgJXVub3JkZXJlZF9tdWx0aW1hcC4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQSBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gb2YgZWxlbWVudHMKKyAgICAgICAqICAgICAgICAgICAgICAgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIENvbXBsZXhpdHkgc2ltaWxhciB0byB0aGF0IG9mIHRoZSByYW5nZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyBfTV9oLmluc2VydChfX2wpOyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgYW4gZWxlbWVudCBmcm9tIGFuICV1bm9yZGVyZWRfbXVsdGltYXAuCisgICAgICAgKiAgQHBhcmFtICBfX3Bvc2l0aW9uICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZWxlbWVudCB0byBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZWxlbWVudCBpbW1lZGlhdGVseSBmb2xsb3dpbmcKKyAgICAgICAqICAgICAgICAgIEBhIF9fcG9zaXRpb24gcHJpb3IgdG8gdGhlIGVsZW1lbnQgYmVpbmcgZXJhc2VkLiBJZiBubyBzdWNoCisgICAgICAgKiAgICAgICAgICBlbGVtZW50IGV4aXN0cywgZW5kKCkgaXMgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGFuIGVsZW1lbnQsIHBvaW50ZWQgdG8gYnkgdGhlIGdpdmVuIGl0ZXJhdG9yLAorICAgICAgICogIGZyb20gYW4gJXVub3JkZXJlZF9tdWx0aW1hcC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYgdGhlCisgICAgICAgKiAgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4KKyAgICAgICAqICBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IHJldHVybiBfTV9oLmVyYXNlKF9fcG9zaXRpb24pOyB9CisKKyAgICAgIC8vIExXRyAyMDU5LgorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9faXQpCisgICAgICB7IHJldHVybiBfTV9oLmVyYXNlKF9faXQpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgZWxlbWVudHMgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBrZXkuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEtleSBvZiBlbGVtZW50cyB0byBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyBlcmFzZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGFsbCB0aGUgZWxlbWVudHMgbG9jYXRlZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KKyAgICAgICAqICBhbiAldW5vcmRlcmVkX211bHRpbWFwLgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LCBhbmQgdGhhdCBpZiB0aGUKKyAgICAgICAqICBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbgorICAgICAgICogIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV9oLmVyYXNlKF9feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhIFtfX2ZpcnN0LF9fbGFzdCkgcmFuZ2Ugb2YgZWxlbWVudHMgZnJvbSBhbgorICAgICAgICogICV1bm9yZGVyZWRfbXVsdGltYXAuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgIGVyYXNlZC4KKyAgICAgICAqICBAcGFyYW0gX19sYXN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSByYW5nZSB0bworICAgICAgICogICAgICAgICAgICAgICAgYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gVGhlIGl0ZXJhdG9yIEBhIF9fbGFzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYSBzZXF1ZW5jZSBvZiBlbGVtZW50cyBmcm9tIGFuCisgICAgICAgKiAgJXVub3JkZXJlZF9tdWx0aW1hcC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmCisgICAgICAgKiAgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkCisgICAgICAgKiAgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7IHJldHVybiBfTV9oLmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgRXJhc2VzIGFsbCBlbGVtZW50cyBpbiBhbiAldW5vcmRlcmVkX211bHRpbWFwLgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlCisgICAgICAgKiAgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZAorICAgICAgICogIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIG5vZXhjZXB0CisgICAgICB7IF9NX2guY2xlYXIoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN3YXBzIGRhdGEgd2l0aCBhbm90aGVyICV1bm9yZGVyZWRfbXVsdGltYXAuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEFuICV1bm9yZGVyZWRfbXVsdGltYXAgb2YgdGhlIHNhbWUgZWxlbWVudCBhbmQgYWxsb2NhdG9yCisgICAgICAgKiAgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZXhjaGFuZ2VzIHRoZSBlbGVtZW50cyBiZXR3ZWVuIHR3byAldW5vcmRlcmVkX211bHRpbWFwIGluCisgICAgICAgKiAgY29uc3RhbnQgdGltZS4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGdsb2JhbCBzdGQ6OnN3YXAoKSBmdW5jdGlvbiBpcyBzcGVjaWFsaXplZCBzdWNoIHRoYXQKKyAgICAgICAqICBzdGQ6OnN3YXAobTEsbTIpIHdpbGwgZmVlZCB0byB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzd2FwKHVub3JkZXJlZF9tdWx0aW1hcCYgX194KQorICAgICAgeyBfTV9oLnN3YXAoX194Ll9NX2gpOyB9CisKKyAgICAgIC8vIG9ic2VydmVycy4KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBoYXNoIGZ1bmN0b3Igb2JqZWN0IHdpdGggd2hpY2ggdGhlICV1bm9yZGVyZWRfbXVsdGltYXAKKyAgICAgIC8vLyAgd2FzIGNvbnN0cnVjdGVkLgorICAgICAgaGFzaGVyCisgICAgICBoYXNoX2Z1bmN0aW9uKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guaGFzaF9mdW5jdGlvbigpOyB9CisKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUga2V5IGNvbXBhcmlzb24gb2JqZWN0IHdpdGggd2hpY2ggdGhlICV1bm9yZGVyZWRfbXVsdGltYXAKKyAgICAgIC8vLyAgd2FzIGNvbnN0cnVjdGVkLgorICAgICAga2V5X2VxdWFsCisgICAgICBrZXlfZXEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5rZXlfZXEoKTsgfQorCisgICAgICAvLyBsb29rdXAuCisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUcmllcyB0byBsb2NhdGUgYW4gZWxlbWVudCBpbiBhbiAldW5vcmRlcmVkX211bHRpbWFwLgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBwb2ludGluZyB0byBzb3VnaHQtYWZ0ZXIgZWxlbWVudCwgb3IgZW5kKCkgaWYgbm90CisgICAgICAgKiAgICAgICAgICAgZm91bmQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBrZXkgYW5kIHRyaWVzIHRvIGxvY2F0ZSB0aGUgZWxlbWVudCB3aXRoIHdoaWNoCisgICAgICAgKiAgdGhlIGtleSBtYXRjaGVzLiAgSWYgc3VjY2Vzc2Z1bCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBpdGVyYXRvcgorICAgICAgICogIHBvaW50aW5nIHRvIHRoZSBzb3VnaHQgYWZ0ZXIgZWxlbWVudC4gIElmIHVuc3VjY2Vzc2Z1bCBpdCByZXR1cm5zIHRoZQorICAgICAgICogIHBhc3QtdGhlLWVuZCAoIEBjIGVuZCgpICkgaXRlcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV9oLmZpbmQoX194KTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5maW5kKF9feCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgdG8gY291bnQuCisgICAgICAgKiAgQHJldHVybiAgTnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggc3BlY2lmaWVkIGtleS4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5jb3VudChfX3gpOyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgUGFpciBvZiBpdGVyYXRvcnMgdGhhdCBwb3NzaWJseSBwb2ludHMgdG8gdGhlIHN1YnNlcXVlbmNlCisgICAgICAgKiAgICAgICAgICAgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICovCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX2guZXF1YWxfcmFuZ2UoX194KTsgfQorCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guZXF1YWxfcmFuZ2UoX194KTsgfQorICAgICAgLy9AfQorCisgICAgICAvLyBidWNrZXQgaW50ZXJmYWNlLgorCisgICAgICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMgb2YgdGhlICV1bm9yZGVyZWRfbXVsdGltYXAuCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9jb3VudCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmJ1Y2tldF9jb3VudCgpOyB9CisKKyAgICAgIC8vLyBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBidWNrZXRzIG9mIHRoZSAldW5vcmRlcmVkX211bHRpbWFwLgorICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfYnVja2V0X2NvdW50KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2gubWF4X2J1Y2tldF9jb3VudCgpOyB9CisKKyAgICAgIC8qCisgICAgICAgKiBAYnJpZWYgIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIGdpdmVuIGJ1Y2tldC4KKyAgICAgICAqIEBwYXJhbSAgX19uICBBIGJ1Y2tldCBpbmRleC4KKyAgICAgICAqIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGJ1Y2tldC4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfc2l6ZShzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5idWNrZXRfc2l6ZShfX24pOyB9CisKKyAgICAgIC8qCisgICAgICAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGJ1Y2tldCBpbmRleCBvZiBhIGdpdmVuIGVsZW1lbnQuCisgICAgICAgKiBAcGFyYW0gIF9fa2V5ICBBIGtleSBpbnN0YW5jZS4KKyAgICAgICAqIEByZXR1cm4gIFRoZSBrZXkgYnVja2V0IGluZGV4LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmJ1Y2tldChfX2tleSk7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgYnVja2V0CisgICAgICAgKiAgICAgICAgIGVsZW1lbnQuCisgICAgICAgKiAgQHBhcmFtICBfX24gVGhlIGJ1Y2tldCBpbmRleC4KKyAgICAgICAqICBAcmV0dXJuICBBIHJlYWQvd3JpdGUgbG9jYWwgaXRlcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gX01faC5iZWdpbihfX24pOyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdAorICAgICAgICogICAgICAgICBidWNrZXQgZWxlbWVudC4KKyAgICAgICAqICBAcGFyYW0gIF9fbiBUaGUgYnVja2V0IGluZGV4LgorICAgICAgICogIEByZXR1cm4gIEEgcmVhZC1vbmx5IGxvY2FsIGl0ZXJhdG9yLgorICAgICAgICovCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guYmVnaW4oX19uKTsgfQorCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgY2JlZ2luKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmNiZWdpbihfX24pOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICAgICAgICAgYnVja2V0IGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19uIFRoZSBidWNrZXQgaW5kZXguCisgICAgICAgKiAgQHJldHVybiAgQSByZWFkL3dyaXRlIGxvY2FsIGl0ZXJhdG9yLgorICAgICAgICovCisgICAgICBsb2NhbF9pdGVyYXRvcgorICAgICAgZW5kKHNpemVfdHlwZSBfX24pCisgICAgICB7IHJldHVybiBfTV9oLmVuZChfX24pOyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHBvaW50aW5nIHRvIG9uZSBwYXN0CisgICAgICAgKiAgICAgICAgIHRoZSBsYXN0IGJ1Y2tldCBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9fbiBUaGUgYnVja2V0IGluZGV4LgorICAgICAgICogIEByZXR1cm4gIEEgcmVhZC1vbmx5IGxvY2FsIGl0ZXJhdG9yLgorICAgICAgICovCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmVuZChfX24pOyB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBjZW5kKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmNlbmQoX19uKTsgfQorICAgICAgLy9AfQorCisgICAgICAvLyBoYXNoIHBvbGljeS4KKworICAgICAgLy8vIFJldHVybnMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGVsZW1lbnRzIHBlciBidWNrZXQuCisgICAgICBmbG9hdAorICAgICAgbG9hZF9mYWN0b3IoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5sb2FkX2ZhY3RvcigpOyB9CisKKyAgICAgIC8vLyBSZXR1cm5zIGEgcG9zaXRpdmUgbnVtYmVyIHRoYXQgdGhlICV1bm9yZGVyZWRfbXVsdGltYXAgdHJpZXMgdG8ga2VlcAorICAgICAgLy8vIHRoZSBsb2FkIGZhY3RvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8uCisgICAgICBmbG9hdAorICAgICAgbWF4X2xvYWRfZmFjdG9yKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2gubWF4X2xvYWRfZmFjdG9yKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDaGFuZ2UgdGhlICV1bm9yZGVyZWRfbXVsdGltYXAgbWF4aW11bSBsb2FkIGZhY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9feiBUaGUgbmV3IG1heGltdW0gbG9hZCBmYWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIG1heF9sb2FkX2ZhY3RvcihmbG9hdCBfX3opCisgICAgICB7IF9NX2gubWF4X2xvYWRfZmFjdG9yKF9feik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNYXkgcmVoYXNoIHRoZSAldW5vcmRlcmVkX211bHRpbWFwLgorICAgICAgICogIEBwYXJhbSAgX19uIFRoZSBuZXcgbnVtYmVyIG9mIGJ1Y2tldHMuCisgICAgICAgKgorICAgICAgICogIFJlaGFzaCB3aWxsIG9jY3VyIG9ubHkgaWYgdGhlIG5ldyBudW1iZXIgb2YgYnVja2V0cyByZXNwZWN0IHRoZQorICAgICAgICogICV1bm9yZGVyZWRfbXVsdGltYXAgbWF4aW11bSBsb2FkIGZhY3Rvci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVoYXNoKHNpemVfdHlwZSBfX24pCisgICAgICB7IF9NX2gucmVoYXNoKF9fbik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQcmVwYXJlIHRoZSAldW5vcmRlcmVkX211bHRpbWFwIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YKKyAgICAgICAqICAgICAgICAgIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19uIE51bWJlciBvZiBlbGVtZW50cyByZXF1aXJlZC4KKyAgICAgICAqCisgICAgICAgKiAgU2FtZSBhcyByZWhhc2goY2VpbChuIC8gbWF4X2xvYWRfZmFjdG9yKCkpKS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXJ2ZShzaXplX3R5cGUgX19uKQorICAgICAgeyBfTV9oLnJlc2VydmUoX19uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5MSwgdHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX0hhc2gxLCB0eXBlbmFtZSBfUHJlZDEsCisJICAgICAgIHR5cGVuYW1lIF9BbGxvYzE+CisgICAgICAgIGZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfbXVsdGltYXA8X0tleTEsIF9UcDEsCisJCQkJCSAgICBfSGFzaDEsIF9QcmVkMSwgX0FsbG9jMT4mLAorCQkgICBjb25zdCB1bm9yZGVyZWRfbXVsdGltYXA8X0tleTEsIF9UcDEsCisJCQkJCSAgICBfSGFzaDEsIF9QcmVkMSwgX0FsbG9jMT4mKTsKKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSB1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01faC5fTV9lcXVhbChfX3kuX01faCk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9oLl9NX2VxdWFsKF9feS5fTV9oKTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8qIF9VTk9SREVSRURfTUFQX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy91bm9yZGVyZWRfc2V0LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdW5vcmRlcmVkX3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYzIzM2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdW5vcmRlcmVkX3NldC5oCkBAIC0wLDAgKzEsMTI5NiBAQAorLy8gdW5vcmRlcmVkX3NldCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy91bm9yZGVyZWRfc2V0LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt1bm9yZGVyZWRfc2V0fQorICovCisKKyNpZm5kZWYgX1VOT1JERVJFRF9TRVRfSAorI2RlZmluZSBfVU5PUkRFUkVEX1NFVF9ICisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUgorCisgIC8vLyBCYXNlIHR5cGVzIGZvciB1bm9yZGVyZWRfc2V0LgorICB0ZW1wbGF0ZTxib29sIF9DYWNoZT4KKyAgICB1c2luZyBfX3VzZXRfdHJhaXRzID0gX19kZXRhaWw6Ol9IYXNodGFibGVfdHJhaXRzPF9DYWNoZSwgdHJ1ZSwgdHJ1ZT47CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9IYXNoID0gaGFzaDxfVmFsdWU+LAorCSAgIHR5cGVuYW1lIF9QcmVkID0gc3RkOjplcXVhbF90bzxfVmFsdWU+LAorICAJICAgdHlwZW5hbWUgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8X1ZhbHVlPiwKKwkgICB0eXBlbmFtZSBfVHIgPSBfX3VzZXRfdHJhaXRzPF9fY2FjaGVfZGVmYXVsdDxfVmFsdWUsIF9IYXNoPjo6dmFsdWU+PgorICAgIHVzaW5nIF9fdXNldF9oYXNodGFibGUgPSBfSGFzaHRhYmxlPF9WYWx1ZSwgX1ZhbHVlLCBfQWxsb2MsCisJCQkJCV9fZGV0YWlsOjpfSWRlbnRpdHksIF9QcmVkLCBfSGFzaCwKKwkJCQkJX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZywKKwkJCQkJX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoLAorCQkJCQlfX2RldGFpbDo6X1ByaW1lX3JlaGFzaF9wb2xpY3ksIF9Ucj47CisKKyAgLy8vIEJhc2UgdHlwZXMgZm9yIHVub3JkZXJlZF9tdWx0aXNldC4KKyAgdGVtcGxhdGU8Ym9vbCBfQ2FjaGU+CisgICAgdXNpbmcgX191bXNldF90cmFpdHMgPSBfX2RldGFpbDo6X0hhc2h0YWJsZV90cmFpdHM8X0NhY2hlLCB0cnVlLCBmYWxzZT47CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9IYXNoID0gaGFzaDxfVmFsdWU+LAorCSAgIHR5cGVuYW1lIF9QcmVkID0gc3RkOjplcXVhbF90bzxfVmFsdWU+LAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9WYWx1ZT4sCisJICAgdHlwZW5hbWUgX1RyID0gX191bXNldF90cmFpdHM8X19jYWNoZV9kZWZhdWx0PF9WYWx1ZSwgX0hhc2g+Ojp2YWx1ZT4+CisgICAgdXNpbmcgX191bXNldF9oYXNodGFibGUgPSBfSGFzaHRhYmxlPF9WYWx1ZSwgX1ZhbHVlLCBfQWxsb2MsCisJCQkJCSBfX2RldGFpbDo6X0lkZW50aXR5LAorCQkJCQkgX1ByZWQsIF9IYXNoLAorCQkJCQkgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZywKKwkJCQkJIF9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCwKKwkJCQkJIF9fZGV0YWlsOjpfUHJpbWVfcmVoYXNoX3BvbGljeSwgX1RyPjsKKworICAvKioKKyAgICogIEBicmllZiBBIHN0YW5kYXJkIGNvbnRhaW5lciBjb21wb3NlZCBvZiB1bmlxdWUga2V5cyAoY29udGFpbmluZworICAgKiAgYXQgbW9zdCBvbmUgb2YgZWFjaCBrZXkgdmFsdWUpIGluIHdoaWNoIHRoZSBlbGVtZW50cycga2V5cyBhcmUKKyAgICogIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzLgorICAgKgorICAgKiAgQGluZ3JvdXAgdW5vcmRlcmVkX2Fzc29jaWF0aXZlX2NvbnRhaW5lcnMKKyAgICoKKyAgICogIEB0cGFyYW0gIF9WYWx1ZSAgVHlwZSBvZiBrZXkgb2JqZWN0cy4KKyAgICogIEB0cGFyYW0gIF9IYXNoICBIYXNoaW5nIGZ1bmN0aW9uIG9iamVjdCB0eXBlLCBkZWZhdWx0cyB0byBoYXNoPF9WYWx1ZT4uCisKKyAgICogIEB0cGFyYW0gX1ByZWQgUHJlZGljYXRlIGZ1bmN0aW9uIG9iamVjdCB0eXBlLCBkZWZhdWx0cyB0bworICAgKiAgICAgICAgICAgICAgICBlcXVhbF90bzxfVmFsdWU+LgorICAgKgorICAgKiAgQHRwYXJhbSAgX0FsbG9jICBBbGxvY2F0b3IgdHlwZSwgZGVmYXVsdHMgdG8gYWxsb2NhdG9yPF9LZXk+LgorICAgKgorICAgKiAgTWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LCBhbmQKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sI3h4Ij51bm9yZGVyZWQgYXNzb2NpYXRpdmUgY29udGFpbmVyPC9hPgorICAgKgorICAgKiAgQmFzZSBpcyBfSGFzaHRhYmxlLCBkaXNwYXRjaGVkIGF0IGNvbXBpbGUgdGltZSB2aWEgdGVtcGxhdGUKKyAgICogIGFsaWFzIF9fdXNldF9oYXNodGFibGUuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsCisJICAgY2xhc3MgX0hhc2ggPSBoYXNoPF9WYWx1ZT4sCisJICAgY2xhc3MgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9WYWx1ZT4sCisJICAgY2xhc3MgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8X1ZhbHVlPiA+CisgICAgY2xhc3MgdW5vcmRlcmVkX3NldCA6IF9fY2hlY2tfY29weV9jb25zdHJ1Y3RpYmxlPF9BbGxvYz4KKyAgICB7CisgICAgICB0eXBlZGVmIF9fdXNldF9oYXNodGFibGU8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4gIF9IYXNodGFibGU7CisgICAgICBfSGFzaHRhYmxlIF9NX2g7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlZGVmczoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBQdWJsaWMgdHlwZWRlZnMuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmtleV90eXBlCWtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjp2YWx1ZV90eXBlCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6Omhhc2hlcgloYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmtleV9lcXVhbAlrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvLy8gIEl0ZXJhdG9yLXJlbGF0ZWQgdHlwZWRlZnMuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpwb2ludGVyCQlwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6Y29uc3RfcG9pbnRlcgljb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6cmVmZXJlbmNlCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OmNvbnN0X3JlZmVyZW5jZQljb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6Oml0ZXJhdG9yCQlpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6Y29uc3RfaXRlcmF0b3IJY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmxvY2FsX2l0ZXJhdG9yCWxvY2FsX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjpjb25zdF9sb2NhbF9pdGVyYXRvcgljb25zdF9sb2NhbF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6c2l6ZV90eXBlCQlzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmRpZmZlcmVuY2VfdHlwZQlkaWZmZXJlbmNlX3R5cGU7CisgICAgICAvL0B9CisKKyAgICAgIC8vIGNvbnN0cnVjdC9kZXN0cm95L2NvcHkKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIG5vIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSBfX24gIEluaXRpYWwgbnVtYmVyIG9mIGJ1Y2tldHMuCisgICAgICAgKiAgQHBhcmFtIF9faGYgIEEgaGFzaCBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSBfX2VxbCAgQSBrZXkgZXF1YWxpdHkgZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgdW5vcmRlcmVkX3NldChzaXplX3R5cGUgX19uID0gMTAsCisJCSAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV9oKF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhbiAldW5vcmRlcmVkX3NldCBmcm9tIGEgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTWluaW1hbCBpbml0aWFsIG51bWJlciBvZiBidWNrZXRzLgorICAgICAgICogIEBwYXJhbSBfX2hmICBBIGhhc2ggZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gX19lcWwgIEEga2V5IGVxdWFsaXR5IGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGFuICV1bm9yZGVyZWRfc2V0IGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBmcm9tCisgICAgICAgKiAgW19fZmlyc3QsX19sYXN0KS4gIFRoaXMgaXMgbGluZWFyIGluIE4gKHdoZXJlIE4gaXMKKyAgICAgICAqICBkaXN0YW5jZShfX2ZpcnN0LF9fbGFzdCkpLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwl1bm9yZGVyZWRfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorCQkgICAgICBzaXplX3R5cGUgX19uID0gMCwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfTV9oKF9fZiwgX19sLCBfX24sIF9faGYsIF9fZXFsLCBfX2EpCisJeyB9CisKKyAgICAgIC8vLyBDb3B5IGNvbnN0cnVjdG9yLgorICAgICAgdW5vcmRlcmVkX3NldChjb25zdCB1bm9yZGVyZWRfc2V0JikgPSBkZWZhdWx0OworCisgICAgICAvLy8gTW92ZSBjb25zdHJ1Y3Rvci4KKyAgICAgIHVub3JkZXJlZF9zZXQodW5vcmRlcmVkX3NldCYmKSA9IGRlZmF1bHQ7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGFuICV1bm9yZGVyZWRfc2V0IGZyb20gYW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gX19uICBNaW5pbWFsIGluaXRpYWwgbnVtYmVyIG9mIGJ1Y2tldHMuCisgICAgICAgKiAgQHBhcmFtIF9faGYgIEEgaGFzaCBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSBfX2VxbCAgQSBrZXkgZXF1YWxpdHkgZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGFuICV1bm9yZGVyZWRfc2V0IGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUKKyAgICAgICAqICBsaXN0LiBUaGlzIGlzIGxpbmVhciBpbiBOICh3aGVyZSBOIGlzIEBhIF9fbC5zaXplKCkpLgorICAgICAgICovCisgICAgICB1bm9yZGVyZWRfc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCQkgICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCSAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX01faChfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgIHsgfQorCisgICAgICAvLy8gQ29weSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgdW5vcmRlcmVkX3NldCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB1bm9yZGVyZWRfc2V0JikgPSBkZWZhdWx0OworCisgICAgICAvLy8gTW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgdW5vcmRlcmVkX3NldCYKKyAgICAgIG9wZXJhdG9yPSh1bm9yZGVyZWRfc2V0JiYpID0gZGVmYXVsdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlVW5vcmRlcmVkX3NldCBsaXN0IGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYW4gJXVub3JkZXJlZF9zZXQgd2l0aCBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluCisgICAgICAgKiAgdGhlIGluaXRpYWxpemVyIGxpc3QgQGEgX19sLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGFzc2lnbm1lbnQgY29tcGxldGVseSBjaGFuZ2VzIHRoZSAldW5vcmRlcmVkX3NldCBhbmQKKyAgICAgICAqICB0aGF0IHRoZSByZXN1bHRpbmcgJXVub3JkZXJlZF9zZXQncyBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIKKyAgICAgICAqICBvZiBlbGVtZW50cyBhc3NpZ25lZC4gIE9sZCBkYXRhIG1heSBiZSBsb3N0LgorICAgICAgICovCisgICAgICB1bm9yZGVyZWRfc2V0JgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCV9NX2ggPSBfX2w7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLy8gIFJldHVybnMgdGhlIGFsbG9jYXRvciBvYmplY3Qgd2l0aCB3aGljaCB0aGUgJXVub3JkZXJlZF9zZXQgd2FzCisgICAgICAvLy8gIGNvbnN0cnVjdGVkLgorICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5nZXRfYWxsb2NhdG9yKCk7IH0KKworICAgICAgLy8gc2l6ZSBhbmQgY2FwYWNpdHk6CisKKyAgICAgIC8vLyAgUmV0dXJucyB0cnVlIGlmIHRoZSAldW5vcmRlcmVkX3NldCBpcyBlbXB0eS4KKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guZW1wdHkoKTsgfQorCisgICAgICAvLy8gIFJldHVybnMgdGhlIHNpemUgb2YgdGhlICV1bm9yZGVyZWRfc2V0LgorICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guc2l6ZSgpOyB9CisKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSAldW5vcmRlcmVkX3NldC4KKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5tYXhfc2l6ZSgpOyB9CisKKyAgICAgIC8vIGl0ZXJhdG9ycy4KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICV1bm9yZGVyZWRfc2V0LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5iZWdpbigpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmJlZ2luKCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJXVub3JkZXJlZF9zZXQuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5lbmQoKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guZW5kKCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICV1bm9yZGVyZWRfc2V0LgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAldW5vcmRlcmVkX3NldC4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5lbmQoKTsgfQorCisgICAgICAvLyBtb2RpZmllcnMuCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBdHRlbXB0cyB0byBidWlsZCBhbmQgaW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUKKyAgICAgICAqICAldW5vcmRlcmVkX3NldC4KKyAgICAgICAqICBAcGFyYW0gX19hcmdzICBBcmd1bWVudHMgdXNlZCB0byBnZW5lcmF0ZSBhbiBlbGVtZW50LgorICAgICAgICogIEByZXR1cm4gIEEgcGFpciwgb2Ygd2hpY2ggdGhlIGZpcnN0IGVsZW1lbnQgaXMgYW4gaXRlcmF0b3IgdGhhdCBwb2ludHMKKyAgICAgICAqICAgICAgICAgICB0byB0aGUgcG9zc2libHkgaW5zZXJ0ZWQgZWxlbWVudCwgYW5kIHRoZSBzZWNvbmQgaXMgYSBib29sCisgICAgICAgKiAgICAgICAgICAgdGhhdCBpcyB0cnVlIGlmIHRoZSBlbGVtZW50IHdhcyBhY3R1YWxseSBpbnNlcnRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBidWlsZCBhbmQgaW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUKKyAgICAgICAqICAldW5vcmRlcmVkX3NldC4gQW4gJXVub3JkZXJlZF9zZXQgcmVsaWVzIG9uIHVuaXF1ZSBrZXlzIGFuZCB0aHVzIGFuCisgICAgICAgKiAgZWxlbWVudCBpcyBvbmx5IGluc2VydGVkIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgaW4gdGhlCisgICAgICAgKiAgJXVub3JkZXJlZF9zZXQuCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBhbW9ydGl6ZWQgY29uc3RhbnQgdGltZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorCWVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyByZXR1cm4gX01faC5lbXBsYWNlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGluc2VydCBhbiBlbGVtZW50IGludG8gdGhlICV1bm9yZGVyZWRfc2V0LgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIEFuIGl0ZXJhdG9yIHRoYXQgc2VydmVzIGFzIGEgaGludCBhcyB0byB3aGVyZSB0aGUKKyAgICAgICAqICAgICAgICAgICAgICAgIGVsZW1lbnQgc2hvdWxkIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgX19hcmdzICBBcmd1bWVudHMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZWxlbWVudCB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgIGluc2VydGVkLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGVsZW1lbnQgd2l0aCBrZXkgZXF1aXZhbGVudCB0bworICAgICAgICogICAgICAgICAgdGhlIG9uZSBnZW5lcmF0ZWQgZnJvbSBAYSBfX2FyZ3MgKG1heSBvciBtYXkgbm90IGJlIHRoZQorICAgICAgICogICAgICAgICAgZWxlbWVudCBpdHNlbGYpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBjb25jZXJuZWQgYWJvdXQgd2hldGhlciB0aGUgaW5zZXJ0aW9uIHRvb2sgcGxhY2UsCisgICAgICAgKiAgYW5kIHRodXMgZG9lcyBub3QgcmV0dXJuIGEgYm9vbGVhbiBsaWtlIHRoZSBzaW5nbGUtYXJndW1lbnQgZW1wbGFjZSgpCisgICAgICAgKiAgZG9lcy4gIE5vdGUgdGhhdCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIG9ubHkgYSBoaW50IGFuZCBjYW4KKyAgICAgICAqICBwb3RlbnRpYWxseSBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgaW5zZXJ0aW9uIHByb2Nlc3MuICBBIGJhZAorICAgICAgICogIGhpbnQgd291bGQgY2F1c2Ugbm8gZ2FpbnMgaW4gZWZmaWNpZW5jeS4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIG1vcmUgb24gQGEgaGludGluZywgc2VlOgorICAgICAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MDdjaDE3Lmh0bWwKKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGFtb3J0aXplZCBjb25zdGFudCB0aW1lLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX3BvcywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyByZXR1cm4gX01faC5lbXBsYWNlX2hpbnQoX19wb3MsIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGluc2VydCBhbiBlbGVtZW50IGludG8gdGhlICV1bm9yZGVyZWRfc2V0LgorICAgICAgICogIEBwYXJhbSAgX194ICBFbGVtZW50IHRvIGJlIGluc2VydGVkLgorICAgICAgICogIEByZXR1cm4gIEEgcGFpciwgb2Ygd2hpY2ggdGhlIGZpcnN0IGVsZW1lbnQgaXMgYW4gaXRlcmF0b3IgdGhhdCBwb2ludHMKKyAgICAgICAqICAgICAgICAgICB0byB0aGUgcG9zc2libHkgaW5zZXJ0ZWQgZWxlbWVudCwgYW5kIHRoZSBzZWNvbmQgaXMgYSBib29sCisgICAgICAgKiAgICAgICAgICAgdGhhdCBpcyB0cnVlIGlmIHRoZSBlbGVtZW50IHdhcyBhY3R1YWxseSBpbnNlcnRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBpbnNlcnQgYW4gZWxlbWVudCBpbnRvIHRoZSAldW5vcmRlcmVkX3NldC4KKyAgICAgICAqICBBbiAldW5vcmRlcmVkX3NldCByZWxpZXMgb24gdW5pcXVlIGtleXMgYW5kIHRodXMgYW4gZWxlbWVudCBpcyBvbmx5CisgICAgICAgKiAgaW5zZXJ0ZWQgaWYgaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudCBpbiB0aGUgJXVub3JkZXJlZF9zZXQuCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBhbW9ydGl6ZWQgY29uc3RhbnQgdGltZS4KKyAgICAgICAqLworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX2guaW5zZXJ0KF9feCk7IH0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7IHJldHVybiBfTV9oLmluc2VydChzdGQ6Om1vdmUoX194KSk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGluc2VydCBhbiBlbGVtZW50IGludG8gdGhlICV1bm9yZGVyZWRfc2V0LgorICAgICAgICogIEBwYXJhbSAgX19oaW50ICBBbiBpdGVyYXRvciB0aGF0IHNlcnZlcyBhcyBhIGhpbnQgYXMgdG8gd2hlcmUgdGhlCisgICAgICAgKiAgICAgICAgICAgICAgICAgZWxlbWVudCBzaG91bGQgYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEVsZW1lbnQgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHJldHVybiBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZWxlbWVudCB3aXRoIGtleSBvZgorICAgICAgICogICAgICAgICAgIEBhIF9feCAobWF5IG9yIG1heSBub3QgYmUgdGhlIGVsZW1lbnQgcGFzc2VkIGluKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBub3QgY29uY2VybmVkIGFib3V0IHdoZXRoZXIgdGhlIGluc2VydGlvbiB0b29rIHBsYWNlLAorICAgICAgICogIGFuZCB0aHVzIGRvZXMgbm90IHJldHVybiBhIGJvb2xlYW4gbGlrZSB0aGUgc2luZ2xlLWFyZ3VtZW50IGluc2VydCgpCisgICAgICAgKiAgZG9lcy4gIE5vdGUgdGhhdCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIG9ubHkgYSBoaW50IGFuZCBjYW4KKyAgICAgICAqICBwb3RlbnRpYWxseSBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgaW5zZXJ0aW9uIHByb2Nlc3MuICBBIGJhZAorICAgICAgICogIGhpbnQgd291bGQgY2F1c2Ugbm8gZ2FpbnMgaW4gZWZmaWNpZW5jeS4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIG1vcmUgb24gQGEgaGludGluZywgc2VlOgorICAgICAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MDdjaDE3Lmh0bWwKKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGFtb3J0aXplZCBjb25zdGFudC4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2hpbnQsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX2guaW5zZXJ0KF9faGludCwgX194KTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgdmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX2guaW5zZXJ0KF9faGludCwgc3RkOjptb3ZlKF9feCkpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBIHRlbXBsYXRlIGZ1bmN0aW9uIHRoYXQgYXR0ZW1wdHMgdG8gaW5zZXJ0IGEgcmFuZ2Ugb2YKKyAgICAgICAqICBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgX19sYXN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSByYW5nZS4KKyAgICAgICAqCisgICAgICAgKiAgQ29tcGxleGl0eSBzaW1pbGFyIHRvIHRoYXQgb2YgdGhlIHJhbmdlIGNvbnN0cnVjdG9yLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwl2b2lkCisJaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKwl7IF9NX2guaW5zZXJ0KF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGluc2VydCBhIGxpc3Qgb2YgZWxlbWVudHMgaW50byB0aGUgJXVub3JkZXJlZF9zZXQuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEEgc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IG9mIGVsZW1lbnRzCisgICAgICAgKiAgICAgICAgICAgICAgIHRvIGJlIGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBDb21wbGV4aXR5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgcmFuZ2UgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgX01faC5pbnNlcnQoX19sKTsgfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGFuIGVsZW1lbnQgZnJvbSBhbiAldW5vcmRlcmVkX3NldC4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IGltbWVkaWF0ZWx5IGZvbGxvd2luZworICAgICAgICogICAgICAgICAgQGEgX19wb3NpdGlvbiBwcmlvciB0byB0aGUgZWxlbWVudCBiZWluZyBlcmFzZWQuIElmIG5vIHN1Y2gKKyAgICAgICAqICAgICAgICAgIGVsZW1lbnQgZXhpc3RzLCBlbmQoKSBpcyByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYW4gZWxlbWVudCwgcG9pbnRlZCB0byBieSB0aGUgZ2l2ZW4gaXRlcmF0b3IsCisgICAgICAgKiAgZnJvbSBhbiAldW5vcmRlcmVkX3NldC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZQorICAgICAgICogIGVsZW1lbnQsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvCisgICAgICAgKiAgbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzCisgICAgICAgKiAgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyByZXR1cm4gX01faC5lcmFzZShfX3Bvc2l0aW9uKTsgfQorCisgICAgICAvLyBMV0cgMjA1OS4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX2l0KQorICAgICAgeyByZXR1cm4gX01faC5lcmFzZShfX2l0KTsgfQorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGVsZW1lbnRzIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgb2YgZWxlbWVudCB0byBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyBlcmFzZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGFsbCB0aGUgZWxlbWVudHMgbG9jYXRlZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KKyAgICAgICAqICBhbiAldW5vcmRlcmVkX3NldC4gRm9yIGFuICV1bm9yZGVyZWRfc2V0IHRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbgorICAgICAgICogIGNhbiBvbmx5IGJlIDAgKG5vdCBwcmVzZW50KSBvciAxIChwcmVzZW50KS4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYKKyAgICAgICAqICB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQKKyAgICAgICAqICBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01faC5lcmFzZShfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgYSBbX19maXJzdCxfX2xhc3QpIHJhbmdlIG9mIGVsZW1lbnRzIGZyb20gYW4KKyAgICAgICAqICAldW5vcmRlcmVkX3NldC4KKyAgICAgICAqICBAcGFyYW0gIF9fZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgZXJhc2VkLgorICAgICAgICogIEBwYXJhbSBfX2xhc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvCisgICAgICAgKiAgICAgICAgICAgICAgICBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiBUaGUgaXRlcmF0b3IgQGEgX19sYXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhIHNlcXVlbmNlIG9mIGVsZW1lbnRzIGZyb20gYW4gJXVub3JkZXJlZF9zZXQuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGF0IGlmCisgICAgICAgKiAgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkCisgICAgICAgKiAgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7IHJldHVybiBfTV9oLmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgRXJhc2VzIGFsbCBlbGVtZW50cyBpbiBhbiAldW5vcmRlcmVkX3NldC4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seQorICAgICAgICogIGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywKKyAgICAgICAqICB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gTWFuYWdpbmcgdGhlIHBvaW50ZXIKKyAgICAgICAqICBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIG5vZXhjZXB0CisgICAgICB7IF9NX2guY2xlYXIoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN3YXBzIGRhdGEgd2l0aCBhbm90aGVyICV1bm9yZGVyZWRfc2V0LgorICAgICAgICogIEBwYXJhbSAgX194ICBBbiAldW5vcmRlcmVkX3NldCBvZiB0aGUgc2FtZSBlbGVtZW50IGFuZCBhbGxvY2F0b3IKKyAgICAgICAqICB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBleGNoYW5nZXMgdGhlIGVsZW1lbnRzIGJldHdlZW4gdHdvIHNldHMgaW4gY29uc3RhbnQgdGltZS4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGdsb2JhbCBzdGQ6OnN3YXAoKSBmdW5jdGlvbiBpcyBzcGVjaWFsaXplZCBzdWNoIHRoYXQKKyAgICAgICAqICBzdGQ6OnN3YXAoczEsczIpIHdpbGwgZmVlZCB0byB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzd2FwKHVub3JkZXJlZF9zZXQmIF9feCkKKyAgICAgIHsgX01faC5zd2FwKF9feC5fTV9oKTsgfQorCisgICAgICAvLyBvYnNlcnZlcnMuCisKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgaGFzaCBmdW5jdG9yIG9iamVjdCB3aXRoIHdoaWNoIHRoZSAldW5vcmRlcmVkX3NldCB3YXMKKyAgICAgIC8vLyAgY29uc3RydWN0ZWQuCisgICAgICBoYXNoZXIKKyAgICAgIGhhc2hfZnVuY3Rpb24oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5oYXNoX2Z1bmN0aW9uKCk7IH0KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBrZXkgY29tcGFyaXNvbiBvYmplY3Qgd2l0aCB3aGljaCB0aGUgJXVub3JkZXJlZF9zZXQgd2FzCisgICAgICAvLy8gIGNvbnN0cnVjdGVkLgorICAgICAga2V5X2VxdWFsCisgICAgICBrZXlfZXEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5rZXlfZXEoKTsgfQorCisgICAgICAvLyBsb29rdXAuCisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUcmllcyB0byBsb2NhdGUgYW4gZWxlbWVudCBpbiBhbiAldW5vcmRlcmVkX3NldC4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgRWxlbWVudCB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHNvdWdodC1hZnRlciBlbGVtZW50LCBvciBlbmQoKSBpZiBub3QKKyAgICAgICAqICAgICAgICAgICBmb3VuZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGtleSBhbmQgdHJpZXMgdG8gbG9jYXRlIHRoZSBlbGVtZW50IHdpdGggd2hpY2gKKyAgICAgICAqICB0aGUga2V5IG1hdGNoZXMuICBJZiBzdWNjZXNzZnVsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIGl0ZXJhdG9yCisgICAgICAgKiAgcG9pbnRpbmcgdG8gdGhlIHNvdWdodCBhZnRlciBlbGVtZW50LiAgSWYgdW5zdWNjZXNzZnVsIGl0IHJldHVybnMgdGhlCisgICAgICAgKiAgcGFzdC10aGUtZW5kICggQGMgZW5kKCkgKSBpdGVyYXRvci4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX2guZmluZChfX3gpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmZpbmQoX194KTsgfQorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEVsZW1lbnQgdG8gbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBOdW1iZXIgb2YgZWxlbWVudHMgd2l0aCBzcGVjaWZpZWQga2V5LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIG9ubHkgbWFrZXMgc2Vuc2UgZm9yIHVub3JkZXJlZF9tdWx0aXNldHM7IGZvcgorICAgICAgICogIHVub3JkZXJlZF9zZXQgdGhlIHJlc3VsdCB3aWxsIGVpdGhlciBiZSAwIChub3QgcHJlc2VudCkgb3IgMQorICAgICAgICogIChwcmVzZW50KS4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5jb3VudChfX3gpOyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgUGFpciBvZiBpdGVyYXRvcnMgdGhhdCBwb3NzaWJseSBwb2ludHMgdG8gdGhlIHN1YnNlcXVlbmNlCisgICAgICAgKiAgICAgICAgICAgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHByb2JhYmx5IG9ubHkgbWFrZXMgc2Vuc2UgZm9yIG11bHRpc2V0cy4KKyAgICAgICAqLworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV9oLmVxdWFsX3JhbmdlKF9feCk7IH0KKworICAgICAgc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmVxdWFsX3JhbmdlKF9feCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy8gYnVja2V0IGludGVyZmFjZS4KKworICAgICAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBidWNrZXRzIG9mIHRoZSAldW5vcmRlcmVkX3NldC4KKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0X2NvdW50KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guYnVja2V0X2NvdW50KCk7IH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ1Y2tldHMgb2YgdGhlICV1bm9yZGVyZWRfc2V0LgorICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfYnVja2V0X2NvdW50KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2gubWF4X2J1Y2tldF9jb3VudCgpOyB9CisKKyAgICAgIC8qCisgICAgICAgKiBAYnJpZWYgIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIGdpdmVuIGJ1Y2tldC4KKyAgICAgICAqIEBwYXJhbSAgX19uICBBIGJ1Y2tldCBpbmRleC4KKyAgICAgICAqIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGJ1Y2tldC4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfc2l6ZShzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5idWNrZXRfc2l6ZShfX24pOyB9CisKKyAgICAgIC8qCisgICAgICAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGJ1Y2tldCBpbmRleCBvZiBhIGdpdmVuIGVsZW1lbnQuCisgICAgICAgKiBAcGFyYW0gIF9fa2V5ICBBIGtleSBpbnN0YW5jZS4KKyAgICAgICAqIEByZXR1cm4gIFRoZSBrZXkgYnVja2V0IGluZGV4LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmJ1Y2tldChfX2tleSk7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgICAgICAgIGJ1Y2tldCBlbGVtZW50LgorICAgICAgICogIEBwYXJhbSAgX19uIFRoZSBidWNrZXQgaW5kZXguCisgICAgICAgKiAgQHJldHVybiAgQSByZWFkLW9ubHkgbG9jYWwgaXRlcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gX01faC5iZWdpbihfX24pOyB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5iZWdpbihfX24pOyB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBjYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guY2JlZ2luKF9fbik7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgcG9pbnRpbmcgdG8gb25lIHBhc3QKKyAgICAgICAqICAgICAgICAgdGhlIGxhc3QgYnVja2V0IGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19uIFRoZSBidWNrZXQgaW5kZXguCisgICAgICAgKiAgQHJldHVybiAgQSByZWFkLW9ubHkgbG9jYWwgaXRlcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBlbmQoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIF9NX2guZW5kKF9fbik7IH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGVuZChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5lbmQoX19uKTsgfQorCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgY2VuZChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5jZW5kKF9fbik7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy8gaGFzaCBwb2xpY3kuCisKKyAgICAgIC8vLyBSZXR1cm5zIHRoZSBhdmVyYWdlIG51bWJlciBvZiBlbGVtZW50cyBwZXIgYnVja2V0LgorICAgICAgZmxvYXQKKyAgICAgIGxvYWRfZmFjdG9yKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2gubG9hZF9mYWN0b3IoKTsgfQorCisgICAgICAvLy8gUmV0dXJucyBhIHBvc2l0aXZlIG51bWJlciB0aGF0IHRoZSAldW5vcmRlcmVkX3NldCB0cmllcyB0byBrZWVwIHRoZQorICAgICAgLy8vIGxvYWQgZmFjdG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0by4KKyAgICAgIGZsb2F0CisgICAgICBtYXhfbG9hZF9mYWN0b3IoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5tYXhfbG9hZF9mYWN0b3IoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENoYW5nZSB0aGUgJXVub3JkZXJlZF9zZXQgbWF4aW11bSBsb2FkIGZhY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9feiBUaGUgbmV3IG1heGltdW0gbG9hZCBmYWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIG1heF9sb2FkX2ZhY3RvcihmbG9hdCBfX3opCisgICAgICB7IF9NX2gubWF4X2xvYWRfZmFjdG9yKF9feik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNYXkgcmVoYXNoIHRoZSAldW5vcmRlcmVkX3NldC4KKyAgICAgICAqICBAcGFyYW0gIF9fbiBUaGUgbmV3IG51bWJlciBvZiBidWNrZXRzLgorICAgICAgICoKKyAgICAgICAqICBSZWhhc2ggd2lsbCBvY2N1ciBvbmx5IGlmIHRoZSBuZXcgbnVtYmVyIG9mIGJ1Y2tldHMgcmVzcGVjdCB0aGUKKyAgICAgICAqICAldW5vcmRlcmVkX3NldCBtYXhpbXVtIGxvYWQgZmFjdG9yLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZWhhc2goc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgX01faC5yZWhhc2goX19uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFByZXBhcmUgdGhlICV1bm9yZGVyZWRfc2V0IGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YKKyAgICAgICAqICAgICAgICAgIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19uIE51bWJlciBvZiBlbGVtZW50cyByZXF1aXJlZC4KKyAgICAgICAqCisgICAgICAgKiAgU2FtZSBhcyByZWhhc2goY2VpbChuIC8gbWF4X2xvYWRfZmFjdG9yKCkpKS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXJ2ZShzaXplX3R5cGUgX19uKQorICAgICAgeyBfTV9oLnJlc2VydmUoX19uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUxLCB0eXBlbmFtZSBfSGFzaDEsIHR5cGVuYW1lIF9QcmVkMSwKKwkgICAgICAgdHlwZW5hbWUgX0FsbG9jMT4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgdW5vcmRlcmVkX3NldDxfVmFsdWUxLCBfSGFzaDEsIF9QcmVkMSwgX0FsbG9jMT4mLAorCQkgY29uc3QgdW5vcmRlcmVkX3NldDxfVmFsdWUxLCBfSGFzaDEsIF9QcmVkMSwgX0FsbG9jMT4mKTsKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIEEgc3RhbmRhcmQgY29udGFpbmVyIGNvbXBvc2VkIG9mIGVxdWl2YWxlbnQga2V5cworICAgKiAgKHBvc3NpYmx5IGNvbnRhaW5pbmcgbXVsdGlwbGUgb2YgZWFjaCBrZXkgdmFsdWUpIGluIHdoaWNoIHRoZQorICAgKiAgZWxlbWVudHMnIGtleXMgYXJlIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzLgorICAgKgorICAgKiAgQGluZ3JvdXAgdW5vcmRlcmVkX2Fzc29jaWF0aXZlX2NvbnRhaW5lcnMKKyAgICoKKyAgICogIEB0cGFyYW0gIF9WYWx1ZSAgVHlwZSBvZiBrZXkgb2JqZWN0cy4KKyAgICogIEB0cGFyYW0gIF9IYXNoICBIYXNoaW5nIGZ1bmN0aW9uIG9iamVjdCB0eXBlLCBkZWZhdWx0cyB0byBoYXNoPF9WYWx1ZT4uCisgICAqICBAdHBhcmFtICBfUHJlZCAgUHJlZGljYXRlIGZ1bmN0aW9uIG9iamVjdCB0eXBlLCBkZWZhdWx0cworICAgKiAgICAgICAgICAgICAgICAgIHRvIGVxdWFsX3RvPF9WYWx1ZT4uCisgICAqICBAdHBhcmFtICBfQWxsb2MgIEFsbG9jYXRvciB0eXBlLCBkZWZhdWx0cyB0byBhbGxvY2F0b3I8X0tleT4uCisgICAqCisgICAqICBNZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sIGFuZAorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjeHgiPnVub3JkZXJlZCBhc3NvY2lhdGl2ZSBjb250YWluZXI8L2E+CisgICAqCisgICAqICBCYXNlIGlzIF9IYXNodGFibGUsIGRpc3BhdGNoZWQgYXQgY29tcGlsZSB0aW1lIHZpYSB0ZW1wbGF0ZQorICAgKiAgYWxpYXMgX191bXNldF9oYXNodGFibGUuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsCisJICAgY2xhc3MgX0hhc2ggPSBoYXNoPF9WYWx1ZT4sCisJICAgY2xhc3MgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9WYWx1ZT4sCisJICAgY2xhc3MgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8X1ZhbHVlPiA+CisgICAgY2xhc3MgdW5vcmRlcmVkX211bHRpc2V0IDogX19jaGVja19jb3B5X2NvbnN0cnVjdGlibGU8X0FsbG9jPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX191bXNldF9oYXNodGFibGU8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4gIF9IYXNodGFibGU7CisgICAgICBfSGFzaHRhYmxlIF9NX2g7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlZGVmczoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBQdWJsaWMgdHlwZWRlZnMuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmtleV90eXBlCWtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjp2YWx1ZV90eXBlCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6Omhhc2hlcgloYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmtleV9lcXVhbAlrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvLy8gIEl0ZXJhdG9yLXJlbGF0ZWQgdHlwZWRlZnMuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpwb2ludGVyCQlwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6Y29uc3RfcG9pbnRlcgljb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6cmVmZXJlbmNlCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OmNvbnN0X3JlZmVyZW5jZQljb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6Oml0ZXJhdG9yCQlpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6Y29uc3RfaXRlcmF0b3IJY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmxvY2FsX2l0ZXJhdG9yCWxvY2FsX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSGFzaHRhYmxlOjpjb25zdF9sb2NhbF9pdGVyYXRvcgljb25zdF9sb2NhbF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0hhc2h0YWJsZTo6c2l6ZV90eXBlCQlzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IYXNodGFibGU6OmRpZmZlcmVuY2VfdHlwZQlkaWZmZXJlbmNlX3R5cGU7CisgICAgICAvL0B9CisKKyAgICAgIC8vIGNvbnN0cnVjdC9kZXN0cm95L2NvcHkKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIG5vIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSBfX24gIEluaXRpYWwgbnVtYmVyIG9mIGJ1Y2tldHMuCisgICAgICAgKiAgQHBhcmFtIF9faGYgIEEgaGFzaCBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSBfX2VxbCAgQSBrZXkgZXF1YWxpdHkgZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gX19hICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgdW5vcmRlcmVkX211bHRpc2V0KHNpemVfdHlwZSBfX24gPSAxMCwKKwkJCSBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX2goX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGFuICV1bm9yZGVyZWRfbXVsdGlzZXQgZnJvbSBhIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2xhc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSBfX24gIE1pbmltYWwgaW5pdGlhbCBudW1iZXIgb2YgYnVja2V0cy4KKyAgICAgICAqICBAcGFyYW0gX19oZiAgQSBoYXNoIGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fZXFsICBBIGtleSBlcXVhbGl0eSBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhbiAldW5vcmRlcmVkX211bHRpc2V0IGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cworICAgICAgICogIGZyb20gW19fZmlyc3QsX19sYXN0KS4gIFRoaXMgaXMgbGluZWFyIGluIE4gKHdoZXJlIE4gaXMKKyAgICAgICAqICBkaXN0YW5jZShfX2ZpcnN0LF9fbGFzdCkpLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwl1bm9yZGVyZWRfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCQkgICBzaXplX3R5cGUgX19uID0gMCwKKwkJCSAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfTV9oKF9fZiwgX19sLCBfX24sIF9faGYsIF9fZXFsLCBfX2EpCisJeyB9CisKKyAgICAgIC8vLyBDb3B5IGNvbnN0cnVjdG9yLgorICAgICAgdW5vcmRlcmVkX211bHRpc2V0KGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldCYpID0gZGVmYXVsdDsKKworICAgICAgLy8vIE1vdmUgY29uc3RydWN0b3IuCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQodW5vcmRlcmVkX211bHRpc2V0JiYpID0gZGVmYXVsdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYW4gJXVub3JkZXJlZF9tdWx0aXNldCBmcm9tIGFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTWluaW1hbCBpbml0aWFsIG51bWJlciBvZiBidWNrZXRzLgorICAgICAgICogIEBwYXJhbSBfX2hmICBBIGhhc2ggZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gX19lcWwgIEEga2V5IGVxdWFsaXR5IGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhbiAldW5vcmRlcmVkX211bHRpc2V0IGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBpbgorICAgICAgICogIHRoZSBsaXN0LiBUaGlzIGlzIGxpbmVhciBpbiBOICh3aGVyZSBOIGlzIEBhIF9fbC5zaXplKCkpLgorICAgICAgICovCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJCQkgc2l6ZV90eXBlIF9fbiA9IDAsCisJCQkgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX01faChfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgIHsgfQorCisgICAgICAvLy8gQ29weSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgdW5vcmRlcmVkX211bHRpc2V0JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldCYpID0gZGVmYXVsdDsKKworICAgICAgLy8vIE1vdmUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldCYKKyAgICAgIG9wZXJhdG9yPSh1bm9yZGVyZWRfbXVsdGlzZXQmJiBfX3gpID0gZGVmYXVsdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlVW5vcmRlcmVkX211bHRpc2V0IGxpc3QgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhbiAldW5vcmRlcmVkX211bHRpc2V0IHdpdGggY29waWVzIG9mIHRoZSBlbGVtZW50cworICAgICAgICogIGluIHRoZSBpbml0aWFsaXplciBsaXN0IEBhIF9fbC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBhc3NpZ25tZW50IGNvbXBsZXRlbHkgY2hhbmdlcyB0aGUgJXVub3JkZXJlZF9tdWx0aXNldAorICAgICAgICogIGFuZCB0aGF0IHRoZSByZXN1bHRpbmcgJXVub3JkZXJlZF9zZXQncyBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIKKyAgICAgICAqICBvZiBlbGVtZW50cyBhc3NpZ25lZC4gIE9sZCBkYXRhIG1heSBiZSBsb3N0LgorICAgICAgICovCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJX01faCA9IF9fbDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgYWxsb2NhdG9yIG9iamVjdCB3aXRoIHdoaWNoIHRoZSAldW5vcmRlcmVkX211bHRpc2V0IHdhcworICAgICAgLy8vICBjb25zdHJ1Y3RlZC4KKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guZ2V0X2FsbG9jYXRvcigpOyB9CisKKyAgICAgIC8vIHNpemUgYW5kIGNhcGFjaXR5OgorCisgICAgICAvLy8gIFJldHVybnMgdHJ1ZSBpZiB0aGUgJXVub3JkZXJlZF9tdWx0aXNldCBpcyBlbXB0eS4KKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2guZW1wdHkoKTsgfQorCisgICAgICAvLy8gIFJldHVybnMgdGhlIHNpemUgb2YgdGhlICV1bm9yZGVyZWRfbXVsdGlzZXQuCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5zaXplKCk7IH0KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlICV1bm9yZGVyZWRfbXVsdGlzZXQuCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2gubWF4X3NpemUoKTsgfQorCisgICAgICAvLyBpdGVyYXRvcnMuCisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAldW5vcmRlcmVkX211bHRpc2V0LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5iZWdpbigpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmJlZ2luKCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJXVub3JkZXJlZF9tdWx0aXNldC4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmVuZCgpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5lbmQoKTsgfQorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJXVub3JkZXJlZF9tdWx0aXNldC4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJXVub3JkZXJlZF9tdWx0aXNldC4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01faC5lbmQoKTsgfQorCisgICAgICAvLyBtb2RpZmllcnMuCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBCdWlsZHMgYW5kIGluc2VydCBhbiBlbGVtZW50IGludG8gdGhlICV1bm9yZGVyZWRfbXVsdGlzZXQuCisgICAgICAgKiAgQHBhcmFtIF9fYXJncyAgQXJndW1lbnRzIHVzZWQgdG8gZ2VuZXJhdGUgYW4gZWxlbWVudC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgZWxlbWVudC4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGFtb3J0aXplZCBjb25zdGFudCB0aW1lLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyByZXR1cm4gX01faC5lbXBsYWNlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEluc2VydHMgYW4gZWxlbWVudCBpbnRvIHRoZSAldW5vcmRlcmVkX211bHRpc2V0LgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIEFuIGl0ZXJhdG9yIHRoYXQgc2VydmVzIGFzIGEgaGludCBhcyB0byB3aGVyZSB0aGUKKyAgICAgICAqICAgICAgICAgICAgICAgIGVsZW1lbnQgc2hvdWxkIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgX19hcmdzICBBcmd1bWVudHMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZWxlbWVudCB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgIGluc2VydGVkLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIGVsZW1lbnQuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIG9ubHkgYSBoaW50IGFuZCBjYW4gcG90ZW50aWFsbHkKKyAgICAgICAqICBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgaW5zZXJ0aW9uIHByb2Nlc3MuICBBIGJhZCBoaW50IHdvdWxkCisgICAgICAgKiAgY2F1c2Ugbm8gZ2FpbnMgaW4gZWZmaWNpZW5jeS4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIG1vcmUgb24gQGEgaGludGluZywgc2VlOgorICAgICAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MDdjaDE3Lmh0bWwKKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGFtb3J0aXplZCBjb25zdGFudCB0aW1lLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX3BvcywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyByZXR1cm4gX01faC5lbXBsYWNlX2hpbnQoX19wb3MsIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEluc2VydHMgYW4gZWxlbWVudCBpbnRvIHRoZSAldW5vcmRlcmVkX211bHRpc2V0LgorICAgICAgICogIEBwYXJhbSAgX194ICBFbGVtZW50IHRvIGJlIGluc2VydGVkLgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBpbnNlcnRlZCBlbGVtZW50LgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRpb24gcmVxdWlyZXMgYW1vcnRpemVkIGNvbnN0YW50IHRpbWUuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01faC5pbnNlcnQoX194KTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7IHJldHVybiBfTV9oLmluc2VydChzdGQ6Om1vdmUoX194KSk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEluc2VydHMgYW4gZWxlbWVudCBpbnRvIHRoZSAldW5vcmRlcmVkX211bHRpc2V0LgorICAgICAgICogIEBwYXJhbSAgX19oaW50ICBBbiBpdGVyYXRvciB0aGF0IHNlcnZlcyBhcyBhIGhpbnQgYXMgdG8gd2hlcmUgdGhlCisgICAgICAgKiAgICAgICAgICAgICAgICAgZWxlbWVudCBzaG91bGQgYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEVsZW1lbnQgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHJldHVybiBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgZWxlbWVudC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgb25seSBhIGhpbnQgYW5kIGNhbiBwb3RlbnRpYWxseQorICAgICAgICogIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBpbnNlcnRpb24gcHJvY2Vzcy4gIEEgYmFkIGhpbnQgd291bGQKKyAgICAgICAqICBjYXVzZSBubyBnYWlucyBpbiBlZmZpY2llbmN5LgorICAgICAgICoKKyAgICAgICAqICBGb3IgbW9yZSBvbiBAYSBoaW50aW5nLCBzZWU6CisgICAgICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQwN2NoMTcuaHRtbAorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRpb24gcmVxdWlyZXMgYW1vcnRpemVkIGNvbnN0YW50LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01faC5pbnNlcnQoX19oaW50LCBfX3gpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19oaW50LCB2YWx1ZV90eXBlJiYgX194KQorICAgICAgeyByZXR1cm4gX01faC5pbnNlcnQoX19oaW50LCBzdGQ6Om1vdmUoX194KSk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEEgdGVtcGxhdGUgZnVuY3Rpb24gdGhhdCBpbnNlcnRzIGEgcmFuZ2Ugb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBfX2ZpcnN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgICBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIF9fbGFzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UuCisgICAgICAgKgorICAgICAgICogIENvbXBsZXhpdHkgc2ltaWxhciB0byB0aGF0IG9mIHRoZSByYW5nZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJdm9pZAorCWluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisJeyBfTV9oLmluc2VydChfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBJbnNlcnRzIGEgbGlzdCBvZiBlbGVtZW50cyBpbnRvIHRoZSAldW5vcmRlcmVkX211bHRpc2V0LgorICAgICAgICogIEBwYXJhbSAgX19sICBBIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBvZiBlbGVtZW50cyB0byBiZQorICAgICAgICogICAgICAgICAgICAgIGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBDb21wbGV4aXR5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgcmFuZ2UgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgX01faC5pbnNlcnQoX19sKTsgfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGFuIGVsZW1lbnQgZnJvbSBhbiAldW5vcmRlcmVkX211bHRpc2V0LgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgaW1tZWRpYXRlbHkgZm9sbG93aW5nCisgICAgICAgKiAgICAgICAgICBAYSBfX3Bvc2l0aW9uIHByaW9yIHRvIHRoZSBlbGVtZW50IGJlaW5nIGVyYXNlZC4gSWYgbm8gc3VjaAorICAgICAgICogICAgICAgICAgZWxlbWVudCBleGlzdHMsIGVuZCgpIGlzIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhbiBlbGVtZW50LCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBpdGVyYXRvciwKKyAgICAgICAqICBmcm9tIGFuICV1bm9yZGVyZWRfbXVsdGlzZXQuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LCBhbmQgdGhhdCBpZiB0aGUKKyAgICAgICAqICBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbgorICAgICAgICogIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgcmV0dXJuIF9NX2guZXJhc2UoX19wb3NpdGlvbik7IH0KKworICAgICAgLy8gTFdHIDIwNTkuCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19pdCkKKyAgICAgIHsgcmV0dXJuIF9NX2guZXJhc2UoX19pdCk7IH0KKyAgICAgIC8vQH0KKworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGVsZW1lbnRzIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQga2V5LgorICAgICAgICogIEBwYXJhbSAgX194ICBLZXkgb2YgZWxlbWVudCB0byBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyBlcmFzZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGFsbCB0aGUgZWxlbWVudHMgbG9jYXRlZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KKyAgICAgICAqICBhbiAldW5vcmRlcmVkX211bHRpc2V0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYgdGhlCisgICAgICAgKiAgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4KKyAgICAgICAqICBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01faC5lcmFzZShfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgYSBbX19maXJzdCxfX2xhc3QpIHJhbmdlIG9mIGVsZW1lbnRzIGZyb20gYW4KKyAgICAgICAqICAldW5vcmRlcmVkX211bHRpc2V0LgorICAgICAgICogIEBwYXJhbSAgX19maXJzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgICBlcmFzZWQuCisgICAgICAgKiAgQHBhcmFtIF9fbGFzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UgdG8KKyAgICAgICAqICAgICAgICAgICAgICAgIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuIFRoZSBpdGVyYXRvciBAYSBfX2xhc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMgZnJvbSBhbgorICAgICAgICogICV1bm9yZGVyZWRfbXVsdGlzZXQuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LCBhbmQgdGhhdCBpZgorICAgICAgICogIHRoZSBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZAorICAgICAgICogIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyByZXR1cm4gX01faC5lcmFzZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEVyYXNlcyBhbGwgZWxlbWVudHMgaW4gYW4gJXVub3JkZXJlZF9tdWx0aXNldC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnRzLCBhbmQgdGhhdCBpZiB0aGUKKyAgICAgICAqICBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkCisgICAgICAgKiAgaW4gYW55IHdheS4gTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBub2V4Y2VwdAorICAgICAgeyBfTV9oLmNsZWFyKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTd2FwcyBkYXRhIHdpdGggYW5vdGhlciAldW5vcmRlcmVkX211bHRpc2V0LgorICAgICAgICogIEBwYXJhbSAgX194ICBBbiAldW5vcmRlcmVkX211bHRpc2V0IG9mIHRoZSBzYW1lIGVsZW1lbnQgYW5kIGFsbG9jYXRvcgorICAgICAgICogIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGV4Y2hhbmdlcyB0aGUgZWxlbWVudHMgYmV0d2VlbiB0d28gc2V0cyBpbiBjb25zdGFudCB0aW1lLgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZ2xvYmFsIHN0ZDo6c3dhcCgpIGZ1bmN0aW9uIGlzIHNwZWNpYWxpemVkIHN1Y2ggdGhhdAorICAgICAgICogIHN0ZDo6c3dhcChzMSxzMikgd2lsbCBmZWVkIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodW5vcmRlcmVkX211bHRpc2V0JiBfX3gpCisgICAgICB7IF9NX2guc3dhcChfX3guX01faCk7IH0KKworICAgICAgLy8gb2JzZXJ2ZXJzLgorCisgICAgICAvLy8gIFJldHVybnMgdGhlIGhhc2ggZnVuY3RvciBvYmplY3Qgd2l0aCB3aGljaCB0aGUgJXVub3JkZXJlZF9tdWx0aXNldAorICAgICAgLy8vICB3YXMgY29uc3RydWN0ZWQuCisgICAgICBoYXNoZXIKKyAgICAgIGhhc2hfZnVuY3Rpb24oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5oYXNoX2Z1bmN0aW9uKCk7IH0KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBrZXkgY29tcGFyaXNvbiBvYmplY3Qgd2l0aCB3aGljaCB0aGUgJXVub3JkZXJlZF9tdWx0aXNldAorICAgICAgLy8vICB3YXMgY29uc3RydWN0ZWQuCisgICAgICBrZXlfZXF1YWwKKyAgICAgIGtleV9lcSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmtleV9lcSgpOyB9CisKKyAgICAgIC8vIGxvb2t1cC4KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFRyaWVzIHRvIGxvY2F0ZSBhbiBlbGVtZW50IGluIGFuICV1bm9yZGVyZWRfbXVsdGlzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3ggIEVsZW1lbnQgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBwb2ludGluZyB0byBzb3VnaHQtYWZ0ZXIgZWxlbWVudCwgb3IgZW5kKCkgaWYgbm90CisgICAgICAgKiAgICAgICAgICAgZm91bmQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBrZXkgYW5kIHRyaWVzIHRvIGxvY2F0ZSB0aGUgZWxlbWVudCB3aXRoIHdoaWNoCisgICAgICAgKiAgdGhlIGtleSBtYXRjaGVzLiAgSWYgc3VjY2Vzc2Z1bCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBpdGVyYXRvcgorICAgICAgICogIHBvaW50aW5nIHRvIHRoZSBzb3VnaHQgYWZ0ZXIgZWxlbWVudC4gIElmIHVuc3VjY2Vzc2Z1bCBpdCByZXR1cm5zIHRoZQorICAgICAgICogIHBhc3QtdGhlLWVuZCAoIEBjIGVuZCgpICkgaXRlcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV9oLmZpbmQoX194KTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5maW5kKF9feCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX194ICBFbGVtZW50IHRvIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgTnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggc3BlY2lmaWVkIGtleS4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5jb3VudChfX3gpOyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIF9feCAgS2V5IHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgUGFpciBvZiBpdGVyYXRvcnMgdGhhdCBwb3NzaWJseSBwb2ludHMgdG8gdGhlIHN1YnNlcXVlbmNlCisgICAgICAgKiAgICAgICAgICAgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICovCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX2guZXF1YWxfcmFuZ2UoX194KTsgfQorCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guZXF1YWxfcmFuZ2UoX194KTsgfQorICAgICAgLy9AfQorCisgICAgICAvLyBidWNrZXQgaW50ZXJmYWNlLgorCisgICAgICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMgb2YgdGhlICV1bm9yZGVyZWRfbXVsdGlzZXQuCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9jb3VudCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLmJ1Y2tldF9jb3VudCgpOyB9CisKKyAgICAgIC8vLyBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBidWNrZXRzIG9mIHRoZSAldW5vcmRlcmVkX211bHRpc2V0LgorICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfYnVja2V0X2NvdW50KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2gubWF4X2J1Y2tldF9jb3VudCgpOyB9CisKKyAgICAgIC8qCisgICAgICAgKiBAYnJpZWYgIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIGdpdmVuIGJ1Y2tldC4KKyAgICAgICAqIEBwYXJhbSAgX19uICBBIGJ1Y2tldCBpbmRleC4KKyAgICAgICAqIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGJ1Y2tldC4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfc2l6ZShzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5idWNrZXRfc2l6ZShfX24pOyB9CisKKyAgICAgIC8qCisgICAgICAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGJ1Y2tldCBpbmRleCBvZiBhIGdpdmVuIGVsZW1lbnQuCisgICAgICAgKiBAcGFyYW0gIF9fa2V5ICBBIGtleSBpbnN0YW5jZS4KKyAgICAgICAqIEByZXR1cm4gIFRoZSBrZXkgYnVja2V0IGluZGV4LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oLmJ1Y2tldChfX2tleSk7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgICAgICAgIGJ1Y2tldCBlbGVtZW50LgorICAgICAgICogIEBwYXJhbSAgX19uIFRoZSBidWNrZXQgaW5kZXguCisgICAgICAgKiAgQHJldHVybiAgQSByZWFkLW9ubHkgbG9jYWwgaXRlcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gX01faC5iZWdpbihfX24pOyB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5iZWdpbihfX24pOyB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBjYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2guY2JlZ2luKF9fbik7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgcG9pbnRpbmcgdG8gb25lIHBhc3QKKyAgICAgICAqICAgICAgICAgdGhlIGxhc3QgYnVja2V0IGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgX19uIFRoZSBidWNrZXQgaW5kZXguCisgICAgICAgKiAgQHJldHVybiAgQSByZWFkLW9ubHkgbG9jYWwgaXRlcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBlbmQoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIF9NX2guZW5kKF9fbik7IH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGVuZChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5lbmQoX19uKTsgfQorCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgY2VuZChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faC5jZW5kKF9fbik7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy8gaGFzaCBwb2xpY3kuCisKKyAgICAgIC8vLyBSZXR1cm5zIHRoZSBhdmVyYWdlIG51bWJlciBvZiBlbGVtZW50cyBwZXIgYnVja2V0LgorICAgICAgZmxvYXQKKyAgICAgIGxvYWRfZmFjdG9yKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2gubG9hZF9mYWN0b3IoKTsgfQorCisgICAgICAvLy8gUmV0dXJucyBhIHBvc2l0aXZlIG51bWJlciB0aGF0IHRoZSAldW5vcmRlcmVkX211bHRpc2V0IHRyaWVzIHRvIGtlZXAgdGhlCisgICAgICAvLy8gbG9hZCBmYWN0b3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvLgorICAgICAgZmxvYXQKKyAgICAgIG1heF9sb2FkX2ZhY3RvcigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9oLm1heF9sb2FkX2ZhY3RvcigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ2hhbmdlIHRoZSAldW5vcmRlcmVkX211bHRpc2V0IG1heGltdW0gbG9hZCBmYWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3ogVGhlIG5ldyBtYXhpbXVtIGxvYWQgZmFjdG9yLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBtYXhfbG9hZF9mYWN0b3IoZmxvYXQgX196KQorICAgICAgeyBfTV9oLm1heF9sb2FkX2ZhY3RvcihfX3opOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTWF5IHJlaGFzaCB0aGUgJXVub3JkZXJlZF9tdWx0aXNldC4KKyAgICAgICAqICBAcGFyYW0gIF9fbiBUaGUgbmV3IG51bWJlciBvZiBidWNrZXRzLgorICAgICAgICoKKyAgICAgICAqICBSZWhhc2ggd2lsbCBvY2N1ciBvbmx5IGlmIHRoZSBuZXcgbnVtYmVyIG9mIGJ1Y2tldHMgcmVzcGVjdCB0aGUKKyAgICAgICAqICAldW5vcmRlcmVkX211bHRpc2V0IG1heGltdW0gbG9hZCBmYWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlaGFzaChzaXplX3R5cGUgX19uKQorICAgICAgeyBfTV9oLnJlaGFzaChfX24pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUHJlcGFyZSB0aGUgJXVub3JkZXJlZF9tdWx0aXNldCBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mCisgICAgICAgKiAgICAgICAgICBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIF9fbiBOdW1iZXIgb2YgZWxlbWVudHMgcmVxdWlyZWQuCisgICAgICAgKgorICAgICAgICogIFNhbWUgYXMgcmVoYXNoKGNlaWwobiAvIG1heF9sb2FkX2ZhY3RvcigpKSkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2VydmUoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgX01faC5yZXNlcnZlKF9fbik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlMSwgdHlwZW5hbWUgX0hhc2gxLCB0eXBlbmFtZSBfUHJlZDEsCisJICAgICAgIHR5cGVuYW1lIF9BbGxvYzE+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUxLCBfSGFzaDEsIF9QcmVkMSwgX0FsbG9jMT4mLAorCQkgY29uc3QgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZTEsIF9IYXNoMSwgX1ByZWQxLCBfQWxsb2MxPiYpOworICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJIHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9oLl9NX2VxdWFsKF9feS5fTV9oKTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2guX01fZXF1YWwoX195Ll9NX2gpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLyogX1VOT1JERVJFRF9TRVRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3VzZXNfYWxsb2NhdG9yLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdXNlc19hbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODkxM2U5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3VzZXNfYWxsb2NhdG9yLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8vIFVzZXMtYWxsb2NhdG9yIENvbnN0cnVjdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisjaWZuZGVmIF9VU0VTX0FMTE9DQVRPUl9ICisjZGVmaW5lIF9VU0VTX0FMTE9DQVRPUl9IIDEKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vLyBbYWxsb2NhdG9yLnRhZ10KKyAgc3RydWN0IGFsbG9jYXRvcl9hcmdfdCB7IH07CisKKyAgY29uc3RleHByIGFsbG9jYXRvcl9hcmdfdCBhbGxvY2F0b3JfYXJnID0gYWxsb2NhdG9yX2FyZ190KCk7CisKK19HTElCQ1hYX0hBU19ORVNURURfVFlQRShhbGxvY2F0b3JfdHlwZSkKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYywKKwkgICBib29sID0gX19oYXNfYWxsb2NhdG9yX3R5cGU8X1RwPjo6dmFsdWU+CisgICAgc3RydWN0IF9fdXNlc19hbGxvY2F0b3JfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IF9fdXNlc19hbGxvY2F0b3JfaGVscGVyPF9UcCwgX0FsbG9jLCB0cnVlPgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX2NvbnZlcnRpYmxlPF9BbGxvYywKKwkJCQkgICAgIHR5cGVuYW1lIF9UcDo6YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgLy8vIFthbGxvY2F0b3IudXNlcy50cmFpdF0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHVzZXNfYWxsb2NhdG9yCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKwkJCSAgICAgICBfX3VzZXNfYWxsb2NhdG9yX2hlbHBlcjxfVHAsIF9BbGxvYz46OnZhbHVlPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgc3RydWN0IF9fdXNlc19hbGxvY2F0b3JfYXJnCisgICAgOiBpc19jb25zdHJ1Y3RpYmxlPF9UcCwgX0FsbG9jLCBfQXJncy4uLj4KKyAgICB7IHN0YXRpY19hc3NlcnQoIHVzZXNfYWxsb2NhdG9yPF9UcCwgX0FsbG9jPjo6dmFsdWUsICJ1c2VzIGFsbG9jYXRvciIgKTsgfTsKKworICBzdHJ1Y3QgX191c2VzX2FsbG9jX2Jhc2UgeyB9OworICBzdHJ1Y3QgX191c2VzX2FsbG9jMCA6IF9fdXNlc19hbGxvY19iYXNlCisgIHsgc3RydWN0IF9Bbnl0aGluZyB7IF9Bbnl0aGluZyguLi4pIHsgfSB9IF9NX2E7IH07CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX191c2VzX2FsbG9jMSA6IF9fdXNlc19hbGxvY19iYXNlIHsgY29uc3QgX0FsbG9jKiBfTV9hOyB9OworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IF9fdXNlc19hbGxvYzIgOiBfX3VzZXNfYWxsb2NfYmFzZSB7IGNvbnN0IF9BbGxvYyogX01fYTsgfTsKKworICB0ZW1wbGF0ZTxib29sLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHN0cnVjdCBfX3VzZXNfYWxsb2M7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHN0cnVjdCBfX3VzZXNfYWxsb2M8dHJ1ZSwgX1RwLCBfQWxsb2MsIF9BcmdzLi4uPgorICAgIDogY29uZGl0aW9uYWw8CisgICAgICAgIGlzX2NvbnN0cnVjdGlibGU8X1RwLCBhbGxvY2F0b3JfYXJnX3QsIF9BbGxvYywgX0FyZ3MuLi4+Ojp2YWx1ZSwKKyAgICAgICAgX191c2VzX2FsbG9jMTxfQWxsb2M+LAorICAgICAgIAlfX3VzZXNfYWxsb2MyPF9BbGxvYz4+Ojp0eXBlCisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgX191c2VzX2FsbG9jPGZhbHNlLCBfVHAsIF9BbGxvYywgX0FyZ3MuLi4+CisgICAgOiBfX3VzZXNfYWxsb2MwIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgc3RydWN0IF9fdXNlc19hbGxvY19pbXBsCisgICAgOiBfX3VzZXNfYWxsb2M8dXNlc19hbGxvY2F0b3I8X1RwLCBfQWxsb2M+Ojp2YWx1ZSwgX1RwLCAgX0FsbG9jLCBfQXJncy4uLj4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIF9fdXNlc19hbGxvY19pbXBsPF9UcCwgX0FsbG9jLCBfQXJncy4uLj4KKyAgICBfX3VzZV9hbGxvYyhjb25zdCBfQWxsb2MmIF9fYSkKKyAgICB7CisgICAgICBfX3VzZXNfYWxsb2NfaW1wbDxfVHAsIF9BbGxvYywgX0FyZ3MuLi4+IF9fcmV0OworICAgICAgX19yZXQuX01fYSA9ICZfX2E7CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3ZhbGFycmF5X2FmdGVyLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdmFsYXJyYXlfYWZ0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTlkZGNlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3ZhbGFycmF5X2FmdGVyLmgKQEAgLTAsMCArMSw1NTEgQEAKKy8vIFRoZSB0ZW1wbGF0ZSBhbmQgaW5saW5lcyBmb3IgdGhlIC0qLSBDKysgLSotIGludGVybmFsIF9NZXRhIGNsYXNzLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy92YWxhcnJheV9hZnRlci5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dmFsYXJyYXl9CisgKi8KKworLy8gV3JpdHRlbiBieSBHYWJyaWVsIERvcyBSZWlzIDxHYWJyaWVsLkRvcy1SZWlzQGNtbGEuZW5zLWNhY2hhbi5mcj4KKworI2lmbmRlZiBfVkFMQVJSQVlfQUZURVJfSAorI2RlZmluZSBfVkFMQVJSQVlfQUZURVJfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vCisgIC8vIGdzbGljZV9hcnJheSBjbG9zdXJlLgorICAvLworICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgIGNsYXNzIF9HQmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIAorICAgICAgX0dCYXNlIChjb25zdCBfRG9tJiBfX2UsIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9faSkKKyAgICAgIDogX01fZXhwciAoX19lKSwgX01faW5kZXgoX19pKSB7fQorICAgICAgCisgICAgICB2YWx1ZV90eXBlCisgICAgICBvcGVyYXRvcltdIChzaXplX3QgX19pKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZXhwcltfTV9pbmRleFtfX2ldXTsgfQorICAgICAgCisgICAgICBzaXplX3QKKyAgICAgIHNpemUgKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2luZGV4LnNpemUoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IF9Eb20mCSAgICAgIF9NX2V4cHI7CisgICAgICBjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfTV9pbmRleDsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBfR0Jhc2U8X0FycmF5PF9UcD4gPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICAgICAgCisgICAgICBfR0Jhc2UgKF9BcnJheTxfVHA+IF9fYSwgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX19pKQorICAgICAgOiBfTV9hcnJheSAoX19hKSwgX01faW5kZXgoX19pKSB7fQorICAgICAgCisgICAgICB2YWx1ZV90eXBlCisgICAgICBvcGVyYXRvcltdIChzaXplX3QgX19pKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYXJyYXkuX01fZGF0YVtfTV9pbmRleFtfX2ldXTsgfQorICAgICAgCisgICAgICBzaXplX3QKKyAgICAgIHNpemUgKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2luZGV4LnNpemUoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IF9BcnJheTxfVHA+ICAgICAgIF9NX2FycmF5OworICAgICAgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX01faW5kZXg7CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgIHN0cnVjdCBfR0Nsb3M8X0V4cHIsIF9Eb20+CisgICAgOiBfR0Jhc2U8X0RvbT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HQmFzZTxfRG9tPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIAorICAgICAgX0dDbG9zIChjb25zdCBfRG9tJiBfX2UsIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9faSkKKyAgICAgIDogX0Jhc2UgKF9fZSwgX19pKSB7fQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfR0Nsb3M8X1ZhbEFycmF5LCBfVHA+CisgICAgOiBfR0Jhc2U8X0FycmF5PF9UcD4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dCYXNlPF9BcnJheTxfVHA+ID4gX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgICAKKyAgICAgIF9HQ2xvcyAoX0FycmF5PF9UcD4gX19hLCBjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfX2kpCisgICAgICA6IF9CYXNlIChfX2EsIF9faSkge30KKyAgICB9OworCisgIC8vCisgIC8vIGluZGlyZWN0X2FycmF5IGNsb3N1cmUKKyAgLy8KKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICBjbGFzcyBfSUJhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIF9JQmFzZSAoY29uc3QgX0RvbSYgX19lLCBjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfX2kpCisgICAgICA6IF9NX2V4cHIgKF9fZSksIF9NX2luZGV4IChfX2kpIHt9CisgICAgICAKKyAgICAgIHZhbHVlX3R5cGUKKyAgICAgIG9wZXJhdG9yW10gKHNpemVfdCBfX2kpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9leHByW19NX2luZGV4W19faV1dOyB9CisgICAgICAKKyAgICAgIHNpemVfdAorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9pbmRleC5zaXplKCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBjb25zdCBfRG9tJgkgICAgICBfTV9leHByOworICAgICAgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX01faW5kZXg7CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgIHN0cnVjdCBfSUNsb3M8X0V4cHIsIF9Eb20+CisgICAgOiBfSUJhc2U8X0RvbT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9JQmFzZTxfRG9tPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIAorICAgICAgX0lDbG9zIChjb25zdCBfRG9tJiBfX2UsIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9faSkKKyAgICAgIDogX0Jhc2UgKF9fZSwgX19pKSB7fQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfSUNsb3M8X1ZhbEFycmF5LCBfVHA+CisgICAgOiBfSUJhc2U8dmFsYXJyYXk8X1RwPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfSUJhc2U8dmFsYXJyYXk8X1RwPiA+IF9CYXNlOworICAgICAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKyAgICAgIAorICAgICAgX0lDbG9zIChjb25zdCB2YWxhcnJheTxfVHA+JiBfX2EsIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9faSkKKyAgICAgIDogX0Jhc2UgKF9fYSwgX19pKSB7fQorICAgIH07CisgIAorICAvLworICAvLyBjbGFzcyBfRXhwcgorICAvLworICB0ZW1wbGF0ZTxjbGFzcyBfQ2xvcywgdHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIF9FeHByCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisKKyAgICAgIF9FeHByKGNvbnN0IF9DbG9zJik7CisKKyAgICAgIGNvbnN0IF9DbG9zJiBvcGVyYXRvcigpKCkgY29uc3Q7CisKKyAgICAgIHZhbHVlX3R5cGUgb3BlcmF0b3JbXShzaXplX3QpIGNvbnN0OworICAgICAgdmFsYXJyYXk8dmFsdWVfdHlwZT4gb3BlcmF0b3JbXShzbGljZSkgY29uc3Q7CisgICAgICB2YWxhcnJheTx2YWx1ZV90eXBlPiBvcGVyYXRvcltdKGNvbnN0IGdzbGljZSYpIGNvbnN0OworICAgICAgdmFsYXJyYXk8dmFsdWVfdHlwZT4gb3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxib29sPiYpIGNvbnN0OworICAgICAgdmFsYXJyYXk8dmFsdWVfdHlwZT4gb3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxzaXplX3Q+JikgY29uc3Q7CisKKyAgICAgIF9FeHByPF9VbkNsb3M8X191bmFyeV9wbHVzLCBzdGQ6Ol9FeHByLCBfQ2xvcz4sIHZhbHVlX3R5cGU+CisgICAgICBvcGVyYXRvcisoKSBjb25zdDsKKworICAgICAgX0V4cHI8X1VuQ2xvczxfX25lZ2F0ZSwgc3RkOjpfRXhwciwgX0Nsb3M+LCB2YWx1ZV90eXBlPgorICAgICAgb3BlcmF0b3ItKCkgY29uc3Q7CisKKyAgICAgIF9FeHByPF9VbkNsb3M8X19iaXR3aXNlX25vdCwgc3RkOjpfRXhwciwgX0Nsb3M+LCB2YWx1ZV90eXBlPgorICAgICAgb3BlcmF0b3J+KCkgY29uc3Q7CisKKyAgICAgIF9FeHByPF9VbkNsb3M8X19sb2dpY2FsX25vdCwgc3RkOjpfRXhwciwgX0Nsb3M+LCBib29sPgorICAgICAgb3BlcmF0b3IhKCkgY29uc3Q7CisKKyAgICAgIHNpemVfdCBzaXplKCkgY29uc3Q7CisgICAgICB2YWx1ZV90eXBlIHN1bSgpIGNvbnN0OworCisgICAgICB2YWxhcnJheTx2YWx1ZV90eXBlPiBzaGlmdChpbnQpIGNvbnN0OworICAgICAgdmFsYXJyYXk8dmFsdWVfdHlwZT4gY3NoaWZ0KGludCkgY29uc3Q7CisKKyAgICAgIHZhbHVlX3R5cGUgbWluKCkgY29uc3Q7CisgICAgICB2YWx1ZV90eXBlIG1heCgpIGNvbnN0OworCisgICAgICB2YWxhcnJheTx2YWx1ZV90eXBlPiBhcHBseSh2YWx1ZV90eXBlICgqKShjb25zdCB2YWx1ZV90eXBlJikpIGNvbnN0OworICAgICAgdmFsYXJyYXk8dmFsdWVfdHlwZT4gYXBwbHkodmFsdWVfdHlwZSAoKikodmFsdWVfdHlwZSkpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IF9DbG9zIF9NX2Nsb3N1cmU7CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2xvcywgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIF9FeHByPF9DbG9zLCBfVHA+OjpfRXhwcihjb25zdCBfQ2xvcyYgX19jKSA6IF9NX2Nsb3N1cmUoX19jKSB7fQorCisgIHRlbXBsYXRlPGNsYXNzIF9DbG9zLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbnN0IF9DbG9zJgorICAgIF9FeHByPF9DbG9zLCBfVHA+OjpvcGVyYXRvcigpKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9jbG9zdXJlOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0Nsb3MsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX0V4cHI8X0Nsb3MsIF9UcD46Om9wZXJhdG9yW10oc2l6ZV90IF9faSkgY29uc3QKKyAgICB7IHJldHVybiBfTV9jbG9zdXJlW19faV07IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2xvcywgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2YWxhcnJheTxfVHA+CisgICAgX0V4cHI8X0Nsb3MsIF9UcD46Om9wZXJhdG9yW10oc2xpY2UgX19zKSBjb25zdAorICAgIHsKKyAgICAgIHZhbGFycmF5PF9UcD4gX192ID0gdmFsYXJyYXk8X1RwPigqdGhpcylbX19zXTsKKyAgICAgIHJldHVybiBfX3Y7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9DbG9zLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4KKyAgICBfRXhwcjxfQ2xvcywgX1RwPjo6b3BlcmF0b3JbXShjb25zdCBnc2xpY2UmIF9fZ3MpIGNvbnN0CisgICAgeworICAgICAgdmFsYXJyYXk8X1RwPiBfX3YgPSB2YWxhcnJheTxfVHA+KCp0aGlzKVtfX2dzXTsKKyAgICAgIHJldHVybiBfX3Y7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9DbG9zLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4KKyAgICBfRXhwcjxfQ2xvcywgX1RwPjo6b3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxib29sPiYgX19tKSBjb25zdAorICAgIHsKKyAgICAgIHZhbGFycmF5PF9UcD4gX192ID0gdmFsYXJyYXk8X1RwPigqdGhpcylbX19tXTsKKyAgICAgIHJldHVybiBfX3Y7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9DbG9zLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4KKyAgICBfRXhwcjxfQ2xvcywgX1RwPjo6b3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfX2kpIGNvbnN0CisgICAgeworICAgICAgdmFsYXJyYXk8X1RwPiBfX3YgPSB2YWxhcnJheTxfVHA+KCp0aGlzKVtfX2ldOworICAgICAgcmV0dXJuIF9fdjsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0Nsb3MsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc2l6ZV90CisgICAgX0V4cHI8X0Nsb3MsIF9UcD46OnNpemUoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX2Nsb3N1cmUuc2l6ZSgpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0Nsb3MsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPgorICAgIF9FeHByPF9DbG9zLCBfVHA+OjpzaGlmdChpbnQgX19uKSBjb25zdAorICAgIHsKKyAgICAgIHZhbGFycmF5PF9UcD4gX192ID0gdmFsYXJyYXk8X1RwPigqdGhpcykuc2hpZnQoX19uKTsKKyAgICAgIHJldHVybiBfX3Y7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9DbG9zLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4KKyAgICBfRXhwcjxfQ2xvcywgX1RwPjo6Y3NoaWZ0KGludCBfX24pIGNvbnN0CisgICAgeworICAgICAgdmFsYXJyYXk8X1RwPiBfX3YgPSB2YWxhcnJheTxfVHA+KCp0aGlzKS5jc2hpZnQoX19uKTsKKyAgICAgIHJldHVybiBfX3Y7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9DbG9zLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4KKyAgICBfRXhwcjxfQ2xvcywgX1RwPjo6YXBwbHkoX1RwIF9fZihjb25zdCBfVHAmKSkgY29uc3QKKyAgICB7CisgICAgICB2YWxhcnJheTxfVHA+IF9fdiA9IHZhbGFycmF5PF9UcD4oKnRoaXMpLmFwcGx5KF9fZik7CisgICAgICByZXR1cm4gX192OworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2xvcywgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2YWxhcnJheTxfVHA+CisgICAgX0V4cHI8X0Nsb3MsIF9UcD46OmFwcGx5KF9UcCBfX2YoX1RwKSkgY29uc3QKKyAgICB7CisgICAgICB2YWxhcnJheTxfVHA+IF9fdiA9IHZhbGFycmF5PF9UcD4oKnRoaXMpLmFwcGx5KF9fZik7CisgICAgICByZXR1cm4gX192OworICAgIH0KKworICAvLyBYWFg6IHJlcGxhY2UgdGhpcyB3aXRoIGEgbW9yZSByb2J1c3Qgc3VtbWF0aW9uIGFsZ29yaXRobS4KKyAgdGVtcGxhdGU8Y2xhc3MgX0Nsb3MsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX0V4cHI8X0Nsb3MsIF9UcD46OnN1bSgpIGNvbnN0CisgICAgeworICAgICAgc2l6ZV90IF9fbiA9IF9NX2Nsb3N1cmUuc2l6ZSgpOworICAgICAgaWYgKF9fbiA9PSAwKQorCXJldHVybiBfVHAoKTsKKyAgICAgIGVsc2UKKwl7CisJICBfVHAgX19zID0gX01fY2xvc3VyZVstLV9fbl07CisJICB3aGlsZSAoX19uICE9IDApCisJICAgIF9fcyArPSBfTV9jbG9zdXJlWy0tX19uXTsKKwkgIHJldHVybiBfX3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0Nsb3MsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX0V4cHI8X0Nsb3MsIF9UcD46Om1pbigpIGNvbnN0CisgICAgeyByZXR1cm4gX192YWxhcnJheV9taW4oX01fY2xvc3VyZSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2xvcywgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBfRXhwcjxfQ2xvcywgX1RwPjo6bWF4KCkgY29uc3QKKyAgICB7IHJldHVybiBfX3ZhbGFycmF5X21heChfTV9jbG9zdXJlKTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20sIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0V4cHI8X1VuQ2xvczxfX2xvZ2ljYWxfbm90LCBfRXhwciwgX0RvbT4sIGJvb2w+CisgICAgX0V4cHI8X0RvbSwgX1RwPjo6b3BlcmF0b3IhKCkgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIF9VbkNsb3M8X19sb2dpY2FsX25vdCwgc3RkOjpfRXhwciwgX0RvbT4gX0Nsb3N1cmU7CisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIGJvb2w+KF9DbG9zdXJlKHRoaXMtPl9NX2Nsb3N1cmUpKTsKKyAgICB9CisKKyNkZWZpbmUgX0RFRklORV9FWFBSX1VOQVJZX09QRVJBVE9SKF9PcCwgX05hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTxjbGFzcyBfRG9tLCB0eXBlbmFtZSBfVHA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIF9FeHByPF9VbkNsb3M8X05hbWUsIHN0ZDo6X0V4cHIsIF9Eb20+LCBfVHA+ICAgICAgICAgICAgICAgICAgIFwKKyAgICBfRXhwcjxfRG9tLCBfVHA+OjpvcGVyYXRvciBfT3AoKSBjb25zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIF9VbkNsb3M8X05hbWUsIHN0ZDo6X0V4cHIsIF9Eb20+IF9DbG9zdXJlOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1RwPihfQ2xvc3VyZSh0aGlzLT5fTV9jbG9zdXJlKSk7ICAgICAgICAgICAgXAorICAgIH0KKworICAgIF9ERUZJTkVfRVhQUl9VTkFSWV9PUEVSQVRPUigrLCBfX3VuYXJ5X3BsdXMpCisgICAgX0RFRklORV9FWFBSX1VOQVJZX09QRVJBVE9SKC0sIF9fbmVnYXRlKQorICAgIF9ERUZJTkVfRVhQUl9VTkFSWV9PUEVSQVRPUih+LCBfX2JpdHdpc2Vfbm90KQorCisjdW5kZWYgX0RFRklORV9FWFBSX1VOQVJZX09QRVJBVE9SCisKKyNkZWZpbmUgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUihfT3AsIF9OYW1lKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbTEsIGNsYXNzIF9Eb20yPgkJCQkJXAorICAgIGlubGluZSBfRXhwcjxfQmluQ2xvczxfTmFtZSwgX0V4cHIsIF9FeHByLCBfRG9tMSwgX0RvbTI+LCAgICAgICAgICAgXAorICAgICAgICAgICB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgdHlwZW5hbWUgX0RvbTE6OnZhbHVlX3R5cGU+OjpyZXN1bHRfdHlwZT4gXAorICAgIG9wZXJhdG9yIF9PcChjb25zdCBfRXhwcjxfRG9tMSwgdHlwZW5hbWUgX0RvbTE6OnZhbHVlX3R5cGU+JiBfX3YsICAgXAorCSAgICAgICAgIGNvbnN0IF9FeHByPF9Eb20yLCB0eXBlbmFtZSBfRG9tMjo6dmFsdWVfdHlwZT4mIF9fdykgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Eb20xOjp2YWx1ZV90eXBlIF9Bcmc7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZnVuPF9OYW1lLCBfQXJnPjo6cmVzdWx0X3R5cGUgX1ZhbHVlOyAgICAgICAgICBcCisgICAgICB0eXBlZGVmIF9CaW5DbG9zPF9OYW1lLCBfRXhwciwgX0V4cHIsIF9Eb20xLCBfRG9tMj4gX0Nsb3N1cmU7ICAgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9WYWx1ZT4oX0Nsb3N1cmUoX192KCksIF9fdygpKSk7ICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIF9FeHByPF9CaW5DbG9zPF9OYW1lLCBfRXhwciwgX0NvbnN0YW50LCBfRG9tLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+LCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgdHlwZW5hbWUgX19mdW48X05hbWUsIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+OjpyZXN1bHRfdHlwZT4gXAorICAgIG9wZXJhdG9yIF9PcChjb25zdCBfRXhwcjxfRG9tLCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiYgX192LCAgICAgXAorICAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlJiBfX3QpICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIF9Bcmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgX0FyZz46OnJlc3VsdF90eXBlIF9WYWx1ZTsgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfTmFtZSwgX0V4cHIsIF9Db25zdGFudCwgX0RvbSwgX0FyZz4gX0Nsb3N1cmU7ICAgXAorICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfVmFsdWU+KF9DbG9zdXJlKF9fdigpLCBfX3QpKTsgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlubGluZSBfRXhwcjxfQmluQ2xvczxfTmFtZSwgX0NvbnN0YW50LCBfRXhwciwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlLCBfRG9tPiwgICAgICAgICAgICAgXAorICAgICAgICAgICAgIHR5cGVuYW1lIF9fZnVuPF9OYW1lLCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPjo6cmVzdWx0X3R5cGU+IFwKKyAgICBvcGVyYXRvciBfT3AoY29uc3QgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSYgX190LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgY29uc3QgX0V4cHI8X0RvbSwgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4mIF9fdikgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSBfQXJnOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19mdW48X05hbWUsIF9Bcmc+OjpyZXN1bHRfdHlwZSBfVmFsdWU7ICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgX0JpbkNsb3M8X05hbWUsIF9Db25zdGFudCwgX0V4cHIsIF9BcmcsIF9Eb20+IF9DbG9zdXJlOyAgIFwKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1ZhbHVlPihfQ2xvc3VyZShfX3QsIF9fdigpKSk7ICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X05hbWUsIF9FeHByLCBfVmFsQXJyYXksICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0RvbSwgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4sICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT46OnJlc3VsdF90eXBlPiBcCisgICAgb3BlcmF0b3IgX09wKGNvbnN0IF9FeHByPF9Eb20sdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4mIF9fZSwgICAgICBcCisgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGFycmF5PHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+JiBfX3YpICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUgX0FyZzsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZnVuPF9OYW1lLCBfQXJnPjo6cmVzdWx0X3R5cGUgX1ZhbHVlOyAgICAgICAgICBcCisgICAgICB0eXBlZGVmIF9CaW5DbG9zPF9OYW1lLCBfRXhwciwgX1ZhbEFycmF5LCBfRG9tLCBfQXJnPiBfQ2xvc3VyZTsgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9WYWx1ZT4oX0Nsb3N1cmUoX19lKCksIF9fdikpOyAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIF9FeHByPF9CaW5DbG9zPF9OYW1lLCBfVmFsQXJyYXksIF9FeHByLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUsIF9Eb20+LCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgdHlwZW5hbWUgX19mdW48X05hbWUsIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+OjpyZXN1bHRfdHlwZT4gXAorICAgIG9wZXJhdG9yIF9PcChjb25zdCB2YWxhcnJheTx0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiYgX192LCAgICAgICAgXAorICAgICAgICAgICAgICAgICBjb25zdCBfRXhwcjxfRG9tLCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiYgX19lKSAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIF9UcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgX1RwPjo6cmVzdWx0X3R5cGUgX1ZhbHVlOyAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfTmFtZSwgX1ZhbEFycmF5LCBfRXhwciwgX1RwLCBfRG9tPiBfQ2xvc3VyZTsgICAgXAorICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfVmFsdWU+KF9DbG9zdXJlKF9fdiwgX19lICgpKSk7ICAgICAgICAgICAgXAorICAgIH0KKworICAgIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IoKywgX19wbHVzKQorICAgIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IoLSwgX19taW51cykKKyAgICBfREVGSU5FX0VYUFJfQklOQVJZX09QRVJBVE9SKCosIF9fbXVsdGlwbGllcykKKyAgICBfREVGSU5FX0VYUFJfQklOQVJZX09QRVJBVE9SKC8sIF9fZGl2aWRlcykKKyAgICBfREVGSU5FX0VYUFJfQklOQVJZX09QRVJBVE9SKCUsIF9fbW9kdWx1cykKKyAgICBfREVGSU5FX0VYUFJfQklOQVJZX09QRVJBVE9SKF4sIF9fYml0d2lzZV94b3IpCisgICAgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUigmLCBfX2JpdHdpc2VfYW5kKQorICAgIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IofCwgX19iaXR3aXNlX29yKQorICAgIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IoPDwsIF9fc2hpZnRfbGVmdCkKKyAgICBfREVGSU5FX0VYUFJfQklOQVJZX09QRVJBVE9SKD4+LCBfX3NoaWZ0X3JpZ2h0KQorICAgIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IoJiYsIF9fbG9naWNhbF9hbmQpCisgICAgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUih8fCwgX19sb2dpY2FsX29yKQorICAgIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IoPT0sIF9fZXF1YWxfdG8pCisgICAgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUighPSwgX19ub3RfZXF1YWxfdG8pCisgICAgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUig8LCBfX2xlc3MpCisgICAgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUig+LCBfX2dyZWF0ZXIpCisgICAgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUig8PSwgX19sZXNzX2VxdWFsKQorICAgIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IoPj0sIF9fZ3JlYXRlcl9lcXVhbCkKKworI3VuZGVmIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IKKworI2RlZmluZSBfREVGSU5FX0VYUFJfVU5BUllfRlVOQ1RJT04oX05hbWUsIF9VTmFtZSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIF9FeHByPF9VbkNsb3M8X1VOYW1lLCBfRXhwciwgX0RvbT4sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfTmFtZShjb25zdCBfRXhwcjxfRG9tLCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiYgX19lKSAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIF9UcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgX1VuQ2xvczxfVU5hbWUsIF9FeHByLCBfRG9tPiBfQ2xvc3VyZTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4oX0Nsb3N1cmUoX19lKCkpKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlubGluZSBfRXhwcjxfVW5DbG9zPF9VTmFtZSwgX1ZhbEFycmF5LCBfVHA+LCBfVHA+ICAgICAgICAgICAgICAgICAgIFwKKyAgICBfTmFtZShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBfVW5DbG9zPF9VTmFtZSwgX1ZhbEFycmF5LCBfVHA+IF9DbG9zdXJlOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1RwPihfQ2xvc3VyZShfX3YpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisgICAgX0RFRklORV9FWFBSX1VOQVJZX0ZVTkNUSU9OKGFicywgX0FicykKKyAgICBfREVGSU5FX0VYUFJfVU5BUllfRlVOQ1RJT04oY29zLCBfQ29zKQorICAgIF9ERUZJTkVfRVhQUl9VTkFSWV9GVU5DVElPTihhY29zLCBfQWNvcykKKyAgICBfREVGSU5FX0VYUFJfVU5BUllfRlVOQ1RJT04oY29zaCwgX0Nvc2gpCisgICAgX0RFRklORV9FWFBSX1VOQVJZX0ZVTkNUSU9OKHNpbiwgX1NpbikKKyAgICBfREVGSU5FX0VYUFJfVU5BUllfRlVOQ1RJT04oYXNpbiwgX0FzaW4pCisgICAgX0RFRklORV9FWFBSX1VOQVJZX0ZVTkNUSU9OKHNpbmgsIF9TaW5oKQorICAgIF9ERUZJTkVfRVhQUl9VTkFSWV9GVU5DVElPTih0YW4sIF9UYW4pCisgICAgX0RFRklORV9FWFBSX1VOQVJZX0ZVTkNUSU9OKHRhbmgsIF9UYW5oKQorICAgIF9ERUZJTkVfRVhQUl9VTkFSWV9GVU5DVElPTihhdGFuLCBfQXRhbikKKyAgICBfREVGSU5FX0VYUFJfVU5BUllfRlVOQ1RJT04oZXhwLCBfRXhwKQorICAgIF9ERUZJTkVfRVhQUl9VTkFSWV9GVU5DVElPTihsb2csIF9Mb2cpCisgICAgX0RFRklORV9FWFBSX1VOQVJZX0ZVTkNUSU9OKGxvZzEwLCBfTG9nMTApCisgICAgX0RFRklORV9FWFBSX1VOQVJZX0ZVTkNUSU9OKHNxcnQsIF9TcXJ0KQorCisjdW5kZWYgX0RFRklORV9FWFBSX1VOQVJZX0ZVTkNUSU9OCisKKyNkZWZpbmUgX0RFRklORV9FWFBSX0JJTkFSWV9GVU5DVElPTihfRnVuLCBfVUZ1bikJCSAgICAgICBcCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20xLCBjbGFzcyBfRG9tMj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X1VGdW4sIF9FeHByLCBfRXhwciwgX0RvbTEsIF9Eb20yPiwgICAgICAgICAgXAorCQkgdHlwZW5hbWUgX0RvbTE6OnZhbHVlX3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9GdW4oY29uc3QgX0V4cHI8X0RvbTEsIHR5cGVuYW1lIF9Eb20xOjp2YWx1ZV90eXBlPiYgX19lMSwgICAgICAgICBcCisJIGNvbnN0IF9FeHByPF9Eb20yLCB0eXBlbmFtZSBfRG9tMjo6dmFsdWVfdHlwZT4mIF9fZTIpCSAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RvbTE6OnZhbHVlX3R5cGUgX1RwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfVUZ1biwgX0V4cHIsIF9FeHByLCBfRG9tMSwgX0RvbTI+IF9DbG9zdXJlOyAgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4oX0Nsb3N1cmUoX19lMSgpLCBfX2UyKCkpKTsgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X1VGdW4sIF9FeHByLCBfVmFsQXJyYXksIF9Eb20sICAgICAgICAgICAgICAgXAorCQkJICB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiwgICAgICAgICAgICAgICAgICBcCisJCSB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX0Z1bihjb25zdCBfRXhwcjxfRG9tLCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiYgX19lLCAgICAgICAgICAgIFwKKwkgY29uc3QgdmFsYXJyYXk8dHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4mIF9fdikgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSBfVHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfVUZ1biwgX0V4cHIsIF9WYWxBcnJheSwgX0RvbSwgX1RwPiBfQ2xvc3VyZTsgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4oX0Nsb3N1cmUoX19lKCksIF9fdikpOyAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X1VGdW4sIF9WYWxBcnJheSwgX0V4cHIsICAgICAgICAgICAgICAgICAgICAgXAorCQkJICB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlLCBfRG9tPiwgICAgICAgICAgICBcCisJCSB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX0Z1bihjb25zdCB2YWxhcnJheTx0eXBlbmFtZSBfRG9tOjp2YWxhcnJheT4mIF9fdiwgICAgICAgICAgICAgICAgIFwKKwkgY29uc3QgX0V4cHI8X0RvbSwgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4mIF9fZSkgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSBfVHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfVUZ1biwgX1ZhbEFycmF5LCBfRXhwciwgX1RwLCBfRG9tPiBfQ2xvc3VyZTsgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4oX0Nsb3N1cmUoX192LCBfX2UoKSkpOyAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X1VGdW4sIF9FeHByLCBfQ29uc3RhbnQsIF9Eb20sICAgICAgICAgICAgICAgXAorCQkJICB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiwgICAgICAgICAgICAgICAgICBcCisJCSB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX0Z1bihjb25zdCBfRXhwcjxfRG9tLCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiYgX19lLCAgICAgICAgICAgIFwKKwkgY29uc3QgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSYgX190KSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSBfVHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfVUZ1biwgX0V4cHIsIF9Db25zdGFudCwgX0RvbSwgX1RwPiBfQ2xvc3VyZTsgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4oX0Nsb3N1cmUoX19lKCksIF9fdCkpOyAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X1VGdW4sIF9Db25zdGFudCwgX0V4cHIsICAgICAgICAgICAgICAgICAgICAgXAorCQkJICB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlLCBfRG9tPiwgICAgICAgICAgICBcCisJCSB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX0Z1bihjb25zdCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlJiBfX3QsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgY29uc3QgX0V4cHI8X0RvbSwgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4mIF9fZSkgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSBfVHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfVUZ1biwgX0NvbnN0YW50LCBfRXhwciwgX1RwLCBfRG9tPiBfQ2xvc3VyZTsgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4oX0Nsb3N1cmUoX190LCBfX2UoKSkpOyAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X1VGdW4sIF9WYWxBcnJheSwgX1ZhbEFycmF5LCBfVHAsIF9UcD4sIF9UcD4gXAorICAgIF9GdW4oY29uc3QgdmFsYXJyYXk8X1RwPiYgX192LCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3cpICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgX0JpbkNsb3M8X1VGdW4sIF9WYWxBcnJheSwgX1ZhbEFycmF5LCBfVHAsIF9UcD4gX0Nsb3N1cmU7XAorICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfVHA+KF9DbG9zdXJlKF9fdiwgX193KSk7ICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIF9FeHByPF9CaW5DbG9zPF9VRnVuLCBfVmFsQXJyYXksIF9Db25zdGFudCwgX1RwLCBfVHA+LCBfVHA+IFwKKyAgICBfRnVuKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdiwgY29uc3QgX1RwJiBfX3QpICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIF9CaW5DbG9zPF9VRnVuLCBfVmFsQXJyYXksIF9Db25zdGFudCwgX1RwLCBfVHA+IF9DbG9zdXJlO1wKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1RwPihfQ2xvc3VyZShfX3YsIF9fdCkpOyAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJCQkJCSAgICAgICBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X1VGdW4sIF9Db25zdGFudCwgX1ZhbEFycmF5LCBfVHAsIF9UcD4sIF9UcD4gXAorICAgIF9GdW4oY29uc3QgX1RwJiBfX3QsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdikgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgX0JpbkNsb3M8X1VGdW4sIF9Db25zdGFudCwgX1ZhbEFycmF5LCBfVHAsIF9UcD4gX0Nsb3N1cmU7XAorICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfVHA+KF9DbG9zdXJlKF9fdCwgX192KSk7ICAgICAgICAgICAgICAgICBcCisgICAgfQorCitfREVGSU5FX0VYUFJfQklOQVJZX0ZVTkNUSU9OKGF0YW4yLCBfQXRhbjIpCitfREVGSU5FX0VYUFJfQklOQVJZX0ZVTkNUSU9OKHBvdywgX1BvdykKKworI3VuZGVmIF9ERUZJTkVfRVhQUl9CSU5BUllfRlVOQ1RJT04KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0NQUF9WQUxBUlJBWV9BRlRFUl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdmFsYXJyYXlfYXJyYXkuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy92YWxhcnJheV9hcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNGQ0OWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdmFsYXJyYXlfYXJyYXkuaApAQCAtMCwwICsxLDY5MyBAQAorLy8gVGhlIHRlbXBsYXRlIGFuZCBpbmxpbmVzIGZvciB0aGUgLSotIEMrKyAtKi0gaW50ZXJuYWwgX0FycmF5IGhlbHBlciBjbGFzcy4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvdmFsYXJyYXlfYXJyYXkuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3ZhbGFycmF5fQorICovCisKKy8vIFdyaXR0ZW4gYnkgR2FicmllbCBEb3MgUmVpcyA8R2FicmllbC5Eb3MtUmVpc0BEUFRNYXRocy5FTlMtQ2FjaGFuLkZyPgorCisjaWZuZGVmIF9WQUxBUlJBWV9BUlJBWV9ICisjZGVmaW5lIF9WQUxBUlJBWV9BUlJBWV9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL2NwcF90eXBlX3RyYWl0cy5oPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8bmV3PgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8KKyAgLy8gSGVscGVyIGZ1bmN0aW9ucyBvbiByYXcgcG9pbnRlcnMKKyAgLy8KKworICAvLyBXZSBnZXQgbWVtb3J5IGJ5IHRoZSBvbGQgZmFzaGlvbiB3YXkKKyAgaW5saW5lIHZvaWQqCisgIF9fdmFsYXJyYXlfZ2V0X21lbW9yeShzaXplX3QgX19uKQorICB7IHJldHVybiBvcGVyYXRvciBuZXcoX19uKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwKl9fcmVzdHJpY3RfXworICAgIF9fdmFsYXJyYXlfZ2V0X3N0b3JhZ2Uoc2l6ZV90IF9fbikKKyAgICB7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwKl9fcmVzdHJpY3RfXz4KKwkoc3RkOjpfX3ZhbGFycmF5X2dldF9tZW1vcnkoX19uICogc2l6ZW9mKF9UcCkpKTsKKyAgICB9CisKKyAgLy8gUmV0dXJuIG1lbW9yeSB0byB0aGUgc3lzdGVtCisgIGlubGluZSB2b2lkCisgIF9fdmFsYXJyYXlfcmVsZWFzZV9tZW1vcnkodm9pZCogX19wKQorICB7IG9wZXJhdG9yIGRlbGV0ZShfX3ApOyB9CisKKyAgLy8gVHVybiBhIHJhdy1tZW1vcnkgaW50byBhbiBhcnJheSBvZiBfVHAgZmlsbGVkIHdpdGggX1RwKCkKKyAgLy8gVGhpcyBpcyByZXF1aXJlZCBpbiAndmFsYXJyYXk8VD4gdihuKTsnCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgYm9vbD4KKyAgICBzdHJ1Y3QgX0FycmF5X2RlZmF1bHRfY3RvcgorICAgIHsKKyAgICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBpc24ndCBleGNlcHRpb24gc2FmZS4gIEJ1dAorICAgICAgLy8gdmFsYXJyYXlzIGFyZW4ndCByZXF1aXJlZCB0byBiZSBleGNlcHRpb24gc2FmZS4KKyAgICAgIGlubGluZSBzdGF0aWMgdm9pZAorICAgICAgX1NfZG9faXQoX1RwKiBfX2IsIF9UcCogX19lKQorICAgICAgeworCXdoaWxlIChfX2IgIT0gX19lKQorCSAgbmV3KF9fYisrKSBfVHAoKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0FycmF5X2RlZmF1bHRfY3RvcjxfVHAsIHRydWU+CisgICAgeworICAgICAgLy8gRm9yIGZ1bmRhbWVudGFsIHR5cGVzLCBpdCBzdWZmaWNlcyB0byBzYXkgJ21lbXNldCgpJworICAgICAgaW5saW5lIHN0YXRpYyB2b2lkCisgICAgICBfU19kb19pdChfVHAqIF9fYiwgX1RwKiBfX2UpCisgICAgICB7IF9fYnVpbHRpbl9tZW1zZXQoX19iLCAwLCAoX19lIC0gX19iKSAqIHNpemVvZihfVHApKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9kZWZhdWx0X2NvbnN0cnVjdChfVHAqIF9fYiwgX1RwKiBfX2UpCisgICAgeworICAgICAgX0FycmF5X2RlZmF1bHRfY3RvcjxfVHAsIF9faXNfc2NhbGFyPF9UcD46Ol9fdmFsdWU+OjpfU19kb19pdChfX2IsIF9fZSk7CisgICAgfQorCisgIC8vIFR1cm4gYSByYXctbWVtb3J5IGludG8gYW4gYXJyYXkgb2YgX1RwIGZpbGxlZCB3aXRoIF9fdAorICAvLyBUaGlzIGlzIHRoZSByZXF1aXJlZCBpbiB2YWxhcnJheTxUPiB2KG4sIHQpLiAgQWxzbworICAvLyB1c2VkIGluIHZhbGFycmF5PD46OnJlc2l6ZSgpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2w+CisgICAgc3RydWN0IF9BcnJheV9pbml0X2N0b3IKKyAgICB7CisgICAgICAvLyBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgaXNuJ3QgZXhjZXB0aW9uIHNhZmUuICBCdXQKKyAgICAgIC8vIHZhbGFycmF5cyBhcmVuJ3QgcmVxdWlyZWQgdG8gYmUgZXhjZXB0aW9uIHNhZmUuCisgICAgICBpbmxpbmUgc3RhdGljIHZvaWQKKyAgICAgIF9TX2RvX2l0KF9UcCogX19iLCBfVHAqIF9fZSwgY29uc3QgX1RwIF9fdCkKKyAgICAgIHsKKwl3aGlsZSAoX19iICE9IF9fZSkKKwkgIG5ldyhfX2IrKykgX1RwKF9fdCk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9BcnJheV9pbml0X2N0b3I8X1RwLCB0cnVlPgorICAgIHsKKyAgICAgIGlubGluZSBzdGF0aWMgdm9pZAorICAgICAgX1NfZG9faXQoX1RwKiBfX2IsIF9UcCogX19lLCBjb25zdCBfVHAgX190KQorICAgICAgeworCXdoaWxlIChfX2IgIT0gX19lKQorCSAgKl9fYisrID0gX190OworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9maWxsX2NvbnN0cnVjdChfVHAqIF9fYiwgX1RwKiBfX2UsIGNvbnN0IF9UcCBfX3QpCisgICAgeworICAgICAgX0FycmF5X2luaXRfY3RvcjxfVHAsIF9faXNfdHJpdmlhbChfVHApPjo6X1NfZG9faXQoX19iLCBfX2UsIF9fdCk7CisgICAgfQorCisgIC8vCisgIC8vIGNvcHktY29uc3RydWN0IHJhdyBhcnJheSBbX19vLCAqKSBmcm9tIHBsYWluIGFycmF5IFtfX2IsIF9fZSkKKyAgLy8gV2UgY2FuJ3QganVzdCBzYXkgJ21lbWNweSgpJworICAvLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2w+CisgICAgc3RydWN0IF9BcnJheV9jb3B5X2N0b3IKKyAgICB7CisgICAgICAvLyBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgaXNuJ3QgZXhjZXB0aW9uIHNhZmUuICBCdXQKKyAgICAgIC8vIHZhbGFycmF5cyBhcmVuJ3QgcmVxdWlyZWQgdG8gYmUgZXhjZXB0aW9uIHNhZmUuCisgICAgICBpbmxpbmUgc3RhdGljIHZvaWQKKyAgICAgIF9TX2RvX2l0KGNvbnN0IF9UcCogX19iLCBjb25zdCBfVHAqIF9fZSwgX1RwKiBfX3Jlc3RyaWN0X18gX19vKQorICAgICAgeworCXdoaWxlIChfX2IgIT0gX19lKQorCSAgbmV3KF9fbysrKSBfVHAoKl9fYisrKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0FycmF5X2NvcHlfY3RvcjxfVHAsIHRydWU+CisgICAgeworICAgICAgaW5saW5lIHN0YXRpYyB2b2lkCisgICAgICBfU19kb19pdChjb25zdCBfVHAqIF9fYiwgY29uc3QgX1RwKiBfX2UsIF9UcCogX19yZXN0cmljdF9fIF9fbykKKyAgICAgIHsgX19idWlsdGluX21lbWNweShfX28sIF9fYiwgKF9fZSAtIF9fYikgKiBzaXplb2YoX1RwKSk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoY29uc3QgX1RwKiBfX2IsIGNvbnN0IF9UcCogX19lLAorCQkJICAgICAgX1RwKiBfX3Jlc3RyaWN0X18gX19vKQorICAgIHsKKyAgICAgIF9BcnJheV9jb3B5X2N0b3I8X1RwLCBfX2lzX3RyaXZpYWwoX1RwKT46Ol9TX2RvX2l0KF9fYiwgX19lLCBfX28pOworICAgIH0KKworICAvLyBjb3B5LWNvbnN0cnVjdCByYXcgYXJyYXkgW19fbywgKikgZnJvbSBzdHJpZGVkIGFycmF5IF9fYVs8X19uIDogX19zPl0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9jb3B5X2NvbnN0cnVjdCAoY29uc3QgX1RwKiBfX3Jlc3RyaWN0X18gX19hLCBzaXplX3QgX19uLAorCQkJICAgICAgIHNpemVfdCBfX3MsIF9UcCogX19yZXN0cmljdF9fIF9fbykKKyAgICB7CisgICAgICBpZiAoX19pc190cml2aWFsKF9UcCkpCisJd2hpbGUgKF9fbi0tKQorCSAgeworCSAgICAqX19vKysgPSAqX19hOworCSAgICBfX2EgKz0gX19zOworCSAgfQorICAgICAgZWxzZQorCXdoaWxlIChfX24tLSkKKwkgIHsKKwkgICAgbmV3KF9fbysrKSBfVHAoKl9fYSk7CisJICAgIF9fYSArPSBfX3M7CisJICB9CisgICAgfQorCisgIC8vIGNvcHktY29uc3RydWN0IHJhdyBhcnJheSBbX19vLCAqKSBmcm9tIGluZGV4ZWQgYXJyYXkgX19hW19faVs8X19uPl1dCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QgKGNvbnN0IF9UcCogX19yZXN0cmljdF9fIF9fYSwKKwkJCSAgICAgICBjb25zdCBzaXplX3QqIF9fcmVzdHJpY3RfXyBfX2ksCisJCQkgICAgICAgX1RwKiBfX3Jlc3RyaWN0X18gX19vLCBzaXplX3QgX19uKQorICAgIHsKKyAgICAgIGlmIChfX2lzX3RyaXZpYWwoX1RwKSkKKwl3aGlsZSAoX19uLS0pCisJICAqX19vKysgPSBfX2FbKl9faSsrXTsKKyAgICAgIGVsc2UKKwl3aGlsZSAoX19uLS0pCisJICBuZXcgKF9fbysrKSBfVHAoX19hWypfX2krK10pOworICAgIH0KKworICAvLyBEbyB0aGUgbmVjZXNzYXJ5IGNsZWFudXAgd2hlbiB3ZSdyZSBkb25lIHdpdGggYXJyYXlzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2Rlc3Ryb3lfZWxlbWVudHMoX1RwKiBfX2IsIF9UcCogX19lKQorICAgIHsKKyAgICAgIGlmICghX19pc190cml2aWFsKF9UcCkpCisJd2hpbGUgKF9fYiAhPSBfX2UpCisJICB7CisJICAgIF9fYi0+fl9UcCgpOworCSAgICArK19fYjsKKwkgIH0KKyAgICB9CisKKyAgLy8gRmlsbCBhIHBsYWluIGFycmF5IF9fYVs8X19uPl0gd2l0aCBfX3QKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9maWxsKF9UcCogX19yZXN0cmljdF9fIF9fYSwgc2l6ZV90IF9fbiwgY29uc3QgX1RwJiBfX3QpCisgICAgeworICAgICAgd2hpbGUgKF9fbi0tKQorCSpfX2ErKyA9IF9fdDsKKyAgICB9CisgIAorICAvLyBmaWxsIHN0cmlkZWQgYXJyYXkgX19hWzxfX24tMSA6IF9fcz5dIHdpdGggX190CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfZmlsbChfVHAqIF9fcmVzdHJpY3RfXyBfX2EsIHNpemVfdCBfX24sCisJCSAgICBzaXplX3QgX19zLCBjb25zdCBfVHAmIF9fdCkKKyAgICB7IAorICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSwgX19hICs9IF9fcykKKwkqX19hID0gX190OworICAgIH0KKworICAvLyBmaWxsIGluZGlyZWN0IGFycmF5IF9fYVtfX2lbPF9fbj5dXSB3aXRoIF9faQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2ZpbGwoX1RwKiBfX3Jlc3RyaWN0X18gX19hLCBjb25zdCBzaXplX3QqIF9fcmVzdHJpY3RfXyBfX2ksCisJCSAgICBzaXplX3QgX19uLCBjb25zdCBfVHAmIF9fdCkKKyAgICB7CisgICAgICBmb3IgKHNpemVfdCBfX2ogPSAwOyBfX2ogPCBfX247ICsrX19qLCArK19faSkKKwlfX2FbKl9faV0gPSBfX3Q7CisgICAgfQorICAKKyAgLy8gY29weSBwbGFpbiBhcnJheSBfX2FbPF9fbj5dIGluIF9fYls8X19uPl0KKyAgLy8gRm9yIG5vbi1mdW5kYW1lbnRhbCB0eXBlcywgaXQgaXMgd3JvbmcgdG8gc2F5ICdtZW1jcHkoKScKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBib29sPgorICAgIHN0cnVjdCBfQXJyYXlfY29waWVyCisgICAgeworICAgICAgaW5saW5lIHN0YXRpYyB2b2lkCisgICAgICBfU19kb19pdChjb25zdCBfVHAqIF9fcmVzdHJpY3RfXyBfX2EsIHNpemVfdCBfX24sIF9UcCogX19yZXN0cmljdF9fIF9fYikKKyAgICAgIHsKKwl3aGlsZShfX24tLSkKKwkgICpfX2IrKyA9ICpfX2ErKzsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0FycmF5X2NvcGllcjxfVHAsIHRydWU+CisgICAgeworICAgICAgaW5saW5lIHN0YXRpYyB2b2lkCisgICAgICBfU19kb19pdChjb25zdCBfVHAqIF9fcmVzdHJpY3RfXyBfX2EsIHNpemVfdCBfX24sIF9UcCogX19yZXN0cmljdF9fIF9fYikKKyAgICAgIHsgX19idWlsdGluX21lbWNweShfX2IsIF9fYSwgX19uICogc2l6ZW9mIChfVHApKTsgfQorICAgIH07CisKKyAgLy8gQ29weSBhIHBsYWluIGFycmF5IF9fYVs8X19uPl0gaW50byBhIHBsYXkgYXJyYXkgX19iWzw+XQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoY29uc3QgX1RwKiBfX3Jlc3RyaWN0X18gX19hLCBzaXplX3QgX19uLAorCQkgICAgX1RwKiBfX3Jlc3RyaWN0X18gX19iKQorICAgIHsKKyAgICAgIF9BcnJheV9jb3BpZXI8X1RwLCBfX2lzX3RyaXZpYWwoX1RwKT46Ol9TX2RvX2l0KF9fYSwgX19uLCBfX2IpOworICAgIH0KKworICAvLyBDb3B5IHN0cmlkZWQgYXJyYXkgX19hWzxfX24gOiBfX3M+XSBpbiBwbGFpbiBfX2JbPF9fbj5dCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShjb25zdCBfVHAqIF9fcmVzdHJpY3RfXyBfX2EsIHNpemVfdCBfX24sIHNpemVfdCBfX3MsCisJCSAgICBfVHAqIF9fcmVzdHJpY3RfXyBfX2IpCisgICAgeworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSwgKytfX2IsIF9fYSArPSBfX3MpCisJKl9fYiA9ICpfX2E7CisgICAgfQorCisgIC8vIENvcHkgYSBwbGFpbiBhcnJheSAgX19hWzxfX24+XSBpbnRvIGEgc3RyaWRlZCBhcnJheSBfX2JbPF9fbiA6IF9fcz5dCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShjb25zdCBfVHAqIF9fcmVzdHJpY3RfXyBfX2EsIF9UcCogX19yZXN0cmljdF9fIF9fYiwKKwkJICAgIHNpemVfdCBfX24sIHNpemVfdCBfX3MpCisgICAgeworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSwgKytfX2EsIF9fYiArPSBfX3MpCisJKl9fYiA9ICpfX2E7CisgICAgfQorCisgIC8vIENvcHkgc3RyaWRlZCBhcnJheSBfX3NyY1s8X19uIDogX19zMT5dIGludG8gYW5vdGhlcgorICAvLyBzdHJpZGVkIGFycmF5IF9fZHN0WzwgOiBfX3MyPl0uICBUaGVpciBzaXplcyBtdXN0IG1hdGNoLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoY29uc3QgX1RwKiBfX3Jlc3RyaWN0X18gX19zcmMsIHNpemVfdCBfX24sIHNpemVfdCBfX3MxLAorCQkgICAgX1RwKiBfX3Jlc3RyaWN0X18gX19kc3QsIHNpemVfdCBfX3MyKQorICAgIHsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisJX19kc3RbX19pICogX19zMl0gPSBfX3NyY1tfX2kgKiBfX3MxXTsKKyAgICB9CisKKyAgLy8gQ29weSBhbiBpbmRleGVkIGFycmF5IF9fYVtfX2lbPF9fbj5dXSBpbiBwbGFpbiBhcnJheSBfX2JbPF9fbj5dCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShjb25zdCBfVHAqIF9fcmVzdHJpY3RfXyBfX2EsCisJCSAgICBjb25zdCBzaXplX3QqIF9fcmVzdHJpY3RfXyBfX2ksCisJCSAgICBfVHAqIF9fcmVzdHJpY3RfXyBfX2IsIHNpemVfdCBfX24pCisgICAgeworICAgICAgZm9yIChzaXplX3QgX19qID0gMDsgX19qIDwgX19uOyArK19faiwgKytfX2IsICsrX19pKQorCSpfX2IgPSBfX2FbKl9faV07CisgICAgfQorCisgIC8vIENvcHkgYSBwbGFpbiBhcnJheSBfX2FbPF9fbj5dIGluIGFuIGluZGV4ZWQgYXJyYXkgX19iW19faVs8X19uPl1dCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShjb25zdCBfVHAqIF9fcmVzdHJpY3RfXyBfX2EsIHNpemVfdCBfX24sCisJCSAgICBfVHAqIF9fcmVzdHJpY3RfXyBfX2IsIGNvbnN0IHNpemVfdCogX19yZXN0cmljdF9fIF9faSkKKyAgICB7CisgICAgICBmb3IgKHNpemVfdCBfX2ogPSAwOyBfX2ogPCBfX247ICsrX19qLCArK19fYSwgKytfX2kpCisJX19iWypfX2ldID0gKl9fYTsKKyAgICB9CisKKyAgLy8gQ29weSB0aGUgX19uIGZpcnN0IGVsZW1lbnRzIG9mIGFuIGluZGV4ZWQgYXJyYXkgX19zcmNbPF9faT5dIGludG8KKyAgLy8gYW5vdGhlciBpbmRleGVkIGFycmF5IF9fZHN0WzxfX2o+XS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KGNvbnN0IF9UcCogX19yZXN0cmljdF9fIF9fc3JjLCBzaXplX3QgX19uLAorCQkgICAgY29uc3Qgc2l6ZV90KiBfX3Jlc3RyaWN0X18gX19pLAorCQkgICAgX1RwKiBfX3Jlc3RyaWN0X18gX19kc3QsIGNvbnN0IHNpemVfdCogX19yZXN0cmljdF9fIF9faikKKyAgICB7CisgICAgICBmb3IgKHNpemVfdCBfX2sgPSAwOyBfX2sgPCBfX247ICsrX19rKQorCV9fZHN0WypfX2orK10gPSBfX3NyY1sqX19pKytdOworICAgIH0KKworICAvLworICAvLyBDb21wdXRlIHRoZSBzdW0gb2YgZWxlbWVudHMgaW4gcmFuZ2UgW19fZiwgX19sKQorICAvLyBUaGlzIGlzIGEgbmFpdmUgYWxnb3JpdGhtLiAgSXQgc3VmZmVycyBmcm9tIGNhbmNlbGxpbmcuCisgIC8vIEluIHRoZSBmdXR1cmUgdHJ5IHRvIHNwZWNpYWxpemUKKyAgLy8gZm9yIF9UcCA9IGZsb2F0LCBkb3VibGUsIGxvbmcgZG91YmxlIHVzaW5nIGEgbW9yZSBhY2N1cmF0ZQorICAvLyBhbGdvcml0aG0uCisgIC8vCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX192YWxhcnJheV9zdW0oY29uc3QgX1RwKiBfX2YsIGNvbnN0IF9UcCogX19sKQorICAgIHsKKyAgICAgIF9UcCBfX3IgPSBfVHAoKTsKKyAgICAgIHdoaWxlIChfX2YgIT0gX19sKQorCV9fciArPSAqX19mKys7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICAvLyBDb21wdXRlIHRoZSBwcm9kdWN0IG9mIGFsbCBlbGVtZW50cyBpbiByYW5nZSBbX19mLCBfX2wpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX192YWxhcnJheV9wcm9kdWN0KGNvbnN0IF9UcCogX19mLCBjb25zdCBfVHAqIF9fbCkKKyAgICB7CisgICAgICBfVHAgX19yID0gX1RwKDEpOworICAgICAgd2hpbGUgKF9fZiAhPSBfX2wpCisJX19yID0gX19yICogKl9fZisrOworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgLy8gQ29tcHV0ZSB0aGUgbWluL21heCBvZiBhbiBhcnJheS1leHByZXNzaW9uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UYT4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX1RhOjp2YWx1ZV90eXBlCisgICAgX192YWxhcnJheV9taW4oY29uc3QgX1RhJiBfX2EpCisgICAgeworICAgICAgc2l6ZV90IF9fcyA9IF9fYS5zaXplKCk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UYTo6dmFsdWVfdHlwZSBfVmFsdWVfdHlwZTsKKyAgICAgIF9WYWx1ZV90eXBlIF9fciA9IF9fcyA9PSAwID8gX1ZhbHVlX3R5cGUoKSA6IF9fYVswXTsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDE7IF9faSA8IF9fczsgKytfX2kpCisJeworCSAgX1ZhbHVlX3R5cGUgX190ID0gX19hW19faV07CisJICBpZiAoX190IDwgX19yKQorCSAgICBfX3IgPSBfX3Q7CisJfQorICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RhPgorICAgIGlubGluZSB0eXBlbmFtZSBfVGE6OnZhbHVlX3R5cGUKKyAgICBfX3ZhbGFycmF5X21heChjb25zdCBfVGEmIF9fYSkKKyAgICB7CisgICAgICBzaXplX3QgX19zID0gX19hLnNpemUoKTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RhOjp2YWx1ZV90eXBlIF9WYWx1ZV90eXBlOworICAgICAgX1ZhbHVlX3R5cGUgX19yID0gX19zID09IDAgPyBfVmFsdWVfdHlwZSgpIDogX19hWzBdOworICAgICAgZm9yIChzaXplX3QgX19pID0gMTsgX19pIDwgX19zOyArK19faSkKKwl7CisJICBfVmFsdWVfdHlwZSBfX3QgPSBfX2FbX19pXTsKKwkgIGlmIChfX3QgPiBfX3IpCisJICAgIF9fciA9IF9fdDsKKwl9CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICAvLworICAvLyBIZWxwZXIgY2xhc3MgX0FycmF5LCBmaXJzdCBsYXllciBvZiB2YWxhcnJheSBhYnN0cmFjdGlvbi4KKyAgLy8gQWxsIG9wZXJhdGlvbnMgb24gdmFsYXJyYXkgc2hvdWxkIGJlIGZvcndhcmRlZCB0byB0aGlzIGNsYXNzCisgIC8vIHdoZW5ldmVyIHBvc3NpYmxlLiAtLSBnZHIKKyAgLy8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9BcnJheQorICAgIHsKKyAgICAgIGV4cGxpY2l0IF9BcnJheShzaXplX3QpOworICAgICAgZXhwbGljaXQgX0FycmF5KF9UcCogY29uc3QgX19yZXN0cmljdF9fKTsKKyAgICAgIGV4cGxpY2l0IF9BcnJheShjb25zdCB2YWxhcnJheTxfVHA+Jik7CisgICAgICBfQXJyYXkoY29uc3QgX1RwKiBfX3Jlc3RyaWN0X18sIHNpemVfdCk7CisgICAgICAKKyAgICAgIF9UcCogYmVnaW4oKSBjb25zdDsKKyAgICAgIAorICAgICAgX1RwKiBjb25zdCBfX3Jlc3RyaWN0X18gX01fZGF0YTsKKyAgICB9OworCisKKyAgLy8gQ29weS1jb25zdHJ1Y3QgcGxhaW4gYXJyYXkgX19iWzxfX24+XSBmcm9tIGluZGV4ZWQgYXJyYXkgX19hW19faVs8X19uPl1dCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX0FycmF5PF9UcD4gX19hLCBfQXJyYXk8c2l6ZV90PiBfX2ksCisJCQkgICAgICBfQXJyYXk8X1RwPiBfX2IsIHNpemVfdCBfX24pCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX19hLl9NX2RhdGEsIF9faS5fTV9kYXRhLAorCQkJCSAgICAgX19iLl9NX2RhdGEsIF9fbik7IH0KKworICAvLyBDb3B5LWNvbnN0cnVjdCBwbGFpbiBhcnJheSBfX2JbPF9fbj5dIGZyb20gc3RyaWRlZCBhcnJheSBfX2FbPF9fbiA6IF9fcz5dCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX0FycmF5PF9UcD4gX19hLCBzaXplX3QgX19uLCBzaXplX3QgX19zLAorCQkJICAgICAgX0FycmF5PF9UcD4gX19iKQorICAgIHsgc3RkOjpfX3ZhbGFycmF5X2NvcHlfY29uc3RydWN0KF9fYS5fTV9kYXRhLCBfX24sIF9fcywgX19iLl9NX2RhdGEpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9maWxsIChfQXJyYXk8X1RwPiBfX2EsIHNpemVfdCBfX24sIGNvbnN0IF9UcCYgX190KQorICAgIHsgc3RkOjpfX3ZhbGFycmF5X2ZpbGwoX19hLl9NX2RhdGEsIF9fbiwgX190KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfZmlsbChfQXJyYXk8X1RwPiBfX2EsIHNpemVfdCBfX24sIHNpemVfdCBfX3MsIGNvbnN0IF9UcCYgX190KQorICAgIHsgc3RkOjpfX3ZhbGFycmF5X2ZpbGwoX19hLl9NX2RhdGEsIF9fbiwgX19zLCBfX3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9maWxsKF9BcnJheTxfVHA+IF9fYSwgX0FycmF5PHNpemVfdD4gX19pLAorCQkgICAgc2l6ZV90IF9fbiwgY29uc3QgX1RwJiBfX3QpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfZmlsbChfX2EuX01fZGF0YSwgX19pLl9NX2RhdGEsIF9fbiwgX190KTsgfQorCisgIC8vIENvcHkgYSBwbGFpbiBhcnJheSBfX2FbPF9fbj5dIGludG8gYSBwbGF5IGFycmF5IF9fYls8Pl0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KF9BcnJheTxfVHA+IF9fYSwgc2l6ZV90IF9fbiwgX0FycmF5PF9UcD4gX19iKQorICAgIHsgc3RkOjpfX3ZhbGFycmF5X2NvcHkoX19hLl9NX2RhdGEsIF9fbiwgX19iLl9NX2RhdGEpOyB9CisKKyAgLy8gQ29weSBzdHJpZGVkIGFycmF5IF9fYVs8X19uIDogX19zPl0gaW4gcGxhaW4gX19iWzxfX24+XQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoX0FycmF5PF9UcD4gX19hLCBzaXplX3QgX19uLCBzaXplX3QgX19zLCBfQXJyYXk8X1RwPiBfX2IpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weShfX2EuX01fZGF0YSwgX19uLCBfX3MsIF9fYi5fTV9kYXRhKTsgfQorCisgIC8vIENvcHkgYSBwbGFpbiBhcnJheSAgX19hWzxfX24+XSBpbnRvIGEgc3RyaWRlZCBhcnJheSBfX2JbPF9fbiA6IF9fcz5dCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShfQXJyYXk8X1RwPiBfX2EsIF9BcnJheTxfVHA+IF9fYiwgc2l6ZV90IF9fbiwgc2l6ZV90IF9fcykKKyAgICB7IF9fdmFsYXJyYXlfY29weShfX2EuX01fZGF0YSwgX19iLl9NX2RhdGEsIF9fbiwgX19zKTsgfQorCisgIC8vIENvcHkgc3RyaWRlZCBhcnJheSBfX3NyY1s8X19uIDogX19zMT5dIGludG8gYW5vdGhlcgorICAvLyBzdHJpZGVkIGFycmF5IF9fZHN0WzwgOiBfX3MyPl0uICBUaGVpciBzaXplcyBtdXN0IG1hdGNoLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoX0FycmF5PF9UcD4gX19hLCBzaXplX3QgX19uLCBzaXplX3QgX19zMSwKKyAgICAgICAgICAgICAgICAgICAgX0FycmF5PF9UcD4gX19iLCBzaXplX3QgX19zMikKKyAgICB7IHN0ZDo6X192YWxhcnJheV9jb3B5KF9fYS5fTV9kYXRhLCBfX24sIF9fczEsIF9fYi5fTV9kYXRhLCBfX3MyKTsgfQorCisgIC8vIENvcHkgYW4gaW5kZXhlZCBhcnJheSBfX2FbX19pWzxfX24+XV0gaW4gcGxhaW4gYXJyYXkgX19iWzxfX24+XQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoX0FycmF5PF9UcD4gX19hLCBfQXJyYXk8c2l6ZV90PiBfX2ksCisJCSAgICBfQXJyYXk8X1RwPiBfX2IsIHNpemVfdCBfX24pCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weShfX2EuX01fZGF0YSwgX19pLl9NX2RhdGEsIF9fYi5fTV9kYXRhLCBfX24pOyB9CisKKyAgLy8gQ29weSBhIHBsYWluIGFycmF5IF9fYVs8X19uPl0gaW4gYW4gaW5kZXhlZCBhcnJheSBfX2JbX19pWzxfX24+XV0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KF9BcnJheTxfVHA+IF9fYSwgc2l6ZV90IF9fbiwgX0FycmF5PF9UcD4gX19iLAorCQkgICAgX0FycmF5PHNpemVfdD4gX19pKQorICAgIHsgc3RkOjpfX3ZhbGFycmF5X2NvcHkoX19hLl9NX2RhdGEsIF9fbiwgX19iLl9NX2RhdGEsIF9faS5fTV9kYXRhKTsgfQorCisgIC8vIENvcHkgdGhlIF9fbiBmaXJzdCBlbGVtZW50cyBvZiBhbiBpbmRleGVkIGFycmF5IF9fc3JjWzxfX2k+XSBpbnRvCisgIC8vIGFub3RoZXIgaW5kZXhlZCBhcnJheSBfX2RzdFs8X19qPl0uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShfQXJyYXk8X1RwPiBfX3NyYywgc2l6ZV90IF9fbiwgX0FycmF5PHNpemVfdD4gX19pLAorICAgICAgICAgICAgICAgICAgICBfQXJyYXk8X1RwPiBfX2RzdCwgX0FycmF5PHNpemVfdD4gX19qKQorICAgIHsKKyAgICAgIHN0ZDo6X192YWxhcnJheV9jb3B5KF9fc3JjLl9NX2RhdGEsIF9fbiwgX19pLl9NX2RhdGEsCisJCSAgICBfX2RzdC5fTV9kYXRhLCBfX2ouX01fZGF0YSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICBfQXJyYXk8X1RwPjo6X0FycmF5KHNpemVfdCBfX24pCisgICAgOiBfTV9kYXRhKF9fdmFsYXJyYXlfZ2V0X3N0b3JhZ2U8X1RwPihfX24pKQorICAgIHsgc3RkOjpfX3ZhbGFycmF5X2RlZmF1bHRfY29uc3RydWN0KF9NX2RhdGEsIF9NX2RhdGEgKyBfX24pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIF9BcnJheTxfVHA+OjpfQXJyYXkoX1RwKiBjb25zdCBfX3Jlc3RyaWN0X18gX19wKQorICAgIDogX01fZGF0YSAoX19wKSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICBfQXJyYXk8X1RwPjo6X0FycmF5KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdikKKyAgICA6IF9NX2RhdGEgKF9fdi5fTV9kYXRhKSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICBfQXJyYXk8X1RwPjo6X0FycmF5KGNvbnN0IF9UcCogX19yZXN0cmljdF9fIF9fYiwgc2l6ZV90IF9fcykKKyAgICA6IF9NX2RhdGEoX192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9fcykpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX19iLCBfX3MsIF9NX2RhdGEpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAqCisgICAgX0FycmF5PF9UcD46OmJlZ2luICgpIGNvbnN0CisgICAgeyByZXR1cm4gX01fZGF0YTsgfQorCisjZGVmaW5lIF9ERUZJTkVfQVJSQVlfRlVOQ1RJT04oX09wLCBfTmFtZSkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CQkgICAgICAgIAkJCVwKKyAgICBpbmxpbmUgdm9pZAkJCQkJCQkJXAorICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPiBfX2EsIHNpemVfdCBfX24sIGNvbnN0IF9UcCYgX190KSBcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIGZvciAoX1RwKiBfX3AgPSBfX2EuX01fZGF0YTsgX19wIDwgX19hLl9NX2RhdGEgKyBfX247ICsrX19wKQlcCisgICAgICAgICpfX3AgX09wIyM9IF9fdDsJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgkJCQkJCVwKKyAgICBpbmxpbmUgdm9pZAkJCQkJCQkJXAorICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPiBfX2EsIHNpemVfdCBfX24sIF9BcnJheTxfVHA+IF9fYikgXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBfVHAqIF9fcCA9IF9fYS5fTV9kYXRhOwkJCQkJCVwKKyAgICAgIGZvciAoX1RwKiBfX3EgPSBfX2IuX01fZGF0YTsgX19xIDwgX19iLl9NX2RhdGEgKyBfX247ICsrX19wLCArK19fcSkgXAorICAgICAgICAqX19wIF9PcCMjPSAqX19xOwkJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGNsYXNzIF9Eb20+CQkJCQlcCisgICAgdm9pZAkJCQkJCQkJXAorICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPiBfX2EsCSAgICAgICAgCQlcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSwgc2l6ZV90IF9fbikJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBfVHAqIF9fcChfX2EuX01fZGF0YSk7CQkJCQkJXAorICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSwgKytfX3ApICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqX19wIF9PcCMjPSBfX2VbX19pXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAorICAgIH0JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4JCQkJCQlcCisgICAgaW5saW5lIHZvaWQJCQkJCQkJCVwKKyAgICBfQXJyYXlfYXVnbWVudGVkXyMjX05hbWUoX0FycmF5PF9UcD4gX19hLCBzaXplX3QgX19uLCBzaXplX3QgX19zLAlcCisJICAgICAgICAgICAgICAgICAgICAgX0FycmF5PF9UcD4gX19iKQkJCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIF9UcCogX19xKF9fYi5fTV9kYXRhKTsJCQkJCQlcCisgICAgICBmb3IgKF9UcCogX19wID0gX19hLl9NX2RhdGE7IF9fcCA8IF9fYS5fTV9kYXRhICsgX19zICogX19uOyAgICAgICBcCisJICAgX19wICs9IF9fcywgKytfX3EpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKl9fcCBfT3AjIz0gKl9fcTsJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgkJCQkJCVwKKyAgICBpbmxpbmUgdm9pZAkJCQkJCQkJXAorICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPiBfX2EsIF9BcnJheTxfVHA+IF9fYiwJCVwKKwkJICAgICAgICAgICAgIHNpemVfdCBfX24sIHNpemVfdCBfX3MpCQkJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBfVHAqIF9fcShfX2IuX01fZGF0YSk7CQkJCQkJXAorICAgICAgZm9yIChfVHAqIF9fcCA9IF9fYS5fTV9kYXRhOyBfX3AgPCBfX2EuX01fZGF0YSArIF9fbjsgICAgICAgICAgICAgXAorCSAgICsrX19wLCBfX3EgKz0gX19zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICpfX3AgX09wIyM9ICpfX3E7CQkJCQkJXAorICAgIH0JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgY2xhc3MgX0RvbT4JCQkJCVwKKyAgICB2b2lkCQkJCQkJCQlcCisgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9BcnJheTxfVHA+IF9fYSwgc2l6ZV90IF9fcywJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYgX19lLCBzaXplX3QgX19uKQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIF9UcCogX19wKF9fYS5fTV9kYXRhKTsJCQkJCQlcCisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pLCBfX3AgKz0gX19zKSAgICAgICAgICAgICAgICBcCisgICAgICAgICpfX3AgX09wIyM9IF9fZVtfX2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgkJCQkJCVwKKyAgICBpbmxpbmUgdm9pZAkJCQkJCQkJXAorICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPiBfX2EsIF9BcnJheTxzaXplX3Q+IF9faSwJXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQXJyYXk8X1RwPiBfX2IsIHNpemVfdCBfX24pCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIF9UcCogX19xKF9fYi5fTV9kYXRhKTsJCQkJCQlcCisgICAgICBmb3IgKHNpemVfdCogX19qID0gX19pLl9NX2RhdGE7IF9faiA8IF9faS5fTV9kYXRhICsgX19uOyAgICAgICAgICBcCisgICAgICAgICAgICsrX19qLCArK19fcSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9fYS5fTV9kYXRhWypfX2pdIF9PcCMjPSAqX19xOwkJCQkJXAorICAgIH0JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4JCQkJCQlcCisgICAgaW5saW5lIHZvaWQJCQkJCSAgICAgICAgCQlcCisgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9BcnJheTxfVHA+IF9fYSwgc2l6ZV90IF9fbiwJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0FycmF5PF9UcD4gX19iLCBfQXJyYXk8c2l6ZV90PiBfX2kpCVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgX1RwKiBfX3AoX19hLl9NX2RhdGEpOwkJCQkJCVwKKyAgICAgIGZvciAoc2l6ZV90KiBfX2ogPSBfX2kuX01fZGF0YTsgX19qPF9faS5fTV9kYXRhICsgX19uOyAgICAgICAgICAgIFwKKwkgICArK19faiwgKytfX3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqX19wIF9PcCMjPSBfX2IuX01fZGF0YVsqX19qXTsJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGNsYXNzIF9Eb20+CQkJCQlcCisgICAgdm9pZAkJCQkJCQkJXAorICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPiBfX2EsIF9BcnJheTxzaXplX3Q+IF9faSwJXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfRXhwcjxfRG9tLCBfVHA+JiBfX2UsIHNpemVfdCBfX24pCVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgc2l6ZV90KiBfX2ooX19pLl9NX2RhdGEpOwkgICAgICAgIAkJCQlcCisgICAgICBmb3IgKHNpemVfdCBfX2sgPSAwOyBfX2s8X19uOyArK19faywgKytfX2opCQkJXAorICAgICAgICBfX2EuX01fZGF0YVsqX19qXSBfT3AjIz0gX19lW19fa107CQkJCVwKKyAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CQkJCQkJXAorICAgIHZvaWQJCQkJCQkJCVwKKyAgICBfQXJyYXlfYXVnbWVudGVkXyMjX05hbWUoX0FycmF5PF9UcD4gX19hLCBfQXJyYXk8Ym9vbD4gX19tLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0FycmF5PF9UcD4gX19iLCBzaXplX3QgX19uKQkJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBib29sKiBfX29rKF9fbS5fTV9kYXRhKTsJCQkJCQlcCisgICAgICBfVHAqIF9fcChfX2EuX01fZGF0YSk7CQkJCQkJXAorICAgICAgZm9yIChfVHAqIF9fcSA9IF9fYi5fTV9kYXRhOyBfX3EgPCBfX2IuX01fZGF0YSArIF9fbjsgICAgICAgICAgICAgXAorCSAgICsrX19xLCArK19fb2ssICsrX19wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgd2hpbGUgKCEgKl9fb2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7CQkJCQkJICAgICAgICAJXAorICAgICAgICAgICAgICArK19fb2s7CQkJCQkJCVwKKyAgICAgICAgICAgICAgKytfX3A7CQkJCQkJCVwKKyAgICAgICAgICAgIH0JCQkJCQkJCVwKKyAgICAgICAgICAqX19wIF9PcCMjPSAqX19xOwkJCQkJCVwKKyAgICAgICAgfQkJCQkJCQkJXAorICAgIH0JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4JCQkJCQlcCisgICAgdm9pZAkJCQkJCQkJXAorICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPiBfX2EsIHNpemVfdCBfX24sCQlcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BcnJheTxfVHA+IF9fYiwgX0FycmF5PGJvb2w+IF9fbSkgICAJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBib29sKiBfX29rKF9fbS5fTV9kYXRhKTsJCQkJCQlcCisgICAgICBfVHAqIF9fcShfX2IuX01fZGF0YSk7CQkJCQkJXAorICAgICAgZm9yIChfVHAqIF9fcCA9IF9fYS5fTV9kYXRhOyBfX3AgPCBfX2EuX01fZGF0YSArIF9fbjsgICAgICAgICAgICAgXAorCSAgICsrX19wLCArK19fb2ssICsrX19xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgd2hpbGUgKCEgKl9fb2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7CQkJCQkgICAgICAgIAkJXAorICAgICAgICAgICAgICArK19fb2s7CQkJCQkJCVwKKyAgICAgICAgICAgICAgKytfX3E7CQkJCQkJCVwKKyAgICAgICAgICAgIH0JCQkJCQkJCVwKKyAgICAgICAgICAqX19wIF9PcCMjPSAqX19xOwkJCQkJCVwKKyAgICAgICAgfQkJCQkJCQkJXAorICAgIH0JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgY2xhc3MgX0RvbT4JCQkJCVwKKyAgICB2b2lkCQkJCQkJCQlcCisgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9BcnJheTxfVHA+IF9fYSwgX0FycmF5PGJvb2w+IF9fbSwgIAlcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSwgc2l6ZV90IF9fbikJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBib29sKiBfX29rKF9fbS5fTV9kYXRhKTsJCQkJCQlcCisgICAgICBfVHAqIF9fcChfX2EuX01fZGF0YSk7CQkJCQkJXAorICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSwgKytfX29rLCArK19fcCkgICAgICAgICAgICAgXAorICAgICAgICB7CSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCVwKKyAgICAgICAgICB3aGlsZSAoISAqX19vaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsJCSAgICAgICAgIAkJCQkJXAorCSAgICAgICsrX19vazsJCQkJCQkJXAorICAgICAgICAgICAgICArK19fcDsJCQkJCQkJXAorICAgICAgICAgICAgfQkJCQkJCQkJXAorICAgICAgICAgICpfX3AgX09wIyM9IF9fZVtfX2ldOwkJCQkJCVwKKyAgICAgICAgfQkJCQkJCQkJXAorICAgIH0KKworICAgX0RFRklORV9BUlJBWV9GVU5DVElPTigrLCBfX3BsdXMpCisgICBfREVGSU5FX0FSUkFZX0ZVTkNUSU9OKC0sIF9fbWludXMpCisgICBfREVGSU5FX0FSUkFZX0ZVTkNUSU9OKCosIF9fbXVsdGlwbGllcykKKyAgIF9ERUZJTkVfQVJSQVlfRlVOQ1RJT04oLywgX19kaXZpZGVzKQorICAgX0RFRklORV9BUlJBWV9GVU5DVElPTiglLCBfX21vZHVsdXMpCisgICBfREVGSU5FX0FSUkFZX0ZVTkNUSU9OKF4sIF9fYml0d2lzZV94b3IpCisgICBfREVGSU5FX0FSUkFZX0ZVTkNUSU9OKHwsIF9fYml0d2lzZV9vcikKKyAgIF9ERUZJTkVfQVJSQVlfRlVOQ1RJT04oJiwgX19iaXR3aXNlX2FuZCkKKyAgIF9ERUZJTkVfQVJSQVlfRlVOQ1RJT04oPDwsIF9fc2hpZnRfbGVmdCkKKyAgIF9ERUZJTkVfQVJSQVlfRlVOQ1RJT04oPj4sIF9fc2hpZnRfcmlnaHQpCisKKyN1bmRlZiBfREVGSU5FX0FSUkFZX0ZVTkNUSU9OCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworIyBpbmNsdWRlIDxiaXRzL3ZhbGFycmF5X2FycmF5LnRjYz4KKworI2VuZGlmIC8qIF9BUlJBWV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdmFsYXJyYXlfYXJyYXkudGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3ZhbGFycmF5X2FycmF5LnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzg3ZTZlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3ZhbGFycmF5X2FycmF5LnRjYwpAQCAtMCwwICsxLDI0NCBAQAorLy8gVGhlIHRlbXBsYXRlIGFuZCBpbmxpbmVzIGZvciB0aGUgLSotIEMrKyAtKi0gaW50ZXJuYWwgX0FycmF5IGhlbHBlciBjbGFzcy4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvdmFsYXJyYXlfYXJyYXkudGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dmFsYXJyYXl9CisgKi8KKworLy8gV3JpdHRlbiBieSBHYWJyaWVsIERvcyBSZWlzIDxHYWJyaWVsLkRvcy1SZWlzQERQVE1hdGhzLkVOUy1DYWNoYW4uRnI+CisKKyNpZm5kZWYgX1ZBTEFSUkFZX0FSUkFZX1RDQworI2RlZmluZSBfVkFMQVJSQVlfQVJSQVlfVENDIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgX192YWxhcnJheV9maWxsKF9BcnJheTxfVHA+IF9fYSwgc2l6ZV90IF9fbiwgX0FycmF5PGJvb2w+IF9fbSwKKwkJICAgIGNvbnN0IF9UcCYgX190KQorICAgIHsKKyAgICAgIF9UcCogX19wID0gX19hLl9NX2RhdGE7CisgICAgICBib29sKiBfX29rIChfX20uX01fZGF0YSk7CisgICAgICBmb3IgKHNpemVfdCBfX2k9MDsgX19pIDwgX19uOyArK19faSwgKytfX29rLCArK19fcCkKKwl7CisJICB3aGlsZSAoISpfX29rKQorCSAgeworCSAgICArK19fb2s7CisJICAgICsrX19wOworCSAgfQorCSAgKl9fcCA9IF9fdDsKKwl9CisgICAgfQorCisgIC8vIENvcHkgbiBlbGVtZW50cyBvZiBhIGludG8gY29uc2VjdXRpdmUgZWxlbWVudHMgb2YgYi4gIFdoZW4gbSBpcworICAvLyBmYWxzZSwgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiBhIGlzIHNraXBwZWQuICBtIG11c3QgY29udGFpbgorICAvLyBhdCBsZWFzdCBuIHRydWUgZWxlbWVudHMuICBhIG11c3QgY29udGFpbiBhdCBsZWFzdCBuIGVsZW1lbnRzIGFuZAorICAvLyBlbm91Z2ggZWxlbWVudHMgdG8gbWF0Y2ggdXAgd2l0aCBtIHRocm91Z2ggdGhlIG50aCB0cnVlIGVsZW1lbnQKKyAgLy8gb2YgbS4gIEkuZS4gIGlmIG4gaXMgMTAsIG0gaGFzIDE1IGVsZW1lbnRzIHdpdGggNSBmYWxzZSBmb2xsb3dlZAorICAvLyBieSAxMCB0cnVlLCBhIG11c3QgaGF2ZSAxNSBlbGVtZW50cy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoX0FycmF5PF9UcD4gX19hLCBfQXJyYXk8Ym9vbD4gX19tLCBfQXJyYXk8X1RwPiBfX2IsCisJCSAgICBzaXplX3QgX19uKQorICAgIHsKKyAgICAgIF9UcCogX19wIChfX2EuX01fZGF0YSk7CisgICAgICBib29sKiBfX29rIChfX20uX01fZGF0YSk7CisgICAgICBmb3IgKF9UcCogX19xID0gX19iLl9NX2RhdGE7IF9fcSA8IF9fYi5fTV9kYXRhICsgX19uOworCSAgICsrX19xLCArK19fb2ssICsrX19wKQorCXsKKwkgIHdoaWxlICghICpfX29rKQorCSAgICB7CisJICAgICAgKytfX29rOworCSAgICAgICsrX19wOworCSAgICB9CisJICAqX19xID0gKl9fcDsKKwl9CisgICAgfQorCisgIC8vIENvcHkgbiBjb25zZWN1dGl2ZSBlbGVtZW50cyBmcm9tIGEgaW50byBlbGVtZW50cyBvZiBiLiAgRWxlbWVudHMKKyAgLy8gb2YgYiBhcmUgc2tpcHBlZCBpZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIG0gaXMgZmFsc2UuICBtCisgIC8vIG11c3QgY29udGFpbiBhdCBsZWFzdCBuIHRydWUgZWxlbWVudHMuICBiIG11c3QgaGF2ZSBhdCBsZWFzdCBhcworICAvLyBtYW55IGVsZW1lbnRzIGFzIHRoZSBpbmRleCBvZiB0aGUgbnRoIHRydWUgZWxlbWVudCBvZiBtLiAgSS5lLiBpZgorICAvLyBtIGhhcyAxNSBlbGVtZW50cyB3aXRoIDUgZmFsc2UgZm9sbG93ZWQgYnkgMTAgdHJ1ZSwgYiBtdXN0IGhhdmUKKyAgLy8gYXQgbGVhc3QgMTUgZWxlbWVudHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KF9BcnJheTxfVHA+IF9fYSwgc2l6ZV90IF9fbiwgX0FycmF5PF9UcD4gX19iLAorCQkgICAgX0FycmF5PGJvb2w+IF9fbSkKKyAgICB7CisgICAgICBfVHAqIF9fcSAoX19iLl9NX2RhdGEpOworICAgICAgYm9vbCogX19vayAoX19tLl9NX2RhdGEpOworICAgICAgZm9yIChfVHAqIF9fcCA9IF9fYS5fTV9kYXRhOyBfX3AgPCBfX2EuX01fZGF0YStfX247CisJICAgKytfX3AsICsrX19vaywgKytfX3EpCisJeworCSAgd2hpbGUgKCEgKl9fb2spCisJICAgIHsKKwkgICAgICArK19fb2s7CisJICAgICAgKytfX3E7CisJICAgIH0KKwkgICpfX3EgPSAqX19wOworCX0KKyAgICB9CisKKyAgLy8gQ29weSBuIGVsZW1lbnRzIGZyb20gYSBpbnRvIGVsZW1lbnRzIG9mIGIuICBFbGVtZW50cyBvZiBhIGFyZQorICAvLyBza2lwcGVkIGlmIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgbSBpcyBmYWxzZS4gIEVsZW1lbnRzIG9mCisgIC8vIGIgYXJlIHNraXBwZWQgaWYgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiBrIGlzIGZhbHNlLiAgbSBhbmQKKyAgLy8gayBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgbiB0cnVlIGVsZW1lbnRzLiAgYSBhbmQgYiBtdXN0IGhhdmUgYXQKKyAgLy8gbGVhc3QgYXMgbWFueSBlbGVtZW50cyBhcyB0aGUgaW5kZXggb2YgdGhlIG50aCB0cnVlIGVsZW1lbnQgb2YgbS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoX0FycmF5PF9UcD4gX19hLCBfQXJyYXk8Ym9vbD4gX19tLCBzaXplX3QgX19uLAorCQkgICAgX0FycmF5PF9UcD4gX19iLCBfQXJyYXk8Ym9vbD4gX19rKQorICAgIHsKKyAgICAgIF9UcCogX19wIChfX2EuX01fZGF0YSk7CisgICAgICBfVHAqIF9fcSAoX19iLl9NX2RhdGEpOworICAgICAgYm9vbCogX19zcmNvayAoX19tLl9NX2RhdGEpOworICAgICAgYm9vbCogX19kc3RvayAoX19rLl9NX2RhdGEpOworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOworCSAgICsrX19zcmNvaywgKytfX3AsICsrX19kc3RvaywgKytfX3EsICsrX19pKQorCXsKKwkgIHdoaWxlICghICpfX3NyY29rKQorCSAgICB7CisJICAgICAgKytfX3NyY29rOworCSAgICAgICsrX19wOworCSAgICB9CisJICB3aGlsZSAoISAqX19kc3RvaykgCisJICAgIHsKKwkgICAgICArK19fZHN0b2s7CisJICAgICAgKytfX3E7CisJICAgIH0KKwkgICpfX3EgPSAqX19wOworCX0KKyAgICB9CisKKyAgLy8gQ29weSBuIGNvbnNlY3V0aXZlIGVsZW1lbnRzIG9mIGUgaW50byBjb25zZWN1dGl2ZSBlbGVtZW50cyBvZiBhLgorICAvLyBJLmUuIGFbaV0gPSBlW2ldLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGNsYXNzIF9Eb20+CisgICAgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JiBfX2UsIHNpemVfdCBfX24sIF9BcnJheTxfVHA+IF9fYSkKKyAgICB7CisgICAgICBfVHAqIF9fcCAoX19hLl9NX2RhdGEpOworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSwgKytfX3ApCisJKl9fcCA9IF9fZVtfX2ldOworICAgIH0KKworICAvLyBDb3B5IG4gY29uc2VjdXRpdmUgZWxlbWVudHMgb2YgZSBpbnRvIGVsZW1lbnRzIG9mIGEgdXNpbmcgc3RyaWRlCisgIC8vIHMuICBJLmUuLCBhWzBdID0gZVswXSwgYVtzXSA9IGVbMV0sIGFbMipzXSA9IGVbMl0uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgY2xhc3MgX0RvbT4KKyAgICB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSwgc2l6ZV90IF9fbiwKKwkJICAgICBfQXJyYXk8X1RwPiBfX2EsIHNpemVfdCBfX3MpCisgICAgeworICAgICAgX1RwKiBfX3AgKF9fYS5fTV9kYXRhKTsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2ksIF9fcCArPSBfX3MpCisJKl9fcCA9IF9fZVtfX2ldOworICAgIH0KKworICAvLyBDb3B5IG4gY29uc2VjdXRpdmUgZWxlbWVudHMgb2YgZSBpbnRvIGVsZW1lbnRzIG9mIGEgaW5kZXhlZCBieQorICAvLyBjb250ZW50cyBvZiBpLiAgSS5lLiwgYVtpWzBdXSA9IGVbMF0uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgY2xhc3MgX0RvbT4KKyAgICB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSwgc2l6ZV90IF9fbiwKKwkJICAgIF9BcnJheTxfVHA+IF9fYSwgX0FycmF5PHNpemVfdD4gX19pKQorICAgIHsKKyAgICAgIHNpemVfdCogX19qIChfX2kuX01fZGF0YSk7CisgICAgICBmb3IgKHNpemVfdCBfX2sgPSAwOyBfX2sgPCBfX247ICsrX19rLCArK19faikKKwlfX2EuX01fZGF0YVsqX19qXSA9IF9fZVtfX2tdOworICAgIH0KKworICAvLyBDb3B5IG4gZWxlbWVudHMgb2YgZSBpbmRleGVkIGJ5IGNvbnRlbnRzIG9mIGYgaW50byBlbGVtZW50cyBvZiBhCisgIC8vIGluZGV4ZWQgYnkgY29udGVudHMgb2YgaS4gIEkuZS4sIGFbaVswXV0gPSBlW2ZbMF1dLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShfQXJyYXk8X1RwPiBfX2UsIF9BcnJheTxzaXplX3Q+IF9fZiwKKwkJICAgIHNpemVfdCBfX24sIAorCQkgICAgX0FycmF5PF9UcD4gX19hLCBfQXJyYXk8c2l6ZV90PiBfX2kpCisgICAgeworICAgICAgc2l6ZV90KiBfX2cgKF9fZi5fTV9kYXRhKTsKKyAgICAgIHNpemVfdCogX19qIChfX2kuX01fZGF0YSk7CisgICAgICBmb3IgKHNpemVfdCBfX2sgPSAwOyBfX2sgPCBfX247ICsrX19rLCArK19faiwgKytfX2cpIAorCV9fYS5fTV9kYXRhWypfX2pdID0gX19lLl9NX2RhdGFbKl9fZ107CisgICAgfQorCisgIC8vIENvcHkgbiBjb25zZWN1dGl2ZSBlbGVtZW50cyBvZiBlIGludG8gZWxlbWVudHMgb2YgYS4gIEVsZW1lbnRzIG9mCisgIC8vIGEgYXJlIHNraXBwZWQgaWYgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiBtIGlzIGZhbHNlLiAgbSBtdXN0CisgIC8vIGhhdmUgYXQgbGVhc3QgbiB0cnVlIGVsZW1lbnRzIGFuZCBhIG11c3QgaGF2ZSBhdCBsZWFzdCBhcyBtYW55CisgIC8vIGVsZW1lbnRzIGFzIHRoZSBpbmRleCBvZiB0aGUgbnRoIHRydWUgZWxlbWVudCBvZiBtLiAgSS5lLiBpZiBtCisgIC8vIGhhcyA1IGZhbHNlIGZvbGxvd2VkIGJ5IDEwIHRydWUgZWxlbWVudHMgYW5kIG4gPT0gMTAsIGEgbXVzdCBoYXZlCisgIC8vIGF0IGxlYXN0IDE1IGVsZW1lbnRzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGNsYXNzIF9Eb20+CisgICAgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JiBfX2UsIHNpemVfdCBfX24sCisJCSAgICBfQXJyYXk8X1RwPiBfX2EsIF9BcnJheTxib29sPiBfX20pCisgICAgeworICAgICAgYm9vbCogX19vayAoX19tLl9NX2RhdGEpOworICAgICAgX1RwKiBfX3AgKF9fYS5fTV9kYXRhKTsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2ksICsrX19vaywgKytfX3ApCisJeworCSAgd2hpbGUgKCEgKl9fb2spCisJICAgIHsKKwkgICAgICArK19fb2s7CisJICAgICAgKytfX3A7CisJICAgIH0KKwkgICpfX3AgPSBfX2VbX19pXTsKKwl9CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBjbGFzcyBfRG9tPgorICAgIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHlfY29uc3RydWN0KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSwgc2l6ZV90IF9fbiwKKwkJCSAgICAgIF9BcnJheTxfVHA+IF9fYSkKKyAgICB7CisgICAgICBfVHAqIF9fcCAoX19hLl9NX2RhdGEpOworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSwgKytfX3ApCisJbmV3IChfX3ApIF9UcChfX2VbX19pXSk7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHlfY29uc3RydWN0KF9BcnJheTxfVHA+IF9fYSwgX0FycmF5PGJvb2w+IF9fbSwKKwkJCSAgICAgIF9BcnJheTxfVHA+IF9fYiwgc2l6ZV90IF9fbikKKyAgICB7CisgICAgICBfVHAqIF9fcCAoX19hLl9NX2RhdGEpOworICAgICAgYm9vbCogX19vayAoX19tLl9NX2RhdGEpOworICAgICAgZm9yIChfVHAqIF9fcSA9IF9fYi5fTV9kYXRhOyBfX3EgPCBfX2IuX01fZGF0YStfX247ICsrX19xLCArK19fb2ssICsrX19wKQorCXsKKwkgIHdoaWxlICghICpfX29rKQorCSAgICB7CisJICAgICAgKytfX29rOworCSAgICAgICsrX19wOworCSAgICB9CisJICBuZXcgKF9fcSkgX1RwKCpfX3ApOworCX0KKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9WQUxBUlJBWV9BUlJBWV9UQ0MgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy92YWxhcnJheV9iZWZvcmUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0cy92YWxhcnJheV9iZWZvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzU3MzFhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3ZhbGFycmF5X2JlZm9yZS5oCkBAIC0wLDAgKzEsNzMzIEBACisvLyBUaGUgdGVtcGxhdGUgYW5kIGlubGluZXMgZm9yIHRoZSAtKi0gQysrIC0qLSBpbnRlcm5hbCBfTWV0YSBjbGFzcy4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvdmFsYXJyYXlfYmVmb3JlLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt2YWxhcnJheX0KKyAqLworCisvLyBXcml0dGVuIGJ5IEdhYnJpZWwgRG9zIFJlaXMgPEdhYnJpZWwuRG9zLVJlaXNAY21sYS5lbnMtY2FjaGFuLmZyPgorCisjaWZuZGVmIF9WQUxBUlJBWV9CRUZPUkVfSAorI2RlZmluZSBfVkFMQVJSQVlfQkVGT1JFX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL3NsaWNlX2FycmF5Lmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLworICAvLyBJbXBsZW1lbnRpbmcgYSBsb29zZW5lZCB2YWxhcnJheSByZXR1cm4gdmFsdWUgaXMgdHJpY2t5LgorICAvLyBGaXJzdCB3ZSBuZWVkIHRvIG1lZXQgMjYuMy4xLzM6IHdlIHNob3VsZCBub3QgYWRkIG1vcmUgdGhhbgorICAvLyB0d28gbGV2ZWxzIG9mIHRlbXBsYXRlIG5lc3RpbmcuIFRoZXJlZm9yZSB3ZSByZXNvcnQgdG8gdGVtcGxhdGUKKyAgLy8gdGVtcGxhdGUgdG8gImZsYXR0ZW4iIGxvb3NlbmVkIHJldHVybiB2YWx1ZSB0eXBlcy4KKyAgLy8gQXQgc29tZSBwb2ludCB3ZSB1c2UgcGFydGlhbCBzcGVjaWFsaXphdGlvbiB0byByZW1vdmUgb25lIGxldmVsCisgIC8vIHRlbXBsYXRlIG5lc3RpbmcgZHVlIHRvIF9FeHByPD4KKyAgLy8KKworICAvLyBUaGlzIGNsYXNzIGlzIE5PVCBkZWZpbmVkLiBJdCBkb2Vzbid0IG5lZWQgdG8uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+IGNsYXNzIF9Db25zdGFudDsKKworICAvLyBJbXBsZW1lbnRhdGlvbnMgb2YgdW5hcnkgZnVuY3Rpb25zIGFwcGxpZWQgdG8gdmFsYXJyYXk8PnMuCisgIC8vIEkgdXNlIGhhcmQtY29kZWQgb2JqZWN0IGZ1bmN0aW9ucyBoZXJlIGluc3RlYWQgb2YgYSBnZW5lcmljCisgIC8vIGFwcHJvYWNoIGxpa2UgcG9pbnRlcnMgdG8gZnVuY3Rpb246CisgIC8vICAgIDEpIGNvcnJlY3RuZXNzOiBzb21lIGZ1bmN0aW9ucyB0YWtlIHJlZmVyZW5jZXMsIG90aGVycyB2YWx1ZXMuCisgIC8vICAgICAgIHdlIGNhbid0IGRlZHVjZSB0aGUgY29ycmVjdCB0eXBlIGFmdGVyd2FyZHMuCisgIC8vICAgIDIpIGVmZmljaWVuY3kgLS0gb2JqZWN0IGZ1bmN0aW9ucyBjYW4gYmUgZWFzaWx5IGlubGluZWQKKyAgLy8gICAgMykgYmUgS29lbmlnLWxvb2t1cC1mcmllbmRseQorCisgIHN0cnVjdCBfQWJzCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGFicyhfX3QpOyB9CisgIH07CisKKyAgc3RydWN0IF9Db3MKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX190KSBjb25zdAorICAgICAgeyByZXR1cm4gY29zKF9fdCk7IH0KKyAgfTsKKworICBzdHJ1Y3QgX0Fjb3MKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX190KSBjb25zdAorICAgICAgeyByZXR1cm4gYWNvcyhfX3QpOyB9CisgIH07CisKKyAgc3RydWN0IF9Db3NoCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvc2goX190KTsgfQorICB9OworCisgIHN0cnVjdCBfU2luCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHNpbihfX3QpOyB9CisgIH07CisKKyAgc3RydWN0IF9Bc2luCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGFzaW4oX190KTsgfQorICB9OworCisgIHN0cnVjdCBfU2luaAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgICB7IHJldHVybiBzaW5oKF9fdCk7IH0KKyAgfTsKKworICBzdHJ1Y3QgX1RhbgorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgICB7IHJldHVybiB0YW4oX190KTsgfQorICB9OworCisgIHN0cnVjdCBfQXRhbgorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgICB7IHJldHVybiBhdGFuKF9fdCk7IH0KKyAgfTsKKworICBzdHJ1Y3QgX1RhbmgKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX190KSBjb25zdAorICAgICAgeyByZXR1cm4gdGFuaChfX3QpOyB9CisgIH07CisKKyAgc3RydWN0IF9FeHAKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX190KSBjb25zdAorICAgICAgeyByZXR1cm4gZXhwKF9fdCk7IH0KKyAgfTsKKworICBzdHJ1Y3QgX0xvZworICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgICB7IHJldHVybiBsb2coX190KTsgfQorICB9OworCisgIHN0cnVjdCBfTG9nMTAKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX190KSBjb25zdAorICAgICAgeyByZXR1cm4gbG9nMTAoX190KTsgfQorICB9OworCisgIHN0cnVjdCBfU3FydAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgICB7IHJldHVybiBzcXJ0KF9fdCk7IH0KKyAgfTsKKworICAvLyBJbiB0aGUgcGFzdCwgd2UgdXNlZCB0byB0YWlsb3Igb3BlcmF0b3IgYXBwbGljYXRpb25zIHNlbWFudGljcworICAvLyB0byB0aGUgc3BlY2lhbGl6YXRpb24gb2Ygc3RhbmRhcmQgZnVuY3Rpb24gb2JqZWN0cyAoaS5lLiBwbHVzPD4sIGV0Yy4pCisgIC8vIFRoYXQgaXMgaW5jb3JyZWN0LiAgVGhlcmVmb3JlIHdlIHByb3ZpZGUgb3VyIG93biBzdXJyb2dhdGVzLgorCisgIHN0cnVjdCBfX3VuYXJ5X3BsdXMKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX190KSBjb25zdAorICAgICAgeyByZXR1cm4gK19fdDsgfQorICB9OworCisgIHN0cnVjdCBfX25lZ2F0ZQorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgICB7IHJldHVybiAtX190OyB9CisgIH07CisKKyAgc3RydWN0IF9fYml0d2lzZV9ub3QKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX190KSBjb25zdAorICAgICAgeyByZXR1cm4gfl9fdDsgfQorICB9OworCisgIHN0cnVjdCBfX3BsdXMKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCArIF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX21pbnVzCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggLSBfX3k7IH0KKyAgfTsKKworICBzdHJ1Y3QgX19tdWx0aXBsaWVzCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggKiBfX3k7IH0KKyAgfTsKKworICBzdHJ1Y3QgX19kaXZpZGVzCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggLyBfX3k7IH0KKyAgfTsKKworICBzdHJ1Y3QgX19tb2R1bHVzCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggJSBfX3k7IH0KKyAgfTsKKworICBzdHJ1Y3QgX19iaXR3aXNlX3hvcgorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194IF4gX195OyB9CisgIH07CisKKyAgc3RydWN0IF9fYml0d2lzZV9hbmQKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCAmIF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX2JpdHdpc2Vfb3IKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCB8IF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX3NoaWZ0X2xlZnQKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCA8PCBfX3k7IH0KKyAgfTsKKworICBzdHJ1Y3QgX19zaGlmdF9yaWdodAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194ID4+IF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX2xvZ2ljYWxfYW5kCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194ICYmIF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX2xvZ2ljYWxfb3IKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggfHwgX195OyB9CisgIH07CisKKyAgc3RydWN0IF9fbG9naWNhbF9ub3QKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICFfX3g7IH0KKyAgfTsKKworICBzdHJ1Y3QgX19lcXVhbF90bworICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCA9PSBfX3k7IH0KKyAgfTsKKworICBzdHJ1Y3QgX19ub3RfZXF1YWxfdG8KKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggIT0gX195OyB9CisgIH07CisKKyAgc3RydWN0IF9fbGVzcworICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCA8IF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX2dyZWF0ZXIKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggPiBfX3k7IH0KKyAgfTsKKworICBzdHJ1Y3QgX19sZXNzX2VxdWFsCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194IDw9IF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX2dyZWF0ZXJfZXF1YWwKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggPj0gX195OyB9CisgIH07CisKKyAgLy8gVGhlIGZldyBiaW5hcnkgZnVuY3Rpb25zIHdlIG1pc3MuCisgIHN0cnVjdCBfQXRhbjIKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGF0YW4yKF9feCwgX195KTsgfQorICB9OworCisgIHN0cnVjdCBfUG93CisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBwb3coX194LCBfX3kpOyB9CisgIH07CisKKworICAvLyBXZSBuZWVkIHRoZXNlIGJpdHMgaW4gb3JkZXIgdG8gcmVjb3ZlciB0aGUgcmV0dXJuIHR5cGUgb2YKKyAgLy8gc29tZSBmdW5jdGlvbnMvb3BlcmF0b3JzIG5vdyB0aGF0IHdlJ3JlIG5vIGxvbmdlciB1c2luZworICAvLyBmdW5jdGlvbiB0ZW1wbGF0ZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fZnVuCisgICAgeworICAgICAgdHlwZWRlZiBfVHAgcmVzdWx0X3R5cGU7CisgICAgfTsKKworICAvLyBzZXZlcmFsIHNwZWNpYWxpemF0aW9ucyBmb3IgcmVsYXRpb25hbCBvcGVyYXRvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19mdW48X19sb2dpY2FsX25vdCwgX1RwPgorICAgIHsKKyAgICAgIHR5cGVkZWYgYm9vbCByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19mdW48X19sb2dpY2FsX2FuZCwgX1RwPgorICAgIHsKKyAgICAgIHR5cGVkZWYgYm9vbCByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19mdW48X19sb2dpY2FsX29yLCBfVHA+CisgICAgeworICAgICAgdHlwZWRlZiBib29sIHJlc3VsdF90eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2Z1bjxfX2xlc3MsIF9UcD4KKyAgICB7CisgICAgICB0eXBlZGVmIGJvb2wgcmVzdWx0X3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fZnVuPF9fZ3JlYXRlciwgX1RwPgorICAgIHsKKyAgICAgIHR5cGVkZWYgYm9vbCByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19mdW48X19sZXNzX2VxdWFsLCBfVHA+CisgICAgeworICAgICAgdHlwZWRlZiBib29sIHJlc3VsdF90eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2Z1bjxfX2dyZWF0ZXJfZXF1YWwsIF9UcD4KKyAgICB7CisgICAgICB0eXBlZGVmIGJvb2wgcmVzdWx0X3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fZnVuPF9fZXF1YWxfdG8sIF9UcD4KKyAgICB7CisgICAgICB0eXBlZGVmIGJvb2wgcmVzdWx0X3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fZnVuPF9fbm90X2VxdWFsX3RvLCBfVHA+CisgICAgeworICAgICAgdHlwZWRlZiBib29sIHJlc3VsdF90eXBlOworICAgIH07CisKKyAgLy8KKyAgLy8gQXBwbHkgZnVuY3Rpb24gdGFraW5nIGEgdmFsdWUvY29uc3QgcmVmZXJlbmNlIGNsb3N1cmUKKyAgLy8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRG9tLCB0eXBlbmFtZSBfQXJnPgorICAgIGNsYXNzIF9GdW5CYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICBfRnVuQmFzZShjb25zdCBfRG9tJiBfX2UsIHZhbHVlX3R5cGUgX19mKF9BcmcpKQorICAgICAgOiBfTV9leHByKF9fZSksIF9NX2Z1bmMoX19mKSB7fQorCisgICAgICB2YWx1ZV90eXBlIG9wZXJhdG9yW10oc2l6ZV90IF9faSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2Z1bmMgKF9NX2V4cHJbX19pXSk7IH0KKworICAgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9leHByLnNpemUgKCk7fQorCisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IF9Eb20mIF9NX2V4cHI7CisgICAgICB2YWx1ZV90eXBlICgqX01fZnVuYykoX0FyZyk7CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgIHN0cnVjdCBfVmFsRnVuQ2xvczxfRXhwcixfRG9tPiA6IF9GdW5CYXNlPF9Eb20sIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+CisgICAgeworICAgICAgdHlwZWRlZiBfRnVuQmFzZTxfRG9tLCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdmFsdWVfdHlwZSBfVHA7CisKKyAgICAgIF9WYWxGdW5DbG9zKGNvbnN0IF9Eb20mIF9fZSwgX1RwIF9fZihfVHApKSA6IF9CYXNlKF9fZSwgX19mKSB7fQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfVmFsRnVuQ2xvczxfVmFsQXJyYXksX1RwPiA6IF9GdW5CYXNlPHZhbGFycmF5PF9UcD4sIF9UcD4KKyAgICB7CisgICAgICB0eXBlZGVmIF9GdW5CYXNlPHZhbGFycmF5PF9UcD4sIF9UcD4gX0Jhc2U7CisgICAgICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworCisgICAgICBfVmFsRnVuQ2xvcyhjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YsIF9UcCBfX2YoX1RwKSkgOiBfQmFzZShfX3YsIF9fZikge30KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgc3RydWN0IF9SZWZGdW5DbG9zPF9FeHByLCBfRG9tPgorICAgIDogX0Z1bkJhc2U8X0RvbSwgY29uc3QgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSY+CisgICAgeworICAgICAgdHlwZWRlZiBfRnVuQmFzZTxfRG9tLCBjb25zdCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlJj4gX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUgX1RwOworCisgICAgICBfUmVmRnVuQ2xvcyhjb25zdCBfRG9tJiBfX2UsIF9UcCBfX2YoY29uc3QgX1RwJikpCisgICAgICA6IF9CYXNlKF9fZSwgX19mKSB7fQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfUmVmRnVuQ2xvczxfVmFsQXJyYXksIF9UcD4KKyAgICA6IF9GdW5CYXNlPHZhbGFycmF5PF9UcD4sIGNvbnN0IF9UcCY+CisgICAgeworICAgICAgdHlwZWRlZiBfRnVuQmFzZTx2YWxhcnJheTxfVHA+LCBjb25zdCBfVHAmPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisKKyAgICAgIF9SZWZGdW5DbG9zKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdiwgX1RwIF9fZihjb25zdCBfVHAmKSkKKyAgICAgIDogX0Jhc2UoX192LCBfX2YpIHt9CisgICAgfTsKKworICAvLworICAvLyBVbmFyeSBleHByZXNzaW9uIGNsb3N1cmUuCisgIC8vCisKKyAgdGVtcGxhdGU8Y2xhc3MgX09wZXIsIGNsYXNzIF9Bcmc+CisgICAgY2xhc3MgX1VuQmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Bcmc6OnZhbHVlX3R5cGUgX1Z0OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Z1bjxfT3BlciwgX1Z0Pjo6cmVzdWx0X3R5cGUgdmFsdWVfdHlwZTsKKworICAgICAgX1VuQmFzZShjb25zdCBfQXJnJiBfX2UpIDogX01fZXhwcihfX2UpIHt9CisKKyAgICAgIHZhbHVlX3R5cGUgb3BlcmF0b3JbXShzaXplX3QgX19pKSBjb25zdAorICAgICAgeyByZXR1cm4gX09wZXIoKShfTV9leHByW19faV0pOyB9CisKKyAgICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gX01fZXhwci5zaXplKCk7IH0KKyAgICAgIAorICAgIHByaXZhdGU6CisgICAgICBjb25zdCBfQXJnJiBfTV9leHByOworICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX09wZXIsIGNsYXNzIF9Eb20+CisgICAgc3RydWN0IF9VbkNsb3M8X09wZXIsIF9FeHByLCBfRG9tPgorICAgIDogX1VuQmFzZTxfT3BlciwgX0RvbT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9Eb20gX0FyZzsKKyAgICAgIHR5cGVkZWYgX1VuQmFzZTxfT3BlciwgX0RvbT4gX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIF9VbkNsb3MoY29uc3QgX0FyZyYgX19lKSA6IF9CYXNlKF9fZSkge30KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9PcGVyLCB0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9VbkNsb3M8X09wZXIsIF9WYWxBcnJheSwgX1RwPgorICAgIDogX1VuQmFzZTxfT3BlciwgdmFsYXJyYXk8X1RwPiA+CisgICAgeworICAgICAgdHlwZWRlZiB2YWxhcnJheTxfVHA+IF9Bcmc7CisgICAgICB0eXBlZGVmIF9VbkJhc2U8X09wZXIsIHZhbGFycmF5PF9UcD4gPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKworICAgICAgX1VuQ2xvcyhjb25zdCBfQXJnJiBfX2UpIDogX0Jhc2UoX19lKSB7fQorICAgIH07CisKKworICAvLworICAvLyBCaW5hcnkgZXhwcmVzc2lvbiBjbG9zdXJlLgorICAvLworCisgIHRlbXBsYXRlPGNsYXNzIF9PcGVyLCBjbGFzcyBfRmlyc3RBcmcsIGNsYXNzIF9TZWNvbmRBcmc+CisgICAgY2xhc3MgX0JpbkJhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRmlyc3RBcmc6OnZhbHVlX3R5cGUgX1Z0OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Z1bjxfT3BlciwgX1Z0Pjo6cmVzdWx0X3R5cGUgdmFsdWVfdHlwZTsKKworICAgICAgX0JpbkJhc2UoY29uc3QgX0ZpcnN0QXJnJiBfX2UxLCBjb25zdCBfU2Vjb25kQXJnJiBfX2UyKQorICAgICAgOiBfTV9leHByMShfX2UxKSwgX01fZXhwcjIoX19lMikge30KKworICAgICAgdmFsdWVfdHlwZSBvcGVyYXRvcltdKHNpemVfdCBfX2kpIGNvbnN0CisgICAgICB7IHJldHVybiBfT3BlcigpKF9NX2V4cHIxW19faV0sIF9NX2V4cHIyW19faV0pOyB9CisKKyAgICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gX01fZXhwcjEuc2l6ZSgpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgY29uc3QgX0ZpcnN0QXJnJiBfTV9leHByMTsKKyAgICAgIGNvbnN0IF9TZWNvbmRBcmcmIF9NX2V4cHIyOworICAgIH07CisKKworICB0ZW1wbGF0ZTxjbGFzcyBfT3BlciwgY2xhc3MgX0Nsb3M+CisgICAgY2xhc3MgX0JpbkJhc2UyCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Nsb3M6OnZhbHVlX3R5cGUgX1Z0OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Z1bjxfT3BlciwgX1Z0Pjo6cmVzdWx0X3R5cGUgdmFsdWVfdHlwZTsKKworICAgICAgX0JpbkJhc2UyKGNvbnN0IF9DbG9zJiBfX2UsIGNvbnN0IF9WdCYgX190KQorICAgICAgOiBfTV9leHByMShfX2UpLCBfTV9leHByMihfX3QpIHt9CisKKyAgICAgIHZhbHVlX3R5cGUgb3BlcmF0b3JbXShzaXplX3QgX19pKSBjb25zdAorICAgICAgeyByZXR1cm4gX09wZXIoKShfTV9leHByMVtfX2ldLCBfTV9leHByMik7IH0KKworICAgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9leHByMS5zaXplKCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBjb25zdCBfQ2xvcyYgX01fZXhwcjE7CisgICAgICBjb25zdCBfVnQmIF9NX2V4cHIyOworICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX09wZXIsIGNsYXNzIF9DbG9zPgorICAgIGNsYXNzIF9CaW5CYXNlMQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DbG9zOjp2YWx1ZV90eXBlIF9WdDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19mdW48X09wZXIsIF9WdD46OnJlc3VsdF90eXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIF9CaW5CYXNlMShjb25zdCBfVnQmIF9fdCwgY29uc3QgX0Nsb3MmIF9fZSkKKyAgICAgIDogX01fZXhwcjEoX190KSwgX01fZXhwcjIoX19lKSB7fQorCisgICAgICB2YWx1ZV90eXBlIG9wZXJhdG9yW10oc2l6ZV90IF9faSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9PcGVyKCkoX01fZXhwcjEsIF9NX2V4cHIyW19faV0pOyB9CisKKyAgICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gX01fZXhwcjIuc2l6ZSgpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgY29uc3QgX1Z0JiBfTV9leHByMTsKKyAgICAgIGNvbnN0IF9DbG9zJiBfTV9leHByMjsKKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9PcGVyLCBjbGFzcyBfRG9tMSwgY2xhc3MgX0RvbTI+CisgICAgc3RydWN0IF9CaW5DbG9zPF9PcGVyLCBfRXhwciwgX0V4cHIsIF9Eb20xLCBfRG9tMj4KKyAgICA6IF9CaW5CYXNlPF9PcGVyLCBfRG9tMSwgX0RvbTI+CisgICAgeworICAgICAgdHlwZWRlZiBfQmluQmFzZTxfT3BlciwgX0RvbTEsIF9Eb20yPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKworICAgICAgX0JpbkNsb3MoY29uc3QgX0RvbTEmIF9fZTEsIGNvbnN0IF9Eb20yJiBfX2UyKSA6IF9CYXNlKF9fZTEsIF9fZTIpIHt9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfT3BlciwgdHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfQmluQ2xvczxfT3BlcixfVmFsQXJyYXksIF9WYWxBcnJheSwgX1RwLCBfVHA+CisgICAgOiBfQmluQmFzZTxfT3BlciwgdmFsYXJyYXk8X1RwPiwgdmFsYXJyYXk8X1RwPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfQmluQmFzZTxfT3BlciwgdmFsYXJyYXk8X1RwPiwgdmFsYXJyYXk8X1RwPiA+IF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICBfQmluQ2xvcyhjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdykKKyAgICAgIDogX0Jhc2UoX192LCBfX3cpIHt9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfT3BlciwgY2xhc3MgX0RvbT4KKyAgICBzdHJ1Y3QgX0JpbkNsb3M8X09wZXIsIF9FeHByLCBfVmFsQXJyYXksIF9Eb20sIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+CisgICAgOiBfQmluQmFzZTxfT3BlciwgX0RvbSwgdmFsYXJyYXk8dHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSBfVHA7CisgICAgICB0eXBlZGVmIF9CaW5CYXNlPF9PcGVyLF9Eb20sdmFsYXJyYXk8X1RwPiA+IF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICBfQmluQ2xvcyhjb25zdCBfRG9tJiBfX2UxLCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX2UyKQorICAgICAgOiBfQmFzZShfX2UxLCBfX2UyKSB7fQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX09wZXIsIGNsYXNzIF9Eb20+CisgICAgc3RydWN0IF9CaW5DbG9zPF9PcGVyLCBfVmFsQXJyYXksIF9FeHByLCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlLCBfRG9tPgorICAgIDogX0JpbkJhc2U8X09wZXIsIHZhbGFycmF5PHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+LF9Eb20+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIF9UcDsKKyAgICAgIHR5cGVkZWYgX0JpbkJhc2U8X09wZXIsIHZhbGFycmF5PF9UcD4sIF9Eb20+IF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICBfQmluQ2xvcyhjb25zdCB2YWxhcnJheTxfVHA+JiBfX2UxLCBjb25zdCBfRG9tJiBfX2UyKQorICAgICAgOiBfQmFzZShfX2UxLCBfX2UyKSB7fQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX09wZXIsIGNsYXNzIF9Eb20+CisgICAgc3RydWN0IF9CaW5DbG9zPF9PcGVyLCBfRXhwciwgX0NvbnN0YW50LCBfRG9tLCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPgorICAgIDogX0JpbkJhc2UyPF9PcGVyLCBfRG9tPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSBfVHA7CisgICAgICB0eXBlZGVmIF9CaW5CYXNlMjxfT3BlcixfRG9tPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKworICAgICAgX0JpbkNsb3MoY29uc3QgX0RvbSYgX19lMSwgY29uc3QgX1RwJiBfX2UyKSA6IF9CYXNlKF9fZTEsIF9fZTIpIHt9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfT3BlciwgY2xhc3MgX0RvbT4KKyAgICBzdHJ1Y3QgX0JpbkNsb3M8X09wZXIsIF9Db25zdGFudCwgX0V4cHIsIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUsIF9Eb20+CisgICAgOiBfQmluQmFzZTE8X09wZXIsIF9Eb20+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIF9UcDsKKyAgICAgIHR5cGVkZWYgX0JpbkJhc2UxPF9PcGVyLCBfRG9tPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKworICAgICAgX0JpbkNsb3MoY29uc3QgX1RwJiBfX2UxLCBjb25zdCBfRG9tJiBfX2UyKSA6IF9CYXNlKF9fZTEsIF9fZTIpIHt9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfT3BlciwgdHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfQmluQ2xvczxfT3BlciwgX1ZhbEFycmF5LCBfQ29uc3RhbnQsIF9UcCwgX1RwPgorICAgIDogX0JpbkJhc2UyPF9PcGVyLCB2YWxhcnJheTxfVHA+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9CaW5CYXNlMjxfT3Blcix2YWxhcnJheTxfVHA+ID4gX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIF9CaW5DbG9zKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdiwgY29uc3QgX1RwJiBfX3QpIDogX0Jhc2UoX192LCBfX3QpIHt9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfT3BlciwgdHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfQmluQ2xvczxfT3BlciwgX0NvbnN0YW50LCBfVmFsQXJyYXksIF9UcCwgX1RwPgorICAgIDogX0JpbkJhc2UxPF9PcGVyLCB2YWxhcnJheTxfVHA+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9CaW5CYXNlMTxfT3BlciwgdmFsYXJyYXk8X1RwPiA+IF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICBfQmluQ2xvcyhjb25zdCBfVHAmIF9fdCwgY29uc3QgdmFsYXJyYXk8X1RwPiYgX192KSA6IF9CYXNlKF9fdCwgX192KSB7fQorICAgIH07CisKKyAgICAvLworICAgIC8vIHNsaWNlX2FycmF5IGNsb3N1cmUuCisgICAgLy8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0RvbT4gCisgICAgY2xhc3MgX1NCYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgCisgICAgICBfU0Jhc2UgKGNvbnN0IF9Eb20mIF9fZSwgY29uc3Qgc2xpY2UmIF9fcykKKyAgICAgIDogX01fZXhwciAoX19lKSwgX01fc2xpY2UgKF9fcykge30KKyAgICAgICAgCisgICAgICB2YWx1ZV90eXBlCisgICAgICBvcGVyYXRvcltdIChzaXplX3QgX19pKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZXhwcltfTV9zbGljZS5zdGFydCAoKSArIF9faSAqIF9NX3NsaWNlLnN0cmlkZSAoKV07IH0KKyAgICAgICAgCisgICAgICBzaXplX3QKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fc2xpY2Uuc2l6ZSAoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IF9Eb20mIF9NX2V4cHI7CisgICAgICBjb25zdCBzbGljZSYgX01fc2xpY2U7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgX1NCYXNlPF9BcnJheTxfVHA+ID4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKyAgICAgIAorICAgICAgX1NCYXNlIChfQXJyYXk8X1RwPiBfX2EsIGNvbnN0IHNsaWNlJiBfX3MpCisgICAgICA6IF9NX2FycmF5IChfX2EuX01fZGF0YStfX3Muc3RhcnQoKSksIF9NX3NpemUgKF9fcy5zaXplKCkpLAorCV9NX3N0cmlkZSAoX19zLnN0cmlkZSgpKSB7fQorICAgICAgICAKKyAgICAgIHZhbHVlX3R5cGUKKyAgICAgIG9wZXJhdG9yW10gKHNpemVfdCBfX2kpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9hcnJheS5fTV9kYXRhW19faSAqIF9NX3N0cmlkZV07IH0KKyAgICAgIAorICAgICAgc2l6ZV90CisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3NpemU7IH0KKworICAgIHByaXZhdGU6CisgICAgICBjb25zdCBfQXJyYXk8X1RwPiBfTV9hcnJheTsKKyAgICAgIGNvbnN0IHNpemVfdCBfTV9zaXplOworICAgICAgY29uc3Qgc2l6ZV90IF9NX3N0cmlkZTsKKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgc3RydWN0IF9TQ2xvczxfRXhwciwgX0RvbT4KKyAgICA6IF9TQmFzZTxfRG9tPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1NCYXNlPF9Eb20+IF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgCisgICAgICBfU0Nsb3MgKGNvbnN0IF9Eb20mIF9fZSwgY29uc3Qgc2xpY2UmIF9fcykgOiBfQmFzZSAoX19lLCBfX3MpIHt9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9TQ2xvczxfVmFsQXJyYXksIF9UcD4KKyAgICA6IF9TQmFzZTxfQXJyYXk8X1RwPiA+CisgICAgeworICAgICAgdHlwZWRlZiAgX1NCYXNlPF9BcnJheTxfVHA+ID4gX0Jhc2U7CisgICAgICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICAgICAgCisgICAgICBfU0Nsb3MgKF9BcnJheTxfVHA+IF9fYSwgY29uc3Qgc2xpY2UmIF9fcykgOiBfQmFzZSAoX19hLCBfX3MpIHt9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0NQUF9WQUxBUlJBWV9CRUZPUkVfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3ZlY3Rvci50Y2MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHMvdmVjdG9yLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODgyZmU2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9iaXRzL3ZlY3Rvci50Y2MKQEAgLTAsMCArMSw4NTggQEAKKy8vIFZlY3RvciBpbXBsZW1lbnRhdGlvbiAob3V0IG9mIGxpbmUpIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyAgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvdmVjdG9yLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3ZlY3Rvcn0KKyAqLworCisjaWZuZGVmIF9WRUNUT1JfVENDCisjZGVmaW5lIF9WRUNUT1JfVENDIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgIHJlc2VydmUoc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBpZiAoX19uID4gdGhpcy0+bWF4X3NpemUoKSkKKwlfX3Rocm93X2xlbmd0aF9lcnJvcihfX04oInZlY3Rvcjo6cmVzZXJ2ZSIpKTsKKyAgICAgIGlmICh0aGlzLT5jYXBhY2l0eSgpIDwgX19uKQorCXsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX29sZF9zaXplID0gc2l6ZSgpOworCSAgcG9pbnRlciBfX3RtcCA9IF9NX2FsbG9jYXRlX2FuZF9jb3B5KF9fbiwKKwkgICAgX0dMSUJDWFhfTUFLRV9NT1ZFX0lGX05PRVhDRVBUX0lURVJBVE9SKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpLAorCSAgICBfR0xJQkNYWF9NQUtFX01PVkVfSUZfTk9FWENFUFRfSVRFUkFUT1IodGhpcy0+X01faW1wbC5fTV9maW5pc2gpKTsKKwkgIHN0ZDo6X0Rlc3Ryb3kodGhpcy0+X01faW1wbC5fTV9zdGFydCwgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQlfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgX01fZGVhbGxvY2F0ZSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZQorCQkJLSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX3RtcDsKKwkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gX190bXAgKyBfX29sZF9zaXplOworCSAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX247CisJfQorICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICB2b2lkCisgICAgICB2ZWN0b3I8X1RwLCBfQWxsb2M+OjoKKyAgICAgIGVtcGxhY2VfYmFjayhfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIHsKKwlpZiAodGhpcy0+X01faW1wbC5fTV9maW5pc2ggIT0gdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSkKKwkgIHsKKwkgICAgX0FsbG9jX3RyYWl0czo6Y29uc3RydWN0KHRoaXMtPl9NX2ltcGwsIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCSAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgICAgKyt0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsKKwkgIH0KKwllbHNlCisJICBfTV9lbXBsYWNlX2JhY2tfYXV4KHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSB2ZWN0b3I8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IF9fcG9zaXRpb24gLSBiZWdpbigpOworICAgICAgaWYgKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICE9IHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UKKwkgICYmIF9fcG9zaXRpb24gPT0gZW5kKCkpCisJeworCSAgX0FsbG9jX3RyYWl0czo6Y29uc3RydWN0KHRoaXMtPl9NX2ltcGwsIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLCBfX3gpOworCSAgKyt0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsKKwl9CisgICAgICBlbHNlCisJeworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKwkgIGlmICh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCAhPSB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlKQorCSAgICB7CisJICAgICAgX1RwIF9feF9jb3B5ID0gX194OworCSAgICAgIF9NX2luc2VydF9hdXgoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feF9jb3B5KSk7CisJICAgIH0KKwkgIGVsc2UKKyNlbmRpZgorCSAgICBfTV9pbnNlcnRfYXV4KF9fcG9zaXRpb24sIF9feCk7CisJfQorICAgICAgcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX24pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSB2ZWN0b3I8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgeworICAgICAgaWYgKF9fcG9zaXRpb24gKyAxICE9IGVuZCgpKQorCV9HTElCQ1hYX01PVkUzKF9fcG9zaXRpb24gKyAxLCBlbmQoKSwgX19wb3NpdGlvbik7CisgICAgICAtLXRoaXMtPl9NX2ltcGwuX01fZmluaXNoOworICAgICAgX0FsbG9jX3RyYWl0czo6ZGVzdHJveSh0aGlzLT5fTV9pbXBsLCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCk7CisgICAgICByZXR1cm4gX19wb3NpdGlvbjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgdmVjdG9yPF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICB2ZWN0b3I8X1RwLCBfQWxsb2M+OjoKKyAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgIGlmIChfX2xhc3QgIT0gZW5kKCkpCisJICAgIF9HTElCQ1hYX01PVkUzKF9fbGFzdCwgZW5kKCksIF9fZmlyc3QpOworCSAgX01fZXJhc2VfYXRfZW5kKF9fZmlyc3QuYmFzZSgpICsgKGVuZCgpIC0gX19sYXN0KSk7CisJfQorICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZlY3RvcjxfVHAsIF9BbGxvYz4mCisgICAgdmVjdG9yPF9UcCwgX0FsbG9jPjo6CisgICAgb3BlcmF0b3I9KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCkKKyAgICB7CisgICAgICBpZiAoJl9feCAhPSB0aGlzKQorCXsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisJICBpZiAoX0FsbG9jX3RyYWl0czo6X1NfcHJvcGFnYXRlX29uX2NvcHlfYXNzaWduKCkpCisJICAgIHsKKwkgICAgICBpZiAoIV9BbGxvY190cmFpdHM6Ol9TX2Fsd2F5c19lcXVhbCgpCisJICAgICAgICAgICYmIF9NX2dldF9UcF9hbGxvY2F0b3IoKSAhPSBfX3guX01fZ2V0X1RwX2FsbG9jYXRvcigpKQorCSAgICAgICAgeworCQkgIC8vIHJlcGxhY2VtZW50IGFsbG9jYXRvciBjYW5ub3QgZnJlZSBleGlzdGluZyBzdG9yYWdlCisJCSAgdGhpcy0+Y2xlYXIoKTsKKwkJICBfTV9kZWFsbG9jYXRlKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsCisJCQkJdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZQorCQkJCS0gdGhpcy0+X01faW1wbC5fTV9zdGFydCk7CisJCSAgdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IG51bGxwdHI7CisJCSAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBudWxscHRyOworCQkgIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgPSBudWxscHRyOworCQl9CisJICAgICAgc3RkOjpfX2FsbG9jX29uX2NvcHkoX01fZ2V0X1RwX2FsbG9jYXRvcigpLAorCQkJCSAgIF9feC5fTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICB9CisjZW5kaWYKKwkgIGNvbnN0IHNpemVfdHlwZSBfX3hsZW4gPSBfX3guc2l6ZSgpOworCSAgaWYgKF9feGxlbiA+IGNhcGFjaXR5KCkpCisJICAgIHsKKwkgICAgICBwb2ludGVyIF9fdG1wID0gX01fYWxsb2NhdGVfYW5kX2NvcHkoX194bGVuLCBfX3guYmVnaW4oKSwKKwkJCQkJCSAgIF9feC5lbmQoKSk7CisJICAgICAgc3RkOjpfRGVzdHJveSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCSAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICAgIF9NX2RlYWxsb2NhdGUodGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCSAgICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJCQkgICAgLSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsKKwkgICAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gX190bXA7CisJICAgICAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX3hsZW47CisJICAgIH0KKwkgIGVsc2UgaWYgKHNpemUoKSA+PSBfX3hsZW4pCisJICAgIHsKKwkgICAgICBzdGQ6Ol9EZXN0cm95KHN0ZDo6Y29weShfX3guYmVnaW4oKSwgX194LmVuZCgpLCBiZWdpbigpKSwKKwkJCSAgICBlbmQoKSwgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgc3RkOjpjb3B5KF9feC5fTV9pbXBsLl9NX3N0YXJ0LCBfX3guX01faW1wbC5fTV9zdGFydCArIHNpemUoKSwKKwkJCXRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOworCSAgICAgIHN0ZDo6X191bmluaXRpYWxpemVkX2NvcHlfYShfX3guX01faW1wbC5fTV9zdGFydCArIHNpemUoKSwKKwkJCQkJICBfX3guX01faW1wbC5fTV9maW5pc2gsCisJCQkJCSAgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCSAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkgICAgfQorCSAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgX194bGVuOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgIF9NX2ZpbGxfYXNzaWduKHNpemVfdCBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsKQorICAgIHsKKyAgICAgIGlmIChfX24gPiBjYXBhY2l0eSgpKQorCXsKKwkgIHZlY3RvciBfX3RtcChfX24sIF9fdmFsLCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgX190bXAuc3dhcCgqdGhpcyk7CisJfQorICAgICAgZWxzZSBpZiAoX19uID4gc2l6ZSgpKQorCXsKKwkgIHN0ZDo6ZmlsbChiZWdpbigpLCBlbmQoKSwgX192YWwpOworCSAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uX2EodGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCV9fbiAtIHNpemUoKSwgX192YWwsCisJCQkJCV9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCArPSBfX24gLSBzaXplKCk7CisJfQorICAgICAgZWxzZQorICAgICAgICBfTV9lcmFzZV9hdF9lbmQoc3RkOjpmaWxsX24odGhpcy0+X01faW1wbC5fTV9zdGFydCwgX19uLCBfX3ZhbCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgICAgX01fYXNzaWduX2F1eChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKwlwb2ludGVyIF9fY3VyKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOworCWZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdCAmJiBfX2N1ciAhPSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsKKwkgICAgICsrX19jdXIsICsrX19maXJzdCkKKwkgICpfX2N1ciA9ICpfX2ZpcnN0OworCWlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwkgIF9NX2VyYXNlX2F0X2VuZChfX2N1cik7CisJZWxzZQorCSAgaW5zZXJ0KGVuZCgpLCBfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICB2ZWN0b3I8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX2Fzc2lnbl9hdXgoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgICB7CisJY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworCisJaWYgKF9fbGVuID4gY2FwYWNpdHkoKSkKKwkgIHsKKwkgICAgcG9pbnRlciBfX3RtcChfTV9hbGxvY2F0ZV9hbmRfY29weShfX2xlbiwgX19maXJzdCwgX19sYXN0KSk7CisJICAgIHN0ZDo6X0Rlc3Ryb3kodGhpcy0+X01faW1wbC5fTV9zdGFydCwgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICAgIF9NX2RlYWxsb2NhdGUodGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCSAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZQorCQkJICAtIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOworCSAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gX190bXA7CisJICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gdGhpcy0+X01faW1wbC5fTV9zdGFydCArIF9fbGVuOworCSAgICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlID0gdGhpcy0+X01faW1wbC5fTV9maW5pc2g7CisJICB9CisJZWxzZSBpZiAoc2l6ZSgpID49IF9fbGVuKQorCSAgX01fZXJhc2VfYXRfZW5kKHN0ZDo6Y29weShfX2ZpcnN0LCBfX2xhc3QsIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpKTsKKwllbHNlCisJICB7CisJICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0OworCSAgICBzdGQ6OmFkdmFuY2UoX19taWQsIHNpemUoKSk7CisJICAgIHN0ZDo6Y29weShfX2ZpcnN0LCBfX21pZCwgdGhpcy0+X01faW1wbC5fTV9zdGFydCk7CisJICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0KKwkgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5X2EoX19taWQsIF9fbGFzdCwKKwkJCQkJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgfQorICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHR5cGVuYW1lIHZlY3RvcjxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgICB2ZWN0b3I8X1RwLCBfQWxsb2M+OjoKKyAgICAgIGVtcGxhY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICB7CisJY29uc3Qgc2l6ZV90eXBlIF9fbiA9IF9fcG9zaXRpb24gLSBiZWdpbigpOworCWlmICh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCAhPSB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJICAgICYmIF9fcG9zaXRpb24gPT0gZW5kKCkpCisJICB7CisJICAgIF9BbGxvY190cmFpdHM6OmNvbnN0cnVjdCh0aGlzLT5fTV9pbXBsLCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICAgICsrdGhpcy0+X01faW1wbC5fTV9maW5pc2g7CisJICB9CisJZWxzZQorCSAgX01faW5zZXJ0X2F1eChfX3Bvc2l0aW9uLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCXJldHVybiBpdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgX19uKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHZvaWQKKyAgICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgICAgX01faW5zZXJ0X2F1eChpdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJncyYmLi4uIF9fYXJncykKKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICB2ZWN0b3I8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IF9UcCYgX194KQorI2VuZGlmCisgICAgeworICAgICAgaWYgKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICE9IHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UpCisJeworCSAgX0FsbG9jX3RyYWl0czo6Y29uc3RydWN0KHRoaXMtPl9NX2ltcGwsIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJICAgICAgICAgICBfR0xJQkNYWF9NT1ZFKCoodGhpcy0+X01faW1wbC5fTV9maW5pc2gKKwkJCQkgICAgICAgICAgICAgICAgICAgLSAxKSkpOworCSAgKyt0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKwkgIF9UcCBfX3hfY29weSA9IF9feDsKKyNlbmRpZgorCSAgX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoX19wb3NpdGlvbi5iYXNlKCksCisJCQkJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCAtIDIsCisJCQkJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCAtIDEpOworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorCSAgKl9fcG9zaXRpb24gPSBfX3hfY29weTsKKyNlbHNlCisJICAqX19wb3NpdGlvbiA9IF9UcChzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworI2VuZGlmCisJfQorICAgICAgZWxzZQorCXsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9CisJICAgIF9NX2NoZWNrX2xlbihzaXplX3R5cGUoMSksICJ2ZWN0b3I6Ol9NX2luc2VydF9hdXgiKTsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX2VsZW1zX2JlZm9yZSA9IF9fcG9zaXRpb24gLSBiZWdpbigpOworCSAgcG9pbnRlciBfX25ld19zdGFydCh0aGlzLT5fTV9hbGxvY2F0ZShfX2xlbikpOworCSAgcG9pbnRlciBfX25ld19maW5pc2goX19uZXdfc3RhcnQpOworCSAgX190cnkKKwkgICAgeworCSAgICAgIC8vIFRoZSBvcmRlciBvZiB0aGUgdGhyZWUgb3BlcmF0aW9ucyBpcyBkaWN0YXRlZCBieSB0aGUgQysrMHgKKwkgICAgICAvLyBjYXNlLCB3aGVyZSB0aGUgbW92ZXMgY291bGQgYWx0ZXIgYSBuZXcgZWxlbWVudCBiZWxvbmdpbmcKKwkgICAgICAvLyB0byB0aGUgZXhpc3RpbmcgdmVjdG9yLiAgVGhpcyBpcyBhbiBpc3N1ZSBvbmx5IGZvciBjYWxsZXJzCisJICAgICAgLy8gdGFraW5nIHRoZSBlbGVtZW50IGJ5IGNvbnN0IGx2YWx1ZSByZWYgKHNlZSAyMy4xLzEzKS4KKwkgICAgICBfQWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QodGhpcy0+X01faW1wbCwKKwkJICAgICAgICAgICAgICAgICAgICAgICBfX25ld19zdGFydCArIF9fZWxlbXNfYmVmb3JlLAorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKwkJCQkgICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyNlbHNlCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9feCk7CisjZW5kaWYKKwkgICAgICBfX25ld19maW5pc2ggPSAwOworCisJICAgICAgX19uZXdfZmluaXNoCisJCT0gc3RkOjpfX3VuaW5pdGlhbGl6ZWRfbW92ZV9pZl9ub2V4Y2VwdF9hCisJCSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCBfX3Bvc2l0aW9uLmJhc2UoKSwKKwkJIF9fbmV3X3N0YXJ0LCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCisJICAgICAgKytfX25ld19maW5pc2g7CisKKwkgICAgICBfX25ld19maW5pc2gKKwkJPSBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2lmX25vZXhjZXB0X2EKKwkJKF9fcG9zaXRpb24uYmFzZSgpLCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJIF9fbmV3X2ZpbmlzaCwgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkgICAgfQorICAgICAgICAgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgaWYgKCFfX25ld19maW5pc2gpCisJCV9BbGxvY190cmFpdHM6OmRlc3Ryb3kodGhpcy0+X01faW1wbCwKKwkJICAgICAgICAgICAgICAgICAgICAgICBfX25ld19zdGFydCArIF9fZWxlbXNfYmVmb3JlKTsKKwkgICAgICBlbHNlCisJCXN0ZDo6X0Rlc3Ryb3koX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkgICAgICBfTV9kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0LCBfX2xlbik7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIHN0ZDo6X0Rlc3Ryb3kodGhpcy0+X01faW1wbC5fTV9zdGFydCwgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQlfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgX01fZGVhbGxvY2F0ZSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZQorCQkJLSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX25ld19zdGFydDsKKwkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gX19uZXdfZmluaXNoOworCSAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSA9IF9fbmV3X3N0YXJ0ICsgX19sZW47CisJfQorICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICB2b2lkCisgICAgICB2ZWN0b3I8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX2VtcGxhY2VfYmFja19hdXgoX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICB7CisJY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0KKwkgIF9NX2NoZWNrX2xlbihzaXplX3R5cGUoMSksICJ2ZWN0b3I6Ol9NX2VtcGxhY2VfYmFja19hdXgiKTsKKwlwb2ludGVyIF9fbmV3X3N0YXJ0KHRoaXMtPl9NX2FsbG9jYXRlKF9fbGVuKSk7CisJcG9pbnRlciBfX25ld19maW5pc2goX19uZXdfc3RhcnQpOworCV9fdHJ5CisJICB7CisJICAgIF9BbGxvY190cmFpdHM6OmNvbnN0cnVjdCh0aGlzLT5fTV9pbXBsLCBfX25ld19zdGFydCArIHNpemUoKSwKKwkJCQkgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICAgIF9fbmV3X2ZpbmlzaCA9IDA7CisKKwkgICAgX19uZXdfZmluaXNoCisJICAgICAgPSBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2lmX25vZXhjZXB0X2EKKwkgICAgICAodGhpcy0+X01faW1wbC5fTV9zdGFydCwgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJICAgICAgIF9fbmV3X3N0YXJ0LCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCisJICAgICsrX19uZXdfZmluaXNoOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBpZiAoIV9fbmV3X2ZpbmlzaCkKKwkgICAgICBfQWxsb2NfdHJhaXRzOjpkZXN0cm95KHRoaXMtPl9NX2ltcGwsIF9fbmV3X3N0YXJ0ICsgc2l6ZSgpKTsKKwkgICAgZWxzZQorCSAgICAgIHN0ZDo6X0Rlc3Ryb3koX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkgICAgX01fZGVhbGxvY2F0ZShfX25ld19zdGFydCwgX19sZW4pOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKwlzdGQ6Ol9EZXN0cm95KHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkgICAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCV9NX2RlYWxsb2NhdGUodGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJICAgICAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZQorCQkgICAgICAtIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOworCXRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX25ld19zdGFydDsKKwl0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKwl0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlID0gX19uZXdfc3RhcnQgKyBfX2xlbjsKKyAgICAgIH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICB2ZWN0b3I8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9maWxsX2luc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgeworICAgICAgaWYgKF9fbiAhPSAwKQorCXsKKwkgIGlmIChzaXplX3R5cGUodGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZQorCQkJLSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCkgPj0gX19uKQorCSAgICB7CisJICAgICAgdmFsdWVfdHlwZSBfX3hfY29weSA9IF9feDsKKwkgICAgICBjb25zdCBzaXplX3R5cGUgX19lbGVtc19hZnRlciA9IGVuZCgpIC0gX19wb3NpdGlvbjsKKwkgICAgICBwb2ludGVyIF9fb2xkX2ZpbmlzaCh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCk7CisJICAgICAgaWYgKF9fZWxlbXNfYWZ0ZXIgPiBfX24pCisJCXsKKwkJICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2EodGhpcy0+X01faW1wbC5fTV9maW5pc2ggLSBfX24sCisJCQkJCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkgICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJICAgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCArPSBfX247CisJCSAgX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoX19wb3NpdGlvbi5iYXNlKCksCisJCQkJCSAgX19vbGRfZmluaXNoIC0gX19uLCBfX29sZF9maW5pc2gpOworCQkgIHN0ZDo6ZmlsbChfX3Bvc2l0aW9uLmJhc2UoKSwgX19wb3NpdGlvbi5iYXNlKCkgKyBfX24sCisJCQkgICAgX194X2NvcHkpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uX2EodGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCQlfX24gLSBfX2VsZW1zX2FmdGVyLAorCQkJCQkJX194X2NvcHksCisJCQkJCQlfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICs9IF9fbiAtIF9fZWxlbXNfYWZ0ZXI7CisJCSAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfbW92ZV9hKF9fcG9zaXRpb24uYmFzZSgpLCBfX29sZF9maW5pc2gsCisJCQkJCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkgICAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICs9IF9fZWxlbXNfYWZ0ZXI7CisJCSAgc3RkOjpmaWxsKF9fcG9zaXRpb24uYmFzZSgpLCBfX29sZF9maW5pc2gsIF9feF9jb3B5KTsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPQorCQlfTV9jaGVja19sZW4oX19uLCAidmVjdG9yOjpfTV9maWxsX2luc2VydCIpOworCSAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2VsZW1zX2JlZm9yZSA9IF9fcG9zaXRpb24gLSBiZWdpbigpOworCSAgICAgIHBvaW50ZXIgX19uZXdfc3RhcnQodGhpcy0+X01fYWxsb2NhdGUoX19sZW4pKTsKKwkgICAgICBwb2ludGVyIF9fbmV3X2ZpbmlzaChfX25ld19zdGFydCk7CisJICAgICAgX190cnkKKwkJeworCQkgIC8vIFNlZSBfTV9pbnNlcnRfYXV4IGFib3ZlLgorCQkgIHN0ZDo6X191bmluaXRpYWxpemVkX2ZpbGxfbl9hKF9fbmV3X3N0YXJ0ICsgX19lbGVtc19iZWZvcmUsCisJCQkJCQlfX24sIF9feCwKKwkJCQkJCV9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCSAgX19uZXdfZmluaXNoID0gMDsKKworCQkgIF9fbmV3X2ZpbmlzaAorCQkgICAgPSBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2lmX25vZXhjZXB0X2EKKwkJICAgICh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCBfX3Bvc2l0aW9uLmJhc2UoKSwKKwkJICAgICBfX25ld19zdGFydCwgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKworCQkgIF9fbmV3X2ZpbmlzaCArPSBfX247CisKKwkJICBfX25ld19maW5pc2gKKwkJICAgID0gc3RkOjpfX3VuaW5pdGlhbGl6ZWRfbW92ZV9pZl9ub2V4Y2VwdF9hCisJCSAgICAoX19wb3NpdGlvbi5iYXNlKCksIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkgICAgIF9fbmV3X2ZpbmlzaCwgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJfQorCSAgICAgIF9fY2F0Y2goLi4uKQorCQl7CisJCSAgaWYgKCFfX25ld19maW5pc2gpCisJCSAgICBzdGQ6Ol9EZXN0cm95KF9fbmV3X3N0YXJ0ICsgX19lbGVtc19iZWZvcmUsCisJCQkJICBfX25ld19zdGFydCArIF9fZWxlbXNfYmVmb3JlICsgX19uLAorCQkJCSAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICBlbHNlCisJCSAgICBzdGQ6Ol9EZXN0cm95KF9fbmV3X3N0YXJ0LCBfX25ld19maW5pc2gsCisJCQkJICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIF9NX2RlYWxsb2NhdGUoX19uZXdfc3RhcnQsIF9fbGVuKTsKKwkJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkJfQorCSAgICAgIHN0ZDo6X0Rlc3Ryb3kodGhpcy0+X01faW1wbC5fTV9zdGFydCwgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkgICAgICBfTV9kZWFsbG9jYXRlKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsCisJCQkgICAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZQorCQkJICAgIC0gdGhpcy0+X01faW1wbC5fTV9zdGFydCk7CisJICAgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gX19uZXdfZmluaXNoOworCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgPSBfX25ld19zdGFydCArIF9fbGVuOworCSAgICB9CisJfQorICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgIF9NX2RlZmF1bHRfYXBwZW5kKHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgaWYgKF9fbiAhPSAwKQorCXsKKwkgIGlmIChzaXplX3R5cGUodGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZQorCQkJLSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCkgPj0gX19uKQorCSAgICB7CisJICAgICAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9uX2EodGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCSAgICAgICBfX24sIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggKz0gX19uOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPQorCQlfTV9jaGVja19sZW4oX19uLCAidmVjdG9yOjpfTV9kZWZhdWx0X2FwcGVuZCIpOworCSAgICAgIGNvbnN0IHNpemVfdHlwZSBfX29sZF9zaXplID0gdGhpcy0+c2l6ZSgpOworCSAgICAgIHBvaW50ZXIgX19uZXdfc3RhcnQodGhpcy0+X01fYWxsb2NhdGUoX19sZW4pKTsKKwkgICAgICBwb2ludGVyIF9fbmV3X2ZpbmlzaChfX25ld19zdGFydCk7CisJICAgICAgX190cnkKKwkJeworCQkgIF9fbmV3X2ZpbmlzaAorCQkgICAgPSBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2lmX25vZXhjZXB0X2EKKwkJICAgICh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJICAgICBfX25ld19zdGFydCwgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9kZWZhdWx0X25fYShfX25ld19maW5pc2gsIF9fbiwKKwkJCQkJCSAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCSAgX19uZXdfZmluaXNoICs9IF9fbjsKKwkJfQorCSAgICAgIF9fY2F0Y2goLi4uKQorCQl7CisJCSAgc3RkOjpfRGVzdHJveShfX25ld19zdGFydCwgX19uZXdfZmluaXNoLAorCQkJCV9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCSAgX01fZGVhbGxvY2F0ZShfX25ld19zdGFydCwgX19sZW4pOworCQkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCQl9CisJICAgICAgc3RkOjpfRGVzdHJveSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCSAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICAgIF9NX2RlYWxsb2NhdGUodGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCSAgICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJCQkgICAgLSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsKKwkgICAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisJICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisJICAgICAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSA9IF9fbmV3X3N0YXJ0ICsgX19sZW47CisJICAgIH0KKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJvb2wKKyAgICB2ZWN0b3I8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9zaHJpbmtfdG9fZml0KCkKKyAgICB7CisgICAgICBpZiAoY2FwYWNpdHkoKSA9PSBzaXplKCkpCisJcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIHN0ZDo6X19zaHJpbmtfdG9fZml0X2F1eDx2ZWN0b3I+OjpfU19kb19pdCgqdGhpcyk7CisgICAgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICB2ZWN0b3I8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX3JhbmdlX2luc2VydChpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKwkJICAgICAgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKwlmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwkgIHsKKwkgICAgX19wb3MgPSBpbnNlcnQoX19wb3MsICpfX2ZpcnN0KTsKKwkgICAgKytfX3BvczsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgdmVjdG9yPF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9yYW5nZV9pbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorCQkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKwlpZiAoX19maXJzdCAhPSBfX2xhc3QpCisJICB7CisJICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisJICAgIGlmIChzaXplX3R5cGUodGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZQorCQkJICAtIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoKSA+PSBfX24pCisJICAgICAgeworCQljb25zdCBzaXplX3R5cGUgX19lbGVtc19hZnRlciA9IGVuZCgpIC0gX19wb3NpdGlvbjsKKwkJcG9pbnRlciBfX29sZF9maW5pc2godGhpcy0+X01faW1wbC5fTV9maW5pc2gpOworCQlpZiAoX19lbGVtc19hZnRlciA+IF9fbikKKwkJICB7CisJCSAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2EodGhpcy0+X01faW1wbC5fTV9maW5pc2ggLSBfX24sCisJCQkJCQl0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJCXRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkJX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICs9IF9fbjsKKwkJICAgIF9HTElCQ1hYX01PVkVfQkFDS1dBUkQzKF9fcG9zaXRpb24uYmFzZSgpLAorCQkJCQkgICAgX19vbGRfZmluaXNoIC0gX19uLCBfX29sZF9maW5pc2gpOworCQkgICAgc3RkOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3NpdGlvbik7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgX0ZvcndhcmRJdGVyYXRvciBfX21pZCA9IF9fZmlyc3Q7CisJCSAgICBzdGQ6OmFkdmFuY2UoX19taWQsIF9fZWxlbXNfYWZ0ZXIpOworCQkgICAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfY29weV9hKF9fbWlkLCBfX2xhc3QsCisJCQkJCQl0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJCV9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCSAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCArPSBfX24gLSBfX2VsZW1zX2FmdGVyOworCQkgICAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfbW92ZV9hKF9fcG9zaXRpb24uYmFzZSgpLAorCQkJCQkJX19vbGRfZmluaXNoLAorCQkJCQkJdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCQlfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggKz0gX19lbGVtc19hZnRlcjsKKwkJICAgIHN0ZDo6Y29weShfX2ZpcnN0LCBfX21pZCwgX19wb3NpdGlvbik7CisJCSAgfQorCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0KKwkJICBfTV9jaGVja19sZW4oX19uLCAidmVjdG9yOjpfTV9yYW5nZV9pbnNlcnQiKTsKKwkJcG9pbnRlciBfX25ld19zdGFydCh0aGlzLT5fTV9hbGxvY2F0ZShfX2xlbikpOworCQlwb2ludGVyIF9fbmV3X2ZpbmlzaChfX25ld19zdGFydCk7CisJCV9fdHJ5CisJCSAgeworCQkgICAgX19uZXdfZmluaXNoCisJCSAgICAgID0gc3RkOjpfX3VuaW5pdGlhbGl6ZWRfbW92ZV9pZl9ub2V4Y2VwdF9hCisJCSAgICAgICh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCBfX3Bvc2l0aW9uLmJhc2UoKSwKKwkJICAgICAgIF9fbmV3X3N0YXJ0LCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgICAgX19uZXdfZmluaXNoCisJCSAgICAgID0gc3RkOjpfX3VuaW5pdGlhbGl6ZWRfY29weV9hKF9fZmlyc3QsIF9fbGFzdCwKKwkJCQkJCSAgICBfX25ld19maW5pc2gsCisJCQkJCQkgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICAgIF9fbmV3X2ZpbmlzaAorCQkgICAgICA9IHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfaWZfbm9leGNlcHRfYQorCQkgICAgICAoX19wb3NpdGlvbi5iYXNlKCksIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkgICAgICAgX19uZXdfZmluaXNoLCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIH0KKwkJX19jYXRjaCguLi4pCisJCSAgeworCQkgICAgc3RkOjpfRGVzdHJveShfX25ld19zdGFydCwgX19uZXdfZmluaXNoLAorCQkJCSAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICAgIF9NX2RlYWxsb2NhdGUoX19uZXdfc3RhcnQsIF9fbGVuKTsKKwkJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCQkgIH0KKwkJc3RkOjpfRGVzdHJveSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCSAgICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCV9NX2RlYWxsb2NhdGUodGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UKKwkJCSAgICAgIC0gdGhpcy0+X01faW1wbC5fTV9zdGFydCk7CisJCXRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX25ld19zdGFydDsKKwkJdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisJCXRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgPSBfX25ld19zdGFydCArIF9fbGVuOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworCisgIC8vIHZlY3Rvcjxib29sPgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIHZlY3Rvcjxib29sLCBfQWxsb2M+OjoKKyAgICBfTV9yZWFsbG9jYXRlKHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX0JpdF90eXBlKiBfX3EgPSB0aGlzLT5fTV9hbGxvY2F0ZShfX24pOworICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBfTV9jb3B5X2FsaWduZWQoYmVnaW4oKSwgZW5kKCksCisJCQkJCQlpdGVyYXRvcihfX3EsIDApKTsKKyAgICAgIHRoaXMtPl9NX2RlYWxsb2NhdGUoKTsKKyAgICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBpdGVyYXRvcihfX3EsIDApOworICAgICAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSA9IF9fcSArIF9TX253b3JkKF9fbik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgdmVjdG9yPGJvb2wsIF9BbGxvYz46OgorICAgIF9NX2ZpbGxfaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIHNpemVfdHlwZSBfX24sIGJvb2wgX194KQorICAgIHsKKyAgICAgIGlmIChfX24gPT0gMCkKKwlyZXR1cm47CisgICAgICBpZiAoY2FwYWNpdHkoKSAtIHNpemUoKSA+PSBfX24pCisJeworCSAgc3RkOjpjb3B5X2JhY2t3YXJkKF9fcG9zaXRpb24sIGVuZCgpLAorCQkJICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCArIGRpZmZlcmVuY2VfdHlwZShfX24pKTsKKwkgIHN0ZDo6ZmlsbChfX3Bvc2l0aW9uLCBfX3Bvc2l0aW9uICsgZGlmZmVyZW5jZV90eXBlKF9fbiksIF9feCk7CisJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCArPSBkaWZmZXJlbmNlX3R5cGUoX19uKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gCisJICAgIF9NX2NoZWNrX2xlbihfX24sICJ2ZWN0b3I8Ym9vbD46Ol9NX2ZpbGxfaW5zZXJ0Iik7CisJICBfQml0X3R5cGUgKiBfX3EgPSB0aGlzLT5fTV9hbGxvY2F0ZShfX2xlbik7CisJICBpdGVyYXRvciBfX2kgPSBfTV9jb3B5X2FsaWduZWQoYmVnaW4oKSwgX19wb3NpdGlvbiwKKwkJCQkJIGl0ZXJhdG9yKF9fcSwgMCkpOworCSAgc3RkOjpmaWxsKF9faSwgX19pICsgZGlmZmVyZW5jZV90eXBlKF9fbiksIF9feCk7CisJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IHN0ZDo6Y29weShfX3Bvc2l0aW9uLCBlbmQoKSwKKwkJCQkJICAgICAgX19pICsgZGlmZmVyZW5jZV90eXBlKF9fbikpOworCSAgdGhpcy0+X01fZGVhbGxvY2F0ZSgpOworCSAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSA9IF9fcSArIF9TX253b3JkKF9fbGVuKTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBpdGVyYXRvcihfX3EsIDApOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICB2ZWN0b3I8Ym9vbCwgX0FsbG9jPjo6CisgICAgICBfTV9pbnNlcnRfcmFuZ2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCAKKwkJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgICB7CisJaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorCSAgeworCSAgICBzaXplX3R5cGUgX19uID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgICBpZiAoY2FwYWNpdHkoKSAtIHNpemUoKSA+PSBfX24pCisJICAgICAgeworCQlzdGQ6OmNvcHlfYmFja3dhcmQoX19wb3NpdGlvbiwgZW5kKCksCisJCQkJICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2gKKwkJCQkgICArIGRpZmZlcmVuY2VfdHlwZShfX24pKTsKKwkJc3RkOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3NpdGlvbik7CisJCXRoaXMtPl9NX2ltcGwuX01fZmluaXNoICs9IGRpZmZlcmVuY2VfdHlwZShfX24pOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0KKwkJICBfTV9jaGVja19sZW4oX19uLCAidmVjdG9yPGJvb2w+OjpfTV9pbnNlcnRfcmFuZ2UiKTsKKwkJX0JpdF90eXBlICogX19xID0gdGhpcy0+X01fYWxsb2NhdGUoX19sZW4pOworCQlpdGVyYXRvciBfX2kgPSBfTV9jb3B5X2FsaWduZWQoYmVnaW4oKSwgX19wb3NpdGlvbiwKKwkJCQkJICAgICAgIGl0ZXJhdG9yKF9fcSwgMCkpOworCQlfX2kgPSBzdGQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBfX2kpOworCQl0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IHN0ZDo6Y29weShfX3Bvc2l0aW9uLCBlbmQoKSwgX19pKTsKKwkJdGhpcy0+X01fZGVhbGxvY2F0ZSgpOworCQl0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlID0gX19xICsgX1NfbndvcmQoX19sZW4pOworCQl0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gaXRlcmF0b3IoX19xLCAwKTsKKwkgICAgICB9CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICB2ZWN0b3I8Ym9vbCwgX0FsbG9jPjo6CisgICAgX01faW5zZXJ0X2F1eChpdGVyYXRvciBfX3Bvc2l0aW9uLCBib29sIF9feCkKKyAgICB7CisgICAgICBpZiAodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fcCAhPSB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlKQorCXsKKwkgIHN0ZDo6Y29weV9iYWNrd2FyZChfX3Bvc2l0aW9uLCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwgCisJCQkgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICsgMSk7CisJICAqX19wb3NpdGlvbiA9IF9feDsKKwkgICsrdGhpcy0+X01faW1wbC5fTV9maW5pc2g7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9CisJICAgIF9NX2NoZWNrX2xlbihzaXplX3R5cGUoMSksICJ2ZWN0b3I8Ym9vbD46Ol9NX2luc2VydF9hdXgiKTsKKwkgIF9CaXRfdHlwZSAqIF9fcSA9IHRoaXMtPl9NX2FsbG9jYXRlKF9fbGVuKTsKKwkgIGl0ZXJhdG9yIF9faSA9IF9NX2NvcHlfYWxpZ25lZChiZWdpbigpLCBfX3Bvc2l0aW9uLAorCQkJCQkgaXRlcmF0b3IoX19xLCAwKSk7CisJICAqX19pKysgPSBfX3g7CisJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IHN0ZDo6Y29weShfX3Bvc2l0aW9uLCBlbmQoKSwgX19pKTsKKwkgIHRoaXMtPl9NX2RlYWxsb2NhdGUoKTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgPSBfX3EgKyBfU19ud29yZChfX2xlbik7CisJICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gaXRlcmF0b3IoX19xLCAwKTsKKwl9CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgYm9vbAorICAgIHZlY3Rvcjxib29sLCBfQWxsb2M+OjoKKyAgICBfTV9zaHJpbmtfdG9fZml0KCkKKyAgICB7CisgICAgICBpZiAoY2FwYWNpdHkoKSAtIHNpemUoKSA8IGludChfU193b3JkX2JpdCkpCisJcmV0dXJuIGZhbHNlOworICAgICAgX190cnkKKwl7CisJICBfTV9yZWFsbG9jYXRlKHNpemUoKSk7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7IHJldHVybiBmYWxzZTsgfQorICAgIH0KKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgc2l6ZV90CisgICAgaGFzaDxfR0xJQkNYWF9TVERfQzo6dmVjdG9yPGJvb2wsIF9BbGxvYz4+OjoKKyAgICBvcGVyYXRvcigpKGNvbnN0IF9HTElCQ1hYX1NURF9DOjp2ZWN0b3I8Ym9vbCwgX0FsbG9jPiYgX19iKSBjb25zdCBub2V4Y2VwdAorICAgIHsKKyAgICAgIHNpemVfdCBfX2hhc2ggPSAwOworICAgICAgdXNpbmcgX0dMSUJDWFhfU1REX0M6Ol9TX3dvcmRfYml0OworICAgICAgdXNpbmcgX0dMSUJDWFhfU1REX0M6Ol9CaXRfdHlwZTsKKworICAgICAgY29uc3Qgc2l6ZV90IF9fd29yZHMgPSBfX2Iuc2l6ZSgpIC8gX1Nfd29yZF9iaXQ7CisgICAgICBpZiAoX193b3JkcykKKwl7CisJICBjb25zdCBzaXplX3QgX19jbGVuZ3RoID0gX193b3JkcyAqIHNpemVvZihfQml0X3R5cGUpOworCSAgX19oYXNoID0gc3RkOjpfSGFzaF9pbXBsOjpoYXNoKF9fYi5fTV9pbXBsLl9NX3N0YXJ0Ll9NX3AsIF9fY2xlbmd0aCk7CisJfQorCisgICAgICBjb25zdCBzaXplX3QgX19leHRyYWJpdHMgPSBfX2Iuc2l6ZSgpICUgX1Nfd29yZF9iaXQ7CisgICAgICBpZiAoX19leHRyYWJpdHMpCisJeworCSAgX0JpdF90eXBlIF9faGl3b3JkID0gKl9fYi5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9wOworCSAgX19oaXdvcmQgJj0gfigofnN0YXRpY19jYXN0PF9CaXRfdHlwZT4oMCkpIDw8IF9fZXh0cmFiaXRzKTsKKworCSAgY29uc3Qgc2l6ZV90IF9fY2xlbmd0aAorCSAgICA9IChfX2V4dHJhYml0cyArIF9fQ0hBUl9CSVRfXyAtIDEpIC8gX19DSEFSX0JJVF9fOworCSAgaWYgKF9fd29yZHMpCisJICAgIF9faGFzaCA9IHN0ZDo6X0hhc2hfaW1wbDo6aGFzaCgmX19oaXdvcmQsIF9fY2xlbmd0aCwgX19oYXNoKTsKKwkgIGVsc2UKKwkgICAgX19oYXNoID0gc3RkOjpfSGFzaF9pbXBsOjpoYXNoKCZfX2hpd29yZCwgX19jbGVuZ3RoKTsKKwl9CisKKyAgICAgIHJldHVybiBfX2hhc2g7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8qIF9WRUNUT1JfVENDICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHNldCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvYml0c2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYTZiYWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2JpdHNldApAQCAtMCwwICsxLDE1ODUgQEAKKy8vIDxiaXRzZXQ+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBpbmNsdWRlL2JpdHNldAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9CSVRTRVQKKyNkZWZpbmUgX0dMSUJDWFhfQklUU0VUIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4gICAvLyBGb3IgaW52YWxpZF9hcmd1bWVudCwgb3V0X29mX3JhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVyZmxvd19lcnJvcgorI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxiaXRzL2N4eGFiaV9mb3JjZWQuaD4KKworI2RlZmluZSBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRCAgKF9fQ0hBUl9CSVRfXyAqIF9fU0laRU9GX0xPTkdfXykKKyNkZWZpbmUgX0dMSUJDWFhfQklUU0VUX1dPUkRTKF9fbikgXAorICAoKF9fbikgLyBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRCArIFwKKyAgICgoX19uKSAlIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEID09IDAgPyAwIDogMSkpCisKKyNkZWZpbmUgX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1VMTCAoX19DSEFSX0JJVF9fICogX19TSVpFT0ZfTE9OR19MT05HX18pCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUgorCisgIC8qKgorICAgKiAgQmFzZSBjbGFzcywgZ2VuZXJhbCBjYXNlLiAgSXQgaXMgYSBjbGFzcyBpbnZhcmlhbnQgdGhhdCBfTncgd2lsbCBiZQorICAgKiAgbm9ubmVnYXRpdmUuCisgICAqCisgICAqICBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgYml0c2V0LgorICAqLworICB0ZW1wbGF0ZTxzaXplX3QgX053PgorICAgIHN0cnVjdCBfQmFzZV9iaXRzZXQKKyAgICB7CisgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX1dvcmRUOworCisgICAgICAvLy8gMCBpcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgd29yZC4KKyAgICAgIF9Xb3JkVCAJCV9NX3dbX053XTsKKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIF9CYXNlX2JpdHNldCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICA6IF9NX3coKSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGNvbnN0ZXhwciBfQmFzZV9iaXRzZXQodW5zaWduZWQgbG9uZyBsb25nIF9fdmFsKSBub2V4Y2VwdAorICAgICAgOiBfTV93eyBfV29yZFQoX192YWwpCisjaWYgX19TSVpFT0ZfTE9OR19MT05HX18gPiBfX1NJWkVPRl9MT05HX18KKwkgICAgICAgLCBfV29yZFQoX192YWwgPj4gX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQpCisjZW5kaWYKKyAgICAgICB9IHsgfQorI2Vsc2UKKyAgICAgIF9CYXNlX2JpdHNldCh1bnNpZ25lZCBsb25nIF9fdmFsKQorICAgICAgOiBfTV93KCkKKyAgICAgIHsgX01fd1swXSA9IF9fdmFsOyB9CisjZW5kaWYKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaXplX3QKKyAgICAgIF9TX3doaWNod29yZChzaXplX3QgX19wb3MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfX3BvcyAvIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2l6ZV90CisgICAgICBfU193aGljaGJ5dGUoc2l6ZV90IF9fcG9zKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gKF9fcG9zICUgX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQpIC8gX19DSEFSX0JJVF9fOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2l6ZV90CisgICAgICBfU193aGljaGJpdChzaXplX3QgX19wb3MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfX3BvcyAlIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgX1dvcmRUCisgICAgICBfU19tYXNrYml0KHNpemVfdCBfX3BvcykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIChzdGF0aWNfY2FzdDxfV29yZFQ+KDEpKSA8PCBfU193aGljaGJpdChfX3Bvcyk7IH0KKworICAgICAgX1dvcmRUJgorICAgICAgX01fZ2V0d29yZChzaXplX3QgX19wb3MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV93W19TX3doaWNod29yZChfX3BvcyldOyB9CisKKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBfV29yZFQKKyAgICAgIF9NX2dldHdvcmQoc2l6ZV90IF9fcG9zKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fd1tfU193aGljaHdvcmQoX19wb3MpXTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgY29uc3QgX1dvcmRUKgorICAgICAgX01fZ2V0ZGF0YSgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV93OyB9CisjZW5kaWYKKworICAgICAgX1dvcmRUJgorICAgICAgX01faGl3b3JkKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3dbX053IC0gMV07IH0KKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIF9Xb3JkVAorICAgICAgX01faGl3b3JkKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3dbX053IC0gMV07IH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9fYW5kKGNvbnN0IF9CYXNlX2JpdHNldDxfTnc+JiBfX3gpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX053OyBfX2krKykKKwkgIF9NX3dbX19pXSAmPSBfX3guX01fd1tfX2ldOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19vcihjb25zdCBfQmFzZV9iaXRzZXQ8X053PiYgX194KSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9OdzsgX19pKyspCisJICBfTV93W19faV0gfD0gX194Ll9NX3dbX19pXTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9feG9yKGNvbnN0IF9CYXNlX2JpdHNldDxfTnc+JiBfX3gpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX053OyBfX2krKykKKwkgIF9NX3dbX19pXSBePSBfX3guX01fd1tfX2ldOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19sZWZ0X3NoaWZ0KHNpemVfdCBfX3NoaWZ0KSBfR0xJQkNYWF9OT0VYQ0VQVDsKKworICAgICAgdm9pZAorICAgICAgX01fZG9fcmlnaHRfc2hpZnQoc2l6ZV90IF9fc2hpZnQpIF9HTElCQ1hYX05PRVhDRVBUOworCisgICAgICB2b2lkCisgICAgICBfTV9kb19mbGlwKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTnc7IF9faSsrKQorCSAgX01fd1tfX2ldID0gfl9NX3dbX19pXTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9fc2V0KCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTnc7IF9faSsrKQorCSAgX01fd1tfX2ldID0gfnN0YXRpY19jYXN0PF9Xb3JkVD4oMCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX3Jlc2V0KCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgX19idWlsdGluX21lbXNldChfTV93LCAwLCBfTncgKiBzaXplb2YoX1dvcmRUKSk7IH0KKworICAgICAgYm9vbAorICAgICAgX01faXNfZXF1YWwoY29uc3QgX0Jhc2VfYml0c2V0PF9Odz4mIF9feCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTnc7ICsrX19pKQorCSAgaWYgKF9NX3dbX19pXSAhPSBfX3guX01fd1tfX2ldKQorCSAgICByZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHNpemVfdCBfTmI+CisgICAgICAgIGJvb2wKKyAgICAgICAgX01fYXJlX2FsbCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICAgIHsKKwkgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9OdyAtIDE7IF9faSsrKQorCSAgICBpZiAoX01fd1tfX2ldICE9IH5zdGF0aWNfY2FzdDxfV29yZFQ+KDApKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgIHJldHVybiBfTV9oaXdvcmQoKSA9PSAofnN0YXRpY19jYXN0PF9Xb3JkVD4oMCkKKwkJCQkgPj4gKF9OdyAqIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JECisJCQkJICAgICAtIF9OYikpOworCX0KKworICAgICAgYm9vbAorICAgICAgX01faXNfYW55KCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTnc7IF9faSsrKQorCSAgaWYgKF9NX3dbX19pXSAhPSBzdGF0aWNfY2FzdDxfV29yZFQ+KDApKQorCSAgICByZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHNpemVfdAorICAgICAgX01fZG9fY291bnQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCXNpemVfdCBfX3Jlc3VsdCA9IDA7CisJZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX053OyBfX2krKykKKwkgIF9fcmVzdWx0ICs9IF9fYnVpbHRpbl9wb3Bjb3VudGwoX01fd1tfX2ldKTsKKwlyZXR1cm4gX19yZXN1bHQ7CisgICAgICB9CisKKyAgICAgIHVuc2lnbmVkIGxvbmcKKyAgICAgIF9NX2RvX3RvX3Vsb25nKCkgY29uc3Q7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcKKyAgICAgIF9NX2RvX3RvX3VsbG9uZygpIGNvbnN0OworI2VuZGlmCisKKyAgICAgIC8vIGZpbmQgZmlyc3QgIm9uIiBiaXQKKyAgICAgIHNpemVfdAorICAgICAgX01fZG9fZmluZF9maXJzdChzaXplX3QpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUOworCisgICAgICAvLyBmaW5kIHRoZSBuZXh0ICJvbiIgYml0IHRoYXQgZm9sbG93cyAicHJldiIKKyAgICAgIHNpemVfdAorICAgICAgX01fZG9fZmluZF9uZXh0KHNpemVfdCwgc2l6ZV90KSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVDsKKyAgICB9OworCisgIC8vIERlZmluaXRpb25zIG9mIG5vbi1pbmxpbmUgZnVuY3Rpb25zIGZyb20gX0Jhc2VfYml0c2V0LgorICB0ZW1wbGF0ZTxzaXplX3QgX053PgorICAgIHZvaWQKKyAgICBfQmFzZV9iaXRzZXQ8X053Pjo6X01fZG9fbGVmdF9zaGlmdChzaXplX3QgX19zaGlmdCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7CisgICAgICBpZiAoX19idWlsdGluX2V4cGVjdChfX3NoaWZ0ICE9IDAsIDEpKQorCXsKKwkgIGNvbnN0IHNpemVfdCBfX3dzaGlmdCA9IF9fc2hpZnQgLyBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRDsKKwkgIGNvbnN0IHNpemVfdCBfX29mZnNldCA9IF9fc2hpZnQgJSBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRDsKKworCSAgaWYgKF9fb2Zmc2V0ID09IDApCisJICAgIGZvciAoc2l6ZV90IF9fbiA9IF9OdyAtIDE7IF9fbiA+PSBfX3dzaGlmdDsgLS1fX24pCisJICAgICAgX01fd1tfX25dID0gX01fd1tfX24gLSBfX3dzaGlmdF07CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb25zdCBzaXplX3QgX19zdWJfb2Zmc2V0ID0gKF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEIAorCQkJCQkgICAtIF9fb2Zmc2V0KTsKKwkgICAgICBmb3IgKHNpemVfdCBfX24gPSBfTncgLSAxOyBfX24gPiBfX3dzaGlmdDsgLS1fX24pCisJCV9NX3dbX19uXSA9ICgoX01fd1tfX24gLSBfX3dzaGlmdF0gPDwgX19vZmZzZXQpCisJCQkgICAgIHwgKF9NX3dbX19uIC0gX193c2hpZnQgLSAxXSA+PiBfX3N1Yl9vZmZzZXQpKTsKKwkgICAgICBfTV93W19fd3NoaWZ0XSA9IF9NX3dbMF0gPDwgX19vZmZzZXQ7CisJICAgIH0KKworCSAgc3RkOjpmaWxsKF9NX3cgKyAwLCBfTV93ICsgX193c2hpZnQsIHN0YXRpY19jYXN0PF9Xb3JkVD4oMCkpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8c2l6ZV90IF9Odz4KKyAgICB2b2lkCisgICAgX0Jhc2VfYml0c2V0PF9Odz46Ol9NX2RvX3JpZ2h0X3NoaWZ0KHNpemVfdCBfX3NoaWZ0KSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KF9fc2hpZnQgIT0gMCwgMSkpCisJeworCSAgY29uc3Qgc2l6ZV90IF9fd3NoaWZ0ID0gX19zaGlmdCAvIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEOworCSAgY29uc3Qgc2l6ZV90IF9fb2Zmc2V0ID0gX19zaGlmdCAlIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEOworCSAgY29uc3Qgc2l6ZV90IF9fbGltaXQgPSBfTncgLSBfX3dzaGlmdCAtIDE7CisKKwkgIGlmIChfX29mZnNldCA9PSAwKQorCSAgICBmb3IgKHNpemVfdCBfX24gPSAwOyBfX24gPD0gX19saW1pdDsgKytfX24pCisJICAgICAgX01fd1tfX25dID0gX01fd1tfX24gKyBfX3dzaGlmdF07CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb25zdCBzaXplX3QgX19zdWJfb2Zmc2V0ID0gKF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JECisJCQkJCSAgIC0gX19vZmZzZXQpOworCSAgICAgIGZvciAoc2l6ZV90IF9fbiA9IDA7IF9fbiA8IF9fbGltaXQ7ICsrX19uKQorCQlfTV93W19fbl0gPSAoKF9NX3dbX19uICsgX193c2hpZnRdID4+IF9fb2Zmc2V0KQorCQkJICAgICB8IChfTV93W19fbiArIF9fd3NoaWZ0ICsgMV0gPDwgX19zdWJfb2Zmc2V0KSk7CisJICAgICAgX01fd1tfX2xpbWl0XSA9IF9NX3dbX053LTFdID4+IF9fb2Zmc2V0OworCSAgICB9CisJICAKKwkgIHN0ZDo6ZmlsbChfTV93ICsgX19saW1pdCArIDEsIF9NX3cgKyBfTncsIHN0YXRpY19jYXN0PF9Xb3JkVD4oMCkpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8c2l6ZV90IF9Odz4KKyAgICB1bnNpZ25lZCBsb25nCisgICAgX0Jhc2VfYml0c2V0PF9Odz46Ol9NX2RvX3RvX3Vsb25nKCkgY29uc3QKKyAgICB7CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAxOyBfX2kgPCBfTnc7ICsrX19pKQorCWlmIChfTV93W19faV0pCisJICBfX3Rocm93X292ZXJmbG93X2Vycm9yKF9fTigiX0Jhc2VfYml0c2V0OjpfTV9kb190b191bG9uZyIpKTsKKyAgICAgIHJldHVybiBfTV93WzBdOworICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8c2l6ZV90IF9Odz4KKyAgICB1bnNpZ25lZCBsb25nIGxvbmcKKyAgICBfQmFzZV9iaXRzZXQ8X053Pjo6X01fZG9fdG9fdWxsb25nKCkgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBib29sIF9fZHcgPSBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSA+IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDEgKyBfX2R3OyBfX2kgPCBfTnc7ICsrX19pKQorCWlmIChfTV93W19faV0pCisJICBfX3Rocm93X292ZXJmbG93X2Vycm9yKF9fTigiX0Jhc2VfYml0c2V0OjpfTV9kb190b191bGxvbmciKSk7CisKKyAgICAgIGlmIChfX2R3KQorCXJldHVybiBfTV93WzBdICsgKHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oX01fd1sxXSkKKwkJCSAgPDwgX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQpOworICAgICAgcmV0dXJuIF9NX3dbMF07CisgICAgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8c2l6ZV90IF9Odz4KKyAgICBzaXplX3QKKyAgICBfQmFzZV9iaXRzZXQ8X053Pjo6CisgICAgX01fZG9fZmluZF9maXJzdChzaXplX3QgX19ub3RfZm91bmQpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX053OyBfX2krKykKKwl7CisJICBfV29yZFQgX190aGlzd29yZCA9IF9NX3dbX19pXTsKKwkgIGlmIChfX3RoaXN3b3JkICE9IHN0YXRpY19jYXN0PF9Xb3JkVD4oMCkpCisJICAgIHJldHVybiAoX19pICogX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQKKwkJICAgICsgX19idWlsdGluX2N0emwoX190aGlzd29yZCkpOworCX0KKyAgICAgIC8vIG5vdCBmb3VuZCwgc28gcmV0dXJuIGFuIGluZGljYXRpb24gb2YgZmFpbHVyZS4KKyAgICAgIHJldHVybiBfX25vdF9mb3VuZDsKKyAgICB9CisKKyAgdGVtcGxhdGU8c2l6ZV90IF9Odz4KKyAgICBzaXplX3QKKyAgICBfQmFzZV9iaXRzZXQ8X053Pjo6CisgICAgX01fZG9fZmluZF9uZXh0KHNpemVfdCBfX3ByZXYsIHNpemVfdCBfX25vdF9mb3VuZCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7CisgICAgICAvLyBtYWtlIGJvdW5kIGluY2x1c2l2ZQorICAgICAgKytfX3ByZXY7CisKKyAgICAgIC8vIGNoZWNrIG91dCBvZiBib3VuZHMKKyAgICAgIGlmIChfX3ByZXYgPj0gX053ICogX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQpCisJcmV0dXJuIF9fbm90X2ZvdW5kOworCisgICAgICAvLyBzZWFyY2ggZmlyc3Qgd29yZAorICAgICAgc2l6ZV90IF9faSA9IF9TX3doaWNod29yZChfX3ByZXYpOworICAgICAgX1dvcmRUIF9fdGhpc3dvcmQgPSBfTV93W19faV07CisKKyAgICAgIC8vIG1hc2sgb2ZmIGJpdHMgYmVsb3cgYm91bmQKKyAgICAgIF9fdGhpc3dvcmQgJj0gKH5zdGF0aWNfY2FzdDxfV29yZFQ+KDApKSA8PCBfU193aGljaGJpdChfX3ByZXYpOworCisgICAgICBpZiAoX190aGlzd29yZCAhPSBzdGF0aWNfY2FzdDxfV29yZFQ+KDApKQorCXJldHVybiAoX19pICogX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQKKwkJKyBfX2J1aWx0aW5fY3R6bChfX3RoaXN3b3JkKSk7CisKKyAgICAgIC8vIGNoZWNrIHN1YnNlcXVlbnQgd29yZHMKKyAgICAgIF9faSsrOworICAgICAgZm9yICg7IF9faSA8IF9OdzsgX19pKyspCisJeworCSAgX190aGlzd29yZCA9IF9NX3dbX19pXTsKKwkgIGlmIChfX3RoaXN3b3JkICE9IHN0YXRpY19jYXN0PF9Xb3JkVD4oMCkpCisJICAgIHJldHVybiAoX19pICogX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQKKwkJICAgICsgX19idWlsdGluX2N0emwoX190aGlzd29yZCkpOworCX0KKyAgICAgIC8vIG5vdCBmb3VuZCwgc28gcmV0dXJuIGFuIGluZGljYXRpb24gb2YgZmFpbHVyZS4KKyAgICAgIHJldHVybiBfX25vdF9mb3VuZDsKKyAgICB9IC8vIGVuZCBfTV9kb19maW5kX25leHQKKworICAvKioKKyAgICogIEJhc2UgY2xhc3MsIHNwZWNpYWxpemF0aW9uIGZvciBhIHNpbmdsZSB3b3JkLgorICAgKgorICAgKiAgU2VlIGRvY3VtZW50YXRpb24gZm9yIGJpdHNldC4KKyAgKi8KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfQmFzZV9iaXRzZXQ8MT4KKyAgICB7CisgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX1dvcmRUOworICAgICAgX1dvcmRUIF9NX3c7CisKKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBfQmFzZV9iaXRzZXQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgOiBfTV93KDApCisgICAgICB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGNvbnN0ZXhwciBfQmFzZV9iaXRzZXQodW5zaWduZWQgbG9uZyBsb25nIF9fdmFsKSBub2V4Y2VwdAorI2Vsc2UKKyAgICAgIF9CYXNlX2JpdHNldCh1bnNpZ25lZCBsb25nIF9fdmFsKQorI2VuZGlmCisgICAgICA6IF9NX3coX192YWwpCisgICAgICB7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaXplX3QKKyAgICAgIF9TX3doaWNod29yZChzaXplX3QgX19wb3MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfX3BvcyAvIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2l6ZV90CisgICAgICBfU193aGljaGJ5dGUoc2l6ZV90IF9fcG9zKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gKF9fcG9zICUgX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQpIC8gX19DSEFSX0JJVF9fOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2l6ZV90CisgICAgICBfU193aGljaGJpdChzaXplX3QgX19wb3MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7ICByZXR1cm4gX19wb3MgJSBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIF9Xb3JkVAorICAgICAgX1NfbWFza2JpdChzaXplX3QgX19wb3MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAoc3RhdGljX2Nhc3Q8X1dvcmRUPigxKSkgPDwgX1Nfd2hpY2hiaXQoX19wb3MpOyB9CisKKyAgICAgIF9Xb3JkVCYKKyAgICAgIF9NX2dldHdvcmQoc2l6ZV90KSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdzsgfQorCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgX1dvcmRUCisgICAgICBfTV9nZXR3b3JkKHNpemVfdCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3c7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGNvbnN0IF9Xb3JkVCoKKyAgICAgIF9NX2dldGRhdGEoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gJl9NX3c7IH0KKyNlbmRpZgorCisgICAgICBfV29yZFQmCisgICAgICBfTV9oaXdvcmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdzsgfQorCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgX1dvcmRUCisgICAgICBfTV9oaXdvcmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdzsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19hbmQoY29uc3QgX0Jhc2VfYml0c2V0PDE+JiBfX3gpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9NX3cgJj0gX194Ll9NX3c7IH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9fb3IoY29uc3QgX0Jhc2VfYml0c2V0PDE+JiBfX3gpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9NX3cgfD0gX194Ll9NX3c7IH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9feG9yKGNvbnN0IF9CYXNlX2JpdHNldDwxPiYgX194KSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyBfTV93IF49IF9feC5fTV93OyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX2xlZnRfc2hpZnQoc2l6ZV90IF9fc2hpZnQpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9NX3cgPDw9IF9fc2hpZnQ7IH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9fcmlnaHRfc2hpZnQoc2l6ZV90IF9fc2hpZnQpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9NX3cgPj49IF9fc2hpZnQ7IH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9fZmxpcCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9NX3cgPSB+X01fdzsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19zZXQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyBfTV93ID0gfnN0YXRpY19jYXN0PF9Xb3JkVD4oMCk7IH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9fcmVzZXQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyBfTV93ID0gMDsgfQorCisgICAgICBib29sCisgICAgICBfTV9pc19lcXVhbChjb25zdCBfQmFzZV9iaXRzZXQ8MT4mIF9feCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3cgPT0gX194Ll9NX3c7IH0KKworICAgICAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICAgICAgYm9vbAorICAgICAgICBfTV9hcmVfYWxsKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgICAgeyByZXR1cm4gX01fdyA9PSAofnN0YXRpY19jYXN0PF9Xb3JkVD4oMCkKKwkJCSAgPj4gKF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEIC0gX05iKSk7IH0KKworICAgICAgYm9vbAorICAgICAgX01faXNfYW55KCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9NX3cgIT0gMDsgfQorCisgICAgICBzaXplX3QKKyAgICAgIF9NX2RvX2NvdW50KCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudGwoX01fdyk7IH0KKworICAgICAgdW5zaWduZWQgbG9uZworICAgICAgX01fZG9fdG9fdWxvbmcoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fdzsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdW5zaWduZWQgbG9uZyBsb25nCisgICAgICBfTV9kb190b191bGxvbmcoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fdzsgfQorI2VuZGlmCisKKyAgICAgIHNpemVfdAorICAgICAgX01fZG9fZmluZF9maXJzdChzaXplX3QgX19ub3RfZm91bmQpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisgICAgICAgIGlmIChfTV93ICE9IDApCisgICAgICAgICAgcmV0dXJuIF9fYnVpbHRpbl9jdHpsKF9NX3cpOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIF9fbm90X2ZvdW5kOworICAgICAgfQorCisgICAgICAvLyBmaW5kIHRoZSBuZXh0ICJvbiIgYml0IHRoYXQgZm9sbG93cyAicHJldiIKKyAgICAgIHNpemVfdAorICAgICAgX01fZG9fZmluZF9uZXh0KHNpemVfdCBfX3ByZXYsIHNpemVfdCBfX25vdF9mb3VuZCkgY29uc3QKKwlfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCSsrX19wcmV2OworCWlmIChfX3ByZXYgPj0gKChzaXplX3QpIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEKSkKKwkgIHJldHVybiBfX25vdF9mb3VuZDsKKworCV9Xb3JkVCBfX3ggPSBfTV93ID4+IF9fcHJldjsKKwlpZiAoX194ICE9IDApCisJICByZXR1cm4gX19idWlsdGluX2N0emwoX194KSArIF9fcHJldjsKKwllbHNlCisJICByZXR1cm4gX19ub3RfZm91bmQ7CisgICAgICB9CisgICAgfTsKKworICAvKioKKyAgICogIEJhc2UgY2xhc3MsIHNwZWNpYWxpemF0aW9uIGZvciBubyBzdG9yYWdlICh6ZXJvLWxlbmd0aCAlYml0c2V0KS4KKyAgICoKKyAgICogIFNlZSBkb2N1bWVudGF0aW9uIGZvciBiaXRzZXQuCisgICovCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX0Jhc2VfYml0c2V0PDA+CisgICAgeworICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9Xb3JkVDsKKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIF9CYXNlX2JpdHNldCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGNvbnN0ZXhwciBfQmFzZV9iaXRzZXQodW5zaWduZWQgbG9uZyBsb25nKSBub2V4Y2VwdAorI2Vsc2UKKyAgICAgIF9CYXNlX2JpdHNldCh1bnNpZ25lZCBsb25nKQorI2VuZGlmCisgICAgICB7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaXplX3QKKyAgICAgIF9TX3doaWNod29yZChzaXplX3QgX19wb3MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfX3BvcyAvIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2l6ZV90CisgICAgICBfU193aGljaGJ5dGUoc2l6ZV90IF9fcG9zKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gKF9fcG9zICUgX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQpIC8gX19DSEFSX0JJVF9fOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2l6ZV90CisgICAgICBfU193aGljaGJpdChzaXplX3QgX19wb3MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7ICByZXR1cm4gX19wb3MgJSBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIF9Xb3JkVAorICAgICAgX1NfbWFza2JpdChzaXplX3QgX19wb3MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAoc3RhdGljX2Nhc3Q8X1dvcmRUPigxKSkgPDwgX1Nfd2hpY2hiaXQoX19wb3MpOyB9CisKKyAgICAgIC8vIFRoaXMgd291bGQgbm9ybWFsbHkgZ2l2ZSBhY2Nlc3MgdG8gdGhlIGRhdGEuICBUaGUgYm91bmRzLWNoZWNraW5nCisgICAgICAvLyBpbiB0aGUgYml0c2V0IGNsYXNzIHdpbGwgcHJldmVudCB0aGUgdXNlciBmcm9tIGdldHRpbmcgdGhpcyBmYXIsCisgICAgICAvLyBidXQgKDEpIGl0IG11c3Qgc3RpbGwgcmV0dXJuIGFuIGx2YWx1ZSB0byBjb21waWxlLCBhbmQgKDIpIHRoZQorICAgICAgLy8gdXNlciBtaWdodCBjYWxsIF9VbmNoZWNrZWRfc2V0IGRpcmVjdGx5LCBpbiB3aGljaCBjYXNlIHRoaXMgL25lZWRzLworICAgICAgLy8gdG8gZmFpbC4gIExldCdzIG5vdCBwZW5hbGl6ZSB6ZXJvLWxlbmd0aCB1c2VycyB1bmxlc3MgdGhleSBhY3R1YWxseQorICAgICAgLy8gbWFrZSBhbiB1bmNoZWNrZWQgY2FsbDsgYWxsIHRoZSBtZW1vcnkgdWdsaW5lc3MgaXMgdGhlcmVmb3JlCisgICAgICAvLyBsb2NhbGl6ZWQgdG8gdGhpcyBzaW5nbGUgc2hvdWxkLW5ldmVyLWdldC10aGlzLWZhciBmdW5jdGlvbi4KKyAgICAgIF9Xb3JkVCYKKyAgICAgIF9NX2dldHdvcmQoc2l6ZV90KSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCV9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiX0Jhc2VfYml0c2V0OjpfTV9nZXR3b3JkIikpOyAKKwlyZXR1cm4gKm5ldyBfV29yZFQ7CisgICAgICB9CisKKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBfV29yZFQKKyAgICAgIF9NX2dldHdvcmQoc2l6ZV90IF9fcG9zKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gMDsgfQorCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgX1dvcmRUCisgICAgICBfTV9oaXdvcmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gMDsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19hbmQoY29uc3QgX0Jhc2VfYml0c2V0PDA+JikgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19vcihjb25zdCBfQmFzZV9iaXRzZXQ8MD4mKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX3hvcihjb25zdCBfQmFzZV9iaXRzZXQ8MD4mKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX2xlZnRfc2hpZnQoc2l6ZV90KSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX3JpZ2h0X3NoaWZ0KHNpemVfdCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19mbGlwKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19zZXQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX3Jlc2V0KCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgfQorCisgICAgICAvLyBBcmUgYWxsIGVtcHR5IGJpdHNldHMgZXF1YWwgdG8gZWFjaCBvdGhlcj8gIEFyZSB0aGV5IGVxdWFsIHRvCisgICAgICAvLyB0aGVtc2VsdmVzPyAgSG93IHRvIGNvbXBhcmUgYSB0aGluZyB3aGljaCBoYXMgbm8gc3RhdGU/ICBXaGF0IGlzCisgICAgICAvLyB0aGUgc291bmQgb2Ygb25lIHplcm8tbGVuZ3RoIGJpdHNldCBjbGFwcGluZz8KKyAgICAgIGJvb2wKKyAgICAgIF9NX2lzX2VxdWFsKGNvbnN0IF9CYXNlX2JpdHNldDwwPiYpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0cnVlOyB9CisKKyAgICAgIHRlbXBsYXRlPHNpemVfdCBfTmI+CisgICAgICAgIGJvb2wKKyAgICAgICAgX01fYXJlX2FsbCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICAgIHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgYm9vbAorICAgICAgX01faXNfYW55KCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgIHNpemVfdAorICAgICAgX01fZG9fY291bnQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gMDsgfQorCisgICAgICB1bnNpZ25lZCBsb25nCisgICAgICBfTV9kb190b191bG9uZygpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAwOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcKKyAgICAgIF9NX2RvX3RvX3VsbG9uZygpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiAwOyB9CisjZW5kaWYKKworICAgICAgLy8gTm9ybWFsbHkgIm5vdCBmb3VuZCIgaXMgdGhlIHNpemUsIGJ1dCB0aGF0IGNvdWxkIGFsc28gYmUKKyAgICAgIC8vIG1pc2ludGVycHJldGVkIGFzIGFuIGluZGV4IGluIHRoaXMgY29ybmVyIGNhc2UuICBPaCB3ZWxsLgorICAgICAgc2l6ZV90CisgICAgICBfTV9kb19maW5kX2ZpcnN0KHNpemVfdCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIDA7IH0KKworICAgICAgc2l6ZV90CisgICAgICBfTV9kb19maW5kX25leHQoc2l6ZV90LCBzaXplX3QpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAwOyB9CisgICAgfTsKKworCisgIC8vIEhlbHBlciBjbGFzcyB0byB6ZXJvIG91dCB0aGUgdW51c2VkIGhpZ2gtb3JkZXIgYml0cyBpbiB0aGUgaGlnaGVzdCB3b3JkLgorICB0ZW1wbGF0ZTxzaXplX3QgX0V4dHJhYml0cz4KKyAgICBzdHJ1Y3QgX1Nhbml0aXplCisgICAgeworICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9Xb3JkVDsKKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2RvX3Nhbml0aXplKF9Xb3JkVCYgX192YWwpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IF9fdmFsICY9IH4oKH5zdGF0aWNfY2FzdDxfV29yZFQ+KDApKSA8PCBfRXh0cmFiaXRzKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfU2FuaXRpemU8MD4KKyAgICB7CisgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX1dvcmRUOworCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfZG9fc2FuaXRpemUoX1dvcmRUKSBfR0xJQkNYWF9OT0VYQ0VQVCB7IH0gCisgICAgfTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8c2l6ZV90IF9OYiwgYm9vbCA9IF9OYiA8IF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9VTEw+CisgICAgc3RydWN0IF9TYW5pdGl6ZV92YWwKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGxvbmcgbG9uZworICAgICAgX1NfZG9fc2FuaXRpemVfdmFsKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3ZhbCkKKyAgICAgIHsgcmV0dXJuIF9fdmFsOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxzaXplX3QgX05iPgorICAgIHN0cnVjdCBfU2FuaXRpemVfdmFsPF9OYiwgdHJ1ZT4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGxvbmcgbG9uZworICAgICAgX1NfZG9fc2FuaXRpemVfdmFsKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3ZhbCkKKyAgICAgIHsgcmV0dXJuIF9fdmFsICYgfigofnN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oMCkpIDw8IF9OYik7IH0KKyAgICB9OworI2VuZGlmCisKKyAgLyoqCisgICAqICBUaGUgJWJpdHNldCBjbGFzcyByZXByZXNlbnRzIGEgQGUgZml4ZWQtc2l6ZSBzZXF1ZW5jZSBvZiBiaXRzLgorICAgKgorICAgKiAgQGluZ3JvdXAgY29udGFpbmVycworICAgKgorICAgKiAgKE5vdGUgdGhhdCAlYml0c2V0IGRvZXMgQGUgbm90IG1lZXQgdGhlIGZvcm1hbCByZXF1aXJlbWVudHMgb2YgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4uICBNYWlubHksIGl0IGxhY2tzIGl0ZXJhdG9ycy4pCisgICAqCisgICAqICBUaGUgdGVtcGxhdGUgYXJndW1lbnQsIEBhIE5iLCBtYXkgYmUgYW55IG5vbi1uZWdhdGl2ZSBudW1iZXIsCisgICAqICBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgYml0cyAoZS5nLiwgIjAiLCAiMTIiLCAiMTAyNCoxMDI0IikuCisgICAqCisgICAqICBJbiB0aGUgZ2VuZXJhbCB1bm9wdGltaXplZCBjYXNlLCBzdG9yYWdlIGlzIGFsbG9jYXRlZCBpbiB3b3JkLXNpemVkCisgICAqICBibG9ja3MuICBMZXQgQiBiZSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYSB3b3JkLCB0aGVuIChOYisoQi0xKSkvQgorICAgKiAgd29yZHMgd2lsbCBiZSB1c2VkIGZvciBzdG9yYWdlLiAgQiAtIE5iJUIgYml0cyBhcmUgdW51c2VkLiAgKFRoZXkgYXJlCisgICAqICB0aGUgaGlnaC1vcmRlciBiaXRzIGluIHRoZSBoaWdoZXN0IHdvcmQuKSAgSXQgaXMgYSBjbGFzcyBpbnZhcmlhbnQKKyAgICogIHRoYXQgdGhvc2UgdW51c2VkIGJpdHMgYXJlIGFsd2F5cyB6ZXJvLgorICAgKgorICAgKiAgSWYgeW91IHRoaW5rIG9mICViaXRzZXQgYXMgPGVtPmEgc2ltcGxlIGFycmF5IG9mIGJpdHM8L2VtPiwgYmUKKyAgICogIGF3YXJlIHRoYXQgeW91ciBtZW50YWwgcGljdHVyZSBpcyByZXZlcnNlZDogYSAlYml0c2V0IGJlaGF2ZXMKKyAgICogIHRoZSBzYW1lIHdheSBhcyBiaXRzIGluIGludGVnZXJzIGRvLCB3aXRoIHRoZSBiaXQgYXQgaW5kZXggMCBpbgorICAgKiAgdGhlIDxlbT5sZWFzdCBzaWduaWZpY2FudCAvIHJpZ2h0LWhhbmQ8L2VtPiBwb3NpdGlvbiwgYW5kIHRoZSBiaXQgYXQKKyAgICogIGluZGV4IE5iLTEgaW4gdGhlIDxlbT5tb3N0IHNpZ25pZmljYW50IC8gbGVmdC1oYW5kPC9lbT4gcG9zaXRpb24uCisgICAqICBUaHVzLCB1bmxpa2Ugb3RoZXIgY29udGFpbmVycywgYSAlYml0c2V0J3MgaW5kZXggPGVtPmNvdW50cyBmcm9tCisgICAqICByaWdodCB0byBsZWZ0PC9lbT4sIHRvIHB1dCBpdCB2ZXJ5IGxvb3NlbHkuCisgICAqCisgICAqICBUaGlzIGJlaGF2aW9yIGlzIHByZXNlcnZlZCB3aGVuIHRyYW5zbGF0aW5nIHRvIGFuZCBmcm9tIHN0cmluZ3MuICBGb3IKKyAgICogIGV4YW1wbGUsIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBwcm9iYWJseSBwcmludHMKKyAgICogIDxlbT5iKCZhcG9zO2EmYXBvczspIGlzIDAwMDExMDAwMDE8L2VtPiBvbiBhIG1vZGVybiBBU0NJSSBzeXN0ZW0uCisgICAqCisgICAqICBAY29kZQorICAgKiAgICAgI2luY2x1ZGUgPGJpdHNldD4KKyAgICogICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KKyAgICogICAgICNpbmNsdWRlIDxzc3RyZWFtPgorICAgKgorICAgKiAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICoKKyAgICogICAgIGludCBtYWluKCkKKyAgICogICAgIHsKKyAgICogICAgICAgICBsb25nICAgICAgICAgYSA9ICdhJzsKKyAgICogICAgICAgICBiaXRzZXQ8MTA+ICAgYihhKTsKKyAgICoKKyAgICogICAgICAgICBjb3V0IDw8ICJiKCdhJykgaXMgIiA8PCBiIDw8IGVuZGw7CisgICAqCisgICAqICAgICAgICAgb3N0cmluZ3N0cmVhbSBzOworICAgKiAgICAgICAgIHMgPDwgYjsKKyAgICogICAgICAgICBzdHJpbmcgIHN0ciA9IHMuc3RyKCk7CisgICAqICAgICAgICAgY291dCA8PCAiaW5kZXggMyBpbiB0aGUgc3RyaW5nIGlzICIgPDwgc3RyWzNdIDw8ICIgYnV0XG4iCisgICAqICAgICAgICAgICAgICA8PCAiaW5kZXggMyBpbiB0aGUgYml0c2V0IGlzICIgPDwgYlszXSA8PCBlbmRsOworICAgKiAgICAgfQorICAgKiAgQGVuZGNvZGUKKyAgICoKKyAgICogIEFsc28gc2VlOgorICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQxMmNoMzNzMDIuaHRtbAorICAgKiAgZm9yIGEgZGVzY3JpcHRpb24gb2YgZXh0ZW5zaW9ucy4KKyAgICoKKyAgICogIE1vc3Qgb2YgdGhlIGFjdHVhbCBjb2RlIGlzbid0IGNvbnRhaW5lZCBpbiAlYml0c2V0PD4gaXRzZWxmLCBidXQgaW4gdGhlCisgICAqICBiYXNlIGNsYXNzIF9CYXNlX2JpdHNldC4gIFRoZSBiYXNlIGNsYXNzIHdvcmtzIHdpdGggd2hvbGUgd29yZHMsIG5vdCB3aXRoCisgICAqICBpbmRpdmlkdWFsIGJpdHMuICBUaGlzIGFsbG93cyB1cyB0byBzcGVjaWFsaXplIF9CYXNlX2JpdHNldCBmb3IgdGhlCisgICAqICBpbXBvcnRhbnQgc3BlY2lhbCBjYXNlIHdoZXJlIHRoZSAlYml0c2V0IGlzIG9ubHkgYSBzaW5nbGUgd29yZC4KKyAgICoKKyAgICogIEV4dHJhIGNvbmZ1c2lvbiBjYW4gcmVzdWx0IGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSBzdG9yYWdlIGZvcgorICAgKiAgX0Jhc2VfYml0c2V0IEBlIGlzIGEgcmVndWxhciBhcnJheSwgYW5kIGlzIGluZGV4ZWQgYXMgc3VjaC4gIFRoaXMgaXMKKyAgICogIGNhcmVmdWxseSBlbmNhcHN1bGF0ZWQuCisgICovCisgIHRlbXBsYXRlPHNpemVfdCBfTmI+CisgICAgY2xhc3MgYml0c2V0CisgICAgOiBwcml2YXRlIF9CYXNlX2JpdHNldDxfR0xJQkNYWF9CSVRTRVRfV09SRFMoX05iKT4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX0Jhc2VfYml0c2V0PF9HTElCQ1hYX0JJVFNFVF9XT1JEUyhfTmIpPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBfV29yZFQ7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX3Nhbml0aXplKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgCisJdHlwZWRlZiBfU2FuaXRpemU8X05iICUgX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQ+IF9fc2FuaXRpemVfdHlwZTsKKwlfX3Nhbml0aXplX3R5cGU6Ol9TX2RvX3Nhbml0aXplKHRoaXMtPl9NX2hpd29yZCgpKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lPiBmcmllbmQgc3RydWN0IGhhc2g7CisjZW5kaWYKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogIFRoaXMgZW5jYXBzdWxhdGVzIHRoZSBjb25jZXB0IG9mIGEgc2luZ2xlIGJpdC4gIEFuIGluc3RhbmNlIG9mIHRoaXMKKyAgICAgICAqICBjbGFzcyBpcyBhIHByb3h5IGZvciBhbiBhY3R1YWwgYml0OyB0aGlzIHdheSB0aGUgaW5kaXZpZHVhbCBiaXQKKyAgICAgICAqICBvcGVyYXRpb25zIGFyZSBkb25lIGFzIGZhc3RlciB3b3JkLXNpemUgYml0d2lzZSBpbnN0cnVjdGlvbnMuCisgICAgICAgKgorICAgICAgICogIE1vc3QgdXNlcnMgd2lsbCBuZXZlciBuZWVkIHRvIHVzZSB0aGlzIGNsYXNzIGRpcmVjdGx5OyBjb252ZXJzaW9ucworICAgICAgICogIHRvIGFuZCBmcm9tIGJvb2wgYXJlIGF1dG9tYXRpYyBhbmQgc2hvdWxkIGJlIHRyYW5zcGFyZW50LiAgT3ZlcmxvYWRlZAorICAgICAgICogIG9wZXJhdG9ycyBoZWxwIHRvIHByZXNlcnZlIHRoZSBpbGx1c2lvbi4KKyAgICAgICAqCisgICAgICAgKiAgKE9uIGEgdHlwaWNhbCBzeXN0ZW0sIHRoaXMgPGVtPmJpdCAlcmVmZXJlbmNlPC9lbT4gaXMgNjQKKyAgICAgICAqICB0aW1lcyB0aGUgc2l6ZSBvZiBhbiBhY3R1YWwgYml0LiAgSGEuKQorICAgICAgICovCisgICAgICBjbGFzcyByZWZlcmVuY2UKKyAgICAgIHsKKwlmcmllbmQgY2xhc3MgYml0c2V0OworCisJX1dvcmRUKglfTV93cDsKKwlzaXplX3QgCV9NX2Jwb3M7CisJCisJLy8gbGVmdCB1bmRlZmluZWQKKwlyZWZlcmVuY2UoKTsKKwkKKyAgICAgIHB1YmxpYzoKKwlyZWZlcmVuY2UoYml0c2V0JiBfX2IsIHNpemVfdCBfX3BvcykgX0dMSUJDWFhfTk9FWENFUFQKKwl7CisJICBfTV93cCA9ICZfX2IuX01fZ2V0d29yZChfX3Bvcyk7CisJICBfTV9icG9zID0gX0Jhc2U6Ol9TX3doaWNoYml0KF9fcG9zKTsKKwl9CisKKwl+cmVmZXJlbmNlKCkgX0dMSUJDWFhfTk9FWENFUFQKKwl7IH0KKworCS8vIEZvciBiW2ldID0gX194OworCXJlZmVyZW5jZSYKKwlvcGVyYXRvcj0oYm9vbCBfX3gpIF9HTElCQ1hYX05PRVhDRVBUCisJeworCSAgaWYgKF9feCkKKwkgICAgKl9NX3dwIHw9IF9CYXNlOjpfU19tYXNrYml0KF9NX2Jwb3MpOworCSAgZWxzZQorCSAgICAqX01fd3AgJj0gfl9CYXNlOjpfU19tYXNrYml0KF9NX2Jwb3MpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworCS8vIEZvciBiW2ldID0gYltfX2pdOworCXJlZmVyZW5jZSYKKwlvcGVyYXRvcj0oY29uc3QgcmVmZXJlbmNlJiBfX2opIF9HTElCQ1hYX05PRVhDRVBUCisJeworCSAgaWYgKCgqKF9fai5fTV93cCkgJiBfQmFzZTo6X1NfbWFza2JpdChfX2ouX01fYnBvcykpKQorCSAgICAqX01fd3AgfD0gX0Jhc2U6Ol9TX21hc2tiaXQoX01fYnBvcyk7CisJICBlbHNlCisJICAgICpfTV93cCAmPSB+X0Jhc2U6Ol9TX21hc2tiaXQoX01fYnBvcyk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisJLy8gRmxpcHMgdGhlIGJpdAorCWJvb2wKKwlvcGVyYXRvcn4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorCXsgcmV0dXJuICgqKF9NX3dwKSAmIF9CYXNlOjpfU19tYXNrYml0KF9NX2Jwb3MpKSA9PSAwOyB9CisKKwkvLyBGb3IgX194ID0gYltpXTsKKwlvcGVyYXRvciBib29sKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKwl7IHJldHVybiAoKihfTV93cCkgJiBfQmFzZTo6X1NfbWFza2JpdChfTV9icG9zKSkgIT0gMDsgfQorCisJLy8gRm9yIGJbaV0uZmxpcCgpOworCXJlZmVyZW5jZSYKKwlmbGlwKCkgX0dMSUJDWFhfTk9FWENFUFQKKwl7CisJICAqX01fd3AgXj0gX0Jhc2U6Ol9TX21hc2tiaXQoX01fYnBvcyk7CisJICByZXR1cm4gKnRoaXM7CisJfQorICAgICAgfTsKKyAgICAgIGZyaWVuZCBjbGFzcyByZWZlcmVuY2U7CisKKyAgICAgIC8vIDIzLjMuNS4xIGNvbnN0cnVjdG9yczoKKyAgICAgIC8vLyBBbGwgYml0cyBzZXQgdG8gemVyby4KKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBiaXRzZXQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyB9CisKKyAgICAgIC8vLyBJbml0aWFsIGJpdHMgYml0d2lzZS1jb3BpZWQgZnJvbSBhIHNpbmdsZSB3b3JkIChvdGhlcnMgc2V0IHRvIHplcm8pLgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGNvbnN0ZXhwciBiaXRzZXQodW5zaWduZWQgbG9uZyBsb25nIF9fdmFsKSBub2V4Y2VwdAorICAgICAgOiBfQmFzZShfU2FuaXRpemVfdmFsPF9OYj46Ol9TX2RvX3Nhbml0aXplX3ZhbChfX3ZhbCkpIHsgfQorI2Vsc2UKKyAgICAgIGJpdHNldCh1bnNpZ25lZCBsb25nIF9fdmFsKQorICAgICAgOiBfQmFzZShfX3ZhbCkKKyAgICAgIHsgX01fZG9fc2FuaXRpemUoKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIFVzZSBhIHN1YnNldCBvZiBhIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgQSBzdHJpbmcgb2YgQGEgMCBhbmQgQGEgMSBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgSW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiBAYSBfX3MgdG8gdXNlOworICAgICAgICogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRzIHRvIHplcm8uCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgcG9zIGlzIGJpZ2dlciB0aGUgc2l6ZSBvZiBAYSBfX3MuCisgICAgICAgKiAgQHRocm93ICBzdGQ6OmludmFsaWRfYXJndW1lbnQgIElmIGEgY2hhcmFjdGVyIGFwcGVhcnMgaW4gdGhlIHN0cmluZworICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBpcyBuZWl0aGVyIEBhIDAgbm9yIEBhIDEuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorCWV4cGxpY2l0CisJYml0c2V0KGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zLAorCSAgICAgICBzaXplX3QgX19wb3NpdGlvbiA9IDApCisJOiBfQmFzZSgpCisJeworCSAgaWYgKF9fcG9zaXRpb24gPiBfX3Muc2l6ZSgpKQorCSAgICBfX3Rocm93X291dF9vZl9yYW5nZShfX04oImJpdHNldDo6Yml0c2V0IGluaXRpYWwgcG9zaXRpb24gIgorCQkJCSAgICAgIm5vdCB2YWxpZCIpKTsKKwkgIF9NX2NvcHlfZnJvbV9zdHJpbmcoX19zLCBfX3Bvc2l0aW9uLAorCQkJICAgICAgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpucG9zLAorCQkJICAgICAgX0NoYXJUKCcwJyksIF9DaGFyVCgnMScpKTsKKwl9CisKKyAgICAgIC8qKgorICAgICAgICogIFVzZSBhIHN1YnNldCBvZiBhIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgQSBzdHJpbmcgb2YgQGEgMCBhbmQgQGEgMSBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgSW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiBAYSBfX3MgdG8gdXNlLgorICAgICAgICogIEBwYXJhbSAgX19uICAgIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBjb3B5LgorICAgICAgICogIEB0aHJvdyBzdGQ6Om91dF9vZl9yYW5nZSBJZiBAYSBfX3Bvc2l0aW9uIGlzIGJpZ2dlciB0aGUgc2l6ZQorICAgICAgICogIG9mIEBhIF9fcy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6aW52YWxpZF9hcmd1bWVudCAgSWYgYSBjaGFyYWN0ZXIgYXBwZWFycyBpbiB0aGUgc3RyaW5nCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGlzIG5laXRoZXIgQGEgMCBub3IgQGEgMS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisJYml0c2V0KGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zLAorCSAgICAgICBzaXplX3QgX19wb3NpdGlvbiwgc2l6ZV90IF9fbikKKwk6IF9CYXNlKCkKKwl7CisJICBpZiAoX19wb3NpdGlvbiA+IF9fcy5zaXplKCkpCisJICAgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiYml0c2V0OjpiaXRzZXQgaW5pdGlhbCBwb3NpdGlvbiAiCisJCQkJICAgICAibm90IHZhbGlkIikpOworCSAgX01fY29weV9mcm9tX3N0cmluZyhfX3MsIF9fcG9zaXRpb24sIF9fbiwgX0NoYXJUKCcwJyksIF9DaGFyVCgnMScpKTsKKwl9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDM5Ni4gd2hhdCBhcmUgY2hhcmFjdGVycyB6ZXJvIGFuZCBvbmUuCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKwliaXRzZXQoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3MsCisJICAgICAgIHNpemVfdCBfX3Bvc2l0aW9uLCBzaXplX3QgX19uLAorCSAgICAgICBfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSkKKwk6IF9CYXNlKCkKKwl7CisJICBpZiAoX19wb3NpdGlvbiA+IF9fcy5zaXplKCkpCisJICAgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiYml0c2V0OjpiaXRzZXQgaW5pdGlhbCBwb3NpdGlvbiAiCisJCQkJICAgICAibm90IHZhbGlkIikpOworCSAgX01fY29weV9mcm9tX3N0cmluZyhfX3MsIF9fcG9zaXRpb24sIF9fbiwgX196ZXJvLCBfX29uZSk7CisJfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQ29uc3RydWN0IGZyb20gYSBjaGFyYWN0ZXIgJWFycmF5LgorICAgICAgICogIEBwYXJhbSAgX19zdHIgIEFuICVhcnJheSBvZiBjaGFyYWN0ZXJzIEBhIHplcm8gYW5kIEBhIG9uZS4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gdXNlLgorICAgICAgICogIEBwYXJhbSAgX196ZXJvIFRoZSBjaGFyYWN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgdmFsdWUgMC4KKyAgICAgICAqICBAcGFyYW0gIF9fb25lICBUaGUgY2hhcmFjdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZhbHVlIDEuCisgICAgICAgKiAgQHRocm93ICBzdGQ6OmludmFsaWRfYXJndW1lbnQgSWYgYSBjaGFyYWN0ZXIgYXBwZWFycyBpbiB0aGUgc3RyaW5nCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggaXMgbmVpdGhlciBAYSBfX3plcm8gbm9yIEBhIF9fb25lLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIGJpdHNldChjb25zdCBfQ2hhclQqIF9fc3RyLAorCSAgICAgICB0eXBlbmFtZSBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQ+OjpzaXplX3R5cGUgX19uCisJICAgICAgID0gc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJUPjo6bnBvcywKKwkgICAgICAgX0NoYXJUIF9femVybyA9IF9DaGFyVCgnMCcpLCBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSkKKyAgICAgICAgOiBfQmFzZSgpCisgICAgICAgIHsKKwkgIGlmICghX19zdHIpCisJICAgIF9fdGhyb3dfbG9naWNfZXJyb3IoX19OKCJiaXRzZXQ6OmJpdHNldChjb25zdCBfQ2hhclQqLCAuLi4pIikpOworCisJICBpZiAoX19uID09IHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVD46Om5wb3MpCisJICAgIF9fbiA9IHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPjo6bGVuZ3RoKF9fc3RyKTsKKwkgIF9NX2NvcHlfZnJvbV9wdHI8X0NoYXJULCBzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD4+KF9fc3RyLCBfX24sIDAsCisJCQkJCQkJICAgICBfX24sIF9femVybywKKwkJCQkJCQkgICAgIF9fb25lKTsKKwl9CisjZW5kaWYKKworICAgICAgLy8gMjMuMy41LjIgYml0c2V0IG9wZXJhdGlvbnM6CisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBPcGVyYXRpb25zIG9uIGJpdHNldHMuCisgICAgICAgKiAgQHBhcmFtICBfX3JocyAgQSBzYW1lLXNpemVkIGJpdHNldC4KKyAgICAgICAqCisgICAgICAgKiAgVGhlc2Ugc2hvdWxkIGJlIHNlbGYtZXhwbGFuYXRvcnkuCisgICAgICAgKi8KKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgb3BlcmF0b3ImPShjb25zdCBiaXRzZXQ8X05iPiYgX19yaHMpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJdGhpcy0+X01fZG9fYW5kKF9fcmhzKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgb3BlcmF0b3J8PShjb25zdCBiaXRzZXQ8X05iPiYgX19yaHMpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJdGhpcy0+X01fZG9fb3IoX19yaHMpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBvcGVyYXRvcl49KGNvbnN0IGJpdHNldDxfTmI+JiBfX3JocykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwl0aGlzLT5fTV9kb194b3IoX19yaHMpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIC8vQH0KKyAgICAgIAorICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgT3BlcmF0aW9ucyBvbiBiaXRzZXRzLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgVGhlIG51bWJlciBvZiBwbGFjZXMgdG8gc2hpZnQuCisgICAgICAgKgorICAgICAgICogIFRoZXNlIHNob3VsZCBiZSBzZWxmLWV4cGxhbmF0b3J5LgorICAgICAgICovCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIG9wZXJhdG9yPDw9KHNpemVfdCBfX3Bvc2l0aW9uKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCWlmIChfX2J1aWx0aW5fZXhwZWN0KF9fcG9zaXRpb24gPCBfTmIsIDEpKQorCSAgeworCSAgICB0aGlzLT5fTV9kb19sZWZ0X3NoaWZ0KF9fcG9zaXRpb24pOworCSAgICB0aGlzLT5fTV9kb19zYW5pdGl6ZSgpOworCSAgfQorCWVsc2UKKwkgIHRoaXMtPl9NX2RvX3Jlc2V0KCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIG9wZXJhdG9yPj49KHNpemVfdCBfX3Bvc2l0aW9uKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCWlmIChfX2J1aWx0aW5fZXhwZWN0KF9fcG9zaXRpb24gPCBfTmIsIDEpKQorCSAgeworCSAgICB0aGlzLT5fTV9kb19yaWdodF9zaGlmdChfX3Bvc2l0aW9uKTsKKwkgICAgdGhpcy0+X01fZG9fc2FuaXRpemUoKTsKKwkgIH0KKwllbHNlCisJICB0aGlzLT5fTV9kb19yZXNldCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIC8vQH0KKyAgICAgIAorICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgVGhlc2UgdmVyc2lvbnMgb2Ygc2luZ2xlLWJpdCBzZXQsIHJlc2V0LCBmbGlwLCBhbmQgdGVzdCBhcmUKKyAgICAgICAqICBleHRlbnNpb25zIGZyb20gdGhlIFNHSSB2ZXJzaW9uLiAgVGhleSBkbyBubyByYW5nZSBjaGVja2luZy4KKyAgICAgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAgICAgKi8KKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgX1VuY2hlY2tlZF9zZXQoc2l6ZV90IF9fcG9zKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCXRoaXMtPl9NX2dldHdvcmQoX19wb3MpIHw9IF9CYXNlOjpfU19tYXNrYml0KF9fcG9zKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgX1VuY2hlY2tlZF9zZXQoc2l6ZV90IF9fcG9zLCBpbnQgX192YWwpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJaWYgKF9fdmFsKQorCSAgdGhpcy0+X01fZ2V0d29yZChfX3BvcykgfD0gX0Jhc2U6Ol9TX21hc2tiaXQoX19wb3MpOworCWVsc2UKKwkgIHRoaXMtPl9NX2dldHdvcmQoX19wb3MpICY9IH5fQmFzZTo6X1NfbWFza2JpdChfX3Bvcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIF9VbmNoZWNrZWRfcmVzZXQoc2l6ZV90IF9fcG9zKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCXRoaXMtPl9NX2dldHdvcmQoX19wb3MpICY9IH5fQmFzZTo6X1NfbWFza2JpdChfX3Bvcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIF9VbmNoZWNrZWRfZmxpcChzaXplX3QgX19wb3MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJdGhpcy0+X01fZ2V0d29yZChfX3BvcykgXj0gX0Jhc2U6Ol9TX21hc2tiaXQoX19wb3MpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICAgIF9VbmNoZWNrZWRfdGVzdChzaXplX3QgX19wb3MpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAoKHRoaXMtPl9NX2dldHdvcmQoX19wb3MpICYgX0Jhc2U6Ol9TX21hc2tiaXQoX19wb3MpKQorCQkhPSBzdGF0aWNfY2FzdDxfV29yZFQ+KDApKTsgfQorICAgICAgLy9AfQorICAgICAgCisgICAgICAvLyBTZXQsIHJlc2V0LCBhbmQgZmxpcC4KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBTZXRzIGV2ZXJ5IGJpdCB0byB0cnVlLgorICAgICAgICovCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIHNldCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJdGhpcy0+X01fZG9fc2V0KCk7CisJdGhpcy0+X01fZG9fc2FuaXRpemUoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBTZXRzIGEgZ2l2ZW4gYml0IHRvIGEgcGFydGljdWxhciB2YWx1ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIFRoZSBpbmRleCBvZiB0aGUgYml0LgorICAgICAgICogIEBwYXJhbSAgX192YWwgIEVpdGhlciB0cnVlIG9yIGZhbHNlLCBkZWZhdWx0cyB0byB0cnVlLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIHBvcyBpcyBiaWdnZXIgdGhlIHNpemUgb2YgdGhlICVzZXQuCisgICAgICAgKi8KKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgc2V0KHNpemVfdCBfX3Bvc2l0aW9uLCBib29sIF9fdmFsID0gdHJ1ZSkKKyAgICAgIHsKKwlpZiAoX19wb3NpdGlvbiA+PSBfTmIpCisJICBfX3Rocm93X291dF9vZl9yYW5nZShfX04oImJpdHNldDo6c2V0IikpOworCXJldHVybiBfVW5jaGVja2VkX3NldChfX3Bvc2l0aW9uLCBfX3ZhbCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBTZXRzIGV2ZXJ5IGJpdCB0byBmYWxzZS4KKyAgICAgICAqLworICAgICAgYml0c2V0PF9OYj4mCisgICAgICByZXNldCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJdGhpcy0+X01fZG9fcmVzZXQoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBTZXRzIGEgZ2l2ZW4gYml0IHRvIGZhbHNlLgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgVGhlIGluZGV4IG9mIHRoZSBiaXQuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgcG9zIGlzIGJpZ2dlciB0aGUgc2l6ZSBvZiB0aGUgJXNldC4KKyAgICAgICAqCisgICAgICAgKiAgU2FtZSBhcyB3cml0aW5nIEBjIHNldChwb3MsZmFsc2UpLgorICAgICAgICovCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIHJlc2V0KHNpemVfdCBfX3Bvc2l0aW9uKQorICAgICAgeworCWlmIChfX3Bvc2l0aW9uID49IF9OYikKKwkgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiYml0c2V0OjpyZXNldCIpKTsKKwlyZXR1cm4gX1VuY2hlY2tlZF9yZXNldChfX3Bvc2l0aW9uKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFRvZ2dsZXMgZXZlcnkgYml0IHRvIGl0cyBvcHBvc2l0ZSB2YWx1ZS4KKyAgICAgICAqLworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBmbGlwKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwl0aGlzLT5fTV9kb19mbGlwKCk7CisJdGhpcy0+X01fZG9fc2FuaXRpemUoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUb2dnbGVzIGEgZ2l2ZW4gYml0IHRvIGl0cyBvcHBvc2l0ZSB2YWx1ZS4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zaXRpb24gIFRoZSBpbmRleCBvZiB0aGUgYml0LgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIHBvcyBpcyBiaWdnZXIgdGhlIHNpemUgb2YgdGhlICVzZXQuCisgICAgICAgKi8KKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgZmxpcChzaXplX3QgX19wb3NpdGlvbikKKyAgICAgIHsKKwlpZiAoX19wb3NpdGlvbiA+PSBfTmIpCisJICBfX3Rocm93X291dF9vZl9yYW5nZShfX04oImJpdHNldDo6ZmxpcCIpKTsKKwlyZXR1cm4gX1VuY2hlY2tlZF9mbGlwKF9fcG9zaXRpb24pOworICAgICAgfQorICAgICAgCisgICAgICAvLy8gU2VlIHRoZSBuby1hcmd1bWVudCBmbGlwKCkuCisgICAgICBiaXRzZXQ8X05iPgorICAgICAgb3BlcmF0b3J+KCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGJpdHNldDxfTmI+KCp0aGlzKS5mbGlwKCk7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcnJheS1pbmRleGluZyBzdXBwb3J0LgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgSW5kZXggaW50byB0aGUgJWJpdHNldC4KKyAgICAgICAqICBAcmV0dXJuIEEgYm9vbCBmb3IgYSA8ZW0+Y29uc3QgJWJpdHNldDwvZW0+LiAgRm9yIG5vbi1jb25zdAorICAgICAgICogICAgICAgICAgIGJpdHNldHMsIGFuIGluc3RhbmNlIG9mIHRoZSByZWZlcmVuY2UgcHJveHkgY2xhc3MuCisgICAgICAgKiAgQG5vdGUgIFRoZXNlIG9wZXJhdG9ycyBkbyBubyByYW5nZSBjaGVja2luZyBhbmQgdGhyb3cgbm8gZXhjZXB0aW9ucywKKyAgICAgICAqICAgICAgICAgYXMgcmVxdWlyZWQgYnkgRFIgMTEgdG8gdGhlIHN0YW5kYXJkLgorICAgICAgICoKKyAgICAgICAqICBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTIE5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGFscmVhZHkKKyAgICAgICAqICByZXNvbHZlcyBEUiAxMSAoaXRlbXMgMSBhbmQgMiksIGJ1dCBkb2VzIG5vdCBkbyB0aGUgcmFuZ2UtY2hlY2tpbmcKKyAgICAgICAqICByZXF1aXJlZCBieSB0aGF0IERSJ3MgcmVzb2x1dGlvbi4gIC1wbWUKKyAgICAgICAqICBUaGUgRFIgaGFzIHNpbmNlIGJlZW4gY2hhbmdlZDogIHJhbmdlLWNoZWNraW5nIGlzIGEgcHJlY29uZGl0aW9uCisgICAgICAgKiAgKHVzZXJzJyByZXNwb25zaWJpbGl0eSksIGFuZCB0aGVzZSBmdW5jdGlvbnMgbXVzdCBub3QgdGhyb3cuICAtcG1lCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3QgX19wb3NpdGlvbikKKyAgICAgIHsgcmV0dXJuIHJlZmVyZW5jZSgqdGhpcywgX19wb3NpdGlvbik7IH0KKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90IF9fcG9zaXRpb24pIGNvbnN0CisgICAgICB7IHJldHVybiBfVW5jaGVja2VkX3Rlc3QoX19wb3NpdGlvbik7IH0KKyAgICAgIC8vQH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFJldHVybnMgYSBudW1lcmljYWwgaW50ZXJwcmV0YXRpb24gb2YgdGhlICViaXRzZXQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGludGVncmFsIGVxdWl2YWxlbnQgb2YgdGhlIGJpdHMuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om92ZXJmbG93X2Vycm9yICBJZiB0aGVyZSBhcmUgdG9vIG1hbnkgYml0cyB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gYW4gQGMgdW5zaWduZWQgQGMgbG9uZy4KKyAgICAgICAqLworICAgICAgdW5zaWduZWQgbG9uZworICAgICAgdG9fdWxvbmcoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fZG9fdG9fdWxvbmcoKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdW5zaWduZWQgbG9uZyBsb25nCisgICAgICB0b191bGxvbmcoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fZG9fdG9fdWxsb25nKCk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgUmV0dXJucyBhIGNoYXJhY3RlciBpbnRlcnByZXRhdGlvbiBvZiB0aGUgJWJpdHNldC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgc3RyaW5nIGVxdWl2YWxlbnQgb2YgdGhlIGJpdHMuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhlIG9yZGVyaW5nIG9mIHRoZSBiaXRzOiAgZGVjcmVhc2luZyBjaGFyYWN0ZXIgcG9zaXRpb25zCisgICAgICAgKiAgY29ycmVzcG9uZCB0byBpbmNyZWFzaW5nIGJpdCBwb3NpdGlvbnMgKHNlZSB0aGUgbWFpbiBjbGFzcyBub3RlcyBmb3IKKyAgICAgICAqICBhbiBleGFtcGxlKS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisJc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisJdG9fc3RyaW5nKCkgY29uc3QKKwl7CisJICBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gX19yZXN1bHQ7CisJICBfTV9jb3B5X3RvX3N0cmluZyhfX3Jlc3VsdCwgX0NoYXJUKCcwJyksIF9DaGFyVCgnMScpKTsKKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDM5Ni4gd2hhdCBhcmUgY2hhcmFjdGVycyB6ZXJvIGFuZCBvbmUuCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKwlzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKwl0b19zdHJpbmcoX0NoYXJUIF9femVybywgX0NoYXJUIF9fb25lID0gX0NoYXJUKCcxJykpIGNvbnN0CisJeworCSAgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9fcmVzdWx0OworCSAgX01fY29weV90b19zdHJpbmcoX19yZXN1bHQsIF9femVybywgX19vbmUpOworCSAgcmV0dXJuIF9fcmVzdWx0OworCX0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDM0LiBiaXRzZXQ6OnRvX3N0cmluZygpIGhhcmQgdG8gdXNlLgorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorCXN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+CisJdG9fc3RyaW5nKCkgY29uc3QKKwl7IHJldHVybiB0b19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4oKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA4NTMuIHRvX3N0cmluZyBuZWVkcyB1cGRhdGluZyB3aXRoIHplcm8gYW5kIG9uZS4KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKwlzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPgorCXRvX3N0cmluZyhfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSkgY29uc3QKKwl7IHJldHVybiB0b19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLAorCSAgICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4oX196ZXJvLCBfX29uZSk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUPgorCXN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+LAorCSAgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPgorCXRvX3N0cmluZygpIGNvbnN0CisJeworCSAgcmV0dXJuIHRvX3N0cmluZzxfQ2hhclQsIHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPiwKKwkgICAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+KCk7CisJfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQ+CisJc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD4sCisJICAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+CisJdG9fc3RyaW5nKF9DaGFyVCBfX3plcm8sIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpKSBjb25zdAorCXsKKwkgIHJldHVybiB0b19zdHJpbmc8X0NoYXJULCBzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD4sCisJICAgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPihfX3plcm8sIF9fb25lKTsKKwl9CisKKyAgICAgIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4sIHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4KKyAgICAgIHRvX3N0cmluZygpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIHRvX3N0cmluZzxjaGFyLCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+LAorCSAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8Y2hhcj4gPigpOworICAgICAgfQorCisgICAgICBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyLCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+LCBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+CisgICAgICB0b19zdHJpbmcoY2hhciBfX3plcm8sIGNoYXIgX19vbmUgPSAnMScpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIHRvX3N0cmluZzxjaGFyLCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+LAorCSAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8Y2hhcj4gPihfX3plcm8sIF9fb25lKTsKKyAgICAgIH0KKworICAgICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3Igc3RyaW5nIG9wZXJhdGlvbnMuCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fY29weV9mcm9tX3B0cihjb25zdCBfQ2hhclQqLCBzaXplX3QsIHNpemVfdCwgc2l6ZV90LAorCQkJIF9DaGFyVCwgX0NoYXJUKTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisJdm9pZAorCV9NX2NvcHlfZnJvbV9zdHJpbmcoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULAorCQkJICAgIF9UcmFpdHMsIF9BbGxvYz4mIF9fcywgc2l6ZV90IF9fcG9zLCBzaXplX3QgX19uLAorCQkJICAgIF9DaGFyVCBfX3plcm8sIF9DaGFyVCBfX29uZSkKKwl7IF9NX2NvcHlfZnJvbV9wdHI8X0NoYXJULCBfVHJhaXRzPihfX3MuZGF0YSgpLCBfX3Muc2l6ZSgpLCBfX3BvcywgX19uLAorCQkJCQkgICAgX196ZXJvLCBfX29uZSk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisJdm9pZAorICAgICAgICBfTV9jb3B5X3RvX3N0cmluZyhzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mLAorCQkJICBfQ2hhclQsIF9DaGFyVCkgY29uc3Q7CisKKyAgICAgIC8vIE5COiBCYWNrd2FyZCBjb21wYXQuCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKwl2b2lkCisJX01fY29weV9mcm9tX3N0cmluZyhjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsCisJCQkgICAgX1RyYWl0cywgX0FsbG9jPiYgX19zLCBzaXplX3QgX19wb3MsIHNpemVfdCBfX24pCisJeyBfTV9jb3B5X2Zyb21fc3RyaW5nKF9fcywgX19wb3MsIF9fbiwgX0NoYXJUKCcwJyksIF9DaGFyVCgnMScpKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKwl2b2lkCisgICAgICAgIF9NX2NvcHlfdG9fc3RyaW5nKHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cyxfQWxsb2M+JiBfX3MpIGNvbnN0CisJeyBfTV9jb3B5X3RvX3N0cmluZyhfX3MsIF9DaGFyVCgnMCcpLCBfQ2hhclQoJzEnKSk7IH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIHdoaWNoIGFyZSBzZXQuCisgICAgICBzaXplX3QKKyAgICAgIGNvdW50KCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2RvX2NvdW50KCk7IH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBiaXRzLgorICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIHNpemVfdAorICAgICAgc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTmI7IH0KKworICAgICAgLy9AeworICAgICAgLy8vIFRoZXNlIGNvbXBhcmlzb25zIGZvciBlcXVhbGl0eS9pbmVxdWFsaXR5IGFyZSwgd2VsbCwgQGUgYml0d2lzZS4KKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgYml0c2V0PF9OYj4mIF9fcmhzKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+X01faXNfZXF1YWwoX19yaHMpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgYml0c2V0PF9OYj4mIF9fcmhzKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gIXRoaXMtPl9NX2lzX2VxdWFsKF9fcmhzKTsgfQorICAgICAgLy9AfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgVGVzdHMgdGhlIHZhbHVlIG9mIGEgYml0LgorICAgICAgICogIEBwYXJhbSAgX19wb3NpdGlvbiAgVGhlIGluZGV4IG9mIGEgYml0LgorICAgICAgICogIEByZXR1cm4gIFRoZSB2YWx1ZSBhdCBAYSBwb3MuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgcG9zIGlzIGJpZ2dlciB0aGUgc2l6ZSBvZiB0aGUgJXNldC4KKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgdGVzdChzaXplX3QgX19wb3NpdGlvbikgY29uc3QKKyAgICAgIHsKKwlpZiAoX19wb3NpdGlvbiA+PSBfTmIpCisJICBfX3Rocm93X291dF9vZl9yYW5nZShfX04oImJpdHNldDo6dGVzdCIpKTsKKwlyZXR1cm4gX1VuY2hlY2tlZF90ZXN0KF9fcG9zaXRpb24pOworICAgICAgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiA2OTMuIHN0ZDo6Yml0c2V0OjphbGwoKSBtaXNzaW5nLgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFRlc3RzIHdoZXRoZXIgYWxsIHRoZSBiaXRzIGFyZSBvbi4KKyAgICAgICAqICBAcmV0dXJuICBUcnVlIGlmIGFsbCB0aGUgYml0cyBhcmUgc2V0LgorICAgICAgICovCisgICAgICBib29sCisgICAgICBhbGwoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+dGVtcGxhdGUgX01fYXJlX2FsbDxfTmI+KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFRlc3RzIHdoZXRoZXIgYW55IG9mIHRoZSBiaXRzIGFyZSBvbi4KKyAgICAgICAqICBAcmV0dXJuICBUcnVlIGlmIGF0IGxlYXN0IG9uZSBiaXQgaXMgc2V0LgorICAgICAgICovCisgICAgICBib29sCisgICAgICBhbnkoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+X01faXNfYW55KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFRlc3RzIHdoZXRoZXIgYW55IG9mIHRoZSBiaXRzIGFyZSBvbi4KKyAgICAgICAqICBAcmV0dXJuICBUcnVlIGlmIG5vbmUgb2YgdGhlIGJpdHMgYXJlIHNldC4KKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgbm9uZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAhdGhpcy0+X01faXNfYW55KCk7IH0KKworICAgICAgLy9AeworICAgICAgLy8vIFNlbGYtZXhwbGFuYXRvcnkuCisgICAgICBiaXRzZXQ8X05iPgorICAgICAgb3BlcmF0b3I8PChzaXplX3QgX19wb3NpdGlvbikgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGJpdHNldDxfTmI+KCp0aGlzKSA8PD0gX19wb3NpdGlvbjsgfQorCisgICAgICBiaXRzZXQ8X05iPgorICAgICAgb3BlcmF0b3I+PihzaXplX3QgX19wb3NpdGlvbikgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGJpdHNldDxfTmI+KCp0aGlzKSA+Pj0gX19wb3NpdGlvbjsgfQorICAgICAgLy9AfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmRzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgIm9uIiBiaXQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBiaXQgc2V0LCBvciBzaXplKCkgaWYgbm90IGZvdW5kLgorICAgICAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICAgICAqICBAc2EgIF9GaW5kX25leHQKKyAgICAgICAqLworICAgICAgc2l6ZV90CisgICAgICBfRmluZF9maXJzdCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5fTV9kb19maW5kX2ZpcnN0KF9OYik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgIm9uIiBiaXQgYWZ0ZXIgcHJldi4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgaW5kZXggb2YgdGhlIG5leHQgYml0IHNldCwgb3Igc2l6ZSgpIGlmIG5vdCBmb3VuZC4KKyAgICAgICAqICBAcGFyYW0gIF9fcHJldiAgV2hlcmUgdG8gc3RhcnQgc2VhcmNoaW5nLgorICAgICAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICAgICAqICBAc2EgIF9GaW5kX2ZpcnN0CisgICAgICAgKi8KKyAgICAgIHNpemVfdAorICAgICAgX0ZpbmRfbmV4dChzaXplX3QgX19wcmV2KSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fZG9fZmluZF9uZXh0KF9fcHJldiwgX05iKTsgfQorICAgIH07CisKKyAgLy8gRGVmaW5pdGlvbnMgb2Ygbm9uLWlubGluZSBtZW1iZXIgZnVuY3Rpb25zLgorICB0ZW1wbGF0ZTxzaXplX3QgX05iPgorICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgICAgIHZvaWQKKyAgICAgIGJpdHNldDxfTmI+OjoKKyAgICAgIF9NX2NvcHlfZnJvbV9wdHIoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdCBfX2xlbiwKKwkJICAgICAgIHNpemVfdCBfX3Bvcywgc2l6ZV90IF9fbiwgX0NoYXJUIF9femVybywgX0NoYXJUIF9fb25lKQorICAgICAgeworCXJlc2V0KCk7CisJY29uc3Qgc2l6ZV90IF9fbmJpdHMgPSBzdGQ6Om1pbihfTmIsIHN0ZDo6bWluKF9fbiwgc2l6ZV90KF9fbGVuIC0gX19wb3MpKSk7CisJZm9yIChzaXplX3QgX19pID0gX19uYml0czsgX19pID4gMDsgLS1fX2kpCisJICB7CisJICAgIGNvbnN0IF9DaGFyVCBfX2MgPSBfX3NbX19wb3MgKyBfX25iaXRzIC0gX19pXTsKKwkgICAgaWYgKF9UcmFpdHM6OmVxKF9fYywgX196ZXJvKSkKKwkgICAgICA7CisJICAgIGVsc2UgaWYgKF9UcmFpdHM6OmVxKF9fYywgX19vbmUpKQorCSAgICAgIF9VbmNoZWNrZWRfc2V0KF9faSAtIDEpOworCSAgICBlbHNlCisJICAgICAgX190aHJvd19pbnZhbGlkX2FyZ3VtZW50KF9fTigiYml0c2V0OjpfTV9jb3B5X2Zyb21fcHRyIikpOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHNpemVfdCBfTmI+CisgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisgICAgICB2b2lkCisgICAgICBiaXRzZXQ8X05iPjo6CisgICAgICBfTV9jb3B5X3RvX3N0cmluZyhzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fcywKKwkJCV9DaGFyVCBfX3plcm8sIF9DaGFyVCBfX29uZSkgY29uc3QKKyAgICAgIHsKKwlfX3MuYXNzaWduKF9OYiwgX196ZXJvKTsKKwlmb3IgKHNpemVfdCBfX2kgPSBfTmI7IF9faSA+IDA7IC0tX19pKQorCSAgaWYgKF9VbmNoZWNrZWRfdGVzdChfX2kgLSAxKSkKKwkgICAgX1RyYWl0czo6YXNzaWduKF9fc1tfTmIgLSBfX2ldLCBfX29uZSk7CisgICAgICB9CisKKyAgLy8gMjMuMy41LjMgYml0c2V0IG9wZXJhdGlvbnM6CisgIC8vQHsKKyAgLyoqCisgICAqICBAYnJpZWYgIEdsb2JhbCBiaXR3aXNlIG9wZXJhdGlvbnMgb24gYml0c2V0cy4KKyAgICogIEBwYXJhbSAgX194ICBBIGJpdHNldC4KKyAgICogIEBwYXJhbSAgX195ICBBIGJpdHNldCBvZiB0aGUgc2FtZSBzaXplIGFzIEBhIF9feC4KKyAgICogIEByZXR1cm4gIEEgbmV3IGJpdHNldC4KKyAgICoKKyAgICogIFRoZXNlIHNob3VsZCBiZSBzZWxmLWV4cGxhbmF0b3J5LgorICAqLworICB0ZW1wbGF0ZTxzaXplX3QgX05iPgorICAgIGlubGluZSBiaXRzZXQ8X05iPgorICAgIG9wZXJhdG9yJihjb25zdCBiaXRzZXQ8X05iPiYgX194LCBjb25zdCBiaXRzZXQ8X05iPiYgX195KSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGJpdHNldDxfTmI+IF9fcmVzdWx0KF9feCk7CisgICAgICBfX3Jlc3VsdCAmPSBfX3k7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlPHNpemVfdCBfTmI+CisgICAgaW5saW5lIGJpdHNldDxfTmI+CisgICAgb3BlcmF0b3J8KGNvbnN0IGJpdHNldDxfTmI+JiBfX3gsIGNvbnN0IGJpdHNldDxfTmI+JiBfX3kpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgYml0c2V0PF9OYj4gX19yZXN1bHQoX194KTsKKyAgICAgIF9fcmVzdWx0IHw9IF9feTsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgdGVtcGxhdGUgPHNpemVfdCBfTmI+CisgICAgaW5saW5lIGJpdHNldDxfTmI+CisgICAgb3BlcmF0b3JeKGNvbnN0IGJpdHNldDxfTmI+JiBfX3gsIGNvbnN0IGJpdHNldDxfTmI+JiBfX3kpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgYml0c2V0PF9OYj4gX19yZXN1bHQoX194KTsKKyAgICAgIF9fcmVzdWx0IF49IF9feTsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisgIC8vQH0KKworICAvL0B7CisgIC8qKgorICAgKiAgQGJyaWVmIEdsb2JhbCBJL08gb3BlcmF0b3JzIGZvciBiaXRzZXRzLgorICAgKgorICAgKiAgRGlyZWN0IEkvTyBiZXR3ZWVuIHN0cmVhbXMgYW5kIGJpdHNldHMgaXMgc3VwcG9ydGVkLiAgT3V0cHV0IGlzCisgICAqICBzdHJhaWdodGZvcndhcmQuICBJbnB1dCB3aWxsIHNraXAgd2hpdGVzcGFjZSwgb25seSBhY2NlcHQgQGEgMCBhbmQgQGEgMQorICAgKiAgY2hhcmFjdGVycywgYW5kIHdpbGwgb25seSBleHRyYWN0IGFzIG1hbnkgZGlnaXRzIGFzIHRoZSAlYml0c2V0IHdpbGwKKyAgICogIGhvbGQuCisgICovCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgc2l6ZV90IF9OYj4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLCBiaXRzZXQ8X05iPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzPiBfX3RtcDsKKyAgICAgIF9fdG1wLnJlc2VydmUoX05iKTsKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMzAzLiBCaXRzZXQgaW5wdXQgb3BlcmF0b3IgdW5kZXJzcGVjaWZpZWQKKyAgICAgIGNvbnN0IGNoYXJfdHlwZSBfX3plcm8gPSBfX2lzLndpZGVuKCcwJyk7CisgICAgICBjb25zdCBjaGFyX3R5cGUgX19vbmUgPSBfX2lzLndpZGVuKCcxJyk7CisKKyAgICAgIHR5cGVuYW1lIF9faW9zX2Jhc2U6Omlvc3RhdGUgX19zdGF0ZSA9IF9faW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6c2VudHJ5IF9fc2VudHJ5KF9faXMpOworICAgICAgaWYgKF9fc2VudHJ5KQorCXsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBmb3IgKHNpemVfdCBfX2kgPSBfTmI7IF9faSA+IDA7IC0tX19pKQorCQl7CisJCSAgc3RhdGljIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIF9fZW9mID0gX1RyYWl0czo6ZW9mKCk7CisJCSAgCisJCSAgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgX19jMSA9IF9faXMucmRidWYoKS0+c2J1bXBjKCk7CisJCSAgaWYgKF9UcmFpdHM6OmVxX2ludF90eXBlKF9fYzEsIF9fZW9mKSkKKwkJICAgIHsKKwkJICAgICAgX19zdGF0ZSB8PSBfX2lvc19iYXNlOjplb2ZiaXQ7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgY29uc3QgY2hhcl90eXBlIF9fYzIgPSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jMSk7CisJCSAgICAgIGlmIChfVHJhaXRzOjplcShfX2MyLCBfX3plcm8pKQorCQkJX190bXAucHVzaF9iYWNrKF9femVybyk7CisJCSAgICAgIGVsc2UgaWYgKF9UcmFpdHM6OmVxKF9fYzIsIF9fb25lKSkKKwkJCV9fdG1wLnB1c2hfYmFjayhfX29uZSk7CisJCSAgICAgIGVsc2UgaWYgKF9UcmFpdHM6OgorCQkJICAgICAgIGVxX2ludF90eXBlKF9faXMucmRidWYoKS0+c3B1dGJhY2tjKF9fYzIpLAorCQkJCQkgICBfX2VvZikpCisJCQl7CisJCQkgIF9fc3RhdGUgfD0gX19pb3NfYmFzZTo6ZmFpbGJpdDsKKwkJCSAgYnJlYWs7CisJCQl9CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgX19pcy5fTV9zZXRzdGF0ZShfX2lvc19iYXNlOjpiYWRiaXQpOwkJCisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IF9faXMuX01fc2V0c3RhdGUoX19pb3NfYmFzZTo6YmFkYml0KTsgfQorCX0KKworICAgICAgaWYgKF9fdG1wLmVtcHR5KCkgJiYgX05iKQorCV9fc3RhdGUgfD0gX19pb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgIGVsc2UKKwlfX3guX01fY29weV9mcm9tX3N0cmluZyhfX3RtcCwgc3RhdGljX2Nhc3Q8c2l6ZV90PigwKSwgX05iLAorCQkJCV9femVybywgX19vbmUpOworICAgICAgaWYgKF9fc3RhdGUpCisJX19pcy5zZXRzdGF0ZShfX3N0YXRlKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBzaXplX3QgX05iPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGJpdHNldDxfTmI+JiBfX3gpCisgICAgeworICAgICAgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzPiBfX3RtcDsKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMzk2LiB3aGF0IGFyZSBjaGFyYWN0ZXJzIHplcm8gYW5kIG9uZS4KKyAgICAgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3QgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fb3MuZ2V0bG9jKCkpOworICAgICAgX194Ll9NX2NvcHlfdG9fc3RyaW5nKF9fdG1wLCBfX2N0LndpZGVuKCcwJyksIF9fY3Qud2lkZW4oJzEnKSk7CisgICAgICByZXR1cm4gX19vcyA8PCBfX3RtcDsKKyAgICB9CisgIC8vQH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjdW5kZWYgX0dMSUJDWFhfQklUU0VUX1dPUkRTCisjdW5kZWYgX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQKKyN1bmRlZiBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfVUxMCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKKyNpbmNsdWRlIDxiaXRzL2Z1bmN0aW9uYWxfaGFzaC5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gRFIgMTE4Mi4KKyAgLy8vIHN0ZDo6aGFzaCBzcGVjaWFsaXphdGlvbiBmb3IgYml0c2V0LgorICB0ZW1wbGF0ZTxzaXplX3QgX05iPgorICAgIHN0cnVjdCBoYXNoPF9HTElCQ1hYX1NURF9DOjpiaXRzZXQ8X05iPj4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIF9HTElCQ1hYX1NURF9DOjpiaXRzZXQ8X05iPj4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0dMSUJDWFhfU1REX0M6OmJpdHNldDxfTmI+JiBfX2IpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7CisJY29uc3Qgc2l6ZV90IF9fY2xlbmd0aCA9IChfTmIgKyBfX0NIQVJfQklUX18gLSAxKSAvIF9fQ0hBUl9CSVRfXzsKKwlyZXR1cm4gc3RkOjpfSGFzaF9pbXBsOjpoYXNoKF9fYi5fTV9nZXRkYXRhKCksIF9fY2xlbmd0aCk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8X0dMSUJDWFhfU1REX0M6OmJpdHNldDwwPj4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIF9HTElCQ1hYX1NURF9DOjpiaXRzZXQ8MD4+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9HTElCQ1hYX1NURF9DOjpiaXRzZXQ8MD4mKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gMDsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIEMrKzExCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworIyBpbmNsdWRlIDxkZWJ1Zy9iaXRzZXQ+CisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1BST0ZJTEUKKyMgaW5jbHVkZSA8cHJvZmlsZS9iaXRzZXQ+CisjZW5kaWYKKworI2VuZGlmIC8qIF9HTElCQ1hYX0JJVFNFVCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jYXNzZXJ0IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jYXNzZXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODVjMjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2Nhc3NlcnQKQEAgLTAsMCArMSw0MyBAQAorLy8gLSotIEMrKyAtKi0gZm9yd2FyZGluZyBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBjYXNzZXJ0CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgYXNzZXJ0LmgsCisgKiAgYW5kIGl0cyBjb250ZW50cyBhcmUgKG1vc3RseSkgdGhlIHNhbWUgYXMgdGhhdCBoZWFkZXIsIGJ1dCBhcmUgYWxsCisgKiAgY29udGFpbmVkIGluIHRoZSBuYW1lc3BhY2UgQGMgc3RkIChleGNlcHQgZm9yIG5hbWVzIHdoaWNoIGFyZSBkZWZpbmVkCisgKiAgYXMgbWFjcm9zIGluIEMpLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAxOS4yICBBc3NlcnRpb25zCisvLworCisvLyBObyBpbmNsdWRlIGd1YXJkcyBvbiB0aGlzIGhlYWRlci4uLgorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2NvbXBsZXggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2Njb21wbGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOTg5OTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2Njb21wbGV4CkBAIC0wLDAgKzEsNDAgQEAKKy8vIDxjY29tcGxleD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY2NvbXBsZXgKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmbmRlZiBfR0xJQkNYWF9DQ09NUExFWAorI2RlZmluZSBfR0xJQkNYWF9DQ09NUExFWCAxCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGNvbXBsZXg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jY3R5cGUgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NjdHlwZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmY4ODNmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jY3R5cGUKQEAgLTAsMCArMSw5NCBAQAorLy8gLSotIEMrKyAtKi0gZm9yd2FyZGluZyBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2NjdHlwZQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBmaWxlLiAgWW91IHNob3VsZCBAYyBcI2luY2x1ZGUgdGhpcyBmaWxlCisgKiAgaW4geW91ciBwcm9ncmFtcywgcmF0aGVyIHRoYW4gYW55IG9mIHRoZSBAYSAqLmggaW1wbGVtZW50YXRpb24gZmlsZXMuCisgKgorICogIFRoaXMgaXMgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoZSBTdGFuZGFyZCBDIExpYnJhcnkgaGVhZGVyIEBjIGN0eXBlLmgsCisgKiAgYW5kIGl0cyBjb250ZW50cyBhcmUgKG1vc3RseSkgdGhlIHNhbWUgYXMgdGhhdCBoZWFkZXIsIGJ1dCBhcmUgYWxsCisgKiAgY29udGFpbmVkIGluIHRoZSBuYW1lc3BhY2UgQGMgc3RkIChleGNlcHQgZm9yIG5hbWVzIHdoaWNoIGFyZSBkZWZpbmVkCisgKiAgYXMgbWFjcm9zIGluIEMpLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiA8Y2N5dHBlPgorLy8KKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaWZuZGVmIF9HTElCQ1hYX0NDVFlQRQorI2RlZmluZSBfR0xJQkNYWF9DQ1RZUEUgMQorCisvLyBHZXQgcmlkIG9mIHRob3NlIG1hY3JvcyBkZWZpbmVkIGluIDxjdHlwZS5oPiBpbiBsaWV1IG9mIHJlYWwgZnVuY3Rpb25zLgorI3VuZGVmIGlzYWxudW0KKyN1bmRlZiBpc2FscGhhCisjdW5kZWYgaXNjbnRybAorI3VuZGVmIGlzZGlnaXQKKyN1bmRlZiBpc2dyYXBoCisjdW5kZWYgaXNsb3dlcgorI3VuZGVmIGlzcHJpbnQKKyN1bmRlZiBpc3B1bmN0CisjdW5kZWYgaXNzcGFjZQorI3VuZGVmIGlzdXBwZXIKKyN1bmRlZiBpc3hkaWdpdAorI3VuZGVmIHRvbG93ZXIKKyN1bmRlZiB0b3VwcGVyCisKK25hbWVzcGFjZSBzdGQKK3sKKyAgdXNpbmcgOjppc2FsbnVtOworICB1c2luZyA6OmlzYWxwaGE7CisgIHVzaW5nIDo6aXNjbnRybDsKKyAgdXNpbmcgOjppc2RpZ2l0OworICB1c2luZyA6OmlzZ3JhcGg7CisgIHVzaW5nIDo6aXNsb3dlcjsKKyAgdXNpbmcgOjppc3ByaW50OworICB1c2luZyA6OmlzcHVuY3Q7CisgIHVzaW5nIDo6aXNzcGFjZTsKKyAgdXNpbmcgOjppc3VwcGVyOworICB1c2luZyA6OmlzeGRpZ2l0OworICB1c2luZyA6OnRvbG93ZXI7CisgIHVzaW5nIDo6dG91cHBlcjsKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisjaWZkZWYgX0dMSUJDWFhfVVNFX0M5OV9DVFlQRV9UUjEKKworI3VuZGVmIGlzYmxhbmsKKworbmFtZXNwYWNlIHN0ZAoreworICB1c2luZyA6OmlzYmxhbms7Cit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8vIF9HTElCQ1hYX1VTRV9DOTlfQ1RZUEVfVFIxCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2Vycm5vIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jZXJybm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1Y2M0ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2Vycm5vCkBAIC0wLDAgKzEsNTEgQEAKKy8vIFRoZSAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGNlcnJubworICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBmaWxlLiAgWW91IHNob3VsZCBAYyBcI2luY2x1ZGUgdGhpcyBmaWxlCisgKiAgaW4geW91ciBwcm9ncmFtcywgcmF0aGVyIHRoYW4gYW55IG9mIHRoZSBAYSAqLmggaW1wbGVtZW50YXRpb24gZmlsZXMuCisgKgorICogIFRoaXMgaXMgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoZSBTdGFuZGFyZCBDIExpYnJhcnkgaGVhZGVyIEBjIGVycm5vLmgsCisgKiAgYW5kIGl0cyBjb250ZW50cyBhcmUgKG1vc3RseSkgdGhlIHNhbWUgYXMgdGhhdCBoZWFkZXIsIGJ1dCBhcmUgYWxsCisgKiAgY29udGFpbmVkIGluIHRoZSBuYW1lc3BhY2UgQGMgc3RkIChleGNlcHQgZm9yIG5hbWVzIHdoaWNoIGFyZSBkZWZpbmVkCisgKiAgYXMgbWFjcm9zIGluIEMpLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAxOS4zICBFcnJvciBudW1iZXJzCisvLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaWZuZGVmIF9HTElCQ1hYX0NFUlJOTworI2RlZmluZSBfR0xJQkNYWF9DRVJSTk8gMQorCisvLyBBZGhlcmUgdG8gc2VjdGlvbiAxNy40LjEuMiBjbGF1c2UgNSBvZiBJU08gMTQ4ODI6MTk5OAorI2lmbmRlZiBlcnJubworI2RlZmluZSBlcnJubyBlcnJubworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jZmVudiBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2ZlbnYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI5NmMxNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2ZlbnYKQEAgLTAsMCArMSw4NCBAQAorLy8gPGNmZW52PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9jZmVudgorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9DRkVOVgorI2RlZmluZSBfR0xJQkNYWF9DRkVOViAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCisjaWYgX0dMSUJDWFhfSEFWRV9GRU5WX0gKKyMgaW5jbHVkZSA8ZmVudi5oPgorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X0ZFTlZfVFIxCisKKyN1bmRlZiBmZWNsZWFyZXhjZXB0CisjdW5kZWYgZmVnZXRleGNlcHRmbGFnCisjdW5kZWYgZmVyYWlzZWV4Y2VwdAorI3VuZGVmIGZlc2V0ZXhjZXB0ZmxhZworI3VuZGVmIGZldGVzdGV4Y2VwdAorI3VuZGVmIGZlZ2V0cm91bmQKKyN1bmRlZiBmZXNldHJvdW5kCisjdW5kZWYgZmVnZXRlbnYKKyN1bmRlZiBmZWhvbGRleGNlcHQKKyN1bmRlZiBmZXNldGVudgorI3VuZGVmIGZldXBkYXRlZW52CisKK25hbWVzcGFjZSBzdGQKK3sKKyAgLy8gdHlwZXMKKyAgdXNpbmcgOjpmZW52X3Q7CisgIHVzaW5nIDo6ZmV4Y2VwdF90OworCisgIC8vIGZ1bmN0aW9ucworICB1c2luZyA6OmZlY2xlYXJleGNlcHQ7CisgIHVzaW5nIDo6ZmVnZXRleGNlcHRmbGFnOworICB1c2luZyA6OmZlcmFpc2VleGNlcHQ7CisgIHVzaW5nIDo6ZmVzZXRleGNlcHRmbGFnOworICB1c2luZyA6OmZldGVzdGV4Y2VwdDsKKworICB1c2luZyA6OmZlZ2V0cm91bmQ7CisgIHVzaW5nIDo6ZmVzZXRyb3VuZDsKKworICB1c2luZyA6OmZlZ2V0ZW52OworICB1c2luZyA6OmZlaG9sZGV4Y2VwdDsKKyAgdXNpbmcgOjpmZXNldGVudjsKKyAgdXNpbmcgOjpmZXVwZGF0ZWVudjsKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gX0dMSUJDWFhfVVNFX0M5OV9GRU5WX1RSMQorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vIF9HTElCQ1hYX0NGRU5WCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NmbG9hdCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2Zsb2F0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYjA2MzIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NmbG9hdApAQCAtMCwwICsxLDU1IEBACisvLyAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY2Zsb2F0CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgZmxvYXQuaCwKKyAqICBhbmQgaXRzIGNvbnRlbnRzIGFyZSAobW9zdGx5KSB0aGUgc2FtZSBhcyB0aGF0IGhlYWRlciwgYnV0IGFyZSBhbGwKKyAqICBjb250YWluZWQgaW4gdGhlIG5hbWVzcGFjZSBAYyBzdGQgKGV4Y2VwdCBmb3IgbmFtZXMgd2hpY2ggYXJlIGRlZmluZWQKKyAqICBhcyBtYWNyb3MgaW4gQykuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDE4LjIuMiAgSW1wbGVtZW50YXRpb24gcHJvcGVydGllczogQyBsaWJyYXJ5CisvLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorCisjaWZuZGVmIF9HTElCQ1hYX0NGTE9BVAorI2RlZmluZSBfR0xJQkNYWF9DRkxPQVQgMQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorIyAgaWZuZGVmIERFQ0lNQUxfRElHCisjICAgIGRlZmluZSBERUNJTUFMX0RJRyBfX0RFQ0lNQUxfRElHX18KKyMgIGVuZGlmCisjICBpZm5kZWYgRkxUX0VWQUxfTUVUSE9ECisjICAgIGRlZmluZSBGTFRfRVZBTF9NRVRIT0QgX19GTFRfRVZBTF9NRVRIT0RfXworIyAgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2hyb25vIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jaHJvbm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ5ZGY3ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2hyb25vCkBAIC0wLDAgKzEsNzg5IEBACisvLyA8Y2hyb25vPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9jaHJvbm8KKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQ0hST05PCisjZGVmaW5lIF9HTElCQ1hYX0NIUk9OTyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxyYXRpbz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8Y3RpbWU+CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CisgIC8qKgorICAgKiBAZGVmZ3JvdXAgY2hyb25vIFRpbWUKKyAgICogQGluZ3JvdXAgdXRpbGl0aWVzCisgICAqCisgICAqIENsYXNzZXMgYW5kIGZ1bmN0aW9ucyBmb3IgdGltZS4KKyAgICogQHsKKyAgICovCisKKyAgLyoqIEBuYW1lc3BhY2Ugc3RkOjpjaHJvbm8KKyAgICogIEBicmllZiBJU08gQysrIDIwMTEgZW50aXRpZXMgc3ViLW5hbWVzcGFjZSBmb3IgdGltZSBhbmQgZGF0ZS4KKyAgICovCisgIG5hbWVzcGFjZSBjaHJvbm8KKyAgeworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcCwgdHlwZW5hbWUgX1BlcmlvZCA9IHJhdGlvPDE+PgorICAgICAgc3RydWN0IGR1cmF0aW9uOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Nsb2NrLCB0eXBlbmFtZSBfRHVyID0gdHlwZW5hbWUgX0Nsb2NrOjpkdXJhdGlvbj4KKyAgICAgIHN0cnVjdCB0aW1lX3BvaW50OworCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9CisKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gMjAuMTEuNC4zIHNwZWNpYWxpemF0aW9uIG9mIGNvbW1vbl90eXBlIChmb3IgZHVyYXRpb24sIHNmaW5hZS1mcmllbmRseSkKKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DVCwgdHlwZW5hbWUgX1BlcmlvZDEsIHR5cGVuYW1lIF9QZXJpb2QyPgorICAgIHN0cnVjdCBfX2R1cmF0aW9uX2NvbW1vbl90eXBlX3dyYXBwZXIKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX19zdGF0aWNfZ2NkPF9QZXJpb2QxOjpudW0sIF9QZXJpb2QyOjpudW0+IF9fZ2NkX251bTsKKyAgICAgIHR5cGVkZWYgX19zdGF0aWNfZ2NkPF9QZXJpb2QxOjpkZW4sIF9QZXJpb2QyOjpkZW4+IF9fZ2NkX2RlbjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NUOjp0eXBlIF9fY3I7CisgICAgICB0eXBlZGVmIHJhdGlvPF9fZ2NkX251bTo6dmFsdWUsCisgICAgICAgIChfUGVyaW9kMTo6ZGVuIC8gX19nY2RfZGVuOjp2YWx1ZSkgKiBfUGVyaW9kMjo6ZGVuPiBfX3I7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfX3N1Y2Nlc3NfdHlwZTxjaHJvbm86OmR1cmF0aW9uPF9fY3IsIF9fcj4+IHR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGVyaW9kMSwgdHlwZW5hbWUgX1BlcmlvZDI+CisgICAgc3RydWN0IF9fZHVyYXRpb25fY29tbW9uX3R5cGVfd3JhcHBlcjxfX2ZhaWx1cmVfdHlwZSwgX1BlcmlvZDEsIF9QZXJpb2QyPgorICAgIHsgdHlwZWRlZiBfX2ZhaWx1cmVfdHlwZSB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAxLCB0eXBlbmFtZSBfUGVyaW9kMSwgdHlwZW5hbWUgX1JlcDIsIHR5cGVuYW1lIF9QZXJpb2QyPgorICAgIHN0cnVjdCBjb21tb25fdHlwZTxjaHJvbm86OmR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4sCisgICAgICAgICAgICAgY2hyb25vOjpkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+PgorICAgIDogcHVibGljIF9fZHVyYXRpb25fY29tbW9uX3R5cGVfd3JhcHBlcjx0eXBlbmFtZSBfX21lbWJlcl90eXBlX3dyYXBwZXI8CisgICAgICAgICAgICAgY29tbW9uX3R5cGU8X1JlcDEsIF9SZXAyPj46OnR5cGUsIF9QZXJpb2QxLCBfUGVyaW9kMj46OnR5cGUKKyAgICB7IH07CisKKyAgLy8gMjAuMTEuNC4zIHNwZWNpYWxpemF0aW9uIG9mIGNvbW1vbl90eXBlIChmb3IgdGltZV9wb2ludCwgc2ZpbmFlLWZyaWVuZGx5KQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NULCB0eXBlbmFtZSBfQ2xvY2s+CisgICAgc3RydWN0IF9fdGltZXBvaW50X2NvbW1vbl90eXBlX3dyYXBwZXIKKyAgICB7CisgICAgICB0eXBlZGVmIF9fc3VjY2Vzc190eXBlPGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIHR5cGVuYW1lIF9DVDo6dHlwZT4+CisgICAgICAgIHR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2s+CisgICAgc3RydWN0IF9fdGltZXBvaW50X2NvbW1vbl90eXBlX3dyYXBwZXI8X19mYWlsdXJlX3R5cGUsIF9DbG9jaz4KKyAgICB7IHR5cGVkZWYgX19mYWlsdXJlX3R5cGUgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXJhdGlvbjEsIHR5cGVuYW1lIF9EdXJhdGlvbjI+CisgICAgc3RydWN0IGNvbW1vbl90eXBlPGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbjE+LAorICAgICAgICAgICAgIGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbjI+PgorICAgIDogcHVibGljIF9fdGltZXBvaW50X2NvbW1vbl90eXBlX3dyYXBwZXI8dHlwZW5hbWUgX19tZW1iZXJfdHlwZV93cmFwcGVyPAorICAgICAgICAgICAgIGNvbW1vbl90eXBlPF9EdXJhdGlvbjEsIF9EdXJhdGlvbjI+Pjo6dHlwZSwgX0Nsb2NrPjo6dHlwZQorICAgIHsgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgbmFtZXNwYWNlIGNocm9ubworICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICAvLyBQcmltYXJ5IHRlbXBsYXRlIGZvciBkdXJhdGlvbl9jYXN0IGltcGwuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RvRHVyLCB0eXBlbmFtZSBfQ0YsIHR5cGVuYW1lIF9DUiwKKwkgICAgIGJvb2wgX051bUlzT25lID0gZmFsc2UsIGJvb2wgX0RlbklzT25lID0gZmFsc2U+CisgICAgICBzdHJ1Y3QgX19kdXJhdGlvbl9jYXN0X2ltcGwKKyAgICAgIHsKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kPgorCSAgc3RhdGljIGNvbnN0ZXhwciBfVG9EdXIKKwkgIF9fY2FzdChjb25zdCBkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19kKQorCSAgeworCSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ub0R1cjo6cmVwCQkJX190b19yZXA7CisJICAgIHJldHVybiBfVG9EdXIoc3RhdGljX2Nhc3Q8X190b19yZXA+KHN0YXRpY19jYXN0PF9DUj4oX19kLmNvdW50KCkpCisJICAgICAgKiBzdGF0aWNfY2FzdDxfQ1I+KF9DRjo6bnVtKQorCSAgICAgIC8gc3RhdGljX2Nhc3Q8X0NSPihfQ0Y6OmRlbikpKTsKKwkgIH0KKyAgICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG9EdXIsIHR5cGVuYW1lIF9DRiwgdHlwZW5hbWUgX0NSPgorICAgICAgc3RydWN0IF9fZHVyYXRpb25fY2FzdF9pbXBsPF9Ub0R1ciwgX0NGLCBfQ1IsIHRydWUsIHRydWU+CisgICAgICB7CisJdGVtcGxhdGU8dHlwZW5hbWUgX1JlcCwgdHlwZW5hbWUgX1BlcmlvZD4KKwkgIHN0YXRpYyBjb25zdGV4cHIgX1RvRHVyCisJICBfX2Nhc3QoY29uc3QgZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fZCkKKwkgIHsKKwkgICAgdHlwZWRlZiB0eXBlbmFtZSBfVG9EdXI6OnJlcAkJCV9fdG9fcmVwOworCSAgICByZXR1cm4gX1RvRHVyKHN0YXRpY19jYXN0PF9fdG9fcmVwPihfX2QuY291bnQoKSkpOworCSAgfQorICAgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ub0R1ciwgdHlwZW5hbWUgX0NGLCB0eXBlbmFtZSBfQ1I+CisgICAgICBzdHJ1Y3QgX19kdXJhdGlvbl9jYXN0X2ltcGw8X1RvRHVyLCBfQ0YsIF9DUiwgdHJ1ZSwgZmFsc2U+CisgICAgICB7CisJdGVtcGxhdGU8dHlwZW5hbWUgX1JlcCwgdHlwZW5hbWUgX1BlcmlvZD4KKwkgIHN0YXRpYyBjb25zdGV4cHIgX1RvRHVyCisJICBfX2Nhc3QoY29uc3QgZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fZCkKKwkgIHsKKwkgICAgdHlwZWRlZiB0eXBlbmFtZSBfVG9EdXI6OnJlcAkJCV9fdG9fcmVwOworCSAgICByZXR1cm4gX1RvRHVyKHN0YXRpY19jYXN0PF9fdG9fcmVwPigKKwkgICAgICBzdGF0aWNfY2FzdDxfQ1I+KF9fZC5jb3VudCgpKSAvIHN0YXRpY19jYXN0PF9DUj4oX0NGOjpkZW4pKSk7CisJICB9CisgICAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RvRHVyLCB0eXBlbmFtZSBfQ0YsIHR5cGVuYW1lIF9DUj4KKyAgICAgIHN0cnVjdCBfX2R1cmF0aW9uX2Nhc3RfaW1wbDxfVG9EdXIsIF9DRiwgX0NSLCBmYWxzZSwgdHJ1ZT4KKyAgICAgIHsKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kPgorCSAgc3RhdGljIGNvbnN0ZXhwciBfVG9EdXIKKwkgIF9fY2FzdChjb25zdCBkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19kKQorCSAgeworCSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ub0R1cjo6cmVwCQkJX190b19yZXA7CisJICAgIHJldHVybiBfVG9EdXIoc3RhdGljX2Nhc3Q8X190b19yZXA+KAorCSAgICAgIHN0YXRpY19jYXN0PF9DUj4oX19kLmNvdW50KCkpICogc3RhdGljX2Nhc3Q8X0NSPihfQ0Y6Om51bSkpKTsKKwkgIH0KKyAgICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBzdHJ1Y3QgX19pc19kdXJhdGlvbgorICAgICAgOiBzdGQ6OmZhbHNlX3R5cGUKKyAgICAgIHsgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAsIHR5cGVuYW1lIF9QZXJpb2Q+CisgICAgICBzdHJ1Y3QgX19pc19kdXJhdGlvbjxkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPj4KKyAgICAgIDogc3RkOjp0cnVlX3R5cGUKKyAgICAgIHsgfTsKKworICAgIC8vLyBkdXJhdGlvbl9jYXN0CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RvRHVyLCB0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kPgorICAgICAgY29uc3RleHByIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX2R1cmF0aW9uPF9Ub0R1cj46OnZhbHVlLAorCQkJCSAgIF9Ub0R1cj46OnR5cGUKKyAgICAgIGR1cmF0aW9uX2Nhc3QoY29uc3QgZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fZCkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9Ub0R1cjo6cGVyaW9kCQkJCV9fdG9fcGVyaW9kOworCXR5cGVkZWYgdHlwZW5hbWUgX1RvRHVyOjpyZXAJCQkJX190b19yZXA7CisJdHlwZWRlZiByYXRpb19kaXZpZGU8X1BlcmlvZCwgX190b19wZXJpb2Q+IAkJX19jZjsKKwl0eXBlZGVmIHR5cGVuYW1lIGNvbW1vbl90eXBlPF9fdG9fcmVwLCBfUmVwLCBpbnRtYXhfdD46OnR5cGUKKwkgIAkJCQkJCQlfX2NyOworCXR5cGVkZWYgIF9fZHVyYXRpb25fY2FzdF9pbXBsPF9Ub0R1ciwgX19jZiwgX19jciwKKwkJCQkgICAgICBfX2NmOjpudW0gPT0gMSwgX19jZjo6ZGVuID09IDE+IF9fZGM7CisJcmV0dXJuIF9fZGM6Ol9fY2FzdChfX2QpOworICAgICAgfQorCisgICAgLy8vIHRyZWF0X2FzX2Zsb2F0aW5nX3BvaW50CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcD4KKyAgICAgIHN0cnVjdCB0cmVhdF9hc19mbG9hdGluZ19wb2ludAorICAgICAgOiBpc19mbG9hdGluZ19wb2ludDxfUmVwPgorICAgICAgeyB9OworCisgICAgLy8vIGR1cmF0aW9uX3ZhbHVlcworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXA+CisgICAgICBzdHJ1Y3QgZHVyYXRpb25fdmFsdWVzCisgICAgICB7CisJc3RhdGljIGNvbnN0ZXhwciBfUmVwCisJemVybygpCisJeyByZXR1cm4gX1JlcCgwKTsgfQorCisJc3RhdGljIGNvbnN0ZXhwciBfUmVwCisJbWF4KCkKKwl7IHJldHVybiBudW1lcmljX2xpbWl0czxfUmVwPjo6bWF4KCk7IH0KKworCXN0YXRpYyBjb25zdGV4cHIgX1JlcAorCW1pbigpCisJeyByZXR1cm4gbnVtZXJpY19saW1pdHM8X1JlcD46Omxvd2VzdCgpOyB9CisgICAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgc3RydWN0IF9faXNfcmF0aW8KKyAgICAgIDogc3RkOjpmYWxzZV90eXBlCisgICAgICB7IH07CisKKyAgICB0ZW1wbGF0ZTxpbnRtYXhfdCBfTnVtLCBpbnRtYXhfdCBfRGVuPgorICAgICAgc3RydWN0IF9faXNfcmF0aW88cmF0aW88X051bSwgX0Rlbj4+CisgICAgICA6IHN0ZDo6dHJ1ZV90eXBlCisgICAgICB7IH07CisKKyAgICAvLy8gZHVyYXRpb24KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kPgorICAgICAgc3RydWN0IGR1cmF0aW9uCisgICAgICB7CisJdHlwZWRlZiBfUmVwCQkJCQkJcmVwOworCXR5cGVkZWYgX1BlcmlvZCAJCQkJCXBlcmlvZDsKKworCXN0YXRpY19hc3NlcnQoIV9faXNfZHVyYXRpb248X1JlcD46OnZhbHVlLCAicmVwIGNhbm5vdCBiZSBhIGR1cmF0aW9uIik7CisJc3RhdGljX2Fzc2VydChfX2lzX3JhdGlvPF9QZXJpb2Q+Ojp2YWx1ZSwKKwkJICAgICAgInBlcmlvZCBtdXN0IGJlIGEgc3BlY2lhbGl6YXRpb24gb2YgcmF0aW8iKTsKKwlzdGF0aWNfYXNzZXJ0KF9QZXJpb2Q6Om51bSA+IDAsICJwZXJpb2QgbXVzdCBiZSBwb3NpdGl2ZSIpOworCisJLy8gMjAuMTEuNS4xIGNvbnN0cnVjdGlvbiAvIGNvcHkgLyBkZXN0cm95CisJY29uc3RleHByIGR1cmF0aW9uKCkgPSBkZWZhdWx0OworCisJLy8gTkI6IE1ha2UgY29uc3RleHByIGltcGxpY2l0LiBUaGlzIGNhbm5vdCBiZSBleHBsaWNpdGx5CisJLy8gY29uc3RleHByLCBhcyBhbnkgVURUIHRoYXQgaXMgbm90IGEgbGl0ZXJhbCB0eXBlIHdpdGggYQorCS8vIGNvbnN0ZXhwciBjb3B5IGNvbnN0cnVjdG9yIHdpbGwgYmUgaWxsLWZvcm1lZC4KKwlkdXJhdGlvbihjb25zdCBkdXJhdGlvbiYpID0gZGVmYXVsdDsKKworCXRlbXBsYXRlPHR5cGVuYW1lIF9SZXAyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIGVuYWJsZV9pZjxpc19jb252ZXJ0aWJsZTxfUmVwMiwgcmVwPjo6dmFsdWUKKwkJCSAmJiAodHJlYXRfYXNfZmxvYXRpbmdfcG9pbnQ8cmVwPjo6dmFsdWUKKwkJCSAgICAgfHwgIXRyZWF0X2FzX2Zsb2F0aW5nX3BvaW50PF9SZXAyPjo6dmFsdWUpPjo6dHlwZT4KKwkgIGNvbnN0ZXhwciBleHBsaWNpdCBkdXJhdGlvbihjb25zdCBfUmVwMiYgX19yZXApCisJICA6IF9fcihzdGF0aWNfY2FzdDxyZXA+KF9fcmVwKSkgeyB9CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMiwgdHlwZW5hbWUgX1BlcmlvZDIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgZW5hYmxlX2lmPHRyZWF0X2FzX2Zsb2F0aW5nX3BvaW50PHJlcD46OnZhbHVlCisJCQkgfHwgKHJhdGlvX2RpdmlkZTxfUGVyaW9kMiwgcGVyaW9kPjo6ZGVuID09IDEKKwkJCSAgICAgJiYgIXRyZWF0X2FzX2Zsb2F0aW5nX3BvaW50PF9SZXAyPjo6dmFsdWUpPjo6dHlwZT4KKwkgIGNvbnN0ZXhwciBkdXJhdGlvbihjb25zdCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+JiBfX2QpCisJICA6IF9fcihkdXJhdGlvbl9jYXN0PGR1cmF0aW9uPihfX2QpLmNvdW50KCkpIHsgfQorCisJfmR1cmF0aW9uKCkgPSBkZWZhdWx0OworCWR1cmF0aW9uJiBvcGVyYXRvcj0oY29uc3QgZHVyYXRpb24mKSA9IGRlZmF1bHQ7CisKKwkvLyAyMC4xMS41LjIgb2JzZXJ2ZXIKKwljb25zdGV4cHIgcmVwCisJY291bnQoKSBjb25zdAorCXsgcmV0dXJuIF9fcjsgfQorCisJLy8gMjAuMTEuNS4zIGFyaXRobWV0aWMKKwljb25zdGV4cHIgZHVyYXRpb24KKwlvcGVyYXRvcisoKSBjb25zdAorCXsgcmV0dXJuICp0aGlzOyB9CisKKwljb25zdGV4cHIgZHVyYXRpb24KKwlvcGVyYXRvci0oKSBjb25zdAorCXsgcmV0dXJuIGR1cmF0aW9uKC1fX3IpOyB9CisKKwlkdXJhdGlvbiYKKwlvcGVyYXRvcisrKCkKKwl7CisJICArK19fcjsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKwlkdXJhdGlvbgorCW9wZXJhdG9yKysoaW50KQorCXsgcmV0dXJuIGR1cmF0aW9uKF9fcisrKTsgfQorCisJZHVyYXRpb24mCisJb3BlcmF0b3ItLSgpCisJeworCSAgLS1fX3I7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisJZHVyYXRpb24KKwlvcGVyYXRvci0tKGludCkKKwl7IHJldHVybiBkdXJhdGlvbihfX3ItLSk7IH0KKworCWR1cmF0aW9uJgorCW9wZXJhdG9yKz0oY29uc3QgZHVyYXRpb24mIF9fZCkKKwl7CisJICBfX3IgKz0gX19kLmNvdW50KCk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisJZHVyYXRpb24mCisJb3BlcmF0b3ItPShjb25zdCBkdXJhdGlvbiYgX19kKQorCXsKKwkgIF9fciAtPSBfX2QuY291bnQoKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKwlkdXJhdGlvbiYKKwlvcGVyYXRvcio9KGNvbnN0IHJlcCYgX19yaHMpCisJeworCSAgX19yICo9IF9fcmhzOworCSAgcmV0dXJuICp0aGlzOworCX0KKworCWR1cmF0aW9uJgorCW9wZXJhdG9yLz0oY29uc3QgcmVwJiBfX3JocykKKwl7CisJICBfX3IgLz0gX19yaHM7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisJLy8gRFIgOTM0LgorCXRlbXBsYXRlPHR5cGVuYW1lIF9SZXAyID0gcmVwPgorCSAgdHlwZW5hbWUgZW5hYmxlX2lmPCF0cmVhdF9hc19mbG9hdGluZ19wb2ludDxfUmVwMj46OnZhbHVlLAorCQkJICAgICBkdXJhdGlvbiY+Ojp0eXBlCisJICBvcGVyYXRvciU9KGNvbnN0IHJlcCYgX19yaHMpCisJICB7CisJICAgIF9fciAlPSBfX3JoczsKKwkgICAgcmV0dXJuICp0aGlzOworCSAgfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDIgPSByZXA+CisJICB0eXBlbmFtZSBlbmFibGVfaWY8IXRyZWF0X2FzX2Zsb2F0aW5nX3BvaW50PF9SZXAyPjo6dmFsdWUsCisJCQkgICAgIGR1cmF0aW9uJj46OnR5cGUKKwkgIG9wZXJhdG9yJT0oY29uc3QgZHVyYXRpb24mIF9fZCkKKwkgIHsKKwkgICAgX19yICU9IF9fZC5jb3VudCgpOworCSAgICByZXR1cm4gKnRoaXM7CisJICB9CisKKwkvLyAyMC4xMS41LjQgc3BlY2lhbCB2YWx1ZXMKKwlzdGF0aWMgY29uc3RleHByIGR1cmF0aW9uCisJemVybygpCisJeyByZXR1cm4gZHVyYXRpb24oZHVyYXRpb25fdmFsdWVzPHJlcD46Onplcm8oKSk7IH0KKworCXN0YXRpYyBjb25zdGV4cHIgZHVyYXRpb24KKwltaW4oKQorCXsgcmV0dXJuIGR1cmF0aW9uKGR1cmF0aW9uX3ZhbHVlczxyZXA+OjptaW4oKSk7IH0KKworCXN0YXRpYyBjb25zdGV4cHIgZHVyYXRpb24KKwltYXgoKQorCXsgcmV0dXJuIGR1cmF0aW9uKGR1cmF0aW9uX3ZhbHVlczxyZXA+OjptYXgoKSk7IH0KKworICAgICAgcHJpdmF0ZToKKwlyZXAgX19yOworICAgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAxLCB0eXBlbmFtZSBfUGVyaW9kMSwKKwkgICAgIHR5cGVuYW1lIF9SZXAyLCB0eXBlbmFtZSBfUGVyaW9kMj4KKyAgICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBjb21tb25fdHlwZTxkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+LAorCQkJCSAgICAgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPj46OnR5cGUKKyAgICAgIG9wZXJhdG9yKyhjb25zdCBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+JiBfX2xocywKKwkJY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiYgX19yaHMpCisgICAgICB7CisJdHlwZWRlZiBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+CQkJX19kdXIxOworCXR5cGVkZWYgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPgkJCV9fZHVyMjsKKwl0eXBlZGVmIHR5cGVuYW1lIGNvbW1vbl90eXBlPF9fZHVyMSxfX2R1cjI+Ojp0eXBlCV9fY2Q7CisJcmV0dXJuIF9fY2QoX19jZChfX2xocykuY291bnQoKSArIF9fY2QoX19yaHMpLmNvdW50KCkpOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9QZXJpb2QxLAorCSAgICAgdHlwZW5hbWUgX1JlcDIsIHR5cGVuYW1lIF9QZXJpb2QyPgorICAgICAgY29uc3RleHByIHR5cGVuYW1lIGNvbW1vbl90eXBlPGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4sCisJCQkJICAgICBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+Pjo6dHlwZQorICAgICAgb3BlcmF0b3ItKGNvbnN0IGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4mIF9fbGhzLAorCQljb25zdCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+JiBfX3JocykKKyAgICAgIHsKKwl0eXBlZGVmIGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4JCQlfX2R1cjE7CisJdHlwZWRlZiBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+CQkJX19kdXIyOworCXR5cGVkZWYgdHlwZW5hbWUgY29tbW9uX3R5cGU8X19kdXIxLF9fZHVyMj46OnR5cGUJX19jZDsKKwlyZXR1cm4gX19jZChfX2NkKF9fbGhzKS5jb3VudCgpIC0gX19jZChfX3JocykuY291bnQoKSk7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMSwgdHlwZW5hbWUgX1JlcDIsIGJvb2wgPQorCSAgICAgaXNfY29udmVydGlibGU8X1JlcDIsCisJCQkgICAgdHlwZW5hbWUgY29tbW9uX3R5cGU8X1JlcDEsIF9SZXAyPjo6dHlwZT46OnZhbHVlPgorICAgICAgc3RydWN0IF9fY29tbW9uX3JlcF90eXBlIHsgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAxLCB0eXBlbmFtZSBfUmVwMj4KKyAgICAgIHN0cnVjdCBfX2NvbW1vbl9yZXBfdHlwZTxfUmVwMSwgX1JlcDIsIHRydWU+CisgICAgICB7IHR5cGVkZWYgdHlwZW5hbWUgY29tbW9uX3R5cGU8X1JlcDEsIF9SZXAyPjo6dHlwZSB0eXBlOyB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9QZXJpb2QsIHR5cGVuYW1lIF9SZXAyPgorICAgICAgY29uc3RleHByCisgICAgICBkdXJhdGlvbjx0eXBlbmFtZSBfX2NvbW1vbl9yZXBfdHlwZTxfUmVwMSwgX1JlcDI+Ojp0eXBlLCBfUGVyaW9kPgorICAgICAgb3BlcmF0b3IqKGNvbnN0IGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kPiYgX19kLCBjb25zdCBfUmVwMiYgX19zKQorICAgICAgeworCXR5cGVkZWYgZHVyYXRpb248dHlwZW5hbWUgY29tbW9uX3R5cGU8X1JlcDEsIF9SZXAyPjo6dHlwZSwgX1BlcmlvZD4KKwkgIF9fY2Q7CisJcmV0dXJuIF9fY2QoX19jZChfX2QpLmNvdW50KCkgKiBfX3MpOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9SZXAyLCB0eXBlbmFtZSBfUGVyaW9kPgorICAgICAgY29uc3RleHByCisgICAgICBkdXJhdGlvbjx0eXBlbmFtZSBfX2NvbW1vbl9yZXBfdHlwZTxfUmVwMiwgX1JlcDE+Ojp0eXBlLCBfUGVyaW9kPgorICAgICAgb3BlcmF0b3IqKGNvbnN0IF9SZXAxJiBfX3MsIGNvbnN0IGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kPiYgX19kKQorICAgICAgeyByZXR1cm4gX19kICogX19zOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMSwgdHlwZW5hbWUgX1BlcmlvZCwgdHlwZW5hbWUgX1JlcDI+CisgICAgICBjb25zdGV4cHIgZHVyYXRpb248dHlwZW5hbWUgX19jb21tb25fcmVwX3R5cGU8X1JlcDEsIHR5cGVuYW1lCisJZW5hYmxlX2lmPCFfX2lzX2R1cmF0aW9uPF9SZXAyPjo6dmFsdWUsIF9SZXAyPjo6dHlwZT46OnR5cGUsIF9QZXJpb2Q+CisgICAgICBvcGVyYXRvci8oY29uc3QgZHVyYXRpb248X1JlcDEsIF9QZXJpb2Q+JiBfX2QsIGNvbnN0IF9SZXAyJiBfX3MpCisgICAgICB7CisJdHlwZWRlZiBkdXJhdGlvbjx0eXBlbmFtZSBjb21tb25fdHlwZTxfUmVwMSwgX1JlcDI+Ojp0eXBlLCBfUGVyaW9kPgorCSAgX19jZDsKKwlyZXR1cm4gX19jZChfX2NkKF9fZCkuY291bnQoKSAvIF9fcyk7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMSwgdHlwZW5hbWUgX1BlcmlvZDEsCisJICAgICB0eXBlbmFtZSBfUmVwMiwgdHlwZW5hbWUgX1BlcmlvZDI+CisgICAgICBjb25zdGV4cHIgdHlwZW5hbWUgY29tbW9uX3R5cGU8X1JlcDEsIF9SZXAyPjo6dHlwZQorICAgICAgb3BlcmF0b3IvKGNvbnN0IGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4mIF9fbGhzLAorCQljb25zdCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+JiBfX3JocykKKyAgICAgIHsKKwl0eXBlZGVmIGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4JCQlfX2R1cjE7CisJdHlwZWRlZiBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+CQkJX19kdXIyOworCXR5cGVkZWYgdHlwZW5hbWUgY29tbW9uX3R5cGU8X19kdXIxLF9fZHVyMj46OnR5cGUJX19jZDsKKwlyZXR1cm4gX19jZChfX2xocykuY291bnQoKSAvIF9fY2QoX19yaHMpLmNvdW50KCk7CisgICAgICB9CisKKyAgICAvLyBEUiA5MzQuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9QZXJpb2QsIHR5cGVuYW1lIF9SZXAyPgorICAgICAgY29uc3RleHByIGR1cmF0aW9uPHR5cGVuYW1lIF9fY29tbW9uX3JlcF90eXBlPF9SZXAxLCB0eXBlbmFtZQorCWVuYWJsZV9pZjwhX19pc19kdXJhdGlvbjxfUmVwMj46OnZhbHVlLCBfUmVwMj46OnR5cGU+Ojp0eXBlLCBfUGVyaW9kPgorICAgICAgb3BlcmF0b3IlKGNvbnN0IGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kPiYgX19kLCBjb25zdCBfUmVwMiYgX19zKQorICAgICAgeworCXR5cGVkZWYgZHVyYXRpb248dHlwZW5hbWUgY29tbW9uX3R5cGU8X1JlcDEsIF9SZXAyPjo6dHlwZSwgX1BlcmlvZD4KKwkgIF9fY2Q7CisJcmV0dXJuIF9fY2QoX19jZChfX2QpLmNvdW50KCkgJSBfX3MpOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9QZXJpb2QxLAorCSAgICAgdHlwZW5hbWUgX1JlcDIsIHR5cGVuYW1lIF9QZXJpb2QyPgorICAgICAgY29uc3RleHByIHR5cGVuYW1lIGNvbW1vbl90eXBlPGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4sCisJCQkJICAgICBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+Pjo6dHlwZQorICAgICAgb3BlcmF0b3IlKGNvbnN0IGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4mIF9fbGhzLAorCQljb25zdCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+JiBfX3JocykKKyAgICAgIHsKKwl0eXBlZGVmIGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4JCQlfX2R1cjE7CisJdHlwZWRlZiBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+CQkJX19kdXIyOworCXR5cGVkZWYgdHlwZW5hbWUgY29tbW9uX3R5cGU8X19kdXIxLF9fZHVyMj46OnR5cGUJX19jZDsKKwlyZXR1cm4gX19jZChfX2NkKF9fbGhzKS5jb3VudCgpICUgX19jZChfX3JocykuY291bnQoKSk7CisgICAgICB9CisKKyAgICAvLyBjb21wYXJpc29ucworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAxLCB0eXBlbmFtZSBfUGVyaW9kMSwKKwkgICAgIHR5cGVuYW1lIF9SZXAyLCB0eXBlbmFtZSBfUGVyaW9kMj4KKyAgICAgIGNvbnN0ZXhwciBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4mIF9fbGhzLAorCQkgY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiYgX19yaHMpCisgICAgICB7CisJdHlwZWRlZiBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+CQkJX19kdXIxOworCXR5cGVkZWYgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPgkJCV9fZHVyMjsKKwl0eXBlZGVmIHR5cGVuYW1lIGNvbW1vbl90eXBlPF9fZHVyMSxfX2R1cjI+Ojp0eXBlCV9fY3Q7CisJcmV0dXJuIF9fY3QoX19saHMpLmNvdW50KCkgPT0gX19jdChfX3JocykuY291bnQoKTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAxLCB0eXBlbmFtZSBfUGVyaW9kMSwKKwkgICAgIHR5cGVuYW1lIF9SZXAyLCB0eXBlbmFtZSBfUGVyaW9kMj4KKyAgICAgIGNvbnN0ZXhwciBib29sCisgICAgICBvcGVyYXRvcjwoY29uc3QgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiYgX19saHMsCisJCWNvbnN0IGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4mIF9fcmhzKQorICAgICAgeworCXR5cGVkZWYgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPgkJCV9fZHVyMTsKKwl0eXBlZGVmIGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4JCQlfX2R1cjI7CisJdHlwZWRlZiB0eXBlbmFtZSBjb21tb25fdHlwZTxfX2R1cjEsX19kdXIyPjo6dHlwZQlfX2N0OworCXJldHVybiBfX2N0KF9fbGhzKS5jb3VudCgpIDwgX19jdChfX3JocykuY291bnQoKTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAxLCB0eXBlbmFtZSBfUGVyaW9kMSwKKwkgICAgIHR5cGVuYW1lIF9SZXAyLCB0eXBlbmFtZSBfUGVyaW9kMj4KKyAgICAgIGNvbnN0ZXhwciBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4mIF9fbGhzLAorCQkgY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiYgX19yaHMpCisgICAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9QZXJpb2QxLAorCSAgICAgdHlwZW5hbWUgX1JlcDIsIHR5cGVuYW1lIF9QZXJpb2QyPgorICAgICAgY29uc3RleHByIGJvb2wKKyAgICAgIG9wZXJhdG9yPD0oY29uc3QgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiYgX19saHMsCisJCSBjb25zdCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+JiBfX3JocykKKyAgICAgIHsgcmV0dXJuICEoX19yaHMgPCBfX2xocyk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAxLCB0eXBlbmFtZSBfUGVyaW9kMSwKKwkgICAgIHR5cGVuYW1lIF9SZXAyLCB0eXBlbmFtZSBfUGVyaW9kMj4KKyAgICAgIGNvbnN0ZXhwciBib29sCisgICAgICBvcGVyYXRvcj4oY29uc3QgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiYgX19saHMsCisJCWNvbnN0IGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4mIF9fcmhzKQorICAgICAgeyByZXR1cm4gX19yaHMgPCBfX2xoczsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9QZXJpb2QxLAorCSAgICAgdHlwZW5hbWUgX1JlcDIsIHR5cGVuYW1lIF9QZXJpb2QyPgorICAgICAgY29uc3RleHByIGJvb2wKKyAgICAgIG9wZXJhdG9yPj0oY29uc3QgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiYgX19saHMsCisJCSBjb25zdCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+JiBfX3JocykKKyAgICAgIHsgcmV0dXJuICEoX19saHMgPCBfX3Jocyk7IH0KKworICAgIC8vLyBuYW5vc2Vjb25kcworICAgIHR5cGVkZWYgZHVyYXRpb248aW50NjRfdCwgbmFubz4gCW5hbm9zZWNvbmRzOworCisgICAgLy8vIG1pY3Jvc2Vjb25kcworICAgIHR5cGVkZWYgZHVyYXRpb248aW50NjRfdCwgbWljcm8+IAltaWNyb3NlY29uZHM7CisKKyAgICAvLy8gbWlsbGlzZWNvbmRzCisgICAgdHlwZWRlZiBkdXJhdGlvbjxpbnQ2NF90LCBtaWxsaT4gCW1pbGxpc2Vjb25kczsKKworICAgIC8vLyBzZWNvbmRzCisgICAgdHlwZWRlZiBkdXJhdGlvbjxpbnQ2NF90PiAJCXNlY29uZHM7CisKKyAgICAvLy8gbWludXRlcworICAgIHR5cGVkZWYgZHVyYXRpb248aW50LCByYXRpbzwgNjA+PiAJbWludXRlczsKKworICAgIC8vLyBob3VycworICAgIHR5cGVkZWYgZHVyYXRpb248aW50LCByYXRpbzwzNjAwPj4gCWhvdXJzOworCisgICAgLy8vIHRpbWVfcG9pbnQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXI+CisgICAgICBzdHJ1Y3QgdGltZV9wb2ludAorICAgICAgeworCXR5cGVkZWYgX0Nsb2NrCQkJICAJCQljbG9jazsKKwl0eXBlZGVmIF9EdXIJCSAgCQkJCWR1cmF0aW9uOworCXR5cGVkZWYgdHlwZW5hbWUgZHVyYXRpb246OnJlcAkgIAkJCXJlcDsKKwl0eXBlZGVmIHR5cGVuYW1lIGR1cmF0aW9uOjpwZXJpb2QJCQlwZXJpb2Q7CisKKwljb25zdGV4cHIgdGltZV9wb2ludCgpIDogX19kKGR1cmF0aW9uOjp6ZXJvKCkpCisJeyB9CisKKwljb25zdGV4cHIgZXhwbGljaXQgdGltZV9wb2ludChjb25zdCBkdXJhdGlvbiYgX19kdXIpCisJOiBfX2QoX19kdXIpCisJeyB9CisKKwkvLyBjb252ZXJzaW9ucworCXRlbXBsYXRlPHR5cGVuYW1lIF9EdXIyPgorCSAgY29uc3RleHByIHRpbWVfcG9pbnQoY29uc3QgdGltZV9wb2ludDxjbG9jaywgX0R1cjI+JiBfX3QpCisJICA6IF9fZChfX3QudGltZV9zaW5jZV9lcG9jaCgpKQorCSAgeyB9CisKKwkvLyBvYnNlcnZlcgorCWNvbnN0ZXhwciBkdXJhdGlvbgorCXRpbWVfc2luY2VfZXBvY2goKSBjb25zdAorCXsgcmV0dXJuIF9fZDsgfQorCisJLy8gYXJpdGhtZXRpYworCXRpbWVfcG9pbnQmCisJb3BlcmF0b3IrPShjb25zdCBkdXJhdGlvbiYgX19kdXIpCisJeworCSAgX19kICs9IF9fZHVyOworCSAgcmV0dXJuICp0aGlzOworCX0KKworCXRpbWVfcG9pbnQmCisJb3BlcmF0b3ItPShjb25zdCBkdXJhdGlvbiYgX19kdXIpCisJeworCSAgX19kIC09IF9fZHVyOworCSAgcmV0dXJuICp0aGlzOworCX0KKworCS8vIHNwZWNpYWwgdmFsdWVzCisJc3RhdGljIGNvbnN0ZXhwciB0aW1lX3BvaW50CisJbWluKCkKKwl7IHJldHVybiB0aW1lX3BvaW50KGR1cmF0aW9uOjptaW4oKSk7IH0KKworCXN0YXRpYyBjb25zdGV4cHIgdGltZV9wb2ludAorCW1heCgpCisJeyByZXR1cm4gdGltZV9wb2ludChkdXJhdGlvbjo6bWF4KCkpOyB9CisKKyAgICAgIHByaXZhdGU6CisJZHVyYXRpb24gX19kOworICAgICAgfTsKKworICAgIC8vLyB0aW1lX3BvaW50X2Nhc3QKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG9EdXIsIHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cj4KKyAgICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBlbmFibGVfaWY8X19pc19kdXJhdGlvbjxfVG9EdXI+Ojp2YWx1ZSwKKwkJCQkgICB0aW1lX3BvaW50PF9DbG9jaywgX1RvRHVyPj46OnR5cGUKKyAgICAgIHRpbWVfcG9pbnRfY2FzdChjb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cj4mIF9fdCkKKyAgICAgIHsKKwl0eXBlZGVmIHRpbWVfcG9pbnQ8X0Nsb2NrLCBfVG9EdXI+IAkJCV9fdGltZV9wb2ludDsKKwlyZXR1cm4gX190aW1lX3BvaW50KGR1cmF0aW9uX2Nhc3Q8X1RvRHVyPihfX3QudGltZV9zaW5jZV9lcG9jaCgpKSk7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXIxLAorCSAgICAgdHlwZW5hbWUgX1JlcDIsIHR5cGVuYW1lIF9QZXJpb2QyPgorICAgICAgY29uc3RleHByIHRpbWVfcG9pbnQ8X0Nsb2NrLAorCXR5cGVuYW1lIGNvbW1vbl90eXBlPF9EdXIxLCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+Pjo6dHlwZT4KKyAgICAgIG9wZXJhdG9yKyhjb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cjE+JiBfX2xocywKKwkJY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiYgX19yaHMpCisgICAgICB7CisJdHlwZWRlZiBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+CQkJX19kdXIyOworCXR5cGVkZWYgdHlwZW5hbWUgY29tbW9uX3R5cGU8X0R1cjEsX19kdXIyPjo6dHlwZQlfX2N0OworCXR5cGVkZWYgdGltZV9wb2ludDxfQ2xvY2ssIF9fY3Q+IAkJCV9fdGltZV9wb2ludDsKKwlyZXR1cm4gX190aW1lX3BvaW50KF9fbGhzLnRpbWVfc2luY2VfZXBvY2goKSArIF9fcmhzKTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAxLCB0eXBlbmFtZSBfUGVyaW9kMSwKKwkgICAgIHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cjI+CisgICAgICBjb25zdGV4cHIgdGltZV9wb2ludDxfQ2xvY2ssCisJdHlwZW5hbWUgY29tbW9uX3R5cGU8ZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiwgX0R1cjI+Ojp0eXBlPgorICAgICAgb3BlcmF0b3IrKGNvbnN0IGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4mIF9fbGhzLAorCQljb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cjI+JiBfX3JocykKKyAgICAgIHsgCisJdHlwZWRlZiBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+CQkJX19kdXIxOworCXR5cGVkZWYgdHlwZW5hbWUgY29tbW9uX3R5cGU8X19kdXIxLF9EdXIyPjo6dHlwZQlfX2N0OworCXR5cGVkZWYgdGltZV9wb2ludDxfQ2xvY2ssIF9fY3Q+IAkJCV9fdGltZV9wb2ludDsKKwlyZXR1cm4gX190aW1lX3BvaW50KF9fcmhzLnRpbWVfc2luY2VfZXBvY2goKSArIF9fbGhzKTsgCisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXIxLAorCSAgICAgdHlwZW5hbWUgX1JlcDIsIHR5cGVuYW1lIF9QZXJpb2QyPgorICAgICAgY29uc3RleHByIHRpbWVfcG9pbnQ8X0Nsb2NrLAorCXR5cGVuYW1lIGNvbW1vbl90eXBlPF9EdXIxLCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+Pjo6dHlwZT4KKyAgICAgIG9wZXJhdG9yLShjb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cjE+JiBfX2xocywKKwkJY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiYgX19yaHMpCisgICAgICB7IAorCXR5cGVkZWYgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPgkJCV9fZHVyMjsKKwl0eXBlZGVmIHR5cGVuYW1lIGNvbW1vbl90eXBlPF9EdXIxLF9fZHVyMj46OnR5cGUJX19jdDsKKwl0eXBlZGVmIHRpbWVfcG9pbnQ8X0Nsb2NrLCBfX2N0PiAJCQlfX3RpbWVfcG9pbnQ7CisJcmV0dXJuIF9fdGltZV9wb2ludChfX2xocy50aW1lX3NpbmNlX2Vwb2NoKCkgLV9fcmhzKTsgCisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXIxLCB0eXBlbmFtZSBfRHVyMj4KKyAgICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBjb21tb25fdHlwZTxfRHVyMSwgX0R1cjI+Ojp0eXBlCisgICAgICBvcGVyYXRvci0oY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXIxPiYgX19saHMsCisJCWNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyMj4mIF9fcmhzKQorICAgICAgeyByZXR1cm4gX19saHMudGltZV9zaW5jZV9lcG9jaCgpIC0gX19yaHMudGltZV9zaW5jZV9lcG9jaCgpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXIxLCB0eXBlbmFtZSBfRHVyMj4KKyAgICAgIGNvbnN0ZXhwciBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyMT4mIF9fbGhzLAorCQkgY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXIyPiYgX19yaHMpCisgICAgICB7IHJldHVybiBfX2xocy50aW1lX3NpbmNlX2Vwb2NoKCkgPT0gX19yaHMudGltZV9zaW5jZV9lcG9jaCgpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXIxLCB0eXBlbmFtZSBfRHVyMj4KKyAgICAgIGNvbnN0ZXhwciBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyMT4mIF9fbGhzLAorCQkgY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXIyPiYgX19yaHMpCisgICAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Nsb2NrLCB0eXBlbmFtZSBfRHVyMSwgdHlwZW5hbWUgX0R1cjI+CisgICAgICBjb25zdGV4cHIgYm9vbAorICAgICAgb3BlcmF0b3I8KGNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyMT4mIF9fbGhzLAorCQljb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cjI+JiBfX3JocykKKyAgICAgIHsgcmV0dXJuICBfX2xocy50aW1lX3NpbmNlX2Vwb2NoKCkgPCBfX3Jocy50aW1lX3NpbmNlX2Vwb2NoKCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cjEsIHR5cGVuYW1lIF9EdXIyPgorICAgICAgY29uc3RleHByIGJvb2wKKyAgICAgIG9wZXJhdG9yPD0oY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXIxPiYgX19saHMsCisJCSBjb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cjI+JiBfX3JocykKKyAgICAgIHsgcmV0dXJuICEoX19yaHMgPCBfX2xocyk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cjEsIHR5cGVuYW1lIF9EdXIyPgorICAgICAgY29uc3RleHByIGJvb2wKKyAgICAgIG9wZXJhdG9yPihjb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cjE+JiBfX2xocywKKwkJY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXIyPiYgX19yaHMpCisgICAgICB7IHJldHVybiBfX3JocyA8IF9fbGhzOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXIxLCB0eXBlbmFtZSBfRHVyMj4KKyAgICAgIGNvbnN0ZXhwciBib29sCisgICAgICBvcGVyYXRvcj49KGNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyMT4mIF9fbGhzLAorCQkgY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXIyPiYgX19yaHMpCisgICAgICB7IHJldHVybiAhKF9fbGhzIDwgX19yaHMpOyB9CisKKworICAgIC8vIENsb2Nrcy4gCisKKyAgICAvLyBXaHkgbmFub3NlY29uZCByZXNvbHV0aW9uIGFzIHRoZSBkZWZhdWx0PyAgCisgICAgLy8gV2h5IGhhdmUgc3RkOjpzeXN0ZW1fY2xvY2sgYWx3YXlzIGNvdW50IGluIHRoZSBoaWdlc3QKKyAgICAvLyByZXNvbHV0aW9uIChpZSBuYW5vc2Vjb25kcyksIGV2ZW4gaWYgb24gc29tZSBPU2VzIHRoZSBsb3cgMworICAgIC8vIG9yIDkgZGVjaW1hbCBkaWdpdHMgd2lsbCBiZSBhbHdheXMgemVybz8gVGhpcyBhbGxvd3MgbGF0ZXIKKyAgICAvLyBpbXBsZW1lbnRhdGlvbnMgdG8gY2hhbmdlIHRoZSBzeXN0ZW1fY2xvY2s6Om5vdygpCisgICAgLy8gaW1wbGVtZW50YXRpb24gYW55IHRpbWUgdG8gcHJvdmlkZSBiZXR0ZXIgcmVzb2x1dGlvbiB3aXRob3V0CisgICAgLy8gY2hhbmdpbmcgZnVuY3Rpb24gc2lnbmF0dXJlIG9yIHVuaXRzLgorCisgICAgLy8gVG8gc3VwcG9ydCB0aGUgKGZvcndhcmQpIGV2b2x1dGlvbiBvZiB0aGUgbGlicmFyeSdzIGRlZmluZWQKKyAgICAvLyBjbG9ja3MsIHdyYXAgaW5zaWRlIGlubGluZSBuYW1lc3BhY2Ugc28gdGhhdCB0aGUgY3VycmVudAorICAgIC8vIGRlZmludGlvbnMgb2Ygc3lzdGVtX2Nsb2NrLCBzdGVhZHlfY2xvY2ssIGFuZAorICAgIC8vIGhpZ2hfcmVzb2x1dGlvbl9jbG9jayB0eXBlcyBhcmUgdW5pcXVlbHkgbWFuZ2xlZC4gVGhpcyB3YXksIG5ldworICAgIC8vIGNvZGUgY2FuIHVzZSB0aGUgbGF0ZXN0cyBjbG9ja3MsIHdoaWxlIHRoZSBsaWJyYXJ5IGNhbiBjb250YWluCisgICAgLy8gY29tcGF0aWJpbGl0eSBkZWZpbml0aW9ucyBmb3IgcHJldmlvdXMgdmVyc2lvbnMuICBBdCBzb21lCisgICAgLy8gcG9pbnQsIHdoZW4gdGhlc2UgY2xvY2tzIHNldHRsZSBkb3duLCB0aGUgaW5saW5lZCBuYW1lc3BhY2VzCisgICAgLy8gY2FuIGJlIHJlbW92ZWQuICBYWFggR0xJQkNYWF9BQkkgRGVwcmVjYXRlZAorICAgIGlubGluZSBuYW1lc3BhY2UgX1YyIHsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgU3lzdGVtIGNsb2NrLgorICAgICAqCisgICAgICogIFRpbWUgcmV0dXJuZWQgcmVwcmVzZW50cyB3YWxsIHRpbWUgZnJvbSB0aGUgc3lzdGVtLXdpZGUgY2xvY2suCisgICAgKi8KKyAgICAgc3RydWN0IHN5c3RlbV9jbG9jaworICAgIHsKKyAgICAgIHR5cGVkZWYgY2hyb25vOjpuYW5vc2Vjb25kcyAgICAgCQkJCWR1cmF0aW9uOworICAgICAgdHlwZWRlZiBkdXJhdGlvbjo6cmVwICAgIAkJCQkJcmVwOworICAgICAgdHlwZWRlZiBkdXJhdGlvbjo6cGVyaW9kIAkJCQkJcGVyaW9kOworICAgICAgdHlwZWRlZiBjaHJvbm86OnRpbWVfcG9pbnQ8c3lzdGVtX2Nsb2NrLCBkdXJhdGlvbj4gCXRpbWVfcG9pbnQ7CisKKyAgICAgIHN0YXRpY19hc3NlcnQoc3lzdGVtX2Nsb2NrOjpkdXJhdGlvbjo6bWluKCkKKwkJICAgIDwgc3lzdGVtX2Nsb2NrOjpkdXJhdGlvbjo6emVybygpLAorCQkgICAgImEgY2xvY2sncyBtaW5pbXVtIGR1cmF0aW9uIGNhbm5vdCBiZSBsZXNzIHRoYW4gaXRzIGVwb2NoIik7CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBpc19zdGVhZHkgPSBmYWxzZTsKKworICAgICAgc3RhdGljIHRpbWVfcG9pbnQKKyAgICAgIG5vdygpIG5vZXhjZXB0OworCisgICAgICAvLyBNYXAgdG8gQyBBUEkKKyAgICAgIHN0YXRpYyBzdGQ6OnRpbWVfdAorICAgICAgdG9fdGltZV90KGNvbnN0IHRpbWVfcG9pbnQmIF9fdCkgbm9leGNlcHQKKyAgICAgIHsKKwlyZXR1cm4gc3RkOjp0aW1lX3QoZHVyYXRpb25fY2FzdDxjaHJvbm86OnNlY29uZHM+CisJCQkgICAoX190LnRpbWVfc2luY2VfZXBvY2goKSkuY291bnQoKSk7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyB0aW1lX3BvaW50CisgICAgICBmcm9tX3RpbWVfdChzdGQ6OnRpbWVfdCBfX3QpIG5vZXhjZXB0CisgICAgICB7CisJdHlwZWRlZiBjaHJvbm86OnRpbWVfcG9pbnQ8c3lzdGVtX2Nsb2NrLCBzZWNvbmRzPglfX2Zyb207CisJcmV0dXJuIHRpbWVfcG9pbnRfY2FzdDxzeXN0ZW1fY2xvY2s6OmR1cmF0aW9uPgorCSAgICAgICAoX19mcm9tKGNocm9ubzo6c2Vjb25kcyhfX3QpKSk7CisgICAgICB9CisgICAgfTsKKworCisgICAgLyoqCisgICAgICogIEBicmllZiBNb25vdG9uaWMgY2xvY2sKKyAgICAgKgorICAgICAqICBUaW1lIHJldHVybmVkIGhhcyB0aGUgcHJvcGVydHkgb2Ygb25seSBpbmNyZWFzaW5nIGF0IGEgdW5pZm9ybSByYXRlLgorICAgICovCisgICAgc3RydWN0IHN0ZWFkeV9jbG9jaworICAgIHsKKyAgICAgIHR5cGVkZWYgY2hyb25vOjpuYW5vc2Vjb25kcyAJCQkJZHVyYXRpb247CisgICAgICB0eXBlZGVmIGR1cmF0aW9uOjpyZXAJICAJCQkJcmVwOworICAgICAgdHlwZWRlZiBkdXJhdGlvbjo6cGVyaW9kCSAgCQkJCXBlcmlvZDsKKyAgICAgIHR5cGVkZWYgY2hyb25vOjp0aW1lX3BvaW50PHN0ZWFkeV9jbG9jaywgZHVyYXRpb24+IAl0aW1lX3BvaW50OworCisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaXNfc3RlYWR5ID0gdHJ1ZTsKKworICAgICAgc3RhdGljIHRpbWVfcG9pbnQKKyAgICAgIG5vdygpIG5vZXhjZXB0OworICAgIH07CisKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgSGlnaGVzdC1yZXNvbHV0aW9uIGNsb2NrCisgICAgICoKKyAgICAgKiAgVGhpcyBpcyB0aGUgY2xvY2sgIndpdGggdGhlIHNob3J0ZXN0IHRpY2sgcGVyaW9kLiIgQWxpYXMgdG8KKyAgICAgKiAgc3RkOjpzeXN0ZW1fY2xvY2sgdW50aWwgaGlnaGVyLXRoYW4tbmFub3NlY29uZCBkZWZpbml0aW9ucworICAgICAqICBiZWNvbWUgZmVhc2libGUuCisgICAgKi8KKyAgICB1c2luZyBoaWdoX3Jlc29sdXRpb25fY2xvY2sgPSBzeXN0ZW1fY2xvY2s7CisKKyAgfSAvLyBlbmQgaW5saW5lIG5hbWVzcGFjZSBfVjIKKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2UgY2hyb25vCisKKyAgLy8gQH0gZ3JvdXAgY2hyb25vCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy9fR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKworI2VuZGlmIC8vIEMrKzExCisKKyNlbmRpZiAvL19HTElCQ1hYX0NIUk9OTwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jaW50dHlwZXMgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NpbnR0eXBlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGM3NDBjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jaW50dHlwZXMKQEAgLTAsMCArMSw4MSBAQAorLy8gPGNpbnR0eXBlcz4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY2ludHR5cGVzCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0NJTlRUWVBFUworI2RlZmluZSBfR0xJQkNYWF9DSU5UVFlQRVMgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorCisjaW5jbHVkZSA8Y3N0ZGludD4KKworLy8gRm9yIDI3LjkuMi8zIChzZWUgQzk5LCBOb3RlIDE4NCkKKyNpZiBfR0xJQkNYWF9IQVZFX0lOVFRZUEVTX0gKKyMgaWZuZGVmIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjICBkZWZpbmUgX1VOREVGX19TVERDX0ZPUk1BVF9NQUNST1MKKyMgIGRlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUworIyBlbmRpZgorIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgorIyBpZmRlZiBfVU5ERUZfX1NURENfRk9STUFUX01BQ1JPUworIyAgdW5kZWYgX19TVERDX0ZPUk1BVF9NQUNST1MKKyMgIHVuZGVmIF9VTkRFRl9fU1REQ19GT1JNQVRfTUFDUk9TCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTlfSU5UVFlQRVNfVFIxCisKK25hbWVzcGFjZSBzdGQKK3sKKyAgLy8gdHlwZXMKKyAgdXNpbmcgOjppbWF4ZGl2X3Q7CisKKyAgLy8gZnVuY3Rpb25zCisgIHVzaW5nIDo6aW1heGFiczsKKyAgdXNpbmcgOjppbWF4ZGl2OworCisgIC8vIEdDQyBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuZGVkIGludGVnZXIgdHlwZXMKKyAgLy8gaW50bWF4X3QgYWJzKGludG1heF90KQorICAvLyBpbWF4ZGl2X3QgZGl2KGludG1heF90LCBpbnRtYXhfdCkKKworICB1c2luZyA6OnN0cnRvaW1heDsKKyAgdXNpbmcgOjpzdHJ0b3VtYXg7CisKKyNpZiBkZWZpbmVkKF9HTElCQ1hYX1VTRV9XQ0hBUl9UKSAmJiBfR0xJQkNYWF9VU0VfQzk5X0lOVFRZUEVTX1dDSEFSX1RfVFIxCisgIHVzaW5nIDo6d2NzdG9pbWF4OworICB1c2luZyA6Ondjc3RvdW1heDsKKyNlbmRpZgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9VU0VfQzk5X0lOVFRZUEVTX1RSMQorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vIF9HTElCQ1hYX0NJTlRUWVBFUwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jaXNvNjQ2IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jaXNvNjQ2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYmIzZjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2Npc282NDYKQEAgLTAsMCArMSwzMyBAQAorLy8gLSotIEMrKyAtKi0gZm9yd2FyZGluZyBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBjaXNvNjQ2CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgaXNvNjQ2LmgsCisgKiAgYW5kIGl0cyBjb250ZW50cyBhcmUgKG1vc3RseSkgdGhlIHNhbWUgYXMgdGhhdCBoZWFkZXIsIGJ1dCBhcmUgYWxsCisgKiAgY29udGFpbmVkIGluIHRoZSBuYW1lc3BhY2UgQGMgc3RkIChleGNlcHQgZm9yIG5hbWVzIHdoaWNoIGFyZSBkZWZpbmVkCisgKiAgYXMgbWFjcm9zIGluIEMpLgorICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NsaW1pdHMgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NsaW1pdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhNTkxOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2xpbWl0cwpAQCAtMCwwICsxLDU4IEBACisvLyAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY2xpbWl0cworICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBmaWxlLiAgWW91IHNob3VsZCBAYyBcI2luY2x1ZGUgdGhpcyBmaWxlCisgKiAgaW4geW91ciBwcm9ncmFtcywgcmF0aGVyIHRoYW4gYW55IG9mIHRoZSBAYSAqLmggaW1wbGVtZW50YXRpb24gZmlsZXMuCisgKgorICogIFRoaXMgaXMgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoZSBTdGFuZGFyZCBDIExpYnJhcnkgaGVhZGVyIEBjIGxpbWl0cy5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMTguMi4yICBJbXBsZW1lbnRhdGlvbiBwcm9wZXJ0aWVzOiBDIGxpYnJhcnkKKy8vCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaWZuZGVmIF9HTElCQ1hYX0NMSU1JVFMKKyNkZWZpbmUgX0dMSUJDWFhfQ0xJTUlUUyAxCisKKyNpZm5kZWYgTExPTkdfTUlOCisjZGVmaW5lIExMT05HX01JTiAoLV9fTE9OR19MT05HX01BWF9fIC0gMSkKKyNlbmRpZgorCisjaWZuZGVmIExMT05HX01BWAorI2RlZmluZSBMTE9OR19NQVggX19MT05HX0xPTkdfTUFYX18KKyNlbmRpZgorCisjaWZuZGVmIFVMTE9OR19NQVgKKyNkZWZpbmUgVUxMT05HX01BWCAoX19MT05HX0xPTkdfTUFYX18gKiAyVUxMICsgMSkKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2xvY2FsZSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY2xvY2FsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjMyOTgwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jbG9jYWxlCkBAIC0wLDAgKzEsNTggQEAKKy8vIC0qLSBDKysgLSotIGZvcndhcmRpbmcgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgY2xvY2FsZQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBmaWxlLiAgWW91IHNob3VsZCBAYyBcI2luY2x1ZGUgdGhpcyBmaWxlCisgKiAgaW4geW91ciBwcm9ncmFtcywgcmF0aGVyIHRoYW4gYW55IG9mIHRoZSBAYSAqLmggaW1wbGVtZW50YXRpb24gZmlsZXMuCisgKgorICogIFRoaXMgaXMgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoZSBTdGFuZGFyZCBDIExpYnJhcnkgaGVhZGVyIEBjIGxvY2FsZS5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMTguMi4yICBJbXBsZW1lbnRhdGlvbiBwcm9wZXJ0aWVzOiBDIGxpYnJhcnkKKy8vCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisKKyNpZm5kZWYgX0dMSUJDWFhfQ0xPQ0FMRQorI2RlZmluZSBfR0xJQkNYWF9DTE9DQUxFIDEKKworLy8gR2V0IHJpZCBvZiB0aG9zZSBtYWNyb3MgZGVmaW5lZCBpbiA8bG9jYWxlLmg+IGluIGxpZXUgb2YgcmVhbCBmdW5jdGlvbnMuCisjdW5kZWYgc2V0bG9jYWxlCisjdW5kZWYgbG9jYWxlY29udgorCituYW1lc3BhY2Ugc3RkCit7CisgIHVzaW5nIDo6bGNvbnY7CisgIHVzaW5nIDo6c2V0bG9jYWxlOworICB1c2luZyA6OmxvY2FsZWNvbnY7Cit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NtYXRoIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jbWF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDM4NTg1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jbWF0aApAQCAtMCwwICsxLDE2ODUgQEAKKy8vIC0qLSBDKysgLSotIEMgZm9yd2FyZGluZyBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2NtYXRoCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgbWF0aC5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjYuNSAgQyBsaWJyYXJ5CisvLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvY3BwX3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaWZuZGVmIF9HTElCQ1hYX0NNQVRICisjZGVmaW5lIF9HTElCQ1hYX0NNQVRIIDEKKworLy8gR2V0IHJpZCBvZiB0aG9zZSBtYWNyb3MgZGVmaW5lZCBpbiA8bWF0aC5oPiBpbiBsaWV1IG9mIHJlYWwgZnVuY3Rpb25zLgorI3VuZGVmIGFicworI3VuZGVmIGRpdgorI3VuZGVmIGFjb3MKKyN1bmRlZiBhc2luCisjdW5kZWYgYXRhbgorI3VuZGVmIGF0YW4yCisjdW5kZWYgY2VpbAorI3VuZGVmIGNvcworI3VuZGVmIGNvc2gKKyN1bmRlZiBleHAKKyN1bmRlZiBmYWJzCisjdW5kZWYgZmxvb3IKKyN1bmRlZiBmbW9kCisjdW5kZWYgZnJleHAKKyN1bmRlZiBsZGV4cAorI3VuZGVmIGxvZworI3VuZGVmIGxvZzEwCisjdW5kZWYgbW9kZgorI3VuZGVmIHBvdworI3VuZGVmIHNpbgorI3VuZGVmIHNpbmgKKyN1bmRlZiBzcXJ0CisjdW5kZWYgdGFuCisjdW5kZWYgdGFuaAorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyNpZm5kZWYgX19DT1JSRUNUX0lTT19DUFBfTUFUSF9IX1BST1RPCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgZG91YmxlCisgIGFicyhkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZmFicyhfX3gpOyB9CisjZW5kaWYKKworI2lmbmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9NQVRIX0hfUFJPVE8KKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdAorICBhYnMoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZmFic2YoX194KTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBkb3VibGUKKyAgYWJzKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZhYnNsKF9feCk7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGFicyhfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9mYWJzKF9feCk7IH0KKworICB1c2luZyA6OmFjb3M7CisKKyNpZm5kZWYgX19DT1JSRUNUX0lTT19DUFBfTUFUSF9IX1BST1RPCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQKKyAgYWNvcyhmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9hY29zZihfX3gpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZQorICBhY29zKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2Fjb3NsKF9feCk7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBhY29zKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2Fjb3MoX194KTsgfQorCisgIHVzaW5nIDo6YXNpbjsKKworI2lmbmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9NQVRIX0hfUFJPVE8KKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdAorICBhc2luKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2FzaW5mKF9feCk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlCisgIGFzaW4obG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fYXNpbmwoX194KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgYXNpbihfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9hc2luKF9feCk7IH0KKworICB1c2luZyA6OmF0YW47CisKKyNpZm5kZWYgX19DT1JSRUNUX0lTT19DUFBfTUFUSF9IX1BST1RPCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQKKyAgYXRhbihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9hdGFuZihfX3gpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZQorICBhdGFuKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2F0YW5sKF9feCk7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGF0YW4oX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fYXRhbihfX3gpOyB9CisKKyAgdXNpbmcgOjphdGFuMjsKKworI2lmbmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9NQVRIX0hfUFJPVE8KKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdAorICBhdGFuMihmbG9hdCBfX3ksIGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2F0YW4yZihfX3ksIF9feCk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlCisgIGF0YW4yKGxvbmcgZG91YmxlIF9feSwgbG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fYXRhbjJsKF9feSwgX194KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUKKyAgICBhdGFuMihfVHAgX195LCBfVXAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gYXRhbjIoX190eXBlKF9feSksIF9fdHlwZShfX3gpKTsKKyAgICB9CisKKyAgdXNpbmcgOjpjZWlsOworCisjaWZuZGVmIF9fQ09SUkVDVF9JU09fQ1BQX01BVEhfSF9QUk9UTworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGZsb2F0CisgIGNlaWwoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2VpbGYoX194KTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBkb3VibGUKKyAgY2VpbChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jZWlsbChfX3gpOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgY2VpbChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9jZWlsKF9feCk7IH0KKworICB1c2luZyA6OmNvczsKKworI2lmbmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9NQVRIX0hfUFJPVE8KKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdAorICBjb3MoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fY29zZihfX3gpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZQorICBjb3MobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fY29zbChfX3gpOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBjb3MoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fY29zKF9feCk7IH0KKworICB1c2luZyA6OmNvc2g7CisKKyNpZm5kZWYgX19DT1JSRUNUX0lTT19DUFBfTUFUSF9IX1BST1RPCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQKKyAgY29zaChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jb3NoZihfX3gpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZQorICBjb3NoKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2Nvc2hsKF9feCk7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGNvc2goX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fY29zaChfX3gpOyB9CisKKyAgdXNpbmcgOjpleHA7CisKKyNpZm5kZWYgX19DT1JSRUNUX0lTT19DUFBfTUFUSF9IX1BST1RPCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQKKyAgZXhwKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2V4cGYoX194KTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBkb3VibGUKKyAgZXhwKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2V4cGwoX194KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgZXhwKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2V4cChfX3gpOyB9CisKKyAgdXNpbmcgOjpmYWJzOworCisjaWZuZGVmIF9fQ09SUkVDVF9JU09fQ1BQX01BVEhfSF9QUk9UTworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGZsb2F0CisgIGZhYnMoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZmFic2YoX194KTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBkb3VibGUKKyAgZmFicyhsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mYWJzbChfX3gpOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBmYWJzKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2ZhYnMoX194KTsgfQorCisgIHVzaW5nIDo6Zmxvb3I7CisKKyNpZm5kZWYgX19DT1JSRUNUX0lTT19DUFBfTUFUSF9IX1BST1RPCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQKKyAgZmxvb3IoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZmxvb3JmKF9feCk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlCisgIGZsb29yKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2Zsb29ybChfX3gpOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBmbG9vcihfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9mbG9vcihfX3gpOyB9CisKKyAgdXNpbmcgOjpmbW9kOworCisjaWZuZGVmIF9fQ09SUkVDVF9JU09fQ1BQX01BVEhfSF9QUk9UTworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGZsb2F0CisgIGZtb2QoZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mbW9kZihfX3gsIF9feSk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlCisgIGZtb2QobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mbW9kbChfX3gsIF9feSk7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlCisgICAgZm1vZChfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gZm1vZChfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICB1c2luZyA6OmZyZXhwOworCisjaWZuZGVmIF9fQ09SUkVDVF9JU09fQ1BQX01BVEhfSF9QUk9UTworICBpbmxpbmUgZmxvYXQKKyAgZnJleHAoZmxvYXQgX194LCBpbnQqIF9fZXhwKQorICB7IHJldHVybiBfX2J1aWx0aW5fZnJleHBmKF9feCwgX19leHApOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGZyZXhwKGxvbmcgZG91YmxlIF9feCwgaW50KiBfX2V4cCkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZyZXhwbChfX3gsIF9fZXhwKTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGZyZXhwKF9UcCBfX3gsIGludCogX19leHApCisgICAgeyByZXR1cm4gX19idWlsdGluX2ZyZXhwKF9feCwgX19leHApOyB9CisKKyAgdXNpbmcgOjpsZGV4cDsKKworI2lmbmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9NQVRIX0hfUFJPVE8KKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdAorICBsZGV4cChmbG9hdCBfX3gsIGludCBfX2V4cCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xkZXhwZihfX3gsIF9fZXhwKTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBkb3VibGUKKyAgbGRleHAobG9uZyBkb3VibGUgX194LCBpbnQgX19leHApCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sZGV4cGwoX194LCBfX2V4cCk7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBsZGV4cChfVHAgX194LCBpbnQgX19leHApCisgICAgeyByZXR1cm4gX19idWlsdGluX2xkZXhwKF9feCwgX19leHApOyB9CisKKyAgdXNpbmcgOjpsb2c7CisKKyNpZm5kZWYgX19DT1JSRUNUX0lTT19DUFBfTUFUSF9IX1BST1RPCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQKKyAgbG9nKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xvZ2YoX194KTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBkb3VibGUKKyAgbG9nKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xvZ2woX194KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGxvZyhfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2coX194KTsgfQorCisgIHVzaW5nIDo6bG9nMTA7CisKKyNpZm5kZWYgX19DT1JSRUNUX0lTT19DUFBfTUFUSF9IX1BST1RPCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQKKyAgbG9nMTAoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbG9nMTBmKF9feCk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlCisgIGxvZzEwKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xvZzEwbChfX3gpOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBsb2cxMChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2cxMChfX3gpOyB9CisKKyAgdXNpbmcgOjptb2RmOworCisjaWZuZGVmIF9fQ09SUkVDVF9JU09fQ1BQX01BVEhfSF9QUk9UTworICBpbmxpbmUgZmxvYXQKKyAgbW9kZihmbG9hdCBfX3gsIGZsb2F0KiBfX2lwdHIpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9tb2RmZihfX3gsIF9faXB0cik7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgbW9kZihsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlKiBfX2lwdHIpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9tb2RmbChfX3gsIF9faXB0cik7IH0KKyNlbmRpZgorCisgIHVzaW5nIDo6cG93OworCisjaWZuZGVmIF9fQ09SUkVDVF9JU09fQ1BQX01BVEhfSF9QUk9UTworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGZsb2F0CisgIHBvdyhmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX3Bvd2YoX194LCBfX3kpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZQorICBwb3cobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9wb3dsKF9feCwgX195KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gRFIgNTUwLiBXaGF0IHNob3VsZCB0aGUgcmV0dXJuIHR5cGUgb2YgcG93KGZsb2F0LGludCkgYmU/CisgIGlubGluZSBkb3VibGUKKyAgcG93KGRvdWJsZSBfX3gsIGludCBfX2kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9wb3dpKF9feCwgX19pKTsgfQorCisgIGlubGluZSBmbG9hdAorICBwb3coZmxvYXQgX194LCBpbnQgX19uKQorICB7IHJldHVybiBfX2J1aWx0aW5fcG93aWYoX194LCBfX24pOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHBvdyhsb25nIGRvdWJsZSBfX3gsIGludCBfX24pCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9wb3dpbChfX3gsIF9fbik7IH0KKyNlbmRpZgorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUKKyAgICBwb3coX1RwIF9feCwgX1VwIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIHBvdyhfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICB1c2luZyA6OnNpbjsKKworI2lmbmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9NQVRIX0hfUFJPVE8KKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdAorICBzaW4oZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fc2luZihfX3gpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZQorICBzaW4obG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fc2lubChfX3gpOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgc2luKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX3NpbihfX3gpOyB9CisKKyAgdXNpbmcgOjpzaW5oOworCisjaWZuZGVmIF9fQ09SUkVDVF9JU09fQ1BQX01BVEhfSF9QUk9UTworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGZsb2F0CisgIHNpbmgoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fc2luaGYoX194KTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBkb3VibGUKKyAgc2luaChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9zaW5obChfX3gpOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgc2luaChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9zaW5oKF9feCk7IH0KKworICB1c2luZyA6OnNxcnQ7CisKKyNpZm5kZWYgX19DT1JSRUNUX0lTT19DUFBfTUFUSF9IX1BST1RPCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQKKyAgc3FydChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9zcXJ0ZihfX3gpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZQorICBzcXJ0KGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3NxcnRsKF9feCk7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBzcXJ0KF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX3NxcnQoX194KTsgfQorCisgIHVzaW5nIDo6dGFuOworCisjaWZuZGVmIF9fQ09SUkVDVF9JU09fQ1BQX01BVEhfSF9QUk9UTworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGZsb2F0CisgIHRhbihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl90YW5mKF9feCk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlCisgIHRhbihsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl90YW5sKF9feCk7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICB0YW4oX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fdGFuKF9feCk7IH0KKworICB1c2luZyA6OnRhbmg7CisKKyNpZm5kZWYgX19DT1JSRUNUX0lTT19DUFBfTUFUSF9IX1BST1RPCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQKKyAgdGFuaChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl90YW5oZihfX3gpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZQorICB0YW5oKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3RhbmhsKF9feCk7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICB0YW5oKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX3RhbmgoX194KTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEgKKyNpZiAhX0dMSUJDWFhfVVNFX0M5OV9GUF9NQUNST1NfRFlOQU1JQworCisvLyBUaGVzZSBhcmUgcG9zc2libGUgbWFjcm9zIGltcG9ydGVkIGZyb20gQzk5LWxhbmQuCisjdW5kZWYgZnBjbGFzc2lmeQorI3VuZGVmIGlzZmluaXRlCisjdW5kZWYgaXNpbmYKKyN1bmRlZiBpc25hbgorI3VuZGVmIGlzbm9ybWFsCisjdW5kZWYgc2lnbmJpdAorI3VuZGVmIGlzZ3JlYXRlcgorI3VuZGVmIGlzZ3JlYXRlcmVxdWFsCisjdW5kZWYgaXNsZXNzCisjdW5kZWYgaXNsZXNzZXF1YWwKKyN1bmRlZiBpc2xlc3NncmVhdGVyCisjdW5kZWYgaXN1bm9yZGVyZWQKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICBjb25zdGV4cHIgaW50CisgIGZwY2xhc3NpZnkoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZnBjbGFzc2lmeShGUF9OQU4sIEZQX0lORklOSVRFLCBGUF9OT1JNQUwsCisJCQkJRlBfU1VCTk9STUFMLCBGUF9aRVJPLCBfX3gpOyB9CisKKyAgY29uc3RleHByIGludAorICBmcGNsYXNzaWZ5KGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mcGNsYXNzaWZ5KEZQX05BTiwgRlBfSU5GSU5JVEUsIEZQX05PUk1BTCwKKwkJCQlGUF9TVUJOT1JNQUwsIEZQX1pFUk8sIF9feCk7IH0KKworICBjb25zdGV4cHIgaW50CisgIGZwY2xhc3NpZnkobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZnBjbGFzc2lmeShGUF9OQU4sIEZQX0lORklOSVRFLCBGUF9OT1JNQUwsCisJCQkJRlBfU1VCTk9STUFMLCBGUF9aRVJPLCBfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludD46Ol9fdHlwZQorICAgIGZwY2xhc3NpZnkoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX3ggIT0gMCA/IEZQX05PUk1BTCA6IEZQX1pFUk87IH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc2Zpbml0ZShmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2Zpbml0ZShfX3gpOyB9CisKKyAgY29uc3RleHByIGJvb2wKKyAgaXNmaW5pdGUoZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzZmluaXRlKF9feCk7IH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc2Zpbml0ZShsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2Zpbml0ZShfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2w+OjpfX3R5cGUKKyAgICBpc2Zpbml0ZShfVHAgX194KQorICAgIHsgcmV0dXJuIHRydWU7IH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc2luZihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2luZihfX3gpOyB9CisKKyAgY29uc3RleHByIGJvb2wKKyAgaXNpbmYoZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzaW5mKF9feCk7IH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc2luZihsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2luZihfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2w+OjpfX3R5cGUKKyAgICBpc2luZihfVHAgX194KQorICAgIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgY29uc3RleHByIGJvb2wKKyAgaXNuYW4oZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNuYW4oX194KTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzbmFuKGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc25hbihfX3gpOyB9CisKKyAgY29uc3RleHByIGJvb2wKKyAgaXNuYW4obG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNuYW4oX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sPjo6X190eXBlCisgICAgaXNuYW4oX1RwIF9feCkKKyAgICB7IHJldHVybiBmYWxzZTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzbm9ybWFsKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzbm9ybWFsKF9feCk7IH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc25vcm1hbChkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNub3JtYWwoX194KTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzbm9ybWFsKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzbm9ybWFsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbD46Ol9fdHlwZQorICAgIGlzbm9ybWFsKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX194ICE9IDAgPyB0cnVlIDogZmFsc2U7IH0KKworICBjb25zdGV4cHIgYm9vbAorICBzaWduYml0KGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3NpZ25iaXQoX194KTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIHNpZ25iaXQoZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3NpZ25iaXQoX194KTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIHNpZ25iaXQobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fc2lnbmJpdChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2w+OjpfX3R5cGUKKyAgICBzaWduYml0KF9UcCBfX3gpCisgICAgeyByZXR1cm4gX194IDwgMCA/IHRydWUgOiBmYWxzZTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzZ3JlYXRlcihmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzZ3JlYXRlcihfX3gsIF9feSk7IH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc2dyZWF0ZXIoZG91YmxlIF9feCwgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzZ3JlYXRlcihfX3gsIF9feSk7IH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc2dyZWF0ZXIobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2dyZWF0ZXIoX194LCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgY29uc3RleHByIHR5cGVuYW1lCisgICAgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjwoX19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUKKwkJCSAgICAmJiBfX2lzX2FyaXRobWV0aWM8X1VwPjo6X192YWx1ZSksIGJvb2w+OjpfX3R5cGUKKyAgICBpc2dyZWF0ZXIoX1RwIF9feCwgX1VwIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc2dyZWF0ZXIoX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyAgY29uc3RleHByIGJvb2wKKyAgaXNncmVhdGVyZXF1YWwoZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2dyZWF0ZXJlcXVhbChfX3gsIF9feSk7IH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc2dyZWF0ZXJlcXVhbChkb3VibGUgX194LCBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNncmVhdGVyZXF1YWwoX194LCBfX3kpOyB9CisKKyAgY29uc3RleHByIGJvb2wKKyAgaXNncmVhdGVyZXF1YWwobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2dyZWF0ZXJlcXVhbChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUKKyAgICBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPChfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZQorCQkJICAgICYmIF9faXNfYXJpdGhtZXRpYzxfVXA+OjpfX3ZhbHVlKSwgYm9vbD46Ol9fdHlwZQorICAgIGlzZ3JlYXRlcmVxdWFsKF9UcCBfX3gsIF9VcCBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNncmVhdGVyZXF1YWwoX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyAgY29uc3RleHByIGJvb2wKKyAgaXNsZXNzKGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNsZXNzKF9feCwgX195KTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzbGVzcyhkb3VibGUgX194LCBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNsZXNzKF9feCwgX195KTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzbGVzcyhsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzbGVzcyhfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUKKyAgICBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPChfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZQorCQkJICAgICYmIF9faXNfYXJpdGhtZXRpYzxfVXA+OjpfX3ZhbHVlKSwgYm9vbD46Ol9fdHlwZQorICAgIGlzbGVzcyhfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzbGVzcyhfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc2xlc3NlcXVhbChmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzbGVzc2VxdWFsKF9feCwgX195KTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzbGVzc2VxdWFsKGRvdWJsZSBfX3gsIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2xlc3NlcXVhbChfX3gsIF9feSk7IH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc2xlc3NlcXVhbChsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzbGVzc2VxdWFsKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZQorICAgIF9fZ251X2N4eDo6X19lbmFibGVfaWY8KF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlCisJCQkgICAgJiYgX19pc19hcml0aG1ldGljPF9VcD46Ol9fdmFsdWUpLCBib29sPjo6X190eXBlCisgICAgaXNsZXNzZXF1YWwoX1RwIF9feCwgX1VwIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc2xlc3NlcXVhbChfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc2xlc3NncmVhdGVyKGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNsZXNzZ3JlYXRlcihfX3gsIF9feSk7IH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc2xlc3NncmVhdGVyKGRvdWJsZSBfX3gsIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2xlc3NncmVhdGVyKF9feCwgX195KTsgfQorCisgIGNvbnN0ZXhwciBib29sCisgIGlzbGVzc2dyZWF0ZXIobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2xlc3NncmVhdGVyKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZQorICAgIF9fZ251X2N4eDo6X19lbmFibGVfaWY8KF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlCisJCQkgICAgJiYgX19pc19hcml0aG1ldGljPF9VcD46Ol9fdmFsdWUpLCBib29sPjo6X190eXBlCisgICAgaXNsZXNzZ3JlYXRlcihfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzbGVzc2dyZWF0ZXIoX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyAgY29uc3RleHByIGJvb2wKKyAgaXN1bm9yZGVyZWQoZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc3Vub3JkZXJlZChfX3gsIF9feSk7IH0KKworICBjb25zdGV4cHIgYm9vbAorICBpc3Vub3JkZXJlZChkb3VibGUgX194LCBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5faXN1bm9yZGVyZWQoX194LCBfX3kpOyB9CisKKyAgY29uc3RleHByIGJvb2wKKyAgaXN1bm9yZGVyZWQobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc3Vub3JkZXJlZChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUKKyAgICBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPChfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZQorCQkJICAgICYmIF9faXNfYXJpdGhtZXRpYzxfVXA+OjpfX3ZhbHVlKSwgYm9vbD46Ol9fdHlwZQorICAgIGlzdW5vcmRlcmVkKF9UcCBfX3gsIF9VcCBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXN1bm9yZGVyZWQoX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyNlbHNlCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBmcGNsYXNzaWZ5KF9UcCBfX2YpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9mcGNsYXNzaWZ5KEZQX05BTiwgRlBfSU5GSU5JVEUsIEZQX05PUk1BTCwKKwkJCQkgIEZQX1NVQk5PUk1BTCwgRlBfWkVSTywgX190eXBlKF9fZikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzZmluaXRlKF9UcCBfX2YpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc2Zpbml0ZShfX3R5cGUoX19mKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXNpbmYoX1RwIF9fZikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzaW5mKF9fdHlwZShfX2YpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBpc25hbihfVHAgX19mKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNuYW4oX190eXBlKF9fZikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzbm9ybWFsKF9UcCBfX2YpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc25vcm1hbChfX3R5cGUoX19mKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgc2lnbmJpdChfVHAgX19mKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5fc2lnbmJpdChfX3R5cGUoX19mKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXNncmVhdGVyKF9UcCBfX2YxLCBfVHAgX19mMikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzZ3JlYXRlcihfX3R5cGUoX19mMSksIF9fdHlwZShfX2YyKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXNncmVhdGVyZXF1YWwoX1RwIF9fZjEsIF9UcCBfX2YyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNncmVhdGVyZXF1YWwoX190eXBlKF9fZjEpLCBfX3R5cGUoX19mMikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzbGVzcyhfVHAgX19mMSwgX1RwIF9fZjIpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc2xlc3MoX190eXBlKF9fZjEpLCBfX3R5cGUoX19mMikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzbGVzc2VxdWFsKF9UcCBfX2YxLCBfVHAgX19mMikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzbGVzc2VxdWFsKF9fdHlwZShfX2YxKSwgX190eXBlKF9fZjIpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBpc2xlc3NncmVhdGVyKF9UcCBfX2YxLCBfVHAgX19mMikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzbGVzc2dyZWF0ZXIoX190eXBlKF9fZjEpLCBfX3R5cGUoX19mMikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzdW5vcmRlcmVkKF9UcCBfX2YxLCBfVHAgX19mMikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzdW5vcmRlcmVkKF9fdHlwZShfX2YxKSwgX190eXBlKF9fZjIpKTsKKyAgICB9CisKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9VU0VfQzk5X0ZQX01BQ1JPU19EWU5BTUlDICovCisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKworI3VuZGVmIGFjb3NoCisjdW5kZWYgYWNvc2hmCisjdW5kZWYgYWNvc2hsCisjdW5kZWYgYXNpbmgKKyN1bmRlZiBhc2luaGYKKyN1bmRlZiBhc2luaGwKKyN1bmRlZiBhdGFuaAorI3VuZGVmIGF0YW5oZgorI3VuZGVmIGF0YW5obAorI3VuZGVmIGNicnQKKyN1bmRlZiBjYnJ0ZgorI3VuZGVmIGNicnRsCisjdW5kZWYgY29weXNpZ24KKyN1bmRlZiBjb3B5c2lnbmYKKyN1bmRlZiBjb3B5c2lnbmwKKyN1bmRlZiBlcmYKKyN1bmRlZiBlcmZmCisjdW5kZWYgZXJmbAorI3VuZGVmIGVyZmMKKyN1bmRlZiBlcmZjZgorI3VuZGVmIGVyZmNsCisjdW5kZWYgZXhwMgorI3VuZGVmIGV4cDJmCisjdW5kZWYgZXhwMmwKKyN1bmRlZiBleHBtMQorI3VuZGVmIGV4cG0xZgorI3VuZGVmIGV4cG0xbAorI3VuZGVmIGZkaW0KKyN1bmRlZiBmZGltZgorI3VuZGVmIGZkaW1sCisjdW5kZWYgZm1hCisjdW5kZWYgZm1hZgorI3VuZGVmIGZtYWwKKyN1bmRlZiBmbWF4CisjdW5kZWYgZm1heGYKKyN1bmRlZiBmbWF4bAorI3VuZGVmIGZtaW4KKyN1bmRlZiBmbWluZgorI3VuZGVmIGZtaW5sCisjdW5kZWYgaHlwb3QKKyN1bmRlZiBoeXBvdGYKKyN1bmRlZiBoeXBvdGwKKyN1bmRlZiBpbG9nYgorI3VuZGVmIGlsb2diZgorI3VuZGVmIGlsb2dibAorI3VuZGVmIGxnYW1tYQorI3VuZGVmIGxnYW1tYWYKKyN1bmRlZiBsZ2FtbWFsCisjdW5kZWYgbGxyaW50CisjdW5kZWYgbGxyaW50ZgorI3VuZGVmIGxscmludGwKKyN1bmRlZiBsbHJvdW5kCisjdW5kZWYgbGxyb3VuZGYKKyN1bmRlZiBsbHJvdW5kbAorI3VuZGVmIGxvZzFwCisjdW5kZWYgbG9nMXBmCisjdW5kZWYgbG9nMXBsCisjdW5kZWYgbG9nMgorI3VuZGVmIGxvZzJmCisjdW5kZWYgbG9nMmwKKyN1bmRlZiBsb2diCisjdW5kZWYgbG9nYmYKKyN1bmRlZiBsb2dibAorI3VuZGVmIGxyaW50CisjdW5kZWYgbHJpbnRmCisjdW5kZWYgbHJpbnRsCisjdW5kZWYgbHJvdW5kCisjdW5kZWYgbHJvdW5kZgorI3VuZGVmIGxyb3VuZGwKKyN1bmRlZiBuYW4KKyN1bmRlZiBuYW5mCisjdW5kZWYgbmFubAorI3VuZGVmIG5lYXJieWludAorI3VuZGVmIG5lYXJieWludGYKKyN1bmRlZiBuZWFyYnlpbnRsCisjdW5kZWYgbmV4dGFmdGVyCisjdW5kZWYgbmV4dGFmdGVyZgorI3VuZGVmIG5leHRhZnRlcmwKKyN1bmRlZiBuZXh0dG93YXJkCisjdW5kZWYgbmV4dHRvd2FyZGYKKyN1bmRlZiBuZXh0dG93YXJkbAorI3VuZGVmIHJlbWFpbmRlcgorI3VuZGVmIHJlbWFpbmRlcmYKKyN1bmRlZiByZW1haW5kZXJsCisjdW5kZWYgcmVtcXVvCisjdW5kZWYgcmVtcXVvZgorI3VuZGVmIHJlbXF1b2wKKyN1bmRlZiByaW50CisjdW5kZWYgcmludGYKKyN1bmRlZiByaW50bAorI3VuZGVmIHJvdW5kCisjdW5kZWYgcm91bmRmCisjdW5kZWYgcm91bmRsCisjdW5kZWYgc2NhbGJsbgorI3VuZGVmIHNjYWxibG5mCisjdW5kZWYgc2NhbGJsbmwKKyN1bmRlZiBzY2FsYm4KKyN1bmRlZiBzY2FsYm5mCisjdW5kZWYgc2NhbGJubAorI3VuZGVmIHRnYW1tYQorI3VuZGVmIHRnYW1tYWYKKyN1bmRlZiB0Z2FtbWFsCisjdW5kZWYgdHJ1bmMKKyN1bmRlZiB0cnVuY2YKKyN1bmRlZiB0cnVuY2wKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIHR5cGVzCisgIHVzaW5nIDo6ZG91YmxlX3Q7CisgIHVzaW5nIDo6ZmxvYXRfdDsKKworICAvLyBmdW5jdGlvbnMKKyAgdXNpbmcgOjphY29zaDsKKyAgdXNpbmcgOjphY29zaGY7CisgIHVzaW5nIDo6YWNvc2hsOworCisgIHVzaW5nIDo6YXNpbmg7CisgIHVzaW5nIDo6YXNpbmhmOworICB1c2luZyA6OmFzaW5obDsKKworICB1c2luZyA6OmF0YW5oOworICB1c2luZyA6OmF0YW5oZjsKKyAgdXNpbmcgOjphdGFuaGw7CisKKyAgdXNpbmcgOjpjYnJ0OworICB1c2luZyA6OmNicnRmOworICB1c2luZyA6OmNicnRsOworCisgIHVzaW5nIDo6Y29weXNpZ247CisgIHVzaW5nIDo6Y29weXNpZ25mOworICB1c2luZyA6OmNvcHlzaWdubDsKKworICB1c2luZyA6OmVyZjsKKyAgdXNpbmcgOjplcmZmOworICB1c2luZyA6OmVyZmw7CisKKyAgdXNpbmcgOjplcmZjOworICB1c2luZyA6OmVyZmNmOworICB1c2luZyA6OmVyZmNsOworCisgIHVzaW5nIDo6ZXhwMjsKKyAgdXNpbmcgOjpleHAyZjsKKyAgdXNpbmcgOjpleHAybDsKKworICB1c2luZyA6OmV4cG0xOworICB1c2luZyA6OmV4cG0xZjsKKyAgdXNpbmcgOjpleHBtMWw7CisKKyAgdXNpbmcgOjpmZGltOworICB1c2luZyA6OmZkaW1mOworICB1c2luZyA6OmZkaW1sOworCisgIHVzaW5nIDo6Zm1hOworICB1c2luZyA6OmZtYWY7CisgIHVzaW5nIDo6Zm1hbDsKKworICB1c2luZyA6OmZtYXg7CisgIHVzaW5nIDo6Zm1heGY7CisgIHVzaW5nIDo6Zm1heGw7CisKKyAgdXNpbmcgOjpmbWluOworICB1c2luZyA6OmZtaW5mOworICB1c2luZyA6OmZtaW5sOworCisgIHVzaW5nIDo6aHlwb3Q7CisgIHVzaW5nIDo6aHlwb3RmOworICB1c2luZyA6Omh5cG90bDsKKworICB1c2luZyA6Omlsb2diOworICB1c2luZyA6Omlsb2diZjsKKyAgdXNpbmcgOjppbG9nYmw7CisKKyAgdXNpbmcgOjpsZ2FtbWE7CisgIHVzaW5nIDo6bGdhbW1hZjsKKyAgdXNpbmcgOjpsZ2FtbWFsOworCisgIHVzaW5nIDo6bGxyaW50OworICB1c2luZyA6OmxscmludGY7CisgIHVzaW5nIDo6bGxyaW50bDsKKworICB1c2luZyA6Omxscm91bmQ7CisgIHVzaW5nIDo6bGxyb3VuZGY7CisgIHVzaW5nIDo6bGxyb3VuZGw7CisKKyAgdXNpbmcgOjpsb2cxcDsKKyAgdXNpbmcgOjpsb2cxcGY7CisgIHVzaW5nIDo6bG9nMXBsOworCisgIHVzaW5nIDo6bG9nMjsKKyAgdXNpbmcgOjpsb2cyZjsKKyAgdXNpbmcgOjpsb2cybDsKKworICB1c2luZyA6OmxvZ2I7CisgIHVzaW5nIDo6bG9nYmY7CisgIHVzaW5nIDo6bG9nYmw7CisKKyAgdXNpbmcgOjpscmludDsKKyAgdXNpbmcgOjpscmludGY7CisgIHVzaW5nIDo6bHJpbnRsOworCisgIHVzaW5nIDo6bHJvdW5kOworICB1c2luZyA6Omxyb3VuZGY7CisgIHVzaW5nIDo6bHJvdW5kbDsKKworICB1c2luZyA6Om5hbjsKKyAgdXNpbmcgOjpuYW5mOworICB1c2luZyA6Om5hbmw7CisKKyAgdXNpbmcgOjpuZWFyYnlpbnQ7CisgIHVzaW5nIDo6bmVhcmJ5aW50ZjsKKyAgdXNpbmcgOjpuZWFyYnlpbnRsOworCisgIHVzaW5nIDo6bmV4dGFmdGVyOworICB1c2luZyA6Om5leHRhZnRlcmY7CisgIHVzaW5nIDo6bmV4dGFmdGVybDsKKworICB1c2luZyA6Om5leHR0b3dhcmQ7CisgIHVzaW5nIDo6bmV4dHRvd2FyZGY7CisgIHVzaW5nIDo6bmV4dHRvd2FyZGw7CisKKyAgdXNpbmcgOjpyZW1haW5kZXI7CisgIHVzaW5nIDo6cmVtYWluZGVyZjsKKyAgdXNpbmcgOjpyZW1haW5kZXJsOworCisgIHVzaW5nIDo6cmVtcXVvOworICB1c2luZyA6OnJlbXF1b2Y7CisgIHVzaW5nIDo6cmVtcXVvbDsKKworICB1c2luZyA6OnJpbnQ7CisgIHVzaW5nIDo6cmludGY7CisgIHVzaW5nIDo6cmludGw7CisKKyAgdXNpbmcgOjpyb3VuZDsKKyAgdXNpbmcgOjpyb3VuZGY7CisgIHVzaW5nIDo6cm91bmRsOworCisgIHVzaW5nIDo6c2NhbGJsbjsKKyAgdXNpbmcgOjpzY2FsYmxuZjsKKyAgdXNpbmcgOjpzY2FsYmxubDsKKworICB1c2luZyA6OnNjYWxibjsKKyAgdXNpbmcgOjpzY2FsYm5mOworICB1c2luZyA6OnNjYWxibmw7CisKKyAgdXNpbmcgOjp0Z2FtbWE7CisgIHVzaW5nIDo6dGdhbW1hZjsKKyAgdXNpbmcgOjp0Z2FtbWFsOworCisgIHVzaW5nIDo6dHJ1bmM7CisgIHVzaW5nIDo6dHJ1bmNmOworICB1c2luZyA6OnRydW5jbDsKKworICAvLy8gQWRkaXRpb25hbCBvdmVybG9hZHMuCisgIGNvbnN0ZXhwciBmbG9hdAorICBhY29zaChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9hY29zaGYoX194KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGRvdWJsZQorICBhY29zaChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9hY29zaGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgYWNvc2goX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fYWNvc2goX194KTsgfQorCisgIGNvbnN0ZXhwciBmbG9hdAorICBhc2luaChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9hc2luaGYoX194KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGRvdWJsZQorICBhc2luaChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9hc2luaGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgYXNpbmgoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fYXNpbmgoX194KTsgfQorCisgIGNvbnN0ZXhwciBmbG9hdAorICBhdGFuaChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9hdGFuaGYoX194KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGRvdWJsZQorICBhdGFuaChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9hdGFuaGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgYXRhbmgoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fYXRhbmgoX194KTsgfQorCisgIGNvbnN0ZXhwciBmbG9hdAorICBjYnJ0KGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2NicnRmKF9feCk7IH0KKworICBjb25zdGV4cHIgbG9uZyBkb3VibGUKKyAgY2JydChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYnJ0bChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBjYnJ0KF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2NicnQoX194KTsgfQorCisgIGNvbnN0ZXhwciBmbG9hdAorICBjb3B5c2lnbihmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2NvcHlzaWduZihfX3gsIF9feSk7IH0KKworICBjb25zdGV4cHIgbG9uZyBkb3VibGUKKyAgY29weXNpZ24obG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jb3B5c2lnbmwoX194LCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUKKyAgICBjb3B5c2lnbihfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gY29weXNpZ24oX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyAgY29uc3RleHByIGZsb2F0CisgIGVyZihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9lcmZmKF9feCk7IH0KKworICBjb25zdGV4cHIgbG9uZyBkb3VibGUKKyAgZXJmKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2VyZmwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgZXJmKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2VyZihfX3gpOyB9CisKKyAgY29uc3RleHByIGZsb2F0CisgIGVyZmMoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZXJmY2YoX194KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGRvdWJsZQorICBlcmZjKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2VyZmNsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGVyZmMoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fZXJmYyhfX3gpOyB9CisKKyAgY29uc3RleHByIGZsb2F0CisgIGV4cDIoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZXhwMmYoX194KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGRvdWJsZQorICBleHAyKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2V4cDJsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGV4cDIoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fZXhwMihfX3gpOyB9CisKKyAgY29uc3RleHByIGZsb2F0CisgIGV4cG0xKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2V4cG0xZihfX3gpOyB9CisKKyAgY29uc3RleHByIGxvbmcgZG91YmxlCisgIGV4cG0xKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2V4cG0xbChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBleHBtMShfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9leHBtMShfX3gpOyB9CisKKyAgY29uc3RleHByIGZsb2F0CisgIGZkaW0oZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mZGltZihfX3gsIF9feSk7IH0KKworICBjb25zdGV4cHIgbG9uZyBkb3VibGUKKyAgZmRpbShsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZkaW1sKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlCisgICAgZmRpbShfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gZmRpbShfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICBjb25zdGV4cHIgZmxvYXQKKyAgZm1hKGZsb2F0IF9feCwgZmxvYXQgX195LCBmbG9hdCBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mbWFmKF9feCwgX195LCBfX3opOyB9CisKKyAgY29uc3RleHByIGxvbmcgZG91YmxlCisgIGZtYShsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSwgbG9uZyBkb3VibGUgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fZm1hbChfX3gsIF9feSwgX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwLCB0eXBlbmFtZSBfVnA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzM8X1RwLCBfVXAsIF9WcD46Ol9fdHlwZQorICAgIGZtYShfVHAgX194LCBfVXAgX195LCBfVnAgX196KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMzxfVHAsIF9VcCwgX1ZwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBmbWEoX190eXBlKF9feCksIF9fdHlwZShfX3kpLCBfX3R5cGUoX196KSk7CisgICAgfQorCisgIGNvbnN0ZXhwciBmbG9hdAorICBmbWF4KGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fZm1heGYoX194LCBfX3kpOyB9CisKKyAgY29uc3RleHByIGxvbmcgZG91YmxlCisgIGZtYXgobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mbWF4bChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZQorICAgIGZtYXgoX1RwIF9feCwgX1VwIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIGZtYXgoX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyAgY29uc3RleHByIGZsb2F0CisgIGZtaW4oZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mbWluZihfX3gsIF9feSk7IH0KKworICBjb25zdGV4cHIgbG9uZyBkb3VibGUKKyAgZm1pbihsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZtaW5sKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlCisgICAgZm1pbihfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gZm1pbihfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICBjb25zdGV4cHIgZmxvYXQKKyAgaHlwb3QoZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9oeXBvdGYoX194LCBfX3kpOyB9CisKKyAgY29uc3RleHByIGxvbmcgZG91YmxlCisgIGh5cG90KGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5faHlwb3RsKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlCisgICAgaHlwb3QoX1RwIF9feCwgX1VwIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIGh5cG90KF9fdHlwZShfX3gpLCBfX3R5cGUoX195KSk7CisgICAgfQorCisgIGNvbnN0ZXhwciBpbnQKKyAgaWxvZ2IoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5faWxvZ2JmKF9feCk7IH0KKworICBjb25zdGV4cHIgaW50CisgIGlsb2diKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2lsb2dibChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwcgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50Pjo6X190eXBlCisgICAgaWxvZ2IoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5faWxvZ2IoX194KTsgfQorCisgIGNvbnN0ZXhwciBmbG9hdAorICBsZ2FtbWEoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbGdhbW1hZihfX3gpOyB9CisKKyAgY29uc3RleHByIGxvbmcgZG91YmxlCisgIGxnYW1tYShsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sZ2FtbWFsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGxnYW1tYShfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9sZ2FtbWEoX194KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGxvbmcKKyAgbGxyaW50KGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xscmludGYoX194KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGxvbmcKKyAgbGxyaW50KGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xscmludGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsb25nPjo6X190eXBlCisgICAgbGxyaW50KF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2xscmludChfX3gpOyB9CisKKyAgY29uc3RleHByIGxvbmcgbG9uZworICBsbHJvdW5kKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xscm91bmRmKF9feCk7IH0KKworICBjb25zdGV4cHIgbG9uZyBsb25nCisgIGxscm91bmQobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbGxyb3VuZGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsb25nPjo6X190eXBlCisgICAgbGxyb3VuZChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9sbHJvdW5kKF9feCk7IH0KKworICBjb25zdGV4cHIgZmxvYXQKKyAgbG9nMXAoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbG9nMXBmKF9feCk7IH0KKworICBjb25zdGV4cHIgbG9uZyBkb3VibGUKKyAgbG9nMXAobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbG9nMXBsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGxvZzFwKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2xvZzFwKF9feCk7IH0KKworICAvLyBEUiA1NjguCisgIGNvbnN0ZXhwciBmbG9hdAorICBsb2cyKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xvZzJmKF9feCk7IH0KKworICBjb25zdGV4cHIgbG9uZyBkb3VibGUKKyAgbG9nMihsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2cybChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBsb2cyKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2xvZzIoX194KTsgfQorCisgIGNvbnN0ZXhwciBmbG9hdAorICBsb2diKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xvZ2JmKF9feCk7IH0KKworICBjb25zdGV4cHIgbG9uZyBkb3VibGUKKyAgbG9nYihsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2dibChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBsb2diKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2xvZ2IoX194KTsgfQorCisgIGNvbnN0ZXhwciBsb25nCisgIGxyaW50KGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xyaW50ZihfX3gpOyB9CisKKyAgY29uc3RleHByIGxvbmcKKyAgbHJpbnQobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbHJpbnRsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmc+OjpfX3R5cGUKKyAgICBscmludChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9scmludChfX3gpOyB9CisKKyAgY29uc3RleHByIGxvbmcKKyAgbHJvdW5kKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xyb3VuZGYoX194KTsgfQorCisgIGNvbnN0ZXhwciBsb25nCisgIGxyb3VuZChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9scm91bmRsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmc+OjpfX3R5cGUKKyAgICBscm91bmQoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fbHJvdW5kKF9feCk7IH0KKworICBjb25zdGV4cHIgZmxvYXQKKyAgbmVhcmJ5aW50KGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX25lYXJieWludGYoX194KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGRvdWJsZQorICBuZWFyYnlpbnQobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbmVhcmJ5aW50bChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBuZWFyYnlpbnQoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fbmVhcmJ5aW50KF9feCk7IH0KKworICBjb25zdGV4cHIgZmxvYXQKKyAgbmV4dGFmdGVyKGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fbmV4dGFmdGVyZihfX3gsIF9feSk7IH0KKworICBjb25zdGV4cHIgbG9uZyBkb3VibGUKKyAgbmV4dGFmdGVyKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fbmV4dGFmdGVybChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZQorICAgIG5leHRhZnRlcihfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gbmV4dGFmdGVyKF9fdHlwZShfX3gpLCBfX3R5cGUoX195KSk7CisgICAgfQorCisgIGNvbnN0ZXhwciBmbG9hdAorICBuZXh0dG93YXJkKGZsb2F0IF9feCwgbG9uZyBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fbmV4dHRvd2FyZGYoX194LCBfX3kpOyB9CisKKyAgY29uc3RleHByIGxvbmcgZG91YmxlCisgIG5leHR0b3dhcmQobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZXh0dG93YXJkbChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIG5leHR0b3dhcmQoX1RwIF9feCwgbG9uZyBkb3VibGUgX195KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZXh0dG93YXJkKF9feCwgX195KTsgfQorCisgIGNvbnN0ZXhwciBmbG9hdAorICByZW1haW5kZXIoZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9yZW1haW5kZXJmKF9feCwgX195KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGRvdWJsZQorICByZW1haW5kZXIobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9yZW1haW5kZXJsKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlCisgICAgcmVtYWluZGVyKF9UcCBfX3gsIF9VcCBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiByZW1haW5kZXIoX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIHJlbXF1byhmbG9hdCBfX3gsIGZsb2F0IF9feSwgaW50KiBfX3BxdW8pCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9yZW1xdW9mKF9feCwgX195LCBfX3BxdW8pOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHJlbXF1byhsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSwgaW50KiBfX3BxdW8pCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9yZW1xdW9sKF9feCwgX195LCBfX3BxdW8pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUKKyAgICByZW1xdW8oX1RwIF9feCwgX1VwIF9feSwgaW50KiBfX3BxdW8pCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiByZW1xdW8oX190eXBlKF9feCksIF9fdHlwZShfX3kpLCBfX3BxdW8pOworICAgIH0KKworICBjb25zdGV4cHIgZmxvYXQKKyAgcmludChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9yaW50ZihfX3gpOyB9CisKKyAgY29uc3RleHByIGxvbmcgZG91YmxlCisgIHJpbnQobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fcmludGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgcmludChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9yaW50KF9feCk7IH0KKworICBjb25zdGV4cHIgZmxvYXQKKyAgcm91bmQoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fcm91bmRmKF9feCk7IH0KKworICBjb25zdGV4cHIgbG9uZyBkb3VibGUKKyAgcm91bmQobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fcm91bmRsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIHJvdW5kKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX3JvdW5kKF9feCk7IH0KKworICBjb25zdGV4cHIgZmxvYXQKKyAgc2NhbGJsbihmbG9hdCBfX3gsIGxvbmcgX19leCkKKyAgeyByZXR1cm4gX19idWlsdGluX3NjYWxibG5mKF9feCwgX19leCk7IH0KKworICBjb25zdGV4cHIgbG9uZyBkb3VibGUKKyAgc2NhbGJsbihsb25nIGRvdWJsZSBfX3gsIGxvbmcgX19leCkKKyAgeyByZXR1cm4gX19idWlsdGluX3NjYWxibG5sKF9feCwgX19leCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3RleHByIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZT46Ol9fdHlwZQorICAgIHNjYWxibG4oX1RwIF9feCwgbG9uZyBfX2V4KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9zY2FsYmxuKF9feCwgX19leCk7IH0KKyAKKyAgY29uc3RleHByIGZsb2F0CisgIHNjYWxibihmbG9hdCBfX3gsIGludCBfX2V4KQorICB7IHJldHVybiBfX2J1aWx0aW5fc2NhbGJuZihfX3gsIF9fZXgpOyB9CisKKyAgY29uc3RleHByIGxvbmcgZG91YmxlCisgIHNjYWxibihsb25nIGRvdWJsZSBfX3gsIGludCBfX2V4KQorICB7IHJldHVybiBfX2J1aWx0aW5fc2NhbGJubChfX3gsIF9fZXgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGU+OjpfX3R5cGUKKyAgICBzY2FsYm4oX1RwIF9feCwgaW50IF9fZXgpCisgICAgeyByZXR1cm4gX19idWlsdGluX3NjYWxibihfX3gsIF9fZXgpOyB9CisKKyAgY29uc3RleHByIGZsb2F0CisgIHRnYW1tYShmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl90Z2FtbWFmKF9feCk7IH0KKworICBjb25zdGV4cHIgbG9uZyBkb3VibGUKKyAgdGdhbW1hKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3RnYW1tYWwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgdGdhbW1hKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX3RnYW1tYShfX3gpOyB9CisgCisgIGNvbnN0ZXhwciBmbG9hdAorICB0cnVuYyhmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl90cnVuY2YoX194KTsgfQorCisgIGNvbnN0ZXhwciBsb25nIGRvdWJsZQorICB0cnVuYyhsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl90cnVuY2woX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlPjo6X190eXBlCisgICAgdHJ1bmMoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fdHJ1bmMoX194KTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY29tcGxleCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY29tcGxleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDlmMjkxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jb21wbGV4CkBAIC0wLDAgKzEsMTkzMyBAQAorLy8gVGhlIHRlbXBsYXRlIGFuZCBpbmxpbmVzIGZvciB0aGUgLSotIEMrKyAtKi0gY29tcGxleCBudW1iZXIgY2xhc3Nlcy4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY29tcGxleAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDI2LjIgIENvbXBsZXggTnVtYmVycworLy8gTm90ZTogdGhpcyBpcyBub3QgYSBjb25mb3JtaW5nIGltcGxlbWVudGF0aW9uLgorLy8gSW5pdGlhbGx5IGltcGxlbWVudGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+CisvLyBJbXByb3ZlZCBieSBHYWJyaWVsIERvcyBSZWlzIDxkb3NyZWlzQGNtbGEuZW5zLWNhY2hhbi5mcj4KKy8vCisKKyNpZm5kZWYgX0dMSUJDWFhfQ09NUExFWAorI2RlZmluZSBfR0xJQkNYWF9DT01QTEVYIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL2NwcF90eXBlX3RyYWl0cy5oPgorI2luY2x1ZGUgPGV4dC90eXBlX3RyYWl0cy5oPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKy8vIEdldCByaWQgb2YgYSBtYWNybyBwb3NzaWJseSBkZWZpbmVkIGluIDxjb21wbGV4Lmg+CisjdW5kZWYgY29tcGxleAorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBkZWZncm91cCBjb21wbGV4X251bWJlcnMgQ29tcGxleCBOdW1iZXJzCisgICAqIEBpbmdyb3VwIG51bWVyaWNzCisgICAqCisgICAqIENsYXNzZXMgYW5kIGZ1bmN0aW9ucyBmb3IgY29tcGxleCBudW1iZXJzLgorICAgKiBAeworICAgKi8KKworICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBjbGFzcyBjb21wbGV4OworICB0ZW1wbGF0ZTw+IGNsYXNzIGNvbXBsZXg8ZmxvYXQ+OworICB0ZW1wbGF0ZTw+IGNsYXNzIGNvbXBsZXg8ZG91YmxlPjsKKyAgdGVtcGxhdGU8PiBjbGFzcyBjb21wbGV4PGxvbmcgZG91YmxlPjsKKworICAvLy8gIFJldHVybiBtYWduaXR1ZGUgb2YgQGEgei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBfVHAgYWJzKGNvbnN0IGNvbXBsZXg8X1RwPiYpOworICAvLy8gIFJldHVybiBwaGFzZSBhbmdsZSBvZiBAYSB6LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IF9UcCBhcmcoY29uc3QgY29tcGxleDxfVHA+Jik7CisgIC8vLyAgUmV0dXJuIEBhIHogbWFnbml0dWRlIHNxdWFyZWQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gX1RwIG5vcm0oY29uc3QgY29tcGxleDxfVHA+Jik7CisKKyAgLy8vICBSZXR1cm4gY29tcGxleCBjb25qdWdhdGUgb2YgQGEgei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBjb21wbGV4PF9UcD4gY29uaihjb25zdCBjb21wbGV4PF9UcD4mKTsKKyAgLy8vICBSZXR1cm4gY29tcGxleCB3aXRoIG1hZ25pdHVkZSBAYSByaG8gYW5kIGFuZ2xlIEBhIHRoZXRhLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IGNvbXBsZXg8X1RwPiBwb2xhcihjb25zdCBfVHAmLCBjb25zdCBfVHAmID0gMCk7CisKKyAgLy8gVHJhbnNjZW5kZW50YWxzOgorICAvLy8gUmV0dXJuIGNvbXBsZXggY29zaW5lIG9mIEBhIHouCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gY29tcGxleDxfVHA+IGNvcyhjb25zdCBjb21wbGV4PF9UcD4mKTsKKyAgLy8vIFJldHVybiBjb21wbGV4IGh5cGVyYm9saWMgY29zaW5lIG9mIEBhIHouCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gY29tcGxleDxfVHA+IGNvc2goY29uc3QgY29tcGxleDxfVHA+Jik7CisgIC8vLyBSZXR1cm4gY29tcGxleCBiYXNlIGUgZXhwb25lbnRpYWwgb2YgQGEgei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBjb21wbGV4PF9UcD4gZXhwKGNvbnN0IGNvbXBsZXg8X1RwPiYpOworICAvLy8gUmV0dXJuIGNvbXBsZXggbmF0dXJhbCBsb2dhcml0aG0gb2YgQGEgei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBjb21wbGV4PF9UcD4gbG9nKGNvbnN0IGNvbXBsZXg8X1RwPiYpOworICAvLy8gUmV0dXJuIGNvbXBsZXggYmFzZSAxMCBsb2dhcml0aG0gb2YgQGEgei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBjb21wbGV4PF9UcD4gbG9nMTAoY29uc3QgY29tcGxleDxfVHA+Jik7CisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgIC8vIERSIDg0NC4KKyAgLy8vIFJldHVybiBAYSB4IHRvIHRoZSBAYSB5J3RoIHBvd2VyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IGNvbXBsZXg8X1RwPiBwb3coY29uc3QgY29tcGxleDxfVHA+JiwgaW50KTsKKyNlbmRpZgorICAvLy8gUmV0dXJuIEBhIHggdG8gdGhlIEBhIHkndGggcG93ZXIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gY29tcGxleDxfVHA+IHBvdyhjb25zdCBjb21wbGV4PF9UcD4mLCBjb25zdCBfVHAmKTsKKyAgLy8vIFJldHVybiBAYSB4IHRvIHRoZSBAYSB5J3RoIHBvd2VyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IGNvbXBsZXg8X1RwPiBwb3coY29uc3QgY29tcGxleDxfVHA+JiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV4PF9UcD4mKTsKKyAgLy8vIFJldHVybiBAYSB4IHRvIHRoZSBAYSB5J3RoIHBvd2VyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IGNvbXBsZXg8X1RwPiBwb3coY29uc3QgX1RwJiwgY29uc3QgY29tcGxleDxfVHA+Jik7CisgIC8vLyBSZXR1cm4gY29tcGxleCBzaW5lIG9mIEBhIHouCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gY29tcGxleDxfVHA+IHNpbihjb25zdCBjb21wbGV4PF9UcD4mKTsKKyAgLy8vIFJldHVybiBjb21wbGV4IGh5cGVyYm9saWMgc2luZSBvZiBAYSB6LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IGNvbXBsZXg8X1RwPiBzaW5oKGNvbnN0IGNvbXBsZXg8X1RwPiYpOworICAvLy8gUmV0dXJuIGNvbXBsZXggc3F1YXJlIHJvb3Qgb2YgQGEgei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBjb21wbGV4PF9UcD4gc3FydChjb25zdCBjb21wbGV4PF9UcD4mKTsKKyAgLy8vIFJldHVybiBjb21wbGV4IHRhbmdlbnQgb2YgQGEgei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBjb21wbGV4PF9UcD4gdGFuKGNvbnN0IGNvbXBsZXg8X1RwPiYpOworICAvLy8gUmV0dXJuIGNvbXBsZXggaHlwZXJib2xpYyB0YW5nZW50IG9mIEBhIHouCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gY29tcGxleDxfVHA+IHRhbmgoY29uc3QgY29tcGxleDxfVHA+Jik7CisgICAgCisgICAgCisgIC8vIDI2LjIuMiAgUHJpbWFyeSB0ZW1wbGF0ZSBjbGFzcyBjb21wbGV4CisgIC8qKgorICAgKiAgVGVtcGxhdGUgdG8gcmVwcmVzZW50IGNvbXBsZXggbnVtYmVycy4KKyAgICoKKyAgICogIFNwZWNpYWxpemF0aW9ucyBmb3IgZmxvYXQsIGRvdWJsZSwgYW5kIGxvbmcgZG91YmxlIGFyZSBwYXJ0IG9mIHRoZQorICAgKiAgbGlicmFyeS4gIFJlc3VsdHMgd2l0aCBhbnkgb3RoZXIgdHlwZSBhcmUgbm90IGd1YXJhbnRlZWQuCisgICAqCisgICAqICBAcGFyYW0gIFRwICBUeXBlIG9mIHJlYWwgYW5kIGltYWdpbmFyeSB2YWx1ZXMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgY29tcGxleAorICAgIHsKKyAgICAgIC8vLyBWYWx1ZSB0eXBlZGVmLgorICAgICAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKyAgICAgIAorICAgICAgLy8vICBEZWZhdWx0IGNvbnN0cnVjdG9yLiAgRmlyc3QgcGFyYW1ldGVyIGlzIHgsIHNlY29uZCBwYXJhbWV0ZXIgaXMgeS4KKyAgICAgIC8vLyAgVW5zcGVjaWZpZWQgcGFyYW1ldGVycyBkZWZhdWx0IHRvIDAuCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgY29tcGxleChjb25zdCBfVHAmIF9fciA9IF9UcCgpLCBjb25zdCBfVHAmIF9faSA9IF9UcCgpKQorICAgICAgOiBfTV9yZWFsKF9fciksIF9NX2ltYWcoX19pKSB7IH0KKworICAgICAgLy8gTGV0cyB0aGUgY29tcGlsZXIgc3ludGhlc2l6ZSB0aGUgY29weSBjb25zdHJ1Y3RvciAgIAorICAgICAgLy8gY29tcGxleCAoY29uc3QgY29tcGxleDxfVHA+Jik7CisgICAgICAvLy8gIENvcHkgY29uc3RydWN0b3IuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBjb21wbGV4KGNvbnN0IGNvbXBsZXg8X1VwPiYgX196KQorCTogX01fcmVhbChfX3oucmVhbCgpKSwgX01faW1hZyhfX3ouaW1hZygpKSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDM4Ny4gc3RkOjpjb21wbGV4IG92ZXItZW5jYXBzdWxhdGVkLgorICAgICAgX0dMSUJDWFhfQUJJX1RBR19DWFgxMQorICAgICAgY29uc3RleHByIF9UcCAKKyAgICAgIHJlYWwoKSB7IHJldHVybiBfTV9yZWFsOyB9CisKKyAgICAgIF9HTElCQ1hYX0FCSV9UQUdfQ1hYMTEKKyAgICAgIGNvbnN0ZXhwciBfVHAgCisgICAgICBpbWFnKCkgeyByZXR1cm4gX01faW1hZzsgfQorI2Vsc2UKKyAgICAgIC8vLyAgUmV0dXJuIHJlYWwgcGFydCBvZiBjb21wbGV4IG51bWJlci4KKyAgICAgIF9UcCYgCisgICAgICByZWFsKCkgeyByZXR1cm4gX01fcmVhbDsgfQorCisgICAgICAvLy8gIFJldHVybiByZWFsIHBhcnQgb2YgY29tcGxleCBudW1iZXIuCisgICAgICBjb25zdCBfVHAmIAorICAgICAgcmVhbCgpIGNvbnN0IHsgcmV0dXJuIF9NX3JlYWw7IH0KKworICAgICAgLy8vICBSZXR1cm4gaW1hZ2luYXJ5IHBhcnQgb2YgY29tcGxleCBudW1iZXIuCisgICAgICBfVHAmIAorICAgICAgaW1hZygpIHsgcmV0dXJuIF9NX2ltYWc7IH0KKworICAgICAgLy8vICBSZXR1cm4gaW1hZ2luYXJ5IHBhcnQgb2YgY29tcGxleCBudW1iZXIuCisgICAgICBjb25zdCBfVHAmIAorICAgICAgaW1hZygpIGNvbnN0IHsgcmV0dXJuIF9NX2ltYWc7IH0KKyNlbmRpZgorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAzODcuIHN0ZDo6Y29tcGxleCBvdmVyLWVuY2Fwc3VsYXRlZC4KKyAgICAgIHZvaWQgCisgICAgICByZWFsKF9UcCBfX3ZhbCkgeyBfTV9yZWFsID0gX192YWw7IH0KKworICAgICAgdm9pZCAKKyAgICAgIGltYWcoX1RwIF9fdmFsKSB7IF9NX2ltYWcgPSBfX3ZhbDsgfQorCisgICAgICAvLy8gQXNzaWduIHRoaXMgY29tcGxleCBudW1iZXIgdG8gc2NhbGFyIEBhIHQuCisgICAgICBjb21wbGV4PF9UcD4mIG9wZXJhdG9yPShjb25zdCBfVHAmKTsKKyAgICAgIAorICAgICAgLy8vIEFkZCBAYSB0IHRvIHRoaXMgY29tcGxleCBudW1iZXIuCisgICAgICAvLyAyNi4yLjUvMQorICAgICAgY29tcGxleDxfVHA+JgorICAgICAgb3BlcmF0b3IrPShjb25zdCBfVHAmIF9fdCkKKyAgICAgIHsKKwlfTV9yZWFsICs9IF9fdDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vLyBTdWJ0cmFjdCBAYSB0IGZyb20gdGhpcyBjb21wbGV4IG51bWJlci4KKyAgICAgIC8vIDI2LjIuNS8zCisgICAgICBjb21wbGV4PF9UcD4mCisgICAgICBvcGVyYXRvci09KGNvbnN0IF9UcCYgX190KQorICAgICAgeworCV9NX3JlYWwgLT0gX190OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8vIE11bHRpcGx5IHRoaXMgY29tcGxleCBudW1iZXIgYnkgQGEgdC4KKyAgICAgIGNvbXBsZXg8X1RwPiYgb3BlcmF0b3IqPShjb25zdCBfVHAmKTsKKyAgICAgIC8vLyBEaXZpZGUgdGhpcyBjb21wbGV4IG51bWJlciBieSBAYSB0LgorICAgICAgY29tcGxleDxfVHA+JiBvcGVyYXRvci89KGNvbnN0IF9UcCYpOworCisgICAgICAvLyBMZXRzIHRoZSBjb21waWxlciBzeW50aGVzaXplIHRoZQorICAgICAgLy8gY29weSBhbmQgYXNzaWdubWVudCBvcGVyYXRvcgorICAgICAgLy8gY29tcGxleDxfVHA+JiBvcGVyYXRvcj0gKGNvbnN0IGNvbXBsZXg8X1RwPiYpOworICAgICAgLy8vIEFzc2lnbiB0aGlzIGNvbXBsZXggbnVtYmVyIHRvIGNvbXBsZXggQGEgei4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgY29tcGxleDxfVHA+JiBvcGVyYXRvcj0oY29uc3QgY29tcGxleDxfVXA+Jik7CisgICAgICAvLy8gQWRkIEBhIHogdG8gdGhpcyBjb21wbGV4IG51bWJlci4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgY29tcGxleDxfVHA+JiBvcGVyYXRvcis9KGNvbnN0IGNvbXBsZXg8X1VwPiYpOworICAgICAgLy8vIFN1YnRyYWN0IEBhIHogZnJvbSB0aGlzIGNvbXBsZXggbnVtYmVyLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICBjb21wbGV4PF9UcD4mIG9wZXJhdG9yLT0oY29uc3QgY29tcGxleDxfVXA+Jik7CisgICAgICAvLy8gTXVsdGlwbHkgdGhpcyBjb21wbGV4IG51bWJlciBieSBAYSB6LgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICBjb21wbGV4PF9UcD4mIG9wZXJhdG9yKj0oY29uc3QgY29tcGxleDxfVXA+Jik7CisgICAgICAvLy8gRGl2aWRlIHRoaXMgY29tcGxleCBudW1iZXIgYnkgQGEgei4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgY29tcGxleDxfVHA+JiBvcGVyYXRvci89KGNvbnN0IGNvbXBsZXg8X1VwPiYpOworCisgICAgICBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGNvbXBsZXggX19yZXAoKSBjb25zdAorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfVHAgX01fcmVhbDsKKyAgICAgIF9UcCBfTV9pbWFnOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbXBsZXg8X1RwPiYKKyAgICBjb21wbGV4PF9UcD46Om9wZXJhdG9yPShjb25zdCBfVHAmIF9fdCkKKyAgICB7CisgICAgIF9NX3JlYWwgPSBfX3Q7CisgICAgIF9NX2ltYWcgPSBfVHAoKTsKKyAgICAgcmV0dXJuICp0aGlzOworICAgIH0gCisKKyAgLy8gMjYuMi41LzUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbXBsZXg8X1RwPiYKKyAgICBjb21wbGV4PF9UcD46Om9wZXJhdG9yKj0oY29uc3QgX1RwJiBfX3QpCisgICAgeworICAgICAgX01fcmVhbCAqPSBfX3Q7CisgICAgICBfTV9pbWFnICo9IF9fdDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgLy8gMjYuMi41LzcKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbXBsZXg8X1RwPiYKKyAgICBjb21wbGV4PF9UcD46Om9wZXJhdG9yLz0oY29uc3QgX1RwJiBfX3QpCisgICAgeworICAgICAgX01fcmVhbCAvPSBfX3Q7CisgICAgICBfTV9pbWFnIC89IF9fdDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICBjb21wbGV4PF9UcD4mCisgICAgY29tcGxleDxfVHA+OjpvcGVyYXRvcj0oY29uc3QgY29tcGxleDxfVXA+JiBfX3opCisgICAgeworICAgICAgX01fcmVhbCA9IF9fei5yZWFsKCk7CisgICAgICBfTV9pbWFnID0gX196LmltYWcoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgLy8gMjYuMi41LzkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICBjb21wbGV4PF9UcD4mCisgICAgY29tcGxleDxfVHA+OjpvcGVyYXRvcis9KGNvbnN0IGNvbXBsZXg8X1VwPiYgX196KQorICAgIHsKKyAgICAgIF9NX3JlYWwgKz0gX196LnJlYWwoKTsKKyAgICAgIF9NX2ltYWcgKz0gX196LmltYWcoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgLy8gMjYuMi41LzExCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgY29tcGxleDxfVHA+JgorICAgIGNvbXBsZXg8X1RwPjo6b3BlcmF0b3ItPShjb25zdCBjb21wbGV4PF9VcD4mIF9feikKKyAgICB7CisgICAgICBfTV9yZWFsIC09IF9fei5yZWFsKCk7CisgICAgICBfTV9pbWFnIC09IF9fei5pbWFnKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIC8vIDI2LjIuNS8xMworICAvLyBYWFg6IFRoaXMgaXMgYSBncmFtbWFyIHNjaG9vbCBpbXBsZW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICBjb21wbGV4PF9UcD4mCisgICAgY29tcGxleDxfVHA+OjpvcGVyYXRvcio9KGNvbnN0IGNvbXBsZXg8X1VwPiYgX196KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX3IgPSBfTV9yZWFsICogX196LnJlYWwoKSAtIF9NX2ltYWcgKiBfX3ouaW1hZygpOworICAgICAgX01faW1hZyA9IF9NX3JlYWwgKiBfX3ouaW1hZygpICsgX01faW1hZyAqIF9fei5yZWFsKCk7CisgICAgICBfTV9yZWFsID0gX19yOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAvLyAyNi4yLjUvMTUKKyAgLy8gWFhYOiBUaGlzIGlzIGEgZ3JhbW1hciBzY2hvb2wgaW1wbGVtZW50YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgY29tcGxleDxfVHA+JgorICAgIGNvbXBsZXg8X1RwPjo6b3BlcmF0b3IvPShjb25zdCBjb21wbGV4PF9VcD4mIF9feikKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19yID0gIF9NX3JlYWwgKiBfX3oucmVhbCgpICsgX01faW1hZyAqIF9fei5pbWFnKCk7CisgICAgICBjb25zdCBfVHAgX19uID0gc3RkOjpub3JtKF9feik7CisgICAgICBfTV9pbWFnID0gKF9NX2ltYWcgKiBfX3oucmVhbCgpIC0gX01fcmVhbCAqIF9fei5pbWFnKCkpIC8gX19uOworICAgICAgX01fcmVhbCA9IF9fciAvIF9fbjsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgCisgIC8vIE9wZXJhdG9yczoKKyAgLy9AeworICAvLy8gIFJldHVybiBuZXcgY29tcGxleCB2YWx1ZSBAYSB4IHBsdXMgQGEgeS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBvcGVyYXRvcisoY29uc3QgY29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX195KQorICAgIHsKKyAgICAgIGNvbXBsZXg8X1RwPiBfX3IgPSBfX3g7CisgICAgICBfX3IgKz0gX195OworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBvcGVyYXRvcisoY29uc3QgY29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX195KQorICAgIHsKKyAgICAgIGNvbXBsZXg8X1RwPiBfX3IgPSBfX3g7CisgICAgICBfX3IgKz0gX195OworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBvcGVyYXRvcisoY29uc3QgX1RwJiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX195KQorICAgIHsKKyAgICAgIGNvbXBsZXg8X1RwPiBfX3IgPSBfX3k7CisgICAgICBfX3IgKz0gX194OworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisgIC8vQH0KKworICAvL0B7CisgIC8vLyAgUmV0dXJuIG5ldyBjb21wbGV4IHZhbHVlIEBhIHggbWludXMgQGEgeS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBvcGVyYXRvci0oY29uc3QgY29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX195KQorICAgIHsKKyAgICAgIGNvbXBsZXg8X1RwPiBfX3IgPSBfX3g7CisgICAgICBfX3IgLT0gX195OworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisgICAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgb3BlcmF0b3ItKGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBfVHAmIF9feSkKKyAgICB7CisgICAgICBjb21wbGV4PF9UcD4gX19yID0gX194OworICAgICAgX19yIC09IF9feTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgb3BlcmF0b3ItKGNvbnN0IF9UcCYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKKyAgICB7CisgICAgICBjb21wbGV4PF9UcD4gX19yKF9feCwgLV9feS5pbWFnKCkpOworICAgICAgX19yIC09IF9feS5yZWFsKCk7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKyAgLy9AfQorCisgIC8vQHsKKyAgLy8vICBSZXR1cm4gbmV3IGNvbXBsZXggdmFsdWUgQGEgeCB0aW1lcyBAYSB5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIG9wZXJhdG9yKihjb25zdCBjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3kpCisgICAgeworICAgICAgY29tcGxleDxfVHA+IF9fciA9IF9feDsKKyAgICAgIF9fciAqPSBfX3k7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIG9wZXJhdG9yKihjb25zdCBjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX3kpCisgICAgeworICAgICAgY29tcGxleDxfVHA+IF9fciA9IF9feDsKKyAgICAgIF9fciAqPSBfX3k7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIG9wZXJhdG9yKihjb25zdCBfVHAmIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3kpCisgICAgeworICAgICAgY29tcGxleDxfVHA+IF9fciA9IF9feTsKKyAgICAgIF9fciAqPSBfX3g7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKyAgLy9AfQorCisgIC8vQHsKKyAgLy8vICBSZXR1cm4gbmV3IGNvbXBsZXggdmFsdWUgQGEgeCBkaXZpZGVkIGJ5IEBhIHkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgb3BlcmF0b3IvKGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKKyAgICB7CisgICAgICBjb21wbGV4PF9UcD4gX19yID0gX194OworICAgICAgX19yIC89IF9feTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorICAgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIG9wZXJhdG9yLyhjb25zdCBjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX3kpCisgICAgeworICAgICAgY29tcGxleDxfVHA+IF9fciA9IF9feDsKKyAgICAgIF9fciAvPSBfX3k7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIG9wZXJhdG9yLyhjb25zdCBfVHAmIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3kpCisgICAgeworICAgICAgY29tcGxleDxfVHA+IF9fciA9IF9feDsKKyAgICAgIF9fciAvPSBfX3k7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKyAgLy9AfQorCisgIC8vLyAgUmV0dXJuIEBhIHguCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgb3BlcmF0b3IrKGNvbnN0IGNvbXBsZXg8X1RwPiYgX194KQorICAgIHsgcmV0dXJuIF9feDsgfQorCisgIC8vLyAgUmV0dXJuIGNvbXBsZXggbmVnYXRpb24gb2YgQGEgeC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBvcGVyYXRvci0oY29uc3QgY29tcGxleDxfVHA+JiBfX3gpCisgICAgeyAgcmV0dXJuIGNvbXBsZXg8X1RwPigtX194LnJlYWwoKSwgLV9feC5pbWFnKCkpOyB9CisKKyAgLy9AeworICAvLy8gIFJldHVybiB0cnVlIGlmIEBhIHggaXMgZXF1YWwgdG8gQGEgeS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgY29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5yZWFsKCkgPT0gX195LnJlYWwoKSAmJiBfX3guaW1hZygpID09IF9feS5pbWFnKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX3kpCisgICAgeyByZXR1cm4gX194LnJlYWwoKSA9PSBfX3kgJiYgX194LmltYWcoKSA9PSBfVHAoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9UcCYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKKyAgICB7IHJldHVybiBfX3ggPT0gX195LnJlYWwoKSAmJiBfVHAoKSA9PSBfX3kuaW1hZygpOyB9CisgIC8vQH0KKworICAvL0B7CisgIC8vLyAgUmV0dXJuIGZhbHNlIGlmIEBhIHggaXMgZXF1YWwgdG8gQGEgeS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgY29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5yZWFsKCkgIT0gX195LnJlYWwoKSB8fCBfX3guaW1hZygpICE9IF9feS5pbWFnKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX3kpCisgICAgeyByZXR1cm4gX194LnJlYWwoKSAhPSBfX3kgfHwgX194LmltYWcoKSAhPSBfVHAoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9UcCYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKKyAgICB7IHJldHVybiBfX3ggIT0gX195LnJlYWwoKSB8fCBfVHAoKSAhPSBfX3kuaW1hZygpOyB9CisgIC8vQH0KKworICAvLy8gIEV4dHJhY3Rpb24gb3BlcmF0b3IgZm9yIGNvbXBsZXggdmFsdWVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIGNvbXBsZXg8X1RwPiYgX194KQorICAgIHsKKyAgICAgIF9UcCBfX3JlX3gsIF9faW1feDsKKyAgICAgIF9DaGFyVCBfX2NoOworICAgICAgX19pcyA+PiBfX2NoOworICAgICAgaWYgKF9fY2ggPT0gJygnKSAKKwl7CisJICBfX2lzID4+IF9fcmVfeCA+PiBfX2NoOworCSAgaWYgKF9fY2ggPT0gJywnKSAKKwkgICAgeworCSAgICAgIF9faXMgPj4gX19pbV94ID4+IF9fY2g7CisJICAgICAgaWYgKF9fY2ggPT0gJyknKSAKKwkJX194ID0gY29tcGxleDxfVHA+KF9fcmVfeCwgX19pbV94KTsKKwkgICAgICBlbHNlCisJCV9faXMuc2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworCSAgICB9CisJICBlbHNlIGlmIChfX2NoID09ICcpJykgCisJICAgIF9feCA9IF9fcmVfeDsKKwkgIGVsc2UKKwkgICAgX19pcy5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisJfQorICAgICAgZWxzZSAKKwl7CisJICBfX2lzLnB1dGJhY2soX19jaCk7CisJICBfX2lzID4+IF9fcmVfeDsKKwkgIF9feCA9IF9fcmVfeDsKKwl9CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKyAgLy8vICBJbnNlcnRpb24gb3BlcmF0b3IgZm9yIGNvbXBsZXggdmFsdWVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX194KQorICAgIHsKKyAgICAgIGJhc2ljX29zdHJpbmdzdHJlYW08X0NoYXJULCBfVHJhaXRzPiBfX3M7CisgICAgICBfX3MuZmxhZ3MoX19vcy5mbGFncygpKTsKKyAgICAgIF9fcy5pbWJ1ZShfX29zLmdldGxvYygpKTsKKyAgICAgIF9fcy5wcmVjaXNpb24oX19vcy5wcmVjaXNpb24oKSk7CisgICAgICBfX3MgPDwgJygnIDw8IF9feC5yZWFsKCkgPDwgJywnIDw8IF9feC5pbWFnKCkgPDwgJyknOworICAgICAgcmV0dXJuIF9fb3MgPDwgX19zLnN0cigpOworICAgIH0KKworICAvLyBWYWx1ZXMKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdGV4cHIgX1RwCisgICAgcmVhbChjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX3oucmVhbCgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0ZXhwciBfVHAKKyAgICBpbWFnKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fei5pbWFnKCk7IH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwJgorICAgIHJlYWwoY29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX196LnJlYWwoKTsgfQorICAgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbnN0IF9UcCYKKyAgICByZWFsKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fei5yZWFsKCk7IH0KKyAgICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAmCisgICAgaW1hZyhjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX3ouaW1hZygpOyB9CisgICAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29uc3QgX1RwJgorICAgIGltYWcoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX196LmltYWcoKTsgfQorI2VuZGlmCisKKyAgLy8gMjYuMi43LzMgYWJzKF9feik6ICBSZXR1cm5zIHRoZSBtYWduaXR1ZGUgb2YgX196LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIF9fY29tcGxleF9hYnMoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgX1RwIF9feCA9IF9fei5yZWFsKCk7CisgICAgICBfVHAgX195ID0gX196LmltYWcoKTsKKyAgICAgIGNvbnN0IF9UcCBfX3MgPSBzdGQ6Om1heChhYnMoX194KSwgYWJzKF9feSkpOworICAgICAgaWYgKF9fcyA9PSBfVHAoKSkgIC8vIHdlbGwgLi4uCisgICAgICAgIHJldHVybiBfX3M7CisgICAgICBfX3ggLz0gX19zOyAKKyAgICAgIF9feSAvPSBfX3M7CisgICAgICByZXR1cm4gX19zICogc3FydChfX3ggKiBfX3ggKyBfX3kgKiBfX3kpOworICAgIH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWAorICBpbmxpbmUgZmxvYXQKKyAgX19jb21wbGV4X2FicyhfX2NvbXBsZXhfXyBmbG9hdCBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jYWJzZihfX3opOyB9CisKKyAgaW5saW5lIGRvdWJsZQorICBfX2NvbXBsZXhfYWJzKF9fY29tcGxleF9fIGRvdWJsZSBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jYWJzKF9feik7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2Ficyhjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2Fic2woX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgYWJzKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfYWJzKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBhYnMoY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF9hYnMoX196KTsgfQorI2VuZGlmICAKKworCisgIC8vIDI2LjIuNy80OiBhcmcoX196KTogUmV0dXJucyB0aGUgcGhhc2UgYW5nbGUgb2YgX196LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIF9fY29tcGxleF9hcmcoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gIGF0YW4yKF9fei5pbWFnKCksIF9fei5yZWFsKCkpOyB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVgKKyAgaW5saW5lIGZsb2F0CisgIF9fY29tcGxleF9hcmcoX19jb21wbGV4X18gZmxvYXQgX196KSB7IHJldHVybiBfX2J1aWx0aW5fY2FyZ2YoX196KTsgfQorCisgIGlubGluZSBkb3VibGUKKyAgX19jb21wbGV4X2FyZyhfX2NvbXBsZXhfXyBkb3VibGUgX196KSB7IHJldHVybiBfX2J1aWx0aW5fY2FyZyhfX3opOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9hcmcoY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhcmdsKF9feik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIGFyZyhjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X2FyZyhfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgYXJnKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfYXJnKF9feik7IH0KKyNlbmRpZgorCisgIC8vIDI2LjIuNy81OiBub3JtKF9feikgcmV0dXJucyB0aGUgc3F1YXJlZCBtYWduaXR1ZGUgb2YgX196LgorICAvLyAgICAgQXMgZGVmaW5lZCwgbm9ybSgpIGlzIC1ub3QtIGEgbm9ybSBpcyB0aGUgY29tbW9uIG1hdGhlbWF0aWNhbAorICAvLyAgICAgc2VucyB1c2VkIGluIG51bWVyaWNzLiAgVGhlIGhlbHBlciBjbGFzcyBfTm9ybV9oZWxwZXI8PiB0cmllcyB0bworICAvLyAgICAgZGlzdGluZ3Vpc2ggYmV0d2VlbiBidWlsdGluIGZsb2F0aW5nIHBvaW50IGFuZCB0aGUgcmVzdCwgc28gYXMKKyAgLy8gICAgIHRvIGRlbGl2ZXIgYW4gYW5zd2VyIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHRoZSByZWFsIHZhbHVlLgorICB0ZW1wbGF0ZTxib29sPgorICAgIHN0cnVjdCBfTm9ybV9oZWxwZXIKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0YXRpYyBpbmxpbmUgX1RwIF9TX2RvX2l0KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9feCA9IF9fei5yZWFsKCk7CisgICAgICAgICAgY29uc3QgX1RwIF9feSA9IF9fei5pbWFnKCk7CisgICAgICAgICAgcmV0dXJuIF9feCAqIF9feCArIF9feSAqIF9feTsKKyAgICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfTm9ybV9oZWxwZXI8dHJ1ZT4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0YXRpYyBpbmxpbmUgX1RwIF9TX2RvX2l0KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fcmVzID0gc3RkOjphYnMoX196KTsKKyAgICAgICAgICByZXR1cm4gX19yZXMgKiBfX3JlczsKKyAgICAgICAgfQorICAgIH07CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIG5vcm0oY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgcmV0dXJuIF9Ob3JtX2hlbHBlcjxfX2lzX2Zsb2F0aW5nPF9UcD46Ol9fdmFsdWUgCisJJiYgIV9HTElCQ1hYX0ZBU1RfTUFUSD46Ol9TX2RvX2l0KF9feik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgcG9sYXIoY29uc3QgX1RwJiBfX3JobywgY29uc3QgX1RwJiBfX3RoZXRhKQorICAgIHsgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3JobyAqIGNvcyhfX3RoZXRhKSwgX19yaG8gKiBzaW4oX190aGV0YSkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBjb25qKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3oucmVhbCgpLCAtX196LmltYWcoKSk7IH0KKyAgCisgIC8vIFRyYW5zY2VuZGVudGFscworCisgIC8vIDI2LjIuOC8xIGNvcyhfX3opOiAgUmV0dXJucyB0aGUgY29zaW5lIG9mIF9fei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBfX2NvbXBsZXhfY29zKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX3ggPSBfX3oucmVhbCgpOworICAgICAgY29uc3QgX1RwIF9feSA9IF9fei5pbWFnKCk7CisgICAgICByZXR1cm4gY29tcGxleDxfVHA+KGNvcyhfX3gpICogY29zaChfX3kpLCAtc2luKF9feCkgKiBzaW5oKF9feSkpOworICAgIH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWAorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X2NvcyhfX2NvbXBsZXhfXyBmbG9hdCBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jY29zZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfY29zKF9fY29tcGxleF9fIGRvdWJsZSBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jY29zKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2Nvcyhjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2Nvc2woX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgY29zKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfY29zKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBjb3MoY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF9jb3MoX196KTsgfQorI2VuZGlmCisKKyAgLy8gMjYuMi44LzIgY29zaChfX3opOiBSZXR1cm5zIHRoZSBoeXBlcmJvbGljIGNvc2luZSBvZiBfX3ouCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X2Nvc2goY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgY29uc3QgX1RwIF9feCA9IF9fei5yZWFsKCk7CisgICAgICBjb25zdCBfVHAgX195ID0gX196LmltYWcoKTsKKyAgICAgIHJldHVybiBjb21wbGV4PF9UcD4oY29zaChfX3gpICogY29zKF9feSksIHNpbmgoX194KSAqIHNpbihfX3kpKTsKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVgKKyAgaW5saW5lIF9fY29tcGxleF9fIGZsb2F0CisgIF9fY29tcGxleF9jb3NoKF9fY29tcGxleF9fIGZsb2F0IF9feikgeyByZXR1cm4gX19idWlsdGluX2Njb3NoZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfY29zaChfX2NvbXBsZXhfXyBkb3VibGUgX196KSB7IHJldHVybiBfX2J1aWx0aW5fY2Nvc2goX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZQorICBfX2NvbXBsZXhfY29zaChjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2Nvc2hsKF9feik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIGNvc2goY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF9jb3NoKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBjb3NoKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfY29zaChfX3opOyB9CisjZW5kaWYKKworICAvLyAyNi4yLjgvMyBleHAoX196KTogUmV0dXJucyB0aGUgY29tcGxleCBiYXNlIGUgZXhwb25lbnRpYWwgb2YgeAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9leHAoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gc3RkOjpwb2xhcihleHAoX196LnJlYWwoKSksIF9fei5pbWFnKCkpOyB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVgKKyAgaW5saW5lIF9fY29tcGxleF9fIGZsb2F0CisgIF9fY29tcGxleF9leHAoX19jb21wbGV4X18gZmxvYXQgX196KSB7IHJldHVybiBfX2J1aWx0aW5fY2V4cGYoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X2V4cChfX2NvbXBsZXhfXyBkb3VibGUgX196KSB7IHJldHVybiBfX2J1aWx0aW5fY2V4cChfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9leHAoY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NleHBsKF9feik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIGV4cChjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X2V4cChfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgZXhwKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfZXhwKF9feik7IH0KKyNlbmRpZgorCisgIC8vIDI2LjIuOC81IGxvZyhfX3opOiBSZXR1cm5zIHRoZSBuYXR1cmFsIGNvbXBsZXggbG9nYXJpdGhtIG9mIF9fei4KKyAgLy8gICAgICAgICAgICAgICAgICAgIFRoZSBicmFuY2ggY3V0IGlzIGFsb25nIHRoZSBuZWdhdGl2ZSBheGlzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9sb2coY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gY29tcGxleDxfVHA+KGxvZyhzdGQ6OmFicyhfX3opKSwgc3RkOjphcmcoX196KSk7IH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWAorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X2xvZyhfX2NvbXBsZXhfXyBmbG9hdCBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jbG9nZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfbG9nKF9fY29tcGxleF9fIGRvdWJsZSBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jbG9nKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2xvZyhjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2xvZ2woX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgbG9nKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfbG9nKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBsb2coY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF9sb2coX196KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBsb2cxMChjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBzdGQ6OmxvZyhfX3opIC8gbG9nKF9UcCgxMC4wKSk7IH0KKworICAvLyAyNi4yLjgvMTAgc2luKF9feik6IFJldHVybnMgdGhlIHNpbmUgb2YgX196LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9zaW4oY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgY29uc3QgX1RwIF9feCA9IF9fei5yZWFsKCk7CisgICAgICBjb25zdCBfVHAgX195ID0gX196LmltYWcoKTsKKyAgICAgIHJldHVybiBjb21wbGV4PF9UcD4oc2luKF9feCkgKiBjb3NoKF9feSksIGNvcyhfX3gpICogc2luaChfX3kpKTsgCisgICAgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfc2luKF9fY29tcGxleF9fIGZsb2F0IF9feikgeyByZXR1cm4gX19idWlsdGluX2NzaW5mKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9zaW4oX19jb21wbGV4X18gZG91YmxlIF9feikgeyByZXR1cm4gX19idWlsdGluX2NzaW4oX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZQorICBfX2NvbXBsZXhfc2luKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jc2lubChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBzaW4oY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF9zaW4oX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIHNpbihjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X3NpbihfX3opOyB9CisjZW5kaWYKKworICAvLyAyNi4yLjgvMTEgc2luaChfX3opOiBSZXR1cm5zIHRoZSBoeXBlcmJvbGljIHNpbmUgb2YgX196LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9zaW5oKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX3ggPSBfX3oucmVhbCgpOworICAgICAgY29uc3QgX1RwICBfX3kgPSBfX3ouaW1hZygpOworICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihzaW5oKF9feCkgKiBjb3MoX195KSwgY29zaChfX3gpICogc2luKF9feSkpOworICAgIH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWAorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X3NpbmgoX19jb21wbGV4X18gZmxvYXQgX196KSB7IHJldHVybiBfX2J1aWx0aW5fY3NpbmhmKF9feik7IH0gICAgICAKKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9zaW5oKF9fY29tcGxleF9fIGRvdWJsZSBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jc2luaChfX3opOyB9ICAgICAgCisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9zaW5oKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jc2luaGwoX196KTsgfSAgICAgIAorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgc2luaChjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X3NpbmgoX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIHNpbmgoY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF9zaW5oKF9feik7IH0KKyNlbmRpZgorCisgIC8vIDI2LjIuOC8xMyBzcXJ0KF9feik6IFJldHVybnMgdGhlIGNvbXBsZXggc3F1YXJlIHJvb3Qgb2YgX196LgorICAvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBicmFuY2ggY3V0IGlzIG9uIHRoZSBuZWdhdGl2ZSBheGlzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X3NxcnQoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgX1RwIF9feCA9IF9fei5yZWFsKCk7CisgICAgICBfVHAgX195ID0gX196LmltYWcoKTsKKworICAgICAgaWYgKF9feCA9PSBfVHAoKSkKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX3QgPSBzcXJ0KGFicyhfX3kpIC8gMik7CisgICAgICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihfX3QsIF9feSA8IF9UcCgpID8gLV9fdCA6IF9fdCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX3QgPSBzcXJ0KDIgKiAoc3RkOjphYnMoX196KSArIGFicyhfX3gpKSk7CisgICAgICAgICAgX1RwIF9fdSA9IF9fdCAvIDI7CisgICAgICAgICAgcmV0dXJuIF9feCA+IF9UcCgpCisgICAgICAgICAgICA/IGNvbXBsZXg8X1RwPihfX3UsIF9feSAvIF9fdCkKKyAgICAgICAgICAgIDogY29tcGxleDxfVHA+KGFicyhfX3kpIC8gX190LCBfX3kgPCBfVHAoKSA/IC1fX3UgOiBfX3UpOworICAgICAgICB9CisgICAgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfc3FydChfX2NvbXBsZXhfXyBmbG9hdCBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jc3FydGYoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X3NxcnQoX19jb21wbGV4X18gZG91YmxlIF9feikgeyByZXR1cm4gX19idWlsdGluX2NzcXJ0KF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X3NxcnQoY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NzcXJ0bChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBzcXJ0KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfc3FydChfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgc3FydChjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X3NxcnQoX196KTsgfQorI2VuZGlmCisKKyAgLy8gMjYuMi44LzE0IHRhbihfX3opOiAgUmV0dXJuIHRoZSBjb21wbGV4IHRhbmdlbnQgb2YgX196LgorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBfX2NvbXBsZXhfdGFuKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIHN0ZDo6c2luKF9feikgLyBzdGQ6OmNvcyhfX3opOyB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVgKKyAgaW5saW5lIF9fY29tcGxleF9fIGZsb2F0CisgIF9fY29tcGxleF90YW4oX19jb21wbGV4X18gZmxvYXQgX196KSB7IHJldHVybiBfX2J1aWx0aW5fY3RhbmYoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X3RhbihfX2NvbXBsZXhfXyBkb3VibGUgX196KSB7IHJldHVybiBfX2J1aWx0aW5fY3RhbihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF90YW4oY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2N0YW5sKF9feik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIHRhbihjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X3RhbihfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgdGFuKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfdGFuKF9feik7IH0KKyNlbmRpZgorCisKKyAgLy8gMjYuMi44LzE1IHRhbmgoX196KTogIFJldHVybnMgdGhlIGh5cGVyYm9saWMgdGFuZ2VudCBvZiBfX3ouCisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF90YW5oKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIHN0ZDo6c2luaChfX3opIC8gc3RkOjpjb3NoKF9feik7IH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWAorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X3RhbmgoX19jb21wbGV4X18gZmxvYXQgX196KSB7IHJldHVybiBfX2J1aWx0aW5fY3RhbmhmKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF90YW5oKF9fY29tcGxleF9fIGRvdWJsZSBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jdGFuaChfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF90YW5oKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jdGFuaGwoX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgdGFuaChjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X3RhbmgoX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIHRhbmgoY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF90YW5oKF9feik7IH0KKyNlbmRpZgorCisKKyAgLy8gMjYuMi44LzkgIHBvdyhfX3gsIF9feSk6IFJldHVybnMgdGhlIGNvbXBsZXggcG93ZXIgYmFzZSBvZiBfX3gKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlZCB0byB0aGUgX195LXRoIHBvd2VyLiAgVGhlIGJyYW5jaAorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgY3V0IGlzIG9uIHRoZSBuZWdhdGl2ZSBheGlzLgorI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X3Bvd191bnNpZ25lZChjb21wbGV4PF9UcD4gX194LCB1bnNpZ25lZCBfX24pCisgICAgeworICAgICAgY29tcGxleDxfVHA+IF9feSA9IF9fbiAlIDIgPyBfX3ggOiBjb21wbGV4PF9UcD4oMSk7CisKKyAgICAgIHdoaWxlIChfX24gPj49IDEpCisgICAgICAgIHsKKyAgICAgICAgICBfX3ggKj0gX194OworICAgICAgICAgIGlmIChfX24gJSAyKQorICAgICAgICAgICAgX195ICo9IF9feDsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gX195OworICAgIH0KKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIERSIDg0NC4gY29tcGxleCBwb3cgcmV0dXJuIHR5cGUgaXMgYW1iaWd1b3VzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIHBvdyhjb25zdCBjb21wbGV4PF9UcD4mIF9feiwgaW50IF9fbikKKyAgICB7CisgICAgICByZXR1cm4gX19uIDwgMAorCT8gY29tcGxleDxfVHA+KDEpIC8gc3RkOjpfX2NvbXBsZXhfcG93X3Vuc2lnbmVkKF9feiwgLSh1bnNpZ25lZClfX24pCisgICAgICAgIDogc3RkOjpfX2NvbXBsZXhfcG93X3Vuc2lnbmVkKF9feiwgX19uKTsKKyAgICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29tcGxleDxfVHA+CisgICAgcG93KGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBfVHAmIF9feSkKKyAgICB7CisjaWZuZGVmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWAorICAgICAgaWYgKF9feCA9PSBfVHAoKSkKKwlyZXR1cm4gX1RwKCk7CisjZW5kaWYKKyAgICAgIGlmIChfX3guaW1hZygpID09IF9UcCgpICYmIF9feC5yZWFsKCkgPiBfVHAoKSkKKyAgICAgICAgcmV0dXJuIHBvdyhfX3gucmVhbCgpLCBfX3kpOworCisgICAgICBjb21wbGV4PF9UcD4gX190ID0gc3RkOjpsb2coX194KTsKKyAgICAgIHJldHVybiBzdGQ6OnBvbGFyKGV4cChfX3kgKiBfX3QucmVhbCgpKSwgX195ICogX190LmltYWcoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X3Bvdyhjb25zdCBjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3kpCisgICAgeyByZXR1cm4gX194ID09IF9UcCgpID8gX1RwKCkgOiBzdGQ6OmV4cChfX3kgKiBzdGQ6OmxvZyhfX3gpKTsgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfcG93KF9fY29tcGxleF9fIGZsb2F0IF9feCwgX19jb21wbGV4X18gZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fY3Bvd2YoX194LCBfX3kpOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfcG93KF9fY29tcGxleF9fIGRvdWJsZSBfX3gsIF9fY29tcGxleF9fIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jcG93KF9feCwgX195KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZQorICBfX2NvbXBsZXhfcG93KGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3gsCisJCWNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jcG93bChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIHBvdyhjb25zdCBjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3kpCisgICAgeyByZXR1cm4gX19jb21wbGV4X3BvdyhfX3guX19yZXAoKSwgX195Ll9fcmVwKCkpOyB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIHBvdyhjb25zdCBjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3kpCisgICAgeyByZXR1cm4gX19jb21wbGV4X3BvdyhfX3gsIF9feSk7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgcG93KGNvbnN0IF9UcCYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKKyAgICB7CisgICAgICByZXR1cm4gX194ID4gX1RwKCkgPyBzdGQ6OnBvbGFyKHBvdyhfX3gsIF9feS5yZWFsKCkpLAorCQkJCSAgICAgIF9feS5pbWFnKCkgKiBsb2coX194KSkKKwkgICAgICAgICAgICAgICAgIDogc3RkOjpwb3coY29tcGxleDxfVHA+KF9feCksIF9feSk7CisgICAgfQorCisgIC8vLyAyNi4yLjMgIGNvbXBsZXggc3BlY2lhbGl6YXRpb25zCisgIC8vLyBjb21wbGV4PGZsb2F0PiBzcGVjaWFsaXphdGlvbgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGNvbXBsZXg8ZmxvYXQ+CisgICAgeworICAgICAgdHlwZWRlZiBmbG9hdCB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfX2NvbXBsZXhfXyBmbG9hdCBfQ29tcGxleFQ7CisKKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBjb21wbGV4KF9Db21wbGV4VCBfX3opIDogX01fdmFsdWUoX196KSB7IH0KKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGNvbXBsZXgoZmxvYXQgX19yID0gMC4wZiwgZmxvYXQgX19pID0gMC4wZikKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICA6IF9NX3ZhbHVleyBfX3IsIF9faSB9IHsgfQorI2Vsc2UKKyAgICAgIHsKKwlfX3JlYWxfXyBfTV92YWx1ZSA9IF9fcjsKKwlfX2ltYWdfXyBfTV92YWx1ZSA9IF9faTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBleHBsaWNpdCBfR0xJQkNYWF9DT05TVEVYUFIgY29tcGxleChjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKKyAgICAgIGV4cGxpY2l0IF9HTElCQ1hYX0NPTlNURVhQUiBjb21wbGV4KGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7CQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMzg3LiBzdGQ6OmNvbXBsZXggb3Zlci1lbmNhcHN1bGF0ZWQuCisgICAgICBfX2F0dHJpYnV0ZSAoKF9fYWJpX3RhZ19fICgiY3h4MTEiKSkpCisgICAgICBjb25zdGV4cHIgZmxvYXQgCisgICAgICByZWFsKCkgeyByZXR1cm4gX19yZWFsX18gX01fdmFsdWU7IH0KKworICAgICAgX19hdHRyaWJ1dGUgKChfX2FiaV90YWdfXyAoImN4eDExIikpKQorICAgICAgY29uc3RleHByIGZsb2F0IAorICAgICAgaW1hZygpIHsgcmV0dXJuIF9faW1hZ19fIF9NX3ZhbHVlOyB9CisjZWxzZQorICAgICAgZmxvYXQmIAorICAgICAgcmVhbCgpIHsgcmV0dXJuIF9fcmVhbF9fIF9NX3ZhbHVlOyB9CisKKyAgICAgIGNvbnN0IGZsb2F0JiAKKyAgICAgIHJlYWwoKSBjb25zdCB7IHJldHVybiBfX3JlYWxfXyBfTV92YWx1ZTsgfSAgICAgIAorCisgICAgICBmbG9hdCYgCisgICAgICBpbWFnKCkgeyByZXR1cm4gX19pbWFnX18gX01fdmFsdWU7IH0KKworICAgICAgY29uc3QgZmxvYXQmIAorICAgICAgaW1hZygpIGNvbnN0IHsgcmV0dXJuIF9faW1hZ19fIF9NX3ZhbHVlOyB9CisjZW5kaWYKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMzg3LiBzdGQ6OmNvbXBsZXggb3Zlci1lbmNhcHN1bGF0ZWQuCisgICAgICB2b2lkIAorICAgICAgcmVhbChmbG9hdCBfX3ZhbCkgeyBfX3JlYWxfXyBfTV92YWx1ZSA9IF9fdmFsOyB9CisKKyAgICAgIHZvaWQgCisgICAgICBpbWFnKGZsb2F0IF9fdmFsKSB7IF9faW1hZ19fIF9NX3ZhbHVlID0gX192YWw7IH0KKworICAgICAgY29tcGxleCYKKyAgICAgIG9wZXJhdG9yPShmbG9hdCBfX2YpCisgICAgICB7CisJX01fdmFsdWUgPSBfX2Y7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBjb21wbGV4JgorICAgICAgb3BlcmF0b3IrPShmbG9hdCBfX2YpCisgICAgICB7CisJX01fdmFsdWUgKz0gX19mOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgY29tcGxleCYKKyAgICAgIG9wZXJhdG9yLT0oZmxvYXQgX19mKQorICAgICAgeworCV9NX3ZhbHVlIC09IF9fZjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGNvbXBsZXgmCisgICAgICBvcGVyYXRvcio9KGZsb2F0IF9fZikKKyAgICAgIHsKKwlfTV92YWx1ZSAqPSBfX2Y7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBjb21wbGV4JgorICAgICAgb3BlcmF0b3IvPShmbG9hdCBfX2YpCisgICAgICB7CisJX01fdmFsdWUgLz0gX19mOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8gTGV0IHRoZSBjb21waWxlciBzeW50aGVzaXplIHRoZSBjb3B5IGFuZCBhc3NpZ25tZW50CisgICAgICAvLyBvcGVyYXRvci4gIEl0IGFsd2F5cyBkb2VzIGEgcHJldHR5IGdvb2Qgam9iLgorICAgICAgLy8gY29tcGxleCYgb3BlcmF0b3I9KGNvbnN0IGNvbXBsZXgmKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBjb21wbGV4JgorICAgICAgICBvcGVyYXRvcj0oY29uc3QgY29tcGxleDxfVHA+JiAgX196KQorCXsKKwkgIF9fcmVhbF9fIF9NX3ZhbHVlID0gX196LnJlYWwoKTsKKwkgIF9faW1hZ19fIF9NX3ZhbHVlID0gX196LmltYWcoKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgY29tcGxleCYKKyAgICAgICAgb3BlcmF0b3IrPShjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKwl7CisJICBfX3JlYWxfXyBfTV92YWx1ZSArPSBfX3oucmVhbCgpOworCSAgX19pbWFnX18gX01fdmFsdWUgKz0gX196LmltYWcoKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9UcD4KKyAgICAgICAgY29tcGxleCYKKyAgICAgICAgb3BlcmF0b3ItPShjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKwl7CisJICBfX3JlYWxfXyBfTV92YWx1ZSAtPSBfX3oucmVhbCgpOworCSAgX19pbWFnX18gX01fdmFsdWUgLT0gX196LmltYWcoKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9UcD4KKyAgICAgICAgY29tcGxleCYKKyAgICAgICAgb3BlcmF0b3IqPShjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKwl7CisJICBfQ29tcGxleFQgX190OworCSAgX19yZWFsX18gX190ID0gX196LnJlYWwoKTsKKwkgIF9faW1hZ19fIF9fdCA9IF9fei5pbWFnKCk7CisJICBfTV92YWx1ZSAqPSBfX3Q7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgICAgIGNvbXBsZXgmCisgICAgICAgIG9wZXJhdG9yLz0oY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisJeworCSAgX0NvbXBsZXhUIF9fdDsKKwkgIF9fcmVhbF9fIF9fdCA9IF9fei5yZWFsKCk7CisJICBfX2ltYWdfXyBfX3QgPSBfX3ouaW1hZygpOworCSAgX01fdmFsdWUgLz0gX190OworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBfQ29tcGxleFQgX19yZXAoKSBjb25zdCB7IHJldHVybiBfTV92YWx1ZTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9Db21wbGV4VCBfTV92YWx1ZTsKKyAgICB9OworCisgIC8vLyAyNi4yLjMgIGNvbXBsZXggc3BlY2lhbGl6YXRpb25zCisgIC8vLyBjb21wbGV4PGRvdWJsZT4gc3BlY2lhbGl6YXRpb24KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBjb21wbGV4PGRvdWJsZT4KKyAgICB7CisgICAgICB0eXBlZGVmIGRvdWJsZSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfX2NvbXBsZXhfXyBkb3VibGUgX0NvbXBsZXhUOworCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgY29tcGxleChfQ29tcGxleFQgX196KSA6IF9NX3ZhbHVlKF9feikgeyB9CisKKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBjb21wbGV4KGRvdWJsZSBfX3IgPSAwLjAsIGRvdWJsZSBfX2kgPSAwLjApCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgOiBfTV92YWx1ZXsgX19yLCBfX2kgfSB7IH0KKyNlbHNlCisgICAgICB7CisJX19yZWFsX18gX01fdmFsdWUgPSBfX3I7CisJX19pbWFnX18gX01fdmFsdWUgPSBfX2k7CisgICAgICB9CisjZW5kaWYKKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGNvbXBsZXgoY29uc3QgY29tcGxleDxmbG9hdD4mIF9feikKKyAgICAgIDogX01fdmFsdWUoX196Ll9fcmVwKCkpIHsgfQorCisgICAgICBleHBsaWNpdCBfR0xJQkNYWF9DT05TVEVYUFIgY29tcGxleChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOwkKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDM4Ny4gc3RkOjpjb21wbGV4IG92ZXItZW5jYXBzdWxhdGVkLgorICAgICAgX19hdHRyaWJ1dGUgKChfX2FiaV90YWdfXyAoImN4eDExIikpKQorICAgICAgY29uc3RleHByIGRvdWJsZSAKKyAgICAgIHJlYWwoKSB7IHJldHVybiBfX3JlYWxfXyBfTV92YWx1ZTsgfQorCisgICAgICBfX2F0dHJpYnV0ZSAoKF9fYWJpX3RhZ19fICgiY3h4MTEiKSkpCisgICAgICBjb25zdGV4cHIgZG91YmxlIAorICAgICAgaW1hZygpIHsgcmV0dXJuIF9faW1hZ19fIF9NX3ZhbHVlOyB9CisjZWxzZQorICAgICAgZG91YmxlJiAKKyAgICAgIHJlYWwoKSB7IHJldHVybiBfX3JlYWxfXyBfTV92YWx1ZTsgfQorCisgICAgICBjb25zdCBkb3VibGUmIAorICAgICAgcmVhbCgpIGNvbnN0IHsgcmV0dXJuIF9fcmVhbF9fIF9NX3ZhbHVlOyB9CisKKyAgICAgIGRvdWJsZSYgCisgICAgICBpbWFnKCkgeyByZXR1cm4gX19pbWFnX18gX01fdmFsdWU7IH0KKworICAgICAgY29uc3QgZG91YmxlJiAKKyAgICAgIGltYWcoKSBjb25zdCB7IHJldHVybiBfX2ltYWdfXyBfTV92YWx1ZTsgfQorI2VuZGlmCisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDM4Ny4gc3RkOjpjb21wbGV4IG92ZXItZW5jYXBzdWxhdGVkLgorICAgICAgdm9pZCAKKyAgICAgIHJlYWwoZG91YmxlIF9fdmFsKSB7IF9fcmVhbF9fIF9NX3ZhbHVlID0gX192YWw7IH0KKworICAgICAgdm9pZCAKKyAgICAgIGltYWcoZG91YmxlIF9fdmFsKSB7IF9faW1hZ19fIF9NX3ZhbHVlID0gX192YWw7IH0KKworICAgICAgY29tcGxleCYKKyAgICAgIG9wZXJhdG9yPShkb3VibGUgX19kKQorICAgICAgeworCV9NX3ZhbHVlID0gX19kOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgY29tcGxleCYKKyAgICAgIG9wZXJhdG9yKz0oZG91YmxlIF9fZCkKKyAgICAgIHsKKwlfTV92YWx1ZSArPSBfX2Q7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCQorICAgICAgY29tcGxleCYKKyAgICAgIG9wZXJhdG9yLT0oZG91YmxlIF9fZCkKKyAgICAgIHsKKwlfTV92YWx1ZSAtPSBfX2Q7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBjb21wbGV4JgorICAgICAgb3BlcmF0b3IqPShkb3VibGUgX19kKQorICAgICAgeworCV9NX3ZhbHVlICo9IF9fZDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGNvbXBsZXgmCisgICAgICBvcGVyYXRvci89KGRvdWJsZSBfX2QpCisgICAgICB7CisJX01fdmFsdWUgLz0gX19kOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8gVGhlIGNvbXBpbGVyIHdpbGwgc3ludGhlc2l6ZSB0aGlzLCBlZmZpY2llbnRseS4KKyAgICAgIC8vIGNvbXBsZXgmIG9wZXJhdG9yPShjb25zdCBjb21wbGV4Jik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgY29tcGxleCYKKyAgICAgICAgb3BlcmF0b3I9KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorCXsKKwkgIF9fcmVhbF9fIF9NX3ZhbHVlID0gX196LnJlYWwoKTsKKwkgIF9faW1hZ19fIF9NX3ZhbHVlID0gX196LmltYWcoKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgY29tcGxleCYKKyAgICAgICAgb3BlcmF0b3IrPShjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKwl7CisJICBfX3JlYWxfXyBfTV92YWx1ZSArPSBfX3oucmVhbCgpOworCSAgX19pbWFnX18gX01fdmFsdWUgKz0gX196LmltYWcoKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgY29tcGxleCYKKyAgICAgICAgb3BlcmF0b3ItPShjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKwl7CisJICBfX3JlYWxfXyBfTV92YWx1ZSAtPSBfX3oucmVhbCgpOworCSAgX19pbWFnX18gX01fdmFsdWUgLT0gX196LmltYWcoKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgY29tcGxleCYKKyAgICAgICAgb3BlcmF0b3IqPShjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKwl7CisJICBfQ29tcGxleFQgX190OworCSAgX19yZWFsX18gX190ID0gX196LnJlYWwoKTsKKwkgIF9faW1hZ19fIF9fdCA9IF9fei5pbWFnKCk7CisJICBfTV92YWx1ZSAqPSBfX3Q7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIGNvbXBsZXgmCisgICAgICAgIG9wZXJhdG9yLz0oY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisJeworCSAgX0NvbXBsZXhUIF9fdDsKKwkgIF9fcmVhbF9fIF9fdCA9IF9fei5yZWFsKCk7CisJICBfX2ltYWdfXyBfX3QgPSBfX3ouaW1hZygpOworCSAgX01fdmFsdWUgLz0gX190OworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBfQ29tcGxleFQgX19yZXAoKSBjb25zdCB7IHJldHVybiBfTV92YWx1ZTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9Db21wbGV4VCBfTV92YWx1ZTsKKyAgICB9OworCisgIC8vLyAyNi4yLjMgIGNvbXBsZXggc3BlY2lhbGl6YXRpb25zCisgIC8vLyBjb21wbGV4PGxvbmcgZG91YmxlPiBzcGVjaWFsaXphdGlvbgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGNvbXBsZXg8bG9uZyBkb3VibGU+CisgICAgeworICAgICAgdHlwZWRlZiBsb25nIGRvdWJsZSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSBfQ29tcGxleFQ7CisKKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBjb21wbGV4KF9Db21wbGV4VCBfX3opIDogX01fdmFsdWUoX196KSB7IH0KKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGNvbXBsZXgobG9uZyBkb3VibGUgX19yID0gMC4wTCwgCisJCQkJIGxvbmcgZG91YmxlIF9faSA9IDAuMEwpCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgOiBfTV92YWx1ZXsgX19yLCBfX2kgfSB7IH0KKyNlbHNlCisgICAgICB7CisJX19yZWFsX18gX01fdmFsdWUgPSBfX3I7CisJX19pbWFnX18gX01fdmFsdWUgPSBfX2k7CisgICAgICB9CisjZW5kaWYKKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGNvbXBsZXgoY29uc3QgY29tcGxleDxmbG9hdD4mIF9feikKKyAgICAgIDogX01fdmFsdWUoX196Ll9fcmVwKCkpIHsgfQorCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgY29tcGxleChjb25zdCBjb21wbGV4PGRvdWJsZT4mIF9feikKKyAgICAgIDogX01fdmFsdWUoX196Ll9fcmVwKCkpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMzg3LiBzdGQ6OmNvbXBsZXggb3Zlci1lbmNhcHN1bGF0ZWQuCisgICAgICBfX2F0dHJpYnV0ZSAoKF9fYWJpX3RhZ19fICgiY3h4MTEiKSkpCisgICAgICBjb25zdGV4cHIgbG9uZyBkb3VibGUgCisgICAgICByZWFsKCkgeyByZXR1cm4gX19yZWFsX18gX01fdmFsdWU7IH0KKworICAgICAgX19hdHRyaWJ1dGUgKChfX2FiaV90YWdfXyAoImN4eDExIikpKQorICAgICAgY29uc3RleHByIGxvbmcgZG91YmxlIAorICAgICAgaW1hZygpIHsgcmV0dXJuIF9faW1hZ19fIF9NX3ZhbHVlOyB9CisjZWxzZQorICAgICAgbG9uZyBkb3VibGUmIAorICAgICAgcmVhbCgpIHsgcmV0dXJuIF9fcmVhbF9fIF9NX3ZhbHVlOyB9CisKKyAgICAgIGNvbnN0IGxvbmcgZG91YmxlJiAKKyAgICAgIHJlYWwoKSBjb25zdCB7IHJldHVybiBfX3JlYWxfXyBfTV92YWx1ZTsgfQorCisgICAgICBsb25nIGRvdWJsZSYgCisgICAgICBpbWFnKCkgeyByZXR1cm4gX19pbWFnX18gX01fdmFsdWU7IH0KKworICAgICAgY29uc3QgbG9uZyBkb3VibGUmIAorICAgICAgaW1hZygpIGNvbnN0IHsgcmV0dXJuIF9faW1hZ19fIF9NX3ZhbHVlOyB9CisjZW5kaWYKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMzg3LiBzdGQ6OmNvbXBsZXggb3Zlci1lbmNhcHN1bGF0ZWQuCisgICAgICB2b2lkIAorICAgICAgcmVhbChsb25nIGRvdWJsZSBfX3ZhbCkgeyBfX3JlYWxfXyBfTV92YWx1ZSA9IF9fdmFsOyB9CisKKyAgICAgIHZvaWQgCisgICAgICBpbWFnKGxvbmcgZG91YmxlIF9fdmFsKSB7IF9faW1hZ19fIF9NX3ZhbHVlID0gX192YWw7IH0KKworICAgICAgY29tcGxleCYKKyAgICAgIG9wZXJhdG9yPShsb25nIGRvdWJsZSBfX3IpCisgICAgICB7CisJX01fdmFsdWUgPSBfX3I7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBjb21wbGV4JgorICAgICAgb3BlcmF0b3IrPShsb25nIGRvdWJsZSBfX3IpCisgICAgICB7CisJX01fdmFsdWUgKz0gX19yOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgY29tcGxleCYKKyAgICAgIG9wZXJhdG9yLT0obG9uZyBkb3VibGUgX19yKQorICAgICAgeworCV9NX3ZhbHVlIC09IF9fcjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGNvbXBsZXgmCisgICAgICBvcGVyYXRvcio9KGxvbmcgZG91YmxlIF9fcikKKyAgICAgIHsKKwlfTV92YWx1ZSAqPSBfX3I7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBjb21wbGV4JgorICAgICAgb3BlcmF0b3IvPShsb25nIGRvdWJsZSBfX3IpCisgICAgICB7CisJX01fdmFsdWUgLz0gX19yOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8gVGhlIGNvbXBpbGVyIGtub3dzIGhvdyB0byBkbyB0aGlzIGVmZmljaWVudGx5CisgICAgICAvLyBjb21wbGV4JiBvcGVyYXRvcj0oY29uc3QgY29tcGxleCYpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIGNvbXBsZXgmCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKwl7CisJICBfX3JlYWxfXyBfTV92YWx1ZSA9IF9fei5yZWFsKCk7CisJICBfX2ltYWdfXyBfTV92YWx1ZSA9IF9fei5pbWFnKCk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIGNvbXBsZXgmCisJb3BlcmF0b3IrPShjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKwl7CisJICBfX3JlYWxfXyBfTV92YWx1ZSArPSBfX3oucmVhbCgpOworCSAgX19pbWFnX18gX01fdmFsdWUgKz0gX196LmltYWcoKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgY29tcGxleCYKKwlvcGVyYXRvci09KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorCXsKKwkgIF9fcmVhbF9fIF9NX3ZhbHVlIC09IF9fei5yZWFsKCk7CisJICBfX2ltYWdfXyBfTV92YWx1ZSAtPSBfX3ouaW1hZygpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBjb21wbGV4JgorCW9wZXJhdG9yKj0oY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisJeworCSAgX0NvbXBsZXhUIF9fdDsKKwkgIF9fcmVhbF9fIF9fdCA9IF9fei5yZWFsKCk7CisJICBfX2ltYWdfXyBfX3QgPSBfX3ouaW1hZygpOworCSAgX01fdmFsdWUgKj0gX190OworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBjb21wbGV4JgorCW9wZXJhdG9yLz0oY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisJeworCSAgX0NvbXBsZXhUIF9fdDsKKwkgIF9fcmVhbF9fIF9fdCA9IF9fei5yZWFsKCk7CisJICBfX2ltYWdfXyBfX3QgPSBfX3ouaW1hZygpOworCSAgX01fdmFsdWUgLz0gX190OworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBfQ29tcGxleFQgX19yZXAoKSBjb25zdCB7IHJldHVybiBfTV92YWx1ZTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9Db21wbGV4VCBfTV92YWx1ZTsKKyAgICB9OworCisgIC8vIFRoZXNlIGJpdHMgaGF2ZSB0byBiZSBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZSwgc28gdGhhdCB0aGUKKyAgLy8gc3BlY2lhbGl6YXRpb25zIGhhdmUgYWxsIGJlZW4gZGVmaW5lZC4KKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUgorICBjb21wbGV4PGZsb2F0Pjo6Y29tcGxleChjb25zdCBjb21wbGV4PGRvdWJsZT4mIF9feikKKyAgOiBfTV92YWx1ZShfX3ouX19yZXAoKSkgeyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUgorICBjb21wbGV4PGZsb2F0Pjo6Y29tcGxleChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYgX196KQorICA6IF9NX3ZhbHVlKF9fei5fX3JlcCgpKSB7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSCisgIGNvbXBsZXg8ZG91YmxlPjo6Y29tcGxleChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYgX196KQorICA6IF9NX3ZhbHVlKF9fei5fX3JlcCgpKSB7IH0KKworICAvLyBJbmhpYml0IGltcGxpY2l0IGluc3RhbnRpYXRpb25zIGZvciByZXF1aXJlZCBpbnN0YW50aWF0aW9ucywKKyAgLy8gd2hpY2ggYXJlIGRlZmluZWQgdmlhIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGVsc2V3aGVyZS4KKyAgLy8gTkI6ICBUaGlzIHN5bnRheCBpcyBhIEdOVSBleHRlbnNpb24uCisjaWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFCisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0mLCBjb21wbGV4PGZsb2F0PiYpOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiwgY29uc3QgY29tcGxleDxmbG9hdD4mKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIG9wZXJhdG9yPj4oaXN0cmVhbSYsIGNvbXBsZXg8ZG91YmxlPiYpOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiwgY29uc3QgY29tcGxleDxkb3VibGU+Jik7CisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0mLCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiwgY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgb3BlcmF0b3I+Pih3aXN0cmVhbSYsIGNvbXBsZXg8ZmxvYXQ+Jik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgb3BlcmF0b3I8PCh3b3N0cmVhbSYsIGNvbnN0IGNvbXBsZXg8ZmxvYXQ+Jik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgb3BlcmF0b3I+Pih3aXN0cmVhbSYsIGNvbXBsZXg8ZG91YmxlPiYpOworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIG9wZXJhdG9yPDwod29zdHJlYW0mLCBjb25zdCBjb21wbGV4PGRvdWJsZT4mKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiBvcGVyYXRvcj4+KHdpc3RyZWFtJiwgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiBvcGVyYXRvcjw8KHdvc3RyZWFtJiwgY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKKyNlbmRpZgorI2VuZGlmCisKKyAgLy8gQH0gZ3JvdXAgY29tcGxleF9udW1iZXJzCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFNlZSBleHQvdHlwZV90cmFpdHMuaCBmb3IgdGhlIHByaW1hcnkgdGVtcGxhdGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIHN0cnVjdCBfX3Byb21vdGVfMjxzdGQ6OmNvbXBsZXg8X1RwPiwgX1VwPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHN0ZDo6Y29tcGxleDx0eXBlbmFtZSBfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZT4gX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgc3RydWN0IF9fcHJvbW90ZV8yPF9UcCwgc3RkOjpjb21wbGV4PF9VcD4gPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHN0ZDo6Y29tcGxleDx0eXBlbmFtZSBfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZT4gX190eXBlOworICAgIH07CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBzdHJ1Y3QgX19wcm9tb3RlXzI8c3RkOjpjb21wbGV4PF9UcD4sIHN0ZDo6Y29tcGxleDxfVXA+ID4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgX19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGU+IF9fdHlwZTsKKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBzdGQ6OmNvbXBsZXg8X1RwPiBhY29zKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+Jik7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gc3RkOjpjb21wbGV4PF9UcD4gYXNpbihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHN0ZDo6Y29tcGxleDxfVHA+IGF0YW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHN0ZDo6Y29tcGxleDxfVHA+IGFjb3NoKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+Jik7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gc3RkOjpjb21wbGV4PF9UcD4gYXNpbmgoY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mKTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBzdGQ6OmNvbXBsZXg8X1RwPiBhdGFuaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYpOworICAvLyBEUiA1OTUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gX1RwICAgICAgICAgICAgICAgZmFicyhjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBfX2NvbXBsZXhfYWNvcyhjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsKKyAgICAgIGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+IF9fdCA9IHN0ZDo6YXNpbihfX3opOworICAgICAgY29uc3QgX1RwIF9fcGlfMiA9IDEuNTcwNzk2MzI2Nzk0ODk2NjE5MjMxMzIxNjkxNjM5NzUxNEw7CisgICAgICByZXR1cm4gc3RkOjpjb21wbGV4PF9UcD4oX19waV8yIC0gX190LnJlYWwoKSwgLV9fdC5pbWFnKCkpOworICAgIH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWF9UUjEKKyAgaW5saW5lIF9fY29tcGxleF9fIGZsb2F0CisgIF9fY29tcGxleF9hY29zKF9fY29tcGxleF9fIGZsb2F0IF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhY29zZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfYWNvcyhfX2NvbXBsZXhfXyBkb3VibGUgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2Fjb3MoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZQorICBfX2NvbXBsZXhfYWNvcyhjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2Fjb3NsKF9feik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYWNvcyhjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9hY29zKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgLy8vIGFjb3MoX196KSBbOC4xLjJdLgorICAvLyAgRWZmZWN0czogIEJlaGF2ZXMgdGhlIHNhbWUgYXMgQzk5IGZ1bmN0aW9uIGNhY29zLCBkZWZpbmVkCisgIC8vICAgICAgICAgICAgaW4gc3ViY2xhdXNlIDcuMy41LjEuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBhY29zKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2Fjb3MoX196KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9hc2luKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgc3RkOjpjb21wbGV4PF9UcD4gX190KC1fX3ouaW1hZygpLCBfX3oucmVhbCgpKTsKKyAgICAgIF9fdCA9IHN0ZDo6YXNpbmgoX190KTsKKyAgICAgIHJldHVybiBzdGQ6OmNvbXBsZXg8X1RwPihfX3QuaW1hZygpLCAtX190LnJlYWwoKSk7CisgICAgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYX1RSMQorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X2FzaW4oX19jb21wbGV4X18gZmxvYXQgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2FzaW5mKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9hc2luKF9fY29tcGxleF9fIGRvdWJsZSBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXNpbihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9hc2luKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXNpbmwoX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBhc2luKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2FzaW4oX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICAvLy8gYXNpbihfX3opIFs4LjEuM10uCisgIC8vICBFZmZlY3RzOiAgQmVoYXZlcyB0aGUgc2FtZSBhcyBDOTkgZnVuY3Rpb24gY2FzaW4sIGRlZmluZWQKKyAgLy8gICAgICAgICAgICBpbiBzdWJjbGF1c2UgNy4zLjUuMi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGFzaW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYXNpbihfX3opOyB9CisjZW5kaWYKKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9hdGFuKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgY29uc3QgX1RwIF9fcjIgPSBfX3oucmVhbCgpICogX196LnJlYWwoKTsKKyAgICAgIGNvbnN0IF9UcCBfX3ggPSBfVHAoMS4wKSAtIF9fcjIgLSBfX3ouaW1hZygpICogX196LmltYWcoKTsKKworICAgICAgX1RwIF9fbnVtID0gX196LmltYWcoKSArIF9UcCgxLjApOworICAgICAgX1RwIF9fZGVuID0gX196LmltYWcoKSAtIF9UcCgxLjApOworCisgICAgICBfX251bSA9IF9fcjIgKyBfX251bSAqIF9fbnVtOworICAgICAgX19kZW4gPSBfX3IyICsgX19kZW4gKiBfX2RlbjsKKworICAgICAgcmV0dXJuIHN0ZDo6Y29tcGxleDxfVHA+KF9UcCgwLjUpICogYXRhbjIoX1RwKDIuMCkgKiBfX3oucmVhbCgpLCBfX3gpLAorCQkJICAgICAgIF9UcCgwLjI1KSAqIGxvZyhfX251bSAvIF9fZGVuKSk7CisgICAgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYX1RSMQorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X2F0YW4oX19jb21wbGV4X18gZmxvYXQgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2F0YW5mKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9hdGFuKF9fY29tcGxleF9fIGRvdWJsZSBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXRhbihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9hdGFuKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXRhbmwoX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBhdGFuKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2F0YW4oX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICAvLy8gYXRhbihfX3opIFs4LjEuNF0uCisgIC8vICBFZmZlY3RzOiAgQmVoYXZlcyB0aGUgc2FtZSBhcyBDOTkgZnVuY3Rpb24gY2F0YW4sIGRlZmluZWQKKyAgLy8gICAgICAgICAgICBpbiBzdWJjbGF1c2UgNy4zLjUuMy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGF0YW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYXRhbihfX3opOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBfX2NvbXBsZXhfYWNvc2goY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICAvLyBLYWhhbidzIGZvcm11bGEuCisgICAgICByZXR1cm4gX1RwKDIuMCkgKiBzdGQ6OmxvZyhzdGQ6OnNxcnQoX1RwKDAuNSkgKiAoX196ICsgX1RwKDEuMCkpKQorCQkJCSArIHN0ZDo6c3FydChfVHAoMC41KSAqIChfX3ogLSBfVHAoMS4wKSkpKTsKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfYWNvc2goX19jb21wbGV4X18gZmxvYXQgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2Fjb3NoZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfYWNvc2goX19jb21wbGV4X18gZG91YmxlIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhY29zaChfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9hY29zaChjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2Fjb3NobChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGFjb3NoKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2Fjb3NoKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgLy8vIGFjb3NoKF9feikgWzguMS41XS4KKyAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYWNvc2gsIGRlZmluZWQKKyAgLy8gICAgICAgICAgICBpbiBzdWJjbGF1c2UgNy4zLjYuMS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGFjb3NoKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2Fjb3NoKF9feik7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9hc2luaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsKKyAgICAgIHN0ZDo6Y29tcGxleDxfVHA+IF9fdCgoX196LnJlYWwoKSAtIF9fei5pbWFnKCkpCisJCQkgICAgKiAoX196LnJlYWwoKSArIF9fei5pbWFnKCkpICsgX1RwKDEuMCksCisJCQkgICAgX1RwKDIuMCkgKiBfX3oucmVhbCgpICogX196LmltYWcoKSk7CisgICAgICBfX3QgPSBzdGQ6OnNxcnQoX190KTsKKworICAgICAgcmV0dXJuIHN0ZDo6bG9nKF9fdCArIF9feik7CisgICAgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYX1RSMQorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X2FzaW5oKF9fY29tcGxleF9fIGZsb2F0IF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2Nhc2luaGYoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X2FzaW5oKF9fY29tcGxleF9fIGRvdWJsZSBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXNpbmgoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZQorICBfX2NvbXBsZXhfYXNpbmgoY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2Nhc2luaGwoX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBhc2luaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9hc2luaChfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIC8vLyBhc2luaChfX3opIFs4LjEuNl0uCisgIC8vICBFZmZlY3RzOiAgQmVoYXZlcyB0aGUgc2FtZSBhcyBDOTkgZnVuY3Rpb24gY2FzaW4sIGRlZmluZWQKKyAgLy8gICAgICAgICAgICBpbiBzdWJjbGF1c2UgNy4zLjYuMi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGFzaW5oKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2FzaW5oKF9feik7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9hdGFuaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX2kyID0gX196LmltYWcoKSAqIF9fei5pbWFnKCk7CisgICAgICBjb25zdCBfVHAgX194ID0gX1RwKDEuMCkgLSBfX2kyIC0gX196LnJlYWwoKSAqIF9fei5yZWFsKCk7CisKKyAgICAgIF9UcCBfX251bSA9IF9UcCgxLjApICsgX196LnJlYWwoKTsKKyAgICAgIF9UcCBfX2RlbiA9IF9UcCgxLjApIC0gX196LnJlYWwoKTsKKworICAgICAgX19udW0gPSBfX2kyICsgX19udW0gKiBfX251bTsKKyAgICAgIF9fZGVuID0gX19pMiArIF9fZGVuICogX19kZW47CisKKyAgICAgIHJldHVybiBzdGQ6OmNvbXBsZXg8X1RwPihfVHAoMC4yNSkgKiAobG9nKF9fbnVtKSAtIGxvZyhfX2RlbikpLAorCQkJICAgICAgIF9UcCgwLjUpICogYXRhbjIoX1RwKDIuMCkgKiBfX3ouaW1hZygpLCBfX3gpKTsKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfYXRhbmgoX19jb21wbGV4X18gZmxvYXQgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2F0YW5oZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfYXRhbmgoX19jb21wbGV4X18gZG91YmxlIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhdGFuaChfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9hdGFuaChjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2F0YW5obChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGF0YW5oKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2F0YW5oKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgLy8vIGF0YW5oKF9feikgWzguMS43XS4KKyAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYXRhbmgsIGRlZmluZWQKKyAgLy8gICAgICAgICAgICBpbiBzdWJjbGF1c2UgNy4zLjYuMy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGF0YW5oKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2F0YW5oKF9feik7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgLy8vIGZhYnMoX196KSBbOC4xLjhdLgorICAgIC8vICBFZmZlY3RzOiAgQmVoYXZlcyB0aGUgc2FtZSBhcyBDOTkgZnVuY3Rpb24gY2FicywgZGVmaW5lZAorICAgIC8vICAgICAgICAgICAgaW4gc3ViY2xhdXNlIDcuMy44LjEuCisgICAgZmFicyhjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIHN0ZDo6YWJzKF9feik7IH0KKworICAvLy8gQWRkaXRpb25hbCBvdmVybG9hZHMgWzguMS45XS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUKKyAgICBhcmcoX1RwIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisjaWYgKF9HTElCQ1hYX1VTRV9DOTlfTUFUSCAmJiAhX0dMSUJDWFhfVVNFX0M5OV9GUF9NQUNST1NfRFlOQU1JQykKKyAgICAgIHJldHVybiBzdGQ6OnNpZ25iaXQoX194KSA/IF9fdHlwZSgzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUwMjlMKQorCSAgICAgICAgICAgICAgICAgICAgICAgOiBfX3R5cGUoKTsKKyNlbHNlCisgICAgICByZXR1cm4gc3RkOjphcmcoc3RkOjpjb21wbGV4PF9fdHlwZT4oX194KSk7CisjZW5kaWYKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUKKyAgICBpbWFnKF9UcCkKKyAgICB7IHJldHVybiBfVHAoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgbm9ybShfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX3R5cGUoX194KSAqIF9fdHlwZShfX3gpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIHJlYWwoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX3g7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGU+CisgICAgcG93KGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IF9VcCYgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gc3RkOjpwb3coc3RkOjpjb21wbGV4PF9fdHlwZT4oX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGU+CisgICAgcG93KGNvbnN0IF9UcCYgX194LCBjb25zdCBzdGQ6OmNvbXBsZXg8X1VwPiYgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gc3RkOjpwb3coX190eXBlKF9feCksIHN0ZDo6Y29tcGxleDxfX3R5cGU+KF9feSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGU+CisgICAgcG93KGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IHN0ZDo6Y29tcGxleDxfVXA+JiBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBzdGQ6OnBvdyhzdGQ6OmNvbXBsZXg8X190eXBlPihfX3gpLAorCQkgICAgICBzdGQ6OmNvbXBsZXg8X190eXBlPihfX3kpKTsKKyAgICB9CisKKyAgLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMuCisgIC8vIERSIDc4MS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBzdGQ6OmNvbXBsZXg8X1RwPiBwcm9qKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+Jik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X3Byb2ooY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19kZW4gPSAoX196LnJlYWwoKSAqIF9fei5yZWFsKCkKKwkJCSArIF9fei5pbWFnKCkgKiBfX3ouaW1hZygpICsgX1RwKDEuMCkpOworCisgICAgICByZXR1cm4gc3RkOjpjb21wbGV4PF9UcD4oKF9UcCgyLjApICogX196LnJlYWwoKSkgLyBfX2RlbiwKKwkJCSAgICAgICAoX1RwKDIuMCkgKiBfX3ouaW1hZygpKSAvIF9fZGVuKTsKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVgKKyAgaW5saW5lIF9fY29tcGxleF9fIGZsb2F0CisgIF9fY29tcGxleF9wcm9qKF9fY29tcGxleF9fIGZsb2F0IF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2Nwcm9qZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfcHJvaihfX2NvbXBsZXhfXyBkb3VibGUgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY3Byb2ooX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZQorICBfX2NvbXBsZXhfcHJvaihjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY3Byb2psKF9feik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgcHJvaihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9wcm9qKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIHByb2ooY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfcHJvaihfX3opOyB9CisjZW5kaWYKKworICAvLyBEUiAxMTM3LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIHByb2ooX1RwIF9feCkKKyAgICB7IHJldHVybiBfX3g7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIGNvbmooX1RwIF9feCkKKyAgICB7IHJldHVybiBfX3g7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgIC8vIEMrKzExCisKKyNlbmRpZiAgLyogX0dMSUJDWFhfQ09NUExFWCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jb21wbGV4LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NvbXBsZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTBlODJkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jb21wbGV4LmgKQEAgLTAsMCArMSw0NiBAQAorLy8gLSotIEMrKyAtKi0gY29tcGF0aWJpbGl0eSBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBjb21wbGV4LmgKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorIyBpbmNsdWRlIDxjY29tcGxleD4KKyNlbmRpZgorCisjaWYgX0dMSUJDWFhfSEFWRV9DT01QTEVYX0gKKyMgaW5jbHVkZV9uZXh0IDxjb21wbGV4Lmg+CisjIGlmZGVmIF9HTElCQ1hYX0NPTVBMRVgKKy8vIFNlZSBQUjU2MTExLCBrZWVwIHRoZSBtYWNybyBpbiBDKyswMyBpZiBwb3NzaWJsZS4KKyMgIHVuZGVmIGNvbXBsZXgKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX0NPTVBMRVhfSAorI2RlZmluZSBfR0xJQkNYWF9DT01QTEVYX0ggMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY29uZGl0aW9uX3ZhcmlhYmxlIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jb25kaXRpb25fdmFyaWFibGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4NDY1NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY29uZGl0aW9uX3ZhcmlhYmxlCkBAIC0wLDAgKzEsMjg2IEBACisvLyA8Y29uZGl0aW9uX3ZhcmlhYmxlPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9jb25kaXRpb25fdmFyaWFibGUKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQ09ORElUSU9OX1ZBUklBQkxFCisjZGVmaW5lIF9HTElCQ1hYX0NPTkRJVElPTl9WQVJJQUJMRSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8bXV0ZXg+IC8vIHVuaXF1ZV9sb2NrCisKKyNpZiBkZWZpbmVkKF9HTElCQ1hYX0hBU19HVEhSRUFEUykgJiYgZGVmaW5lZChfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEpCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGRlZmdyb3VwIGNvbmRpdGlvbl92YXJpYWJsZXMgQ29uZGl0aW9uIFZhcmlhYmxlcworICAgKiBAaW5ncm91cCBjb25jdXJyZW5jeQorICAgKgorICAgKiBDbGFzc2VzIGZvciBjb25kaXRpb25fdmFyaWFibGUgc3VwcG9ydC4KKyAgICogQHsKKyAgICovCisKKyAgLy8vIGN2X3N0YXR1cworICBlbnVtIGNsYXNzIGN2X3N0YXR1cyB7IG5vX3RpbWVvdXQsIHRpbWVvdXQgfTsKKyAgCisgIC8vLyBjb25kaXRpb25fdmFyaWFibGUKKyAgY2xhc3MgY29uZGl0aW9uX3ZhcmlhYmxlCisgIHsKKyAgICB0eXBlZGVmIGNocm9ubzo6c3lzdGVtX2Nsb2NrCV9fY2xvY2tfdDsKKyAgICB0eXBlZGVmIF9fZ3RocmVhZF9jb25kX3QJCV9fbmF0aXZlX3R5cGU7CisKKyNpZmRlZiBfX0dUSFJFQURfQ09ORF9JTklUCisgICAgX19uYXRpdmVfdHlwZQkJCV9NX2NvbmQgPSBfX0dUSFJFQURfQ09ORF9JTklUOworI2Vsc2UKKyAgICBfX25hdGl2ZV90eXBlCQkJX01fY29uZDsKKyNlbmRpZgorCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9fbmF0aXZlX3R5cGUqIAkJbmF0aXZlX2hhbmRsZV90eXBlOworCisgICAgY29uZGl0aW9uX3ZhcmlhYmxlKCkgbm9leGNlcHQ7CisgICAgfmNvbmRpdGlvbl92YXJpYWJsZSgpIG5vZXhjZXB0OworCisgICAgY29uZGl0aW9uX3ZhcmlhYmxlKGNvbnN0IGNvbmRpdGlvbl92YXJpYWJsZSYpID0gZGVsZXRlOworICAgIGNvbmRpdGlvbl92YXJpYWJsZSYgb3BlcmF0b3I9KGNvbnN0IGNvbmRpdGlvbl92YXJpYWJsZSYpID0gZGVsZXRlOworCisgICAgdm9pZAorICAgIG5vdGlmeV9vbmUoKSBub2V4Y2VwdDsKKworICAgIHZvaWQKKyAgICBub3RpZnlfYWxsKCkgbm9leGNlcHQ7CisKKyAgICB2b2lkCisgICAgd2FpdCh1bmlxdWVfbG9jazxtdXRleD4mIF9fbG9jayk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgICAgdm9pZAorICAgICAgd2FpdCh1bmlxdWVfbG9jazxtdXRleD4mIF9fbG9jaywgX1ByZWRpY2F0ZSBfX3ApCisgICAgICB7CisJd2hpbGUgKCFfX3AoKSkKKwkgIHdhaXQoX19sb2NrKTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9EdXJhdGlvbj4KKyAgICAgIGN2X3N0YXR1cworICAgICAgd2FpdF91bnRpbCh1bmlxdWVfbG9jazxtdXRleD4mIF9fbG9jaywKKwkJIGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfX2Nsb2NrX3QsIF9EdXJhdGlvbj4mIF9fYXRpbWUpCisgICAgICB7IHJldHVybiBfX3dhaXRfdW50aWxfaW1wbChfX2xvY2ssIF9fYXRpbWUpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXJhdGlvbj4KKyAgICAgIGN2X3N0YXR1cworICAgICAgd2FpdF91bnRpbCh1bmlxdWVfbG9jazxtdXRleD4mIF9fbG9jaywKKwkJIGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYXRpbWUpCisgICAgICB7CisJLy8gRFIgODg3IC0gU3luYyB1bmtub3duIGNsb2NrIHRvIGtub3duIGNsb2NrLgorCWNvbnN0IHR5cGVuYW1lIF9DbG9jazo6dGltZV9wb2ludCBfX2NfZW50cnkgPSBfQ2xvY2s6Om5vdygpOworCWNvbnN0IF9fY2xvY2tfdDo6dGltZV9wb2ludCBfX3NfZW50cnkgPSBfX2Nsb2NrX3Q6Om5vdygpOworCWNvbnN0IGF1dG8gX19kZWx0YSA9IF9fYXRpbWUgLSBfX2NfZW50cnk7CisJY29uc3QgYXV0byBfX3NfYXRpbWUgPSBfX3NfZW50cnkgKyBfX2RlbHRhOworCisJcmV0dXJuIF9fd2FpdF91bnRpbF9pbXBsKF9fbG9jaywgX19zX2F0aW1lKTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cmF0aW9uLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgICAgYm9vbAorICAgICAgd2FpdF91bnRpbCh1bmlxdWVfbG9jazxtdXRleD4mIF9fbG9jaywKKwkJIGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYXRpbWUsCisJCSBfUHJlZGljYXRlIF9fcCkKKyAgICAgIHsKKwl3aGlsZSAoIV9fcCgpKQorCSAgaWYgKHdhaXRfdW50aWwoX19sb2NrLCBfX2F0aW1lKSA9PSBjdl9zdGF0dXM6OnRpbWVvdXQpCisJICAgIHJldHVybiBfX3AoKTsKKwlyZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAsIHR5cGVuYW1lIF9QZXJpb2Q+CisgICAgICBjdl9zdGF0dXMKKyAgICAgIHdhaXRfZm9yKHVuaXF1ZV9sb2NrPG11dGV4PiYgX19sb2NrLAorCSAgICAgICBjb25zdCBjaHJvbm86OmR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX3J0aW1lKQorICAgICAgeyByZXR1cm4gd2FpdF91bnRpbChfX2xvY2ssIF9fY2xvY2tfdDo6bm93KCkgKyBfX3J0aW1lKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcCwgdHlwZW5hbWUgX1BlcmlvZCwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICAgIGJvb2wKKyAgICAgIHdhaXRfZm9yKHVuaXF1ZV9sb2NrPG11dGV4PiYgX19sb2NrLAorCSAgICAgICBjb25zdCBjaHJvbm86OmR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX3J0aW1lLAorCSAgICAgICBfUHJlZGljYXRlIF9fcCkKKyAgICAgIHsgcmV0dXJuIHdhaXRfdW50aWwoX19sb2NrLCBfX2Nsb2NrX3Q6Om5vdygpICsgX19ydGltZSwgc3RkOjptb3ZlKF9fcCkpOyB9CisKKyAgICBuYXRpdmVfaGFuZGxlX3R5cGUKKyAgICBuYXRpdmVfaGFuZGxlKCkKKyAgICB7IHJldHVybiAmX01fY29uZDsgfQorCisgIHByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0R1cj4KKyAgICAgIGN2X3N0YXR1cworICAgICAgX193YWl0X3VudGlsX2ltcGwodW5pcXVlX2xvY2s8bXV0ZXg+JiBfX2xvY2ssCisJCQljb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X19jbG9ja190LCBfRHVyPiYgX19hdGltZSkKKyAgICAgIHsKKwlhdXRvIF9fcyA9IGNocm9ubzo6dGltZV9wb2ludF9jYXN0PGNocm9ubzo6c2Vjb25kcz4oX19hdGltZSk7CisJYXV0byBfX25zID0gY2hyb25vOjpkdXJhdGlvbl9jYXN0PGNocm9ubzo6bmFub3NlY29uZHM+KF9fYXRpbWUgLSBfX3MpOworCisJX19ndGhyZWFkX3RpbWVfdCBfX3RzID0KKwkgIHsKKwkgICAgc3RhdGljX2Nhc3Q8c3RkOjp0aW1lX3Q+KF9fcy50aW1lX3NpbmNlX2Vwb2NoKCkuY291bnQoKSksCisJICAgIHN0YXRpY19jYXN0PGxvbmc+KF9fbnMuY291bnQoKSkKKwkgIH07CisKKwlfX2d0aHJlYWRfY29uZF90aW1lZHdhaXQoJl9NX2NvbmQsIF9fbG9jay5tdXRleCgpLT5uYXRpdmVfaGFuZGxlKCksCisJCQkJICZfX3RzKTsKKworCXJldHVybiAoX19jbG9ja190Ojpub3coKSA8IF9fYXRpbWUKKwkJPyBjdl9zdGF0dXM6Om5vX3RpbWVvdXQgOiBjdl9zdGF0dXM6OnRpbWVvdXQpOworICAgICAgfQorICB9OworCisgIC8vLyBjb25kaXRpb25fdmFyaWFibGVfYW55CisgIC8vIExpa2UgYWJvdmUsIGJ1dCBtdXRleCBpcyBub3QgcmVxdWlyZWQgdG8gaGF2ZSB0cnlfbG9jay4KKyAgY2xhc3MgY29uZGl0aW9uX3ZhcmlhYmxlX2FueQorICB7CisgICAgdHlwZWRlZiBjaHJvbm86OnN5c3RlbV9jbG9jawlfX2Nsb2NrX3Q7CisgICAgY29uZGl0aW9uX3ZhcmlhYmxlCQkJX01fY29uZDsKKyAgICBtdXRleAkJCQlfTV9tdXRleDsKKworICAgIC8vIHNjb3BlZCB1bmxvY2sgLSB1bmxvY2tzIGluIGN0b3IsIHJlLWxvY2tzIGluIGR0b3IKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTG9jaz4KKyAgICAgIHN0cnVjdCBfVW5sb2NrCisgICAgICB7CisJZXhwbGljaXQgX1VubG9jayhfTG9jayYgX19saykgOiBfTV9sb2NrKF9fbGspIHsgX19say51bmxvY2soKTsgfQorCisJfl9VbmxvY2soKSBub2V4Y2VwdChmYWxzZSkKKwl7CisJICBpZiAodW5jYXVnaHRfZXhjZXB0aW9uKCkpCisJICAgIF9fdHJ5IHsgX01fbG9jay5sb2NrKCk7IH0gX19jYXRjaCguLi4pIHsgfQorCSAgZWxzZQorCSAgICBfTV9sb2NrLmxvY2soKTsKKwl9CisKKwlfVW5sb2NrKGNvbnN0IF9VbmxvY2smKSA9IGRlbGV0ZTsKKwlfVW5sb2NrJiBvcGVyYXRvcj0oY29uc3QgX1VubG9jayYpID0gZGVsZXRlOworCisJX0xvY2smIF9NX2xvY2s7CisgICAgICB9OworCisgIHB1YmxpYzoKKworICAgIGNvbmRpdGlvbl92YXJpYWJsZV9hbnkoKSBub2V4Y2VwdDsKKyAgICB+Y29uZGl0aW9uX3ZhcmlhYmxlX2FueSgpIG5vZXhjZXB0OworCisgICAgY29uZGl0aW9uX3ZhcmlhYmxlX2FueShjb25zdCBjb25kaXRpb25fdmFyaWFibGVfYW55JikgPSBkZWxldGU7CisgICAgY29uZGl0aW9uX3ZhcmlhYmxlX2FueSYgb3BlcmF0b3I9KGNvbnN0IGNvbmRpdGlvbl92YXJpYWJsZV9hbnkmKSA9IGRlbGV0ZTsKKworICAgIHZvaWQKKyAgICBub3RpZnlfb25lKCkgbm9leGNlcHQKKyAgICB7CisgICAgICBsb2NrX2d1YXJkPG11dGV4PiBfX2xvY2soX01fbXV0ZXgpOworICAgICAgX01fY29uZC5ub3RpZnlfb25lKCk7CisgICAgfQorCisgICAgdm9pZAorICAgIG5vdGlmeV9hbGwoKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IF9fbG9jayhfTV9tdXRleCk7CisgICAgICBfTV9jb25kLm5vdGlmeV9hbGwoKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTG9jaz4KKyAgICAgIHZvaWQKKyAgICAgIHdhaXQoX0xvY2smIF9fbG9jaykKKyAgICAgIHsKKwl1bmlxdWVfbG9jazxtdXRleD4gX19teV9sb2NrKF9NX211dGV4KTsKKwlfVW5sb2NrPF9Mb2NrPiBfX3VubG9jayhfX2xvY2spOworCS8vIF9NX211dGV4IG11c3QgYmUgdW5sb2NrZWQgYmVmb3JlIHJlLWxvY2tpbmcgX19sb2NrIHNvIG1vdmUKKwkvLyBvd25lcnNoaXAgb2YgX01fbXV0ZXggbG9jayB0byBhbiBvYmplY3Qgd2l0aCBzaG9ydGVyIGxpZmV0aW1lLgorCXVuaXF1ZV9sb2NrPG11dGV4PiBfX215X2xvY2syKHN0ZDo6bW92ZShfX215X2xvY2spKTsKKwlfTV9jb25kLndhaXQoX19teV9sb2NrMik7CisgICAgICB9CisgICAgICAKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Mb2NrLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgICAgdm9pZAorICAgICAgd2FpdChfTG9jayYgX19sb2NrLCBfUHJlZGljYXRlIF9fcCkKKyAgICAgIHsKKwl3aGlsZSAoIV9fcCgpKQorCSAgd2FpdChfX2xvY2spOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0xvY2ssIHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cmF0aW9uPgorICAgICAgY3Zfc3RhdHVzCisgICAgICB3YWl0X3VudGlsKF9Mb2NrJiBfX2xvY2ssCisJCSBjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX2F0aW1lKQorICAgICAgeworCXVuaXF1ZV9sb2NrPG11dGV4PiBfX215X2xvY2soX01fbXV0ZXgpOworCV9VbmxvY2s8X0xvY2s+IF9fdW5sb2NrKF9fbG9jayk7CisJLy8gX01fbXV0ZXggbXVzdCBiZSB1bmxvY2tlZCBiZWZvcmUgcmUtbG9ja2luZyBfX2xvY2sgc28gbW92ZQorCS8vIG93bmVyc2hpcCBvZiBfTV9tdXRleCBsb2NrIHRvIGFuIG9iamVjdCB3aXRoIHNob3J0ZXIgbGlmZXRpbWUuCisJdW5pcXVlX2xvY2s8bXV0ZXg+IF9fbXlfbG9jazIoc3RkOjptb3ZlKF9fbXlfbG9jaykpOworCXJldHVybiBfTV9jb25kLndhaXRfdW50aWwoX19teV9sb2NrMiwgX19hdGltZSk7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTG9jaywgdHlwZW5hbWUgX0Nsb2NrLAorCSAgICAgdHlwZW5hbWUgX0R1cmF0aW9uLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgICAgYm9vbAorICAgICAgd2FpdF91bnRpbChfTG9jayYgX19sb2NrLAorCQkgY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX19hdGltZSwKKwkJIF9QcmVkaWNhdGUgX19wKQorICAgICAgeworCXdoaWxlICghX19wKCkpCisJICBpZiAod2FpdF91bnRpbChfX2xvY2ssIF9fYXRpbWUpID09IGN2X3N0YXR1czo6dGltZW91dCkKKwkgICAgcmV0dXJuIF9fcCgpOworCXJldHVybiB0cnVlOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0xvY2ssIHR5cGVuYW1lIF9SZXAsIHR5cGVuYW1lIF9QZXJpb2Q+CisgICAgICBjdl9zdGF0dXMKKyAgICAgIHdhaXRfZm9yKF9Mb2NrJiBfX2xvY2ssIGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcnRpbWUpCisgICAgICB7IHJldHVybiB3YWl0X3VudGlsKF9fbG9jaywgX19jbG9ja190Ojpub3coKSArIF9fcnRpbWUpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTG9jaywgdHlwZW5hbWUgX1JlcCwKKwkgICAgIHR5cGVuYW1lIF9QZXJpb2QsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgICBib29sCisgICAgICB3YWl0X2ZvcihfTG9jayYgX19sb2NrLAorCSAgICAgICBjb25zdCBjaHJvbm86OmR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX3J0aW1lLCBfUHJlZGljYXRlIF9fcCkKKyAgICAgIHsgcmV0dXJuIHdhaXRfdW50aWwoX19sb2NrLCBfX2Nsb2NrX3Q6Om5vdygpICsgX19ydGltZSwgc3RkOjptb3ZlKF9fcCkpOyB9CisgIH07CisKKyAgLy8gQH0gZ3JvdXAgY29uZGl0aW9uX3ZhcmlhYmxlcworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gX0dMSUJDWFhfSEFTX0dUSFJFQURTICYmIF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMQorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vIF9HTElCQ1hYX0NPTkRJVElPTl9WQVJJQUJMRQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc2V0am1wIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc2V0am1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3OTlkYjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzZXRqbXAKQEAgLTAsMCArMSw2MSBAQAorLy8gLSotIEMrKyAtKi0gZm9yd2FyZGluZyBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBjc2V0am1wCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgc2V0am1wLmgsCisgKiAgYW5kIGl0cyBjb250ZW50cyBhcmUgKG1vc3RseSkgdGhlIHNhbWUgYXMgdGhhdCBoZWFkZXIsIGJ1dCBhcmUgYWxsCisgKiAgY29udGFpbmVkIGluIHRoZSBuYW1lc3BhY2UgQGMgc3RkIChleGNlcHQgZm9yIG5hbWVzIHdoaWNoIGFyZSBkZWZpbmVkCisgKiAgYXMgbWFjcm9zIGluIEMpLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMC40LjYgIEMgbGlicmFyeQorLy8KKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKworI2lmbmRlZiBfR0xJQkNYWF9DU0VUSk1QCisjZGVmaW5lIF9HTElCQ1hYX0NTRVRKTVAgMQorCisvLyBHZXQgcmlkIG9mIHRob3NlIG1hY3JvcyBkZWZpbmVkIGluIDxzZXRqbXAuaD4gaW4gbGlldSBvZiByZWFsIGZ1bmN0aW9ucy4KKyN1bmRlZiBsb25nam1wCisKKy8vIEFkaGVyZSB0byBzZWN0aW9uIDE3LjQuMS4yIGNsYXVzZSA1IG9mIElTTyAxNDg4MjoxOTk4CisjaWZuZGVmIHNldGptcAorI2RlZmluZSBzZXRqbXAoZW52KSBzZXRqbXAgKGVudikKKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkCit7CisgIHVzaW5nIDo6am1wX2J1ZjsKKyAgdXNpbmcgOjpsb25nam1wOworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc2lnbmFsIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc2lnbmFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NDQ2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzaWduYWwKQEAgLTAsMCArMSw1NyBAQAorLy8gLSotIEMrKyAtKi0gZm9yd2FyZGluZyBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBjc2lnbmFsCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgc2lnbmFsLmgsCisgKiAgYW5kIGl0cyBjb250ZW50cyBhcmUgKG1vc3RseSkgdGhlIHNhbWUgYXMgdGhhdCBoZWFkZXIsIGJ1dCBhcmUgYWxsCisgKiAgY29udGFpbmVkIGluIHRoZSBuYW1lc3BhY2UgQGMgc3RkIChleGNlcHQgZm9yIG5hbWVzIHdoaWNoIGFyZSBkZWZpbmVkCisgKiAgYXMgbWFjcm9zIGluIEMpLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMC40LjYgIEMgbGlicmFyeQorLy8KKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2lmbmRlZiBfR0xJQkNYWF9DU0lHTkFMCisjZGVmaW5lIF9HTElCQ1hYX0NTSUdOQUwgMQorCisvLyBHZXQgcmlkIG9mIHRob3NlIG1hY3JvcyBkZWZpbmVkIGluIDxzaWduYWwuaD4gaW4gbGlldSBvZiByZWFsIGZ1bmN0aW9ucy4KKyN1bmRlZiByYWlzZQorCituYW1lc3BhY2Ugc3RkCit7CisgIHVzaW5nIDo6c2lnX2F0b21pY190OworICB1c2luZyA6OnNpZ25hbDsKKyAgdXNpbmcgOjpyYWlzZTsKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3N0ZGFsaWduIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc3RkYWxpZ24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwMDU1NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3N0ZGFsaWduCkBAIC0wLDAgKzEsNDQgQEAKKy8vIDxjc3RkYWxpZ24+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2NzdGRhbGlnbgorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWZuZGVmIF9HTElCQ1hYX0NTVERBTElHTgorI2RlZmluZSBfR0xJQkNYWF9DU1REQUxJR04gMQorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjICBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisjICBpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorIyAgaWYgX0dMSUJDWFhfSEFWRV9TVERBTElHTl9ICisjICAgIGluY2x1ZGUgPHN0ZGFsaWduLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc3RkYXJnIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc3RkYXJnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNjhkZTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzdGRhcmcKQEAgLTAsMCArMSw1NyBAQAorLy8gLSotIEMrKyAtKi0gZm9yd2FyZGluZyBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2NzdGRhcmcKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgZmlsZS4gIFlvdSBzaG91bGQgQGMgXCNpbmNsdWRlIHRoaXMgZmlsZQorICogIGluIHlvdXIgcHJvZ3JhbXMsIHJhdGhlciB0aGFuIGFueSBvZiB0aGUgQGEgKi5oIGltcGxlbWVudGF0aW9uIGZpbGVzLgorICoKKyAqICBUaGlzIGlzIHRoZSBDKysgdmVyc2lvbiBvZiB0aGUgU3RhbmRhcmQgQyBMaWJyYXJ5IGhlYWRlciBAYyBzdGRhcmcuaCwKKyAqICBhbmQgaXRzIGNvbnRlbnRzIGFyZSAobW9zdGx5KSB0aGUgc2FtZSBhcyB0aGF0IGhlYWRlciwgYnV0IGFyZSBhbGwKKyAqICBjb250YWluZWQgaW4gdGhlIG5hbWVzcGFjZSBAYyBzdGQgKGV4Y2VwdCBmb3IgbmFtZXMgd2hpY2ggYXJlIGRlZmluZWQKKyAqICBhcyBtYWNyb3MgaW4gQykuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIwLjQuNiAgQyBsaWJyYXJ5CisvLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaWZuZGVmIF9HTElCQ1hYX0NTVERBUkcKKyNkZWZpbmUgX0dMSUJDWFhfQ1NUREFSRyAxCisKKy8vIEFkaGVyZSB0byBzZWN0aW9uIDE3LjQuMS4yIGNsYXVzZSA1IG9mIElTTyAxNDg4MjoxOTk4CisjaWZuZGVmIHZhX2VuZAorI2RlZmluZSB2YV9lbmQoYXApIHZhX2VuZCAoYXApCisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZAoreworICB1c2luZyA6OnZhX2xpc3Q7Cit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzdGRib29sIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc3RkYm9vbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGFiYmVkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc3RkYm9vbApAQCAtMCwwICsxLDQ0IEBACisvLyA8Y3N0ZGJvb2w+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2NzdGRib29sCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZm5kZWYgX0dMSUJDWFhfQ1NUREJPT0wKKyNkZWZpbmUgX0dMSUJDWFhfQ1NUREJPT0wgMQorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjICBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisjICBpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorIyAgaWYgX0dMSUJDWFhfSEFWRV9TVERCT09MX0gKKyMgICAgaW5jbHVkZSA8c3RkYm9vbC5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3N0ZGRlZiBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3N0ZGRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDY2MGYzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc3RkZGVmCkBAIC0wLDAgKzEsNDIgQEAKKy8vIC0qLSBDKysgLSotIGZvcndhcmRpbmcgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgY3N0ZGRlZgorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBmaWxlLiAgWW91IHNob3VsZCBAYyBcI2luY2x1ZGUgdGhpcyBmaWxlCisgKiAgaW4geW91ciBwcm9ncmFtcywgcmF0aGVyIHRoYW4gYW55IG9mIHRoZSBAYSAqLmggaW1wbGVtZW50YXRpb24gZmlsZXMuCisgKgorICogIFRoaXMgaXMgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoZSBTdGFuZGFyZCBDIExpYnJhcnkgaGVhZGVyIEBjIHN0ZGRlZi5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMTguMSAgVHlwZXMKKy8vCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzdGRpbnQgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzdGRpbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk0NTg1OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3N0ZGludApAQCAtMCwwICsxLDg5IEBACisvLyA8Y3N0ZGludD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY3N0ZGludAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9DU1RESU5UCisjZGVmaW5lIF9HTElCQ1hYX0NTVERJTlQgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworI2lmIF9HTElCQ1hYX0hBVkVfU1RESU5UX0gKKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMQorCituYW1lc3BhY2Ugc3RkCit7CisgIHVzaW5nIDo6aW50OF90OworICB1c2luZyA6OmludDE2X3Q7CisgIHVzaW5nIDo6aW50MzJfdDsKKyAgdXNpbmcgOjppbnQ2NF90OworCisgIHVzaW5nIDo6aW50X2Zhc3Q4X3Q7CisgIHVzaW5nIDo6aW50X2Zhc3QxNl90OworICB1c2luZyA6OmludF9mYXN0MzJfdDsKKyAgdXNpbmcgOjppbnRfZmFzdDY0X3Q7CisKKyAgdXNpbmcgOjppbnRfbGVhc3Q4X3Q7CisgIHVzaW5nIDo6aW50X2xlYXN0MTZfdDsKKyAgdXNpbmcgOjppbnRfbGVhc3QzMl90OworICB1c2luZyA6OmludF9sZWFzdDY0X3Q7CisKKyAgdXNpbmcgOjppbnRtYXhfdDsKKyAgdXNpbmcgOjppbnRwdHJfdDsKKyAgCisgIHVzaW5nIDo6dWludDhfdDsKKyAgdXNpbmcgOjp1aW50MTZfdDsKKyAgdXNpbmcgOjp1aW50MzJfdDsKKyAgdXNpbmcgOjp1aW50NjRfdDsKKworICB1c2luZyA6OnVpbnRfZmFzdDhfdDsKKyAgdXNpbmcgOjp1aW50X2Zhc3QxNl90OworICB1c2luZyA6OnVpbnRfZmFzdDMyX3Q7CisgIHVzaW5nIDo6dWludF9mYXN0NjRfdDsKKworICB1c2luZyA6OnVpbnRfbGVhc3Q4X3Q7CisgIHVzaW5nIDo6dWludF9sZWFzdDE2X3Q7CisgIHVzaW5nIDo6dWludF9sZWFzdDMyX3Q7CisgIHVzaW5nIDo6dWludF9sZWFzdDY0X3Q7CisKKyAgdXNpbmcgOjp1aW50bWF4X3Q7CisgIHVzaW5nIDo6dWludHB0cl90OworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKworI2VuZGlmIC8vIEMrKzExCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9DU1RESU5UCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzdGRpbyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3N0ZGlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MWU0YjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzdGRpbwpAQCAtMCwwICsxLDE4NyBAQAorLy8gLSotIEMrKyAtKi0gZm9yd2FyZGluZyBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2NzdGRpbworICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBmaWxlLiAgWW91IHNob3VsZCBAYyBcI2luY2x1ZGUgdGhpcyBmaWxlCisgKiAgaW4geW91ciBwcm9ncmFtcywgcmF0aGVyIHRoYW4gYW55IG9mIHRoZSBAYSAqLmggaW1wbGVtZW50YXRpb24gZmlsZXMuCisgKgorICogIFRoaXMgaXMgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoZSBTdGFuZGFyZCBDIExpYnJhcnkgaGVhZGVyIEBjIHN0ZGlvLmgsCisgKiAgYW5kIGl0cyBjb250ZW50cyBhcmUgKG1vc3RseSkgdGhlIHNhbWUgYXMgdGhhdCBoZWFkZXIsIGJ1dCBhcmUgYWxsCisgKiAgY29udGFpbmVkIGluIHRoZSBuYW1lc3BhY2UgQGMgc3RkIChleGNlcHQgZm9yIG5hbWVzIHdoaWNoIGFyZSBkZWZpbmVkCisgKiAgYXMgbWFjcm9zIGluIEMpLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy44LjIgIEMgTGlicmFyeSBmaWxlcworLy8KKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZuZGVmIF9HTElCQ1hYX0NTVERJTworI2RlZmluZSBfR0xJQkNYWF9DU1RESU8gMQorCisjaWZuZGVmIF9HTElCQ1hYX0hBVkVfR0VUUworZXh0ZXJuICJDIiBjaGFyKiBnZXRzIChjaGFyKiBfX3MpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKKyNlbmRpZgorCisvLyBHZXQgcmlkIG9mIHRob3NlIG1hY3JvcyBkZWZpbmVkIGluIDxzdGRpby5oPiBpbiBsaWV1IG9mIHJlYWwgZnVuY3Rpb25zLgorI3VuZGVmIGNsZWFyZXJyCisjdW5kZWYgZmNsb3NlCisjdW5kZWYgZmVvZgorI3VuZGVmIGZlcnJvcgorI3VuZGVmIGZmbHVzaAorI3VuZGVmIGZnZXRjCisjdW5kZWYgZmdldHBvcworI3VuZGVmIGZnZXRzCisjdW5kZWYgZm9wZW4KKyN1bmRlZiBmcHJpbnRmCisjdW5kZWYgZnB1dGMKKyN1bmRlZiBmcHV0cworI3VuZGVmIGZyZWFkCisjdW5kZWYgZnJlb3BlbgorI3VuZGVmIGZzY2FuZgorI3VuZGVmIGZzZWVrCisjdW5kZWYgZnNldHBvcworI3VuZGVmIGZ0ZWxsCisjdW5kZWYgZndyaXRlCisjdW5kZWYgZ2V0YworI3VuZGVmIGdldGNoYXIKKyN1bmRlZiBnZXRzCisjdW5kZWYgcGVycm9yCisjdW5kZWYgcHJpbnRmCisjdW5kZWYgcHV0YworI3VuZGVmIHB1dGNoYXIKKyN1bmRlZiBwdXRzCisjdW5kZWYgcmVtb3ZlCisjdW5kZWYgcmVuYW1lCisjdW5kZWYgcmV3aW5kCisjdW5kZWYgc2NhbmYKKyN1bmRlZiBzZXRidWYKKyN1bmRlZiBzZXR2YnVmCisjdW5kZWYgc3ByaW50ZgorI3VuZGVmIHNzY2FuZgorI3VuZGVmIHRtcGZpbGUKKyN1bmRlZiB0bXBuYW0KKyN1bmRlZiB1bmdldGMKKyN1bmRlZiB2ZnByaW50ZgorI3VuZGVmIHZwcmludGYKKyN1bmRlZiB2c3ByaW50ZgorCituYW1lc3BhY2Ugc3RkCit7CisgIHVzaW5nIDo6RklMRTsKKyAgdXNpbmcgOjpmcG9zX3Q7CisKKyAgdXNpbmcgOjpjbGVhcmVycjsKKyAgdXNpbmcgOjpmY2xvc2U7CisgIHVzaW5nIDo6ZmVvZjsKKyAgdXNpbmcgOjpmZXJyb3I7CisgIHVzaW5nIDo6ZmZsdXNoOworICB1c2luZyA6OmZnZXRjOworICB1c2luZyA6OmZnZXRwb3M7CisgIHVzaW5nIDo6ZmdldHM7CisgIHVzaW5nIDo6Zm9wZW47CisgIHVzaW5nIDo6ZnByaW50ZjsKKyAgdXNpbmcgOjpmcHV0YzsKKyAgdXNpbmcgOjpmcHV0czsKKyAgdXNpbmcgOjpmcmVhZDsKKyAgdXNpbmcgOjpmcmVvcGVuOworICB1c2luZyA6OmZzY2FuZjsKKyAgdXNpbmcgOjpmc2VlazsKKyAgdXNpbmcgOjpmc2V0cG9zOworICB1c2luZyA6OmZ0ZWxsOworICB1c2luZyA6OmZ3cml0ZTsKKyAgdXNpbmcgOjpnZXRjOworICB1c2luZyA6OmdldGNoYXI7CisgIHVzaW5nIDo6Z2V0czsKKyAgdXNpbmcgOjpwZXJyb3I7CisgIHVzaW5nIDo6cHJpbnRmOworICB1c2luZyA6OnB1dGM7CisgIHVzaW5nIDo6cHV0Y2hhcjsKKyAgdXNpbmcgOjpwdXRzOworICB1c2luZyA6OnJlbW92ZTsKKyAgdXNpbmcgOjpyZW5hbWU7CisgIHVzaW5nIDo6cmV3aW5kOworICB1c2luZyA6OnNjYW5mOworICB1c2luZyA6OnNldGJ1ZjsKKyAgdXNpbmcgOjpzZXR2YnVmOworICB1c2luZyA6OnNwcmludGY7CisgIHVzaW5nIDo6c3NjYW5mOworICB1c2luZyA6OnRtcGZpbGU7CisgIHVzaW5nIDo6dG1wbmFtOworICB1c2luZyA6OnVuZ2V0YzsKKyAgdXNpbmcgOjp2ZnByaW50ZjsKKyAgdXNpbmcgOjp2cHJpbnRmOworICB1c2luZyA6OnZzcHJpbnRmOworfSAvLyBuYW1lc3BhY2UKKworI2lmIF9HTElCQ1hYX1VTRV9DOTkKKworI3VuZGVmIHNucHJpbnRmCisjdW5kZWYgdmZzY2FuZgorI3VuZGVmIHZzY2FuZgorI3VuZGVmIHZzbnByaW50ZgorI3VuZGVmIHZzc2NhbmYKKworbmFtZXNwYWNlIF9fZ251X2N4eAoreworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ0hFQ0sgfHwgX0dMSUJDWFhfVVNFX0M5OV9EWU5BTUlDCisgIGV4dGVybiAiQyIgaW50CisgIChzbnByaW50ZikoY2hhciAqIF9fcmVzdHJpY3QsIHN0ZDo6c2l6ZV90LCBjb25zdCBjaGFyICogX19yZXN0cmljdCwgLi4uKQorICB0aHJvdyAoKTsKKyAgZXh0ZXJuICJDIiBpbnQKKyAgKHZmc2NhbmYpKEZJTEUgKiBfX3Jlc3RyaWN0LCBjb25zdCBjaGFyICogX19yZXN0cmljdCwgX19nbnVjX3ZhX2xpc3QpOworICBleHRlcm4gIkMiIGludCAodnNjYW5mKShjb25zdCBjaGFyICogX19yZXN0cmljdCwgX19nbnVjX3ZhX2xpc3QpOworICBleHRlcm4gIkMiIGludAorICAodnNucHJpbnRmKShjaGFyICogX19yZXN0cmljdCwgc3RkOjpzaXplX3QsIGNvbnN0IGNoYXIgKiBfX3Jlc3RyaWN0LAorCSAgICAgIF9fZ251Y192YV9saXN0KSB0aHJvdyAoKTsKKyAgZXh0ZXJuICJDIiBpbnQKKyAgKHZzc2NhbmYpKGNvbnN0IGNoYXIgKiBfX3Jlc3RyaWN0LCBjb25zdCBjaGFyICogX19yZXN0cmljdCwgX19nbnVjX3ZhX2xpc3QpCisgIHRocm93ICgpOworI2VuZGlmCisKKyNpZiAhX0dMSUJDWFhfVVNFX0M5OV9EWU5BTUlDCisgIHVzaW5nIDo6c25wcmludGY7CisgIHVzaW5nIDo6dmZzY2FuZjsKKyAgdXNpbmcgOjp2c2NhbmY7CisgIHVzaW5nIDo6dnNucHJpbnRmOworICB1c2luZyA6OnZzc2NhbmY7CisjZW5kaWYKK30gLy8gbmFtZXNwYWNlIF9fZ251X2N4eAorCituYW1lc3BhY2Ugc3RkCit7CisgIHVzaW5nIDo6X19nbnVfY3h4OjpzbnByaW50ZjsKKyAgdXNpbmcgOjpfX2dudV9jeHg6OnZmc2NhbmY7CisgIHVzaW5nIDo6X19nbnVfY3h4Ojp2c2NhbmY7CisgIHVzaW5nIDo6X19nbnVfY3h4Ojp2c25wcmludGY7CisgIHVzaW5nIDo6X19nbnVfY3h4Ojp2c3NjYW5mOworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9VU0VfQzk5CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc3RkbGliIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc3RkbGliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxODAwMzYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2NzdGRsaWIKQEAgLTAsMCArMSwyNjAgQEAKKy8vIC0qLSBDKysgLSotIGZvcndhcmRpbmcgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9jc3RkbGliCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgc3RkbGliLmgsCisgKiAgYW5kIGl0cyBjb250ZW50cyBhcmUgKG1vc3RseSkgdGhlIHNhbWUgYXMgdGhhdCBoZWFkZXIsIGJ1dCBhcmUgYWxsCisgKiAgY29udGFpbmVkIGluIHRoZSBuYW1lc3BhY2UgQGMgc3RkIChleGNlcHQgZm9yIG5hbWVzIHdoaWNoIGFyZSBkZWZpbmVkCisgKiAgYXMgbWFjcm9zIGluIEMpLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMC40LjYgIEMgbGlicmFyeQorLy8KKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworI2lmbmRlZiBfR0xJQkNYWF9DU1RETElCCisjZGVmaW5lIF9HTElCQ1hYX0NTVERMSUIgMQorCisjaWYgIV9HTElCQ1hYX0hPU1RFRAorLy8gVGhlIEMgc3RhbmRhcmQgZG9lcyBub3QgcmVxdWlyZSBhIGZyZWVzdGFuZGluZyBpbXBsZW1lbnRhdGlvbiB0bworLy8gcHJvdmlkZSA8c3RkbGliLmg+LiAgSG93ZXZlciwgdGhlIEMrKyBzdGFuZGFyZCBkb2VzIHN0aWxsIHJlcXVpcmUKKy8vIDxjc3RkbGliPiAtLSBidXQgb25seSB0aGUgZnVuY3Rpb25hbGl0eSBtZW50aW9uZWQgaW4KKy8vIFtsaWIuc3VwcG9ydC5zdGFydC50ZXJtXS4KKworI2RlZmluZSBFWElUX1NVQ0NFU1MgMAorI2RlZmluZSBFWElUX0ZBSUxVUkUgMQorCituYW1lc3BhY2Ugc3RkCit7CisgIGV4dGVybiAiQyIgdm9pZCBhYm9ydCh2b2lkKSB0aHJvdyAoKSBfR0xJQkNYWF9OT1JFVFVSTjsKKyAgZXh0ZXJuICJDIiBpbnQgYXRleGl0KHZvaWQgKCopKCkpIHRocm93ICgpOworICBleHRlcm4gIkMiIHZvaWQgZXhpdChpbnQpIHRocm93ICgpIF9HTElCQ1hYX05PUkVUVVJOOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyMgaWZkZWYgX0dMSUJDWFhfSEFWRV9BVF9RVUlDS19FWElUCisgIGV4dGVybiAiQyIgaW50IGF0X3F1aWNrX2V4aXQodm9pZCAoKikoKSkgdGhyb3cgKCk7CisjIGVuZGlmCisjIGlmZGVmIF9HTElCQ1hYX0hBVkVfUVVJQ0tfRVhJVAorICBleHRlcm4gIkMiIHZvaWQgcXVpY2tfZXhpdChpbnQpIHRocm93KCkgX0dMSUJDWFhfTk9SRVRVUk47CisjIGVuZGlmCisjZW5kaWYKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZWxzZQorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8vIEdldCByaWQgb2YgdGhvc2UgbWFjcm9zIGRlZmluZWQgaW4gPHN0ZGxpYi5oPiBpbiBsaWV1IG9mIHJlYWwgZnVuY3Rpb25zLgorI3VuZGVmIGFib3J0CisjdW5kZWYgYWJzCisjdW5kZWYgYXRleGl0CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorIyBpZmRlZiBfR0xJQkNYWF9IQVZFX0FUX1FVSUNLX0VYSVQKKyMgIHVuZGVmIGF0X3F1aWNrX2V4aXQKKyMgZW5kaWYKKyNlbmRpZgorI3VuZGVmIGF0b2YKKyN1bmRlZiBhdG9pCisjdW5kZWYgYXRvbAorI3VuZGVmIGJzZWFyY2gKKyN1bmRlZiBjYWxsb2MKKyN1bmRlZiBkaXYKKyN1bmRlZiBleGl0CisjdW5kZWYgZnJlZQorI3VuZGVmIGdldGVudgorI3VuZGVmIGxhYnMKKyN1bmRlZiBsZGl2CisjdW5kZWYgbWFsbG9jCisjdW5kZWYgbWJsZW4KKyN1bmRlZiBtYnN0b3djcworI3VuZGVmIG1idG93YworI3VuZGVmIHFzb3J0CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorIyBpZmRlZiBfR0xJQkNYWF9IQVZFX1FVSUNLX0VYSVQKKyMgIHVuZGVmIHF1aWNrX2V4aXQKKyMgZW5kaWYKKyNlbmRpZgorI3VuZGVmIHJhbmQKKyN1bmRlZiByZWFsbG9jCisjdW5kZWYgc3JhbmQKKyN1bmRlZiBzdHJ0b2QKKyN1bmRlZiBzdHJ0b2wKKyN1bmRlZiBzdHJ0b3VsCisjdW5kZWYgc3lzdGVtCisjdW5kZWYgd2NzdG9tYnMKKyN1bmRlZiB3Y3RvbWIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHVzaW5nIDo6ZGl2X3Q7CisgIHVzaW5nIDo6bGRpdl90OworCisgIHVzaW5nIDo6YWJvcnQ7CisgIHVzaW5nIDo6YWJzOworICB1c2luZyA6OmF0ZXhpdDsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjIGlmZGVmIF9HTElCQ1hYX0hBVkVfQVRfUVVJQ0tfRVhJVAorICB1c2luZyA6OmF0X3F1aWNrX2V4aXQ7CisjIGVuZGlmCisjZW5kaWYKKyAgdXNpbmcgOjphdG9mOworICB1c2luZyA6OmF0b2k7CisgIHVzaW5nIDo6YXRvbDsKKyAgdXNpbmcgOjpic2VhcmNoOworICB1c2luZyA6OmNhbGxvYzsKKyAgdXNpbmcgOjpkaXY7CisgIHVzaW5nIDo6ZXhpdDsKKyAgdXNpbmcgOjpmcmVlOworICB1c2luZyA6OmdldGVudjsKKyAgdXNpbmcgOjpsYWJzOworICB1c2luZyA6OmxkaXY7CisgIHVzaW5nIDo6bWFsbG9jOworI2lmZGVmIF9HTElCQ1hYX0hBVkVfTUJTVEFURV9UCisgIHVzaW5nIDo6bWJsZW47CisgIHVzaW5nIDo6bWJzdG93Y3M7CisgIHVzaW5nIDo6bWJ0b3djOworI2VuZGlmIC8vIF9HTElCQ1hYX0hBVkVfTUJTVEFURV9UCisgIHVzaW5nIDo6cXNvcnQ7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorIyBpZmRlZiBfR0xJQkNYWF9IQVZFX1FVSUNLX0VYSVQKKyAgdXNpbmcgOjpxdWlja19leGl0OworIyBlbmRpZgorI2VuZGlmCisgIHVzaW5nIDo6cmFuZDsKKyAgdXNpbmcgOjpyZWFsbG9jOworICB1c2luZyA6OnNyYW5kOworICB1c2luZyA6OnN0cnRvZDsKKyAgdXNpbmcgOjpzdHJ0b2w7CisgIHVzaW5nIDo6c3RydG91bDsKKyAgdXNpbmcgOjpzeXN0ZW07CisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdXNpbmcgOjp3Y3N0b21iczsKKyAgdXNpbmcgOjp3Y3RvbWI7CisjZW5kaWYgLy8gX0dMSUJDWFhfVVNFX1dDSEFSX1QKKworI2lmbmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9TVERMSUJfSF9QUk9UTworICBpbmxpbmUgbG9uZworICBhYnMobG9uZyBfX2kpIHsgcmV0dXJuIF9fYnVpbHRpbl9sYWJzKF9faSk7IH0KKworICBpbmxpbmUgbGRpdl90CisgIGRpdihsb25nIF9faSwgbG9uZyBfX2opIHsgcmV0dXJuIGxkaXYoX19pLCBfX2opOyB9CisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9MT05HX0xPTkcKKyAgaW5saW5lIGxvbmcgbG9uZworICBhYnMobG9uZyBsb25nIF9feCkgeyByZXR1cm4gX19idWlsdGluX2xsYWJzIChfX3gpOyB9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfR0xJQkNYWF9VU0VfSU5UMTI4KQorICBpbmxpbmUgX19pbnQxMjgKKyAgYWJzKF9faW50MTI4IF9feCkgeyByZXR1cm4gX194ID49IDAgPyBfX3ggOiAtX194OyB9CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OQorCisjdW5kZWYgX0V4aXQKKyN1bmRlZiBsbGFicworI3VuZGVmIGxsZGl2CisjdW5kZWYgYXRvbGwKKyN1bmRlZiBzdHJ0b2xsCisjdW5kZWYgc3RydG91bGwKKyN1bmRlZiBzdHJ0b2YKKyN1bmRlZiBzdHJ0b2xkCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworI2lmICFfR0xJQkNYWF9VU0VfQzk5X0xPTkdfTE9OR19EWU5BTUlDCisgIHVzaW5nIDo6bGxkaXZfdDsKKyNlbmRpZgorI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ0hFQ0sgfHwgX0dMSUJDWFhfVVNFX0M5OV9EWU5BTUlDCisgIGV4dGVybiAiQyIgdm9pZCAoX0V4aXQpKGludCkgdGhyb3cgKCkgX0dMSUJDWFhfTk9SRVRVUk47CisjZW5kaWYKKyNpZiAhX0dMSUJDWFhfVVNFX0M5OV9EWU5BTUlDCisgIHVzaW5nIDo6X0V4aXQ7CisjZW5kaWYKKworI2lmICFfR0xJQkNYWF9VU0VfQzk5X0xPTkdfTE9OR19EWU5BTUlDCisgIHVzaW5nIDo6bGxhYnM7CisKKyAgaW5saW5lIGxsZGl2X3QKKyAgZGl2KGxvbmcgbG9uZyBfX24sIGxvbmcgbG9uZyBfX2QpCisgIHsgbGxkaXZfdCBfX3E7IF9fcS5xdW90ID0gX19uIC8gX19kOyBfX3EucmVtID0gX19uICUgX19kOyByZXR1cm4gX19xOyB9CisKKyAgdXNpbmcgOjpsbGRpdjsKKyNlbmRpZgorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9MT05HX0xPTkdfQ0hFQ0sgfHwgX0dMSUJDWFhfVVNFX0M5OV9MT05HX0xPTkdfRFlOQU1JQworICBleHRlcm4gIkMiIGxvbmcgbG9uZyBpbnQgKGF0b2xsKShjb25zdCBjaGFyICopIHRocm93ICgpOworICBleHRlcm4gIkMiIGxvbmcgbG9uZyBpbnQKKyAgICAoc3RydG9sbCkoY29uc3QgY2hhciAqIF9fcmVzdHJpY3QsIGNoYXIgKiogX19yZXN0cmljdCwgaW50KSB0aHJvdyAoKTsKKyAgZXh0ZXJuICJDIiB1bnNpZ25lZCBsb25nIGxvbmcgaW50CisgICAgKHN0cnRvdWxsKShjb25zdCBjaGFyICogX19yZXN0cmljdCwgY2hhciAqKiBfX3Jlc3RyaWN0LCBpbnQpIHRocm93ICgpOworI2VuZGlmCisjaWYgIV9HTElCQ1hYX1VTRV9DOTlfTE9OR19MT05HX0RZTkFNSUMKKyAgdXNpbmcgOjphdG9sbDsKKyAgdXNpbmcgOjpzdHJ0b2xsOworICB1c2luZyA6OnN0cnRvdWxsOworI2VuZGlmCisgIHVzaW5nIDo6c3RydG9mOworICB1c2luZyA6OnN0cnRvbGQ7CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgX19nbnVfY3h4CisKK25hbWVzcGFjZSBzdGQKK3sKKyNpZiAhX0dMSUJDWFhfVVNFX0M5OV9MT05HX0xPTkdfRFlOQU1JQworICB1c2luZyA6Ol9fZ251X2N4eDo6bGxkaXZfdDsKKyNlbmRpZgorICB1c2luZyA6Ol9fZ251X2N4eDo6X0V4aXQ7CisjaWYgIV9HTElCQ1hYX1VTRV9DOTlfTE9OR19MT05HX0RZTkFNSUMKKyAgdXNpbmcgOjpfX2dudV9jeHg6OmxsYWJzOworICB1c2luZyA6Ol9fZ251X2N4eDo6ZGl2OworICB1c2luZyA6Ol9fZ251X2N4eDo6bGxkaXY7CisjZW5kaWYKKyAgdXNpbmcgOjpfX2dudV9jeHg6OmF0b2xsOworICB1c2luZyA6Ol9fZ251X2N4eDo6c3RydG9mOworICB1c2luZyA6Ol9fZ251X2N4eDo6c3RydG9sbDsKKyAgdXNpbmcgOjpfX2dudV9jeHg6OnN0cnRvdWxsOworICB1c2luZyA6Ol9fZ251X2N4eDo6c3RydG9sZDsKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gX0dMSUJDWFhfVVNFX0M5OQorCisjZW5kaWYgLy8gIV9HTElCQ1hYX0hPU1RFRAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3N0cmluZyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3N0cmluZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmRlZmFiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jc3RyaW5nCkBAIC0wLDAgKzEsMTIzIEBACisvLyAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGNzdHJpbmcKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgZmlsZS4gIFlvdSBzaG91bGQgQGMgXCNpbmNsdWRlIHRoaXMgZmlsZQorICogIGluIHlvdXIgcHJvZ3JhbXMsIHJhdGhlciB0aGFuIGFueSBvZiB0aGUgQGEgKi5oIGltcGxlbWVudGF0aW9uIGZpbGVzLgorICoKKyAqICBUaGlzIGlzIHRoZSBDKysgdmVyc2lvbiBvZiB0aGUgU3RhbmRhcmQgQyBMaWJyYXJ5IGhlYWRlciBAYyBzdHJpbmcuaCwKKyAqICBhbmQgaXRzIGNvbnRlbnRzIGFyZSAobW9zdGx5KSB0aGUgc2FtZSBhcyB0aGF0IGhlYWRlciwgYnV0IGFyZSBhbGwKKyAqICBjb250YWluZWQgaW4gdGhlIG5hbWVzcGFjZSBAYyBzdGQgKGV4Y2VwdCBmb3IgbmFtZXMgd2hpY2ggYXJlIGRlZmluZWQKKyAqICBhcyBtYWNyb3MgaW4gQykuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIwLjQuNiAgQyBsaWJyYXJ5CisvLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZuZGVmIF9HTElCQ1hYX0NTVFJJTkcKKyNkZWZpbmUgX0dMSUJDWFhfQ1NUUklORyAxCisKKy8vIEdldCByaWQgb2YgdGhvc2UgbWFjcm9zIGRlZmluZWQgaW4gPHN0cmluZy5oPiBpbiBsaWV1IG9mIHJlYWwgZnVuY3Rpb25zLgorI3VuZGVmIG1lbWNocgorI3VuZGVmIG1lbWNtcAorI3VuZGVmIG1lbWNweQorI3VuZGVmIG1lbW1vdmUKKyN1bmRlZiBtZW1zZXQKKyN1bmRlZiBzdHJjYXQKKyN1bmRlZiBzdHJjaHIKKyN1bmRlZiBzdHJjbXAKKyN1bmRlZiBzdHJjb2xsCisjdW5kZWYgc3RyY3B5CisjdW5kZWYgc3RyY3NwbgorI3VuZGVmIHN0cmVycm9yCisjdW5kZWYgc3RybGVuCisjdW5kZWYgc3RybmNhdAorI3VuZGVmIHN0cm5jbXAKKyN1bmRlZiBzdHJuY3B5CisjdW5kZWYgc3RycGJyaworI3VuZGVmIHN0cnJjaHIKKyN1bmRlZiBzdHJzcG4KKyN1bmRlZiBzdHJzdHIKKyN1bmRlZiBzdHJ0b2sKKyN1bmRlZiBzdHJ4ZnJtCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyA6Om1lbWNocjsKKyAgdXNpbmcgOjptZW1jbXA7CisgIHVzaW5nIDo6bWVtY3B5OworICB1c2luZyA6Om1lbW1vdmU7CisgIHVzaW5nIDo6bWVtc2V0OworICB1c2luZyA6OnN0cmNhdDsKKyAgdXNpbmcgOjpzdHJjbXA7CisgIHVzaW5nIDo6c3RyY29sbDsKKyAgdXNpbmcgOjpzdHJjcHk7CisgIHVzaW5nIDo6c3RyY3NwbjsKKyAgdXNpbmcgOjpzdHJlcnJvcjsKKyAgdXNpbmcgOjpzdHJsZW47CisgIHVzaW5nIDo6c3RybmNhdDsKKyAgdXNpbmcgOjpzdHJuY21wOworICB1c2luZyA6OnN0cm5jcHk7CisgIHVzaW5nIDo6c3Ryc3BuOworICB1c2luZyA6OnN0cnRvazsKKyAgdXNpbmcgOjpzdHJ4ZnJtOworICB1c2luZyA6OnN0cmNocjsKKyAgdXNpbmcgOjpzdHJwYnJrOworICB1c2luZyA6OnN0cnJjaHI7CisgIHVzaW5nIDo6c3Ryc3RyOworCisjaWZuZGVmIF9fQ09SUkVDVF9JU09fQ1BQX1NUUklOR19IX1BST1RPCisgIGlubGluZSB2b2lkKgorICBtZW1jaHIodm9pZCogX19zLCBpbnQgX19jLCBzaXplX3QgX19uKQorICB7IHJldHVybiBfX2J1aWx0aW5fbWVtY2hyKF9fcywgX19jLCBfX24pOyB9CisKKyAgaW5saW5lIGNoYXIqCisgIHN0cmNocihjaGFyKiBfX3MsIGludCBfX24pCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9zdHJjaHIoX19zLCBfX24pOyB9CisKKyAgaW5saW5lIGNoYXIqCisgIHN0cnBicmsoY2hhciogX19zMSwgY29uc3QgY2hhciogX19zMikKKyAgeyByZXR1cm4gX19idWlsdGluX3N0cnBicmsoX19zMSwgX19zMik7IH0KKworICBpbmxpbmUgY2hhcioKKyAgc3RycmNocihjaGFyKiBfX3MsIGludCBfX24pCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9zdHJyY2hyKF9fcywgX19uKTsgfQorCisgIGlubGluZSBjaGFyKgorICBzdHJzdHIoY2hhciogX19zMSwgY29uc3QgY2hhciogX19zMikKKyAgeyByZXR1cm4gX19idWlsdGluX3N0cnN0cihfX3MxLCBfX3MyKTsgfQorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2N0Z21hdGggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2N0Z21hdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5OTliZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3RnbWF0aApAQCAtMCwwICsxLDQxIEBACisvLyA8Y3RnbWF0aD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY3RnbWF0aAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWZuZGVmIF9HTElCQ1hYX0NUR01BVEgKKyNkZWZpbmUgX0dMSUJDWFhfQ1RHTUFUSCAxCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKyMgIGluY2x1ZGUgPGNtYXRoPgorI2VuZGlmCisKKyNlbmRpZiAKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jdGltZSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3RpbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlMDQwZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3RpbWUKQEAgLTAsMCArMSw3NSBAQAorLy8gLSotIEMrKyAtKi0gZm9yd2FyZGluZyBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2N0aW1lCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgdGltZS5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjAuNSAgRGF0ZSBhbmQgdGltZQorLy8KKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZm5kZWYgX0dMSUJDWFhfQ1RJTUUKKyNkZWZpbmUgX0dMSUJDWFhfQ1RJTUUgMQorCisvLyBHZXQgcmlkIG9mIHRob3NlIG1hY3JvcyBkZWZpbmVkIGluIDx0aW1lLmg+IGluIGxpZXUgb2YgcmVhbCBmdW5jdGlvbnMuCisjdW5kZWYgY2xvY2sKKyN1bmRlZiBkaWZmdGltZQorI3VuZGVmIG1rdGltZQorI3VuZGVmIHRpbWUKKyN1bmRlZiBhc2N0aW1lCisjdW5kZWYgY3RpbWUKKyN1bmRlZiBnbXRpbWUKKyN1bmRlZiBsb2NhbHRpbWUKKyN1bmRlZiBzdHJmdGltZQorCituYW1lc3BhY2Ugc3RkCit7CisgIHVzaW5nIDo6Y2xvY2tfdDsKKyAgdXNpbmcgOjp0aW1lX3Q7CisgIHVzaW5nIDo6dG07CisKKyAgdXNpbmcgOjpjbG9jazsKKyAgdXNpbmcgOjpkaWZmdGltZTsKKyAgdXNpbmcgOjpta3RpbWU7CisgIHVzaW5nIDo6dGltZTsKKyAgdXNpbmcgOjphc2N0aW1lOworICB1c2luZyA6OmN0aW1lOworICB1c2luZyA6OmdtdGltZTsKKyAgdXNpbmcgOjpsb2NhbHRpbWU7CisgIHVzaW5nIDo6c3RyZnRpbWU7Cit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3djaGFyIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jd2NoYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiYjY4ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3djaGFyCkBAIC0wLDAgKzEsMzAzIEBACisvLyAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY3djaGFyCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgd2NoYXIuaCwKKyAqICBhbmQgaXRzIGNvbnRlbnRzIGFyZSAobW9zdGx5KSB0aGUgc2FtZSBhcyB0aGF0IGhlYWRlciwgYnV0IGFyZSBhbGwKKyAqICBjb250YWluZWQgaW4gdGhlIG5hbWVzcGFjZSBAYyBzdGQgKGV4Y2VwdCBmb3IgbmFtZXMgd2hpY2ggYXJlIGRlZmluZWQKKyAqICBhcyBtYWNyb3MgaW4gQykuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIxLjQKKy8vCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKKyNpZiBfR0xJQkNYWF9IQVZFX1dDSEFSX0gKKyNpbmNsdWRlIDx3Y2hhci5oPgorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfQ1dDSEFSCisjZGVmaW5lIF9HTElCQ1hYX0NXQ0hBUiAxCisKKy8vIE5lZWQgdG8gZG8gYSBiaXQgb2YgdHJpY2tlcnkgaGVyZSB3aXRoIG1ic3RhdGVfdCBhcyBjaGFyX3RyYWl0cworLy8gYXNzdW1lcyBpdCBpcyBpbiB3Y2hhci5oLCByZWdhcmRsZXNzIG9mIHdjaGFyX3Qgc3BlY2lhbGl6YXRpb25zLgorI2lmbmRlZiBfR0xJQkNYWF9IQVZFX01CU1RBVEVfVAorZXh0ZXJuICJDIgoreworICB0eXBlZGVmIHN0cnVjdAorICB7CisgICAgaW50IF9fZmlsbFs2XTsKKyAgfSBtYnN0YXRlX3Q7Cit9CisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZAoreworICB1c2luZyA6Om1ic3RhdGVfdDsKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisvLyBHZXQgcmlkIG9mIHRob3NlIG1hY3JvcyBkZWZpbmVkIGluIDx3Y2hhci5oPiBpbiBsaWV1IG9mIHJlYWwgZnVuY3Rpb25zLgorI3VuZGVmIGJ0b3djCisjdW5kZWYgZmdldHdjCisjdW5kZWYgZmdldHdzCisjdW5kZWYgZnB1dHdjCisjdW5kZWYgZnB1dHdzCisjdW5kZWYgZndpZGUKKyN1bmRlZiBmd3ByaW50ZgorI3VuZGVmIGZ3c2NhbmYKKyN1bmRlZiBnZXR3YworI3VuZGVmIGdldHdjaGFyCisjdW5kZWYgbWJybGVuCisjdW5kZWYgbWJydG93YworI3VuZGVmIG1ic2luaXQKKyN1bmRlZiBtYnNydG93Y3MKKyN1bmRlZiBwdXR3YworI3VuZGVmIHB1dHdjaGFyCisjdW5kZWYgc3dwcmludGYKKyN1bmRlZiBzd3NjYW5mCisjdW5kZWYgdW5nZXR3YworI3VuZGVmIHZmd3ByaW50ZgorI2lmIF9HTElCQ1hYX0hBVkVfVkZXU0NBTkYKKyMgdW5kZWYgdmZ3c2NhbmYKKyNlbmRpZgorI3VuZGVmIHZzd3ByaW50ZgorI2lmIF9HTElCQ1hYX0hBVkVfVlNXU0NBTkYKKyMgdW5kZWYgdnN3c2NhbmYKKyNlbmRpZgorI3VuZGVmIHZ3cHJpbnRmCisjaWYgX0dMSUJDWFhfSEFWRV9WV1NDQU5GCisjIHVuZGVmIHZ3c2NhbmYKKyNlbmRpZgorI3VuZGVmIHdjcnRvbWIKKyN1bmRlZiB3Y3NjYXQKKyN1bmRlZiB3Y3NjaHIKKyN1bmRlZiB3Y3NjbXAKKyN1bmRlZiB3Y3Njb2xsCisjdW5kZWYgd2NzY3B5CisjdW5kZWYgd2NzY3NwbgorI3VuZGVmIHdjc2Z0aW1lCisjdW5kZWYgd2NzbGVuCisjdW5kZWYgd2NzbmNhdAorI3VuZGVmIHdjc25jbXAKKyN1bmRlZiB3Y3NuY3B5CisjdW5kZWYgd2NzcGJyaworI3VuZGVmIHdjc3JjaHIKKyN1bmRlZiB3Y3NydG9tYnMKKyN1bmRlZiB3Y3NzcG4KKyN1bmRlZiB3Y3NzdHIKKyN1bmRlZiB3Y3N0b2QKKyNpZiBfR0xJQkNYWF9IQVZFX1dDU1RPRgorIyB1bmRlZiB3Y3N0b2YKKyNlbmRpZgorI3VuZGVmIHdjc3RvaworI3VuZGVmIHdjc3RvbAorI3VuZGVmIHdjc3RvdWwKKyN1bmRlZiB3Y3N4ZnJtCisjdW5kZWYgd2N0b2IKKyN1bmRlZiB3bWVtY2hyCisjdW5kZWYgd21lbWNtcAorI3VuZGVmIHdtZW1jcHkKKyN1bmRlZiB3bWVtbW92ZQorI3VuZGVmIHdtZW1zZXQKKyN1bmRlZiB3cHJpbnRmCisjdW5kZWYgd3NjYW5mCisKKyNpZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgOjp3aW50X3Q7CisKKyAgdXNpbmcgOjpidG93YzsKKyAgdXNpbmcgOjpmZ2V0d2M7CisgIHVzaW5nIDo6ZmdldHdzOworICB1c2luZyA6OmZwdXR3YzsKKyAgdXNpbmcgOjpmcHV0d3M7CisgIHVzaW5nIDo6ZndpZGU7CisgIHVzaW5nIDo6ZndwcmludGY7CisgIHVzaW5nIDo6ZndzY2FuZjsKKyAgdXNpbmcgOjpnZXR3YzsKKyAgdXNpbmcgOjpnZXR3Y2hhcjsKKyAgdXNpbmcgOjptYnJsZW47CisgIHVzaW5nIDo6bWJydG93YzsKKyAgdXNpbmcgOjptYnNpbml0OworICB1c2luZyA6Om1ic3J0b3djczsKKyAgdXNpbmcgOjpwdXR3YzsKKyAgdXNpbmcgOjpwdXR3Y2hhcjsKKyNpZm5kZWYgX0dMSUJDWFhfSEFWRV9CUk9LRU5fVlNXUFJJTlRGCisgIHVzaW5nIDo6c3dwcmludGY7CisjZW5kaWYKKyAgdXNpbmcgOjpzd3NjYW5mOworICB1c2luZyA6OnVuZ2V0d2M7CisgIHVzaW5nIDo6dmZ3cHJpbnRmOworI2lmIF9HTElCQ1hYX0hBVkVfVkZXU0NBTkYKKyAgdXNpbmcgOjp2ZndzY2FuZjsKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9IQVZFX0JST0tFTl9WU1dQUklOVEYKKyAgdXNpbmcgOjp2c3dwcmludGY7CisjZW5kaWYKKyNpZiBfR0xJQkNYWF9IQVZFX1ZTV1NDQU5GCisgIHVzaW5nIDo6dnN3c2NhbmY7CisjZW5kaWYKKyAgdXNpbmcgOjp2d3ByaW50ZjsKKyNpZiBfR0xJQkNYWF9IQVZFX1ZXU0NBTkYKKyAgdXNpbmcgOjp2d3NjYW5mOworI2VuZGlmCisgIHVzaW5nIDo6d2NydG9tYjsKKyAgdXNpbmcgOjp3Y3NjYXQ7CisgIHVzaW5nIDo6d2NzY21wOworICB1c2luZyA6Ondjc2NvbGw7CisgIHVzaW5nIDo6d2NzY3B5OworICB1c2luZyA6Ondjc2NzcG47CisgIHVzaW5nIDo6d2NzZnRpbWU7CisgIHVzaW5nIDo6d2NzbGVuOworICB1c2luZyA6Ondjc25jYXQ7CisgIHVzaW5nIDo6d2NzbmNtcDsKKyAgdXNpbmcgOjp3Y3NuY3B5OworICB1c2luZyA6Ondjc3J0b21iczsKKyAgdXNpbmcgOjp3Y3NzcG47CisgIHVzaW5nIDo6d2NzdG9kOworI2lmIF9HTElCQ1hYX0hBVkVfV0NTVE9GCisgIHVzaW5nIDo6d2NzdG9mOworI2VuZGlmCisgIHVzaW5nIDo6d2NzdG9rOworICB1c2luZyA6Ondjc3RvbDsKKyAgdXNpbmcgOjp3Y3N0b3VsOworICB1c2luZyA6Ondjc3hmcm07CisgIHVzaW5nIDo6d2N0b2I7CisgIHVzaW5nIDo6d21lbWNtcDsKKyAgdXNpbmcgOjp3bWVtY3B5OworICB1c2luZyA6OndtZW1tb3ZlOworICB1c2luZyA6OndtZW1zZXQ7CisgIHVzaW5nIDo6d3ByaW50ZjsKKyAgdXNpbmcgOjp3c2NhbmY7CisgIHVzaW5nIDo6d2NzY2hyOworICB1c2luZyA6Ondjc3Bicms7CisgIHVzaW5nIDo6d2NzcmNocjsKKyAgdXNpbmcgOjp3Y3NzdHI7CisgIHVzaW5nIDo6d21lbWNocjsKKworI2lmbmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9XQ0hBUl9IX1BST1RPCisgIGlubGluZSB3Y2hhcl90KgorICB3Y3NjaHIod2NoYXJfdCogX19wLCB3Y2hhcl90IF9fYykKKyAgeyByZXR1cm4gd2NzY2hyKGNvbnN0X2Nhc3Q8Y29uc3Qgd2NoYXJfdCo+KF9fcCksIF9fYyk7IH0KKworICBpbmxpbmUgd2NoYXJfdCoKKyAgd2NzcGJyayh3Y2hhcl90KiBfX3MxLCBjb25zdCB3Y2hhcl90KiBfX3MyKQorICB7IHJldHVybiB3Y3NwYnJrKGNvbnN0X2Nhc3Q8Y29uc3Qgd2NoYXJfdCo+KF9fczEpLCBfX3MyKTsgfQorCisgIGlubGluZSB3Y2hhcl90KgorICB3Y3NyY2hyKHdjaGFyX3QqIF9fcCwgd2NoYXJfdCBfX2MpCisgIHsgcmV0dXJuIHdjc3JjaHIoY29uc3RfY2FzdDxjb25zdCB3Y2hhcl90Kj4oX19wKSwgX19jKTsgfQorCisgIGlubGluZSB3Y2hhcl90KgorICB3Y3NzdHIod2NoYXJfdCogX19zMSwgY29uc3Qgd2NoYXJfdCogX19zMikKKyAgeyByZXR1cm4gd2Nzc3RyKGNvbnN0X2Nhc3Q8Y29uc3Qgd2NoYXJfdCo+KF9fczEpLCBfX3MyKTsgfQorCisgIGlubGluZSB3Y2hhcl90KgorICB3bWVtY2hyKHdjaGFyX3QqIF9fcCwgd2NoYXJfdCBfX2MsIHNpemVfdCBfX24pCisgIHsgcmV0dXJuIHdtZW1jaHIoY29uc3RfY2FzdDxjb25zdCB3Y2hhcl90Kj4oX19wKSwgX19jLCBfX24pOyB9CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OQorCisjdW5kZWYgd2NzdG9sZAorI3VuZGVmIHdjc3RvbGwKKyN1bmRlZiB3Y3N0b3VsbAorCituYW1lc3BhY2UgX19nbnVfY3h4Cit7CisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DSEVDSyB8fCBfR0xJQkNYWF9VU0VfQzk5X0RZTkFNSUMKKyAgZXh0ZXJuICJDIiBsb25nIGRvdWJsZQorICAgICh3Y3N0b2xkKShjb25zdCB3Y2hhcl90ICogX19yZXN0cmljdCwgd2NoYXJfdCAqKiBfX3Jlc3RyaWN0KSB0aHJvdyAoKTsKKyNlbmRpZgorI2lmICFfR0xJQkNYWF9VU0VfQzk5X0RZTkFNSUMKKyAgdXNpbmcgOjp3Y3N0b2xkOworI2VuZGlmCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9MT05HX0xPTkdfQ0hFQ0sgfHwgX0dMSUJDWFhfVVNFX0M5OV9MT05HX0xPTkdfRFlOQU1JQworICBleHRlcm4gIkMiIGxvbmcgbG9uZyBpbnQKKyAgICAod2NzdG9sbCkoY29uc3Qgd2NoYXJfdCAqIF9fcmVzdHJpY3QsIHdjaGFyX3QgKiogX19yZXN0cmljdCwgaW50KSB0aHJvdyAoKTsKKyAgZXh0ZXJuICJDIiB1bnNpZ25lZCBsb25nIGxvbmcgaW50CisgICAgKHdjc3RvdWxsKShjb25zdCB3Y2hhcl90ICogX19yZXN0cmljdCwgd2NoYXJfdCAqKiBfX3Jlc3RyaWN0LCBpbnQpIHRocm93ICgpOworI2VuZGlmCisjaWYgIV9HTElCQ1hYX1VTRV9DOTlfTE9OR19MT05HX0RZTkFNSUMKKyAgdXNpbmcgOjp3Y3N0b2xsOworICB1c2luZyA6Ondjc3RvdWxsOworI2VuZGlmCit9IC8vIG5hbWVzcGFjZSBfX2dudV9jeHgKKworbmFtZXNwYWNlIHN0ZAoreworICB1c2luZyA6Ol9fZ251X2N4eDo6d2NzdG9sZDsKKyAgdXNpbmcgOjpfX2dudV9jeHg6Ondjc3RvbGw7CisgIHVzaW5nIDo6X19nbnVfY3h4Ojp3Y3N0b3VsbDsKK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgorCisjZW5kaWYgLy9fR0xJQkNYWF9VU0VfV0NIQVJfVAorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKworbmFtZXNwYWNlIHN0ZAoreworI2lmIF9HTElCQ1hYX0hBVkVfV0NTVE9GCisgIHVzaW5nIHN0ZDo6d2NzdG9mOworI2VuZGlmCisjaWYgX0dMSUJDWFhfSEFWRV9WRldTQ0FORgorICB1c2luZyBzdGQ6OnZmd3NjYW5mOworI2VuZGlmCisjaWYgX0dMSUJDWFhfSEFWRV9WU1dTQ0FORgorICB1c2luZyBzdGQ6OnZzd3NjYW5mOworI2VuZGlmCisjaWYgX0dMSUJDWFhfSEFWRV9WV1NDQU5GCisgIHVzaW5nIHN0ZDo6dndzY2FuZjsKKyNlbmRpZgorCisjaWYgX0dMSUJDWFhfVVNFX0M5OQorICB1c2luZyBzdGQ6Ondjc3RvbGQ7CisgIHVzaW5nIHN0ZDo6d2NzdG9sbDsKKyAgdXNpbmcgc3RkOjp3Y3N0b3VsbDsKKyNlbmRpZgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3djdHlwZSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3djdHlwZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTQ1N2M5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9jd2N0eXBlCkBAIC0wLDAgKzEsMTEwIEBACisvLyAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY3djdHlwZQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBmaWxlLiAgWW91IHNob3VsZCBAYyBcI2luY2x1ZGUgdGhpcyBmaWxlCisgKiAgaW4geW91ciBwcm9ncmFtcywgcmF0aGVyIHRoYW4gYW55IG9mIHRoZSBAYSAqLmggaW1wbGVtZW50YXRpb24gZmlsZXMuCisgKgorICogIFRoaXMgaXMgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoZSBTdGFuZGFyZCBDIExpYnJhcnkgaGVhZGVyIEBjIHdjdHlwZS5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogPGN3Y3R5cGU+CisvLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCisjaWYgX0dMSUJDWFhfSEFWRV9XQ1RZUEVfSAorCisjaWYgX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fIDwgMTAKKy8vIFdvcmsgYXJvdW5kIGdsaWJjIEJaIDk2OTQKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8d2N0eXBlLmg+CisjZW5kaWYgLy8gX0dMSUJDWFhfSEFWRV9XQ1RZUEVfSAorCisjaWZuZGVmIF9HTElCQ1hYX0NXQ1RZUEUKKyNkZWZpbmUgX0dMSUJDWFhfQ1dDVFlQRSAxCisKKy8vIEdldCByaWQgb2YgdGhvc2UgbWFjcm9zIGRlZmluZWQgaW4gPHdjdHlwZS5oPiBpbiBsaWV1IG9mIHJlYWwgZnVuY3Rpb25zLgorI3VuZGVmIGlzd2FsbnVtCisjdW5kZWYgaXN3YWxwaGEKKyNpZiBfR0xJQkNYWF9IQVZFX0lTV0JMQU5LCisjIHVuZGVmIGlzd2JsYW5rCisjZW5kaWYKKyN1bmRlZiBpc3djbnRybAorI3VuZGVmIGlzd2N0eXBlCisjdW5kZWYgaXN3ZGlnaXQKKyN1bmRlZiBpc3dncmFwaAorI3VuZGVmIGlzd2xvd2VyCisjdW5kZWYgaXN3cHJpbnQKKyN1bmRlZiBpc3dwdW5jdAorI3VuZGVmIGlzd3NwYWNlCisjdW5kZWYgaXN3dXBwZXIKKyN1bmRlZiBpc3d4ZGlnaXQKKyN1bmRlZiB0b3djdHJhbnMKKyN1bmRlZiB0b3dsb3dlcgorI3VuZGVmIHRvd3VwcGVyCisjdW5kZWYgd2N0cmFucworI3VuZGVmIHdjdHlwZQorCisjaWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKworbmFtZXNwYWNlIHN0ZAoreworICB1c2luZyA6OndjdHJhbnNfdDsKKyAgdXNpbmcgOjp3Y3R5cGVfdDsKKyAgdXNpbmcgOjp3aW50X3Q7CisKKyAgdXNpbmcgOjppc3dhbG51bTsKKyAgdXNpbmcgOjppc3dhbHBoYTsKKyNpZiBfR0xJQkNYWF9IQVZFX0lTV0JMQU5LCisgIHVzaW5nIDo6aXN3Ymxhbms7CisjZW5kaWYKKyAgdXNpbmcgOjppc3djbnRybDsKKyAgdXNpbmcgOjppc3djdHlwZTsKKyAgdXNpbmcgOjppc3dkaWdpdDsKKyAgdXNpbmcgOjppc3dncmFwaDsKKyAgdXNpbmcgOjppc3dsb3dlcjsKKyAgdXNpbmcgOjppc3dwcmludDsKKyAgdXNpbmcgOjppc3dwdW5jdDsKKyAgdXNpbmcgOjppc3dzcGFjZTsKKyAgdXNpbmcgOjppc3d1cHBlcjsKKyAgdXNpbmcgOjppc3d4ZGlnaXQ7CisgIHVzaW5nIDo6dG93Y3RyYW5zOworICB1c2luZyA6OnRvd2xvd2VyOworICB1c2luZyA6OnRvd3VwcGVyOworICB1c2luZyA6OndjdHJhbnM7CisgIHVzaW5nIDo6d2N0eXBlOworfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vX0dMSUJDWFhfVVNFX1dDSEFSX1QKKworI2VuZGlmIC8vIF9HTElCQ1hYX0NXQ1RZUEUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvY3h4YWJpLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2N4eGFiaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MzAxYzAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2N4eGFiaS5oCkBAIC0wLDAgKzEsNzAwIEBACisvLyBBQkkgU3VwcG9ydCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisvLworLy8gR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisvLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIFdyaXR0ZW4gYnkgTmF0aGFuIFNpZHdlbGwsIENvZGVzb3VyY2VyeSBMTEMsIDxuYXRoYW5AY29kZXNvdXJjZXJ5LmNvbT4KKworLyogVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBuZXcgYWJpIGVudHJ5IHBvaW50cyBpbnRvIHRoZSBydW50aW1lLiBJdCBpcyBub3QKKyAgIG5vcm1hbGx5IG5lY2Vzc2FyeSBmb3IgdXNlciBwcm9ncmFtcyB0byBpbmNsdWRlIHRoaXMgaGVhZGVyLCBvciB1c2UgdGhlCisgICBlbnRyeSBwb2ludHMgZGlyZWN0bHkuIEhvd2V2ZXIsIHRoaXMgaGVhZGVyIGlzIGF2YWlsYWJsZSBzaG91bGQgdGhhdCBiZQorICAgbmVlZGVkLgorCisgICBTb21lIG9mIHRoZSBlbnRyeSBwb2ludHMgYXJlIGludGVuZGVkIGZvciBib3RoIEMgYW5kIEMrKywgdGh1cyB0aGlzIGhlYWRlcgorICAgaXMgaW5jbHVkYWJsZSBmcm9tIGJvdGggQyBhbmQgQysrLiBUaG91Z2ggdGhlIEMrKyBzcGVjaWZpYyBwYXJ0cyBhcmUgbm90CisgICBhdmFpbGFibGUgaW4gQywgbmF0dXJhbGx5IGVub3VnaC4gICovCisKKy8qKiBAZmlsZSBjeHhhYmkuaAorICogIFRoZSBoZWFkZXIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHRoZSBDKysgQUJJLgorICovCisKKyNpZm5kZWYgX0NYWEFCSV9ICisjZGVmaW5lIF9DWFhBQklfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwdXNoKGRlZmF1bHQpCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvY3h4YWJpX3R3ZWFrcy5oPgorI2luY2x1ZGUgPGJpdHMvY3h4YWJpX2ZvcmNlZC5oPgorCisjaWZuZGVmIF9HTElCQ1hYX0NEVE9SX0NBTExBQkkKKyNkZWZpbmUgX0dMSUJDWFhfQ0RUT1JfQ0FMTEFCSQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworbmFtZXNwYWNlIF9fY3h4YWJpdjEKK3sKKyAgZXh0ZXJuICJDIgorICB7CisjZW5kaWYKKworICB0eXBlZGVmIF9fY3hhX2NkdG9yX3JldHVybl90eXBlICgqX19jeGFfY2R0b3JfdHlwZSkodm9pZCAqKTsKKworICAvLyBBbGxvY2F0ZSBhcnJheS4KKyAgdm9pZCoKKyAgX19jeGFfdmVjX25ldyhzaXplX3QgX19lbGVtZW50X2NvdW50LCBzaXplX3QgX19lbGVtZW50X3NpemUsCisJCXNpemVfdCBfX3BhZGRpbmdfc2l6ZSwgX19jeGFfY2R0b3JfdHlwZSBfX2NvbnN0cnVjdG9yLAorCQlfX2N4YV9jZHRvcl90eXBlIF9fZGVzdHJ1Y3Rvcik7CisKKyAgdm9pZCoKKyAgX19jeGFfdmVjX25ldzIoc2l6ZV90IF9fZWxlbWVudF9jb3VudCwgc2l6ZV90IF9fZWxlbWVudF9zaXplLAorCQkgc2l6ZV90IF9fcGFkZGluZ19zaXplLCBfX2N4YV9jZHRvcl90eXBlIF9fY29uc3RydWN0b3IsCisJCSBfX2N4YV9jZHRvcl90eXBlIF9fZGVzdHJ1Y3Rvciwgdm9pZCAqKCpfX2FsbG9jKSAoc2l6ZV90KSwKKwkJIHZvaWQgKCpfX2RlYWxsb2MpICh2b2lkKikpOworCisgIHZvaWQqCisgIF9fY3hhX3ZlY19uZXczKHNpemVfdCBfX2VsZW1lbnRfY291bnQsIHNpemVfdCBfX2VsZW1lbnRfc2l6ZSwKKwkJIHNpemVfdCBfX3BhZGRpbmdfc2l6ZSwgX19jeGFfY2R0b3JfdHlwZSBfX2NvbnN0cnVjdG9yLAorCQkgX19jeGFfY2R0b3JfdHlwZSBfX2Rlc3RydWN0b3IsIHZvaWQgKigqX19hbGxvYykgKHNpemVfdCksCisJCSB2b2lkICgqX19kZWFsbG9jKSAodm9pZCosIHNpemVfdCkpOworCisgIC8vIENvbnN0cnVjdCBhcnJheS4KKyAgX19jeGFfdmVjX2N0b3JfcmV0dXJuX3R5cGUKKyAgX19jeGFfdmVjX2N0b3Iodm9pZCogX19hcnJheV9hZGRyZXNzLCBzaXplX3QgX19lbGVtZW50X2NvdW50LAorCQkgc2l6ZV90IF9fZWxlbWVudF9zaXplLCBfX2N4YV9jZHRvcl90eXBlIF9fY29uc3RydWN0b3IsCisJCSBfX2N4YV9jZHRvcl90eXBlIF9fZGVzdHJ1Y3Rvcik7CisKKyAgX19jeGFfdmVjX2N0b3JfcmV0dXJuX3R5cGUKKyAgX19jeGFfdmVjX2NjdG9yKHZvaWQqIF9fZGVzdF9hcnJheSwgdm9pZCogX19zcmNfYXJyYXksCisJCSAgc2l6ZV90IF9fZWxlbWVudF9jb3VudCwgc2l6ZV90IF9fZWxlbWVudF9zaXplLAorCQkgIF9fY3hhX2NkdG9yX3JldHVybl90eXBlICgqX19jb25zdHJ1Y3RvcikgKHZvaWQqLCB2b2lkKiksCisJCSAgX19jeGFfY2R0b3JfdHlwZSBfX2Rlc3RydWN0b3IpOworCisgIC8vIERlc3RydWN0IGFycmF5LgorICB2b2lkCisgIF9fY3hhX3ZlY19kdG9yKHZvaWQqIF9fYXJyYXlfYWRkcmVzcywgc2l6ZV90IF9fZWxlbWVudF9jb3VudCwKKwkJIHNpemVfdCBfX2VsZW1lbnRfc2l6ZSwgX19jeGFfY2R0b3JfdHlwZSBfX2Rlc3RydWN0b3IpOworCisgIHZvaWQKKyAgX19jeGFfdmVjX2NsZWFudXAodm9pZCogX19hcnJheV9hZGRyZXNzLCBzaXplX3QgX19lbGVtZW50X2NvdW50LCBzaXplX3QgX19zLAorCQkgICAgX19jeGFfY2R0b3JfdHlwZSBfX2Rlc3RydWN0b3IpIF9HTElCQ1hYX05PVEhST1c7CisKKyAgLy8gRGVzdHJ1Y3QgYW5kIHJlbGVhc2UgYXJyYXkuCisgIHZvaWQKKyAgX19jeGFfdmVjX2RlbGV0ZSh2b2lkKiBfX2FycmF5X2FkZHJlc3MsIHNpemVfdCBfX2VsZW1lbnRfc2l6ZSwKKwkJICAgc2l6ZV90IF9fcGFkZGluZ19zaXplLCBfX2N4YV9jZHRvcl90eXBlIF9fZGVzdHJ1Y3Rvcik7CisKKyAgdm9pZAorICBfX2N4YV92ZWNfZGVsZXRlMih2b2lkKiBfX2FycmF5X2FkZHJlc3MsIHNpemVfdCBfX2VsZW1lbnRfc2l6ZSwKKwkJICAgIHNpemVfdCBfX3BhZGRpbmdfc2l6ZSwgX19jeGFfY2R0b3JfdHlwZSBfX2Rlc3RydWN0b3IsCisJCSAgICB2b2lkICgqX19kZWFsbG9jKSAodm9pZCopKTsKKworICB2b2lkCisgIF9fY3hhX3ZlY19kZWxldGUzKHZvaWQqIF9fYXJyYXlfYWRkcmVzcywgc2l6ZV90IF9fZWxlbWVudF9zaXplLAorCQkgICAgc2l6ZV90IF9fcGFkZGluZ19zaXplLCBfX2N4YV9jZHRvcl90eXBlIF9fZGVzdHJ1Y3RvciwKKwkJICAgIHZvaWQgKCpfX2RlYWxsb2MpICh2b2lkKiwgc2l6ZV90KSk7CisKKyAgaW50CisgIF9fY3hhX2d1YXJkX2FjcXVpcmUoX19ndWFyZCopOworCisgIHZvaWQKKyAgX19jeGFfZ3VhcmRfcmVsZWFzZShfX2d1YXJkKikgX0dMSUJDWFhfTk9USFJPVzsKKworICB2b2lkCisgIF9fY3hhX2d1YXJkX2Fib3J0KF9fZ3VhcmQqKSBfR0xJQkNYWF9OT1RIUk9XOworCisgIC8vIERTTyBkZXN0cnVjdGlvbi4KKyAgaW50CisgIF9fY3hhX2F0ZXhpdCh2b2lkICgqKSh2b2lkKiksIHZvaWQqLCB2b2lkKikgX0dMSUJDWFhfTk9USFJPVzsKKworICBpbnQKKyAgX19jeGFfZmluYWxpemUodm9pZCopOworCisgIC8vIFRMUyBkZXN0cnVjdGlvbi4KKyAgaW50CisgIF9fY3hhX3RocmVhZF9hdGV4aXQodm9pZCAoKikodm9pZCopLCB2b2lkKiwgdm9pZCAqKSBfR0xJQkNYWF9OT1RIUk9XOworCisgIC8vIFB1cmUgdmlydHVhbCBmdW5jdGlvbnMuCisgIHZvaWQKKyAgX19jeGFfcHVyZV92aXJ0dWFsKHZvaWQpIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKworICB2b2lkCisgIF9fY3hhX2RlbGV0ZWRfdmlydHVhbCh2b2lkKSBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CisKKyAgLy8gRXhjZXB0aW9uIGhhbmRsaW5nIGF1eGlsbGFyeS4KKyAgdm9pZCAKKyAgX19jeGFfYmFkX2Nhc3QoKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworICB2b2lkIAorICBfX2N4YV9iYWRfdHlwZWlkKCkgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKKworICAvKioKKyAgICogIEBicmllZiBEZW1hbmdsaW5nIHJvdXRpbmUuCisgICAqICBBQkktbWFuZGF0ZWQgZW50cnkgcG9pbnQgaW4gdGhlIEMrKyBydW50aW1lIGxpYnJhcnkgZm9yIGRlbWFuZ2xpbmcuCisgICAqCisgICAqICBAcGFyYW0gX19tYW5nbGVkX25hbWUgQSBOVUwtdGVybWluYXRlZCBjaGFyYWN0ZXIgc3RyaW5nCisgICAqICBjb250YWluaW5nIHRoZSBuYW1lIHRvIGJlIGRlbWFuZ2xlZC4KKyAgICoKKyAgICogIEBwYXJhbSBfX291dHB1dF9idWZmZXIgQSByZWdpb24gb2YgbWVtb3J5LCBhbGxvY2F0ZWQgd2l0aAorICAgKiAgbWFsbG9jLCBvZiBAYSAqX19sZW5ndGggYnl0ZXMsIGludG8gd2hpY2ggdGhlIGRlbWFuZ2xlZCBuYW1lIGlzCisgICAqICBzdG9yZWQuICBJZiBAYSBfX291dHB1dF9idWZmZXIgaXMgbm90IGxvbmcgZW5vdWdoLCBpdCBpcworICAgKiAgZXhwYW5kZWQgdXNpbmcgcmVhbGxvYy4gIEBhIF9fb3V0cHV0X2J1ZmZlciBtYXkgaW5zdGVhZCBiZSBOVUxMOworICAgKiAgaW4gdGhhdCBjYXNlLCB0aGUgZGVtYW5nbGVkIG5hbWUgaXMgcGxhY2VkIGluIGEgcmVnaW9uIG9mIG1lbW9yeQorICAgKiAgYWxsb2NhdGVkIHdpdGggbWFsbG9jLgorICAgKgorICAgKiAgQHBhcmFtIF9fbGVuZ3RoIElmIEBhIF9fbGVuZ3RoIGlzIG5vbi1OVUxMLCB0aGUgbGVuZ3RoIG9mIHRoZQorICAgKiAgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRlbWFuZ2xlZCBuYW1lIGlzIHBsYWNlZCBpbiBAYSAqX19sZW5ndGguCisgICAqCisgICAqICBAcGFyYW0gX19zdGF0dXMgQGEgKl9fc3RhdHVzIGlzIHNldCB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICAqICAgMDogVGhlIGRlbWFuZ2xpbmcgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KKyAgICogIC0xOiBBIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgb2NjdXJyZWQuCisgICAqICAtMjogQGEgbWFuZ2xlZF9uYW1lIGlzIG5vdCBhIHZhbGlkIG5hbWUgdW5kZXIgdGhlIEMrKyBBQkkgbWFuZ2xpbmcgcnVsZXMuCisgICAqICAtMzogT25lIG9mIHRoZSBhcmd1bWVudHMgaXMgaW52YWxpZC4KKyAgICoKKyAgICogIEByZXR1cm4gQSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgTlVMLXRlcm1pbmF0ZWQgZGVtYW5nbGVkCisgICAqICBuYW1lLCBvciBOVUxMIGlmIHRoZSBkZW1hbmdsaW5nIGZhaWxzLiAgVGhlIGNhbGxlciBpcworICAgKiAgcmVzcG9uc2libGUgZm9yIGRlYWxsb2NhdGluZyB0aGlzIG1lbW9yeSB1c2luZyBAYyBmcmVlLgorICAgKgorICAgKiAgVGhlIGRlbWFuZ2xpbmcgaXMgcGVyZm9ybWVkIHVzaW5nIHRoZSBDKysgQUJJIG1hbmdsaW5nIHJ1bGVzLAorICAgKiAgd2l0aCBHTlUgZXh0ZW5zaW9ucy4gRm9yIGV4YW1wbGUsIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbgorICAgKiAgX19nbnVfY3h4OjpfX3ZlcmJvc2VfdGVybWluYXRlX2hhbmRsZXIuCisgICAqCisgICAqICBTZWUgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQxMmNoMzkuaHRtbAorICAgKiAgZm9yIG90aGVyIGV4YW1wbGVzIG9mIHVzZS4KKyAgICoKKyAgICogIEBub3RlIFRoZSBzYW1lIGRlbWFuZ2xpbmcgZnVuY3Rpb25hbGl0eSBpcyBhdmFpbGFibGUgdmlhCisgICAqICBsaWJpYmVydHkgKEBjIDxsaWJpYmVydHkvZGVtYW5nbGUuaD4gYW5kIEBjIGxpYmliZXJ0eS5hKSBpbiBHQ0MKKyAgICogIDMuMSBhbmQgbGF0ZXIsIGJ1dCB0aGF0IHJlcXVpcmVzIGV4cGxpY2l0IGluc3RhbGxhdGlvbiAoQGMKKyAgICogIC0tZW5hYmxlLWluc3RhbGwtbGliaWJlcnR5KSBhbmQgdXNlcyBhIGRpZmZlcmVudCBBUEksIGFsdGhvdWdoCisgICAqICB0aGUgQUJJIGlzIHVuY2hhbmdlZC4KKyAgICovCisgIGNoYXIqCisgIF9fY3hhX2RlbWFuZ2xlKGNvbnN0IGNoYXIqIF9fbWFuZ2xlZF9uYW1lLCBjaGFyKiBfX291dHB1dF9idWZmZXIsCisJCSBzaXplX3QqIF9fbGVuZ3RoLCBpbnQqIF9fc3RhdHVzKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIH0KK30gLy8gbmFtZXNwYWNlIF9fY3h4YWJpdjEKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKKworI2luY2x1ZGUgPHR5cGVpbmZvPgorCituYW1lc3BhY2UgX19jeHhhYml2MQoreworICAvLyBUeXBlIGluZm9ybWF0aW9uIGZvciBpbnQsIGZsb2F0IGV0Yy4KKyAgY2xhc3MgX19mdW5kYW1lbnRhbF90eXBlX2luZm8gOiBwdWJsaWMgc3RkOjp0eXBlX2luZm8KKyAgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQKKyAgICBfX2Z1bmRhbWVudGFsX3R5cGVfaW5mbyhjb25zdCBjaGFyKiBfX24pIDogc3RkOjp0eXBlX2luZm8oX19uKSB7IH0KKworICAgIHZpcnR1YWwKKyAgICB+X19mdW5kYW1lbnRhbF90eXBlX2luZm8oKTsKKyAgfTsKKworICAvLyBUeXBlIGluZm9ybWF0aW9uIGZvciBhcnJheSBvYmplY3RzLgorICBjbGFzcyBfX2FycmF5X3R5cGVfaW5mbyA6IHB1YmxpYyBzdGQ6OnR5cGVfaW5mbworICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdAorICAgIF9fYXJyYXlfdHlwZV9pbmZvKGNvbnN0IGNoYXIqIF9fbikgOiBzdGQ6OnR5cGVfaW5mbyhfX24pIHsgfQorCisgICAgdmlydHVhbAorICAgIH5fX2FycmF5X3R5cGVfaW5mbygpOworICB9OworCisgIC8vIFR5cGUgaW5mb3JtYXRpb24gZm9yIGZ1bmN0aW9ucyAoYm90aCBtZW1iZXIgYW5kIG5vbi1tZW1iZXIpLgorICBjbGFzcyBfX2Z1bmN0aW9uX3R5cGVfaW5mbyA6IHB1YmxpYyBzdGQ6OnR5cGVfaW5mbworICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdAorICAgIF9fZnVuY3Rpb25fdHlwZV9pbmZvKGNvbnN0IGNoYXIqIF9fbikgOiBzdGQ6OnR5cGVfaW5mbyhfX24pIHsgfQorCisgICAgdmlydHVhbAorICAgIH5fX2Z1bmN0aW9uX3R5cGVfaW5mbygpOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBkZWZpbmVkIG1lbWJlciBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIGJvb2wKKyAgICBfX2lzX2Z1bmN0aW9uX3AoKSBjb25zdDsKKyAgfTsKKworICAvLyBUeXBlIGluZm9ybWF0aW9uIGZvciBlbnVtZXJhdGlvbnMuCisgIGNsYXNzIF9fZW51bV90eXBlX2luZm8gOiBwdWJsaWMgc3RkOjp0eXBlX2luZm8KKyAgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQKKyAgICBfX2VudW1fdHlwZV9pbmZvKGNvbnN0IGNoYXIqIF9fbikgOiBzdGQ6OnR5cGVfaW5mbyhfX24pIHsgfQorCisgICAgdmlydHVhbAorICAgIH5fX2VudW1fdHlwZV9pbmZvKCk7CisgIH07CisKKyAgLy8gQ29tbW9uIHR5cGUgaW5mb3JtYXRpb24gZm9yIHNpbXBsZSBwb2ludGVycyBhbmQgcG9pbnRlcnMgdG8gbWVtYmVyLgorICBjbGFzcyBfX3BiYXNlX3R5cGVfaW5mbyA6IHB1YmxpYyBzdGQ6OnR5cGVfaW5mbworICB7CisgIHB1YmxpYzoKKyAgICB1bnNpZ25lZCBpbnQgCQlfX2ZsYWdzOyAvLyBRdWFsaWZpY2F0aW9uIG9mIHRoZSB0YXJnZXQgb2JqZWN0LgorICAgIGNvbnN0IHN0ZDo6dHlwZV9pbmZvKiAJX19wb2ludGVlOyAvLyBUeXBlIG9mIHBvaW50ZWQgdG8gb2JqZWN0LgorCisgICAgZXhwbGljaXQKKyAgICBfX3BiYXNlX3R5cGVfaW5mbyhjb25zdCBjaGFyKiBfX24sIGludCBfX3F1YWxzLAorCQkgICAgICBjb25zdCBzdGQ6OnR5cGVfaW5mbyogX190eXBlKQorICAgIDogc3RkOjp0eXBlX2luZm8oX19uKSwgX19mbGFncyhfX3F1YWxzKSwgX19wb2ludGVlKF9fdHlwZSkKKyAgICB7IH0KKworICAgIHZpcnR1YWwKKyAgICB+X19wYmFzZV90eXBlX2luZm8oKTsKKworICAgIC8vIEltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4KKyAgICBlbnVtIF9fbWFza3MKKyAgICAgIHsKKwlfX2NvbnN0X21hc2sgPSAweDEsCisJX192b2xhdGlsZV9tYXNrID0gMHgyLAorCV9fcmVzdHJpY3RfbWFzayA9IDB4NCwKKwlfX2luY29tcGxldGVfbWFzayA9IDB4OCwKKwlfX2luY29tcGxldGVfY2xhc3NfbWFzayA9IDB4MTAKKyAgICAgIH07CisKKyAgcHJvdGVjdGVkOgorICAgIF9fcGJhc2VfdHlwZV9pbmZvKGNvbnN0IF9fcGJhc2VfdHlwZV9pbmZvJik7CisKKyAgICBfX3BiYXNlX3R5cGVfaW5mbyYKKyAgICBvcGVyYXRvcj0oY29uc3QgX19wYmFzZV90eXBlX2luZm8mKTsKKworICAgIC8vIEltcGxlbWVudGF0aW9uIGRlZmluZWQgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgICB2aXJ0dWFsIGJvb2wKKyAgICBfX2RvX2NhdGNoKGNvbnN0IHN0ZDo6dHlwZV9pbmZvKiBfX3Rocl90eXBlLCB2b2lkKiogX190aHJfb2JqLAorCSAgICAgICB1bnNpZ25lZCBpbnQgX19vdXRlcikgY29uc3Q7CisKKyAgICBpbmxpbmUgdmlydHVhbCBib29sCisgICAgX19wb2ludGVyX2NhdGNoKGNvbnN0IF9fcGJhc2VfdHlwZV9pbmZvKiBfX3Rocl90eXBlLCB2b2lkKiogX190aHJfb2JqLAorCQkgICAgdW5zaWduZWQgX19vdXRlcikgY29uc3Q7CisgIH07CisKKyAgLy8gVHlwZSBpbmZvcm1hdGlvbiBmb3Igc2ltcGxlIHBvaW50ZXJzLgorICBjbGFzcyBfX3BvaW50ZXJfdHlwZV9pbmZvIDogcHVibGljIF9fcGJhc2VfdHlwZV9pbmZvCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0CisgICAgX19wb2ludGVyX3R5cGVfaW5mbyhjb25zdCBjaGFyKiBfX24sIGludCBfX3F1YWxzLAorCQkJY29uc3Qgc3RkOjp0eXBlX2luZm8qIF9fdHlwZSkKKyAgICA6IF9fcGJhc2VfdHlwZV9pbmZvIChfX24sIF9fcXVhbHMsIF9fdHlwZSkgeyB9CisKKworICAgIHZpcnR1YWwKKyAgICB+X19wb2ludGVyX3R5cGVfaW5mbygpOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBkZWZpbmVkIG1lbWJlciBmdW5jdGlvbnMuCisgICAgdmlydHVhbCBib29sCisgICAgX19pc19wb2ludGVyX3AoKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbAorICAgIF9fcG9pbnRlcl9jYXRjaChjb25zdCBfX3BiYXNlX3R5cGVfaW5mbyogX190aHJfdHlwZSwgdm9pZCoqIF9fdGhyX29iaiwKKwkJICAgIHVuc2lnbmVkIF9fb3V0ZXIpIGNvbnN0OworICB9OworCisgIGNsYXNzIF9fY2xhc3NfdHlwZV9pbmZvOworCisgIC8vIFR5cGUgaW5mb3JtYXRpb24gZm9yIGEgcG9pbnRlciB0byBtZW1iZXIgdmFyaWFibGUuCisgIGNsYXNzIF9fcG9pbnRlcl90b19tZW1iZXJfdHlwZV9pbmZvIDogcHVibGljIF9fcGJhc2VfdHlwZV9pbmZvCisgIHsKKyAgcHVibGljOgorICAgIF9fY2xhc3NfdHlwZV9pbmZvKiBfX2NvbnRleHQ7ICAgLy8gQ2xhc3Mgb2YgdGhlIG1lbWJlci4KKworICAgIGV4cGxpY2l0CisgICAgX19wb2ludGVyX3RvX21lbWJlcl90eXBlX2luZm8oY29uc3QgY2hhciogX19uLCBpbnQgX19xdWFscywKKwkJCQkgIGNvbnN0IHN0ZDo6dHlwZV9pbmZvKiBfX3R5cGUsCisJCQkJICBfX2NsYXNzX3R5cGVfaW5mbyogX19rbGFzcykKKyAgICA6IF9fcGJhc2VfdHlwZV9pbmZvKF9fbiwgX19xdWFscywgX190eXBlKSwgX19jb250ZXh0KF9fa2xhc3MpIHsgfQorCisgICAgdmlydHVhbAorICAgIH5fX3BvaW50ZXJfdG9fbWVtYmVyX3R5cGVfaW5mbygpOworCisgIHByb3RlY3RlZDoKKyAgICBfX3BvaW50ZXJfdG9fbWVtYmVyX3R5cGVfaW5mbyhjb25zdCBfX3BvaW50ZXJfdG9fbWVtYmVyX3R5cGVfaW5mbyYpOworCisgICAgX19wb2ludGVyX3RvX21lbWJlcl90eXBlX2luZm8mCisgICAgb3BlcmF0b3I9KGNvbnN0IF9fcG9pbnRlcl90b19tZW1iZXJfdHlwZV9pbmZvJik7CisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBkZWZpbmVkIG1lbWJlciBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIGJvb2wKKyAgICBfX3BvaW50ZXJfY2F0Y2goY29uc3QgX19wYmFzZV90eXBlX2luZm8qIF9fdGhyX3R5cGUsIHZvaWQqKiBfX3Rocl9vYmosCisJCSAgICB1bnNpZ25lZCBfX291dGVyKSBjb25zdDsKKyAgfTsKKworICAvLyBIZWxwZXIgY2xhc3MgZm9yIF9fdm1pX2NsYXNzX3R5cGUuCisgIGNsYXNzIF9fYmFzZV9jbGFzc190eXBlX2luZm8KKyAgeworICBwdWJsaWM6CisgICAgY29uc3QgX19jbGFzc190eXBlX2luZm8qIAlfX2Jhc2VfdHlwZTsgIC8vIEJhc2UgY2xhc3MgdHlwZS4KKyNpZmRlZiBfR0xJQkNYWF9MTFA2NAorICAgIGxvbmcgbG9uZwkJCV9fb2Zmc2V0X2ZsYWdzOyAgLy8gT2Zmc2V0IGFuZCBpbmZvLgorI2Vsc2UKKyAgICBsb25nIAkJCV9fb2Zmc2V0X2ZsYWdzOyAgLy8gT2Zmc2V0IGFuZCBpbmZvLgorI2VuZGlmCisKKyAgICBlbnVtIF9fb2Zmc2V0X2ZsYWdzX21hc2tzCisgICAgICB7CisJX192aXJ0dWFsX21hc2sgPSAweDEsCisJX19wdWJsaWNfbWFzayA9IDB4MiwKKwlfX2h3bV9iaXQgPSAyLAorCV9fb2Zmc2V0X3NoaWZ0ID0gOCAgICAgICAgICAvLyBCaXRzIHRvIHNoaWZ0IG9mZnNldC4KKyAgICAgIH07CisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBkZWZpbmVkIG1lbWJlciBmdW5jdGlvbnMuCisgICAgYm9vbAorICAgIF9faXNfdmlydHVhbF9wKCkgY29uc3QKKyAgICB7IHJldHVybiBfX29mZnNldF9mbGFncyAmIF9fdmlydHVhbF9tYXNrOyB9CisKKyAgICBib29sCisgICAgX19pc19wdWJsaWNfcCgpIGNvbnN0CisgICAgeyByZXR1cm4gX19vZmZzZXRfZmxhZ3MgJiBfX3B1YmxpY19tYXNrOyB9CisKKyAgICBwdHJkaWZmX3QKKyAgICBfX29mZnNldCgpIGNvbnN0CisgICAgeworICAgICAgLy8gVGhpcyBzaGlmdCwgYmVpbmcgb2YgYSBzaWduZWQgdHlwZSwgaXMgaW1wbGVtZW50YXRpb24KKyAgICAgIC8vIGRlZmluZWQuIEdDQyBpbXBsZW1lbnRzIHN1Y2ggc2hpZnRzIGFzIGFyaXRobWV0aWMsIHdoaWNoIGlzCisgICAgICAvLyB3aGF0IHdlIHdhbnQuCisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8cHRyZGlmZl90PihfX29mZnNldF9mbGFncykgPj4gX19vZmZzZXRfc2hpZnQ7CisgICAgfQorICB9OworCisgIC8vIFR5cGUgaW5mb3JtYXRpb24gZm9yIGEgY2xhc3MuCisgIGNsYXNzIF9fY2xhc3NfdHlwZV9pbmZvIDogcHVibGljIHN0ZDo6dHlwZV9pbmZvCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0CisgICAgX19jbGFzc190eXBlX2luZm8gKGNvbnN0IGNoYXIgKl9fbikgOiB0eXBlX2luZm8oX19uKSB7IH0KKworICAgIHZpcnR1YWwKKyAgICB+X19jbGFzc190eXBlX2luZm8gKCk7CisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHR5cGVzLgorICAgIC8vIFRoZSB0eXBlIHN1Yl9raW5kIHRlbGxzIHVzIGFib3V0IGhvdyBhIGJhc2Ugb2JqZWN0IGlzIGNvbnRhaW5lZAorICAgIC8vIHdpdGhpbiBhIGRlcml2ZWQgb2JqZWN0LiBXZSBvZnRlbiBkbyB0aGlzIGxhemlseSwgaGVuY2UgdGhlCisgICAgLy8gVU5LTk9XTiB2YWx1ZS4gQXQgb3RoZXIgdGltZXMgd2UgbWF5IHVzZSBOT1RfQ09OVEFJTkVEIHRvIG1lYW4KKyAgICAvLyBub3QgcHVibGljbHkgY29udGFpbmVkLgorICAgIGVudW0gX19zdWJfa2luZAorICAgICAgeworCS8vIFdlIGhhdmUgbm8gaWRlYS4KKwlfX3Vua25vd24gPSAwLAorCisJLy8gTm90IGNvbnRhaW5lZCB3aXRoaW4gdXMgKGluIHNvbWUgY2lyY3Vtc3RhbmNlcyB0aGlzIG1pZ2h0CisJLy8gbWVhbiBub3QgY29udGFpbmVkIHB1YmxpY2x5KQorCV9fbm90X2NvbnRhaW5lZCwKKworCS8vIENvbnRhaW5lZCBhbWJpZ3VvdXNseS4KKwlfX2NvbnRhaW5lZF9hbWJpZywKKworCS8vIFZpYSBhIHZpcnR1YWwgcGF0aC4KKwlfX2NvbnRhaW5lZF92aXJ0dWFsX21hc2sgPSBfX2Jhc2VfY2xhc3NfdHlwZV9pbmZvOjpfX3ZpcnR1YWxfbWFzaywKKworCS8vIFZpYSBhIHB1YmxpYyBwYXRoLgorCV9fY29udGFpbmVkX3B1YmxpY19tYXNrID0gX19iYXNlX2NsYXNzX3R5cGVfaW5mbzo6X19wdWJsaWNfbWFzaywKKworCS8vIENvbnRhaW5lZCB3aXRoaW4gdXMuCisJX19jb250YWluZWRfbWFzayA9IDEgPDwgX19iYXNlX2NsYXNzX3R5cGVfaW5mbzo6X19od21fYml0LAorCisJX19jb250YWluZWRfcHJpdmF0ZSA9IF9fY29udGFpbmVkX21hc2ssCisJX19jb250YWluZWRfcHVibGljID0gX19jb250YWluZWRfbWFzayB8IF9fY29udGFpbmVkX3B1YmxpY19tYXNrCisgICAgICB9OworCisgICAgc3RydWN0IF9fdXBjYXN0X3Jlc3VsdDsKKyAgICBzdHJ1Y3QgX19keW5jYXN0X3Jlc3VsdDsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gSW1wbGVtZW50YXRpb24gZGVmaW5lZCBtZW1iZXIgZnVuY3Rpb25zLgorICAgIHZpcnR1YWwgYm9vbAorICAgIF9fZG9fdXBjYXN0KGNvbnN0IF9fY2xhc3NfdHlwZV9pbmZvKiBfX2RzdF90eXBlLCB2b2lkKipfX29ial9wdHIpIGNvbnN0OworCisgICAgdmlydHVhbCBib29sCisgICAgX19kb19jYXRjaChjb25zdCB0eXBlX2luZm8qIF9fdGhyX3R5cGUsIHZvaWQqKiBfX3Rocl9vYmosCisJICAgICAgIHVuc2lnbmVkIF9fb3V0ZXIpIGNvbnN0OworCisgIHB1YmxpYzoKKyAgICAvLyBIZWxwZXIgZm9yIHVwY2FzdC4gU2VlIGlmIERTVCBpcyB1cywgb3Igb25lIG9mIG91ciBiYXNlcy4KKyAgICAvLyBSZXR1cm4gZmFsc2UgaWYgbm90IGZvdW5kLCB0cnVlIGlmIGZvdW5kLgorICAgIHZpcnR1YWwgYm9vbAorICAgIF9fZG9fdXBjYXN0KGNvbnN0IF9fY2xhc3NfdHlwZV9pbmZvKiBfX2RzdCwgY29uc3Qgdm9pZCogX19vYmosCisJCV9fdXBjYXN0X3Jlc3VsdCYgX19yZXN0cmljdCBfX3Jlc3VsdCkgY29uc3Q7CisKKyAgICAvLyBJbmRpY2F0ZSB3aGV0aGVyIFNSQ19QVFIgb2YgdHlwZSBTUkNfVFlQRSBpcyBjb250YWluZWQgcHVibGljbHkKKyAgICAvLyB3aXRoaW4gT0JKX1BUUi4gT0JKX1BUUiBwb2ludHMgdG8gYSBiYXNlIG9iamVjdCBvZiBvdXIgdHlwZSwKKyAgICAvLyB3aGljaCBpcyB0aGUgZGVzdGluYXRpb24gdHlwZS4gU1JDMkRTVCBpbmRpY2F0ZXMgaG93IFNSQworICAgIC8vIG9iamVjdHMgbWlnaHQgYmUgY29udGFpbmVkIHdpdGhpbiB0aGlzIHR5cGUuICBJZiBTUkNfUFRSIGlzIG9uZQorICAgIC8vIG9mIG91ciBTUkNfVFlQRSBiYXNlcywgaW5kaWNhdGUgdGhlIHZpcnR1YWxpdHkuIFJldHVybnMKKyAgICAvLyBub3RfY29udGFpbmVkIGZvciBub24gY29udGFpbm1lbnQgb3IgcHJpdmF0ZSBjb250YWlubWVudC4KKyAgICBpbmxpbmUgX19zdWJfa2luZAorICAgIF9fZmluZF9wdWJsaWNfc3JjKHB0cmRpZmZfdCBfX3NyYzJkc3QsIGNvbnN0IHZvaWQqIF9fb2JqX3B0ciwKKwkJICAgICAgY29uc3QgX19jbGFzc190eXBlX2luZm8qIF9fc3JjX3R5cGUsCisJCSAgICAgIGNvbnN0IHZvaWQqIF9fc3JjX3B0cikgY29uc3Q7CisKKyAgICAvLyBIZWxwZXIgZm9yIGR5bmFtaWMgY2FzdC4gQUNDRVNTX1BBVEggZ2l2ZXMgdGhlIGFjY2VzcyBmcm9tIHRoZQorICAgIC8vIG1vc3QgZGVyaXZlZCBvYmplY3QgdG8gdGhpcyBiYXNlLiBEU1RfVFlQRSBpbmRpY2F0ZXMgdGhlCisgICAgLy8gZGVzaXJlZCB0eXBlIHdlIHdhbnQuIE9CSl9QVFIgcG9pbnRzIHRvIGEgYmFzZSBvZiBvdXIgdHlwZQorICAgIC8vIHdpdGhpbiB0aGUgY29tcGxldGUgb2JqZWN0LiBTUkNfVFlQRSBpbmRpY2F0ZXMgdGhlIHN0YXRpYyB0eXBlCisgICAgLy8gc3RhcnRlZCBmcm9tIGFuZCBTUkNfUFRSIHBvaW50cyB0byB0aGF0IGJhc2Ugd2l0aGluIHRoZSBtb3N0CisgICAgLy8gZGVyaXZlZCBvYmplY3QuIEZpbGwgaW4gUkVTVUxUIHdpdGggd2hhdCB3ZSBmaW5kLiBSZXR1cm4gdHJ1ZQorICAgIC8vIGlmIHdlIGhhdmUgbG9jYXRlZCBhbiBhbWJpZ3VvdXMgbWF0Y2guCisgICAgdmlydHVhbCBib29sCisgICAgX19kb19keW5jYXN0KHB0cmRpZmZfdCBfX3NyYzJkc3QsIF9fc3ViX2tpbmQgX19hY2Nlc3NfcGF0aCwKKwkJIGNvbnN0IF9fY2xhc3NfdHlwZV9pbmZvKiBfX2RzdF90eXBlLCBjb25zdCB2b2lkKiBfX29ial9wdHIsCisJCSBjb25zdCBfX2NsYXNzX3R5cGVfaW5mbyogX19zcmNfdHlwZSwgY29uc3Qgdm9pZCogX19zcmNfcHRyLAorCQkgX19keW5jYXN0X3Jlc3VsdCYgX19yZXN1bHQpIGNvbnN0OworCisgICAgLy8gSGVscGVyIGZvciBmaW5kX3B1YmxpY19zdWJvYmouIFNSQzJEU1QgaW5kaWNhdGVzIGhvdyBTUkNfVFlQRQorICAgIC8vIGJhc2VzIGFyZSBpbmhlcml0ZWQgYnkgdGhlIHR5cGUgc3RhcnRlZCBmcm9tIC0tIHdoaWNoIGlzIG5vdAorICAgIC8vIG5lY2Vzc2FyaWx5IHRoZSBjdXJyZW50IHR5cGUuIFRoZSBjdXJyZW50IHR5cGUgd2lsbCBiZSBhIGJhc2UKKyAgICAvLyBvZiB0aGUgZGVzdGluYXRpb24gdHlwZS4gIE9CSl9QVFIgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJhc2UuCisgICAgdmlydHVhbCBfX3N1Yl9raW5kCisgICAgX19kb19maW5kX3B1YmxpY19zcmMocHRyZGlmZl90IF9fc3JjMmRzdCwgY29uc3Qgdm9pZCogX19vYmpfcHRyLAorCQkJIGNvbnN0IF9fY2xhc3NfdHlwZV9pbmZvKiBfX3NyY190eXBlLAorCQkJIGNvbnN0IHZvaWQqIF9fc3JjX3B0cikgY29uc3Q7CisgIH07CisKKyAgLy8gVHlwZSBpbmZvcm1hdGlvbiBmb3IgYSBjbGFzcyB3aXRoIGEgc2luZ2xlIG5vbi12aXJ0dWFsIGJhc2UuCisgIGNsYXNzIF9fc2lfY2xhc3NfdHlwZV9pbmZvIDogcHVibGljIF9fY2xhc3NfdHlwZV9pbmZvCisgIHsKKyAgcHVibGljOgorICAgIGNvbnN0IF9fY2xhc3NfdHlwZV9pbmZvKiBfX2Jhc2VfdHlwZTsKKworICAgIGV4cGxpY2l0CisgICAgX19zaV9jbGFzc190eXBlX2luZm8oY29uc3QgY2hhciAqX19uLCBjb25zdCBfX2NsYXNzX3R5cGVfaW5mbyAqX19iYXNlKQorICAgIDogX19jbGFzc190eXBlX2luZm8oX19uKSwgX19iYXNlX3R5cGUoX19iYXNlKSB7IH0KKworICAgIHZpcnR1YWwKKyAgICB+X19zaV9jbGFzc190eXBlX2luZm8oKTsKKworICBwcm90ZWN0ZWQ6CisgICAgX19zaV9jbGFzc190eXBlX2luZm8oY29uc3QgX19zaV9jbGFzc190eXBlX2luZm8mKTsKKworICAgIF9fc2lfY2xhc3NfdHlwZV9pbmZvJgorICAgIG9wZXJhdG9yPShjb25zdCBfX3NpX2NsYXNzX3R5cGVfaW5mbyYpOworCisgICAgLy8gSW1wbGVtZW50YXRpb24gZGVmaW5lZCBtZW1iZXIgZnVuY3Rpb25zLgorICAgIHZpcnR1YWwgYm9vbAorICAgIF9fZG9fZHluY2FzdChwdHJkaWZmX3QgX19zcmMyZHN0LCBfX3N1Yl9raW5kIF9fYWNjZXNzX3BhdGgsCisJCSBjb25zdCBfX2NsYXNzX3R5cGVfaW5mbyogX19kc3RfdHlwZSwgY29uc3Qgdm9pZCogX19vYmpfcHRyLAorCQkgY29uc3QgX19jbGFzc190eXBlX2luZm8qIF9fc3JjX3R5cGUsIGNvbnN0IHZvaWQqIF9fc3JjX3B0ciwKKwkJIF9fZHluY2FzdF9yZXN1bHQmIF9fcmVzdWx0KSBjb25zdDsKKworICAgIHZpcnR1YWwgX19zdWJfa2luZAorICAgIF9fZG9fZmluZF9wdWJsaWNfc3JjKHB0cmRpZmZfdCBfX3NyYzJkc3QsIGNvbnN0IHZvaWQqIF9fb2JqX3B0ciwKKwkJCSBjb25zdCBfX2NsYXNzX3R5cGVfaW5mbyogX19zcmNfdHlwZSwKKwkJCSBjb25zdCB2b2lkKiBfX3N1Yl9wdHIpIGNvbnN0OworCisgICAgdmlydHVhbCBib29sCisgICAgX19kb191cGNhc3QoY29uc3QgX19jbGFzc190eXBlX2luZm8qX19kc3QsIGNvbnN0IHZvaWQqX19vYmosCisJCV9fdXBjYXN0X3Jlc3VsdCYgX19yZXN0cmljdCBfX3Jlc3VsdCkgY29uc3Q7CisgIH07CisKKyAgLy8gVHlwZSBpbmZvcm1hdGlvbiBmb3IgYSBjbGFzcyB3aXRoIG11bHRpcGxlIGFuZC9vciB2aXJ0dWFsIGJhc2VzLgorICBjbGFzcyBfX3ZtaV9jbGFzc190eXBlX2luZm8gOiBwdWJsaWMgX19jbGFzc190eXBlX2luZm8KKyAgeworICBwdWJsaWM6CisgICAgdW5zaWduZWQgaW50IAkJX19mbGFnczsgIC8vIERldGFpbHMgYWJvdXQgdGhlIGNsYXNzIGhpZXJhcmNoeS4KKyAgICB1bnNpZ25lZCBpbnQgCQlfX2Jhc2VfY291bnQ7ICAvLyBOdW1iZXIgb2YgZGlyZWN0IGJhc2VzLgorCisgICAgLy8gVGhlIGFycmF5IG9mIGJhc2VzIHVzZXMgdGhlIHRyYWlsaW5nIGFycmF5IHN0cnVjdCBoYWNrIHNvIHRoaXMKKyAgICAvLyBjbGFzcyBpcyBub3QgY29uc3RydWN0YWJsZSB3aXRoIGEgbm9ybWFsIGNvbnN0cnVjdG9yLiBJdCBpcworICAgIC8vIGludGVybmFsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlci4KKyAgICBfX2Jhc2VfY2xhc3NfdHlwZV9pbmZvIAlfX2Jhc2VfaW5mb1sxXTsgIC8vIEFycmF5IG9mIGJhc2VzLgorCisgICAgZXhwbGljaXQKKyAgICBfX3ZtaV9jbGFzc190eXBlX2luZm8oY29uc3QgY2hhciogX19uLCBpbnQgX19fZmxhZ3MpCisgICAgOiBfX2NsYXNzX3R5cGVfaW5mbyhfX24pLCBfX2ZsYWdzKF9fX2ZsYWdzKSwgX19iYXNlX2NvdW50KDApIHsgfQorCisgICAgdmlydHVhbAorICAgIH5fX3ZtaV9jbGFzc190eXBlX2luZm8oKTsKKworICAgIC8vIEltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZXMuCisgICAgZW51bSBfX2ZsYWdzX21hc2tzCisgICAgICB7CisJX19ub25fZGlhbW9uZF9yZXBlYXRfbWFzayA9IDB4MSwgLy8gRGlzdGluY3QgaW5zdGFuY2Ugb2YgcmVwZWF0ZWQgYmFzZS4KKwlfX2RpYW1vbmRfc2hhcGVkX21hc2sgPSAweDIsIC8vIERpYW1vbmQgc2hhcGVkIG11bHRpcGxlIGluaGVyaXRhbmNlLgorCV9fZmxhZ3NfdW5rbm93bl9tYXNrID0gMHgxMAorICAgICAgfTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gSW1wbGVtZW50YXRpb24gZGVmaW5lZCBtZW1iZXIgZnVuY3Rpb25zLgorICAgIHZpcnR1YWwgYm9vbAorICAgIF9fZG9fZHluY2FzdChwdHJkaWZmX3QgX19zcmMyZHN0LCBfX3N1Yl9raW5kIF9fYWNjZXNzX3BhdGgsCisJCSBjb25zdCBfX2NsYXNzX3R5cGVfaW5mbyogX19kc3RfdHlwZSwgY29uc3Qgdm9pZCogX19vYmpfcHRyLAorCQkgY29uc3QgX19jbGFzc190eXBlX2luZm8qIF9fc3JjX3R5cGUsIGNvbnN0IHZvaWQqIF9fc3JjX3B0ciwKKwkJIF9fZHluY2FzdF9yZXN1bHQmIF9fcmVzdWx0KSBjb25zdDsKKworICAgIHZpcnR1YWwgX19zdWJfa2luZAorICAgIF9fZG9fZmluZF9wdWJsaWNfc3JjKHB0cmRpZmZfdCBfX3NyYzJkc3QsIGNvbnN0IHZvaWQqIF9fb2JqX3B0ciwKKwkJCSBjb25zdCBfX2NsYXNzX3R5cGVfaW5mbyogX19zcmNfdHlwZSwKKwkJCSBjb25zdCB2b2lkKiBfX3NyY19wdHIpIGNvbnN0OworCisgICAgdmlydHVhbCBib29sCisgICAgX19kb191cGNhc3QoY29uc3QgX19jbGFzc190eXBlX2luZm8qIF9fZHN0LCBjb25zdCB2b2lkKiBfX29iaiwKKwkJX191cGNhc3RfcmVzdWx0JiBfX3Jlc3RyaWN0IF9fcmVzdWx0KSBjb25zdDsKKyAgfTsKKworICAvLyBFeGNlcHRpb24gaGFuZGxpbmcgZm9yd2FyZCBkZWNsYXJhdGlvbnMuCisgIHN0cnVjdCBfX2N4YV9leGNlcHRpb247CisgIHN0cnVjdCBfX2N4YV9yZWZjb3VudGVkX2V4Y2VwdGlvbjsKKyAgc3RydWN0IF9fY3hhX2RlcGVuZGVudF9leGNlcHRpb247CisgIHN0cnVjdCBfX2N4YV9laF9nbG9iYWxzOworCisgIGV4dGVybiAiQyIKKyAgeworICAvLyBEeW5hbWljIGNhc3QgcnVudGltZS4KKworICAvLyBzcmMyZHN0IGhhcyB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIHZhbHVlcworICAvLyAgPi0xOiBzcmNfdHlwZSBpcyBhIHVuaXF1ZSBwdWJsaWMgbm9uLXZpcnR1YWwgYmFzZSBvZiBkc3RfdHlwZQorICAvLyAgICAgICBkc3RfcHRyICsgc3JjMmRzdCA9PSBzcmNfcHRyCisgIC8vICAgLTE6IHVuc3BlY2lmaWVkIHJlbGF0aW9uc2hpcAorICAvLyAgIC0yOiBzcmNfdHlwZSBpcyBub3QgYSBwdWJsaWMgYmFzZSBvZiBkc3RfdHlwZQorICAvLyAgIC0zOiBzcmNfdHlwZSBpcyBhIG11bHRpcGxlIHB1YmxpYyBub24tdmlydHVhbCBiYXNlIG9mIGRzdF90eXBlCisgIHZvaWQqCisgIF9fZHluYW1pY19jYXN0KGNvbnN0IHZvaWQqIF9fc3JjX3B0ciwgLy8gU3RhcnRpbmcgb2JqZWN0LgorCQkgY29uc3QgX19jbGFzc190eXBlX2luZm8qIF9fc3JjX3R5cGUsIC8vIFN0YXRpYyB0eXBlIG9mIG9iamVjdC4KKwkJIGNvbnN0IF9fY2xhc3NfdHlwZV9pbmZvKiBfX2RzdF90eXBlLCAvLyBEZXNpcmVkIHRhcmdldCB0eXBlLgorCQkgcHRyZGlmZl90IF9fc3JjMmRzdCk7IC8vIEhvdyBzcmMgYW5kIGRzdCBhcmUgcmVsYXRlZC4KKworCisgIC8vIEV4Y2VwdGlvbiBoYW5kbGluZyBydW50aW1lLgorCisgIC8vIFRoZSBfX2N4YV9laF9nbG9iYWxzIGZvciB0aGUgY3VycmVudCB0aHJlYWQgY2FuIGJlIG9idGFpbmVkIGJ5IHVzaW5nCisgIC8vIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucy4gIFRoZSAiZmFzdCIgdmVyc2lvbiBhc3N1bWVzIGF0IGxlYXN0CisgIC8vIG9uZSBwcmlvciBjYWxsIG9mIF9fY3hhX2dldF9nbG9iYWxzIGhhcyBiZWVuIG1hZGUgZnJvbSB0aGUgY3VycmVudAorICAvLyB0aHJlYWQsIHNvIG5vIGluaXRpYWxpemF0aW9uIGlzIG5lY2Vzc2FyeS4KKyAgX19jeGFfZWhfZ2xvYmFscyoKKyAgX19jeGFfZ2V0X2dsb2JhbHMoKSBfR0xJQkNYWF9OT1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworICBfX2N4YV9laF9nbG9iYWxzKgorICBfX2N4YV9nZXRfZ2xvYmFsc19mYXN0KCkgX0dMSUJDWFhfTk9USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKyAgLy8gQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcHJpbWFyeSBleGNlcHRpb24gcGx1cyB0aGUgdGhyb3duIG9iamVjdC4KKyAgdm9pZCoKKyAgX19jeGFfYWxsb2NhdGVfZXhjZXB0aW9uKHNpemVfdCkgX0dMSUJDWFhfTk9USFJPVzsKKworICAvLyBGcmVlIHRoZSBzcGFjZSBhbGxvY2F0ZWQgZm9yIHRoZSBwcmltYXJ5IGV4Y2VwdGlvbi4KKyAgdm9pZCAKKyAgX19jeGFfZnJlZV9leGNlcHRpb24odm9pZCopIF9HTElCQ1hYX05PVEhST1c7CisKKyAgLy8gVGhyb3cgdGhlIGV4Y2VwdGlvbi4KKyAgdm9pZAorICBfX2N4YV90aHJvdyh2b2lkKiwgc3RkOjp0eXBlX2luZm8qLCB2b2lkIChfR0xJQkNYWF9DRFRPUl9DQUxMQUJJICopICh2b2lkICopKQorICBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworICAvLyBVc2VkIHRvIGltcGxlbWVudCBleGNlcHRpb24gaGFuZGxlcnMuCisgIHZvaWQqCisgIF9fY3hhX2dldF9leGNlcHRpb25fcHRyKHZvaWQqKSBfR0xJQkNYWF9OT1RIUk9XIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOworCisgIHZvaWQqCisgIF9fY3hhX2JlZ2luX2NhdGNoKHZvaWQqKSBfR0xJQkNYWF9OT1RIUk9XOworCisgIHZvaWQgCisgIF9fY3hhX2VuZF9jYXRjaCgpOworCisgIHZvaWQgCisgIF9fY3hhX3JldGhyb3coKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworICAvLyBSZXR1cm5zIHRoZSB0eXBlX2luZm8gZm9yIHRoZSBjdXJyZW50bHkgaGFuZGxlZCBleGNlcHRpb24gWzE1LjMvOF0sIG9yCisgIC8vIG51bGwgaWYgdGhlcmUgaXMgbm9uZS4KKyAgc3RkOjp0eXBlX2luZm8qCisgIF9fY3hhX2N1cnJlbnRfZXhjZXB0aW9uX3R5cGUoKSBfR0xJQkNYWF9OT1RIUk9XIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOworCisgIC8vIEdOVSBFeHRlbnNpb25zLgorCisgIC8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgYSBkZXBlbmRlbnQgZXhjZXB0aW9uLgorICBfX2N4YV9kZXBlbmRlbnRfZXhjZXB0aW9uKgorICBfX2N4YV9hbGxvY2F0ZV9kZXBlbmRlbnRfZXhjZXB0aW9uKCkgX0dMSUJDWFhfTk9USFJPVzsKKworICAvLyBGcmVlIHRoZSBzcGFjZSBhbGxvY2F0ZWQgZm9yIHRoZSBkZXBlbmRlbnQgZXhjZXB0aW9uLgorICB2b2lkCisgIF9fY3hhX2ZyZWVfZGVwZW5kZW50X2V4Y2VwdGlvbihfX2N4YV9kZXBlbmRlbnRfZXhjZXB0aW9uKikgX0dMSUJDWFhfTk9USFJPVzsKKworICB9IC8vIGV4dGVybiAiQyIKKworICAvLyBBIG1hZ2ljIHBsYWNlaG9sZGVyIGNsYXNzIHRoYXQgY2FuIGJlIGNhdWdodCBieSByZWZlcmVuY2UKKyAgLy8gdG8gcmVjb2duaXplIGZvcmVpZ24gZXhjZXB0aW9ucy4KKyAgY2xhc3MgX19mb3JlaWduX2V4Y2VwdGlvbgorICB7CisgICAgdmlydHVhbCB+X19mb3JlaWduX2V4Y2VwdGlvbigpIHRocm93KCk7CisgICAgdmlydHVhbCB2b2lkIF9fcHVyZV9kdW1teSgpID0gMDsgLy8gcHJldmVudCBjYXRjaCBieSB2YWx1ZQorICB9OworCit9IC8vIG5hbWVzcGFjZSBfX2N4eGFiaXYxCisKKy8qKiBAbmFtZXNwYWNlIGFiaQorICogIEBicmllZiBUaGUgY3Jvc3MtdmVuZG9yIEMrKyBBcHBsaWNhdGlvbiBCaW5hcnkgSW50ZXJmYWNlLiBBCisgKiAgbmFtZXNwYWNlIGFsaWFzIHRvIF9fY3h4YWJpdjEsIGJ1dCB1c2VyIHByb2dyYW1zIHNob3VsZCB1c2UgdGhlCisgKiAgYWxpYXMgJ2FiaScuCisgKgorICogIEEgYnJpZWYgb3ZlcnZpZXcgb2YgYW4gQUJJIGlzIGdpdmVuIGluIHRoZSBsaWJzdGRjKysgRkFRLCBxdWVzdGlvbgorICogIDUuOCAoeW91IG1heSBoYXZlIGEgY29weSBvZiB0aGUgRkFRIGxvY2FsbHksIG9yIHlvdSBjYW4gdmlldyB0aGUgb25saW5lCisgKiAgdmVyc2lvbiBhdCBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvZmFxLmh0bWwjNV84ICkuCisgKgorICogIEdDQyBzdWJzY3JpYmVzIHRvIGEgY3Jvc3MtdmVuZG9yIEFCSSBmb3IgQysrLCBzb21ldGltZXMKKyAqICBjYWxsZWQgdGhlIElBNjQgQUJJIGJlY2F1c2UgaXQgaGFwcGVucyB0byBiZSB0aGUgbmF0aXZlIEFCSSBmb3IgdGhhdAorICogIHBsYXRmb3JtLiAgSXQgaXMgc3VtbWFyaXplZCBhdCBodHRwOi8vd3d3LmNvZGVzb3VyY2VyeS5jb20vY3h4LWFiaS8KKyAqICBhbG9uZyB3aXRoIHRoZSBjdXJyZW50IHNwZWNpZmljYXRpb24uCisgKgorICogIEZvciB1c2VycyBvZiBHQ0MgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDMueCwgZW50cnkgcG9pbnRzIGFyZQorICogIGF2YWlsYWJsZSBpbiA8Y3h4YWJpLmg+LCB3aGljaCBub3RlcywgPGVtPidJdCBpcyBub3Qgbm9ybWFsbHkKKyAqICBuZWNlc3NhcnkgZm9yIHVzZXIgcHJvZ3JhbXMgdG8gaW5jbHVkZSB0aGlzIGhlYWRlciwgb3IgdXNlIHRoZQorICogIGVudHJ5IHBvaW50cyBkaXJlY3RseS4gIEhvd2V2ZXIsIHRoaXMgaGVhZGVyIGlzIGF2YWlsYWJsZSBzaG91bGQKKyAqICB0aGF0IGJlIG5lZWRlZC4nPC9lbT4KKyovCituYW1lc3BhY2UgYWJpID0gX19jeHhhYml2MTsKKworbmFtZXNwYWNlIF9fZ251X2N4eAoreworICAvKioKKyAgICogIEBicmllZiBFeGNlcHRpb24gdGhyb3duIGJ5IF9fY3hhX2d1YXJkX2FjcXVpcmUuCisgICAqICBAaW5ncm91cCBleGNlcHRpb25zCisgICAqCisgICAqICA2Ljdbc3RtdC5kY2xdLzQ6IElmIGNvbnRyb2wgcmUtZW50ZXJzIHRoZSBkZWNsYXJhdGlvbiAocmVjdXJzaXZlbHkpCisgICAqICB3aGlsZSB0aGUgb2JqZWN0IGlzIGJlaW5nIGluaXRpYWxpemVkLCB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgorICAgKgorICAgKiAgU2luY2Ugd2UgYWxyZWFkeSBoYXZlIGEgbGlicmFyeSBmdW5jdGlvbiB0byBoYW5kbGUgbG9ja2luZywgd2UgbWlnaHQKKyAgICogIGFzIHdlbGwgY2hlY2sgZm9yIHRoaXMgc2l0dWF0aW9uIGFuZCB0aHJvdyBhbiBleGNlcHRpb24uCisgICAqICBXZSB1c2UgdGhlIHNlY29uZCBieXRlIG9mIHRoZSBndWFyZCB2YXJpYWJsZSB0byByZW1lbWJlciB0aGF0IHdlJ3JlCisgICAqICBpbiB0aGUgbWlkZGxlIG9mIGFuIGluaXRpYWxpemF0aW9uLgorICAgKi8KKyAgY2xhc3MgcmVjdXJzaXZlX2luaXRfZXJyb3I6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbgorICB7CisgIHB1YmxpYzoKKyAgICByZWN1cnNpdmVfaW5pdF9lcnJvcigpIHRocm93KCkgeyB9CisgICAgdmlydHVhbCB+cmVjdXJzaXZlX2luaXRfZXJyb3IoKSB0aHJvdyAoKTsKKyAgfTsKK30KKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHBvcAorCisjZW5kaWYgLy8gX19DWFhBQklfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9hcnJheSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvYXJyYXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNlMTBjZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvYXJyYXkKQEAgLTAsMCArMSwzMDUgQEAKKy8vIERlYnVnZ2luZyBhcnJheSBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvYXJyYXkKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfQVJSQVkKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfQVJSQVkgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX3NlcXVlbmNlLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fZGVidWcKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgc3RydWN0IGFycmF5CisgICAgeworICAgICAgdHlwZWRlZiBfVHAgCSAgICAJCQkgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlKgkJCSAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAJICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAJICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpzaXplX3QgICAgICAgICAgICAgICAgICAgIAkgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90ICAgICAgICAgICAgICAgICAgIAkgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4JICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIC8vIFN1cHBvcnQgZm9yIHplcm8tc2l6ZWQgYXJyYXlzIG1hbmRhdG9yeS4KKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6Ol9fYXJyYXlfdHJhaXRzPF9UcCwgX05tPiBfQVRfVHlwZTsKKyAgICAgIHR5cGVuYW1lIF9BVF9UeXBlOjpfVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICBfTV9lbGVtczsKKworICAgICAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX1NpemU+CisJc3RydWN0IF9BcnJheV9jaGVja19zdWJzY3JpcHQKKyAJeworCSAgc3RkOjpzaXplX3Qgc2l6ZSgpIHsgcmV0dXJuIF9TaXplOyB9CisKKwkgIF9BcnJheV9jaGVja19zdWJzY3JpcHQoc3RkOjpzaXplX3QgX19pbmRleCkKKwkgIHsgX19nbGliY3h4X2NoZWNrX3N1YnNjcmlwdChfX2luZGV4KTsgfQorICAgICAgICB9OworCisgICAgICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfU2l6ZT4KKwlzdHJ1Y3QgX0FycmF5X2NoZWNrX25vbmVtcHR5CisgCXsKKwkgIGJvb2wgZW1wdHkoKSB7IHJldHVybiBfU2l6ZSA9PSAwOyB9CisKKwkgIF9BcnJheV9jaGVja19ub25lbXB0eSgpCisJICB7IF9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOyB9CisgICAgICAgIH07CisKKyAgICAgIC8vIE5vIGV4cGxpY2l0IGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3kgZm9yIGFnZ3JlZ2F0ZSB0eXBlLgorCisgICAgICAvLyBEUiA3NzYuCisgICAgICB2b2lkCisgICAgICBmaWxsKGNvbnN0IHZhbHVlX3R5cGUmIF9fdSkKKyAgICAgIHsgc3RkOjpmaWxsX24oYmVnaW4oKSwgc2l6ZSgpLCBfX3UpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoYXJyYXkmIF9fb3RoZXIpCisgICAgICBub2V4Y2VwdChub2V4Y2VwdChzd2FwKHN0ZDo6ZGVjbHZhbDxfVHAmPigpLCBzdGQ6OmRlY2x2YWw8X1RwJj4oKSkpKQorICAgICAgeyBzdGQ6OnN3YXBfcmFuZ2VzKGJlZ2luKCksIGVuZCgpLCBfX290aGVyLmJlZ2luKCkpOyB9CisKKyAgICAgIC8vIEl0ZXJhdG9ycy4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBpdGVyYXRvcihkYXRhKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihkYXRhKCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoZGF0YSgpICsgX05tKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKGRhdGEoKSArIF9ObSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvciAKKyAgICAgIHJiZWdpbigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIAorICAgICAgcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IgCisgICAgICByZW5kKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciAKKyAgICAgIHJlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKGRhdGEoKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoZGF0YSgpICsgX05tKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIAorICAgICAgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIAorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICAvLyBDYXBhY2l0eS4KKyAgICAgIGNvbnN0ZXhwciBzaXplX3R5cGUgCisgICAgICBzaXplKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gX05tOyB9CisKKyAgICAgIGNvbnN0ZXhwciBzaXplX3R5cGUgCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuIF9ObTsgfQorCisgICAgICBjb25zdGV4cHIgYm9vbCAKKyAgICAgIGVtcHR5KCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gc2l6ZSgpID09IDA7IH0KKworICAgICAgLy8gRWxlbWVudCBhY2Nlc3MuCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfc3Vic2NyaXB0KF9fbik7CisJcmV0dXJuIF9BVF9UeXBlOjpfU19yZWYoX01fZWxlbXMsIF9fbik7CisgICAgICB9CisKKyAgICAgIGNvbnN0ZXhwciBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsKKwlyZXR1cm4gX19uIDwgX05tID8gX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgX19uKQorCSA6IChfR0xJQkNYWF9USFJPV19PUl9BQk9SVChfQXJyYXlfY2hlY2tfc3Vic2NyaXB0PF9ObT4oX19uKSksCisJICAgIF9BVF9UeXBlOjpfU19yZWYoX01fZWxlbXMsIDApKTsKKyAgICAgIH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBhdChzaXplX3R5cGUgX19uKQorICAgICAgeworCWlmIChfX24gPj0gX05tKQorCSAgc3RkOjpfX3Rocm93X291dF9vZl9yYW5nZShfX04oImFycmF5OjphdCIpKTsKKwlyZXR1cm4gX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgX19uKTsKKyAgICAgIH0KKworICAgICAgY29uc3RleHByIGNvbnN0X3JlZmVyZW5jZQorICAgICAgYXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsKKwkvLyBSZXN1bHQgb2YgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBtdXN0IGJlIGFuIGx2YWx1ZSBzbyB1c2UKKwkvLyBib29sZWFuID8gbHZhbHVlIDogKHRocm93LWV4cHIsIGx2YWx1ZSkKKwlyZXR1cm4gX19uIDwgX05tID8gX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgX19uKQorCSAgOiAoc3RkOjpfX3Rocm93X291dF9vZl9yYW5nZShfX04oImFycmF5OjphdCIpKSwKKwkgICAgIF9BVF9UeXBlOjpfU19yZWYoX01fZWxlbXMsIDApKTsKKyAgICAgIH0KKworICAgICAgcmVmZXJlbmNlIAorICAgICAgZnJvbnQoKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXJldHVybiAqYmVnaW4oKTsKKyAgICAgIH0KKworICAgICAgY29uc3RleHByIGNvbnN0X3JlZmVyZW5jZSAKKyAgICAgIGZyb250KCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX05tID8gX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgMCkKKwkgIDogKF9HTElCQ1hYX1RIUk9XX09SX0FCT1JUKF9BcnJheV9jaGVja19ub25lbXB0eTxfTm0+KCkpLAorCSAgICAgX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgMCkpOworICAgICAgfQorCisgICAgICByZWZlcmVuY2UgCisgICAgICBiYWNrKCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKTsKKwlyZXR1cm4gX05tID8gKihlbmQoKSAtIDEpIDogKmVuZCgpOworICAgICAgfQorCisgICAgICBjb25zdGV4cHIgY29uc3RfcmVmZXJlbmNlIAorICAgICAgYmFjaygpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9ObSA/IF9BVF9UeXBlOjpfU19yZWYoX01fZWxlbXMsIF9ObSAtIDEpCisJICA6IChfR0xJQkNYWF9USFJPV19PUl9BQk9SVChfQXJyYXlfY2hlY2tfbm9uZW1wdHk8X05tPigpKSwKKwkgICAgIF9BVF9UeXBlOjpfU19yZWYoX01fZWxlbXMsIDApKTsKKyAgICAgIH0KKworICAgICAgcG9pbnRlcgorICAgICAgZGF0YSgpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9BVF9UeXBlOjpfU19yZWYoX01fZWxlbXMsIDApKTsgfQorCisgICAgICBjb25zdF9wb2ludGVyCisgICAgICBkYXRhKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgMCkpOyB9CisgICAgfTsKKworICAvLyBBcnJheSBjb21wYXJpc29ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIGJvb2wgCisgICAgb3BlcmF0b3I9PShjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fb25lLCBjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fdHdvKQorICAgIHsgcmV0dXJuIHN0ZDo6ZXF1YWwoX19vbmUuYmVnaW4oKSwgX19vbmUuZW5kKCksIF9fdHdvLmJlZ2luKCkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgeyByZXR1cm4gIShfX29uZSA9PSBfX3R3byk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fYSwgY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX2IpCisgICAgeyAKKyAgICAgIHJldHVybiBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9fYS5iZWdpbigpLCBfX2EuZW5kKCksCisJCQkJCSAgX19iLmJlZ2luKCksIF9fYi5lbmQoKSk7IAorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fb25lLCBjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fdHdvKQorICAgIHsgcmV0dXJuIF9fdHdvIDwgX19vbmU7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX29uZSwgY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX3R3bykKKyAgICB7IHJldHVybiAhKF9fb25lID4gX190d28pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgeyByZXR1cm4gIShfX29uZSA8IF9fdHdvKTsgfQorCisgIC8vIFNwZWNpYWxpemVkIGFsZ29yaXRobXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChhcnJheTxfVHAsIF9ObT4mIF9fb25lLCBhcnJheTxfVHAsIF9ObT4mIF9fdHdvKQorICAgIG5vZXhjZXB0KG5vZXhjZXB0KF9fb25lLnN3YXAoX190d28pKSkKKyAgICB7IF9fb25lLnN3YXAoX190d28pOyB9CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0ludCwgdHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgY29uc3RleHByIF9UcCYKKyAgICBnZXQoYXJyYXk8X1RwLCBfTm0+JiBfX2Fycikgbm9leGNlcHQKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9JbnQgPCBfTm0sICJpbmRleCBpcyBvdXQgb2YgYm91bmRzIik7CisgICAgICByZXR1cm4gX0dMSUJDWFhfU1REX0M6Ol9fYXJyYXlfdHJhaXRzPF9UcCwgX05tPjo6CisJX1NfcmVmKF9fYXJyLl9NX2VsZW1zLCBfSW50KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0ludCwgdHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgY29uc3RleHByIF9UcCYmCisgICAgZ2V0KGFycmF5PF9UcCwgX05tPiYmIF9fYXJyKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoX0ludCA8IF9ObSwgImluZGV4IGlzIG91dCBvZiBib3VuZHMiKTsKKyAgICAgIHJldHVybiBzdGQ6Om1vdmUoZ2V0PF9JbnQ+KF9fYXJyKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JbnQsIHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGNvbnN0ZXhwciBjb25zdCBfVHAmCisgICAgZ2V0KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19hcnIpIG5vZXhjZXB0CisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChfSW50IDwgX05tLCAiaW5kZXggaXMgb3V0IG9mIGJvdW5kcyIpOworICAgICAgcmV0dXJuIF9HTElCQ1hYX1NURF9DOjpfX2FycmF5X3RyYWl0czxfVHAsIF9ObT46OgorCV9TX3JlZihfX2Fyci5fTV9lbGVtcywgX0ludCk7CisgICAgfQorfSAvLyBuYW1lc3BhY2UgX19kZWJ1ZworCisgIC8vIFR1cGxlIGludGVyZmFjZSB0byBjbGFzcyB0ZW1wbGF0ZSBhcnJheS4KKworICAvLy8gdHVwbGVfc2l6ZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBzdHJ1Y3QgdHVwbGVfc2l6ZTxfX2RlYnVnOjphcnJheTxfVHAsIF9ObT4+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIF9ObT4geyB9OworCisgIC8vLyB0dXBsZV9lbGVtZW50CisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JbnQsIHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIHN0cnVjdCB0dXBsZV9lbGVtZW50PF9JbnQsIF9fZGVidWc6OmFycmF5PF9UcCwgX05tPj4KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9JbnQgPCBfTm0sICJpbmRleCBpcyBvdXQgb2YgYm91bmRzIik7CisgICAgICB0eXBlZGVmIF9UcCB0eXBlOworICAgIH07Cit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8vIF9HTElCQ1hYX0RFQlVHX0FSUkFZCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL2JpdHNldCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvYml0c2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZDkxODQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL2JpdHNldApAQCAtMCwwICsxLDQyNiBAQAorLy8gRGVidWdnaW5nIGJpdHNldCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvYml0c2V0CisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19CSVRTRVQKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfQklUU0VUCisKKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9zZXF1ZW5jZS5oPgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfaXRlcmF0b3IuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19kZWJ1ZworeworICAvLy8gQ2xhc3Mgc3RkOjpiaXRzZXQgd2l0aCBhZGRpdGlvbmFsIHNhZmV0eS9jaGVja2luZy9kZWJ1ZyBpbnN0cnVtZW50YXRpb24uCisgIHRlbXBsYXRlPHNpemVfdCBfTmI+CisgICAgY2xhc3MgYml0c2V0CisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6OmJpdHNldDxfTmI+CisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgICAgLCBwdWJsaWMgX19nbnVfZGVidWc6Ol9TYWZlX3NlcXVlbmNlX2Jhc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6OmJpdHNldDxfTmI+IF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgLy8gSW4gQysrMHggd2UgcmVseSBvbiBub3JtYWwgcmVmZXJlbmNlIHR5cGUgdG8gcHJlc2VydmUgdGhlIHByb3BlcnR5CisgICAgICAvLyBvZiBiaXRzZXQgdG8gYmUgdXNlIGFzIGEgbGl0ZXJhbC4KKyAgICAgIC8vIFRPRE86IEZpbmQgYW5vdGhlciBzb2x1dGlvbi4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworI2Vsc2UKKyAgICAgIC8vIGJpdCByZWZlcmVuY2U6CisgICAgICBjbGFzcyByZWZlcmVuY2UKKyAgICAgIDogcHJpdmF0ZSBfQmFzZTo6cmVmZXJlbmNlCisgICAgICAgICwgcHVibGljIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcl9iYXNlCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlIF9CYXNlX3JlZjsKKworCWZyaWVuZCBjbGFzcyBiaXRzZXQ7CisJcmVmZXJlbmNlKCk7CisKKwlyZWZlcmVuY2UoY29uc3QgX0Jhc2VfcmVmJiBfX2Jhc2UsCisJCSAgYml0c2V0KiBfX3NlcSBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkpIF9HTElCQ1hYX05PRVhDRVBUCisJOiBfQmFzZV9yZWYoX19iYXNlKQorCSwgX1NhZmVfaXRlcmF0b3JfYmFzZShfX3NlcSwgZmFsc2UpCisJeyB9CisKKyAgICAgIHB1YmxpYzoKKwlyZWZlcmVuY2UoY29uc3QgcmVmZXJlbmNlJiBfX3gpIF9HTElCQ1hYX05PRVhDRVBUCisJOiBfQmFzZV9yZWYoX194KQorCSwgX1NhZmVfaXRlcmF0b3JfYmFzZShfX3gsIGZhbHNlKQorCXsgfQorCisJcmVmZXJlbmNlJgorCW9wZXJhdG9yPShib29sIF9feCkgX0dMSUJDWFhfTk9FWENFUFQKKwl7CisJICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISB0aGlzLT5fTV9zaW5ndWxhcigpLAorCQkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfYmFkX2JpdHNldF93cml0ZSkKKwkJCQkuX01faXRlcmF0b3IoKnRoaXMpKTsKKwkgICpzdGF0aWNfY2FzdDxfQmFzZV9yZWYqPih0aGlzKSA9IF9feDsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKwlyZWZlcmVuY2UmCisJb3BlcmF0b3I9KGNvbnN0IHJlZmVyZW5jZSYgX194KSBfR0xJQkNYWF9OT0VYQ0VQVAorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIF9feC5fTV9zaW5ndWxhcigpLAorCQkJICAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2JhZF9iaXRzZXRfcmVhZCkKKwkJCQkuX01faXRlcmF0b3IoX194KSk7CisJICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISB0aGlzLT5fTV9zaW5ndWxhcigpLAorCQkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfYmFkX2JpdHNldF93cml0ZSkKKwkJCQkuX01faXRlcmF0b3IoKnRoaXMpKTsKKwkgICpzdGF0aWNfY2FzdDxfQmFzZV9yZWYqPih0aGlzKSA9IF9feDsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKwlib29sCisJb3BlcmF0b3J+KCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKwl7CisJICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISB0aGlzLT5fTV9zaW5ndWxhcigpLAorCQkJICAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2JhZF9iaXRzZXRfcmVhZCkKKwkJCQkuX01faXRlcmF0b3IoKnRoaXMpKTsKKwkgIHJldHVybiB+KCpzdGF0aWNfY2FzdDxjb25zdCBfQmFzZV9yZWYqPih0aGlzKSk7CisJfQorCisJb3BlcmF0b3IgYm9vbCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisJeworCSAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgdGhpcy0+X01fc2luZ3VsYXIoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2JhZF9iaXRzZXRfcmVhZCkKKwkJCQkuX01faXRlcmF0b3IoKnRoaXMpKTsKKwkgIHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgX0Jhc2VfcmVmKj4odGhpcyk7CisJfQorCisJcmVmZXJlbmNlJgorCWZsaXAoKSBfR0xJQkNYWF9OT0VYQ0VQVAorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIHRoaXMtPl9NX3Npbmd1bGFyKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19iYWRfYml0c2V0X2ZsaXApCisJCQkJLl9NX2l0ZXJhdG9yKCp0aGlzKSk7CisJICBfQmFzZV9yZWY6OmZsaXAoKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisgICAgICB9OworI2VuZGlmCisKKyAgICAgIC8vIDIzLjMuNS4xIGNvbnN0cnVjdG9yczoKKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBiaXRzZXQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgOiBfQmFzZSgpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgY29uc3RleHByIGJpdHNldCh1bnNpZ25lZCBsb25nIGxvbmcgX192YWwpIG5vZXhjZXB0CisjZWxzZQorICAgICAgYml0c2V0KHVuc2lnbmVkIGxvbmcgX192YWwpCisjZW5kaWYKKyAgICAgIDogX0Jhc2UoX192YWwpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgYml0c2V0KGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zdHIsCisJICAgICAgIHR5cGVuYW1lIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisJICAgICAgIF9fcG9zID0gMCwKKwkgICAgICAgdHlwZW5hbWUgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKKwkgICAgICAgX19uID0gKHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6bnBvcykpCisJOiBfQmFzZShfX3N0ciwgX19wb3MsIF9fbikgeyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDM5Ni4gd2hhdCBhcmUgY2hhcmFjdGVycyB6ZXJvIGFuZCBvbmUuCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKwliaXRzZXQoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3N0ciwKKwkgICAgICAgdHlwZW5hbWUgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKKwkgICAgICAgX19wb3MsCisJICAgICAgIHR5cGVuYW1lIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisJICAgICAgIF9fbiwKKwkgICAgICAgX0NoYXJUIF9femVybywgX0NoYXJUIF9fb25lID0gX0NoYXJUKCcxJykpCisJOiBfQmFzZShfX3N0ciwgX19wb3MsIF9fbiwgX196ZXJvLCBfX29uZSkgeyB9CisKKyAgICAgIGJpdHNldChjb25zdCBfQmFzZSYgX194KSA6IF9CYXNlKF9feCkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIGJpdHNldChjb25zdCBfQ2hhclQqIF9fc3RyLAorCSAgICAgICB0eXBlbmFtZSBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQ+OjpzaXplX3R5cGUgX19uCisJICAgICAgID0gc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJUPjo6bnBvcywKKwkgICAgICAgX0NoYXJUIF9femVybyA9IF9DaGFyVCgnMCcpLCBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSkKKwk6IF9CYXNlKF9fc3RyLCBfX24sIF9femVybywgX19vbmUpIHsgfQorI2VuZGlmCisKKyAgICAgIC8vIDIzLjMuNS4yIGJpdHNldCBvcGVyYXRpb25zOgorICAgICAgYml0c2V0PF9OYj4mCisgICAgICBvcGVyYXRvciY9KGNvbnN0IGJpdHNldDxfTmI+JiBfX3JocykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlfTV9iYXNlKCkgJj0gX19yaHM7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIG9wZXJhdG9yfD0oY29uc3QgYml0c2V0PF9OYj4mIF9fcmhzKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCV9NX2Jhc2UoKSB8PSBfX3JoczsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgb3BlcmF0b3JePShjb25zdCBiaXRzZXQ8X05iPiYgX19yaHMpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJX01fYmFzZSgpIF49IF9fcmhzOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBvcGVyYXRvcjw8PShzaXplX3QgX19wb3MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJX01fYmFzZSgpIDw8PSBfX3BvczsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgb3BlcmF0b3I+Pj0oc2l6ZV90IF9fcG9zKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCV9NX2Jhc2UoKSA+Pj0gX19wb3M7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIHNldCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJX0Jhc2U6OnNldCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTg2LiBiaXRzZXQ6OnNldCgpIHNlY29uZCBwYXJhbWV0ZXIgc2hvdWxkIGJlIGJvb2wKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgc2V0KHNpemVfdCBfX3BvcywgYm9vbCBfX3ZhbCA9IHRydWUpCisgICAgICB7CisJX0Jhc2U6OnNldChfX3BvcywgX192YWwpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICByZXNldCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJX0Jhc2U6OnJlc2V0KCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIHJlc2V0KHNpemVfdCBfX3BvcykKKyAgICAgIHsKKwlfQmFzZTo6cmVzZXQoX19wb3MpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4KKyAgICAgIG9wZXJhdG9yfigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBiaXRzZXQofl9NX2Jhc2UoKSk7IH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBmbGlwKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlfQmFzZTo6ZmxpcCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBmbGlwKHNpemVfdCBfX3BvcykKKyAgICAgIHsKKwlfQmFzZTo6ZmxpcChfX3Bvcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLyBlbGVtZW50IGFjY2VzczoKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDExLiBCaXRzZXQgbWlub3IgcHJvYmxlbXMKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3QgX19wb3MpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX3N1YnNjcmlwdChfX3Bvcyk7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCXJldHVybiBfTV9iYXNlKClbX19wb3NdOworI2Vsc2UKKwlyZXR1cm4gcmVmZXJlbmNlKF9NX2Jhc2UoKVtfX3Bvc10sIHRoaXMpOworI2VuZGlmCisgICAgICB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDExLiBCaXRzZXQgbWlub3IgcHJvYmxlbXMKKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgICBvcGVyYXRvcltdKHNpemVfdCBfX3BvcykgY29uc3QKKyAgICAgIHsKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKwkvLyBUT0RPOiBDaGVjayBpbiBkZWJ1Zy1tb2RlIHRvby4KKwlfX2dsaWJjeHhfY2hlY2tfc3Vic2NyaXB0KF9fcG9zKTsKKyNlbmRpZgorCXJldHVybiBfQmFzZTo6b3BlcmF0b3JbXShfX3Bvcyk7CisgICAgICB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjp0b191bG9uZzsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB1c2luZyBfQmFzZTo6dG9fdWxsb25nOworI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgICAgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgICAgICAgIHRvX3N0cmluZygpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIF9NX2Jhc2UoKS50ZW1wbGF0ZSB0b19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+KCk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMzk2LiB3aGF0IGFyZSBjaGFyYWN0ZXJzIHplcm8gYW5kIG9uZS4KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorCXN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorCXRvX3N0cmluZyhfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSkgY29uc3QKKwl7CisJICByZXR1cm4gX01fYmFzZSgpLnRlbXBsYXRlCisJICAgIHRvX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4oX196ZXJvLCBfX29uZSk7CisJfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzQuIGJpdHNldDo6dG9fc3RyaW5nKCkgaGFyZCB0byB1c2UuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+CisgICAgICAgIHRvX3N0cmluZygpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIHRvX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPigpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDg1My4gdG9fc3RyaW5nIG5lZWRzIHVwZGF0aW5nIHdpdGggemVybyBhbmQgb25lLgorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorCXN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+CisJdG9fc3RyaW5nKF9DaGFyVCBfX3plcm8sIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpKSBjb25zdAorCXsgcmV0dXJuIHRvX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsCisJICAgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPihfX3plcm8sIF9fb25lKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgICAgIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4KKyAgICAgICAgdG9fc3RyaW5nKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiB0b19zdHJpbmc8X0NoYXJULCBzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4oKTsKKyAgICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQ+CisJc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD4sCisJICAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+CisJdG9fc3RyaW5nKF9DaGFyVCBfX3plcm8sIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpKSBjb25zdAorCXsKKwkgIHJldHVybiB0b19zdHJpbmc8X0NoYXJULCBzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD4sCisJICAgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPihfX3plcm8sIF9fb25lKTsKKwl9CisKKyAgICAgIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4sIHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4KKyAgICAgIHRvX3N0cmluZygpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIHRvX3N0cmluZzxjaGFyLHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4sc3RkOjphbGxvY2F0b3I8Y2hhcj4gPigpOworICAgICAgfQorCisgICAgICBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyLCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+LCBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+CisgICAgICB0b19zdHJpbmcoY2hhciBfX3plcm8sIGNoYXIgX19vbmUgPSAnMScpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIHRvX3N0cmluZzxjaGFyLCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+LAorCSAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8Y2hhcj4gPihfX3plcm8sIF9fb25lKTsKKyAgICAgIH0KKworICAgICAgdXNpbmcgX0Jhc2U6OmNvdW50OworICAgICAgdXNpbmcgX0Jhc2U6OnNpemU7CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgYml0c2V0PF9OYj4mIF9fcmhzKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fYmFzZSgpID09IF9fcmhzOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgYml0c2V0PF9OYj4mIF9fcmhzKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX01fYmFzZSgpICE9IF9fcmhzOyB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjp0ZXN0OworICAgICAgdXNpbmcgX0Jhc2U6OmFsbDsKKyAgICAgIHVzaW5nIF9CYXNlOjphbnk7CisgICAgICB1c2luZyBfQmFzZTo6bm9uZTsKKworICAgICAgYml0c2V0PF9OYj4KKyAgICAgIG9wZXJhdG9yPDwoc2l6ZV90IF9fcG9zKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gYml0c2V0PF9OYj4oX01fYmFzZSgpIDw8IF9fcG9zKTsgfQorCisgICAgICBiaXRzZXQ8X05iPgorICAgICAgb3BlcmF0b3I+PihzaXplX3QgX19wb3MpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBiaXRzZXQ8X05iPihfTV9iYXNlKCkgPj4gX19wb3MpOyB9CisKKyAgICAgIF9CYXNlJiAKKyAgICAgIF9NX2Jhc2UoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3QgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxzaXplX3QgX05iPgorICAgIGJpdHNldDxfTmI+CisgICAgb3BlcmF0b3ImKGNvbnN0IGJpdHNldDxfTmI+JiBfX3gsIGNvbnN0IGJpdHNldDxfTmI+JiBfX3kpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gYml0c2V0PF9OYj4oX194KSAmPSBfX3k7IH0KKworICB0ZW1wbGF0ZTxzaXplX3QgX05iPgorICAgIGJpdHNldDxfTmI+CisgICAgb3BlcmF0b3J8KGNvbnN0IGJpdHNldDxfTmI+JiBfX3gsIGNvbnN0IGJpdHNldDxfTmI+JiBfX3kpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gYml0c2V0PF9OYj4oX194KSB8PSBfX3k7IH0KKworICB0ZW1wbGF0ZTxzaXplX3QgX05iPgorICAgIGJpdHNldDxfTmI+CisgICAgb3BlcmF0b3JeKGNvbnN0IGJpdHNldDxfTmI+JiBfX3gsIGNvbnN0IGJpdHNldDxfTmI+JiBfX3kpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gYml0c2V0PF9OYj4oX194KSBePSBfX3k7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHNpemVfdCBfTmI+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgYml0c2V0PF9OYj4mIF9feCkKKyAgICB7IHJldHVybiBfX2lzID4+IF9feC5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHNpemVfdCBfTmI+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgYml0c2V0PF9OYj4mIF9feCkKKyAgICB7IHJldHVybiBfX29zIDw8IF9feC5fTV9iYXNlKCk7IH0KKworfSAvLyBuYW1lc3BhY2UgX19kZWJ1ZworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAvLyBEUiAxMTgyLgorICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciBiaXRzZXQuCisgIHRlbXBsYXRlPHNpemVfdCBfTmI+CisgICAgc3RydWN0IGhhc2g8X19kZWJ1Zzo6Yml0c2V0PF9OYj4+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBfX2RlYnVnOjpiaXRzZXQ8X05iPj4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX19kZWJ1Zzo6Yml0c2V0PF9OYj4mIF9fYikgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6aGFzaDxfR0xJQkNYWF9TVERfQzo6Yml0c2V0PF9OYj4+KCkoX19iLl9NX2Jhc2UoKSk7IH0KKyAgICB9OworI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvZGVidWcuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWFmNDJlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9kZWJ1Zy5oCkBAIC0wLDAgKzEsMTMxIEBACisvLyBEZWJ1Z2dpbmcgc3VwcG9ydCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvZGVidWcuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfTUFDUk9fU1dJVENIX0gKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfTUFDUk9fU1dJVENIX0ggMQorCisvKiogTWFjcm9zIGFuZCBuYW1lc3BhY2VzIHVzZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIG91dHNpZGUgb2YgZGVidWcKKyAqICB3cmFwcGVycyB0byB2ZXJpZnkgY2VydGFpbiBwcm9wZXJ0aWVzLiBUaGUgX19nbGliY3h4X3JlcXVpcmVzX3h4eAorICogIG1hY3JvcyBhcmUgbWVyZWx5IHdyYXBwZXJzIGFyb3VuZCB0aGUgX19nbGliY3h4X2NoZWNrX3h4eCB3cmFwcGVycworICogIHdoZW4gd2UgYXJlIGNvbXBpbGluZyB3aXRoIGRlYnVnIG1vZGUsIGJ1dCBkaXNhcHBlYXIgd2hlbiB3ZSBhcmUKKyAqICBpbiByZWxlYXNlIG1vZGUgc28gdGhhdCB0aGVyZSBpcyBubyBjaGVja2luZyBwZXJmb3JtZWQgaW4sIGUuZy4sCisgKiAgdGhlIHN0YW5kYXJkIGxpYnJhcnkgYWxnb3JpdGhtcy4KKyovCisKKy8vIERlYnVnIG1vZGUgbmFtZXNwYWNlcy4KKworLyoqCisgKiBAbmFtZXNwYWNlIHN0ZDo6X19kZWJ1ZworICogQGJyaWVmIEdOVSBkZWJ1ZyBjb2RlLCByZXBsYWNlcyBzdGFuZGFyZCBiZWhhdmlvciB3aXRoIGRlYnVnIGJlaGF2aW9yLgorICovCituYW1lc3BhY2Ugc3RkCit7IAorICBuYW1lc3BhY2UgX19kZWJ1ZyB7IH0gCit9CisKKy8qKiBAbmFtZXNwYWNlIF9fZ251X2RlYnVnCisgKiAgQGJyaWVmIEdOVSBkZWJ1ZyBjbGFzc2VzIGZvciBwdWJsaWMgdXNlLgorKi8KK25hbWVzcGFjZSBfX2dudV9kZWJ1ZworeworICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpfX2RlYnVnOworfQorCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHCisKKyMgZGVmaW5lIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfQ29uZGl0aW9uKQorIyBkZWZpbmUgX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9Db25kaXRpb24pCisjIGRlZmluZSBfR0xJQkNYWF9ERUJVR19PTkxZKF9TdGF0ZW1lbnQpIDsKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19jb25kKF9Db25kLF9Nc2cpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX0ZpcnN0LF9MYXN0KQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX25vbl9lbXB0eV9yYW5nZShfRmlyc3QsX0xhc3QpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkKF9GaXJzdCxfTGFzdCkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfcHJlZChfRmlyc3QsX0xhc3QsX1ByZWQpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldChfRmlyc3QxLF9MYXN0MSxfRmlyc3QyKQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXRfcHJlZChfRmlyc3QxLF9MYXN0MSxfRmlyc3QyLF9QcmVkKQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3BhcnRpdGlvbmVkX2xvd2VyKF9GaXJzdCxfTGFzdCxfVmFsdWUpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfdXBwZXIoX0ZpcnN0LF9MYXN0LF9WYWx1ZSkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19wYXJ0aXRpb25lZF9sb3dlcl9wcmVkKF9GaXJzdCxfTGFzdCxfVmFsdWUsX1ByZWQpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfdXBwZXJfcHJlZChfRmlyc3QsX0xhc3QsX1ZhbHVlLF9QcmVkKQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX2hlYXAoX0ZpcnN0LF9MYXN0KQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX2hlYXBfcHJlZChfRmlyc3QsX0xhc3QsX1ByZWQpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfbm9uZW1wdHkoKQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfU3RyaW5nKQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX1N0cmluZyxfTGVuKQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3N1YnNjcmlwdChfTikKKworI2Vsc2UKKworIyBpbmNsdWRlIDxkZWJ1Zy9tYWNyb3MuaD4KKworI2RlZmluZSBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX0NvbmRpdGlvbikgX19nbGliY3h4X2Fzc2VydChfQ29uZGl0aW9uKQorCisjaWZkZWYgX0dMSUJDWFhfREVCVUdfUEVEQU5USUMKKyMgZGVmaW5lIF9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfQ29uZGl0aW9uKSBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX0NvbmRpdGlvbikKKyNlbHNlCisjIGRlZmluZSBfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX0NvbmRpdGlvbikKKyNlbmRpZgorCisjIGRlZmluZSBfR0xJQkNYWF9ERUJVR19PTkxZKF9TdGF0ZW1lbnQpIF9TdGF0ZW1lbnQKKworIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX2NvbmQoX0NvbmQsX01zZykgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9Db25kLF9Nc2cpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX0ZpcnN0LF9MYXN0KSBcCisgICAgIF9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfRmlyc3QsX0xhc3QpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfbm9uX2VtcHR5X3JhbmdlKF9GaXJzdCxfTGFzdCkgXAorICAgICBfX2dsaWJjeHhfY2hlY2tfbm9uX2VtcHR5X3JhbmdlKF9GaXJzdCxfTGFzdCkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWQoX0ZpcnN0LF9MYXN0KSBcCisgICAgIF9fZ2xpYmN4eF9jaGVja19zb3J0ZWQoX0ZpcnN0LF9MYXN0KQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9wcmVkKF9GaXJzdCxfTGFzdCxfUHJlZCkgXAorICAgICBfX2dsaWJjeHhfY2hlY2tfc29ydGVkX3ByZWQoX0ZpcnN0LF9MYXN0LF9QcmVkKQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXQoX0ZpcnN0MSxfTGFzdDEsX0ZpcnN0MikgXAorICAgICBfX2dsaWJjeHhfY2hlY2tfc29ydGVkX3NldChfRmlyc3QxLF9MYXN0MSxfRmlyc3QyKQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXRfcHJlZChfRmlyc3QxLF9MYXN0MSxfRmlyc3QyLF9QcmVkKSBcCisgICAgIF9fZ2xpYmN4eF9jaGVja19zb3J0ZWRfc2V0X3ByZWQoX0ZpcnN0MSxfTGFzdDEsX0ZpcnN0MixfUHJlZCkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19wYXJ0aXRpb25lZF9sb3dlcihfRmlyc3QsX0xhc3QsX1ZhbHVlKQlcCisgICAgIF9fZ2xpYmN4eF9jaGVja19wYXJ0aXRpb25lZF9sb3dlcihfRmlyc3QsX0xhc3QsX1ZhbHVlKQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3BhcnRpdGlvbmVkX3VwcGVyKF9GaXJzdCxfTGFzdCxfVmFsdWUpCVwKKyAgICAgX19nbGliY3h4X2NoZWNrX3BhcnRpdGlvbmVkX3VwcGVyKF9GaXJzdCxfTGFzdCxfVmFsdWUpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfbG93ZXJfcHJlZChfRmlyc3QsX0xhc3QsX1ZhbHVlLF9QcmVkKSBcCisgICAgIF9fZ2xpYmN4eF9jaGVja19wYXJ0aXRpb25lZF9sb3dlcl9wcmVkKF9GaXJzdCxfTGFzdCxfVmFsdWUsX1ByZWQpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfdXBwZXJfcHJlZChfRmlyc3QsX0xhc3QsX1ZhbHVlLF9QcmVkKSBcCisgICAgIF9fZ2xpYmN4eF9jaGVja19wYXJ0aXRpb25lZF91cHBlcl9wcmVkKF9GaXJzdCxfTGFzdCxfVmFsdWUsX1ByZWQpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfaGVhcChfRmlyc3QsX0xhc3QpIFwKKyAgICAgX19nbGliY3h4X2NoZWNrX2hlYXAoX0ZpcnN0LF9MYXN0KQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX2hlYXBfcHJlZChfRmlyc3QsX0xhc3QsX1ByZWQpIFwKKyAgICAgX19nbGliY3h4X2NoZWNrX2hlYXBfcHJlZChfRmlyc3QsX0xhc3QsX1ByZWQpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfbm9uZW1wdHkoKSBfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfU3RyaW5nKSBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9TdHJpbmcpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfU3RyaW5nLF9MZW4pCVwKKyAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZ19sZW4oX1N0cmluZyxfTGVuKQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3N1YnNjcmlwdChfTikgX19nbGliY3h4X2NoZWNrX3N1YnNjcmlwdChfTikKKworIyBpbmNsdWRlIDxkZWJ1Zy9mdW5jdGlvbnMuaD4KKworI2VuZGlmCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9ERUJVR19NQUNST19TV0lUQ0hfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9kZXF1ZSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvZGVxdWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ0MmVjMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvZGVxdWUKQEAgLTAsMCArMSw1NzkgQEAKKy8vIERlYnVnZ2luZyBkZXF1ZSBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvZGVxdWUKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX0RFUVVFCisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX0RFUVVFIDEKKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfc2VxdWVuY2UuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX2l0ZXJhdG9yLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fZGVidWcKK3sKKyAgLy8vIENsYXNzIHN0ZDo6ZGVxdWUgd2l0aCBzYWZldHkvY2hlY2tpbmcvZGVidWcgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyBkZXF1ZQorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjpkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+LAorICAgICAgcHVibGljIF9fZ251X2RlYnVnOjpfU2FmZV9zZXF1ZW5jZTxkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+ID4KKyAgICB7CisgICAgICB0eXBlZGVmICBfR0xJQkNYWF9TVERfQzo6ZGVxdWU8X1RwLCBfQWxsb2NhdG9yPiBfQmFzZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgX0Jhc2VfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9FcXVhbF90bzxfQmFzZV9jb25zdF9pdGVyYXRvcj4gX0VxdWFsOworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlZmVyZW5jZSAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9yZWZlcmVuY2UgICAgICAgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjxfQmFzZV9pdGVyYXRvcixkZXF1ZT4KKwkJCQkJCSAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2NvbnN0X2l0ZXJhdG9yLGRlcXVlPgorCQkJCQkJICAgIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgdHlwZWRlZiBfVHAJCQkJICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9BbGxvY2F0b3IJCQkgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpwb2ludGVyICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3BvaW50ZXIgICAgICAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgLy8gMjMuMi4xLjEgY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICAgIGV4cGxpY2l0CisgICAgICBkZXF1ZShjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fYSkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBleHBsaWNpdAorICAgICAgZGVxdWUoc2l6ZV90eXBlIF9fbikKKyAgICAgIDogX0Jhc2UoX19uKSB7IH0KKworICAgICAgZGVxdWUoc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbHVlLAorCSAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX192YWx1ZSwgX19hKSB7IH0KKyNlbHNlCisgICAgICBleHBsaWNpdAorICAgICAgZGVxdWUoc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbHVlID0gX1RwKCksCisJICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX3ZhbHVlLCBfX2EpIHsgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyNlbmRpZgorICAgICAgICBkZXF1ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorCTogX0Jhc2UoX19nbnVfZGVidWc6Ol9fYmFzZShfX2dudV9kZWJ1Zzo6X19jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LAorCQkJCQkJCQkgICAgIF9fbGFzdCkpLAorCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCksIF9fYSkKKyAgICAgICAgeyB9CisKKyAgICAgIGRlcXVlKGNvbnN0IGRlcXVlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkgeyB9CisKKyAgICAgIGRlcXVlKGNvbnN0IF9CYXNlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBkZXF1ZShkZXF1ZSYmIF9feCkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpCisgICAgICB7IHRoaXMtPl9NX3N3YXAoX194KTsgfQorCisgICAgICBkZXF1ZShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbCwgX19hKSB7IH0KKyNlbmRpZgorCisgICAgICB+ZGVxdWUoKSBfR0xJQkNYWF9OT0VYQ0VQVCB7IH0KKworICAgICAgZGVxdWUmCisgICAgICBvcGVyYXRvcj0oY29uc3QgZGVxdWUmIF9feCkKKyAgICAgIHsKKwkqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9feDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGRlcXVlJgorICAgICAgb3BlcmF0b3I9KGRlcXVlJiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJX19nbGliY3h4X2NoZWNrX3NlbGZfbW92ZV9hc3NpZ24oX194KTsKKwljbGVhcigpOworCXN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGRlcXVlJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCSpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX19sOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyNlbmRpZgorICAgICAgICB2b2lkCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgX0Jhc2U6OmFzc2lnbihfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZmlyc3QpLAorCQkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpKTsKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJfQorCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3QpCisgICAgICB7CisJX0Jhc2U6OmFzc2lnbihfX24sIF9fdCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIGFzc2lnbihpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwlfQmFzZTo6YXNzaWduKF9fbCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB1c2luZyBfQmFzZTo6Z2V0X2FsbG9jYXRvcjsKKworICAgICAgLy8gaXRlcmF0b3JzOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorI2VuZGlmCisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01faW52YWxpZGF0ZV9hZnRlcl9udGgoZGlmZmVyZW5jZV90eXBlIF9fbikKKyAgICAgIHsKKwl0eXBlZGVmIF9fZ251X2RlYnVnOjpfQWZ0ZXJfbnRoX2Zyb208X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9BZnRlcl9udGg7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfQWZ0ZXJfbnRoKF9fbiwgX0Jhc2U6OmJlZ2luKCkpKTsKKyAgICAgIH0KKyAgICAgIAorICAgIHB1YmxpYzoKKyAgICAgIC8vIDIzLjIuMS4yIGNhcGFjaXR5OgorICAgICAgdXNpbmcgX0Jhc2U6OnNpemU7CisgICAgICB1c2luZyBfQmFzZTo6bWF4X3NpemU7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3opCisgICAgICB7CisJYm9vbCBfX2ludmFsaWRhdGVfYWxsID0gX19zeiA+IHRoaXMtPnNpemUoKTsKKwlpZiAoX19zeiA8IHRoaXMtPnNpemUoKSkKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWZ0ZXJfbnRoKF9fc3opOworCisJX0Jhc2U6OnJlc2l6ZShfX3N6KTsKKworCWlmIChfX2ludmFsaWRhdGVfYWxsKQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6LCBjb25zdCBfVHAmIF9fYykKKyAgICAgIHsKKwlib29sIF9faW52YWxpZGF0ZV9hbGwgPSBfX3N6ID4gdGhpcy0+c2l6ZSgpOworCWlmIChfX3N6IDwgdGhpcy0+c2l6ZSgpKQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hZnRlcl9udGgoX19zeik7CisKKwlfQmFzZTo6cmVzaXplKF9fc3osIF9fYyk7CisKKwlpZiAoX19pbnZhbGlkYXRlX2FsbCkKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6LCBfVHAgX19jID0gX1RwKCkpCisgICAgICB7CisJYm9vbCBfX2ludmFsaWRhdGVfYWxsID0gX19zeiA+IHRoaXMtPnNpemUoKTsKKwlpZiAoX19zeiA8IHRoaXMtPnNpemUoKSkKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWZ0ZXJfbnRoKF9fc3opOworCisJX0Jhc2U6OnJlc2l6ZShfX3N6LCBfX2MpOworCisJaWYgKF9faW52YWxpZGF0ZV9hbGwpCisJICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBzaHJpbmtfdG9fZml0KCkKKyAgICAgIHsKKwlpZiAoX0Jhc2U6Ol9NX3Nocmlua190b19maXQoKSkKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgdXNpbmcgX0Jhc2U6OmVtcHR5OworCisgICAgICAvLyBlbGVtZW50IGFjY2VzczoKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19zdWJzY3JpcHQoX19uKTsKKwlyZXR1cm4gX01fYmFzZSgpW19fbl07CisgICAgICB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19zdWJzY3JpcHQoX19uKTsKKwlyZXR1cm4gX01fYmFzZSgpW19fbl07CisgICAgICB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjphdDsKKworICAgICAgcmVmZXJlbmNlCisgICAgICBmcm9udCgpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJcmV0dXJuIF9CYXNlOjpmcm9udCgpOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGZyb250KCkgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKTsKKwlyZXR1cm4gX0Jhc2U6OmZyb250KCk7CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgYmFjaygpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJcmV0dXJuIF9CYXNlOjpiYWNrKCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgYmFjaygpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJcmV0dXJuIF9CYXNlOjpiYWNrKCk7CisgICAgICB9CisKKyAgICAgIC8vIDIzLjIuMS4zIG1vZGlmaWVyczoKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfZnJvbnQoY29uc3QgX1RwJiBfX3gpCisgICAgICB7CisJX0Jhc2U6OnB1c2hfZnJvbnQoX194KTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBwdXNoX2JhY2soY29uc3QgX1RwJiBfX3gpCisgICAgICB7CisJX0Jhc2U6OnB1c2hfYmFjayhfX3gpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBwdXNoX2Zyb250KF9UcCYmIF9feCkKKyAgICAgIHsgZW1wbGFjZV9mcm9udChzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKF9UcCYmIF9feCkKKyAgICAgIHsgZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShfX3gpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBlbXBsYWNlX2Zyb250KF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIF9CYXNlOjplbXBsYWNlX2Zyb250KHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgZW1wbGFjZV9iYWNrKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIF9CYXNlOjplbXBsYWNlX2JhY2soc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgZW1wbGFjZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCSAgX0Jhc2VfaXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6ZW1wbGFjZShfX3Bvc2l0aW9uLmJhc2UoKSwKKwkJCQkJCXN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9fcmVzLCB0aGlzKTsKKwl9CisjZW5kaWYKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCBfVHAmIF9feCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCV9CYXNlX2l0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLmJhc2UoKSwgX194KTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiBpdGVyYXRvcihfX3JlcywgdGhpcyk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9UcCYmIF9feCkKKyAgICAgIHsgcmV0dXJuIGVtcGxhY2UoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3AsIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCV9CYXNlOjppbnNlcnQoX19wLCBfX2wpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX194KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3NpdGlvbik7CisJX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLmJhc2UoKSwgX19uLCBfX3gpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyNlbmRpZgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLAorCSAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnRfcmFuZ2UoX19wb3NpdGlvbiwgX19maXJzdCwgX19sYXN0KTsKKwkgIF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCQkJCSAgIF9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSk7CisJICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCX0KKworICAgICAgdm9pZAorICAgICAgcG9wX2Zyb250KCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfQmFzZTo6YmVnaW4oKSkpOworCV9CYXNlOjpwb3BfZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcG9wX2JhY2soKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKC0tX0Jhc2U6OmVuZCgpKSk7CisJX0Jhc2U6OnBvcF9iYWNrKCk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZShfX3Bvc2l0aW9uKTsKKwlfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9fcG9zaXRpb24uYmFzZSgpOworCWlmIChfX3ZpY3RpbSA9PSBfQmFzZTo6YmVnaW4oKSB8fCBfX3ZpY3RpbSA9PSBfQmFzZTo6ZW5kKCktMSkKKwkgIHsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX192aWN0aW0pKTsKKwkgICAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX3ZpY3RpbSksIHRoaXMpOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgX0Jhc2VfaXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6ZXJhc2UoX192aWN0aW0pOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCSAgICByZXR1cm4gaXRlcmF0b3IoX19yZXMsIHRoaXMpOworCSAgfQorICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAxNTEuIGNhbid0IGN1cnJlbnRseSBjbGVhcigpIGVtcHR5IGNvbnRhaW5lcgorCV9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisJaWYgKF9fZmlyc3QuYmFzZSgpID09IF9fbGFzdC5iYXNlKCkpCisJICByZXR1cm4gX19maXJzdDsKKyAgICAgICAgZWxzZSBpZiAoX19maXJzdC5iYXNlKCkgPT0gX0Jhc2U6OmJlZ2luKCkKKwkJIHx8IF9fbGFzdC5iYXNlKCkgPT0gX0Jhc2U6OmVuZCgpKQorCSAgeworCSAgICB0aGlzLT5fTV9kZXRhY2hfc2luZ3VsYXIoKTsKKwkgICAgZm9yIChfQmFzZV9pdGVyYXRvciBfX3Bvc2l0aW9uID0gX19maXJzdC5iYXNlKCk7CisJCSBfX3Bvc2l0aW9uICE9IF9fbGFzdC5iYXNlKCk7ICsrX19wb3NpdGlvbikKKwkgICAgICB7CisJCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fcG9zaXRpb24pKTsKKwkgICAgICB9CisJICAgIF9fdHJ5CisJICAgICAgeworCQlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fZmlyc3QuYmFzZSgpLCBfX2xhc3QuYmFzZSgpKSwKKwkJCQl0aGlzKTsKKwkgICAgICB9CisJICAgIF9fY2F0Y2goLi4uKQorCSAgICAgIHsKKwkJdGhpcy0+X01fcmV2YWxpZGF0ZV9zaW5ndWxhcigpOworCQlfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgICB9CisJICB9CisJZWxzZQorCSAgeworCSAgICBfQmFzZV9pdGVyYXRvciBfX3JlcyA9IF9CYXNlOjplcmFzZShfX2ZpcnN0LmJhc2UoKSwKKwkJCQkJCV9fbGFzdC5iYXNlKCkpOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCSAgICByZXR1cm4gaXRlcmF0b3IoX19yZXMsIHRoaXMpOworCSAgfQorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKGRlcXVlJiBfX3gpCisgICAgICB7CisJX0Jhc2U6OnN3YXAoX194KTsKKwl0aGlzLT5fTV9zd2FwKF9feCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlfQmFzZTo6Y2xlYXIoKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBfR0xJQkNYWF9OT0VYQ0VQVCAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVCB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID09IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSAhPSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDw9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsIGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX2RlYnVnCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL2Zvcm1hdHRlci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9mb3JtYXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzY1ZTFhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9mb3JtYXR0ZXIuaApAQCAtMCwwICsxLDQ2MiBAQAorLy8gRGVidWctbW9kZSBlcnJvciBmb3JtYXR0aW5nIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9mb3JtYXR0ZXIuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfRk9STUFUVEVSX0gKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfRk9STUFUVEVSX0ggMQorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL2NwcF90eXBlX3RyYWl0cy5oPgorI2luY2x1ZGUgPHR5cGVpbmZvPgorCituYW1lc3BhY2UgX19nbnVfZGVidWcKK3sKKyAgdXNpbmcgc3RkOjp0eXBlX2luZm87CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGJvb2wgX19jaGVja19zaW5ndWxhcihfSXRlcmF0b3ImKTsKKworICBjbGFzcyBfU2FmZV9zZXF1ZW5jZV9iYXNlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGNsYXNzIF9TYWZlX2l0ZXJhdG9yOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGNsYXNzIF9TYWZlX2xvY2FsX2l0ZXJhdG9yOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBjbGFzcyBfU2FmZV9zZXF1ZW5jZTsKKworICBlbnVtIF9EZWJ1Z19tc2dfaWQKKyAgeworICAgIC8vIEdlbmVyYWwgY2hlY2tzCisgICAgX19tc2dfdmFsaWRfcmFuZ2UsCisgICAgX19tc2dfaW5zZXJ0X3Npbmd1bGFyLAorICAgIF9fbXNnX2luc2VydF9kaWZmZXJlbnQsCisgICAgX19tc2dfZXJhc2VfYmFkLAorICAgIF9fbXNnX2VyYXNlX2RpZmZlcmVudCwKKyAgICBfX21zZ19zdWJzY3JpcHRfb29iLAorICAgIF9fbXNnX2VtcHR5LAorICAgIF9fbXNnX3VucGFydGl0aW9uZWQsCisgICAgX19tc2dfdW5wYXJ0aXRpb25lZF9wcmVkLAorICAgIF9fbXNnX3Vuc29ydGVkLAorICAgIF9fbXNnX3Vuc29ydGVkX3ByZWQsCisgICAgX19tc2dfbm90X2hlYXAsCisgICAgX19tc2dfbm90X2hlYXBfcHJlZCwKKyAgICAvLyBzdGQ6OmJpdHNldCBjaGVja3MKKyAgICBfX21zZ19iYWRfYml0c2V0X3dyaXRlLAorICAgIF9fbXNnX2JhZF9iaXRzZXRfcmVhZCwKKyAgICBfX21zZ19iYWRfYml0c2V0X2ZsaXAsCisgICAgLy8gc3RkOjpsaXN0IGNoZWNrcworICAgIF9fbXNnX3NlbGZfc3BsaWNlLAorICAgIF9fbXNnX3NwbGljZV9hbGxvYywKKyAgICBfX21zZ19zcGxpY2VfYmFkLAorICAgIF9fbXNnX3NwbGljZV9vdGhlciwKKyAgICBfX21zZ19zcGxpY2Vfb3ZlcmxhcCwKKyAgICAvLyBpdGVyYXRvciBjaGVja3MKKyAgICBfX21zZ19pbml0X3Npbmd1bGFyLAorICAgIF9fbXNnX2luaXRfY29weV9zaW5ndWxhciwKKyAgICBfX21zZ19pbml0X2NvbnN0X3Npbmd1bGFyLAorICAgIF9fbXNnX2NvcHlfc2luZ3VsYXIsCisgICAgX19tc2dfYmFkX2RlcmVmLAorICAgIF9fbXNnX2JhZF9pbmMsCisgICAgX19tc2dfYmFkX2RlYywKKyAgICBfX21zZ19pdGVyX3N1YnNjcmlwdF9vb2IsCisgICAgX19tc2dfYWR2YW5jZV9vb2IsCisgICAgX19tc2dfcmV0cmVhdF9vb2IsCisgICAgX19tc2dfaXRlcl9jb21wYXJlX2JhZCwKKyAgICBfX21zZ19jb21wYXJlX2RpZmZlcmVudCwKKyAgICBfX21zZ19pdGVyX29yZGVyX2JhZCwKKyAgICBfX21zZ19vcmRlcl9kaWZmZXJlbnQsCisgICAgX19tc2dfZGlzdGFuY2VfYmFkLAorICAgIF9fbXNnX2Rpc3RhbmNlX2RpZmZlcmVudCwKKyAgICAvLyBpc3RyZWFtX2l0ZXJhdG9yCisgICAgX19tc2dfZGVyZWZfaXN0cmVhbSwKKyAgICBfX21zZ19pbmNfaXN0cmVhbSwKKyAgICAvLyBvc3RyZWFtX2l0ZXJhdG9yCisgICAgX19tc2dfb3V0cHV0X29zdHJlYW0sCisgICAgLy8gaXN0cmVhbWJ1Zl9pdGVyYXRvcgorICAgIF9fbXNnX2RlcmVmX2lzdHJlYW1idWYsCisgICAgX19tc2dfaW5jX2lzdHJlYW1idWYsCisgICAgLy8gZm9yd2FyZF9saXN0CisgICAgX19tc2dfaW5zZXJ0X2FmdGVyX2VuZCwKKyAgICBfX21zZ19lcmFzZV9hZnRlcl9iYWQsCisgICAgX19tc2dfdmFsaWRfcmFuZ2UyLAorICAgIC8vIHVub3JkZXJlZCBjb250YWluZXIgbG9jYWwgaXRlcmF0b3JzCisgICAgX19tc2dfbG9jYWxfaXRlcl9jb21wYXJlX2JhZCwKKyAgICBfX21zZ19ub25fZW1wdHlfcmFuZ2UsCisgICAgLy8gc2VsZiBtb3ZlIGFzc2lnbgorICAgIF9fbXNnX3NlbGZfbW92ZV9hc3NpZ24sCisgICAgLy8gdW5vcmRlcmVkIGNvbnRhaW5lciBidWNrZXRzCisgICAgX19tc2dfYnVja2V0X2luZGV4X29vYiwKKyAgICBfX21zZ192YWxpZF9sb2FkX2ZhY3RvciwKKyAgICBfX21zZ19lcXVhbF9hbGxvY3MKKyAgfTsKKworICBjbGFzcyBfRXJyb3JfZm9ybWF0dGVyCisgIHsKKyAgICAvLy8gV2hldGhlciBhbiBpdGVyYXRvciBpcyBjb25zdGFudCwgbXV0YWJsZSwgb3IgdW5rbm93bgorICAgIGVudW0gX0NvbnN0bmVzcworICAgIHsKKyAgICAgIF9fdW5rbm93bl9jb25zdG5lc3MsCisgICAgICBfX2NvbnN0X2l0ZXJhdG9yLAorICAgICAgX19tdXRhYmxlX2l0ZXJhdG9yLAorICAgICAgX19sYXN0X2NvbnN0bmVzcworICAgIH07CisKKyAgICAvLyBUaGUgc3RhdGUgb2YgdGhlIGl0ZXJhdG9yIChmaW5lLWdyYWluZWQpLCBpZiB3ZSBrbm93IGl0LgorICAgIGVudW0gX0l0ZXJhdG9yX3N0YXRlCisgICAgeworICAgICAgX191bmtub3duX3N0YXRlLAorICAgICAgX19zaW5ndWxhciwgICAgICAvLyBzaW5ndWxhciwgbWF5IHN0aWxsIGJlIGF0dGFjaGVkIHRvIGEgc2VxdWVuY2UKKyAgICAgIF9fYmVnaW4sICAgICAgICAgLy8gZGVyZWZlcmVuY2VhYmxlLCBhbmQgYXQgdGhlIGJlZ2lubmluZworICAgICAgX19taWRkbGUsICAgICAgICAvLyBkZXJlZmVyZW5jZWFibGUsIG5vdCBhdCB0aGUgYmVnaW5uaW5nCisgICAgICBfX2VuZCwgICAgICAgICAgIC8vIHBhc3QtdGhlLWVuZCwgbWF5IGJlIGF0IGJlZ2lubmluZyBpZiBzZXF1ZW5jZSBlbXB0eQorICAgICAgX19iZWZvcmVfYmVnaW4sICAvLyBiZWZvcmUgYmVnaW4KKyAgICAgIF9fbGFzdF9zdGF0ZQorICAgIH07CisKKyAgICAvLyBUYWdzIGRlbm90aW5nIHRoZSB0eXBlIG9mIHBhcmFtZXRlciBmb3IgY29uc3RydWN0aW9uCisgICAgc3RydWN0IF9Jc19pdGVyYXRvciB7IH07CisgICAgc3RydWN0IF9Jc19zZXF1ZW5jZSB7IH07CisKKyAgICAvLyBBIHBhcmFtZXRlciB0aGF0IG1heSBiZSByZWZlcmVuY2VkIGJ5IGFuIGVycm9yIG1lc3NhZ2UKKyAgICBzdHJ1Y3QgX1BhcmFtZXRlcgorICAgIHsKKyAgICAgIGVudW0KKyAgICAgIHsKKwlfX3VudXNlZF9wYXJhbSwKKwlfX2l0ZXJhdG9yLAorCV9fc2VxdWVuY2UsCisJX19pbnRlZ2VyLAorCV9fc3RyaW5nCisgICAgICB9IF9NX2tpbmQ7CisKKyAgICAgIHVuaW9uCisgICAgICB7CisJLy8gV2hlbiBfTV9raW5kID09IF9faXRlcmF0b3IKKwlzdHJ1Y3QKKwl7CisJICBjb25zdCBjaGFyKiAgICAgIF9NX25hbWU7CisJICBjb25zdCB2b2lkKiAgICAgIF9NX2FkZHJlc3M7CisJICBjb25zdCB0eXBlX2luZm8qIF9NX3R5cGU7CisJICBfQ29uc3RuZXNzICAgICAgIF9NX2NvbnN0bmVzczsKKwkgIF9JdGVyYXRvcl9zdGF0ZSAgX01fc3RhdGU7CisJICBjb25zdCB2b2lkKiAgICAgIF9NX3NlcXVlbmNlOworCSAgY29uc3QgdHlwZV9pbmZvKiBfTV9zZXFfdHlwZTsKKwl9IF9NX2l0ZXJhdG9yOworCisJLy8gV2hlbiBfTV9raW5kID09IF9fc2VxdWVuY2UKKwlzdHJ1Y3QKKwl7CisJICBjb25zdCBjaGFyKiAgICAgIF9NX25hbWU7CisJICBjb25zdCB2b2lkKiAgICAgIF9NX2FkZHJlc3M7CisJICBjb25zdCB0eXBlX2luZm8qIF9NX3R5cGU7CisJfSBfTV9zZXF1ZW5jZTsKKworCS8vIFdoZW4gX01fa2luZCA9PSBfX2ludGVnZXIKKwlzdHJ1Y3QKKwl7CisJICBjb25zdCBjaGFyKiBfTV9uYW1lOworCSAgbG9uZyAgICAgICAgX01fdmFsdWU7CisJfSBfTV9pbnRlZ2VyOworCisJLy8gV2hlbiBfTV9raW5kID09IF9fc3RyaW5nCisJc3RydWN0CisJeworCSAgY29uc3QgY2hhciogX01fbmFtZTsKKwkgIGNvbnN0IGNoYXIqIF9NX3ZhbHVlOworCX0gX01fc3RyaW5nOworICAgICAgfSBfTV92YXJpYW50OworCisgICAgICBfUGFyYW1ldGVyKCkgOiBfTV9raW5kKF9fdW51c2VkX3BhcmFtKSwgX01fdmFyaWFudCgpIHsgfQorCisgICAgICBfUGFyYW1ldGVyKGxvbmcgX192YWx1ZSwgY29uc3QgY2hhciogX19uYW1lKSAKKyAgICAgIDogX01fa2luZChfX2ludGVnZXIpLCBfTV92YXJpYW50KCkKKyAgICAgIHsKKwlfTV92YXJpYW50Ll9NX2ludGVnZXIuX01fbmFtZSA9IF9fbmFtZTsKKwlfTV92YXJpYW50Ll9NX2ludGVnZXIuX01fdmFsdWUgPSBfX3ZhbHVlOworICAgICAgfQorCisgICAgICBfUGFyYW1ldGVyKGNvbnN0IGNoYXIqIF9fdmFsdWUsIGNvbnN0IGNoYXIqIF9fbmFtZSkgCisgICAgICA6IF9NX2tpbmQoX19zdHJpbmcpLCBfTV92YXJpYW50KCkKKyAgICAgIHsKKwlfTV92YXJpYW50Ll9NX3N0cmluZy5fTV9uYW1lID0gX19uYW1lOworCV9NX3ZhcmlhbnQuX01fc3RyaW5nLl9NX3ZhbHVlID0gX192YWx1ZTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgICAgIF9QYXJhbWV0ZXIoY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2l0LAorCQkgICBjb25zdCBjaGFyKiBfX25hbWUsIF9Jc19pdGVyYXRvcikKKwk6IF9NX2tpbmQoX19pdGVyYXRvciksICBfTV92YXJpYW50KCkKKyAgICAgICAgeworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9uYW1lID0gX19uYW1lOworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9hZGRyZXNzID0gJl9faXQ7CisjaWZkZWYgX19HWFhfUlRUSQorCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV90eXBlID0gJnR5cGVpZChfX2l0KTsKKyNlbHNlCisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3R5cGUgPSAwOworI2VuZGlmCisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX2NvbnN0bmVzcyA9CisJICAgIHN0ZDo6X19hcmVfc2FtZTxfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4sCisJICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfU2VxdWVuY2U6Oml0ZXJhdG9yPjo6CisJICAgICAgX192YWx1ZSA/IF9fbXV0YWJsZV9pdGVyYXRvciA6IF9fY29uc3RfaXRlcmF0b3I7CisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3NlcXVlbmNlID0gX19pdC5fTV9nZXRfc2VxdWVuY2UoKTsKKyNpZmRlZiBfX0dYWF9SVFRJCisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3NlcV90eXBlID0gJnR5cGVpZChfU2VxdWVuY2UpOworI2Vsc2UKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc2VxX3R5cGUgPSAwOworI2VuZGlmCisKKwkgIGlmIChfX2l0Ll9NX3Npbmd1bGFyKCkpCisJICAgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc3RhdGUgPSBfX3Npbmd1bGFyOworCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKF9faXQuX01faXNfYmVmb3JlX2JlZ2luKCkpCisJCV9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc3RhdGUgPSBfX2JlZm9yZV9iZWdpbjsKKwkgICAgICBlbHNlIGlmIChfX2l0Ll9NX2lzX2VuZCgpKQorCQlfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3N0YXRlID0gX19lbmQ7CisJICAgICAgZWxzZSBpZiAoX19pdC5fTV9pc19iZWdpbigpKQorCQlfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3N0YXRlID0gX19iZWdpbjsKKwkgICAgICBlbHNlCisJCV9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc3RhdGUgPSBfX21pZGRsZTsKKwkgICAgfQorCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisJX1BhcmFtZXRlcihjb25zdCBfU2FmZV9sb2NhbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9faXQsCisJCSAgIGNvbnN0IGNoYXIqIF9fbmFtZSwgX0lzX2l0ZXJhdG9yKQorCTogX01fa2luZChfX2l0ZXJhdG9yKSwgIF9NX3ZhcmlhbnQoKQorCXsKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fbmFtZSA9IF9fbmFtZTsKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fYWRkcmVzcyA9ICZfX2l0OworI2lmZGVmIF9fR1hYX1JUVEkKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fdHlwZSA9ICZ0eXBlaWQoX19pdCk7CisjZWxzZQorCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV90eXBlID0gMDsKKyNlbmRpZgorCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9jb25zdG5lc3MgPQorCSAgICBzdGQ6Ol9fYXJlX3NhbWU8X1NhZmVfbG9jYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+LAorCSAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1NlcXVlbmNlOjpsb2NhbF9pdGVyYXRvcj46OgorCSAgICAgIF9fdmFsdWUgPyBfX211dGFibGVfaXRlcmF0b3IgOiBfX2NvbnN0X2l0ZXJhdG9yOworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9zZXF1ZW5jZSA9IF9faXQuX01fZ2V0X3NlcXVlbmNlKCk7CisjaWZkZWYgX19HWFhfUlRUSQorCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9zZXFfdHlwZSA9ICZ0eXBlaWQoX1NlcXVlbmNlKTsKKyNlbHNlCisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3NlcV90eXBlID0gMDsKKyNlbmRpZgorCisJICBpZiAoX19pdC5fTV9zaW5ndWxhcigpKQorCSAgICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3N0YXRlID0gX19zaW5ndWxhcjsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChfX2l0Ll9NX2lzX2VuZCgpKQorCQlfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3N0YXRlID0gX19lbmQ7CisJICAgICAgZWxzZSBpZiAoX19pdC5fTV9pc19iZWdpbigpKQorCQlfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3N0YXRlID0gX19iZWdpbjsKKwkgICAgICBlbHNlCisJCV9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc3RhdGUgPSBfX21pZGRsZTsKKwkgICAgfQorCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1R5cGU+CisgICAgICAgIF9QYXJhbWV0ZXIoY29uc3QgX1R5cGUqJiBfX2l0LCBjb25zdCBjaGFyKiBfX25hbWUsIF9Jc19pdGVyYXRvcikKKyAgICAgICAgOiBfTV9raW5kKF9faXRlcmF0b3IpLCBfTV92YXJpYW50KCkKKyAgICAgICAgeworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9uYW1lID0gX19uYW1lOworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9hZGRyZXNzID0gJl9faXQ7CisjaWZkZWYgX19HWFhfUlRUSQorCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV90eXBlID0gJnR5cGVpZChfX2l0KTsKKyNlbHNlCisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3R5cGUgPSAwOworI2VuZGlmCisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX2NvbnN0bmVzcyA9IF9fbXV0YWJsZV9pdGVyYXRvcjsKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc3RhdGUgPSBfX2l0PyBfX3Vua25vd25fc3RhdGUgOiBfX3Npbmd1bGFyOworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9zZXF1ZW5jZSA9IDA7CisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3NlcV90eXBlID0gMDsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UeXBlPgorICAgICAgICBfUGFyYW1ldGVyKF9UeXBlKiYgX19pdCwgY29uc3QgY2hhciogX19uYW1lLCBfSXNfaXRlcmF0b3IpCisgICAgICAgIDogX01fa2luZChfX2l0ZXJhdG9yKSwgX01fdmFyaWFudCgpCisgICAgICAgIHsKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fbmFtZSA9IF9fbmFtZTsKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fYWRkcmVzcyA9ICZfX2l0OworI2lmZGVmIF9fR1hYX1JUVEkKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fdHlwZSA9ICZ0eXBlaWQoX19pdCk7CisjZWxzZQorCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV90eXBlID0gMDsKKyNlbmRpZgorCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9jb25zdG5lc3MgPSBfX2NvbnN0X2l0ZXJhdG9yOworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9zdGF0ZSA9IF9faXQ/IF9fdW5rbm93bl9zdGF0ZSA6IF9fc2luZ3VsYXI7CisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3NlcXVlbmNlID0gMDsKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc2VxX3R5cGUgPSAwOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgICAgICBfUGFyYW1ldGVyKGNvbnN0IF9JdGVyYXRvciYgX19pdCwgY29uc3QgY2hhciogX19uYW1lLCBfSXNfaXRlcmF0b3IpCisgICAgICAgIDogX01fa2luZChfX2l0ZXJhdG9yKSwgX01fdmFyaWFudCgpCisgICAgICAgIHsKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fbmFtZSA9IF9fbmFtZTsKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fYWRkcmVzcyA9ICZfX2l0OworI2lmZGVmIF9fR1hYX1JUVEkKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fdHlwZSA9ICZ0eXBlaWQoX19pdCk7CisjZWxzZQorCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV90eXBlID0gMDsKKyNlbmRpZgorCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9jb25zdG5lc3MgPSBfX3Vua25vd25fY29uc3RuZXNzOworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9zdGF0ZSA9CisJICAgIF9fZ251X2RlYnVnOjpfX2NoZWNrX3Npbmd1bGFyKF9faXQpPyBfX3Npbmd1bGFyIDogX191bmtub3duX3N0YXRlOworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9zZXF1ZW5jZSA9IDA7CisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3NlcV90eXBlID0gMDsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICAgICAgX1BhcmFtZXRlcihjb25zdCBfU2FmZV9zZXF1ZW5jZTxfU2VxdWVuY2U+JiBfX3NlcSwKKwkJICAgY29uc3QgY2hhciogX19uYW1lLCBfSXNfc2VxdWVuY2UpCisgICAgICAgIDogX01fa2luZChfX3NlcXVlbmNlKSwgX01fdmFyaWFudCgpCisgICAgICAgIHsKKwkgIF9NX3ZhcmlhbnQuX01fc2VxdWVuY2UuX01fbmFtZSA9IF9fbmFtZTsKKwkgIF9NX3ZhcmlhbnQuX01fc2VxdWVuY2UuX01fYWRkcmVzcyA9CisJICAgIHN0YXRpY19jYXN0PGNvbnN0IF9TZXF1ZW5jZSo+KCZfX3NlcSk7CisjaWZkZWYgX19HWFhfUlRUSQorCSAgX01fdmFyaWFudC5fTV9zZXF1ZW5jZS5fTV90eXBlID0gJnR5cGVpZChfU2VxdWVuY2UpOworI2Vsc2UKKwkgIF9NX3ZhcmlhbnQuX01fc2VxdWVuY2UuX01fdHlwZSA9IDA7CisjZW5kaWYKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICAgICAgX1BhcmFtZXRlcihjb25zdCBfU2VxdWVuY2UmIF9fc2VxLCBjb25zdCBjaGFyKiBfX25hbWUsIF9Jc19zZXF1ZW5jZSkKKyAgICAgICAgOiBfTV9raW5kKF9fc2VxdWVuY2UpLCBfTV92YXJpYW50KCkKKyAgICAgICAgeworCSAgX01fdmFyaWFudC5fTV9zZXF1ZW5jZS5fTV9uYW1lID0gX19uYW1lOworCSAgX01fdmFyaWFudC5fTV9zZXF1ZW5jZS5fTV9hZGRyZXNzID0gJl9fc2VxOworI2lmZGVmIF9fR1hYX1JUVEkKKwkgIF9NX3ZhcmlhbnQuX01fc2VxdWVuY2UuX01fdHlwZSA9ICZ0eXBlaWQoX1NlcXVlbmNlKTsKKyNlbHNlCisJICBfTV92YXJpYW50Ll9NX3NlcXVlbmNlLl9NX3R5cGUgPSAwOworI2VuZGlmCisJfQorCisgICAgICB2b2lkCisgICAgICBfTV9wcmludF9maWVsZChjb25zdCBfRXJyb3JfZm9ybWF0dGVyKiBfX2Zvcm1hdHRlciwKKwkJICAgICBjb25zdCBjaGFyKiBfX25hbWUpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBfTV9wcmludF9kZXNjcmlwdGlvbihjb25zdCBfRXJyb3JfZm9ybWF0dGVyKiBfX2Zvcm1hdHRlcikgY29uc3Q7CisgICAgfTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgX1BhcmFtZXRlcjsKKworICBwdWJsaWM6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgICAgY29uc3QgX0Vycm9yX2Zvcm1hdHRlciYKKyAgICAgIF9NX2l0ZXJhdG9yKGNvbnN0IF9JdGVyYXRvciYgX19pdCwgY29uc3QgY2hhciogX19uYW1lID0gMCkgIGNvbnN0CisgICAgICB7CisJaWYgKF9NX251bV9wYXJhbWV0ZXJzIDwgc3RkOjpzaXplX3QoX19tYXhfcGFyYW1ldGVycykpCisJICBfTV9wYXJhbWV0ZXJzW19NX251bV9wYXJhbWV0ZXJzKytdID0gX1BhcmFtZXRlcihfX2l0LCBfX25hbWUsCisJCQkJCQkJICBfSXNfaXRlcmF0b3IoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgY29uc3QgX0Vycm9yX2Zvcm1hdHRlciYKKyAgICBfTV9pbnRlZ2VyKGxvbmcgX192YWx1ZSwgY29uc3QgY2hhciogX19uYW1lID0gMCkgY29uc3QKKyAgICB7CisgICAgICBpZiAoX01fbnVtX3BhcmFtZXRlcnMgPCBzdGQ6OnNpemVfdChfX21heF9wYXJhbWV0ZXJzKSkKKwlfTV9wYXJhbWV0ZXJzW19NX251bV9wYXJhbWV0ZXJzKytdID0gX1BhcmFtZXRlcihfX3ZhbHVlLCBfX25hbWUpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGNvbnN0IF9FcnJvcl9mb3JtYXR0ZXImCisgICAgX01fc3RyaW5nKGNvbnN0IGNoYXIqIF9fdmFsdWUsIGNvbnN0IGNoYXIqIF9fbmFtZSA9IDApIGNvbnN0CisgICAgeworICAgICAgaWYgKF9NX251bV9wYXJhbWV0ZXJzIDwgc3RkOjpzaXplX3QoX19tYXhfcGFyYW1ldGVycykpCisJX01fcGFyYW1ldGVyc1tfTV9udW1fcGFyYW1ldGVycysrXSA9IF9QYXJhbWV0ZXIoX192YWx1ZSwgX19uYW1lKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgICBjb25zdCBfRXJyb3JfZm9ybWF0dGVyJgorICAgICAgX01fc2VxdWVuY2UoY29uc3QgX1NlcXVlbmNlJiBfX3NlcSwgY29uc3QgY2hhciogX19uYW1lID0gMCkgY29uc3QKKyAgICAgIHsKKwlpZiAoX01fbnVtX3BhcmFtZXRlcnMgPCBzdGQ6OnNpemVfdChfX21heF9wYXJhbWV0ZXJzKSkKKwkgIF9NX3BhcmFtZXRlcnNbX01fbnVtX3BhcmFtZXRlcnMrK10gPSBfUGFyYW1ldGVyKF9fc2VxLCBfX25hbWUsCisJCQkJCQkJICBfSXNfc2VxdWVuY2UoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgY29uc3QgX0Vycm9yX2Zvcm1hdHRlciYKKyAgICBfTV9tZXNzYWdlKGNvbnN0IGNoYXIqIF9fdGV4dCkgY29uc3QKKyAgICB7IF9NX3RleHQgPSBfX3RleHQ7IHJldHVybiAqdGhpczsgfQorCisgICAgY29uc3QgX0Vycm9yX2Zvcm1hdHRlciYKKyAgICBfTV9tZXNzYWdlKF9EZWJ1Z19tc2dfaWQgX19pZCkgY29uc3QgdGhyb3cgKCk7CisKKyAgICBfR0xJQkNYWF9OT1JFVFVSTiB2b2lkCisgICAgX01fZXJyb3IoKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIF9FcnJvcl9mb3JtYXR0ZXIoY29uc3QgY2hhciogX19maWxlLCBzdGQ6OnNpemVfdCBfX2xpbmUpCisgICAgOiBfTV9maWxlKF9fZmlsZSksIF9NX2xpbmUoX19saW5lKSwgX01fbnVtX3BhcmFtZXRlcnMoMCksIF9NX3RleHQoMCksCisgICAgICBfTV9tYXhfbGVuZ3RoKDc4KSwgX01fY29sdW1uKDEpLCBfTV9maXJzdF9saW5lKHRydWUpLCBfTV93b3Jkd3JhcChmYWxzZSkKKyAgICB7IF9NX2dldF9tYXhfbGVuZ3RoKCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2Zvcm1hdF93b3JkKGNoYXIqLCBpbnQsIGNvbnN0IGNoYXIqLCBfVHApIGNvbnN0IHRocm93ICgpOworCisgICAgdm9pZAorICAgIF9NX3ByaW50X3dvcmQoY29uc3QgY2hhciogX193b3JkKSBjb25zdDsKKworICAgIHZvaWQKKyAgICBfTV9wcmludF9zdHJpbmcoY29uc3QgY2hhciogX19zdHJpbmcpIGNvbnN0OworCisgICAgdm9pZAorICAgIF9NX2dldF9tYXhfbGVuZ3RoKCkgY29uc3QgdGhyb3cgKCk7CisKKyAgICBlbnVtIHsgX19tYXhfcGFyYW1ldGVycyA9IDkgfTsKKworICAgIGNvbnN0IGNoYXIqICAgICAgICAgX01fZmlsZTsKKyAgICBzdGQ6OnNpemVfdCAgICAgICAgIF9NX2xpbmU7CisgICAgbXV0YWJsZSBfUGFyYW1ldGVyICBfTV9wYXJhbWV0ZXJzW19fbWF4X3BhcmFtZXRlcnNdOworICAgIG11dGFibGUgc3RkOjpzaXplX3QgX01fbnVtX3BhcmFtZXRlcnM7CisgICAgbXV0YWJsZSBjb25zdCBjaGFyKiBfTV90ZXh0OworICAgIG11dGFibGUgc3RkOjpzaXplX3QgX01fbWF4X2xlbmd0aDsKKyAgICBlbnVtIHsgX01faW5kZW50ID0gNCB9IDsKKyAgICBtdXRhYmxlIHN0ZDo6c2l6ZV90IF9NX2NvbHVtbjsKKyAgICBtdXRhYmxlIGJvb2wgICAgICAgIF9NX2ZpcnN0X2xpbmU7CisgICAgbXV0YWJsZSBib29sICAgICAgICBfTV93b3Jkd3JhcDsKKworICBwdWJsaWM6CisgICAgc3RhdGljIF9FcnJvcl9mb3JtYXR0ZXIKKyAgICBfTV9hdChjb25zdCBjaGFyKiBfX2ZpbGUsIHN0ZDo6c2l6ZV90IF9fbGluZSkKKyAgICB7IHJldHVybiBfRXJyb3JfZm9ybWF0dGVyKF9fZmlsZSwgX19saW5lKTsgfQorICB9OworfSAvLyBuYW1lc3BhY2UgX19nbnVfZGVidWcKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL2ZvcndhcmRfbGlzdCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvZm9yd2FyZF9saXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYTJlOWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL2ZvcndhcmRfbGlzdApAQCAtMCwwICsxLDgwMSBAQAorLy8gPGZvcndhcmRfbGlzdD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL2ZvcndhcmRfbGlzdAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfRk9SV0FSRF9MSVNUCisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX0ZPUldBUkRfTElTVCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGZvcndhcmRfbGlzdD4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX3NlcXVlbmNlLmg+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9pdGVyYXRvci5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX2RlYnVnCit7CisgIC8vLyBDbGFzcyBzdGQ6OmZvcndhcmRfbGlzdCB3aXRoIHNhZmV0eS9jaGVja2luZy9kZWJ1ZyBpbnN0cnVtZW50YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8X1RwPiA+CisgICAgY2xhc3MgZm9yd2FyZF9saXN0CisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6OmZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4sCisgICAgICBwdWJsaWMgX19nbnVfZGVidWc6Ol9TYWZlX3NlcXVlbmNlPGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6OmZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4gX0Jhc2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yICAgICAgIF9CYXNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgX0Jhc2VfY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2FsbG9jX3RyYWl0czxfQWxsb2M+Ojp0ZW1wbGF0ZQorICAgICAgICByZWJpbmQ8X0dMSUJDWFhfU1REX0M6Ol9Gd2RfbGlzdF9ub2RlPF9UcD4+OjpvdGhlciBfTm9kZV9hbGxvY190eXBlOworCisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6X19hbGxvY190cmFpdHM8X05vZGVfYWxsb2NfdHlwZT4gX05vZGVfYWxsb2NfdHJhaXRzOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2l0ZXJhdG9yLAorCQkJCQkgIGZvcndhcmRfbGlzdD4gaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjxfQmFzZV9jb25zdF9pdGVyYXRvciwKKwkJCQkJICBmb3J3YXJkX2xpc3Q+IGNvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9BbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpwb2ludGVyICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3BvaW50ZXIgICAgICAgICBjb25zdF9wb2ludGVyOworCisgICAgICAvLyAyMy4yLjMuMSBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgZXhwbGljaXQKKyAgICAgIGZvcndhcmRfbGlzdChjb25zdCBfQWxsb2MmIF9fYWwgPSBfQWxsb2MoKSkKKyAgICAgIDogX0Jhc2UoX19hbCkgeyB9CisKKyAgICAgIGZvcndhcmRfbGlzdChjb25zdCBmb3J3YXJkX2xpc3QmIF9fbGlzdCwgY29uc3QgX0FsbG9jJiBfX2FsKQorICAgICAgOiBfQmFzZShfX2xpc3QsIF9fYWwpCisgICAgICB7IH0KKworICAgICAgZm9yd2FyZF9saXN0KGZvcndhcmRfbGlzdCYmIF9fbGlzdCwgY29uc3QgX0FsbG9jJiBfX2FsKQorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX19saXN0Ll9NX2Jhc2UoKSksIF9fYWwpCisgICAgICB7CisJaWYgKF9fbGlzdC5nZXRfYWxsb2NhdG9yKCkgPT0gX19hbCkKKwkgIHRoaXMtPl9NX3N3YXAoX19saXN0KTsKKwllbHNlCisJICBfX2xpc3QuX01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGZvcndhcmRfbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCBfQWxsb2MmIF9fYWwgPSBfQWxsb2MoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2FsKQorICAgICAgeyB9CisKKyAgICAgIGZvcndhcmRfbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgX0FsbG9jJiBfX2FsID0gX0FsbG9jKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX192YWx1ZSwgX19hbCkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKwlmb3J3YXJkX2xpc3QoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0FsbG9jJiBfX2FsID0gX0FsbG9jKCkpCisgICAgICAgIDogX0Jhc2UoX19nbnVfZGVidWc6Ol9fYmFzZShfX2dudV9kZWJ1Zzo6X19jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LAorCQkJCQkJCQkgICAgIF9fbGFzdCkpLAorCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCksIF9fYWwpCisgICAgICAgIHsgfQorCisgICAgICBmb3J3YXJkX2xpc3QoY29uc3QgZm9yd2FyZF9saXN0JiBfX2xpc3QpCisgICAgICA6IF9CYXNlKF9fbGlzdCkKKyAgICAgIHsgfQorCisgICAgICBmb3J3YXJkX2xpc3QoZm9yd2FyZF9saXN0JiYgX19saXN0KSBub2V4Y2VwdAorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX19saXN0Ll9NX2Jhc2UoKSkpCisgICAgICB7CisJdGhpcy0+X01fc3dhcChfX2xpc3QpOworICAgICAgfQorCisgICAgICBmb3J3YXJkX2xpc3Qoc3RkOjppbml0aWFsaXplcl9saXN0PF9UcD4gX19pbCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBfQWxsb2MmIF9fYWwgPSBfQWxsb2MoKSkKKyAgICAgIDogX0Jhc2UoX19pbCwgX19hbCkKKyAgICAgIHsgfQorCisgICAgICB+Zm9yd2FyZF9saXN0KCkgbm9leGNlcHQKKyAgICAgIHsgfQorCisgICAgICBmb3J3YXJkX2xpc3QmCisgICAgICBvcGVyYXRvcj0oY29uc3QgZm9yd2FyZF9saXN0JiBfX2xpc3QpCisgICAgICB7CisJc3RhdGljX2Nhc3Q8X0Jhc2UmPigqdGhpcykgPSBfX2xpc3Q7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGZvcndhcmRfbGlzdCYKKyAgICAgIG9wZXJhdG9yPShmb3J3YXJkX2xpc3QmJiBfX2xpc3QpCisgICAgICBub2V4Y2VwdChfTm9kZV9hbGxvY190cmFpdHM6Ol9TX25vdGhyb3dfbW92ZSgpKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19zZWxmX21vdmVfYXNzaWduKF9fbGlzdCk7CisJYm9vbCB4ZmVyX21lbW9yeSA9IF9Ob2RlX2FsbG9jX3RyYWl0czo6X1NfcHJvcGFnYXRlX29uX21vdmVfYXNzaWduKCkKKwkgICAgfHwgX19saXN0LmdldF9hbGxvY2F0b3IoKSA9PSB0aGlzLT5nZXRfYWxsb2NhdG9yKCk7CisJc3RhdGljX2Nhc3Q8X0Jhc2UmPigqdGhpcykgPSBzdGQ6Om1vdmUoX19saXN0KTsKKwlpZiAoeGZlcl9tZW1vcnkpCisJICB0aGlzLT5fTV9zd2FwKF9fbGlzdCk7CisJZWxzZQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlfX2xpc3QuX01faW52YWxpZGF0ZV9hbGwoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGZvcndhcmRfbGlzdCYKKyAgICAgIG9wZXJhdG9yPShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2lsKQorICAgICAgeworCXN0YXRpY19jYXN0PF9CYXNlJj4oKnRoaXMpID0gX19pbDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorCXZvaWQKKyAgICAgICAgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJICBfQmFzZTo6YXNzaWduKF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCkpOworCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCkKKyAgICAgIHsKKwlfQmFzZTo6YXNzaWduKF9fbiwgX192YWwpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2lnbihzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2lsKQorICAgICAgeworCV9CYXNlOjphc3NpZ24oX19pbCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworICAgICAgdXNpbmcgX0Jhc2U6OmdldF9hbGxvY2F0b3I7CisKKyAgICAgIC8vIGl0ZXJhdG9yczoKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZm9yZV9iZWdpbigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6YmVmb3JlX2JlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWZvcmVfYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZm9yZV9iZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpjYmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWZvcmVfYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmNiZWZvcmVfYmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmNlbmQoKSwgdGhpcyk7IH0KKworICAgICAgdXNpbmcgX0Jhc2U6OmVtcHR5OworICAgICAgdXNpbmcgX0Jhc2U6Om1heF9zaXplOworCisgICAgICAvLyBlbGVtZW50IGFjY2VzczoKKworICAgICAgcmVmZXJlbmNlCisgICAgICBmcm9udCgpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJcmV0dXJuIF9CYXNlOjpmcm9udCgpOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGZyb250KCkgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKTsKKwlyZXR1cm4gX0Jhc2U6OmZyb250KCk7CisgICAgICB9CisKKyAgICAgIC8vIG1vZGnvrIFlcnM6CisKKyAgICAgIHVzaW5nIF9CYXNlOjplbXBsYWNlX2Zyb250OworICAgICAgdXNpbmcgX0Jhc2U6OnB1c2hfZnJvbnQ7CisKKyAgICAgIHZvaWQKKyAgICAgIHBvcF9mcm9udCgpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihbdGhpc10oX0Jhc2VfY29uc3RfaXRlcmF0b3IgX19pdCkKKwkgIHsgcmV0dXJuIF9faXQgPT0gdGhpcy0+X01fYmFzZSgpLmNiZWdpbigpOyB9KTsKKwlfQmFzZTo6cG9wX2Zyb250KCk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgX19nbGliY3h4X2NoZWNrX2luc2VydF9hZnRlcihfX3Bvcyk7CisJICByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVtcGxhY2VfYWZ0ZXIoX19wb3MuYmFzZSgpLAorCQkJCQlzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLAorCQkJICB0aGlzKTsKKyAgICAgICAJfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0X2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBjb25zdCBfVHAmIF9fdmFsKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnRfYWZ0ZXIoX19wb3MpOworCXJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0X2FmdGVyKF9fcG9zLmJhc2UoKSwgX192YWwpLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgX1RwJiYgX192YWwpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2luc2VydF9hZnRlcihfX3Bvcyk7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnRfYWZ0ZXIoX19wb3MuYmFzZSgpLCBzdGQ6Om1vdmUoX192YWwpKSwKKwkJICAgICAgIAl0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0X2FmdGVyKF9fcG9zKTsKKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydF9hZnRlcihfX3Bvcy5iYXNlKCksIF9fbiwgX192YWwpLAorCQkgICAgICAgCXRoaXMpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgaW5zZXJ0X2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0X3JhbmdlX2FmdGVyKF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QpOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnRfYWZ0ZXIoX19wb3MuYmFzZSgpLAorCQkJCQkgICAgICBfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZmlyc3QpLAorCQkJCQkgICAgICBfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCkpLAorCQkJICB0aGlzKTsKKyAgICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0X2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2lsKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnRfYWZ0ZXIoX19wb3MpOworCXJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0X2FmdGVyKF9fcG9zLmJhc2UoKSwgX19pbCksIHRoaXMpOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9CYXNlX2l0ZXJhdG9yCisgICAgICBfTV9lcmFzZV9hZnRlcihfQmFzZV9jb25zdF9pdGVyYXRvciBfX3BvcykKKyAgICAgIHsKKwlfQmFzZV9jb25zdF9pdGVyYXRvciBfX25leHQgPSBzdGQ6Om5leHQoX19wb3MpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoW19fbmV4dF0oX0Jhc2VfY29uc3RfaXRlcmF0b3IgX19pdCkKKwkgIHsgcmV0dXJuIF9faXQgPT0gX19uZXh0OyB9KTsKKwlyZXR1cm4gX0Jhc2U6OmVyYXNlX2FmdGVyKF9fcG9zKTsKKyAgICAgIH0KKyAgICBwdWJsaWM6CisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlX2FmdGVyKF9fcG9zKTsKKwlyZXR1cm4gaXRlcmF0b3IoX01fZXJhc2VfYWZ0ZXIoX19wb3MuYmFzZSgpKSwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZV9hZnRlcihfX3BvcywgX19sYXN0KTsKKwlmb3IgKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9fdmljdGltID0gc3RkOjpuZXh0KF9fcG9zLmJhc2UoKSk7CisJICAgIF9fdmljdGltICE9IF9fbGFzdC5iYXNlKCk7ICsrX192aWN0aW0pCisJICB7CisJICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX3ZpY3RpbSAhPSBfQmFzZTo6ZW5kKCksCisJCQkJICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9yYW5nZTIpCisJCQkJICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX3BvcywgInBvcyIpCisJCQkJICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihbX192aWN0aW1dKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJICAgICAgeyByZXR1cm4gX19pdCA9PSBfX3ZpY3RpbTsgfSk7CisJICB9CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZV9hZnRlcihfX3Bvcy5iYXNlKCksIF9fbGFzdC5iYXNlKCkpLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgc3dhcChmb3J3YXJkX2xpc3QmIF9fbGlzdCkKKyAgICAgIG5vZXhjZXB0KF9Ob2RlX2FsbG9jX3RyYWl0czo6X1Nfbm90aHJvd19zd2FwKCkpCisgICAgICB7CisJaWYgKCFfTm9kZV9hbGxvY190cmFpdHM6Ol9TX3Byb3BhZ2F0ZV9vbl9zd2FwKCkpCisJICBfX2dsaWJjeHhfY2hlY2tfZXF1YWxfYWxsb2NzKF9fbGlzdCk7CisJX0Jhc2U6OnN3YXAoX19saXN0KTsKKwl0aGlzLT5fTV9zd2FwKF9fbGlzdCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeikKKyAgICAgIHsKKwl0aGlzLT5fTV9kZXRhY2hfc2luZ3VsYXIoKTsKKworCS8vIGlmIF9fc3ogPCBzaXplKCksIGludmFsaWRhdGUgYWxsIGl0ZXJhdG9ycyBpbiBbYmVnaW4rX19zeiwgZW5kKCkKKwlfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9CYXNlOjpiZWdpbigpOworCV9CYXNlX2l0ZXJhdG9yIF9fZW5kID0gX0Jhc2U6OmVuZCgpOworCWZvciAoc2l6ZV90eXBlIF9faSA9IF9fc3o7IF9fdmljdGltICE9IF9fZW5kICYmIF9faSA+IDA7IC0tX19pKQorCSAgKytfX3ZpY3RpbTsKKworCWZvciAoOyBfX3ZpY3RpbSAhPSBfX2VuZDsgKytfX3ZpY3RpbSkKKwkgIHsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihbX192aWN0aW1dKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJICAgICAgeyByZXR1cm4gX19pdCA9PSBfX3ZpY3RpbTsgfSk7CisJICB9CisKKwlfX3RyeQorCSAgeworCSAgICBfQmFzZTo6cmVzaXplKF9fc3opOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICB0aGlzLT5fTV9yZXZhbGlkYXRlX3Npbmd1bGFyKCk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6LCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCkKKyAgICAgIHsKKwl0aGlzLT5fTV9kZXRhY2hfc2luZ3VsYXIoKTsKKworCS8vIGlmIF9fc3ogPCBzaXplKCksIGludmFsaWRhdGUgYWxsIGl0ZXJhdG9ycyBpbiBbYmVnaW4rX19zeiwgZW5kKCkpCisJX0Jhc2VfaXRlcmF0b3IgX192aWN0aW0gPSBfQmFzZTo6YmVnaW4oKTsKKwlfQmFzZV9pdGVyYXRvciBfX2VuZCA9IF9CYXNlOjplbmQoKTsKKwlmb3IgKHNpemVfdHlwZSBfX2kgPSBfX3N6OyBfX3ZpY3RpbSAhPSBfX2VuZCAmJiBfX2kgPiAwOyAtLV9faSkKKwkgICsrX192aWN0aW07CisKKwlmb3IgKDsgX192aWN0aW0gIT0gX19lbmQ7ICsrX192aWN0aW0pCisJICB7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoW19fdmljdGltXShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCSAgICAgIHsgcmV0dXJuIF9faXQgPT0gX192aWN0aW07IH0pOworCSAgfQorCisJX190cnkKKwkgIHsKKwkgICAgX0Jhc2U6OnJlc2l6ZShfX3N6LCBfX3ZhbCk7CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIHRoaXMtPl9NX3JldmFsaWRhdGVfc2luZ3VsYXIoKTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgICAgICAgfQorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIG5vZXhjZXB0CisgICAgICB7CisJX0Jhc2U6OmNsZWFyKCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworICAgICAgLy8gMjMuMi4zLjUgZm9yd2FyZF9saXN0IG9wZXJhdGlvbnM6CisgICAgICB2b2lkCisgICAgICBzcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIGZvcndhcmRfbGlzdCYmIF9fbGlzdCkKKyAgICAgIHsKKyAgICAgICAgX19nbGliY3h4X2NoZWNrX2luc2VydF9hZnRlcihfX3Bvcyk7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKCZfX2xpc3QgIT0gdGhpcywKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3NlbGZfc3BsaWNlKQorCQkJICAgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpKTsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saXN0LmdldF9hbGxvY2F0b3IoKSA9PSB0aGlzLT5nZXRfYWxsb2NhdG9yKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19zcGxpY2VfYWxsb2MpCisJCQkgICAgICAuX01fc2VxdWVuY2UoKnRoaXMpCisJCQkgICAgICAuX01fc2VxdWVuY2UoX19saXN0LCAiX19saXN0IikpOworCXRoaXMtPl9NX3RyYW5zZmVyX2Zyb21faWYoX19saXN0LCBbJl9fbGlzdF0oX0Jhc2VfY29uc3RfaXRlcmF0b3IgX19pdCkKKwkgIHsKKwkgICAgcmV0dXJuIF9faXQgIT0gX19saXN0Ll9NX2Jhc2UoKS5jYmVmb3JlX2JlZ2luKCkKKwkJICAgJiYgX19pdCAhPSBfX2xpc3QuX01fYmFzZSgpLmVuZCgpOworCSAgfSk7CisJX0Jhc2U6OnNwbGljZV9hZnRlcihfX3Bvcy5iYXNlKCksIHN0ZDo6bW92ZShfX2xpc3QuX01fYmFzZSgpKSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgZm9yd2FyZF9saXN0JiBfX2xpc3QpCisgICAgICB7IHNwbGljZV9hZnRlcihfX3Bvcywgc3RkOjptb3ZlKF9fbGlzdCkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgZm9yd2FyZF9saXN0JiYgX19saXN0LAorCQkgICBjb25zdF9pdGVyYXRvciBfX2kpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2luc2VydF9hZnRlcihfX3Bvcyk7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9faS5fTV9iZWZvcmVfZGVyZWZlcmVuY2VhYmxlKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19zcGxpY2VfYmFkKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKF9faSwgIl9faSIpKTsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19pLl9NX2F0dGFjaGVkX3RvKCZfX2xpc3QpLAorCQkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfc3BsaWNlX290aGVyKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKF9faSwgIl9faSIpCisJCQkgICAgICAuX01fc2VxdWVuY2UoX19saXN0LCAiX19saXN0IikpOworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xpc3QuZ2V0X2FsbG9jYXRvcigpID09IHRoaXMtPmdldF9hbGxvY2F0b3IoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3NwbGljZV9hbGxvYykKKwkJCSAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcykKKwkJCSAgICAgIC5fTV9zZXF1ZW5jZShfX2xpc3QsICJfX2xpc3QiKSk7CisKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMjUwLiBzcGxpY2luZyBpbnZhbGlkYXRlcyBpdGVyYXRvcnMKKwlfQmFzZV9jb25zdF9pdGVyYXRvciBfX25leHQgPSBzdGQ6Om5leHQoX19pLmJhc2UoKSk7CisJdGhpcy0+X01fdHJhbnNmZXJfZnJvbV9pZihfX2xpc3QsIFtfX25leHRdKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJICB7IHJldHVybiBfX2l0ID09IF9fbmV4dDsgfSk7CisJX0Jhc2U6OnNwbGljZV9hZnRlcihfX3Bvcy5iYXNlKCksIHN0ZDo6bW92ZShfX2xpc3QuX01fYmFzZSgpKSwKKwkJCSAgICBfX2kuYmFzZSgpKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgc3BsaWNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBmb3J3YXJkX2xpc3QmIF9fbGlzdCwKKwkJICAgY29uc3RfaXRlcmF0b3IgX19pKQorICAgICAgeyBzcGxpY2VfYWZ0ZXIoX19wb3MsIHN0ZDo6bW92ZShfX2xpc3QpLCBfX2kpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgZm9yd2FyZF9saXN0JiYgX19saXN0LAorCQkgICBjb25zdF9pdGVyYXRvciBfX2JlZm9yZSwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworICAgICAgICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0X2FmdGVyKF9fcG9zKTsKKwlfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX19iZWZvcmUsIF9fbGFzdCk7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fYmVmb3JlLl9NX2F0dGFjaGVkX3RvKCZfX2xpc3QpLAorCQkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfc3BsaWNlX290aGVyKQorCQkJICAgICAgLl9NX3NlcXVlbmNlKF9fbGlzdCwgImxpc3QiKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKF9fYmVmb3JlLCAiYmVmb3JlIikpOworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2JlZm9yZS5fTV9kZXJlZmVyZW5jZWFibGUoKQorCQkJICAgICAgfHwgX19iZWZvcmUuX01faXNfYmVmb3JlX2JlZ2luKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9yYW5nZTIpCisJCQkgICAgICAuX01fc2VxdWVuY2UoX19saXN0LCAibGlzdCIpCisJCQkgICAgICAuX01faXRlcmF0b3IoX19iZWZvcmUsICJiZWZvcmUiKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKF9fbGFzdCwgImxhc3QiKSk7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fYmVmb3JlICE9IF9fbGFzdCwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlMikKKwkJCSAgICAgIC5fTV9zZXF1ZW5jZShfX2xpc3QsICJsaXN0IikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcihfX2JlZm9yZSwgImJlZm9yZSIpCisJCQkgICAgICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saXN0LmdldF9hbGxvY2F0b3IoKSA9PSB0aGlzLT5nZXRfYWxsb2NhdG9yKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19zcGxpY2VfYWxsb2MpCisJCQkgICAgICAuX01fc2VxdWVuY2UoKnRoaXMpCisJCQkgICAgICAuX01fc2VxdWVuY2UoX19saXN0LCAiX19saXN0IikpOworCisJZm9yIChfQmFzZV9jb25zdF9pdGVyYXRvciBfX3RtcCA9IHN0ZDo6bmV4dChfX2JlZm9yZS5iYXNlKCkpOworCSAgICAgX190bXAgIT0gX19sYXN0LmJhc2UoKTsgKytfX3RtcCkKKwkgIHsKKwkgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fdG1wICE9IF9fbGlzdC5fTV9iYXNlKCkuZW5kKCksCisJCQkJICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9yYW5nZTIpCisJCQkJICAuX01fc2VxdWVuY2UoX19saXN0LCAibGlzdCIpCisJCQkJICAuX01faXRlcmF0b3IoX19iZWZvcmUsICJiZWZvcmUiKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fbGFzdCwgImxhc3QiKSk7CisJICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSgmX19saXN0ICE9IHRoaXMgfHwgX190bXAgIT0gX19wb3MuYmFzZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3NwbGljZV9vdmVybGFwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5fTV9pdGVyYXRvcihfX3RtcCwgInBvc2l0aW9uIikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2JlZm9yZSwgImJlZm9yZSIpCisJCQkJICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwkgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgICAvLyAyNTAuIHNwbGljaW5nIGludmFsaWRhdGVzIGl0ZXJhdG9ycworCSAgICB0aGlzLT5fTV90cmFuc2Zlcl9mcm9tX2lmKF9fbGlzdCwgW19fdG1wXShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCSAgICAgIHsgcmV0dXJuIF9faXQgPT0gX190bXA7IH0pOworCSAgfQorCisJX0Jhc2U6OnNwbGljZV9hZnRlcihfX3Bvcy5iYXNlKCksIHN0ZDo6bW92ZShfX2xpc3QuX01fYmFzZSgpKSwKKwkJCSAgICBfX2JlZm9yZS5iYXNlKCksIF9fbGFzdC5iYXNlKCkpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIGZvcndhcmRfbGlzdCYgX19saXN0LAorCQkgICBjb25zdF9pdGVyYXRvciBfX2JlZm9yZSwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyBzcGxpY2VfYWZ0ZXIoX19wb3MsIHN0ZDo6bW92ZShfX2xpc3QpLCBfX2JlZm9yZSwgX19sYXN0KTsgfQorCisgICAgICB2b2lkCisgICAgICByZW1vdmUoY29uc3QgX1RwJiBfX3ZhbCkKKyAgICAgIHsKKwlfQmFzZV9pdGVyYXRvciBfX3ggPSBfQmFzZTo6YmVmb3JlX2JlZ2luKCk7CisJX0Jhc2VfaXRlcmF0b3IgX19vbGQgPSBfX3grKzsKKwl3aGlsZSAoX194ICE9IF9CYXNlOjplbmQoKSkKKwkgIHsKKwkgICAgaWYgKCpfX3ggPT0gX192YWwpCisJICAgICAgX194ID0gX01fZXJhc2VfYWZ0ZXIoX19vbGQpOworCSAgICBlbHNlCisJICAgICAgX19vbGQgPSBfX3grKzsKKwkgIH0KKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByZWQ+CisgICAgICAgIHZvaWQKKyAgICAgICAgcmVtb3ZlX2lmKF9QcmVkIF9fcHJlZCkKKwl7CisJICBfQmFzZV9pdGVyYXRvciBfX3ggPSBfQmFzZTo6YmVmb3JlX2JlZ2luKCk7CisJICBfQmFzZV9pdGVyYXRvciBfX29sZCA9IF9feCsrOworCSAgd2hpbGUgKF9feCAhPSBfQmFzZTo6ZW5kKCkpCisJICAgIHsKKwkgICAgICBpZiAoX19wcmVkKCpfX3gpKQorCQlfX3ggPSBfTV9lcmFzZV9hZnRlcihfX29sZCk7CisJICAgICAgZWxzZQorCQlfX29sZCA9IF9feCsrOworCSAgICB9CisJfQorCisgICAgICB2b2lkCisgICAgICB1bmlxdWUoKQorICAgICAgeworCV9CYXNlX2l0ZXJhdG9yIF9fZmlyc3QgPSBfQmFzZTo6YmVnaW4oKTsKKwlfQmFzZV9pdGVyYXRvciBfX2xhc3QgPSBfQmFzZTo6ZW5kKCk7CisJaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCSAgcmV0dXJuOworCV9CYXNlX2l0ZXJhdG9yIF9fbmV4dCA9IHN0ZDo6bmV4dChfX2ZpcnN0KTsKKwl3aGlsZSAoX19uZXh0ICE9IF9fbGFzdCkKKwkgIHsKKwkgICAgaWYgKCpfX2ZpcnN0ID09ICpfX25leHQpCisJICAgICAgX19uZXh0ID0gX01fZXJhc2VfYWZ0ZXIoX19maXJzdCk7CisJICAgIGVsc2UKKwkgICAgICBfX2ZpcnN0ID0gX19uZXh0Kys7CisJICB9CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaW5QcmVkPgorICAgICAgICB2b2lkCisgICAgICAgIHVuaXF1ZShfQmluUHJlZCBfX2JpbmFyeV9wcmVkKQorCXsKKwkgIF9CYXNlX2l0ZXJhdG9yIF9fZmlyc3QgPSBfQmFzZTo6YmVnaW4oKTsKKwkgIF9CYXNlX2l0ZXJhdG9yIF9fbGFzdCA9IF9CYXNlOjplbmQoKTsKKwkgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwkgICAgcmV0dXJuOworCSAgX0Jhc2VfaXRlcmF0b3IgX19uZXh0ID0gc3RkOjpuZXh0KF9fZmlyc3QpOworCSAgd2hpbGUgKF9fbmV4dCAhPSBfX2xhc3QpCisJICAgIHsKKwkgICAgICBpZiAoX19iaW5hcnlfcHJlZCgqX19maXJzdCwgKl9fbmV4dCkpCisJCV9fbmV4dCA9IF9NX2VyYXNlX2FmdGVyKF9fZmlyc3QpOworCSAgICAgIGVsc2UKKwkJX19maXJzdCA9IF9fbmV4dCsrOworCSAgICB9CisJfQorCisgICAgICB2b2lkCisgICAgICBtZXJnZShmb3J3YXJkX2xpc3QmJiBfX2xpc3QpCisgICAgICB7CisJaWYgKHRoaXMgIT0gJl9fbGlzdCkKKwl7CisJICBfX2dsaWJjeHhfY2hlY2tfc29ydGVkKF9CYXNlOjpiZWdpbigpLCBfQmFzZTo6ZW5kKCkpOworCSAgX19nbGliY3h4X2NoZWNrX3NvcnRlZChfX2xpc3QuX01fYmFzZSgpLmJlZ2luKCksCisJCQkJIF9fbGlzdC5fTV9iYXNlKCkuZW5kKCkpOworCSAgdGhpcy0+X01fdHJhbnNmZXJfZnJvbV9pZihfX2xpc3QsIFsmX19saXN0XShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCSAgICB7CisJICAgICAgcmV0dXJuIF9faXQgIT0gX19saXN0Ll9NX2Jhc2UoKS5jYmVmb3JlX2JlZ2luKCkKKwkJICAgICAmJiBfX2l0ICE9IF9fbGlzdC5fTV9iYXNlKCkuY2VuZCgpOworCSAgICB9KTsKKwkgIF9CYXNlOjptZXJnZShzdGQ6Om1vdmUoX19saXN0Ll9NX2Jhc2UoKSkpOworCX0KKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgbWVyZ2UoZm9yd2FyZF9saXN0JiBfX2xpc3QpCisgICAgICB7IG1lcmdlKHN0ZDo6bW92ZShfX2xpc3QpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29tcD4KKyAgICAgICAgdm9pZAorICAgICAgICBtZXJnZShmb3J3YXJkX2xpc3QmJiBfX2xpc3QsIF9Db21wIF9fY29tcCkKKwl7CisJICBpZiAodGhpcyAhPSAmX19saXN0KQorCSAgeworCSAgICBfX2dsaWJjeHhfY2hlY2tfc29ydGVkX3ByZWQoX0Jhc2U6OmJlZ2luKCksIF9CYXNlOjplbmQoKSwgX19jb21wKTsKKwkgICAgX19nbGliY3h4X2NoZWNrX3NvcnRlZF9wcmVkKF9fbGlzdC5fTV9iYXNlKCkuYmVnaW4oKSwKKwkJCQkJX19saXN0Ll9NX2Jhc2UoKS5lbmQoKSwgX19jb21wKTsKKwkgICAgdGhpcy0+X01fdHJhbnNmZXJfZnJvbV9pZihfX2xpc3QsCisJCQkJICAgICAgWyZfX2xpc3RdKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJICAgICAgeworCSAgICAgICAgcmV0dXJuIF9faXQgIT0gX19saXN0Ll9NX2Jhc2UoKS5jYmVmb3JlX2JlZ2luKCkKKwkJICAgICAgICYmIF9faXQgIT0gX19saXN0Ll9NX2Jhc2UoKS5jZW5kKCk7CisJICAgICAgfSk7CisJICAgIF9CYXNlOjptZXJnZShzdGQ6Om1vdmUoX19saXN0Ll9NX2Jhc2UoKSksIF9fY29tcCk7CisJICB9CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29tcD4KKyAgICAgICAgdm9pZAorICAgICAgICBtZXJnZShmb3J3YXJkX2xpc3QmIF9fbGlzdCwgX0NvbXAgX19jb21wKQorICAgICAgICB7IG1lcmdlKHN0ZDo6bW92ZShfX2xpc3QpLCBfX2NvbXApOyB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjpzb3J0OworICAgICAgdXNpbmcgX0Jhc2U6OnJldmVyc2U7CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpIG5vZXhjZXB0ICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01faW52YWxpZGF0ZV9hbGwoKQorICAgICAgeworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoW3RoaXNdKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJICB7CisJICAgIHJldHVybiBfX2l0ICE9IHRoaXMtPl9NX2Jhc2UoKS5jYmVmb3JlX2JlZ2luKCkKKwkJICAgJiYgX19pdCAhPSB0aGlzLT5fTV9iYXNlKCkuY2VuZCgpOworCSAgfSk7CisgICAgICB9CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcl9iYXNlIF9TYWZlX2l0ZXJhdG9yX2Jhc2U7CisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX01fc3dhcF9hdXgoZm9yd2FyZF9saXN0JiBfX2xocywKKwkJICBfU2FmZV9pdGVyYXRvcl9iYXNlKiYgX19saHNfaXRlcmF0b3JzLAorCQkgIGZvcndhcmRfbGlzdCYgX19yaHMsCisJCSAgX1NhZmVfaXRlcmF0b3JfYmFzZSomIF9fcmhzX2l0ZXJhdG9ycyk7CisgICAgICB2b2lkIF9NX3N3YXAoZm9yd2FyZF9saXN0JiBfX2xpc3QpOworICAgIH07CisKKyAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9zd2FwX2F1eChmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkJX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yX2Jhc2UqJiBfX2xoc19pdGVyYXRvcnMsCisJCWZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fcmhzLAorCQlfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3JfYmFzZSomIF9fcmhzX2l0ZXJhdG9ycykKKyAgICB7CisgICAgICB1c2luZyBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3JfYmFzZTsKKyAgICAgIF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9fYmJlZ2luX2l0cyA9IDA7CisgICAgICBfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX2xhc3RfYmJlZ2luID0gMDsKKyAgICAgIGZvciAoX1NhZmVfaXRlcmF0b3JfYmFzZSogX19pdGVyID0gX19saHNfaXRlcmF0b3JzOyBfX2l0ZXI7KQorCXsKKwkgIC8vIEV2ZW4gaXRlcmF0b3IgYXJlIGNhc3RlZCB0byBjb25zdF9pdGVyYXRvciwgbm90IGEgcHJvYmxlbS4KKwkgIGNvbnN0X2l0ZXJhdG9yKiBfX3ZpY3RpbSA9IHN0YXRpY19jYXN0PGNvbnN0X2l0ZXJhdG9yKj4oX19pdGVyKTsKKwkgIF9faXRlciA9IF9faXRlci0+X01fbmV4dDsKKwkgIGlmIChfX3ZpY3RpbS0+YmFzZSgpID09IF9fcmhzLl9NX2Jhc2UoKS5jYmVmb3JlX2JlZ2luKCkpCisJICAgIHsKKwkgICAgICBfX3ZpY3RpbS0+X01fdW5saW5rKCk7CisJICAgICAgaWYgKF9fbGhzX2l0ZXJhdG9ycyA9PSBfX3ZpY3RpbSkKKwkJX19saHNfaXRlcmF0b3JzID0gX192aWN0aW0tPl9NX25leHQ7CisJICAgICAgaWYgKF9fYmJlZ2luX2l0cykKKwkJeworCQkgIF9fdmljdGltLT5fTV9uZXh0ID0gX19iYmVnaW5faXRzOworCQkgIF9fYmJlZ2luX2l0cy0+X01fcHJpb3IgPSBfX3ZpY3RpbTsKKwkJfQorCSAgICAgIGVsc2UKKwkJX19sYXN0X2JiZWdpbiA9IF9fdmljdGltOworCSAgICAgIF9fYmJlZ2luX2l0cyA9IF9fdmljdGltOworCSAgICB9CisJICBlbHNlCisJICAgIF9fdmljdGltLT5fTV9zZXF1ZW5jZSA9ICZfX2xoczsKKwl9CisKKyAgICAgIGlmIChfX2JiZWdpbl9pdHMpCisJeworCSAgaWYgKF9fcmhzX2l0ZXJhdG9ycykKKwkgICAgeworCSAgICAgIF9fcmhzX2l0ZXJhdG9ycy0+X01fcHJpb3IgPSBfX2xhc3RfYmJlZ2luOworCSAgICAgIF9fbGFzdF9iYmVnaW4tPl9NX25leHQgPSBfX3Joc19pdGVyYXRvcnM7CisJICAgIH0KKwkgIF9fcmhzX2l0ZXJhdG9ycyA9IF9fYmJlZ2luX2l0czsKKwl9CisgICAgfQorCisgIC8qIFNwZWNpYWwgZm9yd2FyZF9saXN0IF9NX3N3YXAgdmVyc2lvbiB0aGF0IGRvIG5vdCBzd2FwIHRoZQorICAgKiBiZWZvcmUtYmVnaW4gb3duZXJzaGlwLiovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9zd2FwKGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbGlzdCkKKyAgICB7CisgICAgICBfX2dudV9jeHg6Ol9fc2NvcGVkX2xvY2sgc2VudHJ5KHRoaXMtPl9NX2dldF9tdXRleCgpKTsKKyAgICAgIHN0ZDo6c3dhcCh0aGlzLT5fTV9pdGVyYXRvcnMsIF9fbGlzdC5fTV9pdGVyYXRvcnMpOworICAgICAgc3RkOjpzd2FwKHRoaXMtPl9NX2NvbnN0X2l0ZXJhdG9ycywgX19saXN0Ll9NX2NvbnN0X2l0ZXJhdG9ycyk7CisgICAgICAvLyBVc2VsZXNzLCBhbHdheXMgMSBvbiBmb3J3YXJkX2xpc3QKKyAgICAgIC8vc3RkOjpzd2FwKHRoaXMtPl9NX3ZlcnNpb24sIF9fbGlzdC5fTV92ZXJzaW9uKTsKKyAgICAgIF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9fdGhpc19pdHMgPSB0aGlzLT5fTV9pdGVyYXRvcnM7CisgICAgICBfTV9zd2FwX2F1eChfX2xpc3QsIF9fbGlzdC5fTV9pdGVyYXRvcnMsICp0aGlzLCB0aGlzLT5fTV9pdGVyYXRvcnMpOworICAgICAgX1NhZmVfaXRlcmF0b3JfYmFzZSogX190aGlzX2NvbnN0X2l0cyA9IHRoaXMtPl9NX2NvbnN0X2l0ZXJhdG9yczsKKyAgICAgIF9NX3N3YXBfYXV4KF9fbGlzdCwgX19saXN0Ll9NX2NvbnN0X2l0ZXJhdG9ycywgKnRoaXMsCisJCSAgdGhpcy0+X01fY29uc3RfaXRlcmF0b3JzKTsKKyAgICAgIF9NX3N3YXBfYXV4KCp0aGlzLCBfX3RoaXNfaXRzLCBfX2xpc3QsIF9fbGlzdC5fTV9pdGVyYXRvcnMpOworICAgICAgX01fc3dhcF9hdXgoKnRoaXMsIF9fdGhpc19jb25zdF9pdHMsIF9fbGlzdCwgX19saXN0Ll9NX2NvbnN0X2l0ZXJhdG9ycyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgcmV0dXJuIF9fbHguX01fYmFzZSgpID09IF9fbHkuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IHJldHVybiBfX2x4Ll9NX2Jhc2UoKSA8IF9fbHkuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgcmV0dXJuICEoX19seCA9PSBfX2x5KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IHJldHVybiAoX19seSA8IF9fbHgpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHkpCisgICAgeyByZXR1cm4gIShfX2x4IDwgX19seSk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x4LAorICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IHJldHVybiAhKF9fbHkgPCBfX2x4KTsgfQorCisgIC8vLyBTZWUgc3RkOjpmb3J3YXJkX2xpc3Q6OnN3YXAoKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisJIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHkpCisgICAgeyBfX2x4LnN3YXAoX19seSk7IH0KKworfSAvLyBuYW1lc3BhY2UgX19kZWJ1ZworfSAvLyBuYW1lc3BhY2Ugc3RkCisKK25hbWVzcGFjZSBfX2dudV9kZWJ1ZworeworICB0ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX0JlZm9yZUJlZ2luSGVscGVyPHN0ZDo6X19kZWJ1Zzo6Zm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiA+CisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Ol9fZGVidWc6OmZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4gX1NlcXVlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIF9JdDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0OjppdGVyYXRvcl90eXBlIF9CYXNlSXQ7CisKKyAgICAgIHN0YXRpYyBib29sCisgICAgICBfU19JcyhfQmFzZUl0IF9faXQsIGNvbnN0IF9TZXF1ZW5jZSogX19zZXEpCisgICAgICB7IHJldHVybiBfX2l0ID09IF9fc2VxLT5fTV9iYXNlKCkuY2JlZm9yZV9iZWdpbigpOyB9CisKKyAgICAgIHN0YXRpYyBib29sCisgICAgICBfU19Jc19CZWdpbm5lc3QoX0Jhc2VJdCBfX2l0LCBjb25zdCBfU2VxdWVuY2UqIF9fc2VxKQorICAgICAgeyByZXR1cm4gX1NfSXMoX19pdCwgX19zZXEpOyB9CisgICAgfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL2Z1bmN0aW9ucy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9mdW5jdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTNjOTk2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9mdW5jdGlvbnMuaApAQCAtMCwwICsxLDQ1MCBAQAorLy8gRGVidWdnaW5nIHN1cHBvcnQgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL2Z1bmN0aW9ucy5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19GVU5DVElPTlNfSAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19GVU5DVElPTlNfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfdHlwZXMuaD4gLy8gZm9yIGl0ZXJhdG9yX3RyYWl0cywgY2F0ZWdvcmllcyBhbmQKKwkJCQkJICAvLyBfSXRlcl9iYXNlCisjaW5jbHVkZSA8Yml0cy9jcHBfdHlwZV90cmFpdHMuaD4gICAgICAgICAvLyBmb3IgX19pc19pbnRlZ2VyCisjaW5jbHVkZSA8ZGVidWcvZm9ybWF0dGVyLmg+CisKK25hbWVzcGFjZSBfX2dudV9kZWJ1ZworeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBjbGFzcyBfU2FmZV9pdGVyYXRvcjsKKworICAvLyBBbiBhcmJpdHJhcnkgaXRlcmF0b3IgcG9pbnRlciBpcyBub3Qgc2luZ3VsYXIuCisgIGlubGluZSBib29sCisgIF9fY2hlY2tfc2luZ3VsYXJfYXV4KGNvbnN0IHZvaWQqKSB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vIFdlIG1heSBoYXZlIGFuIGl0ZXJhdG9yIHRoYXQgZGVyaXZlcyBmcm9tIF9TYWZlX2l0ZXJhdG9yX2Jhc2UgYnV0IGlzbid0CisgIC8vIGEgX1NhZmVfaXRlcmF0b3IuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfc2luZ3VsYXIoX0l0ZXJhdG9yJiBfX3gpCisgICAgeyByZXR1cm4gX19jaGVja19zaW5ndWxhcl9hdXgoJl9feCk7IH0KKworICAvKiogTm9uLU5VTEwgcG9pbnRlcnMgYXJlIG5vbnNpbmd1bGFyLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX3Npbmd1bGFyKGNvbnN0IF9UcCogX19wdHIpCisgICAgeyByZXR1cm4gX19wdHIgPT0gMDsgfQorCisgIC8qKiBTYWZlIGl0ZXJhdG9ycyBrbm93IGlmIHRoZXkgYXJlIHNpbmd1bGFyLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfc2luZ3VsYXIoY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3gpCisgICAgeyByZXR1cm4gX194Ll9NX3Npbmd1bGFyKCk7IH0KKworICAvKiogQXNzdW1lIHRoYXQgc29tZSBhcmJpdHJhcnkgaXRlcmF0b3IgaXMgZGVyZWZlcmVuY2VhYmxlLCBiZWNhdXNlIHdlCisgICAgICBjYW4ndCBwcm92ZSB0aGF0IGl0IGlzbid0LiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX2RlcmVmZXJlbmNlYWJsZShfSXRlcmF0b3ImKQorICAgIHsgcmV0dXJuIHRydWU7IH0KKworICAvKiogTm9uLU5VTEwgcG9pbnRlcnMgYXJlIGRlcmVmZXJlbmNlYWJsZS4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19kZXJlZmVyZW5jZWFibGUoY29uc3QgX1RwKiBfX3B0cikKKyAgICB7IHJldHVybiBfX3B0cjsgfQorCisgIC8qKiBTYWZlIGl0ZXJhdG9ycyBrbm93IGlmIHRoZXkgYXJlIHNpbmd1bGFyLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfZGVyZWZlcmVuY2VhYmxlKGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX194KQorICAgIHsgcmV0dXJuIF9feC5fTV9kZXJlZmVyZW5jZWFibGUoKTsgfQorCisgIC8qKiBJZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMgaXMKKyAgICogIG5vbm5lZ2F0aXZlLCBhc3N1bWUgdGhlIHJhbmdlIGlzIHZhbGlkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX3ZhbGlkX3JhbmdlX2F1eDIoY29uc3QgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yJiBfX2ZpcnN0LAorCQkgICAgICAgY29uc3QgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yJiBfX2xhc3QsCisJCSAgICAgICBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsgcmV0dXJuIF9fbGFzdCAtIF9fZmlyc3QgPj0gMDsgfQorCisgIC8qKiBDYW4ndCB0ZXN0IGZvciBhIHZhbGlkIHJhbmdlIHdpdGggaW5wdXQgaXRlcmF0b3JzLCBiZWNhdXNlCisgICAqICBpdGVyYXRpb24gbWF5IGJlIGRlc3RydWN0aXZlLiBTbyB3ZSBqdXN0IGFzc3VtZSB0aGF0IHRoZSByYW5nZQorICAgKiAgaXMgdmFsaWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgX192YWxpZF9yYW5nZV9hdXgyKGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiwgY29uc3QgX0lucHV0SXRlcmF0b3ImLAorCQkgICAgICAgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpCisgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8qKiBXZSBzYXkgdGhhdCBpbnRlZ3JhbCB0eXBlcyBmb3IgYSB2YWxpZCByYW5nZSwgYW5kIGRlZmVyIHRvIG90aGVyCisgICAqICByb3V0aW5lcyB0byByZWFsaXplIHdoYXQgdG8gZG8gd2l0aCBpbnRlZ3JhbCB0eXBlcyBpbnN0ZWFkIG9mCisgICAqICBpdGVyYXRvcnMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlZ3JhbD4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fdmFsaWRfcmFuZ2VfYXV4KGNvbnN0IF9JbnRlZ3JhbCYsIGNvbnN0IF9JbnRlZ3JhbCYsIHN0ZDo6X190cnVlX3R5cGUpCisgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8qKiBXZSBoYXZlIGl0ZXJhdG9ycywgc28gZmlndXJlIG91dCB3aGF0IGtpbmQgb2YgaXRlcmF0b3JzIHRoYXQgYXJlCisgICAqICB0byBzZWUgaWYgd2UgY2FuIGNoZWNrIHRoZSByYW5nZSBhaGVhZCBvZiB0aW1lLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fdmFsaWRfcmFuZ2VfYXV4KGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiBfX2ZpcnN0LAorCQkgICAgICBjb25zdCBfSW5wdXRJdGVyYXRvciYgX19sYXN0LCBzdGQ6Ol9fZmFsc2VfdHlwZSkKKyAgeyByZXR1cm4gX192YWxpZF9yYW5nZV9hdXgyKF9fZmlyc3QsIF9fbGFzdCwKKwkJCSAgICAgIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7IH0KKworICAvKiogRG9uJ3Qga25vdyB3aGF0IHRoZXNlIGl0ZXJhdG9ycyBhcmUsIG9yIGlmIHRoZXkgYXJlIGV2ZW4KKyAgICogIGl0ZXJhdG9ycyAod2UgbWF5IGdldCBhbiBpbnRlZ3JhbCB0eXBlIGZvciBJbnB1dEl0ZXJhdG9yKSwgc28KKyAgICogIHNlZSBpZiB0aGV5IGFyZSBpbnRlZ3JhbCBhbmQgcGFzcyB0aGVtIG9uIHRvIHRoZSBuZXh0IHBoYXNlCisgICAqICBvdGhlcndpc2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgX192YWxpZF9yYW5nZShjb25zdCBfSW5wdXRJdGVyYXRvciYgX19maXJzdCwgY29uc3QgX0lucHV0SXRlcmF0b3ImIF9fbGFzdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19pc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9yPjo6X190eXBlIF9JbnRlZ3JhbDsKKyAgICAgIHJldHVybiBfX3ZhbGlkX3JhbmdlX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKyAgICB9CisKKyAgLyoqIFNhZmUgaXRlcmF0b3JzIGtub3cgaG93IHRvIGNoZWNrIGlmIHRoZXkgZm9ybSBhIHZhbGlkIHJhbmdlLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fdmFsaWRfcmFuZ2UoY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2ZpcnN0LAorCQkgIGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19sYXN0KQorICAgIHsgcmV0dXJuIF9fZmlyc3QuX01fdmFsaWRfcmFuZ2UoX19sYXN0KTsgfQorCisgIC8qKiBTYWZlIGxvY2FsIGl0ZXJhdG9ycyBrbm93IGhvdyB0byBjaGVjayBpZiB0aGV5IGZvcm0gYSB2YWxpZCByYW5nZS4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX3ZhbGlkX3JhbmdlKGNvbnN0IF9TYWZlX2xvY2FsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19maXJzdCwKKwkJICBjb25zdCBfU2FmZV9sb2NhbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fbGFzdCkKKyAgICB7IHJldHVybiBfX2ZpcnN0Ll9NX3ZhbGlkX3JhbmdlKF9fbGFzdCk7IH0KKworICAvKiBDaGVja3MgdGhhdCBbZmlyc3QsIGxhc3QpIGlzIGEgdmFsaWQgcmFuZ2UsIGFuZCB0aGVuIHJldHVybnMKKyAgICogX19maXJzdC4gVGhpcyByb3V0aW5lIGlzIHVzZWZ1bCB3aGVuIHdlIGNhbid0IHVzZSBhIHNlcGFyYXRlCisgICAqIGFzc2VydGlvbiBzdGF0ZW1lbnQgYmVjYXVzZSwgZS5nLiwgd2UgYXJlIGluIGEgY29uc3RydWN0b3IuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfSW5wdXRJdGVyYXRvcgorICAgIF9fY2hlY2tfdmFsaWRfcmFuZ2UoY29uc3QgX0lucHV0SXRlcmF0b3ImIF9fZmlyc3QsCisJCQljb25zdCBfSW5wdXRJdGVyYXRvciYgX19sYXN0CisJCQlfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICB9CisKKyAgLyoqIENoZWNrcyB0aGF0IF9fcyBpcyBub24tTlVMTCBvciBfX24gPT0gMCwgYW5kIHRoZW4gcmV0dXJucyBfX3MuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0ludGVnZXI+CisgICAgaW5saW5lIGNvbnN0IF9DaGFyVCoKKyAgICBfX2NoZWNrX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywKKwkJICAgY29uc3QgX0ludGVnZXImIF9fbiBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkpCisgICAgeworI2lmZGVmIF9HTElCQ1hYX0RFQlVHX1BFREFOVElDCisgICAgICBfX2dsaWJjeHhfYXNzZXJ0KF9fcyAhPSAwIHx8IF9fbiA9PSAwKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIF9fczsKKyAgICB9CisKKyAgLyoqIENoZWNrcyB0aGF0IF9fcyBpcyBub24tTlVMTCBhbmQgdGhlbiByZXR1cm5zIF9fcy4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZSBjb25zdCBfQ2hhclQqCisgICAgX19jaGVja19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MpCisgICAgeworI2lmZGVmIF9HTElCQ1hYX0RFQlVHX1BFREFOVElDCisgICAgICBfX2dsaWJjeHhfYXNzZXJ0KF9fcyAhPSAwKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIF9fczsKKyAgICB9CisKKyAgLy8gQ2FuJ3QgY2hlY2sgaWYgYW4gaW5wdXQgaXRlcmF0b3Igc2VxdWVuY2UgaXMgc29ydGVkLCBiZWNhdXNlIHdlCisgIC8vIGNhbid0IHN0ZXAgdGhyb3VnaCB0aGUgc2VxdWVuY2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19zb3J0ZWRfYXV4KGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiwgY29uc3QgX0lucHV0SXRlcmF0b3ImLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8gQ2FuIHZlcmlmeSBpZiBhIGZvcndhcmQgaXRlcmF0b3Igc2VxdWVuY2UgaXMgaW4gZmFjdCBzb3J0ZWQgdXNpbmcKKyAgLy8gc3RkOjpfX2lzX3NvcnRlZAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19zb3J0ZWRfYXV4KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworICAgICAgZm9yICgrK19fbmV4dDsgX19uZXh0ICE9IF9fbGFzdDsgX19maXJzdCA9IF9fbmV4dCwgKytfX25leHQpCisgICAgICAgIGlmICgqX19uZXh0IDwgKl9fZmlyc3QpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgLy8gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbiwgYXMgdGhlIGl0ZXJhdG9yIHJhbmdlIGhhcyBiZWVuIHZhbGlkYXRlZCwgY2hlY2sgb24KKyAgLy8gcmFuZG9tIGFjY2VzcyBzYWZlIGl0ZXJhdG9ycyBpcyBkb25lIHVzaW5nIHRoZSBiYXNlIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfc29ydGVkX2F1eChjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fZmlyc3QsCisJCSAgICAgICBjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fbGFzdCwKKwkJICAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgX190YWcpCisgIHsgcmV0dXJuIF9fY2hlY2tfc29ydGVkX2F1eChfX2ZpcnN0LmJhc2UoKSwgX19sYXN0LmJhc2UoKSwgX190YWcpOyB9CisKKyAgLy8gQ2FuJ3QgY2hlY2sgaWYgYW4gaW5wdXQgaXRlcmF0b3Igc2VxdWVuY2UgaXMgc29ydGVkLCBiZWNhdXNlIHdlIGNhbid0IHN0ZXAKKyAgLy8gdGhyb3VnaCB0aGUgc2VxdWVuY2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19zb3J0ZWRfYXV4KGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiwgY29uc3QgX0lucHV0SXRlcmF0b3ImLAorICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlLCBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8gQ2FuIHZlcmlmeSBpZiBhIGZvcndhcmQgaXRlcmF0b3Igc2VxdWVuY2UgaXMgaW4gZmFjdCBzb3J0ZWQgdXNpbmcKKyAgLy8gc3RkOjpfX2lzX3NvcnRlZAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19zb3J0ZWRfYXV4KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKyAgICAgIGZvciAoKytfX25leHQ7IF9fbmV4dCAhPSBfX2xhc3Q7IF9fZmlyc3QgPSBfX25leHQsICsrX19uZXh0KQorICAgICAgICBpZiAoX19wcmVkKCpfX25leHQsICpfX2ZpcnN0KSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvLyBGb3IgcGVyZm9ybWFuY2UgcmVhc29uLCBhcyB0aGUgaXRlcmF0b3IgcmFuZ2UgaGFzIGJlZW4gdmFsaWRhdGVkLCBjaGVjayBvbgorICAvLyByYW5kb20gYWNjZXNzIHNhZmUgaXRlcmF0b3JzIGlzIGRvbmUgdXNpbmcgdGhlIGJhc2UgaXRlcmF0b3IuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlLAorCSAgIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX3NvcnRlZF9hdXgoY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2ZpcnN0LAorCQkgICAgICAgY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xhc3QsCisJCSAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwKKwkJICAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgX190YWcpCisgIHsgcmV0dXJuIF9fY2hlY2tfc29ydGVkX2F1eChfX2ZpcnN0LmJhc2UoKSwgX19sYXN0LmJhc2UoKSwgX19wcmVkLCBfX3RhZyk7IH0KKworICAvLyBEZXRlcm1pbmUgaWYgYSBzZXF1ZW5jZSBpcyBzb3J0ZWQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19zb3J0ZWQoY29uc3QgX0lucHV0SXRlcmF0b3ImIF9fZmlyc3QsIGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiBfX2xhc3QpCisgICAgeworICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIDwgb3BlcmF0b3IgZm9yIGVsZW1lbnRzIGluIHRoZSBzZXF1ZW5jZSBpcyBhCisgICAgICAvLyBTdHJpY3RXZWFrT3JkZXJpbmcgYnkgY2hlY2tpbmcgdGhhdCBpdCBpcyBpcnJlZmxleGl2ZS4KKyAgICAgIF9fZ2xpYmN4eF9hc3NlcnQoX19maXJzdCA9PSBfX2xhc3QgfHwgISgqX19maXJzdCA8ICpfX2ZpcnN0KSk7CisKKyAgICAgIHJldHVybiBfX2NoZWNrX3NvcnRlZF9hdXgoX19maXJzdCwgX19sYXN0LAorCQkJCXN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19zb3J0ZWQoY29uc3QgX0lucHV0SXRlcmF0b3ImIF9fZmlyc3QsIGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgeworICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIHByZWRpY2F0ZSBpcyBTdHJpY3RXZWFrT3JkZXJpbmcgYnkgY2hlY2tpbmcgdGhhdCBpdAorICAgICAgLy8gaXMgaXJyZWZsZXhpdmUuCisgICAgICBfX2dsaWJjeHhfYXNzZXJ0KF9fZmlyc3QgPT0gX19sYXN0IHx8ICFfX3ByZWQoKl9fZmlyc3QsICpfX2ZpcnN0KSk7CisKKyAgICAgIHJldHVybiBfX2NoZWNrX3NvcnRlZF9hdXgoX19maXJzdCwgX19sYXN0LCBfX3ByZWQsCisJCQkJc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX3NvcnRlZF9zZXRfYXV4KGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiBfX2ZpcnN0LAorCQkJICAgY29uc3QgX0lucHV0SXRlcmF0b3ImIF9fbGFzdCwKKwkJCSAgIHN0ZDo6X190cnVlX3R5cGUpCisgICAgeyByZXR1cm4gX19jaGVja19zb3J0ZWQoX19maXJzdCwgX19sYXN0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19zb3J0ZWRfc2V0X2F1eChjb25zdCBfSW5wdXRJdGVyYXRvciYsCisJCQkgICBjb25zdCBfSW5wdXRJdGVyYXRvciYsCisJCQkgICBzdGQ6Ol9fZmFsc2VfdHlwZSkKKyAgICB7IHJldHVybiB0cnVlOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX3NvcnRlZF9zZXRfYXV4KGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiBfX2ZpcnN0LAorCQkJICAgY29uc3QgX0lucHV0SXRlcmF0b3ImIF9fbGFzdCwKKwkJCSAgIF9QcmVkaWNhdGUgX19wcmVkLCBzdGQ6Ol9fdHJ1ZV90eXBlKQorICAgIHsgcmV0dXJuIF9fY2hlY2tfc29ydGVkKF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19zb3J0ZWRfc2V0X2F1eChjb25zdCBfSW5wdXRJdGVyYXRvciYsCisJCQkgICBjb25zdCBfSW5wdXRJdGVyYXRvciYsIF9QcmVkaWNhdGUsCisJCQkgICBzdGQ6Ol9fZmFsc2VfdHlwZSkKKyAgICB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8gLi4uIHNwZWNpYWwgdmFyaWFudCB1c2VkIGluIHN0ZDo6bWVyZ2UsIHN0ZDo6aW5jbHVkZXMsIHN0ZDo6c2V0XyouCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19zb3J0ZWRfc2V0KGNvbnN0IF9JbnB1dEl0ZXJhdG9yMSYgX19maXJzdCwKKwkJICAgICAgIGNvbnN0IF9JbnB1dEl0ZXJhdG9yMSYgX19sYXN0LAorCQkgICAgICAgY29uc3QgX0lucHV0SXRlcmF0b3IyJikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IyPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19hcmVfc2FtZTxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+OjpfX3R5cGUKKwlfU2FtZVR5cGU7CisgICAgICByZXR1cm4gX19jaGVja19zb3J0ZWRfc2V0X2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9TYW1lVHlwZSgpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfc29ydGVkX3NldChjb25zdCBfSW5wdXRJdGVyYXRvcjEmIF9fZmlyc3QsCisJCSAgICAgICBjb25zdCBfSW5wdXRJdGVyYXRvcjEmIF9fbGFzdCwKKwkJICAgICAgIGNvbnN0IF9JbnB1dEl0ZXJhdG9yMiYsIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IxPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2FyZV9zYW1lPF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj46Ol9fdHlwZQorCV9TYW1lVHlwZTsKKyAgICAgIHJldHVybiBfX2NoZWNrX3NvcnRlZF9zZXRfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkLCBfU2FtZVR5cGUoKSk7CisgICB9CisKKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyAyNzAuIEJpbmFyeSBzZWFyY2ggcmVxdWlyZW1lbnRzIG92ZXJseSBzdHJpY3QKKyAgLy8gRGV0ZXJtaW5lIGlmIGEgc2VxdWVuY2UgaXMgcGFydGl0aW9uZWQgdy5yLnQuIHRoaXMgZWxlbWVudC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19wYXJ0aXRpb25lZF9sb3dlcihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlKQorICAgIHsKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiAqX19maXJzdCA8IF9fdmFsdWUpCisJKytfX2ZpcnN0OworICAgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgICsrX19maXJzdDsKKwkgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiAhKCpfX2ZpcnN0IDwgX192YWx1ZSkpCisJICAgICsrX19maXJzdDsKKwl9CisgICAgICByZXR1cm4gX19maXJzdCA9PSBfX2xhc3Q7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfcGFydGl0aW9uZWRfdXBwZXIoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWx1ZSkKKyAgICB7CisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgIShfX3ZhbHVlIDwgKl9fZmlyc3QpKQorCSsrX19maXJzdDsKKyAgICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICArK19fZmlyc3Q7CisJICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgX192YWx1ZSA8ICpfX2ZpcnN0KQorCSAgICArK19fZmlyc3Q7CisJfQorICAgICAgcmV0dXJuIF9fZmlyc3QgPT0gX19sYXN0OworICAgIH0KKworICAvLyBEZXRlcm1pbmUgaWYgYSBzZXF1ZW5jZSBpcyBwYXJ0aXRpb25lZCB3LnIudC4gdGhpcyBlbGVtZW50LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9QcmVkPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19wYXJ0aXRpb25lZF9sb3dlcihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisJCQkJICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlLAorCQkJICAgICAgX1ByZWQgX19wcmVkKQorICAgIHsKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiBib29sKF9fcHJlZCgqX19maXJzdCwgX192YWx1ZSkpKQorCSsrX19maXJzdDsKKyAgICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICArK19fZmlyc3Q7CisJICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgIWJvb2woX19wcmVkKCpfX2ZpcnN0LCBfX3ZhbHVlKSkpCisJICAgICsrX19maXJzdDsKKwl9CisgICAgICByZXR1cm4gX19maXJzdCA9PSBfX2xhc3Q7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1ByZWQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX3BhcnRpdGlvbmVkX3VwcGVyKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsdWUsCisJCQkgICAgICBfUHJlZCBfX3ByZWQpCisgICAgeworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0ICYmICFib29sKF9fcHJlZChfX3ZhbHVlLCAqX19maXJzdCkpKQorCSsrX19maXJzdDsKKyAgICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICArK19fZmlyc3Q7CisJICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgYm9vbChfX3ByZWQoX192YWx1ZSwgKl9fZmlyc3QpKSkKKwkgICAgKytfX2ZpcnN0OworCX0KKyAgICAgIHJldHVybiBfX2ZpcnN0ID09IF9fbGFzdDsKKyAgICB9CisKKyAgLy8gSGVscGVyIHN0cnVjdCB0byBkZXRlY3QgcmFuZG9tIGFjY2VzcyBzYWZlIGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIHN0cnVjdCBfX2lzX3NhZmVfcmFuZG9tX2l0ZXJhdG9yCisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAwIH07CisgICAgICB0eXBlZGVmIHN0ZDo6X19mYWxzZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIHN0cnVjdCBfX2lzX3NhZmVfcmFuZG9tX2l0ZXJhdG9yPF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiA+CisgICAgOiBzdGQ6Ol9fYXJlX3NhbWU8c3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+OjoKKwkJICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBzdHJ1Y3QgX1NpdGVyX2Jhc2UKKyAgICA6IHN0ZDo6X0l0ZXJfYmFzZTxfSXRlcmF0b3IsIF9faXNfc2FmZV9yYW5kb21faXRlcmF0b3I8X0l0ZXJhdG9yPjo6X192YWx1ZT4KKyAgICB7IH07CisKKyAgLyoqIEhlbHBlciBmdW5jdGlvbiB0byBleHRyYWN0IGJhc2UgaXRlcmF0b3Igb2YgcmFuZG9tIGFjY2VzcyBzYWZlIGl0ZXJhdG9yCisgICAgICBpbiBvcmRlciB0byByZWR1Y2UgcGVyZm9ybWFuY2UgaW1wYWN0IG9mIGRlYnVnIG1vZGUuICBMaW1pdGVkIHRvIHJhbmRvbQorICAgICAgYWNjZXNzIGl0ZXJhdG9yIGJlY2F1c2UgaXQgaXMgdGhlIG9ubHkgY2F0ZWdvcnkgZm9yIHdoaWNoIGl0IGlzIHBvc3NpYmxlCisgICAgICB0byBjaGVjayBmb3IgY29ycmVjdCBpdGVyYXRvcnMgb3JkZXIgaW4gdGhlIF9fdmFsaWRfcmFuZ2UgZnVuY3Rpb24KKyAgICAgIHRoYW5rcyB0byB0aGUgPCBvcGVyYXRvci4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSB0eXBlbmFtZSBfU2l0ZXJfYmFzZTxfSXRlcmF0b3I+OjppdGVyYXRvcl90eXBlCisgICAgX19iYXNlKF9JdGVyYXRvciBfX2l0KQorICAgIHsgcmV0dXJuIF9TaXRlcl9iYXNlPF9JdGVyYXRvcj46Ol9TX2Jhc2UoX19pdCk7IH0KK30gLy8gbmFtZXNwYWNlIF9fZ251X2RlYnVnCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9saXN0IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9saXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmY2M1YmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL2xpc3QKQEAgLTAsMCArMSw3NTcgQEAKKy8vIERlYnVnZ2luZyBsaXN0IGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9saXN0CisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19MSVNUCisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX0xJU1QgMQorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX3NlcXVlbmNlLmg+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9pdGVyYXRvci5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX2RlYnVnCit7CisgIC8vLyBDbGFzcyBzdGQ6Omxpc3Qgd2l0aCBzYWZldHkvY2hlY2tpbmcvZGVidWcgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyBsaXN0CisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6Omxpc3Q8X1RwLCBfQWxsb2NhdG9yPiwKKyAgICAgIHB1YmxpYyBfX2dudV9kZWJ1Zzo6X1NhZmVfc2VxdWVuY2U8bGlzdDxfVHAsIF9BbGxvY2F0b3I+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX1NURF9DOjpsaXN0PF9UcCwgX0FsbG9jYXRvcj4gX0Jhc2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yICAgICAgIF9CYXNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgX0Jhc2VfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfRXF1YWxfdG88X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9FcXVhbDsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9Ob3RfZXF1YWxfdG88X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9Ob3RfZXF1YWw7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2l0ZXJhdG9yLCBsaXN0PgorCQkJCQkJICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfY29uc3RfaXRlcmF0b3IsIGxpc3Q+CisJCQkJCQkgICAgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgZGlmZmVyZW5jZV90eXBlOworCisgICAgICB0eXBlZGVmIF9UcAkJCQkgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jYXRvcgkJCSAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnBvaW50ZXIgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICAvLyAyMy4yLjIuMSBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgZXhwbGljaXQKKyAgICAgIGxpc3QoY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX2EpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgZXhwbGljaXQKKyAgICAgIGxpc3Qoc2l6ZV90eXBlIF9fbikKKyAgICAgIDogX0Jhc2UoX19uKSB7IH0KKworICAgICAgbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUsCisJICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX24sIF9fdmFsdWUsIF9fYSkgeyB9CisjZWxzZQorICAgICAgZXhwbGljaXQKKyAgICAgIGxpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbHVlID0gX1RwKCksCisJICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX24sIF9fdmFsdWUsIF9fYSkgeyB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisJbGlzdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisJOiBfQmFzZShfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZ251X2RlYnVnOjpfX2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsCisJCQkJCQkJCSAgICAgX19sYXN0KSksCisJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSwgX19hKQorICAgICAgICB7IH0KKworICAgICAgbGlzdChjb25zdCBsaXN0JiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkgeyB9CisKKyAgICAgIGxpc3QoY29uc3QgX0Jhc2UmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGxpc3QobGlzdCYmIF9feCkgbm9leGNlcHQKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpCisgICAgICB7IHRoaXMtPl9NX3N3YXAoX194KTsgfQorCisgICAgICBsaXN0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgOiBfQmFzZShfX2wsIF9fYSkgeyB9CisjZW5kaWYKKworICAgICAgfmxpc3QoKSBfR0xJQkNYWF9OT0VYQ0VQVCB7IH0KKworICAgICAgbGlzdCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBsaXN0JiBfX3gpCisgICAgICB7CisJc3RhdGljX2Nhc3Q8X0Jhc2UmPigqdGhpcykgPSBfX3g7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBsaXN0JgorICAgICAgb3BlcmF0b3I9KGxpc3QmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwlfX2dsaWJjeHhfY2hlY2tfc2VsZl9tb3ZlX2Fzc2lnbihfX3gpOworCWNsZWFyKCk7CisJc3dhcChfX3gpOworICAgICAgCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgbGlzdCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfQmFzZSY+KCp0aGlzKSA9IF9fbDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgYXNzaWduKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCV9CYXNlOjphc3NpZ24oX19sKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyNlbmRpZgorICAgICAgICB2b2lkCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgX0Jhc2U6OmFzc2lnbihfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZmlyc3QpLAorCQkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpKTsKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJfQorCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3QpCisgICAgICB7CisJX0Jhc2U6OmFzc2lnbihfX24sIF9fdCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworICAgICAgdXNpbmcgX0Jhc2U6OmdldF9hbGxvY2F0b3I7CisKKyAgICAgIC8vIGl0ZXJhdG9yczoKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyNlbmRpZgorCisgICAgICAvLyAyMy4yLjIuMiBjYXBhY2l0eToKKyAgICAgIHVzaW5nIF9CYXNlOjplbXB0eTsKKyAgICAgIHVzaW5nIF9CYXNlOjpzaXplOworICAgICAgdXNpbmcgX0Jhc2U6Om1heF9zaXplOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6KQorICAgICAgeworCXRoaXMtPl9NX2RldGFjaF9zaW5ndWxhcigpOworCisJLy8gaWYgX19zeiA8IHNpemUoKSwgaW52YWxpZGF0ZSBhbGwgaXRlcmF0b3JzIGluIFtiZWdpbitfX3N6LCBlbmQoKSkKKwlfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9CYXNlOjpiZWdpbigpOworCV9CYXNlX2l0ZXJhdG9yIF9fZW5kID0gX0Jhc2U6OmVuZCgpOworCWZvciAoc2l6ZV90eXBlIF9faSA9IF9fc3o7IF9fdmljdGltICE9IF9fZW5kICYmIF9faSA+IDA7IC0tX19pKQorCSAgKytfX3ZpY3RpbTsKKworCWZvciAoOyBfX3ZpY3RpbSAhPSBfX2VuZDsgKytfX3ZpY3RpbSkKKwkgIHsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX192aWN0aW0pKTsKKwkgIH0KKworCV9fdHJ5CisJICB7CisJICAgIF9CYXNlOjpyZXNpemUoX19zeik7CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIHRoaXMtPl9NX3JldmFsaWRhdGVfc2luZ3VsYXIoKTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeiwgY29uc3QgX1RwJiBfX2MpCisgICAgICB7CisJdGhpcy0+X01fZGV0YWNoX3Npbmd1bGFyKCk7CisKKwkvLyBpZiBfX3N6IDwgc2l6ZSgpLCBpbnZhbGlkYXRlIGFsbCBpdGVyYXRvcnMgaW4gW2JlZ2luK19fc3osIGVuZCgpKQorCV9CYXNlX2l0ZXJhdG9yIF9fdmljdGltID0gX0Jhc2U6OmJlZ2luKCk7CisJX0Jhc2VfaXRlcmF0b3IgX19lbmQgPSBfQmFzZTo6ZW5kKCk7CisJZm9yIChzaXplX3R5cGUgX19pID0gX19zejsgX192aWN0aW0gIT0gX19lbmQgJiYgX19pID4gMDsgLS1fX2kpCisJICArK19fdmljdGltOworCisJZm9yICg7IF9fdmljdGltICE9IF9fZW5kOyArK19fdmljdGltKQorCSAgeworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgfQorCisJX190cnkKKwkgIHsKKwkgICAgX0Jhc2U6OnJlc2l6ZShfX3N6LCBfX2MpOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICB0aGlzLT5fTV9yZXZhbGlkYXRlX3Npbmd1bGFyKCk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorICAgICAgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeiwgX1RwIF9fYyA9IF9UcCgpKQorICAgICAgeworCXRoaXMtPl9NX2RldGFjaF9zaW5ndWxhcigpOworCisJLy8gaWYgX19zeiA8IHNpemUoKSwgaW52YWxpZGF0ZSBhbGwgaXRlcmF0b3JzIGluIFtiZWdpbitfX3N6LCBlbmQoKSkKKwlfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9CYXNlOjpiZWdpbigpOworCV9CYXNlX2l0ZXJhdG9yIF9fZW5kID0gX0Jhc2U6OmVuZCgpOworCWZvciAoc2l6ZV90eXBlIF9faSA9IF9fc3o7IF9fdmljdGltICE9IF9fZW5kICYmIF9faSA+IDA7IC0tX19pKQorCSAgKytfX3ZpY3RpbTsKKworCWZvciAoOyBfX3ZpY3RpbSAhPSBfX2VuZDsgKytfX3ZpY3RpbSkKKwkgIHsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX192aWN0aW0pKTsKKwkgIH0KKworCV9fdHJ5CisJICB7CisJICAgIF9CYXNlOjpyZXNpemUoX19zeiwgX19jKTsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgdGhpcy0+X01fcmV2YWxpZGF0ZV9zaW5ndWxhcigpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvLyBlbGVtZW50IGFjY2VzczoKKyAgICAgIHJlZmVyZW5jZQorICAgICAgZnJvbnQoKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXJldHVybiBfQmFzZTo6ZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBmcm9udCgpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJcmV0dXJuIF9CYXNlOjpmcm9udCgpOworICAgICAgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIGJhY2soKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXJldHVybiBfQmFzZTo6YmFjaygpOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGJhY2soKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXJldHVybiBfQmFzZTo6YmFjaygpOworICAgICAgfQorCisgICAgICAvLyAyMy4yLjIuMyBtb2RpZmllcnM6CisgICAgICB1c2luZyBfQmFzZTo6cHVzaF9mcm9udDsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHVzaW5nIF9CYXNlOjplbXBsYWNlX2Zyb250OworI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIHBvcF9mcm9udCgpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX0Jhc2U6OmJlZ2luKCkpKTsKKwlfQmFzZTo6cG9wX2Zyb250KCk7CisgICAgICB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjpwdXNoX2JhY2s7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB1c2luZyBfQmFzZTo6ZW1wbGFjZV9iYWNrOworI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIHBvcF9iYWNrKCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbCgtLV9CYXNlOjplbmQoKSkpOworCV9CYXNlOjpwb3BfYmFjaygpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGVtcGxhY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgX19nbGliY3h4X2NoZWNrX2luc2VydChfX3Bvc2l0aW9uKTsKKwkgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW1wbGFjZShfX3Bvc2l0aW9uLmJhc2UoKSwKKwkJCQkJc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSwgdGhpcyk7CisJfQorI2VuZGlmCisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgX1RwJiBfX3gpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2luc2VydChfX3Bvc2l0aW9uKTsKKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLmJhc2UoKSwgX194KSwgdGhpcyk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9UcCYmIF9feCkKKyAgICAgIHsgcmV0dXJuIGVtcGxhY2UoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3AsIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wKTsKKwlfQmFzZTo6aW5zZXJ0KF9fcC5iYXNlKCksIF9fbCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX194KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3NpdGlvbik7CisJX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLmJhc2UoKSwgX19uLCBfX3gpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisjZWxzZQorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisjZW5kaWYKKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKwkgICAgICAgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0X3JhbmdlKF9fcG9zaXRpb24sIF9fZmlyc3QsIF9fbGFzdCk7CisJICBfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZmlyc3QpLAorCQkJCQkgICBfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCkpOworCX0KKworICAgIHByaXZhdGU6CisgICAgICBfQmFzZV9pdGVyYXRvcgorICAgICAgX01fZXJhc2UoX0Jhc2VfaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3Bvc2l0aW9uKSk7CisJcmV0dXJuIF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uKTsKKyAgICAgIH0KKyAgICBwdWJsaWM6CisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2UoX19wb3NpdGlvbik7CisJcmV0dXJuIGl0ZXJhdG9yKF9NX2VyYXNlKF9fcG9zaXRpb24uYmFzZSgpKSwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDE1MS4gY2FuJ3QgY3VycmVudGx5IGNsZWFyKCkgZW1wdHkgY29udGFpbmVyCisJX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlKF9fcG9zaXRpb24sIF9fbGFzdCk7CisJZm9yIChfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9fcG9zaXRpb24uYmFzZSgpOworCSAgICAgX192aWN0aW0gIT0gX19sYXN0LmJhc2UoKTsgKytfX3ZpY3RpbSkKKwkgIHsKKwkgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fdmljdGltICE9IF9CYXNlOjplbmQoKSwKKwkJCSAgICAgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9yYW5nZSkKKwkJCQkgIC5fTV9pdGVyYXRvcihfX3Bvc2l0aW9uLCAicG9zaXRpb24iKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fbGFzdCwgImxhc3QiKSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fdmljdGltKSk7CisJICB9CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uLmJhc2UoKSwgX19sYXN0LmJhc2UoKSksIHRoaXMpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKGxpc3QmIF9feCkKKyAgICAgIHsKKwlfQmFzZTo6c3dhcChfX3gpOworCXRoaXMtPl9NX3N3YXAoX194KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCV9CYXNlOjpjbGVhcigpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisKKyAgICAgIC8vIDIzLjIuMi40IGxpc3Qgb3BlcmF0aW9uczoKKyAgICAgIHZvaWQKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYmIF9feCkKKyNlbHNlCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYgX194KQorI2VuZGlmCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKCZfX3ggIT0gdGhpcywKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3NlbGZfc3BsaWNlKQorCQkJICAgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpKTsKKwl0aGlzLT5fTV90cmFuc2Zlcl9mcm9tX2lmKF9feCwgX05vdF9lcXVhbChfX3guX01fYmFzZSgpLmVuZCgpKSk7CisJX0Jhc2U6OnNwbGljZShfX3Bvc2l0aW9uLmJhc2UoKSwgX0dMSUJDWFhfTU9WRShfX3guX01fYmFzZSgpKSk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYgX194KQorICAgICAgeyBzcGxpY2UoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCkpOyB9CisjZW5kaWYKKworICAgICAgdm9pZAorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiYgX194LCBpdGVyYXRvciBfX2kpCisjZWxzZQorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCwgaXRlcmF0b3IgX19pKQorI2VuZGlmCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2luc2VydChfX3Bvc2l0aW9uKTsKKworCS8vIFdlIHVzZWQgdG8gcGVyZm9ybSB0aGUgc3BsaWNlX2FsbG9jIGNoZWNrOiAgbm90IGFueW1vcmUsIHJlZHVuZGFudAorCS8vIGFmdGVyIGltcGxlbWVudGluZyB0aGUgcmVsZXZhbnQgYml0cyBvZiBOMTU5OS4KKworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2kuX01fZGVyZWZlcmVuY2VhYmxlKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19zcGxpY2VfYmFkKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKF9faSwgIl9faSIpKTsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19pLl9NX2F0dGFjaGVkX3RvKCZfX3gpLAorCQkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfc3BsaWNlX290aGVyKQorCQkJICAgICAuX01faXRlcmF0b3IoX19pLCAiX19pIikuX01fc2VxdWVuY2UoX194LCAiX194IikpOworCisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDI1MC4gc3BsaWNpbmcgaW52YWxpZGF0ZXMgaXRlcmF0b3JzCisJdGhpcy0+X01fdHJhbnNmZXJfZnJvbV9pZihfX3gsIF9FcXVhbChfX2kuYmFzZSgpKSk7CisJX0Jhc2U6OnNwbGljZShfX3Bvc2l0aW9uLmJhc2UoKSwgX0dMSUJDWFhfTU9WRShfX3guX01fYmFzZSgpKSwKKwkJICAgICAgX19pLmJhc2UoKSk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYgX194LCBpdGVyYXRvciBfX2kpCisgICAgICB7IHNwbGljZShfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194KSwgX19pKTsgfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYmIF9feCwgaXRlcmF0b3IgX19maXJzdCwKKwkgICAgIGl0ZXJhdG9yIF9fbGFzdCkKKyNlbHNlCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYgX194LCBpdGVyYXRvciBfX2ZpcnN0LAorCSAgICAgaXRlcmF0b3IgX19sYXN0KQorI2VuZGlmCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2luc2VydChfX3Bvc2l0aW9uKTsKKwlfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19maXJzdC5fTV9hdHRhY2hlZF90bygmX194KSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3NwbGljZV9vdGhlcikKKwkJCSAgICAgIC5fTV9zZXF1ZW5jZShfX3gsICJ4IikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcihfX2ZpcnN0LCAiZmlyc3QiKSk7CisKKwkvLyBXZSB1c2VkIHRvIHBlcmZvcm0gdGhlIHNwbGljZV9hbGxvYyBjaGVjazogIG5vdCBhbnltb3JlLCByZWR1bmRhbnQKKwkvLyBhZnRlciBpbXBsZW1lbnRpbmcgdGhlIHJlbGV2YW50IGJpdHMgb2YgTjE1OTkuCisKKwlmb3IgKF9CYXNlX2l0ZXJhdG9yIF9fdG1wID0gX19maXJzdC5iYXNlKCk7CisJICAgICBfX3RtcCAhPSBfX2xhc3QuYmFzZSgpOyArK19fdG1wKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX190bXAgIT0gX0Jhc2U6OmVuZCgpLAorCQkJCSAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UpCisJCQkJICAuX01faXRlcmF0b3IoX19maXJzdCwgImZpcnN0IikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoJl9feCAhPSB0aGlzIHx8IF9fdG1wICE9IF9fcG9zaXRpb24sCisJCQkJX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfc3BsaWNlX292ZXJsYXApCisJCQkJICAuX01faXRlcmF0b3IoX190bXAsICJwb3NpdGlvbiIpCisJCQkJICAuX01faXRlcmF0b3IoX19maXJzdCwgImZpcnN0IikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCSAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAgIC8vIDI1MC4gc3BsaWNpbmcgaW52YWxpZGF0ZXMgaXRlcmF0b3JzCisJICAgIHRoaXMtPl9NX3RyYW5zZmVyX2Zyb21faWYoX194LCBfRXF1YWwoX190bXApKTsKKwkgIH0KKworCV9CYXNlOjpzcGxpY2UoX19wb3NpdGlvbi5iYXNlKCksIF9HTElCQ1hYX01PVkUoX194Ll9NX2Jhc2UoKSksCisJCSAgICAgIF9fZmlyc3QuYmFzZSgpLCBfX2xhc3QuYmFzZSgpKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiBfX3gsIGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgc3BsaWNlKF9fcG9zaXRpb24sIHN0ZDo6bW92ZShfX3gpLCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgcmVtb3ZlKGNvbnN0IF9UcCYgX192YWx1ZSkKKyAgICAgIHsKKwlmb3IgKF9CYXNlX2l0ZXJhdG9yIF9feCA9IF9CYXNlOjpiZWdpbigpOyBfX3ggIT0gX0Jhc2U6OmVuZCgpOyApCisJICB7CisJICAgIGlmICgqX194ID09IF9fdmFsdWUpCisJICAgICAgX194ID0gX01fZXJhc2UoX194KTsKKwkgICAgZWxzZQorCSAgICAgICsrX194OworCSAgfQorICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfUHJlZGljYXRlPgorICAgICAgICB2b2lkCisgICAgICAgIHJlbW92ZV9pZihfUHJlZGljYXRlIF9fcHJlZCkKKyAgICAgICAgeworCSAgZm9yIChfQmFzZV9pdGVyYXRvciBfX3ggPSBfQmFzZTo6YmVnaW4oKTsgX194ICE9IF9CYXNlOjplbmQoKTsgKQorCSAgICB7CisJICAgICAgaWYgKF9fcHJlZCgqX194KSkKKwkJX194ID0gX01fZXJhc2UoX194KTsKKwkgICAgICBlbHNlCisJCSsrX194OworCSAgICB9CisJfQorCisgICAgICB2b2lkCisgICAgICB1bmlxdWUoKQorICAgICAgeworCV9CYXNlX2l0ZXJhdG9yIF9fZmlyc3QgPSBfQmFzZTo6YmVnaW4oKTsKKwlfQmFzZV9pdGVyYXRvciBfX2xhc3QgPSBfQmFzZTo6ZW5kKCk7CisJaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCSAgcmV0dXJuOworCV9CYXNlX2l0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7ICsrX19uZXh0OworCXdoaWxlIChfX25leHQgIT0gX19sYXN0KQorCSAgeworCSAgICBpZiAoKl9fZmlyc3QgPT0gKl9fbmV4dCkKKwkgICAgICBfX25leHQgPSBfTV9lcmFzZShfX25leHQpOworCSAgICBlbHNlCisJICAgICAgX19maXJzdCA9IF9fbmV4dCsrOworCSAgfQorICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorICAgICAgICB2b2lkCisgICAgICAgIHVuaXF1ZShfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpCisgICAgICAgIHsKKwkgIF9CYXNlX2l0ZXJhdG9yIF9fZmlyc3QgPSBfQmFzZTo6YmVnaW4oKTsKKwkgIF9CYXNlX2l0ZXJhdG9yIF9fbGFzdCA9IF9CYXNlOjplbmQoKTsKKwkgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwkgICAgcmV0dXJuOworCSAgX0Jhc2VfaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsgKytfX25leHQ7CisJICB3aGlsZSAoX19uZXh0ICE9IF9fbGFzdCkKKwkgICAgeworCSAgICAgIGlmIChfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0LCAqX19uZXh0KSkKKwkJX19uZXh0ID0gX01fZXJhc2UoX19uZXh0KTsKKwkgICAgICBlbHNlCisJCV9fZmlyc3QgPSBfX25leHQrKzsKKwkgICAgfQorCX0KKworICAgICAgdm9pZAorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIG1lcmdlKGxpc3QmJiBfX3gpCisjZWxzZQorICAgICAgbWVyZ2UobGlzdCYgX194KQorI2VuZGlmCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDMwMC4gbGlzdDo6bWVyZ2UoKSBzcGVjaWZpY2F0aW9uIGluY29tcGxldGUKKwlpZiAodGhpcyAhPSAmX194KQorCSAgeworCSAgICBfX2dsaWJjeHhfY2hlY2tfc29ydGVkKF9CYXNlOjpiZWdpbigpLCBfQmFzZTo6ZW5kKCkpOworCSAgICBfX2dsaWJjeHhfY2hlY2tfc29ydGVkKF9feC5iZWdpbigpLmJhc2UoKSwgX194LmVuZCgpLmJhc2UoKSk7CisJICAgIHRoaXMtPl9NX3RyYW5zZmVyX2Zyb21faWYoX194LCBfTm90X2VxdWFsKF9feC5fTV9iYXNlKCkuZW5kKCkpKTsKKwkgICAgX0Jhc2U6Om1lcmdlKF9HTElCQ1hYX01PVkUoX194Ll9NX2Jhc2UoKSkpOworCSAgfQorICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgbWVyZ2UobGlzdCYgX194KQorICAgICAgeyBtZXJnZShzdGQ6Om1vdmUoX194KSk7IH0KKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ29tcGFyZT4KKyAgICAgICAgdm9pZAorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgICAgbWVyZ2UobGlzdCYmIF9feCwgX0NvbXBhcmUgX19jb21wKQorI2Vsc2UKKyAgICAgICAgbWVyZ2UobGlzdCYgX194LCBfQ29tcGFyZSBfX2NvbXApCisjZW5kaWYKKyAgICAgICAgeworCSAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgLy8gMzAwLiBsaXN0OjptZXJnZSgpIHNwZWNpZmljYXRpb24gaW5jb21wbGV0ZQorCSAgaWYgKHRoaXMgIT0gJl9feCkKKwkgICAgeworCSAgICAgIF9fZ2xpYmN4eF9jaGVja19zb3J0ZWRfcHJlZChfQmFzZTo6YmVnaW4oKSwgX0Jhc2U6OmVuZCgpLAorCQkJCQkgIF9fY29tcCk7CisJICAgICAgX19nbGliY3h4X2NoZWNrX3NvcnRlZF9wcmVkKF9feC5iZWdpbigpLmJhc2UoKSwgX194LmVuZCgpLmJhc2UoKSwKKwkJCQkJICBfX2NvbXApOworCSAgICAgIHRoaXMtPl9NX3RyYW5zZmVyX2Zyb21faWYoX194LCBfTm90X2VxdWFsKF9feC5fTV9iYXNlKCkuZW5kKCkpKTsKKwkgICAgICBfQmFzZTo6bWVyZ2UoX0dMSUJDWFhfTU9WRShfX3guX01fYmFzZSgpKSwgX19jb21wKTsKKwkgICAgfQorCX0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db21wYXJlPgorICAgICAgICB2b2lkCisgICAgICAgIG1lcmdlKGxpc3QmIF9feCwgX0NvbXBhcmUgX19jb21wKQorICAgICAgICB7IG1lcmdlKHN0ZDo6bW92ZShfX3gpLCBfX2NvbXApOyB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgc29ydCgpIHsgX0Jhc2U6OnNvcnQoKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3RyaWN0V2Vha09yZGVyaW5nPgorICAgICAgICB2b2lkCisgICAgICAgIHNvcnQoX1N0cmljdFdlYWtPcmRlcmluZyBfX3ByZWQpIHsgX0Jhc2U6OnNvcnQoX19wcmVkKTsgfQorCisgICAgICB1c2luZyBfQmFzZTo6cmV2ZXJzZTsKKworICAgICAgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgX0dMSUJDWFhfTk9FWENFUFQgICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3QgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQgeyByZXR1cm4gKnRoaXM7IH0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9pbnZhbGlkYXRlX2FsbCgpCisgICAgICB7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfTm90X2VxdWFsKF9CYXNlOjplbmQoKSkpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA9PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpICE9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID49IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGxpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywgbGlzdDxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgX19saHMuc3dhcChfX3Jocyk7IH0KKworfSAvLyBuYW1lc3BhY2UgX19kZWJ1ZworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9tYWNyb3MuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFiY2FmMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvbWFjcm9zLmgKQEAgLTAsMCArMSwzNTMgQEAKKy8vIERlYnVnZ2luZyBzdXBwb3J0IGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9tYWNyb3MuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfTUFDUk9TX0gKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfTUFDUk9TX0ggMQorCisvKioKKyAqIE1hY3JvcyB1c2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiB0byB2ZXJpZnkgY2VydGFpbgorICogcHJvcGVydGllcy4gVGhlc2UgbWFjcm9zIG1heSBvbmx5IGJlIHVzZWQgZGlyZWN0bHkgYnkgdGhlIGRlYnVnCisgKiB3cmFwcGVycy4gTm90ZSB0aGF0IHRoZXNlIGFyZSBtYWNyb3MgKGluc3RlYWQgb2YgdGhlIG1vcmUgb2J2aW91c2x5CisgKiBAYSBjb3JyZWN0IGNob2ljZSBvZiBtYWtpbmcgdGhlbSBmdW5jdGlvbnMpIGJlY2F1c2Ugd2UgbmVlZCBsaW5lIGFuZAorICogZmlsZSBpbmZvcm1hdGlvbiBhdCB0aGUgY2FsbCBzaXRlLCB0byBtaW5pbWl6ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbgorICogdGhlIHVzZXIgZXJyb3IgYW5kIHdoZXJlIHRoZSBlcnJvciBpcyByZXBvcnRlZC4KKyAqCisgKi8KKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfVkVSSUZZX0FUKF9Db25kaXRpb24sX0Vycm9yTWVzc2FnZSxfRmlsZSxfTGluZSkJXAorICBkbwkJCQkJCQkJCVwKKyAgewkJCQkJCQkJCVwKKyAgICBpZiAoISAoX0NvbmRpdGlvbikpCQkJCQkJCVwKKyAgICAgIF9fZ251X2RlYnVnOjpfRXJyb3JfZm9ybWF0dGVyOjpfTV9hdChfRmlsZSwgX0xpbmUpCQlcCisJICAuX0Vycm9yTWVzc2FnZS5fTV9lcnJvcigpOwkJCQkJXAorICB9IHdoaWxlIChmYWxzZSkKKworI2RlZmluZSBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX0NvbmRpdGlvbixfRXJyb3JNZXNzYWdlKQkJCVwKKyAgX0dMSUJDWFhfREVCVUdfVkVSSUZZX0FUKF9Db25kaXRpb24sX0Vycm9yTWVzc2FnZSxfX0ZJTEVfXyxfX0xJTkVfXykKKworLy8gVmVyaWZ5IHRoYXQgW19GaXJzdCwgX0xhc3QpIGZvcm1zIGEgdmFsaWQgaXRlcmF0b3IgcmFuZ2UuCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfRmlyc3QsX0xhc3QpCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fZ251X2RlYnVnOjpfX3ZhbGlkX3JhbmdlKF9GaXJzdCwgX0xhc3QpLAlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlKQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfRmlyc3QsICNfRmlyc3QpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0xhc3QsICNfTGFzdCkpCisKKy8vIFZlcmlmeSB0aGF0IFtfRmlyc3QsIF9MYXN0KSBmb3JtcyBhIG5vbi1lbXB0eSBpdGVyYXRvciByYW5nZS4KKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX25vbl9lbXB0eV9yYW5nZShfRmlyc3QsX0xhc3QpCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9GaXJzdCAhPSBfTGFzdCwJCQkJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfbm9uX2VtcHR5X3JhbmdlKQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfRmlyc3QsICNfRmlyc3QpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0xhc3QsICNfTGFzdCkpCisKKy8qKiBWZXJpZnkgdGhhdCB3ZSBjYW4gaW5zZXJ0IGludG8gKnRoaXMgd2l0aCB0aGUgaXRlcmF0b3IgX1Bvc2l0aW9uLgorICogIEluc2VydGlvbiBpbnRvIGEgY29udGFpbmVyIGF0IGEgc3BlY2lmaWMgcG9zaXRpb24gcmVxdWlyZXMgdGhhdAorICogIHRoZSBpdGVyYXRvciBiZSBub25zaW5ndWxhciwgZWl0aGVyIGRlcmVmZXJlbmNlYWJsZSBvciBwYXN0LXRoZS1lbmQsCisgKiAgYW5kIHRoYXQgaXQgcmVmZXJlbmNlIHRoZSBzZXF1ZW5jZSB3ZSBhcmUgaW5zZXJ0aW5nIGludG8uIE5vdGUgdGhhdAorICogIHRoaXMgbWFjcm8gaXMgb25seSB2YWxpZCB3aGVuIHRoZSBjb250YWluZXIgaXMgYV9TYWZlX3NlcXVlbmNlIGFuZAorICogIHRoZSBpdGVyYXRvciBpcyBhIF9TYWZlX2l0ZXJhdG9yLgorKi8KKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX2luc2VydChfUG9zaXRpb24pCQkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWSghX1Bvc2l0aW9uLl9NX3Npbmd1bGFyKCksCQkJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfaW5zZXJ0X3Npbmd1bGFyKSBcCisJCSAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9Qb3NpdGlvbiwgI19Qb3NpdGlvbikpOwkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9Qb3NpdGlvbi5fTV9hdHRhY2hlZF90byh0aGlzKSwJCQlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2luc2VydF9kaWZmZXJlbnQpIFwKKwkJICAgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX1Bvc2l0aW9uLCAjX1Bvc2l0aW9uKSkKKworLyoqIFZlcmlmeSB0aGF0IHdlIGNhbiBpbnNlcnQgaW50byAqdGhpcyBhZnRlciB0aGUgaXRlcmF0b3IgX1Bvc2l0aW9uLgorICogIEluc2VydGlvbiBpbnRvIGEgY29udGFpbmVyIGFmdGVyIGEgc3BlY2lmaWMgcG9zaXRpb24gcmVxdWlyZXMgdGhhdAorICogIHRoZSBpdGVyYXRvciBiZSBub25zaW5ndWxhciwgZWl0aGVyIGRlcmVmZXJlbmNlYWJsZSBvciBiZWZvcmUtYmVnaW4sCisgKiAgYW5kIHRoYXQgaXQgcmVmZXJlbmNlIHRoZSBzZXF1ZW5jZSB3ZSBhcmUgaW5zZXJ0aW5nIGludG8uIE5vdGUgdGhhdAorICogIHRoaXMgbWFjcm8gaXMgb25seSB2YWxpZCB3aGVuIHRoZSBjb250YWluZXIgaXMgYV9TYWZlX3NlcXVlbmNlIGFuZAorICogIHRoZSBpdGVyYXRvciBpcyBhIF9TYWZlX2l0ZXJhdG9yLgorKi8KKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX2luc2VydF9hZnRlcihfUG9zaXRpb24pCQkJCVwKK19fZ2xpYmN4eF9jaGVja19pbnNlcnQoX1Bvc2l0aW9uKTsJCQkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWSghX1Bvc2l0aW9uLl9NX2lzX2VuZCgpLAkJCQlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2luc2VydF9hZnRlcl9lbmQpCVwKKwkJICAgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX1Bvc2l0aW9uLCAjX1Bvc2l0aW9uKSkKKworLyoqIFZlcmlmeSB0aGF0IHdlIGNhbiBpbnNlcnQgdGhlIHZhbHVlcyBpbiB0aGUgaXRlcmF0b3IgcmFuZ2UKKyAqICBbX0ZpcnN0LCBfTGFzdCkgaW50byAqdGhpcyB3aXRoIHRoZSBpdGVyYXRvciBfUG9zaXRpb24uICBJbnNlcnRpb24KKyAqICBpbnRvIGEgY29udGFpbmVyIGF0IGEgc3BlY2lmaWMgcG9zaXRpb24gcmVxdWlyZXMgdGhhdCB0aGUgaXRlcmF0b3IKKyAqICBiZSBub25zaW5ndWxhciAoaS5lLiwgZWl0aGVyIGRlcmVmZXJlbmNlYWJsZSBvciBwYXN0LXRoZS1lbmQpLAorICogIHRoYXQgaXQgcmVmZXJlbmNlIHRoZSBzZXF1ZW5jZSB3ZSBhcmUgaW5zZXJ0aW5nIGludG8sIGFuZCB0aGF0IHRoZQorICogIGl0ZXJhdG9yIHJhbmdlIFtfRmlyc3QsIExhc3QpIGlzIGEgdmFsaWQgKHBvc3NpYmx5IGVtcHR5KQorICogIHJhbmdlLiBOb3RlIHRoYXQgdGhpcyBtYWNybyBpcyBvbmx5IHZhbGlkIHdoZW4gdGhlIGNvbnRhaW5lciBpcyBhCisgKiAgX1NhZmVfc2VxdWVuY2UgYW5kIHRoZSBpdGVyYXRvciBpcyBhIF9TYWZlX2l0ZXJhdG9yLgorICoKKyAqICBAdG9kbyBXZSB3b3VsZCBsaWtlIHRvIGJlIGFibGUgdG8gY2hlY2sgZm9yIG5vbmludGVyZmVyZW5jZSBvZgorICogIF9Qb3NpdGlvbiBhbmQgdGhlIHJhbmdlIFtfRmlyc3QsIF9MYXN0KSwgYnV0IHRoYXQgY2FuJ3QgKGluCisgKiAgZ2VuZXJhbCkgYmUgZG9uZS4KKyovCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19pbnNlcnRfcmFuZ2UoX1Bvc2l0aW9uLF9GaXJzdCxfTGFzdCkJCVwKK19fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfRmlyc3QsX0xhc3QpOwkJCQlcCitfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9Qb3NpdGlvbikKKworLyoqIFZlcmlmeSB0aGF0IHdlIGNhbiBpbnNlcnQgdGhlIHZhbHVlcyBpbiB0aGUgaXRlcmF0b3IgcmFuZ2UKKyAqICBbX0ZpcnN0LCBfTGFzdCkgaW50byAqdGhpcyBhZnRlciB0aGUgaXRlcmF0b3IgX1Bvc2l0aW9uLiAgSW5zZXJ0aW9uCisgKiAgaW50byBhIGNvbnRhaW5lciBhZnRlciBhIHNwZWNpZmljIHBvc2l0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIGl0ZXJhdG9yCisgKiAgYmUgbm9uc2luZ3VsYXIgKGkuZS4sIGVpdGhlciBkZXJlZmVyZW5jZWFibGUgb3IgcGFzdC10aGUtZW5kKSwKKyAqICB0aGF0IGl0IHJlZmVyZW5jZSB0aGUgc2VxdWVuY2Ugd2UgYXJlIGluc2VydGluZyBpbnRvLCBhbmQgdGhhdCB0aGUKKyAqICBpdGVyYXRvciByYW5nZSBbX0ZpcnN0LCBMYXN0KSBpcyBhIHZhbGlkIChwb3NzaWJseSBlbXB0eSkKKyAqICByYW5nZS4gTm90ZSB0aGF0IHRoaXMgbWFjcm8gaXMgb25seSB2YWxpZCB3aGVuIHRoZSBjb250YWluZXIgaXMgYQorICogIF9TYWZlX3NlcXVlbmNlIGFuZCB0aGUgaXRlcmF0b3IgaXMgYSBfU2FmZV9pdGVyYXRvci4KKyAqCisgKiAgQHRvZG8gV2Ugd291bGQgbGlrZSB0byBiZSBhYmxlIHRvIGNoZWNrIGZvciBub25pbnRlcmZlcmVuY2Ugb2YKKyAqICBfUG9zaXRpb24gYW5kIHRoZSByYW5nZSBbX0ZpcnN0LCBfTGFzdCksIGJ1dCB0aGF0IGNhbid0IChpbgorICogIGdlbmVyYWwpIGJlIGRvbmUuCisqLworI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0X3JhbmdlX2FmdGVyKF9Qb3NpdGlvbixfRmlyc3QsX0xhc3QpCVwKK19fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfRmlyc3QsX0xhc3QpOwkJCQlcCitfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0X2FmdGVyKF9Qb3NpdGlvbikKKworLyoqIFZlcmlmeSB0aGF0IHdlIGNhbiBlcmFzZSB0aGUgZWxlbWVudCByZWZlcmVuY2VkIGJ5IHRoZSBpdGVyYXRvcgorICogX1Bvc2l0aW9uLiBXZSBjYW4gZXJhc2UgdGhlIGVsZW1lbnQgaWYgdGhlIF9Qb3NpdGlvbiBpdGVyYXRvciBpcworICogZGVyZWZlcmVuY2VhYmxlIGFuZCByZWZlcmVuY2VzIHRoaXMgc2VxdWVuY2UuCisqLworI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfZXJhc2UoX1Bvc2l0aW9uKQkJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoX1Bvc2l0aW9uLl9NX2RlcmVmZXJlbmNlYWJsZSgpLAkJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfZXJhc2VfYmFkKQkgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfUG9zaXRpb24sICNfUG9zaXRpb24pKTsJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWShfUG9zaXRpb24uX01fYXR0YWNoZWRfdG8odGhpcyksCQkJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19lcmFzZV9kaWZmZXJlbnQpICAgIFwKKwkJICAgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX1Bvc2l0aW9uLCAjX1Bvc2l0aW9uKSkKKworLyoqIFZlcmlmeSB0aGF0IHdlIGNhbiBlcmFzZSB0aGUgZWxlbWVudCBhZnRlciB0aGUgaXRlcmF0b3IKKyAqIF9Qb3NpdGlvbi4gV2UgY2FuIGVyYXNlIHRoZSBlbGVtZW50IGlmIHRoZSBfUG9zaXRpb24gaXRlcmF0b3IgaXMKKyAqIGJlZm9yZSBhIGRlcmVmZXJlbmNlYWJsZSBvbmUgYW5kIHJlZmVyZW5jZXMgdGhpcyBzZXF1ZW5jZS4KKyovCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19lcmFzZV9hZnRlcihfUG9zaXRpb24pCQkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWShfUG9zaXRpb24uX01fYmVmb3JlX2RlcmVmZXJlbmNlYWJsZSgpLAkJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19lcmFzZV9hZnRlcl9iYWQpCVwKKwkJICAgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX1Bvc2l0aW9uLCAjX1Bvc2l0aW9uKSk7CQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoX1Bvc2l0aW9uLl9NX2F0dGFjaGVkX3RvKHRoaXMpLAkJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfZXJhc2VfZGlmZmVyZW50KQlcCisJCSAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9Qb3NpdGlvbiwgI19Qb3NpdGlvbikpCisKKy8qKiBWZXJpZnkgdGhhdCB3ZSBjYW4gZXJhc2UgdGhlIGVsZW1lbnRzIGluIHRoZSBpdGVyYXRvciByYW5nZQorICogIFtfRmlyc3QsIF9MYXN0KS4gV2UgY2FuIGVyYXNlIHRoZSBlbGVtZW50cyBpZiBbX0ZpcnN0LCBfTGFzdCkgaXMgYQorICogIHZhbGlkIGl0ZXJhdG9yIHJhbmdlIHdpdGhpbiB0aGlzIHNlcXVlbmNlLgorKi8KKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlKF9GaXJzdCxfTGFzdCkJCQlcCitfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX0ZpcnN0LF9MYXN0KTsJCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9GaXJzdC5fTV9hdHRhY2hlZF90byh0aGlzKSwJCQlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2VyYXNlX2RpZmZlcmVudCkgICAgXAorICAgICAgICAgICAgICAgICAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9GaXJzdCwgI19GaXJzdCkJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfTGFzdCwgI19MYXN0KSkKKworLyoqIFZlcmlmeSB0aGF0IHdlIGNhbiBlcmFzZSB0aGUgZWxlbWVudHMgaW4gdGhlIGl0ZXJhdG9yIHJhbmdlCisgKiAgKF9GaXJzdCwgX0xhc3QpLiBXZSBjYW4gZXJhc2UgdGhlIGVsZW1lbnRzIGlmIChfRmlyc3QsIF9MYXN0KSBpcyBhCisgKiAgdmFsaWQgaXRlcmF0b3IgcmFuZ2Ugd2l0aGluIHRoaXMgc2VxdWVuY2UuCisqLworI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2VfYWZ0ZXIoX0ZpcnN0LF9MYXN0KQkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWShfRmlyc3QuX01fY2FuX2NvbXBhcmUoX0xhc3QpLAkJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfZXJhc2VfZGlmZmVyZW50KQlcCisJCSAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9GaXJzdCwgI19GaXJzdCkJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfTGFzdCwgI19MYXN0KSk7CQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9GaXJzdC5fTV9hdHRhY2hlZF90byh0aGlzKSwJCQlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2VyYXNlX2RpZmZlcmVudCkJXAorCQkgICAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfRmlyc3QsICNfRmlyc3QpKTsJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoX0ZpcnN0ICE9IF9MYXN0LAkJCQkJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9yYW5nZTIpCVwKKwkJICAgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0ZpcnN0LCAjX0ZpcnN0KQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9MYXN0LCAjX0xhc3QpKTsJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoX0ZpcnN0Ll9NX2luY3JlbWVudGFibGUoKSwJCQlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlMikJXAorCQkgICAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfRmlyc3QsICNfRmlyc3QpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0xhc3QsICNfTGFzdCkpOwkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWSghX0xhc3QuX01faXNfYmVmb3JlX2JlZ2luKCksCQkJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9yYW5nZTIpCVwKKwkJICAgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0ZpcnN0LCAjX0ZpcnN0KQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9MYXN0LCAjX0xhc3QpKQkJCVwKKworLy8gVmVyaWZ5IHRoYXQgdGhlIHN1YnNjcmlwdCBfTiBpcyBsZXNzIHRoYW4gdGhlIGNvbnRhaW5lcidzIHNpemUuCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19zdWJzY3JpcHQoX04pCQkJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoX04gPCB0aGlzLT5zaXplKCksCQkJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfc3Vic2NyaXB0X29vYikJXAorICAgICAgICAgICAgICAgICAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKQkJCVwKKwkJICAgICAgLl9NX2ludGVnZXIoX04sICNfTikJCQkJXAorCQkgICAgICAuX01faW50ZWdlcih0aGlzLT5zaXplKCksICJzaXplIikpCisKKy8vIFZlcmlmeSB0aGF0IHRoZSBidWNrZXQgX04gaXMgbGVzcyB0aGFuIHRoZSBjb250YWluZXIncyBidWNrZXRzIGNvdW50LgorI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfYnVja2V0X2luZGV4KF9OKQkJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoX04gPCB0aGlzLT5idWNrZXRfY291bnQoKSwJCQlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2J1Y2tldF9pbmRleF9vb2IpCVwKKyAgICAgICAgICAgICAgICAgICAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikJCQlcCisJCSAgICAgIC5fTV9pbnRlZ2VyKF9OLCAjX04pCQkJCVwKKwkJICAgICAgLl9NX2ludGVnZXIodGhpcy0+YnVja2V0X2NvdW50KCksICJzaXplIikpCisKKy8vIFZlcmlmeSB0aGF0IHRoZSBjb250YWluZXIgaXMgbm9uZW1wdHkKKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCkJCQkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWSghIHRoaXMtPmVtcHR5KCksCQkJCQlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2VtcHR5KQkgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikpCisKKy8vIFZlcmlmeSB0aGF0IHRoZSBpdGVyYXRvciByYW5nZSBbX0ZpcnN0LCBfTGFzdCkgaXMgc29ydGVkCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19zb3J0ZWQoX0ZpcnN0LF9MYXN0KQkJCQlcCitfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX0ZpcnN0LF9MYXN0KTsJCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fZ251X2RlYnVnOjpfX2NoZWNrX3NvcnRlZChfRmlyc3QsIF9MYXN0KSwJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ191bnNvcnRlZCkJICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgLl9NX2l0ZXJhdG9yKF9GaXJzdCwgI19GaXJzdCkJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfTGFzdCwgI19MYXN0KSkKKworLyoqIFZlcmlmeSB0aGF0IHRoZSBpdGVyYXRvciByYW5nZSBbX0ZpcnN0LCBfTGFzdCkgaXMgc29ydGVkIGJ5IHRoZQorICAgIHByZWRpY2F0ZSBfUHJlZC4gKi8KKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX3NvcnRlZF9wcmVkKF9GaXJzdCxfTGFzdCxfUHJlZCkJCQlcCitfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX0ZpcnN0LF9MYXN0KTsJCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fZ251X2RlYnVnOjpfX2NoZWNrX3NvcnRlZChfRmlyc3QsIF9MYXN0LCBfUHJlZCksIFwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdW5zb3J0ZWRfcHJlZCkgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgLl9NX2l0ZXJhdG9yKF9GaXJzdCwgI19GaXJzdCkJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfTGFzdCwgI19MYXN0KQkJCVwKKwkJICAgICAgLl9NX3N0cmluZygjX1ByZWQpKQorCisvLyBTcGVjaWFsIHZhcmlhbnQgZm9yIHN0ZDo6bWVyZ2UsIHN0ZDo6aW5jbHVkZXMsIHN0ZDo6c2V0XyoKKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX3NvcnRlZF9zZXQoX0ZpcnN0MSxfTGFzdDEsX0ZpcnN0MikJCVwKK19fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfRmlyc3QxLF9MYXN0MSk7CQkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19nbnVfZGVidWc6Ol9fY2hlY2tfc29ydGVkX3NldChfRmlyc3QxLCBfTGFzdDEsIF9GaXJzdDIpLAkJXAorICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ191bnNvcnRlZCkJCQkJXAorICAuX01faXRlcmF0b3IoX0ZpcnN0MSwgI19GaXJzdDEpCQkJCQlcCisgIC5fTV9pdGVyYXRvcihfTGFzdDEsICNfTGFzdDEpKQorCisvLyBMaWtld2lzZSB3aXRoIGEgX1ByZWQuCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19zb3J0ZWRfc2V0X3ByZWQoX0ZpcnN0MSxfTGFzdDEsX0ZpcnN0MixfUHJlZCkJXAorX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9GaXJzdDEsX0xhc3QxKTsgICAgICAgIAkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWSgJCQkJCQkJXAorICBfX2dudV9kZWJ1Zzo6X19jaGVja19zb3J0ZWRfc2V0KF9GaXJzdDEsIF9MYXN0MSwgX0ZpcnN0MiwgX1ByZWQpLAlcCisgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3Vuc29ydGVkX3ByZWQpCQkJCVwKKyAgLl9NX2l0ZXJhdG9yKF9GaXJzdDEsICNfRmlyc3QxKQkJCQkJXAorICAuX01faXRlcmF0b3IoX0xhc3QxLCAjX0xhc3QxKQkJCQkJCVwKKyAgLl9NX3N0cmluZygjX1ByZWQpKQorCisvKiogVmVyaWZ5IHRoYXQgdGhlIGl0ZXJhdG9yIHJhbmdlIFtfRmlyc3QsIF9MYXN0KSBpcyBwYXJ0aXRpb25lZAorICAgIHcuci50LiB0aGUgdmFsdWUgX1ZhbHVlLiAqLworI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfcGFydGl0aW9uZWRfbG93ZXIoX0ZpcnN0LF9MYXN0LF9WYWx1ZSkJCVwKK19fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfRmlyc3QsX0xhc3QpOwkJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19nbnVfZGVidWc6Ol9fY2hlY2tfcGFydGl0aW9uZWRfbG93ZXIoCQlcCisJCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9GaXJzdCksCQkJXAorCQkJX19nbnVfZGVidWc6Ol9fYmFzZShfTGFzdCksIF9WYWx1ZSksCQlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3VucGFydGl0aW9uZWQpICAgICAgXAorCQkgICAgICAuX01faXRlcmF0b3IoX0ZpcnN0LCAjX0ZpcnN0KQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9MYXN0LCAjX0xhc3QpCQkJXAorCQkgICAgICAuX01fc3RyaW5nKCNfVmFsdWUpKQorCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19wYXJ0aXRpb25lZF91cHBlcihfRmlyc3QsX0xhc3QsX1ZhbHVlKQkJXAorX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9GaXJzdCxfTGFzdCk7CQkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2dudV9kZWJ1Zzo6X19jaGVja19wYXJ0aXRpb25lZF91cHBlcigJCVwKKwkJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX0ZpcnN0KSwJCQlcCisJCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9MYXN0KSwgX1ZhbHVlKSwJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdW5wYXJ0aXRpb25lZCkgICAgICBcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfRmlyc3QsICNfRmlyc3QpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0xhc3QsICNfTGFzdCkJCQlcCisJCSAgICAgIC5fTV9zdHJpbmcoI19WYWx1ZSkpCisKKy8qKiBWZXJpZnkgdGhhdCB0aGUgaXRlcmF0b3IgcmFuZ2UgW19GaXJzdCwgX0xhc3QpIGlzIHBhcnRpdGlvbmVkCisgICAgdy5yLnQuIHRoZSB2YWx1ZSBfVmFsdWUgYW5kIHByZWRpY2F0ZSBfUHJlZC4gKi8KKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX3BhcnRpdGlvbmVkX2xvd2VyX3ByZWQoX0ZpcnN0LF9MYXN0LF9WYWx1ZSxfUHJlZCkgXAorX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9GaXJzdCxfTGFzdCk7CQkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2dudV9kZWJ1Zzo6X19jaGVja19wYXJ0aXRpb25lZF9sb3dlcigJCVwKKwkJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX0ZpcnN0KSwJCQlcCisJCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9MYXN0KSwgX1ZhbHVlLCBfUHJlZCksCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdW5wYXJ0aXRpb25lZF9wcmVkKSBcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfRmlyc3QsICNfRmlyc3QpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0xhc3QsICNfTGFzdCkJCQlcCisJCSAgICAgIC5fTV9zdHJpbmcoI19QcmVkKQkJCQlcCisgICAgICAgICAgICAgICAgICAgICAgLl9NX3N0cmluZygjX1ZhbHVlKSkKKworLyoqIFZlcmlmeSB0aGF0IHRoZSBpdGVyYXRvciByYW5nZSBbX0ZpcnN0LCBfTGFzdCkgaXMgcGFydGl0aW9uZWQKKyAgICB3LnIudC4gdGhlIHZhbHVlIF9WYWx1ZSBhbmQgcHJlZGljYXRlIF9QcmVkLiAqLworI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfcGFydGl0aW9uZWRfdXBwZXJfcHJlZChfRmlyc3QsX0xhc3QsX1ZhbHVlLF9QcmVkKSBcCitfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX0ZpcnN0LF9MYXN0KTsJCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fZ251X2RlYnVnOjpfX2NoZWNrX3BhcnRpdGlvbmVkX3VwcGVyKAkJXAorCQkJX19nbnVfZGVidWc6Ol9fYmFzZShfRmlyc3QpLAkJCVwKKwkJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX0xhc3QpLCBfVmFsdWUsIF9QcmVkKSwJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ191bnBhcnRpdGlvbmVkX3ByZWQpIFwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9GaXJzdCwgI19GaXJzdCkJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfTGFzdCwgI19MYXN0KQkJCVwKKwkJICAgICAgLl9NX3N0cmluZygjX1ByZWQpCQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAuX01fc3RyaW5nKCNfVmFsdWUpKQorCisvLyBWZXJpZnkgdGhhdCB0aGUgaXRlcmF0b3IgcmFuZ2UgW19GaXJzdCwgX0xhc3QpIGlzIGEgaGVhcAorI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfaGVhcChfRmlyc3QsX0xhc3QpCQkJCVwKKyAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKHN0ZDo6X19pc19oZWFwKF9fZ251X2RlYnVnOjpfX2Jhc2UoX0ZpcnN0KSwJXAorCQkJCSAgICAgICBfX2dudV9kZWJ1Zzo6X19iYXNlKF9MYXN0KSksCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfbm90X2hlYXApCSAgICAgICAgXAorCQkgICAgICAuX01faXRlcmF0b3IoX0ZpcnN0LCAjX0ZpcnN0KQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9MYXN0LCAjX0xhc3QpKQorCisvKiogVmVyaWZ5IHRoYXQgdGhlIGl0ZXJhdG9yIHJhbmdlIFtfRmlyc3QsIF9MYXN0KSBpcyBhIGhlYXAKKyAgICB3LnIudC4gdGhlIHByZWRpY2F0ZSBfUHJlZC4gKi8KKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX2hlYXBfcHJlZChfRmlyc3QsX0xhc3QsX1ByZWQpCQkJXAorICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoc3RkOjpfX2lzX2hlYXAoX19nbnVfZGVidWc6Ol9fYmFzZShfRmlyc3QpLAlcCisJCQkJICAgICAgIF9fZ251X2RlYnVnOjpfX2Jhc2UoX0xhc3QpLAlcCisJCQkJICAgICAgIF9QcmVkKSwJCQkJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19ub3RfaGVhcF9wcmVkKSAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAuX01faXRlcmF0b3IoX0ZpcnN0LCAjX0ZpcnN0KQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9MYXN0LCAjX0xhc3QpCQkJXAorCQkgICAgICAuX01fc3RyaW5nKCNfUHJlZCkpCisKKy8vIFZlcmlmeSB0aGF0IHRoZSBjb250YWluZXIgaXMgbm90IHNlbGYgbW92ZSBhc3NpZ25lZAorI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfc2VsZl9tb3ZlX2Fzc2lnbihfT3RoZXIpCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKHRoaXMgIT0gJl9PdGhlciwJCQkJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfc2VsZl9tb3ZlX2Fzc2lnbikJXAorICAgICAgICAgICAgICAgICAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKSkKKworLy8gVmVyaWZ5IHRoYXQgbG9hZCBmYWN0b3IgaXMgcG9zaXRpb24KKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX21heF9sb2FkX2ZhY3RvcihfRikJCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9GID4gMC4wZiwJCQkJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfbG9hZF9mYWN0b3IpCVwKKyAgICAgICAgICAgICAgICAgICAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikpCisKKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX2VxdWFsX2FsbG9jcyhfT3RoZXIpCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKHRoaXMtPmdldF9hbGxvY2F0b3IoKSA9PSBfT3RoZXIuZ2V0X2FsbG9jYXRvcigpLAlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2VxdWFsX2FsbG9jcykJXAorCQkgICAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikpCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVR19QRURBTlRJQworIyAgZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX1N0cmluZykgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9TdHJpbmcgIT0gMCkKKyMgIGRlZmluZSBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nX2xlbihfU3RyaW5nLF9MZW4pIFwKKyAgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX1N0cmluZyAhPSAwIHx8IF9MZW4gPT0gMCkKKyNlbHNlCisjICBkZWZpbmUgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfU3RyaW5nKQorIyAgZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19zdHJpbmdfbGVuKF9TdHJpbmcsX0xlbikKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvbWFwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1YTgyZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvbWFwCkBAIC0wLDAgKzEsMzYgQEAKKy8vIERlYnVnZ2luZyBtYXAvbXVsdGltYXAgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL21hcAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfTUFQCisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX01BUCAxCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8ZGVidWcvbWFwLmg+CisjaW5jbHVkZSA8ZGVidWcvbXVsdGltYXAuaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL21hcC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2FjNTM4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9tYXAuaApAQCAtMCwwICsxLDQ5MSBAQAorLy8gRGVidWdnaW5nIG1hcCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvbWFwLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX01BUF9ICisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX01BUF9IIDEKKworI2luY2x1ZGUgPGRlYnVnL3NhZmVfc2VxdWVuY2UuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19kZWJ1ZworeworICAvLy8gQ2xhc3Mgc3RkOjptYXAgd2l0aCBzYWZldHkvY2hlY2tpbmcvZGVidWcgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlID0gc3RkOjpsZXNzPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+ID4KKyAgICBjbGFzcyBtYXAKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQzo6bWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+LAorICAgICAgcHVibGljIF9fZ251X2RlYnVnOjpfU2FmZV9zZXF1ZW5jZTxtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6Om1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiBfQmFzZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgX0Jhc2VfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9FcXVhbF90bzxfQmFzZV9jb25zdF9pdGVyYXRvcj4gX0VxdWFsOworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVzOgorICAgICAgdHlwZWRlZiBfS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9Db21wYXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9BbGxvY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfaXRlcmF0b3IsIG1hcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2NvbnN0X2l0ZXJhdG9yLCBtYXA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9wb2ludGVyICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIC8vIDIzLjMuMS4xIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgICBleHBsaWNpdCBtYXAoY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJCSAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19jb21wLCBfX2EpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKwk6IF9CYXNlKF9fZ251X2RlYnVnOjpfX2Jhc2UoX19nbnVfZGVidWc6Ol9fY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwKKwkJCQkJCQkJICAgICBfX2xhc3QpKSwKKwkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpLAorCQlfX2NvbXAsIF9fYSkgeyB9CisKKyAgICAgIG1hcChjb25zdCBtYXAmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworICAgICAgbWFwKGNvbnN0IF9CYXNlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBtYXAobWFwJiYgX194KQorICAgICAgbm9leGNlcHQoaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8X0NvbXBhcmU+Ojp2YWx1ZSkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpCisgICAgICB7IHRoaXMtPl9NX3N3YXAoX194KTsgfQorCisgICAgICBtYXAoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJICBjb25zdCBfQ29tcGFyZSYgX19jID0gX0NvbXBhcmUoKSwKKwkgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2wsIF9fYywgX19hKSB7IH0KKyNlbmRpZgorCisgICAgICB+bWFwKCkgX0dMSUJDWFhfTk9FWENFUFQgeyB9CisKKyAgICAgIG1hcCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBtYXAmIF9feCkKKyAgICAgIHsKKwkqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9feDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIG1hcCYKKyAgICAgIG9wZXJhdG9yPShtYXAmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwlfX2dsaWJjeHhfY2hlY2tfc2VsZl9tb3ZlX2Fzc2lnbihfX3gpOworCWNsZWFyKCk7CisJc3dhcChfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgbWFwJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+aW5zZXJ0KF9fbCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDEzMy4gbWFwIG1pc3NpbmcgZ2V0X2FsbG9jYXRvcigpCisgICAgICB1c2luZyBfQmFzZTo6Z2V0X2FsbG9jYXRvcjsKKworICAgICAgLy8gaXRlcmF0b3JzOgorICAgICAgaXRlcmF0b3IgCisgICAgICBiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyNlbmRpZgorCisgICAgICAvLyBjYXBhY2l0eToKKyAgICAgIHVzaW5nIF9CYXNlOjplbXB0eTsKKyAgICAgIHVzaW5nIF9CYXNlOjpzaXplOworICAgICAgdXNpbmcgX0Jhc2U6Om1heF9zaXplOworCisgICAgICAvLyAyMy4zLjEuMiBlbGVtZW50IGFjY2VzczoKKyAgICAgIHVzaW5nIF9CYXNlOjpvcGVyYXRvcltdOworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiA0NjQuIFN1Z2dlc3Rpb24gZm9yIG5ldyBtZW1iZXIgZnVuY3Rpb25zIGluIHN0YW5kYXJkIGNvbnRhaW5lcnMuCisgICAgICB1c2luZyBfQmFzZTo6YXQ7CisKKyAgICAgIC8vIG1vZGlmaWVyczoKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisJZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBhdXRvIF9fcmVzID0gX0Jhc2U6OmVtcGxhY2Uoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIHJldHVybiBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCQkJICAgX19yZXMuc2Vjb25kKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zKTsKKwkgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW1wbGFjZV9oaW50KF9fcG9zLmJhc2UoKSwKKwkJCQkJICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSwKKwkJCSAgdGhpcyk7CisJfQorI2VuZGlmCisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBib29sPiBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX194KTsKKwlyZXR1cm4gc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPihpdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksCisJCQkJCSBfX3Jlcy5zZWNvbmQpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPHZhbHVlX3R5cGUsCisJCQkJCQkgICAgX1BhaXImJj46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgICBpbnNlcnQoX1BhaXImJiBfX3gpCisgICAgICAgIHsKKwkgIHN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgYm9vbD4gX19yZXMKKwkgICAgPSBfQmFzZTo6aW5zZXJ0KHN0ZDo6Zm9yd2FyZDxfUGFpcj4oX194KSk7CisJICByZXR1cm4gc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPihpdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksCisJCQkJCSAgIF9fcmVzLnNlY29uZCk7CisJfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbGlzdCkKKyAgICAgIHsgX0Jhc2U6Omluc2VydChfX2xpc3QpOyB9CisjZW5kaWYKKworICAgICAgaXRlcmF0b3IKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorI2Vsc2UKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZW5kaWYKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCXJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBfX3gpLCB0aGlzKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLAorCQkJCQkJICAgIF9QYWlyJiY+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBfUGFpciYmIF9feCkKKyAgICAgICAgeworCSAgX19nbGliY3h4X2NoZWNrX2luc2VydChfX3Bvc2l0aW9uKTsKKwkgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLAorCQkJCQlzdGQ6OmZvcndhcmQ8X1BhaXI+KF9feCkpLCB0aGlzKTsKKwl9CisjZW5kaWYKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJICBfQmFzZTo6aW5zZXJ0KF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCkpOworCX0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZShfX3Bvc2l0aW9uKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3Bvc2l0aW9uLmJhc2UoKSkpOworCXJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbi5iYXNlKCkpLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IHJldHVybiBlcmFzZShjb25zdF9pdGVyYXRvcihfX3Bvc2l0aW9uKSk7IH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZShfX3Bvc2l0aW9uKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3Bvc2l0aW9uLmJhc2UoKSkpOworCV9CYXNlOjplcmFzZShfX3Bvc2l0aW9uLmJhc2UoKSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeworCV9CYXNlX2l0ZXJhdG9yIF9fdmljdGltID0gX0Jhc2U6OmZpbmQoX194KTsKKwlpZiAoX192aWN0aW0gPT0gX0Jhc2U6OmVuZCgpKQorCSAgcmV0dXJuIDA7CisJZWxzZQorCSAgeworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgICBfQmFzZTo6ZXJhc2UoX192aWN0aW0pOworCSAgICByZXR1cm4gMTsKKwkgIH0KKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDE1MS4gY2FuJ3QgY3VycmVudGx5IGNsZWFyKCkgZW1wdHkgY29udGFpbmVyCisJX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJZm9yIChfQmFzZV9jb25zdF9pdGVyYXRvciBfX3ZpY3RpbSA9IF9fZmlyc3QuYmFzZSgpOworCSAgICAgX192aWN0aW0gIT0gX19sYXN0LmJhc2UoKTsgKytfX3ZpY3RpbSkKKwkgIHsKKwkgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fdmljdGltICE9IF9CYXNlOjplbmQoKSwKKwkJCQkgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fZmlyc3QsICJmaXJzdCIpCisJCQkJICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX192aWN0aW0pKTsKKwkgIH0KKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fZmlyc3QuYmFzZSgpLCBfX2xhc3QuYmFzZSgpKSwgdGhpcyk7CisgICAgICB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAxNTEuIGNhbid0IGN1cnJlbnRseSBjbGVhcigpIGVtcHR5IGNvbnRhaW5lcgorCV9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCWZvciAoX0Jhc2VfaXRlcmF0b3IgX192aWN0aW0gPSBfX2ZpcnN0LmJhc2UoKTsKKwkgICAgIF9fdmljdGltICE9IF9fbGFzdC5iYXNlKCk7ICsrX192aWN0aW0pCisJICB7CisJICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX3ZpY3RpbSAhPSBfQmFzZTo6ZW5kKCksCisJCQkJICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9yYW5nZSkKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2ZpcnN0LCAiZmlyc3QiKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fbGFzdCwgImxhc3QiKSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fdmljdGltKSk7CisJICB9CisJX0Jhc2U6OmVyYXNlKF9fZmlyc3QuYmFzZSgpLCBfX2xhc3QuYmFzZSgpKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBzd2FwKG1hcCYgX194KQorICAgICAgeworCV9CYXNlOjpzd2FwKF9feCk7CisJdGhpcy0+X01fc3dhcChfX3gpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlfQmFzZTo6Y2xlYXIoKTsKKyAgICAgIH0KKworICAgICAgLy8gb2JzZXJ2ZXJzOgorICAgICAgdXNpbmcgX0Jhc2U6OmtleV9jb21wOworICAgICAgdXNpbmcgX0Jhc2U6OnZhbHVlX2NvbXA7CisKKyAgICAgIC8vIDIzLjMuMS4zIG1hcCBvcGVyYXRpb25zOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpmaW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZmluZChfX3gpLCB0aGlzKTsgfQorCisgICAgICB1c2luZyBfQmFzZTo6Y291bnQ7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omxvd2VyX2JvdW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6Omxvd2VyX2JvdW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OnVwcGVyX2JvdW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OnVwcGVyX2JvdW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvcixpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX19yZXMgPQorCV9CYXNlOjplcXVhbF9yYW5nZShfX3gpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksCisJCQkgICAgICBpdGVyYXRvcihfX3Jlcy5zZWNvbmQsIHRoaXMpKTsKKyAgICAgIH0KKworICAgICAgc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsKKwlzdGQ6OnBhaXI8X0Jhc2VfY29uc3RfaXRlcmF0b3IsIF9CYXNlX2NvbnN0X2l0ZXJhdG9yPiBfX3JlcyA9CisJX0Jhc2U6OmVxdWFsX3JhbmdlKF9feCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGNvbnN0X2l0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGNvbnN0X2l0ZXJhdG9yKF9fcmVzLnNlY29uZCwgdGhpcykpOworICAgICAgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBfR0xJQkNYWF9OT0VYQ0VQVCAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVCB7IHJldHVybiAqdGhpczsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2ludmFsaWRhdGVfYWxsKCkKKyAgICAgIHsKKwl0eXBlZGVmIF9fZ251X2RlYnVnOjpfTm90X2VxdWFsX3RvPF9CYXNlX2NvbnN0X2l0ZXJhdG9yPiBfTm90X2VxdWFsOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX05vdF9lcXVhbChfTV9iYXNlKCkuZW5kKCkpKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSAhPSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPD0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAobWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fZGVidWcKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvbXVsdGltYXAuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvbXVsdGltYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDMxOThmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9tdWx0aW1hcC5oCkBAIC0wLDAgKzEsNDc0IEBACisvLyBEZWJ1Z2dpbmcgbXVsdGltYXAgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL211bHRpbWFwLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX01VTFRJTUFQX0gKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfTVVMVElNQVBfSCAxCisKKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX3NlcXVlbmNlLmg+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9pdGVyYXRvci5oPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fZGVidWcKK3sKKyAgLy8vIENsYXNzIHN0ZDo6bXVsdGltYXAgd2l0aCBzYWZldHkvY2hlY2tpbmcvZGVidWcgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlID0gc3RkOjpsZXNzPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+ID4KKyAgICBjbGFzcyBtdWx0aW1hcAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjptdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiwKKyAgICAgIHB1YmxpYyBfX2dudV9kZWJ1Zzo6X1NhZmVfc2VxdWVuY2U8bXVsdGltYXA8X0tleSwgX1RwLAorCQkJCQkJICBfQ29tcGFyZSwgX0FsbG9jYXRvcj4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6Om11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+IF9CYXNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9jb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X0VxdWFsX3RvPF9CYXNlX2NvbnN0X2l0ZXJhdG9yPiBfRXF1YWw7CisgICAgcHVibGljOgorICAgICAgLy8gdHlwZXM6CisgICAgICB0eXBlZGVmIF9LZXkJCQkJICAgICBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwCQkJCSAgICAgbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9Db21wYXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9jb21wYXJlOworICAgICAgdHlwZWRlZiBfQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlZmVyZW5jZSAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2l0ZXJhdG9yLCBtdWx0aW1hcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjxfQmFzZV9jb25zdF9pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aW1hcD4gY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpwb2ludGVyICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9wb2ludGVyICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIC8vIDIzLjMuMS4xIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgICBleHBsaWNpdCBtdWx0aW1hcChjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkJCWNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19jb21wLCBfX2EpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIG11bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJICAgICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKwk6IF9CYXNlKF9fZ251X2RlYnVnOjpfX2Jhc2UoX19nbnVfZGVidWc6Ol9fY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwKKwkJCQkJCQkJICAgICBfX2xhc3QpKSwKKwkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpLAorCSAgICAgIF9fY29tcCwgX19hKSB7IH0KKworICAgICAgbXVsdGltYXAoY29uc3QgbXVsdGltYXAmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworICAgICAgbXVsdGltYXAoY29uc3QgX0Jhc2UmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIG11bHRpbWFwKG11bHRpbWFwJiYgX194KQorICAgICAgbm9leGNlcHQoaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8X0NvbXBhcmU+Ojp2YWx1ZSkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpCisgICAgICB7IHRoaXMtPl9NX3N3YXAoX194KTsgfQorCisgICAgICBtdWx0aW1hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fYyA9IF9Db21wYXJlKCksCisJICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2wsIF9fYywgX19hKSB7IH0KKyNlbmRpZgorCisgICAgICB+bXVsdGltYXAoKSBfR0xJQkNYWF9OT0VYQ0VQVCB7IH0KKworICAgICAgbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0oY29uc3QgbXVsdGltYXAmIF9feCkKKyAgICAgIHsKKwkqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9feDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIG11bHRpbWFwJgorICAgICAgb3BlcmF0b3I9KG11bHRpbWFwJiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJX19nbGliY3h4X2NoZWNrX3NlbGZfbW92ZV9hc3NpZ24oX194KTsKKwljbGVhcigpOworCXN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIG11bHRpbWFwJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+aW5zZXJ0KF9fbCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHVzaW5nIF9CYXNlOjpnZXRfYWxsb2NhdG9yOworCisgICAgICAvLyBpdGVyYXRvcnM6CisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisjZW5kaWYKKworICAgICAgLy8gY2FwYWNpdHk6CisgICAgICB1c2luZyBfQmFzZTo6ZW1wdHk7CisgICAgICB1c2luZyBfQmFzZTo6c2l6ZTsKKyAgICAgIHVzaW5nIF9CYXNlOjptYXhfc2l6ZTsKKworICAgICAgLy8gbW9kaWZpZXJzOgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVtcGxhY2Uoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSwgdGhpcyk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX3BvcywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgX19nbGliY3h4X2NoZWNrX2luc2VydChfX3Bvcyk7CisJICByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVtcGxhY2VfaGludChfX3Bvcy5iYXNlKCksCisJCQkJCSAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLiksCisJCQkgIHRoaXMpOworCX0KKyNlbmRpZgorICAgICAgCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX194KSwgdGhpcyk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLAorCQkJCQkJICAgIF9QYWlyJiY+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGluc2VydChfUGFpciYmIF9feCkKKyAgICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChzdGQ6OmZvcndhcmQ8X1BhaXI+KF9feCkpLCB0aGlzKTsgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbGlzdCkKKyAgICAgIHsgX0Jhc2U6Omluc2VydChfX2xpc3QpOyB9CisjZW5kaWYKKworICAgICAgaXRlcmF0b3IKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorI2Vsc2UKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZW5kaWYKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCXJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBfX3gpLCB0aGlzKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLAorCQkJCQkJICAgIF9QYWlyJiY+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBfUGFpciYmIF9feCkKKyAgICAgICAgeworCSAgX19nbGliY3h4X2NoZWNrX2luc2VydChfX3Bvc2l0aW9uKTsKKwkgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLAorCQkJCQlzdGQ6OmZvcndhcmQ8X1BhaXI+KF9feCkpLCB0aGlzKTsKKwl9CisjZW5kaWYKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJICBfQmFzZTo6aW5zZXJ0KF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCkpOworCX0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZShfX3Bvc2l0aW9uKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3Bvc2l0aW9uLmJhc2UoKSkpOworCXJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbi5iYXNlKCkpLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IHJldHVybiBlcmFzZShjb25zdF9pdGVyYXRvcihfX3Bvc2l0aW9uKSk7IH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZShfX3Bvc2l0aW9uKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3Bvc2l0aW9uLmJhc2UoKSkpOworCV9CYXNlOjplcmFzZShfX3Bvc2l0aW9uLmJhc2UoKSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeworCXN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgX0Jhc2VfaXRlcmF0b3I+IF9fdmljdGltcyA9CisJICBfQmFzZTo6ZXF1YWxfcmFuZ2UoX194KTsKKwlzaXplX3R5cGUgX19jb3VudCA9IDA7CisJX0Jhc2VfaXRlcmF0b3IgX192aWN0aW0gPSBfX3ZpY3RpbXMuZmlyc3Q7CisJd2hpbGUgKF9fdmljdGltICE9ICBfX3ZpY3RpbXMuc2Vjb25kKQorCSAgeworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgICBfQmFzZTo6ZXJhc2UoX192aWN0aW0rKyk7CisJICAgICsrX19jb3VudDsKKwkgIH0KKwlyZXR1cm4gX19jb3VudDsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDE1MS4gY2FuJ3QgY3VycmVudGx5IGNsZWFyKCkgZW1wdHkgY29udGFpbmVyCisJX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJZm9yIChfQmFzZV9jb25zdF9pdGVyYXRvciBfX3ZpY3RpbSA9IF9fZmlyc3QuYmFzZSgpOworCSAgICAgX192aWN0aW0gIT0gX19sYXN0LmJhc2UoKTsgKytfX3ZpY3RpbSkKKwkgIHsKKwkgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fdmljdGltICE9IF9CYXNlOjplbmQoKSwKKwkJCQkgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fZmlyc3QsICJmaXJzdCIpCisJCQkJICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX192aWN0aW0pKTsKKwkgIH0KKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fZmlyc3QuYmFzZSgpLCBfX2xhc3QuYmFzZSgpKSwgdGhpcyk7CisgICAgICB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAxNTEuIGNhbid0IGN1cnJlbnRseSBjbGVhcigpIGVtcHR5IGNvbnRhaW5lcgorCV9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCWZvciAoX0Jhc2VfaXRlcmF0b3IgX192aWN0aW0gPSBfX2ZpcnN0LmJhc2UoKTsKKwkgICAgIF9fdmljdGltICE9IF9fbGFzdC5iYXNlKCk7ICsrX192aWN0aW0pCisJICB7CisJICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX3ZpY3RpbSAhPSBfQmFzZTo6ZW5kKCksCisJCQkJICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9yYW5nZSkKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2ZpcnN0LCAiZmlyc3QiKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fbGFzdCwgImxhc3QiKSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fdmljdGltKSk7CisJICB9CisJX0Jhc2U6OmVyYXNlKF9fZmlyc3QuYmFzZSgpLCBfX2xhc3QuYmFzZSgpKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBzd2FwKG11bHRpbWFwJiBfX3gpCisgICAgICB7CisJX0Jhc2U6OnN3YXAoX194KTsKKwl0aGlzLT5fTV9zd2FwKF9feCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCV9CYXNlOjpjbGVhcigpOworICAgICAgfQorCisgICAgICAvLyBvYnNlcnZlcnM6CisgICAgICB1c2luZyBfQmFzZTo6a2V5X2NvbXA7CisgICAgICB1c2luZyBfQmFzZTo6dmFsdWVfY29tcDsKKworICAgICAgLy8gMjMuMy4xLjMgbXVsdGltYXAgb3BlcmF0aW9uczoKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZmluZChfX3gpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX194KSwgdGhpcyk7IH0KKworICAgICAgdXNpbmcgX0Jhc2U6OmNvdW50OworCisgICAgICBpdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpsb3dlcl9ib3VuZChfX3gpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpsb3dlcl9ib3VuZChfX3gpLCB0aGlzKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjp1cHBlcl9ib3VuZChfX3gpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjp1cHBlcl9ib3VuZChfX3gpLCB0aGlzKTsgfQorCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeworCXN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgX0Jhc2VfaXRlcmF0b3I+IF9fcmVzID0KKwlfQmFzZTo6ZXF1YWxfcmFuZ2UoX194KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLAorCQkJICAgICAgaXRlcmF0b3IoX19yZXMuc2Vjb25kLCB0aGlzKSk7CisgICAgICB9CisKKyAgICAgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvcixjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2NvbnN0X2l0ZXJhdG9yLCBfQmFzZV9jb25zdF9pdGVyYXRvcj4gX19yZXMgPQorCSAgX0Jhc2U6OmVxdWFsX3JhbmdlKF9feCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGNvbnN0X2l0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGNvbnN0X2l0ZXJhdG9yKF9fcmVzLnNlY29uZCwgdGhpcykpOworICAgICAgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBfR0xJQkNYWF9OT0VYQ0VQVCAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVCB7IHJldHVybiAqdGhpczsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2ludmFsaWRhdGVfYWxsKCkKKyAgICAgIHsKKwl0eXBlZGVmIF9fZ251X2RlYnVnOjpfTm90X2VxdWFsX3RvPF9CYXNlX2NvbnN0X2l0ZXJhdG9yPiBfTm90X2VxdWFsOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX05vdF9lcXVhbChfQmFzZTo6ZW5kKCkpKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID09IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpICE9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDw9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID49IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAobXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX2RlYnVnCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL211bHRpc2V0LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL211bHRpc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjNzYxZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvbXVsdGlzZXQuaApAQCAtMCwwICsxLDQ2MCBAQAorLy8gRGVidWdnaW5nIG11bHRpc2V0IGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9tdWx0aXNldC5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19NVUxUSVNFVF9ICisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX01VTFRJU0VUX0ggMQorCisjaW5jbHVkZSA8ZGVidWcvc2FmZV9zZXF1ZW5jZS5oPgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfaXRlcmF0b3IuaD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX2RlYnVnCit7CisgIC8vLyBDbGFzcyBzdGQ6Om11bHRpc2V0IHdpdGggc2FmZXR5L2NoZWNraW5nL2RlYnVnIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleT4sCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPF9LZXk+ID4KKyAgICBjbGFzcyBtdWx0aXNldAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjptdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4sCisgICAgICBwdWJsaWMgX19nbnVfZGVidWc6Ol9TYWZlX3NlcXVlbmNlPG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQzo6bXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+IF9CYXNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9jb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X0VxdWFsX3RvPF9CYXNlX2NvbnN0X2l0ZXJhdG9yPiBfRXF1YWw7CisgICAgcHVibGljOgorICAgICAgLy8gdHlwZXM6CisgICAgICB0eXBlZGVmIF9LZXkJCQkJICAgICBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0tleQkJCQkgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9Db21wYXJlCQkJCSAgICAga2V5X2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9Db21wYXJlCQkJCSAgICAgdmFsdWVfY29tcGFyZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jYXRvcgkJCSAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UJICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICAgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjxfQmFzZV9pdGVyYXRvciwgbXVsdGlzZXQ+CisgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2NvbnN0X2l0ZXJhdG9yLAorCQkJCQkgIG11bHRpc2V0PiBjb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnBvaW50ZXIgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3BvaW50ZXIgICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgLy8gMjMuMy4zLjEgY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICAgIGV4cGxpY2l0IG11bHRpc2V0KGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCQkJY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX2NvbXAsIF9fYSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBtdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSBjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkJIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKwk6IF9CYXNlKF9fZ251X2RlYnVnOjpfX2Jhc2UoX19nbnVfZGVidWc6Ol9fY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwKKwkJCQkJCQkJICAgICBfX2xhc3QpKSwKKwkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpLAorCQlfX2NvbXAsIF9fYSkgeyB9CisKKyAgICAgIG11bHRpc2V0KGNvbnN0IG11bHRpc2V0JiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkgeyB9CisKKyAgICAgIG11bHRpc2V0KGNvbnN0IF9CYXNlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBtdWx0aXNldChtdWx0aXNldCYmIF9feCkKKyAgICAgIG5vZXhjZXB0KGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPF9Db21wYXJlPjo6dmFsdWUpCisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3gpKQorICAgICAgeyB0aGlzLT5fTV9zd2FwKF9feCk7IH0KKworICAgICAgbXVsdGlzZXQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLCBfX2NvbXAsIF9fYSkgeyB9CisjZW5kaWYKKworICAgICAgfm11bHRpc2V0KCkgX0dMSUJDWFhfTk9FWENFUFQgeyB9CisKKyAgICAgIG11bHRpc2V0JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IG11bHRpc2V0JiBfX3gpCisgICAgICB7CisJKnN0YXRpY19jYXN0PF9CYXNlKj4odGhpcykgPSBfX3g7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBtdWx0aXNldCYKKyAgICAgIG9wZXJhdG9yPShtdWx0aXNldCYmIF9feCkKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwkvLyBOQjogRFIgNjc1LgorCV9fZ2xpYmN4eF9jaGVja19zZWxmX21vdmVfYXNzaWduKF9feCk7CisJY2xlYXIoKTsKKwlzd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBtdWx0aXNldCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB1c2luZyBfQmFzZTo6Z2V0X2FsbG9jYXRvcjsKKworICAgICAgLy8gaXRlcmF0b3JzOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorI2VuZGlmCisKKyAgICAgIC8vIGNhcGFjaXR5OgorICAgICAgdXNpbmcgX0Jhc2U6OmVtcHR5OworICAgICAgdXNpbmcgX0Jhc2U6OnNpemU7CisgICAgICB1c2luZyBfQmFzZTo6bWF4X3NpemU7CisKKyAgICAgIC8vIG1vZGlmaWVyczoKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbXBsYWNlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLiksIHRoaXMpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlX2hpbnQoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3MpOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbXBsYWNlX2hpbnQoX19wb3MuYmFzZSgpLAorCQkJCQkgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLAorCQkJICB0aGlzKTsKKwl9CisjZW5kaWYKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9feCksIHRoaXMpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KHN0ZDo6bW92ZShfX3gpKSwgdGhpcyk7IH0KKyNlbmRpZgorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCXJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBfX3gpLCB0aGlzKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgdmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCXJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBzdGQ6Om1vdmUoX194KSksCisJCQl0aGlzKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwl2b2lkCisJaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKwl7CisJICBfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwkgIF9CYXNlOjppbnNlcnQoX19nbnVfZGVidWc6Ol9fYmFzZShfX2ZpcnN0KSwKKwkJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSk7CisJfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyBfQmFzZTo6aW5zZXJ0KF9fbCk7IH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlKF9fcG9zaXRpb24pOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fcG9zaXRpb24uYmFzZSgpKSk7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uLmJhc2UoKSksIHRoaXMpOworICAgICAgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlKF9fcG9zaXRpb24pOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fcG9zaXRpb24uYmFzZSgpKSk7CisJX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24uYmFzZSgpKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX192aWN0aW1zID0KKwkgIF9CYXNlOjplcXVhbF9yYW5nZShfX3gpOworCXNpemVfdHlwZSBfX2NvdW50ID0gMDsKKwlfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9fdmljdGltcy5maXJzdDsKKwl3aGlsZSAoX192aWN0aW0gIT0gX192aWN0aW1zLnNlY29uZCkKKwkgIHsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX192aWN0aW0pKTsKKwkgICAgX0Jhc2U6OmVyYXNlKF9fdmljdGltKyspOworCSAgICArK19fY291bnQ7CisJICB9CisJcmV0dXJuIF9fY291bnQ7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAxNTEuIGNhbid0IGN1cnJlbnRseSBjbGVhcigpIGVtcHR5IGNvbnRhaW5lcgorCV9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCWZvciAoX0Jhc2VfY29uc3RfaXRlcmF0b3IgX192aWN0aW0gPSBfX2ZpcnN0LmJhc2UoKTsKKwkgICAgIF9fdmljdGltICE9IF9fbGFzdC5iYXNlKCk7ICsrX192aWN0aW0pCisJICB7CisJICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX3ZpY3RpbSAhPSBfQmFzZTo6ZW5kKCksCisJCQkJICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9yYW5nZSkKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2ZpcnN0LCAiZmlyc3QiKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fbGFzdCwgImxhc3QiKSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fdmljdGltKSk7CisJICB9CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX2ZpcnN0LmJhc2UoKSwgX19sYXN0LmJhc2UoKSksIHRoaXMpOworICAgICAgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMTUxLiBjYW4ndCBjdXJyZW50bHkgY2xlYXIoKSBlbXB0eSBjb250YWluZXIKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwlmb3IgKF9CYXNlX2l0ZXJhdG9yIF9fdmljdGltID0gX19maXJzdC5iYXNlKCk7CisJICAgICBfX3ZpY3RpbSAhPSBfX2xhc3QuYmFzZSgpOyArK19fdmljdGltKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX192aWN0aW0gIT0gX0Jhc2U6OmVuZCgpLAorCQkJCSAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UpCisJCQkJICAuX01faXRlcmF0b3IoX19maXJzdCwgImZpcnN0IikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgfQorCV9CYXNlOjplcmFzZShfX2ZpcnN0LmJhc2UoKSwgX19sYXN0LmJhc2UoKSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgc3dhcChtdWx0aXNldCYgX194KQorICAgICAgeworCV9CYXNlOjpzd2FwKF9feCk7CisJdGhpcy0+X01fc3dhcChfX3gpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlfQmFzZTo6Y2xlYXIoKTsKKyAgICAgIH0KKworICAgICAgLy8gb2JzZXJ2ZXJzOgorICAgICAgdXNpbmcgX0Jhc2U6OmtleV9jb21wOworICAgICAgdXNpbmcgX0Jhc2U6OnZhbHVlX2NvbXA7CisKKyAgICAgIC8vIG11bHRpc2V0IG9wZXJhdGlvbnM6CisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX194KSwgdGhpcyk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjE0LiBzZXQ6OmZpbmQoKSBtaXNzaW5nIGNvbnN0IG92ZXJsb2FkCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX194KSwgdGhpcyk7IH0KKworICAgICAgdXNpbmcgX0Jhc2U6OmNvdW50OworCisgICAgICBpdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpsb3dlcl9ib3VuZChfX3gpLCB0aGlzKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTQuIHNldDo6ZmluZCgpIG1pc3NpbmcgY29uc3Qgb3ZlcmxvYWQKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6Omxvd2VyX2JvdW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OnVwcGVyX2JvdW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxNC4gc2V0OjpmaW5kKCkgbWlzc2luZyBjb25zdCBvdmVybG9hZAorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6dXBwZXJfYm91bmQoX194KSwgdGhpcyk7IH0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3JlcyA9CisJICBfQmFzZTo6ZXF1YWxfcmFuZ2UoX194KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLAorCQkJICAgICAgaXRlcmF0b3IoX19yZXMuc2Vjb25kLCB0aGlzKSk7CisgICAgICB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxNC4gc2V0OjpmaW5kKCkgbWlzc2luZyBjb25zdCBvdmVybG9hZAorICAgICAgc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsKKwlzdGQ6OnBhaXI8X0Jhc2VfY29uc3RfaXRlcmF0b3IsIF9CYXNlX2NvbnN0X2l0ZXJhdG9yPiBfX3JlcyA9CisJICBfQmFzZTo6ZXF1YWxfcmFuZ2UoX194KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoY29uc3RfaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLAorCQkJICAgICAgY29uc3RfaXRlcmF0b3IoX19yZXMuc2Vjb25kLCB0aGlzKSk7CisgICAgICB9CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpIF9HTElCQ1hYX05PRVhDRVBUICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01faW52YWxpZGF0ZV9hbGwoKQorICAgICAgeworCXR5cGVkZWYgX19nbnVfZGVidWc6Ol9Ob3RfZXF1YWxfdG88X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9Ob3RfZXF1YWw7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfTm90X2VxdWFsKF9CYXNlOjplbmQoKSkpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID09IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSAhPSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDw9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgdm9pZAorICAgIHN3YXAobXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3gsCisJIG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5zd2FwKF9feSk7IH0KKworfSAvLyBuYW1lc3BhY2UgX19kZWJ1ZworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX2Jhc2UuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFhZjc0NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV9iYXNlLmgKQEAgLTAsMCArMSwyNTQgQEAKKy8vIFNhZmUgc2VxdWVuY2UvaXRlcmF0b3IgYmFzZSBpbXBsZW1lbnRhdGlvbiAgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL3NhZmVfYmFzZS5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19TQUZFX0JBU0VfSAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19TQUZFX0JBU0VfSCAxCisKKyNpbmNsdWRlIDxleHQvY29uY3VycmVuY2UuaD4KKworbmFtZXNwYWNlIF9fZ251X2RlYnVnCit7CisgIGNsYXNzIF9TYWZlX3NlcXVlbmNlX2Jhc2U7CisKKyAgLyoqIFxicmllZiBCYXNpYyBmdW5jdGlvbmFsaXR5IGZvciBhIEBhIHNhZmUgaXRlcmF0b3IuCisgICAqCisgICAqICBUaGUgJV9TYWZlX2l0ZXJhdG9yX2Jhc2UgYmFzZSBjbGFzcyBpbXBsZW1lbnRzIHRoZSBmdW5jdGlvbmFsaXR5CisgICAqICBvZiBhIHNhZmUgaXRlcmF0b3IgdGhhdCBpcyBub3Qgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIGl0ZXJhdG9yCisgICAqICB0eXBlLiBJdCBjb250YWlucyBhIHBvaW50ZXIgYmFjayB0byB0aGUgc2VxdWVuY2UgaXQgcmVmZXJlbmNlcworICAgKiAgYWxvbmcgd2l0aCBpdGVyYXRvciB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBwb2ludGVycyB0byBmb3JtIGEKKyAgICogIGRvdWJseS1saW5rZWQgbGlzdCBvZiBpdGVyYXRvcnMgcmVmZXJlbmNlZCBieSB0aGUgY29udGFpbmVyLgorICAgKgorICAgKiAgVGhpcyBjbGFzcyBtdXN0IG5vdCBwZXJmb3JtIGFueSBvcGVyYXRpb25zIHRoYXQgY2FuIHRocm93IGFuCisgICAqICBleGNlcHRpb24sIG9yIHRoZSBleGNlcHRpb24gZ3VhcmFudGVlcyBvZiBkZXJpdmVkIGl0ZXJhdG9ycyB3aWxsCisgICAqICBiZSBicm9rZW4uCisgICAqLworICBjbGFzcyBfU2FmZV9pdGVyYXRvcl9iYXNlCisgIHsKKyAgcHVibGljOgorICAgIC8qKiBUaGUgc2VxdWVuY2UgdGhpcyBpdGVyYXRvciByZWZlcmVuY2VzOyBtYXkgYmUgTlVMTCB0byBpbmRpY2F0ZQorCWEgc2luZ3VsYXIgaXRlcmF0b3IuICovCisgICAgX1NhZmVfc2VxdWVuY2VfYmFzZSogX01fc2VxdWVuY2U7CisKKyAgICAvKiogVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgaXRlcmF0b3IuIFRoZSBzZW50aW5lbCB2YWx1ZSAwIGlzCisgICAgICogIHVzZWQgdG8gaW5kaWNhdGUgYW4gaW52YWxpZGF0ZWQgaXRlcmF0b3IgKGkuZS4sIG9uZSB0aGF0IGlzCisgICAgICogIHNpbmd1bGFyIGJlY2F1c2Ugb2YgYW4gb3BlcmF0aW9uIG9uIHRoZSBjb250YWluZXIpLiBUaGlzCisgICAgICogIHZlcnNpb24gbnVtYmVyIG11c3QgZXF1YWwgdGhlIHZlcnNpb24gbnVtYmVyIGluIHRoZSBzZXF1ZW5jZQorICAgICAqICByZWZlcmVuY2VkIGJ5IF9NX3NlcXVlbmNlIGZvciB0aGUgaXRlcmF0b3IgdG8gYmUKKyAgICAgKiAgbm9uLXNpbmd1bGFyLgorICAgICAqLworICAgIHVuc2lnbmVkIGludCAgICAgICAgIF9NX3ZlcnNpb247CisKKyAgICAvKiogUG9pbnRlciB0byB0aGUgcHJldmlvdXMgaXRlcmF0b3IgaW4gdGhlIHNlcXVlbmNlJ3MgbGlzdCBvZgorCWl0ZXJhdG9ycy4gT25seSB2YWxpZCB3aGVuIF9NX3NlcXVlbmNlICE9IE5VTEwuICovCisgICAgX1NhZmVfaXRlcmF0b3JfYmFzZSogX01fcHJpb3I7CisKKyAgICAvKiogUG9pbnRlciB0byB0aGUgbmV4dCBpdGVyYXRvciBpbiB0aGUgc2VxdWVuY2UncyBsaXN0IG9mCisJaXRlcmF0b3JzLiBPbmx5IHZhbGlkIHdoZW4gX01fc2VxdWVuY2UgIT0gTlVMTC4gKi8KKyAgICBfU2FmZV9pdGVyYXRvcl9iYXNlKiBfTV9uZXh0OworCisgIHByb3RlY3RlZDoKKyAgICAvKiogSW5pdGlhbGl6ZXMgdGhlIGl0ZXJhdG9yIGFuZCBtYWtlcyBpdCBzaW5ndWxhci4gKi8KKyAgICBfU2FmZV9pdGVyYXRvcl9iYXNlKCkKKyAgICA6IF9NX3NlcXVlbmNlKDApLCBfTV92ZXJzaW9uKDApLCBfTV9wcmlvcigwKSwgX01fbmV4dCgwKQorICAgIHsgfQorCisgICAgLyoqIEluaXRpYWxpemUgdGhlIGl0ZXJhdG9yIHRvIHJlZmVyZW5jZSB0aGUgc2VxdWVuY2UgcG9pbnRlZCB0bworICAgICAqICBieSBAcCBfX3NlcS4gQHAgX19jb25zdGFudCBpcyB0cnVlIHdoZW4gd2UgYXJlIGluaXRpYWxpemluZyBhCisgICAgICogIGNvbnN0YW50IGl0ZXJhdG9yLCBhbmQgZmFsc2UgaWYgaXQgaXMgYSBtdXRhYmxlIGl0ZXJhdG9yLiBOb3RlCisgICAgICogIHRoYXQgQHAgX19zZXEgbWF5IGJlIE5VTEwsIGluIHdoaWNoIGNhc2UgdGhlIGl0ZXJhdG9yIHdpbGwgYmUKKyAgICAgKiAgc2luZ3VsYXIuIE90aGVyd2lzZSwgdGhlIGl0ZXJhdG9yIHdpbGwgcmVmZXJlbmNlIEBwIF9fc2VxIGFuZAorICAgICAqICBiZSBub25zaW5ndWxhci4KKyAgICAgKi8KKyAgICBfU2FmZV9pdGVyYXRvcl9iYXNlKGNvbnN0IF9TYWZlX3NlcXVlbmNlX2Jhc2UqIF9fc2VxLCBib29sIF9fY29uc3RhbnQpCisgICAgOiBfTV9zZXF1ZW5jZSgwKSwgX01fdmVyc2lvbigwKSwgX01fcHJpb3IoMCksIF9NX25leHQoMCkKKyAgICB7IHRoaXMtPl9NX2F0dGFjaChjb25zdF9jYXN0PF9TYWZlX3NlcXVlbmNlX2Jhc2UqPihfX3NlcSksIF9fY29uc3RhbnQpOyB9CisKKyAgICAvKiogSW5pdGlhbGl6ZXMgdGhlIGl0ZXJhdG9yIHRvIHJlZmVyZW5jZSB0aGUgc2FtZSBzZXF1ZW5jZSB0aGF0CisJQHAgX194IGRvZXMuIEBwIF9fY29uc3RhbnQgaXMgdHJ1ZSBpZiB0aGlzIGlzIGEgY29uc3RhbnQKKwlpdGVyYXRvciwgYW5kIGZhbHNlIGlmIGl0IGlzIG11dGFibGUuICovCisgICAgX1NhZmVfaXRlcmF0b3JfYmFzZShjb25zdCBfU2FmZV9pdGVyYXRvcl9iYXNlJiBfX3gsIGJvb2wgX19jb25zdGFudCkKKyAgICA6IF9NX3NlcXVlbmNlKDApLCBfTV92ZXJzaW9uKDApLCBfTV9wcmlvcigwKSwgX01fbmV4dCgwKQorICAgIHsgdGhpcy0+X01fYXR0YWNoKF9feC5fTV9zZXF1ZW5jZSwgX19jb25zdGFudCk7IH0KKworICAgIF9TYWZlX2l0ZXJhdG9yX2Jhc2UmCisgICAgb3BlcmF0b3I9KGNvbnN0IF9TYWZlX2l0ZXJhdG9yX2Jhc2UmKTsKKworICAgIGV4cGxpY2l0CisgICAgX1NhZmVfaXRlcmF0b3JfYmFzZShjb25zdCBfU2FmZV9pdGVyYXRvcl9iYXNlJik7CisKKyAgICB+X1NhZmVfaXRlcmF0b3JfYmFzZSgpIHsgdGhpcy0+X01fZGV0YWNoKCk7IH0KKworICAgIC8qKiBGb3IgdXNlIGluIF9TYWZlX2l0ZXJhdG9yLiAqLworICAgIF9fZ251X2N4eDo6X19tdXRleCYgX01fZ2V0X211dGV4KCkgdGhyb3cgKCk7CisKKyAgcHVibGljOgorICAgIC8qKiBBdHRhY2hlcyB0aGlzIGl0ZXJhdG9yIHRvIHRoZSBnaXZlbiBzZXF1ZW5jZSwgZGV0YWNoaW5nIGl0CisgICAgICoJZnJvbSB3aGF0ZXZlciBzZXF1ZW5jZSBpdCB3YXMgYXR0YWNoZWQgdG8gb3JpZ2luYWxseS4gSWYgdGhlCisgICAgICoJbmV3IHNlcXVlbmNlIGlzIHRoZSBOVUxMIHBvaW50ZXIsIHRoZSBpdGVyYXRvciBpcyBsZWZ0CisgICAgICoJdW5hdHRhY2hlZC4KKyAgICAgKi8KKyAgICB2b2lkIF9NX2F0dGFjaChfU2FmZV9zZXF1ZW5jZV9iYXNlKiBfX3NlcSwgYm9vbCBfX2NvbnN0YW50KTsKKworICAgIC8qKiBMaWtld2lzZSwgYnV0IG5vdCB0aHJlYWQtc2FmZS4gKi8KKyAgICB2b2lkIF9NX2F0dGFjaF9zaW5nbGUoX1NhZmVfc2VxdWVuY2VfYmFzZSogX19zZXEsIGJvb2wgX19jb25zdGFudCkgdGhyb3cgKCk7CisKKyAgICAvKiogRGV0YWNoIHRoZSBpdGVyYXRvciBmb3Igd2hhdGV2ZXIgc2VxdWVuY2UgaXQgaXMgYXR0YWNoZWQgdG8sCisgICAgICoJaWYgYW55LgorICAgICovCisgICAgdm9pZCBfTV9kZXRhY2goKTsKKworICAgIC8qKiBMaWtld2lzZSwgYnV0IG5vdCB0aHJlYWQtc2FmZS4gKi8KKyAgICB2b2lkIF9NX2RldGFjaF9zaW5nbGUoKSB0aHJvdyAoKTsKKworICAgIC8qKiBEZXRlcm1pbmVzIGlmIHdlIGFyZSBhdHRhY2hlZCB0byB0aGUgZ2l2ZW4gc2VxdWVuY2UuICovCisgICAgYm9vbCBfTV9hdHRhY2hlZF90byhjb25zdCBfU2FmZV9zZXF1ZW5jZV9iYXNlKiBfX3NlcSkgY29uc3QKKyAgICB7IHJldHVybiBfTV9zZXF1ZW5jZSA9PSBfX3NlcTsgfQorCisgICAgLyoqIElzIHRoaXMgaXRlcmF0b3Igc2luZ3VsYXI/ICovCisgICAgX0dMSUJDWFhfUFVSRSBib29sIF9NX3Npbmd1bGFyKCkgY29uc3QgdGhyb3cgKCk7CisKKyAgICAvKiogQ2FuIHdlIGNvbXBhcmUgdGhpcyBpdGVyYXRvciB0byB0aGUgZ2l2ZW4gaXRlcmF0b3IgQHAgX194PworCVJldHVybnMgdHJ1ZSBpZiBib3RoIGl0ZXJhdG9ycyBhcmUgbm9uc2luZ3VsYXIgYW5kIHJlZmVyZW5jZQorCXRoZSBzYW1lIHNlcXVlbmNlLiAqLworICAgIF9HTElCQ1hYX1BVUkUgYm9vbCBfTV9jYW5fY29tcGFyZShjb25zdCBfU2FmZV9pdGVyYXRvcl9iYXNlJiBfX3gpIGNvbnN0IHRocm93ICgpOworCisgICAgLyoqIEludmFsaWRhdGUgdGhlIGl0ZXJhdG9yLCBtYWtpbmcgaXQgc2luZ3VsYXIuICovCisgICAgdm9pZAorICAgIF9NX2ludmFsaWRhdGUoKQorICAgIHsgX01fdmVyc2lvbiA9IDA7IH0KKworICAgIC8qKiBSZXNldCBhbGwgbWVtYmVyIHZhcmlhYmxlcyAqLworICAgIHZvaWQKKyAgICBfTV9yZXNldCgpIHRocm93ICgpOworCisgICAgLyoqIFVubGluayBpdHNlbGYgKi8KKyAgICB2b2lkCisgICAgX01fdW5saW5rKCkgdGhyb3cgKCkKKyAgICB7CisgICAgICBpZiAoX01fcHJpb3IpCisJX01fcHJpb3ItPl9NX25leHQgPSBfTV9uZXh0OworICAgICAgaWYgKF9NX25leHQpCisJX01fbmV4dC0+X01fcHJpb3IgPSBfTV9wcmlvcjsKKyAgICB9CisgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBCYXNlIGNsYXNzIHRoYXQgc3VwcG9ydHMgdHJhY2tpbmcgb2YgaXRlcmF0b3JzIHRoYXQKKyAgICogcmVmZXJlbmNlIGEgc2VxdWVuY2UuCisgICAqCisgICAqIFRoZSAlX1NhZmVfc2VxdWVuY2VfYmFzZSBjbGFzcyBwcm92aWRlcyBiYXNpYyBzdXBwb3J0IGZvcgorICAgKiB0cmFja2luZyBpdGVyYXRvcnMgaW50byBhIHNlcXVlbmNlLiBTZXF1ZW5jZXMgdGhhdCB0cmFjaworICAgKiBpdGVyYXRvcnMgbXVzdCBkZXJpdmVkIGZyb20gJV9TYWZlX3NlcXVlbmNlX2Jhc2UgcHVibGljbHksIHNvCisgICAqIHRoYXQgc2FmZSBpdGVyYXRvcnMgKHdoaWNoIGluaGVyaXQgX1NhZmVfaXRlcmF0b3JfYmFzZSkgY2FuCisgICAqIGF0dGFjaCB0byB0aGVtLiBUaGlzIGNsYXNzIGNvbnRhaW5zIHR3byBsaW5rZWQgbGlzdHMgb2YKKyAgICogaXRlcmF0b3JzLCBvbmUgZm9yIGNvbnN0YW50IGl0ZXJhdG9ycyBhbmQgb25lIGZvciBtdXRhYmxlCisgICAqIGl0ZXJhdG9ycywgYW5kIGEgdmVyc2lvbiBudW1iZXIgdGhhdCBhbGxvd3MgdmVyeSBmYXN0CisgICAqIGludmFsaWRhdGlvbiBvZiBhbGwgaXRlcmF0b3JzIHRoYXQgcmVmZXJlbmNlIHRoZSBjb250YWluZXIuCisgICAqCisgICAqIFRoaXMgY2xhc3MgbXVzdCBlbnN1cmUgdGhhdCBubyBvcGVyYXRpb24gb24gaXQgbWF5IHRocm93IGFuCisgICAqIGV4Y2VwdGlvbiwgb3RoZXJ3aXNlIEBhIHNhZmUgc2VxdWVuY2VzIG1heSBmYWlsIHRvIHByb3ZpZGUgdGhlCisgICAqIGV4Y2VwdGlvbi1zYWZldHkgZ3VhcmFudGVlcyByZXF1aXJlZCBieSB0aGUgQysrIHN0YW5kYXJkLgorICAgKi8KKyAgY2xhc3MgX1NhZmVfc2VxdWVuY2VfYmFzZQorICB7CisgIHB1YmxpYzoKKyAgICAvLy8gVGhlIGxpc3Qgb2YgbXV0YWJsZSBpdGVyYXRvcnMgdGhhdCByZWZlcmVuY2UgdGhpcyBjb250YWluZXIKKyAgICBfU2FmZV9pdGVyYXRvcl9iYXNlKiBfTV9pdGVyYXRvcnM7CisKKyAgICAvLy8gVGhlIGxpc3Qgb2YgY29uc3RhbnQgaXRlcmF0b3JzIHRoYXQgcmVmZXJlbmNlIHRoaXMgY29udGFpbmVyCisgICAgX1NhZmVfaXRlcmF0b3JfYmFzZSogX01fY29uc3RfaXRlcmF0b3JzOworCisgICAgLy8vIFRoZSBjb250YWluZXIgdmVyc2lvbiBudW1iZXIuIFRoaXMgbnVtYmVyIG1heSBuZXZlciBiZSAwLgorICAgIG11dGFibGUgdW5zaWduZWQgaW50IF9NX3ZlcnNpb247CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIEluaXRpYWxpemUgd2l0aCBhIHZlcnNpb24gbnVtYmVyIG9mIDEgYW5kIG5vIGl0ZXJhdG9ycworICAgIF9TYWZlX3NlcXVlbmNlX2Jhc2UoKQorICAgIDogX01faXRlcmF0b3JzKDApLCBfTV9jb25zdF9pdGVyYXRvcnMoMCksIF9NX3ZlcnNpb24oMSkKKyAgICB7IH0KKworICAgIC8qKiBOb3RpZnkgYWxsIGl0ZXJhdG9ycyB0aGF0IHJlZmVyZW5jZSB0aGlzIHNlcXVlbmNlIHRoYXQgdGhlCisJc2VxdWVuY2UgaXMgYmVpbmcgZGVzdHJveWVkLiAqLworICAgIH5fU2FmZV9zZXF1ZW5jZV9iYXNlKCkKKyAgICB7IHRoaXMtPl9NX2RldGFjaF9hbGwoKTsgfQorCisgICAgLyoqIERldGFjaCBhbGwgaXRlcmF0b3JzLCBsZWF2aW5nIHRoZW0gc2luZ3VsYXIuICovCisgICAgdm9pZAorICAgIF9NX2RldGFjaF9hbGwoKTsKKworICAgIC8qKiBEZXRhY2ggYWxsIHNpbmd1bGFyIGl0ZXJhdG9ycy4KKyAgICAgKiAgQHBvc3QgZm9yIGFsbCBpdGVyYXRvcnMgaSBhdHRhY2hlZCB0byB0aGlzIHNlcXVlbmNlLAorICAgICAqICAgaS0+X01fdmVyc2lvbiA9PSBfTV92ZXJzaW9uLgorICAgICAqLworICAgIHZvaWQKKyAgICBfTV9kZXRhY2hfc2luZ3VsYXIoKTsKKworICAgIC8qKiBSZXZhbGlkYXRlcyBhbGwgYXR0YWNoZWQgc2luZ3VsYXIgaXRlcmF0b3JzLiAgVGhpcyBtZXRob2QgbWF5CisgICAgICogIGJlIHVzZWQgdG8gdmFsaWRhdGUgaXRlcmF0b3JzIHRoYXQgd2VyZSBpbnZhbGlkYXRlZCBiZWZvcmUKKyAgICAgKiAgKGJ1dCBmb3Igc29tZSByZWFzb24sIHN1Y2ggYXMgYW4gZXhjZXB0aW9uLCBuZWVkIHRvIGJlY29tZQorICAgICAqICB2YWxpZCBhZ2FpbikuCisgICAgICovCisgICAgdm9pZAorICAgIF9NX3JldmFsaWRhdGVfc2luZ3VsYXIoKTsKKworICAgIC8qKiBTd2FwIHRoaXMgc2VxdWVuY2Ugd2l0aCB0aGUgZ2l2ZW4gc2VxdWVuY2UuIFRoaXMgb3BlcmF0aW9uCisgICAgICogIGFsc28gc3dhcHMgb3duZXJzaGlwIG9mIHRoZSBpdGVyYXRvcnMsIHNvIHRoYXQgd2hlbiB0aGUKKyAgICAgKiAgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIGFsbCBpdGVyYXRvcnMgdGhhdCBvcmlnaW5hbGx5IHJlZmVyZW5jZWQKKyAgICAgKiAgb25lIGNvbnRhaW5lciBub3cgcmVmZXJlbmNlIHRoZSBvdGhlciBjb250YWluZXIuCisgICAgICovCisgICAgdm9pZAorICAgIF9NX3N3YXAoX1NhZmVfc2VxdWVuY2VfYmFzZSYgX194KTsKKworICAgIC8qKiBGb3IgdXNlIGluIF9TYWZlX3NlcXVlbmNlLiAqLworICAgIF9fZ251X2N4eDo6X19tdXRleCYgX01fZ2V0X211dGV4KCkgdGhyb3cgKCk7CisKKyAgcHVibGljOgorICAgIC8qKiBJbnZhbGlkYXRlcyBhbGwgaXRlcmF0b3JzLiAqLworICAgIHZvaWQKKyAgICBfTV9pbnZhbGlkYXRlX2FsbCgpIGNvbnN0CisgICAgeyBpZiAoKytfTV92ZXJzaW9uID09IDApIF9NX3ZlcnNpb24gPSAxOyB9CisKKyAgICAvKiogQXR0YWNoIGFuIGl0ZXJhdG9yIHRvIHRoaXMgc2VxdWVuY2UuICovCisgICAgdm9pZAorICAgIF9NX2F0dGFjaChfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX2l0LCBib29sIF9fY29uc3RhbnQpOworCisgICAgLyoqIExpa2V3aXNlIGJ1dCBub3QgdGhyZWFkIHNhZmUuICovCisgICAgdm9pZAorICAgIF9NX2F0dGFjaF9zaW5nbGUoX1NhZmVfaXRlcmF0b3JfYmFzZSogX19pdCwgYm9vbCBfX2NvbnN0YW50KSB0aHJvdyAoKTsKKworICAgIC8qKiBEZXRhY2ggYW4gaXRlcmF0b3IgZnJvbSB0aGlzIHNlcXVlbmNlICovCisgICAgdm9pZAorICAgIF9NX2RldGFjaChfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX2l0KTsKKworICAgIC8qKiBMaWtld2lzZSBidXQgbm90IHRocmVhZCBzYWZlLiAqLworICAgIHZvaWQKKyAgICBfTV9kZXRhY2hfc2luZ2xlKF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9faXQpIHRocm93ICgpOworICB9OworfSAvLyBuYW1lc3BhY2UgX19nbnVfZGVidWcKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3NhZmVfaXRlcmF0b3IuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV9pdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YTk3MWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3NhZmVfaXRlcmF0b3IuaApAQCAtMCwwICsxLDcxOSBAQAorLy8gU2FmZSBpdGVyYXRvciBpbXBsZW1lbnRhdGlvbiAgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL3NhZmVfaXRlcmF0b3IuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfU0FGRV9JVEVSQVRPUl9ICisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX1NBRkVfSVRFUkFUT1JfSCAxCisKKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorI2luY2x1ZGUgPGRlYnVnL21hY3Jvcy5oPgorI2luY2x1ZGUgPGRlYnVnL2Z1bmN0aW9ucy5oPgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfYmFzZS5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX3BhaXIuaD4KKyNpbmNsdWRlIDxleHQvdHlwZV90cmFpdHMuaD4KKworbmFtZXNwYWNlIF9fZ251X2RlYnVnCit7CisgIC8qKiBIZWxwZXIgc3RydWN0IHRvIGRlYWwgd2l0aCBzZXF1ZW5jZSBvZmZlcmluZyBhIGJlZm9yZV9iZWdpbgorICAgKiAgaXRlcmF0b3IuCisgICAqKi8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBzdHJ1Y3QgX0JlZm9yZUJlZ2luSGVscGVyCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIF9JdDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0OjppdGVyYXRvcl90eXBlIF9CYXNlSXQ7CisKKyAgICAgIHN0YXRpYyBib29sCisgICAgICBfU19JcyhfQmFzZUl0LCBjb25zdCBfU2VxdWVuY2UqKQorICAgICAgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgc3RhdGljIGJvb2wKKyAgICAgIF9TX0lzX0JlZ2lubmVzdChfQmFzZUl0IF9faXQsIGNvbnN0IF9TZXF1ZW5jZSogX19zZXEpCisgICAgICB7IHJldHVybiBfX2l0ID09IF9fc2VxLT5fTV9iYXNlKCkuYmVnaW4oKTsgfQorICAgIH07CisKKyAgLyoqIEl0ZXJhdG9ycyB0aGF0IGRlcml2ZSBmcm9tIF9TYWZlX2l0ZXJhdG9yX2Jhc2UgYnV0IHRoYXQgYXJlbid0CisgICAqICBfU2FmZV9pdGVyYXRvcnMgY2FuIGJlIGRldGVybWluZWQgc2luZ3VsYXIgb3Igbm9uLXNpbmd1bGFyIHZpYQorICAgKiAgX1NhZmVfaXRlcmF0b3JfYmFzZS4KKyAgICovCisgIGlubGluZSBib29sIAorICBfX2NoZWNrX3Npbmd1bGFyX2F1eChjb25zdCBfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX3gpCisgIHsgcmV0dXJuIF9feC0+X01fc2luZ3VsYXIoKTsgfQorCisgIC8qKiBUaGUgcHJlY2lzaW9uIHRvIHdoaWNoIHdlIGNhbiBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGJldHdlZW4KKyAgICogIHR3byBpdGVyYXRvcnMuCisgICAqLworICBlbnVtIF9EaXN0YW5jZV9wcmVjaXNpb24KKyAgICB7CisgICAgICBfX2RwX2VxdWFsaXR5LCAvLzwgQ2FuIGNvbXBhcmUgaXRlcmF0b3IgZXF1YWxpdHksIG9ubHkKKyAgICAgIF9fZHBfc2lnbiwgICAgIC8vPCBDYW4gZGV0ZXJtaW5lIGVxdWFsaXR5IGFuZCBvcmRlcmluZworICAgICAgX19kcF9leGFjdCAgICAgLy88IENhbiBkZXRlcm1pbmUgZGlzdGFuY2UgcHJlY2lzZWx5CisgICAgfTsKKworICAvKiogRGV0ZXJtaW5lIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBpdGVyYXRvcnMgd2l0aCBzb21lIGtub3duCisgICAqCXByZWNpc2lvbi4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yMSwgdHlwZW5hbWUgX0l0ZXJhdG9yMj4KKyAgICBpbmxpbmUgc3RkOjpwYWlyPHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcjE+OjpkaWZmZXJlbmNlX3R5cGUsCisJCSAgICAgX0Rpc3RhbmNlX3ByZWNpc2lvbj4KKyAgICBfX2dldF9kaXN0YW5jZShjb25zdCBfSXRlcmF0b3IxJiBfX2xocywgY29uc3QgX0l0ZXJhdG9yMiYgX19yaHMsCisJCSAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeyByZXR1cm4gc3RkOjptYWtlX3BhaXIoX19yaHMgLSBfX2xocywgX19kcF9leGFjdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IxLCB0eXBlbmFtZSBfSXRlcmF0b3IyPgorICAgIGlubGluZSBzdGQ6OnBhaXI8dHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yMT46OmRpZmZlcmVuY2VfdHlwZSwKKwkJICAgICBfRGlzdGFuY2VfcHJlY2lzaW9uPgorICAgIF9fZ2V0X2Rpc3RhbmNlKGNvbnN0IF9JdGVyYXRvcjEmIF9fbGhzLCBjb25zdCBfSXRlcmF0b3IyJiBfX3JocywKKwkJICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICB7IHJldHVybiBzdGQ6Om1ha2VfcGFpcihfX2xocyA9PSBfX3Jocz8gMCA6IDEsIF9fZHBfZXF1YWxpdHkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yMSwgdHlwZW5hbWUgX0l0ZXJhdG9yMj4KKyAgICBpbmxpbmUgc3RkOjpwYWlyPHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcjE+OjpkaWZmZXJlbmNlX3R5cGUsCisJCSAgICAgX0Rpc3RhbmNlX3ByZWNpc2lvbj4KKyAgICBfX2dldF9kaXN0YW5jZShjb25zdCBfSXRlcmF0b3IxJiBfX2xocywgY29uc3QgX0l0ZXJhdG9yMiYgX19yaHMpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3IxPjo6aXRlcmF0b3JfY2F0ZWdvcnkKKwkgIF9DYXRlZ29yeTsKKyAgICAgIHJldHVybiBfX2dldF9kaXN0YW5jZShfX2xocywgX19yaHMsIF9DYXRlZ29yeSgpKTsKKyAgICB9CisKKyAgLyoqIFxicmllZiBTYWZlIGl0ZXJhdG9yIHdyYXBwZXIuCisgICAqCisgICAqICBUaGUgY2xhc3MgdGVtcGxhdGUgJV9TYWZlX2l0ZXJhdG9yIGlzIGEgd3JhcHBlciBhcm91bmQgYW4KKyAgICogIGl0ZXJhdG9yIHRoYXQgdHJhY2tzIHRoZSBpdGVyYXRvcidzIG1vdmVtZW50IGFtb25nIHNlcXVlbmNlcyBhbmQKKyAgICogIGNoZWNrcyB0aGF0IG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSAic2FmZSIgaXRlcmF0b3IgYXJlCisgICAqICBsZWdhbC4gSW4gYWRkaXRpb25hbCB0byB0aGUgYmFzaWMgaXRlcmF0b3Igb3BlcmF0aW9ucyAod2hpY2ggYXJlCisgICAqICB2YWxpZGF0ZWQsIGFuZCB0aGVuIHBhc3NlZCB0byB0aGUgdW5kZXJseWluZyBpdGVyYXRvciksCisgICAqICAlX1NhZmVfaXRlcmF0b3IgaGFzIG1lbWJlciBmdW5jdGlvbnMgZm9yIGl0ZXJhdG9yIGludmFsaWRhdGlvbiwKKyAgICogIGF0dGFjaGluZy9kZXRhY2hpbmcgdGhlIGl0ZXJhdG9yIGZyb20gc2VxdWVuY2VzLCBhbmQgcXVlcnlpbmcKKyAgICogIHRoZSBpdGVyYXRvcidzIHN0YXRlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgY2xhc3MgX1NhZmVfaXRlcmF0b3IgOiBwdWJsaWMgX1NhZmVfaXRlcmF0b3JfYmFzZQorICAgIHsKKyAgICAgIHR5cGVkZWYgX1NhZmVfaXRlcmF0b3IgX1NlbGY7CisKKyAgICAgIC8vLyBUaGUgdW5kZXJseWluZyBpdGVyYXRvcgorICAgICAgX0l0ZXJhdG9yIF9NX2N1cnJlbnQ7CisKKyAgICAgIC8vLyBEZXRlcm1pbmUgaWYgdGhpcyBpcyBhIGNvbnN0YW50IGl0ZXJhdG9yLgorICAgICAgYm9vbAorICAgICAgX01fY29uc3RhbnQoKSBjb25zdAorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKwlyZXR1cm4gc3RkOjpfX2FyZV9zYW1lPGNvbnN0X2l0ZXJhdG9yLCBfU2FmZV9pdGVyYXRvcj46Ol9fdmFsdWU7CisgICAgICB9CisKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPiBfVHJhaXRzOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfSXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6dmFsdWVfdHlwZSAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6ZGlmZmVyZW5jZV90eXBlICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpyZWZlcmVuY2UgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvaW50ZXIgICAgICAgICAgIHBvaW50ZXI7CisKKyAgICAgIC8vLyBAcG9zdCB0aGUgaXRlcmF0b3IgaXMgc2luZ3VsYXIgYW5kIHVuYXR0YWNoZWQKKyAgICAgIF9TYWZlX2l0ZXJhdG9yKCkgOiBfTV9jdXJyZW50KCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNhZmUgaXRlcmF0b3IgY29uc3RydWN0aW9uIGZyb20gYW4gdW5zYWZlIGl0ZXJhdG9yIGFuZAorICAgICAgICogaXRzIHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqIEBwcmUgQHAgc2VxIGlzIG5vdCBOVUxMCisgICAgICAgKiBAcG9zdCB0aGlzIGlzIG5vdCBzaW5ndWxhcgorICAgICAgICovCisgICAgICBfU2FmZV9pdGVyYXRvcihjb25zdCBfSXRlcmF0b3ImIF9faSwgY29uc3QgX1NlcXVlbmNlKiBfX3NlcSkKKyAgICAgIDogX1NhZmVfaXRlcmF0b3JfYmFzZShfX3NlcSwgX01fY29uc3RhbnQoKSksIF9NX2N1cnJlbnQoX19pKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIHRoaXMtPl9NX3Npbmd1bGFyKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fbXNnX2luaXRfc2luZ3VsYXIpCisJCQkgICAgICAuX01faXRlcmF0b3IoKnRoaXMsICJ0aGlzIikpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb3B5IGNvbnN0cnVjdGlvbi4KKyAgICAgICAqLworICAgICAgX1NhZmVfaXRlcmF0b3IoY29uc3QgX1NhZmVfaXRlcmF0b3ImIF9feCkKKyAgICAgIDogX1NhZmVfaXRlcmF0b3JfYmFzZShfX3gsIF9NX2NvbnN0YW50KCkpLCBfTV9jdXJyZW50KF9feC5fTV9jdXJyZW50KQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyBEUiA0MDguIElzIHZlY3RvcjxyZXZlcnNlX2l0ZXJhdG9yPGNoYXIqPiA+IGZvcmJpZGRlbj8KKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkoIV9feC5fTV9zaW5ndWxhcigpCisJCQkgICAgICB8fCBfX3guX01fY3VycmVudCA9PSBfSXRlcmF0b3IoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfaW5pdF9jb3B5X3Npbmd1bGFyKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpCisJCQkgICAgICAuX01faXRlcmF0b3IoX194LCAib3RoZXIiKSk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBNb3ZlIGNvbnN0cnVjdGlvbi4KKyAgICAgICAqIEBwb3N0IF9feCBpcyBzaW5ndWxhciBhbmQgdW5hdHRhY2hlZAorICAgICAgICovCisgICAgICBfU2FmZV9pdGVyYXRvcihfU2FmZV9pdGVyYXRvciYmIF9feCkgOiBfTV9jdXJyZW50KCkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkoIV9feC5fTV9zaW5ndWxhcigpCisJCQkgICAgICB8fCBfX3guX01fY3VycmVudCA9PSBfSXRlcmF0b3IoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfaW5pdF9jb3B5X3Npbmd1bGFyKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpCisJCQkgICAgICAuX01faXRlcmF0b3IoX194LCAib3RoZXIiKSk7CisJc3RkOjpzd2FwKF9NX2N1cnJlbnQsIF9feC5fTV9jdXJyZW50KTsKKwl0aGlzLT5fTV9hdHRhY2goX194Ll9NX3NlcXVlbmNlKTsKKwlfX3guX01fZGV0YWNoKCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIENvbnZlcnRpbmcgY29uc3RydWN0b3IgZnJvbSBhIG11dGFibGUgaXRlcmF0b3IgdG8gYQorICAgICAgICogIGNvbnN0YW50IGl0ZXJhdG9yLgorICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9NdXRhYmxlSXRlcmF0b3I+CisgICAgICAgIF9TYWZlX2l0ZXJhdG9yKAorICAgICAgICAgIGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9NdXRhYmxlSXRlcmF0b3IsCisgICAgICAgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjwoc3RkOjpfX2FyZV9zYW1lPF9NdXRhYmxlSXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1NlcXVlbmNlOjppdGVyYXRvcjo6aXRlcmF0b3JfdHlwZT46Ol9fdmFsdWUpLAorICAgICAgICAgICAgICAgICAgIF9TZXF1ZW5jZT46Ol9fdHlwZT4mIF9feCkKKwk6IF9TYWZlX2l0ZXJhdG9yX2Jhc2UoX194LCBfTV9jb25zdGFudCgpKSwgX01fY3VycmVudChfX3guYmFzZSgpKQorICAgICAgICB7CisJICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAvLyBEUiA0MDguIElzIHZlY3RvcjxyZXZlcnNlX2l0ZXJhdG9yPGNoYXIqPiA+IGZvcmJpZGRlbj8KKwkgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghX194Ll9NX3Npbmd1bGFyKCkKKwkJCQl8fCBfX3guYmFzZSgpID09IF9JdGVyYXRvcigpLAorCQkJCV9NX21lc3NhZ2UoX19tc2dfaW5pdF9jb25zdF9zaW5ndWxhcikKKwkJCQkuX01faXRlcmF0b3IoKnRoaXMsICJ0aGlzIikKKwkJCQkuX01faXRlcmF0b3IoX194LCAib3RoZXIiKSk7CisJfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb3B5IGFzc2lnbm1lbnQuCisgICAgICAgKi8KKyAgICAgIF9TYWZlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9TYWZlX2l0ZXJhdG9yJiBfX3gpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIERSIDQwOC4gSXMgdmVjdG9yPHJldmVyc2VfaXRlcmF0b3I8Y2hhcio+ID4gZm9yYmlkZGVuPworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSghX194Ll9NX3Npbmd1bGFyKCkKKwkJCSAgICAgIHx8IF9feC5fTV9jdXJyZW50ID09IF9JdGVyYXRvcigpLAorCQkJICAgICAgX01fbWVzc2FnZShfX21zZ19jb3B5X3Npbmd1bGFyKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpCisJCQkgICAgICAuX01faXRlcmF0b3IoX194LCAib3RoZXIiKSk7CisJX01fY3VycmVudCA9IF9feC5fTV9jdXJyZW50OworCXRoaXMtPl9NX2F0dGFjaChfX3guX01fc2VxdWVuY2UpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIE1vdmUgYXNzaWdubWVudC4KKyAgICAgICAqIEBwb3N0IF9feCBpcyBzaW5ndWxhciBhbmQgdW5hdHRhY2hlZAorICAgICAgICovCisgICAgICBfU2FmZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yPShfU2FmZV9pdGVyYXRvciYmIF9feCkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkodGhpcyAhPSAmX194LAorCQkJICAgICAgX01fbWVzc2FnZShfX21zZ19zZWxmX21vdmVfYXNzaWduKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpKTsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkoIV9feC5fTV9zaW5ndWxhcigpCisJCQkgICAgICB8fCBfX3guX01fY3VycmVudCA9PSBfSXRlcmF0b3IoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfY29weV9zaW5ndWxhcikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcigqdGhpcywgInRoaXMiKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKF9feCwgIm90aGVyIikpOworCV9NX2N1cnJlbnQgPSBfX3guX01fY3VycmVudDsKKwlfTV9hdHRhY2goX194Ll9NX3NlcXVlbmNlKTsKKwlfX3guX01fZGV0YWNoKCk7CisJX194Ll9NX2N1cnJlbnQgPSBfSXRlcmF0b3IoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEl0ZXJhdG9yIGRlcmVmZXJlbmNlLgorICAgICAgICogIEBwcmUgaXRlcmF0b3IgaXMgZGVyZWZlcmVuY2VhYmxlCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkodGhpcy0+X01fZGVyZWZlcmVuY2VhYmxlKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fbXNnX2JhZF9kZXJlZikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcigqdGhpcywgInRoaXMiKSk7CisJcmV0dXJuICpfTV9jdXJyZW50OworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgSXRlcmF0b3IgZGVyZWZlcmVuY2UuCisgICAgICAgKiAgQHByZSBpdGVyYXRvciBpcyBkZXJlZmVyZW5jZWFibGUKKyAgICAgICAqICBAdG9kbyBNYWtlIHRoaXMgY29ycmVjdCB3LnIudC4gaXRlcmF0b3JzIHRoYXQgcmV0dXJuIHByb3hpZXMKKyAgICAgICAqICBAdG9kbyBVc2UgYWRkcmVzc29mKCkgaW5zdGVhZCBvZiAmIG9wZXJhdG9yCisgICAgICAgKi8KKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSh0aGlzLT5fTV9kZXJlZmVyZW5jZWFibGUoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfYmFkX2RlcmVmKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpKTsKKwlyZXR1cm4gJipfTV9jdXJyZW50OworICAgICAgfQorCisgICAgICAvLyAtLS0tLS0gSW5wdXQgaXRlcmF0b3IgcmVxdWlyZW1lbnRzIC0tLS0tLQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEl0ZXJhdG9yIHByZWluY3JlbWVudAorICAgICAgICogIEBwcmUgaXRlcmF0b3IgaXMgaW5jcmVtZW50YWJsZQorICAgICAgICovCisgICAgICBfU2FmZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSh0aGlzLT5fTV9pbmNyZW1lbnRhYmxlKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fbXNnX2JhZF9pbmMpCisJCQkgICAgICAuX01faXRlcmF0b3IoKnRoaXMsICJ0aGlzIikpOworCSsrX01fY3VycmVudDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBJdGVyYXRvciBwb3N0aW5jcmVtZW50CisgICAgICAgKiAgQHByZSBpdGVyYXRvciBpcyBpbmNyZW1lbnRhYmxlCisgICAgICAgKi8KKyAgICAgIF9TYWZlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkodGhpcy0+X01faW5jcmVtZW50YWJsZSgpLAorCQkJICAgICAgX01fbWVzc2FnZShfX21zZ19iYWRfaW5jKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpKTsKKwlfU2FmZV9pdGVyYXRvciBfX3RtcCgqdGhpcyk7CisJKytfTV9jdXJyZW50OworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgLy8gLS0tLS0tIEJpZGlyZWN0aW9uYWwgaXRlcmF0b3IgcmVxdWlyZW1lbnRzIC0tLS0tLQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEl0ZXJhdG9yIHByZWRlY3JlbWVudAorICAgICAgICogIEBwcmUgaXRlcmF0b3IgaXMgZGVjcmVtZW50YWJsZQorICAgICAgICovCisgICAgICBfU2FmZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSh0aGlzLT5fTV9kZWNyZW1lbnRhYmxlKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fbXNnX2JhZF9kZWMpCisJCQkgICAgICAuX01faXRlcmF0b3IoKnRoaXMsICJ0aGlzIikpOworCS0tX01fY3VycmVudDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBJdGVyYXRvciBwb3N0ZGVjcmVtZW50CisgICAgICAgKiAgQHByZSBpdGVyYXRvciBpcyBkZWNyZW1lbnRhYmxlCisgICAgICAgKi8KKyAgICAgIF9TYWZlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkodGhpcy0+X01fZGVjcmVtZW50YWJsZSgpLAorCQkJICAgICAgX01fbWVzc2FnZShfX21zZ19iYWRfZGVjKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpKTsKKwlfU2FmZV9pdGVyYXRvciBfX3RtcCgqdGhpcyk7CisJLS1fTV9jdXJyZW50OworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgLy8gLS0tLS0tIFJhbmRvbSBhY2Nlc3MgaXRlcmF0b3IgcmVxdWlyZW1lbnRzIC0tLS0tLQorICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKGNvbnN0IGRpZmZlcmVuY2VfdHlwZSYgX19uKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSh0aGlzLT5fTV9jYW5fYWR2YW5jZShfX24pCisJCQkgICAgICAmJiB0aGlzLT5fTV9jYW5fYWR2YW5jZShfX24rMSksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fbXNnX2l0ZXJfc3Vic2NyaXB0X29vYikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcigqdGhpcykuX01faW50ZWdlcihfX24pKTsKKworCXJldHVybiBfTV9jdXJyZW50W19fbl07CisgICAgICB9CisKKyAgICAgIF9TYWZlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrPShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkodGhpcy0+X01fY2FuX2FkdmFuY2UoX19uKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfYWR2YW5jZV9vb2IpCisJCQkgICAgICAuX01faXRlcmF0b3IoKnRoaXMpLl9NX2ludGVnZXIoX19uKSk7CisJX01fY3VycmVudCArPSBfX247CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfU2FmZV9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKGNvbnN0IGRpZmZlcmVuY2VfdHlwZSYgX19uKSBjb25zdAorICAgICAgeworCV9TYWZlX2l0ZXJhdG9yIF9fdG1wKCp0aGlzKTsKKwlfX3RtcCArPSBfX247CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICBfU2FmZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yLT0oY29uc3QgZGlmZmVyZW5jZV90eXBlJiBfX24pCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKHRoaXMtPl9NX2Nhbl9hZHZhbmNlKC1fX24pLAorCQkJICAgICAgX01fbWVzc2FnZShfX21zZ19yZXRyZWF0X29vYikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcigqdGhpcykuX01faW50ZWdlcihfX24pKTsKKwlfTV9jdXJyZW50ICs9IC1fX247CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfU2FmZV9pdGVyYXRvcgorICAgICAgb3BlcmF0b3ItKGNvbnN0IGRpZmZlcmVuY2VfdHlwZSYgX19uKSBjb25zdAorICAgICAgeworCV9TYWZlX2l0ZXJhdG9yIF9fdG1wKCp0aGlzKTsKKwlfX3RtcCAtPSBfX247CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICAvLyAtLS0tLS0gVXRpbGl0aWVzIC0tLS0tLQorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yCisgICAgICAgKi8KKyAgICAgIF9JdGVyYXRvcgorICAgICAgYmFzZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2N1cnJlbnQ7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29udmVyc2lvbiB0byB1bmRlcmx5aW5nIG5vbi1kZWJ1ZyBpdGVyYXRvciB0byBhbGxvdworICAgICAgICogYmV0dGVyIGludGVyYWN0aW9uIHdpdGggbm9uLWRlYnVnIGNvbnRhaW5lcnMuCisgICAgICAgKi8KKyAgICAgIG9wZXJhdG9yIF9JdGVyYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2N1cnJlbnQ7IH0KKworICAgICAgLyoqIEF0dGFjaCBpdGVyYXRvciB0byB0aGUgZ2l2ZW4gc2VxdWVuY2UuICovCisgICAgICB2b2lkCisgICAgICBfTV9hdHRhY2goX1NhZmVfc2VxdWVuY2VfYmFzZSogX19zZXEpCisgICAgICB7CisJX1NhZmVfaXRlcmF0b3JfYmFzZTo6X01fYXR0YWNoKF9fc2VxLCBfTV9jb25zdGFudCgpKTsKKyAgICAgIH0KKworICAgICAgLyoqIExpa2V3aXNlLCBidXQgbm90IHRocmVhZC1zYWZlLiAqLworICAgICAgdm9pZAorICAgICAgX01fYXR0YWNoX3NpbmdsZShfU2FmZV9zZXF1ZW5jZV9iYXNlKiBfX3NlcSkKKyAgICAgIHsKKwlfU2FmZV9pdGVyYXRvcl9iYXNlOjpfTV9hdHRhY2hfc2luZ2xlKF9fc2VxLCBfTV9jb25zdGFudCgpKTsKKyAgICAgIH0KKworICAgICAgLy8vIElzIHRoZSBpdGVyYXRvciBkZXJlZmVyZW5jZWFibGU/CisgICAgICBib29sCisgICAgICBfTV9kZXJlZmVyZW5jZWFibGUoKSBjb25zdAorICAgICAgeyByZXR1cm4gIXRoaXMtPl9NX3Npbmd1bGFyKCkgJiYgIV9NX2lzX2VuZCgpICYmICFfTV9pc19iZWZvcmVfYmVnaW4oKTsgfQorCisgICAgICAvLy8gSXMgdGhlIGl0ZXJhdG9yIGJlZm9yZSBhIGRlcmVmZXJlbmNlYWJsZSBvbmU/CisgICAgICBib29sCisgICAgICBfTV9iZWZvcmVfZGVyZWZlcmVuY2VhYmxlKCkgY29uc3QKKyAgICAgIHsKKwlpZiAodGhpcy0+X01faW5jcmVtZW50YWJsZSgpKQorCXsKKwkgIF9JdGVyYXRvciBfX2Jhc2UgPSBiYXNlKCk7CisJICByZXR1cm4gKytfX2Jhc2UgIT0gX01fZ2V0X3NlcXVlbmNlKCktPl9NX2Jhc2UoKS5lbmQoKTsKKwl9CisJcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICAvLy8gSXMgdGhlIGl0ZXJhdG9yIGluY3JlbWVudGFibGU/CisgICAgICBib29sCisgICAgICBfTV9pbmNyZW1lbnRhYmxlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICF0aGlzLT5fTV9zaW5ndWxhcigpICYmICFfTV9pc19lbmQoKTsgfQorCisgICAgICAvLyBJcyB0aGUgaXRlcmF0b3IgZGVjcmVtZW50YWJsZT8KKyAgICAgIGJvb2wKKyAgICAgIF9NX2RlY3JlbWVudGFibGUoKSBjb25zdCB7IHJldHVybiAhX01fc2luZ3VsYXIoKSAmJiAhX01faXNfYmVnaW4oKTsgfQorCisgICAgICAvLyBDYW4gd2UgYWR2YW5jZSB0aGUgaXRlcmF0b3IgQHAgX19uIHN0ZXBzIChAcCBfX24gbWF5IGJlIG5lZ2F0aXZlKQorICAgICAgYm9vbAorICAgICAgX01fY2FuX2FkdmFuY2UoY29uc3QgZGlmZmVyZW5jZV90eXBlJiBfX24pIGNvbnN0OworCisgICAgICAvLyBJcyB0aGUgaXRlcmF0b3IgcmFuZ2UgWyp0aGlzLCBfX3JocykgdmFsaWQ/CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3RoZXI+CisgICAgICAgIGJvb2wKKyAgICAgICAgX01fdmFsaWRfcmFuZ2UoY29uc3QgX1NhZmVfaXRlcmF0b3I8X090aGVyLCBfU2VxdWVuY2U+JiBfX3JocykgY29uc3Q7CisKKyAgICAgIC8vIFRoZSBzZXF1ZW5jZSB0aGlzIGl0ZXJhdG9yIHJlZmVyZW5jZXMuCisgICAgICBjb25zdCBfU2VxdWVuY2UqCisgICAgICBfTV9nZXRfc2VxdWVuY2UoKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgX1NlcXVlbmNlKj4oX01fc2VxdWVuY2UpOyB9CisKKyAgICAgIC8vLyBJcyB0aGlzIGl0ZXJhdG9yIGVxdWFsIHRvIHRoZSBzZXF1ZW5jZSdzIGJlZ2luKCkgaXRlcmF0b3I/CisgICAgICBib29sIF9NX2lzX2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGJhc2UoKSA9PSBfTV9nZXRfc2VxdWVuY2UoKS0+X01fYmFzZSgpLmJlZ2luKCk7IH0KKworICAgICAgLy8vIElzIHRoaXMgaXRlcmF0b3IgZXF1YWwgdG8gdGhlIHNlcXVlbmNlJ3MgZW5kKCkgaXRlcmF0b3I/CisgICAgICBib29sIF9NX2lzX2VuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBiYXNlKCkgPT0gX01fZ2V0X3NlcXVlbmNlKCktPl9NX2Jhc2UoKS5lbmQoKTsgfQorCisgICAgICAvLy8gSXMgdGhpcyBpdGVyYXRvciBlcXVhbCB0byB0aGUgc2VxdWVuY2UncyBiZWZvcmVfYmVnaW4oKSBpdGVyYXRvciBpZgorICAgICAgLy8vIGFueT8KKyAgICAgIGJvb2wgX01faXNfYmVmb3JlX2JlZ2luKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX0JlZm9yZUJlZ2luSGVscGVyPF9TZXF1ZW5jZT46Ol9TX0lzKGJhc2UoKSwgX01fZ2V0X3NlcXVlbmNlKCkpOworICAgICAgfQorCisgICAgICAvLy8gSXMgdGhpcyBpdGVyYXRvciBlcXVhbCB0byB0aGUgc2VxdWVuY2UncyBiZWZvcmVfYmVnaW4oKSBpdGVyYXRvciBpZgorICAgICAgLy8vIGFueSBvciBiZWdpbigpIG90aGVyd2lzZT8KKyAgICAgIGJvb2wgX01faXNfYmVnaW5uZXN0KCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX0JlZm9yZUJlZ2luSGVscGVyPF9TZXF1ZW5jZT46Ol9TX0lzX0JlZ2lubmVzdChiYXNlKCksCisJCQkJCQkJICBfTV9nZXRfc2VxdWVuY2UoKSk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvckwsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3JSLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISBfX2xocy5fTV9zaW5ndWxhcigpICYmICEgX19yaHMuX01fc2luZ3VsYXIoKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2l0ZXJfY29tcGFyZV9iYWQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01fY2FuX2NvbXBhcmUoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfY29tcGFyZV9kaWZmZXJlbnQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICByZXR1cm4gX19saHMuYmFzZSgpID09IF9fcmhzLmJhc2UoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19saHMsCisgICAgICAgICAgICAgICBjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIF9fbGhzLl9NX3Npbmd1bGFyKCkgJiYgISBfX3Jocy5fTV9zaW5ndWxhcigpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfaXRlcl9jb21wYXJlX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9jYW5fY29tcGFyZShfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19jb21wYXJlX2RpZmZlcmVudCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIHJldHVybiBfX2xocy5iYXNlKCkgPT0gX19yaHMuYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvckwsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3JSLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISBfX2xocy5fTV9zaW5ndWxhcigpICYmICEgX19yaHMuX01fc2luZ3VsYXIoKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2l0ZXJfY29tcGFyZV9iYWQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01fY2FuX2NvbXBhcmUoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfY29tcGFyZV9kaWZmZXJlbnQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICByZXR1cm4gX19saHMuYmFzZSgpICE9IF9fcmhzLmJhc2UoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19saHMsCisgICAgICAgICAgICAgICBjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIF9fbGhzLl9NX3Npbmd1bGFyKCkgJiYgISBfX3Jocy5fTV9zaW5ndWxhcigpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfaXRlcl9jb21wYXJlX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9jYW5fY29tcGFyZShfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19jb21wYXJlX2RpZmZlcmVudCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIHJldHVybiBfX2xocy5iYXNlKCkgIT0gX19yaHMuYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yUiwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgX19saHMuX01fc2luZ3VsYXIoKSAmJiAhIF9fcmhzLl9NX3Npbmd1bGFyKCksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19pdGVyX29yZGVyX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9jYW5fY29tcGFyZShfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19vcmRlcl9kaWZmZXJlbnQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICByZXR1cm4gX19saHMuYmFzZSgpIDwgX19yaHMuYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgX19saHMuX01fc2luZ3VsYXIoKSAmJiAhIF9fcmhzLl9NX3Npbmd1bGFyKCksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19pdGVyX29yZGVyX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9jYW5fY29tcGFyZShfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19vcmRlcl9kaWZmZXJlbnQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICByZXR1cm4gX19saHMuYmFzZSgpIDwgX19yaHMuYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvckwsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3JSLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISBfX2xocy5fTV9zaW5ndWxhcigpICYmICEgX19yaHMuX01fc2luZ3VsYXIoKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2l0ZXJfb3JkZXJfYmFkKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fbGhzLl9NX2Nhbl9jb21wYXJlKF9fcmhzKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX29yZGVyX2RpZmZlcmVudCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIHJldHVybiBfX2xocy5iYXNlKCkgPD0gX19yaHMuYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xocywKKyAgICAgICAgICAgICAgIGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgX19saHMuX01fc2luZ3VsYXIoKSAmJiAhIF9fcmhzLl9NX3Npbmd1bGFyKCksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19pdGVyX29yZGVyX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9jYW5fY29tcGFyZShfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19vcmRlcl9kaWZmZXJlbnQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICByZXR1cm4gX19saHMuYmFzZSgpIDw9IF9fcmhzLmJhc2UoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUiwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvckwsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvclIsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIF9fbGhzLl9NX3Npbmd1bGFyKCkgJiYgISBfX3Jocy5fTV9zaW5ndWxhcigpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfaXRlcl9vcmRlcl9iYWQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01fY2FuX2NvbXBhcmUoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfb3JkZXJfZGlmZmVyZW50KQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgcmV0dXJuIF9fbGhzLmJhc2UoKSA+IF9fcmhzLmJhc2UoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIF9fbGhzLl9NX3Npbmd1bGFyKCkgJiYgISBfX3Jocy5fTV9zaW5ndWxhcigpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfaXRlcl9vcmRlcl9iYWQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01fY2FuX2NvbXBhcmUoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfb3JkZXJfZGlmZmVyZW50KQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgcmV0dXJuIF9fbGhzLmJhc2UoKSA+IF9fcmhzLmJhc2UoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUiwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3JMLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yUiwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgX19saHMuX01fc2luZ3VsYXIoKSAmJiAhIF9fcmhzLl9NX3Npbmd1bGFyKCksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19pdGVyX29yZGVyX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9jYW5fY29tcGFyZShfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19vcmRlcl9kaWZmZXJlbnQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICByZXR1cm4gX19saHMuYmFzZSgpID49IF9fcmhzLmJhc2UoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19saHMsCisgICAgICAgICAgICAgICBjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIF9fbGhzLl9NX3Npbmd1bGFyKCkgJiYgISBfX3Jocy5fTV9zaW5ndWxhcigpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfaXRlcl9vcmRlcl9iYWQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01fY2FuX2NvbXBhcmUoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfb3JkZXJfZGlmZmVyZW50KQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgcmV0dXJuIF9fbGhzLmJhc2UoKSA+PSBfX3Jocy5iYXNlKCk7CisgICAgfQorCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gQWNjb3JkaW5nIHRvIHRoZSByZXNvbHV0aW9uIG9mIERSMTc5IG5vdCBvbmx5IHRoZSB2YXJpb3VzIGNvbXBhcmlzb24KKyAgLy8gb3BlcmF0b3JzIGJ1dCBhbHNvIG9wZXJhdG9yLSBtdXN0IGFjY2VwdCBtaXhlZCBpdGVyYXRvci9jb25zdF9pdGVyYXRvcgorICAvLyBwYXJhbWV0ZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIHR5cGVuYW1lIF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvckwsIF9TZXF1ZW5jZT46OmRpZmZlcmVuY2VfdHlwZQorICAgIG9wZXJhdG9yLShjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3JMLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3JSLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISBfX2xocy5fTV9zaW5ndWxhcigpICYmICEgX19yaHMuX01fc2luZ3VsYXIoKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2Rpc3RhbmNlX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9jYW5fY29tcGFyZShfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19kaXN0YW5jZV9kaWZmZXJlbnQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICByZXR1cm4gX19saHMuYmFzZSgpIC0gX19yaHMuYmFzZSgpOworICAgIH0KKworICAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgIGlubGluZSB0eXBlbmFtZSBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT46OmRpZmZlcmVuY2VfdHlwZQorICAgICBvcGVyYXRvci0oY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICAgeworICAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIF9fbGhzLl9NX3Npbmd1bGFyKCkgJiYgISBfX3Jocy5fTV9zaW5ndWxhcigpLAorCQkJICAgICBfTV9tZXNzYWdlKF9fbXNnX2Rpc3RhbmNlX2JhZCkKKwkJCSAgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9jYW5fY29tcGFyZShfX3JocyksCisJCQkgICAgIF9NX21lc3NhZ2UoX19tc2dfZGlzdGFuY2VfZGlmZmVyZW50KQorCQkJICAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICAgcmV0dXJuIF9fbGhzLmJhc2UoKSAtIF9fcmhzLmJhc2UoKTsKKyAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4KKyAgICBvcGVyYXRvcisodHlwZW5hbWUgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLF9TZXF1ZW5jZT46OmRpZmZlcmVuY2VfdHlwZSBfX24sCisJICAgICAgY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2kpCisgICAgeyByZXR1cm4gX19pICsgX19uOyB9Cit9IC8vIG5hbWVzcGFjZSBfX2dudV9kZWJ1ZworCisjaW5jbHVkZSA8ZGVidWcvc2FmZV9pdGVyYXRvci50Y2M+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX2l0ZXJhdG9yLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV9pdGVyYXRvci50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFhOWM2YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV9pdGVyYXRvci50Y2MKQEAgLTAsMCArMSwxMDYgQEAKKy8vIERlYnVnZ2luZyBpdGVyYXRvciBpbXBsZW1lbnRhdGlvbiAob3V0IG9mIGxpbmUpIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9zYWZlX2l0ZXJhdG9yLnRjYworICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfU0FGRV9JVEVSQVRPUl9UQ0MKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfU0FGRV9JVEVSQVRPUl9UQ0MgMQorCituYW1lc3BhY2UgX19nbnVfZGVidWcKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgYm9vbAorICAgIF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPjo6CisgICAgX01fY2FuX2FkdmFuY2UoY29uc3QgZGlmZmVyZW5jZV90eXBlJiBfX24pIGNvbnN0CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2RlYnVnX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25zdF9kZWJ1Z19pdGVyYXRvcjo6aXRlcmF0b3JfdHlwZSBjb25zdF9pdGVyYXRvcjsKKworICAgICAgaWYgKHRoaXMtPl9NX3Npbmd1bGFyKCkpCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKF9fbiA9PSAwKQorCXJldHVybiB0cnVlOworICAgICAgaWYgKF9fbiA8IDApCisJeworCSAgY29uc3RfaXRlcmF0b3IgX19iZWdpbiA9IF9NX2dldF9zZXF1ZW5jZSgpLT5fTV9iYXNlKCkuYmVnaW4oKTsKKwkgIHN0ZDo6cGFpcjxkaWZmZXJlbmNlX3R5cGUsIF9EaXN0YW5jZV9wcmVjaXNpb24+IF9fZGlzdCA9CisJICAgIF9fZ2V0X2Rpc3RhbmNlKF9fYmVnaW4sIGJhc2UoKSk7CisJICBib29sIF9fb2sgPSAgKChfX2Rpc3Quc2Vjb25kID09IF9fZHBfZXhhY3QgJiYgX19kaXN0LmZpcnN0ID49IC1fX24pCisJCQl8fCAoX19kaXN0LnNlY29uZCAhPSBfX2RwX2V4YWN0ICYmIF9fZGlzdC5maXJzdCA+IDApKTsKKwkgIHJldHVybiBfX29rOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjb25zdF9pdGVyYXRvciBfX2VuZCA9IF9NX2dldF9zZXF1ZW5jZSgpLT5fTV9iYXNlKCkuZW5kKCk7CisJICBzdGQ6OnBhaXI8ZGlmZmVyZW5jZV90eXBlLCBfRGlzdGFuY2VfcHJlY2lzaW9uPiBfX2Rpc3QgPQorCSAgICBfX2dldF9kaXN0YW5jZShiYXNlKCksIF9fZW5kKTsKKwkgIGJvb2wgX19vayA9ICgoX19kaXN0LnNlY29uZCA9PSBfX2RwX2V4YWN0ICYmIF9fZGlzdC5maXJzdCA+PSBfX24pCisJCSAgICAgICB8fCAoX19kaXN0LnNlY29uZCAhPSBfX2RwX2V4YWN0ICYmIF9fZGlzdC5maXJzdCA+IDApKTsKKwkgIHJldHVybiBfX29rOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX090aGVyPgorICAgICAgYm9vbAorICAgICAgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+OjoKKyAgICAgIF9NX3ZhbGlkX3JhbmdlKGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9PdGhlciwgX1NlcXVlbmNlPiYgX19yaHMpIGNvbnN0CisgICAgICB7CisJaWYgKCFfTV9jYW5fY29tcGFyZShfX3JocykpCisJICByZXR1cm4gZmFsc2U7CisKKwkvKiBEZXRlcm1pbmUgaWYgd2UgY2FuIG9yZGVyIHRoZSBpdGVyYXRvcnMgd2l0aG91dCB0aGUgaGVscCBvZgorCSAgIHRoZSBjb250YWluZXIgKi8KKwlzdGQ6OnBhaXI8ZGlmZmVyZW5jZV90eXBlLCBfRGlzdGFuY2VfcHJlY2lzaW9uPiBfX2Rpc3QgPQorCSAgX19nZXRfZGlzdGFuY2UoYmFzZSgpLCBfX3Jocy5iYXNlKCkpOworCXN3aXRjaCAoX19kaXN0LnNlY29uZCkgeworCWNhc2UgX19kcF9lcXVhbGl0eToKKwkgIGlmIChfX2Rpc3QuZmlyc3QgPT0gMCkKKwkgICAgcmV0dXJuIHRydWU7CisJICBicmVhazsKKworCWNhc2UgX19kcF9zaWduOgorCWNhc2UgX19kcF9leGFjdDoKKwkgIHJldHVybiBfX2Rpc3QuZmlyc3QgPj0gMDsKKwl9CisKKwkvKiBXZSBjYW4gb25seSB0ZXN0IGZvciBlcXVhbGl0eSwgYnV0IGNoZWNrIGlmIG9uZSBvZiB0aGUKKwkgICBpdGVyYXRvcnMgaXMgYXQgYW4gZXh0cmVtZS4gKi8KKwkvKiBPcHRpbSBmb3IgY2xhc3NpYyBbYmVnaW4sIGl0KSBvciBbaXQsIGVuZCkgcmFuZ2VzLCBsaW1pdCBjaGVja3MKKwkgKiB3aGVuIGNvZGUgaXMgdmFsaWQuICBOb3RlLCBmb3IgdGhlIHNwZWNpYWwgY2FzZSBvZiBmb3J3YXJkX2xpc3QsCisJICogYmVmb3JlX2JlZ2luIHJlcGxhY2VzIHRoZSByb2xlIG9mIGJlZ2luLiAgKi8gCisJaWYgKF9NX2lzX2JlZ2lubmVzdCgpIHx8IF9fcmhzLl9NX2lzX2VuZCgpKQorCSAgcmV0dXJuIHRydWU7CisJaWYgKF9NX2lzX2VuZCgpIHx8IF9fcmhzLl9NX2lzX2JlZ2lubmVzdCgpKQorCSAgcmV0dXJuIGZhbHNlOworCisJLy8gQXNzdW1lIHRoYXQgdGhpcyBpcyBhIHZhbGlkIHJhbmdlOyB3ZSBjYW4ndCBjaGVjayBhbnl0aGluZyBlbHNlCisJcmV0dXJuIHRydWU7CisgICAgICB9Cit9IC8vIG5hbWVzcGFjZSBfX2dudV9kZWJ1ZworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX2xvY2FsX2l0ZXJhdG9yLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3NhZmVfbG9jYWxfaXRlcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDI2ZWQ4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX2xvY2FsX2l0ZXJhdG9yLmgKQEAgLTAsMCArMSwzNjkgQEAKKy8vIFNhZmUgaXRlcmF0b3IgaW1wbGVtZW50YXRpb24gIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9zYWZlX2xvY2FsX2l0ZXJhdG9yLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX1NBRkVfTE9DQUxfSVRFUkFUT1JfSAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19TQUZFX0xPQ0FMX0lURVJBVE9SX0ggMQorCisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9tYWNyb3MuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9mdW5jdGlvbnMuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX3Vub3JkZXJlZF9iYXNlLmg+CisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisKK25hbWVzcGFjZSBfX2dudV9kZWJ1ZworeworICAvKiogXGJyaWVmIFNhZmUgaXRlcmF0b3Igd3JhcHBlci4KKyAgICoKKyAgICogIFRoZSBjbGFzcyB0ZW1wbGF0ZSAlX1NhZmVfbG9jYWxfaXRlcmF0b3IgaXMgYSB3cmFwcGVyIGFyb3VuZCBhbgorICAgKiAgaXRlcmF0b3IgdGhhdCB0cmFja3MgdGhlIGl0ZXJhdG9yJ3MgbW92ZW1lbnQgYW1vbmcgc2VxdWVuY2VzIGFuZAorICAgKiAgY2hlY2tzIHRoYXQgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlICJzYWZlIiBpdGVyYXRvciBhcmUKKyAgICogIGxlZ2FsLiBJbiBhZGRpdGlvbmFsIHRvIHRoZSBiYXNpYyBpdGVyYXRvciBvcGVyYXRpb25zICh3aGljaCBhcmUKKyAgICogIHZhbGlkYXRlZCwgYW5kIHRoZW4gcGFzc2VkIHRvIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yKSwKKyAgICogICVfU2FmZV9sb2NhbF9pdGVyYXRvciBoYXMgbWVtYmVyIGZ1bmN0aW9ucyBmb3IgaXRlcmF0b3IgaW52YWxpZGF0aW9uLAorICAgKiAgYXR0YWNoaW5nL2RldGFjaGluZyB0aGUgaXRlcmF0b3IgZnJvbSBzZXF1ZW5jZXMsIGFuZCBxdWVyeWluZworICAgKiAgdGhlIGl0ZXJhdG9yJ3Mgc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBjbGFzcyBfU2FmZV9sb2NhbF9pdGVyYXRvciA6IHB1YmxpYyBfU2FmZV9sb2NhbF9pdGVyYXRvcl9iYXNlCisgICAgeworICAgICAgdHlwZWRlZiBfU2FmZV9sb2NhbF9pdGVyYXRvciBfU2VsZjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpzaXplX3R5cGUgc2l6ZV90eXBlOworCisgICAgICAvLy8gVGhlIHVuZGVybHlpbmcgaXRlcmF0b3IKKyAgICAgIF9JdGVyYXRvciBfTV9jdXJyZW50OworCisgICAgICAvLy8gVGhlIGJ1Y2tldCB0aGlzIGxvY2FsIGl0ZXJhdG9yIGJlbG9uZ3MgdG8gCisgICAgICBzaXplX3R5cGUgX01fYnVja2V0OworCisgICAgICAvLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBjb25zdGFudCBpdGVyYXRvci4KKyAgICAgIGJvb2wKKyAgICAgIF9NX2NvbnN0YW50KCkgY29uc3QKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6Y29uc3RfbG9jYWxfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisJcmV0dXJuIHN0ZDo6X19hcmVfc2FtZTxjb25zdF9pdGVyYXRvciwgX1NhZmVfbG9jYWxfaXRlcmF0b3I+OjpfX3ZhbHVlOworICAgICAgfQorCisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj4gX1RyYWl0czsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0l0ZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnZhbHVlX3R5cGUgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmRpZmZlcmVuY2VfdHlwZSAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cmVmZXJlbmNlICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb2ludGVyICAgICAgICAgICBwb2ludGVyOworCisgICAgICAvLy8gQHBvc3QgdGhlIGl0ZXJhdG9yIGlzIHNpbmd1bGFyIGFuZCB1bmF0dGFjaGVkCisgICAgICBfU2FmZV9sb2NhbF9pdGVyYXRvcigpIDogX01fY3VycmVudCgpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTYWZlIGl0ZXJhdG9yIGNvbnN0cnVjdGlvbiBmcm9tIGFuIHVuc2FmZSBpdGVyYXRvciBhbmQKKyAgICAgICAqIGl0cyBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiBAcHJlIEBwIHNlcSBpcyBub3QgTlVMTAorICAgICAgICogQHBvc3QgdGhpcyBpcyBub3Qgc2luZ3VsYXIKKyAgICAgICAqLworICAgICAgX1NhZmVfbG9jYWxfaXRlcmF0b3IoY29uc3QgX0l0ZXJhdG9yJiBfX2ksIHNpemVfdHlwZSBfX2J1Y2tldCwKKwkJCSAgIGNvbnN0IF9TZXF1ZW5jZSogX19zZXEpCisgICAgICA6IF9TYWZlX2xvY2FsX2l0ZXJhdG9yX2Jhc2UoX19zZXEsIF9NX2NvbnN0YW50KCkpLCBfTV9jdXJyZW50KF9faSksCisJX01fYnVja2V0KF9fYnVja2V0KQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSghdGhpcy0+X01fc2luZ3VsYXIoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfaW5pdF9zaW5ndWxhcikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcigqdGhpcywgInRoaXMiKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvcHkgY29uc3RydWN0aW9uLgorICAgICAgICovCisgICAgICBfU2FmZV9sb2NhbF9pdGVyYXRvcihjb25zdCBfU2FmZV9sb2NhbF9pdGVyYXRvciYgX194KQorICAgICAgOiBfU2FmZV9sb2NhbF9pdGVyYXRvcl9iYXNlKF9feCwgX01fY29uc3RhbnQoKSksCisJX01fY3VycmVudChfX3guX01fY3VycmVudCksIF9NX2J1Y2tldChfX3guX01fYnVja2V0KQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyBEUiA0MDguIElzIHZlY3RvcjxyZXZlcnNlX2l0ZXJhdG9yPGNoYXIqPiA+IGZvcmJpZGRlbj8KKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkoIV9feC5fTV9zaW5ndWxhcigpCisJCQkgICAgICB8fCBfX3guX01fY3VycmVudCA9PSBfSXRlcmF0b3IoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfaW5pdF9jb3B5X3Npbmd1bGFyKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpCisJCQkgICAgICAuX01faXRlcmF0b3IoX194LCAib3RoZXIiKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBDb252ZXJ0aW5nIGNvbnN0cnVjdG9yIGZyb20gYSBtdXRhYmxlIGl0ZXJhdG9yIHRvIGEKKyAgICAgICAqICBjb25zdGFudCBpdGVyYXRvci4KKyAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTXV0YWJsZUl0ZXJhdG9yPgorCV9TYWZlX2xvY2FsX2l0ZXJhdG9yKAorCSAgY29uc3QgX1NhZmVfbG9jYWxfaXRlcmF0b3I8X011dGFibGVJdGVyYXRvciwKKwkgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8c3RkOjpfX2FyZV9zYW1lPAorCSAgICAgIF9NdXRhYmxlSXRlcmF0b3IsCisJICAgICAgdHlwZW5hbWUgX1NlcXVlbmNlOjpsb2NhbF9pdGVyYXRvcjo6aXRlcmF0b3JfdHlwZT46Ol9fdmFsdWUsCisJCQkJCSAgX1NlcXVlbmNlPjo6X190eXBlPiYgX194KQorCTogX1NhZmVfbG9jYWxfaXRlcmF0b3JfYmFzZShfX3gsIF9NX2NvbnN0YW50KCkpLAorCSAgX01fY3VycmVudChfX3guYmFzZSgpKSwgX01fYnVja2V0KF9feC5fTV9idWNrZXQpCisJeworCSAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgLy8gRFIgNDA4LiBJcyB2ZWN0b3I8cmV2ZXJzZV9pdGVyYXRvcjxjaGFyKj4gPiBmb3JiaWRkZW4/CisJICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoIV9feC5fTV9zaW5ndWxhcigpCisJCQkJfHwgX194LmJhc2UoKSA9PSBfSXRlcmF0b3IoKSwKKwkJCQlfTV9tZXNzYWdlKF9fbXNnX2luaXRfY29uc3Rfc2luZ3VsYXIpCisJCQkJLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpCisJCQkJLl9NX2l0ZXJhdG9yKF9feCwgIm90aGVyIikpOworCX0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29weSBhc3NpZ25tZW50LgorICAgICAgICovCisgICAgICBfU2FmZV9sb2NhbF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfU2FmZV9sb2NhbF9pdGVyYXRvciYgX194KQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyBEUiA0MDguIElzIHZlY3RvcjxyZXZlcnNlX2l0ZXJhdG9yPGNoYXIqPiA+IGZvcmJpZGRlbj8KKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkoIV9feC5fTV9zaW5ndWxhcigpCisJCQkgICAgICB8fCBfX3guX01fY3VycmVudCA9PSBfSXRlcmF0b3IoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfY29weV9zaW5ndWxhcikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcigqdGhpcywgInRoaXMiKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKF9feCwgIm90aGVyIikpOworCV9NX2N1cnJlbnQgPSBfX3guX01fY3VycmVudDsKKwlfTV9idWNrZXQgPSBfX3guX01fYnVja2V0OworCXRoaXMtPl9NX2F0dGFjaChfX3guX01fc2VxdWVuY2UpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEl0ZXJhdG9yIGRlcmVmZXJlbmNlLgorICAgICAgICogIEBwcmUgaXRlcmF0b3IgaXMgZGVyZWZlcmVuY2VhYmxlCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkodGhpcy0+X01fZGVyZWZlcmVuY2VhYmxlKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fbXNnX2JhZF9kZXJlZikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcigqdGhpcywgInRoaXMiKSk7CisJcmV0dXJuICpfTV9jdXJyZW50OworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgSXRlcmF0b3IgZGVyZWZlcmVuY2UuCisgICAgICAgKiAgQHByZSBpdGVyYXRvciBpcyBkZXJlZmVyZW5jZWFibGUKKyAgICAgICAqICBAdG9kbyBNYWtlIHRoaXMgY29ycmVjdCB3LnIudC4gaXRlcmF0b3JzIHRoYXQgcmV0dXJuIHByb3hpZXMKKyAgICAgICAqICBAdG9kbyBVc2UgYWRkcmVzc29mKCkgaW5zdGVhZCBvZiAmIG9wZXJhdG9yCisgICAgICAgKi8KKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSh0aGlzLT5fTV9kZXJlZmVyZW5jZWFibGUoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfYmFkX2RlcmVmKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpKTsKKwlyZXR1cm4gJipfTV9jdXJyZW50OworICAgICAgfQorCisgICAgICAvLyAtLS0tLS0gSW5wdXQgaXRlcmF0b3IgcmVxdWlyZW1lbnRzIC0tLS0tLQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEl0ZXJhdG9yIHByZWluY3JlbWVudAorICAgICAgICogIEBwcmUgaXRlcmF0b3IgaXMgaW5jcmVtZW50YWJsZQorICAgICAgICovCisgICAgICBfU2FmZV9sb2NhbF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSh0aGlzLT5fTV9pbmNyZW1lbnRhYmxlKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fbXNnX2JhZF9pbmMpCisJCQkgICAgICAuX01faXRlcmF0b3IoKnRoaXMsICJ0aGlzIikpOworCSsrX01fY3VycmVudDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBJdGVyYXRvciBwb3N0aW5jcmVtZW50CisgICAgICAgKiAgQHByZSBpdGVyYXRvciBpcyBpbmNyZW1lbnRhYmxlCisgICAgICAgKi8KKyAgICAgIF9TYWZlX2xvY2FsX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkodGhpcy0+X01faW5jcmVtZW50YWJsZSgpLAorCQkJICAgICAgX01fbWVzc2FnZShfX21zZ19iYWRfaW5jKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpKTsKKwlfU2FmZV9sb2NhbF9pdGVyYXRvciBfX3RtcCgqdGhpcyk7CisJKytfTV9jdXJyZW50OworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgLy8gLS0tLS0tIFV0aWxpdGllcyAtLS0tLS0KKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0aGUgdW5kZXJseWluZyBpdGVyYXRvcgorICAgICAgICovCisgICAgICBfSXRlcmF0b3IKKyAgICAgIGJhc2UoKSBjb25zdCB7IHJldHVybiBfTV9jdXJyZW50OyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0aGUgYnVja2V0CisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0KCkgY29uc3QgeyByZXR1cm4gX01fYnVja2V0OyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnZlcnNpb24gdG8gdW5kZXJseWluZyBub24tZGVidWcgaXRlcmF0b3IgdG8gYWxsb3cKKyAgICAgICAqIGJldHRlciBpbnRlcmFjdGlvbiB3aXRoIG5vbi1kZWJ1ZyBjb250YWluZXJzLgorICAgICAgICovCisgICAgICBvcGVyYXRvciBfSXRlcmF0b3IoKSBjb25zdCB7IHJldHVybiBfTV9jdXJyZW50OyB9CisKKyAgICAgIC8qKiBBdHRhY2ggaXRlcmF0b3IgdG8gdGhlIGdpdmVuIHNlcXVlbmNlLiAqLworICAgICAgdm9pZAorICAgICAgX01fYXR0YWNoKF9TYWZlX3NlcXVlbmNlX2Jhc2UqIF9fc2VxKQorICAgICAgeyBfU2FmZV9pdGVyYXRvcl9iYXNlOjpfTV9hdHRhY2goX19zZXEsIF9NX2NvbnN0YW50KCkpOyB9CisKKyAgICAgIC8qKiBMaWtld2lzZSwgYnV0IG5vdCB0aHJlYWQtc2FmZS4gKi8KKyAgICAgIHZvaWQKKyAgICAgIF9NX2F0dGFjaF9zaW5nbGUoX1NhZmVfc2VxdWVuY2VfYmFzZSogX19zZXEpCisgICAgICB7IF9TYWZlX2l0ZXJhdG9yX2Jhc2U6Ol9NX2F0dGFjaF9zaW5nbGUoX19zZXEsIF9NX2NvbnN0YW50KCkpOyB9CisKKyAgICAgIC8vLyBJcyB0aGUgaXRlcmF0b3IgZGVyZWZlcmVuY2VhYmxlPworICAgICAgYm9vbAorICAgICAgX01fZGVyZWZlcmVuY2VhYmxlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICF0aGlzLT5fTV9zaW5ndWxhcigpICYmICFfTV9pc19lbmQoKTsgfQorCisgICAgICAvLy8gSXMgdGhlIGl0ZXJhdG9yIGluY3JlbWVudGFibGU/CisgICAgICBib29sCisgICAgICBfTV9pbmNyZW1lbnRhYmxlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICF0aGlzLT5fTV9zaW5ndWxhcigpICYmICFfTV9pc19lbmQoKTsgfQorCisgICAgICAvLyBJcyB0aGUgaXRlcmF0b3IgcmFuZ2UgWyp0aGlzLCBfX3JocykgdmFsaWQ/CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3RoZXI+CisJYm9vbAorCV9NX3ZhbGlkX3JhbmdlKGNvbnN0IF9TYWZlX2xvY2FsX2l0ZXJhdG9yPF9PdGhlciwKKwkJCQkJCSAgX1NlcXVlbmNlPiYgX19yaHMpIGNvbnN0OworCisgICAgICAvLyBUaGUgc2VxdWVuY2UgdGhpcyBpdGVyYXRvciByZWZlcmVuY2VzLgorICAgICAgY29uc3QgX1NlcXVlbmNlKgorICAgICAgX01fZ2V0X3NlcXVlbmNlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IF9TZXF1ZW5jZSo+KF9NX3NlcXVlbmNlKTsgfQorCisgICAgICAvLy8gSXMgdGhpcyBpdGVyYXRvciBlcXVhbCB0byB0aGUgc2VxdWVuY2UncyBiZWdpbigpIGl0ZXJhdG9yPworICAgICAgYm9vbCBfTV9pc19iZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBiYXNlKCkgPT0gX01fZ2V0X3NlcXVlbmNlKCktPl9NX2Jhc2UoKS5iZWdpbihfTV9idWNrZXQpOyB9CisKKyAgICAgIC8vLyBJcyB0aGlzIGl0ZXJhdG9yIGVxdWFsIHRvIHRoZSBzZXF1ZW5jZSdzIGVuZCgpIGl0ZXJhdG9yPworICAgICAgYm9vbCBfTV9pc19lbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gYmFzZSgpID09IF9NX2dldF9zZXF1ZW5jZSgpLT5fTV9iYXNlKCkuZW5kKF9NX2J1Y2tldCk7IH0KKworICAgICAgLy8vIElzIHRoaXMgaXRlcmF0b3IgcGFydCBvZiB0aGUgc2FtZSBidWNrZXQgYXMgdGhlIG90aGVyIG9uZT8KKyAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfT3RoZXI+CisJYm9vbCBfTV9pbl9zYW1lX2J1Y2tldChjb25zdCBfU2FmZV9sb2NhbF9pdGVyYXRvcjxfT3RoZXIsCisJCQkJCQlfU2VxdWVuY2U+JiBfX290aGVyKSBjb25zdAorCXsgcmV0dXJuIF9NX2J1Y2tldCA9PSBfX290aGVyLmJ1Y2tldCgpOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9TYWZlX2xvY2FsX2l0ZXJhdG9yPF9JdGVyYXRvckwsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfU2FmZV9sb2NhbF9pdGVyYXRvcjxfSXRlcmF0b3JSLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISBfX2xocy5fTV9zaW5ndWxhcigpICYmICEgX19yaHMuX01fc2luZ3VsYXIoKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2l0ZXJfY29tcGFyZV9iYWQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01fY2FuX2NvbXBhcmUoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfY29tcGFyZV9kaWZmZXJlbnQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01fY2FuX2NvbXBhcmUoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfY29tcGFyZV9kaWZmZXJlbnQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01faW5fc2FtZV9idWNrZXQoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfbG9jYWxfaXRlcl9jb21wYXJlX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIHJldHVybiBfX2xocy5iYXNlKCkgPT0gX19yaHMuYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX1NhZmVfbG9jYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX1NhZmVfbG9jYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISBfX2xocy5fTV9zaW5ndWxhcigpICYmICEgX19yaHMuX01fc2luZ3VsYXIoKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2l0ZXJfY29tcGFyZV9iYWQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01fY2FuX2NvbXBhcmUoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfY29tcGFyZV9kaWZmZXJlbnQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01faW5fc2FtZV9idWNrZXQoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfbG9jYWxfaXRlcl9jb21wYXJlX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIHJldHVybiBfX2xocy5iYXNlKCkgPT0gX19yaHMuYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9TYWZlX2xvY2FsX2l0ZXJhdG9yPF9JdGVyYXRvckwsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfU2FmZV9sb2NhbF9pdGVyYXRvcjxfSXRlcmF0b3JSLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISBfX2xocy5fTV9zaW5ndWxhcigpICYmICEgX19yaHMuX01fc2luZ3VsYXIoKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2l0ZXJfY29tcGFyZV9iYWQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01fY2FuX2NvbXBhcmUoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfY29tcGFyZV9kaWZmZXJlbnQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01faW5fc2FtZV9idWNrZXQoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfbG9jYWxfaXRlcl9jb21wYXJlX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIHJldHVybiBfX2xocy5iYXNlKCkgIT0gX19yaHMuYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX1NhZmVfbG9jYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX1NhZmVfbG9jYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISBfX2xocy5fTV9zaW5ndWxhcigpICYmICEgX19yaHMuX01fc2luZ3VsYXIoKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2l0ZXJfY29tcGFyZV9iYWQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01fY2FuX2NvbXBhcmUoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfY29tcGFyZV9kaWZmZXJlbnQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01faW5fc2FtZV9idWNrZXQoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfbG9jYWxfaXRlcl9jb21wYXJlX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIHJldHVybiBfX2xocy5iYXNlKCkgIT0gX19yaHMuYmFzZSgpOworICAgIH0KK30gLy8gbmFtZXNwYWNlIF9fZ251X2RlYnVnCisKKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX2xvY2FsX2l0ZXJhdG9yLnRjYz4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3NhZmVfbG9jYWxfaXRlcmF0b3IudGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX2xvY2FsX2l0ZXJhdG9yLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWM5NzFlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX2xvY2FsX2l0ZXJhdG9yLnRjYwpAQCAtMCwwICsxLDc1IEBACisvLyBEZWJ1Z2dpbmcgaXRlcmF0b3IgaW1wbGVtZW50YXRpb24gKG91dCBvZiBsaW5lKSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvc2FmZV9sb2NhbF9pdGVyYXRvci50Y2MKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX1NBRkVfTE9DQUxfSVRFUkFUT1JfVENDCisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX1NBRkVfTE9DQUxfSVRFUkFUT1JfVENDIDEKKworbmFtZXNwYWNlIF9fZ251X2RlYnVnCit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdGhlcj4KKyAgICAgIGJvb2wKKyAgICAgIF9TYWZlX2xvY2FsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPjo6CisgICAgICBfTV92YWxpZF9yYW5nZShjb25zdCBfU2FmZV9sb2NhbF9pdGVyYXRvcjxfT3RoZXIsIF9TZXF1ZW5jZT4mIF9fcmhzKSBjb25zdAorICAgICAgeworCWlmICghX01fY2FuX2NvbXBhcmUoX19yaHMpKQorCSAgcmV0dXJuIGZhbHNlOworCWlmIChfTV9idWNrZXQgIT0gX19yaHMuX01fYnVja2V0KQorCSAgcmV0dXJuIGZhbHNlOworCisJLyogRGV0ZXJtaW5lIGlmIHdlIGNhbiBvcmRlciB0aGUgaXRlcmF0b3JzIHdpdGhvdXQgdGhlIGhlbHAgb2YKKwkgICB0aGUgY29udGFpbmVyICovCisJc3RkOjpwYWlyPGRpZmZlcmVuY2VfdHlwZSwgX0Rpc3RhbmNlX3ByZWNpc2lvbj4gX19kaXN0ID0KKwkgIF9fZ2V0X2Rpc3RhbmNlKGJhc2UoKSwgX19yaHMuYmFzZSgpKTsKKwlzd2l0Y2ggKF9fZGlzdC5zZWNvbmQpCisJeworCWNhc2UgX19kcF9lcXVhbGl0eToKKwkgIGlmIChfX2Rpc3QuZmlyc3QgPT0gMCkKKwkgICAgcmV0dXJuIHRydWU7CisJICBicmVhazsKKworCWNhc2UgX19kcF9zaWduOgorCWNhc2UgX19kcF9leGFjdDoKKwkgIHJldHVybiBfX2Rpc3QuZmlyc3QgPj0gMDsKKwl9CisKKwkvKiBXZSBjYW4gb25seSB0ZXN0IGZvciBlcXVhbGl0eSwgYnV0IGNoZWNrIGlmIG9uZSBvZiB0aGUKKwkgICBpdGVyYXRvcnMgaXMgYXQgYW4gZXh0cmVtZS4gKi8KKwkvKiBPcHRpbSBmb3IgY2xhc3NpYyBbYmVnaW4sIGl0KSBvciBbaXQsIGVuZCkgcmFuZ2VzLCBsaW1pdCBjaGVja3MKKwkgKiB3aGVuIGNvZGUgaXMgdmFsaWQuICovCisJaWYgKF9NX2lzX2JlZ2luKCkgfHwgX19yaHMuX01faXNfZW5kKCkpCisJICByZXR1cm4gdHJ1ZTsKKwlpZiAoX01faXNfZW5kKCkgfHwgX19yaHMuX01faXNfYmVnaW4oKSkKKwkgIHJldHVybiBmYWxzZTsKKworCS8vIEFzc3VtZSB0aGF0IHRoaXMgaXMgYSB2YWxpZCByYW5nZTsgd2UgY2FuJ3QgY2hlY2sgYW55dGhpbmcgZWxzZQorCXJldHVybiB0cnVlOworICAgICAgfQorfSAvLyBuYW1lc3BhY2UgX19nbnVfZGVidWcKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3NhZmVfc2VxdWVuY2UuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV9zZXF1ZW5jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NTdlZGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3NhZmVfc2VxdWVuY2UuaApAQCAtMCwwICsxLDEzNCBAQAorLy8gU2FmZSBzZXF1ZW5jZSBpbXBsZW1lbnRhdGlvbiAgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL3NhZmVfc2VxdWVuY2UuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfU0FGRV9TRVFVRU5DRV9ICisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX1NBRkVfU0VRVUVOQ0VfSCAxCisKKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorI2luY2x1ZGUgPGRlYnVnL21hY3Jvcy5oPgorI2luY2x1ZGUgPGRlYnVnL2Z1bmN0aW9ucy5oPgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfYmFzZS5oPgorCituYW1lc3BhY2UgX19nbnVfZGVidWcKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgY2xhc3MgX1NhZmVfaXRlcmF0b3I7CisKKyAgLyoqIEEgc2ltcGxlIGZ1bmN0aW9uIG9iamVjdCB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc2VkLWluCisgICAqICB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gdGhlIHN0b3JlZCB2YWx1ZS4gSXQgc2F2ZXMgdHlwaW5nIG92ZXIKKyAgICogIHVzaW5nIGJvdGggYmluZDFzdCBhbmQgbm90X2VxdWFsLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1R5cGU+CisgICAgY2xhc3MgX05vdF9lcXVhbF90bworICAgIHsKKyAgICAgIF9UeXBlIF9fdmFsdWU7CisKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdCBfTm90X2VxdWFsX3RvKGNvbnN0IF9UeXBlJiBfX3YpIDogX192YWx1ZShfX3YpIHsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UeXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ZhbHVlICE9IF9feDsgfQorICAgIH07CisKKyAgLyoqIEEgc2ltcGxlIGZ1bmN0aW9uIG9iamVjdCB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc2VkLWluCisgICAqICB2YWx1ZSBpcyBlcXVhbCB0byB0aGUgc3RvcmVkIHZhbHVlLiAqLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1R5cGU+CisgICAgY2xhc3MgX0VxdWFsX3RvCisgICAgeworICAgICAgX1R5cGUgX192YWx1ZTsKKworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0IF9FcXVhbF90byhjb25zdCBfVHlwZSYgX192KSA6IF9fdmFsdWUoX192KSB7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX192YWx1ZSA9PSBfX3g7IH0KKyAgICB9OworCisgIC8qKiBBIGZ1bmN0aW9uIG9iamVjdCB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuIHRoZSBnaXZlbiByYW5kb20gYWNjZXNzCisgICAgICBpdGVyYXRvciBpcyBhdCBsZWFzdCBAYyBuIHN0ZXBzIGF3YXkgZnJvbSB0aGUgZ2l2ZW4gaXRlcmF0b3IuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBjbGFzcyBfQWZ0ZXJfbnRoX2Zyb20KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorICAgICAgZGlmZmVyZW5jZV90eXBlOworCisgICAgICBfSXRlcmF0b3IgX01fYmFzZTsKKyAgICAgIGRpZmZlcmVuY2VfdHlwZSBfTV9uOworCisgICAgcHVibGljOgorICAgICAgX0FmdGVyX250aF9mcm9tKGNvbnN0IGRpZmZlcmVuY2VfdHlwZSYgX19uLCBjb25zdCBfSXRlcmF0b3ImIF9fYmFzZSkKKyAgICAgIDogX01fYmFzZShfX2Jhc2UpLCBfTV9uKF9fbikgeyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0l0ZXJhdG9yJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggLSBfTV9iYXNlID49IF9NX247IH0KKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgQmFzZSBjbGFzcyBmb3IgY29uc3RydWN0aW5nIGEgQGEgc2FmZSBzZXF1ZW5jZSB0eXBlIHRoYXQKKyAgICogdHJhY2tzIGl0ZXJhdG9ycyB0aGF0IHJlZmVyZW5jZSBpdC4KKyAgICoKKyAgICogVGhlIGNsYXNzIHRlbXBsYXRlICVfU2FmZV9zZXF1ZW5jZSBzaW1wbGlmaWVzIHRoZSBjb25zdHJ1Y3Rpb24gb2YKKyAgICogQGEgc2FmZSBzZXF1ZW5jZXMgdGhhdCB0cmFjayB0aGUgaXRlcmF0b3JzIHRoYXQgcmVmZXJlbmNlIHRoZQorICAgKiBzZXF1ZW5jZSwgc28gdGhhdCB0aGUgaXRlcmF0b3JzIGFyZSBub3RpZmllZCBvZiBjaGFuZ2VzIGluIHRoZQorICAgKiBzZXF1ZW5jZSB0aGF0IG1heSBhZmZlY3QgdGhlaXIgb3BlcmF0aW9uLCBlLmcuLCBpZiB0aGUgY29udGFpbmVyCisgICAqIGludmFsaWRhdGVzIGl0cyBpdGVyYXRvcnMgb3IgaXMgZGVzdHJ1Y3RlZC4gVGhpcyBjbGFzcyB0ZW1wbGF0ZQorICAgKiBtYXkgb25seSBiZSB1c2VkIGJ5IGRlcml2aW5nIGZyb20gaXQgYW5kIHBhc3NpbmcgdGhlIG5hbWUgb2YgdGhlCisgICAqIGRlcml2ZWQgY2xhc3MgYXMgaXRzIHRlbXBsYXRlIHBhcmFtZXRlciB2aWEgdGhlIGN1cmlvdXNseQorICAgKiByZWN1cnJpbmcgdGVtcGxhdGUgcGF0dGVybi4gVGhlIGRlcml2ZWQgY2xhc3MgbXVzdCBoYXZlIEBjCisgICAqIGl0ZXJhdG9yIGFuZCBAYyBjb25zdF9pdGVyYXRvciB0eXBlcyB0aGF0IGFyZSBpbnN0YW50aWF0aW9ucyBvZgorICAgKiBjbGFzcyB0ZW1wbGF0ZSBfU2FmZV9pdGVyYXRvciBmb3IgdGhpcyBzZXF1ZW5jZS4gSXRlcmF0b3JzIHdpbGwKKyAgICogdGhlbiBiZSB0cmFja2VkIGF1dG9tYXRpY2FsbHkuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgY2xhc3MgX1NhZmVfc2VxdWVuY2UgOiBwdWJsaWMgX1NhZmVfc2VxdWVuY2VfYmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvKiogSW52YWxpZGF0ZXMgYWxsIGl0ZXJhdG9ycyBAYyB4IHRoYXQgcmVmZXJlbmNlIHRoaXMgc2VxdWVuY2UsCisJICBhcmUgbm90IHNpbmd1bGFyLCBhbmQgZm9yIHdoaWNoIEBjIF9fcHJlZCh4KSByZXR1cm5zIEBjCisJICB0cnVlLiBAYyBfX3ByZWQgd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlIG5vcm1hbCBpdGVyYXRvcnMgbmVzdGVkCisJICBpbiB0aGUgc2FmZSBvbmVzLiAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbnZhbGlkYXRlX2lmKF9QcmVkaWNhdGUgX19wcmVkKTsKKworICAgICAgLyoqIFRyYW5zZmVycyBhbGwgaXRlcmF0b3JzIEBjIHggdGhhdCByZWZlcmVuY2UgQGMgZnJvbSBzZXF1ZW5jZSwKKwkgIGFyZSBub3Qgc2luZ3VsYXIsIGFuZCBmb3Igd2hpY2ggQGMgX19wcmVkKHgpIHJldHVybnMgQGMKKwkgIHRydWUuIEBjIF9fcHJlZCB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUgbm9ybWFsIGl0ZXJhdG9ycyBuZXN0ZWQKKwkgIGluIHRoZSBzYWZlIG9uZXMuICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX3RyYW5zZmVyX2Zyb21faWYoX1NhZmVfc2VxdWVuY2UmIF9fZnJvbSwgX1ByZWRpY2F0ZSBfX3ByZWQpOworICAgIH07Cit9IC8vIG5hbWVzcGFjZSBfX2dudV9kZWJ1ZworCisjaW5jbHVkZSA8ZGVidWcvc2FmZV9zZXF1ZW5jZS50Y2M+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX3NlcXVlbmNlLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV9zZXF1ZW5jZS50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZmODc0MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV9zZXF1ZW5jZS50Y2MKQEAgLTAsMCArMSwxNTAgQEAKKy8vIFNhZmUgc2VxdWVuY2UgaW1wbGVtZW50YXRpb24gIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9zYWZlX3NlcXVlbmNlLnRjYworICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfU0FGRV9TRVFVRU5DRV9UQ0MKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfU0FGRV9TRVFVRU5DRV9UQ0MgMQorCituYW1lc3BhY2UgX19nbnVfZGVidWcKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgICB2b2lkCisgICAgICBfU2FmZV9zZXF1ZW5jZTxfU2VxdWVuY2U+OjoKKyAgICAgIF9NX2ludmFsaWRhdGVfaWYoX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgICB7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjppdGVyYXRvciBpdGVyYXRvcjsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisJX19nbnVfY3h4OjpfX3Njb3BlZF9sb2NrIHNlbnRyeSh0aGlzLT5fTV9nZXRfbXV0ZXgoKSk7CisgICAgICAgIGZvciAoX1NhZmVfaXRlcmF0b3JfYmFzZSogX19pdGVyID0gX01faXRlcmF0b3JzOyBfX2l0ZXI7KQorCSAgeworCSAgICBpdGVyYXRvciogX192aWN0aW0gPSBzdGF0aWNfY2FzdDxpdGVyYXRvcio+KF9faXRlcik7CisJICAgIF9faXRlciA9IF9faXRlci0+X01fbmV4dDsKKwkgICAgaWYgKCFfX3ZpY3RpbS0+X01fc2luZ3VsYXIoKSAmJiBfX3ByZWQoX192aWN0aW0tPmJhc2UoKSkpCisJICAgICAgeworCQlfX3ZpY3RpbS0+X01faW52YWxpZGF0ZSgpOworCSAgICAgIH0KKwkgIH0KKworICAgICAgICBmb3IgKF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9faXRlcjIgPSBfTV9jb25zdF9pdGVyYXRvcnM7IF9faXRlcjI7KQorCSAgeworCSAgICBjb25zdF9pdGVyYXRvciogX192aWN0aW0gPSBzdGF0aWNfY2FzdDxjb25zdF9pdGVyYXRvcio+KF9faXRlcjIpOworCSAgICBfX2l0ZXIyID0gX19pdGVyMi0+X01fbmV4dDsKKwkgICAgaWYgKCFfX3ZpY3RpbS0+X01fc2luZ3VsYXIoKSAmJiBfX3ByZWQoX192aWN0aW0tPmJhc2UoKSkpCisJICAgICAgeworCQlfX3ZpY3RpbS0+X01faW52YWxpZGF0ZSgpOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICAgIHZvaWQKKyAgICAgIF9TYWZlX3NlcXVlbmNlPF9TZXF1ZW5jZT46OgorICAgICAgX01fdHJhbnNmZXJfZnJvbV9pZihfU2FmZV9zZXF1ZW5jZSYgX19mcm9tLCBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICAgIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKwlfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX3RyYW5zZmVyZWRfaXRlcmF0b3JzID0gMDsKKwlfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX3RyYW5zZmVyZWRfY29uc3RfaXRlcmF0b3JzID0gMDsKKwlfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX2xhc3RfaXRlcmF0b3IgPSAwOworCV9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9fbGFzdF9jb25zdF9pdGVyYXRvciA9IDA7CisJeworCSAgLy8gV2UgbG9jayBfX2Zyb20gZmlyc3QgYW5kIGRldGFjaCBpdGVyYXRvcihzKSB0byB0cmFuc2ZlcgorCSAgX19nbnVfY3h4OjpfX3Njb3BlZF9sb2NrIHNlbnRyeShfX2Zyb20uX01fZ2V0X211dGV4KCkpOworCisgICAgICAgICAgZm9yIChfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX2l0ZXIgPSBfX2Zyb20uX01faXRlcmF0b3JzOyBfX2l0ZXI7KQorCSAgICB7CisJICAgICAgaXRlcmF0b3IqIF9fdmljdGltID0gc3RhdGljX2Nhc3Q8aXRlcmF0b3IqPihfX2l0ZXIpOworCSAgICAgIF9faXRlciA9IF9faXRlci0+X01fbmV4dDsKKwkgICAgICBpZiAoIV9fdmljdGltLT5fTV9zaW5ndWxhcigpICYmIF9fcHJlZChfX3ZpY3RpbS0+YmFzZSgpKSkKKwkJeworCQkgIF9fdmljdGltLT5fTV9kZXRhY2hfc2luZ2xlKCk7CisJCSAgaWYgKF9fdHJhbnNmZXJlZF9pdGVyYXRvcnMpCisJCSAgICB7CisJCSAgICAgIF9fdmljdGltLT5fTV9uZXh0ID0gX190cmFuc2ZlcmVkX2l0ZXJhdG9yczsKKwkJICAgICAgX190cmFuc2ZlcmVkX2l0ZXJhdG9ycy0+X01fcHJpb3IgPSBfX3ZpY3RpbTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICBfX2xhc3RfaXRlcmF0b3IgPSBfX3ZpY3RpbTsKKwkJICBfX3ZpY3RpbS0+X01fc2VxdWVuY2UgPSB0aGlzOworCQkgIF9fdmljdGltLT5fTV92ZXJzaW9uID0gdGhpcy0+X01fdmVyc2lvbjsKKwkJICBfX3RyYW5zZmVyZWRfaXRlcmF0b3JzID0gX192aWN0aW07CisJCX0KKwkgICAgfQorCisJICBmb3IgKF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9faXRlcjIgPSBfX2Zyb20uX01fY29uc3RfaXRlcmF0b3JzOworCQkgX19pdGVyMjspCisJICAgIHsKKwkgICAgICBjb25zdF9pdGVyYXRvciogX192aWN0aW0gPSBzdGF0aWNfY2FzdDxjb25zdF9pdGVyYXRvcio+KF9faXRlcjIpOworCSAgICAgIF9faXRlcjIgPSBfX2l0ZXIyLT5fTV9uZXh0OworCSAgICAgIGlmICghX192aWN0aW0tPl9NX3Npbmd1bGFyKCkgJiYgX19wcmVkKF9fdmljdGltLT5iYXNlKCkpKQorCQl7CisJCSAgX192aWN0aW0tPl9NX2RldGFjaF9zaW5nbGUoKTsKKwkJICBpZiAoX190cmFuc2ZlcmVkX2NvbnN0X2l0ZXJhdG9ycykKKwkJICAgIHsKKwkJICAgICAgX192aWN0aW0tPl9NX25leHQgPSBfX3RyYW5zZmVyZWRfY29uc3RfaXRlcmF0b3JzOworCQkgICAgICBfX3RyYW5zZmVyZWRfY29uc3RfaXRlcmF0b3JzLT5fTV9wcmlvciA9IF9fdmljdGltOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIF9fbGFzdF9jb25zdF9pdGVyYXRvciA9IF9fdmljdGltOworCQkgIF9fdmljdGltLT5fTV9zZXF1ZW5jZSA9IHRoaXM7CisJCSAgX192aWN0aW0tPl9NX3ZlcnNpb24gPSB0aGlzLT5fTV92ZXJzaW9uOworCQkgIF9fdHJhbnNmZXJlZF9jb25zdF9pdGVyYXRvcnMgPSBfX3ZpY3RpbTsKKwkJfQorCSAgICB9CisJfQorCisJLy8gTm93IHdlIGNhbiBsb2NrICp0aGlzIGFuZCBhZGQgdGhlIHRyYW5zZmVyZWQgaXRlcmF0b3JzIGlmIGFueQorCWlmIChfX2xhc3RfaXRlcmF0b3IgfHwgX19sYXN0X2NvbnN0X2l0ZXJhdG9yKQorCSAgeworCSAgICBfX2dudV9jeHg6Ol9fc2NvcGVkX2xvY2sgc2VudHJ5KHRoaXMtPl9NX2dldF9tdXRleCgpKTsKKwkgICAgaWYgKF9fbGFzdF9pdGVyYXRvcikKKwkgICAgICB7CisJCWlmICh0aGlzLT5fTV9pdGVyYXRvcnMpCisJCSAgeworCQkgICAgdGhpcy0+X01faXRlcmF0b3JzLT5fTV9wcmlvciA9IF9fbGFzdF9pdGVyYXRvcjsKKwkJICAgIF9fbGFzdF9pdGVyYXRvci0+X01fbmV4dCA9IHRoaXMtPl9NX2l0ZXJhdG9yczsKKwkJICB9CisJCXRoaXMtPl9NX2l0ZXJhdG9ycyA9IF9fdHJhbnNmZXJlZF9pdGVyYXRvcnM7CisJICAgICAgfQorCSAgICBpZiAoX19sYXN0X2NvbnN0X2l0ZXJhdG9yKQorCSAgICAgIHsKKwkJaWYgKHRoaXMtPl9NX2NvbnN0X2l0ZXJhdG9ycykKKwkJICB7CisJCSAgICB0aGlzLT5fTV9jb25zdF9pdGVyYXRvcnMtPl9NX3ByaW9yID0gX19sYXN0X2NvbnN0X2l0ZXJhdG9yOworCQkgICAgX19sYXN0X2NvbnN0X2l0ZXJhdG9yLT5fTV9uZXh0ID0gdGhpcy0+X01fY29uc3RfaXRlcmF0b3JzOworCQkgIH0KKwkJdGhpcy0+X01fY29uc3RfaXRlcmF0b3JzID0gX190cmFuc2ZlcmVkX2NvbnN0X2l0ZXJhdG9yczsKKwkgICAgICB9CisJICB9CisgICAgICB9Cit9IC8vIG5hbWVzcGFjZSBfX2dudV9kZWJ1ZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV91bm9yZGVyZWRfYmFzZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX3Vub3JkZXJlZF9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVjZTA4YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV91bm9yZGVyZWRfYmFzZS5oCkBAIC0wLDAgKzEsMTg1IEBACisvLyBTYWZlIGNvbnRhaW5lci9pdGVyYXRvciBiYXNlIGltcGxlbWVudGF0aW9uICAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvc2FmZV91bm9yZGVyZWRfYmFzZS5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19TQUZFX1VOT1JERVJFRF9CQVNFX0gKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfU0FGRV9VTk9SREVSRURfQkFTRV9IIDEKKworI2luY2x1ZGUgPGRlYnVnL3NhZmVfYmFzZS5oPgorCituYW1lc3BhY2UgX19nbnVfZGVidWcKK3sKKyAgY2xhc3MgX1NhZmVfdW5vcmRlcmVkX2NvbnRhaW5lcl9iYXNlOworCisgIC8qKiBcYnJpZWYgQmFzaWMgZnVuY3Rpb25hbGl0eSBmb3IgYSBAYSBzYWZlIGl0ZXJhdG9yLgorICAgKgorICAgKiAgVGhlICVfU2FmZV9sb2NhbF9pdGVyYXRvcl9iYXNlIGJhc2UgY2xhc3MgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb25hbGl0eQorICAgKiAgb2YgYSBzYWZlIGxvY2FsIGl0ZXJhdG9yIHRoYXQgaXMgbm90IHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBpdGVyYXRvcgorICAgKiAgdHlwZS4gSXQgY29udGFpbnMgYSBwb2ludGVyIGJhY2sgdG8gdGhlIGNvbnRhaW5lciBpdCByZWZlcmVuY2VzCisgICAqICBhbG9uZyB3aXRoIGl0ZXJhdG9yIHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIHBvaW50ZXJzIHRvIGZvcm0gYQorICAgKiAgZG91Ymx5LWxpbmtlZCBsaXN0IG9mIGxvY2FsIGl0ZXJhdG9ycyByZWZlcmVuY2VkIGJ5IHRoZSBjb250YWluZXIuCisgICAqCisgICAqICBUaGlzIGNsYXNzIG11c3Qgbm90IHBlcmZvcm0gYW55IG9wZXJhdGlvbnMgdGhhdCBjYW4gdGhyb3cgYW4KKyAgICogIGV4Y2VwdGlvbiwgb3IgdGhlIGV4Y2VwdGlvbiBndWFyYW50ZWVzIG9mIGRlcml2ZWQgaXRlcmF0b3JzIHdpbGwKKyAgICogIGJlIGJyb2tlbi4KKyAgICovCisgIGNsYXNzIF9TYWZlX2xvY2FsX2l0ZXJhdG9yX2Jhc2UgOiBwdWJsaWMgX1NhZmVfaXRlcmF0b3JfYmFzZQorICB7CisgIHByb3RlY3RlZDoKKyAgICAvKiogSW5pdGlhbGl6ZXMgdGhlIGl0ZXJhdG9yIGFuZCBtYWtlcyBpdCBzaW5ndWxhci4gKi8KKyAgICBfU2FmZV9sb2NhbF9pdGVyYXRvcl9iYXNlKCkKKyAgICB7IH0KKworICAgIC8qKiBJbml0aWFsaXplIHRoZSBpdGVyYXRvciB0byByZWZlcmVuY2UgdGhlIGNvbnRhaW5lciBwb2ludGVkIHRvCisgICAgICogIGJ5IEBwIF9fc2VxLiBAcCBfX2NvbnN0YW50IGlzIHRydWUgd2hlbiB3ZSBhcmUgaW5pdGlhbGl6aW5nIGEKKyAgICAgKiAgY29uc3RhbnQgbG9jYWwgaXRlcmF0b3IsIGFuZCBmYWxzZSBpZiBpdCBpcyBhIG11dGFibGUgbG9jYWwgaXRlcmF0b3IuCisgICAgICogIE5vdGUgdGhhdCBAcCBfX3NlcSBtYXkgYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSB0aGUgaXRlcmF0b3Igd2lsbCBiZQorICAgICAqICBzaW5ndWxhci4gT3RoZXJ3aXNlLCB0aGUgaXRlcmF0b3Igd2lsbCByZWZlcmVuY2UgQHAgX19zZXEgYW5kCisgICAgICogIGJlIG5vbnNpbmd1bGFyLgorICAgICAqLworICAgIF9TYWZlX2xvY2FsX2l0ZXJhdG9yX2Jhc2UoY29uc3QgX1NhZmVfc2VxdWVuY2VfYmFzZSogX19zZXEsIGJvb2wgX19jb25zdGFudCkKKyAgICB7IHRoaXMtPl9NX2F0dGFjaChjb25zdF9jYXN0PF9TYWZlX3NlcXVlbmNlX2Jhc2UqPihfX3NlcSksIF9fY29uc3RhbnQpOyB9CisKKyAgICAvKiogSW5pdGlhbGl6ZXMgdGhlIGl0ZXJhdG9yIHRvIHJlZmVyZW5jZSB0aGUgc2FtZSBjb250YWluZXIgdGhhdAorCUBwIF9feCBkb2VzLiBAcCBfX2NvbnN0YW50IGlzIHRydWUgaWYgdGhpcyBpcyBhIGNvbnN0YW50CisJaXRlcmF0b3IsIGFuZCBmYWxzZSBpZiBpdCBpcyBtdXRhYmxlLiAqLworICAgIF9TYWZlX2xvY2FsX2l0ZXJhdG9yX2Jhc2UoY29uc3QgX1NhZmVfbG9jYWxfaXRlcmF0b3JfYmFzZSYgX194LAorCQkJICAgICAgYm9vbCBfX2NvbnN0YW50KQorICAgIHsgdGhpcy0+X01fYXR0YWNoKF9feC5fTV9zZXF1ZW5jZSwgX19jb25zdGFudCk7IH0KKworICAgIF9TYWZlX2xvY2FsX2l0ZXJhdG9yX2Jhc2UmCisgICAgb3BlcmF0b3I9KGNvbnN0IF9TYWZlX2xvY2FsX2l0ZXJhdG9yX2Jhc2UmKTsKKworICAgIGV4cGxpY2l0CisgICAgX1NhZmVfbG9jYWxfaXRlcmF0b3JfYmFzZShjb25zdCBfU2FmZV9sb2NhbF9pdGVyYXRvcl9iYXNlJik7CisKKyAgICB+X1NhZmVfbG9jYWxfaXRlcmF0b3JfYmFzZSgpIHsgdGhpcy0+X01fZGV0YWNoKCk7IH0KKworICAgIF9TYWZlX3Vub3JkZXJlZF9jb250YWluZXJfYmFzZSoKKyAgICBfTV9nZXRfY29udGFpbmVyKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQ7CisKKyAgcHVibGljOgorICAgIC8qKiBBdHRhY2hlcyB0aGlzIGl0ZXJhdG9yIHRvIHRoZSBnaXZlbiBjb250YWluZXIsIGRldGFjaGluZyBpdAorICAgICAqCWZyb20gd2hhdGV2ZXIgY29udGFpbmVyIGl0IHdhcyBhdHRhY2hlZCB0byBvcmlnaW5hbGx5LiBJZiB0aGUKKyAgICAgKgluZXcgY29udGFpbmVyIGlzIHRoZSBOVUxMIHBvaW50ZXIsIHRoZSBpdGVyYXRvciBpcyBsZWZ0CisgICAgICoJdW5hdHRhY2hlZC4KKyAgICAgKi8KKyAgICB2b2lkIF9NX2F0dGFjaChfU2FmZV9zZXF1ZW5jZV9iYXNlKiBfX3NlcSwgYm9vbCBfX2NvbnN0YW50KTsKKworICAgIC8qKiBMaWtld2lzZSwgYnV0IG5vdCB0aHJlYWQtc2FmZS4gKi8KKyAgICB2b2lkIF9NX2F0dGFjaF9zaW5nbGUoX1NhZmVfc2VxdWVuY2VfYmFzZSogX19zZXEsIGJvb2wgX19jb25zdGFudCkgdGhyb3cgKCk7CisKKyAgICAvKiogRGV0YWNoIHRoZSBpdGVyYXRvciBmb3Igd2hhdGV2ZXIgY29udGFpbmVyIGl0IGlzIGF0dGFjaGVkIHRvLAorICAgICAqCWlmIGFueS4KKyAgICAqLworICAgIHZvaWQgX01fZGV0YWNoKCk7CisKKyAgICAvKiogTGlrZXdpc2UsIGJ1dCBub3QgdGhyZWFkLXNhZmUuICovCisgICAgdm9pZCBfTV9kZXRhY2hfc2luZ2xlKCkgdGhyb3cgKCk7CisgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBCYXNlIGNsYXNzIHRoYXQgc3VwcG9ydHMgdHJhY2tpbmcgb2YgbG9jYWwgaXRlcmF0b3JzIHRoYXQKKyAgICogcmVmZXJlbmNlIGFuIHVub3JkZXJlZCBjb250YWluZXIuCisgICAqCisgICAqIFRoZSAlX1NhZmVfdW5vcmRlcmVkX2NvbnRhaW5lcl9iYXNlIGNsYXNzIHByb3ZpZGVzIGJhc2ljIHN1cHBvcnQgZm9yCisgICAqIHRyYWNraW5nIGl0ZXJhdG9ycyBpbnRvIGFuIHVub3JkZXJlZCBjb250YWluZXIuIENvbnRhaW5lcnMgdGhhdCB0cmFjaworICAgKiBpdGVyYXRvcnMgbXVzdCBkZXJpdmVkIGZyb20gJV9TYWZlX3Vub3JkZXJlZF9jb250YWluZXJfYmFzZSBwdWJsaWNseSwgc28KKyAgICogdGhhdCBzYWZlIGl0ZXJhdG9ycyAod2hpY2ggaW5oZXJpdCBfU2FmZV9pdGVyYXRvcl9iYXNlKSBjYW4KKyAgICogYXR0YWNoIHRvIHRoZW0uIFRoaXMgY2xhc3MgY29udGFpbnMgZm91ciBsaW5rZWQgbGlzdHMgb2YKKyAgICogaXRlcmF0b3JzLCBvbmUgZm9yIGNvbnN0YW50IGl0ZXJhdG9ycywgb25lIGZvciBtdXRhYmxlCisgICAqIGl0ZXJhdG9ycywgb25lIGZvciBjb25zdGFudCBsb2NhbCBpdGVyYXRvcnMsIG9uZSBmb3IgbXV0YWJsZSBsb2NhbAorICAgKiBpdGVyYXRvcnMgYW5kIGEgdmVyc2lvbiBudW1iZXIgdGhhdCBhbGxvd3MgdmVyeSBmYXN0CisgICAqIGludmFsaWRhdGlvbiBvZiBhbGwgaXRlcmF0b3JzIHRoYXQgcmVmZXJlbmNlIHRoZSBjb250YWluZXIuCisgICAqCisgICAqIFRoaXMgY2xhc3MgbXVzdCBlbnN1cmUgdGhhdCBubyBvcGVyYXRpb24gb24gaXQgbWF5IHRocm93IGFuCisgICAqIGV4Y2VwdGlvbiwgb3RoZXJ3aXNlIEBhIHNhZmUgY29udGFpbmVycyBtYXkgZmFpbCB0byBwcm92aWRlIHRoZQorICAgKiBleGNlcHRpb24tc2FmZXR5IGd1YXJhbnRlZXMgcmVxdWlyZWQgYnkgdGhlIEMrKyBzdGFuZGFyZC4KKyAgICovCisgIGNsYXNzIF9TYWZlX3Vub3JkZXJlZF9jb250YWluZXJfYmFzZSA6IHB1YmxpYyBfU2FmZV9zZXF1ZW5jZV9iYXNlCisgIHsKKyAgICB0eXBlZGVmIF9TYWZlX3NlcXVlbmNlX2Jhc2UgX0Jhc2U7CisgIHB1YmxpYzoKKyAgICAvLy8gVGhlIGxpc3Qgb2YgbXV0YWJsZSBsb2NhbCBpdGVyYXRvcnMgdGhhdCByZWZlcmVuY2UgdGhpcyBjb250YWluZXIKKyAgICBfU2FmZV9pdGVyYXRvcl9iYXNlKiBfTV9sb2NhbF9pdGVyYXRvcnM7CisKKyAgICAvLy8gVGhlIGxpc3Qgb2YgY29uc3RhbnQgbG9jYWwgaXRlcmF0b3JzIHRoYXQgcmVmZXJlbmNlIHRoaXMgY29udGFpbmVyCisgICAgX1NhZmVfaXRlcmF0b3JfYmFzZSogX01fY29uc3RfbG9jYWxfaXRlcmF0b3JzOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBJbml0aWFsaXplIHdpdGggYSB2ZXJzaW9uIG51bWJlciBvZiAxIGFuZCBubyBpdGVyYXRvcnMKKyAgICBfU2FmZV91bm9yZGVyZWRfY29udGFpbmVyX2Jhc2UoKQorICAgIDogX01fbG9jYWxfaXRlcmF0b3JzKG51bGxwdHIpLCBfTV9jb25zdF9sb2NhbF9pdGVyYXRvcnMobnVsbHB0cikKKyAgICB7IH0KKworICAgIC8vIEluaXRpYWxpemUgd2l0aCBhIHZlcnNpb24gbnVtYmVyIG9mIDEgYW5kIG5vIGl0ZXJhdG9ycworICAgIF9TYWZlX3Vub3JkZXJlZF9jb250YWluZXJfYmFzZShjb25zdCBfU2FmZV91bm9yZGVyZWRfY29udGFpbmVyX2Jhc2UmKQorICAgIG5vZXhjZXB0CisgICAgOiBfU2FmZV91bm9yZGVyZWRfY29udGFpbmVyX2Jhc2UoKSB7IH0KKworICAgIF9TYWZlX3Vub3JkZXJlZF9jb250YWluZXJfYmFzZShfU2FmZV91bm9yZGVyZWRfY29udGFpbmVyX2Jhc2UmJiBfX3gpCisgICAgbm9leGNlcHQKKyAgICA6IF9TYWZlX3Vub3JkZXJlZF9jb250YWluZXJfYmFzZSgpCisgICAgeyB0aGlzLT5fTV9zd2FwKF9feCk7IH0KKworICAgIC8qKiBOb3RpZnkgYWxsIGl0ZXJhdG9ycyB0aGF0IHJlZmVyZW5jZSB0aGlzIGNvbnRhaW5lciB0aGF0IHRoZQorCWNvbnRhaW5lciBpcyBiZWluZyBkZXN0cm95ZWQuICovCisgICAgfl9TYWZlX3Vub3JkZXJlZF9jb250YWluZXJfYmFzZSgpCisgICAgeyB0aGlzLT5fTV9kZXRhY2hfYWxsKCk7IH0KKworICAgIC8qKiBEZXRhY2ggYWxsIGl0ZXJhdG9ycywgbGVhdmluZyB0aGVtIHNpbmd1bGFyLiAqLworICAgIHZvaWQKKyAgICBfTV9kZXRhY2hfYWxsKCk7CisKKyAgICAvKiogU3dhcCB0aGlzIGNvbnRhaW5lciB3aXRoIHRoZSBnaXZlbiBjb250YWluZXIuIFRoaXMgb3BlcmF0aW9uCisgICAgICogIGFsc28gc3dhcHMgb3duZXJzaGlwIG9mIHRoZSBpdGVyYXRvcnMsIHNvIHRoYXQgd2hlbiB0aGUKKyAgICAgKiAgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIGFsbCBpdGVyYXRvcnMgdGhhdCBvcmlnaW5hbGx5IHJlZmVyZW5jZWQKKyAgICAgKiAgb25lIGNvbnRhaW5lciBub3cgcmVmZXJlbmNlIHRoZSBvdGhlciBjb250YWluZXIuCisgICAgICovCisgICAgdm9pZAorICAgIF9NX3N3YXAoX1NhZmVfdW5vcmRlcmVkX2NvbnRhaW5lcl9iYXNlJiBfX3gpOworCisgIHB1YmxpYzoKKyAgICAvKiogQXR0YWNoIGFuIGl0ZXJhdG9yIHRvIHRoaXMgY29udGFpbmVyLiAqLworICAgIHZvaWQKKyAgICBfTV9hdHRhY2hfbG9jYWwoX1NhZmVfaXRlcmF0b3JfYmFzZSogX19pdCwgYm9vbCBfX2NvbnN0YW50KTsKKworICAgIC8qKiBMaWtld2lzZSBidXQgbm90IHRocmVhZCBzYWZlLiAqLworICAgIHZvaWQKKyAgICBfTV9hdHRhY2hfbG9jYWxfc2luZ2xlKF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9faXQsIGJvb2wgX19jb25zdGFudCkgdGhyb3cgKCk7CisKKyAgICAvKiogRGV0YWNoIGFuIGl0ZXJhdG9yIGZyb20gdGhpcyBjb250YWluZXIgKi8KKyAgICB2b2lkCisgICAgX01fZGV0YWNoX2xvY2FsKF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9faXQpOworCisgICAgLyoqIExpa2V3aXNlIGJ1dCBub3QgdGhyZWFkIHNhZmUuICovCisgICAgdm9pZAorICAgIF9NX2RldGFjaF9sb2NhbF9zaW5nbGUoX1NhZmVfaXRlcmF0b3JfYmFzZSogX19pdCkgdGhyb3cgKCk7CisgIH07Cit9IC8vIG5hbWVzcGFjZSBfX2dudV9kZWJ1ZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV91bm9yZGVyZWRfY29udGFpbmVyLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3NhZmVfdW5vcmRlcmVkX2NvbnRhaW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MzQ1NDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3NhZmVfdW5vcmRlcmVkX2NvbnRhaW5lci5oCkBAIC0wLDAgKzEsODEgQEAKKy8vIFNhZmUgY29udGFpbmVyIGltcGxlbWVudGF0aW9uICAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvc2FmZV91bm9yZGVyZWRfY29udGFpbmVyLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX1NBRkVfVU5PUkRFUkVEX0NPTlRBSU5FUl9ICisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX1NBRkVfVU5PUkRFUkVEX0NPTlRBSU5FUl9IIDEKKworI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisjaW5jbHVkZSA8ZGVidWcvbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGVidWcvZnVuY3Rpb25zLmg+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV91bm9yZGVyZWRfYmFzZS5oPgorCituYW1lc3BhY2UgX19nbnVfZGVidWcKK3sKKyAgLyoqCisgICAqIEBicmllZiBCYXNlIGNsYXNzIGZvciBjb25zdHJ1Y3RpbmcgYSBAYSBzYWZlIHVub3JkZXJlZCBjb250YWluZXIgdHlwZQorICAgKiB0aGF0IHRyYWNrcyBpdGVyYXRvcnMgdGhhdCByZWZlcmVuY2UgaXQuCisgICAqCisgICAqIFRoZSBjbGFzcyB0ZW1wbGF0ZSAlX1NhZmVfdW5vcmRlcmVkX2NvbnRhaW5lciBzaW1wbGlmaWVzIHRoZQorICAgKiBjb25zdHJ1Y3Rpb24gb2YgQGEgc2FmZSB1bm9yZGVyZWQgY29udGFpbmVycyB0aGF0IHRyYWNrIHRoZSBpdGVyYXRvcnMKKyAgICogdGhhdCByZWZlcmVuY2UgdGhlIGNvbnRhaW5lciwgc28gdGhhdCB0aGUgaXRlcmF0b3JzIGFyZSBub3RpZmllZCBvZgorICAgKiBjaGFuZ2VzIGluIHRoZSBjb250YWluZXIgdGhhdCBtYXkgYWZmZWN0IHRoZWlyIG9wZXJhdGlvbiwgZS5nLiwgaWYKKyAgICogdGhlIGNvbnRhaW5lciBpbnZhbGlkYXRlcyBpdHMgaXRlcmF0b3JzIG9yIGlzIGRlc3RydWN0ZWQuIFRoaXMgY2xhc3MKKyAgICogdGVtcGxhdGUgbWF5IG9ubHkgYmUgdXNlZCBieSBkZXJpdmluZyBmcm9tIGl0IGFuZCBwYXNzaW5nIHRoZSBuYW1lCisgICAqIG9mIHRoZSBkZXJpdmVkIGNsYXNzIGFzIGl0cyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgdmlhIHRoZSBjdXJpb3VzbHkKKyAgICogcmVjdXJyaW5nIHRlbXBsYXRlIHBhdHRlcm4uIFRoZSBkZXJpdmVkIGNsYXNzIG11c3QgaGF2ZSBAYworICAgKiBpdGVyYXRvciBhbmQgQGMgY29uc3RfaXRlcmF0b3IgdHlwZXMgdGhhdCBhcmUgaW5zdGFudGlhdGlvbnMgb2YKKyAgICogY2xhc3MgdGVtcGxhdGUgX1NhZmVfaXRlcmF0b3IgZm9yIHRoaXMgY29udGFpbmVyIGFuZCBAYyBsb2NhbF9pdGVyYXRvcgorICAgKiBhbmQgQGMgY29uc3RfbG9jYWxfaXRlcmF0b3IgdHlwZXMgdGhhdCBhcmUgaW5zdGFudGlhdGlvbnMgb2YgY2xhc3MKKyAgICogdGVtcGxhdGUgX1NhZmVfbG9jYWxfaXRlcmF0b3IgZm9yIHRoaXMgY29udGFpbmVyLiBJdGVyYXRvcnMgd2lsbAorICAgKiB0aGVuIGJlIHRyYWNrZWQgYXV0b21hdGljYWxseS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgY2xhc3MgX1NhZmVfdW5vcmRlcmVkX2NvbnRhaW5lciA6IHB1YmxpYyBfU2FmZV91bm9yZGVyZWRfY29udGFpbmVyX2Jhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLyoqIEludmFsaWRhdGVzIGFsbCBpdGVyYXRvcnMgQGMgeCB0aGF0IHJlZmVyZW5jZSB0aGlzIGNvbnRhaW5lciwKKwkgIGFyZSBub3Qgc2luZ3VsYXIsIGFuZCBmb3Igd2hpY2ggQGMgX19wcmVkKHgpIHJldHVybnMgQGMKKwkgIHRydWUuIEBjIF9fcHJlZCB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUgbm9ybWFsIGl0ZXJhdG9ycyBuZXN0ZWQKKwkgIGluIHRoZSBzYWZlIG9uZXMuICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHJlZGljYXRlPgorCXZvaWQKKwlfTV9pbnZhbGlkYXRlX2lmKF9QcmVkaWNhdGUgX19wcmVkKTsKKworICAgICAgLyoqIEludmFsaWRhdGVzIGFsbCBsb2NhbCBpdGVyYXRvcnMgQGMgeCB0aGF0IHJlZmVyZW5jZSB0aGlzIGNvbnRhaW5lciwKKwkgIGFyZSBub3Qgc2luZ3VsYXIsIGFuZCBmb3Igd2hpY2ggQGMgX19wcmVkKHgpIHJldHVybnMgQGMKKwkgIHRydWUuIEBjIF9fcHJlZCB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUgbm9ybWFsIGlsb2NhbCBpdGVyYXRvcnMKKwkgIG5lc3RlZCBpbiB0aGUgc2FmZSBvbmVzLiAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByZWRpY2F0ZT4KKwl2b2lkCisJX01faW52YWxpZGF0ZV9sb2NhbF9pZihfUHJlZGljYXRlIF9fcHJlZCk7CisgICAgfTsKK30gLy8gbmFtZXNwYWNlIF9fZ251X2RlYnVnCisKKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX3Vub3JkZXJlZF9jb250YWluZXIudGNjPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV91bm9yZGVyZWRfY29udGFpbmVyLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2FmZV91bm9yZGVyZWRfY29udGFpbmVyLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjNiY2FiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zYWZlX3Vub3JkZXJlZF9jb250YWluZXIudGNjCkBAIC0wLDAgKzEsMTAwIEBACisvLyBTYWZlIGNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiAgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL3NhZmVfdW5vcmRlcmVkX2NvbnRhaW5lci50Y2MKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX1NBRkVfVU5PUkRFUkVEX0NPTlRBSU5FUl9UQ0MKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfU0FGRV9VTk9SREVSRURfQ09OVEFJTkVSX1RDQyAxCisKK25hbWVzcGFjZSBfX2dudV9kZWJ1ZworeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgICB2b2lkCisgICAgICBfU2FmZV91bm9yZGVyZWRfY29udGFpbmVyPF9Db250YWluZXI+OjoKKyAgICAgIF9NX2ludmFsaWRhdGVfaWYoX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBpdGVyYXRvcjsKKwl0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisJX19nbnVfY3h4OjpfX3Njb3BlZF9sb2NrIHNlbnRyeSh0aGlzLT5fTV9nZXRfbXV0ZXgoKSk7CisJZm9yIChfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX2l0ZXIgPSBfTV9pdGVyYXRvcnM7IF9faXRlcjspCisJICB7CisJICAgIGl0ZXJhdG9yKiBfX3ZpY3RpbSA9IHN0YXRpY19jYXN0PGl0ZXJhdG9yKj4oX19pdGVyKTsKKwkgICAgX19pdGVyID0gX19pdGVyLT5fTV9uZXh0OworCSAgICBpZiAoIV9fdmljdGltLT5fTV9zaW5ndWxhcigpICYmIF9fcHJlZChfX3ZpY3RpbS0+YmFzZSgpKSkKKwkgICAgICB7CisJCV9fdmljdGltLT5fTV9pbnZhbGlkYXRlKCk7CisJICAgICAgfQorCSAgfQorCisJZm9yIChfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX2l0ZXIyID0gX01fY29uc3RfaXRlcmF0b3JzOyBfX2l0ZXIyOykKKwkgIHsKKwkgICAgY29uc3RfaXRlcmF0b3IqIF9fdmljdGltID0gc3RhdGljX2Nhc3Q8Y29uc3RfaXRlcmF0b3IqPihfX2l0ZXIyKTsKKwkgICAgX19pdGVyMiA9IF9faXRlcjItPl9NX25leHQ7CisJICAgIGlmICghX192aWN0aW0tPl9NX3Npbmd1bGFyKCkgJiYgX19wcmVkKF9fdmljdGltLT5iYXNlKCkpKQorCSAgICAgIHsKKwkJX192aWN0aW0tPl9NX2ludmFsaWRhdGUoKTsKKwkgICAgICB9CisJICB9CisgICAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgICB2b2lkCisgICAgICBfU2FmZV91bm9yZGVyZWRfY29udGFpbmVyPF9Db250YWluZXI+OjoKKyAgICAgIF9NX2ludmFsaWRhdGVfbG9jYWxfaWYoX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjpsb2NhbF9pdGVyYXRvciBsb2NhbF9pdGVyYXRvcjsKKwl0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6OmNvbnN0X2xvY2FsX2l0ZXJhdG9yIGNvbnN0X2xvY2FsX2l0ZXJhdG9yOworCisJX19nbnVfY3h4OjpfX3Njb3BlZF9sb2NrIHNlbnRyeSh0aGlzLT5fTV9nZXRfbXV0ZXgoKSk7CisJZm9yIChfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX2l0ZXIgPSBfTV9sb2NhbF9pdGVyYXRvcnM7IF9faXRlcjspCisJICB7CisJICAgIGxvY2FsX2l0ZXJhdG9yKiBfX3ZpY3RpbSA9IHN0YXRpY19jYXN0PGxvY2FsX2l0ZXJhdG9yKj4oX19pdGVyKTsKKwkgICAgX19pdGVyID0gX19pdGVyLT5fTV9uZXh0OworCSAgICBpZiAoIV9fdmljdGltLT5fTV9zaW5ndWxhcigpICYmIF9fcHJlZChfX3ZpY3RpbS0+YmFzZSgpKSkKKwkgICAgICB7CisJCV9fdmljdGltLT5fTV9pbnZhbGlkYXRlKCk7CisJICAgICAgfQorCSAgfQorCisJZm9yIChfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX2l0ZXIyID0gX01fY29uc3RfbG9jYWxfaXRlcmF0b3JzOyBfX2l0ZXIyOykKKwkgIHsKKwkgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IqIF9fdmljdGltID0KKwkgICAgICBzdGF0aWNfY2FzdDxjb25zdF9sb2NhbF9pdGVyYXRvcio+KF9faXRlcjIpOworCSAgICBfX2l0ZXIyID0gX19pdGVyMi0+X01fbmV4dDsKKwkgICAgaWYgKCFfX3ZpY3RpbS0+X01fc2luZ3VsYXIoKSAmJiBfX3ByZWQoX192aWN0aW0tPmJhc2UoKSkpCisJICAgICAgeworCQlfX3ZpY3RpbS0+X01faW52YWxpZGF0ZSgpOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworfSAvLyBuYW1lc3BhY2UgX19nbnVfZGVidWcKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3NldCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5N2IxM2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3NldApAQCAtMCwwICsxLDM2IEBACisvLyBEZWJ1Z2dpbmcgc2V0L211bHRpc2V0IGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9zZXQKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX1NFVAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19TRVQgMQorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPGRlYnVnL3NldC5oPgorI2luY2x1ZGUgPGRlYnVnL211bHRpc2V0Lmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zZXQuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFlM2YzZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc2V0LmgKQEAgLTAsMCArMSw0NjkgQEAKKy8vIERlYnVnZ2luZyBzZXQgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL3NldC5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19TRVRfSAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19TRVRfSCAxCisKKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX3NlcXVlbmNlLmg+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9pdGVyYXRvci5oPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KSAKK3sKK25hbWVzcGFjZSBfX2RlYnVnCit7CisgIC8vLyBDbGFzcyBzdGQ6OnNldCB3aXRoIHNhZmV0eS9jaGVja2luZy9kZWJ1ZyBpbnN0cnVtZW50YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlID0gc3RkOjpsZXNzPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxfS2V5PiA+CisgICAgY2xhc3Mgc2V0CisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6OnNldDxfS2V5LF9Db21wYXJlLF9BbGxvY2F0b3I+LAorICAgICAgcHVibGljIF9fZ251X2RlYnVnOjpfU2FmZV9zZXF1ZW5jZTxzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX1NURF9DOjpzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+IF9CYXNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9jb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X0VxdWFsX3RvPF9CYXNlX2NvbnN0X2l0ZXJhdG9yPiBfRXF1YWw7CisgICAgcHVibGljOgorICAgICAgLy8gdHlwZXM6CisgICAgICB0eXBlZGVmIF9LZXkJCQkJICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfS2V5CQkJCSAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQ29tcGFyZQkJCQkgICAga2V5X2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9Db21wYXJlCQkJCSAgICB2YWx1ZV9jb21wYXJlOworICAgICAgdHlwZWRlZiBfQWxsb2NhdG9yCQkJICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2l0ZXJhdG9yLCBzZXQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjxfQmFzZV9jb25zdF9pdGVyYXRvciwgc2V0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnBvaW50ZXIgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICAvLyAyMy4zLjMuMSBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgZXhwbGljaXQgc2V0KGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCQkgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fY29tcCwgX19hKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHNldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCSAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisJOiBfQmFzZShfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZ251X2RlYnVnOjpfX2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsCisJCQkJCQkJCSAgICAgX19sYXN0KSksCisJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSwKKwkJX19jb21wLCBfX2EpIHsgfQorCisgICAgICBzZXQoY29uc3Qgc2V0JiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkgeyB9CisKKyAgICAgIHNldChjb25zdCBfQmFzZSYgX194KQorICAgICAgOiBfQmFzZShfX3gpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc2V0KHNldCYmIF9feCkKKyAgICAgIG5vZXhjZXB0KGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPF9Db21wYXJlPjo6dmFsdWUpCisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3gpKQorICAgICAgeyB0aGlzLT5fTV9zd2FwKF9feCk7IH0KKworICAgICAgc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCSAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLCBfX2NvbXAsIF9fYSkgeyB9CisjZW5kaWYKKworICAgICAgfnNldCgpIF9HTElCQ1hYX05PRVhDRVBUIHsgfQorCisgICAgICBzZXQmCisgICAgICBvcGVyYXRvcj0oY29uc3Qgc2V0JiBfX3gpCisgICAgICB7CisJKnN0YXRpY19jYXN0PF9CYXNlKj4odGhpcykgPSBfX3g7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzZXQmCisgICAgICBvcGVyYXRvcj0oc2V0JiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJX19nbGliY3h4X2NoZWNrX3NlbGZfbW92ZV9hc3NpZ24oX194KTsKKwljbGVhcigpOworCXN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHNldCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB1c2luZyBfQmFzZTo6Z2V0X2FsbG9jYXRvcjsKKworICAgICAgLy8gaXRlcmF0b3JzOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorI2VuZGlmCisKKyAgICAgIC8vIGNhcGFjaXR5OgorICAgICAgdXNpbmcgX0Jhc2U6OmVtcHR5OworICAgICAgdXNpbmcgX0Jhc2U6OnNpemU7CisgICAgICB1c2luZyBfQmFzZTo6bWF4X3NpemU7CisKKyAgICAgIC8vIG1vZGlmaWVyczoKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisJZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBhdXRvIF9fcmVzID0gX0Jhc2U6OmVtcGxhY2Uoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIHJldHVybiBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCQkJICAgX19yZXMuc2Vjb25kKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zKTsKKwkgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW1wbGFjZV9oaW50KF9fcG9zLmJhc2UoKSwKKwkJCQkJICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSwKKwkJCSAgdGhpcyk7CisJfQorI2VuZGlmCisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBib29sPiBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX194KTsKKwlyZXR1cm4gc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPihpdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksCisJCQkJCSBfX3Jlcy5zZWNvbmQpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBib29sPiBfX3JlcworCSAgPSBfQmFzZTo6aW5zZXJ0KHN0ZDo6bW92ZShfX3gpKTsKKwlyZXR1cm4gc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPihpdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksCisJCQkJCSBfX3Jlcy5zZWNvbmQpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3NpdGlvbik7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIF9feCksIHRoaXMpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCB2YWx1ZV90eXBlJiYgX194KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3NpdGlvbik7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIHN0ZDo6bW92ZShfX3gpKSwKKwkJCXRoaXMpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICBfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwkgIF9CYXNlOjppbnNlcnQoX19nbnVfZGVidWc6Ol9fYmFzZShfX2ZpcnN0KSwKKwkJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSk7CisJfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyBfQmFzZTo6aW5zZXJ0KF9fbCk7IH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlKF9fcG9zaXRpb24pOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fcG9zaXRpb24uYmFzZSgpKSk7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uLmJhc2UoKSksIHRoaXMpOworICAgICAgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlKF9fcG9zaXRpb24pOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fcG9zaXRpb24uYmFzZSgpKSk7CisJX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24uYmFzZSgpKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7CisJX0Jhc2VfaXRlcmF0b3IgX192aWN0aW0gPSBfQmFzZTo6ZmluZChfX3gpOworCWlmIChfX3ZpY3RpbSA9PSBfQmFzZTo6ZW5kKCkpCisgICAgICAgICAgcmV0dXJuIDA7CisJZWxzZQorCSAgeworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgICBfQmFzZTo6ZXJhc2UoX192aWN0aW0pOworCSAgICByZXR1cm4gMTsKKwkgIH0KKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDE1MS4gY2FuJ3QgY3VycmVudGx5IGNsZWFyKCkgZW1wdHkgY29udGFpbmVyCisJX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJZm9yIChfQmFzZV9jb25zdF9pdGVyYXRvciBfX3ZpY3RpbSA9IF9fZmlyc3QuYmFzZSgpOworCSAgICAgX192aWN0aW0gIT0gX19sYXN0LmJhc2UoKTsgKytfX3ZpY3RpbSkKKwkgIHsKKwkgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fdmljdGltICE9IF9CYXNlOjplbmQoKSwKKwkJCQkgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fZmlyc3QsICJmaXJzdCIpCisJCQkJICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX192aWN0aW0pKTsKKwkgIH0KKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fZmlyc3QuYmFzZSgpLCBfX2xhc3QuYmFzZSgpKSwgdGhpcyk7CisgICAgICB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAxNTEuIGNhbid0IGN1cnJlbnRseSBjbGVhcigpIGVtcHR5IGNvbnRhaW5lcgorCV9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCWZvciAoX0Jhc2VfaXRlcmF0b3IgX192aWN0aW0gPSBfX2ZpcnN0LmJhc2UoKTsKKwkgICAgIF9fdmljdGltICE9IF9fbGFzdC5iYXNlKCk7ICsrX192aWN0aW0pCisJICB7CisJICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX3ZpY3RpbSAhPSBfQmFzZTo6ZW5kKCksCisJCQkJICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9yYW5nZSkKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2ZpcnN0LCAiZmlyc3QiKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fbGFzdCwgImxhc3QiKSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fdmljdGltKSk7CisJICB9CisJX0Jhc2U6OmVyYXNlKF9fZmlyc3QuYmFzZSgpLCBfX2xhc3QuYmFzZSgpKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBzd2FwKHNldCYgX194KQorICAgICAgeworCV9CYXNlOjpzd2FwKF9feCk7CisJdGhpcy0+X01fc3dhcChfX3gpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlfQmFzZTo6Y2xlYXIoKTsKKyAgICAgIH0KKworICAgICAgLy8gb2JzZXJ2ZXJzOgorICAgICAgdXNpbmcgX0Jhc2U6OmtleV9jb21wOworICAgICAgdXNpbmcgX0Jhc2U6OnZhbHVlX2NvbXA7CisKKyAgICAgIC8vIHNldCBvcGVyYXRpb25zOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpmaW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxNC4gc2V0OjpmaW5kKCkgbWlzc2luZyBjb25zdCBvdmVybG9hZAorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpmaW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjpjb3VudDsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6bG93ZXJfYm91bmQoX194KSwgdGhpcyk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjE0LiBzZXQ6OmZpbmQoKSBtaXNzaW5nIGNvbnN0IG92ZXJsb2FkCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpsb3dlcl9ib3VuZChfX3gpLCB0aGlzKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjp1cHBlcl9ib3VuZChfX3gpLCB0aGlzKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTQuIHNldDo6ZmluZCgpIG1pc3NpbmcgY29uc3Qgb3ZlcmxvYWQKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OnVwcGVyX2JvdW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvcixpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX19yZXMgPQorICAgICAgICBfQmFzZTo6ZXF1YWxfcmFuZ2UoX194KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLAorCQkJICAgICAgaXRlcmF0b3IoX19yZXMuc2Vjb25kLCB0aGlzKSk7CisgICAgICB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxNC4gc2V0OjpmaW5kKCkgbWlzc2luZyBjb25zdCBvdmVybG9hZAorICAgICAgc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3JlcyA9CisgICAgICAgIF9CYXNlOjplcXVhbF9yYW5nZShfX3gpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihjb25zdF9pdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksCisJCQkgICAgICBjb25zdF9pdGVyYXRvcihfX3Jlcy5zZWNvbmQsIHRoaXMpKTsKKyAgICAgIH0KKworICAgICAgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgX0dMSUJDWFhfTk9FWENFUFQgICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3QgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQgeyByZXR1cm4gKnRoaXM7IH0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9pbnZhbGlkYXRlX2FsbCgpCisgICAgICB7CisJdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X05vdF9lcXVhbF90bzxfQmFzZV9jb25zdF9pdGVyYXRvcj4gX05vdF9lcXVhbDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9Ob3RfZXF1YWwoX01fYmFzZSgpLmVuZCgpKSk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA9PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSAhPSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPCBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPiBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICB2b2lkCisgICAgc3dhcChzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3gsCisJIHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feSkKKyAgICB7IHJldHVybiBfX3guc3dhcChfX3kpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fZGVidWcKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc3RyaW5nIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy9zdHJpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE1YmY5YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvc3RyaW5nCkBAIC0wLDAgKzEsMTE2MSBAQAorLy8gRGVidWdnaW5nIHN0cmluZyBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvc3RyaW5nCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19TVFJJTkcKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfU1RSSU5HIDEKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX3NlcXVlbmNlLmg+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9pdGVyYXRvci5oPgorCituYW1lc3BhY2UgX19nbnVfZGVidWcKK3sKKyAgLy8vIENsYXNzIHN0ZDo6YmFzaWNfc3RyaW5nIHdpdGggc2FmZXR5L2NoZWNraW5nL2RlYnVnIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+LAorICAgICAgICAgICAgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPgorICAgIGNsYXNzIGJhc2ljX3N0cmluZworICAgIDogcHVibGljIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4sCisgICAgICBwdWJsaWMgX19nbnVfZGVidWc6Ol9TYWZlX3NlcXVlbmNlPGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsCisJCQkJCQkgICAgICBfQWxsb2NhdG9yPiA+CisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+IF9CYXNlOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfc2VxdWVuY2U8YmFzaWNfc3RyaW5nPiAgICAgX1NhZmVfYmFzZTsKKworICBwdWJsaWM6CisgICAgLy8gdHlwZXM6CisgICAgdHlwZWRlZiBfVHJhaXRzCQkJCSAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZQkJICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQWxsb2NhdG9yCQkJCSAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlZmVyZW5jZSAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9yZWZlcmVuY2UgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9wb2ludGVyICAgICAgICAgICAgICBjb25zdF9wb2ludGVyOworCisgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8dHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yLCBiYXNpY19zdHJpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8dHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmc+IGNvbnN0X2l0ZXJhdG9yOworCisgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgdXNpbmcgX0Jhc2U6Om5wb3M7CisKKyAgICAvLyAyMS4zLjEgY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICBleHBsaWNpdCBiYXNpY19zdHJpbmcoY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgIDogX0Jhc2UoX19hKQorICAgIHsgfQorCisgICAgLy8gUHJvdmlkZXMgY29udmVyc2lvbiBmcm9tIGEgcmVsZWFzZS1tb2RlIHN0cmluZyB0byBhIGRlYnVnLW1vZGUgc3RyaW5nCisgICAgYmFzaWNfc3RyaW5nKGNvbnN0IF9CYXNlJiBfX2Jhc2UpIDogX0Jhc2UoX19iYXNlKSB7IH0KKworICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAvLyA0Mi4gc3RyaW5nIGN0b3JzIHNwZWNpZnkgd3JvbmcgZGVmYXVsdCBhbGxvY2F0b3IKKyAgICBiYXNpY19zdHJpbmcoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKKyAgICA6IF9CYXNlKF9fc3RyLCAwLCBfQmFzZTo6bnBvcywgX19zdHIuZ2V0X2FsbG9jYXRvcigpKQorICAgIHsgfQorCisgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgIC8vIDQyLiBzdHJpbmcgY3RvcnMgc3BlY2lmeSB3cm9uZyBkZWZhdWx0IGFsbG9jYXRvcgorICAgIGJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsCisJCSAgIHNpemVfdHlwZSBfX24gPSBfQmFzZTo6bnBvcywKKwkJICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgIDogX0Jhc2UoX19zdHIsIF9fcG9zLCBfX24sIF9fYSkKKyAgICB7IH0KKworICAgIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbiwKKwkJICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgIDogX0Jhc2UoX19nbnVfZGVidWc6Ol9fY2hlY2tfc3RyaW5nKF9fcywgX19uKSwgX19uLCBfX2EpCisgICAgeyB9CisKKyAgICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICA6IF9CYXNlKF9fZ251X2RlYnVnOjpfX2NoZWNrX3N0cmluZyhfX3MpLCBfX2EpCisgICAgeyB0aGlzLT5hc3NpZ24oX19zKTsgfQorCisgICAgYmFzaWNfc3RyaW5nKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsCisJCSAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICA6IF9CYXNlKF9fbiwgX19jLCBfX2EpCisgICAgeyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIGJhc2ljX3N0cmluZyhfSW5wdXRJdGVyYXRvciBfX2JlZ2luLCBfSW5wdXRJdGVyYXRvciBfX2VuZCwKKwkJICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZ251X2RlYnVnOjpfX2NoZWNrX3ZhbGlkX3JhbmdlKF9fYmVnaW4sCisJCQkJCQkJCSAgIF9fZW5kKSksCisJICAgICAgX19nbnVfZGVidWc6Ol9fYmFzZShfX2VuZCksIF9fYSkKKyAgICAgIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIGJhc2ljX3N0cmluZyhiYXNpY19zdHJpbmcmJiBfX3N0cikgbm9leGNlcHQKKyAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3N0cikpCisgICAgeyB9CisKKyAgICBiYXNpY19zdHJpbmcoc3RkOjppbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sLAorCQkgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgIDogX0Jhc2UoX19sLCBfX2EpCisgICAgeyB9CisjZW5kaWYgLy8gQysrMTEKKworICAgIH5iYXNpY19zdHJpbmcoKSBfR0xJQkNYWF9OT0VYQ0VQVCB7IH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBvcGVyYXRvcj0oY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKKyAgICB7CisgICAgICAqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9fc3RyOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgb3BlcmF0b3I9KGNvbnN0IF9DaGFyVCogX19zKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19zKTsKKyAgICAgICpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX19zOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgb3BlcmF0b3I9KF9DaGFyVCBfX2MpCisgICAgeworICAgICAgKnN0YXRpY19jYXN0PF9CYXNlKj4odGhpcykgPSBfX2M7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICBiYXNpY19zdHJpbmcmCisgICAgb3BlcmF0b3I9KGJhc2ljX3N0cmluZyYmIF9fc3RyKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zZWxmX21vdmVfYXNzaWduKF9fc3RyKTsKKyAgICAgICpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gc3RkOjptb3ZlKF9fc3RyKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIG9wZXJhdG9yPShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X0NoYXJUPiBfX2wpCisgICAgeworICAgICAgKnN0YXRpY19jYXN0PF9CYXNlKj4odGhpcykgPSBfX2w7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZiAvLyBDKysxMQorCisgICAgLy8gMjEuMy4yIGl0ZXJhdG9yczoKKyAgICBpdGVyYXRvcgorICAgIGJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgaXRlcmF0b3IKKyAgICBlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgcmJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgIHJiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICByZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgcmVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyNlbmRpZgorCisgICAgLy8gMjEuMy4zIGNhcGFjaXR5OgorICAgIHVzaW5nIF9CYXNlOjpzaXplOworICAgIHVzaW5nIF9CYXNlOjpsZW5ndGg7CisgICAgdXNpbmcgX0Jhc2U6Om1heF9zaXplOworCisgICAgdm9pZAorICAgIHJlc2l6ZShzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgIHsKKyAgICAgIF9CYXNlOjpyZXNpemUoX19uLCBfX2MpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgcmVzaXplKHNpemVfdHlwZSBfX24pCisgICAgeyB0aGlzLT5yZXNpemUoX19uLCBfQ2hhclQoKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICB2b2lkCisgICAgc2hyaW5rX3RvX2ZpdCgpCisgICAgeworICAgICAgaWYgKGNhcGFjaXR5KCkgPiBzaXplKCkpCisJeworCSAgX190cnkKKwkgICAgeworCSAgICAgIHJlc2VydmUoMCk7CisJICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgfQorCX0KKyAgICB9CisjZW5kaWYKKworICAgIHVzaW5nIF9CYXNlOjpjYXBhY2l0eTsKKyAgICB1c2luZyBfQmFzZTo6cmVzZXJ2ZTsKKworICAgIHZvaWQKKyAgICBjbGVhcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgX0Jhc2U6OmNsZWFyKCk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgIH0KKworICAgIHVzaW5nIF9CYXNlOjplbXB0eTsKKworICAgIC8vIDIxLjMuNCBlbGVtZW50IGFjY2VzczoKKyAgICBjb25zdF9yZWZlcmVuY2UKKyAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX3BvcykgY29uc3QKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19wb3MgPD0gdGhpcy0+c2l6ZSgpLAorCQkJICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3N1YnNjcmlwdF9vb2IpCisJCQkgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpCisJCQkgICAgLl9NX2ludGVnZXIoX19wb3MsICJfX3BvcyIpCisJCQkgICAgLl9NX2ludGVnZXIodGhpcy0+c2l6ZSgpLCAic2l6ZSIpKTsKKyAgICAgIHJldHVybiBfTV9iYXNlKClbX19wb3NdOworICAgIH0KKworICAgIHJlZmVyZW5jZQorICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fcG9zKQorICAgIHsKKyNpZmRlZiBfR0xJQkNYWF9ERUJVR19QRURBTlRJQworICAgICAgX19nbGliY3h4X2NoZWNrX3N1YnNjcmlwdChfX3Bvcyk7CisjZWxzZQorICAgICAgLy8gYXMgYW4gZXh0ZW5zaW9uIHYzIGFsbG93cyBzW3Muc2l6ZSgpXSB3aGVuIHMgaXMgbm9uLWNvbnN0LgorICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fcG9zIDw9IHRoaXMtPnNpemUoKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19zdWJzY3JpcHRfb29iKQorCQkJICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKQorCQkJICAgIC5fTV9pbnRlZ2VyKF9fcG9zLCAiX19wb3MiKQorCQkJICAgIC5fTV9pbnRlZ2VyKHRoaXMtPnNpemUoKSwgInNpemUiKSk7CisjZW5kaWYKKyAgICAgIHJldHVybiBfTV9iYXNlKClbX19wb3NdOworICAgIH0KKworICAgIHVzaW5nIF9CYXNlOjphdDsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICB1c2luZyBfQmFzZTo6ZnJvbnQ7CisgICAgdXNpbmcgX0Jhc2U6OmJhY2s7CisjZW5kaWYKKworICAgIC8vIDIxLjMuNSBtb2RpZmllcnM6CisgICAgYmFzaWNfc3RyaW5nJgorICAgIG9wZXJhdG9yKz0oY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKKyAgICB7CisgICAgICBfTV9iYXNlKCkgKz0gX19zdHI7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBvcGVyYXRvcis9KGNvbnN0IF9DaGFyVCogX19zKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19zKTsKKyAgICAgIF9NX2Jhc2UoKSArPSBfX3M7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBvcGVyYXRvcis9KF9DaGFyVCBfX2MpCisgICAgeworICAgICAgX01fYmFzZSgpICs9IF9fYzsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIGJhc2ljX3N0cmluZyYKKyAgICBvcGVyYXRvcis9KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCkKKyAgICB7CisgICAgICBfTV9iYXNlKCkgKz0gX19sOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYgLy8gQysrMTEKKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBhcHBlbmQoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKKyAgICB7CisgICAgICBfQmFzZTo6YXBwZW5kKF9fc3RyKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGFwcGVuZChjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX0Jhc2U6OmFwcGVuZChfX3N0ciwgX19wb3MsIF9fbik7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgX0Jhc2U6OmFwcGVuZChfX3MsIF9fbik7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX3MpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgX0Jhc2U6OmFwcGVuZChfX3MpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgYXBwZW5kKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgeworICAgICAgX0Jhc2U6OmFwcGVuZChfX24sIF9fYyk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgYXBwZW5kKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwlfQmFzZTo6YXBwZW5kKF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCSAgICAgIF9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgLy8gNy4gc3RyaW5nIGNsYXVzZSBtaW5vciBwcm9ibGVtcworICAgIHZvaWQKKyAgICBwdXNoX2JhY2soX0NoYXJUIF9fYykKKyAgICB7CisgICAgICBfQmFzZTo6cHVzaF9iYWNrKF9fYyk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBhc3NpZ24oY29uc3QgYmFzaWNfc3RyaW5nJiBfX3gpCisgICAgeworICAgICAgX0Jhc2U6OmFzc2lnbihfX3gpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGFzc2lnbihiYXNpY19zdHJpbmcmJiBfX3gpCisgICAgeworICAgICAgX0Jhc2U6OmFzc2lnbihzdGQ6Om1vdmUoX194KSk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZiAvLyBDKysxMQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGFzc2lnbihjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX0Jhc2U6OmFzc2lnbihfX3N0ciwgX19wb3MsIF9fbik7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBhc3NpZ24oY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgX0Jhc2U6OmFzc2lnbihfX3MsIF9fbik7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBhc3NpZ24oY29uc3QgX0NoYXJUKiBfX3MpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgX0Jhc2U6OmFzc2lnbihfX3MpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgYXNzaWduKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgeworICAgICAgX0Jhc2U6OmFzc2lnbihfX24sIF9fYyk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwlfQmFzZTo6YXNzaWduKF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCSAgICAgIF9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGFzc2lnbihzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X0NoYXJUPiBfX2wpCisgICAgeworICAgICAgX0Jhc2U6OmFzc2lnbihfX2wpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYgLy8gQysrMTEKKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKKyAgICB7CisgICAgICBfQmFzZTo6aW5zZXJ0KF9fcG9zMSwgX19zdHIpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgaW5zZXJ0KHNpemVfdHlwZSBfX3BvczEsIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsCisJICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfQmFzZTo6aW5zZXJ0KF9fcG9zMSwgX19zdHIsIF9fcG9zMiwgX19uKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19zKTsKKyAgICAgIF9CYXNlOjppbnNlcnQoX19wb3MsIF9fcywgX19uKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9DaGFyVCogX19zKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19zKTsKKyAgICAgIF9CYXNlOjppbnNlcnQoX19wb3MsIF9fcyk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgIHsKKyAgICAgIF9CYXNlOjppbnNlcnQoX19wb3MsIF9fbiwgX19jKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgaXRlcmF0b3IKKyAgICBpbnNlcnQoaXRlcmF0b3IgX19wLCBfQ2hhclQgX19jKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wKTsKKyAgICAgIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX19wLmJhc2UoKSwgX19jKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gaXRlcmF0b3IoX19yZXMsIHRoaXMpOworICAgIH0KKworICAgIHZvaWQKKyAgICBpbnNlcnQoaXRlcmF0b3IgX19wLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wKTsKKyAgICAgIF9CYXNlOjppbnNlcnQoX19wLmJhc2UoKSwgX19uLCBfX2MpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3AsIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0X3JhbmdlKF9fcCwgX19maXJzdCwgX19sYXN0KTsKKwlfQmFzZTo6aW5zZXJ0KF9fcC5iYXNlKCksIF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCQkJICBfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCkpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgdm9pZAorICAgIGluc2VydChpdGVyYXRvciBfX3AsIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCkKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcCk7CisgICAgICBfQmFzZTo6aW5zZXJ0KF9fcC5iYXNlKCksIF9fbCk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgIH0KKyNlbmRpZiAvLyBDKysxMQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGVyYXNlKHNpemVfdHlwZSBfX3BvcyA9IDAsIHNpemVfdHlwZSBfX24gPSBfQmFzZTo6bnBvcykKKyAgICB7CisgICAgICBfQmFzZTo6ZXJhc2UoX19wb3MsIF9fbik7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGl0ZXJhdG9yCisgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfZXJhc2UoX19wb3NpdGlvbik7CisgICAgICB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbi5iYXNlKCkpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiBpdGVyYXRvcihfX3JlcywgdGhpcyk7CisgICAgfQorCisgICAgaXRlcmF0b3IKKyAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTUxLiBjYW4ndCBjdXJyZW50bHkgY2xlYXIoKSBlbXB0eSBjb250YWluZXIKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6OmVyYXNlKF9fZmlyc3QuYmFzZSgpLAorCQkJCQkJICAgICAgIF9fbGFzdC5iYXNlKCkpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiBpdGVyYXRvcihfX3JlcywgdGhpcyk7CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHZvaWQKKyAgICBwb3BfYmFjaygpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisgICAgICBfQmFzZTo6cG9wX2JhY2soKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgfQorI2VuZGlmIC8vIEMrKzExCisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgcmVwbGFjZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKKyAgICB7CisgICAgICBfQmFzZTo6cmVwbGFjZShfX3BvczEsIF9fbjEsIF9fc3RyKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsCisJICAgIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKQorICAgIHsKKyAgICAgIF9CYXNlOjpyZXBsYWNlKF9fcG9zMSwgX19uMSwgX19zdHIsIF9fcG9zMiwgX19uMik7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLAorCSAgICBzaXplX3R5cGUgX19uMikKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nX2xlbihfX3MsIF9fbjIpOworICAgICAgX0Jhc2U6OnJlcGxhY2UoX19wb3MsIF9fbjEsIF9fcywgX19uMik7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19zKTsKKyAgICAgIF9CYXNlOjpyZXBsYWNlKF9fcG9zLCBfX24xLCBfX3MpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBzaXplX3R5cGUgX19uMiwgX0NoYXJUIF9fYykKKyAgICB7CisgICAgICBfQmFzZTo6cmVwbGFjZShfX3BvcywgX19uMSwgX19uMiwgX19jKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19pMSwgX19pMik7CisgICAgICBfQmFzZTo6cmVwbGFjZShfX2kxLmJhc2UoKSwgX19pMi5iYXNlKCksIF9fc3RyKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlKF9faTEsIF9faTIpOworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgX0Jhc2U6OnJlcGxhY2UoX19pMS5iYXNlKCksIF9faTIuYmFzZSgpLCBfX3MsIF9fbik7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIGNvbnN0IF9DaGFyVCogX19zKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2kxLCBfX2kyKTsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19zKTsKKyAgICAgIF9CYXNlOjpyZXBsYWNlKF9faTEuYmFzZSgpLCBfX2kyLmJhc2UoKSwgX19zKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19pMSwgX19pMik7CisgICAgICBfQmFzZTo6cmVwbGFjZShfX2kxLmJhc2UoKSwgX19pMi5iYXNlKCksIF9fbiwgX19jKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsCisJICAgICAgX0lucHV0SXRlcmF0b3IgX19qMSwgX0lucHV0SXRlcmF0b3IgX19qMikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19pMSwgX19pMik7CisJX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9fajEsIF9fajIpOworCV9CYXNlOjpyZXBsYWNlKF9faTEuYmFzZSgpLCBfX2kyLmJhc2UoKSwgX19qMSwgX19qMik7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBiYXNpY19zdHJpbmcmIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwKKwkJCSAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X0NoYXJUPiBfX2wpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlKF9faTEsIF9faTIpOworCV9CYXNlOjpyZXBsYWNlKF9faTEuYmFzZSgpLCBfX2kyLmJhc2UoKSwgX19sKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZiAvLyBDKysxMQorCisgICAgc2l6ZV90eXBlCisgICAgY29weShfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbiwgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICByZXR1cm4gX0Jhc2U6OmNvcHkoX19zLCBfX24sIF9fcG9zKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgc3dhcChiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9feCkKKyAgICB7CisgICAgICBfQmFzZTo6c3dhcChfX3gpOworICAgICAgdGhpcy0+X01fc3dhcChfX3gpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIF9feC5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgIH0KKworICAgIC8vIDIxLjMuNiBzdHJpbmcgb3BlcmF0aW9uczoKKyAgICBjb25zdCBfQ2hhclQqCisgICAgY19zdHIoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNvbnN0IF9DaGFyVCogX19yZXMgPSBfQmFzZTo6Y19zdHIoKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gX19yZXM7CisgICAgfQorCisgICAgY29uc3QgX0NoYXJUKgorICAgIGRhdGEoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIGNvbnN0IF9DaGFyVCogX19yZXMgPSBfQmFzZTo6ZGF0YSgpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiBfX3JlczsKKyAgICB9CisKKyAgICB1c2luZyBfQmFzZTo6Z2V0X2FsbG9jYXRvcjsKKworICAgIHNpemVfdHlwZQorICAgIGZpbmQoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICAgIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gX0Jhc2U6OmZpbmQoX19zdHIsIF9fcG9zKTsgfQorCisgICAgc2l6ZV90eXBlCisgICAgZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19zKTsKKyAgICAgIHJldHVybiBfQmFzZTo6ZmluZChfX3MsIF9fcG9zLCBfX24pOworICAgIH0KKworICAgIHNpemVfdHlwZQorICAgIGZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgcmV0dXJuIF9CYXNlOjpmaW5kKF9fcywgX19wb3MpOworICAgIH0KKworICAgIHNpemVfdHlwZQorICAgIGZpbmQoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBfQmFzZTo6ZmluZChfX2MsIF9fcG9zKTsgfQorCisgICAgc2l6ZV90eXBlCisgICAgcmZpbmQoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gX0Jhc2U6Om5wb3MpIGNvbnN0CisgICAgICBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIF9CYXNlOjpyZmluZChfX3N0ciwgX19wb3MpOyB9CisKKyAgICBzaXplX3R5cGUKKyAgICByZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgIHJldHVybiBfQmFzZTo6cmZpbmQoX19zLCBfX3BvcywgX19uKTsKKyAgICB9CisKKyAgICBzaXplX3R5cGUKKyAgICByZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gX0Jhc2U6Om5wb3MpIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgcmV0dXJuIF9CYXNlOjpyZmluZChfX3MsIF9fcG9zKTsKKyAgICB9CisKKyAgICBzaXplX3R5cGUKKyAgICByZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBfQmFzZTo6bnBvcykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBfQmFzZTo6cmZpbmQoX19jLCBfX3Bvcyk7IH0KKworICAgIHNpemVfdHlwZQorICAgIGZpbmRfZmlyc3Rfb2YoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICAgIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gX0Jhc2U6OmZpbmRfZmlyc3Rfb2YoX19zdHIsIF9fcG9zKTsgfQorCisgICAgc2l6ZV90eXBlCisgICAgZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19zKTsKKyAgICAgIHJldHVybiBfQmFzZTo6ZmluZF9maXJzdF9vZihfX3MsIF9fcG9zLCBfX24pOworICAgIH0KKworICAgIHNpemVfdHlwZQorICAgIGZpbmRfZmlyc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgcmV0dXJuIF9CYXNlOjpmaW5kX2ZpcnN0X29mKF9fcywgX19wb3MpOworICAgIH0KKworICAgIHNpemVfdHlwZQorICAgIGZpbmRfZmlyc3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBfQmFzZTo6ZmluZF9maXJzdF9vZihfX2MsIF9fcG9zKTsgfQorCisgICAgc2l6ZV90eXBlCisgICAgZmluZF9sYXN0X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIAorCQkgc2l6ZV90eXBlIF9fcG9zID0gX0Jhc2U6Om5wb3MpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gX0Jhc2U6OmZpbmRfbGFzdF9vZihfX3N0ciwgX19wb3MpOyB9CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kX2xhc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICByZXR1cm4gX0Jhc2U6OmZpbmRfbGFzdF9vZihfX3MsIF9fcG9zLCBfX24pOworICAgIH0KKworICAgIHNpemVfdHlwZQorICAgIGZpbmRfbGFzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gX0Jhc2U6Om5wb3MpIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgcmV0dXJuIF9CYXNlOjpmaW5kX2xhc3Rfb2YoX19zLCBfX3Bvcyk7CisgICAgfQorCisgICAgc2l6ZV90eXBlCisgICAgZmluZF9sYXN0X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IF9CYXNlOjpucG9zKSBjb25zdAorICAgICAgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBfQmFzZTo6ZmluZF9sYXN0X29mKF9fYywgX19wb3MpOyB9CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICAgICAgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBfQmFzZTo6ZmluZF9maXJzdF9ub3Rfb2YoX19zdHIsIF9fcG9zKTsgfQorCisgICAgc2l6ZV90eXBlCisgICAgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICByZXR1cm4gX0Jhc2U6OmZpbmRfZmlyc3Rfbm90X29mKF9fcywgX19wb3MsIF9fbik7CisgICAgfQorCisgICAgc2l6ZV90eXBlCisgICAgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgcmV0dXJuIF9CYXNlOjpmaW5kX2ZpcnN0X25vdF9vZihfX3MsIF9fcG9zKTsKKyAgICB9CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kX2ZpcnN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIF9CYXNlOjpmaW5kX2ZpcnN0X25vdF9vZihfX2MsIF9fcG9zKTsgfQorCisgICAgc2l6ZV90eXBlCisgICAgZmluZF9sYXN0X25vdF9vZihjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLAorCQkJCSAgc2l6ZV90eXBlIF9fcG9zID0gX0Jhc2U6Om5wb3MpIGNvbnN0CisgICAgICBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIF9CYXNlOjpmaW5kX2xhc3Rfbm90X29mKF9fc3RyLCBfX3Bvcyk7IH0KKworICAgIHNpemVfdHlwZQorICAgIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICByZXR1cm4gX0Jhc2U6OmZpbmRfbGFzdF9ub3Rfb2YoX19zLCBfX3BvcywgX19uKTsKKyAgICB9CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBfQmFzZTo6bnBvcykgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICByZXR1cm4gX0Jhc2U6OmZpbmRfbGFzdF9ub3Rfb2YoX19zLCBfX3Bvcyk7CisgICAgfQorCisgICAgc2l6ZV90eXBlCisgICAgZmluZF9sYXN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBfQmFzZTo6bnBvcykgY29uc3QKKyAgICAgIF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gX0Jhc2U6OmZpbmRfbGFzdF9ub3Rfb2YoX19jLCBfX3Bvcyk7IH0KKworICAgIGJhc2ljX3N0cmluZworICAgIHN1YnN0cihzaXplX3R5cGUgX19wb3MgPSAwLCBzaXplX3R5cGUgX19uID0gX0Jhc2U6Om5wb3MpIGNvbnN0CisgICAgeyByZXR1cm4gYmFzaWNfc3RyaW5nKF9CYXNlOjpzdWJzdHIoX19wb3MsIF9fbikpOyB9CisKKyAgICBpbnQKKyAgICBjb21wYXJlKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpIGNvbnN0CisgICAgeyByZXR1cm4gX0Jhc2U6OmNvbXBhcmUoX19zdHIpOyB9CisKKyAgICBpbnQKKyAgICBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLAorCQkgIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpIGNvbnN0CisgICAgeyByZXR1cm4gX0Jhc2U6OmNvbXBhcmUoX19wb3MxLCBfX24xLCBfX3N0cik7IH0KKworICAgIGludAorICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsCisJICAgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjIpIGNvbnN0CisgICAgeyByZXR1cm4gX0Jhc2U6OmNvbXBhcmUoX19wb3MxLCBfX24xLCBfX3N0ciwgX19wb3MyLCBfX24yKTsgfQorCisgICAgaW50CisgICAgY29tcGFyZShjb25zdCBfQ2hhclQqIF9fcykgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICByZXR1cm4gX0Jhc2U6OmNvbXBhcmUoX19zKTsKKyAgICB9CisKKyAgICAvLyAgX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgIC8vICA1LiBzdHJpbmc6OmNvbXBhcmUgc3BlY2lmaWNhdGlvbiBxdWVzdGlvbmFibGUKKyAgICBpbnQKKyAgICBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcykgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICByZXR1cm4gX0Jhc2U6OmNvbXBhcmUoX19wb3MxLCBfX24xLCBfX3MpOworICAgIH0KKworICAgIC8vICBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgLy8gIDUuIHN0cmluZzo6Y29tcGFyZSBzcGVjaWZpY2F0aW9uIHF1ZXN0aW9uYWJsZQorICAgIGludAorICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsY29uc3QgX0NoYXJUKiBfX3MsCisJICAgICAgc2l6ZV90eXBlIF9fbjIpIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZ19sZW4oX19zLCBfX24yKTsKKyAgICAgIHJldHVybiBfQmFzZTo6Y29tcGFyZShfX3BvczEsIF9fbjEsIF9fcywgX19uMik7CisgICAgfQorCisgICAgX0Jhc2UmCisgICAgX01fYmFzZSgpIF9HTElCQ1hYX05PRVhDRVBUICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBjb25zdCBfQmFzZSYKKyAgICBfTV9iYXNlKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQgeyByZXR1cm4gKnRoaXM7IH0KKworICAgIHVzaW5nIF9TYWZlX2Jhc2U6Ol9NX2ludmFsaWRhdGVfYWxsOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+CisgICAgb3BlcmF0b3IrKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4oX19saHMpICs9IF9fcmhzOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4KKyAgICBvcGVyYXRvcisoY29uc3QgX0NoYXJUKiBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19saHMpOworICAgICAgcmV0dXJuIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPihfX2xocykgKz0gX19yaHM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+CisgICAgb3BlcmF0b3IrKF9DaGFyVCBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPigxLCBfX2xocykgKz0gX19yaHM7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPgorICAgIG9wZXJhdG9yKyhjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3Jocyk7CisgICAgICByZXR1cm4gYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+KF9fbGhzKSArPSBfX3JoczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4KKyAgICBvcGVyYXRvcisoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBfQ2hhclQgX19yaHMpCisgICAgeyByZXR1cm4gYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+KF9fbGhzKSArPSBfX3JoczsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19saHMpOworICAgICAgcmV0dXJuIF9fbGhzID09IF9fcmhzLl9NX2Jhc2UoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfQ2hhclQqIF9fcmhzKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19yaHMpOworICAgICAgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA9PSBfX3JoczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSAhPSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX2xocyk7CisgICAgICByZXR1cm4gX19saHMgIT0gX19yaHMuX01fYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3Jocyk7CisgICAgICByZXR1cm4gX19saHMuX01fYmFzZSgpICE9IF9fcmhzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX2xocyk7CisgICAgICByZXR1cm4gX19saHMgPCBfX3Jocy5fTV9iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3Jocyk7CisgICAgICByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPD0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19saHMpOworICAgICAgcmV0dXJuIF9fbGhzIDw9IF9fcmhzLl9NX2Jhc2UoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfQ2hhclQqIF9fcmhzKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19yaHMpOworICAgICAgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8PSBfX3JoczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX2xocyk7CisgICAgICByZXR1cm4gX19saHMgPj0gX19yaHMuX01fYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3Jocyk7CisgICAgICByZXR1cm4gX19saHMuX01fYmFzZSgpID49IF9fcmhzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX2xocyk7CisgICAgICByZXR1cm4gX19saHMgPiBfX3Jocy5fTV9iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3Jocyk7CisgICAgICByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHM7CisgICAgfQorCisgIC8vIDIxLjMuNy44OgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19saHMsCisJIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19zdHIpCisgICAgeyByZXR1cm4gX19vcyA8PCBfX3N0ci5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCxfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19zdHIpCisgICAgeworICAgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCxfVHJhaXRzPiYgX19yZXMgPSBfX2lzID4+IF9fc3RyLl9NX2Jhc2UoKTsKKyAgICAgIF9fc3RyLl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gX19yZXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULF9UcmFpdHM+JgorICAgIGdldGxpbmUoc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCxfVHJhaXRzPiYgX19pcywKKwkgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX3N0ciwgX0NoYXJUIF9fZGVsaW0pCisgICAgeworICAgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCxfVHJhaXRzPiYgX19yZXMgPSBnZXRsaW5lKF9faXMsCisJCQkJCQkJICBfX3N0ci5fTV9iYXNlKCksCisJCQkJCQkJX19kZWxpbSk7CisgICAgICBfX3N0ci5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuIF9fcmVzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCxfVHJhaXRzPiYKKyAgICBnZXRsaW5lKHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsX1RyYWl0cz4mIF9faXMsCisJICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19zdHIpCisgICAgeworICAgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCxfVHJhaXRzPiYgX19yZXMgPSBnZXRsaW5lKF9faXMsCisJCQkJCQkJICBfX3N0ci5fTV9iYXNlKCkpOworICAgICAgX19zdHIuX01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiBfX3JlczsKKyAgICB9CisKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcj4gICAgc3RyaW5nOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8d2NoYXJfdD4gd3N0cmluZzsKKyNlbmRpZgorCit9IC8vIG5hbWVzcGFjZSBfX2dudV9kZWJ1ZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvdW5vcmRlcmVkX21hcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvdW5vcmRlcmVkX21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODI2YjAxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy91bm9yZGVyZWRfbWFwCkBAIC0wLDAgKzEsOTAzIEBACisvLyBEZWJ1Z2dpbmcgdW5vcmRlcmVkX21hcC91bm9yZGVyZWRfbXVsdGltYXAgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL3Vub3JkZXJlZF9tYXAKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX1VOT1JERVJFRF9NQVAKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfVU5PUkRFUkVEX01BUCAxCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorIyBpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCisjaW5jbHVkZSA8ZGVidWcvc2FmZV91bm9yZGVyZWRfY29udGFpbmVyLmg+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9pdGVyYXRvci5oPgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfbG9jYWxfaXRlcmF0b3IuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19kZWJ1ZworeworICAvLy8gQ2xhc3Mgc3RkOjp1bm9yZGVyZWRfbWFwIHdpdGggc2FmZXR5L2NoZWNraW5nL2RlYnVnIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9IYXNoID0gc3RkOjpoYXNoPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9QcmVkID0gc3RkOjplcXVhbF90bzxfS2V5PiwKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfS2V5PiA+CisgICAgY2xhc3MgdW5vcmRlcmVkX21hcAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjp1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+LAorICAgICAgcHVibGljIF9fZ251X2RlYnVnOjpfU2FmZV91bm9yZGVyZWRfY29udGFpbmVyPHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLAorCQkJCQkJCV9IYXNoLCBfUHJlZCwgX0FsbG9jPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQzo6dW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLAorCQkJCQkgICAgX1ByZWQsIF9BbGxvYz4gX0Jhc2U7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV91bm9yZGVyZWRfY29udGFpbmVyPHVub3JkZXJlZF9tYXA+IF9TYWZlX2Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9jb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfbG9jYWxfaXRlcmF0b3IgX0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpsb2NhbF9pdGVyYXRvciBfQmFzZV9sb2NhbF9pdGVyYXRvcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X3R5cGUgICAgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2l0ZXJhdG9yLAorCQkJCQkgIHVub3JkZXJlZF9tYXA+IGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfY29uc3RfaXRlcmF0b3IsCisJCQkJCSAgdW5vcmRlcmVkX21hcD4gY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9sb2NhbF9pdGVyYXRvcjxfQmFzZV9sb2NhbF9pdGVyYXRvciwKKwkJCQkJICB1bm9yZGVyZWRfbWFwPiBsb2NhbF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2xvY2FsX2l0ZXJhdG9yPF9CYXNlX2NvbnN0X2xvY2FsX2l0ZXJhdG9yLAorCQkJCQkgIHVub3JkZXJlZF9tYXA+IGNvbnN0X2xvY2FsX2l0ZXJhdG9yOworCisgICAgICBleHBsaWNpdAorICAgICAgdW5vcmRlcmVkX21hcChzaXplX3R5cGUgX19uID0gMTAsCisJCSAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9faGYsIF9fZXFsLCBfX2EpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwl1bm9yZGVyZWRfbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgCisJCSAgICAgIHNpemVfdHlwZSBfX24gPSAwLAorCQkgICAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwgCisJCSAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwgCisJCSAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19nbnVfZGVidWc6Ol9fYmFzZShfX2dudV9kZWJ1Zzo6X19jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LAorCQkJCQkJCQkgICAgIF9fbGFzdCkpLAorCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCksIF9fbiwKKwkJX19oZiwgX19lcWwsIF9fYSkgeyB9CisKKyAgICAgIHVub3JkZXJlZF9tYXAoY29uc3QgdW5vcmRlcmVkX21hcCYgX194KSA9IGRlZmF1bHQ7CisKKyAgICAgIHVub3JkZXJlZF9tYXAoY29uc3QgX0Jhc2UmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworICAgICAgdW5vcmRlcmVkX21hcCh1bm9yZGVyZWRfbWFwJiYgX194KSA9IGRlZmF1bHQ7CisKKyAgICAgIHVub3JkZXJlZF9tYXAoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJCSAgICBzaXplX3R5cGUgX19uID0gMCwKKwkJICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7IH0KKworICAgICAgfnVub3JkZXJlZF9tYXAoKSBub2V4Y2VwdCB7IH0KKworICAgICAgdW5vcmRlcmVkX21hcCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB1bm9yZGVyZWRfbWFwJiBfX3gpCisgICAgICB7CisJKnN0YXRpY19jYXN0PF9CYXNlKj4odGhpcykgPSBfX3g7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHVub3JkZXJlZF9tYXAmCisgICAgICBvcGVyYXRvcj0odW5vcmRlcmVkX21hcCYmIF9feCkKKyAgICAgIHsKKyAgIAkvLyBOQjogRFIgMTIwNC4KKwkvLyBOQjogRFIgNjc1LgorCV9fZ2xpYmN4eF9jaGVja19zZWxmX21vdmVfYXNzaWduKF9feCk7CisJY2xlYXIoKTsKKwlzd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB1bm9yZGVyZWRfbWFwJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+aW5zZXJ0KF9fbCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHVub3JkZXJlZF9tYXAmIF9feCkKKyAgICAgIHsKKwlfQmFzZTo6c3dhcChfX3gpOworCV9TYWZlX2Jhc2U6Ol9NX3N3YXAoX194KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBub2V4Y2VwdAorICAgICAgeworCV9CYXNlOjpjbGVhcigpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yIAorICAgICAgYmVnaW4oKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIC8vIGxvY2FsIHZlcnNpb25zCisgICAgICBsb2NhbF9pdGVyYXRvcgorICAgICAgYmVnaW4oc2l6ZV90eXBlIF9fYikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfYnVja2V0X2luZGV4KF9fYik7CisJcmV0dXJuIGxvY2FsX2l0ZXJhdG9yKF9CYXNlOjpiZWdpbihfX2IpLCBfX2IsIHRoaXMpOworICAgICAgfQorCisgICAgICBsb2NhbF9pdGVyYXRvcgorICAgICAgZW5kKHNpemVfdHlwZSBfX2IpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBsb2NhbF9pdGVyYXRvcihfQmFzZTo6ZW5kKF9fYiksIF9fYiwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19iKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKF9fYiksIF9fYiwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBlbmQoc2l6ZV90eXBlIF9fYikgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfYnVja2V0X2luZGV4KF9fYik7CisJcmV0dXJuIGNvbnN0X2xvY2FsX2l0ZXJhdG9yKF9CYXNlOjplbmQoX19iKSwgX19iLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGNiZWdpbihzaXplX3R5cGUgX19iKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoX0Jhc2U6OmNiZWdpbihfX2IpLCBfX2IsIHRoaXMpOworICAgICAgfQorCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgY2VuZChzaXplX3R5cGUgX19iKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoX0Jhc2U6OmNlbmQoX19iKSwgX19iLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfc2l6ZShzaXplX3R5cGUgX19iKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gX0Jhc2U6OmJ1Y2tldF9zaXplKF9fYik7CisgICAgICB9CisKKyAgICAgIGZsb2F0CisgICAgICBtYXhfbG9hZF9mYWN0b3IoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX0Jhc2U6Om1heF9sb2FkX2ZhY3RvcigpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIG1heF9sb2FkX2ZhY3RvcihmbG9hdCBfX2YpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX21heF9sb2FkX2ZhY3RvcihfX2YpOworCV9CYXNlOjptYXhfbG9hZF9mYWN0b3IoX19mKTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorCWVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJICBzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIGJvb2w+IF9fcmVzCisJICAgID0gX0Jhc2U6OmVtcGxhY2Uoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIF9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwkgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksIF9fcmVzLnNlY29uZCk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX2hpbnQsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19oaW50KTsKKwkgIHNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCSAgX0Jhc2VfaXRlcmF0b3IgX19pdCA9IF9CYXNlOjplbXBsYWNlX2hpbnQoX19oaW50LmJhc2UoKSwKKwkJCQkJc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIF9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwkgIHJldHVybiBpdGVyYXRvcihfX2l0LCB0aGlzKTsKKwl9CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKwlzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIGJvb2w+IF9fcmVzID0gX0Jhc2U6Omluc2VydChfX29iaik7CisJX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksIF9fcmVzLnNlY29uZCk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19oaW50LCBjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9faGludCk7CisJc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJX0Jhc2VfaXRlcmF0b3IgX19pdCA9IF9CYXNlOjppbnNlcnQoX19oaW50LmJhc2UoKSwgX19vYmopOyAKKwlfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisJcmV0dXJuIGl0ZXJhdG9yKF9faXQsIHRoaXMpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8dmFsdWVfdHlwZSwKKwkJCQkJCSAgICBfUGFpciYmPjo6dmFsdWU+Ojp0eXBlPgorCXN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKwlpbnNlcnQoX1BhaXImJiBfX29iaikKKwl7CisJICBzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwkgIHN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgYm9vbD4gX19yZXMgPQorCSAgICBfQmFzZTo6aW5zZXJ0KHN0ZDo6Zm9yd2FyZDxfUGFpcj4oX19vYmopKTsKKwkgIF9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwkgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksIF9fcmVzLnNlY29uZCk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8dmFsdWVfdHlwZSwKKwkJCQkJCSAgICBfUGFpciYmPjo6dmFsdWU+Ojp0eXBlPgorCWl0ZXJhdG9yCisJaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgX1BhaXImJiBfX29iaikKKwl7CisJICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9faGludCk7CisJICBzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwkgIF9CYXNlX2l0ZXJhdG9yIF9faXQgPQorCSAgICBfQmFzZTo6aW5zZXJ0KF9faGludC5iYXNlKCksIHN0ZDo6Zm9yd2FyZDxfUGFpcj4oX19vYmopKTsKKwkgIF9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwkgIHJldHVybiBpdGVyYXRvcihfX2l0LCB0aGlzKTsKKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCV9CYXNlOjppbnNlcnQoX19sKTsKKwlfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXZvaWQKKwlpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorCXsKKwkgIF9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJICBfQmFzZTo6aW5zZXJ0KF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCkpOworCSAgX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCX0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX19rZXkpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZmluZChfX2tleSksIHRoaXMpOyB9CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX19yZXMgPQorCSAgX0Jhc2U6OmVxdWFsX3JhbmdlKF9fa2V5KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLAorCQkJICAgICAgaXRlcmF0b3IoX19yZXMuc2Vjb25kLCB0aGlzKSk7CisgICAgICB9CisKKyAgICAgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2NvbnN0X2l0ZXJhdG9yLCBfQmFzZV9jb25zdF9pdGVyYXRvcj4gX19yZXMgPQorCSAgX0Jhc2U6OmVxdWFsX3JhbmdlKF9fa2V5KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoY29uc3RfaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLAorCQkJICAgICAgY29uc3RfaXRlcmF0b3IoX19yZXMuc2Vjb25kLCB0aGlzKSk7CisgICAgICB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeworCXNpemVfdHlwZSBfX3JldCgwKTsKKwlfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbShfQmFzZTo6ZmluZChfX2tleSkpOworCWlmIChfX3ZpY3RpbSAhPSBfQmFzZTo6ZW5kKCkpCisJICB7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoW19fdmljdGltXShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCQkJICAgIHsgcmV0dXJuIF9faXQgPT0gX192aWN0aW07IH0pOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2xvY2FsX2lmKAorCQkJICAgIFtfX3ZpY3RpbV0oX0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3IgX19pdCkKKwkJCSAgICB7IHJldHVybiBfX2l0Ll9NX2N1ciA9PSBfX3ZpY3RpbS5fTV9jdXI7IH0pOworCSAgICBzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwkgICAgX0Jhc2U6OmVyYXNlKF9fdmljdGltKTsKKwkgICAgX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCSAgICBfX3JldCA9IDE7CisJICB9CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19pdCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2UoX19pdCk7CisJX0Jhc2VfY29uc3RfaXRlcmF0b3IgX192aWN0aW0gPSBfX2l0LmJhc2UoKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKFtfX3ZpY3RpbV0oX0Jhc2VfY29uc3RfaXRlcmF0b3IgX19pdCkKKwkJCXsgcmV0dXJuIF9faXQgPT0gX192aWN0aW07IH0pOworCXRoaXMtPl9NX2ludmFsaWRhdGVfbG9jYWxfaWYoCisJCQlbX192aWN0aW1dKF9CYXNlX2NvbnN0X2xvY2FsX2l0ZXJhdG9yIF9faXQpCisJCQl7IHJldHVybiBfX2l0Ll9NX2N1ciA9PSBfX3ZpY3RpbS5fTV9jdXI7IH0pOworCXNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCV9CYXNlX2l0ZXJhdG9yIF9fbmV4dCA9IF9CYXNlOjplcmFzZShfX2l0LmJhc2UoKSk7IAorCV9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwlyZXR1cm4gaXRlcmF0b3IoX19uZXh0LCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9faXQpCisgICAgICB7IHJldHVybiBlcmFzZShjb25zdF9pdGVyYXRvcihfX2l0KSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwlmb3IgKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9fdG1wID0gX19maXJzdC5iYXNlKCk7CisJICAgICBfX3RtcCAhPSBfX2xhc3QuYmFzZSgpOyArK19fdG1wKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX190bXAgIT0gX0Jhc2U6OmVuZCgpLAorCQkJCSAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UpCisJCQkJICAuX01faXRlcmF0b3IoX19maXJzdCwgImZpcnN0IikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKFtfX3RtcF0oX0Jhc2VfY29uc3RfaXRlcmF0b3IgX19pdCkKKwkJCSAgICB7IHJldHVybiBfX2l0ID09IF9fdG1wOyB9KTsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9sb2NhbF9pZigKKwkJCSAgICBbX190bXBdKF9CYXNlX2NvbnN0X2xvY2FsX2l0ZXJhdG9yIF9faXQpCisJCQkgICAgeyByZXR1cm4gX19pdC5fTV9jdXIgPT0gX190bXAuX01fY3VyOyB9KTsKKwkgIH0KKwlzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwlfQmFzZV9pdGVyYXRvciBfX25leHQgPSBfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksIF9fbGFzdC5iYXNlKCkpOworCV9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwlyZXR1cm4gaXRlcmF0b3IoX19uZXh0LCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgbm9leGNlcHQgICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3QgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gKnRoaXM7IH0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9pbnZhbGlkYXRlX2xvY2FscygpCisgICAgICB7CisJX0Jhc2VfbG9jYWxfaXRlcmF0b3IgX19sb2NhbF9lbmQgPSBfQmFzZTo6ZW5kKDApOworCXRoaXMtPl9NX2ludmFsaWRhdGVfbG9jYWxfaWYoCisJCQlbX19sb2NhbF9lbmRdKF9CYXNlX2NvbnN0X2xvY2FsX2l0ZXJhdG9yIF9faXQpCisJCQl7IHJldHVybiBfX2l0ICE9IF9fbG9jYWxfZW5kOyB9KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01faW52YWxpZGF0ZV9hbGwoKQorICAgICAgeworCV9CYXNlX2l0ZXJhdG9yIF9fZW5kID0gX0Jhc2U6OmVuZCgpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoW19fZW5kXShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCQkJeyByZXR1cm4gX19pdCAhPSBfX2VuZDsgfSk7CisJX01faW52YWxpZGF0ZV9sb2NhbHMoKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fY2hlY2tfcmVoYXNoZWQoc2l6ZV90eXBlIF9fcHJldl9jb3VudCkKKyAgICAgIHsKKwlpZiAoX19wcmV2X2NvdW50ICE9IHRoaXMtPmJ1Y2tldF9jb3VudCgpKQorCSAgX01faW52YWxpZGF0ZV9sb2NhbHMoKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fYmFzZSgpID09IF9feS5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9QcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworCisgIC8vLyBDbGFzcyBzdGQ6OnVub3JkZXJlZF9tdWx0aW1hcCB3aXRoIHNhZmV0eS9jaGVja2luZy9kZWJ1ZyBpbnN0cnVtZW50YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfSGFzaCA9IHN0ZDo6aGFzaDxfS2V5PiwKKwkgICB0eXBlbmFtZSBfUHJlZCA9IHN0ZDo6ZXF1YWxfdG88X0tleT4sCisJICAgdHlwZW5hbWUgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8X0tleT4gPgorICAgIGNsYXNzIHVub3JkZXJlZF9tdWx0aW1hcAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjp1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwKKwkJCQkJCV9QcmVkLCBfQWxsb2M+LAorICAgICAgcHVibGljIF9fZ251X2RlYnVnOjpfU2FmZV91bm9yZGVyZWRfY29udGFpbmVyPHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LAorCQkJCQkJX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6OnVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLAorCQkJCQkJIF9QcmVkLCBfQWxsb2M+IF9CYXNlOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfdW5vcmRlcmVkX2NvbnRhaW5lcjx1bm9yZGVyZWRfbXVsdGltYXA+CisJX1NhZmVfYmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlX2NvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9sb2NhbF9pdGVyYXRvciBfQmFzZV9jb25zdF9sb2NhbF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmxvY2FsX2l0ZXJhdG9yIF9CYXNlX2xvY2FsX2l0ZXJhdG9yOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Omhhc2hlciAgICAgICAgICBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfZXF1YWwgICAgICAga2V5X2VxdWFsOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgIGFsbG9jYXRvcl90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfdHlwZSAgICAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfaXRlcmF0b3IsCisJCQkJCSAgdW5vcmRlcmVkX211bHRpbWFwPiBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2NvbnN0X2l0ZXJhdG9yLAorCQkJCQkgIHVub3JkZXJlZF9tdWx0aW1hcD4gY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9sb2NhbF9pdGVyYXRvcjwKKwlfQmFzZV9sb2NhbF9pdGVyYXRvciwgdW5vcmRlcmVkX211bHRpbWFwPiBsb2NhbF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2xvY2FsX2l0ZXJhdG9yPAorCV9CYXNlX2NvbnN0X2xvY2FsX2l0ZXJhdG9yLCB1bm9yZGVyZWRfbXVsdGltYXA+IGNvbnN0X2xvY2FsX2l0ZXJhdG9yOworCisgICAgICBleHBsaWNpdAorICAgICAgdW5vcmRlcmVkX211bHRpbWFwKHNpemVfdHlwZSBfX24gPSAxMCwKKwkJCSBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX19oZiwgX19lcWwsIF9fYSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXVub3JkZXJlZF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIAorCQkJICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCQkgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwgCisJCQkgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksIAorCQkJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZ251X2RlYnVnOjpfX2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsCisJCQkJCQkJCSAgICAgX19sYXN0KSksCisJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSwgX19uLAorCQlfX2hmLCBfX2VxbCwgX19hKSB7IH0KKworICAgICAgdW5vcmRlcmVkX211bHRpbWFwKGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcCYgX194KSA9IGRlZmF1bHQ7CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcChjb25zdCBfQmFzZSYgX194KSAKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworICAgICAgdW5vcmRlcmVkX211bHRpbWFwKHVub3JkZXJlZF9tdWx0aW1hcCYmIF9feCkgPSBkZWZhdWx0OworCisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJCQkgc2l6ZV90eXBlIF9fbiA9IDAsCisJCQkgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkgeyB9CisKKyAgICAgIH51bm9yZGVyZWRfbXVsdGltYXAoKSBub2V4Y2VwdCB7IH0KKworICAgICAgdW5vcmRlcmVkX211bHRpbWFwJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcCYgX194KQorICAgICAgeworCSpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX194OworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0odW5vcmRlcmVkX211bHRpbWFwJiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJX19nbGliY3h4X2NoZWNrX3NlbGZfbW92ZV9hc3NpZ24oX194KTsKKwljbGVhcigpOworCXN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgc3dhcCh1bm9yZGVyZWRfbXVsdGltYXAmIF9feCkKKyAgICAgIHsKKwlfQmFzZTo6c3dhcChfX3gpOworCV9TYWZlX2Jhc2U6Ol9NX3N3YXAoX194KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBub2V4Y2VwdAorICAgICAgeworCV9CYXNlOjpjbGVhcigpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yIAorICAgICAgYmVnaW4oKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIC8vIGxvY2FsIHZlcnNpb25zCisgICAgICBsb2NhbF9pdGVyYXRvcgorICAgICAgYmVnaW4oc2l6ZV90eXBlIF9fYikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfYnVja2V0X2luZGV4KF9fYik7CisJcmV0dXJuIGxvY2FsX2l0ZXJhdG9yKF9CYXNlOjpiZWdpbihfX2IpLCBfX2IsIHRoaXMpOworICAgICAgfQorCisgICAgICBsb2NhbF9pdGVyYXRvcgorICAgICAgZW5kKHNpemVfdHlwZSBfX2IpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBsb2NhbF9pdGVyYXRvcihfQmFzZTo6ZW5kKF9fYiksIF9fYiwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19iKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKF9fYiksIF9fYiwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBlbmQoc2l6ZV90eXBlIF9fYikgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfYnVja2V0X2luZGV4KF9fYik7CisJcmV0dXJuIGNvbnN0X2xvY2FsX2l0ZXJhdG9yKF9CYXNlOjplbmQoX19iKSwgX19iLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGNiZWdpbihzaXplX3R5cGUgX19iKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoX0Jhc2U6OmNiZWdpbihfX2IpLCBfX2IsIHRoaXMpOworICAgICAgfQorCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgY2VuZChzaXplX3R5cGUgX19iKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoX0Jhc2U6OmNlbmQoX19iKSwgX19iLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfc2l6ZShzaXplX3R5cGUgX19iKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gX0Jhc2U6OmJ1Y2tldF9zaXplKF9fYik7CisgICAgICB9CisKKyAgICAgIGZsb2F0CisgICAgICBtYXhfbG9hZF9mYWN0b3IoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX0Jhc2U6Om1heF9sb2FkX2ZhY3RvcigpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIG1heF9sb2FkX2ZhY3RvcihmbG9hdCBfX2YpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX21heF9sb2FkX2ZhY3RvcihfX2YpOworCV9CYXNlOjptYXhfbG9hZF9mYWN0b3IoX19mKTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIHNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCSAgX0Jhc2VfaXRlcmF0b3IgX19pdAorCSAgICA9IF9CYXNlOjplbXBsYWNlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICBfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisJICByZXR1cm4gaXRlcmF0b3IoX19pdCwgdGhpcyk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX2hpbnQsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19oaW50KTsKKwkgIHNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCSAgX0Jhc2VfaXRlcmF0b3IgX19pdCA9IF9CYXNlOjplbXBsYWNlX2hpbnQoX19oaW50LmJhc2UoKSwKKwkJCQkJc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIF9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwkgIHJldHVybiBpdGVyYXRvcihfX2l0LCB0aGlzKTsKKwl9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7CisJc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJX0Jhc2VfaXRlcmF0b3IgX19pdCA9IF9CYXNlOjppbnNlcnQoX19vYmopOworCV9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwlyZXR1cm4gaXRlcmF0b3IoX19pdCwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19oaW50LCBjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9faGludCk7CisJc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJX0Jhc2VfaXRlcmF0b3IgX19pdCA9IF9CYXNlOjppbnNlcnQoX19oaW50LmJhc2UoKSwgX19vYmopOworCV9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwlyZXR1cm4gaXRlcmF0b3IoX19pdCwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLAorCQkJCQkJICAgIF9QYWlyJiY+Ojp2YWx1ZT46OnR5cGU+CisJaXRlcmF0b3IKKwlpbnNlcnQoX1BhaXImJiBfX29iaikKKwl7CisJICBzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwkgIF9CYXNlX2l0ZXJhdG9yIF9faXQgPSBfQmFzZTo6aW5zZXJ0KHN0ZDo6Zm9yd2FyZDxfUGFpcj4oX19vYmopKTsKKwkgIF9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwkgIHJldHVybiBpdGVyYXRvcihfX2l0LCB0aGlzKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLAorCQkJCQkJICAgIF9QYWlyJiY+Ojp2YWx1ZT46OnR5cGU+CisJaXRlcmF0b3IKKwlpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19oaW50LCBfUGFpciYmIF9fb2JqKQorCXsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19oaW50KTsKKwkgIHNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCSAgX0Jhc2VfaXRlcmF0b3IgX19pdCA9CisJICAgIF9CYXNlOjppbnNlcnQoX19oaW50LmJhc2UoKSwgc3RkOjpmb3J3YXJkPF9QYWlyPihfX29iaikpOworCSAgX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9faXQsIHRoaXMpOworCX0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IF9CYXNlOjppbnNlcnQoX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwl2b2lkCisJaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKwl7CisJICBfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwkgIHNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCSAgX0Jhc2U6Omluc2VydChfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZmlyc3QpLAorCQkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpKTsKKwkgIF9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwl9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpmaW5kKF9fa2V5KSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX19rZXkpLCB0aGlzKTsgfQorCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeworCXN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgX0Jhc2VfaXRlcmF0b3I+IF9fcmVzID0KKwkgIF9CYXNlOjplcXVhbF9yYW5nZShfX2tleSk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGl0ZXJhdG9yKF9fcmVzLnNlY29uZCwgdGhpcykpOworICAgICAgfQorCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeworCXN0ZDo6cGFpcjxfQmFzZV9jb25zdF9pdGVyYXRvciwgX0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9fcmVzID0KKwkgIF9CYXNlOjplcXVhbF9yYW5nZShfX2tleSk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGNvbnN0X2l0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGNvbnN0X2l0ZXJhdG9yKF9fcmVzLnNlY29uZCwgdGhpcykpOworICAgICAgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsKKwlzaXplX3R5cGUgX19yZXQoMCk7CisJc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX19wYWlyID0KKwkgIF9CYXNlOjplcXVhbF9yYW5nZShfX2tleSk7CisJZm9yIChfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9fcGFpci5maXJzdDsgX192aWN0aW0gIT0gX19wYWlyLnNlY29uZDspCisJICB7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoW19fdmljdGltXShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCQkJICAgIHsgcmV0dXJuIF9faXQgPT0gX192aWN0aW07IH0pOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2xvY2FsX2lmKAorCQkJICAgIFtfX3ZpY3RpbV0oX0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3IgX19pdCkKKwkJCSAgICB7IHJldHVybiBfX2l0Ll9NX2N1ciA9PSBfX3ZpY3RpbS5fTV9jdXI7IH0pOworCSAgICBfQmFzZTo6ZXJhc2UoX192aWN0aW0rKyk7CisJICAgICsrX19yZXQ7CisJICB9CisJX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9faXQpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlKF9faXQpOworCV9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9fdmljdGltID0gX19pdC5iYXNlKCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihbX192aWN0aW1dKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJCQl7IHJldHVybiBfX2l0ID09IF9fdmljdGltOyB9KTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2xvY2FsX2lmKAorCQkJW19fdmljdGltXShfQmFzZV9jb25zdF9sb2NhbF9pdGVyYXRvciBfX2l0KQorCQkJeyByZXR1cm4gX19pdC5fTV9jdXIgPT0gX192aWN0aW0uX01fY3VyOyB9KTsKKwlzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwlfQmFzZV9pdGVyYXRvciBfX25leHQgPSBfQmFzZTo6ZXJhc2UoX19pdC5iYXNlKCkpOworCV9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwlyZXR1cm4gaXRlcmF0b3IoX19uZXh0LCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9faXQpCisgICAgICB7IHJldHVybiBlcmFzZShjb25zdF9pdGVyYXRvcihfX2l0KSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwlmb3IgKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9fdG1wID0gX19maXJzdC5iYXNlKCk7CisJICAgICBfX3RtcCAhPSBfX2xhc3QuYmFzZSgpOyArK19fdG1wKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX190bXAgIT0gX0Jhc2U6OmVuZCgpLAorCQkJCSAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UpCisJCQkJICAuX01faXRlcmF0b3IoX19maXJzdCwgImZpcnN0IikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKFtfX3RtcF0oX0Jhc2VfY29uc3RfaXRlcmF0b3IgX19pdCkKKwkJCSAgICB7IHJldHVybiBfX2l0ID09IF9fdG1wOyB9KTsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9sb2NhbF9pZigKKwkJCSAgICBbX190bXBdKF9CYXNlX2NvbnN0X2xvY2FsX2l0ZXJhdG9yIF9faXQpCisJCQkgICAgeyByZXR1cm4gX19pdC5fTV9jdXIgPT0gX190bXAuX01fY3VyOyB9KTsKKwkgIH0KKwlzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwlfQmFzZV9pdGVyYXRvciBfX25leHQgPSBfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksIF9fbGFzdC5iYXNlKCkpOworCV9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwlyZXR1cm4gaXRlcmF0b3IoX19uZXh0LCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgbm9leGNlcHQgICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3QgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gKnRoaXM7IH0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9pbnZhbGlkYXRlX2xvY2FscygpCisgICAgICB7CisJX0Jhc2VfbG9jYWxfaXRlcmF0b3IgX19sb2NhbF9lbmQgPSBfQmFzZTo6ZW5kKDApOworCXRoaXMtPl9NX2ludmFsaWRhdGVfbG9jYWxfaWYoCisJCQlbX19sb2NhbF9lbmRdKF9CYXNlX2NvbnN0X2xvY2FsX2l0ZXJhdG9yIF9faXQpCisJCQl7IHJldHVybiBfX2l0ICE9IF9fbG9jYWxfZW5kOyB9KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01faW52YWxpZGF0ZV9hbGwoKQorICAgICAgeworCV9CYXNlX2l0ZXJhdG9yIF9fZW5kID0gX0Jhc2U6OmVuZCgpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoW19fZW5kXShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCQkJeyByZXR1cm4gX19pdCAhPSBfX2VuZDsgfSk7CisJX01faW52YWxpZGF0ZV9sb2NhbHMoKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fY2hlY2tfcmVoYXNoZWQoc2l6ZV90eXBlIF9fcHJldl9jb3VudCkKKyAgICAgIHsKKwlpZiAoX19wcmV2X2NvdW50ICE9IHRoaXMtPmJ1Y2tldF9jb3VudCgpKQorCSAgX01faW52YWxpZGF0ZV9sb2NhbHMoKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJIHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9iYXNlKCkgPT0gX195Ll9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworfSAvLyBuYW1lc3BhY2UgX19kZWJ1ZworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvdW5vcmRlcmVkX3NldCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVidWcvdW5vcmRlcmVkX3NldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTg4YWRkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy91bm9yZGVyZWRfc2V0CkBAIC0wLDAgKzEsODg1IEBACisvLyBEZWJ1Z2dpbmcgdW5vcmRlcmVkX3NldC91bm9yZGVyZWRfbXVsdGlzZXQgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL3Vub3JkZXJlZF9zZXQKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX1VOT1JERVJFRF9TRVQKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfVU5PUkRFUkVEX1NFVCAxCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorIyBpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCisjaW5jbHVkZSA8ZGVidWcvc2FmZV91bm9yZGVyZWRfY29udGFpbmVyLmg+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9pdGVyYXRvci5oPgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfbG9jYWxfaXRlcmF0b3IuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19kZWJ1ZworeworICAvLy8gQ2xhc3Mgc3RkOjp1bm9yZGVyZWRfc2V0IHdpdGggc2FmZXR5L2NoZWNraW5nL2RlYnVnIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9IYXNoID0gc3RkOjpoYXNoPF9WYWx1ZT4sCisJICAgdHlwZW5hbWUgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9WYWx1ZT4sCisJICAgdHlwZW5hbWUgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8X1ZhbHVlPiA+CisgICAgY2xhc3MgdW5vcmRlcmVkX3NldAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjp1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+LAorICAgICAgcHVibGljIF9fZ251X2RlYnVnOjpfU2FmZV91bm9yZGVyZWRfY29udGFpbmVyPHVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwKKwkJCQkJCSAgICAgICBfUHJlZCwgX0FsbG9jPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQzo6dW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLAorCQkJCQkgICAgX1ByZWQsIF9BbGxvYz4gX0Jhc2U7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV91bm9yZGVyZWRfY29udGFpbmVyPHVub3JkZXJlZF9zZXQ+IF9TYWZlX2Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9jb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfbG9jYWxfaXRlcmF0b3IgX0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpsb2NhbF9pdGVyYXRvciBfQmFzZV9sb2NhbF9pdGVyYXRvcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X3R5cGUgICAgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2l0ZXJhdG9yLAorCQkJCQkgIHVub3JkZXJlZF9zZXQ+IGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfY29uc3RfaXRlcmF0b3IsCisJCQkJCSAgdW5vcmRlcmVkX3NldD4gY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9sb2NhbF9pdGVyYXRvcjxfQmFzZV9sb2NhbF9pdGVyYXRvciwKKwkJCQkJICB1bm9yZGVyZWRfc2V0PiBsb2NhbF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2xvY2FsX2l0ZXJhdG9yPF9CYXNlX2NvbnN0X2xvY2FsX2l0ZXJhdG9yLAorCQkJCQkgIHVub3JkZXJlZF9zZXQ+IGNvbnN0X2xvY2FsX2l0ZXJhdG9yOworCisgICAgICBleHBsaWNpdAorICAgICAgdW5vcmRlcmVkX3NldChzaXplX3R5cGUgX19uID0gMTAsCisJCSAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9faGYsIF9fZXFsLCBfX2EpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdW5vcmRlcmVkX3NldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIAorCQkgICAgICBzaXplX3R5cGUgX19uID0gMCwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksIAorCQkgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksIAorCQkgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9CYXNlKF9fZ251X2RlYnVnOjpfX2Jhc2UoX19nbnVfZGVidWc6Ol9fY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwKKwkJCQkJCQkJICAgICBfX2xhc3QpKSwKKwkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpLCBfX24sCisJCV9faGYsIF9fZXFsLCBfX2EpIHsgfQorCisgICAgICB1bm9yZGVyZWRfc2V0KGNvbnN0IHVub3JkZXJlZF9zZXQmIF9feCkgPSBkZWZhdWx0OworCisgICAgICB1bm9yZGVyZWRfc2V0KGNvbnN0IF9CYXNlJiBfX3gpIAorICAgICAgOiBfQmFzZShfX3gpIHsgfQorCisgICAgICB1bm9yZGVyZWRfc2V0KHVub3JkZXJlZF9zZXQmJiBfX3gpID0gZGVmYXVsdDsKKworICAgICAgdW5vcmRlcmVkX3NldChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkJICAgIHNpemVfdHlwZSBfX24gPSAwLAorCQkgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLCBfX24sIF9faGYsIF9fZXFsLCBfX2EpIHsgfQorCisgICAgICB+dW5vcmRlcmVkX3NldCgpIG5vZXhjZXB0IHsgfQorCisgICAgICB1bm9yZGVyZWRfc2V0JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHVub3JkZXJlZF9zZXQmIF9feCkKKyAgICAgIHsKKwkqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9feDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdW5vcmRlcmVkX3NldCYKKyAgICAgIG9wZXJhdG9yPSh1bm9yZGVyZWRfc2V0JiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJX19nbGliY3h4X2NoZWNrX3NlbGZfbW92ZV9hc3NpZ24oX194KTsKKwljbGVhcigpOworCXN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHVub3JkZXJlZF9zZXQmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodW5vcmRlcmVkX3NldCYgX194KQorICAgICAgeworCV9CYXNlOjpzd2FwKF9feCk7CisJX1NhZmVfYmFzZTo6X01fc3dhcChfX3gpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIG5vZXhjZXB0CisgICAgICB7CisJX0Jhc2U6OmNsZWFyKCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IgCisgICAgICBiZWdpbigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgLy8gbG9jYWwgdmVyc2lvbnMKKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19iKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gbG9jYWxfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKF9fYiksIF9fYiwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBlbmQoc2l6ZV90eXBlIF9fYikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfYnVja2V0X2luZGV4KF9fYik7CisJcmV0dXJuIGxvY2FsX2l0ZXJhdG9yKF9CYXNlOjplbmQoX19iKSwgX19iLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGJlZ2luKHNpemVfdHlwZSBfX2IpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oX19iKSwgX19iLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGVuZChzaXplX3R5cGUgX19iKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoX0Jhc2U6OmVuZChfX2IpLCBfX2IsIHRoaXMpOworICAgICAgfQorCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgY2JlZ2luKHNpemVfdHlwZSBfX2IpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcihfQmFzZTo6Y2JlZ2luKF9fYiksIF9fYiwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBjZW5kKHNpemVfdHlwZSBfX2IpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcihfQmFzZTo6Y2VuZChfX2IpLCBfX2IsIHRoaXMpOworICAgICAgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9zaXplKHNpemVfdHlwZSBfX2IpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBfQmFzZTo6YnVja2V0X3NpemUoX19iKTsKKyAgICAgIH0KKworICAgICAgZmxvYXQKKyAgICAgIG1heF9sb2FkX2ZhY3RvcigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfQmFzZTo6bWF4X2xvYWRfZmFjdG9yKCk7IH0KKworICAgICAgdm9pZAorICAgICAgbWF4X2xvYWRfZmFjdG9yKGZsb2F0IF9fZikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbWF4X2xvYWRfZmFjdG9yKF9fZik7CisJX0Jhc2U6Om1heF9sb2FkX2ZhY3RvcihfX2YpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisJZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwkgIHN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgYm9vbD4gX19yZXMKKwkgICAgPSBfQmFzZTo6ZW1wbGFjZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCSAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwgX19yZXMuc2Vjb25kKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgX19nbGliY3h4X2NoZWNrX2luc2VydChfX2hpbnQpOworCSAgc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJICBfQmFzZV9pdGVyYXRvciBfX2l0ID0gX0Jhc2U6OmVtcGxhY2VfaGludChfX2hpbnQuYmFzZSgpLAorCQkJCQlzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9faXQsIHRoaXMpOworCX0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeworCXNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCXR5cGVkZWYgc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBib29sPiBfX3BhaXJfdHlwZTsKKwkgIF9fcGFpcl90eXBlIF9fcmVzID0gX0Jhc2U6Omluc2VydChfX29iaik7CisJX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksIF9fcmVzLnNlY29uZCk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19oaW50LCBjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9faGludCk7CisJc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJX0Jhc2VfaXRlcmF0b3IgX19pdCA9IF9CYXNlOjppbnNlcnQoX19oaW50LmJhc2UoKSwgX19vYmopOworCV9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwlyZXR1cm4gaXRlcmF0b3IoX19pdCwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydCh2YWx1ZV90eXBlJiYgX19vYmopCisgICAgICB7CisJc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJdHlwZWRlZiBzdGQ6OnBhaXI8dHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yLCBib29sPiBfX3BhaXJfdHlwZTsKKwkgIF9fcGFpcl90eXBlIF9fcmVzID0gX0Jhc2U6Omluc2VydChzdGQ6Om1vdmUoX19vYmopKTsKKwlfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwgX19yZXMuc2Vjb25kKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2hpbnQsIHZhbHVlX3R5cGUmJiBfX29iaikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9faGludCk7CisJc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJX0Jhc2VfaXRlcmF0b3IgX19pdCA9IF9CYXNlOjppbnNlcnQoX19oaW50LmJhc2UoKSwgc3RkOjptb3ZlKF9fb2JqKSk7CisJX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCXJldHVybiBpdGVyYXRvcihfX2l0LCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJX0Jhc2U6Omluc2VydChfX2wpOworCV9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJdm9pZAorCWluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisJeworCSAgX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJICBzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwkgIF9CYXNlOjppbnNlcnQoX19nbnVfZGVidWc6Ol9fYmFzZShfX2ZpcnN0KSwKKwkJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSk7CisJICBfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisJfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZmluZChfX2tleSksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpmaW5kKF9fa2V5KSwgdGhpcyk7IH0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsKKwl0eXBlZGVmIHN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgX0Jhc2VfaXRlcmF0b3I+IF9fcGFpcl90eXBlOworCV9fcGFpcl90eXBlIF9fcmVzID0gX0Jhc2U6OmVxdWFsX3JhbmdlKF9fa2V5KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLAorCQkJICAgICAgaXRlcmF0b3IoX19yZXMuc2Vjb25kLCB0aGlzKSk7CisgICAgICB9CisKKyAgICAgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2NvbnN0X2l0ZXJhdG9yLCBfQmFzZV9jb25zdF9pdGVyYXRvcj4KKwkgIF9fcmVzID0gX0Jhc2U6OmVxdWFsX3JhbmdlKF9fa2V5KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoY29uc3RfaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLAorCQkJICAgICAgY29uc3RfaXRlcmF0b3IoX19yZXMuc2Vjb25kLCB0aGlzKSk7CisgICAgICB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeworCXNpemVfdHlwZSBfX3JldCgwKTsKKwlfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbShfQmFzZTo6ZmluZChfX2tleSkpOworCWlmIChfX3ZpY3RpbSAhPSBfQmFzZTo6ZW5kKCkpCisJICB7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoCisJCQkgICAgW19fdmljdGltXShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCQkJICAgIHsgcmV0dXJuIF9faXQgPT0gX192aWN0aW07IH0pOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2xvY2FsX2lmKAorCQkJICAgIFtfX3ZpY3RpbV0oX0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3IgX19pdCkKKwkJCSAgICB7IHJldHVybiBfX2l0Ll9NX2N1ciA9PSBfX3ZpY3RpbS5fTV9jdXI7IH0pOworCSAgICBzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwkgICAgX0Jhc2U6OmVyYXNlKF9fdmljdGltKTsKKwkgICAgX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCSAgICBfX3JldCA9IDE7CisJICB9CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19pdCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2UoX19pdCk7CisJX0Jhc2VfY29uc3RfaXRlcmF0b3IgX192aWN0aW0gPSBfX2l0LmJhc2UoKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKAorCQkJW19fdmljdGltXShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCQkJeyByZXR1cm4gX19pdCA9PSBfX3ZpY3RpbTsgfSk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9sb2NhbF9pZigKKwkJCVtfX3ZpY3RpbV0oX0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3IgX19pdCkKKwkJCXsgcmV0dXJuIF9faXQuX01fY3VyID09IF9fdmljdGltLl9NX2N1cjsgfSk7CisJc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJX0Jhc2VfaXRlcmF0b3IgX19uZXh0ID0gX0Jhc2U6OmVyYXNlKF9faXQuYmFzZSgpKTsKKwlfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisJcmV0dXJuIGl0ZXJhdG9yKF9fbmV4dCwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX2l0KQorICAgICAgeyByZXR1cm4gZXJhc2UoY29uc3RfaXRlcmF0b3IoX19pdCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJZm9yIChfQmFzZV9jb25zdF9pdGVyYXRvciBfX3RtcCA9IF9fZmlyc3QuYmFzZSgpOworCSAgICAgX190bXAgIT0gX19sYXN0LmJhc2UoKTsgKytfX3RtcCkKKwkgIHsKKwkgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fdG1wICE9IF9CYXNlOjplbmQoKSwKKwkJCQkgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fZmlyc3QsICJmaXJzdCIpCisJCQkJICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZigKKwkJCSAgICBbX190bXBdKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJCQkgICAgeyByZXR1cm4gX19pdCA9PSBfX3RtcDsgfSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfbG9jYWxfaWYoCisJCQkgICAgW19fdG1wXShfQmFzZV9jb25zdF9sb2NhbF9pdGVyYXRvciBfX2l0KQorCQkJICAgIHsgcmV0dXJuIF9faXQuX01fY3VyID09IF9fdG1wLl9NX2N1cjsgfSk7CisJICB9CisJc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJX0Jhc2VfaXRlcmF0b3IgX19uZXh0ID0gX0Jhc2U6OmVyYXNlKF9fZmlyc3QuYmFzZSgpLAorCQkJCQkgICAgIF9fbGFzdC5iYXNlKCkpOworCV9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwlyZXR1cm4gaXRlcmF0b3IoX19uZXh0LCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgbm9leGNlcHQgICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3QgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gKnRoaXM7IH0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9pbnZhbGlkYXRlX2xvY2FscygpCisgICAgICB7CisJX0Jhc2VfbG9jYWxfaXRlcmF0b3IgX19sb2NhbF9lbmQgPSBfQmFzZTo6ZW5kKDApOworCXRoaXMtPl9NX2ludmFsaWRhdGVfbG9jYWxfaWYoCisJCQlbX19sb2NhbF9lbmRdKF9CYXNlX2NvbnN0X2xvY2FsX2l0ZXJhdG9yIF9faXQpCisJCQl7IHJldHVybiBfX2l0ICE9IF9fbG9jYWxfZW5kOyB9KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01faW52YWxpZGF0ZV9hbGwoKQorICAgICAgeworCV9CYXNlX2l0ZXJhdG9yIF9fZW5kID0gX0Jhc2U6OmVuZCgpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoCisJCQlbX19lbmRdKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJCQl7IHJldHVybiBfX2l0ICE9IF9fZW5kOyB9KTsKKwlfTV9pbnZhbGlkYXRlX2xvY2FscygpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9jaGVja19yZWhhc2hlZChzaXplX3R5cGUgX19wcmV2X2NvdW50KQorICAgICAgeworCWlmIChfX3ByZXZfY291bnQgIT0gdGhpcy0+YnVja2V0X2NvdW50KCkpCisJICBfTV9pbnZhbGlkYXRlX2xvY2FscygpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2Jhc2UoKSA9PSBfX3kuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisKKyAgLy8vIENsYXNzIHN0ZDo6dW5vcmRlcmVkX211bHRpc2V0IHdpdGggc2FmZXR5L2NoZWNraW5nL2RlYnVnIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9IYXNoID0gc3RkOjpoYXNoPF9WYWx1ZT4sCisJICAgdHlwZW5hbWUgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9WYWx1ZT4sCisJICAgdHlwZW5hbWUgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8X1ZhbHVlPiA+CisgICAgY2xhc3MgdW5vcmRlcmVkX211bHRpc2V0CisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6OnVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiwKKyAgICAgIHB1YmxpYyBfX2dudV9kZWJ1Zzo6X1NhZmVfdW5vcmRlcmVkX2NvbnRhaW5lcjwKKwkJdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX1NURF9DOjp1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwKKwkJCQkJCSBfUHJlZCwgX0FsbG9jPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX3Vub3JkZXJlZF9jb250YWluZXI8dW5vcmRlcmVkX211bHRpc2V0PgorCQlfU2FmZV9iYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgX0Jhc2VfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2xvY2FsX2l0ZXJhdG9yIF9CYXNlX2NvbnN0X2xvY2FsX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6bG9jYWxfaXRlcmF0b3IgX0Jhc2VfbG9jYWxfaXRlcmF0b3I7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aGFzaGVyICAgICAgICAgIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV9lcXVhbCAgICAgICBrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV90eXBlICAgICAgICBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgICAgICB2YWx1ZV90eXBlOworCisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjxfQmFzZV9pdGVyYXRvciwKKwkJCQkJICB1bm9yZGVyZWRfbXVsdGlzZXQ+IGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfY29uc3RfaXRlcmF0b3IsCisJCQkJCSAgdW5vcmRlcmVkX211bHRpc2V0PiBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2xvY2FsX2l0ZXJhdG9yPAorCV9CYXNlX2xvY2FsX2l0ZXJhdG9yLCB1bm9yZGVyZWRfbXVsdGlzZXQ+IGxvY2FsX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfbG9jYWxfaXRlcmF0b3I8CisJX0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3IsIHVub3JkZXJlZF9tdWx0aXNldD4gY29uc3RfbG9jYWxfaXRlcmF0b3I7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkJIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHVub3JkZXJlZF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIAorCQkJICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCQkgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwgCisJCQkgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksIAorCQkJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZ251X2RlYnVnOjpfX2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsCisJCQkJCQkJCSAgICAgX19sYXN0KSksCisJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSwgX19uLAorCQlfX2hmLCBfX2VxbCwgX19hKSB7IH0KKworICAgICAgdW5vcmRlcmVkX211bHRpc2V0KGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldCYgX194KSA9IGRlZmF1bHQ7CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldChjb25zdCBfQmFzZSYgX194KSAKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworICAgICAgdW5vcmRlcmVkX211bHRpc2V0KHVub3JkZXJlZF9tdWx0aXNldCYmIF9feCkgPSBkZWZhdWx0OworCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJCQkgc2l6ZV90eXBlIF9fbiA9IDAsCisJCQkgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkgeyB9CisKKyAgICAgIH51bm9yZGVyZWRfbXVsdGlzZXQoKSBub2V4Y2VwdCB7IH0KKworICAgICAgdW5vcmRlcmVkX211bHRpc2V0JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldCYgX194KQorICAgICAgeworCSpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX194OworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQmCisgICAgICBvcGVyYXRvcj0odW5vcmRlcmVkX211bHRpc2V0JiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorICAgICAgICAvLyBOQjogRFIgNjc1LgorCV9fZ2xpYmN4eF9jaGVja19zZWxmX21vdmVfYXNzaWduKF9feCk7CisJY2xlYXIoKTsKKwlzd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodW5vcmRlcmVkX211bHRpc2V0JiBfX3gpCisgICAgICB7CisJX0Jhc2U6OnN3YXAoX194KTsKKwlfU2FmZV9iYXNlOjpfTV9zd2FwKF9feCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgbm9leGNlcHQKKyAgICAgIHsKKwlfQmFzZTo6Y2xlYXIoKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIC8vIGxvY2FsIHZlcnNpb25zCisgICAgICBsb2NhbF9pdGVyYXRvcgorICAgICAgYmVnaW4oc2l6ZV90eXBlIF9fYikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfYnVja2V0X2luZGV4KF9fYik7CisJcmV0dXJuIGxvY2FsX2l0ZXJhdG9yKF9CYXNlOjpiZWdpbihfX2IpLCBfX2IsIHRoaXMpOworICAgICAgfQorCisgICAgICBsb2NhbF9pdGVyYXRvcgorICAgICAgZW5kKHNpemVfdHlwZSBfX2IpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2J1Y2tldF9pbmRleChfX2IpOworCXJldHVybiBsb2NhbF9pdGVyYXRvcihfQmFzZTo6ZW5kKF9fYiksIF9fYiwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19iKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKF9fYiksIF9fYiwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBlbmQoc2l6ZV90eXBlIF9fYikgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfYnVja2V0X2luZGV4KF9fYik7CisJcmV0dXJuIGNvbnN0X2xvY2FsX2l0ZXJhdG9yKF9CYXNlOjplbmQoX19iKSwgX19iLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGNiZWdpbihzaXplX3R5cGUgX19iKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoX0Jhc2U6OmNiZWdpbihfX2IpLCBfX2IsIHRoaXMpOworICAgICAgfQorCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgY2VuZChzaXplX3R5cGUgX19iKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoX0Jhc2U6OmNlbmQoX19iKSwgX19iLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfc2l6ZShzaXplX3R5cGUgX19iKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19idWNrZXRfaW5kZXgoX19iKTsKKwlyZXR1cm4gX0Jhc2U6OmJ1Y2tldF9zaXplKF9fYik7CisgICAgICB9CisKKyAgICAgIGZsb2F0CisgICAgICBtYXhfbG9hZF9mYWN0b3IoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX0Jhc2U6Om1heF9sb2FkX2ZhY3RvcigpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIG1heF9sb2FkX2ZhY3RvcihmbG9hdCBfX2YpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX21heF9sb2FkX2ZhY3RvcihfX2YpOworCV9CYXNlOjptYXhfbG9hZF9mYWN0b3IoX19mKTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIHNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCSAgX0Jhc2VfaXRlcmF0b3IgX19pdAorCSAgICA9IF9CYXNlOjplbXBsYWNlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICBfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisJICByZXR1cm4gaXRlcmF0b3IoX19pdCwgdGhpcyk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX2hpbnQsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19oaW50KTsKKwkgIHNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCSAgX0Jhc2VfaXRlcmF0b3IgX19pdCA9IF9CYXNlOjplbXBsYWNlX2hpbnQoX19oaW50LmJhc2UoKSwKKwkJCQkJc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIF9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwkgIHJldHVybiBpdGVyYXRvcihfX2l0LCB0aGlzKTsKKwl9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7CisJc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJX0Jhc2VfaXRlcmF0b3IgX19pdCA9IF9CYXNlOjppbnNlcnQoX19vYmopOworCV9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwlyZXR1cm4gaXRlcmF0b3IoX19pdCwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19oaW50LCBjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9faGludCk7CisJc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJX0Jhc2VfaXRlcmF0b3IgX19pdCA9IF9CYXNlOjppbnNlcnQoX19oaW50LmJhc2UoKSwgX19vYmopOyAKKwlfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisJcmV0dXJuIGl0ZXJhdG9yKF9faXQsIHRoaXMpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX29iaikKKyAgICAgIHsKKwlzaXplX3R5cGUgX19idWNrZXRfY291bnQgPSB0aGlzLT5idWNrZXRfY291bnQoKTsKKwlfQmFzZV9pdGVyYXRvciBfX2l0ID0gX0Jhc2U6Omluc2VydChzdGQ6Om1vdmUoX19vYmopKTsgCisJX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCXJldHVybiBpdGVyYXRvcihfX2l0LCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2hpbnQsIHZhbHVlX3R5cGUmJiBfX29iaikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9faGludCk7CisJc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJX0Jhc2VfaXRlcmF0b3IgX19pdCA9IF9CYXNlOjppbnNlcnQoX19oaW50LmJhc2UoKSwgc3RkOjptb3ZlKF9fb2JqKSk7IAorCV9NX2NoZWNrX3JlaGFzaGVkKF9fYnVja2V0X2NvdW50KTsKKwlyZXR1cm4gaXRlcmF0b3IoX19pdCwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXNpemVfdHlwZSBfX2J1Y2tldF9jb3VudCA9IHRoaXMtPmJ1Y2tldF9jb3VudCgpOworCV9CYXNlOjppbnNlcnQoX19sKTsKKwlfTV9jaGVja19yZWhhc2hlZChfX2J1Y2tldF9jb3VudCk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXZvaWQKKwlpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorCXsKKwkgIF9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgc2l6ZV90eXBlIF9fYnVja2V0X2NvdW50ID0gdGhpcy0+YnVja2V0X2NvdW50KCk7CisJICBfQmFzZTo6aW5zZXJ0KF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCkpOworCSAgX01fY2hlY2tfcmVoYXNoZWQoX19idWNrZXRfY291bnQpOworCX0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX19rZXkpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZmluZChfX2tleSksIHRoaXMpOyB9CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7CisJdHlwZWRlZiBzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3BhaXJfdHlwZTsKKwlfX3BhaXJfdHlwZSBfX3JlcyA9IF9CYXNlOjplcXVhbF9yYW5nZShfX2tleSk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGl0ZXJhdG9yKF9fcmVzLnNlY29uZCwgdGhpcykpOworICAgICAgfQorCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeworCXN0ZDo6cGFpcjxfQmFzZV9jb25zdF9pdGVyYXRvciwgX0Jhc2VfY29uc3RfaXRlcmF0b3I+CisJICBfX3JlcyA9IF9CYXNlOjplcXVhbF9yYW5nZShfX2tleSk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGNvbnN0X2l0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGNvbnN0X2l0ZXJhdG9yKF9fcmVzLnNlY29uZCwgdGhpcykpOworICAgICAgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsKKwlzaXplX3R5cGUgX19yZXQoMCk7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX19wYWlyID0KKwkgIF9CYXNlOjplcXVhbF9yYW5nZShfX2tleSk7CisJZm9yIChfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9fcGFpci5maXJzdDsgX192aWN0aW0gIT0gX19wYWlyLnNlY29uZDspCisJICB7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoW19fdmljdGltXShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCQkJICAgIHsgcmV0dXJuIF9faXQgPT0gX192aWN0aW07IH0pOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2xvY2FsX2lmKAorCQkJICAgIFtfX3ZpY3RpbV0oX0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3IgX19pdCkKKwkJCSAgICB7IHJldHVybiBfX2l0Ll9NX2N1ciA9PSBfX3ZpY3RpbS5fTV9jdXI7IH0pOworCSAgICBfQmFzZTo6ZXJhc2UoX192aWN0aW0rKyk7CisJICAgICsrX19yZXQ7CisJICB9CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19pdCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2UoX19pdCk7CisJX0Jhc2VfY29uc3RfaXRlcmF0b3IgX192aWN0aW0gPSBfX2l0LmJhc2UoKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKFtfX3ZpY3RpbV0oX0Jhc2VfY29uc3RfaXRlcmF0b3IgX19pdCkKKwkJCXsgcmV0dXJuIF9faXQgPT0gX192aWN0aW07IH0pOworCXRoaXMtPl9NX2ludmFsaWRhdGVfbG9jYWxfaWYoCisJCQlbX192aWN0aW1dKF9CYXNlX2NvbnN0X2xvY2FsX2l0ZXJhdG9yIF9faXQpCisJCQl7IHJldHVybiBfX2l0Ll9NX2N1ciA9PSBfX3ZpY3RpbS5fTV9jdXI7IH0pOworCXJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19pdC5iYXNlKCkpLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9faXQpCisgICAgICB7IHJldHVybiBlcmFzZShjb25zdF9pdGVyYXRvcihfX2l0KSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwlmb3IgKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9fdG1wID0gX19maXJzdC5iYXNlKCk7CisJICAgICBfX3RtcCAhPSBfX2xhc3QuYmFzZSgpOyArK19fdG1wKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX190bXAgIT0gX0Jhc2U6OmVuZCgpLAorCQkJCSAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UpCisJCQkJICAuX01faXRlcmF0b3IoX19maXJzdCwgImZpcnN0IikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKFtfX3RtcF0oX0Jhc2VfY29uc3RfaXRlcmF0b3IgX19pdCkKKwkJCSAgICB7IHJldHVybiBfX2l0ID09IF9fdG1wOyB9KTsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9sb2NhbF9pZigKKwkJCSAgICBbX190bXBdKF9CYXNlX2NvbnN0X2xvY2FsX2l0ZXJhdG9yIF9faXQpCisJCQkgICAgeyByZXR1cm4gX19pdC5fTV9jdXIgPT0gX190bXAuX01fY3VyOyB9KTsKKwkgIH0KKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fZmlyc3QuYmFzZSgpLAorCQkJCSAgICAgX19sYXN0LmJhc2UoKSksIHRoaXMpOworICAgICAgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBub2V4Y2VwdCAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiAqdGhpczsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2ludmFsaWRhdGVfbG9jYWxzKCkKKyAgICAgIHsKKwlfQmFzZV9sb2NhbF9pdGVyYXRvciBfX2xvY2FsX2VuZCA9IF9CYXNlOjplbmQoMCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9sb2NhbF9pZigKKwkJCVtfX2xvY2FsX2VuZF0oX0Jhc2VfY29uc3RfbG9jYWxfaXRlcmF0b3IgX19pdCkKKwkJCXsgcmV0dXJuIF9faXQgIT0gX19sb2NhbF9lbmQ7IH0pOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9pbnZhbGlkYXRlX2FsbCgpCisgICAgICB7CisJX0Jhc2VfaXRlcmF0b3IgX19lbmQgPSBfQmFzZTo6ZW5kKCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihbX19lbmRdKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJCQl7IHJldHVybiBfX2l0ICE9IF9fZW5kOyB9KTsKKwlfTV9pbnZhbGlkYXRlX2xvY2FscygpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9jaGVja19yZWhhc2hlZChzaXplX3R5cGUgX19wcmV2X2NvdW50KQorICAgICAgeworCWlmIChfX3ByZXZfY291bnQgIT0gdGhpcy0+YnVja2V0X2NvdW50KCkpCisJICBfTV9pbnZhbGlkYXRlX2xvY2FscygpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJIHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9QcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fYmFzZSgpID09IF9feS5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX2RlYnVnCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8vIEMrKzExCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy92ZWN0b3IgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlYnVnL3ZlY3RvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDczNjg2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWJ1Zy92ZWN0b3IKQEAgLTAsMCArMSw2NTUgQEAKKy8vIERlYnVnZ2luZyB2ZWN0b3IgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL3ZlY3RvcgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfVkVDVE9SCisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX1ZFQ1RPUiAxCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX3NlcXVlbmNlLmg+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9pdGVyYXRvci5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX2RlYnVnCit7CisgIC8vLyBDbGFzcyBzdGQ6OnZlY3RvciB3aXRoIHNhZmV0eS9jaGVja2luZy9kZWJ1ZyBpbnN0cnVtZW50YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8X1RwPiA+CisgICAgY2xhc3MgdmVjdG9yCisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6OnZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+LAorICAgICAgcHVibGljIF9fZ251X2RlYnVnOjpfU2FmZV9zZXF1ZW5jZTx2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQzo6dmVjdG9yPF9UcCwgX0FsbG9jYXRvcj4gX0Jhc2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgX0Jhc2VfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfRXF1YWxfdG88X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9FcXVhbDsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX2FsbG9jX3RyYWl0czxfQWxsb2NhdG9yPiAgX0FsbG9jX3RyYWl0czsKKyNlbmRpZgorCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2l0ZXJhdG9yLHZlY3Rvcj4KKyAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfY29uc3RfaXRlcmF0b3IsdmVjdG9yPgorICAgICAgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgZGlmZmVyZW5jZV90eXBlOworCisgICAgICB0eXBlZGVmIF9UcAkJCQkgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jYXRvcgkJCSAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnBvaW50ZXIgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICAvLyAyMy4yLjQuMSBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgZXhwbGljaXQKKyAgICAgIHZlY3Rvcihjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fYSksIF9NX2d1YXJhbnRlZWRfY2FwYWNpdHkoMCkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBleHBsaWNpdAorICAgICAgdmVjdG9yKHNpemVfdHlwZSBfX24sIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2EpLCBfTV9ndWFyYW50ZWVkX2NhcGFjaXR5KF9fbikgeyB9CisKKyAgICAgIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUsCisJICAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX192YWx1ZSwgX19hKSwgX01fZ3VhcmFudGVlZF9jYXBhY2l0eShfX24pIHsgfQorI2Vsc2UKKyAgICAgIGV4cGxpY2l0CisgICAgICB2ZWN0b3Ioc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbHVlID0gX1RwKCksCisJICAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX192YWx1ZSwgX19hKSwgX01fZ3VhcmFudGVlZF9jYXBhY2l0eShfX24pIHsgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyNlbmRpZgorICAgICAgICB2ZWN0b3IoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICAgIDogX0Jhc2UoX19nbnVfZGVidWc6Ol9fYmFzZShfX2dudV9kZWJ1Zzo6X19jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LAorCQkJCQkJCQkgICAgIF9fbGFzdCkpLAorCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCksIF9fYSksCisJICBfTV9ndWFyYW50ZWVkX2NhcGFjaXR5KDApCisgICAgICAgIHsgX01fdXBkYXRlX2d1YXJhbnRlZWRfY2FwYWNpdHkoKTsgfQorCisgICAgICB2ZWN0b3IoY29uc3QgdmVjdG9yJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCksIF9NX2d1YXJhbnRlZWRfY2FwYWNpdHkoX194LnNpemUoKSkgeyB9CisKKyAgICAgIC8vLyBDb25zdHJ1Y3Rpb24gZnJvbSBhIHJlbGVhc2UtbW9kZSB2ZWN0b3IKKyAgICAgIHZlY3Rvcihjb25zdCBfQmFzZSYgX194KQorICAgICAgOiBfQmFzZShfX3gpLCBfTV9ndWFyYW50ZWVkX2NhcGFjaXR5KF9feC5zaXplKCkpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdmVjdG9yKHZlY3RvciYmIF9feCkgbm9leGNlcHQKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpLAorCV9NX2d1YXJhbnRlZWRfY2FwYWNpdHkodGhpcy0+c2l6ZSgpKQorICAgICAgeworCXRoaXMtPl9NX3N3YXAoX194KTsKKwlfX3guX01fZ3VhcmFudGVlZF9jYXBhY2l0eSA9IDA7CisgICAgICB9CisKKyAgICAgIHZlY3Rvcihjb25zdCB2ZWN0b3ImIF9feCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogX0Jhc2UoX194LCBfX2EpLCBfTV9ndWFyYW50ZWVkX2NhcGFjaXR5KF9feC5zaXplKCkpIHsgfQorCisgICAgICB2ZWN0b3IodmVjdG9yJiYgX194LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSwgX19hKSwKKyAgICAgICAgX01fZ3VhcmFudGVlZF9jYXBhY2l0eSh0aGlzLT5zaXplKCkpCisgICAgICB7CisJX194Ll9NX2ludmFsaWRhdGVfYWxsKCk7CisJX194Ll9NX2d1YXJhbnRlZWRfY2FwYWNpdHkgPSAwOworICAgICAgfQorCisgICAgICB2ZWN0b3IoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLCBfX2EpLAorCV9NX2d1YXJhbnRlZWRfY2FwYWNpdHkoX19sLnNpemUoKSkgeyB9CisjZW5kaWYKKworICAgICAgfnZlY3RvcigpIF9HTElCQ1hYX05PRVhDRVBUIHsgfQorCisgICAgICB2ZWN0b3ImCisgICAgICBvcGVyYXRvcj0oY29uc3QgdmVjdG9yJiBfX3gpCisgICAgICB7CisJc3RhdGljX2Nhc3Q8X0Jhc2UmPigqdGhpcykgPSBfX3g7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlfTV91cGRhdGVfZ3VhcmFudGVlZF9jYXBhY2l0eSgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZlY3RvciYKKyAgICAgIG9wZXJhdG9yPSh2ZWN0b3ImJiBfX3gpIG5vZXhjZXB0KF9BbGxvY190cmFpdHM6Ol9TX25vdGhyb3dfbW92ZSgpKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19zZWxmX21vdmVfYXNzaWduKF9feCk7CisJX0Jhc2U6Om9wZXJhdG9yPShzdGQ6Om1vdmUoX194KSk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlfTV91cGRhdGVfZ3VhcmFudGVlZF9jYXBhY2l0eSgpOworCV9feC5fTV9pbnZhbGlkYXRlX2FsbCgpOworCV9feC5fTV9ndWFyYW50ZWVkX2NhcGFjaXR5ID0gMDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHZlY3RvciYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfQmFzZSY+KCp0aGlzKSA9IF9fbDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCV9NX3VwZGF0ZV9ndWFyYW50ZWVkX2NhcGFjaXR5KCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyNlbmRpZgorICAgICAgICB2b2lkCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgX0Jhc2U6OmFzc2lnbihfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZmlyc3QpLAorCQkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpKTsKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJICBfTV91cGRhdGVfZ3VhcmFudGVlZF9jYXBhY2l0eSgpOworCX0KKworICAgICAgdm9pZAorICAgICAgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX191KQorICAgICAgeworCV9CYXNlOjphc3NpZ24oX19uLCBfX3UpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJX01fdXBkYXRlX2d1YXJhbnRlZWRfY2FwYWNpdHkoKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIGFzc2lnbihpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwlfQmFzZTo6YXNzaWduKF9fbCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlfTV91cGRhdGVfZ3VhcmFudGVlZF9jYXBhY2l0eSgpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHVzaW5nIF9CYXNlOjpnZXRfYWxsb2NhdG9yOworCisgICAgICAvLyBpdGVyYXRvcnM6CisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisjZW5kaWYKKworICAgICAgLy8gMjMuMi40LjIgY2FwYWNpdHk6CisgICAgICB1c2luZyBfQmFzZTo6c2l6ZTsKKyAgICAgIHVzaW5nIF9CYXNlOjptYXhfc2l6ZTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeikKKyAgICAgIHsKKwlib29sIF9fcmVhbGxvYyA9IF9NX3JlcXVpcmVzX3JlYWxsb2NhdGlvbihfX3N6KTsKKwlpZiAoX19zeiA8IHRoaXMtPnNpemUoKSkKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWZ0ZXJfbnRoKF9fc3opOworCV9CYXNlOjpyZXNpemUoX19zeik7CisJaWYgKF9fcmVhbGxvYykKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJX01fdXBkYXRlX2d1YXJhbnRlZWRfY2FwYWNpdHkoKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6LCBjb25zdCBfVHAmIF9fYykKKyAgICAgIHsKKwlib29sIF9fcmVhbGxvYyA9IF9NX3JlcXVpcmVzX3JlYWxsb2NhdGlvbihfX3N6KTsKKwlpZiAoX19zeiA8IHRoaXMtPnNpemUoKSkKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWZ0ZXJfbnRoKF9fc3opOworCV9CYXNlOjpyZXNpemUoX19zeiwgX19jKTsKKwlpZiAoX19yZWFsbG9jKQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlfTV91cGRhdGVfZ3VhcmFudGVlZF9jYXBhY2l0eSgpOworICAgICAgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeiwgX1RwIF9fYyA9IF9UcCgpKQorICAgICAgeworCWJvb2wgX19yZWFsbG9jID0gX01fcmVxdWlyZXNfcmVhbGxvY2F0aW9uKF9fc3opOworCWlmIChfX3N6IDwgdGhpcy0+c2l6ZSgpKQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hZnRlcl9udGgoX19zeik7CisJX0Jhc2U6OnJlc2l6ZShfX3N6LCBfX2MpOworCWlmIChfX3JlYWxsb2MpCisJICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCV9NX3VwZGF0ZV9ndWFyYW50ZWVkX2NhcGFjaXR5KCk7CisgICAgICB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHNocmlua190b19maXQoKQorICAgICAgeworCWlmIChfQmFzZTo6X01fc2hyaW5rX3RvX2ZpdCgpKQorCSAgeworCSAgICBfTV9ndWFyYW50ZWVkX2NhcGFjaXR5ID0gX0Jhc2U6OmNhcGFjaXR5KCk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJICB9CisgICAgICB9CisjZW5kaWYKKworICAgICAgc2l6ZV90eXBlCisgICAgICBjYXBhY2l0eSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisjaWZkZWYgX0dMSUJDWFhfREVCVUdfUEVEQU5USUMKKwlyZXR1cm4gX01fZ3VhcmFudGVlZF9jYXBhY2l0eTsKKyNlbHNlCisJcmV0dXJuIF9CYXNlOjpjYXBhY2l0eSgpOworI2VuZGlmCisgICAgICB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjplbXB0eTsKKworICAgICAgdm9pZAorICAgICAgcmVzZXJ2ZShzaXplX3R5cGUgX19uKQorICAgICAgeworCWJvb2wgX19yZWFsbG9jID0gX01fcmVxdWlyZXNfcmVhbGxvY2F0aW9uKF9fbik7CisJX0Jhc2U6OnJlc2VydmUoX19uKTsKKwlpZiAoX19uID4gX01fZ3VhcmFudGVlZF9jYXBhY2l0eSkKKwkgIF9NX2d1YXJhbnRlZWRfY2FwYWNpdHkgPSBfX247CisJaWYgKF9fcmVhbGxvYykKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisKKyAgICAgIC8vIGVsZW1lbnQgYWNjZXNzOgorICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX3N1YnNjcmlwdChfX24pOworCXJldHVybiBfTV9iYXNlKClbX19uXTsKKyAgICAgIH0KKworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX3N1YnNjcmlwdChfX24pOworCXJldHVybiBfTV9iYXNlKClbX19uXTsKKyAgICAgIH0KKworICAgICAgdXNpbmcgX0Jhc2U6OmF0OworCisgICAgICByZWZlcmVuY2UKKyAgICAgIGZyb250KCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKTsKKwlyZXR1cm4gX0Jhc2U6OmZyb250KCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgZnJvbnQoKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXJldHVybiBfQmFzZTo6ZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBiYWNrKCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKTsKKwlyZXR1cm4gX0Jhc2U6OmJhY2soKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBiYWNrKCkgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKTsKKwlyZXR1cm4gX0Jhc2U6OmJhY2soKTsKKyAgICAgIH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgNDY0LiBTdWdnZXN0aW9uIGZvciBuZXcgbWVtYmVyIGZ1bmN0aW9ucyBpbiBzdGFuZGFyZCBjb250YWluZXJzLgorICAgICAgdXNpbmcgX0Jhc2U6OmRhdGE7CisKKyAgICAgIC8vIDIzLjIuNC4zIG1vZGlmaWVyczoKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfYmFjayhjb25zdCBfVHAmIF9feCkKKyAgICAgIHsKKwlib29sIF9fcmVhbGxvYyA9IF9NX3JlcXVpcmVzX3JlYWxsb2NhdGlvbih0aGlzLT5zaXplKCkgKyAxKTsKKwlfQmFzZTo6cHVzaF9iYWNrKF9feCk7CisJaWYgKF9fcmVhbGxvYykKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJX01fdXBkYXRlX2d1YXJhbnRlZWRfY2FwYWNpdHkoKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcCA9IF9UcD4KKyAgICAgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjwhc3RkOjpfX2FyZV9zYW1lPF9VcCwgYm9vbD46Ol9fdmFsdWUsCisJCQkJCXZvaWQ+OjpfX3R5cGUKKyAgICAgICAgcHVzaF9iYWNrKF9UcCYmIF9feCkKKwl7IGVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgZW1wbGFjZV9iYWNrKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIGJvb2wgX19yZWFsbG9jID0gX01fcmVxdWlyZXNfcmVhbGxvY2F0aW9uKHRoaXMtPnNpemUoKSArIDEpOworCSAgX0Jhc2U6OmVtcGxhY2VfYmFjayhzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgaWYgKF9fcmVhbGxvYykKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwkgIF9NX3VwZGF0ZV9ndWFyYW50ZWVkX2NhcGFjaXR5KCk7CisJfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIHBvcF9iYWNrKCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbCgtLV9CYXNlOjplbmQoKSkpOworCV9CYXNlOjpwb3BfYmFjaygpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGVtcGxhY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgX19nbGliY3h4X2NoZWNrX2luc2VydChfX3Bvc2l0aW9uKTsKKwkgIGJvb2wgX19yZWFsbG9jID0gX01fcmVxdWlyZXNfcmVhbGxvY2F0aW9uKHRoaXMtPnNpemUoKSArIDEpOworCSAgZGlmZmVyZW5jZV90eXBlIF9fb2Zmc2V0ID0gX19wb3NpdGlvbi5iYXNlKCkgLSBfQmFzZTo6YmVnaW4oKTsKKwkgIF9CYXNlX2l0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6OmVtcGxhY2UoX19wb3NpdGlvbi5iYXNlKCksCisJCQkJCQlzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgaWYgKF9fcmVhbGxvYykKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwkgIGVsc2UKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hZnRlcl9udGgoX19vZmZzZXQpOworCSAgX01fdXBkYXRlX2d1YXJhbnRlZWRfY2FwYWNpdHkoKTsKKwkgIHJldHVybiBpdGVyYXRvcihfX3JlcywgdGhpcyk7CisJfQorI2VuZGlmCisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgX1RwJiBfX3gpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2luc2VydChfX3Bvc2l0aW9uKTsKKwlib29sIF9fcmVhbGxvYyA9IF9NX3JlcXVpcmVzX3JlYWxsb2NhdGlvbih0aGlzLT5zaXplKCkgKyAxKTsKKwlkaWZmZXJlbmNlX3R5cGUgX19vZmZzZXQgPSBfX3Bvc2l0aW9uLmJhc2UoKSAtIF9CYXNlOjpiZWdpbigpOworCV9CYXNlX2l0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLmJhc2UoKSwgX194KTsKKwlpZiAoX19yZWFsbG9jKQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwllbHNlCisJICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FmdGVyX250aChfX29mZnNldCk7CisJX01fdXBkYXRlX2d1YXJhbnRlZWRfY2FwYWNpdHkoKTsKKwlyZXR1cm4gaXRlcmF0b3IoX19yZXMsIHRoaXMpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwID0gX1RwPgorICAgICAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPCFzdGQ6Ol9fYXJlX3NhbWU8X1VwLCBib29sPjo6X192YWx1ZSwKKwkJCQkJaXRlcmF0b3I+OjpfX3R5cGUKKyAgICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9UcCYmIF9feCkKKyAgICAgICAgeyByZXR1cm4gZW1wbGFjZShfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyB0aGlzLT5pbnNlcnQoX19wb3NpdGlvbiwgX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3gpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2luc2VydChfX3Bvc2l0aW9uKTsKKwlib29sIF9fcmVhbGxvYyA9IF9NX3JlcXVpcmVzX3JlYWxsb2NhdGlvbih0aGlzLT5zaXplKCkgKyBfX24pOworCWRpZmZlcmVuY2VfdHlwZSBfX29mZnNldCA9IF9fcG9zaXRpb24uYmFzZSgpIC0gX0Jhc2U6OmJlZ2luKCk7CisJX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLmJhc2UoKSwgX19uLCBfX3gpOworCWlmIChfX3JlYWxsb2MpCisJICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCWVsc2UKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWZ0ZXJfbnRoKF9fb2Zmc2V0KTsKKwlfTV91cGRhdGVfZ3VhcmFudGVlZF9jYXBhY2l0eSgpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisjZWxzZQorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisjZW5kaWYKKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwKKwkgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0X3JhbmdlKF9fcG9zaXRpb24sIF9fZmlyc3QsIF9fbGFzdCk7CisKKwkgIC8qIEhhcmQgdG8gZ3Vlc3MgaWYgaW52YWxpZGF0aW9uIHdpbGwgb2NjdXIsIGJlY2F1c2UgX19sYXN0CisJICAgICAtIF9fZmlyc3QgY2FuJ3QgYmUgY2FsY3VsYXRlZCBpbiBhbGwgY2FzZXMsIHNvIHdlIGp1c3QKKwkgICAgIHB1bnQgaGVyZSBieSBjaGVja2luZyBpZiBpdCBkaWQgb2NjdXIuICovCisJICBfQmFzZV9pdGVyYXRvciBfX29sZF9iZWdpbiA9IF9NX2Jhc2UoKS5iZWdpbigpOworCSAgZGlmZmVyZW5jZV90eXBlIF9fb2Zmc2V0ID0gX19wb3NpdGlvbi5iYXNlKCkgLSBfQmFzZTo6YmVnaW4oKTsKKwkgIF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCQkJCSAgIF9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSk7CisKKwkgIGlmIChfTV9iYXNlKCkuYmVnaW4oKSAhPSBfX29sZF9iZWdpbikKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwkgIGVsc2UKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hZnRlcl9udGgoX19vZmZzZXQpOworCSAgX01fdXBkYXRlX2d1YXJhbnRlZWRfY2FwYWNpdHkoKTsKKwl9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZShfX3Bvc2l0aW9uKTsKKwlkaWZmZXJlbmNlX3R5cGUgX19vZmZzZXQgPSBfX3Bvc2l0aW9uLmJhc2UoKSAtIF9CYXNlOjpiZWdpbigpOworCV9CYXNlX2l0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24uYmFzZSgpKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FmdGVyX250aChfX29mZnNldCk7CisJcmV0dXJuIGl0ZXJhdG9yKF9fcmVzLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMTUxLiBjYW4ndCBjdXJyZW50bHkgY2xlYXIoKSBlbXB0eSBjb250YWluZXIKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworCWlmIChfX2ZpcnN0LmJhc2UoKSAhPSBfX2xhc3QuYmFzZSgpKQorCSAgeworCSAgICBkaWZmZXJlbmNlX3R5cGUgX19vZmZzZXQgPSBfX2ZpcnN0LmJhc2UoKSAtIF9CYXNlOjpiZWdpbigpOworCSAgICBfQmFzZV9pdGVyYXRvciBfX3JlcyA9IF9CYXNlOjplcmFzZShfX2ZpcnN0LmJhc2UoKSwKKwkJCQkJCV9fbGFzdC5iYXNlKCkpOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FmdGVyX250aChfX29mZnNldCk7CisJICAgIHJldHVybiBpdGVyYXRvcihfX3JlcywgdGhpcyk7CisJICB9CisJZWxzZQorCSAgcmV0dXJuIF9fZmlyc3Q7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodmVjdG9yJiBfX3gpCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCQkJbm9leGNlcHQoX0FsbG9jX3RyYWl0czo6X1Nfbm90aHJvd19zd2FwKCkpCisjZW5kaWYKKyAgICAgIHsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisJaWYgKCFfQWxsb2NfdHJhaXRzOjpfU19wcm9wYWdhdGVfb25fc3dhcCgpKQorCSAgX19nbGliY3h4X2NoZWNrX2VxdWFsX2FsbG9jcyhfX3gpOworI2VuZGlmCisJX0Jhc2U6OnN3YXAoX194KTsKKwl0aGlzLT5fTV9zd2FwKF9feCk7CisgICAgICAgIHN0ZDo6c3dhcChfTV9ndWFyYW50ZWVkX2NhcGFjaXR5LCBfX3guX01fZ3VhcmFudGVlZF9jYXBhY2l0eSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlfQmFzZTo6Y2xlYXIoKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgICBfTV9ndWFyYW50ZWVkX2NhcGFjaXR5ID0gMDsKKyAgICAgIH0KKworICAgICAgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgX0dMSUJDWFhfTk9FWENFUFQgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3QgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQgeyByZXR1cm4gKnRoaXM7IH0KKworICAgIHByaXZhdGU6CisgICAgICBzaXplX3R5cGUgX01fZ3VhcmFudGVlZF9jYXBhY2l0eTsKKworICAgICAgYm9vbAorICAgICAgX01fcmVxdWlyZXNfcmVhbGxvY2F0aW9uKHNpemVfdHlwZSBfX2VsZW1lbnRzKQorICAgICAgeyByZXR1cm4gX19lbGVtZW50cyA+IHRoaXMtPmNhcGFjaXR5KCk7IH0KKworICAgICAgdm9pZAorICAgICAgX01fdXBkYXRlX2d1YXJhbnRlZWRfY2FwYWNpdHkoKQorICAgICAgeworCWlmICh0aGlzLT5zaXplKCkgPiBfTV9ndWFyYW50ZWVkX2NhcGFjaXR5KQorCSAgX01fZ3VhcmFudGVlZF9jYXBhY2l0eSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01faW52YWxpZGF0ZV9hZnRlcl9udGgoZGlmZmVyZW5jZV90eXBlIF9fbikKKyAgICAgIHsKKwl0eXBlZGVmIF9fZ251X2RlYnVnOjpfQWZ0ZXJfbnRoX2Zyb208X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9BZnRlcl9udGg7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfQWZ0ZXJfbnRoKF9fbiwgX0Jhc2U6OmJlZ2luKCkpKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID09IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpICE9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgIGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDw9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID49IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgIGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX2xocywgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX2RlYnVnCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIC8vIERSIDExODIuCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIHZlY3Rvcjxib29sPi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBoYXNoPF9fZGVidWc6OnZlY3Rvcjxib29sLCBfQWxsb2M+PgorICAgIDogcHVibGljIF9faGFzaF9iYXNlPHNpemVfdCwgX19kZWJ1Zzo6dmVjdG9yPGJvb2wsIF9BbGxvYz4+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9fZGVidWc6OnZlY3Rvcjxib29sLCBfQWxsb2M+JiBfX2IpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Omhhc2g8X0dMSUJDWFhfU1REX0M6OnZlY3Rvcjxib29sLCBfQWxsb2M+PigpCisJICAoX19iLl9NX2Jhc2UoKSk7IH0KKyAgICB9OworI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVjaW1hbC9kZWNpbWFsIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZWNpbWFsL2RlY2ltYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg4MDUzNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVjaW1hbC9kZWNpbWFsCkBAIC0wLDAgKzEsNDg1IEBACisvLyA8ZGVjaW1hbD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVjaW1hbC9kZWNpbWFsCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisvLyBJU08vSUVDIFRSIDI0NzMzIAorLy8gV3JpdHRlbiBieSBKYW5pcyBKb2huc29uIDxqYW5pczE4N0B1cy5pYm0uY29tPgorCisjaWZuZGVmIF9HTElCQ1hYX0RFQ0lNQUwKKyNkZWZpbmUgX0dMSUJDWFhfREVDSU1BTCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKKyNpZm5kZWYgX0dMSUJDWFhfVVNFX0RFQ0lNQUxfRkxPQVQKKyNlcnJvciBUaGlzIGZpbGUgcmVxdWlyZXMgY29tcGlsZXIgYW5kIGxpYnJhcnkgc3VwcG9ydCBmb3IgSVNPL0lFQyBUUiAyNDczMyBcCit0aGF0IGlzIGN1cnJlbnRseSBub3QgYXZhaWxhYmxlLgorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworICAvKioKKyAgICAqIEBkZWZncm91cCBkZWNpbWFsIERlY2ltYWwgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYworICAgICogQGluZ3JvdXAgbnVtZXJpY3MKKyAgICAqCisgICAgKiBDbGFzc2VzIGFuZCBmdW5jdGlvbnMgZm9yIGRlY2ltYWwgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYy4KKyAgICAqIEB7CisgICAgKi8KKworICAvKiogQG5hbWVzcGFjZSBzdGQ6OmRlY2ltYWwKKyAgICAqIEBicmllZiBJU08vSUVDIFRSIDI0NzMzIERlY2ltYWwgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYy4KKyAgICAqLworbmFtZXNwYWNlIGRlY2ltYWwKK3sKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICBjbGFzcyBkZWNpbWFsMzI7CisgIGNsYXNzIGRlY2ltYWw2NDsKKyAgY2xhc3MgZGVjaW1hbDEyODsKKworICAvLyAzLjIuNSAgSW5pdGlhbGl6YXRpb24gZnJvbSBjb2VmZmljaWVudCBhbmQgZXhwb25lbnQuCisgIHN0YXRpYyBkZWNpbWFsMzIgbWFrZV9kZWNpbWFsMzIobG9uZyBsb25nIF9fY29lZmYsIGludCBfX2V4cCk7CisgIHN0YXRpYyBkZWNpbWFsMzIgbWFrZV9kZWNpbWFsMzIodW5zaWduZWQgbG9uZyBsb25nIF9fY29lZmYsIGludCBfX2V4cCk7CisgIHN0YXRpYyBkZWNpbWFsNjQgbWFrZV9kZWNpbWFsNjQobG9uZyBsb25nIF9fY29lZmYsIGludCBfX2V4cCk7CisgIHN0YXRpYyBkZWNpbWFsNjQgbWFrZV9kZWNpbWFsNjQodW5zaWduZWQgbG9uZyBsb25nIF9fY29lZmYsIGludCBfX2V4cCk7CisgIHN0YXRpYyBkZWNpbWFsMTI4IG1ha2VfZGVjaW1hbDEyOChsb25nIGxvbmcgX19jb2VmZiwgaW50IF9fZXhwKTsKKyAgc3RhdGljIGRlY2ltYWwxMjggbWFrZV9kZWNpbWFsMTI4KHVuc2lnbmVkIGxvbmcgbG9uZyBfX2NvZWZmLCBpbnQgX19leHApOworCisgIC8vLyBOb24tY29uZm9ybWluZyBleHRlbnNpb246IENvbnZlcnNpb24gdG8gaW50ZWdyYWwgdHlwZS4KKyAgbG9uZyBsb25nIGRlY2ltYWwzMl90b19sb25nX2xvbmcoZGVjaW1hbDMyIF9fZCk7CisgIGxvbmcgbG9uZyBkZWNpbWFsNjRfdG9fbG9uZ19sb25nKGRlY2ltYWw2NCBfX2QpOworICBsb25nIGxvbmcgZGVjaW1hbDEyOF90b19sb25nX2xvbmcoZGVjaW1hbDEyOCBfX2QpOworICBsb25nIGxvbmcgZGVjaW1hbF90b19sb25nX2xvbmcoZGVjaW1hbDMyIF9fZCk7CisgIGxvbmcgbG9uZyBkZWNpbWFsX3RvX2xvbmdfbG9uZyhkZWNpbWFsNjQgX19kKTsKKyAgbG9uZyBsb25nIGRlY2ltYWxfdG9fbG9uZ19sb25nKGRlY2ltYWwxMjggX19kKTsKKworICAvLyAzLjIuNiAgQ29udmVyc2lvbiB0byBnZW5lcmljIGZsb2F0aW5nLXBvaW50IHR5cGUuCisgIGZsb2F0IGRlY2ltYWwzMl90b19mbG9hdChkZWNpbWFsMzIgX19kKTsKKyAgZmxvYXQgZGVjaW1hbDY0X3RvX2Zsb2F0KGRlY2ltYWw2NCBfX2QpOworICBmbG9hdCBkZWNpbWFsMTI4X3RvX2Zsb2F0KGRlY2ltYWwxMjggX19kKTsKKyAgZmxvYXQgZGVjaW1hbF90b19mbG9hdChkZWNpbWFsMzIgX19kKTsKKyAgZmxvYXQgZGVjaW1hbF90b19mbG9hdChkZWNpbWFsNjQgX19kKTsKKyAgZmxvYXQgZGVjaW1hbF90b19mbG9hdChkZWNpbWFsMTI4IF9fZCk7CisKKyAgZG91YmxlIGRlY2ltYWwzMl90b19kb3VibGUoZGVjaW1hbDMyIF9fZCk7CisgIGRvdWJsZSBkZWNpbWFsNjRfdG9fZG91YmxlKGRlY2ltYWw2NCBfX2QpOworICBkb3VibGUgZGVjaW1hbDEyOF90b19kb3VibGUoZGVjaW1hbDEyOCBfX2QpOworICBkb3VibGUgZGVjaW1hbF90b19kb3VibGUoZGVjaW1hbDMyIF9fZCk7CisgIGRvdWJsZSBkZWNpbWFsX3RvX2RvdWJsZShkZWNpbWFsNjQgX19kKTsKKyAgZG91YmxlIGRlY2ltYWxfdG9fZG91YmxlKGRlY2ltYWwxMjggX19kKTsKKworICBsb25nIGRvdWJsZSBkZWNpbWFsMzJfdG9fbG9uZ19kb3VibGUoZGVjaW1hbDMyIF9fZCk7CisgIGxvbmcgZG91YmxlIGRlY2ltYWw2NF90b19sb25nX2RvdWJsZShkZWNpbWFsNjQgX19kKTsKKyAgbG9uZyBkb3VibGUgZGVjaW1hbDEyOF90b19sb25nX2RvdWJsZShkZWNpbWFsMTI4IF9fZCk7CisgIGxvbmcgZG91YmxlIGRlY2ltYWxfdG9fbG9uZ19kb3VibGUoZGVjaW1hbDMyIF9fZCk7CisgIGxvbmcgZG91YmxlIGRlY2ltYWxfdG9fbG9uZ19kb3VibGUoZGVjaW1hbDY0IF9fZCk7CisgIGxvbmcgZG91YmxlIGRlY2ltYWxfdG9fbG9uZ19kb3VibGUoZGVjaW1hbDEyOCBfX2QpOworCisgIC8vIDMuMi43ICBVbmFyeSBhcml0aG1ldGljIG9wZXJhdG9ycy4KKyAgZGVjaW1hbDMyICBvcGVyYXRvcisoZGVjaW1hbDMyIF9fcmhzKTsKKyAgZGVjaW1hbDY0ICBvcGVyYXRvcisoZGVjaW1hbDY0IF9fcmhzKTsKKyAgZGVjaW1hbDEyOCBvcGVyYXRvcisoZGVjaW1hbDEyOCBfX3Jocyk7CisgIGRlY2ltYWwzMiAgb3BlcmF0b3ItKGRlY2ltYWwzMiBfX3Jocyk7CisgIGRlY2ltYWw2NCAgb3BlcmF0b3ItKGRlY2ltYWw2NCBfX3Jocyk7CisgIGRlY2ltYWwxMjggb3BlcmF0b3ItKGRlY2ltYWwxMjggX19yaHMpOworCisgIC8vIDMuMi44ICBCaW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRvcnMuCisjZGVmaW5lIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKF9PcCwgX1QxLCBfVDIsIF9UMykJXAorICBfVDEgb3BlcmF0b3IgX09wKF9UMiBfX2xocywgX1QzIF9fcmhzKTsKKyNkZWZpbmUgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoX09wLCBfVHApCQlcCisgIF9UcCBvcGVyYXRvciBfT3AoX1RwIF9fbGhzLCBpbnQgX19yaHMpOwkJCVwKKyAgX1RwIG9wZXJhdG9yIF9PcChfVHAgX19saHMsIHVuc2lnbmVkIGludCBfX3Jocyk7CQlcCisgIF9UcCBvcGVyYXRvciBfT3AoX1RwIF9fbGhzLCBsb25nIF9fcmhzKTsJCQlcCisgIF9UcCBvcGVyYXRvciBfT3AoX1RwIF9fbGhzLCB1bnNpZ25lZCBsb25nIF9fcmhzKTsJCVwKKyAgX1RwIG9wZXJhdG9yIF9PcChfVHAgX19saHMsIGxvbmcgbG9uZyBfX3Jocyk7CQkJXAorICBfVHAgb3BlcmF0b3IgX09wKF9UcCBfX2xocywgdW5zaWduZWQgbG9uZyBsb25nIF9fcmhzKTsJXAorICBfVHAgb3BlcmF0b3IgX09wKGludCBfX2xocywgX1RwIF9fcmhzKTsJCQlcCisgIF9UcCBvcGVyYXRvciBfT3AodW5zaWduZWQgaW50IF9fbGhzLCBfVHAgX19yaHMpOwkJXAorICBfVHAgb3BlcmF0b3IgX09wKGxvbmcgX19saHMsIF9UcCBfX3Jocyk7CQkJXAorICBfVHAgb3BlcmF0b3IgX09wKHVuc2lnbmVkIGxvbmcgX19saHMsIF9UcCBfX3Jocyk7CQlcCisgIF9UcCBvcGVyYXRvciBfT3AobG9uZyBsb25nIF9fbGhzLCBfVHAgX19yaHMpOwkJCVwKKyAgX1RwIG9wZXJhdG9yIF9PcCh1bnNpZ25lZCBsb25nIGxvbmcgX19saHMsIF9UcCBfX3Jocyk7CisKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKywgZGVjaW1hbDMyLCBkZWNpbWFsMzIsIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoKywgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygrLCBkZWNpbWFsNjQsIGRlY2ltYWwzMiwgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygrLCBkZWNpbWFsNjQsIGRlY2ltYWw2NCwgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygrLCBkZWNpbWFsNjQsIGRlY2ltYWw2NCwgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgrLCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCssIGRlY2ltYWwxMjgsIGRlY2ltYWwzMiwgZGVjaW1hbDEyOCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKywgZGVjaW1hbDEyOCwgZGVjaW1hbDY0LCBkZWNpbWFsMTI4KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygrLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCssIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKywgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoKywgZGVjaW1hbDEyOCkKKworICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygtLCBkZWNpbWFsMzIsIGRlY2ltYWwzMiwgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgtLCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC0sIGRlY2ltYWw2NCwgZGVjaW1hbDMyLCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC0sIGRlY2ltYWw2NCwgZGVjaW1hbDY0LCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC0sIGRlY2ltYWw2NCwgZGVjaW1hbDY0LCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKC0sIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLSwgZGVjaW1hbDEyOCwgZGVjaW1hbDMyLCBkZWNpbWFsMTI4KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygtLCBkZWNpbWFsMTI4LCBkZWNpbWFsNjQsIGRlY2ltYWwxMjgpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC0sIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLSwgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygtLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgtLCBkZWNpbWFsMTI4KQorCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCosIGRlY2ltYWwzMiwgZGVjaW1hbDMyLCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKCosIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKiwgZGVjaW1hbDY0LCBkZWNpbWFsMzIsIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKiwgZGVjaW1hbDY0LCBkZWNpbWFsNjQsIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKiwgZGVjaW1hbDY0LCBkZWNpbWFsNjQsIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoKiwgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygqLCBkZWNpbWFsMTI4LCBkZWNpbWFsMzIsIGRlY2ltYWwxMjgpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCosIGRlY2ltYWwxMjgsIGRlY2ltYWw2NCwgZGVjaW1hbDEyOCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKiwgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygqLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCosIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKCosIGRlY2ltYWwxMjgpCisKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLywgZGVjaW1hbDMyLCBkZWNpbWFsMzIsIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoLywgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygvLCBkZWNpbWFsNjQsIGRlY2ltYWwzMiwgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygvLCBkZWNpbWFsNjQsIGRlY2ltYWw2NCwgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygvLCBkZWNpbWFsNjQsIGRlY2ltYWw2NCwgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgvLCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC8sIGRlY2ltYWwxMjgsIGRlY2ltYWwzMiwgZGVjaW1hbDEyOCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLywgZGVjaW1hbDEyOCwgZGVjaW1hbDY0LCBkZWNpbWFsMTI4KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygvLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC8sIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLywgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoLywgZGVjaW1hbDEyOCkKKworI3VuZGVmIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDCisjdW5kZWYgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQKKworICAvLyAzLjIuOSAgQ29tcGFyaXNvbiBvcGVyYXRvcnMuCisjZGVmaW5lIF9ERUNMQVJFX0RFQ0lNQUxfQ09NUEFSSVNPTihfT3AsIF9UcCkJCQkJXAorICBib29sIG9wZXJhdG9yIF9PcChfVHAgX19saHMsIGRlY2ltYWwzMiBfX3Jocyk7CQkJXAorICBib29sIG9wZXJhdG9yIF9PcChfVHAgX19saHMsIGRlY2ltYWw2NCBfX3Jocyk7CQkJXAorICBib29sIG9wZXJhdG9yIF9PcChfVHAgX19saHMsIGRlY2ltYWwxMjggX19yaHMpOwkJCVwKKyAgYm9vbCBvcGVyYXRvciBfT3AoX1RwIF9fbGhzLCBpbnQgX19yaHMpOwkJCQlcCisgIGJvb2wgb3BlcmF0b3IgX09wKF9UcCBfX2xocywgdW5zaWduZWQgaW50IF9fcmhzKTsJCQlcCisgIGJvb2wgb3BlcmF0b3IgX09wKF9UcCBfX2xocywgbG9uZyBfX3Jocyk7CQkJCVwKKyAgYm9vbCBvcGVyYXRvciBfT3AoX1RwIF9fbGhzLCB1bnNpZ25lZCBsb25nIF9fcmhzKTsJCQlcCisgIGJvb2wgb3BlcmF0b3IgX09wKF9UcCBfX2xocywgbG9uZyBsb25nIF9fcmhzKTsJCQlcCisgIGJvb2wgb3BlcmF0b3IgX09wKF9UcCBfX2xocywgdW5zaWduZWQgbG9uZyBsb25nIF9fcmhzKTsJCVwKKyAgYm9vbCBvcGVyYXRvciBfT3AoaW50IF9fbGhzLCBfVHAgX19yaHMpOwkJCQlcCisgIGJvb2wgb3BlcmF0b3IgX09wKHVuc2lnbmVkIGludCBfX2xocywgX1RwIF9fcmhzKTsJCQlcCisgIGJvb2wgb3BlcmF0b3IgX09wKGxvbmcgX19saHMsIF9UcCBfX3Jocyk7CQkJCVwKKyAgYm9vbCBvcGVyYXRvciBfT3AodW5zaWduZWQgbG9uZyBfX2xocywgX1RwIF9fcmhzKTsJCQlcCisgIGJvb2wgb3BlcmF0b3IgX09wKGxvbmcgbG9uZyBfX2xocywgX1RwIF9fcmhzKTsJCQlcCisgIGJvb2wgb3BlcmF0b3IgX09wKHVuc2lnbmVkIGxvbmcgbG9uZyBfX2xocywgX1RwIF9fcmhzKTsKKworICBfREVDTEFSRV9ERUNJTUFMX0NPTVBBUklTT04oPT0sIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9DT01QQVJJU09OKD09LCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQ09NUEFSSVNPTig9PSwgZGVjaW1hbDEyOCkKKworICBfREVDTEFSRV9ERUNJTUFMX0NPTVBBUklTT04oIT0sIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9DT01QQVJJU09OKCE9LCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQ09NUEFSSVNPTighPSwgZGVjaW1hbDEyOCkKKworICBfREVDTEFSRV9ERUNJTUFMX0NPTVBBUklTT04oPCwgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0NPTVBBUklTT04oPCwgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0NPTVBBUklTT04oPCwgZGVjaW1hbDEyOCkKKworICBfREVDTEFSRV9ERUNJTUFMX0NPTVBBUklTT04oPj0sIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9DT01QQVJJU09OKD49LCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQ09NUEFSSVNPTig+PSwgZGVjaW1hbDEyOCkKKworICBfREVDTEFSRV9ERUNJTUFMX0NPTVBBUklTT04oPiwgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0NPTVBBUklTT04oPiwgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0NPTVBBUklTT04oPiwgZGVjaW1hbDEyOCkKKworICBfREVDTEFSRV9ERUNJTUFMX0NPTVBBUklTT04oPj0sIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9DT01QQVJJU09OKD49LCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQ09NUEFSSVNPTig+PSwgZGVjaW1hbDEyOCkKKworI3VuZGVmIF9ERUNMQVJFX0RFQ0lNQUxfQ09NUEFSSVNPTgorCisgIC8vLyAzLjIuMiAgQ2xhc3MgZGVjaW1hbDMyLgorICBjbGFzcyBkZWNpbWFsMzIKKyAgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBmbG9hdCBfX2RlY2Zsb2F0MzIgX19hdHRyaWJ1dGVfXygobW9kZShTRCkpKTsKKworICAgIC8vIDMuMi4yLjIgIENvbnN0cnVjdC9jb3B5L2Rlc3Ryb3kuCisgICAgZGVjaW1hbDMyKCkJCQkJCTogX192YWwoMC5lLTEwMURGKSB7fQorCisgICAgLy8gMy4yLjIuMyAgQ29udmVyc2lvbiBmcm9tIGZsb2F0aW5nLXBvaW50IHR5cGUuCisgICAgZXhwbGljaXQgZGVjaW1hbDMyKGRlY2ltYWw2NCBfX2Q2NCk7CisgICAgZXhwbGljaXQgZGVjaW1hbDMyKGRlY2ltYWwxMjggX19kMTI4KTsKKyAgICBleHBsaWNpdCBkZWNpbWFsMzIoZmxvYXQgX19yKQkJOiBfX3ZhbChfX3IpIHt9CisgICAgZXhwbGljaXQgZGVjaW1hbDMyKGRvdWJsZSBfX3IpCQk6IF9fdmFsKF9fcikge30KKyAgICBleHBsaWNpdCBkZWNpbWFsMzIobG9uZyBkb3VibGUgX19yKQkJOiBfX3ZhbChfX3IpIHt9CisKKyAgICAvLyAzLjIuMi40ICBDb252ZXJzaW9uIGZyb20gaW50ZWdyYWwgdHlwZS4KKyAgICBkZWNpbWFsMzIoaW50IF9feikJCQkJOiBfX3ZhbChfX3opIHt9CisgICAgZGVjaW1hbDMyKHVuc2lnbmVkIGludCBfX3opCQkJOiBfX3ZhbChfX3opIHt9CisgICAgZGVjaW1hbDMyKGxvbmcgX196KQkJCQk6IF9fdmFsKF9feikge30KKyAgICBkZWNpbWFsMzIodW5zaWduZWQgbG9uZyBfX3opCQk6IF9fdmFsKF9feikge30KKyAgICBkZWNpbWFsMzIobG9uZyBsb25nIF9feikJCQk6IF9fdmFsKF9feikge30KKyAgICBkZWNpbWFsMzIodW5zaWduZWQgbG9uZyBsb25nIF9feikJCTogX192YWwoX196KSB7fQorCisgICAgLy8vIENvbmZvcm1pbmcgZXh0ZW5zaW9uOiBDb252ZXJzaW9uIGZyb20gc2NhbGFyIGRlY2ltYWwgdHlwZS4KKyAgICBkZWNpbWFsMzIoX19kZWNmbG9hdDMyIF9feikJCQk6IF9fdmFsKF9feikge30KKworICAgIC8vIDMuMi4yLjUgIENvbnZlcnNpb24gdG8gaW50ZWdyYWwgdHlwZS4gKERJU0FCTEVEKQorICAgIC8vb3BlcmF0b3IgbG9uZyBsb25nKCkgY29uc3QgeyByZXR1cm4gKGxvbmcgbG9uZylfX3ZhbDsgfQorCisgICAgLy8gMy4yLjIuNiAgSW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgb3BlcmF0b3JzLgorICAgIGRlY2ltYWwzMiYgb3BlcmF0b3IrKygpCisgICAgeworICAgICAgX192YWwgKz0gMTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBkZWNpbWFsMzIgb3BlcmF0b3IrKyhpbnQpCisgICAgeworICAgICAgZGVjaW1hbDMyIF9fdG1wID0gKnRoaXM7CisgICAgICBfX3ZhbCArPSAxOworICAgICAgcmV0dXJuIF9fdG1wOworICAgIH0KKworICAgIGRlY2ltYWwzMiYgb3BlcmF0b3ItLSgpCisgICAgeworICAgICAgX192YWwgLT0gMTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBkZWNpbWFsMzIgICBvcGVyYXRvci0tKGludCkKKyAgICB7CisgICAgICBkZWNpbWFsMzIgX190bXAgPSAqdGhpczsKKyAgICAgIF9fdmFsIC09IDE7CisgICAgICByZXR1cm4gX190bXA7CisgICAgfQorCisgICAgLy8gMy4yLjIuNyAgQ29tcG91bmQgYXNzaWdubWVudC4KKyNkZWZpbmUgX0RFQ0xBUkVfREVDSU1BTDMyX0NPTVBPVU5EX0FTU0lHTk1FTlQoX09wKQlcCisgICAgZGVjaW1hbDMyJiBvcGVyYXRvciBfT3AoZGVjaW1hbDMyIF9fcmhzKTsJCVwKKyAgICBkZWNpbWFsMzImIG9wZXJhdG9yIF9PcChkZWNpbWFsNjQgX19yaHMpOwkJXAorICAgIGRlY2ltYWwzMiYgb3BlcmF0b3IgX09wKGRlY2ltYWwxMjggX19yaHMpOwkJXAorICAgIGRlY2ltYWwzMiYgb3BlcmF0b3IgX09wKGludCBfX3Jocyk7CQkJXAorICAgIGRlY2ltYWwzMiYgb3BlcmF0b3IgX09wKHVuc2lnbmVkIGludCBfX3Jocyk7CVwKKyAgICBkZWNpbWFsMzImIG9wZXJhdG9yIF9PcChsb25nIF9fcmhzKTsJCVwKKyAgICBkZWNpbWFsMzImIG9wZXJhdG9yIF9PcCh1bnNpZ25lZCBsb25nIF9fcmhzKTsJXAorICAgIGRlY2ltYWwzMiYgb3BlcmF0b3IgX09wKGxvbmcgbG9uZyBfX3Jocyk7CQlcCisgICAgZGVjaW1hbDMyJiBvcGVyYXRvciBfT3AodW5zaWduZWQgbG9uZyBsb25nIF9fcmhzKTsKKworICAgIF9ERUNMQVJFX0RFQ0lNQUwzMl9DT01QT1VORF9BU1NJR05NRU5UKCs9KQorICAgIF9ERUNMQVJFX0RFQ0lNQUwzMl9DT01QT1VORF9BU1NJR05NRU5UKC09KQorICAgIF9ERUNMQVJFX0RFQ0lNQUwzMl9DT01QT1VORF9BU1NJR05NRU5UKCo9KQorICAgIF9ERUNMQVJFX0RFQ0lNQUwzMl9DT01QT1VORF9BU1NJR05NRU5UKC89KQorI3VuZGVmIF9ERUNMQVJFX0RFQ0lNQUwzMl9DT01QT1VORF9BU1NJR05NRU5UCisKKyAgcHJpdmF0ZToKKyAgICBfX2RlY2Zsb2F0MzIgX192YWw7CisKKyAgcHVibGljOgorICAgIF9fZGVjZmxvYXQzMiBfX2dldHZhbCh2b2lkKSB7IHJldHVybiBfX3ZhbDsgfQorICAgIHZvaWQgX19zZXR2YWwoX19kZWNmbG9hdDMyIF9feCkgeyBfX3ZhbCA9IF9feDsgfQorICB9OworCisgIC8vLyAzLjIuMyAgQ2xhc3MgZGVjaW1hbDY0LgorICBjbGFzcyBkZWNpbWFsNjQKKyAgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBmbG9hdCBfX2RlY2Zsb2F0NjQgX19hdHRyaWJ1dGVfXygobW9kZShERCkpKTsKKworICAgIC8vIDMuMi4zLjIgIENvbnN0cnVjdC9jb3B5L2Rlc3Ryb3kuCisgICAgZGVjaW1hbDY0KCkJCQkJCTogX192YWwoMC5lLTM5OGRkKSB7fQorCisgICAgLy8gMy4yLjMuMyAgQ29udmVyc2lvbiBmcm9tIGZsb2F0aW5nLXBvaW50IHR5cGUuCisJICAgICBkZWNpbWFsNjQoZGVjaW1hbDMyIGQzMik7CisgICAgZXhwbGljaXQgZGVjaW1hbDY0KGRlY2ltYWwxMjggZDEyOCk7CisgICAgZXhwbGljaXQgZGVjaW1hbDY0KGZsb2F0IF9fcikJCTogX192YWwoX19yKSB7fQorICAgIGV4cGxpY2l0IGRlY2ltYWw2NChkb3VibGUgX19yKQkJOiBfX3ZhbChfX3IpIHt9CisgICAgZXhwbGljaXQgZGVjaW1hbDY0KGxvbmcgZG91YmxlIF9fcikJCTogX192YWwoX19yKSB7fQorCisgICAgLy8gMy4yLjMuNCAgQ29udmVyc2lvbiBmcm9tIGludGVncmFsIHR5cGUuCisgICAgZGVjaW1hbDY0KGludCBfX3opCQkJCTogX192YWwoX196KSB7fQorICAgIGRlY2ltYWw2NCh1bnNpZ25lZCBpbnQgX196KQkJCTogX192YWwoX196KSB7fQorICAgIGRlY2ltYWw2NChsb25nIF9feikJCQkJOiBfX3ZhbChfX3opIHt9CisgICAgZGVjaW1hbDY0KHVuc2lnbmVkIGxvbmcgX196KQkJOiBfX3ZhbChfX3opIHt9CisgICAgZGVjaW1hbDY0KGxvbmcgbG9uZyBfX3opCQkJOiBfX3ZhbChfX3opIHt9CisgICAgZGVjaW1hbDY0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX3opCQk6IF9fdmFsKF9feikge30KKworICAgIC8vLyBDb25mb3JtaW5nIGV4dGVuc2lvbjogQ29udmVyc2lvbiBmcm9tIHNjYWxhciBkZWNpbWFsIHR5cGUuCisgICAgZGVjaW1hbDY0KF9fZGVjZmxvYXQ2NCBfX3opCQkJOiBfX3ZhbChfX3opIHt9CisKKyAgICAvLyAzLjIuMy41ICBDb252ZXJzaW9uIHRvIGludGVncmFsIHR5cGUuIChESVNBQkxFRCkKKyAgICAvL29wZXJhdG9yIGxvbmcgbG9uZygpIGNvbnN0IHsgcmV0dXJuIChsb25nIGxvbmcpX192YWw7IH0KKworICAgIC8vIDMuMi4zLjYgIEluY3JlbWVudCBhbmQgZGVjcmVtZW50IG9wZXJhdG9ycy4KKyAgICBkZWNpbWFsNjQmIG9wZXJhdG9yKysoKQorICAgIHsKKyAgICAgIF9fdmFsICs9IDE7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgZGVjaW1hbDY0IG9wZXJhdG9yKysoaW50KQorICAgIHsKKyAgICAgIGRlY2ltYWw2NCBfX3RtcCA9ICp0aGlzOworICAgICAgX192YWwgKz0gMTsKKyAgICAgIHJldHVybiBfX3RtcDsKKyAgICB9CisKKyAgICBkZWNpbWFsNjQmIG9wZXJhdG9yLS0oKQorICAgIHsKKyAgICAgIF9fdmFsIC09IDE7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgZGVjaW1hbDY0IG9wZXJhdG9yLS0oaW50KQorICAgIHsKKyAgICAgIGRlY2ltYWw2NCBfX3RtcCA9ICp0aGlzOworICAgICAgX192YWwgLT0gMTsKKyAgICAgIHJldHVybiBfX3RtcDsKKyAgICB9CisKKyAgICAvLyAzLjIuMy43ICBDb21wb3VuZCBhc3NpZ25tZW50LgorI2RlZmluZSBfREVDTEFSRV9ERUNJTUFMNjRfQ09NUE9VTkRfQVNTSUdOTUVOVChfT3ApCVwKKyAgICBkZWNpbWFsNjQmIG9wZXJhdG9yIF9PcChkZWNpbWFsMzIgX19yaHMpOwkJXAorICAgIGRlY2ltYWw2NCYgb3BlcmF0b3IgX09wKGRlY2ltYWw2NCBfX3Jocyk7CQlcCisgICAgZGVjaW1hbDY0JiBvcGVyYXRvciBfT3AoZGVjaW1hbDEyOCBfX3Jocyk7CQlcCisgICAgZGVjaW1hbDY0JiBvcGVyYXRvciBfT3AoaW50IF9fcmhzKTsJCQlcCisgICAgZGVjaW1hbDY0JiBvcGVyYXRvciBfT3AodW5zaWduZWQgaW50IF9fcmhzKTsJXAorICAgIGRlY2ltYWw2NCYgb3BlcmF0b3IgX09wKGxvbmcgX19yaHMpOwkJXAorICAgIGRlY2ltYWw2NCYgb3BlcmF0b3IgX09wKHVuc2lnbmVkIGxvbmcgX19yaHMpOwlcCisgICAgZGVjaW1hbDY0JiBvcGVyYXRvciBfT3AobG9uZyBsb25nIF9fcmhzKTsJCVwKKyAgICBkZWNpbWFsNjQmIG9wZXJhdG9yIF9PcCh1bnNpZ25lZCBsb25nIGxvbmcgX19yaHMpOworCisgICAgX0RFQ0xBUkVfREVDSU1BTDY0X0NPTVBPVU5EX0FTU0lHTk1FTlQoKz0pCisgICAgX0RFQ0xBUkVfREVDSU1BTDY0X0NPTVBPVU5EX0FTU0lHTk1FTlQoLT0pCisgICAgX0RFQ0xBUkVfREVDSU1BTDY0X0NPTVBPVU5EX0FTU0lHTk1FTlQoKj0pCisgICAgX0RFQ0xBUkVfREVDSU1BTDY0X0NPTVBPVU5EX0FTU0lHTk1FTlQoLz0pCisjdW5kZWYgX0RFQ0xBUkVfREVDSU1BTDY0X0NPTVBPVU5EX0FTU0lHTk1FTlQKKworICBwcml2YXRlOgorICAgIF9fZGVjZmxvYXQ2NCBfX3ZhbDsKKworICBwdWJsaWM6CisgICAgX19kZWNmbG9hdDY0IF9fZ2V0dmFsKHZvaWQpIHsgcmV0dXJuIF9fdmFsOyB9CisgICAgdm9pZCBfX3NldHZhbChfX2RlY2Zsb2F0NjQgX194KSB7IF9fdmFsID0gX194OyB9CisgIH07CisKKyAgLy8vIDMuMi40ICBDbGFzcyBkZWNpbWFsMTI4LgorICBjbGFzcyBkZWNpbWFsMTI4CisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgZmxvYXQgX19kZWNmbG9hdDEyOCBfX2F0dHJpYnV0ZV9fKChtb2RlKFREKSkpOworCisgICAgLy8gMy4yLjQuMiAgQ29uc3RydWN0L2NvcHkvZGVzdHJveS4KKyAgICBkZWNpbWFsMTI4KCkJCQkJOiBfX3ZhbCgwLmUtNjE3NkRMKSB7fQorCisgICAgLy8gMy4yLjQuMyAgQ29udmVyc2lvbiBmcm9tIGZsb2F0aW5nLXBvaW50IHR5cGUuCisJICAgICBkZWNpbWFsMTI4KGRlY2ltYWwzMiBkMzIpOworCSAgICAgZGVjaW1hbDEyOChkZWNpbWFsNjQgZDY0KTsKKyAgICBleHBsaWNpdCBkZWNpbWFsMTI4KGZsb2F0IF9fcikJCTogX192YWwoX19yKSB7fQorICAgIGV4cGxpY2l0IGRlY2ltYWwxMjgoZG91YmxlIF9fcikJCTogX192YWwoX19yKSB7fQorICAgIGV4cGxpY2l0IGRlY2ltYWwxMjgobG9uZyBkb3VibGUgX19yKQk6IF9fdmFsKF9fcikge30KKworCisgICAgLy8gMy4yLjQuNCAgQ29udmVyc2lvbiBmcm9tIGludGVncmFsIHR5cGUuCisgICAgZGVjaW1hbDEyOChpbnQgX196KQkJCQk6IF9fdmFsKF9feikge30KKyAgICBkZWNpbWFsMTI4KHVuc2lnbmVkIGludCBfX3opCQk6IF9fdmFsKF9feikge30KKyAgICBkZWNpbWFsMTI4KGxvbmcgX196KQkJCTogX192YWwoX196KSB7fQorICAgIGRlY2ltYWwxMjgodW5zaWduZWQgbG9uZyBfX3opCQk6IF9fdmFsKF9feikge30KKyAgICBkZWNpbWFsMTI4KGxvbmcgbG9uZyBfX3opCQkJOiBfX3ZhbChfX3opIHt9CisgICAgZGVjaW1hbDEyOCh1bnNpZ25lZCBsb25nIGxvbmcgX196KQkJOiBfX3ZhbChfX3opIHt9CisKKyAgICAvLy8gQ29uZm9ybWluZyBleHRlbnNpb246IENvbnZlcnNpb24gZnJvbSBzY2FsYXIgZGVjaW1hbCB0eXBlLgorICAgIGRlY2ltYWwxMjgoX19kZWNmbG9hdDEyOCBfX3opCQk6IF9fdmFsKF9feikge30KKworICAgIC8vIDMuMi40LjUgIENvbnZlcnNpb24gdG8gaW50ZWdyYWwgdHlwZS4gKERJU0FCTEVEKQorICAgIC8vb3BlcmF0b3IgbG9uZyBsb25nKCkgY29uc3QgeyByZXR1cm4gKGxvbmcgbG9uZylfX3ZhbDsgfQorCisgICAgLy8gMy4yLjQuNiAgSW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgb3BlcmF0b3JzLgorICAgIGRlY2ltYWwxMjgmIG9wZXJhdG9yKysoKQorICAgIHsKKyAgICAgIF9fdmFsICs9IDE7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgZGVjaW1hbDEyOCBvcGVyYXRvcisrKGludCkKKyAgICB7CisgICAgICBkZWNpbWFsMTI4IF9fdG1wID0gKnRoaXM7CisgICAgICBfX3ZhbCArPSAxOworICAgICAgcmV0dXJuIF9fdG1wOworICAgIH0KKworICAgIGRlY2ltYWwxMjgmIG9wZXJhdG9yLS0oKQorICAgIHsKKyAgICAgIF9fdmFsIC09IDE7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgZGVjaW1hbDEyOCAgIG9wZXJhdG9yLS0oaW50KQorICAgIHsKKyAgICAgIGRlY2ltYWwxMjggX190bXAgPSAqdGhpczsKKyAgICAgIF9fdmFsIC09IDE7CisgICAgICByZXR1cm4gX190bXA7CisgICAgfQorCisgICAgLy8gMy4yLjQuNyAgQ29tcG91bmQgYXNzaWdubWVudC4KKyNkZWZpbmUgX0RFQ0xBUkVfREVDSU1BTDEyOF9DT01QT1VORF9BU1NJR05NRU5UKF9PcCkJXAorICAgIGRlY2ltYWwxMjgmIG9wZXJhdG9yIF9PcChkZWNpbWFsMzIgX19yaHMpOwkJXAorICAgIGRlY2ltYWwxMjgmIG9wZXJhdG9yIF9PcChkZWNpbWFsNjQgX19yaHMpOwkJXAorICAgIGRlY2ltYWwxMjgmIG9wZXJhdG9yIF9PcChkZWNpbWFsMTI4IF9fcmhzKTsJCVwKKyAgICBkZWNpbWFsMTI4JiBvcGVyYXRvciBfT3AoaW50IF9fcmhzKTsJCVwKKyAgICBkZWNpbWFsMTI4JiBvcGVyYXRvciBfT3AodW5zaWduZWQgaW50IF9fcmhzKTsJXAorICAgIGRlY2ltYWwxMjgmIG9wZXJhdG9yIF9PcChsb25nIF9fcmhzKTsJCVwKKyAgICBkZWNpbWFsMTI4JiBvcGVyYXRvciBfT3AodW5zaWduZWQgbG9uZyBfX3Jocyk7CVwKKyAgICBkZWNpbWFsMTI4JiBvcGVyYXRvciBfT3AobG9uZyBsb25nIF9fcmhzKTsJCVwKKyAgICBkZWNpbWFsMTI4JiBvcGVyYXRvciBfT3AodW5zaWduZWQgbG9uZyBsb25nIF9fcmhzKTsKKworICAgIF9ERUNMQVJFX0RFQ0lNQUwxMjhfQ09NUE9VTkRfQVNTSUdOTUVOVCgrPSkKKyAgICBfREVDTEFSRV9ERUNJTUFMMTI4X0NPTVBPVU5EX0FTU0lHTk1FTlQoLT0pCisgICAgX0RFQ0xBUkVfREVDSU1BTDEyOF9DT01QT1VORF9BU1NJR05NRU5UKCo9KQorICAgIF9ERUNMQVJFX0RFQ0lNQUwxMjhfQ09NUE9VTkRfQVNTSUdOTUVOVCgvPSkKKyN1bmRlZiBfREVDTEFSRV9ERUNJTUFMMTI4X0NPTVBPVU5EX0FTU0lHTk1FTlQKKworICBwcml2YXRlOgorICAgIF9fZGVjZmxvYXQxMjggX192YWw7CisKKyAgcHVibGljOgorICAgIF9fZGVjZmxvYXQxMjggX19nZXR2YWwodm9pZCkgeyByZXR1cm4gX192YWw7IH0KKyAgICB2b2lkIF9fc2V0dmFsKF9fZGVjZmxvYXQxMjggX194KSB7IF9fdmFsID0gX194OyB9CisgIH07CisKKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0RFQ0lNQUxfIDEKKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGRlY2ltYWwKKyAgLy8gQH0gZ3JvdXAgZGVjaW1hbAorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNpbmNsdWRlIDxkZWNpbWFsL2RlY2ltYWwuaD4KKworI2VuZGlmIC8qIF9HTElCQ1hYX0RFQ0lNQUwgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVjaW1hbC9kZWNpbWFsLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlY2ltYWwvZGVjaW1hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYzA2N2EKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2RlY2ltYWwvZGVjaW1hbC5oCkBAIC0wLDAgKzEsNDY4IEBACisvLyBkZWNpbWFsIGNsYXNzZXMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWNpbWFsL2RlY2ltYWwuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2RlY2ltYWx9CisgKi8KKworLy8gSVNPL0lFQyBUUiAyNDczMworLy8gV3JpdHRlbiBieSBKYW5pcyBKb2huc29uIDxqYW5pczE4N0B1cy5pYm0uY29tPgorCisjaWZuZGVmIF9HTElCQ1hYX0RFQ0lNQUxfSU1QTAorI2RlZmluZSBfR0xJQkNYWF9ERUNJTUFMX0lNUEwgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIGRlY2ltYWwKK3sKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBJU08vSUVDIFRSIDI0NzMzICAzLjIuWzIzNF0uMSAgQ29uc3RydWN0L2NvcHkvZGVzdHJveS4KKworICBpbmxpbmUgZGVjaW1hbDMyOjpkZWNpbWFsMzIoZGVjaW1hbDY0IF9fcikJOiBfX3ZhbChfX3IuX19nZXR2YWwoKSkge30KKyAgaW5saW5lIGRlY2ltYWwzMjo6ZGVjaW1hbDMyKGRlY2ltYWwxMjggX19yKQk6IF9fdmFsKF9fci5fX2dldHZhbCgpKSB7fQorICBpbmxpbmUgZGVjaW1hbDY0OjpkZWNpbWFsNjQoZGVjaW1hbDMyIF9fcikJOiBfX3ZhbChfX3IuX19nZXR2YWwoKSkge30KKyAgaW5saW5lIGRlY2ltYWw2NDo6ZGVjaW1hbDY0KGRlY2ltYWwxMjggX19yKQk6IF9fdmFsKF9fci5fX2dldHZhbCgpKSB7fQorICBpbmxpbmUgZGVjaW1hbDEyODo6ZGVjaW1hbDEyOChkZWNpbWFsMzIgX19yKQk6IF9fdmFsKF9fci5fX2dldHZhbCgpKSB7fQorICBpbmxpbmUgZGVjaW1hbDEyODo6ZGVjaW1hbDEyOChkZWNpbWFsNjQgX19yKQk6IF9fdmFsKF9fci5fX2dldHZhbCgpKSB7fQorCisgIC8vIElTTy9JRUMgVFIgMjQ3MzMgIDMuMi5bMjM0XS42ICBDb21wb3VuZCBhc3NpZ25tZW50LgorCisjZGVmaW5lIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UX0RFQyhfT3AxLCBfT3AyLCBfVDEsIF9UMikJIFwKKyAgaW5saW5lIF9UMSYgX1QxOjpvcGVyYXRvciBfT3AxKF9UMiBfX3JocykJCQkJIFwKKyAgewkJCQkJCQkJCSBcCisgICAgX19zZXR2YWwoX19nZXR2YWwoKSBfT3AyIF9fcmhzLl9fZ2V0dmFsKCkpOwkJCQkgXAorICAgIHJldHVybiAqdGhpczsJCQkJCQkJIFwKKyAgfQorCisjZGVmaW5lIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UX0lOVChfT3AxLCBfT3AyLCBfVDEsIF9UMikJIFwKKyAgaW5saW5lIF9UMSYgX1QxOjpvcGVyYXRvciBfT3AxKF9UMiBfX3JocykJCQkJIFwKKyAgewkJCQkJCQkJCSBcCisgICAgX19zZXR2YWwoX19nZXR2YWwoKSBfT3AyIF9fcmhzKTsJCQkJCSBcCisgICAgcmV0dXJuICp0aGlzOwkJCQkJCQkgXAorICB9CisKKyNkZWZpbmUgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRTKF9PcDEsIF9PcDIsIF9UMSkJCSBcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UX0RFQyhfT3AxLCBfT3AyLCBfVDEsIGRlY2ltYWwzMikJIFwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRfREVDKF9PcDEsIF9PcDIsIF9UMSwgZGVjaW1hbDY0KQkgXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVF9ERUMoX09wMSwgX09wMiwgX1QxLCBkZWNpbWFsMTI4KQkgXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVF9JTlQoX09wMSwgX09wMiwgX1QxLCBpbnQpCQkgXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVF9JTlQoX09wMSwgX09wMiwgX1QxLCB1bnNpZ25lZCBpbnQpIFwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRfSU5UKF9PcDEsIF9PcDIsIF9UMSwgbG9uZykJIFwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRfSU5UKF9PcDEsIF9PcDIsIF9UMSwgdW5zaWduZWQgbG9uZylcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UX0lOVChfT3AxLCBfT3AyLCBfVDEsIGxvbmcgbG9uZykJIFwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRfSU5UKF9PcDEsIF9PcDIsIF9UMSwgdW5zaWduZWQgbG9uZyBsb25nKQorCisgIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UUygrPSwgKywgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVFMoLT0sIC0sIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRTKCo9LCAqLCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UUygvPSwgLywgZGVjaW1hbDMyKQorCisgIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UUygrPSwgKywgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVFMoLT0sIC0sIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRTKCo9LCAqLCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UUygvPSwgLywgZGVjaW1hbDY0KQorCisgIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UUygrPSwgKywgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRTKC09LCAtLCBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVFMoKj0sICosIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UUygvPSwgLywgZGVjaW1hbDEyOCkKKworI3VuZGVmIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UX0RFQworI3VuZGVmIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UX0lOVAorI3VuZGVmIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UUworCisgIC8vIEV4dGVuc2lvbjogQ29udmVyc2lvbiB0byBpbnRlZ3JhbCB0eXBlLgorCisgIGlubGluZSBsb25nIGxvbmcgZGVjaW1hbDMyX3RvX2xvbmdfbG9uZyhkZWNpbWFsMzIgX19kKQorICB7IHJldHVybiAobG9uZyBsb25nKV9fZC5fX2dldHZhbCgpOyB9CisKKyAgaW5saW5lIGxvbmcgbG9uZyBkZWNpbWFsNjRfdG9fbG9uZ19sb25nKGRlY2ltYWw2NCBfX2QpCisgIHsgcmV0dXJuIChsb25nIGxvbmcpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgbG9uZyBsb25nIGRlY2ltYWwxMjhfdG9fbG9uZ19sb25nKGRlY2ltYWwxMjggX19kKQorICB7IHJldHVybiAobG9uZyBsb25nKV9fZC5fX2dldHZhbCgpOyB9CisKKyAgaW5saW5lIGxvbmcgbG9uZyBkZWNpbWFsX3RvX2xvbmdfbG9uZyhkZWNpbWFsMzIgX19kKQorICB7IHJldHVybiAobG9uZyBsb25nKV9fZC5fX2dldHZhbCgpOyB9CisKKyAgaW5saW5lIGxvbmcgbG9uZyBkZWNpbWFsX3RvX2xvbmdfbG9uZyhkZWNpbWFsNjQgX19kKQorICB7IHJldHVybiAobG9uZyBsb25nKV9fZC5fX2dldHZhbCgpOyB9CisKKyAgaW5saW5lIGxvbmcgbG9uZyBkZWNpbWFsX3RvX2xvbmdfbG9uZyhkZWNpbWFsMTI4IF9fZCkKKyAgeyByZXR1cm4gKGxvbmcgbG9uZylfX2QuX19nZXR2YWwoKTsgfQorCisgIC8vIElTTy9JRUMgVFIgMjQ3MzMgIDMuMi41ICBJbml0aWFsaXphdGlvbiBmcm9tIGNvZWZmaWNpZW50IGFuZCBleHBvbmVudC4KKworICBzdGF0aWMgZGVjaW1hbDMyIG1ha2VfZGVjaW1hbDMyKGxvbmcgbG9uZyBfX2NvZWZmLCBpbnQgX19leHBvbmVudCkKKyAgeworICAgIGRlY2ltYWwzMiBfX2RlY2V4cCA9IDEsIF9fbXVsdGlwbGllcjsKKworICAgIGlmIChfX2V4cG9uZW50IDwgMCkKKyAgICAgIHsKKwlfX211bHRpcGxpZXIgPSAxLkUtMURGOworCV9fZXhwb25lbnQgPSAtX19leHBvbmVudDsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBfX211bHRpcGxpZXIgPSAxLkUxREY7CisKKyAgICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBfX2V4cG9uZW50OyArK19faSkKKyAgICAgIF9fZGVjZXhwICo9IF9fbXVsdGlwbGllcjsKKworICAgIHJldHVybiBfX2NvZWZmICogX19kZWNleHA7CisgIH0KKworICBzdGF0aWMgZGVjaW1hbDMyIG1ha2VfZGVjaW1hbDMyKHVuc2lnbmVkIGxvbmcgbG9uZyBfX2NvZWZmLCBpbnQgX19leHBvbmVudCkKKyAgeworICAgIGRlY2ltYWwzMiBfX2RlY2V4cCA9IDEsIF9fbXVsdGlwbGllcjsKKworICAgIGlmIChfX2V4cG9uZW50IDwgMCkKKyAgICAgIHsKKwlfX211bHRpcGxpZXIgPSAxLkUtMURGOworCV9fZXhwb25lbnQgPSAtX19leHBvbmVudDsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBfX211bHRpcGxpZXIgPSAxLkUxREY7CisKKyAgICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBfX2V4cG9uZW50OyArK19faSkKKyAgICAgIF9fZGVjZXhwICo9IF9fbXVsdGlwbGllcjsKKworICAgIHJldHVybiBfX2NvZWZmICogX19kZWNleHA7CisgIH0KKworICBzdGF0aWMgZGVjaW1hbDY0IG1ha2VfZGVjaW1hbDY0KGxvbmcgbG9uZyBfX2NvZWZmLCBpbnQgX19leHBvbmVudCkKKyAgeworICAgIGRlY2ltYWw2NCBfX2RlY2V4cCA9IDEsIF9fbXVsdGlwbGllcjsKKworICAgIGlmIChfX2V4cG9uZW50IDwgMCkKKyAgICAgIHsKKwlfX211bHRpcGxpZXIgPSAxLkUtMUREOworCV9fZXhwb25lbnQgPSAtX19leHBvbmVudDsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBfX211bHRpcGxpZXIgPSAxLkUxREQ7CisKKyAgICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBfX2V4cG9uZW50OyArK19faSkKKyAgICAgIF9fZGVjZXhwICo9IF9fbXVsdGlwbGllcjsKKworICAgIHJldHVybiBfX2NvZWZmICogX19kZWNleHA7CisgIH0KKworICBzdGF0aWMgZGVjaW1hbDY0IG1ha2VfZGVjaW1hbDY0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX2NvZWZmLCBpbnQgX19leHBvbmVudCkKKyAgeworICAgIGRlY2ltYWw2NCBfX2RlY2V4cCA9IDEsIF9fbXVsdGlwbGllcjsKKworICAgIGlmIChfX2V4cG9uZW50IDwgMCkKKyAgICAgIHsKKwlfX211bHRpcGxpZXIgPSAxLkUtMUREOworCV9fZXhwb25lbnQgPSAtX19leHBvbmVudDsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBfX211bHRpcGxpZXIgPSAxLkUxREQ7CisKKyAgICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBfX2V4cG9uZW50OyArK19faSkKKyAgICAgIF9fZGVjZXhwICo9IF9fbXVsdGlwbGllcjsKKworICAgIHJldHVybiBfX2NvZWZmICogX19kZWNleHA7CisgIH0KKworICBzdGF0aWMgZGVjaW1hbDEyOCBtYWtlX2RlY2ltYWwxMjgobG9uZyBsb25nIF9fY29lZmYsIGludCBfX2V4cG9uZW50KQorICB7CisgICAgZGVjaW1hbDEyOCBfX2RlY2V4cCA9IDEsIF9fbXVsdGlwbGllcjsKKworICAgIGlmIChfX2V4cG9uZW50IDwgMCkKKyAgICAgIHsKKwlfX211bHRpcGxpZXIgPSAxLkUtMURMOworCV9fZXhwb25lbnQgPSAtX19leHBvbmVudDsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBfX211bHRpcGxpZXIgPSAxLkUxREw7CisKKyAgICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBfX2V4cG9uZW50OyArK19faSkKKyAgICAgIF9fZGVjZXhwICo9IF9fbXVsdGlwbGllcjsKKworICAgIHJldHVybiBfX2NvZWZmICogX19kZWNleHA7CisgIH0KKworICBzdGF0aWMgZGVjaW1hbDEyOCBtYWtlX2RlY2ltYWwxMjgodW5zaWduZWQgbG9uZyBsb25nIF9fY29lZmYsIGludCBfX2V4cG9uZW50KQorICB7CisgICAgZGVjaW1hbDEyOCBfX2RlY2V4cCA9IDEsIF9fbXVsdGlwbGllcjsKKworICAgIGlmIChfX2V4cG9uZW50IDwgMCkKKyAgICAgIHsKKwlfX211bHRpcGxpZXIgPSAxLkUtMURMOworCV9fZXhwb25lbnQgPSAtX19leHBvbmVudDsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBfX211bHRpcGxpZXIgPSAxLkUxREw7CisKKyAgICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBfX2V4cG9uZW50OyArK19faSkKKyAgICAgIF9fZGVjZXhwICo9IF9fbXVsdGlwbGllcjsKKworICAgIHJldHVybiBfX2NvZWZmICogX19kZWNleHA7CisgIH0KKworICAvLyBJU08vSUVDIFRSIDI0NzMzICAzLjIuNiAgQ29udmVyc2lvbiB0byBnZW5lcmljIGZsb2F0aW5nLXBvaW50IHR5cGUuCisKKyAgaW5saW5lIGZsb2F0IGRlY2ltYWwzMl90b19mbG9hdChkZWNpbWFsMzIgX19kKQorICB7IHJldHVybiAoZmxvYXQpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgZmxvYXQgZGVjaW1hbDY0X3RvX2Zsb2F0KGRlY2ltYWw2NCBfX2QpCisgIHsgcmV0dXJuIChmbG9hdClfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBmbG9hdCBkZWNpbWFsMTI4X3RvX2Zsb2F0KGRlY2ltYWwxMjggX19kKQorICB7IHJldHVybiAoZmxvYXQpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgZmxvYXQgZGVjaW1hbF90b19mbG9hdChkZWNpbWFsMzIgX19kKQorICB7IHJldHVybiAoZmxvYXQpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgZmxvYXQgZGVjaW1hbF90b19mbG9hdChkZWNpbWFsNjQgX19kKQorICB7IHJldHVybiAoZmxvYXQpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgZmxvYXQgZGVjaW1hbF90b19mbG9hdChkZWNpbWFsMTI4IF9fZCkKKyAgeyByZXR1cm4gKGZsb2F0KV9fZC5fX2dldHZhbCgpOyB9CisKKyAgaW5saW5lIGRvdWJsZSBkZWNpbWFsMzJfdG9fZG91YmxlKGRlY2ltYWwzMiBfX2QpCisgIHsgcmV0dXJuIChkb3VibGUpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgZG91YmxlIGRlY2ltYWw2NF90b19kb3VibGUoZGVjaW1hbDY0IF9fZCkKKyAgeyByZXR1cm4gKGRvdWJsZSlfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBkb3VibGUgZGVjaW1hbDEyOF90b19kb3VibGUoZGVjaW1hbDEyOCBfX2QpCisgIHsgcmV0dXJuIChkb3VibGUpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgZG91YmxlIGRlY2ltYWxfdG9fZG91YmxlKGRlY2ltYWwzMiBfX2QpCisgIHsgcmV0dXJuIChkb3VibGUpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgZG91YmxlIGRlY2ltYWxfdG9fZG91YmxlKGRlY2ltYWw2NCBfX2QpCisgIHsgcmV0dXJuIChkb3VibGUpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgZG91YmxlIGRlY2ltYWxfdG9fZG91YmxlKGRlY2ltYWwxMjggX19kKQorICB7IHJldHVybiAoZG91YmxlKV9fZC5fX2dldHZhbCgpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlIGRlY2ltYWwzMl90b19sb25nX2RvdWJsZShkZWNpbWFsMzIgX19kKQorICB7IHJldHVybiAobG9uZyBkb3VibGUpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUgZGVjaW1hbDY0X3RvX2xvbmdfZG91YmxlKGRlY2ltYWw2NCBfX2QpCisgIHsgcmV0dXJuIChsb25nIGRvdWJsZSlfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZSBkZWNpbWFsMTI4X3RvX2xvbmdfZG91YmxlKGRlY2ltYWwxMjggX19kKQorICB7IHJldHVybiAobG9uZyBkb3VibGUpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUgZGVjaW1hbF90b19sb25nX2RvdWJsZShkZWNpbWFsMzIgX19kKQorICB7IHJldHVybiAobG9uZyBkb3VibGUpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUgZGVjaW1hbF90b19sb25nX2RvdWJsZShkZWNpbWFsNjQgX19kKQorICB7IHJldHVybiAobG9uZyBkb3VibGUpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUgZGVjaW1hbF90b19sb25nX2RvdWJsZShkZWNpbWFsMTI4IF9fZCkKKyAgeyByZXR1cm4gKGxvbmcgZG91YmxlKV9fZC5fX2dldHZhbCgpOyB9CisKKyAgLy8gSVNPL0lFQyBUUiAyNDczMyAgMy4yLjcgIFVuYXJ5IGFyaXRobWV0aWMgb3BlcmF0b3JzLgorCisjZGVmaW5lIF9ERUZJTkVfREVDSU1BTF9VTkFSWV9PUChfT3AsIF9UcCkJXAorICBpbmxpbmUgX1RwIG9wZXJhdG9yIF9PcChfVHAgX19yaHMpCQlcCisgIHsJCQkJCQlcCisgICAgX1RwIF9fdG1wOwkJCQkJXAorICAgIF9fdG1wLl9fc2V0dmFsKF9PcCBfX3Jocy5fX2dldHZhbCgpKTsJXAorICAgIHJldHVybiBfX3RtcDsJCQkJXAorICB9CisKKyAgX0RFRklORV9ERUNJTUFMX1VOQVJZX09QKCssIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX1VOQVJZX09QKCssIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX1VOQVJZX09QKCssIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9VTkFSWV9PUCgtLCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9VTkFSWV9PUCgtLCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9VTkFSWV9PUCgtLCBkZWNpbWFsMTI4KQorCisjdW5kZWYgX0RFRklORV9ERUNJTUFMX1VOQVJZX09QCisKKyAgLy8gSVNPL0lFQyBUUiAyNDczMyAgMy4yLjggIEJpbmFyeSBhcml0aG1ldGljIG9wZXJhdG9ycy4KKworI2RlZmluZSBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKF9PcCwgX1QxLCBfVDIsIF9UMykJXAorICBpbmxpbmUgX1QxIG9wZXJhdG9yIF9PcChfVDIgX19saHMsIF9UMyBfX3JocykJCQlcCisgIHsJCQkJCQkJCVwKKyAgICBfVDEgX19yZXR2YWw7CQkJCQkJXAorICAgIF9fcmV0dmFsLl9fc2V0dmFsKF9fbGhzLl9fZ2V0dmFsKCkgX09wIF9fcmhzLl9fZ2V0dmFsKCkpOwlcCisgICAgcmV0dXJuIF9fcmV0dmFsOwkJCQkJCVwKKyAgfQorCisjZGVmaW5lIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfQk9USChfT3AsIF9UMSwgX1QyLCBfVDMpCVwKKyAgaW5saW5lIF9UMSBvcGVyYXRvciBfT3AoX1QyIF9fbGhzLCBfVDMgX19yaHMpCQkJXAorICB7CQkJCQkJCQlcCisgICAgX1QxIF9fcmV0dmFsOwkJCQkJCVwKKyAgICBfX3JldHZhbC5fX3NldHZhbChfX2xocy5fX2dldHZhbCgpIF9PcCBfX3Jocy5fX2dldHZhbCgpKTsJXAorICAgIHJldHVybiBfX3JldHZhbDsJCQkJCQlcCisgIH0KKworI2RlZmluZSBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX0xIUyhfT3AsIF9UMSwgX1QyKQkJXAorICBpbmxpbmUgX1QxIG9wZXJhdG9yIF9PcChfVDEgX19saHMsIF9UMiBfX3JocykJCQlcCisgIHsJCQkJCQkJCVwKKyAgICBfVDEgX19yZXR2YWw7CQkJCQkJXAorICAgIF9fcmV0dmFsLl9fc2V0dmFsKF9fbGhzLl9fZ2V0dmFsKCkgX09wIF9fcmhzKTsJCVwKKyAgICByZXR1cm4gX19yZXR2YWw7CQkJCQkJXAorICB9CisKKyNkZWZpbmUgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9SSFMoX09wLCBfVDEsIF9UMikJCVwKKyAgaW5saW5lIF9UMSBvcGVyYXRvciBfT3AoX1QyIF9fbGhzLCBfVDEgX19yaHMpCQkJXAorICB7CQkJCQkJCQlcCisgICAgX1QxIF9fcmV0dmFsOwkJCQkJCVwKKyAgICBfX3JldHZhbC5fX3NldHZhbChfX2xocyBfT3AgX19yaHMuX19nZXR2YWwoKSk7CQlcCisgICAgcmV0dXJuIF9fcmV0dmFsOwkJCQkJCVwKKyAgfQorCisjZGVmaW5lIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoX09wLCBfVDEpCQlcCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfTEhTKF9PcCwgX1QxLCBpbnQpOwkJCVwKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9MSFMoX09wLCBfVDEsIHVuc2lnbmVkIGludCk7CVwKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9MSFMoX09wLCBfVDEsIGxvbmcpOwkJXAorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX0xIUyhfT3AsIF9UMSwgdW5zaWduZWQgbG9uZyk7CVwKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9MSFMoX09wLCBfVDEsIGxvbmcgbG9uZyk7CQlcCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfTEhTKF9PcCwgX1QxLCB1bnNpZ25lZCBsb25nIGxvbmcpOwlcCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfUkhTKF9PcCwgX1QxLCBpbnQpOwkJCVwKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9SSFMoX09wLCBfVDEsIHVuc2lnbmVkIGludCk7CVwKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9SSFMoX09wLCBfVDEsIGxvbmcpOwkJXAorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1JIUyhfT3AsIF9UMSwgdW5zaWduZWQgbG9uZyk7CVwKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9SSFMoX09wLCBfVDEsIGxvbmcgbG9uZyk7CQlcCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfUkhTKF9PcCwgX1QxLCB1bnNpZ25lZCBsb25nIGxvbmcpOwlcCisKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygrLCBkZWNpbWFsMzIsIGRlY2ltYWwzMiwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKCssIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygrLCBkZWNpbWFsNjQsIGRlY2ltYWwzMiwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCssIGRlY2ltYWw2NCwgZGVjaW1hbDY0LCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKywgZGVjaW1hbDY0LCBkZWNpbWFsNjQsIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgrLCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKywgZGVjaW1hbDEyOCwgZGVjaW1hbDMyLCBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCssIGRlY2ltYWwxMjgsIGRlY2ltYWw2NCwgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygrLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKywgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCssIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoKywgZGVjaW1hbDEyOCkKKworICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC0sIGRlY2ltYWwzMiwgZGVjaW1hbDMyLCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoLSwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC0sIGRlY2ltYWw2NCwgZGVjaW1hbDMyLCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLSwgZGVjaW1hbDY0LCBkZWNpbWFsNjQsIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygtLCBkZWNpbWFsNjQsIGRlY2ltYWw2NCwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKC0sIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygtLCBkZWNpbWFsMTI4LCBkZWNpbWFsMzIsIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLSwgZGVjaW1hbDEyOCwgZGVjaW1hbDY0LCBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC0sIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygtLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLSwgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgtLCBkZWNpbWFsMTI4KQorCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKiwgZGVjaW1hbDMyLCBkZWNpbWFsMzIsIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgqLCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKiwgZGVjaW1hbDY0LCBkZWNpbWFsMzIsIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygqLCBkZWNpbWFsNjQsIGRlY2ltYWw2NCwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCosIGRlY2ltYWw2NCwgZGVjaW1hbDY0LCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoKiwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCosIGRlY2ltYWwxMjgsIGRlY2ltYWwzMiwgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygqLCBkZWNpbWFsMTI4LCBkZWNpbWFsNjQsIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKiwgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCosIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygqLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKCosIGRlY2ltYWwxMjgpCisKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygvLCBkZWNpbWFsMzIsIGRlY2ltYWwzMiwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKC8sIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygvLCBkZWNpbWFsNjQsIGRlY2ltYWwzMiwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC8sIGRlY2ltYWw2NCwgZGVjaW1hbDY0LCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLywgZGVjaW1hbDY0LCBkZWNpbWFsNjQsIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgvLCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLywgZGVjaW1hbDEyOCwgZGVjaW1hbDMyLCBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC8sIGRlY2ltYWwxMjgsIGRlY2ltYWw2NCwgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygvLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLywgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC8sIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoLywgZGVjaW1hbDEyOCkKKworI3VuZGVmIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMKKyN1bmRlZiBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX0JPVEgKKyN1bmRlZiBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX0xIUworI3VuZGVmIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfUkhTCisjdW5kZWYgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVAorCisgIC8vIElTTy9JRUMgVFIgMjQ3MzMgIDMuMi45ICBDb21wYXJpc29uIG9wZXJhdG9ycy4KKworI2RlZmluZSBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9CT1RIKF9PcCwgX1QxLCBfVDIpCVwKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IgX09wKF9UMSBfX2xocywgX1QyIF9fcmhzKQlcCisgIHsgcmV0dXJuIF9fbGhzLl9fZ2V0dmFsKCkgX09wIF9fcmhzLl9fZ2V0dmFsKCk7IH0KKworI2RlZmluZSBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9MSFMoX09wLCBfVDEsIF9UMikJXAorICBpbmxpbmUgYm9vbCBvcGVyYXRvciBfT3AoX1QxIF9fbGhzLCBfVDIgX19yaHMpCVwKKyAgeyByZXR1cm4gX19saHMuX19nZXR2YWwoKSBfT3AgX19yaHM7IH0KKworI2RlZmluZSBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9SSFMoX09wLCBfVDEsIF9UMikJXAorICBpbmxpbmUgYm9vbCBvcGVyYXRvciBfT3AoX1QxIF9fbGhzLCBfVDIgX19yaHMpCVwKKyAgeyByZXR1cm4gX19saHMgX09wIF9fcmhzLl9fZ2V0dmFsKCk7IH0KKworI2RlZmluZSBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTlMoX09wLCBfVHApCQkJXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9CT1RIKF9PcCwgX1RwLCBkZWNpbWFsMzIpCQlcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX0JPVEgoX09wLCBfVHAsIGRlY2ltYWw2NCkJCVwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fQk9USChfT3AsIF9UcCwgZGVjaW1hbDEyOCkJCVwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fTEhTKF9PcCwgX1RwLCBpbnQpCQkJXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9MSFMoX09wLCBfVHAsIHVuc2lnbmVkIGludCkJXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9MSFMoX09wLCBfVHAsIGxvbmcpCQlcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX0xIUyhfT3AsIF9UcCwgdW5zaWduZWQgbG9uZykJXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9MSFMoX09wLCBfVHAsIGxvbmcgbG9uZykJCVwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fTEhTKF9PcCwgX1RwLCB1bnNpZ25lZCBsb25nIGxvbmcpCVwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fUkhTKF9PcCwgaW50LCBfVHApCQkJXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9SSFMoX09wLCB1bnNpZ25lZCBpbnQsIF9UcCkJXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9SSFMoX09wLCBsb25nLCBfVHApCQlcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX1JIUyhfT3AsIHVuc2lnbmVkIGxvbmcsIF9UcCkJXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9SSFMoX09wLCBsb25nIGxvbmcsIF9UcCkJCVwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fUkhTKF9PcCwgdW5zaWduZWQgbG9uZyBsb25nLCBfVHApCisKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05TKD09LCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OUyg9PSwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTlMoPT0sIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OUyghPSwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTlMoIT0sIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05TKCE9LCBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTlMoPCwgIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05TKDwsICBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OUyg8LCAgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05TKDw9LCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OUyg8PSwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTlMoPD0sIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OUyg+LCAgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTlMoPiwgIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05TKD4sICBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTlMoPj0sIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05TKD49LCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OUyg+PSwgZGVjaW1hbDEyOCkKKworI3VuZGVmIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX0JPVEgKKyN1bmRlZiBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9MSFMKKyN1bmRlZiBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9SSFMKKyN1bmRlZiBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTlMKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBkZWNpbWFsCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8qIF9HTElCQ1hYX0RFQ0lNQUxfSU1QTCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9kZXF1ZSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVxdWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1ODlkNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZGVxdWUKQEAgLTAsMCArMSw3NiBAQAorLy8gPGRlcXVlPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGluY2x1ZGUvZGVxdWUKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVRVUUKKyNkZWZpbmUgX0dMSUJDWFhfREVRVUUgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPgorI2luY2x1ZGUgPGJpdHMvYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfY29uc3RydWN0Lmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfdW5pbml0aWFsaXplZC5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2RlcXVlLmg+CisjaW5jbHVkZSA8Yml0cy9yYW5nZV9hY2Nlc3MuaD4KKyNpbmNsdWRlIDxiaXRzL2RlcXVlLnRjYz4KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjIGluY2x1ZGUgPGRlYnVnL2RlcXVlPgorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9QUk9GSUxFCisjIGluY2x1ZGUgPHByb2ZpbGUvZGVxdWU+CisjZW5kaWYKKworI2VuZGlmIC8qIF9HTElCQ1hYX0RFUVVFICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4Y2VwdGlvbiBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXhjZXB0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMGNkYTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4Y2VwdGlvbgpAQCAtMCwwICsxLDE1NiBAQAorLy8gRXhjZXB0aW9uIEhhbmRsaW5nIHN1cHBvcnQgaGVhZGVyIGZvciAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisvLworLy8gR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisvLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleGNlcHRpb24KKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX19FWENFUFRJT05fXworI2RlZmluZSBfX0VYQ0VQVElPTl9fCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwdXNoKGRlZmF1bHQpCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvYXRvbWljX2xvY2tmcmVlX2RlZmluZXMuaD4KKworZXh0ZXJuICJDKysiIHsKKworbmFtZXNwYWNlIHN0ZAoreworICAvKioKKyAgICogQGRlZmdyb3VwIGV4Y2VwdGlvbnMgRXhjZXB0aW9ucworICAgKiBAaW5ncm91cCBkaWFnbm9zdGljcworICAgKgorICAgKiBDbGFzc2VzIGFuZCBmdW5jdGlvbnMgZm9yIHJlcG9ydGluZyBlcnJvcnMgdmlhIGV4Y2VwdGlvbiBjbGFzc2VzLgorICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogIEBicmllZiBCYXNlIGNsYXNzIGZvciBhbGwgbGlicmFyeSBleGNlcHRpb25zLgorICAgKgorICAgKiAgVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSBzdGFuZGFyZAorICAgKiAgbGlicmFyeSwgYW5kIGJ5IGNlcnRhaW4gbGFuZ3VhZ2UgZXhwcmVzc2lvbnMuICBZb3UgYXJlIGZyZWUgdG8gZGVyaXZlCisgICAqICB5b3VyIG93biAlZXhjZXB0aW9uIGNsYXNzZXMsIG9yIHVzZSBhIGRpZmZlcmVudCBoaWVyYXJjaHksIG9yIHRvCisgICAqICB0aHJvdyBub24tY2xhc3MgZGF0YSAoZS5nLiwgZnVuZGFtZW50YWwgdHlwZXMpLgorICAgKi8KKyAgY2xhc3MgZXhjZXB0aW9uCisgIHsKKyAgcHVibGljOgorICAgIGV4Y2VwdGlvbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IH0KKyAgICB2aXJ0dWFsIH5leGNlcHRpb24oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisKKyAgICAvKiogUmV0dXJucyBhIEMtc3R5bGUgY2hhcmFjdGVyIHN0cmluZyBkZXNjcmliaW5nIHRoZSBnZW5lcmFsIGNhdXNlCisgICAgICogIG9mIHRoZSBjdXJyZW50IGVycm9yLiAgKi8KKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisgIH07CisKKyAgLyoqIElmIGFuICVleGNlcHRpb24gaXMgdGhyb3duIHdoaWNoIGlzIG5vdCBsaXN0ZWQgaW4gYSBmdW5jdGlvbidzCisgICAqICAlZXhjZXB0aW9uIHNwZWNpZmljYXRpb24sIG9uZSBvZiB0aGVzZSBtYXkgYmUgdGhyb3duLiAgKi8KKyAgY2xhc3MgYmFkX2V4Y2VwdGlvbiA6IHB1YmxpYyBleGNlcHRpb24KKyAgeworICBwdWJsaWM6CisgICAgYmFkX2V4Y2VwdGlvbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IH0KKworICAgIC8vIFRoaXMgZGVjbGFyYXRpb24gaXMgbm90IHVzZWxlc3M6CisgICAgLy8gaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjLTMuMC4yL2djY182Lmh0bWwjU0VDMTE4CisgICAgdmlydHVhbCB+YmFkX2V4Y2VwdGlvbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKworICAgIC8vIFNlZSBjb21tZW50IGluIGVoX2V4Y2VwdGlvbi5jYy4KKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisgIH07CisKKyAgLy8vIElmIHlvdSB3cml0ZSBhIHJlcGxhY2VtZW50ICV0ZXJtaW5hdGUgaGFuZGxlciwgaXQgbXVzdCBiZSBvZiB0aGlzIHR5cGUuCisgIHR5cGVkZWYgdm9pZCAoKnRlcm1pbmF0ZV9oYW5kbGVyKSAoKTsKKworICAvLy8gSWYgeW91IHdyaXRlIGEgcmVwbGFjZW1lbnQgJXVuZXhwZWN0ZWQgaGFuZGxlciwgaXQgbXVzdCBiZSBvZiB0aGlzIHR5cGUuCisgIHR5cGVkZWYgdm9pZCAoKnVuZXhwZWN0ZWRfaGFuZGxlcikgKCk7CisKKyAgLy8vIFRha2VzIGEgbmV3IGhhbmRsZXIgZnVuY3Rpb24gYXMgYW4gYXJndW1lbnQsIHJldHVybnMgdGhlIG9sZCBmdW5jdGlvbi4KKyAgdGVybWluYXRlX2hhbmRsZXIgc2V0X3Rlcm1pbmF0ZSh0ZXJtaW5hdGVfaGFuZGxlcikgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworCisgIC8qKiBUaGUgcnVudGltZSB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBpZiAlZXhjZXB0aW9uIGhhbmRsaW5nIG11c3QgYmUKKyAgICogIGFiYW5kb25lZCBmb3IgYW55IHJlYXNvbi4gIEl0IGNhbiBhbHNvIGJlIGNhbGxlZCBieSB0aGUgdXNlci4gICovCisgIHZvaWQgdGVybWluYXRlKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKworICAvLy8gVGFrZXMgYSBuZXcgaGFuZGxlciBmdW5jdGlvbiBhcyBhbiBhcmd1bWVudCwgcmV0dXJucyB0aGUgb2xkIGZ1bmN0aW9uLgorICB1bmV4cGVjdGVkX2hhbmRsZXIgc2V0X3VuZXhwZWN0ZWQodW5leHBlY3RlZF9oYW5kbGVyKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisKKyAgLyoqIFRoZSBydW50aW1lIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIGlmIGFuICVleGNlcHRpb24gaXMgdGhyb3duIHdoaWNoCisgICAqICB2aW9sYXRlcyB0aGUgZnVuY3Rpb24ncyAlZXhjZXB0aW9uIHNwZWNpZmljYXRpb24uICAqLworICB2b2lkIHVuZXhwZWN0ZWQoKSBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CisKKyAgLyoqIFsxOC42LjRdLzE6ICAnUmV0dXJucyB0cnVlIGFmdGVyIGNvbXBsZXRpbmcgZXZhbHVhdGlvbiBvZiBhCisgICAqICB0aHJvdy1leHByZXNzaW9uIHVudGlsIGVpdGhlciBjb21wbGV0aW5nIGluaXRpYWxpemF0aW9uIG9mIHRoZQorICAgKiAgZXhjZXB0aW9uLWRlY2xhcmF0aW9uIGluIHRoZSBtYXRjaGluZyBoYW5kbGVyIG9yIGVudGVyaW5nIEBjIHVuZXhwZWN0ZWQoKQorICAgKiAgZHVlIHRvIHRoZSB0aHJvdzsgb3IgYWZ0ZXIgZW50ZXJpbmcgQGMgdGVybWluYXRlKCkgZm9yIGFueSByZWFzb24KKyAgICogIG90aGVyIHRoYW4gYW4gZXhwbGljaXQgY2FsbCB0byBAYyB0ZXJtaW5hdGUoKS4gIFtOb3RlOiBUaGlzIGluY2x1ZGVzCisgICAqICBzdGFjayB1bndpbmRpbmcgWzE1LjJdLiAgZW5kIG5vdGVdJworICAgKgorICAgKiAgMjogJ1doZW4gQGMgdW5jYXVnaHRfZXhjZXB0aW9uKCkgaXMgdHJ1ZSwgdGhyb3dpbmcgYW4KKyAgICogICVleGNlcHRpb24gY2FuIHJlc3VsdCBpbiBhIGNhbGwgb2YgQGMgdGVybWluYXRlKCkKKyAgICogICgxNS41LjEpLicKKyAgICovCisgIGJvb2wgdW5jYXVnaHRfZXhjZXB0aW9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOworCisgIC8vIEB9IGdyb3VwIGV4Y2VwdGlvbnMKK30gLy8gbmFtZXNwYWNlIHN0ZAorCituYW1lc3BhY2UgX19nbnVfY3h4Cit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmIEEgcmVwbGFjZW1lbnQgZm9yIHRoZSBzdGFuZGFyZCB0ZXJtaW5hdGVfaGFuZGxlciB3aGljaAorICAgKiAgcHJpbnRzIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRlcm1pbmF0aW5nIGV4Y2VwdGlvbiAoaWYgYW55KQorICAgKiAgb24gc3RkZXJyLgorICAgKgorICAgKiAgQGluZ3JvdXAgZXhjZXB0aW9ucworICAgKgorICAgKiAgQ2FsbAorICAgKiAgIEBjb2RlCisgICAqICAgICBzdGQ6OnNldF90ZXJtaW5hdGUoX19nbnVfY3h4OjpfX3ZlcmJvc2VfdGVybWluYXRlX2hhbmRsZXIpCisgICAqICAgQGVuZGNvZGUKKyAgICogIHRvIHVzZS4gIEZvciBtb3JlIGluZm8sIHNlZQorICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQwMmNoMDZzMDIuaHRtbAorICAgKgorICAgKiAgSW4gMy40IGFuZCBsYXRlciwgdGhpcyBpcyBvbiBieSBkZWZhdWx0LgorICAgKi8KKyAgdm9pZCBfX3ZlcmJvc2VfdGVybWluYXRlX2hhbmRsZXIoKTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCit9IC8vIGV4dGVybiAiQysrIgorCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHBvcAorCisjaWYgKF9fY3BsdXNwbHVzID49IDIwMTEwM0wpICYmIChBVE9NSUNfSU5UX0xPQ0tfRlJFRSA+IDEpCisjaW5jbHVkZSA8Yml0cy9leGNlcHRpb25fcHRyLmg+CisjaW5jbHVkZSA8Yml0cy9uZXN0ZWRfZXhjZXB0aW9uLmg+CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9hbGdvcml0aG0gYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9hbGdvcml0aG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjMzNiNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2FsZ29yaXRobQpAQCAtMCwwICsxLDYwMyBAQAorLy8gQWxnb3JpdGhtIGV4dGVuc2lvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBleHQvYWxnb3JpdGhtCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkgKHBvc3NpYmx5CisgKiAgY29udGFpbmluZyBleHRlbnNpb25zIGZyb20gdGhlIEhQL1NHSSBTVEwgc3Vic2V0KS4KKyAqLworCisjaWZuZGVmIF9FWFRfQUxHT1JJVEhNCisjZGVmaW5lIF9FWFRfQUxHT1JJVEhNIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgc3RkOjpwdHJkaWZmX3Q7CisgIHVzaW5nIHN0ZDo6bWluOworICB1c2luZyBzdGQ6OnBhaXI7CisgIHVzaW5nIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnOworICB1c2luZyBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnOworICB1c2luZyBzdGQ6Oml0ZXJhdG9yX3RyYWl0czsKKworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIGNvcHlfbiAobm90IHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZCkKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBwYWlyPF9JbnB1dEl0ZXJhdG9yLCBfT3V0cHV0SXRlcmF0b3I+CisgICAgX19jb3B5X24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19jb3VudCwKKwkgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKwkgICAgIGlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBmb3IgKCA7IF9fY291bnQgPiAwOyAtLV9fY291bnQpCisJeworCSAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisJICArK19fcmVzdWx0OworCX0KKyAgICAgIHJldHVybiBwYWlyPF9JbnB1dEl0ZXJhdG9yLCBfT3V0cHV0SXRlcmF0b3I+KF9fZmlyc3QsIF9fcmVzdWx0KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgaW5saW5lIHBhaXI8X1JBSXRlcmF0b3IsIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBfX2NvcHlfbihfUkFJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LAorCSAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorCSAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgX1JBSXRlcmF0b3IgX19sYXN0ID0gX19maXJzdCArIF9fY291bnQ7CisgICAgICByZXR1cm4gcGFpcjxfUkFJdGVyYXRvciwgX091dHB1dEl0ZXJhdG9yPihfX2xhc3QsIHN0ZDo6Y29weShfX2ZpcnN0LAorCQkJCQkJCQkgIF9fbGFzdCwKKwkJCQkJCQkJICBfX3Jlc3VsdCkpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBDb3BpZXMgdGhlIHJhbmdlIFtmaXJzdCxmaXJzdCtjb3VudCkgaW50byBbcmVzdWx0LHJlc3VsdCtjb3VudCkuCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2NvdW50ICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGNvcHkuCisgICAqICBAcGFyYW0gIF9fcmVzdWx0IEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gICBBIHN0ZDo6cGFpciBjb21wb3NlZCBvZiBmaXJzdCtjb3VudCBhbmQgcmVzdWx0K2NvdW50LgorICAgKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgVGhpcyBpbmxpbmUgZnVuY3Rpb24gd2lsbCBib2lsIGRvd24gdG8gYSBjYWxsIHRvIEBjIG1lbW1vdmUgd2hlbmV2ZXIKKyAgICogIHBvc3NpYmxlLiAgRmFpbGluZyB0aGF0LCBpZiByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycyBhcmUgcGFzc2VkLCB0aGVuIHRoZQorICAgKiAgbG9vcCBjb3VudCB3aWxsIGJlIGtub3duIChhbmQgdGhlcmVmb3JlIGEgY2FuZGlkYXRlIGZvciBjb21waWxlcgorICAgKiAgb3B0aW1pemF0aW9ucyBzdWNoIGFzIHVucm9sbGluZykuCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBwYWlyPF9JbnB1dEl0ZXJhdG9yLCBfT3V0cHV0SXRlcmF0b3I+CisgICAgY29weV9uKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fY291bnQsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorCisgICAgICByZXR1cm4gX19nbnVfY3h4OjpfX2NvcHlfbihfX2ZpcnN0LCBfX2NvdW50LCBfX3Jlc3VsdCwKKwkJCQkgc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjI+CisgICAgaW50CisgICAgX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwKKwkJCQkgICBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkJCQkgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsCisJCQkJICAgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIpCisgICAgeworICAgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwl7CisJICBpZiAoKl9fZmlyc3QxIDwgKl9fZmlyc3QyKQorCSAgICByZXR1cm4gLTE7CisJICBpZiAoKl9fZmlyc3QyIDwgKl9fZmlyc3QxKQorCSAgICByZXR1cm4gMTsKKwkgICsrX19maXJzdDE7CisJICArK19fZmlyc3QyOworCX0KKyAgICAgIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQorCXJldHVybiAhKF9fZmlyc3QxID09IF9fbGFzdDEpOworICAgICAgZWxzZQorCXJldHVybiAtMTsKKyAgICB9CisKKyAgaW5saW5lIGludAorICBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoY29uc3QgdW5zaWduZWQgY2hhciogX19maXJzdDEsCisJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fbGFzdDEsCisJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fZmlyc3QyLAorCQkJCSBjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2xhc3QyKQorICB7CisgICAgY29uc3QgcHRyZGlmZl90IF9fbGVuMSA9IF9fbGFzdDEgLSBfX2ZpcnN0MTsKKyAgICBjb25zdCBwdHJkaWZmX3QgX19sZW4yID0gX19sYXN0MiAtIF9fZmlyc3QyOworICAgIGNvbnN0IGludCBfX3Jlc3VsdCA9IF9fYnVpbHRpbl9tZW1jbXAoX19maXJzdDEsIF9fZmlyc3QyLAorCQkJCQkgIG1pbihfX2xlbjEsIF9fbGVuMikpOworICAgIHJldHVybiBfX3Jlc3VsdCAhPSAwID8gX19yZXN1bHQKKwkJCSA6IChfX2xlbjEgPT0gX19sZW4yID8gMCA6IChfX2xlbjEgPCBfX2xlbjIgPyAtMSA6IDEpKTsKKyAgfQorCisgIGlubGluZSBpbnQKKyAgX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KGNvbnN0IGNoYXIqIF9fZmlyc3QxLCBjb25zdCBjaGFyKiBfX2xhc3QxLAorCQkJCSBjb25zdCBjaGFyKiBfX2ZpcnN0MiwgY29uc3QgY2hhciogX19sYXN0MikKKyAgeworI2lmIENIQVJfTUFYID09IFNDSEFSX01BWAorICAgIHJldHVybiBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoKGNvbnN0IHNpZ25lZCBjaGFyKikgX19maXJzdDEsCisJCQkJCSAgKGNvbnN0IHNpZ25lZCBjaGFyKikgX19sYXN0MSwKKwkJCQkJICAoY29uc3Qgc2lnbmVkIGNoYXIqKSBfX2ZpcnN0MiwKKwkJCQkJICAoY29uc3Qgc2lnbmVkIGNoYXIqKSBfX2xhc3QyKTsKKyNlbHNlCisgICAgcmV0dXJuIF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheSgoY29uc3QgdW5zaWduZWQgY2hhciopIF9fZmlyc3QxLAorCQkJCQkgIChjb25zdCB1bnNpZ25lZCBjaGFyKikgX19sYXN0MSwKKwkJCQkJICAoY29uc3QgdW5zaWduZWQgY2hhciopIF9fZmlyc3QyLAorCQkJCQkgIChjb25zdCB1bnNpZ25lZCBjaGFyKikgX19sYXN0Mik7CisjZW5kaWYKKyAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIEBjIG1lbWNtcCBvbiBzdGVyb2lkcy4KKyAgICogIEBwYXJhbSAgX19maXJzdDEgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2xhc3QxICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIF9fZmlyc3QyICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgX19sYXN0MiAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgIEFuIGludCwgYXMgd2l0aCBAYyBtZW1jbXAuCisgICAqCisgICAqICBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgbGVzcyB0aGFuIHplcm8gaWYgdGhlIGZpcnN0IHJhbmdlIGlzCisgICAqICA8ZW0+bGV4aWdyYXBoaWNhbGx5IGxlc3MgdGhhbjwvZW0+IHRoZSBzZWNvbmQsIGdyZWF0ZXIgdGhhbiB6ZXJvCisgICAqICBpZiB0aGUgc2Vjb25kIHJhbmdlIGlzIDxlbT5sZXhpZ3JhcGhpY2FsbHkgbGVzcyB0aGFuPC9lbT4gdGhlCisgICAqICBmaXJzdCwgYW5kIHplcm8gb3RoZXJ3aXNlLgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMj4KKyAgICBpbnQKKyAgICBsZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwKKwkJCQkgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJCQkJIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwKKwkJCQkgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IyPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QyLCBfX2xhc3QyKTsKKworICAgICAgcmV0dXJuIF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsCisJCQkJCSAgICBfX2xhc3QyKTsKKyAgICB9CisKKyAgLy8gY291bnQgYW5kIGNvdW50X2lmOiB0aGlzIHZlcnNpb24sIHdob3NlIHJldHVybiB0eXBlIGlzIHZvaWQsIHdhcyBwcmVzZW50CisgIC8vIGluIHRoZSBIUCBTVEwsIGFuZCBpcyByZXRhaW5lZCBhcyBhbiBleHRlbnNpb24gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TaXplPgorICAgIHZvaWQKKyAgICBjb3VudChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICBjb25zdCBfVHAmIF9fdmFsdWUsCisJICBfU2l6ZSYgX19uKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRXF1YWxpdHlDb21wYXJhYmxlQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSA+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9FcXVhbGl0eUNvbXBhcmFibGVDb25jZXB0PF9UcD4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCWlmICgqX19maXJzdCA9PSBfX3ZhbHVlKQorCSAgKytfX247CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfU2l6ZT4KKyAgICB2b2lkCisgICAgY291bnRfaWYoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsCisJICAgICBfU2l6ZSYgX19uKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfVW5hcnlQcmVkaWNhdGVDb25jZXB0PF9QcmVkaWNhdGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwlpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKwkgICsrX19uOworICAgIH0KKworICAvLyByYW5kb21fc2FtcGxlIGFuZCByYW5kb21fc2FtcGxlX24gKGV4dGVuc2lvbnMsIG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZCkuCisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAZG9jdG9kbworICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX0Rpc3RhbmNlPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHJhbmRvbV9zYW1wbGVfbihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19vdXQsIGNvbnN0IF9EaXN0YW5jZSBfX24pCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBfRGlzdGFuY2UgX19yZW1haW5pbmcgPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBfRGlzdGFuY2UgX19tID0gbWluKF9fbiwgX19yZW1haW5pbmcpOworCisgICAgICB3aGlsZSAoX19tID4gMCkKKwl7CisJICBpZiAoKHN0ZDo6cmFuZCgpICUgX19yZW1haW5pbmcpIDwgX19tKQorCSAgICB7CisJICAgICAgKl9fb3V0ID0gKl9fZmlyc3Q7CisJICAgICAgKytfX291dDsKKwkgICAgICAtLV9fbTsKKwkgICAgfQorCSAgLS1fX3JlbWFpbmluZzsKKwkgICsrX19maXJzdDsKKwl9CisgICAgICByZXR1cm4gX19vdXQ7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9EaXN0YW5jZSwgdHlwZW5hbWUgX1JhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICByYW5kb21fc2FtcGxlX24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19vdXQsIGNvbnN0IF9EaXN0YW5jZSBfX24sCisJCSAgIF9SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fcmFuZCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCQl0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9VbmFyeUZ1bmN0aW9uQ29uY2VwdDwKKwkJX1JhbmRvbU51bWJlckdlbmVyYXRvciwgX0Rpc3RhbmNlLCBfRGlzdGFuY2U+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIF9EaXN0YW5jZSBfX3JlbWFpbmluZyA9IHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIF9EaXN0YW5jZSBfX20gPSBtaW4oX19uLCBfX3JlbWFpbmluZyk7CisKKyAgICAgIHdoaWxlIChfX20gPiAwKQorCXsKKwkgIGlmIChfX3JhbmQoX19yZW1haW5pbmcpIDwgX19tKQorCSAgICB7CisJICAgICAgKl9fb3V0ID0gKl9fZmlyc3Q7CisJICAgICAgKytfX291dDsKKwkgICAgICAtLV9fbTsKKwkgICAgfQorCSAgLS1fX3JlbWFpbmluZzsKKwkgICsrX19maXJzdDsKKwl9CisgICAgICByZXR1cm4gX19vdXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX0Rpc3RhbmNlPgorICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcgorICAgIF9fcmFuZG9tX3NhbXBsZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19vdXQsCisJCSAgICBjb25zdCBfRGlzdGFuY2UgX19uKQorICAgIHsKKyAgICAgIF9EaXN0YW5jZSBfX20gPSAwOworICAgICAgX0Rpc3RhbmNlIF9fdCA9IF9fbjsKKyAgICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19tIDwgX19uOyArK19fbSwgKytfX2ZpcnN0KQorCV9fb3V0W19fbV0gPSAqX19maXJzdDsKKworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgICsrX190OworCSAgX0Rpc3RhbmNlIF9fTSA9IHN0ZDo6cmFuZCgpICUgKF9fdCk7CisJICBpZiAoX19NIDwgX19uKQorCSAgICBfX291dFtfX01dID0gKl9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisJfQorICAgICAgcmV0dXJuIF9fb3V0ICsgX19tOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SYW5kb21OdW1iZXJHZW5lcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IKKyAgICBfX3JhbmRvbV9zYW1wbGUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fb3V0LAorCQkgICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYgX19yYW5kLAorCQkgICAgY29uc3QgX0Rpc3RhbmNlIF9fbikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9VbmFyeUZ1bmN0aW9uQ29uY2VwdDwKKwkgICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciwgX0Rpc3RhbmNlLCBfRGlzdGFuY2U+KQorCisgICAgICBfRGlzdGFuY2UgX19tID0gMDsKKyAgICAgIF9EaXN0YW5jZSBfX3QgPSBfX247CisgICAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0ICYmIF9fbSA8IF9fbjsgKytfX20sICsrX19maXJzdCkKKwlfX291dFtfX21dID0gKl9fZmlyc3Q7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICArK19fdDsKKwkgIF9EaXN0YW5jZSBfX00gPSBfX3JhbmQoX190KTsKKwkgIGlmIChfX00gPCBfX24pCisJICAgIF9fb3V0W19fTV0gPSAqX19maXJzdDsKKwkgICsrX19maXJzdDsKKwl9CisgICAgICByZXR1cm4gX19vdXQgKyBfX207CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBpbmxpbmUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCisgICAgcmFuZG9tX3NhbXBsZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fb3V0X2ZpcnN0LAorCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX291dF9sYXN0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX291dF9maXJzdCwgX19vdXRfbGFzdCk7CisKKyAgICAgIHJldHVybiBfX3JhbmRvbV9zYW1wbGUoX19maXJzdCwgX19sYXN0LAorCQkJICAgICBfX291dF9maXJzdCwgX19vdXRfbGFzdCAtIF9fb3V0X2ZpcnN0KTsKKyAgICB9CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAZG9jdG9kbworICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgaW5saW5lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcgorICAgIHJhbmRvbV9zYW1wbGUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX291dF9maXJzdCwKKwkJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19vdXRfbGFzdCwKKwkJICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3JhbmQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fb3V0X2ZpcnN0LCBfX291dF9sYXN0KTsKKworICAgICAgcmV0dXJuIF9fcmFuZG9tX3NhbXBsZShfX2ZpcnN0LCBfX2xhc3QsCisJCQkgICAgIF9fb3V0X2ZpcnN0LCBfX3JhbmQsCisJCQkgICAgIF9fb3V0X2xhc3QgLSBfX291dF9maXJzdCk7CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB1c2luZyBzdGQ6OmlzX2hlYXA7CisjZWxzZQorICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIGlzX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHJldHVybiBzdGQ6Ol9faXNfaGVhcChfX2ZpcnN0LCBfX2xhc3QgLSBfX2ZpcnN0KTsKKyAgICB9CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAZG9jdG9kbworICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgICAgaW5saW5lIGJvb2wKKyAgICBpc19oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCSAgICBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9TdHJpY3RXZWFrT3JkZXJpbmcsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgcmV0dXJuIHN0ZDo6X19pc19oZWFwKF9fZmlyc3QsIF9fY29tcCwgX19sYXN0IC0gX19maXJzdCk7CisgICAgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHVzaW5nIHN0ZDo6aXNfc29ydGVkOworI2Vsc2UKKyAgLy8gaXNfc29ydGVkLCBhIHByZWRpY2F0ZWQgdGVzdGluZyB3aGV0aGVyIGEgcmFuZ2UgaXMgc29ydGVkIGluCisgIC8vIG5vbmRlc2NlbmRpbmcgb3JkZXIuICBUaGlzIGlzIGFuIGV4dGVuc2lvbiwgbm90IHBhcnQgb2YgdGhlIEMrKworICAvLyBzdGFuZGFyZC4KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgYm9vbAorICAgIGlzX3NvcnRlZChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiB0cnVlOworCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICBmb3IgKCsrX19uZXh0OyBfX25leHQgIT0gX19sYXN0OyBfX2ZpcnN0ID0gX19uZXh0LCArK19fbmV4dCkKKwlpZiAoKl9fbmV4dCA8ICpfX2ZpcnN0KQorCSAgcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgICBib29sCisgICAgaXNfc29ydGVkKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfU3RyaWN0V2Vha09yZGVyaW5nLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiB0cnVlOworCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICBmb3IgKCsrX19uZXh0OyBfX25leHQgIT0gX19sYXN0OyBfX2ZpcnN0ID0gX19uZXh0LCArK19fbmV4dCkKKwlpZiAoX19jb21wKCpfX25leHQsICpfX2ZpcnN0KSkKKwkgIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyNlbmRpZiAgLy8gQysrMTEKKworICAvKioKKyAgICogIEBicmllZiBGaW5kIHRoZSBtZWRpYW4gb2YgdGhyZWUgdmFsdWVzLgorICAgKiAgQHBhcmFtICBfX2EgIEEgdmFsdWUuCisgICAqICBAcGFyYW0gIF9fYiAgQSB2YWx1ZS4KKyAgICogIEBwYXJhbSAgX19jICBBIHZhbHVlLgorICAgKiAgQHJldHVybiBPbmUgb2YgQHAgYSwgQHAgYiBvciBAcCBjLgorICAgKgorICAgKiAgSWYgQGMge2wsbSxufSBpcyBzb21lIGNvbnZvbHV0aW9uIG9mIEBwIHthLGIsY30gc3VjaCB0aGF0IEBjIGw8PW08PW4KKyAgICogIHRoZW4gdGhlIHZhbHVlIHJldHVybmVkIHdpbGwgYmUgQGMgbS4KKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0IF9UcCYKKyAgICBfX21lZGlhbihjb25zdCBfVHAmIF9fYSwgY29uc3QgX1RwJiBfX2IsIGNvbnN0IF9UcCYgX19jKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQ8X1RwPikKKyAgICAgIGlmIChfX2EgPCBfX2IpCisJaWYgKF9fYiA8IF9fYykKKwkgIHJldHVybiBfX2I7CisJZWxzZSBpZiAoX19hIDwgX19jKQorCSAgcmV0dXJuIF9fYzsKKwllbHNlCisJICByZXR1cm4gX19hOworICAgICAgZWxzZSBpZiAoX19hIDwgX19jKQorCXJldHVybiBfX2E7CisgICAgICBlbHNlIGlmIChfX2IgPCBfX2MpCisJcmV0dXJuIF9fYzsKKyAgICAgIGVsc2UKKwlyZXR1cm4gX19iOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBGaW5kIHRoZSBtZWRpYW4gb2YgdGhyZWUgdmFsdWVzIHVzaW5nIGEgcHJlZGljYXRlIGZvciBjb21wYXJpc29uLgorICAgKiAgQHBhcmFtICBfX2EgICAgIEEgdmFsdWUuCisgICAqICBAcGFyYW0gIF9fYiAgICAgQSB2YWx1ZS4KKyAgICogIEBwYXJhbSAgX19jICAgICBBIHZhbHVlLgorICAgKiAgQHBhcmFtICBfX2NvbXAgIEEgYmluYXJ5IHByZWRpY2F0ZS4KKyAgICogIEByZXR1cm4gT25lIG9mIEBwIGEsIEBwIGIgb3IgQHAgYy4KKyAgICoKKyAgICogIElmIEBjIHtsLG0sbn0gaXMgc29tZSBjb252b2x1dGlvbiBvZiBAcCB7YSxiLGN9IHN1Y2ggdGhhdCBAcCBjb21wKGwsbSkKKyAgICogIGFuZCBAcCBjb21wKG0sbikgYXJlIGJvdGggdHJ1ZSB0aGVuIHRoZSB2YWx1ZSByZXR1cm5lZCB3aWxsIGJlIEBjIG0uCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgY29uc3QgX1RwJgorICAgIF9fbWVkaWFuKGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYiwgY29uc3QgX1RwJiBfX2MsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlGdW5jdGlvbkNvbmNlcHQ8X0NvbXBhcmUsIGJvb2wsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgIF9UcCwgX1RwPikKKyAgICAgIGlmIChfX2NvbXAoX19hLCBfX2IpKQorCWlmIChfX2NvbXAoX19iLCBfX2MpKQorCSAgcmV0dXJuIF9fYjsKKwllbHNlIGlmIChfX2NvbXAoX19hLCBfX2MpKQorCSAgcmV0dXJuIF9fYzsKKwllbHNlCisJICByZXR1cm4gX19hOworICAgICAgZWxzZSBpZiAoX19jb21wKF9fYSwgX19jKSkKKwlyZXR1cm4gX19hOworICAgICAgZWxzZSBpZiAoX19jb21wKF9fYiwgX19jKSkKKwlyZXR1cm4gX19jOworICAgICAgZWxzZQorCXJldHVybiBfX2I7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfRVhUX0FMR09SSVRITSAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvYWxsb2NfdHJhaXRzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9hbGxvY190cmFpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzM0NzNhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvYWxsb2NfdHJhaXRzLmgKQEAgLTAsMCArMSwyNDIgQEAKKy8vIEFsbG9jYXRvciB0cmFpdHMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9hbGxvY190cmFpdHMuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0VYVF9BTExPQ19UUkFJVFNfSAorI2RlZmluZSBfRVhUX0FMTE9DX1RSQUlUU19IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL21vdmUuaD4KKyMgaW5jbHVkZSA8Yml0cy9hbGxvY190cmFpdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGJpdHMvYWxsb2NhdG9yLmg+ICAvLyBmb3IgX19hbGxvY19zd2FwCisjZW5kaWYKKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IF9fYWxsb2NhdG9yX2Fsd2F5c19jb21wYXJlc19lcXVhbAorICAgIHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgY29uc3QgYm9vbCBfX2FsbG9jYXRvcl9hbHdheXNfY29tcGFyZXNfZXF1YWw8X0FsbG9jPjo6dmFsdWU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2FsbG9jYXRvcl9hbHdheXNfY29tcGFyZXNfZXF1YWw8c3RkOjphbGxvY2F0b3I8X1RwPj4KKyAgICB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3QgYm9vbCBfX2FsbG9jYXRvcl9hbHdheXNfY29tcGFyZXNfZXF1YWw8c3RkOjphbGxvY2F0b3I8X1RwPj46OnZhbHVlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gc3RydWN0IGFycmF5X2FsbG9jYXRvcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BcnJheT4KKyAgICBzdHJ1Y3QgX19hbGxvY2F0b3JfYWx3YXlzX2NvbXBhcmVzX2VxdWFsPGFycmF5X2FsbG9jYXRvcjxfVHAsIF9BcnJheT4+CisgICAgeyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQXJyYXk+CisgICAgY29uc3QgYm9vbAorICAgIF9fYWxsb2NhdG9yX2Fsd2F5c19jb21wYXJlc19lcXVhbDxhcnJheV9hbGxvY2F0b3I8X1RwLCBfQXJyYXk+Pjo6dmFsdWU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+IHN0cnVjdCBiaXRtYXBfYWxsb2NhdG9yOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hbGxvY2F0b3JfYWx3YXlzX2NvbXBhcmVzX2VxdWFsPGJpdG1hcF9hbGxvY2F0b3I8X1RwPj4KKyAgICB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3QgYm9vbCBfX2FsbG9jYXRvcl9hbHdheXNfY29tcGFyZXNfZXF1YWw8Yml0bWFwX2FsbG9jYXRvcjxfVHA+Pjo6dmFsdWU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+IHN0cnVjdCBtYWxsb2NfYWxsb2NhdG9yOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hbGxvY2F0b3JfYWx3YXlzX2NvbXBhcmVzX2VxdWFsPG1hbGxvY19hbGxvY2F0b3I8X1RwPj4KKyAgICB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3QgYm9vbCBfX2FsbG9jYXRvcl9hbHdheXNfY29tcGFyZXNfZXF1YWw8bWFsbG9jX2FsbG9jYXRvcjxfVHA+Pjo6dmFsdWU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+IHN0cnVjdCBtdF9hbGxvY2F0b3I7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2FsbG9jYXRvcl9hbHdheXNfY29tcGFyZXNfZXF1YWw8bXRfYWxsb2NhdG9yPF9UcD4+CisgICAgeyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0IGJvb2wgX19hbGxvY2F0b3JfYWx3YXlzX2NvbXBhcmVzX2VxdWFsPG10X2FsbG9jYXRvcjxfVHA+Pjo6dmFsdWU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+IHN0cnVjdCBuZXdfYWxsb2NhdG9yOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hbGxvY2F0b3JfYWx3YXlzX2NvbXBhcmVzX2VxdWFsPG5ld19hbGxvY2F0b3I8X1RwPj4KKyAgICB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3QgYm9vbCBfX2FsbG9jYXRvcl9hbHdheXNfY29tcGFyZXNfZXF1YWw8bmV3X2FsbG9jYXRvcjxfVHA+Pjo6dmFsdWU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+IHN0cnVjdCBwb29sX2FsbG9jYXRvcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fYWxsb2NhdG9yX2Fsd2F5c19jb21wYXJlc19lcXVhbDxwb29sX2FsbG9jYXRvcjxfVHA+PgorICAgIHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdCBib29sIF9fYWxsb2NhdG9yX2Fsd2F5c19jb21wYXJlc19lcXVhbDxwb29sX2FsbG9jYXRvcjxfVHA+Pjo6dmFsdWU7CisjZW5kaWYKKworLyoqCisgKiBAYnJpZWYgIFVuaWZvcm0gaW50ZXJmYWNlIHRvIEMrKzk4IGFuZCBDKysweCBhbGxvY2F0b3JzLgorICogQGluZ3JvdXAgYWxsb2NhdG9ycworKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgc3RydWN0IF9fYWxsb2NfdHJhaXRzCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICA6IHN0ZDo6YWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+CisjZW5kaWYKKyAgeworICAgIHR5cGVkZWYgX0FsbG9jIGFsbG9jYXRvcl90eXBlOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICB0eXBlZGVmIHN0ZDo6YWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+ICAgICAgICAgICBfQmFzZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2VfdHlwZTo6dmFsdWVfdHlwZSAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZV90eXBlOjpwb2ludGVyICAgICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlX3R5cGU6OmNvbnN0X3BvaW50ZXIgICAgICBjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2VfdHlwZTo6c2l6ZV90eXBlICAgICAgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlX3R5cGU6OmRpZmZlcmVuY2VfdHlwZSAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgLy8gQysrMHggYWxsb2NhdG9ycyBkbyBub3QgZGVmaW5lIHJlZmVyZW5jZSBvciBjb25zdF9yZWZlcmVuY2UKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHVzaW5nIF9CYXNlX3R5cGU6OmFsbG9jYXRlOworICAgIHVzaW5nIF9CYXNlX3R5cGU6OmRlYWxsb2NhdGU7CisgICAgdXNpbmcgX0Jhc2VfdHlwZTo6Y29uc3RydWN0OworICAgIHVzaW5nIF9CYXNlX3R5cGU6OmRlc3Ryb3k7CisgICAgdXNpbmcgX0Jhc2VfdHlwZTo6bWF4X3NpemU7CisKKyAgcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHRyPgorICAgICAgc3RydWN0IF9faXNfY3VzdG9tX3BvaW50ZXIKKyAgICAgIDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBzdGQ6OmlzX3NhbWU8cG9pbnRlciwgX1B0cj46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXN0ZDo6aXNfcG9pbnRlcjxfUHRyPjo6dmFsdWU+CisgICAgICB7IH07CisKKyAgcHVibGljOgorICAgIC8vIG92ZXJsb2FkIGNvbnN0cnVjdCBmb3Igbm9uLXN0YW5kYXJkIHBvaW50ZXIgdHlwZXMKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHRyLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHN0YXRpYyB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxfX2lzX2N1c3RvbV9wb2ludGVyPF9QdHI+Ojp2YWx1ZT46OnR5cGUKKyAgICAgIGNvbnN0cnVjdChfQWxsb2MmIF9fYSwgX1B0ciBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgeworCV9CYXNlX3R5cGU6OmNvbnN0cnVjdChfX2EsIHN0ZDo6YWRkcmVzc29mKCpfX3ApLAorCQkJICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICAgIH0KKworICAgIC8vIG92ZXJsb2FkIGRlc3Ryb3kgZm9yIG5vbi1zdGFuZGFyZCBwb2ludGVyIHR5cGVzCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1B0cj4KKyAgICAgIHN0YXRpYyB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxfX2lzX2N1c3RvbV9wb2ludGVyPF9QdHI+Ojp2YWx1ZT46OnR5cGUKKyAgICAgIGRlc3Ryb3koX0FsbG9jJiBfX2EsIF9QdHIgX19wKQorICAgICAgeyBfQmFzZV90eXBlOjpkZXN0cm95KF9fYSwgc3RkOjphZGRyZXNzb2YoKl9fcCkpOyB9CisKKyAgICBzdGF0aWMgX0FsbG9jIF9TX3NlbGVjdF9vbl9jb3B5KGNvbnN0IF9BbGxvYyYgX19hKQorICAgIHsgcmV0dXJuIF9CYXNlX3R5cGU6OnNlbGVjdF9vbl9jb250YWluZXJfY29weV9jb25zdHJ1Y3Rpb24oX19hKTsgfQorCisgICAgc3RhdGljIHZvaWQgX1Nfb25fc3dhcChfQWxsb2MmIF9fYSwgX0FsbG9jJiBfX2IpCisgICAgeyBzdGQ6Ol9fYWxsb2Nfb25fc3dhcChfX2EsIF9fYik7IH0KKworICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfU19wcm9wYWdhdGVfb25fY29weV9hc3NpZ24oKQorICAgIHsgcmV0dXJuIF9CYXNlX3R5cGU6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfY29weV9hc3NpZ25tZW50Ojp2YWx1ZTsgfQorCisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9TX3Byb3BhZ2F0ZV9vbl9tb3ZlX2Fzc2lnbigpCisgICAgeyByZXR1cm4gX0Jhc2VfdHlwZTo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ6OnZhbHVlOyB9CisKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgX1NfcHJvcGFnYXRlX29uX3N3YXAoKQorICAgIHsgcmV0dXJuIF9CYXNlX3R5cGU6OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDo6dmFsdWU7IH0KKworICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfU19hbHdheXNfZXF1YWwoKQorICAgIHsgcmV0dXJuIF9fYWxsb2NhdG9yX2Fsd2F5c19jb21wYXJlc19lcXVhbDxfQWxsb2M+Ojp2YWx1ZTsgfQorCisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIF9TX25vdGhyb3dfbW92ZSgpCisgICAgeyByZXR1cm4gX1NfcHJvcGFnYXRlX29uX21vdmVfYXNzaWduKCkgfHwgX1NfYWx3YXlzX2VxdWFsKCk7IH0KKworICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBfU19ub3Rocm93X3N3YXAoKQorICAgIHsKKyAgICAgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgICAgIHJldHVybiAhX1NfcHJvcGFnYXRlX29uX3N3YXAoKQorICAgICAgIAl8fCBub2V4Y2VwdChzd2FwKHN0ZDo6ZGVjbHZhbDxfQWxsb2MmPigpLCBzdGQ6OmRlY2x2YWw8X0FsbG9jJj4oKSkpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIHN0cnVjdCByZWJpbmQKKyAgICAgIHsgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZV90eXBlOjp0ZW1wbGF0ZSByZWJpbmRfYWxsb2M8X1RwPiBvdGhlcjsgfTsKKyNlbHNlCisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6cG9pbnRlciAgICAgICAgICAgICAgICBwb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpjb25zdF9wb2ludGVyICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnZhbHVlX3R5cGUgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6cmVmZXJlbmNlICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmNvbnN0X3JlZmVyZW5jZSAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6ZGlmZmVyZW5jZV90eXBlICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICBzdGF0aWMgcG9pbnRlcgorICAgIGFsbG9jYXRlKF9BbGxvYyYgX19hLCBzaXplX3R5cGUgX19uKQorICAgIHsgcmV0dXJuIF9fYS5hbGxvY2F0ZShfX24pOyB9CisKKyAgICBzdGF0aWMgdm9pZCBkZWFsbG9jYXRlKF9BbGxvYyYgX19hLCBwb2ludGVyIF9fcCwgc2l6ZV90eXBlIF9fbikKKyAgICB7IF9fYS5kZWFsbG9jYXRlKF9fcCwgX19uKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgc3RhdGljIHZvaWQgY29uc3RydWN0KF9BbGxvYyYgX19hLCBwb2ludGVyIF9fcCwgY29uc3QgX1RwJiBfX2FyZykKKyAgICAgIHsgX19hLmNvbnN0cnVjdChfX3AsIF9fYXJnKTsgfQorCisgICAgc3RhdGljIHZvaWQgZGVzdHJveShfQWxsb2MmIF9fYSwgcG9pbnRlciBfX3ApCisgICAgeyBfX2EuZGVzdHJveShfX3ApOyB9CisKKyAgICBzdGF0aWMgc2l6ZV90eXBlIG1heF9zaXplKGNvbnN0IF9BbGxvYyYgX19hKQorICAgIHsgcmV0dXJuIF9fYS5tYXhfc2l6ZSgpOyB9CisKKyAgICBzdGF0aWMgY29uc3QgX0FsbG9jJiBfU19zZWxlY3Rfb25fY29weShjb25zdCBfQWxsb2MmIF9fYSkgeyByZXR1cm4gX19hOyB9CisKKyAgICBzdGF0aWMgdm9pZCBfU19vbl9zd2FwKF9BbGxvYyYgX19hLCBfQWxsb2MmIF9fYikKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzEuIFN3YXBwaW5nIGNvbnRhaW5lcnMgd2l0aCB1bmVxdWFsIGFsbG9jYXRvcnMuCisgICAgICBzdGQ6Ol9fYWxsb2Nfc3dhcDxfQWxsb2M+OjpfU19kb19pdChfX2EsIF9fYik7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgc3RydWN0IHJlYmluZAorICAgICAgeyB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9UcD46Om90aGVyIG90aGVyOyB9OworI2VuZGlmCisgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvYXJyYXlfYWxsb2NhdG9yLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9hcnJheV9hbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWE2YTM4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvYXJyYXlfYWxsb2NhdG9yLmgKQEAgLTAsMCArMSwxNzIgQEAKKy8vIGFycmF5IGFsbG9jYXRvciAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L2FycmF5X2FsbG9jYXRvci5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfQVJSQVlfQUxMT0NBVE9SX0gKKyNkZWZpbmUgX0FSUkFZX0FMTE9DQVRPUl9IIDEKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNpbmNsdWRlIDx0cjEvYXJyYXk+CisjaW5jbHVkZSA8Yml0cy9tb3ZlLmg+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2VuZGlmCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworIHVzaW5nIHN0ZDo6c2l6ZV90OworIHVzaW5nIHN0ZDo6cHRyZGlmZl90OworCisgIC8vLyBCYXNlIGNsYXNzLgorIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBhcnJheV9hbGxvY2F0b3JfYmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHNpemVfdCAgICAgCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAJZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfVHAqICAgICAgIAlwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAqIAljb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBfVHAmICAgICAgIAlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCYJY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfVHAgICAgICAgIAl2YWx1ZV90eXBlOworCisgICAgICBwb2ludGVyCisgICAgICBhZGRyZXNzKHJlZmVyZW5jZSBfX3gpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9feCk7IH0KKworICAgICAgY29uc3RfcG9pbnRlcgorICAgICAgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3gpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGRlYWxsb2NhdGUocG9pbnRlciwgc2l6ZV90eXBlKQorICAgICAgeyAKKwkvLyBEb2VzIG5vdGhpbmcuCisgICAgICB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdCBfR0xJQkNYWF9VU0VfTk9FWENFUFQgCisgICAgICB7IHJldHVybiBzaXplX3QoLTEpIC8gc2l6ZW9mKF9UcCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgY29uc3RydWN0KF9VcCogX19wLCBfQXJncyYmLi4uIF9fYXJncykKKwl7IDo6bmV3KCh2b2lkICopX19wKSBfVXAoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIHZvaWQgCisgICAgICAgIGRlc3Ryb3koX1VwKiBfX3ApIHsgX19wLT5+X1VwKCk7IH0KKyNlbHNlCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MDIuIHdyb25nIG5ldyBleHByZXNzaW9uIGluIFtzb21lX10gYWxsb2NhdG9yOjpjb25zdHJ1Y3QKKyAgICAgIHZvaWQgCisgICAgICBjb25zdHJ1Y3QocG9pbnRlciBfX3AsIGNvbnN0IF9UcCYgX192YWwpIAorICAgICAgeyA6Om5ldygodm9pZCAqKV9fcCkgdmFsdWVfdHlwZShfX3ZhbCk7IH0KKworICAgICAgdm9pZCAKKyAgICAgIGRlc3Ryb3kocG9pbnRlciBfX3ApIHsgX19wLT5+X1RwKCk7IH0KKyNlbmRpZgorICAgIH07ICAKKworICAvKioKKyAgICogIEBicmllZiAgQW4gYWxsb2NhdG9yIHRoYXQgdXNlcyBwcmV2aW91c2x5IGFsbG9jYXRlZCBtZW1vcnkuCisgICAqICBUaGlzIG1lbW9yeSBjYW4gYmUgZXh0ZXJuYWxseSwgZ2xvYmFsbHksIG9yIG90aGVyd2lzZSBhbGxvY2F0ZWQuCisgICAqICBAaW5ncm91cCBhbGxvY2F0b3JzCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BcnJheSA9IHN0ZDo6dHIxOjphcnJheTxfVHAsIDE+ID4KKyAgICBjbGFzcyBhcnJheV9hbGxvY2F0b3IgOiBwdWJsaWMgYXJyYXlfYWxsb2NhdG9yX2Jhc2U8X1RwPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHNpemVfdCAgICAgCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAJZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfVHAqICAgICAgIAlwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAqIAljb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBfVHAmICAgICAgIAlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCYgCWNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0FycmF5CQlhcnJheV90eXBlOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjEwMy4gc3RkOjphbGxvY2F0b3IgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQKKyAgICAgIHR5cGVkZWYgc3RkOjp0cnVlX3R5cGUgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ7CisjZW5kaWYKKworICAgIHByaXZhdGU6CisgICAgICBhcnJheV90eXBlKiAJX01fYXJyYXk7CisgICAgICBzaXplX3R5cGUgCV9NX3VzZWQ7CisKKyAgICBwdWJsaWM6CisgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9BcnJheTEgPSBfQXJyYXk+CisgICAgICAgIHN0cnVjdCByZWJpbmQKKyAgICAgICAgeyB0eXBlZGVmIGFycmF5X2FsbG9jYXRvcjxfVHAxLCBfQXJyYXkxPiBvdGhlcjsgfTsKKworICAgICAgYXJyYXlfYWxsb2NhdG9yKGFycmF5X3R5cGUqIF9fYXJyYXkgPSAwKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgCisgICAgICA6IF9NX2FycmF5KF9fYXJyYXkpLCBfTV91c2VkKHNpemVfdHlwZSgpKSB7IH0KKworICAgICAgYXJyYXlfYWxsb2NhdG9yKGNvbnN0IGFycmF5X2FsbG9jYXRvciYgX19vKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgCisgICAgICA6IF9NX2FycmF5KF9fby5fTV9hcnJheSksIF9NX3VzZWQoX19vLl9NX3VzZWQpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfQXJyYXkxPgorICAgICAgICBhcnJheV9hbGxvY2F0b3IoY29uc3QgYXJyYXlfYWxsb2NhdG9yPF9UcDEsIF9BcnJheTE+JikKKwlfR0xJQkNYWF9VU0VfTk9FWENFUFQKKwk6IF9NX2FycmF5KDApLCBfTV91c2VkKHNpemVfdHlwZSgpKSB7IH0KKworICAgICAgfmFycmF5X2FsbG9jYXRvcigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgY29uc3Qgdm9pZCogPSAwKQorICAgICAgeworCWlmIChfTV9hcnJheSA9PSAwIHx8IF9NX3VzZWQgKyBfX24gPiBfTV9hcnJheS0+c2l6ZSgpKQorCSAgc3RkOjpfX3Rocm93X2JhZF9hbGxvYygpOworCXBvaW50ZXIgX19yZXQgPSBfTV9hcnJheS0+YmVnaW4oKSArIF9NX3VzZWQ7CisJX01fdXNlZCArPSBfX247CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQXJyYXk+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGFycmF5X2FsbG9jYXRvcjxfVHAsIF9BcnJheT4mLAorCSAgICAgICBjb25zdCBhcnJheV9hbGxvY2F0b3I8X1RwLCBfQXJyYXk+JikKKyAgICB7IHJldHVybiB0cnVlOyB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BcnJheT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgYXJyYXlfYWxsb2NhdG9yPF9UcCwgX0FycmF5PiYsIAorCSAgICAgICBjb25zdCBhcnJheV9hbGxvY2F0b3I8X1RwLCBfQXJyYXk+JikKKyAgICB7IHJldHVybiBmYWxzZTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvYXRvbWljaXR5LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9hdG9taWNpdHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTM5YzkzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvYXRvbWljaXR5LmgKQEAgLTAsMCArMSwxMTcgQEAKKy8vIFN1cHBvcnQgZm9yIGF0b21pYyBvcGVyYXRpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvYXRvbWljaXR5LmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0FUT01JQ0lUWV9ICisjZGVmaW5lIF9HTElCQ1hYX0FUT01JQ0lUWV9ICTEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL2d0aHIuaD4KKyNpbmNsdWRlIDxiaXRzL2F0b21pY193b3JkLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBGdW5jdGlvbnMgZm9yIHBvcnRhYmxlIGF0b21pYyBhY2Nlc3MuCisgIC8vIFRvIGFic3RyYWN0IGxvY2tpbmcgcHJpbWl0aXZlcyBhY3Jvc3MgYWxsIHRocmVhZCBwb2xpY2llcywgdXNlOgorICAvLyBfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2gKKyAgLy8gX19hdG9taWNfYWRkX2Rpc3BhdGNoCisjaWZkZWYgX0dMSUJDWFhfQVRPTUlDX0JVSUxUSU5TCisgIHN0YXRpYyBpbmxpbmUgX0F0b21pY193b3JkCisgIF9fZXhjaGFuZ2VfYW5kX2FkZCh2b2xhdGlsZSBfQXRvbWljX3dvcmQqIF9fbWVtLCBpbnQgX192YWwpCisgIHsgcmV0dXJuIF9fYXRvbWljX2ZldGNoX2FkZChfX21lbSwgX192YWwsIF9fQVRPTUlDX0FDUV9SRUwpOyB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkCisgIF9fYXRvbWljX2FkZCh2b2xhdGlsZSBfQXRvbWljX3dvcmQqIF9fbWVtLCBpbnQgX192YWwpCisgIHsgX19hdG9taWNfZmV0Y2hfYWRkKF9fbWVtLCBfX3ZhbCwgX19BVE9NSUNfQUNRX1JFTCk7IH0KKyNlbHNlCisgIF9BdG9taWNfd29yZAorICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCisgIF9fZXhjaGFuZ2VfYW5kX2FkZCh2b2xhdGlsZSBfQXRvbWljX3dvcmQqLCBpbnQpIHRocm93ICgpOworCisgIHZvaWQKKyAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKQorICBfX2F0b21pY19hZGQodm9sYXRpbGUgX0F0b21pY193b3JkKiwgaW50KSB0aHJvdyAoKTsKKyNlbmRpZgorCisgIHN0YXRpYyBpbmxpbmUgX0F0b21pY193b3JkCisgIF9fZXhjaGFuZ2VfYW5kX2FkZF9zaW5nbGUoX0F0b21pY193b3JkKiBfX21lbSwgaW50IF9fdmFsKQorICB7CisgICAgX0F0b21pY193b3JkIF9fcmVzdWx0ID0gKl9fbWVtOworICAgICpfX21lbSArPSBfX3ZhbDsKKyAgICByZXR1cm4gX19yZXN1bHQ7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQKKyAgX19hdG9taWNfYWRkX3NpbmdsZShfQXRvbWljX3dvcmQqIF9fbWVtLCBpbnQgX192YWwpCisgIHsgKl9fbWVtICs9IF9fdmFsOyB9CisKKyAgc3RhdGljIGlubGluZSBfQXRvbWljX3dvcmQKKyAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKQorICBfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2goX0F0b21pY193b3JkKiBfX21lbSwgaW50IF9fdmFsKQorICB7CisjaWZkZWYgX19HVEhSRUFEUworICAgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AoKSkKKyAgICAgIHJldHVybiBfX2V4Y2hhbmdlX2FuZF9hZGQoX19tZW0sIF9fdmFsKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gX19leGNoYW5nZV9hbmRfYWRkX3NpbmdsZShfX21lbSwgX192YWwpOworI2Vsc2UKKyAgICByZXR1cm4gX19leGNoYW5nZV9hbmRfYWRkX3NpbmdsZShfX21lbSwgX192YWwpOworI2VuZGlmCisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQKKyAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKQorICBfX2F0b21pY19hZGRfZGlzcGF0Y2goX0F0b21pY193b3JkKiBfX21lbSwgaW50IF9fdmFsKQorICB7CisjaWZkZWYgX19HVEhSRUFEUworICAgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AoKSkKKyAgICAgIF9fYXRvbWljX2FkZChfX21lbSwgX192YWwpOworICAgIGVsc2UKKyAgICAgIF9fYXRvbWljX2FkZF9zaW5nbGUoX19tZW0sIF9fdmFsKTsKKyNlbHNlCisgICAgX19hdG9taWNfYWRkX3NpbmdsZShfX21lbSwgX192YWwpOworI2VuZGlmCisgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisvLyBFdmVuIGlmIHRoZSBDUFUgZG9lc24ndCBuZWVkIGEgbWVtb3J5IGJhcnJpZXIsIHdlIG5lZWQgdG8gZW5zdXJlCisvLyB0aGF0IHRoZSBjb21waWxlciBkb2Vzbid0IHJlb3JkZXIgbWVtb3J5IGFjY2Vzc2VzIGFjcm9zcyB0aGUKKy8vIGJhcnJpZXJzLgorI2lmbmRlZiBfR0xJQkNYWF9SRUFEX01FTV9CQVJSSUVSCisjZGVmaW5lIF9HTElCQ1hYX1JFQURfTUVNX0JBUlJJRVIgX19hc20gX192b2xhdGlsZSAoIiI6OjoibWVtb3J5IikKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9XUklURV9NRU1fQkFSUklFUgorI2RlZmluZSBfR0xJQkNYWF9XUklURV9NRU1fQkFSUklFUiBfX2FzbSBfX3ZvbGF0aWxlICgiIjo6OiJtZW1vcnkiKQorI2VuZGlmCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2JpdG1hcF9hbGxvY2F0b3IuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2JpdG1hcF9hbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGZlODYxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvYml0bWFwX2FsbG9jYXRvci5oCkBAIC0wLDAgKzEsMTExOSBAQAorLy8gQml0bWFwIEFsbG9jYXRvci4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9iaXRtYXBfYWxsb2NhdG9yLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9CSVRNQVBfQUxMT0NBVE9SX0gKKyNkZWZpbmUgX0JJVE1BUF9BTExPQ0FUT1JfSCAxCisKKyNpbmNsdWRlIDx1dGlsaXR5PiAvLyBGb3Igc3RkOjpwYWlyLgorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4gLy8gRm9yIF9fdGhyb3dfYmFkX2FsbG9jKCkuCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4gLy8gRm9yIGdyZWF0ZXJfZXF1YWwsIGFuZCBsZXNzX2VxdWFsLgorI2luY2x1ZGUgPG5ldz4gLy8gRm9yIG9wZXJhdG9yIG5ldy4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPiAvLyBfR0xJQkNYWF9ERUJVR19BU1NFUlQKKyNpbmNsdWRlIDxleHQvY29uY3VycmVuY2UuaD4KKyNpbmNsdWRlIDxiaXRzL21vdmUuaD4KKworLyoqIEBicmllZiBUaGUgY29uc3RhbnQgaW4gdGhlIGV4cHJlc3Npb24gYmVsb3cgaXMgdGhlIGFsaWdubWVudAorICogcmVxdWlyZWQgaW4gYnl0ZXMuCisgKi8KKyNkZWZpbmUgX0JBTExPQ19BTElHTl9CWVRFUyA4CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworICB1c2luZyBzdGQ6OnNpemVfdDsKKyAgdXNpbmcgc3RkOjpwdHJkaWZmX3Q7CisKKyAgbmFtZXNwYWNlIF9fZGV0YWlsCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKyAgICAvKiogQGNsYXNzICBfX21pbmlfdmVjdG9yIGJpdG1hcF9hbGxvY2F0b3IuaCBiaXRtYXBfYWxsb2NhdG9yLmgKKyAgICAgKgorICAgICAqICBAYnJpZWYgIF9fbWluaV92ZWN0b3I8PiBpcyBhIHN0cmlwcGVkIGRvd24gdmVyc2lvbiBvZiB0aGUKKyAgICAgKiAgZnVsbC1mbGVkZ2VkIHN0ZDo6dmVjdG9yPD4uCisgICAgICoKKyAgICAgKiAgSXQgaXMgdG8gYmUgdXNlZCBvbmx5IGZvciBidWlsdC1pbiB0eXBlcyBvciBQT0RzLiBOb3RhYmxlCisgICAgICogIGRpZmZlcmVuY2VzIGFyZToKKyAgICAgKiAKKyAgICAgKiAgMS4gTm90IGFsbCBhY2Nlc3NvciBmdW5jdGlvbnMgYXJlIHByZXNlbnQuCisgICAgICogIDIuIFVzZWQgT05MWSBmb3IgUE9Ecy4KKyAgICAgKiAgMy4gTm8gQWxsb2NhdG9yIHRlbXBsYXRlIGFyZ3VtZW50LiBVc2VzIDo6b3BlcmF0b3IgbmV3KCkgdG8gZ2V0CisgICAgICogIG1lbW9yeSwgYW5kIDo6b3BlcmF0b3IgZGVsZXRlKCkgdG8gZnJlZSBpdC4KKyAgICAgKiAgQ2F2ZWF0OiBUaGUgZHRvciBkb2VzIE5PVCBmcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkLCBzbyB0aGlzIGEKKyAgICAgKiAgbWVtb3J5LWxlYWtpbmcgdmVjdG9yIQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIGNsYXNzIF9fbWluaV92ZWN0b3IKKyAgICAgIHsKKwlfX21pbmlfdmVjdG9yKGNvbnN0IF9fbWluaV92ZWN0b3ImKTsKKwlfX21pbmlfdmVjdG9yJiBvcGVyYXRvcj0oY29uc3QgX19taW5pX3ZlY3RvciYpOworCisgICAgICBwdWJsaWM6CisJdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKwl0eXBlZGVmIF9UcCogcG9pbnRlcjsKKwl0eXBlZGVmIF9UcCYgcmVmZXJlbmNlOworCXR5cGVkZWYgY29uc3QgX1RwJiBjb25zdF9yZWZlcmVuY2U7CisJdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworCXR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKwl0eXBlZGVmIHBvaW50ZXIgaXRlcmF0b3I7CisKKyAgICAgIHByaXZhdGU6CisJcG9pbnRlciBfTV9zdGFydDsKKwlwb2ludGVyIF9NX2ZpbmlzaDsKKwlwb2ludGVyIF9NX2VuZF9vZl9zdG9yYWdlOworCisJc2l6ZV90eXBlCisJX01fc3BhY2VfbGVmdCgpIGNvbnN0IHRocm93KCkKKwl7IHJldHVybiBfTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX2ZpbmlzaDsgfQorCisJcG9pbnRlcgorCWFsbG9jYXRlKHNpemVfdHlwZSBfX24pCisJeyByZXR1cm4gc3RhdGljX2Nhc3Q8cG9pbnRlcj4oOjpvcGVyYXRvciBuZXcoX19uICogc2l6ZW9mKF9UcCkpKTsgfQorCisJdm9pZAorCWRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlwZSkKKwl7IDo6b3BlcmF0b3IgZGVsZXRlKF9fcCk7IH0KKworICAgICAgcHVibGljOgorCS8vIE1lbWJlcnMgdXNlZDogc2l6ZSgpLCBwdXNoX2JhY2soKSwgcG9wX2JhY2soKSwKKwkvLyBpbnNlcnQoaXRlcmF0b3IsIGNvbnN0X3JlZmVyZW5jZSksIGVyYXNlKGl0ZXJhdG9yKSwKKwkvLyBiZWdpbigpLCBlbmQoKSwgYmFjaygpLCBvcGVyYXRvcltdLgorCisJX19taW5pX3ZlY3RvcigpCisgICAgICAgIDogX01fc3RhcnQoMCksIF9NX2ZpbmlzaCgwKSwgX01fZW5kX29mX3N0b3JhZ2UoMCkgeyB9CisKKwlzaXplX3R5cGUKKwlzaXplKCkgY29uc3QgdGhyb3coKQorCXsgcmV0dXJuIF9NX2ZpbmlzaCAtIF9NX3N0YXJ0OyB9CisKKwlpdGVyYXRvcgorCWJlZ2luKCkgY29uc3QgdGhyb3coKQorCXsgcmV0dXJuIHRoaXMtPl9NX3N0YXJ0OyB9CisKKwlpdGVyYXRvcgorCWVuZCgpIGNvbnN0IHRocm93KCkKKwl7IHJldHVybiB0aGlzLT5fTV9maW5pc2g7IH0KKworCXJlZmVyZW5jZQorCWJhY2soKSBjb25zdCB0aHJvdygpCisJeyByZXR1cm4gKih0aGlzLT5lbmQoKSAtIDEpOyB9CisKKwlyZWZlcmVuY2UKKwlvcGVyYXRvcltdKGNvbnN0IHNpemVfdHlwZSBfX3BvcykgY29uc3QgdGhyb3coKQorCXsgcmV0dXJuIHRoaXMtPl9NX3N0YXJ0W19fcG9zXTsgfQorCisJdm9pZAorCWluc2VydChpdGVyYXRvciBfX3BvcywgY29uc3RfcmVmZXJlbmNlIF9feCk7CisKKwl2b2lkCisJcHVzaF9iYWNrKGNvbnN0X3JlZmVyZW5jZSBfX3gpCisJeworCSAgaWYgKHRoaXMtPl9NX3NwYWNlX2xlZnQoKSkKKwkgICAgeworCSAgICAgICp0aGlzLT5lbmQoKSA9IF9feDsKKwkgICAgICArK3RoaXMtPl9NX2ZpbmlzaDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB0aGlzLT5pbnNlcnQodGhpcy0+ZW5kKCksIF9feCk7CisJfQorCisJdm9pZAorCXBvcF9iYWNrKCkgdGhyb3coKQorCXsgLS10aGlzLT5fTV9maW5pc2g7IH0KKworCXZvaWQKKwllcmFzZShpdGVyYXRvciBfX3BvcykgdGhyb3coKTsKKworCXZvaWQKKwljbGVhcigpIHRocm93KCkKKwl7IHRoaXMtPl9NX2ZpbmlzaCA9IHRoaXMtPl9NX3N0YXJ0OyB9CisgICAgICB9OworCisgICAgLy8gT3V0IG9mIGxpbmUgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgdm9pZCBfX21pbmlfdmVjdG9yPF9UcD46OgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdF9yZWZlcmVuY2UgX194KQorICAgICAgeworCWlmICh0aGlzLT5fTV9zcGFjZV9sZWZ0KCkpCisJICB7CisJICAgIHNpemVfdHlwZSBfX3RvX21vdmUgPSB0aGlzLT5fTV9maW5pc2ggLSBfX3BvczsKKwkgICAgaXRlcmF0b3IgX19kZXN0ID0gdGhpcy0+ZW5kKCk7CisJICAgIGl0ZXJhdG9yIF9fc3JjID0gdGhpcy0+ZW5kKCkgLSAxOworCisJICAgICsrdGhpcy0+X01fZmluaXNoOworCSAgICB3aGlsZSAoX190b19tb3ZlKQorCSAgICAgIHsKKwkJKl9fZGVzdCA9ICpfX3NyYzsKKwkJLS1fX2Rlc3Q7IC0tX19zcmM7IC0tX190b19tb3ZlOworCSAgICAgIH0KKwkgICAgKl9fcG9zID0gX194OworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgc2l6ZV90eXBlIF9fbmV3X3NpemUgPSB0aGlzLT5zaXplKCkgPyB0aGlzLT5zaXplKCkgKiAyIDogMTsKKwkgICAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSB0aGlzLT5hbGxvY2F0ZShfX25ld19zaXplKTsKKwkgICAgaXRlcmF0b3IgX19maXJzdCA9IHRoaXMtPmJlZ2luKCk7CisJICAgIGl0ZXJhdG9yIF9fc3RhcnQgPSBfX25ld19zdGFydDsKKwkgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19wb3MpCisJICAgICAgeworCQkqX19zdGFydCA9ICpfX2ZpcnN0OworCQkrK19fc3RhcnQ7ICsrX19maXJzdDsKKwkgICAgICB9CisJICAgICpfX3N0YXJ0ID0gX194OworCSAgICArK19fc3RhcnQ7CisJICAgIHdoaWxlIChfX2ZpcnN0ICE9IHRoaXMtPmVuZCgpKQorCSAgICAgIHsKKwkJKl9fc3RhcnQgPSAqX19maXJzdDsKKwkJKytfX3N0YXJ0OyArK19fZmlyc3Q7CisJICAgICAgfQorCSAgICBpZiAodGhpcy0+X01fc3RhcnQpCisJICAgICAgdGhpcy0+ZGVhbGxvY2F0ZSh0aGlzLT5fTV9zdGFydCwgdGhpcy0+c2l6ZSgpKTsKKworCSAgICB0aGlzLT5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworCSAgICB0aGlzLT5fTV9maW5pc2ggPSBfX3N0YXJ0OworCSAgICB0aGlzLT5fTV9lbmRfb2Zfc3RvcmFnZSA9IHRoaXMtPl9NX3N0YXJ0ICsgX19uZXdfc2l6ZTsKKwkgIH0KKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIHZvaWQgX19taW5pX3ZlY3RvcjxfVHA+OjoKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zKSB0aHJvdygpCisgICAgICB7CisJd2hpbGUgKF9fcG9zICsgMSAhPSB0aGlzLT5lbmQoKSkKKwkgIHsKKwkgICAgKl9fcG9zID0gX19wb3NbMV07CisJICAgICsrX19wb3M7CisJICB9CisJLS10aGlzLT5fTV9maW5pc2g7CisgICAgICB9CisKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIHN0cnVjdCBfX212X2l0ZXJfdHJhaXRzCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfVHA6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9UcDo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBzdHJ1Y3QgX19tdl9pdGVyX3RyYWl0czxfVHAqPgorICAgICAgeworCXR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisJdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworICAgICAgfTsKKworICAgIGVudW0gCisgICAgICB7IAorCWJpdHNfcGVyX2J5dGUgPSA4LAorCWJpdHNfcGVyX2Jsb2NrID0gc2l6ZW9mKHNpemVfdCkgKiBzaXplX3QoYml0c19wZXJfYnl0ZSkgCisgICAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICAgIF9fbG93ZXJfYm91bmQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgIGNvbnN0IF9UcCYgX192YWwsIF9Db21wYXJlIF9fY29tcCkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fbXZfaXRlcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCSAgX0Rpc3RhbmNlVHlwZTsKKworCV9EaXN0YW5jZVR5cGUgX19sZW4gPSBfX2xhc3QgLSBfX2ZpcnN0OworCV9EaXN0YW5jZVR5cGUgX19oYWxmOworCV9Gb3J3YXJkSXRlcmF0b3IgX19taWRkbGU7CisKKwl3aGlsZSAoX19sZW4gPiAwKQorCSAgeworCSAgICBfX2hhbGYgPSBfX2xlbiA+PiAxOworCSAgICBfX21pZGRsZSA9IF9fZmlyc3Q7CisJICAgIF9fbWlkZGxlICs9IF9faGFsZjsKKwkgICAgaWYgKF9fY29tcCgqX19taWRkbGUsIF9fdmFsKSkKKwkgICAgICB7CisJCV9fZmlyc3QgPSBfX21pZGRsZTsKKwkJKytfX2ZpcnN0OworCQlfX2xlbiA9IF9fbGVuIC0gX19oYWxmIC0gMTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICBfX2xlbiA9IF9faGFsZjsKKwkgIH0KKwlyZXR1cm4gX19maXJzdDsKKyAgICAgIH0KKworICAgIC8qKiBAYnJpZWYgVGhlIG51bWJlciBvZiBCbG9ja3MgcG9pbnRlZCB0byBieSB0aGUgYWRkcmVzcyBwYWlyCisgICAgICogIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FkZHJQYWlyPgorICAgICAgaW5saW5lIHNpemVfdAorICAgICAgX19udW1fYmxvY2tzKF9BZGRyUGFpciBfX2FwKQorICAgICAgeyByZXR1cm4gKF9fYXAuc2Vjb25kIC0gX19hcC5maXJzdCkgKyAxOyB9CisKKyAgICAvKiogQGJyaWVmIFRoZSBudW1iZXIgb2YgQml0LW1hcHMgcG9pbnRlZCB0byBieSB0aGUgYWRkcmVzcyBwYWlyCisgICAgICogIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FkZHJQYWlyPgorICAgICAgaW5saW5lIHNpemVfdAorICAgICAgX19udW1fYml0bWFwcyhfQWRkclBhaXIgX19hcCkKKyAgICAgIHsgcmV0dXJuIF9fbnVtX2Jsb2NrcyhfX2FwKSAvIHNpemVfdChiaXRzX3Blcl9ibG9jayk7IH0KKworICAgIC8vIF9UcCBzaG91bGQgYmUgYSBwb2ludGVyIHR5cGUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgY2xhc3MgX0luY2x1c2l2ZV9iZXR3ZWVuIAorICAgICAgOiBwdWJsaWMgc3RkOjp1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBzdGQ6OnBhaXI8X1RwLCBfVHA+LCBib29sPgorICAgICAgeworCXR5cGVkZWYgX1RwIHBvaW50ZXI7CisJcG9pbnRlciBfTV9wdHJfdmFsdWU7CisJdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnBhaXI8X1RwLCBfVHA+IF9CbG9ja19wYWlyOworCQorICAgICAgcHVibGljOgorCV9JbmNsdXNpdmVfYmV0d2Vlbihwb2ludGVyIF9fcHRyKSA6IF9NX3B0cl92YWx1ZShfX3B0cikgCisJeyB9CisJCisJYm9vbCAKKwlvcGVyYXRvcigpKF9CbG9ja19wYWlyIF9fYnApIGNvbnN0IHRocm93KCkKKwl7CisJICBpZiAoc3RkOjpsZXNzX2VxdWFsPHBvaW50ZXI+KCkoX01fcHRyX3ZhbHVlLCBfX2JwLnNlY29uZCkgCisJICAgICAgJiYgc3RkOjpncmVhdGVyX2VxdWFsPHBvaW50ZXI+KCkoX01fcHRyX3ZhbHVlLCBfX2JwLmZpcnN0KSkKKwkgICAgcmV0dXJuIHRydWU7CisJICBlbHNlCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICB9OworICAKKyAgICAvLyBVc2VkIHRvIHBhc3MgYSBGdW5jdG9yIHRvIGZ1bmN0aW9ucyBieSByZWZlcmVuY2UuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgICBjbGFzcyBfRnVuY3Rvcl9SZWYgCisgICAgICA6IHB1YmxpYyBzdGQ6OnVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9GdW5jdG9yOjphcmd1bWVudF90eXBlLCAKKwkJCQkgICB0eXBlbmFtZSBfRnVuY3Rvcjo6cmVzdWx0X3R5cGU+CisgICAgICB7CisJX0Z1bmN0b3ImIF9NX2ZyZWY7CisJCisgICAgICBwdWJsaWM6CisJdHlwZWRlZiB0eXBlbmFtZSBfRnVuY3Rvcjo6YXJndW1lbnRfdHlwZSBhcmd1bWVudF90eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgX0Z1bmN0b3I6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworCisJX0Z1bmN0b3JfUmVmKF9GdW5jdG9yJiBfX2ZyZWYpIDogX01fZnJlZihfX2ZyZWYpIAorCXsgfQorCisJcmVzdWx0X3R5cGUgCisJb3BlcmF0b3IoKShhcmd1bWVudF90eXBlIF9fYXJnKSAKKwl7IHJldHVybiBfTV9mcmVmKF9fYXJnKTsgfQorICAgICAgfTsKKworICAgIC8qKiBAY2xhc3MgIF9GZml0X2ZpbmRlciBiaXRtYXBfYWxsb2NhdG9yLmggYml0bWFwX2FsbG9jYXRvci5oCisgICAgICoKKyAgICAgKiAgQGJyaWVmICBUaGUgY2xhc3Mgd2hpY2ggYWN0cyBhcyBhIHByZWRpY2F0ZSBmb3IgYXBwbHlpbmcgdGhlCisgICAgICogIGZpcnN0LWZpdCBtZW1vcnkgYWxsb2NhdGlvbiBwb2xpY3kgZm9yIHRoZSBiaXRtYXAgYWxsb2NhdG9yLgorICAgICAqLworICAgIC8vIF9UcCBzaG91bGQgYmUgYSBwb2ludGVyIHR5cGUsIGFuZCBfQWxsb2MgaXMgdGhlIEFsbG9jYXRvciBmb3IKKyAgICAvLyB0aGUgdmVjdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIGNsYXNzIF9GZml0X2ZpbmRlciAKKyAgICAgIDogcHVibGljIHN0ZDo6dW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgc3RkOjpwYWlyPF9UcCwgX1RwPiwgYm9vbD4KKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6cGFpcjxfVHAsIF9UcD4gX0Jsb2NrX3BhaXI7CisJdHlwZWRlZiB0eXBlbmFtZSBfX2RldGFpbDo6X19taW5pX3ZlY3RvcjxfQmxvY2tfcGFpcj4gX0JQVmVjdG9yOworCXR5cGVkZWYgdHlwZW5hbWUgX0JQVmVjdG9yOjpkaWZmZXJlbmNlX3R5cGUgX0NvdW50ZXJfdHlwZTsKKworCXNpemVfdCogX01fcGJpdG1hcDsKKwlfQ291bnRlcl90eXBlIF9NX2RhdGFfb2Zmc2V0OworCisgICAgICBwdWJsaWM6CisJX0ZmaXRfZmluZGVyKCkgOiBfTV9wYml0bWFwKDApLCBfTV9kYXRhX29mZnNldCgwKQorCXsgfQorCisJYm9vbCAKKwlvcGVyYXRvcigpKF9CbG9ja19wYWlyIF9fYnApIHRocm93KCkKKwl7CisJICAvLyBTZXQgdGhlIF9yb3ZlciB0byB0aGUgbGFzdCBwaHlzaWNhbCBsb2NhdGlvbiBiaXRtYXAsCisJICAvLyB3aGljaCBpcyB0aGUgYml0bWFwIHdoaWNoIGJlbG9uZ3MgdG8gdGhlIGZpcnN0IGZyZWUKKwkgIC8vIGJsb2NrLiBUaHVzLCB0aGUgYml0bWFwcyBhcmUgaW4gZXhhY3QgcmV2ZXJzZSBvcmRlciBvZgorCSAgLy8gdGhlIGFjdHVhbCBtZW1vcnkgbGF5b3V0LiBTbywgd2UgY291bnQgZG93biB0aGUgYml0bWFwcywKKwkgIC8vIHdoaWNoIGlzIHRoZSBzYW1lIGFzIG1vdmluZyB1cCB0aGUgbWVtb3J5LgorCisJICAvLyBJZiB0aGUgdXNlZCBjb3VudCBzdG9yZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBCaXQgTWFwIGhlYWRlcnMKKwkgIC8vIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgT2JqZWN0cyB0aGF0IHRoZSBjdXJyZW50IEJsb2NrIGNhbgorCSAgLy8gc3RvcmUsIHRoZW4gdGhlcmUgaXMgZGVmaW5pdGVseSBubyBzcGFjZSBmb3IgYW5vdGhlciBzaW5nbGUKKwkgIC8vIG9iamVjdCwgc28ganVzdCByZXR1cm4gZmFsc2UuCisJICBfQ291bnRlcl90eXBlIF9fZGlmZiA9IF9fZGV0YWlsOjpfX251bV9iaXRtYXBzKF9fYnApOworCisJICBpZiAoKihyZWludGVycHJldF9jYXN0PHNpemVfdCo+CisJCShfX2JwLmZpcnN0KSAtIChfX2RpZmYgKyAxKSkgPT0gX19kZXRhaWw6Ol9fbnVtX2Jsb2NrcyhfX2JwKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICBzaXplX3QqIF9fcm92ZXIgPSByZWludGVycHJldF9jYXN0PHNpemVfdCo+KF9fYnAuZmlyc3QpIC0gMTsKKworCSAgZm9yIChfQ291bnRlcl90eXBlIF9faSA9IDA7IF9faSA8IF9fZGlmZjsgKytfX2kpCisJICAgIHsKKwkgICAgICBfTV9kYXRhX29mZnNldCA9IF9faTsKKwkgICAgICBpZiAoKl9fcm92ZXIpCisJCXsKKwkJICBfTV9wYml0bWFwID0gX19yb3ZlcjsKKwkJICByZXR1cm4gdHJ1ZTsKKwkJfQorCSAgICAgIC0tX19yb3ZlcjsKKwkgICAgfQorCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAKKwlzaXplX3QqCisJX01fZ2V0KCkgY29uc3QgdGhyb3coKQorCXsgcmV0dXJuIF9NX3BiaXRtYXA7IH0KKworCV9Db3VudGVyX3R5cGUKKwlfTV9vZmZzZXQoKSBjb25zdCB0aHJvdygpCisJeyByZXR1cm4gX01fZGF0YV9vZmZzZXQgKiBzaXplX3QoYml0c19wZXJfYmxvY2spOyB9CisgICAgICB9OworCisgICAgLyoqIEBjbGFzcyAgX0JpdG1hcF9jb3VudGVyIGJpdG1hcF9hbGxvY2F0b3IuaCBiaXRtYXBfYWxsb2NhdG9yLmgKKyAgICAgKgorICAgICAqICBAYnJpZWYgIFRoZSBiaXRtYXAgY291bnRlciB3aGljaCBhY3RzIGFzIHRoZSBiaXRtYXAKKyAgICAgKiAgbWFuaXB1bGF0b3IsIGFuZCBtYW5hZ2VzIHRoZSBiaXQtbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyBhbmQKKyAgICAgKiAgdGhlIHNlYXJjaGluZyBhbmQgaWRlbnRpZmljYXRpb24gZnVuY3Rpb25zIG9uIHRoZSBiaXQtbWFwLgorICAgICAqLworICAgIC8vIF9UcCBzaG91bGQgYmUgYSBwb2ludGVyIHR5cGUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgY2xhc3MgX0JpdG1hcF9jb3VudGVyCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZQorCV9fZGV0YWlsOjpfX21pbmlfdmVjdG9yPHR5cGVuYW1lIHN0ZDo6cGFpcjxfVHAsIF9UcD4gPiBfQlBWZWN0b3I7CisJdHlwZWRlZiB0eXBlbmFtZSBfQlBWZWN0b3I6OnNpemVfdHlwZSBfSW5kZXhfdHlwZTsKKwl0eXBlZGVmIF9UcCBwb2ludGVyOworCisJX0JQVmVjdG9yJiBfTV92YnA7CisJc2l6ZV90KiBfTV9jdXJyX2JtYXA7CisJc2l6ZV90KiBfTV9sYXN0X2JtYXBfaW5fYmxvY2s7CisJX0luZGV4X3R5cGUgX01fY3Vycl9pbmRleDsKKyAgICAKKyAgICAgIHB1YmxpYzoKKwkvLyBVc2UgdGhlIDJuZCBwYXJhbWV0ZXIgd2l0aCBjYXJlLiBNYWtlIHN1cmUgdGhhdCBzdWNoIGFuCisJLy8gZW50cnkgZXhpc3RzIGluIHRoZSB2ZWN0b3IgYmVmb3JlIHBhc3NpbmcgdGhhdCBwYXJ0aWN1bGFyCisJLy8gaW5kZXggdG8gdGhpcyBjdG9yLgorCV9CaXRtYXBfY291bnRlcihfQlBWZWN0b3ImIFJ2YnAsIGxvbmcgX19pbmRleCA9IC0xKSA6IF9NX3ZicChSdmJwKQorCXsgdGhpcy0+X01fcmVzZXQoX19pbmRleCk7IH0KKyAgICAKKwl2b2lkIAorCV9NX3Jlc2V0KGxvbmcgX19pbmRleCA9IC0xKSB0aHJvdygpCisJeworCSAgaWYgKF9faW5kZXggPT0gLTEpCisJICAgIHsKKwkgICAgICBfTV9jdXJyX2JtYXAgPSAwOworCSAgICAgIF9NX2N1cnJfaW5kZXggPSBzdGF0aWNfY2FzdDxfSW5kZXhfdHlwZT4oLTEpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCisJICBfTV9jdXJyX2luZGV4ID0gX19pbmRleDsKKwkgIF9NX2N1cnJfYm1hcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Kj4KKwkgICAgKF9NX3ZicFtfTV9jdXJyX2luZGV4XS5maXJzdCkgLSAxOworCSAgCisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX19pbmRleCA8PSAobG9uZylfTV92YnAuc2l6ZSgpIC0gMSk7CisJCisJICBfTV9sYXN0X2JtYXBfaW5fYmxvY2sgPSBfTV9jdXJyX2JtYXAKKwkgICAgLSAoKF9NX3ZicFtfTV9jdXJyX2luZGV4XS5zZWNvbmQgCisJCS0gX01fdmJwW19NX2N1cnJfaW5kZXhdLmZpcnN0ICsgMSkgCisJICAgICAgIC8gc2l6ZV90KGJpdHNfcGVyX2Jsb2NrKSAtIDEpOworCX0KKyAgICAKKwkvLyBEYW5nZXJvdXMgRnVuY3Rpb24hIFVzZSB3aXRoIGV4dHJlbWUgY2FyZS4gUGFzcyB0byB0aGlzCisJLy8gZnVuY3Rpb24gT05MWSB0aG9zZSB2YWx1ZXMgdGhhdCBhcmUga25vd24gdG8gYmUgY29ycmVjdCwKKwkvLyBvdGhlcndpc2UgdGhpcyB3aWxsIG1lc3MgdXAgYmlnIHRpbWUuCisJdm9pZAorCV9NX3NldF9pbnRlcm5hbF9iaXRtYXAoc2l6ZV90KiBfX25ld19pbnRlcm5hbF9tYXJrZXIpIHRocm93KCkKKwl7IF9NX2N1cnJfYm1hcCA9IF9fbmV3X2ludGVybmFsX21hcmtlcjsgfQorICAgIAorCWJvb2wKKwlfTV9maW5pc2hlZCgpIGNvbnN0IHRocm93KCkKKwl7IHJldHVybihfTV9jdXJyX2JtYXAgPT0gMCk7IH0KKyAgICAKKwlfQml0bWFwX2NvdW50ZXImCisJb3BlcmF0b3IrKygpIHRocm93KCkKKwl7CisJICBpZiAoX01fY3Vycl9ibWFwID09IF9NX2xhc3RfYm1hcF9pbl9ibG9jaykKKwkgICAgeworCSAgICAgIGlmICgrK19NX2N1cnJfaW5kZXggPT0gX01fdmJwLnNpemUoKSkKKwkJX01fY3Vycl9ibWFwID0gMDsKKwkgICAgICBlbHNlCisJCXRoaXMtPl9NX3Jlc2V0KF9NX2N1cnJfaW5kZXgpOworCSAgICB9CisJICBlbHNlCisJICAgIC0tX01fY3Vycl9ibWFwOworCSAgcmV0dXJuICp0aGlzOworCX0KKyAgICAKKwlzaXplX3QqCisJX01fZ2V0KCkgY29uc3QgdGhyb3coKQorCXsgcmV0dXJuIF9NX2N1cnJfYm1hcDsgfQorICAgIAorCXBvaW50ZXIgCisJX01fYmFzZSgpIGNvbnN0IHRocm93KCkKKwl7IHJldHVybiBfTV92YnBbX01fY3Vycl9pbmRleF0uZmlyc3Q7IH0KKworCV9JbmRleF90eXBlCisJX01fb2Zmc2V0KCkgY29uc3QgdGhyb3coKQorCXsKKwkgIHJldHVybiBzaXplX3QoYml0c19wZXJfYmxvY2spCisJICAgICogKChyZWludGVycHJldF9jYXN0PHNpemVfdCo+KHRoaXMtPl9NX2Jhc2UoKSkgCisJCS0gX01fY3Vycl9ibWFwKSAtIDEpOworCX0KKyAgICAKKwlfSW5kZXhfdHlwZQorCV9NX3doZXJlKCkgY29uc3QgdGhyb3coKQorCXsgcmV0dXJuIF9NX2N1cnJfaW5kZXg7IH0KKyAgICAgIH07CisKKyAgICAvKiogQGJyaWVmICBNYXJrIGEgbWVtb3J5IGFkZHJlc3MgYXMgYWxsb2NhdGVkIGJ5IHJlLXNldHRpbmcgdGhlCisgICAgICogIGNvcnJlc3BvbmRpbmcgYml0IGluIHRoZSBiaXQtbWFwLgorICAgICAqLworICAgIGlubGluZSB2b2lkIAorICAgIF9fYml0X2FsbG9jYXRlKHNpemVfdCogX19wYm1hcCwgc2l6ZV90IF9fcG9zKSB0aHJvdygpCisgICAgeworICAgICAgc2l6ZV90IF9fbWFzayA9IDEgPDwgX19wb3M7CisgICAgICBfX21hc2sgPSB+X19tYXNrOworICAgICAgKl9fcGJtYXAgJj0gX19tYXNrOworICAgIH0KKyAgCisgICAgLyoqIEBicmllZiAgTWFyayBhIG1lbW9yeSBhZGRyZXNzIGFzIGZyZWUgYnkgc2V0dGluZyB0aGUKKyAgICAgKiAgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIGJpdC1tYXAuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgCisgICAgX19iaXRfZnJlZShzaXplX3QqIF9fcGJtYXAsIHNpemVfdCBfX3BvcykgdGhyb3coKQorICAgIHsKKyAgICAgIHNpemVfdCBfX21hc2sgPSAxIDw8IF9fcG9zOworICAgICAgKl9fcGJtYXAgfD0gX19tYXNrOworICAgIH0KKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2UgX19kZXRhaWwKKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKiogQGJyaWVmICBHZW5lcmljIFZlcnNpb24gb2YgdGhlIGJzZiBpbnN0cnVjdGlvbi4KKyAgICovCisgIGlubGluZSBzaXplX3QgCisgIF9CaXRfc2Nhbl9mb3J3YXJkKHNpemVfdCBfX251bSkKKyAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihfX2J1aWx0aW5fY3R6bChfX251bSkpOyB9CisKKyAgLyoqIEBjbGFzcyAgZnJlZV9saXN0IGJpdG1hcF9hbGxvY2F0b3IuaCBiaXRtYXBfYWxsb2NhdG9yLmgKKyAgICoKKyAgICogIEBicmllZiAgVGhlIGZyZWUgbGlzdCBjbGFzcyBmb3IgbWFuYWdpbmcgY2h1bmtzIG9mIG1lbW9yeSB0byBiZQorICAgKiAgZ2l2ZW4gdG8gYW5kIHJldHVybmVkIGJ5IHRoZSBiaXRtYXBfYWxsb2NhdG9yLgorICAgKi8KKyAgY2xhc3MgZnJlZV9saXN0CisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc2l6ZV90KiAJCQkJdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9fZGV0YWlsOjpfX21pbmlfdmVjdG9yPHZhbHVlX3R5cGU+IHZlY3Rvcl90eXBlOworICAgIHR5cGVkZWYgdmVjdG9yX3R5cGU6Oml0ZXJhdG9yIAkJaXRlcmF0b3I7CisgICAgdHlwZWRlZiBfX211dGV4CQkJCV9fbXV0ZXhfdHlwZTsKKworICBwcml2YXRlOgorICAgIHN0cnVjdCBfTFRfcG9pbnRlcl9jb21wYXJlCisgICAgeworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBzaXplX3QqIF9fcHVpLCAKKwkJIGNvbnN0IHNpemVfdCBfX2N1aSkgY29uc3QgdGhyb3coKQorICAgICAgeyByZXR1cm4gKl9fcHVpIDwgX19jdWk7IH0KKyAgICB9OworCisjaWYgZGVmaW5lZCBfX0dUSFJFQURTCisgICAgX19tdXRleF90eXBlJgorICAgIF9NX2dldF9tdXRleCgpCisgICAgeworICAgICAgc3RhdGljIF9fbXV0ZXhfdHlwZSBfU19tdXRleDsKKyAgICAgIHJldHVybiBfU19tdXRleDsKKyAgICB9CisjZW5kaWYKKworICAgIHZlY3Rvcl90eXBlJgorICAgIF9NX2dldF9mcmVlX2xpc3QoKQorICAgIHsKKyAgICAgIHN0YXRpYyB2ZWN0b3JfdHlwZSBfU19mcmVlX2xpc3Q7CisgICAgICByZXR1cm4gX1NfZnJlZV9saXN0OworICAgIH0KKworICAgIC8qKiBAYnJpZWYgIFBlcmZvcm1zIHZhbGlkYXRpb24gb2YgbWVtb3J5IGJhc2VkIG9uIHRoZWlyIHNpemUuCisgICAgICoKKyAgICAgKiAgQHBhcmFtICBfX2FkZHIgVGhlIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBibG9jayB0byBiZQorICAgICAqICB2YWxpZGF0ZWQuCisgICAgICoKKyAgICAgKiAgVmFsaWRhdGVzIHRoZSBtZW1vcnkgYmxvY2sgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gYW5kCisgICAgICogIGFwcHJvcHJpYXRlbHkgcGVyZm9ybXMgdGhlIGFjdGlvbiBvZiBtYW5hZ2luZyB0aGUgZnJlZSBsaXN0IG9mCisgICAgICogIGJsb2NrcyBieSBhZGRpbmcgdGhpcyBibG9jayB0byB0aGUgZnJlZSBsaXN0IG9yIGRlbGV0aW5nIHRoaXMKKyAgICAgKiAgb3IgbGFyZ2VyIGJsb2NrcyBmcm9tIHRoZSBmcmVlIGxpc3QuCisgICAgICovCisgICAgdm9pZAorICAgIF9NX3ZhbGlkYXRlKHNpemVfdCogX19hZGRyKSB0aHJvdygpCisgICAgeworICAgICAgdmVjdG9yX3R5cGUmIF9fZnJlZV9saXN0ID0gX01fZ2V0X2ZyZWVfbGlzdCgpOworICAgICAgY29uc3QgdmVjdG9yX3R5cGU6OnNpemVfdHlwZSBfX21heF9zaXplID0gNjQ7CisgICAgICBpZiAoX19mcmVlX2xpc3Quc2l6ZSgpID49IF9fbWF4X3NpemUpCisJeworCSAgLy8gT2ssIHRoZSB0aHJlc2hvbGQgdmFsdWUgaGFzIGJlZW4gcmVhY2hlZC4gIFdlIGRldGVybWluZQorCSAgLy8gd2hpY2ggYmxvY2sgdG8gcmVtb3ZlIGZyb20gdGhlIGxpc3Qgb2YgZnJlZSBibG9ja3MuCisJICBpZiAoKl9fYWRkciA+PSAqX19mcmVlX2xpc3QuYmFjaygpKQorCSAgICB7CisJICAgICAgLy8gT2ssIHRoZSBuZXcgYmxvY2sgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZQorCSAgICAgIC8vIGxhc3QgYmxvY2sgaW4gdGhlIGxpc3Qgb2YgZnJlZSBibG9ja3MuIFdlIGp1c3QgZnJlZQorCSAgICAgIC8vIHRoZSBuZXcgYmxvY2suCisJICAgICAgOjpvcGVyYXRvciBkZWxldGUoc3RhdGljX2Nhc3Q8dm9pZCo+KF9fYWRkcikpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLy8gRGVhbGxvY2F0ZSB0aGUgbGFzdCBibG9jayBpbiB0aGUgbGlzdCBvZiBmcmVlIGxpc3RzLAorCSAgICAgIC8vIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmUgaW4gaXRzIGNvcnJlY3QgcG9zaXRpb24uCisJICAgICAgOjpvcGVyYXRvciBkZWxldGUoc3RhdGljX2Nhc3Q8dm9pZCo+KF9fZnJlZV9saXN0LmJhY2soKSkpOworCSAgICAgIF9fZnJlZV9saXN0LnBvcF9iYWNrKCk7CisJICAgIH0KKwl9CisJICAKKyAgICAgIC8vIEp1c3QgYWRkIHRoZSBibG9jayB0byB0aGUgbGlzdCBvZiBmcmVlIGxpc3RzIHVuY29uZGl0aW9uYWxseS4KKyAgICAgIGl0ZXJhdG9yIF9fdGVtcCA9IF9fZGV0YWlsOjpfX2xvd2VyX2JvdW5kCisJKF9fZnJlZV9saXN0LmJlZ2luKCksIF9fZnJlZV9saXN0LmVuZCgpLCAKKwkgKl9fYWRkciwgX0xUX3BvaW50ZXJfY29tcGFyZSgpKTsKKworICAgICAgLy8gV2UgbWF5IGluc2VydCB0aGUgbmV3IGZyZWUgbGlzdCBiZWZvcmUgX3RlbXA7CisgICAgICBfX2ZyZWVfbGlzdC5pbnNlcnQoX190ZW1wLCBfX2FkZHIpOworICAgIH0KKworICAgIC8qKiBAYnJpZWYgIERlY2lkZXMgd2hldGhlciB0aGUgd2FzdGFnZSBvZiBtZW1vcnkgaXMgYWNjZXB0YWJsZSBmb3IKKyAgICAgKiAgdGhlIGN1cnJlbnQgbWVtb3J5IHJlcXVlc3QgYW5kIHJldHVybnMgYWNjb3JkaW5nbHkuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIF9fYmxvY2tfc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgYmxvY2sgYXZhaWxhYmxlIGluIHRoZSBmcmVlCisgICAgICogIGxpc3QuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIF9fcmVxdWlyZWRfc2l6ZSBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgbWVtb3J5IGJsb2NrLgorICAgICAqCisgICAgICogIEByZXR1cm4gdHJ1ZSBpZiB0aGUgd2FzdGFnZSBpbmN1cnJlZCBpcyBhY2NlcHRhYmxlLCBlbHNlIHJldHVybnMKKyAgICAgKiAgZmFsc2UuCisgICAgICovCisgICAgYm9vbCAKKyAgICBfTV9zaG91bGRfaV9naXZlKHNpemVfdCBfX2Jsb2NrX3NpemUsIAorCQkgICAgIHNpemVfdCBfX3JlcXVpcmVkX3NpemUpIHRocm93KCkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3QgX19tYXhfd2FzdGFnZV9wZXJjZW50YWdlID0gMzY7CisgICAgICBpZiAoX19ibG9ja19zaXplID49IF9fcmVxdWlyZWRfc2l6ZSAmJiAKKwkgICgoKF9fYmxvY2tfc2l6ZSAtIF9fcmVxdWlyZWRfc2l6ZSkgKiAxMDAgLyBfX2Jsb2NrX3NpemUpCisJICAgPCBfX21heF93YXN0YWdlX3BlcmNlbnRhZ2UpKQorCXJldHVybiB0cnVlOworICAgICAgZWxzZQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIC8qKiBAYnJpZWYgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBibG9jayBvZiBtZW1vcnkgdG8gdGhlCisgICAgICogIGludGVybmFsIGZyZWUgbGlzdC4KKyAgICAgKgorICAgICAqICBAcGFyYW0gIF9fYWRkciBUaGUgcG9pbnRlciB0byB0aGUgbWVtb3J5IGJsb2NrIHRoYXQgd2FzIGdpdmVuCisgICAgICogIGJ5IGEgY2FsbCB0byB0aGUgX01fZ2V0IGZ1bmN0aW9uLgorICAgICAqLworICAgIGlubGluZSB2b2lkIAorICAgIF9NX2luc2VydChzaXplX3QqIF9fYWRkcikgdGhyb3coKQorICAgIHsKKyNpZiBkZWZpbmVkIF9fR1RIUkVBRFMKKyAgICAgIF9fc2NvcGVkX2xvY2sgX19iZmxfbG9jayhfTV9nZXRfbXV0ZXgoKSk7CisjZW5kaWYKKyAgICAgIC8vIENhbGwgX01fdmFsaWRhdGUgdG8gZGVjaWRlIHdoYXQgc2hvdWxkIGJlIGRvbmUgd2l0aAorICAgICAgLy8gdGhpcyBwYXJ0aWN1bGFyIGZyZWUgbGlzdC4KKyAgICAgIHRoaXMtPl9NX3ZhbGlkYXRlKHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Kj4oX19hZGRyKSAtIDEpOworICAgICAgLy8gU2VlIGRpc2N1c3Npb24gYXMgdG8gd2h5IHRoaXMgaXMgMSEKKyAgICB9CisgICAgCisgICAgLyoqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBnZXRzIGEgYmxvY2sgb2YgbWVtb3J5IG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgc2l6ZSBmcm9tIHRoZSBmcmVlIGxpc3QuCisgICAgICoKKyAgICAgKiAgQHBhcmFtICBfX3N6IFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBtZW1vcnkgcmVxdWlyZWQuCisgICAgICoKKyAgICAgKiAgQHJldHVybiAgQSBwb2ludGVyIHRvIHRoZSBuZXcgbWVtb3J5IGJsb2NrIG9mIHNpemUgYXQgbGVhc3QKKyAgICAgKiAgZXF1YWwgdG8gdGhhdCByZXF1ZXN0ZWQuCisgICAgICovCisgICAgc2l6ZV90KgorICAgIF9NX2dldChzaXplX3QgX19zeikgdGhyb3coc3RkOjpiYWRfYWxsb2MpOworCisgICAgLyoqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBqdXN0IGNsZWFycyB0aGUgaW50ZXJuYWwgRnJlZSBMaXN0LCBhbmQKKyAgICAgKiAgZ2l2ZXMgYmFjayBhbGwgdGhlIG1lbW9yeSB0byB0aGUgT1MuCisgICAgICovCisgICAgdm9pZCAKKyAgICBfTV9jbGVhcigpOworICB9OworCisKKyAgLy8gRm9yd2FyZCBkZWNsYXJlIHRoZSBjbGFzcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAKKyAgICBjbGFzcyBiaXRtYXBfYWxsb2NhdG9yOworCisgIC8vIFNwZWNpYWxpemUgZm9yIHZvaWQ6CisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBiaXRtYXBfYWxsb2NhdG9yPHZvaWQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdm9pZCogICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3Qgdm9pZCogY29uc3RfcG9pbnRlcjsKKworICAgICAgLy8gUmVmZXJlbmNlLXRvLXZvaWQgbWVtYmVycyBhcmUgaW1wb3NzaWJsZS4KKyAgICAgIHR5cGVkZWYgdm9pZCAgdmFsdWVfdHlwZTsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHN0cnVjdCByZWJpbmQKKwl7CisJICB0eXBlZGVmIGJpdG1hcF9hbGxvY2F0b3I8X1RwMT4gb3RoZXI7CisJfTsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgQml0bWFwIEFsbG9jYXRvciwgcHJpbWFyeSB0ZW1wbGF0ZS4KKyAgICogQGluZ3JvdXAgYWxsb2NhdG9ycworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIGJpdG1hcF9hbGxvY2F0b3IgOiBwcml2YXRlIGZyZWVfbGlzdAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHNpemVfdCAgICAJCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90IAkJZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfVHAqICAgICAgICAJCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCogIAkJY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgX1RwJiAgICAgICAgCQlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCYgIAkJY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIGZyZWVfbGlzdDo6X19tdXRleF90eXBlIAlfX211dGV4X3R5cGU7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHN0cnVjdCByZWJpbmQKKwl7CisJICB0eXBlZGVmIGJpdG1hcF9hbGxvY2F0b3I8X1RwMT4gb3RoZXI7CisJfTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxMDMuIHByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50CisgICAgICB0eXBlZGVmIHN0ZDo6dHJ1ZV90eXBlIHByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50OworI2VuZGlmCisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8c2l6ZV90IF9CU2l6ZSwgc2l6ZV90IF9BbGlnblNpemU+CisgICAgICAgIHN0cnVjdCBhbGlnbmVkX3NpemUKKwl7CisJICBlbnVtCisJICAgIHsgCisJICAgICAgbW9kdWx1cyA9IF9CU2l6ZSAlIF9BbGlnblNpemUsCisJICAgICAgdmFsdWUgPSBfQlNpemUgKyAobW9kdWx1cyA/IF9BbGlnblNpemUgLSAobW9kdWx1cykgOiAwKQorCSAgICB9OworCX07CisKKyAgICAgIHN0cnVjdCBfQWxsb2NfYmxvY2sKKyAgICAgIHsKKwljaGFyIF9fTV91bnVzZWRbYWxpZ25lZF9zaXplPHNpemVvZih2YWx1ZV90eXBlKSwKKwkJCV9CQUxMT0NfQUxJR05fQllURVM+Ojp2YWx1ZV07CisgICAgICB9OworCisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpwYWlyPF9BbGxvY19ibG9jayosIF9BbGxvY19ibG9jayo+IF9CbG9ja19wYWlyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZGV0YWlsOjpfX21pbmlfdmVjdG9yPF9CbG9ja19wYWlyPiBfQlBWZWN0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CUFZlY3Rvcjo6aXRlcmF0b3IgX0JQaXRlcjsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICAgICAgc3RhdGljIF9CUGl0ZXIKKyAgICAgICAgX1NfZmluZChfUHJlZGljYXRlIF9fcCkKKyAgICAgICAgeworCSAgX0JQaXRlciBfX2ZpcnN0ID0gX1NfbWVtX2Jsb2Nrcy5iZWdpbigpOworCSAgd2hpbGUgKF9fZmlyc3QgIT0gX1NfbWVtX2Jsb2Nrcy5lbmQoKSAmJiAhX19wKCpfX2ZpcnN0KSkKKwkgICAgKytfX2ZpcnN0OworCSAgcmV0dXJuIF9fZmlyc3Q7CisJfQorCisjaWYgZGVmaW5lZCBfR0xJQkNYWF9ERUJVRworICAgICAgLy8gQ29tcGxleGl0eTogTyhsZyhOKSkuIFdoZXJlLCBOIGlzIHRoZSBudW1iZXIgb2YgYmxvY2sgb2Ygc2l6ZQorICAgICAgLy8gc2l6ZW9mKHZhbHVlX3R5cGUpLgorICAgICAgdm9pZCAKKyAgICAgIF9TX2NoZWNrX2Zvcl9mcmVlX2Jsb2NrcygpIHRocm93KCkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fZGV0YWlsOjpfRmZpdF9maW5kZXI8X0FsbG9jX2Jsb2NrKj4gX0ZGRjsKKwlfQlBpdGVyIF9fYnBpID0gX1NfZmluZChfRkZGKCkpOworCisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9fYnBpID09IF9TX21lbV9ibG9ja3MuZW5kKCkpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8qKiBAYnJpZWYgIFJlc3BvbnNpYmxlIGZvciBleHBvbmVudGlhbGx5IGdyb3dpbmcgdGhlIGludGVybmFsCisgICAgICAgKiAgbWVtb3J5IHBvb2wuCisgICAgICAgKgorICAgICAgICogIEB0aHJvdyAgc3RkOjpiYWRfYWxsb2MuIElmIG1lbW9yeSBjYW4gbm90IGJlIGFsbG9jYXRlZC4KKyAgICAgICAqCisgICAgICAgKiAgQ29tcGxleGl0eTogTygxKSwgYnV0IGludGVybmFsbHkgZGVwZW5kcyB1cG9uIHRoZQorICAgICAgICogIGNvbXBsZXhpdHkgb2YgdGhlIGZ1bmN0aW9uIGZyZWVfbGlzdDo6X01fZ2V0LiBUaGUgcGFydCB3aGVyZQorICAgICAgICogIHRoZSBiaXRtYXAgaGVhZGVycyBhcmUgd3JpdHRlbiBoYXMgY29tcGxleGl0eTogTyhYKSx3aGVyZSBYCisgICAgICAgKiAgaXMgdGhlIG51bWJlciBvZiBibG9ja3Mgb2Ygc2l6ZSBzaXplb2YodmFsdWVfdHlwZSkgd2l0aGluCisgICAgICAgKiAgdGhlIG5ld2x5IGFjcXVpcmVkIGJsb2NrLiBIYXZpbmcgYSB0aWdodCBib3VuZC4KKyAgICAgICAqLworICAgICAgdm9pZCAKKyAgICAgIF9TX3JlZmlsbF9wb29sKCkgdGhyb3coc3RkOjpiYWRfYWxsb2MpCisgICAgICB7CisjaWYgZGVmaW5lZCBfR0xJQkNYWF9ERUJVRworCV9TX2NoZWNrX2Zvcl9mcmVlX2Jsb2NrcygpOworI2VuZGlmCisKKwljb25zdCBzaXplX3QgX19udW1fYml0bWFwcyA9IChfU19ibG9ja19zaXplCisJCQkJICAgICAgLyBzaXplX3QoX19kZXRhaWw6OmJpdHNfcGVyX2Jsb2NrKSk7CisJY29uc3Qgc2l6ZV90IF9fc2l6ZV90b19hbGxvY2F0ZSA9IHNpemVvZihzaXplX3QpIAorCSAgKyBfU19ibG9ja19zaXplICogc2l6ZW9mKF9BbGxvY19ibG9jaykgCisJICArIF9fbnVtX2JpdG1hcHMgKiBzaXplb2Yoc2l6ZV90KTsKKworCXNpemVfdCogX190ZW1wID0KKwkgIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Kj4odGhpcy0+X01fZ2V0KF9fc2l6ZV90b19hbGxvY2F0ZSkpOworCSpfX3RlbXAgPSAwOworCSsrX190ZW1wOworCisJLy8gVGhlIEhlYWRlciBpbmZvcm1hdGlvbiBnb2VzIGF0IHRoZSBCZWdpbm5pbmcgb2YgdGhlIEJsb2NrLgorCV9CbG9ja19wYWlyIF9fYnAgPSAKKwkgIHN0ZDo6bWFrZV9wYWlyKHJlaW50ZXJwcmV0X2Nhc3Q8X0FsbG9jX2Jsb2NrKj4KKwkJCSAoX190ZW1wICsgX19udW1fYml0bWFwcyksIAorCQkJIHJlaW50ZXJwcmV0X2Nhc3Q8X0FsbG9jX2Jsb2NrKj4KKwkJCSAoX190ZW1wICsgX19udW1fYml0bWFwcykgCisJCQkgKyBfU19ibG9ja19zaXplIC0gMSk7CisJCisJLy8gRmlsbCB0aGUgVmVjdG9yIHdpdGggdGhpcyBpbmZvcm1hdGlvbi4KKwlfU19tZW1fYmxvY2tzLnB1c2hfYmFjayhfX2JwKTsKKworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbnVtX2JpdG1hcHM7ICsrX19pKQorCSAgX190ZW1wW19faV0gPSB+c3RhdGljX2Nhc3Q8c2l6ZV90PigwKTsgLy8gMSBJbmRpY2F0ZXMgYWxsIEZyZWUuCisKKwlfU19ibG9ja19zaXplICo9IDI7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBfQlBWZWN0b3IgX1NfbWVtX2Jsb2NrczsKKyAgICAgIHN0YXRpYyBzaXplX3QgX1NfYmxvY2tfc2l6ZTsKKyAgICAgIHN0YXRpYyBfX2RldGFpbDo6X0JpdG1hcF9jb3VudGVyPF9BbGxvY19ibG9jayo+IF9TX2xhc3RfcmVxdWVzdDsKKyAgICAgIHN0YXRpYyB0eXBlbmFtZSBfQlBWZWN0b3I6OnNpemVfdHlwZSBfU19sYXN0X2RlYWxsb2NfaW5kZXg7CisjaWYgZGVmaW5lZCBfX0dUSFJFQURTCisgICAgICBzdGF0aWMgX19tdXRleF90eXBlIF9TX211dDsKKyNlbmRpZgorCisgICAgcHVibGljOgorCisgICAgICAvKiogQGJyaWVmICBBbGxvY2F0ZXMgbWVtb3J5IGZvciBhIHNpbmdsZSBvYmplY3Qgb2Ygc2l6ZQorICAgICAgICogIHNpemVvZihfVHApLgorICAgICAgICoKKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6YmFkX2FsbG9jLiBJZiBtZW1vcnkgY2FuIG5vdCBiZSBhbGxvY2F0ZWQuCisgICAgICAgKgorICAgICAgICogIENvbXBsZXhpdHk6IFdvcnN0IGNhc2UgY29tcGxleGl0eSBpcyBPKE4pLCBidXQgdGhhdAorICAgICAgICogIGlzIGhhcmRseSBldmVyIGhpdC4gSWYgYW5kIHdoZW4gdGhpcyBwYXJ0aWN1bGFyIGNhc2UgaXMKKyAgICAgICAqICBlbmNvdW50ZXJlZCwgdGhlIG5leHQgZmV3IGNhc2VzIGFyZSBndWFyYW50ZWVkIHRvIGhhdmUgYQorICAgICAgICogIHdvcnN0IGNhc2UgY29tcGxleGl0eSBvZiBPKDEpISAgVGhhdCdzIHdoeSB0aGlzIGZ1bmN0aW9uCisgICAgICAgKiAgcGVyZm9ybXMgdmVyeSB3ZWxsIG9uIGF2ZXJhZ2UuIFlvdSBjYW4gY29uc2lkZXIgdGhpcworICAgICAgICogIGZ1bmN0aW9uIHRvIGhhdmUgYSBjb21wbGV4aXR5IHJlZmVycmVkIHRvIGNvbW1vbmx5IGFzOgorICAgICAgICogIEFtb3J0aXplZCBDb25zdGFudCB0aW1lLgorICAgICAgICovCisgICAgICBwb2ludGVyIAorICAgICAgX01fYWxsb2NhdGVfc2luZ2xlX29iamVjdCgpIHRocm93KHN0ZDo6YmFkX2FsbG9jKQorICAgICAgeworI2lmIGRlZmluZWQgX19HVEhSRUFEUworCV9fc2NvcGVkX2xvY2sgX19iaXRfbG9jayhfU19tdXQpOworI2VuZGlmCisKKwkvLyBUaGUgYWxnb3JpdGhtIGlzIHNvbWV0aGluZyBsaWtlIHRoaXM6IFRoZSBsYXN0X3JlcXVlc3QKKwkvLyB2YXJpYWJsZSBwb2ludHMgdG8gdGhlIGxhc3QgYWNjZXNzZWQgQml0IE1hcC4gV2hlbiBzdWNoIGEKKwkvLyBjb25kaXRpb24gb2NjdXJzLCB3ZSB0cnkgdG8gZmluZCBhIGZyZWUgYmxvY2sgaW4gdGhlCisJLy8gY3VycmVudCBiaXRtYXAsIG9yIHN1Y2NlZWRpbmcgYml0bWFwcyB1bnRpbCB0aGUgbGFzdCBiaXRtYXAKKwkvLyBpcyByZWFjaGVkLiBJZiBubyBmcmVlIGJsb2NrIHR1cm5zIHVwLCB3ZSByZXNvcnQgdG8gRmlyc3QKKwkvLyBGaXQgbWV0aG9kLgorCisJLy8gV0FSTklORzogRG8gbm90IHJlLW9yZGVyIHRoZSBjb25kaXRpb24gaW4gdGhlIHdoaWxlCisJLy8gc3RhdGVtZW50IGJlbG93LCBiZWNhdXNlIGl0IHJlbGllcyBvbiBDKysncyBzaG9ydC1jaXJjdWl0CisJLy8gZXZhbHVhdGlvbi4gVGhlIHJldHVybiBmcm9tIF9TX2xhc3RfcmVxdWVzdC0+X01fZ2V0KCkgd2lsbAorCS8vIE5PVCBiZSBkZXJlZmVyZW5jZSBhYmxlIGlmIF9TX2xhc3RfcmVxdWVzdC0+X01fZmluaXNoZWQoKQorCS8vIHJldHVybnMgdHJ1ZS4gVGhpcyB3b3VsZCBpbmV2aXRhYmx5IGxlYWQgdG8gYSBOVUxMIHBvaW50ZXIKKwkvLyBkZXJlZmVyZW5jZSBpZiB0aW5rZXJlZCB3aXRoLgorCXdoaWxlIChfU19sYXN0X3JlcXVlc3QuX01fZmluaXNoZWQoKSA9PSBmYWxzZQorCSAgICAgICAmJiAoKihfU19sYXN0X3JlcXVlc3QuX01fZ2V0KCkpID09IDApKQorCSAgX1NfbGFzdF9yZXF1ZXN0Lm9wZXJhdG9yKysoKTsKKworCWlmIChfX2J1aWx0aW5fZXhwZWN0KF9TX2xhc3RfcmVxdWVzdC5fTV9maW5pc2hlZCgpID09IHRydWUsIGZhbHNlKSkKKwkgIHsKKwkgICAgLy8gRmFsbCBCYWNrIHRvIEZpcnN0IEZpdCBhbGdvcml0aG0uCisJICAgIHR5cGVkZWYgdHlwZW5hbWUgX19kZXRhaWw6Ol9GZml0X2ZpbmRlcjxfQWxsb2NfYmxvY2sqPiBfRkZGOworCSAgICBfRkZGIF9fZmZmOworCSAgICBfQlBpdGVyIF9fYnBpID0gX1NfZmluZChfX2RldGFpbDo6X0Z1bmN0b3JfUmVmPF9GRkY+KF9fZmZmKSk7CisKKwkgICAgaWYgKF9fYnBpICE9IF9TX21lbV9ibG9ja3MuZW5kKCkpCisJICAgICAgeworCQkvLyBTZWFyY2ggd2FzIHN1Y2Nlc3NmdWwuIE9rLCBub3cgbWFyayB0aGUgZmlyc3QgYml0IGZyb20KKwkJLy8gdGhlIHJpZ2h0IGFzIDAsIG1lYW5pbmcgQWxsb2NhdGVkLiBUaGlzIGJpdCBpcyBvYnRhaW5lZAorCQkvLyBieSBjYWxsaW5nIF9NX2dldCgpIG9uIF9fZmZmLgorCQlzaXplX3QgX19uel9iaXQgPSBfQml0X3NjYW5fZm9yd2FyZCgqX19mZmYuX01fZ2V0KCkpOworCQlfX2RldGFpbDo6X19iaXRfYWxsb2NhdGUoX19mZmYuX01fZ2V0KCksIF9fbnpfYml0KTsKKworCQlfU19sYXN0X3JlcXVlc3QuX01fcmVzZXQoX19icGkgLSBfU19tZW1fYmxvY2tzLmJlZ2luKCkpOworCisJCS8vIE5vdywgZ2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBiaXQgd2UgbWFya2VkIGFzIGFsbG9jYXRlZC4KKwkJcG9pbnRlciBfX3JldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8cG9pbnRlcj4KKwkJICAoX19icGktPmZpcnN0ICsgX19mZmYuX01fb2Zmc2V0KCkgKyBfX256X2JpdCk7CisJCXNpemVfdCogX19wdXNlX2NvdW50ID0gCisJCSAgcmVpbnRlcnByZXRfY2FzdDxzaXplX3QqPgorCQkgIChfX2JwaS0+Zmlyc3QpIC0gKF9fZGV0YWlsOjpfX251bV9iaXRtYXBzKCpfX2JwaSkgKyAxKTsKKwkJCisJCSsrKCpfX3B1c2VfY291bnQpOworCQlyZXR1cm4gX19yZXQ7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQkvLyBTZWFyY2ggd2FzIHVuc3VjY2Vzc2Z1bC4gV2UgQWRkIG1vcmUgbWVtb3J5IHRvIHRoZQorCQkvLyBwb29sIGJ5IGNhbGxpbmcgX1NfcmVmaWxsX3Bvb2woKS4KKwkJX1NfcmVmaWxsX3Bvb2woKTsKKworCQkvLyBfTV9SZXNldCB0aGUgX1NfbGFzdF9yZXF1ZXN0IHN0cnVjdHVyZSB0byB0aGUgZmlyc3QKKwkJLy8gZnJlZSBibG9jaydzIGJpdCBtYXAuCisJCV9TX2xhc3RfcmVxdWVzdC5fTV9yZXNldChfU19tZW1fYmxvY2tzLnNpemUoKSAtIDEpOworCisJCS8vIE5vdywgbWFyayB0aGF0IGJpdCBhcyBhbGxvY2F0ZWQuCisJICAgICAgfQorCSAgfQorCisJLy8gX1NfbGFzdF9yZXF1ZXN0IGhvbGRzIGEgcG9pbnRlciB0byBhIHZhbGlkIGJpdCBtYXAsIHRoYXQKKwkvLyBwb2ludHMgdG8gYSBmcmVlIGJsb2NrIGluIG1lbW9yeS4KKwlzaXplX3QgX19uel9iaXQgPSBfQml0X3NjYW5fZm9yd2FyZCgqX1NfbGFzdF9yZXF1ZXN0Ll9NX2dldCgpKTsKKwlfX2RldGFpbDo6X19iaXRfYWxsb2NhdGUoX1NfbGFzdF9yZXF1ZXN0Ll9NX2dldCgpLCBfX256X2JpdCk7CisKKwlwb2ludGVyIF9fcmV0ID0gcmVpbnRlcnByZXRfY2FzdDxwb2ludGVyPgorCSAgKF9TX2xhc3RfcmVxdWVzdC5fTV9iYXNlKCkgKyBfU19sYXN0X3JlcXVlc3QuX01fb2Zmc2V0KCkgKyBfX256X2JpdCk7CisKKwlzaXplX3QqIF9fcHVzZV9jb3VudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Kj4KKwkgIChfU19tZW1fYmxvY2tzW19TX2xhc3RfcmVxdWVzdC5fTV93aGVyZSgpXS5maXJzdCkKKwkgIC0gKF9fZGV0YWlsOjoKKwkgICAgIF9fbnVtX2JpdG1hcHMoX1NfbWVtX2Jsb2Nrc1tfU19sYXN0X3JlcXVlc3QuX01fd2hlcmUoKV0pICsgMSk7CisKKwkrKygqX19wdXNlX2NvdW50KTsKKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIC8qKiBAYnJpZWYgIERlYWxsb2NhdGVzIG1lbW9yeSB0aGF0IGJlbG9uZ3MgdG8gYSBzaW5nbGUgb2JqZWN0IG9mCisgICAgICAgKiAgc2l6ZSBzaXplb2YoX1RwKS4KKyAgICAgICAqCisgICAgICAgKiAgQ29tcGxleGl0eTogTyhsZyhOKSksIGJ1dCB0aGUgd29yc3QgY2FzZSBpcyBub3QgaGl0CisgICAgICAgKiAgb2Z0ZW4hICBUaGlzIGlzIGJlY2F1c2UgY29udGFpbmVycyB1c3VhbGx5IGRlYWxsb2NhdGUgbWVtb3J5CisgICAgICAgKiAgY2xvc2UgdG8gZWFjaCBvdGhlciBhbmQgdGhpcyBjYXNlIGlzIGhhbmRsZWQgaW4gTygxKSB0aW1lIGJ5CisgICAgICAgKiAgdGhlIGRlYWxsb2NhdGUgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQgCisgICAgICBfTV9kZWFsbG9jYXRlX3NpbmdsZV9vYmplY3QocG9pbnRlciBfX3ApIHRocm93KCkKKyAgICAgIHsKKyNpZiBkZWZpbmVkIF9fR1RIUkVBRFMKKwlfX3Njb3BlZF9sb2NrIF9fYml0X2xvY2soX1NfbXV0KTsKKyNlbmRpZgorCV9BbGxvY19ibG9jayogX19yZWFsX3AgPSByZWludGVycHJldF9jYXN0PF9BbGxvY19ibG9jayo+KF9fcCk7CisKKwl0eXBlZGVmIHR5cGVuYW1lIF9CUFZlY3Rvcjo6aXRlcmF0b3IgX0l0ZXJhdG9yOworCXR5cGVkZWYgdHlwZW5hbWUgX0JQVmVjdG9yOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VfdHlwZTsKKworCV9EaWZmZXJlbmNlX3R5cGUgX19kaWZmOworCWxvbmcgX19kaXNwbGFjZW1lbnQ7CisKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX1NfbGFzdF9kZWFsbG9jX2luZGV4ID49IDApOworCisJX19kZXRhaWw6Ol9JbmNsdXNpdmVfYmV0d2VlbjxfQWxsb2NfYmxvY2sqPiBfX2lidChfX3JlYWxfcCk7CisJaWYgKF9faWJ0KF9TX21lbV9ibG9ja3NbX1NfbGFzdF9kZWFsbG9jX2luZGV4XSkpCisJICB7CisJICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfU19sYXN0X2RlYWxsb2NfaW5kZXgKKwkJCQkgIDw9IF9TX21lbV9ibG9ja3Muc2l6ZSgpIC0gMSk7CisKKwkgICAgLy8gSW5pdGlhbCBBc3N1bXB0aW9uIHdhcyBjb3JyZWN0IQorCSAgICBfX2RpZmYgPSBfU19sYXN0X2RlYWxsb2NfaW5kZXg7CisJICAgIF9fZGlzcGxhY2VtZW50ID0gX19yZWFsX3AgLSBfU19tZW1fYmxvY2tzW19fZGlmZl0uZmlyc3Q7CisJICB9CisJZWxzZQorCSAgeworCSAgICBfSXRlcmF0b3IgX2l0ZXIgPSBfU19maW5kKF9faWJ0KTsKKworCSAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX2l0ZXIgIT0gX1NfbWVtX2Jsb2Nrcy5lbmQoKSk7CisKKwkgICAgX19kaWZmID0gX2l0ZXIgLSBfU19tZW1fYmxvY2tzLmJlZ2luKCk7CisJICAgIF9fZGlzcGxhY2VtZW50ID0gX19yZWFsX3AgLSBfU19tZW1fYmxvY2tzW19fZGlmZl0uZmlyc3Q7CisJICAgIF9TX2xhc3RfZGVhbGxvY19pbmRleCA9IF9fZGlmZjsKKwkgIH0KKworCS8vIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGl0ZXJhdG9yIHRoYXQgaGFzIGJlZW4gZm91bmQuCisJY29uc3Qgc2l6ZV90IF9fcm90YXRlID0gKF9fZGlzcGxhY2VtZW50CisJCQkJICUgc2l6ZV90KF9fZGV0YWlsOjpiaXRzX3Blcl9ibG9jaykpOworCXNpemVfdCogX19iaXRtYXBDID0gCisJICByZWludGVycHJldF9jYXN0PHNpemVfdCo+CisJICAoX1NfbWVtX2Jsb2Nrc1tfX2RpZmZdLmZpcnN0KSAtIDE7CisJX19iaXRtYXBDIC09IChfX2Rpc3BsYWNlbWVudCAvIHNpemVfdChfX2RldGFpbDo6Yml0c19wZXJfYmxvY2spKTsKKyAgICAgIAorCV9fZGV0YWlsOjpfX2JpdF9mcmVlKF9fYml0bWFwQywgX19yb3RhdGUpOworCXNpemVfdCogX19wdXNlX2NvdW50ID0gcmVpbnRlcnByZXRfY2FzdDxzaXplX3QqPgorCSAgKF9TX21lbV9ibG9ja3NbX19kaWZmXS5maXJzdCkKKwkgIC0gKF9fZGV0YWlsOjpfX251bV9iaXRtYXBzKF9TX21lbV9ibG9ja3NbX19kaWZmXSkgKyAxKTsKKwkKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoKl9fcHVzZV9jb3VudCAhPSAwKTsKKworCS0tKCpfX3B1c2VfY291bnQpOworCisJaWYgKF9fYnVpbHRpbl9leHBlY3QoKl9fcHVzZV9jb3VudCA9PSAwLCBmYWxzZSkpCisJICB7CisJICAgIF9TX2Jsb2NrX3NpemUgLz0gMjsKKwkgIAorCSAgICAvLyBXZSBjYW4gc2FmZWx5IHJlbW92ZSB0aGlzIGJsb2NrLgorCSAgICAvLyBfQmxvY2tfcGFpciBfX2JwID0gX1NfbWVtX2Jsb2Nrc1tfX2RpZmZdOworCSAgICB0aGlzLT5fTV9pbnNlcnQoX19wdXNlX2NvdW50KTsKKwkgICAgX1NfbWVtX2Jsb2Nrcy5lcmFzZShfU19tZW1fYmxvY2tzLmJlZ2luKCkgKyBfX2RpZmYpOworCisJICAgIC8vIFJlc2V0IHRoZSBfU19sYXN0X3JlcXVlc3QgdmFyaWFibGUgdG8gcmVmbGVjdCB0aGUKKwkgICAgLy8gZXJhc2VkIGJsb2NrLiBXZSBkbyB0aGlzIHRvIHByb3RlY3QgZnV0dXJlIHJlcXVlc3RzCisJICAgIC8vIGFmdGVyIHRoZSBsYXN0IGJsb2NrIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBhIHBhcnRpY3VsYXIKKwkgICAgLy8gbWVtb3J5IENodW5rLCB3aGljaCBpbiB0dXJuIGhhcyBiZWVuIHJldHVybmVkIHRvIHRoZQorCSAgICAvLyBmcmVlIGxpc3QsIGFuZCBoZW5jZSBoYWQgYmVlbiBlcmFzZWQgZnJvbSB0aGUgdmVjdG9yLAorCSAgICAvLyBzbyB0aGUgc2l6ZSBvZiB0aGUgdmVjdG9yIGdldHMgcmVkdWNlZCBieSAxLgorCSAgICBpZiAoKF9EaWZmZXJlbmNlX3R5cGUpX1NfbGFzdF9yZXF1ZXN0Ll9NX3doZXJlKCkgPj0gX19kaWZmLS0pCisJICAgICAgX1NfbGFzdF9yZXF1ZXN0Ll9NX3Jlc2V0KF9fZGlmZik7IAorCisJICAgIC8vIElmIHRoZSBJbmRleCBpbnRvIHRoZSB2ZWN0b3Igb2YgdGhlIHJlZ2lvbiBvZiBtZW1vcnkKKwkgICAgLy8gdGhhdCBtaWdodCBob2xkIHRoZSBuZXh0IGFkZHJlc3MgdGhhdCB3aWxsIGJlIHBhc3NlZCB0bworCSAgICAvLyBkZWFsbG9jYXRlZCBtYXkgaGF2ZSBiZWVuIGludmFsaWRhdGVkIGR1ZSB0byB0aGUgYWJvdmUKKwkgICAgLy8gZXJhc2UgcHJvY2VkdXJlIGJlaW5nIGNhbGxlZCBvbiB0aGUgdmVjdG9yLCBoZW5jZSB3ZQorCSAgICAvLyB0cnkgdG8gcmVzdG9yZSB0aGlzIGludmFyaWFudCB0b28uCisJICAgIGlmIChfU19sYXN0X2RlYWxsb2NfaW5kZXggPj0gX1NfbWVtX2Jsb2Nrcy5zaXplKCkpCisJICAgICAgeworCQlfU19sYXN0X2RlYWxsb2NfaW5kZXggPShfX2RpZmYgIT0gLTEgPyBfX2RpZmYgOiAwKTsKKwkJX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9TX2xhc3RfZGVhbGxvY19pbmRleCA+PSAwKTsKKwkgICAgICB9CisJICB9CisgICAgICB9CisKKyAgICBwdWJsaWM6CisgICAgICBiaXRtYXBfYWxsb2NhdG9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IH0KKworICAgICAgYml0bWFwX2FsbG9jYXRvcihjb25zdCBiaXRtYXBfYWxsb2NhdG9yJikgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgYml0bWFwX2FsbG9jYXRvcihjb25zdCBiaXRtYXBfYWxsb2NhdG9yPF9UcDE+JikgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICAgIHsgfQorCisgICAgICB+Yml0bWFwX2FsbG9jYXRvcigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgeyB9CisKKyAgICAgIHBvaW50ZXIgCisgICAgICBhbGxvY2F0ZShzaXplX3R5cGUgX19uKQorICAgICAgeworCWlmIChfX24gPiB0aGlzLT5tYXhfc2l6ZSgpKQorCSAgc3RkOjpfX3Rocm93X2JhZF9hbGxvYygpOworCisJaWYgKF9fYnVpbHRpbl9leHBlY3QoX19uID09IDEsIHRydWUpKQorCSAgcmV0dXJuIHRoaXMtPl9NX2FsbG9jYXRlX3NpbmdsZV9vYmplY3QoKTsKKwllbHNlCisJICB7IAorCSAgICBjb25zdCBzaXplX3R5cGUgX19iID0gX19uICogc2l6ZW9mKHZhbHVlX3R5cGUpOworCSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxwb2ludGVyPig6Om9wZXJhdG9yIG5ldyhfX2IpKTsKKwkgIH0KKyAgICAgIH0KKworICAgICAgcG9pbnRlciAKKyAgICAgIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIHR5cGVuYW1lIGJpdG1hcF9hbGxvY2F0b3I8dm9pZD46OmNvbnN0X3BvaW50ZXIpCisgICAgICB7IHJldHVybiBhbGxvY2F0ZShfX24pOyB9CisKKyAgICAgIHZvaWQgCisgICAgICBkZWFsbG9jYXRlKHBvaW50ZXIgX19wLCBzaXplX3R5cGUgX19uKSB0aHJvdygpCisgICAgICB7CisJaWYgKF9fYnVpbHRpbl9leHBlY3QoX19wICE9IDAsIHRydWUpKQorCSAgeworCSAgICBpZiAoX19idWlsdGluX2V4cGVjdChfX24gPT0gMSwgdHJ1ZSkpCisJICAgICAgdGhpcy0+X01fZGVhbGxvY2F0ZV9zaW5nbGVfb2JqZWN0KF9fcCk7CisJICAgIGVsc2UKKwkgICAgICA6Om9wZXJhdG9yIGRlbGV0ZShfX3ApOworCSAgfQorICAgICAgfQorCisgICAgICBwb2ludGVyIAorICAgICAgYWRkcmVzcyhyZWZlcmVuY2UgX19yKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3IpOyB9CisKKyAgICAgIGNvbnN0X3BvaW50ZXIgCisgICAgICBhZGRyZXNzKGNvbnN0X3JlZmVyZW5jZSBfX3IpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9fcik7IH0KKworICAgICAgc2l6ZV90eXBlIAorICAgICAgbWF4X3NpemUoKSBjb25zdCBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHNpemVfdHlwZSgtMSkgLyBzaXplb2YodmFsdWVfdHlwZSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgY29uc3RydWN0KF9VcCogX19wLCBfQXJncyYmLi4uIF9fYXJncykKKwl7IDo6bmV3KCh2b2lkICopX19wKSBfVXAoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIHZvaWQgCisgICAgICAgIGRlc3Ryb3koX1VwKiBfX3ApCisgICAgICAgIHsgX19wLT5+X1VwKCk7IH0KKyNlbHNlCisgICAgICB2b2lkIAorICAgICAgY29uc3RydWN0KHBvaW50ZXIgX19wLCBjb25zdF9yZWZlcmVuY2UgX19kYXRhKQorICAgICAgeyA6Om5ldygodm9pZCAqKV9fcCkgdmFsdWVfdHlwZShfX2RhdGEpOyB9CisKKyAgICAgIHZvaWQgCisgICAgICBkZXN0cm95KHBvaW50ZXIgX19wKQorICAgICAgeyBfX3AtPn52YWx1ZV90eXBlKCk7IH0KKyNlbmRpZgorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICBib29sIAorICAgIG9wZXJhdG9yPT0oY29uc3QgYml0bWFwX2FsbG9jYXRvcjxfVHAxPiYsIAorCSAgICAgICBjb25zdCBiaXRtYXBfYWxsb2NhdG9yPF9UcDI+JikgdGhyb3coKQorICAgIHsgcmV0dXJuIHRydWU7IH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgYm9vbCAKKyAgICBvcGVyYXRvciE9KGNvbnN0IGJpdG1hcF9hbGxvY2F0b3I8X1RwMT4mLCAKKwkgICAgICAgY29uc3QgYml0bWFwX2FsbG9jYXRvcjxfVHAyPiYpIHRocm93KCkgCisgIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8gU3RhdGljIG1lbWJlciBkZWZpbml0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHR5cGVuYW1lIGJpdG1hcF9hbGxvY2F0b3I8X1RwPjo6X0JQVmVjdG9yCisgICAgYml0bWFwX2FsbG9jYXRvcjxfVHA+OjpfU19tZW1fYmxvY2tzOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzaXplX3QgYml0bWFwX2FsbG9jYXRvcjxfVHA+OjpfU19ibG9ja19zaXplID0gCisgICAgMiAqIHNpemVfdChfX2RldGFpbDo6Yml0c19wZXJfYmxvY2spOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB0eXBlbmFtZSBiaXRtYXBfYWxsb2NhdG9yPF9UcD46Ol9CUFZlY3Rvcjo6c2l6ZV90eXBlIAorICAgIGJpdG1hcF9hbGxvY2F0b3I8X1RwPjo6X1NfbGFzdF9kZWFsbG9jX2luZGV4ID0gMDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX19kZXRhaWw6Ol9CaXRtYXBfY291bnRlcgorICAgICAgPHR5cGVuYW1lIGJpdG1hcF9hbGxvY2F0b3I8X1RwPjo6X0FsbG9jX2Jsb2NrKj4KKyAgICBiaXRtYXBfYWxsb2NhdG9yPF9UcD46Ol9TX2xhc3RfcmVxdWVzdChfU19tZW1fYmxvY2tzKTsKKworI2lmIGRlZmluZWQgX19HVEhSRUFEUworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdHlwZW5hbWUgYml0bWFwX2FsbG9jYXRvcjxfVHA+OjpfX211dGV4X3R5cGUKKyAgICBiaXRtYXBfYWxsb2NhdG9yPF9UcD46Ol9TX211dDsKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIF9fZ251X2N4eAorCisjZW5kaWYgCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2Nhc3QuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2Nhc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjFhOTYyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvY2FzdC5oCkBAIC0wLDAgKzEsMTIxIEBACisvLyA8Y2FzdC5oPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L2Nhc3QuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2V4dC9wb2ludGVyLmh9CisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9DQVNUX0gKKyNkZWZpbmUgX0dMSUJDWFhfQ0FTVF9IIDEKKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGhlcmUgdG8gYWxsb3cgY29udGFpbmVycyB0byBzdXBwb3J0IG5vbiBzdGFuZGFyZAorICAgKiBwb2ludGVyIHR5cGVzLiAgRm9yIG5vcm1hbCBwb2ludGVycywgdGhlc2UgcmVzb2x2ZSB0byB0aGUgdXNlIG9mIHRoZQorICAgKiBzdGFuZGFyZCBjYXN0IG9wZXJhdGlvbi4gIEZvciBvdGhlciB0eXBlcyB0aGUgZnVuY3Rpb25zIHdpbGwgcGVyZm9ybQorICAgKiB0aGUgYXBwcnByaWF0ZSBjYXN0IHRvL2Zyb20gdGhlIGN1c3RvbSBwb2ludGVyIGNsYXNzIHNvIGxvbmcgYXMgdGhhdAorICAgKiBjbGFzcyBtZWV0cyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgICAqIDEpIGhhcyBhIHR5cGVkZWYgZWxlbWVudF90eXBlIHdoaWNoIG5hbWVzIHRlaGUgdHlwZSBpdCBwb2ludHMgdG8uCisgICAqIDIpIGhhcyBhIGdldCgpIGNvbnN0IG1ldGhvZCB3aGljaCByZXR1cm5zIGVsZW1lbnRfdHlwZSouCisgICAqIDMpIGhhcyBhIGNvbnN0cnVjdG9yIHdoaWNoIGNhbiB0YWtlIG9uZSBlbGVtZW50X3R5cGUqIGFyZ3VtZW50LgorICAgKi8KKworICAvKioKKyAgICogVGhpcyB0eXBlIHN1cHBvcnRzIHRoZSBzZW1hbnRpY3Mgb2YgdGhlIHBvaW50ZXIgY2FzdCBvcGVyYXRvcnMgKGJlbG93LikKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ub1R5cGU+CisgICAgc3RydWN0IF9DYXN0ZXIKKyAgICB7IHR5cGVkZWYgdHlwZW5hbWUgX1RvVHlwZTo6ZWxlbWVudF90eXBlKiAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG9UeXBlPgorICAgIHN0cnVjdCBfQ2FzdGVyPF9Ub1R5cGUqPgorICAgIHsgdHlwZWRlZiBfVG9UeXBlKiAgdHlwZTsgfTsKKworICAvKioKKyAgICogQ2FzdGluZyBvcGVyYXRpb25zIGZvciBjYXNlcyB3aGVyZSBfRnJvbVR5cGUgaXMgbm90IGEgc3RhbmRhcmQgcG9pbnRlci4KKyAgICogX1RvVHlwZSBjYW4gYmUgYSBzdGFuZGFyZCBvciBub24tc3RhbmRhcmQgcG9pbnRlci4gIEdpdmVuIHRoYXQgX0Zyb21UeXBlCisgICAqIGlzIG5vdCBhIHBvaW50ZXIsIGl0IG11c3QgaGF2ZSBhIGdldCgpIG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIHN0YW5kYXJkCisgICAqIHBvaW50ZXIgZXF1aXZhbGVudCBvZiB0aGUgYWRkcmVzcyBpdCBwb2ludHMgdG8sIGFuZCBtdXN0IGhhdmUgYW4KKyAgICogZWxlbWVudF90eXBlIHR5cGVkZWYgd2hpY2ggbmFtZXMgdGhlIHR5cGUgaXQgcG9pbnRzIHRvLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RvVHlwZSwgdHlwZW5hbWUgX0Zyb21UeXBlPgorICAgIGlubGluZSBfVG9UeXBlCisgICAgX19zdGF0aWNfcG9pbnRlcl9jYXN0KGNvbnN0IF9Gcm9tVHlwZSYgX19hcmcpCisgICAgeyByZXR1cm4gX1RvVHlwZShzdGF0aWNfY2FzdDx0eXBlbmFtZSBfQ2FzdGVyPF9Ub1R5cGU+OjoKKwkJICAgICB0eXBlPihfX2FyZy5nZXQoKSkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RvVHlwZSwgdHlwZW5hbWUgX0Zyb21UeXBlPgorICAgIGlubGluZSBfVG9UeXBlCisgICAgX19keW5hbWljX3BvaW50ZXJfY2FzdChjb25zdCBfRnJvbVR5cGUmIF9fYXJnKQorICAgIHsgcmV0dXJuIF9Ub1R5cGUoZHluYW1pY19jYXN0PHR5cGVuYW1lIF9DYXN0ZXI8X1RvVHlwZT46OgorCQkgICAgIHR5cGU+KF9fYXJnLmdldCgpKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG9UeXBlLCB0eXBlbmFtZSBfRnJvbVR5cGU+CisgICAgaW5saW5lIF9Ub1R5cGUKKyAgICBfX2NvbnN0X3BvaW50ZXJfY2FzdChjb25zdCBfRnJvbVR5cGUmIF9fYXJnKQorICAgIHsgcmV0dXJuIF9Ub1R5cGUoY29uc3RfY2FzdDx0eXBlbmFtZSBfQ2FzdGVyPF9Ub1R5cGU+OjoKKwkJICAgICB0eXBlPihfX2FyZy5nZXQoKSkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RvVHlwZSwgdHlwZW5hbWUgX0Zyb21UeXBlPgorICAgIGlubGluZSBfVG9UeXBlCisgICAgX19yZWludGVycHJldF9wb2ludGVyX2Nhc3QoY29uc3QgX0Zyb21UeXBlJiBfX2FyZykKKyAgICB7IHJldHVybiBfVG9UeXBlKHJlaW50ZXJwcmV0X2Nhc3Q8dHlwZW5hbWUgX0Nhc3RlcjxfVG9UeXBlPjo6CisJCSAgICAgdHlwZT4oX19hcmcuZ2V0KCkpKTsgfQorCisgIC8qKgorICAgKiBDYXN0aW5nIG9wZXJhdGlvbnMgZm9yIGNhc2VzIHdoZXJlIF9Gcm9tVHlwZSBpcyBhIHN0YW5kYXJkIHBvaW50ZXIuCisgICAqIF9Ub1R5cGUgY2FuIGJlIGEgc3RhbmRhcmQgb3Igbm9uLXN0YW5kYXJkIHBvaW50ZXIuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG9UeXBlLCB0eXBlbmFtZSBfRnJvbVR5cGU+CisgICAgaW5saW5lIF9Ub1R5cGUKKyAgICBfX3N0YXRpY19wb2ludGVyX2Nhc3QoX0Zyb21UeXBlKiBfX2FyZykKKyAgICB7IHJldHVybiBfVG9UeXBlKHN0YXRpY19jYXN0PHR5cGVuYW1lIF9DYXN0ZXI8X1RvVHlwZT46OgorCQkgICAgIHR5cGU+KF9fYXJnKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG9UeXBlLCB0eXBlbmFtZSBfRnJvbVR5cGU+CisgICAgaW5saW5lIF9Ub1R5cGUKKyAgICBfX2R5bmFtaWNfcG9pbnRlcl9jYXN0KF9Gcm9tVHlwZSogX19hcmcpCisgICAgeyByZXR1cm4gX1RvVHlwZShkeW5hbWljX2Nhc3Q8dHlwZW5hbWUgX0Nhc3RlcjxfVG9UeXBlPjo6CisJCSAgICAgdHlwZT4oX19hcmcpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ub1R5cGUsIHR5cGVuYW1lIF9Gcm9tVHlwZT4KKyAgICBpbmxpbmUgX1RvVHlwZQorICAgIF9fY29uc3RfcG9pbnRlcl9jYXN0KF9Gcm9tVHlwZSogX19hcmcpCisgICAgeyByZXR1cm4gX1RvVHlwZShjb25zdF9jYXN0PHR5cGVuYW1lIF9DYXN0ZXI8X1RvVHlwZT46OgorCQkgICAgIHR5cGU+KF9fYXJnKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG9UeXBlLCB0eXBlbmFtZSBfRnJvbVR5cGU+CisgICAgaW5saW5lIF9Ub1R5cGUKKyAgICBfX3JlaW50ZXJwcmV0X3BvaW50ZXJfY2FzdChfRnJvbVR5cGUqIF9fYXJnKQorICAgIHsgcmV0dXJuIF9Ub1R5cGUocmVpbnRlcnByZXRfY2FzdDx0eXBlbmFtZSBfQ2FzdGVyPF9Ub1R5cGU+OjoKKwkJICAgICB0eXBlPihfX2FyZykpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIF9HTElCQ1hYX0NBU1RfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvY21hdGggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9jbWF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTdhNTNmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvY21hdGgKQEAgLTAsMCArMSwxNTIgQEAKKy8vIE1hdGggZXh0ZW5zaW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9jbWF0aAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0VYVF9DTUFUSAorI2RlZmluZSBfRVhUX0NNQVRIIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gQSBjbGFzcyBmb3IgbWF0aCBjb25zdGFudHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBzdHJ1Y3QgX19tYXRoX2NvbnN0YW50cworICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19mbG9hdGluZ19wb2ludDxfUmVhbFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYSBmbG9hdGluZyBwb2ludCB0eXBlIik7CisKKyAgICAgIC8vIENvbnN0YW50IEBmJCBccGkgQGYkLgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19waSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NTAyOUw7CisgICAgICAvLyBDb25zdGFudCBAZiQgXHBpIC8gMiBAZiQuCisgICAgICBzdGF0aWMgY29uc3RleHByIF9SZWFsVHlwZSBfX3BpX2hhbGYgPSAxLjU3MDc5NjMyNjc5NDg5NjYxOTIzMTMyMTY5MTYzOTc1MTRMOworICAgICAgLy8gQ29uc3RhbnQgQGYkIFxwaSAvIDMgQGYkLgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19waV90aGlyZCA9IDEuMDQ3MTk3NTUxMTk2NTk3NzQ2MTU0MjE0NDYxMDkzMTY3Nkw7CisgICAgICAvLyBDb25zdGFudCBAZiQgXHBpIC8gNCBAZiQuCisgICAgICBzdGF0aWMgY29uc3RleHByIF9SZWFsVHlwZSBfX3BpX3F1YXJ0ZXIgPSAwLjc4NTM5ODE2MzM5NzQ0ODMwOTYxNTY2MDg0NTgxOTg3NTdMOworICAgICAgLy8gQ29uc3RhbnQgQGYkIFxzcXJ0KFxwaSAvIDIpIEBmJC4KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX1JlYWxUeXBlIF9fcm9vdF9waV9kaXZfMiA9IDEuMjUzMzE0MTM3MzE1NTAwMjUxMjA3ODgyNjQyNDA1NTIyNkw7CisgICAgICAvLyBDb25zdGFudCBAZiQgMSAvIFxwaSBAZiQuCisgICAgICBzdGF0aWMgY29uc3RleHByIF9SZWFsVHlwZSBfX29uZV9kaXZfcGkgPSAwLjMxODMwOTg4NjE4Mzc5MDY3MTUzNzc2NzUyNjc0NTAyODdMOworICAgICAgLy8gQ29uc3RhbnQgQGYkIDIgLyBccGkgQGYkLgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBfUmVhbFR5cGUgX190d29fZGl2X3BpID0gMC42MzY2MTk3NzIzNjc1ODEzNDMwNzU1MzUwNTM0OTAwNTc0TDsKKyAgICAgIC8vIENvbnN0YW50IEBmJCAyIC8gXHNxcnQoXHBpKSBAZiQuCisgICAgICBzdGF0aWMgY29uc3RleHByIF9SZWFsVHlwZSBfX3R3b19kaXZfcm9vdF9waSA9IDEuMTI4Mzc5MTY3MDk1NTEyNTczODk2MTU4OTAzMTIxNTQ1Mkw7CisKKyAgICAgIC8vIENvbnN0YW50IEV1bGVyJ3MgbnVtYmVyIEBmJCBlIEBmJC4KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX1JlYWxUeXBlIF9fZSA9IDIuNzE4MjgxODI4NDU5MDQ1MjM1MzYwMjg3NDcxMzUyNjYyNUw7CisgICAgICAvLyBDb25zdGFudCBAZiQgMSAvIGUgQGYkLgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19vbmVfZGl2X2UgPSAwLjM2Nzg3OTQ0MTE3MTQ0MjMyMTU5NTUyMzc3MDE2MTQ2MDg3TDsKKyAgICAgIC8vIENvbnN0YW50IEBmJCBcbG9nXzIoZSkgQGYkLgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19sb2cyX2UgPSAxLjQ0MjY5NTA0MDg4ODk2MzQwNzM1OTkyNDY4MTAwMTg5MjFMOworICAgICAgLy8gQ29uc3RhbnQgQGYkIFxsb2dfMTAoZSkgQGYkLgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19sb2cxMF9lID0gMC40MzQyOTQ0ODE5MDMyNTE4Mjc2NTExMjg5MTg5MTY2MDUxTDsKKyAgICAgIC8vIENvbnN0YW50IEBmJCBcbG4oMikgQGYkLgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19sbl8yID0gMC42OTMxNDcxODA1NTk5NDUzMDk0MTcyMzIxMjE0NTgxNzY2TDsKKyAgICAgIC8vIENvbnN0YW50IEBmJCBcbG4oMykgQGYkLgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19sbl8zID0gMS4wOTg2MTIyODg2NjgxMDk2OTEzOTUyNDUyMzY5MjI1MjU3TDsKKyAgICAgIC8vIENvbnN0YW50IEBmJCBcbG4oMTApIEBmJC4KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX1JlYWxUeXBlIF9fbG5fMTAgPSAyLjMwMjU4NTA5Mjk5NDA0NTY4NDAxNzk5MTQ1NDY4NDM2NDJMOworCisgICAgICAvLyBDb25zdGFudCBFdWxlci1NYXNjaGVyb25pIEBmJCBcZ2FtbWFfRSBAZiQuCisgICAgICBzdGF0aWMgY29uc3RleHByIF9SZWFsVHlwZSBfX2dhbW1hX2UgPSAwLjU3NzIxNTY2NDkwMTUzMjg2MDYwNjUxMjA5MDA4MjQwMjRMOworICAgICAgLy8gQ29uc3RhbnQgR29sZGVuIFJhdGlvIEBmJCBccGhpIEBmJC4KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX1JlYWxUeXBlIF9fcGhpID0gMS42MTgwMzM5ODg3NDk4OTQ4NDgyMDQ1ODY4MzQzNjU2MzgxTDsKKworICAgICAgLy8gQ29uc3RhbnQgQGYkIFxzcXJ0KDIpIEBmJC4KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX1JlYWxUeXBlIF9fcm9vdF8yID0gMS40MTQyMTM1NjIzNzMwOTUwNDg4MDE2ODg3MjQyMDk2OTgxTDsKKyAgICAgIC8vIENvbnN0YW50IEBmJCBcc3FydCgzKSBAZiQuCisgICAgICBzdGF0aWMgY29uc3RleHByIF9SZWFsVHlwZSBfX3Jvb3RfMyA9IDEuNzMyMDUwODA3NTY4ODc3MjkzNTI3NDQ2MzQxNTA1ODcyNEw7CisgICAgICAvLyBDb25zdGFudCBAZiQgXHNxcnQoNSkgQGYkLgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19yb290XzUgPSAyLjIzNjA2Nzk3NzQ5OTc4OTY5NjQwOTE3MzY2ODczMTI3NjJMOworICAgICAgLy8gQ29uc3RhbnQgQGYkIFxzcXJ0KDcpIEBmJC4KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX1JlYWxUeXBlIF9fcm9vdF83ID0gMi42NDU3NTEzMTEwNjQ1OTA1OTA1MDE2MTU3NTM2MzkyNjA0TDsKKyAgICAgIC8vIENvbnN0YW50IEBmJCAxIC8gXHNxcnQoMikgQGYkLgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19vbmVfZGl2X3Jvb3RfMiA9IDAuNzA3MTA2NzgxMTg2NTQ3NTI0NDAwODQ0MzYyMTA0ODQ5MEw7CisgICAgfTsKKworICAvLyBBbmQgdGhlIHRlbXBsYXRlIGRlZmluaXRpb25zIGZvciB0aGUgY29uc3RhbnRzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgY29uc3RleHByIF9SZWFsVHlwZSBfX21hdGhfY29uc3RhbnRzPF9SZWFsVHlwZT46Ol9fcGk7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBjb25zdGV4cHIgX1JlYWxUeXBlIF9fbWF0aF9jb25zdGFudHM8X1JlYWxUeXBlPjo6X19waV9oYWxmOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgY29uc3RleHByIF9SZWFsVHlwZSBfX21hdGhfY29uc3RhbnRzPF9SZWFsVHlwZT46Ol9fcGlfdGhpcmQ7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBjb25zdGV4cHIgX1JlYWxUeXBlIF9fbWF0aF9jb25zdGFudHM8X1JlYWxUeXBlPjo6X19waV9xdWFydGVyOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgY29uc3RleHByIF9SZWFsVHlwZSBfX21hdGhfY29uc3RhbnRzPF9SZWFsVHlwZT46Ol9fcm9vdF9waV9kaXZfMjsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19tYXRoX2NvbnN0YW50czxfUmVhbFR5cGU+OjpfX29uZV9kaXZfcGk7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBjb25zdGV4cHIgX1JlYWxUeXBlIF9fbWF0aF9jb25zdGFudHM8X1JlYWxUeXBlPjo6X190d29fZGl2X3BpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgY29uc3RleHByIF9SZWFsVHlwZSBfX21hdGhfY29uc3RhbnRzPF9SZWFsVHlwZT46Ol9fdHdvX2Rpdl9yb290X3BpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgY29uc3RleHByIF9SZWFsVHlwZSBfX21hdGhfY29uc3RhbnRzPF9SZWFsVHlwZT46Ol9fZTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19tYXRoX2NvbnN0YW50czxfUmVhbFR5cGU+OjpfX29uZV9kaXZfZTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19tYXRoX2NvbnN0YW50czxfUmVhbFR5cGU+OjpfX2xvZzJfZTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19tYXRoX2NvbnN0YW50czxfUmVhbFR5cGU+OjpfX2xvZzEwX2U7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBjb25zdGV4cHIgX1JlYWxUeXBlIF9fbWF0aF9jb25zdGFudHM8X1JlYWxUeXBlPjo6X19sbl8yOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgY29uc3RleHByIF9SZWFsVHlwZSBfX21hdGhfY29uc3RhbnRzPF9SZWFsVHlwZT46Ol9fbG5fMzsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19tYXRoX2NvbnN0YW50czxfUmVhbFR5cGU+OjpfX2xuXzEwOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgY29uc3RleHByIF9SZWFsVHlwZSBfX21hdGhfY29uc3RhbnRzPF9SZWFsVHlwZT46Ol9fZ2FtbWFfZTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19tYXRoX2NvbnN0YW50czxfUmVhbFR5cGU+OjpfX3BoaTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19tYXRoX2NvbnN0YW50czxfUmVhbFR5cGU+OjpfX3Jvb3RfMjsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19tYXRoX2NvbnN0YW50czxfUmVhbFR5cGU+OjpfX3Jvb3RfMzsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19tYXRoX2NvbnN0YW50czxfUmVhbFR5cGU+OjpfX3Jvb3RfNTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19tYXRoX2NvbnN0YW50czxfUmVhbFR5cGU+OjpfX3Jvb3RfNzsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGNvbnN0ZXhwciBfUmVhbFR5cGUgX19tYXRoX2NvbnN0YW50czxfUmVhbFR5cGU+OjpfX29uZV9kaXZfcm9vdF8yOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIF9fZ251X2N4eAorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vIF9FWFRfQ01BVEgKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2NvZGVjdnRfc3BlY2lhbGl6YXRpb25zLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9jb2RlY3Z0X3NwZWNpYWxpemF0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMmRmYzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9jb2RlY3Z0X3NwZWNpYWxpemF0aW9ucy5oCkBAIC0wLDAgKzEsNTEyIEBACisvLyBMb2NhbGUgc3VwcG9ydCAoY29kZWN2dCkgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIyLjIuMS41IFRlbXBsYXRlIGNsYXNzIGNvZGVjdnQKKy8vCisKKy8vIFdyaXR0ZW4gYnkgQmVuamFtaW4gS29zbmlrIDxia296QHJlZGhhdC5jb20+CisKKy8qKiBAZmlsZSBleHQvY29kZWN2dF9zcGVjaWFsaXphdGlvbnMuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0VYVF9DT0RFQ1ZUX1NQRUNJQUxJWkFUSU9OU19ICisjZGVmaW5lIF9FWFRfQ09ERUNWVF9TUEVDSUFMSVpBVElPTlNfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGxvY2FsZT4KKyNpbmNsdWRlIDxpY29udi5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8vIEV4dGVuc2lvbiB0byB1c2UgaWNvbnYgZm9yIGRlYWxpbmcgd2l0aCBjaGFyYWN0ZXIgZW5jb2RpbmdzLgorICAvLyBUaGlzIGluY2x1ZGVzIGNvbnZlcnNpb25zIGFuZCBjb21wYXJpc29ucyBiZXR3ZWVuIHZhcmlvdXMgY2hhcmFjdGVyCisgIC8vIHNldHMuICBUaGlzIG9iamVjdCBlbmNhcHN1bGF0ZXMgZGF0YSB0aGF0IG1heSBuZWVkIHRvIGJlIHNoYXJlZCBiZXR3ZWVuCisgIC8vIGNoYXJfdHJhaXRzLCBjb2RlY3Z0IGFuZCBjdHlwZS4KKyAgY2xhc3MgZW5jb2Rpbmdfc3RhdGUKKyAgeworICBwdWJsaWM6CisgICAgLy8gVHlwZXM6IAorICAgIC8vIE5COiBBIGNvbnZlcnNpb24gZGVzY3JpcHRvciBzdWJzdW1lcyBhbmQgZW5oYW5jZXMgdGhlCisgICAgLy8gZnVuY3Rpb25hbGl0eSBvZiBhIHNpbXBsZSBzdGF0ZSB0eXBlIHN1Y2ggYXMgbWJzdGF0ZV90LgorICAgIHR5cGVkZWYgaWNvbnZfdAlkZXNjcmlwdG9yX3R5cGU7CisgICAgCisgIHByb3RlY3RlZDoKKyAgICAvLyBOYW1lIG9mIGludGVybmFsIGNoYXJhY3RlciBzZXQgZW5jb2RpbmcuCisgICAgc3RkOjpzdHJpbmcJICAgICAgIAlfTV9pbnRfZW5jOworCisgICAgLy8gTmFtZSBvZiBleHRlcm5hbCBjaGFyYWN0ZXIgc2V0IGVuY29kaW5nLgorICAgIHN0ZDo6c3RyaW5nICAJX01fZXh0X2VuYzsKKworICAgIC8vIENvbnZlcnNpb24gZGVzY3JpcHRvciBiZXR3ZWVuIGV4dGVybmFsIGVuY29kaW5nIHRvIGludGVybmFsIGVuY29kaW5nLgorICAgIGRlc2NyaXB0b3JfdHlwZQlfTV9pbl9kZXNjOworCisgICAgLy8gQ29udmVyc2lvbiBkZXNjcmlwdG9yIGJldHdlZW4gaW50ZXJuYWwgZW5jb2RpbmcgdG8gZXh0ZXJuYWwgZW5jb2RpbmcuCisgICAgZGVzY3JpcHRvcl90eXBlCV9NX291dF9kZXNjOworCisgICAgLy8gVGhlIGJ5dGUtb3JkZXIgbWFya2VyIGZvciB0aGUgZXh0ZXJuYWwgZW5jb2RpbmcsIGlmIG5lY2Vzc2FyeS4KKyAgICBpbnQJCQlfTV9leHRfYm9tOworCisgICAgLy8gVGhlIGJ5dGUtb3JkZXIgbWFya2VyIGZvciB0aGUgaW50ZXJuYWwgZW5jb2RpbmcsIGlmIG5lY2Vzc2FyeS4KKyAgICBpbnQJCQlfTV9pbnRfYm9tOworCisgICAgLy8gTnVtYmVyIG9mIGV4dGVybmFsIGJ5dGVzIG5lZWRlZCB0byBjb25zdHJ1Y3Qgb25lIGNvbXBsZXRlCisgICAgLy8gY2hhcmFjdGVyIGluIHRoZSBpbnRlcm5hbCBlbmNvZGluZy4KKyAgICAvLyBOQjogLTEgaW5kaWNhdGVzIHZhcmlhYmxlLCBvciBzdGF0ZWZ1bCwgZW5jb2RpbmdzLgorICAgIGludCAJCV9NX2J5dGVzOworCisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCAKKyAgICBlbmNvZGluZ19zdGF0ZSgpIAorICAgIDogX01faW5fZGVzYygwKSwgX01fb3V0X2Rlc2MoMCksIF9NX2V4dF9ib20oMCksIF9NX2ludF9ib20oMCksIF9NX2J5dGVzKDApCisgICAgeyB9CisKKyAgICBleHBsaWNpdCAKKyAgICBlbmNvZGluZ19zdGF0ZShjb25zdCBjaGFyKiBfX2ludCwgY29uc3QgY2hhciogX19leHQsIAorCQkgICBpbnQgX19pYm9tID0gMCwgaW50IF9fZWJvbSA9IDAsIGludCBfX2J5dGVzID0gMSkKKyAgICA6IF9NX2ludF9lbmMoX19pbnQpLCBfTV9leHRfZW5jKF9fZXh0KSwgX01faW5fZGVzYygwKSwgX01fb3V0X2Rlc2MoMCksIAorICAgICAgX01fZXh0X2JvbShfX2Vib20pLCBfTV9pbnRfYm9tKF9faWJvbSksIF9NX2J5dGVzKF9fYnl0ZXMpCisgICAgeyBpbml0KCk7IH0KKworICAgIC8vIDIxLjEuMiB0cmFpdHMgdHlwZWRlZnMKKyAgICAvLyBwNAorICAgIC8vIHR5cGVkZWYgU1RBVEVfVCBzdGF0ZV90eXBlCisgICAgLy8gcmVxdWlyZXM6IHN0YXRlX3R5cGUgc2hhbGwgbWVldCB0aGUgcmVxdWlyZW1lbnRzIG9mCisgICAgLy8gQ29weUNvbnN0cnVjdGlibGUgdHlwZXMgKDIwLjEuMykKKyAgICAvLyBOQjogVGhpcyBkb2VzIG5vdCBwcmVzZXJ2ZSB0aGUgYWN0dWFsIHN0YXRlIG9mIHRoZSBjb252ZXJzaW9uCisgICAgLy8gZGVzY3JpcHRvciBtZW1iZXIsIGJ1dCBpdCBkb2VzIGR1cGxpY2F0ZSB0aGUgZW5jb2RpbmcKKyAgICAvLyBpbmZvcm1hdGlvbi4KKyAgICBlbmNvZGluZ19zdGF0ZShjb25zdCBlbmNvZGluZ19zdGF0ZSYgX19vYmopIDogX01faW5fZGVzYygwKSwgX01fb3V0X2Rlc2MoMCkKKyAgICB7IGNvbnN0cnVjdChfX29iaik7IH0KKworICAgIC8vIE5lZWQgYXNzaWdubWVudCBvcGVyYXRvciBhcyB3ZWxsLgorICAgIGVuY29kaW5nX3N0YXRlJgorICAgIG9wZXJhdG9yPShjb25zdCBlbmNvZGluZ19zdGF0ZSYgX19vYmopCisgICAgeworICAgICAgY29uc3RydWN0KF9fb2JqKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB+ZW5jb2Rpbmdfc3RhdGUoKQorICAgIHsgZGVzdHJveSgpOyB9IAorCisgICAgYm9vbAorICAgIGdvb2QoKSBjb25zdCB0aHJvdygpCisgICAgeyAKKyAgICAgIGNvbnN0IGRlc2NyaXB0b3JfdHlwZSBfX2VyciA9IChpY29udl90KSgtMSk7CisgICAgICBib29sIF9fdGVzdCA9IF9NX2luX2Rlc2MgJiYgX01faW5fZGVzYyAhPSBfX2VycjsgCisgICAgICBfX3Rlc3QgJj0gIF9NX291dF9kZXNjICYmIF9NX291dF9kZXNjICE9IF9fZXJyOworICAgICAgcmV0dXJuIF9fdGVzdDsKKyAgICB9CisgICAgCisgICAgaW50CisgICAgY2hhcmFjdGVyX3JhdGlvKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9ieXRlczsgfQorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcKKyAgICBpbnRlcm5hbF9lbmNvZGluZygpIGNvbnN0CisgICAgeyByZXR1cm4gX01faW50X2VuYzsgfQorCisgICAgaW50IAorICAgIGludGVybmFsX2JvbSgpIGNvbnN0CisgICAgeyByZXR1cm4gX01faW50X2JvbTsgfQorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcKKyAgICBleHRlcm5hbF9lbmNvZGluZygpIGNvbnN0CisgICAgeyByZXR1cm4gX01fZXh0X2VuYzsgfQorCisgICAgaW50IAorICAgIGV4dGVybmFsX2JvbSgpIGNvbnN0CisgICAgeyByZXR1cm4gX01fZXh0X2JvbTsgfQorCisgICAgY29uc3QgZGVzY3JpcHRvcl90eXBlJgorICAgIGluX2Rlc2NyaXB0b3IoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX2luX2Rlc2M7IH0KKworICAgIGNvbnN0IGRlc2NyaXB0b3JfdHlwZSYKKyAgICBvdXRfZGVzY3JpcHRvcigpIGNvbnN0CisgICAgeyByZXR1cm4gX01fb3V0X2Rlc2M7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgdm9pZAorICAgIGluaXQoKQorICAgIHsKKyAgICAgIGNvbnN0IGRlc2NyaXB0b3JfdHlwZSBfX2VyciA9IChpY29udl90KSgtMSk7CisgICAgICBjb25zdCBib29sIF9faGF2ZV9lbmNvZGluZ3MgPSBfTV9pbnRfZW5jLnNpemUoKSAmJiBfTV9leHRfZW5jLnNpemUoKTsKKyAgICAgIGlmICghX01faW5fZGVzYyAmJiBfX2hhdmVfZW5jb2RpbmdzKQorCXsKKwkgIF9NX2luX2Rlc2MgPSBpY29udl9vcGVuKF9NX2ludF9lbmMuY19zdHIoKSwgX01fZXh0X2VuYy5jX3N0cigpKTsKKwkgIGlmIChfTV9pbl9kZXNjID09IF9fZXJyKQorCSAgICBzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oImVuY29kaW5nX3N0YXRlOjpfTV9pbml0ICIKKwkJCQkgICAgImNyZWF0aW5nIGljb252IGlucHV0IGRlc2NyaXB0b3IgZmFpbGVkIikpOworCX0KKyAgICAgIGlmICghX01fb3V0X2Rlc2MgJiYgX19oYXZlX2VuY29kaW5ncykKKwl7CisJICBfTV9vdXRfZGVzYyA9IGljb252X29wZW4oX01fZXh0X2VuYy5jX3N0cigpLCBfTV9pbnRfZW5jLmNfc3RyKCkpOworCSAgaWYgKF9NX291dF9kZXNjID09IF9fZXJyKQorCSAgICBzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oImVuY29kaW5nX3N0YXRlOjpfTV9pbml0ICIKKwkJCQkgICJjcmVhdGluZyBpY29udiBvdXRwdXQgZGVzY3JpcHRvciBmYWlsZWQiKSk7CisJfQorICAgIH0KKworICAgIHZvaWQKKyAgICBjb25zdHJ1Y3QoY29uc3QgZW5jb2Rpbmdfc3RhdGUmIF9fb2JqKQorICAgIHsKKyAgICAgIGRlc3Ryb3koKTsKKyAgICAgIF9NX2ludF9lbmMgPSBfX29iai5fTV9pbnRfZW5jOworICAgICAgX01fZXh0X2VuYyA9IF9fb2JqLl9NX2V4dF9lbmM7CisgICAgICBfTV9leHRfYm9tID0gX19vYmouX01fZXh0X2JvbTsKKyAgICAgIF9NX2ludF9ib20gPSBfX29iai5fTV9pbnRfYm9tOworICAgICAgX01fYnl0ZXMgPSBfX29iai5fTV9ieXRlczsKKyAgICAgIGluaXQoKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgZGVzdHJveSgpIHRocm93KCkKKyAgICB7CisgICAgICBjb25zdCBkZXNjcmlwdG9yX3R5cGUgX19lcnIgPSAoaWNvbnZfdCkoLTEpOworICAgICAgaWYgKF9NX2luX2Rlc2MgJiYgX01faW5fZGVzYyAhPSBfX2VycikgCisJeworCSAgaWNvbnZfY2xvc2UoX01faW5fZGVzYyk7CisJICBfTV9pbl9kZXNjID0gMDsKKwl9CisgICAgICBpZiAoX01fb3V0X2Rlc2MgJiYgX01fb3V0X2Rlc2MgIT0gX19lcnIpIAorCXsKKwkgIGljb252X2Nsb3NlKF9NX291dF9kZXNjKTsKKwkgIF9NX291dF9kZXNjID0gMDsKKwl9CisgICAgfQorICB9OworCisgIC8vLyBlbmNvZGluZ19jaGFyX3RyYWl0cworICAvLyBDdXN0b20gdHJhaXRzIHR5cGUgd2l0aCBlbmNvZGluZ19zdGF0ZSBmb3IgdGhlIHN0YXRlIHR5cGUsIGFuZCB0aGUKKyAgLy8gYXNzb2NpYXRlZCBmcG9zPGVuY29kaW5nX3N0YXRlPiBmb3IgdGhlIHBvc2l0aW9uIHR5cGUsIGFsbCBvdGhlcgorICAvLyBiaXRzIGVxdWl2YWxlbnQgdG8gdGhlIHJlcXVpcmVkIGNoYXJfdHJhaXRzIGluc3RhbnRpYXRpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgc3RydWN0IGVuY29kaW5nX2NoYXJfdHJhaXRzIDogcHVibGljIHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPgorICAgIHsKKyAgICAgIHR5cGVkZWYgZW5jb2Rpbmdfc3RhdGUJCQkJc3RhdGVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpmcG9zPHN0YXRlX3R5cGU+CQlwb3NfdHlwZTsKKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHVzaW5nIF9fZ251X2N4eDo6ZW5jb2Rpbmdfc3RhdGU7CisKKyAgLy8vIGNvZGVjdnQ8SW50ZXJuVCwgX0V4dGVyblQsIGVuY29kaW5nX3N0YXRlPiBzcGVjaWFsaXphdGlvbi4KKyAgLy8gVGhpcyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIHRha2VzIGFkdmFudGFnZSBvZiBpY29udiB0byBwcm92aWRlCisgIC8vIGNvZGUgY29udmVyc2lvbnMgYmV0d2VlbiBhIGxhcmdlIG51bWJlciBvZiBjaGFyYWN0ZXIgZW5jb2RpbmdzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZXJuVCwgdHlwZW5hbWUgX0V4dGVyblQ+CisgICAgY2xhc3MgY29kZWN2dDxfSW50ZXJuVCwgX0V4dGVyblQsIGVuY29kaW5nX3N0YXRlPgorICAgIDogcHVibGljIF9fY29kZWN2dF9hYnN0cmFjdF9iYXNlPF9JbnRlcm5ULCBfRXh0ZXJuVCwgZW5jb2Rpbmdfc3RhdGU+CisgICAgeworICAgIHB1YmxpYzogICAgICAKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiBjb2RlY3Z0X2Jhc2U6OnJlc3VsdAkJCXJlc3VsdDsKKyAgICAgIHR5cGVkZWYgX0ludGVyblQgCQkJCQlpbnRlcm5fdHlwZTsKKyAgICAgIHR5cGVkZWYgX0V4dGVyblQgCQkJCQlleHRlcm5fdHlwZTsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjplbmNvZGluZ19zdGF0ZSAJCXN0YXRlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0YXRlX3R5cGU6OmRlc2NyaXB0b3JfdHlwZSAJCWRlc2NyaXB0b3JfdHlwZTsKKworICAgICAgLy8gRGF0YSBNZW1iZXJzOgorICAgICAgc3RhdGljIGxvY2FsZTo6aWQgCQlpZDsKKworICAgICAgZXhwbGljaXQgCisgICAgICBjb2RlY3Z0KHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiBfX2NvZGVjdnRfYWJzdHJhY3RfYmFzZTxpbnRlcm5fdHlwZSwgZXh0ZXJuX3R5cGUsIHN0YXRlX3R5cGU+KF9fcmVmcykKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdCAKKyAgICAgIGNvZGVjdnQoc3RhdGVfdHlwZSYgX19lbmMsIHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiBfX2NvZGVjdnRfYWJzdHJhY3RfYmFzZTxpbnRlcm5fdHlwZSwgZXh0ZXJuX3R5cGUsIHN0YXRlX3R5cGU+KF9fcmVmcykKKyAgICAgIHsgfQorCisgICAgIHByb3RlY3RlZDoKKyAgICAgIHZpcnR1YWwgCisgICAgICB+Y29kZWN2dCgpIHsgfQorCisgICAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgZG9fb3V0KHN0YXRlX3R5cGUmIF9fc3RhdGUsIGNvbnN0IGludGVybl90eXBlKiBfX2Zyb20sIAorCSAgICAgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJvbV9lbmQsIGNvbnN0IGludGVybl90eXBlKiYgX19mcm9tX25leHQsCisJICAgICBleHRlcm5fdHlwZSogX190bywgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLAorCSAgICAgZXh0ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgZG9fdW5zaGlmdChzdGF0ZV90eXBlJiBfX3N0YXRlLCBleHRlcm5fdHlwZSogX190bywgCisJCSBleHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdDsKKworICAgICAgdmlydHVhbCByZXN1bHQKKyAgICAgIGRvX2luKHN0YXRlX3R5cGUmIF9fc3RhdGUsIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb20sIAorCSAgICBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tX2VuZCwgY29uc3QgZXh0ZXJuX3R5cGUqJiBfX2Zyb21fbmV4dCwKKwkgICAgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3RvX2VuZCwgCisJICAgIGludGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdDsKKworICAgICAgdmlydHVhbCBpbnQgCisgICAgICBkb19lbmNvZGluZygpIGNvbnN0IHRocm93KCk7CisKKyAgICAgIHZpcnR1YWwgYm9vbCAKKyAgICAgIGRvX2Fsd2F5c19ub2NvbnYoKSBjb25zdCB0aHJvdygpOworCisgICAgICB2aXJ0dWFsIGludCAKKyAgICAgIGRvX2xlbmd0aChzdGF0ZV90eXBlJiwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbSwgCisJCWNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwgc2l6ZV90IF9fbWF4KSBjb25zdDsKKworICAgICAgdmlydHVhbCBpbnQgCisgICAgICBkb19tYXhfbGVuZ3RoKCkgY29uc3QgdGhyb3coKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlcm5ULCB0eXBlbmFtZSBfRXh0ZXJuVD4KKyAgICBsb2NhbGU6OmlkIAorICAgIGNvZGVjdnQ8X0ludGVyblQsIF9FeHRlcm5ULCBlbmNvZGluZ19zdGF0ZT46OmlkOworCisgIC8vIFRoaXMgYWRhcHRvciB3b3JrcyBhcm91bmQgdGhlIHNpZ25hdHVyZSBwcm9ibGVtcyBvZiB0aGUgc2Vjb25kCisgIC8vIGFyZ3VtZW50IHRvIGljb252KCk6ICBTVVN2MiBhbmQgb3RoZXJzIHVzZSAnY29uc3QgY2hhcioqJywgYnV0IGdsaWJjIDIuMgorICAvLyB1c2VzICdjaGFyKionLCB3aGljaCBtYXRjaGVzIHRoZSBQT1NJWCAxMDAzLjEtMjAwMSBzdGFuZGFyZC4KKyAgLy8gVXNpbmcgdGhpcyBhZGFwdG9yLCBnKysgd2lsbCBkbyB0aGUgd29yayBmb3IgdXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc2l6ZV90CisgICAgX19pY29udl9hZGFwdG9yKHNpemVfdCgqX19mdW5jKShpY29udl90LCBfVHAsIHNpemVfdCosIGNoYXIqKiwgc2l6ZV90KiksCisgICAgICAgICAgICAgICAgICAgIGljb252X3QgX19jZCwgY2hhcioqIF9faW5idWYsIHNpemVfdCogX19pbmJ5dGVzLAorICAgICAgICAgICAgICAgICAgICBjaGFyKiogX19vdXRidWYsIHNpemVfdCogX19vdXRieXRlcykKKyAgICB7IHJldHVybiBfX2Z1bmMoX19jZCwgKF9UcClfX2luYnVmLCBfX2luYnl0ZXMsIF9fb3V0YnVmLCBfX291dGJ5dGVzKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlcm5ULCB0eXBlbmFtZSBfRXh0ZXJuVD4KKyAgICBjb2RlY3Z0X2Jhc2U6OnJlc3VsdAorICAgIGNvZGVjdnQ8X0ludGVyblQsIF9FeHRlcm5ULCBlbmNvZGluZ19zdGF0ZT46OgorICAgIGRvX291dChzdGF0ZV90eXBlJiBfX3N0YXRlLCBjb25zdCBpbnRlcm5fdHlwZSogX19mcm9tLCAKKwkgICBjb25zdCBpbnRlcm5fdHlwZSogX19mcm9tX2VuZCwgY29uc3QgaW50ZXJuX3R5cGUqJiBfX2Zyb21fbmV4dCwKKwkgICBleHRlcm5fdHlwZSogX190bywgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLAorCSAgIGV4dGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdAorICAgIHsKKyAgICAgIHJlc3VsdCBfX3JldCA9IGNvZGVjdnRfYmFzZTo6ZXJyb3I7CisgICAgICBpZiAoX19zdGF0ZS5nb29kKCkpCisJeworCSAgY29uc3QgZGVzY3JpcHRvcl90eXBlJiBfX2Rlc2MgPSBfX3N0YXRlLm91dF9kZXNjcmlwdG9yKCk7CisJICBjb25zdCBzaXplX3QgX19mbXVsdGlwbGUgPSBzaXplb2YoaW50ZXJuX3R5cGUpOworCSAgc2l6ZV90IF9fZmJ5dGVzID0gX19mbXVsdGlwbGUgKiAoX19mcm9tX2VuZCAtIF9fZnJvbSk7CisJICBjb25zdCBzaXplX3QgX190bXVsdGlwbGUgPSBzaXplb2YoZXh0ZXJuX3R5cGUpOworCSAgc2l6ZV90IF9fdGJ5dGVzID0gX190bXVsdGlwbGUgKiAoX190b19lbmQgLSBfX3RvKTsgCisJICAKKwkgIC8vIEFyZ3VtZW50IGxpc3QgZm9yIGljb252IHNwZWNpZmllcyBhIGJ5dGUgc2VxdWVuY2UuIFRodXMsCisJICAvLyBhbGwgdG8vZnJvbSBhcnJheXMgbXVzdCBiZSBicnV0YWxseSBjYXN0ZWQgdG8gY2hhciouCisJICBjaGFyKiBfX2N0byA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KF9fdG8pOworCSAgY2hhciogX19jZnJvbTsKKwkgIHNpemVfdCBfX2NvbnY7CisKKwkgIC8vIFNvbWUgZW5jb2RpbmdzIG5lZWQgYSBieXRlIG9yZGVyIG1hcmtlciBhcyB0aGUgZmlyc3QgaXRlbQorCSAgLy8gaW4gdGhlIGJ5dGUgc3RyZWFtLCB0byBkZXNpZ25hdGUgZW5kaWFuLW5lc3MuIFRoZSBkZWZhdWx0CisJICAvLyB2YWx1ZSBmb3IgdGhlIGJ5dGUgb3JkZXIgbWFya2VyIGlzIE5VTEwsIHNvIGlmIHRoaXMgaXMKKwkgIC8vIHRoZSBjYXNlLCBpdCdzIG5vdCBuZWNlc3NhcnkgYW5kIHdlIGNhbiBqdXN0IGdvIG9uIG91cgorCSAgLy8gbWVycnkgd2F5LgorCSAgaW50IF9faW50X2JvbSA9IF9fc3RhdGUuaW50ZXJuYWxfYm9tKCk7CisJICBpZiAoX19pbnRfYm9tKQorCSAgICB7CSAgCisJICAgICAgc2l6ZV90IF9fc2l6ZSA9IF9fZnJvbV9lbmQgLSBfX2Zyb207CisJICAgICAgaW50ZXJuX3R5cGUqIF9fY2ZpeGVkID0gc3RhdGljX2Nhc3Q8aW50ZXJuX3R5cGUqPgorCQkoX19idWlsdGluX2FsbG9jYShzaXplb2YoaW50ZXJuX3R5cGUpICogKF9fc2l6ZSArIDEpKSk7CisJICAgICAgX19jZml4ZWRbMF0gPSBzdGF0aWNfY2FzdDxpbnRlcm5fdHlwZT4oX19pbnRfYm9tKTsKKwkgICAgICBjaGFyX3RyYWl0czxpbnRlcm5fdHlwZT46OmNvcHkoX19jZml4ZWQgKyAxLCBfX2Zyb20sIF9fc2l6ZSk7CisJICAgICAgX19jZnJvbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KF9fY2ZpeGVkKTsKKwkgICAgICBfX2NvbnYgPSBfX2ljb252X2FkYXB0b3IoaWNvbnYsIF9fZGVzYywgJl9fY2Zyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9fZmJ5dGVzLCAmX19jdG8sICZfX3RieXRlcyk7IAorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpbnRlcm5fdHlwZSogX19jZml4ZWQgPSBjb25zdF9jYXN0PGludGVybl90eXBlKj4oX19mcm9tKTsKKwkgICAgICBfX2Nmcm9tID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oX19jZml4ZWQpOworCSAgICAgIF9fY29udiA9IF9faWNvbnZfYWRhcHRvcihpY29udiwgX19kZXNjLCAmX19jZnJvbSwgJl9fZmJ5dGVzLCAKKwkJCQkgICAgICAgJl9fY3RvLCAmX190Ynl0ZXMpOyAKKwkgICAgfQorCisJICBpZiAoX19jb252ICE9IHNpemVfdCgtMSkpCisJICAgIHsKKwkgICAgICBfX2Zyb21fbmV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50ZXJuX3R5cGUqPihfX2Nmcm9tKTsKKwkgICAgICBfX3RvX25leHQgPSByZWludGVycHJldF9jYXN0PGV4dGVybl90eXBlKj4oX19jdG8pOworCSAgICAgIF9fcmV0ID0gY29kZWN2dF9iYXNlOjpvazsKKwkgICAgfQorCSAgZWxzZSAKKwkgICAgeworCSAgICAgIGlmIChfX2ZieXRlcyA8IF9fZm11bHRpcGxlICogKF9fZnJvbV9lbmQgLSBfX2Zyb20pKQorCQl7CisJCSAgX19mcm9tX25leHQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGludGVybl90eXBlKj4oX19jZnJvbSk7CisJCSAgX190b19uZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxleHRlcm5fdHlwZSo+KF9fY3RvKTsKKwkJICBfX3JldCA9IGNvZGVjdnRfYmFzZTo6cGFydGlhbDsKKwkJfQorCSAgICAgIGVsc2UKKwkJX19yZXQgPSBjb2RlY3Z0X2Jhc2U6OmVycm9yOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fcmV0OyAKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVyblQsIHR5cGVuYW1lIF9FeHRlcm5UPgorICAgIGNvZGVjdnRfYmFzZTo6cmVzdWx0CisgICAgY29kZWN2dDxfSW50ZXJuVCwgX0V4dGVyblQsIGVuY29kaW5nX3N0YXRlPjo6CisgICAgZG9fdW5zaGlmdChzdGF0ZV90eXBlJiBfX3N0YXRlLCBleHRlcm5fdHlwZSogX190bywgCisJICAgICAgIGV4dGVybl90eXBlKiBfX3RvX2VuZCwgZXh0ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0CisgICAgeworICAgICAgcmVzdWx0IF9fcmV0ID0gY29kZWN2dF9iYXNlOjplcnJvcjsKKyAgICAgIGlmIChfX3N0YXRlLmdvb2QoKSkKKwl7CisJICBjb25zdCBkZXNjcmlwdG9yX3R5cGUmIF9fZGVzYyA9IF9fc3RhdGUuaW5fZGVzY3JpcHRvcigpOworCSAgY29uc3Qgc2l6ZV90IF9fdG11bHRpcGxlID0gc2l6ZW9mKGludGVybl90eXBlKTsKKwkgIHNpemVfdCBfX3RsZW4gPSBfX3RtdWx0aXBsZSAqIChfX3RvX2VuZCAtIF9fdG8pOyAKKwkgIAorCSAgLy8gQXJndW1lbnQgbGlzdCBmb3IgaWNvbnYgc3BlY2lmaWVzIGEgYnl0ZSBzZXF1ZW5jZS4gVGh1cywKKwkgIC8vIGFsbCB0by9mcm9tIGFycmF5cyBtdXN0IGJlIGJydXRhbGx5IGNhc3RlZCB0byBjaGFyKi4KKwkgIGNoYXIqIF9fY3RvID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oX190byk7CisJICBzaXplX3QgX19jb252ID0gX19pY29udl9hZGFwdG9yKGljb252LF9fZGVzYywgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfX2N0bywgJl9fdGxlbik7IAorCSAgCisJICBpZiAoX19jb252ICE9IHNpemVfdCgtMSkpCisJICAgIHsKKwkgICAgICBfX3RvX25leHQgPSByZWludGVycHJldF9jYXN0PGV4dGVybl90eXBlKj4oX19jdG8pOworCSAgICAgIGlmIChfX3RsZW4gPT0gX190bXVsdGlwbGUgKiAoX190b19lbmQgLSBfX3RvKSkKKwkJX19yZXQgPSBjb2RlY3Z0X2Jhc2U6Om5vY29udjsKKwkgICAgICBlbHNlIGlmIChfX3RsZW4gPT0gMCkKKwkJX19yZXQgPSBjb2RlY3Z0X2Jhc2U6Om9rOworCSAgICAgIGVsc2UKKwkJX19yZXQgPSBjb2RlY3Z0X2Jhc2U6OnBhcnRpYWw7CisJICAgIH0KKwkgIGVsc2UgCisJICAgIF9fcmV0ID0gY29kZWN2dF9iYXNlOjplcnJvcjsKKwl9CisgICAgICByZXR1cm4gX19yZXQ7IAorICAgIH0KKyAgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZXJuVCwgdHlwZW5hbWUgX0V4dGVyblQ+CisgICAgY29kZWN2dF9iYXNlOjpyZXN1bHQKKyAgICBjb2RlY3Z0PF9JbnRlcm5ULCBfRXh0ZXJuVCwgZW5jb2Rpbmdfc3RhdGU+OjoKKyAgICBkb19pbihzdGF0ZV90eXBlJiBfX3N0YXRlLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLCAKKwkgIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb21fZW5kLCBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAorCSAgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3RvX2VuZCwgCisJICBpbnRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3QKKyAgICB7IAorICAgICAgcmVzdWx0IF9fcmV0ID0gY29kZWN2dF9iYXNlOjplcnJvcjsKKyAgICAgIGlmIChfX3N0YXRlLmdvb2QoKSkKKwl7CisJICBjb25zdCBkZXNjcmlwdG9yX3R5cGUmIF9fZGVzYyA9IF9fc3RhdGUuaW5fZGVzY3JpcHRvcigpOworCSAgY29uc3Qgc2l6ZV90IF9fZm11bHRpcGxlID0gc2l6ZW9mKGV4dGVybl90eXBlKTsKKwkgIHNpemVfdCBfX2ZsZW4gPSBfX2ZtdWx0aXBsZSAqIChfX2Zyb21fZW5kIC0gX19mcm9tKTsKKwkgIGNvbnN0IHNpemVfdCBfX3RtdWx0aXBsZSA9IHNpemVvZihpbnRlcm5fdHlwZSk7CisJICBzaXplX3QgX190bGVuID0gX190bXVsdGlwbGUgKiAoX190b19lbmQgLSBfX3RvKTsgCisJICAKKwkgIC8vIEFyZ3VtZW50IGxpc3QgZm9yIGljb252IHNwZWNpZmllcyBhIGJ5dGUgc2VxdWVuY2UuIFRodXMsCisJICAvLyBhbGwgdG8vZnJvbSBhcnJheXMgbXVzdCBiZSBicnV0YWxseSBjYXN0ZWQgdG8gY2hhciouCisJICBjaGFyKiBfX2N0byA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KF9fdG8pOworCSAgY2hhciogX19jZnJvbTsKKwkgIHNpemVfdCBfX2NvbnY7CisKKwkgIC8vIFNvbWUgZW5jb2RpbmdzIG5lZWQgYSBieXRlIG9yZGVyIG1hcmtlciBhcyB0aGUgZmlyc3QgaXRlbQorCSAgLy8gaW4gdGhlIGJ5dGUgc3RyZWFtLCB0byBkZXNpZ25hdGUgZW5kaWFuLW5lc3MuIFRoZSBkZWZhdWx0CisJICAvLyB2YWx1ZSBmb3IgdGhlIGJ5dGUgb3JkZXIgbWFya2VyIGlzIE5VTEwsIHNvIGlmIHRoaXMgaXMKKwkgIC8vIHRoZSBjYXNlLCBpdCdzIG5vdCBuZWNlc3NhcnkgYW5kIHdlIGNhbiBqdXN0IGdvIG9uIG91cgorCSAgLy8gbWVycnkgd2F5LgorCSAgaW50IF9fZXh0X2JvbSA9IF9fc3RhdGUuZXh0ZXJuYWxfYm9tKCk7CisJICBpZiAoX19leHRfYm9tKQorCSAgICB7CSAgCisJICAgICAgc2l6ZV90IF9fc2l6ZSA9IF9fZnJvbV9lbmQgLSBfX2Zyb207CisJICAgICAgZXh0ZXJuX3R5cGUqIF9fY2ZpeGVkID0gIHN0YXRpY19jYXN0PGV4dGVybl90eXBlKj4KKwkJKF9fYnVpbHRpbl9hbGxvY2Eoc2l6ZW9mKGV4dGVybl90eXBlKSAqIChfX3NpemUgKyAxKSkpOworCSAgICAgIF9fY2ZpeGVkWzBdID0gc3RhdGljX2Nhc3Q8ZXh0ZXJuX3R5cGU+KF9fZXh0X2JvbSk7CisJICAgICAgY2hhcl90cmFpdHM8ZXh0ZXJuX3R5cGU+Ojpjb3B5KF9fY2ZpeGVkICsgMSwgX19mcm9tLCBfX3NpemUpOworCSAgICAgIF9fY2Zyb20gPSByZWludGVycHJldF9jYXN0PGNoYXIqPihfX2NmaXhlZCk7CisJICAgICAgX19jb252ID0gX19pY29udl9hZGFwdG9yKGljb252LCBfX2Rlc2MsICZfX2Nmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9fZmxlbiwgJl9fY3RvLCAmX190bGVuKTsgCisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGV4dGVybl90eXBlKiBfX2NmaXhlZCA9IGNvbnN0X2Nhc3Q8ZXh0ZXJuX3R5cGUqPihfX2Zyb20pOworCSAgICAgIF9fY2Zyb20gPSByZWludGVycHJldF9jYXN0PGNoYXIqPihfX2NmaXhlZCk7CisJICAgICAgX19jb252ID0gX19pY29udl9hZGFwdG9yKGljb252LCBfX2Rlc2MsICZfX2Nmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9fZmxlbiwgJl9fY3RvLCAmX190bGVuKTsgCisJICAgIH0KKworCSAgCisJICBpZiAoX19jb252ICE9IHNpemVfdCgtMSkpCisJICAgIHsKKwkgICAgICBfX2Zyb21fbmV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZXh0ZXJuX3R5cGUqPihfX2Nmcm9tKTsKKwkgICAgICBfX3RvX25leHQgPSByZWludGVycHJldF9jYXN0PGludGVybl90eXBlKj4oX19jdG8pOworCSAgICAgIF9fcmV0ID0gY29kZWN2dF9iYXNlOjpvazsKKwkgICAgfQorCSAgZWxzZSAKKwkgICAgeworCSAgICAgIGlmIChfX2ZsZW4gPCBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fZnJvbV9lbmQgLSBfX2Zyb20pKQorCQl7CisJCSAgX19mcm9tX25leHQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGV4dGVybl90eXBlKj4oX19jZnJvbSk7CisJCSAgX190b19uZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRlcm5fdHlwZSo+KF9fY3RvKTsKKwkJICBfX3JldCA9IGNvZGVjdnRfYmFzZTo6cGFydGlhbDsKKwkJfQorCSAgICAgIGVsc2UKKwkJX19yZXQgPSBjb2RlY3Z0X2Jhc2U6OmVycm9yOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fcmV0OyAKKyAgICB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZXJuVCwgdHlwZW5hbWUgX0V4dGVyblQ+CisgICAgaW50IAorICAgIGNvZGVjdnQ8X0ludGVyblQsIF9FeHRlcm5ULCBlbmNvZGluZ19zdGF0ZT46OgorICAgIGRvX2VuY29kaW5nKCkgY29uc3QgdGhyb3coKQorICAgIHsKKyAgICAgIGludCBfX3JldCA9IDA7CisgICAgICBpZiAoc2l6ZW9mKF9FeHRlcm5UKSA8PSBzaXplb2YoX0ludGVyblQpKQorCV9fcmV0ID0gc2l6ZW9mKF9JbnRlcm5UKSAvIHNpemVvZihfRXh0ZXJuVCk7CisgICAgICByZXR1cm4gX19yZXQ7IAorICAgIH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlcm5ULCB0eXBlbmFtZSBfRXh0ZXJuVD4KKyAgICBib29sIAorICAgIGNvZGVjdnQ8X0ludGVyblQsIF9FeHRlcm5ULCBlbmNvZGluZ19zdGF0ZT46OgorICAgIGRvX2Fsd2F5c19ub2NvbnYoKSBjb25zdCB0aHJvdygpCisgICAgeyByZXR1cm4gZmFsc2U7IH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlcm5ULCB0eXBlbmFtZSBfRXh0ZXJuVD4KKyAgICBpbnQgCisgICAgY29kZWN2dDxfSW50ZXJuVCwgX0V4dGVyblQsIGVuY29kaW5nX3N0YXRlPjo6CisgICAgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLCAKKwkgICAgICBjb25zdCBleHRlcm5fdHlwZSogX19lbmQsIHNpemVfdCBfX21heCkgY29uc3QKKyAgICB7IHJldHVybiBzdGQ6Om1pbihfX21heCwgc3RhdGljX2Nhc3Q8c2l6ZV90PihfX2VuZCAtIF9fZnJvbSkpOyB9CisKKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyA3NC4gIEdhcmJsZWQgdGV4dCBmb3IgY29kZWN2dDo6ZG9fbWF4X2xlbmd0aAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZXJuVCwgdHlwZW5hbWUgX0V4dGVyblQ+CisgICAgaW50IAorICAgIGNvZGVjdnQ8X0ludGVyblQsIF9FeHRlcm5ULCBlbmNvZGluZ19zdGF0ZT46OgorICAgIGRvX21heF9sZW5ndGgoKSBjb25zdCB0aHJvdygpCisgICAgeyByZXR1cm4gMTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvY29uY3VycmVuY2UuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2NvbmN1cnJlbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhiOTU4OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2NvbmN1cnJlbmNlLmgKQEAgLTAsMCArMSwzMTggQEAKKy8vIFN1cHBvcnQgZm9yIGNvbmN1cnJlbnQgcHJvZ3JhbWluZyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L2NvbmN1cnJlbmNlLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9DT05DVVJSRU5DRV9ICisjZGVmaW5lIF9DT05DVVJSRU5DRV9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorI2luY2x1ZGUgPGJpdHMvZ3Roci5oPiAKKyNpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+CisjaW5jbHVkZSA8Yml0cy9jcHBfdHlwZV90cmFpdHMuaD4KKyNpbmNsdWRlIDxleHQvdHlwZV90cmFpdHMuaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIEF2YWlsYWJsZSBsb2NraW5nIHBvbGljaWVzOgorICAvLyBfU19zaW5nbGUgICAgc2luZ2xlLXRocmVhZGVkIGNvZGUgdGhhdCBkb2Vzbid0IG5lZWQgdG8gYmUgbG9ja2VkLgorICAvLyBfU19tdXRleCAgICAgbXVsdGktdGhyZWFkZWQgY29kZSB0aGF0IHJlcXVpcmVzIGFkZGl0aW9uYWwgc3VwcG9ydAorICAvLyAgICAgICAgICAgICAgZnJvbSBndGhyLmggb3IgYWJzdHJhY3Rpb24gbGF5ZXJzIGluIGNvbmN1cnJlbmNlLmguCisgIC8vIF9TX2F0b21pYyAgICBtdWx0aS10aHJlYWRlZCBjb2RlIHVzaW5nIGF0b21pYyBvcGVyYXRpb25zLgorICBlbnVtIF9Mb2NrX3BvbGljeSB7IF9TX3NpbmdsZSwgX1NfbXV0ZXgsIF9TX2F0b21pYyB9OyAKKworICAvLyBDb21waWxlIHRpbWUgY29uc3RhbnQgdGhhdCBpbmRpY2F0ZXMgcHJlZmVyZWQgbG9ja2luZyBwb2xpY3kgaW4KKyAgLy8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyAgc3RhdGljIGNvbnN0IF9Mb2NrX3BvbGljeSBfX2RlZmF1bHRfbG9ja19wb2xpY3kgPSAKKyNpZmRlZiBfX0dUSFJFQURTCisjaWYgKGRlZmluZWQoX19HQ0NfSEFWRV9TWU5DX0NPTVBBUkVfQU5EX1NXQVBfMikgXAorICAgICAmJiBkZWZpbmVkKF9fR0NDX0hBVkVfU1lOQ19DT01QQVJFX0FORF9TV0FQXzQpKQorICBfU19hdG9taWM7CisjZWxzZQorICBfU19tdXRleDsKKyNlbmRpZgorI2Vsc2UKKyAgX1Nfc2luZ2xlOworI2VuZGlmCisKKyAgLy8gTkI6IEFzIHRoaXMgaXMgdXNlZCBpbiBsaWJzdXBjKyssIG5lZWQgdG8gb25seSBkZXBlbmQgb24KKyAgLy8gZXhjZXB0aW9uLiBObyBzdGRleGNlcHRpb24gY2xhc3Nlcywgbm8gdXNlIG9mIHN0ZDo6c3RyaW5nLgorICBjbGFzcyBfX2NvbmN1cnJlbmNlX2xvY2tfZXJyb3IgOiBwdWJsaWMgc3RkOjpleGNlcHRpb24KKyAgeworICBwdWJsaWM6CisgICAgdmlydHVhbCBjaGFyIGNvbnN0KgorICAgIHdoYXQoKSBjb25zdCB0aHJvdygpCisgICAgeyByZXR1cm4gIl9fZ251X2N4eDo6X19jb25jdXJyZW5jZV9sb2NrX2Vycm9yIjsgfQorICB9OworCisgIGNsYXNzIF9fY29uY3VycmVuY2VfdW5sb2NrX2Vycm9yIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uCisgIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgY2hhciBjb25zdCoKKyAgICB3aGF0KCkgY29uc3QgdGhyb3coKQorICAgIHsgcmV0dXJuICJfX2dudV9jeHg6Ol9fY29uY3VycmVuY2VfdW5sb2NrX2Vycm9yIjsgfQorICB9OworCisgIGNsYXNzIF9fY29uY3VycmVuY2VfYnJvYWRjYXN0X2Vycm9yIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uCisgIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgY2hhciBjb25zdCoKKyAgICB3aGF0KCkgY29uc3QgdGhyb3coKQorICAgIHsgcmV0dXJuICJfX2dudV9jeHg6Ol9fY29uY3VycmVuY2VfYnJvYWRjYXN0X2Vycm9yIjsgfQorICB9OworCisgIGNsYXNzIF9fY29uY3VycmVuY2Vfd2FpdF9lcnJvciA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbgorICB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIGNoYXIgY29uc3QqCisgICAgd2hhdCgpIGNvbnN0IHRocm93KCkKKyAgICB7IHJldHVybiAiX19nbnVfY3h4OjpfX2NvbmN1cnJlbmNlX3dhaXRfZXJyb3IiOyB9CisgIH07CisKKyAgLy8gU3Vic3RpdHV0ZSBmb3IgY29uY3VycmVuY2VfZXJyb3Igb2JqZWN0IGluIHRoZSBjYXNlIG9mIC1mbm8tZXhjZXB0aW9ucy4KKyAgaW5saW5lIHZvaWQKKyAgX190aHJvd19jb25jdXJyZW5jZV9sb2NrX2Vycm9yKCkKKyAgeyBfR0xJQkNYWF9USFJPV19PUl9BQk9SVChfX2NvbmN1cnJlbmNlX2xvY2tfZXJyb3IoKSk7IH0KKworICBpbmxpbmUgdm9pZAorICBfX3Rocm93X2NvbmN1cnJlbmNlX3VubG9ja19lcnJvcigpCisgIHsgX0dMSUJDWFhfVEhST1dfT1JfQUJPUlQoX19jb25jdXJyZW5jZV91bmxvY2tfZXJyb3IoKSk7IH0KKworI2lmZGVmIF9fR1RIUkVBRF9IQVNfQ09ORAorICBpbmxpbmUgdm9pZAorICBfX3Rocm93X2NvbmN1cnJlbmNlX2Jyb2FkY2FzdF9lcnJvcigpCisgIHsgX0dMSUJDWFhfVEhST1dfT1JfQUJPUlQoX19jb25jdXJyZW5jZV9icm9hZGNhc3RfZXJyb3IoKSk7IH0KKworICBpbmxpbmUgdm9pZAorICBfX3Rocm93X2NvbmN1cnJlbmNlX3dhaXRfZXJyb3IoKQorICB7IF9HTElCQ1hYX1RIUk9XX09SX0FCT1JUKF9fY29uY3VycmVuY2Vfd2FpdF9lcnJvcigpKTsgfQorI2VuZGlmCisgCisgIGNsYXNzIF9fbXV0ZXggCisgIHsKKyAgcHJpdmF0ZToKKyNpZiBfX0dUSFJFQURTICYmIGRlZmluZWQgX19HVEhSRUFEX01VVEVYX0lOSVQKKyAgICBfX2d0aHJlYWRfbXV0ZXhfdCBfTV9tdXRleCA9IF9fR1RIUkVBRF9NVVRFWF9JTklUOworI2Vsc2UKKyAgICBfX2d0aHJlYWRfbXV0ZXhfdCBfTV9tdXRleDsKKyNlbmRpZgorCisgICAgX19tdXRleChjb25zdCBfX211dGV4Jik7CisgICAgX19tdXRleCYgb3BlcmF0b3I9KGNvbnN0IF9fbXV0ZXgmKTsKKworICBwdWJsaWM6CisgICAgX19tdXRleCgpIAorICAgIHsgCisjaWYgX19HVEhSRUFEUyAmJiAhIGRlZmluZWQgX19HVEhSRUFEX01VVEVYX0lOSVQKKyAgICAgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AoKSkKKwlfX0dUSFJFQURfTVVURVhfSU5JVF9GVU5DVElPTigmX01fbXV0ZXgpOworI2VuZGlmCisgICAgfQorCisjaWYgX19HVEhSRUFEUyAmJiAhIGRlZmluZWQgX19HVEhSRUFEX01VVEVYX0lOSVQKKyAgICB+X19tdXRleCgpIAorICAgIHsgCisgICAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wKCkpCisJX19ndGhyZWFkX211dGV4X2Rlc3Ryb3koJl9NX211dGV4KTsgCisgICAgfQorI2VuZGlmIAorCisgICAgdm9pZCBsb2NrKCkKKyAgICB7CisjaWYgX19HVEhSRUFEUworICAgICAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCgpKQorCXsKKwkgIGlmIChfX2d0aHJlYWRfbXV0ZXhfbG9jaygmX01fbXV0ZXgpICE9IDApCisJICAgIF9fdGhyb3dfY29uY3VycmVuY2VfbG9ja19lcnJvcigpOworCX0KKyNlbmRpZgorICAgIH0KKyAgICAKKyAgICB2b2lkIHVubG9jaygpCisgICAgeworI2lmIF9fR1RIUkVBRFMKKyAgICAgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AoKSkKKwl7CisJICBpZiAoX19ndGhyZWFkX211dGV4X3VubG9jaygmX01fbXV0ZXgpICE9IDApCisJICAgIF9fdGhyb3dfY29uY3VycmVuY2VfdW5sb2NrX2Vycm9yKCk7CisJfQorI2VuZGlmCisgICAgfQorCisgICAgX19ndGhyZWFkX211dGV4X3QqIGd0aHJlYWRfbXV0ZXgodm9pZCkKKyAgICAgIHsgcmV0dXJuICZfTV9tdXRleDsgfQorICB9OworCisgIGNsYXNzIF9fcmVjdXJzaXZlX211dGV4IAorICB7CisgIHByaXZhdGU6CisjaWYgX19HVEhSRUFEUyAmJiBkZWZpbmVkIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVAorICAgIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCBfTV9tdXRleCA9IF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVDsKKyNlbHNlCisgICAgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90IF9NX211dGV4OworI2VuZGlmCisKKyAgICBfX3JlY3Vyc2l2ZV9tdXRleChjb25zdCBfX3JlY3Vyc2l2ZV9tdXRleCYpOworICAgIF9fcmVjdXJzaXZlX211dGV4JiBvcGVyYXRvcj0oY29uc3QgX19yZWN1cnNpdmVfbXV0ZXgmKTsKKworICBwdWJsaWM6CisgICAgX19yZWN1cnNpdmVfbXV0ZXgoKSAKKyAgICB7IAorI2lmIF9fR1RIUkVBRFMgJiYgISBkZWZpbmVkIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVAorICAgICAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCgpKQorCV9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVF9GVU5DVElPTigmX01fbXV0ZXgpOworI2VuZGlmCisgICAgfQorCisjaWYgX19HVEhSRUFEUyAmJiAhIGRlZmluZWQgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUCisgICAgfl9fcmVjdXJzaXZlX211dGV4KCkKKyAgICB7CisgICAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wKCkpCisJX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9kZXN0cm95KCZfTV9tdXRleCk7CisgICAgfQorI2VuZGlmCisKKyAgICB2b2lkIGxvY2soKQorICAgIHsgCisjaWYgX19HVEhSRUFEUworICAgICAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCgpKQorCXsKKwkgIGlmIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2xvY2soJl9NX211dGV4KSAhPSAwKQorCSAgICBfX3Rocm93X2NvbmN1cnJlbmNlX2xvY2tfZXJyb3IoKTsKKwl9CisjZW5kaWYKKyAgICB9CisgICAgCisgICAgdm9pZCB1bmxvY2soKQorICAgIHsgCisjaWYgX19HVEhSRUFEUworICAgICAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCgpKQorCXsKKwkgIGlmIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3VubG9jaygmX01fbXV0ZXgpICE9IDApCisJICAgIF9fdGhyb3dfY29uY3VycmVuY2VfdW5sb2NrX2Vycm9yKCk7CisJfQorI2VuZGlmCisgICAgfQorCisgICAgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90KiBndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleCh2b2lkKQorICAgIHsgcmV0dXJuICZfTV9tdXRleDsgfQorICB9OworCisgIC8vLyBTY29wZWQgbG9jayBpZGlvbS4KKyAgLy8gQWNxdWlyZSB0aGUgbXV0ZXggaGVyZSB3aXRoIGEgY29uc3RydWN0b3IgY2FsbCwgdGhlbiByZWxlYXNlIHdpdGgKKyAgLy8gdGhlIGRlc3RydWN0b3IgY2FsbCBpbiBhY2NvcmRhbmNlIHdpdGggUkFJSSBzdHlsZS4KKyAgY2xhc3MgX19zY29wZWRfbG9jaworICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9fbXV0ZXggX19tdXRleF90eXBlOworCisgIHByaXZhdGU6CisgICAgX19tdXRleF90eXBlJiBfTV9kZXZpY2U7CisKKyAgICBfX3Njb3BlZF9sb2NrKGNvbnN0IF9fc2NvcGVkX2xvY2smKTsKKyAgICBfX3Njb3BlZF9sb2NrJiBvcGVyYXRvcj0oY29uc3QgX19zY29wZWRfbG9jayYpOworCisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBfX3Njb3BlZF9sb2NrKF9fbXV0ZXhfdHlwZSYgX19uYW1lKSA6IF9NX2RldmljZShfX25hbWUpCisgICAgeyBfTV9kZXZpY2UubG9jaygpOyB9CisKKyAgICB+X19zY29wZWRfbG9jaygpIHRocm93KCkKKyAgICB7IF9NX2RldmljZS51bmxvY2soKTsgfQorICB9OworCisjaWZkZWYgX19HVEhSRUFEX0hBU19DT05ECisgIGNsYXNzIF9fY29uZAorICB7CisgIHByaXZhdGU6CisjaWYgX19HVEhSRUFEUyAmJiBkZWZpbmVkIF9fR1RIUkVBRF9DT05EX0lOSVQKKyAgICBfX2d0aHJlYWRfY29uZF90IF9NX2NvbmQgPSBfX0dUSFJFQURfQ09ORF9JTklUOworI2Vsc2UKKyAgICBfX2d0aHJlYWRfY29uZF90IF9NX2NvbmQ7CisjZW5kaWYKKworICAgIF9fY29uZChjb25zdCBfX2NvbmQmKTsKKyAgICBfX2NvbmQmIG9wZXJhdG9yPShjb25zdCBfX2NvbmQmKTsKKworICBwdWJsaWM6CisgICAgX19jb25kKCkgCisgICAgeyAKKyNpZiBfX0dUSFJFQURTICYmICEgZGVmaW5lZCBfX0dUSFJFQURfQ09ORF9JTklUCisgICAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wKCkpCisJX19HVEhSRUFEX0NPTkRfSU5JVF9GVU5DVElPTigmX01fY29uZCk7CisjZW5kaWYKKyAgICB9CisKKyNpZiBfX0dUSFJFQURTICYmICEgZGVmaW5lZCBfX0dUSFJFQURfQ09ORF9JTklUCisgICAgfl9fY29uZCgpIAorICAgIHsgCisgICAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wKCkpCisJX19ndGhyZWFkX2NvbmRfZGVzdHJveSgmX01fY29uZCk7IAorICAgIH0KKyNlbmRpZiAKKworICAgIHZvaWQgYnJvYWRjYXN0KCkKKyAgICB7CisjaWYgX19HVEhSRUFEUworICAgICAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCgpKQorCXsKKwkgIGlmIChfX2d0aHJlYWRfY29uZF9icm9hZGNhc3QoJl9NX2NvbmQpICE9IDApCisJICAgIF9fdGhyb3dfY29uY3VycmVuY2VfYnJvYWRjYXN0X2Vycm9yKCk7CisJfQorI2VuZGlmCisgICAgfQorCisgICAgdm9pZCB3YWl0KF9fbXV0ZXggKm11dGV4KQorICAgIHsKKyNpZiBfX0dUSFJFQURTCisgICAgICB7CisJICBpZiAoX19ndGhyZWFkX2NvbmRfd2FpdCgmX01fY29uZCwgbXV0ZXgtPmd0aHJlYWRfbXV0ZXgoKSkgIT0gMCkKKwkgICAgX190aHJvd19jb25jdXJyZW5jZV93YWl0X2Vycm9yKCk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICB2b2lkIHdhaXRfcmVjdXJzaXZlKF9fcmVjdXJzaXZlX211dGV4ICptdXRleCkKKyAgICB7CisjaWYgX19HVEhSRUFEUworICAgICAgeworCSAgaWYgKF9fZ3RocmVhZF9jb25kX3dhaXRfcmVjdXJzaXZlKCZfTV9jb25kLAorCQkJCQkgICAgbXV0ZXgtPmd0aHJlYWRfcmVjdXJzaXZlX211dGV4KCkpCisJICAgICAgIT0gMCkKKwkgICAgX190aHJvd19jb25jdXJyZW5jZV93YWl0X2Vycm9yKCk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgIH07CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2RlYnVnX2FsbG9jYXRvci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvZGVidWdfYWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE5MGQyYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2RlYnVnX2FsbG9jYXRvci5oCkBAIC0wLDAgKzEsMTI2IEBACisvLyBBbGxvY2F0b3JzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGV4dC9kZWJ1Z19hbGxvY2F0b3IuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0RFQlVHX0FMTE9DQVRPUl9ICisjZGVmaW5lIF9ERUJVR19BTExPQ0FUT1JfSCAxCisKKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyBzdGQ6OnNpemVfdDsKKworICAvKioKKyAgICogIEBicmllZiAgQSBtZXRhLWFsbG9jYXRvciB3aXRoIGRlYnVnZ2luZyBiaXRzLCBhcyBwZXIgWzIwLjRdLgorICAgKiAgQGluZ3JvdXAgYWxsb2NhdG9ycworICAgKgorICAgKiAgVGhpcyBpcyBwcmVjaXNlbHkgdGhlIGFsbG9jYXRvciBkZWZpbmVkIGluIHRoZSBDKysgU3RhbmRhcmQuIAorICAgKiAgICAtIGFsbCBhbGxvY2F0aW9uIGNhbGxzIG9wZXJhdG9yIG5ldworICAgKiAgICAtIGFsbCBkZWFsbG9jYXRpb24gY2FsbHMgb3BlcmF0b3IgZGVsZXRlCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgZGVidWdfYWxsb2NhdG9yCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgICAgICAgCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpkaWZmZXJlbmNlX3R5cGUJZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnBvaW50ZXIgICAgICAgCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6Y29uc3RfcG9pbnRlciAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnJlZmVyZW5jZSAgICAgICAJcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmNvbnN0X3JlZmVyZW5jZSAgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnZhbHVlX3R5cGUgICAgICAgdmFsdWVfdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICAvLyBfTV9leHRyYSBpcyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZQorICAgICAgLy8gZXh0cmEgc3BhY2Ugd2hlcmUgZGVidWcgaW5mb3JtYXRpb24gaXMgc3RvcmVkLgorICAgICAgc2l6ZV90eXBlIAkJX01fZXh0cmE7CisgICAgICAKKyAgICAgIF9BbGxvYwkJCV9NX2FsbG9jYXRvcjsKKworICAgIHB1YmxpYzoKKyAgICAgIGRlYnVnX2FsbG9jYXRvcigpCisgICAgICB7CisJY29uc3Qgc2l6ZV90IF9fb2JqX3NpemUgPSBzaXplb2YodmFsdWVfdHlwZSk7CisJX01fZXh0cmEgPSAoc2l6ZW9mKHNpemVfdHlwZSkgKyBfX29ial9zaXplIC0gMSkgLyBfX29ial9zaXplOyAKKyAgICAgIH0KKyAgICAgIAorICAgICAgcG9pbnRlcgorICAgICAgYWxsb2NhdGUoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKyAgICAgICAgcG9pbnRlciBfX3JlcyA9IF9NX2FsbG9jYXRvci5hbGxvY2F0ZShfX24gKyBfTV9leHRyYSk7ICAgICAgCisJc2l6ZV90eXBlKiBfX3BzID0gcmVpbnRlcnByZXRfY2FzdDxzaXplX3R5cGUqPihfX3Jlcyk7CisJKl9fcHMgPSBfX247CisgICAgICAgIHJldHVybiBfX3JlcyArIF9NX2V4dHJhOworICAgICAgfQorCisgICAgICBwb2ludGVyCisgICAgICBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCBjb25zdCB2b2lkKiBfX2hpbnQpCisgICAgICB7CisgICAgICAgIHBvaW50ZXIgX19yZXMgPSBfTV9hbGxvY2F0b3IuYWxsb2NhdGUoX19uICsgX01fZXh0cmEsIF9faGludCk7CisJc2l6ZV90eXBlKiBfX3BzID0gcmVpbnRlcnByZXRfY2FzdDxzaXplX3R5cGUqPihfX3Jlcyk7CisJKl9fcHMgPSBfX247CisgICAgICAgIHJldHVybiBfX3JlcyArIF9NX2V4dHJhOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBkZWFsbG9jYXRlKHBvaW50ZXIgX19wLCBzaXplX3R5cGUgX19uKQorICAgICAgeworCWlmIChfX3ApCisJICB7CisJICAgIHBvaW50ZXIgX19yZWFsX3AgPSBfX3AgLSBfTV9leHRyYTsKKwkgICAgaWYgKCpyZWludGVycHJldF9jYXN0PHNpemVfdHlwZSo+KF9fcmVhbF9wKSAhPSBfX24pCisJICAgICAgeworCQl0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoImRlYnVnX2FsbG9jYXRvcjo6ZGVhbGxvY2F0ZSIKKwkJCQkJICIgd3Jvbmcgc2l6ZSIpOworCSAgICAgIH0KKwkgICAgX01fYWxsb2NhdG9yLmRlYWxsb2NhdGUoX19yZWFsX3AsIF9fbiArIF9NX2V4dHJhKTsKKwkgIH0KKwllbHNlCisJICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoImRlYnVnX2FsbG9jYXRvcjo6ZGVhbGxvY2F0ZSBudWxsIHBvaW50ZXIiKTsKKyAgICAgIH0KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvZW5jX2ZpbGVidWYuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2VuY19maWxlYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUxY2RkYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2VuY19maWxlYnVmLmgKQEAgLTAsMCArMSw2NSBAQAorLy8gZmlsZWJ1ZiB3aXRoIGVuY29kaW5nIHN0YXRlIHR5cGUgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAyLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9lbmNfZmlsZWJ1Zi5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfRVhUX0VOQ19GSUxFQlVGX0gKKyNkZWZpbmUgX0VYVF9FTkNfRklMRUJVRl9IIDEKKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8bG9jYWxlPgorI2luY2x1ZGUgPGV4dC9jb2RlY3Z0X3NwZWNpYWxpemF0aW9ucy5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8vIGNsYXNzIGVuY19maWxlYnVmLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY2xhc3MgZW5jX2ZpbGVidWYKKyAgICA6IHB1YmxpYyBzdGQ6OmJhc2ljX2ZpbGVidWY8X0NoYXJULCBlbmNvZGluZ19jaGFyX3RyYWl0czxfQ2hhclQ+ID4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBlbmNvZGluZ19jaGFyX3RyYWl0czxfQ2hhclQ+ICAgICAJdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpzdGF0ZV90eXBlCXN0YXRlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZQlwb3NfdHlwZTsKKworICAgICAgZW5jX2ZpbGVidWYoc3RhdGVfdHlwZSYgX19zdGF0ZSkKKyAgICAgIDogc3RkOjpiYXNpY19maWxlYnVmPF9DaGFyVCwgZW5jb2RpbmdfY2hhcl90cmFpdHM8X0NoYXJUPiA+KCkKKyAgICAgIHsgdGhpcy0+X01fc3RhdGVfYmVnID0gX19zdGF0ZTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzOgorICAgICAgLy8gU2V0IHN0YXRlIHR5cGUgdG8gc29tZXRoaW5nIHVzZWZ1bC4KKyAgICAgIC8vIFNvbWV0aGluZyBtb3JlIHRoYW4gY29weWNvbnN0cnVjdGlibGUgaXMgbmVlZGVkIGhlcmUsIHNvCisgICAgICAvLyByZXF1aXJlIGRlZmF1bHQgYW5kIGNvcHkgY29uc3RydWN0aWJsZSArIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoc3RhdGVfdHlwZSwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9leHRwdHJfYWxsb2NhdG9yLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9leHRwdHJfYWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzODIzNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2V4dHB0cl9hbGxvY2F0b3IuaApAQCAtMCwwICsxLDE5NyBAQAorLy8gPGV4dHB0cl9hbGxvY2F0b3IuaD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqCisgKiAgQGZpbGUgZXh0L2V4dHB0cl9hbGxvY2F0b3IuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICoKKyAqICBAYXV0aG9yIEJvYiBXYWx0ZXJzCisgKgorICogQW4gZXhhbXBsZSBhbGxvY2F0b3Igd2hpY2ggdXNlcyBhbiBhbHRlcm5hdGl2ZSBwb2ludGVyIHR5cGUgZnJvbQorICogYml0cy9wb2ludGVyLmguICBTdXBwb3J0cyB0ZXN0IGNhc2VzIHdoaWNoIGNvbmZpcm0gY29udGFpbmVyIHN1cHBvcnQKKyAqIGZvciBhbHRlcm5hdGl2ZSBwb2ludGVycy4KKyAqLworCisjaWZuZGVmIF9FWFRQVFJfQUxMT0NBVE9SX0gKKyNkZWZpbmUgX0VYVFBUUl9BTExPQ0FUT1JfSCAxCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8ZXh0L251bWVyaWNfdHJhaXRzLmg+CisjaW5jbHVkZSA8ZXh0L3BvaW50ZXIuaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYnJpZWYgQW4gZXhhbXBsZSBhbGxvY2F0b3Igd2hpY2ggdXNlcyBhIG5vbi1zdGFuZGFyZCBwb2ludGVyIHR5cGUuCisgICAqIEBpbmdyb3VwIGFsbG9jYXRvcnMKKyAgICoKKyAgICogVGhpcyBhbGxvY2F0b3Igc3BlY2lmaWVzIHRoYXQgY29udGFpbmVycyB1c2UgYSAncmVsYXRpdmUgcG9pbnRlcicgYXMgaXQncworICAgKiBwb2ludGVyIHR5cGUuICAoU2VlIGV4dC9wb2ludGVyLmgpICBNZW1vcnkgYWxsb2NhdGlvbiBpbiB0aGlzIGV4YW1wbGUKKyAgICogaXMgc3RpbGwgcGVyZm9ybWVkIHVzaW5nIHN0ZDo6YWxsb2NhdG9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIF9FeHRQdHJfYWxsb2NhdG9yCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgc3RkOjpzaXplX3QgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgLy8gTm90ZSB0aGUgbm9uLXN0YW5kYXJkIHBvaW50ZXIgdHlwZXMuCisgICAgICB0eXBlZGVmIF9Qb2ludGVyX2FkYXB0ZXI8X1JlbGF0aXZlX3BvaW50ZXJfaW1wbDxfVHA+ID4gICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgX1BvaW50ZXJfYWRhcHRlcjxfUmVsYXRpdmVfcG9pbnRlcl9pbXBsPGNvbnN0IF9UcD4gPiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9wb2ludGVyOworCisgICAgICB0eXBlZGVmIF9UcCYgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICB2YWx1ZV90eXBlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIHN0cnVjdCByZWJpbmQKKyAgICAgICAgeyB0eXBlZGVmIF9FeHRQdHJfYWxsb2NhdG9yPF9VcD4gb3RoZXI7IH07CisKKyAgICAgIF9FeHRQdHJfYWxsb2NhdG9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIAorICAgICAgOiBfTV9yZWFsX2FsbG9jKCkgeyB9CisKKyAgICAgIF9FeHRQdHJfYWxsb2NhdG9yKGNvbnN0IF9FeHRQdHJfYWxsb2NhdG9yJiBfX3JhcmcpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgOiBfTV9yZWFsX2FsbG9jKF9fcmFyZy5fTV9yZWFsX2FsbG9jKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICBfRXh0UHRyX2FsbG9jYXRvcihjb25zdCBfRXh0UHRyX2FsbG9jYXRvcjxfVXA+JiBfX3JhcmcpCisJX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICAgIDogX01fcmVhbF9hbGxvYyhfX3JhcmcuX01fZ2V0VW5kZXJseWluZ0ltcCgpKSB7IH0KKworICAgICAgfl9FeHRQdHJfYWxsb2NhdG9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IH0KKworICAgICAgcG9pbnRlciBhZGRyZXNzKHJlZmVyZW5jZSBfX3gpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9feCk7IH0KKworICAgICAgY29uc3RfcG9pbnRlciBhZGRyZXNzKGNvbnN0X3JlZmVyZW5jZSBfX3gpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9feCk7IH0KKworICAgICAgcG9pbnRlciBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCB2b2lkKiBfX2hpbnQgPSAwKQorICAgICAgeyByZXR1cm4gX01fcmVhbF9hbGxvYy5hbGxvY2F0ZShfX24sX19oaW50KTsgfQorCisgICAgICB2b2lkIGRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlwZSBfX24pCisgICAgICB7IF9NX3JlYWxfYWxsb2MuZGVhbGxvY2F0ZShfX3AuZ2V0KCksIF9fbik7IH0KKworICAgICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfX251bWVyaWNfdHJhaXRzPHNpemVfdHlwZT46Ol9fbWF4IC8gc2l6ZW9mKF9UcCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgY29uc3RydWN0KF9VcCogX19wLCBfQXJncyYmLi4uIF9fYXJncykKKwl7IDo6bmV3KCh2b2lkICopX19wKSBfVXAoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBjb25zdHJ1Y3QocG9pbnRlciBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsgY29uc3RydWN0KF9fcC5nZXQoKSwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIHZvaWQgCisgICAgICAgIGRlc3Ryb3koX1VwKiBfX3ApCisgICAgICAgIHsgX19wLT5+X1VwKCk7IH0KKworICAgICAgdm9pZCBkZXN0cm95KHBvaW50ZXIgX19wKQorICAgICAgeyBkZXN0cm95KF9fcC5nZXQoKSk7IH0KKworI2Vsc2UKKworICAgICAgdm9pZCBjb25zdHJ1Y3QocG9pbnRlciBfX3AsIGNvbnN0IF9UcCYgX192YWwpCisgICAgICB7IDo6bmV3KF9fcC5nZXQoKSkgX1RwKF9fdmFsKTsgfQorCisgICAgICB2b2lkIGRlc3Ryb3kocG9pbnRlciBfX3ApCisgICAgICB7IF9fcC0+fl9UcCgpOyB9CisjZW5kaWYKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICBpbmxpbmUgYm9vbAorICAgICAgICBvcGVyYXRvcj09KGNvbnN0IF9FeHRQdHJfYWxsb2NhdG9yPF9VcD4mIF9fcmFyZykKKyAgICAgICAgeyByZXR1cm4gX01fcmVhbF9hbGxvYyA9PSBfX3JhcmcuX01fZ2V0VW5kZXJseWluZ0ltcCgpOyB9CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IF9FeHRQdHJfYWxsb2NhdG9yJiBfX3JhcmcpCisgICAgICB7IHJldHVybiBfTV9yZWFsX2FsbG9jID09IF9fcmFyZy5fTV9yZWFsX2FsbG9jOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgaW5saW5lIGJvb2wKKyAgICAgICAgb3BlcmF0b3IhPShjb25zdCBfRXh0UHRyX2FsbG9jYXRvcjxfVXA+JiBfX3JhcmcpCisgICAgICAgIHsgcmV0dXJuIF9NX3JlYWxfYWxsb2MgIT0gX19yYXJnLl9NX2dldFVuZGVybHlpbmdJbXAoKTsgfQorCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBfRXh0UHRyX2FsbG9jYXRvciYgX19yYXJnKQorICAgICAgeyByZXR1cm4gX01fcmVhbF9hbGxvYyAhPSBfX3JhcmcuX01fcmVhbF9hbGxvYzsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIGlubGluZSBmcmllbmQgdm9pZAorICAgICAgICBzd2FwKF9FeHRQdHJfYWxsb2NhdG9yPF9VcD4mLCBfRXh0UHRyX2FsbG9jYXRvcjxfVXA+Jik7CisKKyAgICAgIC8vIEEgbWV0aG9kIHNwZWNpZmljIHRvIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICBjb25zdCBzdGQ6OmFsbG9jYXRvcjxfVHA+JgorICAgICAgX01fZ2V0VW5kZXJseWluZ0ltcCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9yZWFsX2FsbG9jOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgc3RkOjphbGxvY2F0b3I8X1RwPiAgX01fcmVhbF9hbGxvYzsKKyAgICB9OworCisgIC8vIF9FeHRQdHJfYWxsb2NhdG9yPHZvaWQ+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgX0V4dFB0cl9hbGxvY2F0b3I8dm9pZD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKworICAgICAgLy8gTm90ZSB0aGUgbm9uLXN0YW5kYXJkIHBvaW50ZXIgdHlwZXMKKyAgICAgIHR5cGVkZWYgX1BvaW50ZXJfYWRhcHRlcjxfUmVsYXRpdmVfcG9pbnRlcl9pbXBsPHZvaWQ+ID4gICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgX1BvaW50ZXJfYWRhcHRlcjxfUmVsYXRpdmVfcG9pbnRlcl9pbXBsPGNvbnN0IHZvaWQ+ID4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcG9pbnRlcjsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICBzdHJ1Y3QgcmViaW5kCisgICAgICAgIHsgdHlwZWRlZiBfRXh0UHRyX2FsbG9jYXRvcjxfVXA+IG90aGVyOyB9OworCisgICAgcHJpdmF0ZToKKyAgICAgIHN0ZDo6YWxsb2NhdG9yPHZvaWQ+ICBfTV9yZWFsX2FsbG9jOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfRXh0UHRyX2FsbG9jYXRvcjxfVHA+JiBfX2xhcmcsIF9FeHRQdHJfYWxsb2NhdG9yPF9UcD4mIF9fcmFyZykKKyAgICB7CisgICAgICBzdGQ6OmFsbG9jYXRvcjxfVHA+IF9fdG1wKCBfX3JhcmcuX01fcmVhbF9hbGxvYyApOworICAgICAgX19yYXJnLl9NX3JlYWxfYWxsb2MgPSBfX2xhcmcuX01fcmVhbF9hbGxvYzsKKyAgICAgIF9fbGFyZy5fTV9yZWFsX2FsbG9jID0gX190bXA7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfRVhUUFRSX0FMTE9DQVRPUl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9mdW5jdGlvbmFsIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvZnVuY3Rpb25hbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWM4MDM0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvZnVuY3Rpb25hbApAQCAtMCwwICsxLDQzMCBAQAorLy8gRnVuY3Rpb25hbCBleHRlbnNpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgZXh0L2Z1bmN0aW9uYWwKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeSAocG9zc2libHkKKyAqICBjb250YWluaW5nIGV4dGVuc2lvbnMgZnJvbSB0aGUgSFAvU0dJIFNUTCBzdWJzZXQpLgorICovCisKKyNpZm5kZWYgX0VYVF9GVU5DVElPTkFMCisjZGVmaW5lIF9FWFRfRlVOQ1RJT05BTCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyBzdGQ6OnNpemVfdDsKKyAgdXNpbmcgc3RkOjp1bmFyeV9mdW5jdGlvbjsKKyAgdXNpbmcgc3RkOjpiaW5hcnlfZnVuY3Rpb247CisgIHVzaW5nIHN0ZDo6bWVtX2Z1bjFfdDsKKyAgdXNpbmcgc3RkOjpjb25zdF9tZW1fZnVuMV90OworICB1c2luZyBzdGQ6Om1lbV9mdW4xX3JlZl90OworICB1c2luZyBzdGQ6OmNvbnN0X21lbV9mdW4xX3JlZl90OworCisgIC8qKiBUaGUgQGMgaWRlbnRpdHlfZWxlbWVudCBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBDKysKKyAgICogIHN0YW5kYXJkOyBTR0kgcHJvdmlkZWQgdGhlbSBhcyBhbiBleHRlbnNpb24uICBJdHMgYXJndW1lbnQgaXMgYW4KKyAgICogIG9wZXJhdGlvbiwgYW5kIGl0cyByZXR1cm4gdmFsdWUgaXMgdGhlIGlkZW50aXR5IGVsZW1lbnQgZm9yIHRoYXQKKyAgICogIG9wZXJhdGlvbi4gIEl0IGlzIG92ZXJsb2FkZWQgZm9yIGFkZGl0aW9uIGFuZCBtdWx0aXBsaWNhdGlvbiwKKyAgICogIGFuZCB5b3UgY2FuIG92ZXJsb2FkIGl0IGZvciB5b3VyIG93biBuZWZhcmlvdXMgb3BlcmF0aW9ucy4KKyAgICoKKyAgICogIEBhZGR0b2dyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEB7CisgICAqLworICAvLy8gQW4gXGxpbmsgU0dJZXh0ZW5zaW9ucyBTR0kgZXh0ZW5zaW9uIFxlbmRsaW5rLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBpZGVudGl0eV9lbGVtZW50KHN0ZDo6cGx1czxfVHA+KQorICAgIHsgcmV0dXJuIF9UcCgwKTsgfQorCisgIC8vLyBBbiBcbGluayBTR0lleHRlbnNpb25zIFNHSSBleHRlbnNpb24gXGVuZGxpbmsuCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIGlkZW50aXR5X2VsZW1lbnQoc3RkOjptdWx0aXBsaWVzPF9UcD4pCisgICAgeyByZXR1cm4gX1RwKDEpOyB9CisgIC8qKiBAfSAgKi8KKyAgCisgIC8qKiBBcyBhbiBleHRlbnNpb24gdG8gdGhlIGJpbmRlcnMsIFNHSSBwcm92aWRlZCBjb21wb3NpdGlvbiBmdW5jdG9ycyBhbmQKKyAgICogIHdyYXBwZXIgZnVuY3Rpb25zIHRvIGFpZCBpbiB0aGVpciBjcmVhdGlvbi4gIFRoZSBAYyB1bmFyeV9jb21wb3NlCisgICAqICBmdW5jdG9yIGlzIGNvbnN0cnVjdGVkIGZyb20gdHdvIGZ1bmN0aW9ucy9mdW5jdG9ycywgQGMgZiBhbmQgQGMgZy4KKyAgICogIENhbGxpbmcgQGMgb3BlcmF0b3IoKSB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50IEBjIHggcmV0dXJucyBAYyBmKGcoeCkpLgorICAgKiAgVGhlIGZ1bmN0aW9uIEBjIGNvbXBvc2UxIHRha2VzIHRoZSB0d28gZnVuY3Rpb25zIGFuZCBjb25zdHJ1Y3RzIGEKKyAgICogIEBjIHVuYXJ5X2NvbXBvc2UgdmFyaWFibGUgZm9yIHlvdS4KKyAgICoKKyAgICogIEBjIGJpbmFyeV9jb21wb3NlIGlzIGNvbnN0cnVjdGVkIGZyb20gdGhyZWUgZnVuY3RvcnMsIEBjIGYsIEBjIGcxLAorICAgKiAgYW5kIEBjIGcyLiAgSXRzIEBjIG9wZXJhdG9yKCkgcmV0dXJucyBAYyBmKGcxKHgpLGcyKHgpKS4gIFRoZSBmdW5jdGlvbgorICAgKiAgY29tcG9zZTIgdGFrZXMgZiwgZzEsIGFuZCBnMiwgYW5kIGNvbnN0cnVjdHMgdGhlIEBjIGJpbmFyeV9jb21wb3NlCisgICAqICBpbnN0YW5jZSBmb3IgeW91LiAgRm9yIGV4YW1wbGUsIGlmIEBjIGYgcmV0dXJucyBhbiBpbnQsIHRoZW4KKyAgICogIFxjb2RlCisgICAqICBpbnQgYW5zd2VyID0gKGNvbXBvc2UyKGYsZzEsZzIpKSh4KTsKKyAgICogIFxlbmRjb2RlCisgICAqICBpcyBlcXVpdmFsZW50IHRvCisgICAqICBcY29kZQorICAgKiAgaW50IHRlbXAxID0gZzEoeCk7CisgICAqICBpbnQgdGVtcDIgPSBnMih4KTsKKyAgICogIGludCBhbnN3ZXIgPSBmKHRlbXAxLHRlbXAyKTsKKyAgICogIFxlbmRjb2RlCisgICAqICBCdXQgdGhlIGZpcnN0IGZvcm0gaXMgbW9yZSBjb21wYWN0LCBhbmQgY2FuIGJlIHBhc3NlZCBhcm91bmQgYXMgYQorICAgKiAgZnVuY3RvciB0byBvdGhlciBhbGdvcml0aG1zLgorICAgKgorICAgKiAgQGFkZHRvZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQHsKKyAgICovCisgIC8vLyBBbiBcbGluayBTR0lleHRlbnNpb25zIFNHSSBleHRlbnNpb24gXGVuZGxpbmsuCisgIHRlbXBsYXRlIDxjbGFzcyBfT3BlcmF0aW9uMSwgY2xhc3MgX09wZXJhdGlvbjI+CisgICAgY2xhc3MgdW5hcnlfY29tcG9zZQorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9PcGVyYXRpb24yOjphcmd1bWVudF90eXBlLAorCQkJICAgIHR5cGVuYW1lIF9PcGVyYXRpb24xOjpyZXN1bHRfdHlwZT4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX09wZXJhdGlvbjEgX01fZm4xOworICAgICAgX09wZXJhdGlvbjIgX01fZm4yOworCisgICAgcHVibGljOgorICAgICAgdW5hcnlfY29tcG9zZShjb25zdCBfT3BlcmF0aW9uMSYgX194LCBjb25zdCBfT3BlcmF0aW9uMiYgX195KQorICAgICAgOiBfTV9mbjEoX194KSwgX01fZm4yKF9feSkge30KKworICAgICAgdHlwZW5hbWUgX09wZXJhdGlvbjE6OnJlc3VsdF90eXBlCisgICAgICBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIF9PcGVyYXRpb24yOjphcmd1bWVudF90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9mbjEoX01fZm4yKF9feCkpOyB9CisgICAgfTsKKworICAvLy8gQW4gXGxpbmsgU0dJZXh0ZW5zaW9ucyBTR0kgZXh0ZW5zaW9uIFxlbmRsaW5rLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbjEsIGNsYXNzIF9PcGVyYXRpb24yPgorICAgIGlubGluZSB1bmFyeV9jb21wb3NlPF9PcGVyYXRpb24xLCBfT3BlcmF0aW9uMj4KKyAgICBjb21wb3NlMShjb25zdCBfT3BlcmF0aW9uMSYgX19mbjEsIGNvbnN0IF9PcGVyYXRpb24yJiBfX2ZuMikKKyAgICB7IHJldHVybiB1bmFyeV9jb21wb3NlPF9PcGVyYXRpb24xLF9PcGVyYXRpb24yPihfX2ZuMSwgX19mbjIpOyB9CisKKyAgLy8vIEFuIFxsaW5rIFNHSWV4dGVuc2lvbnMgU0dJIGV4dGVuc2lvbiBcZW5kbGluay4KKyAgdGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24xLCBjbGFzcyBfT3BlcmF0aW9uMiwgY2xhc3MgX09wZXJhdGlvbjM+CisgICAgY2xhc3MgYmluYXJ5X2NvbXBvc2UKKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfT3BlcmF0aW9uMjo6YXJndW1lbnRfdHlwZSwKKwkJCSAgICB0eXBlbmFtZSBfT3BlcmF0aW9uMTo6cmVzdWx0X3R5cGU+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIF9PcGVyYXRpb24xIF9NX2ZuMTsKKyAgICAgIF9PcGVyYXRpb24yIF9NX2ZuMjsKKyAgICAgIF9PcGVyYXRpb24zIF9NX2ZuMzsKKyAgICAgIAorICAgIHB1YmxpYzoKKyAgICAgIGJpbmFyeV9jb21wb3NlKGNvbnN0IF9PcGVyYXRpb24xJiBfX3gsIGNvbnN0IF9PcGVyYXRpb24yJiBfX3ksCisJCSAgICAgY29uc3QgX09wZXJhdGlvbjMmIF9feikKKyAgICAgIDogX01fZm4xKF9feCksIF9NX2ZuMihfX3kpLCBfTV9mbjMoX196KSB7IH0KKworICAgICAgdHlwZW5hbWUgX09wZXJhdGlvbjE6OnJlc3VsdF90eXBlCisgICAgICBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIF9PcGVyYXRpb24yOjphcmd1bWVudF90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9mbjEoX01fZm4yKF9feCksIF9NX2ZuMyhfX3gpKTsgfQorICAgIH07CisKKyAgLy8vIEFuIFxsaW5rIFNHSWV4dGVuc2lvbnMgU0dJIGV4dGVuc2lvbiBcZW5kbGluay4KKyAgdGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24xLCBjbGFzcyBfT3BlcmF0aW9uMiwgY2xhc3MgX09wZXJhdGlvbjM+CisgICAgaW5saW5lIGJpbmFyeV9jb21wb3NlPF9PcGVyYXRpb24xLCBfT3BlcmF0aW9uMiwgX09wZXJhdGlvbjM+CisgICAgY29tcG9zZTIoY29uc3QgX09wZXJhdGlvbjEmIF9fZm4xLCBjb25zdCBfT3BlcmF0aW9uMiYgX19mbjIsCisJICAgICBjb25zdCBfT3BlcmF0aW9uMyYgX19mbjMpCisgICAgeyByZXR1cm4gYmluYXJ5X2NvbXBvc2U8X09wZXJhdGlvbjEsIF9PcGVyYXRpb24yLCBfT3BlcmF0aW9uMz4KKwkoX19mbjEsIF9fZm4yLCBfX2ZuMyk7IH0KKyAgLyoqIEB9ICAqLworCisgIC8qKiBBcyBhbiBleHRlbnNpb24sIFNHSSBwcm92aWRlZCBhIGZ1bmN0b3IgY2FsbGVkIEBjIGlkZW50aXR5LiAgV2hlbiBhCisgICAqICBmdW5jdG9yIGlzIHJlcXVpcmVkIGJ1dCBubyBvcGVyYXRpb25zIGFyZSBkZXNpcmVkLCB0aGlzIGNhbiBiZSB1c2VkIGFzIGEKKyAgICogIHBhc3MtdGhyb3VnaC4gIEl0cyBAYyBvcGVyYXRvcigpIHJldHVybnMgaXRzIGFyZ3VtZW50IHVuY2hhbmdlZC4KKyAgICoKKyAgICogIEBhZGR0b2dyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICovCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgc3RydWN0IGlkZW50aXR5CisgICAgOiBwdWJsaWMgc3RkOjpfSWRlbnRpdHk8X1RwPiB7fTsKKworICAvKiogQGMgc2VsZWN0MXN0IGFuZCBAYyBzZWxlY3QybmQgYXJlIGV4dGVuc2lvbnMgcHJvdmlkZWQgYnkgU0dJLiAgVGhlaXIKKyAgICogIEBjIG9wZXJhdG9yKClzCisgICAqICB0YWtlIGEgQGMgc3RkOjpwYWlyIGFzIGFuIGFyZ3VtZW50LCBhbmQgcmV0dXJuIGVpdGhlciB0aGUgZmlyc3QgbWVtYmVyCisgICAqICBvciB0aGUgc2Vjb25kIG1lbWJlciwgcmVzcGVjdGl2ZWx5LiAgVGhleSBjYW4gYmUgdXNlZCAoZXNwZWNpYWxseSB3aXRoCisgICAqICB0aGUgY29tcG9zaXRpb24gZnVuY3RvcnMpIHRvIEBhIHN0cmlwIGRhdGEgZnJvbSBhIHNlcXVlbmNlIGJlZm9yZQorICAgKiAgcGVyZm9ybWluZyB0aGUgcmVtYWluZGVyIG9mIGFuIGFsZ29yaXRobS4KKyAgICoKKyAgICogIEBhZGR0b2dyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEB7CisgICAqLworICAvLy8gQW4gXGxpbmsgU0dJZXh0ZW5zaW9ucyBTR0kgZXh0ZW5zaW9uIFxlbmRsaW5rLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1BhaXI+CisgICAgc3RydWN0IHNlbGVjdDFzdAorICAgIDogcHVibGljIHN0ZDo6X1NlbGVjdDFzdDxfUGFpcj4ge307CisKKyAgLy8vIEFuIFxsaW5rIFNHSWV4dGVuc2lvbnMgU0dJIGV4dGVuc2lvbiBcZW5kbGluay4KKyAgdGVtcGxhdGUgPGNsYXNzIF9QYWlyPgorICAgIHN0cnVjdCBzZWxlY3QybmQKKyAgICA6IHB1YmxpYyBzdGQ6Ol9TZWxlY3QybmQ8X1BhaXI+IHt9OworCisgIC8qKiBAfSAgKi8KKworICAvLyBleHRlbnNpb24gZG9jdW1lbnRlZCBuZXh0CisgIHRlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzI+CisgICAgc3RydWN0IF9Qcm9qZWN0MXN0IDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfQXJnMSwgX0FyZzIsIF9BcmcxPgorICAgIHsKKyAgICAgIF9BcmcxCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9BcmcxJiBfX3gsIGNvbnN0IF9BcmcyJikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feDsgfQorICAgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4KKyAgICBzdHJ1Y3QgX1Byb2plY3QybmQgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9BcmcxLCBfQXJnMiwgX0FyZzI+CisgICAgeworICAgICAgX0FyZzIKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0FyZzEmLCBjb25zdCBfQXJnMiYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX195OyB9CisgICAgfTsKKworICAvKiogVGhlIEBjIG9wZXJhdG9yKCkgb2YgdGhlIEBjIHByb2plY3Qxc3QgZnVuY3RvciB0YWtlcyB0d28gYXJiaXRyYXJ5CisgICAqICBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlIGZpcnN0IG9uZSwgd2hpbGUgQGMgcHJvamVjdDJuZCByZXR1cm5zIHRoZQorICAgKiAgc2Vjb25kIG9uZS4gIFRoZXkgYXJlIGV4dGVuc2lvbnMgcHJvdmlkZWQgYnkgU0dJLgorICAgKgorICAgKiAgQGFkZHRvZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQHsKKyAgICovCisKKyAgLy8vIEFuIFxsaW5rIFNHSWV4dGVuc2lvbnMgU0dJIGV4dGVuc2lvbiBcZW5kbGluay4KKyAgdGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4KKyAgICBzdHJ1Y3QgcHJvamVjdDFzdCA6IHB1YmxpYyBfUHJvamVjdDFzdDxfQXJnMSwgX0FyZzI+IHt9OworCisgIC8vLyBBbiBcbGluayBTR0lleHRlbnNpb25zIFNHSSBleHRlbnNpb24gXGVuZGxpbmsuCisgIHRlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzI+CisgICAgc3RydWN0IHByb2plY3QybmQgOiBwdWJsaWMgX1Byb2plY3QybmQ8X0FyZzEsIF9BcmcyPiB7fTsKKyAgLyoqIEB9ICAqLworCisgIC8vIGV4dGVuc2lvbiBkb2N1bWVudGVkIG5leHQKKyAgdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQ+CisgICAgc3RydWN0IF9Db25zdGFudF92b2lkX2Z1bgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1Jlc3VsdCByZXN1bHRfdHlwZTsKKyAgICAgIHJlc3VsdF90eXBlIF9NX3ZhbDsKKworICAgICAgX0NvbnN0YW50X3ZvaWRfZnVuKGNvbnN0IHJlc3VsdF90eXBlJiBfX3YpIDogX01fdmFsKF9fdikge30KKworICAgICAgY29uc3QgcmVzdWx0X3R5cGUmCisgICAgICBvcGVyYXRvcigpKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3ZhbDsgfQorICAgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9Bcmd1bWVudD4KKyAgICBzdHJ1Y3QgX0NvbnN0YW50X3VuYXJ5X2Z1bgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0FyZ3VtZW50IGFyZ3VtZW50X3R5cGU7CisgICAgICB0eXBlZGVmICBfUmVzdWx0ICByZXN1bHRfdHlwZTsKKyAgICAgIHJlc3VsdF90eXBlIF9NX3ZhbDsKKyAgICAgIAorICAgICAgX0NvbnN0YW50X3VuYXJ5X2Z1bihjb25zdCByZXN1bHRfdHlwZSYgX192KSA6IF9NX3ZhbChfX3YpIHt9CisKKyAgICAgIGNvbnN0IHJlc3VsdF90eXBlJgorICAgICAgb3BlcmF0b3IoKShjb25zdCBfQXJndW1lbnQmKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdmFsOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyPgorICAgIHN0cnVjdCBfQ29uc3RhbnRfYmluYXJ5X2Z1bgorICAgIHsKKyAgICAgIHR5cGVkZWYgIF9BcmcxICAgZmlyc3RfYXJndW1lbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgIF9BcmcyICAgc2Vjb25kX2FyZ3VtZW50X3R5cGU7CisgICAgICB0eXBlZGVmICBfUmVzdWx0IHJlc3VsdF90eXBlOworICAgICAgX1Jlc3VsdCBfTV92YWw7CisKKyAgICAgIF9Db25zdGFudF9iaW5hcnlfZnVuKGNvbnN0IF9SZXN1bHQmIF9fdikgOiBfTV92YWwoX192KSB7fQorICAgICAgCisgICAgICBjb25zdCByZXN1bHRfdHlwZSYKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0FyZzEmLCBjb25zdCBfQXJnMiYpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV92YWw7IH0KKyAgICB9OworCisgIC8qKiBUaGVzZSB0aHJlZSBmdW5jdG9ycyBhcmUgZWFjaCBjb25zdHJ1Y3RlZCBmcm9tIGEgc2luZ2xlIGFyYml0cmFyeQorICAgKiAgdmFyaWFibGUvdmFsdWUuICBMYXRlciwgdGhlaXIgQGMgb3BlcmF0b3IoKXMgY29tcGxldGVseSBpZ25vcmUgYW55CisgICAqICBhcmd1bWVudHMgcGFzc2VkLCBhbmQgcmV0dXJuIHRoZSBzdG9yZWQgdmFsdWUuCisgICAqICAtIEBjIGNvbnN0YW50X3ZvaWRfZnVuJ3MgQGMgb3BlcmF0b3IoKSB0YWtlcyBubyBhcmd1bWVudHMKKyAgICogIC0gQGMgY29uc3RhbnRfdW5hcnlfZnVuJ3MgQGMgb3BlcmF0b3IoKSB0YWtlcyBvbmUgYXJndW1lbnQgKGlnbm9yZWQpCisgICAqICAtIEBjIGNvbnN0YW50X2JpbmFyeV9mdW4ncyBAYyBvcGVyYXRvcigpIHRha2VzIHR3byBhcmd1bWVudHMgKGlnbm9yZWQpCisgICAqCisgICAqICBUaGUgaGVscGVyIGNyZWF0b3IgZnVuY3Rpb25zIEBjIGNvbnN0YW50MCwgQGMgY29uc3RhbnQxLCBhbmQKKyAgICogIEBjIGNvbnN0YW50MiBlYWNoIHRha2UgYSBAYSByZXN1bHQgYXJndW1lbnQgYW5kIGNvbnN0cnVjdCB2YXJpYWJsZXMgb2YKKyAgICogIHRoZSBhcHByb3ByaWF0ZSBmdW5jdG9yIHR5cGUuCisgICAqCisgICAqICBAYWRkdG9ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAeworICAgKi8KKyAgLy8vIEFuIFxsaW5rIFNHSWV4dGVuc2lvbnMgU0dJIGV4dGVuc2lvbiBcZW5kbGluay4KKyAgdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQ+CisgICAgc3RydWN0IGNvbnN0YW50X3ZvaWRfZnVuCisgICAgOiBwdWJsaWMgX0NvbnN0YW50X3ZvaWRfZnVuPF9SZXN1bHQ+CisgICAgeworICAgICAgY29uc3RhbnRfdm9pZF9mdW4oY29uc3QgX1Jlc3VsdCYgX192KQorICAgICAgOiBfQ29uc3RhbnRfdm9pZF9mdW48X1Jlc3VsdD4oX192KSB7fQorICAgIH07CisKKyAgLy8vIEFuIFxsaW5rIFNHSWV4dGVuc2lvbnMgU0dJIGV4dGVuc2lvbiBcZW5kbGluay4KKyAgdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9Bcmd1bWVudCA9IF9SZXN1bHQ+CisgICAgc3RydWN0IGNvbnN0YW50X3VuYXJ5X2Z1biA6IHB1YmxpYyBfQ29uc3RhbnRfdW5hcnlfZnVuPF9SZXN1bHQsIF9Bcmd1bWVudD4KKyAgICB7CisgICAgICBjb25zdGFudF91bmFyeV9mdW4oY29uc3QgX1Jlc3VsdCYgX192KQorICAgICAgOiBfQ29uc3RhbnRfdW5hcnlfZnVuPF9SZXN1bHQsIF9Bcmd1bWVudD4oX192KSB7fQorICAgIH07CisKKyAgLy8vIEFuIFxsaW5rIFNHSWV4dGVuc2lvbnMgU0dJIGV4dGVuc2lvbiBcZW5kbGluay4KKyAgdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9BcmcxID0gX1Jlc3VsdCwgY2xhc3MgX0FyZzIgPSBfQXJnMT4KKyAgICBzdHJ1Y3QgY29uc3RhbnRfYmluYXJ5X2Z1bgorICAgIDogcHVibGljIF9Db25zdGFudF9iaW5hcnlfZnVuPF9SZXN1bHQsIF9BcmcxLCBfQXJnMj4KKyAgICB7CisgICAgICBjb25zdGFudF9iaW5hcnlfZnVuKGNvbnN0IF9SZXN1bHQmIF9fdikKKyAgICAgIDogX0NvbnN0YW50X2JpbmFyeV9mdW48X1Jlc3VsdCwgX0FyZzEsIF9BcmcyPihfX3YpIHt9CisgICAgfTsKKworICAvLy8gQW4gXGxpbmsgU0dJZXh0ZW5zaW9ucyBTR0kgZXh0ZW5zaW9uIFxlbmRsaW5rLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdD4KKyAgICBpbmxpbmUgY29uc3RhbnRfdm9pZF9mdW48X1Jlc3VsdD4KKyAgICBjb25zdGFudDAoY29uc3QgX1Jlc3VsdCYgX192YWwpCisgICAgeyByZXR1cm4gY29uc3RhbnRfdm9pZF9mdW48X1Jlc3VsdD4oX192YWwpOyB9CisKKyAgLy8vIEFuIFxsaW5rIFNHSWV4dGVuc2lvbnMgU0dJIGV4dGVuc2lvbiBcZW5kbGluay4KKyAgdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQ+CisgICAgaW5saW5lIGNvbnN0YW50X3VuYXJ5X2Z1bjxfUmVzdWx0LCBfUmVzdWx0PgorICAgIGNvbnN0YW50MShjb25zdCBfUmVzdWx0JiBfX3ZhbCkKKyAgICB7IHJldHVybiBjb25zdGFudF91bmFyeV9mdW48X1Jlc3VsdCwgX1Jlc3VsdD4oX192YWwpOyB9CisKKyAgLy8vIEFuIFxsaW5rIFNHSWV4dGVuc2lvbnMgU0dJIGV4dGVuc2lvbiBcZW5kbGluay4KKyAgdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQ+CisgICAgaW5saW5lIGNvbnN0YW50X2JpbmFyeV9mdW48X1Jlc3VsdCxfUmVzdWx0LF9SZXN1bHQ+CisgICAgY29uc3RhbnQyKGNvbnN0IF9SZXN1bHQmIF9fdmFsKQorICAgIHsgcmV0dXJuIGNvbnN0YW50X2JpbmFyeV9mdW48X1Jlc3VsdCwgX1Jlc3VsdCwgX1Jlc3VsdD4oX192YWwpOyB9CisgIC8qKiBAfSAgKi8KKworICAvKiogVGhlIEBjIHN1YnRyYWN0aXZlX3JuZyBjbGFzcyBpcyBkb2N1bWVudGVkIG9uCisgICAqICA8YSBocmVmPSJodHRwOi8vd3d3LnNnaS5jb20vdGVjaC9zdGwvIj5TR0kncyBzaXRlPC9hPi4KKyAgICogIE5vdGUgdGhhdCB0aGlzIGNvZGUgYXNzdW1lcyB0aGF0IEBjIGludCBpcyAzMiBiaXRzLgorICAgKgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKi8KKyAgY2xhc3Mgc3VidHJhY3RpdmVfcm5nCisgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50PgorICB7CisgIHByaXZhdGU6CisgICAgdW5zaWduZWQgaW50IF9NX3RhYmxlWzU1XTsKKyAgICBzaXplX3QgX01faW5kZXgxOworICAgIHNpemVfdCBfTV9pbmRleDI7CisKKyAgcHVibGljOgorICAgIC8vLyBSZXR1cm5zIGEgbnVtYmVyIGxlc3MgdGhhbiB0aGUgYXJndW1lbnQuCisgICAgdW5zaWduZWQgaW50CisgICAgb3BlcmF0b3IoKSh1bnNpZ25lZCBpbnQgX19saW1pdCkKKyAgICB7CisgICAgICBfTV9pbmRleDEgPSAoX01faW5kZXgxICsgMSkgJSA1NTsKKyAgICAgIF9NX2luZGV4MiA9IChfTV9pbmRleDIgKyAxKSAlIDU1OworICAgICAgX01fdGFibGVbX01faW5kZXgxXSA9IF9NX3RhYmxlW19NX2luZGV4MV0gLSBfTV90YWJsZVtfTV9pbmRleDJdOworICAgICAgcmV0dXJuIF9NX3RhYmxlW19NX2luZGV4MV0gJSBfX2xpbWl0OworICAgIH0KKworICAgIHZvaWQKKyAgICBfTV9pbml0aWFsaXplKHVuc2lnbmVkIGludCBfX3NlZWQpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IF9fayA9IDE7CisgICAgICBfTV90YWJsZVs1NF0gPSBfX3NlZWQ7CisgICAgICBzaXplX3QgX19pOworICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCA1NDsgX19pKyspCisJeworCSAgc2l6ZV90IF9faWkgPSAoMjEgKiAoX19pICsgMSkgJSA1NSkgLSAxOworCSAgX01fdGFibGVbX19paV0gPSBfX2s7CisJICBfX2sgPSBfX3NlZWQgLSBfX2s7CisJICBfX3NlZWQgPSBfTV90YWJsZVtfX2lpXTsKKwl9CisgICAgICBmb3IgKGludCBfX2xvb3AgPSAwOyBfX2xvb3AgPCA0OyBfX2xvb3ArKykKKwl7CisJICBmb3IgKF9faSA9IDA7IF9faSA8IDU1OyBfX2krKykKKyAgICAgICAgICAgIF9NX3RhYmxlW19faV0gPSBfTV90YWJsZVtfX2ldIC0gX01fdGFibGVbKDEgKyBfX2kgKyAzMCkgJSA1NV07CisJfQorICAgICAgX01faW5kZXgxID0gMDsKKyAgICAgIF9NX2luZGV4MiA9IDMxOworICAgIH0KKworICAgIC8vLyBDdG9yIGFsbG93aW5nIHlvdSB0byBpbml0aWFsaXplIHRoZSBzZWVkLgorICAgIHN1YnRyYWN0aXZlX3JuZyh1bnNpZ25lZCBpbnQgX19zZWVkKQorICAgIHsgX01faW5pdGlhbGl6ZShfX3NlZWQpOyB9CisKKyAgICAvLy8gRGVmYXVsdCBjdG9yOyBpbml0aWFsaXplcyBpdHMgc3RhdGUgd2l0aCBzb21lIG51bWJlciB5b3UgZG9uJ3Qgc2VlLgorICAgIHN1YnRyYWN0aXZlX3JuZygpCisgICAgeyBfTV9pbml0aWFsaXplKDE2MTgwMzM5OHUpOyB9CisgIH07CisKKyAgLy8gTWVtX2Z1biBhZGFwdG9yIGhlbHBlciBmdW5jdGlvbnMgbWVtX2Z1bjEgYW5kIG1lbV9mdW4xX3JlZiwKKyAgLy8gcHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZXkgYXJlIG5vIGxvbmdlciBwYXJ0IG9mCisgIC8vIHRoZSBDKysgc3RhbmRhcmQuCisgIAorICB0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorICAgIGlubGluZSBtZW1fZnVuMV90PF9SZXQsIF9UcCwgX0FyZz4KKyAgICBtZW1fZnVuMShfUmV0IChfVHA6OipfX2YpKF9BcmcpKQorICAgIHsgcmV0dXJuIG1lbV9mdW4xX3Q8X1JldCwgX1RwLCBfQXJnPihfX2YpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KKyAgICBpbmxpbmUgY29uc3RfbWVtX2Z1bjFfdDxfUmV0LCBfVHAsIF9Bcmc+CisgICAgbWVtX2Z1bjEoX1JldCAoX1RwOjoqX19mKShfQXJnKSBjb25zdCkKKyAgICB7IHJldHVybiBjb25zdF9tZW1fZnVuMV90PF9SZXQsIF9UcCwgX0FyZz4oX19mKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CisgICAgaW5saW5lIG1lbV9mdW4xX3JlZl90PF9SZXQsIF9UcCwgX0FyZz4KKyAgICBtZW1fZnVuMV9yZWYoX1JldCAoX1RwOjoqX19mKShfQXJnKSkKKyAgICB7IHJldHVybiBtZW1fZnVuMV9yZWZfdDxfUmV0LCBfVHAsIF9Bcmc+KF9fZik7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorICAgIGlubGluZSBjb25zdF9tZW1fZnVuMV9yZWZfdDxfUmV0LCBfVHAsIF9Bcmc+CisgICAgbWVtX2Z1bjFfcmVmKF9SZXQgKF9UcDo6Kl9fZikoX0FyZykgY29uc3QpCisgICAgeyByZXR1cm4gY29uc3RfbWVtX2Z1bjFfcmVmX3Q8X1JldCwgX1RwLCBfQXJnPihfX2YpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2hhc2hfbWFwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvaGFzaF9tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyODcxYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2hhc2hfbWFwCkBAIC0wLDAgKzEsNTk5IEBACisvLyBIYXNoaW5nIG1hcCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKi8KKworLyoqIEBmaWxlIGJhY2t3YXJkL2hhc2hfbWFwCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkgKHBvc3NpYmx5CisgKiAgY29udGFpbmluZyBleHRlbnNpb25zIGZyb20gdGhlIEhQL1NHSSBTVEwgc3Vic2V0KS4KKyAqLworCisjaWZuZGVmIF9CQUNLV0FSRF9IQVNIX01BUAorI2RlZmluZSBfQkFDS1dBUkRfSEFTSF9NQVAgMQorCisjaWZuZGVmIF9HTElCQ1hYX1BFUk1JVF9CQUNLV0FSRF9IQVNICisjaW5jbHVkZSAiYmFja3dhcmRfd2FybmluZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJhY2t3YXJkL2hhc2h0YWJsZS5oPgorI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgc3RkOjplcXVhbF90bzsKKyAgdXNpbmcgc3RkOjphbGxvY2F0b3I7CisgIHVzaW5nIHN0ZDo6cGFpcjsKKyAgdXNpbmcgc3RkOjpfU2VsZWN0MXN0OworCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiA9IGhhc2g8X0tleT4sCisJICAgY2xhc3MgX0VxdWFsS2V5ID0gZXF1YWxfdG88X0tleT4sIGNsYXNzIF9BbGxvYyA9IGFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyBoYXNoX21hcAorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBoYXNodGFibGU8cGFpcjxjb25zdCBfS2V5LCBfVHA+LF9LZXksIF9IYXNoRm4sCisJCQlfU2VsZWN0MXN0PHBhaXI8Y29uc3QgX0tleSwgX1RwPiA+LAorCQkJX0VxdWFsS2V5LCBfQWxsb2M+IF9IdDsKKworICAgICAgX0h0IF9NX2h0OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV90eXBlIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfVHAgZGF0YV90eXBlOworICAgICAgdHlwZWRlZiBfVHAgbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Omhhc2hlciBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpwb2ludGVyIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgICAgICAKKyAgICAgIGhhc2hlcgorICAgICAgaGFzaF9mdW5jdCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5oYXNoX2Z1bmN0KCk7IH0KKworICAgICAga2V5X2VxdWFsCisgICAgICBrZXlfZXEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQua2V5X2VxKCk7IH0KKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZ2V0X2FsbG9jYXRvcigpOyB9CisKKyAgICAgIGhhc2hfbWFwKCkKKyAgICAgIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisgIAorICAgICAgZXhwbGljaXQKKyAgICAgIGhhc2hfbWFwKHNpemVfdHlwZSBfX24pCisgICAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorCisgICAgICBoYXNoX21hcChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYpCisgICAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisKKyAgICAgIGhhc2hfbWFwKHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKwkgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkge30KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorCTogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uKQorCTogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorCQkgY29uc3QgaGFzaGVyJiBfX2hmKQorCTogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisJCSBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuc2l6ZSgpOyB9CisgICAgICAKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQubWF4X3NpemUoKTsgfQorICAgICAgCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lbXB0eSgpOyB9CisgIAorICAgICAgdm9pZAorICAgICAgc3dhcChoYXNoX21hcCYgX19ocykKKyAgICAgIHsgX01faHQuc3dhcChfX2hzLl9NX2h0KTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSzEsIGNsYXNzIF9UMSwgY2xhc3MgX0hGLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWw+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0gKGNvbnN0IGhhc2hfbWFwPF9LMSwgX1QxLCBfSEYsIF9FcUssIF9BbD4mLAorCQkgICAgY29uc3QgaGFzaF9tYXA8X0sxLCBfVDEsIF9IRiwgX0VxSywgX0FsPiYpOworCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKQorICAgICAgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF91bmlxdWUoX19vYmopOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0X25vcmVzaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeyByZXR1cm4gX01faHQuaW5zZXJ0X3VuaXF1ZV9ub3Jlc2l6ZShfX29iaik7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKworICAgICAgX1RwJgorICAgICAgb3BlcmF0b3JbXShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7IHJldHVybiBfTV9odC5maW5kX29yX2luc2VydCh2YWx1ZV90eXBlKF9fa2V5LCBfVHAoKSkpLnNlY29uZDsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmNvdW50KF9fa2V5KTsgfQorCisgICAgICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorCisgICAgICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHtyZXR1cm4gX01faHQuZXJhc2UoX19rZXkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9faXQpCisgICAgICB7IF9NX2h0LmVyYXNlKF9faXQpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZiwgaXRlcmF0b3IgX19sKQorICAgICAgeyBfTV9odC5lcmFzZShfX2YsIF9fbCk7IH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKQorICAgICAgeyBfTV9odC5jbGVhcigpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19oaW50KQorICAgICAgeyBfTV9odC5yZXNpemUoX19oaW50KTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5idWNrZXRfY291bnQoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9idWNrZXRfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQubWF4X2J1Y2tldF9jb3VudCgpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZWxlbXNfaW5fYnVja2V0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lbGVtc19pbl9idWNrZXQoX19uKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuLCBjbGFzcyBfRXFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxbEtleSwgX0FsbG9jPiYgX19obTEsCisJICAgICAgIGNvbnN0IGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxbEtleSwgX0FsbG9jPiYgX19obTIpCisgICAgeyByZXR1cm4gX19obTEuX01faHQgPT0gX19obTIuX01faHQ7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRm4sIGNsYXNzIF9FcWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgaGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFsS2V5LCBfQWxsb2M+JiBfX2htMSwKKwkgICAgICAgY29uc3QgaGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFsS2V5LCBfQWxsb2M+JiBfX2htMikKKyAgICB7IHJldHVybiAhKF9faG0xID09IF9faG0yKTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgY2xhc3MgX0VxbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcWxLZXksIF9BbGxvYz4mIF9faG0xLAorCSBoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcWxLZXksIF9BbGxvYz4mIF9faG0yKQorICAgIHsgX19obTEuc3dhcChfX2htMik7IH0KKworCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwKKwkgICBjbGFzcyBfSGFzaEZuID0gaGFzaDxfS2V5PiwKKwkgICBjbGFzcyBfRXF1YWxLZXkgPSBlcXVhbF90bzxfS2V5PiwKKwkgICBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8X1RwPiA+CisgICAgY2xhc3MgaGFzaF9tdWx0aW1hcAorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX0tleSwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9UcCwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMyhfSGFzaEZuLCBzaXplX3QsIF9LZXksIF9VbmFyeUZ1bmN0aW9uQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczMoX0VxdWFsS2V5LCBfS2V5LCBfS2V5LCBfQmluYXJ5UHJlZGljYXRlQ29uY2VwdCkKKwkKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBoYXNodGFibGU8cGFpcjxjb25zdCBfS2V5LCBfVHA+LCBfS2V5LCBfSGFzaEZuLAorCQkJX1NlbGVjdDFzdDxwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiwgX0VxdWFsS2V5LCBfQWxsb2M+CisgICAgICAgICAgX0h0OworCisgICAgICBfSHQgX01faHQ7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X3R5cGUga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCBkYXRhX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCBtYXBwZWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aGFzaGVyIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfZXF1YWwga2V5X2VxdWFsOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnBvaW50ZXIgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIAorICAgICAgaGFzaGVyCisgICAgICBoYXNoX2Z1bmN0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmhhc2hfZnVuY3QoKTsgfQorCisgICAgICBrZXlfZXF1YWwKKyAgICAgIGtleV9lcSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5rZXlfZXEoKTsgfQorCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5nZXRfYWxsb2NhdG9yKCk7IH0KKworICAgICAgaGFzaF9tdWx0aW1hcCgpCisgICAgICA6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorCisgICAgICBleHBsaWNpdAorICAgICAgaGFzaF9tdWx0aW1hcChzaXplX3R5cGUgX19uKQorICAgICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgaGFzaF9tdWx0aW1hcChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYpCisgICAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisKKyAgICAgIGhhc2hfbXVsdGltYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorCQkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkge30KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisJOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uKQorCTogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmKQorCTogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorCQkgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisJCSAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LnNpemUoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lm1heF9zaXplKCk7IH0KKworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZW1wdHkoKTsgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKGhhc2hfbXVsdGltYXAmIF9faHMpCisgICAgICB7IF9NX2h0LnN3YXAoX19ocy5fTV9odCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0sxLCBjbGFzcyBfVDEsIGNsYXNzIF9IRiwgY2xhc3MgX0VxSywgY2xhc3MgX0FsPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcj09KGNvbnN0IGhhc2hfbXVsdGltYXA8X0sxLCBfVDEsIF9IRiwgX0VxSywgX0FsPiYsCisJCSAgIGNvbnN0IGhhc2hfbXVsdGltYXA8X0sxLCBfVDEsIF9IRiwgX0VxSywgX0FsPiYpOworCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKQorICAgICAgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF9lcXVhbChfX29iaik7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorICAgICAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsX19sKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0X25vcmVzaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeyByZXR1cm4gX01faHQuaW5zZXJ0X2VxdWFsX25vcmVzaXplKF9fb2JqKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmNvdW50KF9fa2V5KTsgfQorCisgICAgICBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorCisgICAgICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVxdWFsX3JhbmdlKF9fa2V5KTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVyYXNlKF9fa2V5KTsgfQorCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2l0KQorICAgICAgeyBfTV9odC5lcmFzZShfX2l0KTsgfQorCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCkKKyAgICAgIHsgX01faHQuZXJhc2UoX19mLCBfX2wpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkKKyAgICAgIHsgX01faHQuY2xlYXIoKTsgfQorCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9faGludCkKKyAgICAgIHsgX01faHQucmVzaXplKF9faGludCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lm1heF9idWNrZXRfY291bnQoKTsgfQorICAgICAgCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVsZW1zX2luX2J1Y2tldChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZWxlbXNfaW5fYnVja2V0KF9fbik7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hGLCBjbGFzcyBfRXFLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgaGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IRiwgX0VxS2V5LCBfQWxsb2M+JiBfX2htMSwKKwkgICAgICAgY29uc3QgaGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IRiwgX0VxS2V5LCBfQWxsb2M+JiBfX2htMikKKyAgICB7IHJldHVybiBfX2htMS5fTV9odCA9PSBfX2htMi5fTV9odDsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hGLCBjbGFzcyBfRXFLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgaGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IRiwgX0VxS2V5LCBfQWxsb2M+JiBfX2htMSwKKwkgICAgICAgY29uc3QgaGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IRiwgX0VxS2V5LCBfQWxsb2M+JiBfX2htMikKKyAgICB7IHJldHVybiAhKF9faG0xID09IF9faG0yKTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgY2xhc3MgX0VxbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxbEtleSwgX0FsbG9jPiYgX19obTEsCisJIGhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFsS2V5LCBfQWxsb2M+JiBfX2htMikKKyAgICB7IF9faG0xLnN3YXAoX19obTIpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFNwZWNpYWxpemF0aW9uIG9mIGluc2VydF9pdGVyYXRvciBzbyB0aGF0IGl0IHdpbGwgd29yayBmb3IgaGFzaF9tYXAKKyAgLy8gYW5kIGhhc2hfbXVsdGltYXAuCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgorICAgIGNsYXNzIGluc2VydF9pdGVyYXRvcjxfX2dudV9jeHg6Omhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgCisJCQkJCSAgICAgIF9FcUtleSwgX0FsbG9jPiA+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcUtleSwgX0FsbG9jPgorICAgICAgICBfQ29udGFpbmVyOworICAgICAgX0NvbnRhaW5lciogY29udGFpbmVyOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworICAgICAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgCisgICAgICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194KQorICAgICAgOiBjb250YWluZXIoJl9feCkge30KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IpCisgICAgICA6IGNvbnRhaW5lcigmX194KSB7fQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWx1ZSkKKyAgICAgIHsKKwljb250YWluZXItPmluc2VydChfX3ZhbHVlKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKigpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuLCAgY2xhc3MgX0VxS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3MgaW5zZXJ0X2l0ZXJhdG9yPF9fZ251X2N4eDo6aGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRm4sCisJCQkJCQkgICBfRXFLZXksIF9BbGxvYz4gPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6aGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcUtleSwgX0FsbG9jPgorICAgICAgICBfQ29udGFpbmVyOworICAgICAgX0NvbnRhaW5lciogY29udGFpbmVyOworICAgICAgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgaXRlcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkKKyAgICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gsIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yKQorICAgICAgOiBjb250YWluZXIoJl9feCkge30KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsdWUpCisgICAgICB7CisJY29udGFpbmVyLT5pbnNlcnQoX192YWx1ZSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvciooKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2hhc2hfc2V0IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvaGFzaF9zZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM4ZTg0NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2hhc2hfc2V0CkBAIC0wLDAgKzEsNTY3IEBACisvLyBIYXNoaW5nIHNldCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKi8KKworLyoqIEBmaWxlIGJhY2t3YXJkL2hhc2hfc2V0CisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkgKHBvc3NpYmx5CisgKiAgY29udGFpbmluZyBleHRlbnNpb25zIGZyb20gdGhlIEhQL1NHSSBTVEwgc3Vic2V0KS4KKyAqLworCisjaWZuZGVmIF9CQUNLV0FSRF9IQVNIX1NFVAorI2RlZmluZSBfQkFDS1dBUkRfSEFTSF9TRVQgMQorCisjaWZuZGVmIF9HTElCQ1hYX1BFUk1JVF9CQUNLV0FSRF9IQVNICisjaW5jbHVkZSAiYmFja3dhcmRfd2FybmluZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJhY2t3YXJkL2hhc2h0YWJsZS5oPgorI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgc3RkOjplcXVhbF90bzsKKyAgdXNpbmcgc3RkOjphbGxvY2F0b3I7CisgIHVzaW5nIHN0ZDo6cGFpcjsKKyAgdXNpbmcgc3RkOjpfSWRlbnRpdHk7CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAZG9jdG9kbworICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiAgPSBoYXNoPF9WYWx1ZT4sCisJICAgY2xhc3MgX0VxdWFsS2V5ID0gZXF1YWxfdG88X1ZhbHVlPiwKKwkgICBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8X1ZhbHVlPiA+CisgICAgY2xhc3MgaGFzaF9zZXQKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9WYWx1ZSwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMyhfSGFzaEZjbiwgc2l6ZV90LCBfVmFsdWUsIF9VbmFyeUZ1bmN0aW9uQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczMoX0VxdWFsS2V5LCBfVmFsdWUsIF9WYWx1ZSwgX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQpCisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBoYXNodGFibGU8X1ZhbHVlLCBfVmFsdWUsIF9IYXNoRmNuLCBfSWRlbnRpdHk8X1ZhbHVlPiwKKwkJCV9FcXVhbEtleSwgX0FsbG9jPiBfSHQ7CisgICAgICBfSHQgX01faHQ7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X3R5cGUga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Omhhc2hlciBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpwb2ludGVyIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgICAgICAKKyAgICAgIGhhc2hlcgorICAgICAgaGFzaF9mdW5jdCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5oYXNoX2Z1bmN0KCk7IH0KKworICAgICAga2V5X2VxdWFsCisgICAgICBrZXlfZXEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQua2V5X2VxKCk7IH0KKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZ2V0X2FsbG9jYXRvcigpOyB9CisKKyAgICAgIGhhc2hfc2V0KCkKKyAgICAgIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBoYXNoX3NldChzaXplX3R5cGUgX19uKQorICAgICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgaGFzaF9zZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorCisgICAgICBoYXNoX3NldChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisJICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpIHt9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX3NldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKwk6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX3NldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbikKKwk6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX3NldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKwkJIGNvbnN0IGhhc2hlciYgX19oZikKKwk6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorCQkgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LnNpemUoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lm1heF9zaXplKCk7IH0KKyAgICAgIAorICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZW1wdHkoKTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICBzd2FwKGhhc2hfc2V0JiBfX2hzKQorICAgICAgeyBfTV9odC5zd2FwKF9faHMuX01faHQpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9IRiwgY2xhc3MgX0VxSywgY2xhc3MgX0FsPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcj09KGNvbnN0IGhhc2hfc2V0PF9WYWwsIF9IRiwgX0VxSywgX0FsPiYsCisJCSAgIGNvbnN0IGhhc2hfc2V0PF9WYWwsIF9IRiwgX0VxSywgX0FsPiYpOworCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorICAgICAgCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7CisJcGFpcjx0eXBlbmFtZSBfSHQ6Oml0ZXJhdG9yLCBib29sPiBfX3AgPSBfTV9odC5pbnNlcnRfdW5pcXVlKF9fb2JqKTsKKwlyZXR1cm4gcGFpcjxpdGVyYXRvcixib29sPihfX3AuZmlyc3QsIF9fcC5zZWNvbmQpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydF9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKwlwYWlyPHR5cGVuYW1lIF9IdDo6aXRlcmF0b3IsIGJvb2w+IF9fcAorCSAgPSBfTV9odC5pbnNlcnRfdW5pcXVlX25vcmVzaXplKF9fb2JqKTsKKwlyZXR1cm4gcGFpcjxpdGVyYXRvciwgYm9vbD4oX19wLmZpcnN0LCBfX3Auc2Vjb25kKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5jb3VudChfX2tleSk7IH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7cmV0dXJuIF9NX2h0LmVyYXNlKF9fa2V5KTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2l0KQorICAgICAgeyBfTV9odC5lcmFzZShfX2l0KTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCkKKyAgICAgIHsgX01faHQuZXJhc2UoX19mLCBfX2wpOyB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkKKyAgICAgIHsgX01faHQuY2xlYXIoKTsgfQorCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9faGludCkKKyAgICAgIHsgX01faHQucmVzaXplKF9faGludCk7IH0KKyAgICAgIAorICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KKyAgICAgIAorICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lm1heF9idWNrZXRfY291bnQoKTsgfQorICAgICAgCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVsZW1zX2luX2J1Y2tldChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZWxlbXNfaW5fYnVja2V0KF9fbik7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBoYXNoX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4mIF9faHMxLAorCSAgICAgICBjb25zdCBoYXNoX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4mIF9faHMyKQorICAgIHsgcmV0dXJuIF9faHMxLl9NX2h0ID09IF9faHMyLl9NX2h0OyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGhhc2hfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczEsCisJICAgICAgIGNvbnN0IGhhc2hfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczIpCisgICAgeyByZXR1cm4gIShfX2hzMSA9PSBfX2hzMik7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGhhc2hfc2V0PF9WYWwsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4mIF9faHMxLAorCSBoYXNoX3NldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMikKKyAgICB7IF9faHMxLnN3YXAoX19oczIpOyB9CisKKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsCisJICAgY2xhc3MgX0hhc2hGY24gPSBoYXNoPF9WYWx1ZT4sCisJICAgY2xhc3MgX0VxdWFsS2V5ID0gZXF1YWxfdG88X1ZhbHVlPiwKKwkgICBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8X1ZhbHVlPiA+CisgICAgY2xhc3MgaGFzaF9tdWx0aXNldAorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1ZhbHVlLCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMzKF9IYXNoRmNuLCBzaXplX3QsIF9WYWx1ZSwgX1VuYXJ5RnVuY3Rpb25Db25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMyhfRXF1YWxLZXksIF9WYWx1ZSwgX1ZhbHVlLCBfQmluYXJ5UHJlZGljYXRlQ29uY2VwdCkKKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIGhhc2h0YWJsZTxfVmFsdWUsIF9WYWx1ZSwgX0hhc2hGY24sIF9JZGVudGl0eTxfVmFsdWU+LAorCQkJX0VxdWFsS2V5LCBfQWxsb2M+IF9IdDsKKyAgICAgIF9IdCBfTV9odDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfdHlwZSBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aGFzaGVyIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfZXF1YWwga2V5X2VxdWFsOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnBvaW50ZXIgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfaXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIAorICAgICAgaGFzaGVyCisgICAgICBoYXNoX2Z1bmN0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmhhc2hfZnVuY3QoKTsgfQorICAgICAgCisgICAgICBrZXlfZXF1YWwKKyAgICAgIGtleV9lcSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5rZXlfZXEoKTsgfQorICAgICAgCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5nZXRfYWxsb2NhdG9yKCk7IH0KKworICAgICAgaGFzaF9tdWx0aXNldCgpCisgICAgICA6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorCisgICAgICBleHBsaWNpdAorICAgICAgaGFzaF9tdWx0aXNldChzaXplX3R5cGUgX19uKQorICAgICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgaGFzaF9tdWx0aXNldChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYpCisgICAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisgICAgICAKKyAgICAgIGhhc2hfbXVsdGlzZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorCQkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkge30KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisJOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uKQorCTogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmKQorCTogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorCQkgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisJCSAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LnNpemUoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lm1heF9zaXplKCk7IH0KKworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZW1wdHkoKTsgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKGhhc2hfbXVsdGlzZXQmIGhzKQorICAgICAgeyBfTV9odC5zd2FwKGhzLl9NX2h0KTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfSEYsIGNsYXNzIF9FcUssIGNsYXNzIF9BbD4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I9PShjb25zdCBoYXNoX211bHRpc2V0PF9WYWwsIF9IRiwgX0VxSywgX0FsPiYsCisJCSAgIGNvbnN0IGhhc2hfbXVsdGlzZXQ8X1ZhbCwgX0hGLCBfRXFLLCBfQWw+Jik7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisgICAgICAKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF9lcXVhbChfX29iaik7IH0KKyAgCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZixfX2wpOyB9CisgIAorICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydF9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF9lcXVhbF9ub3Jlc2l6ZShfX29iaik7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5jb3VudChfX2tleSk7IH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7IHJldHVybiBfTV9odC5lcmFzZShfX2tleSk7IH0KKyAgCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2l0KQorICAgICAgeyBfTV9odC5lcmFzZShfX2l0KTsgfQorICAKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZiwgaXRlcmF0b3IgX19sKQorICAgICAgeyBfTV9odC5lcmFzZShfX2YsIF9fbCk7IH0KKyAgCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7IF9NX2h0LmNsZWFyKCk7IH0KKworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX2hpbnQpCisgICAgICB7IF9NX2h0LnJlc2l6ZShfX2hpbnQpOyB9CisgIAorICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lm1heF9idWNrZXRfY291bnQoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVsZW1zX2luX2J1Y2tldChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZWxlbXNfaW5fYnVja2V0KF9fbik7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgaGFzaF9tdWx0aXNldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMSwKKwkgICAgICAgY29uc3QgaGFzaF9tdWx0aXNldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMikKKyAgICB7IHJldHVybiBfX2hzMS5fTV9odCA9PSBfX2hzMi5fTV9odDsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgaGFzaF9tdWx0aXNldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMSwKKwkgICAgICAgY29uc3QgaGFzaF9tdWx0aXNldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMikKKyAgICB7IHJldHVybiAhKF9faHMxID09IF9faHMyKTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoaGFzaF9tdWx0aXNldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMSwKKwkgaGFzaF9tdWx0aXNldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMikKKyAgICB7IF9faHMxLnN3YXAoX19oczIpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFNwZWNpYWxpemF0aW9uIG9mIGluc2VydF9pdGVyYXRvciBzbyB0aGF0IGl0IHdpbGwgd29yayBmb3IgaGFzaF9zZXQKKyAgLy8gYW5kIGhhc2hfbXVsdGlzZXQuCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGNsYXNzIGluc2VydF9pdGVyYXRvcjxfX2dudV9jeHg6Omhhc2hfc2V0PF9WYWx1ZSwgX0hhc2hGY24sCisJCQkJCSAgICAgIF9FcXVhbEtleSwgX0FsbG9jPiA+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpoYXNoX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4KKyAgICAgICAgX0NvbnRhaW5lcjsKKyAgICAgIF9Db250YWluZXIqIGNvbnRhaW5lcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkKKyAgICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisgICAgICAKKyAgICAgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gsIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yKQorICAgICAgOiBjb250YWluZXIoJl9feCkge30KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsdWUpCisgICAgICB7CisJY29udGFpbmVyLT5pbnNlcnQoX192YWx1ZSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvciooKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICAgIAorICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgICAgCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBpbnNlcnRfaXRlcmF0b3I8X19nbnVfY3h4OjpoYXNoX211bHRpc2V0PF9WYWx1ZSwgX0hhc2hGY24sCisJCQkJCQkgICBfRXF1YWxLZXksIF9BbGxvYz4gPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6aGFzaF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4KKyAgICAgICAgX0NvbnRhaW5lcjsKKyAgICAgIF9Db250YWluZXIqIGNvbnRhaW5lcjsKKyAgICAgIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIGl0ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisgICAgICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICAKKyAgICAgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpCisgICAgICA6IGNvbnRhaW5lcigmX194KSB7fQorICAgICAgCisgICAgICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvcikKKyAgICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbHVlKQorICAgICAgeworCWNvbnRhaW5lci0+aW5zZXJ0KF9fdmFsdWUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2l0ZXJhdG9yIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvaXRlcmF0b3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViODVhYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L2l0ZXJhdG9yCkBAIC0wLDAgKzEsMTE2IEBACisvLyBIUC9TR0kgaXRlcmF0b3IgZXh0ZW5zaW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk4CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgZXh0L2l0ZXJhdG9yCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkgKHBvc3NpYmx5CisgKiAgY29udGFpbmluZyBleHRlbnNpb25zIGZyb20gdGhlIEhQL1NHSSBTVEwgc3Vic2V0KS4KKyAqLworCisjaWZuZGVmIF9FWFRfSVRFUkFUT1IKKyNkZWZpbmUgX0VYVF9JVEVSQVRPUiAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gVGhlcmUgYXJlIHR3byBzaWduYXR1cmVzIGZvciBkaXN0YW5jZS4gIEluIGFkZGl0aW9uIHRvIHRoZSBvbmUKKyAgLy8gdGFraW5nIHR3byBpdGVyYXRvcnMgYW5kIHJldHVybmluZyBhIHJlc3VsdCwgdGhlcmUgaXMgYW5vdGhlcgorICAvLyB0YWtpbmcgdHdvIGl0ZXJhdG9ycyBhbmQgYSByZWZlcmVuY2UtdG8tcmVzdWx0IHZhcmlhYmxlLCBhbmQKKyAgLy8gcmV0dXJuaW5nIG5vdGhpbmcuICBUaGUgbGF0dGVyIHNlZW1zIHRvIGJlIGFuIFNHSSBleHRlbnNpb24uCisgIC8vIC0tIHBlZHdhcmRzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfRGlzdGFuY2U+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX2Rpc3RhbmNlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICAgX0Rpc3RhbmNlJiBfX24sIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICArK19fZmlyc3Q7CisJICArK19fbjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0Rpc3RhbmNlPgorICAgIGlubGluZSB2b2lkCisgICAgX19kaXN0YW5jZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICAgX0Rpc3RhbmNlJiBfX24sIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fbiArPSBfX2xhc3QgLSBfX2ZpcnN0OworICAgIH0KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfRGlzdGFuY2U+CisgICAgaW5saW5lIHZvaWQKKyAgICBkaXN0YW5jZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgX0Rpc3RhbmNlJiBfX24pCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMgLS0gdGFrZW4gY2FyZSBvZiBpbiBfX2Rpc3RhbmNlCisgICAgICBfX2Rpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCwgX19uLCBzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdCkpOworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvbWFsbG9jX2FsbG9jYXRvci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvbWFsbG9jX2FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMDkzNGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9tYWxsb2NfYWxsb2NhdG9yLmgKQEAgLTAsMCArMSwxNTIgQEAKKy8vIEFsbG9jYXRvciB0aGF0IHdyYXBzICJDIiBtYWxsb2MgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9tYWxsb2NfYWxsb2NhdG9yLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9NQUxMT0NfQUxMT0NBVE9SX0gKKyNkZWZpbmUgX01BTExPQ19BTExPQ0FUT1JfSCAxCisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+CisjaW5jbHVkZSA8Yml0cy9tb3ZlLmg+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2VuZGlmCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyBzdGQ6OnNpemVfdDsKKyAgdXNpbmcgc3RkOjpwdHJkaWZmX3Q7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEFuIGFsbG9jYXRvciB0aGF0IHVzZXMgbWFsbG9jLgorICAgKiAgQGluZ3JvdXAgYWxsb2NhdG9ycworICAgKgorICAgKiAgVGhpcyBpcyBwcmVjaXNlbHkgdGhlIGFsbG9jYXRvciBkZWZpbmVkIGluIHRoZSBDKysgU3RhbmRhcmQuIAorICAgKiAgICAtIGFsbCBhbGxvY2F0aW9uIGNhbGxzIG1hbGxvYworICAgKiAgICAtIGFsbCBkZWFsbG9jYXRpb24gY2FsbHMgZnJlZQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIG1hbGxvY19hbGxvY2F0b3IKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBzaXplX3QgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCogICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwKiBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBfVHAmICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwJiBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgdmFsdWVfdHlwZTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgc3RydWN0IHJlYmluZAorICAgICAgICB7IHR5cGVkZWYgbWFsbG9jX2FsbG9jYXRvcjxfVHAxPiBvdGhlcjsgfTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxMDMuIHByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50CisgICAgICB0eXBlZGVmIHN0ZDo6dHJ1ZV90eXBlIHByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50OworI2VuZGlmCisKKyAgICAgIG1hbGxvY19hbGxvY2F0b3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisKKyAgICAgIG1hbGxvY19hbGxvY2F0b3IoY29uc3QgbWFsbG9jX2FsbG9jYXRvciYpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgbWFsbG9jX2FsbG9jYXRvcihjb25zdCBtYWxsb2NfYWxsb2NhdG9yPF9UcDE+JikKKwlfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisKKyAgICAgIH5tYWxsb2NfYWxsb2NhdG9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgfQorCisgICAgICBwb2ludGVyCisgICAgICBhZGRyZXNzKHJlZmVyZW5jZSBfX3gpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9feCk7IH0KKworICAgICAgY29uc3RfcG9pbnRlcgorICAgICAgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3gpOyB9CisKKyAgICAgIC8vIE5COiBfX24gaXMgcGVybWl0dGVkIHRvIGJlIDAuICBUaGUgQysrIHN0YW5kYXJkIHNheXMgbm90aGluZworICAgICAgLy8gYWJvdXQgd2hhdCB0aGUgcmV0dXJuIHZhbHVlIGlzIHdoZW4gX19uID09IDAuCisgICAgICBwb2ludGVyCisgICAgICBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCBjb25zdCB2b2lkKiA9IDApCisgICAgICB7CisJaWYgKF9fbiA+IHRoaXMtPm1heF9zaXplKCkpCisJICBzdGQ6Ol9fdGhyb3dfYmFkX2FsbG9jKCk7CisKKwlwb2ludGVyIF9fcmV0ID0gc3RhdGljX2Nhc3Q8X1RwKj4oc3RkOjptYWxsb2MoX19uICogc2l6ZW9mKF9UcCkpKTsKKwlpZiAoIV9fcmV0KQorCSAgc3RkOjpfX3Rocm93X2JhZF9hbGxvYygpOworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICAgICAgLy8gX19wIGlzIG5vdCBwZXJtaXR0ZWQgdG8gYmUgYSBudWxsIHBvaW50ZXIuCisgICAgICB2b2lkCisgICAgICBkZWFsbG9jYXRlKHBvaW50ZXIgX19wLCBzaXplX3R5cGUpCisgICAgICB7IHN0ZDo6ZnJlZShzdGF0aWNfY2FzdDx2b2lkKj4oX19wKSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCAKKyAgICAgIHsgcmV0dXJuIHNpemVfdCgtMSkgLyBzaXplb2YoX1RwKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBjb25zdHJ1Y3QoX1VwKiBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsgOjpuZXcoKHZvaWQgKilfX3ApIF9VcChzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgdm9pZCAKKyAgICAgICAgZGVzdHJveShfVXAqIF9fcCkgeyBfX3AtPn5fVXAoKTsgfQorI2Vsc2UKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQwMi4gd3JvbmcgbmV3IGV4cHJlc3Npb24gaW4gW3NvbWVfXSBhbGxvY2F0b3I6OmNvbnN0cnVjdAorICAgICAgdm9pZCAKKyAgICAgIGNvbnN0cnVjdChwb2ludGVyIF9fcCwgY29uc3QgX1RwJiBfX3ZhbCkgCisgICAgICB7IDo6bmV3KCh2b2lkICopX19wKSB2YWx1ZV90eXBlKF9fdmFsKTsgfQorCisgICAgICB2b2lkIAorICAgICAgZGVzdHJveShwb2ludGVyIF9fcCkgeyBfX3AtPn5fVHAoKTsgfQorI2VuZGlmCisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IG1hbGxvY19hbGxvY2F0b3I8X1RwPiYsIGNvbnN0IG1hbGxvY19hbGxvY2F0b3I8X1RwPiYpCisgICAgeyByZXR1cm4gdHJ1ZTsgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBtYWxsb2NfYWxsb2NhdG9yPF9UcD4mLCBjb25zdCBtYWxsb2NfYWxsb2NhdG9yPF9UcD4mKQorICAgIHsgcmV0dXJuIGZhbHNlOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9tZW1vcnkgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9tZW1vcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5YjBkNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L21lbW9yeQpAQCAtMCwwICsxLDE5NyBAQAorLy8gTWVtb3J5IGV4dGVuc2lvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAyLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBleHQvbWVtb3J5CisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkgKHBvc3NpYmx5CisgKiAgY29udGFpbmluZyBleHRlbnNpb25zIGZyb20gdGhlIEhQL1NHSSBTVEwgc3Vic2V0KS4KKyAqLworCisjaWZuZGVmIF9FWFRfTUVNT1JZCisjZGVmaW5lIF9FWFRfTUVNT1JZIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGJpdHMvc3RsX3RlbXBidWYuaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHVzaW5nIHN0ZDo6cHRyZGlmZl90OworICB1c2luZyBzdGQ6OnBhaXI7CisgIHVzaW5nIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeTsKKyAgdXNpbmcgc3RkOjpfVGVtcG9yYXJ5X2J1ZmZlcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyPgorICAgIHBhaXI8X0lucHV0SXRlciwgX0ZvcndhcmRJdGVyPgorICAgIF9fdW5pbml0aWFsaXplZF9jb3B5X24oX0lucHV0SXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LAorCQkJICAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0LCBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBfRm9yd2FyZEl0ZXIgX19jdXIgPSBfX3Jlc3VsdDsKKyAgICAgIF9fdHJ5CisJeworCSAgZm9yICg7IF9fY291bnQgPiAwIDsgLS1fX2NvdW50LCArK19fZmlyc3QsICsrX19jdXIpCisJICAgIHN0ZDo6X0NvbnN0cnVjdCgmKl9fY3VyLCAqX19maXJzdCk7CisJICByZXR1cm4gcGFpcjxfSW5wdXRJdGVyLCBfRm9yd2FyZEl0ZXI+KF9fZmlyc3QsIF9fY3VyKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBzdGQ6Ol9EZXN0cm95KF9fcmVzdWx0LCBfX2N1cik7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyPgorICAgIGlubGluZSBwYWlyPF9SYW5kb21BY2Nlc3NJdGVyLCBfRm9yd2FyZEl0ZXI+CisgICAgX191bmluaXRpYWxpemVkX2NvcHlfbihfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LAorCQkJICAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0LAorCQkJICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QgPSBfX2ZpcnN0ICsgX19jb3VudDsKKyAgICAgIHJldHVybiAocGFpcjxfUmFuZG9tQWNjZXNzSXRlciwgX0ZvcndhcmRJdGVyPgorCSAgICAgIChfX2xhc3QsIHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXIsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXI+CisgICAgaW5saW5lIHBhaXI8X0lucHV0SXRlciwgX0ZvcndhcmRJdGVyPgorICAgIF9fdW5pbml0aWFsaXplZF9jb3B5X24oX0lucHV0SXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LAorCQkJICAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0KQorICAgIHsgcmV0dXJuIF9fZ251X2N4eDo6X191bmluaXRpYWxpemVkX2NvcHlfbihfX2ZpcnN0LCBfX2NvdW50LCBfX3Jlc3VsdCwKKwkJCQkJICAgICAgIF9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdCkpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29waWVzIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkgaW50byByZXN1bHQuCisgICAqICBAcGFyYW0gIF9fZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBfX2NvdW50ICBMZW5ndGgKKyAgICogIEBwYXJhbSAgX19yZXN1bHQgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgIF9fcmVzdWx0ICsgKF9fZmlyc3QgKyBfX2NvdW50KQorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKgorICAgKiAgTGlrZSBjb3B5KCksIGJ1dCBkb2VzIG5vdCByZXF1aXJlIGFuIGluaXRpYWxpemVkIG91dHB1dCByYW5nZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcj4KKyAgICBpbmxpbmUgcGFpcjxfSW5wdXRJdGVyLCBfRm9yd2FyZEl0ZXI+CisgICAgdW5pbml0aWFsaXplZF9jb3B5X24oX0lucHV0SXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LAorCQkJIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCkKKyAgICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdW5pbml0aWFsaXplZF9jb3B5X24oX19maXJzdCwgX19jb3VudCwgX19yZXN1bHQsCisJCQkJCSAgICAgICBfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsgfQorCisKKyAgLy8gQW4gYWx0ZXJuYXRpdmUgdmVyc2lvbiBvZiB1bmluaXRpYWxpemVkX2NvcHlfbiB0aGF0IGNvbnN0cnVjdHMKKyAgLy8gYW5kIGRlc3Ryb3lzIG9iamVjdHMgd2l0aCBhIHVzZXItcHJvdmlkZWQgYWxsb2NhdG9yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIHBhaXI8X0lucHV0SXRlciwgX0ZvcndhcmRJdGVyPgorICAgIF9fdW5pbml0aWFsaXplZF9jb3B5X25fYShfSW5wdXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsCisJCQkgICAgIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCwKKwkJCSAgICAgX0FsbG9jYXRvciBfX2FsbG9jKQorICAgIHsKKyAgICAgIF9Gb3J3YXJkSXRlciBfX2N1ciA9IF9fcmVzdWx0OworICAgICAgX190cnkKKwl7CisJICBmb3IgKDsgX19jb3VudCA+IDAgOyAtLV9fY291bnQsICsrX19maXJzdCwgKytfX2N1cikKKwkgICAgX19hbGxvYy5jb25zdHJ1Y3QoJipfX2N1ciwgKl9fZmlyc3QpOworCSAgcmV0dXJuIHBhaXI8X0lucHV0SXRlciwgX0ZvcndhcmRJdGVyPihfX2ZpcnN0LCBfX2N1cik7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgc3RkOjpfRGVzdHJveShfX3Jlc3VsdCwgX19jdXIsIF9fYWxsb2MpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHBhaXI8X0lucHV0SXRlciwgX0ZvcndhcmRJdGVyPgorICAgIF9fdW5pbml0aWFsaXplZF9jb3B5X25fYShfSW5wdXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsCisJCQkgICAgIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCwKKwkJCSAgICAgc3RkOjphbGxvY2F0b3I8X1RwPikKKyAgICB7CisgICAgICByZXR1cm4gX19nbnVfY3h4Ojp1bmluaXRpYWxpemVkX2NvcHlfbihfX2ZpcnN0LCBfX2NvdW50LCBfX3Jlc3VsdCk7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBjbGFzcyBwcm92aWRlcyBzaW1pbGFyIGJlaGF2aW9yIGFuZCBzZW1hbnRpY3Mgb2YgdGhlIHN0YW5kYXJkCisgICAqICBmdW5jdGlvbnMgZ2V0X3RlbXBvcmFyeV9idWZmZXIoKSBhbmQgcmV0dXJuX3RlbXBvcmFyeV9idWZmZXIoKSwgYnV0CisgICAqICBlbmNhcHN1bGF0ZWQgaW4gYSB0eXBlIHZhZ3VlbHkgcmVzZW1ibGluZyBhIHN0YW5kYXJkIGNvbnRhaW5lci4KKyAgICoKKyAgICogIEJ5IGRlZmF1bHQsIGEgdGVtcG9yYXJ5X2J1ZmZlcjxJdGVyPiBzdG9yZXMgc3BhY2UgZm9yIG9iamVjdHMgb2YKKyAgICogIHdoYXRldmVyIHR5cGUgdGhlIEl0ZXIgaXRlcmF0b3IgcG9pbnRzIHRvLiAgSXQgaXMgY29uc3RydWN0ZWQgZnJvbSBhCisgICAqICB0eXBpY2FsIFtmaXJzdCxsYXN0KSByYW5nZSwgYW5kIHByb3ZpZGVzIHRoZSBiZWdpbigpLCBlbmQoKSwgc2l6ZSgpCisgICAqICBmdW5jdGlvbnMsIGFzIHdlbGwgYXMgcmVxdWVzdGVkX3NpemUoKS4gIEZvciBub24tdHJpdmlhbCB0eXBlcywgY29waWVzCisgICAqICBvZiAqZmlyc3Qgd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHN0b3JhZ2UuCisgICAqCisgICAqICBAYyBtYWxsb2MgaXMgdXNlZCB0byBvYnRhaW4gdW5kZXJseWluZyBzdG9yYWdlLgorICAgKgorICAgKiAgTGlrZSBnZXRfdGVtcG9yYXJ5X2J1ZmZlcigpLCBub3QgYWxsIHRoZSByZXF1ZXN0ZWQgbWVtb3J5IG1heSBiZQorICAgKiAgYXZhaWxhYmxlLiAgSWRlYWxseSwgdGhlIGNyZWF0ZWQgYnVmZmVyIHdpbGwgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYQorICAgKiAgY29weSBvZiBbZmlyc3QsbGFzdCksIGJ1dCBpZiBzaXplKCkgaXMgbGVzcyB0aGFuIHJlcXVlc3RlZF9zaXplKCksCisgICAqICB0aGVuIHRoaXMgZGlkbid0IGhhcHBlbi4KKyAgICoKKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgKi8KKyAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsIGNsYXNzIF9UcAorCSAgICA9IHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlID4KKyAgICBzdHJ1Y3QgdGVtcG9yYXJ5X2J1ZmZlciA6IHB1YmxpYyBfVGVtcG9yYXJ5X2J1ZmZlcjxfRm9yd2FyZEl0ZXJhdG9yLCBfVHA+CisgICAgeworICAgICAgLy8vIFJlcXVlc3RzIHN0b3JhZ2UgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYSBjb3B5IG9mIFtmaXJzdCxsYXN0KS4KKyAgICAgIHRlbXBvcmFyeV9idWZmZXIoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIDogX1RlbXBvcmFyeV9idWZmZXI8X0ZvcndhcmRJdGVyYXRvciwgX1RwPihfX2ZpcnN0LCBfX2xhc3QpIHsgfQorICAgICAgCisgICAgICAvLy8gRGVzdHJveXMgb2JqZWN0cyBhbmQgZnJlZXMgc3RvcmFnZS4KKyAgICAgIH50ZW1wb3JhcnlfYnVmZmVyKCkgeyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvbXRfYWxsb2NhdG9yLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9tdF9hbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDYxNjIwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvbXRfYWxsb2NhdG9yLmgKQEAgLTAsMCArMSw3NjYgQEAKKy8vIE1ULW9wdGltaXplZCBhbGxvY2F0b3IgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9tdF9hbGxvY2F0b3IuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX01UX0FMTE9DQVRPUl9ICisjZGVmaW5lIF9NVF9BTExPQ0FUT1JfSCAxCisKKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+CisjaW5jbHVkZSA8ZXh0L2F0b21pY2l0eS5oPgorI2luY2x1ZGUgPGJpdHMvbW92ZS5oPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNlbmRpZgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgc3RkOjpzaXplX3Q7CisgIHVzaW5nIHN0ZDo6cHRyZGlmZl90OworCisgIHR5cGVkZWYgdm9pZCAoKl9fZGVzdHJveV9oYW5kbGVyKSh2b2lkKik7CisKKyAgLy8vIEJhc2UgY2xhc3MgZm9yIHBvb2wgb2JqZWN0LgorICBzdHJ1Y3QgX19wb29sX2Jhc2UKKyAgeworICAgIC8vIFVzaW5nIHNob3J0IGludCBhcyB0eXBlIGZvciB0aGUgYmlubWFwIGltcGxpZXMgd2UgYXJlIG5ldmVyCisgICAgLy8gY2FjaGluZyBibG9ja3MgbGFyZ2VyIHRoYW4gMzI3Njggd2l0aCB0aGlzIGFsbG9jYXRvci4KKyAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBfQmlubWFwX3R5cGU7CisKKyAgICAvLyBWYXJpYWJsZXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGJlaGF2aW9yIG9mIHRoZSBhbGxvY2F0b3IsCisgICAgLy8gYXNzaWduZWQgYW5kIGV4cGxhaW5lZCBpbiBkZXRhaWwgYmVsb3cuCisgICAgc3RydWN0IF9UdW5lCisgICAgIHsKKyAgICAgIC8vIENvbXBpbGUgdGltZSBjb25zdGFudHMgZm9yIHRoZSBkZWZhdWx0IF9UdW5lIHZhbHVlcy4KKyAgICAgIGVudW0geyBfU19hbGlnbiA9IDggfTsKKyAgICAgIGVudW0geyBfU19tYXhfYnl0ZXMgPSAxMjggfTsKKyAgICAgIGVudW0geyBfU19taW5fYmluID0gOCB9OworICAgICAgZW51bSB7IF9TX2NodW5rX3NpemUgPSA0MDk2IC0gNCAqIHNpemVvZih2b2lkKikgfTsKKyAgICAgIGVudW0geyBfU19tYXhfdGhyZWFkcyA9IDQwOTYgfTsKKyAgICAgIGVudW0geyBfU19mcmVlbGlzdF9oZWFkcm9vbSA9IDEwIH07CisKKyAgICAgIC8vIEFsaWdubWVudCBuZWVkZWQuCisgICAgICAvLyBOQjogSW4gYW55IGNhc2UgbXVzdCBiZSA+PSBzaXplb2YoX0Jsb2NrX3JlY29yZCksIHRoYXQKKyAgICAgIC8vIGlzIDQgb24gMzIgYml0IG1hY2hpbmVzIGFuZCA4IG9uIDY0IGJpdCBtYWNoaW5lcy4KKyAgICAgIHNpemVfdAlfTV9hbGlnbjsKKyAgICAgIAorICAgICAgLy8gQWxsb2NhdGlvbiByZXF1ZXN0cyAoYWZ0ZXIgcm91bmQtdXAgdG8gcG93ZXIgb2YgMikgYmVsb3cKKyAgICAgIC8vIHRoaXMgdmFsdWUgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBhbGxvY2F0b3IuIEEgcmF3IG5ldy8KKyAgICAgIC8vIGNhbGwgd2lsbCBiZSB1c2VkIGZvciByZXF1ZXN0cyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlLgorICAgICAgLy8gTkI6IE11c3QgYmUgbXVjaCBzbWFsbGVyIHRoYW4gX01fY2h1bmtfc2l6ZSBhbmQgaW4gYW55CisgICAgICAvLyBjYXNlIDw9IDMyNzY4LgorICAgICAgc2l6ZV90CV9NX21heF9ieXRlczsgCisKKyAgICAgIC8vIFNpemUgaW4gYnl0ZXMgb2YgdGhlIHNtYWxsZXN0IGJpbi4KKyAgICAgIC8vIE5COiBNdXN0IGJlIGEgcG93ZXIgb2YgMiBhbmQgPj0gX01fYWxpZ24gKGFuZCBvZiBjb3Vyc2UKKyAgICAgIC8vIG11Y2ggc21hbGxlciB0aGFuIF9NX21heF9ieXRlcykuCisgICAgICBzaXplX3QJX01fbWluX2JpbjsKKworICAgICAgLy8gSW4gb3JkZXIgdG8gYXZvaWQgZnJhZ21lbnRpbmcgYW5kIG1pbmltaXplIHRoZSBudW1iZXIgb2YKKyAgICAgIC8vIG5ldygpIGNhbGxzIHdlIGFsd2F5cyByZXF1ZXN0IG5ldyBtZW1vcnkgdXNpbmcgdGhpcworICAgICAgLy8gdmFsdWUuIEJhc2VkIG9uIHByZXZpb3VzIGRpc2N1c3Npb25zIG9uIHRoZSBsaWJzdGRjKysKKyAgICAgIC8vIG1haWxpbmcgbGlzdCB3ZSBoYXZlIGNob3NlbiB0aGUgdmFsdWUgYmVsb3cuCisgICAgICAvLyBTZWUgaHR0cDovL2djYy5nbnUub3JnL21sL2xpYnN0ZGMrKy8yMDAxLTA3L21zZzAwMDc3Lmh0bWwKKyAgICAgIC8vIE5COiBBdCBsZWFzdCBvbmUgb3JkZXIgb2YgbWFnbml0dWRlID4gX01fbWF4X2J5dGVzLiAKKyAgICAgIHNpemVfdAlfTV9jaHVua19zaXplOworCisgICAgICAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3VwcG9ydGVkIHRocmVhZHMuIEZvcgorICAgICAgLy8gc2luZ2xlLXRocmVhZGVkIG9wZXJhdGlvbiwgdXNlIG9uZS4gTWF4aW11bSB2YWx1ZXMgd2lsbAorICAgICAgLy8gdmFyeSBkZXBlbmRpbmcgb24gZGV0YWlscyBvZiB0aGUgdW5kZXJseWluZyBzeXN0ZW0uIChGb3IKKyAgICAgIC8vIGluc3RhbmNlLCBMaW51eCAyLjQuMTggcmVwb3J0cyA0MDcwIGluCisgICAgICAvLyAvcHJvYy9zeXMva2VybmVsL3RocmVhZHMtbWF4LCB3aGlsZSBMaW51eCAyLjYuNiByZXBvcnRzCisgICAgICAvLyA2NTUzNCkKKyAgICAgIHNpemVfdCAJX01fbWF4X3RocmVhZHM7CisKKyAgICAgIC8vIEVhY2ggdGltZSBhIGRlYWxsb2NhdGlvbiBvY2N1cnMgaW4gYSB0aHJlYWRlZCBhcHBsaWNhdGlvbgorICAgICAgLy8gd2UgbWFrZSBzdXJlIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgdGhhbgorICAgICAgLy8gX01fZnJlZWxpc3RfaGVhZHJvb20gJSBvZiB1c2VkIG1lbW9yeSBvbiB0aGUgZnJlZWxpc3QuIElmCisgICAgICAvLyB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgcmVjb3JkcyBpcyBtb3JlIHRoYW4KKyAgICAgIC8vIF9NX2ZyZWVsaXN0X2hlYWRyb29tICUgb2YgdGhlIGZyZWVsaXN0LCB3ZSBtb3ZlIHRoZXNlCisgICAgICAvLyByZWNvcmRzIGJhY2sgdG8gdGhlIGdsb2JhbCBwb29sLgorICAgICAgc2l6ZV90IAlfTV9mcmVlbGlzdF9oZWFkcm9vbTsKKyAgICAgIAorICAgICAgLy8gU2V0IHRvIHRydWUgZm9yY2VzIGFsbCBhbGxvY2F0aW9ucyB0byB1c2UgbmV3KCkuCisgICAgICBib29sIAlfTV9mb3JjZV9uZXc7IAorICAgICAgCisgICAgICBleHBsaWNpdAorICAgICAgX1R1bmUoKQorICAgICAgOiBfTV9hbGlnbihfU19hbGlnbiksIF9NX21heF9ieXRlcyhfU19tYXhfYnl0ZXMpLCBfTV9taW5fYmluKF9TX21pbl9iaW4pLAorICAgICAgX01fY2h1bmtfc2l6ZShfU19jaHVua19zaXplKSwgX01fbWF4X3RocmVhZHMoX1NfbWF4X3RocmVhZHMpLCAKKyAgICAgIF9NX2ZyZWVsaXN0X2hlYWRyb29tKF9TX2ZyZWVsaXN0X2hlYWRyb29tKSwgCisgICAgICBfTV9mb3JjZV9uZXcoc3RkOjpnZXRlbnYoIkdMSUJDWFhfRk9SQ0VfTkVXIikgPyB0cnVlIDogZmFsc2UpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIF9UdW5lKHNpemVfdCBfX2FsaWduLCBzaXplX3QgX19tYXhiLCBzaXplX3QgX19taW5iaW4sIHNpemVfdCBfX2NodW5rLCAKKwkgICAgc2l6ZV90IF9fbWF4dGhyZWFkcywgc2l6ZV90IF9faGVhZHJvb20sIGJvb2wgX19mb3JjZSkgCisgICAgICA6IF9NX2FsaWduKF9fYWxpZ24pLCBfTV9tYXhfYnl0ZXMoX19tYXhiKSwgX01fbWluX2JpbihfX21pbmJpbiksCisgICAgICBfTV9jaHVua19zaXplKF9fY2h1bmspLCBfTV9tYXhfdGhyZWFkcyhfX21heHRocmVhZHMpLAorICAgICAgX01fZnJlZWxpc3RfaGVhZHJvb20oX19oZWFkcm9vbSksIF9NX2ZvcmNlX25ldyhfX2ZvcmNlKQorICAgICAgeyB9CisgICAgfTsKKyAgICAKKyAgICBzdHJ1Y3QgX0Jsb2NrX2FkZHJlc3MKKyAgICB7CisgICAgICB2b2lkKiAJCQlfTV9pbml0aWFsOworICAgICAgX0Jsb2NrX2FkZHJlc3MqIAkJX01fbmV4dDsKKyAgICB9OworICAgIAorICAgIGNvbnN0IF9UdW5lJgorICAgIF9NX2dldF9vcHRpb25zKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9vcHRpb25zOyB9CisKKyAgICB2b2lkCisgICAgX01fc2V0X29wdGlvbnMoX1R1bmUgX190KQorICAgIHsgCisgICAgICBpZiAoIV9NX2luaXQpCisJX01fb3B0aW9ucyA9IF9fdDsKKyAgICB9CisKKyAgICBib29sCisgICAgX01fY2hlY2tfdGhyZXNob2xkKHNpemVfdCBfX2J5dGVzKQorICAgIHsgcmV0dXJuIF9fYnl0ZXMgPiBfTV9vcHRpb25zLl9NX21heF9ieXRlcyB8fCBfTV9vcHRpb25zLl9NX2ZvcmNlX25ldzsgfQorCisgICAgc2l6ZV90CisgICAgX01fZ2V0X2Jpbm1hcChzaXplX3QgX19ieXRlcykKKyAgICB7IHJldHVybiBfTV9iaW5tYXBbX19ieXRlc107IH0KKworICAgIHNpemVfdAorICAgIF9NX2dldF9hbGlnbigpCisgICAgeyByZXR1cm4gX01fb3B0aW9ucy5fTV9hbGlnbjsgfQorCisgICAgZXhwbGljaXQgCisgICAgX19wb29sX2Jhc2UoKSAKKyAgICA6IF9NX29wdGlvbnMoX1R1bmUoKSksIF9NX2Jpbm1hcCgwKSwgX01faW5pdChmYWxzZSkgeyB9CisKKyAgICBleHBsaWNpdCAKKyAgICBfX3Bvb2xfYmFzZShjb25zdCBfVHVuZSYgX19vcHRpb25zKQorICAgIDogX01fb3B0aW9ucyhfX29wdGlvbnMpLCBfTV9iaW5tYXAoMCksIF9NX2luaXQoZmFsc2UpIHsgfQorCisgIHByaXZhdGU6CisgICAgZXhwbGljaXQgCisgICAgX19wb29sX2Jhc2UoY29uc3QgX19wb29sX2Jhc2UmKTsKKworICAgIF9fcG9vbF9iYXNlJgorICAgIG9wZXJhdG9yPShjb25zdCBfX3Bvb2xfYmFzZSYpOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBDb25maWd1cmF0aW9uIG9wdGlvbnMuCisgICAgX1R1bmUgCSAgICAgICAJCV9NX29wdGlvbnM7CisgICAgCisgICAgX0Jpbm1hcF90eXBlKiAJCV9NX2Jpbm1hcDsKKworICAgIC8vIENvbmZpZ3VyYXRpb24gb2YgdGhlIHBvb2wgb2JqZWN0IHZpYSBfTV9vcHRpb25zIGNhbiBoYXBwZW4KKyAgICAvLyBhZnRlciBjb25zdHJ1Y3Rpb24gYnV0IGJlZm9yZSBpbml0aWFsaXphdGlvbi4gQWZ0ZXIKKyAgICAvLyBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZSwgdGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gdHJ1ZS4KKyAgICBib29sIAkJCV9NX2luaXQ7CisgIH07CisKKworICAvKioKKyAgICogIEBicmllZiAgRGF0YSBkZXNjcmliaW5nIHRoZSB1bmRlcmx5aW5nIG1lbW9yeSBwb29sLCBwYXJhbWV0ZXJpemVkIG9uCisgICAqICB0aHJlYWRpbmcgc3VwcG9ydC4KKyAgICovCisgIHRlbXBsYXRlPGJvb2wgX1RocmVhZD4KKyAgICBjbGFzcyBfX3Bvb2w7CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBzaW5nbGUgdGhyZWFkLgorICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgX19wb29sPGZhbHNlPiA6IHB1YmxpYyBfX3Bvb2xfYmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB1bmlvbiBfQmxvY2tfcmVjb3JkCisgICAgICB7CisJLy8gUG9pbnRzIHRvIHRoZSBibG9ja19yZWNvcmQgb2YgdGhlIG5leHQgZnJlZSBibG9jay4KKwlfQmxvY2tfcmVjb3JkKiAJCQlfTV9uZXh0OworICAgICAgfTsKKworICAgICAgc3RydWN0IF9CaW5fcmVjb3JkCisgICAgICB7CisJLy8gQW4gImFycmF5IiBvZiBwb2ludGVycyB0byB0aGUgZmlyc3QgZnJlZSBibG9jay4KKwlfQmxvY2tfcmVjb3JkKioJCQlfTV9maXJzdDsKKworCS8vIEEgbGlzdCBvZiB0aGUgaW5pdGlhbCBhZGRyZXNzZXMgb2YgYWxsIGFsbG9jYXRlZCBibG9ja3MuCisJX0Jsb2NrX2FkZHJlc3MqCQkgICAgIAlfTV9hZGRyZXNzOworICAgICAgfTsKKyAgICAgIAorICAgICAgdm9pZAorICAgICAgX01faW5pdGlhbGl6ZV9vbmNlKCkKKyAgICAgIHsKKwlpZiAoX19idWlsdGluX2V4cGVjdChfTV9pbml0ID09IGZhbHNlLCBmYWxzZSkpCisJICBfTV9pbml0aWFsaXplKCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2Rlc3Ryb3koKSB0aHJvdygpOworCisgICAgICBjaGFyKiAKKyAgICAgIF9NX3Jlc2VydmVfYmxvY2soc2l6ZV90IF9fYnl0ZXMsIGNvbnN0IHNpemVfdCBfX3RocmVhZF9pZCk7CisgICAgCisgICAgICB2b2lkCisgICAgICBfTV9yZWNsYWltX2Jsb2NrKGNoYXIqIF9fcCwgc2l6ZV90IF9fYnl0ZXMpIHRocm93ICgpOworICAgIAorICAgICAgc2l6ZV90IAorICAgICAgX01fZ2V0X3RocmVhZF9pZCgpIHsgcmV0dXJuIDA7IH0KKyAgICAgIAorICAgICAgY29uc3QgX0Jpbl9yZWNvcmQmCisgICAgICBfTV9nZXRfYmluKHNpemVfdCBfX3doaWNoKQorICAgICAgeyByZXR1cm4gX01fYmluW19fd2hpY2hdOyB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX2FkanVzdF9mcmVlbGlzdChjb25zdCBfQmluX3JlY29yZCYsIF9CbG9ja19yZWNvcmQqLCBzaXplX3QpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQgX19wb29sKCkgCisgICAgICA6IF9NX2JpbigwKSwgX01fYmluX3NpemUoMSkgeyB9CisKKyAgICAgIGV4cGxpY2l0IF9fcG9vbChjb25zdCBfX3Bvb2xfYmFzZTo6X1R1bmUmIF9fdHVuZSkgCisgICAgICA6IF9fcG9vbF9iYXNlKF9fdHVuZSksIF9NX2JpbigwKSwgX01fYmluX3NpemUoMSkgeyB9CisKKyAgICBwcml2YXRlOgorICAgICAgLy8gQW4gImFycmF5IiBvZiBiaW5fcmVjb3JkcyBlYWNoIG9mIHdoaWNoIHJlcHJlc2VudHMgYSBzcGVjaWZpYworICAgICAgLy8gcG93ZXIgb2YgMiBzaXplLiBNZW1vcnkgdG8gdGhpcyAiYXJyYXkiIGlzIGFsbG9jYXRlZCBpbgorICAgICAgLy8gX01faW5pdGlhbGl6ZSgpLgorICAgICAgX0Jpbl9yZWNvcmQqCQkgX01fYmluOworICAgICAgCisgICAgICAvLyBBY3R1YWwgdmFsdWUgY2FsY3VsYXRlZCBpbiBfTV9pbml0aWFsaXplKCkuCisgICAgICBzaXplX3QgCSAgICAgICAJICAgICAJX01fYmluX3NpemU7ICAgICAKKworICAgICAgdm9pZAorICAgICAgX01faW5pdGlhbGl6ZSgpOworICB9OworIAorI2lmZGVmIF9fR1RIUkVBRFMKKyAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciB0aHJlYWQgZW5hYmxlZCwgdmlhIGd0aHJlYWRzLmguCisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBfX3Bvb2w8dHJ1ZT4gOiBwdWJsaWMgX19wb29sX2Jhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gRWFjaCByZXF1ZXN0aW5nIHRocmVhZCBpcyBhc3NpZ25lZCBhbiBpZCByYW5naW5nIGZyb20gMSB0bworICAgICAgLy8gX1NfbWF4X3RocmVhZHMuIFRocmVhZCBpZCAwIGlzIHVzZWQgYXMgYSBnbG9iYWwgbWVtb3J5IHBvb2wuCisgICAgICAvLyBJbiBvcmRlciB0byBnZXQgY29uc3RhbnQgcGVyZm9ybWFuY2Ugb24gdGhlIHRocmVhZCBhc3NpZ25tZW50CisgICAgICAvLyByb3V0aW5lLCB3ZSBrZWVwIGEgbGlzdCBvZiBmcmVlIGlkcy4gV2hlbiBhIHRocmVhZCBmaXJzdAorICAgICAgLy8gcmVxdWVzdHMgbWVtb3J5IHdlIHJlbW92ZSB0aGUgZmlyc3QgcmVjb3JkIGluIHRoaXMgbGlzdCBhbmQKKyAgICAgIC8vIHN0b3JlcyB0aGUgYWRkcmVzcyBpbiBhIF9fZ3RocmVhZF9rZXkuIFdoZW4gaW5pdGlhbGl6aW5nIHRoZQorICAgICAgLy8gX19ndGhyZWFkX2tleSB3ZSBzcGVjaWZ5IGEgZGVzdHJ1Y3Rvci4gV2hlbiB0aGlzIGRlc3RydWN0b3IKKyAgICAgIC8vIChpLmUuIHRoZSB0aHJlYWQgZGllcykgaXMgY2FsbGVkLCB3ZSByZXR1cm4gdGhlIHRocmVhZCBpZCB0bworICAgICAgLy8gdGhlIGZyb250IG9mIHRoaXMgbGlzdC4KKyAgICAgIHN0cnVjdCBfVGhyZWFkX3JlY29yZAorICAgICAgeworCS8vIFBvaW50cyB0byBuZXh0IGZyZWUgdGhyZWFkIGlkIHJlY29yZC4gTlVMTCBpZiBsYXN0IHJlY29yZCBpbiBsaXN0LgorCV9UaHJlYWRfcmVjb3JkKgkJCV9NX25leHQ7CisJCisJLy8gVGhyZWFkIGlkIHJhbmdpbmcgZnJvbSAxIHRvIF9TX21heF90aHJlYWRzLgorCXNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgX01faWQ7CisgICAgICB9OworICAgICAgCisgICAgICB1bmlvbiBfQmxvY2tfcmVjb3JkCisgICAgICB7CisJLy8gUG9pbnRzIHRvIHRoZSBibG9ja19yZWNvcmQgb2YgdGhlIG5leHQgZnJlZSBibG9jay4KKwlfQmxvY2tfcmVjb3JkKgkJCV9NX25leHQ7CisJCisJLy8gVGhlIHRocmVhZCBpZCBvZiB0aGUgdGhyZWFkIHdoaWNoIGhhcyByZXF1ZXN0ZWQgdGhpcyBibG9jay4KKwlzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX3RocmVhZF9pZDsKKyAgICAgIH07CisgICAgICAKKyAgICAgIHN0cnVjdCBfQmluX3JlY29yZAorICAgICAgeworCS8vIEFuICJhcnJheSIgb2YgcG9pbnRlcnMgdG8gdGhlIGZpcnN0IGZyZWUgYmxvY2sgZm9yIGVhY2gKKwkvLyB0aHJlYWQgaWQuIE1lbW9yeSB0byB0aGlzICJhcnJheSIgaXMgYWxsb2NhdGVkIGluCisJLy8gX1NfaW5pdGlhbGl6ZSgpIGZvciBfU19tYXhfdGhyZWFkcyArIGdsb2JhbCBwb29sIDAuCisJX0Jsb2NrX3JlY29yZCoqCQkJX01fZmlyc3Q7CisJCisJLy8gQSBsaXN0IG9mIHRoZSBpbml0aWFsIGFkZHJlc3NlcyBvZiBhbGwgYWxsb2NhdGVkIGJsb2Nrcy4KKwlfQmxvY2tfYWRkcmVzcyoJCSAgICAgCV9NX2FkZHJlc3M7CisKKwkvLyBBbiAiYXJyYXkiIG9mIGNvdW50ZXJzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgYW1vdW50IG9mCisJLy8gYmxvY2tzIHRoYXQgYXJlIG9uIHRoZSBmcmVlbGlzdC91c2VkIGZvciBlYWNoIHRocmVhZCBpZC4KKwkvLyAtIE5vdGUgdGhhdCB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIGFsbG9jYXRlZCBfTV91c2VkICJhcnJheSIKKwkvLyAgIGFjdHVhbGx5IGhvc3RzIChhdG9taWMpIGNvdW50ZXJzIG9mIHJlY2xhaW1lZCBibG9ja3M6ICBpbgorCS8vICAgX01fcmVzZXJ2ZV9ibG9jayBhbmQgaW4gX01fcmVjbGFpbV9ibG9jayB0aG9zZSBudW1iZXJzIGFyZQorCS8vICAgc3VidHJhY3RlZCBmcm9tIHRoZSBmaXJzdCBvbmVzIHRvIG9idGFpbiB0aGUgYWN0dWFsIHNpemUKKwkvLyAgIG9mIHRoZSAid29ya2luZyBzZXQiIG9mIHRoZSBnaXZlbiB0aHJlYWQuCisJLy8gLSBNZW1vcnkgdG8gdGhlc2UgImFycmF5cyIgaXMgYWxsb2NhdGVkIGluIF9TX2luaXRpYWxpemUoKQorCS8vICAgZm9yIF9TX21heF90aHJlYWRzICsgZ2xvYmFsIHBvb2wgMC4KKwlzaXplX3QqCQkJCV9NX2ZyZWU7CisJc2l6ZV90KgkJCSAgICAgICAgX01fdXNlZDsKKwkKKwkvLyBFYWNoIGJpbiBoYXMgaXRzIG93biBtdXRleCB3aGljaCBpcyB1c2VkIHRvIGVuc3VyZSBkYXRhCisJLy8gaW50ZWdyaXR5IHdoaWxlIGNoYW5naW5nICJvd25lcnNoaXAiIG9uIGEgYmxvY2suICBUaGUgbXV0ZXgKKwkvLyBpcyBpbml0aWFsaXplZCBpbiBfU19pbml0aWFsaXplKCkuCisJX19ndGhyZWFkX211dGV4X3QqICAgICAgICAgICAgICBfTV9tdXRleDsKKyAgICAgIH07CisgICAgICAKKyAgICAgIC8vIFhYWCBHTElCQ1hYX0FCSSBEZXByZWNhdGVkCisgICAgICB2b2lkCisgICAgICBfTV9pbml0aWFsaXplKF9fZGVzdHJveV9oYW5kbGVyKTsKKworICAgICAgdm9pZAorICAgICAgX01faW5pdGlhbGl6ZV9vbmNlKCkKKyAgICAgIHsKKwlpZiAoX19idWlsdGluX2V4cGVjdChfTV9pbml0ID09IGZhbHNlLCBmYWxzZSkpCisJICBfTV9pbml0aWFsaXplKCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2Rlc3Ryb3koKSB0aHJvdygpOworCisgICAgICBjaGFyKiAKKyAgICAgIF9NX3Jlc2VydmVfYmxvY2soc2l6ZV90IF9fYnl0ZXMsIGNvbnN0IHNpemVfdCBfX3RocmVhZF9pZCk7CisgICAgCisgICAgICB2b2lkCisgICAgICBfTV9yZWNsYWltX2Jsb2NrKGNoYXIqIF9fcCwgc2l6ZV90IF9fYnl0ZXMpIHRocm93ICgpOworICAgIAorICAgICAgY29uc3QgX0Jpbl9yZWNvcmQmCisgICAgICBfTV9nZXRfYmluKHNpemVfdCBfX3doaWNoKQorICAgICAgeyByZXR1cm4gX01fYmluW19fd2hpY2hdOyB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX2FkanVzdF9mcmVlbGlzdChjb25zdCBfQmluX3JlY29yZCYgX19iaW4sIF9CbG9ja19yZWNvcmQqIF9fYmxvY2ssIAorCQkJIHNpemVfdCBfX3RocmVhZF9pZCkKKyAgICAgIHsKKwlpZiAoX19ndGhyZWFkX2FjdGl2ZV9wKCkpCisJICB7CisJICAgIF9fYmxvY2stPl9NX3RocmVhZF9pZCA9IF9fdGhyZWFkX2lkOworCSAgICAtLV9fYmluLl9NX2ZyZWVbX190aHJlYWRfaWRdOworCSAgICArK19fYmluLl9NX3VzZWRbX190aHJlYWRfaWRdOworCSAgfQorICAgICAgfQorCisgICAgICAvLyBYWFggR0xJQkNYWF9BQkkgRGVwcmVjYXRlZAorICAgICAgX0dMSUJDWFhfQ09OU1Qgdm9pZCAKKyAgICAgIF9NX2Rlc3Ryb3lfdGhyZWFkX2tleSh2b2lkKikgdGhyb3cgKCk7CisKKyAgICAgIHNpemVfdCAKKyAgICAgIF9NX2dldF90aHJlYWRfaWQoKTsKKworICAgICAgZXhwbGljaXQgX19wb29sKCkgCisgICAgICA6IF9NX2JpbigwKSwgX01fYmluX3NpemUoMSksIF9NX3RocmVhZF9mcmVlbGlzdCgwKSAKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdCBfX3Bvb2woY29uc3QgX19wb29sX2Jhc2U6Ol9UdW5lJiBfX3R1bmUpIAorICAgICAgOiBfX3Bvb2xfYmFzZShfX3R1bmUpLCBfTV9iaW4oMCksIF9NX2Jpbl9zaXplKDEpLCAKKwlfTV90aHJlYWRfZnJlZWxpc3QoMCkgCisgICAgICB7IH0KKworICAgIHByaXZhdGU6CisgICAgICAvLyBBbiAiYXJyYXkiIG9mIGJpbl9yZWNvcmRzIGVhY2ggb2Ygd2hpY2ggcmVwcmVzZW50cyBhIHNwZWNpZmljCisgICAgICAvLyBwb3dlciBvZiAyIHNpemUuIE1lbW9yeSB0byB0aGlzICJhcnJheSIgaXMgYWxsb2NhdGVkIGluCisgICAgICAvLyBfTV9pbml0aWFsaXplKCkuCisgICAgICBfQmluX3JlY29yZCoJCV9NX2JpbjsKKworICAgICAgLy8gQWN0dWFsIHZhbHVlIGNhbGN1bGF0ZWQgaW4gX01faW5pdGlhbGl6ZSgpLgorICAgICAgc2l6ZV90IAkgICAgICAgCSAgICAgCV9NX2Jpbl9zaXplOworCisgICAgICBfVGhyZWFkX3JlY29yZCogCQlfTV90aHJlYWRfZnJlZWxpc3Q7CisgICAgICB2b2lkKgkJCV9NX3RocmVhZF9mcmVlbGlzdF9pbml0aWFsOworCisgICAgICB2b2lkCisgICAgICBfTV9pbml0aWFsaXplKCk7CisgICAgfTsKKyNlbmRpZgorCisgIHRlbXBsYXRlPHRlbXBsYXRlIDxib29sPiBjbGFzcyBfUG9vbFRwLCBib29sIF9UaHJlYWQ+CisgICAgc3RydWN0IF9fY29tbW9uX3Bvb2wKKyAgICB7CisgICAgICB0eXBlZGVmIF9Qb29sVHA8X1RocmVhZD4gCQlwb29sX3R5cGU7CisgICAgICAKKyAgICAgIHN0YXRpYyBwb29sX3R5cGUmCisgICAgICBfU19nZXRfcG9vbCgpCisgICAgICB7IAorCXN0YXRpYyBwb29sX3R5cGUgX1NfcG9vbDsKKwlyZXR1cm4gX1NfcG9vbDsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHRlbXBsYXRlIDxib29sPiBjbGFzcyBfUG9vbFRwLCBib29sIF9UaHJlYWQ+CisgICAgc3RydWN0IF9fY29tbW9uX3Bvb2xfYmFzZTsKKworICB0ZW1wbGF0ZTx0ZW1wbGF0ZSA8Ym9vbD4gY2xhc3MgX1Bvb2xUcD4KKyAgICBzdHJ1Y3QgX19jb21tb25fcG9vbF9iYXNlPF9Qb29sVHAsIGZhbHNlPiAKKyAgICA6IHB1YmxpYyBfX2NvbW1vbl9wb29sPF9Qb29sVHAsIGZhbHNlPgorICAgIHsKKyAgICAgIHVzaW5nICBfX2NvbW1vbl9wb29sPF9Qb29sVHAsIGZhbHNlPjo6X1NfZ2V0X3Bvb2w7CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19pbml0aWFsaXplX29uY2UoKQorICAgICAgeworCXN0YXRpYyBib29sIF9faW5pdDsKKwlpZiAoX19idWlsdGluX2V4cGVjdChfX2luaXQgPT0gZmFsc2UsIGZhbHNlKSkKKwkgIHsKKwkgICAgX1NfZ2V0X3Bvb2woKS5fTV9pbml0aWFsaXplX29uY2UoKTsgCisJICAgIF9faW5pdCA9IHRydWU7CisJICB9CisgICAgICB9CisgICAgfTsKKworI2lmZGVmIF9fR1RIUkVBRFMKKyAgdGVtcGxhdGU8dGVtcGxhdGUgPGJvb2w+IGNsYXNzIF9Qb29sVHA+CisgICAgc3RydWN0IF9fY29tbW9uX3Bvb2xfYmFzZTxfUG9vbFRwLCB0cnVlPgorICAgIDogcHVibGljIF9fY29tbW9uX3Bvb2w8X1Bvb2xUcCwgdHJ1ZT4KKyAgICB7CisgICAgICB1c2luZyAgX19jb21tb25fcG9vbDxfUG9vbFRwLCB0cnVlPjo6X1NfZ2V0X3Bvb2w7CisgICAgICAKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19pbml0aWFsaXplKCkgCisgICAgICB7IF9TX2dldF9wb29sKCkuX01faW5pdGlhbGl6ZV9vbmNlKCk7IH0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2luaXRpYWxpemVfb25jZSgpCisgICAgICB7IAorCXN0YXRpYyBib29sIF9faW5pdDsKKwlpZiAoX19idWlsdGluX2V4cGVjdChfX2luaXQgPT0gZmFsc2UsIGZhbHNlKSkKKwkgIHsKKwkgICAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCgpKQorCSAgICAgIHsKKwkJLy8gT24gc29tZSBwbGF0Zm9ybXMsIF9fZ3RocmVhZF9vbmNlX3QgaXMgYW4gYWdncmVnYXRlLgorCQlzdGF0aWMgX19ndGhyZWFkX29uY2VfdCBfX29uY2UgPSBfX0dUSFJFQURfT05DRV9JTklUOworCQlfX2d0aHJlYWRfb25jZSgmX19vbmNlLCBfU19pbml0aWFsaXplKTsKKwkgICAgICB9CisKKwkgICAgLy8gRG91YmxlIGNoZWNrIGluaXRpYWxpemF0aW9uLiBNYXkgYmUgbmVjZXNzYXJ5IG9uIHNvbWUKKwkgICAgLy8gc3lzdGVtcyBmb3IgcHJvcGVyIGNvbnN0cnVjdGlvbiB3aGVuIG5vdCBjb21waWxpbmcgd2l0aAorCSAgICAvLyB0aHJlYWQgZmxhZ3MuCisJICAgIF9TX2dldF9wb29sKCkuX01faW5pdGlhbGl6ZV9vbmNlKCk7IAorCSAgICBfX2luaXQgPSB0cnVlOworCSAgfQorICAgICAgfQorICAgIH07CisjZW5kaWYKKworICAvLy8gUG9saWN5IGZvciBzaGFyZWQgX19wb29sIG9iamVjdHMuCisgIHRlbXBsYXRlPHRlbXBsYXRlIDxib29sPiBjbGFzcyBfUG9vbFRwLCBib29sIF9UaHJlYWQ+CisgICAgc3RydWN0IF9fY29tbW9uX3Bvb2xfcG9saWN5IDogcHVibGljIF9fY29tbW9uX3Bvb2xfYmFzZTxfUG9vbFRwLCBfVGhyZWFkPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHRlbXBsYXRlIDxib29sPiBjbGFzcyBfUG9vbFRwMSA9IF9Qb29sVHAsIAorCSAgICAgICBib29sIF9UaHJlYWQxID0gX1RocmVhZD4KKyAgICAgICAgc3RydWN0IF9NX3JlYmluZAorICAgICAgICB7IHR5cGVkZWYgX19jb21tb25fcG9vbF9wb2xpY3k8X1Bvb2xUcDEsIF9UaHJlYWQxPiBvdGhlcjsgfTsKKworICAgICAgdXNpbmcgIF9fY29tbW9uX3Bvb2xfYmFzZTxfUG9vbFRwLCBfVGhyZWFkPjo6X1NfZ2V0X3Bvb2w7CisgICAgICB1c2luZyAgX19jb21tb25fcG9vbF9iYXNlPF9Qb29sVHAsIF9UaHJlYWQ+OjpfU19pbml0aWFsaXplX29uY2U7CisgIH07CisgCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0ZW1wbGF0ZSA8Ym9vbD4gY2xhc3MgX1Bvb2xUcCwgYm9vbCBfVGhyZWFkPgorICAgIHN0cnVjdCBfX3Blcl90eXBlX3Bvb2wKKyAgICB7CisgICAgICB0eXBlZGVmIF9UcCAJCQl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfUG9vbFRwPF9UaHJlYWQ+IAkJcG9vbF90eXBlOworICAgICAgCisgICAgICBzdGF0aWMgcG9vbF90eXBlJgorICAgICAgX1NfZ2V0X3Bvb2woKQorICAgICAgeyAKKwkvLyBTYW5lIGRlZmF1bHRzIGZvciB0aGUgX1Bvb2xUcC4KKwl0eXBlZGVmIHR5cGVuYW1lIHBvb2xfdHlwZTo6X0Jsb2NrX3JlY29yZCBfQmxvY2tfcmVjb3JkOworCWNvbnN0IHN0YXRpYyBzaXplX3QgX19hID0gKF9fYWxpZ25vZl9fKF9UcCkgPj0gc2l6ZW9mKF9CbG9ja19yZWNvcmQpCisJCQkJICAgPyBfX2FsaWdub2ZfXyhfVHApIDogc2l6ZW9mKF9CbG9ja19yZWNvcmQpKTsKKworCXR5cGVkZWYgdHlwZW5hbWUgX19wb29sX2Jhc2U6Ol9UdW5lIF9UdW5lOworCXN0YXRpYyBfVHVuZSBfU190dW5lKF9fYSwgc2l6ZW9mKF9UcCkgKiA2NCwKKwkJCSAgICAgc2l6ZW9mKF9UcCkgKiAyID49IF9fYSA/IHNpemVvZihfVHApICogMiA6IF9fYSwKKwkJCSAgICAgc2l6ZW9mKF9UcCkgKiBzaXplX3QoX1R1bmU6Ol9TX2NodW5rX3NpemUpLAorCQkJICAgICBfVHVuZTo6X1NfbWF4X3RocmVhZHMsCisJCQkgICAgIF9UdW5lOjpfU19mcmVlbGlzdF9oZWFkcm9vbSwKKwkJCSAgICAgc3RkOjpnZXRlbnYoIkdMSUJDWFhfRk9SQ0VfTkVXIikgPyB0cnVlIDogZmFsc2UpOworCXN0YXRpYyBwb29sX3R5cGUgX1NfcG9vbChfU190dW5lKTsKKwlyZXR1cm4gX1NfcG9vbDsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdGVtcGxhdGUgPGJvb2w+IGNsYXNzIF9Qb29sVHAsIGJvb2wgX1RocmVhZD4KKyAgICBzdHJ1Y3QgX19wZXJfdHlwZV9wb29sX2Jhc2U7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0ZW1wbGF0ZSA8Ym9vbD4gY2xhc3MgX1Bvb2xUcD4KKyAgICBzdHJ1Y3QgX19wZXJfdHlwZV9wb29sX2Jhc2U8X1RwLCBfUG9vbFRwLCBmYWxzZT4gCisgICAgOiBwdWJsaWMgX19wZXJfdHlwZV9wb29sPF9UcCwgX1Bvb2xUcCwgZmFsc2U+IAorICAgIHsKKyAgICAgIHVzaW5nICBfX3Blcl90eXBlX3Bvb2w8X1RwLCBfUG9vbFRwLCBmYWxzZT46Ol9TX2dldF9wb29sOworCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfaW5pdGlhbGl6ZV9vbmNlKCkKKyAgICAgIHsKKwlzdGF0aWMgYm9vbCBfX2luaXQ7CisJaWYgKF9fYnVpbHRpbl9leHBlY3QoX19pbml0ID09IGZhbHNlLCBmYWxzZSkpCisJICB7CisJICAgIF9TX2dldF9wb29sKCkuX01faW5pdGlhbGl6ZV9vbmNlKCk7IAorCSAgICBfX2luaXQgPSB0cnVlOworCSAgfQorICAgICAgfQorICAgIH07CisKKyAjaWZkZWYgX19HVEhSRUFEUworIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdGVtcGxhdGUgPGJvb2w+IGNsYXNzIF9Qb29sVHA+CisgICAgc3RydWN0IF9fcGVyX3R5cGVfcG9vbF9iYXNlPF9UcCwgX1Bvb2xUcCwgdHJ1ZT4gCisgICAgOiBwdWJsaWMgX19wZXJfdHlwZV9wb29sPF9UcCwgX1Bvb2xUcCwgdHJ1ZT4gCisgICAgeworICAgICAgdXNpbmcgIF9fcGVyX3R5cGVfcG9vbDxfVHAsIF9Qb29sVHAsIHRydWU+OjpfU19nZXRfcG9vbDsKKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2luaXRpYWxpemUoKSAKKyAgICAgIHsgX1NfZ2V0X3Bvb2woKS5fTV9pbml0aWFsaXplX29uY2UoKTsgfQorCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfaW5pdGlhbGl6ZV9vbmNlKCkKKyAgICAgIHsgCisJc3RhdGljIGJvb2wgX19pbml0OworCWlmIChfX2J1aWx0aW5fZXhwZWN0KF9faW5pdCA9PSBmYWxzZSwgZmFsc2UpKQorCSAgeworCSAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wKCkpCisJICAgICAgeworCQkvLyBPbiBzb21lIHBsYXRmb3JtcywgX19ndGhyZWFkX29uY2VfdCBpcyBhbiBhZ2dyZWdhdGUuCisJCXN0YXRpYyBfX2d0aHJlYWRfb25jZV90IF9fb25jZSA9IF9fR1RIUkVBRF9PTkNFX0lOSVQ7CisJCV9fZ3RocmVhZF9vbmNlKCZfX29uY2UsIF9TX2luaXRpYWxpemUpOworCSAgICAgIH0KKworCSAgICAvLyBEb3VibGUgY2hlY2sgaW5pdGlhbGl6YXRpb24uIE1heSBiZSBuZWNlc3Nhcnkgb24gc29tZQorCSAgICAvLyBzeXN0ZW1zIGZvciBwcm9wZXIgY29uc3RydWN0aW9uIHdoZW4gbm90IGNvbXBpbGluZyB3aXRoCisJICAgIC8vIHRocmVhZCBmbGFncy4KKwkgICAgX1NfZ2V0X3Bvb2woKS5fTV9pbml0aWFsaXplX29uY2UoKTsgCisJICAgIF9faW5pdCA9IHRydWU7CisJICB9CisgICAgICB9CisgICAgfTsKKyNlbmRpZgorCisgIC8vLyBQb2xpY3kgZm9yIGluZGl2aWR1YWwgX19wb29sIG9iamVjdHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdGVtcGxhdGUgPGJvb2w+IGNsYXNzIF9Qb29sVHAsIGJvb2wgX1RocmVhZD4KKyAgICBzdHJ1Y3QgX19wZXJfdHlwZV9wb29sX3BvbGljeSAKKyAgICA6IHB1YmxpYyBfX3Blcl90eXBlX3Bvb2xfYmFzZTxfVHAsIF9Qb29sVHAsIF9UaHJlYWQ+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdGVtcGxhdGUgPGJvb2w+IGNsYXNzIF9Qb29sVHAxID0gX1Bvb2xUcCwgCisJICAgICAgIGJvb2wgX1RocmVhZDEgPSBfVGhyZWFkPgorICAgICAgICBzdHJ1Y3QgX01fcmViaW5kCisgICAgICAgIHsgdHlwZWRlZiBfX3Blcl90eXBlX3Bvb2xfcG9saWN5PF9UcDEsIF9Qb29sVHAxLCBfVGhyZWFkMT4gb3RoZXI7IH07CisKKyAgICAgIHVzaW5nICBfX3Blcl90eXBlX3Bvb2xfYmFzZTxfVHAsIF9Qb29sVHAsIF9UaHJlYWQ+OjpfU19nZXRfcG9vbDsKKyAgICAgIHVzaW5nICBfX3Blcl90eXBlX3Bvb2xfYmFzZTxfVHAsIF9Qb29sVHAsIF9UaHJlYWQ+OjpfU19pbml0aWFsaXplX29uY2U7CisgIH07CisKKworICAvLy8gQmFzZSBjbGFzcyBmb3IgX1RwIGRlcGVuZGVudCBtZW1iZXIgZnVuY3Rpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgX19tdF9hbGxvY19iYXNlIAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHNpemVfdCAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAqICAgICAgICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIF9UcCYgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAmICAgICAgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjEwMy4gcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQKKyAgICAgIHR5cGVkZWYgc3RkOjp0cnVlX3R5cGUgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ7CisjZW5kaWYKKworICAgICAgcG9pbnRlcgorICAgICAgYWRkcmVzcyhyZWZlcmVuY2UgX194KSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3gpOyB9CisKKyAgICAgIGNvbnN0X3BvaW50ZXIKKyAgICAgIGFkZHJlc3MoY29uc3RfcmVmZXJlbmNlIF9feCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX194KTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QgX0dMSUJDWFhfVVNFX05PRVhDRVBUIAorICAgICAgeyByZXR1cm4gc2l6ZV90KC0xKSAvIHNpemVvZihfVHApOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXAsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGNvbnN0cnVjdChfVXAqIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyA6Om5ldygodm9pZCAqKV9fcCkgX1VwKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICB2b2lkIAorICAgICAgICBkZXN0cm95KF9VcCogX19wKSB7IF9fcC0+fl9VcCgpOyB9CisjZWxzZQorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDAyLiB3cm9uZyBuZXcgZXhwcmVzc2lvbiBpbiBbc29tZV9dIGFsbG9jYXRvcjo6Y29uc3RydWN0CisgICAgICB2b2lkIAorICAgICAgY29uc3RydWN0KHBvaW50ZXIgX19wLCBjb25zdCBfVHAmIF9fdmFsKSAKKyAgICAgIHsgOjpuZXcoKHZvaWQgKilfX3ApIF9UcChfX3ZhbCk7IH0KKworICAgICAgdm9pZCAKKyAgICAgIGRlc3Ryb3kocG9pbnRlciBfX3ApIHsgX19wLT5+X1RwKCk7IH0KKyNlbmRpZgorICAgIH07CisKKyNpZmRlZiBfX0dUSFJFQURTCisjZGVmaW5lIF9fdGhyZWFkX2RlZmF1bHQgdHJ1ZQorI2Vsc2UKKyNkZWZpbmUgX190aHJlYWRfZGVmYXVsdCBmYWxzZQorI2VuZGlmCisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRoaXMgaXMgYSBmaXhlZCBzaXplIChwb3dlciBvZiAyKSBhbGxvY2F0b3Igd2hpY2ggLSB3aGVuCisgICAqICBjb21waWxlZCB3aXRoIHRocmVhZCBzdXBwb3J0IC0gd2lsbCBtYWludGFpbiBvbmUgZnJlZWxpc3QgcGVyCisgICAqICBzaXplIHBlciB0aHJlYWQgcGx1cyBhIEBhIGdsb2JhbCBvbmUuIFN0ZXBzIGFyZSB0YWtlbiB0byBsaW1pdAorICAgKiAgdGhlIHBlciB0aHJlYWQgZnJlZWxpc3Qgc2l6ZXMgKGJ5IHJldHVybmluZyBleGNlc3MgYmFjayB0bworICAgKiAgdGhlIEBhIGdsb2JhbCBsaXN0KS4KKyAgICogIEBpbmdyb3VwIGFsbG9jYXRvcnMKKyAgICoKKyAgICogIEZ1cnRoZXIgZGV0YWlsczoKKyAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MTJjaDMyLmh0bWwKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgCisJICAgdHlwZW5hbWUgX1Bvb2xwID0gX19jb21tb25fcG9vbF9wb2xpY3k8X19wb29sLCBfX3RocmVhZF9kZWZhdWx0PiA+CisgICAgY2xhc3MgX19tdF9hbGxvYyA6IHB1YmxpYyBfX210X2FsbG9jX2Jhc2U8X1RwPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHNpemVfdCAgICAgICAgICAgICAgICAgICAgCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAJZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfVHAqICAgICAgICAgICAgICAgICAgICAgIAlwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAqICAgICAgICAgICAgICAgIAljb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBfVHAmICAgICAgICAgICAgICAgICAgICAgIAlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCYgICAgICAgICAgICAgICAgCWNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1Bvb2xwICAgICAgCQkJX19wb2xpY3lfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1Bvb2xwOjpwb29sX3R5cGUJX19wb29sX3R5cGU7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9Qb29scDEgPSBfUG9vbHA+CisgICAgICAgIHN0cnVjdCByZWJpbmQKKyAgICAgICAgeyAKKwkgIHR5cGVkZWYgdHlwZW5hbWUgX1Bvb2xwMTo6dGVtcGxhdGUgX01fcmViaW5kPF9UcDE+OjpvdGhlciBwb2xfdHlwZTsKKwkgIHR5cGVkZWYgX19tdF9hbGxvYzxfVHAxLCBwb2xfdHlwZT4gb3RoZXI7CisJfTsKKworICAgICAgX19tdF9hbGxvYygpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IH0KKworICAgICAgX19tdF9hbGxvYyhjb25zdCBfX210X2FsbG9jJikgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfUG9vbHAxPgorICAgICAgICBfX210X2FsbG9jKGNvbnN0IF9fbXRfYWxsb2M8X1RwMSwgX1Bvb2xwMT4mKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisKKyAgICAgIH5fX210X2FsbG9jKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgfQorCisgICAgICBwb2ludGVyCisgICAgICBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCBjb25zdCB2b2lkKiA9IDApOworCisgICAgICB2b2lkCisgICAgICBkZWFsbG9jYXRlKHBvaW50ZXIgX19wLCBzaXplX3R5cGUgX19uKTsKKworICAgICAgY29uc3QgX19wb29sX2Jhc2U6Ol9UdW5lCisgICAgICBfTV9nZXRfb3B0aW9ucygpCisgICAgICB7IAorCS8vIFJldHVybiBhIGNvcHksIG5vdCBhIHJlZmVyZW5jZSwgZm9yIGV4dGVybmFsIGNvbnN1bXB0aW9uLgorCXJldHVybiBfX3BvbGljeV90eXBlOjpfU19nZXRfcG9vbCgpLl9NX2dldF9vcHRpb25zKCk7CisgICAgICB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX3NldF9vcHRpb25zKF9fcG9vbF9iYXNlOjpfVHVuZSBfX3QpCisgICAgICB7IF9fcG9saWN5X3R5cGU6Ol9TX2dldF9wb29sKCkuX01fc2V0X29wdGlvbnMoX190KTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUG9vbHA+CisgICAgdHlwZW5hbWUgX19tdF9hbGxvYzxfVHAsIF9Qb29scD46OnBvaW50ZXIKKyAgICBfX210X2FsbG9jPF9UcCwgX1Bvb2xwPjo6CisgICAgYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgY29uc3Qgdm9pZCopCisgICAgeworICAgICAgaWYgKF9fbiA+IHRoaXMtPm1heF9zaXplKCkpCisJc3RkOjpfX3Rocm93X2JhZF9hbGxvYygpOworCisgICAgICBfX3BvbGljeV90eXBlOjpfU19pbml0aWFsaXplX29uY2UoKTsKKworICAgICAgLy8gUmVxdWVzdHMgbGFyZ2VyIHRoYW4gX01fbWF4X2J5dGVzIGFyZSBoYW5kbGVkIGJ5IG9wZXJhdG9yCisgICAgICAvLyBuZXcvZGVsZXRlIGRpcmVjdGx5LgorICAgICAgX19wb29sX3R5cGUmIF9fcG9vbCA9IF9fcG9saWN5X3R5cGU6Ol9TX2dldF9wb29sKCk7CisgICAgICBjb25zdCBzaXplX3QgX19ieXRlcyA9IF9fbiAqIHNpemVvZihfVHApOworICAgICAgaWYgKF9fcG9vbC5fTV9jaGVja190aHJlc2hvbGQoX19ieXRlcykpCisJeworCSAgdm9pZCogX19yZXQgPSA6Om9wZXJhdG9yIG5ldyhfX2J5dGVzKTsKKwkgIHJldHVybiBzdGF0aWNfY2FzdDxfVHAqPihfX3JldCk7CisJfQorICAgICAgCisgICAgICAvLyBSb3VuZCB1cCB0byBwb3dlciBvZiAyIGFuZCBmaWd1cmUgb3V0IHdoaWNoIGJpbiB0byB1c2UuCisgICAgICBjb25zdCBzaXplX3QgX193aGljaCA9IF9fcG9vbC5fTV9nZXRfYmlubWFwKF9fYnl0ZXMpOworICAgICAgY29uc3Qgc2l6ZV90IF9fdGhyZWFkX2lkID0gX19wb29sLl9NX2dldF90aHJlYWRfaWQoKTsKKyAgICAgIAorICAgICAgLy8gRmluZCBvdXQgaWYgd2UgaGF2ZSBibG9ja3Mgb24gb3VyIGZyZWVsaXN0LiAgSWYgc28sIGdvIGFoZWFkCisgICAgICAvLyBhbmQgdXNlIHRoZW0gZGlyZWN0bHkgd2l0aG91dCBoYXZpbmcgdG8gbG9jayBhbnl0aGluZy4KKyAgICAgIGNoYXIqIF9fYzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19wb29sX3R5cGU6Ol9CaW5fcmVjb3JkIF9CaW5fcmVjb3JkOworICAgICAgY29uc3QgX0Jpbl9yZWNvcmQmIF9fYmluID0gX19wb29sLl9NX2dldF9iaW4oX193aGljaCk7CisgICAgICBpZiAoX19iaW4uX01fZmlyc3RbX190aHJlYWRfaWRdKQorCXsKKwkgIC8vIEFscmVhZHkgcmVzZXJ2ZWQuCisJICB0eXBlZGVmIHR5cGVuYW1lIF9fcG9vbF90eXBlOjpfQmxvY2tfcmVjb3JkIF9CbG9ja19yZWNvcmQ7CisJICBfQmxvY2tfcmVjb3JkKiBfX2Jsb2NrID0gX19iaW4uX01fZmlyc3RbX190aHJlYWRfaWRdOworCSAgX19iaW4uX01fZmlyc3RbX190aHJlYWRfaWRdID0gX19ibG9jay0+X01fbmV4dDsKKwkgIAorCSAgX19wb29sLl9NX2FkanVzdF9mcmVlbGlzdChfX2JpbiwgX19ibG9jaywgX190aHJlYWRfaWQpOworCSAgX19jID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oX19ibG9jaykgKyBfX3Bvb2wuX01fZ2V0X2FsaWduKCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8vIE51bGwsIHJlc2VydmUuCisJICBfX2MgPSBfX3Bvb2wuX01fcmVzZXJ2ZV9ibG9jayhfX2J5dGVzLCBfX3RocmVhZF9pZCk7CisJfQorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9UcCo+KHN0YXRpY19jYXN0PHZvaWQqPihfX2MpKTsKKyAgICB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Qb29scD4KKyAgICB2b2lkCisgICAgX19tdF9hbGxvYzxfVHAsIF9Qb29scD46OgorICAgIGRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoX19wICE9IDAsIHRydWUpKQorCXsKKwkgIC8vIFJlcXVlc3RzIGxhcmdlciB0aGFuIF9NX21heF9ieXRlcyBhcmUgaGFuZGxlZCBieQorCSAgLy8gb3BlcmF0b3JzIG5ldy9kZWxldGUgZGlyZWN0bHkuCisJICBfX3Bvb2xfdHlwZSYgX19wb29sID0gX19wb2xpY3lfdHlwZTo6X1NfZ2V0X3Bvb2woKTsKKwkgIGNvbnN0IHNpemVfdCBfX2J5dGVzID0gX19uICogc2l6ZW9mKF9UcCk7CisJICBpZiAoX19wb29sLl9NX2NoZWNrX3RocmVzaG9sZChfX2J5dGVzKSkKKwkgICAgOjpvcGVyYXRvciBkZWxldGUoX19wKTsKKwkgIGVsc2UKKwkgICAgX19wb29sLl9NX3JlY2xhaW1fYmxvY2socmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oX19wKSwgX19ieXRlcyk7CisJfQorICAgIH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1Bvb2xwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfX210X2FsbG9jPF9UcCwgX1Bvb2xwPiYsIGNvbnN0IF9fbXRfYWxsb2M8X1RwLCBfUG9vbHA+JikKKyAgICB7IHJldHVybiB0cnVlOyB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Qb29scD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX19tdF9hbGxvYzxfVHAsIF9Qb29scD4mLCBjb25zdCBfX210X2FsbG9jPF9UcCwgX1Bvb2xwPiYpCisgICAgeyByZXR1cm4gZmFsc2U7IH0KKworI3VuZGVmIF9fdGhyZWFkX2RlZmF1bHQKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L25ld19hbGxvY2F0b3IuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L25ld19hbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODY2ZmVkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvbmV3X2FsbG9jYXRvci5oCkBAIC0wLDAgKzEsMTUwIEBACisvLyBBbGxvY2F0b3IgdGhhdCB3cmFwcyBvcGVyYXRvciBuZXcgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9uZXdfYWxsb2NhdG9yLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9ORVdfQUxMT0NBVE9SX0gKKyNkZWZpbmUgX05FV19BTExPQ0FUT1JfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+CisjaW5jbHVkZSA8Yml0cy9tb3ZlLmg+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2VuZGlmCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyBzdGQ6OnNpemVfdDsKKyAgdXNpbmcgc3RkOjpwdHJkaWZmX3Q7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEFuIGFsbG9jYXRvciB0aGF0IHVzZXMgZ2xvYmFsIG5ldywgYXMgcGVyIFsyMC40XS4KKyAgICogIEBpbmdyb3VwIGFsbG9jYXRvcnMKKyAgICoKKyAgICogIFRoaXMgaXMgcHJlY2lzZWx5IHRoZSBhbGxvY2F0b3IgZGVmaW5lZCBpbiB0aGUgQysrIFN0YW5kYXJkLiAKKyAgICogICAgLSBhbGwgYWxsb2NhdGlvbiBjYWxscyBvcGVyYXRvciBuZXcKKyAgICogICAgLSBhbGwgZGVhbGxvY2F0aW9uIGNhbGxzIG9wZXJhdG9yIGRlbGV0ZQorICAgKgorICAgKiAgQHRwYXJhbSAgX1RwICBUeXBlIG9mIGFsbG9jYXRlZCBvYmplY3QuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgbmV3X2FsbG9jYXRvcgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHNpemVfdCAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwKiAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAqIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIF9UcCYgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICB2YWx1ZV90eXBlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBzdHJ1Y3QgcmViaW5kCisgICAgICAgIHsgdHlwZWRlZiBuZXdfYWxsb2NhdG9yPF9UcDE+IG90aGVyOyB9OworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjEwMy4gcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQKKyAgICAgIHR5cGVkZWYgc3RkOjp0cnVlX3R5cGUgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ7CisjZW5kaWYKKworICAgICAgbmV3X2FsbG9jYXRvcigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IH0KKworICAgICAgbmV3X2FsbG9jYXRvcihjb25zdCBuZXdfYWxsb2NhdG9yJikgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBuZXdfYWxsb2NhdG9yKGNvbnN0IG5ld19hbGxvY2F0b3I8X1RwMT4mKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisKKyAgICAgIH5uZXdfYWxsb2NhdG9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgfQorCisgICAgICBwb2ludGVyCisgICAgICBhZGRyZXNzKHJlZmVyZW5jZSBfX3gpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9feCk7IH0KKworICAgICAgY29uc3RfcG9pbnRlcgorICAgICAgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3gpOyB9CisKKyAgICAgIC8vIE5COiBfX24gaXMgcGVybWl0dGVkIHRvIGJlIDAuICBUaGUgQysrIHN0YW5kYXJkIHNheXMgbm90aGluZworICAgICAgLy8gYWJvdXQgd2hhdCB0aGUgcmV0dXJuIHZhbHVlIGlzIHdoZW4gX19uID09IDAuCisgICAgICBwb2ludGVyCisgICAgICBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCBjb25zdCB2b2lkKiA9IDApCisgICAgICB7IAorCWlmIChfX24gPiB0aGlzLT5tYXhfc2l6ZSgpKQorCSAgc3RkOjpfX3Rocm93X2JhZF9hbGxvYygpOworCisJcmV0dXJuIHN0YXRpY19jYXN0PF9UcCo+KDo6b3BlcmF0b3IgbmV3KF9fbiAqIHNpemVvZihfVHApKSk7CisgICAgICB9CisKKyAgICAgIC8vIF9fcCBpcyBub3QgcGVybWl0dGVkIHRvIGJlIGEgbnVsbCBwb2ludGVyLgorICAgICAgdm9pZAorICAgICAgZGVhbGxvY2F0ZShwb2ludGVyIF9fcCwgc2l6ZV90eXBlKQorICAgICAgeyA6Om9wZXJhdG9yIGRlbGV0ZShfX3ApOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdCBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHNpemVfdCgtMSkgLyBzaXplb2YoX1RwKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBjb25zdHJ1Y3QoX1VwKiBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsgOjpuZXcoKHZvaWQgKilfX3ApIF9VcChzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgdm9pZCAKKyAgICAgICAgZGVzdHJveShfVXAqIF9fcCkgeyBfX3AtPn5fVXAoKTsgfQorI2Vsc2UKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQwMi4gd3JvbmcgbmV3IGV4cHJlc3Npb24gaW4gW3NvbWVfXSBhbGxvY2F0b3I6OmNvbnN0cnVjdAorICAgICAgdm9pZCAKKyAgICAgIGNvbnN0cnVjdChwb2ludGVyIF9fcCwgY29uc3QgX1RwJiBfX3ZhbCkgCisgICAgICB7IDo6bmV3KCh2b2lkICopX19wKSBfVHAoX192YWwpOyB9CisKKyAgICAgIHZvaWQgCisgICAgICBkZXN0cm95KHBvaW50ZXIgX19wKSB7IF9fcC0+fl9UcCgpOyB9CisjZW5kaWYKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgbmV3X2FsbG9jYXRvcjxfVHA+JiwgY29uc3QgbmV3X2FsbG9jYXRvcjxfVHA+JikKKyAgICB7IHJldHVybiB0cnVlOyB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IG5ld19hbGxvY2F0b3I8X1RwPiYsIGNvbnN0IG5ld19hbGxvY2F0b3I8X1RwPiYpCisgICAgeyByZXR1cm4gZmFsc2U7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L251bWVyaWMgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9udW1lcmljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOWRmNzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9udW1lcmljCkBAIC0wLDAgKzEsMTUyIEBACisvLyBOdW1lcmljIGV4dGVuc2lvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAyLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBleHQvbnVtZXJpYworICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IChwb3NzaWJseQorICogIGNvbnRhaW5pbmcgZXh0ZW5zaW9ucyBmcm9tIHRoZSBIUC9TR0kgU1RMIHN1YnNldCkuIAorICovCisKKyNpZm5kZWYgX0VYVF9OVU1FUklDCisjZGVmaW5lIF9FWFRfTlVNRVJJQyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorI2luY2x1ZGUgPG51bWVyaWM+CisKKyNpbmNsdWRlIDxleHQvZnVuY3Rpb25hbD4gLy8gRm9yIGlkZW50aXR5X2VsZW1lbnQKKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFJldHVybnMgX194ICoqIF9fbiwgd2hlcmUgX19uID49IDAuICBfTm90ZSB0aGF0ICJtdWx0aXBsaWNhdGlvbiIKKyAgLy8gaXMgcmVxdWlyZWQgdG8gYmUgYXNzb2NpYXRpdmUsIGJ1dCBub3QgbmVjZXNzYXJpbHkgY29tbXV0YXRpdmUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0ludGVnZXIsIHR5cGVuYW1lIF9Nb25vaWRPcGVyYXRpb24+CisgICAgX1RwCisgICAgX19wb3dlcihfVHAgX194LCBfSW50ZWdlciBfX24sIF9Nb25vaWRPcGVyYXRpb24gX19tb25vaWRfb3ApCisgICAgeworICAgICAgaWYgKF9fbiA9PSAwKQorCXJldHVybiBpZGVudGl0eV9lbGVtZW50KF9fbW9ub2lkX29wKTsKKyAgICAgIGVsc2UKKwl7CisJICB3aGlsZSAoKF9fbiAmIDEpID09IDApCisJICAgIHsKKwkgICAgICBfX24gPj49IDE7CisJICAgICAgX194ID0gX19tb25vaWRfb3AoX194LCBfX3gpOworCSAgICB9CisKKwkgIF9UcCBfX3Jlc3VsdCA9IF9feDsKKwkgIF9fbiA+Pj0gMTsKKwkgIHdoaWxlIChfX24gIT0gMCkKKwkgICAgeworCSAgICAgIF9feCA9IF9fbW9ub2lkX29wKF9feCwgX194KTsKKwkgICAgICBpZiAoKF9fbiAmIDEpICE9IDApCisJCV9fcmVzdWx0ID0gX19tb25vaWRfb3AoX19yZXN1bHQsIF9feCk7CisJICAgICAgX19uID4+PSAxOworCSAgICB9CisJICByZXR1cm4gX19yZXN1bHQ7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9JbnRlZ2VyPgorICAgIGlubGluZSBfVHAKKyAgICBfX3Bvd2VyKF9UcCBfX3gsIF9JbnRlZ2VyIF9fbikKKyAgICB7IHJldHVybiBfX3Bvd2VyKF9feCwgX19uLCBzdGQ6Om11bHRpcGxpZXM8X1RwPigpKTsgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgKi8KKyAgLy8gQWxpYXMgZm9yIHRoZSBpbnRlcm5hbCBuYW1lIF9fcG93ZXIuICBOb3RlIHRoYXQgcG93ZXIgaXMgYW4gZXh0ZW5zaW9uLAorICAvLyBub3QgcGFydCBvZiB0aGUgQysrIHN0YW5kYXJkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9JbnRlZ2VyLCB0eXBlbmFtZSBfTW9ub2lkT3BlcmF0aW9uPgorICAgIGlubGluZSBfVHAKKyAgICBwb3dlcihfVHAgX194LCBfSW50ZWdlciBfX24sIF9Nb25vaWRPcGVyYXRpb24gX19tb25vaWRfb3ApCisgICAgeyByZXR1cm4gX19wb3dlcihfX3gsIF9fbiwgX19tb25vaWRfb3ApOyB9CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAZG9jdG9kbworICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9JbnRlZ2VyPgorICAgIGlubGluZSBfVHAKKyAgICBwb3dlcihfVHAgX194LCBfSW50ZWdlciBfX24pCisgICAgeyByZXR1cm4gX19wb3dlcihfX3gsIF9fbik7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdXNpbmcgc3RkOjppb3RhOworI2Vsc2UKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAZG9jdG9kbworICAqLworICAvLyBpb3RhIGlzIG5vdCBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQuICBJdCBpcyBhbiBleHRlbnNpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBpb3RhKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBfVHAgX192YWx1ZSkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9UcCwKKwkgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyPjo6dmFsdWVfdHlwZT4pCisKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwkqX19maXJzdCsrID0gX192YWx1ZSsrOworICAgIH0KKyNlbmRpZiAgLy8gQysrMTEKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L251bWVyaWNfdHJhaXRzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9udW1lcmljX3RyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYzE5ODYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9udW1lcmljX3RyYWl0cy5oCkBAIC0wLDAgKzEsMTM4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L251bWVyaWNfdHJhaXRzLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9FWFRfTlVNRVJJQ19UUkFJVFMKKyNkZWZpbmUgX0VYVF9OVU1FUklDX1RSQUlUUyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvY3BwX3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBDb21waWxlIHRpbWUgY29uc3RhbnRzIGZvciBidWlsdGluIHR5cGVzLgorICAvLyBTYWRseSBzdGQ6Om51bWVyaWNfbGltaXRzIG1lbWJlciBmdW5jdGlvbnMgY2Fubm90IGJlIHVzZWQgZm9yIHRoaXMuCisjZGVmaW5lIF9fZ2xpYmN4eF9zaWduZWQoX1RwKSAoKF9UcCkoLTEpIDwgMCkKKyNkZWZpbmUgX19nbGliY3h4X2RpZ2l0cyhfVHApIFwKKyAgKHNpemVvZihfVHApICogX19DSEFSX0JJVF9fIC0gX19nbGliY3h4X3NpZ25lZChfVHApKQorCisjZGVmaW5lIF9fZ2xpYmN4eF9taW4oX1RwKSBcCisgIChfX2dsaWJjeHhfc2lnbmVkKF9UcCkgPyAoX1RwKTEgPDwgX19nbGliY3h4X2RpZ2l0cyhfVHApIDogKF9UcCkwKQorCisjZGVmaW5lIF9fZ2xpYmN4eF9tYXgoX1RwKSBcCisgIChfX2dsaWJjeHhfc2lnbmVkKF9UcCkgPyBcCisgICAoKCgoKF9UcCkxIDw8IChfX2dsaWJjeHhfZGlnaXRzKF9UcCkgLSAxKSkgLSAxKSA8PCAxKSArIDEpIDogfihfVHApMCkKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWU+CisgICAgc3RydWN0IF9fbnVtZXJpY190cmFpdHNfaW50ZWdlcgorICAgIHsKKyAgICAgIC8vIE9ubHkgaW50ZWdlcnMgZm9yIGluaXRpYWxpemF0aW9uIG9mIG1lbWJlciBjb25zdGFudC4KKyAgICAgIHN0YXRpYyBjb25zdCBfVmFsdWUgX19taW4gPSBfX2dsaWJjeHhfbWluKF9WYWx1ZSk7CisgICAgICBzdGF0aWMgY29uc3QgX1ZhbHVlIF9fbWF4ID0gX19nbGliY3h4X21heChfVmFsdWUpOworCisgICAgICAvLyBOQjogdGhlc2UgdHdvIGFsc28gYXZhaWxhYmxlIGluIHN0ZDo6bnVtZXJpY19saW1pdHMgYXMgY29tcGlsZQorICAgICAgLy8gdGltZSBjb25zdGFudHMsIGJ1dCA8bGltaXRzPiBpcyBiaWcgYW5kIHdlIGF2b2lkIGluY2x1ZGluZyBpdC4KKyAgICAgIHN0YXRpYyBjb25zdCBib29sIF9faXNfc2lnbmVkID0gX19nbGliY3h4X3NpZ25lZChfVmFsdWUpOworICAgICAgc3RhdGljIGNvbnN0IGludCBfX2RpZ2l0cyA9IF9fZ2xpYmN4eF9kaWdpdHMoX1ZhbHVlKTsgICAgICAKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZT4KKyAgICBjb25zdCBfVmFsdWUgX19udW1lcmljX3RyYWl0c19pbnRlZ2VyPF9WYWx1ZT46Ol9fbWluOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZT4KKyAgICBjb25zdCBfVmFsdWUgX19udW1lcmljX3RyYWl0c19pbnRlZ2VyPF9WYWx1ZT46Ol9fbWF4OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZT4KKyAgICBjb25zdCBib29sIF9fbnVtZXJpY190cmFpdHNfaW50ZWdlcjxfVmFsdWU+OjpfX2lzX3NpZ25lZDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWU+CisgICAgY29uc3QgaW50IF9fbnVtZXJpY190cmFpdHNfaW50ZWdlcjxfVmFsdWU+OjpfX2RpZ2l0czsKKworI3VuZGVmIF9fZ2xpYmN4eF9zaWduZWQKKyN1bmRlZiBfX2dsaWJjeHhfZGlnaXRzCisjdW5kZWYgX19nbGliY3h4X21pbgorI3VuZGVmIF9fZ2xpYmN4eF9tYXgKKworI2RlZmluZSBfX2dsaWJjeHhfZmxvYXRpbmcoX1RwLCBfRnZhbCwgX0R2YWwsIF9MRHZhbCkgXAorICAoc3RkOjpfX2FyZV9zYW1lPF9UcCwgZmxvYXQ+OjpfX3ZhbHVlID8gX0Z2YWwgXAorICAgOiBzdGQ6Ol9fYXJlX3NhbWU8X1RwLCBkb3VibGU+OjpfX3ZhbHVlID8gX0R2YWwgOiBfTER2YWwpCisKKyNkZWZpbmUgX19nbGliY3h4X21heF9kaWdpdHMxMChfVHApIFwKKyAgKDIgKyBfX2dsaWJjeHhfZmxvYXRpbmcoX1RwLCBfX0ZMVF9NQU5UX0RJR19fLCBfX0RCTF9NQU5UX0RJR19fLCBcCisJCQkgIF9fTERCTF9NQU5UX0RJR19fKSAqIDY0M0wgLyAyMTM2KQorCisjZGVmaW5lIF9fZ2xpYmN4eF9kaWdpdHMxMChfVHApIFwKKyAgX19nbGliY3h4X2Zsb2F0aW5nKF9UcCwgX19GTFRfRElHX18sIF9fREJMX0RJR19fLCBfX0xEQkxfRElHX18pCisKKyNkZWZpbmUgX19nbGliY3h4X21heF9leHBvbmVudDEwKF9UcCkgXAorICBfX2dsaWJjeHhfZmxvYXRpbmcoX1RwLCBfX0ZMVF9NQVhfMTBfRVhQX18sIF9fREJMX01BWF8xMF9FWFBfXywgXAorCQkgICAgIF9fTERCTF9NQVhfMTBfRVhQX18pCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlPgorICAgIHN0cnVjdCBfX251bWVyaWNfdHJhaXRzX2Zsb2F0aW5nCisgICAgeworICAgICAgLy8gT25seSBmbG9hdGluZyBwb2ludCB0eXBlcy4gU2VlIE4xODIyLiAKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgX19tYXhfZGlnaXRzMTAgPSBfX2dsaWJjeHhfbWF4X2RpZ2l0czEwKF9WYWx1ZSk7CisKKyAgICAgIC8vIFNlZSBhYm92ZSBjb21tZW50Li4uCisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBfX2lzX3NpZ25lZCA9IHRydWU7CisgICAgICBzdGF0aWMgY29uc3QgaW50IF9fZGlnaXRzMTAgPSBfX2dsaWJjeHhfZGlnaXRzMTAoX1ZhbHVlKTsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgX19tYXhfZXhwb25lbnQxMCA9IF9fZ2xpYmN4eF9tYXhfZXhwb25lbnQxMChfVmFsdWUpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlPgorICAgIGNvbnN0IGludCBfX251bWVyaWNfdHJhaXRzX2Zsb2F0aW5nPF9WYWx1ZT46Ol9fbWF4X2RpZ2l0czEwOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZT4KKyAgICBjb25zdCBib29sIF9fbnVtZXJpY190cmFpdHNfZmxvYXRpbmc8X1ZhbHVlPjo6X19pc19zaWduZWQ7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlPgorICAgIGNvbnN0IGludCBfX251bWVyaWNfdHJhaXRzX2Zsb2F0aW5nPF9WYWx1ZT46Ol9fZGlnaXRzMTA7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlPgorICAgIGNvbnN0IGludCBfX251bWVyaWNfdHJhaXRzX2Zsb2F0aW5nPF9WYWx1ZT46Ol9fbWF4X2V4cG9uZW50MTA7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlPgorICAgIHN0cnVjdCBfX251bWVyaWNfdHJhaXRzCisgICAgOiBwdWJsaWMgX19jb25kaXRpb25hbF90eXBlPHN0ZDo6X19pc19pbnRlZ2VyPF9WYWx1ZT46Ol9fdmFsdWUsCisJCQkJX19udW1lcmljX3RyYWl0c19pbnRlZ2VyPF9WYWx1ZT4sCisJCQkJX19udW1lcmljX3RyYWl0c19mbG9hdGluZzxfVmFsdWU+ID46Ol9fdHlwZQorICAgIHsgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjdW5kZWYgX19nbGliY3h4X2Zsb2F0aW5nCisjdW5kZWYgX19nbGliY3h4X21heF9kaWdpdHMxMAorI3VuZGVmIF9fZ2xpYmN4eF9kaWdpdHMxMAorI3VuZGVmIF9fZ2xpYmN4eF9tYXhfZXhwb25lbnQxMAorCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTZlYmExCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcApAQCAtMCwwICsxLDg2MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBhc3NvY19jb250YWluZXIuaHBwCisgKiBDb250YWlucyBhc3NvY2lhdGl2ZSBjb250YWluZXJzLgorICovCisKKyNpZm5kZWYgUEJfRFNfQVNTT0NfQ05UTlJfSFBQCisjZGVmaW5lIFBCX0RTX0FTU09DX0NOVE5SX0hQUAorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxleHQvdHlwZWxpc3QuaD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvdGFnX2FuZF90cmFpdC5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9zdGFuZGFyZF9wb2xpY2llcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jb250YWluZXJfYmFzZV9kaXNwYXRjaC5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9icmFuY2hfcG9saWN5L3RyYWl0cy5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIC8qKgorICAgKiAgQGRlZmdyb3VwIGNvbnRhaW5lcnMtcGJkcyBDb250YWluZXJzCisgICAqICBAaW5ncm91cCBwYmRzCisgICAqICBAeworICAgKi8KKworICAvKioKKyAgICogIEBkZWZncm91cCBoYXNoLWJhc2VkIEhhc2gtQmFzZWQKKyAgICogIEBpbmdyb3VwIGNvbnRhaW5lcnMtcGJkcworICAgKiAgQHsKKyAgICovCisjZGVmaW5lIFBCX0RTX0hBU0hfQkFTRSBcCisgIGRldGFpbDo6Y29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8S2V5LCBNYXBwZWQsIF9BbGxvYywgVGFnLCBcCisgICAgdHlwZW5hbWUgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXBwZW5kPCBcCisgICAgdHlwZW5hbWUgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y3JlYXRlNDxIYXNoX0ZuLCBFcV9GbiwgUmVzaXplX1BvbGljeSwgXAorICAgIGRldGFpbDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LCBTdG9yZV9IYXNoPiA+Ojp0eXBlLCBQb2xpY3lfVGw+Ojp0eXBlPjo6dHlwZQorCisgIC8qKgorICAgKiAgQGRlZmdyb3VwIGhhc2gtZGV0YWlsIEJhc2UgYW5kIFBvbGljeSBDbGFzc2VzCisgICAqICBAaW5ncm91cCBoYXNoLWJhc2VkCisgICAqLworCisgIC8qKgorICAgKiAgQSBoYXNoZWQgY29udGFpbmVyIGFic3RyYWN0aW9uLgorICAgKgorICAgKiAgQHRwYXJhbSBLZXkgCSAgICAJS2V5IHR5cGUuCisgICAqICBAdHBhcmFtIE1hcHBlZCAJICAgIAlNYXAgdHlwZS4KKyAgICogIEB0cGFyYW0gSGFzaF9GbgkgICAgCUhhc2hpbmcgZnVuY3Rvci4KKyAgICogIEB0cGFyYW0gRXFfRm4JICAgIAlFcXVhbCBmdW5jdG9yLgorICAgKiAgQHRwYXJhbSBSZXNpemVfUG9saWN5IAlSZXNpemVzIGhhc2guCisgICAqICBAdHBhcmFtIFN0b3JlX0hhc2ggICAgCUluZGljYXRlcyB3aGV0aGVyIHRoZSBoYXNoIHZhbHVlCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGFsb25nIHdpdGggZWFjaCBrZXkuCisgICAqICBAdHBhcmFtIFRhZyAJICAgIAlJbnN0YW50aWF0aW5nIGRhdGEgc3RydWN0dXJlIHR5cGUsCisgICAqCQkJICAgIAlzZWUgY29udGFpbmVyX3RhZy4KKyAgICogIEB0cGFyYW0gUG9saWN5X1RMCSAgICAJUG9saWN5IHR5cGVsaXN0LgorICAgKiAgQHRwYXJhbSBfQWxsb2MgCSAgICAJQWxsb2NhdG9yIHR5cGUuCisgICAqCisgICAqICBCYXNlIGlzIGRpc3BhdGNoZWQgYXQgY29tcGlsZSB0aW1lIHZpYSBUYWcsIGZyb20gdGhlIGZvbGxvd2luZworICAgKiAgY2hvaWNlczogY2NfaGFzaF90YWcsIGdwX2hhc2hfdGFnLCBhbmQgZGVzY2VuZGFudHMgb2YgYmFzaWNfaGFzaF90YWcuCisgICAqCisgICAqICBCYXNlIGNob2ljZXMgYXJlOiBkZXRhaWw6OmNjX2h0X21hcCwgZGV0YWlsOjpncF9odF9tYXAKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICB0eXBlbmFtZSBNYXBwZWQsCisJICAgdHlwZW5hbWUgSGFzaF9GbiwKKwkgICB0eXBlbmFtZSBFcV9GbiwKKwkgICB0eXBlbmFtZSBSZXNpemVfUG9saWN5LAorCSAgIGJvb2wgU3RvcmVfSGFzaCwKKwkgICB0eXBlbmFtZSBUYWcsCisJICAgdHlwZW5hbWUgUG9saWN5X1RsLAorCSAgIHR5cGVuYW1lIF9BbGxvYz4KKyAgY2xhc3MgYmFzaWNfaGFzaF90YWJsZSA6IHB1YmxpYyBQQl9EU19IQVNIX0JBU0UKKyAgeworICBwcml2YXRlOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgUEJfRFNfSEFTSF9CQVNFIAkJYmFzZV90eXBlOworCisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsCisgICAgfmJhc2ljX2hhc2hfdGFibGUoKSB7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgYmFzaWNfaGFzaF90YWJsZSgpIHsgfQorCisgICAgYmFzaWNfaGFzaF90YWJsZShjb25zdCBiYXNpY19oYXNoX3RhYmxlJiBvdGhlcikKKyAgICA6IGJhc2VfdHlwZSgoY29uc3QgYmFzZV90eXBlJilvdGhlcikgeyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMD4KKyAgICAgIGJhc2ljX2hhc2hfdGFibGUoVDAgdDApIDogYmFzZV90eXBlKHQwKSB7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMT4KKyAgICAgIGJhc2ljX2hhc2hfdGFibGUoVDAgdDAsIFQxIHQxKSA6IGJhc2VfdHlwZSh0MCwgdDEpIHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICAgIGJhc2ljX2hhc2hfdGFibGUoVDAgdDAsIFQxIHQxLCBUMiB0MikgOiBiYXNlX3R5cGUodDAsIHQxLCB0MikgeyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KKyAgICAgIGJhc2ljX2hhc2hfdGFibGUoVDAgdDAsIFQxIHQxLCBUMiB0MiwgVDMgdDMpCisgICAgICA6IGJhc2VfdHlwZSh0MCwgdDEsIHQyLCB0MykgeyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+CisgICAgICBiYXNpY19oYXNoX3RhYmxlKFQwIHQwLCBUMSB0MSwgVDIgdDIsIFQzIHQzLCBUNCB0NCkKKyAgICAgIDogYmFzZV90eXBlKHQwLCB0MSwgdDIsIHQzLCB0NCkgeyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsCisJICAgICB0eXBlbmFtZSBUNT4KKyAgICAgIGJhc2ljX2hhc2hfdGFibGUoVDAgdDAsIFQxIHQxLCBUMiB0MiwgVDMgdDMsIFQ0IHQ0LCBUNSB0NSkKKyAgICAgIDogYmFzZV90eXBlKHQwLCB0MSwgdDIsIHQzLCB0NCwgdDUpIHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LAorCSAgICAgdHlwZW5hbWUgVDUsIHR5cGVuYW1lIFQ2PgorICAgICAgYmFzaWNfaGFzaF90YWJsZShUMCB0MCwgVDEgdDEsIFQyIHQyLCBUMyB0MywgVDQgdDQsIFQ1IHQ1LCBUNiB0NikKKyAgICAgIDogYmFzZV90eXBlKHQwLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2KSB7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwKKwkgICAgIHR5cGVuYW1lIFQ1LCB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+CisgICAgICBiYXNpY19oYXNoX3RhYmxlKFQwIHQwLCBUMSB0MSwgVDIgdDIsIFQzIHQzLCBUNCB0NCwgVDUgdDUsIFQ2IHQ2LCBUNyB0NykKKyAgICAgIDogYmFzZV90eXBlKHQwLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NykgeyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsCisJICAgICB0eXBlbmFtZSBUNSwgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KKyAgICAgIGJhc2ljX2hhc2hfdGFibGUoVDAgdDAsIFQxIHQxLCBUMiB0MiwgVDMgdDMsIFQ0IHQ0LCBUNSB0NSwgVDYgdDYsCisJCSAgICAgICBUNyB0NywgVDggdDgpCisgICAgICA6IGJhc2VfdHlwZSh0MCwgdDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDcsIHQ4KQorICAgICAgeyB9CisKKyAgcHJpdmF0ZToKKyAgICBiYXNpY19oYXNoX3RhYmxlJgorICAgIG9wZXJhdG9yPShjb25zdCBiYXNlX3R5cGUmKTsKKyAgfTsKKworI3VuZGVmIFBCX0RTX0hBU0hfQkFTRQorCisKKyNkZWZpbmUgUEJfRFNfQ0NfSEFTSF9CQVNFIFwKKyAgYmFzaWNfaGFzaF90YWJsZTxLZXksIE1hcHBlZCwJSGFzaF9GbiwgRXFfRm4sIFJlc2l6ZV9Qb2xpY3ksIFN0b3JlX0hhc2gsIFwKKwkJICAgY2NfaGFzaF90YWcsCVwKKwkgIHR5cGVuYW1lIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNyZWF0ZTE8Q29tYl9IYXNoX0ZuPjo6dHlwZSwgX0FsbG9jPgorCisKKyAgLyoqCisgICAqICBBIGNvbGxpc2lvbi1jaGFpbmluZyBoYXNoLWJhc2VkIGFzc29jaWF0aXZlIGNvbnRhaW5lci4KKyAgICoKKyAgICogIEB0cGFyYW0gS2V5IAkgICAgCUtleSB0eXBlLgorICAgKiAgQHRwYXJhbSBNYXBwZWQgCSAgICAJTWFwIHR5cGUuCisgICAqICBAdHBhcmFtIEhhc2hfRm4JICAgIAlIYXNoaW5nIGZ1bmN0b3IuCisgICAqICBAdHBhcmFtIEVxX0ZuCSAgICAJRXF1YWwgZnVuY3Rvci4KKyAgICogIEB0cGFyYW0gQ29tYl9IYXNoX0ZuCUNvbWJpbmluZyBoYXNoIGZ1bmN0b3IuCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIEhhc2hfRm4gaXMgbm90IG51bGxfdHlwZSwgdGhlbiB0aGlzCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRoZSByYW5nZWQtaGFzaCBmdW5jdG9yOyBvdGhlcndpc2UsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgdGhlIHJhbmdlLWhhc2hpbmcgZnVuY3Rvci4KKyAgICogICAgICAgICAgICAgICAgICAgIFhYWChTZWUgRGVzaWduOjpIYXNoLUJhc2VkIENvbnRhaW5lcnM6Okhhc2ggUG9saWNpZXMuKQorICAgKiAgQHRwYXJhbSBSZXNpemVfUG9saWN5IAlSZXNpemVzIGhhc2guCisgICAqICBAdHBhcmFtIFN0b3JlX0hhc2ggICAgCUluZGljYXRlcyB3aGV0aGVyIHRoZSBoYXNoIHZhbHVlCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGFsb25nIHdpdGggZWFjaCBrZXkuCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIEhhc2hfRm4gaXMgbnVsbF90eXBlLCB0aGVuIHRoZQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgd2lsbCBub3QgY29tcGlsZSBpZiB0aGlzCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGlzIHRydWUKKyAgICogIEB0cGFyYW0gX0FsbG9jIAkgICAgCUFsbG9jYXRvciB0eXBlLgorICAgKgorICAgKiAgQmFzZSB0YWcgY2hvaWNlcyBhcmU6IAljY19oYXNoX3RhZy4KKyAgICoKKyAgICogIEJhc2UgaXMgYmFzaWNfaGFzaF90YWJsZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICB0eXBlbmFtZSBNYXBwZWQsCisJICAgdHlwZW5hbWUgSGFzaF9GbiA9IHR5cGVuYW1lIGRldGFpbDo6ZGVmYXVsdF9oYXNoX2ZuPEtleT46OnR5cGUsCisJICAgdHlwZW5hbWUgRXFfRm4gPSB0eXBlbmFtZSBkZXRhaWw6OmRlZmF1bHRfZXFfZm48S2V5Pjo6dHlwZSwKKwkgICB0eXBlbmFtZSBDb21iX0hhc2hfRm4gPSBkZXRhaWw6OmRlZmF1bHRfY29tYl9oYXNoX2ZuOjp0eXBlLAorCSAgIHR5cGVuYW1lIFJlc2l6ZV9Qb2xpY3kgPSB0eXBlbmFtZSBkZXRhaWw6OmRlZmF1bHRfcmVzaXplX3BvbGljeTxDb21iX0hhc2hfRm4+Ojp0eXBlLAorCSAgIGJvb2wgU3RvcmVfSGFzaCA9IGRldGFpbDo6ZGVmYXVsdF9zdG9yZV9oYXNoLAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4KKyAgY2xhc3MgY2NfaGFzaF90YWJsZSA6ICBwdWJsaWMgUEJfRFNfQ0NfSEFTSF9CQVNFCisgIHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIFBCX0RTX0NDX0hBU0hfQkFTRSAJCQliYXNlX3R5cGU7CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgY2NfaGFzaF90YWcJICAgICAgIAkJCWNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIEhhc2hfRm4gCQkJCWhhc2hfZm47CisgICAgdHlwZWRlZiBFcV9GbiAJCQkJZXFfZm47CisgICAgdHlwZWRlZiBSZXNpemVfUG9saWN5IAkJCXJlc2l6ZV9wb2xpY3k7CisgICAgdHlwZWRlZiBDb21iX0hhc2hfRm4gCQkJY29tYl9oYXNoX2ZuOworCisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgY2NfaGFzaF90YWJsZSgpIHsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBzb21lIHBvbGljeSBvYmplY3RzLiByX2hhc2hfZm4gd2lsbCBiZQorICAgIC8vLyBjb3BpZWQgYnkgdGhlIEhhc2hfRm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIGNjX2hhc2hfdGFibGUoY29uc3QgaGFzaF9mbiYgaCkKKyAgICA6IGJhc2VfdHlwZShoKSB7IH0KKworICAgIC8vLyBDb25zdHJ1Y3RvciB0YWtpbmcgc29tZSBwb2xpY3kgb2JqZWN0cy4gcl9oYXNoX2ZuIHdpbGwgYmUKKyAgICAvLy8gY29waWVkIGJ5IHRoZSBoYXNoX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwgYW5kCisgICAgLy8vIHJfZXFfZm4gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGVxX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyCisgICAgLy8vIG9iamVjdC4KKyAgICBjY19oYXNoX3RhYmxlKGNvbnN0IGhhc2hfZm4mIGgsIGNvbnN0IGVxX2ZuJiBlKQorICAgIDogYmFzZV90eXBlKGgsIGUpIHsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBzb21lIHBvbGljeSBvYmplY3RzLiByX2hhc2hfZm4gd2lsbCBiZQorICAgIC8vLyBjb3BpZWQgYnkgdGhlIGhhc2hfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LCByX2VxX2ZuCisgICAgLy8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBlcV9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsCisgICAgLy8vIGFuZCByX2NvbWJfaGFzaF9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgY29tYl9oYXNoX2ZuIG9iamVjdAorICAgIC8vLyBvZiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICBjY19oYXNoX3RhYmxlKGNvbnN0IGhhc2hfZm4mIGgsIGNvbnN0IGVxX2ZuJiBlLCBjb25zdCBjb21iX2hhc2hfZm4mIGNoKQorICAgIDogYmFzZV90eXBlKGgsIGUsIGNoKSB7IH0KKworICAgIC8vLyBDb25zdHJ1Y3RvciB0YWtpbmcgc29tZSBwb2xpY3kgb2JqZWN0cy4gcl9oYXNoX2ZuIHdpbGwgYmUKKyAgICAvLy8gY29waWVkIGJ5IHRoZSBoYXNoX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwgcl9lcV9mbgorICAgIC8vLyB3aWxsIGJlIGNvcGllZCBieSB0aGUgZXFfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LAorICAgIC8vLyByX2NvbWJfaGFzaF9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgY29tYl9oYXNoX2ZuIG9iamVjdCBvZgorICAgIC8vLyB0aGUgY29udGFpbmVyIG9iamVjdCwgYW5kIHJfcmVzaXplX3BvbGljeSB3aWxsIGJlIGNvcGllZCBieQorICAgIC8vLyB0aGUgcmVzaXplX3BvbGljeSBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QuCisgICAgY2NfaGFzaF90YWJsZShjb25zdCBoYXNoX2ZuJiBoLCBjb25zdCBlcV9mbiYgZSwgY29uc3QgY29tYl9oYXNoX2ZuJiBjaCwKKwkJICBjb25zdCByZXNpemVfcG9saWN5JiBycCkKKyAgICA6IGJhc2VfdHlwZShoLCBlLCBjaCwgcnApIHsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzLiBUaGUKKyAgICAvLy8gdmFsdWVfdHlwZXMgYmV0d2VlbiBmaXJzdF9pdCBhbmQgbGFzdF9pdCB3aWxsIGJlIGluc2VydGVkIGludG8KKyAgICAvLy8gdGhlIGNvbnRhaW5lciBvYmplY3QuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgY2NfaGFzaF90YWJsZShJdCBmaXJzdCwgSXQgbGFzdCkKKyAgICB7IGJhc2VfdHlwZTo6Y29weV9mcm9tX3JhbmdlKGZpcnN0LCBsYXN0KTsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzIGFuZAorICAgIC8vLyBzb21lIHBvbGljeSBvYmplY3RzLiBUaGUgdmFsdWVfdHlwZXMgYmV0d2VlbiBmaXJzdF9pdCBhbmQKKyAgICAvLy8gbGFzdF9pdCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGNvbnRhaW5lciBvYmplY3QuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgY2NfaGFzaF90YWJsZShJdCBmaXJzdCwgSXQgbGFzdCwgY29uc3QgaGFzaF9mbiYgaCkKKyAgICA6IGJhc2VfdHlwZShoKQorICAgIHsgdGhpcy0+Y29weV9mcm9tX3JhbmdlKGZpcnN0LCBsYXN0KTsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzIGFuZAorICAgIC8vLyBzb21lIHBvbGljeSBvYmplY3RzIFRoZSB2YWx1ZV90eXBlcyBiZXR3ZWVuIGZpcnN0X2l0IGFuZAorICAgIC8vLyBsYXN0X2l0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgY29udGFpbmVyIG9iamVjdC4gcl9oYXNoX2ZuCisgICAgLy8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBoYXNoX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwKKyAgICAvLy8gYW5kIHJfZXFfZm4gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGVxX2ZuIG9iamVjdCBvZiB0aGUKKyAgICAvLy8gY29udGFpbmVyIG9iamVjdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICBjY19oYXNoX3RhYmxlKEl0IGZpcnN0LCBJdCBsYXN0LCBjb25zdCBoYXNoX2ZuJiBoLCBjb25zdCBlcV9mbiYgZSkKKyAgICA6IGJhc2VfdHlwZShoLCBlKQorICAgIHsgdGhpcy0+Y29weV9mcm9tX3JhbmdlKGZpcnN0LCBsYXN0KTsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzIGFuZAorICAgIC8vLyBzb21lIHBvbGljeSBvYmplY3RzIFRoZSB2YWx1ZV90eXBlcyBiZXR3ZWVuIGZpcnN0X2l0IGFuZAorICAgIC8vLyBsYXN0X2l0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgY29udGFpbmVyIG9iamVjdC4gcl9oYXNoX2ZuCisgICAgLy8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBoYXNoX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwKKyAgICAvLy8gcl9lcV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgZXFfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIKKyAgICAvLy8gb2JqZWN0LCBhbmQgcl9jb21iX2hhc2hfZm4gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGNvbWJfaGFzaF9mbgorICAgIC8vLyBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgY2NfaGFzaF90YWJsZShJdCBmaXJzdCwgSXQgbGFzdCwgY29uc3QgaGFzaF9mbiYgaCwgY29uc3QgZXFfZm4mIGUsCisJCSAgY29uc3QgY29tYl9oYXNoX2ZuJiBjaCkKKyAgICA6IGJhc2VfdHlwZShoLCBlLCBjaCkKKyAgICB7IHRoaXMtPmNvcHlfZnJvbV9yYW5nZShmaXJzdCwgbGFzdCk7IH0KKworICAgIC8vLyBDb25zdHJ1Y3RvciB0YWtpbmcgX19pdGVyYXRvcnMgdG8gYSByYW5nZSBvZiB2YWx1ZV90eXBlcyBhbmQKKyAgICAvLy8gc29tZSBwb2xpY3kgb2JqZWN0cyBUaGUgdmFsdWVfdHlwZXMgYmV0d2VlbiBmaXJzdF9pdCBhbmQKKyAgICAvLy8gbGFzdF9pdCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGNvbnRhaW5lciBvYmplY3QuIHJfaGFzaF9mbgorICAgIC8vLyB3aWxsIGJlIGNvcGllZCBieSB0aGUgaGFzaF9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsCisgICAgLy8vIHJfZXFfZm4gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGVxX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyCisgICAgLy8vIG9iamVjdCwgcl9jb21iX2hhc2hfZm4gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGNvbWJfaGFzaF9mbgorICAgIC8vLyBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsIGFuZCByX3Jlc2l6ZV9wb2xpY3kgd2lsbCBiZQorICAgIC8vLyBjb3BpZWQgYnkgdGhlIHJlc2l6ZV9wb2xpY3kgb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgIGNjX2hhc2hfdGFibGUoSXQgZmlyc3QsIEl0IGxhc3QsIGNvbnN0IGhhc2hfZm4mIGgsIGNvbnN0IGVxX2ZuJiBlLAorCQkgIGNvbnN0IGNvbWJfaGFzaF9mbiYgY2gsIGNvbnN0IHJlc2l6ZV9wb2xpY3kmIHJwKQorICAgIDogYmFzZV90eXBlKGgsIGUsIGNoLCBycCkKKyAgICB7IHRoaXMtPmNvcHlfZnJvbV9yYW5nZShmaXJzdCwgbGFzdCk7IH0KKworICAgIGNjX2hhc2hfdGFibGUoY29uc3QgY2NfaGFzaF90YWJsZSYgb3RoZXIpCisgICAgOiBiYXNlX3R5cGUoKGNvbnN0IGJhc2VfdHlwZSYpb3RoZXIpCisgICAgeyB9CisKKyAgICB2aXJ0dWFsCisgICAgfmNjX2hhc2hfdGFibGUoKSB7IH0KKworICAgIGNjX2hhc2hfdGFibGUmCisgICAgb3BlcmF0b3I9KGNvbnN0IGNjX2hhc2hfdGFibGUmIG90aGVyKQorICAgIHsKKyAgICAgIGlmICh0aGlzICE9ICZvdGhlcikKKwl7CisJICBjY19oYXNoX3RhYmxlIHRtcChvdGhlcik7CisJICBzd2FwKHRtcCk7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHZvaWQKKyAgICBzd2FwKGNjX2hhc2hfdGFibGUmIG90aGVyKQorICAgIHsgYmFzZV90eXBlOjpzd2FwKG90aGVyKTsgfQorICB9OworCisjdW5kZWYgUEJfRFNfQ0NfSEFTSF9CQVNFCisKKworI2RlZmluZSBQQl9EU19HUF9IQVNIX0JBU0UgXAorICBiYXNpY19oYXNoX3RhYmxlPEtleSwgTWFwcGVkLAlIYXNoX0ZuLCBFcV9GbiwgUmVzaXplX1BvbGljeSwgU3RvcmVfSGFzaCwgXAorCQkgICBncF9oYXNoX3RhZywgXAorICB0eXBlbmFtZSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjcmVhdGUyPENvbWJfUHJvYmVfRm4sIFByb2JlX0ZuPjo6dHlwZSwgX0FsbG9jPgorCisKKyAgLyoqCisgICAqICBBIGdlbmVyYWwtcHJvYmluZyBoYXNoLWJhc2VkIGFzc29jaWF0aXZlIGNvbnRhaW5lci4KKyAgICoKKyAgICogIEB0cGFyYW0gS2V5IAkgICAgCUtleSB0eXBlLgorICAgKiAgQHRwYXJhbSBNYXBwZWQgCSAgICAJTWFwIHR5cGUuCisgICAqICBAdHBhcmFtIEhhc2hfRm4JICAgIAlIYXNoaW5nIGZ1bmN0b3IuCisgICAqICBAdHBhcmFtIEVxX0ZuCSAgICAJRXF1YWwgZnVuY3Rvci4KKyAgICogIEB0cGFyYW0gQ29tYl9Qcm9iZV9GbglDb21iaW5pbmcgcHJvYmUgZnVuY3Rvci4KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgSGFzaF9GbiBpcyBub3QgbnVsbF90eXBlLCB0aGVuIHRoaXMKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHJhbmdlZC1wcm9iZSBmdW5jdG9yOyBvdGhlcndpc2UsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgdGhlIHJhbmdlLWhhc2hpbmcgZnVuY3Rvci4KKyAgICogICAgICAgICAgICAgICAgICAgIFhYWCBTZWUgRGVzaWduOjpIYXNoLUJhc2VkIENvbnRhaW5lcnM6Okhhc2ggUG9saWNpZXMuCisgICAqICBAdHBhcmFtIFByb2JlX0ZuCQlQcm9iZSBmdW5jdG9yLgorICAgKiAgQHRwYXJhbSBSZXNpemVfUG9saWN5IAlSZXNpemVzIGhhc2guCisgICAqICBAdHBhcmFtIFN0b3JlX0hhc2ggICAgCUluZGljYXRlcyB3aGV0aGVyIHRoZSBoYXNoIHZhbHVlCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGFsb25nIHdpdGggZWFjaCBrZXkuCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIEhhc2hfRm4gaXMgbnVsbF90eXBlLCB0aGVuIHRoZQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgd2lsbCBub3QgY29tcGlsZSBpZiB0aGlzCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGlzIHRydWUKKyAgICogIEB0cGFyYW0gX0FsbG9jIAkgICAgCUFsbG9jYXRvciB0eXBlLgorICAgKgorICAgKiAgQmFzZSB0YWcgY2hvaWNlcyBhcmU6IAlncF9oYXNoX3RhZy4KKyAgICoKKyAgICogIEJhc2UgaXMgYmFzaWNfaGFzaF90YWJsZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICB0eXBlbmFtZSBNYXBwZWQsCisJICAgdHlwZW5hbWUgSGFzaF9GbiA9IHR5cGVuYW1lIGRldGFpbDo6ZGVmYXVsdF9oYXNoX2ZuPEtleT46OnR5cGUsCisJICAgdHlwZW5hbWUgRXFfRm4gPSB0eXBlbmFtZSBkZXRhaWw6OmRlZmF1bHRfZXFfZm48S2V5Pjo6dHlwZSwKKwkgICB0eXBlbmFtZSBDb21iX1Byb2JlX0ZuID0gZGV0YWlsOjpkZWZhdWx0X2NvbWJfaGFzaF9mbjo6dHlwZSwKKwkgICB0eXBlbmFtZSBQcm9iZV9GbiA9IHR5cGVuYW1lIGRldGFpbDo6ZGVmYXVsdF9wcm9iZV9mbjxDb21iX1Byb2JlX0ZuPjo6dHlwZSwKKwkgICB0eXBlbmFtZSBSZXNpemVfUG9saWN5ID0gdHlwZW5hbWUgZGV0YWlsOjpkZWZhdWx0X3Jlc2l6ZV9wb2xpY3k8Q29tYl9Qcm9iZV9Gbj46OnR5cGUsCisJICAgYm9vbCBTdG9yZV9IYXNoID0gZGV0YWlsOjpkZWZhdWx0X3N0b3JlX2hhc2gsCisJICAgdHlwZW5hbWUgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8Y2hhcj4gPgorICBjbGFzcyBncF9oYXNoX3RhYmxlIDogcHVibGljIFBCX0RTX0dQX0hBU0hfQkFTRQorICB7CisgIHByaXZhdGU6CisgICAgdHlwZWRlZiBQQl9EU19HUF9IQVNIX0JBU0UgCQkJYmFzZV90eXBlOworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIGdwX2hhc2hfdGFnCSAgICAgICAJCQljb250YWluZXJfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiBIYXNoX0ZuIAkJCQloYXNoX2ZuOworICAgIHR5cGVkZWYgRXFfRm4gCQkJCWVxX2ZuOworICAgIHR5cGVkZWYgQ29tYl9Qcm9iZV9GbgkJCWNvbWJfcHJvYmVfZm47CisgICAgdHlwZWRlZiBQcm9iZV9GbiAJCQkJcHJvYmVfZm47CisgICAgdHlwZWRlZiBSZXNpemVfUG9saWN5IAkJCXJlc2l6ZV9wb2xpY3k7CisKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICBncF9oYXNoX3RhYmxlKCkgeyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIHNvbWUgcG9saWN5IG9iamVjdHMuIHJfaGFzaF9mbiB3aWxsIGJlCisgICAgLy8vIGNvcGllZCBieSB0aGUgaGFzaF9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QuCisgICAgZ3BfaGFzaF90YWJsZShjb25zdCBoYXNoX2ZuJiBoKQorICAgIDogYmFzZV90eXBlKGgpIHsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBzb21lIHBvbGljeSBvYmplY3RzLiByX2hhc2hfZm4gd2lsbCBiZQorICAgIC8vLyBjb3BpZWQgYnkgdGhlIGhhc2hfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LCBhbmQKKyAgICAvLy8gcl9lcV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgZXFfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIKKyAgICAvLy8gb2JqZWN0LgorICAgIGdwX2hhc2hfdGFibGUoY29uc3QgaGFzaF9mbiYgaCwgY29uc3QgZXFfZm4mIGUpCisgICAgOiBiYXNlX3R5cGUoaCwgZSkgeyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIHNvbWUgcG9saWN5IG9iamVjdHMuIHJfaGFzaF9mbiB3aWxsIGJlCisgICAgLy8vIGNvcGllZCBieSB0aGUgaGFzaF9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsIHJfZXFfZm4KKyAgICAvLy8gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGVxX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwKKyAgICAvLy8gYW5kIHJfY29tYl9wcm9iZV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgY29tYl9wcm9iZV9mbiBvYmplY3QKKyAgICAvLy8gb2YgdGhlIGNvbnRhaW5lciBvYmplY3QuCisgICAgZ3BfaGFzaF90YWJsZShjb25zdCBoYXNoX2ZuJiBoLCBjb25zdCBlcV9mbiYgZSwgY29uc3QgY29tYl9wcm9iZV9mbiYgY3ApCisgICAgOiBiYXNlX3R5cGUoaCwgZSwgY3ApIHsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBzb21lIHBvbGljeSBvYmplY3RzLiByX2hhc2hfZm4gd2lsbCBiZQorICAgIC8vLyBjb3BpZWQgYnkgdGhlIGhhc2hfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LCByX2VxX2ZuCisgICAgLy8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBlcV9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsCisgICAgLy8vIHJfY29tYl9wcm9iZV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgY29tYl9wcm9iZV9mbiBvYmplY3Qgb2YKKyAgICAvLy8gdGhlIGNvbnRhaW5lciBvYmplY3QsIGFuZCByX3Byb2JlX2ZuIHdpbGwgYmUgY29waWVkIGJ5IHRoZQorICAgIC8vLyBwcm9iZV9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QuCisgICAgZ3BfaGFzaF90YWJsZShjb25zdCBoYXNoX2ZuJiBoLCBjb25zdCBlcV9mbiYgZSwgY29uc3QgY29tYl9wcm9iZV9mbiYgY3AsCisJCSAgY29uc3QgcHJvYmVfZm4mIHApCisgICAgOiBiYXNlX3R5cGUoaCwgZSwgY3AsIHApIHsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBzb21lIHBvbGljeSBvYmplY3RzLiByX2hhc2hfZm4gd2lsbCBiZQorICAgIC8vLyBjb3BpZWQgYnkgdGhlIGhhc2hfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LCByX2VxX2ZuCisgICAgLy8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBlcV9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsCisgICAgLy8vIHJfY29tYl9wcm9iZV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgY29tYl9wcm9iZV9mbiBvYmplY3Qgb2YKKyAgICAvLy8gdGhlIGNvbnRhaW5lciBvYmplY3QsIHJfcHJvYmVfZm4gd2lsbCBiZSBjb3BpZWQgYnkgdGhlCisgICAgLy8vIHByb2JlX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwgYW5kIHJfcmVzaXplX3BvbGljeQorICAgIC8vLyB3aWxsIGJlIGNvcGllZCBieSB0aGUgUmVzaXplX1BvbGljeSBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lcgorICAgIC8vLyBvYmplY3QuCisgICAgZ3BfaGFzaF90YWJsZShjb25zdCBoYXNoX2ZuJiBoLCBjb25zdCBlcV9mbiYgZSwgY29uc3QgY29tYl9wcm9iZV9mbiYgY3AsCisJCSAgY29uc3QgcHJvYmVfZm4mIHAsIGNvbnN0IHJlc2l6ZV9wb2xpY3kmIHJwKQorICAgIDogYmFzZV90eXBlKGgsIGUsIGNwLCBwLCBycCkgeyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIF9faXRlcmF0b3JzIHRvIGEgcmFuZ2Ugb2YgdmFsdWVfdHlwZXMuIFRoZQorICAgIC8vLyB2YWx1ZV90eXBlcyBiZXR3ZWVuIGZpcnN0X2l0IGFuZCBsYXN0X2l0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50bworICAgIC8vLyB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICBncF9oYXNoX3RhYmxlKEl0IGZpcnN0LCBJdCBsYXN0KQorICAgIHsgYmFzZV90eXBlOjpjb3B5X2Zyb21fcmFuZ2UoZmlyc3QsIGxhc3QpOyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIF9faXRlcmF0b3JzIHRvIGEgcmFuZ2Ugb2YgdmFsdWVfdHlwZXMgYW5kCisgICAgLy8vIHNvbWUgcG9saWN5IG9iamVjdHMuIFRoZSB2YWx1ZV90eXBlcyBiZXR3ZWVuIGZpcnN0X2l0IGFuZAorICAgIC8vLyBsYXN0X2l0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgY29udGFpbmVyIG9iamVjdC4gcl9oYXNoX2ZuCisgICAgLy8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBoYXNoX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICBncF9oYXNoX3RhYmxlKEl0IGZpcnN0LCBJdCBsYXN0LCBjb25zdCBoYXNoX2ZuJiBoKQorICAgIDogYmFzZV90eXBlKGgpCisgICAgeyBiYXNlX3R5cGU6OmNvcHlfZnJvbV9yYW5nZShmaXJzdCwgbGFzdCk7IH0KKworICAgIC8vLyBDb25zdHJ1Y3RvciB0YWtpbmcgX19pdGVyYXRvcnMgdG8gYSByYW5nZSBvZiB2YWx1ZV90eXBlcyBhbmQKKyAgICAvLy8gc29tZSBwb2xpY3kgb2JqZWN0cy4gVGhlIHZhbHVlX3R5cGVzIGJldHdlZW4gZmlyc3RfaXQgYW5kCisgICAgLy8vIGxhc3RfaXQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjb250YWluZXIgb2JqZWN0LiByX2hhc2hfZm4KKyAgICAvLy8gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGhhc2hfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LAorICAgIC8vLyBhbmQgcl9lcV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgZXFfZm4gb2JqZWN0IG9mIHRoZQorICAgIC8vLyBjb250YWluZXIgb2JqZWN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgIGdwX2hhc2hfdGFibGUoSXQgZmlyc3QsIEl0IGxhc3QsIGNvbnN0IGhhc2hfZm4mIGgsIGNvbnN0IGVxX2ZuJiBlKQorICAgIDogYmFzZV90eXBlKGgsIGUpCisgICAgeyBiYXNlX3R5cGU6OmNvcHlfZnJvbV9yYW5nZShmaXJzdCwgbGFzdCk7IH0KKworICAgIC8vLyBDb25zdHJ1Y3RvciB0YWtpbmcgX19pdGVyYXRvcnMgdG8gYSByYW5nZSBvZiB2YWx1ZV90eXBlcyBhbmQKKyAgICAvLy8gc29tZSBwb2xpY3kgb2JqZWN0cy4gVGhlIHZhbHVlX3R5cGVzIGJldHdlZW4gZmlyc3RfaXQgYW5kCisgICAgLy8vIGxhc3RfaXQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjb250YWluZXIgb2JqZWN0LiByX2hhc2hfZm4KKyAgICAvLy8gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGhhc2hfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LAorICAgIC8vLyByX2VxX2ZuIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBlcV9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lcgorICAgIC8vLyBvYmplY3QsIGFuZCByX2NvbWJfcHJvYmVfZm4gd2lsbCBiZSBjb3BpZWQgYnkgdGhlCisgICAgLy8vIGNvbWJfcHJvYmVfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgIGdwX2hhc2hfdGFibGUoSXQgZmlyc3QsIEl0IGxhc3QsIGNvbnN0IGhhc2hfZm4mIGgsIGNvbnN0IGVxX2ZuJiBlLAorCQkgIGNvbnN0IGNvbWJfcHJvYmVfZm4mIGNwKQorICAgIDogYmFzZV90eXBlKGgsIGUsIGNwKQorICAgIHsgYmFzZV90eXBlOjpjb3B5X2Zyb21fcmFuZ2UoZmlyc3QsIGxhc3QpOyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIF9faXRlcmF0b3JzIHRvIGEgcmFuZ2Ugb2YgdmFsdWVfdHlwZXMgYW5kCisgICAgLy8vIHNvbWUgcG9saWN5IG9iamVjdHMuIFRoZSB2YWx1ZV90eXBlcyBiZXR3ZWVuIGZpcnN0X2l0IGFuZAorICAgIC8vLyBsYXN0X2l0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgY29udGFpbmVyIG9iamVjdC4gcl9oYXNoX2ZuCisgICAgLy8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBoYXNoX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwKKyAgICAvLy8gcl9lcV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgZXFfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIKKyAgICAvLy8gb2JqZWN0LCByX2NvbWJfcHJvYmVfZm4gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGNvbWJfcHJvYmVfZm4KKyAgICAvLy8gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LCBhbmQgcl9wcm9iZV9mbiB3aWxsIGJlIGNvcGllZAorICAgIC8vLyBieSB0aGUgcHJvYmVfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgIGdwX2hhc2hfdGFibGUoSXQgZmlyc3QsIEl0IGxhc3QsIGNvbnN0IGhhc2hfZm4mIGgsIGNvbnN0IGVxX2ZuJiBlLAorCQkgIGNvbnN0IGNvbWJfcHJvYmVfZm4mIGNwLCBjb25zdCBwcm9iZV9mbiYgcCkKKyAgICA6IGJhc2VfdHlwZShoLCBlLCBjcCwgcCkKKyAgICB7IGJhc2VfdHlwZTo6Y29weV9mcm9tX3JhbmdlKGZpcnN0LCBsYXN0KTsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzIGFuZAorICAgIC8vLyBzb21lIHBvbGljeSBvYmplY3RzLiBUaGUgdmFsdWVfdHlwZXMgYmV0d2VlbiBmaXJzdF9pdCBhbmQKKyAgICAvLy8gbGFzdF9pdCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGNvbnRhaW5lciBvYmplY3QuIHJfaGFzaF9mbgorICAgIC8vLyB3aWxsIGJlIGNvcGllZCBieSB0aGUgaGFzaF9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsCisgICAgLy8vIHJfZXFfZm4gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGVxX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyCisgICAgLy8vIG9iamVjdCwgcl9jb21iX3Byb2JlX2ZuIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBjb21iX3Byb2JlX2ZuCisgICAgLy8vIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwgcl9wcm9iZV9mbiB3aWxsIGJlIGNvcGllZCBieQorICAgIC8vLyB0aGUgcHJvYmVfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LCBhbmQKKyAgICAvLy8gcl9yZXNpemVfcG9saWN5IHdpbGwgYmUgY29waWVkIGJ5IHRoZSByZXNpemVfcG9saWN5IG9iamVjdCBvZgorICAgIC8vLyB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICBncF9oYXNoX3RhYmxlKEl0IGZpcnN0LCBJdCBsYXN0LCBjb25zdCBoYXNoX2ZuJiBoLCBjb25zdCBlcV9mbiYgZSwKKwkJICBjb25zdCBjb21iX3Byb2JlX2ZuJiBjcCwgY29uc3QgcHJvYmVfZm4mIHAsCisJCSAgY29uc3QgcmVzaXplX3BvbGljeSYgcnApCisgICAgOiBiYXNlX3R5cGUoaCwgZSwgY3AsIHAsIHJwKQorICAgIHsgYmFzZV90eXBlOjpjb3B5X2Zyb21fcmFuZ2UoZmlyc3QsIGxhc3QpOyB9CisKKyAgICBncF9oYXNoX3RhYmxlKGNvbnN0IGdwX2hhc2hfdGFibGUmIG90aGVyKQorICAgIDogYmFzZV90eXBlKChjb25zdCBiYXNlX3R5cGUmKW90aGVyKQorICAgIHsgfQorCisgICAgdmlydHVhbAorICAgIH5ncF9oYXNoX3RhYmxlKCkgeyB9CisKKyAgICBncF9oYXNoX3RhYmxlJgorICAgIG9wZXJhdG9yPShjb25zdCBncF9oYXNoX3RhYmxlJiBvdGhlcikKKyAgICB7CisgICAgICBpZiAodGhpcyAhPSAmb3RoZXIpCisJeworCSAgZ3BfaGFzaF90YWJsZSB0bXAob3RoZXIpOworCSAgc3dhcCh0bXApOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB2b2lkCisgICAgc3dhcChncF9oYXNoX3RhYmxlJiBvdGhlcikKKyAgICB7IGJhc2VfdHlwZTo6c3dhcChvdGhlcik7IH0KKyAgfTsKKyAgLy9AfSBoYXNoLWJhc2VkCisjdW5kZWYgUEJfRFNfR1BfSEFTSF9CQVNFCisKKworICAvKioKKyAgICogIEBkZWZncm91cCBicmFuY2gtYmFzZWQgQnJhbmNoLUJhc2VkCisgICAqICBAaW5ncm91cCBjb250YWluZXJzLXBiZHMKKyAgICogIEB7CisgICAqLworI2RlZmluZSBQQl9EU19CUkFOQ0hfQkFTRSBcCisgIGRldGFpbDo6Y29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8S2V5LCBNYXBwZWQsIF9BbGxvYywgVGFnLCBQb2xpY3lfVGw+Ojp0eXBlCisKKyAgLyoqCisgICAqICBAZGVmZ3JvdXAgYnJhbmNoLWRldGFpbCBCYXNlIGFuZCBQb2xpY3kgQ2xhc3NlcworICAgKiAgQGluZ3JvdXAgYnJhbmNoLWJhc2VkCisgICAqLworCisgIC8qKgorICAgKiAgQSBicmFuY2hlZCwgdHJlZS1saWtlICh0cmVlLCB0cmllKSBjb250YWluZXIgYWJzdHJhY3Rpb24uCisgICAqCisgICAqICBAdHBhcmFtIEtleSAJICAJS2V5IHR5cGUuCisgICAqICBAdHBhcmFtIE1hcHBlZCAJICAJTWFwIHR5cGUuCisgICAqICBAdHBhcmFtIFRhZyAJICAJSW5zdGFudGlhdGluZyBkYXRhIHN0cnVjdHVyZSB0eXBlLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWUgY29udGFpbmVyX3RhZy4KKyAgICogIEB0cGFyYW0gTm9kZV9VcGRhdGUgCVVwZGF0ZXMgbm9kZXMsIHJlc3RvcmVzIGludmFyaWFudHMuCisgICAqICBAdHBhcmFtIFBvbGljeV9UTCAgICAgICAgIFBvbGljeSB0eXBlbGlzdC4KKyAgICogIEB0cGFyYW0gX0FsbG9jIAkgIAlBbGxvY2F0b3IgdHlwZS4KKyAgICoKKyAgICogIEJhc2UgaXMgZGlzcGF0Y2hlZCBhdCBjb21waWxlIHRpbWUgdmlhIFRhZywgZnJvbSB0aGUgZm9sbG93aW5nCisgICAqICBjaG9pY2VzOiB0cmVlX3RhZywgdHJpZV90YWcsIGFuZCB0aGVpciBkZXNjZW5kYW50cy4KKyAgICoKKyAgICogIEJhc2UgY2hvaWNlcyBhcmU6IGRldGFpbDo6b3ZfdHJlZV9tYXAsIGRldGFpbDo6cmJfdHJlZV9tYXAsCisgICAqCQkgICAgICAgCWRldGFpbDo6c3BsYXlfdHJlZV9tYXAsIGFuZCBkZXRhaWw6OnBhdF90cmllX21hcC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBUYWcsCisJICAgdHlwZW5hbWUgTm9kZV9VcGRhdGUsIHR5cGVuYW1lIFBvbGljeV9UbCwgdHlwZW5hbWUgX0FsbG9jPgorICBjbGFzcyBiYXNpY19icmFuY2ggOiBwdWJsaWMgUEJfRFNfQlJBTkNIX0JBU0UKKyAgeworICBwcml2YXRlOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgUEJfRFNfQlJBTkNIX0JBU0UgCSAgICAgICAJYmFzZV90eXBlOworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIE5vZGVfVXBkYXRlIAkJCW5vZGVfdXBkYXRlOworCisgICAgdmlydHVhbAorICAgIH5iYXNpY19icmFuY2goKSB7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgYmFzaWNfYnJhbmNoKCkgeyB9CisKKyAgICBiYXNpY19icmFuY2goY29uc3QgYmFzaWNfYnJhbmNoJiBvdGhlcikKKyAgICA6IGJhc2VfdHlwZSgoY29uc3QgYmFzZV90eXBlJilvdGhlcikgeyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMD4KKyAgICAgIGJhc2ljX2JyYW5jaChUMCB0MCkgOiBiYXNlX3R5cGUodDApIHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxPgorICAgICAgYmFzaWNfYnJhbmNoKFQwIHQwLCBUMSB0MSkgOiBiYXNlX3R5cGUodDAsIHQxKSB7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgICBiYXNpY19icmFuY2goVDAgdDAsIFQxIHQxLCBUMiB0MikgOiBiYXNlX3R5cGUodDAsIHQxLCB0MikgeyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KKyAgICAgIGJhc2ljX2JyYW5jaChUMCB0MCwgVDEgdDEsIFQyIHQyLCBUMyB0MykKKyAgICAgIDogYmFzZV90eXBlKHQwLCB0MSwgdDIsIHQzKSB7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KKyAgICAgIGJhc2ljX2JyYW5jaChUMCB0MCwgVDEgdDEsIFQyIHQyLCBUMyB0MywgVDQgdDQpCisgICAgICA6IGJhc2VfdHlwZSh0MCwgdDEsIHQyLCB0MywgdDQpIHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LAorCSAgICAgdHlwZW5hbWUgVDU+CisgICAgICBiYXNpY19icmFuY2goVDAgdDAsIFQxIHQxLCBUMiB0MiwgVDMgdDMsIFQ0IHQ0LCBUNSB0NSkKKyAgICAgIDogYmFzZV90eXBlKHQwLCB0MSwgdDIsIHQzLCB0NCwgdDUpIHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LAorCSAgICAgdHlwZW5hbWUgVDUsIHR5cGVuYW1lIFQ2PgorICAgICAgYmFzaWNfYnJhbmNoKFQwIHQwLCBUMSB0MSwgVDIgdDIsIFQzIHQzLCBUNCB0NCwgVDUgdDUsIFQ2IHQ2KQorICAgICAgOiBiYXNlX3R5cGUodDAsIHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYpIHsgfQorICB9OworI3VuZGVmIFBCX0RTX0JSQU5DSF9CQVNFCisKKworI2RlZmluZSBQQl9EU19UUkVFX05PREVfQU5EX0lUX1RSQUlUUyBcCisgIGRldGFpbDo6dHJlZV90cmFpdHM8S2V5LCBNYXBwZWQsQ21wX0ZuLE5vZGVfVXBkYXRlLFRhZyxfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfVFJFRV9CQVNFIFwKKyAgYmFzaWNfYnJhbmNoPEtleSxNYXBwZWQsIFRhZywgXAorCSAgICAgICB0eXBlbmFtZSBQQl9EU19UUkVFX05PREVfQU5EX0lUX1RSQUlUUzo6bm9kZV91cGRhdGUsIFwKKwkgICAgICAgdHlwZW5hbWUgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y3JlYXRlMjxDbXBfRm4sIFwKKwkgICAgICAgUEJfRFNfVFJFRV9OT0RFX0FORF9JVF9UUkFJVFM+Ojp0eXBlLCBfQWxsb2M+CisKKworICAvKioKKyAgICogIEEgdHJlZS1iYXNlZCBjb250YWluZXIuCisgICAqCisgICAqICBAdHBhcmFtIEtleSAJIAlLZXkgdHlwZS4KKyAgICogIEB0cGFyYW0gTWFwcGVkIAkgCU1hcCB0eXBlLgorICAgKiAgQHRwYXJhbSBDbXBfRm4JIAlDb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAdHBhcmFtIFRhZyAJIAlJbnN0YW50aWF0aW5nIGRhdGEgc3RydWN0dXJlIHR5cGUsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZSBjb250YWluZXJfdGFnLgorICAgKiAgQHRwYXJhbSBOb2RlX1VwZGF0ZSAJVXBkYXRlcyB0cmVlIGludGVybmFsLW5vZGVzLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlcyBpbnZhcmlhbnRzIHdoZW4gaW52YWxpZGF0ZWQuCisgICAqICAgICAgICAgICAgICAgICAgICAgWFhYIFNlZSBkZXNpZ246OnRyZWUtYmFzZWQtY29udGFpbmVyczo6bm9kZSBpbnZhcmlhbnRzLgorICAgKiAgQHRwYXJhbSBfQWxsb2MgCSAJQWxsb2NhdG9yIHR5cGUuCisgICAqCisgICAqICBCYXNlIHRhZyBjaG9pY2VzIGFyZTogb3ZfdHJlZV90YWcsIHJiX3RyZWVfdGFnLCBzcGxheV90cmVlX3RhZy4KKyAgICoKKyAgICogIEJhc2UgaXMgYmFzaWNfYnJhbmNoLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIENtcF9GbiA9IHN0ZDo6bGVzczxLZXk+LAorCSAgIHR5cGVuYW1lIFRhZyA9IHJiX3RyZWVfdGFnLAorCSAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwgdHlwZW5hbWUgTm9kZV9JdHIsCisJCSAgICB0eXBlbmFtZSBDbXBfRm5fLCB0eXBlbmFtZSBfQWxsb2NfPgorCSAgIGNsYXNzIE5vZGVfVXBkYXRlID0gbnVsbF9ub2RlX3VwZGF0ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+CisgIGNsYXNzIHRyZWUgOiBwdWJsaWMgUEJfRFNfVFJFRV9CQVNFCisgIHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIFBCX0RTX1RSRUVfQkFTRSAJCQliYXNlX3R5cGU7CisKKyAgcHVibGljOgorICAgIC8vLyBDb21wYXJpc29uIGZ1bmN0b3IgdHlwZS4KKyAgICB0eXBlZGVmIENtcF9GbiAJCQkJY21wX2ZuOworCisgICAgdHJlZSgpIHsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBzb21lIHBvbGljeSBvYmplY3RzLiByX2NtcF9mbiB3aWxsIGJlCisgICAgLy8vIGNvcGllZCBieSB0aGUgQ21wX0ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0cmVlKGNvbnN0IGNtcF9mbiYgYykKKyAgICA6IGJhc2VfdHlwZShjKSB7IH0KKworICAgIC8vLyBDb25zdHJ1Y3RvciB0YWtpbmcgX19pdGVyYXRvcnMgdG8gYSByYW5nZSBvZiB2YWx1ZV90eXBlcy4gVGhlCisgICAgLy8vIHZhbHVlX3R5cGVzIGJldHdlZW4gZmlyc3RfaXQgYW5kIGxhc3RfaXQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvCisgICAgLy8vIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgIHRyZWUoSXQgZmlyc3QsIEl0IGxhc3QpCisgICAgeyBiYXNlX3R5cGU6OmNvcHlfZnJvbV9yYW5nZShmaXJzdCwgbGFzdCk7IH0KKworICAgIC8vLyBDb25zdHJ1Y3RvciB0YWtpbmcgX19pdGVyYXRvcnMgdG8gYSByYW5nZSBvZiB2YWx1ZV90eXBlcyBhbmQKKyAgICAvLy8gc29tZSBwb2xpY3kgb2JqZWN0cyBUaGUgdmFsdWVfdHlwZXMgYmV0d2VlbiBmaXJzdF9pdCBhbmQKKyAgICAvLy8gbGFzdF9pdCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGNvbnRhaW5lciBvYmplY3QuIHJfY21wX2ZuCisgICAgLy8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBjbXBfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgIHRyZWUoSXQgZmlyc3QsIEl0IGxhc3QsIGNvbnN0IGNtcF9mbiYgYykKKyAgICA6IGJhc2VfdHlwZShjKQorICAgIHsgYmFzZV90eXBlOjpjb3B5X2Zyb21fcmFuZ2UoZmlyc3QsIGxhc3QpOyB9CisKKyAgICB0cmVlKGNvbnN0IHRyZWUmIG90aGVyKQorICAgIDogYmFzZV90eXBlKChjb25zdCBiYXNlX3R5cGUmKW90aGVyKSB7IH0KKworICAgIHZpcnR1YWwKKyAgICB+dHJlZSgpIHsgfQorCisgICAgdHJlZSYKKyAgICBvcGVyYXRvcj0oY29uc3QgdHJlZSYgb3RoZXIpCisgICAgeworICAgICAgaWYgKHRoaXMgIT0gJm90aGVyKQorCXsKKwkgIHRyZWUgdG1wKG90aGVyKTsKKwkgIHN3YXAodG1wKTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdm9pZAorICAgIHN3YXAodHJlZSYgb3RoZXIpCisgICAgeyBiYXNlX3R5cGU6OnN3YXAob3RoZXIpOyB9CisgIH07CisKKyN1bmRlZiBQQl9EU19UUkVFX0JBU0UKKyN1bmRlZiBQQl9EU19UUkVFX05PREVfQU5EX0lUX1RSQUlUUworCisKKyNkZWZpbmUgUEJfRFNfVFJJRV9OT0RFX0FORF9JVF9UUkFJVFMgXAorICBkZXRhaWw6OnRyaWVfdHJhaXRzPEtleSxNYXBwZWQsX0FUcmFpdHMsTm9kZV9VcGRhdGUsVGFnLF9BbGxvYz4KKworI2RlZmluZSBQQl9EU19UUklFX0JBU0UgXAorICBiYXNpY19icmFuY2g8S2V5LE1hcHBlZCxUYWcsIFwKKwkgICAgICAgdHlwZW5hbWUgUEJfRFNfVFJJRV9OT0RFX0FORF9JVF9UUkFJVFM6Om5vZGVfdXBkYXRlLCBcCisJICAgICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNyZWF0ZTI8X0FUcmFpdHMsIFwKKwkgICAgICAgUEJfRFNfVFJJRV9OT0RFX0FORF9JVF9UUkFJVFMgPjo6dHlwZSwgX0FsbG9jPgorCisKKyAgLyoqCisgICAqICBBIHRyaWUtYmFzZWQgY29udGFpbmVyLgorICAgKgorICAgKiAgQHRwYXJhbSBLZXkgCSAgCUtleSB0eXBlLgorICAgKiAgQHRwYXJhbSBNYXBwZWQgCSAgCU1hcCB0eXBlLgorICAgKiAgQHRwYXJhbSBfQVRyYWl0cwkgIAlFbGVtZW50IGFjY2VzcyB0cmFpdHMuCisgICAqICBAdHBhcmFtIFRhZyAJICAJSW5zdGFudGlhdGluZyBkYXRhIHN0cnVjdHVyZSB0eXBlLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWUgY29udGFpbmVyX3RhZy4KKyAgICogIEB0cGFyYW0gTm9kZV9VcGRhdGUgCVVwZGF0ZXMgdHJpZSBpbnRlcm5hbC1ub2RlcywKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZXMgaW52YXJpYW50cyB3aGVuIGludmFsaWRhdGVkLgorICAgKiAgICAgICAgICAgICAgICAgICAgIFhYWCBTZWUgZGVzaWduOjp0cmVlLWJhc2VkLWNvbnRhaW5lcnM6Om5vZGUgaW52YXJpYW50cy4KKyAgICogIEB0cGFyYW0gX0FsbG9jIAkgIAlBbGxvY2F0b3IgdHlwZS4KKyAgICoKKyAgICogIEJhc2UgdGFnIGNob2ljZSBpcyBwYXRfdHJpZV90YWcuCisgICAqCisgICAqICBCYXNlIGlzIGJhc2ljX2JyYW5jaC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICB0eXBlbmFtZSBNYXBwZWQsCisJICAgdHlwZW5hbWUgX0FUcmFpdHMgPSBcCisJCSAgICB0eXBlbmFtZSBkZXRhaWw6OmRlZmF1bHRfdHJpZV9hY2Nlc3NfdHJhaXRzPEtleT46OnR5cGUsCisJICAgdHlwZW5hbWUgVGFnID0gcGF0X3RyaWVfdGFnLAorCSAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwKKwkJICAgIHR5cGVuYW1lIE5vZGVfSXRyLAorCQkgICAgdHlwZW5hbWUgX0FUcmFpdHNfLAorCQkgICAgdHlwZW5hbWUgX0FsbG9jXz4KKwkgICBjbGFzcyBOb2RlX1VwZGF0ZSA9IG51bGxfbm9kZV91cGRhdGUsCisJICAgdHlwZW5hbWUgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8Y2hhcj4gPgorICBjbGFzcyB0cmllIDogcHVibGljIFBCX0RTX1RSSUVfQkFTRQorICB7CisgIHByaXZhdGU6CisgICAgdHlwZWRlZiBQQl9EU19UUklFX0JBU0UJCQliYXNlX3R5cGU7CisKKyAgcHVibGljOgorICAgIC8vLyBFbGVtZW50IGFjY2VzcyB0cmFpdHMgdHlwZS4KKyAgICB0eXBlZGVmIF9BVHJhaXRzIAkJCQlhY2Nlc3NfdHJhaXRzOworCisgICAgdHJpZSgpIHsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBzb21lIHBvbGljeSBvYmplY3RzLiByX2FjY2Vzc190cmFpdHMgd2lsbAorICAgIC8vLyBiZSBjb3BpZWQgYnkgdGhlIF9BVHJhaXRzIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0cmllKGNvbnN0IGFjY2Vzc190cmFpdHMmIHQpCisgICAgOiBiYXNlX3R5cGUodCkgeyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIF9faXRlcmF0b3JzIHRvIGEgcmFuZ2Ugb2YgdmFsdWVfdHlwZXMuIFRoZQorICAgIC8vLyB2YWx1ZV90eXBlcyBiZXR3ZWVuIGZpcnN0X2l0IGFuZCBsYXN0X2l0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50bworICAgIC8vLyB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICB0cmllKEl0IGZpcnN0LCBJdCBsYXN0KQorICAgIHsgYmFzZV90eXBlOjpjb3B5X2Zyb21fcmFuZ2UoZmlyc3QsIGxhc3QpOyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIF9faXRlcmF0b3JzIHRvIGEgcmFuZ2Ugb2YgdmFsdWVfdHlwZXMgYW5kCisgICAgLy8vIHNvbWUgcG9saWN5IG9iamVjdHMuIFRoZSB2YWx1ZV90eXBlcyBiZXR3ZWVuIGZpcnN0X2l0IGFuZAorICAgIC8vLyBsYXN0X2l0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICB0cmllKEl0IGZpcnN0LCBJdCBsYXN0LCBjb25zdCBhY2Nlc3NfdHJhaXRzJiB0KQorICAgIDogYmFzZV90eXBlKHQpCisgICAgeyBiYXNlX3R5cGU6OmNvcHlfZnJvbV9yYW5nZShmaXJzdCwgbGFzdCk7IH0KKworICAgIHRyaWUoY29uc3QgdHJpZSYgb3RoZXIpCisgICAgOiBiYXNlX3R5cGUoKGNvbnN0IGJhc2VfdHlwZSYpb3RoZXIpIHsgfQorCisgICAgdmlydHVhbAorICAgIH50cmllKCkgeyB9CisKKyAgICB0cmllJgorICAgIG9wZXJhdG9yPShjb25zdCB0cmllJiBvdGhlcikKKyAgICB7CisgICAgICBpZiAodGhpcyAhPSAmb3RoZXIpCisJeworCSAgdHJpZSB0bXAob3RoZXIpOworCSAgc3dhcCh0bXApOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB2b2lkCisgICAgc3dhcCh0cmllJiBvdGhlcikKKyAgICB7IGJhc2VfdHlwZTo6c3dhcChvdGhlcik7IH0KKyAgfTsKKyAgLy9AfSBicmFuY2gtYmFzZWQKKyN1bmRlZiBQQl9EU19UUklFX0JBU0UKKyN1bmRlZiBQQl9EU19UUklFX05PREVfQU5EX0lUX1RSQUlUUworCisKKyAgLyoqCisgICAqICBAZGVmZ3JvdXAgbGlzdC1iYXNlZCBMaXN0LUJhc2VkCisgICAqICBAaW5ncm91cCBjb250YWluZXJzLXBiZHMKKyAgICogIEB7CisgICAqLworI2RlZmluZSBQQl9EU19MVV9CQVNFIFwKKyAgZGV0YWlsOjpjb250YWluZXJfYmFzZV9kaXNwYXRjaDxLZXksIE1hcHBlZCwgX0FsbG9jLCBsaXN0X3VwZGF0ZV90YWcsCVwKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjcmVhdGUyPEVxX0ZuLCBVcGRhdGVfUG9saWN5Pjo6dHlwZT46OnR5cGUKKworCisgIC8qKgorICAgKiAgQSBsaXN0LXVwZGF0ZSBiYXNlZCBhc3NvY2lhdGl2ZSBjb250YWluZXIuCisgICAqCisgICAqICBAdHBhcmFtIEtleSAJICAgIAlLZXkgdHlwZS4KKyAgICogIEB0cGFyYW0gTWFwcGVkIAkgICAgCU1hcCB0eXBlLgorICAgKiAgQHRwYXJhbSBFcV9GbgkgICAgCUVxdWFsIGZ1bmN0b3IuCisgICAqICBAdHBhcmFtIFVwZGF0ZV9Qb2xpY3kJVXBkYXRlIHBvbGljeSwgZGV0ZXJtaW5lcyB3aGVuIGFuIGVsZW1lbnQKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBtb3ZlZCB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QuCisgICAqICBAdHBhcmFtIF9BbGxvYyAJICAgIAlBbGxvY2F0b3IgdHlwZS4KKyAgICoKKyAgICogIEJhc2UgaXMgZGV0YWlsOjpsdV9tYXAuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgdHlwZW5hbWUgTWFwcGVkLAorCSAgIGNsYXNzIEVxX0ZuID0gdHlwZW5hbWUgZGV0YWlsOjpkZWZhdWx0X2VxX2ZuPEtleT46OnR5cGUsCisJICAgY2xhc3MgVXBkYXRlX1BvbGljeSA9IGRldGFpbDo6ZGVmYXVsdF91cGRhdGVfcG9saWN5Ojp0eXBlLAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4KKyAgY2xhc3MgbGlzdF91cGRhdGUgOiBwdWJsaWMgUEJfRFNfTFVfQkFTRQorICB7CisgIHByaXZhdGU6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQQl9EU19MVV9CQVNFIAkJYmFzZV90eXBlOworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIGxpc3RfdXBkYXRlX3RhZwkgICAgICAgCQljb250YWluZXJfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiBFcV9GbiAJCQkJZXFfZm47CisgICAgdHlwZWRlZiBVcGRhdGVfUG9saWN5IAkJCXVwZGF0ZV9wb2xpY3k7CisKKyAgICBsaXN0X3VwZGF0ZSgpIHsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzLiBUaGUKKyAgICAvLy8gdmFsdWVfdHlwZXMgYmV0d2VlbiBmaXJzdF9pdCBhbmQgbGFzdF9pdCB3aWxsIGJlIGluc2VydGVkIGludG8KKyAgICAvLy8gdGhlIGNvbnRhaW5lciBvYmplY3QuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgbGlzdF91cGRhdGUoSXQgZmlyc3QsIEl0IGxhc3QpCisgICAgeyBiYXNlX3R5cGU6OmNvcHlfZnJvbV9yYW5nZShmaXJzdCwgbGFzdCk7IH0KKworICAgIGxpc3RfdXBkYXRlKGNvbnN0IGxpc3RfdXBkYXRlJiBvdGhlcikKKyAgICA6IGJhc2VfdHlwZSgoY29uc3QgYmFzZV90eXBlJilvdGhlcikgeyB9CisKKyAgICB2aXJ0dWFsCisgICAgfmxpc3RfdXBkYXRlKCkgeyB9CisKKyAgICBsaXN0X3VwZGF0ZSYKKyAgICBvcGVyYXRvcj0oY29uc3QgbGlzdF91cGRhdGUmIG90aGVyKQorICAgIHsKKyAgICAgIGlmICh0aGlzICE9JiBvdGhlcikKKwl7CisJICBsaXN0X3VwZGF0ZSB0bXAob3RoZXIpOworCSAgc3dhcCh0bXApOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB2b2lkCisgICAgc3dhcChsaXN0X3VwZGF0ZSYgb3RoZXIpCisgICAgeyBiYXNlX3R5cGU6OnN3YXAob3RoZXIpOyB9CisgIH07CisgIC8vQH0gbGlzdC1iYXNlZAorI3VuZGVmIFBCX0RTX0xVX0JBU0UKKworICAvLyBAfSBncm91cCBjb250YWluZXJzLXBiZHMKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9iaW5fc2VhcmNoX3RyZWVfLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2Jpbl9zZWFyY2hfdHJlZV8uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNTgzOWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9iaW5fc2VhcmNoX3RyZWVfLmhwcApAQCAtMCwwICsxLDQyOCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiAgQGZpbGUgYmluX3NlYXJjaF90cmVlXy9iaW5fc2VhcmNoX3RyZWVfLmhwcAorICogIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBiaW5hcnkgc2VhcmNoIHRyZWUuCisgKi8KKworI2luY2x1ZGUgPGV4dC9wYl9kcy9leGNlcHRpb24uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy90cmVlX3BvbGljeS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9lcV9mbi9lcV9ieV9sZXNzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVzX3RyYWl0cy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jb25kX2RlYWx0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZV91dGlscy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90cmVlX3RyYWNlX2Jhc2UuaHBwPgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9kZWJ1Z19tYXBfYmFzZS5ocHA+CisjZW5kaWYKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19CSU5fVFJFRV9OQU1FIGJpbl9zZWFyY2hfdHJlZV9tYXAKKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyNkZWZpbmUgUEJfRFNfQklOX1RSRUVfTkFNRSBiaW5fc2VhcmNoX3RyZWVfc2V0CisjZW5kaWYKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIENtcF9GbiwgXAorCSAgICAgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIFBCX0RTX0JJTl9UUkVFX05BTUU8S2V5LCBNYXBwZWQsIENtcF9GbiwgTm9kZV9BbmRfSXRfVHJhaXRzLCBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfQklOX1RSRUVfVFJBSVRTX0JBU0UgXAorICAgIHR5cGVzX3RyYWl0czxLZXksIE1hcHBlZCwgX0FsbG9jLCBmYWxzZT4KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjZGVmaW5lIFBCX0RTX0RFQlVHX01BUF9CQVNFX0NfREVDICBcCisgICAgZGVidWdfbWFwX2Jhc2U8S2V5LAllcV9ieV9sZXNzPEtleSwgQ21wX0ZuPiwgXAorCSAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPEtleT46Om90aGVyOjpjb25zdF9yZWZlcmVuY2U+CisjZW5kaWYKKworI2lmZGVmIFBCX0RTX1RSRUVfVFJBQ0UKKyNkZWZpbmUgUEJfRFNfVFJFRV9UUkFDRV9CQVNFX0NfREVDIFwKKyAgICB0cmVlX3RyYWNlX2Jhc2U8dHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzOjpub2RlX2NvbnN0X2l0ZXJhdG9yLCBcCisJCSAgICB0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHM6Om5vZGVfaXRlcmF0b3IsCSAgICAgIFwKKwkJICAgIENtcF9GbiwgdHJ1ZSwgX0FsbG9jPgorI2VuZGlmCisKKworICAgIC8qCisgICAgICogIEBicmllZiBCaW5hcnkgc2VhcmNoIHRyZWUgKEJTVCkuCisgICAgICoKKyAgICAgKiAgVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIGFuIGlkZWEgZnJvbSB0aGUgU0dJIFNUTCAodXNpbmcgYSBAYQorICAgICAqICBoZWFkZXIgbm9kZSB3aGljaCBpcyBuZWVkZWQgZm9yIGVmZmljaWVudCBpdGVyYXRpb24pLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBDbXBfRm4sCisJICAgICB0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBQQl9EU19CSU5fVFJFRV9OQU1FIDoKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgcHVibGljIFBCX0RTX0RFQlVHX01BUF9CQVNFX0NfREVDLAorI2VuZGlmCisjaWZkZWYgUEJfRFNfVFJFRV9UUkFDRQorICAgICAgcHVibGljIFBCX0RTX1RSRUVfVFJBQ0VfQkFTRV9DX0RFQywKKyNlbmRpZgorICAgICAgcHVibGljIENtcF9GbiwKKyAgICAgIHB1YmxpYyBQQl9EU19CSU5fVFJFRV9UUkFJVFNfQkFTRSwKKyAgICAgIHB1YmxpYyBOb2RlX0FuZF9JdF9UcmFpdHM6Om5vZGVfdXBkYXRlCisgICAgeworICAgICAgdHlwZWRlZiBOb2RlX0FuZF9JdF9UcmFpdHMgCQkJdHJhaXRzX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIFBCX0RTX0JJTl9UUkVFX1RSQUlUU19CQVNFIAkgICAgICAgCXRyYWl0c19iYXNlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDx0eXBlbmFtZSB0cmFpdHNfdHlwZTo6bm9kZT46Om90aGVyCisgICAgICBub2RlX2FsbG9jYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBub2RlX2FsbG9jYXRvcjo6dmFsdWVfdHlwZSAJbm9kZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbm9kZV9hbGxvY2F0b3I6OnBvaW50ZXIgCQlub2RlX3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om51bGxfbm9kZV91cGRhdGVfcG9pbnRlcgorICAgICAgbnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyOworCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgY29uZF9kZWFsdG9yPG5vZGUsIF9BbGxvYz4gCQljb25kX2RlYWx0b3JfdDsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB0eXBlZGVmIFBCX0RTX0RFQlVHX01BUF9CQVNFX0NfREVDIAkJZGVidWdfYmFzZTsKKyNlbmRpZgorCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAJCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpkaWZmZXJlbmNlX3R5cGUgCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV90eXBlIAkJa2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfcG9pbnRlciAJa2V5X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfY29uc3RfcG9pbnRlciAJa2V5X2NvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfcmVmZXJlbmNlIAlrZXlfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X2NvbnN0X3JlZmVyZW5jZSBrZXlfY29uc3RfcmVmZXJlbmNlOworCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3R5cGUgCW1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3BvaW50ZXIgCW1hcHBlZF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX2NvbnN0X3BvaW50ZXIgbWFwcGVkX2NvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjptYXBwZWRfcmVmZXJlbmNlIAltYXBwZWRfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX2NvbnN0X3JlZmVyZW5jZSBtYXBwZWRfY29uc3RfcmVmZXJlbmNlOworI2VuZGlmCisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnZhbHVlX3R5cGUgCQl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6cG9pbnRlciAJCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9wb2ludGVyIAljb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6cmVmZXJlbmNlIAkJcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3RfcmVmZXJlbmNlIAljb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb2ludF9jb25zdF9pdGVyYXRvciBwb2ludF9jb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBwb2ludF9jb25zdF9pdGVyYXRvciAJCQljb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvaW50X2l0ZXJhdG9yIAlwb2ludF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgcG9pbnRfaXRlcmF0b3IgCQkJCWl0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnJldmVyc2VfaXRlcmF0b3IgCXJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpub2RlX2NvbnN0X2l0ZXJhdG9yIG5vZGVfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpub2RlX2l0ZXJhdG9yIAlub2RlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6bm9kZV91cGRhdGUgCW5vZGVfdXBkYXRlOworCisgICAgICB0eXBlZGVmIENtcF9GbiAJCQkJCWNtcF9mbjsKKyAgICAgIHR5cGVkZWYgX0FsbG9jIAkJCQkJYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIFBCX0RTX0JJTl9UUkVFX05BTUUoKTsKKworICAgICAgUEJfRFNfQklOX1RSRUVfTkFNRShjb25zdCBDbXBfRm4mKTsKKworICAgICAgUEJfRFNfQklOX1RSRUVfTkFNRShjb25zdCBDbXBfRm4mLCBjb25zdCBub2RlX3VwZGF0ZSYpOworCisgICAgICBQQl9EU19CSU5fVFJFRV9OQU1FKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgflBCX0RTX0JJTl9UUkVFX05BTUUoKTsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdDsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdDsKKworICAgICAgQ21wX0ZuJgorICAgICAgZ2V0X2NtcF9mbigpOworCisgICAgICBjb25zdCBDbXBfRm4mCisgICAgICBnZXRfY21wX2ZuKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoa2V5X2NvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBwb2ludF9jb25zdF9pdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoa2V5X2NvbnN0X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoa2V5X2NvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBwb2ludF9jb25zdF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoa2V5X2NvbnN0X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgZmluZChrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIHBvaW50X2NvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGtleV9jb25zdF9yZWZlcmVuY2UpIGNvbnN0OworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCk7CisKKyAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdDsKKworICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBlbmQoKTsKKworICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdDsKKworICAgICAgaW5saW5lIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpOworCisgICAgICBpbmxpbmUgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCk7CisKKyAgICAgIGlubGluZSBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3Q7CisKKyAgICAgIC8vLyBSZXR1cm5zIGEgY29uc3Qgbm9kZV9pdGVyYXRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBub2RlIGF0IHRoZQorICAgICAgLy8vIHJvb3Qgb2YgdGhlIHRyZWUuCisgICAgICBpbmxpbmUgbm9kZV9jb25zdF9pdGVyYXRvcgorICAgICAgbm9kZV9iZWdpbigpIGNvbnN0OworCisgICAgICAvLy8gUmV0dXJucyBhIG5vZGVfaXRlcmF0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgbm9kZSBhdCB0aGUKKyAgICAgIC8vLyByb290IG9mIHRoZSB0cmVlLgorICAgICAgaW5saW5lIG5vZGVfaXRlcmF0b3IKKyAgICAgIG5vZGVfYmVnaW4oKTsKKworICAgICAgLy8vIFJldHVybnMgYSBjb25zdCBub2RlX2l0ZXJhdG9yIGNvcnJlc3BvbmRpbmcgdG8gYSBub2RlIGp1c3QKKyAgICAgIC8vLyBhZnRlciBhIGxlYWYgb2YgdGhlIHRyZWUuCisgICAgICBpbmxpbmUgbm9kZV9jb25zdF9pdGVyYXRvcgorICAgICAgbm9kZV9lbmQoKSBjb25zdDsKKworICAgICAgLy8vIFJldHVybnMgYSBub2RlX2l0ZXJhdG9yIGNvcnJlc3BvbmRpbmcgdG8gYSBub2RlIGp1c3QKKyAgICAgIC8vLyBhZnRlciBhIGxlYWYgb2YgdGhlIHRyZWUuCisgICAgICBpbmxpbmUgbm9kZV9pdGVyYXRvcgorICAgICAgbm9kZV9lbmQoKTsKKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHZvaWQKKyAgICAgIHZhbHVlX3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdm9pZAorICAgICAgaW5pdGlhbGl6ZV9taW5fbWF4KCk7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgaW5zZXJ0X2ltcF9lbXB0eShjb25zdF9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGluc2VydF9sZWFmX25ldyhjb25zdF9yZWZlcmVuY2UsIG5vZGVfcG9pbnRlciwgYm9vbCk7CisKKyAgICAgIGlubGluZSBub2RlX3BvaW50ZXIKKyAgICAgIGdldF9uZXdfbm9kZV9mb3JfbGVhZl9pbnNlcnQoY29uc3RfcmVmZXJlbmNlLCBmYWxzZV90eXBlKTsKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgZ2V0X25ld19ub2RlX2Zvcl9sZWFmX2luc2VydChjb25zdF9yZWZlcmVuY2UsIHRydWVfdHlwZSk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBhY3R1YWxfZXJhc2Vfbm9kZShub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgc3RkOjpwYWlyPG5vZGVfcG9pbnRlciwgYm9vbD4KKyAgICAgIGVyYXNlKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICB1cGRhdGVfbWluX21heF9mb3JfZXJhc2VkX25vZGUobm9kZV9wb2ludGVyKTsKKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIGNsZWFyX2ltcChub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgc3RkOjpwYWlyPHBvaW50X2l0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0X2xlYWYoY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHJvdGF0ZV9sZWZ0KG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICByb3RhdGVfcmlnaHQobm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHJvdGF0ZV9wYXJlbnQobm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGFwcGx5X3VwZGF0ZShub2RlX3BvaW50ZXIsIG51bGxfbm9kZV91cGRhdGVfcG9pbnRlcik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfVXBkYXRlXz4KKwlpbmxpbmUgdm9pZAorCWFwcGx5X3VwZGF0ZShub2RlX3BvaW50ZXIsIE5vZGVfVXBkYXRlXyopOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgdXBkYXRlX3RvX3RvcChub2RlX3BvaW50ZXIsIG51bGxfbm9kZV91cGRhdGVfcG9pbnRlcik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfVXBkYXRlXz4KKwlpbmxpbmUgdm9pZAorCXVwZGF0ZV90b190b3Aobm9kZV9wb2ludGVyLCBOb2RlX1VwZGF0ZV8qKTsKKworICAgICAgYm9vbAorICAgICAgam9pbl9wcmVwKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIGpvaW5fZmluaXNoKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIGJvb2wKKyAgICAgIHNwbGl0X3ByZXAoa2V5X2NvbnN0X3JlZmVyZW5jZSwgUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdm9pZAorICAgICAgc3BsaXRfZmluaXNoKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgcmVjdXJzaXZlX2NvdW50KG5vZGVfcG9pbnRlcikgY29uc3Q7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBzdHJ1Y3R1cmVfb25seV9hc3NlcnRfdmFsaWQoY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnQoY29uc3Qgbm9kZV9wb2ludGVyLCBjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKyNlbmRpZgorCisgICAgcHJpdmF0ZToKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X2l0ZXJhdG9ycyhjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X2NvbnNpc3RlbnRfd2l0aF9kZWJ1Z19iYXNlKGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50X3dpdGhfbGVmdChjb25zdCBub2RlX3BvaW50ZXIsCisJCQkJICAgICAgIGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50X3dpdGhfcmlnaHQoY29uc3Qgbm9kZV9wb2ludGVyLAorCQkJCQljb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X2NvbnNpc3RlbnRfd2l0aF9kZWJ1Z19iYXNlKGNvbnN0IG5vZGVfcG9pbnRlciwKKwkJCQkJY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9taW4oY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9taW5faW1wKGNvbnN0IG5vZGVfcG9pbnRlciwgY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9tYXgoY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9tYXhfaW1wKGNvbnN0IG5vZGVfcG9pbnRlciwgY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9zaXplKGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworCisgICAgICB0eXBlZGVmIHN0ZDo6cGFpcjxjb25zdF9wb2ludGVyLCBjb25zdF9wb2ludGVyPiBub2RlX2NvbnNpc3RlbnRfdDsKKworICAgICAgbm9kZV9jb25zaXN0ZW50X3QKKyAgICAgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnRfKGNvbnN0IG5vZGVfcG9pbnRlciwgY29uc3QgY2hhciosIGludCkgY29uc3Q7CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgaW5pdGlhbGl6ZSgpOworCisgICAgICBub2RlX3BvaW50ZXIKKyAgICAgIHJlY3Vyc2l2ZV9jb3B5X25vZGUoY29uc3Qgbm9kZV9wb2ludGVyKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIG5vZGVfcG9pbnRlciAJCW1fcF9oZWFkOworICAgICAgc2l6ZV90eXBlIAkJbV9zaXplOworICAgICAgc3RhdGljIG5vZGVfYWxsb2NhdG9yIAlzX25vZGVfYWxsb2NhdG9yOworICAgIH07CisKKyNkZWZpbmUgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKFgpCQkJCVwKKyAgX0dMSUJDWFhfREVCVUdfT05MWShYLnN0cnVjdHVyZV9vbmx5X2Fzc2VydF92YWxpZChfX0ZJTEVfXywgX19MSU5FX18pOykKKworI2RlZmluZSBQQl9EU19BU1NFUlRfTk9ERV9DT05TSVNURU5UKF9Ob2RlKQkJCQlcCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X25vZGVfY29uc2lzdGVudChfTm9kZSwgX19GSUxFX18sIF9fTElORV9fKTspCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vZGVidWdfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2luc2VydF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vZXJhc2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2ZpbmRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2luZm9fZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3JvdGF0ZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcD4KKworI3VuZGVmIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQKKyN1bmRlZiBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQklOX1RSRUVfTkFNRQorI3VuZGVmIFBCX0RTX0JJTl9UUkVFX1RSQUlUU19CQVNFCisjdW5kZWYgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMKKworI2lmZGVmIFBCX0RTX1RSRUVfVFJBQ0UKKyN1bmRlZiBQQl9EU19UUkVFX1RSQUNFX0JBU0VfQ19ERUMKKyNlbmRpZgorICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhYWY0MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMjE4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbl9zZWFyY2hfdHJlZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBiaW5fc2VhcmNoX3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9hbGxvY2F0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjpzX25vZGVfYWxsb2NhdG9yOworCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfQklOX1RSRUVfTkFNRSgpIDogbV9wX2hlYWQoc19ub2RlX2FsbG9jYXRvci5hbGxvY2F0ZSgxKSksIG1fc2l6ZSgwKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX1NUUlVDVF9PTkxZX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfQklOX1RSRUVfTkFNRShjb25zdCBDbXBfRm4mIHJfY21wX2ZuKSA6CisgIENtcF9GbihyX2NtcF9mbiksIG1fcF9oZWFkKHNfbm9kZV9hbGxvY2F0b3IuYWxsb2NhdGUoMSkpLCBtX3NpemUoMCkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0JJTl9UUkVFX05BTUUoY29uc3QgQ21wX0ZuJiByX2NtcF9mbiwgY29uc3Qgbm9kZV91cGRhdGUmIHJfbm9kZV91cGRhdGUpIDoKKyAgQ21wX0ZuKHJfY21wX2ZuKSwKKyAgbm9kZV91cGRhdGUocl9ub2RlX3VwZGF0ZSksCisgIG1fcF9oZWFkKHNfbm9kZV9hbGxvY2F0b3IuYWxsb2NhdGUoMSkpLAorICBtX3NpemUoMCkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0JJTl9UUkVFX05BTUUoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSA6CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgZGVidWdfYmFzZShvdGhlciksCisjZW5kaWYgCisjaWZkZWYgUEJfRFNfVFJFRV9UUkFDRQorICBQQl9EU19UUkVFX1RSQUNFX0JBU0VfQ19ERUMob3RoZXIpLAorI2VuZGlmIAorICBDbXBfRm4ob3RoZXIpLAorICBub2RlX3VwZGF0ZShvdGhlciksCisgIG1fcF9oZWFkKHNfbm9kZV9hbGxvY2F0b3IuYWxsb2NhdGUoMSkpLAorICBtX3NpemUoMCkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBtX3NpemUgPSBvdGhlci5tX3NpemU7CisgIFBCX0RTX1NUUlVDVF9PTkxZX0FTU0VSVF9WQUxJRChvdGhlcikKKworICAgIF9fdHJ5CisgICAgICB7CisgICAgICAgIG1fcF9oZWFkLT5tX3BfcGFyZW50ID0gcmVjdXJzaXZlX2NvcHlfbm9kZShvdGhlci5tX3BfaGVhZC0+bV9wX3BhcmVudCk7CisgICAgICAgIGlmIChtX3BfaGVhZC0+bV9wX3BhcmVudCAhPSAwKQorCSAgbV9wX2hlYWQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQgPSBtX3BfaGVhZDsKKyAgICAgICAgbV9zaXplID0gb3RoZXIubV9zaXplOworICAgICAgICBpbml0aWFsaXplX21pbl9tYXgoKTsKKyAgICAgIH0KKyAgICBfX2NhdGNoKC4uLikKKyAgICAgIHsKKyAgICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjbGVhcigpOykKKwlzX25vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9wX2hlYWQsIDEpOworICAgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICAgIH0KKyAgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX1NUUlVDVF9PTkxZX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgdmFsdWVfc3dhcChvdGhlcik7CisgIHN0ZDo6c3dhcCgoQ21wX0ZuJiApKCp0aGlzKSwgKENtcF9GbiYgKW90aGVyKTsKKyAgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX1NUUlVDVF9PTkxZX0FTU0VSVF9WQUxJRChvdGhlcikKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3ZhbHVlX3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OnN3YXAob3RoZXIpOykKKyAgc3RkOjpzd2FwKG1fcF9oZWFkLCBvdGhlci5tX3BfaGVhZCk7CisgIHN0ZDo6c3dhcChtX3NpemUsIG90aGVyLm1fc2l6ZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+UEJfRFNfQklOX1RSRUVfTkFNRSgpCit7CisgIGNsZWFyKCk7CisgIHNfbm9kZV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShtX3BfaGVhZCwgMSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citpbml0aWFsaXplKCkKK3sKKyAgbV9wX2hlYWQtPm1fcF9wYXJlbnQgPSAwOworICBtX3BfaGVhZC0+bV9wX2xlZnQgPSBtX3BfaGVhZDsKKyAgbV9wX2hlYWQtPm1fcF9yaWdodCA9IG1fcF9oZWFkOworICBtX3NpemUgPSAwOworfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVjdXJzaXZlX2NvcHlfbm9kZShjb25zdCBub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgaWYgKHBfbmQgPT0gMCkKKyAgICByZXR1cm4gKDApOworCisgIG5vZGVfcG9pbnRlciBwX3JldCA9IHNfbm9kZV9hbGxvY2F0b3IuYWxsb2NhdGUoMSk7CisgIF9fdHJ5CisgICAgeworICAgICAgbmV3IChwX3JldCkgbm9kZSgqcF9uZCk7CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7CisgICAgICBzX25vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF9yZXQsIDEpOworICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgfQorCisgIHBfcmV0LT5tX3BfbGVmdCA9IHBfcmV0LT5tX3BfcmlnaHQgPSAwOworCisgIF9fdHJ5CisgICAgeworICAgICAgcF9yZXQtPm1fcF9sZWZ0ID0gcmVjdXJzaXZlX2NvcHlfbm9kZShwX25kLT5tX3BfbGVmdCk7CisgICAgICBwX3JldC0+bV9wX3JpZ2h0ID0gcmVjdXJzaXZlX2NvcHlfbm9kZShwX25kLT5tX3BfcmlnaHQpOworICAgIH0KKyAgX19jYXRjaCguLi4pCisgICAgeworICAgICAgY2xlYXJfaW1wKHBfcmV0KTsKKyAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgIH0KKworICBpZiAocF9yZXQtPm1fcF9sZWZ0ICE9IDApCisgICAgcF9yZXQtPm1fcF9sZWZ0LT5tX3BfcGFyZW50ID0gcF9yZXQ7CisKKyAgaWYgKHBfcmV0LT5tX3BfcmlnaHQgIT0gMCkKKyAgICBwX3JldC0+bV9wX3JpZ2h0LT5tX3BfcGFyZW50ID0gcF9yZXQ7CisKKyAgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChwX3JldCkKKyAgcmV0dXJuIHBfcmV0OworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5pdGlhbGl6ZV9taW5fbWF4KCkKK3sKKyAgaWYgKG1fcF9oZWFkLT5tX3BfcGFyZW50ID09IDApCisgICAgeworICAgICAgbV9wX2hlYWQtPm1fcF9sZWZ0ID0gbV9wX2hlYWQtPm1fcF9yaWdodCA9IG1fcF9oZWFkOworICAgICAgcmV0dXJuOworICAgIH0KKworICB7CisgICAgbm9kZV9wb2ludGVyIHBfbWluID0gbV9wX2hlYWQtPm1fcF9wYXJlbnQ7CisgICAgd2hpbGUgKHBfbWluLT5tX3BfbGVmdCAhPSAwKQorICAgICAgcF9taW4gPSBwX21pbi0+bV9wX2xlZnQ7CisgICAgbV9wX2hlYWQtPm1fcF9sZWZ0ID0gcF9taW47CisgIH0KKworICB7CisgICAgbm9kZV9wb2ludGVyIHBfbWF4ID0gbV9wX2hlYWQtPm1fcF9wYXJlbnQ7CisgICAgd2hpbGUgKHBfbWF4LT5tX3BfcmlnaHQgIT0gMCkKKyAgICAgIHBfbWF4ID0gcF9tYXgtPm1fcF9yaWdodDsKKyAgICBtX3BfaGVhZC0+bV9wX3JpZ2h0ID0gcF9tYXg7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vZGVidWdfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9kZWJ1Z19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDU2ZDIzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vZGVidWdfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwyNzcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluX3NlYXJjaF90cmVlXy9kZWJ1Z19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGJpbl9zZWFyY2hfdHJlZV8uCisgKi8KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfdmFsaWQoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBzdHJ1Y3R1cmVfb25seV9hc3NlcnRfdmFsaWQoX19maWxlLCBfX2xpbmUpOworICBhc3NlcnRfY29uc2lzdGVudF93aXRoX2RlYnVnX2Jhc2UoX19maWxlLCBfX2xpbmUpOworICBhc3NlcnRfc2l6ZShfX2ZpbGUsIF9fbGluZSk7CisgIGFzc2VydF9pdGVyYXRvcnMoX19maWxlLCBfX2xpbmUpOworICBpZiAobV9wX2hlYWQtPm1fcF9wYXJlbnQgPT0gMCkKKyAgICB7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkobV9zaXplID09IDApOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShtX3NpemUgPiAwKTsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzdHJ1Y3R1cmVfb25seV9hc3NlcnRfdmFsaWQoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBQQl9EU19ERUJVR19WRVJJRlkobV9wX2hlYWQgIT0gMCk7CisgIGlmIChtX3BfaGVhZC0+bV9wX3BhcmVudCA9PSAwKQorICAgIHsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShtX3BfaGVhZC0+bV9wX2xlZnQgPT0gbV9wX2hlYWQpOworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKG1fcF9oZWFkLT5tX3BfcmlnaHQgPT0gbV9wX2hlYWQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShtX3BfaGVhZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudCA9PSBtX3BfaGVhZCk7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkobV9wX2hlYWQtPm1fcF9sZWZ0ICE9IG1fcF9oZWFkKTsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShtX3BfaGVhZC0+bV9wX3JpZ2h0ICE9IG1fcF9oZWFkKTsKKyAgICB9CisKKyAgaWYgKG1fcF9oZWFkLT5tX3BfcGFyZW50ICE9IDApCisgICAgYXNzZXJ0X25vZGVfY29uc2lzdGVudChtX3BfaGVhZC0+bV9wX3BhcmVudCwgX19maWxlLCBfX2xpbmUpOworICBhc3NlcnRfbWluKF9fZmlsZSwgX19saW5lKTsKKyAgYXNzZXJ0X21heChfX2ZpbGUsIF9fbGluZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfbm9kZV9jb25zaXN0ZW50KGNvbnN0IG5vZGVfcG9pbnRlciBwX25kLAorCQkgICAgICAgY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50XyhwX25kLCBfX2ZpbGUsIF9fbGluZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9jb25zaXN0ZW50X3QKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF9ub2RlX2NvbnNpc3RlbnRfKGNvbnN0IG5vZGVfcG9pbnRlciBwX25kLAorCQkJY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBpZiAocF9uZCA9PSAwKQorICAgIHJldHVybiAoc3RkOjptYWtlX3BhaXIoKGNvbnN0X3BvaW50ZXIpMCwoY29uc3RfcG9pbnRlcikwKSk7CisKKyAgYXNzZXJ0X25vZGVfY29uc2lzdGVudF93aXRoX2xlZnQocF9uZCwgX19maWxlLCBfX2xpbmUpOworICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50X3dpdGhfcmlnaHQocF9uZCwgX19maWxlLCBfX2xpbmUpOworCisgIGNvbnN0IHN0ZDo6cGFpcjxjb25zdF9wb2ludGVyLCBjb25zdF9wb2ludGVyPgorICAgIGxfcmFuZ2UgPSBhc3NlcnRfbm9kZV9jb25zaXN0ZW50XyhwX25kLT5tX3BfbGVmdCwgX19maWxlLCBfX2xpbmUpOworCisgIGlmIChsX3JhbmdlLnNlY29uZCAhPSAwKQorICAgIFBCX0RTX0RFQlVHX1ZFUklGWShDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKCpsX3JhbmdlLnNlY29uZCksCisJCQkJCSAgUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpKSk7CisKKyAgY29uc3Qgc3RkOjpwYWlyPGNvbnN0X3BvaW50ZXIsIGNvbnN0X3BvaW50ZXI+CisgICAgcl9yYW5nZSA9IGFzc2VydF9ub2RlX2NvbnNpc3RlbnRfKHBfbmQtPm1fcF9yaWdodCwgX19maWxlLCBfX2xpbmUpOworCisgIGlmIChyX3JhbmdlLmZpcnN0ICE9IDApCisgICAgUEJfRFNfREVCVUdfVkVSSUZZKENtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9uZC0+bV92YWx1ZSksCisJCQkJCSAgICAgUEJfRFNfVjJGKCpyX3JhbmdlLmZpcnN0KSkpOworCisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigobF9yYW5nZS5maXJzdCAhPSAwKSA/IGxfcmFuZ2UuZmlyc3QgOiAmcF9uZC0+bV92YWx1ZSwKKwkJCShyX3JhbmdlLnNlY29uZCAhPSAwKT8gcl9yYW5nZS5zZWNvbmQgOiAmcF9uZC0+bV92YWx1ZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfbm9kZV9jb25zaXN0ZW50X3dpdGhfbGVmdChjb25zdCBub2RlX3BvaW50ZXIgcF9uZCwKKwkJCQkgY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBpZiAocF9uZC0+bV9wX2xlZnQgPT0gMCkKKyAgICByZXR1cm47CisgIFBCX0RTX0RFQlVHX1ZFUklGWShwX25kLT5tX3BfbGVmdC0+bV9wX3BhcmVudCA9PSBwX25kKTsKKyAgUEJfRFNfREVCVUdfVkVSSUZZKCFDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpLAorCQkJCQkgUEJfRFNfVjJGKHBfbmQtPm1fcF9sZWZ0LT5tX3ZhbHVlKSkpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X25vZGVfY29uc2lzdGVudF93aXRoX3JpZ2h0KGNvbnN0IG5vZGVfcG9pbnRlciBwX25kLAorCQkJCSAgY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBpZiAocF9uZC0+bV9wX3JpZ2h0ID09IDApCisgICAgcmV0dXJuOworICBQQl9EU19ERUJVR19WRVJJRlkocF9uZC0+bV9wX3JpZ2h0LT5tX3BfcGFyZW50ID09IHBfbmQpOworICBQQl9EU19ERUJVR19WRVJJRlkoIUNtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9uZC0+bV9wX3JpZ2h0LT5tX3ZhbHVlKSwKKwkJCQkJIFBCX0RTX1YyRihwX25kLT5tX3ZhbHVlKSkpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X21pbihjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGFzc2VydF9taW5faW1wKG1fcF9oZWFkLT5tX3BfcGFyZW50LCBfX2ZpbGUsIF9fbGluZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfbWluX2ltcChjb25zdCBub2RlX3BvaW50ZXIgcF9uZCwgY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBpZiAocF9uZCA9PSAwKQorICAgIHsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShtX3BfaGVhZC0+bV9wX2xlZnQgPT0gbV9wX2hlYWQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAocF9uZC0+bV9wX2xlZnQgPT0gMCkKKyAgICB7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkocF9uZCA9PSBtX3BfaGVhZC0+bV9wX2xlZnQpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgYXNzZXJ0X21pbl9pbXAocF9uZC0+bV9wX2xlZnQsIF9fZmlsZSwgX19saW5lKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF9tYXgoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBhc3NlcnRfbWF4X2ltcChtX3BfaGVhZC0+bV9wX3BhcmVudCwgX19maWxlLCBfX2xpbmUpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X21heF9pbXAoY29uc3Qgbm9kZV9wb2ludGVyIHBfbmQsCisJICAgICAgIGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgaWYgKHBfbmQgPT0gMCkKKyAgICB7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkobV9wX2hlYWQtPm1fcF9yaWdodCA9PSBtX3BfaGVhZCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChwX25kLT5tX3BfcmlnaHQgPT0gMCkKKyAgICB7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkocF9uZCA9PSBtX3BfaGVhZC0+bV9wX3JpZ2h0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgYXNzZXJ0X21heF9pbXAocF9uZC0+bV9wX3JpZ2h0LCBfX2ZpbGUsIF9fbGluZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfaXRlcmF0b3JzKGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgc2l6ZV90eXBlIGl0ZXJhdGVkX251bSA9IDA7CisgIGNvbnN0X2l0ZXJhdG9yIHByZXZfaXQgPSBlbmQoKTsKKyAgZm9yIChjb25zdF9pdGVyYXRvciBpdCA9IGJlZ2luKCk7IGl0ICE9IGVuZCgpOyArK2l0KQorICAgIHsKKyAgICAgICsraXRlcmF0ZWRfbnVtOworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKGxvd2VyX2JvdW5kKFBCX0RTX1YyRigqaXQpKS5tX3BfbmQgPT0gaXQubV9wX25kKTsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIHVwcGVyX2JvdW5kX2l0ID0gdXBwZXJfYm91bmQoUEJfRFNfVjJGKCppdCkpOworICAgICAgLS11cHBlcl9ib3VuZF9pdDsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWSh1cHBlcl9ib3VuZF9pdC5tX3BfbmQgPT0gaXQubV9wX25kKTsKKworICAgICAgaWYgKHByZXZfaXQgIT0gZW5kKCkpCisJUEJfRFNfREVCVUdfVkVSSUZZKENtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYoKnByZXZfaXQpLAorCQkJCQkgICAgICBQQl9EU19WMkYoKml0KSkpOworICAgICAgcHJldl9pdCA9IGl0OworICAgIH0KKworICBQQl9EU19ERUJVR19WRVJJRlkoaXRlcmF0ZWRfbnVtID09IG1fc2l6ZSk7CisgIHNpemVfdHlwZSByZXZlcnNlX2l0ZXJhdGVkX251bSA9IDA7CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9wcmV2X2l0ID0gcmVuZCgpOworICBmb3IgKGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9pdCA9IHJiZWdpbigpOyByZXZlcnNlX2l0ICE9IHJlbmQoKTsKKyAgICAgICArK3JldmVyc2VfaXQpCisgICAgeworICAgICAgKytyZXZlcnNlX2l0ZXJhdGVkX251bTsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShsb3dlcl9ib3VuZCgKKwkJCQkgICBQQl9EU19WMkYoKnJldmVyc2VfaXQpKS5tX3BfbmQgPT0gcmV2ZXJzZV9pdC5tX3BfbmQpOworCisgICAgICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZF9pdCA9IHVwcGVyX2JvdW5kKFBCX0RTX1YyRigqcmV2ZXJzZV9pdCkpOworICAgICAgLS11cHBlcl9ib3VuZF9pdDsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWSh1cHBlcl9ib3VuZF9pdC5tX3BfbmQgPT0gcmV2ZXJzZV9pdC5tX3BfbmQpOworICAgICAgaWYgKHJldmVyc2VfcHJldl9pdCAhPSByZW5kKCkpCisJUEJfRFNfREVCVUdfVkVSSUZZKCFDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKCpyZXZlcnNlX3ByZXZfaXQpLAorCQkJCQkgICAgICAgUEJfRFNfVjJGKCpyZXZlcnNlX2l0KSkpOworICAgICAgcmV2ZXJzZV9wcmV2X2l0ID0gcmV2ZXJzZV9pdDsKKyAgICB9CisgIFBCX0RTX0RFQlVHX1ZFUklGWShyZXZlcnNlX2l0ZXJhdGVkX251bSA9PSBtX3NpemUpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X2NvbnNpc3RlbnRfd2l0aF9kZWJ1Z19iYXNlKGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgZGVidWdfYmFzZTo6Y2hlY2tfc2l6ZShtX3NpemUsIF9fZmlsZSwgX19saW5lKTsKKyAgYXNzZXJ0X2NvbnNpc3RlbnRfd2l0aF9kZWJ1Z19iYXNlKG1fcF9oZWFkLT5tX3BfcGFyZW50LCBfX2ZpbGUsIF9fbGluZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfY29uc2lzdGVudF93aXRoX2RlYnVnX2Jhc2UoY29uc3Qgbm9kZV9wb2ludGVyIHBfbmQsCisJCQkJICBjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuOworICBkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKFBCX0RTX1YyRihwX25kLT5tX3ZhbHVlKSwgX19maWxlLCBfX2xpbmUpOworICBhc3NlcnRfY29uc2lzdGVudF93aXRoX2RlYnVnX2Jhc2UocF9uZC0+bV9wX2xlZnQsIF9fZmlsZSwgX19saW5lKTsKKyAgYXNzZXJ0X2NvbnNpc3RlbnRfd2l0aF9kZWJ1Z19iYXNlKHBfbmQtPm1fcF9yaWdodCwgX19maWxlLCBfX2xpbmUpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3NpemUoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreyBQQl9EU19ERUJVR19WRVJJRlkocmVjdXJzaXZlX2NvdW50KG1fcF9oZWFkLT5tX3BfcGFyZW50KSA9PSBtX3NpemUpOyB9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vZXJhc2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9lcmFzZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGI5MDgzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vZXJhc2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMDMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluX3NlYXJjaF90cmVlXy9lcmFzZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGJpbl9zZWFyY2hfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CithY3R1YWxfZXJhc2Vfbm9kZShub2RlX3BvaW50ZXIgcF96KQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9zaXplID4gMCk7CisgIC0tbV9zaXplOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmVyYXNlX2V4aXN0aW5nKFBCX0RTX1YyRihwX3otPm1fdmFsdWUpKTspCisgIHBfei0+fm5vZGUoKTsKKyAgc19ub2RlX2FsbG9jYXRvci5kZWFsbG9jYXRlKHBfeiwgMSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordXBkYXRlX21pbl9tYXhfZm9yX2VyYXNlZF9ub2RlKG5vZGVfcG9pbnRlciBwX3opCit7CisgIGlmIChtX3NpemUgPT0gMSkKKyAgICB7CisgICAgICBtX3BfaGVhZC0+bV9wX2xlZnQgPSBtX3BfaGVhZC0+bV9wX3JpZ2h0ID0gbV9wX2hlYWQ7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChtX3BfaGVhZC0+bV9wX2xlZnQgPT0gcF96KQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIGl0KHBfeik7CisgICAgICArK2l0OworICAgICAgbV9wX2hlYWQtPm1fcF9sZWZ0ID0gaXQubV9wX25kOworICAgIH0KKyAgZWxzZSBpZiAobV9wX2hlYWQtPm1fcF9yaWdodCA9PSBwX3opCisgICAgeworICAgICAgaXRlcmF0b3IgaXQocF96KTsKKyAgICAgIC0taXQ7CisgICAgICBtX3BfaGVhZC0+bV9wX3JpZ2h0ID0gaXQubV9wX25kOworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NsZWFyKCkKK3sKKyAgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIGNsZWFyX2ltcChtX3BfaGVhZC0+bV9wX3BhcmVudCk7CisgIG1fc2l6ZSA9IDA7CisgIGluaXRpYWxpemUoKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjbGVhcigpOykKKyAgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcl9pbXAobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuOworCisgIGNsZWFyX2ltcChwX25kLT5tX3BfbGVmdCk7CisgIGNsZWFyX2ltcChwX25kLT5tX3BfcmlnaHQpOworICBwX25kLT5+bm9kZSgpOworICBzX25vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF9uZCwgMSk7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9maW5kX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vZmluZF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjFlZjk4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vZmluZF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDE3MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5fc2VhcmNoX3RyZWVfL2ZpbmRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBiaW5fc2VhcmNoX3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2NvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Citsb3dlcl9ib3VuZChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KSBjb25zdAoreworICBub2RlX3BvaW50ZXIgcF9wb3QgPSBtX3BfaGVhZDsKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBtX3BfaGVhZC0+bV9wX3BhcmVudDsKKworICB3aGlsZSAocF9uZCAhPSAwKQorICAgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpLCByX2tleSkpCisgICAgICBwX25kID0gcF9uZC0+bV9wX3JpZ2h0OworICAgIGVsc2UKKyAgICAgIHsKKwlwX3BvdCA9IHBfbmQ7CisJcF9uZCA9IHBfbmQtPm1fcF9sZWZ0OworICAgICAgfQorICByZXR1cm4gaXRlcmF0b3IocF9wb3QpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbG93ZXJfYm91bmQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKK3sKKyAgbm9kZV9wb2ludGVyIHBfcG90ID0gbV9wX2hlYWQ7CisgIG5vZGVfcG9pbnRlciBwX25kID0gbV9wX2hlYWQtPm1fcF9wYXJlbnQ7CisKKyAgd2hpbGUgKHBfbmQgIT0gMCkKKyAgICBpZiAoQ21wX0ZuOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX25kLT5tX3ZhbHVlKSwgcl9rZXkpKQorICAgICAgcF9uZCA9IHBfbmQtPm1fcF9yaWdodDsKKyAgICBlbHNlCisgICAgICB7CisJcF9wb3QgPSBwX25kOworCXBfbmQgPSBwX25kLT5tX3BfbGVmdDsKKyAgICAgIH0KKyAgcmV0dXJuIGl0ZXJhdG9yKHBfcG90KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfY29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3VwcGVyX2JvdW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0Cit7CisgIG5vZGVfcG9pbnRlciBwX3BvdCA9IG1fcF9oZWFkOworICBub2RlX3BvaW50ZXIgcF9uZCA9IG1fcF9oZWFkLT5tX3BfcGFyZW50OworCisgIHdoaWxlIChwX25kICE9IDApCisgICAgaWYgKENtcF9Gbjo6b3BlcmF0b3IoKShyX2tleSwgUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpKSkKKyAgICAgIHsKKwlwX3BvdCA9IHBfbmQ7CisJcF9uZCA9IHBfbmQtPm1fcF9sZWZ0OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHBfbmQgPSBwX25kLT5tX3BfcmlnaHQ7CisgIHJldHVybiBjb25zdF9pdGVyYXRvcihwX3BvdCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Cit1cHBlcl9ib3VuZChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQoreworICBub2RlX3BvaW50ZXIgcF9wb3QgPSBtX3BfaGVhZDsKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBtX3BfaGVhZC0+bV9wX3BhcmVudDsKKworICB3aGlsZSAocF9uZCAhPSAwKQorICAgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkocl9rZXksIFBCX0RTX1YyRihwX25kLT5tX3ZhbHVlKSkpCisgICAgICB7CisJcF9wb3QgPSBwX25kOworCXBfbmQgPSBwX25kLT5tX3BfbGVmdDsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBwX25kID0gcF9uZC0+bV9wX3JpZ2h0OworICByZXR1cm4gcG9pbnRfaXRlcmF0b3IocF9wb3QpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQoreworICBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgbm9kZV9wb2ludGVyIHBfcG90ID0gbV9wX2hlYWQ7CisgIG5vZGVfcG9pbnRlciBwX25kID0gbV9wX2hlYWQtPm1fcF9wYXJlbnQ7CisKKyAgd2hpbGUgKHBfbmQgIT0gMCkKKyAgICBpZiAoIUNtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9uZC0+bV92YWx1ZSksIHJfa2V5KSkKKyAgICAgIHsKKwlwX3BvdCA9IHBfbmQ7CisJcF9uZCA9IHBfbmQtPm1fcF9sZWZ0OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHBfbmQgPSBwX25kLT5tX3BfcmlnaHQ7CisKKyAgbm9kZV9wb2ludGVyIHJldCA9IHBfcG90OworICBpZiAocF9wb3QgIT0gbV9wX2hlYWQpCisgICAgeworICAgICAgY29uc3QgYm9vbCBfX2NtcCA9IENtcF9Gbjo6b3BlcmF0b3IoKShyX2tleSwgUEJfRFNfVjJGKHBfcG90LT5tX3ZhbHVlKSk7CisgICAgICBpZiAoX19jbXApCisJcmV0ID0gbV9wX2hlYWQ7CisgICAgfQorICByZXR1cm4gcG9pbnRfaXRlcmF0b3IocmV0KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfY29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkgY29uc3QKK3sKKyAgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIG5vZGVfcG9pbnRlciBwX3BvdCA9IG1fcF9oZWFkOworICBub2RlX3BvaW50ZXIgcF9uZCA9IG1fcF9oZWFkLT5tX3BfcGFyZW50OworCisgIHdoaWxlIChwX25kICE9IDApCisgICAgaWYgKCFDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpLCByX2tleSkpCisgICAgICB7CisJcF9wb3QgPSBwX25kOworCXBfbmQgPSBwX25kLT5tX3BfbGVmdDsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBwX25kID0gcF9uZC0+bV9wX3JpZ2h0OworCisgIG5vZGVfcG9pbnRlciByZXQgPSBwX3BvdDsKKyAgaWYgKHBfcG90ICE9IG1fcF9oZWFkKQorICAgIHsKKyAgICAgIGNvbnN0IGJvb2wgX19jbXAgPSBDbXBfRm46Om9wZXJhdG9yKCkocl9rZXksIFBCX0RTX1YyRihwX3BvdC0+bV92YWx1ZSkpOworICAgICAgaWYgKF9fY21wKQorCXJldCA9IG1fcF9oZWFkOworICAgIH0KKyAgcmV0dXJuIHBvaW50X2NvbnN0X2l0ZXJhdG9yKHJldCk7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9pbmZvX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vaW5mb19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjVjNGUwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vaW5mb19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDY0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbl9zZWFyY2hfdHJlZV8vaW5mb19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGJpbl9zZWFyY2hfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlbXB0eSgpIGNvbnN0Cit7CisgIHJldHVybiAobV9zaXplID09IDApOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NpemUoKSBjb25zdAoreworICByZXR1cm4gKG1fc2l6ZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbWF4X3NpemUoKSBjb25zdAoreworICByZXR1cm4gKHNfbm9kZV9hbGxvY2F0b3IubWF4X3NpemUoKSk7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2luc2VydF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2luc2VydF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDE3ZGIzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vaW5zZXJ0X2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTgwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbl9zZWFyY2hfdHJlZV8vaW5zZXJ0X2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYmluX3NlYXJjaF90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHN0ZDo6cGFpcjx0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IsIGJvb2w+CitQQl9EU19DTEFTU19DX0RFQzo6CitpbnNlcnRfbGVhZihjb25zdF9yZWZlcmVuY2Ugcl92YWx1ZSkKK3sKKyAgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisKKyAgaWYgKG1fc2l6ZSA9PSAwKQorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpbnNlcnRfaW1wX2VtcHR5KHJfdmFsdWUpLAorCQkJICB0cnVlKTsKKworICBub2RlX3BvaW50ZXIgcF9uZCA9IG1fcF9oZWFkLT5tX3BfcGFyZW50OworICBub2RlX3BvaW50ZXIgcF9wb3QgPSBtX3BfaGVhZDsKKworICB3aGlsZSAocF9uZCAhPSAwKQorICAgIGlmICghQ21wX0ZuOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX25kLT5tX3ZhbHVlKSwKKwkJCSAgICBQQl9EU19WMkYocl92YWx1ZSkpKQorICAgICAgeworCXBfcG90ID0gcF9uZDsKKworCXBfbmQgPSBwX25kLT5tX3BfbGVmdDsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBwX25kID0gcF9uZC0+bV9wX3JpZ2h0OworCisgIGlmIChwX3BvdCA9PSBtX3BfaGVhZCkKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaW5zZXJ0X2xlYWZfbmV3KHJfdmFsdWUsIG1fcF9oZWFkLT5tX3BfcmlnaHQsIGZhbHNlKSwKKwkJCSAgdHJ1ZSk7CisKKyAgaWYgKCFDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHJfdmFsdWUpLAorCQkJICBQQl9EU19WMkYocF9wb3QtPm1fdmFsdWUpKSkKKyAgICB7CisgICAgICBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMoUEJfRFNfVjJGKHJfdmFsdWUpKQorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHBfcG90LCBmYWxzZSk7CisgICAgfQorCisgIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChQQl9EU19WMkYocl92YWx1ZSkpCisKKyAgcF9uZCA9IHBfcG90LT5tX3BfbGVmdDsKKyAgaWYgKHBfbmQgPT0gMCkKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaW5zZXJ0X2xlYWZfbmV3KHJfdmFsdWUsIHBfcG90LCB0cnVlKSwKKwkJCSAgdHJ1ZSk7CisKKyAgd2hpbGUgKHBfbmQtPm1fcF9yaWdodCAhPSAwKQorICAgIHBfbmQgPSBwX25kLT5tX3BfcmlnaHQ7CisKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGluc2VydF9sZWFmX25ldyhyX3ZhbHVlLCBwX25kLCBmYWxzZSksCisJCQl0cnVlKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luc2VydF9sZWFmX25ldyhjb25zdF9yZWZlcmVuY2Ugcl92YWx1ZSwgbm9kZV9wb2ludGVyIHBfbmQsIGJvb2wgbGVmdF9uZCkKK3sKKyAgbm9kZV9wb2ludGVyIHBfbmV3X25kID0KKyAgICBnZXRfbmV3X25vZGVfZm9yX2xlYWZfaW5zZXJ0KHJfdmFsdWUsCisJCQkJIHRyYWl0c19iYXNlOjptX25vX3Rocm93X2NvcGllc19pbmRpY2F0b3IpOworCisgIGlmIChsZWZ0X25kKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3BfbGVmdCA9PSAwKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHJfdmFsdWUpLAorCQkJCQkgICAgICAgUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpKSk7CisKKyAgICAgIHBfbmQtPm1fcF9sZWZ0ID0gcF9uZXdfbmQ7CisgICAgICBpZiAobV9wX2hlYWQtPm1fcF9sZWZ0ID09IHBfbmQpCisJbV9wX2hlYWQtPm1fcF9sZWZ0ID0gcF9uZXdfbmQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fcF9yaWdodCA9PSAwKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpLAorCQkJCQkgICAgICAgUEJfRFNfVjJGKHJfdmFsdWUpKSk7CisKKyAgICAgIHBfbmQtPm1fcF9yaWdodCA9IHBfbmV3X25kOworICAgICAgaWYgKG1fcF9oZWFkLT5tX3BfcmlnaHQgPT0gcF9uZCkKKwltX3BfaGVhZC0+bV9wX3JpZ2h0ID0gcF9uZXdfbmQ7CisgICAgfQorCisgIHBfbmV3X25kLT5tX3BfcGFyZW50ID0gcF9uZDsKKyAgcF9uZXdfbmQtPm1fcF9sZWZ0ID0gcF9uZXdfbmQtPm1fcF9yaWdodCA9IDA7CisgIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQocF9uZCkKKworICB1cGRhdGVfdG9fdG9wKHBfbmV3X25kLCAobm9kZV91cGRhdGUqICl0aGlzKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjppbnNlcnRfbmV3KFBCX0RTX1YyRihyX3ZhbHVlKSk7KQorICByZXR1cm4gaXRlcmF0b3IocF9uZXdfbmQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5zZXJ0X2ltcF9lbXB0eShjb25zdF9yZWZlcmVuY2Ugcl92YWx1ZSkKK3sKKyAgbm9kZV9wb2ludGVyIHBfbmV3X25vZGUgPQorICAgIGdldF9uZXdfbm9kZV9mb3JfbGVhZl9pbnNlcnQocl92YWx1ZSwgdHJhaXRzX2Jhc2U6Om1fbm9fdGhyb3dfY29waWVzX2luZGljYXRvcik7CisKKyAgbV9wX2hlYWQtPm1fcF9sZWZ0ID0gbV9wX2hlYWQtPm1fcF9yaWdodCA9CisgICAgbV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX25ld19ub2RlOworCisgIHBfbmV3X25vZGUtPm1fcF9wYXJlbnQgPSBtX3BfaGVhZDsKKyAgcF9uZXdfbm9kZS0+bV9wX2xlZnQgPSBwX25ld19ub2RlLT5tX3BfcmlnaHQgPSAwOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6Omluc2VydF9uZXcoUEJfRFNfVjJGKHJfdmFsdWUpKTspCisKKyAgdXBkYXRlX3RvX3RvcChtX3BfaGVhZC0+bV9wX3BhcmVudCwgKG5vZGVfdXBkYXRlKil0aGlzKTsKKyAgcmV0dXJuIGl0ZXJhdG9yKHBfbmV3X25vZGUpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9uZXdfbm9kZV9mb3JfbGVhZl9pbnNlcnQoY29uc3RfcmVmZXJlbmNlIHJfdmFsLCBmYWxzZV90eXBlKQoreworICBub2RlX3BvaW50ZXIgcF9uZXdfbmQgPSBzX25vZGVfYWxsb2NhdG9yLmFsbG9jYXRlKDEpOworICBjb25kX2RlYWx0b3JfdCBjb25kKHBfbmV3X25kKTsKKworICBuZXcgKGNvbnN0X2Nhc3Q8dm9pZCogPihzdGF0aWNfY2FzdDxjb25zdCB2b2lkKiA+KCZwX25ld19uZC0+bV92YWx1ZSkpKQorICAgIHR5cGVuYW1lIG5vZGU6OnZhbHVlX3R5cGUocl92YWwpOworCisgIGNvbmQuc2V0X25vX2FjdGlvbigpOworICBwX25ld19uZC0+bV9wX2xlZnQgPSBwX25ld19uZC0+bV9wX3JpZ2h0ID0gMDsKKyAgKyttX3NpemU7CisgIHJldHVybiBwX25ld19uZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfbmV3X25vZGVfZm9yX2xlYWZfaW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgdHJ1ZV90eXBlKQoreworICBub2RlX3BvaW50ZXIgcF9uZXdfbmQgPSBzX25vZGVfYWxsb2NhdG9yLmFsbG9jYXRlKDEpOworCisgIG5ldyAoY29uc3RfY2FzdDx2b2lkKiA+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqID4oJnBfbmV3X25kLT5tX3ZhbHVlKSkpCisgICAgdHlwZW5hbWUgbm9kZTo6dmFsdWVfdHlwZShyX3ZhbCk7CisKKyAgcF9uZXdfbmQtPm1fcF9sZWZ0ID0gcF9uZXdfbmQtPm1fcF9yaWdodCA9IDA7CisgICsrbV9zaXplOworICByZXR1cm4gcF9uZXdfbmQ7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFiN2MxZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEzNiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5fc2VhcmNoX3RyZWVfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGJpbl9zZWFyY2hfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JlZ2luKCkKK3sKKyAgcmV0dXJuIChpdGVyYXRvcihtX3BfaGVhZC0+bV9wX2xlZnQpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JlZ2luKCkgY29uc3QKK3sKKyAgcmV0dXJuIChjb25zdF9pdGVyYXRvcihtX3BfaGVhZC0+bV9wX2xlZnQpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VuZCgpCit7CisgIHJldHVybiAoaXRlcmF0b3IobV9wX2hlYWQpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VuZCgpIGNvbnN0Cit7CisgIHJldHVybiAoY29uc3RfaXRlcmF0b3IobV9wX2hlYWQpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmJlZ2luKCkgY29uc3QKK3sKKyAgcmV0dXJuIChjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKG1fcF9oZWFkLT5tX3BfcmlnaHQpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cmV2ZXJzZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmJlZ2luKCkKK3sKKyAgcmV0dXJuIChyZXZlcnNlX2l0ZXJhdG9yKG1fcF9oZWFkLT5tX3BfcmlnaHQpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cmV2ZXJzZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVuZCgpCit7CisgIHJldHVybiAocmV2ZXJzZV9pdGVyYXRvcihtX3BfaGVhZCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CityZW5kKCkgY29uc3QKK3sKKyAgcmV0dXJuIChjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKG1fcF9oZWFkKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfY29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vZGVfYmVnaW4oKSBjb25zdAoreworICByZXR1cm4gKG5vZGVfY29uc3RfaXRlcmF0b3IobV9wX2hlYWQtPm1fcF9wYXJlbnQpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm9kZV9iZWdpbigpCit7CisgIHJldHVybiAobm9kZV9pdGVyYXRvcihtX3BfaGVhZC0+bV9wX3BhcmVudCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX2NvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Citub2RlX2VuZCgpIGNvbnN0Cit7CisgIHJldHVybiAobm9kZV9jb25zdF9pdGVyYXRvcigwKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vZGVfZW5kKCkKK3sKKyAgcmV0dXJuIChub2RlX2l0ZXJhdG9yKDApKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vbm9kZV9pdGVyYXRvcnMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vbm9kZV9pdGVyYXRvcnMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODdiOGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9ub2RlX2l0ZXJhdG9ycy5ocHAKQEAgLTAsMCArMSwxODkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluX3NlYXJjaF90cmVlXy9ub2RlX2l0ZXJhdG9ycy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBiaW5fc2VhcmNoX3RyZWVfLgorICovCisKKyNpZm5kZWYgUEJfRFNfQklOX1NFQVJDSF9UUkVFX05PREVfSVRFUkFUT1JTX0hQUAorI2RlZmluZSBQQl9EU19CSU5fU0VBUkNIX1RSRUVfTk9ERV9JVEVSQVRPUlNfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvdGFnX2FuZF90cmFpdC5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworI2RlZmluZSBQQl9EU19UUkVFX0NPTlNUX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUMgXAorICAgIGJpbl9zZWFyY2hfdHJlZV9jb25zdF9ub2RlX2l0XzxOb2RlLCBDb25zdF9JdGVyYXRvciwgSXRlcmF0b3IsIF9BbGxvYz4KKworICAgIC8vLyBDb25zdCBub2RlIGl0ZXJhdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGUsCisJICAgICBjbGFzcyBDb25zdF9JdGVyYXRvciwKKwkgICAgIGNsYXNzIEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIGJpbl9zZWFyY2hfdHJlZV9jb25zdF9ub2RlX2l0XworICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisgICAgICBOb2RlPjo6b3RoZXI6OnBvaW50ZXIKKyAgICAgIG5vZGVfcG9pbnRlcjsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBDYXRlZ29yeS4KKyAgICAgIHR5cGVkZWYgdHJpdmlhbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIC8vLyBEaWZmZXJlbmNlIHR5cGUuCisgICAgICB0eXBlZGVmIHRyaXZpYWxfaXRlcmF0b3JfZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgLy8vIEl0ZXJhdG9yJ3MgdmFsdWUgdHlwZS4KKyAgICAgIHR5cGVkZWYgQ29uc3RfSXRlcmF0b3IgdmFsdWVfdHlwZTsKKworICAgICAgLy8vIEl0ZXJhdG9yJ3MgcmVmZXJlbmNlIHR5cGUuCisgICAgICB0eXBlZGVmIENvbnN0X0l0ZXJhdG9yIHJlZmVyZW5jZTsKKworICAgICAgLy8vIEl0ZXJhdG9yJ3MgX19jb25zdCByZWZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYgQ29uc3RfSXRlcmF0b3IgY29uc3RfcmVmZXJlbmNlOworCisgICAgICAvLy8gTWV0YWRhdGEgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgTm9kZTo6bWV0YWRhdGFfdHlwZSBtZXRhZGF0YV90eXBlOworCisgICAgICAvLy8gQ29uc3QgbWV0YWRhdGEgcmVmZXJlbmNlIHR5cGUuCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxtZXRhZGF0YV90eXBlPjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZQorICAgICAgbWV0YWRhdGFfY29uc3RfcmVmZXJlbmNlOworCisKKyAgICAgIGJpbl9zZWFyY2hfdHJlZV9jb25zdF9ub2RlX2l0Xyhjb25zdCBub2RlX3BvaW50ZXIgcF9uZCA9IDApCisgICAgICA6IG1fcF9uZChjb25zdF9jYXN0PG5vZGVfcG9pbnRlcj4ocF9uZCkpCisgICAgICB7IH0KKworICAgICAgLy8vIEFjY2Vzcy4KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIENvbnN0X0l0ZXJhdG9yKG1fcF9uZCk7IH0KKworICAgICAgLy8vIE1ldGFkYXRhIGFjY2Vzcy4KKyAgICAgIG1ldGFkYXRhX2NvbnN0X3JlZmVyZW5jZQorICAgICAgZ2V0X21ldGFkYXRhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcF9uZC0+Z2V0X21ldGFkYXRhKCk7IH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIF9fY29uc3Qgbm9kZSBpdGVyYXRvciBhc3NvY2lhdGVkIHdpdGggdGhlIGxlZnQgbm9kZS4KKyAgICAgIFBCX0RTX1RSRUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DTEFTU19DX0RFQworICAgICAgZ2V0X2xfY2hpbGQoKSBjb25zdAorICAgICAgeyByZXR1cm4gUEJfRFNfVFJFRV9DT05TVF9OT0RFX0lURVJBVE9SX0NMQVNTX0NfREVDKG1fcF9uZC0+bV9wX2xlZnQpOyB9CisKKyAgICAgIC8vLyBSZXR1cm5zIHRoZSBfX2NvbnN0IG5vZGUgaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByaWdodCBub2RlLgorICAgICAgUEJfRFNfVFJFRV9DT05TVF9OT0RFX0lURVJBVE9SX0NMQVNTX0NfREVDCisgICAgICBnZXRfcl9jaGlsZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBQQl9EU19UUkVFX0NPTlNUX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUMobV9wX25kLT5tX3BfcmlnaHQpOyB9CisKKyAgICAgIC8vLyBDb21wYXJlcyB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IFBCX0RTX1RSRUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DTEFTU19DX0RFQyYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiBtX3BfbmQgPT0gb3RoZXIubV9wX25kOyB9CisKKyAgICAgIC8vLyBDb21wYXJlcyAobmVnYXRpdmVseSkgdG8gYSBkaWZmZXJlbnQgaXRlcmF0b3Igb2JqZWN0LgorICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBQQl9EU19UUkVFX0NPTlNUX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUMmIG90aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9wX25kICE9IG90aGVyLm1fcF9uZDsgfQorCisgICAgICBub2RlX3BvaW50ZXIgbV9wX25kOworICAgIH07CisKKyNkZWZpbmUgUEJfRFNfVFJFRV9OT0RFX0lURVJBVE9SX0NMQVNTX0NfREVDIFwKKyAgICBiaW5fc2VhcmNoX3RyZWVfbm9kZV9pdF88Tm9kZSwgQ29uc3RfSXRlcmF0b3IsIEl0ZXJhdG9yLCBfQWxsb2M+CisKKyAgICAvLy8gTm9kZSBpdGVyYXRvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlLAorCSAgICAgY2xhc3MgQ29uc3RfSXRlcmF0b3IsCisJICAgICBjbGFzcyBJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBiaW5fc2VhcmNoX3RyZWVfbm9kZV9pdF8KKyAgICA6IHB1YmxpYyBQQl9EU19UUkVFX0NPTlNUX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUMKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorICAgICAgTm9kZT46Om90aGVyOjpwb2ludGVyCisgICAgICBub2RlX3BvaW50ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gSXRlcmF0b3IncyB2YWx1ZSB0eXBlLgorICAgICAgdHlwZWRlZiBJdGVyYXRvciB2YWx1ZV90eXBlOworCisgICAgICAvLy8gSXRlcmF0b3IncyByZWZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYgSXRlcmF0b3IgcmVmZXJlbmNlOworCisgICAgICAvLy8gSXRlcmF0b3IncyBfX2NvbnN0IHJlZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZiBJdGVyYXRvciBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIGlubGluZQorICAgICAgYmluX3NlYXJjaF90cmVlX25vZGVfaXRfKGNvbnN0IG5vZGVfcG9pbnRlciBwX25kID0gMCkKKyAgICAgIDogUEJfRFNfVFJFRV9DT05TVF9OT0RFX0lURVJBVE9SX0NMQVNTX0NfREVDKGNvbnN0X2Nhc3Q8bm9kZV9wb2ludGVyPihwX25kKSkKKyAgICAgIHsgfQorCisgICAgICAvLy8gQWNjZXNzLgorICAgICAgSXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiBJdGVyYXRvcihQQl9EU19UUkVFX0NPTlNUX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUM6Om1fcF9uZCk7IH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIG5vZGUgaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBsZWZ0IG5vZGUuCisgICAgICBQQl9EU19UUkVFX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUMKKyAgICAgIGdldF9sX2NoaWxkKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gUEJfRFNfVFJFRV9OT0RFX0lURVJBVE9SX0NMQVNTX0NfREVDKAorCQkJCQkJICAgIFBCX0RTX1RSRUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DTEFTU19DX0RFQzo6bV9wX25kLT5tX3BfbGVmdCk7CisgICAgICB9CisKKyAgICAgIC8vLyBSZXR1cm5zIHRoZSBub2RlIGl0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmlnaHQgbm9kZS4KKyAgICAgIFBCX0RTX1RSRUVfTk9ERV9JVEVSQVRPUl9DTEFTU19DX0RFQworICAgICAgZ2V0X3JfY2hpbGQoKSBjb25zdAorICAgICAgeworCXJldHVybiBQQl9EU19UUkVFX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUMoCisJCQkJCQkgICAgUEJfRFNfVFJFRV9DT05TVF9OT0RFX0lURVJBVE9SX0NMQVNTX0NfREVDOjptX3BfbmQtPm1fcF9yaWdodCk7CisgICAgICB9CisKKyAgICB9OworCisjdW5kZWYgUEJfRFNfVFJFRV9DT05TVF9OT0RFX0lURVJBVE9SX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfVFJFRV9OT0RFX0lURVJBVE9SX0NMQVNTX0NfREVDCisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX0JJTl9TRUFSQ0hfVFJFRV9OT0RFX0lURVJBVE9SU19IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3BvaW50X2l0ZXJhdG9ycy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9wb2ludF9pdGVyYXRvcnMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZTRhYjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9wb2ludF9pdGVyYXRvcnMuaHBwCkBAIC0wLDAgKzEsMzY3IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbl9zZWFyY2hfdHJlZV8vcG9pbnRfaXRlcmF0b3JzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGJpbl9zZWFyY2hfdHJlZV8uCisgKi8KKworI2lmbmRlZiBQQl9EU19CSU5fU0VBUkNIX1RSRUVfRklORF9JVEVSQVRPUlNfSFBQCisjZGVmaW5lIFBCX0RTX0JJTl9TRUFSQ0hfVFJFRV9GSU5EX0lURVJBVE9SU19IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy90YWdfYW5kX3RyYWl0LmhwcD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKworI2RlZmluZSBQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDCQkJCQlcCisgICAgYmluX3NlYXJjaF90cmVlX2NvbnN0X2l0XzwJCQkJCQlcCisJCQkJCQlOb2RlX1BvaW50ZXIsCQlcCisJCQkJCQlWYWx1ZV9UeXBlLAkJXAorCQkJCQkJUG9pbnRlciwJCVwKKwkJCQkJCUNvbnN0X1BvaW50ZXIsCQlcCisJCQkJCQlSZWZlcmVuY2UsCQlcCisJCQkJCQlDb25zdF9SZWZlcmVuY2UsCVwKKwkJCQkJCUlzX0ZvcndhcmRfSXRlcmF0b3IsCVwKKwkJCQkJCV9BbGxvYz4KKworI2RlZmluZSBQQl9EU19UUkVFX0NPTlNUX09ESVJfSVRfQ19ERUMJCQkJCVwKKyAgICBiaW5fc2VhcmNoX3RyZWVfY29uc3RfaXRfPAkJCQkJCVwKKwkJCQkJCU5vZGVfUG9pbnRlciwJCVwKKwkJCQkJCVZhbHVlX1R5cGUsCQlcCisJCQkJCQlQb2ludGVyLAkJXAorCQkJCQkJQ29uc3RfUG9pbnRlciwJCVwKKwkJCQkJCVJlZmVyZW5jZSwJCVwKKwkJCQkJCUNvbnN0X1JlZmVyZW5jZSwJXAorCQkJCQkJIUlzX0ZvcndhcmRfSXRlcmF0b3IsCVwKKwkJCQkJCV9BbGxvYz4KKworI2RlZmluZSBQQl9EU19UUkVFX0lUX0NfREVDCQkJCQkJXAorICAgIGJpbl9zZWFyY2hfdHJlZV9pdF88CQkJCQkJXAorCQkJCQkJTm9kZV9Qb2ludGVyLAkJXAorCQkJCQkJVmFsdWVfVHlwZSwJCVwKKwkJCQkJCVBvaW50ZXIsCQlcCisJCQkJCQlDb25zdF9Qb2ludGVyLAkJXAorCQkJCQkJUmVmZXJlbmNlLAkJXAorCQkJCQkJQ29uc3RfUmVmZXJlbmNlLAlcCisJCQkJCQlJc19Gb3J3YXJkX0l0ZXJhdG9yLAlcCisJCQkJCQlfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfVFJFRV9PRElSX0lUX0NfREVDCQkJCQlcCisgICAgYmluX3NlYXJjaF90cmVlX2l0XzwJCQkJCQlcCisJCQkJCQkJTm9kZV9Qb2ludGVyLAlcCisJCQkJCQkJVmFsdWVfVHlwZSwJXAorCQkJCQkJCVBvaW50ZXIsCVwKKwkJCQkJCQlDb25zdF9Qb2ludGVyLAlcCisJCQkJCQkJUmVmZXJlbmNlLAlcCisJCQkJCQkJQ29uc3RfUmVmZXJlbmNlLCBcCisJCQkJCQkJIUlzX0ZvcndhcmRfSXRlcmF0b3IsIFwKKwkJCQkJCQlfQWxsb2M+CisKKyAgICAvLy8gQ29uc3QgaXRlcmF0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9Qb2ludGVyLAorCSAgICAgdHlwZW5hbWUgVmFsdWVfVHlwZSwKKwkgICAgIHR5cGVuYW1lIFBvaW50ZXIsCisJICAgICB0eXBlbmFtZSBDb25zdF9Qb2ludGVyLAorCSAgICAgdHlwZW5hbWUgUmVmZXJlbmNlLAorCSAgICAgdHlwZW5hbWUgQ29uc3RfUmVmZXJlbmNlLAorCSAgICAgYm9vbCBJc19Gb3J3YXJkX0l0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIGJpbl9zZWFyY2hfdHJlZV9jb25zdF9pdF8KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBzdGQ6OmJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIAkJaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6ZGlmZmVyZW5jZV90eXBlIAlkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIFZhbHVlX1R5cGUgCQkJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIFBvaW50ZXIgCQkJCQlwb2ludGVyOworICAgICAgdHlwZWRlZiBDb25zdF9Qb2ludGVyIAkJCQljb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBSZWZlcmVuY2UgCQkJCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgQ29uc3RfUmVmZXJlbmNlIAkJCQljb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIGlubGluZQorICAgICAgYmluX3NlYXJjaF90cmVlX2NvbnN0X2l0Xyhjb25zdCBOb2RlX1BvaW50ZXIgcF9uZCA9IDApIAorICAgICAgOiBtX3BfbmQoY29uc3RfY2FzdDxOb2RlX1BvaW50ZXI+KHBfbmQpKQorICAgICAgeyB9CisKKyAgICAgIGlubGluZQorICAgICAgYmluX3NlYXJjaF90cmVlX2NvbnN0X2l0Xyhjb25zdCBQQl9EU19UUkVFX0NPTlNUX09ESVJfSVRfQ19ERUMmIG90aGVyKSAKKyAgICAgIDogbV9wX25kKG90aGVyLm1fcF9uZCkKKyAgICAgIHsgfQorCisgICAgICBpbmxpbmUKKyAgICAgIFBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUMmIAorICAgICAgb3BlcmF0b3I9KGNvbnN0IFBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUMmIG90aGVyKQorICAgICAgeworCW1fcF9uZCA9IG90aGVyLm1fcF9uZDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGlubGluZQorICAgICAgUEJfRFNfVFJFRV9DT05TVF9JVF9DX0RFQyYgCisgICAgICBvcGVyYXRvcj0oY29uc3QgUEJfRFNfVFJFRV9DT05TVF9PRElSX0lUX0NfREVDJiBvdGhlcikKKyAgICAgIHsKKwltX3BfbmQgPSBvdGhlci5tX3BfbmQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpbmxpbmUgY29uc3RfcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9uZCAhPSAwKTsKKwlyZXR1cm4gJm1fcF9uZC0+bV92YWx1ZTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIGNvbnN0X3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX25kICE9IDApOworCXJldHVybiBtX3BfbmQtPm1fdmFsdWU7CisgICAgICB9CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IFBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUMgJiBvdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcF9uZCA9PSBvdGhlci5tX3BfbmQ7IH0KKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgUEJfRFNfVFJFRV9DT05TVF9PRElSX0lUX0NfREVDICYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiBtX3BfbmQgPT0gb3RoZXIubV9wX25kOyB9CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IFBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUMmIG90aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9wX25kICE9IG90aGVyLm1fcF9uZDsgfQorCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBQQl9EU19UUkVFX0NPTlNUX09ESVJfSVRfQ19ERUMmIG90aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9wX25kICE9IG90aGVyLm1fcF9uZDsgfQorCisgICAgICBpbmxpbmUgUEJfRFNfVFJFRV9DT05TVF9JVF9DX0RFQyYgCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX25kICE9IDApOworCWluYyhpbnRlZ3JhbF9jb25zdGFudDxpbnQsSXNfRm9yd2FyZF9JdGVyYXRvcj4oKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpbmxpbmUgUEJfRFNfVFJFRV9DT05TVF9JVF9DX0RFQworICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisJUEJfRFNfVFJFRV9DT05TVF9JVF9DX0RFQyByZXRfaXQobV9wX25kKTsKKwlvcGVyYXRvcisrKCk7CisJcmV0dXJuIHJldF9pdDsKKyAgICAgIH0KKworICAgICAgaW5saW5lIFBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUMmIAorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7CisJZGVjKGludGVncmFsX2NvbnN0YW50PGludCxJc19Gb3J3YXJkX0l0ZXJhdG9yPigpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGlubGluZSBQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsKKwlQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDIHJldF9pdChtX3BfbmQpOworCW9wZXJhdG9yLS0oKTsKKwlyZXR1cm4gcmV0X2l0OworICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGluYyhmYWxzZV90eXBlKQorICAgICAgeyBkZWModHJ1ZV90eXBlKCkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluYyh0cnVlX3R5cGUpCisgICAgICB7CisJaWYgKG1fcF9uZC0+c3BlY2lhbCgpJiYgCisJICAgIG1fcF9uZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudCA9PSBtX3BfbmQpCisJICB7CisJICAgIG1fcF9uZCA9IG1fcF9uZC0+bV9wX2xlZnQ7CisJICAgIHJldHVybjsKKwkgIH0KKworCWlmIChtX3BfbmQtPm1fcF9yaWdodCAhPSAwKQorCSAgeworCSAgICBtX3BfbmQgPSBtX3BfbmQtPm1fcF9yaWdodDsKKwkgICAgd2hpbGUgKG1fcF9uZC0+bV9wX2xlZnQgIT0gMCkKKwkgICAgICBtX3BfbmQgPSBtX3BfbmQtPm1fcF9sZWZ0OworCSAgICByZXR1cm47CisJICB9CisKKwlOb2RlX1BvaW50ZXIgcF95ID0gbV9wX25kLT5tX3BfcGFyZW50OworCXdoaWxlIChtX3BfbmQgPT0gcF95LT5tX3BfcmlnaHQpCisJICB7CisJICAgIG1fcF9uZCA9IHBfeTsKKwkgICAgcF95ID0gcF95LT5tX3BfcGFyZW50OworCSAgfQorCisJaWYgKG1fcF9uZC0+bV9wX3JpZ2h0ICE9IHBfeSkKKwkgIG1fcF9uZCA9IHBfeTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGRlYyhmYWxzZV90eXBlKQorICAgICAgeyBpbmModHJ1ZV90eXBlKCkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGRlYyh0cnVlX3R5cGUpCisgICAgICB7CisJaWYgKG1fcF9uZC0+c3BlY2lhbCgpICYmIG1fcF9uZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudCA9PSBtX3BfbmQpCisJICB7CisJICAgIG1fcF9uZCA9IG1fcF9uZC0+bV9wX3JpZ2h0OworCSAgICByZXR1cm47CisJICB9CisKKwlpZiAobV9wX25kLT5tX3BfbGVmdCAhPSAwKQorCSAgeworCSAgICBOb2RlX1BvaW50ZXIgcF95ID0gbV9wX25kLT5tX3BfbGVmdDsKKwkgICAgd2hpbGUgKHBfeS0+bV9wX3JpZ2h0ICE9IDApCisJICAgICAgcF95ID0gcF95LT5tX3BfcmlnaHQ7CisJICAgIG1fcF9uZCA9IHBfeTsKKwkgICAgcmV0dXJuOworCSAgfQorCisJTm9kZV9Qb2ludGVyIHBfeSA9IG1fcF9uZC0+bV9wX3BhcmVudDsKKwl3aGlsZSAobV9wX25kID09IHBfeS0+bV9wX2xlZnQpCisJICB7CisJICAgIG1fcF9uZCA9IHBfeTsKKwkgICAgcF95ID0gcF95LT5tX3BfcGFyZW50OworCSAgfQorCWlmIChtX3BfbmQtPm1fcF9sZWZ0ICE9IHBfeSkKKwkgIG1fcF9uZCA9IHBfeTsKKyAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgIE5vZGVfUG9pbnRlciBtX3BfbmQ7CisgICAgfTsKKworICAgIC8vLyBJdGVyYXRvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX1BvaW50ZXIsCisJICAgICB0eXBlbmFtZSBWYWx1ZV9UeXBlLAorCSAgICAgdHlwZW5hbWUgUG9pbnRlciwKKwkgICAgIHR5cGVuYW1lIENvbnN0X1BvaW50ZXIsCisJICAgICB0eXBlbmFtZSBSZWZlcmVuY2UsCisJICAgICB0eXBlbmFtZSBDb25zdF9SZWZlcmVuY2UsCisJICAgICBib29sIElzX0ZvcndhcmRfSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgYmluX3NlYXJjaF90cmVlX2l0XyA6IHB1YmxpYyBQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIGlubGluZQorICAgICAgYmluX3NlYXJjaF90cmVlX2l0Xyhjb25zdCBOb2RlX1BvaW50ZXIgcF9uZCA9IDApIAorICAgICAgOiBQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDKChOb2RlX1BvaW50ZXIpcF9uZCkKKyAgICAgIHsgfQorCisgICAgICBpbmxpbmUKKyAgICAgIGJpbl9zZWFyY2hfdHJlZV9pdF8oY29uc3QgUEJfRFNfVFJFRV9PRElSX0lUX0NfREVDJiBvdGhlcikgCisgICAgICA6IFBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUMob3RoZXIubV9wX25kKQorICAgICAgeyB9CisKKyAgICAgIGlubGluZQorICAgICAgUEJfRFNfVFJFRV9JVF9DX0RFQyYgCisgICAgICBvcGVyYXRvcj0oY29uc3QgUEJfRFNfVFJFRV9JVF9DX0RFQyYgb3RoZXIpCisgICAgICB7CisJYmFzZV9pdF90eXBlOjptX3BfbmQgPSBvdGhlci5tX3BfbmQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpbmxpbmUKKyAgICAgIFBCX0RTX1RSRUVfSVRfQ19ERUMmIAorICAgICAgb3BlcmF0b3I9KGNvbnN0IFBCX0RTX1RSRUVfT0RJUl9JVF9DX0RFQyYgb3RoZXIpCisgICAgICB7CisJYmFzZV9pdF90eXBlOjptX3BfbmQgPSBvdGhlci5tX3BfbmQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfVFJFRV9DT05TVF9JVF9DX0RFQzo6cG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfaXRfdHlwZTo6bV9wX25kICE9IDApOworCXJldHVybiAmYmFzZV9pdF90eXBlOjptX3BfbmQtPm1fdmFsdWU7CisgICAgICB9CisKKyAgICAgIGlubGluZSB0eXBlbmFtZSBQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDOjpyZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfaXRfdHlwZTo6bV9wX25kICE9IDApOworCXJldHVybiBiYXNlX2l0X3R5cGU6Om1fcF9uZC0+bV92YWx1ZTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIFBCX0RTX1RSRUVfSVRfQ19ERUMmIAorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJUEJfRFNfVFJFRV9DT05TVF9JVF9DX0RFQzo6IG9wZXJhdG9yKysoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGlubGluZSBQQl9EU19UUkVFX0lUX0NfREVDCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlQQl9EU19UUkVFX0lUX0NfREVDIHJldF9pdChiYXNlX2l0X3R5cGU6Om1fcF9uZCk7CisJb3BlcmF0b3IrKygpOworCXJldHVybiByZXRfaXQ7CisgICAgICB9CisKKyAgICAgIGlubGluZSBQQl9EU19UUkVFX0lUX0NfREVDJiAKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeworCVBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUM6OiBvcGVyYXRvci0tKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpbmxpbmUgUEJfRFNfVFJFRV9JVF9DX0RFQworICAgICAgb3BlcmF0b3ItLShpbnQpCisgICAgICB7CisJUEJfRFNfVFJFRV9JVF9DX0RFQyByZXRfaXQoYmFzZV9pdF90eXBlOjptX3BfbmQpOworCW9wZXJhdG9yLS0oKTsKKwlyZXR1cm4gcmV0X2l0OworICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDIGJhc2VfaXRfdHlwZTsKKyAgICB9OworCisjdW5kZWYgUEJfRFNfVFJFRV9DT05TVF9JVF9DX0RFQworI3VuZGVmIFBCX0RTX1RSRUVfQ09OU1RfT0RJUl9JVF9DX0RFQworI3VuZGVmIFBCX0RTX1RSRUVfSVRfQ19ERUMKKyN1bmRlZiBQQl9EU19UUkVFX09ESVJfSVRfQ19ERUMKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUzN2QxZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1MiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5fc2VhcmNoX3RyZWVfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBiaW5fc2VhcmNoX3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitDbXBfRm4mIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2NtcF9mbigpCit7IHJldHVybiAoKnRoaXMpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCBDbXBfRm4mIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2NtcF9mbigpIGNvbnN0Cit7IHJldHVybiAoKnRoaXMpOyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3JfZXJhc2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9yX2VyYXNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNzExMjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9yX2VyYXNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTAzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbl9zZWFyY2hfdHJlZV8vcl9lcmFzZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGJpbl9zZWFyY2hfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CithY3R1YWxfZXJhc2Vfbm9kZShub2RlX3BvaW50ZXIgcF96KQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9zaXplID4gMCk7CisgIC0tbV9zaXplOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGVyYXNlX2V4aXN0aW5nKFBCX0RTX1YyRihwX3otPm1fdmFsdWUpKTspCisgIHBfei0+fm5vZGUoKTsKKyAgc19ub2RlX2FsbG9jYXRvci5kZWFsbG9jYXRlKHBfeiwgMSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordXBkYXRlX21pbl9tYXhfZm9yX2VyYXNlZF9ub2RlKG5vZGVfcG9pbnRlciBwX3opCit7CisgIGlmIChtX3NpemUgPT0gMSkKKyAgICB7CisgICAgICBtX3BfaGVhZC0+bV9wX2xlZnQgPSBtX3BfaGVhZC0+bV9wX3JpZ2h0ID0gbV9wX2hlYWQ7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChtX3BfaGVhZC0+bV9wX2xlZnQgPT0gcF96KQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIGl0KHBfeik7CisgICAgICArK2l0OworICAgICAgbV9wX2hlYWQtPm1fcF9sZWZ0ID0gaXQubV9wX25kOworICAgIH0KKyAgZWxzZSBpZiAobV9wX2hlYWQtPm1fcF9yaWdodCA9PSBwX3opCisgICAgeworICAgICAgaXRlcmF0b3IgaXQocF96KTsKKyAgICAgIC0taXQ7CisgICAgICBtX3BfaGVhZC0+bV9wX3JpZ2h0ID0gaXQubV9wX25kOworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NsZWFyKCkKK3sKKyAgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIGNsZWFyX2ltcChtX3BfaGVhZC0+bV9wX3BhcmVudCk7CisgIG1fc2l6ZSA9IDA7CisgIGluaXRpYWxpemUoKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjbGVhcigpOykKKyAgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcl9pbXAobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuOworCisgIGNsZWFyX2ltcChwX25kLT5tX3BfbGVmdCk7CisgIGNsZWFyX2ltcChwX25kLT5tX3BfcmlnaHQpOworICBwX25kLT5+Tm9kZSgpOworICBzX25vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF9uZCwgMSk7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9yb3RhdGVfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9yb3RhdGVfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZhNGMyYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3JvdGF0ZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDE1NSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5fc2VhcmNoX3RyZWVfL3JvdGF0ZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wcyBmb3Igcm90YXRpbmcgbm9kZXMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cityb3RhdGVfbGVmdChub2RlX3BvaW50ZXIgcF94KQoreworICBub2RlX3BvaW50ZXIgcF95ID0gcF94LT5tX3BfcmlnaHQ7CisKKyAgcF94LT5tX3BfcmlnaHQgPSBwX3ktPm1fcF9sZWZ0OworCisgIGlmIChwX3ktPm1fcF9sZWZ0ICE9IDApCisgICAgcF95LT5tX3BfbGVmdC0+bV9wX3BhcmVudCA9IHBfeDsKKworICBwX3ktPm1fcF9wYXJlbnQgPSBwX3gtPm1fcF9wYXJlbnQ7CisKKyAgaWYgKHBfeCA9PSBtX3BfaGVhZC0+bV9wX3BhcmVudCkKKyAgICBtX3BfaGVhZC0+bV9wX3BhcmVudCA9IHBfeTsKKyAgZWxzZSBpZiAocF94ID09IHBfeC0+bV9wX3BhcmVudC0+bV9wX2xlZnQpCisgICAgcF94LT5tX3BfcGFyZW50LT5tX3BfbGVmdCA9IHBfeTsKKyAgZWxzZQorICAgIHBfeC0+bV9wX3BhcmVudC0+bV9wX3JpZ2h0ID0gcF95OworCisgIHBfeS0+bV9wX2xlZnQgPSBwX3g7CisgIHBfeC0+bV9wX3BhcmVudCA9IHBfeTsKKworICBQQl9EU19BU1NFUlRfTk9ERV9DT05TSVNURU5UKHBfeCkKKyAgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChwX3kpCisKKyAgYXBwbHlfdXBkYXRlKHBfeCwgKG5vZGVfdXBkYXRlKiApdGhpcyk7CisgIGFwcGx5X3VwZGF0ZShwX3gtPm1fcF9wYXJlbnQsIChub2RlX3VwZGF0ZSogKXRoaXMpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JvdGF0ZV9yaWdodChub2RlX3BvaW50ZXIgcF94KQoreworICBub2RlX3BvaW50ZXIgcF95ID0gcF94LT5tX3BfbGVmdDsKKworICBwX3gtPm1fcF9sZWZ0ID0gcF95LT5tX3BfcmlnaHQ7CisKKyAgaWYgKHBfeS0+bV9wX3JpZ2h0ICE9IDApCisgICAgcF95LT5tX3BfcmlnaHQtPm1fcF9wYXJlbnQgPSBwX3g7CisKKyAgcF95LT5tX3BfcGFyZW50ID0gcF94LT5tX3BfcGFyZW50OworCisgIGlmIChwX3ggPT0gbV9wX2hlYWQtPm1fcF9wYXJlbnQpCisgICAgbV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX3k7CisgIGVsc2UgaWYgKHBfeCA9PSBwX3gtPm1fcF9wYXJlbnQtPm1fcF9yaWdodCkKKyAgICBwX3gtPm1fcF9wYXJlbnQtPm1fcF9yaWdodCA9IHBfeTsKKyAgZWxzZQorICAgIHBfeC0+bV9wX3BhcmVudC0+bV9wX2xlZnQgPSBwX3k7CisKKyAgcF95LT5tX3BfcmlnaHQgPSBwX3g7CisgIHBfeC0+bV9wX3BhcmVudCA9IHBfeTsKKworICBQQl9EU19BU1NFUlRfTk9ERV9DT05TSVNURU5UKHBfeCkKKyAgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChwX3kpCisKKyAgYXBwbHlfdXBkYXRlKHBfeCwgKG5vZGVfdXBkYXRlKiApdGhpcyk7CisgIGFwcGx5X3VwZGF0ZShwX3gtPm1fcF9wYXJlbnQsIChub2RlX3VwZGF0ZSogKXRoaXMpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JvdGF0ZV9wYXJlbnQobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIG5vZGVfcG9pbnRlciBwX3BhcmVudCA9IHBfbmQtPm1fcF9wYXJlbnQ7CisKKyAgaWYgKHBfbmQgPT0gcF9wYXJlbnQtPm1fcF9sZWZ0KQorICAgIHJvdGF0ZV9yaWdodChwX3BhcmVudCk7CisgIGVsc2UKKyAgICByb3RhdGVfbGVmdChwX3BhcmVudCk7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfcGFyZW50LT5tX3BfcGFyZW50ID0gcF9uZCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3BfbGVmdCA9PSBwX3BhcmVudCB8fAorCQkgICBwX25kLT5tX3BfcmlnaHQgPT0gcF9wYXJlbnQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FwcGx5X3VwZGF0ZShub2RlX3BvaW50ZXIgLypwX25kKi8sIG51bGxfbm9kZV91cGRhdGVfcG9pbnRlciAvKnBfdXBkYXRlKi8pCit7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIE5vZGVfVXBkYXRlXz4KK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CithcHBseV91cGRhdGUobm9kZV9wb2ludGVyIHBfbmQsIE5vZGVfVXBkYXRlXyogIC8qcF91cGRhdGUqLykKK3sKKyAgbm9kZV91cGRhdGU6Om9wZXJhdG9yKCkobm9kZV9pdGVyYXRvcihwX25kKSwKKwkJCSAgbm9kZV9jb25zdF9pdGVyYXRvcihzdGF0aWNfY2FzdDxub2RlX3BvaW50ZXI+KDApKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX1VwZGF0ZV8+CitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordXBkYXRlX3RvX3RvcChub2RlX3BvaW50ZXIgcF9uZCwgTm9kZV9VcGRhdGVfKiBwX3VwZGF0ZSkKK3sKKyAgd2hpbGUgKHBfbmQgIT0gbV9wX2hlYWQpCisgICAgeworICAgICAgYXBwbHlfdXBkYXRlKHBfbmQsIHBfdXBkYXRlKTsKKworICAgICAgcF9uZCA9IHBfbmQtPm1fcF9wYXJlbnQ7CisgICAgfQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3VwZGF0ZV90b190b3Aobm9kZV9wb2ludGVyIC8qcF9uZCovLCBudWxsX25vZGVfdXBkYXRlX3BvaW50ZXIgLypwX3VwZGF0ZSovKQoreyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTc0NjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTUwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbl9zZWFyY2hfdHJlZV8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGJpbl9zZWFyY2hfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2Jvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2pvaW5fcHJlcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgIGlmIChvdGhlci5tX3NpemUgPT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKG1fc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIHZhbHVlX3N3YXAob3RoZXIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBjb25zdCBib29sIGdyZWF0ZXIgPQorICAgIENtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYobV9wX2hlYWQtPm1fcF9yaWdodC0+bV92YWx1ZSksCisJCSAgICAgICBQQl9EU19WMkYob3RoZXIubV9wX2hlYWQtPm1fcF9sZWZ0LT5tX3ZhbHVlKSk7CisKKyAgY29uc3QgYm9vbCBsZXNzZXIgPQorICAgIENtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYob3RoZXIubV9wX2hlYWQtPm1fcF9yaWdodC0+bV92YWx1ZSksCisJCSAgICAgICBQQl9EU19WMkYobV9wX2hlYWQtPm1fcF9sZWZ0LT5tX3ZhbHVlKSk7CisKKyAgaWYgKCFncmVhdGVyICYmICFsZXNzZXIpCisgICAgX190aHJvd19qb2luX2Vycm9yKCk7CisKKyAgaWYgKGxlc3NlcikKKyAgICB2YWx1ZV9zd2FwKG90aGVyKTsKKworICBtX3NpemUgKz0gb3RoZXIubV9zaXplOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmpvaW4ob3RoZXIpOykKKyAgcmV0dXJuIHRydWU7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citqb2luX2ZpbmlzaChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIGluaXRpYWxpemVfbWluX21heCgpOworICBvdGhlci5pbml0aWFsaXplKCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxpdF9wcmVwKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXksIFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgb3RoZXIuY2xlYXIoKTsKKworICBpZiAobV9zaXplID09IDApCisgICAgeworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkocl9rZXksIFBCX0RTX1YyRihtX3BfaGVhZC0+bV9wX2xlZnQtPm1fdmFsdWUpKSkKKyAgICB7CisgICAgICB2YWx1ZV9zd2FwKG90aGVyKTsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoIUNtcF9Gbjo6b3BlcmF0b3IoKShyX2tleSwgUEJfRFNfVjJGKG1fcF9oZWFkLT5tX3BfcmlnaHQtPm1fdmFsdWUpKSkKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKG1fc2l6ZSA9PSAxKQorICAgIHsKKyAgICAgIHZhbHVlX3N3YXAob3RoZXIpOworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6c3BsaXQocl9rZXksKENtcF9GbiYgKSgqdGhpcyksIG90aGVyKTspCisgIHJldHVybiB0cnVlOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3BsaXRfZmluaXNoKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgb3RoZXIuaW5pdGlhbGl6ZV9taW5fbWF4KCk7CisgIG90aGVyLm1fc2l6ZSA9IHN0ZDo6ZGlzdGFuY2Uob3RoZXIuYmVnaW4oKSwgb3RoZXIuZW5kKCkpOworICBtX3NpemUgLT0gb3RoZXIubV9zaXplOworICBpbml0aWFsaXplX21pbl9tYXgoKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlY3Vyc2l2ZV9jb3VudChub2RlX3BvaW50ZXIgcCkgY29uc3QKK3sKKyAgaWYgKHAgPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDEgKyByZWN1cnNpdmVfY291bnQocC0+bV9wX2xlZnQpICsgcmVjdXJzaXZlX2NvdW50KHAtPm1fcF9yaWdodCk7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3RyYWl0cy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy90cmFpdHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NWE3YzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy90cmFpdHMuaHBwCkBAIC0wLDAgKzEsMjQxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbl9zZWFyY2hfdHJlZV8vdHJhaXRzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIGJpbl9zZWFyY2hfdHJlZV8uCisgKi8KKworI2lmbmRlZiBQQl9EU19CSU5fU0VBUkNIX1RSRUVfTk9ERV9BTkRfSVRfVFJBSVRTX0hQUAorI2RlZmluZSBQQl9EU19CSU5fU0VBUkNIX1RSRUVfTk9ERV9BTkRfSVRfVFJBSVRTX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3BvaW50X2l0ZXJhdG9ycy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL25vZGVfaXRlcmF0b3JzLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIEJpbmFyeSBzZWFyY2ggdHJlZSB0cmFpdHMsIHByaW1hcnkgdGVtcGxhdGUKKyAgICAvLy8gQGluZ3JvdXAgdHJhaXRzCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgICAgdHlwZW5hbWUgTWFwcGVkLAorCSAgICAgY2xhc3MgQ21wX0ZuLAorCSAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9DSXRyLAorCQkgICAgICBjbGFzcyBOb2RlX0l0ciwKKwkJICAgICAgY2xhc3MgQ21wX0ZuLAorCQkgICAgICB0eXBlbmFtZSBfQWxsb2M+CisJICAgICBjbGFzcyBOb2RlX1VwZGF0ZSwKKwkgICAgIGNsYXNzIE5vZGUsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IGJpbl9zZWFyY2hfdHJlZV90cmFpdHMKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZXNfdHJhaXRzPEtleSwgTWFwcGVkLCBfQWxsb2MsIGZhbHNlPiB0eXBlX3RyYWl0czsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgTm9kZSBub2RlOworCisgICAgICB0eXBlZGVmCisgICAgICBiaW5fc2VhcmNoX3RyZWVfY29uc3RfaXRfPAorCXR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorCW5vZGU+OjpvdGhlcjo6cG9pbnRlciwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6dmFsdWVfdHlwZSwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6cG9pbnRlciwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6Y29uc3RfcG9pbnRlciwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6cmVmZXJlbmNlLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpjb25zdF9yZWZlcmVuY2UsCisJdHJ1ZSwKKwlfQWxsb2M+CisgICAgICBwb2ludF9jb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZgorICAgICAgYmluX3NlYXJjaF90cmVlX2l0XzwKKwl0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDwKKwlub2RlPjo6b3RoZXI6OnBvaW50ZXIsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OnZhbHVlX3R5cGUsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OnBvaW50ZXIsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OmNvbnN0X3BvaW50ZXIsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OnJlZmVyZW5jZSwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6Y29uc3RfcmVmZXJlbmNlLAorCXRydWUsCisJX0FsbG9jPgorICAgICAgcG9pbnRfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIGJpbl9zZWFyY2hfdHJlZV9jb25zdF9pdF88CisJdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisJbm9kZT46Om90aGVyOjpwb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjp2YWx1ZV90eXBlLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpwb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpjb25zdF9wb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpyZWZlcmVuY2UsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OmNvbnN0X3JlZmVyZW5jZSwKKwlmYWxzZSwKKwlfQWxsb2M+CisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmCisgICAgICBiaW5fc2VhcmNoX3RyZWVfaXRfPAorCXR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorCW5vZGU+OjpvdGhlcjo6cG9pbnRlciwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6dmFsdWVfdHlwZSwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6cG9pbnRlciwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6Y29uc3RfcG9pbnRlciwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6cmVmZXJlbmNlLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpjb25zdF9yZWZlcmVuY2UsCisJZmFsc2UsCisJX0FsbG9jPgorICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgLy8vIFRoaXMgaXMgYW4gaXRlcmF0b3IgdG8gYW4gaXRlcmF0b3I6IGl0IGl0ZXJhdGVzIG92ZXIgbm9kZXMsCisgICAgICAvLy8gYW5kIGRlLXJlZmVyZW5jaW5nIGl0IHJldHVybnMgb25lIG9mIHRoZSB0cmVlJ3MgaXRlcmF0b3JzLgorICAgICAgdHlwZWRlZgorICAgICAgYmluX3NlYXJjaF90cmVlX2NvbnN0X25vZGVfaXRfPAorCU5vZGUsCisJcG9pbnRfY29uc3RfaXRlcmF0b3IsCisJcG9pbnRfaXRlcmF0b3IsCisJX0FsbG9jPgorICAgICAgbm9kZV9jb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZgorICAgICAgYmluX3NlYXJjaF90cmVlX25vZGVfaXRfPAorCU5vZGUsCisJcG9pbnRfY29uc3RfaXRlcmF0b3IsCisJcG9pbnRfaXRlcmF0b3IsCisJX0FsbG9jPgorICAgICAgbm9kZV9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZgorICAgICAgTm9kZV9VcGRhdGU8CisJbm9kZV9jb25zdF9pdGVyYXRvciwKKwlub2RlX2l0ZXJhdG9yLAorCUNtcF9GbiwKKwlfQWxsb2M+CisgICAgICBub2RlX3VwZGF0ZTsKKworICAgICAgdHlwZWRlZgorICAgICAgX19nbnVfcGJkczo6bnVsbF9ub2RlX3VwZGF0ZTwKKwlub2RlX2NvbnN0X2l0ZXJhdG9yLAorCW5vZGVfaXRlcmF0b3IsCisJQ21wX0ZuLAorCV9BbGxvYz4qIAorICAgICAgbnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyOworICAgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24uCisgICAgLy8vIEBpbmdyb3VwIHRyYWl0cworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICAgIGNsYXNzIENtcF9GbiwKKwkgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwKKwkJICAgICAgY2xhc3MgTm9kZV9JdHIsCisJCSAgICAgIGNsYXNzIENtcF9GbiwKKwkJICAgICAgdHlwZW5hbWUgX0FsbG9jPgorCSAgICAgY2xhc3MgTm9kZV9VcGRhdGUsCisJICAgICBjbGFzcyBOb2RlLAorCSAgICAgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBiaW5fc2VhcmNoX3RyZWVfdHJhaXRzPAorICAgICAgS2V5LAorICAgICAgbnVsbF90eXBlLAorICAgICAgQ21wX0ZuLAorICAgICAgTm9kZV9VcGRhdGUsCisgICAgICBOb2RlLAorICAgICAgX0FsbG9jPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlc190cmFpdHM8S2V5LCBudWxsX3R5cGUsIF9BbGxvYywgZmFsc2U+IHR5cGVfdHJhaXRzOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBOb2RlIG5vZGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIGJpbl9zZWFyY2hfdHJlZV9jb25zdF9pdF88CisJdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisJbm9kZT46Om90aGVyOjpwb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjp2YWx1ZV90eXBlLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpwb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpjb25zdF9wb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpyZWZlcmVuY2UsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OmNvbnN0X3JlZmVyZW5jZSwKKwl0cnVlLAorCV9BbGxvYz4KKyAgICAgIHBvaW50X2NvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHBvaW50X2NvbnN0X2l0ZXJhdG9yIHBvaW50X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmCisgICAgICBiaW5fc2VhcmNoX3RyZWVfY29uc3RfaXRfPAorCXR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorCW5vZGU+OjpvdGhlcjo6cG9pbnRlciwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6dmFsdWVfdHlwZSwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6cG9pbnRlciwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6Y29uc3RfcG9pbnRlciwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6cmVmZXJlbmNlLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpjb25zdF9yZWZlcmVuY2UsCisJZmFsc2UsCisJX0FsbG9jPgorICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIC8vLyBUaGlzIGlzIGFuIGl0ZXJhdG9yIHRvIGFuIGl0ZXJhdG9yOiBpdCBpdGVyYXRlcyBvdmVyIG5vZGVzLAorICAgICAgLy8vIGFuZCBkZS1yZWZlcmVuY2luZyBpdCByZXR1cm5zIG9uZSBvZiB0aGUgdHJlZSdzIGl0ZXJhdG9ycy4KKyAgICAgIHR5cGVkZWYKKyAgICAgIGJpbl9zZWFyY2hfdHJlZV9jb25zdF9ub2RlX2l0XzwKKwlOb2RlLAorCXBvaW50X2NvbnN0X2l0ZXJhdG9yLAorCXBvaW50X2l0ZXJhdG9yLAorCV9BbGxvYz4KKyAgICAgIG5vZGVfY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgbm9kZV9jb25zdF9pdGVyYXRvciBub2RlX2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmCisgICAgICBOb2RlX1VwZGF0ZTxub2RlX2NvbnN0X2l0ZXJhdG9yLCBub2RlX2l0ZXJhdG9yLCBDbXBfRm4sIF9BbGxvYz4KKyAgICAgIG5vZGVfdXBkYXRlOworCisgICAgICB0eXBlZGVmCisgICAgICBfX2dudV9wYmRzOjpudWxsX25vZGVfdXBkYXRlPAorCW5vZGVfY29uc3RfaXRlcmF0b3IsCisJbm9kZV9pdGVyYXRvciwKKwlDbXBfRm4sCisJX0FsbG9jPiogCisgICAgICBudWxsX25vZGVfdXBkYXRlX3BvaW50ZXI7CisgICAgfTsKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfQklOX1NFQVJDSF9UUkVFX05PREVfQU5EX0lUX1RSQUlUU19IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vYmluYXJ5X2hlYXBfLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vYmluYXJ5X2hlYXBfLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTY3NzJiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9iaW5hcnlfaGVhcF8uaHBwCkBAIC0wLDAgKzEsMzUyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbmFyeV9oZWFwXy9iaW5hcnlfaGVhcF8uaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBiaW5hcnkgaGVhcC4KKyAqLworCisjaWZuZGVmIFBCX0RTX0JJTkFSWV9IRUFQX0hQUAorI2RlZmluZSBQQl9EU19CSU5BUllfSEVBUF9IUFAKKworI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NvbmRfZGVhbHRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jb25kX2RlYWx0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZV91dGlscy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vZW50cnlfY21wLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9lbnRyeV9wcmVkLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9yZXNpemVfcG9saWN5LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9wb2ludF9jb25zdF9pdGVyYXRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vY29uc3RfaXRlcmF0b3IuaHBwPgorI2lmZGVmIFBCX0RTX0JJTkFSWV9IRUFQX1RSQUNFXworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2VuZGlmCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlX3V0aWxzLmhwcD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIHR5cGVuYW1lIENtcF9GbiwgdHlwZW5hbWUgX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICBiaW5hcnlfaGVhcDxWYWx1ZV9UeXBlLCBDbXBfRm4sIF9BbGxvYz4KKworI2RlZmluZSBQQl9EU19FTlRSWV9DTVBfREVDIFwKKyAgICBlbnRyeV9jbXA8VmFsdWVfVHlwZSwgQ21wX0ZuLCBfQWxsb2MsIGlzX3NpbXBsZTxWYWx1ZV9UeXBlPjo6dmFsdWU+Ojp0eXBlCisKKyNkZWZpbmUgUEJfRFNfUkVTSVpFX1BPTElDWV9ERUMJXAorICAgIF9fZ251X3BiZHM6OmRldGFpbDo6cmVzaXplX3BvbGljeTx0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZT4KKworICAgIC8qKgorICAgICAqICBCaW5hcnkgaGVhcHMgY29tcG9zZWQgb2YgcmVzaXplIGFuZCBjb21wYXJlIHBvbGljaWVzLgorICAgICAqCisgICAgICogIEBpbmdyb3VwIGhlYXAtZGV0YWlsCisgICAgICoKKyAgICAgKiAgQmFzZWQgb24gQ0xSUy4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZV9UeXBlLCB0eXBlbmFtZSBDbXBfRm4sIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBiaW5hcnlfaGVhcAorICAgIDogcHVibGljIFBCX0RTX0VOVFJZX0NNUF9ERUMsIHB1YmxpYyBQQl9EU19SRVNJWkVfUE9MSUNZX0RFQworICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIFZhbHVlX1R5cGUgCQkJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIENtcF9GbiAJCQkJCWNtcF9mbjsKKyAgICAgIHR5cGVkZWYgX0FsbG9jIAkJCQkJYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIAkJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmRpZmZlcmVuY2VfdHlwZSAJCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgUEJfRFNfRU5UUllfQ01QX0RFQyAJCWVudHJ5X2NtcDsKKyAgICAgIHR5cGVkZWYgUEJfRFNfUkVTSVpFX1BPTElDWV9ERUMgCQkJcmVzaXplX3BvbGljeTsKKyAgICAgIHR5cGVkZWYgY29uZF9kZWFsdG9yPHZhbHVlX3R5cGUsIF9BbGxvYz4gCQljb25kX2RlYWx0b3JfdDsKKworICAgIHByaXZhdGU6CisgICAgICBlbnVtCisJeworCSAgc2ltcGxlX3ZhbHVlID0gaXNfc2ltcGxlPHZhbHVlX3R5cGU+Ojp2YWx1ZQorCX07CisKKyAgICAgIHR5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQ8aW50LCBzaW1wbGVfdmFsdWU+IAlub190aHJvd19jb3BpZXNfdDsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDx2YWx1ZV90eXBlPglfX3JlYmluZF92OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92OjpvdGhlciAJCXZhbHVlX2FsbG9jYXRvcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdmFsdWVfYWxsb2NhdG9yOjpwb2ludGVyCQlwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB2YWx1ZV9hbGxvY2F0b3I6OmNvbnN0X3BvaW50ZXIJY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdmFsdWVfYWxsb2NhdG9yOjpyZWZlcmVuY2UJcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB2YWx1ZV9hbGxvY2F0b3I6OmNvbnN0X3JlZmVyZW5jZQljb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19jb25kaXRpb25hbF90eXBlPHNpbXBsZV92YWx1ZSwKKwkJCQkJICB2YWx1ZV90eXBlLCBwb2ludGVyPjo6X190eXBlCisgICAgICAJCQkJCQkJZW50cnk7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8ZW50cnk+OjpvdGhlcgorICAgICAgCQkJCQkJCWVudHJ5X2FsbG9jYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBlbnRyeV9hbGxvY2F0b3I6OnBvaW50ZXIgCWVudHJ5X3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgYmluYXJ5X2hlYXBfcG9pbnRfY29uc3RfaXRlcmF0b3JfPHZhbHVlX3R5cGUsIGVudHJ5LAorCQkJCQkJc2ltcGxlX3ZhbHVlLCBfQWxsb2M+CisgICAgICAJCQkJCQkJcG9pbnRfY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgcG9pbnRfY29uc3RfaXRlcmF0b3IgCQkJcG9pbnRfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgYmluYXJ5X2hlYXBfY29uc3RfaXRlcmF0b3JfPHZhbHVlX3R5cGUsIGVudHJ5LAorCQkJCQkgIHNpbXBsZV92YWx1ZSwgX0FsbG9jPgorICAgICAgCQkJCQkJCWNvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIGNvbnN0X2l0ZXJhdG9yIAkJCQlpdGVyYXRvcjsKKworCisgICAgICBiaW5hcnlfaGVhcCgpOworCisgICAgICBiaW5hcnlfaGVhcChjb25zdCBjbXBfZm4mKTsKKworICAgICAgYmluYXJ5X2hlYXAoY29uc3QgYmluYXJ5X2hlYXAmKTsKKworICAgICAgdm9pZAorICAgICAgc3dhcChiaW5hcnlfaGVhcCYpOworCisgICAgICB+YmluYXJ5X2hlYXAoKTsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdDsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdDsKKworICAgICAgQ21wX0ZuJgorICAgICAgZ2V0X2NtcF9mbigpOworCisgICAgICBjb25zdCBDbXBfRm4mCisgICAgICBnZXRfY21wX2ZuKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgcHVzaChjb25zdF9yZWZlcmVuY2UpOworCisgICAgICB2b2lkCisgICAgICBtb2RpZnkocG9pbnRfaXRlcmF0b3IsIGNvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBjb25zdF9yZWZlcmVuY2UKKyAgICAgIHRvcCgpIGNvbnN0OworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgcG9wKCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBlcmFzZShwb2ludF9pdGVyYXRvcik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CisJc2l6ZV90eXBlCisJZXJhc2VfaWYoUHJlZCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBlcmFzZV9hdChlbnRyeV9wb2ludGVyLCBzaXplX3R5cGUsIGZhbHNlX3R5cGUpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgZXJhc2VfYXQoZW50cnlfcG9pbnRlciwgc2l6ZV90eXBlLCB0cnVlX3R5cGUpOworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCk7CisKKyAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdDsKKworICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBlbmQoKTsKKworICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KKwl2b2lkCisJc3BsaXQoUHJlZCwgYmluYXJ5X2hlYXAmKTsKKworICAgICAgdm9pZAorICAgICAgam9pbihiaW5hcnlfaGVhcCYpOworCisjaWZkZWYgUEJfRFNfQklOQVJZX0hFQVBfVFJBQ0VfCisgICAgICB2b2lkCisgICAgICB0cmFjZSgpIGNvbnN0OworI2VuZGlmCisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKwl2b2lkCisJY29weV9mcm9tX3JhbmdlKEl0LCBJdCk7CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgdmFsdWVfc3dhcChiaW5hcnlfaGVhcCYpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgaW5zZXJ0X3ZhbHVlKGNvbnN0X3JlZmVyZW5jZSwgZmFsc2VfdHlwZSk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBpbnNlcnRfdmFsdWUodmFsdWVfdHlwZSwgdHJ1ZV90eXBlKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHJlc2l6ZV9mb3JfaW5zZXJ0X2lmX25lZWRlZCgpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgc3dhcF92YWx1ZV9pbXAoZW50cnlfcG9pbnRlciwgdmFsdWVfdHlwZSwgdHJ1ZV90eXBlKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHN3YXBfdmFsdWVfaW1wKGVudHJ5X3BvaW50ZXIsIGNvbnN0X3JlZmVyZW5jZSwgZmFsc2VfdHlwZSk7CisKKyAgICAgIHZvaWQKKyAgICAgIGZpeChlbnRyeV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIGNvbnN0X3JlZmVyZW5jZQorICAgICAgdG9wX2ltcCh0cnVlX3R5cGUpIGNvbnN0OworCisgICAgICBpbmxpbmUgY29uc3RfcmVmZXJlbmNlCisgICAgICB0b3BfaW1wKGZhbHNlX3R5cGUpIGNvbnN0OworCisgICAgICBpbmxpbmUgc3RhdGljIHNpemVfdHlwZQorICAgICAgbGVmdF9jaGlsZChzaXplX3R5cGUpOworCisgICAgICBpbmxpbmUgc3RhdGljIHNpemVfdHlwZQorICAgICAgcmlnaHRfY2hpbGQoc2l6ZV90eXBlKTsKKworICAgICAgaW5saW5lIHN0YXRpYyBzaXplX3R5cGUKKyAgICAgIHBhcmVudChzaXplX3R5cGUpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgcmVzaXplX2Zvcl9lcmFzZV9pZl9uZWVkZWQoKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KKyAgICAgIHNpemVfdHlwZQorICAgICAgcGFydGl0aW9uKFByZWQpOworCisgICAgICB2b2lkCisgICAgICBtYWtlX2hlYXAoKQorICAgICAgeworCWNvbnN0IGVudHJ5X2NtcCYgbV9jbXAgPSBzdGF0aWNfY2FzdDxlbnRyeV9jbXAmPigqdGhpcyk7CisJZW50cnlfcG9pbnRlciBlbmQgPSBtX2FfZW50cmllcyArIG1fc2l6ZTsKKwlzdGQ6Om1ha2VfaGVhcChtX2FfZW50cmllcywgZW5kLCBtX2NtcCk7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKGlzX2hlYXAoKSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfaGVhcCgpCisgICAgICB7CisJaWYgKCFpc19oZWFwKCkpCisJICBtYWtlX2hlYXAoKTsKKwllbHNlCisJICB7CisJICAgIGNvbnN0IGVudHJ5X2NtcCYgbV9jbXAgPSBzdGF0aWNfY2FzdDxlbnRyeV9jbXAmPigqdGhpcyk7CisJICAgIGVudHJ5X3BvaW50ZXIgZW5kID0gbV9hX2VudHJpZXMgKyBtX3NpemU7CisJICAgIHN0ZDo6cHVzaF9oZWFwKG1fYV9lbnRyaWVzLCBlbmQsIG1fY21wKTsKKwkgIH0KKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcG9wX2hlYXAoKQorICAgICAgeworCWNvbnN0IGVudHJ5X2NtcCYgbV9jbXAgPSBzdGF0aWNfY2FzdDxlbnRyeV9jbXAmPigqdGhpcyk7CisJZW50cnlfcG9pbnRlciBlbmQgPSBtX2FfZW50cmllcyArIG1fc2l6ZTsKKwlzdGQ6OnBvcF9oZWFwKG1fYV9lbnRyaWVzLCBlbmQsIG1fY21wKTsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgaXNfaGVhcCgpCisgICAgICB7CisJY29uc3QgZW50cnlfY21wJiBtX2NtcCA9IHN0YXRpY19jYXN0PGVudHJ5X2NtcCY+KCp0aGlzKTsKKwllbnRyeV9wb2ludGVyIGVuZCA9IG1fYV9lbnRyaWVzICsgbV9zaXplOworCWJvb2wgcCA9IHN0ZDo6X19pc19oZWFwKG1fYV9lbnRyaWVzLCBlbmQsIG1fY21wKTsKKwlyZXR1cm4gcDsKKyAgICAgIH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfdmFsaWQoY29uc3QgY2hhciosIGludCkgY29uc3Q7CisjZW5kaWYKKworI2lmZGVmIFBCX0RTX0JJTkFSWV9IRUFQX1RSQUNFXworICAgICAgdm9pZAorICAgICAgdHJhY2VfZW50cnkoY29uc3QgZW50cnkmLCBmYWxzZV90eXBlKSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgdHJhY2VfZW50cnkoY29uc3QgZW50cnkmLCB0cnVlX3R5cGUpIGNvbnN0OworI2VuZGlmCisKKyAgICAgIHN0YXRpYyBlbnRyeV9hbGxvY2F0b3IgCXNfZW50cnlfYWxsb2NhdG9yOworICAgICAgc3RhdGljIHZhbHVlX2FsbG9jYXRvciAJc192YWx1ZV9hbGxvY2F0b3I7CisgICAgICBzdGF0aWMgbm9fdGhyb3dfY29waWVzX3QgCXNfbm9fdGhyb3dfY29waWVzX2luZDsKKworICAgICAgc2l6ZV90eXBlIAkJbV9zaXplOworICAgICAgc2l6ZV90eXBlIAkJbV9hY3R1YWxfc2l6ZTsKKyAgICAgIGVudHJ5X3BvaW50ZXIgCQltX2FfZW50cmllczsKKyAgICB9OworCisjZGVmaW5lIFBCX0RTX0FTU0VSVF9WQUxJRChYKSBcCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoWC5hc3NlcnRfdmFsaWQoX19GSUxFX18sIF9fTElORV9fKTspCisKKyNkZWZpbmUgUEJfRFNfREVCVUdfVkVSSUZZKF9Db25kKQkJCQkJXAorICBfR0xJQkNYWF9ERUJVR19WRVJJRllfQVQoX0NvbmQsCQkJCQlcCisJCQkgICBfTV9tZXNzYWdlKCNfQ29uZCIgYXNzZXJ0aW9uIGZyb20gJTE7OiUyOyIpCVwKKwkJCSAgIC5fTV9zdHJpbmcoX19GSUxFX18pLl9NX2ludGVnZXIoX19MSU5FX18pCVwKKwkJCSAgICxfX2ZpbGUsX19saW5lKQorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy90cmFjZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9pbmZvX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2ZpbmRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0VOVFJZX0NNUF9ERUMKKyN1bmRlZiBQQl9EU19SRVNJWkVfUE9MSUNZX0RFQworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vY29uc3RfaXRlcmF0b3IuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9jb25zdF9pdGVyYXRvci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU0MDNhZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vY29uc3RfaXRlcmF0b3IuaHBwCkBAIC0wLDAgKzEsMTM5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbmFyeV9oZWFwXy9jb25zdF9pdGVyYXRvci5ocHAKKyAqIENvbnRhaW5zIGFuIGl0ZXJhdG9yIGNsYXNzIHJldHVybmVkIGJ5IHRoZSB0YWJsZSdzIGNvbnN0IGZpbmQgYW5kIGluc2VydAorICogICAgIG1ldGhvZHMuCisgKi8KKworI2lmbmRlZiBQQl9EU19CSU5BUllfSEVBUF9DT05TVF9JVEVSQVRPUl9IUFAKKyNkZWZpbmUgUEJfRFNfQklOQVJZX0hFQVBfQ09OU1RfSVRFUkFUT1JfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9wb2ludF9jb25zdF9pdGVyYXRvci5ocHA+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisjZGVmaW5lIFBCX0RTX0JJTl9IRUFQX0NJVF9CQVNFIFwKKyAgICBiaW5hcnlfaGVhcF9wb2ludF9jb25zdF9pdGVyYXRvcl88VmFsdWVfVHlwZSwgRW50cnksIFNpbXBsZSwgX0FsbG9jPgorCisgICAgLy8vIENvbnN0IHBvaW50LXR5cGUgaXRlcmF0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwKKwkgICAgIHR5cGVuYW1lIEVudHJ5LAorCSAgICAgYm9vbCBTaW1wbGUsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgYmluYXJ5X2hlYXBfY29uc3RfaXRlcmF0b3JfIDogcHVibGljIFBCX0RTX0JJTl9IRUFQX0NJVF9CQVNFCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIFBCX0RTX0JJTl9IRUFQX0NJVF9CQVNFIAkJICAgICAgIAliYXNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6ZW50cnlfcG9pbnRlciAJZW50cnlfcG9pbnRlcjsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBDYXRlZ29yeS4KKyAgICAgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyAJCWl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgICAvLy8gRGlmZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmRpZmZlcmVuY2VfdHlwZSAJCWRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgLy8vIEl0ZXJhdG9yJ3MgdmFsdWUgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjp2YWx1ZV90eXBlIAkJdmFsdWVfdHlwZTsKKworICAgICAgLy8vIEl0ZXJhdG9yJ3MgcG9pbnRlciB0eXBlLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnBvaW50ZXIgCQlwb2ludGVyOworCisgICAgICAvLy8gSXRlcmF0b3IncyBjb25zdCBwb2ludGVyIHR5cGUuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfcG9pbnRlciAJY29uc3RfcG9pbnRlcjsKKworICAgICAgLy8vIEl0ZXJhdG9yJ3MgcmVmZXJlbmNlIHR5cGUuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cmVmZXJlbmNlIAkJcmVmZXJlbmNlOworCisgICAgICAvLy8gSXRlcmF0b3IncyBjb25zdCByZWZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9yZWZlcmVuY2UgCWNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgaW5saW5lCisgICAgICBiaW5hcnlfaGVhcF9jb25zdF9pdGVyYXRvcl8oZW50cnlfcG9pbnRlciBwX2UpIDogYmFzZV90eXBlKHBfZSkKKyAgICAgIHsgfQorCisgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgIGlubGluZQorICAgICAgYmluYXJ5X2hlYXBfY29uc3RfaXRlcmF0b3JfKCkKKyAgICAgIHsgfQorCisgICAgICAvLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgICAgIGlubGluZQorICAgICAgYmluYXJ5X2hlYXBfY29uc3RfaXRlcmF0b3JfKGNvbnN0IGJpbmFyeV9oZWFwX2NvbnN0X2l0ZXJhdG9yXyYgb3RoZXIpIAorICAgICAgOiBiYXNlX3R5cGUob3RoZXIpCisgICAgICB7IH0KKworICAgICAgLy8vIENvbXBhcmVzIGNvbnRlbnQgdG8gYSBkaWZmZXJlbnQgaXRlcmF0b3Igb2JqZWN0LgorICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgYmluYXJ5X2hlYXBfY29uc3RfaXRlcmF0b3JfJiBvdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIGJhc2VfdHlwZTo6bV9wX2UgPT0gb3RoZXIubV9wX2U7IH0KKworICAgICAgLy8vIENvbXBhcmVzIGNvbnRlbnQgKG5lZ2F0aXZlbHkpIHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yIG9iamVjdC4KKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IGJpbmFyeV9oZWFwX2NvbnN0X2l0ZXJhdG9yXyYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiBiYXNlX3R5cGU6Om1fcF9lICE9IG90aGVyLm1fcF9lOyB9CisKKyAgICAgIGlubGluZSBiaW5hcnlfaGVhcF9jb25zdF9pdGVyYXRvcl8mIAorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfdHlwZTo6bV9wX2UgIT0gMCk7CisJaW5jKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpbmxpbmUgYmluYXJ5X2hlYXBfY29uc3RfaXRlcmF0b3JfCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwliaW5hcnlfaGVhcF9jb25zdF9pdGVyYXRvcl8gcmV0X2l0KGJhc2VfdHlwZTo6bV9wX2UpOworCW9wZXJhdG9yKysoKTsKKwlyZXR1cm4gcmV0X2l0OworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIGluYygpCisgICAgICB7ICsrYmFzZV90eXBlOjptX3BfZTsgfQorICAgIH07CisKKyN1bmRlZiBQQl9EU19CSU5fSEVBUF9DSVRfQkFTRQorICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE0NGQ4YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMzkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluYXJ5X2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYmluYXJ5X2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6ZW50cnlfYWxsb2NhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6c19lbnRyeV9hbGxvY2F0b3I7CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6dmFsdWVfYWxsb2NhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6c192YWx1ZV9hbGxvY2F0b3I7CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9fdGhyb3dfY29waWVzX3QKK1BCX0RTX0NMQVNTX0NfREVDOjpzX25vX3Rocm93X2NvcGllc19pbmQ7CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NvcHlfZnJvbV9yYW5nZShJdCBmaXJzdF9pdCwgSXQgbGFzdF9pdCkKK3sKKyAgd2hpbGUgKGZpcnN0X2l0ICE9IGxhc3RfaXQpCisgICAgeworICAgICAgaW5zZXJ0X3ZhbHVlKCpmaXJzdF9pdCwgc19ub190aHJvd19jb3BpZXNfaW5kKTsKKyAgICAgICsrZmlyc3RfaXQ7CisgICAgfQorICBtYWtlX2hlYXAoKTsKKyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JpbmFyeV9oZWFwKCkKKzogbV9zaXplKDApLCBtX2FjdHVhbF9zaXplKHJlc2l6ZV9wb2xpY3k6Om1pbl9zaXplKSwKKyAgbV9hX2VudHJpZXMoc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUobV9hY3R1YWxfc2l6ZSkpCit7IFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKSB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitiaW5hcnlfaGVhcChjb25zdCBDbXBfRm4mIHJfY21wX2ZuKQorOiBlbnRyeV9jbXAocl9jbXBfZm4pLCBtX3NpemUoMCksIG1fYWN0dWFsX3NpemUocmVzaXplX3BvbGljeTo6bWluX3NpemUpLAorICBtX2FfZW50cmllcyhzX2VudHJ5X2FsbG9jYXRvci5hbGxvY2F0ZShtX2FjdHVhbF9zaXplKSkKK3sgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JpbmFyeV9oZWFwKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKKzogZW50cnlfY21wKG90aGVyKSwgcmVzaXplX3BvbGljeShvdGhlciksIG1fc2l6ZSgwKSwKKyAgbV9hY3R1YWxfc2l6ZShvdGhlci5tX2FjdHVhbF9zaXplKSwKKyAgbV9hX2VudHJpZXMoc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUobV9hY3R1YWxfc2l6ZSkpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fYV9lbnRyaWVzICE9IG90aGVyLm1fYV9lbnRyaWVzKTsKKworICBfX3RyeQorICAgIHsKKyAgICAgIGNvcHlfZnJvbV9yYW5nZShvdGhlci5iZWdpbigpLCBvdGhlci5lbmQoKSk7CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7CisgICAgICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG1fc2l6ZTsgKytpKQorCWVyYXNlX2F0KG1fYV9lbnRyaWVzLCBpLCBzX25vX3Rocm93X2NvcGllc19pbmQpOworCisgICAgICBzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKG1fYV9lbnRyaWVzLCBtX2FjdHVhbF9zaXplKTsKKyAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgIH0KKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fYV9lbnRyaWVzICE9IG90aGVyLm1fYV9lbnRyaWVzKTsKKyAgdmFsdWVfc3dhcChvdGhlcik7CisgIHN0ZDo6c3dhcCgoZW50cnlfY21wJikoKnRoaXMpLCAoZW50cnlfY21wJilvdGhlcik7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit2YWx1ZV9zd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgc3RkOjpzd2FwKG1fYV9lbnRyaWVzLCBvdGhlci5tX2FfZW50cmllcyk7CisgIHN0ZDo6c3dhcChtX3NpemUsIG90aGVyLm1fc2l6ZSk7CisgIHN0ZDo6c3dhcChtX2FjdHVhbF9zaXplLCBvdGhlci5tX2FjdHVhbF9zaXplKTsKKyAgc3RhdGljX2Nhc3Q8cmVzaXplX3BvbGljeSo+KHRoaXMpLT5zd2FwKG90aGVyKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK35iaW5hcnlfaGVhcCgpCit7CisgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbV9zaXplOyArK2kpCisgICAgZXJhc2VfYXQobV9hX2VudHJpZXMsIGksIHNfbm9fdGhyb3dfY29waWVzX2luZCk7CisgIHNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9hX2VudHJpZXMsIG1fYWN0dWFsX3NpemUpOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vZGVidWdfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkMzI3MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vZGVidWdfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw3MiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5hcnlfaGVhcF8vZGVidWdfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGJpbmFyeV9oZWFwLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyNpZmRlZiBQQl9EU19SRUdSRVNTSU9OCisgIHNfZW50cnlfYWxsb2NhdG9yLmNoZWNrX2FsbG9jYXRlZChtX2FfZW50cmllcywgbV9hY3R1YWxfc2l6ZSk7CisjZW5kaWYKKworICByZXNpemVfcG9saWN5Ojphc3NlcnRfdmFsaWQoX19maWxlLCBfX2xpbmUpOworICBQQl9EU19ERUJVR19WRVJJRlkobV9zaXplIDw9IG1fYWN0dWFsX3NpemUpOworICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG1fc2l6ZTsgKytpKQorICAgIHsKKyNpZmRlZiBQQl9EU19SRUdSRVNTSU9OCisgICAgICBzX3ZhbHVlX2FsbG9jYXRvci5jaGVja19hbGxvY2F0ZWQobV9hX2VudHJpZXNbaV0sIDEpOworI2VuZGlmCisKKyAgICAgIGlmIChsZWZ0X2NoaWxkKGkpIDwgbV9zaXplKQorCVBCX0RTX0RFQlVHX1ZFUklGWSghZW50cnlfY21wOjpvcGVyYXRvcigpKG1fYV9lbnRyaWVzW2ldLCBtX2FfZW50cmllc1tsZWZ0X2NoaWxkKGkpXSkpOworCisgICAgICBQQl9EU19ERUJVR19WRVJJRlkocGFyZW50KGxlZnRfY2hpbGQoaSkpID09IGkpOworCisgICAgICBpZiAocmlnaHRfY2hpbGQoaSkgPCBtX3NpemUpCisJUEJfRFNfREVCVUdfVkVSSUZZKCFlbnRyeV9jbXA6Om9wZXJhdG9yKCkobV9hX2VudHJpZXNbaV0sIG1fYV9lbnRyaWVzW3JpZ2h0X2NoaWxkKGkpXSkpOworCisgICAgICBQQl9EU19ERUJVR19WRVJJRlkocGFyZW50KHJpZ2h0X2NoaWxkKGkpKSA9PSBpKTsKKyAgICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9lbnRyeV9jbXAuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9lbnRyeV9jbXAuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZTEwMDEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2VudHJ5X2NtcC5ocHAKQEAgLTAsMCArMSw4NSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5hcnlfaGVhcF8vZW50cnlfY21wLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmluYXJ5X2hlYXAuCisgKi8KKworI2lmbmRlZiBQQl9EU19CSU5BUllfSEVBUF9FTlRSWV9DTVBfSFBQCisjZGVmaW5lIFBCX0RTX0JJTkFSWV9IRUFQX0VOVFJZX0NNUF9IUFAKKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIEVudHJ5IGNvbXBhcmUsIHByaW1hcnkgdGVtcGxhdGUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZUcCwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBfQWxsb2MsIGJvb2wgTm9fVGhyb3c+CisgICAgICBzdHJ1Y3QgZW50cnlfY21wOworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uLCB0cnVlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WVHAsIHR5cGVuYW1lIENtcF9GbiwgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgc3RydWN0IGVudHJ5X2NtcDxfVlRwLCBDbXBfRm4sIF9BbGxvYywgdHJ1ZT4KKyAgICAgIHsKKwkvLy8gQ29tcGFyZS4KKwl0eXBlZGVmIENtcF9GbiAJCQkJCQl0eXBlOworICAgICAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiwgZmFsc2UuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZUcCwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICBzdHJ1Y3QgZW50cnlfY21wPF9WVHAsIENtcF9GbiwgX0FsbG9jLCBmYWxzZT4KKyAgICAgIHsKKyAgICAgIHByaXZhdGU6CisJdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfVlRwPgkJX19yZWJpbmRfdjsKKworICAgICAgcHVibGljOgorCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIJZW50cnk7CisKKwkvLy8gQ29tcGFyZSBwbHVzIGVudHJ5LgorCXN0cnVjdCB0eXBlIDogcHVibGljIENtcF9GbgorCXsKKwkgIHR5cGUoKSB7IH0KKworCSAgdHlwZShjb25zdCBDbXBfRm4mIG90aGVyKSA6IENtcF9GbihvdGhlcikgeyB9CisKKwkgIGJvb2wKKwkgIG9wZXJhdG9yKCkoZW50cnkgbGhzLCBlbnRyeSByaHMpIGNvbnN0CisJICB7IHJldHVybiBDbXBfRm46Om9wZXJhdG9yKCkoKmxocywgKnJocyk7IH0KKwl9OworICAgICAgfTsKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX0JJTkFSWV9IRUFQX0VOVFJZX0NNUF9IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vZW50cnlfcHJlZC5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2VudHJ5X3ByZWQuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZDdjMDYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2VudHJ5X3ByZWQuaHBwCkBAIC0wLDAgKzEsODUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluYXJ5X2hlYXBfL2VudHJ5X3ByZWQuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBiaW5hcnlfaGVhcC4KKyAqLworCisjaWZuZGVmIFBCX0RTX0JJTkFSWV9IRUFQX0VOVFJZX1BSRURfSFBQCisjZGVmaW5lIFBCX0RTX0JJTkFSWV9IRUFQX0VOVFJZX1BSRURfSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8vLyBFbnRyeSBwcmVkaWNhdGUgcHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVlRwLCB0eXBlbmFtZSBQcmVkLCB0eXBlbmFtZSBfQWxsb2MsIGJvb2wgTm9fVGhyb3c+CisgICAgICBzdHJ1Y3QgZW50cnlfcHJlZDsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiwgdHJ1ZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVlRwLCB0eXBlbmFtZSBQcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICBzdHJ1Y3QgZW50cnlfcHJlZDxfVlRwLCBQcmVkLCBfQWxsb2MsIHRydWU+CisgICAgICB7CisJdHlwZWRlZiBQcmVkIAkJCQkJCXR5cGU7CisgICAgICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uLCBmYWxzZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVlRwLCB0eXBlbmFtZSBQcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICBzdHJ1Y3QgZW50cnlfcHJlZDxfVlRwLCBQcmVkLCBfQWxsb2MsIGZhbHNlPgorICAgICAgeworICAgICAgcHJpdmF0ZToKKwl0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9WVHA+CQlfX3JlYmluZF92OworCisgICAgICBwdWJsaWM6CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92OjpvdGhlcjo6Y29uc3RfcG9pbnRlcgllbnRyeTsKKworCXN0cnVjdCB0eXBlIDogcHVibGljIFByZWQKKwl7CisJICBpbmxpbmUKKwkgIHR5cGUoKSB7IH0KKworCSAgaW5saW5lCisJICB0eXBlKGNvbnN0IFByZWQmIG90aGVyKSA6IFByZWQob3RoZXIpIHsgfQorCisJICBpbmxpbmUgYm9vbAorCSAgb3BlcmF0b3IoKShlbnRyeSBwX3YpIGNvbnN0CisJICB7IHJldHVybiBQcmVkOjpvcGVyYXRvcigpKCpwX3YpOyB9CisJfTsKKyAgICAgIH07CisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19CSU5BUllfSEVBUF9FTlRSWV9QUkVEX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3ZDc2MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwyMDggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluYXJ5X2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBiaW5hcnlfaGVhcC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY2xlYXIoKQoreworICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG1fc2l6ZTsgKytpKQorICAgIGVyYXNlX2F0KG1fYV9lbnRyaWVzLCBpLCBzX25vX3Rocm93X2NvcGllc19pbmQpOworCisgIF9fdHJ5CisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIG5ld19zaXplID0gcmVzaXplX3BvbGljeTo6Z2V0X25ld19zaXplX2Zvcl9hcmJpdHJhcnkoMCk7CisgICAgICBlbnRyeV9wb2ludGVyIG5ld19lbnRyaWVzID0gc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUobmV3X3NpemUpOworICAgICAgcmVzaXplX3BvbGljeTo6bm90aWZ5X2FyYml0cmFyeShuZXdfc2l6ZSk7CisgICAgICBzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKG1fYV9lbnRyaWVzLCBtX2FjdHVhbF9zaXplKTsKKyAgICAgIG1fYWN0dWFsX3NpemUgPSBuZXdfc2l6ZTsKKyAgICAgIG1fYV9lbnRyaWVzID0gbmV3X2VudHJpZXM7CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7IH0KKworICBtX3NpemUgPSAwOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2F0KGVudHJ5X3BvaW50ZXIgYV9lbnRyaWVzLCBzaXplX3R5cGUgaSwgZmFsc2VfdHlwZSkKK3sKKyAgYV9lbnRyaWVzW2ldLT5+dmFsdWVfdHlwZSgpOworICBzX3ZhbHVlX2FsbG9jYXRvci5kZWFsbG9jYXRlKGFfZW50cmllc1tpXSwgMSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9hdChlbnRyeV9wb2ludGVyLCBzaXplX3R5cGUsIHRydWVfdHlwZSkKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3BvcCgpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWVtcHR5KCkpOworCisgIHBvcF9oZWFwKCk7CisgIGVyYXNlX2F0KG1fYV9lbnRyaWVzLCBtX3NpemUgLSAxLCBzX25vX3Rocm93X2NvcGllc19pbmQpOworICByZXNpemVfZm9yX2VyYXNlX2lmX25lZWRlZCgpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9zaXplID4gMCk7CisgIC0tbV9zaXplOworCisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2lmKFByZWQgcHJlZCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisKKyAgdHlwZWRlZiB0eXBlbmFtZSBlbnRyeV9wcmVkPHZhbHVlX3R5cGUsIFByZWQsIF9BbGxvYywgc2ltcGxlX3ZhbHVlPjo6dHlwZQorICAgIHByZWRfdDsKKworICBjb25zdCBzaXplX3R5cGUgbGVmdCA9IHBhcnRpdGlvbihwcmVkX3QocHJlZCkpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9zaXplID49IGxlZnQpOworICBjb25zdCBzaXplX3R5cGUgZXJzZCA9IG1fc2l6ZSAtIGxlZnQ7CisgIGZvciAoc2l6ZV90eXBlIGkgPSBsZWZ0OyBpIDwgbV9zaXplOyArK2kpCisgICAgZXJhc2VfYXQobV9hX2VudHJpZXMsIGksIHNfbm9fdGhyb3dfY29waWVzX2luZCk7CisKKyAgX190cnkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgbmV3X3NpemUgPQorCXJlc2l6ZV9wb2xpY3k6OmdldF9uZXdfc2l6ZV9mb3JfYXJiaXRyYXJ5KGxlZnQpOworCisgICAgICBlbnRyeV9wb2ludGVyIG5ld19lbnRyaWVzID0gc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUobmV3X3NpemUpOworICAgICAgc3RkOjpjb3B5KG1fYV9lbnRyaWVzLCBtX2FfZW50cmllcyArIGxlZnQsIG5ld19lbnRyaWVzKTsKKyAgICAgIHNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9hX2VudHJpZXMsIG1fYWN0dWFsX3NpemUpOworICAgICAgbV9hY3R1YWxfc2l6ZSA9IG5ld19zaXplOworICAgICAgcmVzaXplX3BvbGljeTo6bm90aWZ5X2FyYml0cmFyeShtX2FjdHVhbF9zaXplKTsKKyAgICB9CisgIF9fY2F0Y2goLi4uKQorICAgIHsgfTsKKworICBtX3NpemUgPSBsZWZ0OworICBtYWtlX2hlYXAoKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiBlcnNkOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKHBvaW50X2l0ZXJhdG9yIGl0KQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFlbXB0eSgpKTsKKworICBjb25zdCBzaXplX3R5cGUgZml4X3BvcyA9IGl0Lm1fcF9lIC0gbV9hX2VudHJpZXM7CisgIHN0ZDo6c3dhcCgqaXQubV9wX2UsIG1fYV9lbnRyaWVzW21fc2l6ZSAtIDFdKTsKKyAgZXJhc2VfYXQobV9hX2VudHJpZXMsIG1fc2l6ZSAtIDEsIHNfbm9fdGhyb3dfY29waWVzX2luZCk7CisgIHJlc2l6ZV9mb3JfZXJhc2VfaWZfbmVlZGVkKCk7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fc2l6ZSA+IDApOworICAtLW1fc2l6ZTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGZpeF9wb3MgPD0gbV9zaXplKTsKKworICBpZiAoZml4X3BvcyAhPSBtX3NpemUpCisgICAgZml4KG1fYV9lbnRyaWVzICsgZml4X3Bvcyk7CisKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVzaXplX2Zvcl9lcmFzZV9pZl9uZWVkZWQoKQoreworICBpZiAoIXJlc2l6ZV9wb2xpY3k6OnJlc2l6ZV9uZWVkZWRfZm9yX3NocmluayhtX3NpemUpKQorICAgIHJldHVybjsKKworICBfX3RyeQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBuZXdfc2l6ZSA9IHJlc2l6ZV9wb2xpY3k6OmdldF9uZXdfc2l6ZV9mb3Jfc2hyaW5rKCk7CisgICAgICBlbnRyeV9wb2ludGVyIG5ld19lbnRyaWVzID0gc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUobmV3X3NpemUpOworICAgICAgcmVzaXplX3BvbGljeTo6bm90aWZ5X3Nocmlua19yZXNpemUoKTsKKworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fc2l6ZSA+IDApOworICAgICAgc3RkOjpjb3B5KG1fYV9lbnRyaWVzLCBtX2FfZW50cmllcyArIG1fc2l6ZSAtIDEsIG5ld19lbnRyaWVzKTsKKyAgICAgIHNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9hX2VudHJpZXMsIG1fYWN0dWFsX3NpemUpOworICAgICAgbV9hY3R1YWxfc2l6ZSA9IG5ld19zaXplOworICAgICAgbV9hX2VudHJpZXMgPSBuZXdfZW50cmllczsKKyAgICB9CisgIF9fY2F0Y2goLi4uKQorICAgIHsgfQorfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3BhcnRpdGlvbihQcmVkIHByZWQpCit7CisgIHNpemVfdHlwZSBsZWZ0ID0gMDsKKyAgc2l6ZV90eXBlIHJpZ2h0ID0gbV9zaXplIC0gMTsKKworICB3aGlsZSAocmlnaHQgKyAxICE9IGxlZnQpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGxlZnQgPD0gbV9zaXplKTsKKworICAgICAgaWYgKCFwcmVkKG1fYV9lbnRyaWVzW2xlZnRdKSkKKwkrK2xlZnQ7CisgICAgICBlbHNlIGlmIChwcmVkKG1fYV9lbnRyaWVzW3JpZ2h0XSkpCisJLS1yaWdodDsKKyAgICAgIGVsc2UKKwl7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobGVmdCA8IHJpZ2h0KTsKKwkgIHN0ZDo6c3dhcChtX2FfZW50cmllc1tsZWZ0XSwgbV9hX2VudHJpZXNbcmlnaHRdKTsKKwkgICsrbGVmdDsKKwkgIC0tcmlnaHQ7CisJfQorICAgIH0KKworICByZXR1cm4gbGVmdDsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vZmluZF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vZmluZF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODMwZTNjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9maW5kX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNzkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluYXJ5X2hlYXBfL2ZpbmRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGJpbmFyeV9oZWFwLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X3JlZmVyZW5jZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgordG9wKCkgY29uc3QKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghZW1wdHkoKSk7CisgIHJldHVybiB0b3BfaW1wKHNfbm9fdGhyb3dfY29waWVzX2luZCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X3JlZmVyZW5jZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgordG9wX2ltcCh0cnVlX3R5cGUpIGNvbnN0Cit7IHJldHVybiAqbV9hX2VudHJpZXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfcmVmZXJlbmNlCitQQl9EU19DTEFTU19DX0RFQzo6Cit0b3BfaW1wKGZhbHNlX3R5cGUpIGNvbnN0Cit7IHJldHVybiAqKm1fYV9lbnRyaWVzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbGVmdF9jaGlsZChzaXplX3R5cGUgaSkKK3sgcmV0dXJuIGkgKiAyICsgMTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JpZ2h0X2NoaWxkKHNpemVfdHlwZSBpKQoreyByZXR1cm4gaSAqIDIgKyAyOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcGFyZW50KHNpemVfdHlwZSBpKQoreyByZXR1cm4gKGkgLSAxKSAvIDI7IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vaW5mb19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vaW5mb19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWU5ZmE2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9pbmZvX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluYXJ5X2hlYXBfL2luZm9fZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGJpbmFyeV9oZWFwLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW1wdHkoKSBjb25zdAoreyByZXR1cm4gbV9zaXplID09IDA7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitzaXplKCkgY29uc3QKK3sgcmV0dXJuIG1fc2l6ZTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK21heF9zaXplKCkgY29uc3QKK3sgcmV0dXJuIHNfZW50cnlfYWxsb2NhdG9yLm1heF9zaXplKCk7IH0KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9pbnNlcnRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2VmNGUzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxNzQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluYXJ5X2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmluYXJ5X2hlYXAuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3B1c2goY29uc3RfcmVmZXJlbmNlIHJfdmFsKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgaW5zZXJ0X3ZhbHVlKHJfdmFsLCBzX25vX3Rocm93X2NvcGllc19pbmQpOworICBwdXNoX2hlYXAoKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiBwb2ludF9pdGVyYXRvcihtX2FfZW50cmllcyk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5zZXJ0X3ZhbHVlKHZhbHVlX3R5cGUgdmFsLCB0cnVlX3R5cGUpCit7CisgIHJlc2l6ZV9mb3JfaW5zZXJ0X2lmX25lZWRlZCgpOworICBtX2FfZW50cmllc1ttX3NpemUrK10gPSB2YWw7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5zZXJ0X3ZhbHVlKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgZmFsc2VfdHlwZSkKK3sKKyAgcmVzaXplX2Zvcl9pbnNlcnRfaWZfbmVlZGVkKCk7CisgIHBvaW50ZXIgcF9uZXcgPSBzX3ZhbHVlX2FsbG9jYXRvci5hbGxvY2F0ZSgxKTsKKyAgY29uZF9kZWFsdG9yX3QgY29uZChwX25ldyk7CisgIG5ldyAocF9uZXcpIHZhbHVlX3R5cGUocl92YWwpOworICBjb25kLnNldF9ub19hY3Rpb24oKTsKKyAgbV9hX2VudHJpZXNbbV9zaXplKytdID0gcF9uZXc7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVzaXplX2Zvcl9pbnNlcnRfaWZfbmVlZGVkKCkKK3sKKyAgaWYgKCFyZXNpemVfcG9saWN5OjpyZXNpemVfbmVlZGVkX2Zvcl9ncm93KG1fc2l6ZSkpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fc2l6ZSA8IG1fYWN0dWFsX3NpemUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBjb25zdCBzaXplX3R5cGUgbmV3X3NpemUgPSByZXNpemVfcG9saWN5OjpnZXRfbmV3X3NpemVfZm9yX2dyb3coKTsKKyAgZW50cnlfcG9pbnRlciBuZXdfZW50cmllcyA9IHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKG5ld19zaXplKTsKKyAgcmVzaXplX3BvbGljeTo6bm90aWZ5X2dyb3dfcmVzaXplKCk7CisKKyAgc3RkOjpjb3B5KG1fYV9lbnRyaWVzLCBtX2FfZW50cmllcyArIG1fc2l6ZSwgbmV3X2VudHJpZXMpOworICBzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKG1fYV9lbnRyaWVzLCBtX2FjdHVhbF9zaXplKTsKKyAgbV9hY3R1YWxfc2l6ZSA9IG5ld19zaXplOworICBtX2FfZW50cmllcyA9IG5ld19lbnRyaWVzOworICBtYWtlX2hlYXAoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK21vZGlmeShwb2ludF9pdGVyYXRvciBpdCwgY29uc3RfcmVmZXJlbmNlIHJfbmV3X3ZhbCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHN3YXBfdmFsdWVfaW1wKGl0Lm1fcF9lLCByX25ld192YWwsIHNfbm9fdGhyb3dfY29waWVzX2luZCk7CisgIGZpeChpdC5tX3BfZSk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoaXNfaGVhcCgpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpeChlbnRyeV9wb2ludGVyIHBfZSkKK3sKKyAgc2l6ZV90eXBlIGkgPSBwX2UgLSBtX2FfZW50cmllczsKKyAgaWYgKGkgPiAwICYmIGVudHJ5X2NtcDo6b3BlcmF0b3IoKShtX2FfZW50cmllc1twYXJlbnQoaSldLCBtX2FfZW50cmllc1tpXSkpCisgICAgeworICAgICAgc2l6ZV90eXBlIHBhcmVudF9pID0gcGFyZW50KGkpOworICAgICAgd2hpbGUgKGkgPiAwCisJICAgICAmJiBlbnRyeV9jbXA6Om9wZXJhdG9yKCkobV9hX2VudHJpZXNbcGFyZW50X2ldLCBtX2FfZW50cmllc1tpXSkpCisJeworCSAgc3RkOjpzd2FwKG1fYV9lbnRyaWVzW2ldLCBtX2FfZW50cmllc1twYXJlbnRfaV0pOworCSAgaSA9IHBhcmVudF9pOworCSAgcGFyZW50X2kgPSBwYXJlbnQoaSk7CisJfQorCisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgd2hpbGUgKGkgPCBtX3NpemUpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIGxjaGlsZF9pID0gbGVmdF9jaGlsZChpKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSByY2hpbGRfaSA9IHJpZ2h0X2NoaWxkKGkpOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHJjaGlsZF9pID4gbGNoaWxkX2kpOworCisgICAgICBjb25zdCBib29sIHNtYWxsZXJfdGhhbl9sY2hpbGQgPSBsY2hpbGRfaSA8IG1fc2l6ZSAmJgorCWVudHJ5X2NtcDo6b3BlcmF0b3IoKShtX2FfZW50cmllc1tpXSwgbV9hX2VudHJpZXNbbGNoaWxkX2ldKTsKKworICAgICAgY29uc3QgYm9vbCBzbWFsbGVyX3RoYW5fcmNoaWxkID0gcmNoaWxkX2kgPCBtX3NpemUgJiYKKwllbnRyeV9jbXA6Om9wZXJhdG9yKCkobV9hX2VudHJpZXNbaV0sIG1fYV9lbnRyaWVzW3JjaGlsZF9pXSk7CisKKyAgICAgIGNvbnN0IGJvb2wgc3dhcF93aXRoX3JjaGlsZCA9IHNtYWxsZXJfdGhhbl9yY2hpbGQgJiYgKCFzbWFsbGVyX3RoYW5fbGNoaWxkIHx8IGVudHJ5X2NtcDo6b3BlcmF0b3IoKShtX2FfZW50cmllc1tsY2hpbGRfaV0sIG1fYV9lbnRyaWVzW3JjaGlsZF9pXSkpOworCisgICAgICBjb25zdCBib29sIHN3YXBfd2l0aF9sY2hpbGQgPSAhc3dhcF93aXRoX3JjaGlsZCAmJiBzbWFsbGVyX3RoYW5fbGNoaWxkOworCisgICAgICBpZiAoc3dhcF93aXRoX2xjaGlsZCkKKwl7CisJICBzdGQ6OnN3YXAobV9hX2VudHJpZXNbaV0sIG1fYV9lbnRyaWVzW2xjaGlsZF9pXSk7CisJICBpID0gbGNoaWxkX2k7CisJfQorICAgICAgZWxzZSBpZiAoc3dhcF93aXRoX3JjaGlsZCkKKwl7CisJICBzdGQ6OnN3YXAobV9hX2VudHJpZXNbaV0sIG1fYV9lbnRyaWVzW3JjaGlsZF9pXSk7CisJICBpID0gcmNoaWxkX2k7CisJfQorICAgICAgZWxzZQorCWkgPSBtX3NpemU7CisgICAgfQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXBfdmFsdWVfaW1wKGVudHJ5X3BvaW50ZXIgcF9lLCB2YWx1ZV90eXBlIG5ld192YWwsIHRydWVfdHlwZSkKK3sgKnBfZSA9IG5ld192YWw7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwX3ZhbHVlX2ltcChlbnRyeV9wb2ludGVyIHBfZSwgY29uc3RfcmVmZXJlbmNlIHJfbmV3X3ZhbCwgZmFsc2VfdHlwZSkKK3sKKyAgdmFsdWVfdHlwZSB0bXAocl9uZXdfdmFsKTsKKyAgKCpwX2UpLT5zd2FwKHRtcCk7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMDMyYzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDY0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbmFyeV9oZWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGJpbmFyeV9oZWFwLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitiZWdpbigpCit7IHJldHVybiBpdGVyYXRvcihtX2FfZW50cmllcyk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JlZ2luKCkgY29uc3QKK3sgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKG1fYV9lbnRyaWVzKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKCkKK3sgcmV0dXJuIGl0ZXJhdG9yKG1fYV9lbnRyaWVzICsgbV9zaXplKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKCkgY29uc3QKK3sgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKG1fYV9lbnRyaWVzICsgbV9zaXplKTsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL3BvaW50X2NvbnN0X2l0ZXJhdG9yLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vcG9pbnRfY29uc3RfaXRlcmF0b3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYzM2MGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL3BvaW50X2NvbnN0X2l0ZXJhdG9yLmhwcApAQCAtMCwwICsxLDE0NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5hcnlfaGVhcF8vcG9pbnRfY29uc3RfaXRlcmF0b3IuaHBwCisgKiBDb250YWlucyBhbiBpdGVyYXRvciBjbGFzcyByZXR1cm5lZCBieSB0aGUgdGFibGUncyBjb25zdCBmaW5kIGFuZCBpbnNlcnQKKyAqIG1ldGhvZHMuCisgKi8KKworI2lmbmRlZiBQQl9EU19CSU5BUllfSEVBUF9DT05TVF9GSU5EX0lURVJBVE9SX0hQUAorI2RlZmluZSBQQl9EU19CSU5BUllfSEVBUF9DT05TVF9GSU5EX0lURVJBVE9SX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL3RhZ19hbmRfdHJhaXQuaHBwPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8vLyBDb25zdCBwb2ludC10eXBlIGl0ZXJhdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIHR5cGVuYW1lIEVudHJ5LCBib29sIFNpbXBsZSwgCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgYmluYXJ5X2hlYXBfcG9pbnRfY29uc3RfaXRlcmF0b3JfCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8RW50cnk+OjpvdGhlcjo6cG9pbnRlciBlbnRyeV9wb2ludGVyOworCisgICAgcHVibGljOgorICAgICAgLy8vIENhdGVnb3J5LgorICAgICAgdHlwZWRlZiB0cml2aWFsX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgLy8vIERpZmZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHJpdmlhbF9pdGVyYXRvcl9kaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgICAgICAvLy8gSXRlcmF0b3IncyB2YWx1ZSB0eXBlLgorICAgICAgdHlwZWRlZiBWYWx1ZV9UeXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIC8vLyBJdGVyYXRvcidzIHBvaW50ZXIgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8dmFsdWVfdHlwZT46Om90aGVyOjpwb2ludGVyCisgICAgICBwb2ludGVyOworCisgICAgICAvLy8gSXRlcmF0b3IncyBjb25zdCBwb2ludGVyIHR5cGUuCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDx2YWx1ZV90eXBlPjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIKKyAgICAgIGNvbnN0X3BvaW50ZXI7CisKKyAgICAgIC8vLyBJdGVyYXRvcidzIHJlZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8dmFsdWVfdHlwZT46Om90aGVyOjpyZWZlcmVuY2UKKyAgICAgIHJlZmVyZW5jZTsKKworICAgICAgLy8vIEl0ZXJhdG9yJ3MgY29uc3QgcmVmZXJlbmNlIHR5cGUuCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDx2YWx1ZV90eXBlPjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZQorICAgICAgY29uc3RfcmVmZXJlbmNlOworCisgICAgICBpbmxpbmUKKyAgICAgIGJpbmFyeV9oZWFwX3BvaW50X2NvbnN0X2l0ZXJhdG9yXyhlbnRyeV9wb2ludGVyIHBfZSkgOiBtX3BfZShwX2UpCisgICAgICB7IH0KKworICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICBpbmxpbmUKKyAgICAgIGJpbmFyeV9oZWFwX3BvaW50X2NvbnN0X2l0ZXJhdG9yXygpIDogbV9wX2UoMCkgeyB9CisKKyAgICAgIC8vLyBDb3B5IGNvbnN0cnVjdG9yLgorICAgICAgaW5saW5lCisgICAgICBiaW5hcnlfaGVhcF9wb2ludF9jb25zdF9pdGVyYXRvcl8oY29uc3QgYmluYXJ5X2hlYXBfcG9pbnRfY29uc3RfaXRlcmF0b3JfJiBvdGhlcikKKyAgICAgIDogbV9wX2Uob3RoZXIubV9wX2UpCisgICAgICB7IH0KKworICAgICAgLy8vIEFjY2Vzcy4KKyAgICAgIGlubGluZSBjb25zdF9wb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX2UgIT0gMCk7CisJcmV0dXJuIHRvX3B0cihpbnRlZ3JhbF9jb25zdGFudDxpbnQsIFNpbXBsZT4oKSk7CisgICAgICB9CisKKyAgICAgIC8vLyBBY2Nlc3MuCisgICAgICBpbmxpbmUgY29uc3RfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfZSAhPSAwKTsKKwlyZXR1cm4gKnRvX3B0cihpbnRlZ3JhbF9jb25zdGFudDxpbnQsIFNpbXBsZT4oKSk7CisgICAgICB9CisKKyAgICAgIC8vLyBDb21wYXJlcyBjb250ZW50IHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yIG9iamVjdC4KKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGJpbmFyeV9oZWFwX3BvaW50X2NvbnN0X2l0ZXJhdG9yXyYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiBtX3BfZSA9PSBvdGhlci5tX3BfZTsgfQorCisgICAgICAvLy8gQ29tcGFyZXMgY29udGVudCAobmVnYXRpdmVseSkgdG8gYSBkaWZmZXJlbnQgaXRlcmF0b3Igb2JqZWN0LgorICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgYmluYXJ5X2hlYXBfcG9pbnRfY29uc3RfaXRlcmF0b3JfJiBvdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcF9lICE9IG90aGVyLm1fcF9lOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgaW5saW5lIGNvbnN0X3BvaW50ZXIKKyAgICAgIHRvX3B0cih0cnVlX3R5cGUpIGNvbnN0CisgICAgICB7IHJldHVybiBtX3BfZTsgfQorCisgICAgICBpbmxpbmUgY29uc3RfcG9pbnRlcgorICAgICAgdG9fcHRyKGZhbHNlX3R5cGUpIGNvbnN0CisgICAgICB7IHJldHVybiAqbV9wX2U7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIGVudHJ5X3BvaW50ZXIgbV9wX2U7CisgICAgfTsKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGUxMGUzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTYgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluYXJ5X2hlYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGJpbmFyeV9oZWFwLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitDbXBfRm4mIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2NtcF9mbigpCit7CisgIHJldHVybiAoKnRoaXMpOworfQorCitQQl9EU19DTEFTU19UX0RFQworY29uc3QgQ21wX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9jbXBfZm4oKSBjb25zdAoreworICByZXR1cm4gKCp0aGlzKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9yZXNpemVfcG9saWN5LmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vcmVzaXplX3BvbGljeS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlMzI3YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vcmVzaXplX3BvbGljeS5ocHAKQEAgLTAsMCArMSwyNDAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluYXJ5X2hlYXBfL3Jlc2l6ZV9wb2xpY3kuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBiaW5hcnlfaGVhcC4KKyAqLworCisjaWZuZGVmIFBCX0RTX0JJTkFSWV9IRUFQX1JFU0laRV9QT0xJQ1lfSFBQCisjZGVmaW5lIFBCX0RTX0JJTkFSWV9IRUFQX1JFU0laRV9QT0xJQ1lfSFBQCisKKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gUmVzaXplIHBvbGljeSBmb3IgYmluYXJ5IGhlYXAuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIHJlc2l6ZV9wb2xpY3kKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIGVudW0KKwl7CisJICByYXRpbyA9IDgsCisJICBmYWN0b3IgPSAyCisJfTsKKworICAgICAgLy8vIE5leHQgc2hyaW5rIHNpemUuCisgICAgICBfVHAgCQltX3Nocmlua19zaXplOworCisgICAgICAvLy8gTmV4dCBncm93IHNpemUuCisgICAgICBfVHAgCQltX2dyb3dfc2l6ZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwCXNpemVfdHlwZTsKKworICAgICAgc3RhdGljIGNvbnN0IF9UcAltaW5fc2l6ZSA9IDE2OworCisgICAgICByZXNpemVfcG9saWN5KCkgOiBtX3Nocmlua19zaXplKDApLCBtX2dyb3dfc2l6ZShtaW5fc2l6ZSkKKyAgICAgIHsgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworICAgICAgcmVzaXplX3BvbGljeShjb25zdCByZXNpemVfcG9saWN5JiBvdGhlcikKKyAgICAgIDogbV9zaHJpbmtfc2l6ZShvdGhlci5tX3Nocmlua19zaXplKSwgbV9ncm93X3NpemUob3RoZXIubV9ncm93X3NpemUpCisgICAgICB7IFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKSB9CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBzd2FwKHJlc2l6ZV9wb2xpY3k8X1RwPiYpOworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgcmVzaXplX25lZWRlZF9mb3JfZ3JvdyhzaXplX3R5cGUpIGNvbnN0OworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgcmVzaXplX25lZWRlZF9mb3Jfc2hyaW5rKHNpemVfdHlwZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBncm93X25lZWRlZChzaXplX3R5cGUpIGNvbnN0OworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgc2hyaW5rX25lZWRlZChzaXplX3R5cGUpIGNvbnN0OworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBnZXRfbmV3X3NpemVfZm9yX2dyb3coKSBjb25zdDsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgZ2V0X25ld19zaXplX2Zvcl9zaHJpbmsoKSBjb25zdDsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgZ2V0X25ld19zaXplX2Zvcl9hcmJpdHJhcnkoc2l6ZV90eXBlKSBjb25zdDsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIG5vdGlmeV9ncm93X3Jlc2l6ZSgpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgbm90aWZ5X3Nocmlua19yZXNpemUoKTsKKworICAgICAgdm9pZAorICAgICAgbm90aWZ5X2FyYml0cmFyeShzaXplX3R5cGUpOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZChjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfQklOQVJZX0hFQVBfVFJBQ0VfCisgICAgICB2b2lkCisgICAgICB0cmFjZSgpIGNvbnN0OworI2VuZGlmCisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIGNvbnN0IF9UcCByZXNpemVfcG9saWN5PF9UcD46Om1pbl9zaXplOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgcmVzaXplX3BvbGljeTxfVHA+OjoKKyAgICBzd2FwKHJlc2l6ZV9wb2xpY3k8X1RwPiYgb3RoZXIpCisgICAgeworICAgICAgc3RkOjpzd2FwKG1fc2hyaW5rX3NpemUsIG90aGVyLm1fc2hyaW5rX3NpemUpOworICAgICAgc3RkOjpzd2FwKG1fZ3Jvd19zaXplLCBvdGhlci5tX2dyb3dfc2l6ZSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgcmVzaXplX3BvbGljeTxfVHA+OjoKKyAgICByZXNpemVfbmVlZGVkX2Zvcl9ncm93KHNpemVfdHlwZSBzaXplKSBjb25zdAorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChzaXplIDw9IG1fZ3Jvd19zaXplKTsKKyAgICAgIHJldHVybiBzaXplID09IG1fZ3Jvd19zaXplOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlc2l6ZV9wb2xpY3k8X1RwPjo6CisgICAgcmVzaXplX25lZWRlZF9mb3Jfc2hyaW5rKHNpemVfdHlwZSBzaXplKSBjb25zdAorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChzaXplIDw9IG1fZ3Jvd19zaXplKTsKKyAgICAgIHJldHVybiBzaXplID09IG1fc2hyaW5rX3NpemU7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSByZXNpemVfcG9saWN5PF9UcD46OnNpemVfdHlwZQorICAgIHJlc2l6ZV9wb2xpY3k8X1RwPjo6CisgICAgZ2V0X25ld19zaXplX2Zvcl9ncm93KCkgY29uc3QKKyAgICB7IHJldHVybiBtX2dyb3dfc2l6ZSAqIGZhY3RvcjsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSByZXNpemVfcG9saWN5PF9UcD46OnNpemVfdHlwZQorICAgIHJlc2l6ZV9wb2xpY3k8X1RwPjo6CisgICAgZ2V0X25ld19zaXplX2Zvcl9zaHJpbmsoKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBoYWxmX3NpemUgPSBtX2dyb3dfc2l6ZSAvIGZhY3RvcjsKKyAgICAgIHJldHVybiBzdGQ6Om1heChtaW5fc2l6ZSwgaGFsZl9zaXplKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIHJlc2l6ZV9wb2xpY3k8X1RwPjo6c2l6ZV90eXBlCisgICAgcmVzaXplX3BvbGljeTxfVHA+OjoKKyAgICBnZXRfbmV3X3NpemVfZm9yX2FyYml0cmFyeShzaXplX3R5cGUgc2l6ZSkgY29uc3QKKyAgICB7CisgICAgICBzaXplX3R5cGUgcmV0ID0gbWluX3NpemU7CisgICAgICB3aGlsZSAocmV0IDwgc2l6ZSkKKwlyZXQgKj0gZmFjdG9yOworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICByZXNpemVfcG9saWN5PF9UcD46OgorICAgIG5vdGlmeV9ncm93X3Jlc2l6ZSgpCisgICAgeworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9ncm93X3NpemUgPj0gbWluX3NpemUpOworICAgICAgbV9ncm93X3NpemUgKj0gZmFjdG9yOworICAgICAgbV9zaHJpbmtfc2l6ZSA9IG1fZ3Jvd19zaXplIC8gcmF0aW87CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICByZXNpemVfcG9saWN5PF9UcD46OgorICAgIG5vdGlmeV9zaHJpbmtfcmVzaXplKCkKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIG1fc2hyaW5rX3NpemUgLz0gZmFjdG9yOworICAgICAgaWYgKG1fc2hyaW5rX3NpemUgPT0gMSkKKwltX3Nocmlua19zaXplID0gMDsKKyAgICAgIG1fZ3Jvd19zaXplID0gc3RkOjptYXgobV9ncm93X3NpemUgLyBmYWN0b3IsIG1pbl9zaXplKTsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHJlc2l6ZV9wb2xpY3k8X1RwPjo6CisgICAgbm90aWZ5X2FyYml0cmFyeShzaXplX3R5cGUgYWN0dWFsX3NpemUpCisgICAgeworICAgICAgbV9ncm93X3NpemUgPSBhY3R1YWxfc2l6ZTsKKyAgICAgIG1fc2hyaW5rX3NpemUgPSBtX2dyb3dfc2l6ZSAvIHJhdGlvOworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgfQorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIHJlc2l6ZV9wb2xpY3k8X1RwPjo6CisgICAgYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKKyAgICB7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkobV9zaHJpbmtfc2l6ZSA9PSAwCisJCQkgfHwgbV9zaHJpbmtfc2l6ZSAqIHJhdGlvID09IG1fZ3Jvd19zaXplKTsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShtX2dyb3dfc2l6ZSA+PSBtaW5fc2l6ZSk7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBQQl9EU19CSU5BUllfSEVBUF9UUkFDRV8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIHJlc2l6ZV9wb2xpY3k8X1RwPjo6CisgICAgdHJhY2UoKSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAic2hyaW5rID0gIiA8PCBtX3Nocmlua19zaXplCisJCTw8ICIgZ3JvdyA9ICIgPDwgbV9ncm93X3NpemUgPDwgc3RkOjplbmRsOworICAgIH0KKyNlbmRpZgorCit9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIzMTZkNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDE2MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5hcnlfaGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmluYXJ5X2hlYXAuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIFByZWQ+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxpdChQcmVkIHByZWQsIFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisKKyAgdHlwZWRlZgorICAgIHR5cGVuYW1lIGVudHJ5X3ByZWQ8dmFsdWVfdHlwZSwgUHJlZCwgX0FsbG9jLCBzaW1wbGVfdmFsdWU+Ojp0eXBlCisgICAgcHJlZF90OworCisgIGNvbnN0IHNpemVfdHlwZSBsZWZ0ID0gcGFydGl0aW9uKHByZWRfdChwcmVkKSk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3NpemUgPj0gbGVmdCk7CisKKyAgY29uc3Qgc2l6ZV90eXBlIGVyc2QgPSBtX3NpemUgLSBsZWZ0OworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9zaXplID49IGVyc2QpOworCisgIGNvbnN0IHNpemVfdHlwZSBuZXdfc2l6ZSA9IHJlc2l6ZV9wb2xpY3k6OmdldF9uZXdfc2l6ZV9mb3JfYXJiaXRyYXJ5KGxlZnQpOworICBjb25zdCBzaXplX3R5cGUgb3RoZXJfYWN0dWFsX3NpemUgPSBvdGhlci5nZXRfbmV3X3NpemVfZm9yX2FyYml0cmFyeShlcnNkKTsKKworICBlbnRyeV9wb2ludGVyIGFfZW50cmllcyA9IDA7CisgIGVudHJ5X3BvaW50ZXIgYV9vdGhlcl9lbnRyaWVzID0gMDsKKworICBfX3RyeQorICAgIHsKKyAgICAgIGFfZW50cmllcyA9IHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKG5ld19zaXplKTsKKyAgICAgIGFfb3RoZXJfZW50cmllcyA9IHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKG90aGVyX2FjdHVhbF9zaXplKTsKKyAgICB9CisgIF9fY2F0Y2goLi4uKQorICAgIHsKKyAgICAgIGlmIChhX2VudHJpZXMgIT0gMCkKKwlzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKGFfZW50cmllcywgbmV3X3NpemUpOworCisgICAgICBpZiAoYV9vdGhlcl9lbnRyaWVzICE9IDApCisJc19lbnRyeV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShhX290aGVyX2VudHJpZXMsIG90aGVyX2FjdHVhbF9zaXplKTsKKworICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgfTsKKworICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG90aGVyLm1fc2l6ZTsgKytpKQorICAgIGVyYXNlX2F0KG90aGVyLm1fYV9lbnRyaWVzLCBpLCBzX25vX3Rocm93X2NvcGllc19pbmQpOworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChuZXdfc2l6ZSA+PSBsZWZ0KTsKKyAgc3RkOjpjb3B5KG1fYV9lbnRyaWVzLCBtX2FfZW50cmllcyArIGxlZnQsIGFfZW50cmllcyk7CisgIHN0ZDo6Y29weShtX2FfZW50cmllcyArIGxlZnQsIG1fYV9lbnRyaWVzICsgbV9zaXplLCBhX290aGVyX2VudHJpZXMpOworCisgIHNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9hX2VudHJpZXMsIG1fYWN0dWFsX3NpemUpOworICBzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKG90aGVyLm1fYV9lbnRyaWVzLCBvdGhlci5tX2FjdHVhbF9zaXplKTsKKworICBtX2FjdHVhbF9zaXplID0gbmV3X3NpemU7CisgIG90aGVyLm1fYWN0dWFsX3NpemUgPSBvdGhlcl9hY3R1YWxfc2l6ZTsKKworICBtX3NpemUgPSBsZWZ0OworICBvdGhlci5tX3NpemUgPSBlcnNkOworCisgIG1fYV9lbnRyaWVzID0gYV9lbnRyaWVzOworICBvdGhlci5tX2FfZW50cmllcyA9IGFfb3RoZXJfZW50cmllczsKKworICBtYWtlX2hlYXAoKTsKKyAgb3RoZXIubWFrZV9oZWFwKCk7CisKKyAgcmVzaXplX3BvbGljeTo6bm90aWZ5X2FyYml0cmFyeShtX2FjdHVhbF9zaXplKTsKKyAgb3RoZXIubm90aWZ5X2FyYml0cmFyeShvdGhlci5tX2FjdHVhbF9zaXplKTsKKworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2pvaW4oUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorCisgIGNvbnN0IHNpemVfdHlwZSBsZW4gPSBtX3NpemUgKyBvdGhlci5tX3NpemU7CisgIGNvbnN0IHNpemVfdHlwZSBuZXdfc2l6ZSA9IHJlc2l6ZV9wb2xpY3k6OmdldF9uZXdfc2l6ZV9mb3JfYXJiaXRyYXJ5KGxlbik7CisKKyAgZW50cnlfcG9pbnRlciBhX2VudHJpZXMgPSAwOworICBlbnRyeV9wb2ludGVyIGFfb3RoZXJfZW50cmllcyA9IDA7CisKKyAgX190cnkKKyAgICB7CisgICAgICBhX2VudHJpZXMgPSBzX2VudHJ5X2FsbG9jYXRvci5hbGxvY2F0ZShuZXdfc2l6ZSk7CisgICAgICBhX290aGVyX2VudHJpZXMgPSBzX2VudHJ5X2FsbG9jYXRvci5hbGxvY2F0ZShyZXNpemVfcG9saWN5OjptaW5fc2l6ZSk7CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7CisgICAgICBpZiAoYV9lbnRyaWVzICE9IDApCisJc19lbnRyeV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShhX2VudHJpZXMsIG5ld19zaXplKTsKKworICAgICAgaWYgKGFfb3RoZXJfZW50cmllcyAhPSAwKQorCXNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUoYV9vdGhlcl9lbnRyaWVzLCByZXNpemVfcG9saWN5OjptaW5fc2l6ZSk7CisKKyAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgIH0KKworICBzdGQ6OmNvcHkobV9hX2VudHJpZXMsIG1fYV9lbnRyaWVzICsgbV9zaXplLCBhX2VudHJpZXMpOworICBzdGQ6OmNvcHkob3RoZXIubV9hX2VudHJpZXMsIG90aGVyLm1fYV9lbnRyaWVzICsgb3RoZXIubV9zaXplLAorCSAgICBhX2VudHJpZXMgKyBtX3NpemUpOworCisgIHNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9hX2VudHJpZXMsIG1fYWN0dWFsX3NpemUpOworICBtX2FfZW50cmllcyA9IGFfZW50cmllczsKKyAgbV9zaXplID0gbGVuOworICBtX2FjdHVhbF9zaXplID0gbmV3X3NpemU7CisgIHJlc2l6ZV9wb2xpY3k6Om5vdGlmeV9hcmJpdHJhcnkobmV3X3NpemUpOworICBtYWtlX2hlYXAoKTsKKworICBzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKG90aGVyLm1fYV9lbnRyaWVzLCBvdGhlci5tX2FjdHVhbF9zaXplKTsKKyAgb3RoZXIubV9hX2VudHJpZXMgPSBhX290aGVyX2VudHJpZXM7CisgIG90aGVyLm1fc2l6ZSA9IDA7CisgIG90aGVyLm1fYWN0dWFsX3NpemUgPSByZXNpemVfcG9saWN5OjptaW5fc2l6ZTsKKyAgb3RoZXIubm90aWZ5X2FyYml0cmFyeShyZXNpemVfcG9saWN5OjptaW5fc2l6ZSk7CisgIG90aGVyLm1ha2VfaGVhcCgpOworICAKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vdHJhY2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL3RyYWNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMGQ2OTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL3RyYWNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNzggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmluYXJ5X2hlYXBfL3RyYWNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBiaW5hcnlfaGVhcC4KKyAqLworCisjaWZkZWYgUEJfRFNfQklOQVJZX0hFQVBfVFJBQ0VfCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0cmFjZSgpIGNvbnN0Cit7CisgIHN0ZDo6Y2VyciA8PCB0aGlzIDw8IHN0ZDo6ZW5kbDsKKworICBzdGQ6OmNlcnIgPDwgbV9hX2VudHJpZXMgPDwgc3RkOjplbmRsOworCisgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbV9zaXplOyArK2kpCisgICAgdHJhY2VfZW50cnkobV9hX2VudHJpZXNbaV0sIHNfbm9fdGhyb3dfY29waWVzX2luZCk7CisKKyAgc3RkOjpjZXJyIDw8IHN0ZDo6ZW5kbDsKKworICBzdGQ6OmNlcnIgPDwgInNpemUgPSAiIDw8IG1fc2l6ZSA8PCAiICIgPDwgImFjdHVhbF9zaXplID0gIiA8PCBtX2FjdHVhbF9zaXplIDw8IHN0ZDo6ZW5kbDsKKworICByZXNpemVfcG9saWN5Ojp0cmFjZSgpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordHJhY2VfZW50cnkoY29uc3QgZW50cnkmIHJfZSwgZmFsc2VfdHlwZSkgY29uc3QKK3sKKyAgc3RkOjpjb3V0IDw8IHJfZSA8PCAiICIgPDwqIHJfZSA8PCBzdGQ6OmVuZGw7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0cmFjZV9lbnRyeShjb25zdCBlbnRyeSYgcl9lLCB0cnVlX3R5cGUpIGNvbnN0Cit7CisgIHN0ZDo6Y291dCA8PCByX2UgPDwgc3RkOjplbmRsOworfQorCisjZW5kaWYgLy8gI2lmZGVmIFBCX0RTX0JJTkFSWV9IRUFQX1RSQUNFXwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfL2Jpbm9taWFsX2hlYXBfLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwXy9iaW5vbWlhbF9oZWFwXy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFkMmU1YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwXy9iaW5vbWlhbF9oZWFwXy5ocHAKQEAgLTAsMCArMSwxMTIgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmlub21pYWxfaGVhcF8uaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBiaW5vbWlhbCBoZWFwLgorICovCisKKy8qCisgKiBCaW5vbWlhbCBoZWFwLgorICogVnVpbGxlbWluIEogaXMgdGhlIG1hc3RhaC4KKyAqIE1vZGlmaWVkIGZyb20gQ0xSUy4KKyAqLworCisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NvbmRfZGVhbHRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlX3V0aWxzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vYmlub21pYWxfaGVhcF9iYXNlXy5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIGJpbm9taWFsX2hlYXA8VmFsdWVfVHlwZSwgQ21wX0ZuLCBfQWxsb2M+CisKKyAgICAvKioKKyAgICAgKiAgQmlub21pYWwgaGVhcC4KKyAgICAgKgorICAgICAqICBAaW5ncm91cCBoZWFwLWRldGFpbAorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIHR5cGVuYW1lIENtcF9GbiwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIGJpbm9taWFsX2hlYXAKKyAgICA6IHB1YmxpYyBiaW5vbWlhbF9oZWFwX2Jhc2U8VmFsdWVfVHlwZSwgQ21wX0ZuLCBfQWxsb2M+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIGJpbm9taWFsX2hlYXBfYmFzZTxWYWx1ZV9UeXBlLCBDbXBfRm4sIF9BbGxvYz4gCWJhc2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlX3BvaW50ZXIgCQlub2RlX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bm9kZV9jb25zdF9wb2ludGVyIAlub2RlX2NvbnN0X3BvaW50ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIFZhbHVlX1R5cGUgCQkJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIAkJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmRpZmZlcmVuY2VfdHlwZSAJCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpwb2ludGVyIAkJcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9wb2ludGVyIAljb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnJlZmVyZW5jZSAJCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9yZWZlcmVuY2UgCWNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpwb2ludF9jb25zdF9pdGVyYXRvciAJcG9pbnRfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRfaXRlcmF0b3IgCXBvaW50X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIAljb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjppdGVyYXRvciAJCWl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNtcF9mbiAJCWNtcF9mbjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjphbGxvY2F0b3JfdHlwZSAJYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIGJpbm9taWFsX2hlYXAoKTsKKworICAgICAgYmlub21pYWxfaGVhcChjb25zdCBDbXBfRm4mKTsKKworICAgICAgYmlub21pYWxfaGVhcChjb25zdCBiaW5vbWlhbF9oZWFwJik7CisKKyAgICAgIH5iaW5vbWlhbF9oZWFwKCk7CisKKyAgICBwcm90ZWN0ZWQ6CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZChjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKyNlbmRpZgorICAgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF8vZGVidWdfZm5faW1wcy5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMzVhNDQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw2MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBkZXRhaWwvYmlub21pYWxfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciBiaW5vbWlhbF9oZWFwXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmlub21pYWxfaGVhcCgpCit7IFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKSB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitiaW5vbWlhbF9oZWFwKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4pCis6IGJhc2VfdHlwZShyX2NtcF9mbikKK3sgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Jpbm9taWFsX2hlYXAoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQorOiBiYXNlX3R5cGUob3RoZXIpCit7IFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKSB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+Ymlub21pYWxfaGVhcCgpIHsgfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZWNmNTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF8vZGVidWdfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw0OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBkZXRhaWwvYmlub21pYWxfaGVhcF8vZGVidWdfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciBiaW5vbWlhbF9oZWFwXy4KKyAqLworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF92YWxpZChjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7IGJhc2VfdHlwZTo6YXNzZXJ0X3ZhbGlkKHRydWUsIF9fZmlsZSwgX19saW5lKTsgfQorCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9iaW5vbWlhbF9oZWFwX2Jhc2VfLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2Jpbm9taWFsX2hlYXBfYmFzZV8uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZTUxNDEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9iaW5vbWlhbF9oZWFwX2Jhc2VfLmhwcApAQCAtMCwwICsxLDIxMSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5vbWlhbF9oZWFwX2Jhc2VfL2Jpbm9taWFsX2hlYXBfYmFzZV8uaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBiYXNlIG9mIGJpbm9taWFsIGhlYXBzLgorICovCisKKyNpZm5kZWYgUEJfRFNfQklOT01JQUxfSEVBUF9CQVNFX0hQUAorI2RlZmluZSBQQl9EU19CSU5PTUlBTF9IRUFQX0JBU0VfSFBQCisKKy8qCisgKiBCaW5vbWlhbCBoZWFwIGJhc2UuCisgKiBWdWlsbGVtaW4gSiBpcyB0aGUgbWFzdGFoLgorICogTW9kaWZpZWQgZnJvbSBDTFJTLgorICovCisKKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY29uZF9kZWFsdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8uaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIHR5cGVuYW1lIENtcF9GbiwgdHlwZW5hbWUgX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICBiaW5vbWlhbF9oZWFwX2Jhc2U8VmFsdWVfVHlwZSwgQ21wX0ZuLCBfQWxsb2M+CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworI2RlZmluZSBQQl9EU19CX0hFQVBfQkFTRSBcCisgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXA8VmFsdWVfVHlwZSwgQ21wX0ZuLCBcCisJCQkJdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUsICBfQWxsb2MsIGZhbHNlPgorI2Vsc2UKKyNkZWZpbmUgUEJfRFNfQl9IRUFQX0JBU0UgXAorICBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwPFZhbHVlX1R5cGUsIENtcF9GbiwgXAorCQkJCXR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlLCBfQWxsb2M+CisjZW5kaWYKKworICAgIC8vLyBCYXNlIGNsYXNzIGZvciBiaW5vbWlhbCBoZWFwLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIHR5cGVuYW1lIENtcF9GbiwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIGJpbm9taWFsX2hlYXBfYmFzZQorICAgIDogcHVibGljIFBCX0RTX0JfSEVBUF9CQVNFCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPFZhbHVlX1R5cGU+OjpvdGhlciBfX3JlYmluZF92OworICAgICAgdHlwZWRlZiBQQl9EU19CX0hFQVBfQkFTRQkgIAkJCWJhc2VfdHlwZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlIAkJCW5vZGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bm9kZV9wb2ludGVyIAkJbm9kZV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om5vZGVfY29uc3RfcG9pbnRlciAJbm9kZV9jb25zdF9wb2ludGVyOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBWYWx1ZV9UeXBlIAkJCQl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBDbXBfRm4gCQkJCQljbXBfZm47CisgICAgICB0eXBlZGVmIF9BbGxvYyAJCQkJCWFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAJCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpkaWZmZXJlbmNlX3R5cGUgCQlkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdjo6cG9pbnRlciAJCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3Y6OmNvbnN0X3BvaW50ZXIgCWNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3Y6OnJlZmVyZW5jZSAJCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdjo6Y29uc3RfcmVmZXJlbmNlICAgCWNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnBvaW50X2NvbnN0X2l0ZXJhdG9yIAlwb2ludF9jb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpwb2ludF9pdGVyYXRvciAJcG9pbnRfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IgCWNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Oml0ZXJhdG9yIAkJaXRlcmF0b3I7CisKKyAgICBwdWJsaWM6CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgcHVzaChjb25zdF9yZWZlcmVuY2UpOworCisgICAgICB2b2lkCisgICAgICBtb2RpZnkocG9pbnRfaXRlcmF0b3IsIGNvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBjb25zdF9yZWZlcmVuY2UKKyAgICAgIHRvcCgpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBwb3AoKTsKKworICAgICAgdm9pZAorICAgICAgZXJhc2UocG9pbnRfaXRlcmF0b3IpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgY2xlYXIoKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2VfaWYoUHJlZCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CisgICAgICB2b2lkCisgICAgICBzcGxpdChQcmVkLCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB2b2lkCisgICAgICBqb2luKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICBwcm90ZWN0ZWQ6CisKKyAgICAgIGJpbm9taWFsX2hlYXBfYmFzZSgpOworCisgICAgICBiaW5vbWlhbF9oZWFwX2Jhc2UoY29uc3QgQ21wX0ZuJik7CisKKyAgICAgIGJpbm9taWFsX2hlYXBfYmFzZShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIH5iaW5vbWlhbF9oZWFwX2Jhc2UoKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgICB2b2lkCisgICAgICBjb3B5X2Zyb21fcmFuZ2UoSXQsIEl0KTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGZpbmRfbWF4KCk7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X3ZhbGlkKGJvb2wsIGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfbWF4KGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworI2VuZGlmCisKKyAgICBwcml2YXRlOgorCisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICBmaXgobm9kZV9wb2ludGVyKSBjb25zdDsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGluc2VydF9ub2RlKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICByZW1vdmVfcGFyZW50bGVzc19ub2RlKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSBub2RlX3BvaW50ZXIKKyAgICAgIGpvaW4obm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIpIGNvbnN0OworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnQobm9kZV9jb25zdF9wb2ludGVyLCBib29sLCBib29sLAorCQkJICAgICBjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKyNlbmRpZgorCisgICAgcHJvdGVjdGVkOgorICAgICAgbm9kZV9wb2ludGVyIAltX3BfbWF4OworICAgIH07CisKKyNkZWZpbmUgUEJfRFNfQVNTRVJUX1ZBTElEX0NPTkQoWCwgX1N0cmljdGx5Qmlub21pYWwpCQkJXAorICBfR0xJQkNYWF9ERUJVR19PTkxZKFguYXNzZXJ0X3ZhbGlkKF9TdHJpY3RseUJpbm9taWFsLF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCisjZGVmaW5lIFBCX0RTX0FTU0VSVF9CQVNFX05PREVfQ09OU0lTVEVOVChfTm9kZSwgX0Jvb2wpCQkJXAorICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6YXNzZXJ0X25vZGVfY29uc2lzdGVudChfTm9kZSwgX0Jvb2wsCVwKKwkJCQkJCQlfX0ZJTEVfXywgX19MSU5FX18pOykKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vZGVidWdfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2ZpbmRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2luc2VydF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vZXJhc2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHA+CisKKyN1bmRlZiBQQl9EU19BU1NFUlRfQkFTRV9OT0RFX0NPTlNJU1RFTlQKKyN1bmRlZiBQQl9EU19BU1NFUlRfVkFMSURfQ09ORAorI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19CX0hFQVBfQkFTRQorICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMjI4ZGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDg1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbm9taWFsX2hlYXBfYmFzZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGJhc2Ugb2YgYmlub21pYWwgaGVhcHMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIEl0Pgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY29weV9mcm9tX3JhbmdlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KQoreworICB3aGlsZSAoZmlyc3RfaXQgIT0gbGFzdF9pdCkKKyAgICBwdXNoKCooZmlyc3RfaXQrKykpOworICBQQl9EU19BU1NFUlRfVkFMSURfQ09ORCgoKnRoaXMpLGZhbHNlKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmlub21pYWxfaGVhcF9iYXNlKCkgOiBtX3BfbWF4KDApCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKCgqdGhpcyksZmFsc2UpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitiaW5vbWlhbF9oZWFwX2Jhc2UoY29uc3QgQ21wX0ZuJiByX2NtcF9mbikKKzogYmFzZV90eXBlKHJfY21wX2ZuKSwgbV9wX21heCgwKQoreyBQQl9EU19BU1NFUlRfVkFMSURfQ09ORCgoKnRoaXMpLGZhbHNlKSB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitiaW5vbWlhbF9oZWFwX2Jhc2UoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQorOiBiYXNlX3R5cGUob3RoZXIpLCBtX3BfbWF4KDApCit7IFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKCgqdGhpcyksZmFsc2UpIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSURfQ09ORCgoKnRoaXMpLGZhbHNlKQorICBiYXNlX3R5cGU6OnN3YXAob3RoZXIpOworICBzdGQ6OnN3YXAobV9wX21heCwgb3RoZXIubV9wX21heCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKCgqdGhpcyksZmFsc2UpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+Ymlub21pYWxfaGVhcF9iYXNlKCkKK3sgfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vZGVidWdfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9kZWJ1Z19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDEzZjI4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vZGVidWdfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMDAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmlub21pYWxfaGVhcF9iYXNlXy9kZWJ1Z19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmFzZSBvZiBiaW5vbWlhbCBoZWFwcy4KKyAqLworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF92YWxpZChib29sIHN0cmljdGx5X2Jpbm9taWFsLCBjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGJhc2VfdHlwZTo6YXNzZXJ0X3ZhbGlkKF9fZmlsZSwgX19saW5lKTsKKyAgYXNzZXJ0X25vZGVfY29uc2lzdGVudChiYXNlX3R5cGU6Om1fcF9yb290LCBzdHJpY3RseV9iaW5vbWlhbCwgdHJ1ZSwKKwkJCSBfX2ZpbGUsIF9fbGluZSk7CisgIGFzc2VydF9tYXgoX19maWxlLCBfX2xpbmUpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X21heChjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGlmIChtX3BfbWF4ID09IDApCisgICAgcmV0dXJuOworICBQQl9EU19ERUJVR19WRVJJRlkoYmFzZV90eXBlOjpwYXJlbnQobV9wX21heCkgPT0gMCk7CisgIGZvciAoY29uc3RfaXRlcmF0b3IgaXQgPSBiYXNlX3R5cGU6OmJlZ2luKCk7IGl0ICE9IGJhc2VfdHlwZTo6ZW5kKCk7ICsraXQpCisgICAgUEJfRFNfREVCVUdfVkVSSUZZKCFDbXBfRm46Om9wZXJhdG9yKCkobV9wX21heC0+bV92YWx1ZSwKKwkJCQkJICAgaXQubV9wX25kLT5tX3ZhbHVlKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfbm9kZV9jb25zaXN0ZW50KG5vZGVfY29uc3RfcG9pbnRlciBwX25kLCBib29sIHN0cmljdGx5X2Jpbm9taWFsLAorCQkgICAgICAgYm9vbCBpbmNyZWFzaW5nLCBjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIFBCX0RTX0RFQlVHX1ZFUklGWShpbmNyZWFzaW5nIHx8IHN0cmljdGx5X2Jpbm9taWFsKTsKKyAgYmFzZV90eXBlOjphc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfbmQsIGZhbHNlLCBfX2ZpbGUsIF9fbGluZSk7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuOworICBQQl9EU19ERUJVR19WRVJJRlkocF9uZC0+bV9tZXRhZGF0YSA9PSBiYXNlX3R5cGU6OmRlZ3JlZShwX25kKSk7CisgIFBCX0RTX0RFQlVHX1ZFUklGWShiYXNlX3R5cGU6OnNpemVfdW5kZXJfbm9kZShwX25kKSA9PQorCQkgICBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KDEgPDwgcF9uZC0+bV9tZXRhZGF0YSkpOworICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcsIHN0cmljdGx5X2Jpbm9taWFsLCBpbmNyZWFzaW5nLAorCQkJIF9fZmlsZSwgX19saW5lKTsKKyAgYXNzZXJ0X25vZGVfY29uc2lzdGVudChwX25kLT5tX3BfbF9jaGlsZCwgdHJ1ZSwgZmFsc2UsIF9fZmlsZSwgX19saW5lKTsKKyAgaWYgKHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCkKKyAgICB7CisgICAgICBpZiAoaW5jcmVhc2luZykKKwl7CisJICBpZiAoc3RyaWN0bHlfYmlub21pYWwpCisJICAgIFBCX0RTX0RFQlVHX1ZFUklGWShwX25kLT5tX21ldGFkYXRhCisJCQkJICA8IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmctPm1fbWV0YWRhdGEpOworCSAgZWxzZQorCSAgICBQQl9EU19ERUJVR19WRVJJRlkocF9uZC0+bV9tZXRhZGF0YQorCQkJCSAgPD0gcF9uZC0+bV9wX25leHRfc2libGluZy0+bV9tZXRhZGF0YSk7CisJfQorICAgICAgZWxzZQorCVBCX0RTX0RFQlVHX1ZFUklGWShwX25kLT5tX21ldGFkYXRhCisJCQkgICAgICA+IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmctPm1fbWV0YWRhdGEpOworICAgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9lcmFzZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2VyYXNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYmNhNzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9lcmFzZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDE2MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5vbWlhbF9oZWFwX2Jhc2VfL2VyYXNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBiYXNlIG9mIGJpbm9taWFsIGhlYXBzLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citwb3AoKQoreworICBQQl9EU19BU1NFUlRfVkFMSURfQ09ORCgoKnRoaXMpLHRydWUpCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghYmFzZV90eXBlOjplbXB0eSgpKTsKKworICBpZiAobV9wX21heCA9PSAwKQorICAgIGZpbmRfbWF4KCk7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9tYXggIT0gMCk7CisgIG5vZGVfcG9pbnRlciBwX25kID0gbV9wX21heDsKKyAgcmVtb3ZlX3BhcmVudGxlc3Nfbm9kZShtX3BfbWF4KTsKKyAgYmFzZV90eXBlOjphY3R1YWxfZXJhc2Vfbm9kZShwX25kKTsKKyAgbV9wX21heCA9IDA7CisgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKCgqdGhpcyksdHJ1ZSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlbW92ZV9wYXJlbnRsZXNzX25vZGUobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kICE9IDApOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmFzZV90eXBlOjpwYXJlbnQocF9uZCkgPT0gMCk7CisKKyAgbm9kZV9wb2ludGVyIHBfY3VyX3Jvb3QgPSBwX25kID09IGJhc2VfdHlwZTo6bV9wX3Jvb3Q/CisgICAgcF9uZC0+bV9wX25leHRfc2libGluZyA6IGJhc2VfdHlwZTo6bV9wX3Jvb3Q7CisKKyAgaWYgKHBfY3VyX3Jvb3QgIT0gMCkKKyAgICBwX2N1cl9yb290LT5tX3BfcHJldl9vcl9wYXJlbnQgPSAwOworCisgIGlmIChwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQgIT0gMCkKKyAgICBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nOworCisgIGlmIChwX25kLT5tX3BfbmV4dF9zaWJsaW5nICE9IDApCisgICAgcF9uZC0+bV9wX25leHRfc2libGluZy0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50OworCisgIG5vZGVfcG9pbnRlciBwX2NoaWxkID0gcF9uZC0+bV9wX2xfY2hpbGQ7CisgIGlmIChwX2NoaWxkICE9IDApCisgICAgeworICAgICAgcF9jaGlsZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKyAgICAgIHdoaWxlIChwX2NoaWxkLT5tX3BfbmV4dF9zaWJsaW5nICE9IDApCisJcF9jaGlsZCA9IHBfY2hpbGQtPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgfQorCisgIG1fcF9tYXggPSAwOworICBiYXNlX3R5cGU6Om1fcF9yb290ID0gam9pbihwX2N1cl9yb290LCBwX2NoaWxkKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcigpCit7CisgIGJhc2VfdHlwZTo6Y2xlYXIoKTsKKyAgbV9wX21heCA9IDA7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShwb2ludF9pdGVyYXRvciBpdCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEX0NPTkQoKCp0aGlzKSx0cnVlKQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWJhc2VfdHlwZTo6ZW1wdHkoKSk7CisKKyAgYmFzZV90eXBlOjpidWJibGVfdG9fdG9wKGl0Lm1fcF9uZCk7CisgIHJlbW92ZV9wYXJlbnRsZXNzX25vZGUoaXQubV9wX25kKTsKKyAgYmFzZV90eXBlOjphY3R1YWxfZXJhc2Vfbm9kZShpdC5tX3BfbmQpOworICBtX3BfbWF4ID0gMDsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEX0NPTkQoKCp0aGlzKSx0cnVlKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2lmKFByZWQgcHJlZCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEX0NPTkQoKCp0aGlzKSx0cnVlKQorCisgIGlmIChiYXNlX3R5cGU6OmVtcHR5KCkpCisgICAgeworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEX0NPTkQoKCp0aGlzKSx0cnVlKQorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGJhc2VfdHlwZTo6dG9fbGlua2VkX2xpc3QoKTsKKyAgbm9kZV9wb2ludGVyIHBfb3V0ID0gYmFzZV90eXBlOjpwcnVuZShwcmVkKTsKKyAgc2l6ZV90eXBlIGVyc2QgPSAwOworICB3aGlsZSAocF9vdXQgIT0gMCkKKyAgICB7CisgICAgICArK2Vyc2Q7CisgICAgICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gcF9vdXQtPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBiYXNlX3R5cGU6OmFjdHVhbF9lcmFzZV9ub2RlKHBfb3V0KTsKKyAgICAgIHBfb3V0ID0gcF9uZXh0OworICAgIH0KKworICBub2RlX3BvaW50ZXIgcF9jdXIgPSBiYXNlX3R5cGU6Om1fcF9yb290OworICBiYXNlX3R5cGU6Om1fcF9yb290ID0gMDsKKyAgd2hpbGUgKHBfY3VyICE9IDApCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfbmV4dCA9IHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgcF9jdXItPm1fcF9sX2NoaWxkID0gcF9jdXItPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisgICAgICBwX2N1ci0+bV9tZXRhZGF0YSA9IDA7CisgICAgICBwX2N1ci0+bV9wX25leHRfc2libGluZyA9IGJhc2VfdHlwZTo6bV9wX3Jvb3Q7CisKKyAgICAgIGlmIChiYXNlX3R5cGU6Om1fcF9yb290ICE9IDApCisJYmFzZV90eXBlOjptX3Bfcm9vdC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9jdXI7CisKKyAgICAgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBwX2N1cjsKKyAgICAgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBmaXgoYmFzZV90eXBlOjptX3Bfcm9vdCk7CisgICAgICBwX2N1ciA9IHBfbmV4dDsKKyAgICB9CisKKyAgbV9wX21heCA9IDA7CisgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKCgqdGhpcyksdHJ1ZSkKKyAgcmV0dXJuIGVyc2Q7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9maW5kX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vZmluZF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzM4NWE3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vZmluZF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDcwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbm9taWFsX2hlYXBfYmFzZV8vZmluZF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmFzZSBvZiBiaW5vbWlhbCBoZWFwcy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9yZWZlcmVuY2UKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RvcCgpIGNvbnN0Cit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKCgqdGhpcyksZmFsc2UpCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghYmFzZV90eXBlOjplbXB0eSgpKTsKKworICBpZiAobV9wX21heCA9PSAwKQorICAgIGNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMqID4odGhpcyktPmZpbmRfbWF4KCk7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9tYXggIT0gMCk7CisgIHJldHVybiBtX3BfbWF4LT5tX3ZhbHVlOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZF9tYXgoKQoreworICBub2RlX3BvaW50ZXIgcF9jdXIgPSBiYXNlX3R5cGU6Om1fcF9yb290OworICBtX3BfbWF4ID0gcF9jdXI7CisgIHdoaWxlIChwX2N1ciAhPSAwKQorICAgIHsKKyAgICAgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkobV9wX21heC0+bV92YWx1ZSwgcF9jdXItPm1fdmFsdWUpKQorCW1fcF9tYXggPSBwX2N1cjsKKyAgICAgIHBfY3VyID0gcF9jdXItPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9pbnNlcnRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9pbnNlcnRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmYjAwMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2luc2VydF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDE3OCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5vbWlhbF9oZWFwX2Jhc2VfL2luc2VydF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmFzZSBvZiBiaW5vbWlhbCBoZWFwcy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcHVzaChjb25zdF9yZWZlcmVuY2Ugcl92YWwpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKCgqdGhpcyksdHJ1ZSkKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBiYXNlX3R5cGU6OmdldF9uZXdfbm9kZV9mb3JfaW5zZXJ0KHJfdmFsKTsKKyAgaW5zZXJ0X25vZGUocF9uZCk7CisgIG1fcF9tYXggPSAwOworICBQQl9EU19BU1NFUlRfVkFMSURfQ09ORCgoKnRoaXMpLHRydWUpCisgIHJldHVybiBwb2ludF9pdGVyYXRvcihwX25kKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitpbnNlcnRfbm9kZShub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgaWYgKGJhc2VfdHlwZTo6bV9wX3Jvb3QgPT0gMCkKKyAgICB7CisgICAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nID0gMDsKKyAgICAgIHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisgICAgICBwX25kLT5tX3BfbF9jaGlsZCA9IDA7CisgICAgICBwX25kLT5tX21ldGFkYXRhID0gMDsKKyAgICAgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBwX25kOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoYmFzZV90eXBlOjptX3Bfcm9vdC0+bV9tZXRhZGF0YSA+IDApCisgICAgeworICAgICAgcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZC0+bV9wX2xfY2hpbGQgPSAwOworICAgICAgcF9uZC0+bV9wX25leHRfc2libGluZyA9IGJhc2VfdHlwZTo6bV9wX3Jvb3Q7CisgICAgICBiYXNlX3R5cGU6Om1fcF9yb290LT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25kOworICAgICAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IHBfbmQ7CisgICAgICBwX25kLT5tX21ldGFkYXRhID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKENtcF9Gbjo6b3BlcmF0b3IoKShiYXNlX3R5cGU6Om1fcF9yb290LT5tX3ZhbHVlLCBwX25kLT5tX3ZhbHVlKSkKKyAgICB7CisgICAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nID0gYmFzZV90eXBlOjptX3Bfcm9vdC0+bV9wX25leHRfc2libGluZzsKKyAgICAgIHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisgICAgICBwX25kLT5tX21ldGFkYXRhID0gMTsKKyAgICAgIHBfbmQtPm1fcF9sX2NoaWxkID0gYmFzZV90eXBlOjptX3Bfcm9vdDsKKyAgICAgIGJhc2VfdHlwZTo6bV9wX3Jvb3QtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQ7CisgICAgICBiYXNlX3R5cGU6Om1fcF9yb290LT5tX3BfbmV4dF9zaWJsaW5nID0gMDsKKyAgICAgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBwX25kOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgPSAwOworICAgICAgcF9uZC0+bV9wX2xfY2hpbGQgPSAwOworICAgICAgcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gYmFzZV90eXBlOjptX3Bfcm9vdDsKKyAgICAgIHBfbmQtPm1fbWV0YWRhdGEgPSAwOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfdHlwZTo6bV9wX3Jvb3QtPm1fcF9sX2NoaWxkID09IDApOworICAgICAgYmFzZV90eXBlOjptX3Bfcm9vdC0+bV9wX2xfY2hpbGQgPSBwX25kOworICAgICAgYmFzZV90eXBlOjptX3Bfcm9vdC0+bV9tZXRhZGF0YSA9IDE7CisgICAgfQorCisgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBmaXgoYmFzZV90eXBlOjptX3Bfcm9vdCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZml4KG5vZGVfcG9pbnRlciBwX25kKSBjb25zdAoreworICB3aGlsZSAocF9uZC0+bV9wX25leHRfc2libGluZyAhPSAwICYmCisJIHBfbmQtPm1fbWV0YWRhdGEgPT0gcF9uZC0+bV9wX25leHRfc2libGluZy0+bV9tZXRhZGF0YSkKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gcF9uZC0+bV9wX25leHRfc2libGluZzsKKyAgICAgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkocF9uZC0+bV92YWx1ZSwgcF9uZXh0LT5tX3ZhbHVlKSkKKwl7CisJICBwX25leHQtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudDsKKworCSAgaWYgKHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCAhPSAwKQorCSAgICBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX25leHQ7CisKKwkgIGJhc2VfdHlwZTo6bWFrZV9jaGlsZF9vZihwX25kLCBwX25leHQpOworCSAgKytwX25leHQtPm1fbWV0YWRhdGE7CisJICBwX25kID0gcF9uZXh0OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nID0gcF9uZXh0LT5tX3BfbmV4dF9zaWJsaW5nOworCisJICBpZiAocF9uZC0+bV9wX25leHRfc2libGluZyAhPSAwKQorCSAgICBwX25leHQtPm1fcF9uZXh0X3NpYmxpbmcgPSAwOworCisJICBiYXNlX3R5cGU6Om1ha2VfY2hpbGRfb2YocF9uZXh0LCBwX25kKTsKKwkgICsrcF9uZC0+bV9tZXRhZGF0YTsKKwl9CisgICAgfQorCisgIGlmIChwX25kLT5tX3BfbmV4dF9zaWJsaW5nICE9IDApCisgICAgcF9uZC0+bV9wX25leHRfc2libGluZy0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZDsKKworICByZXR1cm4gcF9uZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK21vZGlmeShwb2ludF9pdGVyYXRvciBpdCwgY29uc3RfcmVmZXJlbmNlIHJfbmV3X3ZhbCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEX0NPTkQoKCp0aGlzKSx0cnVlKQorICBub2RlX3BvaW50ZXIgcF9uZCA9IGl0Lm1fcF9uZDsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZCAhPSAwKTsKKyAgUEJfRFNfQVNTRVJUX0JBU0VfTk9ERV9DT05TSVNURU5UKHBfbmQsIGZhbHNlKQorCisgIGNvbnN0IGJvb2wgYnViYmxlX3VwID0gQ21wX0ZuOjpvcGVyYXRvcigpKHBfbmQtPm1fdmFsdWUsIHJfbmV3X3ZhbCk7CisgIHBfbmQtPm1fdmFsdWUgPSByX25ld192YWw7CisKKyAgaWYgKGJ1YmJsZV91cCkKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9wYXJlbnQgPSBiYXNlX3R5cGU6OnBhcmVudChwX25kKTsKKyAgICAgIHdoaWxlIChwX3BhcmVudCAhPSAwICYmCisJICAgICBDbXBfRm46Om9wZXJhdG9yKCkocF9wYXJlbnQtPm1fdmFsdWUsIHBfbmQtPm1fdmFsdWUpKQorCXsKKwkgIGJhc2VfdHlwZTo6c3dhcF93aXRoX3BhcmVudChwX25kLCBwX3BhcmVudCk7CisJICBwX3BhcmVudCA9IGJhc2VfdHlwZTo6cGFyZW50KHBfbmQpOworCX0KKworICAgICAgaWYgKHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCA9PSAwKQorCWJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBwX25kOworCisgICAgICBtX3BfbWF4ID0gMDsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKCgqdGhpcyksdHJ1ZSkKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgYmFzZV90eXBlOjpidWJibGVfdG9fdG9wKHBfbmQpOworICByZW1vdmVfcGFyZW50bGVzc19ub2RlKHBfbmQpOworICBpbnNlcnRfbm9kZShwX25kKTsKKyAgbV9wX21heCA9IDA7CisgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKCgqdGhpcyksdHJ1ZSkKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YzE4NTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTk3IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbm9taWFsX2hlYXBfYmFzZV8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmFzZSBvZiBiaW5vbWlhbCBoZWFwcy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGl0KFByZWQgcHJlZCwgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSURfQ09ORCgoKnRoaXMpLHRydWUpCisgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKG90aGVyLHRydWUpCisKKyAgb3RoZXIuY2xlYXIoKTsKKyAgaWYgKGJhc2VfdHlwZTo6ZW1wdHkoKSkKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSURfQ09ORCgoKnRoaXMpLHRydWUpCisgICAgICBQQl9EU19BU1NFUlRfVkFMSURfQ09ORChvdGhlcix0cnVlKQorICAgICAgcmV0dXJuOworICAgIH0KKworICBiYXNlX3R5cGU6OnRvX2xpbmtlZF9saXN0KCk7CisgIG5vZGVfcG9pbnRlciBwX291dCA9IGJhc2VfdHlwZTo6cHJ1bmUocHJlZCk7CisgIHdoaWxlIChwX291dCAhPSAwKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChiYXNlX3R5cGU6Om1fc2l6ZSA+IDApOworICAgICAgLS1iYXNlX3R5cGU6Om1fc2l6ZTsKKyAgICAgICsrb3RoZXIubV9zaXplOworCisgICAgICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gcF9vdXQtPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBwX291dC0+bV9wX2xfY2hpbGQgPSBwX291dC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKyAgICAgIHBfb3V0LT5tX21ldGFkYXRhID0gMDsKKworICAgICAgcF9vdXQtPm1fcF9uZXh0X3NpYmxpbmcgPSBvdGhlci5tX3Bfcm9vdDsKKyAgICAgIGlmIChvdGhlci5tX3Bfcm9vdCAhPSAwKQorCW90aGVyLm1fcF9yb290LT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX291dDsKKworICAgICAgb3RoZXIubV9wX3Jvb3QgPSBwX291dDsKKyAgICAgIG90aGVyLm1fcF9yb290ID0gb3RoZXIuZml4KG90aGVyLm1fcF9yb290KTsKKyAgICAgIHBfb3V0ID0gcF9uZXh0OworICAgIH0KKworICBQQl9EU19BU1NFUlRfVkFMSURfQ09ORChvdGhlcix0cnVlKQorICBub2RlX3BvaW50ZXIgcF9jdXIgPSBiYXNlX3R5cGU6Om1fcF9yb290OworICBiYXNlX3R5cGU6Om1fcF9yb290ID0gMDsKKworICB3aGlsZSAocF9jdXIgIT0gMCkKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gcF9jdXItPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBwX2N1ci0+bV9wX2xfY2hpbGQgPSBwX2N1ci0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKyAgICAgIHBfY3VyLT5tX21ldGFkYXRhID0gMDsKKyAgICAgIHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nID0gYmFzZV90eXBlOjptX3Bfcm9vdDsKKworICAgICAgaWYgKGJhc2VfdHlwZTo6bV9wX3Jvb3QgIT0gMCkKKwliYXNlX3R5cGU6Om1fcF9yb290LT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX2N1cjsKKworICAgICAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IHBfY3VyOworICAgICAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IGZpeChiYXNlX3R5cGU6Om1fcF9yb290KTsKKyAgICAgIHBfY3VyID0gcF9uZXh0OworICAgIH0KKworICBtX3BfbWF4ID0gMDsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEX0NPTkQoKCp0aGlzKSx0cnVlKQorICBQQl9EU19BU1NFUlRfVkFMSURfQ09ORChvdGhlcix0cnVlKQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2pvaW4oUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSURfQ09ORCgoKnRoaXMpLHRydWUpCisgIFBCX0RTX0FTU0VSVF9WQUxJRF9DT05EKG90aGVyLHRydWUpCisKKyAgbm9kZV9wb2ludGVyIHBfb3RoZXIgPSBvdGhlci5tX3Bfcm9vdDsKKyAgaWYgKHBfb3RoZXIgIT0gMCkKKyAgICBkbworICAgICAgeworCW5vZGVfcG9pbnRlciBwX25leHQgPSBwX290aGVyLT5tX3BfbmV4dF9zaWJsaW5nOworCXN0ZDo6c3dhcChwX290aGVyLT5tX3BfbmV4dF9zaWJsaW5nLCBwX290aGVyLT5tX3BfcHJldl9vcl9wYXJlbnQpOworCXBfb3RoZXIgPSBwX25leHQ7CisgICAgICB9CisgICAgd2hpbGUgKHBfb3RoZXIgIT0gMCk7CisKKyAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IGpvaW4oYmFzZV90eXBlOjptX3Bfcm9vdCwgb3RoZXIubV9wX3Jvb3QpOworICBiYXNlX3R5cGU6Om1fc2l6ZSArPSBvdGhlci5tX3NpemU7CisgIG1fcF9tYXggPSAwOworCisgIG90aGVyLm1fcF9yb290ID0gMDsKKyAgb3RoZXIubV9zaXplID0gMDsKKyAgb3RoZXIubV9wX21heCA9IDA7CisKKyAgUEJfRFNfQVNTRVJUX1ZBTElEX0NPTkQoKCp0aGlzKSx0cnVlKQorICBQQl9EU19BU1NFUlRfVkFMSURfQ09ORChvdGhlcix0cnVlKQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2pvaW4obm9kZV9wb2ludGVyIHBfbGhzLCBub2RlX3BvaW50ZXIgcF9yaHMpIGNvbnN0Cit7CisgIG5vZGVfcG9pbnRlciBwX3JldCA9IDA7CisgIG5vZGVfcG9pbnRlciBwX2N1ciA9IDA7CisKKyAgd2hpbGUgKHBfbGhzICE9IDAgfHwgcF9yaHMgIT0gMCkKKyAgICB7CisgICAgICBpZiAocF9yaHMgPT0gMCkKKwl7CisJICBpZiAocF9jdXIgPT0gMCkKKwkgICAgcF9yZXQgPSBwX2N1ciA9IHBfbGhzOworCSAgZWxzZQorCSAgICB7CisJICAgICAgcF9jdXItPm1fcF9uZXh0X3NpYmxpbmcgPSBwX2xoczsKKwkgICAgICBwX2xocy0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9jdXI7CisJICAgIH0KKwkgIHBfY3VyID0gcF9saHMgPSAwOworCX0KKyAgICAgIGVsc2UgaWYgKHBfbGhzID09IDAgfHwgcF9yaHMtPm1fbWV0YWRhdGEgPCBwX2xocy0+bV9tZXRhZGF0YSkKKwl7CisJICBpZiAocF9jdXIgPT0gMCkKKwkgICAgeworCSAgICAgIHBfcmV0ID0gcF9jdXIgPSBwX3JoczsKKwkgICAgICBwX3JocyA9IHBfcmhzLT5tX3BfcHJldl9vcl9wYXJlbnQ7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nID0gcF9yaHM7CisJICAgICAgcF9yaHMgPSBwX3Jocy0+bV9wX3ByZXZfb3JfcGFyZW50OworCSAgICAgIHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX2N1cjsKKwkgICAgICBwX2N1ciA9IHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAocF9saHMtPm1fbWV0YWRhdGEgPCBwX3Jocy0+bV9tZXRhZGF0YSkKKwl7CisJICBpZiAocF9jdXIgPT0gMCkKKwkgICAgcF9yZXQgPSBwX2N1ciA9IHBfbGhzOworCSAgZWxzZQorCSAgICB7CisJICAgICAgcF9jdXItPm1fcF9uZXh0X3NpYmxpbmcgPSBwX2xoczsKKwkgICAgICBwX2xocy0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9jdXI7CisJICAgICAgcF9jdXIgPSBwX2N1ci0+bV9wX25leHRfc2libGluZzsKKwkgICAgfQorCSAgcF9saHMgPSBwX2N1ci0+bV9wX25leHRfc2libGluZzsKKwl9CisgICAgICBlbHNlCisJeworCSAgbm9kZV9wb2ludGVyIHBfbmV4dF9yaHMgPSBwX3Jocy0+bV9wX3ByZXZfb3JfcGFyZW50OworCSAgcF9yaHMtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX2xoczsKKwkgIHBfbGhzID0gZml4KHBfcmhzKTsKKwkgIHBfcmhzID0gcF9uZXh0X3JoczsKKwl9CisgICAgfQorCisgIGlmIChwX2N1ciAhPSAwKQorICAgIHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nID0gMDsKKworICBpZiAocF9yZXQgIT0gMCkKKyAgICBwX3JldC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKworICByZXR1cm4gcF9yZXQ7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYnJhbmNoX3BvbGljeS9icmFuY2hfcG9saWN5LmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9icmFuY2hfcG9saWN5L2JyYW5jaF9wb2xpY3kuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZWRjMjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYnJhbmNoX3BvbGljeS9icmFuY2hfcG9saWN5LmhwcApAQCAtMCwwICsxLDExOSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBicmFuY2hfcG9saWN5L2JyYW5jaF9wb2xpY3kuaHBwCisgKiBDb250YWlucyBhIGJhc2UgY2xhc3MgZm9yIGJyYW5jaCBwb2xpY2llcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX0JSQU5DSF9QT0xJQ1lfQkFTRV9IUFAKKyNkZWZpbmUgUEJfRFNfQlJBTkNIX1BPTElDWV9CQVNFX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL3RhZ19hbmRfdHJhaXQuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gUHJpbWFyeSB0ZW1wbGF0ZSwgYmFzZSBjbGFzcyBmb3IgYnJhbmNoIHN0cnVjdHVyZSBwb2xpY2llcy4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX0NJdHIsIHR5cGVuYW1lIE5vZGVfSXRyLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICBzdHJ1Y3QgYnJhbmNoX3BvbGljeQorICAgICAgeworICAgICAgcHJvdGVjdGVkOgorCXR5cGVkZWYgdHlwZW5hbWUgTm9kZV9JdHI6OnZhbHVlX3R5cGUgCQlpdF90eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8aXRfdHlwZT46OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIHZhbHVlX3R5cGU6OmZpcnN0X3R5cGUgCWtleV90eXBlOworCisJdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfY29uc3Q8dmFsdWVfdHlwZT46OnR5cGUJcmN2YWx1ZV90eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2NvbnN0PGtleV90eXBlPjo6dHlwZQlyY2tleV90eXBlOworCisJdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxyY3ZhbHVlX3R5cGU+OjpvdGhlciByZWJpbmRfdjsKKwl0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPHJja2V5X3R5cGU+OjpvdGhlciAgIHJlYmluZF9rOworCisJdHlwZWRlZgl0eXBlbmFtZSByZWJpbmRfdjo6cmVmZXJlbmNlIAkJcmVmZXJlbmNlOworCXR5cGVkZWYJdHlwZW5hbWUgcmViaW5kX3Y6OmNvbnN0X3JlZmVyZW5jZSAJY29uc3RfcmVmZXJlbmNlOworCXR5cGVkZWYJdHlwZW5hbWUgcmViaW5kX3Y6OmNvbnN0X3BvaW50ZXIJY29uc3RfcG9pbnRlcjsKKworCXR5cGVkZWYJdHlwZW5hbWUgcmViaW5kX2s6OmNvbnN0X3JlZmVyZW5jZSAJa2V5X2NvbnN0X3JlZmVyZW5jZTsKKworCXN0YXRpYyBpbmxpbmUga2V5X2NvbnN0X3JlZmVyZW5jZQorCWV4dHJhY3Rfa2V5KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCkKKwl7IHJldHVybiByX3ZhbC5maXJzdDsgfQorCisJdmlydHVhbCBpdF90eXBlCisJZW5kKCkgPSAwOworCisJaXRfdHlwZQorCWVuZF9pdGVyYXRvcigpIGNvbnN0CisJeyByZXR1cm4gY29uc3RfY2FzdDxicmFuY2hfcG9saWN5Kj4odGhpcyktPmVuZCgpOyB9CisKKwl2aXJ0dWFsCisJfmJyYW5jaF9wb2xpY3koKSB7IH0KKyAgICAgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGNvbnN0IGl0ZXJhdG9ycy4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX0NJdHIsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgIHN0cnVjdCBicmFuY2hfcG9saWN5PE5vZGVfQ0l0ciwgTm9kZV9DSXRyLCBfQWxsb2M+CisgICAgICB7CisgICAgICBwcm90ZWN0ZWQ6CisJdHlwZWRlZiB0eXBlbmFtZSBOb2RlX0NJdHI6OnZhbHVlX3R5cGUgCQkgICBpdF90eXBlOworICAgICAgIAl0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPGl0X3R5cGU+Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfY29uc3Q8dmFsdWVfdHlwZT46OnR5cGUJCSAgIHJjdmFsdWVfdHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPHJjdmFsdWVfdHlwZT46Om90aGVyIHJlYmluZF92OworCXR5cGVkZWYJdHlwZW5hbWUgcmViaW5kX3Y6OnJlZmVyZW5jZSAJCXJlZmVyZW5jZTsKKwl0eXBlZGVmCXR5cGVuYW1lIHJlYmluZF92Ojpjb25zdF9yZWZlcmVuY2UgCWNvbnN0X3JlZmVyZW5jZTsKKwl0eXBlZGVmCXR5cGVuYW1lIHJlYmluZF92Ojpjb25zdF9wb2ludGVyCWNvbnN0X3BvaW50ZXI7CisKKwl0eXBlZGVmIHZhbHVlX3R5cGUgCQkJCWtleV90eXBlOworCXR5cGVkZWYJdHlwZW5hbWUgcmViaW5kX3Y6OmNvbnN0X3JlZmVyZW5jZSAJa2V5X2NvbnN0X3JlZmVyZW5jZTsKKworCXN0YXRpYyBpbmxpbmUga2V5X2NvbnN0X3JlZmVyZW5jZQorCWV4dHJhY3Rfa2V5KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCkKKwl7IHJldHVybiByX3ZhbDsgfQorCisJdmlydHVhbCBpdF90eXBlCisJZW5kKCkgY29uc3QgPSAwOworCisJaXRfdHlwZQorCWVuZF9pdGVyYXRvcigpIGNvbnN0CisJeyByZXR1cm4gZW5kKCk7IH0KKworCXZpcnR1YWwKKwl+YnJhbmNoX3BvbGljeSgpIHsgfQorICAgICAgfTsKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX0JSQU5DSF9QT0xJQ1lfQkFTRV9IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9icmFuY2hfcG9saWN5L251bGxfbm9kZV9tZXRhZGF0YS5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYnJhbmNoX3BvbGljeS9udWxsX25vZGVfbWV0YWRhdGEuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjc2M2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYnJhbmNoX3BvbGljeS9udWxsX25vZGVfbWV0YWRhdGEuaHBwCkBAIC0wLDAgKzEsNjYgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYnJhbmNoX3BvbGljeS9udWxsX25vZGVfbWV0YWRhdGEuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgdHJlZS1saWtlIGNsYXNzZXMuCisgKi8KKworI2lmbmRlZiBQQl9EU18wX05PREVfTUVUQURBVEFfSFBQCisjZGVmaW5lIFBCX0RTXzBfTk9ERV9NRVRBREFUQV9IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZXNfdHJhaXRzLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIENvbnN0YW50IG5vZGUgaXRlcmF0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBEYXRhLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICBzdHJ1Y3QgZHVtbm9kZV9jb25zdF9pdGVyYXRvcgorICAgICAgeworICAgICAgcHJpdmF0ZToKKwl0eXBlZGVmIHR5cGVzX3RyYWl0czxLZXksIERhdGEsIF9BbGxvYywgZmFsc2U+CV9fdHJhaXRzX3R5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0c190eXBlOjpwb2ludGVyICAgICAgICAJY29uc3RfaXRlcmF0b3I7CisJCisgICAgICBwdWJsaWM6CisJdHlwZWRlZiBjb25zdF9pdGVyYXRvciAJCQkJdmFsdWVfdHlwZTsKKwl0eXBlZGVmIGNvbnN0X2l0ZXJhdG9yIAkJCQljb25zdF9yZWZlcmVuY2U7CisJdHlwZWRlZiBjb25zdF9yZWZlcmVuY2UgCSAgICAgICAJCXJlZmVyZW5jZTsKKyAgICAgIH07CisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9icmFuY2hfcG9saWN5L3RyYWl0cy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYnJhbmNoX3BvbGljeS90cmFpdHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiY2IwYzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvYnJhbmNoX3BvbGljeS90cmFpdHMuaHBwCkBAIC0wLDAgKzEsOTUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYnJhbmNoX3BvbGljeS90cmFpdHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgdHJlZS1saWtlIGNsYXNzZXMuCisgKi8KKworI2lmbmRlZiBQQl9EU19OT0RFX0FORF9JVF9UUkFJVFNfSFBQCisjZGVmaW5lIFBCX0RTX05PREVfQU5EX0lUX1RSQUlUU19IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZXNfdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3RyZWVfcG9saWN5L25vZGVfbWV0YWRhdGFfc2VsZWN0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvbm9kZV9tZXRhZGF0YV9zZWxlY3Rvci5ocHA+CisKKyNkZWZpbmUgUEJfRFNfREVCVUdfVkVSSUZZKF9Db25kKQkJCQkJXAorICBfR0xJQkNYWF9ERUJVR19WRVJJRllfQVQoX0NvbmQsCQkJCQlcCisJCQkgICBfTV9tZXNzYWdlKCNfQ29uZCIgYXNzZXJ0aW9uIGZyb20gJTE7OiUyOyIpCVwKKwkJCSAgIC5fTV9zdHJpbmcoX19GSUxFX18pLl9NX2ludGVnZXIoX19MSU5FX18pCVwKKwkJCSAgICxfX2ZpbGUsX19saW5lKQorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gVHJlZSB0cmFpdHMgY2xhc3MsIHByaW1hcnkgdGVtcGxhdGUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgICAgdHlwZW5hbWUgRGF0YSwKKwkgICAgIHR5cGVuYW1lIENtcF9GbiwKKwkgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwKKwkJICAgICAgdHlwZW5hbWUgTm9kZV9JdHIsCisJCSAgICAgIHR5cGVuYW1lIENtcF9Gbl8sCisJCSAgICAgIHR5cGVuYW1lIF9BbGxvYz4KKwkgICAgIGNsYXNzIE5vZGVfVXBkYXRlLAorCSAgICAgdHlwZW5hbWUgVGFnLAorCSAgICAgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCB0cmVlX3RyYWl0czsKKworICAgIC8vLyBUcmllIHRyYWl0cyBjbGFzcywgcHJpbWFyeSB0ZW1wbGF0ZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgICB0eXBlbmFtZSBEYXRhLAorCSAgICAgdHlwZW5hbWUgX0FUcmFpdHMsCisJICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX0NJdHIsCisJCSAgICAgIHR5cGVuYW1lIE5vZGVfSXRyLAorCQkgICAgICB0eXBlbmFtZSBfQVRyYWl0c18sCisJCSAgICAgIHR5cGVuYW1lIF9BbGxvYz4KKwkgICAgIGNsYXNzIE5vZGVfVXBkYXRlLAorCSAgICAgdHlwZW5hbWUgVGFnLAorCSAgICAgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCB0cmllX3RyYWl0czsKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL3RyYWl0cy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy90cmFpdHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL3RyYWl0cy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vdHJhaXRzLmhwcD4KKworI3VuZGVmIFBCX0RTX0RFQlVHX1ZFUklGWQorCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19OT0RFX0FORF9JVF9UUkFJVFNfSFBQCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2NjX2h0X21hcF8uaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jY19odF9tYXBfLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjA1N2ZmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jY19odF9tYXBfLmhwcApAQCAtMCwwICsxLDY3OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX3RhYmxlX21hcF8vY2NfaHRfbWFwXy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBjY19odF9tYXBfLgorICovCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY29uZF9kZWFsdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvdGFnX2FuZF90cmFpdC5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3JhbmdlZF9oYXNoX2ZuLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVzX3RyYWl0cy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2V4Y2VwdGlvbi5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9lcV9mbi9oYXNoX2VxX2ZuLmhwcD4KKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZGVidWdfbWFwX2Jhc2UuaHBwPgorI2VuZGlmCisjaWZkZWYgUEJfRFNfSFRfTUFQX1RSQUNFXworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2VuZGlmCisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19DQ19IQVNIX05BTUUgY2NfaHRfbWFwCisjZW5kaWYKKworI2lmZGVmIFBCX0RTX0RBVEFfRkFMU0VfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX0NDX0hBU0hfTkFNRSBjY19odF9zZXQKKyNlbmRpZgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIE1hcHBlZCwgdHlwZW5hbWUgSGFzaF9GbiwgXAorCSAgICAgdHlwZW5hbWUgRXFfRm4sIHR5cGVuYW1lIF9BbGxvYywgYm9vbCBTdG9yZV9IYXNoLCBcCisJICAgICB0eXBlbmFtZSBDb21iX0hhc2hfRm4sIHR5cGVuYW1lIFJlc2l6ZV9Qb2xpY3k+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIFBCX0RTX0NDX0hBU0hfTkFNRTxLZXksIE1hcHBlZCwgSGFzaF9GbiwgRXFfRm4sIF9BbGxvYywJXAorCQkgICAgIFN0b3JlX0hhc2gsIENvbWJfSGFzaF9GbiwgUmVzaXplX1BvbGljeT4KKworI2RlZmluZSBQQl9EU19IQVNIX0VRX0ZOX0NfREVDIFwKKyAgICBoYXNoX2VxX2ZuPEtleSwgRXFfRm4sIF9BbGxvYywgU3RvcmVfSGFzaD4KKworI2RlZmluZSBQQl9EU19SQU5HRURfSEFTSF9GTl9DX0RFQyBcCisgICAgcmFuZ2VkX2hhc2hfZm48S2V5LAlIYXNoX0ZuLCBfQWxsb2MsIENvbWJfSGFzaF9GbiwgU3RvcmVfSGFzaD4KKworI2RlZmluZSBQQl9EU19DQ19IQVNIX1RSQUlUU19CQVNFIFwKKyAgICB0eXBlc190cmFpdHM8S2V5LCBNYXBwZWQsIF9BbGxvYywgU3RvcmVfSGFzaD4KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjZGVmaW5lIFBCX0RTX0RFQlVHX01BUF9CQVNFX0NfREVDIFwKKyAgICBkZWJ1Z19tYXBfYmFzZTxLZXksCUVxX0ZuLCBcCisJCSAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8S2V5Pjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZT4KKyNlbmRpZgorCisKKyAgICAvKioKKyAgICAgKiAgQSBjb2xsaXNpb24tY2hhaW5pbmcgaGFzaC1iYXNlZCBjb250YWluZXIuCisgICAgICoKKyAgICAgKgorICAgICAqICBAaW5ncm91cCBoYXNoLWRldGFpbAorICAgICAqCisgICAgICogIEB0cGFyYW0gS2V5IAkgICAgCUtleSB0eXBlLgorICAgICAqCisgICAgICogIEB0cGFyYW0gTWFwcGVkIAkgICAgCU1hcCB0eXBlLgorICAgICAqCisgICAgICogIEB0cGFyYW0gSGFzaF9GbgkgICAgICAJSGFzaGluZyBmdW5jdG9yLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGlzIF9fZ251X2N4eDo6aGFzaC4KKyAgICAgKgorICAgICAqICBAdHBhcmFtIEVxX0ZuCSAgICAgIAlFcXVhbCBmdW5jdG9yLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHN0ZDo6ZXF1YWxfdG88S2V5PgorICAgICAqCisgICAgICogIEB0cGFyYW0gX0FsbG9jIAkgICAgCUFsbG9jYXRvciB0eXBlLgorICAgICAqCisgICAgICogIEB0cGFyYW0gU3RvcmVfSGFzaCAgICAJSWYga2V5IHR5cGUgc3RvcmVzIGV4dHJhIG1ldGFkYXRhLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKgorICAgICAqICBAdHBhcmFtIENvbWJfSGFzaF9GbglDb21iaW5pbmcgaGFzaCBmdW5jdG9yLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBIYXNoX0ZuIGlzIG5vdCBudWxsX3R5cGUsIHRoZW4gdGhpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0aGUgcmFuZ2VkLWhhc2ggZnVuY3Rvcjsgb3RoZXJ3aXNlLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIHRoZSByYW5nZS1oYXNoaW5nIGZ1bmN0b3IuCisgICAgICogICAgICAgICAgICAgICAgICAgIFhYWChTZWUgRGVzaWduOjpIYXNoLUJhc2VkIENvbnRhaW5lcnM6Okhhc2ggUG9saWNpZXMuKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGRpcmVjdF9tYXNrX3JhbmdlX2hhc2hpbmcuCisgICAgICoKKyAgICAgKiAgQHRwYXJhbSBSZXNpemVfUG9saWN5IAlSZXNpemVzIGhhc2guCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIGhhc2hfc3RhbmRhcmRfcmVzaXplX3BvbGljeSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgaGFzaF9leHBvbmVudGlhbF9zaXplX3BvbGljeSBhbmQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyLgorICAgICAqCisgICAgICoKKyAgICAgKiAgQmFzZXMgYXJlOiBkZXRhaWw6Omhhc2hfZXFfZm4sIFJlc2l6ZV9Qb2xpY3ksIGRldGFpbDo6cmFuZ2VkX2hhc2hfZm4sCisgICAgICogICAgICAgICAgICAgZGV0YWlsOjp0eXBlc190cmFpdHMuIChPcHRpb25hbDogZGV0YWlsOjpkZWJ1Z19tYXBfYmFzZS4pCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgICAgdHlwZW5hbWUgTWFwcGVkLAorCSAgICAgdHlwZW5hbWUgSGFzaF9GbiwKKwkgICAgIHR5cGVuYW1lIEVxX0ZuLAorCSAgICAgdHlwZW5hbWUgX0FsbG9jLAorCSAgICAgYm9vbCBTdG9yZV9IYXNoLAorCSAgICAgdHlwZW5hbWUgQ29tYl9IYXNoX0ZuLAorCSAgICAgdHlwZW5hbWUgUmVzaXplX1BvbGljeSA+CisgICAgY2xhc3MgUEJfRFNfQ0NfSEFTSF9OQU1FOgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICBwcm90ZWN0ZWQgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMsCisjZW5kaWYKKyAgICAgIHB1YmxpYyBQQl9EU19IQVNIX0VRX0ZOX0NfREVDLAorICAgICAgcHVibGljIFJlc2l6ZV9Qb2xpY3ksCisgICAgICBwdWJsaWMgUEJfRFNfUkFOR0VEX0hBU0hfRk5fQ19ERUMsCisgICAgICBwdWJsaWMgUEJfRFNfQ0NfSEFTSF9UUkFJVFNfQkFTRQorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBQQl9EU19DQ19IQVNIX1RSQUlUU19CQVNFCSAgICAgICAJdHJhaXRzX2Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb21wX2hhc2ggCWNvbXBfaGFzaDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnZhbHVlX3R5cGUgCXZhbHVlX3R5cGVfOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6cG9pbnRlciAJcG9pbnRlcl87CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXJfOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6cmVmZXJlbmNlIAlyZWZlcmVuY2VfOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZV87CisKKyAgICAgIHN0cnVjdCBlbnRyeSA6IHB1YmxpYyB0cmFpdHNfYmFzZTo6c3RvcmVkX2RhdGFfdHlwZQorICAgICAgeworCXR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPGVudHJ5Pjo6b3RoZXI6OnBvaW50ZXIgbV9wX25leHQ7CisgICAgICB9OworCisgICAgICB0eXBlZGVmIGNvbmRfZGVhbHRvcjxlbnRyeSwgX0FsbG9jPiAJY29uZF9kZWFsdG9yX3Q7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8ZW50cnk+OjpvdGhlciBlbnRyeV9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGVudHJ5X2FsbG9jYXRvcjo6cG9pbnRlciBlbnRyeV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBlbnRyeV9hbGxvY2F0b3I6OmNvbnN0X3BvaW50ZXIgY29uc3RfZW50cnlfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgZW50cnlfYWxsb2NhdG9yOjpyZWZlcmVuY2UgZW50cnlfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBlbnRyeV9hbGxvY2F0b3I6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9lbnRyeV9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8ZW50cnlfcG9pbnRlcj46Om90aGVyIGVudHJ5X3BvaW50ZXJfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBlbnRyeV9wb2ludGVyX2FsbG9jYXRvcjo6cG9pbnRlciBlbnRyeV9wb2ludGVyX2FycmF5OworCisgICAgICB0eXBlZGVmIFBCX0RTX1JBTkdFRF9IQVNIX0ZOX0NfREVDIHJhbmdlZF9oYXNoX2ZuX2Jhc2U7CisgICAgICB0eXBlZGVmIFBCX0RTX0hBU0hfRVFfRk5fQ19ERUMgaGFzaF9lcV9mbl9iYXNlOworICAgICAgdHlwZWRlZiBSZXNpemVfUG9saWN5IHJlc2l6ZV9iYXNlOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHR5cGVkZWYgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMgCWRlYnVnX2Jhc2U7CisjZW5kaWYKKworI2RlZmluZSBQQl9EU19HRU5fUE9TIHN0ZDo6cGFpcjxlbnRyeV9wb2ludGVyLCB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZT4KKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL3BvaW50X2NvbnN0X2l0ZXJhdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9wb2ludF9pdGVyYXRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvY29uc3RfaXRlcmF0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL2l0ZXJhdG9yLmhwcD4KKworI3VuZGVmIFBCX0RTX0dFTl9QT1MKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0FsbG9jIAkJCQlhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpkaWZmZXJlbmNlX3R5cGUgCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgSGFzaF9GbiAJCQkJaGFzaF9mbjsKKyAgICAgIHR5cGVkZWYgRXFfRm4gCQkJCWVxX2ZuOworICAgICAgdHlwZWRlZiBDb21iX0hhc2hfRm4gCQkJY29tYl9oYXNoX2ZuOworICAgICAgdHlwZWRlZiBSZXNpemVfUG9saWN5IAkJCXJlc2l6ZV9wb2xpY3k7CisKKyAgICAgIC8vLyBWYWx1ZSBzdG9yZXMgaGFzaCwgdHJ1ZSBvciBmYWxzZS4KKyAgICAgIGVudW0KKwl7CisJICBzdG9yZV9oYXNoID0gU3RvcmVfSGFzaAorCX07CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV90eXBlIGtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X3BvaW50ZXIga2V5X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfY29uc3RfcG9pbnRlciBrZXlfY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV9yZWZlcmVuY2Uga2V5X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV9jb25zdF9yZWZlcmVuY2Uga2V5X2NvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF90eXBlIG1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3BvaW50ZXIgbWFwcGVkX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjptYXBwZWRfY29uc3RfcG9pbnRlciBtYXBwZWRfY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF9yZWZlcmVuY2UgbWFwcGVkX3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF9jb25zdF9yZWZlcmVuY2UgbWFwcGVkX2NvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnZhbHVlX3R5cGUgCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpwb2ludGVyIAlwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6cmVmZXJlbmNlIAlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICAgICAgdHlwZWRlZiBwb2ludF9pdGVyYXRvcl8gCQkJcG9pbnRfaXRlcmF0b3I7CisjZW5kaWYKKworI2lmZGVmIFBCX0RTX0RBVEFfRkFMU0VfSU5ESUNBVE9SCisgICAgICB0eXBlZGVmIHBvaW50X2NvbnN0X2l0ZXJhdG9yXyAJCXBvaW50X2l0ZXJhdG9yOworI2VuZGlmCisKKyAgICAgIHR5cGVkZWYgcG9pbnRfY29uc3RfaXRlcmF0b3JfIAkJcG9pbnRfY29uc3RfaXRlcmF0b3I7CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICB0eXBlZGVmIGl0ZXJhdG9yXyAJCQlpdGVyYXRvcjsKKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyAgICAgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3JfIAkJCWl0ZXJhdG9yOworI2VuZGlmCisKKyAgICAgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3JfIAkJCWNvbnN0X2l0ZXJhdG9yOworCisgICAgICBQQl9EU19DQ19IQVNIX05BTUUoKTsKKworICAgICAgUEJfRFNfQ0NfSEFTSF9OQU1FKGNvbnN0IEhhc2hfRm4mKTsKKworICAgICAgUEJfRFNfQ0NfSEFTSF9OQU1FKGNvbnN0IEhhc2hfRm4mLCBjb25zdCBFcV9GbiYpOworCisgICAgICBQQl9EU19DQ19IQVNIX05BTUUoY29uc3QgSGFzaF9GbiYsIGNvbnN0IEVxX0ZuJiwgY29uc3QgQ29tYl9IYXNoX0ZuJik7CisKKyAgICAgIFBCX0RTX0NDX0hBU0hfTkFNRShjb25zdCBIYXNoX0ZuJiwgY29uc3QgRXFfRm4mLCBjb25zdCBDb21iX0hhc2hfRm4mLAorCQkgICAgICAgY29uc3QgUmVzaXplX1BvbGljeSYpOworCisgICAgICBQQl9EU19DQ19IQVNIX05BTUUoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdmlydHVhbAorICAgICAgflBCX0RTX0NDX0hBU0hfTkFNRSgpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgICAgdm9pZAorICAgICAgY29weV9mcm9tX3JhbmdlKEl0LCBJdCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGluaXRpYWxpemUoKTsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0OworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0OworCisgICAgICAvLy8gVHJ1ZSBpZiBzaXplKCkgPT0gMC4KKyAgICAgIGlubGluZSBib29sCisgICAgICBlbXB0eSgpIGNvbnN0OworCisgICAgICAvLy8gUmV0dXJuIGN1cnJlbnQgaGFzaF9mbi4KKyAgICAgIEhhc2hfRm4mCisgICAgICBnZXRfaGFzaF9mbigpOworCisgICAgICAvLy8gUmV0dXJuIGN1cnJlbnQgY29uc3QgaGFzaF9mbi4KKyAgICAgIGNvbnN0IEhhc2hfRm4mCisgICAgICBnZXRfaGFzaF9mbigpIGNvbnN0OworCisgICAgICAvLy8gUmV0dXJuIGN1cnJlbnQgZXFfZm4uCisgICAgICBFcV9GbiYKKyAgICAgIGdldF9lcV9mbigpOworCisgICAgICAvLy8gUmV0dXJuIGN1cnJlbnQgY29uc3QgZXFfZm4uCisgICAgICBjb25zdCBFcV9GbiYKKyAgICAgIGdldF9lcV9mbigpIGNvbnN0OworCisgICAgICAvLy8gUmV0dXJuIGN1cnJlbnQgY29tYl9oYXNoX2ZuLgorICAgICAgQ29tYl9IYXNoX0ZuJgorICAgICAgZ2V0X2NvbWJfaGFzaF9mbigpOworCisgICAgICAvLy8gUmV0dXJuIGN1cnJlbnQgY29uc3QgY29tYl9oYXNoX2ZuLgorICAgICAgY29uc3QgQ29tYl9IYXNoX0ZuJgorICAgICAgZ2V0X2NvbWJfaGFzaF9mbigpIGNvbnN0OworCisgICAgICAvLy8gUmV0dXJuIGN1cnJlbnQgcmVzaXplX3BvbGljeS4KKyAgICAgIFJlc2l6ZV9Qb2xpY3kmCisgICAgICBnZXRfcmVzaXplX3BvbGljeSgpOworCisgICAgICAvLy8gUmV0dXJuIGN1cnJlbnQgY29uc3QgcmVzaXplX3BvbGljeS4KKyAgICAgIGNvbnN0IFJlc2l6ZV9Qb2xpY3kmCisgICAgICBnZXRfcmVzaXplX3BvbGljeSgpIGNvbnN0OworCisgICAgICBpbmxpbmUgc3RkOjpwYWlyPHBvaW50X2l0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCkKKyAgICAgIHsgcmV0dXJuIGluc2VydF9pbXAocl92YWwsIHRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvcik7IH0KKworICAgICAgaW5saW5lIG1hcHBlZF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKKyAgICAgIHsKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisJcmV0dXJuIChzdWJzY3JpcHRfaW1wKHJfa2V5LCB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IpKTsKKyNlbHNlCisJaW5zZXJ0KHJfa2V5KTsKKwlyZXR1cm4gdHJhaXRzX2Jhc2U6OnNfbnVsbF90eXBlOworI2VuZGlmCisgICAgICB9CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgZmluZChrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIHBvaW50X2NvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGtleV9jb25zdF9yZWZlcmVuY2UpIGNvbnN0OworCisgICAgICBpbmxpbmUgcG9pbnRfaXRlcmF0b3IKKyAgICAgIGZpbmRfZW5kKCk7CisKKyAgICAgIGlubGluZSBwb2ludF9jb25zdF9pdGVyYXRvcgorICAgICAgZmluZF9lbmQoKSBjb25zdDsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVyYXNlKGtleV9jb25zdF9yZWZlcmVuY2UpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgZXJhc2VfaWYoUHJlZCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCk7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgYmVnaW4oKTsKKworICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0OworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGVuZCgpOworCisgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0OworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZChjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfSFRfTUFQX1RSQUNFXworICAgICAgdm9pZAorICAgICAgdHJhY2UoKSBjb25zdDsKKyNlbmRpZgorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIGRlYWxsb2NhdGVfYWxsKCk7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBkb19yZXNpemVfaWZfbmVlZGVkKCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBkb19yZXNpemVfaWZfbmVlZGVkX25vX3Rocm93KCk7CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZV9pbXAoc2l6ZV90eXBlKTsKKworICAgICAgdm9pZAorICAgICAgZG9fcmVzaXplKHNpemVfdHlwZSk7CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZV9pbXBfbm9fZXhjZXB0aW9ucyhzaXplX3R5cGUsIGVudHJ5X3BvaW50ZXJfYXJyYXksIHNpemVfdHlwZSk7CisKKyAgICAgIGlubGluZSBlbnRyeV9wb2ludGVyCisgICAgICByZXNpemVfaW1wX25vX2V4Y2VwdGlvbnNfcmVhc3NpZ25fcG9pbnRlcihlbnRyeV9wb2ludGVyLAorCQkJCQkJZW50cnlfcG9pbnRlcl9hcnJheSwKKwkJCQkJCWZhbHNlX3R5cGUpOworCisgICAgICBpbmxpbmUgZW50cnlfcG9pbnRlcgorICAgICAgcmVzaXplX2ltcF9ub19leGNlcHRpb25zX3JlYXNzaWduX3BvaW50ZXIoZW50cnlfcG9pbnRlciwKKwkJCQkJCWVudHJ5X3BvaW50ZXJfYXJyYXksCisJCQkJCQl0cnVlX3R5cGUpOworCisgICAgICB2b2lkCisgICAgICBkZWFsbG9jYXRlX2xpbmtzX2luX2xpc3QoZW50cnlfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSBlbnRyeV9wb2ludGVyCisgICAgICBnZXRfZW50cnkoY29uc3RfcmVmZXJlbmNlLCBmYWxzZV90eXBlKTsKKworICAgICAgaW5saW5lIGVudHJ5X3BvaW50ZXIKKyAgICAgIGdldF9lbnRyeShjb25zdF9yZWZlcmVuY2UsIHRydWVfdHlwZSk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICByZWxzX2VudHJ5KGVudHJ5X3BvaW50ZXIpOworCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICAgICAgaW5saW5lIG1hcHBlZF9yZWZlcmVuY2UKKyAgICAgIHN1YnNjcmlwdF9pbXAoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSwgZmFsc2VfdHlwZSkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZChfX0ZJTEVfXywgX19MSU5FX18pOykKKwljb25zdCBzaXplX3R5cGUgcG9zID0gcmFuZ2VkX2hhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSk7CisJZW50cnlfcG9pbnRlciBwX2UgPSBtX2VudHJpZXNbcG9zXTsKKwlyZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfc3RhcnQoKTsKKworCXdoaWxlIChwX2UgIT0gMAorCSAgICAgICAmJiAhaGFzaF9lcV9mbl9iYXNlOjpvcGVyYXRvcigpKHBfZS0+bV92YWx1ZS5maXJzdCwgcl9rZXkpKQorCSAgeworCSAgICByZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfY29sbGlzaW9uKCk7CisJICAgIHBfZSA9IHBfZS0+bV9wX25leHQ7CisJICB9CisKKwlyZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfZW5kKCk7CisJaWYgKHBfZSAhPSAwKQorCSAgeworCSAgICBQQl9EU19DSEVDS19LRVlfRVhJU1RTKHJfa2V5KQorCSAgICByZXR1cm4gKHBfZS0+bV92YWx1ZS5zZWNvbmQpOworCSAgfQorCisJUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKHJfa2V5KQorCXJldHVybiBpbnNlcnRfbmV3X2ltcCh2YWx1ZV90eXBlKHJfa2V5LCBtYXBwZWRfdHlwZSgpKSwgcG9zKS0+c2Vjb25kOworICAgICAgfQorCisgICAgICBpbmxpbmUgbWFwcGVkX3JlZmVyZW5jZQorICAgICAgc3Vic2NyaXB0X2ltcChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5LCB0cnVlX3R5cGUpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoX19GSUxFX18sIF9fTElORV9fKTspCisJY29tcF9oYXNoIHBvc19oYXNoX3BhaXIgPSByYW5nZWRfaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5KTsKKwllbnRyeV9wb2ludGVyIHBfZSA9IG1fZW50cmllc1twb3NfaGFzaF9wYWlyLmZpcnN0XTsKKwlyZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfc3RhcnQoKTsKKwl3aGlsZSAocF9lICE9IDAgJiYKKwkgICAgICAgIWhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShwX2UtPm1fdmFsdWUuZmlyc3QsIHBfZS0+bV9oYXNoLAorCQkJCQkgICAgcl9rZXksIHBvc19oYXNoX3BhaXIuc2Vjb25kKSkKKwkgIHsKKwkgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX2NvbGxpc2lvbigpOworCSAgICBwX2UgPSBwX2UtPm1fcF9uZXh0OworCSAgfQorCisJcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX2VuZCgpOworCWlmIChwX2UgIT0gMCkKKwkgIHsKKwkgICAgUEJfRFNfQ0hFQ0tfS0VZX0VYSVNUUyhyX2tleSkKKwkgICAgcmV0dXJuIHBfZS0+bV92YWx1ZS5zZWNvbmQ7CisJICB9CisKKwlQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1Qocl9rZXkpCisJcmV0dXJuIGluc2VydF9uZXdfaW1wKHZhbHVlX3R5cGUocl9rZXksIG1hcHBlZF90eXBlKCkpLAorCQkJICAgICAgcG9zX2hhc2hfcGFpciktPnNlY29uZDsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBpbmxpbmUgc3RkOjpwYWlyPHBvaW50X2l0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0X2ltcChjb25zdF9yZWZlcmVuY2UsIGZhbHNlX3R5cGUpOworCisgICAgICBpbmxpbmUgc3RkOjpwYWlyPHBvaW50X2l0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0X2ltcChjb25zdF9yZWZlcmVuY2UsIHRydWVfdHlwZSk7CisKKyAgICAgIGlubGluZSBwb2ludGVyCisgICAgICBpbnNlcnRfbmV3X2ltcChjb25zdF9yZWZlcmVuY2Ugcl92YWwsIHNpemVfdHlwZSBwb3MpCisgICAgICB7CisJaWYgKGRvX3Jlc2l6ZV9pZl9uZWVkZWQoKSkKKwkgIHBvcyA9IHJhbmdlZF9oYXNoX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHJfdmFsKSk7CisKKwkvLyBGb2xsb3dpbmcgbGluZXMgbWlnaHQgdGhyb3cgYW4gZXhjZXB0aW9uLgorCWVudHJ5X3BvaW50ZXIgcF9lID0gZ2V0X2VudHJ5KHJfdmFsLAorCQkJCSAgICAgIHRyYWl0c19iYXNlOjptX25vX3Rocm93X2NvcGllc19pbmRpY2F0b3IpOworCisJLy8gQXQgdGhpcyBwb2ludCBubyBleGNlcHRpb25zIGNhbiBiZSB0aHJvd24uCisJcF9lLT5tX3BfbmV4dCA9IG1fZW50cmllc1twb3NdOworCW1fZW50cmllc1twb3NdID0gcF9lOworCXJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0ZWQoKyttX251bV91c2VkX2UpOworCisJX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjppbnNlcnRfbmV3KFBCX0RTX1YyRihyX3ZhbCkpOykKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZChfX0ZJTEVfXywgX19MSU5FX18pOykKKwlyZXR1cm4gJnBfZS0+bV92YWx1ZTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHBvaW50ZXIKKyAgICAgIGluc2VydF9uZXdfaW1wKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgY29tcF9oYXNoJiByX3Bvc19oYXNoX3BhaXIpCisgICAgICB7CisJLy8gRm9sbG93aW5nIGxpbmVzIG1pZ2h0IHRocm93IGFuIGV4Y2VwdGlvbi4KKwlpZiAoZG9fcmVzaXplX2lmX25lZWRlZCgpKQorCSAgcl9wb3NfaGFzaF9wYWlyID0gcmFuZ2VkX2hhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocl92YWwpKTsKKworCWVudHJ5X3BvaW50ZXIgcF9lID0gZ2V0X2VudHJ5KHJfdmFsLAorCQkJCSAgICAgIHRyYWl0c19iYXNlOjptX25vX3Rocm93X2NvcGllc19pbmRpY2F0b3IpOworCisJLy8gQXQgdGhpcyBwb2ludCBubyBleGNlcHRpb25zIGNhbiBiZSB0aHJvd24uCisJcF9lLT5tX2hhc2ggPSByX3Bvc19oYXNoX3BhaXIuc2Vjb25kOworCXBfZS0+bV9wX25leHQgPSBtX2VudHJpZXNbcl9wb3NfaGFzaF9wYWlyLmZpcnN0XTsKKwltX2VudHJpZXNbcl9wb3NfaGFzaF9wYWlyLmZpcnN0XSA9IHBfZTsKKwlyZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydGVkKCsrbV9udW1fdXNlZF9lKTsKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6Omluc2VydF9uZXcoUEJfRFNfVjJGKHJfdmFsKSk7KQorCV9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCXJldHVybiAmcF9lLT5tX3ZhbHVlOworICAgICAgfQorCisgICAgICBpbmxpbmUgcG9pbnRlcgorICAgICAgZmluZF9rZXlfcG9pbnRlcihrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5LCBmYWxzZV90eXBlKQorICAgICAgeworCWVudHJ5X3BvaW50ZXIgcF9lID0gbV9lbnRyaWVzW3JhbmdlZF9oYXNoX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXkpXTsKKwlyZXNpemVfYmFzZTo6bm90aWZ5X2ZpbmRfc2VhcmNoX3N0YXJ0KCk7CisJd2hpbGUgKHBfZSAhPSAwICYmCisJICAgICAgICFoYXNoX2VxX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfZS0+bV92YWx1ZSksIHJfa2V5KSkKKwkgIHsKKwkgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9jb2xsaXNpb24oKTsKKwkgICAgcF9lID0gcF9lLT5tX3BfbmV4dDsKKwkgIH0KKworCXJlc2l6ZV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfZW5kKCk7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCWlmIChwX2UgPT0gMCkKKwkgIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChyX2tleSkKKwllbHNlCisJICBQQl9EU19DSEVDS19LRVlfRVhJU1RTKHJfa2V5KQorI2VuZGlmCisJcmV0dXJuICZwX2UtPm1fdmFsdWU7CisgICAgICB9CisKKyAgICAgIGlubGluZSBwb2ludGVyCisgICAgICBmaW5kX2tleV9wb2ludGVyKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXksIHRydWVfdHlwZSkKKyAgICAgIHsKKwljb21wX2hhc2ggcG9zX2hhc2hfcGFpciA9IHJhbmdlZF9oYXNoX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXkpOworCWVudHJ5X3BvaW50ZXIgcF9lID0gbV9lbnRyaWVzW3Bvc19oYXNoX3BhaXIuZmlyc3RdOworCXJlc2l6ZV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfc3RhcnQoKTsKKwl3aGlsZSAocF9lICE9IDAgJiYKKwkgICAgICAgIWhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwKKwkJCQkJICAgIHBfZS0+bV9oYXNoLAorCQkJCQkgICAgcl9rZXksIHBvc19oYXNoX3BhaXIuc2Vjb25kKSkKKwkgIHsKKwkgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9jb2xsaXNpb24oKTsKKwkgICAgcF9lID0gcF9lLT5tX3BfbmV4dDsKKwkgIH0KKworCXJlc2l6ZV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfZW5kKCk7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCWlmIChwX2UgPT0gMCkKKwkgIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChyX2tleSkKKwllbHNlCisJICBQQl9EU19DSEVDS19LRVlfRVhJU1RTKHJfa2V5KQorI2VuZGlmCisJcmV0dXJuICZwX2UtPm1fdmFsdWU7CisgICAgICB9CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBlcmFzZV9pbl9wb3NfaW1wKGtleV9jb25zdF9yZWZlcmVuY2UsIHNpemVfdHlwZSk7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBlcmFzZV9pbl9wb3NfaW1wKGtleV9jb25zdF9yZWZlcmVuY2UsIGNvbnN0IGNvbXBfaGFzaCYpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgZXJhc2VfZW50cnlfcG9pbnRlcihlbnRyeV9wb2ludGVyJik7CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICB2b2lkCisgICAgICBpbmNfaXRfc3RhdGUocG9pbnRlciYgcl9wX3ZhbHVlLAorCQkgICBzdGQ6OnBhaXI8ZW50cnlfcG9pbnRlciwgc2l6ZV90eXBlPiYgcl9wb3MpIGNvbnN0CisgICAgICB7CisJaW5jX2l0X3N0YXRlKChtYXBwZWRfY29uc3RfcG9pbnRlciYgKXJfcF92YWx1ZSwgcl9wb3MpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIGluY19pdF9zdGF0ZShjb25zdF9wb2ludGVyJiByX3BfdmFsdWUsCisJCSAgIHN0ZDo6cGFpcjxlbnRyeV9wb2ludGVyLCBzaXplX3R5cGU+JiByX3BvcykgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQocl9wX3ZhbHVlICE9IDApOworCXJfcG9zLmZpcnN0ID0gcl9wb3MuZmlyc3QtPm1fcF9uZXh0OworCWlmIChyX3Bvcy5maXJzdCAhPSAwKQorCSAgeworCSAgICByX3BfdmFsdWUgPSAmcl9wb3MuZmlyc3QtPm1fdmFsdWU7CisJICAgIHJldHVybjsKKwkgIH0KKworCWZvciAoKytyX3Bvcy5zZWNvbmQ7IHJfcG9zLnNlY29uZCA8IG1fbnVtX2U7ICsrcl9wb3Muc2Vjb25kKQorCSAgaWYgKG1fZW50cmllc1tyX3Bvcy5zZWNvbmRdICE9IDApCisJICAgIHsKKwkgICAgICByX3Bvcy5maXJzdCA9IG1fZW50cmllc1tyX3Bvcy5zZWNvbmRdOworCSAgICAgIHJfcF92YWx1ZSA9ICZyX3Bvcy5maXJzdC0+bV92YWx1ZTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwlyX3BfdmFsdWUgPSAwOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBnZXRfc3RhcnRfaXRfc3RhdGUocG9pbnRlciYgcl9wX3ZhbHVlLAorCQkJIHN0ZDo6cGFpcjxlbnRyeV9wb2ludGVyLCBzaXplX3R5cGU+JiByX3BvcykgY29uc3QKKyAgICAgIHsKKwlmb3IgKHJfcG9zLnNlY29uZCA9IDA7IHJfcG9zLnNlY29uZCA8IG1fbnVtX2U7ICsrcl9wb3Muc2Vjb25kKQorCSAgaWYgKG1fZW50cmllc1tyX3Bvcy5zZWNvbmRdICE9IDApCisJICAgIHsKKwkgICAgICByX3Bvcy5maXJzdCA9IG1fZW50cmllc1tyX3Bvcy5zZWNvbmRdOworCSAgICAgIHJfcF92YWx1ZSA9ICZyX3Bvcy5maXJzdC0+bV92YWx1ZTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwlyX3BfdmFsdWUgPSAwOworICAgICAgfQorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9lbnRyeV9wb2ludGVyX2FycmF5X3ZhbGlkKGNvbnN0IGVudHJ5X3BvaW50ZXJfYXJyYXksCisJCQkJICAgICAgIGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfZW50cnlfcG9pbnRlcl92YWxpZChjb25zdCBlbnRyeV9wb2ludGVyLCB0cnVlX3R5cGUsCisJCQkJIGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfZW50cnlfcG9pbnRlcl92YWxpZChjb25zdCBlbnRyeV9wb2ludGVyLCBmYWxzZV90eXBlLAorCQkJCSBjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfSFRfTUFQX1RSQUNFXworICAgICAgdm9pZAorICAgICAgdHJhY2VfbGlzdChjb25zdF9lbnRyeV9wb2ludGVyKSBjb25zdDsKKyNlbmRpZgorCisgICAgcHJpdmF0ZToKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICBmcmllbmQgY2xhc3MgaXRlcmF0b3JfOworI2VuZGlmCisKKyAgICAgIGZyaWVuZCBjbGFzcyBjb25zdF9pdGVyYXRvcl87CisKKyAgICAgIHN0YXRpYyBlbnRyeV9hbGxvY2F0b3IgCQlzX2VudHJ5X2FsbG9jYXRvcjsKKyAgICAgIHN0YXRpYyBlbnRyeV9wb2ludGVyX2FsbG9jYXRvciAJc19lbnRyeV9wb2ludGVyX2FsbG9jYXRvcjsKKyAgICAgIHN0YXRpYyBpdGVyYXRvciAJCQlzX2VuZF9pdDsKKyAgICAgIHN0YXRpYyBjb25zdF9pdGVyYXRvciAJCXNfY29uc3RfZW5kX2l0OworICAgICAgc3RhdGljIHBvaW50X2l0ZXJhdG9yIAkJc19maW5kX2VuZF9pdDsKKyAgICAgIHN0YXRpYyBwb2ludF9jb25zdF9pdGVyYXRvciAJc19jb25zdF9maW5kX2VuZF9pdDsKKworICAgICAgc2l6ZV90eXBlIAkJCW1fbnVtX2U7CisgICAgICBzaXplX3R5cGUgCQkJbV9udW1fdXNlZF9lOworICAgICAgZW50cnlfcG9pbnRlcl9hcnJheSAJCW1fZW50cmllczsKKworICAgICAgZW51bQorCXsKKwkgIHN0b3JlX2hhc2hfb2sgPSAhU3RvcmVfSGFzaAorCQkJICB8fCAhaXNfc2FtZTxIYXNoX0ZuLCBfX2dudV9wYmRzOjpudWxsX3R5cGU+Ojp2YWx1ZQorCX07CisKKyAgICAgIFBCX0RTX1NUQVRJQ19BU1NFUlQoc3RoLCBzdG9yZV9oYXNoX29rKTsKKyAgICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9lbnRyeV9saXN0X2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vcmVzaXplX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3NpemVfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3RyYWNlX2ZuX2ltcHMuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworI3VuZGVmIFBCX0RTX0hBU0hfRVFfRk5fQ19ERUMKKyN1bmRlZiBQQl9EU19SQU5HRURfSEFTSF9GTl9DX0RFQworI3VuZGVmIFBCX0RTX0NDX0hBU0hfVFJBSVRTX0JBU0UKKyN1bmRlZiBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQworI3VuZGVmIFBCX0RTX0NDX0hBU0hfTkFNRQorICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vY21wX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jbXBfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4YTIzOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vY21wX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsODMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY2NfaGFzaF90YWJsZV9tYXBfL2NtcF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyBlbnRpcmUgY29udGFpbmVyIGNvbXBhcmlzb24gcmVsYXRlZAorICogICAgZnVuY3Rpb25zLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcl9IVF9NYXBfVHlwZT4KK2Jvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK29wZXJhdG9yPT0oY29uc3QgT3RoZXJfSFRfTWFwX1R5cGUmIG90aGVyKSBjb25zdAoreyByZXR1cm4gY21wX3dpdGhfb3RoZXIob3RoZXIpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcl9NYXBfVHlwZT4KK2Jvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NtcF93aXRoX290aGVyKGNvbnN0IE90aGVyX01hcF9UeXBlJiBvdGhlcikgY29uc3QKK3sKKyAgaWYgKHNpemUoKSAhPSBvdGhlci5zaXplKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZvciAodHlwZW5hbWUgT3RoZXJfTWFwX1R5cGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gb3RoZXIuYmVnaW4oKTsKKyAgICAgICBpdCAhPSBvdGhlci5lbmQoKTsgKytpdCkKKyAgICB7CisgICAgICBrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5ID0ga2V5X2NvbnN0X3JlZmVyZW5jZShQQl9EU19WMkYoKml0KSk7CisKKyAgICAgIG1hcHBlZF9jb25zdF9wb2ludGVyIHBfbWFwcGVkX3ZhbHVlID0KKwljb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDJiA+KCp0aGlzKS4KKwlmaW5kX2tleV9wb2ludGVyKHJfa2V5LCB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IpOworCisgICAgICBpZiAocF9tYXBwZWRfdmFsdWUgPT0gMCkKKwlyZXR1cm4gZmFsc2U7CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICBpZiAocF9tYXBwZWRfdmFsdWUtPnNlY29uZCAhPSBpdC0+c2Vjb25kKQorCXJldHVybiBmYWxzZTsKKyNlbmRpZgorICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcl9IVF9NYXBfVHlwZT4KK2Jvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK29wZXJhdG9yIT0oY29uc3QgT3RoZXJfSFRfTWFwX1R5cGUmIG90aGVyKSBjb25zdAoreyByZXR1cm4gIW9wZXJhdG9yPT0ob3RoZXIpOyB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2NvbmRfa2V5X2R0b3JfZW50cnlfZGVhbHRvci5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2NvbmRfa2V5X2R0b3JfZW50cnlfZGVhbHRvci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVjZjkxMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vY29uZF9rZXlfZHRvcl9lbnRyeV9kZWFsdG9yLmhwcApAQCAtMCwwICsxLDkwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNjX2hhc2hfdGFibGVfbWFwXy9jb25kX2tleV9kdG9yX2VudHJ5X2RlYWx0b3IuaHBwCisgKiBDb250YWlucyBhIGNvbmRpdGlvbmFsIGtleSBkZXN0cnVjdG9yLCB1c2VkIGZvciBleGNlcHRpb24gaGFuZGxpbmcuCisgKi8KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIENvbmRpdGlvbmFsIGRleSBkZXN0cnVjdG9yLCBjY19oYXNoLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEhUX01hcD4KKyAgICBjbGFzcyBjb25kX2RlYWx0b3IKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBIVF9NYXA6OmVudHJ5IAkJZW50cnk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEhUX01hcDo6ZW50cnlfYWxsb2NhdG9yIAllbnRyeV9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEhUX01hcDo6a2V5X3R5cGUgCWtleV90eXBlOworCisgICAgICBjb25kX2RlYWx0b3IoZW50cnlfYWxsb2NhdG9yKiBwX2EsIGVudHJ5KiBwX2UpCisgICAgICA6IG1fcF9hKHBfYSksIG1fcF9lKHBfZSksIG1fa2V5X2Rlc3RydWN0KGZhbHNlKSwKKwltX25vX2FjdGlvbl9kZXN0cnVjdG9yKGZhbHNlKQorICAgICAgeyB9CisKKyAgICAgIGlubGluZQorICAgICAgfmNvbmRfZGVhbHRvcigpOworCisgICAgICB2b2lkCisgICAgICBzZXRfa2V5X2Rlc3RydWN0KCkKKyAgICAgIHsgbV9rZXlfZGVzdHJ1Y3QgPSB0cnVlOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHNldF9ub19hY3Rpb25fZGVzdHJ1Y3RvcigpCisgICAgICB7IG1fbm9fYWN0aW9uX2Rlc3RydWN0b3IgPSB0cnVlOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBlbnRyeV9hbGxvY2F0b3IqIGNvbnN0IAkJCW1fcF9hOworICAgICAgZW50cnkqIGNvbnN0IAkJCQltX3BfZTsKKworICAgICAgYm9vbCAJCQkJCW1fa2V5X2Rlc3RydWN0OworICAgICAgYm9vbCAJCQkJCW1fbm9fYWN0aW9uX2Rlc3RydWN0b3I7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEhUX01hcD4KKyAgICBpbmxpbmUKKyAgICBjb25kX2RlYWx0b3I8SFRfTWFwPjo6CisgICAgfmNvbmRfZGVhbHRvcigpCisgICAgeworICAgICAgaWYgKG1fbm9fYWN0aW9uX2Rlc3RydWN0b3IpCisJcmV0dXJuOworICAgICAgaWYgKG1fa2V5X2Rlc3RydWN0KQorCW1fcF9lLT5tX3ZhbHVlLmZpcnN0Ln5rZXlfdHlwZSgpOworICAgICAgbV9wX2EtPmRlYWxsb2NhdGUobV9wX2UsIDEpOworICAgIH0KKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UyZTMxMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDE5MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3IsCisgKiBhbmQgcmVsYXRlZCBmdW5jdGlvbnMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjplbnRyeV9hbGxvY2F0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjpzX2VudHJ5X2FsbG9jYXRvcjsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjplbnRyeV9wb2ludGVyX2FsbG9jYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OnNfZW50cnlfcG9pbnRlcl9hbGxvY2F0b3I7CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NvcHlfZnJvbV9yYW5nZShJdCBmaXJzdF9pdCwgSXQgbGFzdF9pdCkKK3sKKyAgd2hpbGUgKGZpcnN0X2l0ICE9IGxhc3RfaXQpCisgICAgaW5zZXJ0KCooZmlyc3RfaXQrKykpOworfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfQ0NfSEFTSF9OQU1FKCkgOgorICByYW5nZWRfaGFzaF9mbl9iYXNlKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSksCisgIG1fbnVtX2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpKSwgbV9udW1fdXNlZF9lKDApLAorICBtX2VudHJpZXMoc19lbnRyeV9wb2ludGVyX2FsbG9jYXRvci5hbGxvY2F0ZShtX251bV9lKSkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0NDX0hBU0hfTkFNRShjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4pIDoKKyAgcmFuZ2VkX2hhc2hfZm5fYmFzZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSksIHJfaGFzaF9mbiksCisgIG1fbnVtX2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpKSwgbV9udW1fdXNlZF9lKDApLAorICBtX2VudHJpZXMoc19lbnRyeV9wb2ludGVyX2FsbG9jYXRvci5hbGxvY2F0ZShtX251bV9lKSkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0NDX0hBU0hfTkFNRShjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4sIGNvbnN0IEVxX0ZuJiByX2VxX2ZuKSA6CisgIFBCX0RTX0hBU0hfRVFfRk5fQ19ERUMocl9lcV9mbiksCisgIHJhbmdlZF9oYXNoX2ZuX2Jhc2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpLCByX2hhc2hfZm4pLAorICBtX251bV9lKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSksIG1fbnVtX3VzZWRfZSgwKSwKKyAgbV9lbnRyaWVzKHNfZW50cnlfcG9pbnRlcl9hbGxvY2F0b3IuYWxsb2NhdGUobV9udW1fZSkpCit7CisgIHN0ZDo6ZmlsbChtX2VudHJpZXMsIG1fZW50cmllcyArIG1fbnVtX2UsIChlbnRyeV9wb2ludGVyKTApOworICBSZXNpemVfUG9saWN5Ojpub3RpZnlfY2xlYXJlZCgpOworICByYW5nZWRfaGFzaF9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChtX251bV9lKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19DQ19IQVNIX05BTUUoY29uc3QgSGFzaF9GbiYgcl9oYXNoX2ZuLCBjb25zdCBFcV9GbiYgcl9lcV9mbiwgCisJCSAgIGNvbnN0IENvbWJfSGFzaF9GbiYgcl9jb21iX2hhc2hfZm4pIDoKKyAgUEJfRFNfSEFTSF9FUV9GTl9DX0RFQyhyX2VxX2ZuKSwKKyAgcmFuZ2VkX2hhc2hfZm5fYmFzZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSksCisJCSAgICAgIHJfaGFzaF9mbiwgcl9jb21iX2hhc2hfZm4pLAorICBtX251bV9lKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSksIG1fbnVtX3VzZWRfZSgwKSwKKyAgbV9lbnRyaWVzKHNfZW50cnlfcG9pbnRlcl9hbGxvY2F0b3IuYWxsb2NhdGUobV9udW1fZSkpCit7CisgIGluaXRpYWxpemUoKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19DQ19IQVNIX05BTUUoY29uc3QgSGFzaF9GbiYgcl9oYXNoX2ZuLCBjb25zdCBFcV9GbiYgcl9lcV9mbiwgCisJCSAgIGNvbnN0IENvbWJfSGFzaF9GbiYgcl9jb21iX2hhc2hfZm4sIAorCQkgICBjb25zdCBSZXNpemVfUG9saWN5JiByX3Jlc2l6ZV9wb2xpY3kpIDoKKyAgUEJfRFNfSEFTSF9FUV9GTl9DX0RFQyhyX2VxX2ZuKSwKKyAgUmVzaXplX1BvbGljeShyX3Jlc2l6ZV9wb2xpY3kpLAorICByYW5nZWRfaGFzaF9mbl9iYXNlKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSwKKwkJICAgICAgcl9oYXNoX2ZuLCByX2NvbWJfaGFzaF9mbiksCisgIG1fbnVtX2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpKSwgbV9udW1fdXNlZF9lKDApLAorICBtX2VudHJpZXMoc19lbnRyeV9wb2ludGVyX2FsbG9jYXRvci5hbGxvY2F0ZShtX251bV9lKSkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0NDX0hBU0hfTkFNRShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpIDoKKyAgUEJfRFNfSEFTSF9FUV9GTl9DX0RFQyhvdGhlciksCisgIHJlc2l6ZV9iYXNlKG90aGVyKSwgcmFuZ2VkX2hhc2hfZm5fYmFzZShvdGhlciksCisgIG1fbnVtX2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpKSwgbV9udW1fdXNlZF9lKDApLAorICBtX2VudHJpZXMoc19lbnRyeV9wb2ludGVyX2FsbG9jYXRvci5hbGxvY2F0ZShtX251bV9lKSkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICBfX3RyeQorICAgICAgeworCWNvcHlfZnJvbV9yYW5nZShvdGhlci5iZWdpbigpLCBvdGhlci5lbmQoKSk7CisgICAgICB9CisgICAgX19jYXRjaCguLi4pCisgICAgICB7CisJZGVhbGxvY2F0ZV9hbGwoKTsKKwlfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICAgIH0KKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+UEJfRFNfQ0NfSEFTSF9OQU1FKCkKK3sgZGVhbGxvY2F0ZV9hbGwoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisKKyAgc3RkOjpzd2FwKG1fZW50cmllcywgb3RoZXIubV9lbnRyaWVzKTsKKyAgc3RkOjpzd2FwKG1fbnVtX2UsIG90aGVyLm1fbnVtX2UpOworICBzdGQ6OnN3YXAobV9udW1fdXNlZF9lLCBvdGhlci5tX251bV91c2VkX2UpOworICByYW5nZWRfaGFzaF9mbl9iYXNlOjpzd2FwKG90aGVyKTsKKyAgaGFzaF9lcV9mbl9iYXNlOjpzd2FwKG90aGVyKTsKKyAgcmVzaXplX2Jhc2U6OnN3YXAob3RoZXIpOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6c3dhcChvdGhlcikpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZGVhbGxvY2F0ZV9hbGwoKQoreworICBjbGVhcigpOworICBzX2VudHJ5X3BvaW50ZXJfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9lbnRyaWVzLCBtX251bV9lKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luaXRpYWxpemUoKQoreworICBzdGQ6OmZpbGwobV9lbnRyaWVzLCBtX2VudHJpZXMgKyBtX251bV9lLCBlbnRyeV9wb2ludGVyKDApKTsKKyAgUmVzaXplX1BvbGljeTo6bm90aWZ5X3Jlc2l6ZWQobV9udW1fZSk7CisgIFJlc2l6ZV9Qb2xpY3k6Om5vdGlmeV9jbGVhcmVkKCk7CisgIHJhbmdlZF9oYXNoX2ZuX2Jhc2U6Om5vdGlmeV9yZXNpemVkKG1fbnVtX2UpOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3Jfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGRhNDQyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1NSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGNvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvciwKKyAqICAgIGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NvbnN0cnVjdG9yX2luc2VydF9uZXdfaW1wKG1hcHBlZF9jb25zdF9yZWZlcmVuY2Ugcl92YWwsIHNpemVfdHlwZSBwb3MsIAorCQkJICAgZmFsc2VfdHlwZSkKK3sKKyAgLy8gRm9sbG93aW5nIGxpbmVzIG1pZ2h0IHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgZW50cnlfcG9pbnRlciBwID0gZ2V0X2VudHJ5KHJfdmFsLCB0cmFpdHNfYmFzZTo6c19ub190aHJvd19jb3BpZXNfaW5kaWNhdG9yKTsKKworICAvLyBBdCB0aGlzIHBvaW50IG5vIGV4Y2VwdGlvbnMgY2FuIGJlIHRocm93bi4KKyAgcC0+bV9wX25leHQgPSBtX2VudHJpZXNbcG9zXTsKKyAgbV9lbnRyaWVzW3Bvc10gPSBwOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6Omluc2VydF9uZXcocl9rZXkpOykKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY1NTgxMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTYgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY2NfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3Jfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3IsCisgKiBhbmQgcmVsYXRlZCBmdW5jdGlvbnMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citjb25zdHJ1Y3Rvcl9pbnNlcnRfbmV3X2ltcChjb25zdF9yZWZlcmVuY2Ugcl92YWwsIHNpemVfdHlwZSBwb3MsIHRydWVfdHlwZSkKK3sKKyAgLy8gRm9sbG93aW5nIGxpbmVzIG1pZ2h0IHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgZW50cnlfcG9pbnRlciBwID0gZ2V0X2VudHJ5KHJfdmFsLCB0cmFpdHNfYmFzZTo6c19ub190aHJvd19jb3BpZXNfaW5kaWNhdG9yKTsKKworICAvLyBBdCB0aGlzIHBvaW50IG5vIGV4Y2VwdGlvbnMgY2FuIGJlIHRocm93bi4KKyAgcC0+bV9wX25leHQgPSBtX2VudHJpZXNbcG9zXTsKKyAgcC0+bV9oYXNoID0gcmFuZ2VkX2hhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKSgoa2V5X2NvbnN0X3JlZmVyZW5jZSkoUEJfRFNfVjJGKHAtPm1fdmFsdWUpKSkuc2Vjb25kOworCisgIG1fZW50cmllc1twb3NdID0gcDsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjppbnNlcnRfbmV3KHJfa2V5KTspCit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmZiYjliCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDc2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNjX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyBkZWJ1Zy1tb2RlIGZ1bmN0aW9ucy4KKyAqLworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF92YWxpZChjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGRlYnVnX2Jhc2U6OmNoZWNrX3NpemUobV9udW1fdXNlZF9lLCBfX2ZpbGUsIF9fbGluZSk7CisgIGFzc2VydF9lbnRyeV9wb2ludGVyX2FycmF5X3ZhbGlkKG1fZW50cmllcywgX19maWxlLCBfX2xpbmUpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X2VudHJ5X3BvaW50ZXJfYXJyYXlfdmFsaWQoY29uc3QgZW50cnlfcG9pbnRlcl9hcnJheSBhX3BfZW50cmllcywKKwkJCQkgY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBzaXplX3R5cGUgaXRlcmF0ZWRfbnVtX3VzZWRfZSA9IDA7CisgIGZvciAoc2l6ZV90eXBlIHBvcyA9IDA7IHBvcyA8IG1fbnVtX2U7ICsrcG9zKQorICAgIHsKKyAgICAgIGVudHJ5X3BvaW50ZXIgcF9lID0gYV9wX2VudHJpZXNbcG9zXTsKKyAgICAgIHdoaWxlIChwX2UgIT0gMCkKKyAgICAgICAgeworCSAgKytpdGVyYXRlZF9udW1fdXNlZF9lOworCSAgYXNzZXJ0X2VudHJ5X3BvaW50ZXJfdmFsaWQocF9lLCB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IsCisJCQkJICAgICBfX2ZpbGUsIF9fbGluZSk7CisJICBwX2UgPSBwX2UtPm1fcF9uZXh0OworICAgICAgICB9CisgICAgfQorICBQQl9EU19ERUJVR19WRVJJRlkoaXRlcmF0ZWRfbnVtX3VzZWRfZSA9PSBtX251bV91c2VkX2UpOworfQorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZGVidWdfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwPgorCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2RlYnVnX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2RlYnVnX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc3NGJjMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZGVidWdfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDUwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNjX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGRlYnVnLW1vZGUgZnVuY3Rpb25zLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X2VudHJ5X3BvaW50ZXJfdmFsaWQoY29uc3QgZW50cnlfcG9pbnRlciBwLCBmYWxzZV90eXBlLAorCQkJICAgY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreyBkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKFBCX0RTX1YyRihwLT5tX3ZhbHVlKSwgX19maWxlLCBfX2xpbmUpOyB9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMjFkNjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2RlYnVnX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX3RhYmxlX21hcF8vZGVidWdfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyBkZWJ1Zy1tb2RlIGZ1bmN0aW9ucy4KKyAqLworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF9lbnRyeV9wb2ludGVyX3ZhbGlkKGNvbnN0IGVudHJ5X3BvaW50ZXIgcF9lLCB0cnVlX3R5cGUsCisJCQkgICBjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9leGlzdHMoUEJfRFNfVjJGKHBfZS0+bV92YWx1ZSksIF9fZmlsZSwgX19saW5lKTsKKyAgY29tcF9oYXNoIHBvc19oYXNoX3BhaXIgPSByYW5nZWRfaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpKTsKKyAgUEJfRFNfREVCVUdfVkVSSUZZKHBfZS0+bV9oYXNoID09IHBvc19oYXNoX3BhaXIuc2Vjb25kKTsKK30KKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9lbnRyeV9saXN0X2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9lbnRyeV9saXN0X2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OTgzYjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2VudHJ5X2xpc3RfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw5MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX3RhYmxlX21hcF8vZW50cnlfbGlzdF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyBlbnRyeS1saXN0IHJlbGF0ZWQgZnVuY3Rpb25zLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitkZWFsbG9jYXRlX2xpbmtzX2luX2xpc3QoZW50cnlfcG9pbnRlciBwX2UpCit7CisgIHdoaWxlIChwX2UgIT0gMCkKKyAgICB7CisgICAgICBlbnRyeV9wb2ludGVyIHBfZGVhbGxvY19lID0gcF9lOworICAgICAgcF9lID0gcF9lLT5tX3BfbmV4dDsKKyAgICAgIHNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF9kZWFsbG9jX2UsIDEpOworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6ZW50cnlfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2VudHJ5KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgdHJ1ZV90eXBlKQoreworICAvLyBGb2xsb3dpbmcgbGluZSBtaWdodCB0aHJvdyBhbiBleGNlcHRpb24uCisgIGVudHJ5X3BvaW50ZXIgcF9lID0gc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUoMSk7CisKKyAgLy8gRm9sbG93aW5nIGxpbmVzKiBjYW5ub3QqIHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgbmV3ICgmcF9lLT5tX3ZhbHVlKSB2YWx1ZV90eXBlKHJfdmFsKTsKKyAgcmV0dXJuIHBfZTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6ZW50cnlfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2VudHJ5KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgZmFsc2VfdHlwZSkKK3sKKyAgLy8gRm9sbG93aW5nIGxpbmUgbWlnaHQgdGhyb3cgYW4gZXhjZXB0aW9uLgorICBlbnRyeV9wb2ludGVyIHBfZSA9IHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKDEpOworICBjb25kX2RlYWx0b3JfdCBjb25kKHBfZSk7CisKKyAgLy8gRm9sbG93aW5nIGxpbmVzIG1pZ2h0IHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgbmV3ICgmcF9lLT5tX3ZhbHVlKSB2YWx1ZV90eXBlKHJfdmFsKTsKKyAgY29uZC5zZXRfbm9fYWN0aW9uKCk7CisgIHJldHVybiBwX2U7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVsc19lbnRyeShlbnRyeV9wb2ludGVyIHBfZSkKK3sKKyAgLy8gVGhlIGZvbGxvd2luZyBsaW5lcyBjYW5ub3QgdGhyb3cgZXhjZXB0aW9ucyAodW5sZXNzIGlmIGtleS1kYXRhIGR0b3JzIGRvKS4KKyAgcF9lLT5tX3ZhbHVlLn52YWx1ZV90eXBlKCk7CisgIHNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF9lLCAxKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZXJhc2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2N2VkNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZXJhc2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMDMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY2NfaGFzaF90YWJsZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGVyYXNlIHJlbGF0ZWQgZnVuY3Rpb25zLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfZW50cnlfcG9pbnRlcihlbnRyeV9wb2ludGVyJiByX3BfZSkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjplcmFzZV9leGlzdGluZyhQQl9EU19WMkYocl9wX2UtPm1fdmFsdWUpKSk7CisKKyAgZW50cnlfcG9pbnRlciBwX2UgPSByX3BfZTsKKyAgcl9wX2UgPSByX3BfZS0+bV9wX25leHQ7CisgIHJlbHNfZW50cnkocF9lKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fbnVtX3VzZWRfZSA+IDApOworICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlZCgtLW1fbnVtX3VzZWRfZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgoraW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2lmKFByZWQgcHJlZCkKK3sKKyAgc2l6ZV90eXBlIG51bV9lcnNkID0gMDsKKyAgZm9yIChzaXplX3R5cGUgcG9zID0gMDsgcG9zIDwgbV9udW1fZTsgKytwb3MpCisgICAgeworICAgICAgd2hpbGUgKG1fZW50cmllc1twb3NdICE9IDAgJiYgcHJlZChtX2VudHJpZXNbcG9zXS0+bV92YWx1ZSkpCisgICAgICAgIHsKKwkgICsrbnVtX2Vyc2Q7CisJICBlbnRyeV9wb2ludGVyIHBfbmV4dF9lID0gbV9lbnRyaWVzW3Bvc10tPm1fcF9uZXh0OworCSAgZXJhc2VfZW50cnlfcG9pbnRlcihtX2VudHJpZXNbcG9zXSk7CisJICBtX2VudHJpZXNbcG9zXSA9IHBfbmV4dF9lOworICAgICAgICB9CisKKyAgICAgIGVudHJ5X3BvaW50ZXIgcF9lID0gbV9lbnRyaWVzW3Bvc107CisgICAgICB3aGlsZSAocF9lICE9IDAgJiYgcF9lLT5tX3BfbmV4dCAhPSAwKQorICAgICAgICB7CisJICBpZiAocHJlZChwX2UtPm1fcF9uZXh0LT5tX3ZhbHVlKSkKKyAgICAgICAgICAgIHsKKwkgICAgICArK251bV9lcnNkOworCSAgICAgIGVyYXNlX2VudHJ5X3BvaW50ZXIocF9lLT5tX3BfbmV4dCk7CisgICAgICAgICAgICB9CisJICBlbHNlCisJICAgIHBfZSA9IHBfZS0+bV9wX25leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgZG9fcmVzaXplX2lmX25lZWRlZF9ub190aHJvdygpOworICByZXR1cm4gbnVtX2Vyc2Q7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcigpCit7CisgIGZvciAoc2l6ZV90eXBlIHBvcyA9IDA7IHBvcyA8IG1fbnVtX2U7ICsrcG9zKQorICAgIHdoaWxlIChtX2VudHJpZXNbcG9zXSAhPSAwKQorICAgICAgZXJhc2VfZW50cnlfcG9pbnRlcihtX2VudHJpZXNbcG9zXSk7CisgIGRvX3Jlc2l6ZV9pZl9uZWVkZWRfbm9fdGhyb3coKTsKKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9jbGVhcmVkKCk7Cit9CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2VyYXNlX3N0b3JlX2hhc2hfZm5faW1wcy5ocHA+CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZXJhc2Vfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZXJhc2Vfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDYxMDI1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTAwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNjX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGVyYXNlIHJlbGF0ZWQgZnVuY3Rpb25zLAorICogd2hlbiB0aGUgaGFzaCB2YWx1ZSBpcyBub3Qgc3RvcmVkLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2Uoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiBlcmFzZV9pbl9wb3NfaW1wKHJfa2V5LCByYW5nZWRfaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5KSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfaW5fcG9zX2ltcChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5LCBzaXplX3R5cGUgcG9zKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgZW50cnlfcG9pbnRlciBwX2UgPSBtX2VudHJpZXNbcG9zXTsKKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfc3RhcnQoKTsKKyAgaWYgKHBfZSA9PSAwKQorICAgIHsKKyAgICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX2VuZCgpOworICAgICAgUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKHJfa2V5KQorICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChoYXNoX2VxX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfZS0+bV92YWx1ZSksIHJfa2V5KSkKKyAgICB7CisgICAgICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKyAgICAgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMocl9rZXkpCisgICAgICBlcmFzZV9lbnRyeV9wb2ludGVyKG1fZW50cmllc1twb3NdKTsKKyAgICAgIGRvX3Jlc2l6ZV9pZl9uZWVkZWRfbm9fdGhyb3coKTsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgIGVudHJ5X3BvaW50ZXIgcF9uZXh0X2UgPSBwX2UtPm1fcF9uZXh0OworICAgICAgaWYgKHBfbmV4dF9lID09IDApCisJeworCSAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7CisJICBQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1Qocl9rZXkpCisJICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKwkgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIGlmIChoYXNoX2VxX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfbmV4dF9lLT5tX3ZhbHVlKSwgcl9rZXkpKQorCXsKKwkgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX2VuZCgpOworCSAgUEJfRFNfQ0hFQ0tfS0VZX0VYSVNUUyhyX2tleSkKKwkgIGVyYXNlX2VudHJ5X3BvaW50ZXIocF9lLT5tX3BfbmV4dCk7CisJICBkb19yZXNpemVfaWZfbmVlZGVkX25vX3Rocm93KCk7CisJICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX2NvbGxpc2lvbigpOworICAgICAgcF9lID0gcF9uZXh0X2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZTViNTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2VyYXNlX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw5NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX3RhYmxlX21hcF8vZXJhc2Vfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyBlcmFzZSByZWxhdGVkIGZ1bmN0aW9ucywKKyAqIHdoZW4gdGhlIGhhc2ggdmFsdWUgaXMgc3RvcmVkLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfaW5fcG9zX2ltcChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5LCBjb25zdCBjb21wX2hhc2gmIHJfcG9zX2hhc2hfcGFpcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIGVudHJ5X3BvaW50ZXIgcF9lID0gbV9lbnRyaWVzW3JfcG9zX2hhc2hfcGFpci5maXJzdF07CisgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX3N0YXJ0KCk7CisgIGlmIChwX2UgPT0gMCkKKyAgICB7CisgICAgICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKyAgICAgIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChyX2tleSkKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoaGFzaF9lcV9mbl9iYXNlOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpLCBwX2UtPm1faGFzaCwKKwkJCQkgIHJfa2V5LCByX3Bvc19oYXNoX3BhaXIuc2Vjb25kKSkKKyAgICB7CisgICAgICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKyAgICAgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMocl9rZXkpCisgICAgICBlcmFzZV9lbnRyeV9wb2ludGVyKG1fZW50cmllc1tyX3Bvc19oYXNoX3BhaXIuZmlyc3RdKTsKKyAgICAgIGRvX3Jlc2l6ZV9pZl9uZWVkZWRfbm9fdGhyb3coKTsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgIGVudHJ5X3BvaW50ZXIgcF9uZXh0X2UgPSBwX2UtPm1fcF9uZXh0OworICAgICAgaWYgKHBfbmV4dF9lID09IDApCisJeworCSAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7CisJICBQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1Qocl9rZXkpCisJICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKwkgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIGlmIChoYXNoX2VxX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfbmV4dF9lLT5tX3ZhbHVlKSwKKwkJCQkgICAgICBwX25leHRfZS0+bV9oYXNoLCByX2tleSwKKwkJCQkgICAgICByX3Bvc19oYXNoX3BhaXIuc2Vjb25kKSkKKwl7CisJICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKwkgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMocl9rZXkpCisJICBlcmFzZV9lbnRyeV9wb2ludGVyKHBfZS0+bV9wX25leHQpOworCSAgZG9fcmVzaXplX2lmX25lZWRlZF9ub190aHJvdygpOworCSAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9jb2xsaXNpb24oKTsKKyAgICAgIHBfZSA9IHBfbmV4dF9lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZmluZF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZmluZF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWVjOWI0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9maW5kX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNzEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY2NfaGFzaF90YWJsZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgZmluZCByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmV0dXJuIGZpbmRfa2V5X3BvaW50ZXIocl9rZXksIHRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvcik7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2NvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0Cit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gY29uc3RfY2FzdDxQQl9EU19DTEFTU19DX0RFQyYgPigqdGhpcykuZmluZF9rZXlfcG9pbnRlcihyX2tleSwgCisJCQkJCXRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvcik7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX2VuZCgpCit7IHJldHVybiAwOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2NvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX2VuZCgpIGNvbnN0Cit7IHJldHVybiAwOyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZmluZF9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9maW5kX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVjNGE1ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZmluZF9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNDEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY2NfaGFzaF90YWJsZV9tYXBfL2ZpbmRfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyBmaW5kIHJlbGF0ZWQgZnVuY3Rpb25zLAorICogd2hlbiB0aGUgaGFzaCB2YWx1ZSBpcyBzdG9yZWQuCisgKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9pbmZvX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9pbmZvX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMTI1ODkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2luZm9fZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMDAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY2NfaGFzaF90YWJsZV9tYXBfL2luZm9fZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgZW50aXJlIGNvbnRhaW5lciBpbmZvIHJlbGF0ZWQKKyAqIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NpemUoKSBjb25zdAoreyByZXR1cm4gbV9udW1fdXNlZF9lOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbWF4X3NpemUoKSBjb25zdAoreyByZXR1cm4gbV9lbnRyeV9hbGxvY2F0b3IubWF4X3NpemUoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VtcHR5KCkgY29uc3QKK3sgcmV0dXJuIChzaXplKCkgPT0gMCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyX0hUX01hcF9UeXBlPgorYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorb3BlcmF0b3I9PShjb25zdCBPdGhlcl9IVF9NYXBfVHlwZSYgb3RoZXIpIGNvbnN0Cit7IHJldHVybiBjbXBfd2l0aF9vdGhlcihvdGhlcik7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyX01hcF9UeXBlPgorYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY21wX3dpdGhfb3RoZXIoY29uc3QgT3RoZXJfTWFwX1R5cGUmIG90aGVyKSBjb25zdAoreworICBpZiAoc2l6ZSgpICE9IG90aGVyLnNpemUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yICh0eXBlbmFtZSBPdGhlcl9NYXBfVHlwZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBvdGhlci5iZWdpbigpOworICAgICAgIGl0ICE9IG90aGVyLmVuZCgpOyArK2l0KQorICAgIHsKKyAgICAgIGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkgPShrZXlfY29uc3RfcmVmZXJlbmNlKVBCX0RTX1YyRigqaXQpOworICAgICAgbWFwcGVkX2NvbnN0X3BvaW50ZXIgcF9tYXBwZWRfdmFsdWUgPQorCWNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMmID4oKnRoaXMpLgorCWZpbmRfa2V5X3BvaW50ZXIocl9rZXksIHRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvcik7CisKKyAgICAgIGlmIChwX21hcHBlZF92YWx1ZSA9PSAwKQorCXJldHVybiBmYWxzZTsKKworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyAgICAgIGlmIChwX21hcHBlZF92YWx1ZS0+c2Vjb25kICE9IGl0LT5zZWNvbmQpCisJcmV0dXJuIGZhbHNlOworI2VuZGlmIAorICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcl9IVF9NYXBfVHlwZT4KK2Jvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK29wZXJhdG9yIT0oY29uc3QgT3RoZXJfSFRfTWFwX1R5cGUmIG90aGVyKSBjb25zdAoreyByZXR1cm4gIW9wZXJhdG9yPT0ob3RoZXIpOyB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNjY4MTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDQzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNjX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgaW5zZXJ0IHJlbGF0ZWQgZnVuY3Rpb25zLgorICovCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcD4KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2ZDAzZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw3MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgaW5zZXJ0IHJlbGF0ZWQgZnVuY3Rpb25zLAorICogd2hlbiB0aGUgaGFzaCB2YWx1ZSBpcyBub3Qgc3RvcmVkLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgc3RkOjpwYWlyPHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvciwgYm9vbD4KK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luc2VydF9pbXAoY29uc3RfcmVmZXJlbmNlIHJfdmFsLCBmYWxzZV90eXBlKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAga2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSA9IFBCX0RTX1YyRihyX3ZhbCk7CisgIGNvbnN0IHNpemVfdHlwZSBwb3MgPSByYW5nZWRfaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5KTsKKyAgZW50cnlfcG9pbnRlciBwX2UgPSBtX2VudHJpZXNbcG9zXTsKKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX3N0YXJ0KCk7CisKKyAgd2hpbGUgKHBfZSAhPSAwICYmICFoYXNoX2VxX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfZS0+bV92YWx1ZSksIAorCQkJCQkJICAgICByX2tleSkpCisgICAgeworICAgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX2NvbGxpc2lvbigpOworICAgICAgcF9lID0gcF9lLT5tX3BfbmV4dDsKKyAgICB9CisKKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX2VuZCgpOworICBpZiAocF9lICE9IDApCisgICAgeworICAgICAgUEJfRFNfQ0hFQ0tfS0VZX0VYSVNUUyhyX2tleSkKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigmcF9lLT5tX3ZhbHVlLCBmYWxzZSk7CisgICAgfQorCisgIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChyX2tleSkKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGluc2VydF9uZXdfaW1wKHJfdmFsLCBwb3MpLCB0cnVlKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA1NjU5YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw3MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgaW5zZXJ0IHJlbGF0ZWQgZnVuY3Rpb25zLAorICogd2hlbiB0aGUgaGFzaCB2YWx1ZSBpcyBzdG9yZWQuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBzdGQ6OnBhaXI8dHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yLCBib29sPgorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5zZXJ0X2ltcChjb25zdF9yZWZlcmVuY2Ugcl92YWwsIHRydWVfdHlwZSkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIGtleV9jb25zdF9yZWZlcmVuY2Uga2V5ID0gUEJfRFNfVjJGKHJfdmFsKTsKKyAgY29tcF9oYXNoIHBvc19oYXNoX3BhaXIgPSByYW5nZWRfaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKGtleSk7CisgIGVudHJ5X3BvaW50ZXIgcF9lID0gbV9lbnRyaWVzW3Bvc19oYXNoX3BhaXIuZmlyc3RdOworICByZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfc3RhcnQoKTsKKworICB3aGlsZSAocF9lICE9IDAgJiYgIWhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwKKwkJCQkJCSAgICAgcF9lLT5tX2hhc2gsCisJCQkJCQkgICAga2V5LCBwb3NfaGFzaF9wYWlyLnNlY29uZCkpCisgICAgeworICAgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX2NvbGxpc2lvbigpOworICAgICAgcF9lID0gcF9lLT5tX3BfbmV4dDsKKyAgICB9CisKKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX2VuZCgpOworICBpZiAocF9lICE9IDApCisgICAgeworICAgICAgUEJfRFNfQ0hFQ0tfS0VZX0VYSVNUUyhrZXkpCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoJnBfZS0+bV92YWx1ZSwgZmFsc2UpOworICAgIH0KKworICBQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1Qoa2V5KQorICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaW5zZXJ0X25ld19pbXAocl92YWwsIHBvc19oYXNoX3BhaXIpLCB0cnVlKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzZkMTYwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw4MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX3RhYmxlX21hcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGl0ZXJhdG9ycyByZWxhdGVkIGZ1bmN0aW9ucywgZS5nLiwKKyAqIGJlZ2luKCkuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OnNfZW5kX2l0OworCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6c19jb25zdF9lbmRfaXQ7CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitiZWdpbigpCit7CisgIHBvaW50ZXIgcF92YWx1ZTsKKyAgc3RkOjpwYWlyPGVudHJ5X3BvaW50ZXIsIHNpemVfdHlwZT4gcG9zOworICBnZXRfc3RhcnRfaXRfc3RhdGUocF92YWx1ZSwgcG9zKTsKKyAgcmV0dXJuIGl0ZXJhdG9yKHBfdmFsdWUsIHBvcywgdGhpcyk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitlbmQoKQoreyByZXR1cm4gc19lbmRfaXQ7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JlZ2luKCkgY29uc3QKK3sKKyAgcG9pbnRlciBwX3ZhbHVlOworICBzdGQ6OnBhaXI8ZW50cnlfcG9pbnRlciwgc2l6ZV90eXBlPiBwb3M7CisgIGdldF9zdGFydF9pdF9zdGF0ZShwX3ZhbHVlLCBwb3MpOworICByZXR1cm4gY29uc3RfaXRlcmF0b3IocF92YWx1ZSwgcG9zLCB0aGlzKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VuZCgpIGNvbnN0Cit7IHJldHVybiBzX2NvbnN0X2VuZF9pdDsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwNWJhMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDg4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNjX2hhc2hfdGFibGVfbWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIHBvbGljeSBhY2Nlc3MKKyAqICAgIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworSGFzaF9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfaGFzaF9mbigpCit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQworY29uc3QgSGFzaF9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfaGFzaF9mbigpIGNvbnN0Cit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQworRXFfRm4mIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2VxX2ZuKCkKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCBFcV9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfZXFfZm4oKSBjb25zdAoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK0NvbWJfSGFzaF9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfY29tYl9oYXNoX2ZuKCkKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCBDb21iX0hhc2hfRm4mIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2NvbWJfaGFzaF9mbigpIGNvbnN0Cit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQworUmVzaXplX1BvbGljeSYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfcmVzaXplX3BvbGljeSgpCit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQworY29uc3QgUmVzaXplX1BvbGljeSYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfcmVzaXplX3BvbGljeSgpIGNvbnN0Cit7IHJldHVybiAqdGhpczsgfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2RmZWYyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMzQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY2NfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyByZXNpemUgcmVsYXRlZCBmdW5jdGlvbnMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6Citkb19yZXNpemVfaWZfbmVlZGVkKCkKK3sKKyAgaWYgKCFyZXNpemVfYmFzZTo6aXNfcmVzaXplX25lZWRlZCgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmVzaXplX2ltcChyZXNpemVfYmFzZTo6Z2V0X25ld19zaXplKG1fbnVtX2UsIG1fbnVtX3VzZWRfZSkpOworICByZXR1cm4gdHJ1ZTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2RvX3Jlc2l6ZShzaXplX3R5cGUgbGVuKQoreyByZXNpemVfaW1wKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZShsZW4pKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2RvX3Jlc2l6ZV9pZl9uZWVkZWRfbm9fdGhyb3coKQoreworICBpZiAoIXJlc2l6ZV9iYXNlOjppc19yZXNpemVfbmVlZGVkKCkpCisgICAgcmV0dXJuOworCisgIF9fdHJ5CisgICAgeworICAgICAgcmVzaXplX2ltcChyZXNpemVfYmFzZTo6Z2V0X25ld19zaXplKG1fbnVtX2UsIG1fbnVtX3VzZWRfZSkpOworICAgIH0KKyAgX19jYXRjaCguLi4pCisgICAgeyB9CisKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZXNpemVfaW1wKHNpemVfdHlwZSBuZXdfc2l6ZSkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIGlmIChuZXdfc2l6ZSA9PSBtX251bV9lKQorICAgIHJldHVybjsKKworICBjb25zdCBzaXplX3R5cGUgb2xkX3NpemUgPSBtX251bV9lOworICBlbnRyeV9wb2ludGVyX2FycmF5IGFfcF9lbnRyaWVzX3Jlc2l6ZWQ7CisKKyAgLy8gRm9sbG93aW5nIGxpbmUgbWlnaHQgdGhyb3cgYW4gZXhjZXB0aW9uLgorICByYW5nZWRfaGFzaF9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChuZXdfc2l6ZSk7CisKKyAgX190cnkKKyAgICB7CisgICAgICAvLyBGb2xsb3dpbmcgbGluZSBtaWdodCB0aHJvdyBhbiBleGNlcHRpb24uCisgICAgICBhX3BfZW50cmllc19yZXNpemVkID0gc19lbnRyeV9wb2ludGVyX2FsbG9jYXRvci5hbGxvY2F0ZShuZXdfc2l6ZSk7CisgICAgICBtX251bV9lID0gbmV3X3NpemU7CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7CisgICAgICByYW5nZWRfaGFzaF9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChvbGRfc2l6ZSk7CisgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICB9CisKKyAgLy8gQXQgdGhpcyBwb2ludCBubyBleGNlcHRpb25zIGNhbiBiZSB0aHJvd24uCisgIHJlc2l6ZV9pbXBfbm9fZXhjZXB0aW9ucyhuZXdfc2l6ZSwgYV9wX2VudHJpZXNfcmVzaXplZCwgb2xkX3NpemUpOworICBSZXNpemVfUG9saWN5Ojpub3RpZnlfcmVzaXplZChuZXdfc2l6ZSk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVzaXplX2ltcF9ub19leGNlcHRpb25zKHNpemVfdHlwZSBuZXdfc2l6ZSwgZW50cnlfcG9pbnRlcl9hcnJheSBhX3BfZW50cmllc19yZXNpemVkLCBzaXplX3R5cGUgb2xkX3NpemUpCit7CisgIHN0ZDo6ZmlsbChhX3BfZW50cmllc19yZXNpemVkLCBhX3BfZW50cmllc19yZXNpemVkICsgbV9udW1fZSwKKwkgICAgZW50cnlfcG9pbnRlcigwKSk7CisKKyAgZm9yIChzaXplX3R5cGUgcG9zID0gMDsgcG9zIDwgb2xkX3NpemU7ICsrcG9zKQorICAgIHsKKyAgICAgIGVudHJ5X3BvaW50ZXIgcF9lID0gbV9lbnRyaWVzW3Bvc107CisgICAgICB3aGlsZSAocF9lICE9IDApCisJcF9lID0gcmVzaXplX2ltcF9ub19leGNlcHRpb25zX3JlYXNzaWduX3BvaW50ZXIocF9lLCBhX3BfZW50cmllc19yZXNpemVkLCAgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsKKyAgICB9CisKKyAgbV9udW1fZSA9IG5ld19zaXplOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF9lbnRyeV9wb2ludGVyX2FycmF5X3ZhbGlkKGFfcF9lbnRyaWVzX3Jlc2l6ZWQsCisJCQkJCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fKTspCisgIHNfZW50cnlfcG9pbnRlcl9hbGxvY2F0b3IuZGVhbGxvY2F0ZShtX2VudHJpZXMsIG9sZF9zaXplKTsKKyAgbV9lbnRyaWVzID0gYV9wX2VudHJpZXNfcmVzaXplZDsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcD4KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vcmVzaXplX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE5ODJiOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vcmVzaXplX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX3RhYmxlX21hcF8vcmVzaXplX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgcmVzaXplIHJlbGF0ZWQgZnVuY3Rpb25zLCB3aGVuIHRoZQorICogaGFzaCB2YWx1ZSBpcyBub3Qgc3RvcmVkLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmVudHJ5X3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3Jlc2l6ZV9pbXBfbm9fZXhjZXB0aW9uc19yZWFzc2lnbl9wb2ludGVyKGVudHJ5X3BvaW50ZXIgcF9lLCBlbnRyeV9wb2ludGVyX2FycmF5IGFfcF9lbnRyaWVzX3Jlc2l6ZWQsIGZhbHNlX3R5cGUpCit7CisgIGNvbnN0IHNpemVfdHlwZSBoYXNoX3BvcyA9CisgICAgcmFuZ2VkX2hhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSk7CisKKyAgZW50cnlfcG9pbnRlciBjb25zdCBwX25leHRfZSA9IHBfZS0+bV9wX25leHQ7CisgIHBfZS0+bV9wX25leHQgPSBhX3BfZW50cmllc19yZXNpemVkW2hhc2hfcG9zXTsKKyAgYV9wX2VudHJpZXNfcmVzaXplZFtoYXNoX3Bvc10gPSBwX2U7CisgIHJldHVybiBwX25leHRfZTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vcmVzaXplX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YWU3ZDYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY2NfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIHJlc2l6ZSByZWxhdGVkIGZ1bmN0aW9ucywgd2hlbiB0aGUKKyAqIGhhc2ggdmFsdWUgaXMgc3RvcmVkLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmVudHJ5X3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3Jlc2l6ZV9pbXBfbm9fZXhjZXB0aW9uc19yZWFzc2lnbl9wb2ludGVyKGVudHJ5X3BvaW50ZXIgcF9lLCBlbnRyeV9wb2ludGVyX2FycmF5IGFfcF9lbnRyaWVzX3Jlc2l6ZWQsIHRydWVfdHlwZSkKK3sKKyAgY29uc3QgY29tcF9oYXNoIHBvc19oYXNoX3BhaXIgPQorICAgIHJhbmdlZF9oYXNoX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfZS0+bV92YWx1ZSksIHBfZS0+bV9oYXNoKTsKKworICBlbnRyeV9wb2ludGVyIGNvbnN0IHBfbmV4dF9lID0gcF9lLT5tX3BfbmV4dDsKKyAgcF9lLT5tX3BfbmV4dCA9IGFfcF9lbnRyaWVzX3Jlc2l6ZWRbcG9zX2hhc2hfcGFpci5maXJzdF07CisgIGFfcF9lbnRyaWVzX3Jlc2l6ZWRbcG9zX2hhc2hfcGFpci5maXJzdF0gPSBwX2U7CisgIHJldHVybiBwX25leHRfZTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vc2l6ZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vc2l6ZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmQ3ZThiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9zaXplX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY2NfaGFzaF90YWJsZV9tYXBfL3NpemVfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgZW50aXJlIGNvbnRhaW5lciBzaXplIHJlbGF0ZWQKKyAqIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NpemUoKSBjb25zdAoreyByZXR1cm4gbV9udW1fdXNlZF9lOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW1wdHkoKSBjb25zdAoreyByZXR1cm4gKHNpemUoKSA9PSAwKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK21heF9zaXplKCkgY29uc3QKK3sgcmV0dXJuIHNfZW50cnlfYWxsb2NhdG9yLm1heF9zaXplKCk7IH0KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy90cmFjZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vdHJhY2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyMWU2NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vdHJhY2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw3MiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX3RhYmxlX21hcF8vdHJhY2VfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgdHJhY2UtbW9kZSBmdW5jdGlvbnMuCisgKi8KKworI2lmZGVmIFBCX0RTX0hUX01BUF9UUkFDRV8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RyYWNlKCkgY29uc3QKK3sKKyAgc3RkOjpjZXJyIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KG1fbnVtX2UpIDw8ICIgIiAKKwkgICAgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obV9udW1fdXNlZF9lKSA8PCBzdGQ6OmVuZGw7CisKKyAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBtX251bV9lOyArK2kpCisgICAgeworICAgICAgc3RkOjpjZXJyIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGkpIDw8ICIgIjsKKyAgICAgIHRyYWNlX2xpc3QobV9lbnRyaWVzW2ldKTsKKyAgICAgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7CisgICAgfQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordHJhY2VfbGlzdChjb25zdF9lbnRyeV9wb2ludGVyIHBfbCkgY29uc3QKK3sKKyAgc2l6ZV90eXBlIGl0ZXJhdGVkX251bV91c2VkX2UgPSAwOworICB3aGlsZSAocF9sICE9IDApCisgICAgeworICAgICAgc3RkOjpjZXJyIDw8IFBCX0RTX1YyRihwX2wtPm1fdmFsdWUpIDw8ICIgIjsKKyAgICAgIHBfbCA9IHBfbC0+bV9wX25leHQ7CisgICAgfQorfQorCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY29uZF9kZWFsdG9yLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9jb25kX2RlYWx0b3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNmMxMjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY29uZF9kZWFsdG9yLmhwcApAQCAtMCwwICsxLDg0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGRldGFpbC9jb25kX2RlYWx0b3IuaHBwCisgKiBDb250YWlucyBhIGNvbmRpdGlvbmFsIGRlYWxsb2NhdG9yLgorICovCisKKyNpZm5kZWYgUEJfRFNfQ09ORF9ERUFMVE9SX0hQUAorI2RlZmluZSBQQl9EU19DT05EX0RFQUxUT1JfSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8vLyBDb25kaXRpb25hbCBkZWFsbG9jYXRlIGNvbnN0cnVjdG9yIGFyZ3VtZW50LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEVudHJ5LCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICBjbGFzcyBjb25kX2RlYWx0b3IKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPEVudHJ5PglfX3JlYmluZF9lOworCisgICAgICBwdWJsaWM6CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9lOjpvdGhlciAJCWVudHJ5X2FsbG9jYXRvcjsKKwl0eXBlZGVmIHR5cGVuYW1lIGVudHJ5X2FsbG9jYXRvcjo6cG9pbnRlciAJZW50cnlfcG9pbnRlcjsKKworCWNvbmRfZGVhbHRvcihlbnRyeV9wb2ludGVyIHBfZSkKKwk6IG1fcF9lKHBfZSksIG1fbm9fYWN0aW9uX2Rlc3RydWN0b3IoZmFsc2UpIHsgfQorCisJfmNvbmRfZGVhbHRvcigpCisJeworCSAgaWYgKG1fbm9fYWN0aW9uX2Rlc3RydWN0b3IpCisJICAgIHJldHVybjsKKwkgIHNfYWxsb2MuZGVhbGxvY2F0ZShtX3BfZSwgMSk7CisJfQorCisJdm9pZAorCXNldF9ub19hY3Rpb24oKQorCXsgbV9ub19hY3Rpb25fZGVzdHJ1Y3RvciA9IHRydWU7IH0KKworICAgICAgcHJpdmF0ZToKKwllbnRyeV9wb2ludGVyIAkJbV9wX2U7CisJYm9vbCAJCQltX25vX2FjdGlvbl9kZXN0cnVjdG9yOworCXN0YXRpYyBlbnRyeV9hbGxvY2F0b3IgCXNfYWxsb2M7CisgICAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRW50cnksIGNsYXNzIF9BbGxvYz4KKyAgICAgIHR5cGVuYW1lIGNvbmRfZGVhbHRvcjxFbnRyeSwgX0FsbG9jPjo6ZW50cnlfYWxsb2NhdG9yCisgICAgICBjb25kX2RlYWx0b3I8RW50cnksIF9BbGxvYz46OnNfYWxsb2M7CisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19DT05EX0RFQUxUT1JfSFBQCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2guaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjYzM2E4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2NvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoLmhwcApAQCAtMCwwICsxLDM1MiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjb250YWluZXJfYmFzZV9kaXNwYXRjaC5ocHAKKyAqIENvbnRhaW5zIGFzc29jaWF0aXZlIGNvbnRhaW5lciBkaXNwYXRjaGluZy4KKyAqLworCisjaWZuZGVmIFBCX0RTX0FTU09DX0NOVE5SX0JBU0VfRFNfRElTUEFUQ0hFUl9IUFAKKyNkZWZpbmUgUEJfRFNfQVNTT0NfQ05UTlJfQkFTRV9EU19ESVNQQVRDSEVSX0hQUAorCisjaW5jbHVkZSA8ZXh0L3R5cGVsaXN0Lmg+CisKKyNkZWZpbmUgUEJfRFNfQVNTRVJUX1ZBTElEKFgpCQkJCQkJXAorICBfR0xJQkNYWF9ERUJVR19PTkxZKFguYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCisjZGVmaW5lIFBCX0RTX0RFQlVHX1ZFUklGWShfQ29uZCkJCQkJCVwKKyAgX0dMSUJDWFhfREVCVUdfVkVSSUZZX0FUKF9Db25kLAkJCQkJXAorCQkJICAgX01fbWVzc2FnZSgjX0NvbmQiIGFzc2VydGlvbiBmcm9tICUxOzolMjsiKQlcCisJCQkgICAuX01fc3RyaW5nKF9fRklMRV9fKS5fTV9pbnRlZ2VyKF9fTElORV9fKQlcCisJCQkgICAsX19maWxlLF9fbGluZSkKKworI2RlZmluZSBQQl9EU19DSEVDS19LRVlfRVhJU1RTKF9LZXkpCQkJCQlcCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2V4aXN0cyhfS2V5LCBfX0ZJTEVfXywgX19MSU5FX18pOykKKworI2RlZmluZSBQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1QoX0tleSkJCQkJXAorICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9kb2VzX25vdF9leGlzdChfS2V5LAlcCisJCQkJCQkJICAgX19GSUxFX18sIF9fTElORV9fKTspCisKKyNkZWZpbmUgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19WMkYoWCkgKFgpLmZpcnN0CisjZGVmaW5lIFBCX0RTX1YyUyhYKSAoWCkuc2Vjb25kCisjZGVmaW5lIFBCX0RTX0VQMlZQKFgpJiAoKFgpLT5tX3ZhbHVlKQorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9sdV9tYXBfLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vYmluX3NlYXJjaF90cmVlXy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vcmJfdHJlZV8uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vc3BsYXlfdHJlZV8uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL292X3RyZWVfbWFwXy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vY2NfaHRfbWFwXy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZ3BfaHRfbWFwXy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcGF0X3RyaWVfLmhwcD4KKyN1bmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisjdW5kZWYgUEJfRFNfVjJGCisjdW5kZWYgUEJfRFNfVjJTCisjdW5kZWYgUEJfRFNfRVAyVlAKKworI2RlZmluZSBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19WMkYoWCkgKFgpCisjZGVmaW5lIFBCX0RTX1YyUyhYKSBNYXBwZWRfRGF0YSgpCisjZGVmaW5lIFBCX0RTX0VQMlZQKFgpJiAoKFgpLT5tX3ZhbHVlLmZpcnN0KQorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9sdV9tYXBfLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vYmluX3NlYXJjaF90cmVlXy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vcmJfdHJlZV8uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vc3BsYXlfdHJlZV8uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL292X3RyZWVfbWFwXy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vY2NfaHRfbWFwXy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZ3BfaHRfbWFwXy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcGF0X3RyaWVfLmhwcD4KKyN1bmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorI3VuZGVmIFBCX0RTX1YyRgorI3VuZGVmIFBCX0RTX1YyUworI3VuZGVmIFBCX0RTX0VQMlZQCisKKyN1bmRlZiBQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1QKKyN1bmRlZiBQQl9EU19DSEVDS19LRVlfRVhJU1RTCisjdW5kZWYgUEJfRFNfREVCVUdfVkVSSUZZCisjdW5kZWYgUEJfRFNfQVNTRVJUX1ZBTElECisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CituYW1lc3BhY2UgZGV0YWlsCit7CisgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgbGlzdC11cGRhdGUgbWFwLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIE1hcHBlZCwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBQb2xpY3lfVGw+CisgICAgc3RydWN0IGNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoPEtleSwgTWFwcGVkLCBfQWxsb2MsIGxpc3RfdXBkYXRlX3RhZywKKwkJCQkgICBQb2xpY3lfVGw+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMD4JYXQwOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDA6OnR5cGUJCQkgICAgCWF0MHQ7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMT4gCWF0MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQxOjp0eXBlCQkJICAgIAlhdDF0OworCisgICAgcHVibGljOgorICAgICAgLy8vIERpc3BhdGNoZWQgdHlwZS4KKyAgICAgIHR5cGVkZWYgbHVfbWFwPEtleSwgTWFwcGVkLCBhdDB0LCBfQWxsb2MsIGF0MXQ+CXR5cGU7CisgICAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGxpc3QtdXBkYXRlIHNldC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIFBvbGljeV9UbD4KKyAgICBzdHJ1Y3QgY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8S2V5LCBudWxsX3R5cGUsIF9BbGxvYywgbGlzdF91cGRhdGVfdGFnLAorCQkJCSAgIFBvbGljeV9UbD4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAwPglhdDA7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MDo6dHlwZQkJCSAgICAJYXQwdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAxPiAJYXQxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDE6OnR5cGUJCQkgICAgCWF0MXQ7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gRGlzcGF0Y2hlZCB0eXBlLgorICAgICAgdHlwZWRlZiBsdV9zZXQ8S2V5LCBudWxsX3R5cGUsIGF0MHQsIF9BbGxvYywgYXQxdD4gdHlwZTsKKyAgICB9OworCisgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgUEFUUklDSUEgdHJpZSBtYXAuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIFBvbGljeV9UbD4KKyAgc3RydWN0IGNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoPEtleSwgTWFwcGVkLCBfQWxsb2MsIHBhdF90cmllX3RhZywgUG9saWN5X1RsPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDE+IAlhdDE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MTo6dHlwZQkJCSAgICAJYXQxdDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgcGF0X3RyaWVfbWFwPEtleSwgTWFwcGVkLCBhdDF0LCBfQWxsb2M+IAkJdHlwZTsKKyAgICB9OworCisgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgUEFUUklDSUEgdHJpZSBzZXQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBQb2xpY3lfVGw+CisgICAgc3RydWN0IGNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoPEtleSwgbnVsbF90eXBlLCBfQWxsb2MsIHBhdF90cmllX3RhZywKKwkJCQkgICBQb2xpY3lfVGw+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMT4gCWF0MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQxOjp0eXBlCQkJICAgIAlhdDF0OworCisgICAgcHVibGljOgorICAgICAgLy8vIERpc3BhdGNoZWQgdHlwZS4KKyAgICAgIHR5cGVkZWYgcGF0X3RyaWVfc2V0PEtleSwgbnVsbF90eXBlLCBhdDF0LCBfQWxsb2M+IHR5cGU7CisgICAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIFItQiB0cmVlIG1hcC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgUG9saWN5X1RsPgorICAgIHN0cnVjdCBjb250YWluZXJfYmFzZV9kaXNwYXRjaDxLZXksIE1hcHBlZCwgX0FsbG9jLCByYl90cmVlX3RhZywgUG9saWN5X1RsPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDA+CWF0MDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQwOjp0eXBlCQkJICAgIAlhdDB0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDE+IAlhdDE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MTo6dHlwZQkJCSAgICAJYXQxdDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBEaXNwYXRjaGVkIHR5cGUuCisgICAgICB0eXBlZGVmIHJiX3RyZWVfbWFwPEtleSwgTWFwcGVkLCBhdDB0LCBhdDF0LCBfQWxsb2M+IAl0eXBlOworICAgIH07CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBSLUIgdHJlZSBzZXQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBQb2xpY3lfVGw+CisgICAgc3RydWN0IGNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoPEtleSwgbnVsbF90eXBlLCBfQWxsb2MsIHJiX3RyZWVfdGFnLAorCQkJCSAgIFBvbGljeV9UbD4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAwPglhdDA7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MDo6dHlwZQkJCSAgICAJYXQwdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAxPiAJYXQxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDE6OnR5cGUJCQkgICAgCWF0MXQ7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHJiX3RyZWVfc2V0PEtleSwgbnVsbF90eXBlLCBhdDB0LCBhdDF0LCBfQWxsb2M+IHR5cGU7CisgICAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24gc3BsYXkgdHJlZSBtYXAuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIFBvbGljeV9UbD4KKyAgc3RydWN0IGNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoPEtleSwgTWFwcGVkLCBfQWxsb2MsIHNwbGF5X3RyZWVfdGFnLAorCQkJCSAgIFBvbGljeV9UbD4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAwPglhdDA7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MDo6dHlwZQkJCSAgICAJYXQwdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAxPiAJYXQxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDE6OnR5cGUJCQkgICAgCWF0MXQ7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gRGlzcGF0Y2hlZCB0eXBlLgorICAgICAgdHlwZWRlZiBzcGxheV90cmVlX21hcDxLZXksIE1hcHBlZCwgYXQwdCwgYXQxdCwgX0FsbG9jPiAJdHlwZTsKKyAgICB9OworCisgIC8vLyBTcGVjaWFsaXphdGlvbiBzcGxheSB0cmVlIHNldC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIFBvbGljeV9UbD4KKyAgICBzdHJ1Y3QgY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8S2V5LCBudWxsX3R5cGUsIF9BbGxvYywgc3BsYXlfdHJlZV90YWcsCisJCQkJICAgUG9saWN5X1RsPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDA+CWF0MDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQwOjp0eXBlCQkJICAgIAlhdDB0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDE+IAlhdDE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MTo6dHlwZQkJCSAgICAJYXQxdDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBEaXNwYXRjaGVkIHR5cGUuCisgICAgICB0eXBlZGVmIHNwbGF5X3RyZWVfc2V0PEtleSwgbnVsbF90eXBlLCBhdDB0LCBhdDF0LCBfQWxsb2M+IHR5cGU7CisgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gb3JkZXJlZC12ZWN0b3IgdHJlZSBtYXAuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIFBvbGljeV9UbD4KKyAgICBzdHJ1Y3QgY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8S2V5LCBNYXBwZWQsIF9BbGxvYywgb3ZfdHJlZV90YWcsIFBvbGljeV9UbD4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAwPglhdDA7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MDo6dHlwZQkJCSAgICAJYXQwdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAxPiAJYXQxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDE6OnR5cGUJCQkgICAgCWF0MXQ7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gRGlzcGF0Y2hlZCB0eXBlLgorICAgICAgdHlwZWRlZiBvdl90cmVlX21hcDxLZXksIE1hcHBlZCwgYXQwdCwgYXQxdCwgX0FsbG9jPiAJdHlwZTsKKyAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBvcmRlcmVkLXZlY3RvciB0cmVlIHNldC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIFBvbGljeV9UbD4KKyAgICBzdHJ1Y3QgY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8S2V5LCBudWxsX3R5cGUsIF9BbGxvYywgb3ZfdHJlZV90YWcsCisJCQkJICAgUG9saWN5X1RsPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDA+CWF0MDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQwOjp0eXBlCQkJICAgIAlhdDB0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDE+IAlhdDE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MTo6dHlwZQkJCSAgICAJYXQxdDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBEaXNwYXRjaGVkIHR5cGUuCisgICAgICB0eXBlZGVmIG92X3RyZWVfc2V0PEtleSwgbnVsbF90eXBlLCBhdDB0LCBhdDF0LCBfQWxsb2M+IHR5cGU7CisgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gY29saXNpb24tY2hhaW5pbmcgaGFzaCBtYXAuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIFBvbGljeV9UbD4KKyAgICBzdHJ1Y3QgY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8S2V5LCBNYXBwZWQsIF9BbGxvYywgY2NfaGFzaF90YWcsIFBvbGljeV9UbD4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAwPglhdDA7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MDo6dHlwZQkJCSAgICAJYXQwdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAxPiAJYXQxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDE6OnR5cGUJCQkgICAgCWF0MXQ7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMj4JYXQyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDI6OnR5cGUJCQkgICAgCWF0MnQ7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMz4JYXQzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDM6OnR5cGUJCQkJYXQzdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCA0PiAJYXQ0OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDQ6OnR5cGUJCQkgICAgCWF0NHQ7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gRGlzcGF0Y2hlZCB0eXBlLgorICAgICAgdHlwZWRlZiBjY19odF9tYXA8S2V5LCBNYXBwZWQsIGF0MHQsIGF0MXQsIF9BbGxvYywgCisJCQlhdDN0Ojp2YWx1ZSwgYXQ0dCwgYXQydD4gCSAgICAgICAJdHlwZTsKKyAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBjb2xpc2lvbi1jaGFpbmluZyBoYXNoIHNldC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIFBvbGljeV9UbD4KKyAgICBzdHJ1Y3QgY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8S2V5LCBudWxsX3R5cGUsIF9BbGxvYywgY2NfaGFzaF90YWcsCisJCQkJICAgUG9saWN5X1RsPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDA+CWF0MDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQwOjp0eXBlCQkJICAgIAlhdDB0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDE+IAlhdDE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MTo6dHlwZQkJCSAgICAJYXQxdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAyPglhdDI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0Mjo6dHlwZQkJCSAgICAJYXQydDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAzPglhdDM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0Mzo6dHlwZQkJCQlhdDN0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDQ+IAlhdDQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0NDo6dHlwZQkJCSAgICAJYXQ0dDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBEaXNwYXRjaGVkIHR5cGUuCisgICAgICB0eXBlZGVmIGNjX2h0X3NldDxLZXksIG51bGxfdHlwZSwgYXQwdCwgYXQxdCwgX0FsbG9jLAorCQkJCSBhdDN0Ojp2YWx1ZSwgYXQ0dCwgYXQydD4gICAgCXR5cGU7CisgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZ2VuZXJhbC1wcm9iZSBoYXNoIG1hcC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgUG9saWN5X1RsPgorICAgIHN0cnVjdCBjb250YWluZXJfYmFzZV9kaXNwYXRjaDxLZXksIE1hcHBlZCwgX0FsbG9jLCBncF9oYXNoX3RhZywgUG9saWN5X1RsPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDA+CWF0MDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQwOjp0eXBlCQkJICAgIAlhdDB0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDE+IAlhdDE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MTo6dHlwZQkJCSAgICAJYXQxdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAyPglhdDI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0Mjo6dHlwZQkJCSAgICAJYXQydDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAzPglhdDM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0Mzo6dHlwZQkJCQlhdDN0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDQ+IAlhdDQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0NDo6dHlwZQkJCSAgICAJYXQ0dDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCA1PiAJYXQ1OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDU6OnR5cGUJCQkgICAgCWF0NXQ7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gRGlzcGF0Y2hlZCB0eXBlLgorICAgICAgdHlwZWRlZiBncF9odF9tYXA8S2V5LCBNYXBwZWQsIGF0MHQsIGF0MXQsIF9BbGxvYywgCisJCQlhdDN0Ojp2YWx1ZSwgYXQ0dCwgYXQ1dCwgYXQydD4gCQl0eXBlOworICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGdlbmVyYWwtcHJvYmUgaGFzaCBzZXQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBQb2xpY3lfVGw+CisgICAgc3RydWN0IGNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoPEtleSwgbnVsbF90eXBlLCBfQWxsb2MsIGdwX2hhc2hfdGFnLAorCQkJCSAgIFBvbGljeV9UbD4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAwPglhdDA7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MDo6dHlwZQkJCSAgICAJYXQwdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAxPiAJYXQxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDE6OnR5cGUJCQkgICAgCWF0MXQ7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMj4JYXQyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDI6OnR5cGUJCQkgICAgCWF0MnQ7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMz4JYXQzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDM6OnR5cGUJCQkJYXQzdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCA0PiAJYXQ0OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDQ6OnR5cGUJCQkgICAgCWF0NHQ7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgNT4gCWF0NTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQ1Ojp0eXBlCQkJICAgIAlhdDV0OworCisgICAgcHVibGljOgorICAgICAgLy8vIERpc3BhdGNoZWQgdHlwZS4KKyAgICAgIHR5cGVkZWYgZ3BfaHRfc2V0PEtleSwgbnVsbF90eXBlLCBhdDB0LCBhdDF0LCBfQWxsb2MsCisJCQlhdDN0Ojp2YWx1ZSwgYXQ0dCwgYXQ1dCwgYXQydD4JCXR5cGU7CisgIH07Cit9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZGVidWdfbWFwX2Jhc2UuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2RlYnVnX21hcF9iYXNlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmY3YWFlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2RlYnVnX21hcF9iYXNlLmhwcApAQCAtMCwwICsxLDM0OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBkZXRhaWwvZGVidWdfbWFwX2Jhc2UuaHBwCisgKiBDb250YWlucyBhIGRlYnVnLW1vZGUgYmFzZSBmb3IgYWxsIG1hcHMuCisgKi8KKworI2lmbmRlZiBQQl9EU19ERUJVR19NQVBfQkFTRV9IUFAKKyNkZWZpbmUgUEJfRFNfREVCVUdfTUFQX0JBU0VfSFBQCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8ZXh0L3Rocm93X2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8vIE5lZWQgc3RkOjpwYWlyIG9zdHJlYW0gZXh0cmFjdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICBpbmxpbmUgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vdXQsCisJICAgICAgIGNvbnN0IHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiYgcCkKKyAgICB7IHJldHVybiAoX19vdXQgPDwgJygnIDw8IHAuZmlyc3QgPDwgJywnIDw8IHAuc2Vjb25kIDw8ICcpJyk7IH0KKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBFcV9GbiwgdHlwZW5hbWUgQ29uc3RfS2V5X1JlZmVyZW5jZT4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICAgZGVidWdfbWFwX2Jhc2U8S2V5LCBFcV9GbiwgQ29uc3RfS2V5X1JlZmVyZW5jZT4KKworICAgIC8vLyBEZWJ1ZyBiYXNlIGNsYXNzLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgRXFfRm4sIHR5cGVuYW1lIENvbnN0X0tleV9SZWZlcmVuY2U+CisgICAgY2xhc3MgZGVidWdfbWFwX2Jhc2UKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgQ29uc3RfS2V5X1JlZmVyZW5jZSAJCQlrZXlfY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBzdGQ6Ol9HTElCQ1hYX1NURF9DOjpsaXN0PEtleT4gCQlrZXlfcmVwb3NpdG9yeTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUga2V5X3JlcG9zaXRvcnk6OnNpemVfdHlwZSAgICAgICAJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBrZXlfcmVwb3NpdG9yeTo6aXRlcmF0b3IJICAgICAgIAlpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUga2V5X3JlcG9zaXRvcnk6OmNvbnN0X2l0ZXJhdG9yICAJY29uc3RfaXRlcmF0b3I7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBkZWJ1Z19tYXBfYmFzZSgpOworCisgICAgICBkZWJ1Z19tYXBfYmFzZShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB+ZGVidWdfbWFwX2Jhc2UoKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGluc2VydF9uZXcoa2V5X2NvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBlcmFzZV9leGlzdGluZyhrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGNoZWNrX2tleV9leGlzdHMoa2V5X2NvbnN0X3JlZmVyZW5jZSwgY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBjaGVja19rZXlfZG9lc19ub3RfZXhpc3Qoa2V5X2NvbnN0X3JlZmVyZW5jZSwgY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBjaGVja19zaXplKHNpemVfdHlwZSwgY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ21wX0ZuPgorICAgICAgdm9pZAorICAgICAgc3BsaXQoa2V5X2NvbnN0X3JlZmVyZW5jZSwgQ21wX0ZuLCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB2b2lkCisgICAgICBqb2luKFBCX0RTX0NMQVNTX0NfREVDJiwgYm9vbCB3aXRoX2NsZWFudXAgPSB0cnVlKTsKKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBhc3NlcnRfdmFsaWQoY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGtleV9jb25zdF9yZWZlcmVuY2UpIGNvbnN0OworCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAga2V5X3JlcG9zaXRvcnkgCW1fa2V5czsKKyAgICAgIEVxX0ZuIAkJbV9lcTsKKyAgICB9OworCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgZGVidWdfbWFwX2Jhc2UoKQorICAgIHsgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGRlYnVnX21hcF9iYXNlKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKKyAgICA6IG1fa2V5cyhvdGhlci5tX2tleXMpLCBtX2VxKG90aGVyLm1fZXEpCisgICAgeyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgfmRlYnVnX21hcF9iYXNlKCkKKyAgICB7IFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKSB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGluc2VydF9uZXcoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKworICAgICAgaWYgKGZpbmQocl9rZXkpICE9IG1fa2V5cy5lbmQoKSkKKwl7CisJICBzdGQ6OmNlcnIgPDwgImluc2VydF9uZXcga2V5IGFscmVhZHkgcHJlc2VudCAiIDw8IHJfa2V5IDw8IHN0ZDo6ZW5kbDsKKwkgIHN0ZDo6YWJvcnQoKTsKKwl9CisKKyAgICAgIF9fdHJ5CisJeworCSAgbV9rZXlzLnB1c2hfYmFjayhyX2tleSk7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgc3RkOjpjZXJyIDw8ICJpbnNlcnRfbmV3ICIgPDwgcl9rZXkgPDwgc3RkOjplbmRsOworCSAgc3RkOjphYm9ydCgpOworCX0KKworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBlcmFzZV9leGlzdGluZyhrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQorICAgIHsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgaXRlcmF0b3IgaXQgPSBmaW5kKHJfa2V5KTsKKyAgICAgIGlmIChpdCA9PSBtX2tleXMuZW5kKCkpCisJeworCSAgc3RkOjpjZXJyIDw8ICJlcmFzZV9leGlzdGluZyIgPDwgcl9rZXkgPDwgc3RkOjplbmRsOworCSAgc3RkOjphYm9ydCgpOworCX0KKyAgICAgIG1fa2V5cy5lcmFzZShpdCk7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgY2xlYXIoKQorICAgIHsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgbV9rZXlzLmNsZWFyKCk7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGNoZWNrX2tleV9leGlzdHMoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSwKKwkJICAgICBjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0CisgICAgeworICAgICAgYXNzZXJ0X3ZhbGlkKF9fZmlsZSwgX19saW5lKTsKKyAgICAgIGlmIChmaW5kKHJfa2V5KSA9PSBtX2tleXMuZW5kKCkpCisJeworCSAgc3RkOjpjZXJyIDw8IF9fZmlsZSA8PCAnOicgPDwgX19saW5lIDw8ICI6IGNoZWNrX2tleV9leGlzdHMgIgorCQkgICAgPDwgcl9rZXkgPDwgc3RkOjplbmRsOworCSAgc3RkOjphYm9ydCgpOworCX0KKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGNoZWNrX2tleV9kb2VzX25vdF9leGlzdChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5LAorCQkJICAgICBjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0CisgICAgeworICAgICAgYXNzZXJ0X3ZhbGlkKF9fZmlsZSwgX19saW5lKTsKKyAgICAgIGlmIChmaW5kKHJfa2V5KSAhPSBtX2tleXMuZW5kKCkpCisJeworCSAgdXNpbmcgc3RkOjpjZXJyOworCSAgdXNpbmcgc3RkOjplbmRsOworCSAgY2VyciA8PCBfX2ZpbGUgPDwgJzonIDw8IF9fbGluZSA8PCAiOiBjaGVja19rZXlfZG9lc19ub3RfZXhpc3QgIgorCSAgICAgICA8PCByX2tleSA8PCBlbmRsOworCSAgc3RkOjphYm9ydCgpOworCX0KKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGNoZWNrX3NpemUoc2l6ZV90eXBlIHNpemUsIGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKKyAgICB7CisgICAgICBhc3NlcnRfdmFsaWQoX19maWxlLCBfX2xpbmUpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIGtleXNfc2l6ZSA9IG1fa2V5cy5zaXplKCk7CisgICAgICBpZiAoc2l6ZSAhPSBrZXlzX3NpemUpCisJeworCSAgc3RkOjpjZXJyIDw8IF9fZmlsZSA8PCAnOicgPDwgX19saW5lIDw8ICI6IGNoZWNrX3NpemUgIgorCQkgICAgPDwgc2l6ZSA8PCAiICE9ICIgPDwga2V5c19zaXplIDw8IHN0ZDo6ZW5kbDsKKwkgIHN0ZDo6YWJvcnQoKTsKKwl9CisgICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIG1fa2V5cy5zd2FwKG90aGVyLm1fa2V5cyk7CisgICAgICBzdGQ6OnN3YXAobV9lcSwgb3RoZXIubV9lcSk7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBmaW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0CisgICAgeworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICB0eXBlZGVmIGNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yX3R5cGU7CisgICAgICBmb3IgKGl0ZXJhdG9yX3R5cGUgaXQgPSBtX2tleXMuYmVnaW4oKTsgaXQgIT0gbV9rZXlzLmVuZCgpOyArK2l0KQorCWlmIChtX2VxKCppdCwgcl9rZXkpKQorCSAgcmV0dXJuIGl0OworICAgICAgcmV0dXJuIG1fa2V5cy5lbmQoKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBmaW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCisgICAgeworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBpdGVyYXRvciBpdCA9IG1fa2V5cy5iZWdpbigpOworICAgICAgd2hpbGUgKGl0ICE9IG1fa2V5cy5lbmQoKSkKKwl7CisJICBpZiAobV9lcSgqaXQsIHJfa2V5KSkKKwkgICAgcmV0dXJuIGl0OworCSAgKytpdDsKKwl9CisgICAgICByZXR1cm4gaXQ7CisgICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBhc3NlcnRfdmFsaWQoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIHByaW1lX2l0ID0gbV9rZXlzLmJlZ2luKCk7CisgICAgICB3aGlsZSAocHJpbWVfaXQgIT0gbV9rZXlzLmVuZCgpKQorCXsKKwkgIGNvbnN0X2l0ZXJhdG9yIHNlY19pdCA9IHByaW1lX2l0OworCSAgKytzZWNfaXQ7CisJICB3aGlsZSAoc2VjX2l0ICE9IG1fa2V5cy5lbmQoKSkKKwkgICAgeworCSAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWSghbV9lcSgqc2VjX2l0LCAqcHJpbWVfaXQpKTsKKwkgICAgICBQQl9EU19ERUJVR19WRVJJRlkoIW1fZXEoKnByaW1lX2l0LCAqc2VjX2l0KSk7CisJICAgICAgKytzZWNfaXQ7CisJICAgIH0KKwkgICsrcHJpbWVfaXQ7CisJfQorICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ21wX0ZuPgorICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgc3BsaXQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSwgQ21wX0ZuIGNtcF9mbiwgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQorICAgIHsKKyAgICAgIG90aGVyLmNsZWFyKCk7CisgICAgICBpdGVyYXRvciBpdCA9IG1fa2V5cy5iZWdpbigpOworICAgICAgd2hpbGUgKGl0ICE9IG1fa2V5cy5lbmQoKSkKKwlpZiAoY21wX2ZuKHJfa2V5LCAqaXQpKQorCSAgeworCSAgICBvdGhlci5pbnNlcnRfbmV3KCppdCk7CisJICAgIGl0ID0gbV9rZXlzLmVyYXNlKGl0KTsKKwkgIH0KKwllbHNlCisJICArK2l0OworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBqb2luKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlciwgYm9vbCB3aXRoX2NsZWFudXApCisgICAgeworICAgICAgaXRlcmF0b3IgaXQgPSBvdGhlci5tX2tleXMuYmVnaW4oKTsKKyAgICAgIHdoaWxlIChpdCAhPSBvdGhlci5tX2tleXMuZW5kKCkpCisJeworCSAgaW5zZXJ0X25ldygqaXQpOworCSAgaWYgKHdpdGhfY2xlYW51cCkKKwkgICAgaXQgPSBvdGhlci5tX2tleXMuZXJhc2UoaXQpOworCSAgZWxzZQorCSAgICArK2l0OworCX0KKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghd2l0aF9jbGVhbnVwIHx8IG90aGVyLm1fa2V5cy5lbXB0eSgpKTsKKyAgICB9CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9lcV9mbi9lcV9ieV9sZXNzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9lcV9mbi9lcV9ieV9sZXNzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTM1NmFlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2VxX2ZuL2VxX2J5X2xlc3MuaHBwCkBAIC0wLDAgKzEsNjkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZXFfYnlfbGVzcy5ocHAKKyAqIENvbnRhaW5zIGFuIGVxdWl2YWxlbmNlIGZ1bmN0aW9uLgorICovCisKKyNpZm5kZWYgUEJfRFNfRVFfQllfTEVTU19IUFAKKyNkZWZpbmUgUEJfRFNfRVFfQllfTEVTU19IUFAKKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlc190cmFpdHMuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gRXF1aXZhbGVuY2UgZnVuY3Rpb24uCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCBjbGFzcyBDbXBfRm4+CisgICAgc3RydWN0IGVxX2J5X2xlc3MgOiBwcml2YXRlIENtcF9GbgorICAgIHsKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgS2V5JiByX2xocywgY29uc3QgS2V5JiByX3JocykgY29uc3QKKyAgICAgIHsKKwljb25zdCBib29sIGwgPSBDbXBfRm46Om9wZXJhdG9yKCkocl9saHMsIHJfcmhzKTsKKwljb25zdCBib29sIGcgPSBDbXBfRm46Om9wZXJhdG9yKCkocl9yaHMsIHJfbGhzKTsKKwlyZXR1cm4gIShsIHx8IGcpOworICAgICAgfQorICAgIH07CisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19FUV9CWV9MRVNTX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2VxX2ZuL2hhc2hfZXFfZm4uaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2VxX2ZuL2hhc2hfZXFfZm4uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MmI4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZXFfZm4vaGFzaF9lcV9mbi5ocHAKQEAgLTAsMCArMSwxMTAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaGFzaF9lcV9mbi5ocHAKKyAqIENvbnRhaW5zIDIgZXFpdmFsZW5jZSBmdW5jdGlvbnMsIG9uZSBlbXBsb3lpbmcgYSBoYXNoIHZhbHVlLAorICogYW5kIG9uZSBpZ25vcmluZyBpdC4KKyAqLworCisjaWZuZGVmIFBCX0RTX0hBU0hfRVFfRk5fSFBQCisjZGVmaW5lIFBCX0RTX0hBU0hfRVFfRk5fSFBQCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8vLyBQcmltYXJ5IHRlbXBsYXRlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgRXFfRm4sIHR5cGVuYW1lIF9BbGxvYywgYm9vbCBTdG9yZV9IYXNoPgorICAgICAgc3RydWN0IGhhc2hfZXFfZm47CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gMSAtIFRoZSBjbGllbnQgcmVxdWVzdHMgdGhhdCBoYXNoIHZhbHVlcyBub3QgYmUgc3RvcmVkLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgRXFfRm4sIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgaGFzaF9lcV9mbjxLZXksIEVxX0ZuLCBfQWxsb2MsIGZhbHNlPiA6IHB1YmxpYyBFcV9GbgorICAgIHsKKyAgICAgIHR5cGVkZWYgRXFfRm4gCQkJCQkgICBlcV9mbl9iYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxLZXk+OjpvdGhlciBrZXlfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBrZXlfYWxsb2NhdG9yOjpjb25zdF9yZWZlcmVuY2UgCSAgIGtleV9jb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIGhhc2hfZXFfZm4oKSB7IH0KKworICAgICAgaGFzaF9lcV9mbihjb25zdCBFcV9GbiYgcl9lcV9mbikgOiBFcV9GbihyX2VxX2ZuKSB7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShrZXlfY29uc3RfcmVmZXJlbmNlIHJfbGhzX2tleSwgCisJCSBrZXlfY29uc3RfcmVmZXJlbmNlIHJfcmhzX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGVxX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9saHNfa2V5LCByX3Joc19rZXkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoY29uc3QgaGFzaF9lcV9mbiYgb3RoZXIpCisgICAgICB7IHN0ZDo6c3dhcCgoRXFfRm4mKSgqdGhpcyksIChFcV9GbiYpb3RoZXIpOyB9CisgICAgfTsKKworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIDIgLSBUaGUgY2xpZW50IHJlcXVlc3RzIHRoYXQgaGFzaCB2YWx1ZXMgYmUgc3RvcmVkLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgY2xhc3MgRXFfRm4sIGNsYXNzIF9BbGxvYz4KKyAgICBzdHJ1Y3QgaGFzaF9lcV9mbjxLZXksIEVxX0ZuLCBfQWxsb2MsIHRydWU+IDogcHVibGljIEVxX0ZuCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAJCSAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgRXFfRm4gCQkJCQkgICBlcV9mbl9iYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxLZXk+OjpvdGhlciBrZXlfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBrZXlfYWxsb2NhdG9yOjpjb25zdF9yZWZlcmVuY2UgCSAgIGtleV9jb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIGhhc2hfZXFfZm4oKSB7IH0KKworICAgICAgaGFzaF9lcV9mbihjb25zdCBFcV9GbiYgcl9lcV9mbikgOiBFcV9GbihyX2VxX2ZuKSB7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShrZXlfY29uc3RfcmVmZXJlbmNlIHJfbGhzX2tleSwgc2l6ZV90eXBlIGxoc19oYXNoLCAKKwkJIGtleV9jb25zdF9yZWZlcmVuY2Ugcl9yaHNfa2V5LCBzaXplX3R5cGUgcmhzX2hhc2gpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFlcV9mbl9iYXNlOjpvcGVyYXRvcigpKHJfbGhzX2tleSwgcl9yaHNfa2V5KSAKKwkJCSAgICAgIHx8IGxoc19oYXNoID09IHJoc19oYXNoKTsKKworCXJldHVybiAobGhzX2hhc2ggPT0gcmhzX2hhc2ggJiYgCisJCWVxX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9saHNfa2V5LCByX3Joc19rZXkpKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgc3dhcChjb25zdCBoYXNoX2VxX2ZuJiBvdGhlcikKKyAgICAgIHsgc3RkOjpzd2FwKChFcV9GbiYpKCp0aGlzKSwgKEVxX0ZuJikob3RoZXIpKTsgfQorICAgIH07CisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRjYTA3ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDIyMyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBncF9oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3IsCisgKiBhbmQgcmVsYXRlZCBmdW5jdGlvbnMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjplbnRyeV9hbGxvY2F0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjpzX2VudHJ5X2FsbG9jYXRvcjsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIEl0Pgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY29weV9mcm9tX3JhbmdlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KQoreworICB3aGlsZSAoZmlyc3RfaXQgIT0gbGFzdF9pdCkKKyAgICBpbnNlcnQoKihmaXJzdF9pdCsrKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19HUF9IQVNIX05BTUUoKSAKKzogcmFuZ2VkX3Byb2JlX2ZuX2Jhc2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpKSwKKyAgbV9udW1fZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSkpLCBtX251bV91c2VkX2UoMCksCisgIG1fZW50cmllcyhzX2VudHJ5X2FsbG9jYXRvci5hbGxvY2F0ZShtX251bV9lKSkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0dQX0hBU0hfTkFNRShjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4pICAgIAorOiByYW5nZWRfcHJvYmVfZm5fYmFzZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSksIHJfaGFzaF9mbiksCisgIG1fbnVtX2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpKSwgbV9udW1fdXNlZF9lKDApLAorICBtX2VudHJpZXMoc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUobV9udW1fZSkpCit7CisgIGluaXRpYWxpemUoKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19HUF9IQVNIX05BTUUoY29uc3QgSGFzaF9GbiYgcl9oYXNoX2ZuLCBjb25zdCBFcV9GbiYgcl9lcV9mbikgCis6IGhhc2hfZXFfZm5fYmFzZShyX2VxX2ZuKSwKKyAgcmFuZ2VkX3Byb2JlX2ZuX2Jhc2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpLCByX2hhc2hfZm4pLAorICBtX251bV9lKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSksIG1fbnVtX3VzZWRfZSgwKSwKKyAgbV9lbnRyaWVzKHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKG1fbnVtX2UpKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfR1BfSEFTSF9OQU1FKGNvbnN0IEhhc2hfRm4mIHJfaGFzaF9mbiwgY29uc3QgRXFfRm4mIHJfZXFfZm4sIAorCQkgY29uc3QgQ29tYl9Qcm9iZV9GbiYgcl9jb21iX2hhc2hfZm4pIAorOiBoYXNoX2VxX2ZuX2Jhc2Uocl9lcV9mbiksCisgIHJhbmdlZF9wcm9iZV9mbl9iYXNlKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSwKKwkJICAgICAgIHJfaGFzaF9mbiwgcl9jb21iX2hhc2hfZm4pLAorICBtX251bV9lKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSksIG1fbnVtX3VzZWRfZSgwKSwKKyAgbV9lbnRyaWVzKHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKG1fbnVtX2UpKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfR1BfSEFTSF9OQU1FKGNvbnN0IEhhc2hfRm4mIHJfaGFzaF9mbiwgY29uc3QgRXFfRm4mIHJfZXFfZm4sIAorCQkgY29uc3QgQ29tYl9Qcm9iZV9GbiYgY29tYl9oYXNoX2ZuLCBjb25zdCBQcm9iZV9GbiYgcHJvYmVyKSAKKzogaGFzaF9lcV9mbl9iYXNlKHJfZXFfZm4pLAorICByYW5nZWRfcHJvYmVfZm5fYmFzZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSksCisJCSAgICAgICByX2hhc2hfZm4sIGNvbWJfaGFzaF9mbiwgcHJvYmVyKSwKKyAgbV9udW1fZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSkpLCBtX251bV91c2VkX2UoMCksCisgIG1fZW50cmllcyhzX2VudHJ5X2FsbG9jYXRvci5hbGxvY2F0ZShtX251bV9lKSkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0dQX0hBU0hfTkFNRShjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4sIGNvbnN0IEVxX0ZuJiByX2VxX2ZuLCAKKwkJIGNvbnN0IENvbWJfUHJvYmVfRm4mIGNvbWJfaGFzaF9mbiwgY29uc3QgUHJvYmVfRm4mIHByb2JlciwgCisJCSBjb25zdCBSZXNpemVfUG9saWN5JiByX3Jlc2l6ZV9wb2xpY3kpIAorOiBoYXNoX2VxX2ZuX2Jhc2Uocl9lcV9mbiksIHJlc2l6ZV9iYXNlKHJfcmVzaXplX3BvbGljeSksCisgIHJhbmdlZF9wcm9iZV9mbl9iYXNlKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSwKKwkJICAgICAgIHJfaGFzaF9mbiwgY29tYl9oYXNoX2ZuLCBwcm9iZXIpLAorICBtX251bV9lKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSksIG1fbnVtX3VzZWRfZSgwKSwKKyAgbV9lbnRyaWVzKHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKG1fbnVtX2UpKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfR1BfSEFTSF9OQU1FKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgOgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgIGRlYnVnX2Jhc2Uob3RoZXIpLAorI2VuZGlmIAorICBoYXNoX2VxX2ZuX2Jhc2Uob3RoZXIpLAorICByZXNpemVfYmFzZShvdGhlciksCisgIHJhbmdlZF9wcm9iZV9mbl9iYXNlKG90aGVyKSwKKyAgbV9udW1fZShvdGhlci5tX251bV9lKSwKKyAgbV9udW1fdXNlZF9lKG90aGVyLm1fbnVtX3VzZWRfZSksCisgIG1fZW50cmllcyhzX2VudHJ5X2FsbG9jYXRvci5hbGxvY2F0ZShtX251bV9lKSkKK3sKKyAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBtX251bV9lOyArK2kpCisgICAgbV9lbnRyaWVzW2ldLm1fc3RhdCA9IChlbnRyeV9zdGF0dXMpZW1wdHlfZW50cnlfc3RhdHVzOworCisgIF9fdHJ5CisgICAgeworICAgICAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBtX251bV9lOyArK2kpCisgICAgICAgIHsKKwkgIG1fZW50cmllc1tpXS5tX3N0YXQgPSBvdGhlci5tX2VudHJpZXNbaV0ubV9zdGF0OworCSAgaWYgKG1fZW50cmllc1tpXS5tX3N0YXQgPT0gdmFsaWRfZW50cnlfc3RhdHVzKQorCSAgICBuZXcgKG1fZW50cmllcyArIGkpIGVudHJ5KG90aGVyLm1fZW50cmllc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgIF9fY2F0Y2goLi4uKQorICAgIHsKKyAgICAgIGRlYWxsb2NhdGVfYWxsKCk7CisgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICB9CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorflBCX0RTX0dQX0hBU0hfTkFNRSgpCit7IGRlYWxsb2NhdGVfYWxsKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICBzdGQ6OnN3YXAobV9udW1fZSwgb3RoZXIubV9udW1fZSk7CisgIHN0ZDo6c3dhcChtX251bV91c2VkX2UsIG90aGVyLm1fbnVtX3VzZWRfZSk7CisgIHN0ZDo6c3dhcChtX2VudHJpZXMsIG90aGVyLm1fZW50cmllcyk7CisgIHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpzd2FwKG90aGVyKTsKKyAgaGFzaF9lcV9mbl9iYXNlOjpzd2FwKG90aGVyKTsKKyAgcmVzaXplX2Jhc2U6OnN3YXAob3RoZXIpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OnN3YXAob3RoZXIpKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2RlYWxsb2NhdGVfYWxsKCkKK3sKKyAgY2xlYXIoKTsKKyAgZXJhc2VfYWxsX3ZhbGlkX2VudHJpZXMobV9lbnRyaWVzLCBtX251bV9lKTsKKyAgc19lbnRyeV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShtX2VudHJpZXMsIG1fbnVtX2UpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfYWxsX3ZhbGlkX2VudHJpZXMoZW50cnlfYXJyYXkgYV9lbnRyaWVzX3Jlc2l6ZWQsIHNpemVfdHlwZSBsZW4pCit7CisgIGZvciAoc2l6ZV90eXBlIHBvcyA9IDA7IHBvcyA8IGxlbjsgKytwb3MpCisgICAgeworICAgICAgZW50cnlfcG9pbnRlciBwX2UgPSAmYV9lbnRyaWVzX3Jlc2l6ZWRbcG9zXTsKKyAgICAgIGlmIChwX2UtPm1fc3RhdCA9PSB2YWxpZF9lbnRyeV9zdGF0dXMpCisJcF9lLT5tX3ZhbHVlLn52YWx1ZV90eXBlKCk7CisgICAgfQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5pdGlhbGl6ZSgpCit7CisgIFJlc2l6ZV9Qb2xpY3k6Om5vdGlmeV9yZXNpemVkKG1fbnVtX2UpOworICBSZXNpemVfUG9saWN5Ojpub3RpZnlfY2xlYXJlZCgpOworICByYW5nZWRfcHJvYmVfZm5fYmFzZTo6bm90aWZ5X3Jlc2l6ZWQobV9udW1fZSk7CisgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbV9udW1fZTsgKytpKQorICAgIG1fZW50cmllc1tpXS5tX3N0YXQgPSBlbXB0eV9lbnRyeV9zdGF0dXM7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyMzY5ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZ3BfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3Jfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3IsCisgKiAgICBhbmQgcmVsYXRlZCBmdW5jdGlvbnMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citjb25zdHJ1Y3Rvcl9pbnNlcnRfbmV3X2ltcChtYXBwZWRfY29uc3RfcmVmZXJlbmNlIHJfdmFsLCBzaXplX3R5cGUgcG9zLCAKKwkJCSAgIGZhbHNlX3R5cGUpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX2VudHJpZXNbcG9zXS5tX3N0YXQgIT0gdmFsaWRfZW50cnlfc3RhdHVzKWs7CisgIGVudHJ5KiBjb25zdCBwX2UgPSBtX2VudHJpZXMgKyBwb3M7CisgIG5ldyAoJnBfZS0+bV92YWx1ZSkgbWFwcGVkX3ZhbHVlX3R5cGUocl92YWwpOworICBwX2UtPm1fc3RhdCA9IHZhbGlkX2VudHJ5X3N0YXR1czsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjppbnNlcnRfbmV3KHBfZS0+bV92YWx1ZS5maXJzdCk7KQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3Jfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjcyN2QyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBncF9oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIGNvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvciwKKyAqIGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NvbnN0cnVjdG9yX2luc2VydF9uZXdfaW1wKG1hcHBlZF9jb25zdF9yZWZlcmVuY2Ugcl92YWwsIHNpemVfdHlwZSBwb3MsIAorCQkJICAgdHJ1ZV90eXBlKQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9lbnRyaWVzW3Bvc10ubV9zdGF0ICE9IHZhbGlkX2VudHJ5X3N0YXR1cyk7CisgIGVudHJ5KiBjb25zdCBwX2UgPSBtX2VudHJpZXMgKyBwb3M7CisgIG5ldyAoJnBfZS0+bV92YWx1ZSkgbWFwcGVkX3ZhbHVlX3R5cGUocl92YWwpOworICBwX2UtPm1faGFzaCA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKFBCX0RTX1YyRihyX3ZhbCkpLnNlY29uZDsKKyAgcF9lLT5tX3N0YXQgPSB2YWxpZF9lbnRyeV9zdGF0dXM7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6aW5zZXJ0X25ldyhwX2UtPm1fdmFsdWUuZmlyc3QpOykKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZGVidWdfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MWJjNTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTYgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZ3BfaGFzaF90YWJsZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIGRlYnVnLW1vZGUgZnVuY3Rpb25zLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgZGVidWdfYmFzZTo6Y2hlY2tfc2l6ZShtX251bV91c2VkX2UsIF9fZmlsZSwgX19saW5lKTsKKyAgYXNzZXJ0X2VudHJ5X2FycmF5X3ZhbGlkKG1fZW50cmllcywgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yLAorCQkJICAgX19maWxlLCBfX2xpbmUpOworfQorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZGVidWdfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwPgorCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2RlYnVnX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2RlYnVnX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyYzhlMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZGVidWdfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDcyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGdwX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIGRlYnVnLW1vZGUgZnVuY3Rpb25zLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X2VudHJ5X2FycmF5X3ZhbGlkKGNvbnN0IGVudHJ5X2FycmF5IGFfZW50cmllcywgZmFsc2VfdHlwZSwKKwkJCSBjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIHNpemVfdHlwZSBpdGVyYXRlZF9udW1fdXNlZF9lID0gMDsKKyAgZm9yIChzaXplX3R5cGUgcG9zID0gMDsgcG9zIDwgbV9udW1fZTsgKytwb3MpCisgICAgeworICAgICAgY29uc3RfZW50cnlfcG9pbnRlciBwX2UgPSAmYV9lbnRyaWVzW3Bvc107CisgICAgICBzd2l0Y2gocF9lLT5tX3N0YXQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBlbXB0eV9lbnRyeV9zdGF0dXM6CisgICAgICAgIGNhc2UgZXJhc2VkX2VudHJ5X3N0YXR1czoKKwkgIGJyZWFrOworICAgICAgICBjYXNlIHZhbGlkX2VudHJ5X3N0YXR1czoKKwkgIHsKKwkgICAga2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSA9IFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpOworCSAgICBkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKHJfa2V5LCBfX2ZpbGUsIF9fbGluZSk7CisJICAgICsraXRlcmF0ZWRfbnVtX3VzZWRfZTsKKwkgICAgYnJlYWs7CisJICB9CisgICAgICAgIGRlZmF1bHQ6CisJICBQQl9EU19ERUJVR19WRVJJRlkoMCk7CisgICAgICAgIH07CisgICAgfQorICBQQl9EU19ERUJVR19WRVJJRlkoaXRlcmF0ZWRfbnVtX3VzZWRfZSA9PSBtX251bV91c2VkX2UpOworfQorCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2RlYnVnX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2RlYnVnX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1NTZhOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZGVidWdfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDc4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGdwX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIGRlYnVnLW1vZGUgZnVuY3Rpb25zLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X2VudHJ5X2FycmF5X3ZhbGlkKGNvbnN0IGVudHJ5X2FycmF5IGFfZW50cmllcywgdHJ1ZV90eXBlLAorCQkJIGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgc2l6ZV90eXBlIGl0ZXJhdGVkX251bV91c2VkX2UgPSAwOworCisgIGZvciAoc2l6ZV90eXBlIHBvcyA9IDA7IHBvcyA8IG1fbnVtX2U7ICsrcG9zKQorICAgIHsKKyAgICAgIGNvbnN0X2VudHJ5X3BvaW50ZXIgcF9lID0mIGFfZW50cmllc1twb3NdOworICAgICAgc3dpdGNoKHBfZS0+bV9zdGF0KQorICAgICAgICB7CisgICAgICAgIGNhc2UgZW1wdHlfZW50cnlfc3RhdHVzOgorICAgICAgICBjYXNlIGVyYXNlZF9lbnRyeV9zdGF0dXM6CisJICBicmVhazsKKyAgICAgICAgY2FzZSB2YWxpZF9lbnRyeV9zdGF0dXM6CisJICB7CisJICAgIGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkgPSBQQl9EU19WMkYocF9lLT5tX3ZhbHVlKTsKKwkgICAgZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2V4aXN0cyhyX2tleSwgX19maWxlLCBfX2xpbmUpOworCisJICAgIGNvbnN0IGNvbXBfaGFzaCBwb3NfaGFzaF9wYWlyID0gcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXkpOworCisJICAgIFBCX0RTX0RFQlVHX1ZFUklGWShwX2UtPm1faGFzaCA9PSBwb3NfaGFzaF9wYWlyLnNlY29uZCk7CisJICAgICsraXRlcmF0ZWRfbnVtX3VzZWRfZTsKKwkgICAgYnJlYWs7CisJICB9CisgICAgICAgIGRlZmF1bHQ6CisJICBQQl9EU19ERUJVR19WRVJJRlkoMCk7CisgICAgICAgIH07CisgICAgfQorCisgIFBCX0RTX0RFQlVHX1ZFUklGWShpdGVyYXRlZF9udW1fdXNlZF9lID09IG1fbnVtX3VzZWRfZSk7Cit9CisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZXJhc2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmY2Y2ZmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTAwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGdwX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyBlcmFzZSByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2VudHJ5KGVudHJ5X3BvaW50ZXIgcF9lKQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9lLT5tX3N0YXQgPSB2YWxpZF9lbnRyeV9zdGF0dXMpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmVyYXNlX2V4aXN0aW5nKFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpKTspCisgIHBfZS0+bV92YWx1ZS5+dmFsdWVfdHlwZSgpOworICBwX2UtPm1fc3RhdCA9IGVyYXNlZF9lbnRyeV9zdGF0dXM7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX251bV91c2VkX2UgPiAwKTsKKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZWQoLS1tX251bV91c2VkX2UpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY2xlYXIoKQoreworICBmb3IgKHNpemVfdHlwZSBwb3MgPSAwOyBwb3MgPCBtX251bV9lOyArK3BvcykKKyAgICB7CisgICAgICBlbnRyeV9wb2ludGVyIHBfZSA9ICZtX2VudHJpZXNbcG9zXTsKKyAgICAgIGlmIChwX2UtPm1fc3RhdCA9PSB2YWxpZF9lbnRyeV9zdGF0dXMpCisJZXJhc2VfZW50cnkocF9lKTsKKyAgICB9CisgIGRvX3Jlc2l6ZV9pZl9uZWVkZWRfbm9fdGhyb3coKTsKKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9jbGVhcmVkKCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgoraW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2lmKFByZWQgcHJlZCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHNpemVfdHlwZSBudW1fZXJzZCA9IDA7CisgIGZvciAoc2l6ZV90eXBlIHBvcyA9IDA7IHBvcyA8IG1fbnVtX2U7ICsrcG9zKQorICAgIHsKKyAgICAgIGVudHJ5X3BvaW50ZXIgcF9lID0gJm1fZW50cmllc1twb3NdOworICAgICAgaWYgKHBfZS0+bV9zdGF0ID09IHZhbGlkX2VudHJ5X3N0YXR1cykKKwlpZiAocHJlZChwX2UtPm1fdmFsdWUpKQorCSAgeworCSAgICArK251bV9lcnNkOworCSAgICBlcmFzZV9lbnRyeShwX2UpOworCSAgfQorICAgIH0KKworICBkb19yZXNpemVfaWZfbmVlZGVkX25vX3Rocm93KCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gbnVtX2Vyc2Q7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2Uoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKK3sgcmV0dXJuIGVyYXNlX2ltcChyX2tleSwgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsgfQorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZXJhc2Vfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczY2VmMTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2VyYXNlX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw4NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBncF9oYXNoX3RhYmxlX21hcF8vZXJhc2Vfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyBlcmFzZSByZWxhdGVkIGZ1bmN0aW9ucywKKyAqIHdoZW4gdGhlIGhhc2ggdmFsdWUgaXMgbm90IHN0b3JlZC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2ltcChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5LCAgZmFsc2VfdHlwZSkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHNpemVfdHlwZSBoYXNoID0gcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXkpOworICBzaXplX3R5cGUgaTsKKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfc3RhcnQoKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbV9udW1fZTsgKytpKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBwb3MgPSByYW5nZWRfcHJvYmVfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSwgIGhhc2gsIGkpOworICAgICAgZW50cnkqIGNvbnN0IHBfZSA9IG1fZW50cmllcyArIHBvczsKKyAgICAgIHN3aXRjaChwX2UtPm1fc3RhdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIGVtcHR5X2VudHJ5X3N0YXR1czoKKwkgIHsKKwkgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7CisJICAgIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChyX2tleSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgfQorCSAgYnJlYWs7CisgICAgICAgIGNhc2UgdmFsaWRfZW50cnlfc3RhdHVzOgorCSAgaWYgKGhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwgcl9rZXkpKQorICAgICAgICAgICAgeworCSAgICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX2VuZCgpOworCSAgICAgIGVyYXNlX2VudHJ5KHBfZSk7CisJICAgICAgZG9fcmVzaXplX2lmX25lZWRlZF9ub190aHJvdygpOworCSAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCSAgYnJlYWs7CisgICAgICAgIGNhc2UgZXJhc2VkX2VudHJ5X3N0YXR1czoKKwkgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKDApOworICAgICAgICB9OworICAgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfY29sbGlzaW9uKCk7CisgICAgfQorICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2VyYXNlX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2VyYXNlX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUyYzJkZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZXJhc2Vfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDg1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGdwX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIGVyYXNlIHJlbGF0ZWQgZnVuY3Rpb25zLAorICogd2hlbiB0aGUgaGFzaCB2YWx1ZSBpcyBzdG9yZWQuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9pbXAoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSwgdHJ1ZV90eXBlKQoreworICBjb25zdCBjb21wX2hhc2ggcG9zX2hhc2hfcGFpciA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5KTsKKyAgc2l6ZV90eXBlIGk7CisgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX3N0YXJ0KCk7CisgIGZvciAoaSA9IDA7IGkgPCBtX251bV9lOyArK2kpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIHBvcyA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5LCBwb3NfaGFzaF9wYWlyLnNlY29uZCwgaSk7CisKKyAgICAgIGVudHJ5KiBjb25zdCBwX2UgPSBtX2VudHJpZXMgKyBwb3M7CisgICAgICBzd2l0Y2gocF9lLT5tX3N0YXQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBlbXB0eV9lbnRyeV9zdGF0dXM6CisJICB7CisJICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX2VuZCgpOworCSAgICBQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1Qocl9rZXkpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIH0KKwkgIGJyZWFrOworICAgICAgICBjYXNlIHZhbGlkX2VudHJ5X3N0YXR1czoKKwkgIGlmIChoYXNoX2VxX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfZS0+bV92YWx1ZSksIHBfZS0+bV9oYXNoLAorCQkJCQkgIHJfa2V5LCBwb3NfaGFzaF9wYWlyLnNlY29uZCkpCisgICAgICAgICAgICB7CisJICAgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7CisJICAgICAgZXJhc2VfZW50cnkocF9lKTsKKwkgICAgICBkb19yZXNpemVfaWZfbmVlZGVkX25vX3Rocm93KCk7CisJICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisJICBicmVhazsKKyAgICAgICAgY2FzZSBlcmFzZWRfZW50cnlfc3RhdHVzOgorCSAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoMCk7CisgICAgICAgIH07CisKKyAgICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX2NvbGxpc2lvbigpOworICAgIH0KKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7CisgIHJldHVybiBmYWxzZTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9maW5kX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9maW5kX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxM2VmOTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw3MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBncF9oYXNoX3RhYmxlX21hcF8vZmluZF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyBmaW5kIHJlbGF0ZWQgZnVuY3Rpb25zLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gZmluZF9rZXlfcG9pbnRlcihyX2tleSwgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfY29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkgY29uc3QKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiBjb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDJj4oKnRoaXMpLmZpbmRfa2V5X3BvaW50ZXIocl9rZXksIHRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvcik7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX2VuZCgpCit7IHJldHVybiAwOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2NvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX2VuZCgpIGNvbnN0Cit7IHJldHVybiAwOyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZmluZF9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9maW5kX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4NDYwMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZmluZF9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNDYgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZ3BfaGFzaF90YWJsZV9tYXBfL2ZpbmRfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyBmaW5kIHJlbGF0ZWQgZnVuY3Rpb25zLAorICogd2hlbiB0aGUgaGFzaCB2YWx1ZSBpcyBub3Qgc3RvcmVkLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmRfa2V5X3BvaW50ZXIoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSwgZmFsc2VfdHlwZSkKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9maW5kX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2ZpbmRfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjViM2EyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9maW5kX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw0MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBncF9oYXNoX3RhYmxlX21hcF8vZmluZF9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIGluc2VydCByZWxhdGVkIGZ1bmN0aW9ucywKKyAqIHdoZW4gdGhlIGhhc2ggdmFsdWUgaXMgc3RvcmVkLgorICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2dwX2h0X21hcF8uaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9ncF9odF9tYXBfLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzMzNTgzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9ncF9odF9tYXBfLmhwcApAQCAtMCwwICsxLDcxMyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBncF9oYXNoX3RhYmxlX21hcF8vZ3BfaHRfbWFwXy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBnZW5lcmFsIHByb2JpbmcgaGFzaC4KKyAqLworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL3RhZ19hbmRfdHJhaXQuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9yYW5nZWRfcHJvYmVfZm4uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZXNfdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZXhjZXB0aW9uLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2VxX2ZuL2hhc2hfZXFfZm4uaHBwPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaWZkZWYgUEJfRFNfSFRfTUFQX1RSQUNFXworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2VuZGlmCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2RlYnVnX21hcF9iYXNlLmhwcD4KKyNlbmRpZgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyNkZWZpbmUgUEJfRFNfR1BfSEFTSF9OQU1FIGdwX2h0X21hcAorI2VuZGlmCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19HUF9IQVNIX05BTUUgZ3BfaHRfc2V0CisjZW5kaWYKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIE1hcHBlZCwgdHlwZW5hbWUgSGFzaF9GbiwgdHlwZW5hbWUgRXFfRm4sIFwKKwkgICAgdHlwZW5hbWUgX0FsbG9jLCBib29sIFN0b3JlX0hhc2gsIHR5cGVuYW1lIENvbWJfUHJvYmVfRm4sIFwKKwkgICAgdHlwZW5hbWUgUHJvYmVfRm4sCXR5cGVuYW1lIFJlc2l6ZV9Qb2xpY3k+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgUEJfRFNfR1BfSEFTSF9OQU1FPEtleSwgTWFwcGVkLCBIYXNoX0ZuLCBFcV9GbiwgX0FsbG9jLCBcCisJCSAgICBTdG9yZV9IYXNoLCBDb21iX1Byb2JlX0ZuLCBQcm9iZV9GbiwgUmVzaXplX1BvbGljeT4KKworI2RlZmluZSBQQl9EU19IQVNIX0VRX0ZOX0NfREVDIFwKKyAgICBoYXNoX2VxX2ZuPEtleSwgRXFfRm4sIF9BbGxvYywgU3RvcmVfSGFzaD4KKworI2RlZmluZSBQQl9EU19SQU5HRURfUFJPQkVfRk5fQ19ERUMgXAorICAgcmFuZ2VkX3Byb2JlX2ZuPEtleSwgSGFzaF9GbiwgX0FsbG9jLCBDb21iX1Byb2JlX0ZuLCBQcm9iZV9GbiwgU3RvcmVfSGFzaD4KKworI2RlZmluZSBQQl9EU19HUF9IQVNIX1RSQUlUU19CQVNFIFwKKyAgIHR5cGVzX3RyYWl0czxLZXksIE1hcHBlZCwgX0FsbG9jLCBTdG9yZV9IYXNoPgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyNkZWZpbmUgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMgXAorICAgZGVidWdfbWFwX2Jhc2U8S2V5LCBFcV9GbiwgXAorCQkgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPEtleT46Om90aGVyOjpjb25zdF9yZWZlcmVuY2U+CisjZW5kaWYKKworCisgICAgLyoqCisgICAgICogIEEgZ2VuZXJhbC1wcm9iaW5nIGhhc2gtYmFzZWQgY29udGFpbmVyLgorICAgICAqCisgICAgICoKKyAgICAgKiAgQGluZ3JvdXAgaGFzaC1kZXRhaWwKKyAgICAgKgorICAgICAqICBAdHBhcmFtIEtleSAJICAgIAlLZXkgdHlwZS4KKyAgICAgKgorICAgICAqICBAdHBhcmFtIE1hcHBlZCAJICAgIAlNYXAgdHlwZS4KKyAgICAgKgorICAgICAqICBAdHBhcmFtIEhhc2hfRm4JICAgICAgCUhhc2hpbmcgZnVuY3Rvci4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBpcyBfX2dudV9jeHg6Omhhc2guCisgICAgICoKKyAgICAgKiAgQHRwYXJhbSBFcV9GbgkgICAgICAJRXF1YWwgZnVuY3Rvci4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBzdGQ6OmVxdWFsX3RvPEtleT4KKyAgICAgKgorICAgICAqICBAdHBhcmFtIF9BbGxvYyAJICAgIAlBbGxvY2F0b3IgdHlwZS4KKyAgICAgKgorICAgICAqICBAdHBhcmFtIFN0b3JlX0hhc2ggICAgCUlmIGtleSB0eXBlIHN0b3JlcyBleHRyYSBtZXRhZGF0YS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICoKKyAgICAgKiAgQHRwYXJhbSBDb21iX1Byb2JlX0ZuCUNvbWJpbmluZyBwcm9iZSBmdW5jdG9yLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBIYXNoX0ZuIGlzIG5vdCBudWxsX3R5cGUsIHRoZW4gdGhpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0aGUgcmFuZ2VkLXByb2JlIGZ1bmN0b3I7IG90aGVyd2lzZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyB0aGUgcmFuZ2UtaGFzaGluZyBmdW5jdG9yLgorICAgICAqICAgICAgICAgICAgICAgICAgICBYWFggU2VlIERlc2lnbjo6SGFzaC1CYXNlZCBDb250YWluZXJzOjpIYXNoIFBvbGljaWVzLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGRpcmVjdF9tYXNrX3JhbmdlX2hhc2hpbmcuCisgICAgICoKKyAgICAgKiAgQHRwYXJhbSBQcm9iZV9GbiAgICAgICAJUHJvYmUgZnVuY3Rvci4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gbGluZWFyX3Byb2JlX2ZuLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHNvIHF1YWRyYXRpY19wcm9iZV9mbi4KKyAgICAgKgorICAgICAqICBAdHBhcmFtIFJlc2l6ZV9Qb2xpY3kgCVJlc2l6ZXMgaGFzaC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gaGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBoYXNoX2V4cG9uZW50aWFsX3NpemVfcG9saWN5IGFuZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXIuCisgICAgICoKKyAgICAgKgorICAgICAqICBCYXNlcyBhcmU6IGRldGFpbDo6aGFzaF9lcV9mbiwgUmVzaXplX1BvbGljeSwgZGV0YWlsOjpyYW5nZWRfcHJvYmVfZm4sCisgICAgICogICAgICAgICAgICAgZGV0YWlsOjp0eXBlc190cmFpdHMuIChPcHRpb25hbDogZGV0YWlsOjpkZWJ1Z19tYXBfYmFzZS4pCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgICAgdHlwZW5hbWUgTWFwcGVkLAorCSAgICAgdHlwZW5hbWUgSGFzaF9GbiwKKwkgICAgIHR5cGVuYW1lIEVxX0ZuLAorCSAgICAgdHlwZW5hbWUgX0FsbG9jLAorCSAgICAgYm9vbCBTdG9yZV9IYXNoLAorCSAgICAgdHlwZW5hbWUgQ29tYl9Qcm9iZV9GbiwKKwkgICAgIHR5cGVuYW1lIFByb2JlX0ZuLAorCSAgICAgdHlwZW5hbWUgUmVzaXplX1BvbGljeT4KKyAgICBjbGFzcyBQQl9EU19HUF9IQVNIX05BTUUgOgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICBwcm90ZWN0ZWQgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMsCisjZW5kaWYKKyAgICAgIHB1YmxpYyBQQl9EU19IQVNIX0VRX0ZOX0NfREVDLAorICAgICAgcHVibGljIFJlc2l6ZV9Qb2xpY3ksCisgICAgICBwdWJsaWMgUEJfRFNfUkFOR0VEX1BST0JFX0ZOX0NfREVDLAorICAgICAgcHVibGljIFBCX0RTX0dQX0hBU0hfVFJBSVRTX0JBU0UKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgUEJfRFNfR1BfSEFTSF9UUkFJVFNfQkFTRQkgICAgICAgCXRyYWl0c19iYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6dmFsdWVfdHlwZSAJdmFsdWVfdHlwZV87CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpwb2ludGVyIAlwb2ludGVyXzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcl87CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpyZWZlcmVuY2UgCXJlZmVyZW5jZV87CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlXzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbXBfaGFzaAljb21wX2hhc2g7CisKKyAgICAgIGVudW0gZW50cnlfc3RhdHVzCisJeworCSAgZW1wdHlfZW50cnlfc3RhdHVzLAorCSAgdmFsaWRfZW50cnlfc3RhdHVzLAorCSAgZXJhc2VkX2VudHJ5X3N0YXR1cworCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisgICAgICBzdHJ1Y3QgZW50cnkgOiBwdWJsaWMgdHJhaXRzX2Jhc2U6OnN0b3JlZF9kYXRhX3R5cGUKKyAgICAgIHsKKwllbnRyeV9zdGF0dXMgbV9zdGF0OworICAgICAgfTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxlbnRyeT46Om90aGVyIGVudHJ5X2FsbG9jYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgZW50cnlfYWxsb2NhdG9yOjpwb2ludGVyIGVudHJ5X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGVudHJ5X2FsbG9jYXRvcjo6Y29uc3RfcG9pbnRlciBjb25zdF9lbnRyeV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBlbnRyeV9hbGxvY2F0b3I6OnJlZmVyZW5jZSBlbnRyeV9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGVudHJ5X2FsbG9jYXRvcjo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X2VudHJ5X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgZW50cnlfYWxsb2NhdG9yOjpwb2ludGVyIGVudHJ5X2FycmF5OworCisgICAgICB0eXBlZGVmIFBCX0RTX1JBTkdFRF9QUk9CRV9GTl9DX0RFQyAJcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdHlwZWRlZiBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQyAJZGVidWdfYmFzZTsKKyNlbmRpZgorCisgICAgICB0eXBlZGVmIFBCX0RTX0hBU0hfRVFfRk5fQ19ERUMgCQloYXNoX2VxX2ZuX2Jhc2U7CisgICAgICB0eXBlZGVmIFJlc2l6ZV9Qb2xpY3kgCQkJcmVzaXplX2Jhc2U7CisKKyNkZWZpbmUgUEJfRFNfR0VOX1BPUyB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZQorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvcG9pbnRfY29uc3RfaXRlcmF0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL3BvaW50X2l0ZXJhdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9jb25zdF9pdGVyYXRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvaXRlcmF0b3IuaHBwPgorCisjdW5kZWYgUEJfRFNfR0VOX1BPUworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQWxsb2MgCQkJCWFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmRpZmZlcmVuY2VfdHlwZSAJZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBIYXNoX0ZuIAkJCQloYXNoX2ZuOworICAgICAgdHlwZWRlZiBFcV9GbiAJCQkJZXFfZm47CisgICAgICB0eXBlZGVmIFByb2JlX0ZuIAkJCQlwcm9iZV9mbjsKKyAgICAgIHR5cGVkZWYgQ29tYl9Qcm9iZV9GbiAJCQljb21iX3Byb2JlX2ZuOworICAgICAgdHlwZWRlZiBSZXNpemVfUG9saWN5IAkJCXJlc2l6ZV9wb2xpY3k7CisKKyAgICAgIC8vLyBWYWx1ZSBzdG9yZXMgaGFzaCwgdHJ1ZSBvciBmYWxzZS4KKyAgICAgIGVudW0KKwl7CisJICBzdG9yZV9oYXNoID0gU3RvcmVfSGFzaAorCX07CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV90eXBlIAlrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV9wb2ludGVyIGtleV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X2NvbnN0X3BvaW50ZXIga2V5X2NvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfcmVmZXJlbmNlIGtleV9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfY29uc3RfcmVmZXJlbmNlIGtleV9jb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjptYXBwZWRfdHlwZSBtYXBwZWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF9wb2ludGVyIG1hcHBlZF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX2NvbnN0X3BvaW50ZXIgbWFwcGVkX2NvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjptYXBwZWRfcmVmZXJlbmNlIG1hcHBlZF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjptYXBwZWRfY29uc3RfcmVmZXJlbmNlIG1hcHBlZF9jb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpwb2ludGVyIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyAgICAgIHR5cGVkZWYgcG9pbnRfaXRlcmF0b3JfIAkJCXBvaW50X2l0ZXJhdG9yOworI2VuZGlmCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorICAgICAgdHlwZWRlZiBwb2ludF9jb25zdF9pdGVyYXRvcl8gCQlwb2ludF9pdGVyYXRvcjsKKyNlbmRpZgorCisgICAgICB0eXBlZGVmIHBvaW50X2NvbnN0X2l0ZXJhdG9yXyAJCXBvaW50X2NvbnN0X2l0ZXJhdG9yOworCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICAgICAgdHlwZWRlZiBpdGVyYXRvcl8gCQkJaXRlcmF0b3I7CisjZW5kaWYKKworI2lmZGVmIFBCX0RTX0RBVEFfRkFMU0VfSU5ESUNBVE9SCisgICAgICB0eXBlZGVmIGNvbnN0X2l0ZXJhdG9yXyAJCQlpdGVyYXRvcjsKKyNlbmRpZgorCisgICAgICB0eXBlZGVmIGNvbnN0X2l0ZXJhdG9yXyAJCQljb25zdF9pdGVyYXRvcjsKKworICAgICAgUEJfRFNfR1BfSEFTSF9OQU1FKCk7CisKKyAgICAgIFBCX0RTX0dQX0hBU0hfTkFNRShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICBQQl9EU19HUF9IQVNIX05BTUUoY29uc3QgSGFzaF9GbiYpOworCisgICAgICBQQl9EU19HUF9IQVNIX05BTUUoY29uc3QgSGFzaF9GbiYsIGNvbnN0IEVxX0ZuJik7CisKKyAgICAgIFBCX0RTX0dQX0hBU0hfTkFNRShjb25zdCBIYXNoX0ZuJiwgY29uc3QgRXFfRm4mLCBjb25zdCBDb21iX1Byb2JlX0ZuJik7CisKKyAgICAgIFBCX0RTX0dQX0hBU0hfTkFNRShjb25zdCBIYXNoX0ZuJiwgY29uc3QgRXFfRm4mLCBjb25zdCBDb21iX1Byb2JlX0ZuJiwKKwkJCSBjb25zdCBQcm9iZV9GbiYpOworCisgICAgICBQQl9EU19HUF9IQVNIX05BTUUoY29uc3QgSGFzaF9GbiYsIGNvbnN0IEVxX0ZuJiwgY29uc3QgQ29tYl9Qcm9iZV9GbiYsCisJCQkgY29uc3QgUHJvYmVfRm4mLCBjb25zdCBSZXNpemVfUG9saWN5Jik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgICAgdm9pZAorICAgICAgY29weV9mcm9tX3JhbmdlKEl0LCBJdCk7CisKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5QQl9EU19HUF9IQVNIX05BTUUoKTsKKworICAgICAgdm9pZAorICAgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3Q7CisKKyAgICAgIC8vLyBUcnVlIGlmIHNpemUoKSA9PSAwLgorICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3Q7CisKKyAgICAgIC8vLyBSZXR1cm4gY3VycmVudCBoYXNoX2ZuLgorICAgICAgSGFzaF9GbiYKKyAgICAgIGdldF9oYXNoX2ZuKCk7CisKKyAgICAgIC8vLyBSZXR1cm4gY3VycmVudCBjb25zdCBoYXNoX2ZuLgorICAgICAgY29uc3QgSGFzaF9GbiYKKyAgICAgIGdldF9oYXNoX2ZuKCkgY29uc3Q7CisKKyAgICAgIC8vLyBSZXR1cm4gY3VycmVudCBlcV9mbi4KKyAgICAgIEVxX0ZuJgorICAgICAgZ2V0X2VxX2ZuKCk7CisKKyAgICAgIC8vLyBSZXR1cm4gY3VycmVudCBjb25zdCBlcV9mbi4KKyAgICAgIGNvbnN0IEVxX0ZuJgorICAgICAgZ2V0X2VxX2ZuKCkgY29uc3Q7CisKKyAgICAgIC8vLyBSZXR1cm4gY3VycmVudCBwcm9iZV9mbi4KKyAgICAgIFByb2JlX0ZuJgorICAgICAgZ2V0X3Byb2JlX2ZuKCk7CisKKyAgICAgIC8vLyBSZXR1cm4gY3VycmVudCBjb25zdCBwcm9iZV9mbi4KKyAgICAgIGNvbnN0IFByb2JlX0ZuJgorICAgICAgZ2V0X3Byb2JlX2ZuKCkgY29uc3Q7CisKKyAgICAgIC8vLyBSZXR1cm4gY3VycmVudCBjb21iX3Byb2JlX2ZuLgorICAgICAgQ29tYl9Qcm9iZV9GbiYKKyAgICAgIGdldF9jb21iX3Byb2JlX2ZuKCk7CisKKyAgICAgIC8vLyBSZXR1cm4gY3VycmVudCBjb25zdCBjb21iX3Byb2JlX2ZuLgorICAgICAgY29uc3QgQ29tYl9Qcm9iZV9GbiYKKyAgICAgIGdldF9jb21iX3Byb2JlX2ZuKCkgY29uc3Q7CisKKyAgICAgIC8vLyBSZXR1cm4gY3VycmVudCByZXNpemVfcG9saWN5LgorICAgICAgUmVzaXplX1BvbGljeSYKKyAgICAgIGdldF9yZXNpemVfcG9saWN5KCk7CisKKyAgICAgIC8vLyBSZXR1cm4gY3VycmVudCBjb25zdCByZXNpemVfcG9saWN5LgorICAgICAgY29uc3QgUmVzaXplX1BvbGljeSYKKyAgICAgIGdldF9yZXNpemVfcG9saWN5KCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzdGQ6OnBhaXI8cG9pbnRfaXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3RfcmVmZXJlbmNlIHJfdmFsKQorICAgICAgeworICAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoUEJfRFNfQ0xBU1NfQ19ERUM6OmFzc2VydF92YWxpZChfX0ZJTEVfXywgX19MSU5FX18pOykKKwlyZXR1cm4gaW5zZXJ0X2ltcChyX3ZhbCwgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIG1hcHBlZF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKKyAgICAgIHsKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisJcmV0dXJuIHN1YnNjcmlwdF9pbXAocl9rZXksIHRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvcik7CisjZWxzZQorCWluc2VydChyX2tleSk7CisJcmV0dXJuIHRyYWl0c19iYXNlOjpzX251bGxfdHlwZTsKKyNlbmRpZgorICAgICAgfQorCisgICAgICBpbmxpbmUgcG9pbnRfaXRlcmF0b3IKKyAgICAgIGZpbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBwb2ludF9jb25zdF9pdGVyYXRvcgorICAgICAgZmluZChrZXlfY29uc3RfcmVmZXJlbmNlKSBjb25zdDsKKworICAgICAgaW5saW5lIHBvaW50X2l0ZXJhdG9yCisgICAgICBmaW5kX2VuZCgpOworCisgICAgICBpbmxpbmUgcG9pbnRfY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmRfZW5kKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBlcmFzZShrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KKyAgICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgICBlcmFzZV9pZihQcmVkKTsKKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKTsKKworICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBiZWdpbigpOworCisgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgZW5kKCk7CisgICAgICAKKyAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3Q7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworI2VuZGlmCisKKyNpZmRlZiBQQl9EU19IVF9NQVBfVFJBQ0VfCisgICAgICB2b2lkCisgICAgICB0cmFjZSgpIGNvbnN0OworI2VuZGlmCisKKyAgICBwcml2YXRlOgorI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyAgICAgIGZyaWVuZCBjbGFzcyBpdGVyYXRvcl87CisjZW5kaWYKKworICAgICAgZnJpZW5kIGNsYXNzIGNvbnN0X2l0ZXJhdG9yXzsKKworICAgICAgdm9pZAorICAgICAgZGVhbGxvY2F0ZV9hbGwoKTsKKworICAgICAgdm9pZAorICAgICAgaW5pdGlhbGl6ZSgpOworCisgICAgICB2b2lkCisgICAgICBlcmFzZV9hbGxfdmFsaWRfZW50cmllcyhlbnRyeV9hcnJheSwgc2l6ZV90eXBlKTsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGRvX3Jlc2l6ZV9pZl9uZWVkZWQoKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGRvX3Jlc2l6ZV9pZl9uZWVkZWRfbm9fdGhyb3coKTsKKworICAgICAgdm9pZAorICAgICAgcmVzaXplX2ltcChzaXplX3R5cGUpOworCisgICAgICB2aXJ0dWFsIHZvaWQKKyAgICAgIGRvX3Jlc2l6ZShzaXplX3R5cGUpOworCisgICAgICB2b2lkCisgICAgICByZXNpemVfaW1wKGVudHJ5X2FycmF5LCBzaXplX3R5cGUpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgcmVzaXplX2ltcF9yZWFzc2lnbihlbnRyeV9wb2ludGVyLCBlbnRyeV9hcnJheSwgZmFsc2VfdHlwZSk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICByZXNpemVfaW1wX3JlYXNzaWduKGVudHJ5X3BvaW50ZXIsIGVudHJ5X2FycmF5LCB0cnVlX3R5cGUpOworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBmaW5kX2luc19wb3Moa2V5X2NvbnN0X3JlZmVyZW5jZSwgZmFsc2VfdHlwZSk7CisKKyAgICAgIGlubGluZSBjb21wX2hhc2gKKyAgICAgIGZpbmRfaW5zX3BvcyhrZXlfY29uc3RfcmVmZXJlbmNlLCB0cnVlX3R5cGUpOworCisgICAgICBpbmxpbmUgc3RkOjpwYWlyPHBvaW50X2l0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0X2ltcChjb25zdF9yZWZlcmVuY2UsIGZhbHNlX3R5cGUpOworCisgICAgICBpbmxpbmUgc3RkOjpwYWlyPHBvaW50X2l0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0X2ltcChjb25zdF9yZWZlcmVuY2UsIHRydWVfdHlwZSk7CisKKyAgICAgIGlubGluZSBwb2ludGVyCisgICAgICBpbnNlcnRfbmV3X2ltcChjb25zdF9yZWZlcmVuY2Ugcl92YWwsIHNpemVfdHlwZSBwb3MpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fZW50cmllc1twb3NdLm1fc3RhdCAhPSB2YWxpZF9lbnRyeV9zdGF0dXMpOworCisJaWYgKGRvX3Jlc2l6ZV9pZl9uZWVkZWQoKSkKKwkgIHBvcyA9IGZpbmRfaW5zX3BvcyhQQl9EU19WMkYocl92YWwpLAorCQkJICAgICB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IpOworCisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fZW50cmllc1twb3NdLm1fc3RhdCAhPSB2YWxpZF9lbnRyeV9zdGF0dXMpOworCWVudHJ5KiBjb25zdCBwX2UgPSBtX2VudHJpZXMgKyBwb3M7CisJbmV3ICgmcF9lLT5tX3ZhbHVlKSB2YWx1ZV90eXBlKHJfdmFsKTsKKwlwX2UtPm1fc3RhdCA9IHZhbGlkX2VudHJ5X3N0YXR1czsKKwlyZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydGVkKCsrbV9udW1fdXNlZF9lKTsKKworCV9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6aW5zZXJ0X25ldyhQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSk7KQorCV9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCXJldHVybiAmcF9lLT5tX3ZhbHVlOworICAgICAgfQorCisgICAgICBpbmxpbmUgcG9pbnRlcgorICAgICAgaW5zZXJ0X25ld19pbXAoY29uc3RfcmVmZXJlbmNlIHJfdmFsLCBjb21wX2hhc2gmIHJfcG9zX2hhc2hfcGFpcikKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9lbnRyaWVzW3JfcG9zX2hhc2hfcGFpci5maXJzdF0ubV9zdGF0ICE9CisJCQkgICAgICB2YWxpZF9lbnRyeV9zdGF0dXMpOworCisJaWYgKGRvX3Jlc2l6ZV9pZl9uZWVkZWQoKSkKKwkgIHJfcG9zX2hhc2hfcGFpciA9IGZpbmRfaW5zX3BvcyhQQl9EU19WMkYocl92YWwpLAorCQkJCQkgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsKKworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX2VudHJpZXNbcl9wb3NfaGFzaF9wYWlyLmZpcnN0XS5tX3N0YXQgIT0KKwkJCSAgICAgIHZhbGlkX2VudHJ5X3N0YXR1cyk7CisKKwllbnRyeSogY29uc3QgcF9lID0gbV9lbnRyaWVzICsgcl9wb3NfaGFzaF9wYWlyLmZpcnN0OworCW5ldyAoJnBfZS0+bV92YWx1ZSkgdmFsdWVfdHlwZShyX3ZhbCk7CisJcF9lLT5tX2hhc2ggPSByX3Bvc19oYXNoX3BhaXIuc2Vjb25kOworCXBfZS0+bV9zdGF0ID0gdmFsaWRfZW50cnlfc3RhdHVzOworCisJcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRlZCgrK21fbnVtX3VzZWRfZSk7CisKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6Omluc2VydF9uZXcoUEJfRFNfVjJGKHBfZS0+bV92YWx1ZSkpOykKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZChfX0ZJTEVfXywgX19MSU5FX18pOykKKwlyZXR1cm4gJnBfZS0+bV92YWx1ZTsKKyAgICAgIH0KKworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyAgICAgIGlubGluZSBtYXBwZWRfcmVmZXJlbmNlCisgICAgICBzdWJzY3JpcHRfaW1wKGtleV9jb25zdF9yZWZlcmVuY2Uga2V5LCBmYWxzZV90eXBlKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCisJY29uc3Qgc2l6ZV90eXBlIHBvcyA9IGZpbmRfaW5zX3BvcyhrZXksCisJCQkJCSB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IpOworCisJZW50cnlfcG9pbnRlciBwX2UgPSAmbV9lbnRyaWVzW3Bvc107CisJaWYgKHBfZS0+bV9zdGF0ICE9IHZhbGlkX2VudHJ5X3N0YXR1cykKKwkgIHJldHVybiBpbnNlcnRfbmV3X2ltcCh2YWx1ZV90eXBlKGtleSwgbWFwcGVkX3R5cGUoKSksIHBvcyktPnNlY29uZDsKKworCVBCX0RTX0NIRUNLX0tFWV9FWElTVFMoa2V5KQorCXJldHVybiBwX2UtPm1fdmFsdWUuc2Vjb25kOworICAgICAgfQorCisgICAgICBpbmxpbmUgbWFwcGVkX3JlZmVyZW5jZQorICAgICAgc3Vic2NyaXB0X2ltcChrZXlfY29uc3RfcmVmZXJlbmNlIGtleSwgdHJ1ZV90eXBlKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCisJY29tcF9oYXNoIHBvc19oYXNoX3BhaXIgPSBmaW5kX2luc19wb3Moa2V5LAorCQkJCQkgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsKKworCWlmIChtX2VudHJpZXNbcG9zX2hhc2hfcGFpci5maXJzdF0ubV9zdGF0ICE9IHZhbGlkX2VudHJ5X3N0YXR1cykKKwkgIHJldHVybiBpbnNlcnRfbmV3X2ltcCh2YWx1ZV90eXBlKGtleSwgbWFwcGVkX3R5cGUoKSksCisJCQkJIHBvc19oYXNoX3BhaXIpLT5zZWNvbmQ7CisKKwlQQl9EU19DSEVDS19LRVlfRVhJU1RTKGtleSkKKwlyZXR1cm4gKG1fZW50cmllcyArIHBvc19oYXNoX3BhaXIuZmlyc3QpLT5tX3ZhbHVlLnNlY29uZDsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBpbmxpbmUgcG9pbnRlcgorICAgICAgZmluZF9rZXlfcG9pbnRlcihrZXlfY29uc3RfcmVmZXJlbmNlIGtleSwgZmFsc2VfdHlwZSkKKyAgICAgIHsKKwljb25zdCBzaXplX3R5cGUgaGFzaCA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKGtleSk7CisJcmVzaXplX2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9zdGFydCgpOworCisJLy8gTG9vcCB1bnRpbCBlbnRyeSBpcyBmb3VuZCBvciB1bnRpbCBhbGwgcG9zc2libGUgZW50cmllcyBhY2Nlc3NlZC4KKwlmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG1fbnVtX2U7ICsraSkKKwkgIHsKKwkgICAgY29uc3Qgc2l6ZV90eXBlIHBvcyA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKGtleSwKKwkJCQkJCQkJICAgaGFzaCwgaSk7CisKKwkgICAgZW50cnkqIGNvbnN0IHBfZSA9IG1fZW50cmllcyArIHBvczsKKwkgICAgc3dpdGNoIChwX2UtPm1fc3RhdCkKKwkgICAgICB7CisJICAgICAgY2FzZSBlbXB0eV9lbnRyeV9zdGF0dXM6CisJCXsKKwkJICByZXNpemVfYmFzZTo6bm90aWZ5X2ZpbmRfc2VhcmNoX2VuZCgpOworCQkgIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChrZXkpCisJCSAgcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJICAgICAgY2FzZSB2YWxpZF9lbnRyeV9zdGF0dXM6CisJCWlmIChoYXNoX2VxX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfZS0+bV92YWx1ZSksIGtleSkpCisJCSAgeworCQkgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9lbmQoKTsKKwkJICAgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMoa2V5KQorCQkgICAgcmV0dXJuIHBvaW50ZXIoJnBfZS0+bV92YWx1ZSk7CisJCSAgfQorCQlicmVhazsKKwkgICAgICBjYXNlIGVyYXNlZF9lbnRyeV9zdGF0dXM6CisJCWJyZWFrOworCSAgICAgIGRlZmF1bHQ6CisJCV9HTElCQ1hYX0RFQlVHX0FTU0VSVCgwKTsKKwkgICAgICB9OworCisJICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfY29sbGlzaW9uKCk7CisJICB9CisKKwlQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1Qoa2V5KQorCXJlc2l6ZV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfZW5kKCk7CisJcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIGlubGluZSBwb2ludGVyCisgICAgICBmaW5kX2tleV9wb2ludGVyKGtleV9jb25zdF9yZWZlcmVuY2Uga2V5LCB0cnVlX3R5cGUpCisgICAgICB7CisJY29tcF9oYXNoIHBvc19oYXNoX3BhaXIgPSByYW5nZWRfcHJvYmVfZm5fYmFzZTo6b3BlcmF0b3IoKShrZXkpOworCXJlc2l6ZV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfc3RhcnQoKTsKKworCS8vIExvb3AgdW50aWwgZW50cnkgaXMgZm91bmQgb3IgdW50aWwgYWxsIHBvc3NpYmxlIGVudHJpZXMgYWNjZXNzZWQuCisJZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBtX251bV9lOyArK2kpCisJICB7CisJICAgIGNvbnN0IHNpemVfdHlwZSBwb3MgPQorCSAgICAgIHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKGtleSwgcG9zX2hhc2hfcGFpci5zZWNvbmQsIGkpOworCisJICAgIGVudHJ5KiBjb25zdCBwX2UgPSBtX2VudHJpZXMgKyBwb3M7CisKKwkgICAgc3dpdGNoKHBfZS0+bV9zdGF0KQorCSAgICAgIHsKKwkgICAgICBjYXNlIGVtcHR5X2VudHJ5X3N0YXR1czoKKwkJeworCQkgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfZW5kKCk7CisJCSAgUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKGtleSkKKwkJICByZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwkgICAgICBjYXNlIHZhbGlkX2VudHJ5X3N0YXR1czoKKwkJaWYgKGhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwKKwkJCQkJCXBfZS0+bV9oYXNoLAorCQkJCQkJa2V5LCBwb3NfaGFzaF9wYWlyLnNlY29uZCkpCisJCSAgeworCQkgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9lbmQoKTsKKwkJICAgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMoa2V5KQorCQkgICAgcmV0dXJuIHBvaW50ZXIoJnBfZS0+bV92YWx1ZSk7CisJCSAgfQorCQlicmVhazsKKwkgICAgICBjYXNlIGVyYXNlZF9lbnRyeV9zdGF0dXM6CisJCWJyZWFrOworCSAgICAgIGRlZmF1bHQ6CisJCV9HTElCQ1hYX0RFQlVHX0FTU0VSVCgwKTsKKwkgICAgICB9OworCisJICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfY29sbGlzaW9uKCk7CisJICB9CisKKwlQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1Qoa2V5KQorCXJlc2l6ZV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfZW5kKCk7CisJcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBlcmFzZV9pbXAoa2V5X2NvbnN0X3JlZmVyZW5jZSwgdHJ1ZV90eXBlKTsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVyYXNlX2ltcChrZXlfY29uc3RfcmVmZXJlbmNlLCBmYWxzZV90eXBlKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGVyYXNlX2VudHJ5KGVudHJ5X3BvaW50ZXIpOworCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICAgICAgdm9pZAorICAgICAgaW5jX2l0X3N0YXRlKHBvaW50ZXImIHJfcF92YWx1ZSwgc2l6ZV90eXBlJiByX3BvcykgY29uc3QKKyAgICAgIHsgaW5jX2l0X3N0YXRlKChtYXBwZWRfY29uc3RfcG9pbnRlciYgKXJfcF92YWx1ZSwgcl9wb3MpOyB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgaW5jX2l0X3N0YXRlKGNvbnN0X3BvaW50ZXImIHJfcF92YWx1ZSwgc2l6ZV90eXBlJiByX3BvcykgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQocl9wX3ZhbHVlICE9IDApOworCWZvciAoKytyX3Bvczsgcl9wb3MgPCBtX251bV9lOyArK3JfcG9zKQorCSAgeworCSAgICBjb25zdF9lbnRyeV9wb2ludGVyIHBfZSA9JiBtX2VudHJpZXNbcl9wb3NdOworCSAgICBpZiAocF9lLT5tX3N0YXQgPT0gdmFsaWRfZW50cnlfc3RhdHVzKQorCSAgICAgIHsKKwkJcl9wX3ZhbHVlID0mIHBfZS0+bV92YWx1ZTsKKwkJcmV0dXJuOworCSAgICAgIH0KKwkgIH0KKwlyX3BfdmFsdWUgPSAwOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBnZXRfc3RhcnRfaXRfc3RhdGUoY29uc3RfcG9pbnRlciYgcl9wX3ZhbHVlLCBzaXplX3R5cGUmIHJfcG9zKSBjb25zdAorICAgICAgeworCWZvciAocl9wb3MgPSAwOyByX3BvcyA8IG1fbnVtX2U7ICsrcl9wb3MpCisJICB7CisJICAgIGNvbnN0X2VudHJ5X3BvaW50ZXIgcF9lID0gJm1fZW50cmllc1tyX3Bvc107CisJICAgIGlmIChwX2UtPm1fc3RhdCA9PSB2YWxpZF9lbnRyeV9zdGF0dXMpCisJICAgICAgeworCQlyX3BfdmFsdWUgPSAmcF9lLT5tX3ZhbHVlOworCQlyZXR1cm47CisJICAgICAgfQorCSAgfQorCXJfcF92YWx1ZSA9IDA7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGdldF9zdGFydF9pdF9zdGF0ZShwb2ludGVyJiByX3BfdmFsdWUsIHNpemVfdHlwZSYgcl9wb3MpCisgICAgICB7CisJZm9yIChyX3BvcyA9IDA7IHJfcG9zIDwgbV9udW1fZTsgKytyX3BvcykKKwkgIHsKKwkgICAgZW50cnlfcG9pbnRlciBwX2UgPSAmbV9lbnRyaWVzW3JfcG9zXTsKKwkgICAgaWYgKHBfZS0+bV9zdGF0ID09IHZhbGlkX2VudHJ5X3N0YXR1cykKKwkgICAgICB7CisJCXJfcF92YWx1ZSA9ICZwX2UtPm1fdmFsdWU7CisJCXJldHVybjsKKwkgICAgICB9CisJICB9CisJcl9wX3ZhbHVlID0gMDsKKyAgICAgIH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfZW50cnlfYXJyYXlfdmFsaWQoY29uc3QgZW50cnlfYXJyYXksIGZhbHNlX3R5cGUsCisJCQkgICAgICAgY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9lbnRyeV9hcnJheV92YWxpZChjb25zdCBlbnRyeV9hcnJheSwgdHJ1ZV90eXBlLAorCQkJICAgICAgIGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworI2VuZGlmCisKKyAgICAgIHN0YXRpYyBlbnRyeV9hbGxvY2F0b3IgCXNfZW50cnlfYWxsb2NhdG9yOworICAgICAgc3RhdGljIGl0ZXJhdG9yIAkJc19lbmRfaXQ7CisgICAgICBzdGF0aWMgY29uc3RfaXRlcmF0b3IgCXNfY29uc3RfZW5kX2l0OworCisgICAgICBzaXplX3R5cGUgCQltX251bV9lOworICAgICAgc2l6ZV90eXBlIAkJbV9udW1fdXNlZF9lOworICAgICAgZW50cnlfcG9pbnRlciAJCW1fZW50cmllczsKKworICAgICAgZW51bQorCXsKKwkgIHN0b3JlX2hhc2hfb2sgPSAhU3RvcmVfSGFzaAorCQkJICB8fCAhaXNfc2FtZTxIYXNoX0ZuLCBfX2dudV9wYmRzOjpudWxsX3R5cGU+Ojp2YWx1ZQorCX07CisKKyAgICAgIFBCX0RTX1NUQVRJQ19BU1NFUlQoc3RoLCBzdG9yZV9oYXNoX29rKTsKKyAgICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9maW5kX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9pbmZvX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZXJhc2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vaXRlcmF0b3JfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3RyYWNlX2ZuX2ltcHMuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworI3VuZGVmIFBCX0RTX0hBU0hfRVFfRk5fQ19ERUMKKyN1bmRlZiBQQl9EU19SQU5HRURfUFJPQkVfRk5fQ19ERUMKKyN1bmRlZiBQQl9EU19HUF9IQVNIX1RSQUlUU19CQVNFCisjdW5kZWYgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMKKyN1bmRlZiBQQl9EU19HUF9IQVNIX05BTUUKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2luZm9fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2luZm9fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwZmYwYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vaW5mb19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDU4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGdwX2hhc2hfdGFibGVfbWFwXy9pbmZvX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIGVudGlyZSBjb250YWluZXIgaW5mbyByZWxhdGVkCisgKiBmdW5jdGlvbnMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitzaXplKCkgY29uc3QKK3sgcmV0dXJuIG1fbnVtX3VzZWRfZTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK21heF9zaXplKCkgY29uc3QKK3sgcmV0dXJuIHNfZW50cnlfYWxsb2NhdG9yLm1heF9zaXplKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlbXB0eSgpIGNvbnN0Cit7IHJldHVybiAoc2l6ZSgpID09IDApOyB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MDU2N2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDQzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGdwX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBncF9odF9tYXBfJ3MgaW5zZXJ0IHJlbGF0ZWQgZnVuY3Rpb25zLgorICovCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcD4KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVhMDk4OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMTEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZ3BfaGFzaF90YWJsZV9tYXBfL2luc2VydF9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIGluc2VydCByZWxhdGVkIGZ1bmN0aW9ucywKKyAqIHdoZW4gdGhlIGhhc2ggdmFsdWUgaXMgbm90IHN0b3JlZC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmRfaW5zX3BvcyhrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5LCBmYWxzZV90eXBlKQoreworICBzaXplX3R5cGUgaGFzaCA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5KTsKKyAgc2l6ZV90eXBlIGk7CisKKyAgLyogVGhlIGluc2VydGlvbiBwb3NpdGlvbiBpcyBpbml0dGVkIHRvIGEgbm9uLWxlZ2FsIHZhbHVlIHRvIGluZGljYXRlCisgICAqICAgICB0aGF0IGl0IGhhcyBub3QgYmVlbiBpbml0dGVkIHlldC4KKyAgICovCisgIHNpemVfdHlwZSBpbnNfcG9zID0gbV9udW1fZTsKKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX3N0YXJ0KCk7CisgIGZvciAoaSA9IDA7IGkgPCBtX251bV9lOyArK2kpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIHBvcyA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5LCBoYXNoLCBpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwb3MgPCBtX251bV9lKTsKKyAgICAgIGVudHJ5KiBjb25zdCBwX2UgPSBtX2VudHJpZXMgKyBwb3M7CisgICAgICBzd2l0Y2gocF9lLT5tX3N0YXQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBlbXB0eV9lbnRyeV9zdGF0dXM6CisJICB7CisgICAgICAgICAgICByZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfZW5kKCk7CisJICAgIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChyX2tleSkKKwkgICAgcmV0dXJuIChpbnNfcG9zID09IG1fbnVtX2UpID8gcG9zIDogaW5zX3BvczsKKwkgIH0KKwkgIGJyZWFrOworICAgICAgICBjYXNlIGVyYXNlZF9lbnRyeV9zdGF0dXM6CisJICBpZiAoaW5zX3BvcyA9PSBtX251bV9lKQorCSAgICBpbnNfcG9zID0gcG9zOworCSAgYnJlYWs7CisgICAgICAgIGNhc2UgdmFsaWRfZW50cnlfc3RhdHVzOgorCSAgaWYgKGhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwgcl9rZXkpKQorICAgICAgICAgICAgeworCSAgICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKTsKKwkgICAgICBQQl9EU19DSEVDS19LRVlfRVhJU1RTKHJfa2V5KQorICAgICAgICAgICAgICAgIHJldHVybiBwb3M7CisgICAgICAgICAgICB9CisJICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCgwKTsKKyAgICAgICAgfTsKKworICAgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX2NvbGxpc2lvbigpOworICAgIH0KKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX2VuZCgpOworICBpZiAoaW5zX3BvcyA9PSBtX251bV9lKQorICAgIF9fdGhyb3dfaW5zZXJ0X2Vycm9yKCk7CisgIHJldHVybiBpbnNfcG9zOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHN0ZDo6cGFpcjx0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IsIGJvb2w+CitQQl9EU19DTEFTU19DX0RFQzo6CitpbnNlcnRfaW1wKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgZmFsc2VfdHlwZSkKK3sKKyAga2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSA9IFBCX0RTX1YyRihyX3ZhbCk7CisgIGNvbnN0IHNpemVfdHlwZSBwb3MgPSBmaW5kX2luc19wb3Mocl9rZXksIAorCQkJCSAgICAgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsKKworICBpZiAobV9lbnRyaWVzW3Bvc10ubV9zdGF0ID09IHZhbGlkX2VudHJ5X3N0YXR1cykKKyAgICB7CisgICAgICBQQl9EU19DSEVDS19LRVlfRVhJU1RTKHJfa2V5KQorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKCYobV9lbnRyaWVzICsgcG9zKS0+bV92YWx1ZSwgZmFsc2UpOworICAgIH0KKworICBQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1Qocl9rZXkpCisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpbnNlcnRfbmV3X2ltcChyX3ZhbCwgcG9zKSwgdHJ1ZSk7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2luc2VydF9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMDIwMDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2luc2VydF9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTE4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGdwX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyBmaW5kIHJlbGF0ZWQgZnVuY3Rpb25zLAorICogd2hlbiB0aGUgaGFzaCB2YWx1ZSBpcyBzdG9yZWQuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29tcF9oYXNoCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX2luc19wb3Moa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSwgdHJ1ZV90eXBlKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgY29tcF9oYXNoIHBvc19oYXNoX3BhaXIgPSByYW5nZWRfcHJvYmVfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSk7CisKKyAgc2l6ZV90eXBlIGk7CisKKyAgLyogVGhlIGluc2VydGlvbiBwb3NpdGlvbiBpcyBpbml0dGVkIHRvIGEgbm9uLWxlZ2FsIHZhbHVlIHRvIGluZGljYXRlCisgICAqICAgICB0aGF0IGl0IGhhcyBub3QgYmVlbiBpbml0dGVkIHlldC4KKyAgICovCisgIHNpemVfdHlwZSBpbnNfcG9zID0gbV9udW1fZTsKKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX3N0YXJ0KCk7CisgIGZvciAoaSA9IDA7IGkgPCBtX251bV9lOyArK2kpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIHBvcyA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5LCBwb3NfaGFzaF9wYWlyLnNlY29uZCwgaSk7CisKKyAgICAgIGVudHJ5KiBjb25zdCBwX2UgPSBtX2VudHJpZXMgKyBwb3M7CisgICAgICBzd2l0Y2gocF9lLT5tX3N0YXQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBlbXB0eV9lbnRyeV9zdGF0dXM6CisJICB7CisgICAgICAgICAgICByZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfZW5kKCk7CisJICAgIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChyX2tleSkKKworCSAgICByZXR1cm4gKChpbnNfcG9zID09IG1fbnVtX2UpID8KKwkJICAgICBzdGQ6Om1ha2VfcGFpcihwb3MsIHBvc19oYXNoX3BhaXIuc2Vjb25kKSA6CisJCSAgICAgc3RkOjptYWtlX3BhaXIoaW5zX3BvcywgcG9zX2hhc2hfcGFpci5zZWNvbmQpKTsKKwkgIH0KKwkgIGJyZWFrOworICAgICAgICBjYXNlIGVyYXNlZF9lbnRyeV9zdGF0dXM6CisJICBpZiAoaW5zX3BvcyA9PSBtX251bV9lKQorCSAgICBpbnNfcG9zID0gcG9zOworCSAgYnJlYWs7CisgICAgICAgIGNhc2UgdmFsaWRfZW50cnlfc3RhdHVzOgorCSAgaWYgKGhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwgcF9lLT5tX2hhc2gsCisJCQkJCSAgcl9rZXksIHBvc19oYXNoX3BhaXIuc2Vjb25kKSkKKyAgICAgICAgICAgIHsKKwkgICAgICByZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfZW5kKCk7CisJICAgICAgUEJfRFNfQ0hFQ0tfS0VZX0VYSVNUUyhyX2tleSkKKyAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHBvcywgcG9zX2hhc2hfcGFpci5zZWNvbmQpOworICAgICAgICAgICAgfQorCSAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoMCk7CisgICAgICAgIH07CisgICAgICByZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfY29sbGlzaW9uKCk7CisgICAgfQorICByZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfZW5kKCk7CisgIGlmIChpbnNfcG9zID09IG1fbnVtX2UpCisgICAgX190aHJvd19pbnNlcnRfZXJyb3IoKTsKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGluc19wb3MsIHBvc19oYXNoX3BhaXIuc2Vjb25kKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBzdGQ6OnBhaXI8dHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yLCBib29sPgorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5zZXJ0X2ltcChjb25zdF9yZWZlcmVuY2Ugcl92YWwsIHRydWVfdHlwZSkKK3sKKyAga2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSA9IFBCX0RTX1YyRihyX3ZhbCk7CisgIGNvbXBfaGFzaCBwb3NfaGFzaF9wYWlyID0gZmluZF9pbnNfcG9zKHJfa2V5LCAKKwkJCQkJIHRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvcik7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBvc19oYXNoX3BhaXIuZmlyc3QgPCBtX251bV9lKTsKKyAgZW50cnlfcG9pbnRlciBwX2UgPSYgbV9lbnRyaWVzW3Bvc19oYXNoX3BhaXIuZmlyc3RdOworICBpZiAocF9lLT5tX3N0YXQgPT0gdmFsaWRfZW50cnlfc3RhdHVzKQorICAgIHsKKyAgICAgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMocl9rZXkpCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoJnBfZS0+bV92YWx1ZSwgZmFsc2UpOworICAgIH0KKworICBQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1Qocl9rZXkpCisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpbnNlcnRfbmV3X2ltcChyX3ZhbCwgcG9zX2hhc2hfcGFpciksIHRydWUpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2l0ZXJhdG9yX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9pdGVyYXRvcl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDY0MTRmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9pdGVyYXRvcl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDgzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGdwX2hhc2hfdGFibGVfbWFwXy9pdGVyYXRvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyBpdGVyYXRvcnMgcmVsYXRlZCBmdW5jdGlvbnMsIGUuZy4sCisgKiBiZWdpbigpLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjpzX2VuZF9pdDsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OnNfY29uc3RfZW5kX2l0OworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oKQoreworICBwb2ludGVyXyBwX3ZhbHVlOworICBzaXplX3R5cGUgcG9zOworICBnZXRfc3RhcnRfaXRfc3RhdGUocF92YWx1ZSwgcG9zKTsKKyAgcmV0dXJuIGl0ZXJhdG9yKHBfdmFsdWUsIHBvcywgdGhpcyk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitlbmQoKQoreyByZXR1cm4gc19lbmRfaXQ7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JlZ2luKCkgY29uc3QKK3sKKyAgY29uc3RfcG9pbnRlcl8gcF92YWx1ZTsKKyAgc2l6ZV90eXBlIHBvczsKKyAgZ2V0X3N0YXJ0X2l0X3N0YXRlKHBfdmFsdWUsIHBvcyk7CisgIHJldHVybiBjb25zdF9pdGVyYXRvcihwX3ZhbHVlLCBwb3MsIHRoaXMpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKCkgY29uc3QKK3sgcmV0dXJuIHNfY29uc3RfZW5kX2l0OyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmYzYzU3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTAwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGdwX2hhc2hfdGFibGVfbWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIHBvbGljeSBhZ3Blc3MKKyAqIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworSGFzaF9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfaGFzaF9mbigpCit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQworY29uc3QgSGFzaF9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfaGFzaF9mbigpIGNvbnN0Cit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQworRXFfRm4mIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2VxX2ZuKCkKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCBFcV9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfZXFfZm4oKSBjb25zdAoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1Byb2JlX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9wcm9iZV9mbigpCit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQworY29uc3QgUHJvYmVfRm4mIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X3Byb2JlX2ZuKCkgY29uc3QKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitDb21iX1Byb2JlX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9jb21iX3Byb2JlX2ZuKCkKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCBDb21iX1Byb2JlX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9jb21iX3Byb2JlX2ZuKCkgY29uc3QKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitSZXNpemVfUG9saWN5JiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9yZXNpemVfcG9saWN5KCkKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCBSZXNpemVfUG9saWN5JiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9yZXNpemVfcG9saWN5KCkgY29uc3QKK3sgcmV0dXJuICp0aGlzOyB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vcmVzaXplX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOTgwOWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEzOSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBncF9oYXNoX3RhYmxlX21hcF8vcmVzaXplX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIHJlc2l6ZSByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2RvX3Jlc2l6ZV9pZl9uZWVkZWQoKQoreworICBpZiAoIXJlc2l6ZV9iYXNlOjppc19yZXNpemVfbmVlZGVkKCkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXNpemVfaW1wKHJlc2l6ZV9iYXNlOjpnZXRfbmV3X3NpemUobV9udW1fZSwgbV9udW1fdXNlZF9lKSk7CisgIHJldHVybiB0cnVlOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZG9fcmVzaXplKHNpemVfdHlwZSBuKQoreyByZXNpemVfaW1wKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZShuKSk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citkb19yZXNpemVfaWZfbmVlZGVkX25vX3Rocm93KCkKK3sKKyAgaWYgKCFyZXNpemVfYmFzZTo6aXNfcmVzaXplX25lZWRlZCgpKQorICAgIHJldHVybjsKKworICBfX3RyeQorICAgIHsKKyAgICAgIHJlc2l6ZV9pbXAocmVzaXplX2Jhc2U6OmdldF9uZXdfc2l6ZShtX251bV9lLCBtX251bV91c2VkX2UpKTsKKyAgICB9CisgIF9fY2F0Y2goLi4uKQorICAgIHsgfQorCisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVzaXplX2ltcChzaXplX3R5cGUgbmV3X3NpemUpCit7CisjaWZkZWYgUEJfRFNfUkVHUkVTU0lPTgorICB0eXBlbmFtZSBfQWxsb2M6Omdyb3VwX2FkanVzdG9yIGFkanVzdChtX251bV9lKTsKKyNlbmRpZiAKKworICBpZiAobmV3X3NpemUgPT0gbV9udW1fZSkKKyAgICByZXR1cm47CisKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIGNvbnN0IHNpemVfdHlwZSBvbGRfc2l6ZSA9IG1fbnVtX2U7CisgIGVudHJ5X2FycmF5IGFfZW50cmllc19yZXNpemVkID0gMDsKKworICAvLyBGb2xsb3dpbmcgbGluZSBtaWdodCB0aHJvdyBhbiBleGNlcHRpb24uCisgIGFfZW50cmllc19yZXNpemVkID0gc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUobmV3X3NpemUpOworCisgIHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChuZXdfc2l6ZSk7CisgIG1fbnVtX2UgPSBuZXdfc2l6ZTsKKworICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG1fbnVtX2U7ICsraSkKKyAgICBhX2VudHJpZXNfcmVzaXplZFtpXS5tX3N0YXQgPSBlbXB0eV9lbnRyeV9zdGF0dXM7CisKKyAgX190cnkKKyAgICB7CisgICAgICByZXNpemVfaW1wKGFfZW50cmllc19yZXNpemVkLCBvbGRfc2l6ZSk7CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7CisgICAgICBlcmFzZV9hbGxfdmFsaWRfZW50cmllcyhhX2VudHJpZXNfcmVzaXplZCwgbmV3X3NpemUpOworICAgICAgbV9udW1fZSA9IG9sZF9zaXplOworICAgICAgc19lbnRyeV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShhX2VudHJpZXNfcmVzaXplZCwgbmV3X3NpemUpOworICAgICAgcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om5vdGlmeV9yZXNpemVkKG9sZF9zaXplKTsKKyAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgIH0KKworICAvLyBBdCB0aGlzIHBvaW50IG5vIGV4Y2VwdGlvbnMgY2FuIGJlIHRocm93bi4KKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfZW50cnlfYXJyYXlfdmFsaWQoYV9lbnRyaWVzX3Jlc2l6ZWQsCisJCQkJCSAgICAgICB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IsCisJCQkJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18pOykKKworICBSZXNpemVfUG9saWN5Ojpub3RpZnlfcmVzaXplZChuZXdfc2l6ZSk7CisgIGVyYXNlX2FsbF92YWxpZF9lbnRyaWVzKG1fZW50cmllcywgb2xkX3NpemUpOworICBzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKG1fZW50cmllcywgb2xkX3NpemUpOworICBtX2VudHJpZXMgPSBhX2VudHJpZXNfcmVzaXplZDsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZXNpemVfaW1wKGVudHJ5X2FycmF5IGFfZW50cmllc19yZXNpemVkLCBzaXplX3R5cGUgb2xkX3NpemUpCit7CisgIGZvciAoc2l6ZV90eXBlIHBvcyA9IDA7IHBvcyA8IG9sZF9zaXplOyArK3BvcykKKyAgICBpZiAobV9lbnRyaWVzW3Bvc10ubV9zdGF0ID09IHZhbGlkX2VudHJ5X3N0YXR1cykKKyAgICAgIHJlc2l6ZV9pbXBfcmVhc3NpZ24obV9lbnRyaWVzICsgcG9zLCBhX2VudHJpZXNfcmVzaXplZCwgCisJCQkgIHRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvcik7Cit9CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcD4KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vcmVzaXplX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q3NjliYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vcmVzaXplX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw3MiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBncF9oYXNoX3RhYmxlX21hcF8vcmVzaXplX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBncF9odF9tYXBfJ3MgcmVzaXplIHJlbGF0ZWQgZnVuY3Rpb25zLCB3aGVuIHRoZQorICogaGFzaCB2YWx1ZSBpcyBub3Qgc3RvcmVkLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVzaXplX2ltcF9yZWFzc2lnbihlbnRyeV9wb2ludGVyIHBfZSwgZW50cnlfYXJyYXkgYV9lbnRyaWVzX3Jlc2l6ZWQsIAorCQkgICAgZmFsc2VfdHlwZSkKK3sKKyAga2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSA9IFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpOworICBzaXplX3R5cGUgaGFzaCA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5KTsKKyAgc2l6ZV90eXBlIGk7CisgIGZvciAoaSA9IDA7IGkgPCBtX251bV9lOyArK2kpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIHBvcyA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5LCBoYXNoLCBpKTsKKyAgICAgIGVudHJ5X3BvaW50ZXIgcF9uZXdfZSA9IGFfZW50cmllc19yZXNpemVkICsgcG9zOworICAgICAgc3dpdGNoKHBfbmV3X2UtPm1fc3RhdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIGVtcHR5X2VudHJ5X3N0YXR1czoKKwkgIG5ldyAoJnBfbmV3X2UtPm1fdmFsdWUpIHZhbHVlX3R5cGUocF9lLT5tX3ZhbHVlKTsKKwkgIHBfbmV3X2UtPm1fc3RhdCA9IHZhbGlkX2VudHJ5X3N0YXR1czsKKwkgIHJldHVybjsKKyAgICAgICAgY2FzZSBlcmFzZWRfZW50cnlfc3RhdHVzOgorCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKDApOworCSAgYnJlYWs7CisgICAgICAgIGNhc2UgdmFsaWRfZW50cnlfc3RhdHVzOgorCSAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoMCk7CisgICAgICAgIH07CisgICAgfQorICBfX3Rocm93X2luc2VydF9lcnJvcigpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTUxZGY0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDc0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGdwX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyByZXNpemUgcmVsYXRlZCBmdW5jdGlvbnMsIHdoZW4gdGhlCisgKiBoYXNoIHZhbHVlIGlzIHN0b3JlZC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3Jlc2l6ZV9pbXBfcmVhc3NpZ24oZW50cnlfcG9pbnRlciBwX2UsIGVudHJ5X2FycmF5IGFfZW50cmllc19yZXNpemVkLCAKKwkJICAgIHRydWVfdHlwZSkKK3sKKyAga2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSA9IFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpOworICBzaXplX3R5cGUgaGFzaCA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5LCBwX2UtPm1faGFzaCk7CisKKyAgc2l6ZV90eXBlIGk7CisgIGZvciAoaSA9IDA7IGkgPCBtX251bV9lOyArK2kpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIHBvcyA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5LCBoYXNoLCBpKTsKKyAgICAgIGVudHJ5X3BvaW50ZXIgcF9uZXdfZSA9IGFfZW50cmllc19yZXNpemVkICsgcG9zOworICAgICAgc3dpdGNoKHBfbmV3X2UtPm1fc3RhdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIGVtcHR5X2VudHJ5X3N0YXR1czoKKwkgIG5ldyAoJnBfbmV3X2UtPm1fdmFsdWUpIHZhbHVlX3R5cGUocF9lLT5tX3ZhbHVlKTsKKwkgIHBfbmV3X2UtPm1faGFzaCA9IGhhc2g7CisJICBwX25ld19lLT5tX3N0YXQgPSB2YWxpZF9lbnRyeV9zdGF0dXM7CisJICByZXR1cm47CisgICAgICAgIGNhc2UgZXJhc2VkX2VudHJ5X3N0YXR1czoKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCgwKTsKKwkgIGJyZWFrOworICAgICAgICBjYXNlIHZhbGlkX2VudHJ5X3N0YXR1czoKKwkgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKDApOworICAgICAgICB9OworICAgIH0KKyAgX190aHJvd19pbnNlcnRfZXJyb3IoKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy90cmFjZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vdHJhY2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhMzE5MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vdHJhY2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw3NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBncF9oYXNoX3RhYmxlX21hcF8vdHJhY2VfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBncF9odF9tYXBfJ3MgdHJhY2UtbW9kZSBmdW5jdGlvbnMuCisgKi8KKworI2lmZGVmIFBCX0RTX0hUX01BUF9UUkFDRV8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RyYWNlKCkgY29uc3QKK3sKKyAgc3RkOjpjZXJyIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KG1fbnVtX2UpIDw8ICIgIiA8PAorICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KG1fbnVtX3VzZWRfZSkgPDwgc3RkOjplbmRsOworCisgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbV9udW1fZTsgKytpKQorICAgIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihpKSA8PCAiICI7CisKKyAgICAgIHN3aXRjaChtX2VudHJpZXNbaV0ubV9zdGF0KQorICAgICAgICB7CisJY2FzZSBlbXB0eV9lbnRyeV9zdGF0dXM6CisJICBzdGQ6OmNlcnIgPDwgIjxlbXB0eT4iOworCSAgYnJlYWs7CisJY2FzZSBlcmFzZWRfZW50cnlfc3RhdHVzOgorCSAgc3RkOjpjZXJyIDw8ICI8ZXJhc2VkPiI7CisJICBicmVhazsKKwljYXNlIHZhbGlkX2VudHJ5X3N0YXR1czoKKwkgIHN0ZDo6Y2VyciA8PCBQQl9EU19WMkYobV9lbnRyaWVzW2ldLm1fdmFsdWUpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCgwKTsKKwl9OworCisgICAgICBzdGQ6OmNlcnIgPDwgc3RkOjplbmRsOworICAgIH0KK30KKworI2VuZGlmIC8vICNpZmRlZiBQQl9EU19IVF9NQVBfVFJBQ0VfCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9kaXJlY3RfbWFza19yYW5nZV9oYXNoaW5nX2ltcC5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9kaXJlY3RfbWFza19yYW5nZV9oYXNoaW5nX2ltcC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk4NzE1YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL2RpcmVjdF9tYXNrX3JhbmdlX2hhc2hpbmdfaW1wLmhwcApAQCAtMCwwICsxLDU4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGRpcmVjdF9tYXNrX3JhbmdlX2hhc2hpbmdfaW1wLmhwcAorICogQ29udGFpbnMgYSByYW5nZS1oYXNoaW5nIHBvbGljeSBpbXBsZW1lbnRhdGlvbgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sgbWFza19iYXNlZF9iYXNlOjpzd2FwKG90aGVyKTsgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIHNpemUpCit7IG1hc2tfYmFzZWRfYmFzZTo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitvcGVyYXRvcigpKHNpemVfdHlwZSBoYXNoKSBjb25zdAoreyByZXR1cm4gbWFza19iYXNlZF9iYXNlOjpyYW5nZV9oYXNoKGhhc2gpOyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL2RpcmVjdF9tb2RfcmFuZ2VfaGFzaGluZ19pbXAuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vZGlyZWN0X21vZF9yYW5nZV9oYXNoaW5nX2ltcC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM0NDQxZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL2RpcmVjdF9tb2RfcmFuZ2VfaGFzaGluZ19pbXAuaHBwCkBAIC0wLDAgKzEsNTggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZGlyZWN0X21vZF9yYW5nZV9oYXNoaW5nX2ltcC5ocHAKKyAqIENvbnRhaW5zIGEgcmFuZ2UtaGFzaGluZyBwb2xpY3kgaW1wbGVtZW50YXRpb24KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7IG1vZF9iYXNlZF9iYXNlOjpzd2FwKG90aGVyKTsgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIG4pCit7IG1vZF9iYXNlZF9iYXNlOjpub3RpZnlfcmVzaXplZChuKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK29wZXJhdG9yKCkoc2l6ZV90eXBlIGhhc2gpIGNvbnN0Cit7IHJldHVybiBtb2RfYmFzZWRfYmFzZTo6cmFuZ2VfaGFzaChoYXNoKTsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9saW5lYXJfcHJvYmVfZm5faW1wLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL2xpbmVhcl9wcm9iZV9mbl9pbXAuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZDc2OTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9saW5lYXJfcHJvYmVfZm5faW1wLmhwcApAQCAtMCwwICsxLDUzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGxpbmVhcl9wcm9iZV9mbl9pbXAuaHBwCisgKiBDb250YWlucyBhIHByb2JlIHBvbGljeSBpbXBsZW1lbnRhdGlvbgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitvcGVyYXRvcigpKHNpemVfdHlwZSBpKSBjb25zdAoreworICByZXR1cm4gKGkpOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vbWFza19iYXNlZF9yYW5nZV9oYXNoaW5nLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL21hc2tfYmFzZWRfcmFuZ2VfaGFzaGluZy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZlODkyZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL21hc2tfYmFzZWRfcmFuZ2VfaGFzaGluZy5ocHAKQEAgLTAsMCArMSwxMDEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbWFza19iYXNlZF9yYW5nZV9oYXNoaW5nLmhwcAorICogQ29udGFpbnMgYSByYW5nZSBoYXNoaW5nIHBvbGljeSBiYXNlLgorICovCisKKyNpZm5kZWYgUEJfRFNfTUFTS19CQVNFRF9SQU5HRV9IQVNISU5HX0hQUAorI2RlZmluZSBQQl9EU19NQVNLX0JBU0VEX1JBTkdFX0hBU0hJTkdfSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8vLyBSYW5nZSBoYXNoaW5nIHBvbGljeS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGU+CisgICAgY2xhc3MgbWFza19iYXNlZF9yYW5nZV9oYXNoaW5nCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgU2l6ZV9UeXBlIAlzaXplX3R5cGU7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAobWFza19iYXNlZF9yYW5nZV9oYXNoaW5nJiBvdGhlcikKKyAgICAgIHsgc3RkOjpzd2FwKG1fbWFzaywgb3RoZXIubV9tYXNrKTsgfQorCisgICAgICB2b2lkCisgICAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUgc2l6ZSk7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIHJhbmdlX2hhc2goc2l6ZV90eXBlIGhhc2gpIGNvbnN0CisgICAgICB7IHJldHVybiBzaXplX3R5cGUoaGFzaCAmIG1fbWFzayk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBzaXplX3R5cGUgCQltX21hc2s7CisgICAgICBjb25zdCBzdGF0aWMgc2l6ZV90eXBlIAlzX251bV9iaXRzX2luX3NpemVfdHlwZTsKKyAgICAgIGNvbnN0IHN0YXRpYyBzaXplX3R5cGUgCXNfaGlnaGVzdF9iaXRfMTsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9UeXBlPgorICAgIGNvbnN0IHR5cGVuYW1lIG1hc2tfYmFzZWRfcmFuZ2VfaGFzaGluZzxTaXplX1R5cGU+OjpzaXplX3R5cGUKKyAgICBtYXNrX2Jhc2VkX3JhbmdlX2hhc2hpbmc8U2l6ZV9UeXBlPjo6c19udW1fYml0c19pbl9zaXplX3R5cGUgPQorICAgICAgc2l6ZW9mKHR5cGVuYW1lIG1hc2tfYmFzZWRfcmFuZ2VfaGFzaGluZzxTaXplX1R5cGU+OjpzaXplX3R5cGUpIDw8IDM7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGU+CisgICAgY29uc3QgdHlwZW5hbWUgbWFza19iYXNlZF9yYW5nZV9oYXNoaW5nPFNpemVfVHlwZT46OnNpemVfdHlwZSBtYXNrX2Jhc2VkX3JhbmdlX2hhc2hpbmc8U2l6ZV9UeXBlPjo6c19oaWdoZXN0X2JpdF8xID0gc3RhdGljX2Nhc3Q8dHlwZW5hbWUgbWFza19iYXNlZF9yYW5nZV9oYXNoaW5nPFNpemVfVHlwZT46OnNpemVfdHlwZT4oMSkgPDwgKHNfbnVtX2JpdHNfaW5fc2l6ZV90eXBlIC0gMSk7CisKKyAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGU+CisgICAgdm9pZAorICAgIG1hc2tfYmFzZWRfcmFuZ2VfaGFzaGluZzxTaXplX1R5cGU+OjoKKyAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUgc2l6ZSkKKyAgICB7CisgICAgICBzaXplX3R5cGUgaSA9IDA7CisgICAgICB3aGlsZSAoc2l6ZSBeIHNfaGlnaGVzdF9iaXRfMSkKKwl7CisJICBzaXplIDw8PSAxOworCSAgKytpOworCX0KKworICAgICAgbV9tYXNrID0gMTsKKyAgICAgIGkgKz0gMjsKKyAgICAgIHdoaWxlIChpKysgPCBzX251bV9iaXRzX2luX3NpemVfdHlwZSkKKyAgICAgICAgbV9tYXNrID0gKG1fbWFzayA8PCAxKSBeIDE7CisgICAgfQorICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9tb2RfYmFzZWRfcmFuZ2VfaGFzaGluZy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9tb2RfYmFzZWRfcmFuZ2VfaGFzaGluZy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkzZjY4ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL21vZF9iYXNlZF9yYW5nZV9oYXNoaW5nLmhwcApAQCAtMCwwICsxLDc0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIG1vZF9iYXNlZF9yYW5nZV9oYXNoaW5nLmhwcAorICogQ29udGFpbnMgYSByYW5nZSBoYXNoaW5nIHBvbGljeSBiYXNlLgorICovCisKKyNpZm5kZWYgUEJfRFNfTU9EX0JBU0VEX1JBTkdFX0hBU0hJTkdfSFBQCisjZGVmaW5lIFBCX0RTX01PRF9CQVNFRF9SQU5HRV9IQVNISU5HX0hQUAorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gTW9kIGJhc2VkIHJhbmdlIGhhc2hpbmcuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9UeXBlPgorICAgIGNsYXNzIG1vZF9iYXNlZF9yYW5nZV9oYXNoaW5nCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgU2l6ZV9UeXBlIAlzaXplX3R5cGU7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAobW9kX2Jhc2VkX3JhbmdlX2hhc2hpbmcmIG90aGVyKQorICAgICAgeyBzdGQ6OnN3YXAobV9zaXplLCBvdGhlci5tX3NpemUpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIG5vdGlmeV9yZXNpemVkKHNpemVfdHlwZSBzKQorICAgICAgeyBtX3NpemUgPSBzOyB9CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIHJhbmdlX2hhc2goc2l6ZV90eXBlIHMpIGNvbnN0CisgICAgICB7IHJldHVybiBzICUgbV9zaXplOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgc2l6ZV90eXBlIG1fc2l6ZTsKKyAgICB9OworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKKworfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19NT0RfQkFTRURfUkFOR0VfSEFTSElOR19IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3Byb2JlX2ZuX2Jhc2UuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vcHJvYmVfZm5fYmFzZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhYjliMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3Byb2JlX2ZuX2Jhc2UuaHBwCkBAIC0wLDAgKzEsNjAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcHJvYmVfZm5fYmFzZS5ocHAKKyAqIENvbnRhaW5zIGEgcHJvYmUgcG9saWN5IGJhc2UuCisgKi8KKworI2lmbmRlZiBQQl9EU19QUk9CRV9GTl9CQVNFX0hQUAorI2RlZmluZSBQQl9EU19QUk9CRV9GTl9CQVNFX0hQUAorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIFByb2JlIGZ1bmN0b3IgYmFzZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgcHJvYmVfZm5fYmFzZQorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB+cHJvYmVfZm5fYmFzZSgpIHsgfQorICAgIH07Cit9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vcXVhZHJhdGljX3Byb2JlX2ZuX2ltcC5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9xdWFkcmF0aWNfcHJvYmVfZm5faW1wLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmE4M2FmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vcXVhZHJhdGljX3Byb2JlX2ZuX2ltcC5ocHAKQEAgLTAsMCArMSw1MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBxdWFkcmF0aWNfcHJvYmVfZm5faW1wLmhwcAorICogQ29udGFpbnMgYSBwcm9iZSBwb2xpY3kgaW1wbGVtZW50YXRpb24KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorb3BlcmF0b3IoKShzaXplX3R5cGUgaSkgY29uc3QKK3sKKyAgcmV0dXJuIChpKiAgaSk7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9yYW5nZWRfaGFzaF9mbi5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9yYW5nZWRfaGFzaF9mbi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyYjY4OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3JhbmdlZF9oYXNoX2ZuLmhwcApAQCAtMCwwICsxLDM1OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSByYW5nZWRfaGFzaF9mbi5ocHAKKyAqIENvbnRhaW5zIGEgdW5pZmllZCByYW5nZWQgaGFzaCBmdW5jdG9yLCBhbGxvd2luZyB0aGUgaGFzaCB0YWJsZXMKKyAqIHRvIGRlYWwgd2l0aCBhIHNpbmdsZSBjbGFzcyBmb3IgcmFuZ2VkIGhhc2hpbmcuCisgKi8KKworI2lmbmRlZiBQQl9EU19SQU5HRURfSEFTSF9GTl9IUFAKKyNkZWZpbmUgUEJfRFNfUkFOR0VEX0hBU0hfRk5fSFBQCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8vLyBQcmltYXJ5IHRlbXBsYXRlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgSGFzaF9GbiwgdHlwZW5hbWUgX0FsbG9jLCAKKwkgICAgIHR5cGVuYW1lIENvbWJfSGFzaF9GbiwgYm9vbCBTdG9yZV9IYXNoPgorICAgIGNsYXNzIHJhbmdlZF9oYXNoX2ZuOworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEhhc2hfRm4sIHR5cGVuYW1lIF9BbGxvYywgXAorCSAgICAgdHlwZW5hbWUgQ29tYl9IYXNoX0ZuPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICByYW5nZWRfaGFzaF9mbjxLZXksCUhhc2hfRm4sIF9BbGxvYywgQ29tYl9IYXNoX0ZuLCBmYWxzZT4KKworICAgIC8qKgorICAgICAqIFNwZWNpYWxpemF0aW9uIDEKKyAgICAgKiBUaGUgY2xpZW50IHN1cHBsaWVzIGEgaGFzaCBmdW5jdGlvbiBhbmQgYSByYW5nZWQgaGFzaCBmdW5jdGlvbiwKKyAgICAgKiBhbmQgcmVxdWVzdHMgdGhhdCBoYXNoIHZhbHVlcyBub3QgYmUgc3RvcmVkLgorICAgICAqKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEhhc2hfRm4sIHR5cGVuYW1lIF9BbGxvYywgCisJICAgICB0eXBlbmFtZSBDb21iX0hhc2hfRm4+CisgICAgY2xhc3MgcmFuZ2VkX2hhc2hfZm48IEtleSwgSGFzaF9GbiwgX0FsbG9jLCBDb21iX0hhc2hfRm4sIGZhbHNlPiAKKyAgICA6IHB1YmxpYyBIYXNoX0ZuLCBwdWJsaWMgQ29tYl9IYXNoX0ZuCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBIYXNoX0ZuIGhhc2hfZm5fYmFzZTsKKyAgICAgIHR5cGVkZWYgQ29tYl9IYXNoX0ZuIGNvbWJfaGFzaF9mbl9iYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDwgS2V5Pjo6b3RoZXIga2V5X2FsbG9jYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUga2V5X2FsbG9jYXRvcjo6Y29uc3RfcmVmZXJlbmNlIGtleV9jb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSk7CisKKyAgICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSwgY29uc3QgSGFzaF9GbiYpOworCisgICAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUsIGNvbnN0IEhhc2hfRm4mLCBjb25zdCBDb21iX0hhc2hfRm4mKTsKKworICAgICAgdm9pZAorICAgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB2b2lkCisgICAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUpOworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBvcGVyYXRvcigpKGtleV9jb25zdF9yZWZlcmVuY2UpIGNvbnN0OworICAgIH07CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUgc2l6ZSkKKyAgICB7IENvbWJfSGFzaF9Gbjo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSBzaXplLCBjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4pIAorICAgIDogSGFzaF9GbihyX2hhc2hfZm4pCisgICAgeyBDb21iX0hhc2hfRm46Om5vdGlmeV9yZXNpemVkKHNpemUpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUgc2l6ZSwgY29uc3QgSGFzaF9GbiYgcl9oYXNoX2ZuLCAKKwkJICAgY29uc3QgQ29tYl9IYXNoX0ZuJiByX2NvbWJfaGFzaF9mbikgCisgICAgOiBIYXNoX0ZuKHJfaGFzaF9mbiksIENvbWJfSGFzaF9GbihyX2NvbWJfaGFzaF9mbikKKyAgICB7IGNvbWJfaGFzaF9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQorICAgIHsKKyAgICAgIGNvbWJfaGFzaF9mbl9iYXNlOjpzd2FwKG90aGVyKTsKKyAgICAgIHN0ZDo6c3dhcCgoSGFzaF9GbiYgKSgqdGhpcyksIChIYXNoX0ZuJiApb3RoZXIpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUgc2l6ZSkKKyAgICB7IGNvbWJfaGFzaF9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBvcGVyYXRvcigpKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0CisgICAgeyByZXR1cm4gKGNvbWJfaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKGhhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSkpKTt9CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgSGFzaF9GbiwgdHlwZW5hbWUgX0FsbG9jLCBcCisJICAgICB0eXBlbmFtZSBDb21iX0hhc2hfRm4+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIHJhbmdlZF9oYXNoX2ZuPEtleSxIYXNoX0ZuLAlfQWxsb2MsIENvbWJfSGFzaF9GbiwgdHJ1ZT4KKworICAgIC8qKgorICAgICAqIFNwZWNpYWxpemF0aW9uIDIKKyAgICAgKiBUaGUgY2xpZW50IHN1cHBsaWVzIGEgaGFzaCBmdW5jdGlvbiBhbmQgYSByYW5nZWQgaGFzaCBmdW5jdGlvbiwKKyAgICAgKiBhbmQgcmVxdWVzdHMgdGhhdCBoYXNoIHZhbHVlcyBiZSBzdG9yZWQuCisgICAgICoqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgSGFzaF9GbiwgdHlwZW5hbWUgX0FsbG9jLAorCSAgICAgdHlwZW5hbWUgQ29tYl9IYXNoX0ZuPgorICAgIGNsYXNzIHJhbmdlZF9oYXNoX2ZuPEtleSwgSGFzaF9GbiwgX0FsbG9jLCBDb21iX0hhc2hfRm4sIHRydWU+IAorICAgIDogcHVibGljIEhhc2hfRm4sIHB1YmxpYyBDb21iX0hhc2hfRm4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cGFpcjxzaXplX3R5cGUsIHNpemVfdHlwZT4gY29tcF9oYXNoOworICAgICAgdHlwZWRlZiBIYXNoX0ZuIGhhc2hfZm5fYmFzZTsKKyAgICAgIHR5cGVkZWYgQ29tYl9IYXNoX0ZuIGNvbWJfaGFzaF9mbl9iYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxLZXk+OjpvdGhlciBrZXlfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBrZXlfYWxsb2NhdG9yOjpjb25zdF9yZWZlcmVuY2Uga2V5X2NvbnN0X3JlZmVyZW5jZTsKKworICAgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlKTsKKworICAgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlLCBjb25zdCBIYXNoX0ZuJik7CisKKyAgICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSwgY29uc3QgSGFzaF9GbiYsIGNvbnN0IENvbWJfSGFzaF9GbiYpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIG5vdGlmeV9yZXNpemVkKHNpemVfdHlwZSk7CisKKyAgICAgIGlubGluZSBjb21wX2hhc2gKKyAgICAgIG9wZXJhdG9yKCkoa2V5X2NvbnN0X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBjb21wX2hhc2gKKyAgICAgIG9wZXJhdG9yKCkoa2V5X2NvbnN0X3JlZmVyZW5jZSwgc2l6ZV90eXBlKSBjb25zdDsKKyAgICB9OworCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlIHNpemUpCisgICAgeyBDb21iX0hhc2hfRm46Om5vdGlmeV9yZXNpemVkKHNpemUpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUgc2l6ZSwgY29uc3QgSGFzaF9GbiYgcl9oYXNoX2ZuKSA6CisgICAgICBIYXNoX0ZuKHJfaGFzaF9mbikKKyAgICB7IENvbWJfSGFzaF9Gbjo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSBzaXplLCBjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4sIAorCQkgICBjb25zdCBDb21iX0hhc2hfRm4mIHJfY29tYl9oYXNoX2ZuKSAKKyAgICA6IEhhc2hfRm4ocl9oYXNoX2ZuKSwgQ29tYl9IYXNoX0ZuKHJfY29tYl9oYXNoX2ZuKQorICAgIHsgY29tYl9oYXNoX2ZuX2Jhc2U6Om5vdGlmeV9yZXNpemVkKHNpemUpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCisgICAgeworICAgICAgY29tYl9oYXNoX2ZuX2Jhc2U6OnN3YXAob3RoZXIpOworICAgICAgc3RkOjpzd2FwKChIYXNoX0ZuJiApKCp0aGlzKSwgKEhhc2hfRm4mIClvdGhlcik7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIG5vdGlmeV9yZXNpemVkKHNpemVfdHlwZSBzaXplKQorICAgIHsgY29tYl9oYXNoX2ZuX2Jhc2U6Om5vdGlmeV9yZXNpemVkKHNpemUpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29tcF9oYXNoCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIG9wZXJhdG9yKCkoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgaGFzaCA9IGhhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSk7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoY29tYl9oYXNoX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoaGFzaCksIGhhc2gpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb21wX2hhc2gKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgb3BlcmF0b3IoKQorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICAoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSwgc2l6ZV90eXBlIGhhc2gpIGNvbnN0CisjZWxzZSAKKyAgICAgIChrZXlfY29uc3RfcmVmZXJlbmNlIC8qcl9rZXkqLywgc2l6ZV90eXBlIGhhc2gpIGNvbnN0CisjZW5kaWYKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoaGFzaCA9PSBoYXNoX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXkpKTsKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihjb21iX2hhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShoYXNoKSwgaGFzaCk7CisgICAgfQorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgQ29tYl9IYXNoX0ZuPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICByYW5nZWRfaGFzaF9mbjxLZXksCW51bGxfdHlwZSwgX0FsbG9jLCBDb21iX0hhc2hfRm4sIGZhbHNlPgorCisgICAgLyoqCisgICAgICogU3BlY2lhbGl6YXRpb24gMworICAgICAqIFRoZSBjbGllbnQgZG9lcyBub3Qgc3VwcGx5IGEgaGFzaCBmdW5jdGlvbiAoYnkgc3BlY2lmeWluZworICAgICAqIG51bGxfdHlwZSBhcyB0aGUgSGFzaF9GbiBwYXJhbWV0ZXIpLCBhbmQgcmVxdWVzdHMgdGhhdCBoYXNoCisgICAgICogdmFsdWVzIG5vdCBiZSBzdG9yZWQuCisgICAgICoqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBDb21iX0hhc2hfRm4+CisgICAgY2xhc3MgcmFuZ2VkX2hhc2hfZm48S2V5LCBudWxsX3R5cGUsIF9BbGxvYywgQ29tYl9IYXNoX0ZuLCBmYWxzZT4gCisgICAgOiBwdWJsaWMgQ29tYl9IYXNoX0ZuCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBDb21iX0hhc2hfRm4gY29tYl9oYXNoX2ZuX2Jhc2U7CisKKyAgICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSk7CisKKyAgICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSwgY29uc3QgQ29tYl9IYXNoX0ZuJik7CisKKyAgICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSwgY29uc3QgbnVsbF90eXBlJiwgY29uc3QgQ29tYl9IYXNoX0ZuJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKyAgICB9OworCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlIHNpemUpCisgICAgeyBDb21iX0hhc2hfRm46Om5vdGlmeV9yZXNpemVkKHNpemUpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUgc2l6ZSwgY29uc3QgQ29tYl9IYXNoX0ZuJiByX2NvbWJfaGFzaF9mbikgOgorICAgICAgQ29tYl9IYXNoX0ZuKHJfY29tYl9oYXNoX2ZuKQorICAgIHsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlIHNpemUsIGNvbnN0IG51bGxfdHlwZSYgcl9udWxsX3R5cGUsIAorCQkgICBjb25zdCBDb21iX0hhc2hfRm4mIHJfY29tYl9oYXNoX2ZuKSAKKyAgICA6IENvbWJfSGFzaF9GbihyX2NvbWJfaGFzaF9mbikKKyAgICB7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKKyAgICB7IGNvbWJfaGFzaF9mbl9iYXNlOjpzd2FwKG90aGVyKTsgfQorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgQ29tYl9IYXNoX0ZuPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICByYW5nZWRfaGFzaF9mbjxLZXksCW51bGxfdHlwZSwgX0FsbG9jLCBDb21iX0hhc2hfRm4sIHRydWU+CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsaXphdGlvbiA0CisgICAgICogVGhlIGNsaWVudCBkb2VzIG5vdCBzdXBwbHkgYSBoYXNoIGZ1bmN0aW9uIChieSBzcGVjaWZ5aW5nCisgICAgICogbnVsbF90eXBlIGFzIHRoZSBIYXNoX0ZuIHBhcmFtZXRlciksIGFuZCByZXF1ZXN0cyB0aGF0IGhhc2gKKyAgICAgKiB2YWx1ZXMgYmUgc3RvcmVkLgorICAgICAqKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgQ29tYl9IYXNoX0ZuPgorICAgIGNsYXNzIHJhbmdlZF9oYXNoX2ZuPEtleSwgbnVsbF90eXBlLCBfQWxsb2MsIENvbWJfSGFzaF9GbiwgdHJ1ZT4gCisgICAgOiBwdWJsaWMgQ29tYl9IYXNoX0ZuCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBDb21iX0hhc2hfRm4gY29tYl9oYXNoX2ZuX2Jhc2U7CisKKyAgICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSk7CisKKyAgICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSwgY29uc3QgQ29tYl9IYXNoX0ZuJik7CisKKyAgICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSwgY29uc3QgbnVsbF90eXBlJiwgY29uc3QgQ29tYl9IYXNoX0ZuJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKyAgICB9OworCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlIHNpemUpCisgICAgeyBDb21iX0hhc2hfRm46Om5vdGlmeV9yZXNpemVkKHNpemUpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUgc2l6ZSwgY29uc3QgQ29tYl9IYXNoX0ZuJiByX2NvbWJfaGFzaF9mbikgCisgICAgOiBDb21iX0hhc2hfRm4ocl9jb21iX2hhc2hfZm4pCisgICAgeyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUgc2l6ZSwgY29uc3QgbnVsbF90eXBlJiByX251bGxfdHlwZSwgCisJCSAgIGNvbnN0IENvbWJfSGFzaF9GbiYgcl9jb21iX2hhc2hfZm4pIAorICAgIDogQ29tYl9IYXNoX0ZuKHJfY29tYl9oYXNoX2ZuKQorICAgIHsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQorICAgIHsgY29tYl9oYXNoX2ZuX2Jhc2U6OnN3YXAob3RoZXIpOyB9CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3JhbmdlZF9wcm9iZV9mbi5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9yYW5nZWRfcHJvYmVfZm4uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNmU4YWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9yYW5nZWRfcHJvYmVfZm4uaHBwCkBAIC0wLDAgKzEsMzI3IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHJhbmdlZF9wcm9iZV9mbi5ocHAKKyAqIENvbnRhaW5zIGEgdW5pZmllZCByYW5nZWQgcHJvYmUgZnVuY3RvciwgYWxsb3dpbmcgdGhlIHByb2JlIHRhYmxlcyB0byBkZWFsIHdpdGgKKyAqICAgIGEgc2luZ2xlIGNsYXNzIGZvciByYW5nZWQgcHJvYmVpbmcuCisgKi8KKworI2lmbmRlZiBQQl9EU19SQU5HRURfUFJPQkVfRk5fSFBQCisjZGVmaW5lIFBCX0RTX1JBTkdFRF9QUk9CRV9GTl9IUFAKKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIFByaW1hcnkgdGVtcGxhdGUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBIYXNoX0ZuLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgICB0eXBlbmFtZSBDb21iX1Byb2JlX0ZuLCB0eXBlbmFtZSBQcm9iZV9GbiwgYm9vbCBTdG9yZV9IYXNoPgorICAgIGNsYXNzIHJhbmdlZF9wcm9iZV9mbjsKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBIYXNoX0ZuLCB0eXBlbmFtZSBfQWxsb2MsIFwKKwkgICAgIHR5cGVuYW1lIENvbWJfUHJvYmVfRm4sIHR5cGVuYW1lIFByb2JlX0ZuPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICByYW5nZWRfcHJvYmVfZm48S2V5LCBIYXNoX0ZuLCBfQWxsb2MsIENvbWJfUHJvYmVfRm4sIFByb2JlX0ZuLCBmYWxzZT4KKworICAgIC8qKgorICAgICAqIFNwZWNpYWxpemF0aW9uIDEgICAgIAorICAgICAqIFRoZSBjbGllbnQgc3VwcGxpZXMgYSBwcm9iZSBmdW5jdGlvbiBhbmQgYSByYW5nZWQgcHJvYmUKKyAgICAgKiBmdW5jdGlvbiwgYW5kIHJlcXVlc3RzIHRoYXQgaGFzaCB2YWx1ZXMgbm90IGJlIHN0b3JlZC4KKyAgICAgKiovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBIYXNoX0ZuLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgICB0eXBlbmFtZSBDb21iX1Byb2JlX0ZuLCB0eXBlbmFtZSBQcm9iZV9Gbj4KKyAgICBjbGFzcyByYW5nZWRfcHJvYmVfZm48S2V5LCBIYXNoX0ZuLCBfQWxsb2MsIENvbWJfUHJvYmVfRm4sCisJCQkgIFByb2JlX0ZuLCBmYWxzZT4gCisgICAgOiBwdWJsaWMgSGFzaF9GbiwgcHVibGljIENvbWJfUHJvYmVfRm4sIHB1YmxpYyBQcm9iZV9GbgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgQ29tYl9Qcm9iZV9GbiBjb21iX3Byb2JlX2ZuX2Jhc2U7CisgICAgICB0eXBlZGVmIEhhc2hfRm4gaGFzaF9mbl9iYXNlOworICAgICAgdHlwZWRlZiBQcm9iZV9GbiBwcm9iZV9mbl9iYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxLZXk+OjpvdGhlciBrZXlfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBrZXlfYWxsb2NhdG9yOjpjb25zdF9yZWZlcmVuY2Uga2V5X2NvbnN0X3JlZmVyZW5jZTsKKworICAgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSk7CisKKyAgICAgIHJhbmdlZF9wcm9iZV9mbihzaXplX3R5cGUsIGNvbnN0IEhhc2hfRm4mKTsKKworICAgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSwgY29uc3QgSGFzaF9GbiYsIGNvbnN0IENvbWJfUHJvYmVfRm4mKTsKKworICAgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSwgY29uc3QgSGFzaF9GbiYsIGNvbnN0IENvbWJfUHJvYmVfRm4mLCAKKwkJICAgICAgY29uc3QgUHJvYmVfRm4mKTsKKworICAgICAgdm9pZAorICAgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB2b2lkCisgICAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUpOworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBvcGVyYXRvcigpKGtleV9jb25zdF9yZWZlcmVuY2UpIGNvbnN0OworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBvcGVyYXRvcigpKGtleV9jb25zdF9yZWZlcmVuY2UsIHNpemVfdHlwZSwgc2l6ZV90eXBlKSBjb25zdDsKKyAgICB9OworCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSBzaXplKQorICAgIHsgQ29tYl9Qcm9iZV9Gbjo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJhbmdlZF9wcm9iZV9mbihzaXplX3R5cGUgc2l6ZSwgY29uc3QgSGFzaF9GbiYgcl9oYXNoX2ZuKSAKKyAgICA6IEhhc2hfRm4ocl9oYXNoX2ZuKQorICAgIHsgQ29tYl9Qcm9iZV9Gbjo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJhbmdlZF9wcm9iZV9mbihzaXplX3R5cGUgc2l6ZSwgY29uc3QgSGFzaF9GbiYgcl9oYXNoX2ZuLCAKKwkJICAgIGNvbnN0IENvbWJfUHJvYmVfRm4mIHJfY29tYl9wcm9iZV9mbikgCisgICAgOiBIYXNoX0ZuKHJfaGFzaF9mbiksIENvbWJfUHJvYmVfRm4ocl9jb21iX3Byb2JlX2ZuKQorICAgIHsgY29tYl9wcm9iZV9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSBzaXplLCBjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4sIAorCQkgICAgY29uc3QgQ29tYl9Qcm9iZV9GbiYgcl9jb21iX3Byb2JlX2ZuLCAKKwkJICAgIGNvbnN0IFByb2JlX0ZuJiByX3Byb2JlX2ZuKSAKKyAgICA6IEhhc2hfRm4ocl9oYXNoX2ZuKSwgQ29tYl9Qcm9iZV9GbihyX2NvbWJfcHJvYmVfZm4pLCBQcm9iZV9GbihyX3Byb2JlX2ZuKQorICAgIHsgY29tYl9wcm9iZV9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQorICAgIHsKKyAgICAgIGNvbWJfcHJvYmVfZm5fYmFzZTo6c3dhcChvdGhlcik7CisgICAgICBzdGQ6OnN3YXAoKEhhc2hfRm4mICkoKnRoaXMpLCAoSGFzaF9GbiYpb3RoZXIpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUgc2l6ZSkKKyAgICB7IGNvbWJfcHJvYmVfZm5fYmFzZTo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgb3BlcmF0b3IoKShrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KSBjb25zdAorICAgIHsgcmV0dXJuIGNvbWJfcHJvYmVfZm5fYmFzZTo6b3BlcmF0b3IoKShoYXNoX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXkpKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBvcGVyYXRvcigpKGtleV9jb25zdF9yZWZlcmVuY2UsIHNpemVfdHlwZSBoYXNoLCBzaXplX3R5cGUgaSkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gY29tYl9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKGhhc2ggKyBwcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKGkpKTsKKyAgICB9CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgSGFzaF9GbiwgdHlwZW5hbWUgX0FsbG9jLCBcCisJICAgICB0eXBlbmFtZSBDb21iX1Byb2JlX0ZuLCB0eXBlbmFtZSBQcm9iZV9Gbj4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICAgcmFuZ2VkX3Byb2JlX2ZuPEtleSwgSGFzaF9GbiwgX0FsbG9jLCBDb21iX1Byb2JlX0ZuLCBQcm9iZV9GbiwgdHJ1ZT4KKworICAgIC8qKgorICAgICAqIFNwZWNpYWxpemF0aW9uIDItIFRoZSBjbGllbnQgc3VwcGxpZXMgYSBwcm9iZSBmdW5jdGlvbiBhbmQgYSByYW5nZWQKKyAgICAgKiAgICBwcm9iZSBmdW5jdGlvbiwgYW5kIHJlcXVlc3RzIHRoYXQgaGFzaCB2YWx1ZXMgbm90IGJlIHN0b3JlZC4KKyAgICAgKiovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBIYXNoX0ZuLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgICB0eXBlbmFtZSBDb21iX1Byb2JlX0ZuLCB0eXBlbmFtZSBQcm9iZV9Gbj4KKyAgICBjbGFzcyByYW5nZWRfcHJvYmVfZm48S2V5LCBIYXNoX0ZuLCBfQWxsb2MsIENvbWJfUHJvYmVfRm4sIAorCQkJICBQcm9iZV9GbiwgdHJ1ZT4gCisgICAgOiBwdWJsaWMgSGFzaF9GbiwgcHVibGljIENvbWJfUHJvYmVfRm4sIHB1YmxpYyBQcm9iZV9GbgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwYWlyPHNpemVfdHlwZSwgc2l6ZV90eXBlPiBjb21wX2hhc2g7CisgICAgICB0eXBlZGVmIENvbWJfUHJvYmVfRm4gY29tYl9wcm9iZV9mbl9iYXNlOworICAgICAgdHlwZWRlZiBIYXNoX0ZuIGhhc2hfZm5fYmFzZTsKKyAgICAgIHR5cGVkZWYgUHJvYmVfRm4gcHJvYmVfZm5fYmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8S2V5Pjo6b3RoZXIga2V5X2FsbG9jYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUga2V5X2FsbG9jYXRvcjo6Y29uc3RfcmVmZXJlbmNlIGtleV9jb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHJhbmdlZF9wcm9iZV9mbihzaXplX3R5cGUpOworCisgICAgICByYW5nZWRfcHJvYmVfZm4oc2l6ZV90eXBlLCBjb25zdCBIYXNoX0ZuJik7CisKKyAgICAgIHJhbmdlZF9wcm9iZV9mbihzaXplX3R5cGUsIGNvbnN0IEhhc2hfRm4mLCAKKwkJICAgICAgY29uc3QgQ29tYl9Qcm9iZV9GbiYpOworCisgICAgICByYW5nZWRfcHJvYmVfZm4oc2l6ZV90eXBlLCBjb25zdCBIYXNoX0ZuJiwgY29uc3QgQ29tYl9Qcm9iZV9GbiYsIAorCQkgICAgICBjb25zdCBQcm9iZV9GbiYpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIG5vdGlmeV9yZXNpemVkKHNpemVfdHlwZSk7CisKKyAgICAgIGlubGluZSBjb21wX2hhc2gKKyAgICAgIG9wZXJhdG9yKCkoa2V5X2NvbnN0X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoa2V5X2NvbnN0X3JlZmVyZW5jZSwgc2l6ZV90eXBlLCBzaXplX3R5cGUpIGNvbnN0OworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBvcGVyYXRvcigpKGtleV9jb25zdF9yZWZlcmVuY2UsIHNpemVfdHlwZSkgY29uc3Q7CisgICAgfTsKKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJhbmdlZF9wcm9iZV9mbihzaXplX3R5cGUgc2l6ZSkKKyAgICB7IENvbWJfUHJvYmVfRm46Om5vdGlmeV9yZXNpemVkKHNpemUpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByYW5nZWRfcHJvYmVfZm4oc2l6ZV90eXBlIHNpemUsIGNvbnN0IEhhc2hfRm4mIHJfaGFzaF9mbikgCisgICAgOiBIYXNoX0ZuKHJfaGFzaF9mbikKKyAgICB7IENvbWJfUHJvYmVfRm46Om5vdGlmeV9yZXNpemVkKHNpemUpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByYW5nZWRfcHJvYmVfZm4oc2l6ZV90eXBlIHNpemUsIGNvbnN0IEhhc2hfRm4mIHJfaGFzaF9mbiwgCisJCSAgICBjb25zdCBDb21iX1Byb2JlX0ZuJiByX2NvbWJfcHJvYmVfZm4pIAorICAgIDogSGFzaF9GbihyX2hhc2hfZm4pLCBDb21iX1Byb2JlX0ZuKHJfY29tYl9wcm9iZV9mbikKKyAgICB7IGNvbWJfcHJvYmVfZm5fYmFzZTo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJhbmdlZF9wcm9iZV9mbihzaXplX3R5cGUgc2l6ZSwgY29uc3QgSGFzaF9GbiYgcl9oYXNoX2ZuLCAKKwkJICAgIGNvbnN0IENvbWJfUHJvYmVfRm4mIHJfY29tYl9wcm9iZV9mbiwgCisJCSAgICBjb25zdCBQcm9iZV9GbiYgcl9wcm9iZV9mbikgCisgICAgOiBIYXNoX0ZuKHJfaGFzaF9mbiksIENvbWJfUHJvYmVfRm4ocl9jb21iX3Byb2JlX2ZuKSwgUHJvYmVfRm4ocl9wcm9iZV9mbikKKyAgICB7IGNvbWJfcHJvYmVfZm5fYmFzZTo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKKyAgICB7CisgICAgICBjb21iX3Byb2JlX2ZuX2Jhc2U6OnN3YXAob3RoZXIpOworICAgICAgc3RkOjpzd2FwKChIYXNoX0ZuJiApKCp0aGlzKSwgKEhhc2hfRm4mIClvdGhlcik7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIG5vdGlmeV9yZXNpemVkKHNpemVfdHlwZSBzaXplKQorICAgIHsgY29tYl9wcm9iZV9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbXBfaGFzaAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBvcGVyYXRvcigpKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0CisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIGhhc2ggPSBoYXNoX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXkpOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGNvbWJfcHJvYmVfZm5fYmFzZTo6b3BlcmF0b3IoKShoYXNoKSwgaGFzaCk7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBvcGVyYXRvcigpKGtleV9jb25zdF9yZWZlcmVuY2UsIHNpemVfdHlwZSBoYXNoLCBzaXplX3R5cGUgaSkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gY29tYl9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKGhhc2ggKyBwcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKGkpKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIG9wZXJhdG9yKCkKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXksIHNpemVfdHlwZSBoYXNoKSBjb25zdAorI2Vsc2UgCisgICAgICAoa2V5X2NvbnN0X3JlZmVyZW5jZSAvKnJfa2V5Ki8sIHNpemVfdHlwZSBoYXNoKSBjb25zdAorI2VuZGlmIAorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChoYXNoID09IGhhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSkpOworICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCisgICAgLyoqCisgICAgICogU3BlY2lhbGl6YXRpb24gMyBhbmQgNAorICAgICAqIFRoZSBjbGllbnQgZG9lcyBub3Qgc3VwcGx5IGEgaGFzaCBmdW5jdGlvbiBvciBwcm9iZSBmdW5jdGlvbiwKKyAgICAgKiBhbmQgcmVxdWVzdHMgdGhhdCBoYXNoIHZhbHVlcyBub3QgYmUgc3RvcmVkLgorICAgICAqKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgQ29tYl9Qcm9iZV9Gbj4KKyAgICBjbGFzcyByYW5nZWRfcHJvYmVfZm48S2V5LCBudWxsX3R5cGUsIF9BbGxvYywgQ29tYl9Qcm9iZV9GbiwgCisJCQkgIG51bGxfdHlwZSwgZmFsc2U+IAorICAgIDogcHVibGljIENvbWJfUHJvYmVfRm4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIENvbWJfUHJvYmVfRm4gY29tYl9wcm9iZV9mbl9iYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxLZXk+OjpvdGhlciBrZXlfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBrZXlfYWxsb2NhdG9yOjpjb25zdF9yZWZlcmVuY2Uga2V5X2NvbnN0X3JlZmVyZW5jZTsKKworICAgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSBzaXplKQorICAgICAgeyBDb21iX1Byb2JlX0ZuOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgICByYW5nZWRfcHJvYmVfZm4oc2l6ZV90eXBlLCBjb25zdCBDb21iX1Byb2JlX0ZuJiByX2NvbWJfcHJvYmVfZm4pCisgICAgICA6IENvbWJfUHJvYmVfRm4ocl9jb21iX3Byb2JlX2ZuKQorICAgICAgeyB9CisKKyAgICAgIHJhbmdlZF9wcm9iZV9mbihzaXplX3R5cGUsIGNvbnN0IG51bGxfdHlwZSYsIAorCQkgICAgICBjb25zdCBDb21iX1Byb2JlX0ZuJiByX2NvbWJfcHJvYmVfZm4sIAorCQkgICAgICBjb25zdCBudWxsX3R5cGUmKQorICAgICAgOiBDb21iX1Byb2JlX0ZuKHJfY29tYl9wcm9iZV9mbikKKyAgICAgIHsgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHJhbmdlZF9wcm9iZV9mbiYgb3RoZXIpCisgICAgICB7IGNvbWJfcHJvYmVfZm5fYmFzZTo6c3dhcChvdGhlcik7IH0KKyAgICB9OworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3NhbXBsZV9wcm9iZV9mbi5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9zYW1wbGVfcHJvYmVfZm4uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0M2Y3MjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9zYW1wbGVfcHJvYmVfZm4uaHBwCkBAIC0wLDAgKzEsNjggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc2FtcGxlX3Byb2JlX2ZuLmhwcAorICogQ29udGFpbnMgYSBzYW1wbGUgcHJvYmUgcG9saWN5LgorICovCisKKyNpZm5kZWYgUEJfRFNfU0FNUExFX1BST0JFX0ZOX0hQUAorI2RlZmluZSBQQl9EU19TQU1QTEVfUFJPQkVfRk5fSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIC8vLyBBIHNhbXBsZSBwcm9iZSBwb2xpY3kuCisgIGNsYXNzIHNhbXBsZV9wcm9iZV9mbgorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IHNpemVfdHlwZTsKKworICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIHNhbXBsZV9wcm9iZV9mbigpOworCisgICAgLy8vIENvcHkgY29uc3RydWN0b3IuCisgICAgc2FtcGxlX3Byb2JlX2ZuKGNvbnN0IHNhbXBsZV9wcm9iZV9mbiYpOworCisgICAgLy8vIFN3YXBzIGNvbnRlbnQuCisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHNhbXBsZV9wcm9iZV9mbiYpOworCisgIHByb3RlY3RlZDoKKyAgICAvLy8gUmV0dXJucyB0aGUgaS10aCBvZmZzZXQgZnJvbSB0aGUgaGFzaCB2YWx1ZSBvZiBzb21lIGtleSByX2tleS4KKyAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgb3BlcmF0b3IoKShrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5LCBzaXplX3R5cGUgaSkgY29uc3Q7CisgIH07Cit9CisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19TQU1QTEVfUFJPQkVfRk5fSFBQCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9zYW1wbGVfcmFuZ2VfaGFzaGluZy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9zYW1wbGVfcmFuZ2VfaGFzaGluZy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYwNDAwNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3NhbXBsZV9yYW5nZV9oYXNoaW5nLmhwcApAQCAtMCwwICsxLDc0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHNhbXBsZV9yYW5nZV9oYXNoaW5nLmhwcAorICogQ29udGFpbnMgYSByYW5nZSBoYXNoaW5nIHBvbGljeS4KKyAqLworCisjaWZuZGVmIFBCX0RTX1NBTVBMRV9SQU5HRV9IQVNISU5HX0hQUAorI2RlZmluZSBQQl9EU19TQU1QTEVfUkFOR0VfSEFTSElOR19IUFAKKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgLy8vIEEgc2FtcGxlIHJhbmdlLWhhc2hpbmcgZnVuY3Rvci4KKyAgY2xhc3Mgc2FtcGxlX3JhbmdlX2hhc2hpbmcKKyAgeworICBwdWJsaWM6CisgICAgLy8vIFNpemUgdHlwZS4KKyAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IHNpemVfdHlwZTsKKworICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIHNhbXBsZV9yYW5nZV9oYXNoaW5nKCk7CisKKyAgICAvLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgICBzYW1wbGVfcmFuZ2VfaGFzaGluZyhjb25zdCBzYW1wbGVfcmFuZ2VfaGFzaGluZyYgb3RoZXIpOworCisgICAgLy8vIFN3YXBzIGNvbnRlbnQuCisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHNhbXBsZV9yYW5nZV9oYXNoaW5nJiBvdGhlcik7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vLyBOb3RpZmllcyB0aGUgcG9saWN5IG9iamVjdCB0aGF0IHRoZSBjb250YWluZXIncyBzaXplIGhhcworICAgIC8vLyBjaGFuZ2VkIHRvIGFyZ3VtZW50J3Mgc2l6ZS4KKyAgICB2b2lkCisgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlKTsKKworICAgIC8vLyBUcmFuc2Zvcm1zIHRoZSBfX2hhc2ggdmFsdWUgaGFzaCBpbnRvIGEgcmFuZ2VkLWhhc2ggdmFsdWUuCisgICAgaW5saW5lIHNpemVfdHlwZQorICAgIG9wZXJhdG9yKCkoc2l6ZV90eXBlICkgY29uc3Q7CisgIH07Cit9CisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19TQU1QTEVfUkFOR0VfSEFTSElOR19IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3NhbXBsZV9yYW5nZWRfaGFzaF9mbi5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9zYW1wbGVfcmFuZ2VkX2hhc2hfZm4uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MmNiYzAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9zYW1wbGVfcmFuZ2VkX2hhc2hfZm4uaHBwCkBAIC0wLDAgKzEsNzUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc2FtcGxlX3JhbmdlZF9oYXNoX2ZuLmhwcAorICogQ29udGFpbnMgYSByYW5nZWQgaGFzaCBwb2xpY3kuCisgKi8KKworI2lmbmRlZiBQQl9EU19TQU1QTEVfUkFOR0VEX0hBU0hfRk5fSFBQCisjZGVmaW5lIFBCX0RTX1NBTVBMRV9SQU5HRURfSEFTSF9GTl9IUFAKKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgLy8vIEEgc2FtcGxlIHJhbmdlZC1oYXNoIGZ1bmN0b3IuCisgIGNsYXNzIHNhbXBsZV9yYW5nZWRfaGFzaF9mbgorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IHNpemVfdHlwZTsKKworICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIHNhbXBsZV9yYW5nZWRfaGFzaF9mbigpOworCisgICAgLy8vIENvcHkgY29uc3RydWN0b3IuCisgICAgc2FtcGxlX3JhbmdlZF9oYXNoX2ZuKGNvbnN0IHNhbXBsZV9yYW5nZWRfaGFzaF9mbiYpOworCisgICAgLy8vIFN3YXBzIGNvbnRlbnQuCisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHNhbXBsZV9yYW5nZWRfaGFzaF9mbiYpOworCisgIHByb3RlY3RlZDoKKworICAgIC8vLyBOb3RpZmllcyB0aGUgcG9saWN5IG9iamVjdCB0aGF0IHRoZSBjb250YWluZXIncyBfX3NpemUgaGFzCisgICAgLy8vIGNoYW5nZWQgdG8gc2l6ZS4KKyAgICB2b2lkCisgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlKTsKKworICAgIC8vLyBUcmFuc2Zvcm1zIGtleV9jb25zdF9yZWZlcmVuY2UgaW50byBhIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGFibGUuCisgICAgaW5saW5lIHNpemVfdHlwZQorICAgIG9wZXJhdG9yKCkoa2V5X2NvbnN0X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgfTsKK30KKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX1NBTVBMRV9SQU5HRURfSEFTSF9GTl9IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3NhbXBsZV9yYW5nZWRfcHJvYmVfZm4uaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vc2FtcGxlX3JhbmdlZF9wcm9iZV9mbi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1NDMxZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3NhbXBsZV9yYW5nZWRfcHJvYmVfZm4uaHBwCkBAIC0wLDAgKzEsNzcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc2FtcGxlX3JhbmdlZF9wcm9iZV9mbi5ocHAKKyAqIENvbnRhaW5zIGEgcmFuZ2VkIHByb2JlIHBvbGljeS4KKyAqLworCisjaWZuZGVmIFBCX0RTX1NBTVBMRV9SQU5HRURfUFJPQkVfRk5fSFBQCisjZGVmaW5lIFBCX0RTX1NBTVBMRV9SQU5HRURfUFJPQkVfRk5fSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIC8vLyBBIHNhbXBsZSByYW5nZWQtcHJvYmUgZnVuY3Rvci4KKyAgY2xhc3Mgc2FtcGxlX3JhbmdlZF9wcm9iZV9mbgorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IAlzaXplX3R5cGU7CisKKyAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIHNhbXBsZV9yYW5nZWRfcHJvYmVfZm4oKTsKKworICAgIC8vIENvcHkgY29uc3RydWN0b3IuCisgICAgc2FtcGxlX3JhbmdlZF9wcm9iZV9mbihjb25zdCBzYW1wbGVfcmFuZ2VkX3Byb2JlX2ZuJik7CisKKyAgICAvLyBTd2FwcyBjb250ZW50LgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChzYW1wbGVfcmFuZ2VkX3Byb2JlX2ZuJik7CisKKyAgcHJvdGVjdGVkOgorCisgICAgLy8gTm90aWZpZXMgdGhlIHBvbGljeSBvYmplY3QgdGhhdCB0aGUgY29udGFpbmVyJ3MgX19zaXplIGhhcworICAgIC8vIGNoYW5nZWQgdG8gc2l6ZS4KKyAgICB2b2lkCisgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlKTsKKworICAgIC8vIFRyYW5zZm9ybXMgdGhlIGNvbnN0IGtleSByZWZlcmVuY2Ugcl9rZXkgaW50byB0aGUgaS10aCBwb3NpdGlvbgorICAgIC8vIHdpdGhpbiB0aGUgdGFibGUuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmb3IgZWFjaCBjb2xsaXNpb24gd2l0aGluCisgICAgLy8gdGhlIHByb2JlIHNlcXVlbmNlLgorICAgIGlubGluZSBzaXplX3R5cGUKKyAgICBvcGVyYXRvcigpKGtleV9jb25zdF9yZWZlcmVuY2UsIHN0ZDo6c2l6ZV90LCBzaXplX3R5cGUpIGNvbnN0OworCisgIH07Cit9CisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19TQU1QTEVfUkFOR0VEX1BST0JFX0ZOX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2NvbnN0X2l0ZXJhdG9yLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9jb25zdF9pdGVyYXRvci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIwN2ExYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9jb25zdF9pdGVyYXRvci5ocHAKQEAgLTAsMCArMSwxNTkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vY29uc3RfaXRlcmF0b3IuaHBwCisgKiBDb250YWlucyBhbiBpdGVyYXRvciBjbGFzcyByZXR1cm5lZCBieSB0aGUgdGFibGUncyBjb25zdCBmaW5kIGFuZCBpbnNlcnQKKyAqIG1ldGhvZHMuCisgKi8KKworI2lmbmRlZiBQQl9EU19MRUZUX0NISUxEX05FWFRfU0lCTElOR19IRUFQX0NPTlNUX0lURVJBVE9SX0hQUAorI2RlZmluZSBQQl9EU19MRUZUX0NISUxEX05FWFRfU0lCTElOR19IRUFQX0NPTlNUX0lURVJBVE9SX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9wb2ludF9jb25zdF9pdGVyYXRvci5ocHA+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDICBcCisgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9jb25zdF9pdGVyYXRvcl88Tm9kZSwgX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX0JBU0lDX0hFQVBfQ0lUX0JBU0UgXAorICAgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfbm9kZV9wb2ludF9jb25zdF9pdGVyYXRvcl88Tm9kZSwgX0FsbG9jPgorCisgICAgLy8vIENvbnN0IHBvaW50LXR5cGUgaXRlcmF0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfY29uc3RfaXRlcmF0b3JfCisgICAgOiBwdWJsaWMgUEJfRFNfQkFTSUNfSEVBUF9DSVRfQkFTRQorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBQQl9EU19CQVNJQ19IRUFQX0NJVF9CQVNFIAkgICAgICAJYmFzZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om5vZGVfcG9pbnRlcgkJbm9kZV9wb2ludGVyOworCisgICAgcHVibGljOgorICAgICAgLy8vIENhdGVnb3J5LgorICAgICAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnIAkJaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIC8vLyBEaWZmZXJlbmNlIHR5cGUuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6ZGlmZmVyZW5jZV90eXBlIAkJZGlmZmVyZW5jZV90eXBlOworCisgICAgICAvLy8gSXRlcmF0b3IncyB2YWx1ZSB0eXBlLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnZhbHVlX3R5cGUgCQl2YWx1ZV90eXBlOworCisgICAgICAvLy8gSXRlcmF0b3IncyBwb2ludGVyIHR5cGUuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRlciAJCXBvaW50ZXI7CisKKyAgICAgIC8vLyBJdGVyYXRvcidzIGNvbnN0IHBvaW50ZXIgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9wb2ludGVyIAljb25zdF9wb2ludGVyOworCisgICAgICAvLy8gSXRlcmF0b3IncyByZWZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpyZWZlcmVuY2UgCQlyZWZlcmVuY2U7CisKKyAgICAgIC8vLyBJdGVyYXRvcidzIGNvbnN0IHJlZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSAJY29uc3RfcmVmZXJlbmNlOworCisgICAgICBpbmxpbmUKKyAgICAgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfY29uc3RfaXRlcmF0b3JfKG5vZGVfcG9pbnRlciBwX25kKQorICAgICAgOiBiYXNlX3R5cGUocF9uZCkKKyAgICAgIHsgfQorCisgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgIGlubGluZQorICAgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9jb25zdF9pdGVyYXRvcl8oKQorICAgICAgeyB9CisKKyAgICAgIC8vLyBDb3B5IGNvbnN0cnVjdG9yLgorICAgICAgaW5saW5lCisgICAgICBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwX2NvbnN0X2l0ZXJhdG9yXyhjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpIDogYmFzZV90eXBlKG90aGVyKQorICAgICAgeyB9CisKKyAgICAgIC8vLyBDb21wYXJlcyBjb250ZW50IHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yIG9iamVjdC4KKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gKGJhc2VfdHlwZTo6bV9wX25kID09IG90aGVyLm1fcF9uZCk7IH0KKworICAgICAgLy8vIENvbXBhcmVzIGNvbnRlbnQgKG5lZ2F0aXZlbHkpIHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yIG9iamVjdC4KKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gKGJhc2VfdHlwZTo6bV9wX25kICE9IG90aGVyLm1fcF9uZCk7IH0KKworICAgICAgUEJfRFNfQ0xBU1NfQ19ERUMmCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmFzZV90eXBlOjptX3BfbmQgIT0gMCk7CisJaW5jKCk7CisJcmV0dXJuICgqdGhpcyk7CisgICAgICB9CisKKyAgICAgIFBCX0RTX0NMQVNTX0NfREVDCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlQQl9EU19DTEFTU19DX0RFQyByZXRfaXQoYmFzZV90eXBlOjptX3BfbmQpOworCW9wZXJhdG9yKysoKTsKKwlyZXR1cm4gKHJldF9pdCk7CisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgaW5jKCkKKyAgICAgIHsKKwlpZiAoYmFzZV90eXBlOjptX3BfbmQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCkKKwkgIHsKKwkgICAgYmFzZV90eXBlOjptX3BfbmQgPSBiYXNlX3R5cGU6Om1fcF9uZC0+bV9wX25leHRfc2libGluZzsKKwkgICAgd2hpbGUgKGJhc2VfdHlwZTo6bV9wX25kLT5tX3BfbF9jaGlsZCAhPSAwKQorCSAgICAgIGJhc2VfdHlwZTo6bV9wX25kID0gYmFzZV90eXBlOjptX3BfbmQtPm1fcF9sX2NoaWxkOworCSAgICByZXR1cm47CisJICB9CisKKwl3aGlsZSAodHJ1ZSkKKwkgIHsKKwkgICAgbm9kZV9wb2ludGVyIHBfbmV4dCA9IGJhc2VfdHlwZTo6bV9wX25kOworCSAgICBiYXNlX3R5cGU6Om1fcF9uZCA9IGJhc2VfdHlwZTo6bV9wX25kLT5tX3BfcHJldl9vcl9wYXJlbnQ7CisJICAgIGlmIChiYXNlX3R5cGU6Om1fcF9uZCA9PSAwCisJCXx8IGJhc2VfdHlwZTo6bV9wX25kLT5tX3BfbF9jaGlsZCA9PSBwX25leHQpCisJICAgICAgcmV0dXJuOworCSAgfQorICAgICAgfQorICAgIH07CisKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworI3VuZGVmIFBCX0RTX0JBU0lDX0hFQVBfQ0lUX0JBU0UKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4ZGEzMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDE1MiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9hbGxvY2F0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjpzX25vZGVfYWxsb2NhdG9yOworCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vX3Rocm93X2NvcGllc190CitQQl9EU19DTEFTU19DX0RFQzo6c19ub190aHJvd19jb3BpZXNfaW5kOworCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcCgpIDoKKyAgbV9wX3Jvb3QoMCksCisgIG1fc2l6ZSgwKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXAoY29uc3QgQ21wX0ZuJiByX2NtcF9mbikgOgorICBDbXBfRm4ocl9jbXBfZm4pLAorICBtX3Bfcm9vdCgwKSwKKyAgbV9zaXplKDApCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcChjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpIAorOiBDbXBfRm4ob3RoZXIpLCBtX3Bfcm9vdCgwKSwgbV9zaXplKDApCit7CisgIG1fc2l6ZSA9IG90aGVyLm1fc2l6ZTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICBtX3Bfcm9vdCA9IHJlY3Vyc2l2ZV9jb3B5X25vZGUob3RoZXIubV9wX3Jvb3QpOworICBtX3NpemUgPSBvdGhlci5tX3NpemU7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgIHZhbHVlX3N3YXAob3RoZXIpOworICBzdGQ6OnN3YXAoKENtcF9GbiYgKSgqdGhpcyksIChDbXBfRm4mIClvdGhlcik7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit2YWx1ZV9zd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgc3RkOjpzd2FwKG1fcF9yb290LCBvdGhlci5tX3Bfcm9vdCk7CisgIHN0ZDo6c3dhcChtX3NpemUsIG90aGVyLm1fc2l6ZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+bGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcCgpCit7CisgIGNsZWFyKCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CityZWN1cnNpdmVfY29weV9ub2RlKG5vZGVfY29uc3RfcG9pbnRlciBwX25kKQoreworICBpZiAocF9uZCA9PSAwKQorICAgIHJldHVybiAoMCk7CisKKyAgbm9kZV9wb2ludGVyIHBfcmV0ID0gc19ub2RlX2FsbG9jYXRvci5hbGxvY2F0ZSgxKTsKKworICBfX3RyeQorICAgIHsKKyAgICAgIG5ldyAocF9yZXQpIG5vZGUoKnBfbmQpOworICAgIH0KKyAgX19jYXRjaCguLi4pCisgICAgeworICAgICAgc19ub2RlX2FsbG9jYXRvci5kZWFsbG9jYXRlKHBfcmV0LCAxKTsKKyAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgIH0KKworICBwX3JldC0+bV9wX2xfY2hpbGQgPSBwX3JldC0+bV9wX25leHRfc2libGluZyA9CisgICAgcF9yZXQtPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisKKyAgX190cnkKKyAgICB7CisgICAgICBwX3JldC0+bV9wX2xfY2hpbGQgPSByZWN1cnNpdmVfY29weV9ub2RlKHBfbmQtPm1fcF9sX2NoaWxkKTsKKyAgICAgIHBfcmV0LT5tX3BfbmV4dF9zaWJsaW5nID0gcmVjdXJzaXZlX2NvcHlfbm9kZShwX25kLT5tX3BfbmV4dF9zaWJsaW5nKTsKKyAgICB9CisgIF9fY2F0Y2goLi4uKQorICAgIHsKKyAgICAgIGNsZWFyX2ltcChwX3JldCk7CisgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICB9CisKKyAgaWYgKHBfcmV0LT5tX3BfbF9jaGlsZCAhPSAwKQorICAgIHBfcmV0LT5tX3BfbF9jaGlsZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9yZXQ7CisKKyAgaWYgKHBfcmV0LT5tX3BfbmV4dF9zaWJsaW5nICE9IDApCisgICAgcF9yZXQtPm1fcF9uZXh0X3NpYmxpbmctPm1fcF9wcmV2X29yX3BhcmVudCA9CisgICAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPT0gcF9uZCA/IHBfcmV0IDogMDsKKworICByZXR1cm4gcF9yZXQ7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWNjYjFhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTM3IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8uCisgKi8KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfdmFsaWQoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBQQl9EU19ERUJVR19WRVJJRlkobV9wX3Jvb3QgPT0gMCB8fCBtX3Bfcm9vdC0+bV9wX3ByZXZfb3JfcGFyZW50ID09IDApOworCisgIGlmIChtX3Bfcm9vdCAhPSAwKQorICAgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnQobV9wX3Jvb3QsIFNpbmdsZV9MaW5rX1Jvb3RzLCBfX2ZpbGUsIF9fbGluZSk7CisgIGFzc2VydF9zaXplKF9fZmlsZSwgX19saW5lKTsKKyAgYXNzZXJ0X2l0ZXJhdG9ycyhfX2ZpbGUsIF9fbGluZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfbm9kZV9jb25zaXN0ZW50KG5vZGVfY29uc3RfcG9pbnRlciBwX25kLCBib29sIHNpbmdsZV9saW5rLAorCQkgICAgICAgY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBpZiAocF9uZCA9PSAwKQorICAgIHJldHVybjsKKworICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfbmQtPm1fcF9sX2NoaWxkLCBmYWxzZSwgX19maWxlLCBfX2xpbmUpOworICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcsIHNpbmdsZV9saW5rLCBfX2ZpbGUsIF9fbGluZSk7CisKKyAgaWYgKHNpbmdsZV9saW5rKQorICAgIFBCX0RTX0RFQlVHX1ZFUklGWShwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQgPT0gMCk7CisgIGVsc2UgaWYgKHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCkKKyAgICBQQl9EU19ERUJVR19WRVJJRlkocF9uZC0+bV9wX25leHRfc2libGluZy0+bV9wX3ByZXZfb3JfcGFyZW50ID09IHBfbmQpOworCisgIGlmIChwX25kLT5tX3BfbF9jaGlsZCA9PSAwKQorICAgIHJldHVybjsKKworICBub2RlX2NvbnN0X3BvaW50ZXIgcF9jaGlsZCA9IHBfbmQtPm1fcF9sX2NoaWxkOworICB3aGlsZSAocF9jaGlsZCAhPSAwKQorICAgIHsKKyAgICAgIG5vZGVfY29uc3RfcG9pbnRlciBwX25leHRfY2hpbGQgPSBwX2NoaWxkLT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKCFDbXBfRm46Om9wZXJhdG9yKCkocF9uZC0+bV92YWx1ZSwgcF9jaGlsZC0+bV92YWx1ZSkpOworICAgICAgcF9jaGlsZCA9IHBfbmV4dF9jaGlsZDsKKyAgICB9CisgIFBCX0RTX0RFQlVHX1ZFUklGWShwX25kLT5tX3BfbF9jaGlsZC0+bV9wX3ByZXZfb3JfcGFyZW50ID09IHBfbmQpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X2l0ZXJhdG9ycyhjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIFBCX0RTX0RFQlVHX1ZFUklGWShzdGQ6OmRpc3RhbmNlKGJlZ2luKCksIGVuZCgpKSA9PSBzaXplKCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3NpemUoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBQQl9EU19ERUJVR19WRVJJRlkoc2l6ZV9mcm9tX25vZGUobV9wX3Jvb3QpID09IG1fc2l6ZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitzaXplX3VuZGVyX25vZGUobm9kZV9jb25zdF9wb2ludGVyIHBfbmQpCit7IHJldHVybiAxICsgc2l6ZV9mcm9tX25vZGUocF9uZC0+bV9wX2xfY2hpbGQpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitzaXplX2Zyb21fbm9kZShub2RlX2NvbnN0X3BvaW50ZXIgcF9uZCkKK3sKKyAgc2l6ZV90eXBlIHJldCA9IDA7CisgIHdoaWxlIChwX25kICE9IDApCisgICAgeworICAgICAgcmV0ICs9IDEgKyBzaXplX2Zyb21fbm9kZShwX25kLT5tX3BfbF9jaGlsZCk7CisgICAgICBwX25kID0gcF9uZC0+bV9wX25leHRfc2libGluZzsKKyAgICB9CisgIHJldHVybiByZXQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitkZWdyZWUobm9kZV9jb25zdF9wb2ludGVyIHBfbmQpCit7CisgIHNpemVfdHlwZSByZXQgPSAwOworICBub2RlX2NvbnN0X3BvaW50ZXIgcF9jaGlsZCA9IHBfbmQtPm1fcF9sX2NoaWxkOworICB3aGlsZSAocF9jaGlsZCAhPSAwKQorICAgIHsKKyAgICAgICsrcmV0OworICAgICAgcF9jaGlsZCA9IHBfY2hpbGQtPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgfQorICByZXR1cm4gcmV0OworfQorCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJmMjJkNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDE1MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcigpCit7CisgIGNsZWFyX2ltcChtX3Bfcm9vdCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3NpemUgPT0gMCk7CisgIG1fcF9yb290ID0gMDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CithY3R1YWxfZXJhc2Vfbm9kZShub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fc2l6ZSA+IDApOworICAtLW1fc2l6ZTsKKyAgcF9uZC0+fm5vZGUoKTsKKyAgc19ub2RlX2FsbG9jYXRvci5kZWFsbG9jYXRlKHBfbmQsIDEpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY2xlYXJfaW1wKG5vZGVfcG9pbnRlciBwX25kKQoreworICB3aGlsZSAocF9uZCAhPSAwKQorICAgIHsKKyAgICAgIGNsZWFyX2ltcChwX25kLT5tX3BfbF9jaGlsZCk7CisgICAgICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gcF9uZC0+bV9wX25leHRfc2libGluZzsKKyAgICAgIGFjdHVhbF9lcmFzZV9ub2RlKHBfbmQpOworICAgICAgcF9uZCA9IHBfbmV4dDsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0b19saW5rZWRfbGlzdCgpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBub2RlX3BvaW50ZXIgcF9jdXIgPSBtX3Bfcm9vdDsKKyAgd2hpbGUgKHBfY3VyICE9IDApCisgICAgaWYgKHBfY3VyLT5tX3BfbF9jaGlsZCAhPSAwKQorICAgICAgeworCW5vZGVfcG9pbnRlciBwX2NoaWxkX25leHQgPSBwX2N1ci0+bV9wX2xfY2hpbGQtPm1fcF9uZXh0X3NpYmxpbmc7CisJcF9jdXItPm1fcF9sX2NoaWxkLT5tX3BfbmV4dF9zaWJsaW5nID0gcF9jdXItPm1fcF9uZXh0X3NpYmxpbmc7CisJcF9jdXItPm1fcF9uZXh0X3NpYmxpbmcgPSBwX2N1ci0+bV9wX2xfY2hpbGQ7CisJcF9jdXItPm1fcF9sX2NoaWxkID0gcF9jaGlsZF9uZXh0OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHBfY3VyID0gcF9jdXItPm1fcF9uZXh0X3NpYmxpbmc7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICBub2RlX2NvbnN0X3BvaW50ZXIgcF9jb3VudGVyID0gbV9wX3Jvb3Q7CisgIHNpemVfdHlwZSBjb3VudCA9IDA7CisgIHdoaWxlIChwX2NvdW50ZXIgIT0gMCkKKyAgICB7CisgICAgICArK2NvdW50OworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfY291bnRlci0+bV9wX2xfY2hpbGQgPT0gMCk7CisgICAgICBwX2NvdW50ZXIgPSBwX2NvdW50ZXItPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgfQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoY291bnQgPT0gbV9zaXplKTsKKyNlbmRpZiAKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIFByZWQ+Cit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitwcnVuZShQcmVkIHByZWQpCit7CisgIG5vZGVfcG9pbnRlciBwX2N1ciA9IG1fcF9yb290OworICBtX3Bfcm9vdCA9IDA7CisgIG5vZGVfcG9pbnRlciBwX291dCA9IDA7CisgIHdoaWxlIChwX2N1ciAhPSAwKQorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX2N1ci0+bV9wX25leHRfc2libGluZzsKKyAgICAgIGlmIChwcmVkKHBfY3VyLT5tX3ZhbHVlKSkKKyAgICAgICAgeworCSAgcF9jdXItPm1fcF9uZXh0X3NpYmxpbmcgPSBwX291dDsKKwkgIGlmIChwX291dCAhPSAwKQorCSAgICBwX291dC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9jdXI7CisJICBwX291dCA9IHBfY3VyOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nID0gbV9wX3Jvb3Q7CisJICBpZiAobV9wX3Jvb3QgIT0gMCkKKwkgICAgbV9wX3Jvb3QtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfY3VyOworCSAgbV9wX3Jvb3QgPSBwX2N1cjsKKyAgICAgICAgfQorICAgICAgcF9jdXIgPSBwX25leHQ7CisgICAgfQorICByZXR1cm4gcF9vdXQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitidWJibGVfdG9fdG9wKG5vZGVfcG9pbnRlciBwX25kKQoreworICBub2RlX3BvaW50ZXIgcF9wYXJlbnQgPSBwYXJlbnQocF9uZCk7CisgIHdoaWxlIChwX3BhcmVudCAhPSAwKQorICAgIHsKKyAgICAgIHN3YXBfd2l0aF9wYXJlbnQocF9uZCwgcF9wYXJlbnQpOworICAgICAgcF9wYXJlbnQgPSBwYXJlbnQocF9uZCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vaW5mb19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9pbmZvX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOGIxNTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vaW5mb19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDY0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2luZm9fZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VtcHR5KCkgY29uc3QKK3sKKyAgcmV0dXJuIChtX3NpemUgPT0gMCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc2l6ZSgpIGNvbnN0Cit7CisgIHJldHVybiAobV9zaXplKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CittYXhfc2l6ZSgpIGNvbnN0Cit7CisgIHJldHVybiAoc19ub2RlX2FsbG9jYXRvci5tYXhfc2l6ZSgpKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZjZTViMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxNzUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfbmV3X25vZGVfZm9yX2luc2VydChjb25zdF9yZWZlcmVuY2Ugcl92YWwpCit7CisgIHJldHVybiBnZXRfbmV3X25vZGVfZm9yX2luc2VydChyX3ZhbCwgc19ub190aHJvd19jb3BpZXNfaW5kKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfbmV3X25vZGVfZm9yX2luc2VydChjb25zdF9yZWZlcmVuY2Ugcl92YWwsIGZhbHNlX3R5cGUpCit7CisgIG5vZGVfcG9pbnRlciBwX25ld19uZCA9IHNfbm9kZV9hbGxvY2F0b3IuYWxsb2NhdGUoMSk7CisKKyAgY29uZF9kZWFsdG9yX3QgY29uZChwX25ld19uZCk7CisKKyAgbmV3IChjb25zdF9jYXN0PHZvaWQqID4oCisJCQkgIHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqID4oJnBfbmV3X25kLT5tX3ZhbHVlKSkpCisgICAgdHlwZW5hbWUgbm9kZTo6dmFsdWVfdHlwZShyX3ZhbCk7CisKKyAgY29uZC5zZXRfbm9fYWN0aW9uKCk7CisKKyAgKyttX3NpemU7CisKKyAgcmV0dXJuIChwX25ld19uZCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X25ld19ub2RlX2Zvcl9pbnNlcnQoY29uc3RfcmVmZXJlbmNlIHJfdmFsLCB0cnVlX3R5cGUpCit7CisgIG5vZGVfcG9pbnRlciBwX25ld19uZCA9IHNfbm9kZV9hbGxvY2F0b3IuYWxsb2NhdGUoMSk7CisKKyAgbmV3IChjb25zdF9jYXN0PHZvaWQqID4oCisJCQkgIHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqID4oJnBfbmV3X25kLT5tX3ZhbHVlKSkpCisgICAgdHlwZW5hbWUgbm9kZTo6dmFsdWVfdHlwZShyX3ZhbCk7CisKKyAgKyttX3NpemU7CisKKyAgcmV0dXJuIChwX25ld19uZCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbWFrZV9jaGlsZF9vZihub2RlX3BvaW50ZXIgcF9uZCwgbm9kZV9wb2ludGVyIHBfbmV3X3BhcmVudCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQgIT0gMCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25ld19wYXJlbnQgIT0gMCk7CisKKyAgcF9uZC0+bV9wX25leHRfc2libGluZyA9IHBfbmV3X3BhcmVudC0+bV9wX2xfY2hpbGQ7CisKKyAgaWYgKHBfbmV3X3BhcmVudC0+bV9wX2xfY2hpbGQgIT0gMCkKKyAgICBwX25ld19wYXJlbnQtPm1fcF9sX2NoaWxkLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25kOworCisgIHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmV3X3BhcmVudDsKKworICBwX25ld19wYXJlbnQtPm1fcF9sX2NoaWxkID0gcF9uZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitwYXJlbnQobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX3BvdCA9IHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudDsKKworICAgICAgaWYgKHBfcG90ID09IDAgfHwgcF9wb3QtPm1fcF9sX2NoaWxkID09IHBfbmQpCisJcmV0dXJuIHBfcG90OworCisgICAgICBwX25kID0gcF9wb3Q7CisgICAgfQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXBfd2l0aF9wYXJlbnQobm9kZV9wb2ludGVyIHBfbmQsIG5vZGVfcG9pbnRlciBwX3BhcmVudCkKK3sKKyAgaWYgKHBfcGFyZW50ID09IG1fcF9yb290KQorICAgIG1fcF9yb290ID0gcF9uZDsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZCAhPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfcGFyZW50ICE9IDApOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocGFyZW50KHBfbmQpID09IHBfcGFyZW50KTsKKworICBjb25zdCBib29sIG5kX2RpcmVjdF9jaGlsZCA9IHBfcGFyZW50LT5tX3BfbF9jaGlsZCA9PSBwX25kOworICBjb25zdCBib29sIHBhcmVudF9yb290ID0gcF9wYXJlbnQtPm1fcF9wcmV2X29yX3BhcmVudCA9PSAwOworICBjb25zdCBib29sIHBhcmVudF9kaXJlY3RfY2hpbGQgPQorICAgICFwYXJlbnRfcm9vdCYmICBwX3BhcmVudC0+bV9wX3ByZXZfb3JfcGFyZW50LT5tX3BfbF9jaGlsZCA9PSBwX3BhcmVudDsKKworICBzdGQ6OnN3YXAocF9wYXJlbnQtPm1fcF9wcmV2X29yX3BhcmVudCwgcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50KTsKKyAgc3RkOjpzd2FwKHBfcGFyZW50LT5tX3BfbmV4dF9zaWJsaW5nLCBwX25kLT5tX3BfbmV4dF9zaWJsaW5nKTsKKyAgc3RkOjpzd2FwKHBfcGFyZW50LT5tX3BfbF9jaGlsZCwgcF9uZC0+bV9wX2xfY2hpbGQpOworICBzdGQ6OnN3YXAocF9wYXJlbnQtPm1fbWV0YWRhdGEsIHBfbmQtPm1fbWV0YWRhdGEpOworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3BfbF9jaGlsZCAhPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfcGFyZW50LT5tX3BfcHJldl9vcl9wYXJlbnQgIT0gMCk7CisKKyAgaWYgKHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCkKKyAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25kOworCisgIGlmIChwX3BhcmVudC0+bV9wX25leHRfc2libGluZyAhPSAwKQorICAgIHBfcGFyZW50LT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX3BhcmVudDsKKworICBpZiAocF9wYXJlbnQtPm1fcF9sX2NoaWxkICE9IDApCisgICAgcF9wYXJlbnQtPm1fcF9sX2NoaWxkLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX3BhcmVudDsKKworICBpZiAocGFyZW50X2RpcmVjdF9jaGlsZCkKKyAgICBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQtPm1fcF9sX2NoaWxkID0gcF9uZDsKKyAgZWxzZSBpZiAoIXBhcmVudF9yb290KQorICAgIHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudC0+bV9wX25leHRfc2libGluZyA9IHBfbmQ7CisKKyAgaWYgKCFuZF9kaXJlY3RfY2hpbGQpCisgICAgeworICAgICAgcF9uZC0+bV9wX2xfY2hpbGQtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQ7CisKKyAgICAgIHBfcGFyZW50LT5tX3BfcHJldl9vcl9wYXJlbnQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX3BhcmVudDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV9wX2xfY2hpbGQgPT0gcF9uZCk7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9wYXJlbnQtPm1fcF9wcmV2X29yX3BhcmVudCA9PSBwX3BhcmVudCk7CisKKyAgICAgIHBfbmQtPm1fcF9sX2NoaWxkID0gcF9wYXJlbnQ7CisgICAgICBwX3BhcmVudC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZDsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBhcmVudChwX3BhcmVudCkgPT0gcF9uZCk7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNjRlMDEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsODggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JlZ2luKCkKK3sKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBtX3Bfcm9vdDsKKworICBpZiAocF9uZCA9PSAwKQorICAgIHJldHVybiAoaXRlcmF0b3IoMCkpOworCisgIHdoaWxlIChwX25kLT5tX3BfbF9jaGlsZCAhPSAwKQorICAgIHBfbmQgPSBwX25kLT5tX3BfbF9jaGlsZDsKKworICByZXR1cm4gKGl0ZXJhdG9yKHBfbmQpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JlZ2luKCkgY29uc3QKK3sKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBtX3Bfcm9vdDsKKworICBpZiAocF9uZCA9PSAwKQorICAgIHJldHVybiAoY29uc3RfaXRlcmF0b3IoMCkpOworCisgIHdoaWxlIChwX25kLT5tX3BfbF9jaGlsZCAhPSAwKQorICAgIHBfbmQgPSBwX25kLT5tX3BfbF9jaGlsZDsKKworICByZXR1cm4gKGNvbnN0X2l0ZXJhdG9yKHBfbmQpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VuZCgpCit7CisgIHJldHVybiAoaXRlcmF0b3IoMCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKCkgY29uc3QKK3sKKyAgcmV0dXJuIChjb25zdF9pdGVyYXRvcigwKSk7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNTQxZTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8uaHBwCkBAIC0wLDAgKzEsMjg2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmFzaWMgaGVhcC4KKyAqLworCisjaWZuZGVmIFBCX0RTX0xFRlRfQ0hJTERfTkVYVF9TSUJMSU5HX0hFQVBfSFBQCisjZGVmaW5lIFBCX0RTX0xFRlRfQ0hJTERfTkVYVF9TSUJMSU5HX0hFQVBfSFBQCisKKy8qCisgKiBCYXNlZCBvbiBDTFJTLgorICovCisKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NvbmRfZGVhbHRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlX3V0aWxzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL25vZGUuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vcG9pbnRfY29uc3RfaXRlcmF0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vY29uc3RfaXRlcmF0b3IuaHBwPgorI2lmZGVmIFBCX0RTX0xDX05TX0hFQVBfVFJBQ0VfCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjZW5kaWYKKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBOb2RlX01ldGFkYXRhLCBcCisJICAgICB0eXBlbmFtZSBfQWxsb2MsIGJvb2wgU2luZ2xlX0xpbmtfUm9vdHM+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXA8VmFsdWVfVHlwZSwgQ21wX0ZuLCBOb2RlX01ldGFkYXRhLAlcCisJCQkJICBfQWxsb2MsIFNpbmdsZV9MaW5rX1Jvb3RzPgorI2Vsc2UKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIHR5cGVuYW1lIENtcF9GbiwgdHlwZW5hbWUgTm9kZV9NZXRhZGF0YSwgXAorCSAgICAgdHlwZW5hbWUgX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwPFZhbHVlX1R5cGUsIENtcF9GbiwgTm9kZV9NZXRhZGF0YSwgX0FsbG9jPgorI2VuZGlmCisKKyAgICAvLy8gQmFzZSBjbGFzcyBmb3IgYSBiYXNpYyBoZWFwLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsCisJICAgICB0eXBlbmFtZSBDbXBfRm4sCisJICAgICB0eXBlbmFtZSBOb2RlX01ldGFkYXRhLAorCSAgICAgdHlwZW5hbWUgX0FsbG9jCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKwkgICAgICxib29sIFNpbmdsZV9MaW5rX1Jvb3RzPgorI2Vsc2UKKwkgICAgID4KKyNlbmRpZgorICAgIGNsYXNzIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXAgOiBwdWJsaWMgQ21wX0ZuCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorICAgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9ub2RlXzxWYWx1ZV9UeXBlLCBOb2RlX01ldGFkYXRhLAorCQkJCQkgX0FsbG9jPiA+OjpvdGhlcgorICAgICAgbm9kZV9hbGxvY2F0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbm9kZV9hbGxvY2F0b3I6OnZhbHVlX3R5cGUgICAgIAlub2RlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBub2RlX2FsbG9jYXRvcjo6cG9pbnRlciAJCW5vZGVfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbm9kZV9hbGxvY2F0b3I6OmNvbnN0X3BvaW50ZXIJbm9kZV9jb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBOb2RlX01ldGFkYXRhIG5vZGVfbWV0YWRhdGE7CisgICAgICB0eXBlZGVmIHN0ZDo6cGFpcjwgbm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXI+IAlub2RlX3BvaW50ZXJfcGFpcjsKKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIGNvbmRfZGVhbHRvcjwgbm9kZSwgX0FsbG9jPiAJCWNvbmRfZGVhbHRvcl90OworCisgICAgICBlbnVtCisJeworCSAgc2ltcGxlX3ZhbHVlID0gaXNfc2ltcGxlPFZhbHVlX1R5cGU+Ojp2YWx1ZQorCX07CisKKyAgICAgIHR5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQ8aW50LCBzaW1wbGVfdmFsdWU+IAlub190aHJvd19jb3BpZXNfdDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8VmFsdWVfVHlwZT4JX19yZWJpbmRfdjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgCQlzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6ZGlmZmVyZW5jZV90eXBlIAlkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIFZhbHVlX1R5cGUgCQkJCXZhbHVlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdjo6b3RoZXI6OnBvaW50ZXIgCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3Y6Om90aGVyOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3Y6Om90aGVyOjpyZWZlcmVuY2UJcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92OjpvdGhlcjo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwX25vZGVfcG9pbnRfY29uc3RfaXRlcmF0b3JfPG5vZGUsIF9BbGxvYz4KKyAgICAgIHBvaW50X2NvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHBvaW50X2NvbnN0X2l0ZXJhdG9yIAkJCXBvaW50X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfY29uc3RfaXRlcmF0b3JfPG5vZGUsIF9BbGxvYz4KKyAgICAgIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIGNvbnN0X2l0ZXJhdG9yIAkJCQlpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgQ21wX0ZuIAkJCQkJY21wX2ZuOworICAgICAgdHlwZWRlZiBfQWxsb2MgCQkJCQlhbGxvY2F0b3JfdHlwZTsKKworICAgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcCgpOworICAgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcChjb25zdCBDbXBfRm4mKTsKKyAgICAgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXAoY29uc3QgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcCYpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIH5sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwKCk7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBlbXB0eSgpIGNvbnN0OworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3Q7CisKKyAgICAgIENtcF9GbiYKKyAgICAgIGdldF9jbXBfZm4oKTsKKworICAgICAgY29uc3QgQ21wX0ZuJgorICAgICAgZ2V0X2NtcF9mbigpIGNvbnN0OworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCk7CisKKyAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdDsKKworICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBlbmQoKTsKKworICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKTsKKworI2lmZGVmIFBCX0RTX0xDX05TX0hFQVBfVFJBQ0VfCisgICAgICB2b2lkCisgICAgICB0cmFjZSgpIGNvbnN0OworI2VuZGlmCisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICBnZXRfbmV3X25vZGVfZm9yX2luc2VydChjb25zdF9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgc3RhdGljIHZvaWQKKyAgICAgIG1ha2VfY2hpbGRfb2Yobm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIpOworCisgICAgICB2b2lkCisgICAgICB2YWx1ZV9zd2FwKGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXAmKTsKKworICAgICAgaW5saW5lIHN0YXRpYyBub2RlX3BvaW50ZXIKKyAgICAgIHBhcmVudChub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgc3dhcF93aXRoX3BhcmVudChub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIGJ1YmJsZV90b190b3Aobm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGFjdHVhbF9lcmFzZV9ub2RlKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyX2ltcChub2RlX3BvaW50ZXIpOworCisgICAgICB2b2lkCisgICAgICB0b19saW5rZWRfbGlzdCgpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorICAgICAgbm9kZV9wb2ludGVyCisgICAgICBwcnVuZShQcmVkKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfdmFsaWQoY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnQobm9kZV9jb25zdF9wb2ludGVyLCBib29sLCBjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgc3RhdGljIHNpemVfdHlwZQorICAgICAgc2l6ZV91bmRlcl9ub2RlKG5vZGVfY29uc3RfcG9pbnRlcik7CisKKyAgICAgIHN0YXRpYyBzaXplX3R5cGUKKyAgICAgIGRlZ3JlZShub2RlX2NvbnN0X3BvaW50ZXIpOworI2VuZGlmCisKKyNpZmRlZiBQQl9EU19MQ19OU19IRUFQX1RSQUNFXworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIHRyYWNlX25vZGUobm9kZV9jb25zdF9wb2ludGVyLCBzaXplX3R5cGUpOworI2VuZGlmCisKKyAgICBwcml2YXRlOgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfaXRlcmF0b3JzKGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfc2l6ZShjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgc3RhdGljIHNpemVfdHlwZQorICAgICAgc2l6ZV9mcm9tX25vZGUobm9kZV9jb25zdF9wb2ludGVyKTsKKyNlbmRpZgorCisgICAgICBub2RlX3BvaW50ZXIKKyAgICAgIHJlY3Vyc2l2ZV9jb3B5X25vZGUobm9kZV9jb25zdF9wb2ludGVyKTsKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgZ2V0X25ld19ub2RlX2Zvcl9pbnNlcnQoY29uc3RfcmVmZXJlbmNlLCBmYWxzZV90eXBlKTsKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgZ2V0X25ld19ub2RlX2Zvcl9pbnNlcnQoY29uc3RfcmVmZXJlbmNlLCB0cnVlX3R5cGUpOworCisjaWZkZWYgUEJfRFNfTENfTlNfSEVBUF9UUkFDRV8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1ldGFkYXRhXz4KKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICB0cmFjZV9ub2RlX21ldGFkYXRhKG5vZGVfY29uc3RfcG9pbnRlciwgdHlwZV90b190eXBlPE1ldGFkYXRhXz4pOworCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgdHJhY2Vfbm9kZV9tZXRhZGF0YShub2RlX2NvbnN0X3BvaW50ZXIsIHR5cGVfdG9fdHlwZTxudWxsX3R5cGU+KTsKKyNlbmRpZgorCisgICAgICBzdGF0aWMgbm9kZV9hbGxvY2F0b3IgCXNfbm9kZV9hbGxvY2F0b3I7CisgICAgICBzdGF0aWMgbm9fdGhyb3dfY29waWVzX3QgCXNfbm9fdGhyb3dfY29waWVzX2luZDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIG5vZGVfcG9pbnRlciAJCW1fcF9yb290OworICAgICAgc2l6ZV90eXBlIAkJbV9zaXplOworICAgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vZGVidWdfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy90cmFjZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vaW5mb19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL25vZGUuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL25vZGUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkODkxMDEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vbm9kZS5ocHAKQEAgLTAsMCArMSw5MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9ub2RlLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gc3RydWN0IGZvciB0aGlzIHR5cGUgb2YgaGVhcCdzIG5vZGUuCisgKi8KKworI2lmbmRlZiBQQl9EU19MRUZUX0NISUxEX05FWFRfU0lCTElOR19IRUFQX05PREVfSFBQCisjZGVmaW5lIFBCX0RTX0xFRlRfQ0hJTERfTkVYVF9TSUJMSU5HX0hFQVBfTk9ERV9IUFAKKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIE5vZGUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfTWV0YWRhdGEsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9ub2RlXworICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwX25vZGVfPF9WYWx1ZSwgX01ldGFkYXRhLCBfQWxsb2M+IHRoaXNfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1ZhbHVlIAkJCQl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBfTWV0YWRhdGEgCQkJbWV0YWRhdGFfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDx0aGlzX3R5cGU+OjpvdGhlcjo6cG9pbnRlciBub2RlX3BvaW50ZXI7CisKKyAgICAgIHZhbHVlX3R5cGUgCW1fdmFsdWU7CisgICAgICBtZXRhZGF0YV90eXBlIAltX21ldGFkYXRhOworICAgICAgbm9kZV9wb2ludGVyIAltX3BfbF9jaGlsZDsKKyAgICAgIG5vZGVfcG9pbnRlciAJbV9wX25leHRfc2libGluZzsKKyAgICAgIG5vZGVfcG9pbnRlciAJbV9wX3ByZXZfb3JfcGFyZW50OworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9ub2RlXzxfVmFsdWUsIG51bGxfdHlwZSwgX0FsbG9jPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwX25vZGVfPF9WYWx1ZSwgbnVsbF90eXBlLCBfQWxsb2M+IHRoaXNfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1ZhbHVlIAkJCQl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAJc2l6ZV90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPHRoaXNfdHlwZT46Om90aGVyOjpwb2ludGVyIG5vZGVfcG9pbnRlcjsKKworICAgICAgdmFsdWVfdHlwZSAJbV92YWx1ZTsKKyAgICAgIG5vZGVfcG9pbnRlciAJbV9wX2xfY2hpbGQ7CisgICAgICBub2RlX3BvaW50ZXIgCW1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBub2RlX3BvaW50ZXIgCW1fcF9wcmV2X29yX3BhcmVudDsKKyAgICB9OworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19MRUZUX0NISUxEX05FWFRfU0lCTElOR19IRUFQX05PREVfSFBQCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vcG9pbnRfY29uc3RfaXRlcmF0b3IuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL3BvaW50X2NvbnN0X2l0ZXJhdG9yLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmMxNWNlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL3BvaW50X2NvbnN0X2l0ZXJhdG9yLmhwcApAQCAtMCwwICsxLDE0OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9wb2ludF9jb25zdF9pdGVyYXRvci5ocHAKKyAqIENvbnRhaW5zIGFuIGl0ZXJhdG9yIGNsYXNzIHJldHVybmVkIGJ5IHRoZSB0YWJsZSdzIGNvbnN0IGZpbmQgYW5kIGluc2VydAorICogbWV0aG9kcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX0xFRlRfQ0hJTERfTkVYVF9TSUJMSU5HX0hFQVBfQ09OU1RfRklORF9JVEVSQVRPUl9IUFAKKyNkZWZpbmUgUEJfRFNfTEVGVF9DSElMRF9ORVhUX1NJQkxJTkdfSEVBUF9DT05TVF9GSU5EX0lURVJBVE9SX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL3RhZ19hbmRfdHJhaXQuaHBwPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDCQkJXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGUsIHR5cGVuYW1lIF9BbGxvYz4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9ub2RlX3BvaW50X2NvbnN0X2l0ZXJhdG9yXzxOb2RlLCBfQWxsb2M+CisKKyAgICAvLy8gQ29uc3QgcG9pbnQtdHlwZSBpdGVyYXRvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9ub2RlX3BvaW50X2NvbnN0X2l0ZXJhdG9yXworICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPE5vZGU+OjpvdGhlcjo6cG9pbnRlciBub2RlX3BvaW50ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gQ2F0ZWdvcnkuCisgICAgICB0eXBlZGVmIHRyaXZpYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgICAvLy8gRGlmZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZiB0cml2aWFsX2l0ZXJhdG9yX2RpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIC8vLyBJdGVyYXRvcidzIHZhbHVlIHR5cGUuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIE5vZGU6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKworICAgICAgLy8vIEl0ZXJhdG9yJ3MgcG9pbnRlciB0eXBlLgorICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisJdmFsdWVfdHlwZT46Om90aGVyOjpwb2ludGVyCisgICAgICBwb2ludGVyOworCisgICAgICAvLy8gSXRlcmF0b3IncyBjb25zdCBwb2ludGVyIHR5cGUuCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDwKKwl2YWx1ZV90eXBlPjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIKKyAgICAgIGNvbnN0X3BvaW50ZXI7CisKKyAgICAgIC8vLyBJdGVyYXRvcidzIHJlZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisJdmFsdWVfdHlwZT46Om90aGVyOjpyZWZlcmVuY2UKKyAgICAgIHJlZmVyZW5jZTsKKworICAgICAgLy8vIEl0ZXJhdG9yJ3MgY29uc3QgcmVmZXJlbmNlIHR5cGUuCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDwKKwl2YWx1ZV90eXBlPjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZQorICAgICAgY29uc3RfcmVmZXJlbmNlOworCisgICAgICBpbmxpbmUKKyAgICAgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfbm9kZV9wb2ludF9jb25zdF9pdGVyYXRvcl8obm9kZV9wb2ludGVyIHBfbmQpIDogbV9wX25kKHBfbmQpCisgICAgICB7IH0KKworICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICBpbmxpbmUKKyAgICAgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfbm9kZV9wb2ludF9jb25zdF9pdGVyYXRvcl8oKSA6IG1fcF9uZCgwKQorICAgICAgeyB9CisKKyAgICAgIC8vLyBDb3B5IGNvbnN0cnVjdG9yLgorICAgICAgaW5saW5lCisgICAgICBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwX25vZGVfcG9pbnRfY29uc3RfaXRlcmF0b3JfKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgOiBtX3BfbmQob3RoZXIubV9wX25kKQorICAgICAgeyB9CisKKyAgICAgIC8vLyBBY2Nlc3MuCisgICAgICBjb25zdF9wb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX25kICE9IDApOworCXJldHVybiAmbV9wX25kLT5tX3ZhbHVlOworICAgICAgfQorCisgICAgICAvLy8gQWNjZXNzLgorICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfbmQgIT0gMCk7CisJcmV0dXJuIG1fcF9uZC0+bV92YWx1ZTsKKyAgICAgIH0KKworICAgICAgLy8vIENvbXBhcmVzIGNvbnRlbnQgdG8gYSBkaWZmZXJlbnQgaXRlcmF0b3Igb2JqZWN0LgorICAgICAgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiBtX3BfbmQgPT0gb3RoZXIubV9wX25kOyB9CisKKyAgICAgIC8vLyBDb21wYXJlcyBjb250ZW50IChuZWdhdGl2ZWx5KSB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgICAgICBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcF9uZCAhPSBvdGhlci5tX3BfbmQ7IH0KKworICAgICAgbm9kZV9wb2ludGVyIG1fcF9uZDsKKyAgICB9OworCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzOTBjYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTIgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitDbXBfRm4mIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2NtcF9mbigpCit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQworY29uc3QgQ21wX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9jbXBfZm4oKSBjb25zdAoreyByZXR1cm4gKnRoaXM7IH0KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL3RyYWNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL3RyYWNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYjM3NTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vdHJhY2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw5MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy90cmFjZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfLgorICovCisKKyNpZmRlZiBQQl9EU19MQ19OU19IRUFQX1RSQUNFXworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordHJhY2UoKSBjb25zdAoreworICBzdGQ6OmNlcnIgPDwgc3RkOjplbmRsOworICB0cmFjZV9ub2RlKG1fcF9yb290LCAwKTsKKyAgc3RkOjpjZXJyIDw8IHN0ZDo6ZW5kbDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RyYWNlX25vZGUobm9kZV9jb25zdF9wb2ludGVyIHBfbmQsIHNpemVfdHlwZSBsZXZlbCkKK3sKKyAgd2hpbGUgKHBfbmQgIT0gMCkKKyAgICB7CisgICAgICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IGxldmVsOyArK2kpCisJc3RkOjpjZXJyIDw8ICcgJzsKKworICAgICAgc3RkOjpjZXJyIDw8IHBfbmQgPDwKKwkiIHByZXYgPSAiIDw8IHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCA8PAorCSIgbmV4dCAiIDw8IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgPDwKKwkiIGxlZnQgPSAiIDw8IHBfbmQtPm1fcF9sX2NoaWxkIDw8ICIgIjsKKworICAgICAgdHJhY2Vfbm9kZV9tZXRhZGF0YShwX25kLCB0eXBlX3RvX3R5cGU8bm9kZV9tZXRhZGF0YT4oKSk7CisgICAgICBzdGQ6OmNlcnIgPDwgcF9uZC0+bV92YWx1ZSA8PCBzdGQ6OmVuZGw7CisgICAgICB0cmFjZV9ub2RlKHBfbmQtPm1fcF9sX2NoaWxkLCBsZXZlbCArIDEpOworICAgICAgcF9uZCA9IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgfQorfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgTWV0YWRhdGFfPgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordHJhY2Vfbm9kZV9tZXRhZGF0YShub2RlX2NvbnN0X3BvaW50ZXIgcF9uZCwgdHlwZV90b190eXBlPE1ldGFkYXRhXz4pCit7CisgIHN0ZDo6Y2VyciA8PCAiKCIgPDwgcF9uZC0+bV9tZXRhZGF0YSA8PCAiKSAiOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordHJhY2Vfbm9kZV9tZXRhZGF0YShub2RlX2NvbnN0X3BvaW50ZXIsIHR5cGVfdG9fdHlwZTxudWxsX3R5cGU+KQoreyB9CisKKyNlbmRpZiAvLyAjaWZkZWYgUEJfRFNfTENfTlNfSEVBUF9UUkFDRV8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYzYyODMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTM2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGxpc3RfdXBkYXRlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcAorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6ZW50cnlfYWxsb2NhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6c19lbnRyeV9hbGxvY2F0b3I7CisKK1BCX0RTX0NMQVNTX1RfREVDCitFcV9GbiBQQl9EU19DTEFTU19DX0RFQzo6c19lcV9mbjsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK251bGxfdHlwZSBQQl9EU19DTEFTU19DX0RFQzo6c19udWxsX3R5cGU7CisKK1BCX0RTX0NMQVNTX1RfREVDCitVcGRhdGVfUG9saWN5IFBCX0RTX0NMQVNTX0NfREVDOjpzX3VwZGF0ZV9wb2xpY3k7CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlX3RvX3R5cGU8CisgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjp1cGRhdGVfbWV0YWRhdGE+IFBCX0RTX0NMQVNTX0NfREVDOjpzX21ldGFkYXRhX3R5cGVfaW5kaWNhdG9yOworCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgSXQ+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citjb3B5X2Zyb21fcmFuZ2UoSXQgZmlyc3RfaXQsIEl0IGxhc3RfaXQpCit7CisgIHdoaWxlIChmaXJzdF9pdCAhPSBsYXN0X2l0KQorICAgIGluc2VydCgqKGZpcnN0X2l0KyspKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0xVX05BTUUoKSA6IG1fcF9sKDApCit7IFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKSB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0xVX05BTUUoSXQgZmlyc3RfaXQsIEl0IGxhc3RfaXQpIDogbV9wX2woMCkKK3sKKyAgY29weV9mcm9tX3JhbmdlKGZpcnN0X2l0LCBsYXN0X2l0KTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpOworfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfTFVfTkFNRShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpIDoKK21fcF9sKDApCit7CisgIF9fdHJ5CisgICAgeworICAgICAgZm9yIChjb25zdF9pdGVyYXRvciBpdCA9IG90aGVyLmJlZ2luKCk7IGl0ICE9IG90aGVyLmVuZCgpOyArK2l0KQorCXsKKwkgIGVudHJ5X3BvaW50ZXIgcF9sID0gYWxsb2NhdGVfbmV3X2VudHJ5KCppdCwKKwkJCQkgICAgICB0cmFpdHNfYmFzZTo6bV9ub190aHJvd19jb3BpZXNfaW5kaWNhdG9yKTsKKworCSAgcF9sLT5tX3BfbmV4dCA9IG1fcF9sOworCSAgbV9wX2wgPSBwX2w7CisJfQorICAgIH0KKyAgX19jYXRjaCguLi4pCisgICAgeworICAgICAgZGVhbGxvY2F0ZV9hbGwoKTsKKyAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgIH0KKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpzd2FwKG90aGVyKTspCisgIHN0ZDo6c3dhcChtX3BfbCwgb3RoZXIubV9wX2wpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZGVhbGxvY2F0ZV9hbGwoKQoreworICBlbnRyeV9wb2ludGVyIHBfbCA9IG1fcF9sOworICB3aGlsZSAocF9sICE9IDApCisgICAgeworICAgICAgZW50cnlfcG9pbnRlciBwX25leHRfbCA9IHBfbC0+bV9wX25leHQ7CisgICAgICBhY3R1YWxfZXJhc2VfZW50cnkocF9sKTsKKyAgICAgIHBfbCA9IHBfbmV4dF9sOworICAgIH0KKyAgbV9wX2wgPSAwOworfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorflBCX0RTX0xVX05BTUUoKQoreyBkZWFsbG9jYXRlX2FsbCgpOyB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZGI1OGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDU3IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGxpc3RfdXBkYXRlX21hcF8vZGVidWdfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgZGVidWctbW9kZSBmdW5jdGlvbnMuCisgKi8KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfdmFsaWQoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBzaXplX3R5cGUgY2FsY19zaXplID0gMDsKKyAgZm9yIChjb25zdF9pdGVyYXRvciBpdCA9IGJlZ2luKCk7IGl0ICE9IGVuZCgpOyArK2l0KQorICAgIHsKKyAgICAgIGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9leGlzdHMoUEJfRFNfVjJGKCppdCksIF9fZmlsZSwgX19saW5lKTsKKyAgICAgICsrY2FsY19zaXplOworICAgIH0KKyAgZGVidWdfYmFzZTo6Y2hlY2tfc2l6ZShjYWxjX3NpemUsIF9fZmlsZSwgX19saW5lKTsKK30KKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vZW50cnlfbWV0YWRhdGFfYmFzZS5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9lbnRyeV9tZXRhZGF0YV9iYXNlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzUzMGY1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vZW50cnlfbWV0YWRhdGFfYmFzZS5ocHAKQEAgLTAsMCArMSw2MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBsaXN0X3VwZGF0ZV9tYXBfL2VudHJ5X21ldGFkYXRhX2Jhc2UuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgYSBsaXN0IHVwZGF0ZSBtYXAuCisgKi8KKworI2lmbmRlZiBQQl9EU19MVV9NQVBfRU5UUllfTUVUQURBVEFfQkFTRV9IUFAKKyNkZWZpbmUgUEJfRFNfTFVfTUFQX0VOVFJZX01FVEFEQVRBX0JBU0VfSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1ldGFkYXRhPgorICAgIHN0cnVjdCBsdV9tYXBfZW50cnlfbWV0YWRhdGFfYmFzZQorICAgIHsKKyAgICAgIE1ldGFkYXRhIG1fdXBkYXRlX21ldGFkYXRhOworICAgIH07CisgICAgCisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBsdV9tYXBfZW50cnlfbWV0YWRhdGFfYmFzZTxudWxsX3R5cGU+CisgICAgeyB9OyAgCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YTM0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEzNCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBsaXN0X3VwZGF0ZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgbHVfbWFwXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBpZiAobV9wX2wgPT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKHNfZXFfZm4ocl9rZXksIFBCX0RTX1YyRihtX3BfbC0+bV92YWx1ZSkpKQorICAgIHsKKyAgICAgIGVudHJ5X3BvaW50ZXIgcF9uZXh0ID0gbV9wX2wtPm1fcF9uZXh0OworICAgICAgYWN0dWFsX2VyYXNlX2VudHJ5KG1fcF9sKTsKKyAgICAgIG1fcF9sID0gcF9uZXh0OworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIGVudHJ5X3BvaW50ZXIgcF9sID0gbV9wX2w7CisgIHdoaWxlIChwX2wtPm1fcF9uZXh0ICE9IDApCisgICAgaWYgKHNfZXFfZm4ocl9rZXksIFBCX0RTX1YyRihwX2wtPm1fcF9uZXh0LT5tX3ZhbHVlKSkpCisgICAgICB7CisJZXJhc2VfbmV4dChwX2wpOworCXJldHVybiB0cnVlOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHBfbCA9IHBfbC0+bV9wX25leHQ7CisgIHJldHVybiBmYWxzZTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NsZWFyKCkKK3sKKyAgZGVhbGxvY2F0ZV9hbGwoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfaWYoUHJlZCBwcmVkKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgc2l6ZV90eXBlIG51bV9lcnNkID0gMDsKKyAgd2hpbGUgKG1fcF9sICE9IDAgJiYgcHJlZChtX3BfbC0+bV92YWx1ZSkpCisgICAgeworICAgICAgZW50cnlfcG9pbnRlciBwX25leHQgPSBtX3BfbC0+bV9wX25leHQ7CisgICAgICArK251bV9lcnNkOworICAgICAgYWN0dWFsX2VyYXNlX2VudHJ5KG1fcF9sKTsKKyAgICAgIG1fcF9sID0gcF9uZXh0OworICAgIH0KKworICBpZiAobV9wX2wgPT0gMCkKKyAgICByZXR1cm4gbnVtX2Vyc2Q7CisKKyAgZW50cnlfcG9pbnRlciBwX2wgPSBtX3BfbDsKKyAgd2hpbGUgKHBfbC0+bV9wX25leHQgIT0gMCkKKyAgICB7CisgICAgICBpZiAocHJlZChwX2wtPm1fcF9uZXh0LT5tX3ZhbHVlKSkKKyAgICAgICAgeworCSAgKytudW1fZXJzZDsKKwkgIGVyYXNlX25leHQocF9sKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorCXBfbCA9IHBfbC0+bV9wX25leHQ7CisgICAgfQorCisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gbnVtX2Vyc2Q7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9uZXh0KGVudHJ5X3BvaW50ZXIgcF9sKQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9sICE9IDApOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9sLT5tX3BfbmV4dCAhPSAwKTsKKyAgZW50cnlfcG9pbnRlciBwX25leHRfbCA9IHBfbC0+bV9wX25leHQtPm1fcF9uZXh0OworICBhY3R1YWxfZXJhc2VfZW50cnkocF9sLT5tX3BfbmV4dCk7CisgIHBfbC0+bV9wX25leHQgPSBwX25leHRfbDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FjdHVhbF9lcmFzZV9lbnRyeShlbnRyeV9wb2ludGVyIHBfbCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjplcmFzZV9leGlzdGluZyhQQl9EU19WMkYocF9sLT5tX3ZhbHVlKSk7KQorICBwX2wtPn5lbnRyeSgpOworICBzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKHBfbCwgMSk7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9maW5kX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNGM0NTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9maW5kX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsOTAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbGlzdF91cGRhdGVfbWFwXy9maW5kX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgbHVfbWFwXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjplbnRyeV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX2ltcChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KSBjb25zdAoreworICBpZiAobV9wX2wgPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHNfZXFfZm4ocl9rZXksIFBCX0RTX1YyRihtX3BfbC0+bV92YWx1ZSkpKQorICAgIHsKKyAgICAgIGFwcGx5X3VwZGF0ZShtX3BfbCwgc19tZXRhZGF0YV90eXBlX2luZGljYXRvcik7CisgICAgICBQQl9EU19DSEVDS19LRVlfRVhJU1RTKHJfa2V5KQorICAgICAgcmV0dXJuIG1fcF9sOworICAgIH0KKworICBlbnRyeV9wb2ludGVyIHBfbCA9IG1fcF9sOworICB3aGlsZSAocF9sLT5tX3BfbmV4dCAhPSAwKQorICAgIHsKKyAgICAgIGVudHJ5X3BvaW50ZXIgcF9uZXh0ID0gcF9sLT5tX3BfbmV4dDsKKyAgICAgIGlmIChzX2VxX2ZuKHJfa2V5LCBQQl9EU19WMkYocF9uZXh0LT5tX3ZhbHVlKSkpCisgICAgICAgIHsKKwkgIGlmIChhcHBseV91cGRhdGUocF9uZXh0LCBzX21ldGFkYXRhX3R5cGVfaW5kaWNhdG9yKSkKKyAgICAgICAgICAgIHsKKwkgICAgICBwX2wtPm1fcF9uZXh0ID0gcF9uZXh0LT5tX3BfbmV4dDsKKwkgICAgICBwX25leHQtPm1fcF9uZXh0ID0gbV9wX2w7CisJICAgICAgbV9wX2wgPSBwX25leHQ7CisJICAgICAgcmV0dXJuIG1fcF9sOworICAgICAgICAgICAgfQorCSAgcmV0dXJuIHBfbmV4dDsKKyAgICAgICAgfQorICAgICAgZWxzZQorCXBfbCA9IHBfbmV4dDsKKyAgICB9CisKKyAgUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKHJfa2V5KQorICByZXR1cm4gMDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIE1ldGFkYXRhPgoraW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FwcGx5X3VwZGF0ZShlbnRyeV9wb2ludGVyIHBfbCwgdHlwZV90b190eXBlPE1ldGFkYXRhPikKK3sgcmV0dXJuIHNfdXBkYXRlX3BvbGljeShwX2wtPm1fdXBkYXRlX21ldGFkYXRhKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FwcGx5X3VwZGF0ZShlbnRyeV9wb2ludGVyLCB0eXBlX3RvX3R5cGU8bnVsbF90eXBlPikKK3sgcmV0dXJuIHNfdXBkYXRlX3BvbGljeShzX251bGxfdHlwZSk7IH0KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vaW5mb19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2luZm9fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg1NjFhNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2luZm9fZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1NyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBsaXN0X3VwZGF0ZV9tYXBfL2luZm9fZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBsdV9tYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc2l6ZSgpIGNvbnN0Cit7IHJldHVybiBzdGQ6OmRpc3RhbmNlKGJlZ2luKCksIGVuZCgpKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK21heF9zaXplKCkgY29uc3QKK3sgcmV0dXJuIHNfZW50cnlfYWxsb2NhdG9yLm1heF9zaXplKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlbXB0eSgpIGNvbnN0Cit7IHJldHVybiAobV9wX2wgPT0gMCk7IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDE3NjkwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTA2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGxpc3RfdXBkYXRlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgbHVfbWFwXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHN0ZDo6cGFpcjwKKyAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yLAorICBib29sPgorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIGVudHJ5X3BvaW50ZXIgcF9sID0gZmluZF9pbXAoUEJfRFNfVjJGKHJfdmFsKSk7CisKKyAgaWYgKHBfbCAhPSAwKQorICAgIHsKKyAgICAgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMoUEJfRFNfVjJGKHJfdmFsKSkKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihwb2ludF9pdGVyYXRvcigmcF9sLT5tX3ZhbHVlKSwgZmFsc2UpOworICAgIH0KKworICBQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1QoUEJfRFNfVjJGKHJfdmFsKSkKKworICBwX2wgPSBhbGxvY2F0ZV9uZXdfZW50cnkocl92YWwsIHRyYWl0c19iYXNlOjptX25vX3Rocm93X2NvcGllc19pbmRpY2F0b3IpOworICBwX2wtPm1fcF9uZXh0ID0gbV9wX2w7CisgIG1fcF9sID0gcF9sOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHBvaW50X2l0ZXJhdG9yKCZwX2wtPm1fdmFsdWUpLCB0cnVlKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6ZW50cnlfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYWxsb2NhdGVfbmV3X2VudHJ5KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgZmFsc2VfdHlwZSkKK3sKKyAgZW50cnlfcG9pbnRlciBwX2wgPSBzX2VudHJ5X2FsbG9jYXRvci5hbGxvY2F0ZSgxKTsKKyAgY29uZF9kZWFsdG9yX3QgY29uZChwX2wpOworICBuZXcgKGNvbnN0X2Nhc3Q8dm9pZCogPihzdGF0aWNfY2FzdDxjb25zdCB2b2lkKiA+KCZwX2wtPm1fdmFsdWUpKSkKKyAgICB2YWx1ZV90eXBlKHJfdmFsKTsKKworICBjb25kLnNldF9ub19hY3Rpb24oKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjppbnNlcnRfbmV3KFBCX0RTX1YyRihyX3ZhbCkpOykKKyAgaW5pdF9lbnRyeV9tZXRhZGF0YShwX2wsIHNfbWV0YWRhdGFfdHlwZV9pbmRpY2F0b3IpOworICByZXR1cm4gcF9sOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjplbnRyeV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CithbGxvY2F0ZV9uZXdfZW50cnkoY29uc3RfcmVmZXJlbmNlICAgIHJfdmFsLCB0cnVlX3R5cGUpCit7CisgIGVudHJ5X3BvaW50ZXIgcF9sID0gc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUoMSk7CisgIG5ldyAoJnBfbC0+bV92YWx1ZSkgdmFsdWVfdHlwZShyX3ZhbCk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6aW5zZXJ0X25ldyhQQl9EU19WMkYocl92YWwpKTspCisgIGluaXRfZW50cnlfbWV0YWRhdGEocF9sLCBzX21ldGFkYXRhX3R5cGVfaW5kaWNhdG9yKTsKKyAgcmV0dXJuIHBfbDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIE1ldGFkYXRhPgoraW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luaXRfZW50cnlfbWV0YWRhdGEoZW50cnlfcG9pbnRlciBwX2wsIHR5cGVfdG9fdHlwZTxNZXRhZGF0YT4pCit7IG5ldyAoJnBfbC0+bV91cGRhdGVfbWV0YWRhdGEpIE1ldGFkYXRhKHNfdXBkYXRlX3BvbGljeSgpKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luaXRfZW50cnlfbWV0YWRhdGEoZW50cnlfcG9pbnRlciwgdHlwZV90b190eXBlPG51bGxfdHlwZT4pCit7IH0KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZmVmODkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw4MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBsaXN0X3VwZGF0ZV9tYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGx1X21hcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JlZ2luKCkKK3sKKyAgaWYgKG1fcF9sID09IDApCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGVtcHR5KCkpOworICAgICAgcmV0dXJuIGVuZCgpOworICAgIH0KKyAgcmV0dXJuIGl0ZXJhdG9yKCZtX3BfbC0+bV92YWx1ZSwgbV9wX2wsIHRoaXMpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oKSBjb25zdAoreworICBpZiAobV9wX2wgPT0gMCkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoZW1wdHkoKSk7CisgICAgICByZXR1cm4gZW5kKCk7CisgICAgfQorICByZXR1cm4gaXRlcmF0b3IoJm1fcF9sLT5tX3ZhbHVlLCBtX3BfbCwgY29uc3RfY2FzdDxQQl9EU19DTEFTU19DX0RFQyogPih0aGlzKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitlbmQoKQoreyByZXR1cm4gaXRlcmF0b3IoMCwgMCwgdGhpcyk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VuZCgpIGNvbnN0Cit7CisgIHJldHVybiBjb25zdF9pdGVyYXRvcigwLCAwLCBjb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDKiBjb25zdD4odGhpcykpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9sdV9tYXBfLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2x1X21hcF8uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NDc2ODgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9sdV9tYXBfLmhwcApAQCAtMCwwICsxLDM0MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBsaXN0X3VwZGF0ZV9tYXBfL2x1X21hcF8uaHBwCisgKiBDb250YWlucyBhIGxpc3QgdXBkYXRlIG1hcC4KKyAqLworCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NvbmRfZGVhbHRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL3RhZ19hbmRfdHJhaXQuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZXNfdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vZW50cnlfbWV0YWRhdGFfYmFzZS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2V4Y2VwdGlvbi5ocHA+CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2RlYnVnX21hcF9iYXNlLmhwcD4KKyNlbmRpZgorI2lmZGVmIFBCX0RTX0xVX01BUF9UUkFDRV8KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNlbmRpZgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyNkZWZpbmUgUEJfRFNfTFVfTkFNRSBsdV9tYXAKKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyNkZWZpbmUgUEJfRFNfTFVfTkFNRSBsdV9zZXQKKyNlbmRpZgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIE1hcHBlZCwgdHlwZW5hbWUgRXFfRm4sIFwKKwkgICAgIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgVXBkYXRlX1BvbGljeT4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICAgUEJfRFNfTFVfTkFNRTxLZXksIE1hcHBlZCwgRXFfRm4sIF9BbGxvYywgVXBkYXRlX1BvbGljeT4KKworI2RlZmluZSBQQl9EU19MVV9UUkFJVFNfQkFTRSBcCisgICAgdHlwZXNfdHJhaXRzPEtleSwgTWFwcGVkLCBfQWxsb2MsIGZhbHNlPgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyNkZWZpbmUgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMgXAorICAgIGRlYnVnX21hcF9iYXNlPEtleSwgRXFfRm4sIFwKKwkgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxLZXk+OjpvdGhlcjo6Y29uc3RfcmVmZXJlbmNlPgorI2VuZGlmCisKKyAgICAvLy8gbGlzdC1iYXNlZCAod2l0aCB1cGRhdGVzKSBhc3NvY2lhdGl2ZSBjb250YWluZXIuCisgICAgLy8vIFNraXAgdG8gdGhlIGx1LCBteSBkYXJsaW5nLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICAgIHR5cGVuYW1lIE1hcHBlZCwKKwkgICAgIHR5cGVuYW1lIEVxX0ZuLAorCSAgICAgdHlwZW5hbWUgX0FsbG9jLAorCSAgICAgdHlwZW5hbWUgVXBkYXRlX1BvbGljeT4KKyAgICBjbGFzcyBQQl9EU19MVV9OQU1FIDoKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgcHJvdGVjdGVkIFBCX0RTX0RFQlVHX01BUF9CQVNFX0NfREVDLAorI2VuZGlmCisgICAgICBwdWJsaWMgUEJfRFNfTFVfVFJBSVRTX0JBU0UKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgUEJfRFNfTFVfVFJBSVRTX0JBU0UgCSAgICAgICAJdHJhaXRzX2Jhc2U7CisKKyAgICAgIHN0cnVjdCBlbnRyeQorICAgICA6IHB1YmxpYyBsdV9tYXBfZW50cnlfbWV0YWRhdGFfYmFzZTx0eXBlbmFtZSBVcGRhdGVfUG9saWN5OjptZXRhZGF0YV90eXBlPgorICAgICAgeworCXR5cGVuYW1lIHRyYWl0c19iYXNlOjp2YWx1ZV90eXBlIG1fdmFsdWU7CisJdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8ZW50cnk+OjpvdGhlcjo6cG9pbnRlciBtX3BfbmV4dDsKKyAgICAgIH07CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8ZW50cnk+OjpvdGhlciBlbnRyeV9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGVudHJ5X2FsbG9jYXRvcjo6cG9pbnRlciBlbnRyeV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBlbnRyeV9hbGxvY2F0b3I6OmNvbnN0X3BvaW50ZXIgY29uc3RfZW50cnlfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgZW50cnlfYWxsb2NhdG9yOjpyZWZlcmVuY2UgZW50cnlfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBlbnRyeV9hbGxvY2F0b3I6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9lbnRyeV9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8ZW50cnlfcG9pbnRlcj46Om90aGVyIGVudHJ5X3BvaW50ZXJfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBlbnRyeV9wb2ludGVyX2FsbG9jYXRvcjo6cG9pbnRlciBlbnRyeV9wb2ludGVyX2FycmF5OworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGVfOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6cG9pbnRlciBwb2ludGVyXzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcl87CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpyZWZlcmVuY2UgcmVmZXJlbmNlXzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2VfOworCisjZGVmaW5lIFBCX0RTX0dFTl9QT1MgZW50cnlfcG9pbnRlcgorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvcG9pbnRfY29uc3RfaXRlcmF0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL3BvaW50X2l0ZXJhdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9jb25zdF9pdGVyYXRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvaXRlcmF0b3IuaHBwPgorCisjdW5kZWYgUEJfRFNfR0VOX1BPUworCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdHlwZWRlZiBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQyBkZWJ1Z19iYXNlOworI2VuZGlmCisKKyAgICAgIHR5cGVkZWYgY29uZF9kZWFsdG9yPGVudHJ5LCBfQWxsb2M+IGNvbmRfZGVhbHRvcl90OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQWxsb2MgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBFcV9GbiBlcV9mbjsKKyAgICAgIHR5cGVkZWYgVXBkYXRlX1BvbGljeSB1cGRhdGVfcG9saWN5OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBVcGRhdGVfUG9saWN5OjptZXRhZGF0YV90eXBlIHVwZGF0ZV9tZXRhZGF0YTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV90eXBlIGtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X3BvaW50ZXIga2V5X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfY29uc3RfcG9pbnRlciBrZXlfY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV9yZWZlcmVuY2Uga2V5X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV9jb25zdF9yZWZlcmVuY2Uga2V5X2NvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF90eXBlIG1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3BvaW50ZXIgbWFwcGVkX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjptYXBwZWRfY29uc3RfcG9pbnRlciBtYXBwZWRfY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF9yZWZlcmVuY2UgbWFwcGVkX3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF9jb25zdF9yZWZlcmVuY2UgbWFwcGVkX2NvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnBvaW50ZXIgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICAgICAgdHlwZWRlZiBwb2ludF9pdGVyYXRvcl8gCQkJcG9pbnRfaXRlcmF0b3I7CisjZW5kaWYKKworI2lmZGVmIFBCX0RTX0RBVEFfRkFMU0VfSU5ESUNBVE9SCisgICAgICB0eXBlZGVmIHBvaW50X2NvbnN0X2l0ZXJhdG9yXyAJCXBvaW50X2l0ZXJhdG9yOworI2VuZGlmCisKKyAgICAgIHR5cGVkZWYgcG9pbnRfY29uc3RfaXRlcmF0b3JfIAkJcG9pbnRfY29uc3RfaXRlcmF0b3I7CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICB0eXBlZGVmIGl0ZXJhdG9yXyAJCQlpdGVyYXRvcjsKKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyAgICAgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3JfIAkJCWl0ZXJhdG9yOworI2VuZGlmCisKKyAgICAgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3JfIAkJCWNvbnN0X2l0ZXJhdG9yOworCisgICAgcHVibGljOgorICAgICAgUEJfRFNfTFVfTkFNRSgpOworCisgICAgICBQQl9EU19MVV9OQU1FKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5QQl9EU19MVV9OQU1FKCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgICAgUEJfRFNfTFVfTkFNRShJdCwgSXQpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdDsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdDsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBtYXBwZWRfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCisgICAgICB7CisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorCV9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCXJldHVybiBpbnNlcnQoc3RkOjptYWtlX3BhaXIocl9rZXksIG1hcHBlZF90eXBlKCkpKS5maXJzdC0+c2Vjb25kOworI2Vsc2UKKwlpbnNlcnQocl9rZXkpOworCXJldHVybiB0cmFpdHNfYmFzZTo6c19udWxsX3R5cGU7CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgaW5saW5lIHN0ZDo6cGFpcjxwb2ludF9pdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydChjb25zdF9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgcG9pbnRfaXRlcmF0b3IKKyAgICAgIGZpbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZChfX0ZJTEVfXywgX19MSU5FX18pOykKKwllbnRyeV9wb2ludGVyIHBfZSA9IGZpbmRfaW1wKHJfa2V5KTsKKwlyZXR1cm4gcG9pbnRfaXRlcmF0b3IocF9lID09IDAgPyAwOiAmcF9lLT5tX3ZhbHVlKTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHBvaW50X2NvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoX19GSUxFX18sIF9fTElORV9fKTspCisJZW50cnlfcG9pbnRlciBwX2UgPSBmaW5kX2ltcChyX2tleSk7CisJcmV0dXJuIHBvaW50X2NvbnN0X2l0ZXJhdG9yKHBfZSA9PSAwID8gMDogJnBfZS0+bV92YWx1ZSk7CisgICAgICB9CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBlcmFzZShrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIGVyYXNlX2lmKFByZWQpOworCisgICAgICB2b2lkCisgICAgICBjbGVhcigpOworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCk7CisKKyAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdDsKKworICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBlbmQoKTsKKworICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdDsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfdmFsaWQoY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIGNvbnN0OworI2VuZGlmCisKKyNpZmRlZiBQQl9EU19MVV9NQVBfVFJBQ0VfCisgICAgICB2b2lkCisgICAgICB0cmFjZSgpIGNvbnN0OworI2VuZGlmCisKKyAgICBwcm90ZWN0ZWQ6CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgICAgdm9pZAorICAgICAgY29weV9mcm9tX3JhbmdlKEl0LCBJdCk7CisKKyAgICBwcml2YXRlOgorI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyAgICAgIGZyaWVuZCBjbGFzcyBpdGVyYXRvcl87CisjZW5kaWYKKworICAgICAgZnJpZW5kIGNsYXNzIGNvbnN0X2l0ZXJhdG9yXzsKKworICAgICAgaW5saW5lIGVudHJ5X3BvaW50ZXIKKyAgICAgIGFsbG9jYXRlX25ld19lbnRyeShjb25zdF9yZWZlcmVuY2UsIGZhbHNlX3R5cGUpOworCisgICAgICBpbmxpbmUgZW50cnlfcG9pbnRlcgorICAgICAgYWxsb2NhdGVfbmV3X2VudHJ5KGNvbnN0X3JlZmVyZW5jZSwgdHJ1ZV90eXBlKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWV0YWRhdGE+CisgICAgICBpbmxpbmUgc3RhdGljIHZvaWQKKyAgICAgIGluaXRfZW50cnlfbWV0YWRhdGEoZW50cnlfcG9pbnRlciwgdHlwZV90b190eXBlPE1ldGFkYXRhPik7CisKKyAgICAgIGlubGluZSBzdGF0aWMgdm9pZAorICAgICAgaW5pdF9lbnRyeV9tZXRhZGF0YShlbnRyeV9wb2ludGVyLCB0eXBlX3RvX3R5cGU8bnVsbF90eXBlPik7CisKKyAgICAgIHZvaWQKKyAgICAgIGRlYWxsb2NhdGVfYWxsKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlX25leHQoZW50cnlfcG9pbnRlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIGFjdHVhbF9lcmFzZV9lbnRyeShlbnRyeV9wb2ludGVyKTsKKworICAgICAgdm9pZAorICAgICAgaW5jX2l0X3N0YXRlKGNvbnN0X3BvaW50ZXImIHJfcF92YWx1ZSwgZW50cnlfcG9pbnRlciYgcl9wb3MpIGNvbnN0CisgICAgICB7CisJcl9wb3MgPSByX3Bvcy0+bV9wX25leHQ7CisJcl9wX3ZhbHVlID0gKHJfcG9zID09IDApID8gMCA6ICZyX3Bvcy0+bV92YWx1ZTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWV0YWRhdGE+CisgICAgICBpbmxpbmUgc3RhdGljIGJvb2wKKyAgICAgIGFwcGx5X3VwZGF0ZShlbnRyeV9wb2ludGVyLCB0eXBlX3RvX3R5cGU8TWV0YWRhdGE+KTsKKworICAgICAgaW5saW5lIHN0YXRpYyBib29sCisgICAgICBhcHBseV91cGRhdGUoZW50cnlfcG9pbnRlciwgdHlwZV90b190eXBlPG51bGxfdHlwZT4pOworCisgICAgICBpbmxpbmUgZW50cnlfcG9pbnRlcgorICAgICAgZmluZF9pbXAoa2V5X2NvbnN0X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgICAgIHN0YXRpYyBlbnRyeV9hbGxvY2F0b3IgCQkJc19lbnRyeV9hbGxvY2F0b3I7CisgICAgICBzdGF0aWMgRXFfRm4gCQkJCXNfZXFfZm47CisgICAgICBzdGF0aWMgVXBkYXRlX1BvbGljeSAJCQlzX3VwZGF0ZV9wb2xpY3k7CisgICAgICBzdGF0aWMgdHlwZV90b190eXBlPHVwZGF0ZV9tZXRhZGF0YT4gCXNfbWV0YWRhdGFfdHlwZV9pbmRpY2F0b3I7CisgICAgICBzdGF0aWMgbnVsbF90eXBlIAkJCQlzX251bGxfdHlwZTsKKworICAgICAgbXV0YWJsZSBlbnRyeV9wb2ludGVyIAkJCW1fcF9sOworICAgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vaW5mb19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vZGVidWdfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vZXJhc2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vdHJhY2VfZm5faW1wcy5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfTFVfVFJBSVRTX0JBU0UKKyN1bmRlZiBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQworI3VuZGVmIFBCX0RTX0xVX05BTUUKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy90cmFjZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL3RyYWNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZDZkNjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy90cmFjZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDU5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGxpc3RfdXBkYXRlX21hcF8vdHJhY2VfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBsdV9tYXBfLgorICovCisKKyNpZmRlZiBQQl9EU19MVV9NQVBfVFJBQ0VfCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0cmFjZSgpIGNvbnN0Cit7CisgIHN0ZDo6Y2VyciA8PCBtX3BfbCA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworICBjb25zdF9lbnRyeV9wb2ludGVyIHBfbCA9IG1fcF9sOworICB3aGlsZSAocF9sICE9IDApCisgICAgeworICAgICAgc3RkOjpjZXJyIDw8IFBCX0RTX1YyRihwX2wtPm1fdmFsdWUpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHBfbCA9IHBfbC0+bV9wX25leHQ7CisgICAgfQorICBzdGQ6OmNlcnIgPDwgc3RkOjplbmRsOworfQorCisjZW5kaWYgCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9wb2xpY3kvbHVfY291bnRlcl9tZXRhZGF0YS5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfcG9saWN5L2x1X2NvdW50ZXJfbWV0YWRhdGEuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MWZmY2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfcG9saWN5L2x1X2NvdW50ZXJfbWV0YWRhdGEuaHBwCkBAIC0wLDAgKzEsODcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbHVfY291bnRlcl9tZXRhZGF0YS5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9uIG9mIGEgbHUgY291bnRlciBwb2xpY3kncyBtZXRhZGF0YS4KKyAqLworCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGU+CisgICAgICBjbGFzcyBsdV9jb3VudGVyX3BvbGljeV9iYXNlOworCisgICAgLy8vIEEgbGlzdC11cGRhdGUgbWV0YWRhdGEgdHlwZSB0aGF0IG1vdmVzIGVsZW1lbnRzIHRvIHRoZSBmcm9udCBvZgorICAgIC8vLyB0aGUgbGlzdCBiYXNlZCBvbiB0aGUgY291bnRlciBhbGdvcml0aG0uCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9UeXBlID0gc3RkOjpzaXplX3Q+CisgICAgICBjbGFzcyBsdV9jb3VudGVyX21ldGFkYXRhCisgICAgICB7CisgICAgICBwdWJsaWM6CisJdHlwZWRlZiBTaXplX1R5cGUgCXNpemVfdHlwZTsKKworICAgICAgcHJpdmF0ZToKKwlsdV9jb3VudGVyX21ldGFkYXRhKHNpemVfdHlwZSBpbml0X2NvdW50KSA6IG1fY291bnQoaW5pdF9jb3VudCkKKwl7IH0KKworCWZyaWVuZCBjbGFzcyBsdV9jb3VudGVyX3BvbGljeV9iYXNlPHNpemVfdHlwZT47CisKKwltdXRhYmxlIHNpemVfdHlwZSAJbV9jb3VudDsKKyAgICB9OworCisgICAgLy8vIEJhc2UgY2xhc3MgZm9yIGxpc3QtdXBkYXRlIGNvdW50ZXIgcG9saWN5LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZT4KKyAgICAgIGNsYXNzIGx1X2NvdW50ZXJfcG9saWN5X2Jhc2UKKyAgICAgIHsKKyAgICAgIHByb3RlY3RlZDoKKwl0eXBlZGVmIFNpemVfVHlwZSAJc2l6ZV90eXBlOworCisJbHVfY291bnRlcl9tZXRhZGF0YTxzaXplX3R5cGU+CisJb3BlcmF0b3IoKShzaXplX3R5cGUgbWF4X3NpemUpIGNvbnN0CisJeyByZXR1cm4gbHVfY291bnRlcl9tZXRhZGF0YTxTaXplX1R5cGU+KHN0ZDo6cmFuZCgpICUgbWF4X3NpemUpOyB9CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBNZXRhZGF0YV9SZWZlcmVuY2U+CisJYm9vbAorCW9wZXJhdG9yKCkoTWV0YWRhdGFfUmVmZXJlbmNlIHJfZGF0YSwgc2l6ZV90eXBlIG1fbWF4X2NvdW50KSBjb25zdAorCXsKKwkgIGlmICgrK3JfZGF0YS5tX2NvdW50ICE9IG1fbWF4X2NvdW50KQorCSAgICByZXR1cm4gZmFsc2U7CisJICByX2RhdGEubV9jb3VudCA9IDA7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICB9OworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9wb2xpY3kvc2FtcGxlX3VwZGF0ZV9wb2xpY3kuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX3BvbGljeS9zYW1wbGVfdXBkYXRlX3BvbGljeS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkNzg0ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9wb2xpY3kvc2FtcGxlX3VwZGF0ZV9wb2xpY3kuaHBwCkBAIC0wLDAgKzEsNzYgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc2FtcGxlX3VwZGF0ZV9wb2xpY3kuaHBwCisgKiBDb250YWlucyBhIHNhbXBsZSBwb2xpY3kgZm9yIGxpc3QgdXBkYXRlIGNvbnRhaW5lcnMuCisgKi8KKworI2lmbmRlZiBQQl9EU19TQU1QTEVfVVBEQVRFX1BPTElDWV9IUFAKKyNkZWZpbmUgUEJfRFNfU0FNUExFX1VQREFURV9QT0xJQ1lfSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIC8vLyBBIHNhbXBsZSBsaXN0LXVwZGF0ZSBwb2xpY3kuCisgIHN0cnVjdCBzYW1wbGVfdXBkYXRlX3BvbGljeQorICB7CisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgc2FtcGxlX3VwZGF0ZV9wb2xpY3koKTsKKworICAgIC8vLyBDb3B5IGNvbnN0cnVjdG9yLgorICAgIHNhbXBsZV91cGRhdGVfcG9saWN5KGNvbnN0IHNhbXBsZV91cGRhdGVfcG9saWN5Jik7CisKKyAgICAvLy8gU3dhcHMgY29udGVudC4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoc2FtcGxlX3VwZGF0ZV9wb2xpY3kmIG90aGVyKTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8vIE1ldGFkYXRhIG9uIHdoaWNoIHRoaXMgZnVuY3RvciBvcGVyYXRlcy4KKyAgICB0eXBlZGVmIHNvbWVfbWV0YWRhdGFfdHlwZSBtZXRhZGF0YV90eXBlOworCisgICAgLy8vIENyZWF0ZXMgYSBtZXRhZGF0YSBvYmplY3QuCisgICAgbWV0YWRhdGFfdHlwZQorICAgIG9wZXJhdG9yKCkoKSBjb25zdDsKKworICAgIC8vLyBEZWNpZGVzIHdoZXRoZXIgYSBtZXRhZGF0YSBvYmplY3Qgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBmcm9udAorICAgIC8vLyBvZiB0aGUgbGlzdC4gQSBsaXN0LXVwZGF0ZSBiYXNlZCBjb250YWluZXJzIG9iamVjdCB3aWxsIGNhbGwKKyAgICAvLy8gdGhpcyBtZXRob2QgdG8gZGVjaWRlIHdoZXRoZXIgdG8gbW92ZSBhIG5vZGUgdG8gdGhlIGZyb250IG9mCisgICAgLy8vIHRoZSBsaXN0LiBUaGUgbWV0aG9kIHNob3VsZSByZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUKKyAgICAvLy8gbW92ZWQgdG8gdGhlIGZyb250IG9mIHRoZSBsaXN0LgorICAgIGJvb2wKKyAgICBvcGVyYXRvcigpKG1ldGFkYXRhX3JlZmVyZW5jZSkgY29uc3Q7CisgIH07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMWU1MGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMjU3IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIG92X3RyZWVfbWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIG92X3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6dmFsdWVfYWxsb2NhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6c192YWx1ZV9hbGxvYzsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjptZXRhZGF0YV9hbGxvY2F0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjpzX21ldGFkYXRhX2FsbG9jOworCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfT1ZfVFJFRV9OQU1FKCkgOgorICBtX2FfdmFsdWVzKDApLAorICBtX2FfbWV0YWRhdGEoMCksCisgIG1fZW5kX2l0KDApLAorICBtX3NpemUoMCkKK3sgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX09WX1RSRUVfTkFNRShjb25zdCBDbXBfRm4mIHJfY21wX2ZuKSA6CisgIGNtcF9mbihyX2NtcF9mbiksCisgIG1fYV92YWx1ZXMoMCksCisgIG1fYV9tZXRhZGF0YSgwKSwKKyAgbV9lbmRfaXQoMCksCisgIG1fc2l6ZSgwKQoreyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkgfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfT1ZfVFJFRV9OQU1FKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4sIGNvbnN0IG5vZGVfdXBkYXRlJiByX25vZGV1KSA6CisgIGNtcF9mbihyX2NtcF9mbiksCisgIG5vZGVfdXBkYXRlKHJfbm9kZXUpLAorICBtX2FfdmFsdWVzKDApLAorICBtX2FfbWV0YWRhdGEoMCksCisgIG1fZW5kX2l0KDApLAorICBtX3NpemUoMCkKK3sgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX09WX1RSRUVfTkFNRShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpIDoKKyNpZmRlZiBQQl9EU19UUkVFX1RSQUNFCisgIHRyYWNlX2Jhc2Uob3RoZXIpLAorI2VuZGlmCisgIGNtcF9mbihvdGhlciksCisgIG5vZGVfdXBkYXRlKG90aGVyKSwKKyAgbV9hX3ZhbHVlcygwKSwKKyAgbV9hX21ldGFkYXRhKDApLAorICBtX2VuZF9pdCgwKSwKKyAgbV9zaXplKDApCit7CisgIGNvcHlfZnJvbV9vcmRlcmVkX3JhbmdlKG90aGVyLmJlZ2luKCksIG90aGVyLmVuZCgpKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citjb3B5X2Zyb21fcmFuZ2UoSXQgZmlyc3RfaXQsIEl0IGxhc3RfaXQpCit7CisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICB0eXBlZGVmIHN0ZDo6bWFwPGtleV90eXBlLCBtYXBwZWRfdHlwZSwgQ21wX0ZuLAorCQkgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDx2YWx1ZV90eXBlPjo6b3RoZXI+CisgICAgbWFwX3R5cGU7CisjZWxzZQorICB0eXBlZGVmIHN0ZDo6c2V0PGtleV90eXBlLCBDbXBfRm4sCisJCSAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPEtleT46Om90aGVyPgorICAgIG1hcF90eXBlOworI2VuZGlmCisKKyAgbWFwX3R5cGUgbShmaXJzdF9pdCwgbGFzdF9pdCk7CisgIGNvcHlfZnJvbV9vcmRlcmVkX3JhbmdlKG0uYmVnaW4oKSwgbS5lbmQoKSk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgSXQ+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citjb3B5X2Zyb21fb3JkZXJlZF9yYW5nZShJdCBmaXJzdF9pdCwgSXQgbGFzdF9pdCkKK3sKKyAgY29uc3Qgc2l6ZV90eXBlIGxlbiA9IHN0ZDo6ZGlzdGFuY2UoZmlyc3RfaXQsIGxhc3RfaXQpOworICBpZiAobGVuID09IDApCisgICAgcmV0dXJuOworCisgIHZhbHVlX3ZlY3RvciBhX3ZhbHVlcyA9IHNfdmFsdWVfYWxsb2MuYWxsb2NhdGUobGVuKTsKKyAgaXRlcmF0b3IgdGFyZ2V0X2l0ID0gYV92YWx1ZXM7CisgIEl0IHNvdXJjZV9pdCA9IGZpcnN0X2l0OworICBJdCBzb3VyY2VfZW5kX2l0ID0gbGFzdF9pdDsKKworICBjb25kX2R0b3I8c2l6ZV90eXBlPiBjZChhX3ZhbHVlcywgdGFyZ2V0X2l0LCBsZW4pOworICB3aGlsZSAoc291cmNlX2l0ICE9IHNvdXJjZV9lbmRfaXQpCisgICAgeworICAgICAgdm9pZCogX192ID0gY29uc3RfY2FzdDx2b2lkKj4oc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KHRhcmdldF9pdCkpOworICAgICAgbmV3IChfX3YpIHZhbHVlX3R5cGUoKnNvdXJjZV9pdCsrKTsKKyAgICAgICsrdGFyZ2V0X2l0OworICAgIH0KKworICByZWFsbG9jYXRlX21ldGFkYXRhKChub2RlX3VwZGF0ZSopdGhpcywgbGVuKTsKKyAgY2Quc2V0X25vX2FjdGlvbigpOworICBtX2FfdmFsdWVzID0gYV92YWx1ZXM7CisgIG1fc2l6ZSA9IGxlbjsKKyAgbV9lbmRfaXQgPSBtX2FfdmFsdWVzICsgbV9zaXplOworICB1cGRhdGUoUEJfRFNfbm9kZV9iZWdpbl9pbXAoKSwgKG5vZGVfdXBkYXRlKil0aGlzKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgIGZvciAoY29uc3RfaXRlcmF0b3IgZGJnX2l0ID0gbV9hX3ZhbHVlczsgZGJnX2l0ICE9IG1fZW5kX2l0OyArK2RiZ19pdCkKKyAgICBkZWJ1Z19iYXNlOjppbnNlcnRfbmV3KFBCX0RTX1YyRigqZGJnX2l0KSk7CisjZW5kaWYKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIEl0Pgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY29weV9mcm9tX29yZGVyZWRfcmFuZ2UoSXQgZmlyc3RfaXQsIEl0IGxhc3RfaXQsIEl0IG90aGVyX2ZpcnN0X2l0LAorCQkJSXQgb3RoZXJfbGFzdF9pdCkKK3sKKyAgY2xlYXIoKTsKKyAgY29uc3Qgc2l6ZV90eXBlIGxlbiA9IHN0ZDo6ZGlzdGFuY2UoZmlyc3RfaXQsIGxhc3RfaXQpCisgICAgCQkJICsgc3RkOjpkaXN0YW5jZShvdGhlcl9maXJzdF9pdCwgb3RoZXJfbGFzdF9pdCk7CisKKyAgdmFsdWVfdmVjdG9yIGFfdmFsdWVzID0gc192YWx1ZV9hbGxvYy5hbGxvY2F0ZShsZW4pOworCisgIGl0ZXJhdG9yIHRhcmdldF9pdCA9IGFfdmFsdWVzOworICBJdCBzb3VyY2VfaXQgPSBmaXJzdF9pdDsKKyAgSXQgc291cmNlX2VuZF9pdCA9IGxhc3RfaXQ7CisKKyAgY29uZF9kdG9yPHNpemVfdHlwZT4gY2QoYV92YWx1ZXMsIHRhcmdldF9pdCwgbGVuKTsKKyAgd2hpbGUgKHNvdXJjZV9pdCAhPSBzb3VyY2VfZW5kX2l0KQorICAgIHsKKyAgICAgIG5ldyAoY29uc3RfY2FzdDx2b2lkKiA+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqID4odGFyZ2V0X2l0KSkpCisJdmFsdWVfdHlwZSgqc291cmNlX2l0KyspOworICAgICAgKyt0YXJnZXRfaXQ7CisgICAgfQorCisgIHNvdXJjZV9pdCA9IG90aGVyX2ZpcnN0X2l0OworICBzb3VyY2VfZW5kX2l0ID0gb3RoZXJfbGFzdF9pdDsKKworICB3aGlsZSAoc291cmNlX2l0ICE9IHNvdXJjZV9lbmRfaXQpCisgICAgeworICAgICAgbmV3IChjb25zdF9jYXN0PHZvaWQqID4oc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCogPih0YXJnZXRfaXQpKSkKKwl2YWx1ZV90eXBlKCpzb3VyY2VfaXQrKyk7CisgICAgICArK3RhcmdldF9pdDsKKyAgICB9CisKKyAgcmVhbGxvY2F0ZV9tZXRhZGF0YSgobm9kZV91cGRhdGUqICl0aGlzLCBsZW4pOworICBjZC5zZXRfbm9fYWN0aW9uKCk7CisgIG1fYV92YWx1ZXMgPSBhX3ZhbHVlczsKKyAgbV9zaXplID0gbGVuOworICBtX2VuZF9pdCA9IG1fYV92YWx1ZXMgKyBtX3NpemU7CisgIHVwZGF0ZShQQl9EU19ub2RlX2JlZ2luX2ltcCgpLCAobm9kZV91cGRhdGUqICl0aGlzKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgIGZvciAoY29uc3RfaXRlcmF0b3IgZGJnX2l0ID0gbV9hX3ZhbHVlczsgZGJnX2l0ICE9IG1fZW5kX2l0OyArK2RiZ19pdCkKKyAgICBkZWJ1Z19iYXNlOjppbnNlcnRfbmV3KFBCX0RTX1YyRigqZGJnX2l0KSk7CisjZW5kaWYKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICB2YWx1ZV9zd2FwKG90aGVyKTsKKyAgc3RkOjpzd2FwKHN0YXRpY19jYXN0PGNtcF9mbiY+KCp0aGlzKSwKKwkgICAgc3RhdGljX2Nhc3Q8Y21wX2ZuJj4ob3RoZXIpKTsKKyAgc3RkOjpzd2FwKHN0YXRpY19jYXN0PHRyYWl0c19iYXNlJj4oKnRoaXMpLAorCSAgICBzdGF0aWNfY2FzdDx0cmFpdHNfYmFzZSY+KG90aGVyKSk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit2YWx1ZV9zd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpzd2FwKG90aGVyKTspCisgIHN0ZDo6c3dhcChtX2FfdmFsdWVzLCBvdGhlci5tX2FfdmFsdWVzKTsKKyAgc3RkOjpzd2FwKG1fYV9tZXRhZGF0YSwgb3RoZXIubV9hX21ldGFkYXRhKTsKKyAgc3RkOjpzd2FwKG1fc2l6ZSwgb3RoZXIubV9zaXplKTsKKyAgc3RkOjpzd2FwKG1fZW5kX2l0LCBvdGhlci5tX2VuZF9pdCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+UEJfRFNfT1ZfVFJFRV9OQU1FKCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIGNvbmRfZHRvcjxzaXplX3R5cGU+IGNkKG1fYV92YWx1ZXMsIG1fZW5kX2l0LCBtX3NpemUpOworICByZWFsbG9jYXRlX21ldGFkYXRhKChub2RlX3VwZGF0ZSopdGhpcywgMCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordXBkYXRlKG5vZGVfaXRlcmF0b3IsIG51bGxfbm9kZV91cGRhdGVfcG9pbnRlcikKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9VcGRhdGU+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit1cGRhdGUobm9kZV9pdGVyYXRvciBuZF9pdCwgTm9kZV9VcGRhdGUqIHBfdXBkYXRlKQoreworICBub2RlX2NvbnN0X2l0ZXJhdG9yIGVuZF9pdCA9IFBCX0RTX25vZGVfZW5kX2ltcCgpOworICBpZiAobmRfaXQgIT0gZW5kX2l0KQorICAgIHsKKyAgICAgIHVwZGF0ZShuZF9pdC5nZXRfbF9jaGlsZCgpLCBwX3VwZGF0ZSk7CisgICAgICB1cGRhdGUobmRfaXQuZ2V0X3JfY2hpbGQoKSwgcF91cGRhdGUpOworICAgICAgbm9kZV91cGRhdGU6Om9wZXJhdG9yKCkobmRfaXQsIGVuZF9pdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vZGVidWdfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3NzQzNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vZGVidWdfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw3OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBvdl90cmVlX21hcF8vZGVidWdfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBvdl90cmVlXy4KKyAqLworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF92YWxpZChjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGlmIChtX2FfdmFsdWVzID09IDAgfHwgbV9lbmRfaXQgPT0gMCB8fCBtX3NpemUgPT0gMCkKKyAgICBQQl9EU19ERUJVR19WRVJJRlkobV9hX3ZhbHVlcyA9PSAwICYmICBtX2VuZF9pdCA9PSAwICYmIG1fc2l6ZSA9PSAwKTsKKworICBhc3NlcnRfaXRlcmF0b3JzKF9fZmlsZSwgX19saW5lKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF9pdGVyYXRvcnMoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBkZWJ1Z19iYXNlOjpjaGVja19zaXplKG1fc2l6ZSwgX19maWxlLCBfX2xpbmUpOworICBzaXplX3R5cGUgaXRlcmF0ZWRfbnVtID0gMDsKKyAgY29uc3RfaXRlcmF0b3IgcHJldl9pdCA9IGVuZCgpOworICBQQl9EU19ERUJVR19WRVJJRlkobV9lbmRfaXQgPT0gbV9hX3ZhbHVlcyArIG1fc2l6ZSk7CisgIGZvciAoY29uc3RfaXRlcmF0b3IgaXQgPSBiZWdpbigpOyBpdCAhPSBlbmQoKTsgKytpdCkKKyAgICB7CisgICAgICArK2l0ZXJhdGVkX251bTsKKyAgICAgIGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9leGlzdHMoUEJfRFNfVjJGKCppdCksIF9fZmlsZSwgX19saW5lKTsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShsb3dlcl9ib3VuZChQQl9EU19WMkYoKml0KSkgPT0gaXQpOworICAgICAgY29uc3RfaXRlcmF0b3IgdXBwZXJfYm91bmRfaXQgPSB1cHBlcl9ib3VuZChQQl9EU19WMkYoKml0KSk7CisgICAgICAtLXVwcGVyX2JvdW5kX2l0OworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKHVwcGVyX2JvdW5kX2l0ID09IGl0KTsKKyAgICAgIGlmIChwcmV2X2l0ICE9IGVuZCgpKQorCVBCX0RTX0RFQlVHX1ZFUklGWShDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKCpwcmV2X2l0KSwKKwkJCQkJICAgICAgUEJfRFNfVjJGKCppdCkpKTsKKyAgICAgIHByZXZfaXQgPSBpdDsKKyAgICB9CisgIFBCX0RTX0RFQlVHX1ZFUklGWShpdGVyYXRlZF9udW0gPT0gbV9zaXplKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTdmMTM1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDE5MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBvdl90cmVlX21hcF8vZXJhc2VfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBvdl90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY2xlYXIoKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgaWYgKG1fc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZWFsbG9jYXRlX21ldGFkYXRhKChub2RlX3VwZGF0ZSogKXRoaXMsIDApOworICAgICAgY29uZF9kdG9yPHNpemVfdHlwZT4gY2QobV9hX3ZhbHVlcywgbV9lbmRfaXQsIG1fc2l6ZSk7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2xlYXIoKTspCisgIG1fYV92YWx1ZXMgPSAwOworICBtX3NpemUgPSAwOworICBtX2VuZF9pdCA9IG1fYV92YWx1ZXM7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9pZihQcmVkIHByZWQpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorCisjaWZkZWYgUEJfRFNfUkVHUkVTU0lPTgorICAgIHR5cGVuYW1lIF9BbGxvYzo6Z3JvdXBfYWRqdXN0b3IgYWRqdXN0KG1fc2l6ZSk7CisjZW5kaWYKKworICBzaXplX3R5cGUgbmV3X3NpemUgPSAwOworICBzaXplX3R5cGUgbnVtX3ZhbF9lcnNkID0gMDsKKworICBmb3IgKGl0ZXJhdG9yIHNvdXJjZV9pdCA9IGJlZ2luKCk7IHNvdXJjZV9pdCAhPSBtX2VuZF9pdDsgKytzb3VyY2VfaXQpCisgICAgaWYgKCFwcmVkKCpzb3VyY2VfaXQpKQorICAgICAgKytuZXdfc2l6ZTsKKyAgICBlbHNlCisgICAgICArK251bV92YWxfZXJzZDsKKworICBpZiAobmV3X3NpemUgPT0gMCkKKyAgICB7CisgICAgICBjbGVhcigpOworICAgICAgcmV0dXJuIG51bV92YWxfZXJzZDsKKyAgICB9CisKKyAgdmFsdWVfdmVjdG9yIGFfbmV3X3ZhbHVlcyA9IHNfdmFsdWVfYWxsb2MuYWxsb2NhdGUobmV3X3NpemUpOworICBpdGVyYXRvciB0YXJnZXRfaXQgPSBhX25ld192YWx1ZXM7CisgIGNvbmRfZHRvcjxzaXplX3R5cGU+IGNkKGFfbmV3X3ZhbHVlcywgdGFyZ2V0X2l0LCBuZXdfc2l6ZSk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2xlYXIoKSk7CisgIGZvciAoaXRlcmF0b3Igc291cmNlX2l0ID0gYmVnaW4oKTsgc291cmNlX2l0ICE9IG1fZW5kX2l0OyArK3NvdXJjZV9pdCkKKyAgICB7CisgICAgICBpZiAoIXByZWQoKnNvdXJjZV9pdCkpCisJeworCSAgbmV3IChjb25zdF9jYXN0PHZvaWQqPihzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4odGFyZ2V0X2l0KSkpCisJICAgIHZhbHVlX3R5cGUoKnNvdXJjZV9pdCk7CisKKwkgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6aW5zZXJ0X25ldyhQQl9EU19WMkYoKnNvdXJjZV9pdCkpKTsKKwkgICsrdGFyZ2V0X2l0OworCX0KKyAgICB9CisKKyAgcmVhbGxvY2F0ZV9tZXRhZGF0YSgobm9kZV91cGRhdGUqKXRoaXMsIG5ld19zaXplKTsKKyAgY2Quc2V0X25vX2FjdGlvbigpOworCisgIHsKKyAgICBjb25kX2R0b3I8c2l6ZV90eXBlPiBjZDEobV9hX3ZhbHVlcywgbV9lbmRfaXQsIG1fc2l6ZSk7CisgIH0KKworICBtX2FfdmFsdWVzID0gYV9uZXdfdmFsdWVzOworICBtX3NpemUgPSBuZXdfc2l6ZTsKKyAgbV9lbmRfaXQgPSB0YXJnZXRfaXQ7CisgIHVwZGF0ZShub2RlX2JlZ2luKCksIChub2RlX3VwZGF0ZSopdGhpcyk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gbnVtX3ZhbF9lcnNkOworfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgSXQ+CitJdAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfaW1wKEl0IGl0KQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgaWYgKGl0ID09IGVuZCgpKQorICAgIHJldHVybiBlbmQoKTsKKworICBQQl9EU19DSEVDS19LRVlfRVhJU1RTKFBCX0RTX1YyRigqaXQpKQorCisjaWZkZWYgUEJfRFNfUkVHUkVTU0lPTgorICAgIHR5cGVuYW1lIF9BbGxvYzo6Z3JvdXBfYWRqdXN0b3IgYWRqdXN0KG1fc2l6ZSk7CisjZW5kaWYKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9zaXplID4gMCk7CisgIHZhbHVlX3ZlY3RvciBhX3ZhbHVlcyA9IHNfdmFsdWVfYWxsb2MuYWxsb2NhdGUobV9zaXplIC0gMSk7CisgIGl0ZXJhdG9yIHNvdXJjZV9pdCA9IGJlZ2luKCk7CisgIGl0ZXJhdG9yIHNvdXJjZV9lbmRfaXQgPSBlbmQoKTsKKyAgaXRlcmF0b3IgdGFyZ2V0X2l0ID0gYV92YWx1ZXM7CisgIGl0ZXJhdG9yIHJldF9pdCA9IGVuZCgpOworCisgIGNvbmRfZHRvcjxzaXplX3R5cGU+IGNkKGFfdmFsdWVzLCB0YXJnZXRfaXQsIG1fc2l6ZSAtIDEpOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoc2l6ZV90eXBlIGNudCA9IDA7KQorCisgIHdoaWxlIChzb3VyY2VfaXQgIT0gc291cmNlX2VuZF9pdCkKKyAgICB7CisgICAgICBpZiAoc291cmNlX2l0ICE9IGl0KQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX09OTFkoKytjbnQ7KQorCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGNudCAhPSBtX3NpemUpOworCSAgbmV3IChjb25zdF9jYXN0PHZvaWQqPihzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4odGFyZ2V0X2l0KSkpCisJICAgICAgdmFsdWVfdHlwZSgqc291cmNlX2l0KTsKKworCSAgKyt0YXJnZXRfaXQ7CisJfQorICAgICAgZWxzZQorCXJldF9pdCA9IHRhcmdldF9pdDsKKyAgICArK3NvdXJjZV9pdDsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fc2l6ZSA+IDApOworICByZWFsbG9jYXRlX21ldGFkYXRhKChub2RlX3VwZGF0ZSopdGhpcywgbV9zaXplIC0gMSk7CisgIGNkLnNldF9ub19hY3Rpb24oKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjplcmFzZV9leGlzdGluZyhQQl9EU19WMkYoKml0KSk7KQorICB7CisgICAgY29uZF9kdG9yPHNpemVfdHlwZT4gY2QxKG1fYV92YWx1ZXMsIG1fZW5kX2l0LCBtX3NpemUpOworICB9CisKKyAgbV9hX3ZhbHVlcyA9IGFfdmFsdWVzOworICAtLW1fc2l6ZTsKKyAgbV9lbmRfaXQgPSBtX2FfdmFsdWVzICsgbV9zaXplOworICB1cGRhdGUobm9kZV9iZWdpbigpLCAobm9kZV91cGRhdGUqKXRoaXMpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmV0dXJuIEl0KHJldF9pdCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQoreworICBwb2ludF9pdGVyYXRvciBpdCA9IGZpbmQocl9rZXkpOworICBpZiAoaXQgPT0gZW5kKCkpCisgICAgcmV0dXJuIGZhbHNlOworICBlcmFzZShpdCk7CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9pbmZvX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9pbmZvX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ODIyOGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2luZm9fZm5faW1wcy5ocHAKQEAgLTAsMCArMSw2MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBvdl90cmVlX21hcF8vaW5mb19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIG92X3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc2l6ZSgpIGNvbnN0Cit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gbV9zaXplOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK21heF9zaXplKCkgY29uc3QKK3sgcmV0dXJuIHNfdmFsdWVfYWxsb2MubWF4X3NpemUoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VtcHR5KCkgY29uc3QKK3sgcmV0dXJuIHNpemUoKSA9PSAwOyB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjc5OTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDYzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIG92X3RyZWVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBvdl90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVhbGxvY2F0ZV9tZXRhZGF0YShudWxsX25vZGVfdXBkYXRlX3BvaW50ZXIsIHNpemVfdHlwZSkKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9VcGRhdGVfPgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVhbGxvY2F0ZV9tZXRhZGF0YShOb2RlX1VwZGF0ZV8qICwgc2l6ZV90eXBlIG5ld19zaXplKQoreworICBtZXRhZGF0YV9wb2ludGVyIGFfbmV3X21ldGFkYXRhX3ZlYyA9KG5ld19zaXplID09IDApID8gMCA6IHNfbWV0YWRhdGFfYWxsb2MuYWxsb2NhdGUobmV3X3NpemUpOworCisgIGlmIChtX2FfbWV0YWRhdGEgIT0gMCkKKyAgICB7CisgICAgICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG1fc2l6ZTsgKytpKQorCW1fYV9tZXRhZGF0YVtpXS5+bWV0YWRhdGFfdHlwZSgpOworICAgICAgc19tZXRhZGF0YV9hbGxvYy5kZWFsbG9jYXRlKG1fYV9tZXRhZGF0YSwgbV9zaXplKTsKKyAgICB9CisgIHN0ZDo6c3dhcChtX2FfbWV0YWRhdGEsIGFfbmV3X21ldGFkYXRhX3ZlYyk7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhNmFkMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTAzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIG92X3RyZWVfbWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBvdl90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX2NvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Citub2RlX2JlZ2luKCkgY29uc3QKK3sgcmV0dXJuIFBCX0RTX25vZGVfYmVnaW5faW1wKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9jb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm9kZV9lbmQoKSBjb25zdAoreyByZXR1cm4gUEJfRFNfbm9kZV9lbmRfaW1wKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm9kZV9iZWdpbigpCit7IHJldHVybiBQQl9EU19ub2RlX2JlZ2luX2ltcCgpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vZGVfZW5kKCkKK3sgcmV0dXJuIFBCX0RTX25vZGVfZW5kX2ltcCgpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfY29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX25vZGVfYmVnaW5faW1wKCkgY29uc3QKK3sKKyAgcmV0dXJuIG5vZGVfY29uc3RfaXRlcmF0b3IoY29uc3RfY2FzdDxwb2ludGVyPihtaWRfcG9pbnRlcihiZWdpbigpLCBlbmQoKSkpLAorCQkJICAgICAgY29uc3RfY2FzdDxwb2ludGVyPihiZWdpbigpKSwKKwkJCSAgICAgIGNvbnN0X2Nhc3Q8cG9pbnRlcj4oZW5kKCkpLChtX2FfbWV0YWRhdGEgPT0gMCk/CisJCQkgICAgICAwIDoKKwkJCSAgICAgIG1pZF9wb2ludGVyKG1fYV9tZXRhZGF0YSwgbV9hX21ldGFkYXRhICsgbV9zaXplKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfY29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX25vZGVfZW5kX2ltcCgpIGNvbnN0Cit7CisgIHJldHVybiBub2RlX2NvbnN0X2l0ZXJhdG9yKGVuZCgpLCBlbmQoKSwgZW5kKCksCisJCSAgICAgKG1fYV9tZXRhZGF0YSA9PSAwKSA/IDAgOiBtX2FfbWV0YWRhdGEgKyBtX3NpemUpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19ub2RlX2JlZ2luX2ltcCgpCit7CisgIHJldHVybiBub2RlX2l0ZXJhdG9yKG1pZF9wb2ludGVyKGJlZ2luKCksIGVuZCgpKSwgYmVnaW4oKSwgZW5kKCksCisJCSAgICAgICAobV9hX21ldGFkYXRhID09IDApID8gMCA6IG1pZF9wb2ludGVyKG1fYV9tZXRhZGF0YSwgbV9hX21ldGFkYXRhICsgbV9zaXplKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX25vZGVfZW5kX2ltcCgpCit7CisgIHJldHVybiBub2RlX2l0ZXJhdG9yKGVuZCgpLCBlbmQoKSwKKwkJICBlbmQoKSwobV9hX21ldGFkYXRhID09IDApID8gMCA6IG1fYV9tZXRhZGF0YSArIG1fc2l6ZSk7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vbm9kZV9pdGVyYXRvcnMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9ub2RlX2l0ZXJhdG9ycy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM4NDU3MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vbm9kZV9pdGVyYXRvcnMuaHBwCkBAIC0wLDAgKzEsMjkxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIG92X3RyZWVfbWFwXy9ub2RlX2l0ZXJhdG9ycy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBvdl90cmVlXy4KKyAqLworCisjaWZuZGVmIFBCX0RTX09WX1RSRUVfTk9ERV9JVEVSQVRPUlNfSFBQCisjZGVmaW5lIFBCX0RTX09WX1RSRUVfTk9ERV9JVEVSQVRPUlNfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvdGFnX2FuZF90cmFpdC5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlX3V0aWxzLmhwcD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyNkZWZpbmUgUEJfRFNfT1ZfVFJFRV9DT05TVF9OT0RFX0lURVJBVE9SX0NfREVDCVwKKyAgICBvdl90cmVlX25vZGVfY29uc3RfaXRfPFZhbHVlX1R5cGUsIE1ldGFkYXRhX1R5cGUsIF9BbGxvYz4KKworICAgIC8vLyBDb25zdCBub2RlIHJlZmVyZW5jZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZV9UeXBlLCB0eXBlbmFtZSBNZXRhZGF0YV9UeXBlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3Mgb3ZfdHJlZV9ub2RlX2NvbnN0X2l0XworICAgIHsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorICAgICAgVmFsdWVfVHlwZT46Om90aGVyOjpwb2ludGVyCisgICAgICBwb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDwKKwlWYWx1ZV9UeXBlPjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIKKyAgICAgIGNvbnN0X3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorCU1ldGFkYXRhX1R5cGU+OjpvdGhlcjo6Y29uc3RfcG9pbnRlcgorICAgICAgY29uc3RfbWV0YWRhdGFfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiBQQl9EU19PVl9UUkVFX0NPTlNUX05PREVfSVRFUkFUT1JfQ19ERUMgdGhpc190eXBlOworCisgICAgcHJvdGVjdGVkOgorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQdHI+CisgICAgICBpbmxpbmUgc3RhdGljIFB0cgorICAgICAgbWlkX3BvaW50ZXIoUHRyIHBfYmVnaW4sIFB0ciBwX2VuZCkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9lbmQgPj0gcF9iZWdpbik7CisJcmV0dXJuIChwX2JlZ2luICsgKHBfZW5kIC0gcF9iZWdpbikgLyAyKTsKKyAgICAgIH0KKworICAgIHB1YmxpYzoKKworICAgICAgdHlwZWRlZiB0cml2aWFsX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgdHlwZWRlZiB0cml2aWFsX2l0ZXJhdG9yX2RpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorCVZhbHVlX1R5cGU+OjpvdGhlcjo6Y29uc3RfcG9pbnRlcgorICAgICAgdmFsdWVfdHlwZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisJdHlwZW5hbWUgcmVtb3ZlX2NvbnN0PAorCVZhbHVlX1R5cGU+Ojp0eXBlPjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIKKyAgICAgIHJlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisJdHlwZW5hbWUgcmVtb3ZlX2NvbnN0PAorCVZhbHVlX1R5cGU+Ojp0eXBlPjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIKKyAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiBNZXRhZGF0YV9UeXBlIG1ldGFkYXRhX3R5cGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorCW1ldGFkYXRhX3R5cGU+OjpvdGhlcjo6Y29uc3RfcmVmZXJlbmNlCisgICAgICBtZXRhZGF0YV9jb25zdF9yZWZlcmVuY2U7CisKKyAgICBwdWJsaWM6CisgICAgICBpbmxpbmUKKyAgICAgIG92X3RyZWVfbm9kZV9jb25zdF9pdF8oY29uc3RfcG9pbnRlciBwX25kID0gMCwgIGNvbnN0X3BvaW50ZXIgcF9iZWdpbl9uZCA9IDAsICBjb25zdF9wb2ludGVyIHBfZW5kX25kID0gMCwgIGNvbnN0X21ldGFkYXRhX3BvaW50ZXIgcF9tZXRhZGF0YSA9IDApIDogbV9wX3ZhbHVlKGNvbnN0X2Nhc3Q8cG9pbnRlcj4ocF9uZCkpLCBtX3BfYmVnaW5fdmFsdWUoY29uc3RfY2FzdDxwb2ludGVyPihwX2JlZ2luX25kKSksIG1fcF9lbmRfdmFsdWUoY29uc3RfY2FzdDxwb2ludGVyPihwX2VuZF9uZCkpLCBtX3BfbWV0YWRhdGEocF9tZXRhZGF0YSkKKyAgICAgIHsgfQorCisgICAgICBpbmxpbmUgY29uc3RfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9wX3ZhbHVlOyB9CisKKyAgICAgIGlubGluZSBtZXRhZGF0YV9jb25zdF9yZWZlcmVuY2UKKyAgICAgIGdldF9tZXRhZGF0YSgpIGNvbnN0CisgICAgICB7CisJZW51bQorCSAgeworCSAgICBoYXNfbWV0YWRhdGEgPSAhaXNfc2FtZTxNZXRhZGF0YV9UeXBlLCBudWxsX3R5cGU+Ojp2YWx1ZQorCSAgfTsKKworCVBCX0RTX1NUQVRJQ19BU1NFUlQoc2hvdWxkX2hhdmVfbWV0YWRhdGEsIGhhc19tZXRhZGF0YSk7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9tZXRhZGF0YSAhPSAwKTsKKwlyZXR1cm4gKm1fcF9tZXRhZGF0YTsKKyAgICAgIH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIG5vZGUgaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBsZWZ0IG5vZGUuCisgICAgICBpbmxpbmUgdGhpc190eXBlCisgICAgICBnZXRfbF9jaGlsZCgpIGNvbnN0CisgICAgICB7CisJaWYgKG1fcF9iZWdpbl92YWx1ZSA9PSBtX3BfdmFsdWUpCisJICByZXR1cm4gKHRoaXNfdHlwZShtX3BfYmVnaW5fdmFsdWUsIG1fcF9iZWdpbl92YWx1ZSwgbV9wX2JlZ2luX3ZhbHVlKSk7CisKKwljb25zdF9tZXRhZGF0YV9wb2ludGVyIHBfYmVnaW5fbWV0YWRhdGEgPQorCSAgbV9wX21ldGFkYXRhIC0gKG1fcF92YWx1ZSAtIG1fcF9iZWdpbl92YWx1ZSk7CisKKwlyZXR1cm4gKHRoaXNfdHlwZShtaWRfcG9pbnRlcihtX3BfYmVnaW5fdmFsdWUsIG1fcF92YWx1ZSksCisJCQkgIG1fcF9iZWdpbl92YWx1ZSwKKwkJCSAgbV9wX3ZhbHVlLAorCQkJICBtaWRfcG9pbnRlcihwX2JlZ2luX21ldGFkYXRhLCBtX3BfbWV0YWRhdGEpKSk7CisgICAgICB9CisKKyAgICAgIC8vLyBSZXR1cm5zIHRoZSBub2RlIGl0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmlnaHQgbm9kZS4KKyAgICAgIGlubGluZSB0aGlzX3R5cGUKKyAgICAgIGdldF9yX2NoaWxkKCkgY29uc3QKKyAgICAgIHsKKwlpZiAobV9wX3ZhbHVlID09IG1fcF9lbmRfdmFsdWUpCisJICByZXR1cm4gKHRoaXNfdHlwZShtX3BfZW5kX3ZhbHVlLCBtX3BfZW5kX3ZhbHVlLCBtX3BfZW5kX3ZhbHVlKSk7CisKKwljb25zdF9tZXRhZGF0YV9wb2ludGVyIHBfZW5kX21ldGFkYXRhID0KKwkgIG1fcF9tZXRhZGF0YSArIChtX3BfZW5kX3ZhbHVlIC0gbV9wX3ZhbHVlKTsKKworCXJldHVybiAodGhpc190eXBlKG1pZF9wb2ludGVyKG1fcF92YWx1ZSArIDEsIG1fcF9lbmRfdmFsdWUpLAorCQkJICBtX3BfdmFsdWUgKyAxLAorCQkJICBtX3BfZW5kX3ZhbHVlLChtX3BfbWV0YWRhdGEgPT0gMCkgPworCQkJICAwIDogbWlkX3BvaW50ZXIobV9wX21ldGFkYXRhICsgMSwgcF9lbmRfbWV0YWRhdGEpKSk7CisgICAgICB9CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHRoaXNfdHlwZSYgb3RoZXIpIGNvbnN0CisgICAgICB7CisJY29uc3QgYm9vbCBpc19lbmQgPSBtX3BfYmVnaW5fdmFsdWUgPT0gbV9wX2VuZF92YWx1ZTsKKwljb25zdCBib29sIGlzX290aGVyX2VuZCA9IG90aGVyLm1fcF9iZWdpbl92YWx1ZSA9PSBvdGhlci5tX3BfZW5kX3ZhbHVlOworCisJaWYgKGlzX2VuZCkKKwkgIHJldHVybiAoaXNfb3RoZXJfZW5kKTsKKworCWlmIChpc19vdGhlcl9lbmQpCisJICByZXR1cm4gKGlzX2VuZCk7CisKKwlyZXR1cm4gbV9wX3ZhbHVlID09IG90aGVyLm1fcF92YWx1ZTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgdGhpc190eXBlJiBvdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuICFvcGVyYXRvcj09KG90aGVyKTsgfQorCisgICAgcHVibGljOgorICAgICAgcG9pbnRlciBtX3BfdmFsdWU7CisgICAgICBwb2ludGVyIG1fcF9iZWdpbl92YWx1ZTsKKyAgICAgIHBvaW50ZXIgbV9wX2VuZF92YWx1ZTsKKworICAgICAgY29uc3RfbWV0YWRhdGFfcG9pbnRlciBtX3BfbWV0YWRhdGE7CisgICAgfTsKKworI2RlZmluZSBQQl9EU19PVl9UUkVFX05PREVfSVRFUkFUT1JfQ19ERUMgXAorICAgIG92X3RyZWVfbm9kZV9pdF88VmFsdWVfVHlwZSwgTWV0YWRhdGFfVHlwZSwgX0FsbG9jPgorCisgICAgLy8vIE5vZGUgcmVmZXJlbmNlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIHR5cGVuYW1lIE1ldGFkYXRhX1R5cGUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBvdl90cmVlX25vZGVfaXRfIDogcHVibGljIFBCX0RTX09WX1RSRUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DX0RFQworICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBQQl9EU19PVl9UUkVFX05PREVfSVRFUkFUT1JfQ19ERUMgdGhpc190eXBlOworCisgICAgICB0eXBlZGVmIFBCX0RTX09WX1RSRUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DX0RFQyBiYXNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpwb2ludGVyIHBvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfbWV0YWRhdGFfcG9pbnRlcgorICAgICAgY29uc3RfbWV0YWRhdGFfcG9pbnRlcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHJpdmlhbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIHR5cGVkZWYgdHJpdmlhbF9pdGVyYXRvcl9kaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDwKKwlWYWx1ZV9UeXBlPjo6b3RoZXI6OnBvaW50ZXIKKyAgICAgIHZhbHVlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorCXR5cGVuYW1lIHJlbW92ZV9jb25zdDwKKwlWYWx1ZV9UeXBlPjo6dHlwZT46Om90aGVyOjpwb2ludGVyCisgICAgICByZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorCXR5cGVuYW1lIHJlbW92ZV9jb25zdDwKKwlWYWx1ZV9UeXBlPjo6dHlwZT46Om90aGVyOjpwb2ludGVyCisgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIGlubGluZQorICAgICAgb3ZfdHJlZV9ub2RlX2l0Xyhjb25zdF9wb2ludGVyIHBfbmQgPSAwLCAgY29uc3RfcG9pbnRlciBwX2JlZ2luX25kID0gMCwgIGNvbnN0X3BvaW50ZXIgcF9lbmRfbmQgPSAwLCAgY29uc3RfbWV0YWRhdGFfcG9pbnRlciBwX21ldGFkYXRhID0gMCkgOiBiYXNlX3R5cGUocF9uZCwgIHBfYmVnaW5fbmQsICBwX2VuZF9uZCwgIHBfbWV0YWRhdGEpCisgICAgICB7IH0KKworICAgICAgLy8vIEFjY2Vzcy4KKyAgICAgIGlubGluZSByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiByZWZlcmVuY2UoYmFzZV90eXBlOjptX3BfdmFsdWUpOyB9CisKKyAgICAgIC8vLyBSZXR1cm5zIHRoZSBub2RlIHJlZmVyZW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxlZnQgbm9kZS4KKyAgICAgIGlubGluZSBvdl90cmVlX25vZGVfaXRfCisgICAgICBnZXRfbF9jaGlsZCgpIGNvbnN0CisgICAgICB7CisJaWYgKGJhc2VfdHlwZTo6bV9wX2JlZ2luX3ZhbHVlID09IGJhc2VfdHlwZTo6bV9wX3ZhbHVlKQorCSAgcmV0dXJuICh0aGlzX3R5cGUoYmFzZV90eXBlOjptX3BfYmVnaW5fdmFsdWUsICBiYXNlX3R5cGU6Om1fcF9iZWdpbl92YWx1ZSwgIGJhc2VfdHlwZTo6bV9wX2JlZ2luX3ZhbHVlKSk7CisKKwljb25zdF9tZXRhZGF0YV9wb2ludGVyIHBfYmVnaW5fbWV0YWRhdGEgPQorCSAgYmFzZV90eXBlOjptX3BfbWV0YWRhdGEgLSAoYmFzZV90eXBlOjptX3BfdmFsdWUgLSBiYXNlX3R5cGU6Om1fcF9iZWdpbl92YWx1ZSk7CisKKwlyZXR1cm4gKHRoaXNfdHlwZShiYXNlX3R5cGU6Om1pZF9wb2ludGVyKGJhc2VfdHlwZTo6bV9wX2JlZ2luX3ZhbHVlLCBiYXNlX3R5cGU6Om1fcF92YWx1ZSksCisJCQkgIGJhc2VfdHlwZTo6bV9wX2JlZ2luX3ZhbHVlLAorCQkJICBiYXNlX3R5cGU6Om1fcF92YWx1ZSwKKwkJCSAgYmFzZV90eXBlOjptaWRfcG9pbnRlcihwX2JlZ2luX21ldGFkYXRhLCBiYXNlX3R5cGU6Om1fcF9tZXRhZGF0YSkpKTsKKyAgICAgIH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIG5vZGUgcmVmZXJlbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmlnaHQgbm9kZS4KKyAgICAgIGlubGluZSBvdl90cmVlX25vZGVfaXRfCisgICAgICBnZXRfcl9jaGlsZCgpIGNvbnN0CisgICAgICB7CisJaWYgKGJhc2VfdHlwZTo6bV9wX3ZhbHVlID09IGJhc2VfdHlwZTo6bV9wX2VuZF92YWx1ZSkKKwkgIHJldHVybiB0aGlzX3R5cGUoYmFzZV90eXBlOjptX3BfZW5kX3ZhbHVlLCBiYXNlX3R5cGU6Om1fcF9lbmRfdmFsdWUsICAKKwkJCSAgIGJhc2VfdHlwZTo6bV9wX2VuZF92YWx1ZSk7CisKKwljb25zdF9tZXRhZGF0YV9wb2ludGVyIHBfZW5kX21ldGFkYXRhID0KKwkgIGJhc2VfdHlwZTo6bV9wX21ldGFkYXRhICsgKGJhc2VfdHlwZTo6bV9wX2VuZF92YWx1ZSAtIGJhc2VfdHlwZTo6bV9wX3ZhbHVlKTsKKworCXJldHVybiAodGhpc190eXBlKGJhc2VfdHlwZTo6bWlkX3BvaW50ZXIoYmFzZV90eXBlOjptX3BfdmFsdWUgKyAxLCBiYXNlX3R5cGU6Om1fcF9lbmRfdmFsdWUpLAorCQkJICBiYXNlX3R5cGU6Om1fcF92YWx1ZSArIDEsCisJCQkgIGJhc2VfdHlwZTo6bV9wX2VuZF92YWx1ZSwoYmFzZV90eXBlOjptX3BfbWV0YWRhdGEgPT0gMCk/CisJCQkgIDAgOiBiYXNlX3R5cGU6Om1pZF9wb2ludGVyKGJhc2VfdHlwZTo6bV9wX21ldGFkYXRhICsgMSwgcF9lbmRfbWV0YWRhdGEpKSk7CisgICAgICB9CisKKyAgICB9OworCisjdW5kZWYgUEJfRFNfT1ZfVFJFRV9OT0RFX0lURVJBVE9SX0NfREVDCisjdW5kZWYgUEJfRFNfT1ZfVFJFRV9DT05TVF9OT0RFX0lURVJBVE9SX0NfREVDCisKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL292X3RyZWVfbWFwXy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL292X3RyZWVfbWFwXy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJmM2VjMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vb3ZfdHJlZV9tYXBfLmhwcApAQCAtMCwwICsxLDU0MiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBvdl90cmVlX21hcF8vb3ZfdHJlZV9tYXBfLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIG92X3RyZWUuCisgKi8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2V4Y2VwdGlvbi5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2VxX2ZuL2VxX2J5X2xlc3MuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZXNfdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHJlZV90cmFjZV9iYXNlLmhwcD4KKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZGVidWdfbWFwX2Jhc2UuaHBwPgorI2VuZGlmCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19PVl9UUkVFX05BTUUgb3ZfdHJlZV9tYXAKKyNkZWZpbmUgUEJfRFNfQ09OU1RfTk9ERV9JVEVSQVRPUl9OQU1FIG92X3RyZWVfbm9kZV9jb25zdF9pdGVyYXRvcl9tYXAKKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyNkZWZpbmUgUEJfRFNfT1ZfVFJFRV9OQU1FIG92X3RyZWVfc2V0CisjZGVmaW5lIFBCX0RTX0NPTlNUX05PREVfSVRFUkFUT1JfTkFNRSBvdl90cmVlX25vZGVfY29uc3RfaXRlcmF0b3Jfc2V0CisjZW5kaWYKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIENtcF9GbiwgXAorCSAgICAgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgUEJfRFNfT1ZfVFJFRV9OQU1FPEtleSwgTWFwcGVkLCBDbXBfRm4sIE5vZGVfQW5kX0l0X1RyYWl0cywgX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX09WX1RSRUVfVFJBSVRTX0JBU0UgXAorICAgIHR5cGVzX3RyYWl0czxLZXksIE1hcHBlZCwgX0FsbG9jLCBmYWxzZT4KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjZGVmaW5lIFBCX0RTX0RFQlVHX01BUF9CQVNFX0NfREVDIFwKKyAgICBkZWJ1Z19tYXBfYmFzZTxLZXksIGVxX2J5X2xlc3M8S2V5LCBDbXBfRm4+LCBcCisgICAgICAgCXR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPEtleT46Om90aGVyOjpjb25zdF9yZWZlcmVuY2U+CisjZW5kaWYKKworI2lmZGVmIFBCX0RTX1RSRUVfVFJBQ0UKKyNkZWZpbmUgUEJfRFNfVFJFRV9UUkFDRV9CQVNFX0NfREVDIFwKKyAgICB0cmVlX3RyYWNlX2Jhc2U8dHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzOjpub2RlX2NvbnN0X2l0ZXJhdG9yLAlcCisJCSAgICB0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHM6Om5vZGVfaXRlcmF0b3IsCQlcCisJCSAgICBDbXBfRm4sIGZhbHNlLCBfQWxsb2M+CisjZW5kaWYKKworI2lmbmRlZiBQQl9EU19DSEVDS19LRVlfRVhJU1RTCisjICBlcnJvciBNaXNzaW5nIGRlZmluaXRpb24KKyNlbmRpZgorCisgICAgLyoqCisgICAgICogIEBicmllZiBPcmRlcmVkLXZlY3RvciB0cmVlIGFzc29jaWF0aXZlLWNvbnRhaW5lci4KKyAgICAgKiAgQGluZ3JvdXAgYnJhbmNoLWRldGFpbAorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBDbXBfRm4sCisJICAgICB0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBQQl9EU19PVl9UUkVFX05BTUUgOgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICBwcm90ZWN0ZWQgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMsCisjZW5kaWYKKyNpZmRlZiBQQl9EU19UUkVFX1RSQUNFCisgICAgICBwdWJsaWMgUEJfRFNfVFJFRV9UUkFDRV9CQVNFX0NfREVDLAorI2VuZGlmCisgICAgICBwdWJsaWMgQ21wX0ZuLAorICAgICAgcHVibGljIE5vZGVfQW5kX0l0X1RyYWl0czo6bm9kZV91cGRhdGUsCisgICAgICBwdWJsaWMgUEJfRFNfT1ZfVFJFRV9UUkFJVFNfQkFTRQorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBQQl9EU19PVl9UUkVFX1RSQUlUU19CQVNFCSAgICAgICAJCXRyYWl0c19iYXNlOworICAgICAgdHlwZWRlZiBOb2RlX0FuZF9JdF9UcmFpdHMJCQl0cmFpdHNfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfY29uc3Q8dHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnZhbHVlX3R5cGU+Ojp0eXBlIG5vbl9jb25zdF92YWx1ZV90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPG5vbl9jb25zdF92YWx1ZV90eXBlPjo6b3RoZXIgdmFsdWVfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB2YWx1ZV9hbGxvY2F0b3I6OnBvaW50ZXIgCXZhbHVlX3ZlY3RvcjsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB0eXBlZGVmIFBCX0RTX0RFQlVHX01BUF9CQVNFX0NfREVDIAkJZGVidWdfYmFzZTsKKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfVFJFRV9UUkFDRQorICAgICAgdHlwZWRlZiBQQl9EU19UUkVFX1RSQUNFX0JBU0VfQ19ERUMgCQl0cmFjZV9iYXNlOworI2VuZGlmCisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnBvaW50ZXIgCQltYXBwZWRfcG9pbnRlcl87CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9wb2ludGVyIAltYXBwZWRfY29uc3RfcG9pbnRlcl87CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om1ldGFkYXRhX3R5cGUgCW1ldGFkYXRhX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8bWV0YWRhdGFfdHlwZT46Om90aGVyIG1ldGFkYXRhX2FsbG9jYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbWV0YWRhdGFfYWxsb2NhdG9yOjpwb2ludGVyIAltZXRhZGF0YV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBtZXRhZGF0YV9hbGxvY2F0b3I6OmNvbnN0X3JlZmVyZW5jZSBtZXRhZGF0YV9jb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIG1ldGFkYXRhX2FsbG9jYXRvcjo6cmVmZXJlbmNlIAltZXRhZGF0YV9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om51bGxfbm9kZV91cGRhdGVfcG9pbnRlcgorICAgICAgbnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBvdl90cmVlX3RhZyAJCQkJIGNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jIAkJCQkJYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIAkJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmRpZmZlcmVuY2VfdHlwZSAJCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgQ21wX0ZuIAkJCQkJY21wX2ZuOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfdHlwZSAJCWtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X3BvaW50ZXIgCWtleV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X2NvbnN0X3BvaW50ZXIgCWtleV9jb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X3JlZmVyZW5jZSAJa2V5X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV9jb25zdF9yZWZlcmVuY2Uga2V5X2NvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF90eXBlIAltYXBwZWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF9wb2ludGVyIAltYXBwZWRfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF9jb25zdF9wb2ludGVyIG1hcHBlZF9jb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3JlZmVyZW5jZSAJbWFwcGVkX3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF9jb25zdF9yZWZlcmVuY2UgbWFwcGVkX2NvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnZhbHVlX3R5cGUgCQl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6cG9pbnRlciAJCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9wb2ludGVyIAljb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6cmVmZXJlbmNlIAkJcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3RfcmVmZXJlbmNlIAljb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgY29uc3RfcG9pbnRlciAJCQkJcG9pbnRfY29uc3RfaXRlcmF0b3I7CisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICAgICAgdHlwZWRlZiBwb2ludGVyIAkJCQkJcG9pbnRfaXRlcmF0b3I7CisjZWxzZQorICAgICAgdHlwZWRlZiBwb2ludF9jb25zdF9pdGVyYXRvciAJCQlwb2ludF9pdGVyYXRvcjsKKyNlbmRpZgorCisgICAgICB0eXBlZGVmIHBvaW50X2l0ZXJhdG9yIAkJCQlpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgcG9pbnRfY29uc3RfaXRlcmF0b3IgCQkJY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIC8vLyBDb25kaXRpb25hbCBkZXN0cnVjdG9yLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9UeXBlPgorICAgICAgICBjbGFzcyBjb25kX2R0b3IKKyAgICAgICAgeworCXB1YmxpYzoKKwkgIGNvbmRfZHRvcih2YWx1ZV92ZWN0b3IgYV92ZWMsIGl0ZXJhdG9yJiByX2xhc3RfaXQsIAorCQkgICAgU2l6ZV9UeXBlIHRvdGFsX3NpemUpIAorCSAgOiBtX2FfdmVjKGFfdmVjKSwgbV9yX2xhc3RfaXQocl9sYXN0X2l0KSwgbV9tYXhfc2l6ZSh0b3RhbF9zaXplKSwKKwkgICAgbV9ub19hY3Rpb24oZmFsc2UpCisJICB7IH0KKworCSAgfmNvbmRfZHRvcigpCisJICB7CisJICAgIGlmIChtX25vX2FjdGlvbikKKwkgICAgICByZXR1cm47CisJICAgIGl0ZXJhdG9yIGl0ID0gbV9hX3ZlYzsKKwkgICAgd2hpbGUgKGl0ICE9IG1fcl9sYXN0X2l0KQorCSAgICAgIHsKKwkJaXQtPn52YWx1ZV90eXBlKCk7CisJCSsraXQ7CisJICAgICAgfQorCSAgICAKKwkgICAgaWYgKG1fbWF4X3NpemUgPiAwKQorCSAgICAgIHZhbHVlX2FsbG9jYXRvcigpLmRlYWxsb2NhdGUobV9hX3ZlYywgbV9tYXhfc2l6ZSk7CisJICB9CisKKwkgIGlubGluZSB2b2lkCisJICBzZXRfbm9fYWN0aW9uKCkKKwkgIHsgbV9ub19hY3Rpb24gPSB0cnVlOyB9CisJICAKKwlwcm90ZWN0ZWQ6CisJICB2YWx1ZV92ZWN0b3IgCQltX2FfdmVjOworCSAgaXRlcmF0b3ImIAkJbV9yX2xhc3RfaXQ7CisJICBjb25zdCBTaXplX1R5cGUgCW1fbWF4X3NpemU7CisJICBib29sIAkJCW1fbm9fYWN0aW9uOworICAgICAgIH07CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om5vZGVfdXBkYXRlIAlub2RlX3VwZGF0ZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om5vZGVfaXRlcmF0b3IgCW5vZGVfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpub2RlX2NvbnN0X2l0ZXJhdG9yCW5vZGVfY29uc3RfaXRlcmF0b3I7CisKKworICAgICAgUEJfRFNfT1ZfVFJFRV9OQU1FKCk7CisKKyAgICAgIFBCX0RTX09WX1RSRUVfTkFNRShjb25zdCBDbXBfRm4mKTsKKworICAgICAgUEJfRFNfT1ZfVFJFRV9OQU1FKGNvbnN0IENtcF9GbiYsIGNvbnN0IG5vZGVfdXBkYXRlJik7CisKKyAgICAgIFBCX0RTX09WX1RSRUVfTkFNRShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB+UEJfRFNfT1ZfVFJFRV9OQU1FKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgICB2b2lkCisgICAgICBjb3B5X2Zyb21fcmFuZ2UoSXQsIEl0KTsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdDsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdDsKKworICAgICAgQ21wX0ZuJgorICAgICAgZ2V0X2NtcF9mbigpOworCisgICAgICBjb25zdCBDbXBfRm4mCisgICAgICBnZXRfY21wX2ZuKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBtYXBwZWRfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCisgICAgICB7CisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorCVBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorCXBvaW50X2l0ZXJhdG9yIGl0ID0gbG93ZXJfYm91bmQocl9rZXkpOworCWlmIChpdCAhPSBlbmQoKSAmJiAhQ21wX0ZuOjpvcGVyYXRvcigpKHJfa2V5LCBQQl9EU19WMkYoKml0KSkpCisJICB7CisJICAgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMocl9rZXkpCisJICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorCSAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisJICB9CisJcmV0dXJuIGluc2VydF9uZXdfdmFsKGl0LCBzdGQ6Om1ha2VfcGFpcihyX2tleSwgbWFwcGVkX3R5cGUoKSkpLT5zZWNvbmQ7CisjZWxzZQorCWluc2VydChyX2tleSk7CisJcmV0dXJuIHRyYWl0c19iYXNlOjpzX251bGxfdHlwZTsKKyNlbmRpZgorICAgICAgfQorCisgICAgICBpbmxpbmUgc3RkOjpwYWlyPHBvaW50X2l0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSByX3ZhbHVlKQorICAgICAgeworCVBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorCWtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkgPSBQQl9EU19WMkYocl92YWx1ZSk7CisJcG9pbnRfaXRlcmF0b3IgaXQgPSBsb3dlcl9ib3VuZChyX2tleSk7CisKKwlpZiAoaXQgIT0gZW5kKCkmJiAgIUNtcF9Gbjo6b3BlcmF0b3IoKShyX2tleSwgUEJfRFNfVjJGKCppdCkpKQorCSAgeworCSAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKwkgICAgUEJfRFNfQ0hFQ0tfS0VZX0VYSVNUUyhyX2tleSkKKwkgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0LCBmYWxzZSk7CisJICB9CisKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoaW5zZXJ0X25ld192YWwoaXQsIHJfdmFsdWUpLCB0cnVlKTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHBvaW50X2l0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQorICAgICAgeworCXBvaW50ZXIgaXQgPSBtX2FfdmFsdWVzOworCXBvaW50ZXIgZV9pdCA9IG1fYV92YWx1ZXMgKyBtX3NpemU7CisJd2hpbGUgKGl0ICE9IGVfaXQpCisJICB7CisJICAgIHBvaW50ZXIgbWlkX2l0ID0gaXQgKyAoKGVfaXQgLSBpdCkgPj4gMSk7CisJICAgIGlmIChjbXBfZm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKCptaWRfaXQpLCByX2tleSkpCisJICAgICAgaXQgPSArK21pZF9pdDsKKwkgICAgZWxzZQorCSAgICAgIGVfaXQgPSBtaWRfaXQ7CisJICB9CisJcmV0dXJuIGl0OworICAgICAgfQorCisgICAgICBpbmxpbmUgcG9pbnRfY29uc3RfaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDJiA+KCp0aGlzKS5sb3dlcl9ib3VuZChyX2tleSk7IH0KKworICAgICAgaW5saW5lIHBvaW50X2l0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQorICAgICAgeworCWl0ZXJhdG9yIHBvdF9pdCA9IGxvd2VyX2JvdW5kKHJfa2V5KTsKKwlpZiAocG90X2l0ICE9IGVuZCgpICYmICFDbXBfRm46Om9wZXJhdG9yKCkocl9rZXksIFBCX0RTX1YyRigqcG90X2l0KSkpCisJICB7CisJICAgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMocl9rZXkpCisJICAgIHJldHVybiArK3BvdF9pdDsKKwkgIH0KKworCVBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChyX2tleSkKKwlyZXR1cm4gcG90X2l0OworICAgICAgfQorCisgICAgICBpbmxpbmUgcG9pbnRfY29uc3RfaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDJj4oKnRoaXMpLnVwcGVyX2JvdW5kKHJfa2V5KTsgfQorCisgICAgICBpbmxpbmUgcG9pbnRfaXRlcmF0b3IKKyAgICAgIGZpbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKKyAgICAgIHsKKwlQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKwlpdGVyYXRvciBwb3RfaXQgPSBsb3dlcl9ib3VuZChyX2tleSk7CisJaWYgKHBvdF9pdCAhPSBlbmQoKSAmJiAhQ21wX0ZuOjpvcGVyYXRvcigpKHJfa2V5LCBQQl9EU19WMkYoKnBvdF9pdCkpKQorCSAgeworCSAgICBQQl9EU19DSEVDS19LRVlfRVhJU1RTKHJfa2V5KQorCSAgICByZXR1cm4gcG90X2l0OworCSAgfQorCisJUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKHJfa2V5KQorCXJldHVybiBlbmQoKTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHBvaW50X2NvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiAoY29uc3RfY2FzdDxQQl9EU19DTEFTU19DX0RFQyY+KCp0aGlzKS5maW5kKHJfa2V5KSk7IH0KKworICAgICAgYm9vbAorICAgICAgZXJhc2Uoa2V5X2NvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBlcmFzZV9pZihQcmVkKTsKKworICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBpdCkKKyAgICAgIHsgcmV0dXJuIGVyYXNlX2ltcDxpdGVyYXRvcj4oaXQpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGpvaW4oUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdm9pZAorICAgICAgc3BsaXQoa2V5X2NvbnN0X3JlZmVyZW5jZSwgUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBiZWdpbigpCisgICAgICB7IHJldHVybiBtX2FfdmFsdWVzOyB9CisKKyAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9hX3ZhbHVlczsgfQorCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGVuZCgpCisgICAgICB7IHJldHVybiBtX2VuZF9pdDsgfQorCisgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBtX2VuZF9pdDsgfQorCisgICAgICAvLy8gUmV0dXJucyBhIGNvbnN0IG5vZGVfaXRlcmF0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgbm9kZSBhdCB0aGUKKyAgICAgIC8vLyByb290IG9mIHRoZSB0cmVlLgorICAgICAgaW5saW5lIG5vZGVfY29uc3RfaXRlcmF0b3IKKyAgICAgIG5vZGVfYmVnaW4oKSBjb25zdDsKKworICAgICAgLy8vIFJldHVybnMgYSBub2RlX2l0ZXJhdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5vZGUgYXQgdGhlCisgICAgICAvLy8gcm9vdCBvZiB0aGUgdHJlZS4KKyAgICAgIGlubGluZSBub2RlX2l0ZXJhdG9yCisgICAgICBub2RlX2JlZ2luKCk7CisKKyAgICAgIC8vLyBSZXR1cm5zIGEgY29uc3Qgbm9kZV9pdGVyYXRvciBjb3JyZXNwb25kaW5nIHRvIGEgbm9kZSBqdXN0CisgICAgICAvLy8gYWZ0ZXIgYSBsZWFmIG9mIHRoZSB0cmVlLgorICAgICAgaW5saW5lIG5vZGVfY29uc3RfaXRlcmF0b3IKKyAgICAgIG5vZGVfZW5kKCkgY29uc3Q7CisKKyAgICAgIC8vLyBSZXR1cm5zIGEgbm9kZV9pdGVyYXRvciBjb3JyZXNwb25kaW5nIHRvIGEgbm9kZSBqdXN0CisgICAgICAvLy8gYWZ0ZXIgYSBsZWFmIG9mIHRoZSB0cmVlLgorICAgICAgaW5saW5lIG5vZGVfaXRlcmF0b3IKKyAgICAgIG5vZGVfZW5kKCk7CisKKyAgICBwcml2YXRlOgorCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgdXBkYXRlKG5vZGVfaXRlcmF0b3IsIG51bGxfbm9kZV91cGRhdGVfcG9pbnRlcik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfVXBkYXRlPgorICAgICAgdm9pZAorICAgICAgdXBkYXRlKG5vZGVfaXRlcmF0b3IsIE5vZGVfVXBkYXRlKik7CisKKyAgICAgIHZvaWQKKyAgICAgIHJlYWxsb2NhdGVfbWV0YWRhdGEobnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyLCBzaXplX3R5cGUpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX1VwZGF0ZV8+CisgICAgICB2b2lkCisgICAgICByZWFsbG9jYXRlX21ldGFkYXRhKE5vZGVfVXBkYXRlXyosIHNpemVfdHlwZSk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgICAgdm9pZAorICAgICAgY29weV9mcm9tX29yZGVyZWRfcmFuZ2UoSXQsIEl0KTsKKworICAgICAgdm9pZAorICAgICAgdmFsdWVfc3dhcChQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICAgIHZvaWQKKyAgICAgIGNvcHlfZnJvbV9vcmRlcmVkX3JhbmdlKEl0LCBJdCwgSXQsIEl0KTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHRyPgorICAgICAgaW5saW5lIHN0YXRpYyBQdHIKKyAgICAgIG1pZF9wb2ludGVyKFB0ciBwX2JlZ2luLCBQdHIgcF9lbmQpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfZW5kID49IHBfYmVnaW4pOworCXJldHVybiAocF9iZWdpbiArIChwX2VuZCAtIHBfYmVnaW4pIC8gMik7CisgICAgICB9CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgaW5zZXJ0X25ld192YWwoaXRlcmF0b3IgaXQsIGNvbnN0X3JlZmVyZW5jZSByX3ZhbHVlKQorICAgICAgeworI2lmZGVmIFBCX0RTX1JFR1JFU1NJT04KKwl0eXBlbmFtZSBfQWxsb2M6Omdyb3VwX2FkanVzdG9yIGFkanVzdChtX3NpemUpOworI2VuZGlmCisKKwlQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1QoUEJfRFNfVjJGKHJfdmFsdWUpKQorCisJdmFsdWVfdmVjdG9yIGFfdmFsdWVzID0gc192YWx1ZV9hbGxvYy5hbGxvY2F0ZShtX3NpemUgKyAxKTsKKworCWl0ZXJhdG9yIHNvdXJjZV9pdCA9IGJlZ2luKCk7CisJaXRlcmF0b3Igc291cmNlX2VuZF9pdCA9IGVuZCgpOworCWl0ZXJhdG9yIHRhcmdldF9pdCA9IGFfdmFsdWVzOworCWl0ZXJhdG9yIHJldF9pdDsKKworCWNvbmRfZHRvcjxzaXplX3R5cGU+IGNkKGFfdmFsdWVzLCB0YXJnZXRfaXQsIG1fc2l6ZSArIDEpOworCXdoaWxlIChzb3VyY2VfaXQgIT0gaXQpCisJICB7CisJICAgIG5ldyAoY29uc3RfY2FzdDx2b2lkKj4oc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KHRhcmdldF9pdCkpKQorCSAgICAgIHZhbHVlX3R5cGUoKnNvdXJjZV9pdCsrKTsKKwkgICAgKyt0YXJnZXRfaXQ7CisJICB9CisKKwluZXcgKGNvbnN0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPihyZXRfaXQgPSB0YXJnZXRfaXQpKSkKKwkgIHZhbHVlX3R5cGUocl92YWx1ZSk7CisJKyt0YXJnZXRfaXQ7CisKKwl3aGlsZSAoc291cmNlX2l0ICE9IHNvdXJjZV9lbmRfaXQpCisJICB7CisJICAgIG5ldyAoY29uc3RfY2FzdDx2b2lkKj4oc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KHRhcmdldF9pdCkpKQorCSAgICAgIHZhbHVlX3R5cGUoKnNvdXJjZV9pdCsrKTsKKwkgICAgKyt0YXJnZXRfaXQ7CisJICB9CisKKwlyZWFsbG9jYXRlX21ldGFkYXRhKChub2RlX3VwZGF0ZSopdGhpcywgbV9zaXplICsgMSk7CisJY2Quc2V0X25vX2FjdGlvbigpOworCWlmIChtX3NpemUgIT0gMCkKKwkgIHsKKwkgICAgY29uZF9kdG9yPHNpemVfdHlwZT4gY2QxKG1fYV92YWx1ZXMsIG1fZW5kX2l0LCBtX3NpemUpOworCSAgfQorCisJKyttX3NpemU7CisJbV9hX3ZhbHVlcyA9IGFfdmFsdWVzOworCW1fZW5kX2l0ID0gbV9hX3ZhbHVlcyArIG1fc2l6ZTsKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6Omluc2VydF9uZXcoUEJfRFNfVjJGKHJfdmFsdWUpKSk7CisJdXBkYXRlKG5vZGVfYmVnaW4oKSwgKG5vZGVfdXBkYXRlKiApdGhpcyk7CisJUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisJcmV0dXJuIHJldF9pdDsKKyAgICAgIH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfdmFsaWQoY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9pdGVyYXRvcnMoY29uc3QgY2hhciosIGludCkgY29uc3Q7CisjZW5kaWYKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgICBJdAorICAgICAgZXJhc2VfaW1wKEl0KTsKKworICAgICAgaW5saW5lIG5vZGVfY29uc3RfaXRlcmF0b3IKKyAgICAgIFBCX0RTX25vZGVfYmVnaW5faW1wKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBub2RlX2NvbnN0X2l0ZXJhdG9yCisgICAgICBQQl9EU19ub2RlX2VuZF9pbXAoKSBjb25zdDsKKworICAgICAgaW5saW5lIG5vZGVfaXRlcmF0b3IKKyAgICAgIFBCX0RTX25vZGVfYmVnaW5faW1wKCk7CisKKyAgICAgIGlubGluZSBub2RlX2l0ZXJhdG9yCisgICAgICBQQl9EU19ub2RlX2VuZF9pbXAoKTsKKworICAgIHByaXZhdGU6CisgICAgICBzdGF0aWMgdmFsdWVfYWxsb2NhdG9yIAlzX3ZhbHVlX2FsbG9jOworICAgICAgc3RhdGljIG1ldGFkYXRhX2FsbG9jYXRvciBzX21ldGFkYXRhX2FsbG9jOworCisgICAgICB2YWx1ZV92ZWN0b3IgCQltX2FfdmFsdWVzOworICAgICAgbWV0YWRhdGFfcG9pbnRlciAJCW1fYV9tZXRhZGF0YTsKKyAgICAgIGl0ZXJhdG9yIAkJCW1fZW5kX2l0OworICAgICAgc2l6ZV90eXBlIAkJbV9zaXplOworICAgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vZGVidWdfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vZXJhc2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2luZm9fZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19PVl9UUkVFX05BTUUKKyN1bmRlZiBQQl9EU19PVl9UUkVFX1RSQUlUU19CQVNFCisjdW5kZWYgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMKKyNpZmRlZiBQQl9EU19UUkVFX1RSQUNFCisjdW5kZWYgUEJfRFNfVFJFRV9UUkFDRV9CQVNFX0NfREVDCisjZW5kaWYKKyN1bmRlZiBQQl9EU19DT05TVF9OT0RFX0lURVJBVE9SX05BTUUKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhOTBhNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDUxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIG92X3RyZWVfbWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igb3ZfdHJlZS4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworQ21wX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9jbXBfZm4oKQoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2NvbnN0IENtcF9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfY21wX2ZuKCkgY29uc3QKK3sgcmV0dXJuICp0aGlzOyB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyYzVhYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEzMiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBvdl90cmVlX21hcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIG92X3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxpdChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5LCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisKKyAgaWYgKG1fc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIG90aGVyLmNsZWFyKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkocl9rZXksIFBCX0RTX1YyRigqYmVnaW4oKSkpKQorICAgIHsKKyAgICAgIHZhbHVlX3N3YXAob3RoZXIpOworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICghQ21wX0ZuOjpvcGVyYXRvcigpKHJfa2V5LCBQQl9EU19WMkYoKihlbmQoKSAtIDEpKSkpCisgICAgeworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAobV9zaXplID09IDEpCisgICAgeworICAgICAgdmFsdWVfc3dhcChvdGhlcik7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaXRlcmF0b3IgaXQgPSB1cHBlcl9ib3VuZChyX2tleSk7CisgIFBCX0RTX0NMQVNTX0NfREVDIG5ld19vdGhlcihvdGhlciwgb3RoZXIpOworICBuZXdfb3RoZXIuY29weV9mcm9tX29yZGVyZWRfcmFuZ2UoaXQsIGVuZCgpKTsKKyAgUEJfRFNfQ0xBU1NfQ19ERUMgbmV3X3RoaXMoKnRoaXMsICp0aGlzKTsKKyAgbmV3X3RoaXMuY29weV9mcm9tX29yZGVyZWRfcmFuZ2UoYmVnaW4oKSwgaXQpOworCisgIC8vIE5vIGV4Y2VwdGlvbnMgZnJvbSB0aGlzIHBvaW50LgorICBvdGhlci51cGRhdGUob3RoZXIubm9kZV9iZWdpbigpLCAobm9kZV91cGRhdGUqKSgmb3RoZXIpKTsKKyAgdXBkYXRlKG5vZGVfYmVnaW4oKSwgKG5vZGVfdXBkYXRlKil0aGlzKTsKKyAgb3RoZXIudmFsdWVfc3dhcChuZXdfb3RoZXIpOworICB2YWx1ZV9zd2FwKG5ld190aGlzKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2pvaW4oUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICBpZiAob3RoZXIubV9zaXplID09IDApCisgICAgcmV0dXJuOworCisgIGlmIChtX3NpemUgPT0gMCkKKyAgICB7CisgICAgICB2YWx1ZV9zd2FwKG90aGVyKTsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICAgICAgcmV0dXJuOworICAgIH0KKworICBjb25zdCBib29sIGdyZWF0ZXIgPSBDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKCooZW5kKCkgLSAxKSksCisJCQkJCSAgUEJfRFNfVjJGKCpvdGhlci5iZWdpbigpKSk7CisKKyAgY29uc3QgYm9vbCBsZXNzZXIgPSBDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKCoob3RoZXIuZW5kKCkgLSAxKSksCisJCQkJCSBQQl9EU19WMkYoKmJlZ2luKCkpKTsKKworICBpZiAoIWdyZWF0ZXIgJiYgIWxlc3NlcikKKyAgICBfX3Rocm93X2pvaW5fZXJyb3IoKTsKKworICBQQl9EU19DTEFTU19DX0RFQyBuZXdfdGhpcygqdGhpcywgKnRoaXMpOworCisgIGlmIChncmVhdGVyKQorICAgIG5ld190aGlzLmNvcHlfZnJvbV9vcmRlcmVkX3JhbmdlKGJlZ2luKCksIGVuZCgpLAorCQkJCSAgICAgb3RoZXIuYmVnaW4oKSwgb3RoZXIuZW5kKCkpOworICBlbHNlCisgICAgbmV3X3RoaXMuY29weV9mcm9tX29yZGVyZWRfcmFuZ2Uob3RoZXIuYmVnaW4oKSwgb3RoZXIuZW5kKCksCisJCQkJICAgICBiZWdpbigpLCBlbmQoKSk7CisKKyAgLy8gTm8gZXhjZXB0aW9ucyBmcm9tIHRoaXMgcG9pbnQuCisgIHZhbHVlX3N3YXAobmV3X3RoaXMpOworICBvdGhlci5jbGVhcigpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy90cmFpdHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy90cmFpdHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMGMwY2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL3RyYWl0cy5ocHAKQEAgLTAsMCArMSwxOTAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgb3ZfdHJlZV9tYXBfL3RyYWl0cy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBvdl90cmVlXy4KKyAqLworCisjaWZuZGVmIFBCX0RTX09WX1RSRUVfTk9ERV9BTkRfSVRfVFJBSVRTX0hQUAorI2RlZmluZSBQQl9EU19PVl9UUkVFX05PREVfQU5EX0lUX1RSQUlUU19IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL25vZGVfaXRlcmF0b3JzLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIFRyZWUgdHJhaXRzLgorICAgIC8vLyBAaW5ncm91cCB0cmFpdHMKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgICB0eXBlbmFtZSBNYXBwZWQsCisJICAgICBjbGFzcyBDbXBfRm4sCisJICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX0NJdHIsCisJCSAgICAgIGNsYXNzIE5vZGVfSXRyLAorCQkgICAgICBjbGFzcyBDbXBfRm5fLAorCQkgICAgICB0eXBlbmFtZSBfQWxsb2NfPgorICAgIGNsYXNzIE5vZGVfVXBkYXRlLAorCSAgICAgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCB0cmVlX3RyYWl0czwKKyAgICAgIEtleSwKKyAgICAgIE1hcHBlZCwKKyAgICAgIENtcF9GbiwKKyAgICAgIE5vZGVfVXBkYXRlLAorICAgICAgb3ZfdHJlZV90YWcsCisgICAgICBfQWxsb2M+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSB0eXBlc190cmFpdHM8CisgICAgICBLZXksCisgICAgICBNYXBwZWQsCisgICAgICBfQWxsb2MsCisgICAgICBmYWxzZT46OnZhbHVlX3R5cGUKKyAgICAgIHZhbHVlX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSB0cmVlX25vZGVfbWV0YWRhdGFfZGlzcGF0Y2g8CisgICAgICBLZXksCisgICAgICBNYXBwZWQsCisgICAgICBDbXBfRm4sCisgICAgICBOb2RlX1VwZGF0ZSwKKyAgICAgIF9BbGxvYz46OnR5cGUKKyAgICAgIG1ldGFkYXRhX3R5cGU7CisKKyAgICAgIC8vLyBUaGlzIGlzIGFuIGl0ZXJhdG9yIHRvIGFuIGl0ZXJhdG9yOiBpdCBpdGVyYXRlcyBvdmVyIG5vZGVzLAorICAgICAgLy8vIGFuZCBkZS1yZWZlcmVuY2luZyBpdCByZXR1cm5zIG9uZSBvZiB0aGUgdHJlZSdzIGl0ZXJhdG9ycy4KKyAgICAgIHR5cGVkZWYKKyAgICAgIG92X3RyZWVfbm9kZV9jb25zdF9pdF88CisJdmFsdWVfdHlwZSwKKwltZXRhZGF0YV90eXBlLAorCV9BbGxvYz4KKyAgICAgIG5vZGVfY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIG92X3RyZWVfbm9kZV9pdF88CisJdmFsdWVfdHlwZSwKKwltZXRhZGF0YV90eXBlLAorCV9BbGxvYz4KKyAgICAgIG5vZGVfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIE5vZGVfVXBkYXRlPAorCW5vZGVfY29uc3RfaXRlcmF0b3IsCisJbm9kZV9pdGVyYXRvciwKKwlDbXBfRm4sCisJX0FsbG9jPgorICAgICAgbm9kZV91cGRhdGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIF9fZ251X3BiZHM6Om51bGxfbm9kZV91cGRhdGU8CisJbm9kZV9jb25zdF9pdGVyYXRvciwKKwlub2RlX2l0ZXJhdG9yLAorCUNtcF9GbiwKKwlfQWxsb2M+KiAKKyAgICAgIG51bGxfbm9kZV91cGRhdGVfcG9pbnRlcjsKKyAgICB9OworCisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24uCisgICAgLy8vIEBpbmdyb3VwIHRyYWl0cworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICAgIGNsYXNzIENtcF9GbiwKKwkgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwKKwkJICAgICAgY2xhc3MgTm9kZV9JdHIsCisJCSAgICAgIGNsYXNzIENtcF9Gbl8sCisJCSAgICAgIHR5cGVuYW1lIF9BbGxvY18+CisgICAgY2xhc3MgTm9kZV9VcGRhdGUsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHRyZWVfdHJhaXRzPAorICAgICAgS2V5LAorICAgICAgbnVsbF90eXBlLAorICAgICAgQ21wX0ZuLAorICAgICAgTm9kZV9VcGRhdGUsCisgICAgICBvdl90cmVlX3RhZywKKyAgICAgIF9BbGxvYz4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIHR5cGVzX3RyYWl0czwKKyAgICAgIEtleSwKKyAgICAgIG51bGxfdHlwZSwKKyAgICAgIF9BbGxvYywKKyAgICAgIGZhbHNlPjo6dmFsdWVfdHlwZQorICAgICAgdmFsdWVfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIHRyZWVfbm9kZV9tZXRhZGF0YV9kaXNwYXRjaDwKKyAgICAgIEtleSwKKyAgICAgIG51bGxfdHlwZSwKKyAgICAgIENtcF9GbiwKKyAgICAgIE5vZGVfVXBkYXRlLAorICAgICAgX0FsbG9jPjo6dHlwZQorICAgICAgbWV0YWRhdGFfdHlwZTsKKworICAgICAgLy8vIFRoaXMgaXMgYW4gaXRlcmF0b3IgdG8gYW4gaXRlcmF0b3I6IGl0IGl0ZXJhdGVzIG92ZXIgbm9kZXMsCisgICAgICAvLy8gYW5kIGRlLXJlZmVyZW5jaW5nIGl0IHJldHVybnMgb25lIG9mIHRoZSB0cmVlJ3MgaXRlcmF0b3JzLgorICAgICAgdHlwZWRlZgorICAgICAgb3ZfdHJlZV9ub2RlX2NvbnN0X2l0XzwKKwl2YWx1ZV90eXBlLAorCW1ldGFkYXRhX3R5cGUsCisJX0FsbG9jPgorICAgICAgbm9kZV9jb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBub2RlX2NvbnN0X2l0ZXJhdG9yIG5vZGVfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIE5vZGVfVXBkYXRlPAorCW5vZGVfY29uc3RfaXRlcmF0b3IsCisJbm9kZV9jb25zdF9pdGVyYXRvciwKKwlDbXBfRm4sCisJX0FsbG9jPgorICAgICAgbm9kZV91cGRhdGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIF9fZ251X3BiZHM6Om51bGxfbm9kZV91cGRhdGU8CisJbm9kZV9jb25zdF9pdGVyYXRvciwKKwlub2RlX2l0ZXJhdG9yLAorCUNtcF9GbiwKKwlfQWxsb2M+KiAKKyAgICAgIG51bGxfbm9kZV91cGRhdGVfcG9pbnRlcjsKKyAgICB9OworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfT1ZfVFJFRV9OT0RFX0FORF9JVF9UUkFJVFNfSFBQCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExYmE5ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsODIgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcGFpcmluZ19oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgcGFpcmluZyBoZWFwLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NvcHlfZnJvbV9yYW5nZShJdCBmaXJzdF9pdCwgSXQgbGFzdF9pdCkKK3sKKyAgd2hpbGUgKGZpcnN0X2l0ICE9IGxhc3RfaXQpCisgICAgcHVzaCgqKGZpcnN0X2l0KyspKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitwYWlyaW5nX2hlYXAoKQoreyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkgfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorcGFpcmluZ19oZWFwKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4pCis6IGJhc2VfdHlwZShyX2NtcF9mbikKK3sgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3BhaXJpbmdfaGVhcChjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCis6IGJhc2VfdHlwZShvdGhlcikKK3sgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgYmFzZV90eXBlOjpzd2FwKG90aGVyKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+cGFpcmluZ19oZWFwKCkKK3sgfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vZGVidWdfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2EzZDFiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vZGVidWdfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwYWlyaW5nX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBwYWlyaW5nIGhlYXAuCisgKi8KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfdmFsaWQoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBQQl9EU19ERUJVR19WRVJJRlkoYmFzZV90eXBlOjptX3Bfcm9vdCA9PSAwIAorCQkgICAgICAgIHx8IGJhc2VfdHlwZTo6bV9wX3Jvb3QtPm1fcF9uZXh0X3NpYmxpbmcgPT0gMCk7CisgIGJhc2VfdHlwZTo6YXNzZXJ0X3ZhbGlkKF9fZmlsZSwgX19saW5lKTsKK30KKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTIzOTM3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwyMzMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcGFpcmluZ19oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgcGFpcmluZyBoZWFwLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citwb3AoKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFiYXNlX3R5cGU6OmVtcHR5KCkpOworCisgIG5vZGVfcG9pbnRlciBwX25ld19yb290ID0gam9pbl9ub2RlX2NoaWxkcmVuKGJhc2VfdHlwZTo6bV9wX3Jvb3QpOworICBQQl9EU19BU1NFUlRfTk9ERV9DT05TSVNURU5UKHBfbmV3X3Jvb3QsIGZhbHNlKQorICBpZiAocF9uZXdfcm9vdCAhPSAwKQorICAgIHBfbmV3X3Jvb3QtPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisKKyAgYmFzZV90eXBlOjphY3R1YWxfZXJhc2Vfbm9kZShiYXNlX3R5cGU6Om1fcF9yb290KTsKKyAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IHBfbmV3X3Jvb3Q7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2UocG9pbnRfaXRlcmF0b3IgaXQpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWJhc2VfdHlwZTo6ZW1wdHkoKSk7CisgIHJlbW92ZV9ub2RlKGl0Lm1fcF9uZCk7CisgIGJhc2VfdHlwZTo6YWN0dWFsX2VyYXNlX25vZGUoaXQubV9wX25kKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZW1vdmVfbm9kZShub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghYmFzZV90eXBlOjplbXB0eSgpKTsKKyAgbm9kZV9wb2ludGVyIHBfbmV3X2NoaWxkID0gam9pbl9ub2RlX2NoaWxkcmVuKHBfbmQpOworCisgIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQocF9uZXdfY2hpbGQsIGZhbHNlKQorCisgIGlmIChwX25kID09IGJhc2VfdHlwZTo6bV9wX3Jvb3QpCisgICAgeworICAgICAgaWYgKHBfbmV3X2NoaWxkICE9IDApCisJcF9uZXdfY2hpbGQtPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisgICAgICBiYXNlX3R5cGU6Om1fcF9yb290ID0gcF9uZXdfY2hpbGQ7CisgICAgICBQQl9EU19BU1NFUlRfTk9ERV9DT05TSVNURU5UKGJhc2VfdHlwZTo6bV9wX3Jvb3QsIGZhbHNlKQorICAgICAgcmV0dXJuOworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50ICE9IDApOworICBpZiAocF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50LT5tX3BfbF9jaGlsZCA9PSBwX25kKQorICAgIHsKKyAgICAgIGlmIChwX25ld19jaGlsZCAhPSAwKQorICAgICAgICB7CisJICBwX25ld19jaGlsZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50OworCSAgcF9uZXdfY2hpbGQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nOworCSAgaWYgKHBfbmV3X2NoaWxkLT5tX3BfbmV4dF9zaWJsaW5nICE9IDApCisJICAgIHBfbmV3X2NoaWxkLT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25ld19jaGlsZDsKKwkgIHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudC0+bV9wX2xfY2hpbGQgPSBwX25ld19jaGlsZDsKKwkgIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQocF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50LCBmYWxzZSkKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50LT5tX3BfbF9jaGlsZCA9IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBpZiAocF9uZC0+bV9wX25leHRfc2libGluZyAhPSAwKQorCXBfbmQtPm1fcF9uZXh0X3NpYmxpbmctPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudDsKKyAgICAgIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQocF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50LCBmYWxzZSkKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHBfbmV3X2NoaWxkICE9IDApCisgICAgeworICAgICAgcF9uZXdfY2hpbGQtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudDsKKyAgICAgIHBfbmV3X2NoaWxkLT5tX3BfbmV4dF9zaWJsaW5nID0gcF9uZC0+bV9wX25leHRfc2libGluZzsKKyAgICAgIGlmIChwX25ld19jaGlsZC0+bV9wX25leHRfc2libGluZyAhPSAwKQorCXBfbmV3X2NoaWxkLT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25ld19jaGlsZDsKKyAgICAgIHBfbmV3X2NoaWxkLT5tX3BfcHJldl9vcl9wYXJlbnQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX25ld19jaGlsZDsKKyAgICAgIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQocF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50LCBmYWxzZSkKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50LT5tX3BfbmV4dF9zaWJsaW5nID0gcF9uZC0+bV9wX25leHRfc2libGluZzsKKyAgaWYgKHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCkKKyAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQ7CisgIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQocF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50LCBmYWxzZSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2pvaW5fbm9kZV9jaGlsZHJlbihub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQgIT0gMCk7CisgIG5vZGVfcG9pbnRlciBwX3JldCA9IHBfbmQtPm1fcF9sX2NoaWxkOworICBpZiAocF9yZXQgPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgd2hpbGUgKHBfcmV0LT5tX3BfbmV4dF9zaWJsaW5nICE9IDApCisgICAgcF9yZXQgPSBmb3J3YXJkX2pvaW4ocF9yZXQsIHBfcmV0LT5tX3BfbmV4dF9zaWJsaW5nKTsKKyAgd2hpbGUgKHBfcmV0LT5tX3BfcHJldl9vcl9wYXJlbnQgIT0gcF9uZCkKKyAgICBwX3JldCA9IGJhY2tfam9pbihwX3JldC0+bV9wX3ByZXZfb3JfcGFyZW50LCBwX3JldCk7CisgIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQocF9yZXQsIGZhbHNlKQorICByZXR1cm4gcF9yZXQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6Citmb3J3YXJkX2pvaW4obm9kZV9wb2ludGVyIHBfbmQsIG5vZGVfcG9pbnRlciBwX25leHQpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kICE9IDApOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV9wX25leHRfc2libGluZyA9PSBwX25leHQpOworICBpZiAoQ21wX0ZuOjpvcGVyYXRvcigpKHBfbmQtPm1fdmFsdWUsIHBfbmV4dC0+bV92YWx1ZSkpCisgICAgeworICAgICAgcF9uZXh0LT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQ7CisgICAgICBiYXNlX3R5cGU6Om1ha2VfY2hpbGRfb2YocF9uZCwgcF9uZXh0KTsKKyAgICAgIHJldHVybiBwX25leHQtPm1fcF9uZXh0X3NpYmxpbmcgPT0gMCAKKwk/IHBfbmV4dCA6IHBfbmV4dC0+bV9wX25leHRfc2libGluZzsKKyAgICB9CisKKyAgaWYgKHBfbmV4dC0+bV9wX25leHRfc2libGluZyAhPSAwKQorICAgIHsKKyAgICAgIHBfbmV4dC0+bV9wX25leHRfc2libGluZy0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZDsKKyAgICAgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX25leHQtPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBiYXNlX3R5cGU6Om1ha2VfY2hpbGRfb2YocF9uZXh0LCBwX25kKTsKKyAgICAgIHJldHVybiBwX25kLT5tX3BfbmV4dF9zaWJsaW5nOworICAgIH0KKworICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nID0gMDsKKyAgYmFzZV90eXBlOjptYWtlX2NoaWxkX29mKHBfbmV4dCwgcF9uZCk7CisgIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQocF9uZCwgZmFsc2UpCisgIHJldHVybiBwX25kOworfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmFja19qb2luKG5vZGVfcG9pbnRlciBwX25kLCBub2RlX3BvaW50ZXIgcF9uZXh0KQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZCAhPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmV4dC0+bV9wX25leHRfc2libGluZyA9PSAwKTsKKworICBpZiAoQ21wX0ZuOjpvcGVyYXRvcigpKHBfbmQtPm1fdmFsdWUsIHBfbmV4dC0+bV92YWx1ZSkpCisgICAgeworICAgICAgcF9uZXh0LT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQ7CisgICAgICBiYXNlX3R5cGU6Om1ha2VfY2hpbGRfb2YocF9uZCwgcF9uZXh0KTsKKyAgICAgIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQocF9uZXh0LCBmYWxzZSkKKyAgICAgIHJldHVybiBwX25leHQ7CisgICAgfQorCisgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgPSAwOworICBiYXNlX3R5cGU6Om1ha2VfY2hpbGRfb2YocF9uZXh0LCBwX25kKTsKKyAgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChwX25kLCBmYWxzZSkKKyAgcmV0dXJuIHBfbmQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfaWYoUHJlZCBwcmVkKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICBpZiAoYmFzZV90eXBlOjplbXB0eSgpKQorICAgICAgeworICAgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKwlyZXR1cm4gMDsKKyAgICAgIH0KKyAgYmFzZV90eXBlOjp0b19saW5rZWRfbGlzdCgpOworICBub2RlX3BvaW50ZXIgcF9vdXQgPSBiYXNlX3R5cGU6OnBydW5lKHByZWQpOworICBzaXplX3R5cGUgZXJzZCA9IDA7CisgIHdoaWxlIChwX291dCAhPSAwKQorICAgIHsKKyAgICAgICsrZXJzZDsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX291dC0+bV9wX25leHRfc2libGluZzsKKyAgICAgIGJhc2VfdHlwZTo6YWN0dWFsX2VyYXNlX25vZGUocF9vdXQpOworICAgICAgcF9vdXQgPSBwX25leHQ7CisgICAgfQorCisgIG5vZGVfcG9pbnRlciBwX2N1ciA9IGJhc2VfdHlwZTo6bV9wX3Jvb3Q7CisgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSAwOworICB3aGlsZSAocF9jdXIgIT0gMCkKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gcF9jdXItPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBwX2N1ci0+bV9wX2xfY2hpbGQgPSBwX2N1ci0+bV9wX25leHRfc2libGluZyA9IHBfY3VyLT5tX3BfcHJldl9vcl9wYXJlbnQgPSAwOworCisgICAgICBwdXNoX2ltcChwX2N1cik7CisgICAgICBwX2N1ciA9IHBfbmV4dDsKKyAgICB9CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gZXJzZDsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vZmluZF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL2ZpbmRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg1ZjMzNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL2ZpbmRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw0OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwYWlyaW5nX2hlYXBfL2ZpbmRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIHBhaXJpbmcgaGVhcC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9yZWZlcmVuY2UKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RvcCgpIGNvbnN0Cit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWJhc2VfdHlwZTo6ZW1wdHkoKSk7CisgIHJldHVybiBiYXNlX3R5cGU6Om1fcF9yb290LT5tX3ZhbHVlOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYWY0NWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw4OCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwYWlyaW5nX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgcGFpcmluZyBoZWFwLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitwdXNoKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIG5vZGVfcG9pbnRlciBwX25ld19uZCA9IGJhc2VfdHlwZTo6Z2V0X25ld19ub2RlX2Zvcl9pbnNlcnQocl92YWwpOworICBwdXNoX2ltcChwX25ld19uZCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gcG9pbnRfaXRlcmF0b3IocF9uZXdfbmQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3B1c2hfaW1wKG5vZGVfcG9pbnRlciBwX25kKQoreworICBwX25kLT5tX3BfbF9jaGlsZCA9IDA7CisgIGlmIChiYXNlX3R5cGU6Om1fcF9yb290ID09IDApCisgICAgeworICAgICAgcF9uZC0+bV9wX25leHRfc2libGluZyA9IHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisgICAgICBiYXNlX3R5cGU6Om1fcF9yb290ID0gcF9uZDsKKyAgICB9CisgIGVsc2UgaWYgKENtcF9Gbjo6b3BlcmF0b3IoKShiYXNlX3R5cGU6Om1fcF9yb290LT5tX3ZhbHVlLCBwX25kLT5tX3ZhbHVlKSkKKyAgICB7CisgICAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nID0gcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKyAgICAgIGJhc2VfdHlwZTo6bWFrZV9jaGlsZF9vZihiYXNlX3R5cGU6Om1fcF9yb290LCBwX25kKTsKKyAgICAgIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQocF9uZCwgZmFsc2UpCisgICAgICBiYXNlX3R5cGU6Om1fcF9yb290ID0gcF9uZDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBiYXNlX3R5cGU6Om1ha2VfY2hpbGRfb2YocF9uZCwgYmFzZV90eXBlOjptX3Bfcm9vdCk7CisgICAgICBQQl9EU19BU1NFUlRfTk9ERV9DT05TSVNURU5UKGJhc2VfdHlwZTo6bV9wX3Jvb3QsIGZhbHNlKQorICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK21vZGlmeShwb2ludF9pdGVyYXRvciBpdCwgY29uc3RfcmVmZXJlbmNlIHJfbmV3X3ZhbCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJlbW92ZV9ub2RlKGl0Lm1fcF9uZCk7CisgIGl0Lm1fcF9uZC0+bV92YWx1ZSA9IHJfbmV3X3ZhbDsKKyAgcHVzaF9pbXAoaXQubV9wX25kKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9wYWlyaW5nX2hlYXBfLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL3BhaXJpbmdfaGVhcF8uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNjRiN2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9wYWlyaW5nX2hlYXBfLmhwcApAQCAtMCwwICsxLDE4NSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwYWlyaW5nX2hlYXBfL3BhaXJpbmdfaGVhcF8uaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBwYWlyaW5nIGhlYXAuCisgKi8KKworLyoKKyAqIFBhaXJpbmcgaGVhcDoKKyAqIE1pY2hhZWwgTC4gRnJlZG1hbiwgUm9iZXJ0IFNlZGdld2ljaywgRGFuaWVsIERvbWluaWMgU2xlYXRvciwKKyAqICAgIGFuZCBSb2JlcnQgRW5kcmUgVGFyamFuLCBUaGUgUGFpcmluZyBIZWFwOgorICogICAgQSBOZXcgRm9ybSBvZiBTZWxmLUFkanVzdGluZyBIZWFwLCBBbGdvcml0aG1pY2EsIDEoMSk6MTExLTEyOSwgMTk4Ni4KKyAqLworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jb25kX2RlYWx0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZV91dGlscy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy5ocHA+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICBwYWlyaW5nX2hlYXA8VmFsdWVfVHlwZSwgQ21wX0ZuLCBfQWxsb2M+CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworI2RlZmluZSBQQl9EU19QX0hFQVBfQkFTRSBcCisgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXA8VmFsdWVfVHlwZSwgQ21wX0ZuLCBudWxsX3R5cGUsIF9BbGxvYywgZmFsc2U+CisjZWxzZQorI2RlZmluZSBQQl9EU19QX0hFQVBfQkFTRSBcCisgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXA8VmFsdWVfVHlwZSwgQ21wX0ZuLCBudWxsX3R5cGUsIF9BbGxvYz4KKyNlbmRpZgorCisgICAgLyoqCisgICAgICogIFBhaXJpbmcgaGVhcC4KKyAgICAgKgorICAgICAqICBAaW5ncm91cCBoZWFwLWRldGFpbAorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIHR5cGVuYW1lIENtcF9GbiwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIHBhaXJpbmdfaGVhcCA6IHB1YmxpYyBQQl9EU19QX0hFQVBfQkFTRQorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBQQl9EU19QX0hFQVBfQkFTRQkJCQliYXNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bm9kZV9wb2ludGVyIAkJbm9kZV9wb2ludGVyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPFZhbHVlX1R5cGU+OjpvdGhlciBfX3JlYmluZF9hOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBWYWx1ZV9UeXBlIAkJCQl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBDbXBfRm4gCQkJCQljbXBfZm47CisgICAgICB0eXBlZGVmIF9BbGxvYyAJCQkJCWFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAJCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpkaWZmZXJlbmNlX3R5cGUgCQlkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfYTo6cG9pbnRlciAJCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2E6OmNvbnN0X3BvaW50ZXIgCWNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2E6OnJlZmVyZW5jZQkJcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9hOjpjb25zdF9yZWZlcmVuY2UgCWNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnBvaW50X2NvbnN0X2l0ZXJhdG9yCXBvaW50X2NvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnBvaW50X2l0ZXJhdG9yIAlwb2ludF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9pdGVyYXRvciAJY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6aXRlcmF0b3IgCQlpdGVyYXRvcjsKKworICAgICAgcGFpcmluZ19oZWFwKCk7CisKKyAgICAgIHBhaXJpbmdfaGVhcChjb25zdCBDbXBfRm4mKTsKKworICAgICAgcGFpcmluZ19oZWFwKGNvbnN0IHBhaXJpbmdfaGVhcCYpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKHBhaXJpbmdfaGVhcCYpOworCisgICAgICB+cGFpcmluZ19oZWFwKCk7CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgcHVzaChjb25zdF9yZWZlcmVuY2UpOworCisgICAgICB2b2lkCisgICAgICBtb2RpZnkocG9pbnRfaXRlcmF0b3IsIGNvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBjb25zdF9yZWZlcmVuY2UKKyAgICAgIHRvcCgpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBwb3AoKTsKKworICAgICAgdm9pZAorICAgICAgZXJhc2UocG9pbnRfaXRlcmF0b3IpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZV9pZihQcmVkKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KKyAgICAgIHZvaWQKKyAgICAgIHNwbGl0KFByZWQsIHBhaXJpbmdfaGVhcCYpOworCisgICAgICB2b2lkCisgICAgICBqb2luKHBhaXJpbmdfaGVhcCYpOworCisgICAgcHJvdGVjdGVkOgorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICAgIHZvaWQKKyAgICAgIGNvcHlfZnJvbV9yYW5nZShJdCwgSXQpOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZChjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKyNlbmRpZgorCisgICAgcHJpdmF0ZToKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHB1c2hfaW1wKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIG5vZGVfcG9pbnRlcgorICAgICAgam9pbl9ub2RlX2NoaWxkcmVuKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIG5vZGVfcG9pbnRlcgorICAgICAgZm9yd2FyZF9qb2luKG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyKTsKKworICAgICAgbm9kZV9wb2ludGVyCisgICAgICBiYWNrX2pvaW4obm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIpOworCisgICAgICB2b2lkCisgICAgICByZW1vdmVfbm9kZShub2RlX3BvaW50ZXIpOworICAgIH07CisKKyNkZWZpbmUgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChfTm9kZSwgX0Jvb2wpIFwKKyBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6YXNzZXJ0X25vZGVfY29uc2lzdGVudChfTm9kZSwgX0Jvb2wsCVwKKwkJCQkJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18pOykKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vZGVidWdfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL2ZpbmRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHA+CisKKyN1bmRlZiBQQl9EU19BU1NFUlRfTk9ERV9DT05TSVNURU5UCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX1BfSEVBUF9CQVNFCisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTRlZjMzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEyMyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwYWlyaW5nX2hlYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIHBhaXJpbmcgaGVhcC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGl0KFByZWQgcHJlZCwgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorCisgIG90aGVyLmNsZWFyKCk7CisKKyAgaWYgKGJhc2VfdHlwZTo6ZW1wdHkoKSkKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgYmFzZV90eXBlOjp0b19saW5rZWRfbGlzdCgpOworICBub2RlX3BvaW50ZXIgcF9vdXQgPSBiYXNlX3R5cGU6OnBydW5lKHByZWQpOworICB3aGlsZSAocF9vdXQgIT0gMCkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmFzZV90eXBlOjptX3NpemUgPiAwKTsKKyAgICAgIC0tYmFzZV90eXBlOjptX3NpemU7CisgICAgICArK290aGVyLm1fc2l6ZTsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX291dC0+bV9wX25leHRfc2libGluZzsKKyAgICAgIHBfb3V0LT5tX3BfbF9jaGlsZCA9IHBfb3V0LT5tX3BfbmV4dF9zaWJsaW5nID0gcF9vdXQtPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisKKyAgICAgIG90aGVyLnB1c2hfaW1wKHBfb3V0KTsKKyAgICAgIHBfb3V0ID0gcF9uZXh0OworICAgIH0KKworICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgIG5vZGVfcG9pbnRlciBwX2N1ciA9IGJhc2VfdHlwZTo6bV9wX3Jvb3Q7CisgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSAwOworICB3aGlsZSAocF9jdXIgIT0gMCkKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gcF9jdXItPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBwX2N1ci0+bV9wX2xfY2hpbGQgPSBwX2N1ci0+bV9wX25leHRfc2libGluZyA9IHBfY3VyLT5tX3BfcHJldl9vcl9wYXJlbnQgPSAwOworCisgICAgICBwdXNoX2ltcChwX2N1cik7CisgICAgICBwX2N1ciA9IHBfbmV4dDsKKyAgICB9CisKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citqb2luKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKworICBpZiAob3RoZXIubV9wX3Jvb3QgPT0gMCkKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKGJhc2VfdHlwZTo6bV9wX3Jvb3QgPT0gMCkKKyAgICBiYXNlX3R5cGU6Om1fcF9yb290ID0gb3RoZXIubV9wX3Jvb3Q7CisgIGVsc2UgaWYgKENtcF9Gbjo6b3BlcmF0b3IoKShiYXNlX3R5cGU6Om1fcF9yb290LT5tX3ZhbHVlLCBvdGhlci5tX3Bfcm9vdC0+bV92YWx1ZSkpCisgICAgeworICAgICAgYmFzZV90eXBlOjptYWtlX2NoaWxkX29mKGJhc2VfdHlwZTo6bV9wX3Jvb3QsIG90aGVyLm1fcF9yb290KTsKKyAgICAgIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQob3RoZXIubV9wX3Jvb3QsIGZhbHNlKQorICAgICAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IG90aGVyLm1fcF9yb290OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJhc2VfdHlwZTo6bWFrZV9jaGlsZF9vZihvdGhlci5tX3Bfcm9vdCwgYmFzZV90eXBlOjptX3Bfcm9vdCk7CisgICAgICBQQl9EU19BU1NFUlRfTk9ERV9DT05TSVNURU5UKGJhc2VfdHlwZTo6bV9wX3Jvb3QsIGZhbHNlKQorICAgIH0KKworICBiYXNlX3R5cGU6Om1fc2l6ZSArPSBvdGhlci5tX3NpemU7CisgIG90aGVyLm1fcF9yb290ID0gMDsKKyAgb3RoZXIubV9zaXplID0gMDsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5M2E3NTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMjE0IEBACisgLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwYXRfdHJpZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBwYXRfdHJpZS4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmhlYWRfYWxsb2NhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6c19oZWFkX2FsbG9jYXRvcjsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppbm9kZV9hbGxvY2F0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjpzX2lub2RlX2FsbG9jYXRvcjsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpsZWFmX2FsbG9jYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OnNfbGVhZl9hbGxvY2F0b3I7CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19QQVRfVFJJRV9OQU1FKCkgOgorICBtX3BfaGVhZChzX2hlYWRfYWxsb2NhdG9yLmFsbG9jYXRlKDEpKSwKKyAgbV9zaXplKDApCit7CisgIGluaXRpYWxpemUoKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19QQVRfVFJJRV9OQU1FKGNvbnN0IGFjY2Vzc190cmFpdHMmIHJfYWNjZXNzX3RyYWl0cykgOgorICBzeW50aF9hY2Nlc3NfdHJhaXRzKHJfYWNjZXNzX3RyYWl0cyksCisgIG1fcF9oZWFkKHNfaGVhZF9hbGxvY2F0b3IuYWxsb2NhdGUoMSkpLAorICBtX3NpemUoMCkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX1BBVF9UUklFX05BTUUoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSA6CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgZGVidWdfYmFzZShvdGhlciksCisjZW5kaWYKKyAgc3ludGhfYWNjZXNzX3RyYWl0cyhvdGhlciksCisgIG5vZGVfdXBkYXRlKG90aGVyKSwKKyAgbV9wX2hlYWQoc19oZWFkX2FsbG9jYXRvci5hbGxvY2F0ZSgxKSksCisgIG1fc2l6ZSgwKQoreworICBpbml0aWFsaXplKCk7CisgIG1fc2l6ZSA9IG90aGVyLm1fc2l6ZTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICAgIGlmIChvdGhlci5tX3BfaGVhZC0+bV9wX3BhcmVudCA9PSAwKQorICAgICAgeworCVBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorCXJldHVybjsKKyAgICAgIH0KKyAgX190cnkKKyAgICB7CisgICAgICBtX3BfaGVhZC0+bV9wX3BhcmVudCA9IHJlY3Vyc2l2ZV9jb3B5X25vZGUob3RoZXIubV9wX2hlYWQtPm1fcF9wYXJlbnQpOworICAgIH0KKyAgX19jYXRjaCguLi4pCisgICAgeworICAgICAgc19oZWFkX2FsbG9jYXRvci5kZWFsbG9jYXRlKG1fcF9oZWFkLCAxKTsKKyAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgIH0KKworICBtX3BfaGVhZC0+bV9wX21pbiA9IGxlZnRtb3N0X2Rlc2NlbmRhbnQobV9wX2hlYWQtPm1fcF9wYXJlbnQpOworICBtX3BfaGVhZC0+bV9wX21heCA9IHJpZ2h0bW9zdF9kZXNjZW5kYW50KG1fcF9oZWFkLT5tX3BfcGFyZW50KTsKKyAgbV9wX2hlYWQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQgPSBtX3BfaGVhZDsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgdmFsdWVfc3dhcChvdGhlcik7CisgIHN0ZDo6c3dhcCgoYWNjZXNzX3RyYWl0cyYgKSgqdGhpcyksIChhY2Nlc3NfdHJhaXRzJiApb3RoZXIpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordmFsdWVfc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6c3dhcChvdGhlcik7KQorICBzdGQ6OnN3YXAobV9wX2hlYWQsIG90aGVyLm1fcF9oZWFkKTsKKyAgc3RkOjpzd2FwKG1fc2l6ZSwgb3RoZXIubV9zaXplKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK35QQl9EU19QQVRfVFJJRV9OQU1FKCkKK3sKKyAgY2xlYXIoKTsKKyAgc19oZWFkX2FsbG9jYXRvci5kZWFsbG9jYXRlKG1fcF9oZWFkLCAxKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luaXRpYWxpemUoKQoreworICBuZXcgKG1fcF9oZWFkKSBoZWFkKCk7CisgIG1fcF9oZWFkLT5tX3BfcGFyZW50ID0gMDsKKyAgbV9wX2hlYWQtPm1fcF9taW4gPSBtX3BfaGVhZDsKKyAgbV9wX2hlYWQtPm1fcF9tYXggPSBtX3BfaGVhZDsKKyAgbV9zaXplID0gMDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIEl0Pgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY29weV9mcm9tX3JhbmdlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KQoreworICB3aGlsZSAoZmlyc3RfaXQgIT0gbGFzdF9pdCkKKyAgICBpbnNlcnQoKihmaXJzdF9pdCsrKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CityZWN1cnNpdmVfY29weV9ub2RlKG5vZGVfY29uc3RfcG9pbnRlciBwX25jcCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmNwICE9IDApOworICBpZiAocF9uY3AtPm1fdHlwZSA9PSBsZWFmX25vZGUpCisgICAgeworICAgICAgbGVhZl9jb25zdF9wb2ludGVyIHBfb3RoZXJfbGYgPSBzdGF0aWNfY2FzdDxsZWFmX2NvbnN0X3BvaW50ZXI+KHBfbmNwKTsKKyAgICAgIGxlYWZfcG9pbnRlciBwX25ld19sZiA9IHNfbGVhZl9hbGxvY2F0b3IuYWxsb2NhdGUoMSk7CisgICAgICBjb25kX2RlYWx0b3IgY29uZChwX25ld19sZik7CisgICAgICBuZXcgKHBfbmV3X2xmKSBsZWFmKHBfb3RoZXJfbGYtPnZhbHVlKCkpOworICAgICAgYXBwbHlfdXBkYXRlKHBfbmV3X2xmLCAobm9kZV91cGRhdGUqKXRoaXMpOworICAgICAgY29uZC5zZXRfbm9fYWN0aW9uX2R0b3IoKTsKKyAgICAgIHJldHVybiAocF9uZXdfbGYpOworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uY3AtPm1fdHlwZSA9PSBpX25vZGUpOworICBub2RlX3BvaW50ZXIgYV9wX2NoaWxkcmVuW2lub2RlOjphcnJfc2l6ZV07CisgIHNpemVfdHlwZSBjaGlsZF9pID0gMDsKKyAgaW5vZGVfY29uc3RfcG9pbnRlciBwX2ljcCA9IHN0YXRpY19jYXN0PGlub2RlX2NvbnN0X3BvaW50ZXI+KHBfbmNwKTsKKworICB0eXBlbmFtZSBpbm9kZTo6Y29uc3RfaXRlcmF0b3IgY2hpbGRfaXQgPSBwX2ljcC0+YmVnaW4oKTsKKworICBpbm9kZV9wb2ludGVyIHBfcmV0OworICBfX3RyeQorICAgIHsKKyAgICAgIHdoaWxlIChjaGlsZF9pdCAhPSBwX2ljcC0+ZW5kKCkpCisJeworCSAgYV9wX2NoaWxkcmVuW2NoaWxkX2ldID0gcmVjdXJzaXZlX2NvcHlfbm9kZSgqKGNoaWxkX2l0KSk7CisJICBjaGlsZF9pKys7CisJICBjaGlsZF9pdCsrOworCX0KKyAgICAgIHBfcmV0ID0gc19pbm9kZV9hbGxvY2F0b3IuYWxsb2NhdGUoMSk7CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7CisgICAgICB3aGlsZSAoY2hpbGRfaS0tID4gMCkKKwljbGVhcl9pbXAoYV9wX2NoaWxkcmVuW2NoaWxkX2ldKTsKKyAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgIH0KKworICBuZXcgKHBfcmV0KSBpbm9kZShwX2ljcC0+Z2V0X2VfaW5kKCksIHByZWZfYmVnaW4oYV9wX2NoaWxkcmVuWzBdKSk7CisKKyAgLS1jaGlsZF9pOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoY2hpbGRfaSA+PSAxKTsKKyAgZG8KKyAgICBwX3JldC0+YWRkX2NoaWxkKGFfcF9jaGlsZHJlbltjaGlsZF9pXSwgcHJlZl9iZWdpbihhX3BfY2hpbGRyZW5bY2hpbGRfaV0pLAorCQkgICAgIHByZWZfZW5kKGFfcF9jaGlsZHJlbltjaGlsZF9pXSksIHRoaXMpOworICB3aGlsZSAoY2hpbGRfaS0tID4gMCk7CisgIGFwcGx5X3VwZGF0ZShwX3JldCwgKG5vZGVfdXBkYXRlKil0aGlzKTsKKyAgcmV0dXJuIHBfcmV0OworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9kZWJ1Z19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vZGVidWdfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjNmQwMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vZGVidWdfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMTUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcGF0X3RyaWVfL2RlYnVnX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgcGF0X3RyaWVfLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgaWYgKG1fcF9oZWFkLT5tX3BfcGFyZW50ICE9IDApCisgICAgbV9wX2hlYWQtPm1fcF9wYXJlbnQtPmFzc2VydF92YWxpZCh0aGlzLCBfX2ZpbGUsIF9fbGluZSk7CisgIGFzc2VydF9pdGVyYXRvcnMoX19maWxlLCBfX2xpbmUpOworICBhc3NlcnRfcmV2ZXJzZV9pdGVyYXRvcnMoX19maWxlLCBfX2xpbmUpOworICBpZiAobV9wX2hlYWQtPm1fcF9wYXJlbnQgPT0gMCkKKyAgICB7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkobV9wX2hlYWQtPm1fcF9taW4gPT0gbV9wX2hlYWQpOworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKG1fcF9oZWFkLT5tX3BfbWF4ID09IG1fcF9oZWFkKTsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShlbXB0eSgpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgUEJfRFNfREVCVUdfVkVSSUZZKG1fcF9oZWFkLT5tX3BfbWluLT5tX3R5cGUgPT0gbGVhZl9ub2RlKTsKKyAgUEJfRFNfREVCVUdfVkVSSUZZKG1fcF9oZWFkLT5tX3BfbWF4LT5tX3R5cGUgPT0gbGVhZl9ub2RlKTsKKyAgUEJfRFNfREVCVUdfVkVSSUZZKCFlbXB0eSgpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF9pdGVyYXRvcnMoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBzaXplX3R5cGUgY2FsY19zaXplID0gMDsKKyAgZm9yIChjb25zdF9pdGVyYXRvciBpdCA9IGJlZ2luKCk7IGl0ICE9IGVuZCgpOyArK2l0KQorICAgIHsKKyAgICAgICsrY2FsY19zaXplOworICAgICAgZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2V4aXN0cyhQQl9EU19WMkYoKml0KSwgX19maWxlLCBfX2xpbmUpOworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKGxvd2VyX2JvdW5kKFBCX0RTX1YyRigqaXQpKSA9PSBpdCk7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkoLS11cHBlcl9ib3VuZChQQl9EU19WMkYoKml0KSkgPT0gaXQpOworICAgIH0KKyAgUEJfRFNfREVCVUdfVkVSSUZZKGNhbGNfc2l6ZSA9PSBtX3NpemUpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3JldmVyc2VfaXRlcmF0b3JzKGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgc2l6ZV90eXBlIGNhbGNfc2l6ZSA9IDA7CisgIGZvciAoY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdCA9IHJiZWdpbigpOyBpdCAhPSByZW5kKCk7ICsraXQpCisgICAgeworICAgICAgKytjYWxjX3NpemU7CisgICAgICBub2RlX2NvbnN0X3BvaW50ZXIgcF9uZCA9CisJY29uc3RfY2FzdDxQQl9EU19DTEFTU19DX0RFQyo+KHRoaXMpLT5maW5kX2ltcChQQl9EU19WMkYoKml0KSk7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkocF9uZCA9PSBpdC5tX3BfbmQpOworICAgIH0KKyAgUEJfRFNfREVCVUdfVkVSSUZZKGNhbGNfc2l6ZSA9PSBtX3NpemUpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVjdXJzaXZlX2NvdW50X2xlYWZzKG5vZGVfY29uc3RfcG9pbnRlciBwX25kLCBjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpCit7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuICgwKTsKKyAgaWYgKHBfbmQtPm1fdHlwZSA9PSBsZWFmX25vZGUpCisgICAgcmV0dXJuICgxKTsKKyAgUEJfRFNfREVCVUdfVkVSSUZZKHBfbmQtPm1fdHlwZSA9PSBpX25vZGUpOworICBzaXplX3R5cGUgcmV0ID0gMDsKKyAgZm9yICh0eXBlbmFtZSBpbm9kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdGF0aWNfY2FzdDxpbm9kZV9jb25zdF9wb2ludGVyPihwX25kKS0+YmVnaW4oKTsKKyAgICAgICBpdCAhPSBzdGF0aWNfY2FzdDxpbm9kZV9jb25zdF9wb2ludGVyPihwX25kKS0+ZW5kKCk7CisgICAgICAgKytpdCkKKyAgICByZXQgKz0gcmVjdXJzaXZlX2NvdW50X2xlYWZzKCppdCwgX19maWxlLCBfX2xpbmUpOworICByZXR1cm4gcmV0OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vZXJhc2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2VyYXNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZGIxNDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2VyYXNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMzE1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBhdF90cmllXy9lcmFzZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHBhdF90cmllLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2Uoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKK3sKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBmaW5kX2ltcChyX2tleSk7CisgIGlmIChwX25kID09IDAgfHwgcF9uZC0+bV90eXBlID09IGlfbm9kZSkKKyAgICB7CisgICAgICBQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1Qocl9rZXkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3R5cGUgPT0gbGVhZl9ub2RlKTsKKyAgaWYgKCFzeW50aF9hY2Nlc3NfdHJhaXRzOjplcXVhbF9rZXlzKFBCX0RTX1YyRihyZWludGVycHJldF9jYXN0PGxlYWZfcG9pbnRlcj4ocF9uZCktPnZhbHVlKCkpLCByX2tleSkpCisgICAgeworICAgICAgUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKHJfa2V5KQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBQQl9EU19DSEVDS19LRVlfRVhJU1RTKHJfa2V5KQorICBlcmFzZV9sZWFmKHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4ocF9uZCkpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmV0dXJuIHRydWU7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9maXh1cChpbm9kZV9wb2ludGVyIHBfbmQpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChzdGQ6OmRpc3RhbmNlKHBfbmQtPmJlZ2luKCksIHBfbmQtPmVuZCgpKSA+PSAxKTsKKyAgaWYgKHN0ZDo6ZGlzdGFuY2UocF9uZC0+YmVnaW4oKSwgcF9uZC0+ZW5kKCkpID09IDEpCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfcGFyZW50ID0gcF9uZC0+bV9wX3BhcmVudDsKKyAgICAgIGlmIChwX3BhcmVudCA9PSBtX3BfaGVhZCkKKwltX3BfaGVhZC0+bV9wX3BhcmVudCA9ICpwX25kLT5iZWdpbigpOworICAgICAgZWxzZQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BhcmVudC0+bV90eXBlID09IGlfbm9kZSk7CisJICBub2RlX3BvaW50ZXIgcF9uZXdfY2hpbGQgPSAqcF9uZC0+YmVnaW4oKTsKKworCSAgdHlwZWRlZiBpbm9kZV9wb2ludGVyIGlub2RlX3B0cjsKKwkgIGlub2RlX3B0ciBwX2ludGVybmFsID0gc3RhdGljX2Nhc3Q8aW5vZGVfcHRyPihwX3BhcmVudCk7CisJICBwX2ludGVybmFsLT5yZXBsYWNlX2NoaWxkKHBfbmV3X2NoaWxkLCBwcmVmX2JlZ2luKHBfbmV3X2NoaWxkKSwKKwkJCQkgICAgcHJlZl9lbmQocF9uZXdfY2hpbGQpLCB0aGlzKTsKKwl9CisgICAgICAoKnBfbmQtPmJlZ2luKCkpLT5tX3BfcGFyZW50ID0gcF9uZC0+bV9wX3BhcmVudDsKKyAgICAgIHBfbmQtPn5pbm9kZSgpOworICAgICAgc19pbm9kZV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShwX25kLCAxKTsKKworICAgICAgaWYgKHBfcGFyZW50ID09IG1fcF9oZWFkKQorCXJldHVybjsKKworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfcGFyZW50LT5tX3R5cGUgPT0gaV9ub2RlKTsKKyAgICAgIHBfbmQgPSBzdGF0aWNfY2FzdDxpbm9kZV9wb2ludGVyPihwX3BhcmVudCk7CisgICAgfQorCisgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChzdGQ6OmRpc3RhbmNlKHBfbmQtPmJlZ2luKCksIHBfbmQtPmVuZCgpKSA+IDEpOworICAgICAgcF9uZC0+dXBkYXRlX3ByZWZpeGVzKHRoaXMpOworICAgICAgYXBwbHlfdXBkYXRlKHBfbmQsIChub2RlX3VwZGF0ZSopdGhpcyk7CisgICAgICBQQl9EU19BU1NFUlRfTk9ERV9WQUxJRChwX25kKQorICAgICAgaWYgKHBfbmQtPm1fcF9wYXJlbnQtPm1fdHlwZSA9PSBoZWFkX25vZGUpCisJcmV0dXJuOworCisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV9wX3BhcmVudC0+bV90eXBlID09IGlfbm9kZSk7CisKKyAgICAgIHBfbmQgPSBzdGF0aWNfY2FzdDxpbm9kZV9wb2ludGVyPihwX25kLT5tX3BfcGFyZW50KTsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYWN0dWFsX2VyYXNlX2xlYWYobGVhZl9wb2ludGVyIHBfbCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fc2l6ZSA+IDApOworICAtLW1fc2l6ZTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjplcmFzZV9leGlzdGluZyhQQl9EU19WMkYocF9sLT52YWx1ZSgpKSkpOworICBwX2wtPn5sZWFmKCk7CisgIHNfbGVhZl9hbGxvY2F0b3IuZGVhbGxvY2F0ZShwX2wsIDEpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY2xlYXIoKQoreworICBpZiAoIWVtcHR5KCkpCisgICAgeworICAgICAgY2xlYXJfaW1wKG1fcF9oZWFkLT5tX3BfcGFyZW50KTsKKyAgICAgIG1fc2l6ZSA9IDA7CisgICAgICBpbml0aWFsaXplKCk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNsZWFyKCk7KQorICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgfQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY2xlYXJfaW1wKG5vZGVfcG9pbnRlciBwX25kKQoreworICBpZiAocF9uZC0+bV90eXBlID09IGlfbm9kZSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV90eXBlID09IGlfbm9kZSk7CisgICAgICBmb3IgKHR5cGVuYW1lIGlub2RlOjppdGVyYXRvciBpdCA9CisJICAgICBzdGF0aWNfY2FzdDxpbm9kZV9wb2ludGVyPihwX25kKS0+YmVnaW4oKTsKKwkgICBpdCAhPSBzdGF0aWNfY2FzdDxpbm9kZV9wb2ludGVyPihwX25kKS0+ZW5kKCk7CisJICAgKytpdCkKKwl7CisJICBub2RlX3BvaW50ZXIgcF9jaGlsZCA9KiBpdDsKKwkgIGNsZWFyX2ltcChwX2NoaWxkKTsKKwl9CisgICAgICBzX2lub2RlX2FsbG9jYXRvci5kZWFsbG9jYXRlKHN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KHBfbmQpLCAxKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fdHlwZSA9PSBsZWFmX25vZGUpOworICBzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KHBfbmQpLT5+bGVhZigpOworICBzX2xlYWZfYWxsb2NhdG9yLmRlYWxsb2NhdGUoc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihwX25kKSwgMSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShjb25zdF9pdGVyYXRvciBpdCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisKKyAgaWYgKGl0ID09IGVuZCgpKQorICAgIHJldHVybiBpdDsKKworICBjb25zdF9pdGVyYXRvciByZXRfaXQgPSBpdDsKKyAgKytyZXRfaXQ7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpdC5tX3BfbmQtPm1fdHlwZSA9PSBsZWFmX25vZGUpOworICBlcmFzZV9sZWFmKHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4oaXQubV9wX25kKSk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gcmV0X2l0OworfQorCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKGl0ZXJhdG9yIGl0KQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKworICBpZiAoaXQgPT0gZW5kKCkpCisgICAgcmV0dXJuIGl0OworICBpdGVyYXRvciByZXRfaXQgPSBpdDsKKyAgKytyZXRfaXQ7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpdC5tX3BfbmQtPm1fdHlwZSA9PSBsZWFmX25vZGUpOworICBlcmFzZV9sZWFmKHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4oaXQubV9wX25kKSk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gcmV0X2l0OworfQorI2VuZGlmIC8vICNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaXQpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorCisgIGlmIChpdC5tX3BfbmQgPT0gbV9wX2hlYWQpCisgICAgcmV0dXJuIGl0OworICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJldF9pdCA9IGl0OworICArK3JldF9pdDsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoaXQubV9wX25kLT5tX3R5cGUgPT0gbGVhZl9ub2RlKTsKKyAgZXJhc2VfbGVhZihzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KGl0Lm1fcF9uZCkpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmV0dXJuIHJldF9pdDsKK30KKworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnJldmVyc2VfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKHJldmVyc2VfaXRlcmF0b3IgaXQpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorCisgIGlmIChpdC5tX3BfbmQgPT0gbV9wX2hlYWQpCisgICAgcmV0dXJuIGl0OworICByZXZlcnNlX2l0ZXJhdG9yIHJldF9pdCA9IGl0OworICArK3JldF9pdDsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoaXQubV9wX25kLT5tX3R5cGUgPT0gbGVhZl9ub2RlKTsKKyAgZXJhc2VfbGVhZihzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KGl0Lm1fcF9uZCkpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmV0dXJuIHJldF9pdDsKK30KKyNlbmRpZiAvLyAjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9pZihQcmVkIHByZWQpCit7CisgIHNpemVfdHlwZSBudW1fZXJzZCA9IDA7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorCisgIGl0ZXJhdG9yIGl0ID0gYmVnaW4oKTsKKyAgd2hpbGUgKGl0ICE9IGVuZCgpKQorICAgIHsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgaWYgKHByZWQoKml0KSkKKwl7CisJICArK251bV9lcnNkOworCSAgaXQgPSBlcmFzZShpdCk7CisJfQorICAgICAgZWxzZQorCSsraXQ7CisgICAgfQorCisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gbnVtX2Vyc2Q7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9sZWFmKGxlYWZfcG9pbnRlciBwX2wpCit7CisgIHVwZGF0ZV9taW5fbWF4X2Zvcl9lcmFzZWRfbGVhZihwX2wpOworICBpZiAocF9sLT5tX3BfcGFyZW50LT5tX3R5cGUgPT0gaGVhZF9ub2RlKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChzaXplKCkgPT0gMSk7CisgICAgICBjbGVhcigpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoc2l6ZSgpID4gMSk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX2wtPm1fcF9wYXJlbnQtPm1fdHlwZSA9PSBpX25vZGUpOworCisgIGlub2RlX3BvaW50ZXIgcF9wYXJlbnQgPSBzdGF0aWNfY2FzdDxpbm9kZV9wb2ludGVyPihwX2wtPm1fcF9wYXJlbnQpOworCisgIHBfcGFyZW50LT5yZW1vdmVfY2hpbGQocF9sKTsKKyAgZXJhc2VfZml4dXAocF9wYXJlbnQpOworICBhY3R1YWxfZXJhc2VfbGVhZihwX2wpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordXBkYXRlX21pbl9tYXhfZm9yX2VyYXNlZF9sZWFmKGxlYWZfcG9pbnRlciBwX2wpCit7CisgIGlmIChtX3NpemUgPT0gMSkKKyAgICB7CisgICAgICBtX3BfaGVhZC0+bV9wX21pbiA9IG1fcF9oZWFkOworICAgICAgbV9wX2hlYWQtPm1fcF9tYXggPSBtX3BfaGVhZDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHBfbCA9PSBzdGF0aWNfY2FzdDxsZWFmX2NvbnN0X3BvaW50ZXI+KG1fcF9oZWFkLT5tX3BfbWluKSkKKyAgICB7CisgICAgICBpdGVyYXRvciBpdChwX2wpOworICAgICAgKytpdDsKKyAgICAgIG1fcF9oZWFkLT5tX3BfbWluID0gaXQubV9wX25kOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAocF9sID09IHN0YXRpY19jYXN0PGxlYWZfY29uc3RfcG9pbnRlcj4obV9wX2hlYWQtPm1fcF9tYXgpKQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIGl0KHBfbCk7CisgICAgICAtLWl0OworICAgICAgbV9wX2hlYWQtPm1fcF9tYXggPSBpdC5tX3BfbmQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9maW5kX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9maW5kX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NzdiZjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2ZpbmRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwyNjkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcGF0X3RyaWVfL2ZpbmRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBwYXRfdHJpZS4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBmaW5kX2ltcChyX2tleSk7CisKKyAgaWYgKHBfbmQgPT0gMCB8fCBwX25kLT5tX3R5cGUgIT0gbGVhZl9ub2RlKQorICAgIHsKKyAgICAgIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChyX2tleSkKKyAgICAgIHJldHVybiBlbmQoKTsKKyAgICB9CisKKyAgaWYgKHN5bnRoX2FjY2Vzc190cmFpdHM6OmVxdWFsX2tleXMoUEJfRFNfVjJGKHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4ocF9uZCktPnZhbHVlKCkpLCByX2tleSkpCisgICAgeworICAgICAgUEJfRFNfQ0hFQ0tfS0VZX0VYSVNUUyhyX2tleSkKKyAgICAgIHJldHVybiBpdGVyYXRvcihwX25kKTsKKyAgICB9CisKKyAgUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKHJfa2V5KQorICByZXR1cm4gZW5kKCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2NvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0Cit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorCisgIG5vZGVfY29uc3RfcG9pbnRlciBwX25kID0gY29uc3RfY2FzdDxQQl9EU19DTEFTU19DX0RFQyogPih0aGlzKS0+ZmluZF9pbXAocl9rZXkpOworCisgIGlmIChwX25kID09IDAgfHwgcF9uZC0+bV90eXBlICE9IGxlYWZfbm9kZSkKKyAgICB7CisgICAgICBQQl9EU19DSEVDS19LRVlfRE9FU19OT1RfRVhJU1Qocl9rZXkpCisgICAgICByZXR1cm4gZW5kKCk7CisgICAgfQorCisgIGlmIChzeW50aF9hY2Nlc3NfdHJhaXRzOjplcXVhbF9rZXlzKFBCX0RTX1YyRihzdGF0aWNfY2FzdDxsZWFmX2NvbnN0X3BvaW50ZXI+KHBfbmQpLT52YWx1ZSgpKSwgcl9rZXkpKQorICAgIHsKKyAgICAgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMocl9rZXkpCisgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoY29uc3RfY2FzdDxub2RlX3BvaW50ZXI+KHBfbmQpKTsKKyAgICB9CisKKyAgUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKHJfa2V5KQorICByZXR1cm4gZW5kKCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZF9pbXAoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKK3sKKyAgaWYgKGVtcHR5KCkpCisgICAgcmV0dXJuIDA7CisKKyAgdHlwZW5hbWUgc3ludGhfYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgYl9pdCA9CisgICAgc3ludGhfYWNjZXNzX3RyYWl0czo6YmVnaW4ocl9rZXkpOworICB0eXBlbmFtZSBzeW50aF9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBlX2l0ID0KKyAgICBzeW50aF9hY2Nlc3NfdHJhaXRzOjplbmQocl9rZXkpOworCisgIG5vZGVfcG9pbnRlciBwX25kID0gbV9wX2hlYWQtPm1fcF9wYXJlbnQ7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kICE9IDApOworCisgIHdoaWxlIChwX25kLT5tX3R5cGUgIT0gbGVhZl9ub2RlKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3R5cGUgPT0gaV9ub2RlKTsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHRfbmQgPSBzdGF0aWNfY2FzdDxpbm9kZV9wb2ludGVyPihwX25kKS0+Z2V0X2NoaWxkX25vZGUoYl9pdCwgIGVfaXQsICB0aGlzKTsKKworICAgICAgaWYgKHBfbmV4dF9uZCA9PSAwKQorCXJldHVybiBwX25kOworICAgICAgcF9uZCA9IHBfbmV4dF9uZDsKKyAgICB9CisgIHJldHVybiBwX25kOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2xvd2VyX2JvdW5kX2ltcChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQoreworICBpZiAoZW1wdHkoKSkKKyAgICByZXR1cm4gKG1fcF9oZWFkKTsKKworICBub2RlX3BvaW50ZXIgcF9uZCA9IG1fcF9oZWFkLT5tX3BfcGFyZW50OworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZCAhPSAwKTsKKworICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6YV9jb25zdF9pdGVyYXRvciBiX2l0ID0KKyAgICBzeW50aF9hY2Nlc3NfdHJhaXRzOjpiZWdpbihyX2tleSk7CisKKyAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmFfY29uc3RfaXRlcmF0b3IgZV9pdCA9CisgICAgc3ludGhfYWNjZXNzX3RyYWl0czo6ZW5kKHJfa2V5KTsKKworICBzaXplX3R5cGUgY2hlY2tlZF9pbmQgPSAwOworICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICBpZiAocF9uZC0+bV90eXBlID09IGxlYWZfbm9kZSkKKyAgICAgICAgeworCSAgaWYgKCFzeW50aF9hY2Nlc3NfdHJhaXRzOjpjbXBfa2V5cyhQQl9EU19WMkYoc3RhdGljX2Nhc3Q8bGVhZl9jb25zdF9wb2ludGVyPihwX25kKS0+dmFsdWUoKSksIHJfa2V5KSkKKwkgICAgcmV0dXJuIHBfbmQ7CisJICBpdGVyYXRvciBpdChwX25kKTsKKwkgICsraXQ7CisJICByZXR1cm4gaXQubV9wX25kOworICAgICAgICB9CisKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3R5cGUgPT0gaV9ub2RlKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBuZXdfY2hlY2tlZF9pbmQgPQorCXN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KHBfbmQpLT5nZXRfZV9pbmQoKTsKKworICAgICAgcF9uZCA9CisJc3RhdGljX2Nhc3Q8aW5vZGVfcG9pbnRlcj4ocF9uZCktPmdldF9sb3dlcl9ib3VuZF9jaGlsZF9ub2RlKCAgICAgICAgICAgICAgICBiX2l0LCBlX2l0LCBjaGVja2VkX2luZCwgdGhpcyk7CisgICAgICBjaGVja2VkX2luZCA9IG5ld19jaGVja2VkX2luZDsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Citsb3dlcl9ib3VuZChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQoreyByZXR1cm4gcG9pbnRfaXRlcmF0b3IobG93ZXJfYm91bmRfaW1wKHJfa2V5KSk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfY29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2xvd2VyX2JvdW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0Cit7CisgIHJldHVybiBwb2ludF9jb25zdF9pdGVyYXRvcihjb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDKiA+KHRoaXMpLT5sb3dlcl9ib3VuZF9pbXAocl9rZXkpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3VwcGVyX2JvdW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCit7CisgIHBvaW50X2l0ZXJhdG9yIGxfYm91bmRfaXQgPSBsb3dlcl9ib3VuZChyX2tleSk7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGxfYm91bmRfaXQgPT0gZW5kKCkgfHwKKwkJICAgIXN5bnRoX2FjY2Vzc190cmFpdHM6OmNtcF9rZXlzKFBCX0RTX1YyRigqbF9ib3VuZF9pdCksCisJCQkJCQkgICAgcl9rZXkpKTsKKworICBpZiAobF9ib3VuZF9pdCA9PSBlbmQoKSB8fAorICAgICAgc3ludGhfYWNjZXNzX3RyYWl0czo6Y21wX2tleXMocl9rZXksIFBCX0RTX1YyRigqbF9ib3VuZF9pdCkpKQorICAgIHJldHVybiBsX2JvdW5kX2l0OworCisgIHJldHVybiArK2xfYm91bmRfaXQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2NvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Cit1cHBlcl9ib3VuZChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KSBjb25zdAoreworICBwb2ludF9jb25zdF9pdGVyYXRvciBsX2JvdW5kX2l0ID0gbG93ZXJfYm91bmQocl9rZXkpOworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChsX2JvdW5kX2l0ID09IGVuZCgpIHx8CisJCSAgICFzeW50aF9hY2Nlc3NfdHJhaXRzOjpjbXBfa2V5cyhQQl9EU19WMkYoKmxfYm91bmRfaXQpLAorCQkJCQkJICAgIHJfa2V5KSk7CisKKyAgaWYgKGxfYm91bmRfaXQgPT0gZW5kKCkgfHwKKyAgICAgIHN5bnRoX2FjY2Vzc190cmFpdHM6OmNtcF9rZXlzKHJfa2V5LCBQQl9EU19WMkYoKmxfYm91bmRfaXQpKSkKKyAgICByZXR1cm4gbF9ib3VuZF9pdDsKKyAgcmV0dXJuICsrbF9ib3VuZF9pdDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6YV9jb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcHJlZl9iZWdpbihub2RlX2NvbnN0X3BvaW50ZXIgcF9uZCkKK3sKKyAgaWYgKHBfbmQtPm1fdHlwZSA9PSBsZWFmX25vZGUpCisgICAgcmV0dXJuIChzeW50aF9hY2Nlc3NfdHJhaXRzOjpiZWdpbihQQl9EU19WMkYoc3RhdGljX2Nhc3Q8bGVhZl9jb25zdF9wb2ludGVyPihwX25kKS0+dmFsdWUoKSkpKTsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV90eXBlID09IGlfbm9kZSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbm9kZV9jb25zdF9wb2ludGVyPihwX25kKS0+cHJlZl9iX2l0KCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmFfY29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3ByZWZfZW5kKG5vZGVfY29uc3RfcG9pbnRlciBwX25kKQoreworICBpZiAocF9uZC0+bV90eXBlID09IGxlYWZfbm9kZSkKKyAgICByZXR1cm4gKHN5bnRoX2FjY2Vzc190cmFpdHM6OmVuZChQQl9EU19WMkYoc3RhdGljX2Nhc3Q8bGVhZl9jb25zdF9wb2ludGVyPihwX25kKS0+dmFsdWUoKSkpKTsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV90eXBlID09IGlfbm9kZSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbm9kZV9jb25zdF9wb2ludGVyPihwX25kKS0+cHJlZl9lX2l0KCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmxlYWZfY29uc3RfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbGVmdG1vc3RfZGVzY2VuZGFudChub2RlX2NvbnN0X3BvaW50ZXIgcF9uZCkKK3sKKyAgaWYgKHBfbmQtPm1fdHlwZSA9PSBsZWFmX25vZGUpCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGxlYWZfY29uc3RfcG9pbnRlcj4ocF9uZCk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbm9kZV9jb25zdF9wb2ludGVyPihwX25kKS0+bGVmdG1vc3RfZGVzY2VuZGFudCgpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpsZWFmX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2xlZnRtb3N0X2Rlc2NlbmRhbnQobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIGlmIChwX25kLT5tX3R5cGUgPT0gbGVhZl9ub2RlKQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KHBfbmQpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW5vZGVfcG9pbnRlcj4ocF9uZCktPmxlZnRtb3N0X2Rlc2NlbmRhbnQoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bGVhZl9jb25zdF9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CityaWdodG1vc3RfZGVzY2VuZGFudChub2RlX2NvbnN0X3BvaW50ZXIgcF9uZCkKK3sKKyAgaWYgKHBfbmQtPm1fdHlwZSA9PSBsZWFmX25vZGUpCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGxlYWZfY29uc3RfcG9pbnRlcj4ocF9uZCk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbm9kZV9jb25zdF9wb2ludGVyPihwX25kKS0+cmlnaHRtb3N0X2Rlc2NlbmRhbnQoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bGVhZl9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CityaWdodG1vc3RfZGVzY2VuZGFudChub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgaWYgKHBfbmQtPm1fdHlwZSA9PSBsZWFmX25vZGUpCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4ocF9uZCk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbm9kZV9wb2ludGVyPihwX25kKS0+cmlnaHRtb3N0X2Rlc2NlbmRhbnQoKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9pbmZvX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9pbmZvX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMGFhZDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2luZm9fZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1OCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwYXRfdHJpZV8vaW5mb19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHBhdF90cmllLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW1wdHkoKSBjb25zdAoreyByZXR1cm4gKG1fc2l6ZSA9PSAwKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NpemUoKSBjb25zdAoreyByZXR1cm4gbV9zaXplOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbWF4X3NpemUoKSBjb25zdAoreyByZXR1cm4gc19pbm9kZV9hbGxvY2F0b3IubWF4X3NpemUoKTsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2luc2VydF9qb2luX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9pbnNlcnRfam9pbl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWFhYzc1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9pbnNlcnRfam9pbl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDQ3MiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwYXRfdHJpZV8vaW5zZXJ0X2pvaW5fZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBwYXRfdHJpZS4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogoram9pbihQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgIGJyYW5jaF9iYWcgYmFnOworICBpZiAoIWpvaW5fcHJlcChvdGhlciwgYmFnKSkKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbV9wX2hlYWQtPm1fcF9wYXJlbnQgPSByZWNfam9pbihtX3BfaGVhZC0+bV9wX3BhcmVudCwKKwkJCQkgIG90aGVyLm1fcF9oZWFkLT5tX3BfcGFyZW50LCAwLCBiYWcpOworCisgIG1fcF9oZWFkLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50ID0gbV9wX2hlYWQ7CisgIG1fc2l6ZSArPSBvdGhlci5tX3NpemU7CisgIG90aGVyLmluaXRpYWxpemUoKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICBtX3BfaGVhZC0+bV9wX21pbiA9IGxlZnRtb3N0X2Rlc2NlbmRhbnQobV9wX2hlYWQtPm1fcF9wYXJlbnQpOworICBtX3BfaGVhZC0+bV9wX21heCA9IHJpZ2h0bW9zdF9kZXNjZW5kYW50KG1fcF9oZWFkLT5tX3BfcGFyZW50KTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitib29sCitQQl9EU19DTEFTU19DX0RFQzo6Citqb2luX3ByZXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyLCBicmFuY2hfYmFnJiByX2JhZykKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgaWYgKG90aGVyLm1fc2l6ZSA9PSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAobV9zaXplID09IDApCisgICAgeworICAgICAgdmFsdWVfc3dhcChvdGhlcik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGNvbnN0IGJvb2wgZ3JlYXRlciA9CisgICAgc3ludGhfYWNjZXNzX3RyYWl0czo6Y21wX2tleXMoUEJfRFNfVjJGKHN0YXRpY19jYXN0PGxlYWZfY29uc3RfcG9pbnRlcj4obV9wX2hlYWQtPm1fcF9tYXgpLT52YWx1ZSgpKSwKKwkJCQkgICAgUEJfRFNfVjJGKHN0YXRpY19jYXN0PGxlYWZfY29uc3RfcG9pbnRlcj4ob3RoZXIubV9wX2hlYWQtPm1fcF9taW4pLT52YWx1ZSgpKSk7CisKKyAgY29uc3QgYm9vbCBsZXNzZXIgPQorICAgIHN5bnRoX2FjY2Vzc190cmFpdHM6OmNtcF9rZXlzKFBCX0RTX1YyRihzdGF0aWNfY2FzdDxsZWFmX2NvbnN0X3BvaW50ZXI+KG90aGVyLm1fcF9oZWFkLT5tX3BfbWF4KS0+dmFsdWUoKSksCisJCQkJICAgIFBCX0RTX1YyRihzdGF0aWNfY2FzdDxsZWFmX2NvbnN0X3BvaW50ZXI+KG1fcF9oZWFkLT5tX3BfbWluKS0+dmFsdWUoKSkpOworCisgIGlmICghZ3JlYXRlciAmJiAhbGVzc2VyKQorICAgIF9fdGhyb3dfam9pbl9lcnJvcigpOworCisgIHJlY19qb2luX3ByZXAobV9wX2hlYWQtPm1fcF9wYXJlbnQsIG90aGVyLm1fcF9oZWFkLT5tX3BfcGFyZW50LCByX2JhZyk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6am9pbihvdGhlciwgZmFsc2UpOykKKyAgcmV0dXJuIHRydWU7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZWNfam9pbl9wcmVwKG5vZGVfY29uc3RfcG9pbnRlciBwX2wsIG5vZGVfY29uc3RfcG9pbnRlciBwX3IsIAorCSAgICAgIGJyYW5jaF9iYWcmIHJfYmFnKQoreworICBpZiAocF9sLT5tX3R5cGUgPT0gbGVhZl9ub2RlKQorICAgIHsKKyAgICAgIGlmIChwX3ItPm1fdHlwZSA9PSBsZWFmX25vZGUpCisJeworCSAgcmVjX2pvaW5fcHJlcChzdGF0aWNfY2FzdDxsZWFmX2NvbnN0X3BvaW50ZXI+KHBfbCksCisJCQlzdGF0aWNfY2FzdDxsZWFmX2NvbnN0X3BvaW50ZXI+KHBfciksIHJfYmFnKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3ItPm1fdHlwZSA9PSBpX25vZGUpOworICAgICAgcmVjX2pvaW5fcHJlcChzdGF0aWNfY2FzdDxsZWFmX2NvbnN0X3BvaW50ZXI+KHBfbCksCisJCSAgICBzdGF0aWNfY2FzdDxpbm9kZV9jb25zdF9wb2ludGVyPihwX3IpLCByX2JhZyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX2wtPm1fdHlwZSA9PSBpX25vZGUpOworICBpZiAocF9yLT5tX3R5cGUgPT0gbGVhZl9ub2RlKQorICAgIHsKKyAgICAgIHJlY19qb2luX3ByZXAoc3RhdGljX2Nhc3Q8aW5vZGVfY29uc3RfcG9pbnRlcj4ocF9sKSwKKwkJICAgIHN0YXRpY19jYXN0PGxlYWZfY29uc3RfcG9pbnRlcj4ocF9yKSwgcl9iYWcpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9yLT5tX3R5cGUgPT0gaV9ub2RlKTsKKworICByZWNfam9pbl9wcmVwKHN0YXRpY19jYXN0PGlub2RlX2NvbnN0X3BvaW50ZXI+KHBfbCksCisJCXN0YXRpY19jYXN0PGlub2RlX2NvbnN0X3BvaW50ZXI+KHBfciksIHJfYmFnKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlY19qb2luX3ByZXAobGVhZl9jb25zdF9wb2ludGVyIC8qcF9sKi8sIGxlYWZfY29uc3RfcG9pbnRlciAvKnBfciovLAorCSAgICAgIGJyYW5jaF9iYWcmIHJfYmFnKQoreyByX2JhZy5hZGRfYnJhbmNoKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlY19qb2luX3ByZXAobGVhZl9jb25zdF9wb2ludGVyIC8qcF9sKi8sIGlub2RlX2NvbnN0X3BvaW50ZXIgLypwX3IqLywKKwkgICAgICBicmFuY2hfYmFnJiByX2JhZykKK3sgcl9iYWcuYWRkX2JyYW5jaCgpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZWNfam9pbl9wcmVwKGlub2RlX2NvbnN0X3BvaW50ZXIgLypwX2wqLywgbGVhZl9jb25zdF9wb2ludGVyIC8qcF9yKi8sCisJICAgICAgYnJhbmNoX2JhZyYgcl9iYWcpCit7IHJfYmFnLmFkZF9icmFuY2goKTsgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVjX2pvaW5fcHJlcChpbm9kZV9jb25zdF9wb2ludGVyIHBfbCwgaW5vZGVfY29uc3RfcG9pbnRlciBwX3IsCisJICAgICAgYnJhbmNoX2JhZyYgcl9iYWcpCit7CisgIGlmIChwX2wtPmdldF9lX2luZCgpID09IHBfci0+Z2V0X2VfaW5kKCkgJiYKKyAgICAgIHN5bnRoX2FjY2Vzc190cmFpdHM6OmVxdWFsX3ByZWZpeGVzKHBfbC0+cHJlZl9iX2l0KCksIHBfbC0+cHJlZl9lX2l0KCksCisJCQkJCSAgICBwX3ItPnByZWZfYl9pdCgpLCBwX3ItPnByZWZfZV9pdCgpKSkKKyAgICB7CisgICAgICBmb3IgKHR5cGVuYW1lIGlub2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IHBfci0+YmVnaW4oKTsKKwkgICBpdCAhPSBwX3ItPmVuZCgpOyArKyBpdCkKKwl7CisJICBub2RlX2NvbnN0X3BvaW50ZXIgcF9sX2pvaW5fY2hpbGQgPSBwX2wtPmdldF9qb2luX2NoaWxkKCppdCwgdGhpcyk7CisJICBpZiAocF9sX2pvaW5fY2hpbGQgIT0gMCkKKwkgICAgcmVjX2pvaW5fcHJlcChwX2xfam9pbl9jaGlsZCwgKiBpdCwgcl9iYWcpOworCX0KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHBfci0+Z2V0X2VfaW5kKCkgPCBwX2wtPmdldF9lX2luZCgpICYmCisgICAgICBwX3ItPnNob3VsZF9iZV9taW5lKHBfbC0+cHJlZl9iX2l0KCksIHBfbC0+cHJlZl9lX2l0KCksIDAsIHRoaXMpKQorICAgIHsKKyAgICAgIG5vZGVfY29uc3RfcG9pbnRlciBwX3Jfam9pbl9jaGlsZCA9IHBfci0+Z2V0X2pvaW5fY2hpbGQocF9sLCB0aGlzKTsKKyAgICAgIGlmIChwX3Jfam9pbl9jaGlsZCAhPSAwKQorCXJlY19qb2luX3ByZXAocF9yX2pvaW5fY2hpbGQsIHBfbCwgcl9iYWcpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAocF9yLT5nZXRfZV9pbmQoKSA8IHBfbC0+Z2V0X2VfaW5kKCkgJiYKKyAgICAgIHBfci0+c2hvdWxkX2JlX21pbmUocF9sLT5wcmVmX2JfaXQoKSwgcF9sLT5wcmVmX2VfaXQoKSwgMCwgdGhpcykpCisgICAgeworICAgICAgbm9kZV9jb25zdF9wb2ludGVyIHBfcl9qb2luX2NoaWxkID0gcF9yLT5nZXRfam9pbl9jaGlsZChwX2wsIHRoaXMpOworICAgICAgaWYgKHBfcl9qb2luX2NoaWxkICE9IDApCisJcmVjX2pvaW5fcHJlcChwX3Jfam9pbl9jaGlsZCwgcF9sLCByX2JhZyk7CisgICAgICByZXR1cm47CisgICAgfQorICByX2JhZy5hZGRfYnJhbmNoKCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CityZWNfam9pbihub2RlX3BvaW50ZXIgcF9sLCBub2RlX3BvaW50ZXIgcF9yLCBzaXplX3R5cGUgY2hlY2tlZF9pbmQsIAorCSBicmFuY2hfYmFnJiByX2JhZykKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfciAhPSAwKTsKKyAgaWYgKHBfbCA9PSAwKQorICAgIHsKKyAgICAgIGFwcGx5X3VwZGF0ZShwX3IsIChub2RlX3VwZGF0ZSopdGhpcyk7CisgICAgICByZXR1cm4gKHBfcik7CisgICAgfQorCisgIGlmIChwX2wtPm1fdHlwZSA9PSBsZWFmX25vZGUpCisgICAgeworICAgICAgaWYgKHBfci0+bV90eXBlID09IGxlYWZfbm9kZSkKKwl7CisJICBub2RlX3BvaW50ZXIgcF9yZXQgPSByZWNfam9pbihzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KHBfbCksCisJCQkJCXN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4ocF9yKSwgcl9iYWcpOworCSAgYXBwbHlfdXBkYXRlKHBfcmV0LCAobm9kZV91cGRhdGUqKXRoaXMpOworCSAgcmV0dXJuIHBfcmV0OworCX0KKworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfci0+bV90eXBlID09IGlfbm9kZSk7CisgICAgICBub2RlX3BvaW50ZXIgcF9yZXQgPSByZWNfam9pbihzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KHBfbCksCisJCQkJICAgIHN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KHBfciksCisJCQkJICAgIGNoZWNrZWRfaW5kLCByX2JhZyk7CisgICAgICBhcHBseV91cGRhdGUocF9yZXQsIChub2RlX3VwZGF0ZSopdGhpcyk7CisgICAgICByZXR1cm4gcF9yZXQ7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX2wtPm1fdHlwZSA9PSBpX25vZGUpOworICBpZiAocF9yLT5tX3R5cGUgPT0gbGVhZl9ub2RlKQorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX3JldCA9IHJlY19qb2luKHN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KHBfbCksCisJCQkJICAgIHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4ocF9yKSwKKwkJCQkgICAgY2hlY2tlZF9pbmQsIHJfYmFnKTsKKyAgICAgIGFwcGx5X3VwZGF0ZShwX3JldCwgKG5vZGVfdXBkYXRlKil0aGlzKTsKKyAgICAgIHJldHVybiBwX3JldDsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfci0+bV90eXBlID09IGlfbm9kZSk7CisgIG5vZGVfcG9pbnRlciBwX3JldCA9IHJlY19qb2luKHN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KHBfbCksCisJCQkJc3RhdGljX2Nhc3Q8aW5vZGVfcG9pbnRlcj4ocF9yKSwKKwkJCQlyX2JhZyk7CisKKyAgYXBwbHlfdXBkYXRlKHBfcmV0LCAobm9kZV91cGRhdGUqKXRoaXMpOworICByZXR1cm4gcF9yZXQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CityZWNfam9pbihsZWFmX3BvaW50ZXIgcF9sLCBsZWFmX3BvaW50ZXIgcF9yLCBicmFuY2hfYmFnJiByX2JhZykKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfciAhPSAwKTsKKyAgaWYgKHBfbCA9PSAwKQorICAgIHJldHVybiAocF9yKTsKKyAgbm9kZV9wb2ludGVyIHBfcmV0ID0gaW5zZXJ0X2JyYW5jaChwX2wsIHBfciwgcl9iYWcpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoUEJfRFNfUkVDVVJTSVZFX0NPVU5UX0xFQUZTKHBfcmV0KSA9PSAyKTsKKyAgcmV0dXJuIHBfcmV0OworfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVjX2pvaW4obGVhZl9wb2ludGVyIHBfbCwgaW5vZGVfcG9pbnRlciBwX3IsIHNpemVfdHlwZSBjaGVja2VkX2luZCwKKwkgYnJhbmNoX2JhZyYgcl9iYWcpCit7CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgY29uc3Qgc2l6ZV90eXBlIGxoc19sZWFmcyA9IFBCX0RTX1JFQ1VSU0lWRV9DT1VOVF9MRUFGUyhwX2wpOworICBjb25zdCBzaXplX3R5cGUgcmhzX2xlYWZzID0gUEJfRFNfUkVDVVJTSVZFX0NPVU5UX0xFQUZTKHBfcik7CisjZW5kaWYKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9yICE9IDApOworICBub2RlX3BvaW50ZXIgcF9yZXQgPSByZWNfam9pbihwX3IsIHBfbCwgY2hlY2tlZF9pbmQsIHJfYmFnKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKFBCX0RTX1JFQ1VSU0lWRV9DT1VOVF9MRUFGUyhwX3JldCkgPT0gbGhzX2xlYWZzICsgcmhzX2xlYWZzKTsKKyAgcmV0dXJuIHBfcmV0OworfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVjX2pvaW4oaW5vZGVfcG9pbnRlciBwX2wsIGxlYWZfcG9pbnRlciBwX3IsIHNpemVfdHlwZSBjaGVja2VkX2luZCwgYnJhbmNoX2JhZyYgcl9iYWcpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX2wgIT0gMCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3IgIT0gMCk7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICBjb25zdCBzaXplX3R5cGUgbGhzX2xlYWZzID0gUEJfRFNfUkVDVVJTSVZFX0NPVU5UX0xFQUZTKHBfbCk7CisgIGNvbnN0IHNpemVfdHlwZSByaHNfbGVhZnMgPSBQQl9EU19SRUNVUlNJVkVfQ09VTlRfTEVBRlMocF9yKTsKKyNlbmRpZgorCisgIGlmICghcF9sLT5zaG91bGRfYmVfbWluZShwcmVmX2JlZ2luKHBfciksIHByZWZfZW5kKHBfciksIGNoZWNrZWRfaW5kLCB0aGlzKSkKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9yZXQgPSBpbnNlcnRfYnJhbmNoKHBfbCwgcF9yLCByX2JhZyk7CisgICAgICBQQl9EU19BU1NFUlRfTk9ERV9WQUxJRChwX3JldCkKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChQQl9EU19SRUNVUlNJVkVfQ09VTlRfTEVBRlMocF9yZXQpID09CisgICAgICAgCQkJICAgIGxoc19sZWFmcyArIHJoc19sZWFmcyk7CisgICAgICByZXR1cm4gcF9yZXQ7CisgICAgfQorCisgIG5vZGVfcG9pbnRlciBwX3BvdF9jaGlsZCA9IHBfbC0+YWRkX2NoaWxkKHBfciwgcHJlZl9iZWdpbihwX3IpLAorCQkJCQkgICAgcHJlZl9lbmQocF9yKSwgdGhpcyk7CisgIGlmIChwX3BvdF9jaGlsZCAhPSBwX3IpCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfbmV3X2NoaWxkID0gcmVjX2pvaW4ocF9wb3RfY2hpbGQsIHBfciwgcF9sLT5nZXRfZV9pbmQoKSwKKwkJCQkJICByX2JhZyk7CisKKyAgICAgIHBfbC0+cmVwbGFjZV9jaGlsZChwX25ld19jaGlsZCwgcHJlZl9iZWdpbihwX25ld19jaGlsZCksCisJCQkgcHJlZl9lbmQocF9uZXdfY2hpbGQpLCB0aGlzKTsKKyAgICB9CisKKyAgUEJfRFNfQVNTRVJUX05PREVfVkFMSUQocF9sKQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoUEJfRFNfUkVDVVJTSVZFX0NPVU5UX0xFQUZTKHBfbCkgPT0gbGhzX2xlYWZzICsgcmhzX2xlYWZzKTsKKyAgcmV0dXJuIHBfbDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlY19qb2luKGlub2RlX3BvaW50ZXIgcF9sLCBpbm9kZV9wb2ludGVyIHBfciwgCisJIGJyYW5jaF9iYWcmIHJfYmFnKQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9sICE9IDApOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9yICE9IDApOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgY29uc3Qgc2l6ZV90eXBlIGxoc19sZWFmcyA9IFBCX0RTX1JFQ1VSU0lWRV9DT1VOVF9MRUFGUyhwX2wpOworICBjb25zdCBzaXplX3R5cGUgcmhzX2xlYWZzID0gUEJfRFNfUkVDVVJTSVZFX0NPVU5UX0xFQUZTKHBfcik7CisjZW5kaWYKKworICBpZiAocF9sLT5nZXRfZV9pbmQoKSA9PSBwX3ItPmdldF9lX2luZCgpICYmCisgICAgICBzeW50aF9hY2Nlc3NfdHJhaXRzOjplcXVhbF9wcmVmaXhlcyhwX2wtPnByZWZfYl9pdCgpLCBwX2wtPnByZWZfZV9pdCgpLAorCQkJCQkgICAgcF9yLT5wcmVmX2JfaXQoKSwgcF9yLT5wcmVmX2VfaXQoKSkpCisgICAgeworICAgICAgZm9yICh0eXBlbmFtZSBpbm9kZTo6aXRlcmF0b3IgaXQgPSBwX3ItPmJlZ2luKCk7CisJICAgaXQgIT0gcF9yLT5lbmQoKTsgKysgaXQpCisJeworCSAgbm9kZV9wb2ludGVyIHBfbmV3X2NoaWxkID0gcmVjX2pvaW4ocF9sLT5nZXRfam9pbl9jaGlsZCgqaXQsIHRoaXMpLAorCQkJCQkgICAgICAqIGl0LCAwLCByX2JhZyk7CisJICBwX2wtPnJlcGxhY2VfY2hpbGQocF9uZXdfY2hpbGQsIHByZWZfYmVnaW4ocF9uZXdfY2hpbGQpLAorCQkJICAgICBwcmVmX2VuZChwX25ld19jaGlsZCksIHRoaXMpOworCX0KKworICAgICAgcF9yLT5+aW5vZGUoKTsKKyAgICAgIHNfaW5vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF9yLCAxKTsKKyAgICAgIFBCX0RTX0FTU0VSVF9OT0RFX1ZBTElEKHBfbCkKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChQQl9EU19SRUNVUlNJVkVfQ09VTlRfTEVBRlMocF9sKSA9PSBsaHNfbGVhZnMgKyByaHNfbGVhZnMpOworICAgICAgcmV0dXJuIHBfbDsKKyAgICB9CisKKyAgaWYgKHBfbC0+Z2V0X2VfaW5kKCkgPCBwX3ItPmdldF9lX2luZCgpICYmCisgICAgICBwX2wtPnNob3VsZF9iZV9taW5lKHBfci0+cHJlZl9iX2l0KCksIHBfci0+cHJlZl9lX2l0KCksIDAsIHRoaXMpKQorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25ld19jaGlsZCA9IHJlY19qb2luKHBfbC0+Z2V0X2pvaW5fY2hpbGQocF9yLCB0aGlzKSwKKwkJCQkJICBwX3IsIDAsIHJfYmFnKTsKKyAgICAgIHBfbC0+cmVwbGFjZV9jaGlsZChwX25ld19jaGlsZCwgcHJlZl9iZWdpbihwX25ld19jaGlsZCksCisJCQkgcHJlZl9lbmQocF9uZXdfY2hpbGQpLCB0aGlzKTsKKyAgICAgIFBCX0RTX0FTU0VSVF9OT0RFX1ZBTElEKHBfbCkKKyAgICAgIHJldHVybiBwX2w7CisgICAgfQorCisgIGlmIChwX3ItPmdldF9lX2luZCgpIDwgcF9sLT5nZXRfZV9pbmQoKSAmJgorICAgICAgcF9yLT5zaG91bGRfYmVfbWluZShwX2wtPnByZWZfYl9pdCgpLCBwX2wtPnByZWZfZV9pdCgpLCAwLCB0aGlzKSkKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9uZXdfY2hpbGQgPSByZWNfam9pbihwX3ItPmdldF9qb2luX2NoaWxkKHBfbCwgdGhpcyksIHBfbCwKKwkJCQkJICAwLCByX2JhZyk7CisKKyAgICAgIHBfci0+cmVwbGFjZV9jaGlsZChwX25ld19jaGlsZCwgcHJlZl9iZWdpbihwX25ld19jaGlsZCksCisJCQkgcHJlZl9lbmQocF9uZXdfY2hpbGQpLCB0aGlzKTsKKworICAgICAgUEJfRFNfQVNTRVJUX05PREVfVkFMSUQocF9yKQorICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKFBCX0RTX1JFQ1VSU0lWRV9DT1VOVF9MRUFGUyhwX3IpID09IGxoc19sZWFmcyArIHJoc19sZWFmcyk7CisgICAgICByZXR1cm4gcF9yOworICAgIH0KKworICBub2RlX3BvaW50ZXIgcF9yZXQgPSBpbnNlcnRfYnJhbmNoKHBfbCwgcF9yLCByX2JhZyk7CisgIFBCX0RTX0FTU0VSVF9OT0RFX1ZBTElEKHBfcmV0KQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoUEJfRFNfUkVDVVJTSVZFX0NPVU5UX0xFQUZTKHBfcmV0KSA9PSBsaHNfbGVhZnMgKyByaHNfbGVhZnMpOworICByZXR1cm4gcF9yZXQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgc3RkOjpwYWlyPHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvciwgYm9vbD4KK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luc2VydChjb25zdF9yZWZlcmVuY2Ugcl92YWwpCit7CisgIG5vZGVfcG9pbnRlciBwX2xmID0gZmluZF9pbXAoUEJfRFNfVjJGKHJfdmFsKSk7CisgIGlmIChwX2xmICE9IDAgJiYgcF9sZi0+bV90eXBlID09IGxlYWZfbm9kZSAmJgorICAgICAgc3ludGhfYWNjZXNzX3RyYWl0czo6ZXF1YWxfa2V5cyhQQl9EU19WMkYoc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihwX2xmKS0+dmFsdWUoKSksIFBCX0RTX1YyRihyX3ZhbCkpKQorICAgIHsKKyAgICAgIFBCX0RTX0NIRUNLX0tFWV9FWElTVFMoUEJfRFNfVjJGKHJfdmFsKSkKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKHBfbGYpLCBmYWxzZSk7CisgICAgfQorCisgIFBCX0RTX0NIRUNLX0tFWV9ET0VTX05PVF9FWElTVChQQl9EU19WMkYocl92YWwpKQorCisgIGxlYWZfcG9pbnRlciBwX25ld19sZiA9IHNfbGVhZl9hbGxvY2F0b3IuYWxsb2NhdGUoMSk7CisgIGNvbmRfZGVhbHRvciBjb25kKHBfbmV3X2xmKTsKKworICBuZXcgKHBfbmV3X2xmKSBsZWFmKHJfdmFsKTsKKyAgYXBwbHlfdXBkYXRlKHBfbmV3X2xmLCAobm9kZV91cGRhdGUqKXRoaXMpOworICBjb25kLnNldF9jYWxsX2Rlc3RydWN0b3IoKTsKKyAgYnJhbmNoX2JhZyBiYWc7CisgIGJhZy5hZGRfYnJhbmNoKCk7CisgIG1fcF9oZWFkLT5tX3BfcGFyZW50ID0gcmVjX2pvaW4obV9wX2hlYWQtPm1fcF9wYXJlbnQsIHBfbmV3X2xmLCAwLCBiYWcpOworICBtX3BfaGVhZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudCA9IG1fcF9oZWFkOworICBjb25kLnNldF9ub19hY3Rpb25fZHRvcigpOworICArK21fc2l6ZTsKKyAgdXBkYXRlX21pbl9tYXhfZm9yX2luc2VydGVkX2xlYWYocF9uZXdfbGYpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6Omluc2VydF9uZXcoUEJfRFNfVjJGKHJfdmFsKSk7KQorICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHBvaW50X2l0ZXJhdG9yKHBfbmV3X2xmKSwgdHJ1ZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitrZXlzX2RpZmZfaW5kKHR5cGVuYW1lIGFjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGJfbCwKKwkgICAgICB0eXBlbmFtZSBhY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBlX2wsCisJICAgICAgdHlwZW5hbWUgYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgYl9yLAorCSAgICAgIHR5cGVuYW1lIGFjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGVfcikKK3sKKyAgc2l6ZV90eXBlIGRpZmZfcG9zID0gMDsKKyAgd2hpbGUgKGJfbCAhPSBlX2wpCisgICAgeworICAgICAgaWYgKGJfciA9PSBlX3IpCisJcmV0dXJuIChkaWZmX3Bvcyk7CisgICAgICBpZiAoYWNjZXNzX3RyYWl0czo6ZV9wb3MoKmJfbCkgIT0gYWNjZXNzX3RyYWl0czo6ZV9wb3MoKmJfcikpCisJcmV0dXJuIChkaWZmX3Bvcyk7CisgICAgICArK2JfbDsKKyAgICAgICsrYl9yOworICAgICAgKytkaWZmX3BvczsKKyAgICB9CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChiX3IgIT0gZV9yKTsKKyAgcmV0dXJuIGRpZmZfcG9zOworfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Omlub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luc2VydF9icmFuY2gobm9kZV9wb2ludGVyIHBfbCwgbm9kZV9wb2ludGVyIHBfciwgYnJhbmNoX2JhZyYgcl9iYWcpCit7CisgIHR5cGVuYW1lIHN5bnRoX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGxlZnRfYl9pdCA9IHByZWZfYmVnaW4ocF9sKTsKKyAgdHlwZW5hbWUgc3ludGhfYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgbGVmdF9lX2l0ID0gcHJlZl9lbmQocF9sKTsKKyAgdHlwZW5hbWUgc3ludGhfYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgcmlnaHRfYl9pdCA9IHByZWZfYmVnaW4ocF9yKTsKKyAgdHlwZW5hbWUgc3ludGhfYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgcmlnaHRfZV9pdCA9IHByZWZfZW5kKHBfcik7CisKKyAgY29uc3Qgc2l6ZV90eXBlIGRpZmZfaW5kID0ga2V5c19kaWZmX2luZChsZWZ0X2JfaXQsIGxlZnRfZV9pdCwKKwkJCQkJICAgcmlnaHRfYl9pdCwgcmlnaHRfZV9pdCk7CisKKyAgaW5vZGVfcG9pbnRlciBwX25ld19uZCA9IHJfYmFnLmdldF9icmFuY2goKTsKKyAgbmV3IChwX25ld19uZCkgaW5vZGUoZGlmZl9pbmQsIGxlZnRfYl9pdCk7CisgIHBfbmV3X25kLT5hZGRfY2hpbGQocF9sLCBsZWZ0X2JfaXQsIGxlZnRfZV9pdCwgdGhpcyk7CisgIHBfbmV3X25kLT5hZGRfY2hpbGQocF9yLCByaWdodF9iX2l0LCByaWdodF9lX2l0LCB0aGlzKTsKKyAgcF9sLT5tX3BfcGFyZW50ID0gcF9uZXdfbmQ7CisgIHBfci0+bV9wX3BhcmVudCA9IHBfbmV3X25kOworICBQQl9EU19BU1NFUlRfTk9ERV9WQUxJRChwX25ld19uZCkKKyAgcmV0dXJuIChwX25ld19uZCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit1cGRhdGVfbWluX21heF9mb3JfaW5zZXJ0ZWRfbGVhZihsZWFmX3BvaW50ZXIgcF9uZXdfbGYpCit7CisgIGlmIChtX3BfaGVhZC0+bV9wX21pbiA9PSBtX3BfaGVhZCB8fAorICAgICAgc3ludGhfYWNjZXNzX3RyYWl0czo6Y21wX2tleXMoUEJfRFNfVjJGKHBfbmV3X2xmLT52YWx1ZSgpKSwKKwkJCQkgICAgICBQQl9EU19WMkYoc3RhdGljX2Nhc3Q8bGVhZl9jb25zdF9wb2ludGVyPihtX3BfaGVhZC0+bV9wX21pbiktPnZhbHVlKCkpKSkKKyAgICBtX3BfaGVhZC0+bV9wX21pbiA9IHBfbmV3X2xmOworCisgIGlmIChtX3BfaGVhZC0+bV9wX21heCA9PSBtX3BfaGVhZCB8fAorICAgICAgc3ludGhfYWNjZXNzX3RyYWl0czo6Y21wX2tleXMoUEJfRFNfVjJGKHN0YXRpY19jYXN0PGxlYWZfY29uc3RfcG9pbnRlcj4obV9wX2hlYWQtPm1fcF9tYXgpLT52YWx1ZSgpKSwgUEJfRFNfVjJGKHBfbmV3X2xmLT52YWx1ZSgpKSkpCisgICAgbV9wX2hlYWQtPm1fcF9tYXggPSBwX25ld19sZjsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM1YmFhMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTIwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBhdF90cmllXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBwYXRfdHJpZS4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oKQoreyByZXR1cm4gaXRlcmF0b3IobV9wX2hlYWQtPm1fcF9taW4pOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitiZWdpbigpIGNvbnN0Cit7IHJldHVybiBjb25zdF9pdGVyYXRvcihtX3BfaGVhZC0+bV9wX21pbik7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VuZCgpCit7IHJldHVybiBpdGVyYXRvcihtX3BfaGVhZCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VuZCgpIGNvbnN0Cit7IHJldHVybiBjb25zdF9pdGVyYXRvcihtX3BfaGVhZCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmJlZ2luKCkgY29uc3QKK3sKKyAgaWYgKGVtcHR5KCkpCisgICAgcmV0dXJuIHJlbmQoKTsKKyAgcmV0dXJuIC0tZW5kKCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnJldmVyc2VfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JiZWdpbigpCit7CisgIGlmIChlbXB0eSgpKQorICAgIHJldHVybiByZW5kKCk7CisgIHJldHVybiAtLWVuZCgpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpyZXZlcnNlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CityZW5kKCkKK3sgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IobV9wX2hlYWQpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlbmQoKSBjb25zdAoreyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihtX3BfaGVhZCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9jb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm9kZV9iZWdpbigpIGNvbnN0Cit7IHJldHVybiBub2RlX2NvbnN0X2l0ZXJhdG9yKG1fcF9oZWFkLT5tX3BfcGFyZW50LCB0aGlzKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Citub2RlX2JlZ2luKCkKK3sgcmV0dXJuIG5vZGVfaXRlcmF0b3IobV9wX2hlYWQtPm1fcF9wYXJlbnQsIHRoaXMpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfY29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vZGVfZW5kKCkgY29uc3QKK3sgcmV0dXJuIG5vZGVfY29uc3RfaXRlcmF0b3IoMCwgdGhpcyk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm9kZV9lbmQoKQoreyByZXR1cm4gbm9kZV9pdGVyYXRvcigwLCB0aGlzKTsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3BhdF90cmllXy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3BhdF90cmllXy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4MWM4YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcGF0X3RyaWVfLmhwcApAQCAtMCwwICsxLDU5NiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwYXRfdHJpZV8vcGF0X3RyaWVfLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgcGF0cmljaWEgdHJlZS4KKyAqLworCisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPGV4dC9wYl9kcy9leGNlcHRpb24uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy90YWdfYW5kX3RyYWl0LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY29uZF9kZWFsdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZXNfdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2VxX2ZuL2VxX2J5X2xlc3MuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3N5bnRoX2FjY2Vzc190cmFpdHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3BhdF90cmllX2Jhc2UuaHBwPgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9kZWJ1Z19tYXBfYmFzZS5ocHA+CisjZW5kaWYKKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX1BBVF9UUklFX05BTUUgcGF0X3RyaWVfbWFwCisjZW5kaWYKKworI2lmZGVmIFBCX0RTX0RBVEFfRkFMU0VfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX1BBVF9UUklFX05BTUUgcGF0X3RyaWVfc2V0CisjZW5kaWYKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIE5vZGVfQW5kX0l0X1RyYWl0cywgXAorCSAgICAgdHlwZW5hbWUgX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICBQQl9EU19QQVRfVFJJRV9OQU1FPEtleSwgTWFwcGVkLCBOb2RlX0FuZF9JdF9UcmFpdHMsIF9BbGxvYz4KKworI2RlZmluZSBQQl9EU19QQVRfVFJJRV9UUkFJVFNfQkFTRSBcCisgICAgdHlwZXNfdHJhaXRzPEtleSwgTWFwcGVkLCBfQWxsb2MsIGZhbHNlPgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyNkZWZpbmUgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMgXAorICAgIGRlYnVnX21hcF9iYXNlPEtleSwJZXFfYnlfbGVzczxLZXksIHN0ZDo6bGVzczxLZXk+ID4sIFwKKwkJIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPEtleT46Om90aGVyOjpjb25zdF9yZWZlcmVuY2U+CisjZW5kaWYKKworCisgICAgLyoqCisgICAgICogIEBicmllZiBQQVRSSUNJQSB0cmllLgorICAgICAqICBAaW5ncm91cCBicmFuY2gtZGV0YWlsCisgICAgICoKKyAgICAgKiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBsb29zZWx5IGJvcnJvd3MgaWRlYXMgZnJvbToKKyAgICAgKiAgMSkgRmFzdCBNZXJnZWFibGUgSW50ZWdlciBNYXBzLCBPa2FzYWtpLCBHaWxsIDE5OTgKKyAgICAgKiAgMikgUHRzZXQ6IFNldHMgb2YgaW50ZWdlcnMgaW1wbGVtZW50ZWQgYXMgUGF0cmljaWEgdHJlZXMsCisgICAgICogICAgIEplYW4tQ2hyaXN0b3BoZSBGaWxsaWF0ciwgMjAwMAorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHMsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgUEJfRFNfUEFUX1RSSUVfTkFNRSA6CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHB1YmxpYyBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQywKKyNlbmRpZgorICAgICAgcHVibGljIE5vZGVfQW5kX0l0X1RyYWl0czo6c3ludGhfYWNjZXNzX3RyYWl0cywKKyAgICAgIHB1YmxpYyBOb2RlX0FuZF9JdF9UcmFpdHM6Om5vZGVfdXBkYXRlLAorICAgICAgcHVibGljIFBCX0RTX1BBVF9UUklFX1RSQUlUU19CQVNFLAorICAgICAgcHVibGljIHBhdF90cmllX2Jhc2UKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgcGF0X3RyaWVfYmFzZQkJCQliYXNlX3R5cGU7CisgICAgICB0eXBlZGVmIFBCX0RTX1BBVF9UUklFX1RSQUlUU19CQVNFIAkgICAgICAgCXRyYWl0c19iYXNlOworICAgICAgdHlwZWRlZiBOb2RlX0FuZF9JdF9UcmFpdHMJCQl0cmFpdHNfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6c3ludGhfYWNjZXNzX3RyYWl0cyBzeW50aF9hY2Nlc3NfdHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzeW50aF9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBhX2NvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpub2RlIAkJbm9kZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8bm9kZT4JX19yZWJpbmRfbjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIgbm9kZV9jb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9uOjpvdGhlcjo6cG9pbnRlciAJbm9kZV9wb2ludGVyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpoZWFkIAkJaGVhZDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8aGVhZD4JX19yZWJpbmRfaDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfaDo6b3RoZXIgCQloZWFkX2FsbG9jYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaGVhZF9hbGxvY2F0b3I6OnBvaW50ZXIgCQloZWFkX3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmxlYWYgCQlsZWFmOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxsZWFmPglfX3JlYmluZF9sOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9sOjpvdGhlciAJCWxlYWZfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBsZWFmX2FsbG9jYXRvcjo6cG9pbnRlciAJCWxlYWZfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbGVhZl9hbGxvY2F0b3I6OmNvbnN0X3BvaW50ZXIgCWxlYWZfY29uc3RfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW5vZGUgCQlpbm9kZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaW5vZGU6Oml0ZXJhdG9yIAkJCWlub2RlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxpbm9kZT4gCV9fcmViaW5kX2luOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9pbjo6b3RoZXIgCQlfX3JlYmluZF9pbmE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2luOjpvdGhlciAgICAgIAkgICAgICAgCWlub2RlX2FsbG9jYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfaW5hOjpwb2ludGVyIAkJaW5vZGVfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfaW5hOjpjb25zdF9wb2ludGVyIAlpbm9kZV9jb25zdF9wb2ludGVyOworCisKKyAgICAgIC8vLyBDb25kaXRpb25hbCBkZWFsbG9jYXRvci4KKyAgICAgIGNsYXNzIGNvbmRfZGVhbHRvcgorICAgICAgeworICAgICAgcHJvdGVjdGVkOgorCWxlYWZfcG9pbnRlciAJCW1fcF9uZDsKKwlib29sIAkJCW1fbm9fYWN0aW9uX2R0b3I7CisJYm9vbCAJCQltX2NhbGxfZGVzdHJ1Y3RvcjsKKworICAgICAgcHVibGljOgorCWNvbmRfZGVhbHRvcihsZWFmX3BvaW50ZXIgcF9uZCkKKwk6IG1fcF9uZChwX25kKSwgbV9ub19hY3Rpb25fZHRvcihmYWxzZSksIG1fY2FsbF9kZXN0cnVjdG9yKGZhbHNlKQorCXsgfQorCisJdm9pZAorCXNldF9ub19hY3Rpb25fZHRvcigpCisJeyBtX25vX2FjdGlvbl9kdG9yID0gdHJ1ZTsgfQorCisJdm9pZAorCXNldF9jYWxsX2Rlc3RydWN0b3IoKQorCXsgbV9jYWxsX2Rlc3RydWN0b3IgPSB0cnVlOyB9CisKKwl+Y29uZF9kZWFsdG9yKCkKKwl7CisJICBpZiAobV9ub19hY3Rpb25fZHRvcikKKwkgICAgcmV0dXJuOworCisJICBpZiAobV9jYWxsX2Rlc3RydWN0b3IpCisJICAgIG1fcF9uZC0+fmxlYWYoKTsKKworCSAgc19sZWFmX2FsbG9jYXRvci5kZWFsbG9jYXRlKG1fcF9uZCwgMSk7CisJfQorICAgICAgfTsKKworCisgICAgICAvLy8gQnJhbmNoIGJhZywgZm9yIHNwbGl0LWpvaW4uCisgICAgICBjbGFzcyBicmFuY2hfYmFnCisgICAgICB7CisgICAgICBwcml2YXRlOgorCXR5cGVkZWYgaW5vZGVfcG9pbnRlciAJCQkgICAgICAgCV9faW5wOworCXR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X19pbnA+OjpvdGhlciAJX19yZWJpbmRfaW5wOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKwl0eXBlZGVmIHN0ZDo6X0dMSUJDWFhfU1REX0M6Omxpc3Q8X19pbnAsIF9fcmViaW5kX2lucD4gCWJhZ190eXBlOworI2Vsc2UKKwl0eXBlZGVmIHN0ZDo6bGlzdDxfX2lucCwgX19yZWJpbmRfaW5wPiAJCQliYWdfdHlwZTsKKyNlbmRpZgorCisJYmFnX3R5cGUgCQkJCQkJbV9iYWc7CisgICAgICBwdWJsaWM6CisJdm9pZAorCWFkZF9icmFuY2goKQorCXsKKwkgIGlub2RlX3BvaW50ZXIgcF9uZCA9IHNfaW5vZGVfYWxsb2NhdG9yLmFsbG9jYXRlKDEpOworCSAgX190cnkKKwkgICAgeworCSAgICAgIG1fYmFnLnB1c2hfYmFjayhwX25kKTsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBzX2lub2RlX2FsbG9jYXRvci5kZWFsbG9jYXRlKHBfbmQsIDEpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJfQorCisJaW5vZGVfcG9pbnRlcgorCWdldF9icmFuY2goKQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghbV9iYWcuZW1wdHkoKSk7CisJICBpbm9kZV9wb2ludGVyIHBfbmQgPSAqbV9iYWcuYmVnaW4oKTsKKwkgIG1fYmFnLnBvcF9mcm9udCgpOworCSAgcmV0dXJuIHBfbmQ7CisJfQorCisJfmJyYW5jaF9iYWcoKQorCXsKKwkgIHdoaWxlICghbV9iYWcuZW1wdHkoKSkKKwkgICAgeworCSAgICAgIGlub2RlX3BvaW50ZXIgcF9uZCA9ICptX2JhZy5iZWdpbigpOworCSAgICAgIHNfaW5vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF9uZCwgMSk7CisJICAgICAgbV9iYWcucG9wX2Zyb250KCk7CisJICAgIH0KKwl9CisKKwlpbmxpbmUgYm9vbAorCWVtcHR5KCkgY29uc3QKKwl7IHJldHVybiBtX2JhZy5lbXB0eSgpOyB9CisgICAgICB9OworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHR5cGVkZWYgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMgCQlkZWJ1Z19iYXNlOworI2VuZGlmCisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om51bGxfbm9kZV91cGRhdGVfcG9pbnRlciBudWxsX25vZGVfdXBkYXRlX3BvaW50ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHBhdF90cmllX3RhZyAJCQkJY29udGFpbmVyX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiBfQWxsb2MgCQkJCQlhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgCQlzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6ZGlmZmVyZW5jZV90eXBlIAkJZGlmZmVyZW5jZV90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfdHlwZSAJCWtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X3BvaW50ZXIgCWtleV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X2NvbnN0X3BvaW50ZXIgCWtleV9jb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X3JlZmVyZW5jZSAJa2V5X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV9jb25zdF9yZWZlcmVuY2Uga2V5X2NvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF90eXBlIAltYXBwZWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF9wb2ludGVyIAltYXBwZWRfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF9jb25zdF9wb2ludGVyIG1hcHBlZF9jb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3JlZmVyZW5jZSAJbWFwcGVkX3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF9jb25zdF9yZWZlcmVuY2UgbWFwcGVkX2NvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnZhbHVlX3R5cGUgCQl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6cG9pbnRlciAJCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9wb2ludGVyIAljb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6cmVmZXJlbmNlIAkJcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3RfcmVmZXJlbmNlIAljb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmFjY2Vzc190cmFpdHMgCWFjY2Vzc190cmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpjb25zdF9pdGVyYXRvciAJcG9pbnRfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppdGVyYXRvciAJCXBvaW50X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBwb2ludF9jb25zdF9pdGVyYXRvciAJCQljb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgcG9pbnRfaXRlcmF0b3IgCQkJCWl0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpyZXZlcnNlX2l0ZXJhdG9yIAlyZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6bm9kZV9jb25zdF9pdGVyYXRvciBub2RlX2NvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6bm9kZV9pdGVyYXRvciAJbm9kZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om5vZGVfdXBkYXRlIAlub2RlX3VwZGF0ZTsKKworICAgICAgUEJfRFNfUEFUX1RSSUVfTkFNRSgpOworCisgICAgICBQQl9EU19QQVRfVFJJRV9OQU1FKGNvbnN0IGFjY2Vzc190cmFpdHMmKTsKKworICAgICAgUEJfRFNfUEFUX1RSSUVfTkFNRShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIH5QQl9EU19QQVRfVFJJRV9OQU1FKCk7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBlbXB0eSgpIGNvbnN0OworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3Q7CisKKyAgICAgIGFjY2Vzc190cmFpdHMmCisgICAgICBnZXRfYWNjZXNzX3RyYWl0cygpOworCisgICAgICBjb25zdCBhY2Nlc3NfdHJhaXRzJgorICAgICAgZ2V0X2FjY2Vzc190cmFpdHMoKSBjb25zdDsKKworICAgICAgbm9kZV91cGRhdGUmCisgICAgICBnZXRfbm9kZV91cGRhdGUoKTsKKworICAgICAgY29uc3Qgbm9kZV91cGRhdGUmCisgICAgICBnZXRfbm9kZV91cGRhdGUoKSBjb25zdDsKKworICAgICAgaW5saW5lIHN0ZDo6cGFpcjxwb2ludF9pdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydChjb25zdF9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgbWFwcGVkX3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQorICAgICAgeworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKwlyZXR1cm4gaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHJfa2V5LCBtYXBwZWRfdHlwZSgpKSkuZmlyc3QtPnNlY29uZDsKKyNlbHNlCisJaW5zZXJ0KHJfa2V5KTsKKwlyZXR1cm4gdHJhaXRzX2Jhc2U6OnNfbnVsbF90eXBlOworI2VuZGlmCisgICAgICB9CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgZmluZChrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIHBvaW50X2NvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGtleV9jb25zdF9yZWZlcmVuY2UpIGNvbnN0OworCisgICAgICBpbmxpbmUgcG9pbnRfaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGtleV9jb25zdF9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgcG9pbnRfY29uc3RfaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGtleV9jb25zdF9yZWZlcmVuY2UpIGNvbnN0OworCisgICAgICBpbmxpbmUgcG9pbnRfaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGtleV9jb25zdF9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgcG9pbnRfY29uc3RfaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGtleV9jb25zdF9yZWZlcmVuY2UpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBjbGVhcigpOworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgZXJhc2Uoa2V5X2NvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IpOworCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvcik7CisjZW5kaWYKKworICAgICAgaW5saW5lIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X3JldmVyc2VfaXRlcmF0b3IpOworCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICAgICAgaW5saW5lIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIGVyYXNlKHJldmVyc2VfaXRlcmF0b3IpOworI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBlcmFzZV9pZihQcmVkKTsKKworICAgICAgdm9pZAorICAgICAgam9pbihQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB2b2lkCisgICAgICBzcGxpdChrZXlfY29uc3RfcmVmZXJlbmNlLCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCk7CisKKyAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdDsKKworICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBlbmQoKTsKKworICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdDsKKworICAgICAgaW5saW5lIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpOworCisgICAgICBpbmxpbmUgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCk7CisKKyAgICAgIGlubGluZSBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3Q7CisKKyAgICAgIC8vLyBSZXR1cm5zIGEgY29uc3Qgbm9kZV9pdGVyYXRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBub2RlIGF0IHRoZQorICAgICAgLy8vIHJvb3Qgb2YgdGhlIHRyZWUuCisgICAgICBpbmxpbmUgbm9kZV9jb25zdF9pdGVyYXRvcgorICAgICAgbm9kZV9iZWdpbigpIGNvbnN0OworCisgICAgICAvLy8gUmV0dXJucyBhIG5vZGVfaXRlcmF0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgbm9kZSBhdCB0aGUKKyAgICAgIC8vLyByb290IG9mIHRoZSB0cmVlLgorICAgICAgaW5saW5lIG5vZGVfaXRlcmF0b3IKKyAgICAgIG5vZGVfYmVnaW4oKTsKKworICAgICAgLy8vIFJldHVybnMgYSBjb25zdCBub2RlX2l0ZXJhdG9yIGNvcnJlc3BvbmRpbmcgdG8gYSBub2RlIGp1c3QKKyAgICAgIC8vLyBhZnRlciBhIGxlYWYgb2YgdGhlIHRyZWUuCisgICAgICBpbmxpbmUgbm9kZV9jb25zdF9pdGVyYXRvcgorICAgICAgbm9kZV9lbmQoKSBjb25zdDsKKworICAgICAgLy8vIFJldHVybnMgYSBub2RlX2l0ZXJhdG9yIGNvcnJlc3BvbmRpbmcgdG8gYSBub2RlIGp1c3QKKyAgICAgIC8vLyBhZnRlciBhIGxlYWYgb2YgdGhlIHRyZWUuCisgICAgICBpbmxpbmUgbm9kZV9pdGVyYXRvcgorICAgICAgbm9kZV9lbmQoKTsKKworI2lmZGVmIFBCX0RTX1BBVF9UUklFX1RSQUNFXworICAgICAgdm9pZAorICAgICAgdHJhY2UoKSBjb25zdDsKKyNlbmRpZgorCisgICAgcHJvdGVjdGVkOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgICB2b2lkCisgICAgICBjb3B5X2Zyb21fcmFuZ2UoSXQsIEl0KTsKKworICAgICAgdm9pZAorICAgICAgdmFsdWVfc3dhcChQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICBub2RlX3BvaW50ZXIKKyAgICAgIHJlY3Vyc2l2ZV9jb3B5X25vZGUobm9kZV9jb25zdF9wb2ludGVyKTsKKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBpbml0aWFsaXplKCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBhcHBseV91cGRhdGUobm9kZV9wb2ludGVyLCBudWxsX25vZGVfdXBkYXRlX3BvaW50ZXIpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX1VwZGF0ZV8+CisgICAgICBpbmxpbmUgdm9pZAorICAgICAgYXBwbHlfdXBkYXRlKG5vZGVfcG9pbnRlciwgTm9kZV9VcGRhdGVfKik7CisKKyAgICAgIGJvb2wKKyAgICAgIGpvaW5fcHJlcChQQl9EU19DTEFTU19DX0RFQyYsIGJyYW5jaF9iYWcmKTsKKworICAgICAgdm9pZAorICAgICAgcmVjX2pvaW5fcHJlcChub2RlX2NvbnN0X3BvaW50ZXIsIG5vZGVfY29uc3RfcG9pbnRlciwgYnJhbmNoX2JhZyYpOworCisgICAgICB2b2lkCisgICAgICByZWNfam9pbl9wcmVwKGxlYWZfY29uc3RfcG9pbnRlciwgbGVhZl9jb25zdF9wb2ludGVyLCBicmFuY2hfYmFnJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHJlY19qb2luX3ByZXAobGVhZl9jb25zdF9wb2ludGVyLCBpbm9kZV9jb25zdF9wb2ludGVyLCBicmFuY2hfYmFnJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHJlY19qb2luX3ByZXAoaW5vZGVfY29uc3RfcG9pbnRlciwgbGVhZl9jb25zdF9wb2ludGVyLCBicmFuY2hfYmFnJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHJlY19qb2luX3ByZXAoaW5vZGVfY29uc3RfcG9pbnRlciwgaW5vZGVfY29uc3RfcG9pbnRlciwgYnJhbmNoX2JhZyYpOworCisgICAgICBub2RlX3BvaW50ZXIKKyAgICAgIHJlY19qb2luKG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyLCBzaXplX3R5cGUsIGJyYW5jaF9iYWcmKTsKKworICAgICAgbm9kZV9wb2ludGVyCisgICAgICByZWNfam9pbihsZWFmX3BvaW50ZXIsIGxlYWZfcG9pbnRlciwgYnJhbmNoX2JhZyYpOworCisgICAgICBub2RlX3BvaW50ZXIKKyAgICAgIHJlY19qb2luKGxlYWZfcG9pbnRlciwgaW5vZGVfcG9pbnRlciwgc2l6ZV90eXBlLCBicmFuY2hfYmFnJik7CisKKyAgICAgIG5vZGVfcG9pbnRlcgorICAgICAgcmVjX2pvaW4oaW5vZGVfcG9pbnRlciwgbGVhZl9wb2ludGVyLCBzaXplX3R5cGUsIGJyYW5jaF9iYWcmKTsKKworICAgICAgbm9kZV9wb2ludGVyCisgICAgICByZWNfam9pbihpbm9kZV9wb2ludGVyLCBpbm9kZV9wb2ludGVyLCBicmFuY2hfYmFnJik7CisKKyAgICAgIHNpemVfdHlwZQorICAgICAga2V5c19kaWZmX2luZCh0eXBlbmFtZSBhY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciwKKwkJICAgIHR5cGVuYW1lIGFjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yLAorCQkgICAgdHlwZW5hbWUgYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IsCisJCSAgICB0eXBlbmFtZSBhY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvcik7CisKKyAgICAgIGlub2RlX3BvaW50ZXIKKyAgICAgIGluc2VydF9icmFuY2gobm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIsIGJyYW5jaF9iYWcmKTsKKworICAgICAgdm9pZAorICAgICAgdXBkYXRlX21pbl9tYXhfZm9yX2luc2VydGVkX2xlYWYobGVhZl9wb2ludGVyKTsKKworICAgICAgdm9pZAorICAgICAgZXJhc2VfbGVhZihsZWFmX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgYWN0dWFsX2VyYXNlX2xlYWYobGVhZl9wb2ludGVyKTsKKworICAgICAgdm9pZAorICAgICAgY2xlYXJfaW1wKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlX2ZpeHVwKGlub2RlX3BvaW50ZXIpOworCisgICAgICB2b2lkCisgICAgICB1cGRhdGVfbWluX21heF9mb3JfZXJhc2VkX2xlYWYobGVhZl9wb2ludGVyKTsKKworICAgICAgc3RhdGljIGlubGluZSBhX2NvbnN0X2l0ZXJhdG9yCisgICAgICBwcmVmX2JlZ2luKG5vZGVfY29uc3RfcG9pbnRlcik7CisKKyAgICAgIHN0YXRpYyBpbmxpbmUgYV9jb25zdF9pdGVyYXRvcgorICAgICAgcHJlZl9lbmQobm9kZV9jb25zdF9wb2ludGVyKTsKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgZmluZF9pbXAoa2V5X2NvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBub2RlX3BvaW50ZXIKKyAgICAgIGxvd2VyX2JvdW5kX2ltcChrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgdXBwZXJfYm91bmRfaW1wKGtleV9jb25zdF9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgc3RhdGljIGxlYWZfY29uc3RfcG9pbnRlcgorICAgICAgbGVmdG1vc3RfZGVzY2VuZGFudChub2RlX2NvbnN0X3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgc3RhdGljIGxlYWZfcG9pbnRlcgorICAgICAgbGVmdG1vc3RfZGVzY2VuZGFudChub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgc3RhdGljIGxlYWZfY29uc3RfcG9pbnRlcgorICAgICAgcmlnaHRtb3N0X2Rlc2NlbmRhbnQobm9kZV9jb25zdF9wb2ludGVyKTsKKworICAgICAgaW5saW5lIHN0YXRpYyBsZWFmX3BvaW50ZXIKKyAgICAgIHJpZ2h0bW9zdF9kZXNjZW5kYW50KG5vZGVfcG9pbnRlcik7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfaXRlcmF0b3JzKGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfcmV2ZXJzZV9pdGVyYXRvcnMoY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHN0YXRpYyBzaXplX3R5cGUKKyAgICAgIHJlY3Vyc2l2ZV9jb3VudF9sZWFmcyhub2RlX2NvbnN0X3BvaW50ZXIsIGNvbnN0IGNoYXIqLCBpbnQpOworI2VuZGlmCisKKyNpZmRlZiBQQl9EU19QQVRfVFJJRV9UUkFDRV8KKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICB0cmFjZV9ub2RlKG5vZGVfY29uc3RfcG9pbnRlciwgc2l6ZV90eXBlKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWV0YWRhdGFfPgorICAgICAgc3RhdGljIHZvaWQKKyAgICAgIHRyYWNlX25vZGVfbWV0YWRhdGEobm9kZV9jb25zdF9wb2ludGVyLCB0eXBlX3RvX3R5cGU8TWV0YWRhdGFfPik7CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICB0cmFjZV9ub2RlX21ldGFkYXRhKG5vZGVfY29uc3RfcG9pbnRlciwgdHlwZV90b190eXBlPG51bGxfdHlwZT4pOworI2VuZGlmCisKKyAgICAgIGxlYWZfcG9pbnRlcgorICAgICAgc3BsaXRfcHJlcChrZXlfY29uc3RfcmVmZXJlbmNlLCBQQl9EU19DTEFTU19DX0RFQyYsIGJyYW5jaF9iYWcmKTsKKworICAgICAgbm9kZV9wb2ludGVyCisgICAgICByZWNfc3BsaXQobm9kZV9wb2ludGVyLCBhX2NvbnN0X2l0ZXJhdG9yLCBhX2NvbnN0X2l0ZXJhdG9yLAorCQlQQl9EU19DTEFTU19DX0RFQyYsIGJyYW5jaF9iYWcmKTsKKworICAgICAgdm9pZAorICAgICAgc3BsaXRfaW5zZXJ0X2JyYW5jaChzaXplX3R5cGUsIGFfY29uc3RfaXRlcmF0b3IsIGlub2RlX2l0ZXJhdG9yLAorCQkJICBzaXplX3R5cGUsIGJyYW5jaF9iYWcmKTsKKworICAgICAgc3RhdGljIGhlYWRfYWxsb2NhdG9yIAkJc19oZWFkX2FsbG9jYXRvcjsKKyAgICAgIHN0YXRpYyBpbm9kZV9hbGxvY2F0b3IgCQlzX2lub2RlX2FsbG9jYXRvcjsKKyAgICAgIHN0YXRpYyBsZWFmX2FsbG9jYXRvciAJCXNfbGVhZl9hbGxvY2F0b3I7CisKKyAgICAgIGhlYWRfcG9pbnRlciAJCQltX3BfaGVhZDsKKyAgICAgIHNpemVfdHlwZSAJCQltX3NpemU7CisgICAgfTsKKworI2RlZmluZSBQQl9EU19BU1NFUlRfTk9ERV9WQUxJRChYKSBcCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoWC0+YXNzZXJ0X3ZhbGlkKHRoaXMsIF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCisjZGVmaW5lIFBCX0RTX1JFQ1VSU0lWRV9DT1VOVF9MRUFGUyhYKSBcCisgIHJlY3Vyc2l2ZV9jb3VudF9sZWFmcyhYLCBfX0ZJTEVfXywgX19MSU5FX18pCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9pdGVyYXRvcnNfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vaW5zZXJ0X2pvaW5fZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vZXJhc2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vZmluZF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9pbmZvX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vc3BsaXRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vZGVidWdfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vdHJhY2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vdXBkYXRlX2ZuX2ltcHMuaHBwPgorCisjdW5kZWYgUEJfRFNfUkVDVVJTSVZFX0NPVU5UX0xFQUZTCisjdW5kZWYgUEJfRFNfQVNTRVJUX05PREVfVkFMSUQKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfUEFUX1RSSUVfTkFNRQorI3VuZGVmIFBCX0RTX1BBVF9UUklFX1RSQUlUU19CQVNFCisjdW5kZWYgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3BhdF90cmllX2Jhc2UuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9wYXRfdHJpZV9iYXNlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yzg0Y2EzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9wYXRfdHJpZV9iYXNlLmhwcApAQCAtMCwwICsxLDEzNjEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcGF0X3RyaWVfL3BhdF90cmllX2Jhc2UuaHBwCisgKiBDb250YWlucyB0aGUgYmFzZSBjbGFzcyBmb3IgYSBwYXRyaWNpYSB0cmVlLgorICovCisKKyNpZm5kZWYgUEJfRFNfUEFUX1RSSUVfQkFTRQorI2RlZmluZSBQQl9EU19QQVRfVFJJRV9CQVNFCisKKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gQmFzZSB0eXBlIGZvciBQQVRSSUNJQSB0cmVlcy4KKyAgICBzdHJ1Y3QgcGF0X3RyaWVfYmFzZQorICAgIHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGhyZWUgdHlwZXMgb2Ygbm9kZXMuCisgICAgICAgKgorICAgICAgICogIGlfbm9kZSBpcyB1c2VkIGJ5IF9Jbm9kZSwgbGVhZl9ub2RlIGJ5IF9MZWFmLCBhbmQgaGVhZF9ub2RlIGJ5IF9IZWFkLgorICAgICAgICovCisgICAgICBlbnVtIG5vZGVfdHlwZQorCXsKKwkgIGlfbm9kZSwKKwkgIGxlYWZfbm9kZSwKKwkgIGhlYWRfbm9kZQorCX07CisKKyAgICAgIC8vLyBNZXRhZGF0YSBiYXNlIHByaW1hcnkgdGVtcGxhdGUuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNZXRhZGF0YSwgdHlwZW5hbWUgX0FsbG9jPgorCXN0cnVjdCBfTWV0YWRhdGEKKwl7CisJICB0eXBlZGVmIE1ldGFkYXRhICAgICAJCQkJCW1ldGFkYXRhX3R5cGU7CisJICB0eXBlZGVmIF9BbGxvYyAgICAgCQkJCQlhbGxvY2F0b3JfdHlwZTsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8TWV0YWRhdGE+CV9fcmViaW5kX207CisJICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX206Om90aGVyOjpjb25zdF9yZWZlcmVuY2UgIGNvbnN0X3JlZmVyZW5jZTsKKworCSAgY29uc3RfcmVmZXJlbmNlCisJICBnZXRfbWV0YWRhdGEoKSBjb25zdAorCSAgeyByZXR1cm4gbV9tZXRhZGF0YTsgfQorCisJICBtZXRhZGF0YV90eXBlIAkJCQkJbV9tZXRhZGF0YTsKKwl9OworCisgICAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIG51bGwgbWV0YWRhdGEuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisJc3RydWN0IF9NZXRhZGF0YTxudWxsX3R5cGUsIF9BbGxvYz4KKwl7CisJICB0eXBlZGVmIG51bGxfdHlwZSAJCQkJCW1ldGFkYXRhX3R5cGU7CisJICB0eXBlZGVmIF9BbGxvYyAgICAgCQkJCQlhbGxvY2F0b3JfdHlwZTsKKwl9OworCisKKyAgICAgIC8vLyBOb2RlIGJhc2UuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQVRyYWl0cywgdHlwZW5hbWUgTWV0YWRhdGE+CisgICAgICBzdHJ1Y3QgX05vZGVfYmFzZQorICAgICAgOiBwdWJsaWMgTWV0YWRhdGEKKyAgICAgIHsKKyAgICAgIHByaXZhdGU6CisJdHlwZWRlZiB0eXBlbmFtZSBNZXRhZGF0YTo6YWxsb2NhdG9yX3R5cGUJCV9BbGxvYzsKKworICAgICAgcHVibGljOgorCXR5cGVkZWYgX0FsbG9jCQkJCQkJYWxsb2NhdG9yX3R5cGU7CisJdHlwZWRlZiBfQVRyYWl0cwkJCQkJYWNjZXNzX3RyYWl0czsKKwl0eXBlZGVmIHR5cGVuYW1lIF9BVHJhaXRzOjp0eXBlX3RyYWl0cwkJCXR5cGVfdHJhaXRzOworCXR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X05vZGVfYmFzZT4JX19yZWJpbmRfbjsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX246Om90aGVyOjpwb2ludGVyIAkJbm9kZV9wb2ludGVyOworCisJbm9kZV9wb2ludGVyIAkJCQkJCW1fcF9wYXJlbnQ7CisJY29uc3Qgbm9kZV90eXBlIAkgICAgICAgCQkJCW1fdHlwZTsKKworCV9Ob2RlX2Jhc2Uobm9kZV90eXBlIHR5cGUpIDogbV90eXBlKHR5cGUpCisJeyB9CisKKwl0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9BVHJhaXRzPiAgICBfX3JlYmluZF9hdDsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2F0OjpvdGhlcjo6Y29uc3RfcG9pbnRlciAgICBhX2NvbnN0X3BvaW50ZXI7CisJdHlwZWRlZiB0eXBlbmFtZSBfQVRyYWl0czo6Y29uc3RfaXRlcmF0b3IJICAgICAgYV9jb25zdF9pdGVyYXRvcjsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisJdHlwZWRlZiBzdGQ6OnBhaXI8YV9jb25zdF9pdGVyYXRvciwgYV9jb25zdF9pdGVyYXRvcj4gbm9kZV9kZWJ1Z19pbmZvOworCisJdm9pZAorCWFzc2VydF92YWxpZChhX2NvbnN0X3BvaW50ZXIgcF90cmFpdHMsCisJCSAgICAgY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAorCXsgYXNzZXJ0X3ZhbGlkX2ltcChwX3RyYWl0cywgX19maWxlLCBfX2xpbmUpOyB9CisKKwl2aXJ0dWFsIG5vZGVfZGVidWdfaW5mbworCWFzc2VydF92YWxpZF9pbXAoYV9jb25zdF9wb2ludGVyLCBjb25zdCBjaGFyKiwgaW50KSBjb25zdCA9IDA7CisjZW5kaWYKKyAgICAgIH07CisKKworICAgIC8vLyBIZWFkIG5vZGUgZm9yIFBBVFJJQ0lBIHRyZWUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FUcmFpdHMsIHR5cGVuYW1lIE1ldGFkYXRhPgorICAgIHN0cnVjdCBfSGVhZAorICAgIDogcHVibGljIF9Ob2RlX2Jhc2U8X0FUcmFpdHMsIE1ldGFkYXRhPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX05vZGVfYmFzZTxfQVRyYWl0cywgTWV0YWRhdGE+IAkJCWJhc2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjp0eXBlX3RyYWl0cwkJCXR5cGVfdHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om5vZGVfcG9pbnRlcgkJCW5vZGVfcG9pbnRlcjsKKworICAgICAgbm9kZV9wb2ludGVyCQkJCQkJbV9wX21pbjsKKyAgICAgIG5vZGVfcG9pbnRlcgkJCQkJCW1fcF9tYXg7CisKKyAgICAgIF9IZWFkKCkgOiBiYXNlX3R5cGUoaGVhZF9ub2RlKSB7IH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bm9kZV9kZWJ1Z19pbmZvICAgICAgCSAgICAgICBub2RlX2RlYnVnX2luZm87CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6YV9jb25zdF9wb2ludGVyIAkgICAgICAgYV9jb25zdF9wb2ludGVyOworCisgICAgICB2aXJ0dWFsIG5vZGVfZGVidWdfaW5mbworICAgICAgYXNzZXJ0X3ZhbGlkX2ltcChhX2NvbnN0X3BvaW50ZXIsIGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRllfQVQoZmFsc2UsCisJCQkJIF9NX21lc3NhZ2UoIkFzc2VydGlvbiBmcm9tICUxOzolMjsiKQorCQkJCSAuX01fc3RyaW5nKF9fRklMRV9fKS5fTV9pbnRlZ2VyKF9fTElORV9fKSwKKwkJCQkgX19maWxlLCBfX2xpbmUpOworCXJldHVybiBub2RlX2RlYnVnX2luZm8oKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH07CisKKworICAgIC8vLyBMZWFmIG5vZGUgZm9yIFBBVFJJQ0lBIHRyZWUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FUcmFpdHMsIHR5cGVuYW1lIE1ldGFkYXRhPgorICAgIHN0cnVjdCBfTGVhZgorICAgIDogcHVibGljIF9Ob2RlX2Jhc2U8X0FUcmFpdHMsIE1ldGFkYXRhPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX05vZGVfYmFzZTxfQVRyYWl0cywgTWV0YWRhdGE+IAkgICAJICAgIAliYXNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6dHlwZV90cmFpdHMJCQl0eXBlX3RyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHlwZV90cmFpdHM6OnZhbHVlX3R5cGUJCQl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0eXBlX3RyYWl0czo6cmVmZXJlbmNlCQkJcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0eXBlX3RyYWl0czo6Y29uc3RfcmVmZXJlbmNlICAgIAkJY29uc3RfcmVmZXJlbmNlOworCisgICAgcHJpdmF0ZToKKyAgICAgIHZhbHVlX3R5cGUJCQkJCQltX3ZhbHVlOworCisgICAgICBfTGVhZihjb25zdCBfTGVhZiYpOworCisgICAgcHVibGljOgorICAgICAgX0xlYWYoY29uc3RfcmVmZXJlbmNlIG90aGVyKQorICAgICAgOiBiYXNlX3R5cGUobGVhZl9ub2RlKSwgbV92YWx1ZShvdGhlcikgeyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgdmFsdWUoKQorICAgICAgeyByZXR1cm4gbV92YWx1ZTsgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIHZhbHVlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fdmFsdWU7IH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bm9kZV9kZWJ1Z19pbmZvICAgICAgCQlub2RlX2RlYnVnX2luZm87CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6YV9jb25zdF9wb2ludGVyICAgICAgCQlhX2NvbnN0X3BvaW50ZXI7CisKKyAgICAgIHZpcnR1YWwgbm9kZV9kZWJ1Z19pbmZvCisgICAgICBhc3NlcnRfdmFsaWRfaW1wKGFfY29uc3RfcG9pbnRlciBwX3RyYWl0cywKKwkJICAgICAgIGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKKyAgICAgIHsKKwlQQl9EU19ERUJVR19WRVJJRlkoYmFzZV90eXBlOjptX3R5cGUgPT0gbGVhZl9ub2RlKTsKKwlub2RlX2RlYnVnX2luZm8gcmV0OworCWNvbnN0X3JlZmVyZW5jZSByX3ZhbCA9IHZhbHVlKCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHBfdHJhaXRzLT5iZWdpbihwX3RyYWl0cy0+ZXh0cmFjdF9rZXkocl92YWwpKSwKKwkJCSAgICAgIHBfdHJhaXRzLT5lbmQocF90cmFpdHMtPmV4dHJhY3Rfa2V5KHJfdmFsKSkpOworICAgICAgfQorCisgICAgICB2aXJ0dWFsCisgICAgICB+X0xlYWYoKSB7IH0KKyNlbmRpZgorICAgIH07CisKKworICAgIC8vLyBJbnRlcm5hbCBub2RlIHR5cGUsIFBBVFJJQ0lBIHRyZWUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FUcmFpdHMsIHR5cGVuYW1lIE1ldGFkYXRhPgorICAgIHN0cnVjdCBfSW5vZGUKKyAgICA6IHB1YmxpYyBfTm9kZV9iYXNlPF9BVHJhaXRzLCBNZXRhZGF0YT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9Ob2RlX2Jhc2U8X0FUcmFpdHMsIE1ldGFkYXRhPiAJCQliYXNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6dHlwZV90cmFpdHMJCQl0eXBlX3RyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjphY2Nlc3NfdHJhaXRzCSAgICAgICAJCWFjY2Vzc190cmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHR5cGVfdHJhaXRzOjp2YWx1ZV90eXBlIAkJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6YWxsb2NhdG9yX3R5cGUJCV9BbGxvYzsKKyAgICAgIHR5cGVkZWYgX0FsbG9jCQkJCQkJYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIAkJCXNpemVfdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6YV9jb25zdF9wb2ludGVyICAgICAgCSAgICAgICBhX2NvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6YV9jb25zdF9pdGVyYXRvciAgICAgCSAgICAgIGFfY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlX3BvaW50ZXIJCQlub2RlX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPGJhc2VfdHlwZT4JX19yZWJpbmRfbjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIgICAgICBub2RlX2NvbnN0X3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgX0xlYWY8X0FUcmFpdHMsIE1ldGFkYXRhPgkgCQkJbGVhZjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8bGVhZj46Om90aGVyIAlfX3JlYmluZF9sOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9sOjpwb2ludGVyIAkJCWxlYWZfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbDo6Y29uc3RfcG9pbnRlciAJICAgIGxlYWZfY29uc3RfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfSW5vZGU+OjpvdGhlciAJX19yZWJpbmRfaW47CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2luOjpwb2ludGVyIAkJCWlub2RlX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2luOjpjb25zdF9wb2ludGVyIAkgICAgaW5vZGVfY29uc3RfcG9pbnRlcjsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgZ2V0X3ByZWZfcG9zKGFfY29uc3RfaXRlcmF0b3IsIGFfY29uc3RfaXRlcmF0b3IsIGFfY29uc3RfcG9pbnRlcikgY29uc3Q7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPG5vZGVfcG9pbnRlcj46Om90aGVyIF9fcmViaW5kX25wOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9ucDo6cG9pbnRlciAJCW5vZGVfcG9pbnRlcl9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9ucDo6cmVmZXJlbmNlIAkJbm9kZV9wb2ludGVyX3JlZmVyZW5jZTsKKworICAgICAgZW51bQorCXsKKwkgIGFycl9zaXplID0gX0FUcmFpdHM6Om1heF9zaXplICsgMQorCX07CisgICAgICBQQl9EU19TVEFUSUNfQVNTRVJUKG1pbl9hcnJfc2l6ZSwgYXJyX3NpemUgPj0gMik7CisKKworICAgICAgLy8vIENvbnN0YW50IGNoaWxkIGl0ZXJhdG9yLgorICAgICAgc3RydWN0IGNvbnN0X2l0ZXJhdG9yCisgICAgICB7CisJbm9kZV9wb2ludGVyX3BvaW50ZXIgCQkJCW1fcF9wX2N1cjsKKwlub2RlX3BvaW50ZXJfcG9pbnRlciAJCQkJbV9wX3BfZW5kOworCisJdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnIAkJaXRlcmF0b3JfY2F0ZWdvcnk7CisJdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmRpZmZlcmVuY2VfdHlwZSAJZGlmZmVyZW5jZV90eXBlOworCXR5cGVkZWYgbm9kZV9wb2ludGVyIAkJCQl2YWx1ZV90eXBlOworCXR5cGVkZWYgbm9kZV9wb2ludGVyX3BvaW50ZXIgCQkJcG9pbnRlcjsKKwl0eXBlZGVmIG5vZGVfcG9pbnRlcl9yZWZlcmVuY2UgCQkJcmVmZXJlbmNlOworCisJY29uc3RfaXRlcmF0b3Iobm9kZV9wb2ludGVyX3BvaW50ZXIgcF9wX2N1ciA9IDAsCisJCSAgICAgICBub2RlX3BvaW50ZXJfcG9pbnRlciBwX3BfZW5kID0gMCkKKwk6IG1fcF9wX2N1cihwX3BfY3VyKSwgbV9wX3BfZW5kKHBfcF9lbmQpCisJeyB9CisKKwlib29sCisJb3BlcmF0b3I9PShjb25zdCBjb25zdF9pdGVyYXRvciYgb3RoZXIpIGNvbnN0CisJeyByZXR1cm4gbV9wX3BfY3VyID09IG90aGVyLm1fcF9wX2N1cjsgfQorCisJYm9vbAorCW9wZXJhdG9yIT0oY29uc3QgY29uc3RfaXRlcmF0b3ImIG90aGVyKSBjb25zdAorCXsgcmV0dXJuIG1fcF9wX2N1ciAhPSBvdGhlci5tX3BfcF9jdXI7IH0KKworCWNvbnN0X2l0ZXJhdG9yJgorCW9wZXJhdG9yKysoKQorCXsKKwkgIGRvCisJICAgICsrbV9wX3BfY3VyOworCSAgd2hpbGUgKG1fcF9wX2N1ciAhPSBtX3BfcF9lbmQgJiYgKm1fcF9wX2N1ciA9PSAwKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKwljb25zdF9pdGVyYXRvcgorCW9wZXJhdG9yKysoaW50KQorCXsKKwkgIGNvbnN0X2l0ZXJhdG9yIHJldF9pdCgqdGhpcyk7CisJICBvcGVyYXRvcisrKCk7CisJICByZXR1cm4gcmV0X2l0OworCX0KKworCWNvbnN0IG5vZGVfcG9pbnRlcl9wb2ludGVyCisJb3BlcmF0b3ItPigpIGNvbnN0CisJeworCSAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfcmVmZXJlbmNpYmxlKCk7KQorCSAgcmV0dXJuIG1fcF9wX2N1cjsKKwl9CisKKwlub2RlX2NvbnN0X3BvaW50ZXIKKwlvcGVyYXRvciooKSBjb25zdAorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3JlZmVyZW5jaWJsZSgpOykKKwkgIHJldHVybiAqbV9wX3BfY3VyOworCX0KKworICAgICAgcHJvdGVjdGVkOgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisJdm9pZAorCWFzc2VydF9yZWZlcmVuY2libGUoKSBjb25zdAorCXsgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9wX2N1ciAhPSBtX3BfcF9lbmQgJiYgKm1fcF9wX2N1ciAhPSAwKTsgfQorI2VuZGlmCisgICAgICB9OworCisKKyAgICAgIC8vLyBDaGlsZCBpdGVyYXRvci4KKyAgICAgIHN0cnVjdCBpdGVyYXRvciA6IHB1YmxpYyBjb25zdF9pdGVyYXRvcgorICAgICAgeworICAgICAgcHVibGljOgorCXR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyAJCWl0ZXJhdG9yX2NhdGVnb3J5OworCXR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpkaWZmZXJlbmNlX3R5cGUgCWRpZmZlcmVuY2VfdHlwZTsKKwl0eXBlZGVmIG5vZGVfcG9pbnRlciAJCQkJdmFsdWVfdHlwZTsKKwl0eXBlZGVmIG5vZGVfcG9pbnRlcl9wb2ludGVyIAkJCXBvaW50ZXI7CisJdHlwZWRlZiBub2RlX3BvaW50ZXJfcmVmZXJlbmNlIAkJCXJlZmVyZW5jZTsKKworCWlubGluZQorCWl0ZXJhdG9yKG5vZGVfcG9pbnRlcl9wb2ludGVyIHBfcF9jdXIgPSAwLAorCQkgbm9kZV9wb2ludGVyX3BvaW50ZXIgcF9wX2VuZCA9IDApCisJOiBjb25zdF9pdGVyYXRvcihwX3BfY3VyLCBwX3BfZW5kKSB7IH0KKworCWJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKKwl7IHJldHVybiBjb25zdF9pdGVyYXRvcjo6bV9wX3BfY3VyID09IG90aGVyLm1fcF9wX2N1cjsgfQorCisJYm9vbAorCW9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorCXsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yOjptX3BfcF9jdXIgIT0gb3RoZXIubV9wX3BfY3VyOyB9CisKKwlpdGVyYXRvciYKKwlvcGVyYXRvcisrKCkKKwl7CisJICBjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3IrKygpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworCWl0ZXJhdG9yCisJb3BlcmF0b3IrKyhpbnQpCisJeworCSAgaXRlcmF0b3IgcmV0X2l0KCp0aGlzKTsKKwkgIG9wZXJhdG9yKysoKTsKKwkgIHJldHVybiByZXRfaXQ7CisJfQorCisJbm9kZV9wb2ludGVyX3BvaW50ZXIKKwlvcGVyYXRvci0+KCkKKwl7CisJICBfR0xJQkNYWF9ERUJVR19PTkxZKGNvbnN0X2l0ZXJhdG9yOjphc3NlcnRfcmVmZXJlbmNpYmxlKCk7KQorCSAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yOjptX3BfcF9jdXI7CisJfQorCisJbm9kZV9wb2ludGVyCisJb3BlcmF0b3IqKCkKKwl7CisJICBfR0xJQkNYWF9ERUJVR19PTkxZKGNvbnN0X2l0ZXJhdG9yOjphc3NlcnRfcmVmZXJlbmNpYmxlKCk7KQorCSAgcmV0dXJuICpjb25zdF9pdGVyYXRvcjo6bV9wX3BfY3VyOworCX0KKyAgICAgIH07CisKKworICAgICAgX0lub2RlKHNpemVfdHlwZSwgY29uc3QgYV9jb25zdF9pdGVyYXRvcik7CisKKyAgICAgIHZvaWQKKyAgICAgIHVwZGF0ZV9wcmVmaXhlcyhhX2NvbnN0X3BvaW50ZXIpOworCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdDsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCk7CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdDsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpOworCisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICBnZXRfY2hpbGRfbm9kZShhX2NvbnN0X2l0ZXJhdG9yLCBhX2NvbnN0X2l0ZXJhdG9yLCBhX2NvbnN0X3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgbm9kZV9jb25zdF9wb2ludGVyCisgICAgICBnZXRfY2hpbGRfbm9kZShhX2NvbnN0X2l0ZXJhdG9yLCBhX2NvbnN0X2l0ZXJhdG9yLCBhX2NvbnN0X3BvaW50ZXIpIGNvbnN0OworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGdldF9jaGlsZF9pdChhX2NvbnN0X2l0ZXJhdG9yLCBhX2NvbnN0X2l0ZXJhdG9yLCBhX2NvbnN0X3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICBnZXRfbG93ZXJfYm91bmRfY2hpbGRfbm9kZShhX2NvbnN0X2l0ZXJhdG9yLCBhX2NvbnN0X2l0ZXJhdG9yLAorCQkJCSBzaXplX3R5cGUsIGFfY29uc3RfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSBub2RlX3BvaW50ZXIKKyAgICAgIGFkZF9jaGlsZChub2RlX3BvaW50ZXIsIGFfY29uc3RfaXRlcmF0b3IsIGFfY29uc3RfaXRlcmF0b3IsCisJCWFfY29uc3RfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSBub2RlX2NvbnN0X3BvaW50ZXIKKyAgICAgIGdldF9qb2luX2NoaWxkKG5vZGVfY29uc3RfcG9pbnRlciwgYV9jb25zdF9wb2ludGVyKSBjb25zdDsKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgZ2V0X2pvaW5fY2hpbGQobm9kZV9wb2ludGVyLCBhX2NvbnN0X3BvaW50ZXIpOworCisgICAgICB2b2lkCisgICAgICByZW1vdmVfY2hpbGQobm9kZV9wb2ludGVyKTsKKworICAgICAgdm9pZAorICAgICAgcmVtb3ZlX2NoaWxkKGl0ZXJhdG9yKTsKKworICAgICAgdm9pZAorICAgICAgcmVwbGFjZV9jaGlsZChub2RlX3BvaW50ZXIsIGFfY29uc3RfaXRlcmF0b3IsIGFfY29uc3RfaXRlcmF0b3IsCisJCSAgICBhX2NvbnN0X3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgYV9jb25zdF9pdGVyYXRvcgorICAgICAgcHJlZl9iX2l0KCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBhX2NvbnN0X2l0ZXJhdG9yCisgICAgICBwcmVmX2VfaXQoKSBjb25zdDsKKworICAgICAgYm9vbAorICAgICAgc2hvdWxkX2JlX21pbmUoYV9jb25zdF9pdGVyYXRvciwgYV9jb25zdF9pdGVyYXRvciwgc2l6ZV90eXBlLAorCQkgICAgIGFfY29uc3RfcG9pbnRlcikgY29uc3Q7CisKKyAgICAgIGxlYWZfcG9pbnRlcgorICAgICAgbGVmdG1vc3RfZGVzY2VuZGFudCgpOworCisgICAgICBsZWFmX2NvbnN0X3BvaW50ZXIKKyAgICAgIGxlZnRtb3N0X2Rlc2NlbmRhbnQoKSBjb25zdDsKKworICAgICAgbGVhZl9wb2ludGVyCisgICAgICByaWdodG1vc3RfZGVzY2VuZGFudCgpOworCisgICAgICBsZWFmX2NvbnN0X3BvaW50ZXIKKyAgICAgIHJpZ2h0bW9zdF9kZXNjZW5kYW50KCkgY29uc3Q7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om5vZGVfZGVidWdfaW5mbyAJICAgICAgIG5vZGVfZGVidWdfaW5mbzsKKworICAgICAgdmlydHVhbCBub2RlX2RlYnVnX2luZm8KKyAgICAgIGFzc2VydF92YWxpZF9pbXAoYV9jb25zdF9wb2ludGVyLCBjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKyNlbmRpZgorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGdldF9lX2luZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBtX2VfaW5kOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX0lub2RlKGNvbnN0IF9Jbm9kZSYpOworCisgICAgICBzaXplX3R5cGUKKyAgICAgIGdldF9iZWdpbl9wb3MoKSBjb25zdDsKKworICAgICAgc3RhdGljIF9fcmViaW5kX2wJCQlzX2xlYWZfYWxsb2M7CisgICAgICBzdGF0aWMgX19yZWJpbmRfaW4gCQlzX2lub2RlX2FsbG9jOworCisgICAgICBjb25zdCBzaXplX3R5cGUgCQkJbV9lX2luZDsKKyAgICAgIGFfY29uc3RfaXRlcmF0b3IgCQkJbV9wcmVmX2JfaXQ7CisgICAgICBhX2NvbnN0X2l0ZXJhdG9yIAkJCW1fcHJlZl9lX2l0OworICAgICAgbm9kZV9wb2ludGVyIAkJCW1fYV9wX2NoaWxkcmVuW2Fycl9zaXplXTsKKyAgICB9OworCisjZGVmaW5lIFBCX0RTX0NPTlNUX0lUX0NfREVDIFwKKyAgICBfQ0l0ZXI8Tm9kZSwgTGVhZiwgSGVhZCwgSW5vZGUsIElzX0ZvcndhcmRfSXRlcmF0b3I+CisKKyNkZWZpbmUgUEJfRFNfQ09OU1RfT0RJUl9JVF9DX0RFQyBcCisgICAgX0NJdGVyPE5vZGUsIExlYWYsIEhlYWQsIElub2RlLCAhSXNfRm9yd2FyZF9JdGVyYXRvcj4KKworI2RlZmluZSBQQl9EU19JVF9DX0RFQyBcCisgICAgX0l0ZXI8Tm9kZSwgTGVhZiwgSGVhZCwgSW5vZGUsIElzX0ZvcndhcmRfSXRlcmF0b3I+CisKKyNkZWZpbmUgUEJfRFNfT0RJUl9JVF9DX0RFQyBcCisgICAgX0l0ZXI8Tm9kZSwgTGVhZiwgSGVhZCwgSW5vZGUsICFJc19Gb3J3YXJkX0l0ZXJhdG9yPgorCisKKyAgICAvLy8gQ29uc3QgaXRlcmF0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZSwgdHlwZW5hbWUgTGVhZiwgdHlwZW5hbWUgSGVhZCwgdHlwZW5hbWUgSW5vZGUsCisJICAgICBib29sIElzX0ZvcndhcmRfSXRlcmF0b3I+CisgICAgY2xhc3MgX0NJdGVyCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFRoZXNlIHR5cGVzIGFyZSBhbGwgdGhlIHNhbWUgZm9yIHRoZSBmaXJzdCBmb3VyIHRlbXBsYXRlIGFyZ3VtZW50cy4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgTm9kZTo6YWxsb2NhdG9yX3R5cGUJCWFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBOb2RlOjp0eXBlX3RyYWl0cwkJdHlwZV90cmFpdHM7CisKKyAgICAgIHR5cGVkZWYgc3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAJCWl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6ZGlmZmVyZW5jZV90eXBlCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHlwZV90cmFpdHM6OnZhbHVlX3R5cGUJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHR5cGVfdHJhaXRzOjpwb2ludGVyIAkJcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHlwZV90cmFpdHM6OnJlZmVyZW5jZSAJCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHlwZV90cmFpdHM6OmNvbnN0X3BvaW50ZXIgCWNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHR5cGVfdHJhaXRzOjpjb25zdF9yZWZlcmVuY2UgCWNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHlwZQkJCQlfQWxsb2M7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPE5vZGU+CV9fcmViaW5kX247CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX246Om90aGVyOjpwb2ludGVyCW5vZGVfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8TGVhZj4JX19yZWJpbmRfbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbDo6b3RoZXI6OnBvaW50ZXIJbGVhZl9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9sOjpvdGhlcjo6Y29uc3RfcG9pbnRlcglsZWFmX2NvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPEhlYWQ+CV9fcmViaW5kX2g7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2g6Om90aGVyOjpwb2ludGVyCWhlYWRfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxJbm9kZT4gX19yZWJpbmRfaW47CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2luOjpvdGhlcjo6cG9pbnRlciAJaW5vZGVfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgSW5vZGU6Oml0ZXJhdG9yCQkJaW5vZGVfaXRlcmF0b3I7CisKKyAgICAgIG5vZGVfcG9pbnRlciAJCQkJCW1fcF9uZDsKKworICAgICAgX0NJdGVyKG5vZGVfcG9pbnRlciBwX25kID0gMCkgOiBtX3BfbmQocF9uZCkKKyAgICAgIHsgfQorCisgICAgICBfQ0l0ZXIoY29uc3QgUEJfRFNfQ09OU1RfT0RJUl9JVF9DX0RFQyYgb3RoZXIpCisgICAgICA6IG1fcF9uZChvdGhlci5tX3BfbmQpCisgICAgICB7IH0KKworICAgICAgX0NJdGVyJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9DSXRlciYgb3RoZXIpCisgICAgICB7CisJbV9wX25kID0gb3RoZXIubV9wX25kOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX0NJdGVyJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IFBCX0RTX0NPTlNUX09ESVJfSVRfQ19ERUMmIG90aGVyKQorICAgICAgeworCW1fcF9uZCA9IG90aGVyLm1fcF9uZDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGNvbnN0X3BvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfbmQtPm1fdHlwZSA9PSBsZWFmX25vZGUpOworCXJldHVybiAmc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihtX3BfbmQpLT52YWx1ZSgpOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9uZC0+bV90eXBlID09IGxlYWZfbm9kZSk7CisJcmV0dXJuIHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4obV9wX25kKS0+dmFsdWUoKTsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBfQ0l0ZXImIG90aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9wX25kID09IG90aGVyLm1fcF9uZDsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IFBCX0RTX0NPTlNUX09ESVJfSVRfQ19ERUMmIG90aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9wX25kID09IG90aGVyLm1fcF9uZDsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IF9DSXRlciYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiBtX3BfbmQgIT0gb3RoZXIubV9wX25kOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgUEJfRFNfQ09OU1RfT0RJUl9JVF9DX0RFQyYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiBtX3BfbmQgIT0gb3RoZXIubV9wX25kOyB9CisKKyAgICAgIF9DSXRlciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCWluYyhpbnRlZ3JhbF9jb25zdGFudDxpbnQsIElzX0ZvcndhcmRfSXRlcmF0b3I+KCkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX0NJdGVyCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlfQ0l0ZXIgcmV0X2l0KG1fcF9uZCk7CisJb3BlcmF0b3IrKygpOworCXJldHVybiByZXRfaXQ7CisgICAgICB9CisKKyAgICAgIF9DSXRlciYKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeworCWRlYyhpbnRlZ3JhbF9jb25zdGFudDxpbnQsIElzX0ZvcndhcmRfSXRlcmF0b3I+KCkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX0NJdGVyCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsKKwlfQ0l0ZXIgcmV0X2l0KG1fcF9uZCk7CisJb3BlcmF0b3ItLSgpOworCXJldHVybiByZXRfaXQ7CisgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2b2lkCisgICAgICBpbmMoZmFsc2VfdHlwZSkKKyAgICAgIHsgZGVjKHRydWVfdHlwZSgpKTsgfQorCisgICAgICB2b2lkCisgICAgICBpbmModHJ1ZV90eXBlKQorICAgICAgeworCWlmIChtX3BfbmQtPm1fdHlwZSA9PSBoZWFkX25vZGUpCisJICB7CisJICAgIG1fcF9uZCA9IHN0YXRpY19jYXN0PGhlYWRfcG9pbnRlcj4obV9wX25kKS0+bV9wX21pbjsKKwkgICAgcmV0dXJuOworCSAgfQorCisJbm9kZV9wb2ludGVyIHBfeSA9IG1fcF9uZC0+bV9wX3BhcmVudDsKKwl3aGlsZSAocF95LT5tX3R5cGUgIT0gaGVhZF9ub2RlICYmIGdldF9sYXJnZXJfc2libGluZyhtX3BfbmQpID09IDApCisJICB7CisJICAgIG1fcF9uZCA9IHBfeTsKKwkgICAgcF95ID0gcF95LT5tX3BfcGFyZW50OworCSAgfQorCisJaWYgKHBfeS0+bV90eXBlID09IGhlYWRfbm9kZSkKKwkgIHsKKwkgICAgbV9wX25kID0gcF95OworCSAgICByZXR1cm47CisJICB9CisJbV9wX25kID0gbGVmdG1vc3RfZGVzY2VuZGFudChnZXRfbGFyZ2VyX3NpYmxpbmcobV9wX25kKSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGRlYyhmYWxzZV90eXBlKQorICAgICAgeyBpbmModHJ1ZV90eXBlKCkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGRlYyh0cnVlX3R5cGUpCisgICAgICB7CisJaWYgKG1fcF9uZC0+bV90eXBlID09IGhlYWRfbm9kZSkKKwkgIHsKKwkgICAgbV9wX25kID0gc3RhdGljX2Nhc3Q8aGVhZF9wb2ludGVyPihtX3BfbmQpLT5tX3BfbWF4OworCSAgICByZXR1cm47CisJICB9CisKKwlub2RlX3BvaW50ZXIgcF95ID0gbV9wX25kLT5tX3BfcGFyZW50OworCXdoaWxlIChwX3ktPm1fdHlwZSAhPSBoZWFkX25vZGUgJiYgZ2V0X3NtYWxsZXJfc2libGluZyhtX3BfbmQpID09IDApCisJICB7CisJICAgIG1fcF9uZCA9IHBfeTsKKwkgICAgcF95ID0gcF95LT5tX3BfcGFyZW50OworCSAgfQorCisJaWYgKHBfeS0+bV90eXBlID09IGhlYWRfbm9kZSkKKwkgIHsKKwkgICAgbV9wX25kID0gcF95OworCSAgICByZXR1cm47CisJICB9CisJbV9wX25kID0gcmlnaHRtb3N0X2Rlc2NlbmRhbnQoZ2V0X3NtYWxsZXJfc2libGluZyhtX3BfbmQpKTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIG5vZGVfcG9pbnRlcgorICAgICAgZ2V0X2xhcmdlcl9zaWJsaW5nKG5vZGVfcG9pbnRlciBwX25kKQorICAgICAgeworCWlub2RlX3BvaW50ZXIgcF9wYXJlbnQgPSBzdGF0aWNfY2FzdDxpbm9kZV9wb2ludGVyPihwX25kLT5tX3BfcGFyZW50KTsKKworCWlub2RlX2l0ZXJhdG9yIGl0ID0gcF9wYXJlbnQtPmJlZ2luKCk7CisJd2hpbGUgKCppdCAhPSBwX25kKQorCSAgKytpdDsKKworCWlub2RlX2l0ZXJhdG9yIG5leHRfaXQgPSBpdDsKKwkrK25leHRfaXQ7CisJcmV0dXJuIChuZXh0X2l0ID09IHBfcGFyZW50LT5lbmQoKSk/IDAgOiAqbmV4dF9pdDsKKyAgICAgIH0KKworICAgICAgc3RhdGljIG5vZGVfcG9pbnRlcgorICAgICAgZ2V0X3NtYWxsZXJfc2libGluZyhub2RlX3BvaW50ZXIgcF9uZCkKKyAgICAgIHsKKwlpbm9kZV9wb2ludGVyIHBfcGFyZW50ID0gc3RhdGljX2Nhc3Q8aW5vZGVfcG9pbnRlcj4ocF9uZC0+bV9wX3BhcmVudCk7CisKKwlpbm9kZV9pdGVyYXRvciBpdCA9IHBfcGFyZW50LT5iZWdpbigpOworCWlmICgqaXQgPT0gcF9uZCkKKwkgIHJldHVybiAwOworCisJaW5vZGVfaXRlcmF0b3IgcHJldl9pdDsKKwlkbworCSAgeworCSAgICBwcmV2X2l0ID0gaXQ7CisJICAgICsraXQ7CisJICAgIGlmICgqaXQgPT0gcF9uZCkKKwkgICAgICByZXR1cm4gKnByZXZfaXQ7CisJICB9CisJd2hpbGUgKHRydWUpOworCisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKGZhbHNlKTsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGxlYWZfcG9pbnRlcgorICAgICAgbGVmdG1vc3RfZGVzY2VuZGFudChub2RlX3BvaW50ZXIgcF9uZCkKKyAgICAgIHsKKwlpZiAocF9uZC0+bV90eXBlID09IGxlYWZfbm9kZSkKKwkgIHJldHVybiBzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KHBfbmQpOworCXJldHVybiBzdGF0aWNfY2FzdDxpbm9kZV9wb2ludGVyPihwX25kKS0+bGVmdG1vc3RfZGVzY2VuZGFudCgpOworICAgICAgfQorCisgICAgICBzdGF0aWMgbGVhZl9wb2ludGVyCisgICAgICByaWdodG1vc3RfZGVzY2VuZGFudChub2RlX3BvaW50ZXIgcF9uZCkKKyAgICAgIHsKKwlpZiAocF9uZC0+bV90eXBlID09IGxlYWZfbm9kZSkKKwkgIHJldHVybiBzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KHBfbmQpOworCXJldHVybiBzdGF0aWNfY2FzdDxpbm9kZV9wb2ludGVyPihwX25kKS0+cmlnaHRtb3N0X2Rlc2NlbmRhbnQoKTsKKyAgICAgIH0KKyAgICB9OworCisKKyAgICAvLy8gSXRlcmF0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZSwgdHlwZW5hbWUgTGVhZiwgdHlwZW5hbWUgSGVhZCwgdHlwZW5hbWUgSW5vZGUsCisJICAgICBib29sIElzX0ZvcndhcmRfSXRlcmF0b3I+CisgICAgY2xhc3MgX0l0ZXIKKyAgICA6IHB1YmxpYyBfQ0l0ZXI8Tm9kZSwgTGVhZiwgSGVhZCwgSW5vZGUsIElzX0ZvcndhcmRfSXRlcmF0b3I+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0NJdGVyPE5vZGUsIExlYWYsIEhlYWQsIElub2RlLCBJc19Gb3J3YXJkX0l0ZXJhdG9yPgorICAgICAgCQkJCQkJCWJhc2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjphbGxvY2F0b3JfdHlwZQlhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjp0eXBlX3RyYWl0cwkJdHlwZV90cmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHR5cGVfdHJhaXRzOjp2YWx1ZV90eXBlCQl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0eXBlX3RyYWl0czo6cG9pbnRlciAJCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHR5cGVfdHJhaXRzOjpyZWZlcmVuY2UgCQlyZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlX3BvaW50ZXIJCW5vZGVfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpsZWFmX3BvaW50ZXIJCWxlYWZfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpsZWFmX2NvbnN0X3BvaW50ZXIJbGVhZl9jb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmhlYWRfcG9pbnRlcgkJaGVhZF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Omlub2RlX3BvaW50ZXIgCWlub2RlX3BvaW50ZXI7CisKKyAgICAgIF9JdGVyKG5vZGVfcG9pbnRlciBwX25kID0gMCkKKyAgICAgIDogYmFzZV90eXBlKHBfbmQpIHsgfQorCisgICAgICBfSXRlcihjb25zdCBQQl9EU19PRElSX0lUX0NfREVDJiBvdGhlcikKKyAgICAgIDogYmFzZV90eXBlKG90aGVyLm1fcF9uZCkgeyB9CisKKyAgICAgIF9JdGVyJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9JdGVyJiBvdGhlcikKKyAgICAgIHsKKwliYXNlX3R5cGU6Om1fcF9uZCA9IG90aGVyLm1fcF9uZDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9JdGVyJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IFBCX0RTX09ESVJfSVRfQ19ERUMmIG90aGVyKQorICAgICAgeworCWJhc2VfdHlwZTo6bV9wX25kID0gb3RoZXIubV9wX25kOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfdHlwZTo6bV9wX25kLT5tX3R5cGUgPT0gbGVhZl9ub2RlKTsKKwlyZXR1cm4gJnN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4oYmFzZV90eXBlOjptX3BfbmQpLT52YWx1ZSgpOworICAgICAgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfdHlwZTo6bV9wX25kLT5tX3R5cGUgPT0gbGVhZl9ub2RlKTsKKwlyZXR1cm4gc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihiYXNlX3R5cGU6Om1fcF9uZCktPnZhbHVlKCk7CisgICAgICB9CisKKyAgICAgIF9JdGVyJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJYmFzZV90eXBlOjpvcGVyYXRvcisrKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfSXRlcgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisJX0l0ZXIgcmV0KGJhc2VfdHlwZTo6bV9wX25kKTsKKwlvcGVyYXRvcisrKCk7CisJcmV0dXJuIHJldDsKKyAgICAgIH0KKworICAgICAgX0l0ZXImCisgICAgICBvcGVyYXRvci0tKCkKKyAgICAgIHsKKwliYXNlX3R5cGU6Om9wZXJhdG9yLS0oKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9JdGVyCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsKKwlfSXRlciByZXQoYmFzZV90eXBlOjptX3BfbmQpOworCW9wZXJhdG9yLS0oKTsKKwlyZXR1cm4gcmV0OworICAgICAgfQorICAgIH07CisKKyN1bmRlZiBQQl9EU19DT05TVF9PRElSX0lUX0NfREVDCisjdW5kZWYgUEJfRFNfT0RJUl9JVF9DX0RFQworCisKKyNkZWZpbmUgUEJfRFNfUEFUX1RSSUVfTk9ERV9DT05TVF9JVEVSQVRPUl9DX0RFQyBcCisgICAgX05vZGVfY2l0ZXI8Tm9kZSwgTGVhZiwgSGVhZCwgSW5vZGUsIF9DSXRlcmF0b3IsIEl0ZXJhdG9yLCBfQVRyYWl0cywgX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX1BBVF9UUklFX05PREVfSVRFUkFUT1JfQ19ERUMgXAorICAgIF9Ob2RlX2l0ZXI8Tm9kZSwgTGVhZiwgSGVhZCwgSW5vZGUsIF9DSXRlcmF0b3IsIEl0ZXJhdG9yLCBfQVRyYWl0cywgX0FsbG9jPgorCisgICAgLy8vIE5vZGUgY29uc3QgaXRlcmF0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZSwKKwkgICAgIHR5cGVuYW1lIExlYWYsCisJICAgICB0eXBlbmFtZSBIZWFkLAorCSAgICAgdHlwZW5hbWUgSW5vZGUsCisJICAgICB0eXBlbmFtZSBfQ0l0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgX05vZGVfY2l0ZXIKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxOb2RlPglfX3JlYmluZF9uOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9uOjpvdGhlcjo6cG9pbnRlcglub2RlX3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8TGVhZj4JX19yZWJpbmRfbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbDo6b3RoZXI6OnBvaW50ZXIJbGVhZl9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9sOjpvdGhlcjo6Y29uc3RfcG9pbnRlcglsZWFmX2NvbnN0X3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8SW5vZGU+IAlfX3JlYmluZF9pbjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfaW46Om90aGVyOjpwb2ludGVyIAlpbm9kZV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9pbjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIgaW5vZGVfY29uc3RfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBOb2RlOjphX2NvbnN0X3BvaW50ZXIJCWFfY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgTm9kZTo6YV9jb25zdF9pdGVyYXRvcgkJYV9jb25zdF9pdGVyYXRvcjsKKworICAgIHByaXZhdGU6CisgICAgICBhX2NvbnN0X2l0ZXJhdG9yCisgICAgICBwcmVmX2JlZ2luKCkgY29uc3QKKyAgICAgIHsKKwlpZiAobV9wX25kLT5tX3R5cGUgPT0gbGVhZl9ub2RlKQorCSAgeworCSAgICBsZWFmX2NvbnN0X3BvaW50ZXIgbGNwID0gc3RhdGljX2Nhc3Q8bGVhZl9jb25zdF9wb2ludGVyPihtX3BfbmQpOworCSAgICByZXR1cm4gbV9wX3RyYWl0cy0+YmVnaW4obV9wX3RyYWl0cy0+ZXh0cmFjdF9rZXkobGNwLT52YWx1ZSgpKSk7CisJICB9CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9uZC0+bV90eXBlID09IGlfbm9kZSk7CisJcmV0dXJuIHN0YXRpY19jYXN0PGlub2RlX2NvbnN0X3BvaW50ZXI+KG1fcF9uZCktPnByZWZfYl9pdCgpOworICAgICAgfQorCisgICAgICBhX2NvbnN0X2l0ZXJhdG9yCisgICAgICBwcmVmX2VuZCgpIGNvbnN0CisgICAgICB7CisJaWYgKG1fcF9uZC0+bV90eXBlID09IGxlYWZfbm9kZSkKKwkgIHsKKwkgICAgbGVhZl9jb25zdF9wb2ludGVyIGxjcCA9IHN0YXRpY19jYXN0PGxlYWZfY29uc3RfcG9pbnRlcj4obV9wX25kKTsKKwkgICAgcmV0dXJuIG1fcF90cmFpdHMtPmVuZChtX3BfdHJhaXRzLT5leHRyYWN0X2tleShsY3AtPnZhbHVlKCkpKTsKKwkgIH0KKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX25kLT5tX3R5cGUgPT0gaV9ub2RlKTsKKwlyZXR1cm4gc3RhdGljX2Nhc3Q8aW5vZGVfY29uc3RfcG9pbnRlcj4obV9wX25kKS0+cHJlZl9lX2l0KCk7CisgICAgICB9CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHRyaXZpYWxfaXRlcmF0b3JfdGFnIAkJCWl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiB0cml2aWFsX2l0ZXJhdG9yX2RpZmZlcmVuY2VfdHlwZSAJCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgCQlzaXplX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX0NJdGVyYXRvciAJCSAgICAgICAJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUgCQkJCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdmFsdWVfdHlwZSAJCQkJY29uc3RfcmVmZXJlbmNlOworCisgICAgICAvLy8gTWV0YWRhdGEgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgTm9kZTo6bWV0YWRhdGFfdHlwZSAJCW1ldGFkYXRhX3R5cGU7CisKKyAgICAgIC8vLyBDb25zdCBtZXRhZGF0YSByZWZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8bWV0YWRhdGFfdHlwZT4gX19yZWJpbmRfbTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbTo6b3RoZXIgCQlfX3JlYmluZF9tYTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbWE6OmNvbnN0X3JlZmVyZW5jZSAgICBtZXRhZGF0YV9jb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIGlubGluZQorICAgICAgX05vZGVfY2l0ZXIobm9kZV9wb2ludGVyIHBfbmQgPSAwLCBhX2NvbnN0X3BvaW50ZXIgcF90cmFpdHMgPSAwKQorICAgICAgOiBtX3BfbmQoY29uc3RfY2FzdDxub2RlX3BvaW50ZXI+KHBfbmQpKSwgbV9wX3RyYWl0cyhwX3RyYWl0cykKKyAgICAgIHsgfQorCisgICAgICAvLy8gU3VidHJlZSB2YWxpZCBwcmVmaXguCisgICAgICBzdGQ6OnBhaXI8YV9jb25zdF9pdGVyYXRvciwgYV9jb25zdF9pdGVyYXRvcj4KKyAgICAgIHZhbGlkX3ByZWZpeCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om1ha2VfcGFpcihwcmVmX2JlZ2luKCksIHByZWZfZW5kKCkpOyB9CisKKyAgICAgIC8vLyBDb25zdCBhY2Nlc3M7IHJldHVybnMgdGhlIF9fY29uc3QgaXRlcmF0b3IqIGFzc29jaWF0ZWQgd2l0aAorICAgICAgLy8vIHRoZSBjdXJyZW50IGxlYWYuCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG51bV9jaGlsZHJlbigpID09IDApOworCXJldHVybiBfQ0l0ZXJhdG9yKG1fcF9uZCk7CisgICAgICB9CisKKyAgICAgIC8vLyBNZXRhZGF0YSBhY2Nlc3MuCisgICAgICBtZXRhZGF0YV9jb25zdF9yZWZlcmVuY2UKKyAgICAgIGdldF9tZXRhZGF0YSgpIGNvbnN0CisgICAgICB7IHJldHVybiBtX3BfbmQtPmdldF9tZXRhZGF0YSgpOyB9CisKKyAgICAgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhlIGNvcnJlc3BvbmRpbmcgbm9kZS4KKyAgICAgIHNpemVfdHlwZQorICAgICAgbnVtX2NoaWxkcmVuKCkgY29uc3QKKyAgICAgIHsKKwlpZiAobV9wX25kLT5tX3R5cGUgPT0gbGVhZl9ub2RlKQorCSAgcmV0dXJuIDA7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9uZC0+bV90eXBlID09IGlfbm9kZSk7CisJaW5vZGVfcG9pbnRlciBpbnAgPSBzdGF0aWNfY2FzdDxpbm9kZV9wb2ludGVyPihtX3BfbmQpOworCXJldHVybiBzdGQ6OmRpc3RhbmNlKGlucC0+YmVnaW4oKSwgaW5wLT5lbmQoKSk7CisgICAgICB9CisKKyAgICAgIC8vLyBSZXR1cm5zIGEgX19jb25zdCBub2RlIF9faXRlcmF0b3IgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbm9kZSdzCisgICAgICAvLy8gaS10aCBjaGlsZC4KKyAgICAgIF9Ob2RlX2NpdGVyCisgICAgICBnZXRfY2hpbGQoc2l6ZV90eXBlIGkpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9uZC0+bV90eXBlID09IGlfbm9kZSk7CisJaW5vZGVfcG9pbnRlciBpbnAgPSBzdGF0aWNfY2FzdDxpbm9kZV9wb2ludGVyPihtX3BfbmQpOworCXR5cGVuYW1lIElub2RlOjppdGVyYXRvciBpdCA9IGlucC0+YmVnaW4oKTsKKwlzdGQ6OmFkdmFuY2UoaXQsIGkpOworCXJldHVybiBfTm9kZV9jaXRlcigqaXQsIG1fcF90cmFpdHMpOworICAgICAgfQorCisgICAgICAvLy8gQ29tcGFyZXMgY29udGVudCB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IF9Ob2RlX2NpdGVyJiBvdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcF9uZCA9PSBvdGhlci5tX3BfbmQ7IH0KKworICAgICAgLy8vIENvbXBhcmVzIGNvbnRlbnQgKG5lZ2F0aXZlbHkpIHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yIG9iamVjdC4KKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgX05vZGVfY2l0ZXImIG90aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9wX25kICE9IG90aGVyLm1fcF9uZDsgfQorCisgICAgICBub2RlX3BvaW50ZXIgCQkJbV9wX25kOworICAgICAgYV9jb25zdF9wb2ludGVyIAkJCW1fcF90cmFpdHM7CisgICAgfTsKKworCisgICAgLy8vIE5vZGUgaXRlcmF0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZSwKKwkgICAgIHR5cGVuYW1lIExlYWYsCisJICAgICB0eXBlbmFtZSBIZWFkLAorCSAgICAgdHlwZW5hbWUgSW5vZGUsCisJICAgICB0eXBlbmFtZSBfQ0l0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgSXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgX05vZGVfaXRlcgorICAgIDogcHVibGljIF9Ob2RlX2NpdGVyPE5vZGUsIExlYWYsIEhlYWQsIElub2RlLCBfQ0l0ZXJhdG9yLCBJdGVyYXRvciwgX0FsbG9jPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfTm9kZV9jaXRlcjxOb2RlLCBMZWFmLCBIZWFkLCBJbm9kZSwKKwkJCSAgX0NJdGVyYXRvciwgSXRlcmF0b3IsIF9BbGxvYz4JYmFzZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxOb2RlPglfX3JlYmluZF9uOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9uOjpvdGhlcjo6cG9pbnRlcglub2RlX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6aW5vZGVfcG9pbnRlciAJaW5vZGVfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjphX2NvbnN0X3BvaW50ZXIgCWFfY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgSXRlcmF0b3IgCQkJCQlpdGVyYXRvcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpzaXplX3R5cGUgCQlzaXplX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgSXRlcmF0b3IgCQkJCQl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlIAkJCQlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUgCQkJCWNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgX05vZGVfaXRlcihub2RlX3BvaW50ZXIgcF9uZCA9IDAsIGFfY29uc3RfcG9pbnRlciBwX3RyYWl0cyA9IDApCisgICAgICA6IGJhc2VfdHlwZShwX25kLCBwX3RyYWl0cykKKyAgICAgIHsgfQorCisgICAgICAvLy8gQWNjZXNzOyByZXR1cm5zIHRoZSBpdGVyYXRvciogIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBsZWFmLgorICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChiYXNlX3R5cGU6Om51bV9jaGlsZHJlbigpID09IDApOworCXJldHVybiBpdGVyYXRvcihiYXNlX3R5cGU6Om1fcF9uZCk7CisgICAgICB9CisKKyAgICAgIC8vLyBSZXR1cm5zIGEgbm9kZSBfX2l0ZXJhdG9yIHRvIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUncyBpLXRoIGNoaWxkLgorICAgICAgX05vZGVfaXRlcgorICAgICAgZ2V0X2NoaWxkKHNpemVfdHlwZSBpKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChiYXNlX3R5cGU6Om1fcF9uZC0+bV90eXBlID09IGlfbm9kZSk7CisKKwl0eXBlbmFtZSBJbm9kZTo6aXRlcmF0b3IgaXQgPQorCSAgc3RhdGljX2Nhc3Q8aW5vZGVfcG9pbnRlcj4oYmFzZV90eXBlOjptX3BfbmQpLT5iZWdpbigpOworCisJc3RkOjphZHZhbmNlKGl0LCBpKTsKKwlyZXR1cm4gX05vZGVfaXRlcigqaXQsIGJhc2VfdHlwZTo6bV9wX3RyYWl0cyk7CisgICAgICB9CisgICAgfTsKKyAgICB9OworCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BVHJhaXRzLCB0eXBlbmFtZSBNZXRhZGF0YT4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICAgcGF0X3RyaWVfYmFzZTo6X0lub2RlPF9BVHJhaXRzLCBNZXRhZGF0YT4KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Ol9fcmViaW5kX2wKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6c19sZWFmX2FsbG9jOworCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6X19yZWJpbmRfaW4KKyAgICBQQl9EU19DTEFTU19DX0RFQzo6c19pbm9kZV9hbGxvYzsKKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgZ2V0X3ByZWZfcG9zKGFfY29uc3RfaXRlcmF0b3IgYl9pdCwgYV9jb25zdF9pdGVyYXRvciBlX2l0LAorCQkgYV9jb25zdF9wb2ludGVyIHBfdHJhaXRzKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oc3RkOjpkaXN0YW5jZShiX2l0LCBlX2l0KSkgPD0gbV9lX2luZCkKKwlyZXR1cm4gMDsKKyAgICAgIHN0ZDo6YWR2YW5jZShiX2l0LCBtX2VfaW5kKTsKKyAgICAgIHJldHVybiAxICsgcF90cmFpdHMtPmVfcG9zKCpiX2l0KTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBfSW5vZGUoc2l6ZV90eXBlIGxlbiwgY29uc3QgYV9jb25zdF9pdGVyYXRvciBpdCkKKyAgICA6IGJhc2VfdHlwZShpX25vZGUpLCBtX2VfaW5kKGxlbiksIG1fcHJlZl9iX2l0KGl0KSwgbV9wcmVmX2VfaXQoaXQpCisgICAgeworICAgICAgc3RkOjphZHZhbmNlKG1fcHJlZl9lX2l0LCBtX2VfaW5kKTsKKyAgICAgIHN0ZDo6ZmlsbChtX2FfcF9jaGlsZHJlbiwgbV9hX3BfY2hpbGRyZW4gKyBhcnJfc2l6ZSwKKwkJc3RhdGljX2Nhc3Q8bm9kZV9wb2ludGVyPigwKSk7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHVwZGF0ZV9wcmVmaXhlcyhhX2NvbnN0X3BvaW50ZXIgcF90cmFpdHMpCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfZmlyc3QgPSAqYmVnaW4oKTsKKyAgICAgIGlmIChwX2ZpcnN0LT5tX3R5cGUgPT0gbGVhZl9ub2RlKQorCXsKKwkgIGxlYWZfY29uc3RfcG9pbnRlciBwID0gc3RhdGljX2Nhc3Q8bGVhZl9jb25zdF9wb2ludGVyPihwX2ZpcnN0KTsKKwkgIG1fcHJlZl9iX2l0ID0gcF90cmFpdHMtPmJlZ2luKGFjY2Vzc190cmFpdHM6OmV4dHJhY3Rfa2V5KHAtPnZhbHVlKCkpKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaW5vZGVfcG9pbnRlciBwID0gc3RhdGljX2Nhc3Q8aW5vZGVfcG9pbnRlcj4ocF9maXJzdCk7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9maXJzdC0+bV90eXBlID09IGlfbm9kZSk7CisJICBtX3ByZWZfYl9pdCA9IHAtPnByZWZfYl9pdCgpOworCX0KKyAgICAgIG1fcHJlZl9lX2l0ID0gbV9wcmVmX2JfaXQ7CisgICAgICBzdGQ6OmFkdmFuY2UobV9wcmVmX2VfaXQsIG1fZV9pbmQpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGJlZ2luKCkgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIG5vZGVfcG9pbnRlcl9wb2ludGVyIHBvaW50ZXJfdHlwZTsKKyAgICAgIHBvaW50ZXJfdHlwZSBwID0gY29uc3RfY2FzdDxwb2ludGVyX3R5cGU+KG1fYV9wX2NoaWxkcmVuKTsKKyAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihwICsgZ2V0X2JlZ2luX3BvcygpLCBwICsgYXJyX3NpemUpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGJlZ2luKCkKKyAgICB7CisgICAgICByZXR1cm4gaXRlcmF0b3IobV9hX3BfY2hpbGRyZW4gKyBnZXRfYmVnaW5fcG9zKCksCisJCSAgICAgIG1fYV9wX2NoaWxkcmVuICsgYXJyX3NpemUpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGVuZCgpIGNvbnN0CisgICAgeworICAgICAgdHlwZWRlZiBub2RlX3BvaW50ZXJfcG9pbnRlciBwb2ludGVyX3R5cGU7CisgICAgICBwb2ludGVyX3R5cGUgcCA9IGNvbnN0X2Nhc3Q8cG9pbnRlcl90eXBlPihtX2FfcF9jaGlsZHJlbikgKyBhcnJfc2l6ZTsKKyAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihwLCBwKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBlbmQoKQorICAgIHsgcmV0dXJuIGl0ZXJhdG9yKG1fYV9wX2NoaWxkcmVuICsgYXJyX3NpemUsIG1fYV9wX2NoaWxkcmVuICsgYXJyX3NpemUpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGdldF9jaGlsZF9ub2RlKGFfY29uc3RfaXRlcmF0b3IgYl9pdCwgYV9jb25zdF9pdGVyYXRvciBlX2l0LAorCQkgICBhX2NvbnN0X3BvaW50ZXIgcF90cmFpdHMpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIGkgPSBnZXRfcHJlZl9wb3MoYl9pdCwgZV9pdCwgcF90cmFpdHMpOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGkgPCBhcnJfc2l6ZSk7CisgICAgICByZXR1cm4gbV9hX3BfY2hpbGRyZW5baV07CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGdldF9jaGlsZF9pdChhX2NvbnN0X2l0ZXJhdG9yIGJfaXQsIGFfY29uc3RfaXRlcmF0b3IgZV9pdCwKKwkJIGFfY29uc3RfcG9pbnRlciBwX3RyYWl0cykKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgaSA9IGdldF9wcmVmX3BvcyhiX2l0LCBlX2l0LCBwX3RyYWl0cyk7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoaSA8IGFycl9zaXplKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX2FfcF9jaGlsZHJlbltpXSAhPSAwKTsKKyAgICAgIHJldHVybiBpdGVyYXRvcihtX2FfcF9jaGlsZHJlbiArIGksIG1fYV9wX2NoaWxkcmVuICsgaSk7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfY29uc3RfcG9pbnRlcgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBnZXRfY2hpbGRfbm9kZShhX2NvbnN0X2l0ZXJhdG9yIGJfaXQsIGFfY29uc3RfaXRlcmF0b3IgZV9pdCwKKwkJICAgYV9jb25zdF9wb2ludGVyIHBfdHJhaXRzKSBjb25zdAorICAgIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8bm9kZV9wb2ludGVyPihnZXRfY2hpbGRfbm9kZShiX2l0LCBlX2l0LCBwX3RyYWl0cykpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgZ2V0X2xvd2VyX2JvdW5kX2NoaWxkX25vZGUoYV9jb25zdF9pdGVyYXRvciBiX2l0LCBhX2NvbnN0X2l0ZXJhdG9yIGVfaXQsCisJCQkgICAgICAgc2l6ZV90eXBlIGNoZWNrZWRfaW5kLAorCQkJICAgICAgIGFfY29uc3RfcG9pbnRlciBwX3RyYWl0cykKKyAgICB7CisgICAgICBpZiAoIXNob3VsZF9iZV9taW5lKGJfaXQsIGVfaXQsIGNoZWNrZWRfaW5kLCBwX3RyYWl0cykpCisJeworCSAgaWYgKHBfdHJhaXRzLT5jbXBfcHJlZml4ZXMoYl9pdCwgZV9pdCwgbV9wcmVmX2JfaXQsCisJCQkJICAgICBtX3ByZWZfZV9pdCwgdHJ1ZSkpCisJICAgIHJldHVybiBsZWZ0bW9zdF9kZXNjZW5kYW50KCk7CisJICByZXR1cm4gcmlnaHRtb3N0X2Rlc2NlbmRhbnQoKTsKKwl9CisKKyAgICAgIHNpemVfdHlwZSBpID0gZ2V0X3ByZWZfcG9zKGJfaXQsIGVfaXQsIHBfdHJhaXRzKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpIDwgYXJyX3NpemUpOworCisgICAgICBpZiAobV9hX3BfY2hpbGRyZW5baV0gIT0gMCkKKwlyZXR1cm4gbV9hX3BfY2hpbGRyZW5baV07CisKKyAgICAgIHdoaWxlICgrK2kgPCBhcnJfc2l6ZSkKKwlpZiAobV9hX3BfY2hpbGRyZW5baV0gIT0gMCkKKwkgIHsKKwkgICAgY29uc3Qgbm9kZV90eXBlJiBfX250ID0gbV9hX3BfY2hpbGRyZW5baV0tPm1fdHlwZTsKKwkgICAgbm9kZV9wb2ludGVyIHJldCA9IG1fYV9wX2NoaWxkcmVuW2ldOworCisJICAgIGlmIChfX250ID09IGxlYWZfbm9kZSkKKwkgICAgICByZXR1cm4gcmV0OworCisJICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfX250ID09IGlfbm9kZSk7CisJICAgIGlub2RlX3BvaW50ZXIgaW5wID0gc3RhdGljX2Nhc3Q8aW5vZGVfcG9pbnRlcj4ocmV0KTsKKwkgICAgcmV0dXJuIGlucC0+bGVmdG1vc3RfZGVzY2VuZGFudCgpOworCSAgfQorCisgICAgICByZXR1cm4gcmlnaHRtb3N0X2Rlc2NlbmRhbnQoKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGFkZF9jaGlsZChub2RlX3BvaW50ZXIgcF9uZCwgYV9jb25zdF9pdGVyYXRvciBiX2l0LCBhX2NvbnN0X2l0ZXJhdG9yIGVfaXQsCisJICAgICAgYV9jb25zdF9wb2ludGVyIHBfdHJhaXRzKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBpID0gZ2V0X3ByZWZfcG9zKGJfaXQsIGVfaXQsIHBfdHJhaXRzKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpIDwgYXJyX3NpemUpOworICAgICAgaWYgKG1fYV9wX2NoaWxkcmVuW2ldID09IDApCisJeworCSAgbV9hX3BfY2hpbGRyZW5baV0gPSBwX25kOworCSAgcF9uZC0+bV9wX3BhcmVudCA9IHRoaXM7CisJICByZXR1cm4gcF9uZDsKKwl9CisgICAgICByZXR1cm4gbV9hX3BfY2hpbGRyZW5baV07CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9jb25zdF9wb2ludGVyCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGdldF9qb2luX2NoaWxkKG5vZGVfY29uc3RfcG9pbnRlciBwX25kLAorCQkgICBhX2NvbnN0X3BvaW50ZXIgcF90cikgY29uc3QKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcCA9IGNvbnN0X2Nhc3Q8bm9kZV9wb2ludGVyPihwX25kKTsKKyAgICAgIHJldHVybiBjb25zdF9jYXN0PGlub2RlX3BvaW50ZXI+KHRoaXMpLT5nZXRfam9pbl9jaGlsZChwLCBwX3RyKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgZ2V0X2pvaW5fY2hpbGQobm9kZV9wb2ludGVyIHBfbmQsIGFfY29uc3RfcG9pbnRlciBwX3RyYWl0cykKKyAgICB7CisgICAgICBzaXplX3R5cGUgaTsKKyAgICAgIGFfY29uc3RfaXRlcmF0b3IgYl9pdDsKKyAgICAgIGFfY29uc3RfaXRlcmF0b3IgZV9pdDsKKyAgICAgIGlmIChwX25kLT5tX3R5cGUgPT0gbGVhZl9ub2RlKQorCXsKKwkgIGxlYWZfY29uc3RfcG9pbnRlciBwID0gc3RhdGljX2Nhc3Q8bGVhZl9jb25zdF9wb2ludGVyPihwX25kKTsKKworCSAgdHlwZWRlZiB0eXBlbmFtZSB0eXBlX3RyYWl0czo6a2V5X2NvbnN0X3JlZmVyZW5jZSBrY3I7CisJICBrY3Igcl9rZXkgPSBhY2Nlc3NfdHJhaXRzOjpleHRyYWN0X2tleShwLT52YWx1ZSgpKTsKKwkgIGJfaXQgPSBwX3RyYWl0cy0+YmVnaW4ocl9rZXkpOworCSAgZV9pdCA9IHBfdHJhaXRzLT5lbmQocl9rZXkpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBiX2l0ID0gc3RhdGljX2Nhc3Q8aW5vZGVfcG9pbnRlcj4ocF9uZCktPnByZWZfYl9pdCgpOworCSAgZV9pdCA9IHN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KHBfbmQpLT5wcmVmX2VfaXQoKTsKKwl9CisgICAgICBpID0gZ2V0X3ByZWZfcG9zKGJfaXQsIGVfaXQsIHBfdHJhaXRzKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpIDwgYXJyX3NpemUpOworICAgICAgcmV0dXJuIG1fYV9wX2NoaWxkcmVuW2ldOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByZW1vdmVfY2hpbGQobm9kZV9wb2ludGVyIHBfbmQpCisgICAgeworICAgICAgc2l6ZV90eXBlIGkgPSAwOworICAgICAgZm9yICg7IGkgPCBhcnJfc2l6ZTsgKytpKQorCWlmIChtX2FfcF9jaGlsZHJlbltpXSA9PSBwX25kKQorCSAgeworCSAgICBtX2FfcF9jaGlsZHJlbltpXSA9IDA7CisJICAgIHJldHVybjsKKwkgIH0KKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpICE9IGFycl9zaXplKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmVtb3ZlX2NoaWxkKGl0ZXJhdG9yIGl0KQorICAgIHsgKml0Lm1fcF9wX2N1ciA9IDA7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByZXBsYWNlX2NoaWxkKG5vZGVfcG9pbnRlciBwX25kLCBhX2NvbnN0X2l0ZXJhdG9yIGJfaXQsCisJCSAgYV9jb25zdF9pdGVyYXRvciBlX2l0LAorCQkgIGFfY29uc3RfcG9pbnRlciBwX3RyYWl0cykKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgaSA9IGdldF9wcmVmX3BvcyhiX2l0LCBlX2l0LCBwX3RyYWl0cyk7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoaSA8IGFycl9zaXplKTsKKyAgICAgIG1fYV9wX2NoaWxkcmVuW2ldID0gcF9uZDsKKyAgICAgIHBfbmQtPm1fcF9wYXJlbnQgPSB0aGlzOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjphX2NvbnN0X2l0ZXJhdG9yCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHByZWZfYl9pdCgpIGNvbnN0CisgICAgeyByZXR1cm4gbV9wcmVmX2JfaXQ7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjphX2NvbnN0X2l0ZXJhdG9yCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHByZWZfZV9pdCgpIGNvbnN0CisgICAgeyByZXR1cm4gbV9wcmVmX2VfaXQ7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgYm9vbAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBzaG91bGRfYmVfbWluZShhX2NvbnN0X2l0ZXJhdG9yIGJfaXQsIGFfY29uc3RfaXRlcmF0b3IgZV9pdCwKKwkJICAgc2l6ZV90eXBlIGNoZWNrZWRfaW5kLAorCQkgICBhX2NvbnN0X3BvaW50ZXIgcF90cmFpdHMpIGNvbnN0CisgICAgeworICAgICAgaWYgKG1fZV9pbmQgPT0gMCkKKwlyZXR1cm4gdHJ1ZTsKKworICAgICAgY29uc3Qgc2l6ZV90eXBlIG51bV9lcyA9IHN0ZDo6ZGlzdGFuY2UoYl9pdCwgZV9pdCk7CisgICAgICBpZiAobnVtX2VzIDwgbV9lX2luZCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGFfY29uc3RfaXRlcmF0b3Iga2V5X2JfaXQgPSBiX2l0OworICAgICAgc3RkOjphZHZhbmNlKGtleV9iX2l0LCBjaGVja2VkX2luZCk7CisgICAgICBhX2NvbnN0X2l0ZXJhdG9yIGtleV9lX2l0ID0gYl9pdDsKKyAgICAgIHN0ZDo6YWR2YW5jZShrZXlfZV9pdCwgbV9lX2luZCk7CisKKyAgICAgIGFfY29uc3RfaXRlcmF0b3IgdmFsdWVfYl9pdCA9IG1fcHJlZl9iX2l0OworICAgICAgc3RkOjphZHZhbmNlKHZhbHVlX2JfaXQsIGNoZWNrZWRfaW5kKTsKKyAgICAgIGFfY29uc3RfaXRlcmF0b3IgdmFsdWVfZV9pdCA9IG1fcHJlZl9iX2l0OworICAgICAgc3RkOjphZHZhbmNlKHZhbHVlX2VfaXQsIG1fZV9pbmQpOworCisgICAgICByZXR1cm4gcF90cmFpdHMtPmVxdWFsX3ByZWZpeGVzKGtleV9iX2l0LCBrZXlfZV9pdCwgdmFsdWVfYl9pdCwKKwkJCQkgICAgICB2YWx1ZV9lX2l0KTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpsZWFmX3BvaW50ZXIKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgbGVmdG1vc3RfZGVzY2VuZGFudCgpCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfcG90ID0gKmJlZ2luKCk7CisgICAgICBpZiAocF9wb3QtPm1fdHlwZSA9PSBsZWFmX25vZGUpCisJcmV0dXJuIChzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KHBfcG90KSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9wb3QtPm1fdHlwZSA9PSBpX25vZGUpOworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KHBfcG90KS0+bGVmdG1vc3RfZGVzY2VuZGFudCgpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmxlYWZfY29uc3RfcG9pbnRlcgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBsZWZ0bW9zdF9kZXNjZW5kYW50KCkgY29uc3QKKyAgICB7IHJldHVybiBjb25zdF9jYXN0PGlub2RlX3BvaW50ZXI+KHRoaXMpLT5sZWZ0bW9zdF9kZXNjZW5kYW50KCk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmxlYWZfcG9pbnRlcgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByaWdodG1vc3RfZGVzY2VuZGFudCgpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIG51bV9jaGlsZHJlbiA9IHN0ZDo6ZGlzdGFuY2UoYmVnaW4oKSwgZW5kKCkpOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG51bV9jaGlsZHJlbiA+PSAyKTsKKworICAgICAgaXRlcmF0b3IgaXQgPSBiZWdpbigpOworICAgICAgc3RkOjphZHZhbmNlKGl0LCBudW1fY2hpbGRyZW4gLSAxKTsKKyAgICAgIG5vZGVfcG9pbnRlciBwX3BvdCA9KiBpdDsKKyAgICAgIGlmIChwX3BvdC0+bV90eXBlID09IGxlYWZfbm9kZSkKKwlyZXR1cm4gc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihwX3BvdCk7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9wb3QtPm1fdHlwZSA9PSBpX25vZGUpOworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KHBfcG90KS0+cmlnaHRtb3N0X2Rlc2NlbmRhbnQoKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpsZWFmX2NvbnN0X3BvaW50ZXIKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmlnaHRtb3N0X2Rlc2NlbmRhbnQoKSBjb25zdAorICAgIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8aW5vZGVfcG9pbnRlcj4odGhpcyktPnJpZ2h0bW9zdF9kZXNjZW5kYW50KCk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBnZXRfYmVnaW5fcG9zKCkgY29uc3QKKyAgICB7CisgICAgICBzaXplX3R5cGUgaSA9IDA7CisgICAgICBmb3IgKDsgaSA8IGFycl9zaXplICYmIG1fYV9wX2NoaWxkcmVuW2ldID09IDA7ICsraSkKKwk7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfZGVidWdfaW5mbworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBhc3NlcnRfdmFsaWRfaW1wKGFfY29uc3RfcG9pbnRlciBwX3RyYWl0cywKKwkJICAgICBjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0CisgICAgeworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKGJhc2VfdHlwZTo6bV90eXBlID09IGlfbm9kZSk7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihzdGQ6OmRpc3RhbmNlKHByZWZfYl9pdCgpLCBwcmVmX2VfaXQoKSkpID09IG1fZV9pbmQpOworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKHN0ZDo6ZGlzdGFuY2UoYmVnaW4oKSwgZW5kKCkpID49IDIpOworCisgICAgICBmb3IgKHR5cGVuYW1lIF9Jbm9kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBiZWdpbigpOyBpdCAhPSBlbmQoKTsgKytpdCkKKwl7CisJICBub2RlX2NvbnN0X3BvaW50ZXIgcF9uZCA9ICppdDsKKwkgIFBCX0RTX0RFQlVHX1ZFUklGWShwX25kLT5tX3BfcGFyZW50ID09IHRoaXMpOworCSAgbm9kZV9kZWJ1Z19pbmZvIGNoaWxkX3JldCA9IHBfbmQtPmFzc2VydF92YWxpZF9pbXAocF90cmFpdHMsCisJCQkJCQkJICAgICBfX2ZpbGUsIF9fbGluZSk7CisKKwkgIFBCX0RTX0RFQlVHX1ZFUklGWShzdGF0aWNfY2FzdDxzaXplX3R5cGU+KHN0ZDo6ZGlzdGFuY2UoY2hpbGRfcmV0LmZpcnN0LCBjaGlsZF9yZXQuc2Vjb25kKSkgPj0gbV9lX2luZCk7CisJICBQQl9EU19ERUJVR19WRVJJRlkoc2hvdWxkX2JlX21pbmUoY2hpbGRfcmV0LmZpcnN0LCBjaGlsZF9yZXQuc2Vjb25kLCAwLCBwX3RyYWl0cykpOworCSAgUEJfRFNfREVCVUdfVkVSSUZZKGdldF9wcmVmX3BvcyhjaGlsZF9yZXQuZmlyc3QsIGNoaWxkX3JldC5zZWNvbmQsIHBfdHJhaXRzKSA9PSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KGl0Lm1fcF9wX2N1ciAtIG1fYV9wX2NoaWxkcmVuKSk7CisJfQorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHByZWZfYl9pdCgpLCBwcmVmX2VfaXQoKSk7CisgICAgfQorI2VuZGlmCisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDk3NjFlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNjMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcGF0X3RyaWVfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBwYXRfdHJpZS4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmFjY2Vzc190cmFpdHMmIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2FjY2Vzc190cmFpdHMoKQoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2NvbnN0IHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjphY2Nlc3NfdHJhaXRzJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9hY2Nlc3NfdHJhaXRzKCkgY29uc3QKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV91cGRhdGUmIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X25vZGVfdXBkYXRlKCkKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV91cGRhdGUmIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X25vZGVfdXBkYXRlKCkgY29uc3QKK3sgcmV0dXJuICp0aGlzOyB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3JfZXJhc2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3JfZXJhc2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwNjY3YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcl9lcmFzZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEwMyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwYXRfdHJpZV8vcl9lcmFzZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHBhdF90cmllLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYWN0dWFsX2VyYXNlX25vZGUobm9kZV9wb2ludGVyIHBfeikKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fc2l6ZSA+IDApOworICAtLW1fc2l6ZTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjplcmFzZV9leGlzdGluZyhQQl9EU19WMkYocF96LT5tX3ZhbHVlKSkpOworICBwX3otPn5ub2RlKCk7CisgIHNfbm9kZV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShwX3osIDEpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3VwZGF0ZV9taW5fbWF4X2Zvcl9lcmFzZWRfbm9kZShub2RlX3BvaW50ZXIgcF96KQoreworICBpZiAobV9zaXplID09IDEpCisgICAgeworICAgICAgbV9wX2hlYWQtPm1fcF9sZWZ0ID0gbV9wX2hlYWQtPm1fcF9yaWdodCA9IG1fcF9oZWFkOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAobV9wX2hlYWQtPm1fcF9sZWZ0ID09IHBfeikKKyAgICB7CisgICAgICBpdGVyYXRvciBpdChwX3opOworICAgICAgKytpdDsKKyAgICAgIG1fcF9oZWFkLT5tX3BfbGVmdCA9IGl0Lm1fcF9uZDsKKyAgICB9CisgIGVsc2UgaWYgKG1fcF9oZWFkLT5tX3BfcmlnaHQgPT0gcF96KQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIGl0KHBfeik7CisgICAgICAtLWl0OworICAgICAgbV9wX2hlYWQtPm1fcF9yaWdodCA9IGl0Lm1fcF9uZDsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcigpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKHRydWUsIHRydWUpOykKKyAgY2xlYXJfaW1wKG1fcF9oZWFkLT5tX3BfcGFyZW50KTsKKyAgbV9zaXplID0gMDsKKyAgaW5pdGlhbGl6ZSgpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNsZWFyKCk7KQorICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCh0cnVlLCB0cnVlKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcl9pbXAobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuOworICBjbGVhcl9pbXAocF9uZC0+bV9wX2xlZnQpOworICBjbGVhcl9pbXAocF9uZC0+bV9wX3JpZ2h0KTsKKyAgcF9uZC0+fk5vZGUoKTsKKyAgc19ub2RlX2FsbG9jYXRvci5kZWFsbG9jYXRlKHBfbmQsIDEpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3JvdGF0ZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcm90YXRlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZmMyNzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3JvdGF0ZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDE1MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwYXRfdHJpZV8vcm90YXRlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBzIGZvciByb3RhdGluZyBub2Rlcy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JvdGF0ZV9sZWZ0KG5vZGVfcG9pbnRlciBwX3gpCit7CisgIG5vZGVfcG9pbnRlciBwX3kgPSBwX3gtPm1fcF9yaWdodDsKKyAgcF94LT5tX3BfcmlnaHQgPSBwX3ktPm1fcF9sZWZ0OworCisgIGlmIChwX3ktPm1fcF9sZWZ0ICE9IDApCisgICAgcF95LT5tX3BfbGVmdC0+bV9wX3BhcmVudCA9IHBfeDsKKworICBwX3ktPm1fcF9wYXJlbnQgPSBwX3gtPm1fcF9wYXJlbnQ7CisgIGlmIChwX3ggPT0gbV9wX2hlYWQtPm1fcF9wYXJlbnQpCisgICAgbV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX3k7CisgIGVsc2UgaWYgKHBfeCA9PSBwX3gtPm1fcF9wYXJlbnQtPm1fcF9sZWZ0KQorICAgIHBfeC0+bV9wX3BhcmVudC0+bV9wX2xlZnQgPSBwX3k7CisgIGVsc2UKKyAgICBwX3gtPm1fcF9wYXJlbnQtPm1fcF9yaWdodCA9IHBfeTsKKworICBwX3ktPm1fcF9sZWZ0ID0gcF94OworICBwX3gtPm1fcF9wYXJlbnQgPSBwX3k7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfeCk7KQorICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF95KTspCisKKyAgYXBwbHlfdXBkYXRlKHBfeCwgKE5vZGVfVXBkYXRlKil0aGlzKTsKKyAgYXBwbHlfdXBkYXRlKHBfeC0+bV9wX3BhcmVudCwgKE5vZGVfVXBkYXRlKil0aGlzKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cityb3RhdGVfcmlnaHQobm9kZV9wb2ludGVyIHBfeCkKK3sKKyAgbm9kZV9wb2ludGVyIHBfeSA9IHBfeC0+bV9wX2xlZnQ7CisgIHBfeC0+bV9wX2xlZnQgPSBwX3ktPm1fcF9yaWdodDsKKworICBpZiAocF95LT5tX3BfcmlnaHQgIT0gMCkKKyAgICBwX3ktPm1fcF9yaWdodC0+bV9wX3BhcmVudCA9IHBfeDsKKworICBwX3ktPm1fcF9wYXJlbnQgPSBwX3gtPm1fcF9wYXJlbnQ7CisgIGlmIChwX3ggPT0gbV9wX2hlYWQtPm1fcF9wYXJlbnQpCisgICAgbV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX3k7CisgIGVsc2UgaWYgKHBfeCA9PSBwX3gtPm1fcF9wYXJlbnQtPm1fcF9yaWdodCkKKyAgICBwX3gtPm1fcF9wYXJlbnQtPm1fcF9yaWdodCA9IHBfeTsKKyAgZWxzZQorICAgIHBfeC0+bV9wX3BhcmVudC0+bV9wX2xlZnQgPSBwX3k7CisKKyAgcF95LT5tX3BfcmlnaHQgPSBwX3g7CisgIHBfeC0+bV9wX3BhcmVudCA9IHBfeTsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF94KTspCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X25vZGVfY29uc2lzdGVudChwX3kpOykKKworICBhcHBseV91cGRhdGUocF94LCAoTm9kZV9VcGRhdGUqKXRoaXMpOworICBhcHBseV91cGRhdGUocF94LT5tX3BfcGFyZW50LCAoTm9kZV9VcGRhdGUqKXRoaXMpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JvdGF0ZV9wYXJlbnQobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIG5vZGVfcG9pbnRlciBwX3BhcmVudCA9IHBfbmQtPm1fcF9wYXJlbnQ7CisgIGlmIChwX25kID09IHBfcGFyZW50LT5tX3BfbGVmdCkKKyAgICByb3RhdGVfcmlnaHQocF9wYXJlbnQpOworICBlbHNlCisgICAgcm90YXRlX2xlZnQocF9wYXJlbnQpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9wYXJlbnQtPm1fcF9wYXJlbnQgPSBwX25kKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fcF9sZWZ0ID09IHBfcGFyZW50IHx8IHBfbmQtPm1fcF9yaWdodCA9PSBwX3BhcmVudCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXBwbHlfdXBkYXRlKG5vZGVfcG9pbnRlciAvKnBfbmQqLywgX19nbnVfcGJkczo6bnVsbF9ub2RlX3VwZGF0ZSogIC8qcF91cGRhdGUqLykKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9VcGRhdGVfPgoraW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FwcGx5X3VwZGF0ZShub2RlX3BvaW50ZXIgcF9uZCwgTm9kZV9VcGRhdGVfKiBwX3VwZGF0ZSkKK3sKKyAgcF91cGRhdGUtPm9wZXJhdG9yKCkoJiBQQl9EU19WMkYocF9uZC0+bV92YWx1ZSksKHBfbmQtPm1fcF9sZWZ0ID09IDApID8KKwkJCTAgOgorCQkJJiBQQl9EU19WMkYocF9uZC0+bV9wX2xlZnQtPm1fdmFsdWUpLChwX25kLT5tX3BfcmlnaHQgPT0gMCkgPworCQkJMCA6CisJCQkmIFBCX0RTX1YyRihwX25kLT5tX3BfcmlnaHQtPm1fdmFsdWUpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIE5vZGVfVXBkYXRlXz4KK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit1cGRhdGVfdG9fdG9wKG5vZGVfcG9pbnRlciBwX25kLCBOb2RlX1VwZGF0ZV8qIHBfdXBkYXRlKQoreworICB3aGlsZSAocF9uZCAhPSBtX3BfaGVhZCkKKyAgICB7CisgICAgICBhcHBseV91cGRhdGUocF9uZCwgcF91cGRhdGUpOworICAgICAgcF9uZCA9IHBfbmQtPm1fcF9wYXJlbnQ7CisgICAgfQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3VwZGF0ZV90b190b3Aobm9kZV9wb2ludGVyIC8qcF9uZCovLCBfX2dudV9wYmRzOjpudWxsX25vZGVfdXBkYXRlKiAgLypwX3VwZGF0ZSovKQoreyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vc3BsaXRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3NwbGl0X2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYTk3OWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3NwbGl0X2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMjUwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBhdF90cmllXy9zcGxpdF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHBhdF90cmllLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxpdChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5LCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgIGJyYW5jaF9iYWcgYmFnOworICBsZWFmX3BvaW50ZXIgcF9zcGxpdF9sZiA9IHNwbGl0X3ByZXAocl9rZXksIG90aGVyLCBiYWcpOworICBpZiAocF9zcGxpdF9sZiA9PSAwKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChiYWcuZW1wdHkoKSk7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFiYWcuZW1wdHkoKSk7CisgIG90aGVyLmNsZWFyKCk7CisKKyAgbV9wX2hlYWQtPm1fcF9wYXJlbnQgPSByZWNfc3BsaXQobV9wX2hlYWQtPm1fcF9wYXJlbnQsIHByZWZfYmVnaW4ocF9zcGxpdF9sZiksCisJCQkJICAgcHJlZl9lbmQocF9zcGxpdF9sZiksIG90aGVyLCBiYWcpOworCisgIG1fcF9oZWFkLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50ID0gbV9wX2hlYWQ7CisKKyAgaGVhZF9wb2ludGVyIF9fb2hlYWQgPSBvdGhlci5tX3BfaGVhZDsKKyAgX19vaGVhZC0+bV9wX21heCA9IG1fcF9oZWFkLT5tX3BfbWF4OworICBtX3BfaGVhZC0+bV9wX21heCA9IHJpZ2h0bW9zdF9kZXNjZW5kYW50KG1fcF9oZWFkLT5tX3BfcGFyZW50KTsKKyAgX19vaGVhZC0+bV9wX21pbiA9IG90aGVyLmxlZnRtb3N0X2Rlc2NlbmRhbnQoX19vaGVhZC0+bV9wX3BhcmVudCk7CisKKyAgb3RoZXIubV9zaXplID0gc3RkOjpkaXN0YW5jZShvdGhlci5QQl9EU19DTEFTU19DX0RFQzo6YmVnaW4oKSwKKwkJCSAgICAgICBvdGhlci5QQl9EU19DTEFTU19DX0RFQzo6ZW5kKCkpOworICBtX3NpemUgLT0gb3RoZXIubV9zaXplOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmxlYWZfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3BsaXRfcHJlcChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5LCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIsCisJICAgYnJhbmNoX2JhZyYgcl9iYWcpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChyX2JhZy5lbXB0eSgpKTsKKyAgaWYgKG1fc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIG90aGVyLmNsZWFyKCk7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoc3ludGhfYWNjZXNzX3RyYWl0czo6Y21wX2tleXMocl9rZXksCisJCQkJICAgIFBCX0RTX1YyRihzdGF0aWNfY2FzdDxsZWFmX2NvbnN0X3BvaW50ZXI+KG1fcF9oZWFkLT5tX3BfbWluKS0+dmFsdWUoKSkpKQorICAgIHsKKyAgICAgIG90aGVyLmNsZWFyKCk7CisgICAgICB2YWx1ZV9zd2FwKG90aGVyKTsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmICghc3ludGhfYWNjZXNzX3RyYWl0czo6Y21wX2tleXMocl9rZXksCisJCQkJICAgICAgIFBCX0RTX1YyRihzdGF0aWNfY2FzdDxsZWFmX2NvbnN0X3BvaW50ZXI+KG1fcF9oZWFkLT5tX3BfbWF4KS0+dmFsdWUoKSkpKQorICAgIHsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGl0ZXJhdG9yIGl0ID0gbG93ZXJfYm91bmQocl9rZXkpOworCisgIGlmICghc3ludGhfYWNjZXNzX3RyYWl0czo6ZXF1YWxfa2V5cyhQQl9EU19WMkYoKml0KSwgcl9rZXkpKQorICAgIC0taXQ7CisKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBpdC5tX3BfbmQ7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3R5cGUgPT0gbGVhZl9ub2RlKTsKKyAgbGVhZl9wb2ludGVyIHBfcmV0X2wgPSBzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KHBfbmQpOworICB3aGlsZSAocF9uZC0+bV90eXBlICE9IGhlYWRfbm9kZSkKKyAgICB7CisgICAgICByX2JhZy5hZGRfYnJhbmNoKCk7CisgICAgICBwX25kID0gcF9uZC0+bV9wX3BhcmVudDsKKyAgICB9CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6c3BsaXQocl9rZXksKHN5bnRoX2FjY2Vzc190cmFpdHMmKSgqdGhpcyksIG90aGVyKTspCisKKyAgcmV0dXJuIHBfcmV0X2w7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CityZWNfc3BsaXQobm9kZV9wb2ludGVyIHBfbmQsIGFfY29uc3RfaXRlcmF0b3IgYl9pdCwgYV9jb25zdF9pdGVyYXRvciBlX2l0LAorCSAgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyLCBicmFuY2hfYmFnJiByX2JhZykKK3sKKyAgaWYgKHBfbmQtPm1fdHlwZSA9PSBsZWFmX25vZGUpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG90aGVyLm1fcF9oZWFkLT5tX3BfcGFyZW50ID09IDApOworICAgICAgcmV0dXJuIHBfbmQ7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3R5cGUgPT0gaV9ub2RlKTsKKyAgaW5vZGVfcG9pbnRlciBwX2luZCA9IHN0YXRpY19jYXN0PGlub2RlX3BvaW50ZXI+KHBfbmQpOworCisgIG5vZGVfcG9pbnRlciBwZmlyc3QgPSBwX2luZC0+Z2V0X2NoaWxkX25vZGUoYl9pdCwgZV9pdCwgdGhpcyk7CisgIG5vZGVfcG9pbnRlciBwX2NoaWxkX3JldCA9IHJlY19zcGxpdChwZmlyc3QsIGJfaXQsIGVfaXQsIG90aGVyLCByX2JhZyk7CisgIFBCX0RTX0FTU0VSVF9OT0RFX1ZBTElEKHBfY2hpbGRfcmV0KQorICBwX2luZC0+cmVwbGFjZV9jaGlsZChwX2NoaWxkX3JldCwgYl9pdCwgZV9pdCwgdGhpcyk7CisgIGFwcGx5X3VwZGF0ZShwX2luZCwgKG5vZGVfdXBkYXRlKil0aGlzKTsKKworICBpbm9kZV9pdGVyYXRvciBjaGlsZF9pdCA9IHBfaW5kLT5nZXRfY2hpbGRfaXQoYl9pdCwgZV9pdCwgdGhpcyk7CisgIGNvbnN0IHNpemVfdHlwZSBsaHNfZGlzdCA9IHN0ZDo6ZGlzdGFuY2UocF9pbmQtPmJlZ2luKCksIGNoaWxkX2l0KTsKKyAgY29uc3Qgc2l6ZV90eXBlIGxoc19udW1fY2hpbGRyZW4gPSBsaHNfZGlzdCArIDE7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChsaHNfbnVtX2NoaWxkcmVuID4gMCk7CisKKyAgY29uc3Qgc2l6ZV90eXBlIHJoc19kaXN0ID0gIHN0ZDo6ZGlzdGFuY2UocF9pbmQtPmJlZ2luKCksIHBfaW5kLT5lbmQoKSk7CisgIHNpemVfdHlwZSByaHNfbnVtX2NoaWxkcmVuID0gcmhzX2Rpc3QgLSBsaHNfbnVtX2NoaWxkcmVuOworICBpZiAocmhzX251bV9jaGlsZHJlbiA9PSAwKQorICAgIHsKKyAgICAgIGFwcGx5X3VwZGF0ZShwX2luZCwgKG5vZGVfdXBkYXRlKil0aGlzKTsKKyAgICAgIHJldHVybiBwX2luZDsKKyAgICB9CisKKyAgb3RoZXIuc3BsaXRfaW5zZXJ0X2JyYW5jaChwX2luZC0+Z2V0X2VfaW5kKCksIGJfaXQsIGNoaWxkX2l0LAorCQkJICAgIHJoc19udW1fY2hpbGRyZW4sIHJfYmFnKTsKKworICBjaGlsZF9pdCA9IHBfaW5kLT5nZXRfY2hpbGRfaXQoYl9pdCwgZV9pdCwgdGhpcyk7CisgIHdoaWxlIChyaHNfbnVtX2NoaWxkcmVuICE9IDApCisgICAgeworICAgICAgKytjaGlsZF9pdDsKKyAgICAgIHBfaW5kLT5yZW1vdmVfY2hpbGQoY2hpbGRfaXQpOworICAgICAgLS1yaHNfbnVtX2NoaWxkcmVuOworICAgIH0KKyAgYXBwbHlfdXBkYXRlKHBfaW5kLCAobm9kZV91cGRhdGUqKXRoaXMpOworCisgIGNvbnN0IHNpemVfdHlwZSBpbnRfZGlzdCA9IHN0ZDo6ZGlzdGFuY2UocF9pbmQtPmJlZ2luKCksIHBfaW5kLT5lbmQoKSk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpbnRfZGlzdCA+PSAxKTsKKyAgaWYgKGludF9kaXN0ID4gMSkKKyAgICB7CisgICAgICBwX2luZC0+dXBkYXRlX3ByZWZpeGVzKHRoaXMpOworICAgICAgUEJfRFNfQVNTRVJUX05PREVfVkFMSUQocF9pbmQpCisgICAgICBhcHBseV91cGRhdGUocF9pbmQsIChub2RlX3VwZGF0ZSopdGhpcyk7CisgICAgICByZXR1cm4gcF9pbmQ7CisgICAgfQorCisgIG5vZGVfcG9pbnRlciBwX3JldCA9ICpwX2luZC0+YmVnaW4oKTsKKyAgcF9pbmQtPn5pbm9kZSgpOworICBzX2lub2RlX2FsbG9jYXRvci5kZWFsbG9jYXRlKHBfaW5kLCAxKTsKKyAgYXBwbHlfdXBkYXRlKHBfcmV0LCAobm9kZV91cGRhdGUqKXRoaXMpOworICByZXR1cm4gcF9yZXQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxpdF9pbnNlcnRfYnJhbmNoKHNpemVfdHlwZSBlX2luZCwgYV9jb25zdF9pdGVyYXRvciBiX2l0LAorCQkgICAgaW5vZGVfaXRlcmF0b3IgY2hpbGRfYl9pdCwKKwkJICAgIHNpemVfdHlwZSBudW1fY2hpbGRyZW4sIGJyYW5jaF9iYWcmIHJfYmFnKQoreworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgIGlmIChtX3BfaGVhZC0+bV9wX3BhcmVudCAhPSAwKQorICAgIFBCX0RTX0FTU0VSVF9OT0RFX1ZBTElEKG1fcF9oZWFkLT5tX3BfcGFyZW50KQorI2VuZGlmCisKKyAgY29uc3Qgc2l6ZV90eXBlIHN0YXJ0ID0gbV9wX2hlYWQtPm1fcF9wYXJlbnQgPT0gMCA/IDAgOiAxOworICBjb25zdCBzaXplX3R5cGUgdG90YWxfbnVtX2NoaWxkcmVuID0gc3RhcnQgKyBudW1fY2hpbGRyZW47CisgIGlmICh0b3RhbF9udW1fY2hpbGRyZW4gPT0gMCkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX2hlYWQtPm1fcF9wYXJlbnQgPT0gMCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICh0b3RhbF9udW1fY2hpbGRyZW4gPT0gMSkKKyAgICB7CisgICAgICBpZiAobV9wX2hlYWQtPm1fcF9wYXJlbnQgIT0gMCkKKwl7CisJICBQQl9EU19BU1NFUlRfTk9ERV9WQUxJRChtX3BfaGVhZC0+bV9wX3BhcmVudCkKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfaGVhZC0+bV9wX3BhcmVudCA9PSAwKTsKKyAgICAgICsrY2hpbGRfYl9pdDsKKyAgICAgIG1fcF9oZWFkLT5tX3BfcGFyZW50ID0gKmNoaWxkX2JfaXQ7CisgICAgICBtX3BfaGVhZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudCA9IG1fcF9oZWFkOworICAgICAgYXBwbHlfdXBkYXRlKG1fcF9oZWFkLT5tX3BfcGFyZW50LCAobm9kZV91cGRhdGUqKXRoaXMpOworICAgICAgUEJfRFNfQVNTRVJUX05PREVfVkFMSUQobV9wX2hlYWQtPm1fcF9wYXJlbnQpCisgICAgICByZXR1cm47CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCh0b3RhbF9udW1fY2hpbGRyZW4gPiAxKTsKKyAgaW5vZGVfcG9pbnRlciBwX25ld19yb290ID0gcl9iYWcuZ2V0X2JyYW5jaCgpOworICBuZXcgKHBfbmV3X3Jvb3QpIGlub2RlKGVfaW5kLCBiX2l0KTsKKyAgc2l6ZV90eXBlIG51bV9pbnNlcnRlZCA9IDA7CisgIHdoaWxlIChudW1faW5zZXJ0ZWQrKyA8IG51bV9jaGlsZHJlbikKKyAgICB7CisgICAgICArK2NoaWxkX2JfaXQ7CisgICAgICBQQl9EU19BU1NFUlRfTk9ERV9WQUxJRCgoKmNoaWxkX2JfaXQpKQorICAgICAgcF9uZXdfcm9vdC0+YWRkX2NoaWxkKCpjaGlsZF9iX2l0LCBwcmVmX2JlZ2luKCpjaGlsZF9iX2l0KSwKKwkJCSAgICBwcmVmX2VuZCgqY2hpbGRfYl9pdCksIHRoaXMpOworICAgIH0KKworICBpZiAobV9wX2hlYWQtPm1fcF9wYXJlbnQgIT0gMCkKKyAgICBwX25ld19yb290LT5hZGRfY2hpbGQobV9wX2hlYWQtPm1fcF9wYXJlbnQsCisJCQkgIHByZWZfYmVnaW4obV9wX2hlYWQtPm1fcF9wYXJlbnQpLAorCQkJICBwcmVmX2VuZChtX3BfaGVhZC0+bV9wX3BhcmVudCksIHRoaXMpOworCisgIG1fcF9oZWFkLT5tX3BfcGFyZW50ID0gcF9uZXdfcm9vdDsKKyAgcF9uZXdfcm9vdC0+bV9wX3BhcmVudCA9IG1fcF9oZWFkOworICBhcHBseV91cGRhdGUobV9wX2hlYWQtPm1fcF9wYXJlbnQsIChub2RlX3VwZGF0ZSopdGhpcyk7CisgIFBCX0RTX0FTU0VSVF9OT0RFX1ZBTElEKG1fcF9oZWFkLT5tX3BfcGFyZW50KQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9zeW50aF9hY2Nlc3NfdHJhaXRzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vc3ludGhfYWNjZXNzX3RyYWl0cy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUzOWE2OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vc3ludGhfYWNjZXNzX3RyYWl0cy5ocHAKQEAgLTAsMCArMSwyMTggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcGF0X3RyaWVfL3N5bnRoX2FjY2Vzc190cmFpdHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBwYXRyaWNpYSB0cmVlLgorICovCisKKyNpZm5kZWYgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX0hQUAorI2RlZmluZSBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKworI2RlZmluZSBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVfVHJhaXRzLCBib29sIFNldCwgdHlwZW5hbWUgX0FUcmFpdHM+CisKKyNkZWZpbmUgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX0NfREVDIFwKKyAgICBzeW50aF9hY2Nlc3NfdHJhaXRzPFR5cGVfVHJhaXRzLCBTZXQsIF9BVHJhaXRzPgorCisgICAgLy8vIFN5bnRoZXRpYyBlbGVtZW50IGFjY2VzcyB0cmFpdHMuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZV9UcmFpdHMsIGJvb2wgU2V0LCB0eXBlbmFtZSBfQVRyYWl0cz4KKyAgICBzdHJ1Y3Qgc3ludGhfYWNjZXNzX3RyYWl0cyA6IHB1YmxpYyBfQVRyYWl0cworICAgIHsKKyAgICAgIHR5cGVkZWYgX0FUcmFpdHMgCQkJCQliYXNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IJY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIFR5cGVfVHJhaXRzIAkJCQl0eXBlX3RyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHlwZV90cmFpdHM6OmNvbnN0X3JlZmVyZW5jZSAJY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0eXBlX3RyYWl0czo6a2V5X2NvbnN0X3JlZmVyZW5jZSBrZXlfY29uc3RfcmVmZXJlbmNlOworCisgICAgICBzeW50aF9hY2Nlc3NfdHJhaXRzKCk7CisKKyAgICAgIHN5bnRoX2FjY2Vzc190cmFpdHMoY29uc3QgYmFzZV90eXBlJik7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBlcXVhbF9wcmVmaXhlcyhjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yLAorCQkgICAgIGNvbnN0X2l0ZXJhdG9yLCBib29sIGNvbXBhcmVfYWZ0ZXIgPSB0cnVlKSBjb25zdDsKKworICAgICAgYm9vbAorICAgICAgZXF1YWxfa2V5cyhrZXlfY29uc3RfcmVmZXJlbmNlLCBrZXlfY29uc3RfcmVmZXJlbmNlKSBjb25zdDsKKworICAgICAgYm9vbAorICAgICAgY21wX3ByZWZpeGVzKGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3IsCisJCSAgIGNvbnN0X2l0ZXJhdG9yLCBib29sIGNvbXBhcmVfYWZ0ZXIgPSBmYWxzZSkgY29uc3Q7CisKKyAgICAgIGJvb2wKKyAgICAgIGNtcF9rZXlzKGtleV9jb25zdF9yZWZlcmVuY2UsIGtleV9jb25zdF9yZWZlcmVuY2UpIGNvbnN0OworCisgICAgICBpbmxpbmUgc3RhdGljIGtleV9jb25zdF9yZWZlcmVuY2UKKyAgICAgIGV4dHJhY3Rfa2V5KGNvbnN0X3JlZmVyZW5jZSk7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShrZXlfY29uc3RfcmVmZXJlbmNlLCBrZXlfY29uc3RfcmVmZXJlbmNlKTsKKyNlbmRpZgorCisgICAgcHJpdmF0ZToKKyAgICAgIGlubGluZSBzdGF0aWMga2V5X2NvbnN0X3JlZmVyZW5jZQorICAgICAgZXh0cmFjdF9rZXkoY29uc3RfcmVmZXJlbmNlLCB0cnVlX3R5cGUpOworCisgICAgICBpbmxpbmUgc3RhdGljIGtleV9jb25zdF9yZWZlcmVuY2UKKyAgICAgIGV4dHJhY3Rfa2V5KGNvbnN0X3JlZmVyZW5jZSwgZmFsc2VfdHlwZSk7CisKKyAgICAgIHN0YXRpYyBpbnRlZ3JhbF9jb25zdGFudDxpbnQsIFNldD4gc19zZXRfaW5kOworICAgIH07CisKKyAgICBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfVF9ERUMKKyAgICBpbnRlZ3JhbF9jb25zdGFudDxpbnQsU2V0PgorICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19DX0RFQzo6c19zZXRfaW5kOworCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX1RfREVDCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX0NfREVDOjoKKyAgICBzeW50aF9hY2Nlc3NfdHJhaXRzKCkKKyAgICB7IH0KKworICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19UX0RFQworICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19DX0RFQzo6CisgICAgc3ludGhfYWNjZXNzX3RyYWl0cyhjb25zdCBfQVRyYWl0cyYgcl90cmFpdHMpIAorICAgIDogX0FUcmFpdHMocl90cmFpdHMpCisgICAgeyB9CisKKyAgICBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfVF9ERUMKKyAgICBpbmxpbmUgYm9vbAorICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19DX0RFQzo6CisgICAgZXF1YWxfcHJlZml4ZXMoY29uc3RfaXRlcmF0b3IgYl9sLCBjb25zdF9pdGVyYXRvciBlX2wsIGNvbnN0X2l0ZXJhdG9yIGJfciwKKwkJICAgY29uc3RfaXRlcmF0b3IgZV9yLCBib29sIGNvbXBhcmVfYWZ0ZXIgLyo9IGZhbHNlICovKSBjb25zdAorICAgIHsKKyAgICAgIHdoaWxlIChiX2wgIT0gZV9sKQorCXsKKwkgIGlmIChiX3IgPT0gZV9yKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBpZiAoYmFzZV90eXBlOjplX3BvcygqYl9sKSAhPSBiYXNlX3R5cGU6OmVfcG9zKCpiX3IpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICArK2JfbDsKKwkgICsrYl9yOworCX0KKyAgICAgIHJldHVybiAoIWNvbXBhcmVfYWZ0ZXIgfHwgYl9yID09IGVfcik7CisgICAgfQorCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX1RfREVDCisgICAgYm9vbAorICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19DX0RFQzo6CisgICAgZXF1YWxfa2V5cyhrZXlfY29uc3RfcmVmZXJlbmNlIHJfbGhzX2tleSwKKwkgICAgICAga2V5X2NvbnN0X3JlZmVyZW5jZSByX3Joc19rZXkpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGVxdWFsX3ByZWZpeGVzKGJhc2VfdHlwZTo6YmVnaW4ocl9saHNfa2V5KSwKKwkJCSAgICBiYXNlX3R5cGU6OmVuZChyX2xoc19rZXkpLAorCQkJICAgIGJhc2VfdHlwZTo6YmVnaW4ocl9yaHNfa2V5KSwKKwkJCSAgICBiYXNlX3R5cGU6OmVuZChyX3Joc19rZXkpLAorCQkJICAgIHRydWUpOworICAgIH0KKworICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19UX0RFQworICAgIGJvb2wKKyAgICBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfQ19ERUM6OgorICAgIGNtcF9wcmVmaXhlcyhjb25zdF9pdGVyYXRvciBiX2wsIGNvbnN0X2l0ZXJhdG9yIGVfbCwgY29uc3RfaXRlcmF0b3IgYl9yLAorCQkgY29uc3RfaXRlcmF0b3IgZV9yLCBib29sIGNvbXBhcmVfYWZ0ZXIgLyogPSBmYWxzZSovKSBjb25zdAorICAgIHsKKyAgICAgIHdoaWxlIChiX2wgIT0gZV9sKQorCXsKKwkgIGlmIChiX3IgPT0gZV9yKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIGNvbnN0IHR5cGVuYW1lIGJhc2VfdHlwZTo6c2l6ZV90eXBlIGxfcG9zID0gYmFzZV90eXBlOjplX3BvcygqYl9sKTsKKwkgIGNvbnN0IHR5cGVuYW1lIGJhc2VfdHlwZTo6c2l6ZV90eXBlIHJfcG9zID0gYmFzZV90eXBlOjplX3BvcygqYl9yKTsKKwkgIGlmIChsX3BvcyAhPSByX3BvcykKKwkgICAgcmV0dXJuIGxfcG9zIDwgcl9wb3M7CisJICArK2JfbDsKKwkgICsrYl9yOworCX0KKworICAgICAgaWYgKCFjb21wYXJlX2FmdGVyKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiBiX3IgIT0gZV9yOworICAgIH0KKworICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19UX0RFQworICAgIGJvb2wKKyAgICBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfQ19ERUM6OgorICAgIGNtcF9rZXlzKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9saHNfa2V5LAorCSAgICAga2V5X2NvbnN0X3JlZmVyZW5jZSByX3Joc19rZXkpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGNtcF9wcmVmaXhlcyhiYXNlX3R5cGU6OmJlZ2luKHJfbGhzX2tleSksCisJCQkgIGJhc2VfdHlwZTo6ZW5kKHJfbGhzX2tleSksCisJCQkgIGJhc2VfdHlwZTo6YmVnaW4ocl9yaHNfa2V5KSwKKwkJCSAgYmFzZV90eXBlOjplbmQocl9yaHNfa2V5KSwKKwkJCSAgdHJ1ZSk7CisgICAgfQorCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19DX0RFQzo6a2V5X2NvbnN0X3JlZmVyZW5jZQorICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19DX0RFQzo6CisgICAgZXh0cmFjdF9rZXkoY29uc3RfcmVmZXJlbmNlIHJfdmFsKQorICAgIHsgcmV0dXJuIGV4dHJhY3Rfa2V5KHJfdmFsLCBzX3NldF9pbmQpOyB9CisKKyAgICBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX0NfREVDOjprZXlfY29uc3RfcmVmZXJlbmNlCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX0NfREVDOjoKKyAgICBleHRyYWN0X2tleShjb25zdF9yZWZlcmVuY2Ugcl92YWwsIHRydWVfdHlwZSkKKyAgICB7IHJldHVybiByX3ZhbDsgfQorCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19DX0RFQzo6a2V5X2NvbnN0X3JlZmVyZW5jZQorICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19DX0RFQzo6CisgICAgZXh0cmFjdF9rZXkoY29uc3RfcmVmZXJlbmNlIHJfdmFsLCBmYWxzZV90eXBlKQorICAgIHsgcmV0dXJuIHJfdmFsLmZpcnN0OyB9CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19UX0RFQworICAgIGJvb2wKKyAgICBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfQ19ERUM6OgorICAgIG9wZXJhdG9yKCkoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2xocywga2V5X2NvbnN0X3JlZmVyZW5jZSByX3JocykKKyAgICB7IHJldHVybiBjbXBfa2V5cyhyX2xocywgcl9yaHMpOyB9CisjZW5kaWYKKworI3VuZGVmIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19UX0RFQworI3VuZGVmIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19DX0RFQworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vdHJhY2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3RyYWNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYjUwNzAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3RyYWNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTExIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBhdF90cmllXy90cmFjZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHBhdF90cmllXy4KKyAqLworCisjaWZkZWYgUEJfRFNfUEFUX1RSSUVfVFJBQ0VfCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0cmFjZSgpIGNvbnN0Cit7CisgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7CisgIGlmIChtX3BfaGVhZC0+bV9wX3BhcmVudCA9PSAwKQorICAgIHJldHVybjsKKyAgdHJhY2Vfbm9kZShtX3BfaGVhZC0+bV9wX3BhcmVudCwgMCk7CisgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0cmFjZV9ub2RlKG5vZGVfY29uc3RfcG9pbnRlciBwX25kLCBzaXplX3R5cGUgbGV2ZWwpCit7CisgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbGV2ZWw7ICsraSkKKyAgICBzdGQ6OmNlcnIgPDwgJyAnOworICBzdGQ6OmNlcnIgPDwgcF9uZCA8PCAiICI7CisgIHN0ZDo6Y2VyciA8PCAoKHBfbmQtPm1fdHlwZSA9PSBwYXRfdHJpZV9sZWFmX25vZGVfdHlwZSkgPyAibCAiIDogImkgIik7CisKKyAgdHJhY2Vfbm9kZV9tZXRhZGF0YShwX25kLCB0eXBlX3RvX3R5cGU8dHlwZW5hbWUgbm9kZTo6bWV0YWRhdGFfdHlwZT4oKSk7CisgIHR5cGVuYW1lIGFjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGVsX2l0ID0gcHJlZl9iZWdpbihwX25kKTsKKyAgd2hpbGUgKGVsX2l0ICE9IHByZWZfZW5kKHBfbmQpKQorICAgIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCogZWxfaXQ7CisgICAgICArK2VsX2l0OworICAgIH0KKworICBpZiAocF9uZC0+bV90eXBlID09IHBhdF90cmllX2xlYWZfbm9kZV90eXBlKQorICAgIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlub2RlX2NvbnN0X3BvaW50ZXIgcF9pbnRlcm5hbCA9IHN0YXRpY19jYXN0PGlub2RlX2NvbnN0X3BvaW50ZXI+KHBfbmQpOworCisgIHN0ZDo6Y2VyciA8PCAiICIgPDwKKyAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihwX2ludGVybmFsLT5nZXRfZV9pbmQoKSkgPDwgc3RkOjplbmRsOworCisgIGNvbnN0IHNpemVfdHlwZSBudW1fY2hpbGRyZW4gPSBzdGQ6OmRpc3RhbmNlKHBfaW50ZXJuYWwtPmJlZ2luKCksCisJCQkJCSAgICAgICBwX2ludGVybmFsLT5lbmQoKSk7CisKKyAgZm9yIChzaXplX3R5cGUgY2hpbGRfaSA9IDA7IGNoaWxkX2kgPCBudW1fY2hpbGRyZW47ICsrY2hpbGRfaSkKKyAgICB7CisgICAgICB0eXBlbmFtZSBpbm9kZTo6Y29uc3RfaXRlcmF0b3IgY2hpbGRfaXQgPSBwX2ludGVybmFsLT5iZWdpbigpOworICAgICAgc3RkOjphZHZhbmNlKGNoaWxkX2l0LCBudW1fY2hpbGRyZW4gLSBjaGlsZF9pIC0gMSk7CisgICAgICB0cmFjZV9ub2RlKCpjaGlsZF9pdCwgbGV2ZWwgKyAxKTsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBNZXRhZGF0YV8+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0cmFjZV9ub2RlX21ldGFkYXRhKG5vZGVfY29uc3RfcG9pbnRlciBwX25kLCB0eXBlX3RvX3R5cGU8TWV0YWRhdGFfPikKK3sKKyAgc3RkOjpjZXJyIDw8ICIoIiA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihwX25kLT5nZXRfbWV0YWRhdGEoKSkgPDwgIikgIjsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RyYWNlX25vZGVfbWV0YWRhdGEobm9kZV9jb25zdF9wb2ludGVyLCB0eXBlX3RvX3R5cGU8bnVsbF90eXBlPikKK3sgfQorCisjZW5kaWYgCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vdHJhaXRzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vdHJhaXRzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzRiOTNlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy90cmFpdHMuaHBwCkBAIC0wLDAgKzEsMTQ4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBhdF90cmllXy90cmFpdHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgcGF0X3RyaWVfLgorICovCisKKyNpZm5kZWYgUEJfRFNfUEFUX1RSSUVfTk9ERV9BTkRfSVRfVFJBSVRTX0hQUAorI2RlZmluZSBQQl9EU19QQVRfVFJJRV9OT0RFX0FORF9JVF9UUkFJVFNfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9wYXRfdHJpZV9iYXNlLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9zeW50aF9hY2Nlc3NfdHJhaXRzLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIFNwZWNpYWxpemF0aW9uLgorICAgIC8vLyBAaW5ncm91cCB0cmFpdHMKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgICB0eXBlbmFtZSBNYXBwZWQsCisJICAgICB0eXBlbmFtZSBfQVRyYWl0cywKKwkgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwKKwkJICAgICAgdHlwZW5hbWUgTm9kZV9JdHIsCisJCSAgICAgIHR5cGVuYW1lIENtcF9Gbl8sCisJCSAgICAgIHR5cGVuYW1lIF9BbGxvY18+CisJICAgICBjbGFzcyBOb2RlX1VwZGF0ZSwKKwkgICAgIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgdHJpZV90cmFpdHM8S2V5LCBNYXBwZWQsIF9BVHJhaXRzLCBOb2RlX1VwZGF0ZSwgcGF0X3RyaWVfdGFnLCBfQWxsb2M+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHBhdF90cmllX2Jhc2UJCQkJICAgIAliYXNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVzX3RyYWl0czxLZXksIE1hcHBlZCwgX0FsbG9jLCBmYWxzZT4gCQl0eXBlX3RyYWl0czsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJpZV9ub2RlX21ldGFkYXRhX2Rpc3BhdGNoPEtleSwgTWFwcGVkLCBfQVRyYWl0cywgTm9kZV9VcGRhdGUsIF9BbGxvYz46OnR5cGUgbWV0YWRhdGFfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzZV90eXBlOjpfTWV0YWRhdGE8bWV0YWRhdGFfdHlwZSwgX0FsbG9jPiAgICAgIAltZXRhZGF0YTsKKyAgICAgIHR5cGVkZWYgX0FUcmFpdHMgCQkgICAgICAgCQkJICAgICAgIAlhY2Nlc3NfdHJhaXRzOworCisgICAgICAvLy8gVHlwZSBmb3Igc3ludGhlc2l6ZWQgdHJhaXRzLgorICAgICAgdHlwZWRlZiBfX2dudV9wYmRzOjpkZXRhaWw6OnN5bnRoX2FjY2Vzc190cmFpdHM8dHlwZV90cmFpdHMsIGZhbHNlLCBhY2Nlc3NfdHJhaXRzPiAgIHN5bnRoX2FjY2Vzc190cmFpdHM7CisKKyAgICAgIHR5cGVkZWYgYmFzZV90eXBlOjpfTm9kZV9iYXNlPHN5bnRoX2FjY2Vzc190cmFpdHMsIG1ldGFkYXRhPiAgICAgCW5vZGU7CisgICAgICB0eXBlZGVmIGJhc2VfdHlwZTo6X0hlYWQ8c3ludGhfYWNjZXNzX3RyYWl0cywgbWV0YWRhdGE+CSAgICAgICAJaGVhZDsKKyAgICAgIHR5cGVkZWYgYmFzZV90eXBlOjpfTGVhZjxzeW50aF9hY2Nlc3NfdHJhaXRzLCBtZXRhZGF0YT4JICAgICAgIAlsZWFmOworICAgICAgdHlwZWRlZiBiYXNlX3R5cGU6Ol9Jbm9kZTxzeW50aF9hY2Nlc3NfdHJhaXRzLCBtZXRhZGF0YT4gCQlpbm9kZTsKKworICAgICAgdHlwZWRlZiBiYXNlX3R5cGU6Ol9JdGVyPG5vZGUsIGxlYWYsIGhlYWQsIGlub2RlLCB0cnVlPgkgICAgICAgCWl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBiYXNlX3R5cGU6Ol9DSXRlcjxub2RlLCBsZWFmLCBoZWFkLCBpbm9kZSwgdHJ1ZT4gCSAJY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIGJhc2VfdHlwZTo6X0l0ZXI8bm9kZSwgbGVhZiwgaGVhZCwgaW5vZGUsIGZhbHNlPiAJCXJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIGJhc2VfdHlwZTo6X0NJdGVyPG5vZGUsIGxlYWYsIGhlYWQsIGlub2RlLCBmYWxzZT4JIAljb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICAvLy8gVGhpcyBpcyBhbiBpdGVyYXRvciB0byBhbiBpdGVyYXRvcjogaXQgaXRlcmF0ZXMgb3ZlciBub2RlcywKKyAgICAgIC8vLyBhbmQgZGUtcmVmZXJlbmNpbmcgaXQgcmV0dXJucyBvbmUgb2YgdGhlIHRyZWUncyBpdGVyYXRvcnMuCisgICAgICB0eXBlZGVmIGJhc2VfdHlwZTo6X05vZGVfY2l0ZXI8bm9kZSwgbGVhZiwgaGVhZCwgaW5vZGUsIGNvbnN0X2l0ZXJhdG9yLCBpdGVyYXRvciwgX0FsbG9jPiBub2RlX2NvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIGJhc2VfdHlwZTo6X05vZGVfaXRlcjxub2RlLCBsZWFmLCBoZWFkLCBpbm9kZSwgY29uc3RfaXRlcmF0b3IsIGl0ZXJhdG9yLCBfQWxsb2M+IG5vZGVfaXRlcmF0b3I7CisKKyAgICAgIC8vLyBUeXBlIGZvciBub2RlIHVwZGF0ZS4KKyAgICAgIHR5cGVkZWYgTm9kZV9VcGRhdGU8bm9kZV9jb25zdF9pdGVyYXRvciwgbm9kZV9pdGVyYXRvciwgX0FUcmFpdHMsIF9BbGxvYz4gCQlub2RlX3VwZGF0ZTsKKworICAgICAgdHlwZWRlZiBudWxsX25vZGVfdXBkYXRlPG5vZGVfY29uc3RfaXRlcmF0b3IsIG5vZGVfaXRlcmF0b3IsIF9BVHJhaXRzLCBfQWxsb2M+KiAJCW51bGxfbm9kZV91cGRhdGVfcG9pbnRlcjsKKyAgICB9OworCisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24uCisgICAgLy8vIEBpbmdyb3VwIHRyYWl0cworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICAgIHR5cGVuYW1lIF9BVHJhaXRzLAorCSAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9DSXRyLAorCQkgICAgICB0eXBlbmFtZSBOb2RlX0l0ciwKKwkJICAgICAgdHlwZW5hbWUgQ21wX0ZuXywKKwkJICAgICAgdHlwZW5hbWUgX0FsbG9jXz4KKwkgICAgIGNsYXNzIE5vZGVfVXBkYXRlLAorCSAgICAgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCB0cmllX3RyYWl0czxLZXksIG51bGxfdHlwZSwgX0FUcmFpdHMsIE5vZGVfVXBkYXRlLCBwYXRfdHJpZV90YWcsIF9BbGxvYz4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgcGF0X3RyaWVfYmFzZQkJCQkJYmFzZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlc190cmFpdHM8S2V5LCBudWxsX3R5cGUsIF9BbGxvYywgZmFsc2U+IAl0eXBlX3RyYWl0czsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJpZV9ub2RlX21ldGFkYXRhX2Rpc3BhdGNoPEtleSwgbnVsbF90eXBlLCBfQVRyYWl0cywgTm9kZV9VcGRhdGUsIF9BbGxvYz46OnR5cGUgbWV0YWRhdGFfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzZV90eXBlOjpfTWV0YWRhdGE8bWV0YWRhdGFfdHlwZSwgX0FsbG9jPgkJCQltZXRhZGF0YTsKKyAgICAgIHR5cGVkZWYgX0FUcmFpdHMgCQkJCSAgICAgCQkJCQlhY2Nlc3NfdHJhaXRzOworCisgICAgICAvLy8gVHlwZSBmb3Igc3ludGhlc2l6ZWQgdHJhaXRzLgorICAgICAgdHlwZWRlZiBfX2dudV9wYmRzOjpkZXRhaWw6OnN5bnRoX2FjY2Vzc190cmFpdHM8dHlwZV90cmFpdHMsIHRydWUsIGFjY2Vzc190cmFpdHM+IHN5bnRoX2FjY2Vzc190cmFpdHM7CisKKyAgICAgIHR5cGVkZWYgYmFzZV90eXBlOjpfTm9kZV9iYXNlPHN5bnRoX2FjY2Vzc190cmFpdHMsIG1ldGFkYXRhPiAgICAgCW5vZGU7CisgICAgICB0eXBlZGVmIGJhc2VfdHlwZTo6X0hlYWQ8c3ludGhfYWNjZXNzX3RyYWl0cywgbWV0YWRhdGE+IAkgICAgICAgCWhlYWQ7CisgICAgICB0eXBlZGVmIGJhc2VfdHlwZTo6X0xlYWY8c3ludGhfYWNjZXNzX3RyYWl0cywgbWV0YWRhdGE+IAkgICAgICAgCWxlYWY7CisgICAgICB0eXBlZGVmIGJhc2VfdHlwZTo6X0lub2RlPHN5bnRoX2FjY2Vzc190cmFpdHMsIG1ldGFkYXRhPiAJICAgICAgIAlpbm9kZTsKKworICAgICAgdHlwZWRlZiBiYXNlX3R5cGU6Ol9DSXRlcjxub2RlLCBsZWFmLCBoZWFkLCBpbm9kZSwgdHJ1ZT4gCQljb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3IgCQkJCQkgICAgICAgCWl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBiYXNlX3R5cGU6Ol9DSXRlcjxub2RlLCBsZWFmLCBoZWFkLCBpbm9kZSwgZmFsc2U+CSAgICAgICAJY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciAJCQkgICAgICAgCQlyZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICAvLy8gVGhpcyBpcyBhbiBpdGVyYXRvciB0byBhbiBpdGVyYXRvcjogaXQgaXRlcmF0ZXMgb3ZlciBub2RlcywKKyAgICAgIC8vLyBhbmQgZGUtcmVmZXJlbmNpbmcgaXQgcmV0dXJucyBvbmUgb2YgdGhlIHRyZWUncyBpdGVyYXRvcnMuCisgICAgICB0eXBlZGVmIGJhc2VfdHlwZTo6X05vZGVfY2l0ZXI8bm9kZSwgbGVhZiwgaGVhZCwgaW5vZGUsIGNvbnN0X2l0ZXJhdG9yLCBpdGVyYXRvciwgX0FsbG9jPiBub2RlX2NvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIG5vZGVfY29uc3RfaXRlcmF0b3IgCQkJCQkJCQlub2RlX2l0ZXJhdG9yOworCisgICAgICAvLy8gVHlwZSBmb3Igbm9kZSB1cGRhdGUuCisgICAgICB0eXBlZGVmIE5vZGVfVXBkYXRlPG5vZGVfY29uc3RfaXRlcmF0b3IsIG5vZGVfaXRlcmF0b3IsIF9BVHJhaXRzLCBfQWxsb2M+IAkJbm9kZV91cGRhdGU7CisKKyAgICAgIHR5cGVkZWYgbnVsbF9ub2RlX3VwZGF0ZTxub2RlX2NvbnN0X2l0ZXJhdG9yLCBub2RlX2NvbnN0X2l0ZXJhdG9yLCBfQVRyYWl0cywgX0FsbG9jPiogCW51bGxfbm9kZV91cGRhdGVfcG9pbnRlcjsKKyAgICB9OworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19QQVRfVFJJRV9OT0RFX0FORF9JVF9UUkFJVFNfSFBQCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3VwZGF0ZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vdXBkYXRlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYzBmYmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3VwZGF0ZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDU1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBhdF90cmllXy91cGRhdGVfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBwYXRfdHJpZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CithcHBseV91cGRhdGUobm9kZV9wb2ludGVyLCBudWxsX25vZGVfdXBkYXRlX3BvaW50ZXIpCit7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIE5vZGVfVXBkYXRlXz4KK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CithcHBseV91cGRhdGUobm9kZV9wb2ludGVyIHBfbmQsIE5vZGVfVXBkYXRlXyopCit7CisgIE5vZGVfVXBkYXRlXzo6b3BlcmF0b3IoKShub2RlX2l0ZXJhdG9yKHBfbmQsIHRoaXMpLAorCQkJICAgbm9kZV9jb25zdF9pdGVyYXRvcigwLCB0aGlzKSk7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcHJpb3JpdHlfcXVldWVfYmFzZV9kaXNwYXRjaC5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcHJpb3JpdHlfcXVldWVfYmFzZV9kaXNwYXRjaC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlOTE1OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9wcmlvcml0eV9xdWV1ZV9iYXNlX2Rpc3BhdGNoLmhwcApAQCAtMCwwICsxLDExNCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBkZXRhaWwvcHJpb3JpdHlfcXVldWVfYmFzZV9kaXNwYXRjaC5ocHAKKyAqIENvbnRhaW5zIGFuIHBxaWF0aXZlIGNvbnRhaW5lciBkaXNwYXRjaGluZyBiYXNlLgorICovCisKKyNpZm5kZWYgUEJfRFNfUFJJT1JJVFlfUVVFVUVfQkFTRV9EU19ESVNQQVRDSEVSX0hQUAorI2RlZmluZSBQQl9EU19QUklPUklUWV9RVUVVRV9CQVNFX0RTX0RJU1BBVENIRVJfSFBQCisKKyNkZWZpbmUgUEJfRFNfQVNTRVJUX1ZBTElEKFgpCQkJCQkJXAorICBfR0xJQkNYWF9ERUJVR19PTkxZKFguYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCisjZGVmaW5lIFBCX0RTX0RFQlVHX1ZFUklGWShfQ29uZCkJCQkJCVwKKyAgX0dMSUJDWFhfREVCVUdfVkVSSUZZX0FUKF9Db25kLAkJCQkJXAorCQkJICAgX01fbWVzc2FnZSgjX0NvbmQiIGFzc2VydGlvbiBmcm9tICUxOzolMjsiKQlcCisJCQkgICAuX01fc3RyaW5nKF9fRklMRV9fKS5fTV9pbnRlZ2VyKF9fTElORV9fKQlcCisJCQkgICAsX19maWxlLF9fbGluZSkKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9wYWlyaW5nX2hlYXBfLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfL2Jpbm9taWFsX2hlYXBfLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL3JjX2Jpbm9taWFsX2hlYXBfLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9iaW5hcnlfaGVhcF8uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy90aGluX2hlYXBfLmhwcD4KKworI3VuZGVmIFBCX0RTX0RFQlVHX1ZFUklGWQorI3VuZGVmIFBCX0RTX0FTU0VSVF9WQUxJRAorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIHBhaXJpbmdfaGVhcC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVlRwLCB0eXBlbmFtZSBDbXBfRm4sIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgIHN0cnVjdCBjb250YWluZXJfYmFzZV9kaXNwYXRjaDxfVlRwLCBDbXBfRm4sIF9BbGxvYywgcGFpcmluZ19oZWFwX3RhZywKKwkJCQkgICAgIG51bGxfdHlwZT4KKyAgICAgIHsKKwkvLy8gRGlzcGF0Y2hlZCB0eXBlLgorCXR5cGVkZWYgcGFpcmluZ19oZWFwPF9WVHAsIENtcF9GbiwgX0FsbG9jPiAJCXR5cGU7CisgICAgICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBiaW5vbWlhbF9oZWFwLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WVHAsIHR5cGVuYW1lIENtcF9GbiwgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgc3RydWN0IGNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoPF9WVHAsIENtcF9GbiwgX0FsbG9jLCBiaW5vbWlhbF9oZWFwX3RhZywKKwkJCQkgICAgIG51bGxfdHlwZT4KKyAgICAgIHsKKwkvLy8gRGlzcGF0Y2hlZCB0eXBlLgorCXR5cGVkZWYgYmlub21pYWxfaGVhcDxfVlRwLCBDbXBfRm4sIF9BbGxvYz4gCQl0eXBlOworICAgICAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgcmNfYmluYXJ5X2hlYXAuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZUcCwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICBzdHJ1Y3QgY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8X1ZUcCwgQ21wX0ZuLCBfQWxsb2MsIHJjX2Jpbm9taWFsX2hlYXBfdGFnLAorICAJCQkJICAgICBudWxsX3R5cGU+CisgICAgICB7CisJLy8vIERpc3BhdGNoZWQgdHlwZS4KKwl0eXBlZGVmIHJjX2Jpbm9taWFsX2hlYXA8X1ZUcCwgQ21wX0ZuLCBfQWxsb2M+CSAgICAgICAJdHlwZTsKKyAgICAgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGJpbmFyeV9oZWFwLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WVHAsIHR5cGVuYW1lIENtcF9GbiwgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgc3RydWN0IGNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoPF9WVHAsIENtcF9GbiwgX0FsbG9jLCBiaW5hcnlfaGVhcF90YWcsCisgIAkJCQkgICAgIG51bGxfdHlwZT4KKyAgICAgIHsKKwkvLy8gRGlzcGF0Y2hlZCB0eXBlLgorCXR5cGVkZWYgYmluYXJ5X2hlYXA8X1ZUcCwgQ21wX0ZuLCBfQWxsb2M+IAkJdHlwZTsKKyAgICAgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIHRoaW5faGVhcC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVlRwLCB0eXBlbmFtZSBDbXBfRm4sIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgIHN0cnVjdCBjb250YWluZXJfYmFzZV9kaXNwYXRjaDxfVlRwLCBDbXBfRm4sIF9BbGxvYywgdGhpbl9oZWFwX3RhZywKKyAgCQkJCSAgICAgbnVsbF90eXBlPiAgICAKKyAgICAgIHsKKwkvLy8gRGlzcGF0Y2hlZCB0eXBlLgorCXR5cGVkZWYgdGhpbl9oZWFwPF9WVHAsIENtcF9GbiwgX0FsbG9jPiAJCXR5cGU7CisgICAgICB9OworICAgIC8vQH0gZ3JvdXAgcGJkcworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfUFJJT1JJVFlfUVVFVUVfQkFTRV9EU19ESVNQQVRDSEVSX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwMjFmOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMDAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcmJfdHJlZV9tYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgcmJfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIEl0Pgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY29weV9mcm9tX3JhbmdlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KQoreworICB3aGlsZSAoZmlyc3RfaXQgIT0gbGFzdF9pdCkKKyAgICBpbnNlcnQoKihmaXJzdF9pdCsrKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19SQl9UUkVFX05BTUUoKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfUkJfVFJFRV9OQU1FKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4pIDoKKyAgYmFzZV90eXBlKHJfY21wX2ZuKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfUkJfVFJFRV9OQU1FKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4sIGNvbnN0IG5vZGVfdXBkYXRlJiByX25vZGVfdXBkYXRlKSA6CisgIGJhc2VfdHlwZShyX2NtcF9mbiwgcl9ub2RlX3VwZGF0ZSkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX1JCX1RSRUVfTkFNRShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpIDoKKyAgYmFzZV90eXBlKG90aGVyKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBiYXNlX3R5cGU6OnN3YXAob3RoZXIpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luaXRpYWxpemUoKQoreyBiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3JlZCA9IHRydWU7IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vZGVidWdfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YWU4MzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsODEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcmJfdHJlZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgcmJfdHJlZV8uCisgKi8KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfbm9kZV9jb25zaXN0ZW50KGNvbnN0IG5vZGVfcG9pbnRlciBwX25kLCBjb25zdCBjaGFyKiBfX2ZpbGUsCisJCQkJCQlpbnQgX19saW5lKSBjb25zdAoreworICBpZiAocF9uZCA9PSAwKQorICAgIHJldHVybiAxOworCisgIGNvbnN0IHNpemVfdHlwZSBsX2hlaWdodCA9CisgICAgYXNzZXJ0X25vZGVfY29uc2lzdGVudChwX25kLT5tX3BfbGVmdCwgX19maWxlLCBfX2xpbmUpOworICBjb25zdCBzaXplX3R5cGUgcl9oZWlnaHQgPQorICAgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF9uZC0+bV9wX3JpZ2h0LCBfX2ZpbGUsIF9fbGluZSk7CisgIGlmIChwX25kLT5tX3JlZCkKKyAgICB7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkoaXNfZWZmZWN0aXZlbHlfYmxhY2socF9uZC0+bV9wX2xlZnQpKTsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShpc19lZmZlY3RpdmVseV9ibGFjayhwX25kLT5tX3BfcmlnaHQpKTsKKyAgICB9CisgIFBCX0RTX0RFQlVHX1ZFUklGWShsX2hlaWdodCA9PSByX2hlaWdodCk7CisgIHJldHVybiAocF9uZC0+bV9yZWQgPyAwIDogMSkgKyBsX2hlaWdodDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF92YWxpZChjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGJhc2VfdHlwZTo6YXNzZXJ0X3ZhbGlkKF9fZmlsZSwgX19saW5lKTsKKyAgY29uc3Qgbm9kZV9wb2ludGVyIHBfaGVhZCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQ7CisgIFBCX0RTX0RFQlVHX1ZFUklGWShwX2hlYWQtPm1fcmVkKTsKKyAgaWYgKHBfaGVhZC0+bV9wX3BhcmVudCAhPSAwKQorICAgIHsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWSghcF9oZWFkLT5tX3BfcGFyZW50LT5tX3JlZCk7CisgICAgICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfaGVhZC0+bV9wX3BhcmVudCwgX19maWxlLCBfX2xpbmUpOworICAgIH0KK30KKworI2VuZGlmIAorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTIyMGMzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDI4OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSByYl90cmVlX21hcF8vZXJhc2VfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciByYl90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCit7CisgIHBvaW50X2l0ZXJhdG9yIGl0ID0gdGhpcy0+ZmluZChyX2tleSk7CisgIGlmIChpdCA9PSBiYXNlX3R5cGU6OmVuZCgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgZXJhc2UoaXQpOworICByZXR1cm4gdHJ1ZTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKGl0ZXJhdG9yIGl0KQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgaWYgKGl0ID09IGJhc2VfdHlwZTo6ZW5kKCkpCisgICAgcmV0dXJuIGl0OworCisgIGl0ZXJhdG9yIHJldF9pdCA9IGl0OworICArK3JldF9pdDsKKyAgZXJhc2Vfbm9kZShpdC5tX3BfbmQpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmV0dXJuIHJldF9pdDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cmV2ZXJzZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2UocmV2ZXJzZV9pdGVyYXRvciBpdCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIGlmIChpdC5tX3BfbmQgPT0gYmFzZV90eXBlOjptX3BfaGVhZCkKKyAgICByZXR1cm4gaXQ7CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByZXRfaXQgPSBpdDsKKyAgKytyZXRfaXQ7CisgIGVyYXNlX25vZGUoaXQubV9wX25kKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiByZXRfaXQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgoraW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2lmKFByZWQgcHJlZCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHNpemVfdHlwZSBudW1fZXJzZCA9IDA7CisgIGl0ZXJhdG9yIGl0ID0gYmFzZV90eXBlOjpiZWdpbigpOworICB3aGlsZSAoaXQgIT0gYmFzZV90eXBlOjplbmQoKSkKKyAgICB7CisgICAgICBpZiAocHJlZCgqaXQpKQorICAgICAgICB7CisJICArK251bV9lcnNkOworCSAgaXQgPSBlcmFzZShpdCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKwkrK2l0OworICAgIH0KKworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmV0dXJuIG51bV9lcnNkOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2Vfbm9kZShub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgcmVtb3ZlX25vZGUocF9uZCk7CisgIGJhc2VfdHlwZTo6YWN0dWFsX2VyYXNlX25vZGUocF9uZCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVtb3ZlX25vZGUobm9kZV9wb2ludGVyIHBfeikKK3sKKyAgdGhpcy0+dXBkYXRlX21pbl9tYXhfZm9yX2VyYXNlZF9ub2RlKHBfeik7CisgIG5vZGVfcG9pbnRlciBwX3kgPSBwX3o7CisgIG5vZGVfcG9pbnRlciBwX3ggPSAwOworICBub2RlX3BvaW50ZXIgcF9uZXdfeF9wYXJlbnQgPSAwOworCisgIGlmIChwX3ktPm1fcF9sZWZ0ID09IDApCisgICAgcF94ID0gcF95LT5tX3BfcmlnaHQ7CisgIGVsc2UgaWYgKHBfeS0+bV9wX3JpZ2h0ID09IDApCisgICAgcF94ID0gcF95LT5tX3BfbGVmdDsKKyAgZWxzZQorICAgIHsKKyAgICAgIHBfeSA9IHBfeS0+bV9wX3JpZ2h0OworICAgICAgd2hpbGUgKHBfeS0+bV9wX2xlZnQgIT0gMCkKKwlwX3kgPSBwX3ktPm1fcF9sZWZ0OworICAgICAgcF94ID0gcF95LT5tX3BfcmlnaHQ7CisgICAgfQorCisgIGlmIChwX3kgPT0gcF96KQorICAgIHsKKyAgICAgIHBfbmV3X3hfcGFyZW50ID0gcF95LT5tX3BfcGFyZW50OworICAgICAgaWYgKHBfeCAhPSAwKQorCXBfeC0+bV9wX3BhcmVudCA9IHBfeS0+bV9wX3BhcmVudDsKKworICAgICAgaWYgKGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQgPT0gcF96KQorCWJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX3g7CisgICAgICBlbHNlIGlmIChwX3otPm1fcF9wYXJlbnQtPm1fcF9sZWZ0ID09IHBfeikKKyAgICAgICAgeworCSAgcF95LT5tX3BfbGVmdCA9IHBfei0+bV9wX3BhcmVudDsKKwkgIHBfei0+bV9wX3BhcmVudC0+bV9wX2xlZnQgPSBwX3g7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworCSAgcF95LT5tX3BfbGVmdCA9IDA7CisJICBwX3otPm1fcF9wYXJlbnQtPm1fcF9yaWdodCA9IHBfeDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHBfei0+bV9wX2xlZnQtPm1fcF9wYXJlbnQgPSBwX3k7CisgICAgICBwX3ktPm1fcF9sZWZ0ID0gcF96LT5tX3BfbGVmdDsKKyAgICAgIGlmIChwX3kgIT0gcF96LT5tX3BfcmlnaHQpCisgICAgICAgIHsKKwkgIHBfbmV3X3hfcGFyZW50ID0gcF95LT5tX3BfcGFyZW50OworCSAgaWYgKHBfeCAhPSAwKQorCSAgICBwX3gtPm1fcF9wYXJlbnQgPSBwX3ktPm1fcF9wYXJlbnQ7CisJICBwX3ktPm1fcF9wYXJlbnQtPm1fcF9sZWZ0ID0gcF94OworCSAgcF95LT5tX3BfcmlnaHQgPSBwX3otPm1fcF9yaWdodDsKKwkgIHBfei0+bV9wX3JpZ2h0LT5tX3BfcGFyZW50ID0gcF95OworICAgICAgICB9CisgICAgICBlbHNlCisJcF9uZXdfeF9wYXJlbnQgPSBwX3k7CisKKyAgICAgIGlmIChiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50ID09IHBfeikKKwliYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50ID0gcF95OworICAgICAgZWxzZSBpZiAocF96LT5tX3BfcGFyZW50LT5tX3BfbGVmdCA9PSBwX3opCisJcF96LT5tX3BfcGFyZW50LT5tX3BfbGVmdCA9IHBfeTsKKyAgICAgIGVsc2UKKwlwX3otPm1fcF9wYXJlbnQtPm1fcF9yaWdodCA9IHBfeTsKKworICAgICAgcF95LT5tX3BfcGFyZW50ID0gcF96LT5tX3BfcGFyZW50OworICAgICAgc3RkOjpzd2FwKHBfeS0+bV9yZWQsIHBfei0+bV9yZWQpOworICAgICAgcF95ID0gcF96OworICAgIH0KKworICB0aGlzLT51cGRhdGVfdG9fdG9wKHBfbmV3X3hfcGFyZW50LCAobm9kZV91cGRhdGUqICl0aGlzKTsKKworICBpZiAocF95LT5tX3JlZCkKKyAgICByZXR1cm47CisKKyAgcmVtb3ZlX2ZpeHVwKHBfeCwgcF9uZXdfeF9wYXJlbnQpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVtb3ZlX2ZpeHVwKG5vZGVfcG9pbnRlciBwX3gsIG5vZGVfcG9pbnRlciBwX25ld194X3BhcmVudCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfeCA9PSAwIHx8IHBfeC0+bV9wX3BhcmVudCA9PSBwX25ld194X3BhcmVudCk7CisKKyAgd2hpbGUgKHBfeCAhPSBiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50ICYmIGlzX2VmZmVjdGl2ZWx5X2JsYWNrKHBfeCkpCisgICAgaWYgKHBfeCA9PSBwX25ld194X3BhcmVudC0+bV9wX2xlZnQpCisgICAgICB7CisJbm9kZV9wb2ludGVyIHBfdyA9IHBfbmV3X3hfcGFyZW50LT5tX3BfcmlnaHQ7CisJaWYgKHBfdy0+bV9yZWQpCisJICB7CisJICAgIHBfdy0+bV9yZWQgPSBmYWxzZTsKKwkgICAgcF9uZXdfeF9wYXJlbnQtPm1fcmVkID0gdHJ1ZTsKKwkgICAgYmFzZV90eXBlOjpyb3RhdGVfbGVmdChwX25ld194X3BhcmVudCk7CisJICAgIHBfdyA9IHBfbmV3X3hfcGFyZW50LT5tX3BfcmlnaHQ7CisJICB9CisKKwlpZiAoaXNfZWZmZWN0aXZlbHlfYmxhY2socF93LT5tX3BfbGVmdCkgCisJICAgICYmIGlzX2VmZmVjdGl2ZWx5X2JsYWNrKHBfdy0+bV9wX3JpZ2h0KSkKKwkgIHsKKwkgICAgcF93LT5tX3JlZCA9IHRydWU7CisJICAgIHBfeCA9IHBfbmV3X3hfcGFyZW50OworCSAgICBwX25ld194X3BhcmVudCA9IHBfbmV3X3hfcGFyZW50LT5tX3BfcGFyZW50OworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgaWYgKGlzX2VmZmVjdGl2ZWx5X2JsYWNrKHBfdy0+bV9wX3JpZ2h0KSkKKwkgICAgICB7CisJCWlmIChwX3ctPm1fcF9sZWZ0ICE9IDApCisJCSAgcF93LT5tX3BfbGVmdC0+bV9yZWQgPSBmYWxzZTsKKworCQlwX3ctPm1fcmVkID0gdHJ1ZTsKKwkJYmFzZV90eXBlOjpyb3RhdGVfcmlnaHQocF93KTsKKwkJcF93ID0gcF9uZXdfeF9wYXJlbnQtPm1fcF9yaWdodDsKKwkgICAgICB9CisKKwkgICAgcF93LT5tX3JlZCA9IHBfbmV3X3hfcGFyZW50LT5tX3JlZDsKKwkgICAgcF9uZXdfeF9wYXJlbnQtPm1fcmVkID0gZmFsc2U7CisKKwkgICAgaWYgKHBfdy0+bV9wX3JpZ2h0ICE9IDApCisJICAgICAgcF93LT5tX3BfcmlnaHQtPm1fcmVkID0gZmFsc2U7CisKKwkgICAgYmFzZV90eXBlOjpyb3RhdGVfbGVmdChwX25ld194X3BhcmVudCk7CisJICAgIHRoaXMtPnVwZGF0ZV90b190b3AocF9uZXdfeF9wYXJlbnQsIChub2RlX3VwZGF0ZSogKXRoaXMpOworCSAgICBicmVhazsKKwkgIH0KKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJbm9kZV9wb2ludGVyIHBfdyA9IHBfbmV3X3hfcGFyZW50LT5tX3BfbGVmdDsKKwlpZiAocF93LT5tX3JlZCA9PSB0cnVlKQorCSAgeworCSAgICBwX3ctPm1fcmVkID0gZmFsc2U7CisJICAgIHBfbmV3X3hfcGFyZW50LT5tX3JlZCA9IHRydWU7CisJICAgIGJhc2VfdHlwZTo6cm90YXRlX3JpZ2h0KHBfbmV3X3hfcGFyZW50KTsKKwkgICAgcF93ID0gcF9uZXdfeF9wYXJlbnQtPm1fcF9sZWZ0OworCSAgfQorCisJaWYgKGlzX2VmZmVjdGl2ZWx5X2JsYWNrKHBfdy0+bV9wX3JpZ2h0KSAKKwkgICAgJiYgaXNfZWZmZWN0aXZlbHlfYmxhY2socF93LT5tX3BfbGVmdCkpCisJICB7CisJICAgIHBfdy0+bV9yZWQgPSB0cnVlOworCSAgICBwX3ggPSBwX25ld194X3BhcmVudDsKKwkgICAgcF9uZXdfeF9wYXJlbnQgPSBwX25ld194X3BhcmVudC0+bV9wX3BhcmVudDsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGlmIChpc19lZmZlY3RpdmVseV9ibGFjayhwX3ctPm1fcF9sZWZ0KSkKKwkgICAgICB7CisJCWlmIChwX3ctPm1fcF9yaWdodCAhPSAwKQorCQkgIHBfdy0+bV9wX3JpZ2h0LT5tX3JlZCA9IGZhbHNlOworCisJCXBfdy0+bV9yZWQgPSB0cnVlOworCQliYXNlX3R5cGU6OnJvdGF0ZV9sZWZ0KHBfdyk7CisJCXBfdyA9IHBfbmV3X3hfcGFyZW50LT5tX3BfbGVmdDsKKwkgICAgICB9CisKKwkgICAgcF93LT5tX3JlZCA9IHBfbmV3X3hfcGFyZW50LT5tX3JlZDsKKwkgICAgcF9uZXdfeF9wYXJlbnQtPm1fcmVkID0gZmFsc2U7CisKKwkgICAgaWYgKHBfdy0+bV9wX2xlZnQgIT0gMCkKKwkgICAgICBwX3ctPm1fcF9sZWZ0LT5tX3JlZCA9IGZhbHNlOworCisJICAgIGJhc2VfdHlwZTo6cm90YXRlX3JpZ2h0KHBfbmV3X3hfcGFyZW50KTsKKwkgICAgdGhpcy0+dXBkYXRlX3RvX3RvcChwX25ld194X3BhcmVudCwgKG5vZGVfdXBkYXRlKiApdGhpcyk7CisJICAgIGJyZWFrOworCSAgfQorICAgICAgfQorCisgIGlmIChwX3ggIT0gMCkKKyAgICBwX3gtPm1fcmVkID0gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMzNzhkMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vZmluZF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDM5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHJiX3RyZWVfbWFwXy9maW5kX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgcmJfdHJlZV8uCisgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vaW5mb19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vaW5mb19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzA5MDk5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9pbmZvX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNDYgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcmJfdHJlZV9tYXBfL2luZm9fZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciByYl90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2lzX2VmZmVjdGl2ZWx5X2JsYWNrKGNvbnN0IG5vZGVfcG9pbnRlciBwX25kKQoreyByZXR1cm4gKHBfbmQgPT0gMCB8fCAhcF9uZC0+bV9yZWQpOyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiYTE5MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTE1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHJiX3RyZWVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciByYl90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHN0ZDo6cGFpcjx0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IsIGJvb2w+CitQQl9EU19DTEFTU19DX0RFQzo6CitpbnNlcnQoY29uc3RfcmVmZXJlbmNlIHJfdmFsdWUpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBzdGQ6OnBhaXI8cG9pbnRfaXRlcmF0b3IsIGJvb2w+IGluc19wYWlyID0gYmFzZV90eXBlOjppbnNlcnRfbGVhZihyX3ZhbHVlKTsKKyAgaWYgKGluc19wYWlyLnNlY29uZCA9PSB0cnVlKQorICAgIHsKKyAgICAgIGluc19wYWlyLmZpcnN0Lm1fcF9uZC0+bV9yZWQgPSB0cnVlOworICAgICAgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBpbnNlcnRfZml4dXAoaW5zX3BhaXIuZmlyc3QubV9wX25kKTsKKyAgICB9CisKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiBpbnNfcGFpcjsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitpbnNlcnRfZml4dXAobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3JlZCA9PSB0cnVlKTsKKyAgd2hpbGUgKHBfbmQgIT0gYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCAmJiBwX25kLT5tX3BfcGFyZW50LT5tX3JlZCkKKyAgICB7CisgICAgICBpZiAocF9uZC0+bV9wX3BhcmVudCA9PSBwX25kLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50LT5tX3BfbGVmdCkKKyAgICAgICAgeworCSAgbm9kZV9wb2ludGVyIHBfeSA9IHBfbmQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQtPm1fcF9yaWdodDsKKwkgIGlmIChwX3kgIT0gMCAmJiBwX3ktPm1fcmVkKQorICAgICAgICAgICAgeworCSAgICAgIHBfbmQtPm1fcF9wYXJlbnQtPm1fcmVkID0gZmFsc2U7CisJICAgICAgcF95LT5tX3JlZCA9IGZhbHNlOworCSAgICAgIHBfbmQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQtPm1fcmVkID0gdHJ1ZTsKKwkgICAgICBwX25kID0gcF9uZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudDsKKyAgICAgICAgICAgIH0KKwkgIGVsc2UKKyAgICAgICAgICAgIHsKKwkgICAgICBpZiAocF9uZCA9PSBwX25kLT5tX3BfcGFyZW50LT5tX3BfcmlnaHQpCisgICAgICAgICAgICAgICAgeworCQkgIHBfbmQgPSBwX25kLT5tX3BfcGFyZW50OworCQkgIGJhc2VfdHlwZTo6cm90YXRlX2xlZnQocF9uZCk7CisgICAgICAgICAgICAgICAgfQorCSAgICAgIHBfbmQtPm1fcF9wYXJlbnQtPm1fcmVkID0gZmFsc2U7CisJICAgICAgcF9uZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudC0+bV9yZWQgPSB0cnVlOworCSAgICAgIGJhc2VfdHlwZTo6cm90YXRlX3JpZ2h0KHBfbmQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIG5vZGVfcG9pbnRlciBwX3kgPSBwX25kLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50LT5tX3BfbGVmdDsKKwkgIGlmIChwX3kgIT0gMCAmJiBwX3ktPm1fcmVkKQorICAgICAgICAgICAgeworCSAgICAgIHBfbmQtPm1fcF9wYXJlbnQtPm1fcmVkID0gZmFsc2U7CisJICAgICAgcF95LT5tX3JlZCA9IGZhbHNlOworCSAgICAgIHBfbmQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQtPm1fcmVkID0gdHJ1ZTsKKwkgICAgICBwX25kID0gcF9uZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudDsKKyAgICAgICAgICAgIH0KKwkgIGVsc2UKKyAgICAgICAgICAgIHsKKwkgICAgICBpZiAocF9uZCA9PSBwX25kLT5tX3BfcGFyZW50LT5tX3BfbGVmdCkKKyAgICAgICAgICAgICAgICB7CisJCSAgcF9uZCA9IHBfbmQtPm1fcF9wYXJlbnQ7CisJCSAgYmFzZV90eXBlOjpyb3RhdGVfcmlnaHQocF9uZCk7CisgICAgICAgICAgICAgICAgfQorCSAgICAgIHBfbmQtPm1fcF9wYXJlbnQtPm1fcmVkID0gZmFsc2U7CisJICAgICAgcF9uZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudC0+bV9yZWQgPSB0cnVlOworCSAgICAgIGJhc2VfdHlwZTo6cm90YXRlX2xlZnQocF9uZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgYmFzZV90eXBlOjp1cGRhdGVfdG9fdG9wKHBfbmQsIChub2RlX3VwZGF0ZSogKXRoaXMpOworICBiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50LT5tX3JlZCA9IGZhbHNlOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9ub2RlLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vbm9kZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwNzFhNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vbm9kZS5ocHAKQEAgLTAsMCArMSwxMzkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcmJfdHJlZV9tYXBfL25vZGUuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgcmJfdHJlZV8uCisgKi8KKworI2lmbmRlZiBQQl9EU19SQl9UUkVFX05PREVfSFBQCisjZGVmaW5lIFBCX0RTX1JCX1RSRUVfTk9ERV9IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYnJhbmNoX3BvbGljeS9udWxsX25vZGVfbWV0YWRhdGEuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLy8gTm9kZSBmb3IgUmVkLUJsYWNrIHRyZWVzLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIGNsYXNzIE1ldGFkYXRhLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHJiX3RyZWVfbm9kZV8KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBWYWx1ZV9UeXBlIAkJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgTWV0YWRhdGEgCQkJbWV0YWRhdGFfdHlwZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8CisgICAgICByYl90cmVlX25vZGVfPAorICAgICAgVmFsdWVfVHlwZSwKKyAgICAgIE1ldGFkYXRhLAorICAgICAgX0FsbG9jPiA+OjpvdGhlcjo6cG9pbnRlcgorICAgICAgbm9kZV9wb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDwKKwltZXRhZGF0YV90eXBlPjo6b3RoZXI6OnJlZmVyZW5jZQorICAgICAgbWV0YWRhdGFfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDwKKwltZXRhZGF0YV90eXBlPjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZQorICAgICAgbWV0YWRhdGFfY29uc3RfcmVmZXJlbmNlOworCisgICAgICBib29sCisgICAgICBzcGVjaWFsKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcmVkOyB9CisKKyAgICAgIG1ldGFkYXRhX2NvbnN0X3JlZmVyZW5jZQorICAgICAgZ2V0X21ldGFkYXRhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fbWV0YWRhdGE7IH0KKworICAgICAgbWV0YWRhdGFfcmVmZXJlbmNlCisgICAgICBnZXRfbWV0YWRhdGEoKQorICAgICAgeyByZXR1cm4gbV9tZXRhZGF0YTsgfQorCisjaWZkZWYgUEJfRFNfQklOX1NFQVJDSF9UUkVFX1RSQUNFXworICAgICAgdm9pZAorICAgICAgdHJhY2UoKSBjb25zdAorICAgICAgeworCXN0ZDo6Y291dCA8PCBQQl9EU19WMkYobV92YWx1ZSkgPDwobV9yZWQ/ICIgPHI+ICIgOiAiIDxiPiAiKSAKKwkJICA8PCAiKCIgPDwgbV9tZXRhZGF0YSA8PCAiKSI7CisgICAgICB9CisjZW5kaWYKKworICAgICAgbm9kZV9wb2ludGVyIAltX3BfbGVmdDsKKyAgICAgIG5vZGVfcG9pbnRlciAJbV9wX3JpZ2h0OworICAgICAgbm9kZV9wb2ludGVyIAltX3BfcGFyZW50OworICAgICAgdmFsdWVfdHlwZSAJbV92YWx1ZTsKKyAgICAgIGJvb2wgCQltX3JlZDsKKyAgICAgIG1ldGFkYXRhX3R5cGUgCW1fbWV0YWRhdGE7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgcmJfdHJlZV9ub2RlXzxWYWx1ZV9UeXBlLCBudWxsX3R5cGUsIF9BbGxvYz4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBWYWx1ZV9UeXBlIAkJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgbnVsbF90eXBlIAltZXRhZGF0YV90eXBlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDwKKyAgICAgIHJiX3RyZWVfbm9kZV88CisgICAgICBWYWx1ZV9UeXBlLAorICAgICAgbnVsbF90eXBlLAorICAgICAgX0FsbG9jPiA+OjpvdGhlcjo6cG9pbnRlcgorICAgICAgbm9kZV9wb2ludGVyOworCisgICAgICBib29sCisgICAgICBzcGVjaWFsKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcmVkOyB9CisKKyNpZmRlZiBQQl9EU19CSU5fU0VBUkNIX1RSRUVfVFJBQ0VfCisgICAgICB2b2lkCisgICAgICB0cmFjZSgpIGNvbnN0CisgICAgICB7IHN0ZDo6Y291dCA8PCBQQl9EU19WMkYobV92YWx1ZSkgPDwobV9yZWQ/ICIgPHI+ICIgOiAiIDxiPiAiKTsgfQorI2VuZGlmIAorCisgICAgICBub2RlX3BvaW50ZXIgCW1fcF9sZWZ0OworICAgICAgbm9kZV9wb2ludGVyIAltX3BfcmlnaHQ7CisgICAgICBub2RlX3BvaW50ZXIgCW1fcF9wYXJlbnQ7CisgICAgICB2YWx1ZV90eXBlIAltX3ZhbHVlOworICAgICAgYm9vbCAJCW1fcmVkOworICAgIH07CisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL3JiX3RyZWVfLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vcmJfdHJlZV8uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZTJiYWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL3JiX3RyZWVfLmhwcApAQCAtMCwwICsxLDI0OCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSByYl90cmVlX21hcF8vcmJfdHJlZV8uaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgUmVkIEJsYWNrIHRyZWVzLgorICovCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3N0YW5kYXJkX3BvbGljaWVzLmhwcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBDbXBfRm4sIFwKKwkgICAgIHR5cGVuYW1lIE5vZGVfQW5kX0l0X1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorIyBkZWZpbmUgUEJfRFNfUkJfVFJFRV9OQU1FIHJiX3RyZWVfbWFwCisjIGRlZmluZSBQQl9EU19SQl9UUkVFX0JBU0VfTkFNRSBiaW5fc2VhcmNoX3RyZWVfbWFwCisjZW5kaWYKKworI2lmZGVmIFBCX0RTX0RBVEFfRkFMU0VfSU5ESUNBVE9SCisjIGRlZmluZSBQQl9EU19SQl9UUkVFX05BTUUgcmJfdHJlZV9zZXQKKyMgZGVmaW5lIFBCX0RTX1JCX1RSRUVfQkFTRV9OQU1FIGJpbl9zZWFyY2hfdHJlZV9zZXQKKyNlbmRpZgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICBQQl9EU19SQl9UUkVFX05BTUU8S2V5LCBNYXBwZWQsIENtcF9GbiwgTm9kZV9BbmRfSXRfVHJhaXRzLCBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfUkJfVFJFRV9CQVNFIFwKKyAgICBQQl9EU19SQl9UUkVFX0JBU0VfTkFNRTxLZXksIE1hcHBlZCwgQ21wX0ZuLCBOb2RlX0FuZF9JdF9UcmFpdHMsIF9BbGxvYz4KKworCisgICAgLyoqCisgICAgICogIEBicmllZiBSZWQtQmxhY2sgdHJlZS4KKyAgICAgKiAgQGluZ3JvdXAgYnJhbmNoLWRldGFpbAorICAgICAqCisgICAgICogIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBhbiBpZGVhIGZyb20gdGhlIFNHSSBTVEwgKHVzaW5nIGEKKyAgICAgKiAgQGEgaGVhZGVyIG5vZGUgd2hpY2ggaXMgbmVlZGVkIGZvciBlZmZpY2llbnQgaXRlcmF0aW9uKS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgICB0eXBlbmFtZSBNYXBwZWQsCisJICAgICB0eXBlbmFtZSBDbXBfRm4sCisJICAgICB0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHMsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgUEJfRFNfUkJfVFJFRV9OQU1FIDogcHVibGljIFBCX0RTX1JCX1RSRUVfQkFTRQorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBQQl9EU19SQl9UUkVFX0JBU0UgCQkgICAgICAgCSBiYXNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bm9kZV9wb2ludGVyIAkJIG5vZGVfcG9pbnRlcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgcmJfdHJlZV90YWcgCQkJCSBjb250YWluZXJfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIENtcF9GbiAJCQkJCSBjbXBfZm47CisgICAgICB0eXBlZGVmIF9BbGxvYyAJCQkJCSBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgCQkgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmRpZmZlcmVuY2VfdHlwZSAJCSBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6a2V5X3R5cGUgCQkga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6a2V5X3BvaW50ZXIgCQkga2V5X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6a2V5X2NvbnN0X3BvaW50ZXIgCSBrZXlfY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjprZXlfcmVmZXJlbmNlIAkga2V5X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjprZXlfY29uc3RfcmVmZXJlbmNlIAkga2V5X2NvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjptYXBwZWRfdHlwZSAJCSBtYXBwZWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjptYXBwZWRfcG9pbnRlciAJIG1hcHBlZF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om1hcHBlZF9jb25zdF9wb2ludGVyIAkgbWFwcGVkX2NvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bWFwcGVkX3JlZmVyZW5jZSAJIG1hcHBlZF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bWFwcGVkX2NvbnN0X3JlZmVyZW5jZSBtYXBwZWRfY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnZhbHVlX3R5cGUgCQkgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpwb2ludGVyIAkJIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfcG9pbnRlciAJIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cmVmZXJlbmNlIAkJIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9yZWZlcmVuY2UgCSBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRfaXRlcmF0b3IgCSBwb2ludF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9pdGVyYXRvciAJIHBvaW50X2NvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Oml0ZXJhdG9yIAkJIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIAkgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cmV2ZXJzZV9pdGVyYXRvciAJIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om5vZGVfdXBkYXRlIAkJIG5vZGVfdXBkYXRlOworCisgICAgICBQQl9EU19SQl9UUkVFX05BTUUoKTsKKworICAgICAgUEJfRFNfUkJfVFJFRV9OQU1FKGNvbnN0IENtcF9GbiYpOworCisgICAgICBQQl9EU19SQl9UUkVFX05BTUUoY29uc3QgQ21wX0ZuJiwgY29uc3Qgbm9kZV91cGRhdGUmKTsKKworICAgICAgUEJfRFNfUkJfVFJFRV9OQU1FKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgICB2b2lkCisgICAgICBjb3B5X2Zyb21fcmFuZ2UoSXQsIEl0KTsKKworICAgICAgaW5saW5lIHN0ZDo6cGFpcjxwb2ludF9pdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydChjb25zdF9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgbWFwcGVkX3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQorICAgICAgeworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZChfX0ZJTEVfXywgX19MSU5FX18pOykKKwlzdGQ6OnBhaXI8cG9pbnRfaXRlcmF0b3IsIGJvb2w+IGluc19wYWlyID0KKwliYXNlX3R5cGU6Omluc2VydF9sZWFmKHZhbHVlX3R5cGUocl9rZXksIG1hcHBlZF90eXBlKCkpKTsKKworCWlmIChpbnNfcGFpci5zZWNvbmQgPT0gdHJ1ZSkKKwkgIHsKKwkgICAgaW5zX3BhaXIuZmlyc3QubV9wX25kLT5tX3JlZCA9IHRydWU7CisJICAgIF9HTElCQ1hYX0RFQlVHX09OTFkodGhpcy0+c3RydWN0dXJlX29ubHlfYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCSAgICBpbnNlcnRfZml4dXAoaW5zX3BhaXIuZmlyc3QubV9wX25kKTsKKwkgIH0KKwlfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZChfX0ZJTEVfXywgX19MSU5FX18pOykKKwlyZXR1cm4gaW5zX3BhaXIuZmlyc3QubV9wX25kLT5tX3ZhbHVlLnNlY29uZDsKKyNlbHNlCisJaW5zZXJ0KHJfa2V5KTsKKwlyZXR1cm4gYmFzZV90eXBlOjpzX251bGxfdHlwZTsKKyNlbmRpZgorICAgICAgfQorCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgZXJhc2Uoa2V5X2NvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IpOworCisgICAgICBpbmxpbmUgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgZXJhc2UocmV2ZXJzZV9pdGVyYXRvcik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBlcmFzZV9pZihQcmVkKTsKKworICAgICAgdm9pZAorICAgICAgam9pbihQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB2b2lkCisgICAgICBzcGxpdChrZXlfY29uc3RfcmVmZXJlbmNlLCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgcHJpdmF0ZToKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfdmFsaWQoY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgYXNzZXJ0X25vZGVfY29uc2lzdGVudChjb25zdCBub2RlX3BvaW50ZXIsIGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworI2VuZGlmCisKKyAgICAgIGlubGluZSBzdGF0aWMgYm9vbAorICAgICAgaXNfZWZmZWN0aXZlbHlfYmxhY2soY29uc3Qgbm9kZV9wb2ludGVyKTsKKworICAgICAgdm9pZAorICAgICAgaW5pdGlhbGl6ZSgpOworCisgICAgICB2b2lkCisgICAgICBpbnNlcnRfZml4dXAobm9kZV9wb2ludGVyKTsKKworICAgICAgdm9pZAorICAgICAgZXJhc2Vfbm9kZShub2RlX3BvaW50ZXIpOworCisgICAgICB2b2lkCisgICAgICByZW1vdmVfbm9kZShub2RlX3BvaW50ZXIpOworCisgICAgICB2b2lkCisgICAgICByZW1vdmVfZml4dXAobm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIpOworCisgICAgICB2b2lkCisgICAgICBzcGxpdF9pbXAobm9kZV9wb2ludGVyLCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICBzcGxpdF9taW4oKTsKKworICAgICAgc3RkOjpwYWlyPG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyPgorICAgICAgc3BsaXRfbWluX2ltcCgpOworCisgICAgICB2b2lkCisgICAgICBqb2luX2ltcChub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlcik7CisKKyAgICAgIHN0ZDo6cGFpcjxub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlcj4KKyAgICAgIGZpbmRfam9pbl9wb3NfcmlnaHQobm9kZV9wb2ludGVyLCBzaXplX3R5cGUsIHNpemVfdHlwZSk7CisKKyAgICAgIHN0ZDo6cGFpcjxub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlcj4KKyAgICAgIGZpbmRfam9pbl9wb3NfbGVmdChub2RlX3BvaW50ZXIsIHNpemVfdHlwZSwgc2l6ZV90eXBlKTsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgYmxhY2tfaGVpZ2h0KG5vZGVfcG9pbnRlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIHNwbGl0X2F0X25vZGUobm9kZV9wb2ludGVyLCBQQl9EU19DTEFTU19DX0RFQyYpOworICAgIH07CisKKyNkZWZpbmUgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKFgpCQkJCVwKKyAgX0dMSUJDWFhfREVCVUdfT05MWShYLnN0cnVjdHVyZV9vbmx5X2Fzc2VydF92YWxpZChfX0ZJTEVfXywgX19MSU5FX18pOykKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2luZm9fZm5faW1wcy5ocHA+CisKKyN1bmRlZiBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfUkJfVFJFRV9OQU1FCisjdW5kZWYgUEJfRFNfUkJfVFJFRV9CQVNFX05BTUUKKyN1bmRlZiBQQl9EU19SQl9UUkVFX0JBU0UKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViMDY3NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDMwNiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSByYl90cmVlX21hcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHJiX3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogoram9pbihQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgIGlmIChiYXNlX3R5cGU6OmpvaW5fcHJlcChvdGhlcikgPT0gZmFsc2UpCisgICAgeworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgICAgICByZXR1cm47CisgICAgfQorCisgIGNvbnN0IG5vZGVfcG9pbnRlciBwX3ggPSBvdGhlci5zcGxpdF9taW4oKTsKKyAgam9pbl9pbXAocF94LCBvdGhlci5tX3BfaGVhZC0+bV9wX3BhcmVudCk7CisgIGJhc2VfdHlwZTo6am9pbl9maW5pc2gob3RoZXIpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2pvaW5faW1wKG5vZGVfcG9pbnRlciBwX3gsIG5vZGVfcG9pbnRlciBwX3IpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3ggIT0gMCk7CisgIGlmIChwX3IgIT0gMCkKKyAgICBwX3ItPm1fcmVkID0gZmFsc2U7CisKKyAgY29uc3Qgc2l6ZV90eXBlIGggPSBibGFja19oZWlnaHQoYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCk7CisgIGNvbnN0IHNpemVfdHlwZSBvdGhlcl9oID0gYmxhY2tfaGVpZ2h0KHBfcik7CisgIG5vZGVfcG9pbnRlciBwX3hfbDsKKyAgbm9kZV9wb2ludGVyIHBfeF9yOworICBzdGQ6OnBhaXI8bm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXI+IGpvaW5fcG9zOworICBjb25zdCBib29sIHJpZ2h0X2pvaW4gPSBoID49IG90aGVyX2g7CisgIGlmIChyaWdodF9qb2luKQorICAgIHsKKyAgICAgIGpvaW5fcG9zID0gZmluZF9qb2luX3Bvc19yaWdodChiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50LCAKKwkJCQkgICAgIGgsIG90aGVyX2gpOworICAgICAgcF94X2wgPSBqb2luX3Bvcy5maXJzdDsKKyAgICAgIHBfeF9yID0gcF9yOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHBfeF9sID0gYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudDsKKyAgICAgIGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX3I7CisgICAgICBpZiAocF9yICE9IDApCisJcF9yLT5tX3BfcGFyZW50ID0gYmFzZV90eXBlOjptX3BfaGVhZDsKKworICAgICAgam9pbl9wb3MgPSBmaW5kX2pvaW5fcG9zX2xlZnQoYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCwgCisJCQkJICAgIGgsIG90aGVyX2gpOworICAgICAgcF94X3IgPSBqb2luX3Bvcy5maXJzdDsKKyAgICB9CisKKyAgbm9kZV9wb2ludGVyIHBfcGFyZW50ID0gam9pbl9wb3Muc2Vjb25kOworICBpZiAocF9wYXJlbnQgPT0gYmFzZV90eXBlOjptX3BfaGVhZCkKKyAgICB7CisgICAgICBiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50ID0gcF94OworICAgICAgcF94LT5tX3BfcGFyZW50ID0gYmFzZV90eXBlOjptX3BfaGVhZDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwX3gtPm1fcF9wYXJlbnQgPSBwX3BhcmVudDsKKyAgICAgIGlmIChyaWdodF9qb2luKQorCXBfeC0+bV9wX3BhcmVudC0+bV9wX3JpZ2h0ID0gcF94OworICAgICAgZWxzZQorCXBfeC0+bV9wX3BhcmVudC0+bV9wX2xlZnQgPSBwX3g7CisgICAgfQorCisgIHBfeC0+bV9wX2xlZnQgPSBwX3hfbDsKKyAgaWYgKHBfeF9sICE9IDApCisgICAgcF94X2wtPm1fcF9wYXJlbnQgPSBwX3g7CisKKyAgcF94LT5tX3BfcmlnaHQgPSBwX3hfcjsKKyAgaWYgKHBfeF9yICE9IDApCisgICAgcF94X3ItPm1fcF9wYXJlbnQgPSBwX3g7CisKKyAgcF94LT5tX3JlZCA9IHRydWU7CisKKyAgYmFzZV90eXBlOjppbml0aWFsaXplX21pbl9tYXgoKTsKKyAgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIGJhc2VfdHlwZTo6dXBkYXRlX3RvX3RvcChwX3gsIChub2RlX3VwZGF0ZSogKXRoaXMpOworICBpbnNlcnRfZml4dXAocF94KTsKKyAgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3BsaXRfbWluKCkKK3sKKyAgbm9kZV9wb2ludGVyIHBfbWluID0gYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX2xlZnQ7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICBjb25zdCBub2RlX3BvaW50ZXIgcF9oZWFkID0gYmFzZV90eXBlOjptX3BfaGVhZDsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbWluICE9IHBfaGVhZCk7CisjZW5kaWYgCisKKyAgcmVtb3ZlX25vZGUocF9taW4pOworICByZXR1cm4gcF9taW47Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitzdGQ6OnBhaXI8CisgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIsCisgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXI+CitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX2pvaW5fcG9zX3JpZ2h0KG5vZGVfcG9pbnRlciBwX2wsIHNpemVfdHlwZSBoX2wsIHNpemVfdHlwZSBoX3IpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChoX2wgPj0gaF9yKTsKKworICBpZiAoYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCA9PSAwKQorICAgIHJldHVybiAoc3RkOjptYWtlX3BhaXIoKG5vZGVfcG9pbnRlcikwLCBiYXNlX3R5cGU6Om1fcF9oZWFkKSk7CisKKyAgbm9kZV9wb2ludGVyIHBfbF9wYXJlbnQgPSBiYXNlX3R5cGU6Om1fcF9oZWFkOworICB3aGlsZSAoaF9sID4gaF9yKQorICAgIHsKKyAgICAgIGlmIChwX2wtPm1fcmVkID09IGZhbHNlKQorICAgICAgICB7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoaF9sID4gMCk7CisJICAtLWhfbDsKKyAgICAgICAgfQorCisgICAgICBwX2xfcGFyZW50ID0gcF9sOworICAgICAgcF9sID0gcF9sLT5tX3BfcmlnaHQ7CisgICAgfQorCisgIGlmICghaXNfZWZmZWN0aXZlbHlfYmxhY2socF9sKSkKKyAgICB7CisgICAgICBwX2xfcGFyZW50ID0gcF9sOworICAgICAgcF9sID0gcF9sLT5tX3BfcmlnaHQ7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpc19lZmZlY3RpdmVseV9ibGFjayhwX2wpKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJsYWNrX2hlaWdodChwX2wpID09IGhfcik7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX2wgPT0gMCB8fCBwX2wtPm1fcF9wYXJlbnQgPT0gcF9sX3BhcmVudCk7CisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihwX2wsIHBfbF9wYXJlbnQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworc3RkOjpwYWlyPAorICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyLAorICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyPgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZF9qb2luX3Bvc19sZWZ0KG5vZGVfcG9pbnRlciBwX3IsIHNpemVfdHlwZSBoX2wsIHNpemVfdHlwZSBoX3IpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChoX3IgPiBoX2wpOworICBpZiAoYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCA9PSAwKQorICAgIHJldHVybiAoc3RkOjptYWtlX3BhaXIoKG5vZGVfcG9pbnRlcikwLAorCQkJICAgYmFzZV90eXBlOjptX3BfaGVhZCkpOworICBub2RlX3BvaW50ZXIgcF9yX3BhcmVudCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQ7CisgIHdoaWxlIChoX3IgPiBoX2wpCisgICAgeworICAgICAgaWYgKHBfci0+bV9yZWQgPT0gZmFsc2UpCisgICAgICAgIHsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChoX3IgPiAwKTsKKwkgIC0taF9yOworICAgICAgICB9CisKKyAgICAgIHBfcl9wYXJlbnQgPSBwX3I7CisgICAgICBwX3IgPSBwX3ItPm1fcF9sZWZ0OworICAgIH0KKworICBpZiAoIWlzX2VmZmVjdGl2ZWx5X2JsYWNrKHBfcikpCisgICAgeworICAgICAgcF9yX3BhcmVudCA9IHBfcjsKKyAgICAgIHBfciA9IHBfci0+bV9wX2xlZnQ7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpc19lZmZlY3RpdmVseV9ibGFjayhwX3IpKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJsYWNrX2hlaWdodChwX3IpID09IGhfbCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3IgPT0gMCB8fCBwX3ItPm1fcF9wYXJlbnQgPT0gcF9yX3BhcmVudCk7CisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihwX3IsIHBfcl9wYXJlbnQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JsYWNrX2hlaWdodChub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgc2l6ZV90eXBlIGggPSAxOworICB3aGlsZSAocF9uZCAhPSAwKQorICAgIHsKKyAgICAgIGlmIChwX25kLT5tX3JlZCA9PSBmYWxzZSkKKwkrK2g7CisgICAgICBwX25kID0gcF9uZC0+bV9wX2xlZnQ7CisgICAgfQorICByZXR1cm4gaDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGl0KGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXksIFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKworICBpZiAoYmFzZV90eXBlOjpzcGxpdF9wcmVwKHJfa2V5LCBvdGhlcikgPT0gZmFsc2UpCisgICAgeworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgICAgICByZXR1cm47CisgICAgfQorCisgIFBCX0RTX1NUUlVDVF9PTkxZX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQob3RoZXIpCisgIG5vZGVfcG9pbnRlciBwX25kID0gdGhpcy0+dXBwZXJfYm91bmQocl9rZXkpLm1fcF9uZDsKKyAgZG8KKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9uZXh0X25kID0gcF9uZC0+bV9wX3BhcmVudDsKKyAgICAgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkocl9rZXksIFBCX0RTX1YyRihwX25kLT5tX3ZhbHVlKSkpCisJc3BsaXRfYXRfbm9kZShwX25kLCBvdGhlcik7CisKKyAgICAgIFBCX0RTX1NUUlVDVF9PTkxZX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgUEJfRFNfU1RSVUNUX09OTFlfQVNTRVJUX1ZBTElEKG90aGVyKQorICAgICAgcF9uZCA9IHBfbmV4dF9uZDsKKyAgICB9CisgIHdoaWxlIChwX25kICE9IGJhc2VfdHlwZTo6bV9wX2hlYWQpOworCisgIGJhc2VfdHlwZTo6c3BsaXRfZmluaXNoKG90aGVyKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxpdF9hdF9ub2RlKG5vZGVfcG9pbnRlciBwX25kLCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kICE9IDApOworCisgIG5vZGVfcG9pbnRlciBwX2wgPSBwX25kLT5tX3BfbGVmdDsKKyAgbm9kZV9wb2ludGVyIHBfciA9IHBfbmQtPm1fcF9yaWdodDsKKyAgbm9kZV9wb2ludGVyIHBfcGFyZW50ID0gcF9uZC0+bV9wX3BhcmVudDsKKyAgaWYgKHBfcGFyZW50ID09IGJhc2VfdHlwZTo6bV9wX2hlYWQpCisgICAgeworICAgICAgYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCA9IHBfbDsKKyAgICAgIGlmIChwX2wgIT0gMCkKKyAgICAgICAgeworCSAgcF9sLT5tX3BfcGFyZW50ID0gYmFzZV90eXBlOjptX3BfaGVhZDsKKwkgIHBfbC0+bV9yZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwX3BhcmVudC0+bV9wX2xlZnQgPT0gcF9uZCkKKwlwX3BhcmVudC0+bV9wX2xlZnQgPSBwX2w7CisgICAgICBlbHNlCisJcF9wYXJlbnQtPm1fcF9yaWdodCA9IHBfbDsKKworICAgICAgaWYgKHBfbCAhPSAwKQorCXBfbC0+bV9wX3BhcmVudCA9IHBfcGFyZW50OworCisgICAgICB0aGlzLT51cGRhdGVfdG9fdG9wKHBfcGFyZW50LCAobm9kZV91cGRhdGUqICl0aGlzKTsKKworICAgICAgaWYgKCFwX25kLT5tX3JlZCkKKwlyZW1vdmVfZml4dXAocF9sLCBwX3BhcmVudCk7CisgICAgfQorCisgIGJhc2VfdHlwZTo6aW5pdGlhbGl6ZV9taW5fbWF4KCk7CisgIG90aGVyLmpvaW5faW1wKHBfbmQsIHBfcik7CisgIFBCX0RTX1NUUlVDVF9PTkxZX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19TVFJVQ1RfT05MWV9BU1NFUlRfVkFMSUQob3RoZXIpCit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vdHJhaXRzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vdHJhaXRzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDI3ZDU5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy90cmFpdHMuaHBwCkBAIC0wLDAgKzEsMTAyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHJiX3RyZWVfbWFwXy90cmFpdHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgcmJfdHJlZV8uCisgKi8KKworI2lmbmRlZiBQQl9EU19SQl9UUkVFX05PREVfQU5EX0lUX1RSQUlUU19IUFAKKyNkZWZpbmUgUEJfRFNfUkJfVFJFRV9OT0RFX0FORF9JVF9UUkFJVFNfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9ub2RlLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIFNwZWNpYWxpemF0aW9uLgorICAgIC8vLyBAaW5ncm91cCB0cmFpdHMKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgICB0eXBlbmFtZSBNYXBwZWQsCisJICAgICB0eXBlbmFtZSBDbXBfRm4sCisJICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX0NJdHIsCisJCSAgICAgIHR5cGVuYW1lIE5vZGVfSXRyLAorCQkgICAgICB0eXBlbmFtZSBDbXBfRm5fLAorCQkgICAgICB0eXBlbmFtZSBfQWxsb2NfPgorCSAgICAgY2xhc3MgTm9kZV9VcGRhdGUsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHRyZWVfdHJhaXRzPEtleSwgTWFwcGVkLCBDbXBfRm4sIE5vZGVfVXBkYXRlLCByYl90cmVlX3RhZyxfQWxsb2M+IAorICAgIDogcHVibGljIGJpbl9zZWFyY2hfdHJlZV90cmFpdHM8CisgICAgICBLZXksCisgICAgICBNYXBwZWQsCisgICAgICBDbXBfRm4sCisgICAgICBOb2RlX1VwZGF0ZSwKKyAgICAgIHJiX3RyZWVfbm9kZV88CisJdHlwZW5hbWUgdHlwZXNfdHJhaXRzPEtleSwgTWFwcGVkLCBfQWxsb2MsIGZhbHNlPjo6dmFsdWVfdHlwZSwKKwl0eXBlbmFtZSB0cmVlX25vZGVfbWV0YWRhdGFfZGlzcGF0Y2g8S2V5LCBNYXBwZWQsIENtcF9GbiwgTm9kZV9VcGRhdGUsCisJCQkJCSAgICAgX0FsbG9jPjo6dHlwZSwKKwlfQWxsb2M+LAorICAgICAgX0FsbG9jPgorICAgIHsgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbi4KKyAgICAvLy8gQGluZ3JvdXAgdHJhaXRzCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgICAgdHlwZW5hbWUgQ21wX0ZuLAorCSAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9DSXRyLAorCQkgICAgICB0eXBlbmFtZSBOb2RlX0l0ciwKKwkJICAgICAgdHlwZW5hbWUgQ21wX0ZuXywKKwkJICAgICAgdHlwZW5hbWUgX0FsbG9jXz4KKwkgICAgIGNsYXNzIE5vZGVfVXBkYXRlLAorCSAgICAgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCB0cmVlX3RyYWl0czxLZXksIG51bGxfdHlwZSwgQ21wX0ZuLCBOb2RlX1VwZGF0ZSwgcmJfdHJlZV90YWcsX0FsbG9jPiAKKyAgICA6IHB1YmxpYyBiaW5fc2VhcmNoX3RyZWVfdHJhaXRzPAorICAgICAgS2V5LAorICAgICAgbnVsbF90eXBlLAorICAgICAgQ21wX0ZuLAorICAgICAgTm9kZV9VcGRhdGUsCisgICAgICByYl90cmVlX25vZGVfPAorICAgICAgdHlwZW5hbWUgdHlwZXNfdHJhaXRzPEtleSwgbnVsbF90eXBlLCBfQWxsb2MsIGZhbHNlPjo6dmFsdWVfdHlwZSwKKyAgICAgIHR5cGVuYW1lIHRyZWVfbm9kZV9tZXRhZGF0YV9kaXNwYXRjaDxLZXksIG51bGxfdHlwZSwgQ21wX0ZuLCBOb2RlX1VwZGF0ZSwKKwkJCQkJICAgX0FsbG9jPjo6dHlwZSwKKwlfQWxsb2M+LAorCSAgX0FsbG9jPgorICAgIHsgfTsKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNjJmYmEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw4NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSByY19iaW5vbWlhbF9oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHJjX2Jpbm9taWFsX2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CityY19iaW5vbWlhbF9oZWFwKCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CityY19iaW5vbWlhbF9oZWFwKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4pIAorOiBiYXNlX3R5cGUocl9jbXBfZm4pCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmNfYmlub21pYWxfaGVhcChjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpIAorOiBiYXNlX3R5cGUob3RoZXIpCit7CisgIG1ha2VfYmlub21pYWxfaGVhcCgpOworICBiYXNlX3R5cGU6OmZpbmRfbWF4KCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorfnJjX2Jpbm9taWFsX2hlYXAoKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKworICBiYXNlX3R5cGU6OnN3YXAob3RoZXIpOworICBtX3JjLnN3YXAob3RoZXIubV9yYyk7CisKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTg3MTM4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTIxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHJjX2Jpbm9taWFsX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgcmNfYmlub21pYWxfaGVhcF8uCisgKi8KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfdmFsaWQoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBiYXNlX3R5cGU6OmFzc2VydF92YWxpZChmYWxzZSwgX19maWxlLCBfX2xpbmUpOworICBpZiAoIWJhc2VfdHlwZTo6ZW1wdHkoKSkKKyAgICB7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkoYmFzZV90eXBlOjptX3BfbWF4ICE9IDApOworICAgICAgYmFzZV90eXBlOjphc3NlcnRfbWF4KF9fZmlsZSwgX19saW5lKTsKKyAgICB9CisKKyAgbV9yYy5hc3NlcnRfdmFsaWQoX19maWxlLCBfX2xpbmUpOworCisgIGlmIChtX3JjLmVtcHR5KCkpCisgICAgeworICAgICAgYmFzZV90eXBlOjphc3NlcnRfdmFsaWQodHJ1ZSwgX19maWxlLCBfX2xpbmUpOworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKG5leHRfMl9wb2ludGVyKGJhc2VfdHlwZTo6bV9wX3Jvb3QpID09IDApOworICAgICAgcmV0dXJuOworICAgIH0KKworICBub2RlX2NvbnN0X3BvaW50ZXIgcF9uZCA9IG5leHRfMl9wb2ludGVyKGJhc2VfdHlwZTo6bV9wX3Jvb3QpOworICB0eXBlbmFtZSByY190Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmMuZW5kKCk7CisgIC0taXQ7CisKKyAgd2hpbGUgKHBfbmQgIT0gMCkKKyAgICB7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkoKml0ID09IHBfbmQpOworICAgICAgbm9kZV9jb25zdF9wb2ludGVyIHBfbmV4dCA9IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBQQl9EU19ERUJVR19WRVJJRlkocF9uZXh0ICE9IDApOworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKHBfbmQtPm1fbWV0YWRhdGEgPT0gcF9uZXh0LT5tX21ldGFkYXRhKTsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShwX25leHQtPm1fcF9uZXh0X3NpYmxpbmcgPT0gMCB8fAorCQkgICAgICAgcF9uZXh0LT5tX21ldGFkYXRhIDwgcF9uZXh0LT5tX3BfbmV4dF9zaWJsaW5nLT5tX21ldGFkYXRhKTsKKworICAgICAgLS1pdDsKKyAgICAgIHBfbmQgPSBuZXh0XzJfcG9pbnRlcihuZXh0X2FmdGVyXzBfcG9pbnRlcihwX25kKSk7CisgICAgfQorICBQQl9EU19ERUJVR19WRVJJRlkoaXQgKyAxID09IG1fcmMuYmVnaW4oKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9jb25zdF9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CituZXh0XzJfcG9pbnRlcihub2RlX2NvbnN0X3BvaW50ZXIgcF9uZCkKK3sKKyAgaWYgKHBfbmQgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gcF9uZC0+bV9wX25leHRfc2libGluZzsKKworICBpZiAocF9uZXh0ID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHBfbmQtPm1fbWV0YWRhdGEgPT0gcF9uZXh0LT5tX21ldGFkYXRhKQorICAgIHJldHVybiBwX25kOworCisgIHJldHVybiBuZXh0XzJfcG9pbnRlcihwX25leHQpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfY29uc3RfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbmV4dF9hZnRlcl8wX3BvaW50ZXIobm9kZV9jb25zdF9wb2ludGVyIHBfbmQpCit7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgbm9kZV9wb2ludGVyIHBfbmV4dCA9IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmc7CisKKyAgaWYgKHBfbmV4dCA9PSAwKQorICAgIHJldHVybiAwOworCisgIGlmIChwX25kLT5tX21ldGFkYXRhIDwgcF9uZXh0LT5tX21ldGFkYXRhKQorICAgIHJldHVybiBwX25leHQ7CisKKyAgcmV0dXJuIG5leHRfYWZ0ZXJfMF9wb2ludGVyKHBfbmV4dCk7Cit9CisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDQ3YmU1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTA3IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHJjX2Jpbm9taWFsX2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgcmNfYmlub21pYWxfaGVhcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citwb3AoKQoreworICBtYWtlX2Jpbm9taWFsX2hlYXAoKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFiYXNlX3R5cGU6OmVtcHR5KCkpOworICBiYXNlX3R5cGU6OnBvcCgpOworICBiYXNlX3R5cGU6OmZpbmRfbWF4KCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcigpCit7CisgIGJhc2VfdHlwZTo6Y2xlYXIoKTsKKyAgbV9yYy5jbGVhcigpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbWFrZV9iaW5vbWlhbF9oZWFwKCkKK3sKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBiYXNlX3R5cGU6Om1fcF9yb290OworICB3aGlsZSAocF9uZCAhPSAwKQorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgaWYgKHBfbmV4dCA9PSAwKQorCXBfbmQgPSBwX25leHQ7CisgICAgICBlbHNlIGlmIChwX25kLT5tX21ldGFkYXRhID09IHBfbmV4dC0+bV9tZXRhZGF0YSkKKwlwX25kID0gbGlua193aXRoX25leHRfc2libGluZyhwX25kKTsKKyAgICAgIGVsc2UgaWYgKHBfbmQtPm1fbWV0YWRhdGEgPCBwX25leHQtPm1fbWV0YWRhdGEpCisJcF9uZCA9IHBfbmV4dDsKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgZWxzZQorCV9HTElCQ1hYX0RFQlVHX0FTU0VSVCgwKTsKKyNlbmRpZiAKKyAgICB9CisKKyAgbV9yYy5jbGVhcigpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2lmKFByZWQgcHJlZCkKK3sKKyAgbWFrZV9iaW5vbWlhbF9oZWFwKCk7CisgIGNvbnN0IHNpemVfdHlwZSBlcnNkID0gYmFzZV90eXBlOjplcmFzZV9pZihwcmVkKTsKKyAgYmFzZV90eXBlOjpmaW5kX21heCgpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmV0dXJuIGVyc2Q7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShwb2ludF9pdGVyYXRvciBpdCkKK3sKKyAgbWFrZV9iaW5vbWlhbF9oZWFwKCk7CisgIGJhc2VfdHlwZTo6ZXJhc2UoaXQpOworICBiYXNlX3R5cGU6OmZpbmRfbWF4KCk7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9pbnNlcnRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNTkwNWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTU0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHJjX2Jpbm9taWFsX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHJjX2Jpbm9taWFsX2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitwdXNoKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisKKyAgbWFrZV8wX2V4cG9zZWQoKTsKKworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKworICBub2RlX3BvaW50ZXIgcF9uZCA9IGJhc2VfdHlwZTo6Z2V0X25ld19ub2RlX2Zvcl9pbnNlcnQocl92YWwpOworCisgIHBfbmQtPm1fcF9sX2NoaWxkID0gcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKyAgcF9uZC0+bV9tZXRhZGF0YSA9IDA7CisKKyAgaWYgKGJhc2VfdHlwZTo6bV9wX21heCA9PSAwIHx8IENtcF9Gbjo6b3BlcmF0b3IoKShiYXNlX3R5cGU6Om1fcF9tYXgtPm1fdmFsdWUsIHJfdmFsKSkKKyAgICBiYXNlX3R5cGU6Om1fcF9tYXggPSBwX25kOworCisgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgPSBiYXNlX3R5cGU6Om1fcF9yb290OworCisgIGlmIChiYXNlX3R5cGU6Om1fcF9yb290ICE9IDApCisgICAgYmFzZV90eXBlOjptX3Bfcm9vdC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZDsKKworICBiYXNlX3R5cGU6Om1fcF9yb290ID0gcF9uZDsKKworICBpZiAocF9uZC0+bV9wX25leHRfc2libGluZyAhPSAwJiYgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmctPm1fbWV0YWRhdGEgPT0gMCkKKyAgICBtX3JjLnB1c2gocF9uZCk7CisKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisKKyAgcmV0dXJuIHBvaW50X2l0ZXJhdG9yKHBfbmQpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbW9kaWZ5KHBvaW50X2l0ZXJhdG9yIGl0LCBjb25zdF9yZWZlcmVuY2Ugcl9uZXdfdmFsKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKworICBtYWtlX2Jpbm9taWFsX2hlYXAoKTsKKworICBiYXNlX3R5cGU6Om1vZGlmeShpdCwgcl9uZXdfdmFsKTsKKworICBiYXNlX3R5cGU6OmZpbmRfbWF4KCk7CisKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbGlua193aXRoX25leHRfc2libGluZyhub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgbm9kZV9wb2ludGVyIHBfbmV4dCA9IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmc7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmV4dCAhPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmV4dC0+bV9wX3ByZXZfb3JfcGFyZW50ID09IHBfbmQpOworCisgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkocF9uZC0+bV92YWx1ZSwgcF9uZXh0LT5tX3ZhbHVlKSkKKyAgICB7CisgICAgICBwX25leHQtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudDsKKworICAgICAgaWYgKHBfbmV4dC0+bV9wX3ByZXZfb3JfcGFyZW50ID09IDApCisJYmFzZV90eXBlOjptX3Bfcm9vdCA9IHBfbmV4dDsKKyAgICAgIGVsc2UKKwlwX25leHQtPm1fcF9wcmV2X29yX3BhcmVudC0+bV9wX25leHRfc2libGluZyA9IHBfbmV4dDsKKworICAgICAgaWYgKGJhc2VfdHlwZTo6bV9wX21heCA9PSBwX25kKQorCWJhc2VfdHlwZTo6bV9wX21heCA9IHBfbmV4dDsKKworICAgICAgYmFzZV90eXBlOjptYWtlX2NoaWxkX29mKHBfbmQsIHBfbmV4dCk7CisKKyAgICAgICsrcF9uZXh0LT5tX21ldGFkYXRhOworCisgICAgICByZXR1cm4gcF9uZXh0OworICAgIH0KKworICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nID0gcF9uZXh0LT5tX3BfbmV4dF9zaWJsaW5nOworCisgIGlmIChwX25kLT5tX3BfbmV4dF9zaWJsaW5nICE9IDApCisgICAgcF9uZC0+bV9wX25leHRfc2libGluZy0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZDsKKworICBpZiAoYmFzZV90eXBlOjptX3BfbWF4ID09IHBfbmV4dCkKKyAgICBiYXNlX3R5cGU6Om1fcF9tYXggPSBwX25kOworCisgIGJhc2VfdHlwZTo6bWFrZV9jaGlsZF9vZihwX25leHQsIHBfbmQpOworCisgICsrcF9uZC0+bV9tZXRhZGF0YTsKKworICByZXR1cm4gcF9uZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK21ha2VfMF9leHBvc2VkKCkKK3sKKyAgaWYgKG1fcmMuZW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBtX3JjLnRvcCgpOworCisgIG1fcmMucG9wKCk7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX21ldGFkYXRhID09IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmctPm1fbWV0YWRhdGEpOworCisgIG5vZGVfcG9pbnRlciBwX3JlcyA9IGxpbmtfd2l0aF9uZXh0X3NpYmxpbmcocF9uZCk7CisKKyAgaWYgKHBfcmVzLT5tX3BfbmV4dF9zaWJsaW5nICE9IDAmJiAgcF9yZXMtPm1fbWV0YWRhdGEgPT0gcF9yZXMtPm1fcF9uZXh0X3NpYmxpbmctPm1fbWV0YWRhdGEpCisgICAgbV9yYy5wdXNoKHBfcmVzKTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9yYy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vcmMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwODI1OGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vcmMuaHBwCkBAIC0wLDAgKzEsMjQwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHJjX2Jpbm9taWFsX2hlYXBfL3JjLmhwcAorICogQ29udGFpbnMgYSByZWR1bmRhbnQgKGJpbmFyeSBjb3VudGVyKS4KKyAqLworCisjaWZuZGVmIFBCX0RTX1JDX0hQUAorI2RlZmluZSBQQl9EU19SQ19IUFAKKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIFJlZHVuZGFudCBiaW5hcnkgY291bnRlci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTm9kZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIHJjCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9BbGxvYyAJCQkJCSBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnNpemVfdHlwZSAJIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX05vZGUgCQkJCQkgbm9kZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxub2RlPgkgX19yZWJpbmRfbjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbjo6b3RoZXI6OnBvaW50ZXIgICAgICAJIG5vZGVfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxub2RlX3BvaW50ZXI+ICBfX3JlYmluZF9ucDsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9ucDo6b3RoZXI6OnBvaW50ZXIgCSBlbnRyeV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9ucDo6b3RoZXI6OmNvbnN0X3BvaW50ZXIgZW50cnlfY29uc3RfcG9pbnRlcjsKKworICAgICAgZW51bQorCXsKKwkgIG1heF9lbnRyaWVzID0gc2l6ZW9mKHNpemVfdHlwZSkgPDwgMworCX07CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIG5vZGVfcG9pbnRlciAJCQkJIGVudHJ5OworICAgICAgdHlwZWRlZiBlbnRyeV9jb25zdF9wb2ludGVyIAkJCSBjb25zdF9pdGVyYXRvcjsKKworICAgICAgcmMoKTsKKworICAgICAgcmMoY29uc3QgcmMmKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHN3YXAocmMmKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHB1c2goZW50cnkpOworCisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICB0b3AoKSBjb25zdDsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHBvcCgpOworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdDsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBjbGVhcigpOworCisgICAgICBjb25zdCBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdDsKKworICAgICAgY29uc3QgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0OworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZChjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfUkNfQklOT01JQUxfSEVBUF9UUkFDRV8KKyAgICAgIHZvaWQKKyAgICAgIHRyYWNlKCkgY29uc3Q7CisjZW5kaWYKKworICAgIHByaXZhdGU6CisgICAgICBub2RlX3BvaW50ZXIgCW1fYV9lbnRyaWVzW21heF9lbnRyaWVzXTsKKyAgICAgIHNpemVfdHlwZSAJbV9vdmVyX3RvcDsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX05vZGUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICByYzxfTm9kZSwgX0FsbG9jPjo6CisgICAgcmMoKSA6IG1fb3Zlcl90b3AoMCkKKyAgICB7IFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKSB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTm9kZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHJjPF9Ob2RlLCBfQWxsb2M+OjoKKyAgICByYyhjb25zdCByYzxfTm9kZSwgX0FsbG9jPiYgb3RoZXIpIDogbV9vdmVyX3RvcCgwKQorICAgIHsgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ob2RlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICByYzxfTm9kZSwgX0FsbG9jPjo6CisgICAgc3dhcChyYzxfTm9kZSwgX0FsbG9jPiYgb3RoZXIpCisgICAgeworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBvdmVyX3RvcCA9IHN0ZDo6bWF4KG1fb3Zlcl90b3AsIG90aGVyLm1fb3Zlcl90b3ApOworCisgICAgICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG92ZXJfdG9wOyArK2kpCisJc3RkOjpzd2FwKG1fYV9lbnRyaWVzW2ldLCBvdGhlci5tX2FfZW50cmllc1tpXSk7CisKKyAgICAgIHN0ZDo6c3dhcChtX292ZXJfdG9wLCBvdGhlci5tX292ZXJfdG9wKTsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTm9kZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgcmM8X05vZGUsIF9BbGxvYz46OgorICAgIHB1c2goZW50cnkgcF9uZCkKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX292ZXJfdG9wIDwgbWF4X2VudHJpZXMpOworICAgICAgbV9hX2VudHJpZXNbbV9vdmVyX3RvcCsrXSA9IHBfbmQ7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTm9kZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgcmM8X05vZGUsIF9BbGxvYz46OgorICAgIHBvcCgpCisgICAgeworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWVtcHR5KCkpOworICAgICAgLS1tX292ZXJfdG9wOworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX05vZGUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdHlwZW5hbWUgcmM8X05vZGUsIF9BbGxvYz46Om5vZGVfcG9pbnRlcgorICAgIHJjPF9Ob2RlLCBfQWxsb2M+OjoKKyAgICB0b3AoKSBjb25zdAorICAgIHsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFlbXB0eSgpKTsKKyAgICAgIHJldHVybiAqKG1fYV9lbnRyaWVzICsgbV9vdmVyX3RvcCAtIDEpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ob2RlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICByYzxfTm9kZSwgX0FsbG9jPjo6CisgICAgZW1wdHkoKSBjb25zdAorICAgIHsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgcmV0dXJuIG1fb3Zlcl90b3AgPT0gMDsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTm9kZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB0eXBlbmFtZSByYzxfTm9kZSwgX0FsbG9jPjo6c2l6ZV90eXBlCisgICAgcmM8X05vZGUsIF9BbGxvYz46OgorICAgIHNpemUoKSBjb25zdAorICAgIHsgcmV0dXJuIG1fb3Zlcl90b3A7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ob2RlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIHJjPF9Ob2RlLCBfQWxsb2M+OjoKKyAgICBjbGVhcigpCisgICAgeworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICBtX292ZXJfdG9wID0gMDsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ob2RlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY29uc3QgdHlwZW5hbWUgcmM8X05vZGUsIF9BbGxvYz46OmNvbnN0X2l0ZXJhdG9yCisgICAgcmM8X05vZGUsIF9BbGxvYz46OgorICAgIGJlZ2luKCkgY29uc3QKKyAgICB7IHJldHVybiYgbV9hX2VudHJpZXNbMF07IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ob2RlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY29uc3QgdHlwZW5hbWUgcmM8X05vZGUsIF9BbGxvYz46OmNvbnN0X2l0ZXJhdG9yCisgICAgcmM8X05vZGUsIF9BbGxvYz46OgorICAgIGVuZCgpIGNvbnN0CisgICAgeyByZXR1cm4mIG1fYV9lbnRyaWVzW21fb3Zlcl90b3BdOyB9CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ob2RlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIHJjPF9Ob2RlLCBfQWxsb2M+OjoKKyAgICBhc3NlcnRfdmFsaWQoY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAorICAgIHsgUEJfRFNfREVCVUdfVkVSSUZZKG1fb3Zlcl90b3AgPCBtYXhfZW50cmllcyk7IH0KKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfUkNfQklOT01JQUxfSEVBUF9UUkFDRV8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTm9kZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICByYzxfTm9kZSwgX0FsbG9jPjo6CisgICAgdHJhY2UoKSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAicmMiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbV9vdmVyX3RvcDsgKytpKQorCXN0ZDo6Y2VyciA8PCBtX2FfZW50cmllc1tpXSA8PCBzdGQ6OmVuZGw7CisgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOworICAgIH0KKyNlbmRpZgorfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL3JjX2Jpbm9taWFsX2hlYXBfLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9yY19iaW5vbWlhbF9oZWFwXy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwYjk2OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9yY19iaW5vbWlhbF9oZWFwXy5ocHAKQEAgLTAsMCArMSwxNzEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcmNfYmlub21pYWxfaGVhcF8vcmNfYmlub21pYWxfaGVhcF8uaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgcmVkdW5kYW50LWNvdW50ZXIgYmlub21pYWwgaGVhcC4KKyAqLworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jb25kX2RlYWx0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZV91dGlscy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2Jpbm9taWFsX2hlYXBfYmFzZV8uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vcmMuaHBwPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIHJjX2Jpbm9taWFsX2hlYXA8VmFsdWVfVHlwZSwgQ21wX0ZuLCBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfUkNfQ19ERUMgXAorICAgIHJjPHR5cGVuYW1lIGJpbm9taWFsX2hlYXBfYmFzZTxWYWx1ZV9UeXBlLCBDbXBfRm4sIF9BbGxvYz46Om5vZGUsIF9BbGxvYz4KKworICAgIC8qKgorICAgICAqICBSZWR1bmRhbnQtY291bnRlciBiaW5vbWlhbCBoZWFwLgorICAgICAqCisgICAgICogIEBpbmdyb3VwIGhlYXAtZGV0YWlsCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgcmNfYmlub21pYWxfaGVhcAorICAgIDogcHVibGljIGJpbm9taWFsX2hlYXBfYmFzZTxWYWx1ZV9UeXBlLCBDbXBfRm4sIF9BbGxvYz4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgYmlub21pYWxfaGVhcF9iYXNlPFZhbHVlX1R5cGUsIENtcF9GbiwgX0FsbG9jPgorICAgICAgCQkJCQkJCWJhc2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlX3BvaW50ZXIgCQlub2RlX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bm9kZV9jb25zdF9wb2ludGVyIAlub2RlX2NvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIFBCX0RTX1JDX0NfREVDIAkJCQlyY190OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBWYWx1ZV9UeXBlIAkJCQl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAJCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpkaWZmZXJlbmNlX3R5cGUgCQlkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRlciAJCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfcG9pbnRlciAJY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpyZWZlcmVuY2UgCQlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIAljb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRfY29uc3RfaXRlcmF0b3IgCXBvaW50X2NvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnBvaW50X2l0ZXJhdG9yIAlwb2ludF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9pdGVyYXRvciAJY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6aXRlcmF0b3IgCQlpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjbXBfZm4gCQljbXBfZm47CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6YWxsb2NhdG9yX3R5cGUgCWFsbG9jYXRvcl90eXBlOworCisgICAgICByY19iaW5vbWlhbF9oZWFwKCk7CisKKyAgICAgIHJjX2Jpbm9taWFsX2hlYXAoY29uc3QgQ21wX0ZuJik7CisKKyAgICAgIHJjX2Jpbm9taWFsX2hlYXAoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgfnJjX2Jpbm9taWFsX2hlYXAoKTsKKworICAgICAgdm9pZAorICAgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICBpbmxpbmUgcG9pbnRfaXRlcmF0b3IKKyAgICAgIHB1c2goY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgdm9pZAorICAgICAgbW9kaWZ5KHBvaW50X2l0ZXJhdG9yLCBjb25zdF9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgcG9wKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKHBvaW50X2l0ZXJhdG9yKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGNsZWFyKCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlX2lmKFByZWQpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorICAgICAgdm9pZAorICAgICAgc3BsaXQoUHJlZCwgUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdm9pZAorICAgICAgam9pbihQQl9EU19DTEFTU19DX0RFQyYpOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZChjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKyNlbmRpZgorCisjaWZkZWYgUEJfRFNfUkNfQklOT01JQUxfSEVBUF9UUkFDRV8KKyAgICAgIHZvaWQKKyAgICAgIHRyYWNlKCkgY29uc3Q7CisjZW5kaWYKKworICAgIHByaXZhdGU6CisKKyAgICAgIGlubGluZSBub2RlX3BvaW50ZXIKKyAgICAgIGxpbmtfd2l0aF9uZXh0X3NpYmxpbmcobm9kZV9wb2ludGVyKTsKKworICAgICAgdm9pZAorICAgICAgbWFrZV8wX2V4cG9zZWQoKTsKKworICAgICAgdm9pZAorICAgICAgbWFrZV9iaW5vbWlhbF9oZWFwKCk7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgc3RhdGljIG5vZGVfY29uc3RfcG9pbnRlcgorICAgICAgbmV4dF8yX3BvaW50ZXIobm9kZV9jb25zdF9wb2ludGVyKTsKKworICAgICAgc3RhdGljIG5vZGVfY29uc3RfcG9pbnRlcgorICAgICAgbmV4dF9hZnRlcl8wX3BvaW50ZXIobm9kZV9jb25zdF9wb2ludGVyKTsKKyNlbmRpZgorCisgICAgICByY190IAkJCW1fcmM7CisgICAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vdHJhY2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9pbnNlcnRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX1JDX0NfREVDCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWFlZTk4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAKQEAgLTAsMCArMSw3NyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSByY19iaW5vbWlhbF9oZWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgcmNfYmlub21pYWxfaGVhcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIFByZWQ+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxpdChQcmVkIHByZWQsIFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKworICBtYWtlX2Jpbm9taWFsX2hlYXAoKTsKKyAgb3RoZXIubWFrZV9iaW5vbWlhbF9oZWFwKCk7CisgIGJhc2VfdHlwZTo6c3BsaXQocHJlZCwgb3RoZXIpOworICBiYXNlX3R5cGU6OmZpbmRfbWF4KCk7CisgIG90aGVyLmZpbmRfbWF4KCk7CisKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citqb2luKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKworICBtYWtlX2Jpbm9taWFsX2hlYXAoKTsKKyAgb3RoZXIubWFrZV9iaW5vbWlhbF9oZWFwKCk7CisgIGJhc2VfdHlwZTo6am9pbihvdGhlcik7CisgIGJhc2VfdHlwZTo6ZmluZF9tYXgoKTsKKyAgb3RoZXIuZmluZF9tYXgoKTsKKworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vdHJhY2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vdHJhY2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjOWEyMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy90cmFjZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDUyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHJjX2Jpbm9taWFsX2hlYXBfL3RyYWNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgcmNfYmlub21pYWxfaGVhcF8uCisgKi8KKworI2lmZGVmIFBCX0RTX1JDX0JJTk9NSUFMX0hFQVBfVFJBQ0VfCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0cmFjZSgpIGNvbnN0Cit7CisgIGJhc2VfdHlwZTo6dHJhY2UoKTsKKyAgbV9yYy50cmFjZSgpOworfQorCisjZW5kaWYgLy8gI2lmZGVmIFBCX0RTX1JDX0JJTk9NSUFMX0hFQVBfVFJBQ0VfCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9jY19oYXNoX21heF9jb2xsaXNpb25fY2hlY2tfcmVzaXplX3RyaWdnZXJfaW1wLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2NjX2hhc2hfbWF4X2NvbGxpc2lvbl9jaGVja19yZXNpemVfdHJpZ2dlcl9pbXAuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYjRhODAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9jY19oYXNoX21heF9jb2xsaXNpb25fY2hlY2tfcmVzaXplX3RyaWdnZXJfaW1wLmhwcApAQCAtMCwwICsxLDIxMSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19oYXNoX21heF9jb2xsaXNpb25fY2hlY2tfcmVzaXplX3RyaWdnZXJfaW1wLmhwcAorICogQ29udGFpbnMgYSByZXNpemUgdHJpZ2dlciBpbXBsZW1lbnRhdGlvbi4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorY2NfaGFzaF9tYXhfY29sbGlzaW9uX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyKGZsb2F0IGxvYWQpIDoKKyAgbV9sb2FkKGxvYWQpLAorICBtX3NpemUoMCksCisgIG1fbnVtX2NvbCgwKSwKKyAgbV9tYXhfY29sKDApLAorICBtX3Jlc2l6ZV9uZWVkZWQoZmFsc2UpCit7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZmluZF9zZWFyY2hfc3RhcnQoKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2ZpbmRfc2VhcmNoX2NvbGxpc2lvbigpCit7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZmluZF9zZWFyY2hfZW5kKCkKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9pbnNlcnRfc2VhcmNoX3N0YXJ0KCkKK3sgbV9udW1fY29sID0gMDsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9pbnNlcnRfc2VhcmNoX2NvbGxpc2lvbigpCit7ICsrbV9udW1fY29sOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2luc2VydF9zZWFyY2hfZW5kKCkKK3sgY2FsY19yZXNpemVfbmVlZGVkKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZXJhc2Vfc2VhcmNoX3N0YXJ0KCkKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9lcmFzZV9zZWFyY2hfY29sbGlzaW9uKCkKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCkKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9pbnNlcnRlZChzaXplX3R5cGUpCit7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZXJhc2VkKHNpemVfdHlwZSkKK3sgbV9yZXNpemVfbmVlZGVkID0gdHJ1ZTsgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2NsZWFyZWQoKQoreyBtX3Jlc2l6ZV9uZWVkZWQgPSBmYWxzZTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2lzX3Jlc2l6ZV9uZWVkZWQoKSBjb25zdAoreyByZXR1cm4gbV9yZXNpemVfbmVlZGVkOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraXNfZ3Jvd19uZWVkZWQoc2l6ZV90eXBlIC8qc2l6ZSovLCBzaXplX3R5cGUgLypudW1fdXNlZF9lKi8pIGNvbnN0Cit7IHJldHVybiBtX251bV9jb2wgPj0gbV9tYXhfY29sOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfcmVzaXplZChzaXplX3R5cGUgbmV3X3NpemUpCit7CisgIG1fc2l6ZSA9IG5ld19zaXplOworCisjaWZkZWYgUEJfRFNfSFRfTUFQX1JFU0laRV9UUkFDRV8KKyAgc3RkOjpjZXJyIDw8ICJjaG1jY3J0Ojpub3RpZnlfcmVzaXplZCAiIAorCSAgICA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihuZXdfc2l6ZSkgPDwgc3RkOjplbmRsOworI2VuZGlmIAorCisgIGNhbGNfbWF4X251bV9jb2xsKCk7CisgIGNhbGNfcmVzaXplX25lZWRlZCgpOworICBtX251bV9jb2wgPSAwOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY2FsY19tYXhfbnVtX2NvbGwoKQoreworICAvLyBtYXhfY29sIDwtLSBcc3FydHsyIGxvYWQgXGxuKCAyIG0gXGxuKCBtICkgKSB9CisgIGNvbnN0IGRvdWJsZSBsbl9hcmcgPSAyICogbV9zaXplICogc3RkOjpsb2coZG91YmxlKG1fc2l6ZSkpOworICBtX21heF9jb2wgPSBzaXplX3R5cGUoc3RkOjpjZWlsKHN0ZDo6c3FydCgyICogbV9sb2FkICogc3RkOjpsb2cobG5fYXJnKSkpKTsKKworI2lmZGVmIFBCX0RTX0hUX01BUF9SRVNJWkVfVFJBQ0VfCisgIHN0ZDo6Y2VyciA8PCAiY2htY2NydDo6Y2FsY19tYXhfbnVtX2NvbGwgIiAKKwkgICAgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obV9zaXplKSA8PCAgICAiICAgICIgCisJICAgIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KG1fbWF4X2NvbCkgPDwgc3RkOjplbmRsOworI2VuZGlmIAorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2V4dGVybmFsbHlfcmVzaXplZChzaXplX3R5cGUgbmV3X3NpemUpCit7IG5vdGlmeV9yZXNpemVkKG5ld19zaXplKTsgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIHN0ZDo6c3dhcChtX2xvYWQsIG90aGVyLm1fbG9hZCk7CisgIHN0ZDo6c3dhcChtX3NpemUsIG90aGVyLm1fc2l6ZSk7CisgIHN0ZDo6c3dhcChtX251bV9jb2wsIG90aGVyLm1fbnVtX2NvbCk7CisgIHN0ZDo6c3dhcChtX21heF9jb2wsIG90aGVyLm1fbWF4X2NvbCk7CisgIHN0ZDo6c3dhcChtX3Jlc2l6ZV9uZWVkZWQsIG90aGVyLm1fcmVzaXplX25lZWRlZCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgZmxvYXQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9sb2FkKCkgY29uc3QKK3sKKyAgUEJfRFNfU1RBVElDX0FTU0VSVChhY2Nlc3MsIGV4dGVybmFsX2xvYWRfYWNjZXNzKTsKKyAgcmV0dXJuIG1fbG9hZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjYWxjX3Jlc2l6ZV9uZWVkZWQoKQoreyBtX3Jlc2l6ZV9uZWVkZWQgPSBtX3Jlc2l6ZV9uZWVkZWQgfHwgbV9udW1fY29sID49IG1fbWF4X2NvbDsgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc2V0X2xvYWQoZmxvYXQgbG9hZCkKK3sKKyAgUEJfRFNfU1RBVElDX0FTU0VSVChhY2Nlc3MsIGV4dGVybmFsX2xvYWRfYWNjZXNzKTsKKyAgbV9sb2FkID0gbG9hZDsKKyAgY2FsY19tYXhfbnVtX2NvbGwoKTsKKyAgY2FsY19yZXNpemVfbmVlZGVkKCk7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2hhc2hfZXhwb25lbnRpYWxfc2l6ZV9wb2xpY3lfaW1wLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2hhc2hfZXhwb25lbnRpYWxfc2l6ZV9wb2xpY3lfaW1wLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTU2ODdmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9leHBvbmVudGlhbF9zaXplX3BvbGljeV9pbXAuaHBwCkBAIC0wLDAgKzEsOTAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaGFzaF9leHBvbmVudGlhbF9zaXplX3BvbGljeV9pbXAuaHBwCisgKiBDb250YWlucyBhIHJlc2l6ZSBzaXplIHBvbGljeSBpbXBsZW1lbnRhdGlvbi4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgoraGFzaF9leHBvbmVudGlhbF9zaXplX3BvbGljeShzaXplX3R5cGUgc3RhcnRfc2l6ZSwgc2l6ZV90eXBlIGdyb3dfZmFjdG9yKSA6CisgIG1fc3RhcnRfc2l6ZShzdGFydF9zaXplKSwKKyAgbV9ncm93X2ZhY3Rvcihncm93X2ZhY3RvcikKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIHN0ZDo6c3dhcChtX3N0YXJ0X3NpemUsIG90aGVyLm1fc3RhcnRfc2l6ZSk7CisgIHN0ZDo6c3dhcChtX2dyb3dfZmFjdG9yLCBvdGhlci5tX2dyb3dfZmFjdG9yKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9uZWFyZXN0X2xhcmdlcl9zaXplKHNpemVfdHlwZSBzaXplKSBjb25zdAoreworICBzaXplX3R5cGUgcmV0ID0gbV9zdGFydF9zaXplOworICB3aGlsZSAocmV0IDw9IHNpemUpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIG5leHRfcmV0ID0gcmV0KiAgbV9ncm93X2ZhY3RvcjsKKyAgICAgIGlmIChuZXh0X3JldCA8IHJldCkKKwlfX3Rocm93X2luc2VydF9lcnJvcigpOworICAgICAgcmV0ID0gbmV4dF9yZXQ7CisgICAgfQorICByZXR1cm4gcmV0OworfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X25lYXJlc3Rfc21hbGxlcl9zaXplKHNpemVfdHlwZSBzaXplKSBjb25zdAoreworICBzaXplX3R5cGUgcmV0ID0gbV9zdGFydF9zaXplOworICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgbmV4dF9yZXQgPSByZXQqICBtX2dyb3dfZmFjdG9yOworICAgICAgaWYgKG5leHRfcmV0IDwgcmV0KQorCV9fdGhyb3dfcmVzaXplX2Vycm9yKCk7CisgICAgICBpZiAobmV4dF9yZXQgPj0gc2l6ZSkKKwlyZXR1cm4gKHJldCk7CisgICAgICByZXQgPSBuZXh0X3JldDsKKyAgICB9CisgIHJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2hhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcl9pbXAuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX2ltcC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY0YzQ4MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2hhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcl9pbXAuaHBwCkBAIC0wLDAgKzEsMjkzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGhhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcl9pbXAuaHBwCisgKiBDb250YWlucyBhIHJlc2l6ZSB0cmlnZ2VyIGltcGxlbWVudGF0aW9uLgorICovCisKKyNkZWZpbmUgUEJfRFNfQVNTRVJUX1ZBTElEKFgpCQkJCQkJXAorICBfR0xJQkNYWF9ERUJVR19PTkxZKFguYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgoraGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyKGZsb2F0IGxvYWRfbWluLCBmbG9hdCBsb2FkX21heCkKKzogbV9sb2FkX21pbihsb2FkX21pbiksIG1fbG9hZF9tYXgobG9hZF9tYXgpLCBtX25leHRfc2hyaW5rX3NpemUoMCksCisgIG1fbmV4dF9ncm93X3NpemUoMCksIG1fcmVzaXplX25lZWRlZChmYWxzZSkKK3sgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZmluZF9zZWFyY2hfc3RhcnQoKQoreyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9maW5kX3NlYXJjaF9jb2xsaXNpb24oKQoreyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9maW5kX3NlYXJjaF9lbmQoKQoreyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9pbnNlcnRfc2VhcmNoX3N0YXJ0KCkKK3sgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfaW5zZXJ0X3NlYXJjaF9jb2xsaXNpb24oKQoreyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9pbnNlcnRfc2VhcmNoX2VuZCgpCit7IFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKSB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2VyYXNlX3NlYXJjaF9zdGFydCgpCit7IFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKSB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2VyYXNlX3NlYXJjaF9jb2xsaXNpb24oKQoreyBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCkKK3sgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfaW5zZXJ0ZWQoc2l6ZV90eXBlIG51bV9lbnRyaWVzKQoreworICBtX3Jlc2l6ZV9uZWVkZWQgPSAobnVtX2VudHJpZXMgPj0gbV9uZXh0X2dyb3dfc2l6ZSk7CisgIHNpemVfYmFzZTo6c2V0X3NpemUobnVtX2VudHJpZXMpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZXJhc2VkKHNpemVfdHlwZSBudW1fZW50cmllcykKK3sKKyAgc2l6ZV9iYXNlOjpzZXRfc2l6ZShudW1fZW50cmllcyk7CisgIG1fcmVzaXplX25lZWRlZCA9IG51bV9lbnRyaWVzIDw9IG1fbmV4dF9zaHJpbmtfc2l6ZTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraXNfcmVzaXplX25lZWRlZCgpIGNvbnN0Cit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gbV9yZXNpemVfbmVlZGVkOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2lzX2dyb3dfbmVlZGVkKHNpemVfdHlwZSAvKnNpemUqLywgc2l6ZV90eXBlIG51bV9lbnRyaWVzKSBjb25zdAoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9yZXNpemVfbmVlZGVkKTsKKyAgcmV0dXJuIG51bV9lbnRyaWVzID49IG1fbmV4dF9ncm93X3NpemU7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+aGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyKCkgeyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfcmVzaXplZChzaXplX3R5cGUgbmV3X3NpemUpCit7CisgIG1fcmVzaXplX25lZWRlZCA9IGZhbHNlOworICBtX25leHRfZ3Jvd19zaXplID0gc2l6ZV90eXBlKG1fbG9hZF9tYXggKiBuZXdfc2l6ZSAtIDEpOworICBtX25leHRfc2hyaW5rX3NpemUgPSBzaXplX3R5cGUobV9sb2FkX21pbiAqIG5ld19zaXplKTsKKworI2lmZGVmIFBCX0RTX0hUX01BUF9SRVNJWkVfVFJBQ0VfCisgIHN0ZDo6Y2VyciA8PCAiaGxjcnQ6Om5vdGlmeV9yZXNpemVkICIgIDw8IHN0ZDo6ZW5kbAorCSAgICA8PCAiMSAiIDw8IG5ld19zaXplIDw8IHN0ZDo6ZW5kbAorCSAgICA8PCAiMiAiIDw8IG1fbG9hZF9taW4gPDwgc3RkOjplbmRsCisJICAgIDw8ICIzICIgPDwgbV9sb2FkX21heCA8PCBzdGQ6OmVuZGwKKwkgICAgPDwgIjQgIiA8PCBtX25leHRfc2hyaW5rX3NpemUgPDwgc3RkOjplbmRsCisJICAgIDw8ICI1ICIgPDwgbV9uZXh0X2dyb3dfc2l6ZSA8PCBzdGQ6OmVuZGw7CisjZW5kaWYKKworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9leHRlcm5hbGx5X3Jlc2l6ZWQoc2l6ZV90eXBlIG5ld19zaXplKQoreworICBtX3Jlc2l6ZV9uZWVkZWQgPSBmYWxzZTsKKyAgc2l6ZV90eXBlIG5ld19ncm93X3NpemUgPSBzaXplX3R5cGUobV9sb2FkX21heCAqIG5ld19zaXplIC0gMSk7CisgIHNpemVfdHlwZSBuZXdfc2hyaW5rX3NpemUgPSBzaXplX3R5cGUobV9sb2FkX21pbiAqIG5ld19zaXplKTsKKworI2lmZGVmIFBCX0RTX0hUX01BUF9SRVNJWkVfVFJBQ0VfCisgIHN0ZDo6Y2VyciA8PCAiaGxjcnQ6Om5vdGlmeV9leHRlcm5hbGx5X3Jlc2l6ZWQgIiAgPDwgc3RkOjplbmRsCisJICAgIDw8ICIxICIgPDwgbmV3X3NpemUgPDwgc3RkOjplbmRsCisJICAgIDw8ICIyICIgPDwgbV9sb2FkX21pbiA8PCBzdGQ6OmVuZGwKKwkgICAgPDwgIjMgIiA8PCBtX2xvYWRfbWF4IDw8IHN0ZDo6ZW5kbAorCSAgICA8PCAiNCAiIDw8IG1fbmV4dF9zaHJpbmtfc2l6ZSA8PCBzdGQ6OmVuZGwKKwkgICAgPDwgIjUgIiA8PCBtX25leHRfZ3Jvd19zaXplIDw8IHN0ZDo6ZW5kbAorCSAgICA8PCAiNiAiIDw8IG5ld19zaHJpbmtfc2l6ZSA8PCBzdGQ6OmVuZGwKKwkgICAgPDwgIjcgIiA8PCBuZXdfZ3Jvd19zaXplIDw8IHN0ZDo6ZW5kbDsKKyNlbmRpZgorCisgIGlmIChuZXdfZ3Jvd19zaXplID49IG1fbmV4dF9ncm93X3NpemUpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG5ld19zaHJpbmtfc2l6ZSA+PSBtX25leHRfc2hyaW5rX3NpemUpOworICAgICAgbV9uZXh0X2dyb3dfc2l6ZSA9IG5ld19ncm93X3NpemU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG5ld19zaHJpbmtfc2l6ZSA8PSBtX25leHRfc2hyaW5rX3NpemUpOworICAgICAgbV9uZXh0X3Nocmlua19zaXplID0gbmV3X3Nocmlua19zaXplOworICAgIH0KKworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9jbGVhcmVkKCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHNpemVfYmFzZTo6c2V0X3NpemUoMCk7CisgIG1fcmVzaXplX25lZWRlZCA9ICgwIDwgbV9uZXh0X3Nocmlua19zaXplKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKworICBzaXplX2Jhc2U6OnN3YXAob3RoZXIpOworICBzdGQ6OnN3YXAobV9sb2FkX21pbiwgb3RoZXIubV9sb2FkX21pbik7CisgIHN0ZDo6c3dhcChtX2xvYWRfbWF4LCBvdGhlci5tX2xvYWRfbWF4KTsKKyAgc3RkOjpzd2FwKG1fcmVzaXplX25lZWRlZCwgb3RoZXIubV9yZXNpemVfbmVlZGVkKTsKKyAgc3RkOjpzd2FwKG1fbmV4dF9ncm93X3NpemUsIG90aGVyLm1fbmV4dF9ncm93X3NpemUpOworICBzdGQ6OnN3YXAobV9uZXh0X3Nocmlua19zaXplLCBvdGhlci5tX25leHRfc2hyaW5rX3NpemUpOworCisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgc3RkOjpwYWlyPGZsb2F0LCBmbG9hdD4KK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9sb2FkcygpIGNvbnN0Cit7CisgIFBCX0RTX1NUQVRJQ19BU1NFUlQoYWNjZXNzLCBleHRlcm5hbF9sb2FkX2FjY2Vzcyk7CisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihtX2xvYWRfbWluLCBtX2xvYWRfbWF4KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NldF9sb2FkcyhzdGQ6OnBhaXI8ZmxvYXQsIGZsb2F0PiBsb2FkX3BhaXIpCit7CisgIFBCX0RTX1NUQVRJQ19BU1NFUlQoYWNjZXNzLCBleHRlcm5hbF9sb2FkX2FjY2Vzcyk7CisgIGNvbnN0IGZsb2F0IG9sZF9sb2FkX21pbiA9IG1fbG9hZF9taW47CisgIGNvbnN0IGZsb2F0IG9sZF9sb2FkX21heCA9IG1fbG9hZF9tYXg7CisgIGNvbnN0IHNpemVfdHlwZSBvbGRfbmV4dF9zaHJpbmtfc2l6ZSA9IG1fbmV4dF9zaHJpbmtfc2l6ZTsKKyAgY29uc3Qgc2l6ZV90eXBlIG9sZF9uZXh0X2dyb3dfc2l6ZSA9IG1fbmV4dF9ncm93X3NpemU7CisgIGNvbnN0IGJvb2wgb2xkX3Jlc2l6ZV9uZWVkZWQgPSBtX3Jlc2l6ZV9uZWVkZWQ7CisKKyAgX190cnkKKyAgICB7CisgICAgICBtX2xvYWRfbWluID0gbG9hZF9wYWlyLmZpcnN0OworICAgICAgbV9sb2FkX21heCA9IGxvYWRfcGFpci5zZWNvbmQ7CisgICAgICBkb19yZXNpemUoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihzaXplX2Jhc2U6OmdldF9zaXplKCkgLyAoKG1fbG9hZF9taW4gKyBtX2xvYWRfbWF4KSAvIDIpKSk7CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7CisgICAgICBtX2xvYWRfbWluID0gb2xkX2xvYWRfbWluOworICAgICAgbV9sb2FkX21heCA9IG9sZF9sb2FkX21heDsKKyAgICAgIG1fbmV4dF9zaHJpbmtfc2l6ZSA9IG9sZF9uZXh0X3Nocmlua19zaXplOworICAgICAgbV9uZXh0X2dyb3dfc2l6ZSA9IG9sZF9uZXh0X2dyb3dfc2l6ZTsKKyAgICAgIG1fcmVzaXplX25lZWRlZCA9IG9sZF9yZXNpemVfbmVlZGVkOworICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgfQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZG9fcmVzaXplKHNpemVfdHlwZSkKK3sgc3RkOjphYm9ydCgpOyB9CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworIyBkZWZpbmUgUEJfRFNfREVCVUdfVkVSSUZZKF9Db25kKQkJCQkJXAorICBfR0xJQkNYWF9ERUJVR19WRVJJRllfQVQoX0NvbmQsCQkJCQlcCisJCQkgICBfTV9tZXNzYWdlKCNfQ29uZCIgYXNzZXJ0aW9uIGZyb20gJTE7OiUyOyIpCVwKKwkJCSAgIC5fTV9zdHJpbmcoX19GSUxFX18pLl9NX2ludGVnZXIoX19MSU5FX18pCVwKKwkJCSAgICxfX2ZpbGUsX19saW5lKQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgUEJfRFNfREVCVUdfVkVSSUZZKG1fbG9hZF9tYXggPiBtX2xvYWRfbWluKTsKKyAgUEJfRFNfREVCVUdfVkVSSUZZKG1fbmV4dF9ncm93X3NpemUgPj0gbV9uZXh0X3Nocmlua19zaXplKTsKK30KKyMgdW5kZWYgUEJfRFNfREVCVUdfVkVSSUZZCisjZW5kaWYKKyN1bmRlZiBQQl9EU19BU1NFUlRfVkFMSUQKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2hhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcl9zaXplX2Jhc2UuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX3NpemVfYmFzZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMzMmRkNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2hhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcl9zaXplX2Jhc2UuaHBwCkBAIC0wLDAgKzEsOTQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX3NpemVfYmFzZS5ocHAKKyAqIENvbnRhaW5zIGFuIGJhc2UgaG9sZGluZyBzaXplIGZvciBzb21lIHJlc2l6ZSBwb2xpY2llcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX0hBU0hfTE9BRF9DSEVDS19SRVNJWkVfVFJJR0dFUl9TSVpFX0JBU0VfSFBQCisjZGVmaW5lIFBCX0RTX0hBU0hfTE9BRF9DSEVDS19SRVNJWkVfVFJJR0dFUl9TSVpFX0JBU0VfSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8vLyBQcmltYXJ5IHRlbXBsYXRlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZSwgYm9vbCBIb2xkX1NpemU+CisgICAgY2xhc3MgaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX3NpemVfYmFzZTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbnMuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9UeXBlPgorICAgIGNsYXNzIGhhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcl9zaXplX2Jhc2U8U2l6ZV9UeXBlLCB0cnVlPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIFNpemVfVHlwZSBzaXplX3R5cGU7CisKKyAgICAgIGhhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcl9zaXplX2Jhc2UoKTogbV9zaXplKDApCisgICAgICB7IH0KKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHN3YXAoaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX3NpemVfYmFzZSYgb3RoZXIpCisgICAgICB7IHN0ZDo6c3dhcChtX3NpemUsIG90aGVyLm1fc2l6ZSk7IH0KKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHNldF9zaXplKHNpemVfdHlwZSBzaXplKQorICAgICAgeyBtX3NpemUgPSBzaXplOyB9CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIGdldF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fc2l6ZTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHNpemVfdHlwZSBtX3NpemU7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZT4KKyAgICBjbGFzcyBoYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXJfc2l6ZV9iYXNlPFNpemVfVHlwZSwgZmFsc2U+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgU2l6ZV9UeXBlIHNpemVfdHlwZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBzd2FwKGhhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcl9zaXplX2Jhc2UmIG90aGVyKSB7IH0KKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHNldF9zaXplKHNpemVfdHlwZSBzaXplKSB7IH0KKyAgICB9OworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9oYXNoX3ByaW1lX3NpemVfcG9saWN5X2ltcC5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9oYXNoX3ByaW1lX3NpemVfcG9saWN5X2ltcC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdjOTI2MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2hhc2hfcHJpbWVfc2l6ZV9wb2xpY3lfaW1wLmhwcApAQCAtMCwwICsxLDE2MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBoYXNoX3ByaW1lX3NpemVfcG9saWN5X2ltcC5ocHAKKyAqIENvbnRhaW5zIGEgcmVzaXplIHNpemUgcG9saWN5IGltcGxlbWVudGF0aW9uLgorICovCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworbmFtZXNwYWNlIGRldGFpbAoreworICBlbnVtCisgICAgeworICAgICAgbnVtX2Rpc3RpbmN0X3NpemVzXzMyX2JpdCA9IDMwLAorICAgICAgbnVtX2Rpc3RpbmN0X3NpemVzXzY0X2JpdCA9IDYyLAorICAgICAgbnVtX2Rpc3RpbmN0X3NpemVzID0gc2l6ZW9mKHN0ZDo6c2l6ZV90KSAhPSA4ID8gCisgICAgICAgICAgICBudW1fZGlzdGluY3Rfc2l6ZXNfMzJfYml0IDogbnVtX2Rpc3RpbmN0X3NpemVzXzY0X2JpdCwJCisgICAgfTsKKworICAvLyBPcmlnaW5hbGx5IHRha2VuIGZyb20gdGhlIFNHSSBpbXBsZW1lbnRhdGlvbjsgYWNrbm93bGVkZ2VkIGluIHRoZSBkb2NzLgorICAvLyBGdXJ0aGVyIG1vZGlmaWVkIChmb3IgNjQgYml0cykgZnJvbSB0cjEncyBoYXNodGFibGUuCisgIHN0YXRpYyBjb25zdCBzdGQ6OnNpemVfdCBnX2Ffc2l6ZXNbbnVtX2Rpc3RpbmN0X3NpemVzXzY0X2JpdF0gPQorICAgIHsKKyAgICAgIC8qIDAgICAgICovICAgICAgICAgICAgICA1dWwsCisgICAgICAvKiAxICAgICAqLyAgICAgICAgICAgICAgMTF1bCwgCisgICAgICAvKiAyICAgICAqLyAgICAgICAgICAgICAgMjN1bCwgCisgICAgICAvKiAzICAgICAqLyAgICAgICAgICAgICAgNDd1bCwgCisgICAgICAvKiA0ICAgICAqLyAgICAgICAgICAgICAgOTd1bCwgCisgICAgICAvKiA1ICAgICAqLyAgICAgICAgICAgICAgMTk5dWwsIAorICAgICAgLyogNiAgICAgKi8gICAgICAgICAgICAgIDQwOXVsLCAKKyAgICAgIC8qIDcgICAgICovICAgICAgICAgICAgICA4MjN1bCwgCisgICAgICAvKiA4ICAgICAqLyAgICAgICAgICAgICAgMTc0MXVsLCAKKyAgICAgIC8qIDkgICAgICovICAgICAgICAgICAgICAzNDY5dWwsIAorICAgICAgLyogMTAgICAgKi8gICAgICAgICAgICAgIDY5NDl1bCwgCisgICAgICAvKiAxMSAgICAqLyAgICAgICAgICAgICAgMTQwMzN1bCwgCisgICAgICAvKiAxMiAgICAqLyAgICAgICAgICAgICAgMjg0MTF1bCwgCisgICAgICAvKiAxMyAgICAqLyAgICAgICAgICAgICAgNTc1NTd1bCwgCisgICAgICAvKiAxNCAgICAqLyAgICAgICAgICAgICAgMTE2NzMxdWwsIAorICAgICAgLyogMTUgICAgKi8gICAgICAgICAgICAgIDIzNjg5N3VsLAorICAgICAgLyogMTYgICAgKi8gICAgICAgICAgICAgIDQ4MDg4MXVsLCAKKyAgICAgIC8qIDE3ICAgICovICAgICAgICAgICAgICA5NzYzNjl1bCwKKyAgICAgIC8qIDE4ICAgICovICAgICAgICAgICAgICAxOTgyNjI3dWwsIAorICAgICAgLyogMTkgICAgKi8gICAgICAgICAgICAgIDQwMjYwMzF1bCwKKyAgICAgIC8qIDIwICAgICovICAgICAgICAgICAgICA4MTc1MzgzdWwsIAorICAgICAgLyogMjEgICAgKi8gICAgICAgICAgICAgIDE2NjAxNTkzdWwsIAorICAgICAgLyogMjIgICAgKi8gICAgICAgICAgICAgIDMzNzEyNzI5dWwsCisgICAgICAvKiAyMyAgICAqLyAgICAgICAgICAgICAgNjg0NjAzOTF1bCwgCisgICAgICAvKiAyNCAgICAqLyAgICAgICAgICAgICAgMTM5MDIyNDE3dWwsIAorICAgICAgLyogMjUgICAgKi8gICAgICAgICAgICAgIDI4MjMxMjc5OXVsLCAKKyAgICAgIC8qIDI2ICAgICovICAgICAgICAgICAgICA1NzMyOTI4MTd1bCwgCisgICAgICAvKiAyNyAgICAqLyAgICAgICAgICAgICAgMTE2NDE4NjIxN3VsLAorICAgICAgLyogMjggICAgKi8gICAgICAgICAgICAgIDIzNjQxMTQyMTd1bCwgCisgICAgICAvKiAyOSAgICAqLyAgICAgICAgICAgICAgNDI5NDk2NzI5MXVsLAorICAgICAgLyogMzAgICAgKi8gKHN0ZDo6c2l6ZV90KTg1ODk5MzQ1ODN1bGwsCisgICAgICAvKiAzMSAgICAqLyAoc3RkOjpzaXplX3QpMTcxNzk4NjkxNDN1bGwsCisgICAgICAvKiAzMiAgICAqLyAoc3RkOjpzaXplX3QpMzQzNTk3MzgzMzd1bGwsCisgICAgICAvKiAzMyAgICAqLyAoc3RkOjpzaXplX3QpNjg3MTk0NzY3MzF1bGwsCisgICAgICAvKiAzNCAgICAqLyAoc3RkOjpzaXplX3QpMTM3NDM4OTUzNDQ3dWxsLAorICAgICAgLyogMzUgICAgKi8gKHN0ZDo6c2l6ZV90KTI3NDg3NzkwNjg5OXVsbCwKKyAgICAgIC8qIDM2ICAgICovIChzdGQ6OnNpemVfdCk1NDk3NTU4MTM4ODF1bGwsCisgICAgICAvKiAzNyAgICAqLyAoc3RkOjpzaXplX3QpMTA5OTUxMTYyNzY4OXVsbCwKKyAgICAgIC8qIDM4ICAgICovIChzdGQ6OnNpemVfdCkyMTk5MDIzMjU1NTMxdWxsLAorICAgICAgLyogMzkgICAgKi8gKHN0ZDo6c2l6ZV90KTQzOTgwNDY1MTEwOTN1bGwsCisgICAgICAvKiA0MCAgICAqLyAoc3RkOjpzaXplX3QpODc5NjA5MzAyMjE1MXVsbCwKKyAgICAgIC8qIDQxICAgICovIChzdGQ6OnNpemVfdCkxNzU5MjE4NjA0NDM5OXVsbCwKKyAgICAgIC8qIDQyICAgICovIChzdGQ6OnNpemVfdCkzNTE4NDM3MjA4ODc3N3VsbCwKKyAgICAgIC8qIDQzICAgICovIChzdGQ6OnNpemVfdCk3MDM2ODc0NDE3NzY0M3VsbCwKKyAgICAgIC8qIDQ0ICAgICovIChzdGQ6OnNpemVfdCkxNDA3Mzc0ODgzNTUyMTN1bGwsCisgICAgICAvKiA0NSAgICAqLyAoc3RkOjpzaXplX3QpMjgxNDc0OTc2NzEwNTk3dWxsLAorICAgICAgLyogNDYgICAgKi8gKHN0ZDo6c2l6ZV90KTU2Mjk0OTk1MzQyMTIzMXVsbCwgCisgICAgICAvKiA0NyAgICAqLyAoc3RkOjpzaXplX3QpMTEyNTg5OTkwNjg0MjU5N3VsbCwKKyAgICAgIC8qIDQ4ICAgICovIChzdGQ6OnNpemVfdCkyMjUxNzk5ODEzNjg1MTE5dWxsLCAKKyAgICAgIC8qIDQ5ICAgICovIChzdGQ6OnNpemVfdCk0NTAzNTk5NjI3MzcwNDQ5dWxsLAorICAgICAgLyogNTAgICAgKi8gKHN0ZDo6c2l6ZV90KTkwMDcxOTkyNTQ3NDA4ODF1bGwsIAorICAgICAgLyogNTEgICAgKi8gKHN0ZDo6c2l6ZV90KTE4MDE0Mzk4NTA5NDgxOTUxdWxsLAorICAgICAgLyogNTIgICAgKi8gKHN0ZDo6c2l6ZV90KTM2MDI4Nzk3MDE4OTYzOTEzdWxsLCAKKyAgICAgIC8qIDUzICAgICovIChzdGQ6OnNpemVfdCk3MjA1NzU5NDAzNzkyNzkzMXVsbCwKKyAgICAgIC8qIDU0ICAgICovIChzdGQ6OnNpemVfdCkxNDQxMTUxODgwNzU4NTU4NTl1bGwsCisgICAgICAvKiA1NSAgICAqLyAoc3RkOjpzaXplX3QpMjg4MjMwMzc2MTUxNzExNzE3dWxsLAorICAgICAgLyogNTYgICAgKi8gKHN0ZDo6c2l6ZV90KTU3NjQ2MDc1MjMwMzQyMzQzM3VsbCwKKyAgICAgIC8qIDU3ICAgICovIChzdGQ6OnNpemVfdCkxMTUyOTIxNTA0NjA2ODQ2ODgzdWxsLAorICAgICAgLyogNTggICAgKi8gKHN0ZDo6c2l6ZV90KTIzMDU4NDMwMDkyMTM2OTM5NTF1bGwsCisgICAgICAvKiA1OSAgICAqLyAoc3RkOjpzaXplX3QpNDYxMTY4NjAxODQyNzM4Nzg0N3VsbCwKKyAgICAgIC8qIDYwICAgICovIChzdGQ6OnNpemVfdCk5MjIzMzcyMDM2ODU0Nzc1NzgzdWxsLAorICAgICAgLyogNjEgICAgKi8gKHN0ZDo6c2l6ZV90KTE4NDQ2NzQ0MDczNzA5NTUxNTU3dWxsLAorICAgIH07CisKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lCitQQl9EU19DTEFTU19DX0RFQzo6CitoYXNoX3ByaW1lX3NpemVfcG9saWN5KHNpemVfdHlwZSBuKSA6IG1fc3RhcnRfc2l6ZShuKQoreyBtX3N0YXJ0X3NpemUgPSBnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZShuKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreyBzdGQ6OnN3YXAobV9zdGFydF9zaXplLCBvdGhlci5tX3N0YXJ0X3NpemUpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoc2l6ZV90eXBlIG4pIGNvbnN0Cit7CisgIGNvbnN0IHN0ZDo6c2l6ZV90KiBjb25zdCBwX3VwcGVyID0gc3RkOjp1cHBlcl9ib3VuZChkZXRhaWw6OmdfYV9zaXplcywgCisJCSAgICAgZGV0YWlsOjpnX2Ffc2l6ZXMgKyBkZXRhaWw6Om51bV9kaXN0aW5jdF9zaXplcywgbik7CisKKyAgaWYgKHBfdXBwZXIgPT0gZGV0YWlsOjpnX2Ffc2l6ZXMgKyBkZXRhaWw6Om51bV9kaXN0aW5jdF9zaXplcykKKyAgICBfX3Rocm93X3Jlc2l6ZV9lcnJvcigpOworICByZXR1cm4gKnBfdXBwZXI7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X25lYXJlc3Rfc21hbGxlcl9zaXplKHNpemVfdHlwZSBuKSBjb25zdAoreworICBjb25zdCBzdGQ6OnNpemVfdCogcF9sb3dlciA9IHN0ZDo6bG93ZXJfYm91bmQoZGV0YWlsOjpnX2Ffc2l6ZXMsIAorCQkgICAgICAgZGV0YWlsOjpnX2Ffc2l6ZXMgKyBkZXRhaWw6Om51bV9kaXN0aW5jdF9zaXplcywgbik7CisKKyAgaWYgKCpwX2xvd2VyID49IG4gJiYgIHBfbG93ZXIgIT0gZGV0YWlsOjpnX2Ffc2l6ZXMpCisgICAgLS1wX2xvd2VyOworICBpZiAoKnBfbG93ZXIgPCBtX3N0YXJ0X3NpemUpCisgICAgcmV0dXJuIG1fc3RhcnRfc2l6ZTsKKyAgcmV0dXJuICpwX2xvd2VyOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5X2ltcC5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9oYXNoX3N0YW5kYXJkX3Jlc2l6ZV9wb2xpY3lfaW1wLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWE4M2Y0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5X2ltcC5ocHAKQEAgLTAsMCArMSwyNDkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5X2ltcC5ocHAKKyAqIENvbnRhaW5zIGEgcmVzaXplIHBvbGljeSBpbXBsZW1lbnRhdGlvbi4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgoraGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5KCkgCis6IG1fc2l6ZShTaXplX1BvbGljeTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSkpCit7IHRyaWdnZXJfcG9saWN5X2Jhc2U6Om5vdGlmeV9leHRlcm5hbGx5X3Jlc2l6ZWQobV9zaXplKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgoraGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5KGNvbnN0IFNpemVfUG9saWN5JiByX3NpemVfcG9saWN5KSAKKzogU2l6ZV9Qb2xpY3kocl9zaXplX3BvbGljeSksIG1fc2l6ZShTaXplX1BvbGljeTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSkpCit7IHRyaWdnZXJfcG9saWN5X2Jhc2U6Om5vdGlmeV9leHRlcm5hbGx5X3Jlc2l6ZWQobV9zaXplKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgoraGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5KGNvbnN0IFNpemVfUG9saWN5JiByX3NpemVfcG9saWN5LCAKKwkJCSAgICBjb25zdCBUcmlnZ2VyX1BvbGljeSYgcl90cmlnZ2VyX3BvbGljeSkgCis6IFNpemVfUG9saWN5KHJfc2l6ZV9wb2xpY3kpLCBUcmlnZ2VyX1BvbGljeShyX3RyaWdnZXJfcG9saWN5KSwKKyAgbV9zaXplKFNpemVfUG9saWN5OjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSkKK3sgdHJpZ2dlcl9wb2xpY3lfYmFzZTo6bm90aWZ5X2V4dGVybmFsbHlfcmVzaXplZChtX3NpemUpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+aGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5KCkKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIHRyaWdnZXJfcG9saWN5X2Jhc2U6OnN3YXAob3RoZXIpOworICBzaXplX3BvbGljeV9iYXNlOjpzd2FwKG90aGVyKTsKKyAgc3RkOjpzd2FwKG1fc2l6ZSwgb3RoZXIubV9zaXplKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZmluZF9zZWFyY2hfc3RhcnQoKQoreyB0cmlnZ2VyX3BvbGljeV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfc3RhcnQoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9maW5kX3NlYXJjaF9jb2xsaXNpb24oKQoreyB0cmlnZ2VyX3BvbGljeV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfY29sbGlzaW9uKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZmluZF9zZWFyY2hfZW5kKCkKK3sgdHJpZ2dlcl9wb2xpY3lfYmFzZTo6bm90aWZ5X2ZpbmRfc2VhcmNoX2VuZCgpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2luc2VydF9zZWFyY2hfc3RhcnQoKQoreyB0cmlnZ2VyX3BvbGljeV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9zdGFydCgpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2luc2VydF9zZWFyY2hfY29sbGlzaW9uKCkKK3sgdHJpZ2dlcl9wb2xpY3lfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfY29sbGlzaW9uKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKQoreyB0cmlnZ2VyX3BvbGljeV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9lcmFzZV9zZWFyY2hfc3RhcnQoKQoreyB0cmlnZ2VyX3BvbGljeV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX3N0YXJ0KCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZXJhc2Vfc2VhcmNoX2NvbGxpc2lvbigpCit7IHRyaWdnZXJfcG9saWN5X2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfY29sbGlzaW9uKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZXJhc2Vfc2VhcmNoX2VuZCgpCit7IHRyaWdnZXJfcG9saWN5X2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfaW5zZXJ0ZWQoc2l6ZV90eXBlIG51bV9lKQoreyB0cmlnZ2VyX3BvbGljeV9iYXNlOjpub3RpZnlfaW5zZXJ0ZWQobnVtX2UpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2VyYXNlZChzaXplX3R5cGUgbnVtX2UpCit7IHRyaWdnZXJfcG9saWN5X2Jhc2U6Om5vdGlmeV9lcmFzZWQobnVtX2UpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfY2xlYXJlZCgpCit7IHRyaWdnZXJfcG9saWN5X2Jhc2U6Om5vdGlmeV9jbGVhcmVkKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6Citpc19yZXNpemVfbmVlZGVkKCkgY29uc3QKK3sgcmV0dXJuIHRyaWdnZXJfcG9saWN5X2Jhc2U6OmlzX3Jlc2l6ZV9uZWVkZWQoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X25ld19zaXplKHNpemVfdHlwZSBzaXplLCBzaXplX3R5cGUgbnVtX3VzZWRfZSkgY29uc3QKK3sKKyAgaWYgKHRyaWdnZXJfcG9saWN5X2Jhc2U6OmlzX2dyb3dfbmVlZGVkKHNpemUsIG51bV91c2VkX2UpKQorICAgIHJldHVybiBzaXplX3BvbGljeV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZShzaXplKTsKKyAgcmV0dXJuIHNpemVfcG9saWN5X2Jhc2U6OmdldF9uZWFyZXN0X3NtYWxsZXJfc2l6ZShzaXplKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9yZXNpemVkKHNpemVfdHlwZSBuZXdfc2l6ZSkKK3sKKyAgdHJpZ2dlcl9wb2xpY3lfYmFzZTo6bm90aWZ5X3Jlc2l6ZWQobmV3X3NpemUpOworICBtX3NpemUgPSBuZXdfc2l6ZTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfYWN0dWFsX3NpemUoKSBjb25zdAoreworICBQQl9EU19TVEFUSUNfQVNTRVJUKGFjY2VzcywgZXh0ZXJuYWxfc2l6ZV9hY2Nlc3MpOworICByZXR1cm4gbV9zaXplOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVzaXplKHNpemVfdHlwZSBuZXdfc2l6ZSkKK3sKKyAgUEJfRFNfU1RBVElDX0FTU0VSVChhY2Nlc3MsIGV4dGVybmFsX3NpemVfYWNjZXNzKTsKKyAgc2l6ZV90eXBlIGFjdHVhbF9zaXplID0gc2l6ZV9wb2xpY3lfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSk7CisgIHdoaWxlIChhY3R1YWxfc2l6ZSA8IG5ld19zaXplKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBwb3QgPSBzaXplX3BvbGljeV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZShhY3R1YWxfc2l6ZSk7CisKKyAgICAgIGlmIChwb3QgPT0gYWN0dWFsX3NpemUgJiYgcG90IDwgbmV3X3NpemUpCisJX190aHJvd19yZXNpemVfZXJyb3IoKTsKKyAgICAgIGFjdHVhbF9zaXplID0gcG90OworICAgIH0KKworICBpZiAoYWN0dWFsX3NpemUgPiAwKQorICAgIC0tYWN0dWFsX3NpemU7CisKKyAgY29uc3Qgc2l6ZV90eXBlIG9sZF9zaXplID0gbV9zaXplOworICBfX3RyeQorICAgIHsKKyAgICAgIGRvX3Jlc2l6ZShhY3R1YWxfc2l6ZSAtIDEpOworICAgIH0KKyAgX19jYXRjaChpbnNlcnRfZXJyb3ImICkKKyAgICB7CisgICAgICBtX3NpemUgPSBvbGRfc2l6ZTsKKyAgICAgIF9fdGhyb3dfcmVzaXplX2Vycm9yKCk7CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7CisgICAgICBtX3NpemUgPSBvbGRfc2l6ZTsKKyAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2RvX3Jlc2l6ZShzaXplX3R5cGUpCit7CisgIC8vIERvIG5vdGhpbmcKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1RyaWdnZXJfUG9saWN5JiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF90cmlnZ2VyX3BvbGljeSgpCit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQworY29uc3QgVHJpZ2dlcl9Qb2xpY3kmIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X3RyaWdnZXJfcG9saWN5KCkgY29uc3QKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitTaXplX1BvbGljeSYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfc2l6ZV9wb2xpY3koKQoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2NvbnN0IFNpemVfUG9saWN5JiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9zaXplX3BvbGljeSgpIGNvbnN0Cit7IHJldHVybiAqdGhpczsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9zYW1wbGVfcmVzaXplX3BvbGljeS5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9zYW1wbGVfcmVzaXplX3BvbGljeS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhMzg3NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L3NhbXBsZV9yZXNpemVfcG9saWN5LmhwcApAQCAtMCwwICsxLDEyNSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBzYW1wbGVfcmVzaXplX3BvbGljeS5ocHAKKyAqIENvbnRhaW5zIGEgc2FtcGxlIHJlc2l6ZSBwb2xpY3kgZm9yIGhhc2ggdGFibGVzLgorICovCisKKyNpZm5kZWYgUEJfRFNfU0FNUExFX1JFU0laRV9QT0xJQ1lfSFBQCisjZGVmaW5lIFBCX0RTX1NBTVBMRV9SRVNJWkVfUE9MSUNZX0hQUAorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICAvLy8gQSBzYW1wbGUgcmVzaXplIHBvbGljeS4KKyAgY2xhc3Mgc2FtcGxlX3Jlc2l6ZV9wb2xpY3kKKyAgeworICBwdWJsaWM6CisgICAgLy8vIFNpemUgdHlwZS4KKyAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IHNpemVfdHlwZTsKKworICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIHNhbXBsZV9yZXNpemVfcG9saWN5KCk7CisKKyAgICAvLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgICBzYW1wbGVfcmFuZ2VfaGFzaGluZyhjb25zdCBzYW1wbGVfcmVzaXplX3BvbGljeSYgb3RoZXIpOworCisgICAgLy8vIFN3YXBzIGNvbnRlbnQuCisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHNhbXBsZV9yZXNpemVfcG9saWN5JiBvdGhlcik7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vLyBOb3RpZmllcyBhIHNlYXJjaCBzdGFydGVkLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2luc2VydF9zZWFyY2hfc3RhcnQoKTsKKworICAgIC8vLyBOb3RpZmllcyBhIHNlYXJjaCBlbmNvdW50ZXJlZCBhIGNvbGxpc2lvbi4KKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9pbnNlcnRfc2VhcmNoX2NvbGxpc2lvbigpOworCisgICAgLy8vIE5vdGlmaWVzIGEgc2VhcmNoIGVuZGVkLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2luc2VydF9zZWFyY2hfZW5kKCk7CisKKyAgICAvLy8gTm90aWZpZXMgYSBzZWFyY2ggc3RhcnRlZC4KKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9maW5kX3NlYXJjaF9zdGFydCgpOworCisgICAgLy8vIE5vdGlmaWVzIGEgc2VhcmNoIGVuY291bnRlcmVkIGEgY29sbGlzaW9uLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2ZpbmRfc2VhcmNoX2NvbGxpc2lvbigpOworCisgICAgLy8vIE5vdGlmaWVzIGEgc2VhcmNoIGVuZGVkLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2ZpbmRfc2VhcmNoX2VuZCgpOworCisgICAgLy8vIE5vdGlmaWVzIGEgc2VhcmNoIHN0YXJ0ZWQuCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZXJhc2Vfc2VhcmNoX3N0YXJ0KCk7CisKKyAgICAvLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5jb3VudGVyZWQgYSBjb2xsaXNpb24uCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZXJhc2Vfc2VhcmNoX2NvbGxpc2lvbigpOworCisgICAgLy8vIE5vdGlmaWVzIGEgc2VhcmNoIGVuZGVkLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKworICAgIC8vLyBOb3RpZmllcyBhbiBlbGVtZW50IHdhcyBpbnNlcnRlZC4KKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9pbnNlcnRlZChzaXplX3R5cGUgbnVtX2UpOworCisgICAgLy8vIE5vdGlmaWVzIGFuIGVsZW1lbnQgd2FzIGVyYXNlZC4KKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9lcmFzZWQoc2l6ZV90eXBlIG51bV9lKTsKKworICAgIC8vLyBOb3RpZmllcyB0aGUgdGFibGUgd2FzIGNsZWFyZWQuCisgICAgdm9pZAorICAgIG5vdGlmeV9jbGVhcmVkKCk7CisKKyAgICAvLy8gTm90aWZpZXMgdGhlIHRhYmxlIHdhcyByZXNpemVkIHRvIG5ld19zaXplLgorICAgIHZvaWQKKyAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUgbmV3X3NpemUpOworCisgICAgLy8vIFF1ZXJpZXMgd2hldGhlciBhIHJlc2l6ZSBpcyBuZWVkZWQuCisgICAgaW5saW5lIGJvb2wKKyAgICBpc19yZXNpemVfbmVlZGVkKCkgY29uc3Q7CisKKyAgICAvLy8gUXVlcmllcyB3aGF0IHRoZSBuZXcgc2l6ZSBzaG91bGQgYmUuCisgICAgc2l6ZV90eXBlCisgICAgZ2V0X25ld19zaXplKHNpemVfdHlwZSBzaXplLCBzaXplX3R5cGUgbnVtX3VzZWRfZSkgY29uc3Q7CisgIH07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L3NhbXBsZV9yZXNpemVfdHJpZ2dlci5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9zYW1wbGVfcmVzaXplX3RyaWdnZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZDA5ZjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9zYW1wbGVfcmVzaXplX3RyaWdnZXIuaHBwCkBAIC0wLDAgKzEsMTM2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHNhbXBsZV9yZXNpemVfdHJpZ2dlci5ocHAKKyAqIENvbnRhaW5zIGEgc2FtcGxlIHJlc2l6ZSB0cmlnZ2VyIHBvbGljeSBjbGFzcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX1NBTVBMRV9SRVNJWkVfVFJJR0dFUl9IUFAKKyNkZWZpbmUgUEJfRFNfU0FNUExFX1JFU0laRV9UUklHR0VSX0hQUAorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICAvLy8gQSBzYW1wbGUgcmVzaXplIHRyaWdnZXIgcG9saWN5LgorICBjbGFzcyBzYW1wbGVfcmVzaXplX3RyaWdnZXIKKyAgeworICBwdWJsaWM6CisgICAgLy8vIFNpemUgdHlwZS4KKyAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IHNpemVfdHlwZTsKKworICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIHNhbXBsZV9yZXNpemVfdHJpZ2dlcigpOworCisgICAgLy8vIENvcHkgY29uc3RydWN0b3IuCisgICAgc2FtcGxlX3JhbmdlX2hhc2hpbmcoY29uc3Qgc2FtcGxlX3Jlc2l6ZV90cmlnZ2VyJik7CisKKyAgICAvLy8gU3dhcHMgY29udGVudC4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoc2FtcGxlX3Jlc2l6ZV90cmlnZ2VyJik7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vLyBOb3RpZmllcyBhIHNlYXJjaCBzdGFydGVkLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2luc2VydF9zZWFyY2hfc3RhcnQoKTsKKworICAgIC8vLyBOb3RpZmllcyBhIHNlYXJjaCBlbmNvdW50ZXJlZCBhIGNvbGxpc2lvbi4KKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9pbnNlcnRfc2VhcmNoX2NvbGxpc2lvbigpOworCisgICAgLy8vIE5vdGlmaWVzIGEgc2VhcmNoIGVuZGVkLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2luc2VydF9zZWFyY2hfZW5kKCk7CisKKyAgICAvLy8gTm90aWZpZXMgYSBzZWFyY2ggc3RhcnRlZC4KKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9maW5kX3NlYXJjaF9zdGFydCgpOworCisgICAgLy8vIE5vdGlmaWVzIGEgc2VhcmNoIGVuY291bnRlcmVkIGEgY29sbGlzaW9uLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2ZpbmRfc2VhcmNoX2NvbGxpc2lvbigpOworCisgICAgLy8vIE5vdGlmaWVzIGEgc2VhcmNoIGVuZGVkLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2ZpbmRfc2VhcmNoX2VuZCgpOworCisgICAgLy8vIE5vdGlmaWVzIGEgc2VhcmNoIHN0YXJ0ZWQuCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZXJhc2Vfc2VhcmNoX3N0YXJ0KCk7CisKKyAgICAvLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5jb3VudGVyZWQgYSBjb2xsaXNpb24uCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZXJhc2Vfc2VhcmNoX2NvbGxpc2lvbigpOworCisgICAgLy8vIE5vdGlmaWVzIGEgc2VhcmNoIGVuZGVkLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKworICAgIC8vLyBOb3RpZmllcyBhbiBlbGVtZW50IHdhcyBpbnNlcnRlZC4gdGhlIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluCisgICAgLy8vIHRoZSB0YWJsZSBpcyBudW1fZW50cmllcy4KKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9pbnNlcnRlZChzaXplX3R5cGUgbnVtX2VudHJpZXMpOworCisgICAgLy8vIE5vdGlmaWVzIGFuIGVsZW1lbnQgd2FzIGVyYXNlZC4KKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9lcmFzZWQoc2l6ZV90eXBlIG51bV9lbnRyaWVzKTsKKworICAgIC8vLyBOb3RpZmllcyB0aGUgdGFibGUgd2FzIGNsZWFyZWQuCisgICAgdm9pZAorICAgIG5vdGlmeV9jbGVhcmVkKCk7CisKKyAgICAvLy8gTm90aWZpZXMgdGhlIHRhYmxlIHdhcyByZXNpemVkIGFzIGEgcmVzdWx0IG9mIHRoaXMgb2JqZWN0J3MKKyAgICAvLy8gc2lnbmlmeWluZyB0aGF0IGEgcmVzaXplIGlzIG5lZWRlZC4KKyAgICB2b2lkCisgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIG5ld19zaXplKTsKKworICAgIC8vLyBOb3RpZmllcyB0aGUgdGFibGUgd2FzIHJlc2l6ZWQgZXh0ZXJuYWxseS4KKyAgICB2b2lkCisgICAgbm90aWZ5X2V4dGVybmFsbHlfcmVzaXplZChzaXplX3R5cGUgbmV3X3NpemUpOworCisgICAgLy8vIFF1ZXJpZXMgd2hldGhlciBhIHJlc2l6ZSBpcyBuZWVkZWQuCisgICAgaW5saW5lIGJvb2wKKyAgICBpc19yZXNpemVfbmVlZGVkKCkgY29uc3Q7CisKKyAgICAvLy8gUXVlcmllcyB3aGV0aGVyIGEgZ3JvdyBpcyBuZWVkZWQuCisgICAgaW5saW5lIGJvb2wKKyAgICBpc19ncm93X25lZWRlZChzaXplX3R5cGUgc2l6ZSwgc2l6ZV90eXBlIG51bV9lbnRyaWVzKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIC8vLyBSZXNpemVzIHRvIG5ld19zaXplLgorICAgIHZpcnR1YWwgdm9pZAorICAgIGRvX3Jlc2l6ZShzaXplX3R5cGUpOworICB9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9zYW1wbGVfc2l6ZV9wb2xpY3kuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvc2FtcGxlX3NpemVfcG9saWN5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDc4ZmIzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvc2FtcGxlX3NpemVfcG9saWN5LmhwcApAQCAtMCwwICsxLDczIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHNhbXBsZV9zaXplX3BvbGljeS5ocHAKKyAqIENvbnRhaW5zIGEgc2FtcGxlIHNpemUgcmVzaXplLXBvbGljeS4KKyAqLworCisjaWZuZGVmIFBCX0RTX1NBTVBMRV9TSVpFX1BPTElDWV9IUFAKKyNkZWZpbmUgUEJfRFNfU0FNUExFX1NJWkVfUE9MSUNZX0hQUAorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICAvLy8gQSBzYW1wbGUgc2l6ZSBwb2xpY3kuCisgIGNsYXNzIHNhbXBsZV9zaXplX3BvbGljeQorICB7CisgIHB1YmxpYzoKKyAgICAvLy8gU2l6ZSB0eXBlLgorICAgIHR5cGVkZWYgc3RkOjpzaXplX3Qgc2l6ZV90eXBlOworCisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgc2FtcGxlX3NpemVfcG9saWN5KCk7CisKKyAgICAvLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgICBzYW1wbGVfcmFuZ2VfaGFzaGluZyhjb25zdCBzYW1wbGVfc2l6ZV9wb2xpY3kmKTsKKworICAgIC8vLyBTd2FwcyBjb250ZW50LgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChzYW1wbGVfc2l6ZV9wb2xpY3kmIG90aGVyKTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8vIEdpdmVuIGEgX19zaXplIHNpemUsIHJldHVybnMgYSBfX3NpemUgdGhhdCBpcyBsYXJnZXIuCisgICAgaW5saW5lIHNpemVfdHlwZQorICAgIGdldF9uZWFyZXN0X2xhcmdlcl9zaXplKHNpemVfdHlwZSBzaXplKSBjb25zdDsKKworICAgIC8vLyBHaXZlbiBhIF9fc2l6ZSBzaXplLCByZXR1cm5zIGEgX19zaXplIHRoYXQgaXMgc21hbGxlci4KKyAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgZ2V0X25lYXJlc3Rfc21hbGxlcl9zaXplKHNpemVfdHlwZSBzaXplKSBjb25zdDsKKyAgfTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MmQ0OWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMDIgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc3BsYXlfdHJlZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBzcGxheV90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgSXQ+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citjb3B5X2Zyb21fcmFuZ2UoSXQgZmlyc3RfaXQsIEl0IGxhc3RfaXQpCit7CisgIHdoaWxlIChmaXJzdF9pdCAhPSBsYXN0X2l0KQorICAgIGluc2VydCgqKGZpcnN0X2l0KyspKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX1NfVFJFRV9OQU1FKCkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX1NfVFJFRV9OQU1FKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4pIDoKKyAgYmFzZV90eXBlKHJfY21wX2ZuKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfU19UUkVFX05BTUUoY29uc3QgQ21wX0ZuJiByX2NtcF9mbiwgY29uc3Qgbm9kZV91cGRhdGUmIHJfbm9kZV91cGRhdGUpIDoKKyAgYmFzZV90eXBlKHJfY21wX2ZuLCByX25vZGVfdXBkYXRlKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfU19UUkVFX05BTUUoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSA6CisgIGJhc2VfdHlwZShvdGhlcikKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorICBiYXNlX3R5cGU6OnN3YXAob3RoZXIpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5pdGlhbGl6ZSgpCit7IGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fc3BlY2lhbCA9IHRydWU7IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9kZWJ1Z19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9kZWJ1Z19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODA3N2YzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2RlYnVnX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNzUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc3BsYXlfdHJlZV8vZGVidWdfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBzcGxheV90cmVlXy4KKyAqLworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF92YWxpZChjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGJhc2VfdHlwZTo6YXNzZXJ0X3ZhbGlkKF9fZmlsZSwgX19saW5lKTsKKyAgY29uc3Qgbm9kZV9wb2ludGVyIHBfaGVhZCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQ7CisgIGFzc2VydF9zcGVjaWFsX2ltcChwX2hlYWQsIF9fZmlsZSwgX19saW5lKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF9zcGVjaWFsX2ltcChjb25zdCBub2RlX3BvaW50ZXIgcF9uZCwKKwkJICAgY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBpZiAocF9uZCA9PSAwKQorICAgIHJldHVybjsKKworICBpZiAocF9uZCA9PSBiYXNlX3R5cGU6Om1fcF9oZWFkKQorICAgIHsKKyAgICAgIFBCX0RTX0RFQlVHX1ZFUklGWShwX25kLT5tX3NwZWNpYWwpOworICAgICAgYXNzZXJ0X3NwZWNpYWxfaW1wKHBfbmQtPm1fcF9wYXJlbnQsIF9fZmlsZSwgX19saW5lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgUEJfRFNfREVCVUdfVkVSSUZZKCFwX25kLT5tX3NwZWNpYWwpOworICBhc3NlcnRfc3BlY2lhbF9pbXAocF9uZC0+bV9wX2xlZnQsIF9fZmlsZSwgX19saW5lKTsKKyAgYXNzZXJ0X3NwZWNpYWxfaW1wKHBfbmQtPm1fcF9yaWdodCwgX19maWxlLCBfX2xpbmUpOworfQorCisjZW5kaWYgCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9lcmFzZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9lcmFzZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzAxYTYyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2VyYXNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTU3IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHNwbGF5X3RyZWVfL2VyYXNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igc3BsYXlfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQoreworICBwb2ludF9pdGVyYXRvciBpdCA9IGZpbmQocl9rZXkpOworICBpZiAoaXQgPT0gYmFzZV90eXBlOjplbmQoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGVyYXNlKGl0KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShpdGVyYXRvciBpdCkKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIGlmIChpdCA9PSBiYXNlX3R5cGU6OmVuZCgpKQorICAgIHJldHVybiBpdDsKKyAgaXRlcmF0b3IgcmV0X2l0ID0gaXQ7CisgICsrcmV0X2l0OworICBlcmFzZV9ub2RlKGl0Lm1fcF9uZCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gcmV0X2l0OworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpyZXZlcnNlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShyZXZlcnNlX2l0ZXJhdG9yIGl0KQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgaWYgKGl0Lm1fcF9uZCA9PSBiYXNlX3R5cGU6Om1fcF9oZWFkKQorICAgIHJldHVybiAoaXQpOworICByZXZlcnNlX2l0ZXJhdG9yIHJldF9pdCA9IGl0OworICArK3JldF9pdDsKKyAgZXJhc2Vfbm9kZShpdC5tX3BfbmQpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmV0dXJuIHJldF9pdDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfaWYoUHJlZCBwcmVkKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgc2l6ZV90eXBlIG51bV9lcnNkID0gMDsKKyAgaXRlcmF0b3IgaXQgPSBiYXNlX3R5cGU6OmJlZ2luKCk7CisgIHdoaWxlIChpdCAhPSBiYXNlX3R5cGU6OmVuZCgpKQorICAgIHsKKyAgICAgIGlmIChwcmVkKCppdCkpCisgICAgICAgIHsKKwkgICsrbnVtX2Vyc2Q7CisJICBpdCA9IGVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgICAgZWxzZQorCSsraXQ7CisgICAgfQorICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgcmV0dXJuIG51bV9lcnNkOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2Vfbm9kZShub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQgIT0gMCk7CisgIHNwbGF5KHBfbmQpOworCisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZCA9PSB0aGlzLT5tX3BfaGVhZC0+bV9wX3BhcmVudCk7CisKKyAgbm9kZV9wb2ludGVyIHBfbCA9IHBfbmQtPm1fcF9sZWZ0OworICBub2RlX3BvaW50ZXIgcF9yID0gcF9uZC0+bV9wX3JpZ2h0OworCisgIGJhc2VfdHlwZTo6dXBkYXRlX21pbl9tYXhfZm9yX2VyYXNlZF9ub2RlKHBfbmQpOworICBiYXNlX3R5cGU6OmFjdHVhbF9lcmFzZV9ub2RlKHBfbmQpOworICBpZiAocF9yID09IDApCisgICAgeworICAgICAgYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCA9IHBfbDsKKyAgICAgIGlmIChwX2wgIT0gMCkKKwlwX2wtPm1fcF9wYXJlbnQgPSBiYXNlX3R5cGU6Om1fcF9oZWFkOworICAgICAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgICAgICByZXR1cm47CisgICAgfQorCisgIG5vZGVfcG9pbnRlciBwX3RhcmdldF9yID0gbGVmdG1vc3QocF9yKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfdGFyZ2V0X3IgIT0gMCk7CisgIHBfci0+bV9wX3BhcmVudCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQ7CisgIGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX3I7CisgIHNwbGF5KHBfdGFyZ2V0X3IpOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkocF90YXJnZXRfci0+bV9wX2xlZnQgPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfdGFyZ2V0X3ItPm1fcF9wYXJlbnQgPT0gdGhpcy0+bV9wX2hlYWQpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQodGhpcy0+bV9wX2hlYWQtPm1fcF9wYXJlbnQgPT0gcF90YXJnZXRfcik7CisKKyAgcF90YXJnZXRfci0+bV9wX2xlZnQgPSBwX2w7CisgIGlmIChwX2wgIT0gMCkKKyAgICBwX2wtPm1fcF9wYXJlbnQgPSBwX3RhcmdldF9yOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgdGhpcy0+YXBwbHlfdXBkYXRlKHBfdGFyZ2V0X3IsIChub2RlX3VwZGF0ZSopdGhpcyk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbGVmdG1vc3Qobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kICE9IDApOworICB3aGlsZSAocF9uZC0+bV9wX2xlZnQgIT0gMCkKKyAgICBwX25kID0gcF9uZC0+bV9wX2xlZnQ7CisgIHJldHVybiBwX25kOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2ZpbmRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vZmluZF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjQ0NTQyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2ZpbmRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMDAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc3BsYXlfdHJlZV8vZmluZF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHNwbGF5X3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCit7CisgIG5vZGVfcG9pbnRlciBwX2ZvdW5kID0gZmluZF9pbXAocl9rZXkpOworICBpZiAocF9mb3VuZCAhPSBiYXNlX3R5cGU6Om1fcF9oZWFkKQorICAgIHNwbGF5KHBfZm91bmQpOworICByZXR1cm4gcG9pbnRfaXRlcmF0b3IocF9mb3VuZCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2NvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0Cit7CisgIGNvbnN0IG5vZGVfcG9pbnRlciBwX2ZvdW5kID0gZmluZF9pbXAocl9rZXkpOworICBpZiAocF9mb3VuZCAhPSBiYXNlX3R5cGU6Om1fcF9oZWFkKQorICAgIGNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMqID4odGhpcyktPnNwbGF5KHBfZm91bmQpOworICByZXR1cm4gcG9pbnRfaXRlcmF0b3IocF9mb3VuZCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZF9pbXAoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShiYXNlX3R5cGU6OnN0cnVjdHVyZV9vbmx5X2Fzc2VydF92YWxpZChfX0ZJTEVfXywKKwkJCQkJCQkgICAgIF9fTElORV9fKTspCisgIG5vZGVfcG9pbnRlciBwX25kID0gYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudDsKKyAgd2hpbGUgKHBfbmQgIT0gMCkKKyAgICBpZiAoIUNtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9uZC0+bV92YWx1ZSksIHJfa2V5KSkKKyAgICAgIHsKKwlpZiAoIUNtcF9Gbjo6b3BlcmF0b3IoKShyX2tleSwgUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpKSkKKwkgIHJldHVybiBwX25kOworCXBfbmQgPSBwX25kLT5tX3BfbGVmdDsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBwX25kID0gcF9uZC0+bV9wX3JpZ2h0OworICByZXR1cm4gYmFzZV90eXBlOjptX3BfaGVhZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBjb25zdCB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX2ltcChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KSBjb25zdAoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50OworICB3aGlsZSAocF9uZCAhPSAwKQorICAgIGlmICghQ21wX0ZuOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX25kLT5tX3ZhbHVlKSwgcl9rZXkpKQorICAgICAgeworCWlmICghQ21wX0ZuOjpvcGVyYXRvcigpKHJfa2V5LCBQQl9EU19WMkYocF9uZC0+bV92YWx1ZSkpKQorCSAgcmV0dXJuIHBfbmQ7CisJcF9uZCA9IHBfbmQtPm1fcF9sZWZ0OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHBfbmQgPSBwX25kLT5tX3BfcmlnaHQ7CisgIHJldHVybiBiYXNlX3R5cGU6Om1fcF9oZWFkOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2luZm9fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vaW5mb19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzAyZWVlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2luZm9fZm5faW1wcy5ocHAKQEAgLTAsMCArMSwzOSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBzcGxheV90cmVlXy9pbmZvX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbi4KKyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2luc2VydF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9pbnNlcnRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyMzA2YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9pbnNlcnRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw5NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBzcGxheV90cmVlXy9pbnNlcnRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBzcGxheV90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHN0ZDo6cGFpcjx0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IsIGJvb2w+CitQQl9EU19DTEFTU19DX0RFQzo6CitpbnNlcnQoY29uc3RfcmVmZXJlbmNlIHJfdmFsdWUpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBzdGQ6OnBhaXI8cG9pbnRfaXRlcmF0b3IsIGJvb2w+IGluc19wYWlyID0gaW5zZXJ0X2xlYWZfaW1wKHJfdmFsdWUpOworICBpbnNfcGFpci5maXJzdC5tX3BfbmQtPm1fc3BlY2lhbCA9IGZhbHNlOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgc3BsYXkoaW5zX3BhaXIuZmlyc3QubV9wX25kKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiBpbnNfcGFpcjsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBzdGQ6OnBhaXI8dHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yLCBib29sPgorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5zZXJ0X2xlYWZfaW1wKGNvbnN0X3JlZmVyZW5jZSByX3ZhbHVlKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6c3RydWN0dXJlX29ubHlfYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLAorCQkJCQkJCSAgICAgX19MSU5FX18pOykKKyAgaWYgKGJhc2VfdHlwZTo6bV9zaXplID09IDApCisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGJhc2VfdHlwZTo6aW5zZXJ0X2ltcF9lbXB0eShyX3ZhbHVlKSwgdHJ1ZSk7CisKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50OworICBub2RlX3BvaW50ZXIgcF9wb3QgPSBiYXNlX3R5cGU6Om1fcF9oZWFkOworCisgIHdoaWxlIChwX25kICE9IDApCisgICAgaWYgKCFDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpLCBQQl9EU19WMkYocl92YWx1ZSkpKQorICAgICAgeworCWlmICghQ21wX0ZuOjpvcGVyYXRvcigpKFBCX0RTX1YyRihyX3ZhbHVlKSwgUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpKSkKKwkgIHsKKwkgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHBvaW50X2l0ZXJhdG9yKHBfbmQpLCBmYWxzZSk7CisJICB9CisJcF9wb3QgPSBwX25kOworCXBfbmQgPSBwX25kLT5tX3BfbGVmdDsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBwX25kID0gcF9uZC0+bV9wX3JpZ2h0OworCisgIGlmIChwX3BvdCA9PSBiYXNlX3R5cGU6Om1fcF9oZWFkKQorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihiYXNlX3R5cGU6Omluc2VydF9sZWFmX25ldyhyX3ZhbHVlLCBiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcmlnaHQsIGZhbHNlKSwgdHJ1ZSk7CisKKyAgUEJfRFNfQ0hFQ0tfS0VZX0RPRVNfTk9UX0VYSVNUKFBCX0RTX1YyRihyX3ZhbHVlKSkKKworICBwX25kID0gcF9wb3QtPm1fcF9sZWZ0OworICBpZiAocF9uZCA9PSAwKQorICAgIHJldHVybiAoc3RkOjptYWtlX3BhaXIoYmFzZV90eXBlOjppbnNlcnRfbGVhZl9uZXcocl92YWx1ZSwgcF9wb3QsIHRydWUpLCB0cnVlKSk7CisKKyAgd2hpbGUgKHBfbmQtPm1fcF9yaWdodCAhPSAwKQorICAgIHBfbmQgPSBwX25kLT5tX3BfcmlnaHQ7CisKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHRoaXMtPmluc2VydF9sZWFmX25ldyhyX3ZhbHVlLCBwX25kLCBmYWxzZSksIHRydWUpOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL25vZGUuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL25vZGUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYmUzMDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vbm9kZS5ocHAKQEAgLTAsMCArMSwxMjYgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc3BsYXlfdHJlZV8vbm9kZS5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIHN0cnVjdCBmb3Igc3BsYXlfdHJlZV8ncyBub2RlLgorICovCisKKyNpZm5kZWYgUEJfRFNfU1BMQVlfVFJFRV9OT0RFX0hQUAorI2RlZmluZSBQQl9EU19TUExBWV9UUkVFX05PREVfSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8vLyBOb2RlIGZvciBzcGxheSB0cmVlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIGNsYXNzIE1ldGFkYXRhLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHNwbGF5X3RyZWVfbm9kZV8KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBWYWx1ZV9UeXBlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIE1ldGFkYXRhIG1ldGFkYXRhX3R5cGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorICAgICAgc3BsYXlfdHJlZV9ub2RlXzxWYWx1ZV9UeXBlLCBNZXRhZGF0YSwgX0FsbG9jPiA+OjpvdGhlcjo6cG9pbnRlcgorICAgICAgbm9kZV9wb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxtZXRhZGF0YV90eXBlPjo6b3RoZXI6OnJlZmVyZW5jZQorICAgICAgbWV0YWRhdGFfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxtZXRhZGF0YV90eXBlPjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZQorICAgICAgbWV0YWRhdGFfY29uc3RfcmVmZXJlbmNlOworCisjaWZkZWYgUEJfRFNfQklOX1NFQVJDSF9UUkVFX1RSQUNFXworICAgICAgdm9pZAorICAgICAgdHJhY2UoKSBjb25zdAorICAgICAgeyBzdGQ6OmNvdXQgPDwgUEJfRFNfVjJGKG1fdmFsdWUpIDw8ICIoIiA8PCBtX21ldGFkYXRhIDw8ICIpIjsgfQorI2VuZGlmCisKKyAgICAgIGlubGluZSBib29sCisgICAgICBzcGVjaWFsKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fc3BlY2lhbDsgfQorCisgICAgICBpbmxpbmUgbWV0YWRhdGFfY29uc3RfcmVmZXJlbmNlCisgICAgICBnZXRfbWV0YWRhdGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9tZXRhZGF0YTsgfQorCisgICAgICBpbmxpbmUgbWV0YWRhdGFfcmVmZXJlbmNlCisgICAgICBnZXRfbWV0YWRhdGEoKQorICAgICAgeyByZXR1cm4gbV9tZXRhZGF0YTsgfQorCisgICAgICB2YWx1ZV90eXBlIG1fdmFsdWU7CisgICAgICBib29sIG1fc3BlY2lhbDsKKyAgICAgIG5vZGVfcG9pbnRlciBtX3BfbGVmdDsKKyAgICAgIG5vZGVfcG9pbnRlciBtX3BfcmlnaHQ7CisgICAgICBub2RlX3BvaW50ZXIgbV9wX3BhcmVudDsKKyAgICAgIG1ldGFkYXRhX3R5cGUgbV9tZXRhZGF0YTsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBzcGxheV90cmVlX25vZGVfPFZhbHVlX1R5cGUsIG51bGxfdHlwZSwgX0FsbG9jPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIFZhbHVlX1R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgbnVsbF90eXBlIG1ldGFkYXRhX3R5cGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPAorICAgICAgc3BsYXlfdHJlZV9ub2RlXzxWYWx1ZV9UeXBlLCBudWxsX3R5cGUsIF9BbGxvYz4gPjo6b3RoZXI6OnBvaW50ZXIKKyAgICAgIG5vZGVfcG9pbnRlcjsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIHNwZWNpYWwoKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9zcGVjaWFsOyB9CisKKyNpZmRlZiBQQl9EU19CSU5fU0VBUkNIX1RSRUVfVFJBQ0VfCisgICAgICB2b2lkCisgICAgICB0cmFjZSgpIGNvbnN0CisgICAgICB7IHN0ZDo6Y291dCA8PCBQQl9EU19WMkYobV92YWx1ZSk7IH0KKyNlbmRpZiAKKworICAgICAgbm9kZV9wb2ludGVyIG1fcF9sZWZ0OworICAgICAgbm9kZV9wb2ludGVyIG1fcF9yaWdodDsKKyAgICAgIG5vZGVfcG9pbnRlciBtX3BfcGFyZW50OworICAgICAgdmFsdWVfdHlwZSBtX3ZhbHVlOworICAgICAgYm9vbCBtX3NwZWNpYWw7CisgICAgfTsKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9zcGxheV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9zcGxheV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDNkM2MyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL3NwbGF5X2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMjgxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHNwbGF5X3RyZWVfL3NwbGF5X2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igc3BsYXlfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGF5KG5vZGVfcG9pbnRlciBwX25kKQoreworICB3aGlsZSAocF9uZC0+bV9wX3BhcmVudCAhPSBiYXNlX3R5cGU6Om1fcF9oZWFkKQorICAgIHsKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgeworCW5vZGVfcG9pbnRlciBwX2hlYWQgPSBiYXNlX3R5cGU6Om1fcF9oZWFkOworCWFzc2VydF9zcGVjaWFsX2ltcChwX2hlYWQsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgUEJfRFNfQVNTRVJUX0JBU0VfTk9ERV9DT05TSVNURU5UKHBfbmQpCisKKyAgICAgIGlmIChwX25kLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50ID09IGJhc2VfdHlwZTo6bV9wX2hlYWQpCisJeworCSAgYmFzZV90eXBlOjpyb3RhdGVfcGFyZW50KHBfbmQpOworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQgPT0gdGhpcy0+bV9wX2hlYWQtPm1fcF9wYXJlbnQpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjb25zdCBub2RlX3BvaW50ZXIgcF9wYXJlbnQgPSBwX25kLT5tX3BfcGFyZW50OworCSAgY29uc3Qgbm9kZV9wb2ludGVyIHBfZ3JhbmRwYXJlbnQgPSBwX3BhcmVudC0+bV9wX3BhcmVudDsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisJICBjb25zdCBzaXplX3R5cGUgdG90YWwgPQorCSAgICBiYXNlX3R5cGU6OnJlY3Vyc2l2ZV9jb3VudChwX2dyYW5kcGFyZW50KTsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCh0b3RhbCA+PSAzKTsKKyNlbmRpZgorCisJICBpZiAocF9wYXJlbnQtPm1fcF9sZWZ0ID09IHBfbmQgJiYKKwkgICAgICBwX2dyYW5kcGFyZW50LT5tX3BfcmlnaHQgPT0gcF9wYXJlbnQpCisJICAgIHNwbGF5X3ppZ196YWdfbGVmdChwX25kLCBwX3BhcmVudCwgcF9ncmFuZHBhcmVudCk7CisJICBlbHNlIGlmIChwX3BhcmVudC0+bV9wX3JpZ2h0ID09IHBfbmQgJiYKKwkJICAgcF9ncmFuZHBhcmVudC0+bV9wX2xlZnQgPT0gcF9wYXJlbnQpCisJICAgIHNwbGF5X3ppZ196YWdfcmlnaHQocF9uZCwgcF9wYXJlbnQsIHBfZ3JhbmRwYXJlbnQpOworCSAgZWxzZSBpZiAocF9wYXJlbnQtPm1fcF9sZWZ0ID09IHBfbmQgJiYKKwkJICAgcF9ncmFuZHBhcmVudC0+bV9wX2xlZnQgPT0gcF9wYXJlbnQpCisJICAgIHNwbGF5X3ppZ196aWdfbGVmdChwX25kLCBwX3BhcmVudCwgcF9ncmFuZHBhcmVudCk7CisJICBlbHNlCisJICAgIHNwbGF5X3ppZ196aWdfcmlnaHQocF9uZCwgcF9wYXJlbnQsIHBfZ3JhbmRwYXJlbnQpOworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHRvdGFsID09dGhpcy0+cmVjdXJzaXZlX2NvdW50KHBfbmQpKTsKKwl9CisKKyAgICAgIFBCX0RTX0FTU0VSVF9CQVNFX05PREVfQ09OU0lTVEVOVChwX25kKQorICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxheV96aWdfemFnX2xlZnQobm9kZV9wb2ludGVyIHBfbmQsIG5vZGVfcG9pbnRlciBwX3BhcmVudCwKKwkJICAgbm9kZV9wb2ludGVyIHBfZ3JhbmRwYXJlbnQpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BhcmVudCA9PSBwX25kLT5tX3BfcGFyZW50KTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfZ3JhbmRwYXJlbnQgPT0gcF9wYXJlbnQtPm1fcF9wYXJlbnQpOworCisgIFBCX0RTX0FTU0VSVF9CQVNFX05PREVfQ09OU0lTVEVOVChwX2dyYW5kcGFyZW50KQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BhcmVudC0+bV9wX2xlZnQgPT0gcF9uZCAmJgorCQkJcF9ncmFuZHBhcmVudC0+bV9wX3JpZ2h0ID09IHBfcGFyZW50KTsKKworICBzcGxheV96el9zdGFydChwX25kLCBwX3BhcmVudCwgcF9ncmFuZHBhcmVudCk7CisKKyAgbm9kZV9wb2ludGVyIHBfYiA9IHBfbmQtPm1fcF9yaWdodDsKKyAgbm9kZV9wb2ludGVyIHBfYyA9IHBfbmQtPm1fcF9sZWZ0OworCisgIHBfbmQtPm1fcF9yaWdodCA9IHBfcGFyZW50OworICBwX3BhcmVudC0+bV9wX3BhcmVudCA9IHBfbmQ7CisKKyAgcF9uZC0+bV9wX2xlZnQgPSBwX2dyYW5kcGFyZW50OworICBwX2dyYW5kcGFyZW50LT5tX3BfcGFyZW50ID0gcF9uZDsKKworICBwX3BhcmVudC0+bV9wX2xlZnQgPSBwX2I7CisgIGlmIChwX2IgIT0gMCkKKyAgICBwX2ItPm1fcF9wYXJlbnQgPSBwX3BhcmVudDsKKworICBwX2dyYW5kcGFyZW50LT5tX3BfcmlnaHQgPSBwX2M7CisgIGlmIChwX2MgIT0gMCkKKyAgICBwX2MtPm1fcF9wYXJlbnQgPSBwX2dyYW5kcGFyZW50OworCisgIHNwbGF5X3p6X2VuZChwX25kLCBwX3BhcmVudCwgcF9ncmFuZHBhcmVudCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3BsYXlfemlnX3phZ19yaWdodChub2RlX3BvaW50ZXIgcF9uZCwgbm9kZV9wb2ludGVyIHBfcGFyZW50LAorCQkgICAgbm9kZV9wb2ludGVyIHBfZ3JhbmRwYXJlbnQpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BhcmVudCA9PSBwX25kLT5tX3BfcGFyZW50KTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfZ3JhbmRwYXJlbnQgPT0gcF9wYXJlbnQtPm1fcF9wYXJlbnQpOworCisgIFBCX0RTX0FTU0VSVF9CQVNFX05PREVfQ09OU0lTVEVOVChwX2dyYW5kcGFyZW50KQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BhcmVudC0+bV9wX3JpZ2h0ID09IHBfbmQgJiYKKwkgIAkJcF9ncmFuZHBhcmVudC0+bV9wX2xlZnQgPT0gcF9wYXJlbnQpOworCisgIHNwbGF5X3p6X3N0YXJ0KHBfbmQsIHBfcGFyZW50LCBwX2dyYW5kcGFyZW50KTsKKworICBub2RlX3BvaW50ZXIgcF9iID0gcF9uZC0+bV9wX2xlZnQ7CisgIG5vZGVfcG9pbnRlciBwX2MgPSBwX25kLT5tX3BfcmlnaHQ7CisKKyAgcF9uZC0+bV9wX2xlZnQgPSBwX3BhcmVudDsKKyAgcF9wYXJlbnQtPm1fcF9wYXJlbnQgPSBwX25kOworCisgIHBfbmQtPm1fcF9yaWdodCA9IHBfZ3JhbmRwYXJlbnQ7CisgIHBfZ3JhbmRwYXJlbnQtPm1fcF9wYXJlbnQgPSBwX25kOworCisgIHBfcGFyZW50LT5tX3BfcmlnaHQgPSBwX2I7CisgIGlmIChwX2IgIT0gMCkKKyAgICBwX2ItPm1fcF9wYXJlbnQgPSBwX3BhcmVudDsKKworICBwX2dyYW5kcGFyZW50LT5tX3BfbGVmdCA9IHBfYzsKKyAgaWYgKHBfYyAhPSAwKQorICAgIHBfYy0+bV9wX3BhcmVudCA9IHBfZ3JhbmRwYXJlbnQ7CisKKyAgc3BsYXlfenpfZW5kKHBfbmQsIHBfcGFyZW50LCBwX2dyYW5kcGFyZW50KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxheV96aWdfemlnX2xlZnQobm9kZV9wb2ludGVyIHBfbmQsIG5vZGVfcG9pbnRlciBwX3BhcmVudCwKKwkJICAgbm9kZV9wb2ludGVyIHBfZ3JhbmRwYXJlbnQpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BhcmVudCA9PSBwX25kLT5tX3BfcGFyZW50KTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfZ3JhbmRwYXJlbnQgPT0gcF9wYXJlbnQtPm1fcF9wYXJlbnQpOworCisgIFBCX0RTX0FTU0VSVF9CQVNFX05PREVfQ09OU0lTVEVOVChwX2dyYW5kcGFyZW50KQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BhcmVudC0+bV9wX2xlZnQgPT0gcF9uZCAmJgorCQkgICAgIHBfbmQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQtPm1fcF9sZWZ0ID09IHBfbmQtPm1fcF9wYXJlbnQpOworCisgIHNwbGF5X3p6X3N0YXJ0KHBfbmQsIHBfcGFyZW50LCBwX2dyYW5kcGFyZW50KTsKKworICBub2RlX3BvaW50ZXIgcF9iID0gcF9uZC0+bV9wX3JpZ2h0OworICBub2RlX3BvaW50ZXIgcF9jID0gcF9wYXJlbnQtPm1fcF9yaWdodDsKKworICBwX25kLT5tX3BfcmlnaHQgPSBwX3BhcmVudDsKKyAgcF9wYXJlbnQtPm1fcF9wYXJlbnQgPSBwX25kOworCisgIHBfcGFyZW50LT5tX3BfcmlnaHQgPSBwX2dyYW5kcGFyZW50OworICBwX2dyYW5kcGFyZW50LT5tX3BfcGFyZW50ID0gcF9wYXJlbnQ7CisKKyAgcF9wYXJlbnQtPm1fcF9sZWZ0ID0gcF9iOworICBpZiAocF9iICE9IDApCisgICAgcF9iLT5tX3BfcGFyZW50ID0gcF9wYXJlbnQ7CisKKyAgcF9ncmFuZHBhcmVudC0+bV9wX2xlZnQgPSBwX2M7CisgIGlmIChwX2MgIT0gMCkKKyAgICBwX2MtPm1fcF9wYXJlbnQgPSBwX2dyYW5kcGFyZW50OworCisgIHNwbGF5X3p6X2VuZChwX25kLCBwX3BhcmVudCwgcF9ncmFuZHBhcmVudCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3BsYXlfemlnX3ppZ19yaWdodChub2RlX3BvaW50ZXIgcF9uZCwgbm9kZV9wb2ludGVyIHBfcGFyZW50LAorCQkgICAgbm9kZV9wb2ludGVyIHBfZ3JhbmRwYXJlbnQpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BhcmVudCA9PSBwX25kLT5tX3BfcGFyZW50KTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfZ3JhbmRwYXJlbnQgPT0gcF9wYXJlbnQtPm1fcF9wYXJlbnQpOworICBQQl9EU19BU1NFUlRfQkFTRV9OT0RFX0NPTlNJU1RFTlQocF9ncmFuZHBhcmVudCkKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfcGFyZW50LT5tX3BfcmlnaHQgPT0gcF9uZCAmJgorCQkgIHBfbmQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQtPm1fcF9yaWdodCA9PSBwX25kLT5tX3BfcGFyZW50KTsKKworICBzcGxheV96el9zdGFydChwX25kLCBwX3BhcmVudCwgcF9ncmFuZHBhcmVudCk7CisKKyAgbm9kZV9wb2ludGVyIHBfYiA9IHBfbmQtPm1fcF9sZWZ0OworICBub2RlX3BvaW50ZXIgcF9jID0gcF9wYXJlbnQtPm1fcF9sZWZ0OworCisgIHBfbmQtPm1fcF9sZWZ0ID0gcF9wYXJlbnQ7CisgIHBfcGFyZW50LT5tX3BfcGFyZW50ID0gcF9uZDsKKworICBwX3BhcmVudC0+bV9wX2xlZnQgPSBwX2dyYW5kcGFyZW50OworICBwX2dyYW5kcGFyZW50LT5tX3BfcGFyZW50ID0gcF9wYXJlbnQ7CisKKyAgcF9wYXJlbnQtPm1fcF9yaWdodCA9IHBfYjsKKyAgaWYgKHBfYiAhPSAwKQorICAgIHBfYi0+bV9wX3BhcmVudCA9IHBfcGFyZW50OworCisgIHBfZ3JhbmRwYXJlbnQtPm1fcF9yaWdodCA9IHBfYzsKKyAgaWYgKHBfYyAhPSAwKQorICAgIHBfYy0+bV9wX3BhcmVudCA9IHBfZ3JhbmRwYXJlbnQ7CisKKyAgYmFzZV90eXBlOjp1cGRhdGVfdG9fdG9wKHBfZ3JhbmRwYXJlbnQsIChub2RlX3VwZGF0ZSopdGhpcyk7CisgIHNwbGF5X3p6X2VuZChwX25kLCBwX3BhcmVudCwgcF9ncmFuZHBhcmVudCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3BsYXlfenpfc3RhcnQobm9kZV9wb2ludGVyIHBfbmQsCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKwkgICAgICAgbm9kZV9wb2ludGVyIHBfcGFyZW50LAorI2Vsc2UKKwkgICAgICAgbm9kZV9wb2ludGVyIC8qcF9wYXJlbnQqLywKKyNlbmRpZgorCSAgICAgICBub2RlX3BvaW50ZXIgcF9ncmFuZHBhcmVudCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQgIT0gMCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BhcmVudCAhPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfZ3JhbmRwYXJlbnQgIT0gMCk7CisKKyAgY29uc3QgYm9vbCBncmFuZHBhcmVudF9oZWFkID0gcF9ncmFuZHBhcmVudC0+bV9wX3BhcmVudCA9PSBiYXNlX3R5cGU6Om1fcF9oZWFkOworCisgIGlmIChncmFuZHBhcmVudF9oZWFkKQorICAgIHsKKyAgICAgIGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50OworICAgICAgcF9uZC0+bV9wX3BhcmVudCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQ7CisgICAgICByZXR1cm47CisgICAgfQorCisgIG5vZGVfcG9pbnRlciBwX2dyZWF0Z3JhbmRwYXJlbnQgPSBwX2dyYW5kcGFyZW50LT5tX3BfcGFyZW50OworCisgIHBfbmQtPm1fcF9wYXJlbnQgPSBwX2dyZWF0Z3JhbmRwYXJlbnQ7CisKKyAgaWYgKHBfZ3JhbmRwYXJlbnQgPT0gcF9ncmVhdGdyYW5kcGFyZW50LT5tX3BfbGVmdCkKKyAgICBwX2dyZWF0Z3JhbmRwYXJlbnQtPm1fcF9sZWZ0ID0gcF9uZDsKKyAgZWxzZQorICAgIHBfZ3JlYXRncmFuZHBhcmVudC0+bV9wX3JpZ2h0ID0gcF9uZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxheV96el9lbmQobm9kZV9wb2ludGVyIHBfbmQsIG5vZGVfcG9pbnRlciBwX3BhcmVudCwKKwkgICAgIG5vZGVfcG9pbnRlciBwX2dyYW5kcGFyZW50KQoreworICBpZiAocF9uZC0+bV9wX3BhcmVudCA9PSBiYXNlX3R5cGU6Om1fcF9oZWFkKQorICAgIGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX25kOworCisgIHRoaXMtPmFwcGx5X3VwZGF0ZShwX2dyYW5kcGFyZW50LCAobm9kZV91cGRhdGUqKXRoaXMpOworICB0aGlzLT5hcHBseV91cGRhdGUocF9wYXJlbnQsIChub2RlX3VwZGF0ZSopdGhpcyk7CisgIHRoaXMtPmFwcGx5X3VwZGF0ZShwX25kLCAobm9kZV91cGRhdGUqKXRoaXMpOworICBQQl9EU19BU1NFUlRfQkFTRV9OT0RFX0NPTlNJU1RFTlQocF9uZCkKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9zcGxheV90cmVlXy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vc3BsYXlfdHJlZV8uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMGQ2YjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vc3BsYXlfdHJlZV8uaHBwCkBAIC0wLDAgKzEsMjc1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHNwbGF5X3RyZWVfL3NwbGF5X3RyZWVfLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHNwbGF5IHRyZWVzLgorICovCisvKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIGFuIGlkZWEgZnJvbSB0aGUgU0dJIFNUTCAodXNpbmcgYSBAYSBoZWFkZXIgbm9kZQorICogICAgd2hpY2ggaXMgbmVlZGVkIGZvciBlZmZpY2llbnQgaXRlcmF0aW9uKS4gRm9sbG93aW5nIGlzIHRoZSBTR0kgU1RMCisgKiAgICBjb3B5cmlnaHQuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gICAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICAgIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqLworCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorIyBkZWZpbmUgUEJfRFNfU19UUkVFX05BTUUgc3BsYXlfdHJlZV9tYXAKKyMgZGVmaW5lIFBCX0RTX1NfVFJFRV9CQVNFX05BTUUgYmluX3NlYXJjaF90cmVlX21hcAorI2VuZGlmCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorIyBkZWZpbmUgUEJfRFNfU19UUkVFX05BTUUgc3BsYXlfdHJlZV9zZXQKKyMgZGVmaW5lIFBCX0RTX1NfVFJFRV9CQVNFX05BTUUgYmluX3NlYXJjaF90cmVlX3NldAorI2VuZGlmCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBDbXBfRm4sIFwKKwkgICAgIHR5cGVuYW1lIE5vZGVfQW5kX0l0X1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICBQQl9EU19TX1RSRUVfTkFNRTxLZXksIE1hcHBlZCwgQ21wX0ZuLCBOb2RlX0FuZF9JdF9UcmFpdHMsIF9BbGxvYz4KKworI2RlZmluZSBQQl9EU19TX1RSRUVfQkFTRSBcCisgICAgUEJfRFNfU19UUkVFX0JBU0VfTkFNRTxLZXksIE1hcHBlZCwgQ21wX0ZuLCBOb2RlX0FuZF9JdF9UcmFpdHMsIF9BbGxvYz4KKworCisgICAgLyoqCisgICAgICogIEBicmllZiBTcGxheSB0cmVlLgorICAgICAqICBAaW5ncm91cCBicmFuY2gtZGV0YWlsCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIENtcF9GbiwKKwkgICAgIHR5cGVuYW1lIE5vZGVfQW5kX0l0X1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIFBCX0RTX1NfVFJFRV9OQU1FIDogcHVibGljIFBCX0RTX1NfVFJFRV9CQVNFCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIFBCX0RTX1NfVFJFRV9CQVNFIAkJICAgICAgIAkgYmFzZV90eXBlOworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB0eXBlZGVmIGJhc2VfdHlwZSBkZWJ1Z19iYXNlOworI2VuZGlmCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bm9kZV9wb2ludGVyIAkJIG5vZGVfcG9pbnRlcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgc3BsYXlfdHJlZV90YWcgCQkJCSBjb250YWluZXJfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIF9BbGxvYyAJCQkJCSBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgCQkgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmRpZmZlcmVuY2VfdHlwZSAJCSBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIENtcF9GbiAJCQkJCSBjbXBfZm47CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6a2V5X3R5cGUgCQkga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6a2V5X3BvaW50ZXIgCQkga2V5X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6a2V5X2NvbnN0X3BvaW50ZXIgCSBrZXlfY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjprZXlfcmVmZXJlbmNlIAkga2V5X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjprZXlfY29uc3RfcmVmZXJlbmNlIAkga2V5X2NvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjptYXBwZWRfdHlwZSAJIAkgbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bWFwcGVkX3BvaW50ZXIgCSBtYXBwZWRfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjptYXBwZWRfY29uc3RfcG9pbnRlciAJIG1hcHBlZF9jb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om1hcHBlZF9yZWZlcmVuY2UgCSBtYXBwZWRfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om1hcHBlZF9jb25zdF9yZWZlcmVuY2UgbWFwcGVkX2NvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjp2YWx1ZV90eXBlIAkJIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRlciAJCSBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3BvaW50ZXIgCSBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnJlZmVyZW5jZSAJIAkgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSAJIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpwb2ludF9pdGVyYXRvciAJIHBvaW50X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIAkgcG9pbnRfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6aXRlcmF0b3IgCQkgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IgCSBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpyZXZlcnNlX2l0ZXJhdG9yIAkgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bm9kZV91cGRhdGUgCQkgbm9kZV91cGRhdGU7CisKKyAgICAgIFBCX0RTX1NfVFJFRV9OQU1FKCk7CisKKyAgICAgIFBCX0RTX1NfVFJFRV9OQU1FKGNvbnN0IENtcF9GbiYpOworCisgICAgICBQQl9EU19TX1RSRUVfTkFNRShjb25zdCBDbXBfRm4mLCBjb25zdCBub2RlX3VwZGF0ZSYpOworCisgICAgICBQQl9EU19TX1RSRUVfTkFNRShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgICAgdm9pZAorICAgICAgY29weV9mcm9tX3JhbmdlKEl0LCBJdCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGluaXRpYWxpemUoKTsKKworICAgICAgaW5saW5lIHN0ZDo6cGFpcjxwb2ludF9pdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydChjb25zdF9yZWZlcmVuY2Ugcl92YWx1ZSk7CisKKyAgICAgIGlubGluZSBtYXBwZWRfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCisgICAgICB7CisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorCV9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCXN0ZDo6cGFpcjxwb2ludF9pdGVyYXRvciwgYm9vbD4gaW5zX3BhaXIgPQorCSAgaW5zZXJ0X2xlYWZfaW1wKHZhbHVlX3R5cGUocl9rZXksIG1hcHBlZF90eXBlKCkpKTsKKworCWluc19wYWlyLmZpcnN0Lm1fcF9uZC0+bV9zcGVjaWFsID0gZmFsc2U7CisJX0dMSUJDWFhfREVCVUdfT05MWShiYXNlX3R5cGU6OmFzc2VydF92YWxpZChfX0ZJTEVfXywgX19MSU5FX18pKTsKKwlzcGxheShpbnNfcGFpci5maXJzdC5tX3BfbmQpOworCV9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKF9fRklMRV9fLCBfX0xJTkVfXyk7KQorCXJldHVybiBpbnNfcGFpci5maXJzdC5tX3BfbmQtPm1fdmFsdWUuc2Vjb25kOworI2Vsc2UKKwlpbnNlcnQocl9rZXkpOworCXJldHVybiBiYXNlX3R5cGU6OnNfbnVsbF90eXBlOworI2VuZGlmCisgICAgICB9CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgZmluZChrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIHBvaW50X2NvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGtleV9jb25zdF9yZWZlcmVuY2UpIGNvbnN0OworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgZXJhc2Uoa2V5X2NvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgaXQpOworCisgICAgICBpbmxpbmUgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgZXJhc2UocmV2ZXJzZV9pdGVyYXRvcik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBlcmFzZV9pZihQcmVkKTsKKworICAgICAgdm9pZAorICAgICAgam9pbihQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB2b2lkCisgICAgICBzcGxpdChrZXlfY29uc3RfcmVmZXJlbmNlLCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgcHJpdmF0ZToKKyAgICAgIGlubGluZSBzdGQ6OnBhaXI8cG9pbnRfaXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnRfbGVhZl9pbXAoY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgZmluZF9pbXAoa2V5X2NvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBjb25zdCBub2RlX3BvaW50ZXIKKyAgICAgIGZpbmRfaW1wKGtleV9jb25zdF9yZWZlcmVuY2UpIGNvbnN0OworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZChjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9zcGVjaWFsX2ltcChjb25zdCBub2RlX3BvaW50ZXIsIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKSBjb25zdDsKKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBzcGxheShub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgc3BsYXlfemlnX3phZ19sZWZ0KG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgc3BsYXlfemlnX3phZ19yaWdodChub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHNwbGF5X3ppZ196aWdfbGVmdChub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHNwbGF5X3ppZ196aWdfcmlnaHQobm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBzcGxheV96el9zdGFydChub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHNwbGF5X3p6X2VuZChub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgbGVmdG1vc3Qobm9kZV9wb2ludGVyKTsKKworICAgICAgdm9pZAorICAgICAgZXJhc2Vfbm9kZShub2RlX3BvaW50ZXIpOworICAgIH07CisKKyNkZWZpbmUgUEJfRFNfQVNTRVJUX0JBU0VfTk9ERV9DT05TSVNURU5UKF9Ob2RlKQkJCVwKKyAgX0dMSUJDWFhfREVCVUdfT05MWShiYXNlX3R5cGU6OmFzc2VydF9ub2RlX2NvbnNpc3RlbnQoX05vZGUsCQlcCisJCQkJCQkJX19GSUxFX18sIF9fTElORV9fKTspCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vaW5zZXJ0X2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vc3BsYXlfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9lcmFzZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2ZpbmRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9kZWJ1Z19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHA+CisKKyN1bmRlZiBQQl9EU19BU1NFUlRfQkFTRV9OT0RFX0NPTlNJU1RFTlQKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfU19UUkVFX05BTUUKKyN1bmRlZiBQQl9EU19TX1RSRUVfQkFTRV9OQU1FCisjdW5kZWYgUEJfRFNfU19UUkVFX0JBU0UKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YTY1MzEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDExMiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBzcGxheV90cmVlXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igc3BsYXlfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citqb2luKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgaWYgKGJhc2VfdHlwZTo6am9pbl9wcmVwKG90aGVyKSA9PSBmYWxzZSkKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbm9kZV9wb2ludGVyIHBfdGFyZ2V0X3IgPSBvdGhlci5sZWZ0bW9zdChvdGhlci5tX3BfaGVhZCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3RhcmdldF9yICE9IDApOworICBvdGhlci5zcGxheShwX3RhcmdldF9yKTsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF90YXJnZXRfciA9PSBvdGhlci5tX3BfaGVhZC0+bV9wX3BhcmVudCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3RhcmdldF9yLT5tX3BfbGVmdCA9PSAwKTsKKworICBwX3RhcmdldF9yLT5tX3BfbGVmdCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQ7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfdGFyZ2V0X3ItPm1fcF9sZWZ0ICE9IDApOworICBwX3RhcmdldF9yLT5tX3BfbGVmdC0+bV9wX3BhcmVudCA9IHBfdGFyZ2V0X3I7CisKKyAgYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCA9IHBfdGFyZ2V0X3I7CisgIHBfdGFyZ2V0X3ItPm1fcF9wYXJlbnQgPSBiYXNlX3R5cGU6Om1fcF9oZWFkOworCisgIHRoaXMtPmFwcGx5X3VwZGF0ZShwX3RhcmdldF9yLCAobm9kZV91cGRhdGUqKXRoaXMpOworICBiYXNlX3R5cGU6OmpvaW5fZmluaXNoKG90aGVyKTsKKworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3BsaXQoa2V5X2NvbnN0X3JlZmVyZW5jZSByX2tleSwgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorCisgIGlmIChiYXNlX3R5cGU6OnNwbGl0X3ByZXAocl9rZXksIG90aGVyKSA9PSBmYWxzZSkKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbm9kZV9wb2ludGVyIHBfdXBwZXJfYm91bmQgPSB0aGlzLT51cHBlcl9ib3VuZChyX2tleSkubV9wX25kOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF91cHBlcl9ib3VuZCAhPSAwKTsKKworICBzcGxheShwX3VwcGVyX2JvdW5kKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfdXBwZXJfYm91bmQtPm1fcF9wYXJlbnQgPT0gdGhpcy0+bV9wX2hlYWQpOworCisgIG5vZGVfcG9pbnRlciBwX25ld19yb290ID0gcF91cHBlcl9ib3VuZC0+bV9wX2xlZnQ7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25ld19yb290ICE9IDApOworCisgIGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX25ld19yb290OworICBwX25ld19yb290LT5tX3BfcGFyZW50ID0gYmFzZV90eXBlOjptX3BfaGVhZDsKKyAgb3RoZXIubV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX3VwcGVyX2JvdW5kOworICBwX3VwcGVyX2JvdW5kLT5tX3BfcGFyZW50ID0gb3RoZXIubV9wX2hlYWQ7CisgIHBfdXBwZXJfYm91bmQtPm1fcF9sZWZ0ID0gMDsKKyAgdGhpcy0+YXBwbHlfdXBkYXRlKHBfdXBwZXJfYm91bmQsIChub2RlX3VwZGF0ZSopdGhpcyk7CisgIGJhc2VfdHlwZTo6c3BsaXRfZmluaXNoKG90aGVyKTsKKworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vdHJhaXRzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy90cmFpdHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOGVkNDEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vdHJhaXRzLmhwcApAQCAtMCwwICsxLDk1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHNwbGF5X3RyZWVfL3RyYWl0cy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciBzcGxheV90cmVlXy4KKyAqLworCisjaWZuZGVmIFBCX0RTX1NQTEFZX1RSRUVfTk9ERV9BTkRfSVRfVFJBSVRTX0hQUAorI2RlZmluZSBQQl9EU19TUExBWV9UUkVFX05PREVfQU5EX0lUX1RSQUlUU19IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vbm9kZS5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8vLyBTcGVjaWFsaXphdGlvbi4KKyAgICAvLy8gQGluZ3JvdXAgdHJhaXRzCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgICAgdHlwZW5hbWUgTWFwcGVkLAorCSAgICAgdHlwZW5hbWUgQ21wX0ZuLAorCSAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9DSXRyLAorCQkgICAgICB0eXBlbmFtZSBOb2RlX0l0ciwKKwkJICAgICAgdHlwZW5hbWUgQ21wX0ZuXywKKwkJICAgICAgdHlwZW5hbWUgX0FsbG9jXz4KKwkgICAgIGNsYXNzIE5vZGVfVXBkYXRlLAorCSAgICAgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCB0cmVlX3RyYWl0czxLZXksIE1hcHBlZCwgQ21wX0ZuLCBOb2RlX1VwZGF0ZSwgc3BsYXlfdHJlZV90YWcsIF9BbGxvYz4gCisgICAgOiBwdWJsaWMgYmluX3NlYXJjaF90cmVlX3RyYWl0czxLZXksIE1hcHBlZCwgQ21wX0ZuLCBOb2RlX1VwZGF0ZSwKKwkJCQkgICAgc3BsYXlfdHJlZV9ub2RlXzwKKyAgICAgIHR5cGVuYW1lIHR5cGVzX3RyYWl0czxLZXksIE1hcHBlZCwgX0FsbG9jLCBmYWxzZT46OnZhbHVlX3R5cGUsCisgICAgICB0eXBlbmFtZSB0cmVlX25vZGVfbWV0YWRhdGFfZGlzcGF0Y2g8S2V5LCBNYXBwZWQsIENtcF9GbiwgTm9kZV9VcGRhdGUsCisJCQkJCSAgIF9BbGxvYz46OnR5cGUsCisJCQkJICAgICAgX0FsbG9jPiwKKwkJCQkgICAgICBfQWxsb2M+CisgICAgeyB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uLgorICAgIC8vLyBAaW5ncm91cCB0cmFpdHMKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgICBjbGFzcyBDbXBfRm4sCisJICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX0NJdHIsCisJCSAgICAgIGNsYXNzIE5vZGVfSXRyLAorCQkgICAgICBjbGFzcyBDbXBfRm5fLAorCQkgICAgICB0eXBlbmFtZSBfQWxsb2NfPgorICAgICAgICAgICAgIGNsYXNzIE5vZGVfVXBkYXRlLAorCSAgICAgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCB0cmVlX3RyYWl0czxLZXksIG51bGxfdHlwZSwgQ21wX0ZuLCBOb2RlX1VwZGF0ZSwKKwkJICAgICAgIHNwbGF5X3RyZWVfdGFnLCBfQWxsb2M+IAorICAgIDogcHVibGljIGJpbl9zZWFyY2hfdHJlZV90cmFpdHM8S2V5LCBudWxsX3R5cGUsIENtcF9GbiwgTm9kZV9VcGRhdGUsIAorCQkJCSAgICBzcGxheV90cmVlX25vZGVfPAorICAgICAgdHlwZW5hbWUgdHlwZXNfdHJhaXRzPEtleSwgbnVsbF90eXBlLCBfQWxsb2MsIGZhbHNlPjo6dmFsdWVfdHlwZSwKKyAgICAgIHR5cGVuYW1lIHRyZWVfbm9kZV9tZXRhZGF0YV9kaXNwYXRjaDxLZXksIG51bGxfdHlwZSwgQ21wX0ZuLCBOb2RlX1VwZGF0ZSwKKwkJCQkJICAgX0FsbG9jPjo6dHlwZSwKKwkJCQkgICAgICBfQWxsb2M+LAorCQkJCSAgICBfQWxsb2M+CisgICAgeyB9OworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19TUExBWV9UUkVFX05PREVfQU5EX0lUX1RSQUlUU19IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC9zdGFuZGFyZF9wb2xpY2llcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3RhbmRhcmRfcG9saWNpZXMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMTdlNDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvc3RhbmRhcmRfcG9saWNpZXMuaHBwCkBAIC0wLDAgKzEsMTU4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGRldGFpbC9zdGFuZGFyZF9wb2xpY2llcy5ocHAKKyAqIENvbnRhaW5zIHN0YW5kYXJkIHBvbGljaWVzIGZvciBjb250YWluZXJzLgorICovCisKKyNpZm5kZWYgUEJfRFNfU1RBTkRBUkRfUE9MSUNJRVNfSFBQCisjZGVmaW5lIFBCX0RTX1NUQU5EQVJEX1BPTElDSUVTX0hQUAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGV4dC9wYl9kcy9oYXNoX3BvbGljeS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2xpc3RfdXBkYXRlX3BvbGljeS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9icmFuY2hfcG9saWN5L251bGxfbm9kZV9tZXRhZGF0YS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvdHJpZV9wb2xpY3kuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy90YWdfYW5kX3RyYWl0LmhwcD4KKyNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIFByaW1hcnkgdGVtcGxhdGUsIGRlZmF1bHRfaGFzaF9mbi4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXk+CisgICAgc3RydWN0IGRlZmF1bHRfaGFzaF9mbgorICAgIHsKKwkvLy8gRGlzcGF0Y2hlZCB0eXBlLgorICAgICAgdHlwZWRlZiBzdGQ6OnRyMTo6aGFzaDxLZXk+IAkJCQl0eXBlOworICAgIH07CisKKyAgICAvLy8gUHJpbWFyeSB0ZW1wbGF0ZSwgZGVmYXVsdF9lcV9mbi4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXk+CisgICAgc3RydWN0IGRlZmF1bHRfZXFfZm4KKyAgICB7CisJLy8vIERpc3BhdGNoZWQgdHlwZS4KKyAgICAgIHR5cGVkZWYgc3RkOjplcXVhbF90bzxLZXk+IAkJCQl0eXBlOworICAgIH07CisKKyAgICAvLy8gRW51bWVyYXRpb24gZm9yIGRlZmF1bHQgYmVoYXZpb3Igb2Ygc3RvcmVkIGhhc2ggZGF0YS4KKyAgICBlbnVtCisgICAgICB7CisJZGVmYXVsdF9zdG9yZV9oYXNoID0gZmFsc2UKKyAgICAgIH07CisKKyAgICAvLy8gUHJpbWFyeSB0ZW1wbGF0ZSwgZGVmYXVsdF9jb21iX2hhc2hfZm4uCisgICAgc3RydWN0IGRlZmF1bHRfY29tYl9oYXNoX2ZuCisgICAgeworCS8vLyBEaXNwYXRjaGVkIHR5cGUuCisgICAgICB0eXBlZGVmIGRpcmVjdF9tYXNrX3JhbmdlX2hhc2hpbmc8PiAJCQl0eXBlOworICAgIH07CisKKyAgICAvLy8gUHJpbWFyeSB0ZW1wbGF0ZSwgZGVmYXVsdF9yZXNpemVfcG9saWN5LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbWJfSGFzaF9Gbj4KKyAgICBzdHJ1Y3QgZGVmYXVsdF9yZXNpemVfcG9saWN5CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIENvbWJfSGFzaF9Gbjo6c2l6ZV90eXBlIAkJCXNpemVfdHlwZTsKKworICAgICAgdHlwZWRlZiBkaXJlY3RfbWFza19yYW5nZV9oYXNoaW5nPHNpemVfdHlwZT4gCQlkZWZhdWx0X2ZuOworICAgICAgdHlwZWRlZiBpc19zYW1lPGRlZmF1bHRfZm4sIENvbWJfSGFzaF9Gbj4gCQlzYW1lX3R5cGU7CisgICAgICB0eXBlZGVmIGhhc2hfZXhwb25lbnRpYWxfc2l6ZV9wb2xpY3k8c2l6ZV90eXBlPiAJCWlmdHJ1ZTsKKyAgICAgIHR5cGVkZWYgaGFzaF9wcmltZV9zaXplX3BvbGljeSAJCQkJaWZmYWxzZTsKKyAgICAgIHR5cGVkZWYgX19jb25kaXRpb25hbF90eXBlPHNhbWVfdHlwZTo6dmFsdWUsIGlmdHJ1ZSwgaWZmYWxzZT4gY29uZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25kX3R5cGU6Ol9fdHlwZSAJCSAgICAgICBzaXplX3BvbGljeV90eXBlOworCisgICAgICB0eXBlZGVmIGhhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcjxmYWxzZSwgc2l6ZV90eXBlPiAJdHJpZ2dlcjsKKworICAgIHB1YmxpYzoKKwkvLy8gRGlzcGF0Y2hlZCB0eXBlLgorICAgICAgdHlwZWRlZiBoYXNoX3N0YW5kYXJkX3Jlc2l6ZV9wb2xpY3k8c2l6ZV9wb2xpY3lfdHlwZSwgdHJpZ2dlciwgCisJCQkJCSAgZmFsc2UsIHNpemVfdHlwZT4gCXR5cGU7CisgICAgfTsKKworICAgIC8vLyBEZWZhdWx0IHVwZGF0ZSBwb2xpY3kuCisgICAgc3RydWN0IGRlZmF1bHRfdXBkYXRlX3BvbGljeQorICAgIHsKKwkvLy8gRGlzcGF0Y2hlZCB0eXBlLgorICAgICAgdHlwZWRlZiBsdV9tb3ZlX3RvX2Zyb250X3BvbGljeTw+IAkJCXR5cGU7CisgICAgfTsKKworICAgIC8vLyBQcmltYXJ5IHRlbXBsYXRlLCBkZWZhdWx0X3Byb2JlX2ZuLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbWJfUHJvYmVfRm4+CisgICAgc3RydWN0IGRlZmF1bHRfcHJvYmVfZm4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQ29tYl9Qcm9iZV9Gbjo6c2l6ZV90eXBlIAkJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBkaXJlY3RfbWFza19yYW5nZV9oYXNoaW5nPHNpemVfdHlwZT4gCQlkZWZhdWx0X2ZuOworICAgICAgdHlwZWRlZiBpc19zYW1lPGRlZmF1bHRfZm4sIENvbWJfUHJvYmVfRm4+IAkJc2FtZV90eXBlOworICAgICAgdHlwZWRlZiBsaW5lYXJfcHJvYmVfZm48c2l6ZV90eXBlPiAJCQlpZnRydWU7CisgICAgICB0eXBlZGVmIHF1YWRyYXRpY19wcm9iZV9mbjxzaXplX3R5cGU+IAkJCWlmZmFsc2U7CisgICAgICB0eXBlZGVmIF9fY29uZGl0aW9uYWxfdHlwZTxzYW1lX3R5cGU6OnZhbHVlLCBpZnRydWUsIGlmZmFsc2U+IGNvbmRfdHlwZTsKKworICAgIHB1YmxpYzoKKwkvLy8gRGlzcGF0Y2hlZCB0eXBlLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25kX3R5cGU6Ol9fdHlwZSAJCQl0eXBlOworICAgIH07CisKKworICAgIC8vLyBQcmltYXJ5IHRlbXBsYXRlLCBkZWZhdWx0X3RyaWVfYWNjZXNzX3RyYWl0cy4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXk+CisgICAgICBzdHJ1Y3QgZGVmYXVsdF90cmllX2FjY2Vzc190cmFpdHM7CisKKyNkZWZpbmUgX19kdHJpZV9hbGxvYyBzdGQ6OmFsbG9jYXRvcjxjaGFyPiAgCisjZGVmaW5lIF9fZHRyaWVfc3RyaW5nIHN0ZDo6YmFzaWNfc3RyaW5nPENoYXIsIENoYXJfVHJhaXRzLCBfX2R0cmllX2FsbG9jPiAKKworICAgIC8vLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uLCBkZWZhdWx0X3RyaWVfYWNjZXNzX3RyYWl0cy4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyLCB0eXBlbmFtZSBDaGFyX1RyYWl0cz4KKyAgICAgIHN0cnVjdCBkZWZhdWx0X3RyaWVfYWNjZXNzX3RyYWl0czxfX2R0cmllX3N0cmluZz4KKyAgICAgIHsKKyAgICAgIHByaXZhdGU6CisJdHlwZWRlZiBfX2R0cmllX3N0cmluZwkJCQkJc3RyaW5nX3R5cGU7CisKKyAgICAgIHB1YmxpYzoKKwkvLy8gRGlzcGF0Y2hlZCB0eXBlLgorCXR5cGVkZWYgdHJpZV9zdHJpbmdfYWNjZXNzX3RyYWl0czxzdHJpbmdfdHlwZT4gCQl0eXBlOworICAgICAgfTsKKworI3VuZGVmIF9fZHRyaWVfYWxsb2MKKyN1bmRlZiBfX2R0cmllX3N0cmluZworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19TVEFOREFSRF9QT0xJQ0lFU19IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY4MzUwZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTA1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHRoaW5faGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGluX2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NvcHlfZnJvbV9yYW5nZShJdCBmaXJzdF9pdCwgSXQgbGFzdF9pdCkKK3sKKyAgd2hpbGUgKGZpcnN0X2l0ICE9IGxhc3RfaXQpCisgICAgcHVzaCgqKGZpcnN0X2l0KyspKTsKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit0aGluX2hlYXAoKSA6IG1fcF9tYXgoMCkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RoaW5faGVhcChjb25zdCBDbXBfRm4mIHJfY21wX2ZuKSAKKzogYmFzZV90eXBlKHJfY21wX2ZuKSwgbV9wX21heCgwKQoreworICBpbml0aWFsaXplKCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgordGhpbl9oZWFwKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgCis6IGJhc2VfdHlwZShvdGhlcikKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBtX3BfbWF4ID0gYmFzZV90eXBlOjptX3Bfcm9vdDsKKyAgZm9yIChub2RlX3BvaW50ZXIgcF9uZCA9IGJhc2VfdHlwZTo6bV9wX3Jvb3Q7IHBfbmQgIT0gMDsgCisgICAgICAgcF9uZCA9IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcpCisgICAgaWYgKENtcF9Gbjo6b3BlcmF0b3IoKShtX3BfbWF4LT5tX3ZhbHVlLCBwX25kLT5tX3ZhbHVlKSkKKyAgICAgIG1fcF9tYXggPSBwX25kOworCisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBiYXNlX3R5cGU6OnN3YXAob3RoZXIpOworICBzdGQ6OnN3YXAobV9wX21heCwgb3RoZXIubV9wX21heCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorfnRoaW5faGVhcCgpCit7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luaXRpYWxpemUoKQoreyBzdGQ6OmZpbGwobV9hX2F1eCwgbV9hX2F1eCArIG1heF9yYW5rLCBzdGF0aWNfY2FzdDxub2RlX3BvaW50ZXI+KDApKTsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOTdhNmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDExOSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0aGluX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpbl9oZWFwXy4KKyAqLworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF92YWxpZChjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGJhc2VfdHlwZTo6YXNzZXJ0X3ZhbGlkKF9fZmlsZSwgX19saW5lKTsKKyAgYXNzZXJ0X25vZGVfY29uc2lzdGVudChiYXNlX3R5cGU6Om1fcF9yb290LCB0cnVlLCBfX2ZpbGUsIF9fbGluZSk7CisgIGFzc2VydF9tYXgoX19maWxlLCBfX2xpbmUpOworICBhc3NlcnRfYXV4X251bGwoX19maWxlLCBfX2xpbmUpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X2F1eF9udWxsKGNvbnN0IGNoYXIqIF9fZmlsZSwgaW50IF9fbGluZSkgY29uc3QKK3sKKyAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBtYXhfcmFuazsgKytpKQorICAgIFBCX0RTX0RFQlVHX1ZFUklGWShtX2FfYXV4W2ldID09IDApOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X21heChjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUpIGNvbnN0Cit7CisgIGlmIChtX3BfbWF4ID09IDApCisgICAgeworICAgICAgUEJfRFNfREVCVUdfVkVSSUZZKGJhc2VfdHlwZTo6ZW1wdHkoKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIFBCX0RTX0RFQlVHX1ZFUklGWSghYmFzZV90eXBlOjplbXB0eSgpKTsKKyAgUEJfRFNfREVCVUdfVkVSSUZZKGJhc2VfdHlwZTo6cGFyZW50KG1fcF9tYXgpID09IDApOworICBQQl9EU19ERUJVR19WRVJJRlkobV9wX21heC0+bV9wX3ByZXZfb3JfcGFyZW50ID09IDApOworICBmb3IgKGNvbnN0X2l0ZXJhdG9yIGl0ID0gYmFzZV90eXBlOjpiZWdpbigpOyBpdCAhPSBiYXNlX3R5cGU6OmVuZCgpOyArK2l0KQorICAgIFBCX0RTX0RFQlVHX1ZFUklGWSghQ21wX0ZuOjpvcGVyYXRvcigpKG1fcF9tYXgtPm1fdmFsdWUsIGl0Lm1fcF9uZC0+bV92YWx1ZSkpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X25vZGVfY29uc2lzdGVudChub2RlX2NvbnN0X3BvaW50ZXIgcF9uZCwgYm9vbCByb290LAorCQkgICAgICAgY29uc3QgY2hhciogX19maWxlLCBpbnQgX19saW5lKSBjb25zdAoreworICBiYXNlX3R5cGU6OmFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF9uZCwgcm9vdCwgX19maWxlLCBfX2xpbmUpOworICBpZiAocF9uZCA9PSAwKQorICAgIHJldHVybjsKKworICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcsIHJvb3QsIF9fZmlsZSwgX19saW5lKTsKKyAgYXNzZXJ0X25vZGVfY29uc2lzdGVudChwX25kLT5tX3BfbF9jaGlsZCwgZmFsc2UsIF9fZmlsZSwgX19saW5lKTsKKyAgaWYgKCFyb290KQorICAgIHsKKyAgICAgIGlmIChwX25kLT5tX21ldGFkYXRhID09IDApCisJUEJfRFNfREVCVUdfVkVSSUZZKHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgPT0gMCk7CisgICAgICBlbHNlCisJUEJfRFNfREVCVUdfVkVSSUZZKHBfbmQtPm1fbWV0YWRhdGEgPT0gcF9uZC0+bV9wX25leHRfc2libGluZy0+bV9tZXRhZGF0YSArIDEpOworICAgIH0KKworICBpZiAocF9uZC0+bV9wX2xfY2hpbGQgIT0gMCkKKyAgICBQQl9EU19ERUJVR19WRVJJRlkocF9uZC0+bV9wX2xfY2hpbGQtPm1fbWV0YWRhdGEgKyAxID09IGJhc2VfdHlwZTo6ZGVncmVlKHBfbmQpKTsKKworICBjb25zdCBib29sIHVubWFya2VkX3ZhbGlkID0KKyAgICAocF9uZC0+bV9wX2xfY2hpbGQgPT0gMCAmJiBwX25kLT5tX21ldGFkYXRhID09IDApCisgICAgfHwgKHBfbmQtPm1fcF9sX2NoaWxkICE9IDAKKwkgJiYgcF9uZC0+bV9tZXRhZGF0YSA9PSBwX25kLT5tX3BfbF9jaGlsZC0+bV9tZXRhZGF0YSArIDEpOworCisgIGNvbnN0IGJvb2wgbWFya2VkX3ZhbGlkID0KKyAgICAocF9uZC0+bV9wX2xfY2hpbGQgPT0gMCAmJiBwX25kLT5tX21ldGFkYXRhID09IDEpCisgICAgfHwgKHBfbmQtPm1fcF9sX2NoaWxkICE9IDAKKwkmJiBwX25kLT5tX21ldGFkYXRhID09IHBfbmQtPm1fcF9sX2NoaWxkLT5tX21ldGFkYXRhICsgMik7CisKKyAgUEJfRFNfREVCVUdfVkVSSUZZKHVubWFya2VkX3ZhbGlkIHx8IG1hcmtlZF92YWxpZCk7CisgIGlmIChyb290KQorICAgIFBCX0RTX0RFQlVHX1ZFUklGWSh1bm1hcmtlZF92YWxpZCk7Cit9CisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vZXJhc2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU5YjNlZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMjU1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHRoaW5faGVhcF8vZXJhc2VfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGluX2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citwb3AoKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFiYXNlX3R5cGU6OmVtcHR5KCkpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX21heCAhPSAwKTsKKworICBub2RlX3BvaW50ZXIgcF9uZCA9IG1fcF9tYXg7CisgIHJlbW92ZV9tYXhfbm9kZSgpOworICBiYXNlX3R5cGU6OmFjdHVhbF9lcmFzZV9ub2RlKHBfbmQpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZW1vdmVfbWF4X25vZGUoKQoreworICB0b19hdXhfZXhjZXB0X21heCgpOworICBtYWtlX2Zyb21fYXV4KCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0b19hdXhfZXhjZXB0X21heCgpCit7CisgIG5vZGVfcG9pbnRlciBwX2FkZCA9IGJhc2VfdHlwZTo6bV9wX3Jvb3Q7CisgIHdoaWxlIChwX2FkZCAhPSBtX3BfbWF4KQorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHRfYWRkID0gcF9hZGQtPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBhZGRfdG9fYXV4KHBfYWRkKTsKKyAgICAgIHBfYWRkID0gcF9uZXh0X2FkZDsKKyAgICB9CisKKyAgcF9hZGQgPSBtX3BfbWF4LT5tX3BfbF9jaGlsZDsKKyAgd2hpbGUgKHBfYWRkICE9IDApCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfbmV4dF9hZGQgPSBwX2FkZC0+bV9wX25leHRfc2libGluZzsKKyAgICAgIHBfYWRkLT5tX21ldGFkYXRhID0gcF9hZGQtPm1fcF9sX2NoaWxkID09IDAgPworCTAgOiBwX2FkZC0+bV9wX2xfY2hpbGQtPm1fbWV0YWRhdGEgKyAxOworCisgICAgICBhZGRfdG9fYXV4KHBfYWRkKTsKKyAgICAgIHBfYWRkID0gcF9uZXh0X2FkZDsKKyAgICB9CisKKyAgcF9hZGQgPSBtX3BfbWF4LT5tX3BfbmV4dF9zaWJsaW5nOworICB3aGlsZSAocF9hZGQgIT0gMCkKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9uZXh0X2FkZCA9IHBfYWRkLT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgYWRkX3RvX2F1eChwX2FkZCk7CisgICAgICBwX2FkZCA9IHBfbmV4dF9hZGQ7CisgICAgfQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FkZF90b19hdXgobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIHNpemVfdHlwZSByID0gcF9uZC0+bV9tZXRhZGF0YTsKKyAgd2hpbGUgKG1fYV9hdXhbcl0gIT0gMCkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV9tZXRhZGF0YSA8IHJhbmtfYm91bmQoKSk7CisgICAgICBpZiAoQ21wX0ZuOjpvcGVyYXRvcigpKG1fYV9hdXhbcl0tPm1fdmFsdWUsIHBfbmQtPm1fdmFsdWUpKQorCW1ha2VfY2hpbGRfb2YobV9hX2F1eFtyXSwgcF9uZCk7CisgICAgICBlbHNlCisJeworCSAgbWFrZV9jaGlsZF9vZihwX25kLCBtX2FfYXV4W3JdKTsKKwkgIHBfbmQgPSBtX2FfYXV4W3JdOworCX0KKworICAgICAgbV9hX2F1eFtyXSA9IDA7CisgICAgICArK3I7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX21ldGFkYXRhIDwgcmFua19ib3VuZCgpKTsKKworICBtX2FfYXV4W3JdID0gcF9uZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CittYWtlX2NoaWxkX29mKG5vZGVfcG9pbnRlciBwX25kLCBub2RlX3BvaW50ZXIgcF9uZXdfcGFyZW50KQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV9tZXRhZGF0YSA9PSBwX25ld19wYXJlbnQtPm1fbWV0YWRhdGEpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9hX2F1eFtwX25kLT5tX21ldGFkYXRhXSA9PSBwX25kIHx8CisJCSAgIG1fYV9hdXhbcF9uZC0+bV9tZXRhZGF0YV0gPT0gcF9uZXdfcGFyZW50KTsKKworICArK3BfbmV3X3BhcmVudC0+bV9tZXRhZGF0YTsKKyAgYmFzZV90eXBlOjptYWtlX2NoaWxkX29mKHBfbmQsIHBfbmV3X3BhcmVudCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbWFrZV9mcm9tX2F1eCgpCit7CisgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBtX3BfbWF4ID0gMDsKKyAgY29uc3Qgc2l6ZV90eXBlIHJua19ibmQgPSByYW5rX2JvdW5kKCk7CisgIHNpemVfdHlwZSBpID0gMDsKKyAgd2hpbGUgKGkgPCBybmtfYm5kKQorICAgIHsKKyAgICAgIGlmIChtX2FfYXV4W2ldICE9IDApCisJeworCSAgbWFrZV9yb290X2FuZF9saW5rKG1fYV9hdXhbaV0pOworCSAgbV9hX2F1eFtpXSA9IDA7CisJfQorICAgICAgKytpOworICAgIH0KKworICBQQl9EU19BU1NFUlRfQVVYX05VTEwoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZW1vdmVfbm9kZShub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgbm9kZV9wb2ludGVyIHBfcGFyZW50ID0gcF9uZDsKKyAgd2hpbGUgKGJhc2VfdHlwZTo6cGFyZW50KHBfcGFyZW50KSAhPSAwKQorICAgIHBfcGFyZW50ID0gYmFzZV90eXBlOjpwYXJlbnQocF9wYXJlbnQpOworCisgIGJhc2VfdHlwZTo6YnViYmxlX3RvX3RvcChwX25kKTsKKyAgbV9wX21heCA9IHBfbmQ7CisKKyAgbm9kZV9wb2ludGVyIHBfZml4ID0gYmFzZV90eXBlOjptX3Bfcm9vdDsKKyAgd2hpbGUgKHBfZml4ICE9IDAmJiAgcF9maXgtPm1fcF9uZXh0X3NpYmxpbmcgIT0gcF9wYXJlbnQpCisgICAgcF9maXggPSBwX2ZpeC0+bV9wX25leHRfc2libGluZzsKKworICBpZiAocF9maXggIT0gMCkKKyAgICBwX2ZpeC0+bV9wX25leHRfc2libGluZyA9IHBfbmQ7CisKKyAgcmVtb3ZlX21heF9ub2RlKCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY2xlYXIoKQoreworICBiYXNlX3R5cGU6OmNsZWFyKCk7CisgIG1fcF9tYXggPSAwOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2UocG9pbnRfaXRlcmF0b3IgaXQpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWJhc2VfdHlwZTo6ZW1wdHkoKSk7CisKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBpdC5tX3BfbmQ7CisgIHJlbW92ZV9ub2RlKHBfbmQpOworICBiYXNlX3R5cGU6OmFjdHVhbF9lcmFzZV9ub2RlKHBfbmQpOworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIFByZWQ+Cit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9pZihQcmVkIHByZWQpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBpZiAoYmFzZV90eXBlOjplbXB0eSgpKQorICAgIHsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGJhc2VfdHlwZTo6dG9fbGlua2VkX2xpc3QoKTsKKyAgbm9kZV9wb2ludGVyIHBfb3V0ID0gYmFzZV90eXBlOjpwcnVuZShwcmVkKTsKKyAgc2l6ZV90eXBlIGVyc2QgPSAwOworICB3aGlsZSAocF9vdXQgIT0gMCkKKyAgICB7CisgICAgICArK2Vyc2Q7CisgICAgICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gcF9vdXQtPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBiYXNlX3R5cGU6OmFjdHVhbF9lcmFzZV9ub2RlKHBfb3V0KTsKKyAgICAgIHBfb3V0ID0gcF9uZXh0OworICAgIH0KKworICBub2RlX3BvaW50ZXIgcF9jdXIgPSBiYXNlX3R5cGU6Om1fcF9yb290OworICBtX3BfbWF4ID0gYmFzZV90eXBlOjptX3Bfcm9vdCA9IDA7CisgIHdoaWxlIChwX2N1ciAhPSAwKQorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX2N1ci0+bV9wX25leHRfc2libGluZzsKKyAgICAgIG1ha2Vfcm9vdF9hbmRfbGluayhwX2N1cik7CisgICAgICBwX2N1ciA9IHBfbmV4dDsKKyAgICB9CisKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIHJldHVybiBlcnNkOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JhbmtfYm91bmQoKQoreworICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICBjb25zdCBzaXplX3QqIGNvbnN0IHBfdXBwZXIgPQorICAgIHN0ZDo6dXBwZXJfYm91bmQoZ19hX3JhbmtfYm91bmRzLAorCQkgICAgIGdfYV9yYW5rX2JvdW5kcyArIG51bV9kaXN0aW5jdF9yYW5rX2JvdW5kcywKKwkJICAgICBiYXNlX3R5cGU6Om1fc2l6ZSk7CisKKyAgaWYgKHBfdXBwZXIgPT0gZ19hX3JhbmtfYm91bmRzICsgbnVtX2Rpc3RpbmN0X3JhbmtfYm91bmRzKQorICAgIHJldHVybiBtYXhfcmFuazsKKworICByZXR1cm4gKHBfdXBwZXIgLSBnX2FfcmFua19ib3VuZHMpOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vZmluZF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2ZpbmRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY3ZjdmNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2ZpbmRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0aGluX2hlYXBfL2ZpbmRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGluX2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X3JlZmVyZW5jZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgordG9wKCkgY29uc3QKK3sKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKCgqdGhpcykpCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghYmFzZV90eXBlOjplbXB0eSgpKTsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX21heCAhPSAwKTsKKyAgcmV0dXJuIG1fcF9tYXgtPm1fdmFsdWU7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9pbnNlcnRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxMTllMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDI4MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0aGluX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHRoaW5faGVhcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3B1c2goY29uc3RfcmVmZXJlbmNlIHJfdmFsKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBiYXNlX3R5cGU6OmdldF9uZXdfbm9kZV9mb3JfaW5zZXJ0KHJfdmFsKTsKKyAgcF9uZC0+bV9tZXRhZGF0YSA9IDA7CisgIHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQtPm1fcF9sX2NoaWxkID0gMDsKKyAgaWYgKGJhc2VfdHlwZTo6bV9wX3Jvb3QgPT0gMCkKKyAgICB7CisgICAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nID0gMDsKKyAgICAgIG1fcF9tYXggPSBiYXNlX3R5cGU6Om1fcF9yb290ID0gcF9uZDsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgcmV0dXJuIHBvaW50X2l0ZXJhdG9yKHBfbmQpOworICAgIH0KKworICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nID0gYmFzZV90eXBlOjptX3Bfcm9vdDsKKyAgYmFzZV90eXBlOjptX3Bfcm9vdC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKyAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IHBfbmQ7CisgIHVwZGF0ZV9tYXgocF9uZCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICByZXR1cm4gcG9pbnRfaXRlcmF0b3IocF9uZCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbWFrZV9yb290KG5vZGVfcG9pbnRlciBwX25kKQoreworICBwX25kLT5tX21ldGFkYXRhID0gcF9uZC0+bV9wX2xfY2hpbGQgPT0gMCAKKyAgICAgICAgICAgICAgICAgICAgID8gMCA6IDEgKyBwX25kLT5tX3BfbF9jaGlsZC0+bV9tZXRhZGF0YTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CittYWtlX3Jvb3RfYW5kX2xpbmsobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIG1ha2Vfcm9vdChwX25kKTsKKyAgcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKyAgcF9uZC0+bV9wX25leHRfc2libGluZyA9IGJhc2VfdHlwZTo6bV9wX3Jvb3Q7CisgIGlmIChiYXNlX3R5cGU6Om1fcF9yb290ICE9IDApCisgICAgYmFzZV90eXBlOjptX3Bfcm9vdC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKworICBiYXNlX3R5cGU6Om1fcF9yb290ID0gcF9uZDsKKyAgdXBkYXRlX21heChwX25kKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitmaXgobm9kZV9wb2ludGVyIHBfeSkKK3sKKyAgd2hpbGUgKHRydWUpCisgICAgeworICAgICAgaWYgKHBfeS0+bV9wX3ByZXZfb3JfcGFyZW50ID09IDApCisgICAgICAgIHsKKwkgIGZpeF9yb290KHBfeSk7CisJICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHBfeS0+bV9tZXRhZGF0YSA9PSAxJiYgIHBfeS0+bV9wX25leHRfc2libGluZyA9PSAwKQorICAgICAgICB7CisJICBpZiAocF95LT5tX3BfbF9jaGlsZCAhPSAwKQorICAgICAgICAgICAgeworCSAgICAgIGZpeF9zaWJsaW5nX3JhbmtfMV91bm1hcmtlZChwX3kpOworCSAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworCSAgZml4X3NpYmxpbmdfcmFua18xX21hcmtlZChwX3kpOworCSAgcF95ID0gcF95LT5tX3BfcHJldl9vcl9wYXJlbnQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHBfeS0+bV9tZXRhZGF0YSA+IHBfeS0+bV9wX25leHRfc2libGluZy0+bV9tZXRhZGF0YSArIDEpCisgICAgICAgIHsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3ktPm1fcF9sX2NoaWxkICE9IDApOworCSAgaWYgKHBfeS0+bV9tZXRhZGF0YSAhPSBwX3ktPm1fcF9sX2NoaWxkLT5tX21ldGFkYXRhICsgMikKKyAgICAgICAgICAgIHsKKwkgICAgICBmaXhfc2libGluZ19nZW5lcmFsX3VubWFya2VkKHBfeSk7CisJICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisJICBmaXhfc2libGluZ19nZW5lcmFsX21hcmtlZChwX3kpOworCSAgcF95ID0gcF95LT5tX3BfcHJldl9vcl9wYXJlbnQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKChwX3ktPm1fcF9sX2NoaWxkID09IDAmJiAKKyAgICAgICAgICAgICAgICBwX3ktPm1fbWV0YWRhdGEgPT0gMikgfHwocF95LT5tX3BfbF9jaGlsZCAhPSAwJiYgCisJCQkJCSBwX3ktPm1fbWV0YWRhdGEgPT0gcF95LT5tX3BfbF9jaGlsZC0+bV9tZXRhZGF0YSArIDMpKQorICAgICAgICB7CisJICBub2RlX3BvaW50ZXIgcF96ID0gcF95LT5tX3BfcHJldl9vcl9wYXJlbnQ7CisJICBmaXhfY2hpbGQocF95KTsKKwkgIHBfeSA9IHBfejsKKyAgICAgICAgfQorICAgICAgZWxzZQorCXJldHVybjsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZml4X3Jvb3Qobm9kZV9wb2ludGVyIHBfeSkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfeS0+bV9wX3ByZXZfb3JfcGFyZW50ID09IDApOworICBtYWtlX3Jvb3QocF95KTsKKyAgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChwX3ksIHRydWUpCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZml4X3NpYmxpbmdfcmFua18xX3VubWFya2VkKG5vZGVfcG9pbnRlciBwX3kpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3ktPm1fcF9wcmV2X29yX3BhcmVudCAhPSAwKTsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKG5vZGVfcG9pbnRlciBwX3cgPSBwX3ktPm1fcF9sX2NoaWxkOykKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfdyAhPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfdy0+bV9wX25leHRfc2libGluZyA9PSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfeS0+bV9wX25leHRfc2libGluZyA9PSAwKTsKKworICBwX3ktPm1fcF9uZXh0X3NpYmxpbmcgPSBwX3ktPm1fcF9sX2NoaWxkOworICBwX3ktPm1fcF9uZXh0X3NpYmxpbmctPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfeTsKKyAgcF95LT5tX3BfbF9jaGlsZCA9IDA7CisgIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQocF95LCBmYWxzZSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitmaXhfc2libGluZ19yYW5rXzFfbWFya2VkKG5vZGVfcG9pbnRlciBwX3kpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3ktPm1fcF9wcmV2X29yX3BhcmVudCAhPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfeS0+bV9wX2xfY2hpbGQgPT0gMCk7CisgIHBfeS0+bV9tZXRhZGF0YSA9IDA7CisgIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQocF95LCBmYWxzZSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitmaXhfc2libGluZ19nZW5lcmFsX3VubWFya2VkKG5vZGVfcG9pbnRlciBwX3kpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3ktPm1fcF9wcmV2X29yX3BhcmVudCAhPSAwKTsKKworICBub2RlX3BvaW50ZXIgcF93ID0gcF95LT5tX3BfbF9jaGlsZDsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfdyAhPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfdy0+bV9wX25leHRfc2libGluZyAhPSAwKTsKKworICBwX3ktPm1fcF9sX2NoaWxkID0gcF93LT5tX3BfbmV4dF9zaWJsaW5nOworICBwX3ctPm1fcF9uZXh0X3NpYmxpbmctPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfeTsKKworICBwX3ctPm1fcF9uZXh0X3NpYmxpbmcgPSBwX3ktPm1fcF9uZXh0X3NpYmxpbmc7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3ctPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCk7CisgIHBfdy0+bV9wX25leHRfc2libGluZy0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF93OworCisgIHBfeS0+bV9wX25leHRfc2libGluZyA9IHBfdzsKKyAgcF93LT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX3k7CisKKyAgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVChwX3ksIGZhbHNlKQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpeF9zaWJsaW5nX2dlbmVyYWxfbWFya2VkKG5vZGVfcG9pbnRlciBwX3kpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3ktPm1fcF9wcmV2X29yX3BhcmVudCAhPSAwKTsKKyAgLS1wX3ktPm1fbWV0YWRhdGE7CisgIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQocF95LCBmYWxzZSkKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitmaXhfY2hpbGQobm9kZV9wb2ludGVyIHBfeSkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfeS0+bV9wX3ByZXZfb3JfcGFyZW50ICE9IDApOworCisgIGlmIChwX3ktPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCkKKyAgICBwX3ktPm1fcF9uZXh0X3NpYmxpbmctPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfeS0+bV9wX3ByZXZfb3JfcGFyZW50OworCisgIGlmIChwX3ktPm1fcF9wcmV2X29yX3BhcmVudC0+bV9wX2xfY2hpbGQgPT0gcF95KQorICAgIHBfeS0+bV9wX3ByZXZfb3JfcGFyZW50LT5tX3BfbF9jaGlsZCA9IHBfeS0+bV9wX25leHRfc2libGluZzsKKyAgZWxzZQorICAgIHBfeS0+bV9wX3ByZXZfb3JfcGFyZW50LT5tX3BfbmV4dF9zaWJsaW5nID0gcF95LT5tX3BfbmV4dF9zaWJsaW5nOworCisgIG1ha2Vfcm9vdF9hbmRfbGluayhwX3kpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbW9kaWZ5KHBvaW50X2l0ZXJhdG9yIGl0LCBjb25zdF9yZWZlcmVuY2Ugcl9uZXdfdmFsKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBpdC5tX3BfbmQ7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kICE9IDApOworCisgIGNvbnN0IGJvb2wgc21hbGxlciA9IENtcF9Gbjo6b3BlcmF0b3IoKShyX25ld192YWwsIHBfbmQtPm1fdmFsdWUpOworICBwX25kLT5tX3ZhbHVlID0gcl9uZXdfdmFsOworICBpZiAoc21hbGxlcikKKyAgICB7CisgICAgICByZW1vdmVfbm9kZShwX25kKTsKKyAgICAgIHBfbmQtPm1fcF9sX2NoaWxkID0gMDsKKyAgICAgIG1ha2Vfcm9vdF9hbmRfbGluayhwX25kKTsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAocF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50ID09IDApCisgICAgeworICAgICAgdXBkYXRlX21heChwX25kKTsKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICAgICAgcmV0dXJuOworICAgIH0KKworICBub2RlX3BvaW50ZXIgcF95ID0gcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50OworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF95ICE9IDApOworCisgIGlmIChwX25kLT5tX3BfbmV4dF9zaWJsaW5nICE9IDApCisgICAgcF9uZC0+bV9wX25leHRfc2libGluZy0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF95OworCisgIGlmIChwX3ktPm1fcF9sX2NoaWxkID09IHBfbmQpCisgICAgcF95LT5tX3BfbF9jaGlsZCA9IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmc7CisgIGVsc2UKKyAgICBwX3ktPm1fcF9uZXh0X3NpYmxpbmcgPSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nOworCisgIGZpeChwX3kpOworICBtYWtlX3Jvb3RfYW5kX2xpbmsocF9uZCk7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3VwZGF0ZV9tYXgobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIGlmIChtX3BfbWF4ID09IDAgfHwgQ21wX0ZuOjpvcGVyYXRvcigpKG1fcF9tYXgtPm1fdmFsdWUsIHBfbmQtPm1fdmFsdWUpKQorICAgIG1fcF9tYXggPSBwX25kOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmM0OTM2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEwOCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0aGluX2hlYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGluX2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3BsaXQoUHJlZCBwcmVkLCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisKKyAgb3RoZXIuY2xlYXIoKTsKKyAgaWYgKGJhc2VfdHlwZTo6ZW1wdHkoKSkKKyAgICB7CisgICAgICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgICAgIFBCX0RTX0FTU0VSVF9WQUxJRChvdGhlcikKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgYmFzZV90eXBlOjp0b19saW5rZWRfbGlzdCgpOworICBub2RlX3BvaW50ZXIgcF9vdXQgPSBiYXNlX3R5cGU6OnBydW5lKHByZWQpOworCisgIHdoaWxlIChwX291dCAhPSAwKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChiYXNlX3R5cGU6Om1fc2l6ZSA+IDApOworICAgICAgLS1iYXNlX3R5cGU6Om1fc2l6ZTsKKyAgICAgICsrb3RoZXIubV9zaXplOworICAgICAgbm9kZV9wb2ludGVyIHBfbmV4dCA9IHBfb3V0LT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgb3RoZXIubWFrZV9yb290X2FuZF9saW5rKHBfb3V0KTsKKyAgICAgIHBfb3V0ID0gcF9uZXh0OworICAgIH0KKworICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCisgIG5vZGVfcG9pbnRlciBwX2N1ciA9IGJhc2VfdHlwZTo6bV9wX3Jvb3Q7CisgIG1fcF9tYXggPSAwOworICBiYXNlX3R5cGU6Om1fcF9yb290ID0gMDsKKyAgd2hpbGUgKHBfY3VyICE9IDApCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfbmV4dCA9IHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgbWFrZV9yb290X2FuZF9saW5rKHBfY3VyKTsKKyAgICAgIHBfY3VyID0gcF9uZXh0OworICAgIH0KKworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2pvaW4oUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBQQl9EU19BU1NFUlRfVkFMSUQoKCp0aGlzKSkKKyAgUEJfRFNfQVNTRVJUX1ZBTElEKG90aGVyKQorCisgIG5vZGVfcG9pbnRlciBwX290aGVyID0gb3RoZXIubV9wX3Jvb3Q7CisgIHdoaWxlIChwX290aGVyICE9IDApCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfbmV4dCA9IHBfb3RoZXItPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBtYWtlX3Jvb3RfYW5kX2xpbmsocF9vdGhlcik7CisgICAgICBwX290aGVyID0gcF9uZXh0OworICAgIH0KKyAgYmFzZV90eXBlOjptX3NpemUgKz0gb3RoZXIubV9zaXplOworICBvdGhlci5tX3Bfcm9vdCA9IDA7CisgIG90aGVyLm1fc2l6ZSA9IDA7CisgIG90aGVyLm1fcF9tYXggPSAwOworCisgIFBCX0RTX0FTU0VSVF9WQUxJRCgoKnRoaXMpKQorICBQQl9EU19BU1NFUlRfVkFMSUQob3RoZXIpCit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy90aGluX2hlYXBfLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL3RoaW5faGVhcF8uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNGFlZDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy90aGluX2hlYXBfLmhwcApAQCAtMCwwICsxLDMyNCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0aGluX2hlYXBfL3RoaW5faGVhcF8uaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSB0aGluIGhlYXAuCisgKi8KKworI2lmbmRlZiBQQl9EU19USElOX0hFQVBfSFBQCisjZGVmaW5lIFBCX0RTX1RISU5fSEVBUF9IUFAKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NvbmRfZGVhbHRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlX3V0aWxzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfLmhwcD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIHR5cGVuYW1lIENtcF9GbiwgdHlwZW5hbWUgX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICB0aGluX2hlYXA8VmFsdWVfVHlwZSwgQ21wX0ZuLCBfQWxsb2M+CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworI2RlZmluZSBQQl9EU19CQVNFX1RfUCBcCisgICAgPFZhbHVlX1R5cGUsIENtcF9GbiwgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUsIF9BbGxvYywgdHJ1ZT4KKyNlbHNlCisjZGVmaW5lIFBCX0RTX0JBU0VfVF9QIFwKKyAgICA8VmFsdWVfVHlwZSwgQ21wX0ZuLCB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSwgX0FsbG9jPgorI2VuZGlmCisKKworICAgIC8qKgorICAgICAqICBUaGluIGhlYXAuCisgICAgICoKKyAgICAgKiAgQGluZ3JvdXAgaGVhcC1kZXRhaWwKKyAgICAgKgorICAgICAqICBTZWUgVGFyamFuIGFuZCBLYXBsYW4uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgdGhpbl9oZWFwCisgICAgOiBwdWJsaWMgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcCBQQl9EU19CQVNFX1RfUAorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxWYWx1ZV9UeXBlPjo6b3RoZXIgX19yZWJpbmRfYTsKKyAgICAgIHR5cGVkZWYgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcCBQQl9EU19CQVNFX1RfUCBiYXNlX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bm9kZSAJCQlub2RlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om5vZGVfcG9pbnRlciAJCW5vZGVfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlX2NvbnN0X3BvaW50ZXIgCW5vZGVfY29uc3RfcG9pbnRlcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgVmFsdWVfVHlwZSAJCQkJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgQ21wX0ZuIAkJCQkJY21wX2ZuOworICAgICAgdHlwZWRlZiBfQWxsb2MgCQkJCQlhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgCQlzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6ZGlmZmVyZW5jZV90eXBlIAkJZGlmZmVyZW5jZV90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2E6OnBvaW50ZXIJCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2E6OmNvbnN0X3BvaW50ZXIJY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfYTo6cmVmZXJlbmNlCQlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2E6OmNvbnN0X3JlZmVyZW5jZSAgICAgCWNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnBvaW50X2l0ZXJhdG9yIAlwb2ludF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpwb2ludF9jb25zdF9pdGVyYXRvciAJcG9pbnRfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6aXRlcmF0b3IgCQlpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9pdGVyYXRvciAJY29uc3RfaXRlcmF0b3I7CisKKworICAgICAgaW5saW5lIHBvaW50X2l0ZXJhdG9yCisgICAgICBwdXNoKGNvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIHZvaWQKKyAgICAgIG1vZGlmeShwb2ludF9pdGVyYXRvciwgY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIGNvbnN0X3JlZmVyZW5jZQorICAgICAgdG9wKCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIHBvcCgpOworCisgICAgICB2b2lkCisgICAgICBlcmFzZShwb2ludF9pdGVyYXRvcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBjbGVhcigpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZV9pZihQcmVkKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KKyAgICAgIHZvaWQKKyAgICAgIHNwbGl0KFByZWQsIFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIGpvaW4oUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHRoaW5faGVhcCgpOworCisgICAgICB0aGluX2hlYXAoY29uc3QgQ21wX0ZuJik7CisKKyAgICAgIHRoaW5faGVhcChjb25zdCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIH50aGluX2hlYXAoKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgICB2b2lkCisgICAgICBjb3B5X2Zyb21fcmFuZ2UoSXQsIEl0KTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfdmFsaWQoY29uc3QgY2hhciosIGludCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9tYXgoY29uc3QgY2hhciosIGludCkgY29uc3Q7CisjZW5kaWYKKworI2lmZGVmIFBCX0RTX1RISU5fSEVBUF9UUkFDRV8KKyAgICAgIHZvaWQKKyAgICAgIHRyYWNlKCkgY29uc3Q7CisjZW5kaWYKKworICAgIHByaXZhdGU6CisgICAgICBlbnVtCisJeworCSAgbWF4X3JhbmsgPSAoc2l6ZW9mKHNpemVfdHlwZSkgPDwgNCkgKyAyCisJfTsKKworICAgICAgdm9pZAorICAgICAgaW5pdGlhbGl6ZSgpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgdXBkYXRlX21heChub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgZml4KG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBmaXhfcm9vdChub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgZml4X3NpYmxpbmdfcmFua18xX3VubWFya2VkKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBmaXhfc2libGluZ19yYW5rXzFfbWFya2VkKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBmaXhfc2libGluZ19nZW5lcmFsX3VubWFya2VkKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBmaXhfc2libGluZ19nZW5lcmFsX21hcmtlZChub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgZml4X2NoaWxkKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSBzdGF0aWMgdm9pZAorICAgICAgbWFrZV9yb290KG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBtYWtlX3Jvb3RfYW5kX2xpbmsobm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHJlbW92ZV9tYXhfbm9kZSgpOworCisgICAgICB2b2lkCisgICAgICB0b19hdXhfZXhjZXB0X21heCgpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgYWRkX3RvX2F1eChub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgbWFrZV9mcm9tX2F1eCgpOworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICByYW5rX2JvdW5kKCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBtYWtlX2NoaWxkX29mKG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHJlbW92ZV9ub2RlKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSBub2RlX3BvaW50ZXIKKyAgICAgIGpvaW4obm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIpIGNvbnN0OworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnQobm9kZV9jb25zdF9wb2ludGVyLCBib29sLCBjb25zdCBjaGFyKiwgaW50KSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X2F1eF9udWxsKGNvbnN0IGNoYXIqLCBpbnQpIGNvbnN0OworI2VuZGlmCisKKyAgICAgIG5vZGVfcG9pbnRlciAJbV9wX21heDsKKyAgICAgIG5vZGVfcG9pbnRlciAJbV9hX2F1eFttYXhfcmFua107CisgICAgfTsKKworICAgIGVudW0KKyAgICAgIHsKKwludW1fZGlzdGluY3RfcmFua19ib3VuZHMgPSA0OAorICAgICAgfTsKKworICAgIC8vIFRha2VuIGZyb20gdGhlIFNHSSBpbXBsZW1lbnRhdGlvbjsgYWNrbm93bGVkZ2VkIGluIHRoZSBkb2NzLgorICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNpemVfdCBnX2FfcmFua19ib3VuZHNbbnVtX2Rpc3RpbmN0X3JhbmtfYm91bmRzXSA9CisgICAgICB7CisJLyogRGVhbGluZyBjYXJkcy4uLiAqLworCS8qIDAgICAgICovIDB1bCwKKwkvKiAxICAgICAqLyAxdWwsCisJLyogMiAgICAgKi8gMXVsLAorCS8qIDMgICAgICovIDJ1bCwKKwkvKiA0ICAgICAqLyA0dWwsCisJLyogNSAgICAgKi8gNnVsLAorCS8qIDYgICAgICovIDExdWwsCisJLyogNyAgICAgKi8gMTd1bCwKKwkvKiA4ICAgICAqLyAyOXVsLAorCS8qIDkgICAgICovIDQ2dWwsCisJLyogMTAgICAgKi8gNzZ1bCwKKwkvKiAxMSAgICAqLyAxMjJ1bCwKKwkvKiAxMiAgICAqLyAxOTl1bCwKKwkvKiAxMyAgICAqLyAzMjF1bCwKKwkvKiAxNCAgICAqLyA1MjF1bCwKKwkvKiAxNSAgICAqLyA4NDJ1bCwKKwkvKiAxNiAgICAqLyAxMzY0dWwsCisJLyogMTcgICAgKi8gMjIwNnVsLAorCS8qIDE4ICAgICovIDM1NzF1bCwKKwkvKiAxOSAgICAqLyA1Nzc3dWwsCisJLyogMjAgICAgKi8gOTM0OXVsLAorCS8qIDIxICAgICovIDE1MTI2dWwsCisJLyogMjIgICAgKi8gMjQ0NzZ1bCwKKwkvKiAyMyAgICAqLyAzOTYwMnVsLAorCS8qIDI0ICAgICovIDY0MDc5dWwsCisJLyogMjUgICAgKi8gMTAzNjgxdWwsCisJLyogMjYgICAgKi8gMTY3NzYxdWwsCisJLyogMjcgICAgKi8gMjcxNDQydWwsCisJLyogMjggICAgKi8gNDM5MjA0dWwsCisJLyogMjkgICAgKi8gNzEwNjQ2dWwsCisJLyogMzAgICAgKi8gMTE0OTg1MXVsLAorCS8qIDMxICAgICovIDE4NjA0OTd1bCwKKwkvKiAzMiAgICAqLyAzMDEwMzQ5dWwsCisJLyogMzMgICAgKi8gNDg3MDg0NnVsLAorCS8qIDM0ICAgICovIDc4ODExOTZ1bCwKKwkvKiAzNSAgICAqLyAxMjc1MjA0MnVsLAorCS8qIDM2ICAgICovIDIwNjMzMjM5dWwsCisJLyogMzcgICAgKi8gMzMzODUyODJ1bCwKKwkvKiAzOCAgICAqLyA1NDAxODUyMXVsLAorCS8qIDM5ICAgICovIDg3NDAzODAzdWwsCisJLyogNDAgICAgKi8gMTQxNDIyMzI0dWwsCisJLyogNDEgICAgKi8gMjI4ODI2MTI3dWwsCisJLyogNDIgICAgKi8gMzcwMjQ4NDUxdWwsCisJLyogNDMgICAgKi8gNTk5MDc0NTc4dWwsCisJLyogNDQgICAgKi8gOTY5MzIzMDI5dWwsCisJLyogNDUgICAgKi8gMTU2ODM5NzYwN3VsLAorCS8qIDQ2ICAgICovIDI1Mzc3MjA2MzZ1bCwKKwkvKiA0NyAgICAqLyA0MTA2MTE4MjQzdWwKKwkvKiBQb3QncyBnb29kLCBsZXQncyBwbGF5ICovCisgICAgICB9OworCisjZGVmaW5lIFBCX0RTX0FTU0VSVF9OT0RFX0NPTlNJU1RFTlQoX05vZGUsIF9Cb29sKQkJCVwKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfbm9kZV9jb25zaXN0ZW50KF9Ob2RlLCBfQm9vbCwJCVwKKwkJCQkJICAgICBfX0ZJTEVfXywgX19MSU5FX18pOykKKworI2RlZmluZSBQQl9EU19BU1NFUlRfQVVYX05VTEwoWCkJCQkJCVwKKyAgX0dMSUJDWFhfREVCVUdfT05MWShYLmFzc2VydF9hdXhfbnVsbChfX0ZJTEVfXywgX19MSU5FX18pOykKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vZGVidWdfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL3RyYWNlX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9maW5kX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9pbnNlcnRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwPgorCisjdW5kZWYgUEJfRFNfQVNTRVJUX0FVWF9OVUxMCisjdW5kZWYgUEJfRFNfQVNTRVJUX05PREVfQ09OU0lTVEVOVAorI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19CQVNFX1RfUAorCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL3RyYWNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vdHJhY2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwMmQ2OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL3RyYWNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdGhpbl9oZWFwXy90cmFjZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfLgorICovCisKKyNpZmRlZiBQQl9EU19USElOX0hFQVBfVFJBQ0VfCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0cmFjZSgpIGNvbnN0Cit7CisgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y2VyciA8PCAibV9wX21heCAiIDw8IG1fcF9tYXggPDwgc3RkOjplbmRsOworICBiYXNlX3R5cGU6OnRyYWNlKCk7Cit9CisKKyNlbmRpZiAvLyAjaWZkZWYgUEJfRFNfVEhJTl9IRUFQX1RSQUNFXwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyZWVfcG9saWN5L25vZGVfbWV0YWRhdGFfc2VsZWN0b3IuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyZWVfcG9saWN5L25vZGVfbWV0YWRhdGFfc2VsZWN0b3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NWQyY2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJlZV9wb2xpY3kvbm9kZV9tZXRhZGF0YV9zZWxlY3Rvci5ocHAKQEAgLTAsMCArMSwxMDMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdHJlZV9wb2xpY3kvbm9kZV9tZXRhZGF0YV9zZWxlY3Rvci5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB0cmVlcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX1RSRUVfTk9ERV9NRVRBREFUQV9ESVNQQVRDSF9IUFAKKyNkZWZpbmUgUEJfRFNfVFJFRV9OT0RFX01FVEFEQVRBX0RJU1BBVENIX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9icmFuY2hfcG9saWN5L251bGxfbm9kZV9tZXRhZGF0YS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlc190cmFpdHMuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvKioKKyAgICAgKiAgQGFkZHRvZ3JvdXAgdHJhaXRzIFRyYWl0cworICAgICAqICBAeworICAgICAqLworCisgICAgLy8vIFRyZWUgbWV0YWRhdGEgaGVscGVyLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfVXBkYXRlLCBib29sIF9CVHA+CisgICAgICBzdHJ1Y3QgdHJlZV9tZXRhZGF0YV9oZWxwZXI7CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24sIGZhbHNlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfVXBkYXRlPgorICAgICAgc3RydWN0IHRyZWVfbWV0YWRhdGFfaGVscGVyPE5vZGVfVXBkYXRlLCBmYWxzZT4KKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIE5vZGVfVXBkYXRlOjptZXRhZGF0YV90eXBlIAl0eXBlOworICAgICAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiwgdHJ1ZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX1VwZGF0ZT4KKyAgICAgIHN0cnVjdCB0cmVlX21ldGFkYXRhX2hlbHBlcjxOb2RlX1VwZGF0ZSwgdHJ1ZT4KKyAgICAgIHsKKwl0eXBlZGVmIG51bGxfdHlwZSAJCQkJdHlwZTsKKyAgICAgIH07CisKKyAgICAvLy8gVHJlZSBub2RlIG1ldGFkYXRhIGRpc3BhdGNoLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICAgIHR5cGVuYW1lIERhdGEsCisJICAgICB0eXBlbmFtZSBDbXBfRm4sCisJICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX0NJdHIsCisJCSAgICAgIHR5cGVuYW1lIENvbnN0X0l0ZXJhdG9yLAorCQkgICAgICB0eXBlbmFtZSBDbXBfRm5fLAorCQkgICAgICB0eXBlbmFtZSBfQWxsb2NfPgorCSAgICAgY2xhc3MgTm9kZV9VcGRhdGUsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHRyZWVfbm9kZV9tZXRhZGF0YV9kaXNwYXRjaAorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBkdW1ub2RlX2NvbnN0X2l0ZXJhdG9yPEtleSwgRGF0YSwgX0FsbG9jPgkJX19pdF90eXBlOworICAgICAgdHlwZWRlZiBOb2RlX1VwZGF0ZTxfX2l0X3R5cGUsIF9faXRfdHlwZSwgQ21wX0ZuLCBfQWxsb2M+CV9fbm9kZV91OworICAgICAgdHlwZWRlZiBudWxsX25vZGVfdXBkYXRlPF9faXRfdHlwZSwgX19pdF90eXBlLCBDbXBfRm4sIF9BbGxvYz4gX19ubm9kZV91OworCisgICAgICBlbnVtCisJeworCSAgbnVsbF91cGRhdGUgPSBpc19zYW1lPF9fbm9kZV91LCBfX25ub2RlX3U+Ojp2YWx1ZQorCX07CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyZWVfbWV0YWRhdGFfaGVscGVyPF9fbm9kZV91LCBudWxsX3VwZGF0ZT46OnR5cGUgdHlwZTsKKyAgICB9OworICAgIC8vQH0KKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX1RSRUVfTk9ERV9NRVRBREFUQV9ESVNQQVRDSF9IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmVlX3BvbGljeS9vcmRlcl9zdGF0aXN0aWNzX2ltcC5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJlZV9wb2xpY3kvb3JkZXJfc3RhdGlzdGljc19pbXAuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmODBlZmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJlZV9wb2xpY3kvb3JkZXJfc3RhdGlzdGljc19pbXAuaHBwCkBAIC0wLDAgKzEsMTIxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHRyZWVfcG9saWN5L29yZGVyX3N0YXRpc3RpY3NfaW1wLmhwcAorICogQ29udGFpbnMgZm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIG9yZGVyX3N0YXRpc3RpY3Nfa2V5CisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmRfYnlfb3JkZXIoc2l6ZV90eXBlIG9yZGVyKQoreworICBub2RlX2l0ZXJhdG9yIGl0ID0gbm9kZV9iZWdpbigpOworICBub2RlX2l0ZXJhdG9yIGVuZF9pdCA9IG5vZGVfZW5kKCk7CisKKyAgd2hpbGUgKGl0ICE9IGVuZF9pdCkKKyAgICB7CisgICAgICBub2RlX2l0ZXJhdG9yIGxfaXQgPSBpdC5nZXRfbF9jaGlsZCgpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIG8gPSAobF9pdCA9PSBlbmRfaXQpPyAwIDogbF9pdC5nZXRfbWV0YWRhdGEoKTsKKworICAgICAgaWYgKG9yZGVyID09IG8pCisJcmV0dXJuICppdDsKKyAgICAgIGVsc2UgaWYgKG9yZGVyIDwgbykKKwlpdCA9IGxfaXQ7CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIG9yZGVyIC09IG8gKyAxOworCSAgaXQgPSBpdC5nZXRfcl9jaGlsZCgpOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBiYXNlX3R5cGU6OmVuZF9pdGVyYXRvcigpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZF9ieV9vcmRlcihzaXplX3R5cGUgb3JkZXIpIGNvbnN0Cit7IHJldHVybiBjb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDKj4odGhpcyktPmZpbmRfYnlfb3JkZXIob3JkZXIpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorb3JkZXJfb2Zfa2V5KGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0Cit7CisgIG5vZGVfY29uc3RfaXRlcmF0b3IgaXQgPSBub2RlX2JlZ2luKCk7CisgIG5vZGVfY29uc3RfaXRlcmF0b3IgZW5kX2l0ID0gbm9kZV9lbmQoKTsKKworICBjb25zdCBjbXBfZm4mIHJfY21wX2ZuID0gY29uc3RfY2FzdDxQQl9EU19DTEFTU19DX0RFQyo+KHRoaXMpLT5nZXRfY21wX2ZuKCk7CisgIHNpemVfdHlwZSBvcmQgPSAwOworICB3aGlsZSAoaXQgIT0gZW5kX2l0KQorICAgIHsKKyAgICAgIG5vZGVfY29uc3RfaXRlcmF0b3IgbF9pdCA9IGl0LmdldF9sX2NoaWxkKCk7CisKKyAgICAgIGlmIChyX2NtcF9mbihyX2tleSwgdGhpcy0+ZXh0cmFjdF9rZXkoKigqaXQpKSkpCisJaXQgPSBsX2l0OworICAgICAgZWxzZSBpZiAocl9jbXBfZm4odGhpcy0+ZXh0cmFjdF9rZXkoKigqaXQpKSwgcl9rZXkpKQorICAgICAgICB7CisJICBvcmQgKz0gKGxfaXQgPT0gZW5kX2l0KT8gMSA6IDEgKyBsX2l0LmdldF9tZXRhZGF0YSgpOworCSAgaXQgPSBpdC5nZXRfcl9jaGlsZCgpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIG9yZCArPSAobF9pdCA9PSBlbmRfaXQpPyAwIDogbF9pdC5nZXRfbWV0YWRhdGEoKTsKKwkgIGl0ID0gZW5kX2l0OworICAgICAgICB9CisgICAgfQorICByZXR1cm4gb3JkOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK29wZXJhdG9yKCkobm9kZV9pdGVyYXRvciBub2RlX2l0LCBub2RlX2NvbnN0X2l0ZXJhdG9yIGVuZF9uZF9pdCkgY29uc3QKK3sKKyAgbm9kZV9pdGVyYXRvciBsX2l0ID0gbm9kZV9pdC5nZXRfbF9jaGlsZCgpOworICBjb25zdCBzaXplX3R5cGUgbF9yYW5rID0gKGxfaXQgPT0gZW5kX25kX2l0KSA/IDAgOiBsX2l0LmdldF9tZXRhZGF0YSgpOworCisgIG5vZGVfaXRlcmF0b3Igcl9pdCA9IG5vZGVfaXQuZ2V0X3JfY2hpbGQoKTsKKyAgY29uc3Qgc2l6ZV90eXBlIHJfcmFuayA9IChyX2l0ID09IGVuZF9uZF9pdCkgPyAwIDogcl9pdC5nZXRfbWV0YWRhdGEoKTsKKworICBjb25zdF9jYXN0PG1ldGFkYXRhX3JlZmVyZW5jZT4obm9kZV9pdC5nZXRfbWV0YWRhdGEoKSk9IDEgKyBsX3JhbmsgKyByX3Jhbms7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+dHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlKCkKK3sgfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyZWVfcG9saWN5L3NhbXBsZV90cmVlX25vZGVfdXBkYXRlLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmVlX3BvbGljeS9zYW1wbGVfdHJlZV9ub2RlX3VwZGF0ZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IxNmFhNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmVlX3BvbGljeS9zYW1wbGVfdHJlZV9ub2RlX3VwZGF0ZS5ocHAKQEAgLTAsMCArMSw2MiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0cmVlX3BvbGljeS9zYW1wbGVfdHJlZV9ub2RlX3VwZGF0ZS5ocHAKKyAqIENvbnRhaW5zIGEgc2FtbGUgbm9kZSB1cGRhdGUgZnVuY3Rvci4KKyAqLworCisjaWZuZGVmIFBCX0RTX1NBTVBMRV9UUkVFX05PREVfVVBEQVRPUl9IUFAKKyNkZWZpbmUgUEJfRFNfU0FNUExFX1RSRUVfTk9ERV9VUERBVE9SX0hQUAorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICAvLy8gQSBzYW1wbGUgbm9kZSB1cGRhdG9yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb25zdF9Ob2RlX0l0ZXIsIHR5cGVuYW1lIE5vZGVfSXRlciwgdHlwZW5hbWUgQ21wX0ZuLAorCSAgIHR5cGVuYW1lIF9BbGxvYz4KKyAgY2xhc3Mgc2FtcGxlX3RyZWVfbm9kZV91cGRhdGUKKyAgeworICAgIHR5cGVkZWYgc3RkOjpzaXplX3QgbWV0YWRhdGFfdHlwZTsKKworICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIHNhbXBsZV90cmVlX25vZGVfdXBkYXRlKCk7CisKKyAgICAvLy8gVXBkYXRlcyB0aGUgcmFuayBvZiBhIG5vZGUgdGhyb3VnaCBhIG5vZGVfaXRlcmF0b3Igbm9kZV9pdDsKKyAgICAvLy8gZW5kX25kX2l0IGlzIHRoZSBlbmQgbm9kZSBpdGVyYXRvci4KKyAgICBpbmxpbmUgdm9pZAorICAgIG9wZXJhdG9yKCkobm9kZV9pdGVyYXRvciBub2RlX2l0LCBub2RlX2NvbnN0X2l0ZXJhdG9yIGVuZF9uZF9pdCkgY29uc3Q7CisgIH07Cit9CisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19TQU1QTEVfVFJFRV9OT0RFX1VQREFUT1JfSFBQCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJlZV90cmFjZV9iYXNlLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmVlX3RyYWNlX2Jhc2UuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZDMwNGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJlZV90cmFjZV9iYXNlLmhwcApAQCAtMCwwICsxLDE3OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBkZXRhaWwvdHJlZV90cmFjZV9iYXNlLmhwcAorICogQ29udGFpbnMgdHJlZS1yZWxhdGVkIHBvbGljaWVzLgorICovCisKKyNpZm5kZWYgUEJfRFNfVFJFRV9UUkFDRV9CQVNFX0hQUAorI2RlZmluZSBQQl9EU19UUkVFX1RSQUNFX0JBU0VfSFBQCisKKyNpZmRlZiBQQl9EU19UUkVFX1RSQUNFCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JyYW5jaF9wb2xpY3kvYnJhbmNoX3BvbGljeS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9icmFuY2hfcG9saWN5L251bGxfbm9kZV9tZXRhZGF0YS5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworI2lmZGVmIFBCX0RTX1RSRUVfVFJBQ0UKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQwkJCQkJCVwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX0NJdHIsIHR5cGVuYW1lIE5vZGVfSXRyLAlcCisJICAgICB0eXBlbmFtZSBDbXBfRm4sIGJvb2wgTm9kZV9CYXNlZCwgdHlwZW5hbWUgX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDCQkJCQkJXAorICAgIHRyZWVfdHJhY2VfYmFzZTxOb2RlX0NJdHIsIE5vZGVfSXRyLCBDbXBfRm4sICAgICAgICAgXAorCQkgICAgTm9kZV9CYXNlZCwgX0FsbG9jPgorCisjZGVmaW5lIFBCX0RTX1RSQUNFX0JBU0UgXAorICAgIGJyYW5jaF9wb2xpY3k8Tm9kZV9DSXRyLCBOb2RlX0l0ciwgX0FsbG9jPgorCisgICAgLy8vIFRyYWNpbmcgYmFzZSBjbGFzcy4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX0NJdHIsIHR5cGVuYW1lIE5vZGVfSXRyLAorCSAgICAgdHlwZW5hbWUgQ21wX0ZuLCBib29sIE5vZGVfQmFzZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyB0cmVlX3RyYWNlX2Jhc2UgOiBwcml2YXRlIFBCX0RTX1RSQUNFX0JBU0UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdm9pZAorICAgICAgdHJhY2UoKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIFBCX0RTX1RSQUNFX0JBU0UgCQkJYmFzZV90eXBlOworICAgICAgdHlwZWRlZiBOb2RlX0NJdHIgCQlub2RlX2NvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAJc2l6ZV90eXBlOworCisgICAgICB2b2lkCisgICAgICB0cmFjZV9ub2RlKG5vZGVfY29uc3RfaXRlcmF0b3IsIHNpemVfdHlwZSkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdCA9IDA7CisKKyAgICAgIHZpcnR1YWwgbm9kZV9jb25zdF9pdGVyYXRvcgorICAgICAgbm9kZV9iZWdpbigpIGNvbnN0ID0gMDsKKworICAgICAgdmlydHVhbCBub2RlX2NvbnN0X2l0ZXJhdG9yCisgICAgICBub2RlX2VuZCgpIGNvbnN0ID0gMDsKKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIHByaW50X25vZGVfcG9pbnRlcihOb2RlX0NJdHIsIGludGVncmFsX2NvbnN0YW50PGludCx0cnVlPik7CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBwcmludF9ub2RlX3BvaW50ZXIoTm9kZV9DSXRyLCBpbnRlZ3JhbF9jb25zdGFudDxpbnQsZmFsc2U+KTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWV0YWRhdGFfPgorICAgICAgc3RhdGljIHZvaWQKKyAgICAgIHRyYWNlX2l0X21ldGFkYXRhKE5vZGVfQ0l0ciwgdHlwZV90b190eXBlPE1ldGFkYXRhXz4pOworCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgdHJhY2VfaXRfbWV0YWRhdGEoTm9kZV9DSXRyLCB0eXBlX3RvX3R5cGU8bnVsbF90eXBlPik7CisgICAgfTsKKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICB0cmFjZSgpIGNvbnN0CisgICAgeworICAgICAgaWYgKGVtcHR5KCkpCisJcmV0dXJuOworICAgICAgdHJhY2Vfbm9kZShub2RlX2JlZ2luKCksIDApOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICB0cmFjZV9ub2RlKG5vZGVfY29uc3RfaXRlcmF0b3IgbmRfaXQsIHNpemVfdHlwZSBsZXZlbCkgY29uc3QKKyAgICB7CisgICAgICBpZiAobmRfaXQuZ2V0X3JfY2hpbGQoKSAhPSBub2RlX2VuZCgpKQorCXRyYWNlX25vZGUobmRfaXQuZ2V0X3JfY2hpbGQoKSwgbGV2ZWwgKyAxKTsKKworICAgICAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBsZXZlbDsgKytpKQorCXN0ZDo6Y2VyciA8PCAnICc7CisKKyAgICAgIHByaW50X25vZGVfcG9pbnRlcihuZF9pdCwgaW50ZWdyYWxfY29uc3RhbnQ8aW50LE5vZGVfQmFzZWQ+KCkpOworICAgICAgc3RkOjpjZXJyIDw8IGJhc2VfdHlwZTo6ZXh0cmFjdF9rZXkoKigqbmRfaXQpKTsKKworICAgICAgdHlwZWRlZiB0eXBlX3RvX3R5cGU8dHlwZW5hbWUgbm9kZV9jb25zdF9pdGVyYXRvcjo6bWV0YWRhdGFfdHlwZT4KKwltX3R5cGVfaW5kX3Q7CisKKyAgICAgIHRyYWNlX2l0X21ldGFkYXRhKG5kX2l0LCBtX3R5cGVfaW5kX3QoKSk7CisKKyAgICAgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIGlmIChuZF9pdC5nZXRfbF9jaGlsZCgpICE9IG5vZGVfZW5kKCkpCisJdHJhY2Vfbm9kZShuZF9pdC5nZXRfbF9jaGlsZCgpLCBsZXZlbCArIDEpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWV0YWRhdGFfPgorICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgdHJhY2VfaXRfbWV0YWRhdGEoTm9kZV9DSXRyIG5kX2l0LCB0eXBlX3RvX3R5cGU8TWV0YWRhdGFfPikKKyAgICB7CisgICAgICBjb25zdCB1bnNpZ25lZCBsb25nIHVsID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obmRfaXQuZ2V0X21ldGFkYXRhKCkpOworICAgICAgc3RkOjpjZXJyIDw8ICIgKCIgPDwgdWwgPDwgIikgIjsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgdHJhY2VfaXRfbWV0YWRhdGEoTm9kZV9DSXRyLCB0eXBlX3RvX3R5cGU8bnVsbF90eXBlPikKKyAgICB7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBwcmludF9ub2RlX3BvaW50ZXIoTm9kZV9DSXRyIG5kX2l0LCBpbnRlZ3JhbF9jb25zdGFudDxpbnQsdHJ1ZT4pCisgICAgeyBzdGQ6OmNlcnIgPDwgbmRfaXQubV9wX25kIDw8ICIgIjsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHByaW50X25vZGVfcG9pbnRlcihOb2RlX0NJdHIgbmRfaXQsIGludGVncmFsX2NvbnN0YW50PGludCxmYWxzZT4pCisgICAgeyBzdGQ6OmNlcnIgPDwgKm5kX2l0IDw8ICIgIjsgfQorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworI3VuZGVmIFBCX0RTX1RSQUNFX0JBU0UKKyNlbmRpZiAvLyAjaWZkZWYgICAgUEJfRFNfVFJFRV9UUkFDRQorCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmZGVmIFBCX0RTX1RSRUVfVFJBQ0UKKworI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfVFJFRV9UUkFDRV9CQVNFX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L25vZGVfbWV0YWRhdGFfc2VsZWN0b3IuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L25vZGVfbWV0YWRhdGFfc2VsZWN0b3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZGZkZTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvbm9kZV9tZXRhZGF0YV9zZWxlY3Rvci5ocHAKQEAgLTAsMCArMSwxMDMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdHJpZV9wb2xpY3kvbm9kZV9tZXRhZGF0YV9zZWxlY3Rvci5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB0cmllcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX1RSSUVfTk9ERV9NRVRBREFUQV9ESVNQQVRDSF9IUFAKKyNkZWZpbmUgUEJfRFNfVFJJRV9OT0RFX01FVEFEQVRBX0RJU1BBVENIX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9icmFuY2hfcG9saWN5L251bGxfbm9kZV9tZXRhZGF0YS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlc190cmFpdHMuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvKioKKyAgICAgKiAgQGFkZHRvZ3JvdXAgdHJhaXRzIFRyYWl0cworICAgICAqICBAeworICAgICAqLworCisgICAgLy8vIFRyaWUgbWV0YWRhdGEgaGVscGVyLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfVXBkYXRlLCBib29sIF9CVHA+CisgICAgICBzdHJ1Y3QgdHJpZV9tZXRhZGF0YV9oZWxwZXI7CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24sIGZhbHNlLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfVXBkYXRlPgorICAgICAgc3RydWN0IHRyaWVfbWV0YWRhdGFfaGVscGVyPE5vZGVfVXBkYXRlLCBmYWxzZT4KKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIE5vZGVfVXBkYXRlOjptZXRhZGF0YV90eXBlIAl0eXBlOworICAgICAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiwgdHJ1ZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX1VwZGF0ZT4KKyAgICAgIHN0cnVjdCB0cmllX21ldGFkYXRhX2hlbHBlcjxOb2RlX1VwZGF0ZSwgdHJ1ZT4KKyAgICAgIHsKKwl0eXBlZGVmIG51bGxfdHlwZSAJCQkJdHlwZTsKKyAgICAgIH07CisKKyAgICAvLy8gVHJpZSBub2RlIG1ldGFkYXRhIGRpc3BhdGNoLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICAgIHR5cGVuYW1lIERhdGEsCisJICAgICB0eXBlbmFtZSBDbXBfRm4sCisJICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX0NJdHIsCisJCSAgICAgIHR5cGVuYW1lIENvbnN0X0l0ZXJhdG9yLAorCQkgICAgICB0eXBlbmFtZSBDbXBfRm5fLAorCQkgICAgICB0eXBlbmFtZSBfQWxsb2NfPgorCSAgICAgY2xhc3MgTm9kZV9VcGRhdGUsCisJICAgICB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHRyaWVfbm9kZV9tZXRhZGF0YV9kaXNwYXRjaAorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBkdW1ub2RlX2NvbnN0X2l0ZXJhdG9yPEtleSwgRGF0YSwgX0FsbG9jPgkJX19pdF90eXBlOworICAgICAgdHlwZWRlZiBOb2RlX1VwZGF0ZTxfX2l0X3R5cGUsIF9faXRfdHlwZSwgQ21wX0ZuLCBfQWxsb2M+CV9fbm9kZV91OworICAgICAgdHlwZWRlZiBudWxsX25vZGVfdXBkYXRlPF9faXRfdHlwZSwgX19pdF90eXBlLCBDbXBfRm4sIF9BbGxvYz4gX19ubm9kZV91OworCisgICAgICBlbnVtCisJeworCSAgbnVsbF91cGRhdGUgPSBpc19zYW1lPF9fbm9kZV91LCBfX25ub2RlX3U+Ojp2YWx1ZQorCX07CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyaWVfbWV0YWRhdGFfaGVscGVyPF9fbm9kZV91LCBudWxsX3VwZGF0ZT46OnR5cGUgdHlwZTsKKyAgICB9OworICAgIC8vQH0KKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX1RSSUVfTk9ERV9NRVRBREFUQV9ESVNQQVRDSF9IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9vcmRlcl9zdGF0aXN0aWNzX2ltcC5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvb3JkZXJfc3RhdGlzdGljc19pbXAuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYjZhY2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvb3JkZXJfc3RhdGlzdGljc19pbXAuaHBwCkBAIC0wLDAgKzEsMTYwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHRyaWVfcG9saWN5L29yZGVyX3N0YXRpc3RpY3NfaW1wLmhwcAorICogQ29udGFpbnMgZm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIG9yZGVyX3N0YXRpc3RpY3Nfa2V5CisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmRfYnlfb3JkZXIoc2l6ZV90eXBlIG9yZGVyKQoreworICBpZiAoZW1wdHkoKSkKKyAgICByZXR1cm4gZW5kKCk7CisKKyAgKytvcmRlcjsKKyAgbm9kZV9pdGVyYXRvciBuZF9pdCA9IG5vZGVfYmVnaW4oKTsKKworICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICBpZiAob3JkZXIgPiBuZF9pdC5nZXRfbWV0YWRhdGEoKSkKKwlyZXR1cm4gKytiYXNlX3R5cGU6OnJpZ2h0bW9zdF9pdChuZF9pdCk7CisKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBudW1fY2hpbGRyZW4gPSBuZF9pdC5udW1fY2hpbGRyZW4oKTsKKyAgICAgIGlmIChudW1fY2hpbGRyZW4gPT0gMCkKKwlyZXR1cm4gKm5kX2l0OworCisgICAgICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG51bV9jaGlsZHJlbjsgKytpKQorCXsKKwkgIG5vZGVfaXRlcmF0b3IgY2hpbGRfbmRfaXQgPSBuZF9pdC5nZXRfY2hpbGQoaSk7CisJICBpZiAob3JkZXIgPD0gY2hpbGRfbmRfaXQuZ2V0X21ldGFkYXRhKCkpCisJICAgIHsKKwkgICAgICBpID0gbnVtX2NoaWxkcmVuOworCSAgICAgIG5kX2l0ID0gY2hpbGRfbmRfaXQ7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgb3JkZXIgLT0gY2hpbGRfbmRfaXQuZ2V0X21ldGFkYXRhKCk7CisJfQorICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmRfYnlfb3JkZXIoc2l6ZV90eXBlIG9yZGVyKSBjb25zdAoreyByZXR1cm4gY29uc3RfY2FzdDxQQl9EU19DTEFTU19DX0RFQyo+KHRoaXMpLT5maW5kX2J5X29yZGVyKG9yZGVyKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK29yZGVyX29mX2tleShrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KSBjb25zdAoreworICBjb25zdCBfQVRyYWl0cyYgcl90cmFpdHMgPQorICAgIGNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMqID4odGhpcyktPmdldF9hY2Nlc3NfdHJhaXRzKCk7CisKKyAgcmV0dXJuIG9yZGVyX29mX3ByZWZpeChyX3RyYWl0cy5iZWdpbihyX2tleSksIHJfdHJhaXRzLmVuZChyX2tleSkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK29yZGVyX29mX3ByZWZpeCh0eXBlbmFtZSBhY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBiLAorCQl0eXBlbmFtZSBhY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBlKSBjb25zdAoreworICBpZiAoZW1wdHkoKSkKKyAgICByZXR1cm4gMDsKKworICBjb25zdCBfQVRyYWl0cyYgcl90cmFpdHMgPQorICAgIGNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMqPih0aGlzKS0+Z2V0X2FjY2Vzc190cmFpdHMoKTsKKworICBub2RlX2NvbnN0X2l0ZXJhdG9yIG5kX2l0ID0gbm9kZV9iZWdpbigpOworICBub2RlX2NvbnN0X2l0ZXJhdG9yIGVuZF9uZF9pdCA9IG5vZGVfZW5kKCk7CisgIHNpemVfdHlwZSBvcmQgPSAwOworCisgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBudW1fY2hpbGRyZW4gPSBuZF9pdC5udW1fY2hpbGRyZW4oKTsKKyAgICAgIGlmIChudW1fY2hpbGRyZW4gPT0gMCkKKwl7CisJICBrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5ID0gYmFzZV90eXBlOjpleHRyYWN0X2tleSgqKCpuZF9pdCkpOworCSAgdHlwZW5hbWUgYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3Iga2V5X2IgPQorCSAgICByX3RyYWl0cy5iZWdpbihyX2tleSk7CisKKwkgIHR5cGVuYW1lIGFjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGtleV9lID0KKwkgICAgcl90cmFpdHMuZW5kKHJfa2V5KTsKKworCSAgcmV0dXJuIChiYXNlX3R5cGU6Omxlc3Moa2V5X2IsIGtleV9lLCAgYiwgZSwgIHJfdHJhaXRzKSkgPworCQkgIG9yZCArIDEgOiBvcmQ7CisJfQorCisgICAgICBub2RlX2NvbnN0X2l0ZXJhdG9yIG5leHRfbmRfaXQgPSBlbmRfbmRfaXQ7CisgICAgICBzaXplX3R5cGUgaSA9IG51bV9jaGlsZHJlbiAtIDE7CisKKyAgICAgIGRvCisJeworCSAgbm9kZV9jb25zdF9pdGVyYXRvciBjaGlsZF9uZF9pdCA9IG5kX2l0LmdldF9jaGlsZChpKTsKKworCSAgaWYgKG5leHRfbmRfaXQgIT0gZW5kX25kX2l0KQorCSAgICBvcmQgKz0gY2hpbGRfbmRfaXQuZ2V0X21ldGFkYXRhKCk7CisJICBlbHNlIGlmICghYmFzZV90eXBlOjpsZXNzKGIsIGUsCisJCQkJICAgIGNoaWxkX25kX2l0LnZhbGlkX3ByZWZpeCgpLmZpcnN0LAorCQkJCSAgICBjaGlsZF9uZF9pdC52YWxpZF9wcmVmaXgoKS5zZWNvbmQsCisJCQkJICAgIHJfdHJhaXRzKSkKKwkgICAgbmV4dF9uZF9pdCA9IGNoaWxkX25kX2l0OworCX0KKyAgICAgIHdoaWxlIChpLS0gPiAwKTsKKworICAgICAgaWYgKG5leHRfbmRfaXQgPT0gZW5kX25kX2l0KQorCXJldHVybiBvcmQ7CisKKyAgICAgIG5kX2l0ID0gbmV4dF9uZF9pdDsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorb3BlcmF0b3IoKShub2RlX2l0ZXJhdG9yIG5kX2l0LCBub2RlX2NvbnN0X2l0ZXJhdG9yIC8qZW5kX25kX2l0Ki8pIGNvbnN0Cit7CisgIGNvbnN0IHNpemVfdHlwZSBudW1fY2hpbGRyZW4gPSBuZF9pdC5udW1fY2hpbGRyZW4oKTsKKyAgc2l6ZV90eXBlIGNoaWxkcmVuX3JhbmsgPSAwOworICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG51bV9jaGlsZHJlbjsgKytpKQorICAgIGNoaWxkcmVuX3JhbmsgKz0gbmRfaXQuZ2V0X2NoaWxkKGkpLmdldF9tZXRhZGF0YSgpOworCisgIGNvbnN0IHNpemVfdHlwZSByZXMgPSAobnVtX2NoaWxkcmVuID09IDApID8gMSA6IGNoaWxkcmVuX3Jhbms7CisgIGNvbnN0X2Nhc3Q8c2l6ZV90eXBlJj4obmRfaXQuZ2V0X21ldGFkYXRhKCkpID0gcmVzOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L3ByZWZpeF9zZWFyY2hfbm9kZV91cGRhdGVfaW1wLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9wcmVmaXhfc2VhcmNoX25vZGVfdXBkYXRlX2ltcC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU5NjExMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9wcmVmaXhfc2VhcmNoX25vZGVfdXBkYXRlX2ltcC5ocHAKQEAgLTAsMCArMSwxMzkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdHJpZV9wb2xpY3kvcHJlZml4X3NlYXJjaF9ub2RlX3VwZGF0ZV9pbXAuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBwcmVmaXhfc2VhcmNoX25vZGVfdXBkYXRlLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitzdGQ6OnBhaXI8CisgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvciwKKyAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yPgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcHJlZml4X3JhbmdlKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0Cit7CisgIGNvbnN0IGFjY2Vzc190cmFpdHMmIHJfdHJhaXRzID0gZ2V0X2FjY2Vzc190cmFpdHMoKTsKKyAgcmV0dXJuIChwcmVmaXhfcmFuZ2Uocl90cmFpdHMuYmVnaW4ocl9rZXkpLCByX3RyYWl0cy5lbmQocl9rZXkpKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitzdGQ6OnBhaXI8CisgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvciwKKyAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yPgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcHJlZml4X3JhbmdlKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCit7CisgIHJldHVybiAocHJlZml4X3JhbmdlKGdldF9hY2Nlc3NfdHJhaXRzKCkuYmVnaW4ocl9rZXkpLAorCQkgICAgICAgZ2V0X2FjY2Vzc190cmFpdHMoKS5lbmQocl9rZXkpKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitzdGQ6OnBhaXI8CisgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvciwKKyAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yPgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcHJlZml4X3JhbmdlKHR5cGVuYW1lIGFjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGIsCisJICAgICB0eXBlbmFtZSBhY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBlKSBjb25zdAoreworICBjb25zdCBzdGQ6OnBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBub25fY29uc3RfcmV0ID0KKyAgICBjb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDKiA+KHRoaXMpLT5wcmVmaXhfcmFuZ2UoYiwgZSk7CisKKyAgcmV0dXJuIChzdGQ6Om1ha2VfcGFpcihjb25zdF9pdGVyYXRvcihub25fY29uc3RfcmV0LmZpcnN0KSwKKwkJCSBjb25zdF9pdGVyYXRvcihub25fY29uc3RfcmV0LnNlY29uZCkpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3N0ZDo6cGFpcjwKKyAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yLAorICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3I+CitQQl9EU19DTEFTU19DX0RFQzo6CitwcmVmaXhfcmFuZ2UodHlwZW5hbWUgYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgYiwKKwkgICAgIHR5cGVuYW1lIGFjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGUpCit7CisgIE5vZGVfSXRyIG5kX2l0ID0gbm9kZV9iZWdpbigpOworICBOb2RlX0l0ciBlbmRfbmRfaXQgPSBub2RlX2VuZCgpOworCisgIGNvbnN0IGFjY2Vzc190cmFpdHMmIHJfdHJhaXRzID0gZ2V0X2FjY2Vzc190cmFpdHMoKTsKKyAgY29uc3Qgc2l6ZV90eXBlIGdpdmVuX3JhbmdlX2xlbmd0aCA9IHN0ZDo6ZGlzdGFuY2UoYiwgZSk7CisKKyAgd2hpbGUgKHRydWUpCisgICAgeworICAgICAgaWYgKG5kX2l0ID09IGVuZF9uZF9pdCkKKwlyZXR1cm4gKHN0ZDo6bWFrZV9wYWlyKGVuZCgpLCBlbmQoKSkpOworCisgICAgICBjb25zdCBzaXplX3R5cGUgY29tbW9uX3JhbmdlX2xlbmd0aCA9CisJYmFzZV90eXBlOjpjb21tb25fcHJlZml4X2xlbihuZF9pdCwgYiwgZSwgcl90cmFpdHMpOworCisgICAgICBpZiAoY29tbW9uX3JhbmdlX2xlbmd0aCA+PSBnaXZlbl9yYW5nZV9sZW5ndGgpCisJeworCSAgaXRlcmF0b3IgcmV0X2IgPSB0aGlzLT5sZWZ0bW9zdF9pdChuZF9pdCk7CisJICBpdGVyYXRvciByZXRfZSA9IHRoaXMtPnJpZ2h0bW9zdF9pdChuZF9pdCk7CisJICByZXR1cm4gKHN0ZDo6bWFrZV9wYWlyKHJldF9iLCArK3JldF9lKSk7CisJfQorICAgICAgbmRfaXQgPSBuZXh0X2NoaWxkKG5kX2l0LCBiLCBlLCBlbmRfbmRfaXQsIHJfdHJhaXRzKTsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbmV4dF9jaGlsZChub2RlX2l0ZXJhdG9yIG5kX2l0LCB0eXBlbmFtZSBhY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBiLAorCSAgIHR5cGVuYW1lIGFjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGUsIG5vZGVfaXRlcmF0b3IgZW5kX25kX2l0LAorCSAgIGNvbnN0IGFjY2Vzc190cmFpdHMmIHJfdHJhaXRzKQoreworICBjb25zdCBzaXplX3R5cGUgbnVtX2NoaWxkcmVuID0gbmRfaXQubnVtX2NoaWxkcmVuKCk7CisgIG5vZGVfaXRlcmF0b3IgcmV0ID0gZW5kX25kX2l0OworICBzaXplX3R5cGUgbWF4X2xlbmd0aCA9IDA7CisgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2NoaWxkcmVuOyArK2kpCisgICAgeworICAgICAgbm9kZV9pdGVyYXRvciBwb3QgPSBuZF9pdC5nZXRfY2hpbGQoaSk7CisgICAgICBjb25zdCBzaXplX3R5cGUgY29tbW9uX3JhbmdlX2xlbmd0aCA9CisJYmFzZV90eXBlOjpjb21tb25fcHJlZml4X2xlbihwb3QsIGIsIGUsIHJfdHJhaXRzKTsKKworICAgICAgaWYgKGNvbW1vbl9yYW5nZV9sZW5ndGggPiBtYXhfbGVuZ3RoKQorCXsKKwkgIHJldCA9IHBvdDsKKwkgIG1heF9sZW5ndGggPSBjb21tb25fcmFuZ2VfbGVuZ3RoOworCX0KKyAgICB9CisgIHJldHVybiAocmV0KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitvcGVyYXRvcigpKG5vZGVfaXRlcmF0b3IgLypuZF9pdCovLCBub2RlX2NvbnN0X2l0ZXJhdG9yIC8qZW5kX25kX2l0Ki8pIGNvbnN0Cit7IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9zYW1wbGVfdHJpZV9hY2Nlc3NfdHJhaXRzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9zYW1wbGVfdHJpZV9hY2Nlc3NfdHJhaXRzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWVmMmM2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L3NhbXBsZV90cmllX2FjY2Vzc190cmFpdHMuaHBwCkBAIC0wLDAgKzEsNzcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdHJpZV9wb2xpY3kvc2FtcGxlX3RyaWVfYWNjZXNzX3RyYWl0cy5ocHAKKyAqIENvbnRhaW5zIGEgc2FtcGxlIHByb2JlIHBvbGljeS4KKyAqLworCisjaWZuZGVmIFBCX0RTX1NBTVBMRV9UUklFX0VfQUNDRVNTX1RSQUlUU19IUFAKKyNkZWZpbmUgUEJfRFNfU0FNUExFX1RSSUVfRV9BQ0NFU1NfVFJBSVRTX0hQUAorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICAvLy8gQSBzYW1wbGUgdHJpZSBlbGVtZW50IGFjY2VzcyB0cmFpdHMuCisgIHN0cnVjdCBzYW1wbGVfdHJpZV9hY2Nlc3NfdHJhaXRzCisgIHsKKyAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IAkJICAgICAgIAkJc2l6ZV90eXBlOworICAgIHR5cGVkZWYgc3RkOjpzdHJpbmcgCQkJICAgICAgIAlrZXlfdHlwZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8a2V5X3R5cGU+CV9fcmViaW5kX2s7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9rOjpvdGhlcjo6Y29uc3RfcmVmZXJlbmNlCWtleV9jb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgCQljb25zdF9pdGVyYXRvcjsKKworICAgIC8vLyBFbGVtZW50IHR5cGUuCisgICAgdHlwZWRlZiBjaGFyIAkJCQkgICAgICAgCWVfdHlwZTsKKworICAgIGVudW0KKyAgICAgIHsKKwltYXhfc2l6ZSA9IDQKKyAgICAgIH07CisKKyAgICAvLy8gUmV0dXJucyBhIGNvbnN0X2l0ZXJhdG9yIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9mIHJfa2V5LgorICAgIGlubGluZSBzdGF0aWMgY29uc3RfaXRlcmF0b3IKKyAgICBiZWdpbihrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgIC8vLyBSZXR1cm5zIGEgY29uc3RfaXRlcmF0b3IgdG8gdGhlIGFmdGVyLWxhc3QgZWxlbWVudCBvZiByX2tleS4KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0X2l0ZXJhdG9yCisgICAgZW5kKGtleV9jb25zdF9yZWZlcmVuY2UpOworCisgICAgLy8vIE1hcHMgYW4gZWxlbWVudCB0byBhIHBvc2l0aW9uLgorICAgIGlubGluZSBzdGF0aWMgc2l6ZV90eXBlCisgICAgZV9wb3MoZV90eXBlKTsKKyAgfTsKK30KKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX1NBTVBMRV9UUklFX0VfQUNDRVNTX1RSQUlUU19IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9zYW1wbGVfdHJpZV9ub2RlX3VwZGF0ZS5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvc2FtcGxlX3RyaWVfbm9kZV91cGRhdGUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZDQ4N2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvc2FtcGxlX3RyaWVfbm9kZV91cGRhdGUuaHBwCkBAIC0wLDAgKzEsNjQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdHJpZV9wb2xpY3kvc2FtcGxlX3RyaWVfbm9kZV91cGRhdGUuaHBwCisgKiBDb250YWlucyBhIHNhbWxlIG5vZGUgdXBkYXRlIGZ1bmN0b3IuCisgKi8KKworI2lmbmRlZiBQQl9EU19TQU1QTEVfVFJJRV9OT0RFX1VQREFUT1JfSFBQCisjZGVmaW5lIFBCX0RTX1NBTVBMRV9UUklFX05PREVfVVBEQVRPUl9IUFAKKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgLy8vIEEgc2FtcGxlIG5vZGUgdXBkYXRvci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9DSXRyLCB0eXBlbmFtZSBOb2RlX0l0ciwKKwkgICB0eXBlbmFtZSBfQVRyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICBjbGFzcyBzYW1wbGVfdHJpZV9ub2RlX3VwZGF0ZQorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IAkJbWV0YWRhdGFfdHlwZTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgc2FtcGxlX3RyaWVfbm9kZV91cGRhdGUoKTsKKworICAgIC8vLyBVcGRhdGVzIHRoZSByYW5rIG9mIGEgbm9kZSB0aHJvdWdoIGEgbm9kZV9pdGVyYXRvciBub2RlX2l0OworICAgIC8vLyBlbmRfbmRfaXQgaXMgdGhlIGVuZCBub2RlIGl0ZXJhdG9yLgorICAgIGlubGluZSB2b2lkCisgICAgb3BlcmF0b3IoKShub2RlX2l0ZXJhdG9yLCBub2RlX2NvbnN0X2l0ZXJhdG9yKSBjb25zdDsKKyAgfTsKK30KKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX1NBTVBMRV9UUklFX05PREVfVVBEQVRPUl9IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS90cmllX3BvbGljeV9iYXNlLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS90cmllX3BvbGljeV9iYXNlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjFjNGE5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L3RyaWVfcG9saWN5X2Jhc2UuaHBwCkBAIC0wLDAgKzEsMjA3IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHRyaWVfcG9saWN5L3RyaWVfcG9saWN5X2Jhc2UuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0cmllX3BvbGljeV9iYXNlLgorICovCisKKyNpZm5kZWYgUEJfRFNfVFJJRV9QT0xJQ1lfQkFTRV9IUFAKKyNkZWZpbmUgUEJfRFNfVFJJRV9QT0xJQ1lfQkFTRV9IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYnJhbmNoX3BvbGljeS9icmFuY2hfcG9saWN5LmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIEJhc2UgY2xhc3MgZm9yIHRyaWUgcG9saWNpZXMuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9DSXRyLCB0eXBlbmFtZSBOb2RlX0l0ciwKKwkgICAgIHR5cGVuYW1lIF9BVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgdHJpZV9wb2xpY3lfYmFzZQorICAgIDogcHVibGljIGJyYW5jaF9wb2xpY3k8Tm9kZV9DSXRyLCBOb2RlX0l0ciwgX0FsbG9jPgorICAgIHsKKyAgICAgIHR5cGVkZWYgYnJhbmNoX3BvbGljeTxOb2RlX0NJdHIsIE5vZGVfSXRyLCBfQWxsb2M+IGJhc2VfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0FUcmFpdHMgCQkJCWFjY2Vzc190cmFpdHM7CisgICAgICB0eXBlZGVmIF9BbGxvYyAJCQkJCWFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6c2l6ZV90eXBlIAlzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIG51bGxfdHlwZSAJCQkJbWV0YWRhdGFfdHlwZTsKKyAgICAgIHR5cGVkZWYgTm9kZV9DSXRyIAkJCQlub2RlX2NvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBOb2RlX0l0ciAJCQkJCW5vZGVfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIG5vZGVfY29uc3RfaXRlcmF0b3I6OnZhbHVlX3R5cGUgCWNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBub2RlX2l0ZXJhdG9yOjp2YWx1ZV90eXBlIAlpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjprZXlfdHlwZSAJCWtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmtleV9jb25zdF9yZWZlcmVuY2UgCWtleV9jb25zdF9yZWZlcmVuY2U7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2aXJ0dWFsIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCA9IDA7CisKKyAgICAgIHZpcnR1YWwgaXRlcmF0b3IKKyAgICAgIGVuZCgpID0gMDsKKworICAgICAgdmlydHVhbCBub2RlX2NvbnN0X2l0ZXJhdG9yCisgICAgICBub2RlX2JlZ2luKCkgY29uc3QgPSAwOworCisgICAgICB2aXJ0dWFsIG5vZGVfaXRlcmF0b3IKKyAgICAgIG5vZGVfYmVnaW4oKSA9IDA7CisKKyAgICAgIHZpcnR1YWwgbm9kZV9jb25zdF9pdGVyYXRvcgorICAgICAgbm9kZV9lbmQoKSBjb25zdCA9IDA7CisKKyAgICAgIHZpcnR1YWwgbm9kZV9pdGVyYXRvcgorICAgICAgbm9kZV9lbmQoKSA9IDA7CisKKyAgICAgIHZpcnR1YWwgY29uc3QgYWNjZXNzX3RyYWl0cyYKKyAgICAgIGdldF9hY2Nlc3NfdHJhaXRzKCkgY29uc3QgPSAwOworCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgCWVfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6cGFpcjxlX2NvbnN0X2l0ZXJhdG9yLCBlX2NvbnN0X2l0ZXJhdG9yPiBwcmVmaXhfcmFuZ2VfdDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHN0YXRpYyBzaXplX3R5cGUKKyAgICAgIGNvbW1vbl9wcmVmaXhfbGVuKG5vZGVfaXRlcmF0b3IsIGVfY29uc3RfaXRlcmF0b3IsCisJCQllX2NvbnN0X2l0ZXJhdG9yLCBjb25zdCBhY2Nlc3NfdHJhaXRzJik7CisKKyAgICAgIHN0YXRpYyBpdGVyYXRvcgorICAgICAgbGVmdG1vc3RfaXQobm9kZV9pdGVyYXRvcik7CisKKyAgICAgIHN0YXRpYyBpdGVyYXRvcgorICAgICAgcmlnaHRtb3N0X2l0KG5vZGVfaXRlcmF0b3IpOworCisgICAgICBzdGF0aWMgYm9vbAorICAgICAgbGVzcyhlX2NvbnN0X2l0ZXJhdG9yLCBlX2NvbnN0X2l0ZXJhdG9yLCBlX2NvbnN0X2l0ZXJhdG9yLAorCSAgIGVfY29uc3RfaXRlcmF0b3IsIGNvbnN0IGFjY2Vzc190cmFpdHMmKTsKKyAgICB9OworCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwgdHlwZW5hbWUgTm9kZV9JdHIsIFwKKwkgICAgIHR5cGVuYW1lIF9BVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIHRyaWVfcG9saWN5X2Jhc2U8Tm9kZV9DSXRyLCBOb2RlX0l0ciwgX0FUcmFpdHMsIF9BbGxvYz4KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBjb21tb25fcHJlZml4X2xlbihub2RlX2l0ZXJhdG9yIG5kX2l0LCBlX2NvbnN0X2l0ZXJhdG9yIGJfciwKKwkJICAgICAgZV9jb25zdF9pdGVyYXRvciBlX3IsIGNvbnN0IGFjY2Vzc190cmFpdHMmIHJfdHJhaXRzKQorICAgIHsKKyAgICAgIHByZWZpeF9yYW5nZV90IHByZWZfcmFuZ2UgPSBuZF9pdC52YWxpZF9wcmVmaXgoKTsKKworICAgICAgZV9jb25zdF9pdGVyYXRvciBiX2wgPSBwcmVmX3JhbmdlLmZpcnN0OworICAgICAgZV9jb25zdF9pdGVyYXRvciBlX2wgPSBwcmVmX3JhbmdlLnNlY29uZDsKKworICAgICAgY29uc3Qgc2l6ZV90eXBlIHJhbmdlX2xlbmd0aF9sID0gc3RkOjpkaXN0YW5jZShiX2wsIGVfbCk7CisgICAgICBjb25zdCBzaXplX3R5cGUgcmFuZ2VfbGVuZ3RoX3IgPSBzdGQ6OmRpc3RhbmNlKGJfciwgZV9yKTsKKworICAgICAgaWYgKHJhbmdlX2xlbmd0aF9yIDwgcmFuZ2VfbGVuZ3RoX2wpCisJeworCSAgc3RkOjpzd2FwKGJfbCwgYl9yKTsKKwkgIHN0ZDo6c3dhcChlX2wsIGVfcik7CisJfQorCisgICAgICBzaXplX3R5cGUgcmV0ID0gMDsKKyAgICAgIHdoaWxlIChiX2wgIT0gZV9sKQorCXsKKwkgIGlmIChyX3RyYWl0cy5lX3BvcygqYl9sKSAhPSByX3RyYWl0cy5lX3BvcygqYl9yKSkKKwkgICAgcmV0dXJuIHJldDsKKworCSAgKytyZXQ7CisJICArK2JfbDsKKwkgICsrYl9yOworCX0KKworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBsZWZ0bW9zdF9pdChub2RlX2l0ZXJhdG9yIG5kX2l0KQorICAgIHsKKyAgICAgIGlmIChuZF9pdC5udW1fY2hpbGRyZW4oKSA9PSAwKQorCXJldHVybiAqbmRfaXQ7CisKKyAgICAgIHJldHVybiBsZWZ0bW9zdF9pdChuZF9pdC5nZXRfY2hpbGQoMCkpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJpZ2h0bW9zdF9pdChub2RlX2l0ZXJhdG9yIG5kX2l0KQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBudW1fY2hpbGRyZW4gPSBuZF9pdC5udW1fY2hpbGRyZW4oKTsKKworICAgICAgaWYgKG51bV9jaGlsZHJlbiA9PSAwKQorCXJldHVybiAqbmRfaXQ7CisKKyAgICAgIHJldHVybiByaWdodG1vc3RfaXQobmRfaXQuZ2V0X2NoaWxkKG51bV9jaGlsZHJlbiAtIDEpKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGJvb2wKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgbGVzcyhlX2NvbnN0X2l0ZXJhdG9yIGJfbCwgZV9jb25zdF9pdGVyYXRvciBlX2wsCisJIGVfY29uc3RfaXRlcmF0b3IgYl9yLCBlX2NvbnN0X2l0ZXJhdG9yIGVfciwKKwkgY29uc3QgYWNjZXNzX3RyYWl0cyYgcl90cmFpdHMpCisgICAgeworICAgICAgd2hpbGUgKGJfbCAhPSBlX2wpCisJeworCSAgaWYgKGJfciA9PSBlX3IpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgc2l6ZV90eXBlIGxfcG9zID0gcl90cmFpdHMuZV9wb3MoKmJfbCk7CisJICBzaXplX3R5cGUgcl9wb3MgPSByX3RyYWl0cy5lX3BvcygqYl9yKTsKKwkgIGlmIChsX3BvcyAhPSByX3BvcykKKwkgICAgcmV0dXJuIChsX3BvcyA8IHJfcG9zKTsKKworCSAgKytiX2w7CisJICArK2JfcjsKKwl9CisgICAgICByZXR1cm4gYl9yICE9IGVfcjsKKyAgICB9CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX1RSSUVfUE9MSUNZX0JBU0VfSFBQCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvdHJpZV9zdHJpbmdfYWNjZXNzX3RyYWl0c19pbXAuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L3RyaWVfc3RyaW5nX2FjY2Vzc190cmFpdHNfaW1wLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjYyZGMzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L3RyaWVfc3RyaW5nX2FjY2Vzc190cmFpdHNfaW1wLmhwcApAQCAtMCwwICsxLDk5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHRyaWVfcG9saWN5L3RyaWVfc3RyaW5nX2FjY2Vzc190cmFpdHNfaW1wLmhwcAorICogQ29udGFpbnMgYSBwb2xpY3kgZm9yIGV4dHJhY3RpbmcgY2hhcmFjdGVyIHBvc2l0aW9ucyBmcm9tCisgKiAgICBhIHN0cmluZyBmb3IgYSB2ZWN0b3ItYmFzZWQgUEFUUklDSUEgdHJlZQorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitkZXRhaWw6OmludGVncmFsX2NvbnN0YW50PGludCwgUmV2ZXJzZT4gUEJfRFNfQ0xBU1NfQ19ERUM6OnNfcmV2X2luZDsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitlX3BvcyhlX3R5cGUgZSkKK3sKKyAgcmV0dXJuIChzdGF0aWNfY2FzdDxzaXplX3R5cGU+KGUgLSBtaW5fZV92YWwpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JlZ2luKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXkpCit7CisgIHJldHVybiAoYmVnaW5faW1wKHJfa2V5LCBzX3Jldl9pbmQpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VuZChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5KQoreworICByZXR1cm4gKGVuZF9pbXAocl9rZXksIHNfcmV2X2luZCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW5faW1wKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXksIGRldGFpbDo6ZmFsc2VfdHlwZSkKK3sKKyAgcmV0dXJuIChyX2tleS5iZWdpbigpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JlZ2luX2ltcChrZXlfY29uc3RfcmVmZXJlbmNlIHJfa2V5LCBkZXRhaWw6OnRydWVfdHlwZSkKK3sKKyAgcmV0dXJuIChyX2tleS5yYmVnaW4oKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitlbmRfaW1wKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXksIGRldGFpbDo6ZmFsc2VfdHlwZSkKK3sKKyAgcmV0dXJuIChyX2tleS5lbmQoKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitlbmRfaW1wKGtleV9jb25zdF9yZWZlcmVuY2Ugcl9rZXksIGRldGFpbDo6dHJ1ZV90eXBlKQoreworICByZXR1cm4gKHJfa2V5LnJlbmQoKSk7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHlwZV91dGlscy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdHlwZV91dGlscy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0NjEyOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90eXBlX3V0aWxzLmhwcApAQCAtMCwwICsxLDE2NyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBkZXRhaWwvdHlwZV91dGlscy5ocHAKKyAqIENvbnRhaW5zIHV0aWxpdGllcyBmb3IgaGFuZG5saW5nIHR5cGVzLiBBbGwgb2YgdGhlc2UgY2xhc3NlcyBhcmUgYmFzZWQgb24KKyAqIE1vZGVybiBDKysgYnkgQW5kcmVpIEFseGFuZHJlc2N1LgorICovCisKKyNpZm5kZWYgUEJfRFNfVFlQRV9VVElMU19IUFAKKyNkZWZpbmUgUEJfRFNfVFlQRV9VVElMU19IUFAKKworI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx0cjEvdHlwZV90cmFpdHM+CisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8ZXh0L251bWVyaWNfdHJhaXRzLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIHVzaW5nIHN0ZDo6dHIxOjppc19zYW1lOworICAgIHVzaW5nIHN0ZDo6dHIxOjppc19jb25zdDsKKyAgICB1c2luZyBzdGQ6OnRyMTo6aXNfcG9pbnRlcjsKKyAgICB1c2luZyBzdGQ6OnRyMTo6aXNfcmVmZXJlbmNlOworICAgIHVzaW5nIHN0ZDo6dHIxOjppc19mdW5kYW1lbnRhbDsKKyAgICB1c2luZyBzdGQ6OnRyMTo6aXNfbWVtYmVyX29iamVjdF9wb2ludGVyOworICAgIHVzaW5nIHN0ZDo6dHIxOjppc19tZW1iZXJfcG9pbnRlcjsKKyAgICB1c2luZyBzdGQ6OnRyMTo6aXNfYmFzZV9vZjsKKyAgICB1c2luZyBzdGQ6OnRyMTo6cmVtb3ZlX2NvbnN0OworICAgIHVzaW5nIHN0ZDo6dHIxOjpyZW1vdmVfcmVmZXJlbmNlOworCisgICAgLy8gTmVlZCBpbnRlZ3JhbF9jb25zdDxib29sLCB0cnVlPiA8LT4gaW50ZWdyYWxfY29uc3Q8aW50LCAxPiwgc28KKyAgICAvLyBiZWNhdXNlIG9mIHRoaXMgdXNlIHRoZSBmb2xsb3dpbmcgdHlwZWRlZnMgaW5zdGVhZCBvZiBpbXBvcnRpbmcKKyAgICAvLyBzdGQ6OnRyMSdzLgorICAgIHVzaW5nIHN0ZDo6dHIxOjppbnRlZ3JhbF9jb25zdGFudDsKKyAgICB0eXBlZGVmIHN0ZDo6dHIxOjppbnRlZ3JhbF9jb25zdGFudDxpbnQsIDE+IHRydWVfdHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6dHIxOjppbnRlZ3JhbF9jb25zdGFudDxpbnQsIDA+IGZhbHNlX3R5cGU7CisKKyAgICB1c2luZyBfX2dudV9jeHg6Ol9fY29uZGl0aW9uYWxfdHlwZTsKKyAgICB1c2luZyBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBpc19jb25zdF9wb2ludGVyCisgICAgeworICAgICAgZW51bQorCXsKKwkgIHZhbHVlID0gaXNfY29uc3Q8VD46OnZhbHVlICYmIGlzX3BvaW50ZXI8VD46OnZhbHVlCisJfTsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgaXNfY29uc3RfcmVmZXJlbmNlCisgICAgeworICAgICAgZW51bQorCXsKKwkgIHZhbHVlID0gaXNfY29uc3Q8VD46OnZhbHVlICYmIGlzX3JlZmVyZW5jZTxUPjo6dmFsdWUKKwl9OworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBpc19zaW1wbGUKKyAgICB7CisgICAgICBlbnVtCisJeworCSAgdmFsdWUgPSBpc19mdW5kYW1lbnRhbDx0eXBlbmFtZSByZW1vdmVfY29uc3Q8VD46OnR5cGU+Ojp2YWx1ZSAKKwkgIHx8IGlzX3BvaW50ZXI8dHlwZW5hbWUgcmVtb3ZlX2NvbnN0PFQ+Ojp0eXBlPjo6dmFsdWUgCisJICB8fCBpc19tZW1iZXJfcG9pbnRlcjxUPjo6dmFsdWUgCisJfTsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBpc19wYWlyCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICAgICAgc3RydWN0IGlzX3BhaXJfaW1wCisgICAgICB7CisJZW51bQorCSAgeworCSAgICB2YWx1ZSA9IDAKKwkgIH07CisgICAgICB9OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBWPgorICAgICAgc3RydWN0IGlzX3BhaXJfaW1wPHN0ZDo6cGFpcjxVLFY+ID4KKyAgICAgIHsKKwllbnVtCisJICB7CisJICAgIHZhbHVlID0gMQorCSAgfTsKKyAgICAgIH07CisKKyAgICBwdWJsaWM6CisgICAgICBlbnVtCisJeworCSAgdmFsdWUgPSBpc19wYWlyX2ltcDxUPjo6dmFsdWUKKwl9OworICAgIH07CisKKyAgICAvLyBVc2UgQysrMHgncyBzdGF0aWNfYXNzZXJ0IGlmIHBvc3NpYmxlLgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNkZWZpbmUgUEJfRFNfU1RBVElDX0FTU0VSVChVTklRVUUsIEUpICBzdGF0aWNfYXNzZXJ0KEUsICNVTklRVUUpCisjZWxzZQorICAgIHRlbXBsYXRlPGJvb2w+CisgICAgc3RydWN0IF9fc3RhdGljX2Fzc2VydDsKKworICAgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19zdGF0aWNfYXNzZXJ0PHRydWU+CisgICAgeyB9OworCisgICAgdGVtcGxhdGU8aW50PgorICAgIHN0cnVjdCBfX3N0YXRpY19hc3NlcnRfZHVtY2xhc3MKKyAgICB7CisgICAgICBlbnVtCisJeworCSAgdiA9IDEKKwl9OworICAgIH07CisKKyNkZWZpbmUgUEJfRFNfU1RBVElDX0FTU0VSVChVTklRVUUsIEUpICBcCisgICAgdHlwZWRlZiBfX2dudV9wYmRzOjpkZXRhaWw6Ol9fc3RhdGljX2Fzc2VydF9kdW1jbGFzczxzaXplb2YoX19nbnVfcGJkczo6ZGV0YWlsOjpfX3N0YXRpY19hc3NlcnQ8Ym9vbChFKT4pPiBVTklRVUUjI19fc3RhdGljX2Fzc2VydF90eXBlCisKKyNlbmRpZgorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZT4KKyAgICBzdHJ1Y3QgdHlwZV90b190eXBlCisgICAgeworICAgICAgdHlwZWRlZiBUeXBlIHR5cGU7CisgICAgfTsKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90eXBlc190cmFpdHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3R5cGVzX3RyYWl0cy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkNWE0ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC90eXBlc190cmFpdHMuaHBwCkBAIC0wLDAgKzEsMjg4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGRldGFpbC90eXBlc190cmFpdHMuaHBwCisgKiBDb250YWlucyBhIHRyYWl0cyBjbGFzcyBvZiB0eXBlcyB1c2VkIGJ5IGNvbnRhaW5lcnMuCisgKi8KKworI2lmbmRlZiBQQl9EU19UWVBFU19UUkFJVFNfSFBQCisjZGVmaW5lIFBCX0RTX1RZUEVTX1RSQUlUU19IUFAKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGV4dC9wYl9kcy90YWdfYW5kX3RyYWl0LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8qKgorICAgICAqICBAYWRkdG9ncm91cCB0cmFpdHMgVHJhaXRzCisgICAgICogIEB7CisgICAgICovCisKKyAgICAvLy8gUHJpbWFyeSB0ZW1wbGF0ZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIE1hcHBlZD4KKyAgICAgIHN0cnVjdCBub190aHJvd19jb3BpZXMKKyAgICAgIHsKKwlzdGF0aWMgY29uc3QgYm9vbCBfX3NpbXBsZSA9IGlzX3NpbXBsZTxLZXk+Ojp2YWx1ZQorCQkJICAgCSAmJiBpc19zaW1wbGU8TWFwcGVkPjo6dmFsdWU7CisJdHlwZWRlZiBpbnRlZ3JhbF9jb25zdGFudDxpbnQsIF9fc2ltcGxlPiAJICAgICAgIAlpbmRpY2F0b3I7CisgICAgICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleT4KKyAgICAgIHN0cnVjdCBub190aHJvd19jb3BpZXM8S2V5LCBudWxsX3R5cGU+CisgICAgICB7CisJdHlwZWRlZiBpbnRlZ3JhbF9jb25zdGFudDxpbnQsIGlzX3NpbXBsZTxLZXk+Ojp2YWx1ZT4gCWluZGljYXRvcjsKKyAgICAgIH07CisKKworICAgIC8vLyBTdG9yZWQgdmFsdWUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1R2PgorICAgICAgc3RydWN0IHN0b3JlZF92YWx1ZQorICAgICAgeworCXR5cGVkZWYgX1R2IAl2YWx1ZV90eXBlOworCXZhbHVlX3R5cGUgCW1fdmFsdWU7CisgICAgICB9OworCisgICAgLy8vIFN0b3JlZCBoYXNoLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UaD4KKyAgICAgIHN0cnVjdCBzdG9yZWRfaGFzaAorICAgICAgeworCXR5cGVkZWYgX1RoIAloYXNoX3R5cGU7CisJaGFzaF90eXBlIAltX2hhc2g7CisgICAgICB9OworCisgICAgLy8vIFByaW1hcnkgdGVtcGxhdGUgZm9yIHJlcHJlc2VudGF0aW9uIG9mIHN0b3JlZCBkYXRhLgorICAgIC8vLyBUd28gdHlwZXMgb2YgZGF0YSBjYW4gYmUgc3RvcmVkOiB2YWx1ZSBhbmQgaGFzaC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHYsIHR5cGVuYW1lIF9UaD4KKyAgICAgIHN0cnVjdCBzdG9yZWRfZGF0YQorICAgICAgOiBwdWJsaWMgc3RvcmVkX3ZhbHVlPF9Udj4sIHB1YmxpYyBzdG9yZWRfaGFzaDxfVGg+CisgICAgICB7IH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIHJlcHJlc2VudGF0aW9uIG9mIHN0b3JlZCBkYXRhIG9mIGp1c3QgdmFsdWUgdHlwZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHY+CisgICAgICBzdHJ1Y3Qgc3RvcmVkX2RhdGE8X1R2LCBudWxsX3R5cGU+CisgICAgICA6IHB1YmxpYyBzdG9yZWRfdmFsdWU8X1R2PgorICAgICAgeyB9OworCisgICAgLy8vIFByaW1hcnkgdGVtcGxhdGUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIF9BbGxvYywgYm9vbCBTdG9yZV9IYXNoPgorICAgICAgc3RydWN0IHR5cGVfYmFzZTsKKworICAgIC8qKgorICAgICAqIFNwZWNpYWxpemF0aW9uIG9mIHR5cGVfYmFzZSBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGhhc2ggdmFsdWUKKyAgICAgKiBpcyBub3Qgc3RvcmVkIGFsb25nc2lkZSBlYWNoIHZhbHVlLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICBzdHJ1Y3QgdHlwZV9iYXNlPEtleSwgTWFwcGVkLCBfQWxsb2MsIGZhbHNlPgorICAgICAgeworICAgICAgcHVibGljOgorCXR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgCQlzaXplX3R5cGU7CisKKyAgICAgIHByaXZhdGU6CisJdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxNYXBwZWQ+CV9fcmViaW5kX207CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tOjpvdGhlcgkJCV9fcmViaW5kX21hOworCXR5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IEtleSwgTWFwcGVkPgkJCV9fdmFsdWVfdHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9fdmFsdWVfdHlwZT4JX19yZWJpbmRfdjsKKyAgICAgICAJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92OjpvdGhlcgkJCV9fcmViaW5kX3ZhOworCisgICAgICBwdWJsaWM6CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tYTo6dmFsdWVfdHlwZSAgICAgICAJbWFwcGVkX3R5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tYTo6cG9pbnRlciAJCW1hcHBlZF9wb2ludGVyOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbWE6OmNvbnN0X3BvaW50ZXIgCW1hcHBlZF9jb25zdF9wb2ludGVyOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbWE6OnJlZmVyZW5jZQkgICAgICAgCW1hcHBlZF9yZWZlcmVuY2U7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tYTo6Y29uc3RfcmVmZXJlbmNlIAltYXBwZWRfY29uc3RfcmVmZXJlbmNlOworCisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92YTo6dmFsdWVfdHlwZSAJdmFsdWVfdHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3ZhOjpwb2ludGVyIAkJcG9pbnRlcjsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3ZhOjpjb25zdF9wb2ludGVyIAljb25zdF9wb2ludGVyOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdmE6OnJlZmVyZW5jZSAJcmVmZXJlbmNlOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdmE6OmNvbnN0X3JlZmVyZW5jZSAJY29uc3RfcmVmZXJlbmNlOworCisJdHlwZWRlZiBzdG9yZWRfZGF0YTx2YWx1ZV90eXBlLCBudWxsX3R5cGU+CXN0b3JlZF9kYXRhX3R5cGU7CisgICAgICB9OworCisgICAgLyoqCisgICAgICogU3BlY2lhbGl6YXRpb24gb2YgdHlwZV9iYXNlIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgaGFzaCB2YWx1ZQorICAgICAqIGlzIHN0b3JlZCBhbG9uZ3NpZGUgZWFjaCB2YWx1ZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIE1hcHBlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgc3RydWN0IHR5cGVfYmFzZTxLZXksIE1hcHBlZCwgX0FsbG9jLCB0cnVlPgorICAgICAgeworICAgICAgcHVibGljOgorCXR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgCQlzaXplX3R5cGU7CisKKyAgICAgIHByaXZhdGU6CisJdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxNYXBwZWQ+CV9fcmViaW5kX207CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tOjpvdGhlcgkJCV9fcmViaW5kX21hOworCXR5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IEtleSwgTWFwcGVkPgkJCV9fdmFsdWVfdHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9fdmFsdWVfdHlwZT4JX19yZWJpbmRfdjsKKyAgICAgICAJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92OjpvdGhlcgkJCV9fcmViaW5kX3ZhOworCisgICAgICBwdWJsaWM6CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tYTo6dmFsdWVfdHlwZSAgICAgICAJbWFwcGVkX3R5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tYTo6cG9pbnRlciAJCW1hcHBlZF9wb2ludGVyOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbWE6OmNvbnN0X3BvaW50ZXIgCW1hcHBlZF9jb25zdF9wb2ludGVyOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbWE6OnJlZmVyZW5jZQkgICAgICAgCW1hcHBlZF9yZWZlcmVuY2U7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tYTo6Y29uc3RfcmVmZXJlbmNlIAltYXBwZWRfY29uc3RfcmVmZXJlbmNlOworCisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92YTo6dmFsdWVfdHlwZSAJdmFsdWVfdHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3ZhOjpwb2ludGVyIAkJcG9pbnRlcjsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3ZhOjpjb25zdF9wb2ludGVyIAljb25zdF9wb2ludGVyOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdmE6OnJlZmVyZW5jZSAJcmVmZXJlbmNlOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdmE6OmNvbnN0X3JlZmVyZW5jZSAJY29uc3RfcmVmZXJlbmNlOworCisJdHlwZWRlZiBzdG9yZWRfZGF0YTx2YWx1ZV90eXBlLCBzaXplX3R5cGU+CXN0b3JlZF9kYXRhX3R5cGU7CisgICAgICB9OworCisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsaXphdGlvbiBvZiB0eXBlX2Jhc2UgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBoYXNoIHZhbHVlCisgICAgICogaXMgbm90IHN0b3JlZCBhbG9uZ3NpZGUgZWFjaCB2YWx1ZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgIHN0cnVjdCB0eXBlX2Jhc2U8S2V5LCBudWxsX3R5cGUsIF9BbGxvYywgZmFsc2U+CisgICAgICB7CisgICAgICBwdWJsaWM6CisJdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAJCXNpemVfdHlwZTsKKwl0eXBlZGVmIEtleSAJCQkJCXZhbHVlX3R5cGU7CisKKyAgICAgIHByaXZhdGU6CisJdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxudWxsX3R5cGU+ICAJX19yZWJpbmRfbTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX206Om90aGVyCQkJX19yZWJpbmRfbWE7CisJdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDx2YWx1ZV90eXBlPglfX3JlYmluZF92OworICAgICAgIAl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3Y6Om90aGVyCQkJX19yZWJpbmRfdmE7CisKKyAgICAgIHB1YmxpYzoKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX21hOjp2YWx1ZV90eXBlICAgICAgIAltYXBwZWRfdHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX21hOjpwb2ludGVyIAkJbWFwcGVkX3BvaW50ZXI7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tYTo6Y29uc3RfcG9pbnRlciAJbWFwcGVkX2NvbnN0X3BvaW50ZXI7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tYTo6cmVmZXJlbmNlCSAgICAgICAJbWFwcGVkX3JlZmVyZW5jZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX21hOjpjb25zdF9yZWZlcmVuY2UgCW1hcHBlZF9jb25zdF9yZWZlcmVuY2U7CisKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3ZhOjpwb2ludGVyIAkJcG9pbnRlcjsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3ZhOjpjb25zdF9wb2ludGVyIAljb25zdF9wb2ludGVyOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdmE6OnJlZmVyZW5jZSAJcmVmZXJlbmNlOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdmE6OmNvbnN0X3JlZmVyZW5jZSAJY29uc3RfcmVmZXJlbmNlOworCisJdHlwZWRlZiBzdG9yZWRfZGF0YTx2YWx1ZV90eXBlLCBudWxsX3R5cGU+CXN0b3JlZF9kYXRhX3R5cGU7CisKKwlzdGF0aWMgbnVsbF90eXBlIAkJCXNfbnVsbF90eXBlOworICAgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgbnVsbF90eXBlCisgICAgICB0eXBlX2Jhc2U8S2V5LCBudWxsX3R5cGUsIF9BbGxvYywgZmFsc2U+OjpzX251bGxfdHlwZTsKKworCisgICAgLyoqCisgICAgICogU3BlY2lhbGl6YXRpb24gb2YgdHlwZV9iYXNlIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgaGFzaCB2YWx1ZQorICAgICAqIGlzIHN0b3JlZCBhbG9uZ3NpZGUgZWFjaCB2YWx1ZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgIHN0cnVjdCB0eXBlX2Jhc2U8S2V5LCBudWxsX3R5cGUsIF9BbGxvYywgdHJ1ZT4KKyAgICAgIHsKKyAgICAgIHB1YmxpYzoKKwl0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIAkJc2l6ZV90eXBlOworCXR5cGVkZWYgS2V5IAkJCQkJdmFsdWVfdHlwZTsKKworICAgICAgcHJpdmF0ZToKKwl0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPG51bGxfdHlwZT4gIAlfX3JlYmluZF9tOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbTo6b3RoZXIJCQlfX3JlYmluZF9tYTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPHZhbHVlX3R5cGU+CV9fcmViaW5kX3Y7CisgICAgICAgCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdjo6b3RoZXIJCQlfX3JlYmluZF92YTsKKworICAgICAgcHVibGljOgorCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbWE6OnZhbHVlX3R5cGUgICAgICAgCW1hcHBlZF90eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbWE6OnBvaW50ZXIgCQltYXBwZWRfcG9pbnRlcjsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX21hOjpjb25zdF9wb2ludGVyIAltYXBwZWRfY29uc3RfcG9pbnRlcjsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX21hOjpyZWZlcmVuY2UJICAgICAgIAltYXBwZWRfcmVmZXJlbmNlOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbWE6OmNvbnN0X3JlZmVyZW5jZSAJbWFwcGVkX2NvbnN0X3JlZmVyZW5jZTsKKworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdmE6OnBvaW50ZXIgCQlwb2ludGVyOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdmE6OmNvbnN0X3BvaW50ZXIgCWNvbnN0X3BvaW50ZXI7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92YTo6cmVmZXJlbmNlIAlyZWZlcmVuY2U7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92YTo6Y29uc3RfcmVmZXJlbmNlIAljb25zdF9yZWZlcmVuY2U7CisKKwl0eXBlZGVmIHN0b3JlZF9kYXRhPHZhbHVlX3R5cGUsIHNpemVfdHlwZT4Jc3RvcmVkX2RhdGFfdHlwZTsKKworCXN0YXRpYyBudWxsX3R5cGUgCQkgICAgICAJc19udWxsX3R5cGU7CisgICAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICBudWxsX3R5cGUKKyAgICAgIHR5cGVfYmFzZTxLZXksIG51bGxfdHlwZSwgX0FsbG9jLCB0cnVlPjo6c19udWxsX3R5cGU7CisKKworICAgIC8vLyBUeXBlIGJhc2UgZGlzcGF0Y2guCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIF9BbGxvYywgYm9vbCBTdG9yZV9IYXNoPgorICAgICAgc3RydWN0IHR5cGVfZGlzcGF0Y2gKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVfYmFzZTxLZXksIE1hcHBlZCwgX0FsbG9jLCBTdG9yZV9IYXNoPiB0eXBlOworICAgICAgfTsKKworICAgIC8vLyBUcmFpdHMgZm9yIGFic3RyYWN0IHR5cGVzLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBfQWxsb2MsIGJvb2wgU3RvcmVfSGFzaD4KKyAgICAgIHN0cnVjdCB0eXBlc190cmFpdHMKKyAgICAgIDogcHVibGljIHR5cGVfZGlzcGF0Y2g8S2V5LCBNYXBwZWQsIF9BbGxvYywgU3RvcmVfSGFzaD46OnR5cGUKKyAgICAgIHsKKyAgICAgIHByaXZhdGU6CisJdHlwZWRlZiBub190aHJvd19jb3BpZXM8S2V5LCBNYXBwZWQ+CQlfX25vdGhyb3djb3B5OworCXR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8S2V5Pjo6b3RoZXIgX19yZWJpbmRfYTsKKworICAgICAgcHVibGljOgorCXR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpzaXplX3R5cGUgCQlzaXplX3R5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9hOjp2YWx1ZV90eXBlIAlrZXlfdHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2E6OnBvaW50ZXIgCQlrZXlfcG9pbnRlcjsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2E6OmNvbnN0X3BvaW50ZXIgCWtleV9jb25zdF9wb2ludGVyOworCXR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfYTo6cmVmZXJlbmNlIAkJa2V5X3JlZmVyZW5jZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2E6OmNvbnN0X3JlZmVyZW5jZSAJa2V5X2NvbnN0X3JlZmVyZW5jZTsKKwl0eXBlZGVmIHN0ZDo6cGFpcjxzaXplX3R5cGUsIHNpemVfdHlwZT4gCWNvbXBfaGFzaDsKKwl0eXBlZGVmIGludGVncmFsX2NvbnN0YW50PGludCwgU3RvcmVfSGFzaD4gCXN0b3JlX2V4dHJhOworCXR5cGVkZWYgdHlwZW5hbWUgX19ub3Rocm93Y29weTo6aW5kaWNhdG9yIAlub190aHJvd19pbmRpY2F0b3I7CisKKwlzdG9yZV9leHRyYQkJCSAgICAgICAJbV9zdG9yZV9leHRyYV9pbmRpY2F0b3I7CisJbm9fdGhyb3dfaW5kaWNhdG9yIAkJIAltX25vX3Rocm93X2NvcGllc19pbmRpY2F0b3I7CisgICAgfTsKKyAgICAvL0B9CisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvY29uc3RfaXRlcmF0b3IuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9jb25zdF9pdGVyYXRvci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxZTA0NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvY29uc3RfaXRlcmF0b3IuaHBwCkBAIC0wLDAgKzEsMTExIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHVub3JkZXJlZF9pdGVyYXRvci9jb25zdF9pdGVyYXRvci5ocHAKKyAqIENvbnRhaW5zIGFuIGl0ZXJhdG9yIGNsYXNzIHVzZWQgZm9yIGNvbnN0IHJhbmdpbmcgb3ZlciB0aGUgZWxlbWVudHMgb2YgdGhlCisgKiB0YWJsZS4KKyAqLworCisvLy8gQ29uc3QgcmFuZ2UtdHlwZSBpdGVyYXRvci4KK2NsYXNzIGNvbnN0X2l0ZXJhdG9yXworOiBwdWJsaWMgcG9pbnRfY29uc3RfaXRlcmF0b3JfCit7CitwdWJsaWM6CisgIC8vLyBDYXRlZ29yeS4KKyAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgIC8vLyBEaWZmZXJlbmNlIHR5cGUuCisgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgIC8vLyBJdGVyYXRvcidzIHZhbHVlIHR5cGUuCisgIHR5cGVkZWYgdmFsdWVfdHlwZV8gdmFsdWVfdHlwZTsKKworICAvLy8gSXRlcmF0b3IncyBwb2ludGVyIHR5cGUuCisgIHR5cGVkZWYgcG9pbnRlcl8gcG9pbnRlcjsKKworICAvLy8gSXRlcmF0b3IncyBjb25zdCBwb2ludGVyIHR5cGUuCisgIHR5cGVkZWYgY29uc3RfcG9pbnRlcl8gY29uc3RfcG9pbnRlcjsKKworICAvLy8gSXRlcmF0b3IncyByZWZlcmVuY2UgdHlwZS4KKyAgdHlwZWRlZiByZWZlcmVuY2VfIHJlZmVyZW5jZTsKKworICAvLy8gSXRlcmF0b3IncyBjb25zdCByZWZlcmVuY2UgdHlwZS4KKyAgdHlwZWRlZiBjb25zdF9yZWZlcmVuY2VfIGNvbnN0X3JlZmVyZW5jZTsKKworICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgY29uc3RfaXRlcmF0b3JfKCkgOiBtX3BfdGJsKDApCisgIHsgfQorCisgIC8vLyBJbmNyZW1lbnRzLgorICBjb25zdF9pdGVyYXRvcl8mCisgIG9wZXJhdG9yKysoKQorICB7CisgICAgbV9wX3RibC0+aW5jX2l0X3N0YXRlKGJhc2VfdHlwZTo6bV9wX3ZhbHVlLCBtX3Bvcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIEluY3JlbWVudHMuCisgIGNvbnN0X2l0ZXJhdG9yXworICBvcGVyYXRvcisrKGludCkKKyAgeworICAgIGNvbnN0X2l0ZXJhdG9yXyByZXQgPSogdGhpczsKKyAgICBtX3BfdGJsLT5pbmNfaXRfc3RhdGUoYmFzZV90eXBlOjptX3BfdmFsdWUsIG1fcG9zKTsKKyAgICByZXR1cm4gcmV0OworICB9CisKK3Byb3RlY3RlZDoKKyAgdHlwZWRlZiBwb2ludF9jb25zdF9pdGVyYXRvcl8gYmFzZV90eXBlOworCisgIC8qKgorICAgKiAgQ29uc3RydWN0b3IgdXNlZCBieSB0aGUgdGFibGUgdG8gaW5pdGlhdGUgdGhlIGdlbmVyYWxpemVkCisgICAqICAgICAgcG9pbnRlciBhbmQgcG9zaXRpb24gKGUuZy4sIHRoaXMgaXMgY2FsbGVkIGZyb20gd2l0aGluIGEgZmluZCgpCisgICAqICAgICAgb2YgYSB0YWJsZS4KKyAgICogKi8KKyAgY29uc3RfaXRlcmF0b3JfKGNvbnN0X3BvaW50ZXJfIHBfdmFsdWUsICBQQl9EU19HRU5fUE9TIHBvcywKKwkJICBjb25zdCBQQl9EU19DTEFTU19DX0RFQyogcF90YmwpCisgIDogcG9pbnRfY29uc3RfaXRlcmF0b3JfKHBfdmFsdWUpLCBtX3BfdGJsKHBfdGJsKSwgbV9wb3MocG9zKQorICB7IH0KKworICAvKioKKyAgICogIFBvaW50ZXIgdG8gdGhlIHRhYmxlIG9iamVjdCB3aGljaCBjcmVhdGVkIHRoZSBpdGVyYXRvciAodXNlZCBmb3IKKyAgICogICAgICBpbmNyZW1lbnRpbmcgaXRzIHBvc2l0aW9uLgorICAgKiAqLworICBjb25zdCBQQl9EU19DTEFTU19DX0RFQyogbV9wX3RibDsKKworICBQQl9EU19HRU5fUE9TIG1fcG9zOworCisgIGZyaWVuZCBjbGFzcyBQQl9EU19DTEFTU19DX0RFQzsKK307CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL2l0ZXJhdG9yLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvaXRlcmF0b3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOGJmNWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL2l0ZXJhdG9yLmhwcApAQCAtMCwwICsxLDEzMCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBpdGVyYXRvci5ocHAKKyAqIENvbnRhaW5zIGFuIGl0ZXJhdG9yXyBjbGFzcyB1c2VkIGZvciByYW5naW5nIG92ZXIgdGhlIGVsZW1lbnRzIG9mIHRoZQorICogICAgdGFibGUuCisgKi8KKworLy8vIFJhbmdlLXR5cGUgaXRlcmF0b3IuCitjbGFzcyBpdGVyYXRvcl8KKzogcHVibGljIGNvbnN0X2l0ZXJhdG9yXworeworcHVibGljOgorICAvLy8gQ2F0ZWdvcnkuCisgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAvLy8gRGlmZmVyZW5jZSB0eXBlLgorICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAvLy8gSXRlcmF0b3IncyB2YWx1ZSB0eXBlLgorICB0eXBlZGVmIHZhbHVlX3R5cGVfIHZhbHVlX3R5cGU7CisKKyAgLy8vIEl0ZXJhdG9yJ3MgcG9pbnRlciB0eXBlLgorICB0eXBlZGVmIHBvaW50ZXJfIHBvaW50ZXI7CisKKyAgLy8vIEl0ZXJhdG9yJ3MgY29uc3QgcG9pbnRlciB0eXBlLgorICB0eXBlZGVmIGNvbnN0X3BvaW50ZXJfIGNvbnN0X3BvaW50ZXI7CisKKyAgLy8vIEl0ZXJhdG9yJ3MgcmVmZXJlbmNlIHR5cGUuCisgIHR5cGVkZWYgcmVmZXJlbmNlXyByZWZlcmVuY2U7CisKKyAgLy8vIEl0ZXJhdG9yJ3MgY29uc3QgcmVmZXJlbmNlIHR5cGUuCisgIHR5cGVkZWYgY29uc3RfcmVmZXJlbmNlXyBjb25zdF9yZWZlcmVuY2U7CisKKyAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgIGlubGluZQorICBpdGVyYXRvcl8oKQorICA6IGNvbnN0X2l0ZXJhdG9yXygwLCBQQl9EU19HRU5fUE9TKCksIDApIHsgfQorCisgIC8vLyBDb252ZXJzaW9uIHRvIGEgcG9pbnQtdHlwZSBpdGVyYXRvci4KKyAgaW5saW5lCisgIG9wZXJhdG9yIHBvaW50X2l0ZXJhdG9yXygpCisgIHsgcmV0dXJuIHBvaW50X2l0ZXJhdG9yXyhjb25zdF9jYXN0PHBvaW50ZXI+KGNvbnN0X2l0ZXJhdG9yXzo6bV9wX3ZhbHVlKSk7IH0KKworICAvLy8gQ29udmVyc2lvbiB0byBhIHBvaW50LXR5cGUgaXRlcmF0b3IuCisgIGlubGluZQorICBvcGVyYXRvciBjb25zdCBwb2ludF9pdGVyYXRvcl8oKSBjb25zdAorICB7IHJldHVybiBwb2ludF9pdGVyYXRvcl8oY29uc3RfY2FzdDxwb2ludGVyPihjb25zdF9pdGVyYXRvcl86Om1fcF92YWx1ZSkpOyB9CisKKyAgLy8vIEFjY2Vzcy4KKyAgcG9pbnRlcgorICBvcGVyYXRvci0+KCkgY29uc3QKKyAgeworICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChiYXNlX3R5cGU6Om1fcF92YWx1ZSAhPSAwKTsKKyAgICByZXR1cm4gKGNvbnN0X2Nhc3Q8cG9pbnRlcj4oYmFzZV90eXBlOjptX3BfdmFsdWUpKTsKKyAgfQorCisgIC8vLyBBY2Nlc3MuCisgIHJlZmVyZW5jZQorICBvcGVyYXRvciooKSBjb25zdAorICB7CisgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfdHlwZTo6bV9wX3ZhbHVlICE9IDApOworICAgIHJldHVybiAoY29uc3RfY2FzdDxyZWZlcmVuY2U+KCpiYXNlX3R5cGU6Om1fcF92YWx1ZSkpOworICB9CisKKyAgLy8vIEluY3JlbWVudHMuCisgIGl0ZXJhdG9yXyYKKyAgb3BlcmF0b3IrKygpCisgIHsKKyAgICBiYXNlX3R5cGU6Om1fcF90YmwtPmluY19pdF9zdGF0ZShiYXNlX3R5cGU6Om1fcF92YWx1ZSwgYmFzZV90eXBlOjptX3Bvcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIEluY3JlbWVudHMuCisgIGl0ZXJhdG9yXworICBvcGVyYXRvcisrKGludCkKKyAgeworICAgIGl0ZXJhdG9yXyByZXQgPSogdGhpczsKKyAgICBiYXNlX3R5cGU6Om1fcF90YmwtPmluY19pdF9zdGF0ZShiYXNlX3R5cGU6Om1fcF92YWx1ZSwgYmFzZV90eXBlOjptX3Bvcyk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3JfIGJhc2VfdHlwZTsKKworICAvKioKKyAgICogIENvbnN0cnVjdG9yIHVzZWQgYnkgdGhlIHRhYmxlIHRvIGluaXRpYXRlIHRoZSBnZW5lcmFsaXplZAorICAgKiAgICAgIHBvaW50ZXIgYW5kIHBvc2l0aW9uIChlLmcuLCB0aGlzIGlzIGNhbGxlZCBmcm9tIHdpdGhpbiBhIGZpbmQoKQorICAgKiAgICAgIG9mIGEgdGFibGUuCisgICAqICovCisgIGlubGluZQorICBpdGVyYXRvcl8ocG9pbnRlciBwX3ZhbHVlLCBQQl9EU19HRU5fUE9TIHBvcywgUEJfRFNfQ0xBU1NfQ19ERUMqIHBfdGJsKQorICA6IGNvbnN0X2l0ZXJhdG9yXyhwX3ZhbHVlLCBwb3MsIHBfdGJsKQorICB7IH0KKworICBmcmllbmQgY2xhc3MgUEJfRFNfQ0xBU1NfQ19ERUM7Cit9OwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9wb2ludF9jb25zdF9pdGVyYXRvci5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL3BvaW50X2NvbnN0X2l0ZXJhdG9yLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmIxODNhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9wb2ludF9jb25zdF9pdGVyYXRvci5ocHAKQEAgLTAsMCArMSwxMzMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdW5vcmRlcmVkX2l0ZXJhdG9yL3BvaW50X2NvbnN0X2l0ZXJhdG9yLmhwcAorICogQ29udGFpbnMgYW4gaXRlcmF0b3IgY2xhc3MgcmV0dXJuZWQgYnkgdGhlIHRhYmxlcycgY29uc3QgZmluZCBhbmQgaW5zZXJ0CisgKiAgICAgbWV0aG9kcy4KKyAqLworCitjbGFzcyBwb2ludF9pdGVyYXRvcl87CisKKy8vLyBDb25zdCBwb2ludC10eXBlIGl0ZXJhdG9yLgorY2xhc3MgcG9pbnRfY29uc3RfaXRlcmF0b3JfCit7CitwdWJsaWM6CisgIC8vLyBDYXRlZ29yeS4KKyAgdHlwZWRlZiB0cml2aWFsX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAvLy8gRGlmZmVyZW5jZSB0eXBlLgorICB0eXBlZGVmIHRyaXZpYWxfaXRlcmF0b3JfZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAvLy8gSXRlcmF0b3IncyB2YWx1ZSB0eXBlLgorICB0eXBlZGVmIHZhbHVlX3R5cGVfIHZhbHVlX3R5cGU7CisKKyAgLy8vIEl0ZXJhdG9yJ3MgcG9pbnRlciB0eXBlLgorICB0eXBlZGVmIHBvaW50ZXJfIHBvaW50ZXI7CisKKyAgLy8vIEl0ZXJhdG9yJ3MgY29uc3QgcG9pbnRlciB0eXBlLgorICB0eXBlZGVmIGNvbnN0X3BvaW50ZXJfIGNvbnN0X3BvaW50ZXI7CisKKyAgLy8vIEl0ZXJhdG9yJ3MgcmVmZXJlbmNlIHR5cGUuCisgIHR5cGVkZWYgcmVmZXJlbmNlXyByZWZlcmVuY2U7CisKKyAgLy8vIEl0ZXJhdG9yJ3MgY29uc3QgcmVmZXJlbmNlIHR5cGUuCisgIHR5cGVkZWYgY29uc3RfcmVmZXJlbmNlXyBjb25zdF9yZWZlcmVuY2U7CisKKyAgaW5saW5lCisgIHBvaW50X2NvbnN0X2l0ZXJhdG9yXyhjb25zdF9wb2ludGVyIHBfdmFsdWUpIDogbV9wX3ZhbHVlKHBfdmFsdWUpCisgIHsgfQorCisgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICBpbmxpbmUKKyAgcG9pbnRfY29uc3RfaXRlcmF0b3JfKCkgOiBtX3BfdmFsdWUoMCkKKyAgeyB9CisKKyAgLy8vIENvcHkgY29uc3RydWN0b3IuCisgIGlubGluZQorICBwb2ludF9jb25zdF9pdGVyYXRvcl8oY29uc3QgcG9pbnRfY29uc3RfaXRlcmF0b3JfJiBvdGhlcikKKyAgOiBtX3BfdmFsdWUob3RoZXIubV9wX3ZhbHVlKQorICB7IH0KKworICAvLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgaW5saW5lCisgIHBvaW50X2NvbnN0X2l0ZXJhdG9yXyhjb25zdCBwb2ludF9pdGVyYXRvcl8mIG90aGVyKQorICA6IG1fcF92YWx1ZShvdGhlci5tX3BfdmFsdWUpCisgIHsgfQorCisgIC8vLyBBY2Nlc3MuCisgIGNvbnN0X3BvaW50ZXIKKyAgb3BlcmF0b3ItPigpIGNvbnN0CisgIHsKKyAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX3ZhbHVlICE9IDApOworICAgIHJldHVybiBtX3BfdmFsdWU7CisgIH0KKworICAvLy8gQWNjZXNzLgorICBjb25zdF9yZWZlcmVuY2UKKyAgb3BlcmF0b3IqKCkgY29uc3QKKyAgeworICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfdmFsdWUgIT0gMCk7CisgICAgcmV0dXJuICptX3BfdmFsdWU7CisgIH0KKworICAvLy8gQ29tcGFyZXMgY29udGVudCB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgIGJvb2wKKyAgb3BlcmF0b3I9PShjb25zdCBwb2ludF9pdGVyYXRvcl8mIG90aGVyKSBjb25zdAorICB7IHJldHVybiBtX3BfdmFsdWUgPT0gb3RoZXIubV9wX3ZhbHVlOyB9CisKKyAgLy8vIENvbXBhcmVzIGNvbnRlbnQgdG8gYSBkaWZmZXJlbnQgaXRlcmF0b3Igb2JqZWN0LgorICBib29sCisgIG9wZXJhdG9yPT0oY29uc3QgcG9pbnRfY29uc3RfaXRlcmF0b3JfJiBvdGhlcikgY29uc3QKKyAgeyByZXR1cm4gbV9wX3ZhbHVlID09IG90aGVyLm1fcF92YWx1ZTsgfQorCisgIC8vLyBDb21wYXJlcyBjb250ZW50IChuZWdhdGl2ZWx5KSB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgIGJvb2wKKyAgb3BlcmF0b3IhPShjb25zdCBwb2ludF9pdGVyYXRvcl8mIG90aGVyKSBjb25zdAorICB7IHJldHVybiBtX3BfdmFsdWUgIT0gb3RoZXIubV9wX3ZhbHVlOyB9CisKKyAgLy8vIENvbXBhcmVzIGNvbnRlbnQgKG5lZ2F0aXZlbHkpIHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yIG9iamVjdC4KKyAgYm9vbAorICBvcGVyYXRvciE9KGNvbnN0IHBvaW50X2NvbnN0X2l0ZXJhdG9yXyYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIG1fcF92YWx1ZSAhPSBvdGhlci5tX3BfdmFsdWU7IH0KKworcHJvdGVjdGVkOgorICBjb25zdF9wb2ludGVyIG1fcF92YWx1ZTsKKworICBmcmllbmQgY2xhc3MgcG9pbnRfaXRlcmF0b3JfOworCisgIGZyaWVuZCBjbGFzcyBQQl9EU19DTEFTU19DX0RFQzsKK307CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvcG9pbnRfaXRlcmF0b3IuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9wb2ludF9pdGVyYXRvci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYyMzg2MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvcG9pbnRfaXRlcmF0b3IuaHBwCkBAIC0wLDAgKzEsMTI2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBvaW50X2l0ZXJhdG9yLmhwcAorICogQ29udGFpbnMgYW4gaXRlcmF0b3IgY2xhc3MgcmV0dXJuZWQgYnkgdGhlIHRhYmxlcycgZmluZCBhbmQgaW5zZXJ0CisgKiAgICAgbWV0aG9kcy4KKyAqLworCisvLy8gRmluZCB0eXBlIGl0ZXJhdG9yLgorY2xhc3MgcG9pbnRfaXRlcmF0b3JfCit7CitwdWJsaWM6CisgIC8vLyBDYXRlZ29yeS4KKyAgdHlwZWRlZiB0cml2aWFsX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAvLy8gRGlmZmVyZW5jZSB0eXBlLgorICB0eXBlZGVmIHRyaXZpYWxfaXRlcmF0b3JfZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAvLy8gSXRlcmF0b3IncyB2YWx1ZSB0eXBlLgorICB0eXBlZGVmIHZhbHVlX3R5cGVfIHZhbHVlX3R5cGU7CisKKyAgLy8vIEl0ZXJhdG9yJ3MgcG9pbnRlciB0eXBlLgorICB0eXBlZGVmIHBvaW50ZXJfIHBvaW50ZXI7CisKKyAgLy8vIEl0ZXJhdG9yJ3MgY29uc3QgcG9pbnRlciB0eXBlLgorICB0eXBlZGVmIGNvbnN0X3BvaW50ZXJfIGNvbnN0X3BvaW50ZXI7CisKKyAgLy8vIEl0ZXJhdG9yJ3MgcmVmZXJlbmNlIHR5cGUuCisgIHR5cGVkZWYgcmVmZXJlbmNlXyByZWZlcmVuY2U7CisKKyAgLy8vIEl0ZXJhdG9yJ3MgY29uc3QgcmVmZXJlbmNlIHR5cGUuCisgIHR5cGVkZWYgY29uc3RfcmVmZXJlbmNlXyBjb25zdF9yZWZlcmVuY2U7CisKKyAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgIGlubGluZQorICBwb2ludF9pdGVyYXRvcl8oKQorICA6IG1fcF92YWx1ZSgwKQorICB7IH0KKworICAvLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgaW5saW5lCisgIHBvaW50X2l0ZXJhdG9yXyhjb25zdCBwb2ludF9pdGVyYXRvcl8mIG90aGVyKQorICA6IG1fcF92YWx1ZShvdGhlci5tX3BfdmFsdWUpCisgIHsgfQorCisgIC8vLyBBY2Nlc3MuCisgIHBvaW50ZXIKKyAgb3BlcmF0b3ItPigpIGNvbnN0CisgIHsKKyAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX3ZhbHVlICE9IDApOworICAgIHJldHVybiAobV9wX3ZhbHVlKTsKKyAgfQorCisgIC8vLyBBY2Nlc3MuCisgIHJlZmVyZW5jZQorICBvcGVyYXRvciooKSBjb25zdAorICB7CisgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF92YWx1ZSAhPSAwKTsKKyAgICByZXR1cm4gKCptX3BfdmFsdWUpOworICB9CisKKyAgLy8vIENvbXBhcmVzIGNvbnRlbnQgdG8gYSBkaWZmZXJlbnQgaXRlcmF0b3Igb2JqZWN0LgorICBib29sCisgIG9wZXJhdG9yPT0oY29uc3QgcG9pbnRfaXRlcmF0b3JfJiBvdGhlcikgY29uc3QKKyAgeyByZXR1cm4gbV9wX3ZhbHVlID09IG90aGVyLm1fcF92YWx1ZTsgfQorCisgIC8vLyBDb21wYXJlcyBjb250ZW50IHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yIG9iamVjdC4KKyAgYm9vbAorICBvcGVyYXRvcj09KGNvbnN0IHBvaW50X2NvbnN0X2l0ZXJhdG9yXyYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIG1fcF92YWx1ZSA9PSBvdGhlci5tX3BfdmFsdWU7IH0KKworICAvLy8gQ29tcGFyZXMgY29udGVudCB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgIGJvb2wKKyAgb3BlcmF0b3IhPShjb25zdCBwb2ludF9pdGVyYXRvcl8mIG90aGVyKSBjb25zdAorICB7IHJldHVybiBtX3BfdmFsdWUgIT0gb3RoZXIubV9wX3ZhbHVlOyB9CisKKyAgLy8vIENvbXBhcmVzIGNvbnRlbnQgKG5lZ2F0aXZlbHkpIHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yIG9iamVjdC4KKyAgYm9vbAorICBvcGVyYXRvciE9KGNvbnN0IHBvaW50X2NvbnN0X2l0ZXJhdG9yXyYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIG1fcF92YWx1ZSAhPSBvdGhlci5tX3BfdmFsdWU7IH0KKworICBpbmxpbmUKKyAgcG9pbnRfaXRlcmF0b3JfKHBvaW50ZXIgcF92YWx1ZSkgOiBtX3BfdmFsdWUocF92YWx1ZSkKKyAgeyB9CisKK3Byb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIHBvaW50X2NvbnN0X2l0ZXJhdG9yXzsKKworICBmcmllbmQgY2xhc3MgUEJfRFNfQ0xBU1NfQ19ERUM7CisKK3Byb3RlY3RlZDoKKyAgcG9pbnRlciBtX3BfdmFsdWU7Cit9OwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvZXhjZXB0aW9uLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2V4Y2VwdGlvbi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhNDM1NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2V4Y2VwdGlvbi5ocHAKQEAgLTAsMCArMSw5MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBleGNlcHRpb24uaHBwCisgKiBDb250YWlucyBleGNlcHRpb24gY2xhc3Nlcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX0VYQ0VQVElPTl9IUFAKKyNkZWZpbmUgUEJfRFNfRVhDRVBUSU9OX0hQUAorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgLyoqCisgICAqICBAZGVmZ3JvdXAgZXhjZXB0aW9ucy1wYmRzIEV4Y2VwdGlvbnMKKyAgICogIEBpbmdyb3VwIHBiZHMKKyAgICogIEB7CisgICAqLworCisgIC8vLyBCYXNlIGNsYXNzIGZvciBleGNlcHRpb25zLgorICBzdHJ1Y3QgY29udGFpbmVyX2Vycm9yIDogcHVibGljIHN0ZDo6bG9naWNfZXJyb3IKKyAgeworICAgIGNvbnRhaW5lcl9lcnJvcigpCisgICAgOiBzdGQ6OmxvZ2ljX2Vycm9yKF9fTigiX19nbnVfcGJkczo6Y29udGFpbmVyX2Vycm9yIikpIHsgfQorICB9OworCisgIC8vLyBBbiBlbnRyeSBjYW5ub3QgYmUgaW5zZXJ0ZWQgaW50byBhIGNvbnRhaW5lciBvYmplY3QgZm9yIGxvZ2ljYWwKKyAgLy8vIHJlYXNvbnMgKG5vdCwgZS5nLiwgaWYgbWVtb3J5IGlzIHVuYWJ2YWlsYWJsZSwgaW4gd2hpY2ggY2FzZQorICAvLy8gdGhlIGFsbG9jYXRvcl90eXBlJ3MgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duKS4KKyAgc3RydWN0IGluc2VydF9lcnJvciA6IHB1YmxpYyBjb250YWluZXJfZXJyb3IgeyB9OworCisgIC8vLyBBIGpvaW4gY2Fubm90IGJlIHBlcmZvcm1lZCBsb2dpY2FsIHJlYXNvbnMgKGkuZS4sIHRoZSByYW5nZXMgb2YKKyAgLy8vIHRoZSB0d28gY29udGFpbmVyIG9iamVjdHMgYmVpbmcgam9pbmVkIG92ZXJsYXBzLgorICBzdHJ1Y3Qgam9pbl9lcnJvciA6IHB1YmxpYyBjb250YWluZXJfZXJyb3IgeyB9OworCisgIC8vLyBBIGNvbnRhaW5lciBjYW5ub3QgYmUgcmVzaXplZC4KKyAgc3RydWN0IHJlc2l6ZV9lcnJvciA6IHB1YmxpYyBjb250YWluZXJfZXJyb3IgeyB9OworCisgIGlubGluZSB2b2lkCisgIF9fdGhyb3dfY29udGFpbmVyX2Vycm9yKCkKKyAgeyBfR0xJQkNYWF9USFJPV19PUl9BQk9SVChjb250YWluZXJfZXJyb3IoKSk7IH0KKworICBpbmxpbmUgdm9pZAorICBfX3Rocm93X2luc2VydF9lcnJvcigpCisgIHsgX0dMSUJDWFhfVEhST1dfT1JfQUJPUlQoaW5zZXJ0X2Vycm9yKCkpOyB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190aHJvd19qb2luX2Vycm9yKCkKKyAgeyBfR0xJQkNYWF9USFJPV19PUl9BQk9SVChqb2luX2Vycm9yKCkpOyB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190aHJvd19yZXNpemVfZXJyb3IoKQorICB7IF9HTElCQ1hYX1RIUk9XX09SX0FCT1JUKHJlc2l6ZV9lcnJvcigpKTsgfQorICAvL0B9Cit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvaGFzaF9wb2xpY3kuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvaGFzaF9wb2xpY3kuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYTRkMzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9oYXNoX3BvbGljeS5ocHAKQEAgLTAsMCArMSw2MTcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaGFzaF9wb2xpY3kuaHBwCisgKiBDb250YWlucyBoYXNoLXJlbGF0ZWQgcG9saWNpZXMuCisgKi8KKworI2lmbmRlZiBQQl9EU19IQVNIX1BPTElDWV9IUFAKKyNkZWZpbmUgUEJfRFNfSEFTSF9QT0xJQ1lfSFBQCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2V4Y2VwdGlvbi5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlX3V0aWxzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vbWFza19iYXNlZF9yYW5nZV9oYXNoaW5nLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vbW9kX2Jhc2VkX3JhbmdlX2hhc2hpbmcuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9oYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXJfc2l6ZV9iYXNlLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgdGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9UeXBlPgorI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBsaW5lYXJfcHJvYmVfZm48U2l6ZV9UeXBlPgorCisgIC8vLyBBIHByb2JlIHNlcXVlbmNlIHBvbGljeSB1c2luZyBmaXhlZCBpbmNyZW1lbnRzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGUgPSBzdGQ6OnNpemVfdD4KKyAgY2xhc3MgbGluZWFyX3Byb2JlX2ZuCisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgU2l6ZV9UeXBlIHNpemVfdHlwZTsKKworICAgIHZvaWQKKyAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vLyBSZXR1cm5zIHRoZSBpLXRoIG9mZnNldCBmcm9tIHRoZSBoYXNoIHZhbHVlLgorICAgIGlubGluZSBzaXplX3R5cGUKKyAgICBvcGVyYXRvcigpKHNpemVfdHlwZSBpKSBjb25zdDsKKyAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9saW5lYXJfcHJvYmVfZm5faW1wLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGU+CisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIHF1YWRyYXRpY19wcm9iZV9mbjxTaXplX1R5cGU+CisKKyAgLy8vIEEgcHJvYmUgc2VxdWVuY2UgcG9saWN5IHVzaW5nIHNxdWFyZSBpbmNyZW1lbnRzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGUgPSBzdGQ6OnNpemVfdD4KKyAgY2xhc3MgcXVhZHJhdGljX3Byb2JlX2ZuCisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgU2l6ZV9UeXBlIHNpemVfdHlwZTsKKworICAgIHZvaWQKKyAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vLyBSZXR1cm5zIHRoZSBpLXRoIG9mZnNldCBmcm9tIHRoZSBoYXNoIHZhbHVlLgorICAgIGlubGluZSBzaXplX3R5cGUKKyAgICBvcGVyYXRvcigpKHNpemVfdHlwZSBpKSBjb25zdDsKKyAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9xdWFkcmF0aWNfcHJvYmVfZm5faW1wLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGU+CisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIGRpcmVjdF9tYXNrX3JhbmdlX2hhc2hpbmc8U2l6ZV9UeXBlPgorCisgIC8vLyBBIG1hc2sgcmFuZ2UtaGFzaGluZyBjbGFzcyAodXNlcyBhIGJpdG1hc2spLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGUgPSBzdGQ6OnNpemVfdD4KKyAgY2xhc3MgZGlyZWN0X21hc2tfcmFuZ2VfaGFzaGluZworICA6IHB1YmxpYyBkZXRhaWw6Om1hc2tfYmFzZWRfcmFuZ2VfaGFzaGluZzxTaXplX1R5cGU+CisgIHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIGRldGFpbDo6bWFza19iYXNlZF9yYW5nZV9oYXNoaW5nPFNpemVfVHlwZT4gbWFza19iYXNlZF9iYXNlOworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFNpemVfVHlwZSBzaXplX3R5cGU7CisKKyAgICB2b2lkCisgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpOworCisgIHByb3RlY3RlZDoKKyAgICB2b2lkCisgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIHNpemUpOworCisgICAgLy8vIFRyYW5zZm9ybXMgdGhlIF9faGFzaCB2YWx1ZSBoYXNoIGludG8gYSByYW5nZWQtaGFzaCB2YWx1ZQorICAgIC8vLyAodXNpbmcgYSBiaXQtbWFzaykuCisgICAgaW5saW5lIHNpemVfdHlwZQorICAgIG9wZXJhdG9yKCkoc2l6ZV90eXBlIGhhc2gpIGNvbnN0OworICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL2RpcmVjdF9tYXNrX3JhbmdlX2hhc2hpbmdfaW1wLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGU+CisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIGRpcmVjdF9tb2RfcmFuZ2VfaGFzaGluZzxTaXplX1R5cGU+CisKKyAgLy8vIEEgbW9kIHJhbmdlLWhhc2hpbmcgY2xhc3MgKHVzZXMgdGhlIG1vZHVsbyBmdW5jdGlvbikuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZSA9IHN0ZDo6c2l6ZV90PgorICBjbGFzcyBkaXJlY3RfbW9kX3JhbmdlX2hhc2hpbmcKKyAgOiBwdWJsaWMgZGV0YWlsOjptb2RfYmFzZWRfcmFuZ2VfaGFzaGluZzxTaXplX1R5cGU+CisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgU2l6ZV9UeXBlIHNpemVfdHlwZTsKKworICAgIHZvaWQKKyAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQKKyAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUgc2l6ZSk7CisKKyAgICAvLy8gVHJhbnNmb3JtcyB0aGUgX19oYXNoIHZhbHVlIGhhc2ggaW50byBhIHJhbmdlZC1oYXNoIHZhbHVlCisgICAgLy8vICh1c2luZyBhIG1vZHVsbyBvcGVyYXRpb24pLgorICAgIGlubGluZSBzaXplX3R5cGUKKyAgICBvcGVyYXRvcigpKHNpemVfdHlwZSBoYXNoKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIHR5cGVkZWYgZGV0YWlsOjptb2RfYmFzZWRfcmFuZ2VfaGFzaGluZzxzaXplX3R5cGU+IG1vZF9iYXNlZF9iYXNlOworICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL2RpcmVjdF9tb2RfcmFuZ2VfaGFzaGluZ19pbXAuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIHRlbXBsYXRlPGJvb2wgRXh0ZXJuYWxfTG9hZF9BY2Nlc3MsIHR5cGVuYW1lIFNpemVfVHlwZT4KKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyPEV4dGVybmFsX0xvYWRfQWNjZXNzLCBTaXplX1R5cGU+CisjZGVmaW5lIFBCX0RTX1NJWkVfQkFTRV9DX0RFQyBkZXRhaWw6Omhhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcl9zaXplX2Jhc2U8U2l6ZV9UeXBlLCBFeHRlcm5hbF9Mb2FkX0FjY2Vzcz4KKworICAvLy8gQSByZXNpemUgdHJpZ2dlciBwb2xpY3kgYmFzZWQgb24gYSBsb2FkIGNoZWNrLiBJdCBrZWVwcyB0aGUKKyAgLy8vIGxvYWQgZmFjdG9yIGJldHdlZW4gc29tZSBsb2FkIGZhY3RvcnMgbG9hZF9taW4gYW5kIGxvYWRfbWF4LgorICB0ZW1wbGF0ZTxib29sIEV4dGVybmFsX0xvYWRfQWNjZXNzID0gZmFsc2UsIHR5cGVuYW1lIFNpemVfVHlwZSA9IHN0ZDo6c2l6ZV90PgorICBjbGFzcyBoYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXIgOiBwcml2YXRlIFBCX0RTX1NJWkVfQkFTRV9DX0RFQworICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFNpemVfVHlwZSBzaXplX3R5cGU7CisKKyAgICBlbnVtCisgICAgICB7CisJLy8vIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBsb2FkIGZhY3RvciBjYW4gYmUgYWNjZXNzZWQKKwkvLy8gZXh0ZXJuYWxseS4gVGhlIHR3byBvcHRpb25zIGhhdmUgZGlmZmVyZW50IHRyYWRlLW9mZnMgaW4KKwkvLy8gdGVybXMgb2YgZmxleGliaWxpdHksIGdlbmVyaWNpdHksIGFuZCBlbmNhcHN1bGF0aW9uLgorCWV4dGVybmFsX2xvYWRfYWNjZXNzID0gRXh0ZXJuYWxfTG9hZF9BY2Nlc3MKKyAgICAgIH07CisKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvciwgb3IgY29uc3RydWN0b3IgdGFraW5nIGxvYWRfbWluIGFuZAorICAgIC8vLyBsb2FkX21heCBsb2FkIGZhY3RvcnMgYmV0d2VlbiB3aGljaCB0aGlzIHBvbGljeSB3aWxsIGtlZXAgdGhlCisgICAgLy8vIGFjdHVhbCBsb2FkLgorICAgIGhhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcihmbG9hdCBsb2FkX21pbiA9IDAuMTI1LAorCQkJCSAgIGZsb2F0IGxvYWRfbWF4ID0gMC41KTsKKworICAgIHZvaWQKKyAgICBzd2FwKGhhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlciYgb3RoZXIpOworCisgICAgdmlydHVhbAorICAgIH5oYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXIoKTsKKworICAgIC8vLyBSZXR1cm5zIGEgcGFpciBvZiB0aGUgbWluaW1hbCBhbmQgbWF4aW1hbCBsb2FkcywgcmVzcGVjdGl2ZWx5LgorICAgIGlubGluZSBzdGQ6OnBhaXI8ZmxvYXQsIGZsb2F0PgorICAgIGdldF9sb2FkcygpIGNvbnN0OworCisgICAgLy8vIFNldHMgdGhlIGxvYWRzIHRocm91Z2ggYSBwYWlyIG9mIHRoZSBtaW5pbWFsIGFuZCBtYXhpbWFsCisgICAgLy8vIGxvYWRzLCByZXNwZWN0aXZlbHkuCisgICAgdm9pZAorICAgIHNldF9sb2FkcyhzdGQ6OnBhaXI8ZmxvYXQsIGZsb2F0PiBsb2FkX3BhaXIpOworCisgIHByb3RlY3RlZDoKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9pbnNlcnRfc2VhcmNoX3N0YXJ0KCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9pbnNlcnRfc2VhcmNoX2NvbGxpc2lvbigpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2ZpbmRfc2VhcmNoX3N0YXJ0KCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9maW5kX3NlYXJjaF9jb2xsaXNpb24oKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2ZpbmRfc2VhcmNoX2VuZCgpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZXJhc2Vfc2VhcmNoX3N0YXJ0KCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9lcmFzZV9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7CisKKyAgICAvLy8gTm90aWZpZXMgYW4gZWxlbWVudCB3YXMgaW5zZXJ0ZWQuIFRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcworICAgIC8vLyBpbiB0aGUgdGFibGUgaXMgbnVtX2VudHJpZXMuCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfaW5zZXJ0ZWQoc2l6ZV90eXBlIG51bV9lbnRyaWVzKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2VyYXNlZChzaXplX3R5cGUgbnVtX2VudHJpZXMpOworCisgICAgLy8vIE5vdGlmaWVzIHRoZSB0YWJsZSB3YXMgY2xlYXJlZC4KKyAgICB2b2lkCisgICAgbm90aWZ5X2NsZWFyZWQoKTsKKworICAgIC8vLyBOb3RpZmllcyB0aGUgdGFibGUgd2FzIHJlc2l6ZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBvYmplY3QncworICAgIC8vLyBzaWduaWZ5aW5nIHRoYXQgYSByZXNpemUgaXMgbmVlZGVkLgorICAgIHZvaWQKKyAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUgbmV3X3NpemUpOworCisgICAgdm9pZAorICAgIG5vdGlmeV9leHRlcm5hbGx5X3Jlc2l6ZWQoc2l6ZV90eXBlIG5ld19zaXplKTsKKworICAgIGlubGluZSBib29sCisgICAgaXNfcmVzaXplX25lZWRlZCgpIGNvbnN0OworCisgICAgaW5saW5lIGJvb2wKKyAgICBpc19ncm93X25lZWRlZChzaXplX3R5cGUgc2l6ZSwgc2l6ZV90eXBlIG51bV9lbnRyaWVzKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIHZpcnR1YWwgdm9pZAorICAgIGRvX3Jlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUpOworCisgICAgdHlwZWRlZiBQQl9EU19TSVpFX0JBU0VfQ19ERUMgc2l6ZV9iYXNlOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICB2b2lkCisgICAgYXNzZXJ0X3ZhbGlkKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKSBjb25zdDsKKyNlbmRpZgorCisgICAgZmxvYXQgCW1fbG9hZF9taW47CisgICAgZmxvYXQgCW1fbG9hZF9tYXg7CisgICAgc2l6ZV90eXBlIAltX25leHRfc2hyaW5rX3NpemU7CisgICAgc2l6ZV90eXBlIAltX25leHRfZ3Jvd19zaXplOworICAgIGJvb2wgCW1fcmVzaXplX25lZWRlZDsKKyAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9oYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXJfaW1wLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKyN1bmRlZiBQQl9EU19TSVpFX0JBU0VfQ19ERUMKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyB0ZW1wbGF0ZTxib29sIEV4dGVybmFsX0xvYWRfQWNjZXNzLCB0eXBlbmFtZSBTaXplX1R5cGU+CisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIGNjX2hhc2hfbWF4X2NvbGxpc2lvbl9jaGVja19yZXNpemVfdHJpZ2dlcjxFeHRlcm5hbF9Mb2FkX0FjY2VzcywgU2l6ZV9UeXBlPgorCisgIC8vLyBBIHJlc2l6ZSB0cmlnZ2VyIHBvbGljeSBiYXNlZCBvbiBjb2xsaXNpb24gY2hlY2tzLiBJdCBrZWVwcyB0aGUKKyAgLy8vIHNpbXVsYXRlZCBsb2FkIGZhY3RvciBsb3dlciB0aGFuIHNvbWUgZ2l2ZW4gbG9hZCBmYWN0b3IuCisgIHRlbXBsYXRlPGJvb2wgRXh0ZXJuYWxfTG9hZF9BY2Nlc3MgPSBmYWxzZSwgdHlwZW5hbWUgU2l6ZV9UeXBlID0gc3RkOjpzaXplX3Q+CisgIGNsYXNzIGNjX2hhc2hfbWF4X2NvbGxpc2lvbl9jaGVja19yZXNpemVfdHJpZ2dlcgorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFNpemVfVHlwZSAJc2l6ZV90eXBlOworCisgICAgZW51bQorICAgICAgeworCS8vLyBTcGVjaWZpZXMgd2hldGhlciB0aGUgbG9hZCBmYWN0b3IgY2FuIGJlIGFjY2Vzc2VkCisJLy8vIGV4dGVybmFsbHkuIFRoZSB0d28gb3B0aW9ucyBoYXZlIGRpZmZlcmVudCB0cmFkZS1vZmZzIGluCisJLy8vIHRlcm1zIG9mIGZsZXhpYmlsaXR5LCBnZW5lcmljaXR5LCBhbmQgZW5jYXBzdWxhdGlvbi4KKwlleHRlcm5hbF9sb2FkX2FjY2VzcyA9IEV4dGVybmFsX0xvYWRfQWNjZXNzCisgICAgICB9OworCisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IsIG9yIGNvbnN0cnVjdG9yIHRha2luZyBsb2FkLCBhIF9fbG9hZAorICAgIC8vLyBmYWN0b3Igd2hpY2ggaXQgd2lsbCBhdHRlbXB0IHRvIG1haW50YWluLgorICAgIGNjX2hhc2hfbWF4X2NvbGxpc2lvbl9jaGVja19yZXNpemVfdHJpZ2dlcihmbG9hdCBsb2FkID0gMC41KTsKKworICAgIHZvaWQKKyAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgY3VycmVudCBsb2FkLgorICAgIGlubGluZSBmbG9hdAorICAgIGdldF9sb2FkKCkgY29uc3Q7CisKKyAgICAvLy8gU2V0cyB0aGUgbG9hZDsgZG9lcyBub3QgcmVzaXplIHRoZSBjb250YWluZXIuCisgICAgdm9pZAorICAgIHNldF9sb2FkKGZsb2F0IGxvYWQpOworCisgIHByb3RlY3RlZDoKKyAgICAvLy8gTm90aWZpZXMgYW4gaW5zZXJ0IHNlYXJjaCBzdGFydGVkLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2luc2VydF9zZWFyY2hfc3RhcnQoKTsKKworICAgIC8vLyBOb3RpZmllcyBhIHNlYXJjaCBlbmNvdW50ZXJlZCBhIGNvbGxpc2lvbi4KKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9pbnNlcnRfc2VhcmNoX2NvbGxpc2lvbigpOworCisgICAgLy8vIE5vdGlmaWVzIGEgc2VhcmNoIGVuZGVkLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2luc2VydF9zZWFyY2hfZW5kKCk7CisKKyAgICAvLy8gTm90aWZpZXMgYSBmaW5kIHNlYXJjaCBzdGFydGVkLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2ZpbmRfc2VhcmNoX3N0YXJ0KCk7CisKKyAgICAvLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5jb3VudGVyZWQgYSBjb2xsaXNpb24uCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZmluZF9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgICAvLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5kZWQuCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZmluZF9zZWFyY2hfZW5kKCk7CisKKyAgICAvLy8gTm90aWZpZXMgYW4gZXJhc2Ugc2VhcmNoIHN0YXJ0ZWQuCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZXJhc2Vfc2VhcmNoX3N0YXJ0KCk7CisKKyAgICAvLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5jb3VudGVyZWQgYSBjb2xsaXNpb24uCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZXJhc2Vfc2VhcmNoX2NvbGxpc2lvbigpOworCisgICAgLy8vIE5vdGlmaWVzIGEgc2VhcmNoIGVuZGVkLgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKworICAgIC8vLyBOb3RpZmllcyBhbiBlbGVtZW50IHdhcyBpbnNlcnRlZC4KKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9pbnNlcnRlZChzaXplX3R5cGUgbnVtX2VudHJpZXMpOworCisgICAgLy8vIE5vdGlmaWVzIGFuIGVsZW1lbnQgd2FzIGVyYXNlZC4KKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9lcmFzZWQoc2l6ZV90eXBlIG51bV9lbnRyaWVzKTsKKworICAgIC8vLyBOb3RpZmllcyB0aGUgdGFibGUgd2FzIGNsZWFyZWQuCisgICAgdm9pZAorICAgIG5vdGlmeV9jbGVhcmVkKCk7CisKKyAgICAvLy8gTm90aWZpZXMgdGhlIHRhYmxlIHdhcyByZXNpemVkIGFzIGEgcmVzdWx0IG9mIHRoaXMgb2JqZWN0J3MKKyAgICAvLy8gc2lnbmlmeWluZyB0aGF0IGEgcmVzaXplIGlzIG5lZWRlZC4KKyAgICB2b2lkCisgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIG5ld19zaXplKTsKKworICAgIC8vLyBOb3RpZmllcyB0aGUgdGFibGUgd2FzIHJlc2l6ZWQgZXh0ZXJuYWxseS4KKyAgICB2b2lkCisgICAgbm90aWZ5X2V4dGVybmFsbHlfcmVzaXplZChzaXplX3R5cGUgbmV3X3NpemUpOworCisgICAgLy8vIFF1ZXJpZXMgd2hldGhlciBhIHJlc2l6ZSBpcyBuZWVkZWQuCisgICAgaW5saW5lIGJvb2wKKyAgICBpc19yZXNpemVfbmVlZGVkKCkgY29uc3Q7CisKKyAgICAvLy8gUXVlcmllcyB3aGV0aGVyIGEgZ3JvdyBpcyBuZWVkZWQuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmx5CisgICAgLy8vIGlmIHRoaXMgb2JqZWN0IGluZGljYXRlZCBpcyBuZWVkZWQuCisgICAgaW5saW5lIGJvb2wKKyAgICBpc19ncm93X25lZWRlZChzaXplX3R5cGUgc2l6ZSwgc2l6ZV90eXBlIG51bV9lbnRyaWVzKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIHZvaWQKKyAgICBjYWxjX21heF9udW1fY29sbCgpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBjYWxjX3Jlc2l6ZV9uZWVkZWQoKTsKKworICAgIGZsb2F0IAltX2xvYWQ7CisgICAgc2l6ZV90eXBlIAltX3NpemU7CisgICAgc2l6ZV90eXBlIAltX251bV9jb2w7CisgICAgc2l6ZV90eXBlIAltX21heF9jb2w7CisgICAgYm9vbCAJbV9yZXNpemVfbmVlZGVkOworICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2NjX2hhc2hfbWF4X2NvbGxpc2lvbl9jaGVja19yZXNpemVfdHJpZ2dlcl9pbXAuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZT4KKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgaGFzaF9leHBvbmVudGlhbF9zaXplX3BvbGljeTxTaXplX1R5cGU+CisKKyAgLy8vIEEgc2l6ZSBwb2xpY3kgd2hvc2Ugc2VxdWVuY2Ugb2Ygc2l6ZXMgZm9ybSBhbiBleHBvbmVudGlhbAorICAvLy8gc2VxdWVuY2UgKHR5cGljYWxseSBwb3dlcnMgb2YgMi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9UeXBlID0gc3RkOjpzaXplX3Q+CisgIGNsYXNzIGhhc2hfZXhwb25lbnRpYWxfc2l6ZV9wb2xpY3kKKyAgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBTaXplX1R5cGUgc2l6ZV90eXBlOworCisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IsIG9yIG9uc3RydWN0b3IgdGFraW5nIGEgc3RhcnRfc2l6ZSwgb3IKKyAgICAvLy8gY29uc3RydWN0b3IgdGFraW5nIGEgc3RhcnQgc2l6ZSBhbmQgZ3Jvd19mYWN0b3IuIFRoZSBwb2xpY3kKKyAgICAvLy8gd2lsbCB1c2UgdGhlIHNlcXVlbmNlIG9mIHNpemVzIHN0YXJ0X3NpemUsIHN0YXJ0X3NpemUqCisgICAgLy8vIGdyb3dfZmFjdG9yLCBzdGFydF9zaXplKiBncm93X2ZhY3Rvcl4yLCAuLi4KKyAgICBoYXNoX2V4cG9uZW50aWFsX3NpemVfcG9saWN5KHNpemVfdHlwZSBzdGFydF9zaXplID0gOCwKKwkJCQkgc2l6ZV90eXBlIGdyb3dfZmFjdG9yID0gMik7CisKKyAgICB2b2lkCisgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpOworCisgIHByb3RlY3RlZDoKKyAgICBzaXplX3R5cGUKKyAgICBnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZShzaXplX3R5cGUgc2l6ZSkgY29uc3Q7CisKKyAgICBzaXplX3R5cGUKKyAgICBnZXRfbmVhcmVzdF9zbWFsbGVyX3NpemUoc2l6ZV90eXBlIHNpemUpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgc2l6ZV90eXBlIG1fc3RhcnRfc2l6ZTsKKyAgICBzaXplX3R5cGUgbV9ncm93X2ZhY3RvcjsKKyAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9oYXNoX2V4cG9uZW50aWFsX3NpemVfcG9saWN5X2ltcC5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgaGFzaF9wcmltZV9zaXplX3BvbGljeQorCisgIC8vLyBBIHNpemUgcG9saWN5IHdob3NlIHNlcXVlbmNlIG9mIHNpemVzIGZvcm0gYSBuZWFybHktZXhwb25lbnRpYWwKKyAgLy8vIHNlcXVlbmNlIG9mIHByaW1lcy4KKyAgY2xhc3MgaGFzaF9wcmltZV9zaXplX3BvbGljeQorICB7CisgIHB1YmxpYzoKKyAgICAvLy8gU2l6ZSB0eXBlLgorICAgIHR5cGVkZWYgc3RkOjpzaXplX3Qgc2l6ZV90eXBlOworCisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IsIG9yIG9uc3RydWN0b3IgdGFraW5nIGEgc3RhcnRfc2l6ZSBUaGUKKyAgICAvLy8gcG9saWN5IHdpbGwgdXNlIHRoZSBzZXF1ZW5jZSBvZiBzaXplcyBhcHByb3hpbWF0ZWx5CisgICAgLy8vIHN0YXJ0X3NpemUsIHN0YXJ0X3NpemUqIDIsIHN0YXJ0X3NpemUqIDJeMiwgLi4uCisgICAgaGFzaF9wcmltZV9zaXplX3BvbGljeShzaXplX3R5cGUgc3RhcnRfc2l6ZSA9IDgpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgcHJvdGVjdGVkOgorICAgIHNpemVfdHlwZQorICAgIGdldF9uZWFyZXN0X2xhcmdlcl9zaXplKHNpemVfdHlwZSBzaXplKSBjb25zdDsKKworICAgIHNpemVfdHlwZQorICAgIGdldF9uZWFyZXN0X3NtYWxsZXJfc2l6ZShzaXplX3R5cGUgc2l6ZSkgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICBzaXplX3R5cGUgbV9zdGFydF9zaXplOworICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2hhc2hfcHJpbWVfc2l6ZV9wb2xpY3lfaW1wLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1BvbGljeSwgdHlwZW5hbWUgVHJpZ2dlcl9Qb2xpY3ksIGJvb2wgRXh0ZXJuYWxfU2l6ZV9BY2Nlc3MsIHR5cGVuYW1lIFNpemVfVHlwZT4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBoYXNoX3N0YW5kYXJkX3Jlc2l6ZV9wb2xpY3k8U2l6ZV9Qb2xpY3ksIFRyaWdnZXJfUG9saWN5LCBFeHRlcm5hbF9TaXplX0FjY2VzcywgU2l6ZV9UeXBlPgorCisgIC8vLyBBIHJlc2l6ZSBwb2xpY3kgd2hpY2ggZGVsZWdhdGVzIG9wZXJhdGlvbnMgdG8gc2l6ZSBhbmQgdHJpZ2dlciBwb2xpY2llcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9Qb2xpY3kgPSBoYXNoX2V4cG9uZW50aWFsX3NpemVfcG9saWN5PD4sCisJICAgdHlwZW5hbWUgVHJpZ2dlcl9Qb2xpY3kgPSBoYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXI8PiwKKwkgICBib29sIEV4dGVybmFsX1NpemVfQWNjZXNzID0gZmFsc2UsCisJICAgdHlwZW5hbWUgU2l6ZV9UeXBlID0gc3RkOjpzaXplX3Q+CisgIGNsYXNzIGhhc2hfc3RhbmRhcmRfcmVzaXplX3BvbGljeQorICA6IHB1YmxpYyBTaXplX1BvbGljeSwgcHVibGljIFRyaWdnZXJfUG9saWN5CisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgU2l6ZV9UeXBlIAkJc2l6ZV90eXBlOworICAgIHR5cGVkZWYgVHJpZ2dlcl9Qb2xpY3kgCXRyaWdnZXJfcG9saWN5OworICAgIHR5cGVkZWYgU2l6ZV9Qb2xpY3kgCXNpemVfcG9saWN5OworCisgICAgZW51bQorICAgICAgeworCWV4dGVybmFsX3NpemVfYWNjZXNzID0gRXh0ZXJuYWxfU2l6ZV9BY2Nlc3MKKyAgICAgIH07CisKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICBoYXNoX3N0YW5kYXJkX3Jlc2l6ZV9wb2xpY3koKTsKKworICAgIC8vLyBjb25zdHJ1Y3RvciB0YWtpbmcgc29tZSBwb2xpY2llcyByX3NpemVfcG9saWN5IHdpbGwgYmUgY29waWVkCisgICAgLy8vIGJ5IHRoZSBTaXplX1BvbGljeSBvYmplY3Qgb2YgdGhpcyBvYmplY3QuCisgICAgaGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5KGNvbnN0IFNpemVfUG9saWN5JiByX3NpemVfcG9saWN5KTsKKworICAgIC8vLyBjb25zdHJ1Y3RvciB0YWtpbmcgc29tZSBwb2xpY2llcy4gcl9zaXplX3BvbGljeSB3aWxsIGJlCisgICAgLy8vIGNvcGllZCBieSB0aGUgU2l6ZV9Qb2xpY3kgb2JqZWN0IG9mIHRoaXMKKyAgICAvLy8gb2JqZWN0LiByX3RyaWdnZXJfcG9saWN5IHdpbGwgYmUgY29waWVkIGJ5IHRoZSBUcmlnZ2VyX1BvbGljeQorICAgIC8vLyBvYmplY3Qgb2YgdGhpcyBvYmplY3QuCisgICAgaGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5KGNvbnN0IFNpemVfUG9saWN5JiByX3NpemVfcG9saWN5LAorCQkJCWNvbnN0IFRyaWdnZXJfUG9saWN5JiByX3RyaWdnZXJfcG9saWN5KTsKKworICAgIHZpcnR1YWwKKyAgICB+aGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5KCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICAgIC8vLyBBY2Nlc3MgdG8gdGhlIFNpemVfUG9saWN5IG9iamVjdCB1c2VkLgorICAgIFNpemVfUG9saWN5JgorICAgIGdldF9zaXplX3BvbGljeSgpOworCisgICAgLy8vIENvbnN0IGFjY2VzcyB0byB0aGUgU2l6ZV9Qb2xpY3kgb2JqZWN0IHVzZWQuCisgICAgY29uc3QgU2l6ZV9Qb2xpY3kmCisgICAgZ2V0X3NpemVfcG9saWN5KCkgY29uc3Q7CisKKyAgICAvLy8gQWNjZXNzIHRvIHRoZSBUcmlnZ2VyX1BvbGljeSBvYmplY3QgdXNlZC4KKyAgICBUcmlnZ2VyX1BvbGljeSYKKyAgICBnZXRfdHJpZ2dlcl9wb2xpY3koKTsKKworICAgIC8vLyBBY2Nlc3MgdG8gdGhlIFRyaWdnZXJfUG9saWN5IG9iamVjdCB1c2VkLgorICAgIGNvbnN0IFRyaWdnZXJfUG9saWN5JgorICAgIGdldF90cmlnZ2VyX3BvbGljeSgpIGNvbnN0OworCisgICAgLy8vIFJldHVybnMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb250YWluZXIuCisgICAgaW5saW5lIHNpemVfdHlwZQorICAgIGdldF9hY3R1YWxfc2l6ZSgpIGNvbnN0OworCisgICAgLy8vIFJlc2l6ZXMgdGhlIGNvbnRhaW5lciB0byBzdWdnZXN0ZWRfbmV3X3NpemUsIGEgc3VnZ2VzdGVkIHNpemUKKyAgICAvLy8gKHRoZSBhY3R1YWwgc2l6ZSB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIFNpemVfUG9saWN5CisgICAgLy8vIG9iamVjdCkuCisgICAgdm9pZAorICAgIHJlc2l6ZShzaXplX3R5cGUgc3VnZ2VzdGVkX25ld19zaXplKTsKKworICBwcm90ZWN0ZWQ6CisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfaW5zZXJ0X3NlYXJjaF9zdGFydCgpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfaW5zZXJ0X3NlYXJjaF9jb2xsaXNpb24oKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2luc2VydF9zZWFyY2hfZW5kKCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9maW5kX3NlYXJjaF9zdGFydCgpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZmluZF9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9maW5kX3NlYXJjaF9lbmQoKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2VyYXNlX3NlYXJjaF9zdGFydCgpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZXJhc2Vfc2VhcmNoX2NvbGxpc2lvbigpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZXJhc2Vfc2VhcmNoX2VuZCgpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfaW5zZXJ0ZWQoc2l6ZV90eXBlIG51bV9lKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2VyYXNlZChzaXplX3R5cGUgbnVtX2UpOworCisgICAgdm9pZAorICAgIG5vdGlmeV9jbGVhcmVkKCk7CisKKyAgICB2b2lkCisgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIG5ld19zaXplKTsKKworICAgIGlubGluZSBib29sCisgICAgaXNfcmVzaXplX25lZWRlZCgpIGNvbnN0OworCisgICAgLy8vIFF1ZXJpZXMgd2hhdCB0aGUgbmV3IHNpemUgc2hvdWxkIGJlLCB3aGVuIHRoZSBjb250YWluZXIgaXMKKyAgICAvLy8gcmVzaXplZCBuYXR1cmFsbHkuIFRoZSBjdXJyZW50IF9fc2l6ZSBvZiB0aGUgY29udGFpbmVyIGlzCisgICAgLy8vIHNpemUsIGFuZCB0aGUgbnVtYmVyIG9mIHVzZWQgZW50cmllcyB3aXRoaW4gdGhlIGNvbnRhaW5lciBpcworICAgIC8vLyBudW1fdXNlZF9lLgorICAgIHNpemVfdHlwZQorICAgIGdldF9uZXdfc2l6ZShzaXplX3R5cGUgc2l6ZSwgc2l6ZV90eXBlIG51bV91c2VkX2UpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgLy8vIFJlc2l6ZXMgdG8gbmV3X3NpemUuCisgICAgdmlydHVhbCB2b2lkCisgICAgZG9fcmVzaXplKHNpemVfdHlwZSBuZXdfc2l6ZSk7CisKKyAgICB0eXBlZGVmIFRyaWdnZXJfUG9saWN5IHRyaWdnZXJfcG9saWN5X2Jhc2U7CisKKyAgICB0eXBlZGVmIFNpemVfUG9saWN5IHNpemVfcG9saWN5X2Jhc2U7CisKKyAgICBzaXplX3R5cGUgbV9zaXplOworICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2hhc2hfc3RhbmRhcmRfcmVzaXplX3BvbGljeV9pbXAuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvbGlzdF91cGRhdGVfcG9saWN5LmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2xpc3RfdXBkYXRlX3BvbGljeS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU1ZWQ3MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL2xpc3RfdXBkYXRlX3BvbGljeS5ocHAKQEAgLTAsMCArMSwxMzAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbGlzdF91cGRhdGVfcG9saWN5LmhwcAorICogQ29udGFpbnMgcG9saWNpZXMgZm9yIGxpc3QgdXBkYXRlIGNvbnRhaW5lcnMuCisgKi8KKworI2lmbmRlZiBQQl9EU19MVV9QT0xJQ1lfSFBQCisjZGVmaW5lIFBCX0RTX0xVX1BPTElDWV9IUFAKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX3BvbGljeS9sdV9jb3VudGVyX21ldGFkYXRhLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvdGFnX2FuZF90cmFpdC5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIC8qKgorICAgKiAgQSBsaXN0LXVwZGF0ZSBwb2xpY3kgdGhhdCB1bmNvbmRpdGlvbmFsbHkgbW92ZXMgZWxlbWVudHMgdG8gdGhlCisgICAqICBmcm9udCBvZiB0aGUgbGlzdC4gQSBudWxsIHR5cGUgbWVhbnMgdGhhdCBlYWNoIGxpbmsgaW4gYQorICAgKiAgbGlzdC1iYXNlZCBjb250YWluZXIgZG9lcyBub3QgYWN0dWFsbHkgbmVlZCBtZXRhZGF0YS4KKyAgICovCisgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8Y2hhcj4gPgorICAgY2xhc3MgbHVfbW92ZV90b19mcm9udF9wb2xpY3kKKyAgIHsKKyAgIHB1YmxpYzoKKyAgICAgdHlwZWRlZiBfQWxsb2MgCQkJCQlhbGxvY2F0b3JfdHlwZTsKKworICAgICAvLy8gTWV0YWRhdGEgb24gd2hpY2ggdGhpcyBmdW5jdG9yIG9wZXJhdGVzLgorICAgICB0eXBlZGVmIG51bGxfdHlwZSAJCQkJCW1ldGFkYXRhX3R5cGU7CisKKyAgIHByaXZhdGU6CisgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8bWV0YWRhdGFfdHlwZT4gX19yZWJpbmRfbTsKKworICAgcHVibGljOgorICAgICAvLy8gUmVmZXJlbmNlIHRvIG1ldGFkYXRhIG9uIHdoaWNoIHRoaXMgZnVuY3RvciBvcGVyYXRlcy4KKyAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tOjpvdGhlcjo6cmVmZXJlbmNlIAltZXRhZGF0YV9yZWZlcmVuY2U7CisKKyAgICAgLy8vIENyZWF0ZXMgYSBtZXRhZGF0YSBvYmplY3QuCisgICAgIG1ldGFkYXRhX3R5cGUKKyAgICAgb3BlcmF0b3IoKSgpIGNvbnN0CisgICAgIHsgcmV0dXJuIHNfbWV0YWRhdGE7IH0KKworICAgICAvLy8gRGVjaWRlcyB3aGV0aGVyIGEgbWV0YWRhdGEgb2JqZWN0IHNob3VsZCBiZSBtb3ZlZCB0byB0aGUgZnJvbnQKKyAgICAgLy8vIG9mIHRoZSBsaXN0LgorICAgICBpbmxpbmUgYm9vbAorICAgICBvcGVyYXRvcigpKG1ldGFkYXRhX3JlZmVyZW5jZSByX21ldGFkYXRhKSBjb25zdAorICAgICB7IHJldHVybiB0cnVlOyB9CisKKyAgIHByaXZhdGU6CisgICAgIHN0YXRpYyBudWxsX3R5cGUgCQkJCQlzX21ldGFkYXRhOworICAgfTsKKworICAvKioKKyAgICogIEEgbGlzdC11cGRhdGUgcG9saWN5IHRoYXQgbW92ZXMgZWxlbWVudHMgdG8gdGhlIGZyb250IG9mIHRoZQorICAgKiAgbGlzdCBiYXNlZCBvbiB0aGUgY291bnRlciBhbGdvcml0aG0uCisgICAqLworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBNYXhfQ291bnQgPSA1LCB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+CisgICAgY2xhc3MgbHVfY291bnRlcl9wb2xpY3kKKyAgICA6IHByaXZhdGUgZGV0YWlsOjpsdV9jb3VudGVyX3BvbGljeV9iYXNlPHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9BbGxvYyAJCQkJCWFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6c2l6ZV90eXBlICAgICAgIAlzaXplX3R5cGU7CisKKyAgICAgIGVudW0KKwl7CisJICAvLy8gV2hlbiBzb21lIGVsZW1lbnQgaXMgYWNjZXNzZWQgdGhpcyBudW1iZXIgb2YgdGltZXMsIGl0CisJICAvLy8gd2lsbCBiZSBtb3ZlZCB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QuCisJICBtYXhfY291bnQgPSBNYXhfQ291bnQKKwl9OworCisgICAgICAvLy8gTWV0YWRhdGEgb24gd2hpY2ggdGhpcyBmdW5jdG9yIG9wZXJhdGVzLgorICAgICAgdHlwZWRlZiBkZXRhaWw6Omx1X2NvdW50ZXJfbWV0YWRhdGE8c2l6ZV90eXBlPiAJbWV0YWRhdGFfdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIGRldGFpbDo6bHVfY291bnRlcl9wb2xpY3lfYmFzZTxzaXplX3R5cGU+IAliYXNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPG1ldGFkYXRhX3R5cGU+IF9fcmViaW5kX207CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gUmVmZXJlbmNlIHRvIG1ldGFkYXRhIG9uIHdoaWNoIHRoaXMgZnVuY3RvciBvcGVyYXRlcy4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbTo6b3RoZXI6OnJlZmVyZW5jZSAJbWV0YWRhdGFfcmVmZXJlbmNlOworCisgICAgICAvLy8gQ3JlYXRlcyBhIG1ldGFkYXRhIG9iamVjdC4KKyAgICAgIG1ldGFkYXRhX3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoKSBjb25zdAorICAgICAgeyByZXR1cm4gYmFzZV90eXBlOjpvcGVyYXRvcigpKG1heF9jb3VudCk7IH0KKworICAgICAgLy8vIERlY2lkZXMgd2hldGhlciBhIG1ldGFkYXRhIG9iamVjdCBzaG91bGQgYmUgbW92ZWQgdG8gdGhlIGZyb250CisgICAgICAvLy8gb2YgdGhlIGxpc3QuCisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKG1ldGFkYXRhX3JlZmVyZW5jZSByX2RhdGEpIGNvbnN0CisgICAgICB7IHJldHVybiBiYXNlX3R5cGU6Om9wZXJhdG9yKCkocl9kYXRhLCBtYXhfY291bnQpOyB9CisgICAgfTsKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9wcmlvcml0eV9xdWV1ZS5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy9wcmlvcml0eV9xdWV1ZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM1ODc0YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL3ByaW9yaXR5X3F1ZXVlLmhwcApAQCAtMCwwICsxLDE1NyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwcmlvcml0eV9xdWV1ZS5ocHAKKyAqIENvbnRhaW5zIHByaW9yaXR5X3F1ZXVlcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX1BSSU9SSVRZX1FVRVVFX0hQUAorI2RlZmluZSBQQl9EU19QUklPUklUWV9RVUVVRV9IUFAKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL3RhZ19hbmRfdHJhaXQuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcHJpb3JpdHlfcXVldWVfYmFzZV9kaXNwYXRjaC5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9zdGFuZGFyZF9wb2xpY2llcy5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIC8qKgorICAgKiAgQGRlZmdyb3VwIGhlYXAtYmFzZWQgSGVhcC1CYXNlZAorICAgKiAgQGluZ3JvdXAgY29udGFpbmVycy1wYmRzCisgICAqICBAeworICAgKi8KKworICAvKioKKyAgICogIEBkZWZncm91cCBoZWFwLWRldGFpbCBCYXNlIGFuZCBQb2xpY3kgQ2xhc3NlcworICAgKiAgQGluZ3JvdXAgaGVhcC1iYXNlZAorICAgKi8KKworICAvKioKKyAgICogIEEgcHJpb3JpdHkgcXVldWUgY29tcG9zZWQgb2Ygb25lIHNwZWNpZmljIGhlYXAgcG9saWN5LgorICAgKgorICAgKiAgQHRwYXJhbSBfVHYgCSAgICAJVmFsdWUgdHlwZS4KKyAgICogIEB0cGFyYW0gQ21wX0ZuCSAgICAJQ29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHRwYXJhbSBUYWcgCSAgICAJSW5zdGFudGlhdGluZyBkYXRhIHN0cnVjdHVyZSB0eXBlLAorICAgKgkJCSAgICAJc2VlIGNvbnRhaW5lcl90YWcuCisgICAqICBAdHBhcmFtIF9BbGxvYyAJICAgIAlBbGxvY2F0b3IgdHlwZS4KKyAgICoKKyAgICogIEJhc2UgaXMgZGlzcGF0Y2hlZCBhdCBjb21waWxlIHRpbWUgdmlhIFRhZywgZnJvbSB0aGUgZm9sbG93aW5nCisgICAqICBjaG9pY2VzOiBiaW5hcnlfaGVhcF90YWcsIGJpbm9taWFsX2hlYXBfdGFnLCBwYWlyaW5nX2hlYXBfdGFnLAorICAgKiAgICAgICAgICAgcmNfYmlub21pYWxfaGVhcF90YWcsIHRoaW5faGVhcF90YWcKKyAgICoKKyAgICogIEJhc2UgY2hvaWNlcyBhcmU6IGRldGFpbDo6YmluYXJ5X2hlYXAsIGRldGFpbDo6Ymlub21pYWxfaGVhcCwKKyAgICogICAgICAgICAgICAgICAgICAgIGRldGFpbDo6cGFpcmluZ19oZWFwLCBkZXRhaWw6OnJjX2Jpbm9taWFsX2hlYXAsCisgICAqICAgICAgICAgICAgICAgICAgICBkZXRhaWw6OnRoaW5faGVhcC4KKyAgICovCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHYsCisJICAgdHlwZW5hbWUgQ21wX0ZuID0gc3RkOjpsZXNzPF9Udj4sCisJICAgdHlwZW5hbWUgVGFnID0gcGFpcmluZ19oZWFwX3RhZywKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+CisgIGNsYXNzIHByaW9yaXR5X3F1ZXVlCisgIDogcHVibGljIGRldGFpbDo6Y29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8X1R2LCBDbXBfRm4sIF9BbGxvYywgVGFnPjo6dHlwZQorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9UdiAJCQkJCXZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBDbXBfRm4gCQkJCQljbXBfZm47CisgICAgdHlwZWRlZiBUYWcgCQkJCQljb250YWluZXJfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiBfQWxsb2MgCQkJCQlhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpzaXplX3R5cGUgCQlzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6ZGlmZmVyZW5jZV90eXBlIAlkaWZmZXJlbmNlX3R5cGU7CisKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGRldGFpbDo6Y29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8X1R2LCBDbXBfRm4sIF9BbGxvYywKKwkJCQkJCSAgICAgVGFnPjo6dHlwZQorIAkJCQkJCQliYXNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfVHY+ICAgCV9fcmViaW5kX3Y7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF92OjpvdGhlcgkJCV9fcmViaW5kX3ZhOworCisgcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfdmE6OnJlZmVyZW5jZSAJCXJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3ZhOjpjb25zdF9yZWZlcmVuY2UgCWNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3ZhOjpwb2ludGVyIAkgICAJcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX3ZhOjpjb25zdF9wb2ludGVyIAljb25zdF9wb2ludGVyOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnBvaW50X2l0ZXJhdG9yIAkJcG9pbnRfaXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnBvaW50X2NvbnN0X2l0ZXJhdG9yIAlwb2ludF9jb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6aXRlcmF0b3IgCQlpdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IgCQljb25zdF9pdGVyYXRvcjsKKworICAgIHByaW9yaXR5X3F1ZXVlKCkgeyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIHNvbWUgcG9saWN5IG9iamVjdHMuIHJfY21wX2ZuIHdpbGwgYmUKKyAgICAvLy8gY29waWVkIGJ5IHRoZSBDbXBfRm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHByaW9yaXR5X3F1ZXVlKGNvbnN0IGNtcF9mbiYgcl9jbXBfZm4pIDogYmFzZV90eXBlKHJfY21wX2ZuKSB7IH0KKworICAgIC8vLyBDb25zdHJ1Y3RvciB0YWtpbmcgX19pdGVyYXRvcnMgdG8gYSByYW5nZSBvZiB2YWx1ZV90eXBlcy4gVGhlCisgICAgLy8vIHZhbHVlX3R5cGVzIGJldHdlZW4gZmlyc3RfaXQgYW5kIGxhc3RfaXQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvCisgICAgLy8vIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgIHByaW9yaXR5X3F1ZXVlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KQorICAgIHsgYmFzZV90eXBlOjpjb3B5X2Zyb21fcmFuZ2UoZmlyc3RfaXQsIGxhc3RfaXQpOyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IgdGFraW5nIF9faXRlcmF0b3JzIHRvIGEgcmFuZ2Ugb2YgdmFsdWVfdHlwZXMgYW5kCisgICAgLy8vIHNvbWUgcG9saWN5IG9iamVjdHMgVGhlIHZhbHVlX3R5cGVzIGJldHdlZW4gZmlyc3RfaXQgYW5kCisgICAgLy8vIGxhc3RfaXQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjb250YWluZXIgb2JqZWN0LiByX2NtcF9mbgorICAgIC8vLyB3aWxsIGJlIGNvcGllZCBieSB0aGUgY21wX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICBwcmlvcml0eV9xdWV1ZShJdCBmaXJzdF9pdCwgSXQgbGFzdF9pdCwgY29uc3QgY21wX2ZuJiByX2NtcF9mbikKKyAgICA6IGJhc2VfdHlwZShyX2NtcF9mbikKKyAgICB7IGJhc2VfdHlwZTo6Y29weV9mcm9tX3JhbmdlKGZpcnN0X2l0LCBsYXN0X2l0KTsgfQorCisgICAgcHJpb3JpdHlfcXVldWUoY29uc3QgcHJpb3JpdHlfcXVldWUmIG90aGVyKQorICAgIDogYmFzZV90eXBlKChjb25zdCBiYXNlX3R5cGUmIClvdGhlcikgeyB9CisKKyAgICB2aXJ0dWFsCisgICAgfnByaW9yaXR5X3F1ZXVlKCkgeyB9CisKKyAgICBwcmlvcml0eV9xdWV1ZSYKKyAgICBvcGVyYXRvcj0oY29uc3QgcHJpb3JpdHlfcXVldWUmIG90aGVyKQorICAgIHsKKyAgICAgIGlmICh0aGlzICE9ICZvdGhlcikKKwl7CisJICBwcmlvcml0eV9xdWV1ZSB0bXAob3RoZXIpOworCSAgc3dhcCh0bXApOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB2b2lkCisgICAgc3dhcChwcmlvcml0eV9xdWV1ZSYgb3RoZXIpCisgICAgeyBiYXNlX3R5cGU6OnN3YXAob3RoZXIpOyB9CisgIH07Cit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisgLy9AfSBoZWFwLWJhc2VkCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL3RhZ19hbmRfdHJhaXQuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvdGFnX2FuZF90cmFpdC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiZGE5NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL3RhZ19hbmRfdHJhaXQuaHBwCkBAIC0wLDAgKzEsNDU0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHRhZ19hbmRfdHJhaXQuaHBwCisgKiBDb250YWlucyB0YWdzIGFuZCB0cmFpdHMsIGUuZy4sIG9uZXMgZGVzY3JpYmluZyB1bmRlcmx5aW5nCisgKiBkYXRhIHN0cnVjdHVyZXMuCisgKi8KKworI2lmbmRlZiBQQl9EU19UQUdfQU5EX1RSQUlUX0hQUAorI2RlZmluZSBQQl9EU19UQUdfQU5EX1RSQUlUX0hQUAorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorCisvKioKKyAqIEBuYW1lc3BhY2UgX19nbnVfcGJkcworICogQGJyaWVmIEdOVSBleHRlbnNpb25zIGZvciBwb2xpY3ktYmFzZWQgZGF0YSBzdHJ1Y3R1cmVzIGZvciBwdWJsaWMgdXNlLgorICovCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICAvKiogQGRlZmdyb3VwIHBiZHMgUG9saWN5LUJhc2VkIERhdGEgU3RydWN0dXJlcworICAgKiAgQGluZ3JvdXAgZXh0ZW5zaW9ucworICAgKgorICAgKiAgVGhpcyBpcyBhIGxpYnJhcnkgb2YgcG9saWN5LWJhc2VkIGVsZW1lbnRhcnkgZGF0YSBzdHJ1Y3R1cmVzOgorICAgKiAgYXNzb2NpYXRpdmUgY29udGFpbmVycyBhbmQgcHJpb3JpdHkgcXVldWVzLiBJdCBpcyBkZXNpZ25lZCBmb3IKKyAgICogIGhpZ2gtcGVyZm9ybWFuY2UsIGZsZXhpYmlsaXR5LCBzZW1hbnRpYyBzYWZldHksIGFuZCBjb25mb3JtYW5jZQorICAgKiAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY29udGFpbmVycyBpbiBzdGQgKGV4Y2VwdCBmb3Igc29tZSBwb2ludHMKKyAgICogIHdoZXJlIGl0IGRpZmZlcnMgYnkgZGVzaWduKS4KKyAgICoKKyAgICogIEZvciBkZXRhaWxzLCBzZWU6CisgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvZXh0L3BiX2RzL2luZGV4Lmh0bWwKKyAgICoKKyAgICogIEB7CisgICAqLworCisgIC8qKgorICAgKiAgQGRlZmdyb3VwIHRhZ3MgVGFncworICAgKiAgQHsgICAKKyAgICovCisgIC8vLyBBIHRyaXZpYWwgaXRlcmF0b3IgdGFnLiBTaWduaWZpZXMgdGhhdCB0aGUgaXRlcmF0b3JzIGhhcyBub25lIG9mCisgIC8vLyBzdGQ6Oml0ZXJhdG9ycydzIG1vdmVtZW50IGFiaWxpdGllcy4KKyAgc3RydWN0IHRyaXZpYWxfaXRlcmF0b3JfdGFnCisgIHsgfTsKKworICAvLy8gUHJvaGliaXQgbW92aW5nIHRyaXZpYWwgaXRlcmF0b3JzLgorICB0eXBlZGVmIHZvaWQgdHJpdmlhbF9pdGVyYXRvcl9kaWZmZXJlbmNlX3R5cGU7CisKKworICAvKioKKyAgICogIEBkZWZncm91cCBpbnZhbGlkYXRpb25fdGFncyAgSW52YWxpZGF0aW9uIEd1YXJhbnRlZXMKKyAgICogIEBpbmdyb3VwIHRhZ3MKKyAgICogIEB7CisgICAqLworCisgIC8qKgorICAgKiAgU2lnbmlmaWVzIGEgYmFzaWMgaW52YWxpZGF0aW9uIGd1YXJhbnRlZSB0aGF0IGFueSBpdGVyYXRvciwKKyAgICogIHBvaW50ZXIsIG9yIHJlZmVyZW5jZSB0byBhIGNvbnRhaW5lciBvYmplY3QncyBtYXBwZWQgdmFsdWUgdHlwZQorICAgKiAgaXMgdmFsaWQgYXMgbG9uZyBhcyB0aGUgY29udGFpbmVyIGlzIG5vdCBtb2RpZmllZC4KKyAgICovCisgIHN0cnVjdCBiYXNpY19pbnZhbGlkYXRpb25fZ3VhcmFudGVlCisgIHsgfTsKKworICAvKioKKyAgICogIFNpZ25pZmllcyBhbiBpbnZhbGlkYXRpb24gZ3VhcmFudGVlIHRoYXQgaW5jbHVkZXMgYWxsIHRob3NlIG9mCisgICAqICBpdHMgYmFzZSwgYW5kIGFkZGl0aW9uYWxseSwgdGhhdCBhbnkgcG9pbnQtdHlwZSBpdGVyYXRvciwKKyAgICogIHBvaW50ZXIsIG9yIHJlZmVyZW5jZSB0byBhIGNvbnRhaW5lciBvYmplY3QncyBtYXBwZWQgdmFsdWUgdHlwZQorICAgKiAgaXMgdmFsaWQgYXMgbG9uZyBhcyBpdHMgY29ycmVzcG9uZGluZyBlbnRyeSBoYXMgbm90IGJlIGVyYXNlZCwKKyAgICogIHJlZ2FyZGxlc3Mgb2YgbW9kaWZpY2F0aW9ucyB0byB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICovCisgIHN0cnVjdCBwb2ludF9pbnZhbGlkYXRpb25fZ3VhcmFudGVlIDogcHVibGljIGJhc2ljX2ludmFsaWRhdGlvbl9ndWFyYW50ZWUKKyAgeyB9OworCisgIC8qKgorICAgKiAgU2lnbmlmaWVzIGFuIGludmFsaWRhdGlvbiBndWFyYW50ZWUgdGhhdCBpbmNsdWRlcyBhbGwgdGhvc2Ugb2YKKyAgICogIGl0cyBiYXNlLCBhbmQgYWRkaXRpb25hbGx5LCB0aGF0IGFueSByYW5nZS10eXBlIGl0ZXJhdG9yCisgICAqICAoaW5jbHVkaW5nIHRoZSByZXR1cm5zIG9mIGJlZ2luKCkgYW5kIGVuZCgpKSBpcyBpbiB0aGUgY29ycmVjdAorICAgKiAgcmVsYXRpdmUgcG9zaXRpb25zIHRvIG90aGVyIHJhbmdlLXR5cGUgaXRlcmF0b3JzIGFzIGxvbmcgYXMgaXRzCisgICAqICBjb3JyZXNwb25kaW5nIGVudHJ5IGhhcyBub3QgYmUgZXJhc2VkLCByZWdhcmRsZXNzIG9mCisgICAqICBtb2RpZmljYXRpb25zIHRvIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgKi8KKyAgc3RydWN0IHJhbmdlX2ludmFsaWRhdGlvbl9ndWFyYW50ZWUgOiBwdWJsaWMgcG9pbnRfaW52YWxpZGF0aW9uX2d1YXJhbnRlZQorICB7IH07CisgIC8vQH0KKworCisgIC8qKgorICAgKiAgQGRlZmdyb3VwIGRzX3RhZ3MgRGF0YSBTdHJ1Y3R1cmUgVHlwZQorICAgKiAgQGluZ3JvdXAgdGFncworICAgKiAgQHsKKyAgICovCisgIC8vLyBCYXNlIGRhdGEgc3RydWN0dXJlIHRhZy4KKyAgc3RydWN0IGNvbnRhaW5lcl90YWcKKyAgeyB9OworCisgIC8vLyBCYXNpYyBzZXF1ZW5jZS4KKyAgc3RydWN0IHNlcXVlbmNlX3RhZyA6IHB1YmxpYyBjb250YWluZXJfdGFnIHsgfTsKKworICAvLy8gQmFzaWMgc3RyaW5nIGNvbnRhaW5lciwgaW5jbHVzaXZlIG9mIHN0cmluZ3MsIHJvcGVzLCBldGMuCisgIHN0cnVjdCBzdHJpbmdfdGFnIDogcHVibGljIHNlcXVlbmNlX3RhZyB7IH07CisKKyAgLy8vIEJhc2ljIGFzc29jaWF0aXZlLWNvbnRhaW5lci4KKyAgc3RydWN0IGFzc29jaWF0aXZlX3RhZyA6IHB1YmxpYyBjb250YWluZXJfdGFnIHsgfTsKKworICAvLy8gQmFzaWMgaGFzaCBzdHJ1Y3R1cmUuCisgIHN0cnVjdCBiYXNpY19oYXNoX3RhZyA6IHB1YmxpYyBhc3NvY2lhdGl2ZV90YWcgeyB9OworCisgIC8vLyBDb2xsaXNpb24tY2hhaW5pbmcgaGFzaC4KKyAgc3RydWN0IGNjX2hhc2hfdGFnIDogcHVibGljIGJhc2ljX2hhc2hfdGFnIHsgfTsKKworICAvLy8gR2VuZXJhbC1wcm9iaW5nIGhhc2guCisgIHN0cnVjdCBncF9oYXNoX3RhZyA6IHB1YmxpYyBiYXNpY19oYXNoX3RhZyB7IH07CisKKyAgLy8vIEJhc2ljIGJyYW5jaCBzdHJ1Y3R1cmUuCisgIHN0cnVjdCBiYXNpY19icmFuY2hfdGFnIDogcHVibGljIGFzc29jaWF0aXZlX3RhZyB7IH07CisKKyAgLy8vIEJhc2ljIHRyZWUgc3RydWN0dXJlLgorICBzdHJ1Y3QgdHJlZV90YWcgOiBwdWJsaWMgYmFzaWNfYnJhbmNoX3RhZyB7IH07CisKKyAgLy8vIFJlZC1ibGFjayB0cmVlLgorICBzdHJ1Y3QgcmJfdHJlZV90YWcgOiBwdWJsaWMgdHJlZV90YWcgeyB9OworCisgIC8vLyBTcGxheSB0cmVlLgorICBzdHJ1Y3Qgc3BsYXlfdHJlZV90YWcgOiBwdWJsaWMgdHJlZV90YWcgeyB9OworCisgIC8vLyBPcmRlcmVkLXZlY3RvciB0cmVlLgorICBzdHJ1Y3Qgb3ZfdHJlZV90YWcgOiBwdWJsaWMgdHJlZV90YWcgeyB9OworCisgIC8vLyBCYXNpYyB0cmllIHN0cnVjdHVyZS4KKyAgc3RydWN0IHRyaWVfdGFnIDogcHVibGljIGJhc2ljX2JyYW5jaF90YWcgeyB9OworCisgIC8vLyBQQVRSSUNJQSB0cmllLgorICBzdHJ1Y3QgcGF0X3RyaWVfdGFnIDogcHVibGljIHRyaWVfdGFnIHsgfTsKKworICAvLy8gTGlzdC11cGRhdGUuCisgIHN0cnVjdCBsaXN0X3VwZGF0ZV90YWcgOiBwdWJsaWMgYXNzb2NpYXRpdmVfdGFnIHsgfTsKKworICAvLy8gQmFzaWMgcHJpb3JpdHktcXVldWUuCisgIHN0cnVjdCBwcmlvcml0eV9xdWV1ZV90YWcgOiBwdWJsaWMgY29udGFpbmVyX3RhZyB7IH07CisKKyAgLy8vIFBhaXJpbmctaGVhcC4KKyAgc3RydWN0IHBhaXJpbmdfaGVhcF90YWcgOiBwdWJsaWMgcHJpb3JpdHlfcXVldWVfdGFnIHsgfTsKKworICAvLy8gQmlub21pYWwtaGVhcC4KKyAgc3RydWN0IGJpbm9taWFsX2hlYXBfdGFnIDogcHVibGljIHByaW9yaXR5X3F1ZXVlX3RhZyB7IH07CisKKyAgLy8vIFJlZHVuZGFudC1jb3VudGVyIGJpbm9taWFsLWhlYXAuCisgIHN0cnVjdCByY19iaW5vbWlhbF9oZWFwX3RhZyA6IHB1YmxpYyBwcmlvcml0eV9xdWV1ZV90YWcgeyB9OworCisgIC8vLyBCaW5hcnktaGVhcCAoYXJyYXktYmFzZWQpLgorICBzdHJ1Y3QgYmluYXJ5X2hlYXBfdGFnIDogcHVibGljIHByaW9yaXR5X3F1ZXVlX3RhZyB7IH07CisKKyAgLy8vIFRoaW4gaGVhcC4KKyAgc3RydWN0IHRoaW5faGVhcF90YWcgOiBwdWJsaWMgcHJpb3JpdHlfcXVldWVfdGFnIHsgfTsKKyAgLy9AfQorICAvL0B9CisKKworICAvKioKKyAgICogIEBkZWZncm91cCB0cmFpdHMgVHJhaXRzCisgICAqICBAeworICAgKi8KKworICAvKioKKyAgICogIEBicmllZiBSZXByZXNlbnRzIG5vIHR5cGUsIG9yIGFic2VuY2Ugb2YgdHlwZSwgZm9yIHRlbXBsYXRlIHRyaWNrcy4KKyAgICoKKyAgICogIEluIGEgbWFwcGVkLXBvbGljeSwgaW5kaWNhdGVzIHRoYXQgYW4gYXNzb2NpYXRpdmUgY29udGFpbmVyIGlzIGEgc2V0LgorICAgKgorICAgKiAgSW4gYSBsaXN0LXVwZGF0ZSBwb2xpY3ksIGluZGljYXRlcyB0aGF0IGVhY2ggbGluayBkb2VzIG5vdCBuZWVkCisgICAqICBtZXRhZGF0YS4KKyAgICoKKyAgICogIEluIGEgaGFzaCBwb2xpY3ksIGluZGljYXRlcyB0aGF0IHRoZSBjb21iaW5pbmcgaGFzaCBmdW5jdGlvbgorICAgKiAgaXMgYWN0dWFsbHkgYSByYW5nZWQgaGFzaCBmdW5jdGlvbi4KKyAgICoKKyAgICogIEluIGEgcHJvYmUgcG9saWN5LCBpbmRpY2F0ZXMgdGhhdCB0aGUgY29tYmluaW5nIHByb2JlIGZ1bmN0aW9uCisgICAqICBpcyBhY3R1YWxseSBhIHJhbmdlZCBwcm9iZSBmdW5jdGlvbi4KKyAgICovCisgIHN0cnVjdCBudWxsX3R5cGUgeyB9OworCisgIC8vLyBBIG51bGwgbm9kZSB1cGRhdG9yLCBpbmRpY2F0aW5nIHRoYXQgbm8gbm9kZSB1cGRhdGVzIGFyZSByZXF1aXJlZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMiwgdHlwZW5hbWUgX1RwMywgdHlwZW5hbWUgX1RwND4KKyAgICBzdHJ1Y3QgbnVsbF9ub2RlX3VwZGF0ZSA6IHB1YmxpYyBudWxsX3R5cGUKKyAgICB7IH07CisKKworICAvLy8gUHJpbWFyeSB0ZW1wbGF0ZSwgY29udGFpbmVyIHRyYWl0cyBiYXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVGFnPgorICAgIHN0cnVjdCBjb250YWluZXJfdHJhaXRzX2Jhc2U7CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uLCBjYyBoYXNoLgorICB0ZW1wbGF0ZTw+CisgIHN0cnVjdCBjb250YWluZXJfdHJhaXRzX2Jhc2U8Y2NfaGFzaF90YWc+CisgIHsKKyAgICB0eXBlZGVmIGNjX2hhc2hfdGFnIAkJCQljb250YWluZXJfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiBwb2ludF9pbnZhbGlkYXRpb25fZ3VhcmFudGVlIAkJaW52YWxpZGF0aW9uX2d1YXJhbnRlZTsKKworICAgIGVudW0KKyAgICAgIHsKKwlvcmRlcl9wcmVzZXJ2aW5nID0gZmFsc2UsCisJZXJhc2VfY2FuX3Rocm93ID0gZmFsc2UsCisJc3BsaXRfam9pbl9jYW5fdGhyb3cgPSBmYWxzZSwKKwlyZXZlcnNlX2l0ZXJhdGlvbiA9IGZhbHNlCisgICAgICB9OworICB9OworCisgIC8vLyBTcGVjaWFsaXphdGlvbiwgZ3AgaGFzaC4KKyAgdGVtcGxhdGU8PgorICBzdHJ1Y3QgY29udGFpbmVyX3RyYWl0c19iYXNlPGdwX2hhc2hfdGFnPgorICB7CisgICAgdHlwZWRlZiBncF9oYXNoX3RhZyAJCQkJY29udGFpbmVyX2NhdGVnb3J5OworICAgIHR5cGVkZWYgYmFzaWNfaW52YWxpZGF0aW9uX2d1YXJhbnRlZSAJCWludmFsaWRhdGlvbl9ndWFyYW50ZWU7CisKKyAgICBlbnVtCisgICAgICB7CisJb3JkZXJfcHJlc2VydmluZyA9IGZhbHNlLAorCWVyYXNlX2Nhbl90aHJvdyA9IGZhbHNlLAorCXNwbGl0X2pvaW5fY2FuX3Rocm93ID0gZmFsc2UsCisJcmV2ZXJzZV9pdGVyYXRpb24gPSBmYWxzZQorICAgICAgfTsKKyAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24sIHJiIHRyZWUuCisgIHRlbXBsYXRlPD4KKyAgc3RydWN0IGNvbnRhaW5lcl90cmFpdHNfYmFzZTxyYl90cmVlX3RhZz4KKyAgeworICAgIHR5cGVkZWYgcmJfdHJlZV90YWcgCQkJCWNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIHJhbmdlX2ludmFsaWRhdGlvbl9ndWFyYW50ZWUgCQlpbnZhbGlkYXRpb25fZ3VhcmFudGVlOworCisgICAgZW51bQorICAgICAgeworCW9yZGVyX3ByZXNlcnZpbmcgPSB0cnVlLAorCWVyYXNlX2Nhbl90aHJvdyA9IGZhbHNlLAorCXNwbGl0X2pvaW5fY2FuX3Rocm93ID0gZmFsc2UsCisJcmV2ZXJzZV9pdGVyYXRpb24gPSB0cnVlCisgICAgICB9OworICB9OworCisgIC8vLyBTcGVjaWFsaXphdGlvbiwgc3BsYXkgdHJlZS4KKyAgdGVtcGxhdGU8PgorICBzdHJ1Y3QgY29udGFpbmVyX3RyYWl0c19iYXNlPHNwbGF5X3RyZWVfdGFnPgorICB7CisgICAgdHlwZWRlZiBzcGxheV90cmVlX3RhZyAJCQkJY29udGFpbmVyX2NhdGVnb3J5OworICAgIHR5cGVkZWYgcmFuZ2VfaW52YWxpZGF0aW9uX2d1YXJhbnRlZSAJCWludmFsaWRhdGlvbl9ndWFyYW50ZWU7CisKKyAgICBlbnVtCisgICAgICB7CisJb3JkZXJfcHJlc2VydmluZyA9IHRydWUsCisJZXJhc2VfY2FuX3Rocm93ID0gZmFsc2UsCisJc3BsaXRfam9pbl9jYW5fdGhyb3cgPSBmYWxzZSwKKwlyZXZlcnNlX2l0ZXJhdGlvbiA9IHRydWUKKyAgICAgIH07CisgIH07CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uLCBvdiB0cmVlLgorICB0ZW1wbGF0ZTw+CisgIHN0cnVjdCBjb250YWluZXJfdHJhaXRzX2Jhc2U8b3ZfdHJlZV90YWc+CisgIHsKKyAgICB0eXBlZGVmIG92X3RyZWVfdGFnIAkJCQljb250YWluZXJfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiBiYXNpY19pbnZhbGlkYXRpb25fZ3VhcmFudGVlIAkJaW52YWxpZGF0aW9uX2d1YXJhbnRlZTsKKworICAgIGVudW0KKyAgICAgIHsKKwlvcmRlcl9wcmVzZXJ2aW5nID0gdHJ1ZSwKKwllcmFzZV9jYW5fdGhyb3cgPSB0cnVlLAorCXNwbGl0X2pvaW5fY2FuX3Rocm93ID0gdHJ1ZSwKKwlyZXZlcnNlX2l0ZXJhdGlvbiA9IGZhbHNlCisgICAgICB9OworICB9OworCisgIC8vLyBTcGVjaWFsaXphdGlvbiwgcGF0IHRyaWUuCisgIHRlbXBsYXRlPD4KKyAgc3RydWN0IGNvbnRhaW5lcl90cmFpdHNfYmFzZTxwYXRfdHJpZV90YWc+CisgIHsKKyAgICB0eXBlZGVmIHBhdF90cmllX3RhZyAJCQkJY29udGFpbmVyX2NhdGVnb3J5OworICAgIHR5cGVkZWYgcmFuZ2VfaW52YWxpZGF0aW9uX2d1YXJhbnRlZSAJCWludmFsaWRhdGlvbl9ndWFyYW50ZWU7CisKKyAgICBlbnVtCisgICAgICB7CisJb3JkZXJfcHJlc2VydmluZyA9IHRydWUsCisJZXJhc2VfY2FuX3Rocm93ID0gZmFsc2UsCisJc3BsaXRfam9pbl9jYW5fdGhyb3cgPSB0cnVlLAorCXJldmVyc2VfaXRlcmF0aW9uID0gdHJ1ZQorICAgICAgfTsKKyAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24sIGxpc3QgdXBkYXRlLgorICB0ZW1wbGF0ZTw+CisgIHN0cnVjdCBjb250YWluZXJfdHJhaXRzX2Jhc2U8bGlzdF91cGRhdGVfdGFnPgorICB7CisgICAgdHlwZWRlZiBsaXN0X3VwZGF0ZV90YWcgCQkJCWNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIHBvaW50X2ludmFsaWRhdGlvbl9ndWFyYW50ZWUgCQlpbnZhbGlkYXRpb25fZ3VhcmFudGVlOworCisgICAgZW51bQorICAgICAgeworCW9yZGVyX3ByZXNlcnZpbmcgPSBmYWxzZSwKKwllcmFzZV9jYW5fdGhyb3cgPSBmYWxzZSwKKwlzcGxpdF9qb2luX2Nhbl90aHJvdyA9IGZhbHNlLAorCXJldmVyc2VfaXRlcmF0aW9uID0gZmFsc2UKKyAgICAgIH07CisgIH07CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uLCBwYWlyaW5nIGhlYXAuCisgIHRlbXBsYXRlPD4KKyAgc3RydWN0IGNvbnRhaW5lcl90cmFpdHNfYmFzZTxwYWlyaW5nX2hlYXBfdGFnPgorICB7CisgICAgdHlwZWRlZiBwYWlyaW5nX2hlYXBfdGFnIAkJCQljb250YWluZXJfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiBwb2ludF9pbnZhbGlkYXRpb25fZ3VhcmFudGVlIAkJaW52YWxpZGF0aW9uX2d1YXJhbnRlZTsKKworICAgIGVudW0KKyAgICAgIHsKKwlvcmRlcl9wcmVzZXJ2aW5nID0gZmFsc2UsCisJZXJhc2VfY2FuX3Rocm93ID0gZmFsc2UsCisJc3BsaXRfam9pbl9jYW5fdGhyb3cgPSBmYWxzZSwKKwlyZXZlcnNlX2l0ZXJhdGlvbiA9IGZhbHNlCisgICAgICB9OworICB9OworCisgIC8vLyBTcGVjaWFsaXphdGlvbiwgdGhpbiBoZWFwLgorICB0ZW1wbGF0ZTw+CisgIHN0cnVjdCBjb250YWluZXJfdHJhaXRzX2Jhc2U8dGhpbl9oZWFwX3RhZz4KKyAgeworICAgIHR5cGVkZWYgdGhpbl9oZWFwX3RhZyAJCQkJY29udGFpbmVyX2NhdGVnb3J5OworICAgIHR5cGVkZWYgcG9pbnRfaW52YWxpZGF0aW9uX2d1YXJhbnRlZSAJCWludmFsaWRhdGlvbl9ndWFyYW50ZWU7CisKKyAgICBlbnVtCisgICAgICB7CisJb3JkZXJfcHJlc2VydmluZyA9IGZhbHNlLAorCWVyYXNlX2Nhbl90aHJvdyA9IGZhbHNlLAorCXNwbGl0X2pvaW5fY2FuX3Rocm93ID0gZmFsc2UsCisJcmV2ZXJzZV9pdGVyYXRpb24gPSBmYWxzZQorICAgICAgfTsKKyAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24sIGJpbm9taWFsIGhlYXAuCisgIHRlbXBsYXRlPD4KKyAgc3RydWN0IGNvbnRhaW5lcl90cmFpdHNfYmFzZTxiaW5vbWlhbF9oZWFwX3RhZz4KKyAgeworICAgIHR5cGVkZWYgYmlub21pYWxfaGVhcF90YWcgCQkJCWNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIHBvaW50X2ludmFsaWRhdGlvbl9ndWFyYW50ZWUgCQlpbnZhbGlkYXRpb25fZ3VhcmFudGVlOworCisgICAgZW51bQorICAgICAgeworCW9yZGVyX3ByZXNlcnZpbmcgPSBmYWxzZSwKKwllcmFzZV9jYW5fdGhyb3cgPSBmYWxzZSwKKwlzcGxpdF9qb2luX2Nhbl90aHJvdyA9IGZhbHNlLAorCXJldmVyc2VfaXRlcmF0aW9uID0gZmFsc2UKKyAgICAgIH07CisgIH07CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uLCByYyBiaW5vbWlhbCBoZWFwLgorICB0ZW1wbGF0ZTw+CisgIHN0cnVjdCBjb250YWluZXJfdHJhaXRzX2Jhc2U8cmNfYmlub21pYWxfaGVhcF90YWc+CisgIHsKKyAgICB0eXBlZGVmIHJjX2Jpbm9taWFsX2hlYXBfdGFnIAkJCWNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIHBvaW50X2ludmFsaWRhdGlvbl9ndWFyYW50ZWUgCQlpbnZhbGlkYXRpb25fZ3VhcmFudGVlOworCisgICAgZW51bQorICAgICAgeworCW9yZGVyX3ByZXNlcnZpbmcgPSBmYWxzZSwKKwllcmFzZV9jYW5fdGhyb3cgPSBmYWxzZSwKKwlzcGxpdF9qb2luX2Nhbl90aHJvdyA9IGZhbHNlLAorCXJldmVyc2VfaXRlcmF0aW9uID0gZmFsc2UKKyAgICAgIH07CisgIH07CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uLCBiaW5hcnkgaGVhcC4KKyAgdGVtcGxhdGU8PgorICBzdHJ1Y3QgY29udGFpbmVyX3RyYWl0c19iYXNlPGJpbmFyeV9oZWFwX3RhZz4KKyAgeworICAgIHR5cGVkZWYgYmluYXJ5X2hlYXBfdGFnIAkJCQljb250YWluZXJfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiBiYXNpY19pbnZhbGlkYXRpb25fZ3VhcmFudGVlIAkJaW52YWxpZGF0aW9uX2d1YXJhbnRlZTsKKworICAgIGVudW0KKyAgICAgIHsKKwlvcmRlcl9wcmVzZXJ2aW5nID0gZmFsc2UsCisJZXJhc2VfY2FuX3Rocm93ID0gZmFsc2UsCisJc3BsaXRfam9pbl9jYW5fdGhyb3cgPSB0cnVlLAorCXJldmVyc2VfaXRlcmF0aW9uID0gZmFsc2UKKyAgICAgIH07CisgIH07CisKKworICAvLy8gQ29udGFpbmVyIHRyYWl0cy4KKyAgLy8gU2VlIE1hdHQgQXVzdGVybiBmb3IgdGhlIG5hbWUsIFMuIE1leWVycyBNRUZDKysgIzIsIG90aGVycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQ250bnI+CisgIHN0cnVjdCBjb250YWluZXJfdHJhaXRzCisgIDogcHVibGljIGNvbnRhaW5lcl90cmFpdHNfYmFzZTx0eXBlbmFtZSBDbnRucjo6Y29udGFpbmVyX2NhdGVnb3J5PgorICB7CisgICAgdHlwZWRlZiBDbnRuciAJCQkJICAgICAgIGNvbnRhaW5lcl90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQ250bnI6OmNvbnRhaW5lcl9jYXRlZ29yeSAgICAgICAgIGNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIGNvbnRhaW5lcl90cmFpdHNfYmFzZTxjb250YWluZXJfY2F0ZWdvcnk+ICBiYXNlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmludmFsaWRhdGlvbl9ndWFyYW50ZWUgaW52YWxpZGF0aW9uX2d1YXJhbnRlZTsKKworICAgIGVudW0KKyAgICAgIHsKKwkvLy8gVHJ1ZSBvbmx5IGlmIENudG5yIG9iamVjdHMgZ3VhcmFudGVlIHN0b3JpbmcgIGtleXMgYnkgb3JkZXIuCisJb3JkZXJfcHJlc2VydmluZyA9IGJhc2VfdHlwZTo6b3JkZXJfcHJlc2VydmluZywKKworCS8vLyBUcnVlIG9ubHkgaWYgZXJhc2luZyBhIGtleSBjYW4gdGhyb3cuCisJZXJhc2VfY2FuX3Rocm93ID0gYmFzZV90eXBlOjplcmFzZV9jYW5fdGhyb3csCisKKwkvLy8gVHJ1ZSBvbmx5IGlmIHNwbGl0IG9yIGpvaW4gb3BlcmF0aW9ucyBjYW4gdGhyb3cuCisJc3BsaXRfam9pbl9jYW5fdGhyb3cgPSBiYXNlX3R5cGU6OnNwbGl0X2pvaW5fY2FuX3Rocm93LAorCisJLy8vIFRydWUgb25seSByZXZlcnNlIGl0ZXJhdG9ycyBhcmUgc3VwcG9ydGVkLgorCXJldmVyc2VfaXRlcmF0aW9uID0gYmFzZV90eXBlOjpyZXZlcnNlX2l0ZXJhdGlvbgorICAgICAgfTsKKyAgfTsKKyAgLy9AfQorCisKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgLy8vIERpc3BhdGNoIG1lY2hhbmlzbSwgcHJpbWFyeSB0ZW1wbGF0ZSBmb3IgYXNzb2NpYXRpdmUgdHlwZXMuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgVGFnLAorCSAgICAgdHlwZW5hbWUgUG9saWN5X1RsID0gbnVsbF90eXBlPgorICAgICAgc3RydWN0IGNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoOworICB9IC8vIG5hbWVzcGFjZSBfX2RldGFpbAorICAvL0B9Cit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMTUxM2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy90cmVlX3BvbGljeS5ocHAKQEAgLTAsMCArMSwxNTcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdHJlZV9wb2xpY3kuaHBwCisgKiBDb250YWlucyB0cmVlLXJlbGF0ZWQgcG9saWNpZXMuCisgKi8KKworI2lmbmRlZiBQQl9EU19UUkVFX1BPTElDWV9IUFAKKyNkZWZpbmUgUEJfRFNfVFJFRV9QT0xJQ1lfSFBQCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZV91dGlscy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9icmFuY2hfcG9saWN5L2JyYW5jaF9wb2xpY3kuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwgdHlwZW5hbWUgTm9kZV9JdHIsIHR5cGVuYW1lIENtcF9GbiwgXAorCSAgIHR5cGVuYW1lIF9BbGxvYz4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgIHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZTxOb2RlX0NJdHIsIE5vZGVfSXRyLCBDbXBfRm4sIF9BbGxvYz4KKworI2RlZmluZSBQQl9EU19CUkFOQ0hfUE9MSUNZX0JBU0UgXAorICBkZXRhaWw6OmJyYW5jaF9wb2xpY3k8Tm9kZV9DSXRyLCBOb2RlX0l0ciwgX0FsbG9jPgorCisgIC8vLyBGdW5jdG9yIHVwZGF0aW5nIHJhbmtzIG9mIGVudHJlZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwgdHlwZW5hbWUgTm9kZV9JdHIsIAorCSAgIHR5cGVuYW1lIENtcF9GbiwgdHlwZW5hbWUgX0FsbG9jPgorICBjbGFzcyB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGUgOiBwcml2YXRlIFBCX0RTX0JSQU5DSF9QT0xJQ1lfQkFTRQorICB7CisgIHByaXZhdGU6CisgICAgdHlwZWRlZiBQQl9EU19CUkFOQ0hfUE9MSUNZX0JBU0UgCQkgICAgICAgCWJhc2VfdHlwZTsKKworICBwdWJsaWM6CisgICAgdHlwZWRlZiBDbXBfRm4gCQkJCQljbXBfZm47CisgICAgdHlwZWRlZiBfQWxsb2MgCQkJCQlhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpzaXplX3R5cGUgCQlzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmtleV90eXBlIAkJa2V5X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmtleV9jb25zdF9yZWZlcmVuY2UgCWtleV9jb25zdF9yZWZlcmVuY2U7CisKKyAgICB0eXBlZGVmIHNpemVfdHlwZSAJCQkJCW1ldGFkYXRhX3R5cGU7CisgICAgdHlwZWRlZiBOb2RlX0NJdHIgCSAgICAgICAJCQlub2RlX2NvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgTm9kZV9JdHIgCQkJCQlub2RlX2l0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgbm9kZV9jb25zdF9pdGVyYXRvcjo6dmFsdWVfdHlwZSAJY29uc3RfaXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBub2RlX2l0ZXJhdG9yOjp2YWx1ZV90eXBlIAkJaXRlcmF0b3I7CisKKyAgICAvLy8gRmluZHMgYW4gZW50cnkgYnkgX19vcmRlci4gUmV0dXJucyBhIGNvbnN0X2l0ZXJhdG9yIHRvIHRoZQorICAgIC8vLyBlbnRyeSB3aXRoIHRoZSBfX29yZGVyIG9yZGVyLCBvciBhIGNvbnN0X2l0ZXJhdG9yIHRvIHRoZQorICAgIC8vLyBjb250YWluZXIgb2JqZWN0J3MgZW5kIGlmIG9yZGVyIGlzIGF0IGxlYXN0IHRoZSBzaXplIG9mIHRoZQorICAgIC8vLyBjb250YWluZXIgb2JqZWN0LgorICAgIGlubGluZSBjb25zdF9pdGVyYXRvcgorICAgIGZpbmRfYnlfb3JkZXIoc2l6ZV90eXBlKSBjb25zdDsKKworICAgIC8vLyBGaW5kcyBhbiBlbnRyeSBieSBfX29yZGVyLiBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBlbnRyeQorICAgIC8vLyB3aXRoIHRoZSBfX29yZGVyIG9yZGVyLCBvciBhbiBpdGVyYXRvciB0byB0aGUgY29udGFpbmVyCisgICAgLy8vIG9iamVjdCdzIGVuZCBpZiBvcmRlciBpcyBhdCBsZWFzdCB0aGUgc2l6ZSBvZiB0aGUgY29udGFpbmVyCisgICAgLy8vIG9iamVjdC4KKyAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICBmaW5kX2J5X29yZGVyKHNpemVfdHlwZSk7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgb3JkZXIgb2YgYSBrZXkgd2l0aGluIGEgc2VxdWVuY2UuIEZvciBleGFwbWxlLCBpZgorICAgIC8vLyByX2tleSBpcyB0aGUgc21hbGxlc3Qga2V5LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiAwOyBpZiByX2tleQorICAgIC8vLyBpcyBhIGtleSBiZXR3ZWVuIHRoZSBzbWFsbGVzdCBhbmQgbmV4dCBrZXksIHRoaXMgbWV0aG9kIHdpbGwKKyAgICAvLy8gcmV0dXJuIDE7IGlmIHJfa2V5IGlzIGEga2V5IGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IGtleSwgdGhpcworICAgIC8vLyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHNpemUgb2Ygcl9jLgorICAgIGlubGluZSBzaXplX3R5cGUKKyAgICBvcmRlcl9vZl9rZXkoa2V5X2NvbnN0X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gQ29uc3QgcmVmZXJlbmNlIHRvIHRoZSBjb250YWluZXIncyB2YWx1ZS10eXBlLgorICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9yZWZlcmVuY2UgCWNvbnN0X3JlZmVyZW5jZTsKKworICAgIC8vLyBDb25zdCBwb2ludGVyIHRvIHRoZSBjb250YWluZXIncyB2YWx1ZS10eXBlLgorICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9wb2ludGVyIAkJY29uc3RfcG9pbnRlcjsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8bWV0YWRhdGFfdHlwZT46Om90aGVyIF9fcmViaW5kX207CisKKyAgICAvLy8gQ29uc3QgbWV0YWRhdGEgcmVmZXJlbmNlLgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yZWJpbmRfbTo6Y29uc3RfcmVmZXJlbmNlICAgICAgIG1ldGFkYXRhX2NvbnN0X3JlZmVyZW5jZTsKKworICAgIC8vLyBNZXRhZGF0YSByZWZlcmVuY2UuCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tOjpyZWZlcmVuY2UgCQltZXRhZGF0YV9yZWZlcmVuY2U7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgbm9kZV9jb25zdF9pdGVyYXRvciBhc3NvY2lhdGVkIHdpdGggdGhlIHRyZWUncyByb290IG5vZGUuCisgICAgdmlydHVhbCBub2RlX2NvbnN0X2l0ZXJhdG9yCisgICAgbm9kZV9iZWdpbigpIGNvbnN0ID0gMDsKKworICAgIC8vLyBSZXR1cm5zIHRoZSBub2RlX2l0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJlZSdzIHJvb3Qgbm9kZS4KKyAgICB2aXJ0dWFsIG5vZGVfaXRlcmF0b3IKKyAgICBub2RlX2JlZ2luKCkgPSAwOworCisgICAgLy8vIFJldHVybnMgdGhlIG5vZGVfY29uc3RfaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIGEganVzdC1hZnRlciBsZWFmIG5vZGUuCisgICAgdmlydHVhbCBub2RlX2NvbnN0X2l0ZXJhdG9yCisgICAgbm9kZV9lbmQoKSBjb25zdCA9IDA7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgbm9kZV9pdGVyYXRvciBhc3NvY2lhdGVkIHdpdGggYSBqdXN0LWFmdGVyIGxlYWYgbm9kZS4KKyAgICB2aXJ0dWFsIG5vZGVfaXRlcmF0b3IKKyAgICBub2RlX2VuZCgpID0gMDsKKworICAgIC8vLyBBY2Nlc3MgdG8gdGhlIGNtcF9mbiBvYmplY3QuCisgICAgdmlydHVhbCBjbXBfZm4mIAorICAgIGdldF9jbXBfZm4oKSA9IDA7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vLyBVcGRhdGVzIHRoZSByYW5rIG9mIGEgbm9kZSB0aHJvdWdoIGEgbm9kZV9pdGVyYXRvciBub2RlX2l0OworICAgIC8vLyBlbmRfbmRfaXQgaXMgdGhlIGVuZCBub2RlIGl0ZXJhdG9yLgorICAgIGlubGluZSB2b2lkCisgICAgb3BlcmF0b3IoKShub2RlX2l0ZXJhdG9yLCBub2RlX2NvbnN0X2l0ZXJhdG9yKSBjb25zdDsKKworICAgIHZpcnR1YWwKKyAgICB+dHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlKCk7CisgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3RyZWVfcG9saWN5L29yZGVyX3N0YXRpc3RpY3NfaW1wLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKyN1bmRlZiBQQl9EU19CUkFOQ0hfUE9MSUNZX0JBU0UKKworfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy90cmllX3BvbGljeS5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wYl9kcy90cmllX3BvbGljeS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwYWUwYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BiX2RzL3RyaWVfcG9saWN5LmhwcApAQCAtMCwwICsxLDM2MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0cmllX3BvbGljeS5ocHAKKyAqIENvbnRhaW5zIHRyaWUtcmVsYXRlZCBwb2xpY2llcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX1RSSUVfUE9MSUNZX0hQUAorI2RlZmluZSBQQl9EU19UUklFX1BPTElDWV9IUFAKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZV91dGlscy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS90cmllX3BvbGljeV9iYXNlLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJpbmcsIHR5cGVuYW1lIFN0cmluZzo6dmFsdWVfdHlwZSBNaW5fRV9WYWwsIFwKKwkgICB0eXBlbmFtZSBTdHJpbmc6OnZhbHVlX3R5cGUgTWF4X0VfVmFsLCBib29sIFJldmVyc2UsIFwKKwkgICB0eXBlbmFtZSBfQWxsb2M+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICB0cmllX3N0cmluZ19hY2Nlc3NfdHJhaXRzPFN0cmluZywgTWluX0VfVmFsLE1heF9FX1ZhbCxSZXZlcnNlLF9BbGxvYz4KKworICAvKioKKyAgICogIEVsZW1lbnQgYWNjZXNzIHRyYWl0cyBmb3Igc3RyaW5nIHR5cGVzLgorICAgKgorICAgKiAgQHRwYXJhbSBTdHJpbmcgCSAgICAJU3RyaW5nIHR5cGUuCisgICAqICBAdHBhcmFtIE1pbl9FX1ZhbCAgICAgICAgCU1pbmltYWwgZWxlbWVudCB2YWx1ZS4KKyAgICogIEB0cGFyYW0gTWF4X0VfVmFsCSAgICAJTWF4aW11bSBlbGVtZW50IHZhbHVlLgorICAgKiAgQHRwYXJhbSBSZXZlcnNlCSAgICAgICAgUmV2ZXJzZSBpdGVyYXRpb24gc2hvdWxkIGJlIHVzZWQuCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IGZhbHNlLgorICAgKiAgQHRwYXJhbSBfQWxsb2MgCSAgICAJQWxsb2NhdG9yIHR5cGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJpbmcgPSBzdGQ6OnN0cmluZywKKwkgICB0eXBlbmFtZSBTdHJpbmc6OnZhbHVlX3R5cGUgTWluX0VfVmFsID0gZGV0YWlsOjpfX251bWVyaWNfdHJhaXRzPHR5cGVuYW1lIFN0cmluZzo6dmFsdWVfdHlwZT46Ol9fbWluLAorCSAgIHR5cGVuYW1lIFN0cmluZzo6dmFsdWVfdHlwZSBNYXhfRV9WYWwgPSBkZXRhaWw6Ol9fbnVtZXJpY190cmFpdHM8dHlwZW5hbWUgU3RyaW5nOjp2YWx1ZV90eXBlPjo6X19tYXgsCisJICAgYm9vbCBSZXZlcnNlID0gZmFsc2UsCisJICAgdHlwZW5hbWUgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8Y2hhcj4gPgorICBzdHJ1Y3QgdHJpZV9zdHJpbmdfYWNjZXNzX3RyYWl0cworICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlCQkJICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiBTdHJpbmcgCQkJCQkgIGtleV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8a2V5X3R5cGU+CSAgX19yZWJpbmRfazsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX2s6Om90aGVyOjpjb25zdF9yZWZlcmVuY2UgICBrZXlfY29uc3RfcmVmZXJlbmNlOworCisgICAgZW51bQorICAgICAgeworCXJldmVyc2UgPSBSZXZlcnNlCisgICAgICB9OworCisgICAgLy8vIEVsZW1lbnQgY29uc3QgaXRlcmF0b3IgdHlwZS4KKyAgICB0eXBlZGVmIHR5cGVuYW1lIGRldGFpbDo6X19jb25kaXRpb25hbF90eXBlPFJldmVyc2UsIFwKKwkJICAgICAgIHR5cGVuYW1lIFN0cmluZzo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciwgXAorCQkgICAgICAgdHlwZW5hbWUgU3RyaW5nOjpjb25zdF9pdGVyYXRvcj46Ol9fdHlwZSBjb25zdF9pdGVyYXRvcjsKKworICAgIC8vLyBFbGVtZW50IHR5cGUuCisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxjb25zdF9pdGVyYXRvcj46OnZhbHVlX3R5cGUgZV90eXBlOworCisgICAgZW51bQorICAgICAgeworCW1pbl9lX3ZhbCA9IE1pbl9FX1ZhbCwKKwltYXhfZV92YWwgPSBNYXhfRV9WYWwsCisJbWF4X3NpemUgPSBtYXhfZV92YWwgLSBtaW5fZV92YWwgKyAxCisgICAgICB9OworICAgIFBCX0RTX1NUQVRJQ19BU1NFUlQobWluX21heF9zaXplLCBtYXhfc2l6ZSA+PSAyKTsKKworICAgIC8vLyBSZXR1cm5zIGEgY29uc3RfaXRlcmF0b3IgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YKKyAgICAvLy8ga2V5X2NvbnN0X3JlZmVyZW5jZSBhZ3VtbmV0LgorICAgIGlubGluZSBzdGF0aWMgY29uc3RfaXRlcmF0b3IKKyAgICBiZWdpbihrZXlfY29uc3RfcmVmZXJlbmNlKTsKKworICAgIC8vLyBSZXR1cm5zIGEgY29uc3RfaXRlcmF0b3IgdG8gdGhlIGFmdGVyLWxhc3QgZWxlbWVudCBvZgorICAgIC8vLyBrZXlfY29uc3RfcmVmZXJlbmNlIGFyZ3VtZW50LgorICAgIGlubGluZSBzdGF0aWMgY29uc3RfaXRlcmF0b3IKKyAgICBlbmQoa2V5X2NvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAvLy8gTWFwcyBhbiBlbGVtZW50IHRvIGEgcG9zaXRpb24uCisgICAgaW5saW5lIHN0YXRpYyBzaXplX3R5cGUKKyAgICBlX3BvcyhlX3R5cGUgZSk7CisKKyAgcHJpdmF0ZToKKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0X2l0ZXJhdG9yCisgICAgYmVnaW5faW1wKGtleV9jb25zdF9yZWZlcmVuY2UsIGRldGFpbDo6ZmFsc2VfdHlwZSk7CisKKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0X2l0ZXJhdG9yCisgICAgYmVnaW5faW1wKGtleV9jb25zdF9yZWZlcmVuY2UsIGRldGFpbDo6dHJ1ZV90eXBlKTsKKworICAgIGlubGluZSBzdGF0aWMgY29uc3RfaXRlcmF0b3IKKyAgICBlbmRfaW1wKGtleV9jb25zdF9yZWZlcmVuY2UsIGRldGFpbDo6ZmFsc2VfdHlwZSk7CisKKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0X2l0ZXJhdG9yCisgICAgZW5kX2ltcChrZXlfY29uc3RfcmVmZXJlbmNlLCBkZXRhaWw6OnRydWVfdHlwZSk7CisKKyAgICBzdGF0aWMgZGV0YWlsOjppbnRlZ3JhbF9jb25zdGFudDxpbnQsIFJldmVyc2U+IHNfcmV2X2luZDsKKyAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvdHJpZV9zdHJpbmdfYWNjZXNzX3RyYWl0c19pbXAuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9DSXRyLHR5cGVuYW1lIE5vZGVfSXRyLCBcCisJICAgdHlwZW5hbWUgX0FUcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgIHRyaWVfcHJlZml4X3NlYXJjaF9ub2RlX3VwZGF0ZTxOb2RlX0NJdHIsIE5vZGVfSXRyLCBcCisJCQkJIF9BVHJhaXRzLF9BbGxvYz4KKworI2RlZmluZSBQQl9EU19UUklFX1BPTElDWV9CQVNFIFwKKyAgZGV0YWlsOjp0cmllX3BvbGljeV9iYXNlPE5vZGVfQ0l0cixOb2RlX0l0cixfQVRyYWl0cywgX0FsbG9jPgorCisgIC8vLyBBIG5vZGUgdXBkYXRvciB0aGF0IGFsbG93cyB0cmllcyB0byBiZSBzZWFyY2hlZCBmb3IgdGhlIHJhbmdlIG9mCisgIC8vLyB2YWx1ZXMgdGhhdCBtYXRjaCBhIGNlcnRhaW4gcHJlZml4LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX0NJdHIsCisJICAgdHlwZW5hbWUgTm9kZV9JdHIsCisJICAgdHlwZW5hbWUgX0FUcmFpdHMsCisJICAgdHlwZW5hbWUgX0FsbG9jPgorICBjbGFzcyB0cmllX3ByZWZpeF9zZWFyY2hfbm9kZV91cGRhdGUgOiBwcml2YXRlIFBCX0RTX1RSSUVfUE9MSUNZX0JBU0UKKyAgeworICBwcml2YXRlOgorICAgIHR5cGVkZWYgUEJfRFNfVFJJRV9QT0xJQ1lfQkFTRSAJCSAgICAgICAJYmFzZV90eXBlOworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6a2V5X3R5cGUgCQlrZXlfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6a2V5X2NvbnN0X3JlZmVyZW5jZSAJa2V5X2NvbnN0X3JlZmVyZW5jZTsKKworICAgIC8vLyBFbGVtZW50IGFjY2VzcyB0cmFpdHMuCisgICAgdHlwZWRlZiBfQVRyYWl0cyAJCQkJYWNjZXNzX3RyYWl0czsKKworICAgIC8vLyBDb25zdCBlbGVtZW50IGl0ZXJhdG9yLgorICAgIHR5cGVkZWYgdHlwZW5hbWUgYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgCWFfY29uc3RfaXRlcmF0b3I7CisKKyAgICAvLy8gX0FsbG9jIHR5cGUuCisgICAgdHlwZWRlZiBfQWxsb2MgCSAgICAgICAJCQkJYWxsb2NhdG9yX3R5cGU7CisKKyAgICAvLy8gU2l6ZSB0eXBlLgorICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnNpemVfdHlwZSAJCXNpemVfdHlwZTsKKyAgICB0eXBlZGVmIG51bGxfdHlwZSAJCQkJCW1ldGFkYXRhX3R5cGU7CisgICAgdHlwZWRlZiBOb2RlX0l0ciAJCQkJCW5vZGVfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBOb2RlX0NJdHIgCQkJCQlub2RlX2NvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgbm9kZV9pdGVyYXRvcjo6dmFsdWVfdHlwZSAJCWl0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgbm9kZV9jb25zdF9pdGVyYXRvcjo6dmFsdWVfdHlwZSAJY29uc3RfaXRlcmF0b3I7CisKKyAgICAvLy8gRmluZHMgdGhlIGNvbnN0IGl0ZXJhdG9yIHJhbmdlIGNvcnJlc3BvbmRpbmcgdG8gYWxsIHZhbHVlcworICAgIC8vLyB3aG9zZSBwcmVmaXhlcyBtYXRjaCByX2tleS4KKyAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgIHByZWZpeF9yYW5nZShrZXlfY29uc3RfcmVmZXJlbmNlKSBjb25zdDsKKworICAgIC8vLyBGaW5kcyB0aGUgaXRlcmF0b3IgcmFuZ2UgY29ycmVzcG9uZGluZyB0byBhbGwgdmFsdWVzIHdob3NlCisgICAgLy8vIHByZWZpeGVzIG1hdGNoIHJfa2V5LgorICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgcHJlZml4X3JhbmdlKGtleV9jb25zdF9yZWZlcmVuY2UpOworCisgICAgLy8vIEZpbmRzIHRoZSBjb25zdCBpdGVyYXRvciByYW5nZSBjb3JyZXNwb25kaW5nIHRvIGFsbCB2YWx1ZXMKKyAgICAvLy8gd2hvc2UgcHJlZml4ZXMgbWF0Y2ggW2IsIGUpLgorICAgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+CisgICAgcHJlZml4X3JhbmdlKGFfY29uc3RfaXRlcmF0b3IsIGFfY29uc3RfaXRlcmF0b3IpIGNvbnN0OworCisgICAgLy8vIEZpbmRzIHRoZSBpdGVyYXRvciByYW5nZSBjb3JyZXNwb25kaW5nIHRvIGFsbCB2YWx1ZXMgd2hvc2UKKyAgICAvLy8gcHJlZml4ZXMgbWF0Y2ggW2IsIGUpLgorICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgcHJlZml4X3JhbmdlKGFfY29uc3RfaXRlcmF0b3IsIGFfY29uc3RfaXRlcmF0b3IpOworCisgIHByb3RlY3RlZDoKKyAgICAvLy8gQ2FsbGVkIHRvIHVwZGF0ZSBhIG5vZGUncyBtZXRhZGF0YS4KKyAgICBpbmxpbmUgdm9pZAorICAgIG9wZXJhdG9yKCkobm9kZV9pdGVyYXRvciBub2RlX2l0LCBub2RlX2NvbnN0X2l0ZXJhdG9yIGVuZF9uZF9pdCkgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICBub2RlX2l0ZXJhdG9yCisgICAgbmV4dF9jaGlsZChub2RlX2l0ZXJhdG9yLCBhX2NvbnN0X2l0ZXJhdG9yLCBhX2NvbnN0X2l0ZXJhdG9yLAorCSAgICAgICBub2RlX2l0ZXJhdG9yLCBjb25zdCBhY2Nlc3NfdHJhaXRzJik7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgY29uc3QgaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBqdXN0LWFmdGVyIGxhc3QgZWxlbWVudC4KKyAgICB2aXJ0dWFsIGNvbnN0X2l0ZXJhdG9yCisgICAgZW5kKCkgY29uc3QgPSAwOworCisgICAgLy8vIFJldHVybnMgdGhlIGl0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUganVzdC1hZnRlciBsYXN0IGVsZW1lbnQuCisgICAgdmlydHVhbCBpdGVyYXRvcgorICAgIGVuZCgpID0gMDsKKworICAgIC8vLyBSZXR1cm5zIHRoZSBub2RlX2NvbnN0X2l0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJpZSdzIHJvb3Qgbm9kZS4KKyAgICB2aXJ0dWFsIG5vZGVfY29uc3RfaXRlcmF0b3IKKyAgICBub2RlX2JlZ2luKCkgY29uc3QgPSAwOworCisgICAgLy8vIFJldHVybnMgdGhlIG5vZGVfaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmllJ3Mgcm9vdCBub2RlLgorICAgIHZpcnR1YWwgbm9kZV9pdGVyYXRvcgorICAgIG5vZGVfYmVnaW4oKSA9IDA7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgbm9kZV9jb25zdF9pdGVyYXRvciBhc3NvY2lhdGVkIHdpdGggYSBqdXN0LWFmdGVyIGxlYWYgbm9kZS4KKyAgICB2aXJ0dWFsIG5vZGVfY29uc3RfaXRlcmF0b3IKKyAgICBub2RlX2VuZCgpIGNvbnN0ID0gMDsKKworICAgIC8vLyBSZXR1cm5zIHRoZSBub2RlX2l0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCBhIGp1c3QtYWZ0ZXIgbGVhZiBub2RlLgorICAgIHZpcnR1YWwgbm9kZV9pdGVyYXRvcgorICAgIG5vZGVfZW5kKCkgPSAwOworCisgICAgLy8vIEFjY2VzcyB0byB0aGUgY21wX2ZuIG9iamVjdC4KKyAgICB2aXJ0dWFsIGNvbnN0IGFjY2Vzc190cmFpdHMmCisgICAgZ2V0X2FjY2Vzc190cmFpdHMoKSBjb25zdCA9IDA7CisgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L3ByZWZpeF9zZWFyY2hfbm9kZV91cGRhdGVfaW1wLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICB0cmllX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGU8Tm9kZV9DSXRyLCBOb2RlX0l0ciwgXAorCQkJCSAgICBfQVRyYWl0cywgX0FsbG9jPgorCisgIC8vLyBGdW5jdG9yIHVwZGF0aW5nIHJhbmtzIG9mIGVudHJlZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfQ0l0ciwKKwkgICB0eXBlbmFtZSBOb2RlX0l0ciwKKwkgICB0eXBlbmFtZSBfQVRyYWl0cywKKwkgICB0eXBlbmFtZSBfQWxsb2M+CisgIGNsYXNzIHRyaWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZSA6IHByaXZhdGUgUEJfRFNfVFJJRV9QT0xJQ1lfQkFTRQorICB7CisgIHByaXZhdGU6CisgICAgdHlwZWRlZiBQQl9EU19UUklFX1BPTElDWV9CQVNFIAkJICAgICAgIAliYXNlX3R5cGU7CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgX0FUcmFpdHMgCQkJCWFjY2Vzc190cmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciAJYV9jb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9BbGxvYyAJCQkJCWFsbG9jYXRvcl90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnNpemVfdHlwZSAJCXNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6a2V5X3R5cGUgCQlrZXlfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6a2V5X2NvbnN0X3JlZmVyZW5jZSAJa2V5X2NvbnN0X3JlZmVyZW5jZTsKKworICAgIHR5cGVkZWYgc2l6ZV90eXBlIAkJCQkJbWV0YWRhdGFfdHlwZTsKKyAgICB0eXBlZGVmIE5vZGVfQ0l0ciAJCQkJCW5vZGVfY29uc3RfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBOb2RlX0l0ciAJCQkJCW5vZGVfaXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBub2RlX2NvbnN0X2l0ZXJhdG9yOjp2YWx1ZV90eXBlIAljb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIG5vZGVfaXRlcmF0b3I6OnZhbHVlX3R5cGUgCQlpdGVyYXRvcjsKKworICAgIC8vLyBGaW5kcyBhbiBlbnRyeSBieSBfX29yZGVyLiBSZXR1cm5zIGEgY29uc3RfaXRlcmF0b3IgdG8gdGhlCisgICAgLy8vIGVudHJ5IHdpdGggdGhlIF9fb3JkZXIgb3JkZXIsIG9yIGEgY29uc3RfaXRlcmF0b3IgdG8gdGhlCisgICAgLy8vIGNvbnRhaW5lciBvYmplY3QncyBlbmQgaWYgb3JkZXIgaXMgYXQgbGVhc3QgdGhlIHNpemUgb2YgdGhlCisgICAgLy8vIGNvbnRhaW5lciBvYmplY3QuCisgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgZmluZF9ieV9vcmRlcihzaXplX3R5cGUpIGNvbnN0OworCisgICAgLy8vIEZpbmRzIGFuIGVudHJ5IGJ5IF9fb3JkZXIuIFJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGVudHJ5CisgICAgLy8vIHdpdGggdGhlIF9fb3JkZXIgb3JkZXIsIG9yIGFuIGl0ZXJhdG9yIHRvIHRoZSBjb250YWluZXIKKyAgICAvLy8gb2JqZWN0J3MgZW5kIGlmIG9yZGVyIGlzIGF0IGxlYXN0IHRoZSBzaXplIG9mIHRoZSBjb250YWluZXIKKyAgICAvLy8gb2JqZWN0LgorICAgIGlubGluZSBpdGVyYXRvcgorICAgIGZpbmRfYnlfb3JkZXIoc2l6ZV90eXBlKTsKKworICAgIC8vLyBSZXR1cm5zIHRoZSBvcmRlciBvZiBhIGtleSB3aXRoaW4gYSBzZXF1ZW5jZS4gRm9yIGV4YXBtbGUsIGlmCisgICAgLy8vIHJfa2V5IGlzIHRoZSBzbWFsbGVzdCBrZXksIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDA7IGlmIHJfa2V5CisgICAgLy8vIGlzIGEga2V5IGJldHdlZW4gdGhlIHNtYWxsZXN0IGFuZCBuZXh0IGtleSwgdGhpcyBtZXRob2Qgd2lsbAorICAgIC8vLyByZXR1cm4gMTsgaWYgcl9rZXkgaXMgYSBrZXkgbGFyZ2VyIHRoYW4gdGhlIGxhcmdlc3Qga2V5LCB0aGlzCisgICAgLy8vIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgc2l6ZSBvZiByX2MuCisgICAgaW5saW5lIHNpemVfdHlwZQorICAgIG9yZGVyX29mX2tleShrZXlfY29uc3RfcmVmZXJlbmNlKSBjb25zdDsKKworICAgIC8vLyBSZXR1cm5zIHRoZSBvcmRlciBvZiBhIHByZWZpeCB3aXRoaW4gYSBzZXF1ZW5jZS4gRm9yIGV4YXBtbGUsCisgICAgLy8vIGlmIFtiLCBlXSBpcyB0aGUgc21hbGxlc3QgcHJlZml4LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiAwOyBpZgorICAgIC8vLyByX2tleSBpcyBhIGtleSBiZXR3ZWVuIHRoZSBzbWFsbGVzdCBhbmQgbmV4dCBrZXksIHRoaXMgbWV0aG9kCisgICAgLy8vIHdpbGwgcmV0dXJuIDE7IGlmIHJfa2V5IGlzIGEga2V5IGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IGtleSwKKyAgICAvLy8gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHNpemUgb2Ygcl9jLgorICAgIGlubGluZSBzaXplX3R5cGUKKyAgICBvcmRlcl9vZl9wcmVmaXgoYV9jb25zdF9pdGVyYXRvciwgYV9jb25zdF9pdGVyYXRvcikgY29uc3Q7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vLyBVcGRhdGVzIHRoZSByYW5rIG9mIGEgbm9kZSB0aHJvdWdoIGEgbm9kZV9pdGVyYXRvciBub2RlX2l0OworICAgIC8vLyBlbmRfbmRfaXQgaXMgdGhlIGVuZCBub2RlIGl0ZXJhdG9yLgorICAgIGlubGluZSB2b2lkCisgICAgb3BlcmF0b3IoKShub2RlX2l0ZXJhdG9yLCBub2RlX2NvbnN0X2l0ZXJhdG9yKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9yZWZlcmVuY2UgCWNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfcG9pbnRlciAJCWNvbnN0X3BvaW50ZXI7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPG1ldGFkYXRhX3R5cGU+IF9fcmViaW5kX207CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tOjpvdGhlciAJCQlfX3JlYmluZF9tYTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmViaW5kX21hOjpjb25zdF9yZWZlcmVuY2UgICAgICBtZXRhZGF0YV9jb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JlYmluZF9tYTo6cmVmZXJlbmNlIAkJbWV0YWRhdGFfcmVmZXJlbmNlOworCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29udGFpbmVyIGlzIGVtcHR5LgorICAgIHZpcnR1YWwgYm9vbAorICAgIGVtcHR5KCkgY29uc3QgPSAwOworCisgICAgLy8vIFJldHVybnMgdGhlIGl0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJpZSdzIGZpcnN0IGVsZW1lbnQuCisgICAgdmlydHVhbCBpdGVyYXRvcgorICAgIGJlZ2luKCkgPSAwOworCisgICAgLy8vIFJldHVybnMgdGhlIGl0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJpZSdzCisgICAgLy8vIGp1c3QtYWZ0ZXItbGFzdCBlbGVtZW50LgorICAgIHZpcnR1YWwgaXRlcmF0b3IKKyAgICBlbmQoKSA9IDA7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgbm9kZV9jb25zdF9pdGVyYXRvciBhc3NvY2lhdGVkIHdpdGggdGhlIHRyaWUncyByb290IG5vZGUuCisgICAgdmlydHVhbCBub2RlX2NvbnN0X2l0ZXJhdG9yCisgICAgbm9kZV9iZWdpbigpIGNvbnN0ID0gMDsKKworICAgIC8vLyBSZXR1cm5zIHRoZSBub2RlX2l0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJpZSdzIHJvb3Qgbm9kZS4KKyAgICB2aXJ0dWFsIG5vZGVfaXRlcmF0b3IKKyAgICBub2RlX2JlZ2luKCkgPSAwOworCisgICAgLy8vIFJldHVybnMgdGhlIG5vZGVfY29uc3RfaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIGEganVzdC1hZnRlcgorICAgIC8vLyBsZWFmIG5vZGUuCisgICAgdmlydHVhbCBub2RlX2NvbnN0X2l0ZXJhdG9yCisgICAgbm9kZV9lbmQoKSBjb25zdCA9IDA7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgbm9kZV9pdGVyYXRvciBhc3NvY2lhdGVkIHdpdGggYSBqdXN0LWFmdGVyIGxlYWYgbm9kZS4KKyAgICB2aXJ0dWFsIG5vZGVfaXRlcmF0b3IKKyAgICBub2RlX2VuZCgpID0gMDsKKworICAgIC8vLyBBY2Nlc3MgdG8gdGhlIGNtcF9mbiBvYmplY3QuCisgICAgdmlydHVhbCBhY2Nlc3NfdHJhaXRzJgorICAgIGdldF9hY2Nlc3NfdHJhaXRzKCkgPSAwOworICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9vcmRlcl9zdGF0aXN0aWNzX2ltcC5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfVFJJRV9QT0xJQ1lfQkFTRQorCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcG9kX2NoYXJfdHJhaXRzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wb2RfY2hhcl90cmFpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2Q4NmZmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcG9kX2NoYXJfdHJhaXRzLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8vIFBPRCBjaGFyYWN0ZXIsIHN0ZDo6Y2hhcl90cmFpdHMgc3BlY2lhbGl6YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAyLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9wb2RfY2hhcl90cmFpdHMuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIEdhYnJpZWwgRG9zIFJlaXMgPGdkckBpbnRlZ3JhYmxlLXNvbHV0aW9ucy5uZXQ+CisvLyBCZW5qYW1pbiBLb3NuaWsgPGJrb3pAcmVkaGF0LmNvbT4KKworI2lmbmRlZiBfUE9EX0NIQVJfVFJBSVRTX0gKKyNkZWZpbmUgX1BPRF9DSEFSX1RSQUlUU19IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gUE9EIGNoYXJhY3RlciBhYnN0cmFjdGlvbi4KKyAgLy8gTkI6IFRoZSBjaGFyX3R5cGUgcGFyYW1ldGVyIGlzIGEgc3Vic2V0IG9mIGludF90eXBlLCBhcyB0byBhbGxvdworICAvLyBpbnRfdHlwZSB0byBwcm9wZXJseSBob2xkIHRoZSBmdWxsIHJhbmdlIG9mIGNoYXJfdHlwZSB2YWx1ZXMgYXMKKyAgLy8gd2VsbCBhcyBFT0YuCisgIC8vLyBAYnJpZWYgQSBQT0QgY2xhc3MgdGhhdCBzZXJ2ZXMgYXMgYSBjaGFyYWN0ZXIgYWJzdHJhY3Rpb24gY2xhc3MuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFYsIHR5cGVuYW1lIEksIHR5cGVuYW1lIFMgPSBzdGQ6Om1ic3RhdGVfdD4KKyAgICBzdHJ1Y3QgY2hhcmFjdGVyCisgICAgeworICAgICAgdHlwZWRlZiBWCQkJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIEkJCQkJaW50X3R5cGU7CisgICAgICB0eXBlZGVmIFMJCQkJc3RhdGVfdHlwZTsKKyAgICAgIHR5cGVkZWYgY2hhcmFjdGVyPFYsIEksIFM+CWNoYXJfdHlwZTsKKworICAgICAgdmFsdWVfdHlwZQl2YWx1ZTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVjI+CisgICAgICAgIHN0YXRpYyBjaGFyX3R5cGUKKyAgICAgICAgZnJvbShjb25zdCBWMiYgdikKKyAgICAgICAgeworCSAgY2hhcl90eXBlIHJldCA9IHsgc3RhdGljX2Nhc3Q8dmFsdWVfdHlwZT4odikgfTsKKwkgIHJldHVybiByZXQ7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWMj4KKyAgICAgICAgc3RhdGljIFYyCisgICAgICAgIHRvKGNvbnN0IGNoYXJfdHlwZSYgYykKKyAgICAgICAgeworCSAgVjIgcmV0ID0geyBzdGF0aWNfY2FzdDxWMj4oYy52YWx1ZSkgfTsKKwkgIHJldHVybiByZXQ7CisJfQorCisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBWLCB0eXBlbmFtZSBJLCB0eXBlbmFtZSBTPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBjaGFyYWN0ZXI8ViwgSSwgUz4mIGxocywgY29uc3QgY2hhcmFjdGVyPFYsIEksIFM+JiByaHMpCisgICAgeyByZXR1cm4gbGhzLnZhbHVlID09IHJocy52YWx1ZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFYsIHR5cGVuYW1lIEksIHR5cGVuYW1lIFM+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgY2hhcmFjdGVyPFYsIEksIFM+JiBsaHMsIGNvbnN0IGNoYXJhY3RlcjxWLCBJLCBTPiYgcmhzKQorICAgIHsgcmV0dXJuIGxocy52YWx1ZSA8IHJocy52YWx1ZTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLy8gY2hhcl90cmFpdHM8X19nbnVfY3h4OjpjaGFyYWN0ZXI+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBWLCB0eXBlbmFtZSBJLCB0eXBlbmFtZSBTPgorICAgIHN0cnVjdCBjaGFyX3RyYWl0czxfX2dudV9jeHg6OmNoYXJhY3RlcjxWLCBJLCBTPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OmNoYXJhY3RlcjxWLCBJLCBTPgljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNoYXJfdHlwZTo6aW50X3R5cGUJaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNoYXJfdHlwZTo6c3RhdGVfdHlwZQlzdGF0ZV90eXBlOworICAgICAgdHlwZWRlZiBmcG9zPHN0YXRlX3R5cGU+CQkJcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHN0cmVhbW9mZgkJCQlvZmZfdHlwZTsKKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIGFzc2lnbihjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikKKyAgICAgIHsgX19jMSA9IF9fYzI7IH0KKworICAgICAgc3RhdGljIGJvb2wKKyAgICAgIGVxKGNvbnN0IGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKQorICAgICAgeyByZXR1cm4gX19jMSA9PSBfX2MyOyB9CisKKyAgICAgIHN0YXRpYyBib29sCisgICAgICBsdChjb25zdCBjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikKKyAgICAgIHsgcmV0dXJuIF9fYzEgPCBfX2MyOyB9CisKKyAgICAgIHN0YXRpYyBpbnQKKyAgICAgIGNvbXBhcmUoY29uc3QgY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCisgICAgICB7CisJZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKwkgIGlmICghZXEoX19zMVtfX2ldLCBfX3MyW19faV0pKQorCSAgICByZXR1cm4gbHQoX19zMVtfX2ldLCBfX3MyW19faV0pID8gLTEgOiAxOworCXJldHVybiAwOworICAgICAgfQorCisgICAgICBzdGF0aWMgc2l6ZV90CisgICAgICBsZW5ndGgoY29uc3QgY2hhcl90eXBlKiBfX3MpCisgICAgICB7CisJY29uc3QgY2hhcl90eXBlKiBfX3AgPSBfX3M7CisJd2hpbGUgKF9fcC0+dmFsdWUpCisJICArK19fcDsKKwlyZXR1cm4gKF9fcCAtIF9fcyk7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyX3R5cGUqCisgICAgICBmaW5kKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjb25zdCBjaGFyX3R5cGUmIF9fYSkKKyAgICAgIHsKKwlmb3IgKGNvbnN0IGNoYXJfdHlwZSogX19wID0gX19zOyBzaXplX3QoX19wIC0gX19zKSA8IF9fbjsgKytfX3ApCisJICBpZiAoKl9fcCA9PSBfX2EpCisJICAgIHJldHVybiBfX3A7CisJcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCisgICAgICBtb3ZlKGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKQorICAgICAgeyAKKwlyZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcl90eXBlKj4KKwkgIChfX2J1aWx0aW5fbWVtbW92ZShfX3MxLCBfX3MyLCBfX24gKiBzaXplb2YoY2hhcl90eXBlKSkpOworICAgICAgfQorCisgICAgICBzdGF0aWMgY2hhcl90eXBlKgorICAgICAgY29weShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKKyAgICAgIHsKKwlzdGQ6OmNvcHkoX19zMiwgX19zMiArIF9fbiwgX19zMSk7CisJcmV0dXJuIF9fczE7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCisgICAgICBhc3NpZ24oY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNoYXJfdHlwZSBfX2EpCisgICAgICB7CisJc3RkOjpmaWxsX24oX19zLCBfX24sIF9fYSk7CisgICAgICAgIHJldHVybiBfX3M7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUKKyAgICAgIHRvX2NoYXJfdHlwZShjb25zdCBpbnRfdHlwZSYgX19pKQorICAgICAgeyByZXR1cm4gY2hhcl90eXBlOjp0ZW1wbGF0ZSBmcm9tKF9faSk7IH0KKworICAgICAgc3RhdGljIGludF90eXBlCisgICAgICB0b19pbnRfdHlwZShjb25zdCBjaGFyX3R5cGUmIF9fYykKKyAgICAgIHsgcmV0dXJuIGNoYXJfdHlwZTo6dGVtcGxhdGUgdG88aW50X3R5cGU+KF9fYyk7IH0KKworICAgICAgc3RhdGljIGJvb2wKKyAgICAgIGVxX2ludF90eXBlKGNvbnN0IGludF90eXBlJiBfX2MxLCBjb25zdCBpbnRfdHlwZSYgX19jMikKKyAgICAgIHsgcmV0dXJuIF9fYzEgPT0gX19jMjsgfQorCisgICAgICBzdGF0aWMgaW50X3R5cGUKKyAgICAgIGVvZigpIAorICAgICAgeworCWludF90eXBlIF9fciA9IHsgLTEgfTsKKwlyZXR1cm4gX19yOworICAgICAgfQorCisgICAgICBzdGF0aWMgaW50X3R5cGUKKyAgICAgIG5vdF9lb2YoY29uc3QgaW50X3R5cGUmIF9fYykKKyAgICAgIHsgcmV0dXJuIGVxX2ludF90eXBlKF9fYywgZW9mKCkpID8gaW50X3R5cGUoKSA6IF9fYzsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wb2ludGVyLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wb2ludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJiYzc0OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3BvaW50ZXIuaApAQCAtMCwwICsxLDU5MyBAQAorLy8gQ3VzdG9tIHBvaW50ZXIgYWRhcHRlciBhbmQgc2FtcGxlIHN0b3JhZ2UgcG9saWNpZXMKKworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqCisgKiAgQGZpbGUgZXh0L3BvaW50ZXIuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICoKKyAqICBAYXV0aG9yIEJvYiBXYWx0ZXJzCisgKgorICogUHJvdmlkZXMgcmV1c2FibGUgX1BvaW50ZXJfYWRhcHRlciBmb3IgYXNzaXN0aW5nIGluIHRoZSBkZXZlbG9wbWVudCBvZgorICogY3VzdG9tIHBvaW50ZXIgdHlwZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHRoZSBzdGFuZGFyZCBjb250YWluZXJzIHZpYQorICogdGhlIGFsbG9jYXRvcjo6cG9pbnRlciBhbmQgYWxsb2NhdG9yOjpjb25zdF9wb2ludGVyIHR5cGVkZWZzLgorICovCisKKyNpZm5kZWYgX1BPSU5URVJfSAorI2RlZmluZSBfUE9JTlRFUl9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfdHlwZXMuaD4KKyNpbmNsdWRlIDxleHQvY2FzdC5oPgorI2luY2x1ZGUgPGV4dC90eXBlX3RyYWl0cy5oPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9tb3ZlLmg+CisjIGluY2x1ZGUgPGJpdHMvcHRyX3RyYWl0cy5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKiogCisgICAqIEBicmllZiBBIHN0b3JhZ2UgcG9saWN5IGZvciB1c2Ugd2l0aCBfUG9pbnRlcl9hZGFwdGVyPD4gd2hpY2ggeWllbGRzIGEKKyAgICogICAgICAgIHN0YW5kYXJkIHBvaW50ZXIuCisgICAqIAorICAgKiAgQSBfU3RvcmFnZV9wb2xpY3kgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSA0IHRoaW5nczoKKyAgICogICAgMSkgQSBnZXQoKSBBUEkgZm9yIHJldHVybmluZyB0aGUgc3RvcmVkIHBvaW50ZXIgdmFsdWUuCisgICAqICAgIDIpIEFuIHNldCgpIEFQSSBmb3Igc3RvcmluZyBhIHBvaW50ZXIgdmFsdWUuCisgICAqICAgIDMpIEFuIGVsZW1lbnRfdHlwZSB0eXBlZGVmIHRvIGRlZmluZSB0aGUgdHlwZSB0aGlzIHBvaW50cyB0by4KKyAgICogICAgNCkgQW4gb3BlcmF0b3I8KCkgdG8gc3VwcG9ydCBwb2ludGVyIGNvbXBhcmlzb24uCisgICAqICAgIDUpIEFuIG9wZXJhdG9yPT0oKSB0byBzdXBwb3J0IHBvaW50ZXIgY29tcGFyaXNvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gCisgICAgY2xhc3MgX1N0ZF9wb2ludGVyX2ltcGwgCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIHRoZSB0eXBlIHRoaXMgcG9pbnRlciBwb2ludHMgdG8uCisgICAgICB0eXBlZGVmIF9UcCBlbGVtZW50X3R5cGU7CisgIAorICAgICAgLy8gQSBtZXRob2QgdG8gZmV0Y2ggdGhlIHBvaW50ZXIgdmFsdWUgYXMgYSBzdGFuZGFyZCBUKiB2YWx1ZTsKKyAgICAgIGlubGluZSBfVHAqIAorICAgICAgZ2V0KCkgY29uc3QgCisgICAgICB7IHJldHVybiBfTV92YWx1ZTsgfQorICAKKyAgICAgIC8vIEEgbWV0aG9kIHRvIHNldCB0aGUgcG9pbnRlciB2YWx1ZSwgZnJvbSBhIHN0YW5kYXJkIFQqIHZhbHVlOworICAgICAgaW5saW5lIHZvaWQgCisgICAgICBzZXQoZWxlbWVudF90eXBlKiBfX2FyZykgCisgICAgICB7IF9NX3ZhbHVlID0gX19hcmc7IH0KKyAgCisgICAgICAvLyBDb21wYXJpc29uIG9mIHBvaW50ZXJzCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I8KGNvbnN0IF9TdGRfcG9pbnRlcl9pbXBsJiBfX3JhcmcpIGNvbnN0CisgICAgICB7IHJldHVybiAoX01fdmFsdWUgPCBfX3JhcmcuX01fdmFsdWUpOyB9CisgIAorICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgX1N0ZF9wb2ludGVyX2ltcGwmIF9fcmFyZykgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfTV92YWx1ZSA9PSBfX3JhcmcuX01fdmFsdWUpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgZWxlbWVudF90eXBlKiBfTV92YWx1ZTsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgQSBzdG9yYWdlIHBvbGljeSBmb3IgdXNlIHdpdGggX1BvaW50ZXJfYWRhcHRlcjw+IHdoaWNoIHN0b3JlcworICAgKiAgICAgICAgdGhlIHBvaW50ZXIncyBhZGRyZXNzIGFzIGFuIG9mZnNldCB2YWx1ZSB3aGljaCBpcyByZWxhdGl2ZSB0bworICAgKiAgICAgICAgaXRzIG93biBhZGRyZXNzLgorICAgKiAKKyAgICogVGhpcyBpcyBpbnRlbmRlZCBmb3IgcG9pbnRlcnMgd2l0aGluIHNoYXJlZCBtZW1vcnkgcmVnaW9ucyB3aGljaAorICAgKiBtaWdodCBiZSBtYXBwZWQgYXQgZGlmZmVyZW50IGFkZHJlc3NlcyBieSBkaWZmZXJlbnQgcHJvY2Vzc2VzLgorICAgKiBGb3IgbnVsbCBwb2ludGVycywgYSB2YWx1ZSBvZiAxIGlzIHVzZWQuICAoMCBpcyBsZWdpdGltYXRlCisgICAqIHNvbWV0aW1lcyBmb3Igbm9kZXMgaW4gY2lyY3VsYXJseSBsaW5rZWQgbGlzdHMpIFRoaXMgdmFsdWUgd2FzCisgICAqIGNob3NlbiBhcyB0aGUgbGVhc3QgbGlrZWx5IHRvIGdlbmVyYXRlIGFuIGluY29ycmVjdCBudWxsLCBBcworICAgKiB0aGVyZSBpcyBubyByZWFzb24gd2h5IGFueSBub3JtYWwgcG9pbnRlciB3b3VsZCBwb2ludCAxIGJ5dGUgaW50bworICAgKiBpdHMgb3duIHBvaW50ZXIgYWRkcmVzcy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gCisgICAgY2xhc3MgX1JlbGF0aXZlX3BvaW50ZXJfaW1wbCAKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHAgZWxlbWVudF90eXBlOworICAKKyAgICAgIF9UcCoKKyAgICAgIGdldCgpIGNvbnN0IAorICAgICAgeworICAgICAgICBpZiAoX01fZGlmZiA9PSAxKQorICAgICAgICAgIHJldHVybiAwOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8X1RwKj4ocmVpbnRlcnByZXRfY2FzdDxfVUludFB0clR5cGU+KHRoaXMpCisJCQkJCSsgX01fZGlmZik7CisgICAgICB9CisgIAorICAgICAgdm9pZCAKKyAgICAgIHNldChfVHAqIF9fYXJnKQorICAgICAgeworICAgICAgICBpZiAoIV9fYXJnKQorICAgICAgICAgIF9NX2RpZmYgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgX01fZGlmZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8X1VJbnRQdHJUeXBlPihfX2FyZykgCisgICAgICAgICAgICAgICAgICAgIC0gcmVpbnRlcnByZXRfY2FzdDxfVUludFB0clR5cGU+KHRoaXMpOworICAgICAgfQorICAKKyAgICAgIC8vIENvbXBhcmlzb24gb2YgcG9pbnRlcnMKKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcjwoY29uc3QgX1JlbGF0aXZlX3BvaW50ZXJfaW1wbCYgX19yYXJnKSBjb25zdAorICAgICAgeyByZXR1cm4gKHJlaW50ZXJwcmV0X2Nhc3Q8X1VJbnRQdHJUeXBlPih0aGlzLT5nZXQoKSkKKwkJPCByZWludGVycHJldF9jYXN0PF9VSW50UHRyVHlwZT4oX19yYXJnLmdldCgpKSk7IH0KKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgX1JlbGF0aXZlX3BvaW50ZXJfaW1wbCYgX19yYXJnKSBjb25zdAorICAgICAgeyByZXR1cm4gKHJlaW50ZXJwcmV0X2Nhc3Q8X1VJbnRQdHJUeXBlPih0aGlzLT5nZXQoKSkKKwkJPT0gcmVpbnRlcnByZXRfY2FzdDxfVUludFB0clR5cGU+KF9fcmFyZy5nZXQoKSkpOyB9CisKKyAgICBwcml2YXRlOgorI2lmZGVmIF9HTElCQ1hYX1VTRV9MT05HX0xPTkcKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX2NvbmRpdGlvbmFsX3R5cGU8CisJIChzaXplb2YodW5zaWduZWQgbG9uZykgPj0gc2l6ZW9mKHZvaWQqKSksCisJIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZz46Ol9fdHlwZSBfVUludFB0clR5cGU7CisjZWxzZQorICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9VSW50UHRyVHlwZTsKKyNlbmRpZgorICAgICAgX1VJbnRQdHJUeXBlIF9NX2RpZmY7CisgICAgfTsKKyAgCisgIC8qKgorICAgKiBSZWxhdGl2ZV9wb2ludGVyX2ltcGwgbmVlZHMgYSBzcGVjaWFsaXphdGlvbiBmb3IgY29uc3QgVCBiZWNhdXNlIG9mCisgICAqIHRoZSBjYXN0aW5nIGRvbmUgZHVyaW5nIHBvaW50ZXIgYXJpdGhtZXRpYy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gCisgICAgY2xhc3MgX1JlbGF0aXZlX3BvaW50ZXJfaW1wbDxjb25zdCBfVHA+IAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCBlbGVtZW50X3R5cGU7CisgIAorICAgICAgY29uc3QgX1RwKgorICAgICAgZ2V0KCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgaWYgKF9NX2RpZmYgPT0gMSkKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IF9UcCo+CisJICAgICAgKHJlaW50ZXJwcmV0X2Nhc3Q8X1VJbnRQdHJUeXBlPih0aGlzKSArIF9NX2RpZmYpOworICAgICAgfQorICAKKyAgICAgIHZvaWQgCisgICAgICBzZXQoY29uc3QgX1RwKiBfX2FyZykKKyAgICAgIHsKKyAgICAgICAgaWYgKCFfX2FyZykKKyAgICAgICAgICBfTV9kaWZmID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIF9NX2RpZmYgPSByZWludGVycHJldF9jYXN0PF9VSW50UHRyVHlwZT4oX19hcmcpIAorICAgICAgICAgICAgICAgICAgICAtIHJlaW50ZXJwcmV0X2Nhc3Q8X1VJbnRQdHJUeXBlPih0aGlzKTsKKyAgICAgIH0KKyAgCisgICAgICAvLyBDb21wYXJpc29uIG9mIHBvaW50ZXJzCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I8KGNvbnN0IF9SZWxhdGl2ZV9wb2ludGVyX2ltcGwmIF9fcmFyZykgY29uc3QKKyAgICAgIHsgcmV0dXJuIChyZWludGVycHJldF9jYXN0PF9VSW50UHRyVHlwZT4odGhpcy0+Z2V0KCkpCisJCTwgcmVpbnRlcnByZXRfY2FzdDxfVUludFB0clR5cGU+KF9fcmFyZy5nZXQoKSkpOyB9CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IF9SZWxhdGl2ZV9wb2ludGVyX2ltcGwmIF9fcmFyZykgY29uc3QKKyAgICAgIHsgcmV0dXJuIChyZWludGVycHJldF9jYXN0PF9VSW50UHRyVHlwZT4odGhpcy0+Z2V0KCkpCisJCT09IHJlaW50ZXJwcmV0X2Nhc3Q8X1VJbnRQdHJUeXBlPihfX3JhcmcuZ2V0KCkpKTsgfQorICAKKyAgICBwcml2YXRlOgorI2lmZGVmIF9HTElCQ1hYX1VTRV9MT05HX0xPTkcKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX2NvbmRpdGlvbmFsX3R5cGU8CisJIChzaXplb2YodW5zaWduZWQgbG9uZykgPj0gc2l6ZW9mKHZvaWQqKSksCisJIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZz46Ol9fdHlwZSBfVUludFB0clR5cGU7CisjZWxzZQorICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9VSW50UHRyVHlwZTsKKyNlbmRpZgorICAgICAgIF9VSW50UHRyVHlwZSBfTV9kaWZmOworICAgIH07CisKKyAgLyoqCisgICAqIFRoZSBzcGVjaWFsaXphdGlvbiBvbiB0aGlzIHR5cGUgaGVscHMgcmVzb2x2ZSB0aGUgcHJvYmxlbSBvZgorICAgKiByZWZlcmVuY2UgdG8gdm9pZCwgYW5kIGVsaW1pbmF0ZXMgdGhlIG5lZWQgdG8gc3BlY2lhbGl6ZQorICAgKiBfUG9pbnRlcl9hZGFwdGVyIGZvciBjYXNlcyBvZiB2b2lkKiwgY29uc3Qgdm9pZCosIGFuZCBzbyBvbi4KKyAgICovCisgIHN0cnVjdCBfSW52YWxpZF90eXBlIHsgfTsKKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV90eXBlIAorICAgIHsgdHlwZWRlZiBfVHAmIHJlZmVyZW5jZTsgfTsKKworICB0ZW1wbGF0ZTw+IAorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3R5cGU8dm9pZD4gCisgICAgeyB0eXBlZGVmIF9JbnZhbGlkX3R5cGUmIHJlZmVyZW5jZTsgfTsKKworICB0ZW1wbGF0ZTw+IAorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3R5cGU8Y29uc3Qgdm9pZD4gCisgICAgeyB0eXBlZGVmIGNvbnN0IF9JbnZhbGlkX3R5cGUmIHJlZmVyZW5jZTsgfTsKKworICB0ZW1wbGF0ZTw+IAorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3R5cGU8dm9sYXRpbGUgdm9pZD4gCisgICAgeyB0eXBlZGVmIHZvbGF0aWxlIF9JbnZhbGlkX3R5cGUmICByZWZlcmVuY2U7IH07CisKKyAgdGVtcGxhdGU8PiAKKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV90eXBlPHZvbGF0aWxlIGNvbnN0IHZvaWQ+IAorICAgIHsgdHlwZWRlZiBjb25zdCB2b2xhdGlsZSBfSW52YWxpZF90eXBlJiAgcmVmZXJlbmNlOyB9OworCisgIC8qKgorICAgKiBUaGlzIHN0cnVjdHVyZSBhY2NvbW1vZGF0ZXMgdGhlIHdheSBpbiB3aGljaAorICAgKiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czw+IGlzIG5vcm1hbGx5IHNwZWNpYWxpemVkIGZvciBjb25zdCBUKiwgc28KKyAgICogdGhhdCB2YWx1ZV90eXBlIGlzIHN0aWxsIFQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IAorICAgIHN0cnVjdCBfVW5xdWFsaWZpZWRfdHlwZSAKKyAgICB7IHR5cGVkZWYgX1RwIHR5cGU7IH07CisgICAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gCisgICAgc3RydWN0IF9VbnF1YWxpZmllZF90eXBlPGNvbnN0IF9UcD4gCisgICAgeyB0eXBlZGVmIF9UcCB0eXBlOyB9OworICAgIAorICAvKioKKyAgICogVGhlIGZvbGxvd2luZyBwcm92aWRlcyBhbiAnYWx0ZXJuYXRpdmUgcG9pbnRlcicgdGhhdCB3b3JrcyB3aXRoCisgICAqIHRoZSBjb250YWluZXJzIHdoZW4gc3BlY2lmaWVkIGFzIHRoZSBwb2ludGVyIHR5cGVkZWYgb2YgdGhlCisgICAqIGFsbG9jYXRvci4KKyAgICoKKyAgICogVGhlIHBvaW50ZXIgdHlwZSB1c2VkIHdpdGggdGhlIGNvbnRhaW5lcnMgZG9lc24ndCBoYXZlIHRvIGJlIHRoaXMKKyAgICogY2xhc3MsIGJ1dCBpdCBtdXN0IHN1cHBvcnQgdGhlIGltcGxpY2l0IGNvbnZlcnNpb25zLCBwb2ludGVyCisgICAqIGFyaXRobWV0aWMsIGNvbXBhcmlzb24gb3BlcmF0b3JzLCBldGMuIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGlzCisgICAqIGNsYXNzLCBhbmQgYXZvaWQgcmFpc2luZyBjb21waWxlLXRpbWUgYW1iaWd1aXRpZXMuICBCZWNhdXNlCisgICAqIGNyZWF0aW5nIGEgd29ya2luZyBwb2ludGVyIGNhbiBiZSBjaGFsbGVuZ2luZywgdGhpcyBwb2ludGVyCisgICAqIHRlbXBsYXRlIHdhcyBkZXNpZ25lZCB0byB3cmFwcGVyIGFuIGVhc2llciBzdG9yYWdlIHBvbGljeSB0eXBlLAorICAgKiBzbyB0aGF0IGl0IGJlY29tZXMgcmV1c2FibGUgZm9yIGNyZWF0aW5nIG90aGVyIHBvaW50ZXIgdHlwZXMuCisgICAqCisgICAqIEEga2V5IHBvaW50IG9mIHRoaXMgY2xhc3MgaXMgYWxzbyB0aGF0IGl0IGFsbG93cyBjb250YWluZXIKKyAgICogd3JpdGVycyB0byAnYXNzdW1lJyBBbGxvY2F0b3I6OnBvaW50ZXIgaXMgYSB0eXBlZGVmIGZvciBhIG5vcm1hbAorICAgKiBwb2ludGVyLiAgVGhpcyBjbGFzcyBzdXBwb3J0cyBtb3N0IG9mIHRoZSBjb252ZW50aW9ucyBvZiBhIHRydWUKKyAgICogcG9pbnRlciwgYW5kIGNhbiwgZm9yIGluc3RhbmNlIGhhbmRsZSBpbXBsaWNpdCBjb252ZXJzaW9uIHRvCisgICAqIGNvbnN0IGFuZCBiYXNlIGNsYXNzIHBvaW50ZXIgdHlwZXMuICBUaGUgb25seSBpbXBvc2l0aW9ucyBvbgorICAgKiBjb250YWluZXIgd3JpdGVycyB0byBzdXBwb3J0IGV4dGVuZGVkIHBvaW50ZXJzIGFyZTogMSkgdXNlIHRoZQorICAgKiBBbGxvY2F0b3I6OnBvaW50ZXIgdHlwZWRlZiBhcHByb3ByaWF0ZWx5IGZvciBwb2ludGVyIHR5cGVzLiAgMikKKyAgICogaWYgeW91IG5lZWQgcG9pbnRlciBjYXN0aW5nLCB1c2UgdGhlIF9fcG9pbnRlcl9jYXN0PD4gZnVuY3Rpb25zCisgICAqIGZyb20gZXh0L2Nhc3QuaC4gIFRoaXMgYWxsb3dzIHBvaW50ZXIgY2FzdCBvcGVyYXRpb25zIHRvIGJlCisgICAqIG92ZXJsb2FkZWQgYXMgbmVjZXNzYXJ5IGJ5IGN1c3RvbSBwb2ludGVycy4KKyAgICoKKyAgICogTm90ZTogVGhlIGNvbnN0IHF1YWxpZmllciB3b3JrcyB3aXRoIHRoaXMgcG9pbnRlciBhZGFwdGVyIGFzCisgICAqIGZvbGxvd3M6CisgICAqCisgICAqIF9UcCogICAgICAgICAgICAgPT0gX1BvaW50ZXJfYWRhcHRlcjxfU3RkX3BvaW50ZXJfaW1wbDxfVHA+ID47CisgICAqIGNvbnN0IF9UcCogICAgICAgPT0gX1BvaW50ZXJfYWRhcHRlcjxfU3RkX3BvaW50ZXJfaW1wbDxjb25zdCBfVHA+ID47CisgICAqIF9UcCogY29uc3QgICAgICAgPT0gY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfU3RkX3BvaW50ZXJfaW1wbDxfVHA+ID47CisgICAqIGNvbnN0IF9UcCogY29uc3QgPT0gY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfU3RkX3BvaW50ZXJfaW1wbDxjb25zdCBfVHA+ID47CisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3RvcmFnZV9wb2xpY3k+CisgICAgY2xhc3MgX1BvaW50ZXJfYWRhcHRlciA6IHB1YmxpYyBfU3RvcmFnZV9wb2xpY3kgCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1N0b3JhZ2VfcG9saWN5OjplbGVtZW50X3R5cGUgZWxlbWVudF90eXBlOworCisgICAgICAvLyBUaGVzZSBhcmUgbmVlZGVkIGZvciBpdGVyYXRvcl90cmFpdHMKKyAgICAgIHR5cGVkZWYgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyAgICAgICAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1VucXVhbGlmaWVkX3R5cGU8ZWxlbWVudF90eXBlPjo6dHlwZSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1BvaW50ZXJfYWRhcHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVmZXJlbmNlX3R5cGU8ZWxlbWVudF90eXBlPjo6cmVmZXJlbmNlICByZWZlcmVuY2U7CisKKyAgICAgIC8vIFJlbWluZGVyOiAnY29uc3QnIG1ldGhvZHMgbWVhbiB0aGF0IHRoZSBtZXRob2QgaXMgdmFsaWQgd2hlbiB0aGUgCisgICAgICAvLyBwb2ludGVyIGlzIGltbXV0YWJsZSwgYW5kIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggd2hldGhlciB0aGUgCisgICAgICAvLyAncG9pbnRlZScgaXMgY29uc3QuCisKKyAgICAgIC8vIERlZmF1bHQgQ29uc3RydWN0b3IgKENvbnZlcnQgZnJvbSBlbGVtZW50X3R5cGUqKQorICAgICAgX1BvaW50ZXJfYWRhcHRlcihlbGVtZW50X3R5cGUqIF9fYXJnID0gMCkKKyAgICAgIHsgX1N0b3JhZ2VfcG9saWN5OjpzZXQoX19hcmcpOyB9CisKKyAgICAgIC8vIENvcHkgY29uc3RydWN0b3IgZnJvbSBfUG9pbnRlcl9hZGFwdGVyIG9mIHNhbWUgdHlwZS4KKyAgICAgIF9Qb2ludGVyX2FkYXB0ZXIoY29uc3QgX1BvaW50ZXJfYWRhcHRlciYgX19hcmcpIAorICAgICAgeyBfU3RvcmFnZV9wb2xpY3k6OnNldChfX2FyZy5nZXQoKSk7IH0KKworICAgICAgLy8gQ29udmVydCBmcm9tIF9VcCogaWYgY29udmVyc2lvbiB0byBlbGVtZW50X3R5cGUqIGlzIHZhbGlkLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICBfUG9pbnRlcl9hZGFwdGVyKF9VcCogX19hcmcpCisgICAgICAgIHsgX1N0b3JhZ2VfcG9saWN5OjpzZXQoX19hcmcpOyB9CisKKyAgICAgIC8vIENvbnZlcnNpb24gZnJvbSBhbm90aGVyIF9Qb2ludGVyX2FkYXB0ZXIgaWYgX1VwIGlmIHN0YXRpYyBjYXN0IGlzCisgICAgICAvLyB2YWxpZC4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgX1BvaW50ZXJfYWRhcHRlcihjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9VcD4mIF9fYXJnKQorICAgICAgICB7IF9TdG9yYWdlX3BvbGljeTo6c2V0KF9fYXJnLmdldCgpKTsgfQorCisgICAgICAvLyBEZXN0cnVjdG9yCisgICAgICB+X1BvaW50ZXJfYWRhcHRlcigpIHsgfQorICAKKyAgICAgIC8vIEFzc2lnbm1lbnQgb3BlcmF0b3IKKyAgICAgIF9Qb2ludGVyX2FkYXB0ZXImCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1BvaW50ZXJfYWRhcHRlciYgX19hcmcpIAorICAgICAgeworICAgICAgICBfU3RvcmFnZV9wb2xpY3k6OnNldChfX2FyZy5nZXQoKSk7IAorICAgICAgICByZXR1cm4gKnRoaXM7IAorICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIF9Qb2ludGVyX2FkYXB0ZXImCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9VcD4mIF9fYXJnKQorICAgICAgICB7CisgICAgICAgICAgX1N0b3JhZ2VfcG9saWN5OjpzZXQoX19hcmcuZ2V0KCkpOyAKKyAgICAgICAgICByZXR1cm4gKnRoaXM7IAorICAgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgX1BvaW50ZXJfYWRhcHRlciYKKyAgICAgICAgb3BlcmF0b3I9KF9VcCogX19hcmcpCisgICAgICAgIHsKKyAgICAgICAgICBfU3RvcmFnZV9wb2xpY3k6OnNldChfX2FyZyk7IAorICAgICAgICAgIHJldHVybiAqdGhpczsgCisgICAgICAgIH0KKworICAgICAgLy8gT3BlcmF0b3IqLCByZXR1cm5zIGVsZW1lbnRfdHlwZSYKKyAgICAgIGlubGluZSByZWZlcmVuY2UgCisgICAgICBvcGVyYXRvciooKSBjb25zdCAKKyAgICAgIHsgcmV0dXJuICooX1N0b3JhZ2VfcG9saWN5OjpnZXQoKSk7IH0KKworICAgICAgLy8gT3BlcmF0b3ItPiwgcmV0dXJucyBlbGVtZW50X3R5cGUqCisgICAgICBpbmxpbmUgZWxlbWVudF90eXBlKiAKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdCAKKyAgICAgIHsgcmV0dXJuIF9TdG9yYWdlX3BvbGljeTo6Z2V0KCk7IH0KKworICAgICAgLy8gT3BlcmF0b3JbXSwgcmV0dXJucyBhIGVsZW1lbnRfdHlwZSYgdG8gdGhlIGl0ZW0gYXQgdGhhdCBsb2MuCisgICAgICBpbmxpbmUgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHN0ZDo6cHRyZGlmZl90IF9faW5kZXgpIGNvbnN0CisgICAgICB7IHJldHVybiBfU3RvcmFnZV9wb2xpY3k6OmdldCgpW19faW5kZXhdOyB9CisKKyAgICAgIC8vIFRvIGFsbG93IGltcGxpY2l0IGNvbnZlcnNpb24gdG8gImJvb2wiLCBmb3IgImlmIChwdHIpLi4uIgorICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIGVsZW1lbnRfdHlwZSooX1BvaW50ZXJfYWRhcHRlcjo6Kl9fdW5zcGVjaWZpZWRfYm9vbF90eXBlKSgpIGNvbnN0OworCisgICAgcHVibGljOgorICAgICAgb3BlcmF0b3IgX191bnNwZWNpZmllZF9ib29sX3R5cGUoKSBjb25zdAorICAgICAgeworICAgICAgICByZXR1cm4gX1N0b3JhZ2VfcG9saWN5OjpnZXQoKSA9PSAwID8gMCA6IAorICAgICAgICAgICAgICAgICAgICAgICAgICZfUG9pbnRlcl9hZGFwdGVyOjpvcGVyYXRvci0+OyAKKyAgICAgIH0KKworICAgICAgLy8gISBvcGVyYXRvciAoZm9yOiBpZiAoIXB0cikuLi4pCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3IhKCkgY29uc3QgCisgICAgICB7IHJldHVybiAoX1N0b3JhZ2VfcG9saWN5OjpnZXQoKSA9PSAwKTsgfQorICAKKyAgICAgIC8vIFBvaW50ZXIgZGlmZmVyZW5jZXMKKyAgICAgIGlubGluZSBmcmllbmQgc3RkOjpwdHJkaWZmX3QgCisgICAgICBvcGVyYXRvci0oY29uc3QgX1BvaW50ZXJfYWRhcHRlciYgX19saHMsIGVsZW1lbnRfdHlwZSogX19yaHMpIAorICAgICAgeyByZXR1cm4gKF9fbGhzLmdldCgpIC0gX19yaHMpOyB9CisgIAorICAgICAgaW5saW5lIGZyaWVuZCBzdGQ6OnB0cmRpZmZfdCAKKyAgICAgIG9wZXJhdG9yLShlbGVtZW50X3R5cGUqIF9fbGhzLCBjb25zdCBfUG9pbnRlcl9hZGFwdGVyJiBfX3JocykgCisgICAgICB7IHJldHVybiAoX19saHMgLSBfX3Jocy5nZXQoKSk7IH0KKyAgCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIGlubGluZSBmcmllbmQgc3RkOjpwdHJkaWZmX3QgCisgICAgICAgIG9wZXJhdG9yLShjb25zdCBfUG9pbnRlcl9hZGFwdGVyJiBfX2xocywgX1VwKiBfX3JocykgCisgICAgICAgIHsgcmV0dXJuIChfX2xocy5nZXQoKSAtIF9fcmhzKTsgfQorICAgIAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICBpbmxpbmUgZnJpZW5kIHN0ZDo6cHRyZGlmZl90IAorICAgICAgICBvcGVyYXRvci0oX1VwKiBfX2xocywgY29uc3QgX1BvaW50ZXJfYWRhcHRlciYgX19yaHMpCisgICAgICAgIHsgcmV0dXJuIChfX2xocyAtIF9fcmhzLmdldCgpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIGlubGluZSBzdGQ6OnB0cmRpZmZfdCAKKyAgICAgICAgb3BlcmF0b3ItKGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXI8X1VwPiYgX19yaHMpIGNvbnN0IAorICAgICAgICB7IHJldHVybiAoX1N0b3JhZ2VfcG9saWN5OjpnZXQoKSAtIF9fcmhzLmdldCgpKTsgfQorICAKKyAgICAgIC8vIFBvaW50ZXIgbWF0aAorICAgICAgLy8gTm90ZTogVGhlcmUgaXMgYSByZWFzb24gZm9yIGFsbCB0aGlzIG92ZXJsb2FkaW5nIGJhc2VkIG9uIGRpZmZlcmVudAorICAgICAgLy8gaW50ZWdlciB0eXBlcy4gIEluIHNvbWUgbGlic3RkYysrLXYzIHRlc3QgY2FzZXMsIGEgdGVtcGxhdGVkCisgICAgICAvLyBvcGVyYXRvcisgaXMgZGVjbGFyZWQgd2hpY2ggY2FuIG1hdGNoIGFueSB0eXBlcy4gIFRoaXMgb3BlcmF0b3IKKyAgICAgIC8vIHRlbmRzIHRvICJzdGVhbCIgdGhlIHJlY29nbml0aW9uIG9mIF9Qb2ludGVyX2FkYXB0ZXIncyBvd24gb3BlcmF0b3IrIAorICAgICAgLy8gdW5sZXNzIHRoZSBpbnRlZ2VyIHR5cGUgbWF0Y2hlcyBwZXJmZWN0bHkuCisKKyNkZWZpbmUgX0NYWF9QT0lOVEVSX0FSSVRIX09QRVJBVE9SX1NFVChJTlRfVFlQRSkgXAorICAgICAgaW5saW5lIGZyaWVuZCBfUG9pbnRlcl9hZGFwdGVyIFwKKyAgICAgIG9wZXJhdG9yKyhjb25zdCBfUG9pbnRlcl9hZGFwdGVyJiBfX2xocywgSU5UX1RZUEUgX19vZmZzZXQpIFwKKyAgICAgIHsgcmV0dXJuIF9Qb2ludGVyX2FkYXB0ZXIoX19saHMuZ2V0KCkgKyBfX29mZnNldCk7IH0gXAorXAorICAgICAgaW5saW5lIGZyaWVuZCBfUG9pbnRlcl9hZGFwdGVyIFwKKyAgICAgIG9wZXJhdG9yKyhJTlRfVFlQRSBfX29mZnNldCwgY29uc3QgX1BvaW50ZXJfYWRhcHRlciYgX19yaHMpIFwKKyAgICAgIHsgcmV0dXJuIF9Qb2ludGVyX2FkYXB0ZXIoX19yaHMuZ2V0KCkgKyBfX29mZnNldCk7IH0gXAorXAorICAgICAgaW5saW5lIGZyaWVuZCBfUG9pbnRlcl9hZGFwdGVyIFwKKyAgICAgIG9wZXJhdG9yLShjb25zdCBfUG9pbnRlcl9hZGFwdGVyJiBfX2xocywgSU5UX1RZUEUgX19vZmZzZXQpIFwKKyAgICAgIHsgcmV0dXJuIF9Qb2ludGVyX2FkYXB0ZXIoX19saHMuZ2V0KCkgLSBfX29mZnNldCk7IH0gXAorXAorICAgICAgaW5saW5lIF9Qb2ludGVyX2FkYXB0ZXImIFwKKyAgICAgIG9wZXJhdG9yKz0oSU5UX1RZUEUgX19vZmZzZXQpIFwKKyAgICAgIHsgXAorICAgICAgICBfU3RvcmFnZV9wb2xpY3k6OnNldChfU3RvcmFnZV9wb2xpY3k6OmdldCgpICsgX19vZmZzZXQpOyBcCisgICAgICAgIHJldHVybiAqdGhpczsgXAorICAgICAgfSBcCitcCisgICAgICBpbmxpbmUgX1BvaW50ZXJfYWRhcHRlciYgXAorICAgICAgb3BlcmF0b3ItPShJTlRfVFlQRSBfX29mZnNldCkgXAorICAgICAgeyBcCisgICAgICAgIF9TdG9yYWdlX3BvbGljeTo6c2V0KF9TdG9yYWdlX3BvbGljeTo6Z2V0KCkgLSBfX29mZnNldCk7IFwKKyAgICAgICAgcmV0dXJuICp0aGlzOyBcCisgICAgICB9IFwKKy8vIEVORCBvZiBfQ1hYX1BPSU5URVJfQVJJVEhfT1BFUkFUT1JfU0VUIG1hY3JvCisgIAorICAgICAgLy8gRXhwYW5kIGludG8gdGhlIHZhcmlvdXMgcG9pbnRlciBhcml0aG1ldGljIG9wZXJhdG9ycyBuZWVkZWQuCisgICAgICBfQ1hYX1BPSU5URVJfQVJJVEhfT1BFUkFUT1JfU0VUKHNob3J0KTsKKyAgICAgIF9DWFhfUE9JTlRFUl9BUklUSF9PUEVSQVRPUl9TRVQodW5zaWduZWQgc2hvcnQpOworICAgICAgX0NYWF9QT0lOVEVSX0FSSVRIX09QRVJBVE9SX1NFVChpbnQpOworICAgICAgX0NYWF9QT0lOVEVSX0FSSVRIX09QRVJBVE9SX1NFVCh1bnNpZ25lZCBpbnQpOworICAgICAgX0NYWF9QT0lOVEVSX0FSSVRIX09QRVJBVE9SX1NFVChsb25nKTsKKyAgICAgIF9DWFhfUE9JTlRFUl9BUklUSF9PUEVSQVRPUl9TRVQodW5zaWduZWQgbG9uZyk7CisKKyAgICAgIC8vIE1hdGhlbWF0aWNhbCBNYW5pcHVsYXRvcnMKKyAgICAgIGlubGluZSBfUG9pbnRlcl9hZGFwdGVyJiAKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworICAgICAgICBfU3RvcmFnZV9wb2xpY3k6OnNldChfU3RvcmFnZV9wb2xpY3k6OmdldCgpICsgMSk7IAorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisgIAorICAgICAgaW5saW5lIF9Qb2ludGVyX2FkYXB0ZXIgCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKyAgICAgICAgX1BvaW50ZXJfYWRhcHRlciB0bXAoKnRoaXMpOworICAgICAgICBfU3RvcmFnZV9wb2xpY3k6OnNldChfU3RvcmFnZV9wb2xpY3k6OmdldCgpICsgMSk7CisgICAgICAgIHJldHVybiB0bXA7CisgICAgICB9CisgIAorICAgICAgaW5saW5lIF9Qb2ludGVyX2FkYXB0ZXImIAorICAgICAgb3BlcmF0b3ItLSgpIAorICAgICAgeworICAgICAgICBfU3RvcmFnZV9wb2xpY3k6OnNldChfU3RvcmFnZV9wb2xpY3k6OmdldCgpIC0gMSk7IAorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisgIAorICAgICAgaW5saW5lIF9Qb2ludGVyX2FkYXB0ZXIKKyAgICAgIG9wZXJhdG9yLS0oaW50KSAKKyAgICAgIHsKKyAgICAgICAgX1BvaW50ZXJfYWRhcHRlciB0bXAoKnRoaXMpOworICAgICAgICBfU3RvcmFnZV9wb2xpY3k6OnNldChfU3RvcmFnZV9wb2xpY3k6OmdldCgpIC0gMSk7CisgICAgICAgIHJldHVybiB0bXA7CisgICAgICB9CisgIAorICAgIH07IC8vIGNsYXNzIF9Qb2ludGVyX2FkYXB0ZXIKKworCisjZGVmaW5lIF9HQ0NfQ1hYX1BPSU5URVJfQ09NUEFSSVNPTl9PUEVSQVRJT05fU0VUKE9QRVJBVE9SKSBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+IFwKKyAgICBpbmxpbmUgYm9vbCBcCisgICAgb3BlcmF0b3IgT1BFUkFUT1IoY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHAxPiYgX19saHMsIF9UcDIgX19yaHMpIFwKKyAgICB7IHJldHVybiBfX2xocy5nZXQoKSBPUEVSQVRPUiBfX3JoczsgfSBcCitcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+IFwKKyAgICBpbmxpbmUgYm9vbCBcCisgICAgb3BlcmF0b3IgT1BFUkFUT1IoX1RwMSBfX2xocywgY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHAyPiYgX19yaHMpIFwKKyAgICB7IHJldHVybiBfX2xocyBPUEVSQVRPUiBfX3Jocy5nZXQoKTsgfSBcCitcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+IFwKKyAgICBpbmxpbmUgYm9vbCBcCisgICAgb3BlcmF0b3IgT1BFUkFUT1IoY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHAxPiYgX19saHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXI8X1RwMj4mIF9fcmhzKSBcCisgICAgeyByZXR1cm4gX19saHMuZ2V0KCkgT1BFUkFUT1IgX19yaHMuZ2V0KCk7IH0gXAorXAorLy8gRW5kIEdDQ19DWFhfUE9JTlRFUl9DT01QQVJJU09OX09QRVJBVElPTl9TRVQgTWFjcm8KKyAgCisgIC8vIEV4cGFuZCBpbnRvIHRoZSB2YXJpb3VzIGNvbXBhcmlzb24gb3BlcmF0b3JzIG5lZWRlZC4KKyAgX0dDQ19DWFhfUE9JTlRFUl9DT01QQVJJU09OX09QRVJBVElPTl9TRVQoPT0pCisgIF9HQ0NfQ1hYX1BPSU5URVJfQ09NUEFSSVNPTl9PUEVSQVRJT05fU0VUKCE9KQorICBfR0NDX0NYWF9QT0lOVEVSX0NPTVBBUklTT05fT1BFUkFUSU9OX1NFVCg8KQorICBfR0NDX0NYWF9QT0lOVEVSX0NPTVBBUklTT05fT1BFUkFUSU9OX1NFVCg8PSkKKyAgX0dDQ19DWFhfUE9JTlRFUl9DT01QQVJJU09OX09QRVJBVElPTl9TRVQoPikKKyAgX0dDQ19DWFhfUE9JTlRFUl9DT01QQVJJU09OX09QRVJBVElPTl9TRVQoPj0pCisKKyAgLy8gVGhlc2UgYXJlIGhlcmUgZm9yIGV4cHJlc3Npb25zIGxpa2UgInB0ciA9PSAwIiwgInB0ciAhPSAwIgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXI8X1RwPiYgX19saHMsIGludCBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5nZXQoKSA9PSByZWludGVycHJldF9jYXN0PHZvaWQqPihfX3Jocyk7IH0gCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShpbnQgX19saHMsIGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXI8X1RwPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19yaHMuZ2V0KCkgPT0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oX19saHMpOyB9IAorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHA+JiBfX2xocywgaW50IF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmdldCgpICE9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KF9fcmhzKTsgfSAKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGludCBfX2xocywgY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHA+JiBfX3JocykKKyAgICB7IHJldHVybiBfX3Jocy5nZXQoKSAhPSByZWludGVycHJldF9jYXN0PHZvaWQqPihfX2xocyk7IH0gCisKKyAgLyoqCisgICAqIENvbXBhcmlzb24gb3BlcmF0b3JzIGZvciBfUG9pbnRlcl9hZGFwdGVyIGRlZmVyIHRvIHRoZSBiYXNlIGNsYXNzJworICAgKiBjb21wYXJpc29uIG9wZXJhdG9ycywgd2hlbiBwb3NzaWJsZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHA+JiBfX2xocywgCisgICAgICAgICAgICAgICBjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9UcD4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9UcDo6b3BlcmF0b3I9PShfX3Jocyk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXI8X1RwPiYgX19saHMsIAorICAgICAgICAgICAgICAgY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHA+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fVHA6Om9wZXJhdG9yPChfX3JocykgfHwgX19saHMuX1RwOjpvcGVyYXRvcj09KF9fcmhzKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHA+JiBfX2xocywgCisgICAgICAgICAgICAgICBjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9UcD4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMuX1RwOjpvcGVyYXRvcj09KF9fcmhzKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHA+JiBfX2xocywgCisgICAgICAgICAgICAgIGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXI8X1RwPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocy5fVHA6Om9wZXJhdG9yPChfX3JocykgfHwgX19saHMuX1RwOjpvcGVyYXRvcj09KF9fcmhzKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXI8X1RwPiYgX19saHMsIAorICAgICAgICAgICAgICAgY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHA+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzLl9UcDo6b3BlcmF0b3I8KF9fcmhzKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9TdG9yZVQ+CisgICAgaW5saW5lIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIAorICAgICAgICAgICAgICAgY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfU3RvcmVUPiYgX19wKQorICAgIHsgcmV0dXJuIChfX29zIDw8IF9fcC5nZXQoKSk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TdG9yYWdlX3BvbGljeT4KKyAgICBzdHJ1Y3QgcG9pbnRlcl90cmFpdHM8X19nbnVfY3h4OjpfUG9pbnRlcl9hZGFwdGVyPF9TdG9yYWdlX3BvbGljeT4+CisgICAgeworICAgICAgLy8vIFRoZSBwb2ludGVyIHR5cGUKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfUG9pbnRlcl9hZGFwdGVyPF9TdG9yYWdlX3BvbGljeT4gICAgICAgICBwb2ludGVyOworICAgICAgLy8vIFRoZSB0eXBlIHBvaW50ZWQgdG8KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgcG9pbnRlcjo6ZWxlbWVudF90eXBlICAgICAgICAgICAgZWxlbWVudF90eXBlOworICAgICAgLy8vIFR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gcG9pbnRlcnMKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgcG9pbnRlcjo6ZGlmZmVyZW5jZV90eXBlICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIHVzaW5nIHJlYmluZCA9IHR5cGVuYW1lIF9fZ251X2N4eDo6X1BvaW50ZXJfYWRhcHRlcjwKKwl0eXBlbmFtZSBwb2ludGVyX3RyYWl0czxfU3RvcmFnZV9wb2xpY3k+OjpyZWJpbmQ8X1VwPj47CisKKyAgICAgIHN0YXRpYyBwb2ludGVyIHBvaW50ZXJfdG8odHlwZW5hbWUgcG9pbnRlcjo6cmVmZXJlbmNlIF9fcikgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHBvaW50ZXIoc3RkOjphZGRyZXNzb2YoX19yKSk7IH0KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisjZW5kaWYKKworI2VuZGlmIC8vIF9QT0lOVEVSX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3Bvb2xfYWxsb2NhdG9yLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wb29sX2FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzUxYTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9wb29sX2FsbG9jYXRvci5oCkBAIC0wLDAgKzEsMjgwIEBACisvLyBBbGxvY2F0b3JzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGV4dC9wb29sX2FsbG9jYXRvci5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfUE9PTF9BTExPQ0FUT1JfSAorI2RlZmluZSBfUE9PTF9BTExPQ0FUT1JfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNpbmNsdWRlIDxleHQvYXRvbWljaXR5Lmg+CisjaW5jbHVkZSA8ZXh0L2NvbmN1cnJlbmNlLmg+CisjaW5jbHVkZSA8Yml0cy9tb3ZlLmg+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2VuZGlmCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyBzdGQ6OnNpemVfdDsKKyAgdXNpbmcgc3RkOjpwdHJkaWZmX3Q7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEJhc2UgY2xhc3MgZm9yIF9fcG9vbF9hbGxvYy4KKyAgICoKKyAgICogIFVzZXMgdmFyaW91cyBhbGxvY2F0b3JzIHRvIGZ1bGZpbGwgdW5kZXJseWluZyByZXF1ZXN0cyAoYW5kIG1ha2VzIGFzCisgICAqICBmZXcgcmVxdWVzdHMgYXMgcG9zc2libGUgd2hlbiBpbiBkZWZhdWx0IGhpZ2gtc3BlZWQgcG9vbCBtb2RlKS4KKyAgICoKKyAgICogIEltcG9ydGFudCBpbXBsZW1lbnRhdGlvbiBwcm9wZXJ0aWVzOgorICAgKiAgMC4gSWYgZ2xvYmFsbHkgbWFuZGF0ZWQsIHRoZW4gYWxsb2NhdGUgb2JqZWN0cyBmcm9tIG5ldworICAgKiAgMS4gSWYgdGhlIGNsaWVudHMgcmVxdWVzdCBhbiBvYmplY3Qgb2Ygc2l6ZSA+IF9TX21heF9ieXRlcywgdGhlIHJlc3VsdGluZworICAgKiAgICAgb2JqZWN0IHdpbGwgYmUgb2J0YWluZWQgZGlyZWN0bHkgZnJvbSBuZXcKKyAgICogIDIuIEluIGFsbCBvdGhlciBjYXNlcywgd2UgYWxsb2NhdGUgYW4gb2JqZWN0IG9mIHNpemUgZXhhY3RseQorICAgKiAgICAgX1Nfcm91bmRfdXAocmVxdWVzdGVkX3NpemUpLiAgVGh1cyB0aGUgY2xpZW50IGhhcyBlbm91Z2ggc2l6ZQorICAgKiAgICAgaW5mb3JtYXRpb24gdGhhdCB3ZSBjYW4gcmV0dXJuIHRoZSBvYmplY3QgdG8gdGhlIHByb3BlciBmcmVlIGxpc3QKKyAgICogICAgIHdpdGhvdXQgcGVybWFuZW50bHkgbG9zaW5nIHBhcnQgb2YgdGhlIG9iamVjdC4KKyAgICovCisgICAgY2xhc3MgX19wb29sX2FsbG9jX2Jhc2UKKyAgICB7CisgICAgcHJvdGVjdGVkOgorCisgICAgICBlbnVtIHsgX1NfYWxpZ24gPSA4IH07CisgICAgICBlbnVtIHsgX1NfbWF4X2J5dGVzID0gMTI4IH07CisgICAgICBlbnVtIHsgX1NfZnJlZV9saXN0X3NpemUgPSAoc2l6ZV90KV9TX21heF9ieXRlcyAvIChzaXplX3QpX1NfYWxpZ24gfTsKKyAgICAgIAorICAgICAgdW5pb24gX09iagorICAgICAgeworCXVuaW9uIF9PYmoqIF9NX2ZyZWVfbGlzdF9saW5rOworCWNoYXIgICAgICAgIF9NX2NsaWVudF9kYXRhWzFdOyAgICAvLyBUaGUgY2xpZW50IHNlZXMgdGhpcy4KKyAgICAgIH07CisgICAgICAKKyAgICAgIHN0YXRpYyBfT2JqKiB2b2xhdGlsZSAgICAgICAgIF9TX2ZyZWVfbGlzdFtfU19mcmVlX2xpc3Rfc2l6ZV07CisKKyAgICAgIC8vIENodW5rIGFsbG9jYXRpb24gc3RhdGUuCisgICAgICBzdGF0aWMgY2hhciogICAgICAgICAgICAgICAgICBfU19zdGFydF9mcmVlOworICAgICAgc3RhdGljIGNoYXIqICAgICAgICAgICAgICAgICAgX1NfZW5kX2ZyZWU7CisgICAgICBzdGF0aWMgc2l6ZV90ICAgICAgICAgICAgICAgICBfU19oZWFwX3NpemU7ICAgICAKKyAgICAgIAorICAgICAgc2l6ZV90CisgICAgICBfTV9yb3VuZF91cChzaXplX3QgX19ieXRlcykKKyAgICAgIHsgcmV0dXJuICgoX19ieXRlcyArIChzaXplX3QpX1NfYWxpZ24gLSAxKSAmIH4oKHNpemVfdClfU19hbGlnbiAtIDEpKTsgfQorICAgICAgCisgICAgICBfR0xJQkNYWF9DT05TVCBfT2JqKiB2b2xhdGlsZSoKKyAgICAgIF9NX2dldF9mcmVlX2xpc3Qoc2l6ZV90IF9fYnl0ZXMpIHRocm93ICgpOworICAgIAorICAgICAgX19tdXRleCYKKyAgICAgIF9NX2dldF9tdXRleCgpIHRocm93ICgpOworCisgICAgICAvLyBSZXR1cm5zIGFuIG9iamVjdCBvZiBzaXplIF9fbiwgYW5kIG9wdGlvbmFsbHkgYWRkcyB0byBzaXplIF9fbgorICAgICAgLy8gZnJlZSBsaXN0LgorICAgICAgdm9pZCoKKyAgICAgIF9NX3JlZmlsbChzaXplX3QgX19uKTsKKyAgICAgIAorICAgICAgLy8gQWxsb2NhdGVzIGEgY2h1bmsgZm9yIG5vYmpzIG9mIHNpemUgc2l6ZS4gIG5vYmpzIG1heSBiZSByZWR1Y2VkCisgICAgICAvLyBpZiBpdCBpcyBpbmNvbnZlbmllbnQgdG8gYWxsb2NhdGUgdGhlIHJlcXVlc3RlZCBudW1iZXIuCisgICAgICBjaGFyKgorICAgICAgX01fYWxsb2NhdGVfY2h1bmsoc2l6ZV90IF9fbiwgaW50JiBfX25vYmpzKTsKKyAgICB9OworCisKKyAgLyoqCisgICAqIEBicmllZiAgQWxsb2NhdG9yIHVzaW5nIGEgbWVtb3J5IHBvb2wgd2l0aCBhIHNpbmdsZSBsb2NrLgorICAgKiBAaW5ncm91cCBhbGxvY2F0b3JzCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgX19wb29sX2FsbG9jIDogcHJpdmF0ZSBfX3Bvb2xfYWxsb2NfYmFzZQorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgc3RhdGljIF9BdG9taWNfd29yZAkgICAgX1NfZm9yY2VfbmV3OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBzaXplX3QgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCogICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwKiBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBfVHAmICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwJiBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgdmFsdWVfdHlwZTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgc3RydWN0IHJlYmluZAorICAgICAgICB7IHR5cGVkZWYgX19wb29sX2FsbG9jPF9UcDE+IG90aGVyOyB9OworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjEwMy4gcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQKKyAgICAgIHR5cGVkZWYgc3RkOjp0cnVlX3R5cGUgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ7CisjZW5kaWYKKworICAgICAgX19wb29sX2FsbG9jKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgfQorCisgICAgICBfX3Bvb2xfYWxsb2MoY29uc3QgX19wb29sX2FsbG9jJikgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBfX3Bvb2xfYWxsb2MoY29uc3QgX19wb29sX2FsbG9jPF9UcDE+JikgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgfQorCisgICAgICB+X19wb29sX2FsbG9jKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgfQorCisgICAgICBwb2ludGVyCisgICAgICBhZGRyZXNzKHJlZmVyZW5jZSBfX3gpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9feCk7IH0KKworICAgICAgY29uc3RfcG9pbnRlcgorICAgICAgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3gpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdCBfR0xJQkNYWF9VU0VfTk9FWENFUFQgCisgICAgICB7IHJldHVybiBzaXplX3QoLTEpIC8gc2l6ZW9mKF9UcCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgY29uc3RydWN0KF9VcCogX19wLCBfQXJncyYmLi4uIF9fYXJncykKKwl7IDo6bmV3KCh2b2lkICopX19wKSBfVXAoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIHZvaWQgCisgICAgICAgIGRlc3Ryb3koX1VwKiBfX3ApIHsgX19wLT5+X1VwKCk7IH0KKyNlbHNlCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MDIuIHdyb25nIG5ldyBleHByZXNzaW9uIGluIFtzb21lX10gYWxsb2NhdG9yOjpjb25zdHJ1Y3QKKyAgICAgIHZvaWQgCisgICAgICBjb25zdHJ1Y3QocG9pbnRlciBfX3AsIGNvbnN0IF9UcCYgX192YWwpIAorICAgICAgeyA6Om5ldygodm9pZCAqKV9fcCkgX1RwKF9fdmFsKTsgfQorCisgICAgICB2b2lkIAorICAgICAgZGVzdHJveShwb2ludGVyIF9fcCkgeyBfX3AtPn5fVHAoKTsgfQorI2VuZGlmCisKKyAgICAgIHBvaW50ZXIKKyAgICAgIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIGNvbnN0IHZvaWQqID0gMCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlwZSBfX24pOyAgICAgIAorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfX3Bvb2xfYWxsb2M8X1RwPiYsIGNvbnN0IF9fcG9vbF9hbGxvYzxfVHA+JikKKyAgICB7IHJldHVybiB0cnVlOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfX3Bvb2xfYWxsb2M8X1RwPiYsIGNvbnN0IF9fcG9vbF9hbGxvYzxfVHA+JikKKyAgICB7IHJldHVybiBmYWxzZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfQXRvbWljX3dvcmQKKyAgICBfX3Bvb2xfYWxsb2M8X1RwPjo6X1NfZm9yY2VfbmV3OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAqCisgICAgX19wb29sX2FsbG9jPF9UcD46OmFsbG9jYXRlKHNpemVfdHlwZSBfX24sIGNvbnN0IHZvaWQqKQorICAgIHsKKyAgICAgIHBvaW50ZXIgX19yZXQgPSAwOworICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoX19uICE9IDAsIHRydWUpKQorCXsKKwkgIGlmIChfX24gPiB0aGlzLT5tYXhfc2l6ZSgpKQorCSAgICBzdGQ6Ol9fdGhyb3dfYmFkX2FsbG9jKCk7CisKKwkgIC8vIElmIHRoZXJlIGlzIGEgcmFjZSB0aHJvdWdoIGhlcmUsIGFzc3VtZSBhbnN3ZXIgZnJvbSBnZXRlbnYKKwkgIC8vIHdpbGwgcmVzb2x2ZSBpbiBzYW1lIGRpcmVjdGlvbi4gIEluc3BpcmVkIGJ5IHRlY2huaXF1ZXMKKwkgIC8vIHRvIGVmZmljaWVudGx5IHN1cHBvcnQgdGhyZWFkaW5nIGZvdW5kIGluIGJhc2ljX3N0cmluZy5oLgorCSAgaWYgKF9TX2ZvcmNlX25ldyA9PSAwKQorCSAgICB7CisJICAgICAgaWYgKHN0ZDo6Z2V0ZW52KCJHTElCQ1hYX0ZPUkNFX05FVyIpKQorCQlfX2F0b21pY19hZGRfZGlzcGF0Y2goJl9TX2ZvcmNlX25ldywgMSk7CisJICAgICAgZWxzZQorCQlfX2F0b21pY19hZGRfZGlzcGF0Y2goJl9TX2ZvcmNlX25ldywgLTEpOworCSAgICB9CisKKwkgIGNvbnN0IHNpemVfdCBfX2J5dGVzID0gX19uICogc2l6ZW9mKF9UcCk7CSAgICAgIAorCSAgaWYgKF9fYnl0ZXMgPiBzaXplX3QoX1NfbWF4X2J5dGVzKSB8fCBfU19mb3JjZV9uZXcgPiAwKQorCSAgICBfX3JldCA9IHN0YXRpY19jYXN0PF9UcCo+KDo6b3BlcmF0b3IgbmV3KF9fYnl0ZXMpKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9PYmoqIHZvbGF0aWxlKiBfX2ZyZWVfbGlzdCA9IF9NX2dldF9mcmVlX2xpc3QoX19ieXRlcyk7CisJICAgICAgCisJICAgICAgX19zY29wZWRfbG9jayBzZW50cnkoX01fZ2V0X211dGV4KCkpOworCSAgICAgIF9PYmoqIF9fcmVzdHJpY3RfXyBfX3Jlc3VsdCA9ICpfX2ZyZWVfbGlzdDsKKwkgICAgICBpZiAoX19idWlsdGluX2V4cGVjdChfX3Jlc3VsdCA9PSAwLCAwKSkKKwkJX19yZXQgPSBzdGF0aWNfY2FzdDxfVHAqPihfTV9yZWZpbGwoX01fcm91bmRfdXAoX19ieXRlcykpKTsKKwkgICAgICBlbHNlCisJCXsKKwkJICAqX19mcmVlX2xpc3QgPSBfX3Jlc3VsdC0+X01fZnJlZV9saXN0X2xpbms7CisJCSAgX19yZXQgPSByZWludGVycHJldF9jYXN0PF9UcCo+KF9fcmVzdWx0KTsKKwkJfQorCSAgICAgIGlmIChfX3JldCA9PSAwKQorCQlzdGQ6Ol9fdGhyb3dfYmFkX2FsbG9jKCk7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgX19wb29sX2FsbG9jPF9UcD46OmRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoX19uICE9IDAgJiYgX19wICE9IDAsIHRydWUpKQorCXsKKwkgIGNvbnN0IHNpemVfdCBfX2J5dGVzID0gX19uICogc2l6ZW9mKF9UcCk7CisJICBpZiAoX19ieXRlcyA+IHN0YXRpY19jYXN0PHNpemVfdD4oX1NfbWF4X2J5dGVzKSB8fCBfU19mb3JjZV9uZXcgPiAwKQorCSAgICA6Om9wZXJhdG9yIGRlbGV0ZShfX3ApOworCSAgZWxzZQorCSAgICB7CisJICAgICAgX09iaiogdm9sYXRpbGUqIF9fZnJlZV9saXN0ID0gX01fZ2V0X2ZyZWVfbGlzdChfX2J5dGVzKTsKKwkgICAgICBfT2JqKiBfX3EgPSByZWludGVycHJldF9jYXN0PF9PYmoqPihfX3ApOworCisJICAgICAgX19zY29wZWRfbG9jayBzZW50cnkoX01fZ2V0X211dGV4KCkpOworCSAgICAgIF9fcSAtPl9NX2ZyZWVfbGlzdF9saW5rID0gKl9fZnJlZV9saXN0OworCSAgICAgICpfX2ZyZWVfbGlzdCA9IF9fcTsKKwkgICAgfQorCX0KKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9yYW5kb20gYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9yYW5kb20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3ZWJlZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3JhbmRvbQpAQCAtMCwwICsxLDI4NTggQEAKKy8vIFJhbmRvbSBudW1iZXIgZXh0ZW5zaW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L3JhbmRvbQorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0VYVF9SQU5ET00KKyNkZWZpbmUgX0VYVF9SQU5ET00gMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorCisjaW5jbHVkZSA8cmFuZG9tPgorI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGV4dC9jbWF0aD4KKyNpZmRlZiBfX1NTRTJfXworIyBpbmNsdWRlIDx4ODZpbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworI2lmIF9fQllURV9PUkRFUl9fID09IF9fT1JERVJfTElUVExFX0VORElBTl9fCisKKyAgLyogTWVyc2VubmUgdHdpc3RlciBpbXBsZW1lbnRhdGlvbiBvcHRpbWl6ZWQgZm9yIHZlY3RvciBvcGVyYXRpb25zLgorICAgKgorICAgKiBSZWZlcmVuY2U6IGh0dHA6Ly93d3cubWF0aC5zY2kuaGlyb3NoaW1hLXUuYWMuanAvfm0tbWF0L01UL1NGTVQvCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX20sCisJICAgc2l6ZV90IF9fcG9zMSwgc2l6ZV90IF9fc2wxLCBzaXplX3QgX19zbDIsCisJICAgc2l6ZV90IF9fc3IxLCBzaXplX3QgX19zcjIsCisJICAgdWludDMyX3QgX19tc2sxLCB1aW50MzJfdCBfX21zazIsCisJICAgdWludDMyX3QgX19tc2szLCB1aW50MzJfdCBfX21zazQsCisJICAgdWludDMyX3QgX19wYXJpdHkxLCB1aW50MzJfdCBfX3Bhcml0eTIsCisJICAgdWludDMyX3QgX19wYXJpdHkzLCB1aW50MzJfdCBfX3Bhcml0eTQ+CisgICAgY2xhc3Mgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3Vuc2lnbmVkPF9VSW50VHlwZT46OnZhbHVlLCAidGVtcGxhdGUgYXJndW1lbnQgIgorCQkgICAgInN1YnN0aXR1dGluZyBfVUludFR5cGUgbm90IGFuIHVuc2lnbmVkIGludGVncmFsIHR5cGUiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19zcjEgPCAzMiwgImZpcnN0IHJpZ2h0IHNoaWZ0IHRvbyBsYXJnZSIpOworICAgICAgc3RhdGljX2Fzc2VydChfX3NyMiA8IDE2LCAic2Vjb25kIHJpZ2h0IHNoaWZ0IHRvbyBsYXJnZSIpOworICAgICAgc3RhdGljX2Fzc2VydChfX3NsMSA8IDMyLCAiZmlyc3QgbGVmdCBzaGlmdCB0b28gbGFyZ2UiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19zbDIgPCAxNiwgInNlY29uZCBsZWZ0IHNoaWZ0IHRvbyBsYXJnZSIpOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVUludFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICBwcml2YXRlOgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgbV93ID0gc2l6ZW9mKHJlc3VsdF90eXBlKSAqIDg7CisgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBfTV9uc3RhdGUgPSBfX20gLyAxMjggKyAxOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgX01fbnN0YXRlMzIgPSBfTV9uc3RhdGUgKiA0OworCisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdW5zaWduZWQ8X1VJbnRUeXBlPjo6dmFsdWUsICJ0ZW1wbGF0ZSBhcmd1bWVudCAiCisJCSAgICAic3Vic3RpdHV0aW5nIF9VSW50VHlwZSBub3QgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSIpOworICAgICAgc3RhdGljX2Fzc2VydChfX3BvczEgPCBfTV9uc3RhdGUsICJQT1MxIG5vdCBzbWFsbGVyIHRoYW4gc3RhdGUgc2l6ZSIpOworICAgICAgc3RhdGljX2Fzc2VydCgxNiAlIHNpemVvZihfVUludFR5cGUpID09IDAsCisJCSAgICAiVUludFR5cGUgc2l6ZSBtdXN0IGRpdmlkZSAxNiIpOworCisgICAgcHVibGljOgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qgc3RhdGVfc2l6ZSA9IF9NX25zdGF0ZSAqICgxNgorCQkJCQkJCS8gc2l6ZW9mKHJlc3VsdF90eXBlKSk7CisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIGRlZmF1bHRfc2VlZCA9IDU0ODl1OworCisgICAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIG1lbWJlciBmdW5jdGlvbgorICAgICAgZXhwbGljaXQKKyAgICAgIHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZShyZXN1bHRfdHlwZSBfX3NkID0gZGVmYXVsdF9zZWVkKQorICAgICAgeyBzZWVkKF9fc2QpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Tc2VxLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfc2FtZTxfU3NlcSwKKwkJCQkgICAgIHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZT46OnZhbHVlPgorCSAgICAgICA6OnR5cGU+CisJZXhwbGljaXQKKwlzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUoX1NzZXEmIF9fcSkKKwl7IHNlZWQoX19xKTsgfQorCisgICAgICB2b2lkCisgICAgICBzZWVkKHJlc3VsdF90eXBlIF9fc2QgPSBkZWZhdWx0X3NlZWQpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3NlcT4KKwl0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NsYXNzPF9Tc2VxPjo6dmFsdWU+Ojp0eXBlCisJc2VlZChfU3NlcSYgX19xKTsKKworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZQorICAgICAgbWluKCkKKyAgICAgIHsgcmV0dXJuIDA7IH07CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpCisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgICAgdm9pZAorICAgICAgZGlzY2FyZCh1bnNpZ25lZCBsb25nIGxvbmcgX196KTsKKworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoKQorICAgICAgeworCWlmIChfX2J1aWx0aW5fZXhwZWN0KF9NX3BvcyA+PSBzdGF0ZV9zaXplLCAwKSkKKwkgIF9NX2dlbl9yYW5kKCk7CisKKwlyZXR1cm4gX01fc3RhdGVUW19NX3BvcysrXTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlXzIsIHNpemVfdCBfX21fMiwKKwkgICAgICAgc2l6ZV90IF9fcG9zMV8yLCBzaXplX3QgX19zbDFfMiwgc2l6ZV90IF9fc2wyXzIsCisJICAgICAgIHNpemVfdCBfX3NyMV8yLCBzaXplX3QgX19zcjJfMiwKKwkgICAgICAgdWludDMyX3QgX19tc2sxXzIsIHVpbnQzMl90IF9fbXNrMl8yLAorCSAgICAgICB1aW50MzJfdCBfX21zazNfMiwgdWludDMyX3QgX19tc2s0XzIsCisJICAgICAgIHVpbnQzMl90IF9fcGFyaXR5MV8yLCB1aW50MzJfdCBfX3Bhcml0eTJfMiwKKwkgICAgICAgdWludDMyX3QgX19wYXJpdHkzXzIsIHVpbnQzMl90IF9fcGFyaXR5NF8yPgorCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlXzIsCisJCSAgIF9fbV8yLCBfX3BvczFfMiwgX19zbDFfMiwgX19zbDJfMiwgX19zcjFfMiwgX19zcjJfMiwKKwkJICAgX19tc2sxXzIsIF9fbXNrMl8yLCBfX21zazNfMiwgX19tc2s0XzIsCisJCSAgIF9fcGFyaXR5MV8yLCBfX3Bhcml0eTJfMiwgX19wYXJpdHkzXzIsIF9fcGFyaXR5NF8yPiYgX19saHMsCisJCSAgIGNvbnN0IHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGVfMiwKKwkJICAgX19tXzIsIF9fcG9zMV8yLCBfX3NsMV8yLCBfX3NsMl8yLCBfX3NyMV8yLCBfX3NyMl8yLAorCQkgICBfX21zazFfMiwgX19tc2syXzIsIF9fbXNrM18yLCBfX21zazRfMiwKKwkJICAgX19wYXJpdHkxXzIsIF9fcGFyaXR5Ml8yLCBfX3Bhcml0eTNfMiwgX19wYXJpdHk0XzI+JiBfX3Jocyk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZV8yLCBzaXplX3QgX19tXzIsCisJICAgICAgIHNpemVfdCBfX3BvczFfMiwgc2l6ZV90IF9fc2wxXzIsIHNpemVfdCBfX3NsMl8yLAorCSAgICAgICBzaXplX3QgX19zcjFfMiwgc2l6ZV90IF9fc3IyXzIsCisJICAgICAgIHVpbnQzMl90IF9fbXNrMV8yLCB1aW50MzJfdCBfX21zazJfMiwKKwkgICAgICAgdWludDMyX3QgX19tc2szXzIsIHVpbnQzMl90IF9fbXNrNF8yLAorCSAgICAgICB1aW50MzJfdCBfX3Bhcml0eTFfMiwgdWludDMyX3QgX19wYXJpdHkyXzIsCisJICAgICAgIHVpbnQzMl90IF9fcGFyaXR5M18yLCB1aW50MzJfdCBfX3Bhcml0eTRfMiwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBfX2dudV9jeHg6OnNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZQorCQkgICA8X1VJbnRUeXBlXzIsCisJCSAgIF9fbV8yLCBfX3BvczFfMiwgX19zbDFfMiwgX19zbDJfMiwgX19zcjFfMiwgX19zcjJfMiwKKwkJICAgX19tc2sxXzIsIF9fbXNrMl8yLCBfX21zazNfMiwgX19tc2s0XzIsCisJCSAgIF9fcGFyaXR5MV8yLCBfX3Bhcml0eTJfMiwgX19wYXJpdHkzXzIsIF9fcGFyaXR5NF8yPiYgX194KTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlXzIsIHNpemVfdCBfX21fMiwKKwkgICAgICAgc2l6ZV90IF9fcG9zMV8yLCBzaXplX3QgX19zbDFfMiwgc2l6ZV90IF9fc2wyXzIsCisJICAgICAgIHNpemVfdCBfX3NyMV8yLCBzaXplX3QgX19zcjJfMiwKKwkgICAgICAgdWludDMyX3QgX19tc2sxXzIsIHVpbnQzMl90IF9fbXNrMl8yLAorCSAgICAgICB1aW50MzJfdCBfX21zazNfMiwgdWludDMyX3QgX19tc2s0XzIsCisJICAgICAgIHVpbnQzMl90IF9fcGFyaXR5MV8yLCB1aW50MzJfdCBfX3Bhcml0eTJfMiwKKwkgICAgICAgdWludDMyX3QgX19wYXJpdHkzXzIsIHVpbnQzMl90IF9fcGFyaXR5NF8yLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIF9fZ251X2N4eDo6c2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZV8yLAorCQkgICBfX21fMiwgX19wb3MxXzIsIF9fc2wxXzIsIF9fc2wyXzIsIF9fc3IxXzIsIF9fc3IyXzIsCisJCSAgIF9fbXNrMV8yLCBfX21zazJfMiwgX19tc2szXzIsIF9fbXNrNF8yLAorCQkgICBfX3Bhcml0eTFfMiwgX19wYXJpdHkyXzIsIF9fcGFyaXR5M18yLCBfX3Bhcml0eTRfMj4mIF9feCk7CisKKyAgICBwcml2YXRlOgorICAgICAgdW5pb24KKyAgICAgIHsKKyNpZmRlZiBfX1NTRTJfXworCV9fbTEyOGkgX01fc3RhdGVbX01fbnN0YXRlXTsKKyNlbmRpZgorCXVpbnQzMl90IF9NX3N0YXRlMzJbX01fbnN0YXRlMzJdOworCXJlc3VsdF90eXBlIF9NX3N0YXRlVFtzdGF0ZV9zaXplXTsKKyAgICAgIH0gX19hdHRyaWJ1dGVfXyAoKF9fYWxpZ25lZF9fICgxNikpKTsKKyAgICAgIHNpemVfdCBfTV9wb3M7CisKKyAgICAgIHZvaWQgX01fZ2VuX3JhbmQodm9pZCk7CisgICAgICB2b2lkIF9NX3BlcmlvZF9jZXJ0aWZpY2F0aW9uKCk7CisgIH07CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX20sCisJICAgc2l6ZV90IF9fcG9zMSwgc2l6ZV90IF9fc2wxLCBzaXplX3QgX19zbDIsCisJICAgc2l6ZV90IF9fc3IxLCBzaXplX3QgX19zcjIsCisJICAgdWludDMyX3QgX19tc2sxLCB1aW50MzJfdCBfX21zazIsCisJICAgdWludDMyX3QgX19tc2szLCB1aW50MzJfdCBfX21zazQsCisJICAgdWludDMyX3QgX19wYXJpdHkxLCB1aW50MzJfdCBfX3Bhcml0eTIsCisJICAgdWludDMyX3QgX19wYXJpdHkzLCB1aW50MzJfdCBfX3Bhcml0eTQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9fZ251X2N4eDo6c2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwKKwkgICAgICAgX19tLCBfX3BvczEsIF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLCBfX21zazEsIF9fbXNrMiwgX19tc2szLAorCSAgICAgICBfX21zazQsIF9fcGFyaXR5MSwgX19wYXJpdHkyLCBfX3Bhcml0eTMsIF9fcGFyaXR5ND4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX2dudV9jeHg6OnNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsCisJICAgICAgIF9fbSwgX19wb3MxLCBfX3NsMSwgX19zbDIsIF9fc3IxLCBfX3NyMiwgX19tc2sxLCBfX21zazIsIF9fbXNrMywKKwkgICAgICAgX19tc2s0LCBfX3Bhcml0eTEsIF9fcGFyaXR5MiwgX19wYXJpdHkzLCBfX3Bhcml0eTQ+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisKKyAgLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBTSU1ELW9yaWVudGVkIEZhc3QgTWVyc2VubmUgVHdpc3RlciBhcyBkZWZpbmVkCisgICAqIGluIHRoZSBDIGltcGxlbWVudGF0aW9uIGJ5IERhaXRvIGFuZCBNYXRzdW1vdG8sIGFzIGJvdGggYSAzMi1iaXQKKyAgICogYW5kIDY0LWJpdCB2ZXJzaW9uLgorICAgKi8KKyAgdHlwZWRlZiBzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8dWludDMyX3QsIDYwNywgMiwKKwkJCQkJICAgIDE1LCAzLCAxMywgMywKKwkJCQkJICAgIDB4ZmRmZjM3ZmZVLCAweGVmN2YzZjdkVSwKKwkJCQkJICAgIDB4ZmY3NzdiN2RVLCAweDdmZjdmYjJmVSwKKwkJCQkJICAgIDB4MDAwMDAwMDFVLCAweDAwMDAwMDAwVSwKKwkJCQkJICAgIDB4MDAwMDAwMDBVLCAweDU5ODZmMDU0VT4KKyAgICBzZm10NjA3OworCisgIHR5cGVkZWYgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPHVpbnQ2NF90LCA2MDcsIDIsCisJCQkJCSAgICAxNSwgMywgMTMsIDMsCisJCQkJCSAgICAweGZkZmYzN2ZmVSwgMHhlZjdmM2Y3ZFUsCisJCQkJCSAgICAweGZmNzc3YjdkVSwgMHg3ZmY3ZmIyZlUsCisJCQkJCSAgICAweDAwMDAwMDAxVSwgMHgwMDAwMDAwMFUsCisJCQkJCSAgICAweDAwMDAwMDAwVSwgMHg1OTg2ZjA1NFU+CisgICAgc2ZtdDYwN182NDsKKworCisgIHR5cGVkZWYgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPHVpbnQzMl90LCAxMjc5LCA3LAorCQkJCQkgICAgMTQsIDMsIDUsIDEsCisJCQkJCSAgICAweGY3ZmVmZmZkVSwgMHg3ZmVmY2ZmZlUsCisJCQkJCSAgICAweGFmZjNlZjNmVSwgMHhiNWZmZmY3ZlUsCisJCQkJCSAgICAweDAwMDAwMDAxVSwgMHgwMDAwMDAwMFUsCisJCQkJCSAgICAweDAwMDAwMDAwVSwgMHgyMDAwMDAwMFU+CisgICAgc2ZtdDEyNzk7CisKKyAgdHlwZWRlZiBzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8dWludDY0X3QsIDEyNzksIDcsCisJCQkJCSAgICAxNCwgMywgNSwgMSwKKwkJCQkJICAgIDB4ZjdmZWZmZmRVLCAweDdmZWZjZmZmVSwKKwkJCQkJICAgIDB4YWZmM2VmM2ZVLCAweGI1ZmZmZjdmVSwKKwkJCQkJICAgIDB4MDAwMDAwMDFVLCAweDAwMDAwMDAwVSwKKwkJCQkJICAgIDB4MDAwMDAwMDBVLCAweDIwMDAwMDAwVT4KKyAgICBzZm10MTI3OV82NDsKKworCisgIHR5cGVkZWYgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPHVpbnQzMl90LCAyMjgxLCAxMiwKKwkJCQkJICAgIDE5LCAxLCA1LCAxLAorCQkJCQkgICAgMHhiZmY3ZmZiZlUsIDB4ZmRmZmZmZmVVLAorCQkJCQkgICAgMHhmN2ZmZWY3ZlUsIDB4ZjJmN2NiYmZVLAorCQkJCQkgICAgMHgwMDAwMDAwMVUsIDB4MDAwMDAwMDBVLAorCQkJCQkgICAgMHgwMDAwMDAwMFUsIDB4NDFkZmE2MDBVPgorICAgIHNmbXQyMjgxOworCisgIHR5cGVkZWYgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPHVpbnQ2NF90LCAyMjgxLCAxMiwKKwkJCQkJICAgIDE5LCAxLCA1LCAxLAorCQkJCQkgICAgMHhiZmY3ZmZiZlUsIDB4ZmRmZmZmZmVVLAorCQkJCQkgICAgMHhmN2ZmZWY3ZlUsIDB4ZjJmN2NiYmZVLAorCQkJCQkgICAgMHgwMDAwMDAwMVUsIDB4MDAwMDAwMDBVLAorCQkJCQkgICAgMHgwMDAwMDAwMFUsIDB4NDFkZmE2MDBVPgorICAgIHNmbXQyMjgxXzY0OworCisKKyAgdHlwZWRlZiBzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8dWludDMyX3QsIDQyNTMsIDE3LAorCQkJCQkgICAgMjAsIDEsIDcsIDEsCisJCQkJCSAgICAweDlmN2JmZmZmVSwgMHg5ZmZmZmY1ZlUsCisJCQkJCSAgICAweDNlZmZmZmZiVSwgMHhmZmZmZjdiYlUsCisJCQkJCSAgICAweGE4MDAwMDAxVSwgMHhhZjUzOTBhM1UsCisJCQkJCSAgICAweGI3NDBiM2Y4VSwgMHg2YzExNDg2ZFU+CisgICAgc2ZtdDQyNTM7CisKKyAgdHlwZWRlZiBzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8dWludDY0X3QsIDQyNTMsIDE3LAorCQkJCQkgICAgMjAsIDEsIDcsIDEsCisJCQkJCSAgICAweDlmN2JmZmZmVSwgMHg5ZmZmZmY1ZlUsCisJCQkJCSAgICAweDNlZmZmZmZiVSwgMHhmZmZmZjdiYlUsCisJCQkJCSAgICAweGE4MDAwMDAxVSwgMHhhZjUzOTBhM1UsCisJCQkJCSAgICAweGI3NDBiM2Y4VSwgMHg2YzExNDg2ZFU+CisgICAgc2ZtdDQyNTNfNjQ7CisKKworICB0eXBlZGVmIHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTx1aW50MzJfdCwgMTEyMTMsIDY4LAorCQkJCQkgICAgMTQsIDMsIDcsIDMsCisJCQkJCSAgICAweGVmZmZmN2ZiVSwgMHhmZmZmZmZlZlUsCisJCQkJCSAgICAweGRmZGZiZmZmVSwgMHg3ZmZmZGJmZFUsCisJCQkJCSAgICAweDAwMDAwMDAxVSwgMHgwMDAwMDAwMFUsCisJCQkJCSAgICAweGU4MTQ4MDAwVSwgMHhkMGM3YWZhM1U+CisgICAgc2ZtdDExMjEzOworCisgIHR5cGVkZWYgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPHVpbnQ2NF90LCAxMTIxMywgNjgsCisJCQkJCSAgICAxNCwgMywgNywgMywKKwkJCQkJICAgIDB4ZWZmZmY3ZmJVLCAweGZmZmZmZmVmVSwKKwkJCQkJICAgIDB4ZGZkZmJmZmZVLCAweDdmZmZkYmZkVSwKKwkJCQkJICAgIDB4MDAwMDAwMDFVLCAweDAwMDAwMDAwVSwKKwkJCQkJICAgIDB4ZTgxNDgwMDBVLCAweGQwYzdhZmEzVT4KKyAgICBzZm10MTEyMTNfNjQ7CisKKworICB0eXBlZGVmIHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTx1aW50MzJfdCwgMTk5MzcsIDEyMiwKKwkJCQkJICAgIDE4LCAxLCAxMSwgMSwKKwkJCQkJICAgIDB4ZGZmZmZmZWZVLCAweGRkZmVjYjdmVSwKKwkJCQkJICAgIDB4YmZmYWZmZmZVLCAweGJmZmZmZmY2VSwKKwkJCQkJICAgIDB4MDAwMDAwMDFVLCAweDAwMDAwMDAwVSwKKwkJCQkJICAgIDB4MDAwMDAwMDBVLCAweDEzYzllNjg0VT4KKyAgICBzZm10MTk5Mzc7CisKKyAgdHlwZWRlZiBzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8dWludDY0X3QsIDE5OTM3LCAxMjIsCisJCQkJCSAgICAxOCwgMSwgMTEsIDEsCisJCQkJCSAgICAweGRmZmZmZmVmVSwgMHhkZGZlY2I3ZlUsCisJCQkJCSAgICAweGJmZmFmZmZmVSwgMHhiZmZmZmZmNlUsCisJCQkJCSAgICAweDAwMDAwMDAxVSwgMHgwMDAwMDAwMFUsCisJCQkJCSAgICAweDAwMDAwMDAwVSwgMHgxM2M5ZTY4NFU+CisgICAgc2ZtdDE5OTM3XzY0OworCisKKyAgdHlwZWRlZiBzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8dWludDMyX3QsIDQ0NDk3LCAzMzAsCisJCQkJCSAgICA1LCAzLCA5LCAzLAorCQkJCQkgICAgMHhlZmZmZmZmYlUsIDB4ZGZiZWJmZmZVLAorCQkJCQkgICAgMHhiZmJmN2JlZlUsIDB4OWZmZDdiZmZVLAorCQkJCQkgICAgMHgwMDAwMDAwMVUsIDB4MDAwMDAwMDBVLAorCQkJCQkgICAgMHhhM2FjNDAwMFUsIDB4ZWNjMTMyN2FVPgorICAgIHNmbXQ0NDQ5NzsKKworICB0eXBlZGVmIHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTx1aW50NjRfdCwgNDQ0OTcsIDMzMCwKKwkJCQkJICAgIDUsIDMsIDksIDMsCisJCQkJCSAgICAweGVmZmZmZmZiVSwgMHhkZmJlYmZmZlUsCisJCQkJCSAgICAweGJmYmY3YmVmVSwgMHg5ZmZkN2JmZlUsCisJCQkJCSAgICAweDAwMDAwMDAxVSwgMHgwMDAwMDAwMFUsCisJCQkJCSAgICAweGEzYWM0MDAwVSwgMHhlY2MxMzI3YVU+CisgICAgc2ZtdDQ0NDk3XzY0OworCisKKyAgdHlwZWRlZiBzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8dWludDMyX3QsIDg2MjQzLCAzNjYsCisJCQkJCSAgICA2LCA3LCAxOSwgMSwKKwkJCQkJICAgIDB4ZmRiZmZiZmZVLCAweGJmZjdmZjNmVSwKKwkJCQkJICAgIDB4ZmQ3N2VmZmZVLCAweGJmOWZmM2ZmVSwKKwkJCQkJICAgIDB4MDAwMDAwMDFVLCAweDAwMDAwMDAwVSwKKwkJCQkJICAgIDB4MDAwMDAwMDBVLCAweGU5NTI4ZDg1VT4KKyAgICBzZm10ODYyNDM7CisKKyAgdHlwZWRlZiBzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8dWludDY0X3QsIDg2MjQzLCAzNjYsCisJCQkJCSAgICA2LCA3LCAxOSwgMSwKKwkJCQkJICAgIDB4ZmRiZmZiZmZVLCAweGJmZjdmZjNmVSwKKwkJCQkJICAgIDB4ZmQ3N2VmZmZVLCAweGJmOWZmM2ZmVSwKKwkJCQkJICAgIDB4MDAwMDAwMDFVLCAweDAwMDAwMDAwVSwKKwkJCQkJICAgIDB4MDAwMDAwMDBVLCAweGU5NTI4ZDg1VT4KKyAgICBzZm10ODYyNDNfNjQ7CisKKworICB0eXBlZGVmIHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTx1aW50MzJfdCwgMTMyMDQ5LCAxMTAsCisJCQkJCSAgICAxOSwgMSwgMjEsIDEsCisJCQkJCSAgICAweGZmZmZiYjVmVSwgMHhmYjZlYmY5NVUsCisJCQkJCSAgICAweGZmZmVmZmZhVSwgMHhjZmY3N2ZmZlUsCisJCQkJCSAgICAweDAwMDAwMDAxVSwgMHgwMDAwMDAwMFUsCisJCQkJCSAgICAweGNiNTIwMDAwVSwgMHhjN2U5MWM3ZFU+CisgICAgc2ZtdDEzMjA0OTsKKworICB0eXBlZGVmIHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTx1aW50NjRfdCwgMTMyMDQ5LCAxMTAsCisJCQkJCSAgICAxOSwgMSwgMjEsIDEsCisJCQkJCSAgICAweGZmZmZiYjVmVSwgMHhmYjZlYmY5NVUsCisJCQkJCSAgICAweGZmZmVmZmZhVSwgMHhjZmY3N2ZmZlUsCisJCQkJCSAgICAweDAwMDAwMDAxVSwgMHgwMDAwMDAwMFUsCisJCQkJCSAgICAweGNiNTIwMDAwVSwgMHhjN2U5MWM3ZFU+CisgICAgc2ZtdDEzMjA0OV82NDsKKworCisgIHR5cGVkZWYgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPHVpbnQzMl90LCAyMTYwOTEsIDYyNywKKwkJCQkJICAgIDExLCAzLCAxMCwgMSwKKwkJCQkJICAgIDB4YmZmN2JmZjdVLCAweGJmZmZmZmZmVSwKKwkJCQkJICAgIDB4YmZmZmZhN2ZVLCAweGZmZGRmYmZiVSwKKwkJCQkJICAgIDB4ZjgwMDAwMDFVLCAweDg5ZTgwNzA5VSwKKwkJCQkJICAgIDB4M2JkMmI2NGJVLCAweDBjNjRiMWU0VT4KKyAgICBzZm10MjE2MDkxOworCisgIHR5cGVkZWYgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPHVpbnQ2NF90LCAyMTYwOTEsIDYyNywKKwkJCQkJICAgIDExLCAzLCAxMCwgMSwKKwkJCQkJICAgIDB4YmZmN2JmZjdVLCAweGJmZmZmZmZmVSwKKwkJCQkJICAgIDB4YmZmZmZhN2ZVLCAweGZmZGRmYmZiVSwKKwkJCQkJICAgIDB4ZjgwMDAwMDFVLCAweDg5ZTgwNzA5VSwKKwkJCQkJICAgIDB4M2JkMmI2NGJVLCAweDBjNjRiMWU0VT4KKyAgICBzZm10MjE2MDkxXzY0OworCisjZW5kaWYgLy8gX19CWVRFX09SREVSX18gPT0gX19PUkRFUl9MSVRUTEVfRU5ESUFOX18KKworICAvKioKKyAgICogQGJyaWVmIEEgYmV0YSBjb250aW51b3VzIGRpc3RyaWJ1dGlvbiBmb3IgcmFuZG9tIG51bWJlcnMuCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgYmV0YSBwcm9iYWJpbGl0eSBkZW5zaXR5IGZ1bmN0aW9uIGlzOgorICAgKiBAZlsKKyAgICogICAgIHAoeHxcYWxwaGEsXGJldGEpID0gXGZyYWN7MX17QihcYWxwaGEsXGJldGEpfQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICB4XntcYWxwaGEgLSAxfSAoMSAtIHgpXntcYmV0YSAtIDF9CisgICAqIEBmXQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIGJldGFfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIGJldGFfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisJZnJpZW5kIGNsYXNzIGJldGFfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT47CisKKwlleHBsaWNpdAorCXBhcmFtX3R5cGUoX1JlYWxUeXBlIF9fYWxwaGFfdmFsID0gX1JlYWxUeXBlKDEpLAorCQkgICBfUmVhbFR5cGUgX19iZXRhX3ZhbCA9IF9SZWFsVHlwZSgxKSkKKwk6IF9NX2FscGhhKF9fYWxwaGFfdmFsKSwgX01fYmV0YShfX2JldGFfdmFsKQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9hbHBoYSA+IF9SZWFsVHlwZSgwKSk7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fYmV0YSA+IF9SZWFsVHlwZSgwKSk7CisJfQorCisJX1JlYWxUeXBlCisJYWxwaGEoKSBjb25zdAorCXsgcmV0dXJuIF9NX2FscGhhOyB9CisKKwlfUmVhbFR5cGUKKwliZXRhKCkgY29uc3QKKwl7IHJldHVybiBfTV9iZXRhOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiAoX19wMS5fTV9hbHBoYSA9PSBfX3AyLl9NX2FscGhhCisJCSAgJiYgX19wMS5fTV9iZXRhID09IF9fcDIuX01fYmV0YSk7IH0KKworICAgICAgcHJpdmF0ZToKKwl2b2lkCisJX01faW5pdGlhbGl6ZSgpOworCisJX1JlYWxUeXBlIF9NX2FscGhhOworCV9SZWFsVHlwZSBfTV9iZXRhOworICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBiZXRhIGRpc3RyaWJ1dGlvbiB3aXRoIHBhcmFtZXRlcnMKKyAgICAgICAqIEBmJFxhbHBoYUBmJCBhbmQgQGYkXGJldGFAZiQuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiZXRhX2Rpc3RyaWJ1dGlvbihfUmVhbFR5cGUgX19hbHBoYV92YWwgPSBfUmVhbFR5cGUoMSksCisJCQlfUmVhbFR5cGUgX19iZXRhX3ZhbCA9IF9SZWFsVHlwZSgxKSkKKyAgICAgIDogX01fcGFyYW0oX19hbHBoYV92YWwsIF9fYmV0YV92YWwpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGJldGFfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgQGYkXGFscGhhQGYkIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgYWxwaGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0uYWxwaGEoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBAZiRcYmV0YUBmJCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIGJldGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0uYmV0YSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHJlc3VsdF90eXBlKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gcmVzdWx0X3R5cGUoMSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgcmV0dXJuIHRoaXMtPm9wZXJhdG9yKCkoX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHRoaXMtPl9fZ2VuZXJhdGUoX19mLCBfX3QsIF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIGJldGEgZGlzdHJpYnV0aW9ucyBoYXZlIHRoZSBzYW1lCisgICAgICAgKiAgICAgICAgcGFyYW1ldGVycyBhbmQgdGhlIHNlcXVlbmNlcyB0aGF0IHdvdWxkIGJlIGdlbmVyYXRlZAorICAgICAgICogICAgICAgIGFyZSBlcXVhbC4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgYmV0YV9kaXN0cmlidXRpb24mIF9fZDEsCisJCSBjb25zdCBiZXRhX2Rpc3RyaWJ1dGlvbiYgX19kMikKKyAgICAgIHsgcmV0dXJuIF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIGEgJWJldGFfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICViZXRhX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IF9fZ251X2N4eDo6YmV0YV9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEV4dHJhY3RzIGEgJWJldGFfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlYmV0YV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIF9fZ251X2N4eDo6YmV0YV9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkJY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIGJldGEgZGlzdHJpYnV0aW9ucyBhcmUgZGlmZmVyZW50LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfX2dudV9jeHg6OmJldGFfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IF9fZ251X2N4eDo6YmV0YV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMikKKyAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisKKyAgLyoqCisgICAqIEBicmllZiBBIG11bHRpLXZhcmlhdGUgbm9ybWFsIGNvbnRpbnVvdXMgZGlzdHJpYnV0aW9uIGZvciByYW5kb20gbnVtYmVycy4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBub3JtYWwgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBpcworICAgKiBAZlsKKyAgICogICAgIHAoXG92ZXJyaWdodGFycm93e3h9fFxvdmVycmlnaHRhcnJvd3tcbXUgfSxcU2lnbWEpID0KKyAgICogICAgICAgXGZyYWN7MX17XHNxcnR7KDJccGkgKV5rXGRldChcU2lnbWEpKX19CisgICAqICAgICAgIGVeey1cZnJhY3sxfXsyfShcb3ZlcnJpZ2h0YXJyb3d7eH0tXG92ZXJyaWdodGFycm93e1xtdX0pXlx0ZXh0e1R9CisgICAqICAgICAgICAgIFxTaWdtYSBeey0xfShcb3ZlcnJpZ2h0YXJyb3d7eH0tXG92ZXJyaWdodGFycm93e1xtdX0pfQorICAgKiBAZl0KKyAgICoKKyAgICogd2hlcmUgQGYkXG92ZXJyaWdodGFycm93e3h9QGYkIGFuZCBAZiRcb3ZlcnJpZ2h0YXJyb3d7XG11fUBmJCBhcmUKKyAgICogdmVjdG9ycyBvZiBkaW1lbnNpb24gQGYka0BmJCBhbmQgQGYkXFNpZ21hQGYkIGlzIHRoZSBjb3ZhcmlhbmNlCisgICAqIG1hdHJpeCAod2hpY2ggbXVzdCBiZSBwb3NpdGl2ZS1kZWZpbml0ZSkuCisgICAqLworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfRGltZW4sIHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcyBub3JtYWxfbXZfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX0RpbWVuICE9IDAsICJkaW1lbnNpb24gaXMgemVybyIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBzdGQ6OmFycmF5PF9SZWFsVHlwZSwgX0RpbWVuPiByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIGNsYXNzIHBhcmFtX3R5cGUKKyAgICAgIHsKKwlzdGF0aWMgY29uc3RleHByIHNpemVfdCBfTV90X3NpemUgPSBfRGltZW4gKiAoX0RpbWVuICsgMSkgLyAyOworCisgICAgICBwdWJsaWM6CisJdHlwZWRlZiBub3JtYWxfbXZfZGlzdHJpYnV0aW9uPF9EaW1lbiwgX1JlYWxUeXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKwlmcmllbmQgY2xhc3Mgbm9ybWFsX212X2Rpc3RyaWJ1dGlvbjxfRGltZW4sIF9SZWFsVHlwZT47CisKKwlwYXJhbV90eXBlKCkKKwl7CisJICBzdGQ6OmZpbGwoX01fbWVhbi5iZWdpbigpLCBfTV9tZWFuLmVuZCgpLCBfUmVhbFR5cGUoMCkpOworCSAgYXV0byBfX2l0ID0gX01fdC5iZWdpbigpOworCSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX0RpbWVuOyArK19faSkKKwkgICAgeworCSAgICAgIHN0ZDo6ZmlsbF9uKF9faXQsIF9faSwgX1JlYWxUeXBlKDApKTsKKwkgICAgICBfX2l0ICs9IF9faTsKKwkgICAgICAqX19pdCsrID0gX1JlYWxUeXBlKDEpOworCSAgICB9CisJfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjEsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IyPgorCSAgcGFyYW1fdHlwZShfRm9yd2FyZEl0ZXJhdG9yMSBfX21lYW5iZWdpbiwKKwkJICAgICBfRm9yd2FyZEl0ZXJhdG9yMSBfX21lYW5lbmQsCisJCSAgICAgX0ZvcndhcmRJdGVyYXRvcjIgX192YXJjb3ZiZWdpbiwKKwkJICAgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX3ZhcmNvdmVuZCkKKwl7CisJICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8CisJCQkJICAgICAgX0ZvcndhcmRJdGVyYXRvcjE+KQorCSAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IyPikKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChzdGQ6OmRpc3RhbmNlKF9fbWVhbmJlZ2luLCBfX21lYW5lbmQpCisJCQkJPD0gX0RpbWVuKTsKKwkgIGNvbnN0IGF1dG8gX19kaXN0ID0gc3RkOjpkaXN0YW5jZShfX3ZhcmNvdmJlZ2luLCBfX3ZhcmNvdmVuZCk7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX19kaXN0ID09IF9EaW1lbiAqIF9EaW1lbgorCQkJCXx8IF9fZGlzdCA9PSBfRGltZW4gKiAoX0RpbWVuICsgMSkgLyAyCisJCQkJfHwgX19kaXN0ID09IF9EaW1lbik7CisKKwkgIGlmIChfX2Rpc3QgPT0gX0RpbWVuICogX0RpbWVuKQorCSAgICBfTV9pbml0X2Z1bGwoX19tZWFuYmVnaW4sIF9fbWVhbmVuZCwgX192YXJjb3ZiZWdpbiwgX192YXJjb3ZlbmQpOworCSAgZWxzZSBpZiAoX19kaXN0ID09IF9EaW1lbiAqIChfRGltZW4gKyAxKSAvIDIpCisJICAgIF9NX2luaXRfbG93ZXIoX19tZWFuYmVnaW4sIF9fbWVhbmVuZCwgX192YXJjb3ZiZWdpbiwgX192YXJjb3ZlbmQpOworCSAgZWxzZQorCSAgICBfTV9pbml0X2RpYWdvbmFsKF9fbWVhbmJlZ2luLCBfX21lYW5lbmQsCisJCQkgICAgIF9fdmFyY292YmVnaW4sIF9fdmFyY292ZW5kKTsKKwl9CisKKwlwYXJhbV90eXBlKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfUmVhbFR5cGU+IF9fbWVhbiwKKwkJICAgc3RkOjppbml0aWFsaXplcl9saXN0PF9SZWFsVHlwZT4gX192YXJjb3YpCisJeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9fbWVhbi5zaXplKCkgPD0gX0RpbWVuKTsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfX3ZhcmNvdi5zaXplKCkgPT0gX0RpbWVuICogX0RpbWVuCisJCQkJfHwgX192YXJjb3Yuc2l6ZSgpID09IF9EaW1lbiAqIChfRGltZW4gKyAxKSAvIDIKKwkJCQl8fCBfX3ZhcmNvdi5zaXplKCkgPT0gX0RpbWVuKTsKKworCSAgaWYgKF9fdmFyY292LnNpemUoKSA9PSBfRGltZW4gKiBfRGltZW4pCisJICAgIF9NX2luaXRfZnVsbChfX21lYW4uYmVnaW4oKSwgX19tZWFuLmVuZCgpLAorCQkJIF9fdmFyY292LmJlZ2luKCksIF9fdmFyY292LmVuZCgpKTsKKwkgIGVsc2UgaWYgKF9fdmFyY292LnNpemUoKSA9PSBfRGltZW4gKiAoX0RpbWVuICsgMSkgLyAyKQorCSAgICBfTV9pbml0X2xvd2VyKF9fbWVhbi5iZWdpbigpLCBfX21lYW4uZW5kKCksCisJCQkgIF9fdmFyY292LmJlZ2luKCksIF9fdmFyY292LmVuZCgpKTsKKwkgIGVsc2UKKwkgICAgX01faW5pdF9kaWFnb25hbChfX21lYW4uYmVnaW4oKSwgX19tZWFuLmVuZCgpLAorCQkJICAgICBfX3ZhcmNvdi5iZWdpbigpLCBfX3ZhcmNvdi5lbmQoKSk7CisJfQorCisJc3RkOjphcnJheTxfUmVhbFR5cGUsIF9EaW1lbj4KKwltZWFuKCkgY29uc3QKKwl7IHJldHVybiBfTV9tZWFuOyB9CisKKwlzdGQ6OmFycmF5PF9SZWFsVHlwZSwgX01fdF9zaXplPgorCXZhcmNvdigpIGNvbnN0CisJeyByZXR1cm4gX01fdDsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gX19wMS5fTV9tZWFuID09IF9fcDIuX01fbWVhbiAmJiBfX3AxLl9NX3QgPT0gX19wMi5fTV90OyB9CisKKyAgICAgIHByaXZhdGU6CisJdGVtcGxhdGUgPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyPgorCSAgdm9pZCBfTV9pbml0X2Z1bGwoX0lucHV0SXRlcmF0b3IxIF9fbWVhbmJlZ2luLAorCQkJICAgIF9JbnB1dEl0ZXJhdG9yMSBfX21lYW5lbmQsCisJCQkgICAgX0lucHV0SXRlcmF0b3IyIF9fdmFyY292YmVnaW4sCisJCQkgICAgX0lucHV0SXRlcmF0b3IyIF9fdmFyY292ZW5kKTsKKwl0ZW1wbGF0ZSA8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjI+CisJICB2b2lkIF9NX2luaXRfbG93ZXIoX0lucHV0SXRlcmF0b3IxIF9fbWVhbmJlZ2luLAorCQkJICAgICBfSW5wdXRJdGVyYXRvcjEgX19tZWFuZW5kLAorCQkJICAgICBfSW5wdXRJdGVyYXRvcjIgX192YXJjb3ZiZWdpbiwKKwkJCSAgICAgX0lucHV0SXRlcmF0b3IyIF9fdmFyY292ZW5kKTsKKwl0ZW1wbGF0ZSA8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjI+CisJICB2b2lkIF9NX2luaXRfZGlhZ29uYWwoX0lucHV0SXRlcmF0b3IxIF9fbWVhbmJlZ2luLAorCQkJCV9JbnB1dEl0ZXJhdG9yMSBfX21lYW5lbmQsCisJCQkJX0lucHV0SXRlcmF0b3IyIF9fdmFyYmVnaW4sCisJCQkJX0lucHV0SXRlcmF0b3IyIF9fdmFyZW5kKTsKKworCXN0ZDo6YXJyYXk8X1JlYWxUeXBlLCBfRGltZW4+IF9NX21lYW47CisJc3RkOjphcnJheTxfUmVhbFR5cGUsIF9NX3Rfc2l6ZT4gX01fdDsKKyAgICAgIH07CisKKyAgICBwdWJsaWM6CisgICAgICBub3JtYWxfbXZfZGlzdHJpYnV0aW9uKCkKKyAgICAgIDogX01fcGFyYW0oKSwgX01fbmQoKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IxLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMj4KKwlub3JtYWxfbXZfZGlzdHJpYnV0aW9uKF9Gb3J3YXJkSXRlcmF0b3IxIF9fbWVhbmJlZ2luLAorCQkJICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IxIF9fbWVhbmVuZCwKKwkJCSAgICAgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX3ZhcmNvdmJlZ2luLAorCQkJICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fdmFyY292ZW5kKQorCTogX01fcGFyYW0oX19tZWFuYmVnaW4sIF9fbWVhbmVuZCwgX192YXJjb3ZiZWdpbiwgX192YXJjb3ZlbmQpLAorCSAgX01fbmQoKQorCXsgfQorCisgICAgICBub3JtYWxfbXZfZGlzdHJpYnV0aW9uKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfUmVhbFR5cGU+IF9fbWVhbiwKKwkJCSAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PF9SZWFsVHlwZT4gX192YXJjb3YpCisgICAgICA6IF9NX3BhcmFtKF9fbWVhbiwgX192YXJjb3YpLCBfTV9uZCgpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIG5vcm1hbF9tdl9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApLCBfTV9uZCgpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgX01fbmQucmVzZXQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBtZWFuIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtZWFuKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLm1lYW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBjb21wYWN0IGZvcm0gb2YgdGhlIHZhcmlhbmNlL2NvdmFyaWFuY2UKKyAgICAgICAqIG1hdHJpeCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBzdGQ6OmFycmF5PF9SZWFsVHlwZSwgX0RpbWVuICogKF9EaW1lbiArIDEpIC8gMj4KKyAgICAgIHZhcmNvdigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS52YXJjb3YoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJlc3VsdF90eXBlIF9fcmVzOworCV9fcmVzLmZpbGwoc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+Ojpsb3dlc3QoKSk7CisJcmV0dXJuIF9fcmVzOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXN1bHRfdHlwZSBfX3JlczsKKwlfX3Jlcy5maWxsKHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6bWF4KCkpOworCXJldHVybiBfX3JlczsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgcmV0dXJuIHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyByZXR1cm4gdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIG11bHRpLXZhcmlhbnQgbm9ybWFsIGRpc3RyaWJ1dGlvbnMgaGF2ZQorICAgICAgICogICAgICAgIHRoZSBzYW1lIHBhcmFtZXRlcnMgYW5kIHRoZSBzZXF1ZW5jZXMgdGhhdCB3b3VsZAorICAgICAgICogICAgICAgIGJlIGdlbmVyYXRlZCBhcmUgZXF1YWwuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHNpemVfdCBfRGltZW4xLCB0eXBlbmFtZSBfUmVhbFR5cGUxPgorCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdAorCQkgICBfX2dudV9jeHg6Om5vcm1hbF9tdl9kaXN0cmlidXRpb248X0RpbWVuMSwgX1JlYWxUeXBlMT4mCisJCSAgIF9fZDEsCisJCSAgIGNvbnN0CisJCSAgIF9fZ251X2N4eDo6bm9ybWFsX212X2Rpc3RyaWJ1dGlvbjxfRGltZW4xLCBfUmVhbFR5cGUxPiYKKwkJICAgX19kMik7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgYSAlbm9ybWFsX212X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlbm9ybWFsX212X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxzaXplX3QgX0RpbWVuMSwgdHlwZW5hbWUgX1JlYWxUeXBlMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdAorCQkgICBfX2dudV9jeHg6Om5vcm1hbF9tdl9kaXN0cmlidXRpb248X0RpbWVuMSwgX1JlYWxUeXBlMT4mCisJCSAgIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEV4dHJhY3RzIGEgJW5vcm1hbF9tdl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVub3JtYWxfbXZfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvcgorICAgICAgICogICAgICAgICAgc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHNpemVfdCBfRGltZW4xLCB0eXBlbmFtZSBfUmVhbFR5cGUxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIF9fZ251X2N4eDo6bm9ybWFsX212X2Rpc3RyaWJ1dGlvbjxfRGltZW4xLCBfUmVhbFR5cGUxPiYKKwkJICAgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworICAgICAgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4gX01fbmQ7CisgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gbXVsdGktdmFyaWF0ZSBub3JtYWwgZGlzdHJpYnV0aW9ucyBhcmUKKyAgICogZGlmZmVyZW50LgorICAgKi8KKyAgdGVtcGxhdGU8c2l6ZV90IF9EaW1lbiwgdHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfX2dudV9jeHg6Om5vcm1hbF9tdl9kaXN0cmlidXRpb248X0RpbWVuLCBfUmVhbFR5cGU+JgorCSAgICAgICBfX2QxLAorCSAgICAgICBjb25zdCBfX2dudV9jeHg6Om5vcm1hbF9tdl9kaXN0cmlidXRpb248X0RpbWVuLCBfUmVhbFR5cGU+JgorCSAgICAgICBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisKKyAgLyoqCisgICAqIEBicmllZiBBIFJpY2UgY29udGludW91cyBkaXN0cmlidXRpb24gZm9yIHJhbmRvbSBudW1iZXJzLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIFJpY2UgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBpcworICAgKiBAZlsKKyAgICogICAgIHAoeHxcbnUsXHNpZ21hKSA9IFxmcmFje3h9e1xzaWdtYV4yfQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgXGV4cFxsZWZ0KC1cZnJhY3t4XjIrXG51XjJ9ezJcc2lnbWFeMn1ccmlnaHQpCisgICAqICAgICAgICAgICAgICAgICAgICAgICBJXzBcbGVmdChcZnJhY3t4IFxudX17XHNpZ21hXjJ9XHJpZ2h0KQorICAgKiBAZl0KKyAgICogd2hlcmUgQGYkSV8wKHopQGYkIGlzIHRoZSBtb2RpZmllZCBCZXNzZWwgZnVuY3Rpb24gb2YgdGhlIGZpcnN0IGtpbmQKKyAgICogb2Ygb3JkZXIgMCBhbmQgQGYkXG51ID49IDBAZiQgYW5kIEBmJFxzaWdtYSA+IDBAZiQuCisgICAqCisgICAqIDx0YWJsZSBib3JkZXI9MSBjZWxscGFkZGluZz0xMCBjZWxsc3BhY2luZz0wPgorICAgKiA8Y2FwdGlvbiBhbGlnbj10b3A+RGlzdHJpYnV0aW9uIFN0YXRpc3RpY3M8L2NhcHRpb24+CisgICAqIDx0cj48dGQ+TWVhbjwvdGQ+PHRkPkBmJFxzcXJ0e1xwaS8yfUxfezEvMn0oLVxudV4yLzJcc2lnbWFeMilAZiQ8L3RkPjwvdHI+CisgICAqIDx0cj48dGQ+VmFyaWFuY2U8L3RkPjx0ZD5AZiQyXHNpZ21hXjIgKyBcbnVeMgorICAgKiAgICAgICAgICAgICAgICAgICArIChccGlcc2lnbWFeMi8yKUxeMl97MS8yfSgtXG51XjIvMlxzaWdtYV4yKUBmJDwvdGQ+PC90cj4KKyAgICogPHRyPjx0ZD5SYW5nZTwvdGQ+PHRkPkBmJFswLCBcaW5mdHkpQGYkPC90ZD48L3RyPgorICAgKiA8L3RhYmxlPgorICAgKiB3aGVyZSBAZiRMX3sxLzJ9KHgpQGYkIGlzIHRoZSBMYWd1ZXJyZSBwb2x5bm9taWFsIG9mIG9yZGVyIDEvMi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcworICAgIHJpY2VfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiByaWNlX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisKKwlwYXJhbV90eXBlKHJlc3VsdF90eXBlIF9fbnVfdmFsID0gcmVzdWx0X3R5cGUoMCksCisJCSAgIHJlc3VsdF90eXBlIF9fc2lnbWFfdmFsID0gcmVzdWx0X3R5cGUoMSkpCisJOiBfTV9udShfX251X3ZhbCksIF9NX3NpZ21hKF9fc2lnbWFfdmFsKQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9udSA+PSByZXN1bHRfdHlwZSgwKSk7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fc2lnbWEgPiByZXN1bHRfdHlwZSgwKSk7CisJfQorCisJcmVzdWx0X3R5cGUKKwludSgpIGNvbnN0CisJeyByZXR1cm4gX01fbnU7IH0KKworCXJlc3VsdF90eXBlCisJc2lnbWEoKSBjb25zdAorCXsgcmV0dXJuIF9NX3NpZ21hOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiBfX3AxLl9NX251ID09IF9fcDIuX01fbnUKKwkgICAgICAmJiBfX3AxLl9NX3NpZ21hID09IF9fcDIuX01fc2lnbWE7IH0KKworICAgICAgcHJpdmF0ZToKKwl2b2lkIF9NX2luaXRpYWxpemUoKTsKKworCXJlc3VsdF90eXBlIF9NX251OworCXJlc3VsdF90eXBlIF9NX3NpZ21hOworICAgICAgfTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0b3JzLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgcmljZV9kaXN0cmlidXRpb24ocmVzdWx0X3R5cGUgX19udV92YWwgPSByZXN1bHRfdHlwZSgwKSwKKwkJCXJlc3VsdF90eXBlIF9fc2lnbWFfdmFsID0gcmVzdWx0X3R5cGUoMSkpCisgICAgICA6IF9NX3BhcmFtKF9fbnVfdmFsLCBfX3NpZ21hX3ZhbCksCisJX01fbmR4KF9fbnVfdmFsLCBfX3NpZ21hX3ZhbCksCisJX01fbmR5KHJlc3VsdF90eXBlKDApLCBfX3NpZ21hX3ZhbCkKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgcmljZV9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApLAorCV9NX25keChfX3AubnUoKSwgX19wLnNpZ21hKCkpLAorCV9NX25keShyZXN1bHRfdHlwZSgwKSwgX19wLnNpZ21hKCkpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsKKwlfTV9uZHgucmVzZXQoKTsKKwlfTV9uZHkucmVzZXQoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBudSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5udSgpOyB9CisKKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBzaWdtYSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5zaWdtYSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHJlc3VsdF90eXBlKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1heCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7CisJICByZXN1bHRfdHlwZSBfX3ggPSB0aGlzLT5fTV9uZHgoX191cm5nKTsKKwkgIHJlc3VsdF90eXBlIF9feSA9IHRoaXMtPl9NX25keShfX3VybmcpOworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKwkgIHJldHVybiBzdGQ6Omh5cG90KF9feCwgX195KTsKKyNlbHNlCisJICByZXR1cm4gc3RkOjpzcXJ0KF9feCAqIF9feCArIF9feSAqIF9feSk7CisjZW5kaWYKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeworCSAgdHlwZW5hbWUgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPjo6cGFyYW1fdHlwZQorCSAgICBfX3B4KF9fcC5udSgpLCBfX3Auc2lnbWEoKSksIF9fcHkocmVzdWx0X3R5cGUoMCksIF9fcC5zaWdtYSgpKTsKKwkgIHJlc3VsdF90eXBlIF9feCA9IHRoaXMtPl9NX25keChfX3B4LCBfX3VybmcpOworCSAgcmVzdWx0X3R5cGUgX195ID0gdGhpcy0+X01fbmR5KF9fcHksIF9fdXJuZyk7CisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorCSAgcmV0dXJuIHN0ZDo6aHlwb3QoX194LCBfX3kpOworI2Vsc2UKKwkgIHJldHVybiBzdGQ6OnNxcnQoX194ICogX194ICsgX195ICogX195KTsKKyNlbmRpZgorCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZShfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gUmljZSBkaXN0cmlidXRpb25zIGhhdmUKKyAgICAgICAqICAgICAgICB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFuZCB0aGUgc2VxdWVuY2VzIHRoYXQgd291bGQKKyAgICAgICAqICAgICAgICBiZSBnZW5lcmF0ZWQgYXJlIGVxdWFsLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCByaWNlX2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkJIGNvbnN0IHJpY2VfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gKF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbQorCQkmJiBfX2QxLl9NX25keCA9PSBfX2QyLl9NX25keAorCQkmJiBfX2QxLl9NX25keSA9PSBfX2QyLl9NX25keSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVyaWNlX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlcmljZV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgY29uc3QgcmljZV9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlcmljZV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194IEEgJXJpY2VfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgcmljZV9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mKTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworCisgICAgICBzdGQ6Om5vcm1hbF9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9NX25keDsKKyAgICAgIHN0ZDo6bm9ybWFsX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gX01fbmR5OworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gUmljZSBkaXN0cmlidXRpb25zIGFyZSBub3QgZXF1YWwuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCByaWNlX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX19kMSwKKwkgICAgICAgY29uc3QgcmljZV9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKworICAvKioKKyAgICogQGJyaWVmIEEgTmFrYWdhbWkgY29udGludW91cyBkaXN0cmlidXRpb24gZm9yIHJhbmRvbSBudW1iZXJzLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIE5ha2FnYW1pIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gaXMKKyAgICogQGZbCisgICAqICAgICBwKHh8XG11LFxvbWVnYSkgPSBcZnJhY3syXG11XlxtdX17XEdhbW1hKFxtdSlcb21lZ2FeXG11fQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgeF57MlxtdS0xfWVeey1cbXUgeCAvIFxvbWVnYX0KKyAgICogQGZdCisgICAqIHdoZXJlIEBmJFxHYW1tYSh6KUBmJCBpcyB0aGUgZ2FtbWEgZnVuY3Rpb24gYW5kIEBmJFxtdSA+PSAwLjVAZiQKKyAgICogYW5kIEBmJFxvbWVnYSA+IDBAZiQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MKKyAgICBuYWthZ2FtaV9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgbmFrYWdhbWlfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKworCXBhcmFtX3R5cGUocmVzdWx0X3R5cGUgX19tdV92YWwgPSByZXN1bHRfdHlwZSgxKSwKKwkJICAgcmVzdWx0X3R5cGUgX19vbWVnYV92YWwgPSByZXN1bHRfdHlwZSgxKSkKKwk6IF9NX211KF9fbXVfdmFsKSwgX01fb21lZ2EoX19vbWVnYV92YWwpCisJeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX211ID49IHJlc3VsdF90eXBlKDAuNUwpKTsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9vbWVnYSA+IHJlc3VsdF90eXBlKDApKTsKKwl9CisKKwlyZXN1bHRfdHlwZQorCW11KCkgY29uc3QKKwl7IHJldHVybiBfTV9tdTsgfQorCisJcmVzdWx0X3R5cGUKKwlvbWVnYSgpIGNvbnN0CisJeyByZXR1cm4gX01fb21lZ2E7IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fbXUgPT0gX19wMi5fTV9tdQorCSAgICAgICYmIF9fcDEuX01fb21lZ2EgPT0gX19wMi5fTV9vbWVnYTsgfQorCisgICAgICBwcml2YXRlOgorCXZvaWQgX01faW5pdGlhbGl6ZSgpOworCisJcmVzdWx0X3R5cGUgX01fbXU7CisJcmVzdWx0X3R5cGUgX01fb21lZ2E7CisgICAgICB9OworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RvcnMuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBuYWthZ2FtaV9kaXN0cmlidXRpb24ocmVzdWx0X3R5cGUgX19tdV92YWwgPSByZXN1bHRfdHlwZSgxKSwKKwkJCSAgICByZXN1bHRfdHlwZSBfX29tZWdhX3ZhbCA9IHJlc3VsdF90eXBlKDEpKQorICAgICAgOiBfTV9wYXJhbShfX211X3ZhbCwgX19vbWVnYV92YWwpLAorCV9NX2dkKF9fbXVfdmFsLCBfX29tZWdhX3ZhbCAvIF9fbXVfdmFsKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBuYWthZ2FtaV9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApLAorCV9NX2dkKF9fcC5tdSgpLCBfX3Aub21lZ2EoKSAvIF9fcC5tdSgpKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpCisgICAgICB7IF9NX2dkLnJlc2V0KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtdSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5tdSgpOyB9CisKKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBvbWVnYSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5vbWVnYSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHJlc3VsdF90eXBlKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1heCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHJldHVybiBzdGQ6OnNxcnQodGhpcy0+X01fZ2QoX191cm5nKSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7CisJICB0eXBlbmFtZSBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT46OnBhcmFtX3R5cGUKKwkgICAgX19wZyhfX3AubXUoKSwgX19wLm9tZWdhKCkgLyBfX3AubXUoKSk7CisJICByZXR1cm4gc3RkOjpzcXJ0KHRoaXMtPl9NX2dkKF9fcGcsIF9fdXJuZykpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZShfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gTmFrYWdhbWkgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAgICAgKiAgICAgICAgdGhlIHNhbWUgcGFyYW1ldGVycyBhbmQgdGhlIHNlcXVlbmNlcyB0aGF0IHdvdWxkCisgICAgICAgKiAgICAgICAgYmUgZ2VuZXJhdGVkIGFyZSBlcXVhbC4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgbmFrYWdhbWlfZGlzdHJpYnV0aW9uJiBfX2QxLAorCQkgY29uc3QgbmFrYWdhbWlfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gKF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbQorCQkmJiBfX2QxLl9NX2dkID09IF9fZDIuX01fZ2QpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgYSAlbmFrYWdhbWlfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVuYWthZ2FtaV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgY29uc3QgbmFrYWdhbWlfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+Jik7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEV4dHJhY3RzIGEgJW5ha2FnYW1pX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggQSAlbmFrYWdhbWlfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgbmFrYWdhbWlfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+Jik7CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkJY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKworICAgICAgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9NX2dkOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gTmFrYWdhbWkgZGlzdHJpYnV0aW9ucyBhcmUgbm90IGVxdWFsLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBuYWthZ2FtaV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3QgbmFrYWdhbWlfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKworICAvKioKKyAgICogQGJyaWVmIEEgUGFyZXRvIGNvbnRpbnVvdXMgZGlzdHJpYnV0aW9uIGZvciByYW5kb20gbnVtYmVycy4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBQYXJldG8gY3VtdWxhdGl2ZSBwcm9iYWJpbGl0eSBmdW5jdGlvbiBpcworICAgKiBAZlsKKyAgICogICAgIFAoeHxcYWxwaGEsXG11KSA9IDEgLSBcbGVmdChcZnJhY3tcbXV9e3h9XHJpZ2h0KV5cYWxwaGEKKyAgICogQGZdCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgUGFyZXRvIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gaXMKKyAgICogQGZbCisgICAqICAgICBwKHh8XGFscGhhLFxtdSkgPSBcZnJhY3tcYWxwaGEgKyAxfXtcbXV9CisgICAqICAgICAgICAgICAgICAgICAgICAgICBcbGVmdChcZnJhY3tcbXV9e3h9XHJpZ2h0KV57XGFscGhhICsgMX0KKyAgICogQGZdCisgICAqIHdoZXJlIEBmJHggPj0gXG11QGYkIGFuZCBAZiRcbXUgPiAwQGYkLCBAZiRcYWxwaGEgPiAwQGYkLgorICAgKgorICAgKiA8dGFibGUgYm9yZGVyPTEgY2VsbHBhZGRpbmc9MTAgY2VsbHNwYWNpbmc9MD4KKyAgICogPGNhcHRpb24gYWxpZ249dG9wPkRpc3RyaWJ1dGlvbiBTdGF0aXN0aWNzPC9jYXB0aW9uPgorICAgKiA8dHI+PHRkPk1lYW48L3RkPjx0ZD5AZiRcYWxwaGEgXG11IC8gKFxhbHBoYSAtIDEpQGYkCisgICAqICAgICAgICAgICAgICBmb3IgQGYkXGFscGhhID4gMUBmJDwvdGQ+PC90cj4KKyAgICogPHRyPjx0ZD5WYXJpYW5jZTwvdGQ+PHRkPkBmJFxhbHBoYSBcbXVeMiAvIFsoXGFscGhhIC0gMSleMihcYWxwaGEgLSAyKV1AZiQKKyAgICogICAgICAgICAgICAgIGZvciBAZiRcYWxwaGEgPiAyQGYkPC90ZD48L3RyPgorICAgKiA8dHI+PHRkPlJhbmdlPC90ZD48dGQ+QGYkW1xtdSwgXGluZnR5KUBmJDwvdGQ+PC90cj4KKyAgICogPC90YWJsZT4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcworICAgIHBhcmV0b19kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgcGFyZXRvX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisKKwlwYXJhbV90eXBlKHJlc3VsdF90eXBlIF9fYWxwaGFfdmFsID0gcmVzdWx0X3R5cGUoMSksCisJCSAgIHJlc3VsdF90eXBlIF9fbXVfdmFsID0gcmVzdWx0X3R5cGUoMSkpCisJOiBfTV9hbHBoYShfX2FscGhhX3ZhbCksIF9NX211KF9fbXVfdmFsKQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9hbHBoYSA+IHJlc3VsdF90eXBlKDApKTsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9tdSA+IHJlc3VsdF90eXBlKDApKTsKKwl9CisKKwlyZXN1bHRfdHlwZQorCWFscGhhKCkgY29uc3QKKwl7IHJldHVybiBfTV9hbHBoYTsgfQorCisJcmVzdWx0X3R5cGUKKwltdSgpIGNvbnN0CisJeyByZXR1cm4gX01fbXU7IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fYWxwaGEgPT0gX19wMi5fTV9hbHBoYSAmJiBfX3AxLl9NX211ID09IF9fcDIuX01fbXU7IH0KKworICAgICAgcHJpdmF0ZToKKwl2b2lkIF9NX2luaXRpYWxpemUoKTsKKworCXJlc3VsdF90eXBlIF9NX2FscGhhOworCXJlc3VsdF90eXBlIF9NX211OworICAgICAgfTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0b3JzLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgcGFyZXRvX2Rpc3RyaWJ1dGlvbihyZXN1bHRfdHlwZSBfX2FscGhhX3ZhbCA9IHJlc3VsdF90eXBlKDEpLAorCQkJICByZXN1bHRfdHlwZSBfX211X3ZhbCA9IHJlc3VsdF90eXBlKDEpKQorICAgICAgOiBfTV9wYXJhbShfX2FscGhhX3ZhbCwgX19tdV92YWwpLAorCV9NX3VkKCkKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgcGFyZXRvX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCksCisJX01fdWQoKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpCisgICAgICB7CisJX01fdWQucmVzZXQoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBhbHBoYSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5hbHBoYSgpOyB9CisKKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtdSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5tdSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPm11KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsKKwkgIHJldHVybiB0aGlzLT5tdSgpICogc3RkOjpwb3codGhpcy0+X01fdWQoX191cm5nKSwKKwkJCQkgICAgICAgLXJlc3VsdF90eXBlKDEpIC8gdGhpcy0+YWxwaGEoKSk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsKKwkgIHJldHVybiBfX3AubXUoKSAqIHN0ZDo6cG93KHRoaXMtPl9NX3VkKF9fdXJuZyksCisJCQkJCSAgIC1yZXN1bHRfdHlwZSgxKSAvIF9fcC5hbHBoYSgpKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHRoaXMtPl9fZ2VuZXJhdGUoX19mLCBfX3QsIF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIFBhcmV0byBkaXN0cmlidXRpb25zIGhhdmUKKyAgICAgICAqICAgICAgICB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFuZCB0aGUgc2VxdWVuY2VzIHRoYXQgd291bGQKKyAgICAgICAqICAgICAgICBiZSBnZW5lcmF0ZWQgYXJlIGVxdWFsLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBwYXJldG9fZGlzdHJpYnV0aW9uJiBfX2QxLAorCQkgY29uc3QgcGFyZXRvX2Rpc3RyaWJ1dGlvbiYgX19kMikKKyAgICAgIHsgcmV0dXJuIChfX2QxLl9NX3BhcmFtID09IF9fZDIuX01fcGFyYW0KKwkJJiYgX19kMS5fTV91ZCA9PSBfX2QyLl9NX3VkKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIGEgJXBhcmV0b19kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJXBhcmV0b19kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgY29uc3QgcGFyZXRvX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyBhICVwYXJldG9fZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCBBICVwYXJldG9fZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgcGFyZXRvX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlX2ltcGwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJCWNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisKKyAgICAgIHN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gX01fdWQ7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBQYXJldG8gZGlzdHJpYnV0aW9ucyBhcmUgbm90IGVxdWFsLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBwYXJldG9fZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHBhcmV0b19kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBLIGNvbnRpbnVvdXMgZGlzdHJpYnV0aW9uIGZvciByYW5kb20gbnVtYmVycy4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBLIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gaXMKKyAgICogQGZbCisgICAqICAgICBwKHh8XGxhbWJkYSwgXG11LCBcbnUpID0gXGZyYWN7Mn17eH0KKyAgICogICAgICAgICAgICAgXGxlZnQoXGZyYWN7XGxhbWJkYVxudSB4fXtcbXV9XHJpZ2h0KV57XGZyYWN7XGxhbWJkYSArIFxudX17Mn19CisgICAqICAgICAgICAgICAgIFxmcmFjezF9e1xHYW1tYShcbGFtYmRhKVxHYW1tYShcbnUpfQorICAgKiAgICAgICAgICAgICBLX3tcbnUgLSBcbGFtYmRhfVxsZWZ0KDJcc3FydHtcZnJhY3tcbGFtYmRhXG51IHh9e1xtdX19XHJpZ2h0KQorICAgKiBAZl0KKyAgICogd2hlcmUgQGYkSV8wKHopQGYkIGlzIHRoZSBtb2RpZmllZCBCZXNzZWwgZnVuY3Rpb24gb2YgdGhlIHNlY29uZCBraW5kCisgICAqIG9mIG9yZGVyIEBmJFxudSAtIFxsYW1iZGFAZiQgYW5kIEBmJFxsYW1iZGEgPiAwQGYkLCBAZiRcbXUgPiAwQGYkCisgICAqIGFuZCBAZiRcbnUgPiAwQGYkLgorICAgKgorICAgKiA8dGFibGUgYm9yZGVyPTEgY2VsbHBhZGRpbmc9MTAgY2VsbHNwYWNpbmc9MD4KKyAgICogPGNhcHRpb24gYWxpZ249dG9wPkRpc3RyaWJ1dGlvbiBTdGF0aXN0aWNzPC9jYXB0aW9uPgorICAgKiA8dHI+PHRkPk1lYW48L3RkPjx0ZD5AZiRcbXVAZiQ8L3RkPjwvdHI+CisgICAqIDx0cj48dGQ+VmFyaWFuY2U8L3RkPjx0ZD5AZiRcbXVeMlxmcmFje1xsYW1iZGEgKyBcbnUgKyAxfXtcbGFtYmRhXG51fUBmJDwvdGQ+PC90cj4KKyAgICogPHRyPjx0ZD5SYW5nZTwvdGQ+PHRkPkBmJFswLCBcaW5mdHkpQGYkPC90ZD48L3RyPgorICAgKiA8L3RhYmxlPgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzCisgICAga19kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYga19kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCisJcGFyYW1fdHlwZShyZXN1bHRfdHlwZSBfX2xhbWJkYV92YWwgPSByZXN1bHRfdHlwZSgxKSwKKwkJICAgcmVzdWx0X3R5cGUgX19tdV92YWwgPSByZXN1bHRfdHlwZSgxKSwKKwkJICAgcmVzdWx0X3R5cGUgX19udV92YWwgPSByZXN1bHRfdHlwZSgxKSkKKwk6IF9NX2xhbWJkYShfX2xhbWJkYV92YWwpLCBfTV9tdShfX211X3ZhbCksIF9NX251KF9fbnVfdmFsKQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9sYW1iZGEgPiByZXN1bHRfdHlwZSgwKSk7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fbXUgPiByZXN1bHRfdHlwZSgwKSk7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fbnUgPiByZXN1bHRfdHlwZSgwKSk7CisJfQorCisJcmVzdWx0X3R5cGUKKwlsYW1iZGEoKSBjb25zdAorCXsgcmV0dXJuIF9NX2xhbWJkYTsgfQorCisJcmVzdWx0X3R5cGUKKwltdSgpIGNvbnN0CisJeyByZXR1cm4gX01fbXU7IH0KKworCXJlc3VsdF90eXBlCisJbnUoKSBjb25zdAorCXsgcmV0dXJuIF9NX251OyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiBfX3AxLl9NX2xhbWJkYSA9PSBfX3AyLl9NX2xhbWJkYQorCSAgICAgICYmIF9fcDEuX01fbXUgPT0gX19wMi5fTV9tdQorCSAgICAgICYmIF9fcDEuX01fbnUgPT0gX19wMi5fTV9udTsgfQorCisgICAgICBwcml2YXRlOgorCXZvaWQgX01faW5pdGlhbGl6ZSgpOworCisJcmVzdWx0X3R5cGUgX01fbGFtYmRhOworCXJlc3VsdF90eXBlIF9NX211OworCXJlc3VsdF90eXBlIF9NX251OworICAgICAgfTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0b3JzLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAga19kaXN0cmlidXRpb24ocmVzdWx0X3R5cGUgX19sYW1iZGFfdmFsID0gcmVzdWx0X3R5cGUoMSksCisJCSAgICAgcmVzdWx0X3R5cGUgX19tdV92YWwgPSByZXN1bHRfdHlwZSgxKSwKKwkJICAgICByZXN1bHRfdHlwZSBfX251X3ZhbCA9IHJlc3VsdF90eXBlKDEpKQorICAgICAgOiBfTV9wYXJhbShfX2xhbWJkYV92YWwsIF9fbXVfdmFsLCBfX251X3ZhbCksCisJX01fZ2QxKF9fbGFtYmRhX3ZhbCwgcmVzdWx0X3R5cGUoMSkgLyBfX2xhbWJkYV92YWwpLAorCV9NX2dkMihfX251X3ZhbCwgX19tdV92YWwgLyBfX251X3ZhbCkKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAga19kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApLAorCV9NX2dkMShfX3AubGFtYmRhKCksIHJlc3VsdF90eXBlKDEpIC8gX19wLmxhbWJkYSgpKSwKKwlfTV9nZDIoX19wLm51KCksIF9fcC5tdSgpIC8gX19wLm51KCkpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsKKwlfTV9nZDEucmVzZXQoKTsKKwlfTV9nZDIucmVzZXQoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBsYW1iZGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0ubGFtYmRhKCk7IH0KKworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG11KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLm11KCk7IH0KKworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG51KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLm51KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gcmVzdWx0X3R5cGUoMCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImLCBjb25zdCBwYXJhbV90eXBlJik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHRoaXMtPl9fZ2VuZXJhdGUoX19mLCBfX3QsIF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIEsgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAgICAgKiAgICAgICAgdGhlIHNhbWUgcGFyYW1ldGVycyBhbmQgdGhlIHNlcXVlbmNlcyB0aGF0IHdvdWxkCisgICAgICAgKiAgICAgICAgYmUgZ2VuZXJhdGVkIGFyZSBlcXVhbC4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3Qga19kaXN0cmlidXRpb24mIF9fZDEsCisJCSBjb25zdCBrX2Rpc3RyaWJ1dGlvbiYgX19kMikKKyAgICAgIHsgcmV0dXJuIChfX2QxLl9NX3BhcmFtID09IF9fZDIuX01fcGFyYW0KKwkJJiYgX19kMS5fTV9nZDEgPT0gX19kMi5fTV9nZDEKKwkJJiYgX19kMS5fTV9nZDIgPT0gX19kMi5fTV9nZDIpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgYSAla19kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWtfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJCSAgIGNvbnN0IGtfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+Jik7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEV4dHJhY3RzIGEgJWtfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCBBICVrX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgICAgIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJCSAgIGtfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+Jik7CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkJY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKworICAgICAgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9NX2dkMTsKKyAgICAgIHN0ZDo6Z2FtbWFfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBfTV9nZDI7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBLIGRpc3RyaWJ1dGlvbnMgYXJlIG5vdCBlcXVhbC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qga19kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qga19kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworCisgIC8qKgorICAgKiBAYnJpZWYgQW4gYXJjc2luZSBjb250aW51b3VzIGRpc3RyaWJ1dGlvbiBmb3IgcmFuZG9tIG51bWJlcnMuCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgYXJjc2luZSBwcm9iYWJpbGl0eSBkZW5zaXR5IGZ1bmN0aW9uIGlzCisgICAqIEBmWworICAgKiAgICAgcCh4fGEsYikgPSBcZnJhY3sxfXtccGkgXHNxcnR7KHggLSBhKShiIC0geCl9fQorICAgKiBAZl0KKyAgICogd2hlcmUgQGYkeCA+PSBhQGYkIGFuZCBAZiR4IDw9IGJAZiQuCisgICAqCisgICAqIDx0YWJsZSBib3JkZXI9MSBjZWxscGFkZGluZz0xMCBjZWxsc3BhY2luZz0wPgorICAgKiA8Y2FwdGlvbiBhbGlnbj10b3A+RGlzdHJpYnV0aW9uIFN0YXRpc3RpY3M8L2NhcHRpb24+CisgICAqIDx0cj48dGQ+TWVhbjwvdGQ+PHRkPkBmJCAoYSArIGIpIC8gMiBAZiQ8L3RkPjwvdHI+CisgICAqIDx0cj48dGQ+VmFyaWFuY2U8L3RkPjx0ZD5AZiQgKGIgLSBhKV4yIC8gOCBAZiQ8L3RkPjwvdHI+CisgICAqIDx0cj48dGQ+UmFuZ2U8L3RkPjx0ZD5AZiRbYSwgYl1AZiQ8L3RkPjwvdHI+CisgICAqIDwvdGFibGU+CisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MKKyAgICBhcmNzaW5lX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19mbG9hdGluZ19wb2ludDxfUmVhbFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYSBmbG9hdGluZyBwb2ludCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBhcmNzaW5lX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisKKwlwYXJhbV90eXBlKHJlc3VsdF90eXBlIF9fYSA9IHJlc3VsdF90eXBlKDApLAorCQkgICByZXN1bHRfdHlwZSBfX2IgPSByZXN1bHRfdHlwZSgxKSkKKwk6IF9NX2EoX19hKSwgX01fYihfX2IpCisJeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX2EgPD0gX01fYik7CisJfQorCisJcmVzdWx0X3R5cGUKKwlhKCkgY29uc3QKKwl7IHJldHVybiBfTV9hOyB9CisKKwlyZXN1bHRfdHlwZQorCWIoKSBjb25zdAorCXsgcmV0dXJuIF9NX2I7IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fYSA9PSBfX3AyLl9NX2EgJiYgX19wMS5fTV9iID09IF9fcDIuX01fYjsgfQorCisgICAgICBwcml2YXRlOgorCXZvaWQgX01faW5pdGlhbGl6ZSgpOworCisJcmVzdWx0X3R5cGUgX01fYTsKKwlyZXN1bHRfdHlwZSBfTV9iOworICAgICAgfTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0b3JzLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgYXJjc2luZV9kaXN0cmlidXRpb24ocmVzdWx0X3R5cGUgX19hID0gcmVzdWx0X3R5cGUoMCksCisJCQkgICByZXN1bHRfdHlwZSBfX2IgPSByZXN1bHRfdHlwZSgxKSkKKyAgICAgIDogX01fcGFyYW0oX19hLCBfX2IpLAorCV9NX3VkKC0xLjU3MDc5NjMyNjc5NDg5NjYxOTIzMTMyMTY5MTYzOTc1MTRMLAorCSAgICAgICsxLjU3MDc5NjMyNjc5NDg5NjYxOTIzMTMyMTY5MTYzOTc1MTRMKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBhcmNzaW5lX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCksCisJX01fdWQoLTEuNTcwNzk2MzI2Nzk0ODk2NjE5MjMxMzIxNjkxNjM5NzUxNEwsCisJICAgICAgKzEuNTcwNzk2MzI2Nzk0ODk2NjE5MjMxMzIxNjkxNjM5NzUxNEwpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgX01fdWQucmVzZXQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0uYSgpOyB9CisKKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBiKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmIoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5hKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5iKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsKKwkgIHJlc3VsdF90eXBlIF9feCA9IHN0ZDo6c2luKHRoaXMtPl9NX3VkKF9fdXJuZykpOworCSAgcmV0dXJuIChfX3ggKiAodGhpcy0+YigpIC0gdGhpcy0+YSgpKQorCQkgICsgdGhpcy0+YSgpICsgdGhpcy0+YigpKSAvIHJlc3VsdF90eXBlKDIpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7CisJICByZXN1bHRfdHlwZSBfX3ggPSBzdGQ6OnNpbih0aGlzLT5fTV91ZChfX3VybmcpKTsKKwkgIHJldHVybiAoX194ICogKF9fcC5iKCkgLSBfX3AuYSgpKQorCQkgICsgX19wLmEoKSArIF9fcC5iKCkpIC8gcmVzdWx0X3R5cGUoMik7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyB0aGlzLT5fX2dlbmVyYXRlKF9fZiwgX190LCBfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKHJlc3VsdF90eXBlKiBfX2YsIHJlc3VsdF90eXBlKiBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBhcmNzaW5lIGRpc3RyaWJ1dGlvbnMgaGF2ZQorICAgICAgICogICAgICAgIHRoZSBzYW1lIHBhcmFtZXRlcnMgYW5kIHRoZSBzZXF1ZW5jZXMgdGhhdCB3b3VsZAorICAgICAgICogICAgICAgIGJlIGdlbmVyYXRlZCBhcmUgZXF1YWwuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGFyY3NpbmVfZGlzdHJpYnV0aW9uJiBfX2QxLAorCQkgY29uc3QgYXJjc2luZV9kaXN0cmlidXRpb24mIF9fZDIpCisgICAgICB7IHJldHVybiAoX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtCisJCSYmIF9fZDEuX01fdWQgPT0gX19kMi5fTV91ZCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVhcmNzaW5lX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlYXJjc2luZV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgY29uc3QgYXJjc2luZV9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlYXJjc2luZV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194IEEgJWFyY3NpbmVfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgYXJjc2luZV9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mKTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworCisgICAgICBzdGQ6OnVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9NX3VkOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gYXJjc2luZSBkaXN0cmlidXRpb25zIGFyZSBub3QgZXF1YWwuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGFyY3NpbmVfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IGFyY3NpbmVfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKworICAvKioKKyAgICogQGJyaWVmIEEgSG95dCBjb250aW51b3VzIGRpc3RyaWJ1dGlvbiBmb3IgcmFuZG9tIG51bWJlcnMuCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgSG95dCBwcm9iYWJpbGl0eSBkZW5zaXR5IGZ1bmN0aW9uIGlzCisgICAqIEBmWworICAgKiAgICAgcCh4fHEsXG9tZWdhKSA9IFxmcmFjeygxICsgcV4yKXh9e3Fcb21lZ2F9CisgICAqICAgICAgICAgICAgICAgICAgICAgXGV4cFxsZWZ0KC1cZnJhY3soMSArIHFeMileMiB4XjJ9ezQgcV4yIFxvbWVnYX1ccmlnaHQpCisgICAqICAgICAgICAgICAgICAgICAgICAgICBJXzBcbGVmdChcZnJhY3soMSAtIHFeNCkgeF4yfXs0IHFeMiBcb21lZ2F9XHJpZ2h0KQorICAgKiBAZl0KKyAgICogd2hlcmUgQGYkSV8wKHopQGYkIGlzIHRoZSBtb2RpZmllZCBCZXNzZWwgZnVuY3Rpb24gb2YgdGhlIGZpcnN0IGtpbmQKKyAgICogb2Ygb3JkZXIgMCBhbmQgQGYkMCA8IHEgPCAxQGYkLgorICAgKgorICAgKiA8dGFibGUgYm9yZGVyPTEgY2VsbHBhZGRpbmc9MTAgY2VsbHNwYWNpbmc9MD4KKyAgICogPGNhcHRpb24gYWxpZ249dG9wPkRpc3RyaWJ1dGlvbiBTdGF0aXN0aWNzPC9jYXB0aW9uPgorICAgKiA8dHI+PHRkPk1lYW48L3RkPjx0ZD5AZiQgXHNxcnR7XGZyYWN7Mn17XHBpfX0gXHNxcnR7XGZyYWN7XG9tZWdhfXsxICsgcV4yfX0KKyAgICogICAgICAgICAgICAgICAgICAgICAgIEUoMSAtIHFeMikgQGYkPC90ZD48L3RyPgorICAgKiA8dHI+PHRkPlZhcmlhbmNlPC90ZD48dGQ+QGYkIFxvbWVnYSBcbGVmdCgxIC0gXGZyYWN7MkVeMigxIC0gcV4yKX0KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtccGkgKDEgKyBxXjIpfVxyaWdodCkgQGYkPC90ZD48L3RyPgorICAgKiA8dHI+PHRkPlJhbmdlPC90ZD48dGQ+QGYkWzAsIFxpbmZ0eSlAZiQ8L3RkPjwvdHI+CisgICAqIDwvdGFibGU+CisgICAqIHdoZXJlIEBmJEUoeClAZiQgaXMgdGhlIGVsbGlwdGljIGZ1bmN0aW9uIG9mIHRoZSBzZWNvbmQga2luZC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcworICAgIGhveXRfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIGhveXRfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKworCXBhcmFtX3R5cGUocmVzdWx0X3R5cGUgX19xID0gcmVzdWx0X3R5cGUoMC41TCksCisJCSAgIHJlc3VsdF90eXBlIF9fb21lZ2EgPSByZXN1bHRfdHlwZSgxKSkKKwk6IF9NX3EoX19xKSwgX01fb21lZ2EoX19vbWVnYSkKKwl7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fcSA+IHJlc3VsdF90eXBlKDApKTsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9xIDwgcmVzdWx0X3R5cGUoMSkpOworCX0KKworCXJlc3VsdF90eXBlCisJcSgpIGNvbnN0CisJeyByZXR1cm4gX01fcTsgfQorCisJcmVzdWx0X3R5cGUKKwlvbWVnYSgpIGNvbnN0CisJeyByZXR1cm4gX01fb21lZ2E7IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fcSA9PSBfX3AyLl9NX3EKKwkgICAgICAmJiBfX3AxLl9NX29tZWdhID09IF9fcDIuX01fb21lZ2E7IH0KKworICAgICAgcHJpdmF0ZToKKwl2b2lkIF9NX2luaXRpYWxpemUoKTsKKworCXJlc3VsdF90eXBlIF9NX3E7CisJcmVzdWx0X3R5cGUgX01fb21lZ2E7CisgICAgICB9OworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RvcnMuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBob3l0X2Rpc3RyaWJ1dGlvbihyZXN1bHRfdHlwZSBfX3EgPSByZXN1bHRfdHlwZSgwLjVMKSwKKwkJCXJlc3VsdF90eXBlIF9fb21lZ2EgPSByZXN1bHRfdHlwZSgxKSkKKyAgICAgIDogX01fcGFyYW0oX19xLCBfX29tZWdhKSwKKwlfTV9hZChyZXN1bHRfdHlwZSgwLjVMKSAqIChyZXN1bHRfdHlwZSgxKSArIF9fcSAqIF9fcSksCisJICAgICAgcmVzdWx0X3R5cGUoMC41TCkgKiAocmVzdWx0X3R5cGUoMSkgKyBfX3EgKiBfX3EpCisJCQkJLyAoX19xICogX19xKSksCisJX01fZWQocmVzdWx0X3R5cGUoMSkpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGhveXRfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKSwKKwlfTV9hZChyZXN1bHRfdHlwZSgwLjVMKSAqIChyZXN1bHRfdHlwZSgxKSArIF9fcC5xKCkgKiBfX3AucSgpKSwKKwkgICAgICByZXN1bHRfdHlwZSgwLjVMKSAqIChyZXN1bHRfdHlwZSgxKSArIF9fcC5xKCkgKiBfX3AucSgpKQorCQkJCS8gKF9fcC5xKCkgKiBfX3AucSgpKSksCisJX01fZWQocmVzdWx0X3R5cGUoMSkpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsKKwlfTV9hZC5yZXNldCgpOworCV9NX2VkLnJlc2V0KCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0aGUgcGFyYW1ldGVycyBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgcSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5xKCk7IH0KKworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG9tZWdhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLm9tZWdhKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gcmVzdWx0X3R5cGUoMCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHRoaXMtPl9fZ2VuZXJhdGUoX19mLCBfX3QsIF9fdXJuZywgX01fcGFyYW0pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUocmVzdWx0X3R5cGUqIF9fZiwgcmVzdWx0X3R5cGUqIF9fdCwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsgdGhpcy0+X19nZW5lcmF0ZV9pbXBsKF9fZiwgX190LCBfX3VybmcsIF9fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIEhveXQgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAgICAgKiAgICAgICAgdGhlIHNhbWUgcGFyYW1ldGVycyBhbmQgdGhlIHNlcXVlbmNlcyB0aGF0IHdvdWxkCisgICAgICAgKiAgICAgICAgYmUgZ2VuZXJhdGVkIGFyZSBlcXVhbC4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgaG95dF9kaXN0cmlidXRpb24mIF9fZDEsCisJCSBjb25zdCBob3l0X2Rpc3RyaWJ1dGlvbiYgX19kMikKKyAgICAgIHsgcmV0dXJuIChfX2QxLl9NX3BhcmFtID09IF9fZDIuX01fcGFyYW0KKwkJJiYgX19kMS5fTV9hZCA9PSBfX2QyLl9NX2FkCisJCSYmIF9fZDEuX01fZWQgPT0gX19kMi5fTV9lZCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVob3l0X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlaG95dF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgY29uc3QgaG95dF9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlaG95dF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194IEEgJWhveXRfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgaG95dF9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mKTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworCisgICAgICBfX2dudV9jeHg6OmFyY3NpbmVfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBfTV9hZDsKKyAgICAgIHN0ZDo6ZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBfTV9lZDsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIEhveXQgZGlzdHJpYnV0aW9ucyBhcmUgbm90IGVxdWFsLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBob3l0X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QxLAorCSAgICAgICBjb25zdCBob3l0X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisKKyAgLyoqCisgICAqIEBicmllZiBBIHRyaWFuZ3VsYXIgZGlzdHJpYnV0aW9uIGZvciByYW5kb20gbnVtYmVycy4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSB0cmlhbmd1bGFyIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gaXMKKyAgICogQGZbCisgICAqICAgICAgICAgICAgICAgICAgLyAwICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgeCA8IGEKKyAgICogICAgIHAoeHxhLGIsYykgPSB8IFxmcmFjezIoeC1hKX17KGMtYSkoYi1hKX0gIGZvciBhIDw9IHggPD0gYgorICAgKiAgICAgICAgICAgICAgICAgIHwgXGZyYWN7MihjLXgpfXsoYy1hKShjLWIpfSAgZm9yIGIgPCB4IDw9IGMKKyAgICogICAgICAgICAgICAgICAgICBcIDAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjIDwgeAorICAgKiBAZl0KKyAgICoKKyAgICogPHRhYmxlIGJvcmRlcj0xIGNlbGxwYWRkaW5nPTEwIGNlbGxzcGFjaW5nPTA+CisgICAqIDxjYXB0aW9uIGFsaWduPXRvcD5EaXN0cmlidXRpb24gU3RhdGlzdGljczwvY2FwdGlvbj4KKyAgICogPHRyPjx0ZD5NZWFuPC90ZD48dGQ+QGYkIFxmcmFje2ErYitjfXsyfSBAZiQ8L3RkPjwvdHI+CisgICAqIDx0cj48dGQ+VmFyaWFuY2U8L3RkPjx0ZD5AZiQgXGZyYWN7YV4yK2JeMitjXjItYWItYWMtYmN9CisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTh9QGYkPC90ZD48L3RyPgorICAgKiA8dHI+PHRkPlJhbmdlPC90ZD48dGQ+QGYkW2EsIGNdQGYkPC90ZD48L3RyPgorICAgKiA8L3RhYmxlPgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIHRyaWFuZ3VsYXJfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwlmcmllbmQgY2xhc3MgdHJpYW5ndWxhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPjsKKworCWV4cGxpY2l0CisJcGFyYW1fdHlwZShfUmVhbFR5cGUgX19hID0gX1JlYWxUeXBlKDApLAorCQkgICBfUmVhbFR5cGUgX19iID0gX1JlYWxUeXBlKDAuNSksCisJCSAgIF9SZWFsVHlwZSBfX2MgPSBfUmVhbFR5cGUoMSkpCisJOiBfTV9hKF9fYSksIF9NX2IoX19iKSwgX01fYyhfX2MpCisJeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX2EgPD0gX01fYik7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fYiA8PSBfTV9jKTsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9hIDwgX01fYyk7CisKKwkgIF9NX3JfYWIgPSAoX01fYiAtIF9NX2EpIC8gKF9NX2MgLSBfTV9hKTsKKwkgIF9NX2ZfYWJfYWMgPSAoX01fYiAtIF9NX2EpICogKF9NX2MgLSBfTV9hKTsKKwkgIF9NX2ZfYmNfYWMgPSAoX01fYyAtIF9NX2IpICogKF9NX2MgLSBfTV9hKTsKKwl9CisKKwlfUmVhbFR5cGUKKwlhKCkgY29uc3QKKwl7IHJldHVybiBfTV9hOyB9CisKKwlfUmVhbFR5cGUKKwliKCkgY29uc3QKKwl7IHJldHVybiBfTV9iOyB9CisKKwlfUmVhbFR5cGUKKwljKCkgY29uc3QKKwl7IHJldHVybiBfTV9jOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiAoX19wMS5fTV9hID09IF9fcDIuX01fYSAmJiBfX3AxLl9NX2IgPT0gX19wMi5fTV9iCisJCSAgJiYgX19wMS5fTV9jID09IF9fcDIuX01fYyk7IH0KKworICAgICAgcHJpdmF0ZToKKworCV9SZWFsVHlwZSBfTV9hOworCV9SZWFsVHlwZSBfTV9iOworCV9SZWFsVHlwZSBfTV9jOworCV9SZWFsVHlwZSBfTV9yX2FiOworCV9SZWFsVHlwZSBfTV9mX2FiX2FjOworCV9SZWFsVHlwZSBfTV9mX2JjX2FjOworICAgICAgfTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhIHRyaWFuZ2xlIGRpc3RyaWJ1dGlvbiB3aXRoIHBhcmFtZXRlcnMKKyAgICAgICAqIEBmJCBhIEBmJCwgQGYkIGIgQGYkIGFuZCBAZiQgYyBAZiQuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICB0cmlhbmd1bGFyX2Rpc3RyaWJ1dGlvbihyZXN1bHRfdHlwZSBfX2EgPSByZXN1bHRfdHlwZSgwKSwKKwkJCSAgICAgIHJlc3VsdF90eXBlIF9fYiA9IHJlc3VsdF90eXBlKDAuNSksCisJCQkgICAgICByZXN1bHRfdHlwZSBfX2MgPSByZXN1bHRfdHlwZSgxKSkKKyAgICAgIDogX01fcGFyYW0oX19hLCBfX2IsIF9fYykKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgdHJpYW5ndWxhcl9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBAZiQgYSBAZiQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0uYSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIEBmJCBiIEBmJCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgYigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5iKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgQGYkIGMgQGYkIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBjKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmMoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5fTV9hOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0uX01fYzsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsKKwkgIHN0ZDo6X19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCByZXN1bHRfdHlwZT4KKwkgICAgX19hdXJuZyhfX3VybmcpOworCSAgcmVzdWx0X3R5cGUgX19ybmQgPSBfX2F1cm5nKCk7CisJICBpZiAoX19ybmQgPD0gX19wLl9NX3JfYWIpCisJICAgIHJldHVybiBfX3AuYSgpICsgc3RkOjpzcXJ0KF9fcm5kICogX19wLl9NX2ZfYWJfYWMpOworCSAgZWxzZQorCSAgICByZXR1cm4gX19wLmMoKSAtIHN0ZDo6c3FydCgocmVzdWx0X3R5cGUoMSkgLSBfX3JuZCkKKwkJCQkgICAgICAgKiBfX3AuX01fZl9iY19hYyk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyB0aGlzLT5fX2dlbmVyYXRlKF9fZiwgX190LCBfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXZvaWQKKwlfX2dlbmVyYXRlKHJlc3VsdF90eXBlKiBfX2YsIHJlc3VsdF90eXBlKiBfX3QsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7IHRoaXMtPl9fZ2VuZXJhdGVfaW1wbChfX2YsIF9fdCwgX191cm5nLCBfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byB0cmlhbmdsZSBkaXN0cmlidXRpb25zIGhhdmUgdGhlIHNhbWUKKyAgICAgICAqICAgICAgICBwYXJhbWV0ZXJzIGFuZCB0aGUgc2VxdWVuY2VzIHRoYXQgd291bGQgYmUgZ2VuZXJhdGVkCisgICAgICAgKiAgICAgICAgYXJlIGVxdWFsLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCB0cmlhbmd1bGFyX2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkJIGNvbnN0IHRyaWFuZ3VsYXJfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgYSAldHJpYW5ndWxhcl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJXRyaWFuZ3VsYXJfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3QgX19nbnVfY3h4Ojp0cmlhbmd1bGFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAldHJpYW5ndWxhcl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICV0cmlhbmd1bGFyX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgX19nbnVfY3h4Ojp0cmlhbmd1bGFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gdHJpYW5nbGUgZGlzdHJpYnV0aW9ucyBhcmUgZGlmZmVyZW50LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfX2dudV9jeHg6OnRyaWFuZ3VsYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IF9fZ251X2N4eDo6dHJpYW5ndWxhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMikKKyAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisKKyAgLyoqCisgICAqIEBicmllZiBBIHZvbiBNaXNlcyBkaXN0cmlidXRpb24gZm9yIHJhbmRvbSBudW1iZXJzLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIHZvbiBNaXNlcyBwcm9iYWJpbGl0eSBkZW5zaXR5IGZ1bmN0aW9uIGlzCisgICAqIEBmWworICAgKiAgICAgcCh4fFxtdSxca2FwcGEpID0gXGZyYWN7ZV57XGthcHBhIFxjb3MoeC1cbXUpfX0KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgezJccGkgSV8wKFxrYXBwYSl9CisgICAqIEBmXQorICAgKgorICAgKiBUaGUgZ2VuZXJhdGluZyBmdW5jdGlvbnMgdXNlIHRoZSBtZXRob2QgYWNjb3JkaW5nIHRvOgorICAgKgorICAgKiBELiBKLiBCZXN0IGFuZCBOLiBJLiBGaXNoZXIsIDE5NzkuICJFZmZpY2llbnQgU2ltdWxhdGlvbiBvZiB0aGUKKyAgICogdm9uIE1pc2VzIERpc3RyaWJ1dGlvbiIsIEpvdXJuYWwgb2YgdGhlIFJveWFsIFN0YXRpc3RpY2FsIFNvY2lldHkuCisgICAqIFNlcmllcyBDIChBcHBsaWVkIFN0YXRpc3RpY3MpLCBWb2wuIDI4LCBOby4gMiwgcHAuIDE1Mi0xNTcuCisgICAqCisgICAqIDx0YWJsZSBib3JkZXI9MSBjZWxscGFkZGluZz0xMCBjZWxsc3BhY2luZz0wPgorICAgKiA8Y2FwdGlvbiBhbGlnbj10b3A+RGlzdHJpYnV0aW9uIFN0YXRpc3RpY3M8L2NhcHRpb24+CisgICAqIDx0cj48dGQ+TWVhbjwvdGQ+PHRkPkBmJCBcbXUgQGYkPC90ZD48L3RyPgorICAgKiA8dHI+PHRkPlZhcmlhbmNlPC90ZD48dGQ+QGYkIDEtSV8xKFxrYXBwYSkvSV8wKFxrYXBwYSkgQGYkPC90ZD48L3RyPgorICAgKiA8dHI+PHRkPlJhbmdlPC90ZD48dGQ+QGYkWy1ccGksIFxwaV1AZiQ8L3RkPjwvdHI+CisgICAqIDwvdGFibGU+CisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3Mgdm9uX21pc2VzX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19mbG9hdGluZ19wb2ludDxfUmVhbFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYSBmbG9hdGluZyBwb2ludCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJZnJpZW5kIGNsYXNzIHZvbl9taXNlc19kaXN0cmlidXRpb248X1JlYWxUeXBlPjsKKworCWV4cGxpY2l0CisJcGFyYW1fdHlwZShfUmVhbFR5cGUgX19tdSA9IF9SZWFsVHlwZSgwKSwKKwkJICAgX1JlYWxUeXBlIF9fa2FwcGEgPSBfUmVhbFR5cGUoMSkpCisJOiBfTV9tdShfX211KSwgX01fa2FwcGEoX19rYXBwYSkKKwl7CisJICBjb25zdCBfUmVhbFR5cGUgX19waSA9IF9fZ251X2N4eDo6X19tYXRoX2NvbnN0YW50czxfUmVhbFR5cGU+OjpfX3BpOworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX211ID49IC1fX3BpICYmIF9NX211IDw9IF9fcGkpOworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX2thcHBhID49IF9SZWFsVHlwZSgwKSk7CisKKwkgIGF1dG8gX190YXUgPSBzdGQ6OnNxcnQoX1JlYWxUeXBlKDQpICogX01fa2FwcGEgKiBfTV9rYXBwYQorCQkJCSArIF9SZWFsVHlwZSgxKSkgKyBfUmVhbFR5cGUoMSk7CisJICBhdXRvIF9fcmhvID0gKChfX3RhdSAtIHN0ZDo6c3FydChfUmVhbFR5cGUoMikgKiBfX3RhdSkpCisJCQkvIChfUmVhbFR5cGUoMikgKiBfTV9rYXBwYSkpOworCSAgX01fciA9IChfUmVhbFR5cGUoMSkgKyBfX3JobyAqIF9fcmhvKSAvIChfUmVhbFR5cGUoMikgKiBfX3Jobyk7CisJfQorCisJX1JlYWxUeXBlCisJbXUoKSBjb25zdAorCXsgcmV0dXJuIF9NX211OyB9CisKKwlfUmVhbFR5cGUKKwlrYXBwYSgpIGNvbnN0CisJeyByZXR1cm4gX01fa2FwcGE7IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIChfX3AxLl9NX211ID09IF9fcDIuX01fbXUKKwkJICAmJiBfX3AxLl9NX2thcHBhID09IF9fcDIuX01fa2FwcGEpOyB9CisKKyAgICAgIHByaXZhdGU6CisJX1JlYWxUeXBlIF9NX211OworCV9SZWFsVHlwZSBfTV9rYXBwYTsKKwlfUmVhbFR5cGUgX01fcjsKKyAgICAgIH07CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSB2b24gTWlzZXMgZGlzdHJpYnV0aW9uIHdpdGggcGFyYW1ldGVycworICAgICAgICogQGYkXG11QGYkIGFuZCBAZiRca2FwcGFAZiQuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICB2b25fbWlzZXNfZGlzdHJpYnV0aW9uKHJlc3VsdF90eXBlIF9fbXUgPSByZXN1bHRfdHlwZSgwKSwKKwkJCSAgICAgcmVzdWx0X3R5cGUgX19rYXBwYSA9IHJlc3VsdF90eXBlKDEpKQorCTogX01fcGFyYW0oX19tdSwgX19rYXBwYSkKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgdm9uX21pc2VzX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIEBmJCBcbXUgQGYkIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtdSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5tdSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIEBmJCBca2FwcGEgQGYkIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBrYXBwYSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5rYXBwYSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gLV9fZ251X2N4eDo6X19tYXRoX2NvbnN0YW50czxyZXN1bHRfdHlwZT46Ol9fcGk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeworCXJldHVybiBfX2dudV9jeHg6Ol9fbWF0aF9jb25zdGFudHM8cmVzdWx0X3R5cGU+OjpfX3BpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9NX3BhcmFtKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorCXsKKwkgIGNvbnN0IHJlc3VsdF90eXBlIF9fcGkKKwkgICAgPSBfX2dudV9jeHg6Ol9fbWF0aF9jb25zdGFudHM8cmVzdWx0X3R5cGU+OjpfX3BpOworCSAgc3RkOjpfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIHJlc3VsdF90eXBlPgorCSAgICBfX2F1cm5nKF9fdXJuZyk7CisKKwkgIHJlc3VsdF90eXBlIF9fZjsKKwkgIHdoaWxlICgxKQorCSAgICB7CisJICAgICAgcmVzdWx0X3R5cGUgX19ybmQgPSBzdGQ6OmNvcyhfX3BpICogX19hdXJuZygpKTsKKwkgICAgICBfX2YgPSAocmVzdWx0X3R5cGUoMSkgKyBfX3AuX01fciAqIF9fcm5kKSAvIChfX3AuX01fciArIF9fcm5kKTsKKwkgICAgICByZXN1bHRfdHlwZSBfX2MgPSBfX3AuX01fa2FwcGEgKiAoX19wLl9NX3IgLSBfX2YpOworCisJICAgICAgcmVzdWx0X3R5cGUgX19ybmQyID0gX19hdXJuZygpOworCSAgICAgIGlmIChfX2MgKiAocmVzdWx0X3R5cGUoMikgLSBfX2MpID4gX19ybmQyKQorCQlicmVhazsKKwkgICAgICBpZiAoc3RkOjpsb2coX19jIC8gX19ybmQyKSA+PSBfX2MgLSByZXN1bHRfdHlwZSgxKSkKKwkJYnJlYWs7CisJICAgIH0KKworCSAgcmVzdWx0X3R5cGUgX19yZXMgPSBzdGQ6OmFjb3MoX19mKTsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisJICBfX3JlcyA9IHN0ZDo6Y29weXNpZ24oX19yZXMsIF9fYXVybmcoKSAtIHJlc3VsdF90eXBlKDAuNSkpOworI2Vsc2UKKwkgIGlmIChfX2F1cm5nKCkgPCByZXN1bHRfdHlwZSgwLjUpKQorCSAgICBfX3JlcyA9IC1fX3JlczsKKyNlbmRpZgorCSAgX19yZXMgKz0gX19wLl9NX211OworCSAgaWYgKF9fcmVzID4gX19waSkKKwkgICAgX19yZXMgLT0gcmVzdWx0X3R5cGUoMikgKiBfX3BpOworCSAgZWxzZSBpZiAoX19yZXMgPCAtX19waSkKKwkgICAgX19yZXMgKz0gcmVzdWx0X3R5cGUoMikgKiBfX3BpOworCSAgcmV0dXJuIF9fcmVzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgdGhpcy0+X19nZW5lcmF0ZShfX2YsIF9fdCwgX191cm5nLCBfTV9wYXJhbSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJdm9pZAorCV9fZ2VuZXJhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZShyZXN1bHRfdHlwZSogX19mLCByZXN1bHRfdHlwZSogX190LAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeyB0aGlzLT5fX2dlbmVyYXRlX2ltcGwoX19mLCBfX3QsIF9fdXJuZywgX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gdm9uIE1pc2VzIGRpc3RyaWJ1dGlvbnMgaGF2ZSB0aGUgc2FtZQorICAgICAgICogICAgICAgIHBhcmFtZXRlcnMgYW5kIHRoZSBzZXF1ZW5jZXMgdGhhdCB3b3VsZCBiZSBnZW5lcmF0ZWQKKyAgICAgICAqICAgICAgICBhcmUgZXF1YWwuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHZvbl9taXNlc19kaXN0cmlidXRpb24mIF9fZDEsCisJCSBjb25zdCB2b25fbWlzZXNfZGlzdHJpYnV0aW9uJiBfX2QyKQorICAgICAgeyByZXR1cm4gX19kMS5fTV9wYXJhbSA9PSBfX2QyLl9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgYSAldm9uX21pc2VzX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAldm9uX21pc2VzX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IF9fZ251X2N4eDo6dm9uX21pc2VzX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAldm9uX21pc2VzX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJXZvbl9taXNlc19kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIF9fZ251X2N4eDo6dm9uX21pc2VzX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwl2b2lkCisJX19nZW5lcmF0ZV9pbXBsKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fdCwKKwkJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCQljb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gdm9uIE1pc2VzIGRpc3RyaWJ1dGlvbnMgYXJlIGRpZmZlcmVudC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX19nbnVfY3h4Ojp2b25fbWlzZXNfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IF9fZ251X2N4eDo6dm9uX21pc2VzX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgX19nbnVfY3h4CisKKyNpbmNsdWRlICJleHQvb3B0X3JhbmRvbS5oIgorI2luY2x1ZGUgInJhbmRvbS50Y2MiCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKworI2VuZGlmIC8vIEMrKzExCisKKyNlbmRpZiAvLyBfRVhUX1JBTkRPTQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcmFuZG9tLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3JhbmRvbS50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5ZTBlZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3JhbmRvbS50Y2MKQEAgLTAsMCArMSwxMzE0IEBACisvLyBSYW5kb20gbnVtYmVyIGV4dGVuc2lvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9yYW5kb20udGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZXh0L3JhbmRvbX0KKyAqLworCisjaWZuZGVmIF9FWFRfUkFORE9NX1RDQworI2RlZmluZSBfRVhUX1JBTkRPTV9UQ0MgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisjaWYgX19CWVRFX09SREVSX18gPT0gX19PUkRFUl9MSVRUTEVfRU5ESUFOX18KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX20sCisJICAgc2l6ZV90IF9fcG9zMSwgc2l6ZV90IF9fc2wxLCBzaXplX3QgX19zbDIsCisJICAgc2l6ZV90IF9fc3IxLCBzaXplX3QgX19zcjIsCisJICAgdWludDMyX3QgX19tc2sxLCB1aW50MzJfdCBfX21zazIsCisJICAgdWludDMyX3QgX19tc2szLCB1aW50MzJfdCBfX21zazQsCisJICAgdWludDMyX3QgX19wYXJpdHkxLCB1aW50MzJfdCBfX3Bhcml0eTIsCisJICAgdWludDMyX3QgX19wYXJpdHkzLCB1aW50MzJfdCBfX3Bhcml0eTQ+CisgICAgdm9pZCBzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX20sCisJCQkJCSAgIF9fcG9zMSwgX19zbDEsIF9fc2wyLCBfX3NyMSwgX19zcjIsCisJCQkJCSAgIF9fbXNrMSwgX19tc2syLCBfX21zazMsIF9fbXNrNCwKKwkJCQkJICAgX19wYXJpdHkxLCBfX3Bhcml0eTIsIF9fcGFyaXR5MywKKwkJCQkJICAgX19wYXJpdHk0Pjo6CisgICAgc2VlZChfVUludFR5cGUgX19zZWVkKQorICAgIHsKKyAgICAgIF9NX3N0YXRlMzJbMF0gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oX19zZWVkKTsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDE7IF9faSA8IF9NX25zdGF0ZTMyOyArK19faSkKKwlfTV9zdGF0ZTMyW19faV0gPSAoMTgxMjQzMzI1M1VMCisJCQkgICAqIChfTV9zdGF0ZTMyW19faSAtIDFdIF4gKF9NX3N0YXRlMzJbX19pIC0gMV0gPj4gMzApKQorCQkJICAgKyBfX2kpOworICAgICAgX01fcG9zID0gc3RhdGVfc2l6ZTsKKyAgICAgIF9NX3BlcmlvZF9jZXJ0aWZpY2F0aW9uKCk7CisgICAgfQorCisKKyAgbmFtZXNwYWNlIHsKKworICAgIGlubGluZSB1aW50MzJfdCBfRnVuYzEodWludDMyX3QgX194KQorICAgIHsKKyAgICAgIHJldHVybiAoX194IF4gKF9feCA+PiAyNykpICogVUlOVDMyX0MoMTY2NDUyNSk7CisgICAgfQorCisgICAgaW5saW5lIHVpbnQzMl90IF9GdW5jMih1aW50MzJfdCBfX3gpCisgICAgeworICAgICAgcmV0dXJuIChfX3ggXiAoX194ID4+IDI3KSkgKiBVSU5UMzJfQygxNTY2MDgzOTQxKTsKKyAgICB9CisKKyAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX19tLAorCSAgIHNpemVfdCBfX3BvczEsIHNpemVfdCBfX3NsMSwgc2l6ZV90IF9fc2wyLAorCSAgIHNpemVfdCBfX3NyMSwgc2l6ZV90IF9fc3IyLAorCSAgIHVpbnQzMl90IF9fbXNrMSwgdWludDMyX3QgX19tc2syLAorCSAgIHVpbnQzMl90IF9fbXNrMywgdWludDMyX3QgX19tc2s0LAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MSwgdWludDMyX3QgX19wYXJpdHkyLAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MywgdWludDMyX3QgX19wYXJpdHk0PgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Tc2VxPgorICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jbGFzczxfU3NlcT46OnZhbHVlPjo6dHlwZQorICAgICAgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX19tLAorCQkJCQlfX3BvczEsIF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLAorCQkJCQlfX21zazEsIF9fbXNrMiwgX19tc2szLCBfX21zazQsCisJCQkJCV9fcGFyaXR5MSwgX19wYXJpdHkyLCBfX3Bhcml0eTMsCisJCQkJCV9fcGFyaXR5ND46OgorICAgICAgc2VlZChfU3NlcSYgX19xKQorICAgICAgeworCXNpemVfdCBfX2xhZzsKKworCWlmIChfTV9uc3RhdGUzMiA+PSA2MjMpCisJICBfX2xhZyA9IDExOworCWVsc2UgaWYgKF9NX25zdGF0ZTMyID49IDY4KQorCSAgX19sYWcgPSA3OworCWVsc2UgaWYgKF9NX25zdGF0ZTMyID49IDM5KQorCSAgX19sYWcgPSA1OworCWVsc2UKKwkgIF9fbGFnID0gMzsKKwljb25zdCBzaXplX3QgX19taWQgPSAoX01fbnN0YXRlMzIgLSBfX2xhZykgLyAyOworCisJc3RkOjpmaWxsKF9NX3N0YXRlMzIsIF9NX3N0YXRlMzIgKyBfTV9uc3RhdGUzMiwgVUlOVDMyX0MoMHg4YjhiOGI4YikpOworCXVpbnQzMl90IF9fYXJyW19NX25zdGF0ZTMyXTsKKwlfX3EuZ2VuZXJhdGUoX19hcnIgKyAwLCBfX2FyciArIF9NX25zdGF0ZTMyKTsKKworCXVpbnQzMl90IF9fciA9IF9GdW5jMShfTV9zdGF0ZTMyWzBdIF4gX01fc3RhdGUzMltfX21pZF0KKwkJCSAgICAgIF4gX01fc3RhdGUzMltfTV9uc3RhdGUzMiAgLSAxXSk7CisJX01fc3RhdGUzMltfX21pZF0gKz0gX19yOworCV9fciArPSBfTV9uc3RhdGUzMjsKKwlfTV9zdGF0ZTMyW19fbWlkICsgX19sYWddICs9IF9fcjsKKwlfTV9zdGF0ZTMyWzBdID0gX19yOworCisJZm9yIChzaXplX3QgX19pID0gMSwgX19qID0gMDsgX19qIDwgX01fbnN0YXRlMzI7ICsrX19qKQorCSAgeworCSAgICBfX3IgPSBfRnVuYzEoX01fc3RhdGUzMltfX2ldCisJCQkgXiBfTV9zdGF0ZTMyWyhfX2kgKyBfX21pZCkgJSBfTV9uc3RhdGUzMl0KKwkJCSBeIF9NX3N0YXRlMzJbKF9faSArIF9NX25zdGF0ZTMyIC0gMSkgJSBfTV9uc3RhdGUzMl0pOworCSAgICBfTV9zdGF0ZTMyWyhfX2kgKyBfX21pZCkgJSBfTV9uc3RhdGUzMl0gKz0gX19yOworCSAgICBfX3IgKz0gX19hcnJbX19qXSArIF9faTsKKwkgICAgX01fc3RhdGUzMlsoX19pICsgX19taWQgKyBfX2xhZykgJSBfTV9uc3RhdGUzMl0gKz0gX19yOworCSAgICBfTV9zdGF0ZTMyW19faV0gPSBfX3I7CisJICAgIF9faSA9IChfX2kgKyAxKSAlIF9NX25zdGF0ZTMyOworCSAgfQorCWZvciAoc2l6ZV90IF9faiA9IDA7IF9faiA8IF9NX25zdGF0ZTMyOyArK19faikKKwkgIHsKKwkgICAgY29uc3Qgc2l6ZV90IF9faSA9IChfX2ogKyAxKSAlIF9NX25zdGF0ZTMyOworCSAgICBfX3IgPSBfRnVuYzIoX01fc3RhdGUzMltfX2ldCisJCQkgKyBfTV9zdGF0ZTMyWyhfX2kgKyBfX21pZCkgJSBfTV9uc3RhdGUzMl0KKwkJCSArIF9NX3N0YXRlMzJbKF9faSArIF9NX25zdGF0ZTMyIC0gMSkgJSBfTV9uc3RhdGUzMl0pOworCSAgICBfTV9zdGF0ZTMyWyhfX2kgKyBfX21pZCkgJSBfTV9uc3RhdGUzMl0gXj0gX19yOworCSAgICBfX3IgLT0gX19pOworCSAgICBfTV9zdGF0ZTMyWyhfX2kgKyBfX21pZCArIF9fbGFnKSAlIF9NX25zdGF0ZTMyXSBePSBfX3I7CisJICAgIF9NX3N0YXRlMzJbX19pXSA9IF9fcjsKKwkgIH0KKworCV9NX3BvcyA9IHN0YXRlX3NpemU7CisJX01fcGVyaW9kX2NlcnRpZmljYXRpb24oKTsKKyAgICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fbSwKKwkgICBzaXplX3QgX19wb3MxLCBzaXplX3QgX19zbDEsIHNpemVfdCBfX3NsMiwKKwkgICBzaXplX3QgX19zcjEsIHNpemVfdCBfX3NyMiwKKwkgICB1aW50MzJfdCBfX21zazEsIHVpbnQzMl90IF9fbXNrMiwKKwkgICB1aW50MzJfdCBfX21zazMsIHVpbnQzMl90IF9fbXNrNCwKKwkgICB1aW50MzJfdCBfX3Bhcml0eTEsIHVpbnQzMl90IF9fcGFyaXR5MiwKKwkgICB1aW50MzJfdCBfX3Bhcml0eTMsIHVpbnQzMl90IF9fcGFyaXR5ND4KKyAgICB2b2lkIHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fbSwKKwkJCQkJICAgX19wb3MxLCBfX3NsMSwgX19zbDIsIF9fc3IxLCBfX3NyMiwKKwkJCQkJICAgX19tc2sxLCBfX21zazIsIF9fbXNrMywgX19tc2s0LAorCQkJCQkgICBfX3Bhcml0eTEsIF9fcGFyaXR5MiwgX19wYXJpdHkzLAorCQkJCQkgICBfX3Bhcml0eTQ+OjoKKyAgICBfTV9wZXJpb2RfY2VydGlmaWNhdGlvbih2b2lkKQorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBfX3Bhcml0eVs0XSA9IHsgX19wYXJpdHkxLCBfX3Bhcml0eTIsCisJCQkJCSAgICBfX3Bhcml0eTMsIF9fcGFyaXR5NCB9OworICAgICAgdWludDMyX3QgX19pbm5lciA9IDA7CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCA0OyArK19faSkKKwlpZiAoX19wYXJpdHlbX19pXSAhPSAwKQorCSAgX19pbm5lciBePSBfTV9zdGF0ZTMyW19faV0gJiBfX3Bhcml0eVtfX2ldOworCisgICAgICBpZiAoX19idWlsdGluX3Bhcml0eShfX2lubmVyKSAmIDEpCisJcmV0dXJuOworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgNDsgKytfX2kpCisJaWYgKF9fcGFyaXR5W19faV0gIT0gMCkKKwkgIHsKKwkgICAgX01fc3RhdGUzMltfX2ldIF49IDEgPDwgKF9fYnVpbHRpbl9mZnMoX19wYXJpdHlbX19pXSkgLSAxKTsKKwkgICAgcmV0dXJuOworCSAgfQorICAgICAgX19idWlsdGluX3VucmVhY2hhYmxlKCk7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX19tLAorCSAgIHNpemVfdCBfX3BvczEsIHNpemVfdCBfX3NsMSwgc2l6ZV90IF9fc2wyLAorCSAgIHNpemVfdCBfX3NyMSwgc2l6ZV90IF9fc3IyLAorCSAgIHVpbnQzMl90IF9fbXNrMSwgdWludDMyX3QgX19tc2syLAorCSAgIHVpbnQzMl90IF9fbXNrMywgdWludDMyX3QgX19tc2s0LAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MSwgdWludDMyX3QgX19wYXJpdHkyLAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MywgdWludDMyX3QgX19wYXJpdHk0PgorICAgIHZvaWQgc2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX19tLAorCQkJCQkgICBfX3BvczEsIF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLAorCQkJCQkgICBfX21zazEsIF9fbXNrMiwgX19tc2szLCBfX21zazQsCisJCQkJCSAgIF9fcGFyaXR5MSwgX19wYXJpdHkyLCBfX3Bhcml0eTMsCisJCQkJCSAgIF9fcGFyaXR5ND46OgorICAgIGRpc2NhcmQodW5zaWduZWQgbG9uZyBsb25nIF9feikKKyAgICB7CisgICAgICB3aGlsZSAoX196ID4gc3RhdGVfc2l6ZSAtIF9NX3BvcykKKwl7CisJICBfX3ogLT0gc3RhdGVfc2l6ZSAtIF9NX3BvczsKKworCSAgX01fZ2VuX3JhbmQoKTsKKwl9CisKKyAgICAgIF9NX3BvcyArPSBfX3o7CisgICAgfQorCisKKyNpZm5kZWYgIF9HTElCQ1hYX09QVF9IQVZFX1JBTkRPTV9TRk1UX0dFTl9SRUFECisKKyAgbmFtZXNwYWNlIHsKKworICAgIHRlbXBsYXRlPHNpemVfdCBfX3NoaWZ0PgorICAgICAgaW5saW5lIHZvaWQgX19yc2hpZnQodWludDMyX3QgKl9fb3V0LCBjb25zdCB1aW50MzJfdCAqX19pbikKKyAgICAgIHsKKwl1aW50NjRfdCBfX3RoID0gKChzdGF0aWNfY2FzdDx1aW50NjRfdD4oX19pblszXSkgPDwgMzIpCisJCQkgfCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oX19pblsyXSkpOworCXVpbnQ2NF90IF9fdGwgPSAoKHN0YXRpY19jYXN0PHVpbnQ2NF90PihfX2luWzFdKSA8PCAzMikKKwkJCSB8IHN0YXRpY19jYXN0PHVpbnQ2NF90PihfX2luWzBdKSk7CisKKwl1aW50NjRfdCBfX29oID0gX190aCA+PiAoX19zaGlmdCAqIDgpOworCXVpbnQ2NF90IF9fb2wgPSBfX3RsID4+IChfX3NoaWZ0ICogOCk7CisJX19vbCB8PSBfX3RoIDw8ICg2NCAtIF9fc2hpZnQgKiA4KTsKKwlfX291dFsxXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihfX29sID4+IDMyKTsKKwlfX291dFswXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihfX29sKTsKKwlfX291dFszXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihfX29oID4+IDMyKTsKKwlfX291dFsyXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihfX29oKTsKKyAgICAgIH0KKworCisgICAgdGVtcGxhdGU8c2l6ZV90IF9fc2hpZnQ+CisgICAgICBpbmxpbmUgdm9pZCBfX2xzaGlmdCh1aW50MzJfdCAqX19vdXQsIGNvbnN0IHVpbnQzMl90ICpfX2luKQorICAgICAgeworCXVpbnQ2NF90IF9fdGggPSAoKHN0YXRpY19jYXN0PHVpbnQ2NF90PihfX2luWzNdKSA8PCAzMikKKwkJCSB8IHN0YXRpY19jYXN0PHVpbnQ2NF90PihfX2luWzJdKSk7CisJdWludDY0X3QgX190bCA9ICgoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KF9faW5bMV0pIDw8IDMyKQorCQkJIHwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KF9faW5bMF0pKTsKKworCXVpbnQ2NF90IF9fb2ggPSBfX3RoIDw8IChfX3NoaWZ0ICogOCk7CisJdWludDY0X3QgX19vbCA9IF9fdGwgPDwgKF9fc2hpZnQgKiA4KTsKKwlfX29oIHw9IF9fdGwgPj4gKDY0IC0gX19zaGlmdCAqIDgpOworCV9fb3V0WzFdID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KF9fb2wgPj4gMzIpOworCV9fb3V0WzBdID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KF9fb2wpOworCV9fb3V0WzNdID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KF9fb2ggPj4gMzIpOworCV9fb3V0WzJdID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KF9fb2gpOworICAgICAgfQorCisKKyAgICB0ZW1wbGF0ZTxzaXplX3QgX19zbDEsIHNpemVfdCBfX3NsMiwgc2l6ZV90IF9fc3IxLCBzaXplX3QgX19zcjIsCisJICAgICB1aW50MzJfdCBfX21zazEsIHVpbnQzMl90IF9fbXNrMiwgdWludDMyX3QgX19tc2szLCB1aW50MzJfdCBfX21zazQ+CisgICAgICBpbmxpbmUgdm9pZCBfX3JlY3Vyc2lvbih1aW50MzJfdCAqX19yLAorCQkJICAgICAgY29uc3QgdWludDMyX3QgKl9fYSwgY29uc3QgdWludDMyX3QgKl9fYiwKKwkJCSAgICAgIGNvbnN0IHVpbnQzMl90ICpfX2MsIGNvbnN0IHVpbnQzMl90ICpfX2QpCisgICAgICB7CisJdWludDMyX3QgX194WzRdOworCXVpbnQzMl90IF9feVs0XTsKKworCV9fbHNoaWZ0PF9fc2wyPihfX3gsIF9fYSk7CisJX19yc2hpZnQ8X19zcjI+KF9feSwgX19jKTsKKwlfX3JbMF0gPSAoX19hWzBdIF4gX194WzBdIF4gKChfX2JbMF0gPj4gX19zcjEpICYgX19tc2sxKQorCQkgIF4gX195WzBdIF4gKF9fZFswXSA8PCBfX3NsMSkpOworCV9fclsxXSA9IChfX2FbMV0gXiBfX3hbMV0gXiAoKF9fYlsxXSA+PiBfX3NyMSkgJiBfX21zazIpCisJCSAgXiBfX3lbMV0gXiAoX19kWzFdIDw8IF9fc2wxKSk7CisJX19yWzJdID0gKF9fYVsyXSBeIF9feFsyXSBeICgoX19iWzJdID4+IF9fc3IxKSAmIF9fbXNrMykKKwkJICBeIF9feVsyXSBeIChfX2RbMl0gPDwgX19zbDEpKTsKKwlfX3JbM10gPSAoX19hWzNdIF4gX194WzNdIF4gKChfX2JbM10gPj4gX19zcjEpICYgX19tc2s0KQorCQkgIF4gX195WzNdIF4gKF9fZFszXSA8PCBfX3NsMSkpOworICAgICAgfQorCisgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fbSwKKwkgICBzaXplX3QgX19wb3MxLCBzaXplX3QgX19zbDEsIHNpemVfdCBfX3NsMiwKKwkgICBzaXplX3QgX19zcjEsIHNpemVfdCBfX3NyMiwKKwkgICB1aW50MzJfdCBfX21zazEsIHVpbnQzMl90IF9fbXNrMiwKKwkgICB1aW50MzJfdCBfX21zazMsIHVpbnQzMl90IF9fbXNrNCwKKwkgICB1aW50MzJfdCBfX3Bhcml0eTEsIHVpbnQzMl90IF9fcGFyaXR5MiwKKwkgICB1aW50MzJfdCBfX3Bhcml0eTMsIHVpbnQzMl90IF9fcGFyaXR5ND4KKyAgICB2b2lkIHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fbSwKKwkJCQkJICAgX19wb3MxLCBfX3NsMSwgX19zbDIsIF9fc3IxLCBfX3NyMiwKKwkJCQkJICAgX19tc2sxLCBfX21zazIsIF9fbXNrMywgX19tc2s0LAorCQkJCQkgICBfX3Bhcml0eTEsIF9fcGFyaXR5MiwgX19wYXJpdHkzLAorCQkJCQkgICBfX3Bhcml0eTQ+OjoKKyAgICBfTV9nZW5fcmFuZCh2b2lkKQorICAgIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90ICpfX3IxID0gJl9NX3N0YXRlMzJbX01fbnN0YXRlMzIgLSA4XTsKKyAgICAgIGNvbnN0IHVpbnQzMl90ICpfX3IyID0gJl9NX3N0YXRlMzJbX01fbnN0YXRlMzIgLSA0XTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IF9fcG9zMV8zMiA9IF9fcG9zMSAqIDQ7CisKKyAgICAgIHNpemVfdCBfX2k7CisgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9NX25zdGF0ZTMyIC0gX19wb3MxXzMyOyBfX2kgKz0gNCkKKwl7CisJICBfX3JlY3Vyc2lvbjxfX3NsMSwgX19zbDIsIF9fc3IxLCBfX3NyMiwKKwkJICAgICAgX19tc2sxLCBfX21zazIsIF9fbXNrMywgX19tc2s0PgorCSAgICAoJl9NX3N0YXRlMzJbX19pXSwgJl9NX3N0YXRlMzJbX19pXSwKKwkgICAgICZfTV9zdGF0ZTMyW19faSArIF9fcG9zMV8zMl0sIF9fcjEsIF9fcjIpOworCSAgX19yMSA9IF9fcjI7CisJICBfX3IyID0gJl9NX3N0YXRlMzJbX19pXTsKKwl9CisKKyAgICAgIGZvciAoOyBfX2kgPCBfTV9uc3RhdGUzMjsgX19pICs9IDQpCisJeworCSAgX19yZWN1cnNpb248X19zbDEsIF9fc2wyLCBfX3NyMSwgX19zcjIsCisJCSAgICAgIF9fbXNrMSwgX19tc2syLCBfX21zazMsIF9fbXNrND4KKwkgICAgKCZfTV9zdGF0ZTMyW19faV0sICZfTV9zdGF0ZTMyW19faV0sCisJICAgICAmX01fc3RhdGUzMltfX2kgKyBfX3BvczFfMzIgLSBfTV9uc3RhdGUzMl0sIF9fcjEsIF9fcjIpOworCSAgX19yMSA9IF9fcjI7CisJICBfX3IyID0gJl9NX3N0YXRlMzJbX19pXTsKKwl9CisKKyAgICAgIF9NX3BvcyA9IDA7CisgICAgfQorCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9PUFRfSEFWRV9SQU5ET01fU0ZNVF9PUEVSQVRPUkVRVUFMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fbSwKKwkgICBzaXplX3QgX19wb3MxLCBzaXplX3QgX19zbDEsIHNpemVfdCBfX3NsMiwKKwkgICBzaXplX3QgX19zcjEsIHNpemVfdCBfX3NyMiwKKwkgICB1aW50MzJfdCBfX21zazEsIHVpbnQzMl90IF9fbXNrMiwKKwkgICB1aW50MzJfdCBfX21zazMsIHVpbnQzMl90IF9fbXNrNCwKKwkgICB1aW50MzJfdCBfX3Bhcml0eTEsIHVpbnQzMl90IF9fcGFyaXR5MiwKKwkgICB1aW50MzJfdCBfX3Bhcml0eTMsIHVpbnQzMl90IF9fcGFyaXR5ND4KKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfX2dudV9jeHg6OnNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsCisJICAgICAgIF9fbSwgX19wb3MxLCBfX3NsMSwgX19zbDIsIF9fc3IxLCBfX3NyMiwKKwkgICAgICAgX19tc2sxLCBfX21zazIsIF9fbXNrMywgX19tc2s0LAorCSAgICAgICBfX3Bhcml0eTEsIF9fcGFyaXR5MiwgX19wYXJpdHkzLCBfX3Bhcml0eTQ+JiBfX2xocywKKwkgICAgICAgY29uc3QgX19nbnVfY3h4OjpzaW1kX2Zhc3RfbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLAorCSAgICAgICBfX20sIF9fcG9zMSwgX19zbDEsIF9fc2wyLCBfX3NyMSwgX19zcjIsCisJICAgICAgIF9fbXNrMSwgX19tc2syLCBfX21zazMsIF9fbXNrNCwKKwkgICAgICAgX19wYXJpdHkxLCBfX3Bhcml0eTIsIF9fcGFyaXR5MywgX19wYXJpdHk0PiYgX19yaHMpCisgICAgeworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsCisJICAgICAgIF9fbSwgX19wb3MxLCBfX3NsMSwgX19zbDIsIF9fc3IxLCBfX3NyMiwKKwkgICAgICAgX19tc2sxLCBfX21zazIsIF9fbXNrMywgX19tc2s0LAorCSAgICAgICBfX3Bhcml0eTEsIF9fcGFyaXR5MiwgX19wYXJpdHkzLCBfX3Bhcml0eTQ+IF9fZW5naW5lOworICAgICAgcmV0dXJuIChzdGQ6OmVxdWFsKF9fbGhzLl9NX3N0YXRlVCwKKwkJCSBfX2xocy5fTV9zdGF0ZVQgKyBfX2VuZ2luZTo6c3RhdGVfc2l6ZSwKKwkJCSBfX3Jocy5fTV9zdGF0ZVQpCisJICAgICAgJiYgX19saHMuX01fcG9zID09IF9fcmhzLl9NX3Bvcyk7CisgICAgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX19tLAorCSAgIHNpemVfdCBfX3BvczEsIHNpemVfdCBfX3NsMSwgc2l6ZV90IF9fc2wyLAorCSAgIHNpemVfdCBfX3NyMSwgc2l6ZV90IF9fc3IyLAorCSAgIHVpbnQzMl90IF9fbXNrMSwgdWludDMyX3QgX19tc2syLAorCSAgIHVpbnQzMl90IF9fbXNrMywgdWludDMyX3QgX19tc2s0LAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MSwgdWludDMyX3QgX19wYXJpdHkyLAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MywgdWludDMyX3QgX19wYXJpdHk0LAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBfX2dudV9jeHg6OnNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsCisJICAgICAgIF9fbSwgX19wb3MxLCBfX3NsMSwgX19zbDIsIF9fc3IxLCBfX3NyMiwKKwkgICAgICAgX19tc2sxLCBfX21zazIsIF9fbXNrMywgX19tc2s0LAorCSAgICAgICBfX3Bhcml0eTEsIF9fcGFyaXR5MiwgX19wYXJpdHkzLCBfX3Bhcml0eTQ+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6Zml4ZWQgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX194Ll9NX25zdGF0ZTMyOyArK19faSkKKwlfX29zIDw8IF9feC5fTV9zdGF0ZTMyW19faV0gPDwgX19zcGFjZTsKKyAgICAgIF9fb3MgPDwgX194Ll9NX3BvczsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX19tLAorCSAgIHNpemVfdCBfX3BvczEsIHNpemVfdCBfX3NsMSwgc2l6ZV90IF9fc2wyLAorCSAgIHNpemVfdCBfX3NyMSwgc2l6ZV90IF9fc3IyLAorCSAgIHVpbnQzMl90IF9fbXNrMSwgdWludDMyX3QgX19tc2syLAorCSAgIHVpbnQzMl90IF9fbXNrMywgdWludDMyX3QgX19tc2s0LAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MSwgdWludDMyX3QgX19wYXJpdHkyLAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MywgdWludDMyX3QgX19wYXJpdHk0LAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBfX2dudV9jeHg6OnNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsCisJICAgICAgIF9fbSwgX19wb3MxLCBfX3NsMSwgX19zbDIsIF9fc3IxLCBfX3NyMiwKKwkgICAgICAgX19tc2sxLCBfX21zazIsIF9fbXNrMywgX19tc2s0LAorCSAgICAgICBfX3Bhcml0eTEsIF9fcGFyaXR5MiwgX19wYXJpdHkzLCBfX3Bhcml0eTQ+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9feC5fTV9uc3RhdGUzMjsgKytfX2kpCisJX19pcyA+PiBfX3guX01fc3RhdGUzMltfX2ldOworICAgICAgX19pcyA+PiBfX3guX01fcG9zOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisjZW5kaWYgLy8gX19CWVRFX09SREVSX18gPT0gX19PUkRFUl9MSVRUTEVfRU5ESUFOX18KKworICAvKioKKyAgICogSXRlcmF0aW9uIG1ldGhvZCBkdWUgdG8gTS5ELiBKPG86Pmhuay4KKyAgICoKKyAgICogTS5ELiBKPG86PmhuaywgRXJ6ZXVndW5nIHZvbiBiZXRhdmVydGVpbHRlbiB1bmQgZ2FtbWF2ZXJ0ZWlsdGVuCisgICAqIFp1ZmFsbHN6YWhsZW4sIE1ldHJpa2EsIFZvbHVtZSA4LCAxOTY0CisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBiZXRhX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgYmV0YV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSBjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeworCXN0ZDo6X19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCByZXN1bHRfdHlwZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKworCXJlc3VsdF90eXBlIF9feCwgX195OworCWRvCisJICB7CisJICAgIF9feCA9IHN0ZDo6ZXhwKHN0ZDo6bG9nKF9fYXVybmcoKSkgLyBfX3BhcmFtLmFscGhhKCkpOworCSAgICBfX3kgPSBzdGQ6OmV4cChzdGQ6OmxvZyhfX2F1cm5nKCkpIC8gX19wYXJhbS5iZXRhKCkpOworCSAgfQorCXdoaWxlIChfX3ggKyBfX3kgPiByZXN1bHRfdHlwZSgxKSk7CisKKwlyZXR1cm4gX194IC8gKF9feCArIF9feSk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgYmV0YV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX091dHB1dEl0ZXJhdG9yIF9fZiwgX091dHB1dEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3I+KQorCisJc3RkOjpfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIHJlc3VsdF90eXBlPgorCSAgX19hdXJuZyhfX3VybmcpOworCisJd2hpbGUgKF9fZiAhPSBfX3QpCisJICB7CisJICAgIHJlc3VsdF90eXBlIF9feCwgX195OworCSAgICBkbworCSAgICAgIHsKKwkJX194ID0gc3RkOjpleHAoc3RkOjpsb2coX19hdXJuZygpKSAvIF9fcGFyYW0uYWxwaGEoKSk7CisJCV9feSA9IHN0ZDo6ZXhwKHN0ZDo6bG9nKF9fYXVybmcoKSkgLyBfX3BhcmFtLmJldGEoKSk7CisJICAgICAgfQorCSAgICB3aGlsZSAoX194ICsgX195ID4gcmVzdWx0X3R5cGUoMSkpOworCisJICAgICpfX2YrKyA9IF9feCAvIChfX3ggKyBfX3kpOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IF9fZ251X2N4eDo6YmV0YV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5hbHBoYSgpIDw8IF9fc3BhY2UgPDwgX194LmJldGEoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIF9fZ251X2N4eDo6YmV0YV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fYWxwaGFfdmFsLCBfX2JldGFfdmFsOworICAgICAgX19pcyA+PiBfX2FscGhhX3ZhbCA+PiBfX2JldGFfdmFsOworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIF9fZ251X2N4eDo6YmV0YV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19hbHBoYV92YWwsIF9fYmV0YV92YWwpKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9EaW1lbiwgdHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyPgorICAgICAgdm9pZAorICAgICAgbm9ybWFsX212X2Rpc3RyaWJ1dGlvbjxfRGltZW4sIF9SZWFsVHlwZT46OnBhcmFtX3R5cGU6OgorICAgICAgX01faW5pdF9mdWxsKF9JbnB1dEl0ZXJhdG9yMSBfX21lYW5iZWdpbiwgX0lucHV0SXRlcmF0b3IxIF9fbWVhbmVuZCwKKwkJICAgX0lucHV0SXRlcmF0b3IyIF9fdmFyY292YmVnaW4sIF9JbnB1dEl0ZXJhdG9yMiBfX3ZhcmNvdmVuZCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMT4pCisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjI+KQorCXN0ZDo6ZmlsbChzdGQ6OmNvcHkoX19tZWFuYmVnaW4sIF9fbWVhbmVuZCwgX01fbWVhbi5iZWdpbigpKSwKKwkJICBfTV9tZWFuLmVuZCgpLCBfUmVhbFR5cGUoMCkpOworCisJLy8gUGVyZm9ybSB0aGUgQ2hvbGVza3kgZGVjb21wb3NpdGlvbgorCWF1dG8gX193ID0gX01fdC5iZWdpbigpOworCWZvciAoc2l6ZV90IF9faiA9IDA7IF9faiA8IF9EaW1lbjsgKytfX2opCisJICB7CisJICAgIF9SZWFsVHlwZSBfX3N1bSA9IF9SZWFsVHlwZSgwKTsKKworCSAgICBhdXRvIF9fc2xpdGJlZ2luID0gX193OworCSAgICBhdXRvIF9fY2l0ID0gX01fdC5iZWdpbigpOworCSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX2o7ICsrX19pKQorCSAgICAgIHsKKwkJYXV0byBfX3NsaXQgPSBfX3NsaXRiZWdpbjsKKwkJX1JlYWxUeXBlIF9fcyA9ICpfX3ZhcmNvdmJlZ2luKys7CisJCWZvciAoc2l6ZV90IF9fayA9IDA7IF9fayA8IF9faTsgKytfX2spCisJCSAgX19zIC09ICpfX3NsaXQrKyAqICpfX2NpdCsrOworCisJCSpfX3crKyA9IF9fcyAvPSAqX19jaXQrKzsKKwkJX19zdW0gKz0gX19zICogX19zOworCSAgICAgIH0KKworCSAgICBfX3N1bSA9ICpfX3ZhcmNvdmJlZ2luIC0gX19zdW07CisJICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KF9fc3VtIDw9IF9SZWFsVHlwZSgwKSwgMCkpCisJICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJub3JtYWxfbXZfZGlzdHJpYnV0aW9uOjoiCisJCQkJCSAgICAgInBhcmFtX3R5cGU6Ol9NX2luaXRfZnVsbCIpKTsKKwkgICAgKl9fdysrID0gc3RkOjpzcXJ0KF9fc3VtKTsKKworCSAgICBzdGQ6OmFkdmFuY2UoX192YXJjb3ZiZWdpbiwgX0RpbWVuIC0gX19qKTsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfRGltZW4sIHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMj4KKyAgICAgIHZvaWQKKyAgICAgIG5vcm1hbF9tdl9kaXN0cmlidXRpb248X0RpbWVuLCBfUmVhbFR5cGU+OjpwYXJhbV90eXBlOjoKKyAgICAgIF9NX2luaXRfbG93ZXIoX0lucHV0SXRlcmF0b3IxIF9fbWVhbmJlZ2luLCBfSW5wdXRJdGVyYXRvcjEgX19tZWFuZW5kLAorCQkgICAgX0lucHV0SXRlcmF0b3IyIF9fdmFyY292YmVnaW4sIF9JbnB1dEl0ZXJhdG9yMiBfX3ZhcmNvdmVuZCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMT4pCisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjI+KQorCXN0ZDo6ZmlsbChzdGQ6OmNvcHkoX19tZWFuYmVnaW4sIF9fbWVhbmVuZCwgX01fbWVhbi5iZWdpbigpKSwKKwkJICBfTV9tZWFuLmVuZCgpLCBfUmVhbFR5cGUoMCkpOworCisJLy8gUGVyZm9ybSB0aGUgQ2hvbGVza3kgZGVjb21wb3NpdGlvbgorCWF1dG8gX193ID0gX01fdC5iZWdpbigpOworCWZvciAoc2l6ZV90IF9faiA9IDA7IF9faiA8IF9EaW1lbjsgKytfX2opCisJICB7CisJICAgIF9SZWFsVHlwZSBfX3N1bSA9IF9SZWFsVHlwZSgwKTsKKworCSAgICBhdXRvIF9fc2xpdGJlZ2luID0gX193OworCSAgICBhdXRvIF9fY2l0ID0gX01fdC5iZWdpbigpOworCSAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX2o7ICsrX19pKQorCSAgICAgIHsKKwkJYXV0byBfX3NsaXQgPSBfX3NsaXRiZWdpbjsKKwkJX1JlYWxUeXBlIF9fcyA9ICpfX3ZhcmNvdmJlZ2luKys7CisJCWZvciAoc2l6ZV90IF9fayA9IDA7IF9fayA8IF9faTsgKytfX2spCisJCSAgX19zIC09ICpfX3NsaXQrKyAqICpfX2NpdCsrOworCisJCSpfX3crKyA9IF9fcyAvPSAqX19jaXQrKzsKKwkJX19zdW0gKz0gX19zICogX19zOworCSAgICAgIH0KKworCSAgICBfX3N1bSA9ICpfX3ZhcmNvdmJlZ2luKysgLSBfX3N1bTsKKwkgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoX19zdW0gPD0gX1JlYWxUeXBlKDApLCAwKSkKKwkgICAgICBzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oIm5vcm1hbF9tdl9kaXN0cmlidXRpb246OiIKKwkJCQkJICAgICAicGFyYW1fdHlwZTo6X01faW5pdF9mdWxsIikpOworCSAgICAqX193KysgPSBzdGQ6OnNxcnQoX19zdW0pOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9EaW1lbiwgdHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyPgorICAgICAgdm9pZAorICAgICAgbm9ybWFsX212X2Rpc3RyaWJ1dGlvbjxfRGltZW4sIF9SZWFsVHlwZT46OnBhcmFtX3R5cGU6OgorICAgICAgX01faW5pdF9kaWFnb25hbChfSW5wdXRJdGVyYXRvcjEgX19tZWFuYmVnaW4sIF9JbnB1dEl0ZXJhdG9yMSBfX21lYW5lbmQsCisJCSAgICAgICBfSW5wdXRJdGVyYXRvcjIgX192YXJiZWdpbiwgX0lucHV0SXRlcmF0b3IyIF9fdmFyZW5kKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisJc3RkOjpmaWxsKHN0ZDo6Y29weShfX21lYW5iZWdpbiwgX19tZWFuZW5kLCBfTV9tZWFuLmJlZ2luKCkpLAorCQkgIF9NX21lYW4uZW5kKCksIF9SZWFsVHlwZSgwKSk7CisKKwlhdXRvIF9fdyA9IF9NX3QuYmVnaW4oKTsKKwlzaXplX3QgX19zdGVwID0gMDsKKwl3aGlsZSAoX192YXJiZWdpbiAhPSBfX3ZhcmVuZCkKKwkgIHsKKwkgICAgc3RkOjpmaWxsX24oX193LCBfX3N0ZXAsIF9SZWFsVHlwZSgwKSk7CisJICAgIF9fdyArPSBfX3N0ZXArKzsKKwkgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoKl9fdmFyYmVnaW4gPCBfUmVhbFR5cGUoMCksIDApKQorCSAgICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigibm9ybWFsX212X2Rpc3RyaWJ1dGlvbjo6IgorCQkJCQkgICAgICJwYXJhbV90eXBlOjpfTV9pbml0X2RpYWdvbmFsIikpOworCSAgICAqX193KysgPSBzdGQ6OnNxcnQoKl9fdmFyYmVnaW4rKyk7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0RpbWVuLCB0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBub3JtYWxfbXZfZGlzdHJpYnV0aW9uPF9EaW1lbiwgX1JlYWxUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIG5vcm1hbF9tdl9kaXN0cmlidXRpb248X0RpbWVuLCBfUmVhbFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJcmVzdWx0X3R5cGUgX19yZXQ7CisKKwlfTV9uZC5fX2dlbmVyYXRlKF9fcmV0LmJlZ2luKCksIF9fcmV0LmVuZCgpLCBfX3VybmcpOworCisJYXV0byBfX3RfaXQgPSBfX3BhcmFtLl9NX3QuY3JiZWdpbigpOworCWZvciAoc2l6ZV90IF9faSA9IF9EaW1lbjsgX19pID4gMDsgLS1fX2kpCisJICB7CisJICAgIF9SZWFsVHlwZSBfX3N1bSA9IF9SZWFsVHlwZSgwKTsKKwkgICAgZm9yIChzaXplX3QgX19qID0gX19pOyBfX2ogPiAwOyAtLV9faikKKwkgICAgICBfX3N1bSArPSBfX3JldFtfX2ogLSAxXSAqICpfX3RfaXQrKzsKKwkgICAgX19yZXRbX19pIC0gMV0gPSBfX3N1bTsKKwkgIH0KKworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfRGltZW4sIHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIG5vcm1hbF9tdl9kaXN0cmlidXRpb248X0RpbWVuLCBfUmVhbFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfRm9yd2FyZEl0ZXJhdG9yIF9fZiwgX0ZvcndhcmRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8CisJCQkJICAgIF9Gb3J3YXJkSXRlcmF0b3I+KQorCXdoaWxlIChfX2YgIT0gX190KQorCSAgKl9fZisrID0gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIF9fcGFyYW0pOworICAgICAgfQorCisgIHRlbXBsYXRlPHNpemVfdCBfRGltZW4sIHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfX2dudV9jeHg6Om5vcm1hbF9tdl9kaXN0cmlidXRpb248X0RpbWVuLCBfUmVhbFR5cGU+JgorCSAgICAgICBfX2QxLAorCSAgICAgICBjb25zdCBfX2dudV9jeHg6Om5vcm1hbF9tdl9kaXN0cmlidXRpb248X0RpbWVuLCBfUmVhbFR5cGU+JgorCSAgICAgICBfX2QyKQorICAgIHsKKyAgICAgIHJldHVybiBfX2QxLl9NX3BhcmFtID09IF9fZDIuX01fcGFyYW0gJiYgX19kMS5fTV9uZCA9PSBfX2QyLl9NX25kOworICAgIH0KKworICB0ZW1wbGF0ZTxzaXplX3QgX0RpbWVuLCB0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBfX2dudV9jeHg6Om5vcm1hbF9tdl9kaXN0cmlidXRpb248X0RpbWVuLCBfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIGF1dG8gX19tZWFuID0gX194Ll9NX3BhcmFtLm1lYW4oKTsKKyAgICAgIGZvciAoYXV0byBfX2l0IDogX19tZWFuKQorCV9fb3MgPDwgX19pdCA8PCBfX3NwYWNlOworICAgICAgYXV0byBfX3QgPSBfX3guX01fcGFyYW0udmFyY292KCk7CisgICAgICBmb3IgKGF1dG8gX19pdCA6IF9fdCkKKwlfX29zIDw8IF9faXQgPDwgX19zcGFjZTsKKworICAgICAgX19vcyA8PCBfX3guX01fbmQ7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTxzaXplX3QgX0RpbWVuLCB0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBfX2dudV9jeHg6Om5vcm1hbF9tdl9kaXN0cmlidXRpb248X0RpbWVuLCBfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBzdGQ6OmFycmF5PF9SZWFsVHlwZSwgX0RpbWVuPiBfX21lYW47CisgICAgICBmb3IgKGF1dG8mIF9faXQgOiBfX21lYW4pCisJX19pcyA+PiBfX2l0OworICAgICAgc3RkOjphcnJheTxfUmVhbFR5cGUsIF9EaW1lbiAqIChfRGltZW4gKyAxKSAvIDI+IF9fdmFyY292OworICAgICAgZm9yIChhdXRvJiBfX2l0IDogX192YXJjb3YpCisJX19pcyA+PiBfX2l0OworCisgICAgICBfX2lzID4+IF9feC5fTV9uZDsKKworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIG5vcm1hbF9tdl9kaXN0cmlidXRpb248X0RpbWVuLCBfUmVhbFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX21lYW4uYmVnaW4oKSwgX19tZWFuLmVuZCgpLAorCQkJICAgX192YXJjb3YuYmVnaW4oKSwgX192YXJjb3YuZW5kKCkpKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHJpY2VfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9PdXRwdXRJdGVyYXRvciBfX2YsIF9PdXRwdXRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3I+KQorCisJd2hpbGUgKF9fZiAhPSBfX3QpCisJICB7CisJICAgIHR5cGVuYW1lIHN0ZDo6bm9ybWFsX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT46OnBhcmFtX3R5cGUKKwkgICAgICBfX3B4KF9fcC5udSgpLCBfX3Auc2lnbWEoKSksIF9fcHkocmVzdWx0X3R5cGUoMCksIF9fcC5zaWdtYSgpKTsKKwkgICAgcmVzdWx0X3R5cGUgX194ID0gdGhpcy0+X01fbmR4KF9fcHgsIF9fdXJuZyk7CisJICAgIHJlc3VsdF90eXBlIF9feSA9IHRoaXMtPl9NX25keShfX3B5LCBfX3VybmcpOworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKwkgICAgKl9fZisrID0gc3RkOjpoeXBvdChfX3gsIF9feSk7CisjZWxzZQorCSAgICAqX19mKysgPSBzdGQ6OnNxcnQoX194ICogX194ICsgX195ICogX195KTsKKyNlbmRpZgorCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHJpY2VfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3gubnUoKSA8PCBfX3NwYWNlIDw8IF9feC5zaWdtYSgpOworICAgICAgX19vcyA8PCBfX3NwYWNlIDw8IF9feC5fTV9uZHg7CisgICAgICBfX29zIDw8IF9fc3BhY2UgPDwgX194Ll9NX25keTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHJpY2VfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9SZWFsVHlwZSBfX251X3ZhbCwgX19zaWdtYV92YWw7CisgICAgICBfX2lzID4+IF9fbnVfdmFsID4+IF9fc2lnbWFfdmFsOworICAgICAgX19pcyA+PiBfX3guX01fbmR4OworICAgICAgX19pcyA+PiBfX3guX01fbmR5OworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIHJpY2VfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorCQlwYXJhbV90eXBlKF9fbnVfdmFsLCBfX3NpZ21hX3ZhbCkpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgbmFrYWdhbWlfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9PdXRwdXRJdGVyYXRvciBfX2YsIF9PdXRwdXRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3I+KQorCisJdHlwZW5hbWUgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+OjpwYXJhbV90eXBlCisJICBfX3BnKF9fcC5tdSgpLCBfX3Aub21lZ2EoKSAvIF9fcC5tdSgpKTsKKwl3aGlsZSAoX19mICE9IF9fdCkKKwkgICpfX2YrKyA9IHN0ZDo6c3FydCh0aGlzLT5fTV9nZChfX3BnLCBfX3VybmcpKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBuYWthZ2FtaV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5tdSgpIDw8IF9fc3BhY2UgPDwgX194Lm9tZWdhKCk7CisgICAgICBfX29zIDw8IF9fc3BhY2UgPDwgX194Ll9NX2dkOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgbmFrYWdhbWlfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9SZWFsVHlwZSBfX211X3ZhbCwgX19vbWVnYV92YWw7CisgICAgICBfX2lzID4+IF9fbXVfdmFsID4+IF9fb21lZ2FfdmFsOworICAgICAgX19pcyA+PiBfX3guX01fZ2Q7CisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgbmFrYWdhbWlfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorCQlwYXJhbV90eXBlKF9fbXVfdmFsLCBfX29tZWdhX3ZhbCkpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgcGFyZXRvX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfT3V0cHV0SXRlcmF0b3IgX19mLCBfT3V0cHV0SXRlcmF0b3IgX190LAorCQkgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICAgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICB7CisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yPikKKworCXJlc3VsdF90eXBlIF9fbXVfdmFsID0gX19wLm11KCk7CisJcmVzdWx0X3R5cGUgX19tYWxwaGludiA9IC1yZXN1bHRfdHlwZSgxKSAvIF9fcC5hbHBoYSgpOworCXdoaWxlIChfX2YgIT0gX190KQorCSAgKl9fZisrID0gX19tdV92YWwgKiBzdGQ6OnBvdyh0aGlzLT5fTV91ZChfX3VybmcpLCBfX21hbHBoaW52KTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBwYXJldG9fZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3guYWxwaGEoKSA8PCBfX3NwYWNlIDw8IF9feC5tdSgpOworICAgICAgX19vcyA8PCBfX3NwYWNlIDw8IF9feC5fTV91ZDsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHBhcmV0b19kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fYWxwaGFfdmFsLCBfX211X3ZhbDsKKyAgICAgIF9faXMgPj4gX19hbHBoYV92YWwgPj4gX19tdV92YWw7CisgICAgICBfX2lzID4+IF9feC5fTV91ZDsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBwYXJldG9fZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorCQlwYXJhbV90eXBlKF9fYWxwaGFfdmFsLCBfX211X3ZhbCkpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUga19kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIGtfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgeworCXJlc3VsdF90eXBlIF9feCA9IHRoaXMtPl9NX2dkMShfX3VybmcpOworCXJlc3VsdF90eXBlIF9feSA9IHRoaXMtPl9NX2dkMihfX3VybmcpOworCXJldHVybiBzdGQ6OnNxcnQoX194ICogX195KTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBrX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAga19kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICB7CisJdHlwZW5hbWUgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+OjpwYXJhbV90eXBlCisJICBfX3AxKF9fcC5sYW1iZGEoKSwgcmVzdWx0X3R5cGUoMSkgLyBfX3AubGFtYmRhKCkpLAorCSAgX19wMihfX3AubnUoKSwgX19wLm11KCkgLyBfX3AubnUoKSk7CisJcmVzdWx0X3R5cGUgX194ID0gdGhpcy0+X01fZ2QxKF9fcDEsIF9fdXJuZyk7CisJcmVzdWx0X3R5cGUgX195ID0gdGhpcy0+X01fZ2QyKF9fcDIsIF9fdXJuZyk7CisJcmV0dXJuIHN0ZDo6c3FydChfX3ggKiBfX3kpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIGtfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9PdXRwdXRJdGVyYXRvciBfX2YsIF9PdXRwdXRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3I+KQorCisJdHlwZW5hbWUgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+OjpwYXJhbV90eXBlCisJICBfX3AxKF9fcC5sYW1iZGEoKSwgcmVzdWx0X3R5cGUoMSkgLyBfX3AubGFtYmRhKCkpLAorCSAgX19wMihfX3AubnUoKSwgX19wLm11KCkgLyBfX3AubnUoKSk7CisJd2hpbGUgKF9fZiAhPSBfX3QpCisJICB7CisJICAgIHJlc3VsdF90eXBlIF9feCA9IHRoaXMtPl9NX2dkMShfX3AxLCBfX3VybmcpOworCSAgICByZXN1bHRfdHlwZSBfX3kgPSB0aGlzLT5fTV9nZDIoX19wMiwgX191cm5nKTsKKwkgICAgKl9fZisrID0gc3RkOjpzcXJ0KF9feCAqIF9feSk7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3Qga19kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5sYW1iZGEoKSA8PCBfX3NwYWNlIDw8IF9feC5tdSgpIDw8IF9fc3BhY2UgPDwgX194Lm51KCk7CisgICAgICBfX29zIDw8IF9fc3BhY2UgPDwgX194Ll9NX2dkMTsKKyAgICAgIF9fb3MgPDwgX19zcGFjZSA8PCBfX3guX01fZ2QyOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAga19kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fbGFtYmRhX3ZhbCwgX19tdV92YWwsIF9fbnVfdmFsOworICAgICAgX19pcyA+PiBfX2xhbWJkYV92YWwgPj4gX19tdV92YWwgPj4gX19udV92YWw7CisgICAgICBfX2lzID4+IF9feC5fTV9nZDE7CisgICAgICBfX2lzID4+IF9feC5fTV9nZDI7CisgICAgICBfX3gucGFyYW0odHlwZW5hbWUga19kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19sYW1iZGFfdmFsLCBfX211X3ZhbCwgX19udV92YWwpKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIGFyY3NpbmVfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgX19nZW5lcmF0ZV9pbXBsKF9PdXRwdXRJdGVyYXRvciBfX2YsIF9PdXRwdXRJdGVyYXRvciBfX3QsCisJCSAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgICAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3I+KQorCisJcmVzdWx0X3R5cGUgX19kaWYgPSBfX3AuYigpIC0gX19wLmEoKTsKKwlyZXN1bHRfdHlwZSBfX3N1bSA9IF9fcC5hKCkgKyBfX3AuYigpOworCXdoaWxlIChfX2YgIT0gX190KQorCSAgeworCSAgICByZXN1bHRfdHlwZSBfX3ggPSBzdGQ6OnNpbih0aGlzLT5fTV91ZChfX3VybmcpKTsKKwkgICAgKl9fZisrID0gKF9feCAqIF9fZGlmICsgX19zdW0pIC8gcmVzdWx0X3R5cGUoMik7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgYXJjc2luZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5hKCkgPDwgX19zcGFjZSA8PCBfX3guYigpOworICAgICAgX19vcyA8PCBfX3NwYWNlIDw8IF9feC5fTV91ZDsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGFyY3NpbmVfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9SZWFsVHlwZSBfX2EsIF9fYjsKKyAgICAgIF9faXMgPj4gX19hID4+IF9fYjsKKyAgICAgIF9faXMgPj4gX194Ll9NX3VkOworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIGFyY3NpbmVfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorCQlwYXJhbV90eXBlKF9fYSwgX19iKSk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBob3l0X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgaG95dF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgICB7CisJcmVzdWx0X3R5cGUgX194ID0gdGhpcy0+X01fYWQoX191cm5nKTsKKwlyZXN1bHRfdHlwZSBfX3kgPSB0aGlzLT5fTV9lZChfX3VybmcpOworCXJldHVybiAocmVzdWx0X3R5cGUoMikgKiB0aGlzLT5xKCkKKwkJICAvIChyZXN1bHRfdHlwZSgxKSArIHRoaXMtPnEoKSAqIHRoaXMtPnEoKSkpCisJICAgICAgICogc3RkOjpzcXJ0KHRoaXMtPm9tZWdhKCkgKiBfX3ggKiBfX3kpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIGhveXRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnJlc3VsdF90eXBlCisgICAgICBob3l0X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIHsKKwlyZXN1bHRfdHlwZSBfX3EyID0gX19wLnEoKSAqIF9fcC5xKCk7CisJcmVzdWx0X3R5cGUgX19udW0gPSByZXN1bHRfdHlwZSgwLjVMKSAqIChyZXN1bHRfdHlwZSgxKSArIF9fcTIpOworCXR5cGVuYW1lIF9fZ251X2N4eDo6YXJjc2luZV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+OjpwYXJhbV90eXBlCisJICBfX3BhKF9fbnVtLCBfX251bSAvIF9fcTIpOworCXJlc3VsdF90eXBlIF9feCA9IHRoaXMtPl9NX2FkKF9fcGEsIF9fdXJuZyk7CisJcmVzdWx0X3R5cGUgX195ID0gdGhpcy0+X01fZWQoX191cm5nKTsKKwlyZXR1cm4gKHJlc3VsdF90eXBlKDIpICogX19wLnEoKSAvIChyZXN1bHRfdHlwZSgxKSArIF9fcTIpKQorCSAgICAgICAqIHN0ZDo6c3FydChfX3Aub21lZ2EoKSAqIF9feCAqIF9feSk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgaG95dF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX091dHB1dEl0ZXJhdG9yIF9fZiwgX091dHB1dEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvcj4pCisKKwlyZXN1bHRfdHlwZSBfXzJxID0gcmVzdWx0X3R5cGUoMikgKiBfX3AucSgpOworCXJlc3VsdF90eXBlIF9fcTIgPSBfX3AucSgpICogX19wLnEoKTsKKwlyZXN1bHRfdHlwZSBfX3EycDEgPSByZXN1bHRfdHlwZSgxKSArIF9fcTI7CisJcmVzdWx0X3R5cGUgX19udW0gPSByZXN1bHRfdHlwZSgwLjVMKSAqIF9fcTJwMTsKKwlyZXN1bHRfdHlwZSBfX29tZWdhID0gX19wLm9tZWdhKCk7CisJdHlwZW5hbWUgX19nbnVfY3h4OjphcmNzaW5lX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT46OnBhcmFtX3R5cGUKKwkgIF9fcGEoX19udW0sIF9fbnVtIC8gX19xMik7CisJd2hpbGUgKF9fZiAhPSBfX3QpCisJICB7CisJICAgIHJlc3VsdF90eXBlIF9feCA9IHRoaXMtPl9NX2FkKF9fcGEsIF9fdXJuZyk7CisJICAgIHJlc3VsdF90eXBlIF9feSA9IHRoaXMtPl9NX2VkKF9fdXJuZyk7CisJICAgICpfX2YrKyA9IChfXzJxIC8gX19xMnAxKSAqIHN0ZDo6c3FydChfX29tZWdhICogX194ICogX195KTsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBob3l0X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194LnEoKSA8PCBfX3NwYWNlIDw8IF9feC5vbWVnYSgpOworICAgICAgX19vcyA8PCBfX3NwYWNlIDw8IF9feC5fTV9hZDsKKyAgICAgIF9fb3MgPDwgX19zcGFjZSA8PCBfX3guX01fZWQ7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBob3l0X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfUmVhbFR5cGUgX19xLCBfX29tZWdhOworICAgICAgX19pcyA+PiBfX3EgPj4gX19vbWVnYTsKKyAgICAgIF9faXMgPj4gX194Ll9NX2FkOworICAgICAgX19pcyA+PiBfX3guX01fZWQ7CisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgaG95dF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19xLCBfX29tZWdhKSk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICB0cmlhbmd1bGFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIF9fZ2VuZXJhdGVfaW1wbChfT3V0cHV0SXRlcmF0b3IgX19mLCBfT3V0cHV0SXRlcmF0b3IgX190LAorCQkgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICAgICBjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeworCV9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvcj4pCisKKwl3aGlsZSAoX19mICE9IF9fdCkKKwkgICpfX2YrKyA9IHRoaXMtPm9wZXJhdG9yKCkoX191cm5nLCBfX3BhcmFtKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBfX2dudV9jeHg6OnRyaWFuZ3VsYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3guYSgpIDw8IF9fc3BhY2UgPDwgX194LmIoKSA8PCBfX3NwYWNlIDw8IF9feC5jKCk7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBfX2dudV9jeHg6OnRyaWFuZ3VsYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9SZWFsVHlwZSBfX2EsIF9fYiwgX19jOworICAgICAgX19pcyA+PiBfX2EgPj4gX19iID4+IF9fYzsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBfX2dudV9jeHg6OnRyaWFuZ3VsYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorCQlwYXJhbV90eXBlKF9fYSwgX19iLCBfX2MpKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisJICAgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHZvbl9taXNlc19kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBfX2dlbmVyYXRlX2ltcGwoX091dHB1dEl0ZXJhdG9yIF9fZiwgX091dHB1dEl0ZXJhdG9yIF9fdCwKKwkJICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgICAgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwlfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3I+KQorCisJd2hpbGUgKF9fZiAhPSBfX3QpCisJICAqX19mKysgPSB0aGlzLT5vcGVyYXRvcigpKF9fdXJuZywgX19wYXJhbSk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgX19nbnVfY3h4Ojp2b25fbWlzZXNfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3gubXUoKSA8PCBfX3NwYWNlIDw8IF9feC5rYXBwYSgpOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgX19nbnVfY3h4Ojp2b25fbWlzZXNfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9SZWFsVHlwZSBfX211LCBfX2thcHBhOworICAgICAgX19pcyA+PiBfX211ID4+IF9fa2FwcGE7CisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgX19nbnVfY3h4Ojp2b25fbWlzZXNfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorCQlwYXJhbV90eXBlKF9fbXUsIF9fa2FwcGEpKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisKKyNlbmRpZiAvLyBfRVhUX1JBTkRPTV9UQ0MKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3JiX3RyZWUgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9yYl90cmVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NzNkYWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9yYl90cmVlCkBAIC0wLDAgKzEsOTYgQEAKKy8vIHJiX3RyZWUgZXh0ZW5zaW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgZXh0L3JiX3RyZWUKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeSAocG9zc2libHkKKyAqICBjb250YWluaW5nIGV4dGVuc2lvbnMgZnJvbSB0aGUgSFAvU0dJIFNUTCBzdWJzZXQpLiAKKyAqLworCisjaWZuZGVmIF9SQl9UUkVFCisjZGVmaW5lIF9SQl9UUkVFIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9zdGxfdHJlZS5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgc3RkOjpfUmJfdHJlZTsKKyAgdXNpbmcgc3RkOjphbGxvY2F0b3I7CisKKyAgLy8gQ2xhc3MgcmJfdHJlZSBpcyBub3QgcGFydCBvZiB0aGUgQysrIHN0YW5kYXJkLiAgSXQgaXMgcHJvdmlkZWQgZm9yCisgIC8vIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgSFAgU1RMLgorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgICovCisgIHRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlPZlZhbHVlLCBjbGFzcyBfQ29tcGFyZSwKKwkgICAgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPF9WYWx1ZT4gPgorICAgIHN0cnVjdCByYl90cmVlCisgICAgOiBwdWJsaWMgX1JiX3RyZWU8X0tleSwgX1ZhbHVlLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SYl90cmVlPF9LZXksIF9WYWx1ZSwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+IF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIHJiX3RyZWUoY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fY29tcCwgX19hKSB7IH0KKworICAgICAgfnJiX3RyZWUoKSB7IH0KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcmNfc3RyaW5nX2Jhc2UuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3JjX3N0cmluZ19iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1NjRjMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3JjX3N0cmluZ19iYXNlLmgKQEAgLTAsMCArMSw3MzIgQEAKKy8vIFJlZmVyZW5jZS1jb3VudGVkIHZlcnNhdGlsZSBzdHJpbmcgYmFzZSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L3JjX3N0cmluZ19iYXNlLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtleHQvdnN0cmluZy5ofQorICovCisKKyNpZm5kZWYgX1JDX1NUUklOR19CQVNFX0gKKyNkZWZpbmUgX1JDX1NUUklOR19CQVNFX0ggMQorCisjaW5jbHVkZSA8ZXh0L2F0b21pY2l0eS5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfZnVuY3MuaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgRG9jdW1lbnRhdGlvbj8gIFdoYXQncyB0aGF0PworICAgKiAgTmF0aGFuIE15ZXJzIDxuY21AY2FudHJpcC5vcmc+LgorICAgKgorICAgKiAgQSBzdHJpbmcgbG9va3MgbGlrZSB0aGlzOgorICAgKgorICAgKiAgQGNvZGUKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW19SZXBdCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2xlbmd0aAorICAgKiAgIFtfX3JjX3N0cmluZ19iYXNlPGNoYXJfdHlwZT5dICAgICAgICBfTV9jYXBhY2l0eQorICAgKiAgIF9NX2RhdGFwbHVzICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9yZWZjb3VudAorICAgKiAgIF9NX3AgLS0tLS0tLS0tLS0tLS0tLT4gICAgICAgICAgICAgICB1bm5hbWVkIGFycmF5IG9mIGNoYXJfdHlwZQorICAgKiAgQGVuZGNvZGUKKyAgICoKKyAgICogIFdoZXJlIHRoZSBfTV9wIHBvaW50cyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcsIGFuZAorICAgKiAgeW91IGNhc3QgaXQgdG8gYSBwb2ludGVyLXRvLV9SZXAgYW5kIHN1YnRyYWN0IDEgdG8gZ2V0IGEKKyAgICogIHBvaW50ZXIgdG8gdGhlIGhlYWRlci4KKyAgICoKKyAgICogIFRoaXMgYXBwcm9hY2ggaGFzIHRoZSBlbm9ybW91cyBhZHZhbnRhZ2UgdGhhdCBhIHN0cmluZyBvYmplY3QKKyAgICogIHJlcXVpcmVzIG9ubHkgb25lIGFsbG9jYXRpb24uICBBbGwgdGhlIHVnbGluZXNzIGlzIGNvbmZpbmVkCisgICAqICB3aXRoaW4gYSBzaW5nbGUgcGFpciBvZiBpbmxpbmUgZnVuY3Rpb25zLCB3aGljaCBlYWNoIGNvbXBpbGUgdG8KKyAgICogIGEgc2luZ2xlIEBhIGFkZCBpbnN0cnVjdGlvbjogX1JlcDo6X01fcmVmZGF0YSgpLCBhbmQKKyAgICogIF9fcmNfc3RyaW5nX2Jhc2U6Ol9NX3JlcCgpOyBhbmQgdGhlIGFsbG9jYXRpb24gZnVuY3Rpb24gd2hpY2ggZ2V0cyBhCisgICAqICBibG9jayBvZiByYXcgYnl0ZXMgYW5kIHdpdGggcm9vbSBlbm91Z2ggYW5kIGNvbnN0cnVjdHMgYSBfUmVwCisgICAqICBvYmplY3QgYXQgdGhlIGZyb250LgorICAgKgorICAgKiAgVGhlIHJlYXNvbiB5b3Ugd2FudCBfTV9kYXRhIHBvaW50aW5nIHRvIHRoZSBjaGFyYWN0ZXIgYXJyYXkgYW5kCisgICAqICBub3QgdGhlIF9SZXAgaXMgc28gdGhhdCB0aGUgZGVidWdnZXIgY2FuIHNlZSB0aGUgc3RyaW5nCisgICAqICBjb250ZW50cy4gKFByb2JhYmx5IHdlIHNob3VsZCBhZGQgYSBub24taW5saW5lIG1lbWJlciB0byBnZXQKKyAgICogIHRoZSBfUmVwIGZvciB0aGUgZGVidWdnZXIgdG8gdXNlLCBzbyB1c2VycyBjYW4gY2hlY2sgdGhlIGFjdHVhbAorICAgKiAgc3RyaW5nIGxlbmd0aC4pCisgICAqCisgICAqICBOb3RlIHRoYXQgdGhlIF9SZXAgb2JqZWN0IGlzIGEgUE9EIHNvIHRoYXQgeW91IGNhbiBoYXZlIGEKKyAgICogIHN0YXRpYyA8ZW0+ZW1wdHkgc3RyaW5nPC9lbT4gX1JlcCBvYmplY3QgYWxyZWFkeSBAYSBjb25zdHJ1Y3RlZCBiZWZvcmUKKyAgICogIHN0YXRpYyBjb25zdHJ1Y3RvcnMgaGF2ZSBydW4uICBUaGUgcmVmZXJlbmNlLWNvdW50IGVuY29kaW5nIGlzCisgICAqICBjaG9zZW4gc28gdGhhdCBhIDAgaW5kaWNhdGVzIG9uZSByZWZlcmVuY2UsIHNvIHlvdSBuZXZlciB0cnkgdG8KKyAgICogIGRlc3Ryb3kgdGhlIGVtcHR5LXN0cmluZyBfUmVwIG9iamVjdC4KKyAgICoKKyAgICogIEFsbCBidXQgdGhlIGxhc3QgcGFyYWdyYXBoIGlzIGNvbnNpZGVyZWQgcHJldHR5IGNvbnZlbnRpb25hbAorICAgKiAgZm9yIGEgQysrIHN0cmluZyBpbXBsZW1lbnRhdGlvbi4KKyAgKi8KKyB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBfX3JjX3N0cmluZ19iYXNlCisgICAgOiBwcm90ZWN0ZWQgX192c3RyaW5nX3V0aWxpdHk8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RyYWl0cwkJCQkJICAgIHRyYWl0c190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpjaGFyX3R5cGUJCSAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQWxsb2MJCQkJCSAgICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgdHlwZWRlZiBfX3ZzdHJpbmdfdXRpbGl0eTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gICAgX1V0aWxfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1V0aWxfQmFzZTo6X0NoYXJUX2FsbG9jX3R5cGUgICAgICAgIF9DaGFyVF9hbGxvY190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ2hhclRfYWxsb2NfdHlwZTo6c2l6ZV90eXBlCSAgICBzaXplX3R5cGU7CisKKyAgICBwcml2YXRlOgorICAgICAgLy8gX1JlcDogc3RyaW5nIHJlcHJlc2VudGF0aW9uCisgICAgICAvLyAgIEludmFyaWFudHM6CisgICAgICAvLyAgIDEuIFN0cmluZyByZWFsbHkgY29udGFpbnMgX01fbGVuZ3RoICsgMSBjaGFyYWN0ZXJzOiBkdWUgdG8gMjEuMy40CisgICAgICAvLyAgICAgIG11c3QgYmUga2VwdCBudWxsLXRlcm1pbmF0ZWQuCisgICAgICAvLyAgIDIuIF9NX2NhcGFjaXR5ID49IF9NX2xlbmd0aAorICAgICAgLy8gICAgICBBbGxvY2F0ZWQgbWVtb3J5IGlzIGFsd2F5cyAoX01fY2FwYWNpdHkgKyAxKSAqIHNpemVvZihfQ2hhclQpLgorICAgICAgLy8gICAzLiBfTV9yZWZjb3VudCBoYXMgdGhyZWUgc3RhdGVzOgorICAgICAgLy8gICAgICAtMTogbGVha2VkLCBvbmUgcmVmZXJlbmNlLCBubyByZWYtY29waWVzIGFsbG93ZWQsIG5vbi1jb25zdC4KKyAgICAgIC8vICAgICAgIDA6IG9uZSByZWZlcmVuY2UsIG5vbi1jb25zdC4KKyAgICAgIC8vICAgICBuPjA6IG4gKyAxIHJlZmVyZW5jZXMsIG9wZXJhdGlvbnMgcmVxdWlyZSBhIGxvY2ssIGNvbnN0LgorICAgICAgLy8gICA0LiBBbGwgZmllbGRzID09IDAgaXMgYW4gZW1wdHkgc3RyaW5nLCBnaXZlbiB0aGUgZXh0cmEgc3RvcmFnZQorICAgICAgLy8gICAgICBiZXlvbmQtdGhlLWVuZCBmb3IgYSBudWxsIHRlcm1pbmF0b3I7IHRodXMsIHRoZSBzaGFyZWQKKyAgICAgIC8vICAgICAgZW1wdHkgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG5lZWRzIG5vIGNvbnN0cnVjdG9yLgorICAgICAgc3RydWN0IF9SZXAKKyAgICAgIHsKKwl1bmlvbgorCXsKKwkgIHN0cnVjdAorCSAgeworCSAgICBzaXplX3R5cGUJICAgIF9NX2xlbmd0aDsKKwkgICAgc2l6ZV90eXBlCSAgICBfTV9jYXBhY2l0eTsKKwkgICAgX0F0b21pY193b3JkICAgIF9NX3JlZmNvdW50OworCSAgfSAgICAgICAgICAgICAgICAgX01faW5mbzsKKworCSAgLy8gT25seSBmb3IgYWxpZ25tZW50IHB1cnBvc2VzLgorCSAgX0NoYXJUICAgICAgICAgICAgX01fYWxpZ247CisJfTsKKworCXR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X1JlcD46Om90aGVyIF9SZXBfYWxsb2NfdHlwZTsKKworIAlfQ2hhclQqCisJX01fcmVmZGF0YSgpIHRocm93KCkKKwl7IHJldHVybiByZWludGVycHJldF9jYXN0PF9DaGFyVCo+KHRoaXMgKyAxKTsgfQorCisJX0NoYXJUKgorCV9NX3JlZmNvcHkoKSB0aHJvdygpCisJeworCSAgX19hdG9taWNfYWRkX2Rpc3BhdGNoKCZfTV9pbmZvLl9NX3JlZmNvdW50LCAxKTsKKwkgIHJldHVybiBfTV9yZWZkYXRhKCk7CisJfSAgLy8gWFhYIE1UCisKKwl2b2lkCisJX01fc2V0X2xlbmd0aChzaXplX3R5cGUgX19uKQorCXsKKwkgIF9NX2luZm8uX01fcmVmY291bnQgPSAwOyAgLy8gT25lIHJlZmVyZW5jZS4KKwkgIF9NX2luZm8uX01fbGVuZ3RoID0gX19uOworCSAgLy8gZ3Jyci4gKHBlciAyMS4zLjQpCisJICAvLyBZb3UgY2Fubm90IGxlYXZlIHRob3NlIExXRyBwZW9wbGUgYWxvbmUgZm9yIGEgc2Vjb25kLgorCSAgdHJhaXRzX3R5cGU6OmFzc2lnbihfTV9yZWZkYXRhKClbX19uXSwgX0NoYXJUKCkpOworCX0KKworCS8vIENyZWF0ZSAmIERlc3Ryb3kKKwlzdGF0aWMgX1JlcCoKKwlfU19jcmVhdGUoc2l6ZV90eXBlLCBzaXplX3R5cGUsIGNvbnN0IF9BbGxvYyYpOworCisJdm9pZAorCV9NX2Rlc3Ryb3koY29uc3QgX0FsbG9jJikgdGhyb3coKTsKKworCV9DaGFyVCoKKwlfTV9jbG9uZShjb25zdCBfQWxsb2MmLCBzaXplX3R5cGUgX19yZXMgPSAwKTsKKyAgICAgIH07CisKKyAgICAgIHN0cnVjdCBfUmVwX2VtcHR5CisgICAgICA6IHB1YmxpYyBfUmVwCisgICAgICB7CisJX0NoYXJUICAgICAgICAgICAgICBfTV90ZXJtaW5hbDsKKyAgICAgIH07CisKKyAgICAgIHN0YXRpYyBfUmVwX2VtcHR5ICAgICBfU19lbXB0eV9yZXA7CisKKyAgICAgIC8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmRpdmlkdWFsIGNoYXJfdHlwZSBlbGVtZW50cyBvZiBhbgorICAgICAgLy8gaW5kaXZpZHVhbCBzdHJpbmcgaXMgZGV0ZXJtaW5lZCBieSBfU19tYXhfc2l6ZS4gVGhpcyBpcyB0aGUKKyAgICAgIC8vIHZhbHVlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSBtYXhfc2l6ZSgpLiAgKFdoZXJlYXMgbnBvcworICAgICAgLy8gaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoZSBhbGxvY2F0b3IgY2FuIGFsbG9jYXRlLikKKyAgICAgIC8vIElmIG9uZSB3YXMgdG8gZGl2dnkgdXAgdGhlIHRoZW9yZXRpY2FsIGxhcmdlc3Qgc2l6ZSBzdHJpbmcsCisgICAgICAvLyB3aXRoIGEgdGVybWluYXRpbmcgY2hhcmFjdGVyIGFuZCBtIF9DaGFyVCBlbGVtZW50cywgaXQnZAorICAgICAgLy8gbG9vayBsaWtlIHRoaXM6CisgICAgICAvLyBucG9zID0gc2l6ZW9mKF9SZXApICsgKG0gKiBzaXplb2YoX0NoYXJUKSkgKyBzaXplb2YoX0NoYXJUKQorICAgICAgLy8gICAgICAgICsgc2l6ZW9mKF9SZXApIC0gMQorICAgICAgLy8gKE5COiBsYXN0IHR3byB0ZXJtcyBmb3Igcm91bmRpbmcgcmVhc29ucywgc2VlIF9NX2NyZWF0ZSBiZWxvdykKKyAgICAgIC8vIFNvbHZpbmcgZm9yIG06CisgICAgICAvLyBtID0gKChucG9zIC0gMiAqIHNpemVvZihfUmVwKSArIDEpIC8gc2l6ZW9mKF9DaGFyVCkpIC0gMQorICAgICAgLy8gSW4gYWRkaXRpb24sIHRoaXMgaW1wbGVtZW50YXRpb24gaGFsdmVzIHRoaXMgYW1vdW50LgorICAgICAgZW51bSB7IF9TX21heF9zaXplID0gKCgoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPigtMSkgLSAyICogc2l6ZW9mKF9SZXApCisJCQkgICAgICArIDEpIC8gc2l6ZW9mKF9DaGFyVCkpIC0gMSkgLyAyIH07CisKKyAgICAgIC8vIERhdGEgTWVtYmVyIChwcml2YXRlKToKKyAgICAgIG11dGFibGUgdHlwZW5hbWUgX1V0aWxfQmFzZTo6dGVtcGxhdGUgX0FsbG9jX2hpZGVyPF9BbGxvYz4gIF9NX2RhdGFwbHVzOworCisgICAgICB2b2lkCisgICAgICBfTV9kYXRhKF9DaGFyVCogX19wKQorICAgICAgeyBfTV9kYXRhcGx1cy5fTV9wID0gX19wOyB9CisKKyAgICAgIF9SZXAqCisgICAgICBfTV9yZXAoKSBjb25zdAorICAgICAgeyByZXR1cm4gJigocmVpbnRlcnByZXRfY2FzdDxfUmVwKj4oX01fZGF0YSgpKSlbLTFdKTsgfQorCisgICAgICBfQ2hhclQqCisgICAgICBfTV9ncmFiKGNvbnN0IF9BbGxvYyYgX19hbGxvYykgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gKCFfTV9pc19sZWFrZWQoKSAmJiBfTV9nZXRfYWxsb2NhdG9yKCkgPT0gX19hbGxvYykKKwkJPyBfTV9yZXAoKS0+X01fcmVmY29weSgpIDogX01fcmVwKCktPl9NX2Nsb25lKF9fYWxsb2MpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kaXNwb3NlKCkKKyAgICAgIHsKKwkvLyBCZSByYWNlLWRldGVjdG9yLWZyaWVuZGx5LiAgRm9yIG1vcmUgaW5mbyBzZWUgYml0cy9jKytjb25maWcuCisJX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQkVGT1JFKCZfTV9yZXAoKS0+X01faW5mby4KKwkJCQkJCV9NX3JlZmNvdW50KTsKKwlpZiAoX19leGNoYW5nZV9hbmRfYWRkX2Rpc3BhdGNoKCZfTV9yZXAoKS0+X01faW5mby5fTV9yZWZjb3VudCwKKwkJCQkJLTEpIDw9IDApCisJICB7CisJICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0FGVEVSKCZfTV9yZXAoKS0+X01faW5mby4KKwkJCQkJCSAgIF9NX3JlZmNvdW50KTsKKwkgICAgX01fcmVwKCktPl9NX2Rlc3Ryb3koX01fZ2V0X2FsbG9jYXRvcigpKTsKKwkgIH0KKyAgICAgIH0gIC8vIFhYWCBNVAorCisgICAgICBib29sCisgICAgICBfTV9pc19sZWFrZWQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcmVwKCktPl9NX2luZm8uX01fcmVmY291bnQgPCAwOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3NldF9zaGFyYWJsZSgpCisgICAgICB7IF9NX3JlcCgpLT5fTV9pbmZvLl9NX3JlZmNvdW50ID0gMDsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9sZWFrX2hhcmQoKTsKKworICAgICAgLy8gX1NfY29uc3RydWN0X2F1eCBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgMjEuMy4xIHBhcmEgMTUgd2hpY2gKKyAgICAgIC8vIHJlcXVpcmVzIHNwZWNpYWwgYmVoYXZpb3VyIGlmIF9Jbkl0ZXJhdG9yIGlzIGFuIGludGVncmFsIHR5cGUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXJhdG9yPgorCXN0YXRpYyBfQ2hhclQqCisJX1NfY29uc3RydWN0X2F1eChfSW5JdGVyYXRvciBfX2JlZywgX0luSXRlcmF0b3IgX19lbmQsCisJCQkgY29uc3QgX0FsbG9jJiBfX2EsIHN0ZDo6X19mYWxzZV90eXBlKQorCXsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Jbkl0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnkgX1RhZzsKKwkgIHJldHVybiBfU19jb25zdHJ1Y3QoX19iZWcsIF9fZW5kLCBfX2EsIF9UYWcoKSk7CisJfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzguIEFtYmlndWl0eSBpbiB0aGUgImRvIHRoZSByaWdodCB0aGluZyIgY2xhdXNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZWdlcj4KKwlzdGF0aWMgX0NoYXJUKgorCV9TX2NvbnN0cnVjdF9hdXgoX0ludGVnZXIgX19iZWcsIF9JbnRlZ2VyIF9fZW5kLAorCQkJIGNvbnN0IF9BbGxvYyYgX19hLCBzdGQ6Ol9fdHJ1ZV90eXBlKQorCXsgcmV0dXJuIF9TX2NvbnN0cnVjdF9hdXhfMihzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fYmVnKSwKKwkJCQkgICAgX19lbmQsIF9fYSk7IH0KKworICAgICAgc3RhdGljIF9DaGFyVCoKKyAgICAgIF9TX2NvbnN0cnVjdF9hdXhfMihzaXplX3R5cGUgX19yZXEsIF9DaGFyVCBfX2MsIGNvbnN0IF9BbGxvYyYgX19hKQorICAgICAgeyByZXR1cm4gX1NfY29uc3RydWN0KF9fcmVxLCBfX2MsIF9fYSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlcmF0b3I+CisJc3RhdGljIF9DaGFyVCoKKwlfU19jb25zdHJ1Y3QoX0luSXRlcmF0b3IgX19iZWcsIF9Jbkl0ZXJhdG9yIF9fZW5kLCBjb25zdCBfQWxsb2MmIF9fYSkKKwl7CisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19pc19pbnRlZ2VyPF9Jbkl0ZXJhdG9yPjo6X190eXBlIF9JbnRlZ3JhbDsKKwkgIHJldHVybiBfU19jb25zdHJ1Y3RfYXV4KF9fYmVnLCBfX2VuZCwgX19hLCBfSW50ZWdyYWwoKSk7CisJfQorCisgICAgICAvLyBGb3IgSW5wdXQgSXRlcmF0b3JzLCB1c2VkIGluIGlzdHJlYW1idWZfaXRlcmF0b3JzLCBldGMuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyYXRvcj4KKwlzdGF0aWMgX0NoYXJUKgorCSBfU19jb25zdHJ1Y3QoX0luSXRlcmF0b3IgX19iZWcsIF9Jbkl0ZXJhdG9yIF9fZW5kLCBjb25zdCBfQWxsb2MmIF9fYSwKKwkJICAgICAgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpOworCisgICAgICAvLyBGb3IgZm9yd2FyZF9pdGVyYXRvcnMgdXAgdG8gcmFuZG9tX2FjY2Vzc19pdGVyYXRvcnMsIHVzZWQgZm9yCisgICAgICAvLyBzdHJpbmc6Oml0ZXJhdG9yLCBfQ2hhclQqLCBldGMuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRndkSXRlcmF0b3I+CisJc3RhdGljIF9DaGFyVCoKKwlfU19jb25zdHJ1Y3QoX0Z3ZEl0ZXJhdG9yIF9fYmVnLCBfRndkSXRlcmF0b3IgX19lbmQsIGNvbnN0IF9BbGxvYyYgX19hLAorCQkgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpOworCisgICAgICBzdGF0aWMgX0NoYXJUKgorICAgICAgX1NfY29uc3RydWN0KHNpemVfdHlwZSBfX3JlcSwgX0NoYXJUIF9fYywgY29uc3QgX0FsbG9jJiBfX2EpOworCisgICAgcHVibGljOgorICAgICAgc2l6ZV90eXBlCisgICAgICBfTV9tYXhfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBzaXplX3R5cGUoX1NfbWF4X3NpemUpOyB9CisKKyAgICAgIF9DaGFyVCoKKyAgICAgIF9NX2RhdGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGF0YXBsdXMuX01fcDsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX2xlbmd0aCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9yZXAoKS0+X01faW5mby5fTV9sZW5ndGg7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBfTV9jYXBhY2l0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9yZXAoKS0+X01faW5mby5fTV9jYXBhY2l0eTsgfQorCisgICAgICBib29sCisgICAgICBfTV9pc19zaGFyZWQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcmVwKCktPl9NX2luZm8uX01fcmVmY291bnQgPiAwOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3NldF9sZWFrZWQoKQorICAgICAgeyBfTV9yZXAoKS0+X01faW5mby5fTV9yZWZjb3VudCA9IC0xOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2xlYWsoKSAgICAvLyBmb3IgdXNlIGluIGJlZ2luKCkgJiBub24tY29uc3Qgb3BbXQorICAgICAgeworCWlmICghX01faXNfbGVha2VkKCkpCisJICBfTV9sZWFrX2hhcmQoKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fc2V0X2xlbmd0aChzaXplX3R5cGUgX19uKQorICAgICAgeyBfTV9yZXAoKS0+X01fc2V0X2xlbmd0aChfX24pOyB9CisKKyAgICAgIF9fcmNfc3RyaW5nX2Jhc2UoKQorICAgICAgOiBfTV9kYXRhcGx1cyhfU19lbXB0eV9yZXAuX01fcmVmY29weSgpKSB7IH0KKworICAgICAgX19yY19zdHJpbmdfYmFzZShjb25zdCBfQWxsb2MmIF9fYSk7CisKKyAgICAgIF9fcmNfc3RyaW5nX2Jhc2UoY29uc3QgX19yY19zdHJpbmdfYmFzZSYgX19yY3MpOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgX19yY19zdHJpbmdfYmFzZShfX3JjX3N0cmluZ19iYXNlJiYgX19yY3MpCisgICAgICA6IF9NX2RhdGFwbHVzKF9fcmNzLl9NX2RhdGFwbHVzKQorICAgICAgeyBfX3Jjcy5fTV9kYXRhKF9TX2VtcHR5X3JlcC5fTV9yZWZjb3B5KCkpOyB9CisjZW5kaWYKKworICAgICAgX19yY19zdHJpbmdfYmFzZShzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jLCBjb25zdCBfQWxsb2MmIF9fYSk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCV9fcmNfc3RyaW5nX2Jhc2UoX0lucHV0SXRlcmF0b3IgX19iZWcsIF9JbnB1dEl0ZXJhdG9yIF9fZW5kLAorCQkJIGNvbnN0IF9BbGxvYyYgX19hKTsKKworICAgICAgfl9fcmNfc3RyaW5nX2Jhc2UoKQorICAgICAgeyBfTV9kaXNwb3NlKCk7IH0KKworICAgICAgYWxsb2NhdG9yX3R5cGUmCisgICAgICBfTV9nZXRfYWxsb2NhdG9yKCkKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGFwbHVzOyB9CisKKyAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJgorICAgICAgX01fZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kYXRhcGx1czsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zd2FwKF9fcmNfc3RyaW5nX2Jhc2UmIF9fcmNzKTsKKworICAgICAgdm9pZAorICAgICAgX01fYXNzaWduKGNvbnN0IF9fcmNfc3RyaW5nX2Jhc2UmIF9fcmNzKTsKKworICAgICAgdm9pZAorICAgICAgX01fcmVzZXJ2ZShzaXplX3R5cGUgX19yZXMpOworCisgICAgICB2b2lkCisgICAgICBfTV9tdXRhdGUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19sZW4xLCBjb25zdCBfQ2hhclQqIF9fcywKKwkJc2l6ZV90eXBlIF9fbGVuMik7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2VyYXNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbik7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2NsZWFyKCkKKyAgICAgIHsgX01fZXJhc2Uoc2l6ZV90eXBlKDApLCBfTV9sZW5ndGgoKSk7IH0KKworICAgICAgYm9vbAorICAgICAgX01fY29tcGFyZShjb25zdCBfX3JjX3N0cmluZ19iYXNlJikgY29uc3QKKyAgICAgIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBfX3JjX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6X1JlcF9lbXB0eQorICAgIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpfU19lbXB0eV9yZXA7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Ol9SZXAqCisgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Ol9SZXA6OgorICAgIF9TX2NyZWF0ZShzaXplX3R5cGUgX19jYXBhY2l0eSwgc2l6ZV90eXBlIF9fb2xkX2NhcGFjaXR5LAorCSAgICAgIGNvbnN0IF9BbGxvYyYgX19hbGxvYykKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA4My4gIFN0cmluZzo6bnBvcyB2cy4gc3RyaW5nOjptYXhfc2l6ZSgpCisgICAgICBpZiAoX19jYXBhY2l0eSA+IHNpemVfdHlwZShfU19tYXhfc2l6ZSkpCisJc3RkOjpfX3Rocm93X2xlbmd0aF9lcnJvcihfX04oIl9fcmNfc3RyaW5nX2Jhc2U6Ol9SZXA6Ol9TX2NyZWF0ZSIpKTsKKworICAgICAgLy8gVGhlIHN0YW5kYXJkIHBsYWNlcyBubyByZXN0cmljdGlvbiBvbiBhbGxvY2F0aW5nIG1vcmUgbWVtb3J5CisgICAgICAvLyB0aGFuIGlzIHN0cmljdGx5IG5lZWRlZCB3aXRoaW4gdGhpcyBsYXllciBhdCB0aGUgbW9tZW50IG9yIGFzCisgICAgICAvLyByZXF1ZXN0ZWQgYnkgYW4gZXhwbGljaXQgYXBwbGljYXRpb24gY2FsbCB0byByZXNlcnZlKCkuCisKKyAgICAgIC8vIE1hbnkgbWFsbG9jIGltcGxlbWVudGF0aW9ucyBwZXJmb3JtIHF1aXRlIHBvb3JseSB3aGVuIGFuCisgICAgICAvLyBhcHBsaWNhdGlvbiBhdHRlbXB0cyB0byBhbGxvY2F0ZSBtZW1vcnkgaW4gYSBzdGVwd2lzZSBmYXNoaW9uCisgICAgICAvLyBncm93aW5nIGVhY2ggYWxsb2NhdGlvbiBzaXplIGJ5IG9ubHkgMSBjaGFyLiAgQWRkaXRpb25hbGx5LAorICAgICAgLy8gaXQgbWFrZXMgbGl0dGxlIHNlbnNlIHRvIGFsbG9jYXRlIGxlc3MgbGluZWFyIG1lbW9yeSB0aGFuIHRoZQorICAgICAgLy8gbmF0dXJhbCBibG9ja2luZyBzaXplIG9mIHRoZSBtYWxsb2MgaW1wbGVtZW50YXRpb24uCisgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB3ZSB3b3VsZCBuZWVkIGEgc29tZXdoYXQgbG93LWxldmVsIGNhbGN1bGF0aW9uCisgICAgICAvLyB3aXRoIHR1bmVkIHBhcmFtZXRlcnMgdG8gZ2V0IHRoaXMgcGVyZmVjdCBmb3IgYW55IHBhcnRpY3VsYXIKKyAgICAgIC8vIG1hbGxvYyBpbXBsZW1lbnRhdGlvbi4gIEZvcnR1bmF0ZWx5LCBnZW5lcmFsaXphdGlvbnMgYWJvdXQKKyAgICAgIC8vIGNvbW1vbiBmZWF0dXJlcyBzZWVuIGFtb25nIGltcGxlbWVudGF0aW9ucyBzZWVtcyB0byBzdWZmaWNlLgorCisgICAgICAvLyBfX3BhZ2VzaXplIG5lZWQgbm90IG1hdGNoIHRoZSBhY3R1YWwgVk0gcGFnZSBzaXplIGZvciBnb29kCisgICAgICAvLyByZXN1bHRzIGluIHByYWN0aWNlLCB0aHVzIHdlIHBpY2sgYSBjb21tb24gdmFsdWUgb24gdGhlIGxvdworICAgICAgLy8gc2lkZS4gIF9fbWFsbG9jX2hlYWRlcl9zaXplIGlzIGFuIGVzdGltYXRlIG9mIHRoZSBhbW91bnQgb2YKKyAgICAgIC8vIG92ZXJoZWFkIHBlciBtZW1vcnkgYWxsb2NhdGlvbiAoaW4gcHJhY3RpY2Ugc2VlbiBOICogc2l6ZW9mCisgICAgICAvLyAodm9pZCopIHdoZXJlIE4gaXMgMCwgMiBvciA0KS4gIEFjY29yZGluZyB0byBmb2xrbG9yZSwKKyAgICAgIC8vIHBpY2tpbmcgdGhpcyB2YWx1ZSBvbiB0aGUgaGlnaCBzaWRlIGlzIGJldHRlciB0aGFuCisgICAgICAvLyBsb3ctYmFsbGluZyBpdCAoZXNwZWNpYWxseSB3aGVuIHRoaXMgYWxnb3JpdGhtIGlzIHVzZWQgd2l0aAorICAgICAgLy8gbWFsbG9jIGltcGxlbWVudGF0aW9ucyB0aGF0IGFsbG9jYXRlIG1lbW9yeSBibG9ja3Mgcm91bmRlZCB1cAorICAgICAgLy8gdG8gYSBzaXplIHdoaWNoIGlzIGEgcG93ZXIgb2YgMikuCisgICAgICBjb25zdCBzaXplX3R5cGUgX19wYWdlc2l6ZSA9IDQwOTY7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19tYWxsb2NfaGVhZGVyX3NpemUgPSA0ICogc2l6ZW9mKHZvaWQqKTsKKworICAgICAgLy8gVGhlIGJlbG93IGltcGxlbWVudHMgYW4gZXhwb25lbnRpYWwgZ3Jvd3RoIHBvbGljeSwgbmVjZXNzYXJ5IHRvCisgICAgICAvLyBtZWV0IGFtb3J0aXplZCBsaW5lYXIgdGltZSByZXF1aXJlbWVudHMgb2YgdGhlIGxpYnJhcnk6IHNlZQorICAgICAgLy8gaHR0cDovL2djYy5nbnUub3JnL21sL2xpYnN0ZGMrKy8yMDAxLTA3L21zZzAwMDg1Lmh0bWwuCisgICAgICBpZiAoX19jYXBhY2l0eSA+IF9fb2xkX2NhcGFjaXR5ICYmIF9fY2FwYWNpdHkgPCAyICogX19vbGRfY2FwYWNpdHkpCisJeworCSAgX19jYXBhY2l0eSA9IDIgKiBfX29sZF9jYXBhY2l0eTsKKwkgIC8vIE5ldmVyIGFsbG9jYXRlIGEgc3RyaW5nIGJpZ2dlciB0aGFuIF9TX21heF9zaXplLgorCSAgaWYgKF9fY2FwYWNpdHkgPiBzaXplX3R5cGUoX1NfbWF4X3NpemUpKQorCSAgICBfX2NhcGFjaXR5ID0gc2l6ZV90eXBlKF9TX21heF9zaXplKTsKKwl9CisKKyAgICAgIC8vIE5COiBOZWVkIGFuIGFycmF5IG9mIGNoYXJfdHlwZVtfX2NhcGFjaXR5XSwgcGx1cyBhIHRlcm1pbmF0aW5nCisgICAgICAvLyBudWxsIGNoYXJfdHlwZSgpIGVsZW1lbnQsIHBsdXMgZW5vdWdoIGZvciB0aGUgX1JlcCBkYXRhIHN0cnVjdHVyZSwKKyAgICAgIC8vIHBsdXMgc2l6ZW9mKF9SZXApIC0gMSB0byB1cHBlciByb3VuZCB0byBhIHNpemUgbXVsdGlwbGUgb2YKKyAgICAgIC8vIHNpemVvZihfUmVwKS4KKyAgICAgIC8vIFdoZXcuIFNlZW1pbmdseSBzbyBuZWVkeSwgeWV0IHNvIGVsZW1lbnRhbC4KKyAgICAgIHNpemVfdHlwZSBfX3NpemUgPSAoKF9fY2FwYWNpdHkgKyAxKSAqIHNpemVvZihfQ2hhclQpCisJCQkgICsgMiAqIHNpemVvZihfUmVwKSAtIDEpOworCisgICAgICBjb25zdCBzaXplX3R5cGUgX19hZGpfc2l6ZSA9IF9fc2l6ZSArIF9fbWFsbG9jX2hlYWRlcl9zaXplOworICAgICAgaWYgKF9fYWRqX3NpemUgPiBfX3BhZ2VzaXplICYmIF9fY2FwYWNpdHkgPiBfX29sZF9jYXBhY2l0eSkKKwl7CisJICBjb25zdCBzaXplX3R5cGUgX19leHRyYSA9IF9fcGFnZXNpemUgLSBfX2Fkal9zaXplICUgX19wYWdlc2l6ZTsKKwkgIF9fY2FwYWNpdHkgKz0gX19leHRyYSAvIHNpemVvZihfQ2hhclQpOworCSAgaWYgKF9fY2FwYWNpdHkgPiBzaXplX3R5cGUoX1NfbWF4X3NpemUpKQorCSAgICBfX2NhcGFjaXR5ID0gc2l6ZV90eXBlKF9TX21heF9zaXplKTsKKwkgIF9fc2l6ZSA9IChfX2NhcGFjaXR5ICsgMSkgKiBzaXplb2YoX0NoYXJUKSArIDIgKiBzaXplb2YoX1JlcCkgLSAxOworCX0KKworICAgICAgLy8gTkI6IE1pZ2h0IHRocm93LCBidXQgbm8gd29ycmllcyBhYm91dCBhIGxlYWssIG1hdGU6IF9SZXAoKQorICAgICAgLy8gZG9lcyBub3QgdGhyb3cuCisgICAgICBfUmVwKiBfX3BsYWNlID0gX1JlcF9hbGxvY190eXBlKF9fYWxsb2MpLmFsbG9jYXRlKF9fc2l6ZSAvIHNpemVvZihfUmVwKSk7CisgICAgICBfUmVwKiBfX3AgPSBuZXcgKF9fcGxhY2UpIF9SZXA7CisgICAgICBfX3AtPl9NX2luZm8uX01fY2FwYWNpdHkgPSBfX2NhcGFjaXR5OworICAgICAgcmV0dXJuIF9fcDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpfUmVwOjoKKyAgICBfTV9kZXN0cm95KGNvbnN0IF9BbGxvYyYgX19hKSB0aHJvdyAoKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSAoKF9NX2luZm8uX01fY2FwYWNpdHkgKyAxKSAqIHNpemVvZihfQ2hhclQpCisJCQkJKyAyICogc2l6ZW9mKF9SZXApIC0gMSk7CisgICAgICBfUmVwX2FsbG9jX3R5cGUoX19hKS5kZWFsbG9jYXRlKHRoaXMsIF9fc2l6ZSAvIHNpemVvZihfUmVwKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9DaGFyVCoKKyAgICBfX3JjX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6X1JlcDo6CisgICAgX01fY2xvbmUoY29uc3QgX0FsbG9jJiBfX2FsbG9jLCBzaXplX3R5cGUgX19yZXMpCisgICAgeworICAgICAgLy8gUmVxdWVzdGVkIGNhcGFjaXR5IG9mIHRoZSBjbG9uZS4KKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3JlcXVlc3RlZF9jYXAgPSBfTV9pbmZvLl9NX2xlbmd0aCArIF9fcmVzOworICAgICAgX1JlcCogX19yID0gX1JlcDo6X1NfY3JlYXRlKF9fcmVxdWVzdGVkX2NhcCwgX01faW5mby5fTV9jYXBhY2l0eSwKKwkJCQkgIF9fYWxsb2MpOworCisgICAgICBpZiAoX01faW5mby5fTV9sZW5ndGgpCisJX19yY19zdHJpbmdfYmFzZTo6X1NfY29weShfX3ItPl9NX3JlZmRhdGEoKSwgX01fcmVmZGF0YSgpLCBfTV9pbmZvLl9NX2xlbmd0aCk7CisKKyAgICAgIF9fci0+X01fc2V0X2xlbmd0aChfTV9pbmZvLl9NX2xlbmd0aCk7CisgICAgICByZXR1cm4gX19yLT5fTV9yZWZkYXRhKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfX3JjX3N0cmluZ19iYXNlKGNvbnN0IF9BbGxvYyYgX19hKQorICAgIDogX01fZGF0YXBsdXMoX19hLCBfU19jb25zdHJ1Y3Qoc2l6ZV90eXBlKCksIF9DaGFyVCgpLCBfX2EpKSB7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBfX3JjX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX19yY19zdHJpbmdfYmFzZShjb25zdCBfX3JjX3N0cmluZ19iYXNlJiBfX3JjcykKKyAgICA6IF9NX2RhdGFwbHVzKF9fcmNzLl9NX2dldF9hbGxvY2F0b3IoKSwKKwkJICBfX3Jjcy5fTV9ncmFiKF9fcmNzLl9NX2dldF9hbGxvY2F0b3IoKSkpIHsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfX3JjX3N0cmluZ19iYXNlKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsIGNvbnN0IF9BbGxvYyYgX19hKQorICAgIDogX01fZGF0YXBsdXMoX19hLCBfU19jb25zdHJ1Y3QoX19uLCBfX2MsIF9fYSkpIHsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfX3JjX3N0cmluZ19iYXNlKF9JbnB1dEl0ZXJhdG9yIF9fYmVnLCBfSW5wdXRJdGVyYXRvciBfX2VuZCwKKwkJICAgICBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICA6IF9NX2RhdGFwbHVzKF9fYSwgX1NfY29uc3RydWN0KF9fYmVnLCBfX2VuZCwgX19hKSkgeyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfTV9sZWFrX2hhcmQoKQorICAgIHsKKyAgICAgIGlmIChfTV9pc19zaGFyZWQoKSkKKwlfTV9lcmFzZSgwLCAwKTsKKyAgICAgIF9NX3NldF9sZWFrZWQoKTsKKyAgICB9CisKKyAgLy8gTkI6IFRoaXMgaXMgdGhlIHNwZWNpYWwgY2FzZSBmb3IgSW5wdXQgSXRlcmF0b3JzLCB1c2VkIGluCisgIC8vIGlzdHJlYW1idWZfaXRlcmF0b3JzLCBldGMuCisgIC8vIElucHV0IEl0ZXJhdG9ycyBoYXZlIGEgY29zdCBzdHJ1Y3R1cmUgdmVyeSBkaWZmZXJlbnQgZnJvbQorICAvLyBwb2ludGVycywgY2FsbGluZyBmb3IgYSBkaWZmZXJlbnQgY29kaW5nIHN0eWxlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyYXRvcj4KKyAgICAgIF9DaGFyVCoKKyAgICAgIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICAgIF9TX2NvbnN0cnVjdChfSW5JdGVyYXRvciBfX2JlZywgX0luSXRlcmF0b3IgX19lbmQsIGNvbnN0IF9BbGxvYyYgX19hLAorCQkgICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKwlpZiAoX19iZWcgPT0gX19lbmQgJiYgX19hID09IF9BbGxvYygpKQorCSAgcmV0dXJuIF9TX2VtcHR5X3JlcC5fTV9yZWZjb3B5KCk7CisKKwkvLyBBdm9pZCByZWFsbG9jYXRpb24gZm9yIGNvbW1vbiBjYXNlLgorCV9DaGFyVCBfX2J1ZlsxMjhdOworCXNpemVfdHlwZSBfX2xlbiA9IDA7CisJd2hpbGUgKF9fYmVnICE9IF9fZW5kICYmIF9fbGVuIDwgc2l6ZW9mKF9fYnVmKSAvIHNpemVvZihfQ2hhclQpKQorCSAgeworCSAgICBfX2J1ZltfX2xlbisrXSA9ICpfX2JlZzsKKwkgICAgKytfX2JlZzsKKwkgIH0KKwlfUmVwKiBfX3IgPSBfUmVwOjpfU19jcmVhdGUoX19sZW4sIHNpemVfdHlwZSgwKSwgX19hKTsKKwlfU19jb3B5KF9fci0+X01fcmVmZGF0YSgpLCBfX2J1ZiwgX19sZW4pOworCV9fdHJ5CisJICB7CisJICAgIHdoaWxlIChfX2JlZyAhPSBfX2VuZCkKKwkgICAgICB7CisJCWlmIChfX2xlbiA9PSBfX3ItPl9NX2luZm8uX01fY2FwYWNpdHkpCisJCSAgeworCQkgICAgLy8gQWxsb2NhdGUgbW9yZSBzcGFjZS4KKwkJICAgIF9SZXAqIF9fYW5vdGhlciA9IF9SZXA6Ol9TX2NyZWF0ZShfX2xlbiArIDEsIF9fbGVuLCBfX2EpOworCQkgICAgX1NfY29weShfX2Fub3RoZXItPl9NX3JlZmRhdGEoKSwgX19yLT5fTV9yZWZkYXRhKCksIF9fbGVuKTsKKwkJICAgIF9fci0+X01fZGVzdHJveShfX2EpOworCQkgICAgX19yID0gX19hbm90aGVyOworCQkgIH0KKwkJX19yLT5fTV9yZWZkYXRhKClbX19sZW4rK10gPSAqX19iZWc7CisJCSsrX19iZWc7CisJICAgICAgfQorCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfX3ItPl9NX2Rlc3Ryb3koX19hKTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisJX19yLT5fTV9zZXRfbGVuZ3RoKF9fbGVuKTsKKwlyZXR1cm4gX19yLT5fTV9yZWZkYXRhKCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlcmF0b3I+CisgICAgICBfQ2hhclQqCisgICAgICBfX3JjX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgICBfU19jb25zdHJ1Y3QoX0luSXRlcmF0b3IgX19iZWcsIF9Jbkl0ZXJhdG9yIF9fZW5kLCBjb25zdCBfQWxsb2MmIF9fYSwKKwkJICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKwlpZiAoX19iZWcgPT0gX19lbmQgJiYgX19hID09IF9BbGxvYygpKQorCSAgcmV0dXJuIF9TX2VtcHR5X3JlcC5fTV9yZWZjb3B5KCk7CisKKwkvLyBOQjogTm90IHJlcXVpcmVkLCBidXQgY29uc2lkZXJlZCBiZXN0IHByYWN0aWNlLgorCWlmIChfX2lzX251bGxfcG9pbnRlcihfX2JlZykgJiYgX19iZWcgIT0gX19lbmQpCisJICBzdGQ6Ol9fdGhyb3dfbG9naWNfZXJyb3IoX19OKCJfX3JjX3N0cmluZ19iYXNlOjoiCisJCQkJICAgICAgICJfU19jb25zdHJ1Y3QgbnVsbCBub3QgdmFsaWQiKSk7CisKKwljb25zdCBzaXplX3R5cGUgX19kbmV3ID0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihzdGQ6OmRpc3RhbmNlKF9fYmVnLAorCQkJCQkJCQkgICAgICBfX2VuZCkpOworCS8vIENoZWNrIGZvciBvdXRfb2ZfcmFuZ2UgYW5kIGxlbmd0aF9lcnJvciBleGNlcHRpb25zLgorCV9SZXAqIF9fciA9IF9SZXA6Ol9TX2NyZWF0ZShfX2RuZXcsIHNpemVfdHlwZSgwKSwgX19hKTsKKwlfX3RyeQorCSAgeyBfX3JjX3N0cmluZ19iYXNlOjpfU19jb3B5X2NoYXJzKF9fci0+X01fcmVmZGF0YSgpLCBfX2JlZywgX19lbmQpOyB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIF9fci0+X01fZGVzdHJveShfX2EpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKwlfX3ItPl9NX3NldF9sZW5ndGgoX19kbmV3KTsKKwlyZXR1cm4gX19yLT5fTV9yZWZkYXRhKCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX0NoYXJUKgorICAgIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfU19jb25zdHJ1Y3Qoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYywgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgeworICAgICAgaWYgKF9fbiA9PSAwICYmIF9fYSA9PSBfQWxsb2MoKSkKKwlyZXR1cm4gX1NfZW1wdHlfcmVwLl9NX3JlZmNvcHkoKTsKKworICAgICAgLy8gQ2hlY2sgZm9yIG91dF9vZl9yYW5nZSBhbmQgbGVuZ3RoX2Vycm9yIGV4Y2VwdGlvbnMuCisgICAgICBfUmVwKiBfX3IgPSBfUmVwOjpfU19jcmVhdGUoX19uLCBzaXplX3R5cGUoMCksIF9fYSk7CisgICAgICBpZiAoX19uKQorCV9fcmNfc3RyaW5nX2Jhc2U6Ol9TX2Fzc2lnbihfX3ItPl9NX3JlZmRhdGEoKSwgX19uLCBfX2MpOworCisgICAgICBfX3ItPl9NX3NldF9sZW5ndGgoX19uKTsKKyAgICAgIHJldHVybiBfX3ItPl9NX3JlZmRhdGEoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfTV9zd2FwKF9fcmNfc3RyaW5nX2Jhc2UmIF9fcmNzKQorICAgIHsKKyAgICAgIGlmIChfTV9pc19sZWFrZWQoKSkKKwlfTV9zZXRfc2hhcmFibGUoKTsKKyAgICAgIGlmIChfX3Jjcy5fTV9pc19sZWFrZWQoKSkKKwlfX3Jjcy5fTV9zZXRfc2hhcmFibGUoKTsKKworICAgICAgX0NoYXJUKiBfX3RtcCA9IF9NX2RhdGEoKTsKKyAgICAgIF9NX2RhdGEoX19yY3MuX01fZGF0YSgpKTsKKyAgICAgIF9fcmNzLl9NX2RhdGEoX190bXApOworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzEuIFN3YXBwaW5nIGNvbnRhaW5lcnMgd2l0aCB1bmVxdWFsIGFsbG9jYXRvcnMuCisgICAgICBzdGQ6Ol9fYWxsb2Nfc3dhcDxhbGxvY2F0b3JfdHlwZT46Ol9TX2RvX2l0KF9NX2dldF9hbGxvY2F0b3IoKSwKKwkJCQkJCSAgX19yY3MuX01fZ2V0X2FsbG9jYXRvcigpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfTV9hc3NpZ24oY29uc3QgX19yY19zdHJpbmdfYmFzZSYgX19yY3MpCisgICAgeworICAgICAgaWYgKF9NX3JlcCgpICE9IF9fcmNzLl9NX3JlcCgpKQorCXsKKwkgIF9DaGFyVCogX190bXAgPSBfX3Jjcy5fTV9ncmFiKF9NX2dldF9hbGxvY2F0b3IoKSk7CisJICBfTV9kaXNwb3NlKCk7CisJICBfTV9kYXRhKF9fdG1wKTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfX3JjX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX01fcmVzZXJ2ZShzaXplX3R5cGUgX19yZXMpCisgICAgeworICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IHNocmluayBiZWxvdyB0aGUgY3VycmVudCBzaXplLgorICAgICAgaWYgKF9fcmVzIDwgX01fbGVuZ3RoKCkpCisJX19yZXMgPSBfTV9sZW5ndGgoKTsKKworICAgICAgaWYgKF9fcmVzICE9IF9NX2NhcGFjaXR5KCkgfHwgX01faXNfc2hhcmVkKCkpCisJeworCSAgX0NoYXJUKiBfX3RtcCA9IF9NX3JlcCgpLT5fTV9jbG9uZShfTV9nZXRfYWxsb2NhdG9yKCksCisJCQkJCSAgICAgX19yZXMgLSBfTV9sZW5ndGgoKSk7CisJICBfTV9kaXNwb3NlKCk7CisJICBfTV9kYXRhKF9fdG1wKTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfX3JjX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX01fbXV0YXRlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbGVuMSwgY29uc3QgX0NoYXJUKiBfX3MsCisJICAgICAgc2l6ZV90eXBlIF9fbGVuMikKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19ob3dfbXVjaCA9IF9NX2xlbmd0aCgpIC0gX19wb3MgLSBfX2xlbjE7CisKKyAgICAgIF9SZXAqIF9fciA9IF9SZXA6Ol9TX2NyZWF0ZShfTV9sZW5ndGgoKSArIF9fbGVuMiAtIF9fbGVuMSwKKwkJCQkgIF9NX2NhcGFjaXR5KCksIF9NX2dldF9hbGxvY2F0b3IoKSk7CisKKyAgICAgIGlmIChfX3BvcykKKwl0aGlzLT5fU19jb3B5KF9fci0+X01fcmVmZGF0YSgpLCBfTV9kYXRhKCksIF9fcG9zKTsKKyAgICAgIGlmIChfX3MgJiYgX19sZW4yKQorCXRoaXMtPl9TX2NvcHkoX19yLT5fTV9yZWZkYXRhKCkgKyBfX3BvcywgX19zLCBfX2xlbjIpOworICAgICAgaWYgKF9faG93X211Y2gpCisJdGhpcy0+X1NfY29weShfX3ItPl9NX3JlZmRhdGEoKSArIF9fcG9zICsgX19sZW4yLAorCQlfTV9kYXRhKCkgKyBfX3BvcyArIF9fbGVuMSwgX19ob3dfbXVjaCk7CisKKyAgICAgIF9NX2Rpc3Bvc2UoKTsKKyAgICAgIF9NX2RhdGEoX19yLT5fTV9yZWZkYXRhKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX2VyYXNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19uZXdfc2l6ZSA9IF9NX2xlbmd0aCgpIC0gX19uOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9faG93X211Y2ggPSBfTV9sZW5ndGgoKSAtIF9fcG9zIC0gX19uOworCisgICAgICBpZiAoX01faXNfc2hhcmVkKCkpCisJeworCSAgLy8gTXVzdCByZWFsbG9jYXRlLgorCSAgX1JlcCogX19yID0gX1JlcDo6X1NfY3JlYXRlKF9fbmV3X3NpemUsIF9NX2NhcGFjaXR5KCksCisJCQkJICAgICAgX01fZ2V0X2FsbG9jYXRvcigpKTsKKworCSAgaWYgKF9fcG9zKQorCSAgICB0aGlzLT5fU19jb3B5KF9fci0+X01fcmVmZGF0YSgpLCBfTV9kYXRhKCksIF9fcG9zKTsKKwkgIGlmIChfX2hvd19tdWNoKQorCSAgICB0aGlzLT5fU19jb3B5KF9fci0+X01fcmVmZGF0YSgpICsgX19wb3MsCisJCSAgICBfTV9kYXRhKCkgKyBfX3BvcyArIF9fbiwgX19ob3dfbXVjaCk7CisKKwkgIF9NX2Rpc3Bvc2UoKTsKKwkgIF9NX2RhdGEoX19yLT5fTV9yZWZkYXRhKCkpOworCX0KKyAgICAgIGVsc2UgaWYgKF9faG93X211Y2ggJiYgX19uKQorCXsKKwkgIC8vIFdvcmsgaW4tcGxhY2UuCisJICB0aGlzLT5fU19tb3ZlKF9NX2RhdGEoKSArIF9fcG9zLAorCQkgIF9NX2RhdGEoKSArIF9fcG9zICsgX19uLCBfX2hvd19tdWNoKTsKKwl9CisKKyAgICAgIF9NX3JlcCgpLT5fTV9zZXRfbGVuZ3RoKF9fbmV3X3NpemUpOworICAgIH0KKworICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX3JjX3N0cmluZ19iYXNlPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4sCisJCSAgICAgc3RkOjphbGxvY2F0b3I8Y2hhcj4gPjo6CisgICAgX01fY29tcGFyZShjb25zdCBfX3JjX3N0cmluZ19iYXNlJiBfX3JjcykgY29uc3QKKyAgICB7CisgICAgICBpZiAoX01fcmVwKCkgPT0gX19yY3MuX01fcmVwKCkpCisJcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSBib29sCisgICAgX19yY19zdHJpbmdfYmFzZTx3Y2hhcl90LCBzdGQ6OmNoYXJfdHJhaXRzPHdjaGFyX3Q+LAorCQkgICAgIHN0ZDo6YWxsb2NhdG9yPHdjaGFyX3Q+ID46OgorICAgIF9NX2NvbXBhcmUoY29uc3QgX19yY19zdHJpbmdfYmFzZSYgX19yY3MpIGNvbnN0CisgICAgeworICAgICAgaWYgKF9NX3JlcCgpID09IF9fcmNzLl9NX3JlcCgpKQorCXJldHVybiB0cnVlOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfUkNfU1RSSU5HX0JBU0VfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcm9wZSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3JvcGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhlYjFlOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3JvcGUKQEAgLTAsMCArMSwyOTc2IEBACisvLyBTR0kncyByb3BlIGNsYXNzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBleHQvcm9wZQorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IChwb3NzaWJseQorICogIGNvbnRhaW5pbmcgZXh0ZW5zaW9ucyBmcm9tIHRoZSBIUC9TR0kgU1RMIHN1YnNldCkuIAorICovCisKKyNpZm5kZWYgX1JPUEUKKyNkZWZpbmUgX1JPUEUgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPGJpdHMvc3RsX2NvbnN0cnVjdC5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX3VuaW5pdGlhbGl6ZWQuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9mdW5jdGlvbi5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX251bWVyaWMuaD4KKyNpbmNsdWRlIDxiaXRzL2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGJpdHMvZ3Roci5oPgorI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgorCisjIGlmZGVmIF9fR0MKKyMgICBkZWZpbmUgX19HQ19DT05TVCBjb25zdAorIyBlbHNlCisjICAgZGVmaW5lIF9fR0NfQ09OU1QgICAvLyBjb25zdGFudCBleGNlcHQgZm9yIGRlYWxsb2NhdGlvbgorIyBlbmRpZgorCisjaW5jbHVkZSA8ZXh0L21lbW9yeT4gLy8gRm9yIHVuaW5pdGlhbGl6ZWRfY29weV9uCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworICBuYW1lc3BhY2UgX19kZXRhaWwKKyAgeworICAgIGVudW0geyBfU19tYXhfcm9wZV9kZXB0aCA9IDQ1IH07CisgICAgZW51bSBfVGFnIHtfU19sZWFmLCBfU19jb25jYXQsIF9TX3N1YnN0cmluZ2ZuLCBfU19mdW5jdGlvbn07CisgIH0gLy8gbmFtZXNwYWNlIF9fZGV0YWlsCisKKyAgdXNpbmcgc3RkOjpzaXplX3Q7CisgIHVzaW5nIHN0ZDo6cHRyZGlmZl90OworICB1c2luZyBzdGQ6OmFsbG9jYXRvcjsKKyAgdXNpbmcgc3RkOjpfRGVzdHJveTsKKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBTZWUgbGlic3RkYysrLzM2ODMyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIHZvaWQKKyAgICBfRGVzdHJveV9jb25zdChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisJCSAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBfQWxsb2NhdG9yIF9fYWxsb2MpCisgICAgeworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJX19hbGxvYy5kZXN0cm95KCYqX19maXJzdCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9EZXN0cm95X2NvbnN0KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKwkJICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIGFsbG9jYXRvcjxfVHA+KQorICAgIHsgX0Rlc3Ryb3koX19maXJzdCwgX19sYXN0KTsgfQorCisgIC8vIFRoZSBfU19lb3MgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhvc2UgZnVuY3Rpb25zIHRoYXQKKyAgLy8gY29udmVydCB0by9mcm9tIEMtbGlrZSBzdHJpbmdzIHRvIGRldGVjdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCisgIAorICAvLyBUaGUgZW5kLW9mLUMtc3RyaW5nIGNoYXJhY3Rlci4KKyAgLy8gVGhpcyBpcyB3aGF0IHRoZSBkcmFmdCBzdGFuZGFyZCBzYXlzIGl0IHNob3VsZCBiZS4KKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KKyAgICBpbmxpbmUgX0NoYXJUCisgICAgX1NfZW9zKF9DaGFyVCopCisgICAgeyByZXR1cm4gX0NoYXJUKCk7IH0KKworICAvLyBUZXN0IGZvciBiYXNpYyBjaGFyYWN0ZXIgdHlwZXMuCisgIC8vIEZvciBiYXNpYyBjaGFyYWN0ZXIgdHlwZXMgbGVhdmVzIGhhdmluZyBhIHRyYWlsaW5nIGVvcy4KKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9TX2lzX2Jhc2ljX2NoYXJfdHlwZShfQ2hhclQqKQorICAgIHsgcmV0dXJuIGZhbHNlOyB9CisgIAorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorICAgIGlubGluZSBib29sCisgICAgX1NfaXNfb25lX2J5dGVfY2hhcl90eXBlKF9DaGFyVCopCisgICAgeyByZXR1cm4gZmFsc2U7IH0KKworICBpbmxpbmUgYm9vbAorICBfU19pc19iYXNpY19jaGFyX3R5cGUoY2hhciopCisgIHsgcmV0dXJuIHRydWU7IH0KKyAgCisgIGlubGluZSBib29sCisgIF9TX2lzX29uZV9ieXRlX2NoYXJfdHlwZShjaGFyKikKKyAgeyByZXR1cm4gdHJ1ZTsgfQorICAKKyAgaW5saW5lIGJvb2wKKyAgX1NfaXNfYmFzaWNfY2hhcl90eXBlKHdjaGFyX3QqKQorICB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8gU3RvcmUgYW4gZW9zIGlmZiBfQ2hhclQgaXMgYSBiYXNpYyBjaGFyYWN0ZXIgdHlwZS4KKyAgLy8gRG8gbm90IHJlZmVyZW5jZSBfU19lb3MgaWYgaXQgaXNuJ3QuCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CisgICAgaW5saW5lIHZvaWQKKyAgICBfU19jb25kX3N0b3JlX2VvcyhfQ2hhclQmKSB7IH0KKworICBpbmxpbmUgdm9pZAorICBfU19jb25kX3N0b3JlX2VvcyhjaGFyJiBfX2MpCisgIHsgX19jID0gMDsgfQorCisgIGlubGluZSB2b2lkCisgIF9TX2NvbmRfc3RvcmVfZW9zKHdjaGFyX3QmIF9fYykKKyAgeyBfX2MgPSAwOyB9CisKKyAgLy8gY2hhcl9wcm9kdWNlcnMgYXJlIGxvZ2ljYWxseSBmdW5jdGlvbnMgdGhhdCBnZW5lcmF0ZSBhIHNlY3Rpb24gb2YKKyAgLy8gYSBzdHJpbmcuICBUaGVzZSBjYW4gYmUgY29udmVydGVkIHRvIHJvcGVzLiAgVGhlIHJlc3VsdGluZyByb3BlCisgIC8vIGludm9rZXMgdGhlIGNoYXJfcHJvZHVjZXIgb24gZGVtYW5kLiAgVGhpcyBhbGxvd3MsIGZvciBleGFtcGxlLAorICAvLyBmaWxlcyB0byBiZSB2aWV3ZWQgYXMgcm9wZXMgd2l0aG91dCByZWFkaW5nIHRoZSBlbnRpcmUgZmlsZS4KKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KKyAgICBjbGFzcyBjaGFyX3Byb2R1Y2VyCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHZpcnR1YWwgfmNoYXJfcHJvZHVjZXIoKSB7IH07CisKKyAgICAgIHZpcnR1YWwgdm9pZAorICAgICAgb3BlcmF0b3IoKShzaXplX3QgX19zdGFydF9wb3MsIHNpemVfdCBfX2xlbiwKKwkJIF9DaGFyVCogX19idWZmZXIpID0gMDsKKyAgICAgIC8vIEJ1ZmZlciBzaG91bGQgcmVhbGx5IGJlIGFuIGFyYml0cmFyeSBvdXRwdXQgaXRlcmF0b3IuCisgICAgICAvLyBUaGF0IHdheSB3ZSBjb3VsZCBmbGF0dGVuIGRpcmVjdGx5IGludG8gYW4gb3N0cmVhbSwgZXRjLgorICAgICAgLy8gVGhpcyBpcyB0aG9yb3VnaGx5IGltcG9zc2libGUsIHNpbmNlIGl0ZXJhdG9yIHR5cGVzIGRvbid0CisgICAgICAvLyBoYXZlIHJ1bnRpbWUgZGVzY3JpcHRpb25zLgorICAgIH07CisKKyAgLy8gU2VxdWVuY2UgYnVmZmVyczoKKyAgLy8KKyAgLy8gU2VxdWVuY2UgbXVzdCBwcm92aWRlIGFuIGFwcGVuZCBvcGVyYXRpb24gdGhhdCBhcHBlbmRzIGFuCisgIC8vIGFycmF5IHRvIHRoZSBzZXF1ZW5jZS4gIFNlcXVlbmNlIGJ1ZmZlcnMgYXJlIHVzZWZ1bCBvbmx5IGlmCisgIC8vIGFwcGVuZGluZyBhbiBlbnRpcmUgYXJyYXkgaXMgY2hlYXBlciB0aGFuIGFwcGVuZGluZyBlbGVtZW50IGJ5IGVsZW1lbnQuCisgIC8vIFRoaXMgaXMgdHJ1ZSBmb3IgbWFueSBzdHJpbmcgcmVwcmVzZW50YXRpb25zLgorICAvLyBUaGlzIHNob3VsZCAgcGVyaGFwcyBpbmhlcml0IGZyb20gb3N0cmVhbTxzZXF1ZW5jZTo6dmFsdWVfdHlwZT4KKyAgLy8gYW5kIGJlIGltcGxlbWVudGVkIGNvcnJlc3BvbmRpbmdseSwgc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkCisgIC8vIGZvciBmb3JtYXR0ZWQuICBGb3IgdGhlIHNha2Ugb2YgcG9ydGFiaWxpdHksIHdlIGRvbid0IGRvIHRoaXMgeWV0LgorICAvLworICAvLyBGb3Igbm93LCBzZXF1ZW5jZSBidWZmZXJzIGJlaGF2ZSBhcyBvdXRwdXQgaXRlcmF0b3JzLiAgQnV0IHRoZXkgYWxzbworICAvLyBiZWhhdmUgYSBsaXR0bGUgbGlrZSBiYXNpY19vc3RyaW5nc3RyZWFtPHNlcXVlbmNlOjp2YWx1ZV90eXBlPiBhbmQgYQorICAvLyBsaXR0bGUgbGlrZSBjb250YWluZXJzLgorCisgIHRlbXBsYXRlPGNsYXNzIF9TZXF1ZW5jZSwgc2l6ZV90IF9CdWZfc3ogPSAxMDA+CisgICAgY2xhc3Mgc2VxdWVuY2VfYnVmZmVyCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6Om91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgcHJvdGVjdGVkOgorICAgICAgX1NlcXVlbmNlKiBfTV9wcmVmaXg7CisgICAgICB2YWx1ZV90eXBlIF9NX2J1ZmZlcltfQnVmX3N6XTsKKyAgICAgIHNpemVfdCAgICAgX01fYnVmX2NvdW50OworICAgIHB1YmxpYzoKKworICAgICAgdm9pZAorICAgICAgZmx1c2goKQorICAgICAgeworCV9NX3ByZWZpeC0+YXBwZW5kKF9NX2J1ZmZlciwgX01fYnVmZmVyICsgX01fYnVmX2NvdW50KTsKKwlfTV9idWZfY291bnQgPSAwOworICAgICAgfQorICAgICAgCisgICAgICB+c2VxdWVuY2VfYnVmZmVyKCkKKyAgICAgIHsgZmx1c2goKTsgfQorICAgICAgCisgICAgICBzZXF1ZW5jZV9idWZmZXIoKQorICAgICAgOiBfTV9wcmVmaXgoMCksIF9NX2J1Zl9jb3VudCgwKSB7IH0KKworICAgICAgc2VxdWVuY2VfYnVmZmVyKGNvbnN0IHNlcXVlbmNlX2J1ZmZlciYgX194KQorICAgICAgeworCV9NX3ByZWZpeCA9IF9feC5fTV9wcmVmaXg7CisJX01fYnVmX2NvdW50ID0gX194Ll9NX2J1Zl9jb3VudDsKKwlzdGQ6OmNvcHkoX194Ll9NX2J1ZmZlciwgX194Ll9NX2J1ZmZlciArIF9feC5fTV9idWZfY291bnQsIF9NX2J1ZmZlcik7CisgICAgICB9CisgICAgICAKKyAgICAgIHNlcXVlbmNlX2J1ZmZlcihzZXF1ZW5jZV9idWZmZXImIF9feCkKKyAgICAgIHsKKwlfX3guZmx1c2goKTsKKwlfTV9wcmVmaXggPSBfX3guX01fcHJlZml4OworCV9NX2J1Zl9jb3VudCA9IDA7CisgICAgICB9CisgICAgICAKKyAgICAgIHNlcXVlbmNlX2J1ZmZlcihfU2VxdWVuY2UmIF9fcykKKyAgICAgIDogX01fcHJlZml4KCZfX3MpLCBfTV9idWZfY291bnQoMCkgeyB9CisgICAgICAKKyAgICAgIHNlcXVlbmNlX2J1ZmZlciYKKyAgICAgIG9wZXJhdG9yPShzZXF1ZW5jZV9idWZmZXImIF9feCkKKyAgICAgIHsKKwlfX3guZmx1c2goKTsKKwlfTV9wcmVmaXggPSBfX3guX01fcHJlZml4OworCV9NX2J1Zl9jb3VudCA9IDA7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBzZXF1ZW5jZV9idWZmZXImCisgICAgICBvcGVyYXRvcj0oY29uc3Qgc2VxdWVuY2VfYnVmZmVyJiBfX3gpCisgICAgICB7CisJX01fcHJlZml4ID0gX194Ll9NX3ByZWZpeDsKKwlfTV9idWZfY291bnQgPSBfX3guX01fYnVmX2NvdW50OworCXN0ZDo6Y29weShfX3guX01fYnVmZmVyLCBfX3guX01fYnVmZmVyICsgX194Ll9NX2J1Zl9jb3VudCwgX01fYnVmZmVyKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfYmFjayh2YWx1ZV90eXBlIF9feCkKKyAgICAgIHsKKwlpZiAoX01fYnVmX2NvdW50IDwgX0J1Zl9zeikKKwkgIHsKKwkgICAgX01fYnVmZmVyW19NX2J1Zl9jb3VudF0gPSBfX3g7CisJICAgICsrX01fYnVmX2NvdW50OworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgZmx1c2goKTsKKwkgICAgX01fYnVmZmVyWzBdID0gX194OworCSAgICBfTV9idWZfY291bnQgPSAxOworCSAgfQorICAgICAgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICBhcHBlbmQodmFsdWVfdHlwZSogX19zLCBzaXplX3QgX19sZW4pCisgICAgICB7CisJaWYgKF9fbGVuICsgX01fYnVmX2NvdW50IDw9IF9CdWZfc3opCisJICB7CisJICAgIHNpemVfdCBfX2kgPSBfTV9idWZfY291bnQ7CisJICAgIGZvciAoc2l6ZV90IF9faiA9IDA7IF9faiA8IF9fbGVuOyBfX2krKywgX19qKyspCisJICAgICAgX01fYnVmZmVyW19faV0gPSBfX3NbX19qXTsKKwkgICAgX01fYnVmX2NvdW50ICs9IF9fbGVuOworCSAgfQorCWVsc2UgaWYgKDAgPT0gX01fYnVmX2NvdW50KQorCSAgX01fcHJlZml4LT5hcHBlbmQoX19zLCBfX3MgKyBfX2xlbik7CisJZWxzZQorCSAgeworCSAgICBmbHVzaCgpOworCSAgICBhcHBlbmQoX19zLCBfX2xlbik7CisJICB9CisgICAgICB9CisKKyAgICAgIHNlcXVlbmNlX2J1ZmZlciYKKyAgICAgIHdyaXRlKHZhbHVlX3R5cGUqIF9fcywgc2l6ZV90IF9fbGVuKQorICAgICAgeworCWFwcGVuZChfX3MsIF9fbGVuKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICAKKyAgICAgIHNlcXVlbmNlX2J1ZmZlciYKKyAgICAgIHB1dCh2YWx1ZV90eXBlIF9feCkKKyAgICAgIHsKKwlwdXNoX2JhY2soX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICAKKyAgICAgIHNlcXVlbmNlX2J1ZmZlciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB2YWx1ZV90eXBlJiBfX3JocykKKyAgICAgIHsKKwlwdXNoX2JhY2soX19yaHMpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIAorICAgICAgc2VxdWVuY2VfYnVmZmVyJgorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICAgICAKKyAgICAgIHNlcXVlbmNlX2J1ZmZlciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICAgIAorICAgICAgc2VxdWVuY2VfYnVmZmVyCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKyAgCisgIC8vIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgcHJpdmF0ZSwgYXQgbGVhc3QgZm9yIG5vdy4KKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUPgorICAgIGNsYXNzIF9Sb3BlX2NoYXJfY29uc3VtZXIKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gSWYgd2UgaGFkIG1lbWJlciB0ZW1wbGF0ZXMsIHRoZXNlIHNob3VsZCBub3QgYmUgdmlydHVhbC4KKyAgICAgIC8vIEZvciBub3cgd2UgbmVlZCB0byB1c2UgcnVuLXRpbWUgcGFyYW1ldHJpemF0aW9uIHdoZXJlCisgICAgICAvLyBjb21waWxlLXRpbWUgd291bGQgZG8uICBIZW5jZSB0aGlzIHNob3VsZCBhbGwgYmUgcHJpdmF0ZQorICAgICAgLy8gZm9yIG5vdy4KKyAgICAgIC8vIFRoZSBzeW1tZXRyeSB3aXRoIGNoYXJfcHJvZHVjZXIgaXMgYWNjaWRlbnRhbCBhbmQgdGVtcG9yYXJ5LgorICAgICAgdmlydHVhbCB+X1JvcGVfY2hhcl9jb25zdW1lcigpIHsgfTsKKyAgCisgICAgICB2aXJ0dWFsIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0NoYXJUKiBfX2J1ZmZlciwgc2l6ZV90IF9fbGVuKSA9IDA7CisgICAgfTsKKyAgCisgIC8vIEZpcnN0IGEgbG90IG9mIGZvcndhcmQgZGVjbGFyYXRpb25zLiAgVGhlIHN0YW5kYXJkIHNlZW1zIHRvIHJlcXVpcmUKKyAgLy8gbXVjaCBzdHJpY3RlciAiZGVjbGFyYXRpb24gYmVmb3JlIHVzZSIgdGhhbiBtYW55IG9mIHRoZSBpbXBsZW1lbnRhdGlvbnMKKyAgLy8gdGhhdCBwcmVjZWRlZCBpdC4KKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8X0NoYXJUPiA+CisgICAgY2xhc3Mgcm9wZTsKKyAgCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX1JvcGVfUm9wZUxlYWY7CisgIAorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX1JvcGVfUm9wZUZ1bmN0aW9uOworICAKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgc3RydWN0IF9Sb3BlX1JvcGVTdWJzdHJpbmc7CisgIAorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBfUm9wZV9pdGVyYXRvcjsKKyAgCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGNsYXNzIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yOworICAKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3MgX1JvcGVfY2hhcl9yZWZfcHJveHk7CisgIAorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBfUm9wZV9jaGFyX3B0cl9wcm94eTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgX1JvcGVfY2hhcl9wdHJfcHJveHk8X0NoYXJULCBfQWxsb2M+JiBfX3kpOworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPgorICAgIG9wZXJhdG9yLShjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkgICAgICBwdHJkaWZmX3QgX19uKTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisoY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgcHRyZGlmZl90IF9fbik7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKHB0cmRpZmZfdCBfX24sCisJICAgICAgY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gpOworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSk7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkgICAgICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSk7CisgIAorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBwdHJkaWZmX3QKKyAgICBvcGVyYXRvci0oY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3kpOworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPgorICAgIG9wZXJhdG9yLShjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwgcHRyZGlmZl90IF9fbik7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LCBwdHJkaWZmX3QgX19uKTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisocHRyZGlmZl90IF9fbiwgY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gpOworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSk7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkgICAgICBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSk7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgcHRyZGlmZl90CisgICAgb3BlcmF0b3ItKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19sZWZ0LAorCSAgICAgIGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3JpZ2h0KTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19sZWZ0LCBjb25zdCBfQ2hhclQqIF9fcmlnaHQpOworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX2xlZnQsIF9DaGFyVCBfX3JpZ2h0KTsKKworICAvLyBTb21lIGhlbHBlcnMsIHNvIHdlIGNhbiB1c2UgcG93ZXIgb24gcm9wZXMuCisgIC8vIFNlZSBiZWxvdyBmb3Igd2h5IHRoaXMgaXNuJ3QgbG9jYWwgdG8gdGhlIGltcGxlbWVudGF0aW9uLgorICAKKyAgLy8gVGhpcyB1c2VzIGEgbm9uc3RhbmRhcmQgcmVmY291bnQgY29udmVudGlvbi4KKyAgLy8gVGhlIHJlc3VsdCBoYXMgcmVmY291bnQgMC4KKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgc3RydWN0IF9Sb3BlX0NvbmNhdF9mbgorICAgIDogcHVibGljIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPHJvcGU8X0NoYXJULCBfQWxsb2M+LCByb3BlPF9DaGFyVCwgX0FsbG9jPiwKKwkJCQkgIHJvcGU8X0NoYXJULCBfQWxsb2M+ID4KKyAgICB7CisgICAgICByb3BlPF9DaGFyVCwgX0FsbG9jPgorICAgICAgb3BlcmF0b3IoKShjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCQkgY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICAgIHsgcmV0dXJuIF9feCArIF9feTsgfQorICAgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSByb3BlPF9DaGFyVCwgX0FsbG9jPgorICAgIGlkZW50aXR5X2VsZW1lbnQoX1JvcGVfQ29uY2F0X2ZuPF9DaGFyVCwgX0FsbG9jPikKKyAgICB7IHJldHVybiByb3BlPF9DaGFyVCwgX0FsbG9jPigpOyB9CisKKyAgLy8gQ2xhc3MgX1JlZmNvdW50X0Jhc2UgcHJvdmlkZXMgYSB0eXBlLCBfUkNfdCwgYSBkYXRhIG1lbWJlciwKKyAgLy8gX01fcmVmX2NvdW50LCBhbmQgbWVtYmVyIGZ1bmN0aW9ucyBfTV9pbmNyIGFuZCBfTV9kZWNyLCB3aGljaCBwZXJmb3JtCisgIC8vIGF0b21pYyBwcmVpbmNyZW1lbnQvcHJlZGVjcmVtZW50LiAgVGhlIGNvbnN0cnVjdG9yIGluaXRpYWxpemVzCisgIC8vIF9NX3JlZl9jb3VudC4KKyAgc3RydWN0IF9SZWZjb3VudF9CYXNlCisgIHsKKyAgICAvLyBUaGUgdHlwZSBfUkNfdAorICAgIHR5cGVkZWYgc2l6ZV90IF9SQ190OworICAgIAorICAgIC8vIFRoZSBkYXRhIG1lbWJlciBfTV9yZWZfY291bnQKKyAgICB2b2xhdGlsZSBfUkNfdCBfTV9yZWZfY291bnQ7CisKKyAgICAvLyBDb25zdHJ1Y3RvcgorI2lmZGVmIF9fR1RIUkVBRF9NVVRFWF9JTklUCisgICAgX19ndGhyZWFkX211dGV4X3QgX01fcmVmX2NvdW50X2xvY2sgPSBfX0dUSFJFQURfTVVURVhfSU5JVDsKKyNlbHNlCisgICAgX19ndGhyZWFkX211dGV4X3QgX01fcmVmX2NvdW50X2xvY2s7CisjZW5kaWYKKworICAgIF9SZWZjb3VudF9CYXNlKF9SQ190IF9fbikgOiBfTV9yZWZfY291bnQoX19uKQorICAgIHsKKyNpZm5kZWYgX19HVEhSRUFEX01VVEVYX0lOSVQKKyNpZmRlZiBfX0dUSFJFQURfTVVURVhfSU5JVF9GVU5DVElPTgorICAgICAgX19HVEhSRUFEX01VVEVYX0lOSVRfRlVOQ1RJT04gKCZfTV9yZWZfY291bnRfbG9jayk7CisjZWxzZQorI2Vycm9yIF9fR1RIUkVBRF9NVVRFWF9JTklUIG9yIF9fR1RIUkVBRF9NVVRFWF9JTklUX0ZVTkNUSU9OIHNob3VsZCBiZSBkZWZpbmVkIGJ5IGd0aHIuaCBhYnN0cmFjdGlvbiBsYXllciwgcmVwb3J0IHByb2JsZW0gdG8gbGlic3RkYysrQGdjYy5nbnUub3JnLgorI2VuZGlmCisjZW5kaWYKKyAgICB9CisKKyNpZm5kZWYgX19HVEhSRUFEX01VVEVYX0lOSVQKKyAgICB+X1JlZmNvdW50X0Jhc2UoKQorICAgIHsgX19ndGhyZWFkX211dGV4X2Rlc3Ryb3koJl9NX3JlZl9jb3VudF9sb2NrKTsgfQorI2VuZGlmCisKKyAgICB2b2lkCisgICAgX01faW5jcigpCisgICAgeworICAgICAgX19ndGhyZWFkX211dGV4X2xvY2soJl9NX3JlZl9jb3VudF9sb2NrKTsKKyAgICAgICsrX01fcmVmX2NvdW50OworICAgICAgX19ndGhyZWFkX211dGV4X3VubG9jaygmX01fcmVmX2NvdW50X2xvY2spOworICAgIH0KKworICAgIF9SQ190CisgICAgX01fZGVjcigpCisgICAgeworICAgICAgX19ndGhyZWFkX211dGV4X2xvY2soJl9NX3JlZl9jb3VudF9sb2NrKTsKKyAgICAgIHZvbGF0aWxlIF9SQ190IF9fdG1wID0gLS1fTV9yZWZfY291bnQ7CisgICAgICBfX2d0aHJlYWRfbXV0ZXhfdW5sb2NrKCZfTV9yZWZfY291bnRfbG9jayk7CisgICAgICByZXR1cm4gX190bXA7CisgICAgfQorICB9OworCisgIC8vCisgIC8vIFdoYXQgZm9sbG93cyBzaG91bGQgcmVhbGx5IGJlIGxvY2FsIHRvIHJvcGUuICBVbmZvcnR1bmF0ZWx5LAorICAvLyB0aGF0IGRvZXNuJ3Qgd29yaywgc2luY2UgaXQgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byBkZWZpbmUgZ2VuZXJpYworICAvLyBlcXVhbGl0eSBvbiByb3BlIGl0ZXJhdG9ycy4gIEFjY29yZGluZyB0byB0aGUgZHJhZnQgc3RhbmRhcmQsIHRoZQorICAvLyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGZvciBzdWNoIGFuIGVxdWFsaXR5IG9wZXJhdG9yIGNhbm5vdCBiZSBpbmZlcnJlZAorICAvLyBmcm9tIHRoZSBvY2N1cnJlbmNlIG9mIGEgbWVtYmVyIGNsYXNzIGFzIGEgcGFyYW1ldGVyLgorICAvLyAoU0dJIGNvbXBpbGVycyBpbiBmYWN0IGFsbG93IHRoaXMsIGJ1dCB0aGUgX19yZXN1bHQgd291bGRuJ3QgYmUKKyAgLy8gcG9ydGFibGUuKQorICAvLyBTaW1pbGFybHksIHNvbWUgb2YgdGhlIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zIGFyZSBtZW1iZXIgZnVuY3Rpb25zCisgIC8vIG9ubHkgdG8gYXZvaWQgcG9sbHV0aW5nIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCBhbmQgdG8gY2lyY3VtdmVudAorICAvLyByZXN0cmljdGlvbnMgb24gdHlwZSBpbmZlcmVuY2UgZm9yIHRlbXBsYXRlIGZ1bmN0aW9ucy4KKyAgLy8KKworICAvLworICAvLyBUaGUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgZm9yIHJlcHJlc2VudGluZyBhIHJvcGUuICBUaGlzIGlzCisgIC8vIHByaXZhdGUgdG8gdGhlIGltcGxlbWVudGF0aW9uLiAgQSByb3BlIGlzIHJlYWxseSBqdXN0IGEgcG9pbnRlcgorICAvLyB0byBvbmUgb2YgdGhlc2UuCisgIC8vCisgIC8vIEEgZmV3IGJhc2ljIGZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIHRoaXMgZGF0YSBzdHJ1Y3R1cmUKKyAgLy8gYXJlIG1lbWJlcnMgb2YgX1JvcGVSZXAuICBNb3N0IG9mIHRoZSBtb3JlIGNvbXBsZXggYWxnb3JpdGhtcworICAvLyBhcmUgaW1wbGVtZW50ZWQgYXMgcm9wZSBtZW1iZXJzLgorICAvLworICAvLyBTb21lIG9mIHRoZSBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucyBvZiBfUm9wZVJlcCBoYXZlIGlkZW50aWNhbGx5CisgIC8vIG5hbWVkIGZ1bmN0aW9ucyBpbiByb3BlIHRoYXQgc2ltcGx5IGludm9rZSB0aGUgX1JvcGVSZXAgdmVyc2lvbnMuCisKKyNkZWZpbmUgX19ST1BFX0RFRklORV9BTExPQ1MoX19hKSBcCisgICAgICAgIF9fUk9QRV9ERUZJTkVfQUxMT0MoX0NoYXJULF9EYXRhKSAvKiBjaGFyYWN0ZXIgZGF0YSAqLyBcCisgICAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb248X0NoYXJULF9fYT4gX19DOyBcCisgICAgICAgIF9fUk9QRV9ERUZJTkVfQUxMT0MoX19DLF9DKSBcCisgICAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZUxlYWY8X0NoYXJULF9fYT4gX19MOyBcCisgICAgICAgIF9fUk9QRV9ERUZJTkVfQUxMT0MoX19MLF9MKSBcCisgICAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZUZ1bmN0aW9uPF9DaGFyVCxfX2E+IF9fRjsgXAorICAgICAgICBfX1JPUEVfREVGSU5FX0FMTE9DKF9fRixfRikgXAorICAgICAgICB0eXBlZGVmIF9Sb3BlX1JvcGVTdWJzdHJpbmc8X0NoYXJULF9fYT4gX19TOyBcCisgICAgICAgIF9fUk9QRV9ERUZJTkVfQUxMT0MoX19TLF9TKQorCisgIC8vICBJbnRlcm5hbCByb3BlIG5vZGVzIHBvdGVudGlhbGx5IHN0b3JlIGEgY29weSBvZiB0aGUgYWxsb2NhdG9yCisgIC8vICBpbnN0YW5jZSB1c2VkIHRvIGFsbG9jYXRlIHRoZW0uICBUaGlzIGlzIG1vc3RseSByZWR1bmRhbnQuCisgIC8vICBCdXQgdGhlIGFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIHBhc3MgYWxsb2NhdG9yIGluc3RhbmNlcyBhcm91bmQKKyAgLy8gIGluIHNvbWUgZm9ybSB0byBuZWFybHkgYWxsIGludGVybmFsIGZ1bmN0aW9ucywgc2luY2UgYW55IHBvaW50ZXIKKyAgLy8gIGFzc2lnbm1lbnQgbWF5IHJlc3VsdCBpbiBhIHplcm8gcmVmZXJlbmNlIGNvdW50IGFuZCB0aHVzIHJlcXVpcmUKKyAgLy8gIGRlYWxsb2NhdGlvbi4KKworI2RlZmluZSBfX1NUQVRJQ19JRl9TR0lfQUxMT0MgIC8qIG5vdCBzdGF0aWMgKi8KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgc3RydWN0IF9Sb3BlX3JlcF9iYXNlCisgICAgOiBwdWJsaWMgX0FsbG9jCisgICAgeworICAgICAgdHlwZWRlZiBfQWxsb2MgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBfQWxsb2MqPih0aGlzKTsgfQorCisgICAgICBhbGxvY2F0b3JfdHlwZSYKKyAgICAgIF9NX2dldF9hbGxvY2F0b3IoKQorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PF9BbGxvYyo+KHRoaXMpOyB9CisKKyAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJgorICAgICAgX01fZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgX0FsbG9jKj4odGhpcyk7IH0KKworICAgICAgX1JvcGVfcmVwX2Jhc2Uoc2l6ZV90IF9fc2l6ZSwgY29uc3QgYWxsb2NhdG9yX3R5cGUmKQorICAgICAgOiBfTV9zaXplKF9fc2l6ZSkgeyB9CisKKyAgICAgIHNpemVfdCBfTV9zaXplOworCisjIGRlZmluZSBfX1JPUEVfREVGSU5FX0FMTE9DKF9UcCwgX19uYW1lKSBcCisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgXAorICAgICAgICAgIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9UcD46Om90aGVyIF9fbmFtZSMjQWxsb2M7IFwKKyAgICAgICAgc3RhdGljIF9UcCogX19uYW1lIyNfYWxsb2NhdGUoc2l6ZV90IF9fbikgXAorICAgICAgICAgIHsgcmV0dXJuIF9fbmFtZSMjQWxsb2MoKS5hbGxvY2F0ZShfX24pOyB9IFwKKyAgICAgICAgc3RhdGljIHZvaWQgX19uYW1lIyNfZGVhbGxvY2F0ZShfVHAgKl9fcCwgc2l6ZV90IF9fbikgXAorICAgICAgICAgIHsgX19uYW1lIyNBbGxvYygpLmRlYWxsb2NhdGUoX19wLCBfX24pOyB9CisgICAgICBfX1JPUEVfREVGSU5FX0FMTE9DUyhfQWxsb2MpCisjIHVuZGVmIF9fUk9QRV9ERUZJTkVfQUxMT0MKKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfUm9wZV9Sb3BlUmVwCisgICAgOiBwdWJsaWMgX1JvcGVfcmVwX2Jhc2U8X0NoYXJULCBfQWxsb2M+CisjIGlmbmRlZiBfX0dDCisJICAgICAsIF9SZWZjb3VudF9CYXNlCisjIGVuZGlmCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIF9fZGV0YWlsOjpfVGFnIF9NX3RhZzo4OworICAgICAgYm9vbCBfTV9pc19iYWxhbmNlZDo4OworICAgICAgdW5zaWduZWQgY2hhciBfTV9kZXB0aDsKKyAgICAgIF9fR0NfQ09OU1QgX0NoYXJUKiBfTV9jX3N0cmluZzsKKyNpZmRlZiBfX0dUSFJFQURfTVVURVhfSU5JVAorICAgICAgX19ndGhyZWFkX211dGV4X3QgX01fY19zdHJpbmdfbG9jayA9IF9fR1RIUkVBRF9NVVRFWF9JTklUOworI2Vsc2UKKyAgICAgIF9fZ3RocmVhZF9tdXRleF90IF9NX2Nfc3RyaW5nX2xvY2s7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYXR0ZW5lZCB2ZXJzaW9uIG9mIHN0cmluZywgaWYgbmVlZGVkLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHR5cGljYWxseSAwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIGl0J3Mgbm90IDAsIHRoZW4gdGhlIG1lbW9yeSBpcyBvd25lZCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ5IHRoaXMgbm9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluIHRoZSBjYXNlIG9mIGEgbGVhZiwgdGhpcyBtYXkgcG9pbnQgdG8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBzYW1lIG1lbW9yeSBhcyB0aGUgZGF0YSBmaWVsZC4gICAgICAgKi8KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JvcGVfcmVwX2Jhc2U8X0NoYXJULCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZQorICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgdXNpbmcgX1JvcGVfcmVwX2Jhc2U8X0NoYXJULCBfQWxsb2M+OjpnZXRfYWxsb2NhdG9yOworICAgICAgdXNpbmcgX1JvcGVfcmVwX2Jhc2U8X0NoYXJULCBfQWxsb2M+OjpfTV9nZXRfYWxsb2NhdG9yOworCisgICAgICBfUm9wZV9Sb3BlUmVwKF9fZGV0YWlsOjpfVGFnIF9fdCwgaW50IF9fZCwgYm9vbCBfX2IsIHNpemVfdCBfX3NpemUsCisJCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfUm9wZV9yZXBfYmFzZTxfQ2hhclQsIF9BbGxvYz4oX19zaXplLCBfX2EpLAorI2lmbmRlZiBfX0dDCisJX1JlZmNvdW50X0Jhc2UoMSksCisjZW5kaWYKKwlfTV90YWcoX190KSwgX01faXNfYmFsYW5jZWQoX19iKSwgX01fZGVwdGgoX19kKSwgX01fY19zdHJpbmcoMCkKKyNpZmRlZiBfX0dUSFJFQURfTVVURVhfSU5JVAorICAgICAgeyB9CisjZWxzZQorICAgICAgeyBfX0dUSFJFQURfTVVURVhfSU5JVF9GVU5DVElPTiAoJl9NX2Nfc3RyaW5nX2xvY2spOyB9CisgICAgICB+X1JvcGVfUm9wZVJlcCgpCisgICAgICB7IF9fZ3RocmVhZF9tdXRleF9kZXN0cm95ICgmX01fY19zdHJpbmdfbG9jayk7IH0KKyNlbmRpZgorI2lmZGVmIF9fR0MKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luY3IgKCkgeyB9CisjZW5kaWYKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19mcmVlX3N0cmluZyhfX0dDX0NPTlNUIF9DaGFyVCosIHNpemVfdCBfX2xlbiwKKwkJICAgICBhbGxvY2F0b3JfdHlwZSYgX19hKTsKKyNkZWZpbmUgX19TVExfRlJFRV9TVFJJTkcoX19zLCBfX2wsIF9fYSkgX1NfZnJlZV9zdHJpbmcoX19zLCBfX2wsIF9fYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWFsbG9jYXRlIGRhdGEgc2VjdGlvbiBvZiBhIGxlYWYuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZG4ndCBiZSBhIG1lbWJlciBmdW5jdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1dCBpdHMgaGFyZCB0byBkbyBhbnl0aGluZyBlbHNlIGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9tZW50LCBiZWNhdXNlIGl0J3MgdGVtcGxhdGl6ZWQgdy5yLnQuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBhbGxvY2F0b3IuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2VzIG5vdGhpbmcgaWYgX19HQyBpcyBkZWZpbmVkLgorI2lmbmRlZiBfX0dDCisgICAgICB2b2lkIF9NX2ZyZWVfY19zdHJpbmcoKTsKKyAgICAgIHZvaWQgX01fZnJlZV90cmVlKCk7CisgICAgICAvLyBEZWFsbG9jYXRlIHQuIEFzc3VtZXMgdCBpcyBub3QgMC4KKyAgICAgIHZvaWQKKyAgICAgIF9NX3VucmVmX25vbm5pbCgpCisgICAgICB7CisJaWYgKDAgPT0gX01fZGVjcigpKQorCSAgX01fZnJlZV90cmVlKCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3JlZl9ub25uaWwoKQorICAgICAgeyBfTV9pbmNyKCk7IH0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX3VucmVmKF9Sb3BlX1JvcGVSZXAqIF9fdCkKKyAgICAgIHsKKwlpZiAoMCAhPSBfX3QpCisJICBfX3QtPl9NX3VucmVmX25vbm5pbCgpOworICAgICAgfQorCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfcmVmKF9Sb3BlX1JvcGVSZXAqIF9fdCkKKyAgICAgIHsKKwlpZiAoMCAhPSBfX3QpCisJICBfX3QtPl9NX2luY3IoKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2ZyZWVfaWZfdW5yZWYoX1JvcGVfUm9wZVJlcCogX190KQorICAgICAgeworCWlmICgwICE9IF9fdCAmJiAwID09IF9fdC0+X01fcmVmX2NvdW50KQorCSAgX190LT5fTV9mcmVlX3RyZWUoKTsKKyAgICAgIH0KKyMgICBlbHNlIC8qIF9fR0MgKi8KKyAgICAgIHZvaWQgX01fdW5yZWZfbm9ubmlsKCkgeyB9CisgICAgICB2b2lkIF9NX3JlZl9ub25uaWwoKSB7IH0KKyAgICAgIHN0YXRpYyB2b2lkIF9TX3VucmVmKF9Sb3BlX1JvcGVSZXAqKSB7IH0KKyAgICAgIHN0YXRpYyB2b2lkIF9TX3JlZihfUm9wZV9Sb3BlUmVwKikgeyB9CisgICAgICBzdGF0aWMgdm9pZCBfU19mcmVlX2lmX3VucmVmKF9Sb3BlX1JvcGVSZXAqKSB7IH0KKyMgICBlbmRpZgorcHJvdGVjdGVkOgorICAgICAgX1JvcGVfUm9wZVJlcCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfUm9wZV9Sb3BlUmVwJik7CisKKyAgICAgIF9Sb3BlX1JvcGVSZXAoY29uc3QgX1JvcGVfUm9wZVJlcCYpOworICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgc3RydWN0IF9Sb3BlX1JvcGVMZWFmCisgICAgOiBwdWJsaWMgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gQXBwYXJlbnRseSBuZWVkZWQgYnkgVkMrKworICAgICAgLy8gVGhlIGRhdGEgZmllbGRzIG9mIGxlYXZlcyBhcmUgYWxsb2NhdGVkIHdpdGggc29tZQorICAgICAgLy8gZXh0cmEgc3BhY2UsIHRvIGFjY29tbW9kYXRlIGZ1dHVyZSBncm93dGggYW5kIGZvciBiYXNpYworICAgICAgLy8gY2hhcmFjdGVyIHR5cGVzLCB0byBob2xkIGEgdHJhaWxpbmcgZW9zIGNoYXJhY3Rlci4KKyAgICAgIGVudW0geyBfU19hbGxvY19ncmFudWxhcml0eSA9IDggfTsKKyAgICAgIAorICAgICAgc3RhdGljIHNpemVfdAorICAgICAgX1Nfcm91bmRlZF91cF9zaXplKHNpemVfdCBfX24pCisgICAgICB7CisgICAgICAgIHNpemVfdCBfX3NpemVfd2l0aF9lb3M7CisJCisgICAgICAgIGlmIChfU19pc19iYXNpY19jaGFyX3R5cGUoKF9DaGFyVCopMCkpCisJICBfX3NpemVfd2l0aF9lb3MgPSBfX24gKyAxOworCWVsc2UKKwkgIF9fc2l6ZV93aXRoX2VvcyA9IF9fbjsKKyNpZmRlZiBfX0dDCisJcmV0dXJuIF9fc2l6ZV93aXRoX2VvczsKKyNlbHNlCisJLy8gQWxsb3cgc2xvcCBmb3IgaW4tcGxhY2UgZXhwYW5zaW9uLgorCXJldHVybiAoKF9fc2l6ZV93aXRoX2VvcyArIHNpemVfdChfU19hbGxvY19ncmFudWxhcml0eSkgLSAxKQorCQkmfiAoc2l6ZV90KF9TX2FsbG9jX2dyYW51bGFyaXR5KSAtIDEpKTsKKyNlbmRpZgorICAgICAgfQorICAgICAgX19HQ19DT05TVCBfQ2hhclQqIF9NX2RhdGE7IC8qIE5vdCBuZWNlc3NhcmlseSAwIHRlcm1pbmF0ZWQuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGFsbG9jYXRlZCBzaXplIGlzICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBfU19yb3VuZGVkX3VwX3NpemUoc2l6ZSksIGV4Y2VwdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluIHRoZSBHQyBjYXNlLCBpbiB3aGljaCBpdCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9lc24ndCBtYXR0ZXIuICAgICAgICAgICAgICAgKi8KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JvcGVfcmVwX2Jhc2U8X0NoYXJULF9BbGxvYz46OmFsbG9jYXRvcl90eXBlCisgICAgICAgIGFsbG9jYXRvcl90eXBlOworCisgICAgICBfUm9wZV9Sb3BlTGVhZihfX0dDX0NPTlNUIF9DaGFyVCogX19kLCBzaXplX3QgX19zaXplLAorCQkgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICA6IF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+KF9fZGV0YWlsOjpfU19sZWFmLCAwLCB0cnVlLAorCQkJCSAgICAgIF9fc2l6ZSwgX19hKSwgX01fZGF0YShfX2QpCisgICAgICB7CisgICAgICAgIGlmIChfU19pc19iYXNpY19jaGFyX3R5cGUoKF9DaGFyVCAqKTApKQorCSAgeworICAgICAgICAgICAgLy8gYWxyZWFkeSBlb3MgdGVybWluYXRlZC4KKyAgICAgICAgICAgIHRoaXMtPl9NX2Nfc3RyaW5nID0gX19kOworCSAgfQorICAgICAgfQorICAgICAgLy8gVGhlIGNvbnN0cnVjdG9yIGFzc3VtZXMgdGhhdCBkIGhhcyBiZWVuIGFsbG9jYXRlZCB3aXRoCisgICAgICAvLyB0aGUgcHJvcGVyIGFsbG9jYXRvciBhbmQgdGhlIHByb3Blcmx5IHBhZGRlZCBzaXplLgorICAgICAgLy8gSW4gY29udHJhc3QsIHRoZSBkZXN0cnVjdG9yIGRlYWxsb2NhdGVzIHRoZSBkYXRhOgorI2lmbmRlZiBfX0dDCisgICAgICB+X1JvcGVfUm9wZUxlYWYoKSB0aHJvdygpCisgICAgICB7CisgICAgICAgIGlmIChfTV9kYXRhICE9IHRoaXMtPl9NX2Nfc3RyaW5nKQorCSAgdGhpcy0+X01fZnJlZV9jX3N0cmluZygpOworCQorCXRoaXMtPl9fU1RMX0ZSRUVfU1RSSU5HKF9NX2RhdGEsIHRoaXMtPl9NX3NpemUsIHRoaXMtPl9NX2dldF9hbGxvY2F0b3IoKSk7CisgICAgICB9CisjZW5kaWYKK3Byb3RlY3RlZDoKKyAgICAgIF9Sb3BlX1JvcGVMZWFmJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9Sb3BlX1JvcGVMZWFmJik7CisKKyAgICAgIF9Sb3BlX1JvcGVMZWFmKGNvbnN0IF9Sb3BlX1JvcGVMZWFmJik7CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb24KKyAgICA6IHB1YmxpYyBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiogX01fbGVmdDsKKyAgICAgIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+KiBfTV9yaWdodDsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUm9wZV9yZXBfYmFzZTxfQ2hhclQsIF9BbGxvYz46OmFsbG9jYXRvcl90eXBlCisgICAgICAgIGFsbG9jYXRvcl90eXBlOworCisgICAgICBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbihfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiogX19sLAorCQkJICAgICAgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4qIF9fciwKKwkJCSAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisJOiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPihfX2RldGFpbDo6X1NfY29uY2F0LAorCQkJCSAgICAgIHN0ZDo6bWF4KF9fbC0+X01fZGVwdGgsCisJCQkJCSAgICAgICBfX3ItPl9NX2RlcHRoKSArIDEsCisJCQkJICAgICAgZmFsc2UsCisJCQkJICAgICAgX19sLT5fTV9zaXplICsgX19yLT5fTV9zaXplLCBfX2EpLAorICAgICAgICBfTV9sZWZ0KF9fbCksIF9NX3JpZ2h0KF9fcikKKyAgICAgIHsgfQorI2lmbmRlZiBfX0dDCisgICAgICB+X1JvcGVfUm9wZUNvbmNhdGVuYXRpb24oKSB0aHJvdygpCisgICAgICB7CisJdGhpcy0+X01fZnJlZV9jX3N0cmluZygpOworCV9NX2xlZnQtPl9NX3VucmVmX25vbm5pbCgpOworCV9NX3JpZ2h0LT5fTV91bnJlZl9ub25uaWwoKTsKKyAgICAgIH0KKyNlbmRpZgorcHJvdGVjdGVkOgorICAgICAgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb24mCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb24mKTsKKyAgICAgIAorICAgICAgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb24oY29uc3QgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb24mKTsKKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfUm9wZV9Sb3BlRnVuY3Rpb24KKyAgICA6IHB1YmxpYyBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBjaGFyX3Byb2R1Y2VyPF9DaGFyVD4qIF9NX2ZuOworI2lmbmRlZiBfX0dDCisgICAgICBib29sIF9NX2RlbGV0ZV93aGVuX2RvbmU7IC8vIENoYXJfcHJvZHVjZXIgaXMgb3duZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvcGUgYW5kIHNob3VsZCBiZSBleHBsaWNpdGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZWQgd2hlbiB0aGUgcm9wZSBiZWNvbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluYWNjZXNzaWJsZS4KKyNlbHNlCisgICAgICAvLyBJbiB0aGUgR0MgY2FzZSwgd2UgZWl0aGVyIHJlZ2lzdGVyIHRoZSByb3BlIGZvcgorICAgICAgLy8gZmluYWxpemF0aW9uLCBvciBub3QuICBUaHVzIHRoZSBmaWVsZCBpcyB1bm5lY2Vzc2FyeTsKKyAgICAgIC8vIHRoZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIGNvbGxlY3RvciBkYXRhIHN0cnVjdHVyZXMuCisgICAgICAvLyBXZSBkbyBuZWVkIGEgZmluYWxpemF0aW9uIHByb2NlZHVyZSB0byBiZSBpbnZva2VkIGJ5IHRoZQorICAgICAgLy8gY29sbGVjdG9yLgorICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2ZuX2ZpbmFsaXphdGlvbl9wcm9jKHZvaWQgKiBfX3RyZWUsIHZvaWQgKikKKyAgICAgIHsgZGVsZXRlICgoX1JvcGVfUm9wZUZ1bmN0aW9uICopX190cmVlKSAtPiBfTV9mbjsgfQorI2VuZGlmCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfUm9wZV9yZXBfYmFzZTxfQ2hhclQsIF9BbGxvYz46OmFsbG9jYXRvcl90eXBlCisgICAgICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgX1JvcGVfUm9wZUZ1bmN0aW9uKGNoYXJfcHJvZHVjZXI8X0NoYXJUPiogX19mLCBzaXplX3QgX19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfX2QsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICA6IF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+KF9fZGV0YWlsOjpfU19mdW5jdGlvbiwgMCwgdHJ1ZSwgX19zaXplLCBfX2EpCisJLCBfTV9mbihfX2YpCisjaWZuZGVmIF9fR0MKKwksIF9NX2RlbGV0ZV93aGVuX2RvbmUoX19kKQorI2VuZGlmCisgICAgICB7CisjaWZkZWYgX19HQworCWlmIChfX2QpCisJICB7CisJICAgIEdDX1JFR0lTVEVSX0ZJTkFMSVpFUih0aGlzLCBfUm9wZV9Sb3BlRnVuY3Rpb246OgorCQkJCSAgX1NfZm5fZmluYWxpemF0aW9uX3Byb2MsIDAsIDAsIDApOworCSAgfQorI2VuZGlmCisgICAgICB9CisjaWZuZGVmIF9fR0MKKyAgICAgIH5fUm9wZV9Sb3BlRnVuY3Rpb24oKSB0aHJvdygpCisgICAgICB7CisJdGhpcy0+X01fZnJlZV9jX3N0cmluZygpOworCWlmIChfTV9kZWxldGVfd2hlbl9kb25lKQorCSAgZGVsZXRlIF9NX2ZuOworICAgICAgfQorIyBlbmRpZgorICAgIHByb3RlY3RlZDoKKyAgICAgIF9Sb3BlX1JvcGVGdW5jdGlvbiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfUm9wZV9Sb3BlRnVuY3Rpb24mKTsKKworICAgICAgX1JvcGVfUm9wZUZ1bmN0aW9uKGNvbnN0IF9Sb3BlX1JvcGVGdW5jdGlvbiYpOworICAgIH07CisgIC8vIFN1YnN0cmluZyByZXN1bHRzIGFyZSB1c3VhbGx5IHJlcHJlc2VudGVkIHVzaW5nIGp1c3QKKyAgLy8gY29uY2F0ZW5hdGlvbiBub2Rlcy4gIEJ1dCBpbiB0aGUgY2FzZSBvZiB2ZXJ5IGxvbmcgZmxhdCByb3BlcworICAvLyBvciByb3BlcyB3aXRoIGEgZnVuY3Rpb25hbCByZXByZXNlbnRhdGlvbiB0aGF0IGlzbid0IHByYWN0aWNhbC4KKyAgLy8gSW4gdGhhdCBjYXNlLCB3ZSByZXByZXNlbnQgdGhlIF9fcmVzdWx0IGFzIGEgc3BlY2lhbCBjYXNlIG9mCisgIC8vIFJvcGVGdW5jdGlvbiwgd2hvc2UgY2hhcl9wcm9kdWNlciBwb2ludHMgYmFjayB0byB0aGUgcm9wZSBpdHNlbGYuCisgIC8vIEluIGFsbCBjYXNlcyBleGNlcHQgcmVwZWF0ZWQgc3Vic3RyaW5nIG9wZXJhdGlvbnMgYW5kCisgIC8vIGRlYWxsb2NhdGlvbiwgd2UgdHJlYXQgdGhlIF9fcmVzdWx0IGFzIGEgUm9wZUZ1bmN0aW9uLgorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX1JvcGVfUm9wZVN1YnN0cmluZworICAgIDogcHVibGljIF9Sb3BlX1JvcGVGdW5jdGlvbjxfQ2hhclQsIF9BbGxvYz4sCisgICAgICBwdWJsaWMgY2hhcl9wcm9kdWNlcjxfQ2hhclQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFhYWCB0aGlzIHdob2xlIGNsYXNzIHNob3VsZCBiZSByZXdyaXR0ZW4uCisgICAgICBfUm9wZV9Sb3BlUmVwPF9DaGFyVCxfQWxsb2M+KiBfTV9iYXNlOyAgICAgIC8vIG5vdCAwCisgICAgICBzaXplX3QgX01fc3RhcnQ7CisKKyAgICAgIHZpcnR1YWwgdm9pZAorICAgICAgb3BlcmF0b3IoKShzaXplX3QgX19zdGFydF9wb3MsIHNpemVfdCBfX3JlcV9sZW4sCisJCSBfQ2hhclQqIF9fYnVmZmVyKQorICAgICAgeworICAgICAgICBzd2l0Y2goX01fYmFzZS0+X01fdGFnKQorCSAgeworCSAgY2FzZSBfX2RldGFpbDo6X1NfZnVuY3Rpb246CisJICBjYXNlIF9fZGV0YWlsOjpfU19zdWJzdHJpbmdmbjoKKwkgICAgeworCSAgICAgIGNoYXJfcHJvZHVjZXI8X0NoYXJUPiogX19mbiA9CisJCSgoX1JvcGVfUm9wZUZ1bmN0aW9uPF9DaGFyVCxfQWxsb2M+KilfTV9iYXNlKS0+X01fZm47CisJICAgICAgKCpfX2ZuKShfX3N0YXJ0X3BvcyArIF9NX3N0YXJ0LCBfX3JlcV9sZW4sIF9fYnVmZmVyKTsKKwkgICAgfQorCSAgICBicmVhazsKKwkgIGNhc2UgX19kZXRhaWw6Ol9TX2xlYWY6CisJICAgIHsKKwkgICAgICBfX0dDX0NPTlNUIF9DaGFyVCogX19zID0KKwkJKChfUm9wZV9Sb3BlTGVhZjxfQ2hhclQsX0FsbG9jPiopX01fYmFzZSktPl9NX2RhdGE7CisJICAgICAgdW5pbml0aWFsaXplZF9jb3B5X24oX19zICsgX19zdGFydF9wb3MgKyBfTV9zdGFydCwgX19yZXFfbGVuLAorCQkJCSAgIF9fYnVmZmVyKTsKKwkgICAgfQorCSAgICBicmVhazsKKwkgIGRlZmF1bHQ6CisJICAgIGJyZWFrOworCSAgfQorICAgICAgfQorICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Sb3BlX3JlcF9iYXNlPF9DaGFyVCwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUKKyAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIF9Sb3BlX1JvcGVTdWJzdHJpbmcoX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4qIF9fYiwgc2l6ZV90IF9fcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IF9fbCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogX1JvcGVfUm9wZUZ1bmN0aW9uPF9DaGFyVCwgX0FsbG9jPih0aGlzLCBfX2wsIGZhbHNlLCBfX2EpLAorICAgICAgICBjaGFyX3Byb2R1Y2VyPF9DaGFyVD4oKSwgX01fYmFzZShfX2IpLCBfTV9zdGFydChfX3MpCisgICAgICB7CisjaWZuZGVmIF9fR0MKKwlfTV9iYXNlLT5fTV9yZWZfbm9ubmlsKCk7CisjZW5kaWYKKyAgICAgICAgdGhpcy0+X01fdGFnID0gX19kZXRhaWw6Ol9TX3N1YnN0cmluZ2ZuOworICAgICAgfQorICAgIHZpcnR1YWwgfl9Sb3BlX1JvcGVTdWJzdHJpbmcoKSB0aHJvdygpCisgICAgICB7CisjaWZuZGVmIF9fR0MKKwlfTV9iYXNlLT5fTV91bnJlZl9ub25uaWwoKTsKKwkvLyBfTV9mcmVlX2Nfc3RyaW5nKCk7ICAtLSBkb25lIGJ5IHBhcmVudCBjbGFzcworI2VuZGlmCisgICAgICB9CisgICAgfTsKKworICAvLyBTZWxmLWRlc3RydWN0aW5nIHBvaW50ZXJzIHRvIFJvcGVfcmVwLgorICAvLyBUaGVzZSBhcmUgbm90IGNvbnZlbnRpb25hbCBzbWFydCBwb2ludGVycy4gIFRoZWlyCisgIC8vIG9ubHkgcHVycG9zZSBpbiBsaWZlIGlzIHRvIGVuc3VyZSB0aGF0IHVucmVmIGlzIGNhbGxlZAorICAvLyBvbiB0aGUgcG9pbnRlciBlaXRoZXIgYXQgbm9ybWFsIGV4aXQgb3IgaWYgYW4gZXhjZXB0aW9uCisgIC8vIGlzIHJhaXNlZC4gIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0bworICAvLyBhZGp1c3QgcmVmZXJlbmNlIGNvdW50cyB3aGVuIHRoZXNlIHBvaW50ZXJzIGFyZSBpbml0aWFsaXplZAorICAvLyBvciBhc3NpZ25lZCB0by4gIChUaGlzIGNvbnZlbnRpb24gc2lnbmlmaWNhbnRseSByZWR1Y2VzCisgIC8vIHRoZSBudW1iZXIgb2YgcG90ZW50aWFsbHkgZXhwZW5zaXZlIHJlZmVyZW5jZSBjb3VudAorICAvLyB1cGRhdGVzLikKKyNpZm5kZWYgX19HQworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX1JvcGVfc2VsZl9kZXN0cnVjdF9wdHIKKyAgICB7CisgICAgICBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiogX01fcHRyOworCisgICAgICB+X1JvcGVfc2VsZl9kZXN0cnVjdF9wdHIoKQorICAgICAgeyBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPjo6X1NfdW5yZWYoX01fcHRyKTsgfQorI2lmZGVmIF9fRVhDRVBUSU9OUworICAgICAgX1JvcGVfc2VsZl9kZXN0cnVjdF9wdHIoKSA6IF9NX3B0cigwKSB7IH07CisjZWxzZQorICAgICAgX1JvcGVfc2VsZl9kZXN0cnVjdF9wdHIoKSB7IH07CisjZW5kaWYKKyAgICAgIF9Sb3BlX3NlbGZfZGVzdHJ1Y3RfcHRyKF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+KiBfX3ApCisgICAgICA6IF9NX3B0cihfX3ApIHsgfQorICAgIAorICAgICAgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4mCisgICAgICBvcGVyYXRvciooKQorICAgICAgeyByZXR1cm4gKl9NX3B0cjsgfQorICAgIAorICAgICAgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4qCisgICAgICBvcGVyYXRvci0+KCkKKyAgICAgIHsgcmV0dXJuIF9NX3B0cjsgfQorICAgIAorICAgICAgb3BlcmF0b3IgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4qKCkKKyAgICAgIHsgcmV0dXJuIF9NX3B0cjsgfQorICAgIAorICAgICAgX1JvcGVfc2VsZl9kZXN0cnVjdF9wdHImCisgICAgICBvcGVyYXRvcj0oX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4qIF9feCkKKyAgICAgIHsgX01fcHRyID0gX194OyByZXR1cm4gKnRoaXM7IH0KKyAgICB9OworI2VuZGlmCisKKyAgLy8gRGVyZWZlcmVuY2luZyBhIG5vbmNvbnN0IGl0ZXJhdG9yIGhhcyB0byByZXR1cm4gc29tZXRoaW5nCisgIC8vIHRoYXQgYmVoYXZlcyBhbG1vc3QgbGlrZSBhIHJlZmVyZW5jZS4gIEl0J3Mgbm90IHBvc3NpYmxlIHRvCisgIC8vIHJldHVybiBhbiBhY3R1YWwgcmVmZXJlbmNlIHNpbmNlIGFzc2lnbm1lbnQgcmVxdWlyZXMgZXh0cmEKKyAgLy8gd29yay4gIEFuZCB3ZSB3b3VsZCBnZXQgaW50byB0aGUgc2FtZSBwcm9ibGVtcyBhcyB3aXRoIHRoZQorICAvLyBDRDIgdmVyc2lvbiBvZiBiYXNpY19zdHJpbmcuCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGNsYXNzIF9Sb3BlX2NoYXJfcmVmX3Byb3h5CisgICAgeworICAgICAgZnJpZW5kIGNsYXNzIHJvcGU8X0NoYXJULCBfQWxsb2M+OworICAgICAgZnJpZW5kIGNsYXNzIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPjsKKyAgICAgIGZyaWVuZCBjbGFzcyBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsIF9BbGxvYz47CisjaWZkZWYgX19HQworICAgICAgdHlwZWRlZiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiogX1NlbGZfZGVzdHJ1Y3RfcHRyOworI2Vsc2UKKyAgICAgIHR5cGVkZWYgX1JvcGVfc2VsZl9kZXN0cnVjdF9wdHI8X0NoYXJULCBfQWxsb2M+IF9TZWxmX2Rlc3RydWN0X3B0cjsKKyNlbmRpZgorICAgICAgdHlwZWRlZiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiBfUm9wZVJlcDsKKyAgICAgIHR5cGVkZWYgcm9wZTxfQ2hhclQsIF9BbGxvYz4gX015X3JvcGU7CisgICAgICBzaXplX3QgX01fcG9zOworICAgICAgX0NoYXJUIF9NX2N1cnJlbnQ7CisgICAgICBib29sIF9NX2N1cnJlbnRfdmFsaWQ7CisgICAgICBfTXlfcm9wZSogX01fcm9vdDsgICAgIC8vIFRoZSB3aG9sZSByb3BlLgorICAgIHB1YmxpYzoKKyAgICAgIF9Sb3BlX2NoYXJfcmVmX3Byb3h5KF9NeV9yb3BlKiBfX3IsIHNpemVfdCBfX3ApCisgICAgICA6ICBfTV9wb3MoX19wKSwgX01fY3VycmVudCgpLCBfTV9jdXJyZW50X3ZhbGlkKGZhbHNlKSwgX01fcm9vdChfX3IpIHsgfQorCisgICAgICBfUm9wZV9jaGFyX3JlZl9wcm94eShjb25zdCBfUm9wZV9jaGFyX3JlZl9wcm94eSYgX194KQorICAgICAgOiBfTV9wb3MoX194Ll9NX3BvcyksIF9NX2N1cnJlbnQoX194Ll9NX2N1cnJlbnQpLCAKKwlfTV9jdXJyZW50X3ZhbGlkKGZhbHNlKSwgX01fcm9vdChfX3guX01fcm9vdCkgeyB9CisKKyAgICAgIC8vIERvbid0IHByZXNlcnZlIGNhY2hlIGlmIHRoZSByZWZlcmVuY2UgY2FuIG91dGxpdmUgdGhlCisgICAgICAvLyBleHByZXNzaW9uLiAgV2UgY2xhaW0gdGhhdCdzIG5vdCBwb3NzaWJsZSB3aXRob3V0IGNhbGxpbmcKKyAgICAgIC8vIGEgY29weSBjb25zdHJ1Y3RvciBvciBnZW5lcmF0aW5nIHJlZmVyZW5jZSB0byBhIHByb3h5CisgICAgICAvLyByZWZlcmVuY2UuICBXZSBkZWNsYXJlIHRoZSBsYXR0ZXIgdG8gaGF2ZSB1bmRlZmluZWQgc2VtYW50aWNzLgorICAgICAgX1JvcGVfY2hhcl9yZWZfcHJveHkoX015X3JvcGUqIF9fciwgc2l6ZV90IF9fcCwgX0NoYXJUIF9fYykKKyAgICAgIDogX01fcG9zKF9fcCksIF9NX2N1cnJlbnQoX19jKSwgX01fY3VycmVudF92YWxpZCh0cnVlKSwgX01fcm9vdChfX3IpIHsgfQorCisgICAgICBpbmxpbmUgb3BlcmF0b3IgX0NoYXJUICgpIGNvbnN0OworCisgICAgICBfUm9wZV9jaGFyX3JlZl9wcm94eSYKKyAgICAgIG9wZXJhdG9yPShfQ2hhclQgX19jKTsKKyAgICAKKyAgICAgIF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiBvcGVyYXRvciYoKSBjb25zdDsKKyAgICAgIAorICAgICAgX1JvcGVfY2hhcl9yZWZfcHJveHkmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1JvcGVfY2hhcl9yZWZfcHJveHkmIF9fYykKKyAgICAgIHsgcmV0dXJuIG9wZXJhdG9yPSgoX0NoYXJUKV9fYyk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX19BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoX1JvcGVfY2hhcl9yZWZfcHJveHkgPF9DaGFyVCwgX19BbGxvYyA+IF9fYSwKKwkgX1JvcGVfY2hhcl9yZWZfcHJveHkgPF9DaGFyVCwgX19BbGxvYyA+IF9fYikKKyAgICB7CisgICAgICBfQ2hhclQgX190bXAgPSBfX2E7CisgICAgICBfX2EgPSBfX2I7CisgICAgICBfX2IgPSBfX3RtcDsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3MgX1JvcGVfY2hhcl9wdHJfcHJveHkKKyAgICB7CisgICAgICAvLyBYWFggdGhpcyBjbGFzcyBzaG91bGQgYmUgcmV3cml0dGVuLgorICAgICAgZnJpZW5kIGNsYXNzIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCwgX0FsbG9jPjsKKyAgICAgIHNpemVfdCBfTV9wb3M7CisgICAgICByb3BlPF9DaGFyVCxfQWxsb2M+KiBfTV9yb290OyAgICAgLy8gVGhlIHdob2xlIHJvcGUuCisgICAgcHVibGljOgorICAgICAgX1JvcGVfY2hhcl9wdHJfcHJveHkoY29uc3QgX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULF9BbGxvYz4mIF9feCkKKyAgICAgIDogX01fcG9zKF9feC5fTV9wb3MpLCBfTV9yb290KF9feC5fTV9yb290KSB7IH0KKworICAgICAgX1JvcGVfY2hhcl9wdHJfcHJveHkoY29uc3QgX1JvcGVfY2hhcl9wdHJfcHJveHkmIF9feCkKKyAgICAgIDogX01fcG9zKF9feC5fTV9wb3MpLCBfTV9yb290KF9feC5fTV9yb290KSB7IH0KKworICAgICAgX1JvcGVfY2hhcl9wdHJfcHJveHkoKSB7IH0KKyAgICAgIAorICAgICAgX1JvcGVfY2hhcl9wdHJfcHJveHkoX0NoYXJUKiBfX3gpCisgICAgICA6IF9NX3Jvb3QoMCksIF9NX3BvcygwKSB7IH0KKworICAgICAgX1JvcGVfY2hhcl9wdHJfcHJveHkmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1JvcGVfY2hhcl9wdHJfcHJveHkmIF9feCkKKyAgICAgIHsKKyAgICAgICAgX01fcG9zID0gX194Ll9NX3BvczsKKyAgICAgICAgX01fcm9vdCA9IF9feC5fTV9yb290OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVDIsIGNsYXNzIF9BbGxvYzI+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgX1JvcGVfY2hhcl9wdHJfcHJveHk8X0NoYXJUMiwgX0FsbG9jMj4mIF9feCwKKwkJICAgY29uc3QgX1JvcGVfY2hhcl9wdHJfcHJveHk8X0NoYXJUMiwgX0FsbG9jMj4mIF9feSk7CisKKyAgICAgIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+KF9NX3Jvb3QsIF9NX3Bvcyk7IH0KKyAgICB9OworCisgIC8vIFJvcGUgaXRlcmF0b3JzOgorICAvLyBVbmxpa2UgaW4gdGhlIEMgdmVyc2lvbiwgd2UgY2FjaGUgb25seSBwYXJ0IG9mIHRoZSBzdGFjaworICAvLyBmb3Igcm9wZSBpdGVyYXRvcnMsIHNpbmNlIHRoZXkgbXVzdCBiZSBlZmZpY2llbnRseSBjb3B5YWJsZS4KKyAgLy8gV2hlbiB3ZSBydW4gb3V0IG9mIGNhY2hlLCB3ZSBoYXZlIHRvIHJlY29uc3RydWN0IHRoZSBpdGVyYXRvcgorICAvLyB2YWx1ZS4KKyAgLy8gUG9pbnRlcnMgZnJvbSBpdGVyYXRvcnMgYXJlIG5vdCBpbmNsdWRlZCBpbiByZWZlcmVuY2UgY291bnRzLgorICAvLyBJdGVyYXRvcnMgYXJlIGFzc3VtZWQgdG8gYmUgdGhyZWFkIHByaXZhdGUuICBSb3BlcyBjYW4KKyAgLy8gYmUgc2hhcmVkLgorICAKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3MgX1JvcGVfaXRlcmF0b3JfYmFzZQorICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgX0NoYXJUPgorICAgIHsKKyAgICAgIGZyaWVuZCBjbGFzcyByb3BlPF9DaGFyVCwgX0FsbG9jPjsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9BbGxvYyBfYWxsb2NhdG9yX3R5cGU7IC8vIHVzZWQgaW4gX1JvcGVfcm90YXRlLCBWQysrIHdvcmthcm91bmQKKyAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4gX1JvcGVSZXA7CisgICAgICAvLyBCb3JsYW5kIGRvZXNuJ3Qgd2FudCB0aGlzIHRvIGJlIHByb3RlY3RlZC4KKyAgICBwcm90ZWN0ZWQ6CisgICAgICBlbnVtIHsgX1NfcGF0aF9jYWNoZV9sZW4gPSA0IH07IC8vIE11c3QgYmUgPD0gOS4KKyAgICAgIGVudW0geyBfU19pdGVyYXRvcl9idWZfbGVuID0gMTUgfTsKKyAgICAgIHNpemVfdCBfTV9jdXJyZW50X3BvczsKKyAgICAgIF9Sb3BlUmVwKiBfTV9yb290OyAgICAgLy8gVGhlIHdob2xlIHJvcGUuCisgICAgICBzaXplX3QgX01fbGVhZl9wb3M7ICAgIC8vIFN0YXJ0aW5nIHBvc2l0aW9uIGZvciBjdXJyZW50IGxlYWYKKyAgICAgIF9fR0NfQ09OU1QgX0NoYXJUKiBfTV9idWZfc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1ZmZlciBwb3NzaWJseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250YWluaW5nIGN1cnJlbnQgY2hhci4KKyAgICAgIF9fR0NfQ09OU1QgX0NoYXJUKiBfTV9idWZfcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQb2ludGVyIHRvIGN1cnJlbnQgY2hhciBpbiBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICE9IDAgPT0+IGJ1ZmZlciB2YWxpZC4KKyAgICAgIF9fR0NfQ09OU1QgX0NoYXJUKiBfTV9idWZfZW5kOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmUgcGFzdCBfX2xhc3QgdmFsaWQgY2hhciBpbiBidWZmZXIuCisgICAgICAvLyBXaGF0IGZvbGxvd3MgaXMgdGhlIHBhdGggY2FjaGUuICBXZSBnbyBvdXQgb2Ygb3VyCisgICAgICAvLyB3YXkgdG8gbWFrZSB0aGlzIGNvbXBhY3QuCisgICAgICAvLyBQYXRoX2VuZCBjb250YWlucyB0aGUgYm90dG9tIHNlY3Rpb24gb2YgdGhlIHBhdGggZnJvbQorICAgICAgLy8gdGhlIHJvb3QgdG8gdGhlIGN1cnJlbnQgbGVhZi4KKyAgICAgIGNvbnN0IF9Sb3BlUmVwKiBfTV9wYXRoX2VuZFtfU19wYXRoX2NhY2hlX2xlbl07CisgICAgICBpbnQgX01fbGVhZl9pbmRleDsgICAgIC8vIExhc3QgdmFsaWQgX19wb3MgaW4gcGF0aF9lbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIF9NX3BhdGhfZW5kWzBdIC4uLiBfTV9wYXRoX2VuZFtsZWFmX2luZGV4LTFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IHRvIGNvbmNhdGVuYXRpb24gbm9kZXMuCisgICAgICB1bnNpZ25lZCBjaGFyIF9NX3BhdGhfZGlyZWN0aW9uczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHBhdGhfZGlyZWN0aW9ucyA+PiBfX2kpICYgMSBpcyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmZiB3ZSBnb3QgZnJvbSBfTV9wYXRoX2VuZFtsZWFmX2luZGV4IC0gX19pIC0gMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gX01fcGF0aF9lbmRbbGVhZl9pbmRleCAtIF9faV0gYnkgZ29pbmcgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIF9fcmlnaHQuIEFzc3VtZXMgcGF0aF9jYWNoZV9sZW4gPD0gOS4KKyAgICAgIF9DaGFyVCBfTV90bXBfYnVmW19TX2l0ZXJhdG9yX2J1Zl9sZW5dOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvcnQgYnVmZmVyIGZvciBzdXJyb3VuZGluZyBjaGFycy4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdXNlZnVsIHByaW1hcmlseSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJvcGVGdW5jdGlvbnMuICBXZSBwdXQgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSB0byBhdm9pZCBsb2NraW5nIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGl0aHJlYWRlZCBjYXNlLgorICAgICAgLy8gVGhlIGNhY2hlZCBwYXRoIGlzIGdlbmVyYWxseSBhc3N1bWVkIHRvIGJlIHZhbGlkCisgICAgICAvLyBvbmx5IGlmIHRoZSBidWZmZXIgaXMgdmFsaWQuCisgICAgICBzdGF0aWMgdm9pZCBfU19zZXRidWYoX1JvcGVfaXRlcmF0b3JfYmFzZSYgX194KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgYnVmZmVyIGNvbnRlbnRzIGdpdmVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF0aCBjYWNoZS4KKyAgICAgIHN0YXRpYyB2b2lkIF9TX3NldGNhY2hlKF9Sb3BlX2l0ZXJhdG9yX2Jhc2UmIF9feCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGJ1ZmZlciBjb250ZW50cyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXRoIGNhY2hlLgorICAgICAgc3RhdGljIHZvaWQgX1Nfc2V0Y2FjaGVfZm9yX2luY3IoX1JvcGVfaXRlcmF0b3JfYmFzZSYgX194KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcyBhYm92ZSwgYnV0IGFzc3VtZXMgcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlIGlzIHZhbGlkIGZvciBwcmV2aW91cyBwb3NuLgorICAgICAgX1JvcGVfaXRlcmF0b3JfYmFzZSgpIHsgfQorCisgICAgICBfUm9wZV9pdGVyYXRvcl9iYXNlKF9Sb3BlUmVwKiBfX3Jvb3QsIHNpemVfdCBfX3BvcykKKyAgICAgIDogX01fY3VycmVudF9wb3MoX19wb3MpLCBfTV9yb290KF9fcm9vdCksIF9NX2J1Zl9wdHIoMCkgeyB9CisKKyAgICAgIHZvaWQgX01faW5jcihzaXplX3QgX19uKTsKKyAgICAgIHZvaWQgX01fZGVjcihzaXplX3QgX19uKTsKKyAgICBwdWJsaWM6CisgICAgICBzaXplX3QKKyAgICAgIGluZGV4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2N1cnJlbnRfcG9zOyB9CisgICAgCisgICAgICBfUm9wZV9pdGVyYXRvcl9iYXNlKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yX2Jhc2UmIF9feCkKKyAgICAgIHsKKyAgICAgICAgaWYgKDAgIT0gX194Ll9NX2J1Zl9wdHIpCisJICAqdGhpcyA9IF9feDsKKwllbHNlCisJICB7CisgICAgICAgICAgICBfTV9jdXJyZW50X3BvcyA9IF9feC5fTV9jdXJyZW50X3BvczsKKyAgICAgICAgICAgIF9NX3Jvb3QgPSBfX3guX01fcm9vdDsKKyAgICAgICAgICAgIF9NX2J1Zl9wdHIgPSAwOworCSAgfQorICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3MgX1JvcGVfaXRlcmF0b3I7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3MgX1JvcGVfY29uc3RfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPgorICAgIHsKKyAgICAgIGZyaWVuZCBjbGFzcyByb3BlPF9DaGFyVCwgX0FsbG9jPjsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+IF9Sb3BlUmVwOworICAgICAgLy8gVGhlIG9uZSBmcm9tIHRoZSBiYXNlIGNsYXNzIG1heSBub3QgYmUgZGlyZWN0bHkgdmlzaWJsZS4KKyAgICAgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yKGNvbnN0IF9Sb3BlUmVwKiBfX3Jvb3QsIHNpemVfdCBfX3BvcykKKyAgICAgIDogX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsIF9BbGxvYz4oY29uc3RfY2FzdDxfUm9wZVJlcCo+KF9fcm9vdCksCisJCQkJCSAgICBfX3BvcykKKyAgICAgICAgICAgICAgICAgICAvLyBPbmx5IG5vbmNvbnN0IGl0ZXJhdG9ycyBtb2RpZnkgcm9vdCByZWYgY291bnQKKyAgICAgIHsgfQorICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9DaGFyVCByZWZlcmVuY2U7ICAgLy8gUmVhbGx5IGEgdmFsdWUuICBSZXR1cm5pbmcgYSByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXb3VsZCBiZSBhIG1lc3MsIHNpbmNlIGl0IHdvdWxkIGhhdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSBpbmNsdWRlZCBpbiByZWZjb3VudC4KKyAgICAgIHR5cGVkZWYgY29uc3QgX0NoYXJUKiBwb2ludGVyOworCisgICAgcHVibGljOgorICAgICAgX1JvcGVfY29uc3RfaXRlcmF0b3IoKSB7IH07CisKKyAgICAgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yKGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yJiBfX3gpCisgICAgICA6IF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz4oX194KSB7IH0KKworICAgICAgX1JvcGVfY29uc3RfaXRlcmF0b3IoY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4mIF9feCk7CisgICAgCisgICAgICBfUm9wZV9jb25zdF9pdGVyYXRvcihjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19yLCBzaXplX3QgX19wb3MpCisgICAgICA6IF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULF9BbGxvYz4oX19yLl9NX3RyZWVfcHRyLCBfX3BvcykgeyB9CisKKyAgICAgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yJiBfX3gpCisgICAgICB7CisgICAgICAgIGlmICgwICE9IF9feC5fTV9idWZfcHRyKQorCSAgKihzdGF0aWNfY2FzdDxfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPio+KHRoaXMpKSA9IF9feDsKKwllbHNlCisJICB7CisgICAgICAgICAgICB0aGlzLT5fTV9jdXJyZW50X3BvcyA9IF9feC5fTV9jdXJyZW50X3BvczsKKyAgICAgICAgICAgIHRoaXMtPl9NX3Jvb3QgPSBfX3guX01fcm9vdDsKKyAgICAgICAgICAgIHRoaXMtPl9NX2J1Zl9wdHIgPSAwOworCSAgfQorICAgICAgICByZXR1cm4oKnRoaXMpOworICAgICAgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpCisgICAgICB7CisgICAgICAgIGlmICgwID09IHRoaXMtPl9NX2J1Zl9wdHIpCisJICB0aGlzLT5fU19zZXRjYWNoZSgqdGhpcyk7CisgICAgICAgIHJldHVybiAqdGhpcy0+X01fYnVmX3B0cjsKKyAgICAgIH0KKworICAgICAgLy8gV2l0aG91dCB0aGlzIGNvbnN0IHZlcnNpb24sIFJvcGUgaXRlcmF0b3JzIGRvIG5vdCBtZWV0IHRoZQorICAgICAgLy8gcmVxdWlyZW1lbnRzIG9mIGFuIElucHV0IEl0ZXJhdG9yLgorICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeworCXJldHVybiAqY29uc3RfY2FzdDxfUm9wZV9jb25zdF9pdGVyYXRvciY+KCp0aGlzKTsKKyAgICAgIH0KKworICAgICAgX1JvcGVfY29uc3RfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKyAgICAgICAgX19HQ19DT05TVCBfQ2hhclQqIF9fbmV4dDsKKyAgICAgICAgaWYgKDAgIT0gdGhpcy0+X01fYnVmX3B0cgorCSAgICAmJiAoX19uZXh0ID0gdGhpcy0+X01fYnVmX3B0ciArIDEpIDwgdGhpcy0+X01fYnVmX2VuZCkKKwkgIHsKKyAgICAgICAgICAgIHRoaXMtPl9NX2J1Zl9wdHIgPSBfX25leHQ7CisgICAgICAgICAgICArK3RoaXMtPl9NX2N1cnJlbnRfcG9zOworCSAgfQorCWVsc2UKKwkgIHRoaXMtPl9NX2luY3IoMSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfUm9wZV9jb25zdF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKz0ocHRyZGlmZl90IF9fbikKKyAgICAgIHsKKyAgICAgICAgaWYgKF9fbiA+PSAwKQorCSAgdGhpcy0+X01faW5jcihfX24pOworCWVsc2UKKwkgIHRoaXMtPl9NX2RlY3IoLV9fbik7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfUm9wZV9jb25zdF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeworICAgICAgICB0aGlzLT5fTV9kZWNyKDEpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3ItPShwdHJkaWZmX3QgX19uKQorICAgICAgeworICAgICAgICBpZiAoX19uID49IDApCisJICB0aGlzLT5fTV9kZWNyKF9fbik7CisJZWxzZQorCSAgdGhpcy0+X01faW5jcigtX19uKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90IF9fb2xkX3BvcyA9IHRoaXMtPl9NX2N1cnJlbnRfcG9zOworICAgICAgICB0aGlzLT5fTV9pbmNyKDEpOworICAgICAgICByZXR1cm4gX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4odGhpcy0+X01fcm9vdCwgX19vbGRfcG9zKTsKKyAgICAgICAgLy8gVGhpcyBtYWtlcyBhIHN1YnNlcXVlbnQgZGVyZWZlcmVuY2UgZXhwZW5zaXZlLgorICAgICAgICAvLyBQZXJoYXBzIHdlIHNob3VsZCBpbnN0ZWFkIGNvcHkgdGhlIGl0ZXJhdG9yCisgICAgICAgIC8vIGlmIGl0IGhhcyBhIHZhbGlkIGNhY2hlPworICAgICAgfQorCisgICAgICBfUm9wZV9jb25zdF9pdGVyYXRvcgorICAgICAgb3BlcmF0b3ItLShpbnQpCisgICAgICB7CisgICAgICAgIHNpemVfdCBfX29sZF9wb3MgPSB0aGlzLT5fTV9jdXJyZW50X3BvczsKKyAgICAgICAgdGhpcy0+X01fZGVjcigxKTsKKyAgICAgICAgcmV0dXJuIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+KHRoaXMtPl9NX3Jvb3QsIF9fb2xkX3Bvcyk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVDIsIGNsYXNzIF9BbGxvYzI+CisgICAgICAgIGZyaWVuZCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPgorICAgICAgICBvcGVyYXRvci0oY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4mIF9feCwKKwkJICBwdHJkaWZmX3QgX19uKTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUMiwgY2xhc3MgX0FsbG9jMj4KKyAgICAgICAgZnJpZW5kIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+CisgICAgICAgIG9wZXJhdG9yKyhjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPiYgX194LAorCQkgIHB0cmRpZmZfdCBfX24pOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4KKyAgICAgICAgb3BlcmF0b3IrKHB0cmRpZmZfdCBfX24sCisJCSAgY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4mIF9feCk7CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3QgX19uKQorICAgICAgeyByZXR1cm4gcm9wZTxfQ2hhclQsIF9BbGxvYz46Ol9TX2ZldGNoKHRoaXMtPl9NX3Jvb3QsCisJCQkJCSAgICAgIHRoaXMtPl9NX2N1cnJlbnRfcG9zICsgX19uKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcj09KGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3gsCisJCSAgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3kpOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcjwoY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4mIF9feCwKKwkJICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPiYgX195KTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUMiwgY2xhc3MgX0FsbG9jMj4KKyAgICAgICAgZnJpZW5kIHB0cmRpZmZfdAorICAgICAgICBvcGVyYXRvci0oY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4mIF9feCwKKwkJICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPiYgX195KTsKKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGNsYXNzIF9Sb3BlX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsIF9BbGxvYz4KKyAgICB7CisgICAgICBmcmllbmQgY2xhc3Mgcm9wZTxfQ2hhclQsIF9BbGxvYz47CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPjo6X1JvcGVSZXAgX1JvcGVSZXA7CisgICAgICByb3BlPF9DaGFyVCwgX0FsbG9jPiogX01fcm9vdF9yb3BlOworCisgICAgICAvLyByb290IGlzIHRyZWF0ZWQgYXMgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGlzLCBhbmQgaXMgdXNlZCB0bworICAgICAgLy8gZGV0ZWN0IGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgcm9wZS4KKworICAgICAgLy8gUm9vdCBpcyBpbmNsdWRlZCBpbiB0aGUgcmVmZXJlbmNlIGNvdW50LiAgVGhpcyBpcyBuZWNlc3NhcnkKKyAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIGRldGVjdCBjaGFuZ2VzIHJlbGlhYmx5LiAgVW5mb3J0dW5hdGVseSwgaXQKKyAgICAgIC8vIHJlcXVpcmVzIGNhcmVmdWwgYm9va2tlZXBpbmcgZm9yIHRoZSBub25HQyBjYXNlLgorICAgICAgX1JvcGVfaXRlcmF0b3Iocm9wZTxfQ2hhclQsIF9BbGxvYz4qIF9fciwgc2l6ZV90IF9fcG9zKQorICAgICAgOiBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPihfX3ItPl9NX3RyZWVfcHRyLCBfX3BvcyksCisgICAgICAgIF9NX3Jvb3Rfcm9wZShfX3IpCisgICAgICB7IF9Sb3BlUmVwOjpfU19yZWYodGhpcy0+X01fcm9vdCk7CisgICAgICAgIGlmICghKF9fciAtPiBlbXB0eSgpKSkKKwkgIHRoaXMtPl9TX3NldGNhY2hlKCp0aGlzKTsKKyAgICAgIH0KKworICAgICAgdm9pZCBfTV9jaGVjaygpOworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+ICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiogcG9pbnRlcjsKKworICAgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz4mCisgICAgICBjb250YWluZXIoKQorICAgICAgeyByZXR1cm4gKl9NX3Jvb3Rfcm9wZTsgfQorCisgICAgICBfUm9wZV9pdGVyYXRvcigpCisgICAgICB7CisgICAgICAgIHRoaXMtPl9NX3Jvb3QgPSAwOyAgLy8gTmVlZGVkIGZvciByZWZlcmVuY2UgY291bnRpbmcuCisgICAgICB9OworCisgICAgICBfUm9wZV9pdGVyYXRvcihjb25zdCBfUm9wZV9pdGVyYXRvciYgX194KQorICAgICAgOiBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPihfX3gpCisgICAgICB7CisgICAgICAgIF9NX3Jvb3Rfcm9wZSA9IF9feC5fTV9yb290X3JvcGU7CisgICAgICAgIF9Sb3BlUmVwOjpfU19yZWYodGhpcy0+X01fcm9vdCk7CisgICAgICB9CisKKyAgICAgIF9Sb3BlX2l0ZXJhdG9yKHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3IsIHNpemVfdCBfX3Bvcyk7CisKKyAgICAgIH5fUm9wZV9pdGVyYXRvcigpCisgICAgICB7IF9Sb3BlUmVwOjpfU191bnJlZih0aGlzLT5fTV9yb290KTsgfQorCisgICAgICBfUm9wZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfUm9wZV9pdGVyYXRvciYgX194KQorICAgICAgeworICAgICAgICBfUm9wZVJlcCogX19vbGQgPSB0aGlzLT5fTV9yb290OworCQorICAgICAgICBfUm9wZVJlcDo6X1NfcmVmKF9feC5fTV9yb290KTsKKyAgICAgICAgaWYgKDAgIT0gX194Ll9NX2J1Zl9wdHIpCisJICB7CisgICAgICAgICAgICBfTV9yb290X3JvcGUgPSBfX3guX01fcm9vdF9yb3BlOworICAgICAgICAgICAgKihzdGF0aWNfY2FzdDxfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPio+KHRoaXMpKSA9IF9feDsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIHRoaXMtPl9NX2N1cnJlbnRfcG9zID0gX194Ll9NX2N1cnJlbnRfcG9zOworICAgICAgICAgICAgdGhpcy0+X01fcm9vdCA9IF9feC5fTV9yb290OworICAgICAgICAgICAgX01fcm9vdF9yb3BlID0gX194Ll9NX3Jvb3Rfcm9wZTsKKyAgICAgICAgICAgIHRoaXMtPl9NX2J1Zl9wdHIgPSAwOworCSAgfQorICAgICAgICBfUm9wZVJlcDo6X1NfdW5yZWYoX19vbGQpOworICAgICAgICByZXR1cm4oKnRoaXMpOworICAgICAgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpCisgICAgICB7CisgICAgICAgIF9NX2NoZWNrKCk7CisgICAgICAgIGlmICgwID09IHRoaXMtPl9NX2J1Zl9wdHIpCisJICByZXR1cm4gX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+KF9NX3Jvb3Rfcm9wZSwKKwkJCQkJCSAgICAgIHRoaXMtPl9NX2N1cnJlbnRfcG9zKTsKKwllbHNlCisJICByZXR1cm4gX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+KF9NX3Jvb3Rfcm9wZSwKKwkJCQkJCSAgICAgIHRoaXMtPl9NX2N1cnJlbnRfcG9zLAorCQkJCQkJICAgICAgKnRoaXMtPl9NX2J1Zl9wdHIpOworICAgICAgfQorCisgICAgICAvLyBTZWUgYWJvdmUgY29tbWVudC4KKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gKmNvbnN0X2Nhc3Q8X1JvcGVfaXRlcmF0b3ImPigqdGhpcyk7CisgICAgICB9CisKKyAgICAgIF9Sb3BlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisgICAgICAgIHRoaXMtPl9NX2luY3IoMSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1JvcGVfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcis9KHB0cmRpZmZfdCBfX24pCisgICAgICB7CisgICAgICAgIGlmIChfX24gPj0gMCkKKwkgIHRoaXMtPl9NX2luY3IoX19uKTsKKwllbHNlCisJICB0aGlzLT5fTV9kZWNyKC1fX24pOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1JvcGVfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvci0tKCkKKyAgICAgIHsKKyAgICAgICAgdGhpcy0+X01fZGVjcigxKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfUm9wZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yLT0ocHRyZGlmZl90IF9fbikKKyAgICAgIHsKKyAgICAgICAgaWYgKF9fbiA+PSAwKQorCSAgdGhpcy0+X01fZGVjcihfX24pOworCWVsc2UKKwkgIHRoaXMtPl9NX2luY3IoLV9fbik7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfUm9wZV9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisgICAgICAgIHNpemVfdCBfX29sZF9wb3MgPSB0aGlzLT5fTV9jdXJyZW50X3BvczsKKyAgICAgICAgdGhpcy0+X01faW5jcigxKTsKKyAgICAgICAgcmV0dXJuIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+KF9NX3Jvb3Rfcm9wZSwgX19vbGRfcG9zKTsKKyAgICAgIH0KKworICAgICAgX1JvcGVfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yLS0oaW50KQorICAgICAgeworICAgICAgICBzaXplX3QgX19vbGRfcG9zID0gdGhpcy0+X01fY3VycmVudF9wb3M7CisgICAgICAgIHRoaXMtPl9NX2RlY3IoMSk7CisgICAgICAgIHJldHVybiBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPihfTV9yb290X3JvcGUsIF9fb2xkX3Bvcyk7CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShwdHJkaWZmX3QgX19uKQorICAgICAgeyByZXR1cm4gX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+KF9NX3Jvb3Rfcm9wZSwKKwkJCQkJCSAgICB0aGlzLT5fTV9jdXJyZW50X3BvcworCQkJCQkJICAgICsgX19uKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcj09KGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3gsCisJCSAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3kpOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcjwoY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4mIF9feCwKKwkJICBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPiYgX195KTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUMiwgY2xhc3MgX0FsbG9jMj4KKyAgICAgICAgZnJpZW5kIHB0cmRpZmZfdAorICAgICAgICBvcGVyYXRvci0oY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4mIF9feCwKKwkJICBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPiYgX195KTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUMiwgY2xhc3MgX0FsbG9jMj4KKyAgICAgICAgZnJpZW5kIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+CisgICAgICAgIG9wZXJhdG9yLShjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPiYgX194LCBwdHJkaWZmX3QgX19uKTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUMiwgY2xhc3MgX0FsbG9jMj4KKyAgICAgICAgZnJpZW5kIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+CisgICAgICAgIG9wZXJhdG9yKyhjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPiYgX194LCBwdHJkaWZmX3QgX19uKTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUMiwgY2xhc3MgX0FsbG9jMj4KKyAgICAgICAgZnJpZW5kIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+CisgICAgICAgIG9wZXJhdG9yKyhwdHJkaWZmX3QgX19uLCBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPiYgX194KTsKKyAgICB9OworCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfUm9wZV9iYXNlCisgICAgOiBwdWJsaWMgX0FsbG9jCisgICAgeworICAgICAgdHlwZWRlZiBfQWxsb2MgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBfQWxsb2MqPih0aGlzKTsgfQorCisgICAgICBhbGxvY2F0b3JfdHlwZSYKKyAgICAgIF9NX2dldF9hbGxvY2F0b3IoKQorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PF9BbGxvYyo+KHRoaXMpOyB9CisKKyAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJgorICAgICAgX01fZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgX0FsbG9jKj4odGhpcyk7IH0KKworICAgICAgdHlwZWRlZiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiBfUm9wZVJlcDsKKyAgICAgIC8vIFRoZSBvbmUgaW4gX0Jhc2UgbWF5IG5vdCBiZSB2aXNpYmxlIGR1ZSB0byB0ZW1wbGF0ZSBydWxlcy4KKworICAgICAgX1JvcGVfYmFzZShfUm9wZVJlcCogX190LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYpCisgICAgICA6IF9NX3RyZWVfcHRyKF9fdCkgeyB9CisKKyAgICAgIF9Sb3BlX2Jhc2UoY29uc3QgYWxsb2NhdG9yX3R5cGUmKSB7IH0KKworICAgICAgLy8gVGhlIG9ubHkgZGF0YSBtZW1iZXIgb2YgYSByb3BlOgorICAgICAgX1JvcGVSZXAgKl9NX3RyZWVfcHRyOworCisjZGVmaW5lIF9fUk9QRV9ERUZJTkVfQUxMT0MoX1RwLCBfX25hbWUpIFwKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBcCisgICAgICAgICAgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X1RwPjo6b3RoZXIgX19uYW1lIyNBbGxvYzsgXAorICAgICAgICBzdGF0aWMgX1RwKiBfX25hbWUjI19hbGxvY2F0ZShzaXplX3QgX19uKSBcCisgICAgICAgICAgeyByZXR1cm4gX19uYW1lIyNBbGxvYygpLmFsbG9jYXRlKF9fbik7IH0gXAorICAgICAgICBzdGF0aWMgdm9pZCBfX25hbWUjI19kZWFsbG9jYXRlKF9UcCAqX19wLCBzaXplX3QgX19uKSBcCisgICAgICAgICAgeyBfX25hbWUjI0FsbG9jKCkuZGVhbGxvY2F0ZShfX3AsIF9fbik7IH0KKyAgICAgIF9fUk9QRV9ERUZJTkVfQUxMT0NTKF9BbGxvYykKKyN1bmRlZiBfX1JPUEVfREVGSU5FX0FMTE9DCisKKwlwcm90ZWN0ZWQ6CisgICAgICBfUm9wZV9iYXNlJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9Sb3BlX2Jhc2UmKTsKKyAgICAgIAorICAgICAgX1JvcGVfYmFzZShjb25zdCBfUm9wZV9iYXNlJik7CisgICAgfTsKKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICAqLworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3Mgcm9wZSA6IHB1YmxpYyBfUm9wZV9iYXNlPF9DaGFyVCwgX0FsbG9jPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9DaGFyVCB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBfQ2hhclQgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCBfQ2hhclQqIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+IGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz4gcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsIF9BbGxvYz4gcG9pbnRlcjsKKworICAgICAgZnJpZW5kIGNsYXNzIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPjsKKyAgICAgIGZyaWVuZCBjbGFzcyBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz47CisgICAgICBmcmllbmQgc3RydWN0IF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+OworICAgICAgZnJpZW5kIGNsYXNzIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+OworICAgICAgZnJpZW5kIGNsYXNzIF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCwgX0FsbG9jPjsKKyAgICAgIGZyaWVuZCBjbGFzcyBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz47CisgICAgICBmcmllbmQgc3RydWN0IF9Sb3BlX1JvcGVTdWJzdHJpbmc8X0NoYXJULCBfQWxsb2M+OworCisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBfUm9wZV9iYXNlPF9DaGFyVCwgX0FsbG9jPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX3RyZWVfcHRyOworICAgICAgdXNpbmcgX0Jhc2U6OmdldF9hbGxvY2F0b3I7CisgICAgICB1c2luZyBfQmFzZTo6X01fZ2V0X2FsbG9jYXRvcjsgICAgICAKKyAgICAgIHR5cGVkZWYgX19HQ19DT05TVCBfQ2hhclQqIF9Dc3RycHRyOworICAgICAgCisgICAgICBzdGF0aWMgX0NoYXJUIF9TX2VtcHR5X2Nfc3RyWzFdOworICAgICAgCisgICAgICBzdGF0aWMgYm9vbAorICAgICAgX1NfaXMwKF9DaGFyVCBfX2MpCisgICAgICB7IHJldHVybiBfX2MgPT0gX1NfZW9zKChfQ2hhclQqKTApOyB9CisgICAgICAKKyAgICAgIGVudW0geyBfU19jb3B5X21heCA9IDIzIH07CisgICAgICAgICAgICAgICAgLy8gRm9yIHN0cmluZ3Mgc2hvcnRlciB0aGFuIF9TX2NvcHlfbWF4LCB3ZSBjb3B5IHRvCisgICAgICAgICAgICAgICAgLy8gY29uY2F0ZW5hdGUuCisKKyAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4gX1JvcGVSZXA7CisgICAgICB0eXBlZGVmIF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uPF9DaGFyVCwgX0FsbG9jPiBfUm9wZUNvbmNhdGVuYXRpb247CisgICAgICB0eXBlZGVmIF9Sb3BlX1JvcGVMZWFmPF9DaGFyVCwgX0FsbG9jPiBfUm9wZUxlYWY7CisgICAgICB0eXBlZGVmIF9Sb3BlX1JvcGVGdW5jdGlvbjxfQ2hhclQsIF9BbGxvYz4gX1JvcGVGdW5jdGlvbjsKKyAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZVN1YnN0cmluZzxfQ2hhclQsIF9BbGxvYz4gX1JvcGVTdWJzdHJpbmc7CisKKyAgICAgIC8vIFJldHJpZXZlIGEgY2hhcmFjdGVyIGF0IHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24uCisgICAgICBzdGF0aWMgX0NoYXJUIF9TX2ZldGNoKF9Sb3BlUmVwKiBfX3IsIHNpemVfdHlwZSBfX3Bvcyk7CisKKyNpZm5kZWYgX19HQworICAgICAgLy8gT2J0YWluIGEgcG9pbnRlciB0byB0aGUgY2hhcmFjdGVyIGF0IHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24uCisgICAgICAvLyBUaGUgcG9pbnRlciBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIGNoYXJhY3Rlci4KKyAgICAgIC8vIElmIHN1Y2ggYSBwb2ludGVyIGNhbm5vdCBiZSBwcm9kdWNlZCwgYXMgaXMgZnJlcXVlbnRseSB0aGUKKyAgICAgIC8vIGNhc2UsIDAgaXMgcmV0dXJuZWQgaW5zdGVhZC4KKyAgICAgIC8vIChSZXR1cm5zIG5vbnplcm8gb25seSBpZiBhbGwgbm9kZXMgaW4gdGhlIHBhdGggaGF2ZSBhIHJlZmNvdW50CisgICAgICAvLyBvZiAxLikKKyAgICAgIHN0YXRpYyBfQ2hhclQqIF9TX2ZldGNoX3B0cihfUm9wZVJlcCogX19yLCBzaXplX3R5cGUgX19wb3MpOworI2VuZGlmCisKKyAgICAgIHN0YXRpYyBib29sCisgICAgICBfU19hcHBseV90b19waWVjZXMoLy8gc2hvdWxkIGJlIHRlbXBsYXRlIHBhcmFtZXRlcgorCQkJIF9Sb3BlX2NoYXJfY29uc3VtZXI8X0NoYXJUPiYgX19jLAorCQkJIGNvbnN0IF9Sb3BlUmVwKiBfX3IsCisJCQkgc2l6ZV90IF9fYmVnaW4sIHNpemVfdCBfX2VuZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVnaW4gYW5kIGVuZCBhcmUgYXNzdW1lZCB0byBiZSBpbiByYW5nZS4KKworI2lmbmRlZiBfX0dDCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfdW5yZWYoX1JvcGVSZXAqIF9fdCkKKyAgICAgIHsgX1JvcGVSZXA6Ol9TX3VucmVmKF9fdCk7IH0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX3JlZihfUm9wZVJlcCogX190KQorICAgICAgeyBfUm9wZVJlcDo6X1NfcmVmKF9fdCk7IH0KKworI2Vsc2UgLyogX19HQyAqLworICAgICAgc3RhdGljIHZvaWQgX1NfdW5yZWYoX1JvcGVSZXAqKSB7IH0KKyAgICAgIHN0YXRpYyB2b2lkIF9TX3JlZihfUm9wZVJlcCopIHsgfQorI2VuZGlmCisKKyNpZmRlZiBfX0dDCisgICAgICB0eXBlZGVmIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+KiBfU2VsZl9kZXN0cnVjdF9wdHI7CisjZWxzZQorICAgICAgdHlwZWRlZiBfUm9wZV9zZWxmX2Rlc3RydWN0X3B0cjxfQ2hhclQsIF9BbGxvYz4gX1NlbGZfZGVzdHJ1Y3RfcHRyOworI2VuZGlmCisKKyAgICAgIC8vIF9SZXN1bHQgaXMgY291bnRlZCBpbiByZWZjb3VudC4KKyAgICAgIHN0YXRpYyBfUm9wZVJlcCogX1Nfc3Vic3RyaW5nKF9Sb3BlUmVwKiBfX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19zdGFydCwgc2l6ZV90IF9fZW5kcDEpOworCisgICAgICBzdGF0aWMgX1JvcGVSZXAqIF9TX2NvbmNhdF9jaGFyX2l0ZXIoX1JvcGVSZXAqIF9fciwKKwkJCQkJICAgY29uc3QgX0NoYXJUKiBfX2l0ZXIsIHNpemVfdCBfX3NsZW4pOworICAgICAgLy8gQ29uY2F0ZW5hdGUgcm9wZSBhbmQgY2hhciBwdHIsIGNvcHlpbmcgX19zLgorICAgICAgLy8gU2hvdWxkIHJlYWxseSB0YWtlIGFuIGFyYml0cmFyeSBpdGVyYXRvci4KKyAgICAgIC8vIFJlc3VsdCBpcyBjb3VudGVkIGluIHJlZmNvdW50LgorICAgICAgc3RhdGljIF9Sb3BlUmVwKiBfU19kZXN0cl9jb25jYXRfY2hhcl9pdGVyKF9Sb3BlUmVwKiBfX3IsCisJCQkJCQkgY29uc3QgX0NoYXJUKiBfX2l0ZXIsCisJCQkJCQkgc2l6ZV90IF9fc2xlbikKKwkvLyBBcyBhYm92ZSwgYnV0IG9uZSByZWZlcmVuY2UgdG8gX19yIGlzIGFib3V0IHRvIGJlCisJLy8gZGVzdHJveWVkLiAgVGh1cyB0aGUgcGllY2VzIG1heSBiZSByZWN5Y2xlZCBpZiBhbGwKKwkvLyByZWxldmFudCByZWZlcmVuY2UgY291bnRzIGFyZSAxLgorI2lmZGVmIF9fR0MKKwkvLyBXZSBjYW4ndCByZWFsbHkgZG8gYW55dGhpbmcgc2luY2UgcmVmY291bnRzIGFyZSB1bmF2YWlsYWJsZS4KKyAgICAgIHsgcmV0dXJuIF9TX2NvbmNhdF9jaGFyX2l0ZXIoX19yLCBfX2l0ZXIsIF9fc2xlbik7IH0KKyNlbHNlCisgICAgICA7CisjZW5kaWYKKworICAgICAgc3RhdGljIF9Sb3BlUmVwKiBfU19jb25jYXQoX1JvcGVSZXAqIF9fbGVmdCwgX1JvcGVSZXAqIF9fcmlnaHQpOworICAgICAgLy8gR2VuZXJhbCBjb25jYXRlbmF0aW9uIG9uIF9Sb3BlUmVwLiAgX1Jlc3VsdAorICAgICAgLy8gaGFzIHJlZmNvdW50IG9mIDEuICBBZGp1c3RzIGFyZ3VtZW50IHJlZmNvdW50cy4KKworICAgcHVibGljOgorICAgICAgdm9pZAorICAgICAgYXBwbHlfdG9fcGllY2VzKHNpemVfdCBfX2JlZ2luLCBzaXplX3QgX19lbmQsCisJCSAgICAgIF9Sb3BlX2NoYXJfY29uc3VtZXI8X0NoYXJUPiYgX19jKSBjb25zdAorICAgICAgeyBfU19hcHBseV90b19waWVjZXMoX19jLCB0aGlzLT5fTV90cmVlX3B0ciwgX19iZWdpbiwgX19lbmQpOyB9CisKKyAgIHByb3RlY3RlZDoKKworICAgICAgc3RhdGljIHNpemVfdAorICAgICAgX1Nfcm91bmRlZF91cF9zaXplKHNpemVfdCBfX24pCisgICAgICB7IHJldHVybiBfUm9wZUxlYWY6Ol9TX3JvdW5kZWRfdXBfc2l6ZShfX24pOyB9CisKKyAgICAgIHN0YXRpYyBzaXplX3QKKyAgICAgIF9TX2FsbG9jYXRlZF9jYXBhY2l0eShzaXplX3QgX19uKQorICAgICAgeworCWlmIChfU19pc19iYXNpY19jaGFyX3R5cGUoKF9DaGFyVCopMCkpCisJICByZXR1cm4gX1Nfcm91bmRlZF91cF9zaXplKF9fbikgLSAxOworCWVsc2UKKwkgIHJldHVybiBfU19yb3VuZGVkX3VwX3NpemUoX19uKTsKKwkKKyAgICAgIH0KKworICAgICAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhIFJvcGVMZWFmIHVzaW5nIHRoZSBzdXBwbGllZCBhbGxvY2F0b3IKKyAgICAgIC8vIFRha2VzIG93bmVyc2hpcCBvZiBzIGluc3RlYWQgb2YgY29weWluZy4KKyAgICAgIHN0YXRpYyBfUm9wZUxlYWYqCisgICAgICBfU19uZXdfUm9wZUxlYWYoX19HQ19DT05TVCBfQ2hhclQgKl9fcywKKwkJICAgICAgc2l6ZV90IF9fc2l6ZSwgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIHsKKwlfUm9wZUxlYWYqIF9fc3BhY2UgPSB0eXBlbmFtZSBfQmFzZTo6X0xBbGxvYyhfX2EpLmFsbG9jYXRlKDEpOworCXJldHVybiBuZXcoX19zcGFjZSkgX1JvcGVMZWFmKF9fcywgX19zaXplLCBfX2EpOworICAgICAgfQorCisgICAgICBzdGF0aWMgX1JvcGVDb25jYXRlbmF0aW9uKgorICAgICAgX1NfbmV3X1JvcGVDb25jYXRlbmF0aW9uKF9Sb3BlUmVwKiBfX2xlZnQsIF9Sb3BlUmVwKiBfX3JpZ2h0LAorCQkJICAgICAgIGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICB7CisJX1JvcGVDb25jYXRlbmF0aW9uKiBfX3NwYWNlID0gdHlwZW5hbWUgX0Jhc2U6Ol9DQWxsb2MoX19hKS5hbGxvY2F0ZSgxKTsKKwlyZXR1cm4gbmV3KF9fc3BhY2UpIF9Sb3BlQ29uY2F0ZW5hdGlvbihfX2xlZnQsIF9fcmlnaHQsIF9fYSk7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBfUm9wZUZ1bmN0aW9uKgorICAgICAgX1NfbmV3X1JvcGVGdW5jdGlvbihjaGFyX3Byb2R1Y2VyPF9DaGFyVD4qIF9fZiwKKwkJCSAgc2l6ZV90IF9fc2l6ZSwgYm9vbCBfX2QsIGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICB7CisJX1JvcGVGdW5jdGlvbiogX19zcGFjZSA9IHR5cGVuYW1lIF9CYXNlOjpfRkFsbG9jKF9fYSkuYWxsb2NhdGUoMSk7CisJcmV0dXJuIG5ldyhfX3NwYWNlKSBfUm9wZUZ1bmN0aW9uKF9fZiwgX19zaXplLCBfX2QsIF9fYSk7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBfUm9wZVN1YnN0cmluZyoKKyAgICAgIF9TX25ld19Sb3BlU3Vic3RyaW5nKF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4qIF9fYiwgc2l6ZV90IF9fcywKKwkJCSAgIHNpemVfdCBfX2wsIGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgICB7CisJX1JvcGVTdWJzdHJpbmcqIF9fc3BhY2UgPSB0eXBlbmFtZSBfQmFzZTo6X1NBbGxvYyhfX2EpLmFsbG9jYXRlKDEpOworCXJldHVybiBuZXcoX19zcGFjZSkgX1JvcGVTdWJzdHJpbmcoX19iLCBfX3MsIF9fbCwgX19hKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgc3RhdGljIF9Sb3BlTGVhZioKKyAgICAgIF9TX1JvcGVMZWFmX2Zyb21fdW5vd25lZF9jaGFyX3B0cihjb25zdCBfQ2hhclQgKl9fcywKKwkJCQkJc2l6ZV90IF9fc2l6ZSwgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyNkZWZpbmUgX19TVExfUk9QRV9GUk9NX1VOT1dORURfQ0hBUl9QVFIoX19zLCBfX3NpemUsIF9fYSkgXAorICAgICAgICAgICAgICAgIF9TX1JvcGVMZWFmX2Zyb21fdW5vd25lZF9jaGFyX3B0cihfX3MsIF9fc2l6ZSwgX19hKQorICAgICAgeworCWlmICgwID09IF9fc2l6ZSkKKwkgIHJldHVybiAwOworCV9DaGFyVCogX19idWYgPSBfX2EuYWxsb2NhdGUoX1Nfcm91bmRlZF91cF9zaXplKF9fc2l6ZSkpOworCQorCV9fdW5pbml0aWFsaXplZF9jb3B5X25fYShfX3MsIF9fc2l6ZSwgX19idWYsIF9fYSk7CisJX1NfY29uZF9zdG9yZV9lb3MoX19idWZbX19zaXplXSk7CisJX190cnkKKwkgIHsgcmV0dXJuIF9TX25ld19Sb3BlTGVhZihfX2J1ZiwgX19zaXplLCBfX2EpOyB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIF9Sb3BlUmVwOjpfX1NUTF9GUkVFX1NUUklORyhfX2J1ZiwgX19zaXplLCBfX2EpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKyAgICAgIH0KKworICAgICAgLy8gQ29uY2F0ZW5hdGlvbiBvZiBub25lbXB0eSBzdHJpbmdzLgorICAgICAgLy8gQWx3YXlzIGJ1aWxkcyBhIGNvbmNhdGVuYXRpb24gbm9kZS4KKyAgICAgIC8vIFJlYmFsYW5jZXMgaWYgdGhlIHJlc3VsdCBpcyB0b28gZGVlcC4KKyAgICAgIC8vIFJlc3VsdCBoYXMgcmVmY291bnQgMS4KKyAgICAgIC8vIERvZXMgbm90IGluY3JlbWVudCBsZWZ0IGFuZCByaWdodCByZWYgY291bnRzIGV2ZW4gdGhvdWdoCisgICAgICAvLyB0aGV5IGFyZSByZWZlcmVuY2VkLgorICAgICAgc3RhdGljIF9Sb3BlUmVwKgorICAgICAgX1NfdHJlZV9jb25jYXQoX1JvcGVSZXAqIF9fbGVmdCwgX1JvcGVSZXAqIF9fcmlnaHQpOworCisgICAgICAvLyBDb25jYXRlbmF0aW9uIGhlbHBlciBmdW5jdGlvbnMKKyAgICAgIHN0YXRpYyBfUm9wZUxlYWYqCisgICAgICBfU19sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoX1JvcGVMZWFmKiBfX3IsCisJCQkgICAgICAgY29uc3QgX0NoYXJUKiBfX2l0ZXIsIHNpemVfdCBfX3NsZW4pOworICAgICAgLy8gQ29uY2F0ZW5hdGUgYnkgY29weWluZyBsZWFmLgorICAgICAgLy8gc2hvdWxkIHRha2UgYW4gYXJiaXRyYXJ5IGl0ZXJhdG9yCisgICAgICAvLyByZXN1bHQgaGFzIHJlZmNvdW50IDEuCisjaWZuZGVmIF9fR0MKKyAgICAgIHN0YXRpYyBfUm9wZUxlYWYqCisgICAgICBfU19kZXN0cl9sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoX1JvcGVMZWFmKiBfX3IsCisJCQkJICAgICBjb25zdCBfQ2hhclQqIF9faXRlciwgc2l6ZV90IF9fc2xlbik7CisgICAgICAvLyBBIHZlcnNpb24gdGhhdCBwb3RlbnRpYWxseSBjbG9iYmVycyBfX3IgaWYgX19yLT5fTV9yZWZfY291bnQgPT0gMS4KKyNlbmRpZgorCisgICAgcHJpdmF0ZToKKyAgICAgIAorICAgICAgc3RhdGljIHNpemVfdCBfU19jaGFyX3B0cl9sZW4oY29uc3QgX0NoYXJUKiBfX3MpOworICAgICAgLy8gc2xpZ2h0bHkgZ2VuZXJhbGl6ZWQgc3RybGVuCisKKyAgICAgIHJvcGUoX1JvcGVSZXAqIF9fdCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fdCwgX19hKSB7IH0KKworCisgICAgICAvLyBDb3B5IF9fciB0byB0aGUgX0NoYXJUIGJ1ZmZlci4KKyAgICAgIC8vIFJldHVybnMgX19idWZmZXIgKyBfX3ItPl9NX3NpemUuCisgICAgICAvLyBBc3N1bWVzIHRoYXQgYnVmZmVyIGlzIHVuaW5pdGlhbGl6ZWQuCisgICAgICBzdGF0aWMgX0NoYXJUKiBfU19mbGF0dGVuKF9Sb3BlUmVwKiBfX3IsIF9DaGFyVCogX19idWZmZXIpOworCisgICAgICAvLyBBZ2Fpbiwgd2l0aCBleHBsaWNpdCBzdGFydGluZyBwb3NpdGlvbiBhbmQgbGVuZ3RoLgorICAgICAgLy8gQXNzdW1lcyB0aGF0IGJ1ZmZlciBpcyB1bmluaXRpYWxpemVkLgorICAgICAgc3RhdGljIF9DaGFyVCogX1NfZmxhdHRlbihfUm9wZVJlcCogX19yLAorCQkJCXNpemVfdCBfX3N0YXJ0LCBzaXplX3QgX19sZW4sCisJCQkJX0NoYXJUKiBfX2J1ZmZlcik7CisKKyAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nCisgICAgICBfU19taW5fbGVuW19fZGV0YWlsOjpfU19tYXhfcm9wZV9kZXB0aCArIDFdOworICAgICAgCisgICAgICBzdGF0aWMgYm9vbAorICAgICAgX1NfaXNfYmFsYW5jZWQoX1JvcGVSZXAqIF9fcikKKyAgICAgIHsgcmV0dXJuIChfX3ItPl9NX3NpemUgPj0gX1NfbWluX2xlbltfX3ItPl9NX2RlcHRoXSk7IH0KKworICAgICAgc3RhdGljIGJvb2wKKyAgICAgIF9TX2lzX2FsbW9zdF9iYWxhbmNlZChfUm9wZVJlcCogX19yKQorICAgICAgeyByZXR1cm4gKF9fci0+X01fZGVwdGggPT0gMAorCQl8fCBfX3ItPl9NX3NpemUgPj0gX1NfbWluX2xlbltfX3ItPl9NX2RlcHRoIC0gMV0pOyB9CisKKyAgICAgIHN0YXRpYyBib29sCisgICAgICBfU19pc19yb3VnaGx5X2JhbGFuY2VkKF9Sb3BlUmVwKiBfX3IpCisgICAgICB7IHJldHVybiAoX19yLT5fTV9kZXB0aCA8PSAxCisJCXx8IF9fci0+X01fc2l6ZSA+PSBfU19taW5fbGVuW19fci0+X01fZGVwdGggLSAyXSk7IH0KKworICAgICAgLy8gQXNzdW1lcyB0aGUgcmVzdWx0IGlzIG5vdCBlbXB0eS4KKyAgICAgIHN0YXRpYyBfUm9wZVJlcCoKKyAgICAgIF9TX2NvbmNhdF9hbmRfc2V0X2JhbGFuY2VkKF9Sb3BlUmVwKiBfX2xlZnQsIF9Sb3BlUmVwKiBfX3JpZ2h0KQorICAgICAgeworCV9Sb3BlUmVwKiBfX3Jlc3VsdCA9IF9TX2NvbmNhdChfX2xlZnQsIF9fcmlnaHQpOworCWlmIChfU19pc19iYWxhbmNlZChfX3Jlc3VsdCkpCisJICBfX3Jlc3VsdC0+X01faXNfYmFsYW5jZWQgPSB0cnVlOworCXJldHVybiBfX3Jlc3VsdDsKKyAgICAgIH0KKworICAgICAgLy8gVGhlIGJhc2ljIHJlYmFsYW5jaW5nIG9wZXJhdGlvbi4gIExvZ2ljYWxseSBjb3BpZXMgdGhlCisgICAgICAvLyByb3BlLiAgVGhlIHJlc3VsdCBoYXMgcmVmY291bnQgb2YgMS4gIFRoZSBjbGllbnQgd2lsbAorICAgICAgLy8gdXN1YWxseSBkZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBfX3IuCisgICAgICAvLyBUaGUgcmVzdWx0IGlzIHdpdGhpbiBoZWlnaHQgMiBvZiBiYWxhbmNlZCBieSB0aGUgYWJvdmUKKyAgICAgIC8vIGRlZmluaXRpb24uCisgICAgICBzdGF0aWMgX1JvcGVSZXAqIF9TX2JhbGFuY2UoX1JvcGVSZXAqIF9fcik7CisKKyAgICAgIC8vIEFkZCBhbGwgdW5iYWxhbmNlZCBzdWJ0cmVlcyB0byB0aGUgZm9yZXN0IG9mIGJhbGFuY2VkIHRyZWVzLgorICAgICAgLy8gVXNlZCBvbmx5IGJ5IGJhbGFuY2UuCisgICAgICBzdGF0aWMgdm9pZCBfU19hZGRfdG9fZm9yZXN0KF9Sb3BlUmVwKl9fciwgX1JvcGVSZXAqKiBfX2ZvcmVzdCk7CisKKyAgICAgIC8vIEFkZCBfX3IgdG8gZm9yZXN0LCBhc3N1bWluZyBfX3IgaXMgYWxyZWFkeSBiYWxhbmNlZC4KKyAgICAgIHN0YXRpYyB2b2lkIF9TX2FkZF9sZWFmX3RvX2ZvcmVzdChfUm9wZVJlcCogX19yLCBfUm9wZVJlcCoqIF9fZm9yZXN0KTsKKyAgICAgIAorICAgICAgLy8gUHJpbnQgdG8gc3Rkb3V0LCBleHBvc2luZyBzdHJ1Y3R1cmUKKyAgICAgIHN0YXRpYyB2b2lkIF9TX2R1bXAoX1JvcGVSZXAqIF9fciwgaW50IF9faW5kZW50ID0gMCk7CisgICAgICAKKyAgICAgIC8vIFJldHVybiAtMSwgMCwgb3IgMSBpZiBfX3ggPCBfX3ksIF9feCA9PSBfX3ksIG9yIF9feCA+IF9feSByZXNwLgorICAgICAgc3RhdGljIGludCBfU19jb21wYXJlKGNvbnN0IF9Sb3BlUmVwKiBfX3gsIGNvbnN0IF9Sb3BlUmVwKiBfX3kpOworICAgICAgCisgICAgcHVibGljOgorICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gMCA9PSB0aGlzLT5fTV90cmVlX3B0cjsgfQorICAgICAgCisgICAgICAvLyBDb21wYXJpc29uIG1lbWJlciBmdW5jdGlvbi4gIFRoaXMgaXMgcHVibGljIG9ubHkgZm9yIHRob3NlCisgICAgICAvLyBjbGllbnRzIHRoYXQgbmVlZCBhIHRlcm5hcnkgY29tcGFyaXNvbi4gIE90aGVycworICAgICAgLy8gc2hvdWxkIHVzZSB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgYmVsb3cuCisgICAgICBpbnQKKyAgICAgIGNvbXBhcmUoY29uc3Qgcm9wZSYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX1NfY29tcGFyZSh0aGlzLT5fTV90cmVlX3B0ciwgX195Ll9NX3RyZWVfcHRyKTsgfQorCisgICAgICByb3BlKGNvbnN0IF9DaGFyVCogX19zLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hKQorICAgICAgeworCXRoaXMtPl9NX3RyZWVfcHRyID0KKwkgIF9fU1RMX1JPUEVfRlJPTV9VTk9XTkVEX0NIQVJfUFRSKF9fcywgX1NfY2hhcl9wdHJfbGVuKF9fcyksCisJCQkJCSAgIF9NX2dldF9hbGxvY2F0b3IoKSk7CisgICAgICB9CisKKyAgICAgIHJvcGUoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdCBfX2xlbiwKKwkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hKQorICAgICAgeworCXRoaXMtPl9NX3RyZWVfcHRyID0KKwkgIF9fU1RMX1JPUEVfRlJPTV9VTk9XTkVEX0NIQVJfUFRSKF9fcywgX19sZW4sIF9NX2dldF9hbGxvY2F0b3IoKSk7CisgICAgICB9CisKKyAgICAgIC8vIFNob3VsZCBwZXJoYXBzIGJlIHRlbXBsYXRpemVkIHdpdGggcmVzcGVjdCB0byB0aGUgaXRlcmF0b3IgdHlwZQorICAgICAgLy8gYW5kIHVzZSBTZXF1ZW5jZV9idWZmZXIuICAoSXQgc2hvdWxkIHBlcmhhcHMgdXNlIHNlcXVlbmNlX2J1ZmZlcgorICAgICAgLy8gZXZlbiBub3cuKQorICAgICAgcm9wZShjb25zdCBfQ2hhclQqIF9fcywgY29uc3QgX0NoYXJUKiBfX2UsCisJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fYSkKKyAgICAgIHsKKwl0aGlzLT5fTV90cmVlX3B0ciA9CisJICBfX1NUTF9ST1BFX0ZST01fVU5PV05FRF9DSEFSX1BUUihfX3MsIF9fZSAtIF9fcywgX01fZ2V0X2FsbG9jYXRvcigpKTsKKyAgICAgIH0KKworICAgICAgcm9wZShjb25zdCBjb25zdF9pdGVyYXRvciYgX19zLCBjb25zdCBjb25zdF9pdGVyYXRvciYgX19lLAorCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfU19zdWJzdHJpbmcoX19zLl9NX3Jvb3QsIF9fcy5fTV9jdXJyZW50X3BvcywKKwkJCSAgIF9fZS5fTV9jdXJyZW50X3BvcyksIF9fYSkKKyAgICAgIHsgfQorCisgICAgICByb3BlKGNvbnN0IGl0ZXJhdG9yJiBfX3MsIGNvbnN0IGl0ZXJhdG9yJiBfX2UsCisJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9TX3N1YnN0cmluZyhfX3MuX01fcm9vdCwgX19zLl9NX2N1cnJlbnRfcG9zLAorCQkJICAgX19lLl9NX2N1cnJlbnRfcG9zKSwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHJvcGUoX0NoYXJUIF9fYywgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fYSkKKyAgICAgIHsKKwlfQ2hhclQqIF9fYnVmID0gdGhpcy0+X0RhdGFfYWxsb2NhdGUoX1Nfcm91bmRlZF91cF9zaXplKDEpKTsKKwkKKwlfTV9nZXRfYWxsb2NhdG9yKCkuY29uc3RydWN0KF9fYnVmLCBfX2MpOworCV9fdHJ5CisJICB7CisJICAgIHRoaXMtPl9NX3RyZWVfcHRyID0gX1NfbmV3X1JvcGVMZWFmKF9fYnVmLCAxLAorCQkJCQkJX01fZ2V0X2FsbG9jYXRvcigpKTsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX1JvcGVSZXA6Ol9fU1RMX0ZSRUVfU1RSSU5HKF9fYnVmLCAxLCBfTV9nZXRfYWxsb2NhdG9yKCkpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKyAgICAgIH0KKworICAgICAgcm9wZShzaXplX3QgX19uLCBfQ2hhclQgX19jLAorCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKTsKKworICAgICAgcm9wZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoMCwgX19hKSB7IH0KKworICAgICAgLy8gQ29uc3RydWN0IGEgcm9wZSBmcm9tIGEgZnVuY3Rpb24gdGhhdCBjYW4gY29tcHV0ZSBpdHMgbWVtYmVycworICAgICAgcm9wZShjaGFyX3Byb2R1Y2VyPF9DaGFyVD4gKl9fZm4sIHNpemVfdCBfX2xlbiwgYm9vbCBfX2RlbGV0ZV9mbiwKKwkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hKQorICAgICAgeworCXRoaXMtPl9NX3RyZWVfcHRyID0gKDAgPT0gX19sZW4pID8KKwkgIDAgOiBfU19uZXdfUm9wZUZ1bmN0aW9uKF9fZm4sIF9fbGVuLCBfX2RlbGV0ZV9mbiwgX19hKTsKKyAgICAgIH0KKworICAgICAgcm9wZShjb25zdCByb3BlJiBfX3gsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX3guX01fdHJlZV9wdHIsIF9fYSkKKyAgICAgIHsgX1NfcmVmKHRoaXMtPl9NX3RyZWVfcHRyKTsgfQorCisgICAgICB+cm9wZSgpIHRocm93KCkKKyAgICAgIHsgX1NfdW5yZWYodGhpcy0+X01fdHJlZV9wdHIpOyB9CisKKyAgICAgIHJvcGUmCisgICAgICBvcGVyYXRvcj0oY29uc3Qgcm9wZSYgX194KQorICAgICAgeworCV9Sb3BlUmVwKiBfX29sZCA9IHRoaXMtPl9NX3RyZWVfcHRyOworCXRoaXMtPl9NX3RyZWVfcHRyID0gX194Ll9NX3RyZWVfcHRyOworCV9TX3JlZih0aGlzLT5fTV90cmVlX3B0cik7CisJX1NfdW5yZWYoX19vbGQpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKQorICAgICAgeworCV9TX3VucmVmKHRoaXMtPl9NX3RyZWVfcHRyKTsKKwl0aGlzLT5fTV90cmVlX3B0ciA9IDA7CisgICAgICB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfYmFjayhfQ2hhclQgX194KQorICAgICAgeworCV9Sb3BlUmVwKiBfX29sZCA9IHRoaXMtPl9NX3RyZWVfcHRyOworCXRoaXMtPl9NX3RyZWVfcHRyCisJICA9IF9TX2Rlc3RyX2NvbmNhdF9jaGFyX2l0ZXIodGhpcy0+X01fdHJlZV9wdHIsICZfX3gsIDEpOworCV9TX3VucmVmKF9fb2xkKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcG9wX2JhY2soKQorICAgICAgeworCV9Sb3BlUmVwKiBfX29sZCA9IHRoaXMtPl9NX3RyZWVfcHRyOworCXRoaXMtPl9NX3RyZWVfcHRyID0gX1Nfc3Vic3RyaW5nKHRoaXMtPl9NX3RyZWVfcHRyLAorCQkJCQkgMCwgdGhpcy0+X01fdHJlZV9wdHItPl9NX3NpemUgLSAxKTsKKwlfU191bnJlZihfX29sZCk7CisgICAgICB9CisKKyAgICAgIF9DaGFyVAorICAgICAgYmFjaygpIGNvbnN0CisgICAgICB7IHJldHVybiBfU19mZXRjaCh0aGlzLT5fTV90cmVlX3B0ciwgdGhpcy0+X01fdHJlZV9wdHItPl9NX3NpemUgLSAxKTsgfQorCisgICAgICB2b2lkCisgICAgICBwdXNoX2Zyb250KF9DaGFyVCBfX3gpCisgICAgICB7CisJX1JvcGVSZXAqIF9fb2xkID0gdGhpcy0+X01fdHJlZV9wdHI7CisJX1JvcGVSZXAqIF9fbGVmdCA9CisJICBfX1NUTF9ST1BFX0ZST01fVU5PV05FRF9DSEFSX1BUUigmX194LCAxLCBfTV9nZXRfYWxsb2NhdG9yKCkpOworCV9fdHJ5CisJICB7CisJICAgIHRoaXMtPl9NX3RyZWVfcHRyID0gX1NfY29uY2F0KF9fbGVmdCwgdGhpcy0+X01fdHJlZV9wdHIpOworCSAgICBfU191bnJlZihfX29sZCk7CisJICAgIF9TX3VucmVmKF9fbGVmdCk7CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIF9TX3VucmVmKF9fbGVmdCk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBwb3BfZnJvbnQoKQorICAgICAgeworCV9Sb3BlUmVwKiBfX29sZCA9IHRoaXMtPl9NX3RyZWVfcHRyOworCXRoaXMtPl9NX3RyZWVfcHRyCisJICA9IF9TX3N1YnN0cmluZyh0aGlzLT5fTV90cmVlX3B0ciwgMSwgdGhpcy0+X01fdHJlZV9wdHItPl9NX3NpemUpOworCV9TX3VucmVmKF9fb2xkKTsKKyAgICAgIH0KKworICAgICAgX0NoYXJUCisgICAgICBmcm9udCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfU19mZXRjaCh0aGlzLT5fTV90cmVlX3B0ciwgMCk7IH0KKworICAgICAgdm9pZAorICAgICAgYmFsYW5jZSgpCisgICAgICB7CisJX1JvcGVSZXAqIF9fb2xkID0gdGhpcy0+X01fdHJlZV9wdHI7CisJdGhpcy0+X01fdHJlZV9wdHIgPSBfU19iYWxhbmNlKHRoaXMtPl9NX3RyZWVfcHRyKTsKKwlfU191bnJlZihfX29sZCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNvcHkoX0NoYXJUKiBfX2J1ZmZlcikgY29uc3QKKyAgICAgIHsKKwlfRGVzdHJveV9jb25zdChfX2J1ZmZlciwgX19idWZmZXIgKyBzaXplKCksIF9NX2dldF9hbGxvY2F0b3IoKSk7CisJX1NfZmxhdHRlbih0aGlzLT5fTV90cmVlX3B0ciwgX19idWZmZXIpOworICAgICAgfQorCisgICAgICAvLyBUaGlzIGlzIHRoZSBjb3B5IGZ1bmN0aW9uIGZyb20gdGhlIHN0YW5kYXJkLCBidXQKKyAgICAgIC8vIHdpdGggdGhlIGFyZ3VtZW50cyByZW9yZGVyZWQgdG8gbWFrZSBpdCBjb25zaXN0ZW50IHdpdGggdGhlCisgICAgICAvLyByZXN0IG9mIHRoZSBpbnRlcmZhY2UuCisgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBndWFyYW50ZWVkIG5vdCB0byBjb21waWxlIGlmIHRoZSBkcmFmdCBzdGFuZGFyZAorICAgICAgLy8gb3JkZXIgaXMgYXNzdW1lZC4KKyAgICAgIHNpemVfdHlwZQorICAgICAgY29weShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sIF9DaGFyVCogX19idWZmZXIpIGNvbnN0CisgICAgICB7CisJc2l6ZV90IF9fc2l6ZSA9IHNpemUoKTsKKwlzaXplX3QgX19sZW4gPSAoX19wb3MgKyBfX24gPiBfX3NpemU/IF9fc2l6ZSAtIF9fcG9zIDogX19uKTsKKworCV9EZXN0cm95X2NvbnN0KF9fYnVmZmVyLCBfX2J1ZmZlciArIF9fbGVuLCBfTV9nZXRfYWxsb2NhdG9yKCkpOworCV9TX2ZsYXR0ZW4odGhpcy0+X01fdHJlZV9wdHIsIF9fcG9zLCBfX2xlbiwgX19idWZmZXIpOworCXJldHVybiBfX2xlbjsKKyAgICAgIH0KKworICAgICAgLy8gUHJpbnQgdG8gc3Rkb3V0LCBleHBvc2luZyBzdHJ1Y3R1cmUuICBNYXkgYmUgdXNlZnVsIGZvcgorICAgICAgLy8gcGVyZm9ybWFuY2UgZGVidWdnaW5nLgorICAgICAgdm9pZAorICAgICAgZHVtcCgpCisgICAgICB7IF9TX2R1bXAodGhpcy0+X01fdHJlZV9wdHIpOyB9CisgICAgICAKKyAgICAgIC8vIENvbnZlcnQgdG8gMCB0ZXJtaW5hdGVkIHN0cmluZyBpbiBuZXcgYWxsb2NhdGVkIG1lbW9yeS4KKyAgICAgIC8vIEVtYmVkZGVkIDBzIGluIHRoZSBpbnB1dCBkbyBub3QgdGVybWluYXRlIHRoZSBjb3B5LgorICAgICAgY29uc3QgX0NoYXJUKiBjX3N0cigpIGNvbnN0OworCisgICAgICAvLyBBcyBhYm92ZSwgYnV0IGFsc28gdXNlIHRoZSBmbGF0dGVuZWQgcmVwcmVzZW50YXRpb24gYXMKKyAgICAgIC8vIHRoZSBuZXcgcm9wZSByZXByZXNlbnRhdGlvbi4KKyAgICAgIGNvbnN0IF9DaGFyVCogcmVwbGFjZV93aXRoX2Nfc3RyKCk7CisgICAgICAKKyAgICAgIC8vIFJlY2xhaW0gbWVtb3J5IGZvciB0aGUgY19zdHIgZ2VuZXJhdGVkIGZsYXR0ZW5lZCBzdHJpbmcuCisgICAgICAvLyBJbnRlbnRpb25hbGx5IHVuZG9jdW1lbnRlZCwgc2luY2UgaXQncyBoYXJkIHRvIHNheSB3aGVuIHRoaXMKKyAgICAgIC8vIGlzIHNhZmUgZm9yIG11bHRpcGxlIHRocmVhZHMuCisgICAgICB2b2lkCisgICAgICBkZWxldGVfY19zdHIgKCkKKyAgICAgIHsKKwlpZiAoMCA9PSB0aGlzLT5fTV90cmVlX3B0cikKKwkgIHJldHVybjsKKwlpZiAoX19kZXRhaWw6Ol9TX2xlYWYgPT0gdGhpcy0+X01fdHJlZV9wdHItPl9NX3RhZyAmJgorCSAgICAoKF9Sb3BlTGVhZiopdGhpcy0+X01fdHJlZV9wdHIpLT5fTV9kYXRhID09CisJICAgIHRoaXMtPl9NX3RyZWVfcHRyLT5fTV9jX3N0cmluZykKKwkgIHsKKwkgICAgLy8gUmVwcmVzZW50YXRpb24gc2hhcmVkCisJICAgIHJldHVybjsKKwkgIH0KKyNpZm5kZWYgX19HQworCXRoaXMtPl9NX3RyZWVfcHRyLT5fTV9mcmVlX2Nfc3RyaW5nKCk7CisjZW5kaWYKKwl0aGlzLT5fTV90cmVlX3B0ci0+X01fY19zdHJpbmcgPSAwOworICAgICAgfQorCisgICAgICBfQ2hhclQKKyAgICAgIG9wZXJhdG9yW10gKHNpemVfdHlwZSBfX3BvcykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9TX2ZldGNoKHRoaXMtPl9NX3RyZWVfcHRyLCBfX3Bvcyk7IH0KKworICAgICAgX0NoYXJUCisgICAgICBhdChzaXplX3R5cGUgX19wb3MpIGNvbnN0CisgICAgICB7CisJLy8gaWYgKF9fcG9zID49IHNpemUoKSkgdGhyb3cgb3V0X29mX3JhbmdlOyAgLy8gWFhYCisJcmV0dXJuICgqdGhpcylbX19wb3NdOworICAgICAgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4oY29uc3RfaXRlcmF0b3IodGhpcy0+X01fdHJlZV9wdHIsIDApKTsgfQorCisgICAgICAvLyBBbiBlYXN5IHdheSB0byBnZXQgYSBjb25zdCBpdGVyYXRvciBmcm9tIGEgbm9uLWNvbnN0IGNvbnRhaW5lci4KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjb25zdF9iZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybihjb25zdF9pdGVyYXRvcih0aGlzLT5fTV90cmVlX3B0ciwgMCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4oY29uc3RfaXRlcmF0b3IodGhpcy0+X01fdHJlZV9wdHIsIHNpemUoKSkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjb25zdF9lbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4oY29uc3RfaXRlcmF0b3IodGhpcy0+X01fdHJlZV9wdHIsIHNpemUoKSkpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7CXJldHVybigwID09IHRoaXMtPl9NX3RyZWVfcHRyPyAwIDogdGhpcy0+X01fdHJlZV9wdHItPl9NX3NpemUpOyB9CisgICAgICAKKyAgICAgIHNpemVfdHlwZQorICAgICAgbGVuZ3RoKCkgY29uc3QKKyAgICAgIHsJcmV0dXJuIHNpemUoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX1NfbWluX2xlbltpbnQoX19kZXRhaWw6Ol9TX21heF9yb3BlX2RlcHRoKSAtIDFdIC0gMTsKKwkvLyAgR3VhcmFudGVlcyB0aGF0IHRoZSByZXN1bHQgY2FuIGJlIHN1ZmZpY2llbnRseQorCS8vICBiYWxhbmNlZC4gIExvbmdlciByb3BlcyB3aWxsIHByb2JhYmx5IHN0aWxsIHdvcmssCisJLy8gIGJ1dCBpdCdzIGhhcmRlciB0byBtYWtlIGd1YXJhbnRlZXMuCisgICAgICB9CisKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY29uc3RfcmJlZ2luKCkgY29uc3QKKyAgICAgIHsJcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorICAgICAgCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjb25zdF9yZW5kKCkgY29uc3QKKyAgICAgIHsJcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUMiwgY2xhc3MgX0FsbG9jMj4KKyAgICAgICAgZnJpZW5kIHJvcGU8X0NoYXJUMiwgX0FsbG9jMj4KKyAgICAgICAgb3BlcmF0b3IrKGNvbnN0IHJvcGU8X0NoYXJUMiwgX0FsbG9jMj4mIF9fbGVmdCwKKwkJICBjb25zdCByb3BlPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3JpZ2h0KTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUMiwgY2xhc3MgX0FsbG9jMj4KKyAgICAgICAgZnJpZW5kIHJvcGU8X0NoYXJUMiwgX0FsbG9jMj4KKyAgICAgICAgb3BlcmF0b3IrKGNvbnN0IHJvcGU8X0NoYXJUMiwgX0FsbG9jMj4mIF9fbGVmdCwgY29uc3QgX0NoYXJUMiogX19yaWdodCk7CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVDIsIGNsYXNzIF9BbGxvYzI+CisgICAgICAgIGZyaWVuZCByb3BlPF9DaGFyVDIsIF9BbGxvYzI+CisgICAgICAgIG9wZXJhdG9yKyhjb25zdCByb3BlPF9DaGFyVDIsIF9BbGxvYzI+JiBfX2xlZnQsIF9DaGFyVDIgX19yaWdodCk7CisKKyAgICAgIC8vIFRoZSBzeW1tZXRyaWMgY2FzZXMgYXJlIGludGVudGlvbmFsbHkgb21pdHRlZCwgc2luY2UgdGhleSdyZQorICAgICAgLy8gcHJlc3VtZWQgdG8gYmUgbGVzcyBjb21tb24sIGFuZCB3ZSBkb24ndCBoYW5kbGUgdGhlbSBhcyB3ZWxsLgorCisgICAgICAvLyBUaGUgZm9sbG93aW5nIHNob3VsZCByZWFsbHkgYmUgdGVtcGxhdGl6ZWQuICBUaGUgZmlyc3QKKyAgICAgIC8vIGFyZ3VtZW50IHNob3VsZCBiZSBhbiBpbnB1dCBpdGVyYXRvciBvciBmb3J3YXJkIGl0ZXJhdG9yIHdpdGgKKyAgICAgIC8vIHZhbHVlX3R5cGUgX0NoYXJULgorICAgICAgcm9wZSYKKyAgICAgIGFwcGVuZChjb25zdCBfQ2hhclQqIF9faXRlciwgc2l6ZV90IF9fbikKKyAgICAgIHsKKwlfUm9wZVJlcCogX19yZXN1bHQgPQorCSAgX1NfZGVzdHJfY29uY2F0X2NoYXJfaXRlcih0aGlzLT5fTV90cmVlX3B0ciwgX19pdGVyLCBfX24pOworCV9TX3VucmVmKHRoaXMtPl9NX3RyZWVfcHRyKTsKKwl0aGlzLT5fTV90cmVlX3B0ciA9IF9fcmVzdWx0OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgcm9wZSYKKyAgICAgIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fY19zdHJpbmcpCisgICAgICB7CisJc2l6ZV90IF9fbGVuID0gX1NfY2hhcl9wdHJfbGVuKF9fY19zdHJpbmcpOworCWFwcGVuZChfX2Nfc3RyaW5nLCBfX2xlbik7CisJcmV0dXJuKCp0aGlzKTsKKyAgICAgIH0KKworICAgICAgcm9wZSYKKyAgICAgIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fcywgY29uc3QgX0NoYXJUKiBfX2UpCisgICAgICB7CisJX1JvcGVSZXAqIF9fcmVzdWx0ID0KKwkgIF9TX2Rlc3RyX2NvbmNhdF9jaGFyX2l0ZXIodGhpcy0+X01fdHJlZV9wdHIsIF9fcywgX19lIC0gX19zKTsKKwlfU191bnJlZih0aGlzLT5fTV90cmVlX3B0cik7CisJdGhpcy0+X01fdHJlZV9wdHIgPSBfX3Jlc3VsdDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHJvcGUmCisgICAgICBhcHBlbmQoY29uc3RfaXRlcmF0b3IgX19zLCBjb25zdF9pdGVyYXRvciBfX2UpCisgICAgICB7CisJX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fYXBwZW5kZWUoX1Nfc3Vic3RyaW5nKF9fcy5fTV9yb290LAorCQkJCQkJICAgX19zLl9NX2N1cnJlbnRfcG9zLAorCQkJCQkJICAgX19lLl9NX2N1cnJlbnRfcG9zKSk7CisJX1JvcGVSZXAqIF9fcmVzdWx0ID0gX1NfY29uY2F0KHRoaXMtPl9NX3RyZWVfcHRyLCAKKwkJCQkgICAgICAgKF9Sb3BlUmVwKilfX2FwcGVuZGVlKTsKKwlfU191bnJlZih0aGlzLT5fTV90cmVlX3B0cik7CisJdGhpcy0+X01fdHJlZV9wdHIgPSBfX3Jlc3VsdDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHJvcGUmCisgICAgICBhcHBlbmQoX0NoYXJUIF9fYykKKyAgICAgIHsKKwlfUm9wZVJlcCogX19yZXN1bHQgPQorCSAgX1NfZGVzdHJfY29uY2F0X2NoYXJfaXRlcih0aGlzLT5fTV90cmVlX3B0ciwgJl9fYywgMSk7CisJX1NfdW5yZWYodGhpcy0+X01fdHJlZV9wdHIpOworCXRoaXMtPl9NX3RyZWVfcHRyID0gX19yZXN1bHQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICByb3BlJgorICAgICAgYXBwZW5kKCkKKyAgICAgIHsgcmV0dXJuIGFwcGVuZChfQ2hhclQoKSk7IH0gIC8vIFhYWCB3aHk/CisKKyAgICAgIHJvcGUmCisgICAgICBhcHBlbmQoY29uc3Qgcm9wZSYgX195KQorICAgICAgeworCV9Sb3BlUmVwKiBfX3Jlc3VsdCA9IF9TX2NvbmNhdCh0aGlzLT5fTV90cmVlX3B0ciwgX195Ll9NX3RyZWVfcHRyKTsKKwlfU191bnJlZih0aGlzLT5fTV90cmVlX3B0cik7CisJdGhpcy0+X01fdHJlZV9wdHIgPSBfX3Jlc3VsdDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHJvcGUmCisgICAgICBhcHBlbmQoc2l6ZV90IF9fbiwgX0NoYXJUIF9fYykKKyAgICAgIHsKKwlyb3BlPF9DaGFyVCxfQWxsb2M+IF9fbGFzdChfX24sIF9fYyk7CisJcmV0dXJuIGFwcGVuZChfX2xhc3QpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHJvcGUmIF9fYikKKyAgICAgIHsKKwlfUm9wZVJlcCogX190bXAgPSB0aGlzLT5fTV90cmVlX3B0cjsKKwl0aGlzLT5fTV90cmVlX3B0ciA9IF9fYi5fTV90cmVlX3B0cjsKKwlfX2IuX01fdHJlZV9wdHIgPSBfX3RtcDsKKyAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIFJlc3VsdCBpcyBpbmNsdWRlZCBpbiByZWZjb3VudC4KKyAgICAgIHN0YXRpYyBfUm9wZVJlcCoKKyAgICAgIHJlcGxhY2UoX1JvcGVSZXAqIF9fb2xkLCBzaXplX3QgX19wb3MxLAorCSAgICAgIHNpemVfdCBfX3BvczIsIF9Sb3BlUmVwKiBfX3IpCisgICAgICB7CisJaWYgKDAgPT0gX19vbGQpCisJICB7CisJICAgIF9TX3JlZihfX3IpOworCSAgICByZXR1cm4gX19yOworCSAgfQorCV9TZWxmX2Rlc3RydWN0X3B0ciBfX2xlZnQoX1Nfc3Vic3RyaW5nKF9fb2xkLCAwLCBfX3BvczEpKTsKKwlfU2VsZl9kZXN0cnVjdF9wdHIgX19yaWdodChfU19zdWJzdHJpbmcoX19vbGQsIF9fcG9zMiwgX19vbGQtPl9NX3NpemUpKTsKKwlfUm9wZVJlcCogX19yZXN1bHQ7CisKKwlpZiAoMCA9PSBfX3IpCisJICBfX3Jlc3VsdCA9IF9TX2NvbmNhdChfX2xlZnQsIF9fcmlnaHQpOworCWVsc2UKKwkgIHsKKwkgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fbGVmdF9yZXN1bHQoX1NfY29uY2F0KF9fbGVmdCwgX19yKSk7CisJICAgIF9fcmVzdWx0ID0gX1NfY29uY2F0KF9fbGVmdF9yZXN1bHQsIF9fcmlnaHQpOworCSAgfQorCXJldHVybiBfX3Jlc3VsdDsKKyAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzaXplX3QgX19wLCBjb25zdCByb3BlJiBfX3IpCisgICAgICB7CisJX1JvcGVSZXAqIF9fcmVzdWx0ID0KKwkgIHJlcGxhY2UodGhpcy0+X01fdHJlZV9wdHIsIF9fcCwgX19wLCBfX3IuX01fdHJlZV9wdHIpOworCV9TX3VucmVmKHRoaXMtPl9NX3RyZWVfcHRyKTsKKwl0aGlzLT5fTV90cmVlX3B0ciA9IF9fcmVzdWx0OworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbiwgX0NoYXJUIF9fYykKKyAgICAgIHsKKwlyb3BlPF9DaGFyVCxfQWxsb2M+IF9fcihfX24sX19jKTsKKwlpbnNlcnQoX19wLCBfX3IpOworICAgICAgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc2l6ZV90IF9fcCwgY29uc3QgX0NoYXJUKiBfX2ksIHNpemVfdCBfX24pCisgICAgICB7CisJX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fbGVmdChfU19zdWJzdHJpbmcodGhpcy0+X01fdHJlZV9wdHIsIDAsIF9fcCkpOworCV9TZWxmX2Rlc3RydWN0X3B0ciBfX3JpZ2h0KF9TX3N1YnN0cmluZyh0aGlzLT5fTV90cmVlX3B0ciwKKwkJCQkJCV9fcCwgc2l6ZSgpKSk7CisJX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fbGVmdF9yZXN1bHQoX1NfY29uY2F0X2NoYXJfaXRlcihfX2xlZnQsIF9faSwgX19uKSk7CisJLy8gX1NfIGRlc3RyX2NvbmNhdF9jaGFyX2l0ZXIgc2hvdWxkIGJlIHNhZmUgaGVyZS4KKwkvLyBCdXQgYXMgaXQgc3RhbmRzIGl0J3MgcHJvYmFibHkgbm90IGEgd2luLCBzaW5jZSBfX2xlZnQKKwkvLyBpcyBsaWtlbHkgdG8gaGF2ZSBhZGRpdGlvbmFsIHJlZmVyZW5jZXMuCisJX1JvcGVSZXAqIF9fcmVzdWx0ID0gX1NfY29uY2F0KF9fbGVmdF9yZXN1bHQsIF9fcmlnaHQpOworCV9TX3VucmVmKHRoaXMtPl9NX3RyZWVfcHRyKTsKKwl0aGlzLT5fTV90cmVlX3B0ciA9IF9fcmVzdWx0OworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc2l6ZV90IF9fcCwgY29uc3QgX0NoYXJUKiBfX2Nfc3RyaW5nKQorICAgICAgewlpbnNlcnQoX19wLCBfX2Nfc3RyaW5nLCBfU19jaGFyX3B0cl9sZW4oX19jX3N0cmluZykpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzaXplX3QgX19wLCBfQ2hhclQgX19jKQorICAgICAgeyBpbnNlcnQoX19wLCAmX19jLCAxKTsgfQorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc2l6ZV90IF9fcCkKKyAgICAgIHsKKwlfQ2hhclQgX19jID0gX0NoYXJUKCk7CisJaW5zZXJ0KF9fcCwgJl9fYywgMSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzaXplX3QgX19wLCBjb25zdCBfQ2hhclQqIF9faSwgY29uc3QgX0NoYXJUKiBfX2opCisgICAgICB7CisJcm9wZSBfX3IoX19pLCBfX2opOworCWluc2VydChfX3AsIF9fcik7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzaXplX3QgX19wLCBjb25zdCBjb25zdF9pdGVyYXRvciYgX19pLAorCSAgICAgY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faikKKyAgICAgIHsKKwlyb3BlIF9fcihfX2ksIF9faik7CisJaW5zZXJ0KF9fcCwgX19yKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHNpemVfdCBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX2ksCisJICAgICBjb25zdCBpdGVyYXRvciYgX19qKQorICAgICAgeworCXJvcGUgX19yKF9faSwgX19qKTsKKwlpbnNlcnQoX19wLCBfX3IpOworICAgICAgfQorCisgICAgICAvLyAocG9zaXRpb24sIGxlbmd0aCkgdmVyc2lvbnMgb2YgcmVwbGFjZSBvcGVyYXRpb25zOgorICAgICAgCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKHNpemVfdCBfX3AsIHNpemVfdCBfX24sIGNvbnN0IHJvcGUmIF9fcikKKyAgICAgIHsKKwlfUm9wZVJlcCogX19yZXN1bHQgPQorCSAgcmVwbGFjZSh0aGlzLT5fTV90cmVlX3B0ciwgX19wLCBfX3AgKyBfX24sIF9fci5fTV90cmVlX3B0cik7CisJX1NfdW5yZWYodGhpcy0+X01fdHJlZV9wdHIpOworCXRoaXMtPl9NX3RyZWVfcHRyID0gX19yZXN1bHQ7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2Uoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbiwKKwkgICAgICBjb25zdCBfQ2hhclQqIF9faSwgc2l6ZV90IF9faV9sZW4pCisgICAgICB7CisJcm9wZSBfX3IoX19pLCBfX2lfbGVuKTsKKwlyZXBsYWNlKF9fcCwgX19uLCBfX3IpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKHNpemVfdCBfX3AsIHNpemVfdCBfX24sIF9DaGFyVCBfX2MpCisgICAgICB7CisJcm9wZSBfX3IoX19jKTsKKwlyZXBsYWNlKF9fcCwgX19uLCBfX3IpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKHNpemVfdCBfX3AsIHNpemVfdCBfX24sIGNvbnN0IF9DaGFyVCogX19jX3N0cmluZykKKyAgICAgIHsKKwlyb3BlIF9fcihfX2Nfc3RyaW5nKTsKKwlyZXBsYWNlKF9fcCwgX19uLCBfX3IpOworICAgICAgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKHNpemVfdCBfX3AsIHNpemVfdCBfX24sCisJICAgICAgY29uc3QgX0NoYXJUKiBfX2ksIGNvbnN0IF9DaGFyVCogX19qKQorICAgICAgeworCXJvcGUgX19yKF9faSwgX19qKTsKKwlyZXBsYWNlKF9fcCwgX19uLCBfX3IpOworICAgICAgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKHNpemVfdCBfX3AsIHNpemVfdCBfX24sCisJICAgICAgY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faSwgY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faikKKyAgICAgIHsKKwlyb3BlIF9fcihfX2ksIF9faik7CisJcmVwbGFjZShfX3AsIF9fbiwgX19yKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVwbGFjZShzaXplX3QgX19wLCBzaXplX3QgX19uLAorCSAgICAgIGNvbnN0IGl0ZXJhdG9yJiBfX2ksIGNvbnN0IGl0ZXJhdG9yJiBfX2opCisgICAgICB7CisJcm9wZSBfX3IoX19pLCBfX2opOworCXJlcGxhY2UoX19wLCBfX24sIF9fcik7CisgICAgICB9CisKKyAgICAgIC8vIFNpbmdsZSBjaGFyYWN0ZXIgdmFyaWFudHM6CisgICAgICB2b2lkCisgICAgICByZXBsYWNlKHNpemVfdCBfX3AsIF9DaGFyVCBfX2MpCisgICAgICB7CisJaXRlcmF0b3IgX19pKHRoaXMsIF9fcCk7CisJKl9faSA9IF9fYzsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVwbGFjZShzaXplX3QgX19wLCBjb25zdCByb3BlJiBfX3IpCisgICAgICB7IHJlcGxhY2UoX19wLCAxLCBfX3IpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2Uoc2l6ZV90IF9fcCwgY29uc3QgX0NoYXJUKiBfX2ksIHNpemVfdCBfX2lfbGVuKQorICAgICAgeyByZXBsYWNlKF9fcCwgMSwgX19pLCBfX2lfbGVuKTsgfQorCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKHNpemVfdCBfX3AsIGNvbnN0IF9DaGFyVCogX19jX3N0cmluZykKKyAgICAgIHsJcmVwbGFjZShfX3AsIDEsIF9fY19zdHJpbmcpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2Uoc2l6ZV90IF9fcCwgY29uc3QgX0NoYXJUKiBfX2ksIGNvbnN0IF9DaGFyVCogX19qKQorICAgICAgewlyZXBsYWNlKF9fcCwgMSwgX19pLCBfX2opOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2Uoc2l6ZV90IF9fcCwgY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faSwKKwkgICAgICBjb25zdCBjb25zdF9pdGVyYXRvciYgX19qKQorICAgICAgeyByZXBsYWNlKF9fcCwgMSwgX19pLCBfX2opOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2Uoc2l6ZV90IF9fcCwgY29uc3QgaXRlcmF0b3ImIF9faSwKKwkgICAgICBjb25zdCBpdGVyYXRvciYgX19qKQorICAgICAgeyByZXBsYWNlKF9fcCwgMSwgX19pLCBfX2opOyB9CisKKyAgICAgIC8vIEVyYXNlLCAocG9zaXRpb24sIHNpemUpIHZhcmlhbnQuCisgICAgICB2b2lkCisgICAgICBlcmFzZShzaXplX3QgX19wLCBzaXplX3QgX19uKQorICAgICAgeworCV9Sb3BlUmVwKiBfX3Jlc3VsdCA9IHJlcGxhY2UodGhpcy0+X01fdHJlZV9wdHIsIF9fcCwKKwkJCQkgICAgIF9fcCArIF9fbiwgMCk7CisJX1NfdW5yZWYodGhpcy0+X01fdHJlZV9wdHIpOworCXRoaXMtPl9NX3RyZWVfcHRyID0gX19yZXN1bHQ7CisgICAgICB9CisKKyAgICAgIC8vIEVyYXNlLCBzaW5nbGUgY2hhcmFjdGVyCisgICAgICB2b2lkCisgICAgICBlcmFzZShzaXplX3QgX19wKQorICAgICAgeyBlcmFzZShfX3AsIF9fcCArIDEpOyB9CisKKyAgICAgIC8vIEluc2VydCwgaXRlcmF0b3IgdmFyaWFudHMuCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IHJvcGUmIF9fcikKKyAgICAgIHsKKwlpbnNlcnQoX19wLmluZGV4KCksIF9fcik7CisJcmV0dXJuIF9fcDsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCBpdGVyYXRvciYgX19wLCBzaXplX3QgX19uLCBfQ2hhclQgX19jKQorICAgICAgeworCWluc2VydChfX3AuaW5kZXgoKSwgX19uLCBfX2MpOworCXJldHVybiBfX3A7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yIGluc2VydChjb25zdCBpdGVyYXRvciYgX19wLCBfQ2hhclQgX19jKQorICAgICAgeworCWluc2VydChfX3AuaW5kZXgoKSwgX19jKTsKKwlyZXR1cm4gX19wOworICAgICAgfQorICAgICAgCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IGl0ZXJhdG9yJiBfX3AgKQorICAgICAgeworCWluc2VydChfX3AuaW5kZXgoKSk7CisJcmV0dXJuIF9fcDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBfQ2hhclQqIGNfc3RyaW5nKQorICAgICAgeworCWluc2VydChfX3AuaW5kZXgoKSwgY19zdHJpbmcpOworCXJldHVybiBfX3A7CisgICAgICB9CisgICAgICAKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgX0NoYXJUKiBfX2ksIHNpemVfdCBfX24pCisgICAgICB7CisJaW5zZXJ0KF9fcC5pbmRleCgpLCBfX2ksIF9fbik7CisJcmV0dXJuIF9fcDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBfQ2hhclQqIF9faSwKKwkgICAgIGNvbnN0IF9DaGFyVCogX19qKQorICAgICAgeworCWluc2VydChfX3AuaW5kZXgoKSwgX19pLCBfX2opOyAKKwlyZXR1cm4gX19wOworICAgICAgfQorICAgICAgCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IGl0ZXJhdG9yJiBfX3AsCisJICAgICBjb25zdCBjb25zdF9pdGVyYXRvciYgX19pLCBjb25zdCBjb25zdF9pdGVyYXRvciYgX19qKQorICAgICAgeworCWluc2VydChfX3AuaW5kZXgoKSwgX19pLCBfX2opOworCXJldHVybiBfX3A7CisgICAgICB9CisgICAgICAKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgaXRlcmF0b3ImIF9fcCwKKwkgICAgIGNvbnN0IGl0ZXJhdG9yJiBfX2ksIGNvbnN0IGl0ZXJhdG9yJiBfX2opCisgICAgICB7CisJaW5zZXJ0KF9fcC5pbmRleCgpLCBfX2ksIF9faik7CisJcmV0dXJuIF9fcDsKKyAgICAgIH0KKworICAgICAgLy8gUmVwbGFjZSwgcmFuZ2UgdmFyaWFudHMuCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX3EsIGNvbnN0IHJvcGUmIF9fcikKKyAgICAgIHsJcmVwbGFjZShfX3AuaW5kZXgoKSwgX19xLmluZGV4KCkgLSBfX3AuaW5kZXgoKSwgX19yKTsgfQorCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX3EsIF9DaGFyVCBfX2MpCisgICAgICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9fcS5pbmRleCgpIC0gX19wLmluZGV4KCksIF9fYyk7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBpdGVyYXRvciYgX19xLAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19jX3N0cmluZykKKyAgICAgIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19xLmluZGV4KCkgLSBfX3AuaW5kZXgoKSwgX19jX3N0cmluZyk7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBpdGVyYXRvciYgX19xLAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19pLCBzaXplX3QgX19uKQorICAgICAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX3EuaW5kZXgoKSAtIF9fcC5pbmRleCgpLCBfX2ksIF9fbik7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBpdGVyYXRvciYgX19xLAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19pLCBjb25zdCBfQ2hhclQqIF9faikKKyAgICAgIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19xLmluZGV4KCkgLSBfX3AuaW5kZXgoKSwgX19pLCBfX2opOyB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgaXRlcmF0b3ImIF9fcSwKKwkgICAgICBjb25zdCBjb25zdF9pdGVyYXRvciYgX19pLCBjb25zdCBjb25zdF9pdGVyYXRvciYgX19qKQorICAgICAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX3EuaW5kZXgoKSAtIF9fcC5pbmRleCgpLCBfX2ksIF9faik7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBpdGVyYXRvciYgX19xLAorCSAgICAgIGNvbnN0IGl0ZXJhdG9yJiBfX2ksIGNvbnN0IGl0ZXJhdG9yJiBfX2opCisgICAgICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9fcS5pbmRleCgpIC0gX19wLmluZGV4KCksIF9faSwgX19qKTsgfQorCisgICAgICAvLyBSZXBsYWNlLCBpdGVyYXRvciB2YXJpYW50cy4KKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3Qgcm9wZSYgX19yKQorICAgICAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX3IpOyB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgX0NoYXJUIF9fYykKKyAgICAgIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19jKTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IF9DaGFyVCogX19jX3N0cmluZykKKyAgICAgIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19jX3N0cmluZyk7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBfQ2hhclQqIF9faSwgc2l6ZV90IF9fbikKKyAgICAgIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19pLCBfX24pOyB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgX0NoYXJUKiBfX2ksIGNvbnN0IF9DaGFyVCogX19qKQorICAgICAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX2ksIF9faik7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdF9pdGVyYXRvciBfX2ksIGNvbnN0X2l0ZXJhdG9yIF9faikKKyAgICAgIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19pLCBfX2opOyB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgaXRlcmF0b3IgX19pLCBpdGVyYXRvciBfX2opCisgICAgICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9faSwgX19qKTsgfQorCisgICAgICAvLyBJdGVyYXRvciBhbmQgcmFuZ2UgdmFyaWFudHMgb2YgZXJhc2UKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBpdGVyYXRvciYgX19xKQorICAgICAgeworCXNpemVfdCBfX3BfaW5kZXggPSBfX3AuaW5kZXgoKTsKKwllcmFzZShfX3BfaW5kZXgsIF9fcS5pbmRleCgpIC0gX19wX2luZGV4KTsKKwlyZXR1cm4gaXRlcmF0b3IodGhpcywgX19wX2luZGV4KTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0IGl0ZXJhdG9yJiBfX3ApCisgICAgICB7CisJc2l6ZV90IF9fcF9pbmRleCA9IF9fcC5pbmRleCgpOworCWVyYXNlKF9fcF9pbmRleCwgMSk7CisJcmV0dXJuIGl0ZXJhdG9yKHRoaXMsIF9fcF9pbmRleCk7CisgICAgICB9CisKKyAgICAgIHJvcGUKKyAgICAgIHN1YnN0cihzaXplX3QgX19zdGFydCwgc2l6ZV90IF9fbGVuID0gMSkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gcm9wZTxfQ2hhclQsIF9BbGxvYz4oX1Nfc3Vic3RyaW5nKHRoaXMtPl9NX3RyZWVfcHRyLAorCQkJCQkJIF9fc3RhcnQsCisJCQkJCQkgX19zdGFydCArIF9fbGVuKSk7CisgICAgICB9CisKKyAgICAgIHJvcGUKKyAgICAgIHN1YnN0cihpdGVyYXRvciBfX3N0YXJ0LCBpdGVyYXRvciBfX2VuZCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gcm9wZTxfQ2hhclQsIF9BbGxvYz4oX1Nfc3Vic3RyaW5nKHRoaXMtPl9NX3RyZWVfcHRyLAorCQkJCQkJIF9fc3RhcnQuaW5kZXgoKSwKKwkJCQkJCSBfX2VuZC5pbmRleCgpKSk7CisgICAgICB9CisKKyAgICAgIHJvcGUKKyAgICAgIHN1YnN0cihpdGVyYXRvciBfX3N0YXJ0KSBjb25zdAorICAgICAgeworCXNpemVfdCBfX3BvcyA9IF9fc3RhcnQuaW5kZXgoKTsKKwlyZXR1cm4gcm9wZTxfQ2hhclQsIF9BbGxvYz4oX1Nfc3Vic3RyaW5nKHRoaXMtPl9NX3RyZWVfcHRyLAorCQkJCQkJIF9fcG9zLCBfX3BvcyArIDEpKTsKKyAgICAgIH0KKworICAgICAgcm9wZQorICAgICAgc3Vic3RyKGNvbnN0X2l0ZXJhdG9yIF9fc3RhcnQsIGNvbnN0X2l0ZXJhdG9yIF9fZW5kKSBjb25zdAorICAgICAgeworCS8vIFRoaXMgbWlnaHQgZXZlbnR1YWxseSB0YWtlIGFkdmFudGFnZSBvZiB0aGUgY2FjaGUgaW4gdGhlCisJLy8gaXRlcmF0b3IuCisJcmV0dXJuIHJvcGU8X0NoYXJULCBfQWxsb2M+KF9TX3N1YnN0cmluZyh0aGlzLT5fTV90cmVlX3B0ciwKKwkJCQkJCSBfX3N0YXJ0LmluZGV4KCksCisJCQkJCQkgX19lbmQuaW5kZXgoKSkpOworICAgICAgfQorCisgICAgICByb3BlPF9DaGFyVCwgX0FsbG9jPgorICAgICAgc3Vic3RyKGNvbnN0X2l0ZXJhdG9yIF9fc3RhcnQpCisgICAgICB7CisJc2l6ZV90IF9fcG9zID0gX19zdGFydC5pbmRleCgpOworCXJldHVybiByb3BlPF9DaGFyVCwgX0FsbG9jPihfU19zdWJzdHJpbmcodGhpcy0+X01fdHJlZV9wdHIsCisJCQkJCQkgX19wb3MsIF9fcG9zICsgMSkpOworICAgICAgfQorCisgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBlIG5wb3M7CisKKyAgICAgIHNpemVfdHlwZSBmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0OworCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgICB7CisJc2l6ZV90eXBlIF9fcmVzdWx0X3BvczsKKwljb25zdF9pdGVyYXRvciBfX3Jlc3VsdCA9CisJICBzdGQ6OnNlYXJjaChjb25zdF9iZWdpbigpICsgX19wb3MsIGNvbnN0X2VuZCgpLAorCQkgICAgICBfX3MsIF9fcyArIF9TX2NoYXJfcHRyX2xlbihfX3MpKTsKKwlfX3Jlc3VsdF9wb3MgPSBfX3Jlc3VsdC5pbmRleCgpOworI2lmbmRlZiBfX1NUTF9PTERfUk9QRV9TRU1BTlRJQ1MKKwlpZiAoX19yZXN1bHRfcG9zID09IHNpemUoKSkKKwkgIF9fcmVzdWx0X3BvcyA9IG5wb3M7CisjZW5kaWYKKwlyZXR1cm4gX19yZXN1bHRfcG9zOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgbXV0YWJsZV9iZWdpbigpCisgICAgICB7IHJldHVybihpdGVyYXRvcih0aGlzLCAwKSk7IH0KKyAgICAgIAorICAgICAgaXRlcmF0b3IKKyAgICAgIG11dGFibGVfZW5kKCkKKyAgICAgIHsgcmV0dXJuKGl0ZXJhdG9yKHRoaXMsIHNpemUoKSkpOyB9CisKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICBtdXRhYmxlX3JiZWdpbigpCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKG11dGFibGVfZW5kKCkpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIG11dGFibGVfcmVuZCgpCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKG11dGFibGVfYmVnaW4oKSk7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBtdXRhYmxlX3JlZmVyZW5jZV9hdChzaXplX3R5cGUgX19wb3MpCisgICAgICB7IHJldHVybiByZWZlcmVuY2UodGhpcywgX19wb3MpOyB9CisKKyNpZmRlZiBfX1NURF9TVFVGRgorICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdIChzaXplX3R5cGUgX19wb3MpCisgICAgICB7IHJldHVybiBfY2hhcl9yZWZfcHJveHkodGhpcywgX19wb3MpOyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgYXQoc2l6ZV90eXBlIF9fcG9zKQorICAgICAgeworCS8vIGlmIChfX3BvcyA+PSBzaXplKCkpIHRocm93IG91dF9vZl9yYW5nZTsgIC8vIFhYWAorCXJldHVybiAoKnRoaXMpW19fcG9zXTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgdm9pZCByZXNpemUoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykgeyB9CisgICAgICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uKSB7IH0KKyAgICAgIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUgX19yZXNfYXJnID0gMCkgeyB9CisgICAgICAKKyAgICAgIHNpemVfdHlwZQorICAgICAgY2FwYWNpdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gbWF4X3NpemUoKTsgfQorCisgICAgICAvLyBTdHVmZiBiZWxvdyB0aGlzIGxpbmUgaXMgZGFuZ2Vyb3VzIGJlY2F1c2UgaXQncyBlcnJvciBwcm9uZS4KKyAgICAgIC8vIEkgd291bGQgcmVhbGx5IGxpa2UgdG8gZ2V0IHJpZCBvZiBpdC4KKyAgICAgIC8vIGNvcHkgZnVuY3Rpb24gd2l0aCBmdW5ueSBhcmcgb3JkZXJpbmcuCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNvcHkoX0NoYXJUKiBfX2J1ZmZlciwgc2l6ZV90eXBlIF9fbiwKKwkgICBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICAgICAgeyByZXR1cm4gY29weShfX3BvcywgX19uLCBfX2J1ZmZlcik7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpCisgICAgICB7IHJldHVybiBtdXRhYmxlX2VuZCgpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpCisgICAgICB7IHJldHVybiBtdXRhYmxlX2JlZ2luKCk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpCisgICAgICB7IHJldHVybiBtdXRhYmxlX3JlbmQoKTsgfQorICAgICAgCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKQorICAgICAgeyByZXR1cm4gbXV0YWJsZV9yYmVnaW4oKTsgfQorCisjZWxzZQorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpCisgICAgICB7IHJldHVybiBjb25zdF9lbmQoKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKQorICAgICAgeyByZXR1cm4gY29uc3RfYmVnaW4oKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JlbmQoKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKQorICAgICAgeyByZXR1cm4gY29uc3RfcmJlZ2luKCk7IH0KKworI2VuZGlmCisgICAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgY29uc3QgdHlwZW5hbWUgcm9wZTxfQ2hhclQsIF9BbGxvYz46OnNpemVfdHlwZQorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjpucG9zID0gKHNpemVfdHlwZSkoLTEpOworICAKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJCQkgICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAoX194Ll9NX2N1cnJlbnRfcG9zID09IF9feS5fTV9jdXJyZW50X3BvcworCSAgICAgICYmIF9feC5fTV9yb290ID09IF9feS5fTV9yb290KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJCQkgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIChfX3guX01fY3VycmVudF9wb3MgPCBfX3kuX01fY3VycmVudF9wb3MpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJCQkgICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkJCSAgY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBwdHJkaWZmX3QKKyAgICBvcGVyYXRvci0oY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gKHB0cmRpZmZfdClfX3guX01fY3VycmVudF9wb3MgLSAocHRyZGlmZl90KV9feS5fTV9jdXJyZW50X3BvczsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+CisgICAgb3BlcmF0b3ItKGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LCBwdHJkaWZmX3QgX19uKQorICAgIHsgcmV0dXJuIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPihfX3guX01fcm9vdCwKKwkJCQkJCSAgX194Ll9NX2N1cnJlbnRfcG9zIC0gX19uKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LCBwdHJkaWZmX3QgX19uKQorICAgIHsgcmV0dXJuIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPihfX3guX01fcm9vdCwKKwkJCQkJCSAgX194Ll9NX2N1cnJlbnRfcG9zICsgX19uKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKHB0cmRpZmZfdCBfX24sIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194KQorICB7IHJldHVybiBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4oX194Ll9NX3Jvb3QsCisJCQkJCQlfX3guX01fY3VycmVudF9wb3MgKyBfX24pOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3kpCisgICAge3JldHVybiAoX194Ll9NX2N1cnJlbnRfcG9zID09IF9feS5fTV9jdXJyZW50X3BvcworCSAgICAgJiYgX194Ll9NX3Jvb3Rfcm9wZSA9PSBfX3kuX01fcm9vdF9yb3BlKTsgfQorICAKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIChfX3guX01fY3VycmVudF9wb3MgPCBfX3kuX01fY3VycmVudF9wb3MpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkgICAgICBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHB0cmRpZmZfdAorICAgIG9wZXJhdG9yLShjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkgICAgICBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAoKHB0cmRpZmZfdClfX3guX01fY3VycmVudF9wb3MKKwkgICAgICAtIChwdHJkaWZmX3QpX195Ll9NX2N1cnJlbnRfcG9zKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+CisgICAgb3BlcmF0b3ItKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgIHB0cmRpZmZfdCBfX24pCisgICAgeyByZXR1cm4gX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+KF9feC5fTV9yb290X3JvcGUsCisJCQkJCSAgICBfX3guX01fY3VycmVudF9wb3MgLSBfX24pOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisoY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsIHB0cmRpZmZfdCBfX24pCisgICAgeyByZXR1cm4gX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+KF9feC5fTV9yb290X3JvcGUsCisJCQkJCSAgICBfX3guX01fY3VycmVudF9wb3MgKyBfX24pOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisocHRyZGlmZl90IF9fbiwgY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gpCisgICAgeyByZXR1cm4gX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+KF9feC5fTV9yb290X3JvcGUsCisJCQkJCSAgICBfX3guX01fY3VycmVudF9wb3MgKyBfX24pOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSByb3BlPF9DaGFyVCwgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19sZWZ0LAorCSAgICAgIGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3JpZ2h0KQorICAgIHsKKyAgICAgIC8vIElubGluaW5nIHRoaXMgc2hvdWxkIG1ha2UgaXQgcG9zc2libGUgdG8ga2VlcCBfX2xlZnQgYW5kCisgICAgICAvLyBfX3JpZ2h0IGluIHJlZ2lzdGVycy4KKyAgICAgIHR5cGVkZWYgcm9wZTxfQ2hhclQsIF9BbGxvYz4gcm9wZV90eXBlOworICAgICAgcmV0dXJuIHJvcGVfdHlwZShyb3BlX3R5cGU6Ol9TX2NvbmNhdChfX2xlZnQuX01fdHJlZV9wdHIsIAorCQkJCQkgICAgX19yaWdodC5fTV90cmVlX3B0cikpOworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHJvcGU8X0NoYXJULCBfQWxsb2M+JgorICAgIG9wZXJhdG9yKz0ocm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fbGVmdCwKKwkgICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fcmlnaHQpCisgICAgeworICAgICAgX19sZWZ0LmFwcGVuZChfX3JpZ2h0KTsKKyAgICAgIHJldHVybiBfX2xlZnQ7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgcm9wZTxfQ2hhclQsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisoY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fbGVmdCwKKwkgICAgICBjb25zdCBfQ2hhclQqIF9fcmlnaHQpCisgICAgeworICAgICAgdHlwZWRlZiByb3BlPF9DaGFyVCwgX0FsbG9jPiByb3BlX3R5cGU7CisgICAgICBzaXplX3QgX19ybGVuID0gcm9wZV90eXBlOjpfU19jaGFyX3B0cl9sZW4oX19yaWdodCk7CisgICAgICByZXR1cm4gcm9wZV90eXBlKHJvcGVfdHlwZTo6X1NfY29uY2F0X2NoYXJfaXRlcihfX2xlZnQuX01fdHJlZV9wdHIsCisJCQkJCQkgICAgICBfX3JpZ2h0LCBfX3JsZW4pKTsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSByb3BlPF9DaGFyVCwgX0FsbG9jPiYKKyAgICBvcGVyYXRvcis9KHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX2xlZnQsCisJICAgICAgIGNvbnN0IF9DaGFyVCogX19yaWdodCkKKyAgICB7CisgICAgICBfX2xlZnQuYXBwZW5kKF9fcmlnaHQpOworICAgICAgcmV0dXJuIF9fbGVmdDsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSByb3BlPF9DaGFyVCwgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19sZWZ0LCBfQ2hhclQgX19yaWdodCkKKyAgICB7CisgICAgICB0eXBlZGVmIHJvcGU8X0NoYXJULCBfQWxsb2M+IHJvcGVfdHlwZTsKKyAgICAgIHJldHVybiByb3BlX3R5cGUocm9wZV90eXBlOjpfU19jb25jYXRfY2hhcl9pdGVyKF9fbGVmdC5fTV90cmVlX3B0ciwKKwkJCQkJCSAgICAgICZfX3JpZ2h0LCAxKSk7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgcm9wZTxfQ2hhclQsIF9BbGxvYz4mCisgICAgb3BlcmF0b3IrPShyb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19sZWZ0LCBfQ2hhclQgX19yaWdodCkKKyAgICB7CisgICAgICBfX2xlZnQuYXBwZW5kKF9fcmlnaHQpOworICAgICAgcmV0dXJuIF9fbGVmdDsKKyAgICB9CisgIAorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19sZWZ0LAorCSAgICAgIGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3JpZ2h0KQorICAgIHsgcmV0dXJuIF9fbGVmdC5jb21wYXJlKF9fcmlnaHQpIDwgMDsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19sZWZ0LAorCSAgICAgICBjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19yaWdodCkKKyAgICB7IHJldHVybiBfX2xlZnQuY29tcGFyZShfX3JpZ2h0KSA9PSAwOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgX1JvcGVfY2hhcl9wdHJfcHJveHk8X0NoYXJULCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gKF9feC5fTV9wb3MgPT0gX195Ll9NX3BvcyAmJiBfX3guX01fcm9vdCA9PSBfX3kuX01fcm9vdCk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vLAorCSAgICAgICBjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19yKTsKKworICB0eXBlZGVmIHJvcGU8Y2hhcj4gY3JvcGU7CisgIHR5cGVkZWYgcm9wZTx3Y2hhcl90PiB3cm9wZTsKKworICBpbmxpbmUgY3JvcGU6OnJlZmVyZW5jZQorICBfX211dGFibGVfcmVmZXJlbmNlX2F0KGNyb3BlJiBfX2MsIHNpemVfdCBfX2kpCisgIHsgcmV0dXJuIF9fYy5tdXRhYmxlX3JlZmVyZW5jZV9hdChfX2kpOyB9CisKKyAgaW5saW5lIHdyb3BlOjpyZWZlcmVuY2UKKyAgX19tdXRhYmxlX3JlZmVyZW5jZV9hdCh3cm9wZSYgX19jLCBzaXplX3QgX19pKQorICB7IHJldHVybiBfX2MubXV0YWJsZV9yZWZlcmVuY2VfYXQoX19pKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAocm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9feCwgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreyAKK25hbWVzcGFjZSB0cjEKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPF9fZ251X2N4eDo6Y3JvcGU+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9fZ251X2N4eDo6Y3JvcGUmIF9fc3RyKSBjb25zdAorICAgICAgeworCXNpemVfdCBfX3NpemUgPSBfX3N0ci5zaXplKCk7CisJaWYgKDAgPT0gX19zaXplKQorCSAgcmV0dXJuIDA7CisJcmV0dXJuIDEzICogX19zdHJbMF0gKyA1ICogX19zdHJbX19zaXplIC0gMV0gKyBfX3NpemU7CisgICAgICB9CisgICAgfTsKKworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDxfX2dudV9jeHg6Ondyb3BlPgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfX2dudV9jeHg6Ondyb3BlJiBfX3N0cikgY29uc3QKKyAgICAgIHsKKwlzaXplX3QgX19zaXplID0gX19zdHIuc2l6ZSgpOworCWlmICgwID09IF9fc2l6ZSkKKwkgIHJldHVybiAwOworCXJldHVybiAxMyAqIF9fc3RyWzBdICsgNSAqIF9fc3RyW19fc2l6ZSAtIDFdICsgX19zaXplOworICAgICAgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgdHIxCit9IC8vIG5hbWVzcGFjZSBzdGQKKworIyBpbmNsdWRlIDxleHQvcm9wZWltcGwuaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9yb3BlaW1wbC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcm9wZWltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2I1Y2JkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvcm9wZWltcGwuaApAQCAtMCwwICsxLDE3MDMgQEAKKy8vIFNHSSdzIHJvcGUgY2xhc3MgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIHJvcGVpbXBsLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtleHQvcm9wZX0KKyAqLworCisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPgorCisjaW5jbHVkZSA8ZXh0L2FsZ29yaXRobT4gLy8gRm9yIGNvcHlfbiBhbmQgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheQorI2luY2x1ZGUgPGV4dC9tZW1vcnk+IC8vIEZvciB1bmluaXRpYWxpemVkX2NvcHlfbgorI2luY2x1ZGUgPGV4dC9udW1lcmljPiAvLyBGb3IgcG93ZXIKKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHVzaW5nIHN0ZDo6c2l6ZV90OworICB1c2luZyBzdGQ6OnByaW50ZjsKKyAgdXNpbmcgc3RkOjpiYXNpY19vc3RyZWFtOworICB1c2luZyBzdGQ6Ol9fdGhyb3dfbGVuZ3RoX2Vycm9yOworICB1c2luZyBzdGQ6Ol9EZXN0cm95OworICB1c2luZyBzdGQ6Ol9fdW5pbml0aWFsaXplZF9maWxsX25fYTsKKworICAvLyBTZXQgYnVmX3N0YXJ0LCBidWZfZW5kLCBhbmQgYnVmX3B0ciBhcHByb3ByaWF0ZWx5LCBmaWxsaW5nIHRtcF9idWYKKyAgLy8gaWYgbmVjZXNzYXJ5LiAgQXNzdW1lcyBfTV9wYXRoX2VuZFtsZWFmX2luZGV4XSBhbmQgbGVhZl9wb3MgYXJlIGNvcnJlY3QuCisgIC8vIFJlc3VsdHMgaW4gYSB2YWxpZCBidWZfcHRyIGlmIHRoZSBpdGVyYXRvciBjYW4gYmUgbGVnaXRpbWF0ZWx5CisgIC8vIGRlcmVmZXJlbmNlZC4KKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1Nfc2V0YnVmKF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+JiBfX3gpCisgICAgeworICAgICAgY29uc3QgX1JvcGVSZXAqIF9fbGVhZiA9IF9feC5fTV9wYXRoX2VuZFtfX3guX01fbGVhZl9pbmRleF07CisgICAgICBzaXplX3QgX19sZWFmX3BvcyA9IF9feC5fTV9sZWFmX3BvczsKKyAgICAgIHNpemVfdCBfX3BvcyA9IF9feC5fTV9jdXJyZW50X3BvczsKKworICAgICAgc3dpdGNoKF9fbGVhZi0+X01fdGFnKQorCXsKKwljYXNlIF9fZGV0YWlsOjpfU19sZWFmOgorCSAgX194Ll9NX2J1Zl9zdGFydCA9ICgoX1JvcGVfUm9wZUxlYWY8X0NoYXJULCBfQWxsb2M+KilfX2xlYWYpLT5fTV9kYXRhOworCSAgX194Ll9NX2J1Zl9wdHIgPSBfX3guX01fYnVmX3N0YXJ0ICsgKF9fcG9zIC0gX19sZWFmX3Bvcyk7CisJICBfX3guX01fYnVmX2VuZCA9IF9feC5fTV9idWZfc3RhcnQgKyBfX2xlYWYtPl9NX3NpemU7CisJICBicmVhazsKKwljYXNlIF9fZGV0YWlsOjpfU19mdW5jdGlvbjoKKwljYXNlIF9fZGV0YWlsOjpfU19zdWJzdHJpbmdmbjoKKwkgIHsKKwkgICAgc2l6ZV90IF9fbGVuID0gX1NfaXRlcmF0b3JfYnVmX2xlbjsKKwkgICAgc2l6ZV90IF9fYnVmX3N0YXJ0X3BvcyA9IF9fbGVhZl9wb3M7CisJICAgIHNpemVfdCBfX2xlYWZfZW5kID0gX19sZWFmX3BvcyArIF9fbGVhZi0+X01fc2l6ZTsKKwkgICAgY2hhcl9wcm9kdWNlcjxfQ2hhclQ+KiBfX2ZuID0gKChfUm9wZV9Sb3BlRnVuY3Rpb248X0NoYXJULAorCQkJCQkgICAgX0FsbG9jPiopX19sZWFmKS0+X01fZm47CisJICAgIGlmIChfX2J1Zl9zdGFydF9wb3MgKyBfX2xlbiA8PSBfX3BvcykKKwkgICAgICB7CisJCV9fYnVmX3N0YXJ0X3BvcyA9IF9fcG9zIC0gX19sZW4gLyA0OworCQlpZiAoX19idWZfc3RhcnRfcG9zICsgX19sZW4gPiBfX2xlYWZfZW5kKQorCQkgIF9fYnVmX3N0YXJ0X3BvcyA9IF9fbGVhZl9lbmQgLSBfX2xlbjsKKwkgICAgICB9CisJICAgIGlmIChfX2J1Zl9zdGFydF9wb3MgKyBfX2xlbiA+IF9fbGVhZl9lbmQpCisJICAgICAgX19sZW4gPSBfX2xlYWZfZW5kIC0gX19idWZfc3RhcnRfcG9zOworCSAgICAoKl9fZm4pKF9fYnVmX3N0YXJ0X3BvcyAtIF9fbGVhZl9wb3MsIF9fbGVuLCBfX3guX01fdG1wX2J1Zik7CisJICAgIF9feC5fTV9idWZfcHRyID0gX194Ll9NX3RtcF9idWYgKyAoX19wb3MgLSBfX2J1Zl9zdGFydF9wb3MpOworCSAgICBfX3guX01fYnVmX3N0YXJ0ID0gX194Ll9NX3RtcF9idWY7CisJICAgIF9feC5fTV9idWZfZW5kID0gX194Ll9NX3RtcF9idWYgKyBfX2xlbjsKKwkgIH0KKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisgICAgfQorCisgIC8vIFNldCBwYXRoIGFuZCBidWZmZXIgaW5zaWRlIGEgcm9wZSBpdGVyYXRvci4gIFdlIGFzc3VtZSB0aGF0CisgIC8vIHBvcyBhbmQgcm9vdCBhcmUgYWxyZWFkeSBzZXQuCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX3NldGNhY2hlKF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+JiBfX3gpCisgICAgeworICAgICAgY29uc3QgX1JvcGVSZXAqIF9fcGF0aFtpbnQoX19kZXRhaWw6Ol9TX21heF9yb3BlX2RlcHRoKSArIDFdOworICAgICAgY29uc3QgX1JvcGVSZXAqIF9fY3Vycl9yb3BlOworICAgICAgaW50IF9fY3Vycl9kZXB0aCA9IC0xOyAgLyogaW5kZXggaW50byBwYXRoICAgICovCisgICAgICBzaXplX3QgX19jdXJyX3N0YXJ0X3BvcyA9IDA7CisgICAgICBzaXplX3QgX19wb3MgPSBfX3guX01fY3VycmVudF9wb3M7CisgICAgICB1bnNpZ25lZCBjaGFyIF9fZGlybnMgPSAwOyAvLyBCaXQgdmVjdG9yIG1hcmtpbmcgcmlnaHQgdHVybnMgaW4gdGhlIHBhdGgKKworICAgICAgaWYgKF9fcG9zID49IF9feC5fTV9yb290LT5fTV9zaXplKQorCXsKKwkgIF9feC5fTV9idWZfcHRyID0gMDsKKwkgIHJldHVybjsKKwl9CisgICAgICBfX2N1cnJfcm9wZSA9IF9feC5fTV9yb290OworICAgICAgaWYgKDAgIT0gX19jdXJyX3JvcGUtPl9NX2Nfc3RyaW5nKQorCXsKKwkgIC8qIFRyZWF0IHRoZSByb290IGFzIGEgbGVhZi4gKi8KKwkgIF9feC5fTV9idWZfc3RhcnQgPSBfX2N1cnJfcm9wZS0+X01fY19zdHJpbmc7CisJICBfX3guX01fYnVmX2VuZCA9IF9fY3Vycl9yb3BlLT5fTV9jX3N0cmluZyArIF9fY3Vycl9yb3BlLT5fTV9zaXplOworCSAgX194Ll9NX2J1Zl9wdHIgPSBfX2N1cnJfcm9wZS0+X01fY19zdHJpbmcgKyBfX3BvczsKKwkgIF9feC5fTV9wYXRoX2VuZFswXSA9IF9fY3Vycl9yb3BlOworCSAgX194Ll9NX2xlYWZfaW5kZXggPSAwOworCSAgX194Ll9NX2xlYWZfcG9zID0gMDsKKwkgIHJldHVybjsKKwl9CisgICAgICBmb3IoOzspCisJeworCSAgKytfX2N1cnJfZGVwdGg7CisJICBfX3BhdGhbX19jdXJyX2RlcHRoXSA9IF9fY3Vycl9yb3BlOworCSAgc3dpdGNoKF9fY3Vycl9yb3BlLT5fTV90YWcpCisJICAgIHsKKwkgICAgY2FzZSBfX2RldGFpbDo6X1NfbGVhZjoKKwkgICAgY2FzZSBfX2RldGFpbDo6X1NfZnVuY3Rpb246CisJICAgIGNhc2UgX19kZXRhaWw6Ol9TX3N1YnN0cmluZ2ZuOgorCSAgICAgIF9feC5fTV9sZWFmX3BvcyA9IF9fY3Vycl9zdGFydF9wb3M7CisJICAgICAgZ290byBkb25lOworCSAgICBjYXNlIF9fZGV0YWlsOjpfU19jb25jYXQ6CisJICAgICAgeworCQlfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjxfQ2hhclQsIF9BbGxvYz4qIF9fYyA9CisJCSAgKF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uPF9DaGFyVCwgX0FsbG9jPiopX19jdXJyX3JvcGU7CisJCV9Sb3BlUmVwKiBfX2xlZnQgPSBfX2MtPl9NX2xlZnQ7CisJCXNpemVfdCBfX2xlZnRfbGVuID0gX19sZWZ0LT5fTV9zaXplOworCisJCV9fZGlybnMgPDw9IDE7CisJCWlmIChfX3BvcyA+PSBfX2N1cnJfc3RhcnRfcG9zICsgX19sZWZ0X2xlbikKKwkJICB7CisJCSAgICBfX2Rpcm5zIHw9IDE7CisJCSAgICBfX2N1cnJfcm9wZSA9IF9fYy0+X01fcmlnaHQ7CisJCSAgICBfX2N1cnJfc3RhcnRfcG9zICs9IF9fbGVmdF9sZW47CisJCSAgfQorCQllbHNlCisJCSAgX19jdXJyX3JvcGUgPSBfX2xlZnQ7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIGRvbmU6CisgICAgICAvLyBDb3B5IGxhc3Qgc2VjdGlvbiBvZiBwYXRoIGludG8gX01fcGF0aF9lbmQuCisgICAgICB7CisJaW50IF9faSA9IC0xOworCWludCBfX2ogPSBfX2N1cnJfZGVwdGggKyAxIC0gaW50KF9TX3BhdGhfY2FjaGVfbGVuKTsKKworCWlmIChfX2ogPCAwKSBfX2ogPSAwOworCXdoaWxlIChfX2ogPD0gX19jdXJyX2RlcHRoKQorCSAgX194Ll9NX3BhdGhfZW5kWysrX19pXSA9IF9fcGF0aFtfX2orK107CisJX194Ll9NX2xlYWZfaW5kZXggPSBfX2k7CisgICAgICB9CisgICAgICBfX3guX01fcGF0aF9kaXJlY3Rpb25zID0gX19kaXJuczsKKyAgICAgIF9TX3NldGJ1ZihfX3gpOworICAgIH0KKworICAvLyBTcGVjaWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBhYm92ZS4gIEFzc3VtZXMgdGhhdAorICAvLyB0aGUgcGF0aCBjYWNoZSBpcyB2YWxpZCBmb3IgdGhlIHByZXZpb3VzIHBvc2l0aW9uLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19zZXRjYWNoZV9mb3JfaW5jcihfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPiYgX194KQorICAgIHsKKyAgICAgIGludCBfX2N1cnJlbnRfaW5kZXggPSBfX3guX01fbGVhZl9pbmRleDsKKyAgICAgIGNvbnN0IF9Sb3BlUmVwKiBfX2N1cnJlbnRfbm9kZSA9IF9feC5fTV9wYXRoX2VuZFtfX2N1cnJlbnRfaW5kZXhdOworICAgICAgc2l6ZV90IF9fbGVuID0gX19jdXJyZW50X25vZGUtPl9NX3NpemU7CisgICAgICBzaXplX3QgX19ub2RlX3N0YXJ0X3BvcyA9IF9feC5fTV9sZWFmX3BvczsKKyAgICAgIHVuc2lnbmVkIGNoYXIgX19kaXJucyA9IF9feC5fTV9wYXRoX2RpcmVjdGlvbnM7CisgICAgICBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjxfQ2hhclQsIF9BbGxvYz4qIF9fYzsKKworICAgICAgaWYgKF9feC5fTV9jdXJyZW50X3BvcyAtIF9fbm9kZV9zdGFydF9wb3MgPCBfX2xlbikKKwl7CisJICAvKiBNb3JlIHN0dWZmIGluIHRoaXMgbGVhZiwgd2UganVzdCBkaWRuJ3QgY2FjaGUgaXQuICovCisJICBfU19zZXRidWYoX194KTsKKwkgIHJldHVybjsKKwl9CisgICAgICAvLyAgbm9kZV9zdGFydF9wb3MgaXMgc3RhcnRpbmcgcG9zaXRpb24gb2YgbGFzdF9ub2RlLgorICAgICAgd2hpbGUgKC0tX19jdXJyZW50X2luZGV4ID49IDApCisJeworCSAgaWYgKCEoX19kaXJucyAmIDEpIC8qIFBhdGggdHVybmVkIGxlZnQgKi8pCisJICAgIGJyZWFrOworCSAgX19jdXJyZW50X25vZGUgPSBfX3guX01fcGF0aF9lbmRbX19jdXJyZW50X2luZGV4XTsKKwkgIF9fYyA9IChfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjxfQ2hhclQsIF9BbGxvYz4qKV9fY3VycmVudF9ub2RlOworCSAgLy8gT3RoZXJ3aXNlIHdlIHdlcmUgaW4gdGhlIHJpZ2h0IGNoaWxkLiAgVGh1cyB3ZSBzaG91bGQgcG9wCisJICAvLyB0aGUgY29uY2F0ZW5hdGlvbiBub2RlLgorCSAgX19ub2RlX3N0YXJ0X3BvcyAtPSBfX2MtPl9NX2xlZnQtPl9NX3NpemU7CisJICBfX2Rpcm5zID4+PSAxOworCX0KKyAgICAgIGlmIChfX2N1cnJlbnRfaW5kZXggPCAwKQorCXsKKwkgIC8vIFdlIHVuZGVyZmxvd2VkIHRoZSBjYWNoZS4gUHVudC4KKwkgIF9TX3NldGNhY2hlKF9feCk7CisJICByZXR1cm47CisJfQorICAgICAgX19jdXJyZW50X25vZGUgPSBfX3guX01fcGF0aF9lbmRbX19jdXJyZW50X2luZGV4XTsKKyAgICAgIF9fYyA9IChfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjxfQ2hhclQsIF9BbGxvYz4qKV9fY3VycmVudF9ub2RlOworICAgICAgLy8gY3VycmVudF9ub2RlIGlzIGEgY29uY2F0ZW5hdGlvbiBub2RlLiAgV2UgYXJlIHBvc2l0aW9uZWQgb24gdGhlIGZpcnN0CisgICAgICAvLyBjaGFyYWN0ZXIgaW4gaXRzIHJpZ2h0IGNoaWxkLgorICAgICAgLy8gbm9kZV9zdGFydF9wb3MgaXMgc3RhcnRpbmcgcG9zaXRpb24gb2YgY3VycmVudF9ub2RlLgorICAgICAgX19ub2RlX3N0YXJ0X3BvcyArPSBfX2MtPl9NX2xlZnQtPl9NX3NpemU7CisgICAgICBfX2N1cnJlbnRfbm9kZSA9IF9fYy0+X01fcmlnaHQ7CisgICAgICBfX3guX01fcGF0aF9lbmRbKytfX2N1cnJlbnRfaW5kZXhdID0gX19jdXJyZW50X25vZGU7CisgICAgICBfX2Rpcm5zIHw9IDE7CisgICAgICB3aGlsZSAoX19kZXRhaWw6Ol9TX2NvbmNhdCA9PSBfX2N1cnJlbnRfbm9kZS0+X01fdGFnKQorCXsKKwkgICsrX19jdXJyZW50X2luZGV4OworCSAgaWYgKGludChfU19wYXRoX2NhY2hlX2xlbikgPT0gX19jdXJyZW50X2luZGV4KQorCSAgICB7CisJICAgICAgaW50IF9faTsKKwkgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IGludChfU19wYXRoX2NhY2hlX2xlbikgLSAxOyBfX2krKykKKwkJX194Ll9NX3BhdGhfZW5kW19faV0gPSBfX3guX01fcGF0aF9lbmRbX19pKzFdOworCSAgICAgIC0tX19jdXJyZW50X2luZGV4OworCSAgICB9CisJICBfX2N1cnJlbnRfbm9kZSA9CisJICAgICgoX1JvcGVfUm9wZUNvbmNhdGVuYXRpb248X0NoYXJULCBfQWxsb2M+KilfX2N1cnJlbnRfbm9kZSktPl9NX2xlZnQ7CisJICBfX3guX01fcGF0aF9lbmRbX19jdXJyZW50X2luZGV4XSA9IF9fY3VycmVudF9ub2RlOworCSAgX19kaXJucyA8PD0gMTsKKwkgIC8vIG5vZGVfc3RhcnRfcG9zIGlzIHVuY2hhbmdlZC4KKwl9CisgICAgICBfX3guX01fbGVhZl9pbmRleCA9IF9fY3VycmVudF9pbmRleDsKKyAgICAgIF9feC5fTV9sZWFmX3BvcyA9IF9fbm9kZV9zdGFydF9wb3M7CisgICAgICBfX3guX01fcGF0aF9kaXJlY3Rpb25zID0gX19kaXJuczsKKyAgICAgIF9TX3NldGJ1ZihfX3gpOworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfTV9pbmNyKHNpemVfdCBfX24pCisgICAgeworICAgICAgX01fY3VycmVudF9wb3MgKz0gX19uOworICAgICAgaWYgKDAgIT0gX01fYnVmX3B0cikKKwl7CisJICBzaXplX3QgX19jaGFyc19sZWZ0ID0gX01fYnVmX2VuZCAtIF9NX2J1Zl9wdHI7CisJICBpZiAoX19jaGFyc19sZWZ0ID4gX19uKQorCSAgICBfTV9idWZfcHRyICs9IF9fbjsKKwkgIGVsc2UgaWYgKF9fY2hhcnNfbGVmdCA9PSBfX24pCisJICAgIHsKKwkgICAgICBfTV9idWZfcHRyICs9IF9fbjsKKwkgICAgICBfU19zZXRjYWNoZV9mb3JfaW5jcigqdGhpcyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgX01fYnVmX3B0ciA9IDA7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfTV9kZWNyKHNpemVfdCBfX24pCisgICAgeworICAgICAgaWYgKDAgIT0gX01fYnVmX3B0cikKKwl7CisJICBzaXplX3QgX19jaGFyc19sZWZ0ID0gX01fYnVmX3B0ciAtIF9NX2J1Zl9zdGFydDsKKwkgIGlmIChfX2NoYXJzX2xlZnQgPj0gX19uKQorCSAgICBfTV9idWZfcHRyIC09IF9fbjsKKwkgIGVsc2UKKwkgICAgX01fYnVmX3B0ciA9IDA7CisJfQorICAgICAgX01fY3VycmVudF9wb3MgLT0gX19uOworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX01fY2hlY2soKQorICAgIHsKKyAgICAgIGlmIChfTV9yb290X3JvcGUtPl9NX3RyZWVfcHRyICE9IHRoaXMtPl9NX3Jvb3QpCisJeworCSAgLy8gX1JvcGUgd2FzIG1vZGlmaWVkLiAgR2V0IHRoaW5ncyBmaXhlZCB1cC4KKwkgIF9Sb3BlUmVwOjpfU191bnJlZih0aGlzLT5fTV9yb290KTsKKwkgIHRoaXMtPl9NX3Jvb3QgPSBfTV9yb290X3JvcGUtPl9NX3RyZWVfcHRyOworCSAgX1JvcGVSZXA6Ol9TX3JlZih0aGlzLT5fTV9yb290KTsKKwkgIHRoaXMtPl9NX2J1Zl9wdHIgPSAwOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZQorICAgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1JvcGVfY29uc3RfaXRlcmF0b3IoY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gpCisgICAgOiBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPihfX3gpCisgICAgeyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZQorICAgIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1JvcGVfaXRlcmF0b3Iocm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fciwgc2l6ZV90IF9fcG9zKQorICAgIDogX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPihfX3IuX01fdHJlZV9wdHIsIF9fcG9zKSwKKyAgICAgIF9NX3Jvb3Rfcm9wZSgmX19yKQorICAgIHsgX1JvcGVSZXA6Ol9TX3JlZih0aGlzLT5fTV9yb290KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgc2l6ZV90CisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX2NoYXJfcHRyX2xlbihjb25zdCBfQ2hhclQqIF9fcykKKyAgICB7CisgICAgICBjb25zdCBfQ2hhclQqIF9fcCA9IF9fczsKKyAgICAgIAorICAgICAgd2hpbGUgKCFfU19pczAoKl9fcCkpCisJKytfX3A7CisgICAgICByZXR1cm4gKF9fcCAtIF9fcyk7CisgICAgfQorCisKKyNpZm5kZWYgX19HQworCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfTV9mcmVlX2Nfc3RyaW5nKCkKKyAgICB7CisgICAgICBfQ2hhclQqIF9fY3N0ciA9IF9NX2Nfc3RyaW5nOworICAgICAgaWYgKDAgIT0gX19jc3RyKQorCXsKKwkgIHNpemVfdCBfX3NpemUgPSB0aGlzLT5fTV9zaXplICsgMTsKKwkgIF9EZXN0cm95KF9fY3N0ciwgX19jc3RyICsgX19zaXplLCBfTV9nZXRfYWxsb2NhdG9yKCkpOworCSAgdGhpcy0+X0RhdGFfZGVhbGxvY2F0ZShfX2NzdHIsIF9fc2l6ZSk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1NfZnJlZV9zdHJpbmcoX0NoYXJUKiBfX3MsIHNpemVfdCBfX24sIGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgeworICAgICAgaWYgKCFfU19pc19iYXNpY19jaGFyX3R5cGUoKF9DaGFyVCopMCkpCisJX0Rlc3Ryb3koX19zLCBfX3MgKyBfX24sIF9fYSk7CisgICAgICAKKyAgICAgIC8vICBUaGlzIGhhcyB0byBiZSBhIHN0YXRpYyBtZW1iZXIsIHNvIHRoaXMgZ2V0cyBhIGJpdCBtZXNzeQorICAgICAgX19hLmRlYWxsb2NhdGUoX19zLAorCQkgICAgIF9Sb3BlX1JvcGVMZWFmPF9DaGFyVCwgX0FsbG9jPjo6X1Nfcm91bmRlZF91cF9zaXplKF9fbikpOworICAgIH0KKworICAvLyAgVGhlcmUgYXJlIHNldmVyYWwgcmVhc29ucyBmb3Igbm90IGRvaW5nIHRoaXMgd2l0aCB2aXJ0dWFsIGRlc3RydWN0b3JzCisgIC8vICBhbmQgYSBjbGFzcyBzcGVjaWZpYyBkZWxldGUgb3BlcmF0b3I6CisgIC8vICAtIEEgY2xhc3Mgc3BlY2lmaWMgZGVsZXRlIG9wZXJhdG9yIGNhbid0IGVhc2lseSBnZXQgYWNjZXNzIHRvCisgIC8vICAgIGFsbG9jYXRvciBpbnN0YW5jZXMgaWYgd2UgbmVlZCB0aGVtLgorICAvLyAgLSBBbnkgdmlydHVhbCBmdW5jdGlvbiB3b3VsZCBuZWVkIGEgNCBvciBieXRlIHZ0YWJsZSBwb2ludGVyOworICAvLyAgICB0aGlzIG9ubHkgcmVxdWlyZXMgYSBvbmUgYnl0ZSB0YWcgcGVyIG9iamVjdC4KKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX01fZnJlZV90cmVlKCkKKyAgICB7CisgICAgICBzd2l0Y2goX01fdGFnKQorCXsKKwljYXNlIF9fZGV0YWlsOjpfU19sZWFmOgorCSAgeworCSAgICBfUm9wZV9Sb3BlTGVhZjxfQ2hhclQsIF9BbGxvYz4qIF9fbAorCSAgICAgID0gKF9Sb3BlX1JvcGVMZWFmPF9DaGFyVCwgX0FsbG9jPiopdGhpczsKKwkgICAgX19sLT5fUm9wZV9Sb3BlTGVhZjxfQ2hhclQsIF9BbGxvYz46On5fUm9wZV9Sb3BlTGVhZigpOworCSAgICB0aGlzLT5fTF9kZWFsbG9jYXRlKF9fbCwgMSk7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgX19kZXRhaWw6Ol9TX2NvbmNhdDoKKwkgIHsKKwkgICAgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb248X0NoYXJULF9BbGxvYz4qIF9fYworCSAgICAgID0gKF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uPF9DaGFyVCwgX0FsbG9jPiopdGhpczsKKwkgICAgX19jLT5fUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjxfQ2hhclQsIF9BbGxvYz46OgorCSAgICAgIH5fUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbigpOworCSAgICB0aGlzLT5fQ19kZWFsbG9jYXRlKF9fYywgMSk7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgX19kZXRhaWw6Ol9TX2Z1bmN0aW9uOgorCSAgeworCSAgICBfUm9wZV9Sb3BlRnVuY3Rpb248X0NoYXJULCBfQWxsb2M+KiBfX2YKKwkgICAgICA9IChfUm9wZV9Sb3BlRnVuY3Rpb248X0NoYXJULCBfQWxsb2M+Kil0aGlzOworCSAgICBfX2YtPl9Sb3BlX1JvcGVGdW5jdGlvbjxfQ2hhclQsIF9BbGxvYz46On5fUm9wZV9Sb3BlRnVuY3Rpb24oKTsKKwkgICAgdGhpcy0+X0ZfZGVhbGxvY2F0ZShfX2YsIDEpOworCSAgICBicmVhazsKKwkgIH0KKwljYXNlIF9fZGV0YWlsOjpfU19zdWJzdHJpbmdmbjoKKwkgIHsKKwkgICAgX1JvcGVfUm9wZVN1YnN0cmluZzxfQ2hhclQsIF9BbGxvYz4qIF9fc3MgPQorCSAgICAgIChfUm9wZV9Sb3BlU3Vic3RyaW5nPF9DaGFyVCwgX0FsbG9jPiopdGhpczsKKwkgICAgX19zcy0+X1JvcGVfUm9wZVN1YnN0cmluZzxfQ2hhclQsIF9BbGxvYz46OgorCSAgICAgIH5fUm9wZV9Sb3BlU3Vic3RyaW5nKCk7CisJICAgIHRoaXMtPl9TX2RlYWxsb2NhdGUoX19zcywgMSk7CisJICAgIGJyZWFrOworCSAgfQorCX0KKyAgICB9CisjZWxzZQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19mcmVlX3N0cmluZyhjb25zdCBfQ2hhclQqLCBzaXplX3QsIGFsbG9jYXRvcl90eXBlKQorICAgIHsgfQorCisjZW5kaWYKKworICAvLyBDb25jYXRlbmF0ZSBhIEMgc3RyaW5nIG9udG8gYSBsZWFmIHJvcGUgYnkgY29weWluZyB0aGUgcm9wZSBkYXRhLgorICAvLyBVc2VkIGZvciBzaG9ydCByb3Blcy4KKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHR5cGVuYW1lIHJvcGU8X0NoYXJULCBfQWxsb2M+OjpfUm9wZUxlYWYqCisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX2xlYWZfY29uY2F0X2NoYXJfaXRlcihfUm9wZUxlYWYqIF9fciwgY29uc3QgX0NoYXJUKiBfX2l0ZXIsIHNpemVfdCBfX2xlbikKKyAgICB7CisgICAgICBzaXplX3QgX19vbGRfbGVuID0gX19yLT5fTV9zaXplOworICAgICAgX0NoYXJUKiBfX25ld19kYXRhID0gKF9DaGFyVCopCisJcm9wZTo6X0RhdGFfYWxsb2NhdGUoX1Nfcm91bmRlZF91cF9zaXplKF9fb2xkX2xlbiArIF9fbGVuKSk7CisgICAgICBfUm9wZUxlYWYqIF9fcmVzdWx0OworCisgICAgICB1bmluaXRpYWxpemVkX2NvcHlfbihfX3ItPl9NX2RhdGEsIF9fb2xkX2xlbiwgX19uZXdfZGF0YSk7CisgICAgICB1bmluaXRpYWxpemVkX2NvcHlfbihfX2l0ZXIsIF9fbGVuLCBfX25ld19kYXRhICsgX19vbGRfbGVuKTsKKyAgICAgIF9TX2NvbmRfc3RvcmVfZW9zKF9fbmV3X2RhdGFbX19vbGRfbGVuICsgX19sZW5dKTsKKyAgICAgIF9fdHJ5CisJeworCSAgX19yZXN1bHQgPSBfU19uZXdfUm9wZUxlYWYoX19uZXdfZGF0YSwgX19vbGRfbGVuICsgX19sZW4sCisJCQkJICAgICBfX3ItPl9NX2dldF9hbGxvY2F0b3IoKSk7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgX1JvcGVSZXA6Ol9fU1RMX0ZSRUVfU1RSSU5HKF9fbmV3X2RhdGEsIF9fb2xkX2xlbiArIF9fbGVuLAorCQkJCSAgICAgIF9fci0+X01fZ2V0X2FsbG9jYXRvcigpKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyNpZm5kZWYgX19HQworICAvLyBBcyBhYm92ZSwgYnV0IGl0J3MgT0sgdG8gY2xvYmJlciBvcmlnaW5hbCBpZiByZWZjb3VudCBpcyAxCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICB0eXBlbmFtZSByb3BlPF9DaGFyVCxfQWxsb2M+OjpfUm9wZUxlYWYqCisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX2Rlc3RyX2xlYWZfY29uY2F0X2NoYXJfaXRlcihfUm9wZUxlYWYqIF9fciwgY29uc3QgX0NoYXJUKiBfX2l0ZXIsCisJCQkJICAgc2l6ZV90IF9fbGVuKQorICAgIHsKKyAgICAgIGlmIChfX3ItPl9NX3JlZl9jb3VudCA+IDEpCisJcmV0dXJuIF9TX2xlYWZfY29uY2F0X2NoYXJfaXRlcihfX3IsIF9faXRlciwgX19sZW4pOworICAgICAgc2l6ZV90IF9fb2xkX2xlbiA9IF9fci0+X01fc2l6ZTsKKyAgICAgIGlmIChfU19hbGxvY2F0ZWRfY2FwYWNpdHkoX19vbGRfbGVuKSA+PSBfX29sZF9sZW4gKyBfX2xlbikKKwl7CisJICAvLyBUaGUgc3BhY2UgaGFzIGJlZW4gcGFydGlhbGx5IGluaXRpYWxpemVkIGZvciB0aGUgc3RhbmRhcmQKKwkgIC8vIGNoYXJhY3RlciB0eXBlcy4gIEJ1dCB0aGF0IGRvZXNuJ3QgbWF0dGVyIGZvciB0aG9zZSB0eXBlcy4KKwkgIHVuaW5pdGlhbGl6ZWRfY29weV9uKF9faXRlciwgX19sZW4sIF9fci0+X01fZGF0YSArIF9fb2xkX2xlbik7CisJICBpZiAoX1NfaXNfYmFzaWNfY2hhcl90eXBlKChfQ2hhclQqKTApKQorCSAgICBfU19jb25kX3N0b3JlX2VvcyhfX3ItPl9NX2RhdGFbX19vbGRfbGVuICsgX19sZW5dKTsKKwkgIGVsc2UgaWYgKF9fci0+X01fY19zdHJpbmcgIT0gX19yLT5fTV9kYXRhICYmIDAgIT0gX19yLT5fTV9jX3N0cmluZykKKwkgICAgeworCSAgICAgIF9fci0+X01fZnJlZV9jX3N0cmluZygpOworCSAgICAgIF9fci0+X01fY19zdHJpbmcgPSAwOworCSAgICB9CisJICBfX3ItPl9NX3NpemUgPSBfX29sZF9sZW4gKyBfX2xlbjsKKwkgIF9fci0+X01fcmVmX2NvdW50ID0gMjsKKwkgIHJldHVybiBfX3I7CisJfQorICAgICAgZWxzZQorCXsKKwkgIF9Sb3BlTGVhZiogX19yZXN1bHQgPSBfU19sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoX19yLCBfX2l0ZXIsIF9fbGVuKTsKKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisgICAgfQorI2VuZGlmCisKKyAgLy8gQXNzdW1lcyBsZWZ0IGFuZCByaWdodCBhcmUgbm90IDAuCisgIC8vIERvZXMgbm90IGluY3JlbWVudCAobm9yIGRlY3JlbWVudCBvbiBleGNlcHRpb24pIGNoaWxkIHJlZmVyZW5jZSBjb3VudHMuCisgIC8vIFJlc3VsdCBoYXMgcmVmIGNvdW50IDEuCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICB0eXBlbmFtZSByb3BlPF9DaGFyVCwgX0FsbG9jPjo6X1JvcGVSZXAqCisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX3RyZWVfY29uY2F0KF9Sb3BlUmVwKiBfX2xlZnQsIF9Sb3BlUmVwKiBfX3JpZ2h0KQorICAgIHsKKyAgICAgIF9Sb3BlQ29uY2F0ZW5hdGlvbiogX19yZXN1bHQgPSBfU19uZXdfUm9wZUNvbmNhdGVuYXRpb24oX19sZWZ0LCBfX3JpZ2h0LAorCQkJCQkJCSAgICAgIF9fbGVmdC0+CisJCQkJCQkJICAgICAgX01fZ2V0X2FsbG9jYXRvcigpKTsKKyAgICAgIHNpemVfdCBfX2RlcHRoID0gX19yZXN1bHQtPl9NX2RlcHRoOworICAgICAgCisgICAgICBpZiAoX19kZXB0aCA+IDIwCisJICAmJiAoX19yZXN1bHQtPl9NX3NpemUgPCAxMDAwCisJICAgICAgfHwgX19kZXB0aCA+IHNpemVfdChfX2RldGFpbDo6X1NfbWF4X3JvcGVfZGVwdGgpKSkKKwl7CisJICBfUm9wZVJlcCogX19iYWxhbmNlZDsKKworCSAgX190cnkKKwkgICAgeworCSAgICAgIF9fYmFsYW5jZWQgPSBfU19iYWxhbmNlKF9fcmVzdWx0KTsKKwkgICAgICBfX3Jlc3VsdC0+X01fdW5yZWZfbm9ubmlsKCk7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgcm9wZTo6X0NfZGVhbGxvY2F0ZShfX3Jlc3VsdCwxKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgLy8gSW4gY2FzZSBvZiBleGNlcHRpb24sIHdlIG5lZWQgdG8gZGVhbGxvY2F0ZQorCSAgLy8gb3RoZXJ3aXNlIGRhbmdsaW5nIHJlc3VsdCBub2RlLiAgQnV0IGNhbGxlcgorCSAgLy8gc3RpbGwgb3ducyBpdHMgY2hpbGRyZW4uICBUaHVzIHVucmVmIGlzCisJICAvLyBpbmFwcHJvcHJpYXRlLgorCSAgcmV0dXJuIF9fYmFsYW5jZWQ7CisJfQorICAgICAgZWxzZQorCXJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHR5cGVuYW1lIHJvcGU8X0NoYXJULCBfQWxsb2M+OjpfUm9wZVJlcCoKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1NfY29uY2F0X2NoYXJfaXRlcihfUm9wZVJlcCogX19yLCBjb25zdCBfQ2hhclQqX19zLCBzaXplX3QgX19zbGVuKQorICAgIHsKKyAgICAgIF9Sb3BlUmVwKiBfX3Jlc3VsdDsKKyAgICAgIGlmICgwID09IF9fc2xlbikKKwl7CisJICBfU19yZWYoX19yKTsKKwkgIHJldHVybiBfX3I7CisJfQorICAgICAgaWYgKDAgPT0gX19yKQorCXJldHVybiBfX1NUTF9ST1BFX0ZST01fVU5PV05FRF9DSEFSX1BUUihfX3MsIF9fc2xlbiwKKwkJCQkJCV9fci0+X01fZ2V0X2FsbG9jYXRvcigpKTsKKyAgICAgIGlmIChfX3ItPl9NX3RhZyA9PSBfX2RldGFpbDo6X1NfbGVhZgorCSAgJiYgX19yLT5fTV9zaXplICsgX19zbGVuIDw9IHNpemVfdChfU19jb3B5X21heCkpCisJeworCSAgX19yZXN1bHQgPSBfU19sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoKF9Sb3BlTGVhZiopX19yLCBfX3MsIF9fc2xlbik7CisJICByZXR1cm4gX19yZXN1bHQ7CisJfQorICAgICAgaWYgKF9fZGV0YWlsOjpfU19jb25jYXQgPT0gX19yLT5fTV90YWcKKwkgICYmIF9fZGV0YWlsOjpfU19sZWFmID09ICgoX1JvcGVDb25jYXRlbmF0aW9uKikgX19yKS0+X01fcmlnaHQtPl9NX3RhZykKKwl7CisJICBfUm9wZUxlYWYqIF9fcmlnaHQgPQorCSAgICAoX1JvcGVMZWFmKiApKCgoX1JvcGVDb25jYXRlbmF0aW9uKiApX19yKS0+X01fcmlnaHQpOworCSAgaWYgKF9fcmlnaHQtPl9NX3NpemUgKyBfX3NsZW4gPD0gc2l6ZV90KF9TX2NvcHlfbWF4KSkKKwkgICAgeworCSAgICAgIF9Sb3BlUmVwKiBfX2xlZnQgPSAoKF9Sb3BlQ29uY2F0ZW5hdGlvbiopX19yKS0+X01fbGVmdDsKKwkgICAgICBfUm9wZVJlcCogX19ucmlnaHQgPQorCQlfU19sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoKF9Sb3BlTGVhZiopX19yaWdodCwgX19zLCBfX3NsZW4pOworCSAgICAgIF9fbGVmdC0+X01fcmVmX25vbm5pbCgpOworCSAgICAgIF9fdHJ5CisJCXsgX19yZXN1bHQgPSBfU190cmVlX2NvbmNhdChfX2xlZnQsIF9fbnJpZ2h0KTsgfQorCSAgICAgIF9fY2F0Y2goLi4uKQorCQl7CisJCSAgX1NfdW5yZWYoX19sZWZ0KTsKKwkJICBfU191bnJlZihfX25yaWdodCk7CisJCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJCX0KKwkgICAgICByZXR1cm4gX19yZXN1bHQ7CisJICAgIH0KKwl9CisgICAgICBfUm9wZVJlcCogX19ucmlnaHQgPQorCV9fU1RMX1JPUEVfRlJPTV9VTk9XTkVEX0NIQVJfUFRSKF9fcywgX19zbGVuLCBfX3ItPl9NX2dldF9hbGxvY2F0b3IoKSk7CisgICAgICBfX3RyeQorCXsKKwkgIF9fci0+X01fcmVmX25vbm5pbCgpOworCSAgX19yZXN1bHQgPSBfU190cmVlX2NvbmNhdChfX3IsIF9fbnJpZ2h0KTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBfU191bnJlZihfX3IpOworCSAgX1NfdW5yZWYoX19ucmlnaHQpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworI2lmbmRlZiBfX0dDCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICB0eXBlbmFtZSByb3BlPF9DaGFyVCxfQWxsb2M+OjpfUm9wZVJlcCoKKyAgICByb3BlPF9DaGFyVCxfQWxsb2M+OjoKKyAgICBfU19kZXN0cl9jb25jYXRfY2hhcl9pdGVyKF9Sb3BlUmVwKiBfX3IsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3QgX19zbGVuKQorICAgIHsKKyAgICAgIF9Sb3BlUmVwKiBfX3Jlc3VsdDsKKyAgICAgIGlmICgwID09IF9fcikKKwlyZXR1cm4gX19TVExfUk9QRV9GUk9NX1VOT1dORURfQ0hBUl9QVFIoX19zLCBfX3NsZW4sCisJCQkJCQlfX3ItPl9NX2dldF9hbGxvY2F0b3IoKSk7CisgICAgICBzaXplX3QgX19jb3VudCA9IF9fci0+X01fcmVmX2NvdW50OworICAgICAgc2l6ZV90IF9fb3JpZ19zaXplID0gX19yLT5fTV9zaXplOworICAgICAgaWYgKF9fY291bnQgPiAxKQorCXJldHVybiBfU19jb25jYXRfY2hhcl9pdGVyKF9fciwgX19zLCBfX3NsZW4pOworICAgICAgaWYgKDAgPT0gX19zbGVuKQorCXsKKwkgIF9fci0+X01fcmVmX2NvdW50ID0gMjsgICAgICAvLyBPbmUgbW9yZSB0aGFuIGJlZm9yZQorCSAgcmV0dXJuIF9fcjsKKwl9CisgICAgICBpZiAoX19vcmlnX3NpemUgKyBfX3NsZW4gPD0gc2l6ZV90KF9TX2NvcHlfbWF4KQorCSAgJiYgX19kZXRhaWw6Ol9TX2xlYWYgPT0gX19yLT5fTV90YWcpCisJeworCSAgX19yZXN1bHQgPSBfU19kZXN0cl9sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoKF9Sb3BlTGVhZiopX19yLCBfX3MsIAorCQkJCQkJICAgIF9fc2xlbik7CisJICByZXR1cm4gX19yZXN1bHQ7CisJfQorICAgICAgaWYgKF9fZGV0YWlsOjpfU19jb25jYXQgPT0gX19yLT5fTV90YWcpCisJeworCSAgX1JvcGVMZWFmKiBfX3JpZ2h0ID0gKF9Sb3BlTGVhZiopKCgoX1JvcGVDb25jYXRlbmF0aW9uKikKKwkJCQkJICAgICBfX3IpLT5fTV9yaWdodCk7CisJICBpZiAoX19kZXRhaWw6Ol9TX2xlYWYgPT0gX19yaWdodC0+X01fdGFnCisJICAgICAgJiYgX19yaWdodC0+X01fc2l6ZSArIF9fc2xlbiA8PSBzaXplX3QoX1NfY29weV9tYXgpKQorCSAgICB7CisJICAgICAgX1JvcGVSZXAqIF9fbmV3X3JpZ2h0ID0KKwkJX1NfZGVzdHJfbGVhZl9jb25jYXRfY2hhcl9pdGVyKF9fcmlnaHQsIF9fcywgX19zbGVuKTsKKwkgICAgICBpZiAoX19yaWdodCA9PSBfX25ld19yaWdodCkKKwkJX19uZXdfcmlnaHQtPl9NX3JlZl9jb3VudCA9IDE7CisJICAgICAgZWxzZQorCQlfX3JpZ2h0LT5fTV91bnJlZl9ub25uaWwoKTsKKwkgICAgICBfX3ItPl9NX3JlZl9jb3VudCA9IDI7ICAgIC8vIE9uZSBtb3JlIHRoYW4gYmVmb3JlLgorCSAgICAgICgoX1JvcGVDb25jYXRlbmF0aW9uKilfX3IpLT5fTV9yaWdodCA9IF9fbmV3X3JpZ2h0OworCSAgICAgIF9fci0+X01fc2l6ZSA9IF9fb3JpZ19zaXplICsgX19zbGVuOworCSAgICAgIGlmICgwICE9IF9fci0+X01fY19zdHJpbmcpCisJCXsKKwkJICBfX3ItPl9NX2ZyZWVfY19zdHJpbmcoKTsKKwkJICBfX3ItPl9NX2Nfc3RyaW5nID0gMDsKKwkJfQorCSAgICAgIHJldHVybiBfX3I7CisJICAgIH0KKwl9CisgICAgICBfUm9wZVJlcCogX19yaWdodCA9CisJX19TVExfUk9QRV9GUk9NX1VOT1dORURfQ0hBUl9QVFIoX19zLCBfX3NsZW4sIF9fci0+X01fZ2V0X2FsbG9jYXRvcigpKTsKKyAgICAgIF9fci0+X01fcmVmX25vbm5pbCgpOworICAgICAgX190cnkKKwl7IF9fcmVzdWx0ID0gX1NfdHJlZV9jb25jYXQoX19yLCBfX3JpZ2h0KTsgfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgX1NfdW5yZWYoX19yKTsKKwkgIF9TX3VucmVmKF9fcmlnaHQpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKyNlbmRpZiAvKiAhX19HQyAqLworICAKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHR5cGVuYW1lIHJvcGU8X0NoYXJULCBfQWxsb2M+OjpfUm9wZVJlcCoKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1NfY29uY2F0KF9Sb3BlUmVwKiBfX2xlZnQsIF9Sb3BlUmVwKiBfX3JpZ2h0KQorICAgIHsKKyAgICAgIGlmICgwID09IF9fbGVmdCkKKwl7CisJICBfU19yZWYoX19yaWdodCk7CisJICByZXR1cm4gX19yaWdodDsKKwl9CisgICAgICBpZiAoMCA9PSBfX3JpZ2h0KQorCXsKKwkgIF9fbGVmdC0+X01fcmVmX25vbm5pbCgpOworCSAgcmV0dXJuIF9fbGVmdDsKKwl9CisgICAgICBpZiAoX19kZXRhaWw6Ol9TX2xlYWYgPT0gX19yaWdodC0+X01fdGFnKQorCXsKKwkgIGlmIChfX2RldGFpbDo6X1NfbGVhZiA9PSBfX2xlZnQtPl9NX3RhZykKKwkgICAgeworCSAgICAgIGlmIChfX3JpZ2h0LT5fTV9zaXplICsgX19sZWZ0LT5fTV9zaXplIDw9IHNpemVfdChfU19jb3B5X21heCkpCisJCXJldHVybiBfU19sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoKF9Sb3BlTGVhZiopX19sZWZ0LAorCQkJCQkJKChfUm9wZUxlYWYqKV9fcmlnaHQpLT5fTV9kYXRhLAorCQkJCQkJX19yaWdodC0+X01fc2l6ZSk7CisJICAgIH0KKwkgIGVsc2UgaWYgKF9fZGV0YWlsOjpfU19jb25jYXQgPT0gX19sZWZ0LT5fTV90YWcKKwkJICAgJiYgX19kZXRhaWw6Ol9TX2xlYWYgPT0gKChfUm9wZUNvbmNhdGVuYXRpb24qKQorCQkJCQkJICAgX19sZWZ0KS0+X01fcmlnaHQtPl9NX3RhZykKKwkgICAgeworCSAgICAgIF9Sb3BlTGVhZiogX19sZWZ0cmlnaHQgPQorCQkoX1JvcGVMZWFmKikoKChfUm9wZUNvbmNhdGVuYXRpb24qKV9fbGVmdCktPl9NX3JpZ2h0KTsKKwkgICAgICBpZiAoX19sZWZ0cmlnaHQtPl9NX3NpemUKKwkJICArIF9fcmlnaHQtPl9NX3NpemUgPD0gc2l6ZV90KF9TX2NvcHlfbWF4KSkKKwkJeworCQkgIF9Sb3BlUmVwKiBfX2xlZnRsZWZ0ID0gKChfUm9wZUNvbmNhdGVuYXRpb24qKV9fbGVmdCktPl9NX2xlZnQ7CisJCSAgX1JvcGVSZXAqIF9fcmVzdCA9IF9TX2xlYWZfY29uY2F0X2NoYXJfaXRlcihfX2xlZnRyaWdodCwKKwkJCQkJCQkgICAgICAoKF9Sb3BlTGVhZiopCisJCQkJCQkJICAgICAgIF9fcmlnaHQpLT4KKwkJCQkJCQkgICAgICBfTV9kYXRhLAorCQkJCQkJCSAgICAgIF9fcmlnaHQtPl9NX3NpemUpOworCQkgIF9fbGVmdGxlZnQtPl9NX3JlZl9ub25uaWwoKTsKKwkJICBfX3RyeQorCQkgICAgeyByZXR1cm4oX1NfdHJlZV9jb25jYXQoX19sZWZ0bGVmdCwgX19yZXN0KSk7IH0KKwkJICBfX2NhdGNoKC4uLikKKwkJICAgIHsKKwkJICAgICAgX1NfdW5yZWYoX19sZWZ0bGVmdCk7CisJCSAgICAgIF9TX3VucmVmKF9fcmVzdCk7CisJCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgICBfX2xlZnQtPl9NX3JlZl9ub25uaWwoKTsKKyAgICAgIF9fcmlnaHQtPl9NX3JlZl9ub25uaWwoKTsKKyAgICAgIF9fdHJ5CisJeyByZXR1cm4oX1NfdHJlZV9jb25jYXQoX19sZWZ0LCBfX3JpZ2h0KSk7IH0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIF9TX3VucmVmKF9fbGVmdCk7CisJICBfU191bnJlZihfX3JpZ2h0KTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHR5cGVuYW1lIHJvcGU8X0NoYXJULCBfQWxsb2M+OjpfUm9wZVJlcCoKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1Nfc3Vic3RyaW5nKF9Sb3BlUmVwKiBfX2Jhc2UsIHNpemVfdCBfX3N0YXJ0LCBzaXplX3QgX19lbmRwMSkKKyAgICB7CisgICAgICBpZiAoMCA9PSBfX2Jhc2UpCisJcmV0dXJuIDA7CisgICAgICBzaXplX3QgX19sZW4gPSBfX2Jhc2UtPl9NX3NpemU7CisgICAgICBzaXplX3QgX19hZGpfZW5kcDE7CisgICAgICBjb25zdCBzaXplX3QgX19sYXp5X3RocmVzaG9sZCA9IDEyODsKKyAgICAgIAorICAgICAgaWYgKF9fZW5kcDEgPj0gX19sZW4pCisJeworCSAgaWYgKDAgPT0gX19zdGFydCkKKwkgICAgeworCSAgICAgIF9fYmFzZS0+X01fcmVmX25vbm5pbCgpOworCSAgICAgIHJldHVybiBfX2Jhc2U7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgX19hZGpfZW5kcDEgPSBfX2xlbjsKKwkgIAorCX0KKyAgICAgIGVsc2UKKwlfX2Fkal9lbmRwMSA9IF9fZW5kcDE7CisKKyAgICAgIHN3aXRjaChfX2Jhc2UtPl9NX3RhZykKKwl7CisJY2FzZSBfX2RldGFpbDo6X1NfY29uY2F0OgorCSAgICB7CisJICAgICAgX1JvcGVDb25jYXRlbmF0aW9uKiBfX2MgPSAoX1JvcGVDb25jYXRlbmF0aW9uKilfX2Jhc2U7CisJICAgICAgX1JvcGVSZXAqIF9fbGVmdCA9IF9fYy0+X01fbGVmdDsKKwkgICAgICBfUm9wZVJlcCogX19yaWdodCA9IF9fYy0+X01fcmlnaHQ7CisJICAgICAgc2l6ZV90IF9fbGVmdF9sZW4gPSBfX2xlZnQtPl9NX3NpemU7CisJICAgICAgX1JvcGVSZXAqIF9fcmVzdWx0OworCSAgICAgIAorCSAgICAgIGlmIChfX2Fkal9lbmRwMSA8PSBfX2xlZnRfbGVuKQorCQlyZXR1cm4gX1Nfc3Vic3RyaW5nKF9fbGVmdCwgX19zdGFydCwgX19lbmRwMSk7CisJICAgICAgZWxzZSBpZiAoX19zdGFydCA+PSBfX2xlZnRfbGVuKQorCQlyZXR1cm4gX1Nfc3Vic3RyaW5nKF9fcmlnaHQsIF9fc3RhcnQgLSBfX2xlZnRfbGVuLAorCQkJCSAgICBfX2Fkal9lbmRwMSAtIF9fbGVmdF9sZW4pOworCSAgICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX2xlZnRfcmVzdWx0KF9TX3N1YnN0cmluZyhfX2xlZnQsCisJCQkJCQkJICAgIF9fc3RhcnQsCisJCQkJCQkJICAgIF9fbGVmdF9sZW4pKTsKKwkgICAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19yaWdodF9yZXN1bHQoX1Nfc3Vic3RyaW5nKF9fcmlnaHQsIDAsCisJCQkJCQkJICAgICBfX2VuZHAxIAorCQkJCQkJCSAgICAgLSBfX2xlZnRfbGVuKSk7CisJICAgICAgX19yZXN1bHQgPSBfU19jb25jYXQoX19sZWZ0X3Jlc3VsdCwgX19yaWdodF9yZXN1bHQpOworCSAgICAgIHJldHVybiBfX3Jlc3VsdDsKKwkgICAgfQorCWNhc2UgX19kZXRhaWw6Ol9TX2xlYWY6CisJICB7CisJICAgIF9Sb3BlTGVhZiogX19sID0gKF9Sb3BlTGVhZiopX19iYXNlOworCSAgICBfUm9wZUxlYWYqIF9fcmVzdWx0OworCSAgICBzaXplX3QgX19yZXN1bHRfbGVuOworCSAgICBpZiAoX19zdGFydCA+PSBfX2Fkal9lbmRwMSkKKwkgICAgICByZXR1cm4gMDsKKwkgICAgX19yZXN1bHRfbGVuID0gX19hZGpfZW5kcDEgLSBfX3N0YXJ0OworCSAgICBpZiAoX19yZXN1bHRfbGVuID4gX19sYXp5X3RocmVzaG9sZCkKKwkgICAgICBnb3RvIGxhenk7CisjaWZkZWYgX19HQworCSAgICBjb25zdCBfQ2hhclQqIF9fc2VjdGlvbiA9IF9fbC0+X01fZGF0YSArIF9fc3RhcnQ7CisJICAgIF9fcmVzdWx0ID0gX1NfbmV3X1JvcGVMZWFmKF9fc2VjdGlvbiwgX19yZXN1bHRfbGVuLAorCQkJCSAgICAgICBfX2Jhc2UtPl9NX2dldF9hbGxvY2F0b3IoKSk7CisJICAgIF9fcmVzdWx0LT5fTV9jX3N0cmluZyA9IDA7ICAvLyBOb3QgZW9zIHRlcm1pbmF0ZWQuCisjZWxzZQorCSAgICAvLyBXZSBzaG91bGQgc29tZXRpbWVzIGNyZWF0ZSBzdWJzdHJpbmcgbm9kZSBpbnN0ZWFkLgorCSAgICBfX3Jlc3VsdCA9IF9fU1RMX1JPUEVfRlJPTV9VTk9XTkVEX0NIQVJfUFRSKF9fbC0+X01fZGF0YSArIF9fc3RhcnQsCisJCQkJCQkJX19yZXN1bHRfbGVuLAorCQkJCQkJCV9fYmFzZS0+CisJCQkJCQkJX01fZ2V0X2FsbG9jYXRvcigpKTsKKyNlbmRpZgorCSAgICByZXR1cm4gX19yZXN1bHQ7CisJICB9CisJY2FzZSBfX2RldGFpbDo6X1Nfc3Vic3RyaW5nZm46CisJICAvLyBBdm9pZCBpbnRyb2R1Y2luZyBtdWx0aXBsZSBsYXllcnMgb2Ygc3Vic3RyaW5nIG5vZGVzLgorCSAgeworCSAgICBfUm9wZVN1YnN0cmluZyogX19vbGQgPSAoX1JvcGVTdWJzdHJpbmcqKV9fYmFzZTsKKwkgICAgc2l6ZV90IF9fcmVzdWx0X2xlbjsKKwkgICAgaWYgKF9fc3RhcnQgPj0gX19hZGpfZW5kcDEpCisJICAgICAgcmV0dXJuIDA7CisJICAgIF9fcmVzdWx0X2xlbiA9IF9fYWRqX2VuZHAxIC0gX19zdGFydDsKKwkgICAgaWYgKF9fcmVzdWx0X2xlbiA+IF9fbGF6eV90aHJlc2hvbGQpCisJICAgICAgeworCQlfUm9wZVN1YnN0cmluZyogX19yZXN1bHQgPQorCQkgIF9TX25ld19Sb3BlU3Vic3RyaW5nKF9fb2xkLT5fTV9iYXNlLAorCQkJCSAgICAgICBfX3N0YXJ0ICsgX19vbGQtPl9NX3N0YXJ0LAorCQkJCSAgICAgICBfX2Fkal9lbmRwMSAtIF9fc3RhcnQsCisJCQkJICAgICAgIF9fYmFzZS0+X01fZ2V0X2FsbG9jYXRvcigpKTsKKwkJcmV0dXJuIF9fcmVzdWx0OworCQkKKwkgICAgICB9IC8vICoqKiBlbHNlIGZhbGwgdGhyb3VnaDogKioqCisJICB9CisJY2FzZSBfX2RldGFpbDo6X1NfZnVuY3Rpb246CisJICB7CisJICAgIF9Sb3BlRnVuY3Rpb24qIF9fZiA9IChfUm9wZUZ1bmN0aW9uKilfX2Jhc2U7CisJICAgIF9DaGFyVCogX19zZWN0aW9uOworCSAgICBzaXplX3QgX19yZXN1bHRfbGVuOworCSAgICBpZiAoX19zdGFydCA+PSBfX2Fkal9lbmRwMSkKKwkgICAgICByZXR1cm4gMDsKKwkgICAgX19yZXN1bHRfbGVuID0gX19hZGpfZW5kcDEgLSBfX3N0YXJ0OworCSAgICAKKwkgICAgaWYgKF9fcmVzdWx0X2xlbiA+IF9fbGF6eV90aHJlc2hvbGQpCisJICAgICAgZ290byBsYXp5OworCSAgICBfX3NlY3Rpb24gPSAoX0NoYXJUKikKKwkgICAgICByb3BlOjpfRGF0YV9hbGxvY2F0ZShfU19yb3VuZGVkX3VwX3NpemUoX19yZXN1bHRfbGVuKSk7CisJICAgIF9fdHJ5CisJICAgICAgewkoKihfX2YtPl9NX2ZuKSkoX19zdGFydCwgX19yZXN1bHRfbGVuLCBfX3NlY3Rpb24pOyB9CisJICAgIF9fY2F0Y2goLi4uKQorCSAgICAgIHsKKwkJX1JvcGVSZXA6Ol9fU1RMX0ZSRUVfU1RSSU5HKF9fc2VjdGlvbiwgX19yZXN1bHRfbGVuLAorCQkJCQkgICAgX19iYXNlLT5fTV9nZXRfYWxsb2NhdG9yKCkpOworCQlfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgICB9CisJICAgIF9TX2NvbmRfc3RvcmVfZW9zKF9fc2VjdGlvbltfX3Jlc3VsdF9sZW5dKTsKKwkgICAgcmV0dXJuIF9TX25ld19Sb3BlTGVhZihfX3NlY3Rpb24sIF9fcmVzdWx0X2xlbiwKKwkJCQkgICBfX2Jhc2UtPl9NX2dldF9hbGxvY2F0b3IoKSk7CisJICB9CisJfQorICAgIGxhenk6CisgICAgICB7CisJLy8gQ3JlYXRlIHN1YnN0cmluZyBub2RlLgorCXJldHVybiBfU19uZXdfUm9wZVN1YnN0cmluZyhfX2Jhc2UsIF9fc3RhcnQsIF9fYWRqX2VuZHAxIC0gX19zdGFydCwKKwkJCQkgICAgX19iYXNlLT5fTV9nZXRfYWxsb2NhdG9yKCkpOworICAgICAgfQorICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQ+CisgICAgY2xhc3MgX1JvcGVfZmxhdHRlbl9jaGFyX2NvbnN1bWVyCisgICAgOiBwdWJsaWMgX1JvcGVfY2hhcl9jb25zdW1lcjxfQ2hhclQ+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICBfQ2hhclQqIF9NX2J1Zl9wdHI7CisgICAgcHVibGljOgorICAgICAgCisgICAgICBfUm9wZV9mbGF0dGVuX2NoYXJfY29uc3VtZXIoX0NoYXJUKiBfX2J1ZmZlcikKKyAgICAgIHsgX01fYnVmX3B0ciA9IF9fYnVmZmVyOyB9OworCisgICAgICB+X1JvcGVfZmxhdHRlbl9jaGFyX2NvbnN1bWVyKCkge30KKyAgICAgIAorICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfQ2hhclQqIF9fbGVhZiwgc2l6ZV90IF9fbikKKyAgICAgIHsKKwl1bmluaXRpYWxpemVkX2NvcHlfbihfX2xlYWYsIF9fbiwgX01fYnVmX3B0cik7CisJX01fYnVmX3B0ciArPSBfX247CisJcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQ+CisgICAgY2xhc3MgX1JvcGVfZmluZF9jaGFyX2NoYXJfY29uc3VtZXIKKyAgICA6IHB1YmxpYyBfUm9wZV9jaGFyX2NvbnN1bWVyPF9DaGFyVD4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIF9DaGFyVCBfTV9wYXR0ZXJuOworICAgIHB1YmxpYzoKKyAgICAgIHNpemVfdCBfTV9jb3VudDsgIC8vIE51bWJlciBvZiBub25tYXRjaGluZyBjaGFyYWN0ZXJzCisgICAgICAKKyAgICAgIF9Sb3BlX2ZpbmRfY2hhcl9jaGFyX2NvbnN1bWVyKF9DaGFyVCBfX3ApCisgICAgICA6IF9NX3BhdHRlcm4oX19wKSwgX01fY291bnQoMCkge30KKwkKKyAgICAgIH5fUm9wZV9maW5kX2NoYXJfY2hhcl9jb25zdW1lcigpIHt9CisgICAgICAKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0NoYXJUKiBfX2xlYWYsIHNpemVfdCBfX24pCisgICAgICB7CisJc2l6ZV90IF9faTsKKwlmb3IgKF9faSA9IDA7IF9faSA8IF9fbjsgX19pKyspCisJICB7CisJICAgIGlmIChfX2xlYWZbX19pXSA9PSBfTV9wYXR0ZXJuKQorCSAgICAgIHsKKwkJX01fY291bnQgKz0gX19pOworCQlyZXR1cm4gZmFsc2U7CisJICAgICAgfQorCSAgfQorCV9NX2NvdW50ICs9IF9fbjsgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisgIC8vIEhlcmUgX0NoYXJUIGlzIGJvdGggdGhlIHN0cmVhbSBhbmQgcm9wZSBjaGFyYWN0ZXIgdHlwZS4KKyAgICBjbGFzcyBfUm9wZV9pbnNlcnRfY2hhcl9jb25zdW1lcgorICAgIDogcHVibGljIF9Sb3BlX2NoYXJfY29uc3VtZXI8X0NoYXJUPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBiYXNpY19vc3RyZWFtPF9DaGFyVCxfVHJhaXRzPiBfSW5zZXJ0X29zdHJlYW07CisgICAgICBfSW5zZXJ0X29zdHJlYW0mIF9NX287CisgICAgcHVibGljOgorICAgICAgX1JvcGVfaW5zZXJ0X2NoYXJfY29uc3VtZXIoX0luc2VydF9vc3RyZWFtJiBfX3dyaXRlcikKKwk6IF9NX28oX193cml0ZXIpIHt9OworICAgICAgfl9Sb3BlX2luc2VydF9jaGFyX2NvbnN1bWVyKCkgeyB9OworICAgICAgLy8gQ2FsbGVyIGlzIHByZXN1bWVkIHRvIG93biB0aGUgb3N0cmVhbQorICAgICAgYm9vbCBvcGVyYXRvcigpIChjb25zdCBfQ2hhclQqIF9fbGVhZiwgc2l6ZV90IF9fbik7CisgICAgICAvLyBSZXR1cm5zIHRydWUgdG8gY29udGludWUgdHJhdmVyc2FsLgorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorICAgIGJvb2wKKyAgICBfUm9wZV9pbnNlcnRfY2hhcl9jb25zdW1lcjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBvcGVyYXRvcigpKGNvbnN0IF9DaGFyVCogX19sZWFmLCBzaXplX3QgX19uKQorICAgIHsKKyAgICAgIHNpemVfdCBfX2k7CisgICAgICAvLyAgV2UgYXNzdW1lIHRoYXQgZm9ybWF0dGluZyBpcyBzZXQgdXAgY29ycmVjdGx5IGZvciBlYWNoIGVsZW1lbnQuCisgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fbjsgX19pKyspCisJX01fby5wdXQoX19sZWFmW19faV0pOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBib29sCisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX2FwcGx5X3RvX3BpZWNlcyhfUm9wZV9jaGFyX2NvbnN1bWVyPF9DaGFyVD4mIF9fYywKKwkJICAgICAgIGNvbnN0IF9Sb3BlUmVwKiBfX3IsIHNpemVfdCBfX2JlZ2luLCBzaXplX3QgX19lbmQpCisgICAgeworICAgICAgaWYgKDAgPT0gX19yKQorCXJldHVybiB0cnVlOworICAgICAgc3dpdGNoKF9fci0+X01fdGFnKQorCXsKKwljYXNlIF9fZGV0YWlsOjpfU19jb25jYXQ6CisJICB7CisJICAgIF9Sb3BlQ29uY2F0ZW5hdGlvbiogX19jb25jID0gKF9Sb3BlQ29uY2F0ZW5hdGlvbiopX19yOworCSAgICBfUm9wZVJlcCogX19sZWZ0ID0gIF9fY29uYy0+X01fbGVmdDsKKwkgICAgc2l6ZV90IF9fbGVmdF9sZW4gPSBfX2xlZnQtPl9NX3NpemU7CisJICAgIGlmIChfX2JlZ2luIDwgX19sZWZ0X2xlbikKKwkgICAgICB7CisJCXNpemVfdCBfX2xlZnRfZW5kID0gc3RkOjptaW4oX19sZWZ0X2xlbiwgX19lbmQpOworCQlpZiAoIV9TX2FwcGx5X3RvX3BpZWNlcyhfX2MsIF9fbGVmdCwgX19iZWdpbiwgX19sZWZ0X2VuZCkpCisJCSAgcmV0dXJuIGZhbHNlOworCSAgICAgIH0KKwkgICAgaWYgKF9fZW5kID4gX19sZWZ0X2xlbikKKwkgICAgICB7CisJCV9Sb3BlUmVwKiBfX3JpZ2h0ID0gIF9fY29uYy0+X01fcmlnaHQ7CisJCXNpemVfdCBfX3JpZ2h0X3N0YXJ0ID0gc3RkOjptYXgoX19sZWZ0X2xlbiwgX19iZWdpbik7CisJCWlmICghX1NfYXBwbHlfdG9fcGllY2VzKF9fYywgX19yaWdodCwKKwkJCQkJX19yaWdodF9zdGFydCAtIF9fbGVmdF9sZW4sCisJCQkJCV9fZW5kIC0gX19sZWZ0X2xlbikpCisJCSAgcmV0dXJuIGZhbHNlOworCSAgICAgIH0KKwkgIH0KKwkgIHJldHVybiB0cnVlOworCWNhc2UgX19kZXRhaWw6Ol9TX2xlYWY6CisJICB7CisJICAgIF9Sb3BlTGVhZiogX19sID0gKF9Sb3BlTGVhZiopX19yOworCSAgICByZXR1cm4gX19jKF9fbC0+X01fZGF0YSArIF9fYmVnaW4sIF9fZW5kIC0gX19iZWdpbik7CisJICB9CisJY2FzZSBfX2RldGFpbDo6X1NfZnVuY3Rpb246CisJY2FzZSBfX2RldGFpbDo6X1Nfc3Vic3RyaW5nZm46CisJICAgIHsKKwkgICAgICBfUm9wZUZ1bmN0aW9uKiBfX2YgPSAoX1JvcGVGdW5jdGlvbiopX19yOworCSAgICAgIHNpemVfdCBfX2xlbiA9IF9fZW5kIC0gX19iZWdpbjsKKwkgICAgICBib29sIF9fcmVzdWx0OworCSAgICAgIF9DaGFyVCogX19idWZmZXIgPQorCQkoX0NoYXJUKilfQWxsb2MoKS5hbGxvY2F0ZShfX2xlbiAqIHNpemVvZihfQ2hhclQpKTsKKwkgICAgICBfX3RyeQorCQl7CisJCSAgKCooX19mLT5fTV9mbikpKF9fYmVnaW4sIF9fbGVuLCBfX2J1ZmZlcik7CisJCSAgX19yZXN1bHQgPSBfX2MoX19idWZmZXIsIF9fbGVuKTsKKyAgICAgICAgICAgICAgICAgIF9BbGxvYygpLmRlYWxsb2NhdGUoX19idWZmZXIsIF9fbGVuICogc2l6ZW9mKF9DaGFyVCkpOworICAgICAgICAgICAgICAgIH0KKwkgICAgICBfX2NhdGNoKC4uLikKKwkJeworCQkgIF9BbGxvYygpLmRlYWxsb2NhdGUoX19idWZmZXIsIF9fbGVuICogc2l6ZW9mKF9DaGFyVCkpOworCQkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCQl9CisJICAgICAgcmV0dXJuIF9fcmVzdWx0OworCSAgICB9CisJZGVmYXVsdDoKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9Sb3BlX2ZpbGwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX28sIHNpemVfdCBfX24pCisgICAgeworICAgICAgY2hhciBfX2YgPSBfX28uZmlsbCgpOworICAgICAgc2l6ZV90IF9faTsKKyAgICAgIAorICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX247IF9faSsrKQorCV9fby5wdXQoX19mKTsKKyAgICB9CisKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorICAgIGlubGluZSBib29sCisgICAgX1JvcGVfaXNfc2ltcGxlKF9DaGFyVCopCisgICAgeyByZXR1cm4gZmFsc2U7IH0KKworICBpbmxpbmUgYm9vbAorICBfUm9wZV9pc19zaW1wbGUoY2hhciopCisgIHsgcmV0dXJuIHRydWU7IH0KKworICBpbmxpbmUgYm9vbAorICBfUm9wZV9pc19zaW1wbGUod2NoYXJfdCopCisgIHsgcmV0dXJuIHRydWU7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fbywKKwkgICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fcikKKyAgICB7CisgICAgICBzaXplX3QgX193ID0gX19vLndpZHRoKCk7CisgICAgICBib29sIF9fbGVmdCA9IGJvb2woX19vLmZsYWdzKCkgJiBzdGQ6Omlvczo6bGVmdCk7CisgICAgICBzaXplX3QgX19wYWRfbGVuOworICAgICAgc2l6ZV90IF9fcm9wZV9sZW4gPSBfX3Iuc2l6ZSgpOworICAgICAgX1JvcGVfaW5zZXJ0X2NoYXJfY29uc3VtZXI8X0NoYXJULCBfVHJhaXRzPiBfX2MoX19vKTsKKyAgICAgIGJvb2wgX19pc19zaW1wbGUgPSBfUm9wZV9pc19zaW1wbGUoKF9DaGFyVCopMCk7CisgICAgICAKKyAgICAgIGlmIChfX3JvcGVfbGVuIDwgX193KQorCV9fcGFkX2xlbiA9IF9fdyAtIF9fcm9wZV9sZW47CisgICAgICBlbHNlCisJX19wYWRfbGVuID0gMDsKKworICAgICAgaWYgKCFfX2lzX3NpbXBsZSkKKwlfX28ud2lkdGgoX193IC8gX19yb3BlX2xlbik7CisgICAgICBfX3RyeQorCXsKKwkgIGlmIChfX2lzX3NpbXBsZSAmJiAhX19sZWZ0ICYmIF9fcGFkX2xlbiA+IDApCisJICAgIF9Sb3BlX2ZpbGwoX19vLCBfX3BhZF9sZW4pOworCSAgX19yLmFwcGx5X3RvX3BpZWNlcygwLCBfX3Iuc2l6ZSgpLCBfX2MpOworCSAgaWYgKF9faXNfc2ltcGxlICYmIF9fbGVmdCAmJiBfX3BhZF9sZW4gPiAwKQorCSAgICBfUm9wZV9maWxsKF9fbywgX19wYWRfbGVuKTsKKwkgIGlmICghX19pc19zaW1wbGUpCisJICAgIF9fby53aWR0aChfX3cpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIGlmICghX19pc19zaW1wbGUpCisJICAgIF9fby53aWR0aChfX3cpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgICAgcmV0dXJuIF9fbzsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIF9DaGFyVCoKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1NfZmxhdHRlbihfUm9wZVJlcCogX19yLCBzaXplX3QgX19zdGFydCwgc2l6ZV90IF9fbGVuLAorCSAgICAgICBfQ2hhclQqIF9fYnVmZmVyKQorICAgIHsKKyAgICAgIF9Sb3BlX2ZsYXR0ZW5fY2hhcl9jb25zdW1lcjxfQ2hhclQ+IF9fYyhfX2J1ZmZlcik7CisgICAgICBfU19hcHBseV90b19waWVjZXMoX19jLCBfX3IsIF9fc3RhcnQsIF9fc3RhcnQgKyBfX2xlbik7CisgICAgICByZXR1cm4oX19idWZmZXIgKyBfX2xlbik7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBzaXplX3QKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgZmluZChfQ2hhclQgX19wYXR0ZXJuLCBzaXplX3QgX19zdGFydCkgY29uc3QKKyAgICB7CisgICAgICBfUm9wZV9maW5kX2NoYXJfY2hhcl9jb25zdW1lcjxfQ2hhclQ+IF9fYyhfX3BhdHRlcm4pOworICAgICAgX1NfYXBwbHlfdG9fcGllY2VzKF9fYywgdGhpcy0+X01fdHJlZV9wdHIsIF9fc3RhcnQsIHNpemUoKSk7CisgICAgICBzaXplX3R5cGUgX19yZXN1bHRfcG9zID0gX19zdGFydCArIF9fYy5fTV9jb3VudDsKKyNpZm5kZWYgX19TVExfT0xEX1JPUEVfU0VNQU5USUNTCisgICAgICBpZiAoX19yZXN1bHRfcG9zID09IHNpemUoKSkKKwlfX3Jlc3VsdF9wb3MgPSBucG9zOworI2VuZGlmCisgICAgICByZXR1cm4gX19yZXN1bHRfcG9zOworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgX0NoYXJUKgorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19mbGF0dGVuKF9Sb3BlUmVwKiBfX3IsIF9DaGFyVCogX19idWZmZXIpCisgICAgeworICAgICAgaWYgKDAgPT0gX19yKQorCXJldHVybiBfX2J1ZmZlcjsKKyAgICAgIHN3aXRjaChfX3ItPl9NX3RhZykKKwl7CisJY2FzZSBfX2RldGFpbDo6X1NfY29uY2F0OgorCSAgeworCSAgICBfUm9wZUNvbmNhdGVuYXRpb24qIF9fYyA9IChfUm9wZUNvbmNhdGVuYXRpb24qKV9fcjsKKwkgICAgX1JvcGVSZXAqIF9fbGVmdCA9IF9fYy0+X01fbGVmdDsKKwkgICAgX1JvcGVSZXAqIF9fcmlnaHQgPSBfX2MtPl9NX3JpZ2h0OworCSAgICBfQ2hhclQqIF9fcmVzdCA9IF9TX2ZsYXR0ZW4oX19sZWZ0LCBfX2J1ZmZlcik7CisJICAgIHJldHVybiBfU19mbGF0dGVuKF9fcmlnaHQsIF9fcmVzdCk7CisJICB9CisJY2FzZSBfX2RldGFpbDo6X1NfbGVhZjoKKwkgIHsKKwkgICAgX1JvcGVMZWFmKiBfX2wgPSAoX1JvcGVMZWFmKilfX3I7CisJICAgIHJldHVybiBjb3B5X24oX19sLT5fTV9kYXRhLCBfX2wtPl9NX3NpemUsIF9fYnVmZmVyKS5zZWNvbmQ7CisJICB9CisJY2FzZSBfX2RldGFpbDo6X1NfZnVuY3Rpb246CisJY2FzZSBfX2RldGFpbDo6X1Nfc3Vic3RyaW5nZm46CisJICAvLyBXZSBkb24ndCB5ZXQgZG8gYW55dGhpbmcgd2l0aCBzdWJzdHJpbmcgbm9kZXMuCisJICAvLyBUaGlzIG5lZWRzIHRvIGJlIGZpeGVkIGJlZm9yZSByb3BlZmlsZXMgd2lsbCB3b3JrIHdlbGwuCisJICB7CisJICAgIF9Sb3BlRnVuY3Rpb24qIF9fZiA9IChfUm9wZUZ1bmN0aW9uKilfX3I7CisJICAgICgqKF9fZi0+X01fZm4pKSgwLCBfX2YtPl9NX3NpemUsIF9fYnVmZmVyKTsKKwkgICAgcmV0dXJuIF9fYnVmZmVyICsgX19mLT5fTV9zaXplOworCSAgfQorCWRlZmF1bHQ6CisJICByZXR1cm4gMDsKKwl9CisgICAgfQorCisgIC8vIFRoaXMgbmVlZHMgd29yayBmb3IgX0NoYXJUICE9IGNoYXIKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHZvaWQKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1NfZHVtcChfUm9wZVJlcCogX19yLCBpbnQgX19pbmRlbnQpCisgICAgeworICAgICAgZm9yIChpbnQgX19pID0gMDsgX19pIDwgX19pbmRlbnQ7IF9faSsrKQorCXB1dGNoYXIoJyAnKTsKKyAgICAgIGlmICgwID09IF9fcikKKwl7CisJICBwcmludGYoIk5VTExcbiIpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGlmIChfU19jb25jYXQgPT0gX19yLT5fTV90YWcpCisJeworCSAgX1JvcGVDb25jYXRlbmF0aW9uKiBfX2MgPSAoX1JvcGVDb25jYXRlbmF0aW9uKilfX3I7CisJICBfUm9wZVJlcCogX19sZWZ0ID0gX19jLT5fTV9sZWZ0OworCSAgX1JvcGVSZXAqIF9fcmlnaHQgPSBfX2MtPl9NX3JpZ2h0OworCSAgCisjaWZkZWYgX19HQworCSAgcHJpbnRmKCJDb25jYXRlbmF0aW9uICVwIChkZXB0aCA9ICVkLCBsZW4gPSAlbGQsICVzIGJhbGFuY2VkKVxuIiwKKwkJIF9fciwgX19yLT5fTV9kZXB0aCwgX19yLT5fTV9zaXplLAorCQkgX19yLT5fTV9pc19iYWxhbmNlZD8gIiIgOiAibm90Iik7CisjZWxzZQorCSAgcHJpbnRmKCJDb25jYXRlbmF0aW9uICVwIChyYyA9ICVsZCwgZGVwdGggPSAlZCwgIgorCQkgImxlbiA9ICVsZCwgJXMgYmFsYW5jZWQpXG4iLAorCQkgX19yLCBfX3ItPl9NX3JlZl9jb3VudCwgX19yLT5fTV9kZXB0aCwgX19yLT5fTV9zaXplLAorCQkgX19yLT5fTV9pc19iYWxhbmNlZD8gIiIgOiAibm90Iik7CisjZW5kaWYKKwkgIF9TX2R1bXAoX19sZWZ0LCBfX2luZGVudCArIDIpOworCSAgX1NfZHVtcChfX3JpZ2h0LCBfX2luZGVudCArIDIpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjaGFyKiBfX2tpbmQ7CisJICAKKwkgIHN3aXRjaCAoX19yLT5fTV90YWcpCisJICAgIHsKKwkgICAgY2FzZSBfX2RldGFpbDo6X1NfbGVhZjoKKwkgICAgICBfX2tpbmQgPSAiTGVhZiI7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgX19kZXRhaWw6Ol9TX2Z1bmN0aW9uOgorCSAgICAgIF9fa2luZCA9ICJGdW5jdGlvbiI7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgX19kZXRhaWw6Ol9TX3N1YnN0cmluZ2ZuOgorCSAgICAgIF9fa2luZCA9ICJGdW5jdGlvbiByZXByZXNlbnRpbmcgc3Vic3RyaW5nIjsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBfX2tpbmQgPSAiKGNvcnJ1cHRlZCBraW5kIGZpZWxkISkiOworCSAgICB9CisjaWZkZWYgX19HQworCSAgcHJpbnRmKCIlcyAlcCAoZGVwdGggPSAlZCwgbGVuID0gJWxkKSAiLAorCQkgX19raW5kLCBfX3IsIF9fci0+X01fZGVwdGgsIF9fci0+X01fc2l6ZSk7CisjZWxzZQorCSAgcHJpbnRmKCIlcyAlcCAocmMgPSAlbGQsIGRlcHRoID0gJWQsIGxlbiA9ICVsZCkgIiwKKwkJIF9fa2luZCwgX19yLCBfX3ItPl9NX3JlZl9jb3VudCwgX19yLT5fTV9kZXB0aCwgX19yLT5fTV9zaXplKTsKKyNlbmRpZgorCSAgaWYgKF9TX2lzX29uZV9ieXRlX2NoYXJfdHlwZSgoX0NoYXJUKikwKSkKKwkgICAgeworCSAgICAgIGNvbnN0IGludCBfX21heF9sZW4gPSA0MDsKKwkgICAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19wcmVmaXgoX1Nfc3Vic3RyaW5nKF9fciwgMCwgX19tYXhfbGVuKSk7CisJICAgICAgX0NoYXJUIF9fYnVmZmVyW19fbWF4X2xlbiArIDFdOworCSAgICAgIGJvb2wgX190b29fYmlnID0gX19yLT5fTV9zaXplID4gX19wcmVmaXgtPl9NX3NpemU7CisJICAgICAgCisJICAgICAgX1NfZmxhdHRlbihfX3ByZWZpeCwgX19idWZmZXIpOworCSAgICAgIF9fYnVmZmVyW19fcHJlZml4LT5fTV9zaXplXSA9IF9TX2VvcygoX0NoYXJUKikwKTsKKwkgICAgICBwcmludGYoIiVzJXNcbiIsIChjaGFyKilfX2J1ZmZlciwKKwkJICAgICBfX3Rvb19iaWc/ICIuLi5cbiIgOiAiXG4iKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBwcmludGYoIlxuIik7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgY29uc3QgdW5zaWduZWQgbG9uZworICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19taW5fbGVuW2ludChfX2RldGFpbDo6X1NfbWF4X3JvcGVfZGVwdGgpICsgMV0gPSB7CisgICAgICAvKiAwICovMSwgLyogMSAqLzIsIC8qIDIgKi8zLCAvKiAzICovNSwgLyogNCAqLzgsIC8qIDUgKi8xMywgLyogNiAqLzIxLAorICAgICAgLyogNyAqLzM0LCAvKiA4ICovNTUsIC8qIDkgKi84OSwgLyogMTAgKi8xNDQsIC8qIDExICovMjMzLCAvKiAxMiAqLzM3NywKKyAgICAgIC8qIDEzICovNjEwLCAvKiAxNCAqLzk4NywgLyogMTUgKi8xNTk3LCAvKiAxNiAqLzI1ODQsIC8qIDE3ICovNDE4MSwKKyAgICAgIC8qIDE4ICovNjc2NSwgLyogMTkgKi8xMDk0NiwgLyogMjAgKi8xNzcxMSwgLyogMjEgKi8yODY1NywgLyogMjIgKi80NjM2OCwKKyAgICAgIC8qIDIzICovNzUwMjUsIC8qIDI0ICovMTIxMzkzLCAvKiAyNSAqLzE5NjQxOCwgLyogMjYgKi8zMTc4MTEsCisgICAgICAvKiAyNyAqLzUxNDIyOSwgLyogMjggKi84MzIwNDAsIC8qIDI5ICovMTM0NjI2OSwgLyogMzAgKi8yMTc4MzA5LAorICAgICAgLyogMzEgKi8zNTI0NTc4LCAvKiAzMiAqLzU3MDI4ODcsIC8qIDMzICovOTIyNzQ2NSwgLyogMzQgKi8xNDkzMDM1MiwKKyAgICAgIC8qIDM1ICovMjQxNTc4MTcsIC8qIDM2ICovMzkwODgxNjksIC8qIDM3ICovNjMyNDU5ODYsIC8qIDM4ICovMTAyMzM0MTU1LAorICAgICAgLyogMzkgKi8xNjU1ODAxNDEsIC8qIDQwICovMjY3OTE0Mjk2LCAvKiA0MSAqLzQzMzQ5NDQzNywKKyAgICAgIC8qIDQyICovNzAxNDA4NzMzLCAvKiA0MyAqLzExMzQ5MDMxNzAsIC8qIDQ0ICovMTgzNjMxMTkwMywKKyAgICAgIC8qIDQ1ICovMjk3MTIxNTA3M3UgfTsKKyAgLy8gVGhlc2UgYXJlIEZpYm9uYWNjaSBudW1iZXJzIDwgMioqMzIuCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHR5cGVuYW1lIHJvcGU8X0NoYXJULCBfQWxsb2M+OjpfUm9wZVJlcCoKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1NfYmFsYW5jZShfUm9wZVJlcCogX19yKQorICAgIHsKKyAgICAgIF9Sb3BlUmVwKiBfX2ZvcmVzdFtpbnQoX19kZXRhaWw6Ol9TX21heF9yb3BlX2RlcHRoKSArIDFdOworICAgICAgX1JvcGVSZXAqIF9fcmVzdWx0ID0gMDsKKyAgICAgIGludCBfX2k7CisgICAgICAvLyBJbnZhcmlhbnQ6CisgICAgICAvLyBUaGUgY29uY2F0ZW5hdGlvbiBvZiBmb3Jlc3QgaW4gZGVzY2VuZGluZyBvcmRlciBpcyBlcXVhbCB0byBfX3IuCisgICAgICAvLyBfX2ZvcmVzdFtfX2ldLl9NX3NpemUgPj0gX1NfbWluX2xlbltfX2ldCisgICAgICAvLyBfX2ZvcmVzdFtfX2ldLl9NX2RlcHRoID0gX19pCisgICAgICAvLyBSZWZlcmVuY2VzIGZyb20gZm9yZXN0IGFyZSBpbmNsdWRlZCBpbiByZWZjb3VudC4KKyAgICAgIAorICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPD0gaW50KF9fZGV0YWlsOjpfU19tYXhfcm9wZV9kZXB0aCk7ICsrX19pKQorCV9fZm9yZXN0W19faV0gPSAwOworICAgICAgX190cnkKKwl7CisJICBfU19hZGRfdG9fZm9yZXN0KF9fciwgX19mb3Jlc3QpOworCSAgZm9yIChfX2kgPSAwOyBfX2kgPD0gaW50KF9fZGV0YWlsOjpfU19tYXhfcm9wZV9kZXB0aCk7ICsrX19pKQorCSAgICBpZiAoMCAhPSBfX2ZvcmVzdFtfX2ldKQorCSAgICAgIHsKKyNpZm5kZWYgX19HQworCQlfU2VsZl9kZXN0cnVjdF9wdHIgX19vbGQoX19yZXN1bHQpOworI2VuZGlmCisJCV9fcmVzdWx0ID0gX1NfY29uY2F0KF9fZm9yZXN0W19faV0sIF9fcmVzdWx0KTsKKwkJX19mb3Jlc3RbX19pXS0+X01fdW5yZWZfbm9ubmlsKCk7CisjaWYgIWRlZmluZWQoX19HQykgJiYgZGVmaW5lZChfX0VYQ0VQVElPTlMpCisJCV9fZm9yZXN0W19faV0gPSAwOworI2VuZGlmCisJICAgICAgfQorCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIGZvcihfX2kgPSAwOyBfX2kgPD0gaW50KF9fZGV0YWlsOjpfU19tYXhfcm9wZV9kZXB0aCk7IF9faSsrKQorCSAgICBfU191bnJlZihfX2ZvcmVzdFtfX2ldKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICAgIAorICAgICAgaWYgKF9fcmVzdWx0LT5fTV9kZXB0aCA+IGludChfX2RldGFpbDo6X1NfbWF4X3JvcGVfZGVwdGgpKQorCV9fdGhyb3dfbGVuZ3RoX2Vycm9yKF9fTigicm9wZTo6X1NfYmFsYW5jZSIpKTsKKyAgICAgIHJldHVybihfX3Jlc3VsdCk7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICB2b2lkCisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX2FkZF90b19mb3Jlc3QoX1JvcGVSZXAqIF9fciwgX1JvcGVSZXAqKiBfX2ZvcmVzdCkKKyAgICB7CisgICAgICBpZiAoX19yLT5fTV9pc19iYWxhbmNlZCkKKwl7CisJICBfU19hZGRfbGVhZl90b19mb3Jlc3QoX19yLCBfX2ZvcmVzdCk7CisJICByZXR1cm47CisJfQorCisgICAgICB7CisJX1JvcGVDb25jYXRlbmF0aW9uKiBfX2MgPSAoX1JvcGVDb25jYXRlbmF0aW9uKilfX3I7CisJCisJX1NfYWRkX3RvX2ZvcmVzdChfX2MtPl9NX2xlZnQsIF9fZm9yZXN0KTsKKwlfU19hZGRfdG9fZm9yZXN0KF9fYy0+X01fcmlnaHQsIF9fZm9yZXN0KTsKKyAgICAgIH0KKyAgICB9CisKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19hZGRfbGVhZl90b19mb3Jlc3QoX1JvcGVSZXAqIF9fciwgX1JvcGVSZXAqKiBfX2ZvcmVzdCkKKyAgICB7CisgICAgICBfUm9wZVJlcCogX19pbnNlcnRlZTsJCS8vIGluY2x1ZGVkIGluIHJlZmNvdW50CisgICAgICBfUm9wZVJlcCogX190b29fdGlueSA9IDA7CQkvLyBpbmNsdWRlZCBpbiByZWZjb3VudAorICAgICAgaW50IF9faTsJCQkJLy8gZm9yZXN0WzAuLl9faS0xXSBpcyBlbXB0eQorICAgICAgc2l6ZV90IF9fcyA9IF9fci0+X01fc2l6ZTsKKyAgICAgIAorICAgICAgZm9yIChfX2kgPSAwOyBfX3MgPj0gX1NfbWluX2xlbltfX2krMV0vKiBub3QgdGhpcyBidWNrZXQgKi87ICsrX19pKQorCXsKKwkgIGlmICgwICE9IF9fZm9yZXN0W19faV0pCisJICAgIHsKKyNpZm5kZWYgX19HQworCSAgICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX29sZChfX3Rvb190aW55KTsKKyNlbmRpZgorCSAgICAgIF9fdG9vX3RpbnkgPSBfU19jb25jYXRfYW5kX3NldF9iYWxhbmNlZChfX2ZvcmVzdFtfX2ldLAorCQkJCQkJICAgICAgX190b29fdGlueSk7CisJICAgICAgX19mb3Jlc3RbX19pXS0+X01fdW5yZWZfbm9ubmlsKCk7CisJICAgICAgX19mb3Jlc3RbX19pXSA9IDA7CisJICAgIH0KKwl9CisgICAgICB7CisjaWZuZGVmIF9fR0MKKwlfU2VsZl9kZXN0cnVjdF9wdHIgX19vbGQoX190b29fdGlueSk7CisjZW5kaWYKKwlfX2luc2VydGVlID0gX1NfY29uY2F0X2FuZF9zZXRfYmFsYW5jZWQoX190b29fdGlueSwgX19yKTsKKyAgICAgIH0KKyAgICAgIC8vIFRvb190aW55IGRlYWQsIGFuZCBubyBsb25nZXIgaW5jbHVkZWQgaW4gcmVmY291bnQuCisgICAgICAvLyBJbnNlcnRlZSBpcyBsaXZlIGFuZCBpbmNsdWRlZC4KKyAgICAgIGZvciAoOzsgKytfX2kpCisJeworCSAgaWYgKDAgIT0gX19mb3Jlc3RbX19pXSkKKwkgICAgeworI2lmbmRlZiBfX0dDCisJICAgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fb2xkKF9faW5zZXJ0ZWUpOworI2VuZGlmCisJICAgICAgX19pbnNlcnRlZSA9IF9TX2NvbmNhdF9hbmRfc2V0X2JhbGFuY2VkKF9fZm9yZXN0W19faV0sCisJCQkJCQkgICAgICBfX2luc2VydGVlKTsKKwkgICAgICBfX2ZvcmVzdFtfX2ldLT5fTV91bnJlZl9ub25uaWwoKTsKKwkgICAgICBfX2ZvcmVzdFtfX2ldID0gMDsKKwkgICAgfQorCSAgaWYgKF9faSA9PSBpbnQoX19kZXRhaWw6Ol9TX21heF9yb3BlX2RlcHRoKQorCSAgICAgIHx8IF9faW5zZXJ0ZWUtPl9NX3NpemUgPCBfU19taW5fbGVuW19faSsxXSkKKwkgICAgeworCSAgICAgIF9fZm9yZXN0W19faV0gPSBfX2luc2VydGVlOworCSAgICAgIC8vIHJlZmNvdW50IGlzIE9LIHNpbmNlIF9faW5zZXJ0ZWUgaXMgbm93IGRlYWQuCisJICAgICAgcmV0dXJuOworCSAgICB9CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgX0NoYXJUCisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX2ZldGNoKF9Sb3BlUmVwKiBfX3IsIHNpemVfdHlwZSBfX2kpCisgICAgeworICAgICAgX19HQ19DT05TVCBfQ2hhclQqIF9fY3N0ciA9IF9fci0+X01fY19zdHJpbmc7CisgICAgICAKKyAgICAgIGlmICgwICE9IF9fY3N0cikKKwlyZXR1cm4gX19jc3RyW19faV07CisgICAgICBmb3IoOzspCisJeworCSAgc3dpdGNoKF9fci0+X01fdGFnKQorCSAgICB7CisJICAgIGNhc2UgX19kZXRhaWw6Ol9TX2NvbmNhdDoKKwkgICAgICB7CisJCV9Sb3BlQ29uY2F0ZW5hdGlvbiogX19jID0gKF9Sb3BlQ29uY2F0ZW5hdGlvbiopX19yOworCQlfUm9wZVJlcCogX19sZWZ0ID0gX19jLT5fTV9sZWZ0OworCQlzaXplX3QgX19sZWZ0X2xlbiA9IF9fbGVmdC0+X01fc2l6ZTsKKwkJCisJCWlmIChfX2kgPj0gX19sZWZ0X2xlbikKKwkJICB7CisJCSAgICBfX2kgLT0gX19sZWZ0X2xlbjsKKwkJICAgIF9fciA9IF9fYy0+X01fcmlnaHQ7CisJCSAgfSAKKwkJZWxzZQorCQkgIF9fciA9IF9fbGVmdDsKKwkgICAgICB9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgX19kZXRhaWw6Ol9TX2xlYWY6CisJICAgICAgeworCQlfUm9wZUxlYWYqIF9fbCA9IChfUm9wZUxlYWYqKV9fcjsKKwkJcmV0dXJuIF9fbC0+X01fZGF0YVtfX2ldOworCSAgICAgIH0KKwkgICAgY2FzZSBfX2RldGFpbDo6X1NfZnVuY3Rpb246CisJICAgIGNhc2UgX19kZXRhaWw6Ol9TX3N1YnN0cmluZ2ZuOgorCSAgICAgIHsKKwkJX1JvcGVGdW5jdGlvbiogX19mID0gKF9Sb3BlRnVuY3Rpb24qKV9fcjsKKwkJX0NoYXJUIF9fcmVzdWx0OworCQkKKwkJKCooX19mLT5fTV9mbikpKF9faSwgMSwgJl9fcmVzdWx0KTsKKwkJcmV0dXJuIF9fcmVzdWx0OworCSAgICAgIH0KKwkgICAgfQorCX0KKyAgICB9CisgIAorI2lmbmRlZiBfX0dDCisgIC8vIFJldHVybiBhIHVuaXF1ZWx5IHJlZmVyZW5jZWQgY2hhcmFjdGVyIHNsb3QgZm9yIHRoZSBnaXZlbgorICAvLyBwb3NpdGlvbiwgb3IgMCBpZiB0aGF0J3Mgbm90IHBvc3NpYmxlLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgX0NoYXJUKgorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19mZXRjaF9wdHIoX1JvcGVSZXAqIF9fciwgc2l6ZV90eXBlIF9faSkKKyAgICB7CisgICAgICBfUm9wZVJlcCogX19jbHJzdGFja1tfX2RldGFpbDo6X1NfbWF4X3JvcGVfZGVwdGhdOworICAgICAgc2l6ZV90IF9fY3NwdHIgPSAwOworICAgICAgCisgICAgICBmb3IoOzspCisJeworCSAgaWYgKF9fci0+X01fcmVmX2NvdW50ID4gMSkKKwkgICAgcmV0dXJuIDA7CisJICBzd2l0Y2goX19yLT5fTV90YWcpCisJICAgIHsKKwkgICAgY2FzZSBfX2RldGFpbDo6X1NfY29uY2F0OgorCSAgICAgIHsKKwkJX1JvcGVDb25jYXRlbmF0aW9uKiBfX2MgPSAoX1JvcGVDb25jYXRlbmF0aW9uKilfX3I7CisJCV9Sb3BlUmVwKiBfX2xlZnQgPSBfX2MtPl9NX2xlZnQ7CisJCXNpemVfdCBfX2xlZnRfbGVuID0gX19sZWZ0LT5fTV9zaXplOworCQkKKwkJaWYgKF9fYy0+X01fY19zdHJpbmcgIT0gMCkKKwkJICBfX2NscnN0YWNrW19fY3NwdHIrK10gPSBfX2M7CisJCWlmIChfX2kgPj0gX19sZWZ0X2xlbikKKwkJICB7CisJCSAgICBfX2kgLT0gX19sZWZ0X2xlbjsKKwkJICAgIF9fciA9IF9fYy0+X01fcmlnaHQ7CisJCSAgfSAKKwkJZWxzZQorCQkgIF9fciA9IF9fbGVmdDsKKwkgICAgICB9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgX19kZXRhaWw6Ol9TX2xlYWY6CisJICAgICAgeworCQlfUm9wZUxlYWYqIF9fbCA9IChfUm9wZUxlYWYqKV9fcjsKKwkJaWYgKF9fbC0+X01fY19zdHJpbmcgIT0gX19sLT5fTV9kYXRhICYmIF9fbC0+X01fY19zdHJpbmcgIT0gMCkKKwkJICBfX2NscnN0YWNrW19fY3NwdHIrK10gPSBfX2w7CisJCXdoaWxlIChfX2NzcHRyID4gMCkKKwkJICB7CisJCSAgICAtLSBfX2NzcHRyOworCQkgICAgX1JvcGVSZXAqIF9fZCA9IF9fY2xyc3RhY2tbX19jc3B0cl07CisJCSAgICBfX2QtPl9NX2ZyZWVfY19zdHJpbmcoKTsKKwkJICAgIF9fZC0+X01fY19zdHJpbmcgPSAwOworCQkgIH0KKwkJcmV0dXJuIF9fbC0+X01fZGF0YSArIF9faTsKKwkgICAgICB9CisJICAgIGNhc2UgX19kZXRhaWw6Ol9TX2Z1bmN0aW9uOgorCSAgICBjYXNlIF9fZGV0YWlsOjpfU19zdWJzdHJpbmdmbjoKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCX0KKyAgICB9CisjZW5kaWYgLyogX19HQyAqLworCisgIC8vIFRoZSBmb2xsb3dpbmcgY291bGQgYmUgaW1wbGVtZW50ZWQgdHJpdmlhbGx5IHVzaW5nCisgIC8vIGxleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkuCisgIC8vIFdlIGRvIGEgbGl0dGxlIG1vcmUgd29yayB0byBhdm9pZCBkZWFsaW5nIHdpdGggcm9wZSBpdGVyYXRvcnMgZm9yCisgIC8vIGZsYXQgc3RyaW5ncy4KKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGludAorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19jb21wYXJlIChjb25zdCBfUm9wZVJlcCogX19sZWZ0LCBjb25zdCBfUm9wZVJlcCogX19yaWdodCkKKyAgICB7CisgICAgICBzaXplX3QgX19sZWZ0X2xlbjsKKyAgICAgIHNpemVfdCBfX3JpZ2h0X2xlbjsKKyAgICAgIAorICAgICAgaWYgKDAgPT0gX19yaWdodCkKKwlyZXR1cm4gMCAhPSBfX2xlZnQ7CisgICAgICBpZiAoMCA9PSBfX2xlZnQpCisJcmV0dXJuIC0xOworICAgICAgX19sZWZ0X2xlbiA9IF9fbGVmdC0+X01fc2l6ZTsKKyAgICAgIF9fcmlnaHRfbGVuID0gX19yaWdodC0+X01fc2l6ZTsKKyAgICAgIGlmIChfX2RldGFpbDo6X1NfbGVhZiA9PSBfX2xlZnQtPl9NX3RhZykKKwl7CisJICBfUm9wZUxlYWYqIF9fbCA9IChfUm9wZUxlYWYqKSBfX2xlZnQ7CisJICBpZiAoX19kZXRhaWw6Ol9TX2xlYWYgPT0gX19yaWdodC0+X01fdGFnKQorCSAgICB7CisJICAgICAgX1JvcGVMZWFmKiBfX3IgPSAoX1JvcGVMZWFmKikgX19yaWdodDsKKwkgICAgICByZXR1cm4gbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShfX2wtPl9NX2RhdGEsCisJCQkJCQkgIF9fbC0+X01fZGF0YSArIF9fbGVmdF9sZW4sCisJCQkJCQkgIF9fci0+X01fZGF0YSwgX19yLT5fTV9kYXRhCisJCQkJCQkgICsgX19yaWdodF9sZW4pOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb25zdF9pdGVyYXRvciBfX3JzdGFydChfX3JpZ2h0LCAwKTsKKwkgICAgICBjb25zdF9pdGVyYXRvciBfX3JlbmQoX19yaWdodCwgX19yaWdodF9sZW4pOworCSAgICAgIHJldHVybiBsZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KF9fbC0+X01fZGF0YSwgX19sLT5fTV9kYXRhCisJCQkJCQkgICsgX19sZWZ0X2xlbiwKKwkJCQkJCSAgX19yc3RhcnQsIF9fcmVuZCk7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgY29uc3RfaXRlcmF0b3IgX19sc3RhcnQoX19sZWZ0LCAwKTsKKwkgIGNvbnN0X2l0ZXJhdG9yIF9fbGVuZChfX2xlZnQsIF9fbGVmdF9sZW4pOworCSAgaWYgKF9fZGV0YWlsOjpfU19sZWFmID09IF9fcmlnaHQtPl9NX3RhZykKKwkgICAgeworCSAgICAgIF9Sb3BlTGVhZiogX19yID0gKF9Sb3BlTGVhZiopIF9fcmlnaHQ7CisJICAgICAgcmV0dXJuIGxleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoX19sc3RhcnQsIF9fbGVuZCwKKwkJCQkJCSAgX19yLT5fTV9kYXRhLCBfX3ItPl9NX2RhdGEKKwkJCQkJCSAgKyBfX3JpZ2h0X2xlbik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fcnN0YXJ0KF9fcmlnaHQsIDApOworCSAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fcmVuZChfX3JpZ2h0LCBfX3JpZ2h0X2xlbik7CisJICAgICAgcmV0dXJuIGxleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoX19sc3RhcnQsIF9fbGVuZCwKKwkJCQkJCSAgX19yc3RhcnQsIF9fcmVuZCk7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8vIEFzc2lnbm1lbnQgdG8gcmVmZXJlbmNlIHByb3hpZXMuCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz4mCisgICAgX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBvcGVyYXRvcj0oX0NoYXJUIF9fYykKKyAgICB7CisgICAgICBfUm9wZVJlcCogX19vbGQgPSBfTV9yb290LT5fTV90cmVlX3B0cjsKKyNpZm5kZWYgX19HQworICAgICAgLy8gRmlyc3QgY2hlY2sgZm9yIHRoZSBjYXNlIGluIHdoaWNoIGV2ZXJ5dGhpbmcgaXMgdW5pcXVlbHkKKyAgICAgIC8vIHJlZmVyZW5jZWQuICBJbiB0aGF0IGNhc2Ugd2UgY2FuIGRvIHRoaXMgZGVzdHJ1Y3RpdmVseS4KKyAgICAgIF9DaGFyVCogX19wdHIgPSBfTXlfcm9wZTo6X1NfZmV0Y2hfcHRyKF9fb2xkLCBfTV9wb3MpOworICAgICAgaWYgKDAgIT0gX19wdHIpCisJeworCSAgKl9fcHRyID0gX19jOworCSAgcmV0dXJuICp0aGlzOworCX0KKyNlbmRpZgorICAgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fbGVmdChfTXlfcm9wZTo6X1Nfc3Vic3RyaW5nKF9fb2xkLCAwLCBfTV9wb3MpKTsKKyAgICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX3JpZ2h0KF9NeV9yb3BlOjpfU19zdWJzdHJpbmcoX19vbGQsIF9NX3BvcyArIDEsCisJCQkJCQkJX19vbGQtPl9NX3NpemUpKTsKKyAgICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX3Jlc3VsdF9sZWZ0KF9NeV9yb3BlOjoKKwkJCQkgICAgICAgX1NfZGVzdHJfY29uY2F0X2NoYXJfaXRlcihfX2xlZnQsCisJCQkJCQkJCSAmX19jLCAxKSk7CisKKyAgICAgIF9Sb3BlUmVwKiBfX3Jlc3VsdCA9IF9NeV9yb3BlOjpfU19jb25jYXQoX19yZXN1bHRfbGVmdCwgX19yaWdodCk7CisjaWZuZGVmIF9fR0MKKyAgICAgIF9Sb3BlUmVwOjpfU191bnJlZihfX29sZCk7CisjZW5kaWYKKyAgICAgIF9NX3Jvb3QtPl9NX3RyZWVfcHRyID0gX19yZXN1bHQ7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBvcGVyYXRvciBfQ2hhclQoKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChfTV9jdXJyZW50X3ZhbGlkKQorCXJldHVybiBfTV9jdXJyZW50OworICAgICAgZWxzZQorCXJldHVybiBfTXlfcm9wZTo6X1NfZmV0Y2goX01fcm9vdC0+X01fdHJlZV9wdHIsIF9NX3Bvcyk7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsIF9BbGxvYz4KKyAgICBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz46OgorICAgIG9wZXJhdG9yJigpIGNvbnN0CisgICAgeyByZXR1cm4gX1JvcGVfY2hhcl9wdHJfcHJveHk8X0NoYXJULCBfQWxsb2M+KCp0aGlzKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgcm9wZShzaXplX3QgX19uLCBfQ2hhclQgX19jLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX0Jhc2UoX19hKQorICAgIHsKKyAgICAgIHJvcGU8X0NoYXJULF9BbGxvYz4gX19yZXN1bHQ7CisgICAgICBjb25zdCBzaXplX3QgX19leHBvbmVudGlhdGVfdGhyZXNob2xkID0gMzI7CisgICAgICBzaXplX3QgX19leHBvbmVudDsKKyAgICAgIHNpemVfdCBfX3Jlc3Q7CisgICAgICBfQ2hhclQqIF9fcmVzdF9idWZmZXI7CisgICAgICBfUm9wZVJlcCogX19yZW1haW5kZXI7CisgICAgICByb3BlPF9DaGFyVCwgX0FsbG9jPiBfX3JlbWFpbmRlcl9yb3BlOworCisgICAgICBpZiAoMCA9PSBfX24pCisJcmV0dXJuOworCisgICAgICBfX2V4cG9uZW50ID0gX19uIC8gX19leHBvbmVudGlhdGVfdGhyZXNob2xkOworICAgICAgX19yZXN0ID0gX19uICUgX19leHBvbmVudGlhdGVfdGhyZXNob2xkOworICAgICAgaWYgKDAgPT0gX19yZXN0KQorCV9fcmVtYWluZGVyID0gMDsKKyAgICAgIGVsc2UKKwl7CisJICBfX3Jlc3RfYnVmZmVyID0gdGhpcy0+X0RhdGFfYWxsb2NhdGUoX1Nfcm91bmRlZF91cF9zaXplKF9fcmVzdCkpOworCSAgX191bmluaXRpYWxpemVkX2ZpbGxfbl9hKF9fcmVzdF9idWZmZXIsIF9fcmVzdCwgX19jLAorCQkJCSAgIF9NX2dldF9hbGxvY2F0b3IoKSk7CisJICBfU19jb25kX3N0b3JlX2VvcyhfX3Jlc3RfYnVmZmVyW19fcmVzdF0pOworCSAgX190cnkKKwkgICAgeyBfX3JlbWFpbmRlciA9IF9TX25ld19Sb3BlTGVhZihfX3Jlc3RfYnVmZmVyLCBfX3Jlc3QsCisJCQkJCSAgICBfTV9nZXRfYWxsb2NhdG9yKCkpOyB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIF9Sb3BlUmVwOjpfX1NUTF9GUkVFX1NUUklORyhfX3Jlc3RfYnVmZmVyLCBfX3Jlc3QsCisJCQkJCSAgX01fZ2V0X2FsbG9jYXRvcigpKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKyAgICAgIF9fcmVtYWluZGVyX3JvcGUuX01fdHJlZV9wdHIgPSBfX3JlbWFpbmRlcjsKKyAgICAgIGlmIChfX2V4cG9uZW50ICE9IDApCisJeworCSAgX0NoYXJUKiBfX2Jhc2VfYnVmZmVyID0KKwkgICAgdGhpcy0+X0RhdGFfYWxsb2NhdGUoX1Nfcm91bmRlZF91cF9zaXplKF9fZXhwb25lbnRpYXRlX3RocmVzaG9sZCkpOworCSAgX1JvcGVMZWFmKiBfX2Jhc2VfbGVhZjsKKwkgIHJvcGUgX19iYXNlX3JvcGU7CisJICBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uX2EoX19iYXNlX2J1ZmZlciwgX19leHBvbmVudGlhdGVfdGhyZXNob2xkLCBfX2MsCisJCQkJICAgX01fZ2V0X2FsbG9jYXRvcigpKTsKKwkgIF9TX2NvbmRfc3RvcmVfZW9zKF9fYmFzZV9idWZmZXJbX19leHBvbmVudGlhdGVfdGhyZXNob2xkXSk7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgX19iYXNlX2xlYWYgPSBfU19uZXdfUm9wZUxlYWYoX19iYXNlX2J1ZmZlciwKKwkJCQkJICAgIF9fZXhwb25lbnRpYXRlX3RocmVzaG9sZCwKKwkJCQkJICAgIF9NX2dldF9hbGxvY2F0b3IoKSk7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgX1JvcGVSZXA6Ol9fU1RMX0ZSRUVfU1RSSU5HKF9fYmFzZV9idWZmZXIsCisJCQkJCSAgX19leHBvbmVudGlhdGVfdGhyZXNob2xkLAorCQkJCQkgIF9NX2dldF9hbGxvY2F0b3IoKSk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fYmFzZV9yb3BlLl9NX3RyZWVfcHRyID0gX19iYXNlX2xlYWY7CisJICBpZiAoMSA9PSBfX2V4cG9uZW50KQorCSAgICBfX3Jlc3VsdCA9IF9fYmFzZV9yb3BlOworCSAgZWxzZQorCSAgICBfX3Jlc3VsdCA9IHBvd2VyKF9fYmFzZV9yb3BlLCBfX2V4cG9uZW50LAorCQkJICAgICBfUm9wZV9Db25jYXRfZm48X0NoYXJULCBfQWxsb2M+KCkpOworCSAgICAKKwkgIGlmICgwICE9IF9fcmVtYWluZGVyKQorCSAgICBfX3Jlc3VsdCArPSBfX3JlbWFpbmRlcl9yb3BlOworCX0KKyAgICAgIGVsc2UKKwlfX3Jlc3VsdCA9IF9fcmVtYWluZGVyX3JvcGU7CisJICAKKyAgICAgIHRoaXMtPl9NX3RyZWVfcHRyID0gX19yZXN1bHQuX01fdHJlZV9wdHI7CisgICAgICB0aGlzLT5fTV90cmVlX3B0ci0+X01fcmVmX25vbm5pbCgpOworICAgIH0KKyAgICAgIAorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBfQ2hhclQKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6X1NfZW1wdHlfY19zdHJbMV07CisgICAgICAKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgY29uc3QgX0NoYXJUKgorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBjX3N0cigpIGNvbnN0CisgICAgeworICAgICAgaWYgKDAgPT0gdGhpcy0+X01fdHJlZV9wdHIpCisJeworCSAgX1NfZW1wdHlfY19zdHJbMF0gPSBfU19lb3MoKF9DaGFyVCopMCk7ICAvLyBQb3NzaWJseSByZWR1bmRhbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBwcm9iYWJseSBmYXN0LgorCSAgcmV0dXJuIF9TX2VtcHR5X2Nfc3RyOworCX0KKyAgICAgIF9fZ3RocmVhZF9tdXRleF9sb2NrICgmdGhpcy0+X01fdHJlZV9wdHItPl9NX2Nfc3RyaW5nX2xvY2spOworICAgICAgX19HQ19DT05TVCBfQ2hhclQqIF9fcmVzdWx0ID0gdGhpcy0+X01fdHJlZV9wdHItPl9NX2Nfc3RyaW5nOworICAgICAgaWYgKDAgPT0gX19yZXN1bHQpCisJeworCSAgc2l6ZV90IF9fcyA9IHNpemUoKTsKKwkgIF9fcmVzdWx0ID0gdGhpcy0+X0RhdGFfYWxsb2NhdGUoX19zICsgMSk7CisJICBfU19mbGF0dGVuKHRoaXMtPl9NX3RyZWVfcHRyLCBfX3Jlc3VsdCk7CisJICBfX3Jlc3VsdFtfX3NdID0gX1NfZW9zKChfQ2hhclQqKTApOworCSAgdGhpcy0+X01fdHJlZV9wdHItPl9NX2Nfc3RyaW5nID0gX19yZXN1bHQ7CisJfQorICAgICAgX19ndGhyZWFkX211dGV4X3VubG9jayAoJnRoaXMtPl9NX3RyZWVfcHRyLT5fTV9jX3N0cmluZ19sb2NrKTsKKyAgICAgIHJldHVybihfX3Jlc3VsdCk7CisgICAgfQorICAKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgY29uc3QgX0NoYXJUKiByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgcmVwbGFjZV93aXRoX2Nfc3RyKCkKKyAgICB7CisgICAgICBpZiAoMCA9PSB0aGlzLT5fTV90cmVlX3B0cikKKwl7CisJICBfU19lbXB0eV9jX3N0clswXSA9IF9TX2VvcygoX0NoYXJUKikwKTsKKwkgIHJldHVybiBfU19lbXB0eV9jX3N0cjsKKwl9CisgICAgICBfX0dDX0NPTlNUIF9DaGFyVCogX19vbGRfY19zdHJpbmcgPSB0aGlzLT5fTV90cmVlX3B0ci0+X01fY19zdHJpbmc7CisgICAgICBpZiAoX19kZXRhaWw6Ol9TX2xlYWYgPT0gdGhpcy0+X01fdHJlZV9wdHItPl9NX3RhZworCSAgJiYgMCAhPSBfX29sZF9jX3N0cmluZykKKwlyZXR1cm4oX19vbGRfY19zdHJpbmcpOworICAgICAgc2l6ZV90IF9fcyA9IHNpemUoKTsKKyAgICAgIF9DaGFyVCogX19yZXN1bHQgPSB0aGlzLT5fRGF0YV9hbGxvY2F0ZShfU19yb3VuZGVkX3VwX3NpemUoX19zKSk7CisgICAgICBfU19mbGF0dGVuKHRoaXMtPl9NX3RyZWVfcHRyLCBfX3Jlc3VsdCk7CisgICAgICBfX3Jlc3VsdFtfX3NdID0gX1NfZW9zKChfQ2hhclQqKTApOworICAgICAgdGhpcy0+X01fdHJlZV9wdHItPl9NX3VucmVmX25vbm5pbCgpOworICAgICAgdGhpcy0+X01fdHJlZV9wdHIgPSBfU19uZXdfUm9wZUxlYWYoX19yZXN1bHQsIF9fcywKKwkJCQkJICB0aGlzLT5fTV9nZXRfYWxsb2NhdG9yKCkpOworICAgICAgcmV0dXJuKF9fcmVzdWx0KTsKKyAgICB9CisKKyAgLy8gQWxnb3JpdGhtIHNwZWNpYWxpemF0aW9ucy4gIE1vcmUgc2hvdWxkIGJlIGFkZGVkLgorICAKKyAgdGVtcGxhdGU8Y2xhc3MgX1JvcGVfaXRlcmF0b3I+ICAvLyB3YXMgdGVtcGxhdGVkIG9uIENoYXJUIGFuZCBBbGxvYworICAgIHZvaWQJCSAgICAgICAgICAvLyBWQysrIHdvcmthcm91bmQKKyAgICBfUm9wZV9yb3RhdGUoX1JvcGVfaXRlcmF0b3IgX19maXJzdCwKKwkJIF9Sb3BlX2l0ZXJhdG9yIF9fbWlkZGxlLAorCQkgX1JvcGVfaXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JvcGVfaXRlcmF0b3I6OnZhbHVlX3R5cGUgX0NoYXJUOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUm9wZV9pdGVyYXRvcjo6X2FsbG9jYXRvcl90eXBlIF9BbGxvYzsKKyAgICAgIAorICAgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fcihfX2ZpcnN0LmNvbnRhaW5lcigpKTsKKyAgICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+IF9fcHJlZml4ID0gX19yLnN1YnN0cigwLCBfX2ZpcnN0LmluZGV4KCkpOworICAgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz4gX19zdWZmaXggPQorCV9fci5zdWJzdHIoX19sYXN0LmluZGV4KCksIF9fci5zaXplKCkgLSBfX2xhc3QuaW5kZXgoKSk7CisgICAgICByb3BlPF9DaGFyVCwgX0FsbG9jPiBfX3BhcnQxID0KKwlfX3Iuc3Vic3RyKF9fbWlkZGxlLmluZGV4KCksIF9fbGFzdC5pbmRleCgpIC0gX19taWRkbGUuaW5kZXgoKSk7CisgICAgICByb3BlPF9DaGFyVCwgX0FsbG9jPiBfX3BhcnQyID0KKwlfX3Iuc3Vic3RyKF9fZmlyc3QuaW5kZXgoKSwgX19taWRkbGUuaW5kZXgoKSAtIF9fZmlyc3QuaW5kZXgoKSk7CisgICAgICBfX3IgPSBfX3ByZWZpeDsKKyAgICAgIF9fciArPSBfX3BhcnQxOworICAgICAgX19yICs9IF9fcGFydDI7CisgICAgICBfX3IgKz0gX19zdWZmaXg7CisgICAgfQorCisjaWYgIWRlZmluZWQoX19HTlVDX18pCisgIC8vIEFwcGVhcnMgdG8gY29uZnVzZSBnKysKKyAgaW5saW5lIHZvaWQKKyAgcm90YXRlKF9Sb3BlX2l0ZXJhdG9yPGNoYXIsIF9fU1RMX0RFRkFVTFRfQUxMT0NBVE9SKGNoYXIpPiBfX2ZpcnN0LAorCSBfUm9wZV9pdGVyYXRvcjxjaGFyLCBfX1NUTF9ERUZBVUxUX0FMTE9DQVRPUihjaGFyKT4gX19taWRkbGUsCisJIF9Sb3BlX2l0ZXJhdG9yPGNoYXIsIF9fU1RMX0RFRkFVTFRfQUxMT0NBVE9SKGNoYXIpPiBfX2xhc3QpCisgIHsgX1JvcGVfcm90YXRlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QpOyB9CisjZW5kaWYKKworIyBpZiAwCisgIC8vIFByb2JhYmx5IG5vdCB1c2VmdWwgZm9yIHNldmVyYWwgcmVhc29uczoKKyAgLy8gLSBmb3IgU0dJcyA3LjEgY29tcGlsZXIgYW5kIHByb2JhYmx5IHNvbWUgb3RoZXJzLAorICAvLyAgIHRoaXMgZm9yY2VzIGxvdHMgb2Ygcm9wZTx3Y2hhcl90LCAuLi4+IGluc3RhbnRpYXRpb25zLCBjcmVhdGluZyBhCisgIC8vICAgY29kZSBibG9hdCBhbmQgY29tcGlsZSB0aW1lIHByb2JsZW0uICAoRml4ZWQgaW4gNy4yLikKKyAgLy8gLSB3Y2hhcl90IGlzIDQgYnl0ZXMgd2lkZSBvbiBtb3N0IFVOSVggcGxhdGZvcm1zLCBtYWtpbmcgaXQKKyAgLy8gICB1bmF0dHJhY3RpdmUgZm9yIHVuaWNvZGUgc3RyaW5ncy4gIFVuc2lnbmVkIHNob3J0IG1heSBiZSBhIGJldHRlcgorICAvLyAgIGNoYXJhY3RlciB0eXBlLgorICBpbmxpbmUgdm9pZAorICByb3RhdGUoX1JvcGVfaXRlcmF0b3I8d2NoYXJfdCwgX19TVExfREVGQVVMVF9BTExPQ0FUT1IoY2hhcik+IF9fZmlyc3QsCisJIF9Sb3BlX2l0ZXJhdG9yPHdjaGFyX3QsIF9fU1RMX0RFRkFVTFRfQUxMT0NBVE9SKGNoYXIpPiBfX21pZGRsZSwKKwkgX1JvcGVfaXRlcmF0b3I8d2NoYXJfdCwgX19TVExfREVGQVVMVF9BTExPQ0FUT1IoY2hhcik+IF9fbGFzdCkKKyAgeyBfUm9wZV9yb3RhdGUoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCk7IH0KKyMgZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvc2xpc3QgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9zbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWZhYzdmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvc2xpc3QKQEAgLTAsMCArMSwxMDgyIEBACisvLyBTaW5nbHktbGlua2VkIGxpc3QgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICovCisKKy8qKiBAZmlsZSBleHQvc2xpc3QKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeSAocG9zc2libHkKKyAqICBjb250YWluaW5nIGV4dGVuc2lvbnMgZnJvbSB0aGUgSFAvU0dJIFNUTCBzdWJzZXQpLiAKKyAqLworCisjaWZuZGVmIF9TTElTVAorI2RlZmluZSBfU0xJU1QgMQorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGJpdHMvYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfY29uc3RydWN0Lmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfdW5pbml0aWFsaXplZC5oPgorI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgc3RkOjpzaXplX3Q7CisgIHVzaW5nIHN0ZDo6cHRyZGlmZl90OworICB1c2luZyBzdGQ6Ol9Db25zdHJ1Y3Q7CisgIHVzaW5nIHN0ZDo6X0Rlc3Ryb3k7CisgIHVzaW5nIHN0ZDo6YWxsb2NhdG9yOworICB1c2luZyBzdGQ6Ol9fdHJ1ZV90eXBlOworICB1c2luZyBzdGQ6Ol9fZmFsc2VfdHlwZTsKKworICBzdHJ1Y3QgX1NsaXN0X25vZGVfYmFzZQorICB7CisgICAgX1NsaXN0X25vZGVfYmFzZSogX01fbmV4dDsKKyAgfTsKKyAgCisgIGlubGluZSBfU2xpc3Rfbm9kZV9iYXNlKgorICBfX3NsaXN0X21ha2VfbGluayhfU2xpc3Rfbm9kZV9iYXNlKiBfX3ByZXZfbm9kZSwKKwkJICAgIF9TbGlzdF9ub2RlX2Jhc2UqIF9fbmV3X25vZGUpCisgIHsKKyAgICBfX25ld19ub2RlLT5fTV9uZXh0ID0gX19wcmV2X25vZGUtPl9NX25leHQ7CisgICAgX19wcmV2X25vZGUtPl9NX25leHQgPSBfX25ld19ub2RlOworICAgIHJldHVybiBfX25ld19ub2RlOworICB9CisKKyAgaW5saW5lIF9TbGlzdF9ub2RlX2Jhc2UqCisgIF9fc2xpc3RfcHJldmlvdXMoX1NsaXN0X25vZGVfYmFzZSogX19oZWFkLAorCQkgICBjb25zdCBfU2xpc3Rfbm9kZV9iYXNlKiBfX25vZGUpCisgIHsKKyAgICB3aGlsZSAoX19oZWFkICYmIF9faGVhZC0+X01fbmV4dCAhPSBfX25vZGUpCisgICAgICBfX2hlYWQgPSBfX2hlYWQtPl9NX25leHQ7CisgICAgcmV0dXJuIF9faGVhZDsKKyAgfQorCisgIGlubGluZSBjb25zdCBfU2xpc3Rfbm9kZV9iYXNlKgorICBfX3NsaXN0X3ByZXZpb3VzKGNvbnN0IF9TbGlzdF9ub2RlX2Jhc2UqIF9faGVhZCwKKwkJICAgY29uc3QgX1NsaXN0X25vZGVfYmFzZSogX19ub2RlKQorICB7CisgICAgd2hpbGUgKF9faGVhZCAmJiBfX2hlYWQtPl9NX25leHQgIT0gX19ub2RlKQorICAgICAgX19oZWFkID0gX19oZWFkLT5fTV9uZXh0OworICAgIHJldHVybiBfX2hlYWQ7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3NsaXN0X3NwbGljZV9hZnRlcihfU2xpc3Rfbm9kZV9iYXNlKiBfX3BvcywKKwkJICAgICAgIF9TbGlzdF9ub2RlX2Jhc2UqIF9fYmVmb3JlX2ZpcnN0LAorCQkgICAgICAgX1NsaXN0X25vZGVfYmFzZSogX19iZWZvcmVfbGFzdCkKKyAgeworICAgIGlmIChfX3BvcyAhPSBfX2JlZm9yZV9maXJzdCAmJiBfX3BvcyAhPSBfX2JlZm9yZV9sYXN0KQorICAgICAgeworCV9TbGlzdF9ub2RlX2Jhc2UqIF9fZmlyc3QgPSBfX2JlZm9yZV9maXJzdC0+X01fbmV4dDsKKwlfU2xpc3Rfbm9kZV9iYXNlKiBfX2FmdGVyID0gX19wb3MtPl9NX25leHQ7CisJX19iZWZvcmVfZmlyc3QtPl9NX25leHQgPSBfX2JlZm9yZV9sYXN0LT5fTV9uZXh0OworCV9fcG9zLT5fTV9uZXh0ID0gX19maXJzdDsKKwlfX2JlZm9yZV9sYXN0LT5fTV9uZXh0ID0gX19hZnRlcjsKKyAgICAgIH0KKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fc2xpc3Rfc3BsaWNlX2FmdGVyKF9TbGlzdF9ub2RlX2Jhc2UqIF9fcG9zLCBfU2xpc3Rfbm9kZV9iYXNlKiBfX2hlYWQpCisgIHsKKyAgICBfU2xpc3Rfbm9kZV9iYXNlKiBfX2JlZm9yZV9sYXN0ID0gX19zbGlzdF9wcmV2aW91cyhfX2hlYWQsIDApOworICAgIGlmIChfX2JlZm9yZV9sYXN0ICE9IF9faGVhZCkKKyAgICAgIHsKKwlfU2xpc3Rfbm9kZV9iYXNlKiBfX2FmdGVyID0gX19wb3MtPl9NX25leHQ7CisJX19wb3MtPl9NX25leHQgPSBfX2hlYWQtPl9NX25leHQ7CisJX19oZWFkLT5fTV9uZXh0ID0gMDsKKwlfX2JlZm9yZV9sYXN0LT5fTV9uZXh0ID0gX19hZnRlcjsKKyAgICAgIH0KKyAgfQorCisgIGlubGluZSBfU2xpc3Rfbm9kZV9iYXNlKgorICBfX3NsaXN0X3JldmVyc2UoX1NsaXN0X25vZGVfYmFzZSogX19ub2RlKQorICB7CisgICAgX1NsaXN0X25vZGVfYmFzZSogX19yZXN1bHQgPSBfX25vZGU7CisgICAgX19ub2RlID0gX19ub2RlLT5fTV9uZXh0OworICAgIF9fcmVzdWx0LT5fTV9uZXh0ID0gMDsKKyAgICB3aGlsZShfX25vZGUpCisgICAgICB7CisJX1NsaXN0X25vZGVfYmFzZSogX19uZXh0ID0gX19ub2RlLT5fTV9uZXh0OworCV9fbm9kZS0+X01fbmV4dCA9IF9fcmVzdWx0OworCV9fcmVzdWx0ID0gX19ub2RlOworCV9fbm9kZSA9IF9fbmV4dDsKKyAgICAgIH0KKyAgICByZXR1cm4gX19yZXN1bHQ7CisgIH0KKworICBpbmxpbmUgc2l6ZV90CisgIF9fc2xpc3Rfc2l6ZShfU2xpc3Rfbm9kZV9iYXNlKiBfX25vZGUpCisgIHsKKyAgICBzaXplX3QgX19yZXN1bHQgPSAwOworICAgIGZvciAoOyBfX25vZGUgIT0gMDsgX19ub2RlID0gX19ub2RlLT5fTV9uZXh0KQorICAgICAgKytfX3Jlc3VsdDsKKyAgICByZXR1cm4gX19yZXN1bHQ7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIHN0cnVjdCBfU2xpc3Rfbm9kZSA6IHB1YmxpYyBfU2xpc3Rfbm9kZV9iYXNlCisgICAgeworICAgICAgX1RwIF9NX2RhdGE7CisgICAgfTsKKworICBzdHJ1Y3QgX1NsaXN0X2l0ZXJhdG9yX2Jhc2UKKyAgeworICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICBfU2xpc3Rfbm9kZV9iYXNlKiBfTV9ub2RlOworICAgIAorICAgIF9TbGlzdF9pdGVyYXRvcl9iYXNlKF9TbGlzdF9ub2RlX2Jhc2UqIF9feCkKKyAgICA6IF9NX25vZGUoX194KSB7fQorCisgICAgdm9pZAorICAgIF9NX2luY3IoKQorICAgIHsgX01fbm9kZSA9IF9NX25vZGUtPl9NX25leHQ7IH0KKworICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9TbGlzdF9pdGVyYXRvcl9iYXNlJiBfX3gpIGNvbnN0CisgICAgeyByZXR1cm4gX01fbm9kZSA9PSBfX3guX01fbm9kZTsgfQorCisgICAgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX1NsaXN0X2l0ZXJhdG9yX2Jhc2UmIF9feCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9ub2RlICE9IF9feC5fTV9ub2RlOyB9CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1JlZiwgY2xhc3MgX1B0cj4KKyAgICBzdHJ1Y3QgX1NsaXN0X2l0ZXJhdG9yIDogcHVibGljIF9TbGlzdF9pdGVyYXRvcl9iYXNlCisgICAgeworICAgICAgdHlwZWRlZiBfU2xpc3RfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX1NsaXN0X2l0ZXJhdG9yPF9UcCwgY29uc3QgX1RwJiwgY29uc3QgX1RwKj4gY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9TbGlzdF9pdGVyYXRvcjxfVHAsIF9SZWYsIF9QdHI+ICAgICAgICAgICAgIF9TZWxmOworCisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1B0ciAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBfUmVmICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgX1NsaXN0X25vZGU8X1RwPiBfTm9kZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIF9TbGlzdF9pdGVyYXRvcihfTm9kZSogX194KQorICAgICAgOiBfU2xpc3RfaXRlcmF0b3JfYmFzZShfX3gpIHt9CisKKyAgICAgIF9TbGlzdF9pdGVyYXRvcigpCisgICAgICA6IF9TbGlzdF9pdGVyYXRvcl9iYXNlKDApIHt9CisKKyAgICAgIF9TbGlzdF9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX194KQorICAgICAgOiBfU2xpc3RfaXRlcmF0b3JfYmFzZShfX3guX01fbm9kZSkge30KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gKChfTm9kZSopIF9NX25vZGUpLT5fTV9kYXRhOyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeyByZXR1cm4gJihvcGVyYXRvciooKSk7IH0KKworICAgICAgX1NlbGYmCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwlfTV9pbmNyKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfU2VsZgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisJX1NlbGYgX190bXAgPSAqdGhpczsKKwlfTV9pbmNyKCk7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfU2xpc3RfYmFzZQorICAgIDogcHVibGljIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9TbGlzdF9ub2RlPF9UcD4gPjo6b3RoZXIKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9TbGlzdF9ub2RlPF9UcD4gPjo6b3RoZXIKKyAgICAgICAgX05vZGVfYWxsb2M7CisgICAgICB0eXBlZGVmIF9BbGxvYyBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IF9Ob2RlX2FsbG9jKj4odGhpcyk7IH0KKworICAgICAgX1NsaXN0X2Jhc2UoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogX05vZGVfYWxsb2MoX19hKQorICAgICAgeyB0aGlzLT5fTV9oZWFkLl9NX25leHQgPSAwOyB9CisKKyAgICAgIH5fU2xpc3RfYmFzZSgpCisgICAgICB7IF9NX2VyYXNlX2FmdGVyKCZ0aGlzLT5fTV9oZWFkLCAwKTsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgX1NsaXN0X25vZGVfYmFzZSBfTV9oZWFkOworCisgICAgICBfU2xpc3Rfbm9kZTxfVHA+KgorICAgICAgX01fZ2V0X25vZGUoKQorICAgICAgeyByZXR1cm4gX05vZGVfYWxsb2M6OmFsbG9jYXRlKDEpOyB9CisgIAorICAgICAgdm9pZAorICAgICAgX01fcHV0X25vZGUoX1NsaXN0X25vZGU8X1RwPiogX19wKQorICAgICAgeyBfTm9kZV9hbGxvYzo6ZGVhbGxvY2F0ZShfX3AsIDEpOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfU2xpc3Rfbm9kZV9iYXNlKiBfTV9lcmFzZV9hZnRlcihfU2xpc3Rfbm9kZV9iYXNlKiBfX3BvcykKKyAgICAgIHsKKwlfU2xpc3Rfbm9kZTxfVHA+KiBfX25leHQgPSAoX1NsaXN0X25vZGU8X1RwPiopIChfX3Bvcy0+X01fbmV4dCk7CisJX1NsaXN0X25vZGVfYmFzZSogX19uZXh0X25leHQgPSBfX25leHQtPl9NX25leHQ7CisJX19wb3MtPl9NX25leHQgPSBfX25leHRfbmV4dDsKKwlnZXRfYWxsb2NhdG9yKCkuZGVzdHJveSgmX19uZXh0LT5fTV9kYXRhKTsKKwlfTV9wdXRfbm9kZShfX25leHQpOworCXJldHVybiBfX25leHRfbmV4dDsKKyAgICAgIH0KKyAgICAgIF9TbGlzdF9ub2RlX2Jhc2UqIF9NX2VyYXNlX2FmdGVyKF9TbGlzdF9ub2RlX2Jhc2UqLCBfU2xpc3Rfbm9kZV9iYXNlKik7CisgICAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgX1NsaXN0X25vZGVfYmFzZSoKKyAgICBfU2xpc3RfYmFzZTxfVHAsX0FsbG9jPjo6X01fZXJhc2VfYWZ0ZXIoX1NsaXN0X25vZGVfYmFzZSogX19iZWZvcmVfZmlyc3QsCisJCQkJCSAgICBfU2xpc3Rfbm9kZV9iYXNlKiBfX2xhc3Rfbm9kZSkKKyAgICB7CisgICAgICBfU2xpc3Rfbm9kZTxfVHA+KiBfX2N1ciA9IChfU2xpc3Rfbm9kZTxfVHA+KikgKF9fYmVmb3JlX2ZpcnN0LT5fTV9uZXh0KTsKKyAgICAgIHdoaWxlIChfX2N1ciAhPSBfX2xhc3Rfbm9kZSkKKwl7CisJICBfU2xpc3Rfbm9kZTxfVHA+KiBfX3RtcCA9IF9fY3VyOworCSAgX19jdXIgPSAoX1NsaXN0X25vZGU8X1RwPiopIF9fY3VyLT5fTV9uZXh0OworCSAgZ2V0X2FsbG9jYXRvcigpLmRlc3Ryb3koJl9fdG1wLT5fTV9kYXRhKTsKKwkgIF9NX3B1dF9ub2RlKF9fdG1wKTsKKwl9CisgICAgICBfX2JlZm9yZV9maXJzdC0+X01fbmV4dCA9IF9fbGFzdF9ub2RlOworICAgICAgcmV0dXJuIF9fbGFzdF9ub2RlOworICAgIH0KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICAqLworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8X1RwPiA+CisgICAgY2xhc3Mgc2xpc3QgOiBwcml2YXRlIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+CisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfVHAsIF9TR0lBc3NpZ25hYmxlQ29uY2VwdCkKKwkKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfU2xpc3RfYmFzZTxfVHAsX0FsbG9jPiBfQmFzZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdmFsdWVfdHlwZSogICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdmFsdWVfdHlwZSYgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHNpemVfdCAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgCisgICAgICB0eXBlZGVmIF9TbGlzdF9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+ICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfU2xpc3RfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiBjb25zdF9pdGVyYXRvcjsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9CYXNlOjpnZXRfYWxsb2NhdG9yKCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9TbGlzdF9ub2RlPF9UcD4gICAgICBfTm9kZTsKKyAgICAgIHR5cGVkZWYgX1NsaXN0X25vZGVfYmFzZSAgICAgIF9Ob2RlX2Jhc2U7CisgICAgICB0eXBlZGVmIF9TbGlzdF9pdGVyYXRvcl9iYXNlICBfSXRlcmF0b3JfYmFzZTsKKyAgICAgIAorICAgICAgX05vZGUqCisgICAgICBfTV9jcmVhdGVfbm9kZShjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7CisJX05vZGUqIF9fbm9kZSA9IHRoaXMtPl9NX2dldF9ub2RlKCk7CisJX190cnkKKwkgIHsKKwkgICAgZ2V0X2FsbG9jYXRvcigpLmNvbnN0cnVjdCgmX19ub2RlLT5fTV9kYXRhLCBfX3gpOworCSAgICBfX25vZGUtPl9NX25leHQgPSAwOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICB0aGlzLT5fTV9wdXRfbm9kZShfX25vZGUpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKwlyZXR1cm4gX19ub2RlOworICAgICAgfQorCisgICAgICBfTm9kZSoKKyAgICAgIF9NX2NyZWF0ZV9ub2RlKCkKKyAgICAgIHsKKwlfTm9kZSogX19ub2RlID0gdGhpcy0+X01fZ2V0X25vZGUoKTsKKwlfX3RyeQorCSAgeworCSAgICBnZXRfYWxsb2NhdG9yKCkuY29uc3RydWN0KCZfX25vZGUtPl9NX2RhdGEsIHZhbHVlX3R5cGUoKSk7CisJICAgIF9fbm9kZS0+X01fbmV4dCA9IDA7CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIHRoaXMtPl9NX3B1dF9ub2RlKF9fbm9kZSk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorCXJldHVybiBfX25vZGU7CisgICAgICB9CisKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdAorICAgICAgc2xpc3QoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fYSkge30KKworICAgICAgc2xpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194LAorCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fYSkKKyAgICAgIHsgX01faW5zZXJ0X2FmdGVyX2ZpbGwoJnRoaXMtPl9NX2hlYWQsIF9fbiwgX194KTsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgc2xpc3Qoc2l6ZV90eXBlIF9fbikKKyAgICAgIDogX0Jhc2UoYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIHsgX01faW5zZXJ0X2FmdGVyX2ZpbGwoJnRoaXMtPl9NX2hlYWQsIF9fbiwgdmFsdWVfdHlwZSgpKTsgfQorCisgICAgICAvLyBXZSBkb24ndCBuZWVkIGFueSBkaXNwYXRjaGluZyB0cmlja3MgaGVyZSwgYmVjYXVzZQorICAgICAgLy8gX01faW5zZXJ0X2FmdGVyX3JhbmdlIGFscmVhZHkgZG9lcyB0aGVtLgorICAgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBzbGlzdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9ICBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19hKQorICAgICAgICB7IF9NX2luc2VydF9hZnRlcl9yYW5nZSgmdGhpcy0+X01faGVhZCwgX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICBzbGlzdChjb25zdCBzbGlzdCYgX194KQorICAgICAgOiBfQmFzZShfX3guZ2V0X2FsbG9jYXRvcigpKQorICAgICAgeyBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoJnRoaXMtPl9NX2hlYWQsIF9feC5iZWdpbigpLCBfX3guZW5kKCkpOyB9CisKKyAgICAgIHNsaXN0JgorICAgICAgb3BlcmF0b3I9IChjb25zdCBzbGlzdCYgX194KTsKKworICAgICAgfnNsaXN0KCkge30KKworICAgIHB1YmxpYzoKKyAgICAgIC8vIGFzc2lnbigpLCBhIGdlbmVyYWxpemVkIGFzc2lnbm1lbnQgbWVtYmVyIGZ1bmN0aW9uLiAgVHdvCisgICAgICAvLyB2ZXJzaW9uczogb25lIHRoYXQgdGFrZXMgYSBjb3VudCwgYW5kIG9uZSB0aGF0IHRha2VzIGEgcmFuZ2UuCisgICAgICAvLyBUaGUgcmFuZ2UgdmVyc2lvbiBpcyBhIG1lbWJlciB0ZW1wbGF0ZSwgc28gd2UgZGlzcGF0Y2ggb24gd2hldGhlcgorICAgICAgLy8gb3Igbm90IHRoZSB0eXBlIGlzIGFuIGludGVnZXIuCisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKQorICAgICAgeyBfTV9maWxsX2Fzc2lnbihfX24sIF9fdmFsKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9maWxsX2Fzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKTsKKworICAgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+OjpfX3R5cGUgX0ludGVncmFsOworCSAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworCX0KKworICAgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICAgICAgdm9pZAorICAgICAgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsIF9fdHJ1ZV90eXBlKQorICAgICAgeyBfTV9maWxsX2Fzc2lnbigoc2l6ZV90eXBlKSBfX24sIChfVHApIF9fdmFsKTsgfQorCisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkJIF9fZmFsc2VfdHlwZSk7CisKKyAgICBwdWJsaWM6CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpCisgICAgICB7IHJldHVybiBpdGVyYXRvcigoX05vZGUqKXRoaXMtPl9NX2hlYWQuX01fbmV4dCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKChfTm9kZSopdGhpcy0+X01faGVhZC5fTV9uZXh0KTt9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoMCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcigwKTsgfQorCisgICAgICAvLyBFeHBlcmltZW50YWwgbmV3IGZlYXR1cmU6IGJlZm9yZV9iZWdpbigpIHJldHVybnMgYQorICAgICAgLy8gbm9uLWRlcmVmZXJlbmNlYWJsZSBpdGVyYXRvciB0aGF0LCB3aGVuIGluY3JlbWVudGVkLCB5aWVsZHMKKyAgICAgIC8vIGJlZ2luKCkuICBUaGlzIGl0ZXJhdG9yIG1heSBiZSB1c2VkIGFzIHRoZSBhcmd1bWVudCB0bworICAgICAgLy8gaW5zZXJ0X2FmdGVyLCBlcmFzZV9hZnRlciwgZXRjLiAgTm90ZSB0aGF0IGV2ZW4gZm9yIGFuIGVtcHR5CisgICAgICAvLyBzbGlzdCwgYmVmb3JlX2JlZ2luKCkgaXMgbm90IHRoZSBzYW1lIGl0ZXJhdG9yIGFzIGVuZCgpLiAgSXQKKyAgICAgIC8vIGlzIGFsd2F5cyBuZWNlc3NhcnkgdG8gaW5jcmVtZW50IGJlZm9yZV9iZWdpbigpIGF0IGxlYXN0IG9uY2UgdG8KKyAgICAgIC8vIG9idGFpbiBlbmQoKS4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWZvcmVfYmVnaW4oKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoKF9Ob2RlKikgJnRoaXMtPl9NX2hlYWQpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWZvcmVfYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoKF9Ob2RlKikgJnRoaXMtPl9NX2hlYWQpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3NsaXN0X3NpemUodGhpcy0+X01faGVhZC5fTV9uZXh0KTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHNpemVfdHlwZSgtMSk7IH0KKworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01faGVhZC5fTV9uZXh0ID09IDA7IH0KKworICAgICAgdm9pZAorICAgICAgc3dhcChzbGlzdCYgX194KQorICAgICAgeyBzdGQ6OnN3YXAodGhpcy0+X01faGVhZC5fTV9uZXh0LCBfX3guX01faGVhZC5fTV9uZXh0KTsgfQorCisgICAgcHVibGljOgorCisgICAgICByZWZlcmVuY2UKKyAgICAgIGZyb250KCkKKyAgICAgIHsgcmV0dXJuICgoX05vZGUqKSB0aGlzLT5fTV9oZWFkLl9NX25leHQpLT5fTV9kYXRhOyB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgZnJvbnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gKChfTm9kZSopIHRoaXMtPl9NX2hlYWQuX01fbmV4dCktPl9NX2RhdGE7IH0KKworICAgICAgdm9pZAorICAgICAgcHVzaF9mcm9udChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IF9fc2xpc3RfbWFrZV9saW5rKCZ0aGlzLT5fTV9oZWFkLCBfTV9jcmVhdGVfbm9kZShfX3gpKTsgfQorCisgICAgICB2b2lkCisgICAgICBwdXNoX2Zyb250KCkKKyAgICAgIHsgX19zbGlzdF9tYWtlX2xpbmsoJnRoaXMtPl9NX2hlYWQsIF9NX2NyZWF0ZV9ub2RlKCkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHBvcF9mcm9udCgpCisgICAgICB7CisJX05vZGUqIF9fbm9kZSA9IChfTm9kZSopIHRoaXMtPl9NX2hlYWQuX01fbmV4dDsKKwl0aGlzLT5fTV9oZWFkLl9NX25leHQgPSBfX25vZGUtPl9NX25leHQ7CisJZ2V0X2FsbG9jYXRvcigpLmRlc3Ryb3koJl9fbm9kZS0+X01fZGF0YSk7CisJdGhpcy0+X01fcHV0X25vZGUoX19ub2RlKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIHByZXZpb3VzKGNvbnN0X2l0ZXJhdG9yIF9fcG9zKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoKF9Ob2RlKikgX19zbGlzdF9wcmV2aW91cygmdGhpcy0+X01faGVhZCwKKwkJCQkJCSAgX19wb3MuX01fbm9kZSkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBwcmV2aW91cyhjb25zdF9pdGVyYXRvciBfX3BvcykgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKChfTm9kZSopIF9fc2xpc3RfcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQsCisJCQkJCQkJX19wb3MuX01fbm9kZSkpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX05vZGUqCisgICAgICBfTV9pbnNlcnRfYWZ0ZXIoX05vZGVfYmFzZSogX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIChfTm9kZSopIChfX3NsaXN0X21ha2VfbGluayhfX3BvcywgX01fY3JlYXRlX25vZGUoX194KSkpOyB9CisKKyAgICAgIF9Ob2RlKgorICAgICAgX01faW5zZXJ0X2FmdGVyKF9Ob2RlX2Jhc2UqIF9fcG9zKQorICAgICAgeyByZXR1cm4gKF9Ob2RlKikgKF9fc2xpc3RfbWFrZV9saW5rKF9fcG9zLCBfTV9jcmVhdGVfbm9kZSgpKSk7IH0KKworICAgICAgdm9pZAorICAgICAgX01faW5zZXJ0X2FmdGVyX2ZpbGwoX05vZGVfYmFzZSogX19wb3MsCisJCQkgICBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7CisJZm9yIChzaXplX3R5cGUgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKwkgIF9fcG9zID0gX19zbGlzdF9tYWtlX2xpbmsoX19wb3MsIF9NX2NyZWF0ZV9ub2RlKF9feCkpOworICAgICAgfQorCisgICAgICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5JdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX05vZGVfYmFzZSogX19wb3MsCisJCQkgICAgICBfSW5JdGVyYXRvciBfX2ZpcnN0LCBfSW5JdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2lzX2ludGVnZXI8X0luSXRlcmF0b3I+OjpfX3R5cGUgX0ludGVncmFsOworCSAgX01faW5zZXJ0X2FmdGVyX3JhbmdlKF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX05vZGVfYmFzZSogX19wb3MsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LAorCQkJICAgICAgX190cnVlX3R5cGUpCisgICAgICAgIHsgX01faW5zZXJ0X2FmdGVyX2ZpbGwoX19wb3MsIF9fbiwgX194KTsgfQorCisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0luSXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01faW5zZXJ0X2FmdGVyX3JhbmdlKF9Ob2RlX2Jhc2UqIF9fcG9zLAorCQkJICAgICAgX0luSXRlcmF0b3IgX19maXJzdCwgX0luSXRlcmF0b3IgX19sYXN0LAorCQkJICAgICAgX19mYWxzZV90eXBlKQorICAgICAgICB7CisJICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJICAgIHsKKwkgICAgICBfX3BvcyA9IF9fc2xpc3RfbWFrZV9saW5rKF9fcG9zLCBfTV9jcmVhdGVfbm9kZSgqX19maXJzdCkpOworCSAgICAgICsrX19maXJzdDsKKwkgICAgfQorCX0KKworICAgIHB1YmxpYzoKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2luc2VydF9hZnRlcihfX3Bvcy5fTV9ub2RlLCBfX3gpKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zKQorICAgICAgeyByZXR1cm4gaW5zZXJ0X2FmdGVyKF9fcG9zLCB2YWx1ZV90eXBlKCkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyBfTV9pbnNlcnRfYWZ0ZXJfZmlsbChfX3Bvcy5fTV9ub2RlLCBfX24sIF9feCk7IH0KKworICAgICAgLy8gV2UgZG9uJ3QgbmVlZCBhbnkgZGlzcGF0Y2hpbmcgdHJpY2tzIGhlcmUsIGJlY2F1c2UKKyAgICAgIC8vIF9NX2luc2VydF9hZnRlcl9yYW5nZSBhbHJlYWR5IGRvZXMgdGhlbS4KKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5JdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIF9Jbkl0ZXJhdG9yIF9fZmlyc3QsIF9Jbkl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeyBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX19wb3MuX01fbm9kZSwgX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfTV9pbnNlcnRfYWZ0ZXIoX19zbGlzdF9wcmV2aW91cygmdGhpcy0+X01faGVhZCwKKwkJCQkJCQkgX19wb3MuX01fbm9kZSksCisJCQkJCV9feCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3MpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfTV9pbnNlcnRfYWZ0ZXIoX19zbGlzdF9wcmV2aW91cygmdGhpcy0+X01faGVhZCwKKwkJCQkJCQkgX19wb3MuX01fbm9kZSksCisJCQkJCXZhbHVlX3R5cGUoKSkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyBfTV9pbnNlcnRfYWZ0ZXJfZmlsbChfX3NsaXN0X3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLCBfX3Bvcy5fTV9ub2RlKSwKKwkJCSAgICAgX19uLCBfX3gpOyB9CisKKyAgICAgIC8vIFdlIGRvbid0IG5lZWQgYW55IGRpc3BhdGNoaW5nIHRyaWNrcyBoZXJlLCBiZWNhdXNlCisgICAgICAvLyBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UgYWxyZWFkeSBkb2VzIHRoZW0uCisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0luSXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBfSW5JdGVyYXRvciBfX2ZpcnN0LCBfSW5JdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsgX01faW5zZXJ0X2FmdGVyX3JhbmdlKF9fc2xpc3RfcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQsIF9fcG9zLl9NX25vZGUpLAorCQkJCV9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZV9hZnRlcihpdGVyYXRvciBfX3BvcykKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKChfTm9kZSopIHRoaXMtPl9NX2VyYXNlX2FmdGVyKF9fcG9zLl9NX25vZGUpKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2VfYWZ0ZXIoaXRlcmF0b3IgX19iZWZvcmVfZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgCisJcmV0dXJuIGl0ZXJhdG9yKChfTm9kZSopIHRoaXMtPl9NX2VyYXNlX2FmdGVyKF9fYmVmb3JlX2ZpcnN0Ll9NX25vZGUsCisJCQkJCQkgICAgICBfX2xhc3QuX01fbm9kZSkpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3MpCisgICAgICB7IAorCXJldHVybiBpdGVyYXRvcigoX05vZGUqKSB0aGlzLT5fTV9lcmFzZV9hZnRlcgorCQkJKF9fc2xpc3RfcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQsIF9fcG9zLl9NX25vZGUpKSk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7IAorCXJldHVybiBpdGVyYXRvcigoX05vZGUqKSB0aGlzLT5fTV9lcmFzZV9hZnRlcgorCQkJKF9fc2xpc3RfcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQsIF9fZmlyc3QuX01fbm9kZSksCisJCQkgX19sYXN0Ll9NX25vZGUpKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBuZXdfc2l6ZSwgY29uc3QgX1RwJiBfX3gpOworCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIG5ld19zaXplKQorICAgICAgeyByZXNpemUobmV3X3NpemUsIF9UcCgpKTsgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7IHRoaXMtPl9NX2VyYXNlX2FmdGVyKCZ0aGlzLT5fTV9oZWFkLCAwKTsgfQorCisgICAgcHVibGljOgorICAgICAgLy8gTW92ZXMgdGhlIHJhbmdlIFtfX2JlZm9yZV9maXJzdCArIDEsIF9fYmVmb3JlX2xhc3QgKyAxKSB0byAqdGhpcywKKyAgICAgIC8vICBpbnNlcnRpbmcgaXQgaW1tZWRpYXRlbHkgYWZ0ZXIgX19wb3MuICBUaGlzIGlzIGNvbnN0YW50IHRpbWUuCisgICAgICB2b2lkCisgICAgICBzcGxpY2VfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsCisJCSAgIGl0ZXJhdG9yIF9fYmVmb3JlX2ZpcnN0LCBpdGVyYXRvciBfX2JlZm9yZV9sYXN0KQorICAgICAgeworCWlmIChfX2JlZm9yZV9maXJzdCAhPSBfX2JlZm9yZV9sYXN0KQorCSAgX19zbGlzdF9zcGxpY2VfYWZ0ZXIoX19wb3MuX01fbm9kZSwgX19iZWZvcmVfZmlyc3QuX01fbm9kZSwKKwkJCSAgICAgICBfX2JlZm9yZV9sYXN0Ll9NX25vZGUpOworICAgICAgfQorCisgICAgICAvLyBNb3ZlcyB0aGUgZWxlbWVudCB0aGF0IGZvbGxvd3MgX19wcmV2IHRvICp0aGlzLCBpbnNlcnRpbmcgaXQKKyAgICAgIC8vIGltbWVkaWF0ZWx5IGFmdGVyIF9fcG9zLiAgVGhpcyBpcyBjb25zdGFudCB0aW1lLgorICAgICAgdm9pZAorICAgICAgc3BsaWNlX2FmdGVyKGl0ZXJhdG9yIF9fcG9zLCBpdGVyYXRvciBfX3ByZXYpCisgICAgICB7IF9fc2xpc3Rfc3BsaWNlX2FmdGVyKF9fcG9zLl9NX25vZGUsCisJCQkgICAgIF9fcHJldi5fTV9ub2RlLCBfX3ByZXYuX01fbm9kZS0+X01fbmV4dCk7IH0KKworICAgICAgLy8gUmVtb3ZlcyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gdGhlIGxpc3QgX194IHRvICp0aGlzLCBpbnNlcnRpbmcKKyAgICAgIC8vIHRoZW0gaW1tZWRpYXRlbHkgYWZ0ZXIgX19wb3MuICBfX3ggbXVzdCBub3QgYmUgKnRoaXMuICBDb21wbGV4aXR5OgorICAgICAgLy8gbGluZWFyIGluIF9feC5zaXplKCkuCisgICAgICB2b2lkCisgICAgICBzcGxpY2VfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIHNsaXN0JiBfX3gpCisgICAgICB7IF9fc2xpc3Rfc3BsaWNlX2FmdGVyKF9fcG9zLl9NX25vZGUsICZfX3guX01faGVhZCk7IH0KKworICAgICAgLy8gTGluZWFyIGluIGRpc3RhbmNlKGJlZ2luKCksIF9fcG9zKSwgYW5kIGxpbmVhciBpbiBfX3guc2l6ZSgpLgorICAgICAgdm9pZAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zLCBzbGlzdCYgX194KQorICAgICAgeworCWlmIChfX3guX01faGVhZC5fTV9uZXh0KQorCSAgX19zbGlzdF9zcGxpY2VfYWZ0ZXIoX19zbGlzdF9wcmV2aW91cygmdGhpcy0+X01faGVhZCwgX19wb3MuX01fbm9kZSksCisJCQkgICAgICAgJl9feC5fTV9oZWFkLAorCQkJICAgICAgIF9fc2xpc3RfcHJldmlvdXMoJl9feC5fTV9oZWFkLCAwKSk7IH0KKworICAgICAgLy8gTGluZWFyIGluIGRpc3RhbmNlKGJlZ2luKCksIF9fcG9zKSwgYW5kIGluIGRpc3RhbmNlKF9feC5iZWdpbigpLCBfX2kpLgorICAgICAgdm9pZAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zLCBzbGlzdCYgX194LCBpdGVyYXRvciBfX2kpCisgICAgICB7IF9fc2xpc3Rfc3BsaWNlX2FmdGVyKF9fc2xpc3RfcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQsIF9fcG9zLl9NX25vZGUpLAorCQkJICAgICBfX3NsaXN0X3ByZXZpb3VzKCZfX3guX01faGVhZCwgX19pLl9NX25vZGUpLAorCQkJICAgICBfX2kuX01fbm9kZSk7IH0KKworICAgICAgLy8gTGluZWFyIGluIGRpc3RhbmNlKGJlZ2luKCksIF9fcG9zKSwgaW4gZGlzdGFuY2UoX194LmJlZ2luKCksIF9fZmlyc3QpLAorICAgICAgLy8gYW5kIGluIGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCkuCisgICAgICB2b2lkCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIHNsaXN0JiBfX3gsIGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwlpZiAoX19maXJzdCAhPSBfX2xhc3QpCisJICBfX3NsaXN0X3NwbGljZV9hZnRlcihfX3NsaXN0X3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLCBfX3Bvcy5fTV9ub2RlKSwKKwkJCSAgICAgICBfX3NsaXN0X3ByZXZpb3VzKCZfX3guX01faGVhZCwgX19maXJzdC5fTV9ub2RlKSwKKwkJCSAgICAgICBfX3NsaXN0X3ByZXZpb3VzKF9fZmlyc3QuX01fbm9kZSwKKwkJCQkJCV9fbGFzdC5fTV9ub2RlKSk7CisgICAgICB9CisKKyAgICBwdWJsaWM6CisgICAgICB2b2lkCisgICAgICByZXZlcnNlKCkKKyAgICAgIHsKKwlpZiAodGhpcy0+X01faGVhZC5fTV9uZXh0KQorCSAgdGhpcy0+X01faGVhZC5fTV9uZXh0ID0gX19zbGlzdF9yZXZlcnNlKHRoaXMtPl9NX2hlYWQuX01fbmV4dCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlbW92ZShjb25zdCBfVHAmIF9fdmFsKTsKKworICAgICAgdm9pZAorICAgICAgdW5pcXVlKCk7CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIG1lcmdlKHNsaXN0JiBfX3gpOworICAgICAgCisgICAgICB2b2lkCisgICAgICBzb3J0KCk7CisKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPgorICAgICAgICB2b2lkCisgICAgICAgIHJlbW92ZV9pZihfUHJlZGljYXRlIF9fcHJlZCk7CisKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorICAgICAgICB2b2lkCisgICAgICAgIHVuaXF1ZShfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCk7CisKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgorICAgICAgICB2b2lkCisgICAgICAgIG1lcmdlKHNsaXN0JiwgX1N0cmljdFdlYWtPcmRlcmluZyk7CisKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgorICAgICAgICB2b2lkCisgICAgICAgIHNvcnQoX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApOworICAgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIHNsaXN0PF9UcCwgX0FsbG9jPiYKKyAgICBzbGlzdDxfVHAsIF9BbGxvYz46Om9wZXJhdG9yPShjb25zdCBzbGlzdDxfVHAsIF9BbGxvYz4mIF9feCkKKyAgICB7CisgICAgICBpZiAoJl9feCAhPSB0aGlzKQorCXsKKwkgIF9Ob2RlX2Jhc2UqIF9fcDEgPSAmdGhpcy0+X01faGVhZDsKKwkgIF9Ob2RlKiBfX24xID0gKF9Ob2RlKikgdGhpcy0+X01faGVhZC5fTV9uZXh0OworCSAgY29uc3QgX05vZGUqIF9fbjIgPSAoY29uc3QgX05vZGUqKSBfX3guX01faGVhZC5fTV9uZXh0OworCSAgd2hpbGUgKF9fbjEgJiYgX19uMikKKwkgICAgeworCSAgICAgIF9fbjEtPl9NX2RhdGEgPSBfX24yLT5fTV9kYXRhOworCSAgICAgIF9fcDEgPSBfX24xOworCSAgICAgIF9fbjEgPSAoX05vZGUqKSBfX24xLT5fTV9uZXh0OworCSAgICAgIF9fbjIgPSAoY29uc3QgX05vZGUqKSBfX24yLT5fTV9uZXh0OworCSAgICB9CisJICBpZiAoX19uMiA9PSAwKQorCSAgICB0aGlzLT5fTV9lcmFzZV9hZnRlcihfX3AxLCAwKTsKKwkgIGVsc2UKKwkgICAgX01faW5zZXJ0X2FmdGVyX3JhbmdlKF9fcDEsIGNvbnN0X2l0ZXJhdG9yKChfTm9kZSopX19uMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IoMCkpOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIHZvaWQKKyAgICBzbGlzdDxfVHAsIF9BbGxvYz46Ol9NX2ZpbGxfYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpCisgICAgeworICAgICAgX05vZGVfYmFzZSogX19wcmV2ID0gJnRoaXMtPl9NX2hlYWQ7CisgICAgICBfTm9kZSogX19ub2RlID0gKF9Ob2RlKikgdGhpcy0+X01faGVhZC5fTV9uZXh0OworICAgICAgZm9yICg7IF9fbm9kZSAhPSAwICYmIF9fbiA+IDA7IC0tX19uKQorCXsKKwkgIF9fbm9kZS0+X01fZGF0YSA9IF9fdmFsOworCSAgX19wcmV2ID0gX19ub2RlOworCSAgX19ub2RlID0gKF9Ob2RlKikgX19ub2RlLT5fTV9uZXh0OworCX0KKyAgICAgIGlmIChfX24gPiAwKQorCV9NX2luc2VydF9hZnRlcl9maWxsKF9fcHJldiwgX19uLCBfX3ZhbCk7CisgICAgICBlbHNlCisJdGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19wcmV2LCAwKTsKKyAgICB9CisgIAorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgc2xpc3Q8X1RwLCBfQWxsb2M+OjpfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKwkJCQkJICAgICBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQkJCSAgICAgX19mYWxzZV90eXBlKQorICAgICAgeworCV9Ob2RlX2Jhc2UqIF9fcHJldiA9ICZ0aGlzLT5fTV9oZWFkOworCV9Ob2RlKiBfX25vZGUgPSAoX05vZGUqKSB0aGlzLT5fTV9oZWFkLl9NX25leHQ7CisJd2hpbGUgKF9fbm9kZSAhPSAwICYmIF9fZmlyc3QgIT0gX19sYXN0KQorCSAgeworCSAgICBfX25vZGUtPl9NX2RhdGEgPSAqX19maXJzdDsKKwkgICAgX19wcmV2ID0gX19ub2RlOworCSAgICBfX25vZGUgPSAoX05vZGUqKSBfX25vZGUtPl9NX25leHQ7CisJICAgICsrX19maXJzdDsKKwkgIH0KKwlpZiAoX19maXJzdCAhPSBfX2xhc3QpCisJICBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX19wcmV2LCBfX2ZpcnN0LCBfX2xhc3QpOworCWVsc2UKKwkgIHRoaXMtPl9NX2VyYXNlX2FmdGVyKF9fcHJldiwgMCk7CisgICAgICB9CisgIAorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHNsaXN0PF9UcCwgX0FsbG9jPiYgX1NMMSwgY29uc3Qgc2xpc3Q8X1RwLCBfQWxsb2M+JiBfU0wyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc2xpc3Q8X1RwLF9BbGxvYz46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICAgICAgY29uc3RfaXRlcmF0b3IgX19lbmQxID0gX1NMMS5lbmQoKTsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fZW5kMiA9IF9TTDIuZW5kKCk7CisgICAgICAKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIF9faTEgPSBfU0wxLmJlZ2luKCk7CisgICAgICBjb25zdF9pdGVyYXRvciBfX2kyID0gX1NMMi5iZWdpbigpOworICAgICAgd2hpbGUgKF9faTEgIT0gX19lbmQxICYmIF9faTIgIT0gX19lbmQyICYmICpfX2kxID09ICpfX2kyKQorCXsKKwkgICsrX19pMTsKKwkgICsrX19pMjsKKwl9CisgICAgICByZXR1cm4gX19pMSA9PSBfX2VuZDEgJiYgX19pMiA9PSBfX2VuZDI7CisgICAgfQorCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHNsaXN0PF9UcCwgX0FsbG9jPiYgX1NMMSwgY29uc3Qgc2xpc3Q8X1RwLCBfQWxsb2M+JiBfU0wyKQorICAgIHsgcmV0dXJuIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX1NMMS5iZWdpbigpLCBfU0wxLmVuZCgpLAorCQkJCQkgIF9TTDIuYmVnaW4oKSwgX1NMMi5lbmQoKSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHNsaXN0PF9UcCwgX0FsbG9jPiYgX1NMMSwgY29uc3Qgc2xpc3Q8X1RwLCBfQWxsb2M+JiBfU0wyKQorICAgIHsgcmV0dXJuICEoX1NMMSA9PSBfU0wyKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBzbGlzdDxfVHAsIF9BbGxvYz4mIF9TTDEsIGNvbnN0IHNsaXN0PF9UcCwgX0FsbG9jPiYgX1NMMikKKyAgICB7IHJldHVybiBfU0wyIDwgX1NMMTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3Qgc2xpc3Q8X1RwLCBfQWxsb2M+JiBfU0wxLCBjb25zdCBzbGlzdDxfVHAsIF9BbGxvYz4mIF9TTDIpCisgICAgeyByZXR1cm4gIShfU0wyIDwgX1NMMSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHNsaXN0PF9UcCwgX0FsbG9jPiYgX1NMMSwgY29uc3Qgc2xpc3Q8X1RwLCBfQWxsb2M+JiBfU0wyKQorICAgIHsgcmV0dXJuICEoX1NMMSA8IF9TTDIpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChzbGlzdDxfVHAsIF9BbGxvYz4mIF9feCwgc2xpc3Q8X1RwLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIHZvaWQKKyAgICBzbGlzdDxfVHAsIF9BbGxvYz46OnJlc2l6ZShzaXplX3R5cGUgX19sZW4sIGNvbnN0IF9UcCYgX194KQorICAgIHsKKyAgICAgIF9Ob2RlX2Jhc2UqIF9fY3VyID0gJnRoaXMtPl9NX2hlYWQ7CisgICAgICB3aGlsZSAoX19jdXItPl9NX25leHQgIT0gMCAmJiBfX2xlbiA+IDApCisJeworCSAgLS1fX2xlbjsKKwkgIF9fY3VyID0gX19jdXItPl9NX25leHQ7CisJfQorICAgICAgaWYgKF9fY3VyLT5fTV9uZXh0KQorCXRoaXMtPl9NX2VyYXNlX2FmdGVyKF9fY3VyLCAwKTsKKyAgICAgIGVsc2UKKwlfTV9pbnNlcnRfYWZ0ZXJfZmlsbChfX2N1ciwgX19sZW4sIF9feCk7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICB2b2lkCisgICAgc2xpc3Q8X1RwLCBfQWxsb2M+OjpyZW1vdmUoY29uc3QgX1RwJiBfX3ZhbCkKKyAgICB7IAorICAgICAgX05vZGVfYmFzZSogX19jdXIgPSAmdGhpcy0+X01faGVhZDsKKyAgICAgIHdoaWxlIChfX2N1ciAmJiBfX2N1ci0+X01fbmV4dCkKKwl7CisJICBpZiAoKChfTm9kZSopIF9fY3VyLT5fTV9uZXh0KS0+X01fZGF0YSA9PSBfX3ZhbCkKKwkgICAgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19jdXIpOworCSAgZWxzZQorCSAgICBfX2N1ciA9IF9fY3VyLT5fTV9uZXh0OworCX0KKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIHZvaWQKKyAgICBzbGlzdDxfVHAsIF9BbGxvYz46OnVuaXF1ZSgpCisgICAgeworICAgICAgX05vZGVfYmFzZSogX19jdXIgPSB0aGlzLT5fTV9oZWFkLl9NX25leHQ7CisgICAgICBpZiAoX19jdXIpCisJeworCSAgd2hpbGUgKF9fY3VyLT5fTV9uZXh0KQorCSAgICB7CisJICAgICAgaWYgKCgoX05vZGUqKV9fY3VyKS0+X01fZGF0YQorCQkgID09ICgoX05vZGUqKShfX2N1ci0+X01fbmV4dCkpLT5fTV9kYXRhKQorCQl0aGlzLT5fTV9lcmFzZV9hZnRlcihfX2N1cik7CisJICAgICAgZWxzZQorCQlfX2N1ciA9IF9fY3VyLT5fTV9uZXh0OworCSAgICB9CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIHNsaXN0PF9UcCwgX0FsbG9jPjo6bWVyZ2Uoc2xpc3Q8X1RwLCBfQWxsb2M+JiBfX3gpCisgICAgeworICAgICAgX05vZGVfYmFzZSogX19uMSA9ICZ0aGlzLT5fTV9oZWFkOworICAgICAgd2hpbGUgKF9fbjEtPl9NX25leHQgJiYgX194Ll9NX2hlYWQuX01fbmV4dCkKKwl7CisJICBpZiAoKChfTm9kZSopIF9feC5fTV9oZWFkLl9NX25leHQpLT5fTV9kYXRhCisJICAgICAgPCAoKF9Ob2RlKikgX19uMS0+X01fbmV4dCktPl9NX2RhdGEpCisJICAgIF9fc2xpc3Rfc3BsaWNlX2FmdGVyKF9fbjEsICZfX3guX01faGVhZCwgX194Ll9NX2hlYWQuX01fbmV4dCk7CisJICBfX24xID0gX19uMS0+X01fbmV4dDsKKwl9CisgICAgICBpZiAoX194Ll9NX2hlYWQuX01fbmV4dCkKKwl7CisJICBfX24xLT5fTV9uZXh0ID0gX194Ll9NX2hlYWQuX01fbmV4dDsKKwkgIF9feC5fTV9oZWFkLl9NX25leHQgPSAwOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIHZvaWQKKyAgICBzbGlzdDxfVHAsIF9BbGxvYz46OnNvcnQoKQorICAgIHsKKyAgICAgIGlmICh0aGlzLT5fTV9oZWFkLl9NX25leHQgJiYgdGhpcy0+X01faGVhZC5fTV9uZXh0LT5fTV9uZXh0KQorCXsKKwkgIHNsaXN0IF9fY2Fycnk7CisJICBzbGlzdCBfX2NvdW50ZXJbNjRdOworCSAgaW50IF9fZmlsbCA9IDA7CisJICB3aGlsZSAoIWVtcHR5KCkpCisJICAgIHsKKwkgICAgICBfX3NsaXN0X3NwbGljZV9hZnRlcigmX19jYXJyeS5fTV9oZWFkLAorCQkJCSAgICZ0aGlzLT5fTV9oZWFkLCB0aGlzLT5fTV9oZWFkLl9NX25leHQpOworCSAgICAgIGludCBfX2kgPSAwOworCSAgICAgIHdoaWxlIChfX2kgPCBfX2ZpbGwgJiYgIV9fY291bnRlcltfX2ldLmVtcHR5KCkpCisJCXsKKwkJICBfX2NvdW50ZXJbX19pXS5tZXJnZShfX2NhcnJ5KTsKKwkJICBfX2NhcnJ5LnN3YXAoX19jb3VudGVyW19faV0pOworCQkgICsrX19pOworCQl9CisJICAgICAgX19jYXJyeS5zd2FwKF9fY291bnRlcltfX2ldKTsKKwkgICAgICBpZiAoX19pID09IF9fZmlsbCkKKwkJKytfX2ZpbGw7CisJICAgIH0KKwkgIAorCSAgZm9yIChpbnQgX19pID0gMTsgX19pIDwgX19maWxsOyArK19faSkKKwkgICAgX19jb3VudGVyW19faV0ubWVyZ2UoX19jb3VudGVyW19faS0xXSk7CisJICB0aGlzLT5zd2FwKF9fY291bnRlcltfX2ZpbGwtMV0pOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIHRlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPgorICAgICAgdm9pZCBzbGlzdDxfVHAsIF9BbGxvYz46OnJlbW92ZV9pZihfUHJlZGljYXRlIF9fcHJlZCkKKyAgICAgIHsKKwlfTm9kZV9iYXNlKiBfX2N1ciA9ICZ0aGlzLT5fTV9oZWFkOworCXdoaWxlIChfX2N1ci0+X01fbmV4dCkKKwkgIHsKKwkgICAgaWYgKF9fcHJlZCgoKF9Ob2RlKikgX19jdXItPl9NX25leHQpLT5fTV9kYXRhKSkKKwkgICAgICB0aGlzLT5fTV9lcmFzZV9hZnRlcihfX2N1cik7CisJICAgIGVsc2UKKwkgICAgICBfX2N1ciA9IF9fY3VyLT5fTV9uZXh0OworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICAgIHZvaWQKKyAgICAgIHNsaXN0PF9UcCwgX0FsbG9jPjo6dW5pcXVlKF9CaW5hcnlQcmVkaWNhdGUgX19wcmVkKQorICAgICAgeworCV9Ob2RlKiBfX2N1ciA9IChfTm9kZSopIHRoaXMtPl9NX2hlYWQuX01fbmV4dDsKKwlpZiAoX19jdXIpCisJICB7CisJICAgIHdoaWxlIChfX2N1ci0+X01fbmV4dCkKKwkgICAgICB7CisJCWlmIChfX3ByZWQoKChfTm9kZSopX19jdXIpLT5fTV9kYXRhLAorCQkJICAgKChfTm9kZSopKF9fY3VyLT5fTV9uZXh0KSktPl9NX2RhdGEpKQorCQkgIHRoaXMtPl9NX2VyYXNlX2FmdGVyKF9fY3VyKTsKKwkJZWxzZQorCQkgIF9fY3VyID0gKF9Ob2RlKikgX19jdXItPl9NX25leHQ7CisJICAgICAgfQorCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgICAgIHZvaWQKKyAgICAgIHNsaXN0PF9UcCwgX0FsbG9jPjo6bWVyZ2Uoc2xpc3Q8X1RwLCBfQWxsb2M+JiBfX3gsCisJCQkgICAgICAgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApCisgICAgICB7CisJX05vZGVfYmFzZSogX19uMSA9ICZ0aGlzLT5fTV9oZWFkOworCXdoaWxlIChfX24xLT5fTV9uZXh0ICYmIF9feC5fTV9oZWFkLl9NX25leHQpCisJICB7CisJICAgIGlmIChfX2NvbXAoKChfTm9kZSopIF9feC5fTV9oZWFkLl9NX25leHQpLT5fTV9kYXRhLAorCQkgICAgICAgKChfTm9kZSopIF9fbjEtPl9NX25leHQpLT5fTV9kYXRhKSkKKwkgICAgICBfX3NsaXN0X3NwbGljZV9hZnRlcihfX24xLCAmX194Ll9NX2hlYWQsIF9feC5fTV9oZWFkLl9NX25leHQpOworCSAgICBfX24xID0gX19uMS0+X01fbmV4dDsKKwkgIH0KKwlpZiAoX194Ll9NX2hlYWQuX01fbmV4dCkKKwkgIHsKKwkgICAgX19uMS0+X01fbmV4dCA9IF9feC5fTV9oZWFkLl9NX25leHQ7CisJICAgIF9feC5fTV9oZWFkLl9NX25leHQgPSAwOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgICAgIHZvaWQKKyAgICAgIHNsaXN0PF9UcCwgX0FsbG9jPjo6c29ydChfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyAgICAgIHsKKwlpZiAodGhpcy0+X01faGVhZC5fTV9uZXh0ICYmIHRoaXMtPl9NX2hlYWQuX01fbmV4dC0+X01fbmV4dCkKKwkgIHsKKwkgICAgc2xpc3QgX19jYXJyeTsKKwkgICAgc2xpc3QgX19jb3VudGVyWzY0XTsKKwkgICAgaW50IF9fZmlsbCA9IDA7CisJICAgIHdoaWxlICghZW1wdHkoKSkKKwkgICAgICB7CisJCV9fc2xpc3Rfc3BsaWNlX2FmdGVyKCZfX2NhcnJ5Ll9NX2hlYWQsCisJCQkJICAgICAmdGhpcy0+X01faGVhZCwgdGhpcy0+X01faGVhZC5fTV9uZXh0KTsKKwkJaW50IF9faSA9IDA7CisJCXdoaWxlIChfX2kgPCBfX2ZpbGwgJiYgIV9fY291bnRlcltfX2ldLmVtcHR5KCkpCisJCSAgeworCQkgICAgX19jb3VudGVyW19faV0ubWVyZ2UoX19jYXJyeSwgX19jb21wKTsKKwkJICAgIF9fY2Fycnkuc3dhcChfX2NvdW50ZXJbX19pXSk7CisJCSAgICArK19faTsKKwkJICB9CisJCV9fY2Fycnkuc3dhcChfX2NvdW50ZXJbX19pXSk7CisJCWlmIChfX2kgPT0gX19maWxsKQorCQkgICsrX19maWxsOworCSAgICAgIH0KKworCSAgICBmb3IgKGludCBfX2kgPSAxOyBfX2kgPCBfX2ZpbGw7ICsrX19pKQorCSAgICAgIF9fY291bnRlcltfX2ldLm1lcmdlKF9fY291bnRlcltfX2ktMV0sIF9fY29tcCk7CisJICAgIHRoaXMtPnN3YXAoX19jb3VudGVyW19fZmlsbC0xXSk7CisJICB9CisgICAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFNwZWNpYWxpemF0aW9uIG9mIGluc2VydF9pdGVyYXRvciBzbyB0aGF0IGluc2VydGlvbnMgd2lsbCBiZSBjb25zdGFudAorICAvLyB0aW1lIHJhdGhlciB0aGFuIGxpbmVhciB0aW1lLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3MgaW5zZXJ0X2l0ZXJhdG9yPF9fZ251X2N4eDo6c2xpc3Q8X1RwLCBfQWxsb2M+ID4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnNsaXN0PF9UcCwgX0FsbG9jPiBfQ29udGFpbmVyOworICAgICAgX0NvbnRhaW5lciogY29udGFpbmVyOworICAgICAgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgaXRlcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgX19pKQorICAgICAgOiBjb250YWluZXIoJl9feCkKKyAgICAgIHsKKwlpZiAoX19pID09IF9feC5iZWdpbigpKQorCSAgaXRlciA9IF9feC5iZWZvcmVfYmVnaW4oKTsKKwllbHNlCisJICBpdGVyID0gX194LnByZXZpb3VzKF9faSk7CisgICAgICB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbHVlKQorICAgICAgeworCWl0ZXIgPSBjb250YWluZXItPmluc2VydF9hZnRlcihpdGVyLCBfX3ZhbHVlKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKigpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvc3NvX3N0cmluZ19iYXNlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9zc29fc3RyaW5nX2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2I0MzAyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvc3NvX3N0cmluZ19iYXNlLmgKQEAgLTAsMCArMSw1NzYgQEAKKy8vIFNob3J0LXN0cmluZy1vcHRpbWl6ZWQgdmVyc2F0aWxlIHN0cmluZyBiYXNlIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvc3NvX3N0cmluZ19iYXNlLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtleHQvdnN0cmluZy5ofQorICovCisKKyNpZm5kZWYgX1NTT19TVFJJTkdfQkFTRV9ICisjZGVmaW5lIF9TU09fU1RSSU5HX0JBU0VfSCAxCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBfX3Nzb19zdHJpbmdfYmFzZQorICAgIDogcHJvdGVjdGVkIF9fdnN0cmluZ191dGlsaXR5PF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcmFpdHMJCQkJCSAgICB0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlCQkgICAgdmFsdWVfdHlwZTsKKworICAgICAgdHlwZWRlZiBfX3ZzdHJpbmdfdXRpbGl0eTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gICAgX1V0aWxfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1V0aWxfQmFzZTo6X0NoYXJUX2FsbG9jX3R5cGUgICAgICAgIF9DaGFyVF9hbGxvY190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ2hhclRfYWxsb2NfdHlwZTo6c2l6ZV90eXBlCSAgICBzaXplX3R5cGU7CisgICAgICAKKyAgICBwcml2YXRlOgorICAgICAgLy8gRGF0YSBNZW1iZXJzOgorICAgICAgdHlwZW5hbWUgX1V0aWxfQmFzZTo6dGVtcGxhdGUgX0FsbG9jX2hpZGVyPF9DaGFyVF9hbGxvY190eXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fZGF0YXBsdXM7CisgICAgICBzaXplX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9zdHJpbmdfbGVuZ3RoOworCisgICAgICBlbnVtIHsgX1NfbG9jYWxfY2FwYWNpdHkgPSAxNSB9OworICAgICAgCisgICAgICB1bmlvbgorICAgICAgeworCV9DaGFyVCAgICAgICAgICAgX01fbG9jYWxfZGF0YVtfU19sb2NhbF9jYXBhY2l0eSArIDFdOworCXNpemVfdHlwZSAgICAgICAgX01fYWxsb2NhdGVkX2NhcGFjaXR5OworICAgICAgfTsKKworICAgICAgdm9pZAorICAgICAgX01fZGF0YShfQ2hhclQqIF9fcCkKKyAgICAgIHsgX01fZGF0YXBsdXMuX01fcCA9IF9fcDsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9sZW5ndGgoc2l6ZV90eXBlIF9fbGVuZ3RoKQorICAgICAgeyBfTV9zdHJpbmdfbGVuZ3RoID0gX19sZW5ndGg7IH0KKworICAgICAgdm9pZAorICAgICAgX01fY2FwYWNpdHkoc2l6ZV90eXBlIF9fY2FwYWNpdHkpCisgICAgICB7IF9NX2FsbG9jYXRlZF9jYXBhY2l0eSA9IF9fY2FwYWNpdHk7IH0KKworICAgICAgYm9vbAorICAgICAgX01faXNfbG9jYWwoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGF0YSgpID09IF9NX2xvY2FsX2RhdGE7IH0KKworICAgICAgLy8gQ3JlYXRlICYgRGVzdHJveQorICAgICAgX0NoYXJUKgorICAgICAgX01fY3JlYXRlKHNpemVfdHlwZSYsIHNpemVfdHlwZSk7CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX2Rpc3Bvc2UoKQorICAgICAgeworCWlmICghX01faXNfbG9jYWwoKSkKKwkgIF9NX2Rlc3Ryb3koX01fYWxsb2NhdGVkX2NhcGFjaXR5KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fZGVzdHJveShzaXplX3R5cGUgX19zaXplKSB0aHJvdygpCisgICAgICB7IF9NX2dldF9hbGxvY2F0b3IoKS5kZWFsbG9jYXRlKF9NX2RhdGEoKSwgX19zaXplICsgMSk7IH0KKworICAgICAgLy8gX01fY29uc3RydWN0X2F1eCBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgMjEuMy4xIHBhcmEgMTUgd2hpY2gKKyAgICAgIC8vIHJlcXVpcmVzIHNwZWNpYWwgYmVoYXZpb3VyIGlmIF9Jbkl0ZXJhdG9yIGlzIGFuIGludGVncmFsIHR5cGUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2NvbnN0cnVjdF9hdXgoX0luSXRlcmF0b3IgX19iZWcsIF9Jbkl0ZXJhdG9yIF9fZW5kLCAKKwkJCSBzdGQ6Ol9fZmFsc2VfdHlwZSkKKwl7CisgICAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0luSXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSBfVGFnOworICAgICAgICAgIF9NX2NvbnN0cnVjdChfX2JlZywgX19lbmQsIF9UYWcoKSk7CisJfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzguIEFtYmlndWl0eSBpbiB0aGUgImRvIHRoZSByaWdodCB0aGluZyIgY2xhdXNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZWdlcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9jb25zdHJ1Y3RfYXV4KF9JbnRlZ2VyIF9fYmVnLCBfSW50ZWdlciBfX2VuZCwgc3RkOjpfX3RydWVfdHlwZSkKKwl7IF9NX2NvbnN0cnVjdF9hdXhfMihzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fYmVnKSwgX19lbmQpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2NvbnN0cnVjdF9hdXhfMihzaXplX3R5cGUgX19yZXEsIF9DaGFyVCBfX2MpCisgICAgICB7IF9NX2NvbnN0cnVjdChfX3JlcSwgX19jKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9jb25zdHJ1Y3QoX0luSXRlcmF0b3IgX19iZWcsIF9Jbkl0ZXJhdG9yIF9fZW5kKQorCXsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2lzX2ludGVnZXI8X0luSXRlcmF0b3I+OjpfX3R5cGUgX0ludGVncmFsOworCSAgX01fY29uc3RydWN0X2F1eChfX2JlZywgX19lbmQsIF9JbnRlZ3JhbCgpKTsKKyAgICAgICAgfQorCisgICAgICAvLyBGb3IgSW5wdXQgSXRlcmF0b3JzLCB1c2VkIGluIGlzdHJlYW1idWZfaXRlcmF0b3JzLCBldGMuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9jb25zdHJ1Y3QoX0luSXRlcmF0b3IgX19iZWcsIF9Jbkl0ZXJhdG9yIF9fZW5kLAorCQkgICAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKTsKKyAgICAgIAorICAgICAgLy8gRm9yIGZvcndhcmRfaXRlcmF0b3JzIHVwIHRvIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JzLCB1c2VkIGZvcgorICAgICAgLy8gc3RyaW5nOjppdGVyYXRvciwgX0NoYXJUKiwgZXRjLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z3ZEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2NvbnN0cnVjdChfRndkSXRlcmF0b3IgX19iZWcsIF9Gd2RJdGVyYXRvciBfX2VuZCwKKwkJICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKTsKKworICAgICAgdm9pZAorICAgICAgX01fY29uc3RydWN0KHNpemVfdHlwZSBfX3JlcSwgX0NoYXJUIF9fYyk7CisKKyAgICBwdWJsaWM6CisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX21heF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfTV9nZXRfYWxsb2NhdG9yKCkubWF4X3NpemUoKSAtIDEpIC8gMjsgfQorCisgICAgICBfQ2hhclQqCisgICAgICBfTV9kYXRhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGFwbHVzLl9NX3A7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBfTV9sZW5ndGgoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fc3RyaW5nX2xlbmd0aDsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX2NhcGFjaXR5KCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX01faXNfbG9jYWwoKSA/IHNpemVfdHlwZShfU19sb2NhbF9jYXBhY2l0eSkKKwkgICAgICAgICAgICAgICAgICAgICA6IF9NX2FsbG9jYXRlZF9jYXBhY2l0eTsgCisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2lzX3NoYXJlZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zZXRfbGVha2VkKCkgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2xlYWsoKSB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fc2V0X2xlbmd0aChzaXplX3R5cGUgX19uKQorICAgICAgeworCV9NX2xlbmd0aChfX24pOworCXRyYWl0c190eXBlOjphc3NpZ24oX01fZGF0YSgpW19fbl0sIF9DaGFyVCgpKTsKKyAgICAgIH0KKworICAgICAgX19zc29fc3RyaW5nX2Jhc2UoKQorICAgICAgOiBfTV9kYXRhcGx1cyhfTV9sb2NhbF9kYXRhKQorICAgICAgeyBfTV9zZXRfbGVuZ3RoKDApOyB9CisKKyAgICAgIF9fc3NvX3N0cmluZ19iYXNlKGNvbnN0IF9BbGxvYyYgX19hKTsKKworICAgICAgX19zc29fc3RyaW5nX2Jhc2UoY29uc3QgX19zc29fc3RyaW5nX2Jhc2UmIF9fcmNzKTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIF9fc3NvX3N0cmluZ19iYXNlKF9fc3NvX3N0cmluZ19iYXNlJiYgX19yY3MpOworI2VuZGlmCisKKyAgICAgIF9fc3NvX3N0cmluZ19iYXNlKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsIGNvbnN0IF9BbGxvYyYgX19hKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIF9fc3NvX3N0cmluZ19iYXNlKF9JbnB1dEl0ZXJhdG9yIF9fYmVnLCBfSW5wdXRJdGVyYXRvciBfX2VuZCwKKwkJCSAgY29uc3QgX0FsbG9jJiBfX2EpOworCisgICAgICB+X19zc29fc3RyaW5nX2Jhc2UoKQorICAgICAgeyBfTV9kaXNwb3NlKCk7IH0KKworICAgICAgX0NoYXJUX2FsbG9jX3R5cGUmCisgICAgICBfTV9nZXRfYWxsb2NhdG9yKCkKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGFwbHVzOyB9CisKKyAgICAgIGNvbnN0IF9DaGFyVF9hbGxvY190eXBlJgorICAgICAgX01fZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kYXRhcGx1czsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zd2FwKF9fc3NvX3N0cmluZ19iYXNlJiBfX3Jjcyk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2Fzc2lnbihjb25zdCBfX3Nzb19zdHJpbmdfYmFzZSYgX19yY3MpOworCisgICAgICB2b2lkCisgICAgICBfTV9yZXNlcnZlKHNpemVfdHlwZSBfX3Jlcyk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX211dGF0ZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX2xlbjEsIGNvbnN0IF9DaGFyVCogX19zLAorCQlzaXplX3R5cGUgX19sZW4yKTsKKworICAgICAgdm9pZAorICAgICAgX01fZXJhc2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKTsKKworICAgICAgdm9pZAorICAgICAgX01fY2xlYXIoKQorICAgICAgeyBfTV9zZXRfbGVuZ3RoKDApOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2NvbXBhcmUoY29uc3QgX19zc29fc3RyaW5nX2Jhc2UmKSBjb25zdAorICAgICAgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfX3Nzb19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX3N3YXAoX19zc29fc3RyaW5nX2Jhc2UmIF9fcmNzKQorICAgIHsKKyAgICAgIGlmICh0aGlzID09ICZfX3JjcykKKwlyZXR1cm47CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQzMS4gU3dhcHBpbmcgY29udGFpbmVycyB3aXRoIHVuZXF1YWwgYWxsb2NhdG9ycy4KKyAgICAgIHN0ZDo6X19hbGxvY19zd2FwPF9DaGFyVF9hbGxvY190eXBlPjo6X1NfZG9faXQoX01fZ2V0X2FsbG9jYXRvcigpLAorCQkJCQkJICAgICBfX3Jjcy5fTV9nZXRfYWxsb2NhdG9yKCkpOworCisgICAgICBpZiAoX01faXNfbG9jYWwoKSkKKwlpZiAoX19yY3MuX01faXNfbG9jYWwoKSkKKwkgIHsKKwkgICAgaWYgKF9NX2xlbmd0aCgpICYmIF9fcmNzLl9NX2xlbmd0aCgpKQorCSAgICAgIHsKKwkJX0NoYXJUIF9fdG1wX2RhdGFbX1NfbG9jYWxfY2FwYWNpdHkgKyAxXTsKKwkJdHJhaXRzX3R5cGU6OmNvcHkoX190bXBfZGF0YSwgX19yY3MuX01fbG9jYWxfZGF0YSwKKwkJCQkgIF9TX2xvY2FsX2NhcGFjaXR5ICsgMSk7CisJCXRyYWl0c190eXBlOjpjb3B5KF9fcmNzLl9NX2xvY2FsX2RhdGEsIF9NX2xvY2FsX2RhdGEsCisJCQkJICBfU19sb2NhbF9jYXBhY2l0eSArIDEpOworCQl0cmFpdHNfdHlwZTo6Y29weShfTV9sb2NhbF9kYXRhLCBfX3RtcF9kYXRhLAorCQkJCSAgX1NfbG9jYWxfY2FwYWNpdHkgKyAxKTsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKF9fcmNzLl9NX2xlbmd0aCgpKQorCSAgICAgIHsKKwkJdHJhaXRzX3R5cGU6OmNvcHkoX01fbG9jYWxfZGF0YSwgX19yY3MuX01fbG9jYWxfZGF0YSwKKwkJCQkgIF9TX2xvY2FsX2NhcGFjaXR5ICsgMSk7CisJCV9NX2xlbmd0aChfX3Jjcy5fTV9sZW5ndGgoKSk7CisJCV9fcmNzLl9NX3NldF9sZW5ndGgoMCk7CisJCXJldHVybjsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKF9NX2xlbmd0aCgpKQorCSAgICAgIHsKKwkJdHJhaXRzX3R5cGU6OmNvcHkoX19yY3MuX01fbG9jYWxfZGF0YSwgX01fbG9jYWxfZGF0YSwKKwkJCQkgIF9TX2xvY2FsX2NhcGFjaXR5ICsgMSk7CisJCV9fcmNzLl9NX2xlbmd0aChfTV9sZW5ndGgoKSk7CisJCV9NX3NldF9sZW5ndGgoMCk7CisJCXJldHVybjsKKwkgICAgICB9CisJICB9CisJZWxzZQorCSAgeworCSAgICBjb25zdCBzaXplX3R5cGUgX190bXBfY2FwYWNpdHkgPSBfX3Jjcy5fTV9hbGxvY2F0ZWRfY2FwYWNpdHk7CisJICAgIHRyYWl0c190eXBlOjpjb3B5KF9fcmNzLl9NX2xvY2FsX2RhdGEsIF9NX2xvY2FsX2RhdGEsCisJCQkgICAgICBfU19sb2NhbF9jYXBhY2l0eSArIDEpOworCSAgICBfTV9kYXRhKF9fcmNzLl9NX2RhdGEoKSk7CisJICAgIF9fcmNzLl9NX2RhdGEoX19yY3MuX01fbG9jYWxfZGF0YSk7CisJICAgIF9NX2NhcGFjaXR5KF9fdG1wX2NhcGFjaXR5KTsKKwkgIH0KKyAgICAgIGVsc2UKKwl7CisJICBjb25zdCBzaXplX3R5cGUgX190bXBfY2FwYWNpdHkgPSBfTV9hbGxvY2F0ZWRfY2FwYWNpdHk7CisJICBpZiAoX19yY3MuX01faXNfbG9jYWwoKSkKKwkgICAgeworCSAgICAgIHRyYWl0c190eXBlOjpjb3B5KF9NX2xvY2FsX2RhdGEsIF9fcmNzLl9NX2xvY2FsX2RhdGEsCisJCQkJX1NfbG9jYWxfY2FwYWNpdHkgKyAxKTsKKwkgICAgICBfX3Jjcy5fTV9kYXRhKF9NX2RhdGEoKSk7CisJICAgICAgX01fZGF0YShfTV9sb2NhbF9kYXRhKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgX0NoYXJUKiBfX3RtcF9wdHIgPSBfTV9kYXRhKCk7CisJICAgICAgX01fZGF0YShfX3Jjcy5fTV9kYXRhKCkpOworCSAgICAgIF9fcmNzLl9NX2RhdGEoX190bXBfcHRyKTsKKwkgICAgICBfTV9jYXBhY2l0eShfX3Jjcy5fTV9hbGxvY2F0ZWRfY2FwYWNpdHkpOworCSAgICB9CisJICBfX3Jjcy5fTV9jYXBhY2l0eShfX3RtcF9jYXBhY2l0eSk7CisJfQorCisgICAgICBjb25zdCBzaXplX3R5cGUgX190bXBfbGVuZ3RoID0gX01fbGVuZ3RoKCk7CisgICAgICBfTV9sZW5ndGgoX19yY3MuX01fbGVuZ3RoKCkpOworICAgICAgX19yY3MuX01fbGVuZ3RoKF9fdG1wX2xlbmd0aCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9DaGFyVCoKKyAgICBfX3Nzb19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX2NyZWF0ZShzaXplX3R5cGUmIF9fY2FwYWNpdHksIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSkKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA4My4gIFN0cmluZzo6bnBvcyB2cy4gc3RyaW5nOjptYXhfc2l6ZSgpCisgICAgICBpZiAoX19jYXBhY2l0eSA+IF9NX21heF9zaXplKCkpCisJc3RkOjpfX3Rocm93X2xlbmd0aF9lcnJvcihfX04oIl9fc3NvX3N0cmluZ19iYXNlOjpfTV9jcmVhdGUiKSk7CisKKyAgICAgIC8vIFRoZSBiZWxvdyBpbXBsZW1lbnRzIGFuIGV4cG9uZW50aWFsIGdyb3d0aCBwb2xpY3ksIG5lY2Vzc2FyeSB0bworICAgICAgLy8gbWVldCBhbW9ydGl6ZWQgbGluZWFyIHRpbWUgcmVxdWlyZW1lbnRzIG9mIHRoZSBsaWJyYXJ5OiBzZWUKKyAgICAgIC8vIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9saWJzdGRjKysvMjAwMS0wNy9tc2cwMDA4NS5odG1sLgorICAgICAgaWYgKF9fY2FwYWNpdHkgPiBfX29sZF9jYXBhY2l0eSAmJiBfX2NhcGFjaXR5IDwgMiAqIF9fb2xkX2NhcGFjaXR5KQorCXsKKwkgIF9fY2FwYWNpdHkgPSAyICogX19vbGRfY2FwYWNpdHk7CisJICAvLyBOZXZlciBhbGxvY2F0ZSBhIHN0cmluZyBiaWdnZXIgdGhhbiBtYXhfc2l6ZS4KKwkgIGlmIChfX2NhcGFjaXR5ID4gX01fbWF4X3NpemUoKSkKKwkgICAgX19jYXBhY2l0eSA9IF9NX21heF9zaXplKCk7CisJfQorCisgICAgICAvLyBOQjogTmVlZCBhbiBhcnJheSBvZiBjaGFyX3R5cGVbX19jYXBhY2l0eV0sIHBsdXMgYSB0ZXJtaW5hdGluZworICAgICAgLy8gbnVsbCBjaGFyX3R5cGUoKSBlbGVtZW50LgorICAgICAgcmV0dXJuIF9NX2dldF9hbGxvY2F0b3IoKS5hbGxvY2F0ZShfX2NhcGFjaXR5ICsgMSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9fc3NvX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX19zc29fc3RyaW5nX2Jhc2UoY29uc3QgX0FsbG9jJiBfX2EpCisgICAgOiBfTV9kYXRhcGx1cyhfX2EsIF9NX2xvY2FsX2RhdGEpCisgICAgeyBfTV9zZXRfbGVuZ3RoKDApOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX19zc29fc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfX3Nzb19zdHJpbmdfYmFzZShjb25zdCBfX3Nzb19zdHJpbmdfYmFzZSYgX19yY3MpCisgICAgOiBfTV9kYXRhcGx1cyhfX3Jjcy5fTV9nZXRfYWxsb2NhdG9yKCksIF9NX2xvY2FsX2RhdGEpCisgICAgeyBfTV9jb25zdHJ1Y3QoX19yY3MuX01fZGF0YSgpLCBfX3Jjcy5fTV9kYXRhKCkgKyBfX3Jjcy5fTV9sZW5ndGgoKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX19zc29fc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfX3Nzb19zdHJpbmdfYmFzZShfX3Nzb19zdHJpbmdfYmFzZSYmIF9fcmNzKQorICAgIDogX01fZGF0YXBsdXMoX19yY3MuX01fZ2V0X2FsbG9jYXRvcigpLCBfTV9sb2NhbF9kYXRhKQorICAgIHsKKyAgICAgIGlmIChfX3Jjcy5fTV9pc19sb2NhbCgpKQorCXsKKwkgIGlmIChfX3Jjcy5fTV9sZW5ndGgoKSkKKwkgICAgdHJhaXRzX3R5cGU6OmNvcHkoX01fbG9jYWxfZGF0YSwgX19yY3MuX01fbG9jYWxfZGF0YSwKKwkJCSAgICAgIF9TX2xvY2FsX2NhcGFjaXR5ICsgMSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIF9NX2RhdGEoX19yY3MuX01fZGF0YSgpKTsKKwkgIF9NX2NhcGFjaXR5KF9fcmNzLl9NX2FsbG9jYXRlZF9jYXBhY2l0eSk7CisJfQorCisgICAgICBfTV9zZXRfbGVuZ3RoKF9fcmNzLl9NX2xlbmd0aCgpKTsKKyAgICAgIF9fcmNzLl9NX2RhdGEoX19yY3MuX01fbG9jYWxfZGF0YSk7CisgICAgICBfX3Jjcy5fTV9zZXRfbGVuZ3RoKDApOworICAgIH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9fc3NvX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX19zc29fc3RyaW5nX2Jhc2Uoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYywgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgOiBfTV9kYXRhcGx1cyhfX2EsIF9NX2xvY2FsX2RhdGEpCisgICAgeyBfTV9jb25zdHJ1Y3QoX19uLCBfX2MpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgX19zc29fc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfX3Nzb19zdHJpbmdfYmFzZShfSW5wdXRJdGVyYXRvciBfX2JlZywgX0lucHV0SXRlcmF0b3IgX19lbmQsCisJCSAgICAgIGNvbnN0IF9BbGxvYyYgX19hKQorICAgIDogX01fZGF0YXBsdXMoX19hLCBfTV9sb2NhbF9kYXRhKQorICAgIHsgX01fY29uc3RydWN0KF9fYmVnLCBfX2VuZCk7IH0KKworICAvLyBOQjogVGhpcyBpcyB0aGUgc3BlY2lhbCBjYXNlIGZvciBJbnB1dCBJdGVyYXRvcnMsIHVzZWQgaW4KKyAgLy8gaXN0cmVhbWJ1Zl9pdGVyYXRvcnMsIGV0Yy4KKyAgLy8gSW5wdXQgSXRlcmF0b3JzIGhhdmUgYSBjb3N0IHN0cnVjdHVyZSB2ZXJ5IGRpZmZlcmVudCBmcm9tCisgIC8vIHBvaW50ZXJzLCBjYWxsaW5nIGZvciBhIGRpZmZlcmVudCBjb2Rpbmcgc3R5bGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgX19zc29fc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICAgIF9NX2NvbnN0cnVjdChfSW5JdGVyYXRvciBfX2JlZywgX0luSXRlcmF0b3IgX19lbmQsCisJCSAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKQorICAgICAgeworCXNpemVfdHlwZSBfX2xlbiA9IDA7CisJc2l6ZV90eXBlIF9fY2FwYWNpdHkgPSBzaXplX3R5cGUoX1NfbG9jYWxfY2FwYWNpdHkpOworCisJd2hpbGUgKF9fYmVnICE9IF9fZW5kICYmIF9fbGVuIDwgX19jYXBhY2l0eSkKKwkgIHsKKwkgICAgX01fZGF0YSgpW19fbGVuKytdID0gKl9fYmVnOworCSAgICArK19fYmVnOworCSAgfQorCQorCV9fdHJ5CisJICB7CisJICAgIHdoaWxlIChfX2JlZyAhPSBfX2VuZCkKKwkgICAgICB7CisJCWlmIChfX2xlbiA9PSBfX2NhcGFjaXR5KQorCQkgIHsKKwkJICAgIC8vIEFsbG9jYXRlIG1vcmUgc3BhY2UuCisJCSAgICBfX2NhcGFjaXR5ID0gX19sZW4gKyAxOworCQkgICAgX0NoYXJUKiBfX2Fub3RoZXIgPSBfTV9jcmVhdGUoX19jYXBhY2l0eSwgX19sZW4pOworCQkgICAgdGhpcy0+X1NfY29weShfX2Fub3RoZXIsIF9NX2RhdGEoKSwgX19sZW4pOworCQkgICAgX01fZGlzcG9zZSgpOworCQkgICAgX01fZGF0YShfX2Fub3RoZXIpOworCQkgICAgX01fY2FwYWNpdHkoX19jYXBhY2l0eSk7CisJCSAgfQorCQlfTV9kYXRhKClbX19sZW4rK10gPSAqX19iZWc7CisJCSsrX19iZWc7CisJICAgICAgfQorCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfTV9kaXNwb3NlKCk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorCisJX01fc2V0X2xlbmd0aChfX2xlbik7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBfX3Nzb19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgICAgX01fY29uc3RydWN0KF9Jbkl0ZXJhdG9yIF9fYmVnLCBfSW5JdGVyYXRvciBfX2VuZCwKKwkJICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKwkvLyBOQjogTm90IHJlcXVpcmVkLCBidXQgY29uc2lkZXJlZCBiZXN0IHByYWN0aWNlLgorCWlmIChfX2lzX251bGxfcG9pbnRlcihfX2JlZykgJiYgX19iZWcgIT0gX19lbmQpCisJICBzdGQ6Ol9fdGhyb3dfbG9naWNfZXJyb3IoX19OKCJfX3Nzb19zdHJpbmdfYmFzZTo6IgorCQkJCSAgICAgICAiX01fY29uc3RydWN0IG51bGwgbm90IHZhbGlkIikpOworCisJc2l6ZV90eXBlIF9fZG5ldyA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oc3RkOjpkaXN0YW5jZShfX2JlZywgX19lbmQpKTsKKworCWlmIChfX2RuZXcgPiBzaXplX3R5cGUoX1NfbG9jYWxfY2FwYWNpdHkpKQorCSAgeworCSAgICBfTV9kYXRhKF9NX2NyZWF0ZShfX2RuZXcsIHNpemVfdHlwZSgwKSkpOworCSAgICBfTV9jYXBhY2l0eShfX2RuZXcpOworCSAgfQorCisJLy8gQ2hlY2sgZm9yIG91dF9vZl9yYW5nZSBhbmQgbGVuZ3RoX2Vycm9yIGV4Y2VwdGlvbnMuCisJX190cnkKKwkgIHsgdGhpcy0+X1NfY29weV9jaGFycyhfTV9kYXRhKCksIF9fYmVnLCBfX2VuZCk7IH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX01fZGlzcG9zZSgpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKworCV9NX3NldF9sZW5ndGgoX19kbmV3KTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX19zc29fc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfTV9jb25zdHJ1Y3Qoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykKKyAgICB7CisgICAgICBpZiAoX19uID4gc2l6ZV90eXBlKF9TX2xvY2FsX2NhcGFjaXR5KSkKKwl7CisJICBfTV9kYXRhKF9NX2NyZWF0ZShfX24sIHNpemVfdHlwZSgwKSkpOworCSAgX01fY2FwYWNpdHkoX19uKTsKKwl9CisKKyAgICAgIGlmIChfX24pCisJdGhpcy0+X1NfYXNzaWduKF9NX2RhdGEoKSwgX19uLCBfX2MpOworCisgICAgICBfTV9zZXRfbGVuZ3RoKF9fbik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfX3Nzb19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX2Fzc2lnbihjb25zdCBfX3Nzb19zdHJpbmdfYmFzZSYgX19yY3MpCisgICAgeworICAgICAgaWYgKHRoaXMgIT0gJl9fcmNzKQorCXsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX3JzaXplID0gX19yY3MuX01fbGVuZ3RoKCk7CisJICBjb25zdCBzaXplX3R5cGUgX19jYXBhY2l0eSA9IF9NX2NhcGFjaXR5KCk7CisKKwkgIGlmIChfX3JzaXplID4gX19jYXBhY2l0eSkKKwkgICAgeworCSAgICAgIHNpemVfdHlwZSBfX25ld19jYXBhY2l0eSA9IF9fcnNpemU7CisJICAgICAgX0NoYXJUKiBfX3RtcCA9IF9NX2NyZWF0ZShfX25ld19jYXBhY2l0eSwgX19jYXBhY2l0eSk7CisJICAgICAgX01fZGlzcG9zZSgpOworCSAgICAgIF9NX2RhdGEoX190bXApOworCSAgICAgIF9NX2NhcGFjaXR5KF9fbmV3X2NhcGFjaXR5KTsKKwkgICAgfQorCisJICBpZiAoX19yc2l6ZSkKKwkgICAgdGhpcy0+X1NfY29weShfTV9kYXRhKCksIF9fcmNzLl9NX2RhdGEoKSwgX19yc2l6ZSk7CisKKwkgIF9NX3NldF9sZW5ndGgoX19yc2l6ZSk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX19zc29fc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfTV9yZXNlcnZlKHNpemVfdHlwZSBfX3JlcykKKyAgICB7CisgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3Qgc2hyaW5rIGJlbG93IHRoZSBjdXJyZW50IHNpemUuCisgICAgICBpZiAoX19yZXMgPCBfTV9sZW5ndGgoKSkKKwlfX3JlcyA9IF9NX2xlbmd0aCgpOworCisgICAgICBjb25zdCBzaXplX3R5cGUgX19jYXBhY2l0eSA9IF9NX2NhcGFjaXR5KCk7CisgICAgICBpZiAoX19yZXMgIT0gX19jYXBhY2l0eSkKKwl7CisJICBpZiAoX19yZXMgPiBfX2NhcGFjaXR5CisJICAgICAgfHwgX19yZXMgPiBzaXplX3R5cGUoX1NfbG9jYWxfY2FwYWNpdHkpKQorCSAgICB7CisJICAgICAgX0NoYXJUKiBfX3RtcCA9IF9NX2NyZWF0ZShfX3JlcywgX19jYXBhY2l0eSk7CisJICAgICAgdGhpcy0+X1NfY29weShfX3RtcCwgX01fZGF0YSgpLCBfTV9sZW5ndGgoKSArIDEpOworCSAgICAgIF9NX2Rpc3Bvc2UoKTsKKwkgICAgICBfTV9kYXRhKF9fdG1wKTsKKwkgICAgICBfTV9jYXBhY2l0eShfX3Jlcyk7CisJICAgIH0KKwkgIGVsc2UgaWYgKCFfTV9pc19sb2NhbCgpKQorCSAgICB7CisJICAgICAgdGhpcy0+X1NfY29weShfTV9sb2NhbF9kYXRhLCBfTV9kYXRhKCksIF9NX2xlbmd0aCgpICsgMSk7CisJICAgICAgX01fZGVzdHJveShfX2NhcGFjaXR5KTsKKwkgICAgICBfTV9kYXRhKF9NX2xvY2FsX2RhdGEpOworCSAgICB9CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX19zc29fc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfTV9tdXRhdGUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19sZW4xLCBjb25zdCBfQ2hhclQqIF9fcywKKwkgICAgICBzaXplX3R5cGUgX19sZW4yKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2hvd19tdWNoID0gX01fbGVuZ3RoKCkgLSBfX3BvcyAtIF9fbGVuMTsKKyAgICAgIAorICAgICAgc2l6ZV90eXBlIF9fbmV3X2NhcGFjaXR5ID0gX01fbGVuZ3RoKCkgKyBfX2xlbjIgLSBfX2xlbjE7CisgICAgICBfQ2hhclQqIF9fciA9IF9NX2NyZWF0ZShfX25ld19jYXBhY2l0eSwgX01fY2FwYWNpdHkoKSk7CisKKyAgICAgIGlmIChfX3BvcykKKwl0aGlzLT5fU19jb3B5KF9fciwgX01fZGF0YSgpLCBfX3Bvcyk7CisgICAgICBpZiAoX19zICYmIF9fbGVuMikKKwl0aGlzLT5fU19jb3B5KF9fciArIF9fcG9zLCBfX3MsIF9fbGVuMik7CisgICAgICBpZiAoX19ob3dfbXVjaCkKKwl0aGlzLT5fU19jb3B5KF9fciArIF9fcG9zICsgX19sZW4yLAorCQkgICAgICBfTV9kYXRhKCkgKyBfX3BvcyArIF9fbGVuMSwgX19ob3dfbXVjaCk7CisgICAgICAKKyAgICAgIF9NX2Rpc3Bvc2UoKTsKKyAgICAgIF9NX2RhdGEoX19yKTsKKyAgICAgIF9NX2NhcGFjaXR5KF9fbmV3X2NhcGFjaXR5KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9fc3NvX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX01fZXJhc2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2hvd19tdWNoID0gX01fbGVuZ3RoKCkgLSBfX3BvcyAtIF9fbjsKKworICAgICAgaWYgKF9faG93X211Y2ggJiYgX19uKQorCXRoaXMtPl9TX21vdmUoX01fZGF0YSgpICsgX19wb3MsIF9NX2RhdGEoKSArIF9fcG9zICsgX19uLCBfX2hvd19tdWNoKTsKKworICAgICAgX01fc2V0X2xlbmd0aChfTV9sZW5ndGgoKSAtIF9fbik7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfU1NPX1NUUklOR19CQVNFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3N0ZGlvX2ZpbGVidWYuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3N0ZGlvX2ZpbGVidWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWQ2NmFkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvc3RkaW9fZmlsZWJ1Zi5oCkBAIC0wLDAgKzEsMTYyIEBACisvLyBGaWxlIGRlc2NyaXB0b3IgbGF5ZXIgZm9yIGZpbGVidWYgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAyLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9zdGRpb19maWxlYnVmLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9TVERJT19GSUxFQlVGX0gKKyNkZWZpbmUgX1NURElPX0ZJTEVCVUZfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGZzdHJlYW0+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBicmllZiBQcm92aWRlcyBhIGxheWVyIG9mIGNvbXBhdGliaWxpdHkgZm9yIEMvUE9TSVguCisgICAqICBAaW5ncm91cCBpbworICAgKgorICAgKiAgVGhpcyBHTlUgZXh0ZW5zaW9uIHByb3ZpZGVzIGV4dGVuc2lvbnMgZm9yIHdvcmtpbmcgd2l0aCBzdGFuZGFyZCBDCisgICAqICBGSUxFKidzIGFuZCBQT1NJWCBmaWxlIGRlc2NyaXB0b3JzLiAgSXQgbXVzdCBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlCisgICAqICB1c2VyIHdpdGggdGhlIHR5cGUgb2YgY2hhcmFjdGVyIHVzZWQgaW4gdGhlIGZpbGUgc3RyZWFtLCBlLmcuLAorICAgKiAgc3RkaW9fZmlsZWJ1ZjxjaGFyPi4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+ID4KKyAgICBjbGFzcyBzdGRpb19maWxlYnVmIDogcHVibGljIHN0ZDo6YmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiBfQ2hhclQJCQkJICAgICAgICBjaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcmFpdHMJCQkJICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlCQlwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om9mZl90eXBlCQlvZmZfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90OworCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBkZWZlcnJlZCBpbml0aWFsaXphdGlvbgorICAgICAgKi8KKyAgICAgIHN0ZGlvX2ZpbGVidWYoKSA6IHN0ZDo6YmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KCkge30KKworICAgICAgLyoqCisgICAgICAgKiAgQHBhcmFtICBfX2ZkICBBbiBvcGVuIGZpbGUgZGVzY3JpcHRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fbW9kZSAgU2FtZSBtZWFuaW5nIGFzIGluIGEgc3RhbmRhcmQgZmlsZWJ1Zi4KKyAgICAgICAqICBAcGFyYW0gIF9fc2l6ZSBPcHRpbWFsIG9yIHByZWZlcnJlZCBzaXplIG9mIGludGVybmFsIGJ1ZmZlciwKKyAgICAgICAqICAgICAgICAgICAgICAgICBpbiBjaGFycy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBjb25zdHJ1Y3RvciBhc3NvY2lhdGVzIGEgZmlsZSBzdHJlYW0gYnVmZmVyIHdpdGggYW4gb3BlbgorICAgICAgICogIFBPU0lYIGZpbGUgZGVzY3JpcHRvci4gVGhlIGZpbGUgZGVzY3JpcHRvciB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKKyAgICAgICAqICBjbG9zZWQgd2hlbiB0aGUgc3RkaW9fZmlsZWJ1ZiBpcyBjbG9zZWQvZGVzdHJveWVkLgorICAgICAgKi8KKyAgICAgIHN0ZGlvX2ZpbGVidWYoaW50IF9fZmQsIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSwKKwkJICAgIHNpemVfdCBfX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KEJVRlNJWikpOworCisgICAgICAvKioKKyAgICAgICAqICBAcGFyYW0gIF9fZiAgQW4gb3BlbiBAYyBGSUxFKi4KKyAgICAgICAqICBAcGFyYW0gIF9fbW9kZSAgU2FtZSBtZWFuaW5nIGFzIGluIGEgc3RhbmRhcmQgZmlsZWJ1Zi4KKyAgICAgICAqICBAcGFyYW0gIF9fc2l6ZSBPcHRpbWFsIG9yIHByZWZlcnJlZCBzaXplIG9mIGludGVybmFsIGJ1ZmZlciwKKyAgICAgICAqICAgICAgICAgICAgICAgICBpbiBjaGFycy4gIERlZmF1bHRzIHRvIHN5c3RlbSdzIEBjIEJVRlNJWi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBjb25zdHJ1Y3RvciBhc3NvY2lhdGVzIGEgZmlsZSBzdHJlYW0gYnVmZmVyIHdpdGggYW4gb3BlbgorICAgICAgICogIEMgQGMgRklMRSouICBUaGUgQGMgRklMRSogd2lsbCBub3QgYmUgYXV0b21hdGljYWxseSBjbG9zZWQgd2hlbiB0aGUKKyAgICAgICAqICBzdGRpb19maWxlYnVmIGlzIGNsb3NlZC9kZXN0cm95ZWQuCisgICAgICAqLworICAgICAgc3RkaW9fZmlsZWJ1ZihzdGQ6Ol9fY19maWxlKiBfX2YsIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSwKKwkJICAgIHNpemVfdCBfX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KEJVRlNJWikpOworCisgICAgICAvKioKKyAgICAgICAqICBDbG9zZXMgdGhlIGV4dGVybmFsIGRhdGEgc3RyZWFtIGlmIHRoZSBmaWxlIGRlc2NyaXB0b3IgY29uc3RydWN0b3IKKyAgICAgICAqICB3YXMgdXNlZC4KKyAgICAgICovCisgICAgICB2aXJ0dWFsCisgICAgICB+c3RkaW9fZmlsZWJ1ZigpOworCisgICAgICAvKioKKyAgICAgICAqICBAcmV0dXJuICBUaGUgdW5kZXJseWluZyBmaWxlIGRlc2NyaXB0b3IuCisgICAgICAgKgorICAgICAgICogIE9uY2UgYXNzb2NpYXRlZCB3aXRoIGFuIGV4dGVybmFsIGRhdGEgc3RyZWFtLCB0aGlzIGZ1bmN0aW9uIGNhbiBiZQorICAgICAgICogIHVzZWQgdG8gYWNjZXNzIHRoZSB1bmRlcmx5aW5nIFBPU0lYIGZpbGUgZGVzY3JpcHRvci4gIE5vdGUgdGhhdAorICAgICAgICogIHRoZXJlIGlzIG5vIHdheSBmb3IgdGhlIGxpYnJhcnkgdG8gdHJhY2sgd2hhdCB5b3UgZG8gd2l0aCB0aGUKKyAgICAgICAqICBkZXNjcmlwdG9yLCBzbyBiZSBjYXJlZnVsLgorICAgICAgKi8KKyAgICAgIGludAorICAgICAgZmQoKSB7IHJldHVybiB0aGlzLT5fTV9maWxlLmZkKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQHJldHVybiAgVGhlIHVuZGVybHlpbmcgRklMRSouCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSB1bmRlcmx5aW5nICJDIiBmaWxlIHBvaW50ZXIuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHdheSBmb3IgdGhlIGxpYnJhcnkgdG8gdHJhY2sgd2hhdCB5b3UgZG8KKyAgICAgICAqICB3aXRoIHRoZSBmaWxlLCBzbyBiZSBjYXJlZnVsLgorICAgICAgICovCisgICAgICBzdGQ6Ol9fY19maWxlKgorICAgICAgZmlsZSgpIHsgcmV0dXJuIHRoaXMtPl9NX2ZpbGUuZmlsZSgpOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkaW9fZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+Ojp+c3RkaW9fZmlsZWJ1ZigpCisgICAgeyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZGlvX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgc3RkaW9fZmlsZWJ1ZihpbnQgX19mZCwgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlLCBzaXplX3QgX19zaXplKQorICAgIHsKKyAgICAgIHRoaXMtPl9NX2ZpbGUuc3lzX29wZW4oX19mZCwgX19tb2RlKTsKKyAgICAgIGlmICh0aGlzLT5pc19vcGVuKCkpCisJeworCSAgdGhpcy0+X01fbW9kZSA9IF9fbW9kZTsKKwkgIHRoaXMtPl9NX2J1Zl9zaXplID0gX19zaXplOworCSAgdGhpcy0+X01fYWxsb2NhdGVfaW50ZXJuYWxfYnVmZmVyKCk7CisJICB0aGlzLT5fTV9yZWFkaW5nID0gZmFsc2U7CisJICB0aGlzLT5fTV93cml0aW5nID0gZmFsc2U7CisJICB0aGlzLT5fTV9zZXRfYnVmZmVyKC0xKTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGRpb19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHN0ZGlvX2ZpbGVidWYoc3RkOjpfX2NfZmlsZSogX19mLCBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUsCisJCSAgc2l6ZV90IF9fc2l6ZSkKKyAgICB7CisgICAgICB0aGlzLT5fTV9maWxlLnN5c19vcGVuKF9fZiwgX19tb2RlKTsKKyAgICAgIGlmICh0aGlzLT5pc19vcGVuKCkpCisJeworCSAgdGhpcy0+X01fbW9kZSA9IF9fbW9kZTsKKwkgIHRoaXMtPl9NX2J1Zl9zaXplID0gX19zaXplOworCSAgdGhpcy0+X01fYWxsb2NhdGVfaW50ZXJuYWxfYnVmZmVyKCk7CisJICB0aGlzLT5fTV9yZWFkaW5nID0gZmFsc2U7CisJICB0aGlzLT5fTV93cml0aW5nID0gZmFsc2U7CisJICB0aGlzLT5fTV9zZXRfYnVmZmVyKC0xKTsKKwl9CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvc3RkaW9fc3luY19maWxlYnVmLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9zdGRpb19zeW5jX2ZpbGVidWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzUzYzAwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvc3RkaW9fc3luY19maWxlYnVmLmgKQEAgLTAsMCArMSwyODkgQEAKKy8vIElvc3RyZWFtcyB3cmFwcGVyIGZvciBzdGRpbyBGSUxFKiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L3N0ZGlvX3N5bmNfZmlsZWJ1Zi5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfU1RESU9fU1lOQ19GSUxFQlVGX0gKKyNkZWZpbmUgX1NURElPX1NZTkNfRklMRUJVRl9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8c3RyZWFtYnVmPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxiaXRzL2MrK2lvLmg+ICAvLyBGb3IgX19jX2ZpbGUKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisjaW5jbHVkZSA8Y3djaGFyPgorI2VuZGlmCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBicmllZiBQcm92aWRlcyBhIGxheWVyIG9mIGNvbXBhdGliaWxpdHkgZm9yIEMuCisgICAqICBAaW5ncm91cCBpbworICAgKgorICAgKiAgVGhpcyBHTlUgZXh0ZW5zaW9uIHByb3ZpZGVzIGV4dGVuc2lvbnMgZm9yIHdvcmtpbmcgd2l0aCBzdGFuZGFyZAorICAgKiAgQyBGSUxFKidzLiAgSXQgbXVzdCBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlIHVzZXIgd2l0aCB0aGUgdHlwZSBvZgorICAgKiAgY2hhcmFjdGVyIHVzZWQgaW4gdGhlIGZpbGUgc3RyZWFtLCBlLmcuLCBzdGRpb19maWxlYnVmPGNoYXI+LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD4gPgorICAgIGNsYXNzIHN0ZGlvX3N5bmNfZmlsZWJ1ZiA6IHB1YmxpYyBzdGQ6OmJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiBfQ2hhclQJCQkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cwkJCQkJdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZQkJaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZQkJcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZQkJb2ZmX3R5cGU7CisKKyAgICBwcml2YXRlOgorICAgICAgLy8gVW5kZXJseWluZyBzdGRpbyBGSUxFCisgICAgICBzdGQ6Ol9fY19maWxlKiBjb25zdCBfTV9maWxlOworCisgICAgICAvLyBMYXN0IGNoYXJhY3RlciBnb3R0ZW4uIFRoaXMgaXMgdXNlZCB3aGVuIHBiYWNrZmFpbCBpcworICAgICAgLy8gY2FsbGVkIGZyb20gYmFzaWNfc3RyZWFtYnVmOjpzdW5nZXRjKCkKKyAgICAgIGludF90eXBlIF9NX3VuZ2V0X2J1ZjsKKworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0CisgICAgICBzdGRpb19zeW5jX2ZpbGVidWYoc3RkOjpfX2NfZmlsZSogX19mKQorICAgICAgOiBfTV9maWxlKF9fZiksIF9NX3VuZ2V0X2J1Zih0cmFpdHNfdHlwZTo6ZW9mKCkpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQHJldHVybiAgVGhlIHVuZGVybHlpbmcgRklMRSouCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSB1bmRlcmx5aW5nIEMgZmlsZSBwb2ludGVyLgorICAgICAgICogIE5vdGUgdGhhdCB0aGVyZSBpcyBubyB3YXkgZm9yIHRoZSBsaWJyYXJ5IHRvIHRyYWNrIHdoYXQgeW91IGRvCisgICAgICAgKiAgd2l0aCB0aGUgZmlsZSwgc28gYmUgY2FyZWZ1bC4KKyAgICAgICAqLworICAgICAgc3RkOjpfX2NfZmlsZSogY29uc3QKKyAgICAgIGZpbGUoKSB7IHJldHVybiB0aGlzLT5fTV9maWxlOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBpbnRfdHlwZQorICAgICAgc3luY2dldGMoKTsKKworICAgICAgaW50X3R5cGUKKyAgICAgIHN5bmN1bmdldGMoaW50X3R5cGUgX19jKTsKKworICAgICAgaW50X3R5cGUKKyAgICAgIHN5bmNwdXRjKGludF90eXBlIF9fYyk7CisKKyAgICAgIHZpcnR1YWwgaW50X3R5cGUKKyAgICAgIHVuZGVyZmxvdygpCisgICAgICB7CisJaW50X3R5cGUgX19jID0gdGhpcy0+c3luY2dldGMoKTsKKwlyZXR1cm4gdGhpcy0+c3luY3VuZ2V0YyhfX2MpOworICAgICAgfQorCisgICAgICB2aXJ0dWFsIGludF90eXBlCisgICAgICB1ZmxvdygpCisgICAgICB7CisJLy8gU3RvcmUgdGhlIGdvdHRlbiBjaGFyYWN0ZXIgaW4gY2FzZSB3ZSBuZWVkIHRvIHVuZ2V0IGl0LgorCV9NX3VuZ2V0X2J1ZiA9IHRoaXMtPnN5bmNnZXRjKCk7CisJcmV0dXJuIF9NX3VuZ2V0X2J1ZjsKKyAgICAgIH0KKworICAgICAgdmlydHVhbCBpbnRfdHlwZQorICAgICAgcGJhY2tmYWlsKGludF90eXBlIF9fYyA9IHRyYWl0c190eXBlOjplb2YoKSkKKyAgICAgIHsKKwlpbnRfdHlwZSBfX3JldDsKKwljb25zdCBpbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKworCS8vIENoZWNrIGlmIHRoZSB1bmdldCBvciBwdXRiYWNrIHdhcyByZXF1ZXN0ZWQKKwlpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKSAvLyB1bmdldAorCSAgeworCSAgICBpZiAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfTV91bmdldF9idWYsIF9fZW9mKSkKKwkgICAgICBfX3JldCA9IHRoaXMtPnN5bmN1bmdldGMoX01fdW5nZXRfYnVmKTsKKwkgICAgZWxzZSAvLyBidWZmZXIgaW52YWxpZCwgZmFpbC4KKwkgICAgICBfX3JldCA9IF9fZW9mOworCSAgfQorCWVsc2UgLy8gcHV0YmFjaworCSAgX19yZXQgPSB0aGlzLT5zeW5jdW5nZXRjKF9fYyk7CisKKwkvLyBUaGUgYnVmZmVyZWQgY2hhcmFjdGVyIGlzIG5vIGxvbmdlciB2YWxpZCwgZGlzY2FyZCBpdC4KKwlfTV91bmdldF9idWYgPSBfX2VvZjsKKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIHZpcnR1YWwgc3RkOjpzdHJlYW1zaXplCisgICAgICB4c2dldG4oY2hhcl90eXBlKiBfX3MsIHN0ZDo6c3RyZWFtc2l6ZSBfX24pOworCisgICAgICB2aXJ0dWFsIGludF90eXBlCisgICAgICBvdmVyZmxvdyhpbnRfdHlwZSBfX2MgPSB0cmFpdHNfdHlwZTo6ZW9mKCkpCisgICAgICB7CisJaW50X3R5cGUgX19yZXQ7CisJaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIHRyYWl0c190eXBlOjplb2YoKSkpCisJICB7CisJICAgIGlmIChzdGQ6OmZmbHVzaChfTV9maWxlKSkKKwkgICAgICBfX3JldCA9IHRyYWl0c190eXBlOjplb2YoKTsKKwkgICAgZWxzZQorCSAgICAgIF9fcmV0ID0gdHJhaXRzX3R5cGU6Om5vdF9lb2YoX19jKTsKKwkgIH0KKwllbHNlCisJICBfX3JldCA9IHRoaXMtPnN5bmNwdXRjKF9fYyk7CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgICAgICB2aXJ0dWFsIHN0ZDo6c3RyZWFtc2l6ZQorICAgICAgeHNwdXRuKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzdGQ6OnN0cmVhbXNpemUgX19uKTsKKworICAgICAgdmlydHVhbCBpbnQKKyAgICAgIHN5bmMoKQorICAgICAgeyByZXR1cm4gc3RkOjpmZmx1c2goX01fZmlsZSk7IH0KKworICAgICAgdmlydHVhbCBzdGQ6OnN0cmVhbXBvcworICAgICAgc2Vla29mZihzdGQ6OnN0cmVhbW9mZiBfX29mZiwgc3RkOjppb3NfYmFzZTo6c2Vla2RpciBfX2RpciwKKwkgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSA9IHN0ZDo6aW9zX2Jhc2U6OmluIHwgc3RkOjppb3NfYmFzZTo6b3V0KQorICAgICAgeworCXN0ZDo6c3RyZWFtcG9zIF9fcmV0KHN0ZDo6c3RyZWFtb2ZmKC0xKSk7CisJaW50IF9fd2hlbmNlOworCWlmIChfX2RpciA9PSBzdGQ6Omlvc19iYXNlOjpiZWcpCisJICBfX3doZW5jZSA9IFNFRUtfU0VUOworCWVsc2UgaWYgKF9fZGlyID09IHN0ZDo6aW9zX2Jhc2U6OmN1cikKKwkgIF9fd2hlbmNlID0gU0VFS19DVVI7CisJZWxzZQorCSAgX193aGVuY2UgPSBTRUVLX0VORDsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfTEZTCisJaWYgKCFmc2Vla282NChfTV9maWxlLCBfX29mZiwgX193aGVuY2UpKQorCSAgX19yZXQgPSBzdGQ6OnN0cmVhbXBvcyhmdGVsbG82NChfTV9maWxlKSk7CisjZWxzZQorCWlmICghZnNlZWsoX01fZmlsZSwgX19vZmYsIF9fd2hlbmNlKSkKKwkgIF9fcmV0ID0gc3RkOjpzdHJlYW1wb3Moc3RkOjpmdGVsbChfTV9maWxlKSk7CisjZW5kaWYKKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIHZpcnR1YWwgc3RkOjpzdHJlYW1wb3MKKyAgICAgIHNlZWtwb3Moc3RkOjpzdHJlYW1wb3MgX19wb3MsCisJICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0KKwkgICAgICBzdGQ6Omlvc19iYXNlOjppbiB8IHN0ZDo6aW9zX2Jhc2U6Om91dCkKKyAgICAgIHsgcmV0dXJuIHNlZWtvZmYoc3RkOjpzdHJlYW1vZmYoX19wb3MpLCBzdGQ6Omlvc19iYXNlOjpiZWcsIF9fbW9kZSk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgc3RkaW9fc3luY19maWxlYnVmPGNoYXI+OjppbnRfdHlwZQorICAgIHN0ZGlvX3N5bmNfZmlsZWJ1ZjxjaGFyPjo6c3luY2dldGMoKQorICAgIHsgcmV0dXJuIHN0ZDo6Z2V0YyhfTV9maWxlKTsgfQorCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgc3RkaW9fc3luY19maWxlYnVmPGNoYXI+OjppbnRfdHlwZQorICAgIHN0ZGlvX3N5bmNfZmlsZWJ1ZjxjaGFyPjo6c3luY3VuZ2V0YyhpbnRfdHlwZSBfX2MpCisgICAgeyByZXR1cm4gc3RkOjp1bmdldGMoX19jLCBfTV9maWxlKTsgfQorCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgc3RkaW9fc3luY19maWxlYnVmPGNoYXI+OjppbnRfdHlwZQorICAgIHN0ZGlvX3N5bmNfZmlsZWJ1ZjxjaGFyPjo6c3luY3B1dGMoaW50X3R5cGUgX19jKQorICAgIHsgcmV0dXJuIHN0ZDo6cHV0YyhfX2MsIF9NX2ZpbGUpOyB9CisKKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSBzdGQ6OnN0cmVhbXNpemUKKyAgICBzdGRpb19zeW5jX2ZpbGVidWY8Y2hhcj46OnhzZ2V0bihjaGFyKiBfX3MsIHN0ZDo6c3RyZWFtc2l6ZSBfX24pCisgICAgeworICAgICAgc3RkOjpzdHJlYW1zaXplIF9fcmV0ID0gc3RkOjpmcmVhZChfX3MsIDEsIF9fbiwgX01fZmlsZSk7CisgICAgICBpZiAoX19yZXQgPiAwKQorCV9NX3VuZ2V0X2J1ZiA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZShfX3NbX19yZXQgLSAxXSk7CisgICAgICBlbHNlCisJX01fdW5nZXRfYnVmID0gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIHN0ZDo6c3RyZWFtc2l6ZQorICAgIHN0ZGlvX3N5bmNfZmlsZWJ1ZjxjaGFyPjo6eHNwdXRuKGNvbnN0IGNoYXIqIF9fcywgc3RkOjpzdHJlYW1zaXplIF9fbikKKyAgICB7IHJldHVybiBzdGQ6OmZ3cml0ZShfX3MsIDEsIF9fbiwgX01fZmlsZSk7IH0KKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgc3RkaW9fc3luY19maWxlYnVmPHdjaGFyX3Q+OjppbnRfdHlwZQorICAgIHN0ZGlvX3N5bmNfZmlsZWJ1Zjx3Y2hhcl90Pjo6c3luY2dldGMoKQorICAgIHsgcmV0dXJuIHN0ZDo6Z2V0d2MoX01fZmlsZSk7IH0KKworICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIHN0ZGlvX3N5bmNfZmlsZWJ1Zjx3Y2hhcl90Pjo6aW50X3R5cGUKKyAgICBzdGRpb19zeW5jX2ZpbGVidWY8d2NoYXJfdD46OnN5bmN1bmdldGMoaW50X3R5cGUgX19jKQorICAgIHsgcmV0dXJuIHN0ZDo6dW5nZXR3YyhfX2MsIF9NX2ZpbGUpOyB9CisKKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSBzdGRpb19zeW5jX2ZpbGVidWY8d2NoYXJfdD46OmludF90eXBlCisgICAgc3RkaW9fc3luY19maWxlYnVmPHdjaGFyX3Q+OjpzeW5jcHV0YyhpbnRfdHlwZSBfX2MpCisgICAgeyByZXR1cm4gc3RkOjpwdXR3YyhfX2MsIF9NX2ZpbGUpOyB9CisKKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSBzdGQ6OnN0cmVhbXNpemUKKyAgICBzdGRpb19zeW5jX2ZpbGVidWY8d2NoYXJfdD46OnhzZ2V0bih3Y2hhcl90KiBfX3MsIHN0ZDo6c3RyZWFtc2l6ZSBfX24pCisgICAgeworICAgICAgc3RkOjpzdHJlYW1zaXplIF9fcmV0ID0gMDsKKyAgICAgIGNvbnN0IGludF90eXBlIF9fZW9mID0gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgd2hpbGUgKF9fbi0tKQorCXsKKwkgIGludF90eXBlIF9fYyA9IHRoaXMtPnN5bmNnZXRjKCk7CisJICBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKQorCSAgICBicmVhazsKKwkgIF9fc1tfX3JldF0gPSB0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYyk7CisJICArK19fcmV0OworCX0KKworICAgICAgaWYgKF9fcmV0ID4gMCkKKwlfTV91bmdldF9idWYgPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoX19zW19fcmV0IC0gMV0pOworICAgICAgZWxzZQorCV9NX3VuZ2V0X2J1ZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSBzdGQ6OnN0cmVhbXNpemUKKyAgICBzdGRpb19zeW5jX2ZpbGVidWY8d2NoYXJfdD46OnhzcHV0bihjb25zdCB3Y2hhcl90KiBfX3MsCisJCQkJCXN0ZDo6c3RyZWFtc2l6ZSBfX24pCisgICAgeworICAgICAgc3RkOjpzdHJlYW1zaXplIF9fcmV0ID0gMDsKKyAgICAgIGNvbnN0IGludF90eXBlIF9fZW9mID0gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgd2hpbGUgKF9fbi0tKQorCXsKKwkgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUodGhpcy0+c3luY3B1dGMoKl9fcysrKSwgX19lb2YpKQorCSAgICBicmVhazsKKwkgICsrX19yZXQ7CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKyNlbmRpZgorCisjaWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBzdGRpb19zeW5jX2ZpbGVidWY8Y2hhcj47CisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIHN0ZGlvX3N5bmNfZmlsZWJ1Zjx3Y2hhcl90PjsKKyNlbmRpZgorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9zdHJpbmdfY29udmVyc2lvbnMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3N0cmluZ19jb252ZXJzaW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YTc3YzAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC9zdHJpbmdfY29udmVyc2lvbnMuaApAQCAtMCwwICsxLDEwNyBAQAorLy8gU3RyaW5nIENvbnZlcnNpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvc3RyaW5nX2NvbnZlcnNpb25zLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9TVFJJTkdfQ09OVkVSU0lPTlNfSAorI2RlZmluZSBfU1RSSU5HX0NPTlZFUlNJT05TX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxleHQvbnVtZXJpY190cmFpdHMuaD4KKyNpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjd2NoYXI+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNlcnJubz4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIEhlbHBlciBmb3IgYWxsIHRoZSBzdG8qIGZ1bmN0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RSZXQsIHR5cGVuYW1lIF9SZXQgPSBfVFJldCwgdHlwZW5hbWUgX0NoYXJULAorCSAgIHR5cGVuYW1lLi4uIF9CYXNlPgorICAgIF9SZXQKKyAgICBfX3N0b2EoX1RSZXQgKCpfX2NvbnZmKSAoY29uc3QgX0NoYXJUKiwgX0NoYXJUKiosIF9CYXNlLi4uKSwKKwkgICBjb25zdCBjaGFyKiBfX25hbWUsIGNvbnN0IF9DaGFyVCogX19zdHIsIHN0ZDo6c2l6ZV90KiBfX2lkeCwKKwkgICBfQmFzZS4uLiBfX2Jhc2UpCisgICAgeworICAgICAgX1JldCBfX3JldDsKKworICAgICAgX0NoYXJUKiBfX2VuZHB0cjsKKyAgICAgIGVycm5vID0gMDsKKyAgICAgIGNvbnN0IF9UUmV0IF9fdG1wID0gX19jb252ZihfX3N0ciwgJl9fZW5kcHRyLCBfX2Jhc2UuLi4pOworCisgICAgICBpZiAoX19lbmRwdHIgPT0gX19zdHIpCisJc3RkOjpfX3Rocm93X2ludmFsaWRfYXJndW1lbnQoX19uYW1lKTsKKyAgICAgIGVsc2UgaWYgKGVycm5vID09IEVSQU5HRQorCSAgICAgICB8fCAoc3RkOjpfX2FyZV9zYW1lPF9SZXQsIGludD46Ol9fdmFsdWUKKwkJICAgJiYgKF9fdG1wIDwgX19udW1lcmljX3RyYWl0czxpbnQ+OjpfX21pbgorCQkgICAgICAgfHwgX190bXAgPiBfX251bWVyaWNfdHJhaXRzPGludD46Ol9fbWF4KSkpCisJc3RkOjpfX3Rocm93X291dF9vZl9yYW5nZShfX25hbWUpOworICAgICAgZWxzZQorCV9fcmV0ID0gX190bXA7CisKKyAgICAgIGlmIChfX2lkeCkKKwkqX19pZHggPSBfX2VuZHB0ciAtIF9fc3RyOworCisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIC8vIEhlbHBlciBmb3IgdGhlIHRvX3N0cmluZyAvIHRvX3dzdHJpbmcgZnVuY3Rpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3RyaW5nLCB0eXBlbmFtZSBfQ2hhclQgPSB0eXBlbmFtZSBfU3RyaW5nOjp2YWx1ZV90eXBlPgorICAgIF9TdHJpbmcKKyAgICBfX3RvX3hzdHJpbmcoaW50ICgqX19jb252ZikgKF9DaGFyVCosIHN0ZDo6c2l6ZV90LCBjb25zdCBfQ2hhclQqLAorCQkJCSBfX2J1aWx0aW5fdmFfbGlzdCksIHN0ZDo6c2l6ZV90IF9fbiwKKwkJIGNvbnN0IF9DaGFyVCogX19mbXQsIC4uLikKKyAgICB7CisgICAgICAvLyBYWFggRXZlbnR1YWxseSB0aGUgcmVzdWx0IHdpbGwgYmUgY29uc3RydWN0ZWQgaW4gcGxhY2UgaW4KKyAgICAgIC8vIHRoZSBDKysweCBzdHJpbmcsIGxpa2VseSB3aXRoIHRoZSBoZWxwIG9mIGludGVybmFsIGhvb2tzLgorICAgICAgX0NoYXJUKiBfX3MgPSBzdGF0aWNfY2FzdDxfQ2hhclQqPihfX2J1aWx0aW5fYWxsb2NhKHNpemVvZihfQ2hhclQpCisJCQkJCQkJICAqIF9fbikpOworCisgICAgICBfX2J1aWx0aW5fdmFfbGlzdCBfX2FyZ3M7CisgICAgICBfX2J1aWx0aW5fdmFfc3RhcnQoX19hcmdzLCBfX2ZtdCk7CisKKyAgICAgIGNvbnN0IGludCBfX2xlbiA9IF9fY29udmYoX19zLCBfX24sIF9fZm10LCBfX2FyZ3MpOworCisgICAgICBfX2J1aWx0aW5fdmFfZW5kKF9fYXJncyk7CisKKyAgICAgIHJldHVybiBfU3RyaW5nKF9fcywgX19zICsgX19sZW4pOworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vIF9TVFJJTkdfQ09OVkVSU0lPTlNfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvdGhyb3dfYWxsb2NhdG9yLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC90aHJvd19hbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTYxMGVkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvdGhyb3dfYWxsb2NhdG9yLmgKQEAgLTAsMCArMSw4MTYgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKiBAZmlsZSBleHQvdGhyb3dfYWxsb2NhdG9yLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqCisgKiAgQ29udGFpbnMgdHdvIGV4Y2VwdGlvbi1nZW5lcmF0aW5nIHR5cGVzICh0aHJvd192YWx1ZSwgdGhyb3dfYWxsb2NhdG9yKQorICogIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgdmFsdWUgYW5kIGFsbG9jYXRvciB0eXBlcyB3aGlsZSB0ZXN0aW5nCisgKiAgZXhjZXB0aW9uIHNhZmV0eSBpbiB0ZW1wbGF0aXplZCBjb250YWluZXJzIGFuZCBhbGdvcml0aG1zLiBUaGUKKyAqICBhbGxvY2F0b3IgaGFzIGFkZGl0aW9uYWwgbG9nIGFuZCBkZWJ1ZyBmZWF0dXJlcy4gVGhlIGV4Y2VwdGlvbgorICogIGdlbmVyYXRlZCBpcyBvZiB0eXBlIGZvcmNlZF9leGNlcHRpb25fZXJyb3IuCisgKi8KKworI2lmbmRlZiBfVEhST1dfQUxMT0NBVE9SX0gKKyNkZWZpbmUgX1RIUk9XX0FMTE9DQVRPUl9IIDEKKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGN0aW1lPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+CisjaW5jbHVkZSA8Yml0cy9tb3ZlLmg+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorIyBpbmNsdWRlIDxmdW5jdGlvbmFsPgorIyBpbmNsdWRlIDxyYW5kb20+CisjZWxzZQorIyBpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbD4KKyMgaW5jbHVkZSA8dHIxL3JhbmRvbT4KKyNlbmRpZgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAYnJpZWYgVGhvd24gYnkgZXhjZXB0aW9uIHNhZmV0eSBtYWNoaW5lcnkuCisgICAqICBAaW5ncm91cCBleGNlcHRpb25zCisgICAqLworICBzdHJ1Y3QgZm9yY2VkX2Vycm9yIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uCisgIHsgfTsKKworICAvLyBTdWJzdGl0dXRlIGZvciBmb3JjZWRfZXJyb3Igb2JqZWN0IHdoZW4gLWZuby1leGNlcHRpb25zLgorICBpbmxpbmUgdm9pZAorICBfX3Rocm93X2ZvcmNlZF9lcnJvcigpCisgIHsgX0dMSUJDWFhfVEhST1dfT1JfQUJPUlQoZm9yY2VkX2Vycm9yKCkpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQmFzZSBjbGFzcyBmb3IgY2hlY2tpbmcgYWRkcmVzcyBhbmQgbGFiZWwgaW5mb3JtYXRpb24KKyAgICogIGFib3V0IGFsbG9jYXRpb25zLiBDcmVhdGUgYSBzdGQ6Om1hcCBiZXR3ZWVuIHRoZSBhbGxvY2F0ZWQKKyAgICogIGFkZHJlc3MgKHZvaWQqKSBhbmQgYSBkYXR1bSBmb3IgYW5ub3RhdGlvbnMsIHdoaWNoIGFyZSBhIHBhaXIgb2YKKyAgICogIG51bWJlcnMgY29ycmVzcG9uZGluZyB0byBsYWJlbCBhbmQgYWxsb2NhdGVkIHNpemUuCisgICAqLworICBzdHJ1Y3QgYW5ub3RhdGVfYmFzZQorICB7CisgICAgYW5ub3RhdGVfYmFzZSgpCisgICAgeworICAgICAgbGFiZWwoKTsKKyAgICAgIG1hcCgpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkCisgICAgc2V0X2xhYmVsKHNpemVfdCBsKQorICAgIHsgbGFiZWwoKSA9IGw7IH0KKworICAgIHN0YXRpYyBzaXplX3QKKyAgICBnZXRfbGFiZWwoKQorICAgIHsgcmV0dXJuIGxhYmVsKCk7IH0KKworICAgIHZvaWQKKyAgICBpbnNlcnQodm9pZCogcCwgc2l6ZV90IHNpemUpCisgICAgeworICAgICAgaWYgKCFwKQorCXsKKwkgIHN0ZDo6c3RyaW5nIGVycm9yKCJhbm5vdGF0ZV9iYXNlOjppbnNlcnQgbnVsbCBpbnNlcnQhXG4iKTsKKwkgIGxvZ190b19zdHJpbmcoZXJyb3IsIG1ha2VfZW50cnkocCwgc2l6ZSkpOworCSAgc3RkOjpfX3Rocm93X2xvZ2ljX2Vycm9yKGVycm9yLmNfc3RyKCkpOworCX0KKworICAgICAgY29uc3RfaXRlcmF0b3IgZm91bmQgPSBtYXAoKS5maW5kKHApOworICAgICAgaWYgKGZvdW5kICE9IG1hcCgpLmVuZCgpKQorCXsKKwkgIHN0ZDo6c3RyaW5nIGVycm9yKCJhbm5vdGF0ZV9iYXNlOjppbnNlcnQgZG91YmxlIGluc2VydCFcbiIpOworCSAgbG9nX3RvX3N0cmluZyhlcnJvciwgbWFrZV9lbnRyeShwLCBzaXplKSk7CisJICBsb2dfdG9fc3RyaW5nKGVycm9yLCAqZm91bmQpOworCSAgc3RkOjpfX3Rocm93X2xvZ2ljX2Vycm9yKGVycm9yLmNfc3RyKCkpOworCX0KKworICAgICAgbWFwKCkuaW5zZXJ0KG1ha2VfZW50cnkocCwgc2l6ZSkpOworICAgIH0KKworICAgIHZvaWQKKyAgICBlcmFzZSh2b2lkKiBwLCBzaXplX3Qgc2l6ZSkKKyAgICB7CisgICAgICBjaGVja19hbGxvY2F0ZWQocCwgc2l6ZSk7CisgICAgICBtYXAoKS5lcmFzZShwKTsKKyAgICB9CisKKyAgICAvLyBTZWUgaWYgYSBwYXJ0aWN1bGFyIGFkZHJlc3MgYW5kIGFsbG9jYXRpb24gc2l6ZSBoYXMgYmVlbiBzYXZlZC4KKyAgICBpbmxpbmUgdm9pZAorICAgIGNoZWNrX2FsbG9jYXRlZCh2b2lkKiBwLCBzaXplX3Qgc2l6ZSkKKyAgICB7CisgICAgICBjb25zdF9pdGVyYXRvciBmb3VuZCA9IG1hcCgpLmZpbmQocCk7CisgICAgICBpZiAoZm91bmQgPT0gbWFwKCkuZW5kKCkpCisJeworCSAgc3RkOjpzdHJpbmcgZXJyb3IoImFubm90YXRlX2Jhc2U6OmNoZWNrX2FsbG9jYXRlZCBieSB2YWx1ZSAiCisJCQkgICAgIm51bGwgZXJhc2UhXG4iKTsKKwkgIGxvZ190b19zdHJpbmcoZXJyb3IsIG1ha2VfZW50cnkocCwgc2l6ZSkpOworCSAgc3RkOjpfX3Rocm93X2xvZ2ljX2Vycm9yKGVycm9yLmNfc3RyKCkpOworCX0KKworICAgICAgaWYgKGZvdW5kLT5zZWNvbmQuc2Vjb25kICE9IHNpemUpCisJeworCSAgc3RkOjpzdHJpbmcgZXJyb3IoImFubm90YXRlX2Jhc2U6OmNoZWNrX2FsbG9jYXRlZCBieSB2YWx1ZSAiCisJCQkgICAgIndyb25nLXNpemUgZXJhc2UhXG4iKTsKKwkgIGxvZ190b19zdHJpbmcoZXJyb3IsIG1ha2VfZW50cnkocCwgc2l6ZSkpOworCSAgbG9nX3RvX3N0cmluZyhlcnJvciwgKmZvdW5kKTsKKwkgIHN0ZDo6X190aHJvd19sb2dpY19lcnJvcihlcnJvci5jX3N0cigpKTsKKwl9CisgICAgfQorCisgICAgLy8gU2VlIGlmIGEgZ2l2ZW4gbGFiZWwgaGFzIGJlZW4gYWxsb2NhdGVkLgorICAgIGlubGluZSB2b2lkCisgICAgY2hlY2tfYWxsb2NhdGVkKHNpemVfdCBsYWJlbCkKKyAgICB7CisgICAgICBjb25zdF9pdGVyYXRvciBiZWcgPSBtYXAoKS5iZWdpbigpOworICAgICAgY29uc3RfaXRlcmF0b3IgZW5kID0gbWFwKCkuZW5kKCk7CisgICAgICBzdGQ6OnN0cmluZyBmb3VuZDsKKyAgICAgIHdoaWxlIChiZWcgIT0gZW5kKQorCXsKKwkgIGlmIChiZWctPnNlY29uZC5maXJzdCA9PSBsYWJlbCkKKwkgICAgbG9nX3RvX3N0cmluZyhmb3VuZCwgKmJlZyk7CisJICArK2JlZzsKKwl9CisKKyAgICAgIGlmICghZm91bmQuZW1wdHkoKSkKKwl7CisJICBzdGQ6OnN0cmluZyBlcnJvcigiYW5ub3RhdGVfYmFzZTo6Y2hlY2tfYWxsb2NhdGVkIGJ5IGxhYmVsXG4iKTsKKwkgIGVycm9yICs9IGZvdW5kOworCSAgc3RkOjpfX3Rocm93X2xvZ2ljX2Vycm9yKGVycm9yLmNfc3RyKCkpOworCX0KKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4gCQlkYXRhX3R5cGU7CisgICAgdHlwZWRlZiBzdGQ6Om1hcDx2b2lkKiwgZGF0YV90eXBlPiAJCW1hcF90eXBlOworICAgIHR5cGVkZWYgbWFwX3R5cGU6OnZhbHVlX3R5cGUgCQllbnRyeV90eXBlOworICAgIHR5cGVkZWYgbWFwX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIAkJY29uc3RfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBtYXBfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIAkJY29uc3RfcmVmZXJlbmNlOworCisgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYsIGNvbnN0IGFubm90YXRlX2Jhc2UmKTsKKworICAgIGVudHJ5X3R5cGUKKyAgICBtYWtlX2VudHJ5KHZvaWQqIHAsIHNpemVfdCBzaXplKQorICAgIHsgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHAsIGRhdGFfdHlwZShnZXRfbGFiZWwoKSwgc2l6ZSkpOyB9CisKKyAgICB2b2lkCisgICAgbG9nX3RvX3N0cmluZyhzdGQ6OnN0cmluZyYgcywgY29uc3RfcmVmZXJlbmNlIHJlZikgY29uc3QKKyAgICB7CisgICAgICBjaGFyIGJ1Zls0MF07CisgICAgICBjb25zdCBjaGFyIHRhYignXHQnKTsKKyAgICAgIHMgKz0gImxhYmVsOiAiOworICAgICAgdW5zaWduZWQgbG9uZyBsID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4ocmVmLnNlY29uZC5maXJzdCk7CisgICAgICBfX2J1aWx0aW5fc3ByaW50ZihidWYsICIlbHUiLCBsKTsKKyAgICAgIHMgKz0gYnVmOworICAgICAgcyArPSB0YWI7CisgICAgICBzICs9ICJzaXplOiAiOworICAgICAgbCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHJlZi5zZWNvbmQuc2Vjb25kKTsKKyAgICAgIF9fYnVpbHRpbl9zcHJpbnRmKGJ1ZiwgIiVsdSIsIGwpOworICAgICAgcyArPSBidWY7CisgICAgICBzICs9IHRhYjsKKyAgICAgIHMgKz0gImFkZHJlc3M6ICI7CisgICAgICBfX2J1aWx0aW5fc3ByaW50ZihidWYsICIlcCIsIHJlZi5maXJzdCk7CisgICAgICBzICs9IGJ1ZjsKKyAgICAgIHMgKz0gJ1xuJzsKKyAgICB9CisKKyAgICBzdGF0aWMgc2l6ZV90JgorICAgIGxhYmVsKCkKKyAgICB7CisgICAgICBzdGF0aWMgc2l6ZV90IF9TX2xhYmVsKHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkpOworICAgICAgcmV0dXJuIF9TX2xhYmVsOworICAgIH0KKworICAgIHN0YXRpYyBtYXBfdHlwZSYKKyAgICBtYXAoKQorICAgIHsKKyAgICAgIHN0YXRpYyBtYXBfdHlwZSBfU19tYXA7CisgICAgICByZXR1cm4gX1NfbWFwOworICAgIH0KKyAgfTsKKworICBpbmxpbmUgc3RkOjpvc3RyZWFtJgorICBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IGFubm90YXRlX2Jhc2UmIF9fYikKKyAgeworICAgIHN0ZDo6c3RyaW5nIGVycm9yOworICAgIHR5cGVkZWYgYW5ub3RhdGVfYmFzZSBiYXNlX3R5cGU7CisgICAgYmFzZV90eXBlOjpjb25zdF9pdGVyYXRvciBiZWcgPSBfX2IubWFwKCkuYmVnaW4oKTsKKyAgICBiYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IF9fYi5tYXAoKS5lbmQoKTsKKyAgICBmb3IgKDsgYmVnICE9IGVuZDsgKytiZWcpCisgICAgICBfX2IubG9nX3RvX3N0cmluZyhlcnJvciwgKmJlZyk7CisgICAgcmV0dXJuIG9zIDw8IGVycm9yOworICB9CisKKworICAvKioKKyAgICogIEBicmllZiBCYXNlIHN0cnVjdCBmb3IgY29uZGl0aW9uIHBvbGljeS4KKyAgICoKKyAgICogUmVxdWlyZXMgYSBwdWJsaWMgbWVtYmVyIGZ1bmN0aW9uIHdpdGggdGhlIHNpZ25hdHVyZQorICAgKiB2b2lkIHRocm93X2NvbmRpdGlvbmFsbHkoKQorICAgKi8KKyAgc3RydWN0IGNvbmRpdGlvbl9iYXNlCisgIHsKKyAgICB2aXJ0dWFsIH5jb25kaXRpb25fYmFzZSgpIHsgfTsKKyAgfTsKKworCisgIC8qKgorICAgKiAgQGJyaWVmIEJhc2UgY2xhc3MgZm9yIGluY3JlbWVudGFsIGNvbnRyb2wgYW5kIHRocm93LgorICAgKi8KKyAgc3RydWN0IGxpbWl0X2NvbmRpdGlvbiA6IHB1YmxpYyBjb25kaXRpb25fYmFzZQorICB7CisgICAgLy8gU2NvcGUtbGV2ZWwgYWRqdXN0b3Igb2JqZWN0czogc2V0IGxpbWl0IGZvciB0aHJvdyBhdCB0aGUKKyAgICAvLyBiZWdpbm5pbmcgb2YgYSBzY29wZSBibG9jaywgYW5kIHJlc3RvcmVzIHRvIHByZXZpb3VzIGxpbWl0IHdoZW4KKyAgICAvLyBvYmplY3QgaXMgZGVzdHJveWVkIG9uIGV4aXRpbmcgdGhlIGJsb2NrLgorICAgIHN0cnVjdCBhZGp1c3Rvcl9iYXNlCisgICAgeworICAgIHByaXZhdGU6CisgICAgICBjb25zdCBzaXplX3QgX01fb3JpZzsKKworICAgIHB1YmxpYzoKKyAgICAgIGFkanVzdG9yX2Jhc2UoKSA6IF9NX29yaWcobGltaXQoKSkgeyB9CisKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5hZGp1c3Rvcl9iYXNlKCkgeyBzZXRfbGltaXQoX01fb3JpZyk7IH0KKyAgICB9OworCisgICAgLy8vIE5ldmVyIGVudGVyIHRoZSBjb25kaXRpb24uCisgICAgc3RydWN0IG5ldmVyX2FkanVzdG9yIDogcHVibGljIGFkanVzdG9yX2Jhc2UKKyAgICB7CisgICAgICBuZXZlcl9hZGp1c3RvcigpIHsgc2V0X2xpbWl0KHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkpOyB9CisgICAgfTsKKworICAgIC8vLyBBbHdheXMgZW50ZXIgdGhlIGNvbmRpdGlvbi4KKyAgICBzdHJ1Y3QgYWx3YXlzX2FkanVzdG9yIDogcHVibGljIGFkanVzdG9yX2Jhc2UKKyAgICB7CisgICAgICBhbHdheXNfYWRqdXN0b3IoKSB7IHNldF9saW1pdChjb3VudCgpKTsgfQorICAgIH07CisKKyAgICAvLy8gRW50ZXIgdGhlIG50aCBjb25kaXRpb24uCisgICAgc3RydWN0IGxpbWl0X2FkanVzdG9yIDogcHVibGljIGFkanVzdG9yX2Jhc2UKKyAgICB7CisgICAgICBsaW1pdF9hZGp1c3Rvcihjb25zdCBzaXplX3QgX19sKSB7IHNldF9saW1pdChfX2wpOyB9CisgICAgfTsKKworICAgIC8vIEluY3JlbWVudCBfU19jb3VudCBldmVyeSB0aW1lIGNhbGxlZC4KKyAgICAvLyBJZiBfU19jb3VudCBtYXRjaGVzIHRoZSBsaW1pdCBjb3VudCwgdGhyb3cuCisgICAgc3RhdGljIHZvaWQKKyAgICB0aHJvd19jb25kaXRpb25hbGx5KCkKKyAgICB7CisgICAgICBpZiAoY291bnQoKSA9PSBsaW1pdCgpKQorCV9fdGhyb3dfZm9yY2VkX2Vycm9yKCk7CisgICAgICArK2NvdW50KCk7CisgICAgfQorCisgICAgc3RhdGljIHNpemVfdCYKKyAgICBjb3VudCgpCisgICAgeworICAgICAgc3RhdGljIHNpemVfdCBfU19jb3VudCgwKTsKKyAgICAgIHJldHVybiBfU19jb3VudDsKKyAgICB9CisKKyAgICBzdGF0aWMgc2l6ZV90JgorICAgIGxpbWl0KCkKKyAgICB7CisgICAgICBzdGF0aWMgc2l6ZV90IF9TX2xpbWl0KHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkpOworICAgICAgcmV0dXJuIF9TX2xpbWl0OworICAgIH0KKworICAgIC8vIFplcm8gdGhlIHRocm93IGNvdW50ZXIsIHNldCBsaW1pdCB0byBhcmd1bWVudC4KKyAgICBzdGF0aWMgdm9pZAorICAgIHNldF9saW1pdChjb25zdCBzaXplX3QgX19sKQorICAgIHsKKyAgICAgIGxpbWl0KCkgPSBfX2w7CisgICAgICBjb3VudCgpID0gMDsKKyAgICB9CisgIH07CisKKworICAvKioKKyAgICogIEBicmllZiBCYXNlIGNsYXNzIGZvciByYW5kb20gcHJvYmFiaWxpdHkgY29udHJvbCBhbmQgdGhyb3cuCisgICAqLworICBzdHJ1Y3QgcmFuZG9tX2NvbmRpdGlvbiA6IHB1YmxpYyBjb25kaXRpb25fYmFzZQorICB7CisgICAgLy8gU2NvcGUtbGV2ZWwgYWRqdXN0b3Igb2JqZWN0czogc2V0IHByb2JhYmlsaXR5IGZvciB0aHJvdyBhdCB0aGUKKyAgICAvLyBiZWdpbm5pbmcgb2YgYSBzY29wZSBibG9jaywgYW5kIHJlc3RvcmVzIHRvIHByZXZpb3VzCisgICAgLy8gcHJvYmFiaWxpdHkgd2hlbiBvYmplY3QgaXMgZGVzdHJveWVkIG9uIGV4aXRpbmcgdGhlIGJsb2NrLgorICAgIHN0cnVjdCBhZGp1c3Rvcl9iYXNlCisgICAgeworICAgIHByaXZhdGU6CisgICAgICBjb25zdCBkb3VibGUgX01fb3JpZzsKKworICAgIHB1YmxpYzoKKyAgICAgIGFkanVzdG9yX2Jhc2UoKSA6IF9NX29yaWcocHJvYmFiaWxpdHkoKSkgeyB9CisKKyAgICAgIHZpcnR1YWwgfmFkanVzdG9yX2Jhc2UoKQorICAgICAgeyBzZXRfcHJvYmFiaWxpdHkoX01fb3JpZyk7IH0KKyAgICB9OworCisgICAgLy8vIEdyb3VwIGNvbmRpdGlvbi4KKyAgICBzdHJ1Y3QgZ3JvdXBfYWRqdXN0b3IgOiBwdWJsaWMgYWRqdXN0b3JfYmFzZQorICAgIHsKKyAgICAgIGdyb3VwX2FkanVzdG9yKHNpemVfdCBzaXplKQorICAgICAgeyBzZXRfcHJvYmFiaWxpdHkoMSAtIHN0ZDo6cG93KGRvdWJsZSgxIC0gcHJvYmFiaWxpdHkoKSksCisJCQkJICAgICBkb3VibGUoMC41IC8gKHNpemUgKyAxKSkpKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgLy8vIE5ldmVyIGVudGVyIHRoZSBjb25kaXRpb24uCisgICAgc3RydWN0IG5ldmVyX2FkanVzdG9yIDogcHVibGljIGFkanVzdG9yX2Jhc2UKKyAgICB7CisgICAgICBuZXZlcl9hZGp1c3RvcigpIHsgc2V0X3Byb2JhYmlsaXR5KDApOyB9CisgICAgfTsKKworICAgIC8vLyBBbHdheXMgZW50ZXIgdGhlIGNvbmRpdGlvbi4KKyAgICBzdHJ1Y3QgYWx3YXlzX2FkanVzdG9yIDogcHVibGljIGFkanVzdG9yX2Jhc2UKKyAgICB7CisgICAgICBhbHdheXNfYWRqdXN0b3IoKSB7IHNldF9wcm9iYWJpbGl0eSgxKTsgfQorICAgIH07CisKKyAgICByYW5kb21fY29uZGl0aW9uKCkKKyAgICB7CisgICAgICBwcm9iYWJpbGl0eSgpOworICAgICAgZW5naW5lKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQKKyAgICBzZXRfcHJvYmFiaWxpdHkoZG91YmxlIF9fcCkKKyAgICB7IHByb2JhYmlsaXR5KCkgPSBfX3A7IH0KKworICAgIHN0YXRpYyB2b2lkCisgICAgdGhyb3dfY29uZGl0aW9uYWxseSgpCisgICAgeworICAgICAgaWYgKGdlbmVyYXRlKCkgPCBwcm9iYWJpbGl0eSgpKQorCV9fdGhyb3dfZm9yY2VkX2Vycm9yKCk7CisgICAgfQorCisgICAgdm9pZAorICAgIHNlZWQodW5zaWduZWQgbG9uZyBfX3MpCisgICAgeyBlbmdpbmUoKS5zZWVkKF9fcyk7IH0KKworICBwcml2YXRlOgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICB0eXBlZGVmIHN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxkb3VibGU+IAlkaXN0cmlidXRpb25fdHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6bXQxOTkzNyAJCQkJZW5naW5lX3R5cGU7CisjZWxzZQorICAgIHR5cGVkZWYgc3RkOjp0cjE6OnVuaWZvcm1fcmVhbDxkb3VibGU+IAkJZGlzdHJpYnV0aW9uX3R5cGU7CisgICAgdHlwZWRlZiBzdGQ6OnRyMTo6bXQxOTkzNyAJCQkJZW5naW5lX3R5cGU7CisjZW5kaWYKKworICAgIHN0YXRpYyBkb3VibGUKKyAgICBnZW5lcmF0ZSgpCisgICAgeworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGNvbnN0IGRpc3RyaWJ1dGlvbl90eXBlIGRpc3RyaWJ1dGlvbigwLCAxKTsKKyAgICAgIHN0YXRpYyBhdXRvIGdlbmVyYXRvciA9IHN0ZDo6YmluZChkaXN0cmlidXRpb24sIGVuZ2luZSgpKTsKKyNlbHNlCisgICAgICAvLyBVc2UgdmFyaWF0ZV9nZW5lcmF0b3IgdG8gZ2V0IG5vcm1hbGl6ZWQgcmVzdWx0cy4KKyAgICAgIHR5cGVkZWYgc3RkOjp0cjE6OnZhcmlhdGVfZ2VuZXJhdG9yPGVuZ2luZV90eXBlLCBkaXN0cmlidXRpb25fdHlwZT4gZ2VuX3Q7CisgICAgICBkaXN0cmlidXRpb25fdHlwZSBkaXN0cmlidXRpb24oMCwgMSk7CisgICAgICBzdGF0aWMgZ2VuX3QgZ2VuZXJhdG9yKGVuZ2luZSgpLCBkaXN0cmlidXRpb24pOworI2VuZGlmCisKKyAgICAgIGRvdWJsZSByYW5kb20gPSBnZW5lcmF0b3IoKTsKKyAgICAgIGlmIChyYW5kb20gPCBkaXN0cmlidXRpb24ubWluKCkgfHwgcmFuZG9tID4gZGlzdHJpYnV0aW9uLm1heCgpKQorCXsKKwkgIHN0ZDo6c3RyaW5nIF9fcygicmFuZG9tX2NvbmRpdGlvbjo6Z2VuZXJhdGUiKTsKKwkgIF9fcyArPSAiXG4iOworCSAgX19zICs9ICJyYW5kb20gbnVtYmVyIGdlbmVyYXRlZCBpczogIjsKKwkgIGNoYXIgYnVmWzQwXTsKKwkgIF9fYnVpbHRpbl9zcHJpbnRmKGJ1ZiwgIiVmIiwgcmFuZG9tKTsKKwkgIF9fcyArPSBidWY7CisJICBzdGQ6Ol9fdGhyb3dfb3V0X29mX3JhbmdlKF9fcy5jX3N0cigpKTsKKwl9CisKKyAgICAgIHJldHVybiByYW5kb207CisgICAgfQorCisgICAgc3RhdGljIGRvdWJsZSYKKyAgICBwcm9iYWJpbGl0eSgpCisgICAgeworICAgICAgc3RhdGljIGRvdWJsZSBfU19wOworICAgICAgcmV0dXJuIF9TX3A7CisgICAgfQorCisgICAgc3RhdGljIGVuZ2luZV90eXBlJgorICAgIGVuZ2luZSgpCisgICAgeworICAgICAgc3RhdGljIGVuZ2luZV90eXBlIF9TX2U7CisgICAgICByZXR1cm4gX1NfZTsKKyAgICB9CisgIH07CisKKworICAvKioKKyAgICogIEBicmllZiBDbGFzcyB3aXRoIGV4Y2VwdGlvbiBnZW5lcmF0aW9uIGNvbnRyb2wuIEludGVuZGVkIHRvIGJlCisgICAqICB1c2VkIGFzIGEgdmFsdWVfdHlwZSBpbiB0ZW1wbGF0aXplZCBjb2RlLgorICAgKgorICAgKiAgTm90ZTogRGVzdHJ1Y3RvciBub3QgYWxsb3dlZCB0byB0aHJvdy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db25kPgorICAgIHN0cnVjdCB0aHJvd192YWx1ZV9iYXNlIDogcHVibGljIF9Db25kCisgICAgeworICAgICAgdHlwZWRlZiBfQ29uZCAgCQkJCWNvbmRpdGlvbl90eXBlOworCisgICAgICB1c2luZyBjb25kaXRpb25fdHlwZTo6dGhyb3dfY29uZGl0aW9uYWxseTsKKworICAgICAgc3RkOjpzaXplX3QJCQkgICAgICAgCV9NX2k7CisKKyNpZm5kZWYgX0dMSUJDWFhfSVNfQUdHUkVHQVRFCisgICAgICB0aHJvd192YWx1ZV9iYXNlKCkgOiBfTV9pKDApCisgICAgICB7IHRocm93X2NvbmRpdGlvbmFsbHkoKTsgfQorCisgICAgICB0aHJvd192YWx1ZV9iYXNlKGNvbnN0IHRocm93X3ZhbHVlX2Jhc2UmIF9fdikgOiBfTV9pKF9fdi5fTV9pKQorICAgICAgeyB0aHJvd19jb25kaXRpb25hbGx5KCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8vIFNoYWxsIG5vdCB0aHJvdy4KKyAgICAgIHRocm93X3ZhbHVlX2Jhc2UodGhyb3dfdmFsdWVfYmFzZSYmKSA9IGRlZmF1bHQ7CisjZW5kaWYKKworICAgICAgZXhwbGljaXQgdGhyb3dfdmFsdWVfYmFzZShjb25zdCBzdGQ6OnNpemVfdCBfX2kpIDogX01faShfX2kpCisgICAgICB7IHRocm93X2NvbmRpdGlvbmFsbHkoKTsgfQorI2VuZGlmCisKKyAgICAgIHRocm93X3ZhbHVlX2Jhc2UmCisgICAgICBvcGVyYXRvcj0oY29uc3QgdGhyb3dfdmFsdWVfYmFzZSYgX192KQorICAgICAgeworCXRocm93X2NvbmRpdGlvbmFsbHkoKTsKKwlfTV9pID0gX192Ll9NX2k7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gU2hhbGwgbm90IHRocm93LgorICAgICAgdGhyb3dfdmFsdWVfYmFzZSYKKyAgICAgIG9wZXJhdG9yPSh0aHJvd192YWx1ZV9iYXNlJiYpID0gZGVmYXVsdDsKKyNlbmRpZgorCisgICAgICB0aHJvd192YWx1ZV9iYXNlJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJdGhyb3dfY29uZGl0aW9uYWxseSgpOworCSsrX01faTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29uZD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4mIF9fYSwgdGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4mIF9fYikKKyAgICB7CisgICAgICB0eXBlZGVmIHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+IHRocm93X3ZhbHVlOworICAgICAgdGhyb3dfdmFsdWU6OnRocm93X2NvbmRpdGlvbmFsbHkoKTsKKyAgICAgIHRocm93X3ZhbHVlIG9yaWcoX19hKTsKKyAgICAgIF9fYSA9IF9fYjsKKyAgICAgIF9fYiA9IG9yaWc7CisgICAgfQorCisgIC8vIEdlbmVyYWwgaW5zdGFudGlhYmxlIHR5cGVzIHJlcXVpcmVtZW50cy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbmQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+JiBfX2EsCisJICAgICAgIGNvbnN0IHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+JiBfX2IpCisgICAgeworICAgICAgdHlwZWRlZiB0aHJvd192YWx1ZV9iYXNlPF9Db25kPiB0aHJvd192YWx1ZTsKKyAgICAgIHRocm93X3ZhbHVlOjp0aHJvd19jb25kaXRpb25hbGx5KCk7CisgICAgICBib29sIF9fcmV0ID0gX19hLl9NX2kgPT0gX19iLl9NX2k7CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db25kPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+JiBfX2EsCisJICAgICAgY29uc3QgdGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4mIF9fYikKKyAgICB7CisgICAgICB0eXBlZGVmIHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+IHRocm93X3ZhbHVlOworICAgICAgdGhyb3dfdmFsdWU6OnRocm93X2NvbmRpdGlvbmFsbHkoKTsKKyAgICAgIGJvb2wgX19yZXQgPSBfX2EuX01faSA8IF9fYi5fTV9pOworICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICAvLyBOdW1lcmljIGFsZ29yaXRobXMgaW5zdGFudGlhYmxlIHR5cGVzIHJlcXVpcmVtZW50cy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbmQ+CisgICAgaW5saW5lIHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+CisgICAgb3BlcmF0b3IrKGNvbnN0IHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+JiBfX2EsCisJICAgICAgY29uc3QgdGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4mIF9fYikKKyAgICB7CisgICAgICB0eXBlZGVmIHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+IHRocm93X3ZhbHVlOworICAgICAgdGhyb3dfdmFsdWU6OnRocm93X2NvbmRpdGlvbmFsbHkoKTsKKyAgICAgIHRocm93X3ZhbHVlIF9fcmV0KF9fYS5fTV9pICsgX19iLl9NX2kpOworICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29uZD4KKyAgICBpbmxpbmUgdGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4KKyAgICBvcGVyYXRvci0oY29uc3QgdGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4mIF9fYSwKKwkgICAgICBjb25zdCB0aHJvd192YWx1ZV9iYXNlPF9Db25kPiYgX19iKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4gdGhyb3dfdmFsdWU7CisgICAgICB0aHJvd192YWx1ZTo6dGhyb3dfY29uZGl0aW9uYWxseSgpOworICAgICAgdGhyb3dfdmFsdWUgX19yZXQoX19hLl9NX2kgLSBfX2IuX01faSk7CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db25kPgorICAgIGlubGluZSB0aHJvd192YWx1ZV9iYXNlPF9Db25kPgorICAgIG9wZXJhdG9yKihjb25zdCB0aHJvd192YWx1ZV9iYXNlPF9Db25kPiYgX19hLAorCSAgICAgIGNvbnN0IHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+JiBfX2IpCisgICAgeworICAgICAgdHlwZWRlZiB0aHJvd192YWx1ZV9iYXNlPF9Db25kPiB0aHJvd192YWx1ZTsKKyAgICAgIHRocm93X3ZhbHVlOjp0aHJvd19jb25kaXRpb25hbGx5KCk7CisgICAgICB0aHJvd192YWx1ZSBfX3JldChfX2EuX01faSAqIF9fYi5fTV9pKTsKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKworICAvLy8gVHlwZSB0aHJvd2luZyB2aWEgbGltaXQgY29uZGl0aW9uLgorICBzdHJ1Y3QgdGhyb3dfdmFsdWVfbGltaXQgOiBwdWJsaWMgdGhyb3dfdmFsdWVfYmFzZTxsaW1pdF9jb25kaXRpb24+CisgIHsKKyAgICB0eXBlZGVmIHRocm93X3ZhbHVlX2Jhc2U8bGltaXRfY29uZGl0aW9uPiBiYXNlX3R5cGU7CisKKyNpZm5kZWYgX0dMSUJDWFhfSVNfQUdHUkVHQVRFCisgICAgdGhyb3dfdmFsdWVfbGltaXQoKSB7IH0KKworICAgIHRocm93X3ZhbHVlX2xpbWl0KGNvbnN0IHRocm93X3ZhbHVlX2xpbWl0JiBfX290aGVyKQorICAgIDogYmFzZV90eXBlKF9fb3RoZXIuX01faSkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgdGhyb3dfdmFsdWVfbGltaXQodGhyb3dfdmFsdWVfbGltaXQmJikgPSBkZWZhdWx0OworI2VuZGlmCisKKyAgICBleHBsaWNpdCB0aHJvd192YWx1ZV9saW1pdChjb25zdCBzdGQ6OnNpemVfdCBfX2kpIDogYmFzZV90eXBlKF9faSkgeyB9CisjZW5kaWYKKworICAgIHRocm93X3ZhbHVlX2xpbWl0JgorICAgIG9wZXJhdG9yPShjb25zdCB0aHJvd192YWx1ZV9saW1pdCYgX19vdGhlcikKKyAgICB7CisgICAgICBiYXNlX3R5cGU6Om9wZXJhdG9yPShfX290aGVyKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgdGhyb3dfdmFsdWVfbGltaXQmCisgICAgb3BlcmF0b3I9KHRocm93X3ZhbHVlX2xpbWl0JiYpID0gZGVmYXVsdDsKKyNlbmRpZgorICB9OworCisgIC8vLyBUeXBlIHRocm93aW5nIHZpYSByYW5kb20gY29uZGl0aW9uLgorICBzdHJ1Y3QgdGhyb3dfdmFsdWVfcmFuZG9tIDogcHVibGljIHRocm93X3ZhbHVlX2Jhc2U8cmFuZG9tX2NvbmRpdGlvbj4KKyAgeworICAgIHR5cGVkZWYgdGhyb3dfdmFsdWVfYmFzZTxyYW5kb21fY29uZGl0aW9uPiBiYXNlX3R5cGU7CisKKyNpZm5kZWYgX0dMSUJDWFhfSVNfQUdHUkVHQVRFCisgICAgdGhyb3dfdmFsdWVfcmFuZG9tKCkgeyB9CisKKyAgICB0aHJvd192YWx1ZV9yYW5kb20oY29uc3QgdGhyb3dfdmFsdWVfcmFuZG9tJiBfX290aGVyKQorICAgIDogYmFzZV90eXBlKF9fb3RoZXIuX01faSkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgdGhyb3dfdmFsdWVfcmFuZG9tKHRocm93X3ZhbHVlX3JhbmRvbSYmKSA9IGRlZmF1bHQ7CisjZW5kaWYKKworICAgIGV4cGxpY2l0IHRocm93X3ZhbHVlX3JhbmRvbShjb25zdCBzdGQ6OnNpemVfdCBfX2kpIDogYmFzZV90eXBlKF9faSkgeyB9CisjZW5kaWYKKworICAgIHRocm93X3ZhbHVlX3JhbmRvbSYKKyAgICBvcGVyYXRvcj0oY29uc3QgdGhyb3dfdmFsdWVfcmFuZG9tJiBfX290aGVyKQorICAgIHsKKyAgICAgIGJhc2VfdHlwZTo6b3BlcmF0b3I9KF9fb3RoZXIpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICB0aHJvd192YWx1ZV9yYW5kb20mCisgICAgb3BlcmF0b3I9KHRocm93X3ZhbHVlX3JhbmRvbSYmKSA9IGRlZmF1bHQ7CisjZW5kaWYKKyAgfTsKKworCisgIC8qKgorICAgKiAgQGJyaWVmIEFsbG9jYXRvciBjbGFzcyB3aXRoIGxvZ2dpbmcgYW5kIGV4Y2VwdGlvbiBnZW5lcmF0aW9uIGNvbnRyb2wuCisgICAqIEludGVuZGVkIHRvIGJlIHVzZWQgYXMgYW4gYWxsb2NhdG9yX3R5cGUgaW4gdGVtcGxhdGl6ZWQgY29kZS4KKyAgICogIEBpbmdyb3VwIGFsbG9jYXRvcnMKKyAgICoKKyAgICogIE5vdGU6IERlYWxsb2NhdGUgbm90IGFsbG93ZWQgdG8gdGhyb3cuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db25kPgorICAgIGNsYXNzIHRocm93X2FsbG9jYXRvcl9iYXNlCisgICAgOiBwdWJsaWMgYW5ub3RhdGVfYmFzZSwgcHVibGljIF9Db25kCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgc2l6ZV90IAkJCQlzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAJCQlkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCAJCQkJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdmFsdWVfdHlwZSogCQkJcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogCQljb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAJCQlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIAkJY29uc3RfcmVmZXJlbmNlOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjEwMy4gc3RkOjphbGxvY2F0b3IgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQKKyAgICAgIHR5cGVkZWYgc3RkOjp0cnVlX3R5cGUgcHJvcGFnYXRlX29uX2NvbnRhaW5lcl9tb3ZlX2Fzc2lnbm1lbnQ7CisjZW5kaWYKKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9Db25kCQkJCWNvbmRpdGlvbl90eXBlOworCisgICAgICBzdGQ6OmFsbG9jYXRvcjx2YWx1ZV90eXBlPiAJCV9NX2FsbG9jYXRvcjsKKworICAgICAgdXNpbmcgY29uZGl0aW9uX3R5cGU6OnRocm93X2NvbmRpdGlvbmFsbHk7CisKKyAgICBwdWJsaWM6CisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV9hbGxvY2F0b3IubWF4X3NpemUoKTsgfQorCisgICAgICBwb2ludGVyCisgICAgICBhZGRyZXNzKHJlZmVyZW5jZSBfX3gpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9feCk7IH0KKworICAgICAgY29uc3RfcG9pbnRlcgorICAgICAgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3gpOyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIHN0ZDo6YWxsb2NhdG9yPHZvaWQ+Ojpjb25zdF9wb2ludGVyIGhpbnQgPSAwKQorICAgICAgeworCWlmIChfX24gPiB0aGlzLT5tYXhfc2l6ZSgpKQorCSAgc3RkOjpfX3Rocm93X2JhZF9hbGxvYygpOworCisJdGhyb3dfY29uZGl0aW9uYWxseSgpOworCXBvaW50ZXIgY29uc3QgYSA9IF9NX2FsbG9jYXRvci5hbGxvY2F0ZShfX24sIGhpbnQpOworCWluc2VydChhLCBzaXplb2YodmFsdWVfdHlwZSkgKiBfX24pOworCXJldHVybiBhOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBjb25zdHJ1Y3QoX1VwKiBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsgcmV0dXJuIF9NX2FsbG9jYXRvci5jb25zdHJ1Y3QoX19wLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgdm9pZCAKKyAgICAgICAgZGVzdHJveShfVXAqIF9fcCkKKyAgICAgICAgeyBfTV9hbGxvY2F0b3IuZGVzdHJveShfX3ApOyB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgY29uc3RydWN0KHBvaW50ZXIgX19wLCBjb25zdCB2YWx1ZV90eXBlJiB2YWwpCisgICAgICB7IHJldHVybiBfTV9hbGxvY2F0b3IuY29uc3RydWN0KF9fcCwgdmFsKTsgfQorCisgICAgICB2b2lkCisgICAgICBkZXN0cm95KHBvaW50ZXIgX19wKQorICAgICAgeyBfTV9hbGxvY2F0b3IuZGVzdHJveShfX3ApOyB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgZGVhbGxvY2F0ZShwb2ludGVyIF9fcCwgc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwllcmFzZShfX3AsIHNpemVvZih2YWx1ZV90eXBlKSAqIF9fbik7CisJX01fYWxsb2NhdG9yLmRlYWxsb2NhdGUoX19wLCBfX24pOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjaGVja19hbGxvY2F0ZWQocG9pbnRlciBfX3AsIHNpemVfdHlwZSBfX24pCisgICAgICB7CisJc2l6ZV90eXBlIF9fdCA9IHNpemVvZih2YWx1ZV90eXBlKSAqIF9fbjsKKwlhbm5vdGF0ZV9iYXNlOjpjaGVja19hbGxvY2F0ZWQoX19wLCBfX3QpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjaGVja19hbGxvY2F0ZWQoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgYW5ub3RhdGVfYmFzZTo6Y2hlY2tfYWxsb2NhdGVkKF9fbik7IH0KKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db25kPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB0aHJvd19hbGxvY2F0b3JfYmFzZTxfVHAsIF9Db25kPiYsCisJICAgICAgIGNvbnN0IHRocm93X2FsbG9jYXRvcl9iYXNlPF9UcCwgX0NvbmQ+JikKKyAgICB7IHJldHVybiB0cnVlOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29uZD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgdGhyb3dfYWxsb2NhdG9yX2Jhc2U8X1RwLCBfQ29uZD4mLAorCSAgICAgICBjb25zdCB0aHJvd19hbGxvY2F0b3JfYmFzZTxfVHAsIF9Db25kPiYpCisgICAgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gQWxsb2NhdG9yIHRocm93aW5nIHZpYSBsaW1pdCBjb25kaXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgdGhyb3dfYWxsb2NhdG9yX2xpbWl0CisgICAgOiBwdWJsaWMgdGhyb3dfYWxsb2NhdG9yX2Jhc2U8X1RwLCBsaW1pdF9jb25kaXRpb24+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlzdHJ1Y3QgcmViaW5kCisJeyB0eXBlZGVmIHRocm93X2FsbG9jYXRvcl9saW1pdDxfVHAxPiBvdGhlcjsgfTsKKworICAgICAgdGhyb3dfYWxsb2NhdG9yX2xpbWl0KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgfQorCisgICAgICB0aHJvd19hbGxvY2F0b3JfbGltaXQoY29uc3QgdGhyb3dfYWxsb2NhdG9yX2xpbWl0JikKKyAgICAgIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwl0aHJvd19hbGxvY2F0b3JfbGltaXQoY29uc3QgdGhyb3dfYWxsb2NhdG9yX2xpbWl0PF9UcDE+JikKKwlfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisKKyAgICAgIH50aHJvd19hbGxvY2F0b3JfbGltaXQoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisgICAgfTsKKworICAvLy8gQWxsb2NhdG9yIHRocm93aW5nIHZpYSByYW5kb20gY29uZGl0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHRocm93X2FsbG9jYXRvcl9yYW5kb20KKyAgICA6IHB1YmxpYyB0aHJvd19hbGxvY2F0b3JfYmFzZTxfVHAsIHJhbmRvbV9jb25kaXRpb24+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlzdHJ1Y3QgcmViaW5kCisJeyB0eXBlZGVmIHRocm93X2FsbG9jYXRvcl9yYW5kb208X1RwMT4gb3RoZXI7IH07CisKKyAgICAgIHRocm93X2FsbG9jYXRvcl9yYW5kb20oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisKKyAgICAgIHRocm93X2FsbG9jYXRvcl9yYW5kb20oY29uc3QgdGhyb3dfYWxsb2NhdG9yX3JhbmRvbSYpCisgICAgICBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJdGhyb3dfYWxsb2NhdG9yX3JhbmRvbShjb25zdCB0aHJvd19hbGxvY2F0b3JfcmFuZG9tPF9UcDE+JikKKwlfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisKKyAgICAgIH50aHJvd19hbGxvY2F0b3JfcmFuZG9tKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworIyBpbmNsdWRlIDxiaXRzL2Z1bmN0aW9uYWxfaGFzaC5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIG9mIHN0ZDo6aGFzaCBmb3IgX19nbnVfY3h4Ojp0aHJvd192YWx1ZV9saW1pdC4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPF9fZ251X2N4eDo6dGhyb3dfdmFsdWVfbGltaXQ+CisgICAgOiBwdWJsaWMgc3RkOjp1bmFyeV9mdW5jdGlvbjxfX2dudV9jeHg6OnRocm93X3ZhbHVlX2xpbWl0LCBzaXplX3Q+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9fZ251X2N4eDo6dGhyb3dfdmFsdWVfbGltaXQmIF9fdmFsKSBjb25zdAorICAgICAgeworCXN0ZDo6aGFzaDxzdGQ6OnNpemVfdD4gX19oOworCXNpemVfdCBfX3Jlc3VsdCA9IF9faChfX3ZhbC5fTV9pKTsKKwlyZXR1cm4gX19yZXN1bHQ7CisgICAgICB9CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gb2Ygc3RkOjpoYXNoIGZvciBfX2dudV9jeHg6OnRocm93X3ZhbHVlX2xpbWl0LgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8X19nbnVfY3h4Ojp0aHJvd192YWx1ZV9yYW5kb20+CisgICAgOiBwdWJsaWMgc3RkOjp1bmFyeV9mdW5jdGlvbjxfX2dudV9jeHg6OnRocm93X3ZhbHVlX3JhbmRvbSwgc2l6ZV90PgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfX2dudV9jeHg6OnRocm93X3ZhbHVlX3JhbmRvbSYgX192YWwpIGNvbnN0CisgICAgICB7CisJc3RkOjpoYXNoPHN0ZDo6c2l6ZV90PiBfX2g7CisJc2l6ZV90IF9fcmVzdWx0ID0gX19oKF9fdmFsLl9NX2kpOworCXJldHVybiBfX3Jlc3VsdDsKKyAgICAgIH0KKyAgICB9OworfSAvLyBlbmQgbmFtZXNwYWNlIHN0ZAorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvdHlwZV90cmFpdHMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3R5cGVfdHJhaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E4NDAzNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3R5cGVfdHJhaXRzLmgKQEAgLTAsMCArMSwyMTMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvdHlwZV90cmFpdHMuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0VYVF9UWVBFX1RSQUlUUworI2RlZmluZSBfRVhUX1RZUEVfVFJBSVRTIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL2NwcF90eXBlX3RyYWl0cy5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gRGVmaW5lIGEgbmVzdGVkIHR5cGUgaWYgc29tZSBwcmVkaWNhdGUgaG9sZHMuCisgIHRlbXBsYXRlPGJvb2wsIHR5cGVuYW1lPgorICAgIHN0cnVjdCBfX2VuYWJsZV9pZiAKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2VuYWJsZV9pZjx0cnVlLCBfVHA+CisgICAgeyB0eXBlZGVmIF9UcCBfX3R5cGU7IH07CisKKworICAvLyBDb25kaXRpb25hbCBleHByZXNzaW9uIGZvciB0eXBlcy4gSWYgdHJ1ZSwgZmlyc3QsIGlmIGZhbHNlLCBzZWNvbmQuCisgIHRlbXBsYXRlPGJvb2wgX0NvbmQsIHR5cGVuYW1lIF9JZnRydWUsIHR5cGVuYW1lIF9JZmZhbHNlPgorICAgIHN0cnVjdCBfX2NvbmRpdGlvbmFsX3R5cGUKKyAgICB7IHR5cGVkZWYgX0lmdHJ1ZSBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lmdHJ1ZSwgdHlwZW5hbWUgX0lmZmFsc2U+CisgICAgc3RydWN0IF9fY29uZGl0aW9uYWxfdHlwZTxmYWxzZSwgX0lmdHJ1ZSwgX0lmZmFsc2U+CisgICAgeyB0eXBlZGVmIF9JZmZhbHNlIF9fdHlwZTsgfTsKKworCisgIC8vIEdpdmVuIGFuIGludGVncmFsIGJ1aWx0aW4gdHlwZSwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHVuc2lnbmVkIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hZGRfdW5zaWduZWQKKyAgICB7IAorICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9fZW5hYmxlX2lmPHN0ZDo6X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIF9UcD4gX19pZl90eXBlOworICAgICAgCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lmX3R5cGU6Ol9fdHlwZSBfX3R5cGU7IAorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2FkZF91bnNpZ25lZDxjaGFyPgorICAgIHsgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fYWRkX3Vuc2lnbmVkPHNpZ25lZCBjaGFyPgorICAgIHsgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fYWRkX3Vuc2lnbmVkPHNob3J0PgorICAgIHsgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2FkZF91bnNpZ25lZDxpbnQ+CisgICAgeyB0eXBlZGVmIHVuc2lnbmVkIGludCBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2FkZF91bnNpZ25lZDxsb25nPgorICAgIHsgdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fYWRkX3Vuc2lnbmVkPGxvbmcgbG9uZz4KKyAgICB7IHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIF9fdHlwZTsgfTsKKworICAvLyBEZWNsYXJlIGJ1dCBkb24ndCBkZWZpbmUuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19hZGRfdW5zaWduZWQ8Ym9vbD47CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2FkZF91bnNpZ25lZDx3Y2hhcl90PjsKKworCisgIC8vIEdpdmVuIGFuIGludGVncmFsIGJ1aWx0aW4gdHlwZSwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHNpZ25lZCB0eXBlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fcmVtb3ZlX3Vuc2lnbmVkCisgICAgeyAKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2VuYWJsZV9pZjxzdGQ6Ol9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCBfVHA+IF9faWZfdHlwZTsKKyAgICAgIAorICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pZl90eXBlOjpfX3R5cGUgX190eXBlOyAKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19yZW1vdmVfdW5zaWduZWQ8Y2hhcj4KKyAgICB7IHR5cGVkZWYgc2lnbmVkIGNoYXIgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19yZW1vdmVfdW5zaWduZWQ8dW5zaWduZWQgY2hhcj4KKyAgICB7IHR5cGVkZWYgc2lnbmVkIGNoYXIgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19yZW1vdmVfdW5zaWduZWQ8dW5zaWduZWQgc2hvcnQ+CisgICAgeyB0eXBlZGVmIHNob3J0IF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fcmVtb3ZlX3Vuc2lnbmVkPHVuc2lnbmVkIGludD4KKyAgICB7IHR5cGVkZWYgaW50IF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fcmVtb3ZlX3Vuc2lnbmVkPHVuc2lnbmVkIGxvbmc+CisgICAgeyB0eXBlZGVmIGxvbmcgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19yZW1vdmVfdW5zaWduZWQ8dW5zaWduZWQgbG9uZyBsb25nPgorICAgIHsgdHlwZWRlZiBsb25nIGxvbmcgX190eXBlOyB9OworCisgIC8vIERlY2xhcmUgYnV0IGRvbid0IGRlZmluZS4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3JlbW92ZV91bnNpZ25lZDxib29sPjsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fcmVtb3ZlX3Vuc2lnbmVkPHdjaGFyX3Q+OworCisKKyAgLy8gRm9yIHVzZSBpbiBzdHJpbmcgYW5kIHZzdHJpbmcuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UeXBlPgorICAgIGlubGluZSBib29sCisgICAgX19pc19udWxsX3BvaW50ZXIoX1R5cGUqIF9fcHRyKQorICAgIHsgcmV0dXJuIF9fcHRyID09IDA7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9faXNfbnVsbF9wb2ludGVyKF9UeXBlKQorICAgIHsgcmV0dXJuIGZhbHNlOyB9CisKKworICAvLyBGb3IgY29tcGxleCBhbmQgY21hdGgKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBib29sID0gc3RkOjpfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZT4KKyAgICBzdHJ1Y3QgX19wcm9tb3RlCisgICAgeyB0eXBlZGVmIGRvdWJsZSBfX3R5cGU7IH07CisKKyAgLy8gTm8gbmVzdGVkIF9fdHlwZSBtZW1iZXIgZm9yIG5vbi1pbnRlZ2VyIG5vbi1mbG9hdGluZyBwb2ludCB0eXBlcywKKyAgLy8gYWxsb3dzIHRoaXMgdHlwZSB0byBiZSB1c2VkIGZvciBTRklOQUUgdG8gY29uc3RyYWluIG92ZXJsb2FkcyBpbgorICAvLyA8Y21hdGg+IGFuZCA8Y29tcGxleD4gdG8gb25seSB0aGUgaW50ZW5kZWQgdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19wcm9tb3RlPF9UcCwgZmFsc2U+CisgICAgeyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19wcm9tb3RlPGxvbmcgZG91YmxlPgorICAgIHsgdHlwZWRlZiBsb25nIGRvdWJsZSBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3Byb21vdGU8ZG91YmxlPgorICAgIHsgdHlwZWRlZiBkb3VibGUgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19wcm9tb3RlPGZsb2F0PgorICAgIHsgdHlwZWRlZiBmbG9hdCBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXAsCisgICAgICAgICAgIHR5cGVuYW1lIF9UcDIgPSB0eXBlbmFtZSBfX3Byb21vdGU8X1RwPjo6X190eXBlLAorICAgICAgICAgICB0eXBlbmFtZSBfVXAyID0gdHlwZW5hbWUgX19wcm9tb3RlPF9VcD46Ol9fdHlwZT4KKyAgICBzdHJ1Y3QgX19wcm9tb3RlXzIKKyAgICB7CisgICAgICB0eXBlZGVmIF9fdHlwZW9mX18oX1RwMigpICsgX1VwMigpKSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUgX1ZwLAorICAgICAgICAgICB0eXBlbmFtZSBfVHAyID0gdHlwZW5hbWUgX19wcm9tb3RlPF9UcD46Ol9fdHlwZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX1VwMiA9IHR5cGVuYW1lIF9fcHJvbW90ZTxfVXA+OjpfX3R5cGUsCisgICAgICAgICAgIHR5cGVuYW1lIF9WcDIgPSB0eXBlbmFtZSBfX3Byb21vdGU8X1ZwPjo6X190eXBlPgorICAgIHN0cnVjdCBfX3Byb21vdGVfMworICAgIHsKKyAgICAgIHR5cGVkZWYgX190eXBlb2ZfXyhfVHAyKCkgKyBfVXAyKCkgKyBfVnAyKCkpIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwLCB0eXBlbmFtZSBfVnAsIHR5cGVuYW1lIF9XcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX1RwMiA9IHR5cGVuYW1lIF9fcHJvbW90ZTxfVHA+OjpfX3R5cGUsCisgICAgICAgICAgIHR5cGVuYW1lIF9VcDIgPSB0eXBlbmFtZSBfX3Byb21vdGU8X1VwPjo6X190eXBlLAorICAgICAgICAgICB0eXBlbmFtZSBfVnAyID0gdHlwZW5hbWUgX19wcm9tb3RlPF9WcD46Ol9fdHlwZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX1dwMiA9IHR5cGVuYW1lIF9fcHJvbW90ZTxfV3A+OjpfX3R5cGU+CisgICAgc3RydWN0IF9fcHJvbW90ZV80CisgICAgeworICAgICAgdHlwZWRlZiBfX3R5cGVvZl9fKF9UcDIoKSArIF9VcDIoKSArIF9WcDIoKSArIF9XcDIoKSkgX190eXBlOworICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvdHlwZWxpc3QuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3R5cGVsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2YjlmYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3R5cGVsaXN0LmgKQEAgLTAsMCArMSw1NTkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQKKy8vIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZSBvZgorLy8gdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworLyoqCisgKiAgQGZpbGUgZXh0L3R5cGVsaXN0LmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqCisgKiAgQ29udGFpbnMgdHlwZWxpc3RfY2hhaW4gZGVmaW5pdGlvbnMuCisgKiAgVHlwZWxpc3RzIGFyZSBhbiBpZGVhIGJ5IEFuZHJlaSBBbGV4YW5kcmVzY3UuCisgKi8KKworI2lmbmRlZiBfVFlQRUxJU1RfSAorI2RlZmluZSBfVFlQRUxJU1RfSCAxCisKKyNpbmNsdWRlIDxleHQvdHlwZV90cmFpdHMuaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisvKiogQG5hbWVzcGFjZSBfX2dudV9jeHg6OnR5cGVsaXN0CisgKiAgQGJyaWVmIEdOVSB0eXBlbGlzdCBleHRlbnNpb25zIGZvciBwdWJsaWMgY29tcGlsZS10aW1lIHVzZS4KKyovCituYW1lc3BhY2UgdHlwZWxpc3QKK3sKKyAgc3RydWN0IG51bGxfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgUm9vdD4KKyAgICBzdHJ1Y3Qgbm9kZQorICAgIHsKKyAgICAgIHR5cGVkZWYgUm9vdCAJcm9vdDsKKyAgICB9OworCisgIC8vIEZvcndhcmQgZGVjbGFyYXRpb25zIG9mIGZ1bmN0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBIZCwgdHlwZW5hbWUgVHlwZWxpc3Q+CisgICAgc3RydWN0IGNoYWluCisgICAgeworICAgICAgdHlwZWRlZiBIZCAJaGVhZDsKKyAgICAgIHR5cGVkZWYgVHlwZWxpc3QgCXRhaWw7CisgICAgfTsKKworICAvLyBBcHBseSBhbGwgdHlwZWxpc3QgdHlwZXMgdG8gdW5hcnkgZnVuY3Rvci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRm4sIHR5cGVuYW1lIFR5cGVsaXN0PgorICAgIHZvaWQKKyAgICBhcHBseShGbiYsIFR5cGVsaXN0KTsKKworICAvLy8gQXBwbHkgYWxsIHR5cGVsaXN0IHR5cGVzIHRvIGdlbmVyYXRvciBmdW5jdG9yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBHbiwgdHlwZW5hbWUgVHlwZWxpc3Q+CisgICAgdm9pZAorICAgIGFwcGx5X2dlbmVyYXRvcihHbiYsIFR5cGVsaXN0KTsKKworICAvLyBBcHBseSBhbGwgdHlwZWxpc3QgdHlwZXMgYW5kIHZhbHVlcyB0byBnZW5lcmF0b3IgZnVuY3Rvci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgR24sIHR5cGVuYW1lIFR5cGVsaXN0VCwgdHlwZW5hbWUgVHlwZWxpc3RWPgorICAgIHZvaWQKKyAgICBhcHBseV9nZW5lcmF0b3IoR24mLCBUeXBlbGlzdFQsIFR5cGVsaXN0Vik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3QwLCB0eXBlbmFtZSBUeXBlbGlzdDE+CisgICAgc3RydWN0IGFwcGVuZDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdF9UeXBlbGlzdD4KKyAgICBzdHJ1Y3QgYXBwZW5kX3R5cGVsaXN0OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0LCB0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBjb250YWluczsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdCwgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgUHJlZD4KKyAgICBzdHJ1Y3QgZmlsdGVyOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0LCBpbnQgaT4KKyAgICBzdHJ1Y3QgYXRfaW5kZXg7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3QsIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFRyYW5zZm9ybT4KKyAgICBzdHJ1Y3QgdHJhbnNmb3JtOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0X1R5cGVsaXN0PgorICAgIHN0cnVjdCBmbGF0dGVuOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0PgorICAgIHN0cnVjdCBmcm9tX2ZpcnN0OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQxPgorICAgIHN0cnVjdCBjcmVhdGUxOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgY3JlYXRlMjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorICAgIHN0cnVjdCBjcmVhdGUzOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgorICAgIHN0cnVjdCBjcmVhdGU0OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KKyAgICBzdHJ1Y3QgY3JlYXRlNTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLAorCSAgIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwgdHlwZW5hbWUgVDY+CisgICAgc3RydWN0IGNyZWF0ZTY7Cit9IC8vIG5hbWVzcGFjZSB0eXBlbGlzdAorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCituYW1lc3BhY2UgdHlwZWxpc3QKK3sKK25hbWVzcGFjZSBkZXRhaWwKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRm4sIHR5cGVuYW1lIFR5cGVsaXN0X0NoYWluPgorICAgIHN0cnVjdCBhcHBseV87CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRm4sIHR5cGVuYW1lIEhkLCB0eXBlbmFtZSBUbD4KKyAgICBzdHJ1Y3QgYXBwbHlfPEZuLCBjaGFpbjxIZCwgVGw+ID4KKyAgICB7CisgICAgICB2b2lkCisgICAgICBvcGVyYXRvcigpKEZuJiBmKQorICAgICAgeworCWYub3BlcmF0b3IoKShIZCgpKTsKKwlhcHBseV88Rm4sIFRsPiBuZXh0OworCW5leHQoZik7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBGbj4KKyAgICBzdHJ1Y3QgYXBwbHlfPEZuLCBudWxsX3R5cGU+CisgICAgeworICAgICAgdm9pZAorICAgICAgb3BlcmF0b3IoKShGbiYpIHsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgR24sIHR5cGVuYW1lIFR5cGVsaXN0X0NoYWluPgorICAgIHN0cnVjdCBhcHBseV9nZW5lcmF0b3IxXzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBHbiwgdHlwZW5hbWUgSGQsIHR5cGVuYW1lIFRsPgorICAgIHN0cnVjdCBhcHBseV9nZW5lcmF0b3IxXzxHbiwgY2hhaW48SGQsIFRsPiA+CisgICAgeworICAgICAgdm9pZAorICAgICAgb3BlcmF0b3IoKShHbiYgZykKKyAgICAgIHsKKwlnLnRlbXBsYXRlIG9wZXJhdG9yKCk8SGQ+KCk7CisJYXBwbHlfZ2VuZXJhdG9yMV88R24sIFRsPiBuZXh0OworCW5leHQoZyk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBHbj4KKyAgICBzdHJ1Y3QgYXBwbHlfZ2VuZXJhdG9yMV88R24sIG51bGxfdHlwZT4KKyAgICB7CisgICAgICB2b2lkCisgICAgICBvcGVyYXRvcigpKEduJikgeyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBHbiwgdHlwZW5hbWUgVHlwZWxpc3RUX0NoYWluLCB0eXBlbmFtZSBUeXBlbGlzdFZfQ2hhaW4+CisgICAgc3RydWN0IGFwcGx5X2dlbmVyYXRvcjJfOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEduLCB0eXBlbmFtZSBIZDEsIHR5cGVuYW1lIFRsVCwgdHlwZW5hbWUgSGQyLCB0eXBlbmFtZSBUbFY+CisgICAgc3RydWN0IGFwcGx5X2dlbmVyYXRvcjJfPEduLCBjaGFpbjxIZDEsIFRsVD4sIGNoYWluPEhkMiwgVGxWPiA+CisgICAgeworICAgICAgdm9pZAorICAgICAgb3BlcmF0b3IoKShHbiYgZykKKyAgICAgIHsKKwlnLnRlbXBsYXRlIG9wZXJhdG9yKCk8SGQxLCBIZDI+KCk7CisJYXBwbHlfZ2VuZXJhdG9yMl88R24sIFRsVCwgVGxWPiBuZXh0OworCW5leHQoZyk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBHbj4KKyAgICBzdHJ1Y3QgYXBwbHlfZ2VuZXJhdG9yMl88R24sIG51bGxfdHlwZSwgbnVsbF90eXBlPgorICAgIHsKKyAgICAgIHZvaWQKKyAgICAgIG9wZXJhdG9yKCkoR24mKSB7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0X0NoYWluMCwgdHlwZW5hbWUgVHlwZWxpc3RfQ2hhaW4xPgorICAgIHN0cnVjdCBhcHBlbmRfOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEhkLCB0eXBlbmFtZSBUbCwgdHlwZW5hbWUgVHlwZWxpc3RfQ2hhaW4+CisgICAgc3RydWN0IGFwcGVuZF88Y2hhaW48SGQsIFRsPiwgVHlwZWxpc3RfQ2hhaW4+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIGFwcGVuZF88VGwsIFR5cGVsaXN0X0NoYWluPiAJCQlhcHBlbmRfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgY2hhaW48SGQsIHR5cGVuYW1lIGFwcGVuZF90eXBlOjp0eXBlPiAJCXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdF9DaGFpbj4KKyAgICBzdHJ1Y3QgYXBwZW5kXzxudWxsX3R5cGUsIFR5cGVsaXN0X0NoYWluPgorICAgIHsKKyAgICAgIHR5cGVkZWYgVHlwZWxpc3RfQ2hhaW4gCQkJICAgICAgCQl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3RfQ2hhaW4+CisgICAgc3RydWN0IGFwcGVuZF88VHlwZWxpc3RfQ2hhaW4sIG51bGxfdHlwZT4KKyAgICB7CisgICAgICB0eXBlZGVmIFR5cGVsaXN0X0NoYWluIAkJCQkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgYXBwZW5kXzxudWxsX3R5cGUsIG51bGxfdHlwZT4KKyAgICB7CisgICAgICB0eXBlZGVmIG51bGxfdHlwZSAJCQkJCXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdF9UeXBlbGlzdF9DaGFpbj4KKyAgICBzdHJ1Y3QgYXBwZW5kX3R5cGVsaXN0XzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBIZD4KKyAgICBzdHJ1Y3QgYXBwZW5kX3R5cGVsaXN0XzxjaGFpbjxIZCwgbnVsbF90eXBlPiA+CisgICAgeworICAgICAgdHlwZWRlZiBjaGFpbjxIZCwgbnVsbF90eXBlPiAJCQkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEhkLCB0eXBlbmFtZSBUbD4KKyAgICBzdHJ1Y3QgYXBwZW5kX3R5cGVsaXN0XzxjaGFpbjwgSGQsIFRsPiA+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFwcGVuZF90eXBlbGlzdF88VGw+Ojp0eXBlIAkJcmVzdF90eXBlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhcHBlbmQ8SGQsIG5vZGU8cmVzdF90eXBlPiA+Ojp0eXBlOjpyb290CXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdF9DaGFpbiwgdHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgY29udGFpbnNfOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IGNvbnRhaW5zXzxudWxsX3R5cGUsIFQ+CisgICAgeworICAgICAgZW51bQorCXsKKwkgIHZhbHVlID0gZmFsc2UKKwl9OworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSGQsIHR5cGVuYW1lIFRsLCB0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBjb250YWluc188Y2hhaW48SGQsIFRsPiwgVD4KKyAgICB7CisgICAgICBlbnVtCisJeworCSAgdmFsdWUgPSBjb250YWluc188VGwsIFQ+Ojp2YWx1ZQorCX07CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUbCwgdHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgY29udGFpbnNfPGNoYWluPFQsIFRsPiwgVD4KKyAgICB7CisgICAgICBlbnVtCisJeworCSAgdmFsdWUgPSB0cnVlCisJfTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0X0NoYWluLCB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBQcmVkPgorICAgIHN0cnVjdCBjaGFpbl9maWx0ZXJfOworCisgIHRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFByZWQ+CisgICAgc3RydWN0IGNoYWluX2ZpbHRlcl88bnVsbF90eXBlLCBQcmVkPgorICAgIHsKKyAgICAgIHR5cGVkZWYgbnVsbF90eXBlIAkJCQkJdHlwZTsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBIZCwgdHlwZW5hbWUgVGwsIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFByZWQ+CisgICAgc3RydWN0IGNoYWluX2ZpbHRlcl88Y2hhaW48SGQsIFRsPiwgUHJlZD4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIGVudW0KKwl7CisJICBpbmNsdWRlX2hkID0gUHJlZDxIZD46OnZhbHVlCisJfTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjaGFpbl9maWx0ZXJfPFRsLCBQcmVkPjo6dHlwZSAJCXJlc3RfdHlwZTsKKyAgICAgIHR5cGVkZWYgY2hhaW48SGQsIHJlc3RfdHlwZT4gCQkJCWNoYWluX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fY29uZGl0aW9uYWxfdHlwZTxpbmNsdWRlX2hkLCBjaGFpbl90eXBlLCByZXN0X3R5cGU+OjpfX3R5cGUgdHlwZTsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdF9DaGFpbiwgaW50IGk+CisgICAgc3RydWN0IGNoYWluX2F0X2luZGV4XzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBIZCwgdHlwZW5hbWUgVGw+CisgICAgc3RydWN0IGNoYWluX2F0X2luZGV4XzxjaGFpbjxIZCwgVGw+LCAwPgorICAgIHsKKyAgICAgIHR5cGVkZWYgSGQgCQkJCQkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEhkLCB0eXBlbmFtZSBUbCwgaW50IGk+CisgICAgc3RydWN0IGNoYWluX2F0X2luZGV4XzxjaGFpbjxIZCwgVGw+LCBpPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2hhaW5fYXRfaW5kZXhfPFRsLCBpIC0gMT46OnR5cGUgCXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBUeXBlbGlzdF9DaGFpbiwgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgVHJhbnNmb3JtPgorICAgIHN0cnVjdCBjaGFpbl90cmFuc2Zvcm1fOworCisgIHRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFRyYW5zZm9ybT4KKyAgICBzdHJ1Y3QgY2hhaW5fdHJhbnNmb3JtXzxudWxsX3R5cGUsIFRyYW5zZm9ybT4KKyAgICB7CisgICAgICB0eXBlZGVmIG51bGxfdHlwZSAJCQkJCXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBIZCwgY2xhc3MgVGwsIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFRyYW5zZm9ybT4KKyAgICBzdHJ1Y3QgY2hhaW5fdHJhbnNmb3JtXzxjaGFpbjxIZCwgVGw+LCBUcmFuc2Zvcm0+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNoYWluX3RyYW5zZm9ybV88VGwsIFRyYW5zZm9ybT46OnR5cGUgCXJlc3RfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtPEhkPjo6dHlwZSAJCQl0cmFuc2Zvcm1fdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgY2hhaW48dHJhbnNmb3JtX3R5cGUsIHJlc3RfdHlwZT4gCQkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0X1R5cGVsaXN0X0NoYWluPgorICAgIHN0cnVjdCBjaGFpbl9mbGF0dGVuXzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBIZF9UbD4KKyAgICBzdHJ1Y3QgY2hhaW5fZmxhdHRlbl88Y2hhaW48SGRfVGwsIG51bGxfdHlwZT4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgSGRfVGw6OnJvb3QgCQkJCXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBIZF9UeXBlbGlzdCwgY2xhc3MgVGxfVHlwZWxpc3Q+CisgICAgc3RydWN0IGNoYWluX2ZsYXR0ZW5fPGNoYWluPEhkX1R5cGVsaXN0LCBUbF9UeXBlbGlzdD4gPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjaGFpbl9mbGF0dGVuXzxUbF9UeXBlbGlzdD46OnR5cGUgCXJlc3RfdHlwZTsKKyAgICAgIHR5cGVkZWYgYXBwZW5kPEhkX1R5cGVsaXN0LCBub2RlPHJlc3RfdHlwZT4gPgkJYXBwZW5kX3R5cGU7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhcHBlbmRfdHlwZTo6dHlwZTo6cm9vdCAJCQl0eXBlOworICAgIH07Cit9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIHR5cGVsaXN0CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2RlZmluZSBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjEoWDApIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNoYWluPFgwLCBfX2dudV9jeHg6OnR5cGVsaXN0OjpudWxsX3R5cGU+CisjZGVmaW5lIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMihYMCwgWDEpIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNoYWluPFgwLCBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjEoWDEpID4KKyNkZWZpbmUgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4zKFgwLCBYMSwgWDIpIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNoYWluPFgwLCBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjIoWDEsIFgyKSA+CisjZGVmaW5lIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlONChYMCwgWDEsIFgyLCBYMykgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y2hhaW48WDAsIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMyhYMSwgWDIsIFgzKSA+CisjZGVmaW5lIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlONShYMCwgWDEsIFgyLCBYMywgWDQpIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNoYWluPFgwLCBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjQoWDEsIFgyLCBYMywgWDQpID4KKyNkZWZpbmUgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU42KFgwLCBYMSwgWDIsIFgzLCBYNCwgWDUpIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNoYWluPFgwLCBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjUoWDEsIFgyLCBYMywgWDQsIFg1KSA+CisjZGVmaW5lIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlONyhYMCwgWDEsIFgyLCBYMywgWDQsIFg1LCBYNikgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y2hhaW48WDAsIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlONihYMSwgWDIsIFgzLCBYNCwgWDUsIFg2KSA+CisjZGVmaW5lIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOOChYMCwgWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcpIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNoYWluPFgwLCBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjcoWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcpID4KKyNkZWZpbmUgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU45KFgwLCBYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgpIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNoYWluPFgwLCBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjgoWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4KSA+CisjZGVmaW5lIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMTAoWDAsIFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3LCBYOCwgWDkpIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNoYWluPFgwLCBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjkoWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4LCBYOSkgPgorI2RlZmluZSBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjExKFgwLCBYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5LCBYMTApIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNoYWluPFgwLCBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjEwKFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3LCBYOCwgWDksIFgxMCkgPgorI2RlZmluZSBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjEyKFgwLCBYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5LCBYMTAsIFgxMSkgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y2hhaW48WDAsIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMTEoWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4LCBYOSwgWDEwLCBYMTEpID4KKyNkZWZpbmUgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4xMyhYMCwgWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4LCBYOSwgWDEwLCBYMTEsIFgxMikgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y2hhaW48WDAsIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMTIoWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4LCBYOSwgWDEwLCBYMTEsIFgxMikgPgorI2RlZmluZSBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjE0KFgwLCBYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5LCBYMTAsIFgxMSwgWDEyLCBYMTMpIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNoYWluPFgwLCBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjEzKFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3LCBYOCwgWDksIFgxMCwgWDExLCBYMTIsIFgxMykgPgorI2RlZmluZSBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjE1KFgwLCBYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5LCBYMTAsIFgxMSwgWDEyLCBYMTMsIFgxNCkgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y2hhaW48WDAsIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMTQoWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4LCBYOSwgWDEwLCBYMTEsIFgxMiwgWDEzLCBYMTQpID4KKyNkZWZpbmUgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4xNihYMCwgWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4LCBYOSwgWDEwLCBYMTEsIFgxMiwgWDEzLCBYMTQsIFgxNSkgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y2hhaW48WDAsIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMTUoWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4LCBYOSwgWDEwLCBYMTEsIFgxMiwgWDEzLCBYMTQsIFgxNSkgPgorI2RlZmluZSBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjE3KFgwLCBYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5LCBYMTAsIFgxMSwgWDEyLCBYMTMsIFgxNCwgWDE1LCBYMTYpIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNoYWluPFgwLCBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjE2KFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3LCBYOCwgWDksIFgxMCwgWDExLCBYMTIsIFgxMywgWDE0LCBYMTUsIFgxNikgPgorI2RlZmluZSBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjE4KFgwLCBYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5LCBYMTAsIFgxMSwgWDEyLCBYMTMsIFgxNCwgWDE1LCBYMTYsIFgxNykgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y2hhaW48WDAsIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMTcoWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4LCBYOSwgWDEwLCBYMTEsIFgxMiwgWDEzLCBYMTQsIFgxNSwgWDE2LCBYMTcpID4KKyNkZWZpbmUgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4xOShYMCwgWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4LCBYOSwgWDEwLCBYMTEsIFgxMiwgWDEzLCBYMTQsIFgxNSwgWDE2LCBYMTcsIFgxOCkgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y2hhaW48WDAsIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMTgoWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4LCBYOSwgWDEwLCBYMTEsIFgxMiwgWDEzLCBYMTQsIFgxNSwgWDE2LCBYMTcsIFgxOCkgPgorI2RlZmluZSBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjIwKFgwLCBYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5LCBYMTAsIFgxMSwgWDEyLCBYMTMsIFgxNCwgWDE1LCBYMTYsIFgxNywgWDE4LCBYMTkpIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNoYWluPFgwLCBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjE5KFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3LCBYOCwgWDksIFgxMCwgWDExLCBYMTIsIFgxMywgWDE0LCBYMTUsIFgxNiwgWDE3LCBYMTgsIFgxOSkgPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKK25hbWVzcGFjZSB0eXBlbGlzdAoreworICB0ZW1wbGF0ZTx0eXBlbmFtZSBGbiwgdHlwZW5hbWUgVHlwZWxpc3Q+CisgICAgdm9pZAorICAgIGFwcGx5KEZuJiBmbiwgVHlwZWxpc3QpCisgICAgeworICAgICAgZGV0YWlsOjphcHBseV88Rm4sIHR5cGVuYW1lIFR5cGVsaXN0Ojpyb290PiBhOworICAgICAgYShmbik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIEZuLCB0eXBlbmFtZSBUeXBlbGlzdD4KKyAgICB2b2lkCisgICAgYXBwbHlfZ2VuZXJhdG9yKEZuJiBmbiwgVHlwZWxpc3QpCisgICAgeworICAgICAgZGV0YWlsOjphcHBseV9nZW5lcmF0b3IxXzxGbiwgdHlwZW5hbWUgVHlwZWxpc3Q6OnJvb3Q+IGE7CisgICAgICBhKGZuKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRm4sIHR5cGVuYW1lIFR5cGVsaXN0VCwgdHlwZW5hbWUgVHlwZWxpc3RWPgorICAgIHZvaWQKKyAgICBhcHBseV9nZW5lcmF0b3IoRm4mIGZuLCBUeXBlbGlzdFQsIFR5cGVsaXN0VikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVsaXN0VDo6cm9vdCByb290VDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZWxpc3RWOjpyb290IHJvb3RWOworICAgICAgZGV0YWlsOjphcHBseV9nZW5lcmF0b3IyXzxGbiwgcm9vdFQsIHJvb3RWPiBhOworICAgICAgYShmbik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0MCwgdHlwZW5hbWUgVHlwZWxpc3QxPgorICAgIHN0cnVjdCBhcHBlbmQKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZWxpc3QwOjpyb290IAkJCQlyb290MF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlbGlzdDE6OnJvb3QgCQkJCXJvb3QxX3R5cGU7CisgICAgICB0eXBlZGVmIGRldGFpbDo6YXBwZW5kXzxyb290MF90eXBlLCByb290MV90eXBlPiAJCWFwcGVuZF90eXBlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBub2RlPHR5cGVuYW1lIGFwcGVuZF90eXBlOjp0eXBlPiAJCQl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3RfVHlwZWxpc3Q+CisgICAgc3RydWN0IGFwcGVuZF90eXBlbGlzdAorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlbGlzdF9UeXBlbGlzdDo6cm9vdCAJCSAgICAgIAlyb290X3R5cGU7CisgICAgICB0eXBlZGVmIGRldGFpbDo6YXBwZW5kX3R5cGVsaXN0Xzxyb290X3R5cGU+IAkJYXBwZW5kX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIG5vZGU8dHlwZW5hbWUgYXBwZW5kX3R5cGU6OnR5cGU+IAkJCXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdCwgdHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgY29udGFpbnMKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZWxpc3Q6OnJvb3QgCQkJCXJvb3RfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIGVudW0KKwl7CisJICB2YWx1ZSA9IGRldGFpbDo6Y29udGFpbnNfPHJvb3RfdHlwZSwgVD46OnZhbHVlCisJfTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0LCB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBQcmVkPgorICAgIHN0cnVjdCBmaWx0ZXIKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZWxpc3Q6OnJvb3QgCQkJCXJvb3RfdHlwZTsKKyAgICAgIHR5cGVkZWYgZGV0YWlsOjpjaGFpbl9maWx0ZXJfPHJvb3RfdHlwZSwgUHJlZD4gCQlmaWx0ZXJfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgbm9kZTx0eXBlbmFtZSBmaWx0ZXJfdHlwZTo6dHlwZT4gCSAgICAgICAJCXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdCwgaW50IGk+CisgICAgc3RydWN0IGF0X2luZGV4CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVsaXN0Ojpyb290IAkJCQlyb290X3R5cGU7CisgICAgICB0eXBlZGVmIGRldGFpbDo6Y2hhaW5fYXRfaW5kZXhfPHJvb3RfdHlwZSwgaT4gCQlpbmRleF90eXBlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpbmRleF90eXBlOjp0eXBlIAkJCXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdCwgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgVHJhbnNmb3JtPgorICAgIHN0cnVjdCB0cmFuc2Zvcm0KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZWxpc3Q6OnJvb3QgCQkJCXJvb3RfdHlwZTsKKyAgICAgIHR5cGVkZWYgZGV0YWlsOjpjaGFpbl90cmFuc2Zvcm1fPHJvb3RfdHlwZSwgVHJhbnNmb3JtPiAJdHJhbnNmb3JtX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIG5vZGU8dHlwZW5hbWUgdHJhbnNmb3JtX3R5cGU6OnR5cGU+IAkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0X1R5cGVsaXN0PgorICAgIHN0cnVjdCBmbGF0dGVuCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVsaXN0X1R5cGVsaXN0Ojpyb290IAkJICAgICAgCXJvb3RfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgZGV0YWlsOjpjaGFpbl9mbGF0dGVuXzxyb290X3R5cGU+Ojp0eXBlIAlmbGF0dGVuX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIG5vZGU8ZmxhdHRlbl90eXBlPiAJCQkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0PgorICAgIHN0cnVjdCBmcm9tX2ZpcnN0CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0X2luZGV4PFR5cGVsaXN0LCAwPjo6dHlwZSAJCWZpcnN0X3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIG5vZGU8Y2hhaW48Zmlyc3RfdHlwZSwgbnVsbF90eXBlPiA+IAkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQxPgorICAgIHN0cnVjdCBjcmVhdGUxCisgICAgeworICAgICAgdHlwZWRlZiBub2RlPF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMShUMSk+IAkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgY3JlYXRlMgorICAgIHsKKyAgICAgIHR5cGVkZWYgbm9kZTxfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjIoVDEsVDIpPiAJCXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgorICAgIHN0cnVjdCBjcmVhdGUzCisgICAgeworICAgICAgdHlwZWRlZiBub2RlPF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMyhUMSxUMixUMyk+CQl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+CisgICAgc3RydWN0IGNyZWF0ZTQKKyAgICB7CisgICAgICB0eXBlZGVmIG5vZGU8X0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU40KFQxLFQyLFQzLFQ0KT4JdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsCisJICAgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgorICAgIHN0cnVjdCBjcmVhdGU1CisgICAgeworICAgICAgdHlwZWRlZiBub2RlPF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlONShUMSxUMixUMyxUNCxUNSk+CXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLAorCSAgIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwgdHlwZW5hbWUgVDY+CisgICAgc3RydWN0IGNyZWF0ZTYKKyAgICB7CisgICAgICB0eXBlZGVmIG5vZGU8X0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU42KFQxLFQyLFQzLFQ0LFQ1LFQ2KT4JdHlwZTsKKyAgICB9OworfSAvLyBuYW1lc3BhY2UgdHlwZWxpc3QKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3ZzdHJpbmcuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3ZzdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDZhOTk2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvdnN0cmluZy5oCkBAIC0wLDAgKzEsMjg1NCBAQAorLy8gVmVyc2F0aWxlIHN0cmluZyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L3ZzdHJpbmcuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX1ZTVFJJTkdfSAorI2RlZmluZSBfVlNUUklOR19IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjZW5kaWYKKworI2luY2x1ZGUgPGV4dC92c3RyaW5nX3V0aWwuaD4KKyNpbmNsdWRlIDxleHQvcmNfc3RyaW5nX2Jhc2UuaD4KKyNpbmNsdWRlIDxleHQvc3NvX3N0cmluZ19iYXNlLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBjbGFzcyBfX3ZlcnNhX3N0cmluZyB2c3RyaW5nLmgKKyAgICogIEBicmllZiAgVGVtcGxhdGUgY2xhc3MgX192ZXJzYV9zdHJpbmcuIAorICAgKiAgQGluZ3JvdXAgZXh0ZW5zaW9ucworICAgKgorICAgKiAgRGF0YSBzdHJ1Y3R1cmUgbWFuYWdpbmcgc2VxdWVuY2VzIG9mIGNoYXJhY3RlcnMgYW5kCisgICAqICBjaGFyYWN0ZXItbGlrZSBvYmplY3RzLiAKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBjbGFzcyBfX3ZlcnNhX3N0cmluZworICAgIDogcHJpdmF0ZSBfQmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKyAgICB7CisgICAgICB0eXBlZGVmIF9CYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiAgICAgICAgICAgICAgICBfX3ZzdHJpbmdfYmFzZTsgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdnN0cmluZ19iYXNlOjpfQ2hhclRfYWxsb2NfdHlwZSAgICBfQ2hhclRfYWxsb2NfdHlwZTsKKworICAgICAgLy8gVHlwZXM6CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHJhaXRzCQkJCQkgICAgdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZQkJICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9BbGxvYwkJCQkJICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ2hhclRfYWxsb2NfdHlwZTo6c2l6ZV90eXBlCSAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyVF9hbGxvY190eXBlOjpkaWZmZXJlbmNlX3R5cGUgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgCSAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NoYXJUX2FsbG9jX3R5cGU6OnBvaW50ZXIJICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyVF9hbGxvY190eXBlOjpjb25zdF9wb2ludGVyCSAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fbm9ybWFsX2l0ZXJhdG9yPHBvaW50ZXIsIF9fdmVyc2Ffc3RyaW5nPiAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6X19ub3JtYWxfaXRlcmF0b3I8Y29uc3RfcG9pbnRlciwgX192ZXJzYV9zdHJpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPgljb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+CQkgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgLy8gRGF0YSBNZW1iZXIgKHB1YmxpYyk6CisgICAgICAvLy8gIFZhbHVlIHJldHVybmVkIGJ5IHZhcmlvdXMgbWVtYmVyIGZ1bmN0aW9ucyB3aGVuIHRoZXkgZmFpbC4KKyAgICAgIHN0YXRpYyBjb25zdCBzaXplX3R5cGUJbnBvcyA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oLTEpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fY2hlY2soc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBjaGFyKiBfX3MpIGNvbnN0CisgICAgICB7CisJaWYgKF9fcG9zID4gdGhpcy0+c2l6ZSgpKQorCSAgc3RkOjpfX3Rocm93X291dF9vZl9yYW5nZShfX04oX19zKSk7CisJcmV0dXJuIF9fcG9zOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9jaGVja19sZW5ndGgoc2l6ZV90eXBlIF9fbjEsIHNpemVfdHlwZSBfX24yLCBjb25zdCBjaGFyKiBfX3MpIGNvbnN0CisgICAgICB7CisJaWYgKHRoaXMtPm1heF9zaXplKCkgLSAodGhpcy0+c2l6ZSgpIC0gX19uMSkgPCBfX24yKQorCSAgc3RkOjpfX3Rocm93X2xlbmd0aF9lcnJvcihfX04oX19zKSk7CisgICAgICB9CisKKyAgICAgIC8vIE5COiBfTV9saW1pdCBkb2Vzbid0IGNoZWNrIGZvciBhIGJhZCBfX3BvcyB2YWx1ZS4KKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fbGltaXQoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19vZmYpIGNvbnN0CisgICAgICB7CisJY29uc3QgYm9vbCBfX3Rlc3RvZmYgPSAgX19vZmYgPCB0aGlzLT5zaXplKCkgLSBfX3BvczsKKwlyZXR1cm4gX190ZXN0b2ZmID8gX19vZmYgOiB0aGlzLT5zaXplKCkgLSBfX3BvczsKKyAgICAgIH0KKworICAgICAgLy8gVHJ1ZSBpZiBfUmVwIGFuZCBzb3VyY2UgZG8gbm90IG92ZXJsYXAuCisgICAgICBib29sCisgICAgICBfTV9kaXNqdW5jdChjb25zdCBfQ2hhclQqIF9fcykgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gKHN0ZDo6bGVzczxjb25zdCBfQ2hhclQqPigpKF9fcywgdGhpcy0+X01fZGF0YSgpKQorCQl8fCBzdGQ6Omxlc3M8Y29uc3QgX0NoYXJUKj4oKSh0aGlzLT5fTV9kYXRhKCkKKwkJCQkJICAgICAgKyB0aGlzLT5zaXplKCksIF9fcykpOworICAgICAgfQorCisgICAgICAvLyBGb3IgdGhlIGludGVybmFsIHVzZSB3ZSBoYXZlIGZ1bmN0aW9ucyBzaW1pbGFyIHRvIGBiZWdpbicvYGVuZCcKKyAgICAgIC8vIGJ1dCB0aGV5IGRvIG5vdCBjYWxsIF9NX2xlYWsuCisgICAgICBpdGVyYXRvcgorICAgICAgX01faWJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2RhdGEoKSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX2llbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fZGF0YSgpICsgdGhpcy0+X01fbGVuZ3RoKCkpOyB9CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBDb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgLy8gTkI6IFdlIG92ZXJsb2FkIGN0b3JzIGluIHNvbWUgY2FzZXMgaW5zdGVhZCBvZiB1c2luZyBkZWZhdWx0CisgICAgICAvLyBhcmd1bWVudHMsIHBlciAxNy40LjQuNCBwYXJhLiAyIGl0ZW0gMi4KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZWZhdWx0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gZW1wdHkgc3RyaW5nLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZygpCisgICAgICA6IF9fdnN0cmluZ19iYXNlKCkgeyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IGFuIGVtcHR5IHN0cmluZyB1c2luZyBhbGxvY2F0b3IgQGEgYS4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIF9fdmVyc2Ffc3RyaW5nKGNvbnN0IF9BbGxvYyYgX19hKQorICAgICAgOiBfX3ZzdHJpbmdfYmFzZShfX2EpIHsgfQorCisgICAgICAvLyBOQjogcGVyIExXRyBpc3N1ZSA0Miwgc2VtYW50aWNzIGRpZmZlcmVudCBmcm9tIElTOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3Qgc3RyaW5nIHdpdGggY29weSBvZiB2YWx1ZSBvZiBAYSBfX3N0ci4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBTb3VyY2Ugc3RyaW5nLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyhjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIpCisgICAgICA6IF9fdnN0cmluZ19iYXNlKF9fc3RyKSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3RyaW5nIG1vdmUgY29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBfX3N0ciAgU291cmNlIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNvbnN0cnVjdGVkICVzdHJpbmcgY29udGFpbnMgdGhlIGV4YWN0IGNvbnRlbnRzIG9mCisgICAgICAgKiAgQGEgX19zdHIuICBUaGUgY29udGVudHMgb2YgQGEgX19zdHIgYXJlIGEgdmFsaWQsIGJ1dCB1bnNwZWNpZmllZAorICAgICAgICogIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcoX192ZXJzYV9zdHJpbmcmJiBfX3N0cikgbm9leGNlcHQKKyAgICAgIDogX192c3RyaW5nX2Jhc2Uoc3RkOjptb3ZlKF9fc3RyKSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmluZyBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdCBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbGxvY2F0b3IgdG8gdXNlIChkZWZhdWx0IGlzIGRlZmF1bHQgYWxsb2NhdG9yKS4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcoc3RkOjppbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sLAorCQkgICAgIGNvbnN0IF9BbGxvYyYgX19hID0gX0FsbG9jKCkpCisgICAgICA6IF9fdnN0cmluZ19iYXNlKF9fbC5iZWdpbigpLCBfX2wuZW5kKCksIF9fYSkgeyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3Qgc3RyaW5nIGFzIGNvcHkgb2YgYSBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3N0ciAgU291cmNlIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gY29weSBmcm9tLgorICAgICAgICogIEBwYXJhbSAgX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBjb3B5IChkZWZhdWx0IHJlbWFpbmRlcikuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nKGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLAorCQkgICAgIHNpemVfdHlwZSBfX24gPSBucG9zKQorICAgICAgOiBfX3ZzdHJpbmdfYmFzZShfX3N0ci5fTV9kYXRhKCkKKwkJICAgICAgICsgX19zdHIuX01fY2hlY2soX19wb3MsCisJCQkJCSJfX3ZlcnNhX3N0cmluZzo6X192ZXJzYV9zdHJpbmciKSwKKwkJICAgICAgIF9fc3RyLl9NX2RhdGEoKSArIF9fc3RyLl9NX2xpbWl0KF9fcG9zLCBfX24pCisJCSAgICAgICArIF9fcG9zLCBfQWxsb2MoKSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmluZyBhcyBjb3B5IG9mIGEgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19zdHIgIFNvdXJjZSBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIGNvcHkgZnJvbS4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gY29weS4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQWxsb2NhdG9yIHRvIHVzZS4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcoY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsCisJCSAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgICA6IF9fdnN0cmluZ19iYXNlKF9fc3RyLl9NX2RhdGEoKQorCQkgICAgICAgKyBfX3N0ci5fTV9jaGVjayhfX3BvcywKKwkJCQkJIl9fdmVyc2Ffc3RyaW5nOjpfX3ZlcnNhX3N0cmluZyIpLAorCQkgICAgICAgX19zdHIuX01fZGF0YSgpICsgX19zdHIuX01fbGltaXQoX19wb3MsIF9fbikKKwkJICAgICAgICsgX19wb3MsIF9fYSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmluZyBpbml0aWFsaXplZCBieSBhIGNoYXJhY3RlciBhcnJheS4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgU291cmNlIGNoYXJhY3RlciBhcnJheS4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gY29weS4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQWxsb2NhdG9yIHRvIHVzZSAoZGVmYXVsdCBpcyBkZWZhdWx0IGFsbG9jYXRvcikuCisgICAgICAgKgorICAgICAgICogIE5COiBAYSBfX3MgbXVzdCBoYXZlIGF0IGxlYXN0IEBhIF9fbiBjaGFyYWN0ZXJzLCAnXFwwJyBoYXMgbm8gc3BlY2lhbAorICAgICAgICogIG1lYW5pbmcuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLAorCQkgICAgIGNvbnN0IF9BbGxvYyYgX19hID0gX0FsbG9jKCkpCisgICAgICA6IF9fdnN0cmluZ19iYXNlKF9fcywgX19zICsgX19uLCBfX2EpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJpbmcgYXMgY29weSBvZiBhIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19zICBTb3VyY2UgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFsbG9jYXRvciB0byB1c2UgKGRlZmF1bHQgaXMgZGVmYXVsdCBhbGxvY2F0b3IpLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywgY29uc3QgX0FsbG9jJiBfX2EgPSBfQWxsb2MoKSkKKyAgICAgIDogX192c3RyaW5nX2Jhc2UoX19zLCBfX3MgPyBfX3MgKyB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykgOgorCQkgICAgICAgX19zICsgbnBvcywgX19hKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3Qgc3RyaW5nIGFzIG11bHRpcGxlIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSAgX19jICBDaGFyYWN0ZXIgdG8gdXNlLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbGxvY2F0b3IgdG8gdXNlIChkZWZhdWx0IGlzIGRlZmF1bHQgYWxsb2NhdG9yKS4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYywgY29uc3QgX0FsbG9jJiBfX2EgPSBfQWxsb2MoKSkKKyAgICAgIDogX192c3RyaW5nX2Jhc2UoX19uLCBfX2MsIF9fYSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmluZyBhcyBjb3B5IG9mIGEgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBfX2JlZyAgU3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBfX2VuZCAgRW5kIG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbGxvY2F0b3IgdG8gdXNlIChkZWZhdWx0IGlzIGRlZmF1bHQgYWxsb2NhdG9yKS4KKyAgICAgICAqLworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICAgIF9fdmVyc2Ffc3RyaW5nKF9JbnB1dEl0ZXJhdG9yIF9fYmVnLCBfSW5wdXRJdGVyYXRvciBfX2VuZCwKKwkJICAgICAgIGNvbnN0IF9BbGxvYyYgX19hID0gX0FsbG9jKCkpCisJOiBfX3ZzdHJpbmdfYmFzZShfX2JlZywgX19lbmQsIF9fYSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVzdHJveSB0aGUgc3RyaW5nIGluc3RhbmNlLgorICAgICAgICovCisgICAgICB+X192ZXJzYV9zdHJpbmcoKSBfR0xJQkNYWF9OT0VYQ0VQVCB7IH0JCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWduIHRoZSB2YWx1ZSBvZiBAYSBzdHIgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3N0ciAgU291cmNlIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyKSAKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihfX3N0cik7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3RyaW5nIG1vdmUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBTb3VyY2Ugc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGUgY29udGVudHMgb2YgQGEgX19zdHIgYXJlIG1vdmVkIGludG8gdGhpcyBzdHJpbmcgKHdpdGhvdXQKKyAgICAgICAqICBjb3B5aW5nKS4gIEBhIF9fc3RyIGlzIGEgdmFsaWQsIGJ1dCB1bnNwZWNpZmllZCBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgb3BlcmF0b3I9KF9fdmVyc2Ffc3RyaW5nJiYgX19zdHIpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJdGhpcy0+c3dhcChfX3N0cik7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldCB2YWx1ZSB0byBzdHJpbmcgY29uc3RydWN0ZWQgZnJvbSBpbml0aWFsaXplciBsaXN0LgorICAgICAgICogIEBwYXJhbSAgX19sICBzdGQ6OmluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgb3BlcmF0b3I9KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5hc3NpZ24oX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29weSBjb250ZW50cyBvZiBAYSBfX3MgaW50byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgU291cmNlIG51bGwtdGVybWluYXRlZCBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9DaGFyVCogX19zKSAKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihfX3MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIHN0cmluZyBvZiBsZW5ndGggMS4KKyAgICAgICAqICBAcGFyYW0gIF9fYyAgU291cmNlIGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgQXNzaWduaW5nIHRvIGEgY2hhcmFjdGVyIG1ha2VzIHRoaXMgc3RyaW5nIGxlbmd0aCAxIGFuZAorICAgICAgICogICgqdGhpcylbMF0gPT0gQGEgX19jLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIG9wZXJhdG9yPShfQ2hhclQgX19jKSAKKyAgICAgIHsgCisJdGhpcy0+YXNzaWduKDEsIF9fYyk7IAorCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8gSXRlcmF0b3JzOgorICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBpbgorICAgICAgICogIHRoZSAlc3RyaW5nLiAgVW5zaGFyZXMgdGhlIHN0cmluZy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwl0aGlzLT5fTV9sZWFrKCk7CisJcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2RhdGEoKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QKKyAgICAgICAqICBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzLT5fTV9kYXRhKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgY2hhcmFjdGVyIGluIHRoZSAlc3RyaW5nLiAgVW5zaGFyZXMgdGhlIHN0cmluZy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJdGhpcy0+X01fbGVhaygpOworCXJldHVybiBpdGVyYXRvcih0aGlzLT5fTV9kYXRhKCkgKyB0aGlzLT5zaXplKCkpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlCisgICAgICAgKiAgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcy0+X01fZGF0YSgpICsgdGhpcy0+c2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBsYXN0CisgICAgICAgKiAgY2hhcmFjdGVyIGluIHRoZSAlc3RyaW5nLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gcmV2ZXJzZSBlbGVtZW50CisgICAgICAgKiAgb3JkZXIuICBVbnNoYXJlcyB0aGUgc3RyaW5nLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5lbmQoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMKKyAgICAgICAqICB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuICBJdGVyYXRpb24gaXMgZG9uZSBpbgorICAgICAgICogIHJldmVyc2UgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IodGhpcy0+ZW5kKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gb25lIGJlZm9yZSB0aGUKKyAgICAgICAqICBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuICBJdGVyYXRpb24gaXMgZG9uZSBpbiByZXZlcnNlCisgICAgICAgKiAgZWxlbWVudCBvcmRlci4gIFVuc2hhcmVzIHRoZSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5iZWdpbigpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cworICAgICAgICogIHRvIG9uZSBiZWZvcmUgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4gIEl0ZXJhdGlvbgorICAgICAgICogIGlzIGRvbmUgaW4gcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IodGhpcy0+YmVnaW4oKSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QKKyAgICAgICAqICBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcy0+X01fZGF0YSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlCisgICAgICAgKiAgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2RhdGEoKSArIHRoaXMtPnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMKKyAgICAgICAqICB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuICBJdGVyYXRpb24gaXMgZG9uZSBpbgorICAgICAgICogIHJldmVyc2UgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPmVuZCgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cworICAgICAgICogIHRvIG9uZSBiZWZvcmUgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4gIEl0ZXJhdGlvbgorICAgICAgICogIGlzIGRvbmUgaW4gcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPmJlZ2luKCkpOyB9CisjZW5kaWYKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIENhcGFjaXR5OgorICAgICAgLy8vICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nLCBub3QgaW5jbHVkaW5nIGFueQorICAgICAgLy8vICBudWxsLXRlcm1pbmF0aW9uLgorICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2xlbmd0aCgpOyB9CisKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZywgbm90IGluY2x1ZGluZyBhbnkKKyAgICAgIC8vLyAgbnVsbC10ZXJtaW5hdGlvbi4KKyAgICAgIHNpemVfdHlwZQorICAgICAgbGVuZ3RoKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2xlbmd0aCgpOyB9CisKKyAgICAgIC8vLyBSZXR1cm5zIHRoZSBzaXplKCkgb2YgdGhlIGxhcmdlc3QgcG9zc2libGUgJXN0cmluZy4KKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fbWF4X3NpemUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlc2l6ZXMgdGhlICVzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhlICVzdHJpbmcgc2hvdWxkIGNvbnRhaW4uCisgICAgICAgKiAgQHBhcmFtICBfX2MgIENoYXJhY3RlciB0byBmaWxsIGFueSBuZXcgZWxlbWVudHMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCAlcmVzaXplIHRoZSAlc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgICAqICBudW1iZXIgb2YgY2hhcmFjdGVycy4gIElmIHRoZSBudW1iZXIgaXMgc21hbGxlciB0aGFuIHRoZQorICAgICAgICogICVzdHJpbmcncyBjdXJyZW50IHNpemUgdGhlICVzdHJpbmcgaXMgdHJ1bmNhdGVkLCBvdGhlcndpc2UKKyAgICAgICAqICB0aGUgJXN0cmluZyBpcyBleHRlbmRlZCBhbmQgbmV3IGVsZW1lbnRzIGFyZSBzZXQgdG8gQGEgX19jLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYyk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVzaXplcyB0aGUgJXN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSAgX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0aGUgJXN0cmluZyBzaG91bGQgY29udGFpbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlc2l6ZSB0aGUgJXN0cmluZyB0byB0aGUgc3BlY2lmaWVkCisgICAgICAgKiAgbGVuZ3RoLiAgSWYgdGhlIG5ldyBzaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUgJXN0cmluZydzCisgICAgICAgKiAgY3VycmVudCBzaXplIHRoZSAlc3RyaW5nIGlzIHRydW5jYXRlZCwgb3RoZXJ3aXNlIHRoZSAlc3RyaW5nCisgICAgICAgKiAgaXMgZXh0ZW5kZWQgYW5kIG5ldyBjaGFyYWN0ZXJzIGFyZSBkZWZhdWx0LWNvbnN0cnVjdGVkLiAgRm9yCisgICAgICAgKiAgYmFzaWMgdHlwZXMgc3VjaCBhcyBjaGFyLCB0aGlzIG1lYW5zIHNldHRpbmcgdGhlbSB0byAwLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgdGhpcy0+cmVzaXplKF9fbiwgX0NoYXJUKCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLy8gQSBub24tYmluZGluZyByZXF1ZXN0IHRvIHJlZHVjZSBjYXBhY2l0eSgpIHRvIHNpemUoKS4KKyAgICAgIHZvaWQKKyAgICAgIHNocmlua190b19maXQoKQorICAgICAgeworCWlmIChjYXBhY2l0eSgpID4gc2l6ZSgpKQorCSAgeworCSAgICBfX3RyeQorCSAgICAgIHsgdGhpcy0+cmVzZXJ2ZSgwKTsgfQorCSAgICBfX2NhdGNoKC4uLikKKwkgICAgICB7IH0KKwkgIH0KKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHRoZSAlc3RyaW5nIGNhbgorICAgICAgICogIGhvbGQgYmVmb3JlIG5lZWRpbmcgdG8gYWxsb2NhdGUgbW9yZSBtZW1vcnkuCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgY2FwYWNpdHkoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fY2FwYWNpdHkoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEF0dGVtcHQgdG8gcHJlYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSBmb3Igc3BlY2lmaWVkIG51bWJlciBvZgorICAgICAgICogICAgICAgICAgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gIF9fcmVzX2FyZyAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVxdWlyZWQuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgQGEgX19yZXNfYXJnIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byByZXNlcnZlIGVub3VnaCBtZW1vcnkgZm9yIHRoZQorICAgICAgICogICVzdHJpbmcgdG8gaG9sZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzLiAgSWYgdGhlCisgICAgICAgKiAgbnVtYmVyIHJlcXVlc3RlZCBpcyBtb3JlIHRoYW4gbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzCisgICAgICAgKiAgdGhyb3duLgorICAgICAgICoKKyAgICAgICAqICBUaGUgYWR2YW50YWdlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhhdCBpZiBvcHRpbWFsIGNvZGUgaXMgYQorICAgICAgICogIG5lY2Vzc2l0eSBhbmQgdGhlIHVzZXIgY2FuIGRldGVybWluZSB0aGUgc3RyaW5nIGxlbmd0aCB0aGF0CisgICAgICAgKiAgd2lsbCBiZSByZXF1aXJlZCwgdGhlIHVzZXIgY2FuIHJlc2VydmUgdGhlIG1lbW9yeSBpbgorICAgICAgICogICVhZHZhbmNlLCBhbmQgdGh1cyBwcmV2ZW50IGEgcG9zc2libGUgcmVhbGxvY2F0aW9uIG9mIG1lbW9yeQorICAgICAgICogIGFuZCBjb3B5aW5nIG9mICVzdHJpbmcgZGF0YS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXJ2ZShzaXplX3R5cGUgX19yZXNfYXJnID0gMCkKKyAgICAgIHsgdGhpcy0+X01fcmVzZXJ2ZShfX3Jlc19hcmcpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEVyYXNlcyB0aGUgc3RyaW5nLCBtYWtpbmcgaXQgZW1wdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgdGhpcy0+X01fY2xlYXIoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlICVzdHJpbmcgaXMgZW1wdHkuICBFcXVpdmFsZW50IHRvIAorICAgICAgICogIDxjb2RlPip0aGlzID09ICIiPC9jb2RlPi4KKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+c2l6ZSgpID09IDA7IH0KKworICAgICAgLy8gRWxlbWVudCBhY2Nlc3M6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN1YnNjcmlwdCBhY2Nlc3MgdG8gdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSAlc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIFRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIHRvIGFjY2Vzcy4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRvciBhbGxvd3MgZm9yIGVhc3ksIGFycmF5LXN0eWxlLCBkYXRhIGFjY2Vzcy4KKyAgICAgICAqICBOb3RlIHRoYXQgZGF0YSBhY2Nlc3Mgd2l0aCB0aGlzIG9wZXJhdG9yIGlzIHVuY2hlY2tlZCBhbmQKKyAgICAgICAqICBvdXRfb2ZfcmFuZ2UgbG9va3VwcyBhcmUgbm90IGRlZmluZWQuIChGb3IgY2hlY2tlZCBsb29rdXBzCisgICAgICAgKiAgc2VlIGF0KCkuKQorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10gKHNpemVfdHlwZSBfX3BvcykgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX19wb3MgPD0gdGhpcy0+c2l6ZSgpKTsKKwlyZXR1cm4gdGhpcy0+X01fZGF0YSgpW19fcG9zXTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdWJzY3JpcHQgYWNjZXNzIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJXN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBUaGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciB0byBhY2Nlc3MuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC93cml0ZSByZWZlcmVuY2UgdG8gdGhlIGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRvciBhbGxvd3MgZm9yIGVhc3ksIGFycmF5LXN0eWxlLCBkYXRhIGFjY2Vzcy4KKyAgICAgICAqICBOb3RlIHRoYXQgZGF0YSBhY2Nlc3Mgd2l0aCB0aGlzIG9wZXJhdG9yIGlzIHVuY2hlY2tlZCBhbmQKKyAgICAgICAqICBvdXRfb2ZfcmFuZ2UgbG9va3VwcyBhcmUgbm90IGRlZmluZWQuIChGb3IgY2hlY2tlZCBsb29rdXBzCisgICAgICAgKiAgc2VlIGF0KCkuKSAgVW5zaGFyZXMgdGhlIHN0cmluZy4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX3BvcykKKyAgICAgIHsKKyAgICAgICAgLy8gYWxsb3cgcG9zID09IHNpemUoKSBhcyB2MyBleHRlbnNpb246CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9fcG9zIDw9IHRoaXMtPnNpemUoKSk7CisgICAgICAgIC8vIGJ1dCBiZSBzdHJpY3QgaW4gcGVkYW50aWMgbW9kZToKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX19wb3MgPCB0aGlzLT5zaXplKCkpOworCXRoaXMtPl9NX2xlYWsoKTsKKwlyZXR1cm4gdGhpcy0+X01fZGF0YSgpW19fcG9zXTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSAlc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX24gVGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgdG8gYWNjZXNzLgorICAgICAgICogIEByZXR1cm4gIFJlYWQtb25seSAoY29uc3QpIHJlZmVyZW5jZSB0byB0aGUgY2hhcmFjdGVyLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIF9fbiBpcyBhbiBpbnZhbGlkIGluZGV4LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGZvciBzYWZlciBkYXRhIGFjY2Vzcy4gIFRoZSBwYXJhbWV0ZXIKKyAgICAgICAqICBpcyBmaXJzdCBjaGVja2VkIHRoYXQgaXQgaXMgaW4gdGhlIHJhbmdlIG9mIHRoZSBzdHJpbmcuICBUaGUKKyAgICAgICAqICBmdW5jdGlvbiB0aHJvd3Mgb3V0X29mX3JhbmdlIGlmIHRoZSBjaGVjayBmYWlscy4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBhdChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeworCWlmIChfX24gPj0gdGhpcy0+c2l6ZSgpKQorCSAgc3RkOjpfX3Rocm93X291dF9vZl9yYW5nZShfX04oIl9fdmVyc2Ffc3RyaW5nOjphdCIpKTsKKwlyZXR1cm4gdGhpcy0+X01fZGF0YSgpW19fbl07CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJXN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19uIFRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIHRvIGFjY2Vzcy4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgY2hhcmFjdGVyLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIF9fbiBpcyBhbiBpbnZhbGlkIGluZGV4LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGZvciBzYWZlciBkYXRhIGFjY2Vzcy4gIFRoZSBwYXJhbWV0ZXIKKyAgICAgICAqICBpcyBmaXJzdCBjaGVja2VkIHRoYXQgaXQgaXMgaW4gdGhlIHJhbmdlIG9mIHRoZSBzdHJpbmcuICBUaGUKKyAgICAgICAqICBmdW5jdGlvbiB0aHJvd3Mgb3V0X29mX3JhbmdlIGlmIHRoZSBjaGVjayBmYWlscy4gIFN1Y2Nlc3MKKyAgICAgICAqICByZXN1bHRzIGluIHVuc2hhcmluZyB0aGUgc3RyaW5nLgorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIGF0KHNpemVfdHlwZSBfX24pCisgICAgICB7CisJaWYgKF9fbiA+PSB0aGlzLT5zaXplKCkpCisJICBzdGQ6Ol9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiX192ZXJzYV9zdHJpbmc6OmF0IikpOworCXRoaXMtPl9NX2xlYWsoKTsKKwlyZXR1cm4gdGhpcy0+X01fZGF0YSgpW19fbl07CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJXN0cmluZy4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBmcm9udCgpCisgICAgICB7IHJldHVybiBvcGVyYXRvcltdKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJXN0cmluZy4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBmcm9udCgpIGNvbnN0CisgICAgICB7IHJldHVybiBvcGVyYXRvcltdKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgbGFzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICVzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgYmFjaygpCisgICAgICB7IHJldHVybiBvcGVyYXRvcltdKHRoaXMtPnNpemUoKSAtIDEpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlCisgICAgICAgKiAgbGFzdCBlbGVtZW50IG9mIHRoZSAlc3RyaW5nLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGJhY2soKSBjb25zdAorICAgICAgeyByZXR1cm4gb3BlcmF0b3JbXSh0aGlzLT5zaXplKCkgLSAxKTsgfQorI2VuZGlmCisKKyAgICAgIC8vIE1vZGlmaWVyczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGEgc3RyaW5nIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgVGhlIHN0cmluZyB0byBhcHBlbmQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIG9wZXJhdG9yKz0oY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyKQorICAgICAgeyByZXR1cm4gdGhpcy0+YXBwZW5kKF9fc3RyKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIFRoZSBDIHN0cmluZyB0byBhcHBlbmQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIG9wZXJhdG9yKz0oY29uc3QgX0NoYXJUKiBfX3MpCisgICAgICB7IHJldHVybiB0aGlzLT5hcHBlbmQoX19zKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhcmFjdGVyIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgb3BlcmF0b3IrPShfQ2hhclQgX19jKQorICAgICAgeyAKKwl0aGlzLT5wdXNoX2JhY2soX19jKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhbiBpbml0aWFsaXplcl9saXN0IG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIF9fbCAgVGhlIGluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycyB0byBiZSBhcHBlbmRlZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgb3BlcmF0b3IrPShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X0NoYXJUPiBfX2wpCisgICAgICB7IHJldHVybiB0aGlzLT5hcHBlbmQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZiAvLyBDKysxMQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhIHN0cmluZyB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFRoZSBzdHJpbmcgdG8gYXBwZW5kLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBhcHBlbmQoY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyKQorICAgICAgeyByZXR1cm4gX01fYXBwZW5kKF9fc3RyLl9NX2RhdGEoKSwgX19zdHIuc2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFRoZSBzdHJpbmcgdG8gYXBwZW5kLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBzdHIgdG8gYXBwZW5kLgorICAgICAgICogIEBwYXJhbSBfX24gIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBhcHBlbmQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgaWYgQGEgcG9zIGlzIG5vdCBhIHZhbGlkIGluZGV4LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGFwcGVuZHMgQGEgX19uIGNoYXJhY3RlcnMgZnJvbSBAYSBfX3N0cgorICAgICAgICogIHN0YXJ0aW5nIGF0IEBhIF9fcG9zIHRvIHRoaXMgc3RyaW5nLiAgSWYgQGEgX19uIGlzIGlzIGxhcmdlcgorICAgICAgICogIHRoYW4gdGhlIG51bWJlciBvZiBhdmFpbGFibGUgY2hhcmFjdGVycyBpbiBAYSBfX3N0ciwgdGhlCisgICAgICAgKiAgcmVtYWluZGVyIG9mIEBhIF9fc3RyIGlzIGFwcGVuZGVkLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIGFwcGVuZChjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIF9NX2FwcGVuZChfX3N0ci5fTV9kYXRhKCkKKwkJCSArIF9fc3RyLl9NX2NoZWNrKF9fcG9zLCAiX192ZXJzYV9zdHJpbmc6OmFwcGVuZCIpLAorCQkJIF9fc3RyLl9NX2xpbWl0KF9fcG9zLCBfX24pKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIFRoZSBDIHN0cmluZyB0byBhcHBlbmQuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uKTsKKwlfTV9jaGVja19sZW5ndGgoc2l6ZV90eXBlKDApLCBfX24sICJfX3ZlcnNhX3N0cmluZzo6YXBwZW5kIik7CisJcmV0dXJuIF9NX2FwcGVuZChfX3MsIF9fbik7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgVGhlIEMgc3RyaW5nIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19zKQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKwljb25zdCBzaXplX3R5cGUgX19uID0gdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpOworCV9NX2NoZWNrX2xlbmd0aChzaXplX3R5cGUoMCksIF9fbiwgIl9fdmVyc2Ffc3RyaW5nOjphcHBlbmQiKTsKKwlyZXR1cm4gX01fYXBwZW5kKF9fcywgX19uKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBlbmQgbXVsdGlwbGUgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19uICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYXBwZW5kLgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyYWN0ZXIgdG8gdXNlLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgQXBwZW5kcyBuIGNvcGllcyBvZiBjIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIGFwcGVuZChzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgICAgeyByZXR1cm4gX01fcmVwbGFjZV9hdXgodGhpcy0+c2l6ZSgpLCBzaXplX3R5cGUoMCksIF9fbiwgX19jKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBlbmQgYW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX2wgIFRoZSBpbml0aWFsaXplcl9saXN0IG9mIGNoYXJhY3RlcnMgdG8gYXBwZW5kLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBhcHBlbmQoc3RkOjppbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sKQorICAgICAgeyByZXR1cm4gdGhpcy0+YXBwZW5kKF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYgLy8gQysrMTEKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBlbmQgYSByYW5nZSBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX2ZpcnN0ICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcGFyYW0gX19sYXN0ICBJdGVyYXRvciBtYXJraW5nIHRoZSBlbmQgb2YgdGhlIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgQXBwZW5kcyBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyNlbmRpZgorICAgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgICAgYXBwZW5kKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeyByZXR1cm4gdGhpcy0+cmVwbGFjZShfTV9pZW5kKCksIF9NX2llbmQoKSwgX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhIHNpbmdsZSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgQ2hhcmFjdGVyIHRvIGFwcGVuZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKF9DaGFyVCBfX2MpCisgICAgICB7IAorCWNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisJaWYgKF9fc2l6ZSArIDEgPiB0aGlzLT5jYXBhY2l0eSgpIHx8IHRoaXMtPl9NX2lzX3NoYXJlZCgpKQorCSAgdGhpcy0+X01fbXV0YXRlKF9fc2l6ZSwgc2l6ZV90eXBlKDApLCAwLCBzaXplX3R5cGUoMSkpOworCXRyYWl0c190eXBlOjphc3NpZ24odGhpcy0+X01fZGF0YSgpW19fc2l6ZV0sIF9fYyk7CisJdGhpcy0+X01fc2V0X2xlbmd0aChfX3NpemUgKyAxKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gY29udGVudHMgb2YgYW5vdGhlciBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3N0ciAgU291cmNlIHN0cmluZyB0byB1c2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIGFzc2lnbihjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIpCisgICAgICB7CisJdGhpcy0+X01fYXNzaWduKF9fc3RyKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldCB2YWx1ZSB0byBjb250ZW50cyBvZiBhbm90aGVyIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBTb3VyY2Ugc3RyaW5nIHRvIHVzZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGlzIHN0cmluZyB0byB0aGUgZXhhY3QgY29udGVudHMgb2YgQGEgX19zdHIuCisgICAgICAgKiAgQGEgX19zdHIgaXMgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBhc3NpZ24oX192ZXJzYV9zdHJpbmcmJiBfX3N0cikKKyAgICAgIHsKKwl0aGlzLT5zd2FwKF9fc3RyKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYgLy8gQysrMTEKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gYSBzdWJzdHJpbmcgb2YgYSBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBUaGUgc3RyaW5nIHRvIHVzZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2Ygc3RyLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHVzZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSBpZiBAYSBfX3BvcyBpcyBub3QgYSB2YWxpZCBpbmRleC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoaXMgc3RyaW5nIHRvIHRoZSBzdWJzdHJpbmcgb2YgQGEgX19zdHIKKyAgICAgICAqICBjb25zaXN0aW5nIG9mIEBhIF9fbiBjaGFyYWN0ZXJzIGF0IEBhIF9fcG9zLiAgSWYgQGEgX19uIGlzCisgICAgICAgKiAgaXMgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBhdmFpbGFibGUgY2hhcmFjdGVycyBpbiBAYQorICAgICAgICogIF9fc3RyLCB0aGUgcmVtYWluZGVyIG9mIEBhIF9fc3RyIGlzIHVzZWQuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgYXNzaWduKGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gX01fcmVwbGFjZShzaXplX3R5cGUoMCksIHRoaXMtPnNpemUoKSwgX19zdHIuX01fZGF0YSgpCisJCQkgICsgX19zdHIuX01fY2hlY2soX19wb3MsICJfX3ZlcnNhX3N0cmluZzo6YXNzaWduIiksCisJCQkgIF9fc3RyLl9NX2xpbWl0KF9fcG9zLCBfX24pKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldCB2YWx1ZSB0byBhIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIFRoZSBDIHN0cmluZyB0byB1c2UuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gdXNlLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHN0cmluZyB0byB0aGUgZmlyc3QgQGEKKyAgICAgICAqICBfX24gY2hhcmFjdGVycyBvZiBAYSBfX3MuICBJZiBAYSBfX24gaXMgaXMgbGFyZ2VyIHRoYW4gdGhlCisgICAgICAgKiAgbnVtYmVyIG9mIGF2YWlsYWJsZSBjaGFyYWN0ZXJzIGluIEBhIF9fcywgdGhlIHJlbWFpbmRlciBvZgorICAgICAgICogIEBhIF9fcyBpcyB1c2VkLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbik7CisJcmV0dXJuIF9NX3JlcGxhY2Uoc2l6ZV90eXBlKDApLCB0aGlzLT5zaXplKCksIF9fcywgX19uKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gY29udGVudHMgb2YgYSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBUaGUgQyBzdHJpbmcgdG8gdXNlLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHN0cmluZyB0byB0aGUgdmFsdWUgb2YKKyAgICAgICAqICBAYSBfX3MuICBUaGUgZGF0YSBpcyBjb3BpZWQsIHNvIHRoZXJlIGlzIG5vIGRlcGVuZGVuY2Ugb24gQGEKKyAgICAgICAqICBfX3Mgb25jZSB0aGUgZnVuY3Rpb24gcmV0dXJucy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBhc3NpZ24oY29uc3QgX0NoYXJUKiBfX3MpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiBfTV9yZXBsYWNlKHNpemVfdHlwZSgwKSwgdGhpcy0+c2l6ZSgpLCBfX3MsCisJCQkgIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIG11bHRpcGxlIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyYWN0ZXIgdG8gdXNlLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHN0cmluZyB0byBAYSBfX24gY29waWVzIG9mCisgICAgICAgKiAgY2hhcmFjdGVyIEBhIF9fYy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykKKyAgICAgIHsgcmV0dXJuIF9NX3JlcGxhY2VfYXV4KHNpemVfdHlwZSgwKSwgdGhpcy0+c2l6ZSgpLCBfX24sIF9fYyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gYSByYW5nZSBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX2ZpcnN0ICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcGFyYW0gX19sYXN0ICBJdGVyYXRvciBtYXJraW5nIHRoZSBlbmQgb2YgdGhlIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgU2V0cyB2YWx1ZSBvZiBzdHJpbmcgdG8gY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UKKyAgICAgICAqICBbZmlyc3QsbGFzdCkuCisgICAgICAqLworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7IHJldHVybiB0aGlzLT5yZXBsYWNlKF9NX2liZWdpbigpLCBfTV9pZW5kKCksIF9fZmlyc3QsIF9fbGFzdCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIGFuIGluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19sICBUaGUgaW5pdGlhbGl6ZXJfbGlzdCBvZiBjaGFyYWN0ZXJzIHRvIGFzc2lnbi4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgYXNzaWduKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmIC8vIEMrKzExCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IG11bHRpcGxlIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIF9fcCAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgbG9jYXRpb24gaW4gc3RyaW5nIHRvIGluc2VydCBhdC4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBpbnNlcnQKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhcmFjdGVyIHRvIGluc2VydC4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0cyBAYSBfX24gY29waWVzIG9mIGNoYXJhY3RlciBAYSBfX2Mgc3RhcnRpbmcgYXQgdGhlCisgICAgICAgKiAgcG9zaXRpb24gcmVmZXJlbmNlZCBieSBpdGVyYXRvciBAYSBfX3AuICBJZiBhZGRpbmcKKyAgICAgICAqICBjaGFyYWN0ZXJzIGNhdXNlcyB0aGUgbGVuZ3RoIHRvIGV4Y2VlZCBtYXhfc2l6ZSgpLAorICAgICAgICogIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0CisgICAgICAgKiAgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgICAgewl0aGlzLT5yZXBsYWNlKF9fcCwgX19wLCBfX24sIF9fYyk7ICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IGEgcmFuZ2Ugb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19wICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX2JlZyAgU3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9fZW5kICBFbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIEluc2VydHMgY2hhcmFjdGVycyBpbiByYW5nZSBbYmVnLGVuZCkuICBJZiBhZGRpbmcgY2hhcmFjdGVycworICAgICAgICogIGNhdXNlcyB0aGUgbGVuZ3RoIHRvIGV4Y2VlZCBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMKKyAgICAgICAqICB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvcgorICAgICAgICogIGlzIHRocm93bi4KKyAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisjZWxzZQorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisjZW5kaWYKKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wLCBfSW5wdXRJdGVyYXRvciBfX2JlZywgX0lucHV0SXRlcmF0b3IgX19lbmQpCisgICAgICAgIHsgdGhpcy0+cmVwbGFjZShfX3AsIF9fcCwgX19iZWcsIF9fZW5kKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgYW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX3AgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGxvY2F0aW9uIGluIHN0cmluZyB0byBpbnNlcnQgYXQuCisgICAgICAgKiAgQHBhcmFtIF9fbCAgVGhlIGluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycyB0byBpbnNlcnQuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3AsIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCkKKyAgICAgIHsgdGhpcy0+aW5zZXJ0KF9fcCwgX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZiAvLyBDKysxMQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCB2YWx1ZSBvZiBhIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MxICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgVGhlIHN0cmluZyB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRzIHZhbHVlIG9mIEBhIF9fc3RyIHN0YXJ0aW5nIGF0IEBhIF9fcG9zMS4gIElmIGFkZGluZworICAgICAgICogIGNoYXJhY3RlcnMgY2F1c2VzIHRoZSBsZW5ndGggdG8gZXhjZWVkIG1heF9zaXplKCksCisgICAgICAgKiAgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QKKyAgICAgICAqICBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgaW5zZXJ0KHNpemVfdHlwZSBfX3BvczEsIGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0cikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19wb3MxLCBzaXplX3R5cGUoMCksCisJCQkgICAgIF9fc3RyLl9NX2RhdGEoKSwgX19zdHIuc2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCBhIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MxICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgVGhlIHN0cmluZyB0byBpbnNlcnQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zMiAgU3RhcnQgb2YgY2hhcmFjdGVycyBpbiBzdHIgdG8gaW5zZXJ0LgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19wb3MxID4gc2l6ZSgpIG9yCisgICAgICAgKiAgQGEgX19wb3MyID4gQGEgX19zdHIuc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBhdCBAYSBfX3BvczEsIGluc2VydCBAYSBfX24gY2hhcmFjdGVyIG9mIEBhIF9fc3RyCisgICAgICAgKiAgYmVnaW5uaW5nIHdpdGggQGEgX19wb3MyLiAgSWYgYWRkaW5nIGNoYXJhY3RlcnMgY2F1c2VzIHRoZQorICAgICAgICogIGxlbmd0aCB0byBleGNlZWQgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIElmIEBhCisgICAgICAgKiAgX19wb3MxIGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoaXMgc3RyaW5nIG9yIEBhIF9fcG9zMiBpcworICAgICAgICogIGJleW9uZCB0aGUgZW5kIG9mIEBhIF9fc3RyLCBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLiAgVGhlCisgICAgICAgKiAgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zMSwgY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyLAorCSAgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19wb3MxLCBzaXplX3R5cGUoMCksIF9fc3RyLl9NX2RhdGEoKQorCQkJICAgICArIF9fc3RyLl9NX2NoZWNrKF9fcG9zMiwgIl9fdmVyc2Ffc3RyaW5nOjppbnNlcnQiKSwKKwkJCSAgICAgX19zdHIuX01fbGltaXQoX19wb3MyLCBfX24pKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCBhIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgbG9jYXRpb24gaW4gc3RyaW5nIHRvIGluc2VydCBhdC4KKyAgICAgICAqICBAcGFyYW0gX19zICBUaGUgQyBzdHJpbmcgdG8gaW5zZXJ0LgorICAgICAgICogIEBwYXJhbSBfX24gIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIF9fcG9zIGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoaXMKKyAgICAgICAqICBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIEluc2VydHMgdGhlIGZpcnN0IEBhIF9fbiBjaGFyYWN0ZXJzIG9mIEBhIF9fcyBzdGFydGluZyBhdCBAYQorICAgICAgICogIF9fcG9zLiAgSWYgYWRkaW5nIGNoYXJhY3RlcnMgY2F1c2VzIHRoZSBsZW5ndGggdG8gZXhjZWVkCisgICAgICAgKiAgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIElmIEBhIF9fcG9zIGlzIGJleW9uZAorICAgICAgICogIGVuZCgpLCBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcKKyAgICAgICAqICBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19wb3MsIHNpemVfdHlwZSgwKSwgX19zLCBfX24pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX3MgIFRoZSBDIHN0cmluZyB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIF9fcG9zIGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoaXMKKyAgICAgICAqICBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIEluc2VydHMgdGhlIGZpcnN0IEBhIF9fbiBjaGFyYWN0ZXJzIG9mIEBhIF9fcyBzdGFydGluZyBhdCBAYQorICAgICAgICogIF9fcG9zLiAgSWYgYWRkaW5nIGNoYXJhY3RlcnMgY2F1c2VzIHRoZSBsZW5ndGggdG8gZXhjZWVkCisgICAgICAgKiAgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIElmIEBhIF9fcG9zIGlzIGJleW9uZAorICAgICAgICogIGVuZCgpLCBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcKKyAgICAgICAqICBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQ2hhclQqIF9fcykKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19wb3MsIHNpemVfdHlwZSgwKSwgX19zLAorCQkJICAgICB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCBtdWx0aXBsZSBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggaW4gc3RyaW5nIHRvIGluc2VydCBhdC4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBpbnNlcnQKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhcmFjdGVyIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19wb3MgaXMgYmV5b25kIHRoZSBlbmQgb2YgdGhpcworICAgICAgICogIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0cyBAYSBfX24gY29waWVzIG9mIGNoYXJhY3RlciBAYSBfX2Mgc3RhcnRpbmcgYXQgaW5kZXgKKyAgICAgICAqICBAYSBfX3Bvcy4gIElmIGFkZGluZyBjaGFyYWN0ZXJzIGNhdXNlcyB0aGUgbGVuZ3RoIHRvIGV4Y2VlZAorICAgICAgICogIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBJZiBAYSBfX3BvcyA+IGxlbmd0aCgpLAorICAgICAgICogIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0CisgICAgICAgKiAgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIGluc2VydChzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgICB7IHJldHVybiBfTV9yZXBsYWNlX2F1eChfTV9jaGVjayhfX3BvcywgIl9fdmVyc2Ffc3RyaW5nOjppbnNlcnQiKSwKKwkJCSAgICAgIHNpemVfdHlwZSgwKSwgX19uLCBfX2MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IG9uZSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIF9fcCAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgcG9zaXRpb24gaW4gc3RyaW5nIHRvIGluc2VydCBhdC4KKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhcmFjdGVyIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciByZWZlcmVuY2luZyBuZXdseSBpbnNlcnRlZCBjaGFyLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRzIGNoYXJhY3RlciBAYSBfX2MgYXQgcG9zaXRpb24gcmVmZXJlbmNlZCBieSBAYSBfX3AuCisgICAgICAgKiAgSWYgYWRkaW5nIGNoYXJhY3RlciBjYXVzZXMgdGhlIGxlbmd0aCB0byBleGNlZWQgbWF4X3NpemUoKSwKKyAgICAgICAqICBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgSWYgQGEgX19wIGlzIGJleW9uZCBlbmQgb2Ygc3RyaW5nLAorICAgICAgICogIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0CisgICAgICAgKiAgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgX0NoYXJUIF9fYykKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX19wID49IF9NX2liZWdpbigpICYmIF9fcCA8PSBfTV9pZW5kKCkpOworCWNvbnN0IHNpemVfdHlwZSBfX3BvcyA9IF9fcCAtIF9NX2liZWdpbigpOworCV9NX3JlcGxhY2VfYXV4KF9fcG9zLCBzaXplX3R5cGUoMCksIHNpemVfdHlwZSgxKSwgX19jKTsKKwl0aGlzLT5fTV9zZXRfbGVha2VkKCk7CisJcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2RhdGEoKSArIF9fcG9zKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmUgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byByZW1vdmUgKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVtb3ZlIChkZWZhdWx0IHJlbWFpbmRlcikuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIF9fcG9zIGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoaXMKKyAgICAgICAqICBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgQGEgX19uIGNoYXJhY3RlcnMgZnJvbSB0aGlzIHN0cmluZyBzdGFydGluZyBhdCBAYQorICAgICAgICogIF9fcG9zLiAgVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlzIHJlZHVjZWQgYnkgQGEgX19uLiAgSWYKKyAgICAgICAqICB0aGVyZSBhcmUgPCBAYSBfX24gY2hhcmFjdGVycyB0byByZW1vdmUsIHRoZSByZW1haW5kZXIgb2YKKyAgICAgICAqICB0aGUgc3RyaW5nIGlzIHRydW5jYXRlZC4gIElmIEBhIF9fcCBpcyBiZXlvbmQgZW5kIG9mIHN0cmluZywKKyAgICAgICAqICBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndAorICAgICAgICogIGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBlcmFzZShzaXplX3R5cGUgX19wb3MgPSAwLCBzaXplX3R5cGUgX19uID0gbnBvcykKKyAgICAgIHsgCisJdGhpcy0+X01fZXJhc2UoX01fY2hlY2soX19wb3MsICJfX3ZlcnNhX3N0cmluZzo6ZXJhc2UiKSwKKwkJICAgICAgIF9NX2xpbWl0KF9fcG9zLCBfX24pKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIG9uZSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zaXRpb24gIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBjaGFyYWN0ZXIgdG8gcmVtb3ZlLgorICAgICAgICogIEByZXR1cm4gIGl0ZXJhdG9yIHJlZmVyZW5jaW5nIHNhbWUgbG9jYXRpb24gYWZ0ZXIgcmVtb3ZhbC4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVyIGF0IEBhIF9fcG9zaXRpb24gZnJvbSB0aGlzIHN0cmluZy4gVGhlCisgICAgICAgKiAgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9fcG9zaXRpb24gPj0gX01faWJlZ2luKCkKKwkJCQkgJiYgX19wb3NpdGlvbiA8IF9NX2llbmQoKSk7CisJY29uc3Qgc2l6ZV90eXBlIF9fcG9zID0gX19wb3NpdGlvbiAtIF9NX2liZWdpbigpOworCXRoaXMtPl9NX2VyYXNlKF9fcG9zLCBzaXplX3R5cGUoMSkpOworCXRoaXMtPl9NX3NldF9sZWFrZWQoKTsKKwlyZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fZGF0YSgpICsgX19wb3MpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBhIHJhbmdlIG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIF9fZmlyc3QgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gcmVtb3ZlLgorICAgICAgICogIEBwYXJhbSBfX2xhc3QgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBlbmQgb2YgdGhlIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGxvY2F0aW9uIG9mIGZpcnN0IGFmdGVyIHJlbW92YWwuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtmaXJzdCxsYXN0KSBmcm9tIHRoaXMKKyAgICAgICAqICBzdHJpbmcuICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvcgorICAgICAgICogIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfX2ZpcnN0ID49IF9NX2liZWdpbigpICYmIF9fZmlyc3QgPD0gX19sYXN0CisJCQkJICYmIF9fbGFzdCA8PSBfTV9pZW5kKCkpOworICAgICAgICBjb25zdCBzaXplX3R5cGUgX19wb3MgPSBfX2ZpcnN0IC0gX01faWJlZ2luKCk7CisJdGhpcy0+X01fZXJhc2UoX19wb3MsIF9fbGFzdCAtIF9fZmlyc3QpOworCXRoaXMtPl9NX3NldF9sZWFrZWQoKTsKKwlyZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fZGF0YSgpICsgX19wb3MpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmUgdGhlIGxhc3QgY2hhcmFjdGVyLgorICAgICAgICoKKyAgICAgICAqICBUaGUgc3RyaW5nIG11c3QgYmUgbm9uLWVtcHR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwb3BfYmFjaygpCisgICAgICB7IHRoaXMtPl9NX2VyYXNlKHNpemUoKS0xLCAxKTsgfQorI2VuZGlmIC8vIEMrKzExCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVwbGFjZSBjaGFyYWN0ZXJzIHdpdGggdmFsdWUgZnJvbSBhbm90aGVyIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlcGxhY2VkLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19wb3MgaXMgYmV5b25kIHRoZSBlbmQgb2YgdGhpcworICAgICAgICogIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW3Bvcyxwb3MrbikgZnJvbSB0aGlzCisgICAgICAgKiAgc3RyaW5nLiAgSW4gcGxhY2UsIHRoZSB2YWx1ZSBvZiBAYSBfX3N0ciBpcyBpbnNlcnRlZC4gIElmIEBhCisgICAgICAgKiAgX19wb3MgaXMgYmV5b25kIGVuZCBvZiBzdHJpbmcsIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uICBJZgorICAgICAgICogIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdCBleGNlZWRzIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcworICAgICAgICogIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yCisgICAgICAgKiAgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0cikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19wb3MsIF9fbiwgX19zdHIuX01fZGF0YSgpLCBfX3N0ci5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVwbGFjZSBjaGFyYWN0ZXJzIHdpdGggdmFsdWUgZnJvbSBhbm90aGVyIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MxICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19uMSAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVwbGFjZWQuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBTdHJpbmcgdG8gaW5zZXJ0LgorICAgICAgICogIEBwYXJhbSBfX3BvczIgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciBvZiBzdHIgdG8gdXNlLgorICAgICAgICogIEBwYXJhbSBfX24yICBOdW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHN0ciB0byB1c2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIF9fcG9zMSA+IHNpemUoKSBvciBAYSBfX3BvczIgPgorICAgICAgICogIHN0ci5zaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtwb3MxLHBvczEgKyBuKSBmcm9tCisgICAgICAgKiAgdGhpcyBzdHJpbmcuICBJbiBwbGFjZSwgdGhlIHZhbHVlIG9mIEBhIF9fc3RyIGlzIGluc2VydGVkLgorICAgICAgICogIElmIEBhIF9fcG9zIGlzIGJleW9uZCBlbmQgb2Ygc3RyaW5nLCBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLgorICAgICAgICogIElmIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdCBleGNlZWRzIG1heF9zaXplKCksIGxlbmd0aF9lcnJvcgorICAgICAgICogIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuCisgICAgICAgKiAgZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgcmVwbGFjZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyLAorCSAgICAgIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKQorICAgICAgeworCXJldHVybiB0aGlzLT5yZXBsYWNlKF9fcG9zMSwgX19uMSwgX19zdHIuX01fZGF0YSgpCisJCQkgICAgICsgX19zdHIuX01fY2hlY2soX19wb3MyLAorCQkJCQkgICAgICAiX192ZXJzYV9zdHJpbmc6OnJlcGxhY2UiKSwKKwkJCSAgICAgX19zdHIuX01fbGltaXQoX19wb3MyLCBfX24yKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVwbGFjZSBjaGFyYWN0ZXJzIHdpdGggdmFsdWUgb2YgYSBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX24xICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZXBsYWNlZC4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyB0byBpbnNlcnQuCisgICAgICAgKiAgQHBhcmFtIF9fbjIgIE51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gQGEgX19zIHRvIHVzZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19wb3MxID4gc2l6ZSgpLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbcG9zLHBvcyArIG4xKSBmcm9tIHRoaXMKKyAgICAgICAqICBzdHJpbmcuICBJbiBwbGFjZSwgdGhlIGZpcnN0IEBhIF9fbjIgY2hhcmFjdGVycyBvZiBAYSBfX3MKKyAgICAgICAqICBhcmUgaW5zZXJ0ZWQsIG9yIGFsbCBvZiBAYSBfX3MgaWYgQGEgX19uMiBpcyB0b28gbGFyZ2UuICBJZgorICAgICAgICogIEBhIF9fcG9zIGlzIGJleW9uZCBlbmQgb2Ygc3RyaW5nLCBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLgorICAgICAgICogIElmIHRoZSBsZW5ndGggb2YgcmVzdWx0IGV4Y2VlZHMgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzCisgICAgICAgKiAgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IKKyAgICAgICAqICBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLAorCSAgICAgIHNpemVfdHlwZSBfX24yKQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uMik7CisJcmV0dXJuIF9NX3JlcGxhY2UoX01fY2hlY2soX19wb3MsICJfX3ZlcnNhX3N0cmluZzo6cmVwbGFjZSIpLAorCQkJICBfTV9saW1pdChfX3BvcywgX19uMSksIF9fcywgX19uMik7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVwbGFjZSBjaGFyYWN0ZXJzIHdpdGggdmFsdWUgb2YgYSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX24xICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZXBsYWNlZC4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIF9fcG9zID4gc2l6ZSgpLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbcG9zLHBvcyArIG4xKSBmcm9tIHRoaXMKKyAgICAgICAqICBzdHJpbmcuICBJbiBwbGFjZSwgdGhlIGNoYXJhY3RlcnMgb2YgQGEgX19zIGFyZSBpbnNlcnRlZC4gIElmCisgICAgICAgKiAgQGEgcG9zIGlzIGJleW9uZCBlbmQgb2Ygc3RyaW5nLCBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLiAgSWYKKyAgICAgICAqICB0aGUgbGVuZ3RoIG9mIHJlc3VsdCBleGNlZWRzIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICAKKyAgICAgICAqICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zKQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKwlyZXR1cm4gdGhpcy0+cmVwbGFjZShfX3BvcywgX19uMSwgX19zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgY2hhcmFjdGVycyB3aXRoIG11bHRpcGxlIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19uMSAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVwbGFjZWQuCisgICAgICAgKiAgQHBhcmFtIF9fbjIgIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gX19jICBDaGFyYWN0ZXIgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBfX3BvcyA+IHNpemUoKS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW3Bvcyxwb3MgKyBuMSkgZnJvbSB0aGlzCisgICAgICAgKiAgc3RyaW5nLiAgSW4gcGxhY2UsIEBhIF9fbjIgY29waWVzIG9mIEBhIF9fYyBhcmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgSWYgQGEgX19wb3MgaXMgYmV5b25kIGVuZCBvZiBzdHJpbmcsIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uCisgICAgICAgKiAgSWYgdGhlIGxlbmd0aCBvZiByZXN1bHQgZXhjZWVkcyBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMKKyAgICAgICAqICB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvcgorICAgICAgICogIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgc2l6ZV90eXBlIF9fbjIsIF9DaGFyVCBfX2MpCisgICAgICB7IHJldHVybiBfTV9yZXBsYWNlX2F1eChfTV9jaGVjayhfX3BvcywgIl9fdmVyc2Ffc3RyaW5nOjpyZXBsYWNlIiksCisJCQkgICAgICBfTV9saW1pdChfX3BvcywgX19uMSksIF9fbjIsIF9fYyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIHJhbmdlIG9mIGNoYXJhY3RlcnMgd2l0aCBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9faTEgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHN0YXJ0IG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9faTIgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGVuZCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIHZhbHVlIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtpMSxpMikuICBJbiBwbGFjZSwgdGhlCisgICAgICAgKiAgdmFsdWUgb2YgQGEgX19zdHIgaXMgaW5zZXJ0ZWQuICBJZiB0aGUgbGVuZ3RoIG9mIHJlc3VsdAorICAgICAgICogIGV4Y2VlZHMgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZgorICAgICAgICogIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIpCisgICAgICB7IHJldHVybiB0aGlzLT5yZXBsYWNlKF9faTEsIF9faTIsIF9fc3RyLl9NX2RhdGEoKSwgX19zdHIuc2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgcmFuZ2Ugb2YgY2hhcmFjdGVycyB3aXRoIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX2kxICBJdGVyYXRvciByZWZlcmVuY2luZyBzdGFydCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX2kyICBJdGVyYXRvciByZWZlcmVuY2luZyBlbmQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyB2YWx1ZSB0byBpbnNlcnQuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBzIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtpMSxpMikuICBJbiBwbGFjZSwgdGhlCisgICAgICAgKiAgZmlyc3QgQGEgbiBjaGFyYWN0ZXJzIG9mIEBhIF9fcyBhcmUgaW5zZXJ0ZWQuICBJZiB0aGUgbGVuZ3RoCisgICAgICAgKiAgb2YgcmVzdWx0IGV4Y2VlZHMgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZQorICAgICAgICogIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX01faWJlZ2luKCkgPD0gX19pMSAmJiBfX2kxIDw9IF9faTIKKwkJCQkgJiYgX19pMiA8PSBfTV9pZW5kKCkpOworCXJldHVybiB0aGlzLT5yZXBsYWNlKF9faTEgLSBfTV9pYmVnaW4oKSwgX19pMiAtIF9faTEsIF9fcywgX19uKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIHJhbmdlIG9mIGNoYXJhY3RlcnMgd2l0aCBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19pMSAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgc3RhcnQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19pMiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgZW5kIG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgdmFsdWUgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW2kxLGkyKS4gIEluIHBsYWNlLCB0aGUKKyAgICAgICAqICBjaGFyYWN0ZXJzIG9mIEBhIF9fcyBhcmUgaW5zZXJ0ZWQuICBJZiB0aGUgbGVuZ3RoIG9mIHJlc3VsdAorICAgICAgICogIGV4Y2VlZHMgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZgorICAgICAgICogIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBjb25zdCBfQ2hhclQqIF9fcykKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19pMSwgX19pMiwgX19zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgcmFuZ2Ugb2YgY2hhcmFjdGVycyB3aXRoIG11bHRpcGxlIGNoYXJhY3RlcnMKKyAgICAgICAqICBAcGFyYW0gX19pMSAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgc3RhcnQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19pMiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgZW5kIG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gaW5zZXJ0LgorICAgICAgICogIEBwYXJhbSBfX2MgIENoYXJhY3RlciB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbaTEsaTIpLiAgSW4gcGxhY2UsIEBhCisgICAgICAgKiAgX19uIGNvcGllcyBvZiBAYSBfX2MgYXJlIGluc2VydGVkLiAgSWYgdGhlIGxlbmd0aCBvZiByZXN1bHQKKyAgICAgICAqICBleGNlZWRzIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YKKyAgICAgICAqICB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX01faWJlZ2luKCkgPD0gX19pMSAmJiBfX2kxIDw9IF9faTIKKwkJCQkgJiYgX19pMiA8PSBfTV9pZW5kKCkpOworCXJldHVybiBfTV9yZXBsYWNlX2F1eChfX2kxIC0gX01faWJlZ2luKCksIF9faTIgLSBfX2kxLCBfX24sIF9fYyk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVwbGFjZSByYW5nZSBvZiBjaGFyYWN0ZXJzIHdpdGggcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIF9faTEgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHN0YXJ0IG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9faTIgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGVuZCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX2sxICBJdGVyYXRvciByZWZlcmVuY2luZyBzdGFydCBvZiByYW5nZSB0byBpbnNlcnQuCisgICAgICAgKiAgQHBhcmFtIF9fazIgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGVuZCBvZiByYW5nZSB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbaTEsaTIpLiAgSW4gcGxhY2UsCisgICAgICAgKiAgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW2sxLGsyKSBhcmUgaW5zZXJ0ZWQuICBJZiB0aGUgbGVuZ3RoCisgICAgICAgKiAgb2YgcmVzdWx0IGV4Y2VlZHMgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZQorICAgICAgICogIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyAgICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwKKwkJX0lucHV0SXRlcmF0b3IgX19rMSwgX0lucHV0SXRlcmF0b3IgX19rMikKKyAgICAgICAgeworCSAgX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9NX2liZWdpbigpIDw9IF9faTEgJiYgX19pMSA8PSBfX2kyCisJCQkJICAgJiYgX19pMiA8PSBfTV9pZW5kKCkpOworCSAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fazEsIF9fazIpOworCSAgcmV0dXJuIHRoaXMtPl9NX3JlcGxhY2VfZGlzcGF0Y2goX19pMSwgX19pMiwgX19rMSwgX19rMiwKKwkJCQkJICAgc3RkOjpfX2ZhbHNlX3R5cGUoKSk7CisJfQorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLAorCQlfSW5wdXRJdGVyYXRvciBfX2sxLCBfSW5wdXRJdGVyYXRvciBfX2syKQorICAgICAgICB7CisJICBfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX01faWJlZ2luKCkgPD0gX19pMSAmJiBfX2kxIDw9IF9faTIKKwkJCQkgICAmJiBfX2kyIDw9IF9NX2llbmQoKSk7CisJICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19rMSwgX19rMik7CisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19pc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9yPjo6X190eXBlIF9JbnRlZ3JhbDsKKwkgIHJldHVybiB0aGlzLT5fTV9yZXBsYWNlX2Rpc3BhdGNoKF9faTEsIF9faTIsIF9fazEsIF9fazIsIF9JbnRlZ3JhbCgpKTsKKwl9CisjZW5kaWYKKworICAgICAgLy8gU3BlY2lhbGl6YXRpb25zIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgcG9pbnRlciBhbmQgaXRlcmF0b3I6CisgICAgICAvLyB1c2VmdWwgdG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mIHRlbXBvcmFyeSBidWZmZXJpbmcgaW4gX01fcmVwbGFjZS4KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBfQ2hhclQqIF9fazEsIF9DaGFyVCogX19rMikKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX01faWJlZ2luKCkgPD0gX19pMSAmJiBfX2kxIDw9IF9faTIKKwkJCQkgJiYgX19pMiA8PSBfTV9pZW5kKCkpOworCV9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2sxLCBfX2syKTsKKwlyZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kxIC0gX01faWJlZ2luKCksIF9faTIgLSBfX2kxLAorCQkJICAgICBfX2sxLCBfX2syIC0gX19rMSk7CisgICAgICB9CisKKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19rMSwgY29uc3QgX0NoYXJUKiBfX2syKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfTV9pYmVnaW4oKSA8PSBfX2kxICYmIF9faTEgPD0gX19pMgorCQkJCSAmJiBfX2kyIDw9IF9NX2llbmQoKSk7CisJX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fazEsIF9fazIpOworCXJldHVybiB0aGlzLT5yZXBsYWNlKF9faTEgLSBfTV9pYmVnaW4oKSwgX19pMiAtIF9faTEsCisJCQkgICAgIF9fazEsIF9fazIgLSBfX2sxKTsKKyAgICAgIH0KKworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIGl0ZXJhdG9yIF9fazEsIGl0ZXJhdG9yIF9fazIpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9NX2liZWdpbigpIDw9IF9faTEgJiYgX19pMSA8PSBfX2kyCisJCQkJICYmIF9faTIgPD0gX01faWVuZCgpKTsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19rMSwgX19rMik7CisJcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19pMSAtIF9NX2liZWdpbigpLCBfX2kyIC0gX19pMSwKKwkJCSAgICAgX19rMS5iYXNlKCksIF9fazIgLSBfX2sxKTsKKyAgICAgIH0KKworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsCisJICAgICAgY29uc3RfaXRlcmF0b3IgX19rMSwgY29uc3RfaXRlcmF0b3IgX19rMikKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX01faWJlZ2luKCkgPD0gX19pMSAmJiBfX2kxIDw9IF9faTIKKwkJCQkgJiYgX19pMiA8PSBfTV9pZW5kKCkpOworCV9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2sxLCBfX2syKTsKKwlyZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kxIC0gX01faWJlZ2luKCksIF9faTIgLSBfX2kxLAorCQkJICAgICBfX2sxLmJhc2UoKSwgX19rMiAtIF9fazEpOworICAgICAgfQorICAgICAgCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIHJhbmdlIG9mIGNoYXJhY3RlcnMgd2l0aCBpbml0aWFsaXplcl9saXN0LgorICAgICAgICogIEBwYXJhbSBfX2kxICBJdGVyYXRvciByZWZlcmVuY2luZyBzdGFydCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX2kyICBJdGVyYXRvciByZWZlcmVuY2luZyBlbmQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19sICBUaGUgaW5pdGlhbGl6ZXJfbGlzdCBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtpMSxpMikuICBJbiBwbGFjZSwKKyAgICAgICAqICBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbazEsazIpIGFyZSBpbnNlcnRlZC4gIElmIHRoZSBsZW5ndGgKKyAgICAgICAqICBvZiByZXN1bHQgZXhjZWVkcyBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgVGhlCisgICAgICAgKiAgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwKKwkJCSAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19pMSwgX19pMiwgX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZiAvLyBDKysxMQorCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnRlZ2VyPgorCV9fdmVyc2Ffc3RyaW5nJgorCV9NX3JlcGxhY2VfZGlzcGF0Y2goaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgX0ludGVnZXIgX19uLAorCQkJICAgIF9JbnRlZ2VyIF9fdmFsLCBzdGQ6Ol9fdHJ1ZV90eXBlKQorICAgICAgICB7IHJldHVybiBfTV9yZXBsYWNlX2F1eChfX2kxIC0gX01faWJlZ2luKCksIF9faTIgLSBfX2kxLCBfX24sIF9fdmFsKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKwlfX3ZlcnNhX3N0cmluZyYKKwlfTV9yZXBsYWNlX2Rpc3BhdGNoKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIF9JbnB1dEl0ZXJhdG9yIF9fazEsCisJCQkgICAgX0lucHV0SXRlcmF0b3IgX19rMiwgc3RkOjpfX2ZhbHNlX3R5cGUpOworCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIF9NX3JlcGxhY2VfYXV4KHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBzaXplX3R5cGUgX19uMiwKKwkJICAgICBfQ2hhclQgX19jKTsKKworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBfTV9yZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbGVuMSwgY29uc3QgX0NoYXJUKiBfX3MsCisJCSBjb25zdCBzaXplX3R5cGUgX19sZW4yKTsKKworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBfTV9hcHBlbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pOworCisgICAgcHVibGljOgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvcHkgc3Vic3RyaW5nIGludG8gQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgdG8gY29weSB2YWx1ZSBpbnRvLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvcHkuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gY29weS4KKyAgICAgICAqICBAcmV0dXJuICBOdW1iZXIgb2YgY2hhcmFjdGVycyBhY3R1YWxseSBjb3BpZWQKKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBwb3MgPiBzaXplKCkuCisgICAgICAgKgorICAgICAgICogIENvcGllcyB1cCB0byBAYSBfX24gY2hhcmFjdGVycyBzdGFydGluZyBhdCBAYSBfX3BvcyBpbnRvIHRoZQorICAgICAgICogIEMgc3RyaW5nIEBhIHMuICBJZiBAYSBfX3BvcyBpcyBncmVhdGVyIHRoYW4gc2l6ZSgpLAorICAgICAgICogIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3B5KF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTd2FwIGNvbnRlbnRzIHdpdGggYW5vdGhlciBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgU3RyaW5nIHRvIHN3YXAgd2l0aC4KKyAgICAgICAqCisgICAgICAgKiAgRXhjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiB0aGlzIHN0cmluZyB3aXRoIHRoYXQgb2YgQGEgX19zIGluCisgICAgICAgKiAgY29uc3RhbnQgdGltZS4KKyAgICAgICovCisgICAgICB2b2lkCisgICAgICBzd2FwKF9fdmVyc2Ffc3RyaW5nJiBfX3MpCisgICAgICB7IHRoaXMtPl9NX3N3YXAoX19zKTsgfQorCisgICAgICAvLyBTdHJpbmcgb3BlcmF0aW9uczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGNvbnN0IHBvaW50ZXIgdG8gbnVsbC10ZXJtaW5hdGVkIGNvbnRlbnRzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgaGFuZGxlIHRvIGludGVybmFsIGRhdGEuICBEbyBub3QgbW9kaWZ5IG9yIGRpcmUgdGhpbmdzIG1heQorICAgICAgICogIGhhcHBlbi4KKyAgICAgICovCisgICAgICBjb25zdCBfQ2hhclQqCisgICAgICBjX3N0cigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5fTV9kYXRhKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gY29uc3QgcG9pbnRlciB0byBjb250ZW50cy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIGhhbmRsZSB0byBpbnRlcm5hbCBkYXRhLiAgRG8gbm90IG1vZGlmeSBvciBkaXJlIHRoaW5ncyBtYXkKKyAgICAgICAqICBoYXBwZW4uCisgICAgICAqLworICAgICAgY29uc3QgX0NoYXJUKgorICAgICAgZGF0YSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5fTV9kYXRhKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gY29weSBvZiBhbGxvY2F0b3IgdXNlZCB0byBjb25zdHJ1Y3QgdGhpcyBzdHJpbmcuCisgICAgICAqLworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gYWxsb2NhdG9yX3R5cGUodGhpcy0+X01fZ2V0X2FsbG9jYXRvcigpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20uCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBAYSBfX3MgdG8gc2VhcmNoIGZvci4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBzdGFydCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBmb3J3YXJkIGZvciB0aGUgZmlyc3QgQGEKKyAgICAgICAqICBfX24gY2hhcmFjdGVycyBpbiBAYSBfX3Mgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsCisgICAgICAgKiAgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgYmVnaW5zLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zCisgICAgICAgKiAgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20gKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2Ygc3RhcnQgb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3IgdmFsdWUgb2YgQGEKKyAgICAgICAqICBfX3N0ciB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUKKyAgICAgICAqICBpdCBiZWdpbnMuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmQoY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorCV9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5maW5kKF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIHN0YXJ0IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIHRoZSB2YWx1ZSBvZiBAYQorICAgICAgICogIF9fcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUKKyAgICAgICAqICBpdCBiZWdpbnMuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiB0aGlzLT5maW5kKF9fcywgX19wb3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gX19jICBDaGFyYWN0ZXIgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIEBhIF9fYyB3aXRoaW4KKyAgICAgICAqICB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMKKyAgICAgICAqICBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBTdHJpbmcgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20gKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBzdGFydCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciB2YWx1ZSBvZiBAYQorICAgICAgICogIF9fc3RyIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZQorICAgICAgICogIGl0IGJlZ2lucy4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgcmZpbmQoY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorCV9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5yZmluZChfX3N0ci5kYXRhKCksIF9fcG9zLCBfX3N0ci5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20uCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBzIHRvIHNlYXJjaCBmb3IuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2Ygc3RhcnQgb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgdGhlIGZpcnN0IEBhCisgICAgICAgKiAgX19uIGNoYXJhY3RlcnMgaW4gQGEgX19zIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLAorICAgICAgICogIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IGJlZ2lucy4gIElmIG5vdCBmb3VuZCwgcmV0dXJucworICAgICAgICogIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICByZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc3RhcnQgc2VhcmNoIGF0IChkZWZhdWx0IGVuZCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2Ygc3RhcnQgb2YgIGxhc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIHRoZSB2YWx1ZSBvZgorICAgICAgICogIEBhIF9fcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXgKKyAgICAgICAqICB3aGVyZSBpdCBiZWdpbnMuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKwlyZXR1cm4gdGhpcy0+cmZpbmQoX19zLCBfX3BvcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgQ2hhcmFjdGVyIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggYmFjayBmcm9tIChkZWZhdWx0IGVuZCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgQGEgX19jIHdpdGhpbgorICAgICAgICogIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcworICAgICAgICogIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICByZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG9mIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIG9uZSBvZiB0aGUgY2hhcmFjdGVycyBvZgorICAgICAgICogIEBhIF9fc3RyIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMKKyAgICAgICAqICBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9maXJzdF9vZihjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisJX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmZpbmRfZmlyc3Rfb2YoX19zdHIuZGF0YSgpLCBfX3BvcywgX19zdHIuc2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgb2YgQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgU3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20uCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBzIHRvIHNlYXJjaCBmb3IuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3Igb25lIG9mIHRoZQorICAgICAgICogIGZpcnN0IEBhIF9fbiBjaGFyYWN0ZXJzIG9mIEBhIF9fcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZgorICAgICAgICogIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsCisgICAgICAgKiAgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG9mIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIFN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIG9uZSBvZiB0aGUKKyAgICAgICAqICBjaGFyYWN0ZXJzIG9mIEBhIF9fcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucworICAgICAgICogIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfZmlyc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiB0aGlzLT5maW5kX2ZpcnN0X29mKF9fcywgX19wb3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gX19jICBDaGFyYWN0ZXIgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIHRoZSBjaGFyYWN0ZXIKKyAgICAgICAqICBAYSBfX2Mgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4CisgICAgICAgKiAgd2hlcmUgaXQgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IGVxdWl2YWxlbnQgdG8gZmluZChjLCBwb3MpLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9maXJzdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+ZmluZChfX2MsIF9fcG9zKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIGNoYXJhY3RlciBvZiBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBTdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggYmFjayBmcm9tIChkZWZhdWx0IGVuZCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3Igb25lIG9mIHRoZQorICAgICAgICogIGNoYXJhY3RlcnMgb2YgQGEgX19zdHIgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsCisgICAgICAgKiAgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zCisgICAgICAgKiAgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfbGFzdF9vZihjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CisJX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmZpbmRfbGFzdF9vZihfX3N0ci5kYXRhKCksIF9fcG9zLCBfX3N0ci5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG9mIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbS4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHMgdG8gc2VhcmNoIGZvci4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciBvbmUgb2YgdGhlCisgICAgICAgKiAgZmlyc3QgQGEgX19uIGNoYXJhY3RlcnMgb2YgQGEgX19zIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmCisgICAgICAgKiAgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwKKyAgICAgICAqICByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2xhc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG9mIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbSAoZGVmYXVsdCBlbmQpLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGxhc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIG9uZSBvZiB0aGUKKyAgICAgICAqICBjaGFyYWN0ZXJzIG9mIEBhIF9fcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucworICAgICAgICogIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfbGFzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPmZpbmRfbGFzdF9vZihfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gX19jICBDaGFyYWN0ZXIgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20gKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciBAYSBfX2Mgd2l0aGluCisgICAgICAgKiAgdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgd2FzCisgICAgICAgKiAgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogZXF1aXZhbGVudCB0byByZmluZChjLCBwb3MpLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9sYXN0X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5yZmluZChfX2MsIF9fcG9zKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgbm90IGluIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gYXZvaWQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20gKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3IgYSBjaGFyYWN0ZXIgbm90CisgICAgICAgKiAgY29udGFpbmVkIGluIEBhIF9fc3RyIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zCisgICAgICAgKiAgdGhlIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorCV9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiB0aGlzLT5maW5kX2ZpcnN0X25vdF9vZihfX3N0ci5kYXRhKCksIF9fcG9zLCBfX3N0ci5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIGNoYXJhY3RlciBub3QgaW4gQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGF2b2lkLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gcyB0byBjb25zaWRlci4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBmb3J3YXJkIGZvciBhIGNoYXJhY3RlciBub3QKKyAgICAgICAqICBjb250YWluZWQgaW4gdGhlIGZpcnN0IEBhIF9fbiBjaGFyYWN0ZXJzIG9mIEBhIF9fcyB3aXRoaW4KKyAgICAgICAqICB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMKKyAgICAgICAqICBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcywKKwkJCXNpemVfdHlwZSBfX24pIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgbm90IGluIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBhdm9pZC4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggZnJvbSAoZGVmYXVsdCAwKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBmb3J3YXJkIGZvciBhIGNoYXJhY3RlciBub3QKKyAgICAgICAqICBjb250YWluZWQgaW4gQGEgX19zIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zCisgICAgICAgKiAgdGhlIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9maXJzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiB0aGlzLT5maW5kX2ZpcnN0X25vdF9vZihfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBkaWZmZXJlbnQgY2hhcmFjdGVyLgorICAgICAgICogIEBwYXJhbSBfX2MgIENoYXJhY3RlciB0byBhdm9pZC4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggZnJvbSAoZGVmYXVsdCAwKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBmb3J3YXJkIGZvciBhIGNoYXJhY3RlcgorICAgICAgICogIG90aGVyIHRoYW4gQGEgX19jIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZQorICAgICAgICogIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9maXJzdF9ub3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKwlfR0xJQkNYWF9OT0VYQ0VQVDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgbm90IGluIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gYXZvaWQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbSAoZGVmYXVsdCBlbmQpLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGxhc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIGEgY2hhcmFjdGVyCisgICAgICAgKiAgbm90IGNvbnRhaW5lZCBpbiBAYSBfX3N0ciB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwKKyAgICAgICAqICByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMKKyAgICAgICAqICBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9sYXN0X25vdF9vZihjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIsCisJCSAgICAgICBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gdGhpcy0+ZmluZF9sYXN0X25vdF9vZihfX3N0ci5kYXRhKCksIF9fcG9zLCBfX3N0ci5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG5vdCBpbiBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gYXZvaWQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbS4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHMgdG8gY29uc2lkZXIuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgYSBjaGFyYWN0ZXIKKyAgICAgICAqICBub3QgY29udGFpbmVkIGluIHRoZSBmaXJzdCBAYSBfX24gY2hhcmFjdGVycyBvZiBAYSBfX3MKKyAgICAgICAqICB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQKKyAgICAgICAqICB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcywKKwkJICAgICAgIHNpemVfdHlwZSBfX24pIGNvbnN0OworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgbm90IGluIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBhdm9pZC4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggYmFjayBmcm9tIChkZWZhdWx0IGVuZCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgYSBjaGFyYWN0ZXIKKyAgICAgICAqICBub3QgY29udGFpbmVkIGluIEBhIF9fcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwKKyAgICAgICAqICByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMKKyAgICAgICAqICBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9sYXN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPmZpbmRfbGFzdF9ub3Rfb2YoX19zLCBfX3BvcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBkaWZmZXJlbnQgY2hhcmFjdGVyLgorICAgICAgICogIEBwYXJhbSBfX2MgIENoYXJhY3RlciB0byBhdm9pZC4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggYmFjayBmcm9tIChkZWZhdWx0IGVuZCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgYSBjaGFyYWN0ZXIKKyAgICAgICAqICBvdGhlciB0aGFuIEBhIF9fYyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUKKyAgICAgICAqICBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfbGFzdF9ub3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKKwlfR0xJQkNYWF9OT0VYQ0VQVDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBHZXQgYSBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gc3Vic3RyaW5nIChkZWZhdWx0IHJlbWFpbmRlcikuCisgICAgICAgKiAgQHJldHVybiAgVGhlIG5ldyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgcG9zID4gc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBDb25zdHJ1Y3QgYW5kIHJldHVybiBhIG5ldyBzdHJpbmcgdXNpbmcgdGhlIEBhIF9fbgorICAgICAgICogIGNoYXJhY3RlcnMgc3RhcnRpbmcgYXQgQGEgX19wb3MuICBJZiB0aGUgc3RyaW5nIGlzIHRvbworICAgICAgICogIHNob3J0LCB1c2UgdGhlIHJlbWFpbmRlciBvZiB0aGUgY2hhcmFjdGVycy4gIElmIEBhIF9fcG9zIGlzCisgICAgICAgKiAgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHN0cmluZywgb3V0X29mX3JhbmdlIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZworICAgICAgc3Vic3RyKHNpemVfdHlwZSBfX3BvcyA9IDAsIHNpemVfdHlwZSBfX24gPSBucG9zKSBjb25zdAorICAgICAgeworCXJldHVybiBfX3ZlcnNhX3N0cmluZygqdGhpcywgX01fY2hlY2soX19wb3MsICJfX3ZlcnNhX3N0cmluZzo6c3Vic3RyIiksCisJCQkgICAgICBfX24pOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbXBhcmUgdG8gYSBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBTdHJpbmcgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEByZXR1cm4gIEludGVnZXIgPCAwLCAwLCBvciA+IDAuCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgYW4gaW50ZWdlciA8IDAgaWYgdGhpcyBzdHJpbmcgaXMgb3JkZXJlZCBiZWZvcmUgQGEKKyAgICAgICAqICBfX3N0ciwgMCBpZiB0aGVpciB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIG9yID4gMCBpZiB0aGlzCisgICAgICAgKiAgc3RyaW5nIGlzIG9yZGVyZWQgYWZ0ZXIgQGEgX19zdHIuICBEZXRlcm1pbmVzIHRoZSBlZmZlY3RpdmUKKyAgICAgICAqICBsZW5ndGggcmxlbiBvZiB0aGUgc3RyaW5ncyB0byBjb21wYXJlIGFzIHRoZSBzbWFsbGVzdCBvZgorICAgICAgICogIHNpemUoKSBhbmQgc3RyLnNpemUoKS4gIFRoZSBmdW5jdGlvbiB0aGVuIGNvbXBhcmVzIHRoZSB0d28KKyAgICAgICAqICBzdHJpbmdzIGJ5IGNhbGxpbmcgdHJhaXRzOjpjb21wYXJlKGRhdGEoKSwgc3RyLmRhdGEoKSxybGVuKS4KKyAgICAgICAqICBJZiB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGlzIG5vbnplcm8gcmV0dXJucyBpdCwKKyAgICAgICAqICBvdGhlcndpc2UgdGhlIHNob3J0ZXIgb25lIGlzIG9yZGVyZWQgZmlyc3QuCisgICAgICAqLworICAgICAgaW50CisgICAgICBjb21wYXJlKGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0cikgY29uc3QKKyAgICAgIHsKKwlpZiAodGhpcy0+X01fY29tcGFyZShfX3N0cikpCisJICByZXR1cm4gMDsKKworCWNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisJY29uc3Qgc2l6ZV90eXBlIF9fb3NpemUgPSBfX3N0ci5zaXplKCk7CisJY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc3RkOjptaW4oX19zaXplLCBfX29zaXplKTsKKworCWludCBfX3IgPSB0cmFpdHNfdHlwZTo6Y29tcGFyZSh0aGlzLT5fTV9kYXRhKCksIF9fc3RyLmRhdGEoKSwgX19sZW4pOworCWlmICghX19yKQorCSAgX19yID0gdGhpcy0+X1NfY29tcGFyZShfX3NpemUsIF9fb3NpemUpOworCXJldHVybiBfX3I7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29tcGFyZSBzdWJzdHJpbmcgdG8gYSBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgb2Ygc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHJldHVybiAgSW50ZWdlciA8IDAsIDAsIG9yID4gMC4KKyAgICAgICAqCisgICAgICAgKiAgRm9ybSB0aGUgc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIGZyb20gdGhlIEBhIF9fbiBjaGFyYWN0ZXJzCisgICAgICAgKiAgc3RhcnRpbmcgYXQgQGEgX19wb3MuICBSZXR1cm5zIGFuIGludGVnZXIgPCAwIGlmIHRoZQorICAgICAgICogIHN1YnN0cmluZyBpcyBvcmRlcmVkIGJlZm9yZSBAYSBfX3N0ciwgMCBpZiB0aGVpciB2YWx1ZXMgYXJlCisgICAgICAgKiAgZXF1aXZhbGVudCwgb3IgPiAwIGlmIHRoZSBzdWJzdHJpbmcgaXMgb3JkZXJlZCBhZnRlciBAYQorICAgICAgICogIF9fc3RyLiAgRGV0ZXJtaW5lcyB0aGUgZWZmZWN0aXZlIGxlbmd0aCBybGVuIG9mIHRoZSBzdHJpbmdzCisgICAgICAgKiAgdG8gY29tcGFyZSBhcyB0aGUgc21hbGxlc3Qgb2YgdGhlIGxlbmd0aCBvZiB0aGUgc3Vic3RyaW5nCisgICAgICAgKiAgYW5kIEBhIF9fc3RyLnNpemUoKS4gIFRoZSBmdW5jdGlvbiB0aGVuIGNvbXBhcmVzIHRoZSB0d28KKyAgICAgICAqICBzdHJpbmdzIGJ5IGNhbGxpbmcKKyAgICAgICAqICB0cmFpdHM6OmNvbXBhcmUoc3Vic3RyaW5nLmRhdGEoKSxzdHIuZGF0YSgpLHJsZW4pLiAgSWYgdGhlCisgICAgICAgKiAgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGlzIG5vbnplcm8gcmV0dXJucyBpdCwgb3RoZXJ3aXNlCisgICAgICAgKiAgdGhlIHNob3J0ZXIgb25lIGlzIG9yZGVyZWQgZmlyc3QuCisgICAgICAqLworICAgICAgaW50CisgICAgICBjb21wYXJlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwKKwkgICAgICBjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbXBhcmUgc3Vic3RyaW5nIHRvIGEgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3BvczEgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciBvZiBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fbjEgIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zMiAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIG9mIHN1YnN0cmluZyBvZiBzdHIuCisgICAgICAgKiAgQHBhcmFtIF9fbjIgIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHN1YnN0cmluZyBvZiBzdHIuCisgICAgICAgKiAgQHJldHVybiAgSW50ZWdlciA8IDAsIDAsIG9yID4gMC4KKyAgICAgICAqCisgICAgICAgKiAgRm9ybSB0aGUgc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIGZyb20gdGhlIEBhIF9fbjEKKyAgICAgICAqICBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IEBhIF9fcG9zMS4gIEZvcm0gdGhlIHN1YnN0cmluZyBvZiBAYQorICAgICAgICogIF9fc3RyIGZyb20gdGhlIEBhIF9fbjIgY2hhcmFjdGVycyBzdGFydGluZyBhdCBAYSBfX3BvczIuCisgICAgICAgKiAgUmV0dXJucyBhbiBpbnRlZ2VyIDwgMCBpZiB0aGlzIHN1YnN0cmluZyBpcyBvcmRlcmVkIGJlZm9yZQorICAgICAgICogIHRoZSBzdWJzdHJpbmcgb2YgQGEgX19zdHIsIDAgaWYgdGhlaXIgdmFsdWVzIGFyZSBlcXVpdmFsZW50LAorICAgICAgICogIG9yID4gMCBpZiB0aGlzIHN1YnN0cmluZyBpcyBvcmRlcmVkIGFmdGVyIHRoZSBzdWJzdHJpbmcgb2YKKyAgICAgICAqICBAYSBfX3N0ci4gIERldGVybWluZXMgdGhlIGVmZmVjdGl2ZSBsZW5ndGggcmxlbiBvZiB0aGUKKyAgICAgICAqICBzdHJpbmdzIHRvIGNvbXBhcmUgYXMgdGhlIHNtYWxsZXN0IG9mIHRoZSBsZW5ndGhzIG9mIHRoZQorICAgICAgICogIHN1YnN0cmluZ3MuICBUaGUgZnVuY3Rpb24gdGhlbiBjb21wYXJlcyB0aGUgdHdvIHN0cmluZ3MgYnkKKyAgICAgICAqICBjYWxsaW5nCisgICAgICAgKiAgdHJhaXRzOjpjb21wYXJlKHN1YnN0cmluZy5kYXRhKCksc3RyLnN1YnN0cihwb3MyLG4yKS5kYXRhKCkscmxlbikuCisgICAgICAgKiAgSWYgdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBpcyBub256ZXJvIHJldHVybnMgaXQsCisgICAgICAgKiAgb3RoZXJ3aXNlIHRoZSBzaG9ydGVyIG9uZSBpcyBvcmRlcmVkIGZpcnN0LgorICAgICAgKi8KKyAgICAgIGludAorICAgICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyLAorCSAgICAgIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb21wYXJlIHRvIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEByZXR1cm4gIEludGVnZXIgPCAwLCAwLCBvciA+IDAuCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgYW4gaW50ZWdlciA8IDAgaWYgdGhpcyBzdHJpbmcgaXMgb3JkZXJlZCBiZWZvcmUgQGEKKyAgICAgICAqICBfX3MsIDAgaWYgdGhlaXIgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBvciA+IDAgaWYgdGhpcyBzdHJpbmcKKyAgICAgICAqICBpcyBvcmRlcmVkIGFmdGVyIEBhIF9fcy4gIERldGVybWluZXMgdGhlIGVmZmVjdGl2ZSBsZW5ndGgKKyAgICAgICAqICBybGVuIG9mIHRoZSBzdHJpbmdzIHRvIGNvbXBhcmUgYXMgdGhlIHNtYWxsZXN0IG9mIHNpemUoKSBhbmQKKyAgICAgICAqICB0aGUgbGVuZ3RoIG9mIGEgc3RyaW5nIGNvbnN0cnVjdGVkIGZyb20gQGEgX19zLiAgVGhlCisgICAgICAgKiAgZnVuY3Rpb24gdGhlbiBjb21wYXJlcyB0aGUgdHdvIHN0cmluZ3MgYnkgY2FsbGluZworICAgICAgICogIHRyYWl0czo6Y29tcGFyZShkYXRhKCkscyxybGVuKS4gIElmIHRoZSByZXN1bHQgb2YgdGhlCisgICAgICAgKiAgY29tcGFyaXNvbiBpcyBub256ZXJvIHJldHVybnMgaXQsIG90aGVyd2lzZSB0aGUgc2hvcnRlciBvbmUKKyAgICAgICAqICBpcyBvcmRlcmVkIGZpcnN0LgorICAgICAgKi8KKyAgICAgIGludAorICAgICAgY29tcGFyZShjb25zdCBfQ2hhclQqIF9fcykgY29uc3Q7CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDUgU3RyaW5nOjpjb21wYXJlIHNwZWNpZmljYXRpb24gcXVlc3Rpb25hYmxlCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbXBhcmUgc3Vic3RyaW5nIHRvIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgb2Ygc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX24xICBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEByZXR1cm4gIEludGVnZXIgPCAwLCAwLCBvciA+IDAuCisgICAgICAgKgorICAgICAgICogIEZvcm0gdGhlIHN1YnN0cmluZyBvZiB0aGlzIHN0cmluZyBmcm9tIHRoZSBAYSBfX24xCisgICAgICAgKiAgY2hhcmFjdGVycyBzdGFydGluZyBhdCBAYSBfX3Bvcy4gIFJldHVybnMgYW4gaW50ZWdlciA8IDAgaWYKKyAgICAgICAqICB0aGUgc3Vic3RyaW5nIGlzIG9yZGVyZWQgYmVmb3JlIEBhIF9fcywgMCBpZiB0aGVpciB2YWx1ZXMKKyAgICAgICAqICBhcmUgZXF1aXZhbGVudCwgb3IgPiAwIGlmIHRoZSBzdWJzdHJpbmcgaXMgb3JkZXJlZCBhZnRlciBAYQorICAgICAgICogIF9fcy4gIERldGVybWluZXMgdGhlIGVmZmVjdGl2ZSBsZW5ndGggcmxlbiBvZiB0aGUgc3RyaW5ncyB0bworICAgICAgICogIGNvbXBhcmUgYXMgdGhlIHNtYWxsZXN0IG9mIHRoZSBsZW5ndGggb2YgdGhlIHN1YnN0cmluZyBhbmQKKyAgICAgICAqICB0aGUgbGVuZ3RoIG9mIGEgc3RyaW5nIGNvbnN0cnVjdGVkIGZyb20gQGEgX19zLiAgVGhlCisgICAgICAgKiAgZnVuY3Rpb24gdGhlbiBjb21wYXJlcyB0aGUgdHdvIHN0cmluZyBieSBjYWxsaW5nCisgICAgICAgKiAgdHJhaXRzOjpjb21wYXJlKHN1YnN0cmluZy5kYXRhKCkscyxybGVuKS4gIElmIHRoZSByZXN1bHQgb2YKKyAgICAgICAqICB0aGUgY29tcGFyaXNvbiBpcyBub256ZXJvIHJldHVybnMgaXQsIG90aGVyd2lzZSB0aGUgc2hvcnRlcgorICAgICAgICogIG9uZSBpcyBvcmRlcmVkIGZpcnN0LgorICAgICAgKi8KKyAgICAgIGludAorICAgICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcykgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29tcGFyZSBzdWJzdHJpbmcgYWdhaW5zdCBhIGNoYXJhY3RlciBhcnJheS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciBvZiBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fbjEgIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBjaGFyYWN0ZXIgYXJyYXkgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEBwYXJhbSBfX24yICBOdW1iZXIgb2YgY2hhcmFjdGVycyBvZiBzLgorICAgICAgICogIEByZXR1cm4gIEludGVnZXIgPCAwLCAwLCBvciA+IDAuCisgICAgICAgKgorICAgICAgICogIEZvcm0gdGhlIHN1YnN0cmluZyBvZiB0aGlzIHN0cmluZyBmcm9tIHRoZSBAYSBfX24xCisgICAgICAgKiAgY2hhcmFjdGVycyBzdGFydGluZyBhdCBAYSBfX3Bvcy4gIEZvcm0gYSBzdHJpbmcgZnJvbSB0aGUKKyAgICAgICAqICBmaXJzdCBAYSBfX24yIGNoYXJhY3RlcnMgb2YgQGEgX19zLiAgUmV0dXJucyBhbiBpbnRlZ2VyIDwgMAorICAgICAgICogIGlmIHRoaXMgc3Vic3RyaW5nIGlzIG9yZGVyZWQgYmVmb3JlIHRoZSBzdHJpbmcgZnJvbSBAYSBfX3MsCisgICAgICAgKiAgMCBpZiB0aGVpciB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIG9yID4gMCBpZiB0aGlzIHN1YnN0cmluZworICAgICAgICogIGlzIG9yZGVyZWQgYWZ0ZXIgdGhlIHN0cmluZyBmcm9tIEBhIF9fcy4gIERldGVybWluZXMgdGhlCisgICAgICAgKiAgZWZmZWN0aXZlIGxlbmd0aCBybGVuIG9mIHRoZSBzdHJpbmdzIHRvIGNvbXBhcmUgYXMgdGhlCisgICAgICAgKiAgc21hbGxlc3Qgb2YgdGhlIGxlbmd0aCBvZiB0aGUgc3Vic3RyaW5nIGFuZCBAYSBfX24yLiAgVGhlCisgICAgICAgKiAgZnVuY3Rpb24gdGhlbiBjb21wYXJlcyB0aGUgdHdvIHN0cmluZ3MgYnkgY2FsbGluZworICAgICAgICogIHRyYWl0czo6Y29tcGFyZShzdWJzdHJpbmcuZGF0YSgpLF9fcyxybGVuKS4gIElmIHRoZSByZXN1bHQgb2YKKyAgICAgICAqICB0aGUgY29tcGFyaXNvbiBpcyBub256ZXJvIHJldHVybnMgaXQsIG90aGVyd2lzZSB0aGUgc2hvcnRlcgorICAgICAgICogIG9uZSBpcyBvcmRlcmVkIGZpcnN0LgorICAgICAgICoKKyAgICAgICAqICBOQjogX19zIG11c3QgaGF2ZSBhdCBsZWFzdCBuMiBjaGFyYWN0ZXJzLCA8ZW0+XFwwPC9lbT4gaGFzIG5vIHNwZWNpYWwKKyAgICAgICAqICBtZWFuaW5nLgorICAgICAgKi8KKyAgICAgIGludAorICAgICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcywKKwkgICAgICBzaXplX3R5cGUgX19uMikgY29uc3Q7CisgICAgfTsKKworICAvLyBvcGVyYXRvcisKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbmNhdGVuYXRlIHR3byBzdHJpbmdzLgorICAgKiAgQHBhcmFtIF9fbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIExhc3Qgc3RyaW5nLgorICAgKiAgQHJldHVybiAgTmV3IHN0cmluZyB3aXRoIHZhbHVlIG9mIEBhIF9fbGhzIGZvbGxvd2VkIGJ5IEBhIF9fcmhzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4KKyAgICBvcGVyYXRvcisoY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19yaHMpOworCisgIC8qKgorICAgKiAgQGJyaWVmICBDb25jYXRlbmF0ZSBDIHN0cmluZyBhbmQgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIExhc3Qgc3RyaW5nLgorICAgKiAgQHJldHVybiAgTmV3IHN0cmluZyB3aXRoIHZhbHVlIG9mIEBhIF9fbGhzIGZvbGxvd2VkIGJ5IEBhIF9fcmhzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4KKyAgICBvcGVyYXRvcisoY29uc3QgX0NoYXJUKiBfX2xocywKKwkgICAgICBjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3Jocyk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbmNhdGVuYXRlIGNoYXJhY3RlciBhbmQgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIExhc3Qgc3RyaW5nLgorICAgKiAgQHJldHVybiAgTmV3IHN0cmluZyB3aXRoIEBhIF9fbGhzIGZvbGxvd2VkIGJ5IEBhIF9fcmhzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4KKyAgICBvcGVyYXRvcisoX0NoYXJUIF9fbGhzLAorCSAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKTsKKworICAvKioKKyAgICogIEBicmllZiAgQ29uY2F0ZW5hdGUgc3RyaW5nIGFuZCBDIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBMYXN0IHN0cmluZy4KKyAgICogIEByZXR1cm4gIE5ldyBzdHJpbmcgd2l0aCBAYSBfX2xocyBmb2xsb3dlZCBieSBAYSBfX3Jocy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+CisgICAgb3BlcmF0b3IrKGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpOworCisgIC8qKgorICAgKiAgQGJyaWVmICBDb25jYXRlbmF0ZSBzdHJpbmcgYW5kIGNoYXJhY3Rlci4KKyAgICogIEBwYXJhbSBfX2xocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBMYXN0IHN0cmluZy4KKyAgICogIEByZXR1cm4gIE5ldyBzdHJpbmcgd2l0aCBAYSBfX2xocyBmb2xsb3dlZCBieSBAYSBfX3Jocy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+CisgICAgb3BlcmF0b3IrKGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fbGhzLAorCSAgICAgIF9DaGFyVCBfX3Jocyk7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiYgX19saHMsCisJICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gc3RkOjptb3ZlKF9fbGhzLmFwcGVuZChfX3JocykpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+CisgICAgb3BlcmF0b3IrKGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fbGhzLAorCSAgICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mJiBfX3JocykKKyAgICB7IHJldHVybiBzdGQ6Om1vdmUoX19yaHMuaW5zZXJ0KDAsIF9fbGhzKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4KKyAgICBvcGVyYXRvcisoX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYmIF9fbGhzLAorCSAgICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mJiBfX3JocykKKyAgICB7CisgICAgICBjb25zdCBhdXRvIF9fc2l6ZSA9IF9fbGhzLnNpemUoKSArIF9fcmhzLnNpemUoKTsKKyAgICAgIGNvbnN0IGJvb2wgX19jb25kID0gKF9fc2l6ZSA+IF9fbGhzLmNhcGFjaXR5KCkKKwkJCSAgICYmIF9fc2l6ZSA8PSBfX3Jocy5jYXBhY2l0eSgpKTsKKyAgICAgIHJldHVybiBfX2NvbmQgPyBzdGQ6Om1vdmUoX19yaHMuaW5zZXJ0KDAsIF9fbGhzKSkKKwkgICAgICAgICAgICA6IHN0ZDo6bW92ZShfX2xocy5hcHBlbmQoX19yaHMpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+CisgICAgb3BlcmF0b3IrKGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYmIF9fcmhzKQorICAgIHsgcmV0dXJuIHN0ZDo6bW92ZShfX3Jocy5pbnNlcnQoMCwgX19saHMpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhfQ2hhclQgX19saHMsCisJICAgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYmIF9fcmhzKQorICAgIHsgcmV0dXJuIHN0ZDo6bW92ZShfX3Jocy5pbnNlcnQoMCwgMSwgX19saHMpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiYgX19saHMsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiBzdGQ6Om1vdmUoX19saHMuYXBwZW5kKF9fcmhzKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4KKyAgICBvcGVyYXRvcisoX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYmIF9fbGhzLAorCSAgICAgIF9DaGFyVCBfX3JocykKKyAgICB7IHJldHVybiBzdGQ6Om1vdmUoX19saHMuYXBwZW5kKDEsIF9fcmhzKSk7IH0KKyNlbmRpZgorCisgIC8vIG9wZXJhdG9yID09CisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGVxdWl2YWxlbmNlIG9mIHR3byBzdHJpbmdzLgorICAgKiAgQHBhcmFtIF9fbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFNlY29uZCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzLmNvbXBhcmUoQGEgX19yaHMpID09IDAuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA9PSAwOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19lbmFibGVfaWY8c3RkOjpfX2lzX2NoYXI8X0NoYXJUPjo6X192YWx1ZSwgYm9vbD46Ol9fdHlwZQorICAgIG9wZXJhdG9yPT0oY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD4sCisJICAgICAgIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4sIF9CYXNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+LAorCSAgICAgICBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+LCBfQmFzZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIChfX2xocy5zaXplKCkgPT0gX19yaHMuc2l6ZSgpCisJICAgICAgJiYgIXN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPjo6Y29tcGFyZShfX2xocy5kYXRhKCksIF9fcmhzLmRhdGEoKSwKKwkJCQkJCSAgICBfX2xocy5zaXplKCkpKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGVxdWl2YWxlbmNlIG9mIEMgc3RyaW5nIGFuZCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBTdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fcmhzLmNvbXBhcmUoQGEgX19saHMpID09IDAuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzLmNvbXBhcmUoX19saHMpID09IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBlcXVpdmFsZW5jZSBvZiBzdHJpbmcgYW5kIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBTdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIEMgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocy5jb21wYXJlKEBhIF9fcmhzKSA9PSAwLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA9PSAwOyB9CisKKyAgLy8gb3BlcmF0b3IgIT0KKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgZGlmZmVyZW5jZSBvZiB0d28gc3RyaW5ncy4KKyAgICogIEBwYXJhbSBfX2xocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBTZWNvbmQgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocy5jb21wYXJlKEBhIF9fcmhzKSAhPSAwLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBkaWZmZXJlbmNlIG9mIEMgc3RyaW5nIGFuZCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBTdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fcmhzLmNvbXBhcmUoQGEgX19saHMpICE9IDAuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgZGlmZmVyZW5jZSBvZiBzdHJpbmcgYW5kIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBTdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIEMgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocy5jb21wYXJlKEBhIF9fcmhzKSAhPSAwLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgIC8vIG9wZXJhdG9yIDwKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIHByZWNlZGVzIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBTZWNvbmQgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBwcmVjZWRlcyBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA8IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBzdHJpbmcgcHJlY2VkZXMgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIFN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgQyBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzIHByZWNlZGVzIEBhIF9fcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPCAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgQyBzdHJpbmcgcHJlY2VkZXMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBDIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBwcmVjZWRlcyBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzLmNvbXBhcmUoX19saHMpID4gMDsgfQorCisgIC8vIG9wZXJhdG9yID4KKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIGZvbGxvd3Mgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFNlY29uZCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzIGZvbGxvd3MgQGEgX19yaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPiAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIGZvbGxvd3MgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIFN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgQyBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzIGZvbGxvd3MgQGEgX19yaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA+IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBDIHN0cmluZyBmb2xsb3dzIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgZm9sbG93cyBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzLmNvbXBhcmUoX19saHMpIDwgMDsgfQorCisgIC8vIG9wZXJhdG9yIDw9CisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGlmIHN0cmluZyBkb2Vzbid0IGZvbGxvdyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU2Vjb25kIHN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgZG9lc24ndCBmb2xsb3cgQGEgX19yaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA8PSAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIGRvZXNuJ3QgZm9sbG93IEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBTdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIEMgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBkb2Vzbid0IGZvbGxvdyBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPD0gMDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGlmIEMgc3RyaW5nIGRvZXNuJ3QgZm9sbG93IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgZG9lc24ndCBmb2xsb3cgQGEgX19yaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzLmNvbXBhcmUoX19saHMpID49IDA7IH0KKworICAvLyBvcGVyYXRvciA+PQorICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBzdHJpbmcgZG9lc24ndCBwcmVjZWRlIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBTZWNvbmQgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBkb2Vzbid0IHByZWNlZGUgQGEgX19yaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA+PSAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIGRvZXNuJ3QgcHJlY2VkZSBDIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgU3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBDIHN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgZG9lc24ndCBwcmVjZWRlIEBhIF9fcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA+PSAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgQyBzdHJpbmcgZG9lc24ndCBwcmVjZWRlIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgZG9lc24ndCBwcmVjZWRlIEBhIF9fcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgICBjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX3Jocy5jb21wYXJlKF9fbGhzKSA8PSAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFN3YXAgY29udGVudHMgb2YgdHdvIHN0cmluZ3MuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU2Vjb25kIHN0cmluZy4KKyAgICoKKyAgICogIEV4Y2hhbmdlcyB0aGUgY29udGVudHMgb2YgQGEgX19saHMgYW5kIEBhIF9fcmhzIGluIGNvbnN0YW50IHRpbWUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fbGhzLAorCSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZWFkIHN0cmVhbSBpbnRvIGEgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9faXMgIElucHV0IHN0cmVhbS4KKyAgICogIEBwYXJhbSBfX3N0ciAgQnVmZmVyIHRvIHN0b3JlIGludG8uCisgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhlIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogIFN0b3JlcyBjaGFyYWN0ZXJzIGZyb20gQGEgX19pcyBpbnRvIEBhIF9fc3RyIHVudGlsIHdoaXRlc3BhY2UgaXMKKyAgICogIGZvdW5kLCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaXMgZW5jb3VudGVyZWQsIG9yIHN0ci5tYXhfc2l6ZSgpCisgICAqICBpcyByZWFjaGVkLiAgSWYgaXMud2lkdGgoKSBpcyBub24temVybywgdGhhdCBpcyB0aGUgbGltaXQgb24gdGhlCisgICAqICBudW1iZXIgb2YgY2hhcmFjdGVycyBzdG9yZWQgaW50byBAYSBfX3N0ci4gIEFueSBwcmV2aW91cworICAgKiAgY29udGVudHMgb2YgQGEgX19zdHIgYXJlIGVyYXNlZC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBfX2dudV9jeHg6Ol9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQWxsb2MsIF9CYXNlPiYgX19zdHIpOworCisgIC8qKgorICAgKiAgQGJyaWVmICBXcml0ZSBzdHJpbmcgdG8gYSBzdHJlYW0uCisgICAqICBAcGFyYW0gX19vcyAgT3V0cHV0IHN0cmVhbS4KKyAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIHRvIHdyaXRlIG91dC4KKyAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICoKKyAgICogIE91dHB1dCBjaGFyYWN0ZXJzIG9mIEBhIF9fc3RyIGludG8gb3MgZm9sbG93aW5nIHRoZSBzYW1lIHJ1bGVzIGFzIGZvcgorICAgKiAgd3JpdGluZyBhIEMgc3RyaW5nLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IF9fZ251X2N4eDo6X192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsCisJICAgICAgIF9CYXNlPiYgX19zdHIpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNTg2LiBzdHJpbmcgaW5zZXJ0ZXIgbm90IGEgZm9ybWF0dGVkIGZ1bmN0aW9uCisgICAgICByZXR1cm4gX19vc3RyZWFtX2luc2VydChfX29zLCBfX3N0ci5kYXRhKCksIF9fc3RyLnNpemUoKSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZWFkIGEgbGluZSBmcm9tIHN0cmVhbSBpbnRvIGEgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9faXMgIElucHV0IHN0cmVhbS4KKyAgICogIEBwYXJhbSBfX3N0ciAgQnVmZmVyIHRvIHN0b3JlIGludG8uCisgICAqICBAcGFyYW0gX19kZWxpbSAgQ2hhcmFjdGVyIG1hcmtpbmcgZW5kIG9mIGxpbmUuCisgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhlIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogIFN0b3JlcyBjaGFyYWN0ZXJzIGZyb20gQGEgX19pcyBpbnRvIEBhIF9fc3RyIHVudGlsIEBhIF9fZGVsaW0gaXMKKyAgICogIGZvdW5kLCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaXMgZW5jb3VudGVyZWQsIG9yIHN0ci5tYXhfc2l6ZSgpCisgICAqICBpcyByZWFjaGVkLiAgSWYgaXMud2lkdGgoKSBpcyBub24temVybywgdGhhdCBpcyB0aGUgbGltaXQgb24gdGhlCisgICAqICBudW1iZXIgb2YgY2hhcmFjdGVycyBzdG9yZWQgaW50byBAYSBfX3N0ci4gIEFueSBwcmV2aW91cworICAgKiAgY29udGVudHMgb2YgQGEgX19zdHIgYXJlIGVyYXNlZC4gIElmIEBhIGRlbGltIHdhcyBlbmNvdW50ZXJlZCwKKyAgICogIGl0IGlzIGV4dHJhY3RlZCBidXQgbm90IHN0b3JlZCBpbnRvIEBhIF9fc3RyLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgZ2V0bGluZShiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgIF9fZ251X2N4eDo6X192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19zdHIsCisJICAgIF9DaGFyVCBfX2RlbGltKTsKKworICAvKioKKyAgICogIEBicmllZiAgUmVhZCBhIGxpbmUgZnJvbSBzdHJlYW0gaW50byBhIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2lzICBJbnB1dCBzdHJlYW0uCisgICAqICBAcGFyYW0gX19zdHIgIEJ1ZmZlciB0byBzdG9yZSBpbnRvLgorICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoZSBpbnB1dCBzdHJlYW0uCisgICAqCisgICAqICBTdG9yZXMgY2hhcmFjdGVycyBmcm9tIGlzIGludG8gQGEgX19zdHIgdW50aWwgJmFwb3M7XG4mYXBvczsgaXMKKyAgICogIGZvdW5kLCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaXMgZW5jb3VudGVyZWQsIG9yIHN0ci5tYXhfc2l6ZSgpCisgICAqICBpcyByZWFjaGVkLiAgSWYgaXMud2lkdGgoKSBpcyBub24temVybywgdGhhdCBpcyB0aGUgbGltaXQgb24gdGhlCisgICAqICBudW1iZXIgb2YgY2hhcmFjdGVycyBzdG9yZWQgaW50byBAYSBfX3N0ci4gIEFueSBwcmV2aW91cworICAgKiAgY29udGVudHMgb2YgQGEgX19zdHIgYXJlIGVyYXNlZC4gIElmIGVuZCBvZiBsaW5lIHdhcworICAgKiAgZW5jb3VudGVyZWQsIGl0IGlzIGV4dHJhY3RlZCBidXQgbm90IHN0b3JlZCBpbnRvIEBhIF9fc3RyLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGdldGxpbmUoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICBfX2dudV9jeHg6Ol9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fc3RyKQorICAgIHsgcmV0dXJuIGdldGxpbmUoX19pcywgX19zdHIsIF9faXMud2lkZW4oJ1xuJykpOyB9ICAgICAgCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2lmICgoX19jcGx1c3BsdXMgPj0gMjAxMTAzTCkgJiYgZGVmaW5lZChfR0xJQkNYWF9VU0VfQzk5KSkKKworI2luY2x1ZGUgPGV4dC9zdHJpbmdfY29udmVyc2lvbnMuaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIDIxLjQgTnVtZXJpYyBDb252ZXJzaW9ucyBbc3RyaW5nLmNvbnZlcnNpb25zXS4KKyAgaW5saW5lIGludAorICBzdG9pKGNvbnN0IF9fdnN0cmluZyYgX19zdHIsIHN0ZDo6c2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2E8bG9uZywgaW50Pigmc3RkOjpzdHJ0b2wsICJzdG9pIiwgX19zdHIuY19zdHIoKSwKKwkJCQkJX19pZHgsIF9fYmFzZSk7IH0KKworICBpbmxpbmUgbG9uZworICBzdG9sKGNvbnN0IF9fdnN0cmluZyYgX19zdHIsIHN0ZDo6c2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6c3RydG9sLCAic3RvbCIsIF9fc3RyLmNfc3RyKCksCisJCQkgICAgIF9faWR4LCBfX2Jhc2UpOyB9CisKKyAgaW5saW5lIHVuc2lnbmVkIGxvbmcKKyAgc3RvdWwoY29uc3QgX192c3RyaW5nJiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjpzdHJ0b3VsLCAic3RvdWwiLCBfX3N0ci5jX3N0cigpLAorCQkJICAgICBfX2lkeCwgX19iYXNlKTsgfQorCisgIGlubGluZSBsb25nIGxvbmcKKyAgc3RvbGwoY29uc3QgX192c3RyaW5nJiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4ID0gMCwJaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjpzdHJ0b2xsLCAic3RvbGwiLCBfX3N0ci5jX3N0cigpLAorCQkJICAgICBfX2lkeCwgX19iYXNlKTsgfQorCisgIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcKKyAgc3RvdWxsKGNvbnN0IF9fdnN0cmluZyYgX19zdHIsIHN0ZDo6c2l6ZV90KiBfX2lkeCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjpzdHJ0b3VsbCwgInN0b3VsbCIsIF9fc3RyLmNfc3RyKCksCisJCQkgICAgIF9faWR4LCBfX2Jhc2UpOyB9CisKKyAgLy8gTkI6IHN0cnRvZiB2cyBzdHJ0b2QuCisgIGlubGluZSBmbG9hdAorICBzdG9mKGNvbnN0IF9fdnN0cmluZyYgX19zdHIsIHN0ZDo6c2l6ZV90KiBfX2lkeCA9IDApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6OnN0cnRvZiwgInN0b2YiLCBfX3N0ci5jX3N0cigpLCBfX2lkeCk7IH0KKworICBpbmxpbmUgZG91YmxlCisgIHN0b2QoY29uc3QgX192c3RyaW5nJiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4ID0gMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6c3RydG9kLCAic3RvZCIsIF9fc3RyLmNfc3RyKCksIF9faWR4KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBzdG9sZChjb25zdCBfX3ZzdHJpbmcmIF9fc3RyLCBzdGQ6OnNpemVfdCogX19pZHggPSAwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjpzdHJ0b2xkLCAic3RvbGQiLCBfX3N0ci5jX3N0cigpLCBfX2lkeCk7IH0KKworICAvLyBOQjogKHYpc25wcmludGYgdnMgc3ByaW50Zi4KKworICAvLyBEUiAxMjYxLgorICBpbmxpbmUgX192c3RyaW5nCisgIHRvX3N0cmluZyhpbnQgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPF9fdnN0cmluZz4oJnN0ZDo6dnNucHJpbnRmLCA0ICogc2l6ZW9mKGludCksCisJCQkJCSAgICAgICIlZCIsIF9fdmFsKTsgfQorCisgIGlubGluZSBfX3ZzdHJpbmcKKyAgdG9fc3RyaW5nKHVuc2lnbmVkIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxfX3ZzdHJpbmc+KCZzdGQ6OnZzbnByaW50ZiwKKwkJCQkJICAgICAgNCAqIHNpemVvZih1bnNpZ25lZCksCisJCQkJCSAgICAgICIldSIsIF9fdmFsKTsgfQorCisgIGlubGluZSBfX3ZzdHJpbmcKKyAgdG9fc3RyaW5nKGxvbmcgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPF9fdnN0cmluZz4oJnN0ZDo6dnNucHJpbnRmLAorCQkJCQkgICAgICA0ICogc2l6ZW9mKGxvbmcpLAorCQkJCQkgICAgICAiJWxkIiwgX192YWwpOyB9CisKKyAgaW5saW5lIF9fdnN0cmluZworICB0b19zdHJpbmcodW5zaWduZWQgbG9uZyBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8X192c3RyaW5nPigmc3RkOjp2c25wcmludGYsCisJCQkJCSAgICAgIDQgKiBzaXplb2YodW5zaWduZWQgbG9uZyksCisJCQkJCSAgICAgICIlbHUiLCBfX3ZhbCk7IH0KKworCisgIGlubGluZSBfX3ZzdHJpbmcKKyAgdG9fc3RyaW5nKGxvbmcgbG9uZyBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8X192c3RyaW5nPigmc3RkOjp2c25wcmludGYsCisJCQkJCSAgICAgIDQgKiBzaXplb2YobG9uZyBsb25nKSwKKwkJCQkJICAgICAgIiVsbGQiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgX192c3RyaW5nCisgIHRvX3N0cmluZyh1bnNpZ25lZCBsb25nIGxvbmcgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPF9fdnN0cmluZz4oJnN0ZDo6dnNucHJpbnRmLAorCQkJCQkgICAgICA0ICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZyksCisJCQkJCSAgICAgICIlbGx1IiwgX192YWwpOyB9CisKKyAgaW5saW5lIF9fdnN0cmluZworICB0b19zdHJpbmcoZmxvYXQgX192YWwpCisgIHsKKyAgICBjb25zdCBpbnQgX19uID0gX19udW1lcmljX3RyYWl0czxmbG9hdD46Ol9fbWF4X2V4cG9uZW50MTAgKyAyMDsKKyAgICByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8X192c3RyaW5nPigmc3RkOjp2c25wcmludGYsIF9fbiwKKwkJCQkJICAgICAgIiVmIiwgX192YWwpOworICB9CisKKyAgaW5saW5lIF9fdnN0cmluZworICB0b19zdHJpbmcoZG91YmxlIF9fdmFsKQorICB7CisgICAgY29uc3QgaW50IF9fbiA9IF9fbnVtZXJpY190cmFpdHM8ZG91YmxlPjo6X19tYXhfZXhwb25lbnQxMCArIDIwOworICAgIHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxfX3ZzdHJpbmc+KCZzdGQ6OnZzbnByaW50ZiwgX19uLAorCQkJCQkgICAgICAiJWYiLCBfX3ZhbCk7CisgIH0KKworICBpbmxpbmUgX192c3RyaW5nCisgIHRvX3N0cmluZyhsb25nIGRvdWJsZSBfX3ZhbCkKKyAgeworICAgIGNvbnN0IGludCBfX24gPSBfX251bWVyaWNfdHJhaXRzPGxvbmcgZG91YmxlPjo6X19tYXhfZXhwb25lbnQxMCArIDIwOworICAgIHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxfX3ZzdHJpbmc+KCZzdGQ6OnZzbnByaW50ZiwgX19uLAorCQkJCQkgICAgICAiJUxmIiwgX192YWwpOworICB9CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICBpbmxpbmUgaW50IAorICBzdG9pKGNvbnN0IF9fd3ZzdHJpbmcmIF9fc3RyLCBzdGQ6OnNpemVfdCogX19pZHggPSAwLCBpbnQgX19iYXNlID0gMTApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hPGxvbmcsIGludD4oJnN0ZDo6d2NzdG9sLCAic3RvaSIsIF9fc3RyLmNfc3RyKCksCisJCQkJCV9faWR4LCBfX2Jhc2UpOyB9CisKKyAgaW5saW5lIGxvbmcgCisgIHN0b2woY29uc3QgX193dnN0cmluZyYgX19zdHIsIHN0ZDo6c2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6d2NzdG9sLCAic3RvbCIsIF9fc3RyLmNfc3RyKCksCisJCQkgICAgIF9faWR4LCBfX2Jhc2UpOyB9CisKKyAgaW5saW5lIHVuc2lnbmVkIGxvbmcKKyAgc3RvdWwoY29uc3QgX193dnN0cmluZyYgX19zdHIsIHN0ZDo6c2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6d2NzdG91bCwgInN0b3VsIiwgX19zdHIuY19zdHIoKSwKKwkJCSAgICAgX19pZHgsIF9fYmFzZSk7IH0KKworICBpbmxpbmUgbG9uZyBsb25nCisgIHN0b2xsKGNvbnN0IF9fd3ZzdHJpbmcmIF9fc3RyLCBzdGQ6OnNpemVfdCogX19pZHggPSAwLCBpbnQgX19iYXNlID0gMTApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6Ondjc3RvbGwsICJzdG9sbCIsIF9fc3RyLmNfc3RyKCksCisJCQkgICAgIF9faWR4LCBfX2Jhc2UpOyB9CisKKyAgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZworICBzdG91bGwoY29uc3QgX193dnN0cmluZyYgX19zdHIsIHN0ZDo6c2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6d2NzdG91bGwsICJzdG91bGwiLCBfX3N0ci5jX3N0cigpLAorCQkJICAgICBfX2lkeCwgX19iYXNlKTsgfQorCisgIC8vIE5COiB3Y3N0b2YgdnMgd2NzdG9kLgorICBpbmxpbmUgZmxvYXQKKyAgc3RvZihjb25zdCBfX3d2c3RyaW5nJiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4ID0gMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6d2NzdG9mLCAic3RvZiIsIF9fc3RyLmNfc3RyKCksIF9faWR4KTsgfQorCisgIGlubGluZSBkb3VibGUKKyAgc3RvZChjb25zdCBfX3d2c3RyaW5nJiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4ID0gMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6d2NzdG9kLCAic3RvZCIsIF9fc3RyLmNfc3RyKCksIF9faWR4KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBzdG9sZChjb25zdCBfX3d2c3RyaW5nJiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4ID0gMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6d2NzdG9sZCwgInN0b2xkIiwgX19zdHIuY19zdHIoKSwgX19pZHgpOyB9CisKKyNpZm5kZWYgX0dMSUJDWFhfSEFWRV9CUk9LRU5fVlNXUFJJTlRGCisgIC8vIERSIDEyNjEuCisgIGlubGluZSBfX3d2c3RyaW5nCisgIHRvX3dzdHJpbmcoaW50IF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxfX3d2c3RyaW5nPigmc3RkOjp2c3dwcmludGYsCisJCQkJCSAgICAgICA0ICogc2l6ZW9mKGludCksCisJCQkJCSAgICAgICBMIiVkIiwgX192YWwpOyB9CisKKyAgaW5saW5lIF9fd3ZzdHJpbmcKKyAgdG9fd3N0cmluZyh1bnNpZ25lZCBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8X193dnN0cmluZz4oJnN0ZDo6dnN3cHJpbnRmLAorCQkJCQkgICAgICAgNCAqIHNpemVvZih1bnNpZ25lZCksCisJCQkJCSAgICAgICBMIiV1IiwgX192YWwpOyB9CisKKyAgaW5saW5lIF9fd3ZzdHJpbmcKKyAgdG9fd3N0cmluZyhsb25nIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxfX3d2c3RyaW5nPigmc3RkOjp2c3dwcmludGYsCisJCQkJCSAgICAgICA0ICogc2l6ZW9mKGxvbmcpLAorCQkJCQkgICAgICAgTCIlbGQiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgX193dnN0cmluZworICB0b193c3RyaW5nKHVuc2lnbmVkIGxvbmcgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPF9fd3ZzdHJpbmc+KCZzdGQ6OnZzd3ByaW50ZiwKKwkJCQkJICAgICAgIDQgKiBzaXplb2YodW5zaWduZWQgbG9uZyksCisJCQkJCSAgICAgICBMIiVsdSIsIF9fdmFsKTsgfQorCisgIGlubGluZSBfX3d2c3RyaW5nCisgIHRvX3dzdHJpbmcobG9uZyBsb25nIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxfX3d2c3RyaW5nPigmc3RkOjp2c3dwcmludGYsCisJCQkJCSAgICAgICA0ICogc2l6ZW9mKGxvbmcgbG9uZyksCisJCQkJCSAgICAgICBMIiVsbGQiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgX193dnN0cmluZworICB0b193c3RyaW5nKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8X193dnN0cmluZz4oJnN0ZDo6dnN3cHJpbnRmLAorCQkJCQkgICAgICAgNCAqIHNpemVvZih1bnNpZ25lZCBsb25nIGxvbmcpLAorCQkJCQkgICAgICAgTCIlbGx1IiwgX192YWwpOyB9CisKKyAgaW5saW5lIF9fd3ZzdHJpbmcKKyAgdG9fd3N0cmluZyhmbG9hdCBfX3ZhbCkKKyAgeworICAgIGNvbnN0IGludCBfX24gPSBfX251bWVyaWNfdHJhaXRzPGZsb2F0Pjo6X19tYXhfZXhwb25lbnQxMCArIDIwOworICAgIHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxfX3d2c3RyaW5nPigmc3RkOjp2c3dwcmludGYsIF9fbiwKKwkJCQkJICAgICAgIEwiJWYiLCBfX3ZhbCk7CisgIH0KKworICBpbmxpbmUgX193dnN0cmluZworICB0b193c3RyaW5nKGRvdWJsZSBfX3ZhbCkKKyAgeworICAgIGNvbnN0IGludCBfX24gPSBfX251bWVyaWNfdHJhaXRzPGRvdWJsZT46Ol9fbWF4X2V4cG9uZW50MTAgKyAyMDsKKyAgICByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8X193dnN0cmluZz4oJnN0ZDo6dnN3cHJpbnRmLCBfX24sCisJCQkJCSAgICAgICBMIiVmIiwgX192YWwpOworICB9CisKKyAgaW5saW5lIF9fd3ZzdHJpbmcKKyAgdG9fd3N0cmluZyhsb25nIGRvdWJsZSBfX3ZhbCkKKyAgeworICAgIGNvbnN0IGludCBfX24gPSBfX251bWVyaWNfdHJhaXRzPGxvbmcgZG91YmxlPjo6X19tYXhfZXhwb25lbnQxMCArIDIwOworICAgIHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxfX3d2c3RyaW5nPigmc3RkOjp2c3dwcmludGYsIF9fbiwKKwkJCQkJICAgICAgIEwiJUxmIiwgX192YWwpOworICB9CisjZW5kaWYKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisjaW5jbHVkZSA8Yml0cy9mdW5jdGlvbmFsX2hhc2guaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIF9fdnN0cmluZy4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPF9fZ251X2N4eDo6X192c3RyaW5nPgorICAgIDogcHVibGljIF9faGFzaF9iYXNlPHNpemVfdCwgX19nbnVfY3h4OjpfX3ZzdHJpbmc+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9fZ251X2N4eDo6X192c3RyaW5nJiBfX3MpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Ol9IYXNoX2ltcGw6Omhhc2goX19zLmRhdGEoKSwgX19zLmxlbmd0aCgpKTsgfQorICAgIH07CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciBfX3d2c3RyaW5nLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8X19nbnVfY3h4OjpfX3d2c3RyaW5nPgorICAgIDogcHVibGljIF9faGFzaF9iYXNlPHNpemVfdCwgX19nbnVfY3h4OjpfX3d2c3RyaW5nPgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfX2dudV9jeHg6Ol9fd3ZzdHJpbmcmIF9fcykgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X0hhc2hfaW1wbDo6aGFzaChfX3MuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcy5sZW5ndGgoKSAqIHNpemVvZih3Y2hhcl90KSk7IH0KKyAgICB9OworI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKyAgLy8vIHN0ZDo6aGFzaCBzcGVjaWFsaXphdGlvbiBmb3IgX191MTZ2c3RyaW5nLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8X19nbnVfY3h4OjpfX3UxNnZzdHJpbmc+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBfX2dudV9jeHg6Ol9fdTE2dnN0cmluZz4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX19nbnVfY3h4OjpfX3UxNnZzdHJpbmcmIF9fcykgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X0hhc2hfaW1wbDo6aGFzaChfX3MuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcy5sZW5ndGgoKSAqIHNpemVvZihjaGFyMTZfdCkpOyB9CisgICAgfTsKKworICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciBfX3UzMnZzdHJpbmcuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDxfX2dudV9jeHg6Ol9fdTMydnN0cmluZz4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIF9fZ251X2N4eDo6X191MzJ2c3RyaW5nPgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfX2dudV9jeHg6Ol9fdTMydnN0cmluZyYgX19zKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpfSGFzaF9pbXBsOjpoYXNoKF9fcy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zLmxlbmd0aCgpICogc2l6ZW9mKGNoYXIzMl90KSk7IH0KKyAgICB9OworI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIEMrKzExCisKKyNpbmNsdWRlICJ2c3RyaW5nLnRjYyIgCisKKyNlbmRpZiAvKiBfVlNUUklOR19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC92c3RyaW5nLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3ZzdHJpbmcudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkY2QyOTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC92c3RyaW5nLnRjYwpAQCAtMCwwICsxLDcwMSBAQAorLy8gVmVyc2F0aWxlIHN0cmluZyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L3ZzdHJpbmcudGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZXh0L3ZzdHJpbmcuaH0KKyAqLworCisjaWZuZGVmIF9WU1RSSU5HX1RDQworI2RlZmluZSBfVlNUUklOR19UQ0MgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2N4eGFiaV9mb3JjZWQuaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBjb25zdCB0eXBlbmFtZSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjpzaXplX3R5cGUKKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjpucG9zOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICB2b2lkCisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6CisgICAgcmVzaXplKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGlmIChfX3NpemUgPCBfX24pCisJdGhpcy0+YXBwZW5kKF9fbiAtIF9fc2l6ZSwgX19jKTsKKyAgICAgIGVsc2UgaWYgKF9fbiA8IF9fc2l6ZSkKKwl0aGlzLT5fTV9lcmFzZShfX24sIF9fc2l6ZSAtIF9fbik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JgorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIF9NX2FwcGVuZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBfX24gKyB0aGlzLT5zaXplKCk7CisKKyAgICAgIGlmIChfX2xlbiA8PSB0aGlzLT5jYXBhY2l0eSgpICYmICF0aGlzLT5fTV9pc19zaGFyZWQoKSkKKwl7CisJICBpZiAoX19uKQorCSAgICB0aGlzLT5fU19jb3B5KHRoaXMtPl9NX2RhdGEoKSArIHRoaXMtPnNpemUoKSwgX19zLCBfX24pOworCX0KKyAgICAgIGVsc2UKKwl0aGlzLT5fTV9tdXRhdGUodGhpcy0+c2l6ZSgpLCBzaXplX3R5cGUoMCksIF9fcywgX19uKTsKKworICAgICAgdGhpcy0+X01fc2V0X2xlbmd0aChfX2xlbik7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mCisgICAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICAgIF9NX3JlcGxhY2VfZGlzcGF0Y2goaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgX0lucHV0SXRlcmF0b3IgX19rMSwKKwkJCSAgX0lucHV0SXRlcmF0b3IgX19rMiwgc3RkOjpfX2ZhbHNlX3R5cGUpCisgICAgICB7CisJY29uc3QgX192ZXJzYV9zdHJpbmcgX19zKF9fazEsIF9fazIpOworCWNvbnN0IHNpemVfdHlwZSBfX24xID0gX19pMiAtIF9faTE7CisJcmV0dXJuIF9NX3JlcGxhY2UoX19pMSAtIF9NX2liZWdpbigpLCBfX24xLCBfX3MuX01fZGF0YSgpLAorCQkJICBfX3Muc2l6ZSgpKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYKKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICBfTV9yZXBsYWNlX2F1eChzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgc2l6ZV90eXBlIF9fbjIsCisJCSAgIF9DaGFyVCBfX2MpCisgICAgeworICAgICAgX01fY2hlY2tfbGVuZ3RoKF9fbjEsIF9fbjIsICJfX3ZlcnNhX3N0cmluZzo6X01fcmVwbGFjZV9hdXgiKTsKKworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19uZXdfc2l6ZSA9IF9fb2xkX3NpemUgKyBfX24yIC0gX19uMTsKKworICAgICAgaWYgKF9fbmV3X3NpemUgPD0gdGhpcy0+Y2FwYWNpdHkoKSAmJiAhdGhpcy0+X01faXNfc2hhcmVkKCkpCisJeworCSAgX0NoYXJUKiBfX3AgPSB0aGlzLT5fTV9kYXRhKCkgKyBfX3BvczE7CisKKwkgIGNvbnN0IHNpemVfdHlwZSBfX2hvd19tdWNoID0gX19vbGRfc2l6ZSAtIF9fcG9zMSAtIF9fbjE7CisJICBpZiAoX19ob3dfbXVjaCAmJiBfX24xICE9IF9fbjIpCisJICAgIHRoaXMtPl9TX21vdmUoX19wICsgX19uMiwgX19wICsgX19uMSwgX19ob3dfbXVjaCk7CisJfQorICAgICAgZWxzZQorCXRoaXMtPl9NX211dGF0ZShfX3BvczEsIF9fbjEsIDAsIF9fbjIpOworCisgICAgICBpZiAoX19uMikKKwl0aGlzLT5fU19hc3NpZ24odGhpcy0+X01fZGF0YSgpICsgX19wb3MxLCBfX24yLCBfX2MpOworCisgICAgICB0aGlzLT5fTV9zZXRfbGVuZ3RoKF9fbmV3X3NpemUpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYKKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICBfTV9yZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbGVuMSwgY29uc3QgX0NoYXJUKiBfX3MsCisJICAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbjIpCisgICAgeworICAgICAgX01fY2hlY2tfbGVuZ3RoKF9fbGVuMSwgX19sZW4yLCAiX192ZXJzYV9zdHJpbmc6Ol9NX3JlcGxhY2UiKTsKKworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19uZXdfc2l6ZSA9IF9fb2xkX3NpemUgKyBfX2xlbjIgLSBfX2xlbjE7CisgICAgICAKKyAgICAgIGlmIChfX25ld19zaXplIDw9IHRoaXMtPmNhcGFjaXR5KCkgJiYgIXRoaXMtPl9NX2lzX3NoYXJlZCgpKQorCXsKKwkgIF9DaGFyVCogX19wID0gdGhpcy0+X01fZGF0YSgpICsgX19wb3M7CisKKwkgIGNvbnN0IHNpemVfdHlwZSBfX2hvd19tdWNoID0gX19vbGRfc2l6ZSAtIF9fcG9zIC0gX19sZW4xOworCSAgaWYgKF9NX2Rpc2p1bmN0KF9fcykpCisJICAgIHsKKwkgICAgICBpZiAoX19ob3dfbXVjaCAmJiBfX2xlbjEgIT0gX19sZW4yKQorCQl0aGlzLT5fU19tb3ZlKF9fcCArIF9fbGVuMiwgX19wICsgX19sZW4xLCBfX2hvd19tdWNoKTsKKwkgICAgICBpZiAoX19sZW4yKQorCQl0aGlzLT5fU19jb3B5KF9fcCwgX19zLCBfX2xlbjIpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvLyBXb3JrIGluLXBsYWNlLgorCSAgICAgIGlmIChfX2xlbjIgJiYgX19sZW4yIDw9IF9fbGVuMSkKKwkJdGhpcy0+X1NfbW92ZShfX3AsIF9fcywgX19sZW4yKTsKKwkgICAgICBpZiAoX19ob3dfbXVjaCAmJiBfX2xlbjEgIT0gX19sZW4yKQorCQl0aGlzLT5fU19tb3ZlKF9fcCArIF9fbGVuMiwgX19wICsgX19sZW4xLCBfX2hvd19tdWNoKTsKKwkgICAgICBpZiAoX19sZW4yID4gX19sZW4xKQorCQl7CisJCSAgaWYgKF9fcyArIF9fbGVuMiA8PSBfX3AgKyBfX2xlbjEpCisJCSAgICB0aGlzLT5fU19tb3ZlKF9fcCwgX19zLCBfX2xlbjIpOworCQkgIGVsc2UgaWYgKF9fcyA+PSBfX3AgKyBfX2xlbjEpCisJCSAgICB0aGlzLT5fU19jb3B5KF9fcCwgX19zICsgX19sZW4yIC0gX19sZW4xLCBfX2xlbjIpOworCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbmxlZnQgPSAoX19wICsgX19sZW4xKSAtIF9fczsKKwkJICAgICAgdGhpcy0+X1NfbW92ZShfX3AsIF9fcywgX19ubGVmdCk7CisJCSAgICAgIHRoaXMtPl9TX2NvcHkoX19wICsgX19ubGVmdCwgX19wICsgX19sZW4yLAorCQkJCSAgICBfX2xlbjIgLSBfX25sZWZ0KTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgICAgZWxzZQorCXRoaXMtPl9NX211dGF0ZShfX3BvcywgX19sZW4xLCBfX3MsIF9fbGVuMik7CisKKyAgICAgIHRoaXMtPl9NX3NldF9sZW5ndGgoX19uZXdfc2l6ZSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4KKyAgICBvcGVyYXRvcisoY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19yaHMpCisgICAgeworICAgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiBfX3N0cjsKKyAgICAgIF9fc3RyLnJlc2VydmUoX19saHMuc2l6ZSgpICsgX19yaHMuc2l6ZSgpKTsKKyAgICAgIF9fc3RyLmFwcGVuZChfX2xocyk7CisgICAgICBfX3N0ci5hcHBlbmQoX19yaHMpOworICAgICAgcmV0dXJuIF9fc3RyOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19saHMpOworICAgICAgdHlwZWRlZiBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+IF9fc3RyaW5nX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fc3RyaW5nX3R5cGU6OnNpemVfdHlwZQkgIF9fc2l6ZV90eXBlOworICAgICAgY29uc3QgX19zaXplX3R5cGUgX19sZW4gPSBfVHJhaXRzOjpsZW5ndGgoX19saHMpOworICAgICAgX19zdHJpbmdfdHlwZSBfX3N0cjsKKyAgICAgIF9fc3RyLnJlc2VydmUoX19sZW4gKyBfX3Jocy5zaXplKCkpOworICAgICAgX19zdHIuYXBwZW5kKF9fbGhzLCBfX2xlbik7CisgICAgICBfX3N0ci5hcHBlbmQoX19yaHMpOworICAgICAgcmV0dXJuIF9fc3RyOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhfQ2hhclQgX19saHMsCisJICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19yaHMpCisgICAgeworICAgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiBfX3N0cjsKKyAgICAgIF9fc3RyLnJlc2VydmUoX19yaHMuc2l6ZSgpICsgMSk7CisgICAgICBfX3N0ci5wdXNoX2JhY2soX19saHMpOworICAgICAgX19zdHIuYXBwZW5kKF9fcmhzKTsKKyAgICAgIHJldHVybiBfX3N0cjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4KKyAgICBvcGVyYXRvcisoY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcmhzKTsKKyAgICAgIHR5cGVkZWYgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiBfX3N0cmluZ190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3N0cmluZ190eXBlOjpzaXplX3R5cGUJICBfX3NpemVfdHlwZTsKKyAgICAgIGNvbnN0IF9fc2l6ZV90eXBlIF9fbGVuID0gX1RyYWl0czo6bGVuZ3RoKF9fcmhzKTsKKyAgICAgIF9fc3RyaW5nX3R5cGUgX19zdHI7CisgICAgICBfX3N0ci5yZXNlcnZlKF9fbGhzLnNpemUoKSArIF9fbGVuKTsKKyAgICAgIF9fc3RyLmFwcGVuZChfX2xocyk7CisgICAgICBfX3N0ci5hcHBlbmQoX19yaHMsIF9fbGVuKTsKKyAgICAgIHJldHVybiBfX3N0cjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4KKyAgICBvcGVyYXRvcisoY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgX0NoYXJUIF9fcmhzKQorICAgIHsKKyAgICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4gX19zdHI7CisgICAgICBfX3N0ci5yZXNlcnZlKF9fbGhzLnNpemUoKSArIDEpOworICAgICAgX19zdHIuYXBwZW5kKF9fbGhzKTsKKyAgICAgIF9fc3RyLnB1c2hfYmFjayhfX3Jocyk7CisgICAgICByZXR1cm4gX19zdHI7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICB0eXBlbmFtZSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjpzaXplX3R5cGUKKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICBjb3B5KF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0CisgICAgeworICAgICAgX01fY2hlY2soX19wb3MsICJfX3ZlcnNhX3N0cmluZzo6Y29weSIpOworICAgICAgX19uID0gX01fbGltaXQoX19wb3MsIF9fbik7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBpZiAoX19uKQorCXRoaXMtPl9TX2NvcHkoX19zLCB0aGlzLT5fTV9kYXRhKCkgKyBfX3BvcywgX19uKTsKKyAgICAgIC8vIDIxLjMuNS43IHBhciAzOiBkbyBub3QgYXBwZW5kIG51bGwuICAoZ29vZC4pCisgICAgICByZXR1cm4gX19uOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgdHlwZW5hbWUgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6c2l6ZV90eXBlCisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6CisgICAgZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBjb25zdCBfQ2hhclQqIF9fZGF0YSA9IHRoaXMtPl9NX2RhdGEoKTsKKworICAgICAgaWYgKF9fbiA9PSAwKQorCXJldHVybiBfX3BvcyA8PSBfX3NpemUgPyBfX3BvcyA6IG5wb3M7CisKKyAgICAgIGlmIChfX24gPD0gX19zaXplKQorCXsKKwkgIGZvciAoOyBfX3BvcyA8PSBfX3NpemUgLSBfX247ICsrX19wb3MpCisJICAgIGlmICh0cmFpdHNfdHlwZTo6ZXEoX19kYXRhW19fcG9zXSwgX19zWzBdKQorCQkmJiB0cmFpdHNfdHlwZTo6Y29tcGFyZShfX2RhdGEgKyBfX3BvcyArIDEsCisJCQkJCV9fcyArIDEsIF9fbiAtIDEpID09IDApCisJICAgICAgcmV0dXJuIF9fcG9zOworCX0KKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgdHlwZW5hbWUgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6c2l6ZV90eXBlCisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6CisgICAgZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgc2l6ZV90eXBlIF9fcmV0ID0gbnBvczsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBpZiAoX19wb3MgPCBfX3NpemUpCisJeworCSAgY29uc3QgX0NoYXJUKiBfX2RhdGEgPSB0aGlzLT5fTV9kYXRhKCk7CisJICBjb25zdCBzaXplX3R5cGUgX19uID0gX19zaXplIC0gX19wb3M7CisJICBjb25zdCBfQ2hhclQqIF9fcCA9IHRyYWl0c190eXBlOjpmaW5kKF9fZGF0YSArIF9fcG9zLCBfX24sIF9fYyk7CisJICBpZiAoX19wKQorCSAgICBfX3JldCA9IF9fcCAtIF9fZGF0YTsKKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICB0eXBlbmFtZSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjpzaXplX3R5cGUKKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICByZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBpZiAoX19uIDw9IF9fc2l6ZSkKKwl7CisJICBfX3BvcyA9IHN0ZDo6bWluKHNpemVfdHlwZShfX3NpemUgLSBfX24pLCBfX3Bvcyk7CisJICBjb25zdCBfQ2hhclQqIF9fZGF0YSA9IHRoaXMtPl9NX2RhdGEoKTsKKwkgIGRvCisJICAgIHsKKwkgICAgICBpZiAodHJhaXRzX3R5cGU6OmNvbXBhcmUoX19kYXRhICsgX19wb3MsIF9fcywgX19uKSA9PSAwKQorCQlyZXR1cm4gX19wb3M7CisJICAgIH0KKwkgIHdoaWxlIChfX3Bvcy0tID4gMCk7CisJfQorICAgICAgcmV0dXJuIG5wb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICB0eXBlbmFtZSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjpzaXplX3R5cGUKKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICByZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGlmIChfX3NpemUpCisJeworCSAgaWYgKC0tX19zaXplID4gX19wb3MpCisJICAgIF9fc2l6ZSA9IF9fcG9zOworCSAgZm9yICgrK19fc2l6ZTsgX19zaXplLS0gPiAwOyApCisJICAgIGlmICh0cmFpdHNfdHlwZTo6ZXEodGhpcy0+X01fZGF0YSgpW19fc2l6ZV0sIF9fYykpCisJICAgICAgcmV0dXJuIF9fc2l6ZTsKKwl9CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIHR5cGVuYW1lIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OnNpemVfdHlwZQorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIGZpbmRfZmlyc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBmb3IgKDsgX19uICYmIF9fcG9zIDwgdGhpcy0+c2l6ZSgpOyArK19fcG9zKQorCXsKKwkgIGNvbnN0IF9DaGFyVCogX19wID0gdHJhaXRzX3R5cGU6OmZpbmQoX19zLCBfX24sCisJCQkJCQl0aGlzLT5fTV9kYXRhKClbX19wb3NdKTsKKwkgIGlmIChfX3ApCisJICAgIHJldHVybiBfX3BvczsKKwl9CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIHR5cGVuYW1lIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OnNpemVfdHlwZQorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIGZpbmRfbGFzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgIHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBpZiAoX19zaXplICYmIF9fbikKKwl7CisJICBpZiAoLS1fX3NpemUgPiBfX3BvcykKKwkgICAgX19zaXplID0gX19wb3M7CisJICBkbworCSAgICB7CisJICAgICAgaWYgKHRyYWl0c190eXBlOjpmaW5kKF9fcywgX19uLCB0aGlzLT5fTV9kYXRhKClbX19zaXplXSkpCisJCXJldHVybiBfX3NpemU7CisJICAgIH0KKwkgIHdoaWxlIChfX3NpemUtLSAhPSAwKTsKKwl9CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIHR5cGVuYW1lIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OnNpemVfdHlwZQorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgZm9yICg7IF9fcG9zIDwgdGhpcy0+c2l6ZSgpOyArK19fcG9zKQorCWlmICghdHJhaXRzX3R5cGU6OmZpbmQoX19zLCBfX24sIHRoaXMtPl9NX2RhdGEoKVtfX3Bvc10pKQorCSAgcmV0dXJuIF9fcG9zOworICAgICAgcmV0dXJuIG5wb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICB0eXBlbmFtZSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjpzaXplX3R5cGUKKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICBmaW5kX2ZpcnN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgZm9yICg7IF9fcG9zIDwgdGhpcy0+c2l6ZSgpOyArK19fcG9zKQorCWlmICghdHJhaXRzX3R5cGU6OmVxKHRoaXMtPl9NX2RhdGEoKVtfX3Bvc10sIF9fYykpCisJICByZXR1cm4gX19wb3M7CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIHR5cGVuYW1lIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OnNpemVfdHlwZQorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBzaXplX3R5cGUgX19zaXplID0gdGhpcy0+c2l6ZSgpOworICAgICAgaWYgKF9fc2l6ZSkKKwl7CisJICBpZiAoLS1fX3NpemUgPiBfX3BvcykKKwkgICAgX19zaXplID0gX19wb3M7CisJICBkbworCSAgICB7CisJICAgICAgaWYgKCF0cmFpdHNfdHlwZTo6ZmluZChfX3MsIF9fbiwgdGhpcy0+X01fZGF0YSgpW19fc2l6ZV0pKQorCQlyZXR1cm4gX19zaXplOworCSAgICB9CisJICB3aGlsZSAoX19zaXplLS0pOworCX0KKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgdHlwZW5hbWUgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6c2l6ZV90eXBlCisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6CisgICAgZmluZF9sYXN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeworICAgICAgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGlmIChfX3NpemUpCisJeworCSAgaWYgKC0tX19zaXplID4gX19wb3MpCisJICAgIF9fc2l6ZSA9IF9fcG9zOworCSAgZG8KKwkgICAgeworCSAgICAgIGlmICghdHJhaXRzX3R5cGU6OmVxKHRoaXMtPl9NX2RhdGEoKVtfX3NpemVdLCBfX2MpKQorCQlyZXR1cm4gX19zaXplOworCSAgICB9CisJICB3aGlsZSAoX19zaXplLS0pOworCX0KKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW50CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6CisgICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0cikgY29uc3QKKyAgICB7CisgICAgICBfTV9jaGVjayhfX3BvcywgIl9fdmVyc2Ffc3RyaW5nOjpjb21wYXJlIik7CisgICAgICBfX24gPSBfTV9saW1pdChfX3BvcywgX19uKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX29zaXplID0gX19zdHIuc2l6ZSgpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc3RkOjptaW4oX19uLCBfX29zaXplKTsKKyAgICAgIGludCBfX3IgPSB0cmFpdHNfdHlwZTo6Y29tcGFyZSh0aGlzLT5fTV9kYXRhKCkgKyBfX3BvcywKKwkJCQkgICAgIF9fc3RyLmRhdGEoKSwgX19sZW4pOworICAgICAgaWYgKCFfX3IpCisJX19yID0gdGhpcy0+X1NfY29tcGFyZShfX24sIF9fb3NpemUpOworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGludAorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0ciwKKwkgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjIpIGNvbnN0CisgICAgeworICAgICAgX01fY2hlY2soX19wb3MxLCAiX192ZXJzYV9zdHJpbmc6OmNvbXBhcmUiKTsKKyAgICAgIF9fc3RyLl9NX2NoZWNrKF9fcG9zMiwgIl9fdmVyc2Ffc3RyaW5nOjpjb21wYXJlIik7CisgICAgICBfX24xID0gX01fbGltaXQoX19wb3MxLCBfX24xKTsKKyAgICAgIF9fbjIgPSBfX3N0ci5fTV9saW1pdChfX3BvczIsIF9fbjIpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc3RkOjptaW4oX19uMSwgX19uMik7CisgICAgICBpbnQgX19yID0gdHJhaXRzX3R5cGU6OmNvbXBhcmUodGhpcy0+X01fZGF0YSgpICsgX19wb3MxLAorCQkJCSAgICAgX19zdHIuZGF0YSgpICsgX19wb3MyLCBfX2xlbik7CisgICAgICBpZiAoIV9fcikKKwlfX3IgPSB0aGlzLT5fU19jb21wYXJlKF9fbjEsIF9fbjIpOworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGludAorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIGNvbXBhcmUoY29uc3QgX0NoYXJUKiBfX3MpIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX29zaXplID0gdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc3RkOjptaW4oX19zaXplLCBfX29zaXplKTsKKyAgICAgIGludCBfX3IgPSB0cmFpdHNfdHlwZTo6Y29tcGFyZSh0aGlzLT5fTV9kYXRhKCksIF9fcywgX19sZW4pOworICAgICAgaWYgKCFfX3IpCisJX19yID0gdGhpcy0+X1NfY29tcGFyZShfX3NpemUsIF9fb3NpemUpOworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGludAorICAgIF9fdmVyc2Ffc3RyaW5nIDxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICBjb21wYXJlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKyAgICAgIF9NX2NoZWNrKF9fcG9zLCAiX192ZXJzYV9zdHJpbmc6OmNvbXBhcmUiKTsKKyAgICAgIF9fbjEgPSBfTV9saW1pdChfX3BvcywgX19uMSk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19vc2l6ZSA9IHRyYWl0c190eXBlOjpsZW5ndGgoX19zKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHN0ZDo6bWluKF9fbjEsIF9fb3NpemUpOworICAgICAgaW50IF9fciA9IHRyYWl0c190eXBlOjpjb21wYXJlKHRoaXMtPl9NX2RhdGEoKSArIF9fcG9zLCBfX3MsIF9fbGVuKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IHRoaXMtPl9TX2NvbXBhcmUoX19uMSwgX19vc2l6ZSk7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW50CisgICAgX192ZXJzYV9zdHJpbmcgPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MsCisJICAgIHNpemVfdHlwZSBfX24yKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uMik7CisgICAgICBfTV9jaGVjayhfX3BvcywgIl9fdmVyc2Ffc3RyaW5nOjpjb21wYXJlIik7CisgICAgICBfX24xID0gX01fbGltaXQoX19wb3MsIF9fbjEpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc3RkOjptaW4oX19uMSwgX19uMik7CisgICAgICBpbnQgX19yID0gdHJhaXRzX3R5cGU6OmNvbXBhcmUodGhpcy0+X01fZGF0YSgpICsgX19wb3MsIF9fcywgX19sZW4pOworICAgICAgaWYgKCFfX3IpCisJX19yID0gdGhpcy0+X1NfY29tcGFyZShfX24xLCBfX24yKTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKyAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pbiwKKwkgICAgICAgX19nbnVfY3h4OjpfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0FsbG9jLCBfQmFzZT4mIF9fc3RyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICAgICAgICAgICAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICAgICAgIF9faW9zX2Jhc2U7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6X192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fc3RyaW5nX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppbnRfdHlwZQkJX19pbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19zdHJpbmdfdHlwZTo6c2l6ZV90eXBlCQlfX3NpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgY3R5cGU8X0NoYXJUPgkJCQlfX2N0eXBlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fY3R5cGVfdHlwZTo6Y3R5cGVfYmFzZSAgICAgICAgIF9fY3R5cGVfYmFzZTsKKworICAgICAgX19zaXplX3R5cGUgX19leHRyYWN0ZWQgPSAwOworICAgICAgdHlwZW5hbWUgX19pb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IF9faW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6c2VudHJ5IF9fY2VyYihfX2luLCBmYWxzZSk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICAvLyBBdm9pZCByZWFsbG9jYXRpb24gZm9yIGNvbW1vbiBjYXNlLgorCSAgICAgIF9fc3RyLmVyYXNlKCk7CisJICAgICAgX0NoYXJUIF9fYnVmWzEyOF07CisJICAgICAgX19zaXplX3R5cGUgX19sZW4gPSAwOworCSAgICAgIGNvbnN0IHN0cmVhbXNpemUgX193ID0gX19pbi53aWR0aCgpOworCSAgICAgIGNvbnN0IF9fc2l6ZV90eXBlIF9fbiA9IF9fdyA+IDAgPyBzdGF0aWNfY2FzdDxfX3NpemVfdHlwZT4oX193KQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fc3RyLm1heF9zaXplKCk7CisJICAgICAgY29uc3QgX19jdHlwZV90eXBlJiBfX2N0ID0gdXNlX2ZhY2V0PF9fY3R5cGVfdHlwZT4oX19pbi5nZXRsb2MoKSk7CisJICAgICAgY29uc3QgX19pbnRfdHlwZSBfX2VvZiA9IF9UcmFpdHM6OmVvZigpOworCSAgICAgIF9faW50X3R5cGUgX19jID0gX19pbi5yZGJ1ZigpLT5zZ2V0YygpOworCisJICAgICAgd2hpbGUgKF9fZXh0cmFjdGVkIDwgX19uCisJCSAgICAgJiYgIV9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX19lb2YpCisJCSAgICAgJiYgIV9fY3QuaXMoX19jdHlwZV9iYXNlOjpzcGFjZSwKKwkJCQkgX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYykpKQorCQl7CisJCSAgaWYgKF9fbGVuID09IHNpemVvZihfX2J1ZikgLyBzaXplb2YoX0NoYXJUKSkKKwkJICAgIHsKKwkJICAgICAgX19zdHIuYXBwZW5kKF9fYnVmLCBzaXplb2YoX19idWYpIC8gc2l6ZW9mKF9DaGFyVCkpOworCQkgICAgICBfX2xlbiA9IDA7CisJCSAgICB9CisJCSAgX19idWZbX19sZW4rK10gPSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKTsKKwkJICArK19fZXh0cmFjdGVkOworCQkgIF9fYyA9IF9faW4ucmRidWYoKS0+c25leHRjKCk7CisJCX0KKwkgICAgICBfX3N0ci5hcHBlbmQoX19idWYsIF9fbGVuKTsKKworCSAgICAgIGlmIChfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKSkKKwkJX19lcnIgfD0gX19pb3NfYmFzZTo6ZW9mYml0OworCSAgICAgIF9faW4ud2lkdGgoMCk7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIF9faW4uX01fc2V0c3RhdGUoX19pb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAgICAgLy8gOTEuIERlc2NyaXB0aW9uIG9mIG9wZXJhdG9yPj4gYW5kIGdldGxpbmUoKSBmb3Igc3RyaW5nPD4KKwkgICAgICAvLyBtaWdodCBjYXVzZSBlbmRsZXNzIGxvb3AKKwkgICAgICBfX2luLl9NX3NldHN0YXRlKF9faW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgIH0KKwl9CisgICAgICAvLyAyMTEuICBvcGVyYXRvcj4+KGlzdHJlYW0mLCBzdHJpbmcmKSBkb2Vzbid0IHNldCBmYWlsYml0CisgICAgICBpZiAoIV9fZXh0cmFjdGVkKQorCV9fZXJyIHw9IF9faW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICBpZiAoX19lcnIpCisJX19pbi5zZXRzdGF0ZShfX2Vycik7CisgICAgICByZXR1cm4gX19pbjsKKyAgICB9ICAgICAgCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgZ2V0bGluZShiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faW4sCisJICAgIF9fZ251X2N4eDo6X192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19zdHIsCisJICAgIF9DaGFyVCBfX2RlbGltKQorICAgIHsKKyAgICAgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+CSAgICAgICAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICAgICAgIF9faW9zX2Jhc2U7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6X192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fc3RyaW5nX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppbnRfdHlwZQkJX19pbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19zdHJpbmdfdHlwZTo6c2l6ZV90eXBlCQlfX3NpemVfdHlwZTsKKworICAgICAgX19zaXplX3R5cGUgX19leHRyYWN0ZWQgPSAwOworICAgICAgY29uc3QgX19zaXplX3R5cGUgX19uID0gX19zdHIubWF4X3NpemUoKTsKKyAgICAgIHR5cGVuYW1lIF9faW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBfX2lvc19iYXNlOjpnb29kYml0OworICAgICAgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6OnNlbnRyeSBfX2NlcmIoX19pbiwgdHJ1ZSk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICAvLyBBdm9pZCByZWFsbG9jYXRpb24gZm9yIGNvbW1vbiBjYXNlLgorCSAgICAgIF9fc3RyLmVyYXNlKCk7CisJICAgICAgX0NoYXJUIF9fYnVmWzEyOF07CisJICAgICAgX19zaXplX3R5cGUgX19sZW4gPSAwOworCSAgICAgIGNvbnN0IF9faW50X3R5cGUgX19pZGVsaW0gPSBfVHJhaXRzOjp0b19pbnRfdHlwZShfX2RlbGltKTsKKwkgICAgICBjb25zdCBfX2ludF90eXBlIF9fZW9mID0gX1RyYWl0czo6ZW9mKCk7CisJICAgICAgX19pbnRfdHlwZSBfX2MgPSBfX2luLnJkYnVmKCktPnNnZXRjKCk7CisKKwkgICAgICB3aGlsZSAoX19leHRyYWN0ZWQgPCBfX24KKwkJICAgICAmJiAhX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikKKwkJICAgICAmJiAhX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfX2lkZWxpbSkpCisJCXsKKwkJICBpZiAoX19sZW4gPT0gc2l6ZW9mKF9fYnVmKSAvIHNpemVvZihfQ2hhclQpKQorCQkgICAgeworCQkgICAgICBfX3N0ci5hcHBlbmQoX19idWYsIHNpemVvZihfX2J1ZikgLyBzaXplb2YoX0NoYXJUKSk7CisJCSAgICAgIF9fbGVuID0gMDsKKwkJICAgIH0KKwkJICBfX2J1ZltfX2xlbisrXSA9IF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpOworCQkgICsrX19leHRyYWN0ZWQ7CisJCSAgX19jID0gX19pbi5yZGJ1ZigpLT5zbmV4dGMoKTsKKwkJfQorCSAgICAgIF9fc3RyLmFwcGVuZChfX2J1ZiwgX19sZW4pOworCisJICAgICAgaWYgKF9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKQorCQlfX2VyciB8PSBfX2lvc19iYXNlOjplb2ZiaXQ7CisJICAgICAgZWxzZSBpZiAoX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfX2lkZWxpbSkpCisJCXsKKwkJICArK19fZXh0cmFjdGVkOwkJICAKKwkJICBfX2luLnJkYnVmKCktPnNidW1wYygpOworCQl9CisJICAgICAgZWxzZQorCQlfX2VyciB8PSBfX2lvc19iYXNlOjpmYWlsYml0OworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICBfX2luLl9NX3NldHN0YXRlKF9faW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgICAgIC8vIDkxLiBEZXNjcmlwdGlvbiBvZiBvcGVyYXRvcj4+IGFuZCBnZXRsaW5lKCkgZm9yIHN0cmluZzw+CisJICAgICAgLy8gbWlnaHQgY2F1c2UgZW5kbGVzcyBsb29wCisJICAgICAgX19pbi5fTV9zZXRzdGF0ZShfX2lvc19iYXNlOjpiYWRiaXQpOworCSAgICB9CisJfQorICAgICAgaWYgKCFfX2V4dHJhY3RlZCkKKwlfX2VyciB8PSBfX2lvc19iYXNlOjpmYWlsYml0OworICAgICAgaWYgKF9fZXJyKQorCV9faW4uc2V0c3RhdGUoX19lcnIpOworICAgICAgcmV0dXJuIF9faW47CisgICAgfSAgICAgIAorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBfVlNUUklOR19UQ0MKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZXh0L3ZzdHJpbmdfZndkLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC92c3RyaW5nX2Z3ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MTdlOTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC92c3RyaW5nX2Z3ZC5oCkBAIC0wLDAgKzEsODkgQEAKKy8vIDx2c3RyaW5nLmg+IEZvcndhcmQgZGVjbGFyYXRpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvdnN0cmluZ19md2QuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2V4dC92c3RyaW5nLmh9CisgKi8KKworI2lmbmRlZiBfVlNUUklOR19GV0RfSAorI2RlZmluZSBfVlNUUklOR19GV0RfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9jaGFyX3RyYWl0cy5oPgorI2luY2x1ZGUgPGJpdHMvYWxsb2NhdG9yLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBfX3Nzb19zdHJpbmdfYmFzZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBfX3JjX3N0cmluZ19iYXNlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPiwKKyAgICAgICAgICAgdHlwZW5hbWUgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8X0NoYXJUPiwKKwkgICB0ZW1wbGF0ZQorCSAgIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZSA9IF9fc3NvX3N0cmluZ19iYXNlPgorICAgIGNsYXNzIF9fdmVyc2Ffc3RyaW5nOworCisgIHR5cGVkZWYgX192ZXJzYV9zdHJpbmc8Y2hhcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3ZzdHJpbmc7CisgIHR5cGVkZWYgX192c3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Nzb19zdHJpbmc7CisgIHR5cGVkZWYgCisgIF9fdmVyc2Ffc3RyaW5nPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4sCisJCSBzdGQ6OmFsbG9jYXRvcjxjaGFyPiwgX19yY19zdHJpbmdfYmFzZT4gICAgX19yY19zdHJpbmc7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0eXBlZGVmIF9fdmVyc2Ffc3RyaW5nPHdjaGFyX3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgX193dnN0cmluZzsKKyAgdHlwZWRlZiBfX3d2c3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fd3Nzb19zdHJpbmc7CisgIHR5cGVkZWYKKyAgX192ZXJzYV9zdHJpbmc8d2NoYXJfdCwgc3RkOjpjaGFyX3RyYWl0czx3Y2hhcl90PiwKKwkJIHN0ZDo6YWxsb2NhdG9yPHdjaGFyX3Q+LCBfX3JjX3N0cmluZ19iYXNlPiBfX3dyY19zdHJpbmc7CisjZW5kaWYgIAorCisjaWYgKChfX2NwbHVzcGx1cyA+PSAyMDExMDNMKSBcCisgICAgICYmIGRlZmluZWQoX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxKSkKKworICB0eXBlZGVmIF9fdmVyc2Ffc3RyaW5nPGNoYXIxNl90PiAgICAgICAgICAgICAgICAgICAgICAgICAgX191MTZ2c3RyaW5nOworICB0eXBlZGVmIF9fdTE2dnN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191MTZzc29fc3RyaW5nOworICB0eXBlZGVmIAorICBfX3ZlcnNhX3N0cmluZzxjaGFyMTZfdCwgc3RkOjpjaGFyX3RyYWl0czxjaGFyMTZfdD4sCisJCSBzdGQ6OmFsbG9jYXRvcjxjaGFyMTZfdD4sIF9fcmNfc3RyaW5nX2Jhc2U+IF9fdTE2cmNfc3RyaW5nOworCisgIHR5cGVkZWYgX192ZXJzYV9zdHJpbmc8Y2hhcjMyX3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UzMnZzdHJpbmc7CisgIHR5cGVkZWYgX191MzJ2c3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UzMnNzb19zdHJpbmc7CisgIHR5cGVkZWYgCisgIF9fdmVyc2Ffc3RyaW5nPGNoYXIzMl90LCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXIzMl90PiwKKwkJIHN0ZDo6YWxsb2NhdG9yPGNoYXIzMl90PiwgX19yY19zdHJpbmdfYmFzZT4gX191MzJyY19zdHJpbmc7CisKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfVlNUUklOR19GV0RfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvdnN0cmluZ191dGlsLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2V4dC92c3RyaW5nX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjI4MjM2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9leHQvdnN0cmluZ191dGlsLmgKQEAgLTAsMCArMSwxODMgQEAKKy8vIFZlcnNhdGlsZSBzdHJpbmcgdXRpbGl0eSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L3ZzdHJpbmdfdXRpbC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZXh0L3ZzdHJpbmcuaH0KKyAqLworCisjaWZuZGVmIF9WU1RSSU5HX1VUSUxfSAorI2RlZmluZSBfVlNUUklOR19VVElMX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxleHQvdnN0cmluZ19md2QuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2Z1bmN0aW9uLmg+ICAvLyBGb3IgbGVzcworI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNpbmNsdWRlIDxiaXRzL2xvY2FsZWZ3ZC5oPgorI2luY2x1ZGUgPGJpdHMvb3N0cmVhbV9pbnNlcnQuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9pdGVyYXRvci5oPgorI2luY2x1ZGUgPGV4dC9udW1lcmljX3RyYWl0cy5oPgorI2luY2x1ZGUgPGJpdHMvbW92ZS5oPgorI2luY2x1ZGUgPGJpdHMvcmFuZ2VfYWNjZXNzLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX192c3RyaW5nX3V0aWxpdHkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9DaGFyVD46Om90aGVyIF9DaGFyVF9hbGxvY190eXBlOworCisgICAgICB0eXBlZGVmIF9UcmFpdHMJCQkJCSAgICB0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlCQkgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NoYXJUX2FsbG9jX3R5cGU6OnNpemVfdHlwZQkgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ2hhclRfYWxsb2NfdHlwZTo6ZGlmZmVyZW5jZV90eXBlICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ2hhclRfYWxsb2NfdHlwZTo6cG9pbnRlcgkgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NoYXJUX2FsbG9jX3R5cGU6OmNvbnN0X3BvaW50ZXIJICAgIGNvbnN0X3BvaW50ZXI7CisKKyAgICAgIC8vIEZvciBfX3Nzb19zdHJpbmcuCisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6CisgICAgICBfX25vcm1hbF9pdGVyYXRvcjxwb2ludGVyLCBfX2dudV9jeHg6OgorCQkJX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsCisJCQkJICAgICAgIF9fc3NvX3N0cmluZ19iYXNlPiA+CisJX19zc29faXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6CisgICAgICBfX25vcm1hbF9pdGVyYXRvcjxjb25zdF9wb2ludGVyLCBfX2dudV9jeHg6OgorCQkJX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsCisJCQkJICAgICAgIF9fc3NvX3N0cmluZ19iYXNlPiA+CisJX19jb25zdF9zc29faXRlcmF0b3I7CisKKyAgICAgIC8vIEZvciBfX3JjX3N0cmluZy4KKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjoKKyAgICAgIF9fbm9ybWFsX2l0ZXJhdG9yPHBvaW50ZXIsIF9fZ251X2N4eDo6CisJCQlfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywKKwkJCQkgICAgICAgX19yY19zdHJpbmdfYmFzZT4gPgorCV9fcmNfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6CisgICAgICBfX25vcm1hbF9pdGVyYXRvcjxjb25zdF9wb2ludGVyLCBfX2dudV9jeHg6OgorCQkJX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsCisJCQkJICAgICAgIF9fcmNfc3RyaW5nX2Jhc2U+ID4KKwlfX2NvbnN0X3JjX2l0ZXJhdG9yOworCisgICAgICAvLyBOQjogIFdoZW4gdGhlIGFsbG9jYXRvciBpcyBlbXB0eSwgZGVyaXZpbmcgZnJvbSBpdCBzYXZlcyBzcGFjZQorICAgICAgLy8gKGh0dHA6Ly93d3cuY2FudHJpcC5vcmcvZW1wdHlvcHQuaHRtbCkuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MxPgorCXN0cnVjdCBfQWxsb2NfaGlkZXIKKwk6IHB1YmxpYyBfQWxsb2MxCisJeworCSAgX0FsbG9jX2hpZGVyKF9DaGFyVCogX19wdHIpCisJICA6IF9BbGxvYzEoKSwgX01fcChfX3B0cikgeyB9CisKKwkgIF9BbGxvY19oaWRlcihjb25zdCBfQWxsb2MxJiBfX2EsIF9DaGFyVCogX19wdHIpCisJICA6IF9BbGxvYzEoX19hKSwgX01fcChfX3B0cikgeyB9CisKKwkgIF9DaGFyVCogIF9NX3A7IC8vIFRoZSBhY3R1YWwgZGF0YS4KKwl9OworCisgICAgICAvLyBXaGVuIF9fbiA9IDEgd2F5IGZhc3RlciB0aGFuIHRoZSBnZW5lcmFsIG11bHRpY2hhcgorICAgICAgLy8gdHJhaXRzX3R5cGU6OmNvcHkvbW92ZS9hc3NpZ24uCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfY29weShfQ2hhclQqIF9fZCwgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCisgICAgICB7CisJaWYgKF9fbiA9PSAxKQorCSAgdHJhaXRzX3R5cGU6OmFzc2lnbigqX19kLCAqX19zKTsKKwllbHNlCisJICB0cmFpdHNfdHlwZTo6Y29weShfX2QsIF9fcywgX19uKTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX21vdmUoX0NoYXJUKiBfX2QsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQorICAgICAgeworCWlmIChfX24gPT0gMSkKKwkgIHRyYWl0c190eXBlOjphc3NpZ24oKl9fZCwgKl9fcyk7CisJZWxzZQorCSAgdHJhaXRzX3R5cGU6Om1vdmUoX19kLCBfX3MsIF9fbik7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19hc3NpZ24oX0NoYXJUKiBfX2QsIHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgICB7CisJaWYgKF9fbiA9PSAxKQorCSAgdHJhaXRzX3R5cGU6OmFzc2lnbigqX19kLCBfX2MpOworCWVsc2UKKwkgIHRyYWl0c190eXBlOjphc3NpZ24oX19kLCBfX24sIF9fYyk7CisgICAgICB9CisKKyAgICAgIC8vIF9TX2NvcHlfY2hhcnMgaXMgYSBzZXBhcmF0ZSB0ZW1wbGF0ZSB0byBwZXJtaXQgc3BlY2lhbGl6YXRpb24KKyAgICAgIC8vIHRvIG9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgcG9pbnRlcnMgYXMgaXRlcmF0b3JzLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorCXN0YXRpYyB2b2lkCisJX1NfY29weV9jaGFycyhfQ2hhclQqIF9fcCwgX0l0ZXJhdG9yIF9fazEsIF9JdGVyYXRvciBfX2syKQorCXsKKwkgIGZvciAoOyBfX2sxICE9IF9fazI7ICsrX19rMSwgKytfX3ApCisJICAgIHRyYWl0c190eXBlOjphc3NpZ24oKl9fcCwgKl9fazEpOyAvLyBUaGVzZSB0eXBlcyBhcmUgb2ZmLgorCX0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2NvcHlfY2hhcnMoX0NoYXJUKiBfX3AsIF9fc3NvX2l0ZXJhdG9yIF9fazEsIF9fc3NvX2l0ZXJhdG9yIF9fazIpCisgICAgICB7IF9TX2NvcHlfY2hhcnMoX19wLCBfX2sxLmJhc2UoKSwgX19rMi5iYXNlKCkpOyB9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19jb3B5X2NoYXJzKF9DaGFyVCogX19wLCBfX2NvbnN0X3Nzb19pdGVyYXRvciBfX2sxLAorCQkgICAgX19jb25zdF9zc29faXRlcmF0b3IgX19rMikKKyAgICAgIHsgX1NfY29weV9jaGFycyhfX3AsIF9fazEuYmFzZSgpLCBfX2syLmJhc2UoKSk7IH0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2NvcHlfY2hhcnMoX0NoYXJUKiBfX3AsIF9fcmNfaXRlcmF0b3IgX19rMSwgX19yY19pdGVyYXRvciBfX2syKQorICAgICAgeyBfU19jb3B5X2NoYXJzKF9fcCwgX19rMS5iYXNlKCksIF9fazIuYmFzZSgpKTsgfQorCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfY29weV9jaGFycyhfQ2hhclQqIF9fcCwgX19jb25zdF9yY19pdGVyYXRvciBfX2sxLAorCQkgICAgX19jb25zdF9yY19pdGVyYXRvciBfX2syKQorICAgICAgeyBfU19jb3B5X2NoYXJzKF9fcCwgX19rMS5iYXNlKCksIF9fazIuYmFzZSgpKTsgfQorCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfY29weV9jaGFycyhfQ2hhclQqIF9fcCwgX0NoYXJUKiBfX2sxLCBfQ2hhclQqIF9fazIpCisgICAgICB7IF9TX2NvcHkoX19wLCBfX2sxLCBfX2syIC0gX19rMSk7IH0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2NvcHlfY2hhcnMoX0NoYXJUKiBfX3AsIGNvbnN0IF9DaGFyVCogX19rMSwgY29uc3QgX0NoYXJUKiBfX2syKQorICAgICAgeyBfU19jb3B5KF9fcCwgX19rMSwgX19rMiAtIF9fazEpOyB9CisKKyAgICAgIHN0YXRpYyBpbnQKKyAgICAgIF9TX2NvbXBhcmUoc2l6ZV90eXBlIF9fbjEsIHNpemVfdHlwZSBfX24yKQorICAgICAgeworCWNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2QgPSBkaWZmZXJlbmNlX3R5cGUoX19uMSAtIF9fbjIpOworCisJaWYgKF9fZCA+IF9fbnVtZXJpY190cmFpdHNfaW50ZWdlcjxpbnQ+OjpfX21heCkKKwkgIHJldHVybiBfX251bWVyaWNfdHJhaXRzX2ludGVnZXI8aW50Pjo6X19tYXg7CisJZWxzZSBpZiAoX19kIDwgX19udW1lcmljX3RyYWl0c19pbnRlZ2VyPGludD46Ol9fbWluKQorCSAgcmV0dXJuIF9fbnVtZXJpY190cmFpdHNfaW50ZWdlcjxpbnQ+OjpfX21pbjsKKwllbHNlCisJICByZXR1cm4gaW50KF9fZCk7CisgICAgICB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX1ZTVFJJTkdfVVRJTF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2ZlbnYuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYjgyNWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2ZlbnYuaApAQCAtMCwwICsxLDgxIEBACisvLyAtKi0gQysrIC0qLSBjb21wYXRpYmlsaXR5IGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGZlbnYuaAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9GRU5WX0gKKyNkZWZpbmUgX0dMSUJDWFhfRkVOVl9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpZiBfR0xJQkNYWF9IQVZFX0ZFTlZfSAorIyBpbmNsdWRlX25leHQgPGZlbnYuaD4KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9GRU5WX1RSMQorCisjdW5kZWYgZmVjbGVhcmV4Y2VwdAorI3VuZGVmIGZlZ2V0ZXhjZXB0ZmxhZworI3VuZGVmIGZlcmFpc2VleGNlcHQKKyN1bmRlZiBmZXNldGV4Y2VwdGZsYWcKKyN1bmRlZiBmZXRlc3RleGNlcHQKKyN1bmRlZiBmZWdldHJvdW5kCisjdW5kZWYgZmVzZXRyb3VuZAorI3VuZGVmIGZlZ2V0ZW52CisjdW5kZWYgZmVob2xkZXhjZXB0CisjdW5kZWYgZmVzZXRlbnYKKyN1bmRlZiBmZXVwZGF0ZWVudgorCituYW1lc3BhY2Ugc3RkCit7CisgIC8vIHR5cGVzCisgIHVzaW5nIDo6ZmVudl90OworICB1c2luZyA6OmZleGNlcHRfdDsKKworICAvLyBmdW5jdGlvbnMKKyAgdXNpbmcgOjpmZWNsZWFyZXhjZXB0OworICB1c2luZyA6OmZlZ2V0ZXhjZXB0ZmxhZzsKKyAgdXNpbmcgOjpmZXJhaXNlZXhjZXB0OworICB1c2luZyA6OmZlc2V0ZXhjZXB0ZmxhZzsKKyAgdXNpbmcgOjpmZXRlc3RleGNlcHQ7CisKKyAgdXNpbmcgOjpmZWdldHJvdW5kOworICB1c2luZyA6OmZlc2V0cm91bmQ7CisKKyAgdXNpbmcgOjpmZWdldGVudjsKKyAgdXNpbmcgOjpmZWhvbGRleGNlcHQ7CisgIHVzaW5nIDo6ZmVzZXRlbnY7CisgIHVzaW5nIDo6ZmV1cGRhdGVlbnY7Cit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVVNFX0M5OV9GRU5WX1RSMQorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vIF9HTElCQ1hYX0ZFTlZfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9mb3J3YXJkX2xpc3QgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2ZvcndhcmRfbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmVkMmFkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9mb3J3YXJkX2xpc3QKQEAgLTAsMCArMSw1MiBAQAorLy8gPGZvcndhcmRfbGlzdD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvZm9yd2FyZF9saXN0CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0ZPUldBUkRfTElTVAorI2RlZmluZSBfR0xJQkNYWF9GT1JXQVJEX0xJU1QgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorCisjaW5jbHVkZSA8Yml0cy9mb3J3YXJkX2xpc3QuaD4KKyNpbmNsdWRlIDxiaXRzL3JhbmdlX2FjY2Vzcy5oPgorI2luY2x1ZGUgPGJpdHMvZm9yd2FyZF9saXN0LnRjYz4KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjIGluY2x1ZGUgPGRlYnVnL2ZvcndhcmRfbGlzdD4KKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfUFJPRklMRQorIyBpbmNsdWRlIDxwcm9maWxlL2ZvcndhcmRfbGlzdD4KKyNlbmRpZgorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vIF9HTElCQ1hYX0ZPUldBUkRfTElTVApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9mc3RyZWFtIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9mc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZTVjM2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2ZzdHJlYW0KQEAgLTAsMCArMSw5MzggQEAKKy8vIEZpbGUgYmFzZWQgc3RyZWFtcyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9mc3RyZWFtCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjcuOCAgRmlsZS1iYXNlZCBzdHJlYW1zCisvLworCisjaWZuZGVmIF9HTElCQ1hYX0ZTVFJFQU0KKyNkZWZpbmUgX0dMSUJDWFhfRlNUUkVBTSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGlzdHJlYW0+CisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxiaXRzL2NvZGVjdnQuaD4KKyNpbmNsdWRlIDxjc3RkaW8+ICAgICAgICAgICAgIC8vIEZvciBCVUZTSVoKKyNpbmNsdWRlIDxiaXRzL2Jhc2ljX2ZpbGUuaD4gIC8vIEZvciBfX2Jhc2ljX2ZpbGUsIF9fY19sb2NrCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPHN0cmluZz4gICAgICAgICAgICAgLy8gRm9yIHN0ZDo6c3RyaW5nIG92ZXJsb2Fkcy4KKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gWzI3LjguMS4xXSB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19maWxlYnVmCisgIC8qKgorICAgKiAgQGJyaWVmICBUaGUgYWN0dWFsIHdvcmsgb2YgaW5wdXQgYW5kIG91dHB1dCAoZm9yIGZpbGVzKS4KKyAgICogIEBpbmdyb3VwIGlvCisgICAqCisgICAqICBAdHBhcmFtIF9DaGFyVCAgVHlwZSBvZiBjaGFyYWN0ZXIgc3RyZWFtLgorICAgKiAgQHRwYXJhbSBfVHJhaXRzICBUcmFpdHMgZm9yIGNoYXJhY3RlciB0eXBlLCBkZWZhdWx0cyB0bworICAgKiAgICAgICAgICAgICAgICAgICBjaGFyX3RyYWl0czxfQ2hhclQ+LgorICAgKgorICAgKiAgVGhpcyBjbGFzcyBhc3NvY2lhdGVzIGJvdGggaXRzIGlucHV0IGFuZCBvdXRwdXQgc2VxdWVuY2Ugd2l0aCBhbgorICAgKiAgZXh0ZXJuYWwgZGlzayBmaWxlLCBhbmQgbWFpbnRhaW5zIGEgam9pbnQgZmlsZSBwb3NpdGlvbiBmb3IgYm90aAorICAgKiAgc2VxdWVuY2VzLiAgTWFueSBvZiBpdHMgc2VtYW50aWNzIGFyZSBkZXNjcmliZWQgaW4gdGVybXMgb2Ygc2ltaWxhcgorICAgKiAgYmVoYXZpb3IgaW4gdGhlIFN0YW5kYXJkIEMgTGlicmFyeSdzIEBjIEZJTEUgc3RyZWFtcy4KKyAgICoKKyAgICogIFJlcXVpcmVtZW50cyBvbiB0cmFpdHNfdHlwZSwgc3BlY2lmaWMgdG8gdGhpcyBjbGFzczoKKyAgICogIC0gdHJhaXRzX3R5cGU6OnBvc190eXBlIG11c3QgYmUgZnBvczx0cmFpdHNfdHlwZTo6c3RhdGVfdHlwZT4KKyAgICogIC0gdHJhaXRzX3R5cGU6Om9mZl90eXBlIG11c3QgYmUgc3RyZWFtb2ZmCisgICAqICAtIHRyYWl0c190eXBlOjpzdGF0ZV90eXBlIG11c3QgYmUgQXNzaWduYWJsZSBhbmQgRGVmYXVsdENvbnN0cnVjdGlibGUsCisgICAqICAtIHRyYWl0c190eXBlOjpzdGF0ZV90eXBlKCkgbXVzdCBiZSB0aGUgaW5pdGlhbCBzdGF0ZSBmb3IgY29kZWN2dC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBjbGFzcyBiYXNpY19maWxlYnVmIDogcHVibGljIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBjaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIHRyYWl0c190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlIAkJcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSAJCW9mZl90eXBlOworCisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiAgCV9fc3RyZWFtYnVmX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX2ZpbGVidWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4gICAgIF9fZmlsZWJ1Zl90eXBlOworICAgICAgdHlwZWRlZiBfX2Jhc2ljX2ZpbGU8Y2hhcj4JCSAgICAgICAgX19maWxlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpzdGF0ZV90eXBlICAgICAgICAgIF9fc3RhdGVfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29kZWN2dDxjaGFyX3R5cGUsIGNoYXIsIF9fc3RhdGVfdHlwZT4gICAgX19jb2RlY3Z0X3R5cGU7CisKKyAgICAgIGZyaWVuZCBjbGFzcyBpb3NfYmFzZTsgLy8gRm9yIHN5bmNfd2l0aF9zdGRpby4KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIERhdGEgTWVtYmVyczoKKyAgICAgIC8vIE1UIGxvY2sgaW5oZXJpdGVkIGZyb20gbGliaW8gb3Igb3RoZXIgbG93LWxldmVsIGlvIGxpYnJhcnkuCisgICAgICBfX2NfbG9jayAgICAgICAgICAJX01fbG9jazsKKworICAgICAgLy8gRXh0ZXJuYWwgYnVmZmVyLgorICAgICAgX19maWxlX3R5cGUgCQlfTV9maWxlOworCisgICAgICAvLy8gUGxhY2UgdG8gc3Rhc2ggaW4gfHwgb3V0IHx8IGluIHwgb3V0IHNldHRpbmdzIGZvciBjdXJyZW50IGZpbGVidWYuCisgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgCV9NX21vZGU7CisKKyAgICAgIC8vIEJlZ2lubmluZyBzdGF0ZSB0eXBlIGZvciBjb2RlY3Z0LgorICAgICAgX19zdGF0ZV90eXBlIAkJX01fc3RhdGVfYmVnOworCisgICAgICAvLyBEdXJpbmcgb3V0cHV0LCB0aGUgc3RhdGUgdGhhdCBjb3JyZXNwb25kcyB0byBwcHRyKCksCisgICAgICAvLyBkdXJpbmcgaW5wdXQsIHRoZSBzdGF0ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGVncHRyKCkgYW5kCisgICAgICAvLyBfTV9leHRfbmV4dC4KKyAgICAgIF9fc3RhdGVfdHlwZQkJX01fc3RhdGVfY3VyOworCisgICAgICAvLyBOb3QgdXNlZCBmb3Igb3V0cHV0LiBEdXJpbmcgaW5wdXQsIHRoZSBzdGF0ZSB0aGF0IGNvcnJlc3BvbmRzCisgICAgICAvLyB0byBlYmFjaygpIGFuZCBfTV9leHRfYnVmLgorICAgICAgX19zdGF0ZV90eXBlCQlfTV9zdGF0ZV9sYXN0OworCisgICAgICAvLy8gUG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGludGVybmFsIGJ1ZmZlci4KKyAgICAgIGNoYXJfdHlwZSoJCV9NX2J1ZjsgCQorCisgICAgICAvKioKKyAgICAgICAqICBBY3R1YWwgc2l6ZSBvZiBpbnRlcm5hbCBidWZmZXIuIFRoaXMgbnVtYmVyIGlzIGVxdWFsIHRvIHRoZSBzaXplCisgICAgICAgKiAgb2YgdGhlIHB1dCBhcmVhICsgMSBwb3NpdGlvbiwgcmVzZXJ2ZWQgZm9yIHRoZSBvdmVyZmxvdyBjaGFyIG9mCisgICAgICAgKiAgYSBmdWxsIGFyZWEuCisgICAgICAgKi8KKyAgICAgIHNpemVfdAkJCV9NX2J1Zl9zaXplOworCisgICAgICAvLyBTZXQgaWZmIF9NX2J1ZiBpcyBhbGxvY2F0ZWQgbWVtb3J5IGZyb20gX01fYWxsb2NhdGVfaW50ZXJuYWxfYnVmZmVyLgorICAgICAgYm9vbAkJCV9NX2J1Zl9hbGxvY2F0ZWQ7CisKKyAgICAgIC8qKgorICAgICAgICogIF9NX3JlYWRpbmcgPT0gZmFsc2UgJiYgX01fd3JpdGluZyA9PSBmYWxzZSBmb3IgQGIgdW5jb21taXR0ZWQgbW9kZTsKKyAgICAgICAqICBfTV9yZWFkaW5nID09IHRydWUgZm9yIEBiIHJlYWQgbW9kZTsKKyAgICAgICAqICBfTV93cml0aW5nID09IHRydWUgZm9yIEBiIHdyaXRlIG1vZGU7CisgICAgICAgKgorICAgICAgICogIE5COiBfTV9yZWFkaW5nID09IHRydWUgJiYgX01fd3JpdGluZyA9PSB0cnVlIGlzIHVudXNlZC4KKyAgICAgICAqLworICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICBfTV9yZWFkaW5nOworICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICBfTV93cml0aW5nOworCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBOZWNlc3NhcnkgYml0cyBmb3IgcHV0YmFjayBidWZmZXIgbWFuYWdlbWVudC4KKyAgICAgICAqCisgICAgICAgKiAgQG5vdGUgcGJhY2tzIG9mIG92ZXIgb25lIGNoYXJhY3RlciBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisgICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZQkJCV9NX3BiYWNrOworICAgICAgY2hhcl90eXBlKgkJX01fcGJhY2tfY3VyX3NhdmU7CisgICAgICBjaGFyX3R5cGUqCQlfTV9wYmFja19lbmRfc2F2ZTsKKyAgICAgIGJvb2wJCQlfTV9wYmFja19pbml0OworICAgICAgLy9AfQorCisgICAgICAvLyBDYWNoZWQgY29kZWN2dCBmYWNldC4KKyAgICAgIGNvbnN0IF9fY29kZWN2dF90eXBlKiAJX01fY29kZWN2dDsKKworICAgICAgLyoqCisgICAgICAgKiAgQnVmZmVyIGZvciBleHRlcm5hbCBjaGFyYWN0ZXJzLiBVc2VkIGZvciBpbnB1dCB3aGVuCisgICAgICAgKiAgY29kZWN2dDo6YWx3YXlzX25vY29udigpID09IGZhbHNlLiBXaGVuIHZhbGlkLCB0aGlzIGNvcnJlc3BvbmRzCisgICAgICAgKiAgdG8gZWJhY2soKS4KKyAgICAgICAqLworICAgICAgY2hhcioJCQlfTV9leHRfYnVmOworCisgICAgICAvKioKKyAgICAgICAqICBTaXplIG9mIGJ1ZmZlciBoZWxkIGJ5IF9NX2V4dF9idWYuCisgICAgICAgKi8KKyAgICAgIHN0cmVhbXNpemUJCV9NX2V4dF9idWZfc2l6ZTsKKworICAgICAgLyoqCisgICAgICAgKiAgUG9pbnRlcnMgaW50byB0aGUgYnVmZmVyIGhlbGQgYnkgX01fZXh0X2J1ZiB0aGF0IGRlbGltaXQgYQorICAgICAgICogIHN1YnNlcXVlbmNlIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIHJlYWQgYnV0IG5vdCB5ZXQgY29udmVydGVkLgorICAgICAgICogIFdoZW4gdmFsaWQsIF9NX2V4dF9uZXh0IGNvcnJlc3BvbmRzIHRvIGVncHRyKCkuCisgICAgICAgKi8KKyAgICAgIGNvbnN0IGNoYXIqCQlfTV9leHRfbmV4dDsKKyAgICAgIGNoYXIqCQkJX01fZXh0X2VuZDsKKworICAgICAgLyoqCisgICAgICAgKiAgSW5pdGlhbGl6ZXMgcGJhY2sgYnVmZmVycywgYW5kIG1vdmVzIG5vcm1hbCBidWZmZXJzIHRvIHNhZmV0eS4KKyAgICAgICAqICBBc3N1bXB0aW9uczoKKyAgICAgICAqICBfTV9pbl9jdXIgaGFzIGFscmVhZHkgYmVlbiBtb3ZlZCBiYWNrCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIF9NX2NyZWF0ZV9wYmFjaygpCisgICAgICB7CisJaWYgKCFfTV9wYmFja19pbml0KQorCSAgeworCSAgICBfTV9wYmFja19jdXJfc2F2ZSA9IHRoaXMtPmdwdHIoKTsKKwkgICAgX01fcGJhY2tfZW5kX3NhdmUgPSB0aGlzLT5lZ3B0cigpOworCSAgICB0aGlzLT5zZXRnKCZfTV9wYmFjaywgJl9NX3BiYWNrLCAmX01fcGJhY2sgKyAxKTsKKwkgICAgX01fcGJhY2tfaW5pdCA9IHRydWU7CisJICB9CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIERlYWN0aXZhdGVzIHBiYWNrIGJ1ZmZlciBjb250ZW50cywgYW5kIHJlc3RvcmVzIG5vcm1hbCBidWZmZXIuCisgICAgICAgKiAgQXNzdW1wdGlvbnM6CisgICAgICAgKiAgVGhlIHBiYWNrIGJ1ZmZlciBoYXMgb25seSBtb3ZlZCBmb3J3YXJkLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBfTV9kZXN0cm95X3BiYWNrKCkgdGhyb3coKQorICAgICAgeworCWlmIChfTV9wYmFja19pbml0KQorCSAgeworCSAgICAvLyBMZW5ndGggX01faW5fY3VyIG1vdmVkIGluIHRoZSBwYmFjayBidWZmZXIuCisJICAgIF9NX3BiYWNrX2N1cl9zYXZlICs9IHRoaXMtPmdwdHIoKSAhPSB0aGlzLT5lYmFjaygpOworCSAgICB0aGlzLT5zZXRnKF9NX2J1ZiwgX01fcGJhY2tfY3VyX3NhdmUsIF9NX3BiYWNrX2VuZF9zYXZlKTsKKwkgICAgX01fcGJhY2tfaW5pdCA9IGZhbHNlOworCSAgfQorICAgICAgfQorCisgICAgcHVibGljOgorICAgICAgLy8gQ29uc3RydWN0b3JzL2Rlc3RydWN0b3I6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERvZXMgbm90IG9wZW4gYW55IGZpbGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpbml0aWFsaXplcyB0aGUgcGFyZW50IGNsYXNzIHVzaW5nIGl0cworICAgICAgICogIG93biBkZWZhdWx0IGN0b3IuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX2ZpbGVidWYoKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUaGUgZGVzdHJ1Y3RvciBjbG9zZXMgdGhlIGZpbGUgZmlyc3QuCisgICAgICAgKi8KKyAgICAgIHZpcnR1YWwKKyAgICAgIH5iYXNpY19maWxlYnVmKCkKKyAgICAgIHsgdGhpcy0+Y2xvc2UoKTsgfQorCisgICAgICAvLyBNZW1iZXJzOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm5zIHRydWUgaWYgdGhlIGV4dGVybmFsIGZpbGUgaXMgb3Blbi4KKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgaXNfb3BlbigpIGNvbnN0IHRocm93KCkKKyAgICAgIHsgcmV0dXJuIF9NX2ZpbGUuaXNfb3BlbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgT3BlbnMgYW4gZXh0ZXJuYWwgZmlsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgVGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgKiAgQHBhcmFtICBfX21vZGUgIFRoZSBvcGVuIG1vZGUgZmxhZ3MuCisgICAgICAgKiAgQHJldHVybiAgQGMgdGhpcyBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUKKyAgICAgICAqCisgICAgICAgKiAgSWYgYSBmaWxlIGlzIGFscmVhZHkgb3BlbiwgdGhpcyBmdW5jdGlvbiBpbW1lZGlhdGVseSBmYWlscy4KKyAgICAgICAqICBPdGhlcndpc2UgaXQgdHJpZXMgdG8gb3BlbiB0aGUgZmlsZSBuYW1lZCBAYSBfX3MgdXNpbmcgdGhlIGZsYWdzCisgICAgICAgKiAgZ2l2ZW4gaW4gQGEgX19tb2RlLgorICAgICAgICoKKyAgICAgICAqICBUYWJsZSA5MiwgYWRhcHRlZCBoZXJlLCBnaXZlcyB0aGUgcmVsYXRpb24gYmV0d2VlbiBvcGVubW9kZQorICAgICAgICogIGNvbWJpbmF0aW9ucyBhbmQgdGhlIGVxdWl2YWxlbnQgZm9wZW4oKSBmbGFncy4KKyAgICAgICAqICAoTkI6IGxpbmVzIGFwcCwgaW58b3V0fGFwcCwgaW58YXBwLCBiaW5hcnl8YXBwLCBiaW5hcnl8aW58b3V0fGFwcCwKKyAgICAgICAqICBhbmQgYmluYXJ5fGlufGFwcCBwZXIgRFIgNTk2KQorICAgICAgICogICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgKiAgfCBpb3NfYmFzZSBGbGFnIGNvbWJpbmF0aW9uICAgICAgICAgICAgc3RkaW8gZXF1aXZhbGVudCAgIHwKKyAgICAgICAqICB8YmluYXJ5ICBpbiAgb3V0ICB0cnVuYyAgYXBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICogICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgKiAgfCAgICAgICAgICAgICArICAgICAgICAgICAgICAgICAgICAgICAgdyAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICB8ICAgICAgICAgICAgICsgICAgICAgICAgICsgICAgICAgICAgICBhICAgICAgICAgICAgICAgICAgfAorICAgICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgKyAgICAgICAgICAgIGEgICAgICAgICAgICAgICAgICB8CisgICAgICAgKiAgfCAgICAgICAgICAgICArICAgICArICAgICAgICAgICAgICAgICAgdyAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICB8ICAgICAgICAgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByICAgICAgICAgICAgICAgICAgfAorICAgICAgICogIHwgICAgICAgICArICAgKyAgICAgICAgICAgICAgICAgICAgICAgIHIrICAgICAgICAgICAgICAgICB8CisgICAgICAgKiAgfCAgICAgICAgICsgICArICAgICArICAgICAgICAgICAgICAgICAgdysgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICB8ICAgICAgICAgKyAgICsgICAgICAgICAgICsgICAgICAgICAgICBhKyAgICAgICAgICAgICAgICAgfAorICAgICAgICogIHwgICAgICAgICArICAgICAgICAgICAgICAgKyAgICAgICAgICAgIGErICAgICAgICAgICAgICAgICB8CisgICAgICAgKiAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAqICB8ICAgKyAgICAgICAgICsgICAgICAgICAgICAgICAgICAgICAgICB3YiAgICAgICAgICAgICAgICAgfAorICAgICAgICogIHwgICArICAgICAgICAgKyAgICAgICAgICAgKyAgICAgICAgICAgIGFiICAgICAgICAgICAgICAgICB8CisgICAgICAgKiAgfCAgICsgICAgICAgICAgICAgICAgICAgICArICAgICAgICAgICAgYWIgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICB8ICAgKyAgICAgICAgICsgICAgICsgICAgICAgICAgICAgICAgICB3YiAgICAgICAgICAgICAgICAgfAorICAgICAgICogIHwgICArICAgICArICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJiICAgICAgICAgICAgICAgICB8CisgICAgICAgKiAgfCAgICsgICAgICsgICArICAgICAgICAgICAgICAgICAgICAgICAgcitiICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICB8ICAgKyAgICAgKyAgICsgICAgICsgICAgICAgICAgICAgICAgICB3K2IgICAgICAgICAgICAgICAgfAorICAgICAgICogIHwgICArICAgICArICAgKyAgICAgICAgICAgKyAgICAgICAgICAgIGErYiAgICAgICAgICAgICAgICB8CisgICAgICAgKiAgfCAgICsgICAgICsgICAgICAgICAgICAgICArICAgICAgICAgICAgYStiICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICovCisgICAgICBfX2ZpbGVidWZfdHlwZSoKKyAgICAgIG9wZW4oY29uc3QgY2hhciogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgT3BlbnMgYW4gZXh0ZXJuYWwgZmlsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgVGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgKiAgQHBhcmFtICBfX21vZGUgIFRoZSBvcGVuIG1vZGUgZmxhZ3MuCisgICAgICAgKiAgQHJldHVybiAgQGMgdGhpcyBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUKKyAgICAgICAqLworICAgICAgX19maWxlYnVmX3R5cGUqCisgICAgICBvcGVuKGNvbnN0IHN0ZDo6c3RyaW5nJiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCisgICAgICB7IHJldHVybiBvcGVuKF9fcy5jX3N0cigpLCBfX21vZGUpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDbG9zZXMgdGhlIGN1cnJlbnRseSBhc3NvY2lhdGVkIGZpbGUuCisgICAgICAgKiAgQHJldHVybiAgQGMgdGhpcyBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUKKyAgICAgICAqCisgICAgICAgKiAgSWYgbm8gZmlsZSBpcyBjdXJyZW50bHkgb3BlbiwgdGhpcyBmdW5jdGlvbiBpbW1lZGlhdGVseSBmYWlscy4KKyAgICAgICAqCisgICAgICAgKiAgSWYgYSA8ZW0+cHV0IGJ1ZmZlciBhcmVhPC9lbT4gZXhpc3RzLCBAYyBvdmVyZmxvdyhlb2YpIGlzCisgICAgICAgKiAgY2FsbGVkIHRvIGZsdXNoIGFsbCB0aGUgY2hhcmFjdGVycy4gIFRoZSBmaWxlIGlzIHRoZW4KKyAgICAgICAqICBjbG9zZWQuCisgICAgICAgKgorICAgICAgICogIElmIGFueSBvcGVyYXRpb25zIGZhaWwsIHRoaXMgZnVuY3Rpb24gYWxzbyBmYWlscy4KKyAgICAgICAqLworICAgICAgX19maWxlYnVmX3R5cGUqCisgICAgICBjbG9zZSgpOworCisgICAgcHJvdGVjdGVkOgorICAgICAgdm9pZAorICAgICAgX01fYWxsb2NhdGVfaW50ZXJuYWxfYnVmZmVyKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2Rlc3Ryb3lfaW50ZXJuYWxfYnVmZmVyKCkgdGhyb3coKTsKKworICAgICAgLy8gWzI3LjguMS40XSBvdmVycmlkZGVuIHZpcnR1YWwgZnVuY3Rpb25zCisgICAgICB2aXJ0dWFsIHN0cmVhbXNpemUKKyAgICAgIHNob3dtYW55YygpOworCisgICAgICAvLyBTdHJvdXN0cnVwLCAxOTk4LCBwLiA2MjgKKyAgICAgIC8vIHVuZGVyZmxvdygpIGFuZCB1ZmxvdygpIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHRvIGdldCB0aGUgbmV4dAorICAgICAgLy8gY2hhcmFjdGVyIGZyb20gdGhlIHJlYWwgaW5wdXQgc291cmNlIHdoZW4gdGhlIGJ1ZmZlciBpcyBlbXB0eS4KKyAgICAgIC8vIEJ1ZmZlcmVkIGlucHV0IHVzZXMgdW5kZXJmbG93KCkKKworICAgICAgdmlydHVhbCBpbnRfdHlwZQorICAgICAgdW5kZXJmbG93KCk7CisKKyAgICAgIHZpcnR1YWwgaW50X3R5cGUKKyAgICAgIHBiYWNrZmFpbChpbnRfdHlwZSBfX2MgPSBfVHJhaXRzOjplb2YoKSk7CisKKyAgICAgIC8vIFN0cm91c3RydXAsIDE5OTgsIHAgNjQ4CisgICAgICAvLyBUaGUgb3ZlcmZsb3coKSBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdHJhbnNmZXIgY2hhcmFjdGVycyB0byB0aGUKKyAgICAgIC8vIHJlYWwgb3V0cHV0IGRlc3RpbmF0aW9uIHdoZW4gdGhlIGJ1ZmZlciBpcyBmdWxsLiBBIGNhbGwgdG8KKyAgICAgIC8vIG92ZXJmbG93KGMpIG91dHB1dHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgcGx1cyB0aGUKKyAgICAgIC8vIGNoYXJhY3RlciBjLgorICAgICAgLy8gMjcuNS4yLjQuNQorICAgICAgLy8gQ29uc3VtZSBzb21lIHNlcXVlbmNlIG9mIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBwZW5kaW5nIHNlcXVlbmNlLgorICAgICAgdmlydHVhbCBpbnRfdHlwZQorICAgICAgb3ZlcmZsb3coaW50X3R5cGUgX19jID0gX1RyYWl0czo6ZW9mKCkpOworCisgICAgICAvLyBDb252ZXJ0IGludGVybmFsIGJ5dGUgc2VxdWVuY2UgdG8gZXh0ZXJuYWwsIGNoYXItYmFzZWQKKyAgICAgIC8vIHNlcXVlbmNlIHZpYSBjb2RlY3Z0LgorICAgICAgYm9vbAorICAgICAgX01fY29udmVydF90b19leHRlcm5hbChjaGFyX3R5cGUqLCBzdHJlYW1zaXplKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNYW5pcHVsYXRlcyB0aGUgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgX19zICBQb2ludGVyIHRvIGEgYnVmZmVyIGFyZWEuCisgICAgICAgKiAgQHBhcmFtICBfX24gIFNpemUgb2YgQGEgX19zLgorICAgICAgICogIEByZXR1cm4gIEBjIHRoaXMKKyAgICAgICAqCisgICAgICAgKiAgSWYgbm8gZmlsZSBoYXMgYmVlbiBvcGVuZWQsIGFuZCBib3RoIEBhIF9fcyBhbmQgQGEgX19uIGFyZSB6ZXJvLCB0aGVuCisgICAgICAgKiAgdGhlIHN0cmVhbSBiZWNvbWVzIHVuYnVmZmVyZWQuICBPdGhlcndpc2UsIEBjIF9fcyBpcyB1c2VkIGFzIGEKKyAgICAgICAqICBidWZmZXI7IHNlZQorICAgICAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MTFjaDI1czAyLmh0bWwKKyAgICAgICAqICBmb3IgbW9yZS4KKyAgICAgICAqLworICAgICAgdmlydHVhbCBfX3N0cmVhbWJ1Zl90eXBlKgorICAgICAgc2V0YnVmKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbik7CisKKyAgICAgIHZpcnR1YWwgcG9zX3R5cGUKKyAgICAgIHNlZWtvZmYob2ZmX3R5cGUgX19vZmYsIGlvc19iYXNlOjpzZWVrZGlyIF9fd2F5LAorCSAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKworICAgICAgdmlydHVhbCBwb3NfdHlwZQorICAgICAgc2Vla3Bvcyhwb3NfdHlwZSBfX3BvcywKKwkgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7CisKKyAgICAgIC8vIENvbW1vbiBjb2RlIGZvciBzZWVrb2ZmLCBzZWVrcG9zLCBhbmQgb3ZlcmZsb3cKKyAgICAgIHBvc190eXBlCisgICAgICBfTV9zZWVrKG9mZl90eXBlIF9fb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciBfX3dheSwgX19zdGF0ZV90eXBlIF9fc3RhdGUpOworICAgICAgCisgICAgICBpbnQKKyAgICAgIF9NX2dldF9leHRfcG9zKF9fc3RhdGVfdHlwZSAmX19zdGF0ZSk7CisKKyAgICAgIHZpcnR1YWwgaW50CisgICAgICBzeW5jKCk7CisKKyAgICAgIHZpcnR1YWwgdm9pZAorICAgICAgaW1idWUoY29uc3QgbG9jYWxlJiBfX2xvYyk7CisKKyAgICAgIHZpcnR1YWwgc3RyZWFtc2l6ZQorICAgICAgeHNnZXRuKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbik7CisKKyAgICAgIHZpcnR1YWwgc3RyZWFtc2l6ZQorICAgICAgeHNwdXRuKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbik7CisKKyAgICAgIC8vIEZsdXNoZXMgb3V0cHV0IGJ1ZmZlciwgdGhlbiB3cml0ZXMgdW5zaGlmdCBzZXF1ZW5jZS4KKyAgICAgIGJvb2wKKyAgICAgIF9NX3Rlcm1pbmF0ZV9vdXRwdXQoKTsKKworICAgICAgLyoqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBwb2ludGVycyBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLCBib3RoIGdldAorICAgICAgICogIGFuZCBwdXQgYXJlYXMuIFR5cGljYWxseToKKyAgICAgICAqCisgICAgICAgKiAgIF9fb2ZmID09IGVncHRyKCkgLSBlYmFjaygpIHVwb24gdW5kZXJmbG93L3VmbG93IChAYiByZWFkIG1vZGUpOworICAgICAgICogICBfX29mZiA9PSAwIHVwb24gb3ZlcmZsb3cgKEBiIHdyaXRlIG1vZGUpOworICAgICAgICogICBfX29mZiA9PSAtMSB1cG9uIG9wZW4sIHNldGJ1Ziwgc2Vla29mZi9wb3MgKEBiIHVuY29tbWl0dGVkIG1vZGUpLgorICAgICAgICoKKyAgICAgICAqICBOQjogZXBwdHIoKSAtIHBiYXNlKCkgPT0gX01fYnVmX3NpemUgLSAxLCBzaW5jZSBfTV9idWZfc2l6ZQorICAgICAgICogIHJlZmxlY3RzIHRoZSBhY3R1YWwgYWxsb2NhdGVkIG1lbW9yeSBhbmQgdGhlIGxhc3QgY2VsbCBpcyByZXNlcnZlZAorICAgICAgICogIGZvciB0aGUgb3ZlcmZsb3cgY2hhciBvZiBhIGZ1bGwgcHV0IGFyZWEuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIF9NX3NldF9idWZmZXIoc3RyZWFtc2l6ZSBfX29mZikKKyAgICAgIHsKKyAJY29uc3QgYm9vbCBfX3Rlc3RpbiA9IF9NX21vZGUgJiBpb3NfYmFzZTo6aW47CisgCWNvbnN0IGJvb2wgX190ZXN0b3V0ID0gX01fbW9kZSAmIGlvc19iYXNlOjpvdXQ7CisJCisJaWYgKF9fdGVzdGluICYmIF9fb2ZmID4gMCkKKwkgIHRoaXMtPnNldGcoX01fYnVmLCBfTV9idWYsIF9NX2J1ZiArIF9fb2ZmKTsKKwllbHNlCisJICB0aGlzLT5zZXRnKF9NX2J1ZiwgX01fYnVmLCBfTV9idWYpOworCisJaWYgKF9fdGVzdG91dCAmJiBfX29mZiA9PSAwICYmIF9NX2J1Zl9zaXplID4gMSApCisJICB0aGlzLT5zZXRwKF9NX2J1ZiwgX01fYnVmICsgX01fYnVmX3NpemUgLSAxKTsKKwllbHNlCisJICB0aGlzLT5zZXRwKDAsIDApOworICAgICAgfQorICAgIH07CisKKyAgLy8gWzI3LjguMS41XSBUZW1wbGF0ZSBjbGFzcyBiYXNpY19pZnN0cmVhbQorICAvKioKKyAgICogIEBicmllZiAgQ29udHJvbGxpbmcgaW5wdXQgZm9yIGZpbGVzLgorICAgKiAgQGluZ3JvdXAgaW8KKyAgICoKKyAgICogIEB0cGFyYW0gX0NoYXJUICBUeXBlIG9mIGNoYXJhY3RlciBzdHJlYW0uCisgICAqICBAdHBhcmFtIF9UcmFpdHMgIFRyYWl0cyBmb3IgY2hhcmFjdGVyIHR5cGUsIGRlZmF1bHRzIHRvCisgICAqICAgICAgICAgICAgICAgICAgIGNoYXJfdHJhaXRzPF9DaGFyVD4uCisgICAqCisgICAqICBUaGlzIGNsYXNzIHN1cHBvcnRzIHJlYWRpbmcgZnJvbSBuYW1lZCBmaWxlcywgdXNpbmcgdGhlIGluaGVyaXRlZAorICAgKiAgZnVuY3Rpb25zIGZyb20gc3RkOjpiYXNpY19pc3RyZWFtLiAgVG8gY29udHJvbCB0aGUgYXNzb2NpYXRlZAorICAgKiAgc2VxdWVuY2UsIGFuIGluc3RhbmNlIG9mIHN0ZDo6YmFzaWNfZmlsZWJ1ZiBpcyB1c2VkLCB3aGljaCB0aGlzIHBhZ2UKKyAgICogIHJlZmVycyB0byBhcyBAYyBzYi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBjbGFzcyBiYXNpY19pZnN0cmVhbSA6IHB1YmxpYyBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICB0eXBlZGVmIF9DaGFyVCAJCQkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cyAJCQkJCXRyYWl0c190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlIAkJcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSAJCW9mZl90eXBlOworCisgICAgICAvLyBOb24tc3RhbmRhcmQgdHlwZXM6CisgICAgICB0eXBlZGVmIGJhc2ljX2ZpbGVidWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4gCV9fZmlsZWJ1Zl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+CV9faXN0cmVhbV90eXBlOworCisgICAgcHJpdmF0ZToKKyAgICAgIF9fZmlsZWJ1Zl90eXBlCV9NX2ZpbGVidWY7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBDb25zdHJ1Y3RvcnMvRGVzdHJ1Y3RvcnM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICAgKgorICAgICAgICogIEluaXRpYWxpemVzIEBjIHNiIHVzaW5nIGl0cyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBhbmQgcGFzc2VzCisgICAgICAgKiAgQGMgJnNiIHRvIHRoZSBiYXNlIGNsYXNzIGluaXRpYWxpemVyLiAgRG9lcyBub3Qgb3BlbiBhbnkgZmlsZXMKKyAgICAgICAqICAoeW91IGhhdmVuJ3QgZ2l2ZW4gaXQgYSBmaWxlbmFtZSB0byBvcGVuKS4KKyAgICAgICAqLworICAgICAgYmFzaWNfaWZzdHJlYW0oKSA6IF9faXN0cmVhbV90eXBlKCksIF9NX2ZpbGVidWYoKQorICAgICAgeyB0aGlzLT5pbml0KCZfTV9maWxlYnVmKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENyZWF0ZSBhbiBpbnB1dCBmaWxlIHN0cmVhbS4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgTnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBmaWxlbmFtZS4KKyAgICAgICAqICBAcGFyYW0gIF9fbW9kZSAgT3BlbiBmaWxlIGluIHNwZWNpZmllZCBtb2RlIChzZWUgc3RkOjppb3NfYmFzZSkuCisgICAgICAgKgorICAgICAgICogIEBjIGlvc19iYXNlOjppbiBpcyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluIEBhIF9fbW9kZS4KKyAgICAgICAqCisgICAgICAgKiAgVGlwOiAgV2hlbiB1c2luZyBzdGQ6OnN0cmluZyB0byBob2xkIHRoZSBmaWxlbmFtZSwgeW91IG11c3QgdXNlCisgICAgICAgKiAgLmNfc3RyKCkgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhpcyBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX2lmc3RyZWFtKGNvbnN0IGNoYXIqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbikKKyAgICAgIDogX19pc3RyZWFtX3R5cGUoKSwgX01fZmlsZWJ1ZigpCisgICAgICB7CisJdGhpcy0+aW5pdCgmX01fZmlsZWJ1Zik7CisJdGhpcy0+b3BlbihfX3MsIF9fbW9kZSk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENyZWF0ZSBhbiBpbnB1dCBmaWxlIHN0cmVhbS4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgc3RkOjpzdHJpbmcgc3BlY2lmeWluZyB0aGUgZmlsZW5hbWUuCisgICAgICAgKiAgQHBhcmFtICBfX21vZGUgIE9wZW4gZmlsZSBpbiBzcGVjaWZpZWQgbW9kZSAoc2VlIHN0ZDo6aW9zX2Jhc2UpLgorICAgICAgICoKKyAgICAgICAqICBAYyBpb3NfYmFzZTo6aW4gaXMgYXV0b21hdGljYWxseSBpbmNsdWRlZCBpbiBAYSBfX21vZGUuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19pZnN0cmVhbShjb25zdCBzdGQ6OnN0cmluZyYgX19zLAorCQkgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4pCisgICAgICA6IF9faXN0cmVhbV90eXBlKCksIF9NX2ZpbGVidWYoKQorICAgICAgeworCXRoaXMtPmluaXQoJl9NX2ZpbGVidWYpOworCXRoaXMtPm9wZW4oX19zLCBfX21vZGUpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGhlIGRlc3RydWN0b3IgZG9lcyBub3RoaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGUgZmlsZSBpcyBjbG9zZWQgYnkgdGhlIGZpbGVidWYgb2JqZWN0LCBub3QgdGhlIGZvcm1hdHRpbmcKKyAgICAgICAqICBzdHJlYW0uCisgICAgICAgKi8KKyAgICAgIH5iYXNpY19pZnN0cmVhbSgpCisgICAgICB7IH0KKworICAgICAgLy8gTWVtYmVyczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWNjZXNzaW5nIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY3VycmVudCBiYXNpY19maWxlYnVmIGJ1ZmZlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBoaWRlcyBib3RoIHNpZ25hdHVyZXMgb2Ygc3RkOjpiYXNpY19pb3M6OnJkYnVmKCkuCisgICAgICAgKi8KKyAgICAgIF9fZmlsZWJ1Zl90eXBlKgorICAgICAgcmRidWYoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfY2FzdDxfX2ZpbGVidWZfdHlwZSo+KCZfTV9maWxlYnVmKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFdyYXBwZXIgdG8gdGVzdCBmb3IgYW4gb3BlbiBmaWxlLgorICAgICAgICogIEByZXR1cm4gIEBjIHJkYnVmKCktPmlzX29wZW4oKQorICAgICAgICovCisgICAgICBib29sCisgICAgICBpc19vcGVuKCkKKyAgICAgIHsgcmV0dXJuIF9NX2ZpbGVidWYuaXNfb3BlbigpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDM2NS4gTGFjayBvZiBjb25zdC1xdWFsaWZpY2F0aW9uIGluIGNsYXVzZSAyNworICAgICAgYm9vbAorICAgICAgaXNfb3BlbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9maWxlYnVmLmlzX29wZW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE9wZW5zIGFuIGV4dGVybmFsIGZpbGUuCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICogIEBwYXJhbSAgX19tb2RlICBUaGUgb3BlbiBtb2RlIGZsYWdzLgorICAgICAgICoKKyAgICAgICAqICBDYWxscyBAYyBzdGQ6OmJhc2ljX2ZpbGVidWY6Om9wZW4ocyxfX21vZGV8aW4pLiAgSWYgdGhhdCBmdW5jdGlvbgorICAgICAgICogIGZhaWxzLCBAYyBmYWlsYml0IGlzIHNldCBpbiB0aGUgc3RyZWFtJ3MgZXJyb3Igc3RhdGUuCisgICAgICAgKgorICAgICAgICogIFRpcDogIFdoZW4gdXNpbmcgc3RkOjpzdHJpbmcgdG8gaG9sZCB0aGUgZmlsZW5hbWUsIHlvdSBtdXN0IHVzZQorICAgICAgICogIC5jX3N0cigpIGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoaXMgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIG9wZW4oY29uc3QgY2hhciogX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6OmluKQorICAgICAgeworCWlmICghX01fZmlsZWJ1Zi5vcGVuKF9fcywgX19tb2RlIHwgaW9zX2Jhc2U6OmluKSkKKwkgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKwllbHNlCisJICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAvLyA0MDkuIENsb3NpbmcgYW4gZnN0cmVhbSBzaG91bGQgY2xlYXIgZXJyb3Igc3RhdGUKKwkgIHRoaXMtPmNsZWFyKCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE9wZW5zIGFuIGV4dGVybmFsIGZpbGUuCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICogIEBwYXJhbSAgX19tb2RlICBUaGUgb3BlbiBtb2RlIGZsYWdzLgorICAgICAgICoKKyAgICAgICAqICBDYWxscyBAYyBzdGQ6OmJhc2ljX2ZpbGVidWY6Om9wZW4oX19zLF9fbW9kZXxpbikuICBJZiB0aGF0IGZ1bmN0aW9uCisgICAgICAgKiAgZmFpbHMsIEBjIGZhaWxiaXQgaXMgc2V0IGluIHRoZSBzdHJlYW0ncyBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgb3Blbihjb25zdCBzdGQ6OnN0cmluZyYgX19zLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6OmluKQorICAgICAgeworCWlmICghX01fZmlsZWJ1Zi5vcGVuKF9fcywgX19tb2RlIHwgaW9zX2Jhc2U6OmluKSkKKwkgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKwllbHNlCisJICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAvLyA0MDkuIENsb3NpbmcgYW4gZnN0cmVhbSBzaG91bGQgY2xlYXIgZXJyb3Igc3RhdGUKKwkgIHRoaXMtPmNsZWFyKCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDbG9zZSB0aGUgZmlsZS4KKyAgICAgICAqCisgICAgICAgKiAgQ2FsbHMgQGMgc3RkOjpiYXNpY19maWxlYnVmOjpjbG9zZSgpLiAgSWYgdGhhdCBmdW5jdGlvbgorICAgICAgICogIGZhaWxzLCBAYyBmYWlsYml0IGlzIHNldCBpbiB0aGUgc3RyZWFtJ3MgZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGNsb3NlKCkKKyAgICAgIHsKKwlpZiAoIV9NX2ZpbGVidWYuY2xvc2UoKSkKKwkgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgICAgIH0KKyAgICB9OworCisKKyAgLy8gWzI3LjguMS44XSBUZW1wbGF0ZSBjbGFzcyBiYXNpY19vZnN0cmVhbQorICAvKioKKyAgICogIEBicmllZiAgQ29udHJvbGxpbmcgb3V0cHV0IGZvciBmaWxlcy4KKyAgICogIEBpbmdyb3VwIGlvCisgICAqCisgICAqICBAdHBhcmFtIF9DaGFyVCAgVHlwZSBvZiBjaGFyYWN0ZXIgc3RyZWFtLgorICAgKiAgQHRwYXJhbSBfVHJhaXRzICBUcmFpdHMgZm9yIGNoYXJhY3RlciB0eXBlLCBkZWZhdWx0cyB0bworICAgKiAgICAgICAgICAgICAgICAgICBjaGFyX3RyYWl0czxfQ2hhclQ+LgorICAgKgorICAgKiAgVGhpcyBjbGFzcyBzdXBwb3J0cyByZWFkaW5nIGZyb20gbmFtZWQgZmlsZXMsIHVzaW5nIHRoZSBpbmhlcml0ZWQKKyAgICogIGZ1bmN0aW9ucyBmcm9tIHN0ZDo6YmFzaWNfb3N0cmVhbS4gIFRvIGNvbnRyb2wgdGhlIGFzc29jaWF0ZWQKKyAgICogIHNlcXVlbmNlLCBhbiBpbnN0YW5jZSBvZiBzdGQ6OmJhc2ljX2ZpbGVidWYgaXMgdXNlZCwgd2hpY2ggdGhpcyBwYWdlCisgICAqICByZWZlcnMgdG8gYXMgQGMgc2IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgY2xhc3MgYmFzaWNfb2ZzdHJlYW0gOiBwdWJsaWMgYmFzaWNfb3N0cmVhbTxfQ2hhclQsX1RyYWl0cz4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICB0eXBlZGVmIF9DaGFyVCAJCQkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cyAJCQkJCXRyYWl0c190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlIAkJcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSAJCW9mZl90eXBlOworCisgICAgICAvLyBOb24tc3RhbmRhcmQgdHlwZXM6CisgICAgICB0eXBlZGVmIGJhc2ljX2ZpbGVidWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4gCV9fZmlsZWJ1Zl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19vc3RyZWFtPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+CV9fb3N0cmVhbV90eXBlOworCisgICAgcHJpdmF0ZToKKyAgICAgIF9fZmlsZWJ1Zl90eXBlCV9NX2ZpbGVidWY7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBDb25zdHJ1Y3RvcnM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICAgKgorICAgICAgICogIEluaXRpYWxpemVzIEBjIHNiIHVzaW5nIGl0cyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBhbmQgcGFzc2VzCisgICAgICAgKiAgQGMgJnNiIHRvIHRoZSBiYXNlIGNsYXNzIGluaXRpYWxpemVyLiAgRG9lcyBub3Qgb3BlbiBhbnkgZmlsZXMKKyAgICAgICAqICAoeW91IGhhdmVuJ3QgZ2l2ZW4gaXQgYSBmaWxlbmFtZSB0byBvcGVuKS4KKyAgICAgICAqLworICAgICAgYmFzaWNfb2ZzdHJlYW0oKTogX19vc3RyZWFtX3R5cGUoKSwgX01fZmlsZWJ1ZigpCisgICAgICB7IHRoaXMtPmluaXQoJl9NX2ZpbGVidWYpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlIGFuIG91dHB1dCBmaWxlIHN0cmVhbS4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgTnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBmaWxlbmFtZS4KKyAgICAgICAqICBAcGFyYW0gIF9fbW9kZSAgT3BlbiBmaWxlIGluIHNwZWNpZmllZCBtb2RlIChzZWUgc3RkOjppb3NfYmFzZSkuCisgICAgICAgKgorICAgICAgICogIEBjIGlvc19iYXNlOjpvdXQgfCBAYyBpb3NfYmFzZTo6dHJ1bmMgaXMgYXV0b21hdGljYWxseSBpbmNsdWRlZCBpbgorICAgICAgICogIEBhIF9fbW9kZS4KKyAgICAgICAqCisgICAgICAgKiAgVGlwOiAgV2hlbiB1c2luZyBzdGQ6OnN0cmluZyB0byBob2xkIHRoZSBmaWxlbmFtZSwgeW91IG11c3QgdXNlCisgICAgICAgKiAgLmNfc3RyKCkgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhpcyBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX29mc3RyZWFtKGNvbnN0IGNoYXIqIF9fcywKKwkJICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6Om91dHxpb3NfYmFzZTo6dHJ1bmMpCisgICAgICA6IF9fb3N0cmVhbV90eXBlKCksIF9NX2ZpbGVidWYoKQorICAgICAgeworCXRoaXMtPmluaXQoJl9NX2ZpbGVidWYpOworCXRoaXMtPm9wZW4oX19zLCBfX21vZGUpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGUgYW4gb3V0cHV0IGZpbGUgc3RyZWFtLgorICAgICAgICogIEBwYXJhbSAgX19zICBzdGQ6OnN0cmluZyBzcGVjaWZ5aW5nIHRoZSBmaWxlbmFtZS4KKyAgICAgICAqICBAcGFyYW0gIF9fbW9kZSAgT3BlbiBmaWxlIGluIHNwZWNpZmllZCBtb2RlIChzZWUgc3RkOjppb3NfYmFzZSkuCisgICAgICAgKgorICAgICAgICogIEBjIGlvc19iYXNlOjpvdXQgfCBAYyBpb3NfYmFzZTo6dHJ1bmMgaXMgYXV0b21hdGljYWxseSBpbmNsdWRlZCBpbgorICAgICAgICogIEBhIF9fbW9kZS4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX29mc3RyZWFtKGNvbnN0IHN0ZDo6c3RyaW5nJiBfX3MsCisJCSAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjpvdXR8aW9zX2Jhc2U6OnRydW5jKQorICAgICAgOiBfX29zdHJlYW1fdHlwZSgpLCBfTV9maWxlYnVmKCkKKyAgICAgIHsKKwl0aGlzLT5pbml0KCZfTV9maWxlYnVmKTsKKwl0aGlzLT5vcGVuKF9fcywgX19tb2RlKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRoZSBkZXN0cnVjdG9yIGRvZXMgbm90aGluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGZpbGUgaXMgY2xvc2VkIGJ5IHRoZSBmaWxlYnVmIG9iamVjdCwgbm90IHRoZSBmb3JtYXR0aW5nCisgICAgICAgKiAgc3RyZWFtLgorICAgICAgICovCisgICAgICB+YmFzaWNfb2ZzdHJlYW0oKQorICAgICAgeyB9CisKKyAgICAgIC8vIE1lbWJlcnM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFjY2Vzc2luZyB0aGUgdW5kZXJseWluZyBidWZmZXIuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGN1cnJlbnQgYmFzaWNfZmlsZWJ1ZiBidWZmZXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaGlkZXMgYm90aCBzaWduYXR1cmVzIG9mIHN0ZDo6YmFzaWNfaW9zOjpyZGJ1ZigpLgorICAgICAgICovCisgICAgICBfX2ZpbGVidWZfdHlwZSoKKyAgICAgIHJkYnVmKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8X19maWxlYnVmX3R5cGUqPigmX01fZmlsZWJ1Zik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBXcmFwcGVyIHRvIHRlc3QgZm9yIGFuIG9wZW4gZmlsZS4KKyAgICAgICAqICBAcmV0dXJuICBAYyByZGJ1ZigpLT5pc19vcGVuKCkKKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgaXNfb3BlbigpCisgICAgICB7IHJldHVybiBfTV9maWxlYnVmLmlzX29wZW4oKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAzNjUuIExhY2sgb2YgY29uc3QtcXVhbGlmaWNhdGlvbiBpbiBjbGF1c2UgMjcKKyAgICAgIGJvb2wKKyAgICAgIGlzX29wZW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZmlsZWJ1Zi5pc19vcGVuKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBPcGVucyBhbiBleHRlcm5hbCBmaWxlLgorICAgICAgICogIEBwYXJhbSAgX19zICBUaGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fbW9kZSAgVGhlIG9wZW4gbW9kZSBmbGFncy4KKyAgICAgICAqCisgICAgICAgKiAgQ2FsbHMgQGMgc3RkOjpiYXNpY19maWxlYnVmOjpvcGVuKF9fcyxfX21vZGV8b3V0fHRydW5jKS4gIElmIHRoYXQKKyAgICAgICAqICBmdW5jdGlvbiBmYWlscywgQGMgZmFpbGJpdCBpcyBzZXQgaW4gdGhlIHN0cmVhbSdzIGVycm9yIHN0YXRlLgorICAgICAgICoKKyAgICAgICAqICBUaXA6ICBXaGVuIHVzaW5nIHN0ZDo6c3RyaW5nIHRvIGhvbGQgdGhlIGZpbGVuYW1lLCB5b3UgbXVzdCB1c2UKKyAgICAgICAqICAuY19zdHIoKSBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGlzIGNvbnN0cnVjdG9yLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBvcGVuKGNvbnN0IGNoYXIqIF9fcywKKwkgICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6Om91dCB8IGlvc19iYXNlOjp0cnVuYykKKyAgICAgIHsKKwlpZiAoIV9NX2ZpbGVidWYub3BlbihfX3MsIF9fbW9kZSB8IGlvc19iYXNlOjpvdXQpKQorCSAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworCWVsc2UKKwkgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgIC8vIDQwOS4gQ2xvc2luZyBhbiBmc3RyZWFtIHNob3VsZCBjbGVhciBlcnJvciBzdGF0ZQorCSAgdGhpcy0+Y2xlYXIoKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgT3BlbnMgYW4gZXh0ZXJuYWwgZmlsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgVGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgKiAgQHBhcmFtICBfX21vZGUgIFRoZSBvcGVuIG1vZGUgZmxhZ3MuCisgICAgICAgKgorICAgICAgICogIENhbGxzIEBjIHN0ZDo6YmFzaWNfZmlsZWJ1Zjo6b3BlbihzLG1vZGV8b3V0fHRydW5jKS4gIElmIHRoYXQKKyAgICAgICAqICBmdW5jdGlvbiBmYWlscywgQGMgZmFpbGJpdCBpcyBzZXQgaW4gdGhlIHN0cmVhbSdzIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBvcGVuKGNvbnN0IHN0ZDo6c3RyaW5nJiBfX3MsCisJICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6dHJ1bmMpCisgICAgICB7CisJaWYgKCFfTV9maWxlYnVmLm9wZW4oX19zLCBfX21vZGUgfCBpb3NfYmFzZTo6b3V0KSkKKwkgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKwllbHNlCisJICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAvLyA0MDkuIENsb3NpbmcgYW4gZnN0cmVhbSBzaG91bGQgY2xlYXIgZXJyb3Igc3RhdGUKKwkgIHRoaXMtPmNsZWFyKCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDbG9zZSB0aGUgZmlsZS4KKyAgICAgICAqCisgICAgICAgKiAgQ2FsbHMgQGMgc3RkOjpiYXNpY19maWxlYnVmOjpjbG9zZSgpLiAgSWYgdGhhdCBmdW5jdGlvbgorICAgICAgICogIGZhaWxzLCBAYyBmYWlsYml0IGlzIHNldCBpbiB0aGUgc3RyZWFtJ3MgZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGNsb3NlKCkKKyAgICAgIHsKKwlpZiAoIV9NX2ZpbGVidWYuY2xvc2UoKSkKKwkgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgICAgIH0KKyAgICB9OworCisKKyAgLy8gWzI3LjguMS4xMV0gVGVtcGxhdGUgY2xhc3MgYmFzaWNfZnN0cmVhbQorICAvKioKKyAgICogIEBicmllZiAgQ29udHJvbGxpbmcgaW5wdXQgYW5kIG91dHB1dCBmb3IgZmlsZXMuCisgICAqICBAaW5ncm91cCBpbworICAgKgorICAgKiAgQHRwYXJhbSBfQ2hhclQgIFR5cGUgb2YgY2hhcmFjdGVyIHN0cmVhbS4KKyAgICogIEB0cGFyYW0gX1RyYWl0cyAgVHJhaXRzIGZvciBjaGFyYWN0ZXIgdHlwZSwgZGVmYXVsdHMgdG8KKyAgICogICAgICAgICAgICAgICAgICAgY2hhcl90cmFpdHM8X0NoYXJUPi4KKyAgICoKKyAgICogIFRoaXMgY2xhc3Mgc3VwcG9ydHMgcmVhZGluZyBmcm9tIGFuZCB3cml0aW5nIHRvIG5hbWVkIGZpbGVzLCB1c2luZworICAgKiAgdGhlIGluaGVyaXRlZCBmdW5jdGlvbnMgZnJvbSBzdGQ6OmJhc2ljX2lvc3RyZWFtLiAgVG8gY29udHJvbCB0aGUKKyAgICogIGFzc29jaWF0ZWQgc2VxdWVuY2UsIGFuIGluc3RhbmNlIG9mIHN0ZDo6YmFzaWNfZmlsZWJ1ZiBpcyB1c2VkLCB3aGljaAorICAgKiAgdGhpcyBwYWdlIHJlZmVycyB0byBhcyBAYyBzYi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBjbGFzcyBiYXNpY19mc3RyZWFtIDogcHVibGljIGJhc2ljX2lvc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICB0eXBlZGVmIF9DaGFyVCAJCQkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cyAJCQkJCXRyYWl0c190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlIAkJcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSAJCW9mZl90eXBlOworCisgICAgICAvLyBOb24tc3RhbmRhcmQgdHlwZXM6CisgICAgICB0eXBlZGVmIGJhc2ljX2ZpbGVidWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4gCV9fZmlsZWJ1Zl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19pb3M8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4JCV9faW9zX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX2lvc3RyZWFtPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+CV9faW9zdHJlYW1fdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICBfX2ZpbGVidWZfdHlwZQlfTV9maWxlYnVmOworCisgICAgcHVibGljOgorICAgICAgLy8gQ29uc3RydWN0b3JzL2Rlc3RydWN0b3I6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICAgKgorICAgICAgICogIEluaXRpYWxpemVzIEBjIHNiIHVzaW5nIGl0cyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBhbmQgcGFzc2VzCisgICAgICAgKiAgQGMgJnNiIHRvIHRoZSBiYXNlIGNsYXNzIGluaXRpYWxpemVyLiAgRG9lcyBub3Qgb3BlbiBhbnkgZmlsZXMKKyAgICAgICAqICAoeW91IGhhdmVuJ3QgZ2l2ZW4gaXQgYSBmaWxlbmFtZSB0byBvcGVuKS4KKyAgICAgICAqLworICAgICAgYmFzaWNfZnN0cmVhbSgpCisgICAgICA6IF9faW9zdHJlYW1fdHlwZSgpLCBfTV9maWxlYnVmKCkKKyAgICAgIHsgdGhpcy0+aW5pdCgmX01fZmlsZWJ1Zik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGUgYW4gaW5wdXQvb3V0cHV0IGZpbGUgc3RyZWFtLgorICAgICAgICogIEBwYXJhbSAgX19zICBOdWxsIHRlcm1pbmF0ZWQgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIGZpbGVuYW1lLgorICAgICAgICogIEBwYXJhbSAgX19tb2RlICBPcGVuIGZpbGUgaW4gc3BlY2lmaWVkIG1vZGUgKHNlZSBzdGQ6Omlvc19iYXNlKS4KKyAgICAgICAqCisgICAgICAgKiAgVGlwOiAgV2hlbiB1c2luZyBzdGQ6OnN0cmluZyB0byBob2xkIHRoZSBmaWxlbmFtZSwgeW91IG11c3QgdXNlCisgICAgICAgKiAgLmNfc3RyKCkgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhpcyBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX2ZzdHJlYW0oY29uc3QgY2hhciogX19zLAorCQkgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpCisgICAgICA6IF9faW9zdHJlYW1fdHlwZSgwKSwgX01fZmlsZWJ1ZigpCisgICAgICB7CisJdGhpcy0+aW5pdCgmX01fZmlsZWJ1Zik7CisJdGhpcy0+b3BlbihfX3MsIF9fbW9kZSk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENyZWF0ZSBhbiBpbnB1dC9vdXRwdXQgZmlsZSBzdHJlYW0uCisgICAgICAgKiAgQHBhcmFtICBfX3MgIE51bGwgdGVybWluYXRlZCBzdHJpbmcgc3BlY2lmeWluZyB0aGUgZmlsZW5hbWUuCisgICAgICAgKiAgQHBhcmFtICBfX21vZGUgIE9wZW4gZmlsZSBpbiBzcGVjaWZpZWQgbW9kZSAoc2VlIHN0ZDo6aW9zX2Jhc2UpLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgYmFzaWNfZnN0cmVhbShjb25zdCBzdGQ6OnN0cmluZyYgX19zLAorCQkgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpCisgICAgICA6IF9faW9zdHJlYW1fdHlwZSgwKSwgX01fZmlsZWJ1ZigpCisgICAgICB7CisJdGhpcy0+aW5pdCgmX01fZmlsZWJ1Zik7CisJdGhpcy0+b3BlbihfX3MsIF9fbW9kZSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUaGUgZGVzdHJ1Y3RvciBkb2VzIG5vdGhpbmcuCisgICAgICAgKgorICAgICAgICogIFRoZSBmaWxlIGlzIGNsb3NlZCBieSB0aGUgZmlsZWJ1ZiBvYmplY3QsIG5vdCB0aGUgZm9ybWF0dGluZworICAgICAgICogIHN0cmVhbS4KKyAgICAgICAqLworICAgICAgfmJhc2ljX2ZzdHJlYW0oKQorICAgICAgeyB9CisKKyAgICAgIC8vIE1lbWJlcnM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFjY2Vzc2luZyB0aGUgdW5kZXJseWluZyBidWZmZXIuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGN1cnJlbnQgYmFzaWNfZmlsZWJ1ZiBidWZmZXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaGlkZXMgYm90aCBzaWduYXR1cmVzIG9mIHN0ZDo6YmFzaWNfaW9zOjpyZGJ1ZigpLgorICAgICAgICovCisgICAgICBfX2ZpbGVidWZfdHlwZSoKKyAgICAgIHJkYnVmKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8X19maWxlYnVmX3R5cGUqPigmX01fZmlsZWJ1Zik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBXcmFwcGVyIHRvIHRlc3QgZm9yIGFuIG9wZW4gZmlsZS4KKyAgICAgICAqICBAcmV0dXJuICBAYyByZGJ1ZigpLT5pc19vcGVuKCkKKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgaXNfb3BlbigpCisgICAgICB7IHJldHVybiBfTV9maWxlYnVmLmlzX29wZW4oKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAzNjUuIExhY2sgb2YgY29uc3QtcXVhbGlmaWNhdGlvbiBpbiBjbGF1c2UgMjcKKyAgICAgIGJvb2wKKyAgICAgIGlzX29wZW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZmlsZWJ1Zi5pc19vcGVuKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBPcGVucyBhbiBleHRlcm5hbCBmaWxlLgorICAgICAgICogIEBwYXJhbSAgX19zICBUaGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAqICBAcGFyYW0gIF9fbW9kZSAgVGhlIG9wZW4gbW9kZSBmbGFncy4KKyAgICAgICAqCisgICAgICAgKiAgQ2FsbHMgQGMgc3RkOjpiYXNpY19maWxlYnVmOjpvcGVuKF9fcyxfX21vZGUpLiAgSWYgdGhhdAorICAgICAgICogIGZ1bmN0aW9uIGZhaWxzLCBAYyBmYWlsYml0IGlzIHNldCBpbiB0aGUgc3RyZWFtJ3MgZXJyb3Igc3RhdGUuCisgICAgICAgKgorICAgICAgICogIFRpcDogIFdoZW4gdXNpbmcgc3RkOjpzdHJpbmcgdG8gaG9sZCB0aGUgZmlsZW5hbWUsIHlvdSBtdXN0IHVzZQorICAgICAgICogIC5jX3N0cigpIGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoaXMgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIG9wZW4oY29uc3QgY2hhciogX19zLAorCSAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KQorICAgICAgeworCWlmICghX01fZmlsZWJ1Zi5vcGVuKF9fcywgX19tb2RlKSkKKwkgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKwllbHNlCisJICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAvLyA0MDkuIENsb3NpbmcgYW4gZnN0cmVhbSBzaG91bGQgY2xlYXIgZXJyb3Igc3RhdGUKKwkgIHRoaXMtPmNsZWFyKCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE9wZW5zIGFuIGV4dGVybmFsIGZpbGUuCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICogIEBwYXJhbSAgX19tb2RlICBUaGUgb3BlbiBtb2RlIGZsYWdzLgorICAgICAgICoKKyAgICAgICAqICBDYWxscyBAYyBzdGQ6OmJhc2ljX2ZpbGVidWY6Om9wZW4oX19zLF9fbW9kZSkuICBJZiB0aGF0CisgICAgICAgKiAgZnVuY3Rpb24gZmFpbHMsIEBjIGZhaWxiaXQgaXMgc2V0IGluIHRoZSBzdHJlYW0ncyBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgb3Blbihjb25zdCBzdGQ6OnN0cmluZyYgX19zLAorCSAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KQorICAgICAgeworCWlmICghX01fZmlsZWJ1Zi5vcGVuKF9fcywgX19tb2RlKSkKKwkgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKwllbHNlCisJICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAvLyA0MDkuIENsb3NpbmcgYW4gZnN0cmVhbSBzaG91bGQgY2xlYXIgZXJyb3Igc3RhdGUKKwkgIHRoaXMtPmNsZWFyKCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDbG9zZSB0aGUgZmlsZS4KKyAgICAgICAqCisgICAgICAgKiAgQ2FsbHMgQGMgc3RkOjpiYXNpY19maWxlYnVmOjpjbG9zZSgpLiAgSWYgdGhhdCBmdW5jdGlvbgorICAgICAgICogIGZhaWxzLCBAYyBmYWlsYml0IGlzIHNldCBpbiB0aGUgc3RyZWFtJ3MgZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGNsb3NlKCkKKyAgICAgIHsKKwlpZiAoIV9NX2ZpbGVidWYuY2xvc2UoKSkKKwkgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKyAgICAgIH0KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNpbmNsdWRlIDxiaXRzL2ZzdHJlYW0udGNjPgorCisjZW5kaWYgLyogX0dMSUJDWFhfRlNUUkVBTSAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9mdW5jdGlvbmFsIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9mdW5jdGlvbmFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMWEzM2IKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2Z1bmN0aW9uYWwKQEAgLTAsMCArMSwyNTgxIEBACisvLyA8ZnVuY3Rpb25hbD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICovCisKKy8qKiBAZmlsZSBpbmNsdWRlL2Z1bmN0aW9uYWwKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfRlVOQ1RJT05BTAorI2RlZmluZSBfR0xJQkNYWF9GVU5DVElPTkFMIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9mdW5jdGlvbi5oPgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisjaW5jbHVkZSA8dHlwZWluZm8+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNpbmNsdWRlIDxiaXRzL2Z1bmN0aW9uYWxfaGFzaC5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01lbWJlclBvaW50ZXI+CisgICAgY2xhc3MgX01lbV9mbjsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ2xhc3M+CisgICAgX01lbV9mbjxfVHAgX0NsYXNzOjoqPgorICAgIG1lbV9mbihfVHAgX0NsYXNzOjoqKSBub2V4Y2VwdDsKKworX0dMSUJDWFhfSEFTX05FU1RFRF9UWVBFKHJlc3VsdF90eXBlKQorCisgIC8vLyBJZiB3ZSBoYXZlIGZvdW5kIGEgcmVzdWx0X3R5cGUsIGV4dHJhY3QgaXQuCisgIHRlbXBsYXRlPGJvb2wgX0hhc19yZXN1bHRfdHlwZSwgdHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgc3RydWN0IF9NYXliZV9nZXRfcmVzdWx0X3R5cGUKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgc3RydWN0IF9NYXliZV9nZXRfcmVzdWx0X3R5cGU8dHJ1ZSwgX0Z1bmN0b3I+CisgICAgeyB0eXBlZGVmIHR5cGVuYW1lIF9GdW5jdG9yOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsgfTsKKworICAvKioKKyAgICogIEJhc2UgY2xhc3MgZm9yIGFueSBmdW5jdGlvbiBvYmplY3QgdGhhdCBoYXMgYSB3ZWFrIHJlc3VsdCB0eXBlLCBhcworICAgKiAgZGVmaW5lZCBpbiAzLjMvMyBvZiBUUjEuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsCisgICAgOiBfTWF5YmVfZ2V0X3Jlc3VsdF90eXBlPF9faGFzX3Jlc3VsdF90eXBlPF9GdW5jdG9yPjo6dmFsdWUsIF9GdW5jdG9yPgorICAgIHsgfTsKKworICAvLy8gUmV0cmlldmUgdGhlIHJlc3VsdCB0eXBlIGZvciBhIGZ1bmN0aW9uIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzKF9BcmdUeXBlcy4uLik+CisgICAgeyB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMoX0FyZ1R5cGVzLi4uLi4uKT4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyhfQXJnVHlwZXMuLi4pIGNvbnN0PgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzKF9BcmdUeXBlcy4uLi4uLikgY29uc3Q+CisgICAgeyB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMoX0FyZ1R5cGVzLi4uKSB2b2xhdGlsZT4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyhfQXJnVHlwZXMuLi4uLi4pIHZvbGF0aWxlPgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzKF9BcmdUeXBlcy4uLikgY29uc3Qgdm9sYXRpbGU+CisgICAgeyB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMoX0FyZ1R5cGVzLi4uLi4uKSBjb25zdCB2b2xhdGlsZT4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICAvLy8gUmV0cmlldmUgdGhlIHJlc3VsdCB0eXBlIGZvciBhIGZ1bmN0aW9uIHJlZmVyZW5jZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMoJikoX0FyZ1R5cGVzLi4uKT4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcygmKShfQXJnVHlwZXMuLi4uLi4pPgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIC8vLyBSZXRyaWV2ZSB0aGUgcmVzdWx0IHR5cGUgZm9yIGEgZnVuY3Rpb24gcG9pbnRlci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMoKikoX0FyZ1R5cGVzLi4uKT4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcygqKShfQXJnVHlwZXMuLi4uLi4pPgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIC8vLyBSZXRyaWV2ZSByZXN1bHQgdHlwZSBmb3IgYSBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyAoX0NsYXNzOjoqKShfQXJnVHlwZXMuLi4pPgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uLi4uKT4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICAvLy8gUmV0cmlldmUgcmVzdWx0IHR5cGUgZm9yIGEgY29uc3QgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uKSBjb25zdD4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzIChfQ2xhc3M6OiopKF9BcmdUeXBlcy4uLi4uLikgY29uc3Q+CisgICAgeyB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7IH07CisKKyAgLy8vIFJldHJpZXZlIHJlc3VsdCB0eXBlIGZvciBhIHZvbGF0aWxlIG1lbWJlciBmdW5jdGlvbiBwb2ludGVyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzIChfQ2xhc3M6OiopKF9BcmdUeXBlcy4uLikgdm9sYXRpbGU+CisgICAgeyB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyAoX0NsYXNzOjoqKShfQXJnVHlwZXMuLi4uLi4pIHZvbGF0aWxlPgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIC8vLyBSZXRyaWV2ZSByZXN1bHQgdHlwZSBmb3IgYSBjb25zdCB2b2xhdGlsZSBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyAoX0NsYXNzOjoqKShfQXJnVHlwZXMuLi4pCisJCQkJICBjb25zdCB2b2xhdGlsZT4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzIChfQ2xhc3M6OiopKF9BcmdUeXBlcy4uLi4uLikKKwkJCQkgIGNvbnN0IHZvbGF0aWxlPgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIC8qKgorICAgKiAgU3RyaXAgdG9wLWxldmVsIGN2LXF1YWxpZmllcnMgZnJvbSB0aGUgZnVuY3Rpb24gb2JqZWN0IGFuZCBsZXQKKyAgICogIF9XZWFrX3Jlc3VsdF90eXBlX2ltcGwgcGVyZm9ybSB0aGUgcmVhbCB3b3JrLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGUKKyAgICA6IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8dHlwZW5hbWUgcmVtb3ZlX2N2PF9GdW5jdG9yPjo6dHlwZT4KKyAgICB7IH07CisKKyAgLy8vIERldGVybWluZXMgaWYgdGhlIHR5cGUgX1RwIGRlcml2ZXMgZnJvbSB1bmFyeV9mdW5jdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfRGVyaXZlc19mcm9tX3VuYXJ5X2Z1bmN0aW9uIDogX19zZmluYWVfdHlwZXMKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1Jlcz4KKwlzdGF0aWMgX19vbmUgX190ZXN0KGNvbnN0IHZvbGF0aWxlIHVuYXJ5X2Z1bmN0aW9uPF9UMSwgX1Jlcz4qKTsKKworICAgICAgLy8gSXQncyB0ZW1wdGluZyB0byBjaGFuZ2UgIi4uLiIgdG8gY29uc3Qgdm9sYXRpbGUgdm9pZCosIGJ1dAorICAgICAgLy8gdGhhdCBmYWlscyB3aGVuIF9UcCBpcyBhIGZ1bmN0aW9uIHR5cGUuCisgICAgICBzdGF0aWMgX190d28gX190ZXN0KC4uLik7CisKKyAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHNpemVvZihfX3Rlc3QoKF9UcCopMCkpID09IDE7CisgICAgfTsKKworICAvLy8gRGV0ZXJtaW5lcyBpZiB0aGUgdHlwZSBfVHAgZGVyaXZlcyBmcm9tIGJpbmFyeV9mdW5jdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfRGVyaXZlc19mcm9tX2JpbmFyeV9mdW5jdGlvbiA6IF9fc2ZpbmFlX3R5cGVzCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMiwgdHlwZW5hbWUgX1Jlcz4KKwlzdGF0aWMgX19vbmUgX190ZXN0KGNvbnN0IHZvbGF0aWxlIGJpbmFyeV9mdW5jdGlvbjxfVDEsIF9UMiwgX1Jlcz4qKTsKKworICAgICAgLy8gSXQncyB0ZW1wdGluZyB0byBjaGFuZ2UgIi4uLiIgdG8gY29uc3Qgdm9sYXRpbGUgdm9pZCosIGJ1dAorICAgICAgLy8gdGhhdCBmYWlscyB3aGVuIF9UcCBpcyBhIGZ1bmN0aW9uIHR5cGUuCisgICAgICBzdGF0aWMgX190d28gX190ZXN0KC4uLik7CisKKyAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHNpemVvZihfX3Rlc3QoKF9UcCopMCkpID09IDE7CisgICAgfTsKKworICAvKioKKyAgICogSW52b2tlIGEgZnVuY3Rpb24gb2JqZWN0LCB3aGljaCBtYXkgYmUgZWl0aGVyIGEgbWVtYmVyIHBvaW50ZXIgb3IgYQorICAgKiBmdW5jdGlvbiBvYmplY3QuIFRoZSBmaXJzdCBwYXJhbWV0ZXIgd2lsbCB0ZWxsIHdoaWNoLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGlubGluZQorICAgIHR5cGVuYW1lIGVuYWJsZV9pZjwKKwkgICAgICghaXNfbWVtYmVyX3BvaW50ZXI8X0Z1bmN0b3I+Ojp2YWx1ZQorCSAgICAgICYmICFpc19mdW5jdGlvbjxfRnVuY3Rvcj46OnZhbHVlCisJICAgICAgJiYgIWlzX2Z1bmN0aW9uPHR5cGVuYW1lIHJlbW92ZV9wb2ludGVyPF9GdW5jdG9yPjo6dHlwZT46OnZhbHVlKSwKKwkgICAgIHR5cGVuYW1lIHJlc3VsdF9vZjxfRnVuY3RvciYoX0FyZ3MmJi4uLik+Ojp0eXBlCisJICAgPjo6dHlwZQorICAgIF9faW52b2tlKF9GdW5jdG9yJiBfX2YsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgIHsKKyAgICAgIHJldHVybiBfX2Yoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGlubGluZQorICAgIHR5cGVuYW1lIGVuYWJsZV9pZjwKKyAgICAgICAgICAgICAoaXNfbWVtYmVyX3BvaW50ZXI8X0Z1bmN0b3I+Ojp2YWx1ZQorICAgICAgICAgICAgICAmJiAhaXNfZnVuY3Rpb248X0Z1bmN0b3I+Ojp2YWx1ZQorICAgICAgICAgICAgICAmJiAhaXNfZnVuY3Rpb248dHlwZW5hbWUgcmVtb3ZlX3BvaW50ZXI8X0Z1bmN0b3I+Ojp0eXBlPjo6dmFsdWUpLAorICAgICAgICAgICAgIHR5cGVuYW1lIHJlc3VsdF9vZjxfRnVuY3RvcihfQXJncyYmLi4uKT46OnR5cGUKKyAgICAgICAgICAgPjo6dHlwZQorICAgIF9faW52b2tlKF9GdW5jdG9yJiBfX2YsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgIHsKKyAgICAgIHJldHVybiBzdGQ6Om1lbV9mbihfX2YpKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgfQorCisgIC8vIFRvIHBpY2sgdXAgZnVuY3Rpb24gcmVmZXJlbmNlcyAodGhhdCB3aWxsIGJlY29tZSBmdW5jdGlvbiBwb2ludGVycykKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGlubGluZQorICAgIHR5cGVuYW1lIGVuYWJsZV9pZjwKKwkgICAgIChpc19wb2ludGVyPF9GdW5jdG9yPjo6dmFsdWUKKwkgICAgICAmJiBpc19mdW5jdGlvbjx0eXBlbmFtZSByZW1vdmVfcG9pbnRlcjxfRnVuY3Rvcj46OnR5cGU+Ojp2YWx1ZSksCisJICAgICB0eXBlbmFtZSByZXN1bHRfb2Y8X0Z1bmN0b3IoX0FyZ3MmJi4uLik+Ojp0eXBlCisJICAgPjo6dHlwZQorICAgIF9faW52b2tlKF9GdW5jdG9yIF9fZiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgcmV0dXJuIF9fZihzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIH0KKworICAvKioKKyAgICogIEtub3dpbmcgd2hpY2ggb2YgdW5hcnlfZnVuY3Rpb24gYW5kIGJpbmFyeV9mdW5jdGlvbiBfVHAgZGVyaXZlcworICAgKiAgZnJvbSwgZGVyaXZlcyBmcm9tIHRoZSBzYW1lIGFuZCBlbnN1cmVzIHRoYXQgcmVmZXJlbmNlX3dyYXBwZXIKKyAgICogIHdpbGwgaGF2ZSBhIHdlYWsgcmVzdWx0IHR5cGUuIFNlZSBjYXNlcyBiZWxvdy4KKyAgICovCisgIHRlbXBsYXRlPGJvb2wgX1VuYXJ5LCBib29sIF9CaW5hcnksIHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2VfaW1wbDsKKworICAvLyBOb25lIG9mIHRoZSBuZXN0ZWQgYXJndW1lbnQgdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2VfaW1wbDxmYWxzZSwgZmFsc2UsIF9UcD4KKyAgICA6IF9XZWFrX3Jlc3VsdF90eXBlPF9UcD4KKyAgICB7IH07CisKKyAgLy8gTmVzdGVkIGFyZ3VtZW50X3R5cGUgb25seS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZV9pbXBsPHRydWUsIGZhbHNlLCBfVHA+CisgICAgOiBfV2Vha19yZXN1bHRfdHlwZTxfVHA+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHA6OmFyZ3VtZW50X3R5cGUgYXJndW1lbnRfdHlwZTsKKyAgICB9OworCisgIC8vIE5lc3RlZCBmaXJzdF9hcmd1bWVudF90eXBlIGFuZCBzZWNvbmRfYXJndW1lbnRfdHlwZSBvbmx5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlX2ltcGw8ZmFsc2UsIHRydWUsIF9UcD4KKyAgICA6IF9XZWFrX3Jlc3VsdF90eXBlPF9UcD4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcDo6Zmlyc3RfYXJndW1lbnRfdHlwZSBmaXJzdF9hcmd1bWVudF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHA6OnNlY29uZF9hcmd1bWVudF90eXBlIHNlY29uZF9hcmd1bWVudF90eXBlOworICAgIH07CisKKyAgLy8gQWxsIHRoZSBuZXN0ZWQgYXJndW1lbnQgdHlwZXMuCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlX2ltcGw8dHJ1ZSwgdHJ1ZSwgX1RwPgorICAgIDogX1dlYWtfcmVzdWx0X3R5cGU8X1RwPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RwOjphcmd1bWVudF90eXBlIGFyZ3VtZW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcDo6Zmlyc3RfYXJndW1lbnRfdHlwZSBmaXJzdF9hcmd1bWVudF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHA6OnNlY29uZF9hcmd1bWVudF90eXBlIHNlY29uZF9hcmd1bWVudF90eXBlOworICAgIH07CisKKyAgX0dMSUJDWFhfSEFTX05FU1RFRF9UWVBFKGFyZ3VtZW50X3R5cGUpCisgIF9HTElCQ1hYX0hBU19ORVNURURfVFlQRShmaXJzdF9hcmd1bWVudF90eXBlKQorICBfR0xJQkNYWF9IQVNfTkVTVEVEX1RZUEUoc2Vjb25kX2FyZ3VtZW50X3R5cGUpCisKKyAgLyoqCisgICAqICBEZXJpdmVzIGZyb20gdW5hcnlfZnVuY3Rpb24gb3IgYmluYXJ5X2Z1bmN0aW9uIHdoZW4gaXQKKyAgICogIGNhbi4gU3BlY2lhbGl6YXRpb25zIGhhbmRsZSBhbGwgb2YgdGhlIGVhc3kgY2FzZXMuIFRoZSBwcmltYXJ5CisgICAqICB0ZW1wbGF0ZSBkZXRlcm1pbmVzIHdoYXQgdG8gZG8gd2l0aCBhIGNsYXNzIHR5cGUsIHdoaWNoIG1heQorICAgKiAgZGVyaXZlIGZyb20gYm90aCB1bmFyeV9mdW5jdGlvbiBhbmQgYmluYXJ5X2Z1bmN0aW9uLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlCisgICAgOiBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZV9pbXBsPAorICAgICAgX19oYXNfYXJndW1lbnRfdHlwZTxfVHA+Ojp2YWx1ZSwKKyAgICAgIF9faGFzX2ZpcnN0X2FyZ3VtZW50X3R5cGU8X1RwPjo6dmFsdWUKKyAgICAgICYmIF9faGFzX3NlY29uZF9hcmd1bWVudF90eXBlPF9UcD46OnZhbHVlLAorICAgICAgX1RwPgorICAgIHsgfTsKKworICAvLyAtIGEgZnVuY3Rpb24gdHlwZSAodW5hcnkpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMT4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyhfVDEpPgorICAgIDogdW5hcnlfZnVuY3Rpb248X1QxLCBfUmVzPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDE+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMoX1QxKSBjb25zdD4KKyAgICA6IHVuYXJ5X2Z1bmN0aW9uPF9UMSwgX1Jlcz4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzKF9UMSkgdm9sYXRpbGU+CisgICAgOiB1bmFyeV9mdW5jdGlvbjxfVDEsIF9SZXM+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMT4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyhfVDEpIGNvbnN0IHZvbGF0aWxlPgorICAgIDogdW5hcnlfZnVuY3Rpb248X1QxLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgZnVuY3Rpb24gdHlwZSAoYmluYXJ5KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyhfVDEsIF9UMik+CisgICAgOiBiaW5hcnlfZnVuY3Rpb248X1QxLCBfVDIsIF9SZXM+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzKF9UMSwgX1QyKSBjb25zdD4KKyAgICA6IGJpbmFyeV9mdW5jdGlvbjxfVDEsIF9UMiwgX1Jlcz4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMoX1QxLCBfVDIpIHZvbGF0aWxlPgorICAgIDogYmluYXJ5X2Z1bmN0aW9uPF9UMSwgX1QyLCBfUmVzPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyhfVDEsIF9UMikgY29uc3Qgdm9sYXRpbGU+CisgICAgOiBiaW5hcnlfZnVuY3Rpb248X1QxLCBfVDIsIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBmdW5jdGlvbiBwb2ludGVyIHR5cGUgKHVuYXJ5KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDE+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMoKikoX1QxKT4KKyAgICA6IHVuYXJ5X2Z1bmN0aW9uPF9UMSwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8gLSBhIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZSAoYmluYXJ5KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcygqKShfVDEsIF9UMik+CisgICAgOiBiaW5hcnlfZnVuY3Rpb248X1QxLCBfVDIsIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiB0eXBlICh1bmFyeSwgbm8gcXVhbGlmaWVycykKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzIChfVDE6OiopKCk+CisgICAgOiB1bmFyeV9mdW5jdGlvbjxfVDEqLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gdHlwZSAoYmluYXJ5LCBubyBxdWFsaWZpZXJzKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyAoX1QxOjoqKShfVDIpPgorICAgIDogYmluYXJ5X2Z1bmN0aW9uPF9UMSosIF9UMiwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8gLSBhIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIHR5cGUgKHVuYXJ5LCBjb25zdCkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzIChfVDE6OiopKCkgY29uc3Q+CisgICAgOiB1bmFyeV9mdW5jdGlvbjxjb25zdCBfVDEqLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gdHlwZSAoYmluYXJ5LCBjb25zdCkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMgKF9UMTo6KikoX1QyKSBjb25zdD4KKyAgICA6IGJpbmFyeV9mdW5jdGlvbjxjb25zdCBfVDEqLCBfVDIsIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiB0eXBlICh1bmFyeSwgdm9sYXRpbGUpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMT4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyAoX1QxOjoqKSgpIHZvbGF0aWxlPgorICAgIDogdW5hcnlfZnVuY3Rpb248dm9sYXRpbGUgX1QxKiwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8gLSBhIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIHR5cGUgKGJpbmFyeSwgdm9sYXRpbGUpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzIChfVDE6OiopKF9UMikgdm9sYXRpbGU+CisgICAgOiBiaW5hcnlfZnVuY3Rpb248dm9sYXRpbGUgX1QxKiwgX1QyLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gdHlwZSAodW5hcnksIGNvbnN0IHZvbGF0aWxlKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDE+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMgKF9UMTo6KikoKSBjb25zdCB2b2xhdGlsZT4KKyAgICA6IHVuYXJ5X2Z1bmN0aW9uPGNvbnN0IHZvbGF0aWxlIF9UMSosIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiB0eXBlIChiaW5hcnksIGNvbnN0IHZvbGF0aWxlKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyAoX1QxOjoqKShfVDIpIGNvbnN0IHZvbGF0aWxlPgorICAgIDogYmluYXJ5X2Z1bmN0aW9uPGNvbnN0IHZvbGF0aWxlIF9UMSosIF9UMiwgX1Jlcz4KKyAgICB7IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZSBmb3IgcmVmZXJlbmNlX3dyYXBwZXIuCisgICAqICBAaW5ncm91cCBmdW5jdG9ycworICAgKiAgQHsKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyByZWZlcmVuY2Vfd3JhcHBlcgorICAgIDogcHVibGljIF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPgorICAgIHsKKyAgICAgIF9UcCogX01fZGF0YTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwIHR5cGU7CisKKyAgICAgIHJlZmVyZW5jZV93cmFwcGVyKF9UcCYgX19pbmRhdGEpIG5vZXhjZXB0CisgICAgICA6IF9NX2RhdGEoc3RkOjpfX2FkZHJlc3NvZihfX2luZGF0YSkpCisgICAgICB7IH0KKworICAgICAgcmVmZXJlbmNlX3dyYXBwZXIoX1RwJiYpID0gZGVsZXRlOworCisgICAgICByZWZlcmVuY2Vfd3JhcHBlcihjb25zdCByZWZlcmVuY2Vfd3JhcHBlcjxfVHA+JiBfX2lucmVmKSBub2V4Y2VwdAorICAgICAgOiBfTV9kYXRhKF9faW5yZWYuX01fZGF0YSkKKyAgICAgIHsgfQorCisgICAgICByZWZlcmVuY2Vfd3JhcHBlciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCByZWZlcmVuY2Vfd3JhcHBlcjxfVHA+JiBfX2lucmVmKSBub2V4Y2VwdAorICAgICAgeworCV9NX2RhdGEgPSBfX2lucmVmLl9NX2RhdGE7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBvcGVyYXRvciBfVHAmKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmdldCgpOyB9CisKKyAgICAgIF9UcCYKKyAgICAgIGdldCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiAqX01fZGF0YTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwl0eXBlbmFtZSByZXN1bHRfb2Y8X1RwJihfQXJncyYmLi4uKT46OnR5cGUKKwlvcGVyYXRvcigpKF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsKKwkgIHJldHVybiBfX2ludm9rZShnZXQoKSwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwl9CisgICAgfTsKKworCisgIC8vLyBEZW5vdGVzIGEgcmVmZXJlbmNlIHNob3VsZCBiZSB0YWtlbiB0byBhIHZhcmlhYmxlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHJlZmVyZW5jZV93cmFwcGVyPF9UcD4KKyAgICByZWYoX1RwJiBfX3QpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gcmVmZXJlbmNlX3dyYXBwZXI8X1RwPihfX3QpOyB9CisKKyAgLy8vIERlbm90ZXMgYSBjb25zdCByZWZlcmVuY2Ugc2hvdWxkIGJlIHRha2VuIHRvIGEgdmFyaWFibGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgcmVmZXJlbmNlX3dyYXBwZXI8Y29uc3QgX1RwPgorICAgIGNyZWYoY29uc3QgX1RwJiBfX3QpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gcmVmZXJlbmNlX3dyYXBwZXI8Y29uc3QgX1RwPihfX3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHZvaWQgcmVmKGNvbnN0IF9UcCYmKSA9IGRlbGV0ZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdm9pZCBjcmVmKGNvbnN0IF9UcCYmKSA9IGRlbGV0ZTsKKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSByZWZlcmVuY2Vfd3JhcHBlcjxfVHA+CisgICAgcmVmKHJlZmVyZW5jZV93cmFwcGVyPF9UcD4gX190KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIHJlZihfX3QuZ2V0KCkpOyB9CisKKyAgLy8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgcmVmZXJlbmNlX3dyYXBwZXI8Y29uc3QgX1RwPgorICAgIGNyZWYocmVmZXJlbmNlX3dyYXBwZXI8X1RwPiBfX3QpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gY3JlZihfX3QuZ2V0KCkpOyB9CisKKyAgLy8gQH0gZ3JvdXAgZnVuY3RvcnMKKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVHlwZXM+CisgICAgc3RydWN0IF9QYWNrIDogaW50ZWdyYWxfY29uc3RhbnQ8c2l6ZV90LCBzaXplb2YuLi4oX1R5cGVzKT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Zyb20sIHR5cGVuYW1lIF9UbywgYm9vbCA9IF9Gcm9tOjp2YWx1ZSA9PSBfVG86OnZhbHVlPgorICAgIHN0cnVjdCBfQWxsQ29udmVydGlibGUgOiBmYWxzZV90eXBlCisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9Gcm9tLCB0eXBlbmFtZS4uLiBfVG8+CisgICAgc3RydWN0IF9BbGxDb252ZXJ0aWJsZTxfUGFjazxfRnJvbS4uLj4sIF9QYWNrPF9Uby4uLj4sIHRydWU+CisgICAgOiBfX2FuZF88aXNfY29udmVydGlibGU8X0Zyb20sIF9Ubz4uLi4+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgdXNpbmcgX05vdFNhbWUgPSBfX25vdF88aXNfc2FtZTx0eXBlbmFtZSBzdGQ6OmRlY2F5PF9UcDE+Ojp0eXBlLAorCQkJCSAgICB0eXBlbmFtZSBzdGQ6OmRlY2F5PF9UcDI+Ojp0eXBlPj47CisKKyAgLyoqCisgICAqIERlcml2ZXMgZnJvbSBAYyB1bmFyeV9mdW5jdGlvbiBvciBAYyBiaW5hcnlfZnVuY3Rpb24sIG9yIHBlcmhhcHMKKyAgICogbm90aGluZywgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHByb3ZpZGVkLiBUaGUKKyAgICogcHJpbWFyeSB0ZW1wbGF0ZSBpcyB0aGUgYmFzaXMgY2FzZSwgd2hpY2ggZGVyaXZlcyBub3RoaW5nLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uIHsgfTsKKworICAvLy8gRGVyaXZlcyBmcm9tIEBjIHVuYXJ5X2Z1bmN0aW9uLCBhcyBhcHByb3ByaWF0ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxPgorICAgIHN0cnVjdCBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uPF9SZXMsIF9UMT4KKyAgICA6IHN0ZDo6dW5hcnlfZnVuY3Rpb248X1QxLCBfUmVzPiB7IH07CisKKyAgLy8vIERlcml2ZXMgZnJvbSBAYyBiaW5hcnlfZnVuY3Rpb24sIGFzIGFwcHJvcHJpYXRlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX01heWJlX3VuYXJ5X29yX2JpbmFyeV9mdW5jdGlvbjxfUmVzLCBfVDEsIF9UMj4KKyAgICA6IHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPF9UMSwgX1QyLCBfUmVzPiB7IH07CisKKyAgLy8vIEltcGxlbWVudGF0aW9uIG9mIEBjIG1lbV9mbiBmb3IgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfTWVtX2ZuPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uKT4KKyAgICA6IHB1YmxpYyBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uPF9SZXMsIF9DbGFzcyosIF9BcmdUeXBlcy4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgKF9DbGFzczo6Kl9GdW5jdG9yKShfQXJnVHlwZXMuLi4pOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorCV9SZXMKKwlfTV9jYWxsKF9UcCYmIF9fb2JqZWN0LCBjb25zdCB2b2xhdGlsZSBfQ2xhc3MgKiwKKwkJX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeworCSAgcmV0dXJuIChzdGQ6OmZvcndhcmQ8X1RwPihfX29iamVjdCkuKl9fcG1mKQorCSAgICAoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisJX1JlcworCV9NX2NhbGwoX1RwJiYgX19wdHIsIGNvbnN0IHZvbGF0aWxlIHZvaWQgKiwgX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeyByZXR1cm4gKCgqX19wdHIpLipfX3BtZikoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICAvLyBSZXF1aXJlIGVhY2ggX0FyZ3MgdG8gYmUgY29udmVydGlibGUgdG8gY29ycmVzcG9uZGluZyBfQXJnVHlwZXMKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXVzaW5nIF9SZXF1aXJlVmFsaWRBcmdzCisJICA9IF9SZXF1aXJlPF9BbGxDb252ZXJ0aWJsZTxfUGFjazxfQXJncy4uLj4sIF9QYWNrPF9BcmdUeXBlcy4uLj4+PjsKKworICAgICAgLy8gUmVxdWlyZSBlYWNoIF9BcmdzIHRvIGJlIGNvbnZlcnRpYmxlIHRvIGNvcnJlc3BvbmRpbmcgX0FyZ1R5cGVzCisgICAgICAvLyBhbmQgcmVxdWlyZSBfVHAgaXMgbm90IF9DbGFzcywgX0NsYXNzJiBvciBfQ2xhc3MqCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorCXVzaW5nIF9SZXF1aXJlVmFsaWRBcmdzMgorCSAgPSBfUmVxdWlyZTxfTm90U2FtZTxfQ2xhc3MsIF9UcD4sIF9Ob3RTYW1lPF9DbGFzcyosIF9UcD4sCisJCSAgICAgX0FsbENvbnZlcnRpYmxlPF9QYWNrPF9BcmdzLi4uPiwgX1BhY2s8X0FyZ1R5cGVzLi4uPj4+OworCisgICAgICAvLyBSZXF1aXJlIGVhY2ggX0FyZ3MgdG8gYmUgY29udmVydGlibGUgdG8gY29ycmVzcG9uZGluZyBfQXJnVHlwZXMKKyAgICAgIC8vIGFuZCByZXF1aXJlIF9UcCBpcyBfQ2xhc3Mgb3IgZGVyaXZlZCBmcm9tIF9DbGFzcworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKwl1c2luZyBfUmVxdWlyZVZhbGlkQXJnczMKKwkgID0gX1JlcXVpcmU8aXNfYmFzZV9vZjxfQ2xhc3MsIF9UcD4sCisJCSAgICAgX0FsbENvbnZlcnRpYmxlPF9QYWNrPF9BcmdzLi4uPiwgX1BhY2s8X0FyZ1R5cGVzLi4uPj4+OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOworCisgICAgICBleHBsaWNpdCBfTWVtX2ZuKF9GdW5jdG9yIF9fcG1mKSA6IF9fcG1mKF9fcG1mKSB7IH0KKworICAgICAgLy8gSGFuZGxlIG9iamVjdHMKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzLCB0eXBlbmFtZSBfUmVxID0gX1JlcXVpcmVWYWxpZEFyZ3M8X0FyZ3MuLi4+PgorCV9SZXMKKwlvcGVyYXRvcigpKF9DbGFzcyYgX19vYmplY3QsIF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsgcmV0dXJuIChfX29iamVjdC4qX19wbWYpKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIHR5cGVuYW1lIF9SZXEgPSBfUmVxdWlyZVZhbGlkQXJnczxfQXJncy4uLj4+CisJX1JlcworCW9wZXJhdG9yKCkoX0NsYXNzJiYgX19vYmplY3QsIF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsKKwkgIHJldHVybiAoc3RkOjptb3ZlKF9fb2JqZWN0KS4qX19wbWYpKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJfQorCisgICAgICAvLyBIYW5kbGUgcG9pbnRlcnMKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzLCB0eXBlbmFtZSBfUmVxID0gX1JlcXVpcmVWYWxpZEFyZ3M8X0FyZ3MuLi4+PgorCV9SZXMKKwlvcGVyYXRvcigpKF9DbGFzcyogX19vYmplY3QsIF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsgcmV0dXJuIChfX29iamVjdC0+Kl9fcG1mKShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIC8vIEhhbmRsZSBzbWFydCBwb2ludGVycywgcmVmZXJlbmNlcyBhbmQgcG9pbnRlcnMgdG8gZGVyaXZlZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncywKKwkgICAgICAgdHlwZW5hbWUgX1JlcSA9IF9SZXF1aXJlVmFsaWRBcmdzMjxfVHAsIF9BcmdzLi4uPj4KKwlfUmVzCisJb3BlcmF0b3IoKShfVHAmJiBfX29iamVjdCwgX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeworCSAgcmV0dXJuIF9NX2NhbGwoc3RkOjpmb3J3YXJkPF9UcD4oX19vYmplY3QpLCAmX19vYmplY3QsCisJICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3MsCisJICAgICAgIHR5cGVuYW1lIF9SZXEgPSBfUmVxdWlyZVZhbGlkQXJnczM8X1RwLCBfQXJncy4uLj4+CisJX1JlcworCW9wZXJhdG9yKCkocmVmZXJlbmNlX3dyYXBwZXI8X1RwPiBfX3JlZiwgX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeyByZXR1cm4gb3BlcmF0b3IoKShfX3JlZi5nZXQoKSwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9GdW5jdG9yIF9fcG1mOworICAgIH07CisKKyAgLy8vIEltcGxlbWVudGF0aW9uIG9mIEBjIG1lbV9mbiBmb3IgY29uc3QgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfTWVtX2ZuPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uKSBjb25zdD4KKyAgICA6IHB1YmxpYyBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uPF9SZXMsIGNvbnN0IF9DbGFzcyosCisJCQkJCSAgICAgX0FyZ1R5cGVzLi4uPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JlcyAoX0NsYXNzOjoqX0Z1bmN0b3IpKF9BcmdUeXBlcy4uLikgY29uc3Q7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisJX1JlcworCV9NX2NhbGwoX1RwJiYgX19vYmplY3QsIGNvbnN0IHZvbGF0aWxlIF9DbGFzcyAqLAorCQlfQXJncyYmLi4uIF9fYXJncykgY29uc3QKKwl7CisJICByZXR1cm4gKHN0ZDo6Zm9yd2FyZDxfVHA+KF9fb2JqZWN0KS4qX19wbWYpCisJICAgIChzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKwlfUmVzCisJX01fY2FsbChfVHAmJiBfX3B0ciwgY29uc3Qgdm9sYXRpbGUgdm9pZCAqLCBfQXJncyYmLi4uIF9fYXJncykgY29uc3QKKwl7IHJldHVybiAoKCpfX3B0cikuKl9fcG1mKShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXVzaW5nIF9SZXF1aXJlVmFsaWRBcmdzCisJICA9IF9SZXF1aXJlPF9BbGxDb252ZXJ0aWJsZTxfUGFjazxfQXJncy4uLj4sIF9QYWNrPF9BcmdUeXBlcy4uLj4+PjsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKwl1c2luZyBfUmVxdWlyZVZhbGlkQXJnczIKKwkgID0gX1JlcXVpcmU8X05vdFNhbWU8X0NsYXNzLCBfVHA+LCBfTm90U2FtZTxjb25zdCBfQ2xhc3MqLCBfVHA+LAorCQkgICAgIF9BbGxDb252ZXJ0aWJsZTxfUGFjazxfQXJncy4uLj4sIF9QYWNrPF9BcmdUeXBlcy4uLj4+PjsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKwl1c2luZyBfUmVxdWlyZVZhbGlkQXJnczMKKwkgID0gX1JlcXVpcmU8aXNfYmFzZV9vZjxfQ2xhc3MsIF9UcD4sCisJCSAgICAgX0FsbENvbnZlcnRpYmxlPF9QYWNrPF9BcmdzLi4uPiwgX1BhY2s8X0FyZ1R5cGVzLi4uPj4+OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOworCisgICAgICBleHBsaWNpdCBfTWVtX2ZuKF9GdW5jdG9yIF9fcG1mKSA6IF9fcG1mKF9fcG1mKSB7IH0KKworICAgICAgLy8gSGFuZGxlIG9iamVjdHMKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzLCB0eXBlbmFtZSBfUmVxID0gX1JlcXVpcmVWYWxpZEFyZ3M8X0FyZ3MuLi4+PgorCV9SZXMKKwlvcGVyYXRvcigpKGNvbnN0IF9DbGFzcyYgX19vYmplY3QsIF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsgcmV0dXJuIChfX29iamVjdC4qX19wbWYpKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIHR5cGVuYW1lIF9SZXEgPSBfUmVxdWlyZVZhbGlkQXJnczxfQXJncy4uLj4+CisJX1JlcworCW9wZXJhdG9yKCkoY29uc3QgX0NsYXNzJiYgX19vYmplY3QsIF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsKKwkgIHJldHVybiAoc3RkOjptb3ZlKF9fb2JqZWN0KS4qX19wbWYpKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJfQorCisgICAgICAvLyBIYW5kbGUgcG9pbnRlcnMKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzLCB0eXBlbmFtZSBfUmVxID0gX1JlcXVpcmVWYWxpZEFyZ3M8X0FyZ3MuLi4+PgorCV9SZXMKKwlvcGVyYXRvcigpKGNvbnN0IF9DbGFzcyogX19vYmplY3QsIF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsgcmV0dXJuIChfX29iamVjdC0+Kl9fcG1mKShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIC8vIEhhbmRsZSBzbWFydCBwb2ludGVycywgcmVmZXJlbmNlcyBhbmQgcG9pbnRlcnMgdG8gZGVyaXZlZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncywKKwkgICAgICAgdHlwZW5hbWUgX1JlcSA9IF9SZXF1aXJlVmFsaWRBcmdzMjxfVHAsIF9BcmdzLi4uPj4KKwlfUmVzIG9wZXJhdG9yKCkoX1RwJiYgX19vYmplY3QsIF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsKKwkgIHJldHVybiBfTV9jYWxsKHN0ZDo6Zm9yd2FyZDxfVHA+KF9fb2JqZWN0KSwgJl9fb2JqZWN0LAorCSAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzLAorCSAgICAgICB0eXBlbmFtZSBfUmVxID0gX1JlcXVpcmVWYWxpZEFyZ3MzPF9UcCwgX0FyZ3MuLi4+PgorCV9SZXMKKwlvcGVyYXRvcigpKHJlZmVyZW5jZV93cmFwcGVyPF9UcD4gX19yZWYsIF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsgcmV0dXJuIG9wZXJhdG9yKCkoX19yZWYuZ2V0KCksIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfRnVuY3RvciBfX3BtZjsKKyAgICB9OworCisgIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiBAYyBtZW1fZm4gZm9yIHZvbGF0aWxlIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY2xhc3MgX01lbV9mbjxfUmVzIChfQ2xhc3M6OiopKF9BcmdUeXBlcy4uLikgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgX01heWJlX3VuYXJ5X29yX2JpbmFyeV9mdW5jdGlvbjxfUmVzLCB2b2xhdGlsZSBfQ2xhc3MqLAorCQkJCQkgICAgIF9BcmdUeXBlcy4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgKF9DbGFzczo6Kl9GdW5jdG9yKShfQXJnVHlwZXMuLi4pIHZvbGF0aWxlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorCV9SZXMKKwlfTV9jYWxsKF9UcCYmIF9fb2JqZWN0LCBjb25zdCB2b2xhdGlsZSBfQ2xhc3MgKiwKKwkJX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeworCSAgcmV0dXJuIChzdGQ6OmZvcndhcmQ8X1RwPihfX29iamVjdCkuKl9fcG1mKQorCSAgICAoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisJX1JlcworCV9NX2NhbGwoX1RwJiYgX19wdHIsIGNvbnN0IHZvbGF0aWxlIHZvaWQgKiwgX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeyByZXR1cm4gKCgqX19wdHIpLipfX3BtZikoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwl1c2luZyBfUmVxdWlyZVZhbGlkQXJncworCSAgPSBfUmVxdWlyZTxfQWxsQ29udmVydGlibGU8X1BhY2s8X0FyZ3MuLi4+LCBfUGFjazxfQXJnVHlwZXMuLi4+Pj47CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisJdXNpbmcgX1JlcXVpcmVWYWxpZEFyZ3MyCisJICA9IF9SZXF1aXJlPF9Ob3RTYW1lPF9DbGFzcywgX1RwPiwgX05vdFNhbWU8dm9sYXRpbGUgX0NsYXNzKiwgX1RwPiwKKwkJICAgICBfQWxsQ29udmVydGlibGU8X1BhY2s8X0FyZ3MuLi4+LCBfUGFjazxfQXJnVHlwZXMuLi4+Pj47CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisJdXNpbmcgX1JlcXVpcmVWYWxpZEFyZ3MzCisJICA9IF9SZXF1aXJlPGlzX2Jhc2Vfb2Y8X0NsYXNzLCBfVHA+LAorCQkgICAgIF9BbGxDb252ZXJ0aWJsZTxfUGFjazxfQXJncy4uLj4sIF9QYWNrPF9BcmdUeXBlcy4uLj4+PjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsKKworICAgICAgZXhwbGljaXQgX01lbV9mbihfRnVuY3RvciBfX3BtZikgOiBfX3BtZihfX3BtZikgeyB9CisKKyAgICAgIC8vIEhhbmRsZSBvYmplY3RzCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncywgdHlwZW5hbWUgX1JlcSA9IF9SZXF1aXJlVmFsaWRBcmdzPF9BcmdzLi4uPj4KKwlfUmVzCisJb3BlcmF0b3IoKSh2b2xhdGlsZSBfQ2xhc3MmIF9fb2JqZWN0LCBfQXJncyYmLi4uIF9fYXJncykgY29uc3QKKwl7IHJldHVybiAoX19vYmplY3QuKl9fcG1mKShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzLCB0eXBlbmFtZSBfUmVxID0gX1JlcXVpcmVWYWxpZEFyZ3M8X0FyZ3MuLi4+PgorCV9SZXMKKwlvcGVyYXRvcigpKHZvbGF0aWxlIF9DbGFzcyYmIF9fb2JqZWN0LCBfQXJncyYmLi4uIF9fYXJncykgY29uc3QKKwl7CisJICByZXR1cm4gKHN0ZDo6bW92ZShfX29iamVjdCkuKl9fcG1mKShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCX0KKworICAgICAgLy8gSGFuZGxlIHBvaW50ZXJzCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncywgdHlwZW5hbWUgX1JlcSA9IF9SZXF1aXJlVmFsaWRBcmdzPF9BcmdzLi4uPj4KKwlfUmVzCisJb3BlcmF0b3IoKSh2b2xhdGlsZSBfQ2xhc3MqIF9fb2JqZWN0LCBfQXJncyYmLi4uIF9fYXJncykgY29uc3QKKwl7IHJldHVybiAoX19vYmplY3QtPipfX3BtZikoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICAvLyBIYW5kbGUgc21hcnQgcG9pbnRlcnMsIHJlZmVyZW5jZXMgYW5kIHBvaW50ZXJzIHRvIGRlcml2ZWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3MsCisJICAgICAgIHR5cGVuYW1lIF9SZXEgPSBfUmVxdWlyZVZhbGlkQXJnczI8X1RwLCBfQXJncy4uLj4+CisJX1JlcworCW9wZXJhdG9yKCkoX1RwJiYgX19vYmplY3QsIF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsKKwkgIHJldHVybiBfTV9jYWxsKHN0ZDo6Zm9yd2FyZDxfVHA+KF9fb2JqZWN0KSwgJl9fb2JqZWN0LAorCSAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzLAorCSAgICAgICB0eXBlbmFtZSBfUmVxID0gX1JlcXVpcmVWYWxpZEFyZ3MzPF9UcCwgX0FyZ3MuLi4+PgorCV9SZXMKKwlvcGVyYXRvcigpKHJlZmVyZW5jZV93cmFwcGVyPF9UcD4gX19yZWYsIF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsgcmV0dXJuIG9wZXJhdG9yKCkoX19yZWYuZ2V0KCksIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfRnVuY3RvciBfX3BtZjsKKyAgICB9OworCisgIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiBAYyBtZW1fZm4gZm9yIGNvbnN0IHZvbGF0aWxlIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY2xhc3MgX01lbV9mbjxfUmVzIChfQ2xhc3M6OiopKF9BcmdUeXBlcy4uLikgY29uc3Qgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgX01heWJlX3VuYXJ5X29yX2JpbmFyeV9mdW5jdGlvbjxfUmVzLCBjb25zdCB2b2xhdGlsZSBfQ2xhc3MqLAorCQkJCQkgICAgIF9BcmdUeXBlcy4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgKF9DbGFzczo6Kl9GdW5jdG9yKShfQXJnVHlwZXMuLi4pIGNvbnN0IHZvbGF0aWxlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorCV9SZXMKKwlfTV9jYWxsKF9UcCYmIF9fb2JqZWN0LCBjb25zdCB2b2xhdGlsZSBfQ2xhc3MgKiwKKwkJX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeworCSAgcmV0dXJuIChzdGQ6OmZvcndhcmQ8X1RwPihfX29iamVjdCkuKl9fcG1mKQorCSAgICAoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisJX1JlcworCV9NX2NhbGwoX1RwJiYgX19wdHIsIGNvbnN0IHZvbGF0aWxlIHZvaWQgKiwgX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeyByZXR1cm4gKCgqX19wdHIpLipfX3BtZikoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwl1c2luZyBfUmVxdWlyZVZhbGlkQXJncworCSAgPSBfUmVxdWlyZTxfQWxsQ29udmVydGlibGU8X1BhY2s8X0FyZ3MuLi4+LCBfUGFjazxfQXJnVHlwZXMuLi4+Pj47CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisJdXNpbmcgX1JlcXVpcmVWYWxpZEFyZ3MyCisJICA9IF9SZXF1aXJlPF9Ob3RTYW1lPF9DbGFzcywgX1RwPiwKKwkJICAgICBfTm90U2FtZTxjb25zdCB2b2xhdGlsZSBfQ2xhc3MqLCBfVHA+LAorCQkgICAgIF9BbGxDb252ZXJ0aWJsZTxfUGFjazxfQXJncy4uLj4sIF9QYWNrPF9BcmdUeXBlcy4uLj4+PjsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKwl1c2luZyBfUmVxdWlyZVZhbGlkQXJnczMKKwkgID0gX1JlcXVpcmU8aXNfYmFzZV9vZjxfQ2xhc3MsIF9UcD4sCisJCSAgICAgX0FsbENvbnZlcnRpYmxlPF9QYWNrPF9BcmdzLi4uPiwgX1BhY2s8X0FyZ1R5cGVzLi4uPj4+OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOworCisgICAgICBleHBsaWNpdCBfTWVtX2ZuKF9GdW5jdG9yIF9fcG1mKSA6IF9fcG1mKF9fcG1mKSB7IH0KKworICAgICAgLy8gSGFuZGxlIG9iamVjdHMKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzLCB0eXBlbmFtZSBfUmVxID0gX1JlcXVpcmVWYWxpZEFyZ3M8X0FyZ3MuLi4+PgorCV9SZXMKKwlvcGVyYXRvcigpKGNvbnN0IHZvbGF0aWxlIF9DbGFzcyYgX19vYmplY3QsIF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsgcmV0dXJuIChfX29iamVjdC4qX19wbWYpKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIHR5cGVuYW1lIF9SZXEgPSBfUmVxdWlyZVZhbGlkQXJnczxfQXJncy4uLj4+CisJX1JlcworCW9wZXJhdG9yKCkoY29uc3Qgdm9sYXRpbGUgX0NsYXNzJiYgX19vYmplY3QsIF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsKKwkgIHJldHVybiAoc3RkOjptb3ZlKF9fb2JqZWN0KS4qX19wbWYpKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJfQorCisgICAgICAvLyBIYW5kbGUgcG9pbnRlcnMKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzLCB0eXBlbmFtZSBfUmVxID0gX1JlcXVpcmVWYWxpZEFyZ3M8X0FyZ3MuLi4+PgorCV9SZXMKKwlvcGVyYXRvcigpKGNvbnN0IHZvbGF0aWxlIF9DbGFzcyogX19vYmplY3QsIF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsgcmV0dXJuIChfX29iamVjdC0+Kl9fcG1mKShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIC8vIEhhbmRsZSBzbWFydCBwb2ludGVycywgcmVmZXJlbmNlcyBhbmQgcG9pbnRlcnMgdG8gZGVyaXZlZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncywKKwkgICAgICAgdHlwZW5hbWUgX1JlcSA9IF9SZXF1aXJlVmFsaWRBcmdzMjxfVHAsIF9BcmdzLi4uPj4KKwlfUmVzIG9wZXJhdG9yKCkoX1RwJiYgX19vYmplY3QsIF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsKKwkgIHJldHVybiBfTV9jYWxsKHN0ZDo6Zm9yd2FyZDxfVHA+KF9fb2JqZWN0KSwgJl9fb2JqZWN0LAorCSAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzLAorCSAgICAgICB0eXBlbmFtZSBfUmVxID0gX1JlcXVpcmVWYWxpZEFyZ3MzPF9UcCwgX0FyZ3MuLi4+PgorCV9SZXMKKwlvcGVyYXRvcigpKHJlZmVyZW5jZV93cmFwcGVyPF9UcD4gX19yZWYsIF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsgcmV0dXJuIG9wZXJhdG9yKCkoX19yZWYuZ2V0KCksIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfRnVuY3RvciBfX3BtZjsKKyAgICB9OworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBib29sPgorICAgIHN0cnVjdCBfTWVtX2ZuX2NvbnN0X29yX25vbgorICAgIHsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwJiB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfTWVtX2ZuX2NvbnN0X29yX25vbjxfVHAsIGZhbHNlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwJiB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzPgorICAgIGNsYXNzIF9NZW1fZm48X1JlcyBfQ2xhc3M6Oio+CisgICAgeworICAgICAgdXNpbmcgX19wbV90eXBlID0gX1JlcyBfQ2xhc3M6Oio7CisKKyAgICAgIC8vIFRoaXMgYml0IG9mIGdlbml1cyBpcyBkdWUgdG8gUGV0ZXIgRGltb3YsIGltcHJvdmVkIHNsaWdodGx5IGJ5CisgICAgICAvLyBEb3VnbGFzIEdyZWdvci4KKyAgICAgIC8vIE1hZGUgbGVzcyBlbGVnYW50IHRvIHN1cHBvcnQgcGVyZmVjdCBmb3J3YXJkaW5nIGFuZCBub2V4Y2VwdC4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKwlhdXRvCisJX01fY2FsbChfVHAmJiBfX29iamVjdCwgY29uc3QgX0NsYXNzICopIGNvbnN0IG5vZXhjZXB0CisJLT4gZGVjbHR5cGUoc3RkOjpmb3J3YXJkPF9UcD4oX19vYmplY3QpLipzdGQ6OmRlY2x2YWw8X19wbV90eXBlJj4oKSkKKwl7IHJldHVybiBzdGQ6OmZvcndhcmQ8X1RwPihfX29iamVjdCkuKl9fcG07IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisJYXV0bworCV9NX2NhbGwoX1RwJiYgX19vYmplY3QsIF9VcCAqIGNvbnN0ICopIGNvbnN0IG5vZXhjZXB0CisJLT4gZGVjbHR5cGUoKCpzdGQ6OmZvcndhcmQ8X1RwPihfX29iamVjdCkpLipzdGQ6OmRlY2x2YWw8X19wbV90eXBlJj4oKSkKKwl7IHJldHVybiAoKnN0ZDo6Zm9yd2FyZDxfVHA+KF9fb2JqZWN0KSkuKl9fcG07IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCWF1dG8KKwlfTV9jYWxsKF9UcCYmIF9fcHRyLCBjb25zdCB2b2xhdGlsZSB2b2lkKikgY29uc3QKKwlub2V4Y2VwdChub2V4Y2VwdCgoKl9fcHRyKS4qc3RkOjpkZWNsdmFsPF9fcG1fdHlwZSY+KCkpKQorCS0+IGRlY2x0eXBlKCgqX19wdHIpLipzdGQ6OmRlY2x2YWw8X19wbV90eXBlJj4oKSkKKwl7IHJldHVybiAoKl9fcHRyKS4qX19wbTsgfQorCisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIF9NZW1fZm4oX1JlcyBfQ2xhc3M6OipfX3BtKSBub2V4Y2VwdCA6IF9fcG0oX19wbSkgeyB9CisKKyAgICAgIC8vIEhhbmRsZSBvYmplY3RzCisgICAgICBfUmVzJgorICAgICAgb3BlcmF0b3IoKShfQ2xhc3MmIF9fb2JqZWN0KSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19vYmplY3QuKl9fcG07IH0KKworICAgICAgY29uc3QgX1JlcyYKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0NsYXNzJiBfX29iamVjdCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fb2JqZWN0LipfX3BtOyB9CisKKyAgICAgIF9SZXMmJgorICAgICAgb3BlcmF0b3IoKShfQ2xhc3MmJiBfX29iamVjdCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxfQ2xhc3M+KF9fb2JqZWN0KS4qX19wbTsgfQorCisgICAgICBjb25zdCBfUmVzJiYKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0NsYXNzJiYgX19vYmplY3QpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6OmZvcndhcmQ8Y29uc3QgX0NsYXNzPihfX29iamVjdCkuKl9fcG07IH0KKworICAgICAgLy8gSGFuZGxlIHBvaW50ZXJzCisgICAgICBfUmVzJgorICAgICAgb3BlcmF0b3IoKShfQ2xhc3MqIF9fb2JqZWN0KSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19vYmplY3QtPipfX3BtOyB9CisKKyAgICAgIGNvbnN0IF9SZXMmCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9DbGFzcyogX19vYmplY3QpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX29iamVjdC0+Kl9fcG07IH0KKworICAgICAgLy8gSGFuZGxlIHNtYXJ0IHBvaW50ZXJzIGFuZCBkZXJpdmVkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9SZXEgPSBfUmVxdWlyZTxfTm90U2FtZTxfQ2xhc3MqLCBfVHA+Pj4KKwlhdXRvCisJb3BlcmF0b3IoKShfVHAmJiBfX3Vua25vd24pIGNvbnN0CisJbm9leGNlcHQobm9leGNlcHQoc3RkOjpkZWNsdmFsPF9NZW1fZm4qPigpLT5fTV9jYWxsCisJCQkgIChzdGQ6OmZvcndhcmQ8X1RwPihfX3Vua25vd24pLCAmX191bmtub3duKSkpCisJLT4gZGVjbHR5cGUodGhpcy0+X01fY2FsbChzdGQ6OmZvcndhcmQ8X1RwPihfX3Vua25vd24pLCAmX191bmtub3duKSkKKwl7IHJldHVybiBfTV9jYWxsKHN0ZDo6Zm9yd2FyZDxfVHA+KF9fdW5rbm93biksICZfX3Vua25vd24pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1JlcSA9IF9SZXF1aXJlPGlzX2Jhc2Vfb2Y8X0NsYXNzLCBfVHA+Pj4KKwlhdXRvCisJb3BlcmF0b3IoKShyZWZlcmVuY2Vfd3JhcHBlcjxfVHA+IF9fcmVmKSBjb25zdAorCW5vZXhjZXB0KG5vZXhjZXB0KHN0ZDo6ZGVjbHZhbDxfTWVtX2ZuJj4oKShfX3JlZi5nZXQoKSkpKQorCS0+IGRlY2x0eXBlKCgqdGhpcykoX19yZWYuZ2V0KCkpKQorCXsgcmV0dXJuICgqdGhpcykoX19yZWYuZ2V0KCkpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX1JlcyBfQ2xhc3M6OipfX3BtOworICAgIH07CisKKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyAyMDQ4LiAgVW5uZWNlc3NhcnkgbWVtX2ZuIG92ZXJsb2FkcworICAvKioKKyAgICogIEBicmllZiBSZXR1cm5zIGEgZnVuY3Rpb24gb2JqZWN0IHRoYXQgZm9yd2FyZHMgdG8gdGhlIG1lbWJlcgorICAgKiAgcG9pbnRlciBAYSBwbS4KKyAgICogIEBpbmdyb3VwIGZ1bmN0b3JzCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9DbGFzcz4KKyAgICBpbmxpbmUgX01lbV9mbjxfVHAgX0NsYXNzOjoqPgorICAgIG1lbV9mbihfVHAgX0NsYXNzOjoqIF9fcG0pIG5vZXhjZXB0CisgICAgeworICAgICAgcmV0dXJuIF9NZW1fZm48X1RwIF9DbGFzczo6Kj4oX19wbSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIERldGVybWluZXMgaWYgdGhlIGdpdmVuIHR5cGUgX1RwIGlzIGEgZnVuY3Rpb24gb2JqZWN0CisgICAqICBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHN1YmV4cHJlc3Npb24gd2hlbiBldmFsdWF0aW5nIGNhbGxzIHRvCisgICAqICBmdW5jdGlvbiBvYmplY3RzIHJldHVybmVkIGJ5IGJpbmQoKS4gW1RSMSAzLjYuMV0KKyAgICogIEBpbmdyb3VwIGJpbmRlcnMKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gdHlwZSBfVHAgaXMgYSBwbGFjZWhvbGRlciBpbiBhCisgICAqICBiaW5kKCkgZXhwcmVzc2lvbiBhbmQsIGlmIHNvLCB3aGljaCBwbGFjZWhvbGRlciBpdCBpcy4gW1RSMSAzLjYuMl0KKyAgICogIEBpbmdyb3VwIGJpbmRlcnMKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfcGxhY2Vob2xkZXIKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxpbnQsIDA+CisgICAgeyB9OworCisgIC8qKiBAYnJpZWYgVGhlIHR5cGUgb2YgcGxhY2Vob2xkZXIgb2JqZWN0cyBkZWZpbmVkIGJ5IGxpYnN0ZGMrKy4KKyAgICogIEBpbmdyb3VwIGJpbmRlcnMKKyAgICovCisgIHRlbXBsYXRlPGludCBfTnVtPiBzdHJ1Y3QgX1BsYWNlaG9sZGVyIHsgfTsKKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKiogQG5hbWVzcGFjZSBzdGQ6OnBsYWNlaG9sZGVycworICAgKiAgQGJyaWVmIElTTyBDKysxMSBlbnRpdGllcyBzdWItbmFtZXNwYWNlIGZvciBmdW5jdGlvbmFsLgorICAgKiAgQGluZ3JvdXAgYmluZGVycworICAgKi8KKyAgbmFtZXNwYWNlIHBsYWNlaG9sZGVycworICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisgIC8qIERlZmluZSBhIGxhcmdlIG51bWJlciBvZiBwbGFjZWhvbGRlcnMuIFRoZXJlIGlzIG5vIHdheSB0bworICAgKiBzaW1wbGlmeSB0aGlzIHdpdGggdmFyaWFkaWMgdGVtcGxhdGVzLCBiZWNhdXNlIHdlJ3JlIGludHJvZHVjaW5nCisgICAqIHVuaXF1ZSBuYW1lcyBmb3IgZWFjaC4KKyAgICovCisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwxPiBfMTsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDI+IF8yOworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8Mz4gXzM7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjw0PiBfNDsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDU+IF81OworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8Nj4gXzY7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjw3PiBfNzsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDg+IF84OworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8OT4gXzk7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwxMD4gXzEwOworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8MTE+IF8xMTsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDEyPiBfMTI7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwxMz4gXzEzOworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8MTQ+IF8xNDsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDE1PiBfMTU7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwxNj4gXzE2OworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8MTc+IF8xNzsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDE4PiBfMTg7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwxOT4gXzE5OworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8MjA+IF8yMDsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDIxPiBfMjE7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwyMj4gXzIyOworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8MjM+IF8yMzsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDI0PiBfMjQ7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwyNT4gXzI1OworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8MjY+IF8yNjsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDI3PiBfMjc7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwyOD4gXzI4OworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8Mjk+IF8yOTsKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0KKworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgUGFydGlhbCBzcGVjaWFsaXphdGlvbiBvZiBpc19wbGFjZWhvbGRlciB0aGF0IHByb3ZpZGVzIHRoZSBwbGFjZWhvbGRlcgorICAgKiAgbnVtYmVyIGZvciB0aGUgcGxhY2Vob2xkZXIgb2JqZWN0cyBkZWZpbmVkIGJ5IGxpYnN0ZGMrKy4KKyAgICogIEBpbmdyb3VwIGJpbmRlcnMKKyAgICovCisgIHRlbXBsYXRlPGludCBfTnVtPgorICAgIHN0cnVjdCBpc19wbGFjZWhvbGRlcjxfUGxhY2Vob2xkZXI8X051bT4gPgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGludCwgX051bT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8aW50IF9OdW0+CisgICAgc3RydWN0IGlzX3BsYWNlaG9sZGVyPGNvbnN0IF9QbGFjZWhvbGRlcjxfTnVtPiA+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8aW50LCBfTnVtPgorICAgIHsgfTsKKworICAvKioKKyAgICogVXNlZCBieSBfU2FmZV90dXBsZV9lbGVtZW50IHRvIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgbm8gdHVwbGUKKyAgICogZWxlbWVudCBhdCB0aGlzIHBvc2l0aW9uLgorICAgKi8KKyAgc3RydWN0IF9Ob190dXBsZV9lbGVtZW50OworCisgIC8qKgorICAgKiBJbXBsZW1lbnRhdGlvbiBoZWxwZXIgZm9yIF9TYWZlX3R1cGxlX2VsZW1lbnQuIFRoaXMgcHJpbWFyeQorICAgKiB0ZW1wbGF0ZSBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGl0IGlzIHNhZmUgdG8gdXNlIEBjCisgICAqIHR1cGxlX2VsZW1lbnQuCisgICAqLworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfX2ksIHR5cGVuYW1lIF9UdXBsZSwgYm9vbCBfSXNTYWZlPgorICAgIHN0cnVjdCBfU2FmZV90dXBsZV9lbGVtZW50X2ltcGwKKyAgICA6IHR1cGxlX2VsZW1lbnQ8X19pLCBfVHVwbGU+IHsgfTsKKworICAvKioKKyAgICogSW1wbGVtZW50YXRpb24gaGVscGVyIGZvciBfU2FmZV90dXBsZV9lbGVtZW50LiBUaGlzIHBhcnRpYWwKKyAgICogc3BlY2lhbGl6YXRpb24gaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBpdCBpcyBub3Qgc2FmZSB0byB1c2UgQGMKKyAgICogdHVwbGVfZWxlbWVudC4gV2UganVzdCByZXR1cm4gQGMgX05vX3R1cGxlX2VsZW1lbnQuCisgICAqLworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfX2ksIHR5cGVuYW1lIF9UdXBsZT4KKyAgICBzdHJ1Y3QgX1NhZmVfdHVwbGVfZWxlbWVudF9pbXBsPF9faSwgX1R1cGxlLCBmYWxzZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9Ob190dXBsZV9lbGVtZW50IHR5cGU7CisgICAgfTsKKworICAvKioKKyAgICogTGlrZSB0dXBsZV9lbGVtZW50LCBidXQgcmV0dXJucyBAYyBfTm9fdHVwbGVfZWxlbWVudCB3aGVuCisgICAqIHR1cGxlX2VsZW1lbnQgd291bGQgcmV0dXJuIGFuIGVycm9yLgorICAgKi8KKyB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfX2ksIHR5cGVuYW1lIF9UdXBsZT4KKyAgIHN0cnVjdCBfU2FmZV90dXBsZV9lbGVtZW50CisgICA6IF9TYWZlX3R1cGxlX2VsZW1lbnRfaW1wbDxfX2ksIF9UdXBsZSwKKwkJCSAgICAgIChfX2kgPCB0dXBsZV9zaXplPF9UdXBsZT46OnZhbHVlKT4KKyAgIHsgfTsKKworICAvKioKKyAgICogIE1hcHMgYW4gYXJndW1lbnQgdG8gYmluZCgpIGludG8gYW4gYWN0dWFsIGFyZ3VtZW50IHRvIHRoZSBib3VuZAorICAgKiAgZnVuY3Rpb24gb2JqZWN0IFtUUjEgMy42LjMvNV0uIE9ubHkgdGhlIGZpcnN0IHBhcmFtZXRlciBzaG91bGQKKyAgICogIGJlIHNwZWNpZmllZDogdGhlIHJlc3QgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIGFtb25nIHRoZSB2YXJpb3VzCisgICAqICBpbXBsZW1lbnRhdGlvbnMuIE5vdGUgdGhhdCwgYWx0aG91Z2ggdGhpcyBjbGFzcyBpcyBhIGZ1bmN0aW9uCisgICAqICBvYmplY3QsIGl0IGlzbid0IGVudGlyZWx5IG5vcm1hbCBiZWNhdXNlIGl0IHRha2VzIG9ubHkgdHdvCisgICAqICBwYXJhbWV0ZXJzIHJlZ2FyZGxlc3Mgb2YgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUKKyAgICogIGJpbmQgZXhwcmVzc2lvbi4gVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgYm91bmQgYXJndW1lbnQgYW5kCisgICAqICB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgcmVmZXJlbmNlcyB0byB0aGUKKyAgICogIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BcmcsCisJICAgYm9vbCBfSXNCaW5kRXhwID0gaXNfYmluZF9leHByZXNzaW9uPF9Bcmc+Ojp2YWx1ZSwKKwkgICBib29sIF9Jc1BsYWNlaG9sZGVyID0gKGlzX3BsYWNlaG9sZGVyPF9Bcmc+Ojp2YWx1ZSA+IDApPgorICAgIGNsYXNzIF9NdTsKKworICAvKioKKyAgICogIElmIHRoZSBhcmd1bWVudCBpcyByZWZlcmVuY2Vfd3JhcHBlcjxfVHA+LCByZXR1cm5zIHRoZQorICAgKiAgdW5kZXJseWluZyByZWZlcmVuY2UuIFtUUjEgMy42LjMvNSBidWxsZXQgMV0KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBfTXU8cmVmZXJlbmNlX3dyYXBwZXI8X1RwPiwgZmFsc2UsIGZhbHNlPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCYgcmVzdWx0X3R5cGU7CisKKyAgICAgIC8qIE5vdGU6IFRoaXMgd29uJ3QgYWN0dWFsbHkgd29yayBmb3IgY29uc3Qgdm9sYXRpbGUKKyAgICAgICAqIHJlZmVyZW5jZV93cmFwcGVycywgYmVjYXVzZSByZWZlcmVuY2Vfd3JhcHBlcjo6Z2V0KCkgaXMgY29uc3QKKyAgICAgICAqIGJ1dCBub3Qgdm9sYXRpbGUtcXVhbGlmaWVkLiBUaGlzIG1pZ2h0IGJlIGEgZGVmZWN0IGluIHRoZSBUUi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NWUmVmLCB0eXBlbmFtZSBfVHVwbGU+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9DVlJlZiYgX19hcmcsIF9UdXBsZSYpIGNvbnN0IHZvbGF0aWxlCisJeyByZXR1cm4gX19hcmcuZ2V0KCk7IH0KKyAgICB9OworCisgIC8qKgorICAgKiAgSWYgdGhlIGFyZ3VtZW50IGlzIGEgYmluZCBleHByZXNzaW9uLCB3ZSBpbnZva2UgdGhlIHVuZGVybHlpbmcKKyAgICogIGZ1bmN0aW9uIG9iamVjdCB3aXRoIHRoZSBzYW1lIGN2LXF1YWxpZmllcnMgYXMgd2UgYXJlIGdpdmVuIGFuZAorICAgKiAgcGFzcyBhbG9uZyBhbGwgb2Ygb3VyIGFyZ3VtZW50cyAodW53cmFwcGVkKS4gW1RSMSAzLjYuMy81IGJ1bGxldCAyXQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKyAgICBjbGFzcyBfTXU8X0FyZywgdHJ1ZSwgZmFsc2U+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DVkFyZywgdHlwZW5hbWUuLi4gX0FyZ3M+CisJYXV0bworCW9wZXJhdG9yKCkoX0NWQXJnJiBfX2FyZywKKwkJICAgdHVwbGU8X0FyZ3MuLi4+JiBfX3R1cGxlKSBjb25zdCB2b2xhdGlsZQorCS0+IGRlY2x0eXBlKF9fYXJnKGRlY2x2YWw8X0FyZ3M+KCkuLi4pKQorCXsKKwkgIC8vIENvbnN0cnVjdCBhbiBpbmRleCB0dXBsZSBhbmQgZm9yd2FyZCB0byBfX2NhbGwKKwkgIHR5cGVkZWYgdHlwZW5hbWUgX0J1aWxkX2luZGV4X3R1cGxlPHNpemVvZi4uLihfQXJncyk+OjpfX3R5cGUKKwkgICAgX0luZGV4ZXM7CisJICByZXR1cm4gdGhpcy0+X19jYWxsKF9fYXJnLCBfX3R1cGxlLCBfSW5kZXhlcygpKTsKKwl9CisKKyAgICBwcml2YXRlOgorICAgICAgLy8gSW52b2tlcyB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3QgX19hcmcgYnkgdW5wYWNraW5nIGFsbAorICAgICAgLy8gb2YgdGhlIGFyZ3VtZW50cyBpbiB0aGUgdHVwbGUuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1ZBcmcsIHR5cGVuYW1lLi4uIF9BcmdzLCBzdGQ6OnNpemVfdC4uLiBfSW5kZXhlcz4KKwlhdXRvCisJX19jYWxsKF9DVkFyZyYgX19hcmcsIHR1cGxlPF9BcmdzLi4uPiYgX190dXBsZSwKKwkgICAgICAgY29uc3QgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPiYpIGNvbnN0IHZvbGF0aWxlCisJLT4gZGVjbHR5cGUoX19hcmcoZGVjbHZhbDxfQXJncz4oKS4uLikpCisJeworCSAgcmV0dXJuIF9fYXJnKHN0ZDo6Zm9yd2FyZDxfQXJncz4oZ2V0PF9JbmRleGVzPihfX3R1cGxlKSkuLi4pOworCX0KKyAgICB9OworCisgIC8qKgorICAgKiAgSWYgdGhlIGFyZ3VtZW50IGlzIGEgcGxhY2Vob2xkZXIgZm9yIHRoZSBOdGggYXJndW1lbnQsIHJldHVybnMKKyAgICogIGEgcmVmZXJlbmNlIHRvIHRoZSBOdGggYXJndW1lbnQgdG8gdGhlIGJpbmQgZnVuY3Rpb24gb2JqZWN0LgorICAgKiAgW1RSMSAzLjYuMy81IGJ1bGxldCAzXQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKyAgICBjbGFzcyBfTXU8X0FyZywgZmFsc2UsIHRydWU+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+IGNsYXNzIHJlc3VsdDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NWTXUsIHR5cGVuYW1lIF9DVkFyZywgdHlwZW5hbWUgX1R1cGxlPgorCWNsYXNzIHJlc3VsdDxfQ1ZNdShfQ1ZBcmcsIF9UdXBsZSk+CisJeworCSAgLy8gQWRkIGEgcmVmZXJlbmNlLCBpZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIGRvbmUgZm9yIHVzLgorCSAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gYmUgYSBsaXR0bGUgYml0IHNsb3BweSBpbiBjb25zdHJ1Y3RpbmcKKwkgIC8vIHRoZSB0dXBsZSB0aGF0IHdlIHBhc3MgdG8gcmVzdWx0X29mPC4uLj4uCisJICB0eXBlZGVmIHR5cGVuYW1lIF9TYWZlX3R1cGxlX2VsZW1lbnQ8KGlzX3BsYWNlaG9sZGVyPF9Bcmc+Ojp2YWx1ZQorCQkJCQkJLSAxKSwgX1R1cGxlPjo6dHlwZQorCSAgICBfX2Jhc2VfdHlwZTsKKworCXB1YmxpYzoKKwkgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX3J2YWx1ZV9yZWZlcmVuY2U8X19iYXNlX3R5cGU+Ojp0eXBlIHR5cGU7CisJfTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1R1cGxlPgorCXR5cGVuYW1lIHJlc3VsdDxfTXUoX0FyZywgX1R1cGxlKT46OnR5cGUKKwlvcGVyYXRvcigpKGNvbnN0IHZvbGF0aWxlIF9BcmcmLCBfVHVwbGUmIF9fdHVwbGUpIGNvbnN0IHZvbGF0aWxlCisJeworCSAgcmV0dXJuIHN0ZDo6Zm9yd2FyZDx0eXBlbmFtZSByZXN1bHQ8X011KF9BcmcsIF9UdXBsZSk+Ojp0eXBlPigKKwkgICAgICA6OnN0ZDo6Z2V0PChpc19wbGFjZWhvbGRlcjxfQXJnPjo6dmFsdWUgLSAxKT4oX190dXBsZSkpOworCX0KKyAgICB9OworCisgIC8qKgorICAgKiAgSWYgdGhlIGFyZ3VtZW50IGlzIGp1c3QgYSB2YWx1ZSwgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGF0CisgICAqICB2YWx1ZS4gVGhlIGN2LXF1YWxpZmllcnMgb24gdGhlIHJlZmVyZW5jZSBhcmUgdGhlIHNhbWUgYXMgdGhlCisgICAqICBjdi1xdWFsaWZpZXJzIG9uIHRoZSBfTXUgb2JqZWN0LiBbVFIxIDMuNi4zLzUgYnVsbGV0IDRdCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorICAgIGNsYXNzIF9NdTxfQXJnLCBmYWxzZSwgZmFsc2U+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+IHN0cnVjdCByZXN1bHQ7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DVk11LCB0eXBlbmFtZSBfQ1ZBcmcsIHR5cGVuYW1lIF9UdXBsZT4KKwlzdHJ1Y3QgcmVzdWx0PF9DVk11KF9DVkFyZywgX1R1cGxlKT4KKwl7CisJICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlPF9DVkFyZz46OnR5cGUgdHlwZTsKKwl9OworCisgICAgICAvLyBQaWNrIHVwIHRoZSBjdi1xdWFsaWZpZXJzIG9mIHRoZSBhcmd1bWVudAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NWQXJnLCB0eXBlbmFtZSBfVHVwbGU+CisJX0NWQXJnJiYKKwlvcGVyYXRvcigpKF9DVkFyZyYmIF9fYXJnLCBfVHVwbGUmKSBjb25zdCB2b2xhdGlsZQorCXsgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxfQ1ZBcmc+KF9fYXJnKTsgfQorICAgIH07CisKKyAgLyoqCisgICAqICBNYXBzIG1lbWJlciBwb2ludGVycyBpbnRvIGluc3RhbmNlcyBvZiBfTWVtX2ZuIGJ1dCBsZWF2ZXMgYWxsCisgICAqICBvdGhlciBmdW5jdGlvbiBvYmplY3RzIHVudG91Y2hlZC4gVXNlZCBieSB0cjE6OmJpbmQoKS4gVGhlCisgICAqICBwcmltYXJ5IHRlbXBsYXRlIGhhbmRsZXMgdGhlIG5vbi0tbWVtYmVyLXBvaW50ZXIgY2FzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX01heWJlX3dyYXBfbWVtYmVyX3BvaW50ZXIKKyAgICB7CisgICAgICB0eXBlZGVmIF9UcCB0eXBlOworCisgICAgICBzdGF0aWMgY29uc3QgX1RwJgorICAgICAgX19kb193cmFwKGNvbnN0IF9UcCYgX194KQorICAgICAgeyByZXR1cm4gX194OyB9CisKKyAgICAgIHN0YXRpYyBfVHAmJgorICAgICAgX19kb193cmFwKF9UcCYmIF9feCkKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcCYmPihfX3gpOyB9CisgICAgfTsKKworICAvKioKKyAgICogIE1hcHMgbWVtYmVyIHBvaW50ZXJzIGludG8gaW5zdGFuY2VzIG9mIF9NZW1fZm4gYnV0IGxlYXZlcyBhbGwKKyAgICogIG90aGVyIGZ1bmN0aW9uIG9iamVjdHMgdW50b3VjaGVkLiBVc2VkIGJ5IHRyMTo6YmluZCgpLiBUaGlzCisgICAqICBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGhhbmRsZXMgdGhlIG1lbWJlciBwb2ludGVyIGNhc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9DbGFzcz4KKyAgICBzdHJ1Y3QgX01heWJlX3dyYXBfbWVtYmVyX3BvaW50ZXI8X1RwIF9DbGFzczo6Kj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9NZW1fZm48X1RwIF9DbGFzczo6Kj4gdHlwZTsKKworICAgICAgc3RhdGljIHR5cGUKKyAgICAgIF9fZG9fd3JhcChfVHAgX0NsYXNzOjoqIF9fcG0pCisgICAgICB7IHJldHVybiB0eXBlKF9fcG0pOyB9CisgICAgfTsKKworICAvLyBTcGVjaWFsaXphdGlvbiBuZWVkZWQgdG8gcHJldmVudCAiZm9ybWluZyByZWZlcmVuY2UgdG8gdm9pZCIgZXJyb3JzIHdoZW4KKyAgLy8gYmluZDx2b2lkPigpIGlzIGNhbGxlZCwgYmVjYXVzZSBhcmd1bWVudCBkZWR1Y3Rpb24gaW5zdGFudGlhdGVzCisgIC8vIF9NYXliZV93cmFwX21lbWJlcl9wb2ludGVyPHZvaWQ+IG91dHNpZGUgdGhlIGltbWVkaWF0ZSBjb250ZXh0IHdoZXJlCisgIC8vIFNGSU5BRSBhcHBsaWVzLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9NYXliZV93cmFwX21lbWJlcl9wb2ludGVyPHZvaWQ+CisgICAgeworICAgICAgdHlwZWRlZiB2b2lkIHR5cGU7CisgICAgfTsKKworICAvLyBzdGQ6OmdldDxJPiBmb3Igdm9sYXRpbGUtcXVhbGlmaWVkIHR1cGxlcworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSW5kLCB0eXBlbmFtZS4uLiBfVHA+CisgICAgaW5saW5lIGF1dG8KKyAgICBfX3ZvbGdldCh2b2xhdGlsZSB0dXBsZTxfVHAuLi4+JiBfX3R1cGxlKQorICAgIC0+IHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0luZCwgdHVwbGU8X1RwLi4uPj46OnR5cGUgdm9sYXRpbGUmCisgICAgeyByZXR1cm4gc3RkOjpnZXQ8X0luZD4oY29uc3RfY2FzdDx0dXBsZTxfVHAuLi4+Jj4oX190dXBsZSkpOyB9CisKKyAgLy8gc3RkOjpnZXQ8ST4gZm9yIGNvbnN0LXZvbGF0aWxlLXF1YWxpZmllZCB0dXBsZXMKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0luZCwgdHlwZW5hbWUuLi4gX1RwPgorICAgIGlubGluZSBhdXRvCisgICAgX192b2xnZXQoY29uc3Qgdm9sYXRpbGUgdHVwbGU8X1RwLi4uPiYgX190dXBsZSkKKyAgICAtPiB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9JbmQsIHR1cGxlPF9UcC4uLj4+Ojp0eXBlIGNvbnN0IHZvbGF0aWxlJgorICAgIHsgcmV0dXJuIHN0ZDo6Z2V0PF9JbmQ+KGNvbnN0X2Nhc3Q8Y29uc3QgdHVwbGU8X1RwLi4uPiY+KF9fdHVwbGUpKTsgfQorCisgIC8vLyBUeXBlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QgcmV0dXJuZWQgZnJvbSBiaW5kKCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IF9CaW5kOworCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0JvdW5kX2FyZ3M+CisgICAgY2xhc3MgX0JpbmQ8X0Z1bmN0b3IoX0JvdW5kX2FyZ3MuLi4pPgorICAgIDogcHVibGljIF9XZWFrX3Jlc3VsdF90eXBlPF9GdW5jdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0JpbmQgX19zZWxmX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CdWlsZF9pbmRleF90dXBsZTxzaXplb2YuLi4oX0JvdW5kX2FyZ3MpPjo6X190eXBlCisJX0JvdW5kX2luZGV4ZXM7CisKKyAgICAgIF9GdW5jdG9yIF9NX2Y7CisgICAgICB0dXBsZTxfQm91bmRfYXJncy4uLj4gX01fYm91bmRfYXJnczsKKworICAgICAgLy8gQ2FsbCB1bnF1YWxpZmllZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUuLi4gX0FyZ3MsIHN0ZDo6c2l6ZV90Li4uIF9JbmRleGVzPgorCV9SZXN1bHQKKwlfX2NhbGwodHVwbGU8X0FyZ3MuLi4+JiYgX19hcmdzLCBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+KQorCXsKKwkgIHJldHVybiBfTV9mKF9NdTxfQm91bmRfYXJncz4oKQorCQkgICAgICAoZ2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisJfQorCisgICAgICAvLyBDYWxsIGFzIGNvbnN0CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZS4uLiBfQXJncywgc3RkOjpzaXplX3QuLi4gX0luZGV4ZXM+CisJX1Jlc3VsdAorCV9fY2FsbF9jKHR1cGxlPF9BcmdzLi4uPiYmIF9fYXJncywgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPikgY29uc3QKKwl7CisJICByZXR1cm4gX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKwkJICAgICAgKGdldDxfSW5kZXhlcz4oX01fYm91bmRfYXJncyksIF9fYXJncykuLi4pOworCX0KKworICAgICAgLy8gQ2FsbCBhcyB2b2xhdGlsZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUuLi4gX0FyZ3MsIHN0ZDo6c2l6ZV90Li4uIF9JbmRleGVzPgorCV9SZXN1bHQKKwlfX2NhbGxfdih0dXBsZTxfQXJncy4uLj4mJiBfX2FyZ3MsCisJCSBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+KSB2b2xhdGlsZQorCXsKKwkgIHJldHVybiBfTV9mKF9NdTxfQm91bmRfYXJncz4oKQorCQkgICAgICAoX192b2xnZXQ8X0luZGV4ZXM+KF9NX2JvdW5kX2FyZ3MpLCBfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICAgIC8vIENhbGwgYXMgY29uc3Qgdm9sYXRpbGUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lLi4uIF9BcmdzLCBzdGQ6OnNpemVfdC4uLiBfSW5kZXhlcz4KKwlfUmVzdWx0CisJX19jYWxsX2Nfdih0dXBsZTxfQXJncy4uLj4mJiBfX2FyZ3MsCisJCSAgIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4pIGNvbnN0IHZvbGF0aWxlCisJeworCSAgcmV0dXJuIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisJCSAgICAgIChfX3ZvbGdldDxfSW5kZXhlcz4oX01fYm91bmRfYXJncyksIF9fYXJncykuLi4pOworCX0KKworICAgICBwdWJsaWM6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlleHBsaWNpdCBfQmluZChjb25zdCBfRnVuY3RvciYgX19mLCBfQXJncyYmLi4uIF9fYXJncykKKwk6IF9NX2YoX19mKSwgX01fYm91bmRfYXJncyhzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pCisJeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWV4cGxpY2l0IF9CaW5kKF9GdW5jdG9yJiYgX19mLCBfQXJncyYmLi4uIF9fYXJncykKKwk6IF9NX2Yoc3RkOjptb3ZlKF9fZikpLCBfTV9ib3VuZF9hcmdzKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikKKwl7IH0KKworICAgICAgX0JpbmQoY29uc3QgX0JpbmQmKSA9IGRlZmF1bHQ7CisKKyAgICAgIF9CaW5kKF9CaW5kJiYgX19iKQorICAgICAgOiBfTV9mKHN0ZDo6bW92ZShfX2IuX01fZikpLCBfTV9ib3VuZF9hcmdzKHN0ZDo6bW92ZShfX2IuX01fYm91bmRfYXJncykpCisgICAgICB7IH0KKworICAgICAgLy8gQ2FsbCB1bnF1YWxpZmllZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIHR5cGVuYW1lIF9SZXN1bHQKKwk9IGRlY2x0eXBlKCBzdGQ6OmRlY2x2YWw8X0Z1bmN0b3I+KCkoCisJICAgICAgX011PF9Cb3VuZF9hcmdzPigpKCBzdGQ6OmRlY2x2YWw8X0JvdW5kX2FyZ3MmPigpLAorCQkJCSAgc3RkOjpkZWNsdmFsPHR1cGxlPF9BcmdzLi4uPiY+KCkgKS4uLiApICk+CisJX1Jlc3VsdAorCW9wZXJhdG9yKCkoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgcmV0dXJuIHRoaXMtPl9fY2FsbDxfUmVzdWx0PigKKwkgICAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSwKKwkgICAgICBfQm91bmRfaW5kZXhlcygpKTsKKwl9CisKKyAgICAgIC8vIENhbGwgYXMgY29uc3QKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzLCB0eXBlbmFtZSBfUmVzdWx0CisJPSBkZWNsdHlwZSggc3RkOjpkZWNsdmFsPHR5cGVuYW1lIGVuYWJsZV9pZjwoc2l6ZW9mLi4uKF9BcmdzKSA+PSAwKSwKKwkJICAgICAgIHR5cGVuYW1lIGFkZF9jb25zdDxfRnVuY3Rvcj46OnR5cGU+Ojp0eXBlPigpKAorCSAgICAgIF9NdTxfQm91bmRfYXJncz4oKSggc3RkOjpkZWNsdmFsPGNvbnN0IF9Cb3VuZF9hcmdzJj4oKSwKKwkJCQkgIHN0ZDo6ZGVjbHZhbDx0dXBsZTxfQXJncy4uLj4mPigpICkuLi4gKSApPgorCV9SZXN1bHQKKwlvcGVyYXRvcigpKF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsKKwkgIHJldHVybiB0aGlzLT5fX2NhbGxfYzxfUmVzdWx0PigKKwkgICAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSwKKwkgICAgICBfQm91bmRfaW5kZXhlcygpKTsKKwl9CisKKyAgICAgIC8vIENhbGwgYXMgdm9sYXRpbGUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzLCB0eXBlbmFtZSBfUmVzdWx0CisJPSBkZWNsdHlwZSggc3RkOjpkZWNsdmFsPHR5cGVuYW1lIGVuYWJsZV9pZjwoc2l6ZW9mLi4uKF9BcmdzKSA+PSAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgYWRkX3ZvbGF0aWxlPF9GdW5jdG9yPjo6dHlwZT46OnR5cGU+KCkoCisJICAgICAgX011PF9Cb3VuZF9hcmdzPigpKCBzdGQ6OmRlY2x2YWw8dm9sYXRpbGUgX0JvdW5kX2FyZ3MmPigpLAorCQkJCSAgc3RkOjpkZWNsdmFsPHR1cGxlPF9BcmdzLi4uPiY+KCkgKS4uLiApICk+CisJX1Jlc3VsdAorCW9wZXJhdG9yKCkoX0FyZ3MmJi4uLiBfX2FyZ3MpIHZvbGF0aWxlCisJeworCSAgcmV0dXJuIHRoaXMtPl9fY2FsbF92PF9SZXN1bHQ+KAorCSAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLAorCSAgICAgIF9Cb3VuZF9pbmRleGVzKCkpOworCX0KKworICAgICAgLy8gQ2FsbCBhcyBjb25zdCB2b2xhdGlsZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIHR5cGVuYW1lIF9SZXN1bHQKKwk9IGRlY2x0eXBlKCBzdGQ6OmRlY2x2YWw8dHlwZW5hbWUgZW5hYmxlX2lmPChzaXplb2YuLi4oX0FyZ3MpID49IDApLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBhZGRfY3Y8X0Z1bmN0b3I+Ojp0eXBlPjo6dHlwZT4oKSgKKwkgICAgICBfTXU8X0JvdW5kX2FyZ3M+KCkoIHN0ZDo6ZGVjbHZhbDxjb25zdCB2b2xhdGlsZSBfQm91bmRfYXJncyY+KCksCisJCQkJICBzdGQ6OmRlY2x2YWw8dHVwbGU8X0FyZ3MuLi4+Jj4oKSApLi4uICkgKT4KKwlfUmVzdWx0CisJb3BlcmF0b3IoKShfQXJncyYmLi4uIF9fYXJncykgY29uc3Qgdm9sYXRpbGUKKwl7CisJICByZXR1cm4gdGhpcy0+X19jYWxsX2NfdjxfUmVzdWx0PigKKwkgICAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSwKKwkgICAgICBfQm91bmRfaW5kZXhlcygpKTsKKwl9CisgICAgfTsKKworICAvLy8gVHlwZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0IHJldHVybmVkIGZyb20gYmluZDxSPigpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBfQmluZF9yZXN1bHQ7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9Cb3VuZF9hcmdzPgorICAgIGNsYXNzIF9CaW5kX3Jlc3VsdDxfUmVzdWx0LCBfRnVuY3RvcihfQm91bmRfYXJncy4uLik+CisgICAgeworICAgICAgdHlwZWRlZiBfQmluZF9yZXN1bHQgX19zZWxmX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CdWlsZF9pbmRleF90dXBsZTxzaXplb2YuLi4oX0JvdW5kX2FyZ3MpPjo6X190eXBlCisJX0JvdW5kX2luZGV4ZXM7CisKKyAgICAgIF9GdW5jdG9yIF9NX2Y7CisgICAgICB0dXBsZTxfQm91bmRfYXJncy4uLj4gX01fYm91bmRfYXJnczsKKworICAgICAgLy8gc2ZpbmFlIHR5cGVzCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorCXN0cnVjdCBfX2VuYWJsZV9pZl92b2lkIDogZW5hYmxlX2lmPGlzX3ZvaWQ8X1Jlcz46OnZhbHVlLCBpbnQ+IHsgfTsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisJc3RydWN0IF9fZGlzYWJsZV9pZl92b2lkIDogZW5hYmxlX2lmPCFpc192b2lkPF9SZXM+Ojp2YWx1ZSwgaW50PiB7IH07CisKKyAgICAgIC8vIENhbGwgdW5xdWFsaWZpZWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdzLCBzdGQ6OnNpemVfdC4uLiBfSW5kZXhlcz4KKwlfUmVzdWx0CisJX19jYWxsKHR1cGxlPF9BcmdzLi4uPiYmIF9fYXJncywgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPiwKKwkgICAgdHlwZW5hbWUgX19kaXNhYmxlX2lmX3ZvaWQ8X1Jlcz46OnR5cGUgPSAwKQorCXsKKwkgIHJldHVybiBfTV9mKF9NdTxfQm91bmRfYXJncz4oKQorCQkgICAgICAoZ2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisJfQorCisgICAgICAvLyBDYWxsIHVucXVhbGlmaWVkLCByZXR1cm4gdm9pZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ3MsIHN0ZDo6c2l6ZV90Li4uIF9JbmRleGVzPgorCXZvaWQKKwlfX2NhbGwodHVwbGU8X0FyZ3MuLi4+JiYgX19hcmdzLCBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+LAorCSAgICB0eXBlbmFtZSBfX2VuYWJsZV9pZl92b2lkPF9SZXM+Ojp0eXBlID0gMCkKKwl7CisJICBfTV9mKF9NdTxfQm91bmRfYXJncz4oKQorCSAgICAgICAoZ2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisJfQorCisgICAgICAvLyBDYWxsIGFzIGNvbnN0CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJncywgc3RkOjpzaXplX3QuLi4gX0luZGV4ZXM+CisJX1Jlc3VsdAorCV9fY2FsbCh0dXBsZTxfQXJncy4uLj4mJiBfX2FyZ3MsIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4sCisJICAgIHR5cGVuYW1lIF9fZGlzYWJsZV9pZl92b2lkPF9SZXM+Ojp0eXBlID0gMCkgY29uc3QKKwl7CisJICByZXR1cm4gX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKwkJICAgICAgKGdldDxfSW5kZXhlcz4oX01fYm91bmRfYXJncyksIF9fYXJncykuLi4pOworCX0KKworICAgICAgLy8gQ2FsbCBhcyBjb25zdCwgcmV0dXJuIHZvaWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdzLCBzdGQ6OnNpemVfdC4uLiBfSW5kZXhlcz4KKwl2b2lkCisJX19jYWxsKHR1cGxlPF9BcmdzLi4uPiYmIF9fYXJncywgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPiwKKwkgICAgdHlwZW5hbWUgX19lbmFibGVfaWZfdm9pZDxfUmVzPjo6dHlwZSA9IDApIGNvbnN0CisJeworCSAgX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKwkgICAgICAgKGdldDxfSW5kZXhlcz4oX01fYm91bmRfYXJncyksICBfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICAgIC8vIENhbGwgYXMgdm9sYXRpbGUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdzLCBzdGQ6OnNpemVfdC4uLiBfSW5kZXhlcz4KKwlfUmVzdWx0CisJX19jYWxsKHR1cGxlPF9BcmdzLi4uPiYmIF9fYXJncywgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPiwKKwkgICAgdHlwZW5hbWUgX19kaXNhYmxlX2lmX3ZvaWQ8X1Jlcz46OnR5cGUgPSAwKSB2b2xhdGlsZQorCXsKKwkgIHJldHVybiBfTV9mKF9NdTxfQm91bmRfYXJncz4oKQorCQkgICAgICAoX192b2xnZXQ8X0luZGV4ZXM+KF9NX2JvdW5kX2FyZ3MpLCBfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICAgIC8vIENhbGwgYXMgdm9sYXRpbGUsIHJldHVybiB2b2lkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJncywgc3RkOjpzaXplX3QuLi4gX0luZGV4ZXM+CisJdm9pZAorCV9fY2FsbCh0dXBsZTxfQXJncy4uLj4mJiBfX2FyZ3MsIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4sCisJICAgIHR5cGVuYW1lIF9fZW5hYmxlX2lmX3ZvaWQ8X1Jlcz46OnR5cGUgPSAwKSB2b2xhdGlsZQorCXsKKwkgIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisJICAgICAgIChfX3ZvbGdldDxfSW5kZXhlcz4oX01fYm91bmRfYXJncyksIF9fYXJncykuLi4pOworCX0KKworICAgICAgLy8gQ2FsbCBhcyBjb25zdCB2b2xhdGlsZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ3MsIHN0ZDo6c2l6ZV90Li4uIF9JbmRleGVzPgorCV9SZXN1bHQKKwlfX2NhbGwodHVwbGU8X0FyZ3MuLi4+JiYgX19hcmdzLCBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+LAorCSAgICB0eXBlbmFtZSBfX2Rpc2FibGVfaWZfdm9pZDxfUmVzPjo6dHlwZSA9IDApIGNvbnN0IHZvbGF0aWxlCisJeworCSAgcmV0dXJuIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisJCSAgICAgIChfX3ZvbGdldDxfSW5kZXhlcz4oX01fYm91bmRfYXJncyksIF9fYXJncykuLi4pOworCX0KKworICAgICAgLy8gQ2FsbCBhcyBjb25zdCB2b2xhdGlsZSwgcmV0dXJuIHZvaWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdzLCBzdGQ6OnNpemVfdC4uLiBfSW5kZXhlcz4KKwl2b2lkCisJX19jYWxsKHR1cGxlPF9BcmdzLi4uPiYmIF9fYXJncywKKwkgICAgICAgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPiwKKwkgICAgdHlwZW5hbWUgX19lbmFibGVfaWZfdm9pZDxfUmVzPjo6dHlwZSA9IDApIGNvbnN0IHZvbGF0aWxlCisJeworCSAgX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKwkgICAgICAgKF9fdm9sZ2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisJfQorCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfUmVzdWx0IHJlc3VsdF90eXBlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlleHBsaWNpdCBfQmluZF9yZXN1bHQoY29uc3QgX0Z1bmN0b3ImIF9fZiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJOiBfTV9mKF9fZiksIF9NX2JvdW5kX2FyZ3Moc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKQorCXsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlleHBsaWNpdCBfQmluZF9yZXN1bHQoX0Z1bmN0b3ImJiBfX2YsIF9BcmdzJiYuLi4gX19hcmdzKQorCTogX01fZihzdGQ6Om1vdmUoX19mKSksIF9NX2JvdW5kX2FyZ3Moc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKQorCXsgfQorCisgICAgICBfQmluZF9yZXN1bHQoY29uc3QgX0JpbmRfcmVzdWx0JikgPSBkZWZhdWx0OworCisgICAgICBfQmluZF9yZXN1bHQoX0JpbmRfcmVzdWx0JiYgX19iKQorICAgICAgOiBfTV9mKHN0ZDo6bW92ZShfX2IuX01fZikpLCBfTV9ib3VuZF9hcmdzKHN0ZDo6bW92ZShfX2IuX01fYm91bmRfYXJncykpCisgICAgICB7IH0KKworICAgICAgLy8gQ2FsbCB1bnF1YWxpZmllZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIHJldHVybiB0aGlzLT5fX2NhbGw8X1Jlc3VsdD4oCisJICAgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLiksCisJICAgICAgX0JvdW5kX2luZGV4ZXMoKSk7CisJfQorCisgICAgICAvLyBDYWxsIGFzIGNvbnN0CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeworCSAgcmV0dXJuIHRoaXMtPl9fY2FsbDxfUmVzdWx0PigKKwkgICAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSwKKwkgICAgICBfQm91bmRfaW5kZXhlcygpKTsKKwl9CisKKyAgICAgIC8vIENhbGwgYXMgdm9sYXRpbGUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfQXJncyYmLi4uIF9fYXJncykgdm9sYXRpbGUKKwl7CisJICByZXR1cm4gdGhpcy0+X19jYWxsPF9SZXN1bHQ+KAorCSAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLAorCSAgICAgIF9Cb3VuZF9pbmRleGVzKCkpOworCX0KKworICAgICAgLy8gQ2FsbCBhcyBjb25zdCB2b2xhdGlsZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdCB2b2xhdGlsZQorCXsKKwkgIHJldHVybiB0aGlzLT5fX2NhbGw8X1Jlc3VsdD4oCisJICAgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLiksCisJICAgICAgX0JvdW5kX2luZGV4ZXMoKSk7CisJfQorICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ2xhc3MgdGVtcGxhdGUgX0JpbmQgaXMgYWx3YXlzIGEgYmluZCBleHByZXNzaW9uLgorICAgKiAgQGluZ3JvdXAgYmluZGVycworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPF9CaW5kPF9TaWduYXR1cmU+ID4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIENsYXNzIHRlbXBsYXRlIF9CaW5kIGlzIGFsd2F5cyBhIGJpbmQgZXhwcmVzc2lvbi4KKyAgICogIEBpbmdyb3VwIGJpbmRlcnMKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjxjb25zdCBfQmluZDxfU2lnbmF0dXJlPiA+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICAvKioKKyAgICogIEBicmllZiBDbGFzcyB0ZW1wbGF0ZSBfQmluZCBpcyBhbHdheXMgYSBiaW5kIGV4cHJlc3Npb24uCisgICAqICBAaW5ncm91cCBiaW5kZXJzCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248dm9sYXRpbGUgX0JpbmQ8X1NpZ25hdHVyZT4gPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ2xhc3MgdGVtcGxhdGUgX0JpbmQgaXMgYWx3YXlzIGEgYmluZCBleHByZXNzaW9uLgorICAgKiAgQGluZ3JvdXAgYmluZGVycworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPGNvbnN0IHZvbGF0aWxlIF9CaW5kPF9TaWduYXR1cmU+PgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ2xhc3MgdGVtcGxhdGUgX0JpbmRfcmVzdWx0IGlzIGFsd2F5cyBhIGJpbmQgZXhwcmVzc2lvbi4KKyAgICogIEBpbmdyb3VwIGJpbmRlcnMKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjxfQmluZF9yZXN1bHQ8X1Jlc3VsdCwgX1NpZ25hdHVyZT4+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICAvKioKKyAgICogIEBicmllZiBDbGFzcyB0ZW1wbGF0ZSBfQmluZF9yZXN1bHQgaXMgYWx3YXlzIGEgYmluZCBleHByZXNzaW9uLgorICAgKiAgQGluZ3JvdXAgYmluZGVycworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPGNvbnN0IF9CaW5kX3Jlc3VsdDxfUmVzdWx0LCBfU2lnbmF0dXJlPj4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIENsYXNzIHRlbXBsYXRlIF9CaW5kX3Jlc3VsdCBpcyBhbHdheXMgYSBiaW5kIGV4cHJlc3Npb24uCisgICAqICBAaW5ncm91cCBiaW5kZXJzCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248dm9sYXRpbGUgX0JpbmRfcmVzdWx0PF9SZXN1bHQsIF9TaWduYXR1cmU+PgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ2xhc3MgdGVtcGxhdGUgX0JpbmRfcmVzdWx0IGlzIGFsd2F5cyBhIGJpbmQgZXhwcmVzc2lvbi4KKyAgICogIEBpbmdyb3VwIGJpbmRlcnMKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjxjb25zdCB2b2xhdGlsZSBfQmluZF9yZXN1bHQ8X1Jlc3VsdCwgX1NpZ25hdHVyZT4+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICAvLyBUcmFpdCB0eXBlIHVzZWQgdG8gcmVtb3ZlIHN0ZDo6YmluZCgpIGZyb20gb3ZlcmxvYWQgc2V0IHZpYSBTRklOQUUKKyAgLy8gd2hlbiBmaXJzdCBhcmd1bWVudCBoYXMgaW50ZWdlciB0eXBlLCBzbyB0aGF0IHN0ZDo6YmluZCgpIHdpbGwKKyAgLy8gbm90IGJlIGEgYmV0dGVyIG1hdGNoIHRoYW4gOjpiaW5kKCkgZnJvbSB0aGUgQlNEIFNvY2tldHMgQVBJLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UcDIgPSB0eXBlbmFtZSBkZWNheTxfVHA+Ojp0eXBlPgorICAgIHVzaW5nIF9faXNfc29ja2V0bGlrZSA9IF9fb3JfPGlzX2ludGVncmFsPF9UcDI+LCBpc19lbnVtPF9UcDI+PjsKKworICB0ZW1wbGF0ZTxib29sIF9Tb2NrZXRMaWtlLCB0eXBlbmFtZSBfRnVuYywgdHlwZW5hbWUuLi4gX0JvdW5kQXJncz4KKyAgICBzdHJ1Y3QgX0JpbmRfaGVscGVyCisgICAgeworICAgICAgdHlwZWRlZiBfTWF5YmVfd3JhcF9tZW1iZXJfcG9pbnRlcjx0eXBlbmFtZSBkZWNheTxfRnVuYz46OnR5cGU+CisJX19tYXliZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX21heWJlX3R5cGU6OnR5cGUgX19mdW5jX3R5cGU7CisgICAgICB0eXBlZGVmIF9CaW5kPF9fZnVuY190eXBlKHR5cGVuYW1lIGRlY2F5PF9Cb3VuZEFyZ3M+Ojp0eXBlLi4uKT4gdHlwZTsKKyAgICB9OworCisgIC8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yIGlzX3NvY2tldGxpa2UgPT0gdHJ1ZSwgZG9lcyBub3QgZGVmaW5lCisgIC8vIG5lc3RlZCB0eXBlIHNvIHN0ZDo6YmluZCgpIHdpbGwgbm90IHBhcnRpY2lwYXRlIGluIG92ZXJsb2FkIHJlc29sdXRpb24KKyAgLy8gd2hlbiB0aGUgZmlyc3QgYXJndW1lbnQgbWlnaHQgYmUgYSBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYywgdHlwZW5hbWUuLi4gX0JvdW5kQXJncz4KKyAgICBzdHJ1Y3QgX0JpbmRfaGVscGVyPHRydWUsIF9GdW5jLCBfQm91bmRBcmdzLi4uPgorICAgIHsgfTsKKworICAvKioKKyAgICogIEBicmllZiBGdW5jdGlvbiB0ZW1wbGF0ZSBmb3Igc3RkOjpiaW5kLgorICAgKiAgQGluZ3JvdXAgYmluZGVycworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmMsIHR5cGVuYW1lLi4uIF9Cb3VuZEFyZ3M+CisgICAgaW5saW5lIHR5cGVuYW1lCisgICAgX0JpbmRfaGVscGVyPF9faXNfc29ja2V0bGlrZTxfRnVuYz46OnZhbHVlLCBfRnVuYywgX0JvdW5kQXJncy4uLj46OnR5cGUKKyAgICBiaW5kKF9GdW5jJiYgX19mLCBfQm91bmRBcmdzJiYuLi4gX19hcmdzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgX0JpbmRfaGVscGVyPGZhbHNlLCBfRnVuYywgX0JvdW5kQXJncy4uLj4gX19oZWxwZXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19oZWxwZXJfdHlwZTo6X19tYXliZV90eXBlIF9fbWF5YmVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19oZWxwZXJfdHlwZTo6dHlwZSBfX3Jlc3VsdF90eXBlOworICAgICAgcmV0dXJuIF9fcmVzdWx0X3R5cGUoX19tYXliZV90eXBlOjpfX2RvX3dyYXAoc3RkOjpmb3J3YXJkPF9GdW5jPihfX2YpKSwKKwkJCSAgIHN0ZDo6Zm9yd2FyZDxfQm91bmRBcmdzPihfX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX0Z1bmMsIHR5cGVuYW1lLi4uIF9Cb3VuZEFyZ3M+CisgICAgc3RydWN0IF9CaW5kcmVzX2hlbHBlcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX01heWJlX3dyYXBfbWVtYmVyX3BvaW50ZXI8dHlwZW5hbWUgZGVjYXk8X0Z1bmM+Ojp0eXBlPgorCV9fbWF5YmVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19tYXliZV90eXBlOjp0eXBlIF9fZnVuY3Rvcl90eXBlOworICAgICAgdHlwZWRlZiBfQmluZF9yZXN1bHQ8X1Jlc3VsdCwKKwkJCSAgIF9fZnVuY3Rvcl90eXBlKHR5cGVuYW1lIGRlY2F5PF9Cb3VuZEFyZ3M+Ojp0eXBlLi4uKT4KKwl0eXBlOworICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgRnVuY3Rpb24gdGVtcGxhdGUgZm9yIHN0ZDo6YmluZDxSPi4KKyAgICogIEBpbmdyb3VwIGJpbmRlcnMKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9GdW5jLCB0eXBlbmFtZS4uLiBfQm91bmRBcmdzPgorICAgIGlubGluZQorICAgIHR5cGVuYW1lIF9CaW5kcmVzX2hlbHBlcjxfUmVzdWx0LCBfRnVuYywgX0JvdW5kQXJncy4uLj46OnR5cGUKKyAgICBiaW5kKF9GdW5jJiYgX19mLCBfQm91bmRBcmdzJiYuLi4gX19hcmdzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgX0JpbmRyZXNfaGVscGVyPF9SZXN1bHQsIF9GdW5jLCBfQm91bmRBcmdzLi4uPiBfX2hlbHBlcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2hlbHBlcl90eXBlOjpfX21heWJlX3R5cGUgX19tYXliZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2hlbHBlcl90eXBlOjp0eXBlIF9fcmVzdWx0X3R5cGU7CisgICAgICByZXR1cm4gX19yZXN1bHRfdHlwZShfX21heWJlX3R5cGU6Ol9fZG9fd3JhcChzdGQ6OmZvcndhcmQ8X0Z1bmM+KF9fZikpLAorCQkJICAgc3RkOjpmb3J3YXJkPF9Cb3VuZEFyZ3M+KF9fYXJncykuLi4pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBfQmluZF9zaW1wbGU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NhbGxhYmxlLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgX0JpbmRfc2ltcGxlPF9DYWxsYWJsZShfQXJncy4uLik+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSByZXN1bHRfb2Y8X0NhbGxhYmxlKF9BcmdzLi4uKT46OnR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzMiwgdHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICAgICAgICAgZW5hYmxlX2lmPCBzaXplb2YuLi4oX0FyZ3MpID09IHNpemVvZi4uLihfQXJnczIpPjo6dHlwZT4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgX0JpbmRfc2ltcGxlKGNvbnN0IF9DYWxsYWJsZSYgX19jYWxsYWJsZSwgX0FyZ3MyJiYuLi4gX19hcmdzKQorICAgICAgICA6IF9NX2JvdW5kKF9fY2FsbGFibGUsIHN0ZDo6Zm9yd2FyZDxfQXJnczI+KF9fYXJncykuLi4pCisgICAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJnczIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgICAgICAgIGVuYWJsZV9pZjwgc2l6ZW9mLi4uKF9BcmdzKSA9PSBzaXplb2YuLi4oX0FyZ3MyKT46OnR5cGU+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIF9CaW5kX3NpbXBsZShfQ2FsbGFibGUmJiBfX2NhbGxhYmxlLCBfQXJnczImJi4uLiBfX2FyZ3MpCisgICAgICAgIDogX01fYm91bmQoc3RkOjptb3ZlKF9fY2FsbGFibGUpLCBzdGQ6OmZvcndhcmQ8X0FyZ3MyPihfX2FyZ3MpLi4uKQorICAgICAgICB7IH0KKworICAgICAgX0JpbmRfc2ltcGxlKGNvbnN0IF9CaW5kX3NpbXBsZSYpID0gZGVmYXVsdDsKKyAgICAgIF9CaW5kX3NpbXBsZShfQmluZF9zaW1wbGUmJikgPSBkZWZhdWx0OworCisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKSgpCisgICAgICB7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0J1aWxkX2luZGV4X3R1cGxlPHNpemVvZi4uLihfQXJncyk+OjpfX3R5cGUgX0luZGljZXM7CisgICAgICAgIHJldHVybiBfTV9pbnZva2UoX0luZGljZXMoKSk7CisgICAgICB9CisKKyAgICBwcml2YXRlOgorCisgICAgICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdC4uLiBfSW5kaWNlcz4KKyAgICAgICAgdHlwZW5hbWUgcmVzdWx0X29mPF9DYWxsYWJsZShfQXJncy4uLik+Ojp0eXBlCisgICAgICAgIF9NX2ludm9rZShfSW5kZXhfdHVwbGU8X0luZGljZXMuLi4+KQorICAgICAgICB7CisJICAvLyBzdGQ6OmJpbmQgYWx3YXlzIGZvcndhcmRzIGJvdW5kIGFyZ3VtZW50cyBhcyBsdmFsdWVzLAorCSAgLy8gYnV0IHRoaXMgdHlwZSBjYW4gY2FsbCBmdW5jdGlvbnMgd2hpY2ggb25seSBhY2NlcHQgcnZhbHVlcy4KKyAgICAgICAgICByZXR1cm4gc3RkOjpmb3J3YXJkPF9DYWxsYWJsZT4oc3RkOjpnZXQ8MD4oX01fYm91bmQpKSgKKyAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihzdGQ6OmdldDxfSW5kaWNlcysxPihfTV9ib3VuZCkpLi4uKTsKKyAgICAgICAgfQorCisgICAgICBzdGQ6OnR1cGxlPF9DYWxsYWJsZSwgX0FyZ3MuLi4+IF9NX2JvdW5kOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmMsIHR5cGVuYW1lLi4uIF9Cb3VuZEFyZ3M+CisgICAgc3RydWN0IF9CaW5kX3NpbXBsZV9oZWxwZXIKKyAgICB7CisgICAgICB0eXBlZGVmIF9NYXliZV93cmFwX21lbWJlcl9wb2ludGVyPHR5cGVuYW1lIGRlY2F5PF9GdW5jPjo6dHlwZT4KKyAgICAgICAgX19tYXliZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX21heWJlX3R5cGU6OnR5cGUgX19mdW5jX3R5cGU7CisgICAgICB0eXBlZGVmIF9CaW5kX3NpbXBsZTxfX2Z1bmNfdHlwZSh0eXBlbmFtZSBkZWNheTxfQm91bmRBcmdzPjo6dHlwZS4uLik+CisgICAgICAgCV9fdHlwZTsKKyAgICB9OworCisgIC8vIFNpbXBsaWZpZWQgdmVyc2lvbiBvZiBzdGQ6OmJpbmQgZm9yIGludGVybmFsIHVzZSwgd2l0aG91dCBzdXBwb3J0IGZvcgorICAvLyB1bmJvdW5kIGFyZ3VtZW50cywgcGxhY2Vob2xkZXJzIG9yIG5lc3RlZCBiaW5kIGV4cHJlc3Npb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2FsbGFibGUsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHR5cGVuYW1lIF9CaW5kX3NpbXBsZV9oZWxwZXI8X0NhbGxhYmxlLCBfQXJncy4uLj46Ol9fdHlwZQorICAgIF9fYmluZF9zaW1wbGUoX0NhbGxhYmxlJiYgX19jYWxsYWJsZSwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgdHlwZWRlZiBfQmluZF9zaW1wbGVfaGVscGVyPF9DYWxsYWJsZSwgX0FyZ3MuLi4+IF9faGVscGVyX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faGVscGVyX3R5cGU6Ol9fbWF5YmVfdHlwZSBfX21heWJlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faGVscGVyX3R5cGU6Ol9fdHlwZSBfX3Jlc3VsdF90eXBlOworICAgICAgcmV0dXJuIF9fcmVzdWx0X3R5cGUoCisgICAgICAgICAgX19tYXliZV90eXBlOjpfX2RvX3dyYXAoIHN0ZDo6Zm9yd2FyZDxfQ2FsbGFibGU+KF9fY2FsbGFibGUpKSwKKyAgICAgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBFeGNlcHRpb24gY2xhc3MgdGhyb3duIHdoZW4gY2xhc3MgdGVtcGxhdGUgZnVuY3Rpb24ncworICAgKiAgb3BlcmF0b3IoKSBpcyBjYWxsZWQgd2l0aCBhbiBlbXB0eSB0YXJnZXQuCisgICAqICBAaW5ncm91cCBleGNlcHRpb25zCisgICAqLworICBjbGFzcyBiYWRfZnVuY3Rpb25fY2FsbCA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbgorICB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5iYWRfZnVuY3Rpb25fY2FsbCgpIG5vZXhjZXB0OworCisgICAgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0OworICB9OworCisgIC8qKgorICAgKiAgVHJhaXQgaWRlbnRpZnlpbmcgImxvY2F0aW9uLWludmFyaWFudCIgdHlwZXMsIG1lYW5pbmcgdGhhdCB0aGUKKyAgICogIGFkZHJlc3Mgb2YgdGhlIG9iamVjdCAob3IgYW55IG9mIGl0cyBtZW1iZXJzKSB3aWxsIG5vdCBlc2NhcGUuCisgICAqICBBbHNvIGltcGxpZXMgYSB0cml2aWFsIGNvcHkgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbG9jYXRpb25faW52YXJpYW50CisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoaXNfcG9pbnRlcjxfVHA+Ojp2YWx1ZQorCQkJICAgICAgIHx8IGlzX21lbWJlcl9wb2ludGVyPF9UcD46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgY2xhc3MgX1VuZGVmaW5lZF9jbGFzczsKKworICB1bmlvbiBfTm9jb3B5X3R5cGVzCisgIHsKKyAgICB2b2lkKiAgICAgICBfTV9vYmplY3Q7CisgICAgY29uc3Qgdm9pZCogX01fY29uc3Rfb2JqZWN0OworICAgIHZvaWQgKCpfTV9mdW5jdGlvbl9wb2ludGVyKSgpOworICAgIHZvaWQgKF9VbmRlZmluZWRfY2xhc3M6OipfTV9tZW1iZXJfcG9pbnRlcikoKTsKKyAgfTsKKworICB1bmlvbiBfQW55X2RhdGEKKyAgeworICAgIHZvaWQqICAgICAgIF9NX2FjY2VzcygpICAgICAgIHsgcmV0dXJuICZfTV9wb2RfZGF0YVswXTsgfQorICAgIGNvbnN0IHZvaWQqIF9NX2FjY2VzcygpIGNvbnN0IHsgcmV0dXJuICZfTV9wb2RfZGF0YVswXTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwJgorICAgICAgX01fYWNjZXNzKCkKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxfVHAqPihfTV9hY2Nlc3MoKSk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIGNvbnN0IF9UcCYKKyAgICAgIF9NX2FjY2VzcygpIGNvbnN0CisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgX1RwKj4oX01fYWNjZXNzKCkpOyB9CisKKyAgICBfTm9jb3B5X3R5cGVzIF9NX3VudXNlZDsKKyAgICBjaGFyIF9NX3BvZF9kYXRhW3NpemVvZihfTm9jb3B5X3R5cGVzKV07CisgIH07CisKKyAgZW51bSBfTWFuYWdlcl9vcGVyYXRpb24KKyAgeworICAgIF9fZ2V0X3R5cGVfaW5mbywKKyAgICBfX2dldF9mdW5jdG9yX3B0ciwKKyAgICBfX2Nsb25lX2Z1bmN0b3IsCisgICAgX19kZXN0cm95X2Z1bmN0b3IKKyAgfTsKKworICAvLyBTaW1wbGUgdHlwZSB3cmFwcGVyIHRoYXQgaGVscHMgYXZvaWQgYW5ub3lpbmcgY29uc3QgcHJvYmxlbXMKKyAgLy8gd2hlbiBjYXN0aW5nIGJldHdlZW4gdm9pZCBwb2ludGVycyBhbmQgcG9pbnRlcnMtdG8tcG9pbnRlcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX1NpbXBsZV90eXBlX3dyYXBwZXIKKyAgICB7CisgICAgICBfU2ltcGxlX3R5cGVfd3JhcHBlcihfVHAgX192YWx1ZSkgOiBfX3ZhbHVlKF9fdmFsdWUpIHsgfQorCisgICAgICBfVHAgX192YWx1ZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19sb2NhdGlvbl9pbnZhcmlhbnQ8X1NpbXBsZV90eXBlX3dyYXBwZXI8X1RwPiA+CisgICAgOiBfX2lzX2xvY2F0aW9uX2ludmFyaWFudDxfVHA+CisgICAgeyB9OworCisgIC8vIENvbnZlcnRzIGEgcmVmZXJlbmNlIHRvIGEgZnVuY3Rpb24gb2JqZWN0IGludG8gYSBjYWxsYWJsZQorICAvLyBmdW5jdGlvbiBvYmplY3QuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorICAgIGlubGluZSBfRnVuY3RvciYKKyAgICBfX2NhbGxhYmxlX2Z1bmN0b3IoX0Z1bmN0b3ImIF9fZikKKyAgICB7IHJldHVybiBfX2Y7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTWVtYmVyLCB0eXBlbmFtZSBfQ2xhc3M+CisgICAgaW5saW5lIF9NZW1fZm48X01lbWJlciBfQ2xhc3M6Oio+CisgICAgX19jYWxsYWJsZV9mdW5jdG9yKF9NZW1iZXIgX0NsYXNzOjoqICZfX3ApCisgICAgeyByZXR1cm4gc3RkOjptZW1fZm4oX19wKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9NZW1iZXIsIHR5cGVuYW1lIF9DbGFzcz4KKyAgICBpbmxpbmUgX01lbV9mbjxfTWVtYmVyIF9DbGFzczo6Kj4KKyAgICBfX2NhbGxhYmxlX2Z1bmN0b3IoX01lbWJlciBfQ2xhc3M6OiogY29uc3QgJl9fcCkKKyAgICB7IHJldHVybiBzdGQ6Om1lbV9mbihfX3ApOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01lbWJlciwgdHlwZW5hbWUgX0NsYXNzPgorICAgIGlubGluZSBfTWVtX2ZuPF9NZW1iZXIgX0NsYXNzOjoqPgorICAgIF9fY2FsbGFibGVfZnVuY3RvcihfTWVtYmVyIF9DbGFzczo6KiB2b2xhdGlsZSAmX19wKQorICAgIHsgcmV0dXJuIHN0ZDo6bWVtX2ZuKF9fcCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTWVtYmVyLCB0eXBlbmFtZSBfQ2xhc3M+CisgICAgaW5saW5lIF9NZW1fZm48X01lbWJlciBfQ2xhc3M6Oio+CisgICAgX19jYWxsYWJsZV9mdW5jdG9yKF9NZW1iZXIgX0NsYXNzOjoqIGNvbnN0IHZvbGF0aWxlICZfX3ApCisgICAgeyByZXR1cm4gc3RkOjptZW1fZm4oX19wKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgY2xhc3MgZnVuY3Rpb247CisKKyAgLy8vIEJhc2UgY2xhc3Mgb2YgYWxsIHBvbHltb3JwaGljIGZ1bmN0aW9uIG9iamVjdCB3cmFwcGVycy4KKyAgY2xhc3MgX0Z1bmN0aW9uX2Jhc2UKKyAgeworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2l6ZV90IF9NX21heF9zaXplID0gc2l6ZW9mKF9Ob2NvcHlfdHlwZXMpOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNpemVfdCBfTV9tYXhfYWxpZ24gPSBfX2FsaWdub2ZfXyhfTm9jb3B5X3R5cGVzKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorICAgICAgY2xhc3MgX0Jhc2VfbWFuYWdlcgorICAgICAgeworICAgICAgcHJvdGVjdGVkOgorCXN0YXRpYyBjb25zdCBib29sIF9fc3RvcmVkX2xvY2FsbHkgPQorCShfX2lzX2xvY2F0aW9uX2ludmFyaWFudDxfRnVuY3Rvcj46OnZhbHVlCisJICYmIHNpemVvZihfRnVuY3RvcikgPD0gX01fbWF4X3NpemUKKwkgJiYgX19hbGlnbm9mX18oX0Z1bmN0b3IpIDw9IF9NX21heF9hbGlnbgorCSAmJiAoX01fbWF4X2FsaWduICUgX19hbGlnbm9mX18oX0Z1bmN0b3IpID09IDApKTsKKworCXR5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19zdG9yZWRfbG9jYWxseT4gX0xvY2FsX3N0b3JhZ2U7CisKKwkvLyBSZXRyaWV2ZSBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIG9iamVjdAorCXN0YXRpYyBfRnVuY3RvcioKKwlfTV9nZXRfcG9pbnRlcihjb25zdCBfQW55X2RhdGEmIF9fc291cmNlKQorCXsKKwkgIGNvbnN0IF9GdW5jdG9yKiBfX3B0ciA9CisJICAgIF9fc3RvcmVkX2xvY2FsbHk/IHN0ZDo6X19hZGRyZXNzb2YoX19zb3VyY2UuX01fYWNjZXNzPF9GdW5jdG9yPigpKQorCSAgICAvKiBoYXZlIHN0b3JlZCBhIHBvaW50ZXIgKi8gOiBfX3NvdXJjZS5fTV9hY2Nlc3M8X0Z1bmN0b3IqPigpOworCSAgcmV0dXJuIGNvbnN0X2Nhc3Q8X0Z1bmN0b3IqPihfX3B0cik7CisJfQorCisJLy8gQ2xvbmUgYSBsb2NhdGlvbi1pbnZhcmlhbnQgZnVuY3Rpb24gb2JqZWN0IHRoYXQgZml0cyB3aXRoaW4KKwkvLyBhbiBfQW55X2RhdGEgc3RydWN0dXJlLgorCXN0YXRpYyB2b2lkCisJX01fY2xvbmUoX0FueV9kYXRhJiBfX2Rlc3QsIGNvbnN0IF9BbnlfZGF0YSYgX19zb3VyY2UsIHRydWVfdHlwZSkKKwl7CisJICBuZXcgKF9fZGVzdC5fTV9hY2Nlc3MoKSkgX0Z1bmN0b3IoX19zb3VyY2UuX01fYWNjZXNzPF9GdW5jdG9yPigpKTsKKwl9CisKKwkvLyBDbG9uZSBhIGZ1bmN0aW9uIG9iamVjdCB0aGF0IGlzIG5vdCBsb2NhdGlvbi1pbnZhcmlhbnQgb3IKKwkvLyB0aGF0IGNhbm5vdCBmaXQgaW50byBhbiBfQW55X2RhdGEgc3RydWN0dXJlLgorCXN0YXRpYyB2b2lkCisJX01fY2xvbmUoX0FueV9kYXRhJiBfX2Rlc3QsIGNvbnN0IF9BbnlfZGF0YSYgX19zb3VyY2UsIGZhbHNlX3R5cGUpCisJeworCSAgX19kZXN0Ll9NX2FjY2VzczxfRnVuY3Rvcio+KCkgPQorCSAgICBuZXcgX0Z1bmN0b3IoKl9fc291cmNlLl9NX2FjY2VzczxfRnVuY3Rvcio+KCkpOworCX0KKworCS8vIERlc3Ryb3lpbmcgYSBsb2NhdGlvbi1pbnZhcmlhbnQgb2JqZWN0IG1heSBzdGlsbCByZXF1aXJlCisJLy8gZGVzdHJ1Y3Rpb24uCisJc3RhdGljIHZvaWQKKwlfTV9kZXN0cm95KF9BbnlfZGF0YSYgX192aWN0aW0sIHRydWVfdHlwZSkKKwl7CisJICBfX3ZpY3RpbS5fTV9hY2Nlc3M8X0Z1bmN0b3I+KCkufl9GdW5jdG9yKCk7CisJfQorCisJLy8gRGVzdHJveWluZyBhbiBvYmplY3QgbG9jYXRlZCBvbiB0aGUgaGVhcC4KKwlzdGF0aWMgdm9pZAorCV9NX2Rlc3Ryb3koX0FueV9kYXRhJiBfX3ZpY3RpbSwgZmFsc2VfdHlwZSkKKwl7CisJICBkZWxldGUgX192aWN0aW0uX01fYWNjZXNzPF9GdW5jdG9yKj4oKTsKKwl9CisKKyAgICAgIHB1YmxpYzoKKwlzdGF0aWMgYm9vbAorCV9NX21hbmFnZXIoX0FueV9kYXRhJiBfX2Rlc3QsIGNvbnN0IF9BbnlfZGF0YSYgX19zb3VyY2UsCisJCSAgIF9NYW5hZ2VyX29wZXJhdGlvbiBfX29wKQorCXsKKwkgIHN3aXRjaCAoX19vcCkKKwkgICAgeworI2lmZGVmIF9fR1hYX1JUVEkKKwkgICAgY2FzZSBfX2dldF90eXBlX2luZm86CisJICAgICAgX19kZXN0Ll9NX2FjY2Vzczxjb25zdCB0eXBlX2luZm8qPigpID0gJnR5cGVpZChfRnVuY3Rvcik7CisJICAgICAgYnJlYWs7CisjZW5kaWYKKwkgICAgY2FzZSBfX2dldF9mdW5jdG9yX3B0cjoKKwkgICAgICBfX2Rlc3QuX01fYWNjZXNzPF9GdW5jdG9yKj4oKSA9IF9NX2dldF9wb2ludGVyKF9fc291cmNlKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIF9fY2xvbmVfZnVuY3RvcjoKKwkgICAgICBfTV9jbG9uZShfX2Rlc3QsIF9fc291cmNlLCBfTG9jYWxfc3RvcmFnZSgpKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIF9fZGVzdHJveV9mdW5jdG9yOgorCSAgICAgIF9NX2Rlc3Ryb3koX19kZXN0LCBfTG9jYWxfc3RvcmFnZSgpKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgcmV0dXJuIGZhbHNlOworCX0KKworCXN0YXRpYyB2b2lkCisJX01faW5pdF9mdW5jdG9yKF9BbnlfZGF0YSYgX19mdW5jdG9yLCBfRnVuY3RvciYmIF9fZikKKwl7IF9NX2luaXRfZnVuY3RvcihfX2Z1bmN0b3IsIHN0ZDo6bW92ZShfX2YpLCBfTG9jYWxfc3RvcmFnZSgpKTsgfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKwkgIHN0YXRpYyBib29sCisJICBfTV9ub3RfZW1wdHlfZnVuY3Rpb24oY29uc3QgZnVuY3Rpb248X1NpZ25hdHVyZT4mIF9fZikKKwkgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KF9fZik7IH0KKworCXRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKwkgIHN0YXRpYyBib29sCisJICBfTV9ub3RfZW1wdHlfZnVuY3Rpb24oX1RwKiBjb25zdCYgX19mcCkKKwkgIHsgcmV0dXJuIF9fZnA7IH0KKworCXRlbXBsYXRlPHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUgX1RwPgorCSAgc3RhdGljIGJvb2wKKwkgIF9NX25vdF9lbXB0eV9mdW5jdGlvbihfVHAgX0NsYXNzOjoqIGNvbnN0JiBfX21wKQorCSAgeyByZXR1cm4gX19tcDsgfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCSAgc3RhdGljIGJvb2wKKwkgIF9NX25vdF9lbXB0eV9mdW5jdGlvbihjb25zdCBfVHAmKQorCSAgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICBwcml2YXRlOgorCXN0YXRpYyB2b2lkCisJX01faW5pdF9mdW5jdG9yKF9BbnlfZGF0YSYgX19mdW5jdG9yLCBfRnVuY3RvciYmIF9fZiwgdHJ1ZV90eXBlKQorCXsgbmV3IChfX2Z1bmN0b3IuX01fYWNjZXNzKCkpIF9GdW5jdG9yKHN0ZDo6bW92ZShfX2YpKTsgfQorCisJc3RhdGljIHZvaWQKKwlfTV9pbml0X2Z1bmN0b3IoX0FueV9kYXRhJiBfX2Z1bmN0b3IsIF9GdW5jdG9yJiYgX19mLCBmYWxzZV90eXBlKQorCXsgX19mdW5jdG9yLl9NX2FjY2VzczxfRnVuY3Rvcio+KCkgPSBuZXcgX0Z1bmN0b3Ioc3RkOjptb3ZlKF9fZikpOyB9CisgICAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgICBjbGFzcyBfUmVmX21hbmFnZXIgOiBwdWJsaWMgX0Jhc2VfbWFuYWdlcjxfRnVuY3Rvcio+CisgICAgICB7CisJdHlwZWRlZiBfRnVuY3Rpb25fYmFzZTo6X0Jhc2VfbWFuYWdlcjxfRnVuY3Rvcio+IF9CYXNlOworCisgICAgICBwdWJsaWM6CisJc3RhdGljIGJvb2wKKwlfTV9tYW5hZ2VyKF9BbnlfZGF0YSYgX19kZXN0LCBjb25zdCBfQW55X2RhdGEmIF9fc291cmNlLAorCQkgICBfTWFuYWdlcl9vcGVyYXRpb24gX19vcCkKKwl7CisJICBzd2l0Y2ggKF9fb3ApCisJICAgIHsKKyNpZmRlZiBfX0dYWF9SVFRJCisJICAgIGNhc2UgX19nZXRfdHlwZV9pbmZvOgorCSAgICAgIF9fZGVzdC5fTV9hY2Nlc3M8Y29uc3QgdHlwZV9pbmZvKj4oKSA9ICZ0eXBlaWQoX0Z1bmN0b3IpOworCSAgICAgIGJyZWFrOworI2VuZGlmCisJICAgIGNhc2UgX19nZXRfZnVuY3Rvcl9wdHI6CisJICAgICAgX19kZXN0Ll9NX2FjY2VzczxfRnVuY3Rvcio+KCkgPSAqX0Jhc2U6Ol9NX2dldF9wb2ludGVyKF9fc291cmNlKTsKKwkgICAgICByZXR1cm4gaXNfY29uc3Q8X0Z1bmN0b3I+Ojp2YWx1ZTsKKwkgICAgICBicmVhazsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIF9CYXNlOjpfTV9tYW5hZ2VyKF9fZGVzdCwgX19zb3VyY2UsIF9fb3ApOworCSAgICB9CisJICByZXR1cm4gZmFsc2U7CisJfQorCisJc3RhdGljIHZvaWQKKwlfTV9pbml0X2Z1bmN0b3IoX0FueV9kYXRhJiBfX2Z1bmN0b3IsIHJlZmVyZW5jZV93cmFwcGVyPF9GdW5jdG9yPiBfX2YpCisJeworCSAgX0Jhc2U6Ol9NX2luaXRfZnVuY3RvcihfX2Z1bmN0b3IsIHN0ZDo6X19hZGRyZXNzb2YoX19mLmdldCgpKSk7CisJfQorICAgICAgfTsKKworICAgIF9GdW5jdGlvbl9iYXNlKCkgOiBfTV9tYW5hZ2VyKDApIHsgfQorCisgICAgfl9GdW5jdGlvbl9iYXNlKCkKKyAgICB7CisgICAgICBpZiAoX01fbWFuYWdlcikKKwlfTV9tYW5hZ2VyKF9NX2Z1bmN0b3IsIF9NX2Z1bmN0b3IsIF9fZGVzdHJveV9mdW5jdG9yKTsKKyAgICB9CisKKworICAgIGJvb2wgX01fZW1wdHkoKSBjb25zdCB7IHJldHVybiAhX01fbWFuYWdlcjsgfQorCisgICAgdHlwZWRlZiBib29sICgqX01hbmFnZXJfdHlwZSkoX0FueV9kYXRhJiwgY29uc3QgX0FueV9kYXRhJiwKKwkJCQkgIF9NYW5hZ2VyX29wZXJhdGlvbik7CisKKyAgICBfQW55X2RhdGEgICAgIF9NX2Z1bmN0b3I7CisgICAgX01hbmFnZXJfdHlwZSBfTV9tYW5hZ2VyOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmUsIHR5cGVuYW1lIF9GdW5jdG9yPgorICAgIGNsYXNzIF9GdW5jdGlvbl9oYW5kbGVyOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY2xhc3MgX0Z1bmN0aW9uX2hhbmRsZXI8X1JlcyhfQXJnVHlwZXMuLi4pLCBfRnVuY3Rvcj4KKyAgICA6IHB1YmxpYyBfRnVuY3Rpb25fYmFzZTo6X0Jhc2VfbWFuYWdlcjxfRnVuY3Rvcj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9GdW5jdGlvbl9iYXNlOjpfQmFzZV9tYW5hZ2VyPF9GdW5jdG9yPiBfQmFzZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBfUmVzCisgICAgICBfTV9pbnZva2UoY29uc3QgX0FueV9kYXRhJiBfX2Z1bmN0b3IsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpCisgICAgICB7CisJcmV0dXJuICgqX0Jhc2U6Ol9NX2dldF9wb2ludGVyKF9fZnVuY3RvcikpKAorCSAgICBzdGQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY2xhc3MgX0Z1bmN0aW9uX2hhbmRsZXI8dm9pZChfQXJnVHlwZXMuLi4pLCBfRnVuY3Rvcj4KKyAgICA6IHB1YmxpYyBfRnVuY3Rpb25fYmFzZTo6X0Jhc2VfbWFuYWdlcjxfRnVuY3Rvcj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9GdW5jdGlvbl9iYXNlOjpfQmFzZV9tYW5hZ2VyPF9GdW5jdG9yPiBfQmFzZTsKKworICAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX01faW52b2tlKGNvbnN0IF9BbnlfZGF0YSYgX19mdW5jdG9yLCBfQXJnVHlwZXMuLi4gX19hcmdzKQorICAgICAgeworCSgqX0Jhc2U6Ol9NX2dldF9wb2ludGVyKF9fZnVuY3RvcikpKAorCSAgICBzdGQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY2xhc3MgX0Z1bmN0aW9uX2hhbmRsZXI8X1JlcyhfQXJnVHlwZXMuLi4pLCByZWZlcmVuY2Vfd3JhcHBlcjxfRnVuY3Rvcj4gPgorICAgIDogcHVibGljIF9GdW5jdGlvbl9iYXNlOjpfUmVmX21hbmFnZXI8X0Z1bmN0b3I+CisgICAgeworICAgICAgdHlwZWRlZiBfRnVuY3Rpb25fYmFzZTo6X1JlZl9tYW5hZ2VyPF9GdW5jdG9yPiBfQmFzZTsKKworICAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgX1JlcworICAgICAgX01faW52b2tlKGNvbnN0IF9BbnlfZGF0YSYgX19mdW5jdG9yLCBfQXJnVHlwZXMuLi4gX19hcmdzKQorICAgICAgeworCXJldHVybiBfX2NhbGxhYmxlX2Z1bmN0b3IoKipfQmFzZTo6X01fZ2V0X3BvaW50ZXIoX19mdW5jdG9yKSkoCisJICAgICAgc3RkOjpmb3J3YXJkPF9BcmdUeXBlcz4oX19hcmdzKS4uLik7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIF9GdW5jdGlvbl9oYW5kbGVyPHZvaWQoX0FyZ1R5cGVzLi4uKSwgcmVmZXJlbmNlX3dyYXBwZXI8X0Z1bmN0b3I+ID4KKyAgICA6IHB1YmxpYyBfRnVuY3Rpb25fYmFzZTo6X1JlZl9tYW5hZ2VyPF9GdW5jdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0Z1bmN0aW9uX2Jhc2U6Ol9SZWZfbWFuYWdlcjxfRnVuY3Rvcj4gX0Jhc2U7CisKKyAgICAgcHVibGljOgorICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9NX2ludm9rZShjb25zdCBfQW55X2RhdGEmIF9fZnVuY3RvciwgX0FyZ1R5cGVzLi4uIF9fYXJncykKKyAgICAgIHsKKwlfX2NhbGxhYmxlX2Z1bmN0b3IoKipfQmFzZTo6X01fZ2V0X3BvaW50ZXIoX19mdW5jdG9yKSkoCisJICAgIHN0ZDo6Zm9yd2FyZDxfQXJnVHlwZXM+KF9fYXJncykuLi4pOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZSBfTWVtYmVyLCB0eXBlbmFtZSBfUmVzLAorCSAgIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfRnVuY3Rpb25faGFuZGxlcjxfUmVzKF9BcmdUeXBlcy4uLiksIF9NZW1iZXIgX0NsYXNzOjoqPgorICAgIDogcHVibGljIF9GdW5jdGlvbl9oYW5kbGVyPHZvaWQoX0FyZ1R5cGVzLi4uKSwgX01lbWJlciBfQ2xhc3M6Oio+CisgICAgeworICAgICAgdHlwZWRlZiBfRnVuY3Rpb25faGFuZGxlcjx2b2lkKF9BcmdUeXBlcy4uLiksIF9NZW1iZXIgX0NsYXNzOjoqPgorCV9CYXNlOworCisgICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBfUmVzCisgICAgICBfTV9pbnZva2UoY29uc3QgX0FueV9kYXRhJiBfX2Z1bmN0b3IsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpCisgICAgICB7CisJcmV0dXJuIHN0ZDo6bWVtX2ZuKF9CYXNlOjpfTV9nZXRfcG9pbnRlcihfX2Z1bmN0b3IpLT5fX3ZhbHVlKSgKKwkgICAgc3RkOjpmb3J3YXJkPF9BcmdUeXBlcz4oX19hcmdzKS4uLik7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lIF9NZW1iZXIsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfRnVuY3Rpb25faGFuZGxlcjx2b2lkKF9BcmdUeXBlcy4uLiksIF9NZW1iZXIgX0NsYXNzOjoqPgorICAgIDogcHVibGljIF9GdW5jdGlvbl9iYXNlOjpfQmFzZV9tYW5hZ2VyPAorCQkgX1NpbXBsZV90eXBlX3dyYXBwZXI8IF9NZW1iZXIgX0NsYXNzOjoqID4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX01lbWJlciBfQ2xhc3M6OiogX0Z1bmN0b3I7CisgICAgICB0eXBlZGVmIF9TaW1wbGVfdHlwZV93cmFwcGVyPF9GdW5jdG9yPiBfV3JhcHBlcjsKKyAgICAgIHR5cGVkZWYgX0Z1bmN0aW9uX2Jhc2U6Ol9CYXNlX21hbmFnZXI8X1dyYXBwZXI+IF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgc3RhdGljIGJvb2wKKyAgICAgIF9NX21hbmFnZXIoX0FueV9kYXRhJiBfX2Rlc3QsIGNvbnN0IF9BbnlfZGF0YSYgX19zb3VyY2UsCisJCSBfTWFuYWdlcl9vcGVyYXRpb24gX19vcCkKKyAgICAgIHsKKwlzd2l0Y2ggKF9fb3ApCisJICB7CisjaWZkZWYgX19HWFhfUlRUSQorCSAgY2FzZSBfX2dldF90eXBlX2luZm86CisJICAgIF9fZGVzdC5fTV9hY2Nlc3M8Y29uc3QgdHlwZV9pbmZvKj4oKSA9ICZ0eXBlaWQoX0Z1bmN0b3IpOworCSAgICBicmVhazsKKyNlbmRpZgorCSAgY2FzZSBfX2dldF9mdW5jdG9yX3B0cjoKKwkgICAgX19kZXN0Ll9NX2FjY2VzczxfRnVuY3Rvcio+KCkgPQorCSAgICAgICZfQmFzZTo6X01fZ2V0X3BvaW50ZXIoX19zb3VyY2UpLT5fX3ZhbHVlOworCSAgICBicmVhazsKKworCSAgZGVmYXVsdDoKKwkgICAgX0Jhc2U6Ol9NX21hbmFnZXIoX19kZXN0LCBfX3NvdXJjZSwgX19vcCk7CisJICB9CisJcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX01faW52b2tlKGNvbnN0IF9BbnlfZGF0YSYgX19mdW5jdG9yLCBfQXJnVHlwZXMuLi4gX19hcmdzKQorICAgICAgeworCXN0ZDo6bWVtX2ZuKF9CYXNlOjpfTV9nZXRfcG9pbnRlcihfX2Z1bmN0b3IpLT5fX3ZhbHVlKSgKKwkgICAgc3RkOjpmb3J3YXJkPF9BcmdUeXBlcz4oX19hcmdzKS4uLik7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnJvbSwgdHlwZW5hbWUgX1RvPgorICAgIHVzaW5nIF9fY2hlY2tfZnVuY19yZXR1cm5fdHlwZQorICAgICAgPSBfX29yXzxpc192b2lkPF9Ubz4sIGlzX2NvbnZlcnRpYmxlPF9Gcm9tLCBfVG8+PjsKKworICAvKioKKyAgICogIEBicmllZiBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIGZvciBzdGQ6OmZ1bmN0aW9uLgorICAgKiAgQGluZ3JvdXAgZnVuY3RvcnMKKyAgICoKKyAgICogIFBvbHltb3JwaGljIGZ1bmN0aW9uIHdyYXBwZXIuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY2xhc3MgZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pPgorICAgIDogcHVibGljIF9NYXliZV91bmFyeV9vcl9iaW5hcnlfZnVuY3Rpb248X1JlcywgX0FyZ1R5cGVzLi4uPiwKKyAgICAgIHByaXZhdGUgX0Z1bmN0aW9uX2Jhc2UKKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgX1NpZ25hdHVyZV90eXBlKF9BcmdUeXBlcy4uLik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorCXVzaW5nIF9JbnZva2UgPSBkZWNsdHlwZShfX2NhbGxhYmxlX2Z1bmN0b3Ioc3RkOjpkZWNsdmFsPF9GdW5jdG9yJj4oKSkKKwkJCQkgKHN0ZDo6ZGVjbHZhbDxfQXJnVHlwZXM+KCkuLi4pICk7CisKKyAgICAgIC8vIFVzZWQgc28gdGhlIHJldHVybiB0eXBlIGNvbnZlcnRpYmlsaXR5IGNoZWNrcyBhcmVuJ3QgZG9uZSB3aGVuCisgICAgICAvLyBwZXJmb3JtaW5nIG92ZXJsb2FkIHJlc29sdXRpb24gZm9yIGNvcHkgY29uc3RydWN0aW9uL2Fzc2lnbm1lbnQuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisJdXNpbmcgX05vdFNlbGYgPSBfX25vdF88aXNfc2FtZTxfVHAsIGZ1bmN0aW9uPj47CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorCXVzaW5nIF9DYWxsYWJsZQorCSAgPSBfX2FuZF88X05vdFNlbGY8X0Z1bmN0b3I+LAorCQkgICBfX2NoZWNrX2Z1bmNfcmV0dXJuX3R5cGU8X0ludm9rZTxfRnVuY3Rvcj4sIF9SZXM+PjsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbmQsIHR5cGVuYW1lIF9UcD4KKwl1c2luZyBfUmVxdWlyZXMgPSB0eXBlbmFtZSBlbmFibGVfaWY8X0NvbmQ6OnZhbHVlLCBfVHA+Ojp0eXBlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOworCisgICAgICAvLyBbMy43LjIuMV0gY29uc3RydWN0L2NvcHkvZGVzdHJveQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3QgY3JlYXRlcyBhbiBlbXB0eSBmdW5jdGlvbiBjYWxsIHdyYXBwZXIuCisgICAgICAgKiAgQHBvc3QgQGMgIShib29sKSp0aGlzCisgICAgICAgKi8KKyAgICAgIGZ1bmN0aW9uKCkgbm9leGNlcHQKKyAgICAgIDogX0Z1bmN0aW9uX2Jhc2UoKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIENyZWF0ZXMgYW4gZW1wdHkgZnVuY3Rpb24gY2FsbCB3cmFwcGVyLgorICAgICAgICogIEBwb3N0IEBjICEoYm9vbCkqdGhpcworICAgICAgICovCisgICAgICBmdW5jdGlvbihudWxscHRyX3QpIG5vZXhjZXB0CisgICAgICA6IF9GdW5jdGlvbl9iYXNlKCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAlRnVuY3Rpb24gY29weSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gX194IEEgJWZ1bmN0aW9uIG9iamVjdCB3aXRoIGlkZW50aWNhbCBjYWxsIHNpZ25hdHVyZS4KKyAgICAgICAqICBAcG9zdCBAYyBib29sKCp0aGlzKSA9PSBib29sKF9feCkKKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJWZ1bmN0aW9uIGNvbnRhaW5zIGEgY29weSBvZiB0aGUgdGFyZ2V0IG9mIEBhCisgICAgICAgKiAgX194IChpZiBpdCBoYXMgb25lKS4KKyAgICAgICAqLworICAgICAgZnVuY3Rpb24oY29uc3QgZnVuY3Rpb24mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAlRnVuY3Rpb24gbW92ZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gX194IEEgJWZ1bmN0aW9uIG9iamVjdCBydmFsdWUgd2l0aCBpZGVudGljYWwgY2FsbCBzaWduYXR1cmUuCisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICVmdW5jdGlvbiBjb250YWlucyB0aGUgdGFyZ2V0IG9mIEBhIF9feAorICAgICAgICogIChpZiBpdCBoYXMgb25lKS4KKyAgICAgICAqLworICAgICAgZnVuY3Rpb24oZnVuY3Rpb24mJiBfX3gpIDogX0Z1bmN0aW9uX2Jhc2UoKQorICAgICAgeworCV9feC5zd2FwKCp0aGlzKTsKKyAgICAgIH0KKworICAgICAgLy8gVE9ETzogbmVlZHMgYWxsb2NhdG9yX2FyZ190CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBCdWlsZHMgYSAlZnVuY3Rpb24gdGhhdCB0YXJnZXRzIGEgY29weSBvZiB0aGUgaW5jb21pbmcKKyAgICAgICAqICBmdW5jdGlvbiBvYmplY3QuCisgICAgICAgKiAgQHBhcmFtIF9fZiBBICVmdW5jdGlvbiBvYmplY3QgdGhhdCBpcyBjYWxsYWJsZSB3aXRoIHBhcmFtZXRlcnMgb2YKKyAgICAgICAqICB0eXBlIEBjIFQxLCBAYyBUMiwgLi4uLCBAYyBUTiBhbmQgcmV0dXJucyBhIHZhbHVlIGNvbnZlcnRpYmxlCisgICAgICAgKiAgdG8gQGMgUmVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY3JlYXRlZCAlZnVuY3Rpb24gb2JqZWN0IHdpbGwgdGFyZ2V0IGEgY29weSBvZiAKKyAgICAgICAqICBAYSBfX2YuIElmIEBhIF9fZiBpcyBAYyByZWZlcmVuY2Vfd3JhcHBlcjxGPiwgdGhlbiB0aGlzIGZ1bmN0aW9uCisgICAgICAgKiAgb2JqZWN0IHdpbGwgY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb24gb2JqZWN0IEBjCisgICAgICAgKiAgX19mLmdldCgpLiBJZiBAYSBfX2YgaXMgYSBOVUxMIGZ1bmN0aW9uIHBvaW50ZXIgb3IgTlVMTAorICAgICAgICogIHBvaW50ZXItdG8tbWVtYmVyLCB0aGUgbmV3bHktY3JlYXRlZCBvYmplY3Qgd2lsbCBiZSBlbXB0eS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgQGEgX19mIGlzIGEgbm9uLU5VTEwgZnVuY3Rpb24gcG9pbnRlciBvciBhbiBvYmplY3Qgb2YgdHlwZSBAYworICAgICAgICogIHJlZmVyZW5jZV93cmFwcGVyPEY+LCB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IHRocm93LgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwKKwkgICAgICAgdHlwZW5hbWUgPSBfUmVxdWlyZXM8X0NhbGxhYmxlPF9GdW5jdG9yPiwgdm9pZD4+CisJZnVuY3Rpb24oX0Z1bmN0b3IpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgJUZ1bmN0aW9uIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtIF9feCBBICVmdW5jdGlvbiB3aXRoIGlkZW50aWNhbCBjYWxsIHNpZ25hdHVyZS4KKyAgICAgICAqICBAcG9zdCBAYyAoYm9vbCkqdGhpcyA9PSAoYm9vbCl4CisgICAgICAgKiAgQHJldHVybnMgQGMgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgVGhlIHRhcmdldCBvZiBAYSBfX3ggaXMgY29waWVkIHRvIEBjICp0aGlzLiBJZiBAYSBfX3ggaGFzIG5vCisgICAgICAgKiAgdGFyZ2V0LCB0aGVuIEBjICp0aGlzIHdpbGwgYmUgZW1wdHkuCisgICAgICAgKgorICAgICAgICogIElmIEBhIF9feCB0YXJnZXRzIGEgZnVuY3Rpb24gcG9pbnRlciBvciBhIHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uCisgICAgICAgKiAgb2JqZWN0LCB0aGVuIHRoaXMgb3BlcmF0aW9uIHdpbGwgbm90IHRocm93IGFuICVleGNlcHRpb24uCisgICAgICAgKi8KKyAgICAgIGZ1bmN0aW9uJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IGZ1bmN0aW9uJiBfX3gpCisgICAgICB7CisJZnVuY3Rpb24oX194KS5zd2FwKCp0aGlzKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAlRnVuY3Rpb24gbW92ZS1hc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSBfX3ggQSAlZnVuY3Rpb24gcnZhbHVlIHdpdGggaWRlbnRpY2FsIGNhbGwgc2lnbmF0dXJlLgorICAgICAgICogIEByZXR1cm5zIEBjICp0aGlzCisgICAgICAgKgorICAgICAgICogIFRoZSB0YXJnZXQgb2YgQGEgX194IGlzIG1vdmVkIHRvIEBjICp0aGlzLiBJZiBAYSBfX3ggaGFzIG5vCisgICAgICAgKiAgdGFyZ2V0LCB0aGVuIEBjICp0aGlzIHdpbGwgYmUgZW1wdHkuCisgICAgICAgKgorICAgICAgICogIElmIEBhIF9feCB0YXJnZXRzIGEgZnVuY3Rpb24gcG9pbnRlciBvciBhIHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uCisgICAgICAgKiAgb2JqZWN0LCB0aGVuIHRoaXMgb3BlcmF0aW9uIHdpbGwgbm90IHRocm93IGFuICVleGNlcHRpb24uCisgICAgICAgKi8KKyAgICAgIGZ1bmN0aW9uJgorICAgICAgb3BlcmF0b3I9KGZ1bmN0aW9uJiYgX194KQorICAgICAgeworCWZ1bmN0aW9uKHN0ZDo6bW92ZShfX3gpKS5zd2FwKCp0aGlzKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAlRnVuY3Rpb24gYXNzaWdubWVudCB0byB6ZXJvLgorICAgICAgICogIEBwb3N0IEBjICEoYm9vbCkqdGhpcworICAgICAgICogIEByZXR1cm5zIEBjICp0aGlzCisgICAgICAgKgorICAgICAgICogIFRoZSB0YXJnZXQgb2YgQGMgKnRoaXMgaXMgZGVhbGxvY2F0ZWQsIGxlYXZpbmcgaXQgZW1wdHkuCisgICAgICAgKi8KKyAgICAgIGZ1bmN0aW9uJgorICAgICAgb3BlcmF0b3I9KG51bGxwdHJfdCkKKyAgICAgIHsKKwlpZiAoX01fbWFuYWdlcikKKwkgIHsKKwkgICAgX01fbWFuYWdlcihfTV9mdW5jdG9yLCBfTV9mdW5jdG9yLCBfX2Rlc3Ryb3lfZnVuY3Rvcik7CisJICAgIF9NX21hbmFnZXIgPSAwOworCSAgICBfTV9pbnZva2VyID0gMDsKKwkgIH0KKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAlRnVuY3Rpb24gYXNzaWdubWVudCB0byBhIG5ldyB0YXJnZXQuCisgICAgICAgKiAgQHBhcmFtIF9fZiBBICVmdW5jdGlvbiBvYmplY3QgdGhhdCBpcyBjYWxsYWJsZSB3aXRoIHBhcmFtZXRlcnMgb2YKKyAgICAgICAqICB0eXBlIEBjIFQxLCBAYyBUMiwgLi4uLCBAYyBUTiBhbmQgcmV0dXJucyBhIHZhbHVlIGNvbnZlcnRpYmxlCisgICAgICAgKiAgdG8gQGMgUmVzLgorICAgICAgICogIEByZXR1cm4gQGMgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyAgJWZ1bmN0aW9uIG9iamVjdCB3cmFwcGVyIHdpbGwgdGFyZ2V0IGEgY29weSBvZiBAYQorICAgICAgICogIF9fZi4gSWYgQGEgX19mIGlzIEBjIHJlZmVyZW5jZV93cmFwcGVyPEY+LCB0aGVuIHRoaXMgZnVuY3Rpb24KKyAgICAgICAqICBvYmplY3Qgd2lsbCBjb250YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvbiBvYmplY3QgQGMKKyAgICAgICAqICBfX2YuZ2V0KCkuIElmIEBhIF9fZiBpcyBhIE5VTEwgZnVuY3Rpb24gcG9pbnRlciBvciBOVUxMCisgICAgICAgKiAgcG9pbnRlci10by1tZW1iZXIsIEBjIHRoaXMgb2JqZWN0IHdpbGwgYmUgZW1wdHkuCisgICAgICAgKgorICAgICAgICogIElmIEBhIF9fZiBpcyBhIG5vbi1OVUxMIGZ1bmN0aW9uIHBvaW50ZXIgb3IgYW4gb2JqZWN0IG9mIHR5cGUgQGMKKyAgICAgICAqICByZWZlcmVuY2Vfd3JhcHBlcjxGPiwgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCB0aHJvdy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisJX1JlcXVpcmVzPF9DYWxsYWJsZTx0eXBlbmFtZSBkZWNheTxfRnVuY3Rvcj46OnR5cGU+LCBmdW5jdGlvbiY+CisJb3BlcmF0b3I9KF9GdW5jdG9yJiYgX19mKQorCXsKKwkgIGZ1bmN0aW9uKHN0ZDo6Zm9yd2FyZDxfRnVuY3Rvcj4oX19mKSkuc3dhcCgqdGhpcyk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICAvLy8gQG92ZXJsb2FkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4KKwlmdW5jdGlvbiYKKwlvcGVyYXRvcj0ocmVmZXJlbmNlX3dyYXBwZXI8X0Z1bmN0b3I+IF9fZikgbm9leGNlcHQKKwl7CisJICBmdW5jdGlvbihfX2YpLnN3YXAoKnRoaXMpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgLy8gWzMuNy4yLjJdIGZ1bmN0aW9uIG1vZGlmaWVycworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgU3dhcCB0aGUgdGFyZ2V0cyBvZiB0d28gJWZ1bmN0aW9uIG9iamVjdHMuCisgICAgICAgKiAgQHBhcmFtIF9feCBBICVmdW5jdGlvbiB3aXRoIGlkZW50aWNhbCBjYWxsIHNpZ25hdHVyZS4KKyAgICAgICAqCisgICAgICAgKiAgU3dhcCB0aGUgdGFyZ2V0cyBvZiBAYyB0aGlzIGZ1bmN0aW9uIG9iamVjdCBhbmQgQGEgX19mLiBUaGlzCisgICAgICAgKiAgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cgYW4gJWV4Y2VwdGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZCBzd2FwKGZ1bmN0aW9uJiBfX3gpCisgICAgICB7CisJc3RkOjpzd2FwKF9NX2Z1bmN0b3IsIF9feC5fTV9mdW5jdG9yKTsKKwlzdGQ6OnN3YXAoX01fbWFuYWdlciwgX194Ll9NX21hbmFnZXIpOworCXN0ZDo6c3dhcChfTV9pbnZva2VyLCBfX3guX01faW52b2tlcik7CisgICAgICB9CisKKyAgICAgIC8vIFRPRE86IG5lZWRzIGFsbG9jYXRvcl9hcmdfdAorICAgICAgLyoKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZSBfQWxsb2M+CisJdm9pZAorCWFzc2lnbihfRnVuY3RvciYmIF9fZiwgY29uc3QgX0FsbG9jJiBfX2EpCisJeworCSAgZnVuY3Rpb24oYWxsb2NhdG9yX2FyZywgX19hLAorCQkgICBzdGQ6OmZvcndhcmQ8X0Z1bmN0b3I+KF9fZikpLnN3YXAoKnRoaXMpOworCX0KKyAgICAgICovCisKKyAgICAgIC8vIFszLjcuMi4zXSBmdW5jdGlvbiBjYXBhY2l0eQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSAlZnVuY3Rpb24gd3JhcHBlciBoYXMgYSB0YXJnZXQuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gQGMgdHJ1ZSB3aGVuIHRoaXMgJWZ1bmN0aW9uIG9iamVjdCBjb250YWlucyBhIHRhcmdldCwKKyAgICAgICAqICBvciBAYyBmYWxzZSB3aGVuIGl0IGlzIGVtcHR5LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IHRocm93IGFuICVleGNlcHRpb24uCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gIV9NX2VtcHR5KCk7IH0KKworICAgICAgLy8gWzMuNy4yLjRdIGZ1bmN0aW9uIGludm9jYXRpb24KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEludm9rZXMgdGhlIGZ1bmN0aW9uIHRhcmdldGVkIGJ5IEBjICp0aGlzLgorICAgICAgICogIEByZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIHRhcmdldC4KKyAgICAgICAqICBAdGhyb3dzIGJhZF9mdW5jdGlvbl9jYWxsIHdoZW4gQGMgIShib29sKSp0aGlzCisgICAgICAgKgorICAgICAgICogIFRoZSBmdW5jdGlvbiBjYWxsIG9wZXJhdG9yIGludm9rZXMgdGhlIHRhcmdldCBmdW5jdGlvbiBvYmplY3QKKyAgICAgICAqICBzdG9yZWQgYnkgQGMgdGhpcy4KKyAgICAgICAqLworICAgICAgX1JlcyBvcGVyYXRvcigpKF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0OworCisjaWZkZWYgX19HWFhfUlRUSQorICAgICAgLy8gWzMuNy4yLjVdIGZ1bmN0aW9uIHRhcmdldCBhY2Nlc3MKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBEZXRlcm1pbmUgdGhlIHR5cGUgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGZ1bmN0aW9uIG9iamVjdAorICAgICAgICogIHdyYXBwZXIuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm5zIHRoZSB0eXBlIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBmdW5jdGlvbiBvYmplY3QsIG9yCisgICAgICAgKiAgQGMgdHlwZWlkKHZvaWQpIGlmIEBjICEoYm9vbCkqdGhpcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCB0aHJvdyBhbiAlZXhjZXB0aW9uLgorICAgICAgICovCisgICAgICBjb25zdCB0eXBlX2luZm8mIHRhcmdldF90eXBlKCkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBY2Nlc3MgdGhlIHN0b3JlZCB0YXJnZXQgZnVuY3Rpb24gb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdG9yZWQgdGFyZ2V0IGZ1bmN0aW9uIG9iamVjdCwKKyAgICAgICAqICBpZiBAYyB0eXBlaWQoRnVuY3RvcikuZXF1YWxzKHRhcmdldF90eXBlKCkpOyBvdGhlcndpc2UsIGEgTlVMTAorICAgICAgICogIHBvaW50ZXIuCisgICAgICAgKgorICAgICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCB0aHJvdyBhbiAlZXhjZXB0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4gICAgICAgX0Z1bmN0b3IqIHRhcmdldCgpIG5vZXhjZXB0OworCisgICAgICAvLy8gQG92ZXJsb2FkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4gY29uc3QgX0Z1bmN0b3IqIHRhcmdldCgpIGNvbnN0IG5vZXhjZXB0OworI2VuZGlmCisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfUmVzICgqX0ludm9rZXJfdHlwZSkoY29uc3QgX0FueV9kYXRhJiwgX0FyZ1R5cGVzLi4uKTsKKyAgICAgIF9JbnZva2VyX3R5cGUgX01faW52b2tlcjsKKyAgfTsKKworICAvLyBPdXQtb2YtbGluZSBtZW1iZXIgZGVmaW5pdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBmdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLik+OjoKKyAgICBmdW5jdGlvbihjb25zdCBmdW5jdGlvbiYgX194KQorICAgIDogX0Z1bmN0aW9uX2Jhc2UoKQorICAgIHsKKyAgICAgIGlmIChzdGF0aWNfY2FzdDxib29sPihfX3gpKQorCXsKKwkgIF9NX2ludm9rZXIgPSBfX3guX01faW52b2tlcjsKKwkgIF9NX21hbmFnZXIgPSBfX3guX01fbWFuYWdlcjsKKwkgIF9feC5fTV9tYW5hZ2VyKF9NX2Z1bmN0b3IsIF9feC5fTV9mdW5jdG9yLCBfX2Nsb25lX2Z1bmN0b3IpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZT4KKyAgICAgIGZ1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uKT46OgorICAgICAgZnVuY3Rpb24oX0Z1bmN0b3IgX19mKQorICAgICAgOiBfRnVuY3Rpb25fYmFzZSgpCisgICAgICB7CisJdHlwZWRlZiBfRnVuY3Rpb25faGFuZGxlcjxfU2lnbmF0dXJlX3R5cGUsIF9GdW5jdG9yPiBfTXlfaGFuZGxlcjsKKworCWlmIChfTXlfaGFuZGxlcjo6X01fbm90X2VtcHR5X2Z1bmN0aW9uKF9fZikpCisJICB7CisJICAgIF9NeV9oYW5kbGVyOjpfTV9pbml0X2Z1bmN0b3IoX01fZnVuY3Rvciwgc3RkOjptb3ZlKF9fZikpOworCSAgICBfTV9pbnZva2VyID0gJl9NeV9oYW5kbGVyOjpfTV9pbnZva2U7CisJICAgIF9NX21hbmFnZXIgPSAmX015X2hhbmRsZXI6Ol9NX21hbmFnZXI7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIF9SZXMKKyAgICBmdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLik+OjoKKyAgICBvcGVyYXRvcigpKF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgeworICAgICAgaWYgKF9NX2VtcHR5KCkpCisJX190aHJvd19iYWRfZnVuY3Rpb25fY2FsbCgpOworICAgICAgcmV0dXJuIF9NX2ludm9rZXIoX01fZnVuY3Rvciwgc3RkOjpmb3J3YXJkPF9BcmdUeXBlcz4oX19hcmdzKS4uLik7CisgICAgfQorCisjaWZkZWYgX19HWFhfUlRUSQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY29uc3QgdHlwZV9pbmZvJgorICAgIGZ1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uKT46OgorICAgIHRhcmdldF90eXBlKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7CisgICAgICBpZiAoX01fbWFuYWdlcikKKwl7CisJICBfQW55X2RhdGEgX190eXBlaW5mb19yZXN1bHQ7CisJICBfTV9tYW5hZ2VyKF9fdHlwZWluZm9fcmVzdWx0LCBfTV9mdW5jdG9yLCBfX2dldF90eXBlX2luZm8pOworCSAgcmV0dXJuICpfX3R5cGVpbmZvX3Jlc3VsdC5fTV9hY2Nlc3M8Y29uc3QgdHlwZV9pbmZvKj4oKTsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIHR5cGVpZCh2b2lkKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorICAgICAgX0Z1bmN0b3IqCisgICAgICBmdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLik+OjoKKyAgICAgIHRhcmdldCgpIG5vZXhjZXB0CisgICAgICB7CisJaWYgKHR5cGVpZChfRnVuY3RvcikgPT0gdGFyZ2V0X3R5cGUoKSAmJiBfTV9tYW5hZ2VyKQorCSAgeworCSAgICBfQW55X2RhdGEgX19wdHI7CisJICAgIGlmIChfTV9tYW5hZ2VyKF9fcHRyLCBfTV9mdW5jdG9yLCBfX2dldF9mdW5jdG9yX3B0cikKKwkJJiYgIWlzX2NvbnN0PF9GdW5jdG9yPjo6dmFsdWUpCisJICAgICAgcmV0dXJuIDA7CisJICAgIGVsc2UKKwkgICAgICByZXR1cm4gX19wdHIuX01fYWNjZXNzPF9GdW5jdG9yKj4oKTsKKwkgIH0KKwllbHNlCisJICByZXR1cm4gMDsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgICBjb25zdCBfRnVuY3RvcioKKyAgICAgIGZ1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uKT46OgorICAgICAgdGFyZ2V0KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsKKwlpZiAodHlwZWlkKF9GdW5jdG9yKSA9PSB0YXJnZXRfdHlwZSgpICYmIF9NX21hbmFnZXIpCisJICB7CisJICAgIF9BbnlfZGF0YSBfX3B0cjsKKwkgICAgX01fbWFuYWdlcihfX3B0ciwgX01fZnVuY3RvciwgX19nZXRfZnVuY3Rvcl9wdHIpOworCSAgICByZXR1cm4gX19wdHIuX01fYWNjZXNzPGNvbnN0IF9GdW5jdG9yKj4oKTsKKwkgIH0KKwllbHNlCisJICByZXR1cm4gMDsKKyAgICAgIH0KKyNlbmRpZgorCisgIC8vIFsyMC43LjE1LjIuNl0gbnVsbCBwb2ludGVyIGNvbXBhcmlzb25zCisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29tcGFyZXMgYSBwb2x5bW9ycGhpYyBmdW5jdGlvbiBvYmplY3Qgd3JhcHBlciBhZ2FpbnN0IDAKKyAgICogICh0aGUgTlVMTCBwb2ludGVyKS4KKyAgICogIEByZXR1cm5zIEBjIHRydWUgaWYgdGhlIHdyYXBwZXIgaGFzIG5vIHRhcmdldCwgQGMgZmFsc2Ugb3RoZXJ3aXNlCisgICAqCisgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IHRocm93IGFuICVleGNlcHRpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgZnVuY3Rpb248X1JlcyhfQXJncy4uLik+JiBfX2YsIG51bGxwdHJfdCkgbm9leGNlcHQKKyAgICB7IHJldHVybiAhc3RhdGljX2Nhc3Q8Ym9vbD4oX19mKTsgfQorCisgIC8vLyBAb3ZlcmxvYWQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KG51bGxwdHJfdCwgY29uc3QgZnVuY3Rpb248X1JlcyhfQXJncy4uLik+JiBfX2YpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gIXN0YXRpY19jYXN0PGJvb2w+KF9fZik7IH0KKworICAvKioKKyAgICogIEBicmllZiBDb21wYXJlcyBhIHBvbHltb3JwaGljIGZ1bmN0aW9uIG9iamVjdCB3cmFwcGVyIGFnYWluc3QgMAorICAgKiAgKHRoZSBOVUxMIHBvaW50ZXIpLgorICAgKiAgQHJldHVybnMgQGMgZmFsc2UgaWYgdGhlIHdyYXBwZXIgaGFzIG5vIHRhcmdldCwgQGMgdHJ1ZSBvdGhlcndpc2UKKyAgICoKKyAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cgYW4gJWV4Y2VwdGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBmdW5jdGlvbjxfUmVzKF9BcmdzLi4uKT4mIF9fZiwgbnVsbHB0cl90KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KF9fZik7IH0KKworICAvLy8gQG92ZXJsb2FkCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShudWxscHRyX3QsIGNvbnN0IGZ1bmN0aW9uPF9SZXMoX0FyZ3MuLi4pPiYgX19mKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KF9fZik7IH0KKworICAvLyBbMjAuNy4xNS4yLjddIHNwZWNpYWxpemVkIGFsZ29yaXRobXMKKworICAvKioKKyAgICogIEBicmllZiBTd2FwIHRoZSB0YXJnZXRzIG9mIHR3byBwb2x5bW9ycGhpYyBmdW5jdGlvbiBvYmplY3Qgd3JhcHBlcnMuCisgICAqCisgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IHRocm93IGFuICVleGNlcHRpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoZnVuY3Rpb248X1JlcyhfQXJncy4uLik+JiBfX3gsIGZ1bmN0aW9uPF9SZXMoX0FyZ3MuLi4pPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vIF9HTElCQ1hYX0ZVTkNUSU9OQUwKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZnV0dXJlIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9mdXR1cmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxNWZkOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvZnV0dXJlCkBAIC0wLDAgKzEsMTU1OCBAQAorLy8gPGZ1dHVyZT4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvZnV0dXJlCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0ZVVFVSRQorI2RlZmluZSBfR0xJQkNYWF9GVVRVUkUgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPgorI2luY2x1ZGUgPGJpdHMvdW5pcXVlX3B0ci5oPgorI2luY2x1ZGUgPGJpdHMvc2hhcmVkX3B0ci5oPgorI2luY2x1ZGUgPGJpdHMvdXNlc19hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL2FsbG9jX3RyYWl0cy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBkZWZncm91cCBmdXR1cmVzIEZ1dHVyZXMKKyAgICogQGluZ3JvdXAgY29uY3VycmVuY3kKKyAgICoKKyAgICogQ2xhc3NlcyBmb3IgZnV0dXJlcyBzdXBwb3J0LgorICAgKiBAeworICAgKi8KKworICAvLy8gRXJyb3IgY29kZSBmb3IgZnV0dXJlcworICBlbnVtIGNsYXNzIGZ1dHVyZV9lcnJjCisgIHsKKyAgICBmdXR1cmVfYWxyZWFkeV9yZXRyaWV2ZWQgPSAxLAorICAgIHByb21pc2VfYWxyZWFkeV9zYXRpc2ZpZWQsCisgICAgbm9fc3RhdGUsCisgICAgYnJva2VuX3Byb21pc2UKKyAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaXNfZXJyb3JfY29kZV9lbnVtPGZ1dHVyZV9lcnJjPiA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIC8vLyBQb2ludHMgdG8gYSBzdGF0aWNhbGx5LWFsbG9jYXRlZCBvYmplY3QgZGVyaXZlZCBmcm9tIGVycm9yX2NhdGVnb3J5LgorICBjb25zdCBlcnJvcl9jYXRlZ29yeSYKKyAgZnV0dXJlX2NhdGVnb3J5KCkgbm9leGNlcHQ7CisKKyAgLy8vIE92ZXJsb2FkIGZvciBtYWtlX2Vycm9yX2NvZGUuCisgIGlubGluZSBlcnJvcl9jb2RlCisgIG1ha2VfZXJyb3JfY29kZShmdXR1cmVfZXJyYyBfX2VycmMpIG5vZXhjZXB0CisgIHsgcmV0dXJuIGVycm9yX2NvZGUoc3RhdGljX2Nhc3Q8aW50PihfX2VycmMpLCBmdXR1cmVfY2F0ZWdvcnkoKSk7IH0KKworICAvLy8gT3ZlcmxvYWQgZm9yIG1ha2VfZXJyb3JfY29uZGl0aW9uLgorICBpbmxpbmUgZXJyb3JfY29uZGl0aW9uCisgIG1ha2VfZXJyb3JfY29uZGl0aW9uKGZ1dHVyZV9lcnJjIF9fZXJyYykgbm9leGNlcHQKKyAgeyByZXR1cm4gZXJyb3JfY29uZGl0aW9uKHN0YXRpY19jYXN0PGludD4oX19lcnJjKSwgZnV0dXJlX2NhdGVnb3J5KCkpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRXhjZXB0aW9uIHR5cGUgdGhyb3duIGJ5IGZ1dHVyZXMuCisgICAqICBAaW5ncm91cCBleGNlcHRpb25zCisgICAqLworICBjbGFzcyBmdXR1cmVfZXJyb3IgOiBwdWJsaWMgbG9naWNfZXJyb3IKKyAgeworICAgIGVycm9yX2NvZGUgCQkJX01fY29kZTsKKworICBwdWJsaWM6CisgICAgZXhwbGljaXQgZnV0dXJlX2Vycm9yKGVycm9yX2NvZGUgX19lYykKKyAgICA6IGxvZ2ljX2Vycm9yKCJzdGQ6OmZ1dHVyZV9lcnJvciIpLCBfTV9jb2RlKF9fZWMpCisgICAgeyB9CisKKyAgICB2aXJ0dWFsIH5mdXR1cmVfZXJyb3IoKSBub2V4Y2VwdDsKKworICAgIHZpcnR1YWwgY29uc3QgY2hhcioKKyAgICB3aGF0KCkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICBjb25zdCBlcnJvcl9jb2RlJgorICAgIGNvZGUoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBfTV9jb2RlOyB9CisgIH07CisKKyAgLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgY2xhc3MgZnV0dXJlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgY2xhc3Mgc2hhcmVkX2Z1dHVyZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIGNsYXNzIHBhY2thZ2VkX3Rhc2s7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICBjbGFzcyBwcm9taXNlOworCisgIC8vLyBMYXVuY2ggY29kZSBmb3IgZnV0dXJlcworICBlbnVtIGNsYXNzIGxhdW5jaAorICB7CisgICAgYXN5bmMgPSAxLAorICAgIGRlZmVycmVkID0gMgorICB9OworCisgIGNvbnN0ZXhwciBsYXVuY2ggb3BlcmF0b3ImKGxhdW5jaCBfX3gsIGxhdW5jaCBfX3kpCisgIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bGF1bmNoPigKKwlzdGF0aWNfY2FzdDxpbnQ+KF9feCkgJiBzdGF0aWNfY2FzdDxpbnQ+KF9feSkpOworICB9CisKKyAgY29uc3RleHByIGxhdW5jaCBvcGVyYXRvcnwobGF1bmNoIF9feCwgbGF1bmNoIF9feSkKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxsYXVuY2g+KAorCXN0YXRpY19jYXN0PGludD4oX194KSB8IHN0YXRpY19jYXN0PGludD4oX195KSk7CisgIH0KKworICBjb25zdGV4cHIgbGF1bmNoIG9wZXJhdG9yXihsYXVuY2ggX194LCBsYXVuY2ggX195KQorICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGxhdW5jaD4oCisJc3RhdGljX2Nhc3Q8aW50PihfX3gpIF4gc3RhdGljX2Nhc3Q8aW50PihfX3kpKTsKKyAgfQorCisgIGNvbnN0ZXhwciBsYXVuY2ggb3BlcmF0b3J+KGxhdW5jaCBfX3gpCisgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGxhdW5jaD4ofnN0YXRpY19jYXN0PGludD4oX194KSk7IH0KKworICBpbmxpbmUgbGF1bmNoJiBvcGVyYXRvciY9KGxhdW5jaCYgX194LCBsYXVuY2ggX195KQorICB7IHJldHVybiBfX3ggPSBfX3ggJiBfX3k7IH0KKworICBpbmxpbmUgbGF1bmNoJiBvcGVyYXRvcnw9KGxhdW5jaCYgX194LCBsYXVuY2ggX195KQorICB7IHJldHVybiBfX3ggPSBfX3ggfCBfX3k7IH0KKworICBpbmxpbmUgbGF1bmNoJiBvcGVyYXRvcl49KGxhdW5jaCYgX194LCBsYXVuY2ggX195KQorICB7IHJldHVybiBfX3ggPSBfX3ggXiBfX3k7IH0KKworICAvLy8gU3RhdHVzIGNvZGUgZm9yIGZ1dHVyZXMKKyAgZW51bSBjbGFzcyBmdXR1cmVfc3RhdHVzCisgIHsKKyAgICByZWFkeSwKKyAgICB0aW1lb3V0LAorICAgIGRlZmVycmVkCisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZuLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBmdXR1cmU8dHlwZW5hbWUgcmVzdWx0X29mPF9GbihfQXJncy4uLik+Ojp0eXBlPgorICAgIGFzeW5jKGxhdW5jaCBfX3BvbGljeSwgX0ZuJiYgX19mbiwgX0FyZ3MmJi4uLiBfX2FyZ3MpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GbiwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgZnV0dXJlPHR5cGVuYW1lIHJlc3VsdF9vZjxfRm4oX0FyZ3MuLi4pPjo6dHlwZT4KKyAgICBhc3luYyhfRm4mJiBfX2ZuLCBfQXJncyYmLi4uIF9fYXJncyk7CisKKyNpZiBkZWZpbmVkKF9HTElCQ1hYX0hBU19HVEhSRUFEUykgJiYgZGVmaW5lZChfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEpIFwKKyAgJiYgKEFUT01JQ19JTlRfTE9DS19GUkVFID4gMSkKKworICAvLy8gQmFzZSBjbGFzcyBhbmQgZW5jbG9zaW5nIHNjb3BlLgorICBzdHJ1Y3QgX19mdXR1cmVfYmFzZQorICB7CisgICAgLy8vIEJhc2UgY2xhc3MgZm9yIHJlc3VsdHMuCisgICAgc3RydWN0IF9SZXN1bHRfYmFzZQorICAgIHsKKyAgICAgIGV4Y2VwdGlvbl9wdHIJCV9NX2Vycm9yOworCisgICAgICBfUmVzdWx0X2Jhc2UoY29uc3QgX1Jlc3VsdF9iYXNlJikgPSBkZWxldGU7CisgICAgICBfUmVzdWx0X2Jhc2UmIG9wZXJhdG9yPShjb25zdCBfUmVzdWx0X2Jhc2UmKSA9IGRlbGV0ZTsKKworICAgICAgLy8gX01fZGVzdHJveSgpIGFsbG93cyBkZXJpdmVkIGNsYXNzZXMgdG8gY29udHJvbCBkZWFsbG9jYXRpb24KKyAgICAgIHZpcnR1YWwgdm9pZCBfTV9kZXN0cm95KCkgPSAwOworCisgICAgICBzdHJ1Y3QgX0RlbGV0ZXIKKyAgICAgIHsKKwl2b2lkIG9wZXJhdG9yKCkoX1Jlc3VsdF9iYXNlKiBfX2ZyKSBjb25zdCB7IF9fZnItPl9NX2Rlc3Ryb3koKTsgfQorICAgICAgfTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9SZXN1bHRfYmFzZSgpOworICAgICAgdmlydHVhbCB+X1Jlc3VsdF9iYXNlKCk7CisgICAgfTsKKworICAgIC8vLyBSZXN1bHQuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICAgIHN0cnVjdCBfUmVzdWx0IDogX1Jlc3VsdF9iYXNlCisgICAgICB7CisgICAgICBwcml2YXRlOgorCXR5cGVkZWYgYWxpZ25tZW50X29mPF9SZXM+CQkJCV9fYV9vZjsKKwl0eXBlZGVmIGFsaWduZWRfc3RvcmFnZTxzaXplb2YoX1JlcyksIF9fYV9vZjo6dmFsdWU+CV9fYWxpZ25fc3RvcmFnZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fYWxpZ25fc3RvcmFnZTo6dHlwZQkJCV9fYWxpZ25fdHlwZTsKKworCV9fYWxpZ25fdHlwZQkJX01fc3RvcmFnZTsKKwlib29sIAkJCV9NX2luaXRpYWxpemVkOworCisgICAgICBwdWJsaWM6CisJdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOworCisJX1Jlc3VsdCgpIG5vZXhjZXB0IDogX01faW5pdGlhbGl6ZWQoKSB7IH0KKwkKKwl+X1Jlc3VsdCgpCisJeworCSAgaWYgKF9NX2luaXRpYWxpemVkKQorCSAgICBfTV92YWx1ZSgpLn5fUmVzKCk7CisJfQorCisJLy8gUmV0dXJuIGx2YWx1ZSwgZnV0dXJlIHdpbGwgYWRkIGNvbnN0IG9yIHJ2YWx1ZS1yZWZlcmVuY2UKKwlfUmVzJgorCV9NX3ZhbHVlKCkgbm9leGNlcHQgeyByZXR1cm4gKnN0YXRpY19jYXN0PF9SZXMqPihfTV9hZGRyKCkpOyB9CisKKwl2b2lkCisJX01fc2V0KGNvbnN0IF9SZXMmIF9fcmVzKQorCXsKKwkgIDo6bmV3IChfTV9hZGRyKCkpIF9SZXMoX19yZXMpOworCSAgX01faW5pdGlhbGl6ZWQgPSB0cnVlOworCX0KKworCXZvaWQKKwlfTV9zZXQoX1JlcyYmIF9fcmVzKQorCXsKKwkgIDo6bmV3IChfTV9hZGRyKCkpIF9SZXMoc3RkOjptb3ZlKF9fcmVzKSk7CisJICBfTV9pbml0aWFsaXplZCA9IHRydWU7CisJfQorCisgICAgICBwcml2YXRlOgorCXZvaWQgX01fZGVzdHJveSgpIHsgZGVsZXRlIHRoaXM7IH0KKworCXZvaWQqIF9NX2FkZHIoKSBub2V4Y2VwdCB7IHJldHVybiBzdGF0aWNfY2FzdDx2b2lkKj4oJl9NX3N0b3JhZ2UpOyB9CisgICAgfTsKKworICAgIC8vLyBBIHVuaXF1ZV9wdHIgYmFzZWQgb24gdGhlIGluc3RhbnRpYXRpbmcgdHlwZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgICAgdXNpbmcgX1B0ciA9IHVuaXF1ZV9wdHI8X1JlcywgX1Jlc3VsdF9iYXNlOjpfRGVsZXRlcj47CisKKyAgICAvLy8gUmVzdWx0X2FsbG9jLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgIHN0cnVjdCBfUmVzdWx0X2FsbG9jIGZpbmFsIDogX1Jlc3VsdDxfUmVzPiwgX0FsbG9jCisgICAgICB7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+Ojp0ZW1wbGF0ZQorICAgICAgICAgIHJlYmluZF9hbGxvYzxfUmVzdWx0X2FsbG9jPiBfX2FsbG9jYXRvcl90eXBlOworCisgICAgICAgIGV4cGxpY2l0CisJX1Jlc3VsdF9hbGxvYyhjb25zdCBfQWxsb2MmIF9fYSkgOiBfUmVzdWx0PF9SZXM+KCksIF9BbGxvYyhfX2EpCisgICAgICAgIHsgfQorCQorICAgICAgcHJpdmF0ZToKKwl2b2lkIF9NX2Rlc3Ryb3koKQorICAgICAgICB7CisJICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8X19hbGxvY2F0b3JfdHlwZT4gX190cmFpdHM7CisgICAgICAgICAgX19hbGxvY2F0b3JfdHlwZSBfX2EoKnRoaXMpOworCSAgX190cmFpdHM6OmRlc3Ryb3koX19hLCB0aGlzKTsKKwkgIF9fdHJhaXRzOjpkZWFsbG9jYXRlKF9fYSwgdGhpcywgMSk7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgICAgc3RhdGljIF9QdHI8X1Jlc3VsdF9hbGxvYzxfUmVzLCBfQWxsb2NhdG9yPj4KKyAgICAgIF9TX2FsbG9jYXRlX3Jlc3VsdChjb25zdCBfQWxsb2NhdG9yJiBfX2EpCisgICAgICB7CisgICAgICAgIHR5cGVkZWYgX1Jlc3VsdF9hbGxvYzxfUmVzLCBfQWxsb2NhdG9yPglfX3Jlc3VsdF90eXBlOworCXR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czx0eXBlbmFtZSBfX3Jlc3VsdF90eXBlOjpfX2FsbG9jYXRvcl90eXBlPgorCSAgX190cmFpdHM7CisgICAgICAgIHR5cGVuYW1lIF9fdHJhaXRzOjphbGxvY2F0b3JfdHlwZSBfX2EyKF9fYSk7CisgICAgICAgIF9fcmVzdWx0X3R5cGUqIF9fcCA9IF9fdHJhaXRzOjphbGxvY2F0ZShfX2EyLCAxKTsKKyAgICAgICAgX190cnkKKwkgIHsKKwkgICAgX190cmFpdHM6OmNvbnN0cnVjdChfX2EyLCBfX3AsIF9fYSk7CisJICB9CisgICAgICAgIF9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfX3RyYWl0czo6ZGVhbGxvY2F0ZShfX2EyLCBfX3AsIDEpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKyAgICAgICAgcmV0dXJuIF9QdHI8X19yZXN1bHRfdHlwZT4oX19wKTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UcD4KKyAgICAgIHN0YXRpYyBfUHRyPF9SZXN1bHQ8X1Jlcz4+CisgICAgICBfU19hbGxvY2F0ZV9yZXN1bHQoY29uc3Qgc3RkOjphbGxvY2F0b3I8X1RwPiYgX19hKQorICAgICAgeworCXJldHVybiBfUHRyPF9SZXN1bHQ8X1Jlcz4+KG5ldyBfUmVzdWx0PF9SZXM+KTsKKyAgICAgIH0KKworICAgIC8vLyBCYXNlIGNsYXNzIGZvciBzdGF0ZSBiZXR3ZWVuIGEgcHJvbWlzZSBhbmQgb25lIG9yIG1vcmUKKyAgICAvLy8gYXNzb2NpYXRlZCBmdXR1cmVzLgorICAgIGNsYXNzIF9TdGF0ZV9iYXNlCisgICAgeworICAgICAgdHlwZWRlZiBfUHRyPF9SZXN1bHRfYmFzZT4gX1B0cl90eXBlOworCisgICAgICBfUHRyX3R5cGUJCQlfTV9yZXN1bHQ7CisgICAgICBtdXRleCAgICAgICAgICAgICAgIAlfTV9tdXRleDsKKyAgICAgIGNvbmRpdGlvbl92YXJpYWJsZSAgCV9NX2NvbmQ7CisgICAgICBhdG9taWNfZmxhZyAgICAgICAgIAlfTV9yZXRyaWV2ZWQ7CisgICAgICBvbmNlX2ZsYWcJCQlfTV9vbmNlOworCisgICAgcHVibGljOgorICAgICAgX1N0YXRlX2Jhc2UoKSBub2V4Y2VwdCA6IF9NX3Jlc3VsdCgpLCBfTV9yZXRyaWV2ZWQoQVRPTUlDX0ZMQUdfSU5JVCkgeyB9CisgICAgICBfU3RhdGVfYmFzZShjb25zdCBfU3RhdGVfYmFzZSYpID0gZGVsZXRlOworICAgICAgX1N0YXRlX2Jhc2UmIG9wZXJhdG9yPShjb25zdCBfU3RhdGVfYmFzZSYpID0gZGVsZXRlOworICAgICAgdmlydHVhbCB+X1N0YXRlX2Jhc2UoKTsKKworICAgICAgX1Jlc3VsdF9iYXNlJgorICAgICAgd2FpdCgpCisgICAgICB7CisJX01fcnVuX2RlZmVycmVkKCk7CisJdW5pcXVlX2xvY2s8bXV0ZXg+IF9fbG9jayhfTV9tdXRleCk7CisJX01fY29uZC53YWl0KF9fbG9jaywgWyZdIHsgcmV0dXJuIF9NX3JlYWR5KCk7IH0pOworCXJldHVybiAqX01fcmVzdWx0OworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kPgorICAgICAgICBmdXR1cmVfc3RhdHVzCisgICAgICAgIHdhaXRfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcmVsKQorICAgICAgICB7CisJICB1bmlxdWVfbG9jazxtdXRleD4gX19sb2NrKF9NX211dGV4KTsKKwkgIGlmIChfTV9jb25kLndhaXRfZm9yKF9fbG9jaywgX19yZWwsIFsmXSB7IHJldHVybiBfTV9yZWFkeSgpOyB9KSkKKwkgICAgcmV0dXJuIGZ1dHVyZV9zdGF0dXM6OnJlYWR5OworCSAgcmV0dXJuIGZ1dHVyZV9zdGF0dXM6OnRpbWVvdXQ7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXJhdGlvbj4KKyAgICAgICAgZnV0dXJlX3N0YXR1cworICAgICAgICB3YWl0X3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYWJzKQorICAgICAgICB7CisJICB1bmlxdWVfbG9jazxtdXRleD4gX19sb2NrKF9NX211dGV4KTsKKwkgIGlmIChfTV9jb25kLndhaXRfdW50aWwoX19sb2NrLCBfX2FicywgWyZdIHsgcmV0dXJuIF9NX3JlYWR5KCk7IH0pKQorCSAgICByZXR1cm4gZnV0dXJlX3N0YXR1czo6cmVhZHk7CisJICByZXR1cm4gZnV0dXJlX3N0YXR1czo6dGltZW91dDsKKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3NldF9yZXN1bHQoZnVuY3Rpb248X1B0cl90eXBlKCk+IF9fcmVzLCBib29sIF9faWdub3JlX2ZhaWx1cmUgPSBmYWxzZSkKKyAgICAgIHsKKyAgICAgICAgYm9vbCBfX3NldCA9IF9faWdub3JlX2ZhaWx1cmU7CisgICAgICAgIC8vIGFsbCBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGFyZSBzZXJpYWxpemVkLAorICAgICAgICAvLyBzaWRlLWVmZmVjdHMgb2YgaW52b2tpbmcgX19yZXMgb25seSBoYXBwZW4gb25jZQorICAgICAgICBjYWxsX29uY2UoX01fb25jZSwgJl9TdGF0ZV9iYXNlOjpfTV9kb19zZXQsIHRoaXMsIHJlZihfX3JlcyksCisgICAgICAgICAgICByZWYoX19zZXQpKTsKKyAgICAgICAgaWYgKCFfX3NldCkKKyAgICAgICAgICBfX3Rocm93X2Z1dHVyZV9lcnJvcihpbnQoZnV0dXJlX2VycmM6OnByb21pc2VfYWxyZWFkeV9zYXRpc2ZpZWQpKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fYnJlYWtfcHJvbWlzZShfUHRyX3R5cGUgX19yZXMpCisgICAgICB7CisJaWYgKHN0YXRpY19jYXN0PGJvb2w+KF9fcmVzKSkKKwkgIHsKKwkgICAgZXJyb3JfY29kZSBfX2VjKG1ha2VfZXJyb3JfY29kZShmdXR1cmVfZXJyYzo6YnJva2VuX3Byb21pc2UpKTsKKwkgICAgX19yZXMtPl9NX2Vycm9yID0gY29weV9leGNlcHRpb24oZnV0dXJlX2Vycm9yKF9fZWMpKTsKKwkgICAgeworCSAgICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IF9fbG9jayhfTV9tdXRleCk7CisJICAgICAgX01fcmVzdWx0LnN3YXAoX19yZXMpOworCSAgICB9CisJICAgIF9NX2NvbmQubm90aWZ5X2FsbCgpOworCSAgfQorICAgICAgfQorCisgICAgICAvLyBDYWxsZWQgd2hlbiB0aGlzIG9iamVjdCBpcyBwYXNzZWQgdG8gYSBmdXR1cmUuCisgICAgICB2b2lkCisgICAgICBfTV9zZXRfcmV0cmlldmVkX2ZsYWcoKQorICAgICAgeworCWlmIChfTV9yZXRyaWV2ZWQudGVzdF9hbmRfc2V0KCkpCisJICBfX3Rocm93X2Z1dHVyZV9lcnJvcihpbnQoZnV0dXJlX2VycmM6OmZ1dHVyZV9hbHJlYWR5X3JldHJpZXZlZCkpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQXJnPgorICAgICAgICBzdHJ1Y3QgX1NldHRlcjsKKworICAgICAgLy8gc2V0IGx2YWx1ZXMKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9Bcmc+CisgICAgICAgIHN0cnVjdCBfU2V0dGVyPF9SZXMsIF9BcmcmPgorICAgICAgICB7CisgICAgICAgICAgLy8gY2hlY2sgdGhpcyBpcyBvbmx5IHVzZWQgYnkgcHJvbWlzZTxSPjo6c2V0X3ZhbHVlKGNvbnN0IFImKQorICAgICAgICAgIC8vIG9yIHByb21pc2U8Uj46OnNldF92YWx1ZShSJikKKyAgICAgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8X1JlcywgX0FyZyY+Ojp2YWx1ZSAgLy8gcHJvbWlzZTxSJj4KKyAgICAgICAgICAgICAgfHwgaXNfc2FtZTxjb25zdCBfUmVzLCBfQXJnPjo6dmFsdWUsICAvLyBwcm9taXNlPFI+CisgICAgICAgICAgICAgICJJbnZhbGlkIHNwZWNpYWxpc2F0aW9uIik7CisKKyAgICAgICAgICB0eXBlbmFtZSBwcm9taXNlPF9SZXM+OjpfUHRyX3R5cGUgb3BlcmF0b3IoKSgpCisgICAgICAgICAgeworICAgICAgICAgICAgX1N0YXRlX2Jhc2U6Ol9TX2NoZWNrKF9NX3Byb21pc2UtPl9NX2Z1dHVyZSk7CisgICAgICAgICAgICBfTV9wcm9taXNlLT5fTV9zdG9yYWdlLT5fTV9zZXQoX01fYXJnKTsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoX01fcHJvbWlzZS0+X01fc3RvcmFnZSk7CisgICAgICAgICAgfQorICAgICAgICAgIHByb21pc2U8X1Jlcz4qICAgIF9NX3Byb21pc2U7CisgICAgICAgICAgX0FyZyYgICAgICAgICAgICAgX01fYXJnOworICAgICAgICB9OworCisgICAgICAvLyBzZXQgcnZhbHVlcworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICAgICAgc3RydWN0IF9TZXR0ZXI8X1JlcywgX1JlcyYmPgorICAgICAgICB7CisgICAgICAgICAgdHlwZW5hbWUgcHJvbWlzZTxfUmVzPjo6X1B0cl90eXBlIG9wZXJhdG9yKCkoKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9TdGF0ZV9iYXNlOjpfU19jaGVjayhfTV9wcm9taXNlLT5fTV9mdXR1cmUpOworICAgICAgICAgICAgX01fcHJvbWlzZS0+X01fc3RvcmFnZS0+X01fc2V0KHN0ZDo6bW92ZShfTV9hcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoX01fcHJvbWlzZS0+X01fc3RvcmFnZSk7CisgICAgICAgICAgfQorICAgICAgICAgIHByb21pc2U8X1Jlcz4qICAgIF9NX3Byb21pc2U7CisgICAgICAgICAgX1JlcyYgICAgICAgICAgICAgX01fYXJnOworICAgICAgICB9OworCisgICAgICBzdHJ1Y3QgX19leGNlcHRpb25fcHRyX3RhZyB7IH07CisKKyAgICAgIC8vIHNldCBleGNlcHRpb25zCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgICAgICBzdHJ1Y3QgX1NldHRlcjxfUmVzLCBfX2V4Y2VwdGlvbl9wdHJfdGFnPgorICAgICAgICB7CisgICAgICAgICAgdHlwZW5hbWUgcHJvbWlzZTxfUmVzPjo6X1B0cl90eXBlIG9wZXJhdG9yKCkoKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9TdGF0ZV9iYXNlOjpfU19jaGVjayhfTV9wcm9taXNlLT5fTV9mdXR1cmUpOworICAgICAgICAgICAgX01fcHJvbWlzZS0+X01fc3RvcmFnZS0+X01fZXJyb3IgPSBfTV9leDsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoX01fcHJvbWlzZS0+X01fc3RvcmFnZSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcHJvbWlzZTxfUmVzPiogICBfTV9wcm9taXNlOworICAgICAgICAgIGV4Y2VwdGlvbl9wdHImICAgIF9NX2V4OworICAgICAgICB9OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQXJnPgorICAgICAgICBzdGF0aWMgX1NldHRlcjxfUmVzLCBfQXJnJiY+CisgICAgICAgIF9fc2V0dGVyKHByb21pc2U8X1Jlcz4qIF9fcHJvbSwgX0FyZyYmIF9fYXJnKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIF9TZXR0ZXI8X1JlcywgX0FyZyYmPnsgX19wcm9tLCBfX2FyZyB9OworICAgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgICAgIHN0YXRpYyBfU2V0dGVyPF9SZXMsIF9fZXhjZXB0aW9uX3B0cl90YWc+CisgICAgICAgIF9fc2V0dGVyKGV4Y2VwdGlvbl9wdHImIF9fZXgsIHByb21pc2U8X1Jlcz4qIF9fcHJvbSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBfU2V0dGVyPF9SZXMsIF9fZXhjZXB0aW9uX3B0cl90YWc+eyBfX3Byb20sIF9fZXggfTsKKyAgICAgICAgfQorCisgICAgICBzdGF0aWMgX1NldHRlcjx2b2lkLCB2b2lkPgorICAgICAgX19zZXR0ZXIocHJvbWlzZTx2b2lkPiogX19wcm9tKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBzdGF0aWMgdm9pZAorICAgICAgICBfU19jaGVjayhjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9fcCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4oX19wKSkKKyAgICAgICAgICAgIF9fdGhyb3dfZnV0dXJlX2Vycm9yKChpbnQpZnV0dXJlX2VycmM6Om5vX3N0YXRlKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX3NldChmdW5jdGlvbjxfUHRyX3R5cGUoKT4mIF9fZiwgYm9vbCYgX19zZXQpCisgICAgICB7CisgICAgICAgIF9QdHJfdHlwZSBfX3JlcyA9IF9fZigpOworICAgICAgICB7CisgICAgICAgICAgbG9ja19ndWFyZDxtdXRleD4gX19sb2NrKF9NX211dGV4KTsKKyAgICAgICAgICBfTV9yZXN1bHQuc3dhcChfX3Jlcyk7CisgICAgICAgIH0KKyAgICAgICAgX01fY29uZC5ub3RpZnlfYWxsKCk7CisgICAgICAgIF9fc2V0ID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgYm9vbCBfTV9yZWFkeSgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KF9NX3Jlc3VsdCk7IH0KKworICAgICAgLy8gTWlzbmFtZWQ6IHdhaXRzIGZvciBjb21wbGV0aW9uIG9mIGFzeW5jIGZ1bmN0aW9uLgorICAgICAgdmlydHVhbCB2b2lkIF9NX3J1bl9kZWZlcnJlZCgpIHsgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQm91bmRGbiwgdHlwZW5hbWUgPSB0eXBlbmFtZSBfQm91bmRGbjo6cmVzdWx0X3R5cGU+CisgICAgICBjbGFzcyBfRGVmZXJyZWRfc3RhdGU7CisKKyAgICBjbGFzcyBfQXN5bmNfc3RhdGVfY29tbW9uOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0JvdW5kRm4sIHR5cGVuYW1lID0gdHlwZW5hbWUgX0JvdW5kRm46OnJlc3VsdF90eXBlPgorICAgICAgY2xhc3MgX0FzeW5jX3N0YXRlX2ltcGw7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgICAgY2xhc3MgX1Rhc2tfc3RhdGVfYmFzZTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GbiwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgICAgY2xhc3MgX1Rhc2tfc3RhdGU7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQm91bmRGbj4KKyAgICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8X1N0YXRlX2Jhc2U+CisgICAgICBfU19tYWtlX2RlZmVycmVkX3N0YXRlKF9Cb3VuZEZuJiYgX19mbik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQm91bmRGbj4KKyAgICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8X1N0YXRlX2Jhc2U+CisgICAgICBfU19tYWtlX2FzeW5jX3N0YXRlKF9Cb3VuZEZuJiYgX19mbik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzX3B0ciwKKwkgICAgIHR5cGVuYW1lIF9SZXMgPSB0eXBlbmFtZSBfUmVzX3B0cjo6ZWxlbWVudF90eXBlOjpyZXN1bHRfdHlwZT4KKyAgICAgIHN0cnVjdCBfVGFza19zZXR0ZXI7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzX3B0ciwgdHlwZW5hbWUgX0JvdW5kRm4+CisgICAgICBzdGF0aWMgX1Rhc2tfc2V0dGVyPF9SZXNfcHRyPgorICAgICAgX1NfdGFza19zZXR0ZXIoX1Jlc19wdHImIF9fcHRyLCBfQm91bmRGbiYmIF9fY2FsbCkKKyAgICAgIHsKKwlyZXR1cm4gX1Rhc2tfc2V0dGVyPF9SZXNfcHRyPnsgX19wdHIsIHN0ZDo6cmVmKF9fY2FsbCkgfTsKKyAgICAgIH0KKyAgfTsKKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgcmVmZXJlbmNlIHR5cGVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgIHN0cnVjdCBfX2Z1dHVyZV9iYXNlOjpfUmVzdWx0PF9SZXMmPiA6IF9fZnV0dXJlX2Jhc2U6Ol9SZXN1bHRfYmFzZQorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JlcyYgcmVzdWx0X3R5cGU7CisKKyAgICAgIF9SZXN1bHQoKSBub2V4Y2VwdCA6IF9NX3ZhbHVlX3B0cigpIHsgfQorCisgICAgICB2b2lkIF9NX3NldChfUmVzJiBfX3Jlcykgbm9leGNlcHQgeyBfTV92YWx1ZV9wdHIgPSAmX19yZXM7IH0KKworICAgICAgX1JlcyYgX01fZ2V0KCkgbm9leGNlcHQgeyByZXR1cm4gKl9NX3ZhbHVlX3B0cjsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9SZXMqIAkJCV9NX3ZhbHVlX3B0cjsKKworICAgICAgdm9pZCBfTV9kZXN0cm95KCkgeyBkZWxldGUgdGhpczsgfQorICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciB2b2lkLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fZnV0dXJlX2Jhc2U6Ol9SZXN1bHQ8dm9pZD4gOiBfX2Z1dHVyZV9iYXNlOjpfUmVzdWx0X2Jhc2UKKyAgICB7CisgICAgICB0eXBlZGVmIHZvaWQgcmVzdWx0X3R5cGU7CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZCBfTV9kZXN0cm95KCkgeyBkZWxldGUgdGhpczsgfQorICAgIH07CisKKworICAvLy8gQ29tbW9uIGltcGxlbWVudGF0aW9uIGZvciBmdXR1cmUgYW5kIHNoYXJlZF9mdXR1cmUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgY2xhc3MgX19iYXNpY19mdXR1cmUgOiBwdWJsaWMgX19mdXR1cmVfYmFzZQorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIHNoYXJlZF9wdHI8X1N0YXRlX2Jhc2U+CQlfX3N0YXRlX3R5cGU7CisgICAgICB0eXBlZGVmIF9fZnV0dXJlX2Jhc2U6Ol9SZXN1bHQ8X1Jlcz4mCV9fcmVzdWx0X3R5cGU7CisKKyAgICBwcml2YXRlOgorICAgICAgX19zdGF0ZV90eXBlIAkJX01fc3RhdGU7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBEaXNhYmxlIGNvcHlpbmcuCisgICAgICBfX2Jhc2ljX2Z1dHVyZShjb25zdCBfX2Jhc2ljX2Z1dHVyZSYpID0gZGVsZXRlOworICAgICAgX19iYXNpY19mdXR1cmUmIG9wZXJhdG9yPShjb25zdCBfX2Jhc2ljX2Z1dHVyZSYpID0gZGVsZXRlOworCisgICAgICBib29sCisgICAgICB2YWxpZCgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KF9NX3N0YXRlKTsgfQorCisgICAgICB2b2lkCisgICAgICB3YWl0KCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgX1N0YXRlX2Jhc2U6Ol9TX2NoZWNrKF9NX3N0YXRlKTsKKyAgICAgICAgX01fc3RhdGUtPndhaXQoKTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcCwgdHlwZW5hbWUgX1BlcmlvZD4KKyAgICAgICAgZnV0dXJlX3N0YXR1cworICAgICAgICB3YWl0X2Zvcihjb25zdCBjaHJvbm86OmR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX3JlbCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgIF9TdGF0ZV9iYXNlOjpfU19jaGVjayhfTV9zdGF0ZSk7CisgICAgICAgICAgcmV0dXJuIF9NX3N0YXRlLT53YWl0X2ZvcihfX3JlbCk7CisgICAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Nsb2NrLCB0eXBlbmFtZSBfRHVyYXRpb24+CisgICAgICAgIGZ1dHVyZV9zdGF0dXMKKyAgICAgICAgd2FpdF91bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX2FicykgY29uc3QKKyAgICAgICAgeworICAgICAgICAgIF9TdGF0ZV9iYXNlOjpfU19jaGVjayhfTV9zdGF0ZSk7CisgICAgICAgICAgcmV0dXJuIF9NX3N0YXRlLT53YWl0X3VudGlsKF9fYWJzKTsKKyAgICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8vIFdhaXQgZm9yIHRoZSBzdGF0ZSB0byBiZSByZWFkeSBhbmQgcmV0aHJvdyBhbnkgc3RvcmVkIGV4Y2VwdGlvbgorICAgICAgX19yZXN1bHRfdHlwZQorICAgICAgX01fZ2V0X3Jlc3VsdCgpIGNvbnN0CisgICAgICB7CisgICAgICAgIF9TdGF0ZV9iYXNlOjpfU19jaGVjayhfTV9zdGF0ZSk7CisgICAgICAgIF9SZXN1bHRfYmFzZSYgX19yZXMgPSBfTV9zdGF0ZS0+d2FpdCgpOworICAgICAgICBpZiAoIShfX3Jlcy5fTV9lcnJvciA9PSAwKSkKKyAgICAgICAgICByZXRocm93X2V4Y2VwdGlvbihfX3Jlcy5fTV9lcnJvcik7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxfX3Jlc3VsdF90eXBlPihfX3Jlcyk7CisgICAgICB9CisKKyAgICAgIHZvaWQgX01fc3dhcChfX2Jhc2ljX2Z1dHVyZSYgX190aGF0KSBub2V4Y2VwdAorICAgICAgeworICAgICAgICBfTV9zdGF0ZS5zd2FwKF9fdGhhdC5fTV9zdGF0ZSk7CisgICAgICB9CisKKyAgICAgIC8vIENvbnN0cnVjdGlvbiBvZiBhIGZ1dHVyZSBieSBwcm9taXNlOjpnZXRfZnV0dXJlKCkKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX2Jhc2ljX2Z1dHVyZShjb25zdCBfX3N0YXRlX3R5cGUmIF9fc3RhdGUpIDogX01fc3RhdGUoX19zdGF0ZSkKKyAgICAgIHsKKyAgICAgICAgX1N0YXRlX2Jhc2U6Ol9TX2NoZWNrKF9NX3N0YXRlKTsKKyAgICAgICAgX01fc3RhdGUtPl9NX3NldF9yZXRyaWV2ZWRfZmxhZygpOworICAgICAgfQorCisgICAgICAvLyBDb3B5IGNvbnN0cnVjdGlvbiBmcm9tIGEgc2hhcmVkX2Z1dHVyZQorICAgICAgZXhwbGljaXQKKyAgICAgIF9fYmFzaWNfZnV0dXJlKGNvbnN0IHNoYXJlZF9mdXR1cmU8X1Jlcz4mKSBub2V4Y2VwdDsKKworICAgICAgLy8gTW92ZSBjb25zdHJ1Y3Rpb24gZnJvbSBhIHNoYXJlZF9mdXR1cmUKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX2Jhc2ljX2Z1dHVyZShzaGFyZWRfZnV0dXJlPF9SZXM+JiYpIG5vZXhjZXB0OworCisgICAgICAvLyBNb3ZlIGNvbnN0cnVjdGlvbiBmcm9tIGEgZnV0dXJlCisgICAgICBleHBsaWNpdAorICAgICAgX19iYXNpY19mdXR1cmUoZnV0dXJlPF9SZXM+JiYpIG5vZXhjZXB0OworCisgICAgICBjb25zdGV4cHIgX19iYXNpY19mdXR1cmUoKSBub2V4Y2VwdCA6IF9NX3N0YXRlKCkgeyB9CisKKyAgICAgIHN0cnVjdCBfUmVzZXQKKyAgICAgIHsKKyAgICAgICAgZXhwbGljaXQgX1Jlc2V0KF9fYmFzaWNfZnV0dXJlJiBfX2Z1dCkgbm9leGNlcHQgOiBfTV9mdXQoX19mdXQpIHsgfQorICAgICAgICB+X1Jlc2V0KCkgeyBfTV9mdXQuX01fc3RhdGUucmVzZXQoKTsgfQorICAgICAgICBfX2Jhc2ljX2Z1dHVyZSYgX01fZnV0OworICAgICAgfTsKKyAgICB9OworCisKKyAgLy8vIFByaW1hcnkgdGVtcGxhdGUgZm9yIGZ1dHVyZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICBjbGFzcyBmdXR1cmUgOiBwdWJsaWMgX19iYXNpY19mdXR1cmU8X1Jlcz4KKyAgICB7CisgICAgICBmcmllbmQgY2xhc3MgcHJvbWlzZTxfUmVzPjsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lPiBmcmllbmQgY2xhc3MgcGFja2FnZWRfdGFzazsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GbiwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIGZyaWVuZCBmdXR1cmU8dHlwZW5hbWUgcmVzdWx0X29mPF9GbihfQXJncy4uLik+Ojp0eXBlPgorICAgICAgICBhc3luYyhsYXVuY2gsIF9GbiYmLCBfQXJncyYmLi4uKTsKKworICAgICAgdHlwZWRlZiBfX2Jhc2ljX2Z1dHVyZTxfUmVzPiBfQmFzZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZV90eXBlOjpfX3N0YXRlX3R5cGUgX19zdGF0ZV90eXBlOworCisgICAgICBleHBsaWNpdAorICAgICAgZnV0dXJlKGNvbnN0IF9fc3RhdGVfdHlwZSYgX19zdGF0ZSkgOiBfQmFzZV90eXBlKF9fc3RhdGUpIHsgfQorCisgICAgcHVibGljOgorICAgICAgY29uc3RleHByIGZ1dHVyZSgpIG5vZXhjZXB0IDogX0Jhc2VfdHlwZSgpIHsgfQorCisgICAgICAvLy8gTW92ZSBjb25zdHJ1Y3RvcgorICAgICAgZnV0dXJlKGZ1dHVyZSYmIF9fdWYpIG5vZXhjZXB0IDogX0Jhc2VfdHlwZShzdGQ6Om1vdmUoX191ZikpIHsgfQorCisgICAgICAvLyBEaXNhYmxlIGNvcHlpbmcKKyAgICAgIGZ1dHVyZShjb25zdCBmdXR1cmUmKSA9IGRlbGV0ZTsKKyAgICAgIGZ1dHVyZSYgb3BlcmF0b3I9KGNvbnN0IGZ1dHVyZSYpID0gZGVsZXRlOworCisgICAgICBmdXR1cmUmIG9wZXJhdG9yPShmdXR1cmUmJiBfX2Z1dCkgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgZnV0dXJlKHN0ZDo6bW92ZShfX2Z1dCkpLl9NX3N3YXAoKnRoaXMpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vLyBSZXRyaWV2aW5nIHRoZSB2YWx1ZQorICAgICAgX1JlcworICAgICAgZ2V0KCkKKyAgICAgIHsKKyAgICAgICAgdHlwZW5hbWUgX0Jhc2VfdHlwZTo6X1Jlc2V0IF9fcmVzZXQoKnRoaXMpOworICAgICAgICByZXR1cm4gc3RkOjptb3ZlKHRoaXMtPl9NX2dldF9yZXN1bHQoKS5fTV92YWx1ZSgpKTsKKyAgICAgIH0KKworICAgICAgc2hhcmVkX2Z1dHVyZTxfUmVzPiBzaGFyZSgpOworICAgIH07CisKKyAgLy8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yIGZ1dHVyZTxSJj4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICBjbGFzcyBmdXR1cmU8X1JlcyY+IDogcHVibGljIF9fYmFzaWNfZnV0dXJlPF9SZXMmPgorICAgIHsKKyAgICAgIGZyaWVuZCBjbGFzcyBwcm9taXNlPF9SZXMmPjsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lPiBmcmllbmQgY2xhc3MgcGFja2FnZWRfdGFzazsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GbiwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIGZyaWVuZCBmdXR1cmU8dHlwZW5hbWUgcmVzdWx0X29mPF9GbihfQXJncy4uLik+Ojp0eXBlPgorICAgICAgICBhc3luYyhsYXVuY2gsIF9GbiYmLCBfQXJncyYmLi4uKTsKKworICAgICAgdHlwZWRlZiBfX2Jhc2ljX2Z1dHVyZTxfUmVzJj4gX0Jhc2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2VfdHlwZTo6X19zdGF0ZV90eXBlIF9fc3RhdGVfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIGZ1dHVyZShjb25zdCBfX3N0YXRlX3R5cGUmIF9fc3RhdGUpIDogX0Jhc2VfdHlwZShfX3N0YXRlKSB7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIGNvbnN0ZXhwciBmdXR1cmUoKSBub2V4Y2VwdCA6IF9CYXNlX3R5cGUoKSB7IH0KKworICAgICAgLy8vIE1vdmUgY29uc3RydWN0b3IKKyAgICAgIGZ1dHVyZShmdXR1cmUmJiBfX3VmKSBub2V4Y2VwdCA6IF9CYXNlX3R5cGUoc3RkOjptb3ZlKF9fdWYpKSB7IH0KKworICAgICAgLy8gRGlzYWJsZSBjb3B5aW5nCisgICAgICBmdXR1cmUoY29uc3QgZnV0dXJlJikgPSBkZWxldGU7CisgICAgICBmdXR1cmUmIG9wZXJhdG9yPShjb25zdCBmdXR1cmUmKSA9IGRlbGV0ZTsKKworICAgICAgZnV0dXJlJiBvcGVyYXRvcj0oZnV0dXJlJiYgX19mdXQpIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIGZ1dHVyZShzdGQ6Om1vdmUoX19mdXQpKS5fTV9zd2FwKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLy8gUmV0cmlldmluZyB0aGUgdmFsdWUKKyAgICAgIF9SZXMmCisgICAgICBnZXQoKQorICAgICAgeworICAgICAgICB0eXBlbmFtZSBfQmFzZV90eXBlOjpfUmVzZXQgX19yZXNldCgqdGhpcyk7CisgICAgICAgIHJldHVybiB0aGlzLT5fTV9nZXRfcmVzdWx0KCkuX01fZ2V0KCk7CisgICAgICB9CisKKyAgICAgIHNoYXJlZF9mdXR1cmU8X1JlcyY+IHNoYXJlKCk7CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIGZ1dHVyZTx2b2lkPgorICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgZnV0dXJlPHZvaWQ+IDogcHVibGljIF9fYmFzaWNfZnV0dXJlPHZvaWQ+CisgICAgeworICAgICAgZnJpZW5kIGNsYXNzIHByb21pc2U8dm9pZD47CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4gZnJpZW5kIGNsYXNzIHBhY2thZ2VkX3Rhc2s7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm4sIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICBmcmllbmQgZnV0dXJlPHR5cGVuYW1lIHJlc3VsdF9vZjxfRm4oX0FyZ3MuLi4pPjo6dHlwZT4KKyAgICAgICAgYXN5bmMobGF1bmNoLCBfRm4mJiwgX0FyZ3MmJi4uLik7CisKKyAgICAgIHR5cGVkZWYgX19iYXNpY19mdXR1cmU8dm9pZD4gX0Jhc2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2VfdHlwZTo6X19zdGF0ZV90eXBlIF9fc3RhdGVfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIGZ1dHVyZShjb25zdCBfX3N0YXRlX3R5cGUmIF9fc3RhdGUpIDogX0Jhc2VfdHlwZShfX3N0YXRlKSB7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIGNvbnN0ZXhwciBmdXR1cmUoKSBub2V4Y2VwdCA6IF9CYXNlX3R5cGUoKSB7IH0KKworICAgICAgLy8vIE1vdmUgY29uc3RydWN0b3IKKyAgICAgIGZ1dHVyZShmdXR1cmUmJiBfX3VmKSBub2V4Y2VwdCA6IF9CYXNlX3R5cGUoc3RkOjptb3ZlKF9fdWYpKSB7IH0KKworICAgICAgLy8gRGlzYWJsZSBjb3B5aW5nCisgICAgICBmdXR1cmUoY29uc3QgZnV0dXJlJikgPSBkZWxldGU7CisgICAgICBmdXR1cmUmIG9wZXJhdG9yPShjb25zdCBmdXR1cmUmKSA9IGRlbGV0ZTsKKworICAgICAgZnV0dXJlJiBvcGVyYXRvcj0oZnV0dXJlJiYgX19mdXQpIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIGZ1dHVyZShzdGQ6Om1vdmUoX19mdXQpKS5fTV9zd2FwKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLy8gUmV0cmlldmluZyB0aGUgdmFsdWUKKyAgICAgIHZvaWQKKyAgICAgIGdldCgpCisgICAgICB7CisgICAgICAgIHR5cGVuYW1lIF9CYXNlX3R5cGU6Ol9SZXNldCBfX3Jlc2V0KCp0aGlzKTsKKyAgICAgICAgdGhpcy0+X01fZ2V0X3Jlc3VsdCgpOworICAgICAgfQorCisgICAgICBzaGFyZWRfZnV0dXJlPHZvaWQ+IHNoYXJlKCk7CisgICAgfTsKKworCisgIC8vLyBQcmltYXJ5IHRlbXBsYXRlIGZvciBzaGFyZWRfZnV0dXJlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgIGNsYXNzIHNoYXJlZF9mdXR1cmUgOiBwdWJsaWMgX19iYXNpY19mdXR1cmU8X1Jlcz4KKyAgICB7CisgICAgICB0eXBlZGVmIF9fYmFzaWNfZnV0dXJlPF9SZXM+IF9CYXNlX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICBjb25zdGV4cHIgc2hhcmVkX2Z1dHVyZSgpIG5vZXhjZXB0IDogX0Jhc2VfdHlwZSgpIHsgfQorCisgICAgICAvLy8gQ29weSBjb25zdHJ1Y3RvcgorICAgICAgc2hhcmVkX2Z1dHVyZShjb25zdCBzaGFyZWRfZnV0dXJlJiBfX3NmKSA6IF9CYXNlX3R5cGUoX19zZikgeyB9CisKKyAgICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhIGZ1dHVyZSBydmFsdWUKKyAgICAgIHNoYXJlZF9mdXR1cmUoZnV0dXJlPF9SZXM+JiYgX191Zikgbm9leGNlcHQKKyAgICAgIDogX0Jhc2VfdHlwZShzdGQ6Om1vdmUoX191ZikpCisgICAgICB7IH0KKworICAgICAgLy8vIENvbnN0cnVjdCBmcm9tIGEgc2hhcmVkX2Z1dHVyZSBydmFsdWUKKyAgICAgIHNoYXJlZF9mdXR1cmUoc2hhcmVkX2Z1dHVyZSYmIF9fc2YpIG5vZXhjZXB0CisgICAgICA6IF9CYXNlX3R5cGUoc3RkOjptb3ZlKF9fc2YpKQorICAgICAgeyB9CisKKyAgICAgIHNoYXJlZF9mdXR1cmUmIG9wZXJhdG9yPShjb25zdCBzaGFyZWRfZnV0dXJlJiBfX3NmKQorICAgICAgeworICAgICAgICBzaGFyZWRfZnV0dXJlKF9fc2YpLl9NX3N3YXAoKnRoaXMpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHNoYXJlZF9mdXR1cmUmIG9wZXJhdG9yPShzaGFyZWRfZnV0dXJlJiYgX19zZikgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgc2hhcmVkX2Z1dHVyZShzdGQ6Om1vdmUoX19zZikpLl9NX3N3YXAoKnRoaXMpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vLyBSZXRyaWV2aW5nIHRoZSB2YWx1ZQorICAgICAgY29uc3QgX1JlcyYKKyAgICAgIGdldCgpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPl9NX2dldF9yZXN1bHQoKS5fTV92YWx1ZSgpOyB9CisgICAgfTsKKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3Igc2hhcmVkX2Z1dHVyZTxSJj4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICBjbGFzcyBzaGFyZWRfZnV0dXJlPF9SZXMmPiA6IHB1YmxpYyBfX2Jhc2ljX2Z1dHVyZTxfUmVzJj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9fYmFzaWNfZnV0dXJlPF9SZXMmPiAgICAgICAgICAgX0Jhc2VfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIGNvbnN0ZXhwciBzaGFyZWRfZnV0dXJlKCkgbm9leGNlcHQgOiBfQmFzZV90eXBlKCkgeyB9CisKKyAgICAgIC8vLyBDb3B5IGNvbnN0cnVjdG9yCisgICAgICBzaGFyZWRfZnV0dXJlKGNvbnN0IHNoYXJlZF9mdXR1cmUmIF9fc2YpIDogX0Jhc2VfdHlwZShfX3NmKSB7IH0KKworICAgICAgLy8vIENvbnN0cnVjdCBmcm9tIGEgZnV0dXJlIHJ2YWx1ZQorICAgICAgc2hhcmVkX2Z1dHVyZShmdXR1cmU8X1JlcyY+JiYgX191Zikgbm9leGNlcHQKKyAgICAgIDogX0Jhc2VfdHlwZShzdGQ6Om1vdmUoX191ZikpCisgICAgICB7IH0KKworICAgICAgLy8vIENvbnN0cnVjdCBmcm9tIGEgc2hhcmVkX2Z1dHVyZSBydmFsdWUKKyAgICAgIHNoYXJlZF9mdXR1cmUoc2hhcmVkX2Z1dHVyZSYmIF9fc2YpIG5vZXhjZXB0CisgICAgICA6IF9CYXNlX3R5cGUoc3RkOjptb3ZlKF9fc2YpKQorICAgICAgeyB9CisKKyAgICAgIHNoYXJlZF9mdXR1cmUmIG9wZXJhdG9yPShjb25zdCBzaGFyZWRfZnV0dXJlJiBfX3NmKQorICAgICAgeworICAgICAgICBzaGFyZWRfZnV0dXJlKF9fc2YpLl9NX3N3YXAoKnRoaXMpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHNoYXJlZF9mdXR1cmUmIG9wZXJhdG9yPShzaGFyZWRfZnV0dXJlJiYgX19zZikgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgc2hhcmVkX2Z1dHVyZShzdGQ6Om1vdmUoX19zZikpLl9NX3N3YXAoKnRoaXMpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vLyBSZXRyaWV2aW5nIHRoZSB2YWx1ZQorICAgICAgX1JlcyYKKyAgICAgIGdldCgpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPl9NX2dldF9yZXN1bHQoKS5fTV9nZXQoKTsgfQorICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBzaGFyZWRfZnV0dXJlPHZvaWQ+CisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBzaGFyZWRfZnV0dXJlPHZvaWQ+IDogcHVibGljIF9fYmFzaWNfZnV0dXJlPHZvaWQ+CisgICAgeworICAgICAgdHlwZWRlZiBfX2Jhc2ljX2Z1dHVyZTx2b2lkPiBfQmFzZV90eXBlOworCisgICAgcHVibGljOgorICAgICAgY29uc3RleHByIHNoYXJlZF9mdXR1cmUoKSBub2V4Y2VwdCA6IF9CYXNlX3R5cGUoKSB7IH0KKworICAgICAgLy8vIENvcHkgY29uc3RydWN0b3IKKyAgICAgIHNoYXJlZF9mdXR1cmUoY29uc3Qgc2hhcmVkX2Z1dHVyZSYgX19zZikgOiBfQmFzZV90eXBlKF9fc2YpIHsgfQorCisgICAgICAvLy8gQ29uc3RydWN0IGZyb20gYSBmdXR1cmUgcnZhbHVlCisgICAgICBzaGFyZWRfZnV0dXJlKGZ1dHVyZTx2b2lkPiYmIF9fdWYpIG5vZXhjZXB0CisgICAgICA6IF9CYXNlX3R5cGUoc3RkOjptb3ZlKF9fdWYpKQorICAgICAgeyB9CisKKyAgICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhIHNoYXJlZF9mdXR1cmUgcnZhbHVlCisgICAgICBzaGFyZWRfZnV0dXJlKHNoYXJlZF9mdXR1cmUmJiBfX3NmKSBub2V4Y2VwdAorICAgICAgOiBfQmFzZV90eXBlKHN0ZDo6bW92ZShfX3NmKSkKKyAgICAgIHsgfQorCisgICAgICBzaGFyZWRfZnV0dXJlJiBvcGVyYXRvcj0oY29uc3Qgc2hhcmVkX2Z1dHVyZSYgX19zZikKKyAgICAgIHsKKyAgICAgICAgc2hhcmVkX2Z1dHVyZShfX3NmKS5fTV9zd2FwKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBzaGFyZWRfZnV0dXJlJiBvcGVyYXRvcj0oc2hhcmVkX2Z1dHVyZSYmIF9fc2YpIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIHNoYXJlZF9mdXR1cmUoc3RkOjptb3ZlKF9fc2YpKS5fTV9zd2FwKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLyBSZXRyaWV2aW5nIHRoZSB2YWx1ZQorICAgICAgdm9pZAorICAgICAgZ2V0KCkgY29uc3QgeyB0aGlzLT5fTV9nZXRfcmVzdWx0KCk7IH0KKyAgICB9OworCisgIC8vIE5vdyB3ZSBjYW4gZGVmaW5lIHRoZSBwcm90ZWN0ZWQgX19iYXNpY19mdXR1cmUgY29uc3RydWN0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgIGlubGluZSBfX2Jhc2ljX2Z1dHVyZTxfUmVzPjo6CisgICAgX19iYXNpY19mdXR1cmUoY29uc3Qgc2hhcmVkX2Z1dHVyZTxfUmVzPiYgX19zZikgbm9leGNlcHQKKyAgICA6IF9NX3N0YXRlKF9fc2YuX01fc3RhdGUpCisgICAgeyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICBpbmxpbmUgX19iYXNpY19mdXR1cmU8X1Jlcz46OgorICAgIF9fYmFzaWNfZnV0dXJlKHNoYXJlZF9mdXR1cmU8X1Jlcz4mJiBfX3NmKSBub2V4Y2VwdAorICAgIDogX01fc3RhdGUoc3RkOjptb3ZlKF9fc2YuX01fc3RhdGUpKQorICAgIHsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgaW5saW5lIF9fYmFzaWNfZnV0dXJlPF9SZXM+OjoKKyAgICBfX2Jhc2ljX2Z1dHVyZShmdXR1cmU8X1Jlcz4mJiBfX3VmKSBub2V4Y2VwdAorICAgIDogX01fc3RhdGUoc3RkOjptb3ZlKF9fdWYuX01fc3RhdGUpKQorICAgIHsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgaW5saW5lIHNoYXJlZF9mdXR1cmU8X1Jlcz4KKyAgICBmdXR1cmU8X1Jlcz46OnNoYXJlKCkKKyAgICB7IHJldHVybiBzaGFyZWRfZnV0dXJlPF9SZXM+KHN0ZDo6bW92ZSgqdGhpcykpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICBpbmxpbmUgc2hhcmVkX2Z1dHVyZTxfUmVzJj4KKyAgICBmdXR1cmU8X1JlcyY+OjpzaGFyZSgpCisgICAgeyByZXR1cm4gc2hhcmVkX2Z1dHVyZTxfUmVzJj4oc3RkOjptb3ZlKCp0aGlzKSk7IH0KKworICBpbmxpbmUgc2hhcmVkX2Z1dHVyZTx2b2lkPgorICBmdXR1cmU8dm9pZD46OnNoYXJlKCkKKyAgeyByZXR1cm4gc2hhcmVkX2Z1dHVyZTx2b2lkPihzdGQ6Om1vdmUoKnRoaXMpKTsgfQorCisgIC8vLyBQcmltYXJ5IHRlbXBsYXRlIGZvciBwcm9taXNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgY2xhc3MgcHJvbWlzZQorICAgIHsKKyAgICAgIHR5cGVkZWYgX19mdXR1cmVfYmFzZTo6X1N0YXRlX2Jhc2UgCV9TdGF0ZTsKKyAgICAgIHR5cGVkZWYgX19mdXR1cmVfYmFzZTo6X1Jlc3VsdDxfUmVzPglfUmVzX3R5cGU7CisgICAgICB0eXBlZGVmIF9fZnV0dXJlX2Jhc2U6Ol9QdHI8X1Jlc190eXBlPglfUHRyX3R5cGU7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGZyaWVuZCBjbGFzcyBfU3RhdGU6Ol9TZXR0ZXI7CisKKyAgICAgIHNoYXJlZF9wdHI8X1N0YXRlPiAgICAgICAgICAgICAgICAgICAgICAgIF9NX2Z1dHVyZTsKKyAgICAgIF9QdHJfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX3N0b3JhZ2U7CisKKyAgICBwdWJsaWM6CisgICAgICBwcm9taXNlKCkKKyAgICAgIDogX01fZnV0dXJlKHN0ZDo6bWFrZV9zaGFyZWQ8X1N0YXRlPigpKSwKKwlfTV9zdG9yYWdlKG5ldyBfUmVzX3R5cGUoKSkKKyAgICAgIHsgfQorCisgICAgICBwcm9taXNlKHByb21pc2UmJiBfX3Jocykgbm9leGNlcHQKKyAgICAgIDogX01fZnV0dXJlKHN0ZDo6bW92ZShfX3Jocy5fTV9mdXR1cmUpKSwKKwlfTV9zdG9yYWdlKHN0ZDo6bW92ZShfX3Jocy5fTV9zdG9yYWdlKSkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgICAgICBwcm9taXNlKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jYXRvciYgX19hKQorICAgICAgICA6IF9NX2Z1dHVyZShzdGQ6OmFsbG9jYXRlX3NoYXJlZDxfU3RhdGU+KF9fYSkpLAorCSAgX01fc3RvcmFnZShfX2Z1dHVyZV9iYXNlOjpfU19hbGxvY2F0ZV9yZXN1bHQ8X1Jlcz4oX19hKSkKKyAgICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgICAgIHByb21pc2UoYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2NhdG9yJiwgcHJvbWlzZSYmIF9fcmhzKQorICAgICAgICA6IF9NX2Z1dHVyZShzdGQ6Om1vdmUoX19yaHMuX01fZnV0dXJlKSksCisJICBfTV9zdG9yYWdlKHN0ZDo6bW92ZShfX3Jocy5fTV9zdG9yYWdlKSkKKyAgICAgICAgeyB9CisKKyAgICAgIHByb21pc2UoY29uc3QgcHJvbWlzZSYpID0gZGVsZXRlOworCisgICAgICB+cHJvbWlzZSgpCisgICAgICB7CisgICAgICAgIGlmIChzdGF0aWNfY2FzdDxib29sPihfTV9mdXR1cmUpICYmICFfTV9mdXR1cmUudW5pcXVlKCkpCisgICAgICAgICAgX01fZnV0dXJlLT5fTV9icmVha19wcm9taXNlKHN0ZDo6bW92ZShfTV9zdG9yYWdlKSk7CisgICAgICB9CisKKyAgICAgIC8vIEFzc2lnbm1lbnQKKyAgICAgIHByb21pc2UmCisgICAgICBvcGVyYXRvcj0ocHJvbWlzZSYmIF9fcmhzKSBub2V4Y2VwdAorICAgICAgeworICAgICAgICBwcm9taXNlKHN0ZDo6bW92ZShfX3JocykpLnN3YXAoKnRoaXMpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHByb21pc2UmIG9wZXJhdG9yPShjb25zdCBwcm9taXNlJikgPSBkZWxldGU7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAocHJvbWlzZSYgX19yaHMpIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIF9NX2Z1dHVyZS5zd2FwKF9fcmhzLl9NX2Z1dHVyZSk7CisgICAgICAgIF9NX3N0b3JhZ2Uuc3dhcChfX3Jocy5fTV9zdG9yYWdlKTsKKyAgICAgIH0KKworICAgICAgLy8gUmV0cmlldmluZyB0aGUgcmVzdWx0CisgICAgICBmdXR1cmU8X1Jlcz4KKyAgICAgIGdldF9mdXR1cmUoKQorICAgICAgeyByZXR1cm4gZnV0dXJlPF9SZXM+KF9NX2Z1dHVyZSk7IH0KKworICAgICAgLy8gU2V0dGluZyB0aGUgcmVzdWx0CisgICAgICB2b2lkCisgICAgICBzZXRfdmFsdWUoY29uc3QgX1JlcyYgX19yKQorICAgICAgeworICAgICAgICBhdXRvIF9fc2V0dGVyID0gX1N0YXRlOjpfX3NldHRlcih0aGlzLCBfX3IpOworICAgICAgICBfTV9mdXR1cmUtPl9NX3NldF9yZXN1bHQoc3RkOjptb3ZlKF9fc2V0dGVyKSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHNldF92YWx1ZShfUmVzJiYgX19yKQorICAgICAgeworICAgICAgICBhdXRvIF9fc2V0dGVyID0gX1N0YXRlOjpfX3NldHRlcih0aGlzLCBzdGQ6Om1vdmUoX19yKSk7CisgICAgICAgIF9NX2Z1dHVyZS0+X01fc2V0X3Jlc3VsdChzdGQ6Om1vdmUoX19zZXR0ZXIpKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgc2V0X2V4Y2VwdGlvbihleGNlcHRpb25fcHRyIF9fcCkKKyAgICAgIHsKKyAgICAgICAgYXV0byBfX3NldHRlciA9IF9TdGF0ZTo6X19zZXR0ZXIoX19wLCB0aGlzKTsKKyAgICAgICAgX01fZnV0dXJlLT5fTV9zZXRfcmVzdWx0KHN0ZDo6bW92ZShfX3NldHRlcikpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAocHJvbWlzZTxfUmVzPiYgX194LCBwcm9taXNlPF9SZXM+JiBfX3kpIG5vZXhjZXB0CisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCB1c2VzX2FsbG9jYXRvcjxwcm9taXNlPF9SZXM+LCBfQWxsb2M+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworCisgIC8vLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciBwcm9taXNlPFImPgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgIGNsYXNzIHByb21pc2U8X1JlcyY+CisgICAgeworICAgICAgdHlwZWRlZiBfX2Z1dHVyZV9iYXNlOjpfU3RhdGVfYmFzZQlfU3RhdGU7CisgICAgICB0eXBlZGVmIF9fZnV0dXJlX2Jhc2U6Ol9SZXN1bHQ8X1JlcyY+CV9SZXNfdHlwZTsKKyAgICAgIHR5cGVkZWYgX19mdXR1cmVfYmFzZTo6X1B0cjxfUmVzX3R5cGU+IAlfUHRyX3R5cGU7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGZyaWVuZCBjbGFzcyBfU3RhdGU6Ol9TZXR0ZXI7CisKKyAgICAgIHNoYXJlZF9wdHI8X1N0YXRlPiAgICAgICAgICAgICAgICAgICAgICAgIF9NX2Z1dHVyZTsKKyAgICAgIF9QdHJfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX3N0b3JhZ2U7CisKKyAgICBwdWJsaWM6CisgICAgICBwcm9taXNlKCkKKyAgICAgIDogX01fZnV0dXJlKHN0ZDo6bWFrZV9zaGFyZWQ8X1N0YXRlPigpKSwKKwlfTV9zdG9yYWdlKG5ldyBfUmVzX3R5cGUoKSkKKyAgICAgIHsgfQorCisgICAgICBwcm9taXNlKHByb21pc2UmJiBfX3Jocykgbm9leGNlcHQKKyAgICAgIDogX01fZnV0dXJlKHN0ZDo6bW92ZShfX3Jocy5fTV9mdXR1cmUpKSwKKwlfTV9zdG9yYWdlKHN0ZDo6bW92ZShfX3Jocy5fTV9zdG9yYWdlKSkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgICAgICBwcm9taXNlKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jYXRvciYgX19hKQorICAgICAgICA6IF9NX2Z1dHVyZShzdGQ6OmFsbG9jYXRlX3NoYXJlZDxfU3RhdGU+KF9fYSkpLAorCSAgX01fc3RvcmFnZShfX2Z1dHVyZV9iYXNlOjpfU19hbGxvY2F0ZV9yZXN1bHQ8X1JlcyY+KF9fYSkpCisgICAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgICAgICBwcm9taXNlKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jYXRvciYsIHByb21pc2UmJiBfX3JocykKKyAgICAgICAgOiBfTV9mdXR1cmUoc3RkOjptb3ZlKF9fcmhzLl9NX2Z1dHVyZSkpLAorCSAgX01fc3RvcmFnZShzdGQ6Om1vdmUoX19yaHMuX01fc3RvcmFnZSkpCisgICAgICAgIHsgfQorCisgICAgICBwcm9taXNlKGNvbnN0IHByb21pc2UmKSA9IGRlbGV0ZTsKKworICAgICAgfnByb21pc2UoKQorICAgICAgeworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4oX01fZnV0dXJlKSAmJiAhX01fZnV0dXJlLnVuaXF1ZSgpKQorICAgICAgICAgIF9NX2Z1dHVyZS0+X01fYnJlYWtfcHJvbWlzZShzdGQ6Om1vdmUoX01fc3RvcmFnZSkpOworICAgICAgfQorCisgICAgICAvLyBBc3NpZ25tZW50CisgICAgICBwcm9taXNlJgorICAgICAgb3BlcmF0b3I9KHByb21pc2UmJiBfX3Jocykgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgcHJvbWlzZShzdGQ6Om1vdmUoX19yaHMpKS5zd2FwKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBwcm9taXNlJiBvcGVyYXRvcj0oY29uc3QgcHJvbWlzZSYpID0gZGVsZXRlOworCisgICAgICB2b2lkCisgICAgICBzd2FwKHByb21pc2UmIF9fcmhzKSBub2V4Y2VwdAorICAgICAgeworICAgICAgICBfTV9mdXR1cmUuc3dhcChfX3Jocy5fTV9mdXR1cmUpOworICAgICAgICBfTV9zdG9yYWdlLnN3YXAoX19yaHMuX01fc3RvcmFnZSk7CisgICAgICB9CisKKyAgICAgIC8vIFJldHJpZXZpbmcgdGhlIHJlc3VsdAorICAgICAgZnV0dXJlPF9SZXMmPgorICAgICAgZ2V0X2Z1dHVyZSgpCisgICAgICB7IHJldHVybiBmdXR1cmU8X1JlcyY+KF9NX2Z1dHVyZSk7IH0KKworICAgICAgLy8gU2V0dGluZyB0aGUgcmVzdWx0CisgICAgICB2b2lkCisgICAgICBzZXRfdmFsdWUoX1JlcyYgX19yKQorICAgICAgeworICAgICAgICBhdXRvIF9fc2V0dGVyID0gX1N0YXRlOjpfX3NldHRlcih0aGlzLCBfX3IpOworICAgICAgICBfTV9mdXR1cmUtPl9NX3NldF9yZXN1bHQoc3RkOjptb3ZlKF9fc2V0dGVyKSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHNldF9leGNlcHRpb24oZXhjZXB0aW9uX3B0ciBfX3ApCisgICAgICB7CisgICAgICAgIGF1dG8gX19zZXR0ZXIgPSBfU3RhdGU6Ol9fc2V0dGVyKF9fcCwgdGhpcyk7CisgICAgICAgIF9NX2Z1dHVyZS0+X01fc2V0X3Jlc3VsdChzdGQ6Om1vdmUoX19zZXR0ZXIpKTsKKyAgICAgIH0KKyAgICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgcHJvbWlzZTx2b2lkPgorICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgcHJvbWlzZTx2b2lkPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX19mdXR1cmVfYmFzZTo6X1N0YXRlX2Jhc2UJX1N0YXRlOworICAgICAgdHlwZWRlZiBfX2Z1dHVyZV9iYXNlOjpfUmVzdWx0PHZvaWQ+CV9SZXNfdHlwZTsKKyAgICAgIHR5cGVkZWYgX19mdXR1cmVfYmFzZTo6X1B0cjxfUmVzX3R5cGU+IAlfUHRyX3R5cGU7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGZyaWVuZCBjbGFzcyBfU3RhdGU6Ol9TZXR0ZXI7CisKKyAgICAgIHNoYXJlZF9wdHI8X1N0YXRlPiAgICAgICAgICAgICAgICAgICAgICAgIF9NX2Z1dHVyZTsKKyAgICAgIF9QdHJfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX3N0b3JhZ2U7CisKKyAgICBwdWJsaWM6CisgICAgICBwcm9taXNlKCkKKyAgICAgIDogX01fZnV0dXJlKHN0ZDo6bWFrZV9zaGFyZWQ8X1N0YXRlPigpKSwKKwlfTV9zdG9yYWdlKG5ldyBfUmVzX3R5cGUoKSkKKyAgICAgIHsgfQorCisgICAgICBwcm9taXNlKHByb21pc2UmJiBfX3Jocykgbm9leGNlcHQKKyAgICAgIDogX01fZnV0dXJlKHN0ZDo6bW92ZShfX3Jocy5fTV9mdXR1cmUpKSwKKwlfTV9zdG9yYWdlKHN0ZDo6bW92ZShfX3Jocy5fTV9zdG9yYWdlKSkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgICAgICBwcm9taXNlKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jYXRvciYgX19hKQorICAgICAgICA6IF9NX2Z1dHVyZShzdGQ6OmFsbG9jYXRlX3NoYXJlZDxfU3RhdGU+KF9fYSkpLAorCSAgX01fc3RvcmFnZShfX2Z1dHVyZV9iYXNlOjpfU19hbGxvY2F0ZV9yZXN1bHQ8dm9pZD4oX19hKSkKKyAgICAgICAgeyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIwOTUuICBtaXNzaW5nIGNvbnN0cnVjdG9ycyBuZWVkZWQgZm9yIHVzZXMtYWxsb2NhdG9yIGNvbnN0cnVjdGlvbgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICAgICAgcHJvbWlzZShhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvY2F0b3ImLCBwcm9taXNlJiYgX19yaHMpCisgICAgICAgIDogX01fZnV0dXJlKHN0ZDo6bW92ZShfX3Jocy5fTV9mdXR1cmUpKSwKKwkgIF9NX3N0b3JhZ2Uoc3RkOjptb3ZlKF9fcmhzLl9NX3N0b3JhZ2UpKQorICAgICAgICB7IH0KKworICAgICAgcHJvbWlzZShjb25zdCBwcm9taXNlJikgPSBkZWxldGU7CisKKyAgICAgIH5wcm9taXNlKCkKKyAgICAgIHsKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KF9NX2Z1dHVyZSkgJiYgIV9NX2Z1dHVyZS51bmlxdWUoKSkKKyAgICAgICAgICBfTV9mdXR1cmUtPl9NX2JyZWFrX3Byb21pc2Uoc3RkOjptb3ZlKF9NX3N0b3JhZ2UpKTsKKyAgICAgIH0KKworICAgICAgLy8gQXNzaWdubWVudAorICAgICAgcHJvbWlzZSYKKyAgICAgIG9wZXJhdG9yPShwcm9taXNlJiYgX19yaHMpIG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIHByb21pc2Uoc3RkOjptb3ZlKF9fcmhzKSkuc3dhcCgqdGhpcyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgcHJvbWlzZSYgb3BlcmF0b3I9KGNvbnN0IHByb21pc2UmKSA9IGRlbGV0ZTsKKworICAgICAgdm9pZAorICAgICAgc3dhcChwcm9taXNlJiBfX3Jocykgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgX01fZnV0dXJlLnN3YXAoX19yaHMuX01fZnV0dXJlKTsKKyAgICAgICAgX01fc3RvcmFnZS5zd2FwKF9fcmhzLl9NX3N0b3JhZ2UpOworICAgICAgfQorCisgICAgICAvLyBSZXRyaWV2aW5nIHRoZSByZXN1bHQKKyAgICAgIGZ1dHVyZTx2b2lkPgorICAgICAgZ2V0X2Z1dHVyZSgpCisgICAgICB7IHJldHVybiBmdXR1cmU8dm9pZD4oX01fZnV0dXJlKTsgfQorCisgICAgICAvLyBTZXR0aW5nIHRoZSByZXN1bHQKKyAgICAgIHZvaWQgc2V0X3ZhbHVlKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIHNldF9leGNlcHRpb24oZXhjZXB0aW9uX3B0ciBfX3ApCisgICAgICB7CisgICAgICAgIGF1dG8gX19zZXR0ZXIgPSBfU3RhdGU6Ol9fc2V0dGVyKF9fcCwgdGhpcyk7CisgICAgICAgIF9NX2Z1dHVyZS0+X01fc2V0X3Jlc3VsdChzdGQ6Om1vdmUoX19zZXR0ZXIpKTsKKyAgICAgIH0KKyAgICB9OworCisgIC8vIHNldCB2b2lkCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19mdXR1cmVfYmFzZTo6X1N0YXRlX2Jhc2U6Ol9TZXR0ZXI8dm9pZCwgdm9pZD4KKyAgICB7CisgICAgICBwcm9taXNlPHZvaWQ+OjpfUHRyX3R5cGUgb3BlcmF0b3IoKSgpCisgICAgICB7CisgICAgICAgIF9TdGF0ZV9iYXNlOjpfU19jaGVjayhfTV9wcm9taXNlLT5fTV9mdXR1cmUpOworICAgICAgICByZXR1cm4gc3RkOjptb3ZlKF9NX3Byb21pc2UtPl9NX3N0b3JhZ2UpOworICAgICAgfQorCisgICAgICBwcm9taXNlPHZvaWQ+KiAgICBfTV9wcm9taXNlOworICAgIH07CisKKyAgaW5saW5lIF9fZnV0dXJlX2Jhc2U6Ol9TdGF0ZV9iYXNlOjpfU2V0dGVyPHZvaWQsIHZvaWQ+CisgIF9fZnV0dXJlX2Jhc2U6Ol9TdGF0ZV9iYXNlOjpfX3NldHRlcihwcm9taXNlPHZvaWQ+KiBfX3Byb20pCisgIHsKKyAgICByZXR1cm4gX1NldHRlcjx2b2lkLCB2b2lkPnsgX19wcm9tIH07CisgIH0KKworICBpbmxpbmUgdm9pZAorICBwcm9taXNlPHZvaWQ+OjpzZXRfdmFsdWUoKQorICB7CisgICAgYXV0byBfX3NldHRlciA9IF9TdGF0ZTo6X19zZXR0ZXIodGhpcyk7CisgICAgX01fZnV0dXJlLT5fTV9zZXRfcmVzdWx0KHN0ZDo6bW92ZShfX3NldHRlcikpOworICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHRyX3R5cGUsIHR5cGVuYW1lIF9SZXM+CisgICAgc3RydWN0IF9fZnV0dXJlX2Jhc2U6Ol9UYXNrX3NldHRlcgorICAgIHsKKyAgICAgIF9QdHJfdHlwZSBvcGVyYXRvcigpKCkKKyAgICAgIHsKKwlfX3RyeQorCSAgeworCSAgICBfTV9yZXN1bHQtPl9NX3NldChfTV9mbigpKTsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX01fcmVzdWx0LT5fTV9lcnJvciA9IGN1cnJlbnRfZXhjZXB0aW9uKCk7CisJICB9CisJcmV0dXJuIHN0ZDo6bW92ZShfTV9yZXN1bHQpOworICAgICAgfQorICAgICAgX1B0cl90eXBlJiAgICAgICAgICAgICAgICBfTV9yZXN1bHQ7CisgICAgICBzdGQ6OmZ1bmN0aW9uPF9SZXMoKT4gICAgIF9NX2ZuOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1B0cl90eXBlPgorICAgIHN0cnVjdCBfX2Z1dHVyZV9iYXNlOjpfVGFza19zZXR0ZXI8X1B0cl90eXBlLCB2b2lkPgorICAgIHsKKyAgICAgIF9QdHJfdHlwZSBvcGVyYXRvcigpKCkKKyAgICAgIHsKKwlfX3RyeQorCSAgeworCSAgICBfTV9mbigpOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfTV9yZXN1bHQtPl9NX2Vycm9yID0gY3VycmVudF9leGNlcHRpb24oKTsKKwkgIH0KKwlyZXR1cm4gc3RkOjptb3ZlKF9NX3Jlc3VsdCk7CisgICAgICB9CisgICAgICBfUHRyX3R5cGUmICAgICAgICAgICAgICAgIF9NX3Jlc3VsdDsKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiAgICAgX01fZm47CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgX19mdXR1cmVfYmFzZTo6X1Rhc2tfc3RhdGVfYmFzZTxfUmVzKF9BcmdzLi4uKT4KKyAgICA6IF9fZnV0dXJlX2Jhc2U6Ol9TdGF0ZV9iYXNlCisgICAgeworICAgICAgdHlwZWRlZiBfUmVzIF9SZXNfdHlwZTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorCV9UYXNrX3N0YXRlX2Jhc2UoY29uc3QgX0FsbG9jJiBfX2EpCisJOiBfTV9yZXN1bHQoX1NfYWxsb2NhdGVfcmVzdWx0PF9SZXM+KF9fYSkpCisJeyB9CisKKyAgICAgIHZpcnR1YWwgdm9pZAorICAgICAgX01fcnVuKF9BcmdzLi4uIF9fYXJncykgPSAwOworCisgICAgICB2aXJ0dWFsIHNoYXJlZF9wdHI8X1Rhc2tfc3RhdGVfYmFzZT4KKyAgICAgIF9NX3Jlc2V0KCkgPSAwOworCisgICAgICB0eXBlZGVmIF9fZnV0dXJlX2Jhc2U6Ol9QdHI8X1Jlc3VsdDxfUmVzPj4gX1B0cl90eXBlOworICAgICAgX1B0cl90eXBlIF9NX3Jlc3VsdDsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GbiwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgX19mdXR1cmVfYmFzZTo6X1Rhc2tfc3RhdGU8X0ZuLCBfQWxsb2MsIF9SZXMoX0FyZ3MuLi4pPiBmaW5hbAorICAgIDogX19mdXR1cmVfYmFzZTo6X1Rhc2tfc3RhdGVfYmFzZTxfUmVzKF9BcmdzLi4uKT4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm4yPgorCV9UYXNrX3N0YXRlKF9GbjImJiBfX2ZuLCBjb25zdCBfQWxsb2MmIF9fYSkKKwk6IF9UYXNrX3N0YXRlX2Jhc2U8X1JlcyhfQXJncy4uLik+KF9fYSksCisJICBfTV9pbXBsKHN0ZDo6Zm9yd2FyZDxfRm4yPihfX2ZuKSwgX19hKQorICAgICAgeyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdmlydHVhbCB2b2lkCisgICAgICBfTV9ydW4oX0FyZ3MuLi4gX19hcmdzKQorICAgICAgeworCS8vIGJvdW5kIGFyZ3VtZW50cyBkZWNheSBzbyB3cmFwIGx2YWx1ZSByZWZlcmVuY2VzCisJYXV0byBfX2JvdW5kZm4gPSBzdGQ6Ol9fYmluZF9zaW1wbGUoc3RkOjpyZWYoX01faW1wbC5fTV9mbiksCisJICAgIF9TX21heWJlX3dyYXBfcmVmKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKSkuLi4pOworCWF1dG8gX19zZXR0ZXIgPSBfU190YXNrX3NldHRlcih0aGlzLT5fTV9yZXN1bHQsIHN0ZDo6bW92ZShfX2JvdW5kZm4pKTsKKwl0aGlzLT5fTV9zZXRfcmVzdWx0KHN0ZDo6bW92ZShfX3NldHRlcikpOworICAgICAgfQorCisgICAgICB2aXJ0dWFsIHNoYXJlZF9wdHI8X1Rhc2tfc3RhdGVfYmFzZTxfUmVzKF9BcmdzLi4uKT4+CisgICAgICBfTV9yZXNldCgpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisJc3RhdGljIHJlZmVyZW5jZV93cmFwcGVyPF9UcD4KKwlfU19tYXliZV93cmFwX3JlZihfVHAmIF9fdCkKKwl7IHJldHVybiBzdGQ6OnJlZihfX3QpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKwlzdGF0aWMKKwl0eXBlbmFtZSBlbmFibGVfaWY8IWlzX2x2YWx1ZV9yZWZlcmVuY2U8X1RwPjo6dmFsdWUsIF9UcD46OnR5cGUmJgorCV9TX21heWJlX3dyYXBfcmVmKF9UcCYmIF9fdCkKKwl7IHJldHVybiBzdGQ6OmZvcndhcmQ8X1RwPihfX3QpOyB9CisKKyAgICAgIHN0cnVjdCBfSW1wbCA6IF9BbGxvYworICAgICAgeworCXRlbXBsYXRlPHR5cGVuYW1lIF9GbjI+CisJICBfSW1wbChfRm4yJiYgX19mbiwgY29uc3QgX0FsbG9jJiBfX2EpCisJICA6IF9BbGxvYyhfX2EpLCBfTV9mbihzdGQ6OmZvcndhcmQ8X0ZuMj4oX19mbikpIHsgfQorCV9GbiBfTV9mbjsKKyAgICAgIH0gX01faW1wbDsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZSwgdHlwZW5hbWUgX0ZuLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICBzdGF0aWMgc2hhcmVkX3B0cjxfX2Z1dHVyZV9iYXNlOjpfVGFza19zdGF0ZV9iYXNlPF9TaWduYXR1cmU+PgorICAgICAgX19jcmVhdGVfdGFza19zdGF0ZShfRm4mJiBfX2ZuLCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgZGVjYXk8X0ZuPjo6dHlwZSBfRm4yOworICAgICAgdHlwZWRlZiBfX2Z1dHVyZV9iYXNlOjpfVGFza19zdGF0ZTxfRm4yLCBfQWxsb2MsIF9TaWduYXR1cmU+IF9TdGF0ZTsKKyAgICAgIHJldHVybiBzdGQ6OmFsbG9jYXRlX3NoYXJlZDxfU3RhdGU+KF9fYSwgc3RkOjpmb3J3YXJkPF9Gbj4oX19mbiksIF9fYSk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZuLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHNoYXJlZF9wdHI8X19mdXR1cmVfYmFzZTo6X1Rhc2tfc3RhdGVfYmFzZTxfUmVzKF9BcmdzLi4uKT4+CisgICAgX19mdXR1cmVfYmFzZTo6X1Rhc2tfc3RhdGU8X0ZuLCBfQWxsb2MsIF9SZXMoX0FyZ3MuLi4pPjo6X01fcmVzZXQoKQorICAgIHsKKyAgICAgIHJldHVybiBfX2NyZWF0ZV90YXNrX3N0YXRlPF9SZXMoX0FyZ3MuLi4pPihzdGQ6Om1vdmUoX01faW1wbC5fTV9mbiksCisJCQkJCQkgc3RhdGljX2Nhc3Q8X0FsbG9jJj4oX01faW1wbCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVGFzaywgdHlwZW5hbWUgX0ZuLCBib29sCisJICAgPSBpc19zYW1lPF9UYXNrLCB0eXBlbmFtZSBkZWNheTxfRm4+Ojp0eXBlPjo6dmFsdWU+CisgICAgc3RydWN0IF9fY29uc3RyYWluX3BrZ2R0YXNrCisgICAgeyB0eXBlZGVmIHZvaWQgX190eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UYXNrLCB0eXBlbmFtZSBfRm4+CisgICAgc3RydWN0IF9fY29uc3RyYWluX3BrZ2R0YXNrPF9UYXNrLCBfRm4sIHRydWU+CisgICAgeyB9OworCisgIC8vLyBwYWNrYWdlZF90YXNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBwYWNrYWdlZF90YXNrPF9SZXMoX0FyZ1R5cGVzLi4uKT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9fZnV0dXJlX2Jhc2U6Ol9UYXNrX3N0YXRlX2Jhc2U8X1JlcyhfQXJnVHlwZXMuLi4pPiBfU3RhdGVfdHlwZTsKKyAgICAgIHNoYXJlZF9wdHI8X1N0YXRlX3R5cGU+ICAgICAgICAgICAgICAgICAgIF9NX3N0YXRlOworCisgICAgcHVibGljOgorICAgICAgLy8gQ29uc3RydWN0aW9uIGFuZCBkZXN0cnVjdGlvbgorICAgICAgcGFja2FnZWRfdGFzaygpIG5vZXhjZXB0IHsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMDk1LiAgbWlzc2luZyBjb25zdHJ1Y3RvcnMgbmVlZGVkIGZvciB1c2VzLWFsbG9jYXRvciBjb25zdHJ1Y3Rpb24KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvY2F0b3I+CisJcGFja2FnZWRfdGFzayhhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSkgbm9leGNlcHQKKwl7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZuLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIF9fY29uc3RyYWluX3BrZ2R0YXNrPHBhY2thZ2VkX3Rhc2ssIF9Gbj46Ol9fdHlwZT4KKwlleHBsaWNpdAorCXBhY2thZ2VkX3Rhc2soX0ZuJiYgX19mbikKKwk6IHBhY2thZ2VkX3Rhc2soYWxsb2NhdG9yX2FyZywgc3RkOjphbGxvY2F0b3I8aW50PigpLAorCQkJc3RkOjpmb3J3YXJkPF9Gbj4oX19mbikpCisJeyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIwOTcuICBwYWNrYWdlZF90YXNrIGNvbnN0cnVjdG9ycyBzaG91bGQgYmUgY29uc3RyYWluZWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GbiwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIF9fY29uc3RyYWluX3BrZ2R0YXNrPHBhY2thZ2VkX3Rhc2ssIF9Gbj46Ol9fdHlwZT4KKwlleHBsaWNpdAorCXBhY2thZ2VkX3Rhc2soYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2MmIF9fYSwgX0ZuJiYgX19mbikKKwk6IF9NX3N0YXRlKF9fY3JlYXRlX3Rhc2tfc3RhdGU8X1JlcyhfQXJnVHlwZXMuLi4pPigKKwkJICAgIHN0ZDo6Zm9yd2FyZDxfRm4+KF9fZm4pLCBfX2EpKQorCXsgfQorCisgICAgICB+cGFja2FnZWRfdGFzaygpCisgICAgICB7CisgICAgICAgIGlmIChzdGF0aWNfY2FzdDxib29sPihfTV9zdGF0ZSkgJiYgIV9NX3N0YXRlLnVuaXF1ZSgpKQorCSAgX01fc3RhdGUtPl9NX2JyZWFrX3Byb21pc2Uoc3RkOjptb3ZlKF9NX3N0YXRlLT5fTV9yZXN1bHQpKTsKKyAgICAgIH0KKworICAgICAgLy8gTm8gY29weQorICAgICAgcGFja2FnZWRfdGFzayhjb25zdCBwYWNrYWdlZF90YXNrJikgPSBkZWxldGU7CisgICAgICBwYWNrYWdlZF90YXNrJiBvcGVyYXRvcj0oY29uc3QgcGFja2FnZWRfdGFzayYpID0gZGVsZXRlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2NhdG9yPgorCXBhY2thZ2VkX3Rhc2soYWxsb2NhdG9yX2FyZ190LCBjb25zdCBfQWxsb2NhdG9yJiwKKwkJICAgICAgY29uc3QgcGFja2FnZWRfdGFzayYpID0gZGVsZXRlOworCisgICAgICAvLyBNb3ZlIHN1cHBvcnQKKyAgICAgIHBhY2thZ2VkX3Rhc2socGFja2FnZWRfdGFzayYmIF9fb3RoZXIpIG5vZXhjZXB0CisgICAgICB7IHRoaXMtPnN3YXAoX19vdGhlcik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jYXRvcj4KKwlwYWNrYWdlZF90YXNrKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jYXRvciYsCisJCSAgICAgIHBhY2thZ2VkX3Rhc2smJiBfX290aGVyKSBub2V4Y2VwdAorCXsgdGhpcy0+c3dhcChfX290aGVyKTsgfQorCisgICAgICBwYWNrYWdlZF90YXNrJiBvcGVyYXRvcj0ocGFja2FnZWRfdGFzayYmIF9fb3RoZXIpIG5vZXhjZXB0CisgICAgICB7CisJcGFja2FnZWRfdGFzayhzdGQ6Om1vdmUoX19vdGhlcikpLnN3YXAoKnRoaXMpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgc3dhcChwYWNrYWdlZF90YXNrJiBfX290aGVyKSBub2V4Y2VwdAorICAgICAgeyBfTV9zdGF0ZS5zd2FwKF9fb3RoZXIuX01fc3RhdGUpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIHZhbGlkKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KF9NX3N0YXRlKTsgfQorCisgICAgICAvLyBSZXN1bHQgcmV0cmlldmFsCisgICAgICBmdXR1cmU8X1Jlcz4KKyAgICAgIGdldF9mdXR1cmUoKQorICAgICAgeyByZXR1cm4gZnV0dXJlPF9SZXM+KF9NX3N0YXRlKTsgfQorCisgICAgICAvLyBFeGVjdXRpb24KKyAgICAgIHZvaWQKKyAgICAgIG9wZXJhdG9yKCkoX0FyZ1R5cGVzLi4uIF9fYXJncykKKyAgICAgIHsKKwlfX2Z1dHVyZV9iYXNlOjpfU3RhdGVfYmFzZTo6X1NfY2hlY2soX01fc3RhdGUpOworCV9NX3N0YXRlLT5fTV9ydW4oc3RkOjpmb3J3YXJkPF9BcmdUeXBlcz4oX19hcmdzKS4uLik7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsKKwlfX2Z1dHVyZV9iYXNlOjpfU3RhdGVfYmFzZTo6X1NfY2hlY2soX01fc3RhdGUpOworCXBhY2thZ2VkX3Rhc2sgX190bXA7CisJX190bXAuX01fc3RhdGUgPSBfTV9zdGF0ZTsKKwlfTV9zdGF0ZSA9IF9NX3N0YXRlLT5fTV9yZXNldCgpOworICAgICAgfQorICAgIH07CisKKyAgLy8vIHN3YXAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChwYWNrYWdlZF90YXNrPF9SZXMoX0FyZ1R5cGVzLi4uKT4mIF9feCwKKwkgcGFja2FnZWRfdGFzazxfUmVzKF9BcmdUeXBlcy4uLik+JiBfX3kpIG5vZXhjZXB0CisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCB1c2VzX2FsbG9jYXRvcjxwYWNrYWdlZF90YXNrPF9SZXM+LCBfQWxsb2M+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Cb3VuZEZuLCB0eXBlbmFtZSBfUmVzPgorICAgIGNsYXNzIF9fZnV0dXJlX2Jhc2U6Ol9EZWZlcnJlZF9zdGF0ZSBmaW5hbAorICAgIDogcHVibGljIF9fZnV0dXJlX2Jhc2U6Ol9TdGF0ZV9iYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0CisgICAgICBfRGVmZXJyZWRfc3RhdGUoX0JvdW5kRm4mJiBfX2ZuKQorICAgICAgOiBfTV9yZXN1bHQobmV3IF9SZXN1bHQ8X1Jlcz4oKSksIF9NX2ZuKHN0ZDo6bW92ZShfX2ZuKSkKKyAgICAgIHsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX19mdXR1cmVfYmFzZTo6X1B0cjxfUmVzdWx0PF9SZXM+PiBfUHRyX3R5cGU7CisgICAgICBfUHRyX3R5cGUgX01fcmVzdWx0OworICAgICAgX0JvdW5kRm4gX01fZm47CisKKyAgICAgIHZpcnR1YWwgdm9pZAorICAgICAgX01fcnVuX2RlZmVycmVkKCkKKyAgICAgIHsKKyAgICAgICAgLy8gc2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzIHNvIGlnbm9yZSBmYWlsdXJlCisgICAgICAgIF9NX3NldF9yZXN1bHQoX1NfdGFza19zZXR0ZXIoX01fcmVzdWx0LCBfTV9mbiksIHRydWUpOworICAgICAgfQorICAgIH07CisKKyAgY2xhc3MgX19mdXR1cmVfYmFzZTo6X0FzeW5jX3N0YXRlX2NvbW1vbiA6IHB1YmxpYyBfX2Z1dHVyZV9iYXNlOjpfU3RhdGVfYmFzZQorICB7CisgIHByb3RlY3RlZDoKKyNpZmRlZiBfR0xJQkNYWF9BU1lOQ19BQklfQ09NUEFUCisgICAgfl9Bc3luY19zdGF0ZV9jb21tb24oKTsKKyNlbHNlCisgICAgfl9Bc3luY19zdGF0ZV9jb21tb24oKSA9IGRlZmF1bHQ7CisjZW5kaWYKKworICAgIC8vIEFsbG93IG5vbi10aW1lZCB3YWl0aW5nIGZ1bmN0aW9ucyB0byBibG9jayB1bnRpbCB0aGUgdGhyZWFkIGNvbXBsZXRlcywKKyAgICAvLyBhcyBpZiBqb2luZWQuCisgICAgdmlydHVhbCB2b2lkIF9NX3J1bl9kZWZlcnJlZCgpIHsgX01fam9pbigpOyB9CisKKyAgICB2b2lkIF9NX2pvaW4oKSB7IHN0ZDo6Y2FsbF9vbmNlKF9NX29uY2UsICZ0aHJlYWQ6OmpvaW4sIHJlZihfTV90aHJlYWQpKTsgfQorCisgICAgdGhyZWFkIF9NX3RocmVhZDsKKyAgICBvbmNlX2ZsYWcgX01fb25jZTsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQm91bmRGbiwgdHlwZW5hbWUgX1Jlcz4KKyAgICBjbGFzcyBfX2Z1dHVyZV9iYXNlOjpfQXN5bmNfc3RhdGVfaW1wbCBmaW5hbAorICAgIDogcHVibGljIF9fZnV0dXJlX2Jhc2U6Ol9Bc3luY19zdGF0ZV9jb21tb24KKyAgICB7CisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIF9Bc3luY19zdGF0ZV9pbXBsKF9Cb3VuZEZuJiYgX19mbikKKyAgICAgIDogX01fcmVzdWx0KG5ldyBfUmVzdWx0PF9SZXM+KCkpLCBfTV9mbihzdGQ6Om1vdmUoX19mbikpCisgICAgICB7CisJX01fdGhyZWFkID0gc3RkOjp0aHJlYWR7IFt0aGlzXSB7CisJICBfTV9zZXRfcmVzdWx0KF9TX3Rhc2tfc2V0dGVyKF9NX3Jlc3VsdCwgX01fZm4pKTsKKyAgICAgICAgfSB9OworICAgICAgfQorCisgICAgICB+X0FzeW5jX3N0YXRlX2ltcGwoKSB7IF9NX2pvaW4oKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX19mdXR1cmVfYmFzZTo6X1B0cjxfUmVzdWx0PF9SZXM+PiBfUHRyX3R5cGU7CisgICAgICBfUHRyX3R5cGUgX01fcmVzdWx0OworICAgICAgX0JvdW5kRm4gX01fZm47CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQm91bmRGbj4KKyAgICBpbmxpbmUgc3RkOjpzaGFyZWRfcHRyPF9fZnV0dXJlX2Jhc2U6Ol9TdGF0ZV9iYXNlPgorICAgIF9fZnV0dXJlX2Jhc2U6Ol9TX21ha2VfZGVmZXJyZWRfc3RhdGUoX0JvdW5kRm4mJiBfX2ZuKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfQm91bmRGbj46OnR5cGUgX19mbl90eXBlOworICAgICAgdHlwZWRlZiBfRGVmZXJyZWRfc3RhdGU8X19mbl90eXBlPiBfX3N0YXRlX3R5cGU7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxfX3N0YXRlX3R5cGU+KHN0ZDo6bW92ZShfX2ZuKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Cb3VuZEZuPgorICAgIGlubGluZSBzdGQ6OnNoYXJlZF9wdHI8X19mdXR1cmVfYmFzZTo6X1N0YXRlX2Jhc2U+CisgICAgX19mdXR1cmVfYmFzZTo6X1NfbWFrZV9hc3luY19zdGF0ZShfQm91bmRGbiYmIF9fZm4pCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9Cb3VuZEZuPjo6dHlwZSBfX2ZuX3R5cGU7CisgICAgICB0eXBlZGVmIF9Bc3luY19zdGF0ZV9pbXBsPF9fZm5fdHlwZT4gX19zdGF0ZV90eXBlOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8X19zdGF0ZV90eXBlPihzdGQ6Om1vdmUoX19mbikpOworICAgIH0KKworCisgIC8vLyBhc3luYworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm4sIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGZ1dHVyZTx0eXBlbmFtZSByZXN1bHRfb2Y8X0ZuKF9BcmdzLi4uKT46OnR5cGU+CisgICAgYXN5bmMobGF1bmNoIF9fcG9saWN5LCBfRm4mJiBfX2ZuLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHJlc3VsdF9vZjxfRm4oX0FyZ3MuLi4pPjo6dHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxfX2Z1dHVyZV9iYXNlOjpfU3RhdGVfYmFzZT4gX19zdGF0ZTsKKyAgICAgIGlmICgoX19wb2xpY3kgJiAobGF1bmNoOjphc3luY3xsYXVuY2g6OmRlZmVycmVkKSkgPT0gbGF1bmNoOjphc3luYykKKwl7CisJICBfX3N0YXRlID0gX19mdXR1cmVfYmFzZTo6X1NfbWFrZV9hc3luY19zdGF0ZShzdGQ6Ol9fYmluZF9zaW1wbGUoCisgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxfRm4+KF9fZm4pLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgX19zdGF0ZSA9IF9fZnV0dXJlX2Jhc2U6Ol9TX21ha2VfZGVmZXJyZWRfc3RhdGUoc3RkOjpfX2JpbmRfc2ltcGxlKAorICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8X0ZuPihfX2ZuKSwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSk7CisJfQorICAgICAgcmV0dXJuIGZ1dHVyZTxyZXN1bHRfdHlwZT4oX19zdGF0ZSk7CisgICAgfQorCisgIC8vLyBhc3luYywgcG90ZW50aWFsIG92ZXJsb2FkCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GbiwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgaW5saW5lIGZ1dHVyZTx0eXBlbmFtZSByZXN1bHRfb2Y8X0ZuKF9BcmdzLi4uKT46OnR5cGU+CisgICAgYXN5bmMoX0ZuJiYgX19mbiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgcmV0dXJuIGFzeW5jKGxhdW5jaDo6YXN5bmN8bGF1bmNoOjpkZWZlcnJlZCwgc3RkOjpmb3J3YXJkPF9Gbj4oX19mbiksCisJCSAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfSEFTX0dUSFJFQURTICYmIF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMQorICAgICAgIC8vICYmIEFUT01JQ19JTlRfTE9DS19GUkVFCisKKyAgLy8gQH0gZ3JvdXAgZnV0dXJlcworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vIF9HTElCQ1hYX0ZVVFVSRQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9pbml0aWFsaXplcl9saXN0IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9pbml0aWFsaXplcl9saXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OTI5OGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2luaXRpYWxpemVyX2xpc3QKQEAgLTAsMCArMSwxMDcgQEAKKy8vIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdCBzdXBwb3J0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKy8vCisvLyBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKy8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluaXRpYWxpemVyX2xpc3QKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0lOSVRJQUxJWkVSX0xJU1QKKyNkZWZpbmUgX0lOSVRJQUxJWkVSX0xJU1QKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UgLy8gQysrMHgKKworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwdXNoKGRlZmF1bHQpCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCituYW1lc3BhY2Ugc3RkCit7CisgIC8vLyBpbml0aWFsaXplcl9saXN0CisgIHRlbXBsYXRlPGNsYXNzIF9FPgorICAgIGNsYXNzIGluaXRpYWxpemVyX2xpc3QKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfRSAJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIGNvbnN0IF9FJiAJcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCBfRSYgCWNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgc2l6ZV90IAkJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBjb25zdCBfRSogCWl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBjb25zdCBfRSogCWNvbnN0X2l0ZXJhdG9yOworCisgICAgcHJpdmF0ZToKKyAgICAgIGl0ZXJhdG9yCQkJX01fYXJyYXk7CisgICAgICBzaXplX3R5cGUJCQlfTV9sZW47CisKKyAgICAgIC8vIFRoZSBjb21waWxlciBjYW4gY2FsbCBhIHByaXZhdGUgY29uc3RydWN0b3IuCisgICAgICBjb25zdGV4cHIgaW5pdGlhbGl6ZXJfbGlzdChjb25zdF9pdGVyYXRvciBfX2EsIHNpemVfdHlwZSBfX2wpCisgICAgICA6IF9NX2FycmF5KF9fYSksIF9NX2xlbihfX2wpIHsgfQorCisgICAgcHVibGljOgorICAgICAgY29uc3RleHByIGluaXRpYWxpemVyX2xpc3QoKSBub2V4Y2VwdAorICAgICAgOiBfTV9hcnJheSgwKSwgX01fbGVuKDApIHsgfQorCisgICAgICAvLyBOdW1iZXIgb2YgZWxlbWVudHMuCisgICAgICBjb25zdGV4cHIgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gX01fbGVuOyB9CisKKyAgICAgIC8vIEZpcnN0IGVsZW1lbnQuCisgICAgICBjb25zdGV4cHIgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gX01fYXJyYXk7IH0KKworICAgICAgLy8gT25lIHBhc3QgdGhlIGxhc3QgZWxlbWVudC4KKyAgICAgIGNvbnN0ZXhwciBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gYmVnaW4oKSArIHNpemUoKTsgfQorICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBhbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudCBvZgorICAgKiAgICAgICAgICB0aGUgaW5pdGlsaXplcl9saXN0LgorICAgKiAgQHBhcmFtICBfX2lscyAgSW5pdGlhbGl6ZXIgbGlzdC4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9UcD4KKyAgICBjb25zdGV4cHIgY29uc3QgX1RwKgorICAgIGJlZ2luKGluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2lscykgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2lscy5iZWdpbigpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBhbiBpdGVyYXRvciBwb2ludGluZyB0byBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50CisgICAqICAgICAgICAgIG9mIHRoZSBpbml0aWxpemVyX2xpc3QuCisgICAqICBAcGFyYW0gIF9faWxzICBJbml0aWFsaXplciBsaXN0LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgIGNvbnN0ZXhwciBjb25zdCBfVHAqCisgICAgZW5kKGluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2lscykgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX2lscy5lbmQoKTsgfQorfQorCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHBvcAorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vIF9JTklUSUFMSVpFUl9MSVNUCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2lvbWFuaXAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2lvbWFuaXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk5ZDIyMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvaW9tYW5pcApAQCAtMCwwICsxLDM3NSBAQAorLy8gU3RhbmRhcmQgc3RyZWFtIG1hbmlwdWxhdG9ycyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9pb21hbmlwCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjcuNi4zICBTdGFuZGFyZCBtYW5pcHVsYXRvcnMKKy8vCisKKyNpZm5kZWYgX0dMSUJDWFhfSU9NQU5JUAorI2RlZmluZSBfR0xJQkNYWF9JT01BTklQIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8Yml0cy9pb3NfYmFzZS5oPgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPGxvY2FsZT4KKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gWzI3LjYuM10gc3RhbmRhcmQgbWFuaXB1bGF0b3JzCisgIC8vIEFsc28gc2VlIERSIDE4My4KKworICBzdHJ1Y3QgX1Jlc2V0aW9zZmxhZ3MgeyBpb3NfYmFzZTo6Zm10ZmxhZ3MgX01fbWFzazsgfTsKKworICAvKioKKyAgICogIEBicmllZiAgTWFuaXB1bGF0b3IgZm9yIEBjIHNldGYuCisgICAqICBAcGFyYW0gIF9fbWFzayAgQSBmb3JtYXQgZmxhZ3MgbWFzay4KKyAgICoKKyAgICogIFNlbnQgdG8gYSBzdHJlYW0gb2JqZWN0LCB0aGlzIG1hbmlwdWxhdG9yIHJlc2V0cyB0aGUgc3BlY2lmaWVkIGZsYWdzLAorICAgKiAgdmlhIEBlIHN0cmVhbS5zZXRmKDAsX19tYXNrKS4KKyAgKi8KKyAgaW5saW5lIF9SZXNldGlvc2ZsYWdzIAorICByZXNldGlvc2ZsYWdzKGlvc19iYXNlOjpmbXRmbGFncyBfX21hc2spCisgIHsgcmV0dXJuIHsgX19tYXNrIH07IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIF9SZXNldGlvc2ZsYWdzIF9fZikKKyAgICB7IAorICAgICAgX19pcy5zZXRmKGlvc19iYXNlOjpmbXRmbGFncygwKSwgX19mLl9NX21hc2spOyAKKyAgICAgIHJldHVybiBfX2lzOyAKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIAorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBfUmVzZXRpb3NmbGFncyBfX2YpCisgICAgeyAKKyAgICAgIF9fb3Muc2V0Zihpb3NfYmFzZTo6Zm10ZmxhZ3MoMCksIF9fZi5fTV9tYXNrKTsgCisgICAgICByZXR1cm4gX19vczsgCisgICAgfQorCisKKyAgc3RydWN0IF9TZXRpb3NmbGFncyB7IGlvc19iYXNlOjpmbXRmbGFncyBfTV9tYXNrOyB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBNYW5pcHVsYXRvciBmb3IgQGMgc2V0Zi4KKyAgICogIEBwYXJhbSAgX19tYXNrICBBIGZvcm1hdCBmbGFncyBtYXNrLgorICAgKgorICAgKiAgU2VudCB0byBhIHN0cmVhbSBvYmplY3QsIHRoaXMgbWFuaXB1bGF0b3Igc2V0cyB0aGUgZm9ybWF0IGZsYWdzCisgICAqICB0byBAYSBfX21hc2suCisgICovCisgIGlubGluZSBfU2V0aW9zZmxhZ3MgCisgIHNldGlvc2ZsYWdzKGlvc19iYXNlOjpmbXRmbGFncyBfX21hc2spCisgIHsgcmV0dXJuIHsgX19tYXNrIH07IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIF9TZXRpb3NmbGFncyBfX2YpCisgICAgeyAKKyAgICAgIF9faXMuc2V0ZihfX2YuX01fbWFzayk7IAorICAgICAgcmV0dXJuIF9faXM7IAorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIF9TZXRpb3NmbGFncyBfX2YpCisgICAgeyAKKyAgICAgIF9fb3Muc2V0ZihfX2YuX01fbWFzayk7IAorICAgICAgcmV0dXJuIF9fb3M7IAorICAgIH0KKworCisgIHN0cnVjdCBfU2V0YmFzZSB7IGludCBfTV9iYXNlOyB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBNYW5pcHVsYXRvciBmb3IgQGMgc2V0Zi4KKyAgICogIEBwYXJhbSAgX19iYXNlICBBIG51bWVyaWMgYmFzZS4KKyAgICoKKyAgICogIFNlbnQgdG8gYSBzdHJlYW0gb2JqZWN0LCB0aGlzIG1hbmlwdWxhdG9yIGNoYW5nZXMgdGhlCisgICAqICBAYyBpb3NfYmFzZTo6YmFzZWZpZWxkIGZsYWdzIHRvIEBjIG9jdCwgQGMgZGVjLCBvciBAYyBoZXggd2hlbiBAYSBiYXNlCisgICAqICBpcyA4LCAxMCwgb3IgMTYsIGFjY29yZGluZ2x5LCBhbmQgdG8gMCBpZiBAYSBfX2Jhc2UgaXMgYW55IG90aGVyIHZhbHVlLgorICAqLworICBpbmxpbmUgX1NldGJhc2UgCisgIHNldGJhc2UoaW50IF9fYmFzZSkKKyAgeyByZXR1cm4geyBfX2Jhc2UgfTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiAKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgX1NldGJhc2UgX19mKQorICAgIHsKKyAgICAgIF9faXMuc2V0ZihfX2YuX01fYmFzZSA9PSAgOCA/IGlvc19iYXNlOjpvY3QgOiAKKwkJX19mLl9NX2Jhc2UgPT0gMTAgPyBpb3NfYmFzZTo6ZGVjIDogCisJCV9fZi5fTV9iYXNlID09IDE2ID8gaW9zX2Jhc2U6OmhleCA6IAorCQlpb3NfYmFzZTo6Zm10ZmxhZ3MoMCksIGlvc19iYXNlOjpiYXNlZmllbGQpOworICAgICAgcmV0dXJuIF9faXM7IAorICAgIH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiAKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgX1NldGJhc2UgX19mKQorICAgIHsKKyAgICAgIF9fb3Muc2V0ZihfX2YuX01fYmFzZSA9PSAgOCA/IGlvc19iYXNlOjpvY3QgOiAKKwkJX19mLl9NX2Jhc2UgPT0gMTAgPyBpb3NfYmFzZTo6ZGVjIDogCisJCV9fZi5fTV9iYXNlID09IDE2ID8gaW9zX2Jhc2U6OmhleCA6IAorCQlpb3NfYmFzZTo6Zm10ZmxhZ3MoMCksIGlvc19iYXNlOjpiYXNlZmllbGQpOworICAgICAgcmV0dXJuIF9fb3M7IAorICAgIH0KKyAgCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIHN0cnVjdCBfU2V0ZmlsbCB7IF9DaGFyVCBfTV9jOyB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBNYW5pcHVsYXRvciBmb3IgQGMgZmlsbC4KKyAgICogIEBwYXJhbSAgX19jICBUaGUgbmV3IGZpbGwgY2hhcmFjdGVyLgorICAgKgorICAgKiAgU2VudCB0byBhIHN0cmVhbSBvYmplY3QsIHRoaXMgbWFuaXB1bGF0b3IgY2FsbHMgQGMgZmlsbChfX2MpIGZvciB0aGF0CisgICAqICBvYmplY3QuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBpbmxpbmUgX1NldGZpbGw8X0NoYXJUPgorICAgIHNldGZpbGwoX0NoYXJUIF9fYykKKyAgICB7IHJldHVybiB7IF9fYyB9OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIAorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLCBfU2V0ZmlsbDxfQ2hhclQ+IF9fZikKKyAgICB7IAorICAgICAgX19pcy5maWxsKF9fZi5fTV9jKTsgCisgICAgICByZXR1cm4gX19pczsgCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiAKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgX1NldGZpbGw8X0NoYXJUPiBfX2YpCisgICAgeyAKKyAgICAgIF9fb3MuZmlsbChfX2YuX01fYyk7IAorICAgICAgcmV0dXJuIF9fb3M7IAorICAgIH0KKworCisgIHN0cnVjdCBfU2V0cHJlY2lzaW9uIHsgaW50IF9NX247IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIE1hbmlwdWxhdG9yIGZvciBAYyBwcmVjaXNpb24uCisgICAqICBAcGFyYW0gIF9fbiAgVGhlIG5ldyBwcmVjaXNpb24uCisgICAqCisgICAqICBTZW50IHRvIGEgc3RyZWFtIG9iamVjdCwgdGhpcyBtYW5pcHVsYXRvciBjYWxscyBAYyBwcmVjaXNpb24oX19uKSBmb3IKKyAgICogIHRoYXQgb2JqZWN0LgorICAqLworICBpbmxpbmUgX1NldHByZWNpc2lvbiAKKyAgc2V0cHJlY2lzaW9uKGludCBfX24pCisgIHsgcmV0dXJuIHsgX19uIH07IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIF9TZXRwcmVjaXNpb24gX19mKQorICAgIHsgCisgICAgICBfX2lzLnByZWNpc2lvbihfX2YuX01fbik7IAorICAgICAgcmV0dXJuIF9faXM7IAorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIF9TZXRwcmVjaXNpb24gX19mKQorICAgIHsgCisgICAgICBfX29zLnByZWNpc2lvbihfX2YuX01fbik7IAorICAgICAgcmV0dXJuIF9fb3M7IAorICAgIH0KKworCisgIHN0cnVjdCBfU2V0dyB7IGludCBfTV9uOyB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBNYW5pcHVsYXRvciBmb3IgQGMgd2lkdGguCisgICAqICBAcGFyYW0gIF9fbiAgVGhlIG5ldyB3aWR0aC4KKyAgICoKKyAgICogIFNlbnQgdG8gYSBzdHJlYW0gb2JqZWN0LCB0aGlzIG1hbmlwdWxhdG9yIGNhbGxzIEBjIHdpZHRoKF9fbikgZm9yCisgICAqICB0aGF0IG9iamVjdC4KKyAgKi8KKyAgaW5saW5lIF9TZXR3IAorICBzZXR3KGludCBfX24pCisgIHsgcmV0dXJuIHsgX19uIH07IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIF9TZXR3IF9fZikKKyAgICB7CisgICAgICBfX2lzLndpZHRoKF9fZi5fTV9uKTsKKyAgICAgIHJldHVybiBfX2lzOyAKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIAorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBfU2V0dyBfX2YpCisgICAgeworICAgICAgX19vcy53aWR0aChfX2YuX01fbik7CisgICAgICByZXR1cm4gX19vczsgCisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01vbmV5VD4KKyAgICBzdHJ1Y3QgX0dldF9tb25leSB7IF9Nb25leVQmIF9NX21vbjsgYm9vbCBfTV9pbnRsOyB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBFeHRlbmRlZCBtYW5pcHVsYXRvciBmb3IgZXh0cmFjdGluZyBtb25leS4KKyAgICogIEBwYXJhbSAgX19tb24gIEVpdGhlciBsb25nIGRvdWJsZSBvciBhIHNwZWNpYWxpemF0aW9uIG9mIEBjIGJhc2ljX3N0cmluZy4KKyAgICogIEBwYXJhbSAgX19pbnRsIEEgYm9vbCBpbmRpY2F0aW5nIHdoZXRoZXIgaW50ZXJuYXRpb25hbCBmb3JtYXQgCisgICAqICAgICAgICAgICAgICAgICBpcyB0byBiZSB1c2VkLgorICAgKgorICAgKiAgU2VudCB0byBhIHN0cmVhbSBvYmplY3QsIHRoaXMgbWFuaXB1bGF0b3IgZXh0cmFjdHMgQGEgX19tb24uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Nb25leVQ+CisgICAgaW5saW5lIF9HZXRfbW9uZXk8X01vbmV5VD4KKyAgICBnZXRfbW9uZXkoX01vbmV5VCYgX19tb24sIGJvb2wgX19pbnRsID0gZmFsc2UpCisgICAgeyByZXR1cm4geyBfX21vbiwgX19pbnRsIH07IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9Nb25leVQ+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLCBfR2V0X21vbmV5PF9Nb25leVQ+IF9fZikKKyAgICB7CisgICAgICB0eXBlbmFtZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlbnRyeSBfX2NlcmIoX19pcywgZmFsc2UpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIHR5cGVkZWYgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+ICAgX0l0ZXI7CisJICAgICAgdHlwZWRlZiBtb25leV9nZXQ8X0NoYXJULCBfSXRlcj4gICAgICAgICAgICAgICBfTW9uZXlHZXQ7CisKKwkgICAgICBjb25zdCBfTW9uZXlHZXQmIF9fbWcgPSB1c2VfZmFjZXQ8X01vbmV5R2V0PihfX2lzLmdldGxvYygpKTsKKwkgICAgICBfX21nLmdldChfSXRlcihfX2lzLnJkYnVmKCkpLCBfSXRlcigpLCBfX2YuX01faW50bCwKKwkJICAgICAgIF9faXMsIF9fZXJyLCBfX2YuX01fbW9uKTsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgX19pcy5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgX19pcy5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCSAgaWYgKF9fZXJyKQorCSAgICBfX2lzLnNldHN0YXRlKF9fZXJyKTsKKwl9CisgICAgICByZXR1cm4gX19pczsgCisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01vbmV5VD4KKyAgICBzdHJ1Y3QgX1B1dF9tb25leSB7IGNvbnN0IF9Nb25leVQmIF9NX21vbjsgYm9vbCBfTV9pbnRsOyB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBFeHRlbmRlZCBtYW5pcHVsYXRvciBmb3IgaW5zZXJ0aW5nIG1vbmV5LgorICAgKiAgQHBhcmFtICBfX21vbiAgRWl0aGVyIGxvbmcgZG91YmxlIG9yIGEgc3BlY2lhbGl6YXRpb24gb2YgQGMgYmFzaWNfc3RyaW5nLgorICAgKiAgQHBhcmFtICBfX2ludGwgQSBib29sIGluZGljYXRpbmcgd2hldGhlciBpbnRlcm5hdGlvbmFsIGZvcm1hdCAKKyAgICogICAgICAgICAgICAgICAgIGlzIHRvIGJlIHVzZWQuCisgICAqCisgICAqICBTZW50IHRvIGEgc3RyZWFtIG9iamVjdCwgdGhpcyBtYW5pcHVsYXRvciBpbnNlcnRzIEBhIF9fbW9uLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTW9uZXlUPgorICAgIGlubGluZSBfUHV0X21vbmV5PF9Nb25leVQ+CisgICAgcHV0X21vbmV5KGNvbnN0IF9Nb25leVQmIF9fbW9uLCBib29sIF9faW50bCA9IGZhbHNlKQorICAgIHsgcmV0dXJuIHsgX19tb24sIF9faW50bCB9OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfTW9uZXlUPgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIF9QdXRfbW9uZXk8X01vbmV5VD4gX19mKQorICAgIHsKKyAgICAgIHR5cGVuYW1lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6c2VudHJ5IF9fY2VyYihfX29zKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICB0eXBlZGVmIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiAgIF9JdGVyOworCSAgICAgIHR5cGVkZWYgbW9uZXlfcHV0PF9DaGFyVCwgX0l0ZXI+ICAgICAgICAgICAgICAgX01vbmV5UHV0OworCisJICAgICAgY29uc3QgX01vbmV5UHV0JiBfX21wID0gdXNlX2ZhY2V0PF9Nb25leVB1dD4oX19vcy5nZXRsb2MoKSk7CisJICAgICAgaWYgKF9fbXAucHV0KF9JdGVyKF9fb3MucmRidWYoKSksIF9fZi5fTV9pbnRsLCBfX29zLAorCQkJICAgX19vcy5maWxsKCksIF9fZi5fTV9tb24pLmZhaWxlZCgpKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6YmFkYml0OworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICBfX29zLl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyBfX29zLl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJICBpZiAoX19lcnIpCisJICAgIF9fb3Muc2V0c3RhdGUoX19lcnIpOworCX0KKyAgICAgIHJldHVybiBfX29zOyAKKyAgICB9CisKKyNlbmRpZgorCisgIC8vIEluaGliaXQgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgZm9yIHJlcXVpcmVkIGluc3RhbnRpYXRpb25zLAorICAvLyB3aGljaCBhcmUgZGVmaW5lZCB2aWEgZXhwbGljaXQgaW5zdGFudGlhdGlvbnMgZWxzZXdoZXJlLiAgCisgIC8vIE5COiAgVGhpcyBzeW50YXggaXMgYSBHTlUgZXh0ZW5zaW9uLgorI2lmIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURQorICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiwgX1NldGZpbGw8Y2hhcj4pOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiwgX1NldGlvc2ZsYWdzKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYsIF9SZXNldGlvc2ZsYWdzKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYsIF9TZXRiYXNlKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYsIF9TZXRwcmVjaXNpb24pOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiwgX1NldHcpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgX1NldGZpbGw8Y2hhcj4pOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgX1NldGlvc2ZsYWdzKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIG9wZXJhdG9yPj4oaXN0cmVhbSYsIF9SZXNldGlvc2ZsYWdzKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIG9wZXJhdG9yPj4oaXN0cmVhbSYsIF9TZXRiYXNlKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIG9wZXJhdG9yPj4oaXN0cmVhbSYsIF9TZXRwcmVjaXNpb24pOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgX1NldHcpOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiBvcGVyYXRvcjw8KHdvc3RyZWFtJiwgX1NldGZpbGw8d2NoYXJfdD4pOworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIG9wZXJhdG9yPDwod29zdHJlYW0mLCBfU2V0aW9zZmxhZ3MpOworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIG9wZXJhdG9yPDwod29zdHJlYW0mLCBfUmVzZXRpb3NmbGFncyk7CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgb3BlcmF0b3I8PCh3b3N0cmVhbSYsIF9TZXRiYXNlKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiBvcGVyYXRvcjw8KHdvc3RyZWFtJiwgX1NldHByZWNpc2lvbik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgb3BlcmF0b3I8PCh3b3N0cmVhbSYsIF9TZXR3KTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiBvcGVyYXRvcj4+KHdpc3RyZWFtJiwgX1NldGZpbGw8d2NoYXJfdD4pOworICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIG9wZXJhdG9yPj4od2lzdHJlYW0mLCBfU2V0aW9zZmxhZ3MpOworICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIG9wZXJhdG9yPj4od2lzdHJlYW0mLCBfUmVzZXRpb3NmbGFncyk7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgb3BlcmF0b3I+Pih3aXN0cmVhbSYsIF9TZXRiYXNlKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiBvcGVyYXRvcj4+KHdpc3RyZWFtJiwgX1NldHByZWNpc2lvbik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgb3BlcmF0b3I+Pih3aXN0cmVhbSYsIF9TZXR3KTsKKyNlbmRpZgorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9HTElCQ1hYX0lPTUFOSVAgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvaW9zIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9pb3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1NWNlOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvaW9zCkBAIC0wLDAgKzEsNDYgQEAKKy8vIElvc3RyZWFtcyBiYXNlIGNsYXNzZXMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvaW9zCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjcuNCAgSW9zdHJlYW1zIGJhc2UgY2xhc3NlcworLy8KKworI2lmbmRlZiBfR0xJQkNYWF9JT1MKKyNkZWZpbmUgX0dMSUJDWFhfSU9TIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPGV4Y2VwdGlvbj4gCQkvLyBGb3IgaW9zX2Jhc2U6OmZhaWx1cmUKKyNpbmNsdWRlIDxiaXRzL2NoYXJfdHJhaXRzLmg+IAkvLyBGb3IgY2hhcl90cmFpdHMsIHN0cmVhbW9mZiwgc3RyZWFtc2l6ZSwgZnBvcworI2luY2x1ZGUgPGJpdHMvbG9jYWxlZndkLmg+CS8vIEZvciBjbGFzcyBsb2NhbGUKKyNpbmNsdWRlIDxiaXRzL2lvc19iYXNlLmg+CS8vIEZvciBpb3NfYmFzZSBkZWNsYXJhdGlvbnMuCisjaW5jbHVkZSA8c3RyZWFtYnVmPiAKKyNpbmNsdWRlIDxiaXRzL2Jhc2ljX2lvcy5oPgorCisjZW5kaWYJLyogX0dMSUJDWFhfSU9TICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2lvc2Z3ZCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvaW9zZndkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZmUyNmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2lvc2Z3ZApAQCAtMCwwICsxLDIxMCBAQAorLy8gPGlvc2Z3ZD4gRm9yd2FyZCBkZWNsYXJhdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvaW9zZndkCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjcuMiAgRm9yd2FyZCBkZWNsYXJhdGlvbnMKKy8vCisKKyNpZm5kZWYgX0dMSUJDWFhfSU9TRldECisjZGVmaW5lIF9HTElCQ1hYX0lPU0ZXRCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9zdHJpbmdmd2QuaD4gCS8vIEZvciBzdHJpbmcgZm9yd2FyZCBkZWNsYXJhdGlvbnMuCisjaW5jbHVkZSA8Yml0cy9wb3N0eXBlcy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAZGVmZ3JvdXAgaW8gSS9PCisgICAqCisgICAqICBOZWFybHkgYWxsIG9mIHRoZSBJL08gY2xhc3NlcyBhcmUgcGFyYW1ldGVyaXplZCBvbiB0aGUgdHlwZSBvZgorICAgKiAgY2hhcmFjdGVycyB0aGV5IHJlYWQgYW5kIHdyaXRlLiAgKFRoZSBtYWpvciBleGNlcHRpb24gaXMgaW9zX2Jhc2UgYXQKKyAgICogIHRoZSB0b3Agb2YgdGhlIGhpZXJhcmNoeS4pICBUaGlzIGlzIGEgY2hhbmdlIGZyb20gcHJlLVN0YW5kYXJkCisgICAqICBzdHJlYW1zLCB3aGljaCB3ZXJlIG5vdCB0ZW1wbGF0ZXMuCisgICAqCisgICAqICBGb3IgZWFzZSBvZiB1c2UgYW5kIGNvbXBhdGliaWxpdHksIGFsbCBvZiB0aGUgYmFzaWNfKiBJL08tcmVsYXRlZAorICAgKiAgY2xhc3NlcyBhcmUgZ2l2ZW4gdHlwZWRlZiBuYW1lcyBmb3IgYm90aCBvZiB0aGUgYnVpbHRpbiBjaGFyYWN0ZXIKKyAgICogIHdpZHRocyAod2lkZSBhbmQgbmFycm93KS4gIFRoZSB0eXBlZGVmcyBhcmUgdGhlIHNhbWUgYXMgdGhlCisgICAqICBwcmUtU3RhbmRhcmQgbmFtZXMsIGZvciBleGFtcGxlOgorICAgKgorICAgKiAgQGNvZGUKKyAgICogICAgIHR5cGVkZWYgYmFzaWNfaWZzdHJlYW08Y2hhcj4gIGlmc3RyZWFtOworICAgKiAgQGVuZGNvZGUKKyAgICoKKyAgICogIEJlY2F1c2UgcHJvcGVybHkgZm9yd2FyZC1kZWNsYXJpbmcgdGhlc2UgY2xhc3NlcyBjYW4gYmUgZGlmZmljdWx0LCB5b3UKKyAgICogIHNob3VsZCBub3QgZG8gaXQgeW91cnNlbGYuICBJbnN0ZWFkLCBpbmNsdWRlIHRoZSAmbHQ7aW9zZndkJmd0OworICAgKiAgaGVhZGVyLCB3aGljaCBjb250YWlucyBvbmx5IGRlY2xhcmF0aW9ucyBvZiBhbGwgdGhlIEkvTyBjbGFzc2VzIGFzCisgICAqICB3ZWxsIGFzIHRoZSB0eXBlZGVmcy4gIFRyeWluZyB0byBmb3J3YXJkLWRlY2xhcmUgdGhlIHR5cGVkZWZzCisgICAqICB0aGVtc2VsdmVzIChlLmcuLCA8Y29kZT5jbGFzcyBvc3RyZWFtOzwvY29kZT4pIGlzIG5vdCB2YWxpZCBJU08gQysrLgorICAgKgorICAgKiAgRm9yIG1vcmUgc3BlY2lmaWMgZGVjbGFyYXRpb25zLCBzZWUKKyAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MTFjaDI0Lmh0bWwKKyAgICoKKyAgICogIEB7CisgICovCisgIGNsYXNzIGlvc19iYXNlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4gPgorICAgIGNsYXNzIGJhc2ljX2lvczsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+ID4KKyAgICBjbGFzcyBiYXNpY19zdHJlYW1idWY7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3MgYmFzaWNfaXN0cmVhbTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+ID4KKyAgICBjbGFzcyBiYXNpY19vc3RyZWFtOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4gPgorICAgIGNsYXNzIGJhc2ljX2lvc3RyZWFtOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4sCisJICAgIHR5cGVuYW1lIF9BbGxvYyA9IGFsbG9jYXRvcjxfQ2hhclQ+ID4KKyAgICBjbGFzcyBiYXNpY19zdHJpbmdidWY7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiwKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSBhbGxvY2F0b3I8X0NoYXJUPiA+CisgICAgY2xhc3MgYmFzaWNfaXN0cmluZ3N0cmVhbTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+LAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9IGFsbG9jYXRvcjxfQ2hhclQ+ID4KKyAgICBjbGFzcyBiYXNpY19vc3RyaW5nc3RyZWFtOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4sCisJICAgdHlwZW5hbWUgX0FsbG9jID0gYWxsb2NhdG9yPF9DaGFyVD4gPgorICAgIGNsYXNzIGJhc2ljX3N0cmluZ3N0cmVhbTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+ID4KKyAgICBjbGFzcyBiYXNpY19maWxlYnVmOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4gPgorICAgIGNsYXNzIGJhc2ljX2lmc3RyZWFtOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4gPgorICAgIGNsYXNzIGJhc2ljX29mc3RyZWFtOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4gPgorICAgIGNsYXNzIGJhc2ljX2ZzdHJlYW07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3MgaXN0cmVhbWJ1Zl9pdGVyYXRvcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+ID4KKyAgICBjbGFzcyBvc3RyZWFtYnVmX2l0ZXJhdG9yOworCisKKyAgLy8vIEJhc2UgY2xhc3MgZm9yIEBjIGNoYXIgc3RyZWFtcy4KKyAgdHlwZWRlZiBiYXNpY19pb3M8Y2hhcj4gCQlpb3M7IAorCisgIC8vLyBCYXNlIGNsYXNzIGZvciBAYyBjaGFyIGJ1ZmZlcnMuCisgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPGNoYXI+IAlzdHJlYW1idWY7CisKKyAgLy8vIEJhc2UgY2xhc3MgZm9yIEBjIGNoYXIgaW5wdXQgc3RyZWFtcy4KKyAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPGNoYXI+IAkJaXN0cmVhbTsKKworICAvLy8gQmFzZSBjbGFzcyBmb3IgQGMgY2hhciBvdXRwdXQgc3RyZWFtcy4KKyAgdHlwZWRlZiBiYXNpY19vc3RyZWFtPGNoYXI+IAkJb3N0cmVhbTsKKworICAvLy8gQmFzZSBjbGFzcyBmb3IgQGMgY2hhciBtaXhlZCBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMuCisgIHR5cGVkZWYgYmFzaWNfaW9zdHJlYW08Y2hhcj4gCQlpb3N0cmVhbTsKKworICAvLy8gQ2xhc3MgZm9yIEBjIGNoYXIgbWVtb3J5IGJ1ZmZlcnMuCisgIHR5cGVkZWYgYmFzaWNfc3RyaW5nYnVmPGNoYXI+IAlzdHJpbmdidWY7CisKKyAgLy8vIENsYXNzIGZvciBAYyBjaGFyIGlucHV0IG1lbW9yeSBzdHJlYW1zLgorICB0eXBlZGVmIGJhc2ljX2lzdHJpbmdzdHJlYW08Y2hhcj4gCWlzdHJpbmdzdHJlYW07CisKKyAgLy8vIENsYXNzIGZvciBAYyBjaGFyIG91dHB1dCBtZW1vcnkgc3RyZWFtcy4KKyAgdHlwZWRlZiBiYXNpY19vc3RyaW5nc3RyZWFtPGNoYXI+IAlvc3RyaW5nc3RyZWFtOworCisgIC8vLyBDbGFzcyBmb3IgQGMgY2hhciBtaXhlZCBpbnB1dCBhbmQgb3V0cHV0IG1lbW9yeSBzdHJlYW1zLgorICB0eXBlZGVmIGJhc2ljX3N0cmluZ3N0cmVhbTxjaGFyPiAJc3RyaW5nc3RyZWFtOworCisgIC8vLyBDbGFzcyBmb3IgQGMgY2hhciBmaWxlIGJ1ZmZlcnMuCisgIHR5cGVkZWYgYmFzaWNfZmlsZWJ1ZjxjaGFyPiAJCWZpbGVidWY7CisKKyAgLy8vIENsYXNzIGZvciBAYyBjaGFyIGlucHV0IGZpbGUgc3RyZWFtcy4KKyAgdHlwZWRlZiBiYXNpY19pZnN0cmVhbTxjaGFyPiAJCWlmc3RyZWFtOworCisgIC8vLyBDbGFzcyBmb3IgQGMgY2hhciBvdXRwdXQgZmlsZSBzdHJlYW1zLgorICB0eXBlZGVmIGJhc2ljX29mc3RyZWFtPGNoYXI+IAkJb2ZzdHJlYW07CisKKyAgLy8vIENsYXNzIGZvciBAYyBjaGFyIG1peGVkIGlucHV0IGFuZCBvdXRwdXQgZmlsZSBzdHJlYW1zLgorICB0eXBlZGVmIGJhc2ljX2ZzdHJlYW08Y2hhcj4gCQlmc3RyZWFtOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgLy8vIEJhc2UgY2xhc3MgZm9yIEBjIHdjaGFyX3Qgc3RyZWFtcy4KKyAgdHlwZWRlZiBiYXNpY19pb3M8d2NoYXJfdD4gCQl3aW9zOworCisgIC8vLyBCYXNlIGNsYXNzIGZvciBAYyB3Y2hhcl90IGJ1ZmZlcnMuCisgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPHdjaGFyX3Q+IAl3c3RyZWFtYnVmOworCisgIC8vLyBCYXNlIGNsYXNzIGZvciBAYyB3Y2hhcl90IGlucHV0IHN0cmVhbXMuCisgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTx3Y2hhcl90PiAJd2lzdHJlYW07CisKKyAgLy8vIEJhc2UgY2xhc3MgZm9yIEBjIHdjaGFyX3Qgb3V0cHV0IHN0cmVhbXMuCisgIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTx3Y2hhcl90PiAJd29zdHJlYW07CisKKyAgLy8vIEJhc2UgY2xhc3MgZm9yIEBjIHdjaGFyX3QgbWl4ZWQgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLgorICB0eXBlZGVmIGJhc2ljX2lvc3RyZWFtPHdjaGFyX3Q+IAl3aW9zdHJlYW07CisKKyAgLy8vIENsYXNzIGZvciBAYyB3Y2hhcl90IG1lbW9yeSBidWZmZXJzLgorICB0eXBlZGVmIGJhc2ljX3N0cmluZ2J1Zjx3Y2hhcl90PiAJd3N0cmluZ2J1ZjsKKworICAvLy8gQ2xhc3MgZm9yIEBjIHdjaGFyX3QgaW5wdXQgbWVtb3J5IHN0cmVhbXMuCisgIHR5cGVkZWYgYmFzaWNfaXN0cmluZ3N0cmVhbTx3Y2hhcl90PiAJd2lzdHJpbmdzdHJlYW07CisKKyAgLy8vIENsYXNzIGZvciBAYyB3Y2hhcl90IG91dHB1dCBtZW1vcnkgc3RyZWFtcy4KKyAgdHlwZWRlZiBiYXNpY19vc3RyaW5nc3RyZWFtPHdjaGFyX3Q+IAl3b3N0cmluZ3N0cmVhbTsKKworICAvLy8gQ2xhc3MgZm9yIEBjIHdjaGFyX3QgbWl4ZWQgaW5wdXQgYW5kIG91dHB1dCBtZW1vcnkgc3RyZWFtcy4KKyAgdHlwZWRlZiBiYXNpY19zdHJpbmdzdHJlYW08d2NoYXJfdD4gCXdzdHJpbmdzdHJlYW07CisKKyAgLy8vIENsYXNzIGZvciBAYyB3Y2hhcl90IGZpbGUgYnVmZmVycy4KKyAgdHlwZWRlZiBiYXNpY19maWxlYnVmPHdjaGFyX3Q+IAl3ZmlsZWJ1ZjsKKworICAvLy8gQ2xhc3MgZm9yIEBjIHdjaGFyX3QgaW5wdXQgZmlsZSBzdHJlYW1zLgorICB0eXBlZGVmIGJhc2ljX2lmc3RyZWFtPHdjaGFyX3Q+IAl3aWZzdHJlYW07CisKKyAgLy8vIENsYXNzIGZvciBAYyB3Y2hhcl90IG91dHB1dCBmaWxlIHN0cmVhbXMuCisgIHR5cGVkZWYgYmFzaWNfb2ZzdHJlYW08d2NoYXJfdD4gCXdvZnN0cmVhbTsKKworICAvLy8gQ2xhc3MgZm9yIEBjIHdjaGFyX3QgbWl4ZWQgaW5wdXQgYW5kIG91dHB1dCBmaWxlIHN0cmVhbXMuCisgIHR5cGVkZWYgYmFzaWNfZnN0cmVhbTx3Y2hhcl90PiAJd2ZzdHJlYW07CisjZW5kaWYKKyAgLyoqIEB9ICAqLworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9JT1NGV0QgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvaW9zdHJlYW0gYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2lvc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMzAxOWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2lvc3RyZWFtCkBAIC0wLDAgKzEsNzkgQEAKKy8vIFN0YW5kYXJkIGlvc3RyZWFtIG9iamVjdHMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvaW9zdHJlYW0KKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy4zICBTdGFuZGFyZCBpb3N0cmVhbSBvYmplY3RzCisvLworCisjaWZuZGVmIF9HTElCQ1hYX0lPU1RSRUFNCisjZGVmaW5lIF9HTElCQ1hYX0lPU1RSRUFNIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPGlzdHJlYW0+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBuYW1lIFN0YW5kYXJkIFN0cmVhbSBPYmplY3RzCisgICAqCisgICAqICBUaGUgJmx0O2lvc3RyZWFtJmd0OyBoZWFkZXIgZGVjbGFyZXMgdGhlIGVpZ2h0IDxlbT5zdGFuZGFyZCBzdHJlYW0KKyAgICogIG9iamVjdHM8L2VtPi4gIEZvciBvdGhlciBkZWNsYXJhdGlvbnMsIHNlZQorICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9pby5odG1sCisgICAqICBhbmQgdGhlIEBsaW5rIGlvc2Z3ZCBJL08gZm9yd2FyZCBkZWNsYXJhdGlvbnMgQGVuZGxpbmsKKyAgICoKKyAgICogIFRoZXkgYXJlIHJlcXVpcmVkIGJ5IGRlZmF1bHQgdG8gY29vcGVyYXRlIHdpdGggdGhlIGdsb2JhbCBDCisgICAqICBsaWJyYXJ5J3MgQGMgRklMRSBzdHJlYW1zLCBhbmQgdG8gYmUgYXZhaWxhYmxlIGR1cmluZyBwcm9ncmFtCisgICAqICBzdGFydHVwIGFuZCB0ZXJtaW5hdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgc2VjdGlvbiBvZiB0aGUKKyAgICogIG1hbnVhbCBsaW5rZWQgdG8gYWJvdmUuCisgICovCisgIC8vQHsKKyAgZXh0ZXJuIGlzdHJlYW0gY2luOwkJLy8vIExpbmtlZCB0byBzdGFuZGFyZCBpbnB1dAorICBleHRlcm4gb3N0cmVhbSBjb3V0OwkJLy8vIExpbmtlZCB0byBzdGFuZGFyZCBvdXRwdXQKKyAgZXh0ZXJuIG9zdHJlYW0gY2VycjsJCS8vLyBMaW5rZWQgdG8gc3RhbmRhcmQgZXJyb3IgKHVuYnVmZmVyZWQpCisgIGV4dGVybiBvc3RyZWFtIGNsb2c7CQkvLy8gTGlua2VkIHRvIHN0YW5kYXJkIGVycm9yIChidWZmZXJlZCkKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGV4dGVybiB3aXN0cmVhbSB3Y2luOwkJLy8vIExpbmtlZCB0byBzdGFuZGFyZCBpbnB1dAorICBleHRlcm4gd29zdHJlYW0gd2NvdXQ7CS8vLyBMaW5rZWQgdG8gc3RhbmRhcmQgb3V0cHV0CisgIGV4dGVybiB3b3N0cmVhbSB3Y2VycjsJLy8vIExpbmtlZCB0byBzdGFuZGFyZCBlcnJvciAodW5idWZmZXJlZCkKKyAgZXh0ZXJuIHdvc3RyZWFtIHdjbG9nOwkvLy8gTGlua2VkIHRvIHN0YW5kYXJkIGVycm9yIChidWZmZXJlZCkKKyNlbmRpZgorICAvL0B9CisKKyAgLy8gRm9yIGNvbnN0cnVjdGlvbiBvZiBmaWxlYnVmZmVycyBmb3IgY291dCwgY2luLCBjZXJyLCBjbG9nIGV0LiBhbC4KKyAgc3RhdGljIGlvc19iYXNlOjpJbml0IF9faW9pbml0OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9JT1NUUkVBTSAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9pc3RyZWFtIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9pc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MWJjYTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2lzdHJlYW0KQEAgLTAsMCArMSw4ODEgQEAKKy8vIElucHV0IHN0cmVhbXMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDI3LjYuMSAgSW5wdXQgc3RyZWFtcworLy8KKworLyoqIEBmaWxlIGluY2x1ZGUvaXN0cmVhbQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9JU1RSRUFNCisjZGVmaW5lIF9HTElCQ1hYX0lTVFJFQU0gMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxpb3M+CisjaW5jbHVkZSA8b3N0cmVhbT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmICBUZW1wbGF0ZSBjbGFzcyBiYXNpY19pc3RyZWFtLgorICAgKiAgQGluZ3JvdXAgaW8KKyAgICoKKyAgICogIEB0cGFyYW0gX0NoYXJUICBUeXBlIG9mIGNoYXJhY3RlciBzdHJlYW0uCisgICAqICBAdHBhcmFtIF9UcmFpdHMgIFRyYWl0cyBmb3IgY2hhcmFjdGVyIHR5cGUsIGRlZmF1bHRzIHRvCisgICAqICAgICAgICAgICAgICAgICAgIGNoYXJfdHJhaXRzPF9DaGFyVD4uCisgICAqCisgICAqICBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgaW5wdXQgc3RyZWFtcy4gIEl0IHByb3ZpZGVzIHRleHQKKyAgICogIGZvcm1hdHRpbmcgb2YgYWxsIGJ1aWx0aW4gdHlwZXMsIGFuZCBjb21tdW5pY2F0ZXMgd2l0aCBhbnkgY2xhc3MKKyAgICogIGRlcml2ZWQgZnJvbSBiYXNpY19zdHJlYW1idWYgdG8gZG8gdGhlIGFjdHVhbCBpbnB1dC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGNsYXNzIGJhc2ljX2lzdHJlYW0gOiB2aXJ0dWFsIHB1YmxpYyBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlcyAoaW5oZXJpdGVkIGZyb20gYmFzaWNfaW9zICgyNy40LjQpKToKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJIAkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSAJCWludF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb3NfdHlwZSAJCXBvc190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSAJCW9mZl90eXBlOworICAgICAgdHlwZWRlZiBfVHJhaXRzCQkJIAkJdHJhaXRzX3R5cGU7CisKKyAgICAgIC8vIE5vbi1zdGFuZGFyZCBUeXBlczoKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4gCQlfX3N0cmVhbWJ1Zl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPgkJX19pb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+CQlfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgbnVtX2dldDxfQ2hhclQsIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiA+CisgCQkJCQkJCV9fbnVtX2dldF90eXBlOworICAgICAgdHlwZWRlZiBjdHlwZTxfQ2hhclQ+CSAgICAgIAkJCV9fY3R5cGVfdHlwZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIERhdGEgTWVtYmVyczoKKyAgICAgIC8qKgorICAgICAgICogIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBleHRyYWN0ZWQgaW4gdGhlIHByZXZpb3VzIHVuZm9ybWF0dGVkCisgICAgICAgKiAgZnVuY3Rpb247IHNlZSBnY291bnQoKS4KKyAgICAgICovCisgICAgICBzdHJlYW1zaXplIAkJX01fZ2NvdW50OworCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCYXNlIGNvbnN0cnVjdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGN0b3IgaXMgYWxtb3N0IG5ldmVyIGNhbGxlZCBieSB0aGUgdXNlciBkaXJlY3RseSwgcmF0aGVyIGZyb20KKyAgICAgICAqICBkZXJpdmVkIGNsYXNzZXMnIGluaXRpYWxpemF0aW9uIGxpc3RzLCB3aGljaCBwYXNzIGEgcG9pbnRlciB0bworICAgICAgICogIHRoZWlyIG93biBzdHJlYW0gYnVmZmVyLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19pc3RyZWFtKF9fc3RyZWFtYnVmX3R5cGUqIF9fc2IpCisgICAgICA6IF9NX2djb3VudChzdHJlYW1zaXplKDApKQorICAgICAgeyB0aGlzLT5pbml0KF9fc2IpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQmFzZSBkZXN0cnVjdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGRvZXMgdmVyeSBsaXR0bGUgYXBhcnQgZnJvbSBwcm92aWRpbmcgYSB2aXJ0dWFsIGJhc2UgZHRvci4KKyAgICAgICovCisgICAgICB2aXJ0dWFsCisgICAgICB+YmFzaWNfaXN0cmVhbSgpCisgICAgICB7IF9NX2djb3VudCA9IHN0cmVhbXNpemUoMCk7IH0KKworICAgICAgLy8vIFNhZmUgcHJlZml4L3N1ZmZpeCBvcGVyYXRpb25zLgorICAgICAgY2xhc3Mgc2VudHJ5OworICAgICAgZnJpZW5kIGNsYXNzIHNlbnRyeTsKKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnRlcmZhY2UgZm9yIG1hbmlwdWxhdG9ycy4KKyAgICAgICAqCisgICAgICAgKiAgTWFuaXB1bGF0b3JzIHN1Y2ggYXMgQGMgc3RkOjp3cyBhbmQgQGMgc3RkOjpkZWMgdXNlIHRoZXNlCisgICAgICAgKiAgZnVuY3Rpb25zIGluIGNvbnN0cnVjdHMgbGlrZQorICAgICAgICogIDxjb2RlPnN0ZDo6Y2luID4+IHN0ZDo6d3M8L2NvZGU+LgorICAgICAgICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIGlvbWFuaXAgaGVhZGVyLgorICAgICAgKi8KKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgb3BlcmF0b3I+PihfX2lzdHJlYW1fdHlwZSYgKCpfX3BmKShfX2lzdHJlYW1fdHlwZSYpKQorICAgICAgeyByZXR1cm4gX19wZigqdGhpcyk7IH0KKworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcj4+KF9faW9zX3R5cGUmICgqX19wZikoX19pb3NfdHlwZSYpKQorICAgICAgeworCV9fcGYoKnRoaXMpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcj4+KGlvc19iYXNlJiAoKl9fcGYpKGlvc19iYXNlJikpCisgICAgICB7CisJX19wZigqdGhpcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAbmFtZSBFeHRyYWN0b3JzCisgICAgICAgKgorICAgICAgICogIEFsbCB0aGUgQGMgb3BlcmF0b3I+PiBmdW5jdGlvbnMgKGFrYSA8ZW0+Zm9ybWF0dGVkIGlucHV0CisgICAgICAgKiAgZnVuY3Rpb25zPC9lbT4pIGhhdmUgc29tZSBjb21tb24gYmVoYXZpb3IuICBFYWNoIHN0YXJ0cyBieQorICAgICAgICogIGNvbnN0cnVjdGluZyBhIHRlbXBvcmFyeSBvYmplY3Qgb2YgdHlwZSBzdGQ6OmJhc2ljX2lzdHJlYW06OnNlbnRyeQorICAgICAgICogIHdpdGggdGhlIHNlY29uZCBhcmd1bWVudCAobm9za2lwd3MpIHNldCB0byBmYWxzZS4gIFRoaXMgaGFzIHNldmVyYWwKKyAgICAgICAqICBlZmZlY3RzLCBjb25jbHVkaW5nIHdpdGggdGhlIHNldHRpbmcgb2YgYSBzdGF0dXMgZmxhZzsgc2VlIHRoZQorICAgICAgICogIHNlbnRyeSBkb2N1bWVudGF0aW9uIGZvciBtb3JlLgorICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgc2VudHJ5IHN0YXR1cyBpcyBnb29kLCB0aGUgZnVuY3Rpb24gdHJpZXMgdG8gZXh0cmFjdAorICAgICAgICogIHdoYXRldmVyIGRhdGEgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgICAqCisgICAgICAgKiAgSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgZXh0cmFjdGlvbiwgaW9zX2Jhc2U6OmJhZGJpdAorICAgICAgICogIHdpbGwgYmUgdHVybmVkIG9uIGluIHRoZSBzdHJlYW0ncyBlcnJvciBzdGF0ZSB3aXRob3V0IGNhdXNpbmcgYW4KKyAgICAgICAqICBpb3NfYmFzZTo6ZmFpbHVyZSB0byBiZSB0aHJvd24uICBUaGUgb3JpZ2luYWwgZXhjZXB0aW9uIHdpbGwgdGhlbgorICAgICAgICogIGJlIHJldGhyb3duLgorICAgICAgKi8KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnRlZ2VyIGFyaXRobWV0aWMgZXh0cmFjdG9ycworICAgICAgICogIEBwYXJhbSAgX19uIEEgdmFyaWFibGUgb2YgYnVpbHRpbiBpbnRlZ3JhbCB0eXBlLgorICAgICAgICogIEByZXR1cm4gIEBjICp0aGlzIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAqCisgICAgICAgKiAgVGhlc2UgZnVuY3Rpb25zIHVzZSB0aGUgc3RyZWFtJ3MgY3VycmVudCBsb2NhbGUgKHNwZWNpZmljYWxseSwgdGhlCisgICAgICAgKiAgQGMgbnVtX2dldCBmYWNldCkgdG8gcGFyc2UgdGhlIGlucHV0IGRhdGEuCisgICAgICAqLworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcj4+KGJvb2wmIF9fbikKKyAgICAgIHsgcmV0dXJuIF9NX2V4dHJhY3QoX19uKTsgfQorCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPj4oc2hvcnQmIF9fbik7CisKKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgb3BlcmF0b3I+Pih1bnNpZ25lZCBzaG9ydCYgX19uKQorICAgICAgeyByZXR1cm4gX01fZXh0cmFjdChfX24pOyB9CisKKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgb3BlcmF0b3I+PihpbnQmIF9fbik7CisKKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgb3BlcmF0b3I+Pih1bnNpZ25lZCBpbnQmIF9fbikKKyAgICAgIHsgcmV0dXJuIF9NX2V4dHJhY3QoX19uKTsgfQorCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPj4obG9uZyYgX19uKQorICAgICAgeyByZXR1cm4gX01fZXh0cmFjdChfX24pOyB9CisKKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgb3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nJiBfX24pCisgICAgICB7IHJldHVybiBfTV9leHRyYWN0KF9fbik7IH0KKworI2lmZGVmIF9HTElCQ1hYX1VTRV9MT05HX0xPTkcKKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgb3BlcmF0b3I+Pihsb25nIGxvbmcmIF9fbikKKyAgICAgIHsgcmV0dXJuIF9NX2V4dHJhY3QoX19uKTsgfQorCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPj4odW5zaWduZWQgbG9uZyBsb25nJiBfX24pCisgICAgICB7IHJldHVybiBfTV9leHRyYWN0KF9fbik7IH0KKyNlbmRpZgorICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMgZXh0cmFjdG9ycworICAgICAgICogIEBwYXJhbSAgX19mIEEgdmFyaWFibGUgb2YgYnVpbHRpbiBmbG9hdGluZyBwb2ludCB0eXBlLgorICAgICAgICogIEByZXR1cm4gIEBjICp0aGlzIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAqCisgICAgICAgKiAgVGhlc2UgZnVuY3Rpb25zIHVzZSB0aGUgc3RyZWFtJ3MgY3VycmVudCBsb2NhbGUgKHNwZWNpZmljYWxseSwgdGhlCisgICAgICAgKiAgQGMgbnVtX2dldCBmYWNldCkgdG8gcGFyc2UgdGhlIGlucHV0IGRhdGEuCisgICAgICAqLworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcj4+KGZsb2F0JiBfX2YpCisgICAgICB7IHJldHVybiBfTV9leHRyYWN0KF9fZik7IH0KKworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcj4+KGRvdWJsZSYgX19mKQorICAgICAgeyByZXR1cm4gX01fZXh0cmFjdChfX2YpOyB9CisKKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgb3BlcmF0b3I+Pihsb25nIGRvdWJsZSYgX19mKQorICAgICAgeyByZXR1cm4gX01fZXh0cmFjdChfX2YpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQmFzaWMgYXJpdGhtZXRpYyBleHRyYWN0b3JzCisgICAgICAgKiAgQHBhcmFtICBfX3AgQSB2YXJpYWJsZSBvZiBwb2ludGVyIHR5cGUuCisgICAgICAgKiAgQHJldHVybiAgQGMgKnRoaXMgaWYgc3VjY2Vzc2Z1bAorICAgICAgICoKKyAgICAgICAqICBUaGVzZSBmdW5jdGlvbnMgdXNlIHRoZSBzdHJlYW0ncyBjdXJyZW50IGxvY2FsZSAoc3BlY2lmaWNhbGx5LCB0aGUKKyAgICAgICAqICBAYyBudW1fZ2V0IGZhY2V0KSB0byBwYXJzZSB0aGUgaW5wdXQgZGF0YS4KKyAgICAgICovCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPj4odm9pZComIF9fcCkKKyAgICAgIHsgcmV0dXJuIF9NX2V4dHJhY3QoX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEV4dHJhY3RpbmcgaW50byBhbm90aGVyIHN0cmVhbWJ1Zi4KKyAgICAgICAqICBAcGFyYW0gIF9fc2IgIEEgcG9pbnRlciB0byBhIHN0cmVhbWJ1ZgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGJlaGF2ZXMgbGlrZSBvbmUgb2YgdGhlIGJhc2ljIGFyaXRobWV0aWMgZXh0cmFjdG9ycywKKyAgICAgICAqICBpbiB0aGF0IGl0IGFsc28gY29uc3RydWN0cyBhIHNlbnRyeSBvYmplY3QgYW5kIGhhcyB0aGUgc2FtZSBlcnJvcgorICAgICAgICogIGhhbmRsaW5nIGJlaGF2aW9yLgorICAgICAgICoKKyAgICAgICAqICBJZiBAcCBfX3NiIGlzIE5VTEwsIHRoZSBzdHJlYW0gd2lsbCBzZXQgZmFpbGJpdCBpbiBpdHMgZXJyb3Igc3RhdGUuCisgICAgICAgKgorICAgICAgICogIENoYXJhY3RlcnMgYXJlIGV4dHJhY3RlZCBmcm9tIHRoaXMgc3RyZWFtIGFuZCBpbnNlcnRlZCBpbnRvIHRoZQorICAgICAgICogIEBwIF9fc2Igc3RyZWFtYnVmIHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9jY3VyczoKKyAgICAgICAqCisgICAgICAgKiAgLSB0aGUgaW5wdXQgc3RyZWFtIHJlYWNoZXMgZW5kLW9mLWZpbGUsCisgICAgICAgKiAgLSBpbnNlcnRpb24gaW50byB0aGUgb3V0cHV0IGJ1ZmZlciBmYWlscyAoaW4gdGhpcyBjYXNlLCB0aGUKKyAgICAgICAqICAgIGNoYXJhY3RlciB0aGF0IHdvdWxkIGhhdmUgYmVlbiBpbnNlcnRlZCBpcyBub3QgZXh0cmFjdGVkKSwgb3IKKyAgICAgICAqICAtIGFuIGV4Y2VwdGlvbiBvY2N1cnMgKGFuZCBpbiB0aGlzIGNhc2UgaXMgY2F1Z2h0KQorICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgZnVuY3Rpb24gaW5zZXJ0cyBubyBjaGFyYWN0ZXJzLCBmYWlsYml0IGlzIHNldC4KKyAgICAgICovCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPj4oX19zdHJlYW1idWZfdHlwZSogX19zYik7CisgICAgICAvL0B9CisKKyAgICAgIC8vIFsyNy42LjEuM10gdW5mb3JtYXR0ZWQgaW5wdXQKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ2hhcmFjdGVyIGNvdW50aW5nCisgICAgICAgKiAgQHJldHVybiAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGV4dHJhY3RlZCBieSB0aGUgcHJldmlvdXMKKyAgICAgICAqICAgICAgICAgICB1bmZvcm1hdHRlZCBpbnB1dCBmdW5jdGlvbiBkaXNwYXRjaGVkIGZvciB0aGlzIHN0cmVhbS4KKyAgICAgICovCisgICAgICBzdHJlYW1zaXplCisgICAgICBnY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZ2NvdW50OyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBuYW1lIFVuZm9ybWF0dGVkIElucHV0IEZ1bmN0aW9ucworICAgICAgICoKKyAgICAgICAqICBBbGwgdGhlIHVuZm9ybWF0dGVkIGlucHV0IGZ1bmN0aW9ucyBoYXZlIHNvbWUgY29tbW9uIGJlaGF2aW9yLgorICAgICAgICogIEVhY2ggc3RhcnRzIGJ5IGNvbnN0cnVjdGluZyBhIHRlbXBvcmFyeSBvYmplY3Qgb2YgdHlwZQorICAgICAgICogIHN0ZDo6YmFzaWNfaXN0cmVhbTo6c2VudHJ5IHdpdGggdGhlIHNlY29uZCBhcmd1bWVudCAobm9za2lwd3MpCisgICAgICAgKiAgc2V0IHRvIHRydWUuICBUaGlzIGhhcyBzZXZlcmFsIGVmZmVjdHMsIGNvbmNsdWRpbmcgd2l0aCB0aGUKKyAgICAgICAqICBzZXR0aW5nIG9mIGEgc3RhdHVzIGZsYWc7IHNlZSB0aGUgc2VudHJ5IGRvY3VtZW50YXRpb24gZm9yIG1vcmUuCisgICAgICAgKgorICAgICAgICogIElmIHRoZSBzZW50cnkgc3RhdHVzIGlzIGdvb2QsIHRoZSBmdW5jdGlvbiB0cmllcyB0byBleHRyYWN0CisgICAgICAgKiAgd2hhdGV2ZXIgZGF0YSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50LgorICAgICAgICoKKyAgICAgICAqICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZXh0cmFjdGVkIGlzIHN0b3JlZCBmb3IgbGF0ZXIgcmV0cmlldmFsCisgICAgICAgKiAgYnkgZ2NvdW50KCkuCisgICAgICAgKgorICAgICAgICogIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIGV4dHJhY3Rpb24sIGlvc19iYXNlOjpiYWRiaXQKKyAgICAgICAqICB3aWxsIGJlIHR1cm5lZCBvbiBpbiB0aGUgc3RyZWFtJ3MgZXJyb3Igc3RhdGUgd2l0aG91dCBjYXVzaW5nIGFuCisgICAgICAgKiAgaW9zX2Jhc2U6OmZhaWx1cmUgdG8gYmUgdGhyb3duLiAgVGhlIG9yaWdpbmFsIGV4Y2VwdGlvbiB3aWxsIHRoZW4KKyAgICAgICAqICBiZSByZXRocm93bi4KKyAgICAgICovCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2ltcGxlIGV4dHJhY3Rpb24uCisgICAgICAgKiAgQHJldHVybiAgQSBjaGFyYWN0ZXIsIG9yIGVvZigpLgorICAgICAgICoKKyAgICAgICAqICBUcmllcyB0byBleHRyYWN0IGEgY2hhcmFjdGVyLiAgSWYgbm9uZSBhcmUgYXZhaWxhYmxlLCBzZXRzIGZhaWxiaXQKKyAgICAgICAqICBhbmQgcmV0dXJucyB0cmFpdHM6OmVvZigpLgorICAgICAgKi8KKyAgICAgIGludF90eXBlCisgICAgICBnZXQoKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTaW1wbGUgZXh0cmFjdGlvbi4KKyAgICAgICAqICBAcGFyYW0gIF9fYyAgVGhlIGNoYXJhY3RlciBpbiB3aGljaCB0byBzdG9yZSBkYXRhLgorICAgICAgICogIEByZXR1cm4gICp0aGlzCisgICAgICAgKgorICAgICAgICogIFRyaWVzIHRvIGV4dHJhY3QgYSBjaGFyYWN0ZXIgYW5kIHN0b3JlIGl0IGluIEBhIF9fYy4gIElmIG5vbmUgYXJlCisgICAgICAgKiAgYXZhaWxhYmxlLCBzZXRzIGZhaWxiaXQgYW5kIHJldHVybnMgdHJhaXRzOjplb2YoKS4KKyAgICAgICAqCisgICAgICAgKiAgQG5vdGUgIFRoaXMgZnVuY3Rpb24gaXMgbm90IG92ZXJsb2FkZWQgb24gc2lnbmVkIGNoYXIgYW5kCisgICAgICAgKiAgICAgICAgIHVuc2lnbmVkIGNoYXIuCisgICAgICAqLworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBnZXQoY2hhcl90eXBlJiBfX2MpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNpbXBsZSBtdWx0aXBsZS1jaGFyYWN0ZXIgZXh0cmFjdGlvbi4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgUG9pbnRlciB0byBhbiBhcnJheS4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBzdG9yZSBpbiBAYSBfX3MuCisgICAgICAgKiAgQHBhcmFtICBfX2RlbGltICBBICJzdG9wIiBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHJldHVybiAgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgQ2hhcmFjdGVycyBhcmUgZXh0cmFjdGVkIGFuZCBzdG9yZWQgaW50byBAYSBfX3MgdW50aWwgb25lIG9mIHRoZQorICAgICAgICogIGZvbGxvd2luZyBoYXBwZW5zOgorICAgICAgICoKKyAgICAgICAqICAtIEBjIF9fbi0xIGNoYXJhY3RlcnMgYXJlIHN0b3JlZAorICAgICAgICogIC0gdGhlIGlucHV0IHNlcXVlbmNlIHJlYWNoZXMgRU9GCisgICAgICAgKiAgLSB0aGUgbmV4dCBjaGFyYWN0ZXIgZXF1YWxzIEBhIF9fZGVsaW0sIGluIHdoaWNoIGNhc2UgdGhlIGNoYXJhY3RlcgorICAgICAgICogICAgaXMgbm90IGV4dHJhY3RlZAorICAgICAgICoKKyAgICAgICAqIElmIG5vIGNoYXJhY3RlcnMgYXJlIHN0b3JlZCwgZmFpbGJpdCBpcyBzZXQgaW4gdGhlIHN0cmVhbSdzIGVycm9yCisgICAgICAgKiBzdGF0ZS4KKyAgICAgICAqCisgICAgICAgKiBJbiBhbnkgY2FzZSwgYSBudWxsIGNoYXJhY3RlciBpcyBzdG9yZWQgaW50byB0aGUgbmV4dCBsb2NhdGlvbiBpbgorICAgICAgICogdGhlIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgVGhpcyBmdW5jdGlvbiBpcyBub3Qgb3ZlcmxvYWRlZCBvbiBzaWduZWQgY2hhciBhbmQKKyAgICAgICAqICAgICAgICAgdW5zaWduZWQgY2hhci4KKyAgICAgICovCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIGdldChjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24sIGNoYXJfdHlwZSBfX2RlbGltKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTaW1wbGUgbXVsdGlwbGUtY2hhcmFjdGVyIGV4dHJhY3Rpb24uCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFBvaW50ZXIgdG8gYW4gYXJyYXkuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc3RvcmUgaW4gQGEgcy4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIEBjIGdldChfX3MsX19uLHdpZGVuKCZhcG9zO1xcbiZhcG9zOykpLgorICAgICAgKi8KKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgZ2V0KGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmdldChfX3MsIF9fbiwgdGhpcy0+d2lkZW4oJ1xuJykpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRXh0cmFjdGlvbiBpbnRvIGFub3RoZXIgc3RyZWFtYnVmLgorICAgICAgICogIEBwYXJhbSAgX19zYiAgQSBzdHJlYW1idWYgaW4gd2hpY2ggdG8gc3RvcmUgZGF0YS4KKyAgICAgICAqICBAcGFyYW0gIF9fZGVsaW0gIEEgInN0b3AiIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBDaGFyYWN0ZXJzIGFyZSBleHRyYWN0ZWQgYW5kIGluc2VydGVkIGludG8gQGEgX19zYiB1bnRpbCBvbmUgb2YgdGhlCisgICAgICAgKiAgZm9sbG93aW5nIGhhcHBlbnM6CisgICAgICAgKgorICAgICAgICogIC0gdGhlIGlucHV0IHNlcXVlbmNlIHJlYWNoZXMgRU9GCisgICAgICAgKiAgLSBpbnNlcnRpb24gaW50byB0aGUgb3V0cHV0IGJ1ZmZlciBmYWlscyAoaW4gdGhpcyBjYXNlLCB0aGUKKyAgICAgICAqICAgIGNoYXJhY3RlciB0aGF0IHdvdWxkIGhhdmUgYmVlbiBpbnNlcnRlZCBpcyBub3QgZXh0cmFjdGVkKQorICAgICAgICogIC0gdGhlIG5leHQgY2hhcmFjdGVyIGVxdWFscyBAYSBfX2RlbGltIChpbiB0aGlzIGNhc2UsIHRoZSBjaGFyYWN0ZXIKKyAgICAgICAqICAgIGlzIG5vdCBleHRyYWN0ZWQpCisgICAgICAgKiAgLSBhbiBleGNlcHRpb24gb2NjdXJzIChhbmQgaW4gdGhpcyBjYXNlIGlzIGNhdWdodCkKKyAgICAgICAqCisgICAgICAgKiBJZiBubyBjaGFyYWN0ZXJzIGFyZSBzdG9yZWQsIGZhaWxiaXQgaXMgc2V0IGluIHRoZSBzdHJlYW0ncyBlcnJvcgorICAgICAgICogc3RhdGUuCisgICAgICAqLworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBnZXQoX19zdHJlYW1idWZfdHlwZSYgX19zYiwgY2hhcl90eXBlIF9fZGVsaW0pOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEV4dHJhY3Rpb24gaW50byBhbm90aGVyIHN0cmVhbWJ1Zi4KKyAgICAgICAqICBAcGFyYW0gIF9fc2IgIEEgc3RyZWFtYnVmIGluIHdoaWNoIHRvIHN0b3JlIGRhdGEuCisgICAgICAgKiAgQHJldHVybiAgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBAYyBnZXQoX19zYix3aWRlbigmYXBvcztcXG4mYXBvczspKS4KKyAgICAgICovCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIGdldChfX3N0cmVhbWJ1Zl90eXBlJiBfX3NiKQorICAgICAgeyByZXR1cm4gdGhpcy0+Z2V0KF9fc2IsIHRoaXMtPndpZGVuKCdcbicpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN0cmluZyBleHRyYWN0aW9uLgorICAgICAgICogIEBwYXJhbSAgX19zICBBIGNoYXJhY3RlciBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgZGF0YS4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBleHRyYWN0LgorICAgICAgICogIEBwYXJhbSAgX19kZWxpbSAgQSAic3RvcCIgY2hhcmFjdGVyLgorICAgICAgICogIEByZXR1cm4gICp0aGlzCisgICAgICAgKgorICAgICAgICogIEV4dHJhY3RzIGFuZCBzdG9yZXMgY2hhcmFjdGVycyBpbnRvIEBhIF9fcyB1bnRpbCBvbmUgb2YgdGhlCisgICAgICAgKiAgZm9sbG93aW5nIGhhcHBlbnMuICBOb3RlIHRoYXQgdGhlc2UgY3JpdGVyaWEgYXJlIHJlcXVpcmVkIHRvIGJlCisgICAgICAgKiAgdGVzdGVkIGluIHRoZSBvcmRlciBsaXN0ZWQgaGVyZSwgdG8gYWxsb3cgYW4gaW5wdXQgbGluZSB0byBleGFjdGx5CisgICAgICAgKiAgZmlsbCB0aGUgQGEgX19zIGFycmF5IHdpdGhvdXQgc2V0dGluZyBmYWlsYml0LgorICAgICAgICoKKyAgICAgICAqICAtIyB0aGUgaW5wdXQgc2VxdWVuY2UgcmVhY2hlcyBlbmQtb2YtZmlsZSwgaW4gd2hpY2ggY2FzZSBlb2ZiaXQKKyAgICAgICAqICAgICBpcyBzZXQgaW4gdGhlIHN0cmVhbSBlcnJvciBzdGF0ZQorICAgICAgICogIC0jIHRoZSBuZXh0IGNoYXJhY3RlciBlcXVhbHMgQGMgX19kZWxpbSwgaW4gd2hpY2ggY2FzZSB0aGUgY2hhcmFjdGVyCisgICAgICAgKiAgICAgaXMgZXh0cmFjdGVkIChhbmQgdGhlcmVmb3JlIGNvdW50ZWQgaW4gQGMgZ2NvdW50KCkpIGJ1dCBub3Qgc3RvcmVkCisgICAgICAgKiAgLSMgQGMgX19uLTEgY2hhcmFjdGVycyBhcmUgc3RvcmVkLCBpbiB3aGljaCBjYXNlIGZhaWxiaXQgaXMgc2V0CisgICAgICAgKiAgICAgaW4gdGhlIHN0cmVhbSBlcnJvciBzdGF0ZQorICAgICAgICoKKyAgICAgICAqICBJZiBubyBjaGFyYWN0ZXJzIGFyZSBleHRyYWN0ZWQsIGZhaWxiaXQgaXMgc2V0LiAgKEFuIGVtcHR5IGxpbmUgb2YKKyAgICAgICAqICBpbnB1dCBzaG91bGQgdGhlcmVmb3JlIG5vdCBjYXVzZSBmYWlsYml0IHRvIGJlIHNldC4pCisgICAgICAgKgorICAgICAgICogIEluIGFueSBjYXNlLCBhIG51bGwgY2hhcmFjdGVyIGlzIHN0b3JlZCBpbiB0aGUgbmV4dCBsb2NhdGlvbiBpbgorICAgICAgICogIHRoZSBhcnJheS4KKyAgICAgICovCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIGdldGxpbmUoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uLCBjaGFyX3R5cGUgX19kZWxpbSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3RyaW5nIGV4dHJhY3Rpb24uCisgICAgICAgKiAgQHBhcmFtICBfX3MgIEEgY2hhcmFjdGVyIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBkYXRhLgorICAgICAgICogIEBwYXJhbSAgX19uICBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGV4dHJhY3QuCisgICAgICAgKiAgQHJldHVybiAgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBAYyBnZXRsaW5lKF9fcyxfX24sd2lkZW4oJmFwb3M7XFxuJmFwb3M7KSkuCisgICAgICAqLworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBnZXRsaW5lKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmdldGxpbmUoX19zLCBfX24sIHRoaXMtPndpZGVuKCdcbicpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERpc2NhcmRpbmcgY2hhcmFjdGVycworICAgICAgICogIEBwYXJhbSAgX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBkaXNjYXJkLgorICAgICAgICogIEBwYXJhbSAgX19kZWxpbSAgQSAic3RvcCIgY2hhcmFjdGVyLgorICAgICAgICogIEByZXR1cm4gICp0aGlzCisgICAgICAgKgorICAgICAgICogIEV4dHJhY3RzIGNoYXJhY3RlcnMgYW5kIHRocm93cyB0aGVtIGF3YXkgdW50aWwgb25lIG9mIHRoZQorICAgICAgICogIGZvbGxvd2luZyBoYXBwZW5zOgorICAgICAgICogIC0gaWYgQGEgX19uIEBjICE9IEBjIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCksIEBhIF9fbgorICAgICAgICogICAgY2hhcmFjdGVycyBhcmUgZXh0cmFjdGVkCisgICAgICAgKiAgLSB0aGUgaW5wdXQgc2VxdWVuY2UgcmVhY2hlcyBlbmQtb2YtZmlsZQorICAgICAgICogIC0gdGhlIG5leHQgY2hhcmFjdGVyIGVxdWFscyBAYSBfX2RlbGltIChpbiB0aGlzIGNhc2UsIHRoZSBjaGFyYWN0ZXIKKyAgICAgICAqICAgIGlzIGV4dHJhY3RlZCk7IG5vdGUgdGhhdCB0aGlzIGNvbmRpdGlvbiB3aWxsIG5ldmVyIG9jY3VyIGlmCisgICAgICAgKiAgICBAYSBfX2RlbGltIGVxdWFscyBAYyB0cmFpdHM6OmVvZigpLgorICAgICAgICoKKyAgICAgICAqICBOQjogUHJvdmlkZSB0aHJlZSBvdmVybG9hZHMsIGluc3RlYWQgb2YgdGhlIHNpbmdsZSBmdW5jdGlvbgorICAgICAgICogICh3aXRoIGRlZmF1bHRzKSBtYW5kYXRlZCBieSB0aGUgU3RhbmRhcmQ6IHRoaXMgbGVhZHMgdG8gYQorICAgICAgICogIGJldHRlciBwZXJmb3JtaW5nIGltcGxlbWVudGF0aW9uLCB3aGlsZSBzdGlsbCBjb25mb3JtaW5nIHRvCisgICAgICAgKiAgdGhlIFN0YW5kYXJkLgorICAgICAgKi8KKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgaWdub3JlKHN0cmVhbXNpemUgX19uLCBpbnRfdHlwZSBfX2RlbGltKTsKKworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBpZ25vcmUoc3RyZWFtc2l6ZSBfX24pOworCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIGlnbm9yZSgpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIExvb2tpbmcgYWhlYWQgaW4gdGhlIHN0cmVhbQorICAgICAgICogIEByZXR1cm4gIFRoZSBuZXh0IGNoYXJhY3Rlciwgb3IgZW9mKCkuCisgICAgICAgKgorICAgICAgICogIElmLCBhZnRlciBjb25zdHJ1Y3RpbmcgdGhlIHNlbnRyeSBvYmplY3QsIEBjIGdvb2QoKSBpcyBmYWxzZSwKKyAgICAgICAqICByZXR1cm5zIEBjIHRyYWl0czo6ZW9mKCkuICBPdGhlcndpc2UgcmVhZHMgYnV0IGRvZXMgbm90IGV4dHJhY3QKKyAgICAgICAqICB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCisgICAgICAqLworICAgICAgaW50X3R5cGUKKyAgICAgIHBlZWsoKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBFeHRyYWN0aW9uIHdpdGhvdXQgZGVsaW1pdGVycy4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgQSBjaGFyYWN0ZXIgYXJyYXkuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc3RvcmUuCisgICAgICAgKiAgQHJldHVybiAgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgSWYgdGhlIHN0cmVhbSBzdGF0ZSBpcyBAYyBnb29kKCksIGV4dHJhY3RzIGNoYXJhY3RlcnMgYW5kIHN0b3JlcworICAgICAgICogIHRoZW0gaW50byBAYSBfX3MgdW50aWwgb25lIG9mIHRoZSBmb2xsb3dpbmcgaGFwcGVuczoKKyAgICAgICAqICAtIEBhIF9fbiBjaGFyYWN0ZXJzIGFyZSBzdG9yZWQKKyAgICAgICAqICAtIHRoZSBpbnB1dCBzZXF1ZW5jZSByZWFjaGVzIGVuZC1vZi1maWxlLCBpbiB3aGljaCBjYXNlIHRoZSBlcnJvcgorICAgICAgICogICAgc3RhdGUgaXMgc2V0IHRvIEBjIGZhaWxiaXR8ZW9mYml0LgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgVGhpcyBmdW5jdGlvbiBpcyBub3Qgb3ZlcmxvYWRlZCBvbiBzaWduZWQgY2hhciBhbmQKKyAgICAgICAqICAgICAgICAgdW5zaWduZWQgY2hhci4KKyAgICAgICovCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIHJlYWQoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBFeHRyYWN0aW9uIHVudGlsIHRoZSBidWZmZXIgaXMgZXhoYXVzdGVkLCBidXQgbm8gbW9yZS4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgQSBjaGFyYWN0ZXIgYXJyYXkuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc3RvcmUuCisgICAgICAgKiAgQHJldHVybiAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGV4dHJhY3RlZC4KKyAgICAgICAqCisgICAgICAgKiAgRXh0cmFjdHMgY2hhcmFjdGVycyBhbmQgc3RvcmVzIHRoZW0gaW50byBAYSBfX3MgZGVwZW5kaW5nIG9uIHRoZQorICAgICAgICogIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlbWFpbmluZyBpbiB0aGUgc3RyZWFtYnVmJ3MgYnVmZmVyLAorICAgICAgICogIEBjIHJkYnVmKCktPmluX2F2YWlsKCksIGNhbGxlZCBAYyBBIGhlcmU6CisgICAgICAgKiAgLSBpZiBAYyBBIEBjID09IEBjIC0xLCBzZXRzIGVvZmJpdCBhbmQgZXh0cmFjdHMgbm8gY2hhcmFjdGVycworICAgICAgICogIC0gaWYgQGMgQSBAYyA9PSBAYyAwLCBleHRyYWN0cyBubyBjaGFyYWN0ZXJzCisgICAgICAgKiAgLSBpZiBAYyBBIEBjID4gQGMgMCwgZXh0cmFjdHMgQGMgbWluKEEsbikKKyAgICAgICAqCisgICAgICAgKiAgVGhlIGdvYWwgaXMgdG8gZW1wdHkgdGhlIGN1cnJlbnQgYnVmZmVyLCBhbmQgdG8gbm90IHJlcXVlc3QgYW55CisgICAgICAgKiAgbW9yZSBmcm9tIHRoZSBleHRlcm5hbCBpbnB1dCBzZXF1ZW5jZSBjb250cm9sbGVkIGJ5IHRoZSBzdHJlYW1idWYuCisgICAgICAqLworICAgICAgc3RyZWFtc2l6ZQorICAgICAgcmVhZHNvbWUoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBVbmV4dHJhY3RpbmcgYSBzaW5nbGUgY2hhcmFjdGVyLgorICAgICAgICogIEBwYXJhbSAgX19jICBUaGUgY2hhcmFjdGVyIHRvIHB1c2ggYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICAgKiAgQHJldHVybiAgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgSWYgQGMgcmRidWYoKSBpcyBub3QgbnVsbCwgY2FsbHMgQGMgcmRidWYoKS0+c3B1dGJhY2tjKGMpLgorICAgICAgICoKKyAgICAgICAqICBJZiBAYyByZGJ1ZigpIGlzIG51bGwgb3IgaWYgQGMgc3B1dGJhY2tjKCkgZmFpbHMsIHNldHMgYmFkYml0IGluCisgICAgICAgKiAgdGhlIGVycm9yIHN0YXRlLgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgVGhpcyBmdW5jdGlvbiBmaXJzdCBjbGVhcnMgZW9mYml0LiAgU2luY2Ugbm8gY2hhcmFjdGVycworICAgICAgICogICAgICAgICBhcmUgZXh0cmFjdGVkLCB0aGUgbmV4dCBjYWxsIHRvIEBjIGdjb3VudCgpIHdpbGwgcmV0dXJuIDAsCisgICAgICAgKiAgICAgICAgIGFzIHJlcXVpcmVkIGJ5IERSIDYwLgorICAgICAgKi8KKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgcHV0YmFjayhjaGFyX3R5cGUgX19jKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBVbmV4dHJhY3RpbmcgdGhlIHByZXZpb3VzIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBJZiBAYyByZGJ1ZigpIGlzIG5vdCBudWxsLCBjYWxscyBAYyByZGJ1ZigpLT5zdW5nZXRjKGMpLgorICAgICAgICoKKyAgICAgICAqICBJZiBAYyByZGJ1ZigpIGlzIG51bGwgb3IgaWYgQGMgc3VuZ2V0YygpIGZhaWxzLCBzZXRzIGJhZGJpdCBpbgorICAgICAgICogIHRoZSBlcnJvciBzdGF0ZS4KKyAgICAgICAqCisgICAgICAgKiAgQG5vdGUgIFRoaXMgZnVuY3Rpb24gZmlyc3QgY2xlYXJzIGVvZmJpdC4gIFNpbmNlIG5vIGNoYXJhY3RlcnMKKyAgICAgICAqICAgICAgICAgYXJlIGV4dHJhY3RlZCwgdGhlIG5leHQgY2FsbCB0byBAYyBnY291bnQoKSB3aWxsIHJldHVybiAwLAorICAgICAgICogICAgICAgICBhcyByZXF1aXJlZCBieSBEUiA2MC4KKyAgICAgICovCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIHVuZ2V0KCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3luY2hyb25pemluZyB0aGUgc3RyZWFtIGJ1ZmZlci4KKyAgICAgICAqICBAcmV0dXJuICAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAgICAgICAqCisgICAgICAgKiAgSWYgQGMgcmRidWYoKSBpcyBhIG51bGwgcG9pbnRlciwgcmV0dXJucyAtMS4KKyAgICAgICAqCisgICAgICAgKiAgT3RoZXJ3aXNlLCBjYWxscyBAYyByZGJ1ZigpLT5wdWJzeW5jKCksIGFuZCBpZiB0aGF0IHJldHVybnMgLTEsCisgICAgICAgKiAgc2V0cyBiYWRiaXQgYW5kIHJldHVybnMgLTEuCisgICAgICAgKgorICAgICAgICogIE90aGVyd2lzZSwgcmV0dXJucyAwLgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjb3VudCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMKKyAgICAgICAqICAgICAgICAgZXh0cmFjdGVkLCBpZiBhbnksIGFuZCB0aGVyZWZvcmUgZG9lcyBub3QgYWZmZWN0IHRoZSBuZXh0CisgICAgICAgKiAgICAgICAgIGNhbGwgdG8gQGMgZ2NvdW50KCkuCisgICAgICAqLworICAgICAgaW50CisgICAgICBzeW5jKCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgR2V0dGluZyB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uLgorICAgICAgICogIEByZXR1cm4gIEEgZmlsZSBwb3NpdGlvbiBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIElmIEBjIGZhaWwoKSBpcyBub3QgZmFsc2UsIHJldHVybnMgQGMgcG9zX3R5cGUoLTEpIHRvIGluZGljYXRlCisgICAgICAgKiAgZmFpbHVyZS4gIE90aGVyd2lzZSByZXR1cm5zIEBjIHJkYnVmKCktPnB1YnNlZWtvZmYoMCxjdXIsaW4pLgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjb3VudCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMKKyAgICAgICAqICAgICAgICAgZXh0cmFjdGVkLCBpZiBhbnksIGFuZCB0aGVyZWZvcmUgZG9lcyBub3QgYWZmZWN0IHRoZSBuZXh0CisgICAgICAgKiAgICAgICAgIGNhbGwgdG8gQGMgZ2NvdW50KCkuICBBdCB2YXJpYW5jZSB3aXRoIHB1dGJhY2ssIHVuZ2V0IGFuZAorICAgICAgICogICAgICAgICBzZWVrZywgZW9mYml0IGlzIG5vdCBjbGVhcmVkIGZpcnN0LgorICAgICAgKi8KKyAgICAgIHBvc190eXBlCisgICAgICB0ZWxsZygpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENoYW5naW5nIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24uCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgQSBmaWxlIHBvc2l0aW9uIG9iamVjdC4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBJZiBAYyBmYWlsKCkgaXMgbm90IHRydWUsIGNhbGxzIEBjIHJkYnVmKCktPnB1YnNlZWtwb3MoX19wb3MpLiAgSWYKKyAgICAgICAqICB0aGF0IGZ1bmN0aW9uIGZhaWxzLCBzZXRzIGZhaWxiaXQuCisgICAgICAgKgorICAgICAgICogIEBub3RlICBUaGlzIGZ1bmN0aW9uIGZpcnN0IGNsZWFycyBlb2ZiaXQuICBJdCBkb2VzIG5vdCBjb3VudCB0aGUKKyAgICAgICAqICAgICAgICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZXh0cmFjdGVkLCBpZiBhbnksIGFuZCB0aGVyZWZvcmUgZG9lcworICAgICAgICogICAgICAgICBub3QgYWZmZWN0IHRoZSBuZXh0IGNhbGwgdG8gQGMgZ2NvdW50KCkuCisgICAgICAqLworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBzZWVrZyhwb3NfdHlwZSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ2hhbmdpbmcgdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbi4KKyAgICAgICAqICBAcGFyYW0gIF9fb2ZmICBBIGZpbGUgb2Zmc2V0IG9iamVjdC4KKyAgICAgICAqICBAcGFyYW0gIF9fZGlyICBUaGUgZGlyZWN0aW9uIGluIHdoaWNoIHRvIHNlZWsuCisgICAgICAgKiAgQHJldHVybiAgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgSWYgQGMgZmFpbCgpIGlzIG5vdCB0cnVlLCBjYWxscyBAYyByZGJ1ZigpLT5wdWJzZWVrb2ZmKF9fb2ZmLF9fZGlyKS4KKyAgICAgICAqICBJZiB0aGF0IGZ1bmN0aW9uIGZhaWxzLCBzZXRzIGZhaWxiaXQuCisgICAgICAgKgorICAgICAgICogIEBub3RlICBUaGlzIGZ1bmN0aW9uIGZpcnN0IGNsZWFycyBlb2ZiaXQuICBJdCBkb2VzIG5vdCBjb3VudCB0aGUKKyAgICAgICAqICAgICAgICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZXh0cmFjdGVkLCBpZiBhbnksIGFuZCB0aGVyZWZvcmUgZG9lcworICAgICAgICogICAgICAgICBub3QgYWZmZWN0IHRoZSBuZXh0IGNhbGwgdG8gQGMgZ2NvdW50KCkuCisgICAgICAqLworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBzZWVrZyhvZmZfdHlwZSwgaW9zX2Jhc2U6OnNlZWtkaXIpOworICAgICAgLy9AfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgYmFzaWNfaXN0cmVhbSgpCisgICAgICA6IF9NX2djb3VudChzdHJlYW1zaXplKDApKQorICAgICAgeyB0aGlzLT5pbml0KDApOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZVQ+CisJX19pc3RyZWFtX3R5cGUmCisJX01fZXh0cmFjdChfVmFsdWVUJiBfX3YpOworICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGRlY2xhcmF0aW9ucywgZGVmaW5lZCBpbiBzcmMvaXN0cmVhbS5jYy4KKyAgdGVtcGxhdGU8PgorICAgIGJhc2ljX2lzdHJlYW08Y2hhcj4mCisgICAgYmFzaWNfaXN0cmVhbTxjaGFyPjo6CisgICAgZ2V0bGluZShjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24sIGNoYXJfdHlwZSBfX2RlbGltKTsKKworICB0ZW1wbGF0ZTw+CisgICAgYmFzaWNfaXN0cmVhbTxjaGFyPiYKKyAgICBiYXNpY19pc3RyZWFtPGNoYXI+OjoKKyAgICBpZ25vcmUoc3RyZWFtc2l6ZSBfX24pOworCisgIHRlbXBsYXRlPD4KKyAgICBiYXNpY19pc3RyZWFtPGNoYXI+JgorICAgIGJhc2ljX2lzdHJlYW08Y2hhcj46OgorICAgIGlnbm9yZShzdHJlYW1zaXplIF9fbiwgaW50X3R5cGUgX19kZWxpbSk7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+CisgICAgYmFzaWNfaXN0cmVhbTx3Y2hhcl90PiYKKyAgICBiYXNpY19pc3RyZWFtPHdjaGFyX3Q+OjoKKyAgICBnZXRsaW5lKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbiwgY2hhcl90eXBlIF9fZGVsaW0pOworCisgIHRlbXBsYXRlPD4KKyAgICBiYXNpY19pc3RyZWFtPHdjaGFyX3Q+JgorICAgIGJhc2ljX2lzdHJlYW08d2NoYXJfdD46OgorICAgIGlnbm9yZShzdHJlYW1zaXplIF9fbik7CisKKyAgdGVtcGxhdGU8PgorICAgIGJhc2ljX2lzdHJlYW08d2NoYXJfdD4mCisgICAgYmFzaWNfaXN0cmVhbTx3Y2hhcl90Pjo6CisgICAgaWdub3JlKHN0cmVhbXNpemUgX19uLCBpbnRfdHlwZSBfX2RlbGltKTsKKyNlbmRpZgorCisgIC8qKgorICAgKiAgQGJyaWVmICBQZXJmb3JtcyBzZXR1cCB3b3JrIGZvciBpbnB1dCBzdHJlYW1zLgorICAgKgorICAgKiAgT2JqZWN0cyBvZiB0aGlzIGNsYXNzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbGwgb2YgdGhlIHN0YW5kYXJkCisgICAqICBleHRyYWN0b3JzIGFyZSBydW4uICBJdCBpcyByZXNwb25zaWJsZSBmb3IgPGVtPmV4Y2VwdGlvbi1zYWZlCisgICAqICBwcmVmaXggYW5kIHN1ZmZpeCBvcGVyYXRpb25zLDwvZW0+IGFsdGhvdWdoIG9ubHkgcHJlZml4IGFjdGlvbnMKKyAgICogIGFyZSBjdXJyZW50bHkgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgY2xhc3MgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnkKKyAgICB7CisgICAgICAvLyBEYXRhIE1lbWJlcnMuCisgICAgICBib29sIF9NX29rOworCisgICAgcHVibGljOgorICAgICAgLy8vIEVhc3kgYWNjZXNzIHRvIGRlcGVuZGVudCB0eXBlcy4KKyAgICAgIHR5cGVkZWYgX1RyYWl0cyAJCQkJCXRyYWl0c190eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiAJCV9fc3RyZWFtYnVmX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAJCV9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6X19jdHlwZV90eXBlIAlfX2N0eXBlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlCQlfX2ludF90eXBlOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRoZSBjb25zdHJ1Y3RvciBwZXJmb3JtcyBhbGwgdGhlIHdvcmsuCisgICAgICAgKiAgQHBhcmFtICBfX2lzICBUaGUgaW5wdXQgc3RyZWFtIHRvIGd1YXJkLgorICAgICAgICogIEBwYXJhbSAgX19ub3NraXB3cyAgV2hldGhlciB0byBjb25zdW1lIHdoaXRlc3BhY2Ugb3Igbm90LgorICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgc3RyZWFtIHN0YXRlIGlzIGdvb2QgKEBhIF9faXMuZ29vZCgpIGlzIHRydWUpLCB0aGVuIHRoZQorICAgICAgICogIGZvbGxvd2luZyBhY3Rpb25zIGFyZSBwZXJmb3JtZWQsIG90aGVyd2lzZSB0aGUgc2VudHJ5IHN0YXRlCisgICAgICAgKiAgaXMgZmFsc2UgKDxlbT5ub3Qgb2theTwvZW0+KSBhbmQgZmFpbGJpdCBpcyBzZXQgaW4gdGhlCisgICAgICAgKiAgc3RyZWFtIHN0YXRlLgorICAgICAgICoKKyAgICAgICAqICBUaGUgc2VudHJ5J3MgcHJlcGFyYXRvcnkgYWN0aW9ucyBhcmU6CisgICAgICAgKgorICAgICAgICogIC0jIGlmIHRoZSBzdHJlYW0gaXMgdGllZCB0byBhbiBvdXRwdXQgc3RyZWFtLCBAYyBpcy50aWUoKS0+Zmx1c2goKQorICAgICAgICogICAgIGlzIGNhbGxlZCB0byBzeW5jaHJvbml6ZSB0aGUgb3V0cHV0IHNlcXVlbmNlCisgICAgICAgKiAgLSMgaWYgQGEgX19ub3NraXB3cyBpcyBmYWxzZSwgYW5kIEBjIGlvc19iYXNlOjpza2lwd3MgaXMgc2V0IGluCisgICAgICAgKiAgICAgQGMgaXMuZmxhZ3MoKSwgdGhlIHNlbnRyeSBleHRyYWN0cyBhbmQgZGlzY2FyZHMgd2hpdGVzcGFjZQorICAgICAgICogICAgIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RyZWFtLiAgVGhlIGN1cnJlbnRseSBpbWJ1ZWQgbG9jYWxlIGlzCisgICAgICAgKiAgICAgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBlYWNoIGNoYXJhY3RlciBpcyB3aGl0ZXNwYWNlLgorICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgc3RyZWFtIHN0YXRlIGlzIHN0aWxsIGdvb2QsIHRoZW4gdGhlIHNlbnRyeSBzdGF0ZSBiZWNvbWVzCisgICAgICAgKiAgdHJ1ZSAoQGEgb2theSkuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHNlbnRyeShiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIGJvb2wgX19ub3NraXB3cyA9IGZhbHNlKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBRdWljayBzdGF0dXMgY2hlY2tpbmcuCisgICAgICAgKiAgQHJldHVybiAgVGhlIHNlbnRyeSBzdGF0ZS4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIGVhc2Ugb2YgdXNlLCBzZW50cmllcyBtYXkgYmUgY29udmVydGVkIHRvIGJvb2xlYW5zLiAgVGhlCisgICAgICAgKiAgcmV0dXJuIHZhbHVlIGlzIHRoYXQgb2YgdGhlIHNlbnRyeSBzdGF0ZSAodHJ1ZSA9PSBva2F5KS4KKyAgICAgICovCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgZXhwbGljaXQKKyNlbmRpZgorICAgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9vazsgfQorICAgIH07CisKKyAgLy9AeworICAvKioKKyAgICogIEBicmllZiAgQ2hhcmFjdGVyIGV4dHJhY3RvcnMKKyAgICogIEBwYXJhbSAgX19pbiAgQW4gaW5wdXQgc3RyZWFtLgorICAgKiAgQHBhcmFtICBfX2MgIEEgY2hhcmFjdGVyIHJlZmVyZW5jZS4KKyAgICogIEByZXR1cm4gIGluCisgICAqCisgICAqICBCZWhhdmVzIGxpa2Ugb25lIG9mIHRoZSBmb3JtYXR0ZWQgYXJpdGhtZXRpYyBleHRyYWN0b3JzIGRlc2NyaWJlZCBpbgorICAgKiAgc3RkOjpiYXNpY19pc3RyZWFtLiAgQWZ0ZXIgY29uc3RydWN0aW5nIGEgc2VudHJ5IG9iamVjdCB3aXRoIGdvb2QKKyAgICogIHN0YXR1cywgdGhpcyBmdW5jdGlvbiBleHRyYWN0cyBhIGNoYXJhY3RlciAoaWYgb25lIGlzIGF2YWlsYWJsZSkgYW5kCisgICAqICBzdG9yZXMgaXQgaW4gQGEgX19jLiAgT3RoZXJ3aXNlLCBzZXRzIGZhaWxiaXQgaW4gdGhlIGlucHV0IHN0cmVhbS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pbiwgX0NoYXJUJiBfX2MpOworCisgIHRlbXBsYXRlPGNsYXNzIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX2lzdHJlYW08Y2hhciwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX2luLCB1bnNpZ25lZCBjaGFyJiBfX2MpCisgICAgeyByZXR1cm4gKF9faW4gPj4gcmVpbnRlcnByZXRfY2FzdDxjaGFyJj4oX19jKSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19pc3RyZWFtPGNoYXIsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19pbiwgc2lnbmVkIGNoYXImIF9fYykKKyAgICB7IHJldHVybiAoX19pbiA+PiByZWludGVycHJldF9jYXN0PGNoYXImPihfX2MpKTsgfQorICAvL0B9CisKKyAgLy9AeworICAvKioKKyAgICogIEBicmllZiAgQ2hhcmFjdGVyIHN0cmluZyBleHRyYWN0b3JzCisgICAqICBAcGFyYW0gIF9faW4gIEFuIGlucHV0IHN0cmVhbS4KKyAgICogIEBwYXJhbSAgX19zICBBIHBvaW50ZXIgdG8gYSBjaGFyYWN0ZXIgYXJyYXkuCisgICAqICBAcmV0dXJuICBfX2luCisgICAqCisgICAqICBCZWhhdmVzIGxpa2Ugb25lIG9mIHRoZSBmb3JtYXR0ZWQgYXJpdGhtZXRpYyBleHRyYWN0b3JzIGRlc2NyaWJlZCBpbgorICAgKiAgc3RkOjpiYXNpY19pc3RyZWFtLiAgQWZ0ZXIgY29uc3RydWN0aW5nIGEgc2VudHJ5IG9iamVjdCB3aXRoIGdvb2QKKyAgICogIHN0YXR1cywgdGhpcyBmdW5jdGlvbiBleHRyYWN0cyB1cCB0byBAYyBuIGNoYXJhY3RlcnMgYW5kIHN0b3JlcyB0aGVtCisgICAqICBpbnRvIHRoZSBhcnJheSBzdGFydGluZyBhdCBAYSBfX3MuICBAYyBuIGlzIGRlZmluZWQgYXM6CisgICAqCisgICAqICAtIGlmIEBjIHdpZHRoKCkgaXMgZ3JlYXRlciB0aGFuIHplcm8sIEBjIG4gaXMgd2lkdGgoKSBvdGhlcndpc2UKKyAgICogIC0gQGMgbiBpcyA8ZW0+dGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgbGFyZ2VzdCBhcnJheSBvZiAqCisgICAqICAtIEBjIGNoYXJfdHlwZSB0aGF0IGNhbiBzdG9yZSBhIHRlcm1pbmF0aW5nIEBjIGVvcy48L2VtPgorICAgKiAgLSBbMjcuNi4xLjIuM10vNgorICAgKgorICAgKiAgQ2hhcmFjdGVycyBhcmUgZXh0cmFjdGVkIGFuZCBzdG9yZWQgdW50aWwgb25lIG9mIHRoZSBmb2xsb3dpbmcgaGFwcGVuczoKKyAgICogIC0gQGMgbi0xIGNoYXJhY3RlcnMgYXJlIHN0b3JlZAorICAgKiAgLSBFT0YgaXMgcmVhY2hlZAorICAgKiAgLSB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgd2hpdGVzcGFjZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbG9jYWxlCisgICAqICAtIHRoZSBuZXh0IGNoYXJhY3RlciBpcyBhIG51bGwgYnl0ZSAoaS5lLiwgQGMgY2hhclQoKSApCisgICAqCisgICAqICBAYyB3aWR0aCgwKSBpcyB0aGVuIGNhbGxlZCBmb3IgdGhlIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogIElmIG5vIGNoYXJhY3RlcnMgYXJlIGV4dHJhY3RlZCwgc2V0cyBmYWlsYml0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2luLCBfQ2hhclQqIF9fcyk7CisKKyAgLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZGVjbGFyYXRpb24sIGRlZmluZWQgaW4gc3JjL2lzdHJlYW0uY2MuCisgIHRlbXBsYXRlPD4KKyAgICBiYXNpY19pc3RyZWFtPGNoYXI+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyPiYgX19pbiwgY2hhciogX19zKTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19pc3RyZWFtPGNoYXIsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19pbiwgdW5zaWduZWQgY2hhciogX19zKQorICAgIHsgcmV0dXJuIChfX2luID4+IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KF9fcykpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfaXN0cmVhbTxjaGFyLCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9faW4sIHNpZ25lZCBjaGFyKiBfX3MpCisgICAgeyByZXR1cm4gKF9faW4gPj4gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oX19zKSk7IH0KKyAgLy9AfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBUZW1wbGF0ZSBjbGFzcyBiYXNpY19pb3N0cmVhbQorICAgKiAgQGluZ3JvdXAgaW8KKyAgICoKKyAgICogIEB0cGFyYW0gX0NoYXJUICBUeXBlIG9mIGNoYXJhY3RlciBzdHJlYW0uCisgICAqICBAdHBhcmFtIF9UcmFpdHMgIFRyYWl0cyBmb3IgY2hhcmFjdGVyIHR5cGUsIGRlZmF1bHRzIHRvCisgICAqICAgICAgICAgICAgICAgICAgIGNoYXJfdHJhaXRzPF9DaGFyVD4uCisgICAqCisgICAqICBUaGlzIGNsYXNzIG11bHRpcGx5IGluaGVyaXRzIGZyb20gdGhlIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtIGNsYXNzZXMKKyAgICogIHNpbXBseSB0byBwcm92aWRlIGEgc2luZ2xlIGludGVyZmFjZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGNsYXNzIGJhc2ljX2lvc3RyZWFtCisgICAgOiBwdWJsaWMgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+LAorICAgICAgcHVibGljIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyNzEuIGJhc2ljX2lvc3RyZWFtIG1pc3NpbmcgdHlwZWRlZnMKKyAgICAgIC8vIFR5cGVzIChpbmhlcml0ZWQpOgorICAgICAgdHlwZWRlZiBfQ2hhclQJCQkgCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIAkJaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnBvc190eXBlIAkJcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Om9mZl90eXBlIAkJb2ZmX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcmFpdHMJCQkgCQl0cmFpdHNfdHlwZTsKKworICAgICAgLy8gTm9uLXN0YW5kYXJkIFR5cGVzOgorICAgICAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4JCV9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4JCV9fb3N0cmVhbV90eXBlOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdG9yIGRvZXMgbm90aGluZy4KKyAgICAgICAqCisgICAgICAgKiAgQm90aCBvZiB0aGUgcGFyZW50IGNsYXNzZXMgYXJlIGluaXRpYWxpemVkIHdpdGggdGhlIHNhbWUKKyAgICAgICAqICBzdHJlYW1idWYgcG9pbnRlciBwYXNzZWQgdG8gdGhpcyBjb25zdHJ1Y3Rvci4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgYmFzaWNfaW9zdHJlYW0oYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc2IpCisgICAgICA6IF9faXN0cmVhbV90eXBlKF9fc2IpLCBfX29zdHJlYW1fdHlwZShfX3NiKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZXN0cnVjdG9yIGRvZXMgbm90aGluZy4KKyAgICAgICovCisgICAgICB2aXJ0dWFsCisgICAgICB+YmFzaWNfaW9zdHJlYW0oKSB7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIGJhc2ljX2lvc3RyZWFtKCkKKyAgICAgIDogX19pc3RyZWFtX3R5cGUoKSwgX19vc3RyZWFtX3R5cGUoKSB7IH0KKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBRdWljayBhbmQgZWFzeSB3YXkgdG8gZWF0IHdoaXRlc3BhY2UKKyAgICoKKyAgICogIFRoaXMgbWFuaXB1bGF0b3IgZXh0cmFjdHMgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLCBzdG9wcGluZyB3aGVuIHRoZQorICAgKiAgbmV4dCBjaGFyYWN0ZXIgaXMgbm9uLXdoaXRlc3BhY2UsIG9yIHdoZW4gdGhlIGlucHV0IHNlcXVlbmNlIGlzIGVtcHR5LgorICAgKiAgSWYgdGhlIHNlcXVlbmNlIGlzIGVtcHR5LCBAYyBlb2ZiaXQgaXMgc2V0IGluIHRoZSBzdHJlYW0sIGJ1dCBub3QKKyAgICogIEBjIGZhaWxiaXQuCisgICAqCisgICAqICBUaGUgY3VycmVudCBsb2NhbGUgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCisgICAqCisgICAqICBFeGFtcGxlOgorICAgKiAgQGNvZGUKKyAgICogICAgIE15Q2xhc3MgICBtYzsKKyAgICoKKyAgICogICAgIHN0ZDo6Y2luID4+IHN0ZDo6d3MgPj4gbWM7CisgICAqICBAZW5kY29kZQorICAgKiAgd2lsbCBza2lwIGxlYWRpbmcgd2hpdGVzcGFjZSBiZWZvcmUgY2FsbGluZyBvcGVyYXRvcj4+IG9uIGNpbiBhbmQgeW91cgorICAgKiAgb2JqZWN0LiAgTm90ZSB0aGF0IHRoZSBzYW1lIGVmZmVjdCBjYW4gYmUgYWNoaWV2ZWQgYnkgY3JlYXRpbmcgYQorICAgKiAgc3RkOjpiYXNpY19pc3RyZWFtOjpzZW50cnkgaW5zaWRlIHlvdXIgZGVmaW5pdGlvbiBvZiBvcGVyYXRvcj4+LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIHdzKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcyk7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIC8vIFsyNy43LjEuNl0gUnZhbHVlIHN0cmVhbSBleHRyYWN0aW9uCisgIC8qKgorICAgKiAgQGJyaWVmICBHZW5lcmljIGV4dHJhY3RvciBmb3IgcnZhbHVlIHN0cmVhbQorICAgKiAgQHBhcmFtICBfX2lzICBBbiBpbnB1dCBzdHJlYW0uCisgICAqICBAcGFyYW0gIF9feCAgQSByZWZlcmVuY2UgdG8gdGhlIGV4dHJhY3Rpb24gdGFyZ2V0LgorICAgKiAgQHJldHVybiAgaXMKKyAgICoKKyAgICogIFRoaXMgaXMganVzdCBhIGZvcndhcmRpbmcgZnVuY3Rpb24gdG8gYWxsb3cgZXh0cmFjdGlvbiBmcm9tCisgICAqICBydmFsdWUgc3RyZWFtcyBzaW5jZSB0aGV5IHdvbid0IGJpbmQgdG8gdGhlIGV4dHJhY3RvciBmdW5jdGlvbnMKKyAgICogIHRoYXQgdGFrZSBhbiBsdmFsdWUgcmVmZXJlbmNlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiYgX19pcywgX1RwJiBfX3gpCisgICAgeyByZXR1cm4gKF9faXMgPj4gX194KTsgfQorI2VuZGlmIC8vIEMrKzExCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2luY2x1ZGUgPGJpdHMvaXN0cmVhbS50Y2M+CisKKyNlbmRpZgkvKiBfR0xJQkNYWF9JU1RSRUFNICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2l0ZXJhdG9yIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9pdGVyYXRvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzgyZGIxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9pdGVyYXRvcgpAQCAtMCwwICsxLDcwIEBACisvLyA8aXRlcmF0b3I+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBpbmNsdWRlL2l0ZXJhdG9yCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0lURVJBVE9SCisjZGVmaW5lIF9HTElCQ1hYX0lURVJBVE9SIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9pdGVyYXRvcl9iYXNlX3R5cGVzLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3JfYmFzZV9mdW5jcy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxpc3RyZWFtPgorI2luY2x1ZGUgPGJpdHMvc3RyZWFtX2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8Yml0cy9zdHJlYW1idWZfaXRlcmF0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL3JhbmdlX2FjY2Vzcy5oPgorCisjZW5kaWYgLyogX0dMSUJDWFhfSVRFUkFUT1IgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvbGltaXRzIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9saW1pdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzN2QwYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvbGltaXRzCkBAIC0wLDAgKzEsMTc4NiBAQAorLy8gVGhlIHRlbXBsYXRlIGFuZCBpbmxpbmVzIGZvciB0aGUgbnVtZXJpY19saW1pdHMgY2xhc3Nlcy4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvbGltaXRzCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisvLyBOb3RlOiB0aGlzIGlzIG5vdCBhIGNvbmZvcm1pbmcgaW1wbGVtZW50YXRpb24uCisvLyBXcml0dGVuIGJ5IEdhYnJpZWwgRG9zIFJlaXMgPGdkckBjb2Rlc291cmNlcnkuY29tPgorCisvLworLy8gSVNPIDE0ODgyOjE5OTgKKy8vIDE4LjIuMQorLy8KKworI2lmbmRlZiBfR0xJQkNYWF9OVU1FUklDX0xJTUlUUworI2RlZmluZSBfR0xJQkNYWF9OVU1FUklDX0xJTUlUUyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKKy8vCisvLyBUaGUgbnVtZXJpY19saW1pdHM8PiB0cmFpdHMgZG9jdW1lbnQgaW1wbGVtZW50YXRpb24tZGVmaW5lZCBhc3BlY3RzCisvLyBvZiBmdW5kYW1lbnRhbCBhcml0aG1ldGljIGRhdGEgdHlwZXMgKGludGVnZXJzIGFuZCBmbG9hdGluZyBwb2ludHMpLgorLy8gRnJvbSBTdGFuZGFyZCBDKysgcG9pbnQgb2YgdmlldywgdGhlcmUgYXJlIDE0IHN1Y2ggdHlwZXM6CisvLyAgICogaW50ZWdlcnMKKy8vICAgICAgICAgYm9vbAkJCQkJCQkoMSkKKy8vICAgICAgICAgY2hhciwgc2lnbmVkIGNoYXIsIHVuc2lnbmVkIGNoYXIsIHdjaGFyX3QgICAgICAgICAgICAoNCkKKy8vICAgICAgICAgc2hvcnQsIHVuc2lnbmVkIHNob3J0CQkJCSgyKQorLy8gICAgICAgICBpbnQsIHVuc2lnbmVkCQkJCQkoMikKKy8vICAgICAgICAgbG9uZywgdW5zaWduZWQgbG9uZwkJCQkJKDIpCisvLworLy8gICAqIGZsb2F0aW5nIHBvaW50cworLy8gICAgICAgICBmbG9hdAkJCQkJCSgxKQorLy8gICAgICAgICBkb3VibGUJCQkJCQkoMSkKKy8vICAgICAgICAgbG9uZyBkb3VibGUJCQkJCQkoMSkKKy8vCisvLyBHTlUgQysrIHVuZGVyc3RhbmRzICh3aGVyZSBzdXBwb3J0ZWQgYnkgdGhlIGhvc3QgQy1saWJyYXJ5KQorLy8gICAqIGludGVnZXIKKy8vICAgICAgICAgbG9uZyBsb25nLCB1bnNpZ25lZCBsb25nIGxvbmcJCQkoMikKKy8vCisvLyB3aGljaCBicmluZ3MgdXMgdG8gMTYgZnVuZGFtZW50YWwgYXJpdGhtZXRpYyBkYXRhIHR5cGVzIGluIEdOVSBDKysuCisvLworLy8KKy8vIFNpbmNlIGEgbnVtZXJpY19saW1pdHM8PiBpcyBhIGJpdCB0cmlja3kgdG8gZ2V0IHJpZ2h0LCB3ZSByZWx5IG9uCisvLyBhbiBpbnRlcmZhY2UgY29tcG9zZWQgb2YgbWFjcm9zIHdoaWNoIHNob3VsZCBiZSBkZWZpbmVkIGluIGNvbmZpZy9vcworLy8gb3IgY29uZmlnL2NwdSB3aGVuIHRoZXkgZGlmZmVyIGZyb20gdGhlIGdlbmVyaWMgKHJlYWQgYXJiaXRyYXJ5KQorLy8gZGVmaW5pdGlvbnMgZ2l2ZW4gaGVyZS4KKy8vCisKKy8vIFRoZXNlIHZhbHVlcyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiB0aGUgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gZmlsZS4KKy8vIFRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgYXBwcm9wcmlhdGUgZm9yIG1hbnkgMzItYml0IHRhcmdldHMuCisKKy8vIEdDQyBvbmx5IGludHJpbnNpY2FsbHkgc3VwcG9ydHMgbW9kdWxvIGludGVncmFsIHR5cGVzLiAgVGhlIG9ubHkgcmVtYWluaW5nCisvLyBpbnRlZ3JhbCBleGNlcHRpb25hbCB2YWx1ZXMgaXMgZGl2aXNpb24gYnkgemVyby4gIE9ubHkgdGFyZ2V0cyB0aGF0IGRvIG5vdAorLy8gc2lnbmFsIGRpdmlzaW9uIGJ5IHplcm8gaW4gc29tZSAiaGFyZCB0byBpZ25vcmUiIHdheSBzaG91bGQgdXNlIGZhbHNlLgorI2lmbmRlZiBfX2dsaWJjeHhfaW50ZWdyYWxfdHJhcHMKKyMgZGVmaW5lIF9fZ2xpYmN4eF9pbnRlZ3JhbF90cmFwcyB0cnVlCisjZW5kaWYKKworLy8gZmxvYXQKKy8vCisKKy8vIERlZmF1bHQgdmFsdWVzLiAgU2hvdWxkIGJlIG92ZXJyaWRkZW4gaW4gY29uZmlndXJhdGlvbiBmaWxlcyBpZiBuZWNlc3NhcnkuCisKKyNpZm5kZWYgX19nbGliY3h4X2Zsb2F0X2hhc19kZW5vcm1fbG9zcworIyAgZGVmaW5lIF9fZ2xpYmN4eF9mbG9hdF9oYXNfZGVub3JtX2xvc3MgZmFsc2UKKyNlbmRpZgorI2lmbmRlZiBfX2dsaWJjeHhfZmxvYXRfdHJhcHMKKyMgIGRlZmluZSBfX2dsaWJjeHhfZmxvYXRfdHJhcHMgZmFsc2UKKyNlbmRpZgorI2lmbmRlZiBfX2dsaWJjeHhfZmxvYXRfdGlueW5lc3NfYmVmb3JlCisjICBkZWZpbmUgX19nbGliY3h4X2Zsb2F0X3RpbnluZXNzX2JlZm9yZSBmYWxzZQorI2VuZGlmCisKKy8vIGRvdWJsZQorCisvLyBEZWZhdWx0IHZhbHVlcy4gIFNob3VsZCBiZSBvdmVycmlkZGVuIGluIGNvbmZpZ3VyYXRpb24gZmlsZXMgaWYgbmVjZXNzYXJ5LgorCisjaWZuZGVmIF9fZ2xpYmN4eF9kb3VibGVfaGFzX2Rlbm9ybV9sb3NzCisjICBkZWZpbmUgX19nbGliY3h4X2RvdWJsZV9oYXNfZGVub3JtX2xvc3MgZmFsc2UKKyNlbmRpZgorI2lmbmRlZiBfX2dsaWJjeHhfZG91YmxlX3RyYXBzCisjICBkZWZpbmUgX19nbGliY3h4X2RvdWJsZV90cmFwcyBmYWxzZQorI2VuZGlmCisjaWZuZGVmIF9fZ2xpYmN4eF9kb3VibGVfdGlueW5lc3NfYmVmb3JlCisjICBkZWZpbmUgX19nbGliY3h4X2RvdWJsZV90aW55bmVzc19iZWZvcmUgZmFsc2UKKyNlbmRpZgorCisvLyBsb25nIGRvdWJsZQorCisvLyBEZWZhdWx0IHZhbHVlcy4gIFNob3VsZCBiZSBvdmVycmlkZGVuIGluIGNvbmZpZ3VyYXRpb24gZmlsZXMgaWYgbmVjZXNzYXJ5LgorCisjaWZuZGVmIF9fZ2xpYmN4eF9sb25nX2RvdWJsZV9oYXNfZGVub3JtX2xvc3MKKyMgIGRlZmluZSBfX2dsaWJjeHhfbG9uZ19kb3VibGVfaGFzX2Rlbm9ybV9sb3NzIGZhbHNlCisjZW5kaWYKKyNpZm5kZWYgX19nbGliY3h4X2xvbmdfZG91YmxlX3RyYXBzCisjICBkZWZpbmUgX19nbGliY3h4X2xvbmdfZG91YmxlX3RyYXBzIGZhbHNlCisjZW5kaWYKKyNpZm5kZWYgX19nbGliY3h4X2xvbmdfZG91YmxlX3RpbnluZXNzX2JlZm9yZQorIyAgZGVmaW5lIF9fZ2xpYmN4eF9sb25nX2RvdWJsZV90aW55bmVzc19iZWZvcmUgZmFsc2UKKyNlbmRpZgorCisvLyBZb3Ugc2hvdWxkIG5vdCBuZWVkIHRvIGRlZmluZSBhbnkgbWFjcm9zIGJlbG93IHRoaXMgcG9pbnQuCisKKyNkZWZpbmUgX19nbGliY3h4X3NpZ25lZChUKQkoKFQpKC0xKSA8IDApCisKKyNkZWZpbmUgX19nbGliY3h4X21pbihUKSBcCisgIChfX2dsaWJjeHhfc2lnbmVkIChUKSA/IC1fX2dsaWJjeHhfbWF4IChUKSAtIDEgOiAoVCkwKQorCisjZGVmaW5lIF9fZ2xpYmN4eF9tYXgoVCkgXAorICAoX19nbGliY3h4X3NpZ25lZCAoVCkgPyBcCisgICAoKCgoKFQpMSA8PCAoX19nbGliY3h4X2RpZ2l0cyAoVCkgLSAxKSkgLSAxKSA8PCAxKSArIDEpIDogfihUKTApCisKKyNkZWZpbmUgX19nbGliY3h4X2RpZ2l0cyhUKSBcCisgIChzaXplb2YoVCkgKiBfX0NIQVJfQklUX18gLSBfX2dsaWJjeHhfc2lnbmVkIChUKSkKKworLy8gVGhlIGZyYWN0aW9uIDY0My8yMTM2IGFwcHJveGltYXRlcyBsb2cxMCgyKSB0byA3IHNpZ25pZmljYW50IGRpZ2l0cy4KKyNkZWZpbmUgX19nbGliY3h4X2RpZ2l0czEwKFQpIFwKKyAgKF9fZ2xpYmN4eF9kaWdpdHMgKFQpICogNjQzTCAvIDIxMzYpCisKKyNkZWZpbmUgX19nbGliY3h4X21heF9kaWdpdHMxMChUKSBcCisgICgyICsgKFQpICogNjQzTCAvIDIxMzYpCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBicmllZiBEZXNjcmliZXMgdGhlIHJvdW5kaW5nIHN0eWxlIGZvciBmbG9hdGluZy1wb2ludCB0eXBlcy4KKyAgICoKKyAgICogIFRoaXMgaXMgdXNlZCBpbiB0aGUgc3RkOjpudW1lcmljX2xpbWl0cyBjbGFzcy4KKyAgKi8KKyAgZW51bSBmbG9hdF9yb3VuZF9zdHlsZQorICB7CisgICAgcm91bmRfaW5kZXRlcm1pbmF0ZSAgICAgICA9IC0xLCAgICAvLy8gSW50ZXJtZWRpYXRlLgorICAgIHJvdW5kX3Rvd2FyZF96ZXJvICAgICAgICAgPSAwLCAgICAgLy8vIFRvIHplcm8uCisgICAgcm91bmRfdG9fbmVhcmVzdCAgICAgICAgICA9IDEsICAgICAvLy8gVG8gdGhlIG5lYXJlc3QgcmVwcmVzZW50YWJsZSB2YWx1ZS4KKyAgICByb3VuZF90b3dhcmRfaW5maW5pdHkgICAgID0gMiwgICAgIC8vLyBUbyBpbmZpbml0eS4KKyAgICByb3VuZF90b3dhcmRfbmVnX2luZmluaXR5ID0gMyAgICAgIC8vLyBUbyBuZWdhdGl2ZSBpbmZpbml0eS4KKyAgfTsKKworICAvKioKKyAgICogIEBicmllZiBEZXNjcmliZXMgdGhlIGRlbm9ybWFsaXphdGlvbiBmb3IgZmxvYXRpbmctcG9pbnQgdHlwZXMuCisgICAqCisgICAqICBUaGVzZSB2YWx1ZXMgcmVwcmVzZW50IHRoZSBwcmVzZW5jZSBvciBhYnNlbmNlIG9mIGEgdmFyaWFibGUgbnVtYmVyCisgICAqICBvZiBleHBvbmVudCBiaXRzLiAgVGhpcyB0eXBlIGlzIHVzZWQgaW4gdGhlIHN0ZDo6bnVtZXJpY19saW1pdHMgY2xhc3MuCisgICovCisgIGVudW0gZmxvYXRfZGVub3JtX3N0eWxlCisgIHsKKyAgICAvLy8gSW5kZXRlcm1pbmF0ZSBhdCBjb21waWxlIHRpbWUgd2hldGhlciBkZW5vcm1hbGl6ZWQgdmFsdWVzIGFyZSBhbGxvd2VkLgorICAgIGRlbm9ybV9pbmRldGVybWluYXRlID0gLTEsCisgICAgLy8vIFRoZSB0eXBlIGRvZXMgbm90IGFsbG93IGRlbm9ybWFsaXplZCB2YWx1ZXMuCisgICAgZGVub3JtX2Fic2VudCAgICAgICAgPSAwLAorICAgIC8vLyBUaGUgdHlwZSBhbGxvd3MgZGVub3JtYWxpemVkIHZhbHVlcy4KKyAgICBkZW5vcm1fcHJlc2VudCAgICAgICA9IDEKKyAgfTsKKworICAvKioKKyAgICogIEBicmllZiBQYXJ0IG9mIHN0ZDo6bnVtZXJpY19saW1pdHMuCisgICAqCisgICAqICBUaGUgQGMgc3RhdGljIEBjIGNvbnN0IG1lbWJlcnMgYXJlIHVzYWJsZSBhcyBpbnRlZ3JhbCBjb25zdGFudAorICAgKiAgZXhwcmVzc2lvbnMuCisgICAqCisgICAqICBAbm90ZSBUaGlzIGlzIGEgc2VwYXJhdGUgY2xhc3MgZm9yIHB1cnBvc2VzIG9mIGVmZmljaWVuY3k7IHlvdQorICAgKiAgICAgICAgc2hvdWxkIG9ubHkgYWNjZXNzIHRoZXNlIG1lbWJlcnMgYXMgcGFydCBvZiBhbiBpbnN0YW50aWF0aW9uCisgICAqICAgICAgICBvZiB0aGUgc3RkOjpudW1lcmljX2xpbWl0cyBjbGFzcy4KKyAgKi8KKyAgc3RydWN0IF9fbnVtZXJpY19saW1pdHNfYmFzZQorICB7CisgICAgLyoqIFRoaXMgd2lsbCBiZSB0cnVlIGZvciBhbGwgZnVuZGFtZW50YWwgdHlwZXMgKHdoaWNoIGhhdmUKKwlzcGVjaWFsaXphdGlvbnMpLCBhbmQgZmFsc2UgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4gICovCisgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zcGVjaWFsaXplZCA9IGZhbHNlOworCisgICAgLyoqIFRoZSBudW1iZXIgb2YgQGMgcmFkaXggZGlnaXRzIHRoYXQgYmUgcmVwcmVzZW50ZWQgd2l0aG91dCBjaGFuZ2U6ICBmb3IKKwlpbnRlZ2VyIHR5cGVzLCB0aGUgbnVtYmVyIG9mIG5vbi1zaWduIGJpdHMgaW4gdGhlIG1hbnRpc3NhOyBmb3IKKwlmbG9hdGluZyB0eXBlcywgdGhlIG51bWJlciBvZiBAYyByYWRpeCBkaWdpdHMgaW4gdGhlIG1hbnRpc3NhLiAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzID0gMDsKKworICAgIC8qKiBUaGUgbnVtYmVyIG9mIGJhc2UgMTAgZGlnaXRzIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIHdpdGhvdXQgY2hhbmdlLiAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMxMCA9IDA7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgLyoqIFRoZSBudW1iZXIgb2YgYmFzZSAxMCBkaWdpdHMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgdmFsdWVzIHdoaWNoCisJZGlmZmVyIGFyZSBhbHdheXMgZGlmZmVyZW50aWF0ZWQuICAqLworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisjZW5kaWYKKworICAgIC8qKiBUcnVlIGlmIHRoZSB0eXBlIGlzIHNpZ25lZC4gICovCisgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zaWduZWQgPSBmYWxzZTsKKworICAgIC8qKiBUcnVlIGlmIHRoZSB0eXBlIGlzIGludGVnZXIuICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IGZhbHNlOworCisgICAgLyoqIFRydWUgaWYgdGhlIHR5cGUgdXNlcyBhbiBleGFjdCByZXByZXNlbnRhdGlvbi4gQWxsIGludGVnZXIgdHlwZXMgYXJlCisJZXhhY3QsIGJ1dCBub3QgYWxsIGV4YWN0IHR5cGVzIGFyZSBpbnRlZ2VyLiAgRm9yIGV4YW1wbGUsIHJhdGlvbmFsIGFuZAorCWZpeGVkLWV4cG9uZW50IHJlcHJlc2VudGF0aW9ucyBhcmUgZXhhY3QgYnV0IG5vdCBpbnRlZ2VyLiAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfZXhhY3QgPSBmYWxzZTsKKworICAgIC8qKiBGb3IgaW50ZWdlciB0eXBlcywgc3BlY2lmaWVzIHRoZSBiYXNlIG9mIHRoZSByZXByZXNlbnRhdGlvbi4gIEZvcgorCWZsb2F0aW5nIHR5cGVzLCBzcGVjaWZpZXMgdGhlIGJhc2Ugb2YgdGhlIGV4cG9uZW50IHJlcHJlc2VudGF0aW9uLiAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSAwOworCisgICAgLyoqIFRoZSBtaW5pbXVtIG5lZ2F0aXZlIGludGVnZXIgc3VjaCB0aGF0IEBjIHJhZGl4IHJhaXNlZCB0byB0aGUgcG93ZXIgb2YKKwkob25lIGxlc3MgdGhhbiB0aGF0IGludGVnZXIpIGlzIGEgbm9ybWFsaXplZCBmbG9hdGluZyBwb2ludCBudW1iZXIuICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQgPSAwOworCisgICAgLyoqIFRoZSBtaW5pbXVtIG5lZ2F0aXZlIGludGVnZXIgc3VjaCB0aGF0IDEwIHJhaXNlZCB0byB0aGF0IHBvd2VyIGlzIGluCisJdGhlIHJhbmdlIG9mIG5vcm1hbGl6ZWQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gICovCisgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudDEwID0gMDsKKworICAgIC8qKiBUaGUgbWF4aW11bSBwb3NpdGl2ZSBpbnRlZ2VyIHN1Y2ggdGhhdCBAYyByYWRpeCByYWlzZWQgdG8gdGhlIHBvd2VyIG9mCisJKG9uZSBsZXNzIHRoYW4gdGhhdCBpbnRlZ2VyKSBpcyBhIHJlcHJlc2VudGFibGUgZmluaXRlIGZsb2F0aW5nIHBvaW50CisJbnVtYmVyLiAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50ID0gMDsKKworICAgIC8qKiBUaGUgbWF4aW11bSBwb3NpdGl2ZSBpbnRlZ2VyIHN1Y2ggdGhhdCAxMCByYWlzZWQgdG8gdGhhdCBwb3dlciBpcyBpbgorCXRoZSByYW5nZSBvZiByZXByZXNlbnRhYmxlIGZpbml0ZSBmbG9hdGluZyBwb2ludCBudW1iZXJzLiAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgLyoqIFRydWUgaWYgdGhlIHR5cGUgaGFzIGEgcmVwcmVzZW50YXRpb24gZm9yIHBvc2l0aXZlIGluZmluaXR5LiAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworCisgICAgLyoqIFRydWUgaWYgdGhlIHR5cGUgaGFzIGEgcmVwcmVzZW50YXRpb24gZm9yIGEgcXVpZXQgKG5vbi1zaWduYWxpbmcpCisJTm90IGEgTnVtYmVyLiAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19xdWlldF9OYU4gPSBmYWxzZTsKKworICAgIC8qKiBUcnVlIGlmIHRoZSB0eXBlIGhhcyBhIHJlcHJlc2VudGF0aW9uIGZvciBhIHNpZ25hbGluZworCU5vdCBhIE51bWJlci4gICovCisgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOworCisgICAgLyoqIFNlZSBzdGQ6OmZsb2F0X2Rlbm9ybV9zdHlsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICovCisgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gPSBkZW5vcm1fYWJzZW50OworCisgICAgLyoqIFRydWUgaWYgbG9zcyBvZiBhY2N1cmFjeSBpcyBkZXRlY3RlZCBhcyBhIGRlbm9ybWFsaXphdGlvbiBsb3NzLAorCXJhdGhlciB0aGFuIGFzIGFuIGluZXhhY3QgcmVzdWx0LiAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CisKKyAgICAvKiogVHJ1ZSBpZi1hbmQtb25seS1pZiB0aGUgdHlwZSBhZGhlcmVzIHRvIHRoZSBJRUMgNTU5IHN0YW5kYXJkLCBhbHNvCisJa25vd24gYXMgSUVFRSA3NTQuICAoT25seSBtYWtlcyBzZW5zZSBmb3IgZmxvYXRpbmcgcG9pbnQgdHlwZXMuKSAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2llYzU1OSA9IGZhbHNlOworCisgICAgLyoqIFRydWUgaWYgdGhlIHNldCBvZiB2YWx1ZXMgcmVwcmVzZW50YWJsZSBieSB0aGUgdHlwZSBpcworCWZpbml0ZS4gIEFsbCBidWlsdC1pbiB0eXBlcyBhcmUgYm91bmRlZCwgdGhpcyBtZW1iZXIgd291bGQgYmUKKwlmYWxzZSBmb3IgYXJiaXRyYXJ5IHByZWNpc2lvbiB0eXBlcy4gKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSBmYWxzZTsKKworICAgIC8qKiBUcnVlIGlmIHRoZSB0eXBlIGlzIEBlIG1vZHVsby4gQSB0eXBlIGlzIG1vZHVsbyBpZiwgZm9yIGFueQorCW9wZXJhdGlvbiBpbnZvbHZpbmcgKywgLSwgb3IgKiBvbiB2YWx1ZXMgb2YgdGhhdCB0eXBlIHdob3NlCisJcmVzdWx0IHdvdWxkIGZhbGwgb3V0c2lkZSB0aGUgcmFuZ2UgW21pbigpLG1heCgpXSwgdGhlIHZhbHVlCisJcmV0dXJuZWQgZGlmZmVycyBmcm9tIHRoZSB0cnVlIHZhbHVlIGJ5IGFuIGludGVnZXIgbXVsdGlwbGUgb2YKKwltYXgoKSAtIG1pbigpICsgMS4gT24gbW9zdCBtYWNoaW5lcywgdGhpcyBpcyBmYWxzZSBmb3IgZmxvYXRpbmcKKwl0eXBlcywgdHJ1ZSBmb3IgdW5zaWduZWQgaW50ZWdlcnMsIGFuZCB0cnVlIGZvciBzaWduZWQgaW50ZWdlcnMuCisJU2VlIFBSMjIyMDAgYWJvdXQgc2lnbmVkIGludGVnZXJzLiAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX21vZHVsbyA9IGZhbHNlOworCisgICAgLyoqIFRydWUgaWYgdHJhcHBpbmcgaXMgaW1wbGVtZW50ZWQgZm9yIHRoaXMgdHlwZS4gICovCisgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0cmFwcyA9IGZhbHNlOworCisgICAgLyoqIFRydWUgaWYgdGluaW5lc3MgaXMgZGV0ZWN0ZWQgYmVmb3JlIHJvdW5kaW5nLiAgKHNlZSBJRUMgNTU5KSAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOworCisgICAgLyoqIFNlZSBzdGQ6OmZsb2F0X3JvdW5kX3N0eWxlIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgVGhpcyBpcyBvbmx5CisJbWVhbmluZ2Z1bCBmb3IgZmxvYXRpbmcgdHlwZXM7IGludGVnZXIgdHlwZXMgd2lsbCBhbGwgYmUKKwlyb3VuZF90b3dhcmRfemVyby4gICovCisgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgPSAKKwkJCQkJCSAgICByb3VuZF90b3dhcmRfemVybzsKKyAgfTsKKworICAvKioKKyAgICogIEBicmllZiBQcm9wZXJ0aWVzIG9mIGZ1bmRhbWVudGFsIHR5cGVzLgorICAgKgorICAgKiAgVGhpcyBjbGFzcyBhbGxvd3MgYSBwcm9ncmFtIHRvIG9idGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgICogIHJlcHJlc2VudGF0aW9uIG9mIGEgZnVuZGFtZW50YWwgdHlwZSBvbiBhIGdpdmVuIHBsYXRmb3JtLiAgRm9yCisgICAqICBub24tZnVuZGFtZW50YWwgdHlwZXMsIHRoZSBmdW5jdGlvbnMgd2lsbCByZXR1cm4gMCBhbmQgdGhlIGRhdGEKKyAgICogIG1lbWJlcnMgd2lsbCBhbGwgYmUgQGMgZmFsc2UuCisgICAqCisgICAqICBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTOiAgRFJzIDIwMSBhbmQgMTg0IChoaSBHYWJ5ISkgYXJlCisgICAqICBub3RlZCwgYnV0IG5vdCBpbmNvcnBvcmF0ZWQgaW4gdGhpcyBkb2N1bWVudGVkICh5ZXQpLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzIDogcHVibGljIF9fbnVtZXJpY19saW1pdHNfYmFzZQorICAgIHsKKyAgICAgIC8qKiBUaGUgbWluaW11bSBmaW5pdGUgdmFsdWUsIG9yIGZvciBmbG9hdGluZyB0eXBlcyB3aXRoCisJICBkZW5vcm1hbGl6YXRpb24sIHRoZSBtaW5pbXVtIHBvc2l0aXZlIG5vcm1hbGl6ZWQgdmFsdWUuICAqLworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBfVHAKKyAgICAgIG1pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfVHAoKTsgfQorCisgICAgICAvKiogVGhlIG1heGltdW0gZmluaXRlIHZhbHVlLiAgKi8KKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgX1RwCisgICAgICBtYXgoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX1RwKCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIC8qKiBBIGZpbml0ZSB2YWx1ZSB4IHN1Y2ggdGhhdCB0aGVyZSBpcyBubyBvdGhlciBmaW5pdGUgdmFsdWUgeQorICAgICAgICogIHdoZXJlIHkgPCB4LiAgKi8KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX1RwCisgICAgICBsb3dlc3QoKSBub2V4Y2VwdCB7IHJldHVybiBfVHAoKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKiBUaGUgQGUgbWFjaGluZSBAZSBlcHNpbG9uOiAgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAxIGFuZCB0aGUgbGVhc3QKKwkgIHZhbHVlIGdyZWF0ZXIgdGhhbiAxIHRoYXQgaXMgcmVwcmVzZW50YWJsZS4gICovCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIF9UcAorICAgICAgZXBzaWxvbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfVHAoKTsgfQorCisgICAgICAvKiogVGhlIG1heGltdW0gcm91bmRpbmcgZXJyb3IgbWVhc3VyZW1lbnQgKHNlZSBMSUEtMSkuICAqLworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBfVHAKKyAgICAgIHJvdW5kX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9UcCgpOyB9CisKKyAgICAgIC8qKiBUaGUgcmVwcmVzZW50YXRpb24gb2YgcG9zaXRpdmUgaW5maW5pdHksIGlmIEBjIGhhc19pbmZpbml0eS4gICovCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIF9UcAorICAgICAgaW5maW5pdHkoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX1RwKCk7IH0KKworICAgICAgLyoqIFRoZSByZXByZXNlbnRhdGlvbiBvZiBhIHF1aWV0IE5vdCBhIE51bWJlciwKKwkgIGlmIEBjIGhhc19xdWlldF9OYU4uICovCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIF9UcAorICAgICAgcXVpZXRfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9UcCgpOyB9CisKKyAgICAgIC8qKiBUaGUgcmVwcmVzZW50YXRpb24gb2YgYSBzaWduYWxpbmcgTm90IGEgTnVtYmVyLCBpZgorCSAgQGMgaGFzX3NpZ25hbGluZ19OYU4uICovCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIF9UcAorICAgICAgc2lnbmFsaW5nX05hTigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfVHAoKTsgfQorCisgICAgICAvKiogVGhlIG1pbmltdW0gcG9zaXRpdmUgZGVub3JtYWxpemVkIHZhbHVlLiAgRm9yIHR5cGVzIHdoZXJlCisJICBAYyBoYXNfZGVub3JtIGlzIGZhbHNlLCB0aGlzIGlzIHRoZSBtaW5pbXVtIHBvc2l0aXZlIG5vcm1hbGl6ZWQKKwkgIHZhbHVlLiAgKi8KKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgX1RwCisgICAgICBkZW5vcm1fbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9UcCgpOyB9CisgICAgfTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czxjb25zdCBfVHA+CisgICAgOiBwdWJsaWMgbnVtZXJpY19saW1pdHM8X1RwPiB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czx2b2xhdGlsZSBfVHA+CisgICAgOiBwdWJsaWMgbnVtZXJpY19saW1pdHM8X1RwPiB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czxjb25zdCB2b2xhdGlsZSBfVHA+CisgICAgOiBwdWJsaWMgbnVtZXJpY19saW1pdHM8X1RwPiB7IH07CisjZW5kaWYKKworICAvLyBOb3cgdGhlcmUgZm9sbG93IDE2IGV4cGxpY2l0IHNwZWNpYWxpemF0aW9ucy4gIFllcywgMTYuICBNYWtlIHN1cmUKKyAgLy8geW91IGdldCB0aGUgY291bnQgcmlnaHQuICgxOCBpbiBjKysweCBtb2RlKQorCisgIC8vLyBudW1lcmljX2xpbWl0czxib29sPiBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czxib29sPgorICAgIHsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wgCisgICAgICBtaW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sIAorICAgICAgbWF4KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIHRydWU7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbAorICAgICAgbG93ZXN0KCkgbm9leGNlcHQgeyByZXR1cm4gbWluKCk7IH0KKyNlbmRpZgorICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0cyA9IDE7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzMTAgPSAwOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSAyOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wgCisgICAgICBlcHNpbG9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbCAKKyAgICAgIHJvdW5kX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudDEwID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudDEwID0gMDsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3F1aWV0X05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gCisgICAgICAgPSBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sIAorICAgICAgaW5maW5pdHkoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sIAorICAgICAgcXVpZXRfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbCAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sIAorICAgICAgZGVub3JtX21pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2llYzU1OSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19ib3VuZGVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfbW9kdWxvID0gZmFsc2U7CisKKyAgICAgIC8vIEl0IGlzIG5vdCBjbGVhciB3aGF0IGl0IG1lYW5zIGZvciBhIGJvb2xlYW4gdHlwZSB0byB0cmFwLgorICAgICAgLy8gVGhpcyBpcyBhIERSIG9uIHRoZSBMV0cgaXNzdWUgbGlzdC4gIEhlcmUsIEkgdXNlIGludGVnZXIKKyAgICAgIC8vIHByb21vdGlvbiBzZW1hbnRpY3MuCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gX19nbGliY3h4X2ludGVncmFsX3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlIAorICAgICAgID0gcm91bmRfdG93YXJkX3plcm87CisgICAgfTsKKworICAvLy8gbnVtZXJpY19saW1pdHM8Y2hhcj4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8Y2hhcj4KKyAgICB7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBjaGFyIAorICAgICAgbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fZ2xpYmN4eF9taW4oY2hhcik7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBjaGFyIAorICAgICAgbWF4KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fZ2xpYmN4eF9tYXgoY2hhcik7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciAKKyAgICAgIGxvd2VzdCgpIG5vZXhjZXB0IHsgcmV0dXJuIG1pbigpOyB9CisjZW5kaWYKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0cyA9IF9fZ2xpYmN4eF9kaWdpdHMgKGNoYXIpOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwID0gX19nbGliY3h4X2RpZ2l0czEwIChjaGFyKTsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBtYXhfZGlnaXRzMTAgPSAwOworI2VuZGlmCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NpZ25lZCA9IF9fZ2xpYmN4eF9zaWduZWQgKGNoYXIpOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pbnRlZ2VyID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfZXhhY3QgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IHJhZGl4ID0gMjsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBjaGFyIAorICAgICAgZXBzaWxvbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgY2hhciAKKyAgICAgIHJvdW5kX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSAKKyAgICAgICA9IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIAorICAgICAgY2hhciBpbmZpbml0eSgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBjaGFyKCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBjaGFyIAorICAgICAgcXVpZXRfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIGNoYXIoKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXIgCisgICAgICBzaWduYWxpbmdfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIGNoYXIoKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXIgCisgICAgICBkZW5vcm1fbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXI+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19tb2R1bG8gPSAhaXNfc2lnbmVkOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gX19nbGliY3h4X2ludGVncmFsX3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlIAorICAgICAgID0gcm91bmRfdG93YXJkX3plcm87CisgICAgfTsKKworICAvLy8gbnVtZXJpY19saW1pdHM8c2lnbmVkIGNoYXI+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPHNpZ25lZCBjaGFyPgorICAgIHsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNpZ25lZCBjaGFyIAorICAgICAgbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIC1fX1NDSEFSX01BWF9fIC0gMTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNpZ25lZCBjaGFyIAorICAgICAgbWF4KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fU0NIQVJfTUFYX187IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2lnbmVkIGNoYXIgCisgICAgICBsb3dlc3QoKSBub2V4Y2VwdCB7IHJldHVybiBtaW4oKTsgfQorI2VuZGlmCisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMgPSBfX2dsaWJjeHhfZGlnaXRzIChzaWduZWQgY2hhcik7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzMTAgCisgICAgICAgPSBfX2dsaWJjeHhfZGlnaXRzMTAgKHNpZ25lZCBjaGFyKTsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBtYXhfZGlnaXRzMTAgPSAwOworI2VuZGlmCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NpZ25lZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSAyOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNpZ25lZCBjaGFyIAorICAgICAgZXBzaWxvbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2lnbmVkIGNoYXIgCisgICAgICByb3VuZF9lcnJvcigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudDEwID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudDEwID0gMDsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3F1aWV0X05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gCisgICAgICAgPSBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaWduZWQgY2hhciAKKyAgICAgIGluZmluaXR5KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIHN0YXRpY19jYXN0PHNpZ25lZCBjaGFyPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNpZ25lZCBjaGFyIAorICAgICAgcXVpZXRfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIHN0YXRpY19jYXN0PHNpZ25lZCBjaGFyPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNpZ25lZCBjaGFyIAorICAgICAgc2lnbmFsaW5nX05hTigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8c2lnbmVkIGNoYXI+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2lnbmVkIGNoYXIgCisgICAgICBkZW5vcm1fbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxzaWduZWQgY2hhcj4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX21vZHVsbyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gX19nbGliY3h4X2ludGVncmFsX3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlIAorICAgICAgID0gcm91bmRfdG93YXJkX3plcm87CisgICAgfTsKKworICAvLy8gbnVtZXJpY19saW1pdHM8dW5zaWduZWQgY2hhcj4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8dW5zaWduZWQgY2hhcj4KKyAgICB7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBjaGFyIAorICAgICAgbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBjaGFyIAorICAgICAgbWF4KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fU0NIQVJfTUFYX18gKiAyVSArIDE7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgY2hhciAKKyAgICAgIGxvd2VzdCgpIG5vZXhjZXB0IHsgcmV0dXJuIG1pbigpOyB9CisjZW5kaWYKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0cyAKKyAgICAgICA9IF9fZ2xpYmN4eF9kaWdpdHMgKHVuc2lnbmVkIGNoYXIpOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwIAorICAgICAgID0gX19nbGliY3h4X2RpZ2l0czEwICh1bnNpZ25lZCBjaGFyKTsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBtYXhfZGlnaXRzMTAgPSAwOworI2VuZGlmCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NpZ25lZCA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pbnRlZ2VyID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfZXhhY3QgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IHJhZGl4ID0gMjsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBjaGFyIAorICAgICAgZXBzaWxvbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgY2hhciAKKyAgICAgIHJvdW5kX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSAKKyAgICAgICA9IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGNoYXIgCisgICAgICBpbmZpbml0eSgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBjaGFyIAorICAgICAgcXVpZXRfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGNoYXIgCisgICAgICBzaWduYWxpbmdfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGNoYXIgCisgICAgICBkZW5vcm1fbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2llYzU1OSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19ib3VuZGVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfbW9kdWxvID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0cmFwcyA9IF9fZ2xpYmN4eF9pbnRlZ3JhbF90cmFwczsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSAKKyAgICAgICA9IHJvdW5kX3Rvd2FyZF96ZXJvOworICAgIH07CisKKyAgLy8vIG51bWVyaWNfbGltaXRzPHdjaGFyX3Q+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPHdjaGFyX3Q+CisgICAgeworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgd2NoYXJfdCAKKyAgICAgIG1pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX2dsaWJjeHhfbWluICh3Y2hhcl90KTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHdjaGFyX3QgCisgICAgICBtYXgoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19nbGliY3h4X21heCAod2NoYXJfdCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgd2NoYXJfdAorICAgICAgbG93ZXN0KCkgbm9leGNlcHQgeyByZXR1cm4gbWluKCk7IH0KKyNlbmRpZgorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzID0gX19nbGliY3h4X2RpZ2l0cyAod2NoYXJfdCk7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzMTAgCisgICAgICAgPSBfX2dsaWJjeHhfZGlnaXRzMTAgKHdjaGFyX3QpOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gX19nbGliY3h4X3NpZ25lZCAod2NoYXJfdCk7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSAyOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHdjaGFyX3QgCisgICAgICBlcHNpbG9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB3Y2hhcl90IAorICAgICAgcm91bmRfZXJyb3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQxMCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQxMCA9IDA7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2luZmluaXR5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19xdWlldF9OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtIAorICAgICAgID0gZGVub3JtX2Fic2VudDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgd2NoYXJfdCAKKyAgICAgIGluZmluaXR5KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIHdjaGFyX3QoKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHdjaGFyX3QgCisgICAgICBxdWlldF9OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gd2NoYXJfdCgpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgd2NoYXJfdCAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gd2NoYXJfdCgpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgd2NoYXJfdCAKKyAgICAgIGRlbm9ybV9taW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gd2NoYXJfdCgpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19tb2R1bG8gPSAhaXNfc2lnbmVkOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gX19nbGliY3h4X2ludGVncmFsX3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlIAorICAgICAgID0gcm91bmRfdG93YXJkX3plcm87CisgICAgfTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgLy8vIG51bWVyaWNfbGltaXRzPGNoYXIxNl90PiBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czxjaGFyMTZfdD4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIxNl90IAorICAgICAgbWluKCkgbm9leGNlcHQgeyByZXR1cm4gX19nbGliY3h4X21pbiAoY2hhcjE2X3QpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhcjE2X3QgCisgICAgICBtYXgoKSBub2V4Y2VwdCB7IHJldHVybiBfX2dsaWJjeHhfbWF4IChjaGFyMTZfdCk7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyMTZfdCAKKyAgICAgIGxvd2VzdCgpIG5vZXhjZXB0IHsgcmV0dXJuIG1pbigpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGRpZ2l0cyA9IF9fZ2xpYmN4eF9kaWdpdHMgKGNoYXIxNl90KTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGRpZ2l0czEwID0gX19nbGliY3h4X2RpZ2l0czEwIChjaGFyMTZfdCk7CisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBtYXhfZGlnaXRzMTAgPSAwOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX3NpZ25lZCA9IF9fZ2xpYmN4eF9zaWduZWQgKGNoYXIxNl90KTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBpc19pbnRlZ2VyID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgICBzdGF0aWMgY29uc3RleHByIGludCByYWRpeCA9IDI7CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhcjE2X3QgCisgICAgICBlcHNpbG9uKCkgbm9leGNlcHQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIxNl90IAorICAgICAgcm91bmRfZXJyb3IoKSBub2V4Y2VwdCB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBtaW5fZXhwb25lbnQxMCA9IDA7CisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBtYXhfZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaGFzX2luZmluaXR5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaGFzX3F1aWV0X05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtID0gZGVub3JtX2Fic2VudDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZTsKKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyMTZfdCAKKyAgICAgIGluZmluaXR5KCkgbm9leGNlcHQgeyByZXR1cm4gY2hhcjE2X3QoKTsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIxNl90IAorICAgICAgcXVpZXRfTmFOKCkgbm9leGNlcHQgeyByZXR1cm4gY2hhcjE2X3QoKTsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIxNl90IAorICAgICAgc2lnbmFsaW5nX05hTigpIG5vZXhjZXB0IHsgcmV0dXJuIGNoYXIxNl90KCk7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyMTZfdCAKKyAgICAgIGRlbm9ybV9taW4oKSBub2V4Y2VwdCB7IHJldHVybiBjaGFyMTZfdCgpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBpc19ib3VuZGVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBpc19tb2R1bG8gPSAhaXNfc2lnbmVkOworCisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgdHJhcHMgPSBfX2dsaWJjeHhfaW50ZWdyYWxfdHJhcHM7CisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7CisgICAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlID0gcm91bmRfdG93YXJkX3plcm87CisgICAgfTsKKworICAvLy8gbnVtZXJpY19saW1pdHM8Y2hhcjMyX3Q+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPGNoYXIzMl90PgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhcjMyX3QgCisgICAgICBtaW4oKSBub2V4Y2VwdCB7IHJldHVybiBfX2dsaWJjeHhfbWluIChjaGFyMzJfdCk7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyMzJfdCAKKyAgICAgIG1heCgpIG5vZXhjZXB0IHsgcmV0dXJuIF9fZ2xpYmN4eF9tYXggKGNoYXIzMl90KTsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIzMl90IAorICAgICAgbG93ZXN0KCkgbm9leGNlcHQgeyByZXR1cm4gbWluKCk7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgZGlnaXRzID0gX19nbGliY3h4X2RpZ2l0cyAoY2hhcjMyX3QpOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgZGlnaXRzMTAgPSBfX2dsaWJjeHhfZGlnaXRzMTAgKGNoYXIzMl90KTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaXNfc2lnbmVkID0gX19nbGliY3h4X3NpZ25lZCAoY2hhcjMyX3QpOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX2V4YWN0ID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IHJhZGl4ID0gMjsKKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyMzJfdCAKKyAgICAgIGVwc2lsb24oKSBub2V4Y2VwdCB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhcjMyX3QgCisgICAgICByb3VuZF9lcnJvcigpIG5vZXhjZXB0IHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWluX2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1pbl9leHBvbmVudDEwID0gMDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBtYXhfZXhwb25lbnQxMCA9IDA7CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gPSBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIzMl90IAorICAgICAgaW5maW5pdHkoKSBub2V4Y2VwdCB7IHJldHVybiBjaGFyMzJfdCgpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhcjMyX3QgCisgICAgICBxdWlldF9OYU4oKSBub2V4Y2VwdCB7IHJldHVybiBjaGFyMzJfdCgpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhcjMyX3QgCisgICAgICBzaWduYWxpbmdfTmFOKCkgbm9leGNlcHQgeyByZXR1cm4gY2hhcjMyX3QoKTsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIzMl90IAorICAgICAgZGVub3JtX21pbigpIG5vZXhjZXB0IHsgcmV0dXJuIGNoYXIzMl90KCk7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX2llYzU1OSA9IGZhbHNlOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX21vZHVsbyA9ICFpc19zaWduZWQ7CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCB0cmFwcyA9IF9fZ2xpYmN4eF9pbnRlZ3JhbF90cmFwczsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgPSByb3VuZF90b3dhcmRfemVybzsKKyAgICB9OworI2VuZGlmCisKKyAgLy8vIG51bWVyaWNfbGltaXRzPHNob3J0PiBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czxzaG9ydD4KKyAgICB7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaG9ydCAKKyAgICAgIG1pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAtX19TSFJUX01BWF9fIC0gMTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNob3J0IAorICAgICAgbWF4KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fU0hSVF9NQVhfXzsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaG9ydCAKKyAgICAgIGxvd2VzdCgpIG5vZXhjZXB0IHsgcmV0dXJuIG1pbigpOyB9CisjZW5kaWYKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0cyA9IF9fZ2xpYmN4eF9kaWdpdHMgKHNob3J0KTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMxMCA9IF9fZ2xpYmN4eF9kaWdpdHMxMCAoc2hvcnQpOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2V4YWN0ID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCByYWRpeCA9IDI7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2hvcnQgCisgICAgICBlcHNpbG9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaG9ydCAKKyAgICAgIHJvdW5kX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSAKKyAgICAgICA9IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNob3J0IAorICAgICAgaW5maW5pdHkoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gc2hvcnQoKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNob3J0IAorICAgICAgcXVpZXRfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIHNob3J0KCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaG9ydCAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gc2hvcnQoKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNob3J0IAorICAgICAgZGVub3JtX21pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBzaG9ydCgpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19tb2R1bG8gPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0cmFwcyA9IF9fZ2xpYmN4eF9pbnRlZ3JhbF90cmFwczsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSAKKyAgICAgICA9IHJvdW5kX3Rvd2FyZF96ZXJvOworICAgIH07CisKKyAgLy8vIG51bWVyaWNfbGltaXRzPHVuc2lnbmVkIHNob3J0PiBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czx1bnNpZ25lZCBzaG9ydD4KKyAgICB7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBzaG9ydCAKKyAgICAgIG1pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgc2hvcnQgCisgICAgICBtYXgoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19TSFJUX01BWF9fICogMlUgKyAxOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIHNob3J0IAorICAgICAgbG93ZXN0KCkgbm9leGNlcHQgeyByZXR1cm4gbWluKCk7IH0KKyNlbmRpZgorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzIAorICAgICAgID0gX19nbGliY3h4X2RpZ2l0cyAodW5zaWduZWQgc2hvcnQpOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwIAorICAgICAgID0gX19nbGliY3h4X2RpZ2l0czEwICh1bnNpZ25lZCBzaG9ydCk7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2RpZ2l0czEwID0gMDsKKyNlbmRpZgorICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zaWduZWQgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2V4YWN0ID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCByYWRpeCA9IDI7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgc2hvcnQgCisgICAgICBlcHNpbG9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBzaG9ydCAKKyAgICAgIHJvdW5kX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSAKKyAgICAgICA9IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIHNob3J0IAorICAgICAgaW5maW5pdHkoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIHNob3J0IAorICAgICAgcXVpZXRfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBzaG9ydCAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIHNob3J0IAorICAgICAgZGVub3JtX21pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19tb2R1bG8gPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gX19nbGliY3h4X2ludGVncmFsX3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlIAorICAgICAgID0gcm91bmRfdG93YXJkX3plcm87CisgICAgfTsKKworICAvLy8gbnVtZXJpY19saW1pdHM8aW50PiBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czxpbnQ+CisgICAgeworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgaW50IAorICAgICAgbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIC1fX0lOVF9NQVhfXyAtIDE7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBpbnQgCisgICAgICBtYXgoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19JTlRfTUFYX187IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IAorICAgICAgbG93ZXN0KCkgbm9leGNlcHQgeyByZXR1cm4gbWluKCk7IH0KKyNlbmRpZgorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzID0gX19nbGliY3h4X2RpZ2l0cyAoaW50KTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMxMCA9IF9fZ2xpYmN4eF9kaWdpdHMxMCAoaW50KTsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBtYXhfZGlnaXRzMTAgPSAwOworI2VuZGlmCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NpZ25lZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSAyOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGludCAKKyAgICAgIGVwc2lsb24oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGludCAKKyAgICAgIHJvdW5kX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSAKKyAgICAgICA9IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGludCAKKyAgICAgIGluZmluaXR5KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBpbnQgCisgICAgICBxdWlldF9OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGludCAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGludCAKKyAgICAgIGRlbm9ybV9taW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2llYzU1OSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19ib3VuZGVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfbW9kdWxvID0gZmFsc2U7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdHJhcHMgPSBfX2dsaWJjeHhfaW50ZWdyYWxfdHJhcHM7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgCisgICAgICAgPSByb3VuZF90b3dhcmRfemVybzsKKyAgICB9OworCisgIC8vLyBudW1lcmljX2xpbWl0czx1bnNpZ25lZCBpbnQ+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGludD4KKyAgICB7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBpbnQgCisgICAgICBtaW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGludCAKKyAgICAgIG1heCgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX0lOVF9NQVhfXyAqIDJVICsgMTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBpbnQgCisgICAgICBsb3dlc3QoKSBub2V4Y2VwdCB7IHJldHVybiBtaW4oKTsgfQorI2VuZGlmCisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMgCisgICAgICAgPSBfX2dsaWJjeHhfZGlnaXRzICh1bnNpZ25lZCBpbnQpOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwIAorICAgICAgID0gX19nbGliY3h4X2RpZ2l0czEwICh1bnNpZ25lZCBpbnQpOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSAyOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGludCAKKyAgICAgIGVwc2lsb24oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGludCAKKyAgICAgIHJvdW5kX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSAKKyAgICAgICA9IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGludCAKKyAgICAgIGluZmluaXR5KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBpbnQgCisgICAgICBxdWlldF9OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBpbnQgCisgICAgICBzaWduYWxpbmdfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgaW50IAorICAgICAgZGVub3JtX21pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2llYzU1OSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19ib3VuZGVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfbW9kdWxvID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0cmFwcyA9IF9fZ2xpYmN4eF9pbnRlZ3JhbF90cmFwczsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSAKKyAgICAgICA9IHJvdW5kX3Rvd2FyZF96ZXJvOworICAgIH07CisKKyAgLy8vIG51bWVyaWNfbGltaXRzPGxvbmc+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPGxvbmc+CisgICAgeworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZworICAgICAgbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIC1fX0xPTkdfTUFYX18gLSAxOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyAKKyAgICAgIG1heCgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX0xPTkdfTUFYX187IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgbG9uZyAKKyAgICAgIGxvd2VzdCgpIG5vZXhjZXB0IHsgcmV0dXJuIG1pbigpOyB9CisjZW5kaWYKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0cyA9IF9fZ2xpYmN4eF9kaWdpdHMgKGxvbmcpOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwID0gX19nbGliY3h4X2RpZ2l0czEwIChsb25nKTsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBtYXhfZGlnaXRzMTAgPSAwOworI2VuZGlmCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NpZ25lZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSAyOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgCisgICAgICBlcHNpbG9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIAorICAgICAgcm91bmRfZXJyb3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQxMCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQxMCA9IDA7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2luZmluaXR5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19xdWlldF9OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtIAorICAgICAgID0gZGVub3JtX2Fic2VudDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyAKKyAgICAgIGluZmluaXR5KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIHN0YXRpY19jYXN0PGxvbmc+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyAKKyAgICAgIHF1aWV0X05hTigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBzdGF0aWNfY2FzdDxsb25nPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgCisgICAgICBzaWduYWxpbmdfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIHN0YXRpY19jYXN0PGxvbmc+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyAKKyAgICAgIGRlbm9ybV9taW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gc3RhdGljX2Nhc3Q8bG9uZz4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX21vZHVsbyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gX19nbGliY3h4X2ludGVncmFsX3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlIAorICAgICAgID0gcm91bmRfdG93YXJkX3plcm87CisgICAgfTsKKworICAvLy8gbnVtZXJpY19saW1pdHM8dW5zaWduZWQgbG9uZz4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8dW5zaWduZWQgbG9uZz4KKyAgICB7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBsb25nIAorICAgICAgbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBsb25nIAorICAgICAgbWF4KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fTE9OR19NQVhfXyAqIDJVTCArIDE7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgbG9uZyAKKyAgICAgIGxvd2VzdCgpIG5vZXhjZXB0IHsgcmV0dXJuIG1pbigpOyB9CisjZW5kaWYKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0cyAKKyAgICAgICA9IF9fZ2xpYmN4eF9kaWdpdHMgKHVuc2lnbmVkIGxvbmcpOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwIAorICAgICAgID0gX19nbGliY3h4X2RpZ2l0czEwICh1bnNpZ25lZCBsb25nKTsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBtYXhfZGlnaXRzMTAgPSAwOworI2VuZGlmCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NpZ25lZCA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pbnRlZ2VyID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfZXhhY3QgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IHJhZGl4ID0gMjsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBsb25nIAorICAgICAgZXBzaWxvbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgbG9uZyAKKyAgICAgIHJvdW5kX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSAKKyAgICAgICA9IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgCisgICAgICBpbmZpbml0eSgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBsb25nIAorICAgICAgcXVpZXRfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgCisgICAgICBzaWduYWxpbmdfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgCisgICAgICBkZW5vcm1fbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2llYzU1OSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19ib3VuZGVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfbW9kdWxvID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0cmFwcyA9IF9fZ2xpYmN4eF9pbnRlZ3JhbF90cmFwczsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSAKKyAgICAgICA9IHJvdW5kX3Rvd2FyZF96ZXJvOworICAgIH07CisKKyAgLy8vIG51bWVyaWNfbGltaXRzPGxvbmcgbG9uZz4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8bG9uZyBsb25nPgorICAgIHsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgbG9uZyAKKyAgICAgIG1pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAtX19MT05HX0xPTkdfTUFYX18gLSAxOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBsb25nIAorICAgICAgbWF4KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fTE9OR19MT05HX01BWF9fOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGF0aWMgY29uc3RleHByIGxvbmcgbG9uZyAKKyAgICAgIGxvd2VzdCgpIG5vZXhjZXB0IHsgcmV0dXJuIG1pbigpOyB9CisjZW5kaWYKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0cyAKKyAgICAgICA9IF9fZ2xpYmN4eF9kaWdpdHMgKGxvbmcgbG9uZyk7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzMTAgCisgICAgICAgPSBfX2dsaWJjeHhfZGlnaXRzMTAgKGxvbmcgbG9uZyk7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2RpZ2l0czEwID0gMDsKKyNlbmRpZgorICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zaWduZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pbnRlZ2VyID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfZXhhY3QgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IHJhZGl4ID0gMjsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGxvbmcgCisgICAgICBlcHNpbG9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGxvbmcgCisgICAgICByb3VuZF9lcnJvcigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudDEwID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudDEwID0gMDsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3F1aWV0X05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gCisgICAgICAgPSBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGxvbmcgCisgICAgICBpbmZpbml0eSgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBsb25nIAorICAgICAgcXVpZXRfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGxvbmcgCisgICAgICBzaWduYWxpbmdfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBsb25nIAorICAgICAgZGVub3JtX21pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19tb2R1bG8gPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0cmFwcyA9IF9fZ2xpYmN4eF9pbnRlZ3JhbF90cmFwczsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSAKKyAgICAgICA9IHJvdW5kX3Rvd2FyZF96ZXJvOworICAgIH07CisKKyAgLy8vIG51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGxvbmcgbG9uZz4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8dW5zaWduZWQgbG9uZyBsb25nPgorICAgIHsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgbG9uZyAKKyAgICAgIG1pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgbG9uZyBsb25nIAorICAgICAgbWF4KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fTE9OR19MT05HX01BWF9fICogMlVMTCArIDE7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgbG9uZyBsb25nIAorICAgICAgbG93ZXN0KCkgbm9leGNlcHQgeyByZXR1cm4gbWluKCk7IH0KKyNlbmRpZgorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzIAorICAgICAgID0gX19nbGliY3h4X2RpZ2l0cyAodW5zaWduZWQgbG9uZyBsb25nKTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMxMCAKKyAgICAgICA9IF9fZ2xpYmN4eF9kaWdpdHMxMCAodW5zaWduZWQgbG9uZyBsb25nKTsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBtYXhfZGlnaXRzMTAgPSAwOworI2VuZGlmCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NpZ25lZCA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pbnRlZ2VyID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfZXhhY3QgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IHJhZGl4ID0gMjsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBsb25nIGxvbmcgCisgICAgICBlcHNpbG9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBsb25nIGxvbmcgCisgICAgICByb3VuZF9lcnJvcigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudDEwID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudDEwID0gMDsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3F1aWV0X05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gCisgICAgICAgPSBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBsb25nIGxvbmcgCisgICAgICBpbmZpbml0eSgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgbG9uZyAKKyAgICAgIHF1aWV0X05hTigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgbG9uZyAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBsb25nIGxvbmcgCisgICAgICBkZW5vcm1fbWluKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19tb2R1bG8gPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gX19nbGliY3h4X2ludGVncmFsX3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlIAorICAgICAgID0gcm91bmRfdG93YXJkX3plcm87CisgICAgfTsKKworI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfR0xJQkNYWF9VU0VfSU5UMTI4KQorICAvLy8gbnVtZXJpY19saW1pdHM8X19pbnQxMjg+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPF9faW50MTI4PgorICAgIHsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIF9faW50MTI4CisgICAgICBtaW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19nbGliY3h4X21pbiAoX19pbnQxMjgpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgX19pbnQxMjgKKyAgICAgIG1heCgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX2dsaWJjeHhfbWF4IChfX2ludDEyOCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX19pbnQxMjgKKyAgICAgIGxvd2VzdCgpIG5vZXhjZXB0IHsgcmV0dXJuIG1pbigpOyB9CisjZW5kaWYKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0cworICAgICAgID0gX19nbGliY3h4X2RpZ2l0cyAoX19pbnQxMjgpOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwCisgICAgICAgPSBfX2dsaWJjeHhfZGlnaXRzMTAgKF9faW50MTI4KTsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBtYXhfZGlnaXRzMTAgPSAwOworI2VuZGlmCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NpZ25lZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSAyOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIF9faW50MTI4CisgICAgICBlcHNpbG9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBfX2ludDEyOAorICAgICAgcm91bmRfZXJyb3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQxMCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQxMCA9IDA7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2luZmluaXR5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19xdWlldF9OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtCisgICAgICAgPSBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBfX2ludDEyOAorICAgICAgaW5maW5pdHkoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9faW50MTI4PigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIF9faW50MTI4CisgICAgICBxdWlldF9OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9faW50MTI4PigwKTsgfQorICAgICAgCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIF9faW50MTI4CisgICAgICBzaWduYWxpbmdfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfX2ludDEyOD4oMCk7IH0KKyAgICAgIAorICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBfX2ludDEyOAorICAgICAgZGVub3JtX21pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X19pbnQxMjg+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19tb2R1bG8gPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0cmFwcworICAgICAgID0gX19nbGliY3h4X2ludGVncmFsX3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlCisgICAgICAgPSByb3VuZF90b3dhcmRfemVybzsKKyAgICB9OworCisgIC8vLyBudW1lcmljX2xpbWl0czx1bnNpZ25lZCBfX2ludDEyOD4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8dW5zaWduZWQgX19pbnQxMjg+CisgICAgeworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgX19pbnQxMjgKKyAgICAgIG1pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgX19pbnQxMjgKKyAgICAgIG1heCgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX2dsaWJjeHhfbWF4ICh1bnNpZ25lZCBfX2ludDEyOCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgX19pbnQxMjgKKyAgICAgIGxvd2VzdCgpIG5vZXhjZXB0IHsgcmV0dXJuIG1pbigpOyB9CisjZW5kaWYKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0cworICAgICAgID0gX19nbGliY3h4X2RpZ2l0cyAodW5zaWduZWQgX19pbnQxMjgpOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwCisgICAgICAgPSBfX2dsaWJjeHhfZGlnaXRzMTAgKHVuc2lnbmVkIF9faW50MTI4KTsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBtYXhfZGlnaXRzMTAgPSAwOworI2VuZGlmCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NpZ25lZCA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pbnRlZ2VyID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfZXhhY3QgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IHJhZGl4ID0gMjsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBfX2ludDEyOAorICAgICAgZXBzaWxvbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgX19pbnQxMjgKKyAgICAgIHJvdW5kX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybQorICAgICAgID0gZGVub3JtX2Fic2VudDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgX19pbnQxMjgKKyAgICAgIGluZmluaXR5KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBfX2ludDEyOD4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBfX2ludDEyOAorICAgICAgcXVpZXRfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBfX2ludDEyOD4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBfX2ludDEyOAorICAgICAgc2lnbmFsaW5nX05hTigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgX19pbnQxMjg+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgX19pbnQxMjgKKyAgICAgIGRlbm9ybV9taW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIF9faW50MTI4PigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2llYzU1OSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19ib3VuZGVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfbW9kdWxvID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0cmFwcyA9IF9fZ2xpYmN4eF9pbnRlZ3JhbF90cmFwczsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZQorICAgICAgID0gcm91bmRfdG93YXJkX3plcm87CisgICAgfTsKKyNlbmRpZgorCisgIC8vLyBudW1lcmljX2xpbWl0czxmbG9hdD4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8ZmxvYXQ+CisgICAgeworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQgCisgICAgICBtaW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19GTFRfTUlOX187IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdCAKKyAgICAgIG1heCgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX0ZMVF9NQVhfXzsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCAKKyAgICAgIGxvd2VzdCgpIG5vZXhjZXB0IHsgcmV0dXJuIC1fX0ZMVF9NQVhfXzsgfQorI2VuZGlmCisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMgPSBfX0ZMVF9NQU5UX0RJR19fOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwID0gX19GTFRfRElHX187CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2RpZ2l0czEwCisJID0gX19nbGliY3h4X21heF9kaWdpdHMxMCAoX19GTFRfTUFOVF9ESUdfXyk7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IHJhZGl4ID0gX19GTFRfUkFESVhfXzsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdCAKKyAgICAgIGVwc2lsb24oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19GTFRfRVBTSUxPTl9fOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQgCisgICAgICByb3VuZF9lcnJvcigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAwLjVGOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQgPSBfX0ZMVF9NSU5fRVhQX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSBfX0ZMVF9NSU5fMTBfRVhQX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50ID0gX19GTFRfTUFYX0VYUF9fOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudDEwID0gX19GTFRfTUFYXzEwX0VYUF9fOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IF9fRkxUX0hBU19JTkZJTklUWV9fOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gX19GTFRfSEFTX1FVSUVUX05BTl9fOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGhhc19xdWlldF9OYU47CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybQorCT0gYm9vbChfX0ZMVF9IQVNfREVOT1JNX18pID8gZGVub3JtX3ByZXNlbnQgOiBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MgCisgICAgICAgPSBfX2dsaWJjeHhfZmxvYXRfaGFzX2Rlbm9ybV9sb3NzOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGZsb2F0IAorICAgICAgaW5maW5pdHkoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19idWlsdGluX2h1Z2VfdmFsZigpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQgCisgICAgICBxdWlldF9OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19idWlsdGluX25hbmYoIiIpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQgCisgICAgICBzaWduYWxpbmdfTmFOKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fYnVpbHRpbl9uYW5zZigiIik7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdCAKKyAgICAgIGRlbm9ybV9taW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19GTFRfREVOT1JNX01JTl9fOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5CisJPSBoYXNfaW5maW5pdHkgJiYgaGFzX3F1aWV0X05hTiAmJiBoYXNfZGVub3JtID09IGRlbm9ybV9wcmVzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19ib3VuZGVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfbW9kdWxvID0gZmFsc2U7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdHJhcHMgPSBfX2dsaWJjeHhfZmxvYXRfdHJhcHM7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRpbnluZXNzX2JlZm9yZSAKKyAgICAgICA9IF9fZ2xpYmN4eF9mbG9hdF90aW55bmVzc19iZWZvcmU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSAKKyAgICAgICA9IHJvdW5kX3RvX25lYXJlc3Q7CisgICAgfTsKKworI3VuZGVmIF9fZ2xpYmN4eF9mbG9hdF9oYXNfZGVub3JtX2xvc3MKKyN1bmRlZiBfX2dsaWJjeHhfZmxvYXRfdHJhcHMKKyN1bmRlZiBfX2dsaWJjeHhfZmxvYXRfdGlueW5lc3NfYmVmb3JlCisKKyAgLy8vIG51bWVyaWNfbGltaXRzPGRvdWJsZT4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8ZG91YmxlPgorICAgIHsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGRvdWJsZSAKKyAgICAgIG1pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX0RCTF9NSU5fXzsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGRvdWJsZSAKKyAgICAgIG1heCgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX0RCTF9NQVhfXzsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUgCisgICAgICBsb3dlc3QoKSBub2V4Y2VwdCB7IHJldHVybiAtX19EQkxfTUFYX187IH0KKyNlbmRpZgorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzID0gX19EQkxfTUFOVF9ESUdfXzsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMxMCA9IF9fREJMX0RJR19fOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMAorCSA9IF9fZ2xpYmN4eF9tYXhfZGlnaXRzMTAgKF9fREJMX01BTlRfRElHX18pOworI2VuZGlmCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NpZ25lZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfZXhhY3QgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCByYWRpeCA9IF9fRkxUX1JBRElYX187CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgZG91YmxlIAorICAgICAgZXBzaWxvbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX0RCTF9FUFNJTE9OX187IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBkb3VibGUgCisgICAgICByb3VuZF9lcnJvcigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiAwLjU7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IF9fREJMX01JTl9FWFBfXzsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQxMCA9IF9fREJMX01JTl8xMF9FWFBfXzsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQgPSBfX0RCTF9NQVhfRVhQX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSBfX0RCTF9NQVhfMTBfRVhQX187CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2luZmluaXR5ID0gX19EQkxfSEFTX0lORklOSVRZX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19xdWlldF9OYU4gPSBfX0RCTF9IQVNfUVVJRVRfTkFOX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gaGFzX3F1aWV0X05hTjsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtCisJPSBib29sKF9fREJMX0hBU19ERU5PUk1fXykgPyBkZW5vcm1fcHJlc2VudCA6IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyAKKyAgICAgICAgPSBfX2dsaWJjeHhfZG91YmxlX2hhc19kZW5vcm1fbG9zczsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBkb3VibGUgCisgICAgICBpbmZpbml0eSgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX2J1aWx0aW5faHVnZV92YWwoKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGRvdWJsZSAKKyAgICAgIHF1aWV0X05hTigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX2J1aWx0aW5fbmFuKCIiKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGRvdWJsZSAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19idWlsdGluX25hbnMoIiIpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgZG91YmxlIAorICAgICAgZGVub3JtX21pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX0RCTF9ERU5PUk1fTUlOX187IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pZWM1NTkKKwk9IGhhc19pbmZpbml0eSAmJiBoYXNfcXVpZXRfTmFOICYmIGhhc19kZW5vcm0gPT0gZGVub3JtX3ByZXNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19tb2R1bG8gPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0cmFwcyA9IF9fZ2xpYmN4eF9kb3VibGVfdHJhcHM7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRpbnluZXNzX2JlZm9yZSAKKyAgICAgICA9IF9fZ2xpYmN4eF9kb3VibGVfdGlueW5lc3NfYmVmb3JlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgCisgICAgICAgPSByb3VuZF90b19uZWFyZXN0OworICAgIH07CisKKyN1bmRlZiBfX2dsaWJjeHhfZG91YmxlX2hhc19kZW5vcm1fbG9zcworI3VuZGVmIF9fZ2xpYmN4eF9kb3VibGVfdHJhcHMKKyN1bmRlZiBfX2dsaWJjeHhfZG91YmxlX3RpbnluZXNzX2JlZm9yZQorCisgIC8vLyBudW1lcmljX2xpbWl0czxsb25nIGRvdWJsZT4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8bG9uZyBkb3VibGU+CisgICAgeworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBkb3VibGUgCisgICAgICBtaW4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19MREJMX01JTl9fOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBkb3VibGUgCisgICAgICBtYXgoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19MREJMX01BWF9fOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGF0aWMgY29uc3RleHByIGxvbmcgZG91YmxlIAorICAgICAgbG93ZXN0KCkgbm9leGNlcHQgeyByZXR1cm4gLV9fTERCTF9NQVhfXzsgfQorI2VuZGlmCisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMgPSBfX0xEQkxfTUFOVF9ESUdfXzsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMxMCA9IF9fTERCTF9ESUdfXzsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2RpZ2l0czEwCisJID0gX19nbGliY3h4X21heF9kaWdpdHMxMCAoX19MREJMX01BTlRfRElHX18pOworI2VuZGlmCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NpZ25lZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfZXhhY3QgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCByYWRpeCA9IF9fRkxUX1JBRElYX187CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBkb3VibGUgCisgICAgICBlcHNpbG9uKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIF9fTERCTF9FUFNJTE9OX187IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZSAKKyAgICAgIHJvdW5kX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgcmV0dXJuIDAuNUw7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IF9fTERCTF9NSU5fRVhQX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSBfX0xEQkxfTUlOXzEwX0VYUF9fOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IF9fTERCTF9NQVhfRVhQX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSBfX0xEQkxfTUFYXzEwX0VYUF9fOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IF9fTERCTF9IQVNfSU5GSU5JVFlfXzsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3F1aWV0X05hTiA9IF9fTERCTF9IQVNfUVVJRVRfTkFOX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gaGFzX3F1aWV0X05hTjsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtCisJPSBib29sKF9fTERCTF9IQVNfREVOT1JNX18pID8gZGVub3JtX3ByZXNlbnQgOiBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MKKwk9IF9fZ2xpYmN4eF9sb25nX2RvdWJsZV9oYXNfZGVub3JtX2xvc3M7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBkb3VibGUgCisgICAgICBpbmZpbml0eSgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX2J1aWx0aW5faHVnZV92YWxsKCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZSAKKyAgICAgIHF1aWV0X05hTigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX2J1aWx0aW5fbmFubCgiIik7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZSAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyByZXR1cm4gX19idWlsdGluX25hbnNsKCIiKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlIAorICAgICAgZGVub3JtX21pbigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB7IHJldHVybiBfX0xEQkxfREVOT1JNX01JTl9fOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5CisJPSBoYXNfaW5maW5pdHkgJiYgaGFzX3F1aWV0X05hTiAmJiBoYXNfZGVub3JtID09IGRlbm9ybV9wcmVzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19ib3VuZGVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfbW9kdWxvID0gZmFsc2U7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdHJhcHMgPSBfX2dsaWJjeHhfbG9uZ19kb3VibGVfdHJhcHM7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRpbnluZXNzX2JlZm9yZSA9IAorCQkJCQkgX19nbGliY3h4X2xvbmdfZG91YmxlX3RpbnluZXNzX2JlZm9yZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlID0gCisJCQkJCQkgICAgICByb3VuZF90b19uZWFyZXN0OworICAgIH07CisKKyN1bmRlZiBfX2dsaWJjeHhfbG9uZ19kb3VibGVfaGFzX2Rlbm9ybV9sb3NzCisjdW5kZWYgX19nbGliY3h4X2xvbmdfZG91YmxlX3RyYXBzCisjdW5kZWYgX19nbGliY3h4X2xvbmdfZG91YmxlX3RpbnluZXNzX2JlZm9yZQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyN1bmRlZiBfX2dsaWJjeHhfc2lnbmVkCisjdW5kZWYgX19nbGliY3h4X21pbgorI3VuZGVmIF9fZ2xpYmN4eF9tYXgKKyN1bmRlZiBfX2dsaWJjeHhfZGlnaXRzCisjdW5kZWYgX19nbGliY3h4X2RpZ2l0czEwCisjdW5kZWYgX19nbGliY3h4X21heF9kaWdpdHMxMAorCisjZW5kaWYgLy8gX0dMSUJDWFhfTlVNRVJJQ19MSU1JVFMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvbGlzdCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTYyNTQ5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9saXN0CkBAIC0wLDAgKzEsNzUgQEAKKy8vIDxsaXN0PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgaW5jbHVkZS9saXN0CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0xJU1QKKyNkZWZpbmUgX0dMSUJDWFhfTElTVCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+CisjaW5jbHVkZSA8Yml0cy9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL3JhbmdlX2FjY2Vzcy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2xpc3QuaD4KKyNpbmNsdWRlIDxiaXRzL2xpc3QudGNjPgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyMgaW5jbHVkZSA8ZGVidWcvbGlzdD4KKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfUFJPRklMRQorIyBpbmNsdWRlIDxwcm9maWxlL2xpc3Q+CisjZW5kaWYKKworI2VuZGlmIC8qIF9HTElCQ1hYX0xJU1QgKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9sb2NhbGUgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L2xvY2FsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWViNGYyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9sb2NhbGUKQEAgLTAsMCArMSw0MyBAQAorLy8gTG9jYWxlIHN1cHBvcnQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIyLjEgIExvY2FsZXMKKy8vCisKKy8qKiBAZmlsZSBpbmNsdWRlL2xvY2FsZQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9MT0NBTEUKKyNkZWZpbmUgX0dMSUJDWFhfTE9DQUxFCTEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9sb2NhbGVmd2QuaD4KKyNpbmNsdWRlIDxiaXRzL2xvY2FsZV9jbGFzc2VzLmg+CisjaW5jbHVkZSA8Yml0cy9sb2NhbGVfZmFjZXRzLmg+CisjaW5jbHVkZSA8Yml0cy9sb2NhbGVfZmFjZXRzX25vbmlvLmg+CisKKyNlbmRpZiAvKiBfR0xJQkNYWF9MT0NBTEUgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvbWFwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhN2RkZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvbWFwCkBAIC0wLDAgKzEsNzMgQEAKKy8vIDxtYXA+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBpbmNsdWRlL21hcAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9NQVAKKyNkZWZpbmUgX0dMSUJDWFhfTUFQIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9zdGxfdHJlZS5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX21hcC5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX211bHRpbWFwLmg+CisjaW5jbHVkZSA8Yml0cy9yYW5nZV9hY2Nlc3MuaD4KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjIGluY2x1ZGUgPGRlYnVnL21hcD4KKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfUFJPRklMRQorIyBpbmNsdWRlIDxwcm9maWxlL21hcD4KKyNlbmRpZgorCisjZW5kaWYgLyogX0dMSUJDWFhfTUFQICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L21lbW9yeSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvbWVtb3J5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMjY0NTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L21lbW9yeQpAQCAtMCwwICsxLDkwIEBACisvLyA8bWVtb3J5PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqLworCisvKiogQGZpbGUgaW5jbHVkZS9tZW1vcnkKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfTUVNT1JZCisjZGVmaW5lIF9HTElCQ1hYX01FTU9SWSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworLyoqCisgKiBAZGVmZ3JvdXAgbWVtb3J5IE1lbW9yeQorICogQGluZ3JvdXAgdXRpbGl0aWVzCisgKgorICogQ29tcG9uZW50cyBmb3IgbWVtb3J5IGFsbG9jYXRpb24sIGRlYWxsb2NhdGlvbiwgYW5kIG1hbmFnZW1lbnQuCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgcG9pbnRlcl9hYnN0cmFjdGlvbnMgUG9pbnRlciBBYnN0cmFjdGlvbnMKKyAqIEBpbmdyb3VwIG1lbW9yeQorICoKKyAqIFNtYXJ0IHBvaW50ZXJzLCBldGMuCisgKi8KKworI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+CisjaW5jbHVkZSA8Yml0cy9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9jb25zdHJ1Y3QuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF91bmluaXRpYWxpemVkLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfdGVtcGJ1Zi5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX3Jhd19zdG9yYWdlX2l0ZXIuaD4KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyMgIGluY2x1ZGUgPGV4Y2VwdGlvbj4gICAgICAgIAkgIC8vIHN0ZDo6ZXhjZXB0aW9uCisjICBpbmNsdWRlIDx0eXBlaW5mbz4gICAgICAgICAJICAvLyBzdGQ6OnR5cGVfaW5mbyBpbiBnZXRfZGVsZXRlcgorIyAgaW5jbHVkZSA8aW9zZndkPiAgICAgICAgICAgCSAgLy8gc3RkOjpiYXNpY19vc3RyZWFtCisjICBpbmNsdWRlIDxleHQvYXRvbWljaXR5Lmg+CisjICBpbmNsdWRlIDxleHQvY29uY3VycmVuY2UuaD4KKyMgIGluY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyMgIGluY2x1ZGUgPGJpdHMvc3RsX2Z1bmN0aW9uLmg+ICAvLyBzdGQ6Omxlc3MKKyMgIGluY2x1ZGUgPGJpdHMvdXNlc19hbGxvY2F0b3IuaD4KKyMgIGluY2x1ZGUgPHR5cGVfdHJhaXRzPgorIyAgaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyMgIGluY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisjICBpbmNsdWRlIDxiaXRzL3VuaXF1ZV9wdHIuaD4KKyMgIGluY2x1ZGUgPGJpdHMvc2hhcmVkX3B0ci5oPgorIyAgaWYgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQKKyMgICAgaW5jbHVkZSA8YmFja3dhcmQvYXV0b19wdHIuaD4KKyMgIGVuZGlmCisjZWxzZQorIyAgaW5jbHVkZSA8YmFja3dhcmQvYXV0b19wdHIuaD4KKyNlbmRpZgorCisjZW5kaWYgLyogX0dMSUJDWFhfTUVNT1JZICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L211dGV4IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9tdXRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDkzZDlhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9tdXRleApAQCAtMCwwICsxLDgwNSBAQAorLy8gPG11dGV4PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9tdXRleAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9NVVRFWAorI2RlZmluZSBfR0xJQkNYWF9NVVRFWCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNpbmNsdWRlIDxiaXRzL2d0aHIuaD4KKyNpbmNsdWRlIDxiaXRzL21vdmUuaD4gLy8gZm9yIHN0ZDo6c3dhcAorCisjaWZkZWYgX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworI2lmZGVmIF9HTElCQ1hYX0hBU19HVEhSRUFEUworICAvLyBDb21tb24gYmFzZSBjbGFzcyBmb3Igc3RkOjptdXRleCBhbmQgc3RkOjp0aW1lZF9tdXRleAorICBjbGFzcyBfX211dGV4X2Jhc2UKKyAgeworICBwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiBfX2d0aHJlYWRfbXV0ZXhfdAkJCV9fbmF0aXZlX3R5cGU7CisKKyNpZmRlZiBfX0dUSFJFQURfTVVURVhfSU5JVAorICAgIF9fbmF0aXZlX3R5cGUgIF9NX211dGV4ID0gX19HVEhSRUFEX01VVEVYX0lOSVQ7CisKKyAgICBjb25zdGV4cHIgX19tdXRleF9iYXNlKCkgbm9leGNlcHQgPSBkZWZhdWx0OworI2Vsc2UKKyAgICBfX25hdGl2ZV90eXBlICBfTV9tdXRleDsKKworICAgIF9fbXV0ZXhfYmFzZSgpIG5vZXhjZXB0CisgICAgeworICAgICAgLy8gWFhYIEVBR0FJTiwgRU5PTUVNLCBFUEVSTSwgRUJVU1kobWF5KSwgRUlOVkFMKG1heSkKKyAgICAgIF9fR1RIUkVBRF9NVVRFWF9JTklUX0ZVTkNUSU9OKCZfTV9tdXRleCk7CisgICAgfQorCisgICAgfl9fbXV0ZXhfYmFzZSgpIG5vZXhjZXB0IHsgX19ndGhyZWFkX211dGV4X2Rlc3Ryb3koJl9NX211dGV4KTsgfQorI2VuZGlmCisKKyAgICBfX211dGV4X2Jhc2UoY29uc3QgX19tdXRleF9iYXNlJikgPSBkZWxldGU7CisgICAgX19tdXRleF9iYXNlJiBvcGVyYXRvcj0oY29uc3QgX19tdXRleF9iYXNlJikgPSBkZWxldGU7CisgIH07CisKKyAgLy8gQ29tbW9uIGJhc2UgY2xhc3MgZm9yIHN0ZDo6cmVjdXJzaXZlX211dGV4IGFuZCBzdGQ6OnRpbWVkX3JlY3Vyc2l2ZV9tdXRleAorICBjbGFzcyBfX3JlY3Vyc2l2ZV9tdXRleF9iYXNlCisgIHsKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90CQlfX25hdGl2ZV90eXBlOworCisgICAgX19yZWN1cnNpdmVfbXV0ZXhfYmFzZShjb25zdCBfX3JlY3Vyc2l2ZV9tdXRleF9iYXNlJikgPSBkZWxldGU7CisgICAgX19yZWN1cnNpdmVfbXV0ZXhfYmFzZSYgb3BlcmF0b3I9KGNvbnN0IF9fcmVjdXJzaXZlX211dGV4X2Jhc2UmKSA9IGRlbGV0ZTsKKworI2lmZGVmIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVAorICAgIF9fbmF0aXZlX3R5cGUgIF9NX211dGV4ID0gX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUOworCisgICAgX19yZWN1cnNpdmVfbXV0ZXhfYmFzZSgpID0gZGVmYXVsdDsKKyNlbHNlCisgICAgX19uYXRpdmVfdHlwZSAgX01fbXV0ZXg7CisKKyAgICBfX3JlY3Vyc2l2ZV9tdXRleF9iYXNlKCkKKyAgICB7CisgICAgICAvLyBYWFggRUFHQUlOLCBFTk9NRU0sIEVQRVJNLCBFQlVTWShtYXkpLCBFSU5WQUwobWF5KQorICAgICAgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkNUSU9OKCZfTV9tdXRleCk7CisgICAgfQorCisgICAgfl9fcmVjdXJzaXZlX211dGV4X2Jhc2UoKQorICAgIHsgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9kZXN0cm95KCZfTV9tdXRleCk7IH0KKyNlbmRpZgorICB9OworCisgIC8qKgorICAgKiBAZGVmZ3JvdXAgbXV0ZXhlcyBNdXRleGVzCisgICAqIEBpbmdyb3VwIGNvbmN1cnJlbmN5CisgICAqCisgICAqIENsYXNzZXMgZm9yIG11dGV4IHN1cHBvcnQuCisgICAqIEB7CisgICAqLworCisgIC8vLyBtdXRleAorICBjbGFzcyBtdXRleCA6IHByaXZhdGUgX19tdXRleF9iYXNlCisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgX19uYXRpdmVfdHlwZSogCQkJbmF0aXZlX2hhbmRsZV90eXBlOworCisjaWZkZWYgX19HVEhSRUFEX01VVEVYX0lOSVQKKyAgICBjb25zdGV4cHIKKyNlbmRpZgorICAgIG11dGV4KCkgbm9leGNlcHQgPSBkZWZhdWx0OworICAgIH5tdXRleCgpID0gZGVmYXVsdDsKKworICAgIG11dGV4KGNvbnN0IG11dGV4JikgPSBkZWxldGU7CisgICAgbXV0ZXgmIG9wZXJhdG9yPShjb25zdCBtdXRleCYpID0gZGVsZXRlOworCisgICAgdm9pZAorICAgIGxvY2soKQorICAgIHsKKyAgICAgIGludCBfX2UgPSBfX2d0aHJlYWRfbXV0ZXhfbG9jaygmX01fbXV0ZXgpOworCisgICAgICAvLyBFSU5WQUwsIEVBR0FJTiwgRUJVU1ksIEVJTlZBTCwgRURFQURMSyhtYXkpCisgICAgICBpZiAoX19lKQorCV9fdGhyb3dfc3lzdGVtX2Vycm9yKF9fZSk7CisgICAgfQorCisgICAgYm9vbAorICAgIHRyeV9sb2NrKCkgbm9leGNlcHQKKyAgICB7CisgICAgICAvLyBYWFggRUlOVkFMLCBFQUdBSU4sIEVCVVNZCisgICAgICByZXR1cm4gIV9fZ3RocmVhZF9tdXRleF90cnlsb2NrKCZfTV9tdXRleCk7CisgICAgfQorCisgICAgdm9pZAorICAgIHVubG9jaygpCisgICAgeworICAgICAgLy8gWFhYIEVJTlZBTCwgRUFHQUlOLCBFUEVSTQorICAgICAgX19ndGhyZWFkX211dGV4X3VubG9jaygmX01fbXV0ZXgpOworICAgIH0KKworICAgIG5hdGl2ZV9oYW5kbGVfdHlwZQorICAgIG5hdGl2ZV9oYW5kbGUoKQorICAgIHsgcmV0dXJuICZfTV9tdXRleDsgfQorICB9OworCisgIC8vLyByZWN1cnNpdmVfbXV0ZXgKKyAgY2xhc3MgcmVjdXJzaXZlX211dGV4IDogcHJpdmF0ZSBfX3JlY3Vyc2l2ZV9tdXRleF9iYXNlCisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgX19uYXRpdmVfdHlwZSogCQkJbmF0aXZlX2hhbmRsZV90eXBlOworCisgICAgcmVjdXJzaXZlX211dGV4KCkgPSBkZWZhdWx0OworICAgIH5yZWN1cnNpdmVfbXV0ZXgoKSA9IGRlZmF1bHQ7CisKKyAgICByZWN1cnNpdmVfbXV0ZXgoY29uc3QgcmVjdXJzaXZlX211dGV4JikgPSBkZWxldGU7CisgICAgcmVjdXJzaXZlX211dGV4JiBvcGVyYXRvcj0oY29uc3QgcmVjdXJzaXZlX211dGV4JikgPSBkZWxldGU7CisKKyAgICB2b2lkCisgICAgbG9jaygpCisgICAgeworICAgICAgaW50IF9fZSA9IF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfbG9jaygmX01fbXV0ZXgpOworCisgICAgICAvLyBFSU5WQUwsIEVBR0FJTiwgRUJVU1ksIEVJTlZBTCwgRURFQURMSyhtYXkpCisgICAgICBpZiAoX19lKQorCV9fdGhyb3dfc3lzdGVtX2Vycm9yKF9fZSk7CisgICAgfQorCisgICAgYm9vbAorICAgIHRyeV9sb2NrKCkgbm9leGNlcHQKKyAgICB7CisgICAgICAvLyBYWFggRUlOVkFMLCBFQUdBSU4sIEVCVVNZCisgICAgICByZXR1cm4gIV9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdHJ5bG9jaygmX01fbXV0ZXgpOworICAgIH0KKworICAgIHZvaWQKKyAgICB1bmxvY2soKQorICAgIHsKKyAgICAgIC8vIFhYWCBFSU5WQUwsIEVBR0FJTiwgRUJVU1kKKyAgICAgIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdW5sb2NrKCZfTV9tdXRleCk7CisgICAgfQorCisgICAgbmF0aXZlX2hhbmRsZV90eXBlCisgICAgbmF0aXZlX2hhbmRsZSgpCisgICAgeyByZXR1cm4gJl9NX211dGV4OyB9CisgIH07CisKKyNpZiBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLCisgIC8vLyB0aW1lZF9tdXRleAorICBjbGFzcyB0aW1lZF9tdXRleCA6IHByaXZhdGUgX19tdXRleF9iYXNlCisgIHsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQ0xPQ0tfTU9OT1RPTklDCisgICAgdHlwZWRlZiBjaHJvbm86OnN0ZWFkeV9jbG9jayAJICAJX19jbG9ja190OworI2Vsc2UKKyAgICB0eXBlZGVmIGNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrIAlfX2Nsb2NrX3Q7CisjZW5kaWYKKworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfX25hdGl2ZV90eXBlKiAJCSAgCW5hdGl2ZV9oYW5kbGVfdHlwZTsKKworICAgIHRpbWVkX211dGV4KCkgPSBkZWZhdWx0OworICAgIH50aW1lZF9tdXRleCgpID0gZGVmYXVsdDsKKworICAgIHRpbWVkX211dGV4KGNvbnN0IHRpbWVkX211dGV4JikgPSBkZWxldGU7CisgICAgdGltZWRfbXV0ZXgmIG9wZXJhdG9yPShjb25zdCB0aW1lZF9tdXRleCYpID0gZGVsZXRlOworCisgICAgdm9pZAorICAgIGxvY2soKQorICAgIHsKKyAgICAgIGludCBfX2UgPSBfX2d0aHJlYWRfbXV0ZXhfbG9jaygmX01fbXV0ZXgpOworCisgICAgICAvLyBFSU5WQUwsIEVBR0FJTiwgRUJVU1ksIEVJTlZBTCwgRURFQURMSyhtYXkpCisgICAgICBpZiAoX19lKQorCV9fdGhyb3dfc3lzdGVtX2Vycm9yKF9fZSk7CisgICAgfQorCisgICAgYm9vbAorICAgIHRyeV9sb2NrKCkgbm9leGNlcHQKKyAgICB7CisgICAgICAvLyBYWFggRUlOVkFMLCBFQUdBSU4sIEVCVVNZCisgICAgICByZXR1cm4gIV9fZ3RocmVhZF9tdXRleF90cnlsb2NrKCZfTV9tdXRleCk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9SZXAsIGNsYXNzIF9QZXJpb2Q+CisgICAgICBib29sCisgICAgICB0cnlfbG9ja19mb3IoY29uc3QgY2hyb25vOjpkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19ydGltZSkKKyAgICAgIHsgcmV0dXJuIF9NX3RyeV9sb2NrX2ZvcihfX3J0aW1lKTsgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uPgorICAgICAgYm9vbAorICAgICAgdHJ5X2xvY2tfdW50aWwoY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX19hdGltZSkKKyAgICAgIHsgcmV0dXJuIF9NX3RyeV9sb2NrX3VudGlsKF9fYXRpbWUpOyB9CisKKyAgICB2b2lkCisgICAgdW5sb2NrKCkKKyAgICB7CisgICAgICAvLyBYWFggRUlOVkFMLCBFQUdBSU4sIEVCVVNZCisgICAgICBfX2d0aHJlYWRfbXV0ZXhfdW5sb2NrKCZfTV9tdXRleCk7CisgICAgfQorCisgICAgbmF0aXZlX2hhbmRsZV90eXBlCisgICAgbmF0aXZlX2hhbmRsZSgpCisgICAgeyByZXR1cm4gJl9NX211dGV4OyB9CisKKyAgcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kPgorICAgICAgYm9vbAorICAgICAgX01fdHJ5X2xvY2tfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcnRpbWUpCisgICAgICB7CisJYXV0byBfX3J0ID0gY2hyb25vOjpkdXJhdGlvbl9jYXN0PF9fY2xvY2tfdDo6ZHVyYXRpb24+KF9fcnRpbWUpOworCWlmIChyYXRpb19ncmVhdGVyPF9fY2xvY2tfdDo6cGVyaW9kLCBfUGVyaW9kPigpKQorCSAgKytfX3J0OworCisJcmV0dXJuIF9NX3RyeV9sb2NrX3VudGlsKF9fY2xvY2tfdDo6bm93KCkgKyBfX3J0KTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9EdXJhdGlvbj4KKyAgICAgIGJvb2wKKyAgICAgIF9NX3RyeV9sb2NrX3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfX2Nsb2NrX3QsCisJCQkJCQkgX0R1cmF0aW9uPiYgX19hdGltZSkKKyAgICAgIHsKKwljaHJvbm86OnRpbWVfcG9pbnQ8X19jbG9ja190LCBjaHJvbm86OnNlY29uZHM+IF9fcyA9CisJICBjaHJvbm86OnRpbWVfcG9pbnRfY2FzdDxjaHJvbm86OnNlY29uZHM+KF9fYXRpbWUpOworCisJY2hyb25vOjpuYW5vc2Vjb25kcyBfX25zID0KKwkgIGNocm9ubzo6ZHVyYXRpb25fY2FzdDxjaHJvbm86Om5hbm9zZWNvbmRzPihfX2F0aW1lIC0gX19zKTsKKworCV9fZ3RocmVhZF90aW1lX3QgX190cyA9IHsKKwkgIHN0YXRpY19jYXN0PHN0ZDo6dGltZV90PihfX3MudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkpLAorCSAgc3RhdGljX2Nhc3Q8bG9uZz4oX19ucy5jb3VudCgpKQorCX07CisKKwlyZXR1cm4gIV9fZ3RocmVhZF9tdXRleF90aW1lZGxvY2sobmF0aXZlX2hhbmRsZSgpLCAmX190cyk7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXJhdGlvbj4KKyAgICAgIGJvb2wKKyAgICAgIF9NX3RyeV9sb2NrX3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYXRpbWUpCisgICAgICB7IHJldHVybiBfTV90cnlfbG9ja19mb3IoX19hdGltZSAtIF9DbG9jazo6bm93KCkpOyB9CisgIH07CisKKyAgLy8vIHJlY3Vyc2l2ZV90aW1lZF9tdXRleAorICBjbGFzcyByZWN1cnNpdmVfdGltZWRfbXV0ZXggOiBwcml2YXRlIF9fcmVjdXJzaXZlX211dGV4X2Jhc2UKKyAgeworI2lmZGVmIF9HTElCQ1hYX1VTRV9DTE9DS19NT05PVE9OSUMKKyAgICB0eXBlZGVmIGNocm9ubzo6c3RlYWR5X2Nsb2NrIAkJX19jbG9ja190OworI2Vsc2UKKyAgICB0eXBlZGVmIGNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrIAlfX2Nsb2NrX3Q7CisjZW5kaWYKKworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfX25hdGl2ZV90eXBlKiAJCQluYXRpdmVfaGFuZGxlX3R5cGU7CisKKyAgICByZWN1cnNpdmVfdGltZWRfbXV0ZXgoKSA9IGRlZmF1bHQ7CisgICAgfnJlY3Vyc2l2ZV90aW1lZF9tdXRleCgpID0gZGVmYXVsdDsKKworICAgIHJlY3Vyc2l2ZV90aW1lZF9tdXRleChjb25zdCByZWN1cnNpdmVfdGltZWRfbXV0ZXgmKSA9IGRlbGV0ZTsKKyAgICByZWN1cnNpdmVfdGltZWRfbXV0ZXgmIG9wZXJhdG9yPShjb25zdCByZWN1cnNpdmVfdGltZWRfbXV0ZXgmKSA9IGRlbGV0ZTsKKworICAgIHZvaWQKKyAgICBsb2NrKCkKKyAgICB7CisgICAgICBpbnQgX19lID0gX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9sb2NrKCZfTV9tdXRleCk7CisKKyAgICAgIC8vIEVJTlZBTCwgRUFHQUlOLCBFQlVTWSwgRUlOVkFMLCBFREVBRExLKG1heSkKKyAgICAgIGlmIChfX2UpCisJX190aHJvd19zeXN0ZW1fZXJyb3IoX19lKTsKKyAgICB9CisKKyAgICBib29sCisgICAgdHJ5X2xvY2soKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIC8vIFhYWCBFSU5WQUwsIEVBR0FJTiwgRUJVU1kKKyAgICAgIHJldHVybiAhX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90cnlsb2NrKCZfTV9tdXRleCk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9SZXAsIGNsYXNzIF9QZXJpb2Q+CisgICAgICBib29sCisgICAgICB0cnlfbG9ja19mb3IoY29uc3QgY2hyb25vOjpkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19ydGltZSkKKyAgICAgIHsgcmV0dXJuIF9NX3RyeV9sb2NrX2ZvcihfX3J0aW1lKTsgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uPgorICAgICAgYm9vbAorICAgICAgdHJ5X2xvY2tfdW50aWwoY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX19hdGltZSkKKyAgICAgIHsgcmV0dXJuIF9NX3RyeV9sb2NrX3VudGlsKF9fYXRpbWUpOyB9CisKKyAgICB2b2lkCisgICAgdW5sb2NrKCkKKyAgICB7CisgICAgICAvLyBYWFggRUlOVkFMLCBFQUdBSU4sIEVCVVNZCisgICAgICBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3VubG9jaygmX01fbXV0ZXgpOworICAgIH0KKworICAgIG5hdGl2ZV9oYW5kbGVfdHlwZQorICAgIG5hdGl2ZV9oYW5kbGUoKQorICAgIHsgcmV0dXJuICZfTV9tdXRleDsgfQorCisgIHByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcCwgdHlwZW5hbWUgX1BlcmlvZD4KKyAgICAgIGJvb2wKKyAgICAgIF9NX3RyeV9sb2NrX2Zvcihjb25zdCBjaHJvbm86OmR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX3J0aW1lKQorICAgICAgeworCWF1dG8gX19ydCA9IGNocm9ubzo6ZHVyYXRpb25fY2FzdDxfX2Nsb2NrX3Q6OmR1cmF0aW9uPihfX3J0aW1lKTsKKwlpZiAocmF0aW9fZ3JlYXRlcjxfX2Nsb2NrX3Q6OnBlcmlvZCwgX1BlcmlvZD4oKSkKKwkgICsrX19ydDsKKworCXJldHVybiBfTV90cnlfbG9ja191bnRpbChfX2Nsb2NrX3Q6Om5vdygpICsgX19ydCk7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRHVyYXRpb24+CisgICAgICBib29sCisgICAgICBfTV90cnlfbG9ja191bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X19jbG9ja190LAorCQkJCQkJIF9EdXJhdGlvbj4mIF9fYXRpbWUpCisgICAgICB7CisJY2hyb25vOjp0aW1lX3BvaW50PF9fY2xvY2tfdCwgY2hyb25vOjpzZWNvbmRzPiBfX3MgPQorCSAgY2hyb25vOjp0aW1lX3BvaW50X2Nhc3Q8Y2hyb25vOjpzZWNvbmRzPihfX2F0aW1lKTsKKworCWNocm9ubzo6bmFub3NlY29uZHMgX19ucyA9CisJICBjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8Y2hyb25vOjpuYW5vc2Vjb25kcz4oX19hdGltZSAtIF9fcyk7CisKKwlfX2d0aHJlYWRfdGltZV90IF9fdHMgPSB7CisJICBzdGF0aWNfY2FzdDxzdGQ6OnRpbWVfdD4oX19zLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKSwKKwkgIHN0YXRpY19jYXN0PGxvbmc+KF9fbnMuY291bnQoKSkKKwl9OworCisJcmV0dXJuICFfX2d0aHJlYWRfbXV0ZXhfdGltZWRsb2NrKG5hdGl2ZV9oYW5kbGUoKSwgJl9fdHMpOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Nsb2NrLCB0eXBlbmFtZSBfRHVyYXRpb24+CisgICAgICBib29sCisgICAgICBfTV90cnlfbG9ja191bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX2F0aW1lKQorICAgICAgeyByZXR1cm4gX01fdHJ5X2xvY2tfZm9yKF9fYXRpbWUgLSBfQ2xvY2s6Om5vdygpKTsgfQorICB9OworI2VuZGlmCisjZW5kaWYgLy8gX0dMSUJDWFhfSEFTX0dUSFJFQURTCisKKyAgLy8vIERvIG5vdCBhY3F1aXJlIG93bmVyc2hpcCBvZiB0aGUgbXV0ZXguCisgIHN0cnVjdCBkZWZlcl9sb2NrX3QgeyB9OworCisgIC8vLyBUcnkgdG8gYWNxdWlyZSBvd25lcnNoaXAgb2YgdGhlIG11dGV4IHdpdGhvdXQgYmxvY2tpbmcuCisgIHN0cnVjdCB0cnlfdG9fbG9ja190IHsgfTsKKworICAvLy8gQXNzdW1lIHRoZSBjYWxsaW5nIHRocmVhZCBoYXMgYWxyZWFkeSBvYnRhaW5lZCBtdXRleCBvd25lcnNoaXAKKyAgLy8vIGFuZCBtYW5hZ2UgaXQuCisgIHN0cnVjdCBhZG9wdF9sb2NrX3QgeyB9OworCisgIGNvbnN0ZXhwciBkZWZlcl9sb2NrX3QJZGVmZXJfbG9jayB7IH07CisgIGNvbnN0ZXhwciB0cnlfdG9fbG9ja190CXRyeV90b19sb2NrIHsgfTsKKyAgY29uc3RleHByIGFkb3B0X2xvY2tfdAlhZG9wdF9sb2NrIHsgfTsKKworICAvLy8gQGJyaWVmICBTY29wZWQgbG9jayBpZGlvbS4KKyAgLy8gQWNxdWlyZSB0aGUgbXV0ZXggaGVyZSB3aXRoIGEgY29uc3RydWN0b3IgY2FsbCwgdGhlbiByZWxlYXNlIHdpdGgKKyAgLy8gdGhlIGRlc3RydWN0b3IgY2FsbCBpbiBhY2NvcmRhbmNlIHdpdGggUkFJSSBzdHlsZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX011dGV4PgorICAgIGNsYXNzIGxvY2tfZ3VhcmQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfTXV0ZXggbXV0ZXhfdHlwZTsKKworICAgICAgZXhwbGljaXQgbG9ja19ndWFyZChtdXRleF90eXBlJiBfX20pIDogX01fZGV2aWNlKF9fbSkKKyAgICAgIHsgX01fZGV2aWNlLmxvY2soKTsgfQorCisgICAgICBsb2NrX2d1YXJkKG11dGV4X3R5cGUmIF9fbSwgYWRvcHRfbG9ja190KSA6IF9NX2RldmljZShfX20pCisgICAgICB7IH0gLy8gY2FsbGluZyB0aHJlYWQgb3ducyBtdXRleAorCisgICAgICB+bG9ja19ndWFyZCgpCisgICAgICB7IF9NX2RldmljZS51bmxvY2soKTsgfQorCisgICAgICBsb2NrX2d1YXJkKGNvbnN0IGxvY2tfZ3VhcmQmKSA9IGRlbGV0ZTsKKyAgICAgIGxvY2tfZ3VhcmQmIG9wZXJhdG9yPShjb25zdCBsb2NrX2d1YXJkJikgPSBkZWxldGU7CisKKyAgICBwcml2YXRlOgorICAgICAgbXV0ZXhfdHlwZSYgIF9NX2RldmljZTsKKyAgICB9OworCisgIC8vLyB1bmlxdWVfbG9jaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTXV0ZXg+CisgICAgY2xhc3MgdW5pcXVlX2xvY2sKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfTXV0ZXggbXV0ZXhfdHlwZTsKKworICAgICAgdW5pcXVlX2xvY2soKSBub2V4Y2VwdAorICAgICAgOiBfTV9kZXZpY2UoMCksIF9NX293bnMoZmFsc2UpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQgdW5pcXVlX2xvY2sobXV0ZXhfdHlwZSYgX19tKQorICAgICAgOiBfTV9kZXZpY2UoJl9fbSksIF9NX293bnMoZmFsc2UpCisgICAgICB7CisJbG9jaygpOworCV9NX293bnMgPSB0cnVlOworICAgICAgfQorCisgICAgICB1bmlxdWVfbG9jayhtdXRleF90eXBlJiBfX20sIGRlZmVyX2xvY2tfdCkgbm9leGNlcHQKKyAgICAgIDogX01fZGV2aWNlKCZfX20pLCBfTV9vd25zKGZhbHNlKQorICAgICAgeyB9CisKKyAgICAgIHVuaXF1ZV9sb2NrKG11dGV4X3R5cGUmIF9fbSwgdHJ5X3RvX2xvY2tfdCkKKyAgICAgIDogX01fZGV2aWNlKCZfX20pLCBfTV9vd25zKF9NX2RldmljZS0+dHJ5X2xvY2soKSkKKyAgICAgIHsgfQorCisgICAgICB1bmlxdWVfbG9jayhtdXRleF90eXBlJiBfX20sIGFkb3B0X2xvY2tfdCkKKyAgICAgIDogX01fZGV2aWNlKCZfX20pLCBfTV9vd25zKHRydWUpCisgICAgICB7CisJLy8gWFhYIGNhbGxpbmcgdGhyZWFkIG93bnMgbXV0ZXgKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Nsb2NrLCB0eXBlbmFtZSBfRHVyYXRpb24+CisJdW5pcXVlX2xvY2sobXV0ZXhfdHlwZSYgX19tLAorCQkgICAgY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX19hdGltZSkKKwk6IF9NX2RldmljZSgmX19tKSwgX01fb3ducyhfTV9kZXZpY2UtPnRyeV9sb2NrX3VudGlsKF9fYXRpbWUpKQorCXsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kPgorCXVuaXF1ZV9sb2NrKG11dGV4X3R5cGUmIF9fbSwKKwkJICAgIGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcnRpbWUpCisJOiBfTV9kZXZpY2UoJl9fbSksIF9NX293bnMoX01fZGV2aWNlLT50cnlfbG9ja19mb3IoX19ydGltZSkpCisJeyB9CisKKyAgICAgIH51bmlxdWVfbG9jaygpCisgICAgICB7CisJaWYgKF9NX293bnMpCisJICB1bmxvY2soKTsKKyAgICAgIH0KKworICAgICAgdW5pcXVlX2xvY2soY29uc3QgdW5pcXVlX2xvY2smKSA9IGRlbGV0ZTsKKyAgICAgIHVuaXF1ZV9sb2NrJiBvcGVyYXRvcj0oY29uc3QgdW5pcXVlX2xvY2smKSA9IGRlbGV0ZTsKKworICAgICAgdW5pcXVlX2xvY2sodW5pcXVlX2xvY2smJiBfX3UpIG5vZXhjZXB0CisgICAgICA6IF9NX2RldmljZShfX3UuX01fZGV2aWNlKSwgX01fb3ducyhfX3UuX01fb3ducykKKyAgICAgIHsKKwlfX3UuX01fZGV2aWNlID0gMDsKKwlfX3UuX01fb3ducyA9IGZhbHNlOworICAgICAgfQorCisgICAgICB1bmlxdWVfbG9jayYgb3BlcmF0b3I9KHVuaXF1ZV9sb2NrJiYgX191KSBub2V4Y2VwdAorICAgICAgeworCWlmKF9NX293bnMpCisJICB1bmxvY2soKTsKKworCXVuaXF1ZV9sb2NrKHN0ZDo6bW92ZShfX3UpKS5zd2FwKCp0aGlzKTsKKworCV9fdS5fTV9kZXZpY2UgPSAwOworCV9fdS5fTV9vd25zID0gZmFsc2U7CisKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGxvY2soKQorICAgICAgeworCWlmICghX01fZGV2aWNlKQorCSAgX190aHJvd19zeXN0ZW1fZXJyb3IoaW50KGVycmM6Om9wZXJhdGlvbl9ub3RfcGVybWl0dGVkKSk7CisJZWxzZSBpZiAoX01fb3ducykKKwkgIF9fdGhyb3dfc3lzdGVtX2Vycm9yKGludChlcnJjOjpyZXNvdXJjZV9kZWFkbG9ja193b3VsZF9vY2N1cikpOworCWVsc2UKKwkgIHsKKwkgICAgX01fZGV2aWNlLT5sb2NrKCk7CisJICAgIF9NX293bnMgPSB0cnVlOworCSAgfQorICAgICAgfQorCisgICAgICBib29sCisgICAgICB0cnlfbG9jaygpCisgICAgICB7CisJaWYgKCFfTV9kZXZpY2UpCisJICBfX3Rocm93X3N5c3RlbV9lcnJvcihpbnQoZXJyYzo6b3BlcmF0aW9uX25vdF9wZXJtaXR0ZWQpKTsKKwllbHNlIGlmIChfTV9vd25zKQorCSAgX190aHJvd19zeXN0ZW1fZXJyb3IoaW50KGVycmM6OnJlc291cmNlX2RlYWRsb2NrX3dvdWxkX29jY3VyKSk7CisJZWxzZQorCSAgeworCSAgICBfTV9vd25zID0gX01fZGV2aWNlLT50cnlfbG9jaygpOworCSAgICByZXR1cm4gX01fb3duczsKKwkgIH0KKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Nsb2NrLCB0eXBlbmFtZSBfRHVyYXRpb24+CisJYm9vbAorCXRyeV9sb2NrX3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYXRpbWUpCisJeworCSAgaWYgKCFfTV9kZXZpY2UpCisJICAgIF9fdGhyb3dfc3lzdGVtX2Vycm9yKGludChlcnJjOjpvcGVyYXRpb25fbm90X3Blcm1pdHRlZCkpOworCSAgZWxzZSBpZiAoX01fb3ducykKKwkgICAgX190aHJvd19zeXN0ZW1fZXJyb3IoaW50KGVycmM6OnJlc291cmNlX2RlYWRsb2NrX3dvdWxkX29jY3VyKSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfTV9vd25zID0gX01fZGV2aWNlLT50cnlfbG9ja191bnRpbChfX2F0aW1lKTsKKwkgICAgICByZXR1cm4gX01fb3duczsKKwkgICAgfQorCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcCwgdHlwZW5hbWUgX1BlcmlvZD4KKwlib29sCisJdHJ5X2xvY2tfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcnRpbWUpCisJeworCSAgaWYgKCFfTV9kZXZpY2UpCisJICAgIF9fdGhyb3dfc3lzdGVtX2Vycm9yKGludChlcnJjOjpvcGVyYXRpb25fbm90X3Blcm1pdHRlZCkpOworCSAgZWxzZSBpZiAoX01fb3ducykKKwkgICAgX190aHJvd19zeXN0ZW1fZXJyb3IoaW50KGVycmM6OnJlc291cmNlX2RlYWRsb2NrX3dvdWxkX29jY3VyKSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfTV9vd25zID0gX01fZGV2aWNlLT50cnlfbG9ja19mb3IoX19ydGltZSk7CisJICAgICAgcmV0dXJuIF9NX293bnM7CisJICAgIH0KKwkgfQorCisgICAgICB2b2lkCisgICAgICB1bmxvY2soKQorICAgICAgeworCWlmICghX01fb3ducykKKwkgIF9fdGhyb3dfc3lzdGVtX2Vycm9yKGludChlcnJjOjpvcGVyYXRpb25fbm90X3Blcm1pdHRlZCkpOworCWVsc2UgaWYgKF9NX2RldmljZSkKKwkgIHsKKwkgICAgX01fZGV2aWNlLT51bmxvY2soKTsKKwkgICAgX01fb3ducyA9IGZhbHNlOworCSAgfQorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHVuaXF1ZV9sb2NrJiBfX3UpIG5vZXhjZXB0CisgICAgICB7CisJc3RkOjpzd2FwKF9NX2RldmljZSwgX191Ll9NX2RldmljZSk7CisJc3RkOjpzd2FwKF9NX293bnMsIF9fdS5fTV9vd25zKTsKKyAgICAgIH0KKworICAgICAgbXV0ZXhfdHlwZSoKKyAgICAgIHJlbGVhc2UoKSBub2V4Y2VwdAorICAgICAgeworCW11dGV4X3R5cGUqIF9fcmV0ID0gX01fZGV2aWNlOworCV9NX2RldmljZSA9IDA7CisJX01fb3ducyA9IGZhbHNlOworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgb3duc19sb2NrKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX293bnM7IH0KKworICAgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBvd25zX2xvY2soKTsgfQorCisgICAgICBtdXRleF90eXBlKgorICAgICAgbXV0ZXgoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX01fZGV2aWNlOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgbXV0ZXhfdHlwZSoJX01fZGV2aWNlOworICAgICAgYm9vbAkJX01fb3duczsgLy8gWFhYIHVzZSBhdG9taWNfYm9vbAorICAgIH07CisKKyAgLy8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yIHVuaXF1ZV9sb2NrIG9iamVjdHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9NdXRleD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5pcXVlX2xvY2s8X011dGV4PiYgX194LCB1bmlxdWVfbG9jazxfTXV0ZXg+JiBfX3kpIG5vZXhjZXB0CisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8aW50IF9JZHg+CisgICAgc3RydWN0IF9fdW5sb2NrX2ltcGwKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfTG9jaz4KKwlzdGF0aWMgdm9pZAorCV9fZG9fdW5sb2NrKHR1cGxlPF9Mb2NrJi4uLj4mIF9fbG9ja3MpCisJeworCSAgc3RkOjpnZXQ8X0lkeD4oX19sb2NrcykudW5sb2NrKCk7CisJICBfX3VubG9ja19pbXBsPF9JZHggLSAxPjo6X19kb191bmxvY2soX19sb2Nrcyk7CisJfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3VubG9ja19pbXBsPC0xPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9Mb2NrPgorCXN0YXRpYyB2b2lkCisJX19kb191bmxvY2sodHVwbGU8X0xvY2smLi4uPiYpCisJeyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTG9jaz4KKyAgICB1bmlxdWVfbG9jazxfTG9jaz4KKyAgICBfX3RyeV90b19sb2NrKF9Mb2NrJiBfX2wpCisgICAgeyByZXR1cm4gdW5pcXVlX2xvY2s8X0xvY2s+KF9fbCwgdHJ5X3RvX2xvY2spOyB9CisKKyAgdGVtcGxhdGU8aW50IF9JZHgsIGJvb2wgX0NvbnRpbnVlID0gdHJ1ZT4KKyAgICBzdHJ1Y3QgX190cnlfbG9ja19pbXBsCisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0xvY2s+CisJc3RhdGljIHZvaWQKKwlfX2RvX3RyeV9sb2NrKHR1cGxlPF9Mb2NrJi4uLj4mIF9fbG9ja3MsIGludCYgX19pZHgpCisJeworICAgICAgICAgIF9faWR4ID0gX0lkeDsKKyAgICAgICAgICBhdXRvIF9fbG9jayA9IF9fdHJ5X3RvX2xvY2soc3RkOjpnZXQ8X0lkeD4oX19sb2NrcykpOworICAgICAgICAgIGlmIChfX2xvY2sub3duc19sb2NrKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fdHJ5X2xvY2tfaW1wbDxfSWR4ICsgMSwgX0lkeCArIDIgPCBzaXplb2YuLi4oX0xvY2spPjo6CisgICAgICAgICAgICAgICAgX19kb190cnlfbG9jayhfX2xvY2tzLCBfX2lkeCk7CisgICAgICAgICAgICAgIGlmIChfX2lkeCA9PSAtMSkKKyAgICAgICAgICAgICAgICBfX2xvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgfQorCX0KKyAgICB9OworCisgIHRlbXBsYXRlPGludCBfSWR4PgorICAgIHN0cnVjdCBfX3RyeV9sb2NrX2ltcGw8X0lkeCwgZmFsc2U+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0xvY2s+CisJc3RhdGljIHZvaWQKKwlfX2RvX3RyeV9sb2NrKHR1cGxlPF9Mb2NrJi4uLj4mIF9fbG9ja3MsIGludCYgX19pZHgpCisJeworICAgICAgICAgIF9faWR4ID0gX0lkeDsKKyAgICAgICAgICBhdXRvIF9fbG9jayA9IF9fdHJ5X3RvX2xvY2soc3RkOjpnZXQ8X0lkeD4oX19sb2NrcykpOworICAgICAgICAgIGlmIChfX2xvY2sub3duc19sb2NrKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9faWR4ID0gLTE7CisgICAgICAgICAgICAgIF9fbG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisJfQorICAgIH07CisKKyAgLyoqIEBicmllZiBHZW5lcmljIHRyeV9sb2NrLgorICAgKiAgQHBhcmFtIF9fbDEgTWVldHMgTXV0ZXggcmVxdWlyZW1lbnRzICh0cnlfbG9jaygpIG1heSB0aHJvdykuCisgICAqICBAcGFyYW0gX19sMiBNZWV0cyBNdXRleCByZXF1aXJlbWVudHMgKHRyeV9sb2NrKCkgbWF5IHRocm93KS4KKyAgICogIEBwYXJhbSBfX2wzIE1lZXRzIE11dGV4IHJlcXVpcmVtZW50cyAodHJ5X2xvY2soKSBtYXkgdGhyb3cpLgorICAgKiAgQHJldHVybiBSZXR1cm5zIC0xIGlmIGFsbCB0cnlfbG9jaygpIGNhbGxzIHJldHVybiB0cnVlLiBPdGhlcndpc2UgcmV0dXJucworICAgKiAgICAgICAgICBhIDAtYmFzZWQgaW5kZXggY29ycmVzcG9uZGluZyB0byB0aGUgYXJndW1lbnQgdGhhdCByZXR1cm5lZCBmYWxzZS4KKyAgICogIEBwb3N0IEVpdGhlciBhbGwgYXJndW1lbnRzIGFyZSBsb2NrZWQsIG9yIG5vbmUgd2lsbCBiZS4KKyAgICoKKyAgICogIFNlcXVlbnRpYWxseSBjYWxscyB0cnlfbG9jaygpIG9uIGVhY2ggYXJndW1lbnQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTG9jazEsIHR5cGVuYW1lIF9Mb2NrMiwgdHlwZW5hbWUuLi4gX0xvY2szPgorICAgIGludAorICAgIHRyeV9sb2NrKF9Mb2NrMSYgX19sMSwgX0xvY2syJiBfX2wyLCBfTG9jazMmLi4uIF9fbDMpCisgICAgeworICAgICAgaW50IF9faWR4OworICAgICAgYXV0byBfX2xvY2tzID0gc3RkOjp0aWUoX19sMSwgX19sMiwgX19sMy4uLik7CisgICAgICBfX3RyeQorICAgICAgeyBfX3RyeV9sb2NrX2ltcGw8MD46Ol9fZG9fdHJ5X2xvY2soX19sb2NrcywgX19pZHgpOyB9CisgICAgICBfX2NhdGNoKC4uLikKKyAgICAgIHsgfQorICAgICAgcmV0dXJuIF9faWR4OworICAgIH0KKworICAvKiogQGJyaWVmIEdlbmVyaWMgbG9jay4KKyAgICogIEBwYXJhbSBfX2wxIE1lZXRzIE11dGV4IHJlcXVpcmVtZW50cyAodHJ5X2xvY2soKSBtYXkgdGhyb3cpLgorICAgKiAgQHBhcmFtIF9fbDIgTWVldHMgTXV0ZXggcmVxdWlyZW1lbnRzICh0cnlfbG9jaygpIG1heSB0aHJvdykuCisgICAqICBAcGFyYW0gX19sMyBNZWV0cyBNdXRleCByZXF1aXJlbWVudHMgKHRyeV9sb2NrKCkgbWF5IHRocm93KS4KKyAgICogIEB0aHJvdyBBbiBleGNlcHRpb24gdGhyb3duIGJ5IGFuIGFyZ3VtZW50J3MgbG9jaygpIG9yIHRyeV9sb2NrKCkgbWVtYmVyLgorICAgKiAgQHBvc3QgQWxsIGFyZ3VtZW50cyBhcmUgbG9ja2VkLgorICAgKgorICAgKiAgQWxsIGFyZ3VtZW50cyBhcmUgbG9ja2VkIHZpYSBhIHNlcXVlbmNlIG9mIGNhbGxzIHRvIGxvY2soKSwgdHJ5X2xvY2soKQorICAgKiAgYW5kIHVubG9jaygpLiAgSWYgdGhlIGNhbGwgZXhpdHMgdmlhIGFuIGV4Y2VwdGlvbiBhbnkgbG9ja3MgdGhhdCB3ZXJlCisgICAqICBvYnRhaW5lZCB3aWxsIGJlIHJlbGVhc2VkLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0wxLCB0eXBlbmFtZSBfTDIsIHR5cGVuYW1lIC4uLl9MMz4KKyAgICB2b2lkCisgICAgbG9jayhfTDEmIF9fbDEsIF9MMiYgX19sMiwgX0wzJi4uLiBfX2wzKQorICAgIHsKKyAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgdW5pcXVlX2xvY2s8X0wxPiBfX2ZpcnN0KF9fbDEpOworICAgICAgICAgIGludCBfX2lkeDsKKyAgICAgICAgICBhdXRvIF9fbG9ja3MgPSBzdGQ6OnRpZShfX2wyLCBfX2wzLi4uKTsKKyAgICAgICAgICBfX3RyeV9sb2NrX2ltcGw8MCwgc2l6ZW9mLi4uKF9MMyk+OjpfX2RvX3RyeV9sb2NrKF9fbG9ja3MsIF9faWR4KTsKKyAgICAgICAgICBpZiAoX19pZHggPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fZmlyc3QucmVsZWFzZSgpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBfR0xJQkNYWF9IQVNfR1RIUkVBRFMKKyAgLy8vIG9uY2VfZmxhZworICBzdHJ1Y3Qgb25jZV9mbGFnCisgIHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIF9fZ3RocmVhZF9vbmNlX3QgX19uYXRpdmVfdHlwZTsKKyAgICBfX25hdGl2ZV90eXBlICBfTV9vbmNlID0gX19HVEhSRUFEX09OQ0VfSU5JVDsKKworICBwdWJsaWM6CisgICAgLy8vIENvbnN0cnVjdG9yCisgICAgY29uc3RleHByIG9uY2VfZmxhZygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKworICAgIC8vLyBEZWxldGVkIGNvcHkgY29uc3RydWN0b3IKKyAgICBvbmNlX2ZsYWcoY29uc3Qgb25jZV9mbGFnJikgPSBkZWxldGU7CisgICAgLy8vIERlbGV0ZWQgYXNzaWdubWVudCBvcGVyYXRvcgorICAgIG9uY2VfZmxhZyYgb3BlcmF0b3I9KGNvbnN0IG9uY2VfZmxhZyYpID0gZGVsZXRlOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NhbGxhYmxlLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIGZyaWVuZCB2b2lkCisgICAgICBjYWxsX29uY2Uob25jZV9mbGFnJiBfX29uY2UsIF9DYWxsYWJsZSYmIF9fZiwgX0FyZ3MmJi4uLiBfX2FyZ3MpOworICB9OworCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9UTFMKKyAgZXh0ZXJuIF9fdGhyZWFkIHZvaWQqIF9fb25jZV9jYWxsYWJsZTsKKyAgZXh0ZXJuIF9fdGhyZWFkIHZvaWQgKCpfX29uY2VfY2FsbCkoKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2FsbGFibGU+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX29uY2VfY2FsbF9pbXBsKCkKKyAgICB7CisgICAgICAoKihfQ2FsbGFibGUqKV9fb25jZV9jYWxsYWJsZSkoKTsKKyAgICB9CisjZWxzZQorICBleHRlcm4gZnVuY3Rpb248dm9pZCgpPiBfX29uY2VfZnVuY3RvcjsKKworICBleHRlcm4gdm9pZAorICBfX3NldF9vbmNlX2Z1bmN0b3JfbG9ja19wdHIodW5pcXVlX2xvY2s8bXV0ZXg+Kik7CisKKyAgZXh0ZXJuIG11dGV4JgorICBfX2dldF9vbmNlX211dGV4KCk7CisjZW5kaWYKKworICBleHRlcm4gIkMiIHZvaWQgX19vbmNlX3Byb3h5KHZvaWQpOworCisgIC8vLyBjYWxsX29uY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NhbGxhYmxlLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICB2b2lkCisgICAgY2FsbF9vbmNlKG9uY2VfZmxhZyYgX19vbmNlLCBfQ2FsbGFibGUmJiBfX2YsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgIHsKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX1RMUworICAgICAgYXV0byBfX2JvdW5kX2Z1bmN0b3IgPSBzdGQ6Ol9fYmluZF9zaW1wbGUoc3RkOjpmb3J3YXJkPF9DYWxsYWJsZT4oX19mKSwKKyAgICAgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgICAgX19vbmNlX2NhbGxhYmxlID0gJl9fYm91bmRfZnVuY3RvcjsKKyAgICAgIF9fb25jZV9jYWxsID0gJl9fb25jZV9jYWxsX2ltcGw8ZGVjbHR5cGUoX19ib3VuZF9mdW5jdG9yKT47CisjZWxzZQorICAgICAgdW5pcXVlX2xvY2s8bXV0ZXg+IF9fZnVuY3Rvcl9sb2NrKF9fZ2V0X29uY2VfbXV0ZXgoKSk7CisgICAgICBhdXRvIF9fY2FsbGFibGUgPSBzdGQ6Ol9fYmluZF9zaW1wbGUoc3RkOjpmb3J3YXJkPF9DYWxsYWJsZT4oX19mKSwKKyAgICAgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgICAgX19vbmNlX2Z1bmN0b3IgPSBbJl0oKSB7IF9fY2FsbGFibGUoKTsgfTsKKyAgICAgIF9fc2V0X29uY2VfZnVuY3Rvcl9sb2NrX3B0cigmX19mdW5jdG9yX2xvY2spOworI2VuZGlmCisKKyAgICAgIGludCBfX2UgPSBfX2d0aHJlYWRfb25jZSgmKF9fb25jZS5fTV9vbmNlKSwgJl9fb25jZV9wcm94eSk7CisKKyNpZm5kZWYgX0dMSUJDWFhfSEFWRV9UTFMKKyAgICAgIGlmIChfX2Z1bmN0b3JfbG9jaykKKyAgICAgICAgX19zZXRfb25jZV9mdW5jdG9yX2xvY2tfcHRyKDApOworI2VuZGlmCisKKyAgICAgIGlmIChfX2UpCisJX190aHJvd19zeXN0ZW1fZXJyb3IoX19lKTsKKyAgICB9CisjZW5kaWYgLy8gX0dMSUJDWFhfSEFTX0dUSFJFQURTCisKKyAgLy8gQH0gZ3JvdXAgbXV0ZXhlcworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorI2VuZGlmIC8vIF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMQorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vIF9HTElCQ1hYX01VVEVYCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L25ldyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvbmV3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhOTI2MDMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L25ldwpAQCAtMCwwICsxLDEyMiBAQAorLy8gVGhlIC0qLSBDKysgLSotIGR5bmFtaWMgbWVtb3J5IG1hbmFnZW1lbnQgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTQtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorLy8KKy8vIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisvLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLyAKKy8vIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyAKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBuZXcKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICoKKyAqICBUaGUgaGVhZGVyIEBjIG5ldyBkZWZpbmVzIHNldmVyYWwgZnVuY3Rpb25zIHRvIG1hbmFnZSBkeW5hbWljIG1lbW9yeSBhbmQKKyAqICBoYW5kbGluZyBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvcnM7IHNlZQorICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy8xOF9zdXBwb3J0L2hvd3RvLmh0bWwjNCBmb3IgbW9yZS4KKyAqLworCisjaWZuZGVmIF9ORVcKKyNkZWZpbmUgX05FVworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwdXNoKGRlZmF1bHQpCisKK2V4dGVybiAiQysrIiB7CisKK25hbWVzcGFjZSBzdGQgCit7CisgIC8qKgorICAgKiAgQGJyaWVmICBFeGNlcHRpb24gcG9zc2libHkgdGhyb3duIGJ5IEBjIG5ldy4KKyAgICogIEBpbmdyb3VwIGV4Y2VwdGlvbnMKKyAgICoKKyAgICogIEBjIGJhZF9hbGxvYyAob3IgY2xhc3NlcyBkZXJpdmVkIGZyb20gaXQpIGlzIHVzZWQgdG8gcmVwb3J0IGFsbG9jYXRpb24KKyAgICogIGVycm9ycyBmcm9tIHRoZSB0aHJvd2luZyBmb3JtcyBvZiBAYyBuZXcuICAqLworICBjbGFzcyBiYWRfYWxsb2MgOiBwdWJsaWMgZXhjZXB0aW9uIAorICB7CisgIHB1YmxpYzoKKyAgICBiYWRfYWxsb2MoKSB0aHJvdygpIHsgfQorCisgICAgLy8gVGhpcyBkZWNsYXJhdGlvbiBpcyBub3QgdXNlbGVzczoKKyAgICAvLyBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MtMy4wLjIvZ2NjXzYuaHRtbCNTRUMxMTgKKyAgICB2aXJ0dWFsIH5iYWRfYWxsb2MoKSB0aHJvdygpOworCisgICAgLy8gU2VlIGNvbW1lbnQgaW4gZWhfZXhjZXB0aW9uLmNjLgorICAgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCk7CisgIH07CisKKyAgc3RydWN0IG5vdGhyb3dfdCB7IH07CisKKyAgZXh0ZXJuIGNvbnN0IG5vdGhyb3dfdCBub3Rocm93OworCisgIC8qKiBJZiB5b3Ugd3JpdGUgeW91ciBvd24gZXJyb3IgaGFuZGxlciB0byBiZSBjYWxsZWQgYnkgQGMgbmV3LCBpdCBtdXN0CisgICAqICBiZSBvZiB0aGlzIHR5cGUuICAqLworICB0eXBlZGVmIHZvaWQgKCpuZXdfaGFuZGxlcikoKTsKKworICAvLy8gVGFrZXMgYSByZXBsYWNlbWVudCBoYW5kbGVyIGFzIHRoZSBhcmd1bWVudCwgcmV0dXJucyB0aGUKKyAgLy8vIHByZXZpb3VzIGhhbmRsZXIuCisgIG5ld19oYW5kbGVyIHNldF9uZXdfaGFuZGxlcihuZXdfaGFuZGxlcikgdGhyb3coKTsKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisvL0B7CisvKiogVGhlc2UgYXJlIHJlcGxhY2VhYmxlIHNpZ25hdHVyZXM6CisgKiAgLSBub3JtYWwgc2luZ2xlIG5ldyBhbmQgZGVsZXRlIChubyBhcmd1bWVudHMsIHRocm93IEBjIGJhZF9hbGxvYyBvbiBlcnJvcikKKyAqICAtIG5vcm1hbCBhcnJheSBuZXcgYW5kIGRlbGV0ZSAoc2FtZSkKKyAqICAtIEBjIG5vdGhyb3cgc2luZ2xlIG5ldyBhbmQgZGVsZXRlICh0YWtlIGEgQGMgbm90aHJvdyBhcmd1bWVudCwgcmV0dXJuCisgKiAgICBAYyBOVUxMIG9uIGVycm9yKQorICogIC0gQGMgbm90aHJvdyBhcnJheSBuZXcgYW5kIGRlbGV0ZSAoc2FtZSkKKyAqCisgKiAgUGxhY2VtZW50IG5ldyBhbmQgZGVsZXRlIHNpZ25hdHVyZXMgKHRha2UgYSBtZW1vcnkgYWRkcmVzcyBhcmd1bWVudCwKKyAqICBkb2VzIG5vdGhpbmcpIG1heSBub3QgYmUgcmVwbGFjZWQgYnkgYSB1c2VyJ3MgcHJvZ3JhbS4KKyovCit2b2lkKiBvcGVyYXRvciBuZXcoc3RkOjpzaXplX3QpIF9HTElCQ1hYX1RIUk9XIChzdGQ6OmJhZF9hbGxvYykKKyAgX19hdHRyaWJ1dGVfXygoX19leHRlcm5hbGx5X3Zpc2libGVfXykpOwordm9pZCogb3BlcmF0b3IgbmV3W10oc3RkOjpzaXplX3QpIF9HTElCQ1hYX1RIUk9XIChzdGQ6OmJhZF9hbGxvYykKKyAgX19hdHRyaWJ1dGVfXygoX19leHRlcm5hbGx5X3Zpc2libGVfXykpOwordm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCopIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICBfX2F0dHJpYnV0ZV9fKChfX2V4dGVybmFsbHlfdmlzaWJsZV9fKSk7Cit2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgX19hdHRyaWJ1dGVfXygoX19leHRlcm5hbGx5X3Zpc2libGVfXykpOwordm9pZCogb3BlcmF0b3IgbmV3KHN0ZDo6c2l6ZV90LCBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAorICBfX2F0dHJpYnV0ZV9fKChfX2V4dGVybmFsbHlfdmlzaWJsZV9fKSk7Cit2b2lkKiBvcGVyYXRvciBuZXdbXShzdGQ6OnNpemVfdCwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKKyAgX19hdHRyaWJ1dGVfXygoX19leHRlcm5hbGx5X3Zpc2libGVfXykpOwordm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCosIGNvbnN0IHN0ZDo6bm90aHJvd190JikgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgIF9fYXR0cmlidXRlX18oKF9fZXh0ZXJuYWxseV92aXNpYmxlX18pKTsKK3ZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCosIGNvbnN0IHN0ZDo6bm90aHJvd190JikgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisgIF9fYXR0cmlidXRlX18oKF9fZXh0ZXJuYWxseV92aXNpYmxlX18pKTsKKworLy8gRGVmYXVsdCBwbGFjZW1lbnQgdmVyc2lvbnMgb2Ygb3BlcmF0b3IgbmV3LgoraW5saW5lIHZvaWQqIG9wZXJhdG9yIG5ldyhzdGQ6OnNpemVfdCwgdm9pZCogX19wKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQKK3sgcmV0dXJuIF9fcDsgfQoraW5saW5lIHZvaWQqIG9wZXJhdG9yIG5ld1tdKHN0ZDo6c2l6ZV90LCB2b2lkKiBfX3ApIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVAoreyByZXR1cm4gX19wOyB9CisKKy8vIERlZmF1bHQgcGxhY2VtZW50IHZlcnNpb25zIG9mIG9wZXJhdG9yIGRlbGV0ZS4KK2lubGluZSB2b2lkIG9wZXJhdG9yIGRlbGV0ZSAgKHZvaWQqLCB2b2lkKikgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgfQoraW5saW5lIHZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCosIHZvaWQqKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisvL0B9Cit9IC8vIGV4dGVybiAiQysrIgorCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHBvcAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvbnVtZXJpYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvbnVtZXJpYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODU2NTZmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9udW1lcmljCkBAIC0wLDAgKzEsNzcgQEAKKy8vIDxudW1lcmljPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgaW5jbHVkZS9udW1lcmljCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX05VTUVSSUMKKyNkZWZpbmUgX0dMSUJDWFhfTlVNRVJJQyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3JfYmFzZV90eXBlcy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX251bWVyaWMuaD4KKworI2lmZGVmIF9HTElCQ1hYX1BBUkFMTEVMCisjIGluY2x1ZGUgPHBhcmFsbGVsL251bWVyaWM+CisjZW5kaWYKKworLyoqCisgKiBAZGVmZ3JvdXAgbnVtZXJpY3MgTnVtZXJpY3MKKyAqCisgKiBDb21wb25lbnRzIGZvciBwZXJmb3JtaW5nIG51bWVyaWMgb3BlcmF0aW9ucy4gSW5jbHVkZXMgc3VwcG9ydCBmb3IKKyAqIGZvciBjb21wbGV4IG51bWJlciB0eXBlcywgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uLCBudW1lcmljCisgKiAobi1hdC1hLXRpbWUpIGFycmF5cywgZ2VuZXJhbGl6ZWQgbnVtZXJpYyBhbGdvcml0aG1zLCBhbmQgc3BlY2lhbAorICogbWF0aCBmdW5jdGlvbnMuCisgKi8KKworI2VuZGlmIC8qIF9HTElCQ1hYX05VTUVSSUMgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80Ljgvb3N0cmVhbSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80Ljgvb3N0cmVhbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDY2YjU0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9vc3RyZWFtCkBAIC0wLDAgKzEsNjExIEBACisvLyBPdXRwdXQgc3RyZWFtcyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9vc3RyZWFtCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjcuNi4yICBPdXRwdXQgc3RyZWFtcworLy8KKworI2lmbmRlZiBfR0xJQkNYWF9PU1RSRUFNCisjZGVmaW5lIF9HTElCQ1hYX09TVFJFQU0gMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxpb3M+CisjaW5jbHVkZSA8Yml0cy9vc3RyZWFtX2luc2VydC5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlbXBsYXRlIGNsYXNzIGJhc2ljX29zdHJlYW0uCisgICAqICBAaW5ncm91cCBpbworICAgKgorICAgKiAgQHRwYXJhbSBfQ2hhclQgIFR5cGUgb2YgY2hhcmFjdGVyIHN0cmVhbS4KKyAgICogIEB0cGFyYW0gX1RyYWl0cyAgVHJhaXRzIGZvciBjaGFyYWN0ZXIgdHlwZSwgZGVmYXVsdHMgdG8KKyAgICogICAgICAgICAgICAgICAgICAgY2hhcl90cmFpdHM8X0NoYXJUPi4KKyAgICoKKyAgICogIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBvdXRwdXQgc3RyZWFtcy4gIEl0IHByb3ZpZGVzIHRleHQKKyAgICogIGZvcm1hdHRpbmcgb2YgYWxsIGJ1aWx0aW4gdHlwZXMsIGFuZCBjb21tdW5pY2F0ZXMgd2l0aCBhbnkgY2xhc3MKKyAgICogIGRlcml2ZWQgZnJvbSBiYXNpY19zdHJlYW1idWYgdG8gZG8gdGhlIGFjdHVhbCBvdXRwdXQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBjbGFzcyBiYXNpY19vc3RyZWFtIDogdmlydHVhbCBwdWJsaWMgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXMgKGluaGVyaXRlZCBmcm9tIGJhc2ljX2lvcyk6CisgICAgICB0eXBlZGVmIF9DaGFyVAkJCSAJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9zX3R5cGUgCQlwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUgCQlvZmZfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cwkJCSAJCXRyYWl0c190eXBlOworCisgICAgICAvLyBOb24tc3RhbmRhcmQgVHlwZXM6CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+IAkJX19zdHJlYW1idWZfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4JCV9faW9zX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPgkJX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIG51bV9wdXQ8X0NoYXJULCBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4gPgorICAgICAgCQkJCQkJCV9fbnVtX3B1dF90eXBlOworICAgICAgdHlwZWRlZiBjdHlwZTxfQ2hhclQ+CSAgICAgIAkJCV9fY3R5cGVfdHlwZTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCYXNlIGNvbnN0cnVjdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGN0b3IgaXMgYWxtb3N0IG5ldmVyIGNhbGxlZCBieSB0aGUgdXNlciBkaXJlY3RseSwgcmF0aGVyIGZyb20KKyAgICAgICAqICBkZXJpdmVkIGNsYXNzZXMnIGluaXRpYWxpemF0aW9uIGxpc3RzLCB3aGljaCBwYXNzIGEgcG9pbnRlciB0bworICAgICAgICogIHRoZWlyIG93biBzdHJlYW0gYnVmZmVyLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19vc3RyZWFtKF9fc3RyZWFtYnVmX3R5cGUqIF9fc2IpCisgICAgICB7IHRoaXMtPmluaXQoX19zYik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCYXNlIGRlc3RydWN0b3IuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZG9lcyB2ZXJ5IGxpdHRsZSBhcGFydCBmcm9tIHByb3ZpZGluZyBhIHZpcnR1YWwgYmFzZSBkdG9yLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwKKyAgICAgIH5iYXNpY19vc3RyZWFtKCkgeyB9CisKKyAgICAgIC8vLyBTYWZlIHByZWZpeC9zdWZmaXggb3BlcmF0aW9ucy4KKyAgICAgIGNsYXNzIHNlbnRyeTsKKyAgICAgIGZyaWVuZCBjbGFzcyBzZW50cnk7CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW50ZXJmYWNlIGZvciBtYW5pcHVsYXRvcnMuCisgICAgICAgKgorICAgICAgICogIE1hbmlwdWxhdG9ycyBzdWNoIGFzIEBjIHN0ZDo6ZW5kbCBhbmQgQGMgc3RkOjpoZXggdXNlIHRoZXNlCisgICAgICAgKiAgZnVuY3Rpb25zIGluIGNvbnN0cnVjdHMgbGlrZSAic3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbCIuICBGb3IgbW9yZQorICAgICAgICogIGluZm9ybWF0aW9uLCBzZWUgdGhlIGlvbWFuaXAgaGVhZGVyLgorICAgICAgKi8KKyAgICAgIF9fb3N0cmVhbV90eXBlJgorICAgICAgb3BlcmF0b3I8PChfX29zdHJlYW1fdHlwZSYgKCpfX3BmKShfX29zdHJlYW1fdHlwZSYpKQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyBEUiA2MC4gV2hhdCBpcyBhIGZvcm1hdHRlZCBpbnB1dCBmdW5jdGlvbj8KKwkvLyBUaGUgaW5zZXJ0ZXJzIGZvciBtYW5pcHVsYXRvcnMgYXJlICpub3QqIGZvcm1hdHRlZCBvdXRwdXQgZnVuY3Rpb25zLgorCXJldHVybiBfX3BmKCp0aGlzKTsKKyAgICAgIH0KKworICAgICAgX19vc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcjw8KF9faW9zX3R5cGUmICgqX19wZikoX19pb3NfdHlwZSYpKQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyBEUiA2MC4gV2hhdCBpcyBhIGZvcm1hdHRlZCBpbnB1dCBmdW5jdGlvbj8KKwkvLyBUaGUgaW5zZXJ0ZXJzIGZvciBtYW5pcHVsYXRvcnMgYXJlICpub3QqIGZvcm1hdHRlZCBvdXRwdXQgZnVuY3Rpb25zLgorCV9fcGYoKnRoaXMpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX19vc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcjw8KGlvc19iYXNlJiAoKl9fcGYpIChpb3NfYmFzZSYpKQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyBEUiA2MC4gV2hhdCBpcyBhIGZvcm1hdHRlZCBpbnB1dCBmdW5jdGlvbj8KKwkvLyBUaGUgaW5zZXJ0ZXJzIGZvciBtYW5pcHVsYXRvcnMgYXJlICpub3QqIGZvcm1hdHRlZCBvdXRwdXQgZnVuY3Rpb25zLgorCV9fcGYoKnRoaXMpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQG5hbWUgSW5zZXJ0ZXJzCisgICAgICAgKgorICAgICAgICogIEFsbCB0aGUgQGMgb3BlcmF0b3I8PCBmdW5jdGlvbnMgKGFrYSA8ZW0+Zm9ybWF0dGVkIG91dHB1dAorICAgICAgICogIGZ1bmN0aW9uczwvZW0+KSBoYXZlIHNvbWUgY29tbW9uIGJlaGF2aW9yLiAgRWFjaCBzdGFydHMgYnkKKyAgICAgICAqICBjb25zdHJ1Y3RpbmcgYSB0ZW1wb3Jhcnkgb2JqZWN0IG9mIHR5cGUgc3RkOjpiYXNpY19vc3RyZWFtOjpzZW50cnkuCisgICAgICAgKiAgVGhpcyBjYW4gaGF2ZSBzZXZlcmFsIGVmZmVjdHMsIGNvbmNsdWRpbmcgd2l0aCB0aGUgc2V0dGluZyBvZiBhCisgICAgICAgKiAgc3RhdHVzIGZsYWc7IHNlZSB0aGUgc2VudHJ5IGRvY3VtZW50YXRpb24gZm9yIG1vcmUuCisgICAgICAgKgorICAgICAgICogIElmIHRoZSBzZW50cnkgc3RhdHVzIGlzIGdvb2QsIHRoZSBmdW5jdGlvbiB0cmllcyB0byBnZW5lcmF0ZQorICAgICAgICogIHdoYXRldmVyIGRhdGEgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgICAqCisgICAgICAgKiAgSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgaW5zZXJ0aW9uLCBpb3NfYmFzZTo6YmFkYml0CisgICAgICAgKiAgd2lsbCBiZSB0dXJuZWQgb24gaW4gdGhlIHN0cmVhbSdzIGVycm9yIHN0YXRlIHdpdGhvdXQgY2F1c2luZyBhbgorICAgICAgICogIGlvc19iYXNlOjpmYWlsdXJlIHRvIGJlIHRocm93bi4gIFRoZSBvcmlnaW5hbCBleGNlcHRpb24gd2lsbCB0aGVuCisgICAgICAgKiAgYmUgcmV0aHJvd24uCisgICAgICAqLworCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgSW50ZWdlciBhcml0aG1ldGljIGluc2VydGVycworICAgICAgICogIEBwYXJhbSAgX19uIEEgdmFyaWFibGUgb2YgYnVpbHRpbiBpbnRlZ3JhbCB0eXBlLgorICAgICAgICogIEByZXR1cm4gIEBjICp0aGlzIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAqCisgICAgICAgKiAgVGhlc2UgZnVuY3Rpb25zIHVzZSB0aGUgc3RyZWFtJ3MgY3VycmVudCBsb2NhbGUgKHNwZWNpZmljYWxseSwgdGhlCisgICAgICAgKiAgQGMgbnVtX2dldCBmYWNldCkgdG8gcGVyZm9ybSBudW1lcmljIGZvcm1hdHRpbmcuCisgICAgICAqLworICAgICAgX19vc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcjw8KGxvbmcgX19uKQorICAgICAgeyByZXR1cm4gX01faW5zZXJ0KF9fbik7IH0KKworICAgICAgX19vc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcjw8KHVuc2lnbmVkIGxvbmcgX19uKQorICAgICAgeyByZXR1cm4gX01faW5zZXJ0KF9fbik7IH0KKworICAgICAgX19vc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcjw8KGJvb2wgX19uKQorICAgICAgeyByZXR1cm4gX01faW5zZXJ0KF9fbik7IH0KKworICAgICAgX19vc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcjw8KHNob3J0IF9fbik7CisKKyAgICAgIF9fb3N0cmVhbV90eXBlJgorICAgICAgb3BlcmF0b3I8PCh1bnNpZ25lZCBzaG9ydCBfX24pCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDExNy4gYmFzaWNfb3N0cmVhbSB1c2VzIG5vbmV4aXN0ZW50IG51bV9wdXQgbWVtYmVyIGZ1bmN0aW9ucy4KKwlyZXR1cm4gX01faW5zZXJ0KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KF9fbikpOworICAgICAgfQorCisgICAgICBfX29zdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPDwoaW50IF9fbik7CisKKyAgICAgIF9fb3N0cmVhbV90eXBlJgorICAgICAgb3BlcmF0b3I8PCh1bnNpZ25lZCBpbnQgX19uKQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAxMTcuIGJhc2ljX29zdHJlYW0gdXNlcyBub25leGlzdGVudCBudW1fcHV0IG1lbWJlciBmdW5jdGlvbnMuCisJcmV0dXJuIF9NX2luc2VydChzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihfX24pKTsKKyAgICAgIH0KKworI2lmZGVmIF9HTElCQ1hYX1VTRV9MT05HX0xPTkcKKyAgICAgIF9fb3N0cmVhbV90eXBlJgorICAgICAgb3BlcmF0b3I8PChsb25nIGxvbmcgX19uKQorICAgICAgeyByZXR1cm4gX01faW5zZXJ0KF9fbik7IH0KKworICAgICAgX19vc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcjw8KHVuc2lnbmVkIGxvbmcgbG9uZyBfX24pCisgICAgICB7IHJldHVybiBfTV9pbnNlcnQoX19uKTsgfQorI2VuZGlmCisgICAgICAvL0B9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYyBpbnNlcnRlcnMKKyAgICAgICAqICBAcGFyYW0gIF9fZiBBIHZhcmlhYmxlIG9mIGJ1aWx0aW4gZmxvYXRpbmcgcG9pbnQgdHlwZS4KKyAgICAgICAqICBAcmV0dXJuICBAYyAqdGhpcyBpZiBzdWNjZXNzZnVsCisgICAgICAgKgorICAgICAgICogIFRoZXNlIGZ1bmN0aW9ucyB1c2UgdGhlIHN0cmVhbSdzIGN1cnJlbnQgbG9jYWxlIChzcGVjaWZpY2FsbHksIHRoZQorICAgICAgICogIEBjIG51bV9nZXQgZmFjZXQpIHRvIHBlcmZvcm0gbnVtZXJpYyBmb3JtYXR0aW5nLgorICAgICAgKi8KKyAgICAgIF9fb3N0cmVhbV90eXBlJgorICAgICAgb3BlcmF0b3I8PChkb3VibGUgX19mKQorICAgICAgeyByZXR1cm4gX01faW5zZXJ0KF9fZik7IH0KKworICAgICAgX19vc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcjw8KGZsb2F0IF9fZikKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMTE3LiBiYXNpY19vc3RyZWFtIHVzZXMgbm9uZXhpc3RlbnQgbnVtX3B1dCBtZW1iZXIgZnVuY3Rpb25zLgorCXJldHVybiBfTV9pbnNlcnQoc3RhdGljX2Nhc3Q8ZG91YmxlPihfX2YpKTsKKyAgICAgIH0KKworICAgICAgX19vc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcjw8KGxvbmcgZG91YmxlIF9fZikKKyAgICAgIHsgcmV0dXJuIF9NX2luc2VydChfX2YpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUG9pbnRlciBhcml0aG1ldGljIGluc2VydGVycworICAgICAgICogIEBwYXJhbSAgX19wIEEgdmFyaWFibGUgb2YgcG9pbnRlciB0eXBlLgorICAgICAgICogIEByZXR1cm4gIEBjICp0aGlzIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAqCisgICAgICAgKiAgVGhlc2UgZnVuY3Rpb25zIHVzZSB0aGUgc3RyZWFtJ3MgY3VycmVudCBsb2NhbGUgKHNwZWNpZmljYWxseSwgdGhlCisgICAgICAgKiAgQGMgbnVtX2dldCBmYWNldCkgdG8gcGVyZm9ybSBudW1lcmljIGZvcm1hdHRpbmcuCisgICAgICAqLworICAgICAgX19vc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcjw8KGNvbnN0IHZvaWQqIF9fcCkKKyAgICAgIHsgcmV0dXJuIF9NX2luc2VydChfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRXh0cmFjdGluZyBmcm9tIGFub3RoZXIgc3RyZWFtYnVmLgorICAgICAgICogIEBwYXJhbSAgX19zYiAgQSBwb2ludGVyIHRvIGEgc3RyZWFtYnVmCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gYmVoYXZlcyBsaWtlIG9uZSBvZiB0aGUgYmFzaWMgYXJpdGhtZXRpYyBleHRyYWN0b3JzLAorICAgICAgICogIGluIHRoYXQgaXQgYWxzbyBjb25zdHJ1Y3RzIGEgc2VudHJ5IG9iamVjdCBhbmQgaGFzIHRoZSBzYW1lIGVycm9yCisgICAgICAgKiAgaGFuZGxpbmcgYmVoYXZpb3IuCisgICAgICAgKgorICAgICAgICogIElmIEBwIF9fc2IgaXMgTlVMTCwgdGhlIHN0cmVhbSB3aWxsIHNldCBmYWlsYml0IGluIGl0cyBlcnJvciBzdGF0ZS4KKyAgICAgICAqCisgICAgICAgKiAgQ2hhcmFjdGVycyBhcmUgZXh0cmFjdGVkIGZyb20gQHAgX19zYiBhbmQgaW5zZXJ0ZWQgaW50byBAYyAqdGhpcworICAgICAgICogIHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9jY3VyczoKKyAgICAgICAqCisgICAgICAgKiAgLSB0aGUgaW5wdXQgc3RyZWFtIHJlYWNoZXMgZW5kLW9mLWZpbGUsCisgICAgICAgKiAgLSBpbnNlcnRpb24gaW50byB0aGUgb3V0cHV0IHNlcXVlbmNlIGZhaWxzIChpbiB0aGlzIGNhc2UsIHRoZQorICAgICAgICogICAgY2hhcmFjdGVyIHRoYXQgd291bGQgaGF2ZSBiZWVuIGluc2VydGVkIGlzIG5vdCBleHRyYWN0ZWQpLCBvcgorICAgICAgICogIC0gYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBnZXR0aW5nIGEgY2hhcmFjdGVyIGZyb20gQHAgX19zYiwgd2hpY2gKKyAgICAgICAqICAgIHNldHMgZmFpbGJpdCBpbiB0aGUgZXJyb3Igc3RhdGUKKyAgICAgICAqCisgICAgICAgKiAgSWYgdGhlIGZ1bmN0aW9uIGluc2VydHMgbm8gY2hhcmFjdGVycywgZmFpbGJpdCBpcyBzZXQuCisgICAgICAqLworICAgICAgX19vc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcjw8KF9fc3RyZWFtYnVmX3R5cGUqIF9fc2IpOworICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAbmFtZSBVbmZvcm1hdHRlZCBPdXRwdXQgRnVuY3Rpb25zCisgICAgICAgKgorICAgICAgICogIEFsbCB0aGUgdW5mb3JtYXR0ZWQgb3V0cHV0IGZ1bmN0aW9ucyBoYXZlIHNvbWUgY29tbW9uIGJlaGF2aW9yLgorICAgICAgICogIEVhY2ggc3RhcnRzIGJ5IGNvbnN0cnVjdGluZyBhIHRlbXBvcmFyeSBvYmplY3Qgb2YgdHlwZQorICAgICAgICogIHN0ZDo6YmFzaWNfb3N0cmVhbTo6c2VudHJ5LiAgVGhpcyBoYXMgc2V2ZXJhbCBlZmZlY3RzLCBjb25jbHVkaW5nCisgICAgICAgKiAgd2l0aCB0aGUgc2V0dGluZyBvZiBhIHN0YXR1cyBmbGFnOyBzZWUgdGhlIHNlbnRyeSBkb2N1bWVudGF0aW9uCisgICAgICAgKiAgZm9yIG1vcmUuCisgICAgICAgKgorICAgICAgICogIElmIHRoZSBzZW50cnkgc3RhdHVzIGlzIGdvb2QsIHRoZSBmdW5jdGlvbiB0cmllcyB0byBnZW5lcmF0ZQorICAgICAgICogIHdoYXRldmVyIGRhdGEgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgICAqCisgICAgICAgKiAgSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgaW5zZXJ0aW9uLCBpb3NfYmFzZTo6YmFkYml0CisgICAgICAgKiAgd2lsbCBiZSB0dXJuZWQgb24gaW4gdGhlIHN0cmVhbSdzIGVycm9yIHN0YXRlLiAgSWYgYmFkYml0IGlzIG9uIGluCisgICAgICAgKiAgdGhlIHN0cmVhbSdzIGV4Y2VwdGlvbnMgbWFzaywgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHJldGhyb3duCisgICAgICAgKiAgd2l0aG91dCBjb21wbGV0aW5nIGl0cyBhY3Rpb25zLgorICAgICAgKi8KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTaW1wbGUgaW5zZXJ0aW9uLgorICAgICAgICogIEBwYXJhbSAgX19jICBUaGUgY2hhcmFjdGVyIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBUcmllcyB0byBpbnNlcnQgQHAgX19jLgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgVGhpcyBmdW5jdGlvbiBpcyBub3Qgb3ZlcmxvYWRlZCBvbiBzaWduZWQgY2hhciBhbmQKKyAgICAgICAqICAgICAgICAgdW5zaWduZWQgY2hhci4KKyAgICAgICovCisgICAgICBfX29zdHJlYW1fdHlwZSYKKyAgICAgIHB1dChjaGFyX3R5cGUgX19jKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb3JlIHdyaXRlIGZ1bmN0aW9uYWxpdHksIHdpdGhvdXQgc2VudHJ5LgorICAgICAgICogIEBwYXJhbSAgX19zICBUaGUgYXJyYXkgdG8gaW5zZXJ0LgorICAgICAgICogIEBwYXJhbSAgX19uICBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydC4KKyAgICAgICovCisgICAgICB2b2lkCisgICAgICBfTV93cml0ZShjb25zdCBjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pCisgICAgICB7CisJY29uc3Qgc3RyZWFtc2l6ZSBfX3B1dCA9IHRoaXMtPnJkYnVmKCktPnNwdXRuKF9fcywgX19uKTsKKwlpZiAoX19wdXQgIT0gX19uKQorCSAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ2hhcmFjdGVyIHN0cmluZyBpbnNlcnRpb24uCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFRoZSBhcnJheSB0byBpbnNlcnQuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gICp0aGlzCisgICAgICAgKgorICAgICAgICogIENoYXJhY3RlcnMgYXJlIGNvcGllZCBmcm9tIEBwIF9fcyBhbmQgaW5zZXJ0ZWQgaW50byB0aGUgc3RyZWFtIHVudGlsCisgICAgICAgKiAgb25lIG9mIHRoZSBmb2xsb3dpbmcgaGFwcGVuczoKKyAgICAgICAqCisgICAgICAgKiAgLSBAcCBfX24gY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQKKyAgICAgICAqICAtIGluc2VydGluZyBpbnRvIHRoZSBvdXRwdXQgc2VxdWVuY2UgZmFpbHMgKGluIHRoaXMgY2FzZSwgYmFkYml0CisgICAgICAgKiAgICB3aWxsIGJlIHNldCBpbiB0aGUgc3RyZWFtJ3MgZXJyb3Igc3RhdGUpCisgICAgICAgKgorICAgICAgICogIEBub3RlICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBvdmVybG9hZGVkIG9uIHNpZ25lZCBjaGFyIGFuZAorICAgICAgICogICAgICAgICB1bnNpZ25lZCBjaGFyLgorICAgICAgKi8KKyAgICAgIF9fb3N0cmVhbV90eXBlJgorICAgICAgd3JpdGUoY29uc3QgY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTeW5jaHJvbml6aW5nIHRoZSBzdHJlYW0gYnVmZmVyLgorICAgICAgICogIEByZXR1cm4gICp0aGlzCisgICAgICAgKgorICAgICAgICogIElmIEBjIHJkYnVmKCkgaXMgYSBudWxsIHBvaW50ZXIsIGNoYW5nZXMgbm90aGluZy4KKyAgICAgICAqCisgICAgICAgKiAgT3RoZXJ3aXNlLCBjYWxscyBAYyByZGJ1ZigpLT5wdWJzeW5jKCksIGFuZCBpZiB0aGF0IHJldHVybnMgLTEsCisgICAgICAgKiAgc2V0cyBiYWRiaXQuCisgICAgICAqLworICAgICAgX19vc3RyZWFtX3R5cGUmCisgICAgICBmbHVzaCgpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEdldHRpbmcgdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24uCisgICAgICAgKiAgQHJldHVybiAgQSBmaWxlIHBvc2l0aW9uIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgSWYgQGMgZmFpbCgpIGlzIG5vdCBmYWxzZSwgcmV0dXJucyBAYyBwb3NfdHlwZSgtMSkgdG8gaW5kaWNhdGUKKyAgICAgICAqICBmYWlsdXJlLiAgT3RoZXJ3aXNlIHJldHVybnMgQGMgcmRidWYoKS0+cHVic2Vla29mZigwLGN1cixvdXQpLgorICAgICAgKi8KKyAgICAgIHBvc190eXBlCisgICAgICB0ZWxscCgpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENoYW5naW5nIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uLgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIEEgZmlsZSBwb3NpdGlvbiBvYmplY3QuCisgICAgICAgKiAgQHJldHVybiAgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgSWYgQGMgZmFpbCgpIGlzIG5vdCB0cnVlLCBjYWxscyBAYyByZGJ1ZigpLT5wdWJzZWVrcG9zKHBvcykuICBJZgorICAgICAgICogIHRoYXQgZnVuY3Rpb24gZmFpbHMsIHNldHMgZmFpbGJpdC4KKyAgICAgICovCisgICAgICBfX29zdHJlYW1fdHlwZSYKKyAgICAgIHNlZWtwKHBvc190eXBlKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDaGFuZ2luZyB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbi4KKyAgICAgICAqICBAcGFyYW0gIF9fb2ZmICBBIGZpbGUgb2Zmc2V0IG9iamVjdC4KKyAgICAgICAqICBAcGFyYW0gIF9fZGlyICBUaGUgZGlyZWN0aW9uIGluIHdoaWNoIHRvIHNlZWsuCisgICAgICAgKiAgQHJldHVybiAgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgSWYgQGMgZmFpbCgpIGlzIG5vdCB0cnVlLCBjYWxscyBAYyByZGJ1ZigpLT5wdWJzZWVrb2ZmKG9mZixkaXIpLgorICAgICAgICogIElmIHRoYXQgZnVuY3Rpb24gZmFpbHMsIHNldHMgZmFpbGJpdC4KKyAgICAgICovCisgICAgICAgX19vc3RyZWFtX3R5cGUmCisgICAgICBzZWVrcChvZmZfdHlwZSwgaW9zX2Jhc2U6OnNlZWtkaXIpOworCisgICAgcHJvdGVjdGVkOgorICAgICAgYmFzaWNfb3N0cmVhbSgpCisgICAgICB7IHRoaXMtPmluaXQoMCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlVD4KKwlfX29zdHJlYW1fdHlwZSYKKwlfTV9pbnNlcnQoX1ZhbHVlVCBfX3YpOworICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFBlcmZvcm1zIHNldHVwIHdvcmsgZm9yIG91dHB1dCBzdHJlYW1zLgorICAgKgorICAgKiAgT2JqZWN0cyBvZiB0aGlzIGNsYXNzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbGwgb2YgdGhlIHN0YW5kYXJkCisgICAqICBpbnNlcnRlcnMgYXJlIHJ1bi4gIEl0IGlzIHJlc3BvbnNpYmxlIGZvciA8ZW0+ZXhjZXB0aW9uLXNhZmUgcHJlZml4IGFuZAorICAgKiAgc3VmZml4IG9wZXJhdGlvbnM8L2VtPi4KKyAgKi8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBjbGFzcyBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlbnRyeQorICAgIHsKKyAgICAgIC8vIERhdGEgTWVtYmVycy4KKyAgICAgIGJvb2wgCQkJCV9NX29rOworICAgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiAJX01fb3M7CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRoZSBjb25zdHJ1Y3RvciBwZXJmb3JtcyBwcmVwYXJhdG9yeSB3b3JrLgorICAgICAgICogIEBwYXJhbSAgX19vcyAgVGhlIG91dHB1dCBzdHJlYW0gdG8gZ3VhcmQuCisgICAgICAgKgorICAgICAgICogIElmIHRoZSBzdHJlYW0gc3RhdGUgaXMgZ29vZCAoQGEgX19vcy5nb29kKCkgaXMgdHJ1ZSksIHRoZW4gaWYgdGhlCisgICAgICAgKiAgc3RyZWFtIGlzIHRpZWQgdG8gYW5vdGhlciBvdXRwdXQgc3RyZWFtLCBAYyBpcy50aWUoKS0+Zmx1c2goKQorICAgICAgICogIGlzIGNhbGxlZCB0byBzeW5jaHJvbml6ZSB0aGUgb3V0cHV0IHNlcXVlbmNlcy4KKyAgICAgICAqCisgICAgICAgKiAgSWYgdGhlIHN0cmVhbSBzdGF0ZSBpcyBzdGlsbCBnb29kLCB0aGVuIHRoZSBzZW50cnkgc3RhdGUgYmVjb21lcworICAgICAgICogIHRydWUgKEBhIG9rYXkpLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBzZW50cnkoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQb3NzaWJseSBmbHVzaGVzIHRoZSBzdHJlYW0uCisgICAgICAgKgorICAgICAgICogIElmIEBjIGlvc19iYXNlOjp1bml0YnVmIGlzIHNldCBpbiBAYyBvcy5mbGFncygpLCBhbmQKKyAgICAgICAqICBAYyBzdGQ6OnVuY2F1Z2h0X2V4Y2VwdGlvbigpIGlzIHRydWUsIHRoZSBzZW50cnkgZGVzdHJ1Y3RvciBjYWxscworICAgICAgICogIEBjIGZsdXNoKCkgb24gdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICAqLworICAgICAgfnNlbnRyeSgpCisgICAgICB7CisJLy8gWFhYIE1UCisJaWYgKGJvb2woX01fb3MuZmxhZ3MoKSAmIGlvc19iYXNlOjp1bml0YnVmKSAmJiAhdW5jYXVnaHRfZXhjZXB0aW9uKCkpCisJICB7CisJICAgIC8vIENhbid0IGNhbGwgZmx1c2ggZGlyZWN0bHkgb3IgZWxzZSB3aWxsIGdldCBpbnRvIHJlY3Vyc2l2ZSBsb2NrLgorCSAgICBpZiAoX01fb3MucmRidWYoKSAmJiBfTV9vcy5yZGJ1ZigpLT5wdWJzeW5jKCkgPT0gLTEpCisJICAgICAgX01fb3Muc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICB9CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUXVpY2sgc3RhdHVzIGNoZWNraW5nLgorICAgICAgICogIEByZXR1cm4gIFRoZSBzZW50cnkgc3RhdGUuCisgICAgICAgKgorICAgICAgICogIEZvciBlYXNlIG9mIHVzZSwgc2VudHJpZXMgbWF5IGJlIGNvbnZlcnRlZCB0byBib29sZWFucy4gIFRoZQorICAgICAgICogIHJldHVybiB2YWx1ZSBpcyB0aGF0IG9mIHRoZSBzZW50cnkgc3RhdGUgKHRydWUgPT0gb2theSkuCisgICAgICAqLworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGV4cGxpY2l0CisjZW5kaWYKKyAgICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fb2s7IH0KKyAgICB9OworCisgIC8vQHsKKyAgLyoqCisgICAqICBAYnJpZWYgIENoYXJhY3RlciBpbnNlcnRlcnMKKyAgICogIEBwYXJhbSAgX19vdXQgIEFuIG91dHB1dCBzdHJlYW0uCisgICAqICBAcGFyYW0gIF9fYyAgQSBjaGFyYWN0ZXIuCisgICAqICBAcmV0dXJuICBvdXQKKyAgICoKKyAgICogIEJlaGF2ZXMgbGlrZSBvbmUgb2YgdGhlIGZvcm1hdHRlZCBhcml0aG1ldGljIGluc2VydGVycyBkZXNjcmliZWQgaW4KKyAgICogIHN0ZDo6YmFzaWNfb3N0cmVhbS4gIEFmdGVyIGNvbnN0cnVjdGluZyBhIHNlbnRyeSBvYmplY3Qgd2l0aCBnb29kCisgICAqICBzdGF0dXMsIHRoaXMgZnVuY3Rpb24gaW5zZXJ0cyBhIHNpbmdsZSBjaGFyYWN0ZXIgYW5kIGFueSByZXF1aXJlZAorICAgKiAgcGFkZGluZyAoYXMgZGV0ZXJtaW5lZCBieSBbMjIuMi4yLjIuMl0pLiAgQGMgX19vdXQud2lkdGgoMCkgaXMgdGhlbgorICAgKiAgY2FsbGVkLgorICAgKgorICAgKiAgSWYgQHAgX19jIGlzIG9mIHR5cGUgQGMgY2hhciBhbmQgdGhlIGNoYXJhY3RlciB0eXBlIG9mIHRoZSBzdHJlYW0gaXMgbm90CisgICAqICBAYyBjaGFyLCB0aGUgY2hhcmFjdGVyIGlzIHdpZGVuZWQgYmVmb3JlIGluc2VydGlvbi4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3V0LCBfQ2hhclQgX19jKQorICAgIHsgcmV0dXJuIF9fb3N0cmVhbV9pbnNlcnQoX19vdXQsICZfX2MsIDEpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3V0LCBjaGFyIF9fYykKKyAgICB7IHJldHVybiAoX19vdXQgPDwgX19vdXQud2lkZW4oX19jKSk7IH0KKworICAvLyBTcGVjaWFsaXphdGlvbgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9fb3V0LCBjaGFyIF9fYykKKyAgICB7IHJldHVybiBfX29zdHJlYW1faW5zZXJ0KF9fb3V0LCAmX19jLCAxKTsgfQorCisgIC8vIFNpZ25lZCBhbmQgdW5zaWduZWQKKyAgdGVtcGxhdGU8Y2xhc3MgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9fb3V0LCBzaWduZWQgY2hhciBfX2MpCisgICAgeyByZXR1cm4gKF9fb3V0IDw8IHN0YXRpY19jYXN0PGNoYXI+KF9fYykpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9fb3V0LCB1bnNpZ25lZCBjaGFyIF9fYykKKyAgICB7IHJldHVybiAoX19vdXQgPDwgc3RhdGljX2Nhc3Q8Y2hhcj4oX19jKSk7IH0KKyAgLy9AfQorCisgIC8vQHsKKyAgLyoqCisgICAqICBAYnJpZWYgIFN0cmluZyBpbnNlcnRlcnMKKyAgICogIEBwYXJhbSAgX19vdXQgIEFuIG91dHB1dCBzdHJlYW0uCisgICAqICBAcGFyYW0gIF9fcyAgQSBjaGFyYWN0ZXIgc3RyaW5nLgorICAgKiAgQHJldHVybiAgb3V0CisgICAqICBAcHJlICBAcCBfX3MgbXVzdCBiZSBhIG5vbi1OVUxMIHBvaW50ZXIKKyAgICoKKyAgICogIEJlaGF2ZXMgbGlrZSBvbmUgb2YgdGhlIGZvcm1hdHRlZCBhcml0aG1ldGljIGluc2VydGVycyBkZXNjcmliZWQgaW4KKyAgICogIHN0ZDo6YmFzaWNfb3N0cmVhbS4gIEFmdGVyIGNvbnN0cnVjdGluZyBhIHNlbnRyeSBvYmplY3Qgd2l0aCBnb29kCisgICAqICBzdGF0dXMsIHRoaXMgZnVuY3Rpb24gaW5zZXJ0cyBAYyB0cmFpdHM6Omxlbmd0aChfX3MpIGNoYXJhY3RlcnMgc3RhcnRpbmcKKyAgICogIGF0IEBwIF9fcywgd2lkZW5lZCBpZiBuZWNlc3NhcnksIGZvbGxvd2VkIGJ5IGFueSByZXF1aXJlZCBwYWRkaW5nIChhcworICAgKiAgZGV0ZXJtaW5lZCBieSBbMjIuMi4yLjIuMl0pLiAgQGMgX19vdXQud2lkdGgoMCkgaXMgdGhlbiBjYWxsZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX291dCwgY29uc3QgX0NoYXJUKiBfX3MpCisgICAgeworICAgICAgaWYgKCFfX3MpCisJX19vdXQuc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgICBlbHNlCisJX19vc3RyZWFtX2luc2VydChfX291dCwgX19zLAorCQkJIHN0YXRpY19jYXN0PHN0cmVhbXNpemU+KF9UcmFpdHM6Omxlbmd0aChfX3MpKSk7CisgICAgICByZXR1cm4gX19vdXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gJgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX291dCwgY29uc3QgY2hhciogX19zKTsKKworICAvLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9ucworICB0ZW1wbGF0ZTxjbGFzcyBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vdXQsIGNvbnN0IGNoYXIqIF9fcykKKyAgICB7CisgICAgICBpZiAoIV9fcykKKwlfX291dC5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKyAgICAgIGVsc2UKKwlfX29zdHJlYW1faW5zZXJ0KF9fb3V0LCBfX3MsCisJCQkgc3RhdGljX2Nhc3Q8c3RyZWFtc2l6ZT4oX1RyYWl0czo6bGVuZ3RoKF9fcykpKTsKKyAgICAgIHJldHVybiBfX291dDsKKyAgICB9CisKKyAgLy8gU2lnbmVkIGFuZCB1bnNpZ25lZAorICB0ZW1wbGF0ZTxjbGFzcyBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vdXQsIGNvbnN0IHNpZ25lZCBjaGFyKiBfX3MpCisgICAgeyByZXR1cm4gKF9fb3V0IDw8IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KF9fcykpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiAmCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX291dCwgY29uc3QgdW5zaWduZWQgY2hhciogX19zKQorICAgIHsgcmV0dXJuIChfX291dCA8PCByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihfX3MpKTsgfQorICAvL0B9CisKKyAgLy8gU3RhbmRhcmQgYmFzaWNfb3N0cmVhbSBtYW5pcHVsYXRvcnMKKworICAvKioKKyAgICogIEBicmllZiAgV3JpdGUgYSBuZXdsaW5lIGFuZCBmbHVzaCB0aGUgc3RyZWFtLgorICAgKgorICAgKiAgVGhpcyBtYW5pcHVsYXRvciBpcyBvZnRlbiBtaXN0YWtlbmx5IHVzZWQgd2hlbiBhIHNpbXBsZSBuZXdsaW5lIGlzCisgICAqICBkZXNpcmVkLCBsZWFkaW5nIHRvIHBvb3IgYnVmZmVyaW5nIHBlcmZvcm1hbmNlLiAgU2VlCisgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDExY2gyNXMwMi5odG1sCisgICAqICBmb3IgbW9yZSBvbiB0aGlzIHN1YmplY3QuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGVuZGwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zKQorICAgIHsgcmV0dXJuIGZsdXNoKF9fb3MucHV0KF9fb3Mud2lkZW4oJ1xuJykpKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBXcml0ZSBhIG51bGwgY2hhcmFjdGVyIGludG8gdGhlIG91dHB1dCBzZXF1ZW5jZS4KKyAgICoKKyAgICogIDxlbT5OdWxsIGNoYXJhY3RlcjwvZW0+IGlzIEBjIENoYXJUKCkgYnkgZGVmaW5pdGlvbi4gIEZvciBDaGFyVAorICAgKiAgb2YgQGMgY2hhciwgdGhpcyBjb3JyZWN0bHkgd3JpdGVzIHRoZSBBU0NJSSBAYyBOVUwgY2hhcmFjdGVyCisgICAqICBzdHJpbmcgdGVybWluYXRvci4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgZW5kcyhiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MpCisgICAgeyByZXR1cm4gX19vcy5wdXQoX0NoYXJUKCkpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEZsdXNoZXMgdGhlIG91dHB1dCBzdHJlYW0uCisgICAqCisgICAqICBUaGlzIG1hbmlwdWxhdG9yIHNpbXBseSBjYWxscyB0aGUgc3RyZWFtJ3MgQGMgZmx1c2goKSBtZW1iZXIgZnVuY3Rpb24uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGZsdXNoKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcykKKyAgICB7IHJldHVybiBfX29zLmZsdXNoKCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgLyoqCisgICAqICBAYnJpZWYgIEdlbmVyaWMgaW5zZXJ0ZXIgZm9yIHJ2YWx1ZSBzdHJlYW0KKyAgICogIEBwYXJhbSAgX19vcyAgQW4gaW5wdXQgc3RyZWFtLgorICAgKiAgQHBhcmFtICBfX3ggIEEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgYmVpbmcgaW5zZXJ0ZWQuCisgICAqICBAcmV0dXJuICBvcworICAgKgorICAgKiAgVGhpcyBpcyBqdXN0IGEgZm9yd2FyZGluZyBmdW5jdGlvbiB0byBhbGxvdyBpbnNlcnRpb24gdG8KKyAgICogIHJ2YWx1ZSBzdHJlYW1zIHNpbmNlIHRoZXkgd29uJ3QgYmluZCB0byB0aGUgaW5zZXJ0ZXIgZnVuY3Rpb25zCisgICAqICB0aGF0IHRha2UgYW4gbHZhbHVlIHJlZmVyZW5jZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYmIF9fb3MsIGNvbnN0IF9UcCYgX194KQorICAgIHsgcmV0dXJuIChfX29zIDw8IF9feCk7IH0KKyNlbmRpZiAvLyBDKysxMQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjaW5jbHVkZSA8Yml0cy9vc3RyZWFtLnRjYz4KKworI2VuZGlmCS8qIF9HTElCQ1hYX09TVFJFQU0gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvYWxnby5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9hbGdvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBjMjRlNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvYWxnby5oCkBAIC0wLDAgKzEsMjM2MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL2FsZ28uaAorICogIEBicmllZiBQYXJhbGxlbCBTVEwgZnVuY3Rpb24gY2FsbHMgY29ycmVzcG9uZGluZyB0byB0aGUgc3RsX2FsZ28uaCBoZWFkZXIuCisgKgorICogIFRoZSBmdW5jdGlvbnMgZGVmaW5lZCBoZXJlIG1haW5seSBkbyBjYXNlIHN3aXRjaGVzIGFuZAorICogIGNhbGwgdGhlIGFjdHVhbCBwYXJhbGxlbGl6ZWQgdmVyc2lvbnMgaW4gb3RoZXIgZmlsZXMuCisgKiAgSW5saW5pbmcgcG9saWN5OiBGdW5jdGlvbnMgdGhhdCBiYXNpY2FsbHkgb25seSBjb250YWluIG9uZSBmdW5jdGlvbiBjYWxsLAorICogIGFyZSBkZWNsYXJlZCBpbmxpbmUuCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBKb2hhbm5lcyBTaW5nbGVyIGFuZCBGZWxpeCBQdXR6ZS4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9BTEdPX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfQUxHT19IIDEKKworI2luY2x1ZGUgPHBhcmFsbGVsL2FsZ29yaXRobWZ3ZC5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnby5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvYmFzZS5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3NvcnQuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC93b3Jrc3RlYWxpbmcuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9wYXJfbG9vcC5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL29tcF9sb29wLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvb21wX2xvb3Bfc3RhdGljLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvZm9yX2VhY2hfc2VsZWN0b3JzLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvZm9yX2VhY2guaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9maW5kLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvZmluZF9zZWxlY3RvcnMuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9zZWFyY2guaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9yYW5kb21fc2h1ZmZsZS5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3BhcnRpdGlvbi5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL21lcmdlLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvdW5pcXVlX2NvcHkuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9zZXRfb3BlcmF0aW9ucy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3BhcmFsbGVsCit7CisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfRnVuY3Rpb24+CisgICAgaW5saW5lIF9GdW5jdGlvbgorICAgIGZvcl9lYWNoKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsIF9GdW5jdGlvbiBfX2YsIAorICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6Zm9yX2VhY2goX19iZWdpbiwgX19lbmQsIF9fZik7IH0KKworCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sgZm9yIGlucHV0IGl0ZXJhdG9yIGNhc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfRnVuY3Rpb24sIHR5cGVuYW1lIF9JdGVyYXRvclRhZz4KKyAgICBpbmxpbmUgX0Z1bmN0aW9uCisgICAgX19mb3JfZWFjaF9zd2l0Y2goX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgX0Z1bmN0aW9uIF9fZiwgCisgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvclRhZykKKyAgICB7IHJldHVybiBmb3JfZWFjaChfX2JlZ2luLCBfX2VuZCwgX19mLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7IH0KKworICAvLyBQYXJhbGxlbCBhbGdvcml0aG0gZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9GdW5jdGlvbj4KKyAgICBfRnVuY3Rpb24KKyAgICBfX2Zvcl9lYWNoX3N3aXRjaChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsIAorICAgICAgICAgICAgICAgICAgICBfRnVuY3Rpb24gX19mLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgCisgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbV90YWcKKyAgICAgICAgICAgICAgICAgICAgPSBfX2dudV9wYXJhbGxlbDo6cGFyYWxsZWxfYmFsYW5jZWQpCisgICAgeworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQgLSBfX2JlZ2luKQorICAgICAgICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkuZm9yX2VhY2hfbWluaW1hbF9uCisgICAgICAgICAgICAmJiBfX2dudV9wYXJhbGxlbDo6X19pc19wYXJhbGxlbChfX3BhcmFsbGVsaXNtX3RhZykpKQorICAgICAgICB7CisgICAgICAgICAgYm9vbCBfX2R1bW15OworICAgIF9fZ251X3BhcmFsbGVsOjpfX2Zvcl9lYWNoX3NlbGVjdG9yPF9SQUl0ZXI+IF9fZnVuY3Rpb25hbGl0eTsKKworICAgICAgICAgIHJldHVybiBfX2dudV9wYXJhbGxlbDo6CisgICAgICAgICAgICBfX2Zvcl9lYWNoX3RlbXBsYXRlX3JhbmRvbV9hY2Nlc3MoCisgICAgICAgICAgICAgIF9fYmVnaW4sIF9fZW5kLCBfX2YsIF9fZnVuY3Rpb25hbGl0eSwKKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9EdW1teVJlZHVjdCgpLCB0cnVlLCBfX2R1bW15LCAtMSwKKyAgICAgICAgICAgICAgX19wYXJhbGxlbGlzbV90YWcpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBmb3JfZWFjaChfX2JlZ2luLCBfX2VuZCwgX19mLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfRnVuY3Rpb24+CisgICAgaW5saW5lIF9GdW5jdGlvbgorICAgIGZvcl9lYWNoKF9JdGVyYXRvciBfX2JlZ2luLCBfSXRlcmF0b3IgX19lbmQsIF9GdW5jdGlvbiBfX2YsIAorICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbV90YWcpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+IF9JdGVyYXRvclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTsKKyAgICAgIHJldHVybiBfX2Zvcl9lYWNoX3N3aXRjaChfX2JlZ2luLCBfX2VuZCwgX19mLCBfSXRlcmF0b3JDYXRlZ29yeSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wYXJhbGxlbGlzbV90YWcpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9GdW5jdGlvbj4KKyAgICBpbmxpbmUgX0Z1bmN0aW9uCisgICAgZm9yX2VhY2goX0l0ZXJhdG9yIF9fYmVnaW4sIF9JdGVyYXRvciBfX2VuZCwgX0Z1bmN0aW9uIF9fZikgCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+IF9JdGVyYXRvclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTsKKyAgICAgIHJldHVybiBfX2Zvcl9lYWNoX3N3aXRjaChfX2JlZ2luLCBfX2VuZCwgX19mLCBfSXRlcmF0b3JDYXRlZ29yeSgpKTsKKyAgICB9CisKKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfSUl0ZXIKKyAgICBmaW5kKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsIGNvbnN0IF9UcCYgX192YWwsIAorICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpmaW5kKF9fYmVnaW4sIF9fZW5kLCBfX3ZhbCk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSXRlcmF0b3JUYWc+CisgICAgaW5saW5lIF9JSXRlcgorICAgIF9fZmluZF9zd2l0Y2goX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgY29uc3QgX1RwJiBfX3ZhbCwKKyAgICAgICAgICAgICAgICBfSXRlcmF0b3JUYWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OmZpbmQoX19iZWdpbiwgX19lbmQsIF9fdmFsKTsgfQorCisgIC8vIFBhcmFsbGVsIGZpbmQgZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBfUkFJdGVyCisgICAgX19maW5kX3N3aXRjaChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3ZhbCwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisKKyAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04odHJ1ZSkpCisgICAgICAgIHsKKwkgIHN0ZDo6YmluZGVyMm5kPF9fZ251X3BhcmFsbGVsOjpfRXF1YWxUbzxfVmFsdWVUeXBlLCBjb25zdCBfVHAmPiA+CisgICAgICAgICAgICBfX2NvbXAoX19nbnVfcGFyYWxsZWw6Ol9FcXVhbFRvPF9WYWx1ZVR5cGUsIGNvbnN0IF9UcCY+KCksIF9fdmFsKTsKKyAgICAgICAgICByZXR1cm4gX19nbnVfcGFyYWxsZWw6Ol9fZmluZF90ZW1wbGF0ZSgKKyAgICAgICAgICAgICAgICAgICBfX2JlZ2luLCBfX2VuZCwgX19iZWdpbiwgX19jb21wLAorICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfX2ZpbmRfaWZfc2VsZWN0b3IoKSkuZmlyc3Q7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpmaW5kKF9fYmVnaW4sIF9fZW5kLCBfX3ZhbCk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9JSXRlcgorICAgIGZpbmQoX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgY29uc3QgX1RwJiBfX3ZhbCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX0l0ZXJhdG9yVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3JUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5OworICAgICAgcmV0dXJuIF9fZmluZF9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9fdmFsLCBfSXRlcmF0b3JDYXRlZ29yeSgpKTsKKyAgICB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIF9JSXRlcgorICAgIGZpbmRfaWYoX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgX1ByZWRpY2F0ZSBfX3ByZWQsIAorICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpmaW5kX2lmKF9fYmVnaW4sIF9fZW5kLCBfX3ByZWQpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGUsIHR5cGVuYW1lIF9JdGVyYXRvclRhZz4KKyAgICBpbmxpbmUgX0lJdGVyCisgICAgX19maW5kX2lmX3N3aXRjaChfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBfUHJlZGljYXRlIF9fcHJlZCwgCisgICAgICAgICAgICAgICAgICAgX0l0ZXJhdG9yVGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpmaW5kX2lmKF9fYmVnaW4sIF9fZW5kLCBfX3ByZWQpOyB9CisKKyAgLy8gUGFyYWxsZWwgZmluZF9pZiBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfUkFJdGVyCisgICAgX19maW5kX2lmX3N3aXRjaChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsIAorICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKHRydWUpKQorICAgICAgICByZXR1cm4gX19nbnVfcGFyYWxsZWw6Ol9fZmluZF90ZW1wbGF0ZShfX2JlZ2luLCBfX2VuZCwgX19iZWdpbiwgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19maW5kX2lmX3NlbGVjdG9yKCkpLmZpcnN0OworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX0dMSUJDWFhfU1REX0E6OmZpbmRfaWYoX19iZWdpbiwgX19lbmQsIF9fcHJlZCk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBfSUl0ZXIKKyAgICBmaW5kX2lmKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfSXRlcmF0b3JUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnk7CisgICAgICByZXR1cm4gX19maW5kX2lmX3N3aXRjaChfX2JlZ2luLCBfX2VuZCwgX19wcmVkLCBfSXRlcmF0b3JDYXRlZ29yeSgpKTsKKyAgICB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9GSXRlcmF0b3I+CisgICAgaW5saW5lIF9JSXRlcgorICAgIGZpbmRfZmlyc3Rfb2YoX0lJdGVyIF9fYmVnaW4xLCBfSUl0ZXIgX19lbmQxLCAKKyAgICAgICAgICAgICAgICAgIF9GSXRlcmF0b3IgX19iZWdpbjIsIF9GSXRlcmF0b3IgX19lbmQyLCAKKyAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6ZmluZF9maXJzdF9vZihfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyKTsKKyAgICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX0ZJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX0lJdGVyCisgICAgZmluZF9maXJzdF9vZihfSUl0ZXIgX19iZWdpbjEsIF9JSXRlciBfX2VuZDEsCisgICAgICAgICAgICAgICAgICBfRkl0ZXJhdG9yIF9fYmVnaW4yLCBfRkl0ZXJhdG9yIF9fZW5kMiwKKyAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19jb21wLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpmaW5kX2ZpcnN0X29mKAorICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fY29tcCk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciB0eXBlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX0ZJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMSwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMj4KKyAgICBpbmxpbmUgX0lJdGVyCisgICAgX19maW5kX2ZpcnN0X29mX3N3aXRjaChfSUl0ZXIgX19iZWdpbjEsIF9JSXRlciBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgX0ZJdGVyYXRvciBfX2JlZ2luMiwgX0ZJdGVyYXRvciBfX2VuZDIsIAorICAgICAgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvclRhZzEsIF9JdGVyYXRvclRhZzIpCisgICAgeyByZXR1cm4gZmluZF9maXJzdF9vZihfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsgfQorCisgIC8vIFBhcmFsbGVsIGFsZ29yaXRobSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0ZJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZSwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnPgorICAgIGlubGluZSBfUkFJdGVyCisgICAgX19maW5kX2ZpcnN0X29mX3N3aXRjaChfUkFJdGVyIF9fYmVnaW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9SQUl0ZXIgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9GSXRlcmF0b3IgX19iZWdpbjIsIF9GSXRlcmF0b3IgX19lbmQyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fY29tcCwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIAorICAgICAgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvclRhZykKKyAgICB7CisgICAgICByZXR1cm4gX19nbnVfcGFyYWxsZWw6OgorICAgICAgICBfX2ZpbmRfdGVtcGxhdGUoX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjEsIF9fY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X19maW5kX2ZpcnN0X29mX3NlbGVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgPF9GSXRlcmF0b3I+KF9fYmVnaW4yLCBfX2VuZDIpKS5maXJzdDsKKyAgICB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgdHlwZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9GSXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGUsIHR5cGVuYW1lIF9JdGVyYXRvclRhZzEsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyYXRvclRhZzI+CisgICAgaW5saW5lIF9JSXRlcgorICAgIF9fZmluZF9maXJzdF9vZl9zd2l0Y2goX0lJdGVyIF9fYmVnaW4xLCBfSUl0ZXIgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9GSXRlcmF0b3IgX19iZWdpbjIsIF9GSXRlcmF0b3IgX19lbmQyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fY29tcCwgX0l0ZXJhdG9yVGFnMSwgX0l0ZXJhdG9yVGFnMikKKyAgICB7IHJldHVybiBmaW5kX2ZpcnN0X29mKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fY29tcCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7IH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX0ZJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX0lJdGVyCisgICAgZmluZF9maXJzdF9vZihfSUl0ZXIgX19iZWdpbjEsIF9JSXRlciBfX2VuZDEsCisgICAgICAgICAgICAgICAgICBfRkl0ZXJhdG9yIF9fYmVnaW4yLCBfRkl0ZXJhdG9yIF9fZW5kMiwgCisgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX0lJdGVyVHJhaXRzOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfRkl0ZXJhdG9yPiBfRkl0ZXJUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX0lJdGVyYXRvckNhdGVnb3J5OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRkl0ZXJUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9GSXRlcmF0b3JDYXRlZ29yeTsKKworICAgICAgcmV0dXJuIF9fZmluZF9maXJzdF9vZl9zd2l0Y2goX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JSXRlcmF0b3JDYXRlZ29yeSgpLCBfRkl0ZXJhdG9yQ2F0ZWdvcnkoKSk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UsIGluc2VydCBkZWZhdWx0IGNvbXBhcmF0b3IKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfRkl0ZXJhdG9yPgorICAgIGlubGluZSBfSUl0ZXIKKyAgICBmaW5kX2ZpcnN0X29mKF9JSXRlciBfX2JlZ2luMSwgX0lJdGVyIF9fZW5kMSwgCisgICAgICAgICAgICAgICAgICBfRkl0ZXJhdG9yIF9fYmVnaW4yLCBfRkl0ZXJhdG9yIF9fZW5kMikKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX0lJdGVyVHJhaXRzOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfRkl0ZXJhdG9yPiBfRkl0ZXJUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czo6dmFsdWVfdHlwZSBfSVZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0ZJdGVyVHJhaXRzOjp2YWx1ZV90eXBlIF9GVmFsdWVUeXBlOworCisgICAgICByZXR1cm4gX19nbnVfcGFyYWxsZWw6OmZpbmRfZmlyc3Rfb2YoX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X0VxdWFsVG88X0lWYWx1ZVR5cGUsIF9GVmFsdWVUeXBlPigpKTsKKyAgICB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgdW5pcXVlX2NvcHkoX0lJdGVyIF9fYmVnaW4xLCBfSUl0ZXIgX19lbmQxLCBfT3V0cHV0SXRlcmF0b3IgX19vdXQsCisgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjp1bmlxdWVfY29weShfX2JlZ2luMSwgX19lbmQxLCBfX291dCk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICB1bmlxdWVfY29weShfSUl0ZXIgX19iZWdpbjEsIF9JSXRlciBfX2VuZDEsIF9PdXRwdXRJdGVyYXRvciBfX291dCwKKyAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjp1bmlxdWVfY29weShfX2JlZ2luMSwgX19lbmQxLCBfX291dCwgX19wcmVkKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sgZm9yIGlucHV0IGl0ZXJhdG9yIGNhc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9QcmVkaWNhdGUsIHR5cGVuYW1lIF9JdGVyYXRvclRhZzEsIHR5cGVuYW1lIF9JdGVyYXRvclRhZzI+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fdW5pcXVlX2NvcHlfc3dpdGNoKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19sYXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fb3V0LCBfUHJlZGljYXRlIF9fcHJlZCwgCisgICAgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvclRhZzEsIF9JdGVyYXRvclRhZzIpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnVuaXF1ZV9jb3B5KF9fYmVnaW4sIF9fbGFzdCwgX19vdXQsIF9fcHJlZCk7IH0KKworICAvLyBQYXJhbGxlbCB1bmlxdWVfY29weSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgUmFuZG9tQWNjZXNzT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgUmFuZG9tQWNjZXNzT3V0cHV0SXRlcmF0b3IKKyAgICBfX3VuaXF1ZV9jb3B5X3N3aXRjaChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19sYXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzT3V0cHV0SXRlcmF0b3IgX19vdXQsIF9QcmVkaWNhdGUgX19wcmVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxfX2dudV9wYXJhbGxlbDo6X1NlcXVlbmNlSW5kZXg+KF9fbGFzdCAtIF9fYmVnaW4pCisgICAgICAgICAgICA+IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLnVuaXF1ZV9jb3B5X21pbmltYWxfbikpCisgICAgICAgIHJldHVybiBfX2dudV9wYXJhbGxlbDo6X19wYXJhbGxlbF91bmlxdWVfY29weSgKKyAgICAgICAgICAgICAgICAgX19iZWdpbiwgX19sYXN0LCBfX291dCwgX19wcmVkKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjp1bmlxdWVfY29weShfX2JlZ2luLCBfX2xhc3QsIF9fb3V0LCBfX3ByZWQpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICB1bmlxdWVfY29weShfSUl0ZXIgX19iZWdpbjEsIF9JSXRlciBfX2VuZDEsIF9PdXRwdXRJdGVyYXRvciBfX291dCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX0lJdGVyVHJhaXRzOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfT3V0cHV0SXRlcmF0b3I+IF9PSXRlclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfSUl0ZXJhdG9yQ2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfT0l0ZXJUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9PSXRlckNhdGVnb3J5OworCisgICAgICByZXR1cm4gX191bmlxdWVfY29weV9zd2l0Y2goCisgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX291dCwgZXF1YWxfdG88X1ZhbHVlVHlwZT4oKSwKKyAgICAgICAgICAgICAgIF9JSXRlcmF0b3JDYXRlZ29yeSgpLCBfT0l0ZXJDYXRlZ29yeSgpKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgdW5pcXVlX2NvcHkoX0lJdGVyIF9fYmVnaW4xLCBfSUl0ZXIgX19lbmQxLCBfT3V0cHV0SXRlcmF0b3IgX19vdXQsCisgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+IF9JSXRlclRyYWl0czsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X091dHB1dEl0ZXJhdG9yPiBfT0l0ZXJUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX0lJdGVyYXRvckNhdGVnb3J5OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfT0l0ZXJUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9PSXRlckNhdGVnb3J5OworCisgICAgICByZXR1cm4gX191bmlxdWVfY29weV9zd2l0Y2goCisgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX291dCwgX19wcmVkLAorICAgICAgICAgICAgICAgX0lJdGVyYXRvckNhdGVnb3J5KCksIF9PSXRlckNhdGVnb3J5KCkpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgc2V0X3VuaW9uKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwKKyAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fb3V0LCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnNldF91bmlvbigKKyAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fb3V0KTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBzZXRfdW5pb24oX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgIF9JSXRlcjIgX19iZWdpbjIsIF9JSXRlcjIgX19lbmQyLAorICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19vdXQsIF9QcmVkaWNhdGUgX19wcmVkLAorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnNldF91bmlvbihfX2JlZ2luMSwgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iZWdpbjIsIF9fZW5kMiwgX19vdXQsIF9fcHJlZCk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9QcmVkaWNhdGUsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMiwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMz4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgX19zZXRfdW5pb25fc3dpdGNoKAorICAgICAgX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIF9JSXRlcjIgX19iZWdpbjIsIF9JSXRlcjIgX19lbmQyLAorICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfUHJlZGljYXRlIF9fcHJlZCwKKyAgICAgIF9JdGVyYXRvclRhZzEsIF9JdGVyYXRvclRhZzIsIF9JdGVyYXRvclRhZzMpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnNldF91bmlvbihfX2JlZ2luMSwgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iZWdpbjIsIF9fZW5kMiwgX19yZXN1bHQsIF9fcHJlZCk7IH0KKworICAvLyBQYXJhbGxlbCBzZXRfdW5pb24gZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIxLCB0eXBlbmFtZSBfUkFJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dF9SQUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX091dHB1dF9SQUl0ZXIKKyAgICBfX3NldF91bmlvbl9zd2l0Y2goX1JBSXRlcjEgX19iZWdpbjEsIF9SQUl0ZXIxIF9fZW5kMSwgCisgICAgICAgICAgICAgICAgICAgICBfUkFJdGVyMiBfX2JlZ2luMiwgX1JBSXRlcjIgX19lbmQyLCAKKyAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRfUkFJdGVyIF9fcmVzdWx0LCBfUHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgCisgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X19nbnVfcGFyYWxsZWw6Ol9TZXF1ZW5jZUluZGV4PihfX2VuZDEgLSBfX2JlZ2luMSkKKyAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLnNldF91bmlvbl9taW5pbWFsX24KKyAgICAgICAgICAgIHx8IHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQyIC0gX19iZWdpbjIpCisgICAgICAgICAgICA+PSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5zZXRfdW5pb25fbWluaW1hbF9uKSkKKyAgICAgICAgcmV0dXJuIF9fZ251X3BhcmFsbGVsOjpfX3BhcmFsbGVsX3NldF91bmlvbigKKyAgICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19yZXN1bHQsIF9fcHJlZCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfR0xJQkNYWF9TVERfQTo6c2V0X3VuaW9uKF9fYmVnaW4xLCBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmVnaW4yLCBfX2VuZDIsIF9fcmVzdWx0LCBfX3ByZWQpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yIAorICAgIHNldF91bmlvbihfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwKKyAgICAgICAgICAgICAgX0lJdGVyMiBfX2JlZ2luMiwgX0lJdGVyMiBfX2VuZDIsIF9PdXRwdXRJdGVyYXRvciBfX291dCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcjE+IF9JSXRlclRyYWl0czE7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcjI+IF9JSXRlclRyYWl0czI7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9PdXRwdXRJdGVyYXRvcj4gX09JdGVyVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMxOjppdGVyYXRvcl9jYXRlZ29yeQorICAgICAgICBfSUl0ZXJDYXRlZ29yeTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czI6Oml0ZXJhdG9yX2NhdGVnb3J5CisgICAgICAgIF9JSXRlckNhdGVnb3J5MjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX09JdGVyVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfT0l0ZXJDYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzMTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzMjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMjsKKworICAgICAgcmV0dXJuIF9fc2V0X3VuaW9uX3N3aXRjaCgKKyAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fb3V0LAorICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9MZXNzPF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4oKSwKKyAgICAgICAgICAgICAgIF9JSXRlckNhdGVnb3J5MSgpLCBfSUl0ZXJDYXRlZ29yeTIoKSwgX09JdGVyQ2F0ZWdvcnkoKSk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IgCisgICAgc2V0X3VuaW9uKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwKKyAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fb3V0LCBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcjE+IF9JSXRlclRyYWl0czE7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcjI+IF9JSXRlclRyYWl0czI7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9PdXRwdXRJdGVyYXRvcj4gX09JdGVyVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMxOjppdGVyYXRvcl9jYXRlZ29yeQorICAgICAgICBfSUl0ZXJDYXRlZ29yeTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czI6Oml0ZXJhdG9yX2NhdGVnb3J5CisgICAgICAgIF9JSXRlckNhdGVnb3J5MjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX09JdGVyVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfT0l0ZXJDYXRlZ29yeTsKKworICAgICAgcmV0dXJuIF9fc2V0X3VuaW9uX3N3aXRjaCgKKyAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fb3V0LCBfX3ByZWQsCisgICAgICAgICAgICAgICBfSUl0ZXJDYXRlZ29yeTEoKSwgX0lJdGVyQ2F0ZWdvcnkyKCksIF9PSXRlckNhdGVnb3J5KCkpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIHNldF9pbnRlcnNlY3Rpb24oX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwKKyAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX291dCwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpzZXRfaW50ZXJzZWN0aW9uKF9fYmVnaW4xLCBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iZWdpbjIsIF9fZW5kMiwgX19vdXQpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBzZXRfaW50ZXJzZWN0aW9uKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgX0lJdGVyMiBfX2JlZ2luMiwgX0lJdGVyMiBfX2VuZDIsCisgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19vdXQsIF9QcmVkaWNhdGUgX19wcmVkLCAKKyAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6c2V0X2ludGVyc2VjdGlvbigKKyAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fb3V0LCBfX3ByZWQpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyYXRvclRhZzEsIHR5cGVuYW1lIF9JdGVyYXRvclRhZzIsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyYXRvclRhZzM+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvciAKKyAgICBfX3NldF9pbnRlcnNlY3Rpb25fc3dpdGNoKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lJdGVyMiBfX2JlZ2luMiwgX0lJdGVyMiBfX2VuZDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9QcmVkaWNhdGUgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0l0ZXJhdG9yVGFnMSwgX0l0ZXJhdG9yVGFnMiwgX0l0ZXJhdG9yVGFnMykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6c2V0X2ludGVyc2VjdGlvbihfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2VuZDIsIF9fcmVzdWx0LCBfX3ByZWQpOyB9CisKKyAgLy8gUGFyYWxsZWwgc2V0X2ludGVyc2VjdGlvbiBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0X1JBSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfT3V0cHV0X1JBSXRlcgorICAgIF9fc2V0X2ludGVyc2VjdGlvbl9zd2l0Y2goX1JBSXRlcjEgX19iZWdpbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JBSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SQUl0ZXIyIF9fYmVnaW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SQUl0ZXIyIF9fZW5kMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0X1JBSXRlciBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X19nbnVfcGFyYWxsZWw6Ol9TZXF1ZW5jZUluZGV4PihfX2VuZDEgLSBfX2JlZ2luMSkKKyAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLnNldF91bmlvbl9taW5pbWFsX24KKyAgICAgICAgICAgIHx8IHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQyIC0gX19iZWdpbjIpCisgICAgICAgICAgICA+PSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5zZXRfdW5pb25fbWluaW1hbF9uKSkKKyAgICAgICAgcmV0dXJuIF9fZ251X3BhcmFsbGVsOjpfX3BhcmFsbGVsX3NldF9pbnRlcnNlY3Rpb24oCisgICAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fcmVzdWx0LCBfX3ByZWQpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnNldF9pbnRlcnNlY3Rpb24oCisgICAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fcmVzdWx0LCBfX3ByZWQpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yIAorICAgIHNldF9pbnRlcnNlY3Rpb24oX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIAorICAgICAgICAgICAgICAgICAgICAgX0lJdGVyMiBfX2JlZ2luMiwgX0lJdGVyMiBfX2VuZDIsIAorICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fb3V0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyMT4gX0lJdGVyVHJhaXRzMTsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyMj4gX0lJdGVyVHJhaXRzMjsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X091dHB1dEl0ZXJhdG9yPiBfT0l0ZXJUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czE6Oml0ZXJhdG9yX2NhdGVnb3J5CisgICAgICAgIF9JSXRlckNhdGVnb3J5MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzMjo6aXRlcmF0b3JfY2F0ZWdvcnkKKyAgICAgICAgX0lJdGVyQ2F0ZWdvcnkyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfT0l0ZXJUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9PSXRlckNhdGVnb3J5OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMxOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMyOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUyOworCisgICAgICByZXR1cm4gX19zZXRfaW50ZXJzZWN0aW9uX3N3aXRjaCgKKyAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fb3V0LAorICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9MZXNzPF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4oKSwKKyAgICAgICAgICAgICAgIF9JSXRlckNhdGVnb3J5MSgpLCBfSUl0ZXJDYXRlZ29yeTIoKSwgX09JdGVyQ2F0ZWdvcnkoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yIAorICAgIHNldF9pbnRlcnNlY3Rpb24oX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwKKyAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX291dCwgX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIxPiBfSUl0ZXJUcmFpdHMxOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIyPiBfSUl0ZXJUcmFpdHMyOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfT3V0cHV0SXRlcmF0b3I+IF9PSXRlclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzMTo6aXRlcmF0b3JfY2F0ZWdvcnkKKyAgICAgICAgX0lJdGVyQ2F0ZWdvcnkxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMyOjppdGVyYXRvcl9jYXRlZ29yeQorICAgICAgICBfSUl0ZXJDYXRlZ29yeTI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9PSXRlclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX09JdGVyQ2F0ZWdvcnk7CisKKyAgICAgIHJldHVybiBfX3NldF9pbnRlcnNlY3Rpb25fc3dpdGNoKAorICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19vdXQsIF9fcHJlZCwKKyAgICAgICAgICAgICAgIF9JSXRlckNhdGVnb3J5MSgpLCBfSUl0ZXJDYXRlZ29yeTIoKSwgX09JdGVyQ2F0ZWdvcnkoKSk7CisgICAgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JSXRlcjIgX19iZWdpbjIsIF9JSXRlcjIgX19lbmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6c2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKAorICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19vdXQpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZShfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lJdGVyMiBfX2JlZ2luMiwgX0lJdGVyMiBfX2VuZDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX291dCwgX1ByZWRpY2F0ZSBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6c2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKAorICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19vdXQsIF9fcHJlZCk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9QcmVkaWNhdGUsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMSwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMz4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yIAorICAgIF9fc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlX3N3aXRjaCgKKyAgICAgIF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLCBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwKKyAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX1ByZWRpY2F0ZSBfX3ByZWQsCisgICAgICBfSXRlcmF0b3JUYWcxLCBfSXRlcmF0b3JUYWcyLCBfSXRlcmF0b3JUYWczKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoCisgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX3Jlc3VsdCwgX19wcmVkKTsgfQorCisgIC8vIFBhcmFsbGVsIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0X1JBSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfT3V0cHV0X1JBSXRlcgorICAgIF9fc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlX3N3aXRjaChfUkFJdGVyMSBfX2JlZ2luMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SQUl0ZXIxIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SQUl0ZXIyIF9fYmVnaW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JBSXRlcjIgX19lbmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dF9SQUl0ZXIgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgc3RhdGljX2Nhc3Q8X19nbnVfcGFyYWxsZWw6Ol9TZXF1ZW5jZUluZGV4PihfX2VuZDEgLSBfX2JlZ2luMSkKKyAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLnNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZV9taW5pbWFsX24KKyAgICAgIHx8IHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQyIC0gX19iZWdpbjIpCisgICAgICA+PSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5zZXRfc3ltbWV0cmljX2RpZmZlcmVuY2VfbWluaW1hbF9uKSkKKyAgcmV0dXJuIF9fZ251X3BhcmFsbGVsOjpfX3BhcmFsbGVsX3NldF9zeW1tZXRyaWNfZGlmZmVyZW5jZSgKKyAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19yZXN1bHQsIF9fcHJlZCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfR0xJQkNYWF9TVERfQTo6c2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKAorICAgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX3Jlc3VsdCwgX19wcmVkKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IgCisgICAgc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fb3V0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyMT4gX0lJdGVyVHJhaXRzMTsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyMj4gX0lJdGVyVHJhaXRzMjsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X091dHB1dEl0ZXJhdG9yPiBfT0l0ZXJUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czE6Oml0ZXJhdG9yX2NhdGVnb3J5CisgICAgICAgIF9JSXRlckNhdGVnb3J5MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzMjo6aXRlcmF0b3JfY2F0ZWdvcnkKKyAgICAgICAgX0lJdGVyQ2F0ZWdvcnkyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfT0l0ZXJUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9PSXRlckNhdGVnb3J5OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMxOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMyOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUyOworCisgICAgICByZXR1cm4gX19zZXRfc3ltbWV0cmljX2RpZmZlcmVuY2Vfc3dpdGNoKAorICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19vdXQsCisgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X0xlc3M8X1ZhbHVlVHlwZTEsIF9WYWx1ZVR5cGUyPigpLAorICAgICAgICAgICAgICAgX0lJdGVyQ2F0ZWdvcnkxKCksIF9JSXRlckNhdGVnb3J5MigpLCBfT0l0ZXJDYXRlZ29yeSgpKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IgCisgICAgc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fb3V0LCBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcjE+IF9JSXRlclRyYWl0czE7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcjI+IF9JSXRlclRyYWl0czI7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9PdXRwdXRJdGVyYXRvcj4gX09JdGVyVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMxOjppdGVyYXRvcl9jYXRlZ29yeQorICAgICAgICBfSUl0ZXJDYXRlZ29yeTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czI6Oml0ZXJhdG9yX2NhdGVnb3J5CisgICAgICAgIF9JSXRlckNhdGVnb3J5MjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX09JdGVyVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfT0l0ZXJDYXRlZ29yeTsKKworICAgICAgcmV0dXJuIF9fc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlX3N3aXRjaCgKKyAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fb3V0LCBfX3ByZWQsCisgICAgICAgICAgICAgICBfSUl0ZXJDYXRlZ29yeTEoKSwgX0lJdGVyQ2F0ZWdvcnkyKCksIF9PSXRlckNhdGVnb3J5KCkpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIHNldF9kaWZmZXJlbmNlKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLCAKKyAgICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwgCisgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fb3V0LCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnNldF9kaWZmZXJlbmNlKAorICAgICAgICAgICAgICAgX19iZWdpbjEsX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX291dCk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIHNldF9kaWZmZXJlbmNlKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLCAKKyAgICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwgCisgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fb3V0LCBfUHJlZGljYXRlIF9fcHJlZCwgCisgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpzZXRfZGlmZmVyZW5jZShfX2JlZ2luMSwgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlZ2luMiwgX19lbmQyLCBfX291dCwgX19wcmVkKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sgZm9yIGlucHV0IGl0ZXJhdG9yIGNhc2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9QcmVkaWNhdGUsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMiwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMz4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgX19zZXRfZGlmZmVyZW5jZV9zd2l0Y2goX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX1ByZWRpY2F0ZSBfX3ByZWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBfSXRlcmF0b3JUYWcxLCBfSXRlcmF0b3JUYWcyLCBfSXRlcmF0b3JUYWczKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpzZXRfZGlmZmVyZW5jZSgKKyAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fcmVzdWx0LCBfX3ByZWQpOyB9CisKKyAgLy8gUGFyYWxsZWwgc2V0X2RpZmZlcmVuY2UgZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIxLCB0eXBlbmFtZSBfUkFJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dF9SQUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX091dHB1dF9SQUl0ZXIKKyAgICBfX3NldF9kaWZmZXJlbmNlX3N3aXRjaChfUkFJdGVyMSBfX2JlZ2luMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX1JBSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfUkFJdGVyMiBfX2JlZ2luMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX1JBSXRlcjIgX19lbmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0X1JBSXRlciBfX3Jlc3VsdCwgX1ByZWRpY2F0ZSBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQxIC0gX19iZWdpbjEpCisgICAgICAgICAgICA+PSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5zZXRfZGlmZmVyZW5jZV9taW5pbWFsX24KKyAgICAgICAgICAgIHx8IHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQyIC0gX19iZWdpbjIpCisgICAgICAgICAgICA+PSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5zZXRfZGlmZmVyZW5jZV9taW5pbWFsX24pKQorICAgICAgICByZXR1cm4gX19nbnVfcGFyYWxsZWw6Ol9fcGFyYWxsZWxfc2V0X2RpZmZlcmVuY2UoCisgICAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fcmVzdWx0LCBfX3ByZWQpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnNldF9kaWZmZXJlbmNlKAorICAgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX3Jlc3VsdCwgX19wcmVkKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIHNldF9kaWZmZXJlbmNlKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLCAKKyAgICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwgCisgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fb3V0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyMT4gX0lJdGVyVHJhaXRzMTsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyMj4gX0lJdGVyVHJhaXRzMjsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X091dHB1dEl0ZXJhdG9yPiBfT0l0ZXJUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czE6Oml0ZXJhdG9yX2NhdGVnb3J5CisgICAgICAgIF9JSXRlckNhdGVnb3J5MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzMjo6aXRlcmF0b3JfY2F0ZWdvcnkKKyAgICAgICAgX0lJdGVyQ2F0ZWdvcnkyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfT0l0ZXJUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9PSXRlckNhdGVnb3J5OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMxOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMyOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUyOworCisgICAgICByZXR1cm4gX19zZXRfZGlmZmVyZW5jZV9zd2l0Y2goCisgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX291dCwKKyAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfTGVzczxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+KCksCisgICAgICAgICAgICAgICBfSUl0ZXJDYXRlZ29yeTEoKSwgX0lJdGVyQ2F0ZWdvcnkyKCksIF9PSXRlckNhdGVnb3J5KCkpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgc2V0X2RpZmZlcmVuY2UoX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIAorICAgICAgICAgICAgICAgICAgIF9JSXRlcjIgX19iZWdpbjIsIF9JSXRlcjIgX19lbmQyLCAKKyAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19vdXQsIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyMT4gX0lJdGVyVHJhaXRzMTsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyMj4gX0lJdGVyVHJhaXRzMjsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X091dHB1dEl0ZXJhdG9yPiBfT0l0ZXJUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czE6Oml0ZXJhdG9yX2NhdGVnb3J5CisgICAgICAgIF9JSXRlckNhdGVnb3J5MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzMjo6aXRlcmF0b3JfY2F0ZWdvcnkKKyAgICAgICAgX0lJdGVyQ2F0ZWdvcnkyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfT0l0ZXJUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9PSXRlckNhdGVnb3J5OworCisgICAgICByZXR1cm4gX19zZXRfZGlmZmVyZW5jZV9zd2l0Y2goCisgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX291dCwgX19wcmVkLAorICAgICAgICAgICAgICAgX0lJdGVyQ2F0ZWdvcnkxKCksIF9JSXRlckNhdGVnb3J5MigpLCBfT0l0ZXJDYXRlZ29yeSgpKTsKKyAgICB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yPgorICAgIGlubGluZSBfRkl0ZXJhdG9yCisgICAgYWRqYWNlbnRfZmluZChfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIAorICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjphZGphY2VudF9maW5kKF9fYmVnaW4sIF9fZW5kKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIGFkamFjZW50X2ZpbmQoX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLCAKKyAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCwKKyAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6YWRqYWNlbnRfZmluZChfX2JlZ2luLCBfX2VuZCwgX19iaW5hcnlfcHJlZCk7IH0KKworICAvLyBQYXJhbGxlbCBhbGdvcml0aG0gZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgX1JBSXRlcgorICAgIF9fYWRqYWNlbnRfZmluZF9zd2l0Y2goX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTih0cnVlKSkKKyAgICAgICAgeworICAgICAgICAgIF9SQUl0ZXIgX19zcG90ID0gX19nbnVfcGFyYWxsZWw6OgorICAgICAgICAgICAgICBfX2ZpbmRfdGVtcGxhdGUoCisgICAgICAgICAgICAgICAgX19iZWdpbiwgX19lbmQgLSAxLCBfX2JlZ2luLCBlcXVhbF90bzxfVmFsdWVUeXBlPigpLAorICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfX2FkamFjZW50X2ZpbmRfc2VsZWN0b3IoKSkKKyAgICAgICAgICAgIC5maXJzdDsKKyAgICAgICAgICBpZiAoX19zcG90ID09IChfX2VuZCAtIDEpKQorICAgICAgICAgICAgcmV0dXJuIF9fZW5kOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBfX3Nwb3Q7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGFkamFjZW50X2ZpbmQoX19iZWdpbiwgX19lbmQsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsKKyAgICB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfSXRlcmF0b3JUYWc+CisgICAgaW5saW5lIF9GSXRlcmF0b3IKKyAgICBfX2FkamFjZW50X2ZpbmRfc3dpdGNoKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfSXRlcmF0b3JUYWcpCisgICAgeyByZXR1cm4gYWRqYWNlbnRfZmluZChfX2JlZ2luLCBfX2VuZCwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOyB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yPgorICAgIGlubGluZSBfRkl0ZXJhdG9yCisgICAgYWRqYWNlbnRfZmluZChfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQpCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0ZJdGVyYXRvcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTsKKyAgICAgIHJldHVybiBfX2FkamFjZW50X2ZpbmRfc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfSXRlcmF0b3JDYXRlZ29yeSgpKTsKKyAgICB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlLAorICAgICAgICAgICB0eXBlbmFtZSBfSXRlcmF0b3JUYWc+CisgICAgaW5saW5lIF9GSXRlcmF0b3IKKyAgICBfX2FkamFjZW50X2ZpbmRfc3dpdGNoKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQsIF9JdGVyYXRvclRhZykKKyAgICB7IHJldHVybiBhZGphY2VudF9maW5kKF9fYmVnaW4sIF9fZW5kLCBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7IH0KKworICAvLyBQYXJhbGxlbCBhbGdvcml0aG0gZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX1JBSXRlcgorICAgIF9fYWRqYWNlbnRfZmluZF9zd2l0Y2goX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTih0cnVlKSkKKyAgICAgICAgcmV0dXJuIF9fZ251X3BhcmFsbGVsOjpfX2ZpbmRfdGVtcGxhdGUoX19iZWdpbiwgX19lbmQsIF9fYmVnaW4sIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYWRqYWNlbnRfZmluZF9zZWxlY3RvcigpKS5maXJzdDsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGFkamFjZW50X2ZpbmQoX19iZWdpbiwgX19lbmQsIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IsIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgaW5saW5lIF9GSXRlcmF0b3IKKyAgICBhZGphY2VudF9maW5kKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgCisgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfRkl0ZXJhdG9yPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5OworICAgICAgcmV0dXJuIF9fYWRqYWNlbnRfZmluZF9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvckNhdGVnb3J5KCkpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgY291bnQoX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgY29uc3QgX1RwJiBfX3ZhbHVlLCAKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OmNvdW50KF9fYmVnaW4sIF9fZW5kLCBfX3ZhbHVlKTsgfQorCisgIC8vIFBhcmFsbGVsIGNvZGUgZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9UcD4KKyAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIF9fY291bnRfc3dpdGNoKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwgCisgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX192YWx1ZSwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIAorICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnIAorICAgICAgICAgICAgICAgICA9IF9fZ251X3BhcmFsbGVsOjpwYXJhbGxlbF91bmJhbGFuY2VkKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKyAgICAgIHR5cGVkZWYgX19nbnVfcGFyYWxsZWw6Ol9TZXF1ZW5jZUluZGV4IF9TZXF1ZW5jZUluZGV4OworCisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X1NlcXVlbmNlSW5kZXg+KF9fZW5kIC0gX19iZWdpbikKKyAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLmNvdW50X21pbmltYWxfbgorICAgICAgICAgICAgJiYgX19nbnVfcGFyYWxsZWw6Ol9faXNfcGFyYWxsZWwoX19wYXJhbGxlbGlzbV90YWcpKSkKKyAgICAgICAgeworICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfX2NvdW50X3NlbGVjdG9yPF9SQUl0ZXIsIF9EaWZmZXJlbmNlVHlwZT4KKyAgICAgICAgICAgIF9fZnVuY3Rpb25hbGl0eTsKKyAgICAgICAgICBfRGlmZmVyZW5jZVR5cGUgX19yZXMgPSAwOworICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjoKKyAgICAgICAgICAgIF9fZm9yX2VhY2hfdGVtcGxhdGVfcmFuZG9tX2FjY2VzcygKKyAgICAgICAgICAgICAgX19iZWdpbiwgX19lbmQsIF9fdmFsdWUsIF9fZnVuY3Rpb25hbGl0eSwKKyAgICAgICAgICAgICAgc3RkOjpwbHVzPF9TZXF1ZW5jZUluZGV4PigpLCBfX3JlcywgX19yZXMsIC0xLAorICAgICAgICAgICAgICBfX3BhcmFsbGVsaXNtX3RhZyk7CisgICAgICAgICAgcmV0dXJuIF9fcmVzOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBjb3VudChfX2JlZ2luLCBfX2VuZCwgX192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsKKyAgICB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9JdGVyYXRvclRhZz4KKyAgICBpbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIF9fY291bnRfc3dpdGNoKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsIGNvbnN0IF9UcCYgX192YWx1ZSwgCisgICAgICAgICAgICAgICAgIF9JdGVyYXRvclRhZykKKyAgICB7IHJldHVybiBjb3VudChfX2JlZ2luLCBfX2VuZCwgX192YWx1ZSwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOworICAgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgY291bnQoX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgY29uc3QgX1RwJiBfX3ZhbHVlLCAKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTsKKyAgICAgIHJldHVybiBfX2NvdW50X3N3aXRjaChfX2JlZ2luLCBfX2VuZCwgX192YWx1ZSwgX0l0ZXJhdG9yQ2F0ZWdvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3BhcmFsbGVsaXNtX3RhZyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgY291bnQoX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgY29uc3QgX1RwJiBfX3ZhbHVlKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTsKKyAgICAgIHJldHVybiBfX2NvdW50X3N3aXRjaChfX2JlZ2luLCBfX2VuZCwgX192YWx1ZSwgX0l0ZXJhdG9yQ2F0ZWdvcnkoKSk7CisgICAgfQorCisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgY291bnRfaWYoX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgX1ByZWRpY2F0ZSBfX3ByZWQsIAorICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6Y291bnRfaWYoX19iZWdpbiwgX19lbmQsIF9fcHJlZCk7IH0KKworICAvLyBQYXJhbGxlbCBjb3VudF9pZiBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIF9fY291bnRfaWZfc3dpdGNoKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwgCisgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtX3RhZworICAgICAgICAgICAgICAgICAgICA9IF9fZ251X3BhcmFsbGVsOjpwYXJhbGxlbF91bmJhbGFuY2VkKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKyAgICAgIHR5cGVkZWYgX19nbnVfcGFyYWxsZWw6Ol9TZXF1ZW5jZUluZGV4IF9TZXF1ZW5jZUluZGV4OworCisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X1NlcXVlbmNlSW5kZXg+KF9fZW5kIC0gX19iZWdpbikKKyAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLmNvdW50X21pbmltYWxfbgorICAgICAgICAgICAgJiYgX19nbnVfcGFyYWxsZWw6Ol9faXNfcGFyYWxsZWwoX19wYXJhbGxlbGlzbV90YWcpKSkKKyAgICAgICAgeworICAgICAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX3JlcyA9IDA7CisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OgorICAgICAgICAgICAgX19jb3VudF9pZl9zZWxlY3RvcjxfUkFJdGVyLCBfRGlmZmVyZW5jZVR5cGU+CisgICAgICAgICAgICBfX2Z1bmN0aW9uYWxpdHk7CisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OgorICAgICAgICAgICAgX19mb3JfZWFjaF90ZW1wbGF0ZV9yYW5kb21fYWNjZXNzKAorICAgICAgICAgICAgICBfX2JlZ2luLCBfX2VuZCwgX19wcmVkLCBfX2Z1bmN0aW9uYWxpdHksCisgICAgICAgICAgICAgIHN0ZDo6cGx1czxfU2VxdWVuY2VJbmRleD4oKSwgX19yZXMsIF9fcmVzLCAtMSwKKyAgICAgICAgICAgICAgX19wYXJhbGxlbGlzbV90YWcpOworICAgICAgICAgIHJldHVybiBfX3JlczsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gY291bnRfaWYoX19iZWdpbiwgX19lbmQsIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsKKyAgICB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfSXRlcmF0b3JUYWc+CisgICAgaW5saW5lIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBfX2NvdW50X2lmX3N3aXRjaChfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBfUHJlZGljYXRlIF9fcHJlZCwgCisgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvclRhZykKKyAgICB7IHJldHVybiBjb3VudF9pZihfX2JlZ2luLCBfX2VuZCwgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIGNvdW50X2lmKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsIF9QcmVkaWNhdGUgX19wcmVkLCAKKyAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTsKKyAgICAgIHJldHVybiBfX2NvdW50X2lmX3N3aXRjaChfX2JlZ2luLCBfX2VuZCwgX19wcmVkLCBfSXRlcmF0b3JDYXRlZ29yeSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wYXJhbGxlbGlzbV90YWcpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBjb3VudF9pZihfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnk7CisgICAgICByZXR1cm4gX19jb3VudF9pZl9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9fcHJlZCwgX0l0ZXJhdG9yQ2F0ZWdvcnkoKSk7CisgICAgfQorCisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvcjEsIHR5cGVuYW1lIF9GSXRlcmF0b3IyPgorICAgIGlubGluZSBfRkl0ZXJhdG9yMQorICAgIHNlYXJjaChfRkl0ZXJhdG9yMSBfX2JlZ2luMSwgX0ZJdGVyYXRvcjEgX19lbmQxLAorICAgICAgICAgICBfRkl0ZXJhdG9yMiBfX2JlZ2luMiwgX0ZJdGVyYXRvcjIgX19lbmQyLAorICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnNlYXJjaChfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyKTsgfQorCisgIC8vIFBhcmFsbGVsIGFsZ29yaXRobSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjI+CisgICAgX1JBSXRlcjEKKyAgICBfX3NlYXJjaF9zd2l0Y2goX1JBSXRlcjEgX19iZWdpbjEsIF9SQUl0ZXIxIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgIF9SQUl0ZXIyIF9fYmVnaW4yLCBfUkFJdGVyMiBfX2VuZDIsCisgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyMT4gX0l0ZXJhdG9yMVRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yMVRyYWl0czo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcjI+IF9JdGVyYXRvcjJUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjJUcmFpdHM6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTI7CisKKyAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X19nbnVfcGFyYWxsZWw6Ol9TZXF1ZW5jZUluZGV4PihfX2VuZDEgLSBfX2JlZ2luMSkKKyAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLnNlYXJjaF9taW5pbWFsX24pKQorICAgICAgICByZXR1cm4gX19nbnVfcGFyYWxsZWw6OgorICAgICAgICAgIF9fc2VhcmNoX3RlbXBsYXRlKAorICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwKKyAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfRXF1YWxUbzxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+KCkpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gc2VhcmNoKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsCisgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IxLCB0eXBlbmFtZSBfRkl0ZXJhdG9yMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMSwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMj4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcjEKKyAgICBfX3NlYXJjaF9zd2l0Y2goX0ZJdGVyYXRvcjEgX19iZWdpbjEsIF9GSXRlcmF0b3IxIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgIF9GSXRlcmF0b3IyIF9fYmVnaW4yLCBfRkl0ZXJhdG9yMiBfX2VuZDIsCisgICAgICAgICAgICAgICAgICBfSXRlcmF0b3JUYWcxLCBfSXRlcmF0b3JUYWcyKQorICAgIHsgcmV0dXJuIHNlYXJjaChfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLAorICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7IH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yMSwgdHlwZW5hbWUgX0ZJdGVyYXRvcjI+CisgICAgaW5saW5lIF9GSXRlcmF0b3IxCisgICAgc2VhcmNoKF9GSXRlcmF0b3IxIF9fYmVnaW4xLCBfRkl0ZXJhdG9yMSBfX2VuZDEsCisgICAgICAgICAgIF9GSXRlcmF0b3IyIF9fYmVnaW4yLCBfRkl0ZXJhdG9yMiBfX2VuZDIpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfRkl0ZXJhdG9yMT4gX0l0ZXJhdG9yMVRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yMVRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnkxOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfRkl0ZXJhdG9yMj4gX0l0ZXJhdG9yMlRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yMlRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnkyOworCisgICAgICByZXR1cm4gX19zZWFyY2hfc3dpdGNoKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfSXRlcmF0b3JDYXRlZ29yeTEoKSwgX0l0ZXJhdG9yQ2F0ZWdvcnkyKCkpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yMSwgdHlwZW5hbWUgX0ZJdGVyYXRvcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgaW5saW5lIF9GSXRlcmF0b3IxCisgICAgc2VhcmNoKF9GSXRlcmF0b3IxIF9fYmVnaW4xLCBfRkl0ZXJhdG9yMSBfX2VuZDEsCisgICAgICAgICAgIF9GSXRlcmF0b3IyIF9fYmVnaW4yLCBfRkl0ZXJhdG9yMiBfX2VuZDIsCisgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19wcmVkLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnNlYXJjaCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX3ByZWQpOyB9CisKKyAgLy8gUGFyYWxsZWwgYWxnb3JpdGhtIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX1JBSXRlcjEKKyAgICBfX3NlYXJjaF9zd2l0Y2goX1JBSXRlcjEgX19iZWdpbjEsIF9SQUl0ZXIxIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgIF9SQUl0ZXIyIF9fYmVnaW4yLCBfUkFJdGVyMiBfX2VuZDIsCisgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQxIC0gX19iZWdpbjEpCisgICAgICAgICAgICA+PSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5zZWFyY2hfbWluaW1hbF9uKSkKKyAgICAgICAgcmV0dXJuIF9fZ251X3BhcmFsbGVsOjpfX3NlYXJjaF90ZW1wbGF0ZShfX2JlZ2luMSwgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlZ2luMiwgX19lbmQyLCBfX3ByZWQpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gc2VhcmNoKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7CisgICAgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sgZm9yIGlucHV0IGl0ZXJhdG9yIGNhc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvcjEsIHR5cGVuYW1lIF9GSXRlcmF0b3IyLAorICAgICAgICAgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlLCB0eXBlbmFtZSBfSXRlcmF0b3JUYWcxLAorICAgICAgICAgICB0eXBlbmFtZSBfSXRlcmF0b3JUYWcyPgorICAgIGlubGluZSBfRkl0ZXJhdG9yMQorICAgIF9fc2VhcmNoX3N3aXRjaChfRkl0ZXJhdG9yMSBfX2JlZ2luMSwgX0ZJdGVyYXRvcjEgX19lbmQxLAorICAgICAgICAgICAgICAgICAgX0ZJdGVyYXRvcjIgX19iZWdpbjIsIF9GSXRlcmF0b3IyIF9fZW5kMiwKKyAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19wcmVkLCBfSXRlcmF0b3JUYWcxLCBfSXRlcmF0b3JUYWcyKQorICAgIHsgcmV0dXJuIHNlYXJjaChfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvcjEsIHR5cGVuYW1lIF9GSXRlcmF0b3IyLAorICAgICAgICAgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIGlubGluZSBfRkl0ZXJhdG9yMQorICAgIHNlYXJjaChfRkl0ZXJhdG9yMSBfX2JlZ2luMSwgX0ZJdGVyYXRvcjEgX19lbmQxLAorICAgICAgICAgICBfRkl0ZXJhdG9yMiBfX2JlZ2luMiwgX0ZJdGVyYXRvcjIgX19lbmQyLAorICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlICBfX3ByZWQpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfRkl0ZXJhdG9yMT4gX0l0ZXJhdG9yMVRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yMVRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnkxOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfRkl0ZXJhdG9yMj4gX0l0ZXJhdG9yMlRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yMlRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnkyOworICAgICAgcmV0dXJuIF9fc2VhcmNoX3N3aXRjaChfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfSXRlcmF0b3JDYXRlZ29yeTEoKSwgX0l0ZXJhdG9yQ2F0ZWdvcnkyKCkpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IsIHR5cGVuYW1lIF9JbnRlZ2VyLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9GSXRlcmF0b3IKKyAgICBzZWFyY2hfbihfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIF9JbnRlZ2VyIF9fY291bnQsCisgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3ZhbCwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpzZWFyY2hfbihfX2JlZ2luLCBfX2VuZCwgX19jb3VudCwgX192YWwpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfSW50ZWdlciwgdHlwZW5hbWUgX1RwLAorICAgICAgICAgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIGlubGluZSBfRkl0ZXJhdG9yCisgICAgc2VhcmNoX24oX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLCBfSW50ZWdlciBfX2NvdW50LAorICAgICAgICAgICAgIGNvbnN0IF9UcCYgX192YWwsIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCwKKyAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnNlYXJjaF9uKAorICAgICAgICAgICAgICAgX19iZWdpbiwgX19lbmQsIF9fY291bnQsIF9fdmFsLCBfX2JpbmFyeV9wcmVkKTsgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IsIHR5cGVuYW1lIF9JbnRlZ2VyLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9GSXRlcmF0b3IKKyAgICBzZWFyY2hfbihfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIF9JbnRlZ2VyIF9fY291bnQsCisgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3ZhbCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRkl0ZXJhdG9yPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgcmV0dXJuIF9fZ251X3BhcmFsbGVsOjpzZWFyY2hfbihfX2JlZ2luLCBfX2VuZCwgX19jb3VudCwgX192YWwsCisgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9FcXVhbFRvPF9WYWx1ZVR5cGUsIF9UcD4oKSk7CisgICAgfQorCisgIC8vIFBhcmFsbGVsIGFsZ29yaXRobSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9JbnRlZ2VyLAorICAgICAgICAgICB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX1JBSXRlcgorICAgIF9fc2VhcmNoX25fc3dpdGNoKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwgX0ludGVnZXIgX19jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsLCBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxfX2dudV9wYXJhbGxlbDo6X1NlcXVlbmNlSW5kZXg+KF9fZW5kIC0gX19iZWdpbikKKyAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLnNlYXJjaF9taW5pbWFsX24pKQorICAgICAgICB7CisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9Qc2V1ZG9TZXF1ZW5jZTxfVHAsIF9JbnRlZ2VyPiBfX3BzKF9fdmFsLCBfX2NvdW50KTsKKyAgICAgICAgICByZXR1cm4gX19nbnVfcGFyYWxsZWw6Ol9fc2VhcmNoX3RlbXBsYXRlKAorICAgICAgICAgICAgICAgICAgIF9fYmVnaW4sIF9fZW5kLCBfX3BzLmJlZ2luKCksIF9fcHMuZW5kKCksIF9fYmluYXJ5X3ByZWQpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfR0xJQkNYWF9TVERfQTo6c2VhcmNoX24oX19iZWdpbiwgX19lbmQsIF9fY291bnQsIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmluYXJ5X3ByZWQpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfSW50ZWdlciwgdHlwZW5hbWUgX1RwLAorICAgICAgICAgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlLCB0eXBlbmFtZSBfSXRlcmF0b3JUYWc+CisgICAgaW5saW5lIF9GSXRlcmF0b3IKKyAgICBfX3NlYXJjaF9uX3N3aXRjaChfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIF9JbnRlZ2VyIF9fY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3ZhbCwgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkLAorICAgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvclRhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6c2VhcmNoX24oX19iZWdpbiwgX19lbmQsIF9fY291bnQsIF9fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JpbmFyeV9wcmVkKTsgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IsIHR5cGVuYW1lIF9JbnRlZ2VyLCB0eXBlbmFtZSBfVHAsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgaW5saW5lIF9GSXRlcmF0b3IKKyAgICBzZWFyY2hfbihfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIF9JbnRlZ2VyIF9fY291bnQsCisgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3ZhbCwgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKQorICAgIHsKKyAgICAgIHJldHVybiBfX3NlYXJjaF9uX3N3aXRjaChfX2JlZ2luLCBfX2VuZCwgX19jb3VudCwgX192YWwsIF9fYmluYXJ5X3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9GSXRlcmF0b3I+OjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnkoKSk7CisgICAgfQorCisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9VbmFyeU9wZXJhdGlvbj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgdHJhbnNmb3JtKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgCisgICAgICAgICAgICAgIF9VbmFyeU9wZXJhdGlvbiBfX3VuYXJ5X29wLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnRyYW5zZm9ybShfX2JlZ2luLCBfX2VuZCwgX19yZXN1bHQsIF9fdW5hcnlfb3ApOyB9CisKKyAgLy8gUGFyYWxsZWwgdW5hcnkgdHJhbnNmb3JtIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfVW5hcnlPcGVyYXRpb24+CisgICAgX1JBSXRlcjIKKyAgICBfX3RyYW5zZm9ybTFfc3dpdGNoKF9SQUl0ZXIxIF9fYmVnaW4sIF9SQUl0ZXIxIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgIF9SQUl0ZXIyIF9fcmVzdWx0LCBfVW5hcnlPcGVyYXRpb24gX191bmFyeV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtX3RhZworICAgICAgICAgICAgICAgICAgICAgID0gX19nbnVfcGFyYWxsZWw6OnBhcmFsbGVsX2JhbGFuY2VkKQorICAgIHsKKyAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxfX2dudV9wYXJhbGxlbDo6X1NlcXVlbmNlSW5kZXg+KF9fZW5kIC0gX19iZWdpbikKKyAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLnRyYW5zZm9ybV9taW5pbWFsX24KKyAgICAgICAgICAgICYmIF9fZ251X3BhcmFsbGVsOjpfX2lzX3BhcmFsbGVsKF9fcGFyYWxsZWxpc21fdGFnKSkpCisgICAgICAgIHsKKyAgICAgICAgICBib29sIF9fZHVtbXkgPSB0cnVlOworICAgICAgICAgIHR5cGVkZWYgX19nbnVfcGFyYWxsZWw6Ol9JdGVyYXRvclBhaXI8X1JBSXRlcjEsCisgICAgICAgICAgICBfUkFJdGVyMiwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWc+IF9JdFRyaXA7CisgICAgICAgICAgX0l0VHJpcCBfX2JlZ2luX3BhaXIoX19iZWdpbiwgX19yZXN1bHQpLAorICAgICAgICAgICAgICAgICAgX19lbmRfcGFpcihfX2VuZCwgX19yZXN1bHQgKyAoX19lbmQgLSBfX2JlZ2luKSk7CisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9fdHJhbnNmb3JtMV9zZWxlY3RvcjxfSXRUcmlwPiBfX2Z1bmN0aW9uYWxpdHk7CisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OgorICAgICAgICAgICAgX19mb3JfZWFjaF90ZW1wbGF0ZV9yYW5kb21fYWNjZXNzKAorICAgICAgICAgICAgICBfX2JlZ2luX3BhaXIsIF9fZW5kX3BhaXIsIF9fdW5hcnlfb3AsIF9fZnVuY3Rpb25hbGl0eSwKKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9EdW1teVJlZHVjdCgpLAorICAgICAgICAgICAgICBfX2R1bW15LCBfX2R1bW15LCAtMSwgX19wYXJhbGxlbGlzbV90YWcpOworICAgICAgICAgIHJldHVybiBfX2Z1bmN0aW9uYWxpdHkuX01fZmluaXNoX2l0ZXJhdG9yOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiB0cmFuc2Zvcm0oX19iZWdpbiwgX19lbmQsIF9fcmVzdWx0LCBfX3VuYXJ5X29wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7CisgICAgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sgZm9yIGlucHV0IGl0ZXJhdG9yIGNhc2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIxLCB0eXBlbmFtZSBfUkFJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX1VuYXJ5T3BlcmF0aW9uLCB0eXBlbmFtZSBfSXRlcmF0b3JUYWcxLAorICAgICAgICAgICB0eXBlbmFtZSBfSXRlcmF0b3JUYWcyPgorICAgIGlubGluZSBfUkFJdGVyMgorICAgIF9fdHJhbnNmb3JtMV9zd2l0Y2goX1JBSXRlcjEgX19iZWdpbiwgX1JBSXRlcjEgX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgX1JBSXRlcjIgX19yZXN1bHQsIF9VbmFyeU9wZXJhdGlvbiBfX3VuYXJ5X29wLAorICAgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvclRhZzEsIF9JdGVyYXRvclRhZzIpCisgICAgeyByZXR1cm4gdHJhbnNmb3JtKF9fYmVnaW4sIF9fZW5kLCBfX3Jlc3VsdCwgX191bmFyeV9vcCwgCisgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfVW5hcnlPcGVyYXRpb24+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIHRyYW5zZm9ybShfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisgICAgICAgICAgICAgIF9VbmFyeU9wZXJhdGlvbiBfX3VuYXJ5X29wLCAKKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX0lJdGVyVHJhaXRzOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfT3V0cHV0SXRlcmF0b3I+IF9PSXRlclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfSUl0ZXJhdG9yQ2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9PSXRlclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX09JdGVyQ2F0ZWdvcnk7CisKKyAgICAgIHJldHVybiBfX3RyYW5zZm9ybTFfc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX3Jlc3VsdCwgX191bmFyeV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSUl0ZXJhdG9yQ2F0ZWdvcnkoKSwgX09JdGVyQ2F0ZWdvcnkoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wYXJhbGxlbGlzbV90YWcpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX1VuYXJ5T3BlcmF0aW9uPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICB0cmFuc2Zvcm0oX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorICAgICAgICAgICAgICBfVW5hcnlPcGVyYXRpb24gX191bmFyeV9vcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX0lJdGVyVHJhaXRzOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfT3V0cHV0SXRlcmF0b3I+IF9PSXRlclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfSUl0ZXJhdG9yQ2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9PSXRlclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX09JdGVyQ2F0ZWdvcnk7CisKKyAgICAgIHJldHVybiBfX3RyYW5zZm9ybTFfc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX3Jlc3VsdCwgX191bmFyeV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSUl0ZXJhdG9yQ2F0ZWdvcnkoKSwgX09JdGVyQ2F0ZWdvcnkoKSk7CisgICAgfQorCisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9CaW5hcnlPcGVyYXRpb24+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIHRyYW5zZm9ybShfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwKKyAgICAgICAgICAgICAgX0lJdGVyMiBfX2JlZ2luMiwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorICAgICAgICAgICAgICBfQmluYXJ5T3BlcmF0aW9uIF9fYmluYXJ5X29wLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnRyYW5zZm9ybShfX2JlZ2luMSwgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iZWdpbjIsIF9fcmVzdWx0LCBfX2JpbmFyeV9vcCk7IH0KKworICAvLyBQYXJhbGxlbCBiaW5hcnkgdHJhbnNmb3JtIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfUkFJdGVyMywgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbj4KKyAgICBfUkFJdGVyMworICAgIF9fdHJhbnNmb3JtMl9zd2l0Y2goX1JBSXRlcjEgX19iZWdpbjEsIF9SQUl0ZXIxIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICBfUkFJdGVyMiBfX2JlZ2luMiwKKyAgICAgICAgICAgICAgICAgICAgICBfUkFJdGVyMyBfX3Jlc3VsdCwgX0JpbmFyeU9wZXJhdGlvbiBfX2JpbmFyeV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtX3RhZyAKKyAgICAgICAgICAgICAgICAgICAgICA9IF9fZ251X3BhcmFsbGVsOjpwYXJhbGxlbF9iYWxhbmNlZCkKKyAgICB7CisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgKF9fZW5kMSAtIF9fYmVnaW4xKSA+PQorICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLnRyYW5zZm9ybV9taW5pbWFsX24KKyAgICAgICAgICAgICYmIF9fZ251X3BhcmFsbGVsOjpfX2lzX3BhcmFsbGVsKF9fcGFyYWxsZWxpc21fdGFnKSkpCisgICAgICAgIHsKKyAgICAgICAgICBib29sIF9fZHVtbXkgPSB0cnVlOworICAgICAgICAgIHR5cGVkZWYgX19nbnVfcGFyYWxsZWw6Ol9JdGVyYXRvclRyaXBsZTxfUkFJdGVyMSwKKyAgICAgICAgICAgIF9SQUl0ZXIyLCBfUkFJdGVyMywKKyAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnPiBfSXRUcmlwOworICAgICAgICAgIF9JdFRyaXAgX19iZWdpbl90cmlwbGUoX19iZWdpbjEsIF9fYmVnaW4yLCBfX3Jlc3VsdCksCisgICAgICAgICAgICBfX2VuZF90cmlwbGUoX19lbmQxLCBfX2JlZ2luMiArIChfX2VuZDEgLSBfX2JlZ2luMSksCisgICAgICAgICAgICAgICAgICAgICAgIF9fcmVzdWx0ICsgKF9fZW5kMSAtIF9fYmVnaW4xKSk7CisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9fdHJhbnNmb3JtMl9zZWxlY3RvcjxfSXRUcmlwPiBfX2Z1bmN0aW9uYWxpdHk7CisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OgorICAgICAgICAgICAgX19mb3JfZWFjaF90ZW1wbGF0ZV9yYW5kb21fYWNjZXNzKF9fYmVnaW5fdHJpcGxlLCBfX2VuZF90cmlwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmluYXJ5X29wLCBfX2Z1bmN0aW9uYWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfRHVtbXlSZWR1Y3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kdW1teSwgX19kdW1teSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcGFyYWxsZWxpc21fdGFnKTsKKyAgICAgICAgICByZXR1cm4gX19mdW5jdGlvbmFsaXR5Ll9NX2ZpbmlzaF9pdGVyYXRvcjsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gdHJhbnNmb3JtKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX3Jlc3VsdCwgX19iaW5hcnlfb3AsIAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsKKyAgICB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uLAorICAgICAgICAgICB0eXBlbmFtZSBfVGFnMSwgdHlwZW5hbWUgX1RhZzIsIHR5cGVuYW1lIF9UYWczPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX3RyYW5zZm9ybTJfc3dpdGNoKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLCAKKyAgICAgICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIAorICAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3AsIF9UYWcxLCBfVGFnMiwgX1RhZzMpCisgICAgeyByZXR1cm4gdHJhbnNmb3JtKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX3Jlc3VsdCwgX19iaW5hcnlfb3AsCisgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgdHJhbnNmb3JtKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisgICAgICAgICAgICAgIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3AsIAorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyMT4gX0lJdGVyVHJhaXRzMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzMTo6aXRlcmF0b3JfY2F0ZWdvcnkKKyAgICAgICAgX0lJdGVyQ2F0ZWdvcnkxOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIyPiBfSUl0ZXJUcmFpdHMyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMyOjppdGVyYXRvcl9jYXRlZ29yeQorICAgICAgICBfSUl0ZXJDYXRlZ29yeTI7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9PdXRwdXRJdGVyYXRvcj4gX09JdGVyVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfT0l0ZXJUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9PSXRlckNhdGVnb3J5OworCisgICAgICByZXR1cm4gX190cmFuc2Zvcm0yX3N3aXRjaCgKKyAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX3Jlc3VsdCwgX19iaW5hcnlfb3AsCisgICAgICAgICAgICAgICBfSUl0ZXJDYXRlZ29yeTEoKSwgX0lJdGVyQ2F0ZWdvcnkyKCksIF9PSXRlckNhdGVnb3J5KCksCisgICAgICAgICAgICAgICBfX3BhcmFsbGVsaXNtX3RhZyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgdHJhbnNmb3JtKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisgICAgICAgICAgICAgIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3ApCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIxPiBfSUl0ZXJUcmFpdHMxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMxOjppdGVyYXRvcl9jYXRlZ29yeQorICAgICAgICBfSUl0ZXJDYXRlZ29yeTE7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcjI+IF9JSXRlclRyYWl0czI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JSXRlclRyYWl0czI6Oml0ZXJhdG9yX2NhdGVnb3J5CisgICAgICAgIF9JSXRlckNhdGVnb3J5MjsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X091dHB1dEl0ZXJhdG9yPiBfT0l0ZXJUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9PSXRlclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX09JdGVyQ2F0ZWdvcnk7CisKKyAgICAgIHJldHVybiBfX3RyYW5zZm9ybTJfc3dpdGNoKAorICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fcmVzdWx0LCBfX2JpbmFyeV9vcCwKKyAgICAgICAgICAgICAgIF9JSXRlckNhdGVnb3J5MSgpLCBfSUl0ZXJDYXRlZ29yeTIoKSwgX09JdGVyQ2F0ZWdvcnkoKSk7CisgICAgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgcmVwbGFjZShfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIGNvbnN0IF9UcCYgX19vbGRfdmFsdWUsIAorICAgICAgICAgICAgY29uc3QgX1RwJiBfX25ld192YWx1ZSwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgX0dMSUJDWFhfU1REX0E6OnJlcGxhY2UoX19iZWdpbiwgX19lbmQsIF9fb2xkX3ZhbHVlLCBfX25ld192YWx1ZSk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnPgorICAgIGlubGluZSB2b2lkCisgICAgX19yZXBsYWNlX3N3aXRjaChfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX29sZF92YWx1ZSwgY29uc3QgX1RwJiBfX25ld192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvclRhZykKKyAgICB7IHJlcGxhY2UoX19iZWdpbiwgX19lbmQsIF9fb2xkX3ZhbHVlLCBfX25ld192YWx1ZSwgCisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsgfQorCisgIC8vIFBhcmFsbGVsIHJlcGxhY2UgZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fcmVwbGFjZV9zd2l0Y2goX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLCAKKyAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fb2xkX3ZhbHVlLCBjb25zdCBfVHAmIF9fbmV3X3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgCisgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtX3RhZworICAgICAgICAgICAgICAgICAgID0gX19nbnVfcGFyYWxsZWw6OnBhcmFsbGVsX2JhbGFuY2VkKQorICAgIHsKKyAgICAgIC8vIFhYWCBwYXJhbGxlbCB2ZXJzaW9uIGlzIHdoZXJlPworICAgICAgcmVwbGFjZShfX2JlZ2luLCBfX2VuZCwgX19vbGRfdmFsdWUsIF9fbmV3X3ZhbHVlLCAKKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOyAKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICByZXBsYWNlKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgY29uc3QgX1RwJiBfX29sZF92YWx1ZSwgCisgICAgICAgICAgICBjb25zdCBfVHAmIF9fbmV3X3ZhbHVlLAorICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfRkl0ZXJhdG9yPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5OworICAgICAgX19yZXBsYWNlX3N3aXRjaChfX2JlZ2luLCBfX2VuZCwgX19vbGRfdmFsdWUsIF9fbmV3X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBfSXRlcmF0b3JDYXRlZ29yeSgpLAorICAgICAgICAgICAgICAgICAgICAgX19wYXJhbGxlbGlzbV90YWcpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICByZXBsYWNlKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgY29uc3QgX1RwJiBfX29sZF92YWx1ZSwgCisgICAgICAgICAgICBjb25zdCBfVHAmIF9fbmV3X3ZhbHVlKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9GSXRlcmF0b3I+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnk7CisgICAgICBfX3JlcGxhY2Vfc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX29sZF92YWx1ZSwgX19uZXdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvckNhdGVnb3J5KCkpOworICAgIH0KKworCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgcmVwbGFjZV9pZihfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIF9QcmVkaWNhdGUgX19wcmVkLCAKKyAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX19uZXdfdmFsdWUsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IF9HTElCQ1hYX1NURF9BOjpyZXBsYWNlX2lmKF9fYmVnaW4sIF9fZW5kLCBfX3ByZWQsIF9fbmV3X3ZhbHVlKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sgZm9yIGlucHV0IGl0ZXJhdG9yIGNhc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX1RwLAorICAgICAgICAgICB0eXBlbmFtZSBfSXRlcmF0b3JUYWc+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3JlcGxhY2VfaWZfc3dpdGNoKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgY29uc3QgX1RwJiBfX25ld192YWx1ZSwgX0l0ZXJhdG9yVGFnKQorICAgIHsgcmVwbGFjZV9pZihfX2JlZ2luLCBfX2VuZCwgX19wcmVkLCBfX25ld192YWx1ZSwKKyAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOyB9CisKKyAgLy8gUGFyYWxsZWwgYWxnb3JpdGhtIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX3JlcGxhY2VfaWZfc3dpdGNoKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgY29uc3QgX1RwJiBfX25ld192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnCisgICAgICAgICAgICAgICAgICAgICAgPSBfX2dudV9wYXJhbGxlbDo6cGFyYWxsZWxfYmFsYW5jZWQpCisgICAgeworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQgLSBfX2JlZ2luKQorICAgICAgICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkucmVwbGFjZV9taW5pbWFsX24KKyAgICAgICAgICAgICYmIF9fZ251X3BhcmFsbGVsOjpfX2lzX3BhcmFsbGVsKF9fcGFyYWxsZWxpc21fdGFnKSkpCisgICAgICAgIHsKKyAgICAgICAgICBib29sIF9fZHVtbXk7CisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OgorICAgICAgICAgICAgX19yZXBsYWNlX2lmX3NlbGVjdG9yPF9SQUl0ZXIsIF9QcmVkaWNhdGUsIF9UcD4KKyAgICAgICAgICAgIF9fZnVuY3Rpb25hbGl0eShfX25ld192YWx1ZSk7CisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OgorICAgICAgICAgICAgX19mb3JfZWFjaF90ZW1wbGF0ZV9yYW5kb21fYWNjZXNzKAorICAgICAgICAgICAgICBfX2JlZ2luLCBfX2VuZCwgX19wcmVkLCBfX2Z1bmN0aW9uYWxpdHksCisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfRHVtbXlSZWR1Y3QoKSwKKyAgICAgICAgICAgICAgdHJ1ZSwgX19kdW1teSwgLTEsIF9fcGFyYWxsZWxpc21fdGFnKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXBsYWNlX2lmKF9fYmVnaW4sIF9fZW5kLCBfX3ByZWQsIF9fbmV3X3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGUsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHJlcGxhY2VfaWYoX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLAorICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsIGNvbnN0IF9UcCYgX19uZXdfdmFsdWUsIAorICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9GSXRlcmF0b3I+IF9JdGVyYXRvclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTsKKyAgICAgIF9fcmVwbGFjZV9pZl9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9fcHJlZCwgX19uZXdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvckNhdGVnb3J5KCksIF9fcGFyYWxsZWxpc21fdGFnKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgcmVwbGFjZV9pZihfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsCisgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgY29uc3QgX1RwJiBfX25ld192YWx1ZSkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9GSXRlcmF0b3I+IF9JdGVyYXRvclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTsKKyAgICAgIF9fcmVwbGFjZV9pZl9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9fcHJlZCwgX19uZXdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvckNhdGVnb3J5KCkpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IsIHR5cGVuYW1lIF9HZW5lcmF0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICBnZW5lcmF0ZShfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIF9HZW5lcmF0b3IgX19nZW4sIAorICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IF9HTElCQ1hYX1NURF9BOjpnZW5lcmF0ZShfX2JlZ2luLCBfX2VuZCwgX19nZW4pOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX0dlbmVyYXRvciwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnPgorICAgIGlubGluZSB2b2lkCisgICAgX19nZW5lcmF0ZV9zd2l0Y2goX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLCBfR2VuZXJhdG9yIF9fZ2VuLAorICAgICAgICAgICAgICAgICAgICBfSXRlcmF0b3JUYWcpCisgICAgeyBnZW5lcmF0ZShfX2JlZ2luLCBfX2VuZCwgX19nZW4sIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsgfQorCisgIC8vIFBhcmFsbGVsIGFsZ29yaXRobSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9HZW5lcmF0b3I+CisgICAgdm9pZAorICAgIF9fZ2VuZXJhdGVfc3dpdGNoKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgX0dlbmVyYXRvciBfX2dlbiwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIAorICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnCisgICAgICAgICAgICAgICAgICAgID0gX19nbnVfcGFyYWxsZWw6OnBhcmFsbGVsX2JhbGFuY2VkKQorICAgIHsKKyAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxfX2dudV9wYXJhbGxlbDo6X1NlcXVlbmNlSW5kZXg+KF9fZW5kIC0gX19iZWdpbikKKyAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLmdlbmVyYXRlX21pbmltYWxfbgorICAgICAgICAgICAgJiYgX19nbnVfcGFyYWxsZWw6Ol9faXNfcGFyYWxsZWwoX19wYXJhbGxlbGlzbV90YWcpKSkKKyAgICAgICAgeworICAgICAgICAgIGJvb2wgX19kdW1teTsKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X19nZW5lcmF0ZV9zZWxlY3RvcjxfUkFJdGVyPgorICAgICAgICAgICAgX19mdW5jdGlvbmFsaXR5OworICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjoKKyAgICAgICAgICAgIF9fZm9yX2VhY2hfdGVtcGxhdGVfcmFuZG9tX2FjY2VzcygKKyAgICAgICAgICAgICAgX19iZWdpbiwgX19lbmQsIF9fZ2VuLCBfX2Z1bmN0aW9uYWxpdHksCisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfRHVtbXlSZWR1Y3QoKSwKKyAgICAgICAgICAgICAgdHJ1ZSwgX19kdW1teSwgLTEsIF9fcGFyYWxsZWxpc21fdGFnKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBnZW5lcmF0ZShfX2JlZ2luLCBfX2VuZCwgX19nZW4sIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX0dlbmVyYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIGdlbmVyYXRlKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwKKyAgICAgICAgICAgICBfR2VuZXJhdG9yIF9fZ2VuLCBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0ZJdGVyYXRvcj4gX0l0ZXJhdG9yVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3JUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5OworICAgICAgX19nZW5lcmF0ZV9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9fZ2VuLCBfSXRlcmF0b3JDYXRlZ29yeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgX19wYXJhbGxlbGlzbV90YWcpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfR2VuZXJhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgZ2VuZXJhdGUoX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLCBfR2VuZXJhdG9yIF9fZ2VuKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0ZJdGVyYXRvcj4gX0l0ZXJhdG9yVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3JUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5OworICAgICAgX19nZW5lcmF0ZV9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9fZ2VuLCBfSXRlcmF0b3JDYXRlZ29yeSgpKTsKKyAgICB9CisKKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfR2VuZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBnZW5lcmF0ZV9uKF9PdXRwdXRJdGVyYXRvciBfX2JlZ2luLCBfU2l6ZSBfX24sIF9HZW5lcmF0b3IgX19nZW4sIAorICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpnZW5lcmF0ZV9uKF9fYmVnaW4sIF9fbiwgX19nZW4pOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0dlbmVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX2dlbmVyYXRlX25fc3dpdGNoKF9PdXRwdXRJdGVyYXRvciBfX2JlZ2luLCBfU2l6ZSBfX24sIF9HZW5lcmF0b3IgX19nZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBfSXRlcmF0b3JUYWcpCisgICAgeyByZXR1cm4gZ2VuZXJhdGVfbihfX2JlZ2luLCBfX24sIF9fZ2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOyB9CisKKyAgLy8gUGFyYWxsZWwgYWxnb3JpdGhtIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9HZW5lcmF0b3I+CisgICAgaW5saW5lIF9SQUl0ZXIKKyAgICBfX2dlbmVyYXRlX25fc3dpdGNoKF9SQUl0ZXIgX19iZWdpbiwgX1NpemUgX19uLCBfR2VuZXJhdG9yIF9fZ2VuLCAKKyAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgCisgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtX3RhZworICAgICAgICAgICAgICAgICAgICAgID0gX19nbnVfcGFyYWxsZWw6OnBhcmFsbGVsX2JhbGFuY2VkKQorICAgIHsKKyAgICAgIC8vIFhYWCBwYXJhbGxlbCB2ZXJzaW9uIGlzIHdoZXJlPworICAgICAgcmV0dXJuIGdlbmVyYXRlX24oX19iZWdpbiwgX19uLCBfX2dlbiwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfR2VuZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBnZW5lcmF0ZV9uKF9PdXRwdXRJdGVyYXRvciBfX2JlZ2luLCBfU2l6ZSBfX24sIF9HZW5lcmF0b3IgX19nZW4sIAorICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9PdXRwdXRJdGVyYXRvcj4gX0l0ZXJhdG9yVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3JUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5OworICAgICAgcmV0dXJuIF9fZ2VuZXJhdGVfbl9zd2l0Y2goX19iZWdpbiwgX19uLCBfX2dlbiwgX0l0ZXJhdG9yQ2F0ZWdvcnkoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wYXJhbGxlbGlzbV90YWcpOyAKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0dlbmVyYXRvcj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgZ2VuZXJhdGVfbihfT3V0cHV0SXRlcmF0b3IgX19iZWdpbiwgX1NpemUgX19uLCBfR2VuZXJhdG9yIF9fZ2VuKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X091dHB1dEl0ZXJhdG9yPiBfSXRlcmF0b3JUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnk7CisgICAgICByZXR1cm4gX19nZW5lcmF0ZV9uX3N3aXRjaChfX2JlZ2luLCBfX24sIF9fZ2VuLCBfSXRlcmF0b3JDYXRlZ29yeSgpKTsKKyAgICB9CisKKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIGlubGluZSB2b2lkCisgICAgcmFuZG9tX3NodWZmbGUoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLCAKKyAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyBfR0xJQkNYWF9TVERfQTo6cmFuZG9tX3NodWZmbGUoX19iZWdpbiwgX19lbmQpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1JhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHJhbmRvbV9zaHVmZmxlKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3JhbmQsCisgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgX0dMSUJDWFhfU1REX0E6OnJhbmRvbV9zaHVmZmxlKF9fYmVnaW4sIF9fZW5kLCBfX3JhbmQpOyB9CisKKworICAvKiogQGJyaWVmIEZ1bmN0b3Igd3JhcHBlciBmb3Igc3RkOjpyYW5kKCkuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9NdXN0QmVJbnQgPSBpbnQ+CisgICAgc3RydWN0IF9DUmFuZE51bWJlcgorICAgIHsKKyAgICAgIGludAorICAgICAgb3BlcmF0b3IoKShpbnQgX19saW1pdCkKKyAgICAgIHsgcmV0dXJuIHJhbmQoKSAlIF9fbGltaXQ7IH0KKyAgICB9OworCisgIC8vIEZpbGwgaW4gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgaW5saW5lIHZvaWQKKyAgICByYW5kb21fc2h1ZmZsZShfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQpCisgICAgeworICAgICAgX0NSYW5kTnVtYmVyPD4gX19yOworICAgICAgLy8gUGFyYWxsZWxpemF0aW9uIHN0aWxsIHBvc3NpYmxlLgorICAgICAgX19nbnVfcGFyYWxsZWw6OnJhbmRvbV9zaHVmZmxlKF9fYmVnaW4sIF9fZW5kLCBfX3IpOworICAgIH0KKworICAvLyBQYXJhbGxlbCBhbGdvcml0aG0gZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgIHZvaWQKKyAgICByYW5kb21fc2h1ZmZsZShfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgICAgICAgICAgICAgIF9SYW5kb21OdW1iZXJHZW5lcmF0b3ImJiBfX3JhbmQpCisjZWxzZQorICAgICAgICAgICAgICAgICAgIF9SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fcmFuZCkKKyNlbmRpZgorICAgIHsKKyAgICAgIGlmIChfX2JlZ2luID09IF9fZW5kKQorICAgICAgICByZXR1cm47CisgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X19nbnVfcGFyYWxsZWw6Ol9TZXF1ZW5jZUluZGV4PihfX2VuZCAtIF9fYmVnaW4pCisgICAgICAgICAgICA+PSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5yYW5kb21fc2h1ZmZsZV9taW5pbWFsX24pKQorICAgICAgICBfX2dudV9wYXJhbGxlbDo6X19wYXJhbGxlbF9yYW5kb21fc2h1ZmZsZShfX2JlZ2luLCBfX2VuZCwgX19yYW5kKTsKKyAgICAgIGVsc2UKKyAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9fc2VxdWVudGlhbF9yYW5kb21fc2h1ZmZsZShfX2JlZ2luLCBfX2VuZCwgX19yYW5kKTsKKyAgICB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIHBhcnRpdGlvbihfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsCisgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnBhcnRpdGlvbihfX2JlZ2luLCBfX2VuZCwgX19wcmVkKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sgZm9yIGlucHV0IGl0ZXJhdG9yIGNhc2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGUsIHR5cGVuYW1lIF9JdGVyYXRvclRhZz4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIF9fcGFydGl0aW9uX3N3aXRjaChfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsCisgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgX0l0ZXJhdG9yVGFnKQorICAgIHsgcmV0dXJuIHBhcnRpdGlvbihfX2JlZ2luLCBfX2VuZCwgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7IH0KKworICAvLyBQYXJhbGxlbCBhbGdvcml0aG0gZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9SQUl0ZXIKKyAgICBfX3BhcnRpdGlvbl9zd2l0Y2goX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxfX2dudV9wYXJhbGxlbDo6X1NlcXVlbmNlSW5kZXg+KF9fZW5kIC0gX19iZWdpbikKKyAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLnBhcnRpdGlvbl9taW5pbWFsX24pKQorICAgICAgICB7CisgICAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPjo6CisgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworICAgICAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX21pZGRsZSA9IF9fZ251X3BhcmFsbGVsOjoKKyAgICAgICAgICAgIF9fcGFyYWxsZWxfcGFydGl0aW9uKF9fYmVnaW4sIF9fZW5kLCBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9fZ2V0X21heF90aHJlYWRzKCkpOworICAgICAgICAgIHJldHVybiBfX2JlZ2luICsgX19taWRkbGU7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHBhcnRpdGlvbihfX2JlZ2luLCBfX2VuZCwgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIHBhcnRpdGlvbihfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9GSXRlcmF0b3I+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnk7CisgICAgICByZXR1cm4gX19wYXJ0aXRpb25fc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX3ByZWQsIF9JdGVyYXRvckNhdGVnb3J5KCkpOworICAgIH0KKworICAvLyBzb3J0IGludGVyZmFjZQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHNvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLCAKKyAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IF9HTElCQ1hYX1NURF9BOjpzb3J0KF9fYmVnaW4sIF9fZW5kKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBzb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwgX0NvbXBhcmUgX19jb21wLAorICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgX0dMSUJDWFhfU1REX0E6OnNvcnQ8X1JBSXRlciwgX0NvbXBhcmU+KF9fYmVnaW4sIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7IH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlLAorICAgICAgICAgICB0eXBlbmFtZSBfUGFyYWxsZWxpc20+CisgIHZvaWQKKyAgc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsIF9Db21wYXJlIF9fY29tcCwKKyAgICAgICBfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbSkKKyAgeworICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKworICAgIGlmIChfX2JlZ2luICE9IF9fZW5kKQorICAgICAgeworICAgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8X19nbnVfcGFyYWxsZWw6Ol9TZXF1ZW5jZUluZGV4PihfX2VuZCAtIF9fYmVnaW4pID49CisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLnNvcnRfbWluaW1hbF9uKSkKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X19wYXJhbGxlbF9zb3J0PGZhbHNlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlZ2luLCBfX2VuZCwgX19jb21wLCBfX3BhcmFsbGVsaXNtKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNvcnQoX19iZWdpbiwgX19lbmQsIF9fY29tcCwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOworICAgICAgfQorICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZSwgaW5zZXJ0IGRlZmF1bHQgY29tcGFyYXRvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIGlubGluZSB2b2lkCisgICAgc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQpCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICBzb3J0KF9fYmVnaW4sIF9fZW5kLCBzdGQ6Omxlc3M8X1ZhbHVlVHlwZT4oKSwKKyAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OmRlZmF1bHRfcGFyYWxsZWxfdGFnKCkpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlLCBpbnNlcnQgZGVmYXVsdCBjb21wYXJhdG9yCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgIGlubGluZSB2b2lkCisgIHNvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorICAgICAgIF9fZ251X3BhcmFsbGVsOjpkZWZhdWx0X3BhcmFsbGVsX3RhZyBfX3BhcmFsbGVsaXNtKQorICB7CisgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgIHNvcnQoX19iZWdpbiwgX19lbmQsIHN0ZDo6bGVzczxfVmFsdWVUeXBlPigpLCBfX3BhcmFsbGVsaXNtKTsKKyAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UsIGluc2VydCBkZWZhdWx0IGNvbXBhcmF0b3IKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgaW5saW5lIHZvaWQKKyAgc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisgICAgICAgX19nbnVfcGFyYWxsZWw6OnBhcmFsbGVsX3RhZyBfX3BhcmFsbGVsaXNtKQorICB7CisgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgIHNvcnQoX19iZWdpbiwgX19lbmQsIHN0ZDo6bGVzczxfVmFsdWVUeXBlPigpLCBfX3BhcmFsbGVsaXNtKTsKKyAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UsIGluc2VydCBkZWZhdWx0IGNvbXBhcmF0b3IKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgaW5saW5lIHZvaWQKKyAgc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisgICAgICAgX19nbnVfcGFyYWxsZWw6Om11bHRpd2F5X21lcmdlc29ydF90YWcgX19wYXJhbGxlbGlzbSkKKyAgeworICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICBzb3J0KF9fYmVnaW4sIF9fZW5kLCBzdGQ6Omxlc3M8X1ZhbHVlVHlwZT4oKSwgX19wYXJhbGxlbGlzbSk7CisgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlLCBpbnNlcnQgZGVmYXVsdCBjb21wYXJhdG9yCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgIGlubGluZSB2b2lkCisgIHNvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorICAgICAgIF9fZ251X3BhcmFsbGVsOjptdWx0aXdheV9tZXJnZXNvcnRfc2FtcGxpbmdfdGFnIF9fcGFyYWxsZWxpc20pCisgIHsKKyAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgc29ydChfX2JlZ2luLCBfX2VuZCwgc3RkOjpsZXNzPF9WYWx1ZVR5cGU+KCksIF9fcGFyYWxsZWxpc20pOworICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZSwgaW5zZXJ0IGRlZmF1bHQgY29tcGFyYXRvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICBpbmxpbmUgdm9pZAorICBzb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKyAgICAgICBfX2dudV9wYXJhbGxlbDo6bXVsdGl3YXlfbWVyZ2Vzb3J0X2V4YWN0X3RhZyBfX3BhcmFsbGVsaXNtKQorICB7CisgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgIHNvcnQoX19iZWdpbiwgX19lbmQsIHN0ZDo6bGVzczxfVmFsdWVUeXBlPigpLCBfX3BhcmFsbGVsaXNtKTsKKyAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UsIGluc2VydCBkZWZhdWx0IGNvbXBhcmF0b3IKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgaW5saW5lIHZvaWQKKyAgc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisgICAgICAgX19nbnVfcGFyYWxsZWw6OnF1aWNrc29ydF90YWcgX19wYXJhbGxlbGlzbSkKKyAgeworICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICBzb3J0KF9fYmVnaW4sIF9fZW5kLCBzdGQ6Omxlc3M8X1ZhbHVlVHlwZT4oKSwgX19wYXJhbGxlbGlzbSk7CisgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlLCBpbnNlcnQgZGVmYXVsdCBjb21wYXJhdG9yCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgIGlubGluZSB2b2lkCisgIHNvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorICAgICAgIF9fZ251X3BhcmFsbGVsOjpiYWxhbmNlZF9xdWlja3NvcnRfdGFnIF9fcGFyYWxsZWxpc20pCisgIHsKKyAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgc29ydChfX2JlZ2luLCBfX2VuZCwgc3RkOjpsZXNzPF9WYWx1ZVR5cGU+KCksIF9fcGFyYWxsZWxpc20pOworICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICBzb3J0KF9fYmVnaW4sIF9fZW5kLCBfX2NvbXAsIF9fZ251X3BhcmFsbGVsOjpkZWZhdWx0X3BhcmFsbGVsX3RhZygpKTsKKyAgfQorCisKKyAgLy8gc3RhYmxlX3NvcnQgaW50ZXJmYWNlCisKKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgIGlubGluZSB2b2lkCisgIHN0YWJsZV9zb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKyAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgIHsgX0dMSUJDWFhfU1REX0E6OnN0YWJsZV9zb3J0KF9fYmVnaW4sIF9fZW5kKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgIGlubGluZSB2b2lkCisgIHN0YWJsZV9zb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKyAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgIHsgX0dMSUJDWFhfU1REX0E6OnN0YWJsZV9zb3J0PF9SQUl0ZXIsIF9Db21wYXJlPigKKyAgICAgIF9fYmVnaW4sIF9fZW5kLCBfX2NvbXApOyB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX1BhcmFsbGVsaXNtPgorICB2b2lkCisgIHN0YWJsZV9zb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKyAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wLCBfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbSkKKyAgeworICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKworICAgIGlmIChfX2JlZ2luICE9IF9fZW5kKQorICAgICAgeworICAgICAgICBpZiAoX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxfX2dudV9wYXJhbGxlbDo6X1NlcXVlbmNlSW5kZXg+KF9fZW5kIC0gX19iZWdpbikgPj0KKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkuc29ydF9taW5pbWFsX24pKQorICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfX3BhcmFsbGVsX3NvcnQ8dHJ1ZT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iZWdpbiwgX19lbmQsIF9fY29tcCwgX19wYXJhbGxlbGlzbSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdGFibGVfc29ydChfX2JlZ2luLCBfX2VuZCwgX19jb21wLAorICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsKKyAgICAgIH0KKyAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UsIGluc2VydCBkZWZhdWx0IGNvbXBhcmF0b3IKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgaW5saW5lIHZvaWQKKyAgc3RhYmxlX3NvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kKQorICB7CisgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgIHN0YWJsZV9zb3J0KF9fYmVnaW4sIF9fZW5kLCBzdGQ6Omxlc3M8X1ZhbHVlVHlwZT4oKSwKKyAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6ZGVmYXVsdF9wYXJhbGxlbF90YWcoKSk7CisgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlLCBpbnNlcnQgZGVmYXVsdCBjb21wYXJhdG9yCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgIGlubGluZSB2b2lkCisgIHN0YWJsZV9zb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OmRlZmF1bHRfcGFyYWxsZWxfdGFnIF9fcGFyYWxsZWxpc20pCisgIHsKKyAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgc3RhYmxlX3NvcnQoX19iZWdpbiwgX19lbmQsIHN0ZDo6bGVzczxfVmFsdWVUeXBlPigpLCBfX3BhcmFsbGVsaXNtKTsKKyAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UsIGluc2VydCBkZWZhdWx0IGNvbXBhcmF0b3IKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgaW5saW5lIHZvaWQKKyAgc3RhYmxlX3NvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6cGFyYWxsZWxfdGFnIF9fcGFyYWxsZWxpc20pCisgIHsKKyAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgc3RhYmxlX3NvcnQoX19iZWdpbiwgX19lbmQsIHN0ZDo6bGVzczxfVmFsdWVUeXBlPigpLCBfX3BhcmFsbGVsaXNtKTsKKyAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UsIGluc2VydCBkZWZhdWx0IGNvbXBhcmF0b3IKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgaW5saW5lIHZvaWQKKyAgc3RhYmxlX3NvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6bXVsdGl3YXlfbWVyZ2Vzb3J0X3RhZyBfX3BhcmFsbGVsaXNtKQorICB7CisgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgIHN0YWJsZV9zb3J0KF9fYmVnaW4sIF9fZW5kLCBzdGQ6Omxlc3M8X1ZhbHVlVHlwZT4oKSwgX19wYXJhbGxlbGlzbSk7CisgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlLCBpbnNlcnQgZGVmYXVsdCBjb21wYXJhdG9yCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgIGlubGluZSB2b2lkCisgIHN0YWJsZV9zb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnF1aWNrc29ydF90YWcgX19wYXJhbGxlbGlzbSkKKyAgeworICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICBzdGFibGVfc29ydChfX2JlZ2luLCBfX2VuZCwgc3RkOjpsZXNzPF9WYWx1ZVR5cGU+KCksIF9fcGFyYWxsZWxpc20pOworICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZSwgaW5zZXJ0IGRlZmF1bHQgY29tcGFyYXRvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICBpbmxpbmUgdm9pZAorICBzdGFibGVfc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpiYWxhbmNlZF9xdWlja3NvcnRfdGFnIF9fcGFyYWxsZWxpc20pCisgIHsKKyAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgc3RhYmxlX3NvcnQoX19iZWdpbiwgX19lbmQsIHN0ZDo6bGVzczxfVmFsdWVUeXBlPigpLCBfX3BhcmFsbGVsaXNtKTsKKyAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgIHZvaWQKKyAgc3RhYmxlX3NvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApCisgIHsKKyAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgc3RhYmxlX3NvcnQoCisgICAgICBfX2JlZ2luLCBfX2VuZCwgX19jb21wLCBfX2dudV9wYXJhbGxlbDo6ZGVmYXVsdF9wYXJhbGxlbF90YWcoKSk7CisgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgbWVyZ2UoX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIF9JSXRlcjIgX19iZWdpbjIsIAorICAgICAgICAgIF9JSXRlcjIgX19lbmQyLCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjptZXJnZSgKKyAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fcmVzdWx0KTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgbWVyZ2UoX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIF9JSXRlcjIgX19iZWdpbjIsCisgICAgICAgICAgX0lJdGVyMiBfX2VuZDIsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wLAorICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6bWVyZ2UoCisgICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19yZXN1bHQsIF9fY29tcCk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9JdGVyYXRvclRhZzEsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyYXRvclRhZzIsIHR5cGVuYW1lIF9JdGVyYXRvclRhZzM+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fbWVyZ2Vfc3dpdGNoKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwKKyAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXAsCisgICAgICAgICAgICAgICAgIF9JdGVyYXRvclRhZzEsIF9JdGVyYXRvclRhZzIsIF9JdGVyYXRvclRhZzMpCisgICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjptZXJnZShfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yZXN1bHQsIF9fY29tcCk7IH0KKworICAvLyBQYXJhbGxlbCBhbGdvcml0aG0gZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgX19tZXJnZV9zd2l0Y2goX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIAorICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwgCisgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wLCAKKyAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCAKKyAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgIChzdGF0aWNfY2FzdDxfX2dudV9wYXJhbGxlbDo6X1NlcXVlbmNlSW5kZXg+KF9fZW5kMSAtIF9fYmVnaW4xKQorICAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLm1lcmdlX21pbmltYWxfbgorICAgICAgICAgICAgIHx8IHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQyIC0gX19iZWdpbjIpCisgICAgICAgICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkubWVyZ2VfbWluaW1hbF9uKSkpCisgICAgICAgIHJldHVybiBfX2dudV9wYXJhbGxlbDo6X19wYXJhbGxlbF9tZXJnZV9hZHZhbmNlKAorICAgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgKF9fZW5kMSAtIF9fYmVnaW4xKSArIChfX2VuZDIgLSBfX2JlZ2luMiksIF9fY29tcCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfX2dudV9wYXJhbGxlbDo6X19tZXJnZV9hZHZhbmNlKAorICAgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgKF9fZW5kMSAtIF9fYmVnaW4xKSArIChfX2VuZDIgLSBfX2JlZ2luMiksIF9fY29tcCk7CisgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIG1lcmdlKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLCBfSUl0ZXIyIF9fYmVnaW4yLCAKKyAgICAgICAgICBfSUl0ZXIyIF9fZW5kMiwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJdGVyMT46OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIxPiBfSUl0ZXJUcmFpdHMxOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIyPiBfSUl0ZXJUcmFpdHMyOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfT3V0cHV0SXRlcmF0b3I+IF9PSXRlclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lJdGVyVHJhaXRzMTo6aXRlcmF0b3JfY2F0ZWdvcnkKKyAgICAgICAgX0lJdGVyQ2F0ZWdvcnkxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSUl0ZXJUcmFpdHMyOjppdGVyYXRvcl9jYXRlZ29yeQorICAgICAgICBfSUl0ZXJDYXRlZ29yeTI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9PSXRlclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX09JdGVyQ2F0ZWdvcnk7CisKKyAgICAgIHJldHVybiBfX21lcmdlX3N3aXRjaCgKKyAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19yZXN1bHQsIF9fY29tcCwKKyAgICAgICAgICAgICAgX0lJdGVyQ2F0ZWdvcnkxKCksIF9JSXRlckNhdGVnb3J5MigpLCBfT0l0ZXJDYXRlZ29yeSgpKTsKKyAgfQorCisKKyAgLy8gUHVibGljIGludGVyZmFjZSwgaW5zZXJ0IGRlZmF1bHQgY29tcGFyYXRvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIG1lcmdlKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLCBfSUl0ZXIyIF9fYmVnaW4yLCAKKyAgICAgICAgICBfSUl0ZXIyIF9fZW5kMiwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyMT4gX0l0ZXJhdG9yMVRyYWl0czsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyMj4gX0l0ZXJhdG9yMlRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yMVRyYWl0czo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yMlRyYWl0czo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMjsKKworICAgICAgcmV0dXJuIF9fZ251X3BhcmFsbGVsOjptZXJnZShfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLAorICAgICAgICAgICAgICAgICAgX19yZXN1bHQsIF9fZ251X3BhcmFsbGVsOjpfTGVzczxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+KCkpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgaW5saW5lIHZvaWQKKyAgICBudGhfZWxlbWVudChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19udGgsIAorICAgICAgICAgICAgICAgIF9SQUl0ZXIgX19lbmQsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6bnRoX2VsZW1lbnQoX19iZWdpbiwgX19udGgsIF9fZW5kKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBudGhfZWxlbWVudChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19udGgsIAorICAgICAgICAgICAgICAgIF9SQUl0ZXIgX19lbmQsIF9Db21wYXJlIF9fY29tcCwgCisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6bnRoX2VsZW1lbnQoX19iZWdpbiwgX19udGgsIF9fZW5kLCBfX2NvbXApOyB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIG50aF9lbGVtZW50KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX250aCwgCisgICAgICAgICAgICAgICAgX1JBSXRlciBfX2VuZCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxfX2dudV9wYXJhbGxlbDo6X1NlcXVlbmNlSW5kZXg+KF9fZW5kIC0gX19iZWdpbikKKyAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLm50aF9lbGVtZW50X21pbmltYWxfbikpCisgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfX3BhcmFsbGVsX250aF9lbGVtZW50KF9fYmVnaW4sIF9fbnRoLCBfX2VuZCwgX19jb21wKTsKKyAgICAgIGVsc2UKKyAgICAgICAgbnRoX2VsZW1lbnQoX19iZWdpbiwgX19udGgsIF9fZW5kLCBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZSwgaW5zZXJ0IGRlZmF1bHQgY29tcGFyYXRvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIGlubGluZSB2b2lkCisgICAgbnRoX2VsZW1lbnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fbnRoLCAKKyAgICAgICAgICAgICAgICBfUkFJdGVyIF9fZW5kKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgX19nbnVfcGFyYWxsZWw6Om50aF9lbGVtZW50KF9fYmVnaW4sIF9fbnRoLCBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxlc3M8X1ZhbHVlVHlwZT4oKSk7CisgICAgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBwYXJ0aWFsX3NvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fbWlkZGxlLCAKKyAgICAgICAgICAgICAgICAgX1JBSXRlciBfX2VuZCwgX0NvbXBhcmUgX19jb21wLAorICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyBfR0xJQkNYWF9TVERfQTo6cGFydGlhbF9zb3J0KF9fYmVnaW4sIF9fbWlkZGxlLCBfX2VuZCwgX19jb21wKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHBhcnRpYWxfc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19taWRkbGUsIAorICAgICAgICAgICAgICAgICBfUkFJdGVyIF9fZW5kLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyBfR0xJQkNYWF9TVERfQTo6cGFydGlhbF9zb3J0KF9fYmVnaW4sIF9fbWlkZGxlLCBfX2VuZCk7IH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlLCBwYXJhbGxlbCBhbGdvcml0aG0gZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBwYXJ0aWFsX3NvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fbWlkZGxlLCAKKyAgICAgICAgICAgICAgICAgX1JBSXRlciBfX2VuZCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxfX2dudV9wYXJhbGxlbDo6X1NlcXVlbmNlSW5kZXg+KF9fZW5kIC0gX19iZWdpbikKKyAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLnBhcnRpYWxfc29ydF9taW5pbWFsX24pKQorICAgICAgICBfX2dudV9wYXJhbGxlbDo6CisgICAgICAgICAgX19wYXJhbGxlbF9wYXJ0aWFsX3NvcnQoX19iZWdpbiwgX19taWRkbGUsIF9fZW5kLCBfX2NvbXApOworICAgICAgZWxzZQorICAgICAgICBwYXJ0aWFsX3NvcnQoX19iZWdpbiwgX19taWRkbGUsIF9fZW5kLCBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UsIGluc2VydCBkZWZhdWx0IGNvbXBhcmF0b3IKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHBhcnRpYWxfc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19taWRkbGUsIAorICAgICAgICAgICAgICAgICBfUkFJdGVyIF9fZW5kKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgX19nbnVfcGFyYWxsZWw6OnBhcnRpYWxfc29ydChfX2JlZ2luLCBfX21pZGRsZSwgX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGVzczxfVmFsdWVUeXBlPigpKTsKKyAgICB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yPgorICAgIGlubGluZSBfRkl0ZXJhdG9yCisgICAgbWF4X2VsZW1lbnQoX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLCAKKyAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6Om1heF9lbGVtZW50KF9fYmVnaW4sIF9fZW5kKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIF9GSXRlcmF0b3IKKyAgICBtYXhfZWxlbWVudChfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIF9Db21wYXJlIF9fY29tcCwgCisgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjptYXhfZWxlbWVudChfX2JlZ2luLCBfX2VuZCwgX19jb21wKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sgZm9yIGlucHV0IGl0ZXJhdG9yIGNhc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9JdGVyYXRvclRhZz4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIF9fbWF4X2VsZW1lbnRfc3dpdGNoKF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgCisgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCwgX0l0ZXJhdG9yVGFnKQorICAgIHsgcmV0dXJuIG1heF9lbGVtZW50KF9fYmVnaW4sIF9fZW5kLCBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOyB9CisKKyAgLy8gUGFyYWxsZWwgYWxnb3JpdGhtIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyCisgICAgX19tYXhfZWxlbWVudF9zd2l0Y2goX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgCisgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbV90YWcKKyAgICAgICAgICAgICAgICAgICAgICAgPSBfX2dudV9wYXJhbGxlbDo6cGFyYWxsZWxfYmFsYW5jZWQpCisgICAgeworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQgLSBfX2JlZ2luKQorICAgICAgICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkubWF4X2VsZW1lbnRfbWluaW1hbF9uCisgICAgICAgICAgICAmJiBfX2dudV9wYXJhbGxlbDo6X19pc19wYXJhbGxlbChfX3BhcmFsbGVsaXNtX3RhZykpKQorICAgICAgICB7CisgICAgICAgICAgX1JBSXRlciBfX3JlcyhfX2JlZ2luKTsKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X19pZGVudGl0eV9zZWxlY3RvcjxfUkFJdGVyPgorICAgICAgICAgICAgX19mdW5jdGlvbmFsaXR5OworICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjoKKyAgICAgICAgICAgIF9fZm9yX2VhY2hfdGVtcGxhdGVfcmFuZG9tX2FjY2VzcygKKyAgICAgICAgICAgICAgX19iZWdpbiwgX19lbmQsIF9fZ251X3BhcmFsbGVsOjpfTm90aGluZygpLCBfX2Z1bmN0aW9uYWxpdHksCisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfX21heF9lbGVtZW50X3JlZHVjdDxfQ29tcGFyZSwgX1JBSXRlcj4oX19jb21wKSwKKyAgICAgICAgICAgICAgX19yZXMsIF9fcmVzLCAtMSwgX19wYXJhbGxlbGlzbV90YWcpOworICAgICAgICAgIHJldHVybiBfX3JlczsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gbWF4X2VsZW1lbnQoX19iZWdpbiwgX19lbmQsIF9fY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZSwgaW5zZXJ0IGRlZmF1bHQgY29tcGFyYXRvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yPgorICAgIGlubGluZSBfRkl0ZXJhdG9yCisgICAgbWF4X2VsZW1lbnQoX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLCAKKyAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9GSXRlcmF0b3I+Ojp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICByZXR1cm4gbWF4X2VsZW1lbnQoX19iZWdpbiwgX19lbmQsIHN0ZDo6bGVzczxfVmFsdWVUeXBlPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fcGFyYWxsZWxpc21fdGFnKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvcj4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIG1heF9lbGVtZW50KF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRkl0ZXJhdG9yPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgcmV0dXJuIF9fZ251X3BhcmFsbGVsOjptYXhfZWxlbWVudChfX2JlZ2luLCBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsZXNzPF9WYWx1ZVR5cGU+KCkpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSBfRkl0ZXJhdG9yCisgICAgbWF4X2VsZW1lbnQoX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLCBfQ29tcGFyZSBfX2NvbXAsCisgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfRkl0ZXJhdG9yPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5OworICAgICAgcmV0dXJuIF9fbWF4X2VsZW1lbnRfc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX2NvbXAsIF9JdGVyYXRvckNhdGVnb3J5KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcGFyYWxsZWxpc21fdGFnKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIF9GSXRlcmF0b3IKKyAgICBtYXhfZWxlbWVudChfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfRkl0ZXJhdG9yPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5OworICAgICAgcmV0dXJuIF9fbWF4X2VsZW1lbnRfc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX2NvbXAsIF9JdGVyYXRvckNhdGVnb3J5KCkpOworICAgIH0KKworCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvcj4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIG1pbl9lbGVtZW50KF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgCisgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjptaW5fZWxlbWVudChfX2JlZ2luLCBfX2VuZCk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSBfRkl0ZXJhdG9yCisgICAgbWluX2VsZW1lbnQoX0ZJdGVyYXRvciBfX2JlZ2luLCBfRkl0ZXJhdG9yIF9fZW5kLCBfQ29tcGFyZSBfX2NvbXAsIAorICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6bWluX2VsZW1lbnQoX19iZWdpbiwgX19lbmQsIF9fY29tcCk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfSXRlcmF0b3JUYWc+CisgICAgaW5saW5lIF9GSXRlcmF0b3IKKyAgICBfX21pbl9lbGVtZW50X3N3aXRjaChfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQsIAorICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXAsIF9JdGVyYXRvclRhZykKKyAgICB7IHJldHVybiBtaW5fZWxlbWVudChfX2JlZ2luLCBfX2VuZCwgX19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsgfQorCisgIC8vIFBhcmFsbGVsIGFsZ29yaXRobSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlcgorICAgIF9fbWluX2VsZW1lbnRfc3dpdGNoKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwgCisgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIAorICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnCisgICAgICAgICAgICAgICAgICAgICAgID0gX19nbnVfcGFyYWxsZWw6OnBhcmFsbGVsX2JhbGFuY2VkKQorICAgIHsKKyAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxfX2dudV9wYXJhbGxlbDo6X1NlcXVlbmNlSW5kZXg+KF9fZW5kIC0gX19iZWdpbikKKyAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLm1pbl9lbGVtZW50X21pbmltYWxfbgorICAgICAgICAgICAgJiYgX19nbnVfcGFyYWxsZWw6Ol9faXNfcGFyYWxsZWwoX19wYXJhbGxlbGlzbV90YWcpKSkKKyAgICAgICAgeworICAgICAgICAgIF9SQUl0ZXIgX19yZXMoX19iZWdpbik7CisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9faWRlbnRpdHlfc2VsZWN0b3I8X1JBSXRlcj4KKyAgICAgICAgICAgIF9fZnVuY3Rpb25hbGl0eTsKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6CisgICAgICAgICAgICBfX2Zvcl9lYWNoX3RlbXBsYXRlX3JhbmRvbV9hY2Nlc3MoCisgICAgICAgICAgICAgIF9fYmVnaW4sIF9fZW5kLCBfX2dudV9wYXJhbGxlbDo6X05vdGhpbmcoKSwgX19mdW5jdGlvbmFsaXR5LAorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X19taW5fZWxlbWVudF9yZWR1Y3Q8X0NvbXBhcmUsIF9SQUl0ZXI+KF9fY29tcCksCisgICAgICAgICAgICAgIF9fcmVzLCBfX3JlcywgLTEsIF9fcGFyYWxsZWxpc21fdGFnKTsKKyAgICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG1pbl9lbGVtZW50KF9fYmVnaW4sIF9fZW5kLCBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UsIGluc2VydCBkZWZhdWx0IGNvbXBhcmF0b3IKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyYXRvcj4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIG1pbl9lbGVtZW50KF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgCisgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRkl0ZXJhdG9yPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgcmV0dXJuIG1pbl9lbGVtZW50KF9fYmVnaW4sIF9fZW5kLCBzdGQ6Omxlc3M8X1ZhbHVlVHlwZT4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX3BhcmFsbGVsaXNtX3RhZyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcmF0b3I+CisgICAgaW5saW5lIF9GSXRlcmF0b3IKKyAgICBtaW5fZWxlbWVudChfRkl0ZXJhdG9yIF9fYmVnaW4sIF9GSXRlcmF0b3IgX19lbmQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZJdGVyYXRvcj46OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICAgIHJldHVybiBfX2dudV9wYXJhbGxlbDo6bWluX2VsZW1lbnQoX19iZWdpbiwgX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGVzczxfVmFsdWVUeXBlPigpKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIG1pbl9lbGVtZW50KF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgX0NvbXBhcmUgX19jb21wLAorICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbV90YWcpCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0ZJdGVyYXRvcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTsKKyAgICAgIHJldHVybiBfX21pbl9lbGVtZW50X3N3aXRjaChfX2JlZ2luLCBfX2VuZCwgX19jb21wLCBfSXRlcmF0b3JDYXRlZ29yeSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wYXJhbGxlbGlzbV90YWcpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgX0ZJdGVyYXRvcgorICAgIG1pbl9lbGVtZW50KF9GSXRlcmF0b3IgX19iZWdpbiwgX0ZJdGVyYXRvciBfX2VuZCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9GSXRlcmF0b3I+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnk7CisgICAgICByZXR1cm4gX19taW5fZWxlbWVudF9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9fY29tcCwgX0l0ZXJhdG9yQ2F0ZWdvcnkoKSk7CisgICAgfQorfSAvLyBlbmQgbmFtZXNwYWNlCit9IC8vIGVuZCBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX0FMR09fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9hbGdvYmFzZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9hbGdvYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNzM3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2FsZ29iYXNlLmgKQEAgLTAsMCArMSwyNzggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9hbGdvYmFzZS5oCisgKiAgQGJyaWVmIFBhcmFsbGVsIFNUTCBmdW5jdGlvbiBjYWxscyBjb3JyZXNwb25kaW5nIHRvIHRoZQorICogIHN0bF9hbGdvYmFzZS5oIGhlYWRlci4gIFRoZSBmdW5jdGlvbnMgZGVmaW5lZCBoZXJlIG1haW5seSBkbyBjYXNlCisgKiAgc3dpdGNoZXMgYW5kIGNhbGwgdGhlIGFjdHVhbCBwYXJhbGxlbGl6ZWQgdmVyc2lvbnMgaW4gb3RoZXIgZmlsZXMuCisgKiAgSW5saW5pbmcgcG9saWN5OiBGdW5jdGlvbnMgdGhhdCBiYXNpY2FsbHkgb25seSBjb250YWluIG9uZQorICogIGZ1bmN0aW9uIGNhbGwsIGFyZSBkZWNsYXJlZCBpbmxpbmUuCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBKb2hhbm5lcyBTaW5nbGVyIGFuZCBGZWxpeCBQdXR6ZS4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9BTEdPQkFTRV9ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX0FMR09CQVNFX0ggMQorCisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9iYXNlLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvYWxnb3JpdGhtZndkLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvZmluZC5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL2ZpbmRfc2VsZWN0b3JzLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fcGFyYWxsZWwKK3sKKyAgLy8gTkI6IGVxdWFsIGFuZCBsZXhpY29ncmFwaGljYWxfY29tcGFyZSByZXF1aXJlIG1pc21hdGNoLgorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMj4KKyAgICBpbmxpbmUgcGFpcjxfSUl0ZXIxLCBfSUl0ZXIyPgorICAgIG1pc21hdGNoKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLCBfSUl0ZXIyIF9fYmVnaW4yLAorICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6bWlzbWF0Y2goX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBwYWlyPF9JSXRlcjEsIF9JSXRlcjI+CisgICAgbWlzbWF0Y2goX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIF9JSXRlcjIgX19iZWdpbjIsCisgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6bWlzbWF0Y2goX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fcHJlZCk7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrIGZvciBpbnB1dCBpdGVyYXRvciBjYXNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9QcmVkaWNhdGUsIHR5cGVuYW1lIF9JdGVyYXRvclRhZzEsIHR5cGVuYW1lIF9JdGVyYXRvclRhZzI+CisgICAgaW5saW5lIHBhaXI8X0lJdGVyMSwgX0lJdGVyMj4KKyAgICBfX21pc21hdGNoX3N3aXRjaChfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwgX0lJdGVyMiBfX2JlZ2luMiwKKyAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgX0l0ZXJhdG9yVGFnMSwgX0l0ZXJhdG9yVGFnMikKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6bWlzbWF0Y2goX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fcHJlZCk7IH0KKworICAvLyBQYXJhbGxlbCBtaXNtYXRjaCBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIHBhaXI8X1JBSXRlcjEsIF9SQUl0ZXIyPgorICAgIF9fbWlzbWF0Y2hfc3dpdGNoKF9SQUl0ZXIxIF9fYmVnaW4xLCBfUkFJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgX1JBSXRlcjIgX19iZWdpbjIsIF9QcmVkaWNhdGUgX19wcmVkLCAKKyAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTih0cnVlKSkKKyAgICAgICAgeworICAgICAgICAgIF9SQUl0ZXIxIF9fcmVzID0KKyAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfX2ZpbmRfdGVtcGxhdGUoX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX21pc21hdGNoX3NlbGVjdG9yKCkpLmZpcnN0OworICAgICAgICAgIHJldHVybiBtYWtlX3BhaXIoX19yZXMgLCBfX2JlZ2luMiArIChfX3JlcyAtIF9fYmVnaW4xKSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjptaXNtYXRjaChfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19wcmVkKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyPgorICAgIGlubGluZSBwYWlyPF9JSXRlcjEsIF9JSXRlcjI+CisgICAgbWlzbWF0Y2goX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIF9JSXRlcjIgX19iZWdpbjIpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIxPiBfSXRlcmF0b3IxVHJhaXRzOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXIyPiBfSXRlcmF0b3IyVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3IxVHJhaXRzOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3IyVHJhaXRzOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3IxVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjJUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5MjsKKworICAgICAgdHlwZWRlZiBfX2dudV9wYXJhbGxlbDo6X0VxdWFsVG88X1ZhbHVlVHlwZTEsIF9WYWx1ZVR5cGUyPiBfRXF1YWxUbzsKKworICAgICAgcmV0dXJuIF9fbWlzbWF0Y2hfc3dpdGNoKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfRXF1YWxUbygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvckNhdGVnb3J5MSgpLCBfSXRlcmF0b3JDYXRlZ29yeTIoKSk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgcGFpcjxfSUl0ZXIxLCBfSUl0ZXIyPgorICAgIG1pc21hdGNoKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLCBfSUl0ZXIyIF9fYmVnaW4yLAorICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyMT4gX0l0ZXJhdG9yMVRyYWl0czsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyMj4gX0l0ZXJhdG9yMlRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yMVRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnkxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3IyVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTI7CisKKyAgICAgIHJldHVybiBfX21pc21hdGNoX3N3aXRjaChfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JdGVyYXRvckNhdGVnb3J5MSgpLCBfSXRlcmF0b3JDYXRlZ29yeTIoKSk7CisgICAgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMj4KKyAgICBpbmxpbmUgYm9vbAorICAgIGVxdWFsKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLCBfSUl0ZXIyIF9fYmVnaW4yLCAKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OmVxdWFsKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIGVxdWFsKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLCBfSUl0ZXIyIF9fYmVnaW4yLCAKKyAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjplcXVhbChfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19wcmVkKTsgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMj4KKyAgICBpbmxpbmUgYm9vbAorICAgIGVxdWFsKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLCBfSUl0ZXIyIF9fYmVnaW4yKQorICAgIHsKKyAgICAgIHJldHVybiBfX2dudV9wYXJhbGxlbDo6bWlzbWF0Y2goX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIpLmZpcnN0CisgICAgICAgICAgICAgID09IF9fZW5kMTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBib29sCisgICAgZXF1YWwoX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsIF9JSXRlcjIgX19iZWdpbjIsIAorICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIHJldHVybiBfX2dudV9wYXJhbGxlbDo6bWlzbWF0Y2goX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fcHJlZCkuZmlyc3QKKyAgICAgICAgICAgICAgPT0gX19lbmQxOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjI+CisgICAgaW5saW5lIGJvb2wKKyAgICBsZXhpY29ncmFwaGljYWxfY29tcGFyZShfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lJdGVyMiBfX2JlZ2luMiwgX0lJdGVyMiBfX2VuZDIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX19iZWdpbjEsIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iZWdpbjIsIF9fZW5kMik7IH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBsZXhpY29ncmFwaGljYWxfY29tcGFyZShfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lJdGVyMiBfX2JlZ2luMiwgX0lJdGVyMiBfX2VuZDIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKAorICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19wcmVkKTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2sgZm9yIGlucHV0IGl0ZXJhdG9yIGNhc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMSwgdHlwZW5hbWUgX0l0ZXJhdG9yVGFnMj4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfc3dpdGNoKF9JSXRlcjEgX19iZWdpbjEsIF9JSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JSXRlcjIgX19iZWdpbjIsIF9JSXRlcjIgX19lbmQyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSXRlcmF0b3JUYWcxLCBfSXRlcmF0b3JUYWcyKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgKKyAgICAgICAgICAgICAgIF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX2VuZDIsIF9fcHJlZCk7IH0KKworICAvLyBQYXJhbGxlbCBsZXhpY29ncmFwaGljYWxfY29tcGFyZSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMKKyAgLy8gTGltaXRhdGlvbjogQm90aCB2YWx1ZXR5cGVzIG11c3QgYmUgdGhlIHNhbWUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGJvb2wKKyAgICBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlX3N3aXRjaChfUkFJdGVyMSBfX2JlZ2luMSwgX1JBSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SQUl0ZXIyIF9fYmVnaW4yLCBfUkFJdGVyMiBfX2VuZDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04odHJ1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfUkFJdGVyMT4gX1RyYWl0c1R5cGUxOworICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGUxOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUxOworCisgICAgICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcjI+IF9UcmFpdHNUeXBlMjsKKyAgICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlMjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMjsKKworICAgICAgICAgIHR5cGVkZWYgX19nbnVfcGFyYWxsZWw6OgorICAgICAgICAgICAgICAgICAgX0VxdWFsRnJvbUxlc3M8X1ZhbHVlVHlwZTEsIF9WYWx1ZVR5cGUyLCBfUHJlZGljYXRlPgorICAgICAgICAgICAgICAgICAgX0VxdWFsRnJvbUxlc3NDb21wYXJlOworCisgICAgICAgICAgLy8gTG9uZ2VyIHNlcXVlbmNlIGluIGZpcnN0IHBsYWNlLgorICAgICAgICAgIGlmICgoX19lbmQxIC0gX19iZWdpbjEpIDwgKF9fZW5kMiAtIF9fYmVnaW4yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdHlwZWRlZiBwYWlyPF9SQUl0ZXIxLCBfUkFJdGVyMj4gX1Nwb3RUeXBlOworICAgICAgICAgICAgICBfU3BvdFR5cGUgX19tbSA9IF9fbWlzbWF0Y2hfc3dpdGNoKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9FcXVhbEZyb21MZXNzQ29tcGFyZShfX3ByZWQpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcoKSk7CisKKyAgICAgICAgICAgICAgcmV0dXJuIChfX21tLmZpcnN0ID09IF9fZW5kMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGJvb2woX19wcmVkKCpfX21tLmZpcnN0LCAqX19tbS5zZWNvbmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHR5cGVkZWYgcGFpcjxfUkFJdGVyMiwgX1JBSXRlcjE+IF9TcG90VHlwZTsKKyAgICAgICAgICAgICAgX1Nwb3RUeXBlIF9fbW0gPSBfX21pc21hdGNoX3N3aXRjaChfX2JlZ2luMiwgX19lbmQyLCBfX2JlZ2luMSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRXF1YWxGcm9tTGVzc0NvbXBhcmUoX19wcmVkKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZygpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCkpOworCisgICAgICAgICAgICAgIHJldHVybiAoX19tbS5maXJzdCAhPSBfX2VuZDIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBib29sKF9fcHJlZCgqX19tbS5zZWNvbmQsICpfX21tLmZpcnN0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgKKyAgICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX19wcmVkKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyPgorICAgIGlubGluZSBib29sCisgICAgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX0lJdGVyMSBfX2JlZ2luMSwgX0lJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lJdGVyMiBfX2JlZ2luMiwgX0lJdGVyMiBfX2VuZDIpCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0lJdGVyMT4gX1RyYWl0c1R5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTE6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlMTo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnkxOworCisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXIyPiBfVHJhaXRzVHlwZTI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlMjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGUyOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTI7CisgICAgICB0eXBlZGVmIF9fZ251X3BhcmFsbGVsOjpfTGVzczxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+IF9MZXNzVHlwZTsKKworICAgICAgcmV0dXJuIF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfc3dpdGNoKAorICAgICAgICAgICAgICAgX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX0xlc3NUeXBlKCksCisgICAgICAgICAgICAgICBfSXRlcmF0b3JDYXRlZ29yeTEoKSwgX0l0ZXJhdG9yQ2F0ZWdvcnkyKCkpOworICAgIH0KKworICAvLyBQdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBsZXhpY29ncmFwaGljYWxfY29tcGFyZShfSUl0ZXIxIF9fYmVnaW4xLCBfSUl0ZXIxIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fYmVnaW4yLCBfSUl0ZXIyIF9fZW5kMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXIxPiBfVHJhaXRzVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlMTo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnkxOworCisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXIyPiBfVHJhaXRzVHlwZTI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlMjo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnkyOworCisgICAgICByZXR1cm4gX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV9zd2l0Y2goCisgICAgICAgICAgICAgICBfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLCBfX3ByZWQsCisgICAgICAgICAgICAgICBfSXRlcmF0b3JDYXRlZ29yeTEoKSwgX0l0ZXJhdG9yQ2F0ZWdvcnkyKCkpOworICAgIH0KK30gLy8gZW5kIG5hbWVzcGFjZQorfSAvLyBlbmQgbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9BTEdPQkFTRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2FsZ29yaXRobSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvYWxnb3JpdGhtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmY2YyYjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2FsZ29yaXRobQpAQCAtMCwwICsxLDM5IEBACisvLyBBbGdvcml0aG0gZXh0ZW5zaW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvYWxnb3JpdGhtCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfUEFSQUxMRUxfQUxHT1JJVEhNCisjZGVmaW5lIF9QQVJBTExFTF9BTEdPUklUSE0gMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8cGFyYWxsZWwvYWxnb3JpdGhtZndkLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvYWxnb2Jhc2UuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9hbGdvLmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9hbGdvcml0aG1md2QuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvYWxnb3JpdGhtZndkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhOGE1YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvYWxnb3JpdGhtZndkLmgKQEAgLTAsMCArMSw5MDggQEAKKy8vIDxwYXJhbGxlbC9hbGdvcml0aG0+IEZvcndhcmQgZGVjbGFyYXRpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9hbGdvcml0aG1md2QuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfQUxHT1JJVEhNRldEX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfQUxHT1JJVEhNRldEX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxwYXJhbGxlbC90YWdzLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvc2V0dGluZ3MuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19wYXJhbGxlbAoreworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXI+CisgICAgX0ZJdGVyCisgICAgYWRqYWNlbnRfZmluZChfRkl0ZXIsIF9GSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyPgorICAgIF9GSXRlcgorICAgIGFkamFjZW50X2ZpbmQoX0ZJdGVyLCBfRkl0ZXIsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfSXRlclRhZz4KKyAgICBfRkl0ZXIKKyAgICBfX2FkamFjZW50X2ZpbmRfc3dpdGNoKF9GSXRlciwgX0ZJdGVyLCBfSXRlclRhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICBfUkFJdGVyCisgICAgX19hZGphY2VudF9maW5kX3N3aXRjaChfUkFJdGVyLCBfUkFJdGVyLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyk7CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9CaVByZWRpY2F0ZT4KKyAgICBfRkl0ZXIKKyAgICBhZGphY2VudF9maW5kKF9GSXRlciwgX0ZJdGVyLCBfQmlQcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0JpUHJlZGljYXRlPgorICAgIF9GSXRlcgorICAgIGFkamFjZW50X2ZpbmQoX0ZJdGVyLCBfRkl0ZXIsIF9CaVByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfQmlQcmVkaWNhdGUsIHR5cGVuYW1lIF9JdGVyVGFnPgorICAgIF9GSXRlcgorICAgIF9fYWRqYWNlbnRfZmluZF9zd2l0Y2goX0ZJdGVyLCBfRkl0ZXIsIF9CaVByZWRpY2F0ZSwgX0l0ZXJUYWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9CaVByZWRpY2F0ZT4KKyAgICBfUkFJdGVyCisgICAgX19hZGphY2VudF9maW5kX3N3aXRjaChfUkFJdGVyLCBfUkFJdGVyLCBfQmlQcmVkaWNhdGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKTsKKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBjb3VudChfSUl0ZXIsIF9JSXRlciwgY29uc3QgX1RwJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIGNvdW50KF9JSXRlciwgX0lJdGVyLCBjb25zdCBfVHAmLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBjb3VudChfSUl0ZXIsIF9JSXRlciwgY29uc3QgX1RwJiwgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9JdGVyVGFnPgorICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBfX2NvdW50X3N3aXRjaChfSUl0ZXIsIF9JSXRlciwgY29uc3QgX1RwJiwgX0l0ZXJUYWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9UcD4KKyAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIF9fY291bnRfc3dpdGNoKF9SQUl0ZXIsIF9SQUl0ZXIsIGNvbnN0IF9UcCYsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc20KKyAgICAgICAgICAgICAgICAgPSBfX2dudV9wYXJhbGxlbDo6cGFyYWxsZWxfdW5iYWxhbmNlZCk7CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIGNvdW50X2lmKF9JSXRlciwgX0lJdGVyLCBfUHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIGNvdW50X2lmKF9JSXRlciwgX0lJdGVyLCBfUHJlZGljYXRlLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgY291bnRfaWYoX0lJdGVyLCBfSUl0ZXIsIF9QcmVkaWNhdGUsIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX0l0ZXJUYWc+CisgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIF9fY291bnRfaWZfc3dpdGNoKF9JSXRlciwgX0lJdGVyLCBfUHJlZGljYXRlLCBfSXRlclRhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JBSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIF9fY291bnRfaWZfc3dpdGNoKF9SQUl0ZXIsIF9SQUl0ZXIsIF9QcmVkaWNhdGUsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc20KKyAgICAgICAgICAgICAgICAgICAgPSBfX2dudV9wYXJhbGxlbDo6cGFyYWxsZWxfdW5iYWxhbmNlZCk7CisKKyAgLy8gYWxnb2Jhc2UuaAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyPgorICAgIGJvb2wKKyAgICBlcXVhbChfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgYm9vbAorICAgIGVxdWFsKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9QcmVkaWNhdGUsCisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyPgorICAgIGJvb2wKKyAgICBlcXVhbChfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGJvb2wKKyAgICBlcXVhbChfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfUHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBfSUl0ZXIKKyAgICBmaW5kKF9JSXRlciwgX0lJdGVyLCBjb25zdCBfVHAmLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIF9JSXRlcgorICAgIGZpbmQoX0lJdGVyLCBfSUl0ZXIsIGNvbnN0IF9UcCYgX192YWwpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSXRlclRhZz4KKyAgICBfSUl0ZXIKKyAgICBfX2ZpbmRfc3dpdGNoKF9JSXRlciwgX0lJdGVyLCBjb25zdCBfVHAmLCBfSXRlclRhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIF9SQUl0ZXIKKyAgICBfX2ZpbmRfc3dpdGNoKF9SQUl0ZXIsIF9SQUl0ZXIsIGNvbnN0IF9UcCYsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX0lJdGVyCisgICAgZmluZF9pZihfSUl0ZXIsIF9JSXRlciwgX1ByZWRpY2F0ZSwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX0lJdGVyCisgICAgZmluZF9pZihfSUl0ZXIsIF9JSXRlciwgX1ByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfSXRlclRhZz4KKyAgICBfSUl0ZXIKKyAgICBfX2ZpbmRfaWZfc3dpdGNoKF9JSXRlciwgX0lJdGVyLCBfUHJlZGljYXRlLCBfSXRlclRhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfUkFJdGVyCisgICAgX19maW5kX2lmX3N3aXRjaChfUkFJdGVyLCBfUkFJdGVyLCBfUHJlZGljYXRlLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfRkl0ZXI+CisgICAgX0lJdGVyCisgICAgZmluZF9maXJzdF9vZihfSUl0ZXIsIF9JSXRlciwgX0ZJdGVyLCBfRkl0ZXIsCisgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfQmlQcmVkaWNhdGU+CisgICAgX0lJdGVyCisgICAgZmluZF9maXJzdF9vZihfSUl0ZXIsIF9JSXRlciwgX0ZJdGVyLCBfRkl0ZXIsIF9CaVByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9CaVByZWRpY2F0ZT4KKyAgICBfSUl0ZXIKKyAgICBmaW5kX2ZpcnN0X29mKF9JSXRlciwgX0lJdGVyLCBfRkl0ZXIsIF9GSXRlciwgX0JpUHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9GSXRlcj4KKyAgICBfSUl0ZXIKKyAgICBmaW5kX2ZpcnN0X29mKF9JSXRlciwgX0lJdGVyLCBfRkl0ZXIsIF9GSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfRkl0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyVGFnMSwgdHlwZW5hbWUgX0l0ZXJUYWcyPgorICAgIF9JSXRlcgorICAgIF9fZmluZF9maXJzdF9vZl9zd2l0Y2goCisgICAgICBfSUl0ZXIsIF9JSXRlciwgX0ZJdGVyLCBfRkl0ZXIsIF9JdGVyVGFnMSwgX0l0ZXJUYWcyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9CaVByZWRpY2F0ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJUYWc+CisgICAgX1JBSXRlcgorICAgIF9fZmluZF9maXJzdF9vZl9zd2l0Y2goX1JBSXRlciwgX1JBSXRlciwgX0ZJdGVyLCBfRkl0ZXIsIF9CaVByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgX0l0ZXJUYWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfQmlQcmVkaWNhdGUsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyVGFnMSwgdHlwZW5hbWUgX0l0ZXJUYWcyPgorICAgIF9JSXRlcgorICAgIF9fZmluZF9maXJzdF9vZl9zd2l0Y2goX0lJdGVyLCBfSUl0ZXIsIF9GSXRlciwgX0ZJdGVyLCBfQmlQcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgX0l0ZXJUYWcxLCBfSXRlclRhZzIpOworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfRnVuY3Rpb24+CisgICAgX0Z1bmN0aW9uCisgICAgZm9yX2VhY2goX0lJdGVyLCBfSUl0ZXIsIF9GdW5jdGlvbik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfRnVuY3Rpb24+CisgICAgX0Z1bmN0aW9uCisgICAgZm9yX2VhY2goX0lJdGVyLCBfSUl0ZXIsIF9GdW5jdGlvbiwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9GdW5jdGlvbj4KKyAgICBfRnVuY3Rpb24KKyAgICBmb3JfZWFjaChfSXRlcmF0b3IsIF9JdGVyYXRvciwgX0Z1bmN0aW9uLCBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9GdW5jdGlvbiwgdHlwZW5hbWUgX0l0ZXJUYWc+CisgICAgX0Z1bmN0aW9uCisgICAgX19mb3JfZWFjaF9zd2l0Y2goX0lJdGVyLCBfSUl0ZXIsIF9GdW5jdGlvbiwgX0l0ZXJUYWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9GdW5jdGlvbj4KKyAgICBfRnVuY3Rpb24KKyAgICBfX2Zvcl9lYWNoX3N3aXRjaChfUkFJdGVyLCBfUkFJdGVyLCBfRnVuY3Rpb24sIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtICBfX3BhcmFsbGVsaXNtCisgICAgICAgICAgICAgICAgICAgID0gX19nbnVfcGFyYWxsZWw6OnBhcmFsbGVsX2JhbGFuY2VkKTsKKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0dlbmVyYXRvcj4KKyAgICB2b2lkCisgICAgZ2VuZXJhdGUoX0ZJdGVyLCBfRkl0ZXIsIF9HZW5lcmF0b3IpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0dlbmVyYXRvcj4KKyAgICB2b2lkCisgICAgZ2VuZXJhdGUoX0ZJdGVyLCBfRkl0ZXIsIF9HZW5lcmF0b3IsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfR2VuZXJhdG9yPgorICAgIHZvaWQKKyAgICBnZW5lcmF0ZShfRkl0ZXIsIF9GSXRlciwgX0dlbmVyYXRvciwgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfR2VuZXJhdG9yLCB0eXBlbmFtZSBfSXRlclRhZz4KKyAgICB2b2lkCisgICAgX19nZW5lcmF0ZV9zd2l0Y2goX0ZJdGVyLCBfRkl0ZXIsIF9HZW5lcmF0b3IsIF9JdGVyVGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfR2VuZXJhdG9yPgorICAgIHZvaWQKKyAgICBfX2dlbmVyYXRlX3N3aXRjaChfUkFJdGVyLCBfUkFJdGVyLCBfR2VuZXJhdG9yLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtCisgICAgICAgICAgICAgICAgICAgID0gX19nbnVfcGFyYWxsZWw6OnBhcmFsbGVsX2JhbGFuY2VkKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfR2VuZXJhdG9yPgorICAgIF9PSXRlcgorICAgIGdlbmVyYXRlX24oX09JdGVyLCBfU2l6ZSwgX0dlbmVyYXRvcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0dlbmVyYXRvcj4KKyAgICBfT0l0ZXIKKyAgICBnZW5lcmF0ZV9uKF9PSXRlciwgX1NpemUsIF9HZW5lcmF0b3IsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0dlbmVyYXRvcj4KKyAgICBfT0l0ZXIKKyAgICBnZW5lcmF0ZV9uKF9PSXRlciwgX1NpemUsIF9HZW5lcmF0b3IsIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9HZW5lcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyVGFnPgorICAgIF9PSXRlcgorICAgIF9fZ2VuZXJhdGVfbl9zd2l0Y2goX09JdGVyLCBfU2l6ZSwgX0dlbmVyYXRvciwgX0l0ZXJUYWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfR2VuZXJhdG9yPgorICAgIF9SQUl0ZXIKKyAgICBfX2dlbmVyYXRlX25fc3dpdGNoKF9SQUl0ZXIsIF9TaXplLCBfR2VuZXJhdG9yLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc20KKyAgICAgICAgICAgICAgICAgICAgICA9IF9fZ251X3BhcmFsbGVsOjpwYXJhbGxlbF9iYWxhbmNlZCk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMj4KKyAgICBib29sCisgICAgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgYm9vbAorICAgIGxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9QcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyPgorICAgIGJvb2wKKyAgICBsZXhpY29ncmFwaGljYWxfY29tcGFyZShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGJvb2wKKyAgICBsZXhpY29ncmFwaGljYWxfY29tcGFyZShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfUHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfSXRlclRhZzEsIHR5cGVuYW1lIF9JdGVyVGFnMj4KKyAgICBib29sCisgICAgX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV9zd2l0Y2goX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSwgX0l0ZXJUYWcxLCBfSXRlclRhZzIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIxLCB0eXBlbmFtZSBfUkFJdGVyMiwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBib29sCisgICAgX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV9zd2l0Y2goX1JBSXRlcjEsIF9SQUl0ZXIxLCBfUkFJdGVyMiwgX1JBSXRlcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyk7CisKKyAgLy8gYWxnby5oCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjI+CisgICAgcGFpcjxfSUl0ZXIxLCBfSUl0ZXIyPgorICAgIG1pc21hdGNoKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBwYWlyPF9JSXRlcjEsIF9JSXRlcjI+CisgICAgbWlzbWF0Y2goX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX1ByZWRpY2F0ZSwKKyAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjI+CisgICAgcGFpcjxfSUl0ZXIxLCBfSUl0ZXIyPgorICAgIG1pc21hdGNoKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgcGFpcjxfSUl0ZXIxLCBfSUl0ZXIyPgorICAgIG1pc21hdGNoKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9QcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9QcmVkaWNhdGUsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyVGFnMSwgdHlwZW5hbWUgX0l0ZXJUYWcyPgorICAgIHBhaXI8X0lJdGVyMSwgX0lJdGVyMj4KKyAgICBfX21pc21hdGNoX3N3aXRjaChfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfUHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICBfSXRlclRhZzEsIF9JdGVyVGFnMik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIHBhaXI8X1JBSXRlcjEsIF9SQUl0ZXIyPgorICAgIF9fbWlzbWF0Y2hfc3dpdGNoKF9SQUl0ZXIxLCBfUkFJdGVyMSwgX1JBSXRlcjIsIF9QcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyMSwgdHlwZW5hbWUgX0ZJdGVyMj4KKyAgICBfRkl0ZXIxCisgICAgc2VhcmNoKF9GSXRlcjEsIF9GSXRlcjEsIF9GSXRlcjIsIF9GSXRlcjIsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyMSwgdHlwZW5hbWUgX0ZJdGVyMj4KKyAgICBfRkl0ZXIxCisgICAgc2VhcmNoKF9GSXRlcjEsIF9GSXRlcjEsIF9GSXRlcjIsIF9GSXRlcjIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcjEsIHR5cGVuYW1lIF9GSXRlcjIsIHR5cGVuYW1lIF9CaVByZWRpY2F0ZT4KKyAgICBfRkl0ZXIxCisgICAgc2VhcmNoKF9GSXRlcjEsIF9GSXRlcjEsIF9GSXRlcjIsIF9GSXRlcjIsIF9CaVByZWRpY2F0ZSwKKyAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIxLCB0eXBlbmFtZSBfRkl0ZXIyLCB0eXBlbmFtZSBfQmlQcmVkaWNhdGU+CisgICAgX0ZJdGVyMQorICAgIHNlYXJjaChfRkl0ZXIxLCBfRkl0ZXIxLCBfRkl0ZXIyLCBfRkl0ZXIyLCBfQmlQcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIxLCB0eXBlbmFtZSBfUkFJdGVyMj4KKyAgICBfUkFJdGVyMQorICAgIF9fc2VhcmNoX3N3aXRjaChfUkFJdGVyMSwgX1JBSXRlcjEsIF9SQUl0ZXIyLCBfUkFJdGVyMiwKKyAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyMSwgdHlwZW5hbWUgX0ZJdGVyMiwgdHlwZW5hbWUgX0l0ZXJUYWcxLAorICAgICAgICAgICB0eXBlbmFtZSBfSXRlclRhZzI+CisgICAgX0ZJdGVyMQorICAgIF9fc2VhcmNoX3N3aXRjaChfRkl0ZXIxLCBfRkl0ZXIxLCBfRkl0ZXIyLCBfRkl0ZXIyLCBfSXRlclRhZzEsIF9JdGVyVGFnMik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLCB0eXBlbmFtZSBfQmlQcmVkaWNhdGU+CisgICAgX1JBSXRlcjEKKyAgICBfX3NlYXJjaF9zd2l0Y2goX1JBSXRlcjEsIF9SQUl0ZXIxLCBfUkFJdGVyMiwgX1JBSXRlcjIsIF9CaVByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyMSwgdHlwZW5hbWUgX0ZJdGVyMiwgdHlwZW5hbWUgX0JpUHJlZGljYXRlLAorICAgICAgICAgICB0eXBlbmFtZSBfSXRlclRhZzEsIHR5cGVuYW1lIF9JdGVyVGFnMj4KKyAgICBfRkl0ZXIxCisgICAgX19zZWFyY2hfc3dpdGNoKF9GSXRlcjEsIF9GSXRlcjEsIF9GSXRlcjIsIF9GSXRlcjIsIF9CaVByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgIF9JdGVyVGFnMSwgX0l0ZXJUYWcyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9JbnRlZ2VyLCB0eXBlbmFtZSBfVHA+CisgICAgX0ZJdGVyCisgICAgc2VhcmNoX24oX0ZJdGVyLCBfRkl0ZXIsIF9JbnRlZ2VyLCBjb25zdCBfVHAmLAorICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfSW50ZWdlciwgdHlwZW5hbWUgX1RwLAorICAgICAgICAgICB0eXBlbmFtZSBfQmlQcmVkaWNhdGU+CisgICAgX0ZJdGVyCisgICAgc2VhcmNoX24oX0ZJdGVyLCBfRkl0ZXIsIF9JbnRlZ2VyLCBjb25zdCBfVHAmLCBfQmlQcmVkaWNhdGUsCisgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKyAgICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfSW50ZWdlciwgdHlwZW5hbWUgX1RwPgorICAgIF9GSXRlcgorICAgIHNlYXJjaF9uKF9GSXRlciwgX0ZJdGVyLCBfSW50ZWdlciwgY29uc3QgX1RwJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfSW50ZWdlciwgdHlwZW5hbWUgX1RwLAorICAgICAgICAgICB0eXBlbmFtZSBfQmlQcmVkaWNhdGU+CisgICAgX0ZJdGVyCisgICAgc2VhcmNoX24oX0ZJdGVyLCBfRkl0ZXIsIF9JbnRlZ2VyLCBjb25zdCBfVHAmLCBfQmlQcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9JbnRlZ2VyLCB0eXBlbmFtZSBfVHAsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaVByZWRpY2F0ZT4KKyAgICBfUkFJdGVyCisgICAgX19zZWFyY2hfbl9zd2l0Y2goX1JBSXRlciwgX1JBSXRlciwgX0ludGVnZXIsIGNvbnN0IF9UcCYsCisgICAgICAgICAgICAgICAgICAgIF9CaVByZWRpY2F0ZSwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0ludGVnZXIsIHR5cGVuYW1lIF9UcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpUHJlZGljYXRlLCB0eXBlbmFtZSBfSXRlclRhZz4KKyAgICBfRkl0ZXIKKyAgICBfX3NlYXJjaF9uX3N3aXRjaChfRkl0ZXIsIF9GSXRlciwgX0ludGVnZXIsIGNvbnN0IF9UcCYsCisgICAgICAgICAgICAgICAgICAgIF9CaVByZWRpY2F0ZSwgX0l0ZXJUYWcpOworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9VbmFyeU9wZXJhdGlvbj4KKyAgICBfT0l0ZXIKKyAgICB0cmFuc2Zvcm0oX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgX1VuYXJ5T3BlcmF0aW9uKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX1VuYXJ5T3BlcmF0aW9uPgorICAgIF9PSXRlcgorICAgIHRyYW5zZm9ybShfSUl0ZXIsIF9JSXRlciwgX09JdGVyLCBfVW5hcnlPcGVyYXRpb24sIAorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfVW5hcnlPcGVyYXRpb24+CisgICAgX09JdGVyCisgICAgdHJhbnNmb3JtKF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIsIF9VbmFyeU9wZXJhdGlvbiwgCisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfVW5hcnlPcGVyYXRpb24sCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyVGFnMSwgdHlwZW5hbWUgX0l0ZXJUYWcyPgorICAgIF9PSXRlcgorICAgIF9fdHJhbnNmb3JtMV9zd2l0Y2goX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgX1VuYXJ5T3BlcmF0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICBfSXRlclRhZzEsIF9JdGVyVGFnMik7CisgICAgCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSUl0ZXIsIHR5cGVuYW1lIF9SQU9JdGVyLCB0eXBlbmFtZSBfVW5hcnlPcGVyYXRpb24+CisgICAgX1JBT0l0ZXIKKyAgICBfX3RyYW5zZm9ybTFfc3dpdGNoKF9SQUlJdGVyLCBfUkFJSXRlciwgX1JBT0l0ZXIsIF9VbmFyeU9wZXJhdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCAKKyAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc20KKyAgICAgICAgICAgICAgICAgICAgICA9IF9fZ251X3BhcmFsbGVsOjpwYXJhbGxlbF9iYWxhbmNlZCk7CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaU9wZXJhdGlvbj4KKyAgICBfT0l0ZXIKKyAgICB0cmFuc2Zvcm0oX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX09JdGVyLCBfQmlPcGVyYXRpb24pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpT3BlcmF0aW9uPgorICAgIF9PSXRlcgorICAgIHRyYW5zZm9ybShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfT0l0ZXIsIF9CaU9wZXJhdGlvbiwgCisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfQmlPcGVyYXRpb24+CisgICAgX09JdGVyCisgICAgdHJhbnNmb3JtKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9PSXRlciwgX0JpT3BlcmF0aW9uLCAKKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLCB0eXBlbmFtZSBfUkFJdGVyMywKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpT3BlcmF0aW9uPgorICAgIF9SQUl0ZXIzCisgICAgX190cmFuc2Zvcm0yX3N3aXRjaChfUkFJdGVyMSwgX1JBSXRlcjEsIF9SQUl0ZXIyLCBfUkFJdGVyMywgX0JpT3BlcmF0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIAorICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbQorICAgICAgICAgICAgICAgICAgICAgID0gX19nbnVfcGFyYWxsZWw6OnBhcmFsbGVsX2JhbGFuY2VkKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaU9wZXJhdGlvbiwgdHlwZW5hbWUgX1RhZzEsCisgICAgICAgICAgIHR5cGVuYW1lIF9UYWcyLCB0eXBlbmFtZSBfVGFnMz4KKyAgICBfT0l0ZXIKKyAgICBfX3RyYW5zZm9ybTJfc3dpdGNoKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9PSXRlciwgX0JpT3BlcmF0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICBfVGFnMSwgX1RhZzIsIF9UYWczKTsKKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICByZXBsYWNlKF9GSXRlciwgX0ZJdGVyLCBjb25zdCBfVHAmLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgcmVwbGFjZShfRkl0ZXIsIF9GSXRlciwgY29uc3QgX1RwJiwgY29uc3QgX1RwJiwgCisgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICByZXBsYWNlKF9GSXRlciwgX0ZJdGVyLCBjb25zdCBfVHAmLCBjb25zdCBfVHAmLAorICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9JdGVyVGFnPgorICAgIHZvaWQKKyAgICBfX3JlcGxhY2Vfc3dpdGNoKF9GSXRlciwgX0ZJdGVyLCBjb25zdCBfVHAmLCBjb25zdCBfVHAmLCBfSXRlclRhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX3JlcGxhY2Vfc3dpdGNoKF9SQUl0ZXIsIF9SQUl0ZXIsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCYsIAorICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtKTsKKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICByZXBsYWNlX2lmKF9GSXRlciwgX0ZJdGVyLCBfUHJlZGljYXRlLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGUsIHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgcmVwbGFjZV9pZihfRkl0ZXIsIF9GSXRlciwgX1ByZWRpY2F0ZSwgY29uc3QgX1RwJiwKKyAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIHJlcGxhY2VfaWYoX0ZJdGVyLCBfRkl0ZXIsIF9QcmVkaWNhdGUsIGNvbnN0IF9UcCYsCisgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGUsIHR5cGVuYW1lIF9UcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJUYWc+CisgICAgdm9pZAorICAgIF9fcmVwbGFjZV9pZl9zd2l0Y2goX0ZJdGVyLCBfRkl0ZXIsIF9QcmVkaWNhdGUsIGNvbnN0IF9UcCYsIF9JdGVyVGFnKTsKKyAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX3JlcGxhY2VfaWZfc3dpdGNoKF9SQUl0ZXIsIF9SQUl0ZXIsIF9QcmVkaWNhdGUsIGNvbnN0IF9UcCYsCisgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSk7CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXI+CisgICAgX0ZJdGVyCisgICAgbWF4X2VsZW1lbnQoX0ZJdGVyLCBfRkl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcj4KKyAgICBfRkl0ZXIKKyAgICBtYXhfZWxlbWVudChfRkl0ZXIsIF9GSXRlciwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXI+CisgICAgX0ZJdGVyCisgICAgbWF4X2VsZW1lbnQoX0ZJdGVyLCBfRkl0ZXIsIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX0ZJdGVyCisgICAgbWF4X2VsZW1lbnQoX0ZJdGVyLCBfRkl0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9GSXRlcgorICAgIG1heF9lbGVtZW50KF9GSXRlciwgX0ZJdGVyLCBfQ29tcGFyZSwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9GSXRlcgorICAgIG1heF9lbGVtZW50KF9GSXRlciwgX0ZJdGVyLCBfQ29tcGFyZSwgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0l0ZXJUYWc+CisgICAgX0ZJdGVyCisgICAgX19tYXhfZWxlbWVudF9zd2l0Y2goX0ZJdGVyLCBfRkl0ZXIsIF9Db21wYXJlLCBfSXRlclRhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlcgorICAgIF9fbWF4X2VsZW1lbnRfc3dpdGNoKAorICAgICAgX1JBSXRlciwgX1JBSXRlciwgX0NvbXBhcmUsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtCisgICAgICA9IF9fZ251X3BhcmFsbGVsOjpwYXJhbGxlbF9iYWxhbmNlZCk7CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXI+CisgICAgX09JdGVyCisgICAgbWVyZ2UoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyLCAKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX09JdGVyCisgICAgbWVyZ2UoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyLCBfQ29tcGFyZSwgCisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9PSXRlcgorICAgIG1lcmdlKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIKKyAgICBtZXJnZShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9JdGVyVGFnMSwgdHlwZW5hbWUgX0l0ZXJUYWcyLAorICAgICAgICAgICB0eXBlbmFtZSBfSXRlclRhZzM+CisgICAgX09JdGVyCisgICAgX19tZXJnZV9zd2l0Y2goX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyLCBfQ29tcGFyZSwgCisgICAgICAgICAgICAgICAgIF9JdGVyVGFnMSwgX0l0ZXJUYWcyLCBfSXRlclRhZzMpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX09JdGVyCisgICAgX19tZXJnZV9zd2l0Y2goX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyLCBfQ29tcGFyZSwgCisgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgCisgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKTsKKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcj4KKyAgICBfRkl0ZXIKKyAgICBtaW5fZWxlbWVudChfRkl0ZXIsIF9GSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyPgorICAgIF9GSXRlcgorICAgIG1pbl9lbGVtZW50KF9GSXRlciwgX0ZJdGVyLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcj4KKyAgICBfRkl0ZXIKKyAgICBtaW5fZWxlbWVudChfRkl0ZXIsIF9GSXRlciwKKyAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9GSXRlcgorICAgIG1pbl9lbGVtZW50KF9GSXRlciwgX0ZJdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfRkl0ZXIKKyAgICBtaW5fZWxlbWVudChfRkl0ZXIsIF9GSXRlciwgX0NvbXBhcmUsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfRkl0ZXIKKyAgICBtaW5fZWxlbWVudChfRkl0ZXIsIF9GSXRlciwgX0NvbXBhcmUsIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9JdGVyVGFnPgorICAgIF9GSXRlcgorICAgIF9fbWluX2VsZW1lbnRfc3dpdGNoKF9GSXRlciwgX0ZJdGVyLCBfQ29tcGFyZSwgX0l0ZXJUYWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXIKKyAgICBfX21pbl9lbGVtZW50X3N3aXRjaCgKKyAgICAgIF9SQUl0ZXIsIF9SQUl0ZXIsIF9Db21wYXJlLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbQorICAgICAgPSBfX2dudV9wYXJhbGxlbDo6cGFyYWxsZWxfYmFsYW5jZWQpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgdm9pZAorICAgIG50aF9lbGVtZW50KF9SQUl0ZXIsIF9SQUl0ZXIsIF9SQUl0ZXIsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIG50aF9lbGVtZW50KF9SQUl0ZXIsIF9SQUl0ZXIsIF9SQUl0ZXIsIF9Db21wYXJlLAorICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIG50aF9lbGVtZW50KF9SQUl0ZXIsIF9SQUl0ZXIsIF9SQUl0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIHZvaWQKKyAgICBudGhfZWxlbWVudChfUkFJdGVyLCBfUkFJdGVyLCBfUkFJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgcGFydGlhbF9zb3J0KF9SQUl0ZXIsIF9SQUl0ZXIsIF9SQUl0ZXIsIF9Db21wYXJlLAorICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgdm9pZAorICAgIHBhcnRpYWxfc29ydChfUkFJdGVyLCBfUkFJdGVyLCBfUkFJdGVyLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBwYXJ0aWFsX3NvcnQoX1JBSXRlciwgX1JBSXRlciwgX1JBSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgdm9pZAorICAgIHBhcnRpYWxfc29ydChfUkFJdGVyLCBfUkFJdGVyLCBfUkFJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX0ZJdGVyCisgICAgcGFydGl0aW9uKF9GSXRlciwgX0ZJdGVyLCBfUHJlZGljYXRlLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworICAgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX0ZJdGVyCisgICAgcGFydGl0aW9uKF9GSXRlciwgX0ZJdGVyLCBfUHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGUsIHR5cGVuYW1lIF9JdGVyVGFnPgorICAgIF9GSXRlcgorICAgIF9fcGFydGl0aW9uX3N3aXRjaChfRkl0ZXIsIF9GSXRlciwgX1ByZWRpY2F0ZSwgX0l0ZXJUYWcpOworICAgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9SQUl0ZXIKKyAgICBfX3BhcnRpdGlvbl9zd2l0Y2goCisgICAgICBfUkFJdGVyLCBfUkFJdGVyLCBfUHJlZGljYXRlLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICB2b2lkCisgICAgcmFuZG9tX3NodWZmbGUoX1JBSXRlciwgX1JBSXRlciwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgIHZvaWQKKyAgICByYW5kb21fc2h1ZmZsZShfUkFJdGVyLCBfUkFJdGVyLCBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiwKKyAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgdm9pZAorICAgIHJhbmRvbV9zaHVmZmxlKF9SQUl0ZXIsIF9SQUl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgdm9pZAorICAgIHJhbmRvbV9zaHVmZmxlKF9SQUl0ZXIsIF9SQUl0ZXIsCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCQkgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiYpOworI2Vsc2UKKwkJICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYpOworI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlcgorICAgIHNldF91bmlvbihfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIsCisgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfT0l0ZXIKKyAgICBzZXRfdW5pb24oX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyLCBfUHJlZGljYXRlLAorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIKKyAgICBzZXRfdW5pb24oX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX09JdGVyIAorICAgIHNldF91bmlvbihfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIsIF9QcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9QcmVkaWNhdGUsCisgICAgICAgICAgIHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX0l0ZXJUYWcxLCB0eXBlbmFtZSBfSXRlclRhZzIsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyVGFnMz4KKyAgICBfT0l0ZXIKKyAgICBfX3NldF91bmlvbl9zd2l0Y2goX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyLAorICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSwgX0l0ZXJUYWcxLCBfSXRlclRhZzIsIF9JdGVyVGFnMyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLCB0eXBlbmFtZSBfT3V0cHV0X1JBSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfT3V0cHV0X1JBSXRlcgorICAgIF9fc2V0X3VuaW9uX3N3aXRjaChfUkFJdGVyMSwgX1JBSXRlcjEsIF9SQUl0ZXIyLCBfUkFJdGVyMiwgX091dHB1dF9SQUl0ZXIsCisgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlcgorICAgIHNldF9pbnRlcnNlY3Rpb24oX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyLAorICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX09JdGVyCisgICAgc2V0X2ludGVyc2VjdGlvbihfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIsIF9QcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIKKyAgICBzZXRfaW50ZXJzZWN0aW9uKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9PSXRlciAKKyAgICBzZXRfaW50ZXJzZWN0aW9uKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlciwgX1ByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfSXRlclRhZzEsIHR5cGVuYW1lIF9JdGVyVGFnMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJUYWczPgorICAgIF9PSXRlcgorICAgIF9fc2V0X2ludGVyc2VjdGlvbl9zd2l0Y2goX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUsIF9JdGVyVGFnMSwgX0l0ZXJUYWcyLCBfSXRlclRhZzMpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIxLCB0eXBlbmFtZSBfUkFJdGVyMiwgdHlwZW5hbWUgX091dHB1dF9SQUl0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX091dHB1dF9SQUl0ZXIKKyAgICBfX3NldF9pbnRlcnNlY3Rpb25fc3dpdGNoKF9SQUl0ZXIxLCBfUkFJdGVyMSwgX1JBSXRlcjIsIF9SQUl0ZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRfUkFJdGVyLCBfUHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXI+CisgICAgX09JdGVyCisgICAgc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX09JdGVyCisgICAgc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXI+CisgICAgX09JdGVyIAorICAgIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfT0l0ZXIgCisgICAgc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfSXRlclRhZzEsIHR5cGVuYW1lIF9JdGVyVGFnMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJUYWczPgorICAgIF9PSXRlcgorICAgIF9fc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlX3N3aXRjaChfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX09JdGVyLCBfUHJlZGljYXRlLCBfSXRlclRhZzEsIF9JdGVyVGFnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JdGVyVGFnMyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLCB0eXBlbmFtZSBfT3V0cHV0X1JBSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfT3V0cHV0X1JBSXRlcgorICAgIF9fc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlX3N3aXRjaChfUkFJdGVyMSwgX1JBSXRlcjEsIF9SQUl0ZXIyLCBfUkFJdGVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRfUkFJdGVyLCBfUHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKTsKKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIKKyAgICBzZXRfZGlmZmVyZW5jZShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIsCisgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX09JdGVyCisgICAgc2V0X2RpZmZlcmVuY2UoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyLCBfUHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlcgorICAgIHNldF9kaWZmZXJlbmNlKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9PSXRlcgorICAgIHNldF9kaWZmZXJlbmNlKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlciwgX1ByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfSXRlclRhZzEsIHR5cGVuYW1lIF9JdGVyVGFnMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJUYWczPgorICAgIF9PSXRlcgorICAgIF9fc2V0X2RpZmZlcmVuY2Vfc3dpdGNoKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSwgX0l0ZXJUYWcxLCBfSXRlclRhZzIsIF9JdGVyVGFnMyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLCB0eXBlbmFtZSBfT3V0cHV0X1JBSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfT3V0cHV0X1JBSXRlcgorICAgIF9fc2V0X2RpZmZlcmVuY2Vfc3dpdGNoKF9SQUl0ZXIxLCBfUkFJdGVyMSwgX1JBSXRlcjIsIF9SQUl0ZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0X1JBSXRlciwgX1ByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyk7CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIHZvaWQKKyAgICBzb3J0KF9SQUl0ZXIsIF9SQUl0ZXIsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIHNvcnQoX1JBSXRlciwgX1JBSXRlciwgX0NvbXBhcmUsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICB2b2lkCisgICAgc29ydChfUkFJdGVyLCBfUkFJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgc29ydChfUkFJdGVyLCBfUkFJdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICB2b2lkCisgICAgc3RhYmxlX3NvcnQoX1JBSXRlciwgX1JBSXRlciwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgc3RhYmxlX3NvcnQoX1JBSXRlciwgX1JBSXRlciwgX0NvbXBhcmUsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICB2b2lkCisgICAgc3RhYmxlX3NvcnQoX1JBSXRlciwgX1JBSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIHN0YWJsZV9zb3J0KF9SQUl0ZXIsIF9SQUl0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIKKyAgICB1bmlxdWVfY29weShfSUl0ZXIsIF9JSXRlciwgX09JdGVyLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9PSXRlcgorICAgIHVuaXF1ZV9jb3B5KF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIsIF9QcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIKKyAgICB1bmlxdWVfY29weShfSUl0ZXIsIF9JSXRlciwgX09JdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfT0l0ZXIKKyAgICB1bmlxdWVfY29weShfSUl0ZXIsIF9JSXRlciwgX09JdGVyLCBfUHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0l0ZXJUYWcxLCB0eXBlbmFtZSBfSXRlclRhZzI+CisgICAgX09JdGVyCisgICAgX191bmlxdWVfY29weV9zd2l0Y2goX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgX1ByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgX0l0ZXJUYWcxLCBfSXRlclRhZzIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NfT0l0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX1JhbmRvbUFjY2Vzc19PSXRlcgorICAgIF9fdW5pcXVlX2NvcHlfc3dpdGNoKF9SQUl0ZXIsIF9SQUl0ZXIsIF9SYW5kb21BY2Nlc3NfT0l0ZXIsIF9QcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyk7Cit9IC8vIGVuZCBuYW1lc3BhY2UgX19wYXJhbGxlbAorfSAvLyBlbmQgbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfQUxHT1JJVEhNRldEX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvYmFsYW5jZWRfcXVpY2tzb3J0LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2JhbGFuY2VkX3F1aWNrc29ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNGE5YmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2JhbGFuY2VkX3F1aWNrc29ydC5oCkBAIC0wLDAgKzEsNDkyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvYmFsYW5jZWRfcXVpY2tzb3J0LmgKKyAqICBAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSBkeW5hbWljYWxseSBsb2FkLWJhbGFuY2VkIHBhcmFsbGVsIHF1aWNrc29ydC4KKyAqCisgKiAgSXQgd29ya3MgaW4tcGxhY2UgYW5kIG5lZWRzIG9ubHkgbG9nYXJpdGhtaWMgZXh0cmEgbWVtb3J5LgorICogIFRoZSBhbGdvcml0aG0gaXMgc2ltaWxhciB0byB0aGUgb25lIHByb3Bvc2VkIGluCisgKgorICogIFAuIFRzaWdhcyBhbmQgWS4gWmhhbmcuCisgKiAgQSBzaW1wbGUsIGZhc3QgcGFyYWxsZWwgaW1wbGVtZW50YXRpb24gb2YgcXVpY2tzb3J0IGFuZAorICogIGl0cyBwZXJmb3JtYW5jZSBldmFsdWF0aW9uIG9uIFNVTiBlbnRlcnByaXNlIDEwMDAwLgorICogIEluIDExdGggRXVyb21pY3JvIENvbmZlcmVuY2Ugb24gUGFyYWxsZWwsIERpc3RyaWJ1dGVkIGFuZAorICogIE5ldHdvcmstQmFzZWQgUHJvY2Vzc2luZywgcGFnZSAzNzIsIDIwMDMuCisgKgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgSm9oYW5uZXMgU2luZ2xlci4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9CQUxBTkNFRF9RVUlDS1NPUlRfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9CQUxBTkNFRF9RVUlDS1NPUlRfSCAxCisKKyNpbmNsdWRlIDxwYXJhbGxlbC9iYXNpY19pdGVyYXRvci5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ28uaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9mdW5jdGlvbi5oPgorCisjaW5jbHVkZSA8cGFyYWxsZWwvc2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9wYXJ0aXRpb24uaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9yYW5kb21fbnVtYmVyLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvcXVldWUuaD4KKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKyNpbmNsdWRlIDxwYXJhbGxlbC9jaGVja2Vycy5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAoreworICAvKiogQGJyaWVmIEluZm9ybWF0aW9uIGxvY2FsIHRvIG9uZSB0aHJlYWQgaW4gdGhlIHBhcmFsbGVsIHF1aWNrc29ydCBydW4uICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgc3RydWN0IF9RU0JUaHJlYWRMb2NhbAorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICAvKiogQGJyaWVmIENvbnRpbnVvdXMgcGFydCBvZiB0aGUgc2VxdWVuY2UsIGRlc2NyaWJlZCBieSBhbgorICAgICAgaXRlcmF0b3IgcGFpci4gKi8KKyAgICAgIHR5cGVkZWYgc3RkOjpwYWlyPF9SQUl0ZXIsIF9SQUl0ZXI+IF9QaWVjZTsKKworICAgICAgLyoqIEBicmllZiBJbml0aWFsIHBpZWNlIHRvIHdvcmsgb24uICovCisgICAgICBfUGllY2UgX01faW5pdGlhbDsKKworICAgICAgLyoqIEBicmllZiBXb3JrLXN0ZWFsaW5nIHF1ZXVlLiAqLworICAgICAgX1Jlc3RyaWN0ZWRCb3VuZGVkQ29uY3VycmVudFF1ZXVlPF9QaWVjZT4gX01fbGVmdG92ZXJfcGFydHM7CisKKyAgICAgIC8qKiBAYnJpZWYgTnVtYmVyIG9mIHRocmVhZHMgaW52b2x2ZWQgaW4gdGhpcyBhbGdvcml0aG0uICovCisgICAgICBfVGhyZWFkSW5kZXggX01fbnVtX3RocmVhZHM7CisKKyAgICAgIC8qKiBAYnJpZWYgUG9pbnRlciB0byBhIGNvdW50ZXIgb2YgZWxlbWVudHMgbGVmdCBvdmVyIHRvIHNvcnQuICovCisgICAgICB2b2xhdGlsZSBfRGlmZmVyZW5jZVR5cGUqIF9NX2VsZW1lbnRzX2xlZnRvdmVyOworCisgICAgICAvKiogQGJyaWVmIFRoZSBjb21wbGV0ZSBzZXF1ZW5jZSB0byBzb3J0LiAqLworICAgICAgX1BpZWNlIF9NX2dsb2JhbDsKKworICAgICAgLyoqIEBicmllZiBDb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gX19xdWV1ZV9zaXplIHNpemUgb2YgdGhlIHdvcmstc3RlYWxpbmcgcXVldWUuICovCisgICAgICBfUVNCVGhyZWFkTG9jYWwoaW50IF9fcXVldWVfc2l6ZSkgOiBfTV9sZWZ0b3Zlcl9wYXJ0cyhfX3F1ZXVlX3NpemUpIHsgfQorICAgIH07CisKKyAgLyoqIEBicmllZiBCYWxhbmNlZCBxdWlja3NvcnQgZGl2aWRlIHN0ZXAuCisgICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2Ygc3Vic2VxdWVuY2UuCisgICAgKiAgQHBhcmFtIF9fZW5kIEVuZCBpdGVyYXRvciBvZiBzdWJzZXF1ZW5jZS4KKyAgICAqICBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAgKiAgQHBhcmFtIF9fbnVtX3RocmVhZHMgTnVtYmVyIG9mIHRocmVhZHMgdGhhdCBhcmUgYWxsb3dlZCB0byB3b3JrIG9uCisgICAgKiAgdGhpcyBwYXJ0LgorICAgICogIEBwcmUgQGMgKF9fZW5kLV9fYmVnaW4pPj0xICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBfX3FzYl9kaXZpZGUoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorCQkgX0NvbXBhcmUgX19jb21wLCBfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcykKKyAgICB7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX19udW1fdGhyZWFkcyA+IDApOworCisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgX1JBSXRlciBfX3Bpdm90X3BvcyA9CisJX19tZWRpYW5fb2ZfdGhyZWVfaXRlcmF0b3JzKF9fYmVnaW4sIF9fYmVnaW4gKyAoX19lbmQgLSBfX2JlZ2luKSAvIDIsCisJCQkJICAgIF9fZW5kICAtIDEsIF9fY29tcCk7CisKKyNpZiBkZWZpbmVkKF9HTElCQ1hYX0FTU0VSVElPTlMpCisgICAgICAvLyBNdXN0IGJlIGluIGJldHdlZW4gc29tZXdoZXJlLgorICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbiA9IF9fZW5kIC0gX19iZWdpbjsKKworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKCghX19jb21wKCpfX3Bpdm90X3BvcywgKl9fYmVnaW4pCisJCQkJJiYgIV9fY29tcCgqKF9fYmVnaW4gKyBfX24gLyAyKSwKKwkJCQkJICAgKl9fcGl2b3RfcG9zKSkKKwkJCSAgICAgICB8fCAoIV9fY29tcCgqX19waXZvdF9wb3MsICpfX2JlZ2luKQorCQkJCSAgICYmICFfX2NvbXAoKihfX2VuZCAtIDEpLCAqX19waXZvdF9wb3MpKQorCQkJICAgICAgIHx8ICghX19jb21wKCpfX3Bpdm90X3BvcywgKihfX2JlZ2luICsgX19uIC8gMikpCisJCQkJICAgJiYgIV9fY29tcCgqX19iZWdpbiwgKl9fcGl2b3RfcG9zKSkKKwkJCSAgICAgICB8fCAoIV9fY29tcCgqX19waXZvdF9wb3MsICooX19iZWdpbiArIF9fbiAvIDIpKQorCQkJCSAgICYmICFfX2NvbXAoKihfX2VuZCAtIDEpLCAqX19waXZvdF9wb3MpKQorCQkJICAgICAgIHx8ICghX19jb21wKCpfX3Bpdm90X3BvcywgKihfX2VuZCAtIDEpKQorCQkJCSAgICYmICFfX2NvbXAoKl9fYmVnaW4sICpfX3Bpdm90X3BvcykpCisJCQkgICAgICAgfHwgKCFfX2NvbXAoKl9fcGl2b3RfcG9zLCAqKF9fZW5kIC0gMSkpCisJCQkJICAgJiYgIV9fY29tcCgqKF9fYmVnaW4gKyBfX24gLyAyKSwKKwkJCQkJICAgICAgKl9fcGl2b3RfcG9zKSkpOworI2VuZGlmCisKKyAgICAgIC8vIFN3YXAgcGl2b3QgdmFsdWUgdG8gZW5kLgorICAgICAgaWYgKF9fcGl2b3RfcG9zICE9IChfX2VuZCAtIDEpKQorCXN0ZDo6aXRlcl9zd2FwKF9fcGl2b3RfcG9zLCBfX2VuZCAtIDEpOworICAgICAgX19waXZvdF9wb3MgPSBfX2VuZCAtIDE7CisKKyAgICAgIF9fZ251X3BhcmFsbGVsOjpfX2JpbmRlcjJuZDxfQ29tcGFyZSwgX1ZhbHVlVHlwZSwgX1ZhbHVlVHlwZSwgYm9vbD4KKwlfX3ByZWQoX19jb21wLCAqX19waXZvdF9wb3MpOworCisgICAgICAvLyBEaXZpZGUsIHJldHVybmluZyBfX2VuZCAtIF9fYmVnaW4gLSAxIGluIHRoZSB3b3JzdCBjYXNlLgorICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fc3BsaXRfcG9zID0gX19wYXJhbGxlbF9wYXJ0aXRpb24oX19iZWdpbiwgX19lbmQgLSAxLAorCQkJCQkJCSBfX3ByZWQsCisJCQkJCQkJIF9fbnVtX3RocmVhZHMpOworCisgICAgICAvLyBTd2FwIGJhY2sgcGl2b3QgdG8gbWlkZGxlLgorICAgICAgc3RkOjppdGVyX3N3YXAoX19iZWdpbiArIF9fc3BsaXRfcG9zLCBfX3Bpdm90X3Bvcyk7CisgICAgICBfX3Bpdm90X3BvcyA9IF9fYmVnaW4gKyBfX3NwbGl0X3BvczsKKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKyAgICAgIF9SQUl0ZXIgX19yOworICAgICAgZm9yIChfX3IgPSBfX2JlZ2luOyBfX3IgIT0gX19waXZvdF9wb3M7ICsrX19yKQorCV9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfX2NvbXAoKl9fciwgKl9fcGl2b3RfcG9zKSk7CisgICAgICBmb3IgKDsgX19yICE9IF9fZW5kOyArK19fcikKKwlfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoIV9fY29tcCgqX19yLCAqX19waXZvdF9wb3MpKTsKKyNlbmRpZgorCisgICAgICByZXR1cm4gX19zcGxpdF9wb3M7CisgICAgfQorCisgIC8qKiBAYnJpZWYgUXVpY2tzb3J0IGNvbnF1ZXIgc3RlcC4KKyAgICAqICBAcGFyYW0gX190bHMgQXJyYXkgb2YgdGhyZWFkLWxvY2FsIHN0b3JhZ2VzLgorICAgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIHN1YnNlcXVlbmNlLgorICAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2Ygc3Vic2VxdWVuY2UuCisgICAgKiAgQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgICogIEBwYXJhbSBfX2lhbSBOdW1iZXIgb2YgdGhlIHRocmVhZCBwcm9jZXNzaW5nIHRoaXMgZnVuY3Rpb24uCisgICAgKiAgQHBhcmFtIF9fbnVtX3RocmVhZHMKKyAgICAqICAgICAgICAgIE51bWJlciBvZiB0aHJlYWRzIHRoYXQgYXJlIGFsbG93ZWQgdG8gd29yayBvbiB0aGlzIHBhcnQuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX3FzYl9jb25xdWVyKF9RU0JUaHJlYWRMb2NhbDxfUkFJdGVyPioqIF9fdGxzLAorCQkgIF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKwkJICBfQ29tcGFyZSBfX2NvbXAsCisJCSAgX1RocmVhZEluZGV4IF9faWFtLCBfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcywKKwkJICBib29sIF9fcGFyZW50X3dhaXQpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX24gPSBfX2VuZCAtIF9fYmVnaW47CisKKyAgICAgIGlmIChfX251bV90aHJlYWRzIDw9IDEgfHwgX19uIDw9IDEpCisJeworICAgICAgICAgIF9fdGxzW19faWFtXS0+X01faW5pdGlhbC5maXJzdCAgPSBfX2JlZ2luOworICAgICAgICAgIF9fdGxzW19faWFtXS0+X01faW5pdGlhbC5zZWNvbmQgPSBfX2VuZDsKKworICAgICAgICAgIF9fcXNiX2xvY2FsX3NvcnRfd2l0aF9oZWxwaW5nKF9fdGxzLCBfX2NvbXAsIF9faWFtLCBfX3BhcmVudF93YWl0KTsKKworICAgICAgICAgIHJldHVybjsKKwl9CisKKyAgICAgIC8vIERpdmlkZSBzdGVwLgorICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fc3BsaXRfcG9zID0KKwlfX3FzYl9kaXZpZGUoX19iZWdpbiwgX19lbmQsIF9fY29tcCwgX19udW1fdGhyZWFkcyk7CisKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoMCA8PSBfX3NwbGl0X3BvcyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fc3BsaXRfcG9zIDwgKF9fZW5kIC0gX19iZWdpbikpOworI2VuZGlmCisKKyAgICAgIF9UaHJlYWRJbmRleAorCV9fbnVtX3RocmVhZHNfbGVmdHNpZGUgPSBzdGQ6Om1heDxfVGhyZWFkSW5kZXg+CisJKDEsIHN0ZDo6bWluPF9UaHJlYWRJbmRleD4oX19udW1fdGhyZWFkcyAtIDEsIF9fc3BsaXRfcG9zCisJCQkJICAgKiBfX251bV90aHJlYWRzIC8gX19uKSk7CisKKyMgICAgIHByYWdtYSBvbXAgYXRvbWljCisgICAgICAqX190bHNbX19pYW1dLT5fTV9lbGVtZW50c19sZWZ0b3ZlciAtPSAoX0RpZmZlcmVuY2VUeXBlKTE7CisKKyAgICAgIC8vIENvbnF1ZXIgc3RlcC4KKyMgICAgIHByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoMikKKyAgICAgIHsKKwlib29sIF9fd2FpdDsKKwlpZihvbXBfZ2V0X251bV90aHJlYWRzKCkgPCAyKQorICAgICAgICAgIF9fd2FpdCA9IGZhbHNlOworCWVsc2UKKyAgICAgICAgICBfX3dhaXQgPSBfX3BhcmVudF93YWl0OworCisjICAgICAgIHByYWdtYSBvbXAgc2VjdGlvbnMKKwl7CisjICAgICAgICAgcHJhZ21hIG9tcCBzZWN0aW9uCisJICB7CisJICAgIF9fcXNiX2NvbnF1ZXIoX190bHMsIF9fYmVnaW4sIF9fYmVnaW4gKyBfX3NwbGl0X3BvcywgX19jb21wLAorCQkJICBfX2lhbSwgX19udW1fdGhyZWFkc19sZWZ0c2lkZSwgX193YWl0KTsKKwkgICAgX193YWl0ID0gX19wYXJlbnRfd2FpdDsKKwkgIH0KKwkgIC8vIFRoZSBwaXZvdF9wb3MgaXMgbGVmdCBpbiBwbGFjZSwgdG8gZW5zdXJlIHRlcm1pbmF0aW9uLgorIyAgICAgICAgIHByYWdtYSBvbXAgc2VjdGlvbgorCSAgeworCSAgICBfX3FzYl9jb25xdWVyKF9fdGxzLCBfX2JlZ2luICsgX19zcGxpdF9wb3MgKyAxLCBfX2VuZCwgX19jb21wLAorCQkJICBfX2lhbSArIF9fbnVtX3RocmVhZHNfbGVmdHNpZGUsCisJCQkgIF9fbnVtX3RocmVhZHMgLSBfX251bV90aHJlYWRzX2xlZnRzaWRlLCBfX3dhaXQpOworCSAgICBfX3dhaXQgPSBfX3BhcmVudF93YWl0OworCSAgfQorCX0KKyAgICAgIH0KKyAgICB9CisKKyAgLyoqCisgICAgKiAgQGJyaWVmIFF1aWNrc29ydCBzdGVwIGRvaW5nIGxvYWQtYmFsYW5jZWQgbG9jYWwgc29ydC4KKyAgICAqICBAcGFyYW0gX190bHMgQXJyYXkgb2YgdGhyZWFkLWxvY2FsIHN0b3JhZ2VzLgorICAgICogIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvci4KKyAgICAqICBAcGFyYW0gX19pYW0gTnVtYmVyIG9mIHRoZSB0aHJlYWQgcHJvY2Vzc2luZyB0aGlzIGZ1bmN0aW9uLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX3FzYl9sb2NhbF9zb3J0X3dpdGhfaGVscGluZyhfUVNCVGhyZWFkTG9jYWw8X1JBSXRlcj4qKiBfX3RscywKKwkJCQkgIF9Db21wYXJlJiBfX2NvbXAsIF9UaHJlYWRJbmRleCBfX2lhbSwKKwkJCQkgIGJvb2wgX193YWl0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8X1JBSXRlciwgX1JBSXRlcj4gX1BpZWNlOworCisgICAgICBfUVNCVGhyZWFkTG9jYWw8X1JBSXRlcj4mIF9fdGwgPSAqX190bHNbX19pYW1dOworCisgICAgICBfRGlmZmVyZW5jZVR5cGUKKwlfX2Jhc2VfY2FzZV9uID0gX1NldHRpbmdzOjpnZXQoKS5zb3J0X3FzYl9iYXNlX2Nhc2VfbWF4aW1hbF9uOworICAgICAgaWYgKF9fYmFzZV9jYXNlX24gPCAyKQorCV9fYmFzZV9jYXNlX24gPSAyOworICAgICAgX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMgPSBfX3RsLl9NX251bV90aHJlYWRzOworCisgICAgICAvLyBFdmVyeSB0aHJlYWQgaGFzIGl0cyBvd24gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAgICBfUmFuZG9tTnVtYmVyIF9fcm5nKF9faWFtICsgMSk7CisKKyAgICAgIF9QaWVjZSBfX2N1cnJlbnQgPSBfX3RsLl9NX2luaXRpYWw7CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2VsZW1lbnRzX2RvbmUgPSAwOworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX3RvdGFsX2VsZW1lbnRzX2RvbmUgPSAwOworI2VuZGlmCisKKyAgICAgIGZvciAoOzspCisJeworICAgICAgICAgIC8vIEludmFyaWFudDogX19jdXJyZW50IG11c3QgYmUgYSB2YWxpZCAobWF5YmUgZW1wdHkpIHJhbmdlLgorICAgICAgICAgIF9SQUl0ZXIgX19iZWdpbiA9IF9fY3VycmVudC5maXJzdCwgX19lbmQgPSBfX2N1cnJlbnQuc2Vjb25kOworICAgICAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX24gPSBfX2VuZCAtIF9fYmVnaW47CisKKyAgICAgICAgICBpZiAoX19uID4gX19iYXNlX2Nhc2VfbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gRGl2aWRlLgorICAgICAgICAgICAgICBfUkFJdGVyIF9fcGl2b3RfcG9zID0gX19iZWdpbiArICBfX3JuZyhfX24pOworCisgICAgICAgICAgICAgIC8vIFN3YXAgX19waXZvdF9wb3MgdmFsdWUgdG8gZW5kLgorICAgICAgICAgICAgICBpZiAoX19waXZvdF9wb3MgIT0gKF9fZW5kIC0gMSkpCisgICAgICAgIAlzdGQ6Oml0ZXJfc3dhcChfX3Bpdm90X3BvcywgX19lbmQgLSAxKTsKKyAgICAgICAgICAgICAgX19waXZvdF9wb3MgPSBfX2VuZCAtIDE7CisKKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9fYmluZGVyMm5kCisJCTxfQ29tcGFyZSwgX1ZhbHVlVHlwZSwgX1ZhbHVlVHlwZSwgYm9vbD4KKwkJX19wcmVkKF9fY29tcCwgKl9fcGl2b3RfcG9zKTsKKworICAgICAgICAgICAgICAvLyBEaXZpZGUsIGxlYXZlIHBpdm90IHVuY2hhbmdlZCBpbiBsYXN0IHBsYWNlLgorICAgICAgICAgICAgICBfUkFJdGVyIF9fc3BsaXRfcG9zMSwgX19zcGxpdF9wb3MyOworICAgICAgICAgICAgICBfX3NwbGl0X3BvczEgPSBfX2dudV9zZXF1ZW50aWFsOjpwYXJ0aXRpb24oX19iZWdpbiwgX19lbmQgLSAxLAorCQkJCQkJCSBfX3ByZWQpOworCisgICAgICAgICAgICAgIC8vIExlZnQgc2lkZTogPCBfX3Bpdm90X3BvczsgX19yaWdodCBzaWRlOiA+PSBfX3Bpdm90X3Bvcy4KKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisgICAgICAgICAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfX2JlZ2luIDw9IF9fc3BsaXRfcG9zMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgX19zcGxpdF9wb3MxIDwgX19lbmQpOworI2VuZGlmCisgICAgICAgICAgICAgIC8vIFN3YXAgcGl2b3QgYmFjayB0byBtaWRkbGUuCisgICAgICAgICAgICAgIGlmIChfX3NwbGl0X3BvczEgIT0gX19waXZvdF9wb3MpCisgICAgICAgIAlzdGQ6Oml0ZXJfc3dhcChfX3NwbGl0X3BvczEsIF9fcGl2b3RfcG9zKTsKKyAgICAgICAgICAgICAgX19waXZvdF9wb3MgPSBfX3NwbGl0X3BvczE7CisKKyAgICAgICAgICAgICAgLy8gSW4gY2FzZSBhbGwgZWxlbWVudHMgYXJlIGVxdWFsLCBfX3NwbGl0X3BvczEgPT0gMC4KKyAgICAgICAgICAgICAgaWYgKChfX3NwbGl0X3BvczEgKyAxIC0gX19iZWdpbikgPCAoX19uID4+IDcpCisJCSAgfHwgKF9fZW5kIC0gX19zcGxpdF9wb3MxKSA8IChfX24gPj4gNykpCisgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAvLyBWZXJ5IHVuZXF1YWwgc3BsaXQsIG9uZSBwYXJ0IHNtYWxsZXIgdGhhbiBvbmUgMTI4dGgKKyAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIG5vdCBzdHJpY3RseSBsYXJnZXIgdGhhbiB0aGUgcGl2b3QuCisgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X191bmFyeV9uZWdhdGU8X19nbnVfcGFyYWxsZWw6Ol9fYmluZGVyMXN0CisgICAgICAgICAgICAgICAgICAgIDxfQ29tcGFyZSwgX1ZhbHVlVHlwZSwgX1ZhbHVlVHlwZSwgYm9vbD4sIF9WYWx1ZVR5cGU+CisgICAgICAgICAgICAgICAgICAgIF9fcHJlZChfX2dudV9wYXJhbGxlbDo6X19iaW5kZXIxc3QKKyAgICAgICAgICAgICAgICAJIDxfQ29tcGFyZSwgX1ZhbHVlVHlwZSwgX1ZhbHVlVHlwZSwgYm9vbD4KKwkJCSAgIChfX2NvbXAsICpfX3Bpdm90X3BvcykpOworCisgICAgICAgICAgICAgICAgICAvLyBGaW5kIG90aGVyIGVuZCBvZiBwaXZvdC1lcXVhbCByYW5nZS4KKyAgICAgICAgICAgICAgICAgIF9fc3BsaXRfcG9zMiA9IF9fZ251X3NlcXVlbnRpYWw6OnBhcnRpdGlvbihfX3NwbGl0X3BvczEgKyAxLAorCQkJCQkJCSAgICAgX19lbmQsIF9fcHJlZCk7CisgICAgICAgIAl9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgCS8vIE9ubHkgc2tpcCB0aGUgcGl2b3QuCisgICAgICAgIAlfX3NwbGl0X3BvczIgPSBfX3NwbGl0X3BvczEgKyAxOworCisgICAgICAgICAgICAgIC8vIEVsZW1lbnRzIGVxdWFsIHRvIHBpdm90IGFyZSBkb25lLgorICAgICAgICAgICAgICBfX2VsZW1lbnRzX2RvbmUgKz0gKF9fc3BsaXRfcG9zMiAtIF9fc3BsaXRfcG9zMSk7CisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworICAgICAgICAgICAgICBfX3RvdGFsX2VsZW1lbnRzX2RvbmUgKz0gKF9fc3BsaXRfcG9zMiAtIF9fc3BsaXRfcG9zMSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgLy8gQWx3YXlzIHB1c2ggbGFyZ2VyIHBhcnQgb250byBzdGFjay4KKyAgICAgICAgICAgICAgaWYgKCgoX19zcGxpdF9wb3MxICsgMSkgLSBfX2JlZ2luKSA8IChfX2VuZCAtIChfX3NwbGl0X3BvczIpKSkKKyAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgIC8vIFJpZ2h0IHNpZGUgbGFyZ2VyLgorICAgICAgICAgICAgICAgICAgaWYgKChfX3NwbGl0X3BvczIpICE9IF9fZW5kKQorICAgICAgICAgICAgICAgICAgICBfX3RsLl9NX2xlZnRvdmVyX3BhcnRzLnB1c2hfZnJvbnQKKwkJICAgICAgKHN0ZDo6bWFrZV9wYWlyKF9fc3BsaXRfcG9zMiwgX19lbmQpKTsKKworICAgICAgICAgICAgICAgICAgLy9fX2N1cnJlbnQuZmlyc3QgPSBfX2JlZ2luOyAgICAvL2FscmVhZHkgc2V0IGFueXdheQorICAgICAgICAgICAgICAgICAgX19jdXJyZW50LnNlY29uZCA9IF9fc3BsaXRfcG9zMTsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAJfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAvLyBMZWZ0IHNpZGUgbGFyZ2VyLgorICAgICAgICAgICAgICAgICAgaWYgKF9fYmVnaW4gIT0gX19zcGxpdF9wb3MxKQorICAgICAgICAgICAgICAgICAgICBfX3RsLl9NX2xlZnRvdmVyX3BhcnRzLnB1c2hfZnJvbnQoc3RkOjptYWtlX3BhaXIKKwkJCQkJCSAgICAgIChfX2JlZ2luLCBfX3NwbGl0X3BvczEpKTsKKworICAgICAgICAgICAgICAgICAgX19jdXJyZW50LmZpcnN0ID0gX19zcGxpdF9wb3MyOworICAgICAgICAgICAgICAgICAgLy9fX2N1cnJlbnQuc2Vjb25kID0gX19lbmQ7ICAgICAvL2FscmVhZHkgc2V0IGFueXdheQorICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIAl9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX2dudV9zZXF1ZW50aWFsOjpzb3J0KF9fYmVnaW4sIF9fZW5kLCBfX2NvbXApOworICAgICAgICAgICAgICBfX2VsZW1lbnRzX2RvbmUgKz0gX19uOworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKyAgICAgICAgICAgICAgX190b3RhbF9lbGVtZW50c19kb25lICs9IF9fbjsKKyNlbmRpZgorCisgICAgICAgICAgICAgIC8vIFByZWZlciBvd24gc3RhY2ssIHNtYWxsIHBpZWNlcy4KKyAgICAgICAgICAgICAgaWYgKF9fdGwuX01fbGVmdG92ZXJfcGFydHMucG9wX2Zyb250KF9fY3VycmVudCkpCisgICAgICAgIAljb250aW51ZTsKKworIyAgICAgICAgICAgICBwcmFnbWEgb21wIGF0b21pYworICAgICAgICAgICAgICAqX190bC5fTV9lbGVtZW50c19sZWZ0b3ZlciAtPSBfX2VsZW1lbnRzX2RvbmU7CisKKyAgICAgICAgICAgICAgX19lbGVtZW50c19kb25lID0gMDsKKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKyAgICAgICAgICAgICAgZG91YmxlIF9fc2VhcmNoX3N0YXJ0ID0gb21wX2dldF93dGltZSgpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgLy8gTG9vayBmb3IgbmV3IHdvcmsuCisgICAgICAgICAgICAgIGJvb2wgX19zdWNjZXNzZnVsbHlfc3RvbGVuID0gZmFsc2U7CisgICAgICAgICAgICAgIHdoaWxlIChfX3dhaXQgJiYgKl9fdGwuX01fZWxlbWVudHNfbGVmdG92ZXIgPiAwCisgICAgICAgICAgICAgICAgICAgICAmJiAhX19zdWNjZXNzZnVsbHlfc3RvbGVuCisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworICAgICAgICAgICAgICAgICAgICAgIC8vIFBvc3NpYmxlIGRlYWQtbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICYmIChvbXBfZ2V0X3d0aW1lKCkgPCAoX19zZWFyY2hfc3RhcnQgKyAxLjApKQorI2VuZGlmCisJCSAgICAgKQorICAgICAgICAJeworICAgICAgICAgICAgICAgICAgX1RocmVhZEluZGV4IF9fdmljdGltOworICAgICAgICAgICAgICAgICAgX192aWN0aW0gPSBfX3JuZyhfX251bV90aHJlYWRzKTsKKworICAgICAgICAgICAgICAgICAgLy8gTGFyZ2UgcGllY2VzLgorICAgICAgICAgICAgICAgICAgX19zdWNjZXNzZnVsbHlfc3RvbGVuID0gKF9fdmljdGltICE9IF9faWFtKQorCQkgICAgJiYgX190bHNbX192aWN0aW1dLT5fTV9sZWZ0b3Zlcl9wYXJ0cy5wb3BfYmFjayhfX2N1cnJlbnQpOworICAgICAgICAgICAgICAgICAgaWYgKCFfX3N1Y2Nlc3NmdWxseV9zdG9sZW4pCisgICAgICAgICAgICAgICAgICAgIF9feWllbGQoKTsKKyNpZiAhZGVmaW5lZChfX0lDQykgJiYgIWRlZmluZWQoX19FQ0MpCisjICAgICAgICAgICAgICAgICBwcmFnbWEgb21wIGZsdXNoCisjZW5kaWYKKyAgICAgICAgCX0KKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKyAgICAgICAgICAgICAgaWYgKG9tcF9nZXRfd3RpbWUoKSA+PSAoX19zZWFyY2hfc3RhcnQgKyAxLjApKQorICAgICAgICAJeworICAgICAgICAgICAgICAgICAgc2xlZXAoMSk7CisgICAgICAgICAgICAgICAgICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQob21wX2dldF93dGltZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCAoX19zZWFyY2hfc3RhcnQgKyAxLjApKTsKKyAgICAgICAgCX0KKyNlbmRpZgorICAgICAgICAgICAgICBpZiAoIV9fc3VjY2Vzc2Z1bGx5X3N0b2xlbikKKyAgICAgICAgCXsKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisgICAgICAgICAgICAgICAgICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoKl9fdGwuX01fZWxlbWVudHNfbGVmdG92ZXIgPT0gMCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCX0KKyAgICAgICAgICAgIH0KKwl9CisgICAgfQorCisgIC8qKiBAYnJpZWYgVG9wLWxldmVsIHF1aWNrc29ydCByb3V0aW5lLgorICAgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIHNlcXVlbmNlLgorICAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2Ygc2VxdWVuY2UuCisgICAgKiAgQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgICogIEBwYXJhbSBfX251bV90aHJlYWRzIE51bWJlciBvZiB0aHJlYWRzIHRoYXQgYXJlIGFsbG93ZWQgdG8gd29yayBvbgorICAgICogIHRoaXMgcGFydC4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgX19wYXJhbGxlbF9zb3J0X3FzYihfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisJCQlfQ29tcGFyZSBfX2NvbXAsIF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19lbmQgLSBfX2JlZ2luKQorCisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwYWlyPF9SQUl0ZXIsIF9SQUl0ZXI+IF9QaWVjZTsKKworICAgICAgdHlwZWRlZiBfUVNCVGhyZWFkTG9jYWw8X1JBSXRlcj4gX1RMU1R5cGU7CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX24gPSBfX2VuZCAtIF9fYmVnaW47CisKKyAgICAgIGlmIChfX24gPD0gMSkKKwlyZXR1cm47CisKKyAgICAgIC8vIEF0IGxlYXN0IG9uZSBlbGVtZW50IHBlciBwcm9jZXNzb3IuCisgICAgICBpZiAoX19udW1fdGhyZWFkcyA+IF9fbikKKwlfX251bV90aHJlYWRzID0gc3RhdGljX2Nhc3Q8X1RocmVhZEluZGV4PihfX24pOworCisgICAgICAvLyBJbml0aWFsaXplIHRocmVhZCBsb2NhbCBzdG9yYWdlCisgICAgICBfVExTVHlwZSoqIF9fdGxzID0gbmV3IF9UTFNUeXBlKltfX251bV90aHJlYWRzXTsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX3F1ZXVlX3NpemUgPSAoX19udW1fdGhyZWFkcworCQkJCSAgICAgICogKF9UaHJlYWRJbmRleCkoX19yZF9sb2cyKF9fbikgKyAxKSk7CisgICAgICBmb3IgKF9UaHJlYWRJbmRleCBfX3QgPSAwOyBfX3QgPCBfX251bV90aHJlYWRzOyArK19fdCkKKwlfX3Rsc1tfX3RdID0gbmV3IF9RU0JUaHJlYWRMb2NhbDxfUkFJdGVyPihfX3F1ZXVlX3NpemUpOworCisgICAgICAvLyBUaGVyZSBjYW4gbmV2ZXIgYmUgbW9yZSB0aGFuIGNlaWwoX19yZF9sb2cyKF9fbikpIHJhbmdlcyBvbiB0aGUKKyAgICAgIC8vIHN0YWNrLCBiZWNhdXNlCisgICAgICAvLyAxLiBPbmx5IG9uZSBwcm9jZXNzb3IgcHVzaGVzIG9udG8gdGhlIHN0YWNrCisgICAgICAvLyAyLiBUaGUgbGFyZ2VzdCByYW5nZSBoYXMgYXQgbW9zdCBsZW5ndGggX19uCisgICAgICAvLyAzLiBFYWNoIHJhbmdlIGlzIGxhcmdlciB0aGFuIGhhbGYgb2YgdGhlIHJhbmdlIHJlbWFpbmluZworICAgICAgdm9sYXRpbGUgX0RpZmZlcmVuY2VUeXBlIF9fZWxlbWVudHNfbGVmdG92ZXIgPSBfX247CisgICAgICBmb3IgKF9UaHJlYWRJbmRleCBfX2kgPSAwOyBfX2kgPCBfX251bV90aHJlYWRzOyArK19faSkKKwl7CisgICAgICAgICAgX190bHNbX19pXS0+X01fZWxlbWVudHNfbGVmdG92ZXIgPSAmX19lbGVtZW50c19sZWZ0b3ZlcjsKKyAgICAgICAgICBfX3Rsc1tfX2ldLT5fTV9udW1fdGhyZWFkcyA9IF9fbnVtX3RocmVhZHM7CisgICAgICAgICAgX190bHNbX19pXS0+X01fZ2xvYmFsID0gc3RkOjptYWtlX3BhaXIoX19iZWdpbiwgX19lbmQpOworCisgICAgICAgICAgLy8gSnVzdCBpbiBjYXNlIG5vdGhpbmcgaXMgbGVmdCB0byBhc3NpZ24uCisgICAgICAgICAgX190bHNbX19pXS0+X01faW5pdGlhbCA9IHN0ZDo6bWFrZV9wYWlyKF9fZW5kLCBfX2VuZCk7CisJfQorCisgICAgICAvLyBNYWluIHJlY3Vyc2lvbiBjYWxsLgorICAgICAgX19xc2JfY29ucXVlcihfX3RscywgX19iZWdpbiwgX19iZWdpbiArIF9fbiwgX19jb21wLCAwLAorCQkgICAgX19udW1fdGhyZWFkcywgdHJ1ZSk7CisKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisgICAgICAvLyBBbGwgc3RhY2sgbXVzdCBiZSBlbXB0eS4KKyAgICAgIF9QaWVjZSBfX2R1bW15OworICAgICAgZm9yIChfVGhyZWFkSW5kZXggX19pID0gMTsgX19pIDwgX19udW1fdGhyZWFkczsgKytfX2kpCisJX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKAorICAgICAgICAgICFfX3Rsc1tfX2ldLT5fTV9sZWZ0b3Zlcl9wYXJ0cy5wb3BfYmFjayhfX2R1bW15KSk7CisjZW5kaWYKKworICAgICAgZm9yIChfVGhyZWFkSW5kZXggX19pID0gMDsgX19pIDwgX19udW1fdGhyZWFkczsgKytfX2kpCisJZGVsZXRlIF9fdGxzW19faV07CisgICAgICBkZWxldGVbXSBfX3RsczsKKyAgICB9Cit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfQkFMQU5DRURfUVVJQ0tTT1JUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvYmFzZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThiMzMzNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvYmFzZS5oCkBAIC0wLDAgKzEsNDI2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvYmFzZS5oCisgKiAgQGJyaWVmIFNlcXVlbnRpYWwgaGVscGVyIGZ1bmN0aW9ucy4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IEpvaGFubmVzIFNpbmdsZXIuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfQkFTRV9ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX0JBU0VfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2Z1bmN0aW9uLmg+CisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9iYXNpY19pdGVyYXRvci5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3BhcmFsbGVsLmg+CisKKy8vIFBhcmFsbGVsIG1vZGUgbmFtZXNwYWNlcy4KKworLyoqCisgKiBAbmFtZXNwYWNlIHN0ZDo6X19wYXJhbGxlbAorICogQGJyaWVmIEdOVSBwYXJhbGxlbCBjb2RlLCByZXBsYWNlcyBzdGFuZGFyZCBiZWhhdmlvciB3aXRoIHBhcmFsbGVsIGJlaGF2aW9yLgorICovCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkgCit7IAorICBuYW1lc3BhY2UgX19wYXJhbGxlbCB7IH0gCit9CisKKy8qKgorICogQG5hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAorICogQGJyaWVmIEdOVSBwYXJhbGxlbCBjb2RlIGZvciBwdWJsaWMgdXNlLgorICovCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgLy8gSW1wb3J0IGFsbCB0aGUgcGFyYWxsZWwgdmVyc2lvbnMgb2YgY29tcG9uZW50cyBpbiBuYW1lc3BhY2Ugc3RkLgorICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpfX3BhcmFsbGVsOworfQorCisvKioKKyAqIEBuYW1lc3BhY2UgX19nbnVfc2VxdWVudGlhbAorICogQGJyaWVmIEdOVSBzZXF1ZW50aWFsIGNsYXNzZXMgZm9yIHB1YmxpYyB1c2UuCisgKi8KK25hbWVzcGFjZSBfX2dudV9zZXF1ZW50aWFsIAoreyAKKyAgLy8gSW1wb3J0IHdoYXRldmVyIGlzIHRoZSBzZXJpYWwgdmVyc2lvbi4KKyNpZmRlZiBfR0xJQkNYWF9QQVJBTExFTAorICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpfR0xJQkNYWF9TVERfQTsKKyNlbHNlCisgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisjZW5kaWYgICAKK30KKworCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgLy8gTkI6IEluY2x1ZGluZyB0aGlzIGZpbGUgY2Fubm90IHByb2R1Y2UgKHVucmVzb2x2ZWQpIHN5bWJvbHMgZnJvbQorICAvLyB0aGUgT3Blbk1QIHJ1bnRpbWUgdW5sZXNzIHRoZSBwYXJhbGxlbCBtb2RlIGlzIGFjdHVhbGx5IGludm9rZWQKKyAgLy8gYW5kIGFjdGl2ZSwgd2hpY2ggaW1wbGVzIHRoYXQgdGhlIE9wZW5NUCBydW50aW1lIGlzIGFjdHVhbGx5CisgIC8vIGdvaW5nIHRvIGJlIGxpbmtlZCBpbi4KKyAgaW5saW5lIF9UaHJlYWRJbmRleAorICBfX2dldF9tYXhfdGhyZWFkcygpIAorICB7IAorICAgIF9UaHJlYWRJbmRleCBfX2kgPSBvbXBfZ2V0X21heF90aHJlYWRzKCk7CisgICAgcmV0dXJuIF9faSA+IDEgPyBfX2kgOiAxOyAKKyAgfQorCisKKyAgaW5saW5lIGJvb2wgCisgIF9faXNfcGFyYWxsZWwoY29uc3QgX1BhcmFsbGVsaXNtIF9fcCkgeyByZXR1cm4gX19wICE9IHNlcXVlbnRpYWw7IH0KKworCisgIC8qKiBAYnJpZWYgQ2FsY3VsYXRlcyB0aGUgcm91bmRlZC1kb3duIGxvZ2FyaXRobSBvZiBAYyBfX24gZm9yIGJhc2UgMi4KKyAgICogIEBwYXJhbSBfX24gQXJndW1lbnQuCisgICAqICBAcmV0dXJuIFJldHVybnMgMCBmb3IgYW55IGFyZ3VtZW50IDwxLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpemU+CisgICAgaW5saW5lIF9TaXplCisgICAgX19yZF9sb2cyKF9TaXplIF9fbikKKyAgICB7CisgICAgICBfU2l6ZSBfX2s7CisgICAgICBmb3IgKF9fayA9IDA7IF9fbiA+IDE7IF9fbiA+Pj0gMSkKKyAgICAgICAgKytfX2s7CisgICAgICByZXR1cm4gX19rOworICAgIH0KKworICAvKiogQGJyaWVmIEVuY29kZSB0d28gaW50ZWdlcnMgaW50byBvbmUgZ251X3BhcmFsbGVsOjpfQ0FTYWJsZS4KKyAgICogIEBwYXJhbSBfX2EgRmlyc3QgaW50ZWdlciwgdG8gYmUgZW5jb2RlZCBpbiB0aGUgbW9zdC1zaWduaWZpY2FudCBAYworICAgKiAgX0NBU2FibGVfYml0cy8yIGJpdHMuCisgICAqICBAcGFyYW0gX19iIFNlY29uZCBpbnRlZ2VyLCB0byBiZSBlbmNvZGVkIGluIHRoZSBsZWFzdC1zaWduaWZpY2FudAorICAgKiAgQGMgX0NBU2FibGVfYml0cy8yIGJpdHMuCisgICAqICBAcmV0dXJuIHZhbHVlIGVuY29kaW5nIEBjIF9fYSBhbmQgQGMgX19iLgorICAgKiAgQHNlZSBfX2RlY29kZTIKKyAgICovCisgIGlubGluZSBfQ0FTYWJsZQorICBfX2VuY29kZTIoaW50IF9fYSwgaW50IF9fYikgICAgIC8vbXVzdCBhbGwgYmUgbm9uLW5lZ2F0aXZlLCBhY3R1YWxseQorICB7CisgICAgcmV0dXJuICgoKF9DQVNhYmxlKV9fYSkgPDwgKF9DQVNhYmxlX2JpdHMgLyAyKSkgfCAoKChfQ0FTYWJsZSlfX2IpIDw8IDApOworICB9CisKKyAgLyoqIEBicmllZiBEZWNvZGUgdHdvIGludGVnZXJzIGZyb20gb25lIGdudV9wYXJhbGxlbDo6X0NBU2FibGUuCisgICAqICBAcGFyYW0gX194IF9fZ251X3BhcmFsbGVsOjpfQ0FTYWJsZSB0byBkZWNvZGUgaW50ZWdlcnMgZnJvbS4KKyAgICogIEBwYXJhbSBfX2EgRmlyc3QgaW50ZWdlciwgdG8gYmUgZGVjb2RlZCBmcm9tIHRoZSBtb3N0LXNpZ25pZmljYW50CisgICAqICBAYyBfQ0FTYWJsZV9iaXRzLzIgYml0cyBvZiBAYyBfX3guCisgICAqICBAcGFyYW0gX19iIFNlY29uZCBpbnRlZ2VyLCB0byBiZSBlbmNvZGVkIGluIHRoZSBsZWFzdC1zaWduaWZpY2FudAorICAgKiAgQGMgX0NBU2FibGVfYml0cy8yIGJpdHMgb2YgQGMgX194LgorICAgKiAgQHNlZSBfX2VuY29kZTIKKyAgICovCisgIGlubGluZSB2b2lkCisgIF9fZGVjb2RlMihfQ0FTYWJsZSBfX3gsIGludCYgX19hLCBpbnQmIF9fYikKKyAgeworICAgIF9fYSA9IChpbnQpKChfX3ggPj4gKF9DQVNhYmxlX2JpdHMgLyAyKSkgJiBfQ0FTYWJsZV9tYXNrKTsKKyAgICBfX2IgPSAoaW50KSgoX194ID4+ICAgICAgICAgICAgICAgMCApICYgX0NBU2FibGVfbWFzayk7CisgIH0KKworICAvL25lZWRlZCBmb3IgcGFyYWxsZWwgIm51bWVyaWMiLCBldmVuIGlmICJhbGdvcml0aG0iIG5vdCBpbmNsdWRlZAorCisgIC8qKiBAYnJpZWYgRXF1aXZhbGVudCB0byBzdGQ6Om1pbi4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb25zdCBfVHAmCisgICAgbWluKGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYikKKyAgICB7IHJldHVybiAoX19hIDwgX19iKSA/IF9fYSA6IF9fYjsgfQorCisgIC8qKiBAYnJpZWYgRXF1aXZhbGVudCB0byBzdGQ6Om1heC4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb25zdCBfVHAmCisgICAgbWF4KGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYikKKyAgICB7IHJldHVybiAoX19hID4gX19iKSA/IF9fYSA6IF9fYjsgfQorCisgIC8qKiBAYnJpZWYgQ29uc3RydWN0cyBwcmVkaWNhdGUgZm9yIGVxdWFsaXR5IGZyb20gc3RyaWN0IHdlYWsKKyAgICogIG9yZGVyaW5nIHByZWRpY2F0ZQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGNsYXNzIF9FcXVhbEZyb21MZXNzIDogcHVibGljIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPF9UMSwgX1QyLCBib29sPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgX0NvbXBhcmUmIF9NX2NvbXA7CisKKyAgICBwdWJsaWM6CisgICAgICBfRXF1YWxGcm9tTGVzcyhfQ29tcGFyZSYgX19jb21wKSA6IF9NX2NvbXAoX19jb21wKSB7IH0KKworICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UMSYgX19hLCBjb25zdCBfVDImIF9fYikKKyAgICAgIHsgcmV0dXJuICFfTV9jb21wKF9fYSwgX19iKSAmJiAhX01fY29tcChfX2IsIF9fYSk7IH0KKyAgICB9OworCisKKyAgLyoqIEBicmllZiBTaW1pbGFyIHRvIHN0ZDo6dW5hcnlfbmVnYXRlLAorICAgKiAgYnV0IGdpdmluZyB0aGUgYXJndW1lbnQgdHlwZXMgZXhwbGljaXRseS4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgYXJndW1lbnRfdHlwZT4KKyAgICBjbGFzcyBfX3VuYXJ5X25lZ2F0ZQorICAgIDogcHVibGljIHN0ZDo6dW5hcnlfZnVuY3Rpb248YXJndW1lbnRfdHlwZSwgYm9vbD4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX1ByZWRpY2F0ZSBfTV9wcmVkOworCisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIF9fdW5hcnlfbmVnYXRlKGNvbnN0IF9QcmVkaWNhdGUmIF9feCkgOiBfTV9wcmVkKF9feCkgeyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgYXJndW1lbnRfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gIV9NX3ByZWQoX194KTsgfQorICAgIH07CisKKyAgLyoqIEBicmllZiBTaW1pbGFyIHRvIHN0ZDo6YmluZGVyMXN0LAorICAgKiAgYnV0IGdpdmluZyB0aGUgYXJndW1lbnQgdHlwZXMgZXhwbGljaXRseS4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX09wZXJhdGlvbiwgdHlwZW5hbWUgX0ZpcnN0QXJndW1lbnRUeXBlLAorCSAgIHR5cGVuYW1lIF9TZWNvbmRBcmd1bWVudFR5cGUsIHR5cGVuYW1lIF9SZXN1bHRUeXBlPgorICAgIGNsYXNzIF9fYmluZGVyMXN0CisgICAgOiBwdWJsaWMgc3RkOjp1bmFyeV9mdW5jdGlvbjxfU2Vjb25kQXJndW1lbnRUeXBlLCBfUmVzdWx0VHlwZT4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX09wZXJhdGlvbiBfTV9vcDsKKyAgICAgIF9GaXJzdEFyZ3VtZW50VHlwZSBfTV92YWx1ZTsKKworICAgIHB1YmxpYzoKKyAgICAgIF9fYmluZGVyMXN0KGNvbnN0IF9PcGVyYXRpb24mIF9feCwgY29uc3QgX0ZpcnN0QXJndW1lbnRUeXBlJiBfX3kpCisgICAgICA6IF9NX29wKF9feCksIF9NX3ZhbHVlKF9feSkgeyB9CisKKyAgICAgIF9SZXN1bHRUeXBlCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9TZWNvbmRBcmd1bWVudFR5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX29wKF9NX3ZhbHVlLCBfX3gpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDEwOS4gIE1pc3NpbmcgYmluZGVycyBmb3Igbm9uLWNvbnN0IHNlcXVlbmNlIGVsZW1lbnRzCisgICAgICBfUmVzdWx0VHlwZQorICAgICAgb3BlcmF0b3IoKShfU2Vjb25kQXJndW1lbnRUeXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9vcChfTV92YWx1ZSwgX194KTsgfQorICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgU2ltaWxhciB0byBzdGQ6OmJpbmRlcjJuZCwgYnV0IGdpdmluZyB0aGUgYXJndW1lbnQgdHlwZXMKKyAgICogIGV4cGxpY2l0bHkuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3BlcmF0aW9uLCB0eXBlbmFtZSBfRmlyc3RBcmd1bWVudFR5cGUsCisJICAgdHlwZW5hbWUgX1NlY29uZEFyZ3VtZW50VHlwZSwgdHlwZW5hbWUgX1Jlc3VsdFR5cGU+CisgICAgY2xhc3MgX19iaW5kZXIybmQKKyAgICA6IHB1YmxpYyBzdGQ6OnVuYXJ5X2Z1bmN0aW9uPF9GaXJzdEFyZ3VtZW50VHlwZSwgX1Jlc3VsdFR5cGU+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIF9PcGVyYXRpb24gX01fb3A7CisgICAgICBfU2Vjb25kQXJndW1lbnRUeXBlIF9NX3ZhbHVlOworCisgICAgcHVibGljOgorICAgICAgX19iaW5kZXIybmQoY29uc3QgX09wZXJhdGlvbiYgX194LCBjb25zdCBfU2Vjb25kQXJndW1lbnRUeXBlJiBfX3kpCisgICAgICA6IF9NX29wKF9feCksIF9NX3ZhbHVlKF9feSkgeyB9CisKKyAgICAgIF9SZXN1bHRUeXBlCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9GaXJzdEFyZ3VtZW50VHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fb3AoX194LCBfTV92YWx1ZSk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTA5LiAgTWlzc2luZyBiaW5kZXJzIGZvciBub24tY29uc3Qgc2VxdWVuY2UgZWxlbWVudHMKKyAgICAgIF9SZXN1bHRUeXBlCisgICAgICBvcGVyYXRvcigpKF9GaXJzdEFyZ3VtZW50VHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fb3AoX194LCBfTV92YWx1ZSk7IH0KKyAgICB9OworCisgIC8qKiBAYnJpZWYgU2ltaWxhciB0byBzdGQ6OmVxdWFsX3RvLCBidXQgYWxsb3dzIHR3byBkaWZmZXJlbnQgdHlwZXMuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICAgIHN0cnVjdCBfRXF1YWxUbyA6IHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPF9UMSwgX1QyLCBib29sPgorICAgIHsKKyAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVDEmIF9fdDEsIGNvbnN0IF9UMiYgX190MikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fdDEgPT0gX190MjsgfQorICAgIH07CisKKyAgLyoqIEBicmllZiBTaW1pbGFyIHRvIHN0ZDo6bGVzcywgYnV0IGFsbG93cyB0d28gZGlmZmVyZW50IHR5cGVzLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX0xlc3MgOiBzdGQ6OmJpbmFyeV9mdW5jdGlvbjxfVDEsIF9UMiwgYm9vbD4KKyAgICB7CisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UMSYgX190MSwgY29uc3QgX1QyJiBfX3QyKSBjb25zdAorICAgICAgeyByZXR1cm4gX190MSA8IF9fdDI7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVDImIF9fdDIsIGNvbnN0IF9UMSYgX190MSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fdDIgPCBfX3QxOyB9CisgICAgfTsKKworICAvLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciBvbmUgdHlwZS4gU2FtZSBhcyBzdGQ6Omxlc3MuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0xlc3M8X1RwLCBfVHA+CisgICAgOiBwdWJsaWMgc3RkOjpsZXNzPF9UcD4geyB9OworCisgIC8qKiBAYnJpZWYgU2ltaWxhciB0byBzdGQ6OnBsdXMsIGJ1dCBhbGxvd3MgdHdvIGRpZmZlcmVudCB0eXBlcy4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMiwgdHlwZW5hbWUgX1Jlc3VsdAorCSAgID0gX190eXBlb2ZfXygqc3RhdGljX2Nhc3Q8X1RwMSo+KDApCisJCQkrICpzdGF0aWNfY2FzdDxfVHAyKj4oMCkpPgorICAgIHN0cnVjdCBfUGx1cyA6IHB1YmxpYyBzdGQ6OmJpbmFyeV9mdW5jdGlvbjxfVHAxLCBfVHAyLCBfUmVzdWx0PgorICAgIHsKKyAgICAgIF9SZXN1bHQKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwMSYgX194LCBjb25zdCBfVHAyJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggKyBfX3k7IH0KKyAgICB9OworCisgIC8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yIG9uZSB0eXBlLiBTYW1lIGFzIHN0ZDo6cGx1cy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfUGx1czxfVHAsIF9UcCwgX1RwPgorICAgIDogcHVibGljIHN0ZDo6cGx1czxfVHA+IHsgfTsKKworICAvKiogQGJyaWVmIFNpbWlsYXIgdG8gc3RkOjptdWx0aXBsaWVzLCBidXQgYWxsb3dzIHR3byBkaWZmZXJlbnQgdHlwZXMuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDIsIHR5cGVuYW1lIF9SZXN1bHQKKwkgICA9IF9fdHlwZW9mX18oKnN0YXRpY19jYXN0PF9UcDEqPigwKQorCQkJKiAqc3RhdGljX2Nhc3Q8X1RwMio+KDApKT4KKyAgICBzdHJ1Y3QgX011bHRpcGxpZXMgOiBwdWJsaWMgc3RkOjpiaW5hcnlfZnVuY3Rpb248X1RwMSwgX1RwMiwgX1Jlc3VsdD4KKyAgICB7CisgICAgICBfUmVzdWx0CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcDEmIF9feCwgY29uc3QgX1RwMiYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194ICogX195OyB9CisgICAgfTsKKworICAvLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciBvbmUgdHlwZS4gU2FtZSBhcyBzdGQ6Om11bHRpcGxpZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX011bHRpcGxpZXM8X1RwLCBfVHAsIF9UcD4KKyAgICA6IHB1YmxpYyBzdGQ6Om11bHRpcGxpZXM8X1RwPiB7IH07CisKKyAgLyoqIEBicmllZiBfSXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIF9fZ251X3BhcmFsbGVsOjpfUHNldWRvU2VxdWVuY2UuCisgICAqICBJZiBmZWF0dXJlcyB0aGUgdXN1YWwgcmFuZG9tLWFjY2VzcyBpdGVyYXRvciBmdW5jdGlvbmFsaXR5LgorICAgKiAgQHBhcmFtIF9UcCBTZXF1ZW5jZSBfTV92YWx1ZSB0eXBlLgorICAgKiAgQHBhcmFtIF9EaWZmZXJlbmNlVHAgU2VxdWVuY2UgZGlmZmVyZW5jZSB0eXBlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwPgorICAgIGNsYXNzIF9Qc2V1ZG9TZXF1ZW5jZUl0ZXJhdG9yCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0RpZmZlcmVuY2VUcCBfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIF9Qc2V1ZG9TZXF1ZW5jZUl0ZXJhdG9yKGNvbnN0IF9UcCYgX192YWwsIF9EaWZmZXJlbmNlVHlwZSBfX3BvcykKKyAgICAgIDogX01fdmFsKF9fdmFsKSwgX01fcG9zKF9fcG9zKSB7IH0KKworICAgICAgLy8gUHJlLWluY3JlbWVudCBvcGVyYXRvci4KKyAgICAgIF9Qc2V1ZG9TZXF1ZW5jZUl0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJKytfTV9wb3M7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLyBQb3N0LWluY3JlbWVudCBvcGVyYXRvci4KKyAgICAgIF9Qc2V1ZG9TZXF1ZW5jZUl0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgcmV0dXJuIF9Qc2V1ZG9TZXF1ZW5jZUl0ZXJhdG9yKF9NX3BvcysrKTsgfQorCisgICAgICBjb25zdCBfVHAmCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdmFsOyB9CisKKyAgICAgIGNvbnN0IF9UcCYKKyAgICAgIG9wZXJhdG9yW10oX0RpZmZlcmVuY2VUeXBlKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdmFsOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgX1BzZXVkb1NlcXVlbmNlSXRlcmF0b3ImIF9faTIpCisgICAgICB7IHJldHVybiBfTV9wb3MgPT0gX19pMi5fTV9wb3M7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBfUHNldWRvU2VxdWVuY2VJdGVyYXRvciYgX19pMikKKyAgICAgIHsgcmV0dXJuIF9NX3BvcyAhPSBfX2kyLl9NX3BvczsgfQorCisgICAgICBfRGlmZmVyZW5jZVR5cGUKKyAgICAgIG9wZXJhdG9yLShjb25zdCBfUHNldWRvU2VxdWVuY2VJdGVyYXRvciYgX19pMikKKyAgICAgIHsgcmV0dXJuIF9NX3BvcyAtIF9faTIuX01fcG9zOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgY29uc3QgX1RwJiBfTV92YWw7CisgICAgICBfRGlmZmVyZW5jZVR5cGUgX01fcG9zOworICAgIH07CisKKyAgLyoqIEBicmllZiBTZXF1ZW5jZSB0aGF0IGNvbmNlcHR1YWxseSBjb25zaXN0cyBvZiBtdWx0aXBsZSBjb3BpZXMgb2YKKyAgICAgIHRoZSBzYW1lIGVsZW1lbnQuCisgICAgICAqICBUaGUgY29waWVzIGFyZSBub3Qgc3RvcmVkIGV4cGxpY2l0bHksIG9mIGNvdXJzZS4KKyAgICAgICogIEBwYXJhbSBfVHAgU2VxdWVuY2UgX01fdmFsdWUgdHlwZS4KKyAgICAgICogIEBwYXJhbSBfRGlmZmVyZW5jZVRwIFNlcXVlbmNlIGRpZmZlcmVuY2UgdHlwZS4KKyAgICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcD4KKyAgICBjbGFzcyBfUHNldWRvU2VxdWVuY2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfRGlmZmVyZW5jZVRwIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgLy8gQmV0dGVyIGNhc3QgZG93biB0byB1aW50NjRfdCwgdGhhbiB1cCB0byBfRGlmZmVyZW5jZVRwLgorICAgICAgdHlwZWRlZiBfUHNldWRvU2VxdWVuY2VJdGVyYXRvcjxfVHAsIHVpbnQ2NF90PiBpdGVyYXRvcjsKKworICAgICAgLyoqIEBicmllZiBDb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gX192YWwgRWxlbWVudCBvZiB0aGUgc2VxdWVuY2UuCisgICAgICAgKiAgQHBhcmFtIF9fY291bnQgTnVtYmVyIG9mICh2aXJ0dWFsKSBjb3BpZXMuCisgICAgICAgKi8KKyAgICAgIF9Qc2V1ZG9TZXF1ZW5jZShjb25zdCBfVHAmIF9fdmFsLCBfRGlmZmVyZW5jZVR5cGUgX19jb3VudCkKKyAgICAgIDogX01fdmFsKF9fdmFsKSwgX01fY291bnQoX19jb3VudCkgIHsgfQorCisgICAgICAvKiogQGJyaWVmIEJlZ2luIGl0ZXJhdG9yLiAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX3ZhbCwgMCk7IH0KKworICAgICAgLyoqIEBicmllZiBFbmQgaXRlcmF0b3IuICovCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX3ZhbCwgX01fY291bnQpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgY29uc3QgX1RwJiBfTV92YWw7CisgICAgICBfRGlmZmVyZW5jZVR5cGUgX01fY291bnQ7CisgICAgfTsKKworICAvKiogQGJyaWVmIENvbXB1dGUgdGhlIG1lZGlhbiBvZiB0aHJlZSByZWZlcmVuY2VkIGVsZW1lbnRzLAorICAgICAgYWNjb3JkaW5nIHRvIEBjIF9fY29tcC4KKyAgICAgICogIEBwYXJhbSBfX2EgRmlyc3QgaXRlcmF0b3IuCisgICAgICAqICBAcGFyYW0gX19iIFNlY29uZCBpdGVyYXRvci4KKyAgICAgICogIEBwYXJhbSBfX2MgVGhpcmQgaXRlcmF0b3IuCisgICAgICAqICBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyCisgICAgX19tZWRpYW5fb2ZfdGhyZWVfaXRlcmF0b3JzKF9SQUl0ZXIgX19hLCBfUkFJdGVyIF9fYiwKKwkJCQlfUkFJdGVyIF9fYywgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIGlmIChfX2NvbXAoKl9fYSwgKl9fYikpCisJaWYgKF9fY29tcCgqX19iLCAqX19jKSkKKwkgIHJldHVybiBfX2I7CisJZWxzZQorCSAgaWYgKF9fY29tcCgqX19hLCAqX19jKSkKKwkgICAgcmV0dXJuIF9fYzsKKwkgIGVsc2UKKwkgICAgcmV0dXJuIF9fYTsKKyAgICAgIGVsc2UKKwl7CisJICAvLyBKdXN0IHN3YXAgX19hIGFuZCBfX2IuCisJICBpZiAoX19jb21wKCpfX2EsICpfX2MpKQorCSAgICByZXR1cm4gX19hOworCSAgZWxzZQorCSAgICBpZiAoX19jb21wKCpfX2IsICpfX2MpKQorCSAgICAgIHJldHVybiBfX2M7CisJICAgIGVsc2UKKwkgICAgICByZXR1cm4gX19iOworCX0KKyAgICB9CisKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9Db25kaXRpb24pIF9fZ2xpYmN4eF9hc3NlcnQoX0NvbmRpdGlvbikKKworfSAvL25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfQkFTRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2Jhc2ljX2l0ZXJhdG9yLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2Jhc2ljX2l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwYmZkOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvYmFzaWNfaXRlcmF0b3IuaApAQCAtMCwwICsxLDQxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvYmFzaWNfaXRlcmF0b3IuaAorICogIEBicmllZiBJbmNsdWRlcyB0aGUgb3JpZ2luYWwgaGVhZGVyIGZpbGVzIGNvbmNlcm5lZCB3aXRoIGl0ZXJhdG9ycworICogIGV4Y2VwdCBmb3Igc3RyZWFtIGl0ZXJhdG9ycy4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IEpvaGFubmVzIFNpbmdsZXIuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfQkFTSUNfSVRFUkFUT1JfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9CQVNJQ19JVEVSQVRPUl9IIDEKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3JfYmFzZV90eXBlcy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfZnVuY3MuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9pdGVyYXRvci5oPgorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfQkFTSUNfSVRFUkFUT1JfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9jaGVja2Vycy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9jaGVja2Vycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZmY2NjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2NoZWNrZXJzLmgKQEAgLTAsMCArMSw3MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL2NoZWNrZXJzLmgKKyAqICBAYnJpZWYgUm91dGluZXMgZm9yIGNoZWNraW5nIHRoZSBjb3JyZWN0bmVzcyBvZiBhbGdvcml0aG0gcmVzdWx0cy4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IEpvaGFubmVzIFNpbmdsZXIuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfQ0hFQ0tFUlNfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9DSEVDS0VSU19IIDEKKworI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2Z1bmN0aW9uLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAoreworICAvKioKKyAgICogQGJyaWVmIENoZWNrIHdoZXRoZXIgQGMgW19fYmVnaW4sIEBjIF9fZW5kKSBpcyBzb3J0ZWQgYWNjb3JkaW5nCisgICAqIHRvIEBjIF9fY29tcC4KKyAgICogQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2Ygc2VxdWVuY2UuCisgICAqIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2Ygc2VxdWVuY2UuCisgICAqIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvci4KKyAgICogQHJldHVybiBAYyB0cnVlIGlmIHNvcnRlZCwgQGMgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBib29sCisgICAgX19pc19zb3J0ZWQoX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIGlmIChfX2JlZ2luID09IF9fZW5kKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgX0lJdGVyIF9fY3VycmVudChfX2JlZ2luKSwgX19yZWNlbnQoX19iZWdpbik7CisKKyAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBfX3Bvc2l0aW9uID0gMTsKKyAgICAgIGZvciAoX19jdXJyZW50Kys7IF9fY3VycmVudCAhPSBfX2VuZDsgX19jdXJyZW50KyspCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX19jb21wKCpfX2N1cnJlbnQsICpfX3JlY2VudCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBfX3JlY2VudCA9IF9fY3VycmVudDsKKyAgICAgICAgICBfX3Bvc2l0aW9uKys7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfQ0hFQ0tFUlNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9jb21wYXRpYmlsaXR5LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2NvbXBhdGliaWxpdHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTc5NTliCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9jb21wYXRpYmlsaXR5LmgKQEAgLTAsMCArMSwxMzEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9jb21wYXRpYmlsaXR5LmgKKyAqICBAYnJpZWYgQ29tcGF0aWJpbGl0eSBsYXllciwgbW9zdGx5IGNvbmNlcm5lZCB3aXRoIGF0b21pYyBvcGVyYXRpb25zLgorICoKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeQorICogIGFuZCBjb250YWlucyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGZvciB0aGUgbGlicmFyeSdzIGludGVybmFsIHVzZS4KKyAqLworCisvLyBXcml0dGVuIGJ5IEZlbGl4IFB1dHplLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX0NPTVBBVElCSUxJVFlfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9DT01QQVRJQklMSVRZX0ggMQorCisjaW5jbHVkZSA8cGFyYWxsZWwvdHlwZXMuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9iYXNlLmg+CisKKyNpZiAhZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQgKF9fQ1lHV0lOX18pCisjaW5jbHVkZSA8c2NoZWQuaD4KKyNlbmRpZgorCisjaWZkZWYgX19NSU5HVzMyX18KKy8vIEluY2x1ZGluZyA8d2luZG93cy5oPiB3aWxsIGRyYWcgaW4gYWxsIHRoZSB3aW5kb3dzMzIgbmFtZXMuICBTaW5jZQorLy8gdGhhdCBjYW4gY2F1c2UgdXNlciBjb2RlIHBvcnRhYmlsaXR5IHByb2JsZW1zLCB3ZSBqdXN0IGRlY2xhcmUgdGhlCisvLyBvbmUgbmVlZGVkIGZ1bmN0aW9uIGhlcmUuCitleHRlcm4gIkMiCitfX2F0dHJpYnV0ZSgoZGxsaW1wb3J0KSkgdm9pZCBfX2F0dHJpYnV0ZV9fKChzdGRjYWxsKSkgU2xlZXAgKHVuc2lnbmVkIGxvbmcpOworI2VuZGlmCisKK25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAoreworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIF9fYWRkX29tcCh2b2xhdGlsZSBfVHAqIF9fcHRyLCBfVHAgX19hZGRlbmQpCisgICAgeworICAgICAgaW50NjRfdCBfX3JlczsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisJX19yZXMgPSAqX19wdHI7CisJKihfX3B0cikgKz0gX19hZGRlbmQ7CisgICAgICB9CisgICAgICByZXR1cm4gX19yZXM7CisgICAgfQorCisgIC8qKiBAYnJpZWYgQWRkIGEgdmFsdWUgdG8gYSB2YXJpYWJsZSwgYXRvbWljYWxseS4KKyAgICoKKyAgICogIEBwYXJhbSBfX3B0ciBQb2ludGVyIHRvIGEgc2lnbmVkIGludGVnZXIuCisgICAqICBAcGFyYW0gX19hZGRlbmQgVmFsdWUgdG8gYWRkLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBfX2ZldGNoX2FuZF9hZGQodm9sYXRpbGUgX1RwKiBfX3B0ciwgX1RwIF9fYWRkZW5kKQorICAgIHsKKyAgICAgIGlmIChfX2F0b21pY19hbHdheXNfbG9ja19mcmVlKHNpemVvZihfVHApLCBfX3B0cikpCisJcmV0dXJuIF9fYXRvbWljX2ZldGNoX2FkZChfX3B0ciwgX19hZGRlbmQsIF9fQVRPTUlDX0FDUV9SRUwpOworICAgICAgcmV0dXJuIF9fYWRkX29tcChfX3B0ciwgX19hZGRlbmQpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2Nhc19vbXAodm9sYXRpbGUgX1RwKiBfX3B0ciwgX1RwIF9fY29tcGFyYW5kLCBfVHAgX19yZXBsYWNlbWVudCkKKyAgICB7CisgICAgICBib29sIF9fcmVzID0gZmFsc2U7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworCWlmICgqX19wdHIgPT0gX19jb21wYXJhbmQpCisJICB7CisJICAgICpfX3B0ciA9IF9fcmVwbGFjZW1lbnQ7CisJICAgIF9fcmVzID0gdHJ1ZTsKKwkgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBfX3JlczsKKyAgICB9CisKKyAgLyoqIEBicmllZiBDb21wYXJlLWFuZC1zd2FwCisgICAqCisgICAqIENvbXBhcmUgQGMgKl9fcHRyIGFuZCBAYyBfX2NvbXBhcmFuZC4gSWYgZXF1YWwsIGxldCBAYworICAgKiAqX19wdHI9X19yZXBsYWNlbWVudCBhbmQgcmV0dXJuIEBjIHRydWUsIHJldHVybiBAYyBmYWxzZSBvdGhlcndpc2UuCisgICAqCisgICAqICBAcGFyYW0gX19wdHIgUG9pbnRlciB0byBzaWduZWQgaW50ZWdlci4KKyAgICogIEBwYXJhbSBfX2NvbXBhcmFuZCBDb21wYXJlIHZhbHVlLgorICAgKiAgQHBhcmFtIF9fcmVwbGFjZW1lbnQgUmVwbGFjZW1lbnQgdmFsdWUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NvbXBhcmVfYW5kX3N3YXAodm9sYXRpbGUgX1RwKiBfX3B0ciwgX1RwIF9fY29tcGFyYW5kLCBfVHAgX19yZXBsYWNlbWVudCkKKyAgICB7CisgICAgICBpZiAoX19hdG9taWNfYWx3YXlzX2xvY2tfZnJlZShzaXplb2YoX1RwKSwgX19wdHIpKQorCXJldHVybiBfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX24oX19wdHIsICZfX2NvbXBhcmFuZCwgX19yZXBsYWNlbWVudCwKKwkJCQkJICAgZmFsc2UsIF9fQVRPTUlDX0FDUV9SRUwsCisJCQkJCSAgIF9fQVRPTUlDX1JFTEFYRUQpOworICAgICAgcmV0dXJuIF9fY2FzX29tcChfX3B0ciwgX19jb21wYXJhbmQsIF9fcmVwbGFjZW1lbnQpOworICAgIH0KKworICAvKiogQGJyaWVmIFlpZWxkIGNvbnRyb2wgdG8gYW5vdGhlciB0aHJlYWQsIHdpdGhvdXQgd2FpdGluZyBmb3IKKyAgICogIHRoZSBlbmQgb2YgdGhlIHRpbWUgc2xpY2UuCisgICAqLworICBpbmxpbmUgdm9pZAorICBfX3lpZWxkKCkKKyAgeworI2lmIGRlZmluZWQgKF9XSU4zMikgJiYgIWRlZmluZWQgKF9fQ1lHV0lOX18pCisgICAgU2xlZXAoMCk7CisjZWxzZQorICAgIHNjaGVkX3lpZWxkKCk7CisjZW5kaWYKKyAgfQorfSAvLyBlbmQgbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9DT01QQVRJQklMSVRZX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvY29tcGlsZXRpbWVfc2V0dGluZ3MuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvY29tcGlsZXRpbWVfc2V0dGluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODgwNGQ0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9jb21waWxldGltZV9zZXR0aW5ncy5oCkBAIC0wLDAgKzEsNzUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9jb21waWxldGltZV9zZXR0aW5ncy5oCisgKiAgQGJyaWVmIERlZmluZXMgb24gb3B0aW9ucyBjb25jZXJuaW5nIGRlYnVnZ2luZyBhbmQgcGVyZm9ybWFuY2UsIGF0CisgKiAgY29tcGlsZS10aW1lLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgSm9oYW5uZXMgU2luZ2xlci4KKworI2luY2x1ZGUgPGNzdGRpbz4KKworLyoqIEBicmllZiBEZXRlcm1pbmUgdmVyYm9zaXR5IGxldmVsIG9mIHRoZSBwYXJhbGxlbCBtb2RlLgorICogIExldmVsIDEgcHJpbnRzIGEgbWVzc2FnZSBlYWNoIHRpbWUgYSBwYXJhbGxlbC1tb2RlIGZ1bmN0aW9uIGlzIGVudGVyZWQuICovCisjZGVmaW5lIF9HTElCQ1hYX1ZFUkJPU0VfTEVWRUwgMAorCisvKiogQGRlZiBfR0xJQkNYWF9DQUxMCisgKiAgQGJyaWVmIE1hY3JvIHRvIHByb2R1Y2UgbG9nIG1lc3NhZ2Ugd2hlbiBlbnRlcmluZyBhIGZ1bmN0aW9uLgorICogIEBwYXJhbSBfX24gSW5wdXQgc2l6ZS4KKyAqICBAc2VlIF9HTElCQ1hYX1ZFUkJPU0VfTEVWRUwgKi8KKyNpZiAoX0dMSUJDWFhfVkVSQk9TRV9MRVZFTCA9PSAwKQorI2RlZmluZSBfR0xJQkNYWF9DQUxMKF9fbikKKyNlbmRpZgorI2lmIChfR0xJQkNYWF9WRVJCT1NFX0xFVkVMID09IDEpCisjZGVmaW5lIF9HTElCQ1hYX0NBTEwoX19uKSBcCisgIHByaW50ZigiICAgJV9fczpcbmlhbSA9ICVkLCBfX24gPSAlbGQsIF9fbnVtX3RocmVhZHMgPSAlZFxuIiwgXAorICBfX1BSRVRUWV9GVU5DVElPTl9fLCBvbXBfZ2V0X3RocmVhZF9udW0oKSwgKF9fbiksIF9fZ2V0X21heF90aHJlYWRzKCkpOworI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfU0NBTEVfRE9XTl9GUFUKKy8qKiBAYnJpZWYgVXNlIGZsb2F0aW5nLXBvaW50IHNjYWxpbmcgaW5zdGVhZCBvZiBtb2R1bG8gZm9yIG1hcHBpbmcKKyAqICByYW5kb20gbnVtYmVycyB0byBhIHJhbmdlLiAgVGhpcyBjYW4gYmUgZmFzdGVyIG9uIGNlcnRhaW4gQ1BVcy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfU0NBTEVfRE9XTl9GUFUgMAorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfQVNTRVJUSU9OUworLyoqIEBicmllZiBTd2l0Y2ggb24gbWFueSBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlRpb25zIGluIHBhcmFsbGVsIGNvZGUuCisgKiAgU2hvdWxkIGJlIHN3aXRjaGVkIG9uIG9ubHkgbG9jYWxseS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfQVNTRVJUSU9OUyAwCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9SQU5ET01fU0hVRkZMRV9DT05TSURFUl9MMQorLyoqIEBicmllZiBTd2l0Y2ggb24gbWFueSBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlRpb25zIGluIHBhcmFsbGVsIGNvZGUuCisgKiAgQ29uc2lkZXIgdGhlIHNpemUgb2YgdGhlIEwxIGNhY2hlIGZvcgorKiAgZ251X3BhcmFsbGVsOjpfX3BhcmFsbGVsX3JhbmRvbV9zaHVmZmxlKCkuICovCisjZGVmaW5lIF9HTElCQ1hYX1JBTkRPTV9TSFVGRkxFX0NPTlNJREVSX0wxIDAKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9SQU5ET01fU0hVRkZMRV9DT05TSURFUl9UTEIKKy8qKiBAYnJpZWYgU3dpdGNoIG9uIG1hbnkgX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUaW9ucyBpbiBwYXJhbGxlbCBjb2RlLgorICogIENvbnNpZGVyIHRoZSBzaXplIG9mIHRoZSBUTEIgZm9yCisqICBnbnVfcGFyYWxsZWw6Ol9fcGFyYWxsZWxfcmFuZG9tX3NodWZmbGUoKS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfUkFORE9NX1NIVUZGTEVfQ09OU0lERVJfVExCIDAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9lcXVhbGx5X3NwbGl0LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2VxdWFsbHlfc3BsaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWU5MmFlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9lcXVhbGx5X3NwbGl0LmgKQEAgLTAsMCArMSw4OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL2VxdWFsbHlfc3BsaXQuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgSm9oYW5uZXMgU2luZ2xlci4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9FUVVBTExZX1NQTElUX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfRVFVQUxMWV9TUExJVF9IIDEKKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKiBAYnJpZWYgZnVuY3Rpb24gdG8gc3BsaXQgYSBzZXF1ZW5jZSBpbnRvIHBhcnRzIG9mIGFsbW9zdCBlcXVhbCBzaXplLgorICAgKgorICAgKiAgVGhlIHJlc3VsdGluZyBzZXF1ZW5jZSBfX3Mgb2YgbGVuZ3RoIF9fbnVtX3RocmVhZHMrMSBjb250YWlucyB0aGUKKyAgICogIHNwbGl0dGluZyBwb3NpdGlvbnMgd2hlbiBzcGxpdHRpbmcgdGhlIHJhbmdlIFswLF9fbikgaW50byBwYXJ0cyBvZgorICAgKiAgYWxtb3N0IGVxdWFsIHNpemUgKHBsdXMgbWludXMgMSkuICBUaGUgZmlyc3QgZW50cnkgaXMgMCwgdGhlIGxhc3QKKyAgICogIG9uZSBuLiBUaGVyZSBtYXkgcmVzdWx0IGVtcHR5IHBhcnRzLgorICAgKiAgQHBhcmFtIF9fbiBOdW1iZXIgb2YgZWxlbWVudHMKKyAgICogIEBwYXJhbSBfX251bV90aHJlYWRzIE51bWJlciBvZiBwYXJ0cworICAgKiAgQHBhcmFtIF9fcyBTcGxpdHRlcnMKKyAgICogIEByZXR1cm5zIEVuZCBvZiBfX3NwbGl0dGVyIHNlcXVlbmNlLCBpLmUuIEBjIF9fcytfX251bV90aHJlYWRzKzEgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0RpZmZlcmVuY2VUeXBlLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgX19lcXVhbGx5X3NwbGl0KF9EaWZmZXJlbmNlVHlwZSBfX24sIF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzLAorCQkgICAgX091dHB1dEl0ZXJhdG9yIF9fcykKKyAgICB7CisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19jaHVua19sZW5ndGggPSBfX24gLyBfX251bV90aHJlYWRzOworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbnVtX2xvbmdlcl9jaHVua3MgPSBfX24gJSBfX251bV90aHJlYWRzOworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fcG9zID0gMDsKKyAgICAgIGZvciAoX1RocmVhZEluZGV4IF9faSA9IDA7IF9faSA8IF9fbnVtX3RocmVhZHM7ICsrX19pKQorCXsKKwkgICpfX3MrKyA9IF9fcG9zOworCSAgX19wb3MgKz0gKChfX2kgPCBfX251bV9sb25nZXJfY2h1bmtzKQorCQkgICAgPyAoX19jaHVua19sZW5ndGggKyAxKSA6IF9fY2h1bmtfbGVuZ3RoKTsKKwl9CisgICAgICAqX19zKysgPSBfX247CisgICAgICByZXR1cm4gX19zOworICAgIH0KKworICAvKiogQGJyaWVmIGZ1bmN0aW9uIHRvIHNwbGl0IGEgc2VxdWVuY2UgaW50byBwYXJ0cyBvZiBhbG1vc3QgZXF1YWwgc2l6ZS4KKyAgICoKKyAgICogIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBzcGxpdHRpbmcgcG9pbnQgYmV0d2VlbgorICAgKiAgdGhyZWFkIG51bWJlciBfX3RocmVhZF9ubyAoaW5jbHVkZWQpIGFuZAorICAgKiAgdGhyZWFkIG51bWJlciBfX3RocmVhZF9ubysxIChleGNsdWRlZCkuCisgICAqICBAcGFyYW0gX19uIE51bWJlciBvZiBlbGVtZW50cworICAgKiAgQHBhcmFtIF9fbnVtX3RocmVhZHMgTnVtYmVyIG9mIHBhcnRzCisgICAqICBAcGFyYW0gX190aHJlYWRfbm8gTnVtYmVyIG9mIHRocmVhZHMKKyAgICogIEByZXR1cm5zIHNwbGl0dGluZyBwb2ludCAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRGlmZmVyZW5jZVR5cGU+CisgICAgX0RpZmZlcmVuY2VUeXBlCisgICAgX19lcXVhbGx5X3NwbGl0X3BvaW50KF9EaWZmZXJlbmNlVHlwZSBfX24sCisJCQkgIF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzLAorCQkJICBfVGhyZWFkSW5kZXggX190aHJlYWRfbm8pCisgICAgeworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fY2h1bmtfbGVuZ3RoID0gX19uIC8gX19udW1fdGhyZWFkczsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX251bV9sb25nZXJfY2h1bmtzID0gX19uICUgX19udW1fdGhyZWFkczsKKyAgICAgIGlmIChfX3RocmVhZF9ubyA8IF9fbnVtX2xvbmdlcl9jaHVua3MpCisJcmV0dXJuIF9fdGhyZWFkX25vICogKF9fY2h1bmtfbGVuZ3RoICsgMSk7CisgICAgICBlbHNlCisJcmV0dXJuIF9fbnVtX2xvbmdlcl9jaHVua3MgKiAoX19jaHVua19sZW5ndGggKyAxKQorICAgICAgICAgICsgKF9fdGhyZWFkX25vIC0gX19udW1fbG9uZ2VyX2NodW5rcykgKiBfX2NodW5rX2xlbmd0aDsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9FUVVBTExZX1NQTElUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvZmVhdHVyZXMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvZmVhdHVyZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzQxODJhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9mZWF0dXJlcy5oCkBAIC0wLDAgKzEsMTA0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvZmVhdHVyZXMuaAorICogIEBicmllZiBEZWZpbmVzIG9uIHdoZXRoZXIgdG8gaW5jbHVkZSBhbGdvcml0aG0gdmFyaWFudHMuCisgKgorICogIExlc3MgdmFyaWFudHMgcmVkdWNlIGV4ZWN1dGFibGUgc2l6ZSBhbmQgY29tcGlsZSB0aW1lLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgSm9oYW5uZXMgU2luZ2xlci4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9GRUFUVVJFU19ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX0ZFQVRVUkVTX0ggMQorCisjaWZuZGVmIF9HTElCQ1hYX01FUkdFU09SVAorLyoqIEBkZWYgX0dMSUJDWFhfTUVSR0VTT1JUCisgKiAgQGJyaWVmIEluY2x1ZGUgcGFyYWxsZWwgbXVsdGktd2F5IG1lcmdlc29ydC4KKyAqICBAc2VlIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OnNvcnRfYWxnb3JpdGhtICovCisjZGVmaW5lIF9HTElCQ1hYX01FUkdFU09SVCAxCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9RVUlDS1NPUlQKKy8qKiBAZGVmIF9HTElCQ1hYX1FVSUNLU09SVAorICogIEBicmllZiBJbmNsdWRlIHBhcmFsbGVsIHVuYmFsYW5jZWQgcXVpY2tzb3J0LgorICogIEBzZWUgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6c29ydF9hbGdvcml0aG0gKi8KKyNkZWZpbmUgX0dMSUJDWFhfUVVJQ0tTT1JUIDEKKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX0JBTF9RVUlDS1NPUlQKKy8qKiBAZGVmIF9HTElCQ1hYX0JBTF9RVUlDS1NPUlQKKyAqICBAYnJpZWYgSW5jbHVkZSBwYXJhbGxlbCBkeW5hbWljYWxseSBsb2FkLWJhbGFuY2VkIHF1aWNrc29ydC4KKyAqICBAc2VlIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OnNvcnRfYWxnb3JpdGhtICovCisjZGVmaW5lIF9HTElCQ1hYX0JBTF9RVUlDS1NPUlQgMQorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfRklORF9HUk9XSU5HX0JMT0NLUworLyoqIEBicmllZiBJbmNsdWRlIHRoZSBncm93aW5nIGJsb2NrcyB2YXJpYW50IGZvciBzdGQ6OmZpbmQuCisgKiAgQHNlZSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpmaW5kX2FsZ29yaXRobSAqLworI2RlZmluZSBfR0xJQkNYWF9GSU5EX0dST1dJTkdfQkxPQ0tTIDEKKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX0ZJTkRfQ09OU1RBTlRfU0laRV9CTE9DS1MKKy8qKiBAYnJpZWYgSW5jbHVkZSB0aGUgZXF1YWwtc2l6ZWQgYmxvY2tzIHZhcmlhbnQgZm9yIHN0ZDo6ZmluZC4KKyAqICBAc2VlIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmZpbmRfYWxnb3JpdGhtICovCisjZGVmaW5lIF9HTElCQ1hYX0ZJTkRfQ09OU1RBTlRfU0laRV9CTE9DS1MgMQorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfRklORF9FUVVBTF9TUExJVAorLyoqIEBkZWYgX0dMSUJDWFhfRklORF9FUVVBTF9TUExJVAorICogIEBicmllZiBJbmNsdWRlIHRoZSBlcXVhbCBzcGxpdHRpbmcgdmFyaWFudCBmb3Igc3RkOjpmaW5kLgorICogIEBzZWUgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6ZmluZF9hbGdvcml0aG0gKi8KKyNkZWZpbmUgX0dMSUJDWFhfRklORF9FUVVBTF9TUExJVCAxCisjZW5kaWYKKworCisjaWZuZGVmIF9HTElCQ1hYX1RSRUVfSU5JVElBTF9TUExJVFRJTkcKKy8qKiBAZGVmIF9HTElCQ1hYX1RSRUVfSU5JVElBTF9TUExJVFRJTkcKKyAqICBAYnJpZWYgSW5jbHVkZSB0aGUgaW5pdGlhbCBzcGxpdHRpbmcgdmFyaWFudCBmb3IKKyAqICBfUmJfdHJlZTo6aW5zZXJ0X3VuaXF1ZShfSUl0ZXIgYmVnLCBfSUl0ZXIgX19lbmQpLgorICogIEBzZWUgX19nbnVfcGFyYWxsZWw6Ol9SYl90cmVlICovCisjZGVmaW5lIF9HTElCQ1hYX1RSRUVfSU5JVElBTF9TUExJVFRJTkcgMQorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfVFJFRV9EWU5BTUlDX0JBTEFOQ0lORworLyoqIEBkZWYgX0dMSUJDWFhfVFJFRV9EWU5BTUlDX0JBTEFOQ0lORworICogIEBicmllZiBJbmNsdWRlIHRoZSBkeW5hbWljIGJhbGFuY2luZyB2YXJpYW50IGZvcgorICogIF9SYl90cmVlOjppbnNlcnRfdW5pcXVlKF9JSXRlciBiZWcsIF9JSXRlciBfX2VuZCkuCisgKiAgQHNlZSBfX2dudV9wYXJhbGxlbDo6X1JiX3RyZWUgKi8KKyNkZWZpbmUgX0dMSUJDWFhfVFJFRV9EWU5BTUlDX0JBTEFOQ0lORyAxCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9UUkVFX0ZVTExfQ09QWQorLyoqIEBkZWYgX0dMSUJDWFhfVFJFRV9GVUxMX0NPUFkKKyAqICBAYnJpZWYgSW4gb3JkZXIgdG8gc29ydCB0aGUgaW5wdXQgc2VxdWVuY2Ugb2YKKyAqICBfUmJfdHJlZTo6aW5zZXJ0X3VuaXF1ZShfSUl0ZXIgYmVnLCBfSUl0ZXIgX19lbmQpIGEKKyAqICBmdWxsIGNvcHkgb2YgdGhlIGlucHV0IGVsZW1lbnRzIGlzIGRvbmUuCisgKiAgQHNlZSBfX2dudV9wYXJhbGxlbDo6X1JiX3RyZWUgKi8KKyNkZWZpbmUgX0dMSUJDWFhfVFJFRV9GVUxMX0NPUFkgMQorI2VuZGlmCisKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX0ZFQVRVUkVTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvZmluZC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9maW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlMjhiMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvZmluZC5oCkBAIC0wLDAgKzEsNDA1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvZmluZC5oCisgKiAgQGJyaWVmIFBhcmFsbGVsIGltcGxlbWVudGF0aW9uIGJhc2UgZm9yIHN0ZDo6ZmluZCgpLCBzdGQ6OmVxdWFsKCkKKyAqICBhbmQgcmVsYXRlZCBmdW5jdGlvbnMuCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBGZWxpeCBQdXR6ZSBhbmQgSm9oYW5uZXMgU2luZ2xlci4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9GSU5EX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfRklORF9IIDEKKworI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+CisKKyNpbmNsdWRlIDxwYXJhbGxlbC9mZWF0dXJlcy5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3BhcmFsbGVsLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvY29tcGF0aWJpbGl0eS5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL2VxdWFsbHlfc3BsaXQuaD4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKgorICAgKiAgQGJyaWVmIFBhcmFsbGVsIHN0ZDo6ZmluZCwgc3dpdGNoIGZvciBkaWZmZXJlbnQgYWxnb3JpdGhtcy4KKyAgICogIEBwYXJhbSBfX2JlZ2luMSBCZWdpbiBpdGVyYXRvciBvZiBmaXJzdCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZDEgRW5kIGl0ZXJhdG9yIG9mIGZpcnN0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fYmVnaW4yIEJlZ2luIGl0ZXJhdG9yIG9mIHNlY29uZCBzZXF1ZW5jZS4gTXVzdCBoYXZlIHNhbWUKKyAgICogIGxlbmd0aCBhcyBmaXJzdCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX3ByZWQgRmluZCBwcmVkaWNhdGUuCisgICAqICBAcGFyYW0gX19zZWxlY3RvciBfRnVuY3Rpb25hbGl0eSAoZS4gZy4gc3RkOjpmaW5kX2lmKCksIHN0ZDo6ZXF1YWwoKSwuLi4pCisgICAqICBAcmV0dXJuIFBsYWNlIG9mIGZpbmRpbmcgaW4gYm90aCBzZXF1ZW5jZXMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwKKwkgICB0eXBlbmFtZSBfUkFJdGVyMiwKKwkgICB0eXBlbmFtZSBfUHJlZCwKKyAgICAgICAgICAgdHlwZW5hbWUgX1NlbGVjdG9yPgorICAgIGlubGluZSBzdGQ6OnBhaXI8X1JBSXRlcjEsIF9SQUl0ZXIyPgorICAgIF9fZmluZF90ZW1wbGF0ZShfUkFJdGVyMSBfX2JlZ2luMSwgX1JBSXRlcjEgX19lbmQxLAorCQkgICAgX1JBSXRlcjIgX19iZWdpbjIsIF9QcmVkIF9fcHJlZCwgX1NlbGVjdG9yIF9fc2VsZWN0b3IpCisgICAgeworICAgICAgc3dpdGNoIChfU2V0dGluZ3M6OmdldCgpLmZpbmRfYWxnb3JpdGhtKQorCXsKKwljYXNlIEdST1dJTkdfQkxPQ0tTOgorICAgICAgICAgIHJldHVybiBfX2ZpbmRfdGVtcGxhdGUoX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fcHJlZCwKKwkJCQkgX19zZWxlY3RvciwgZ3Jvd2luZ19ibG9ja3NfdGFnKCkpOworCWNhc2UgQ09OU1RBTlRfU0laRV9CTE9DS1M6CisgICAgICAgICAgcmV0dXJuIF9fZmluZF90ZW1wbGF0ZShfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19wcmVkLAorCQkJCSBfX3NlbGVjdG9yLCBjb25zdGFudF9zaXplX2Jsb2Nrc190YWcoKSk7CisJY2FzZSBFUVVBTF9TUExJVDoKKyAgICAgICAgICByZXR1cm4gX19maW5kX3RlbXBsYXRlKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLCBfX3ByZWQsCisJCQkJIF9fc2VsZWN0b3IsIGVxdWFsX3NwbGl0X3RhZygpKTsKKwlkZWZhdWx0OgorICAgICAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChmYWxzZSk7CisgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKF9fYmVnaW4xLCBfX2JlZ2luMik7CisJfQorICAgIH0KKworI2lmIF9HTElCQ1hYX0ZJTkRfRVFVQUxfU1BMSVQKKworICAvKioKKyAgICogIEBicmllZiBQYXJhbGxlbCBzdGQ6OmZpbmQsIGVxdWFsIHNwbGl0dGluZyB2YXJpYW50LgorICAgKiAgQHBhcmFtIF9fYmVnaW4xIEJlZ2luIGl0ZXJhdG9yIG9mIGZpcnN0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fZW5kMSBFbmQgaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19iZWdpbjIgQmVnaW4gaXRlcmF0b3Igb2Ygc2Vjb25kIHNlcXVlbmNlLiBTZWNvbmQgX19zZXF1ZW5jZQorICAgKiAgbXVzdCBoYXZlIHNhbWUgbGVuZ3RoIGFzIGZpcnN0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fcHJlZCBGaW5kIHByZWRpY2F0ZS4KKyAgICogIEBwYXJhbSBfX3NlbGVjdG9yIF9GdW5jdGlvbmFsaXR5IChlLiBnLiBzdGQ6OmZpbmRfaWYoKSwgc3RkOjplcXVhbCgpLC4uLikKKyAgICogIEByZXR1cm4gUGxhY2Ugb2YgZmluZGluZyBpbiBib3RoIHNlcXVlbmNlcy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIxLAorICAgICAgICAgICB0eXBlbmFtZSBfUkFJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX1ByZWQsCisgICAgICAgICAgIHR5cGVuYW1lIF9TZWxlY3Rvcj4KKyAgICBzdGQ6OnBhaXI8X1JBSXRlcjEsIF9SQUl0ZXIyPgorICAgIF9fZmluZF90ZW1wbGF0ZShfUkFJdGVyMSBfX2JlZ2luMSwgX1JBSXRlcjEgX19lbmQxLAorCQkgICAgX1JBSXRlcjIgX19iZWdpbjIsIF9QcmVkIF9fcHJlZCwKKwkJICAgIF9TZWxlY3RvciBfX3NlbGVjdG9yLCBlcXVhbF9zcGxpdF90YWcpCisgICAgeworICAgICAgX0dMSUJDWFhfQ0FMTChfX2VuZDEgLSBfX2JlZ2luMSkKKworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyMT4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19sZW5ndGggPSBfX2VuZDEgLSBfX2JlZ2luMTsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX3Jlc3VsdCA9IF9fbGVuZ3RoOworICAgICAgX0RpZmZlcmVuY2VUeXBlKiBfX2JvcmRlcnM7CisKKyAgICAgIG9tcF9sb2NrX3QgX19yZXN1bHRfbG9jazsKKyAgICAgIG9tcF9pbml0X2xvY2soJl9fcmVzdWx0X2xvY2spOworCisgICAgICBfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcyA9IF9fZ2V0X21heF90aHJlYWRzKCk7CisjICAgICBwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzKF9fbnVtX3RocmVhZHMpCisgICAgICB7CisjICAgICBwcmFnbWEgb21wIHNpbmdsZQorCXsKKwkgIF9fbnVtX3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCk7CisJICBfX2JvcmRlcnMgPSBuZXcgX0RpZmZlcmVuY2VUeXBlW19fbnVtX3RocmVhZHMgKyAxXTsKKwkgIF9fZXF1YWxseV9zcGxpdChfX2xlbmd0aCwgX19udW1fdGhyZWFkcywgX19ib3JkZXJzKTsKKwl9IC8vc2luZ2xlCisKKwlfVGhyZWFkSW5kZXggX19pYW0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKwlfRGlmZmVyZW5jZVR5cGUgX19zdGFydCA9IF9fYm9yZGVyc1tfX2lhbV0sCisJICAgICAgICAgICAgICAgICBfX3N0b3AgPSBfX2JvcmRlcnNbX19pYW0gKyAxXTsKKworCV9SQUl0ZXIxIF9faTEgPSBfX2JlZ2luMSArIF9fc3RhcnQ7CisJX1JBSXRlcjIgX19pMiA9IF9fYmVnaW4yICsgX19zdGFydDsKKwlmb3IgKF9EaWZmZXJlbmNlVHlwZSBfX3BvcyA9IF9fc3RhcnQ7IF9fcG9zIDwgX19zdG9wOyArK19fcG9zKQorCSAgeworIyAgICAgICAgICAgcHJhZ21hIG9tcCBmbHVzaChfX3Jlc3VsdCkKKwkgICAgLy8gUmVzdWx0IGhhcyBiZWVuIHNldCB0byBzb21ldGhpbmcgbG93ZXIuCisJICAgIGlmIChfX3Jlc3VsdCA8IF9fcG9zKQorCSAgICAgIGJyZWFrOworCisJICAgIGlmIChfX3NlbGVjdG9yKF9faTEsIF9faTIsIF9fcHJlZCkpCisJICAgICAgeworCQlvbXBfc2V0X2xvY2soJl9fcmVzdWx0X2xvY2spOworCQlpZiAoX19wb3MgPCBfX3Jlc3VsdCkKKwkJICBfX3Jlc3VsdCA9IF9fcG9zOworCQlvbXBfdW5zZXRfbG9jaygmX19yZXN1bHRfbG9jayk7CisJCWJyZWFrOworCSAgICAgIH0KKwkgICAgKytfX2kxOworCSAgICArK19faTI7CisJICB9CisgICAgICB9IC8vcGFyYWxsZWwKKworICAgICAgb21wX2Rlc3Ryb3lfbG9jaygmX19yZXN1bHRfbG9jayk7CisgICAgICBkZWxldGVbXSBfX2JvcmRlcnM7CisKKyAgICAgIHJldHVybiBzdGQ6OnBhaXI8X1JBSXRlcjEsIF9SQUl0ZXIyPihfX2JlZ2luMSArIF9fcmVzdWx0LAorCQkJCQkgICBfX2JlZ2luMiArIF9fcmVzdWx0KTsKKyAgICB9CisKKyNlbmRpZgorCisjaWYgX0dMSUJDWFhfRklORF9HUk9XSU5HX0JMT0NLUworCisgIC8qKgorICAgKiAgQGJyaWVmIFBhcmFsbGVsIHN0ZDo6ZmluZCwgZ3Jvd2luZyBibG9jayBzaXplIHZhcmlhbnQuCisgICAqICBAcGFyYW0gX19iZWdpbjEgQmVnaW4gaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19lbmQxIEVuZCBpdGVyYXRvciBvZiBmaXJzdCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2JlZ2luMiBCZWdpbiBpdGVyYXRvciBvZiBzZWNvbmQgc2VxdWVuY2UuIFNlY29uZCBfX3NlcXVlbmNlCisgICAqICBtdXN0IGhhdmUgc2FtZSBsZW5ndGggYXMgZmlyc3Qgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19wcmVkIEZpbmQgcHJlZGljYXRlLgorICAgKiAgQHBhcmFtIF9fc2VsZWN0b3IgX0Z1bmN0aW9uYWxpdHkgKGUuIGcuIHN0ZDo6ZmluZF9pZigpLCBzdGQ6OmVxdWFsKCksLi4uKQorICAgKiAgQHJldHVybiBQbGFjZSBvZiBmaW5kaW5nIGluIGJvdGggc2VxdWVuY2VzLgorICAgKiAgQHNlZSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpmaW5kX3NlcXVlbnRpYWxfc2VhcmNoX3NpemUKKyAgICogIEBzZWUgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6ZmluZF9zY2FsZV9mYWN0b3IKKyAgICoKKyAgICogIFRoZXJlIGFyZSB0d28gbWFpbiBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBncm93aW5nIGJsb2NrcyBhbmQKKyAgICogIHRoZSBjb25zdGFudC1zaXplIGJsb2NrcyB2YXJpYW50cy4KKyAgICogIDEuIEZvciBHQiwgdGhlIGJsb2NrIHNpemUgZ3Jvd3M7IGZvciBDU0IsIHRoZSBibG9jayBzaXplIGlzIGZpeGVkLgorICAgKiAgMi4gRm9yIEdCLCB0aGUgYmxvY2tzIGFyZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHk7CisgICAqICAgICBmb3IgQ1NCLCB0aGUgYmxvY2tzIGFyZSBhbGxvY2F0ZWQgaW4gYSBwcmVkZXRlcm1pbmVkIG1hbm5lciwKKyAgICogICAgIG5hbWVseSBzcGFjaWFsIHJvdW5kLXJvYmluLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsCisgICAgICAgICAgIHR5cGVuYW1lIF9SQUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfUHJlZCwKKyAgICAgICAgICAgdHlwZW5hbWUgX1NlbGVjdG9yPgorICAgIHN0ZDo6cGFpcjxfUkFJdGVyMSwgX1JBSXRlcjI+CisgICAgX19maW5kX3RlbXBsYXRlKF9SQUl0ZXIxIF9fYmVnaW4xLCBfUkFJdGVyMSBfX2VuZDEsCisJCSAgICBfUkFJdGVyMiBfX2JlZ2luMiwgX1ByZWQgX19wcmVkLCBfU2VsZWN0b3IgX19zZWxlY3RvciwKKwkJICAgIGdyb3dpbmdfYmxvY2tzX3RhZykKKyAgICB7CisgICAgICBfR0xJQkNYWF9DQUxMKF9fZW5kMSAtIF9fYmVnaW4xKQorCisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXIxPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisKKyAgICAgIGNvbnN0IF9TZXR0aW5ncyYgX19zID0gX1NldHRpbmdzOjpnZXQoKTsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbGVuZ3RoID0gX19lbmQxIC0gX19iZWdpbjE7CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZQorCV9fc2VxdWVudGlhbF9zZWFyY2hfc2l6ZSA9IHN0ZDo6bWluPF9EaWZmZXJlbmNlVHlwZT4KKwkoX19sZW5ndGgsIF9fcy5maW5kX3NlcXVlbnRpYWxfc2VhcmNoX3NpemUpOworCisgICAgICAvLyBUcnkgaXQgc2VxdWVudGlhbGx5IGZpcnN0LgorICAgICAgc3RkOjpwYWlyPF9SQUl0ZXIxLCBfUkFJdGVyMj4KKwlfX2ZpbmRfc2VxX3Jlc3VsdCA9IF9fc2VsZWN0b3IuX01fc2VxdWVudGlhbF9hbGdvcml0aG0KKwkoX19iZWdpbjEsIF9fYmVnaW4xICsgX19zZXF1ZW50aWFsX3NlYXJjaF9zaXplLAorCSBfX2JlZ2luMiwgX19wcmVkKTsKKworICAgICAgaWYgKF9fZmluZF9zZXFfcmVzdWx0LmZpcnN0ICE9IChfX2JlZ2luMSArIF9fc2VxdWVudGlhbF9zZWFyY2hfc2l6ZSkpCisJcmV0dXJuIF9fZmluZF9zZXFfcmVzdWx0OworCisgICAgICAvLyBJbmRleCBvZiBiZWdpbm5pbmcgb2YgbmV4dCBmcmVlIGJsb2NrIChhZnRlciBzZXF1ZW50aWFsIGZpbmQpLgorICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbmV4dF9ibG9ja19zdGFydCA9IF9fc2VxdWVudGlhbF9zZWFyY2hfc2l6ZTsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX3Jlc3VsdCA9IF9fbGVuZ3RoOworCisgICAgICBvbXBfbG9ja190IF9fcmVzdWx0X2xvY2s7CisgICAgICBvbXBfaW5pdF9sb2NrKCZfX3Jlc3VsdF9sb2NrKTsKKworICAgICAgY29uc3QgZmxvYXQgX19zY2FsZV9mYWN0b3IgPSBfX3MuZmluZF9zY2FsZV9mYWN0b3I7CisKKyAgICAgIF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzID0gX19nZXRfbWF4X3RocmVhZHMoKTsKKyMgICAgIHByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKF9fcmVzdWx0KSBudW1fdGhyZWFkcyhfX251bV90aHJlYWRzKQorICAgICAgeworIyAgICAgICBwcmFnbWEgb21wIHNpbmdsZQorCV9fbnVtX3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCk7CisKKwkvLyBOb3Qgd2l0aGluIGZpcnN0IF9fayBlbGVtZW50cyAtPiBzdGFydCBwYXJhbGxlbC4KKwlfVGhyZWFkSW5kZXggX19pYW0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKworCV9EaWZmZXJlbmNlVHlwZSBfX2Jsb2NrX3NpemUgPQorCSAgc3RkOjptYXg8X0RpZmZlcmVuY2VUeXBlPigxLCBfX3NjYWxlX2ZhY3RvciAqIF9fbmV4dF9ibG9ja19zdGFydCk7CisJX0RpZmZlcmVuY2VUeXBlIF9fc3RhcnQgPSBfX2ZldGNoX2FuZF9hZGQ8X0RpZmZlcmVuY2VUeXBlPgorCSAgKCZfX25leHRfYmxvY2tfc3RhcnQsIF9fYmxvY2tfc2l6ZSk7CisKKwkvLyBHZXQgbmV3IGJsb2NrLCB1cGRhdGUgcG9pbnRlciB0byBuZXh0IGJsb2NrLgorCV9EaWZmZXJlbmNlVHlwZSBfX3N0b3AgPQorCSAgc3RkOjptaW48X0RpZmZlcmVuY2VUeXBlPihfX2xlbmd0aCwgX19zdGFydCArIF9fYmxvY2tfc2l6ZSk7CisKKwlzdGQ6OnBhaXI8X1JBSXRlcjEsIF9SQUl0ZXIyPiBfX2xvY2FsX3Jlc3VsdDsKKworCXdoaWxlIChfX3N0YXJ0IDwgX19sZW5ndGgpCisJICB7CisjICAgICAgICAgICBwcmFnbWEgb21wIGZsdXNoKF9fcmVzdWx0KQorCSAgICAvLyBHZXQgbmV3IHZhbHVlIG9mIHJlc3VsdC4KKwkgICAgaWYgKF9fcmVzdWx0IDwgX19zdGFydCkKKwkgICAgICB7CisJCS8vIE5vIGNoYW5jZSB0byBmaW5kIGZpcnN0IGVsZW1lbnQuCisJCWJyZWFrOworCSAgICAgIH0KKworCSAgICBfX2xvY2FsX3Jlc3VsdCA9IF9fc2VsZWN0b3IuX01fc2VxdWVudGlhbF9hbGdvcml0aG0KKwkgICAgICAoX19iZWdpbjEgKyBfX3N0YXJ0LCBfX2JlZ2luMSArIF9fc3RvcCwKKwkgICAgICAgX19iZWdpbjIgKyBfX3N0YXJ0LCBfX3ByZWQpOworCisJICAgIGlmIChfX2xvY2FsX3Jlc3VsdC5maXJzdCAhPSAoX19iZWdpbjEgKyBfX3N0b3ApKQorCSAgICAgIHsKKwkJb21wX3NldF9sb2NrKCZfX3Jlc3VsdF9sb2NrKTsKKwkJaWYgKChfX2xvY2FsX3Jlc3VsdC5maXJzdCAtIF9fYmVnaW4xKSA8IF9fcmVzdWx0KQorCQkgIHsKKwkJICAgIF9fcmVzdWx0ID0gX19sb2NhbF9yZXN1bHQuZmlyc3QgLSBfX2JlZ2luMTsKKworCQkgICAgLy8gUmVzdWx0IGNhbm5vdCBiZSBpbiBmdXR1cmUgYmxvY2tzLCBzdG9wIGFsZ29yaXRobS4KKwkJICAgIF9fZmV0Y2hfYW5kX2FkZDxfRGlmZmVyZW5jZVR5cGU+KCZfX25leHRfYmxvY2tfc3RhcnQsCisJCQkJCQkgICAgIF9fbGVuZ3RoKTsKKwkJICB9CisJCW9tcF91bnNldF9sb2NrKCZfX3Jlc3VsdF9sb2NrKTsKKwkgICAgICB9CisKKwkgICAgX0RpZmZlcmVuY2VUeXBlIF9fYmxvY2tfc2l6ZSA9CisJICAgICBzdGQ6Om1heDxfRGlmZmVyZW5jZVR5cGU+KDEsIF9fc2NhbGVfZmFjdG9yICogX19uZXh0X2Jsb2NrX3N0YXJ0KTsKKworCSAgICAvLyBHZXQgbmV3IGJsb2NrLCB1cGRhdGUgcG9pbnRlciB0byBuZXh0IGJsb2NrLgorCSAgICBfX3N0YXJ0ID0gX19mZXRjaF9hbmRfYWRkPF9EaWZmZXJlbmNlVHlwZT4oJl9fbmV4dF9ibG9ja19zdGFydCwKKwkJCQkJCSAgICAgICBfX2Jsb2NrX3NpemUpOworCSAgICBfX3N0b3AgPQorCSAgICAgIHN0ZDo6bWluPF9EaWZmZXJlbmNlVHlwZT4oX19sZW5ndGgsIF9fc3RhcnQgKyBfX2Jsb2NrX3NpemUpOworCSAgfQorICAgICAgfSAvL3BhcmFsbGVsCisKKyAgICAgIG9tcF9kZXN0cm95X2xvY2soJl9fcmVzdWx0X2xvY2spOworCisgICAgICAvLyBSZXR1cm4gaXRlcmF0b3Igb24gZm91bmQgZWxlbWVudC4KKyAgICAgIHJldHVybgorCXN0ZDo6cGFpcjxfUkFJdGVyMSwgX1JBSXRlcjI+KF9fYmVnaW4xICsgX19yZXN1bHQsCisJCQkJICAgICAgX19iZWdpbjIgKyBfX3Jlc3VsdCk7CisgICAgfQorCisjZW5kaWYKKworI2lmIF9HTElCQ1hYX0ZJTkRfQ09OU1RBTlRfU0laRV9CTE9DS1MKKworICAvKioKKyAgICogICBAYnJpZWYgUGFyYWxsZWwgc3RkOjpmaW5kLCBjb25zdGFudCBibG9jayBzaXplIHZhcmlhbnQuCisgICAqICBAcGFyYW0gX19iZWdpbjEgQmVnaW4gaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19lbmQxIEVuZCBpdGVyYXRvciBvZiBmaXJzdCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2JlZ2luMiBCZWdpbiBpdGVyYXRvciBvZiBzZWNvbmQgc2VxdWVuY2UuIFNlY29uZCBfX3NlcXVlbmNlCisgICAqICBtdXN0IGhhdmUgc2FtZSBsZW5ndGggYXMgZmlyc3Qgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19wcmVkIEZpbmQgcHJlZGljYXRlLgorICAgKiAgQHBhcmFtIF9fc2VsZWN0b3IgX0Z1bmN0aW9uYWxpdHkgKGUuIGcuIHN0ZDo6ZmluZF9pZigpLCBzdGQ6OmVxdWFsKCksLi4uKQorICAgKiAgQHJldHVybiBQbGFjZSBvZiBmaW5kaW5nIGluIGJvdGggc2VxdWVuY2VzLgorICAgKiAgQHNlZSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpmaW5kX3NlcXVlbnRpYWxfc2VhcmNoX3NpemUKKyAgICogIEBzZWUgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6ZmluZF9ibG9ja19zaXplCisgICAqICBUaGVyZSBhcmUgdHdvIG1haW4gZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgZ3Jvd2luZyBibG9ja3MgYW5kIHRoZQorICAgKiAgY29uc3RhbnQtc2l6ZSBibG9ja3MgdmFyaWFudHMuCisgICAqICAxLiBGb3IgR0IsIHRoZSBibG9jayBzaXplIGdyb3dzOyBmb3IgQ1NCLCB0aGUgYmxvY2sgc2l6ZSBpcyBmaXhlZC4KKyAgICogIDIuIEZvciBHQiwgdGhlIGJsb2NrcyBhcmUgYWxsb2NhdGVkIGR5bmFtaWNhbGx5OyBmb3IgQ1NCLCB0aGUKKyAgICogIGJsb2NrcyBhcmUgYWxsb2NhdGVkIGluIGEgcHJlZGV0ZXJtaW5lZCBtYW5uZXIsIG5hbWVseSBzcGFjaWFsCisgICAqICByb3VuZC1yb2Jpbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIxLAorICAgICAgICAgICB0eXBlbmFtZSBfUkFJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX1ByZWQsCisgICAgICAgICAgIHR5cGVuYW1lIF9TZWxlY3Rvcj4KKyAgICBzdGQ6OnBhaXI8X1JBSXRlcjEsIF9SQUl0ZXIyPgorICAgIF9fZmluZF90ZW1wbGF0ZShfUkFJdGVyMSBfX2JlZ2luMSwgX1JBSXRlcjEgX19lbmQxLAorICAgICAgICAgICAgICAgICAgX1JBSXRlcjIgX19iZWdpbjIsIF9QcmVkIF9fcHJlZCwgX1NlbGVjdG9yIF9fc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICBjb25zdGFudF9zaXplX2Jsb2Nrc190YWcpCisgICAgeworICAgICAgX0dMSUJDWFhfQ0FMTChfX2VuZDEgLSBfX2JlZ2luMSkKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcjE+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKworICAgICAgY29uc3QgX1NldHRpbmdzJiBfX3MgPSBfU2V0dGluZ3M6OmdldCgpOworCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19sZW5ndGggPSBfX2VuZDEgLSBfX2JlZ2luMTsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fc2VxdWVudGlhbF9zZWFyY2hfc2l6ZSA9IHN0ZDo6bWluPF9EaWZmZXJlbmNlVHlwZT4KKwkoX19sZW5ndGgsIF9fcy5maW5kX3NlcXVlbnRpYWxfc2VhcmNoX3NpemUpOworCisgICAgICAvLyBUcnkgaXQgc2VxdWVudGlhbGx5IGZpcnN0LgorICAgICAgc3RkOjpwYWlyPF9SQUl0ZXIxLCBfUkFJdGVyMj4KKwlfX2ZpbmRfc2VxX3Jlc3VsdCA9IF9fc2VsZWN0b3IuX01fc2VxdWVudGlhbF9hbGdvcml0aG0KKwkoX19iZWdpbjEsIF9fYmVnaW4xICsgX19zZXF1ZW50aWFsX3NlYXJjaF9zaXplLCBfX2JlZ2luMiwgX19wcmVkKTsKKworICAgICAgaWYgKF9fZmluZF9zZXFfcmVzdWx0LmZpcnN0ICE9IChfX2JlZ2luMSArIF9fc2VxdWVudGlhbF9zZWFyY2hfc2l6ZSkpCisJcmV0dXJuIF9fZmluZF9zZXFfcmVzdWx0OworCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19yZXN1bHQgPSBfX2xlbmd0aDsKKyAgICAgIG9tcF9sb2NrX3QgX19yZXN1bHRfbG9jazsKKyAgICAgIG9tcF9pbml0X2xvY2soJl9fcmVzdWx0X2xvY2spOworCisgICAgICAvLyBOb3Qgd2l0aGluIGZpcnN0IF9fc2VxdWVudGlhbF9zZWFyY2hfc2l6ZSBlbGVtZW50cyAtPiBzdGFydCBwYXJhbGxlbC4KKworICAgICAgX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMgPSBfX2dldF9tYXhfdGhyZWFkcygpOworIyAgICAgcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQoX19yZXN1bHQpIG51bV90aHJlYWRzKF9fbnVtX3RocmVhZHMpCisgICAgICB7CisjICAgICAgIHByYWdtYSBvbXAgc2luZ2xlCisJX19udW1fdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKworCV9UaHJlYWRJbmRleCBfX2lhbSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworCV9EaWZmZXJlbmNlVHlwZSBfX2Jsb2NrX3NpemUgPSBfX3MuZmluZF9pbml0aWFsX2Jsb2NrX3NpemU7CisKKwkvLyBGaXJzdCBlbGVtZW50IG9mIHRocmVhZCdzIGN1cnJlbnQgaXRlcmF0aW9uLgorCV9EaWZmZXJlbmNlVHlwZSBfX2l0ZXJhdGlvbl9zdGFydCA9IF9fc2VxdWVudGlhbF9zZWFyY2hfc2l6ZTsKKworCS8vIFdoZXJlIHRvIHdvcmsgKGluaXRpYWxpemF0aW9uKS4KKwlfRGlmZmVyZW5jZVR5cGUgX19zdGFydCA9IF9faXRlcmF0aW9uX3N0YXJ0ICsgX19pYW0gKiBfX2Jsb2NrX3NpemU7CisJX0RpZmZlcmVuY2VUeXBlIF9fc3RvcCA9IHN0ZDo6bWluPF9EaWZmZXJlbmNlVHlwZT4oX19sZW5ndGgsCisJCQkJCQkJICAgX19zdGFydAorCQkJCQkJCSAgICsgX19ibG9ja19zaXplKTsKKworCXN0ZDo6cGFpcjxfUkFJdGVyMSwgX1JBSXRlcjI+IF9fbG9jYWxfcmVzdWx0OworCisJd2hpbGUgKF9fc3RhcnQgPCBfX2xlbmd0aCkKKwkgIHsKKwkgICAgLy8gR2V0IG5ldyB2YWx1ZSBvZiByZXN1bHQuCisjICAgICAgICAgICBwcmFnbWEgb21wIGZsdXNoKF9fcmVzdWx0KQorCSAgICAvLyBObyBjaGFuY2UgdG8gZmluZCBmaXJzdCBlbGVtZW50LgorCSAgICBpZiAoX19yZXN1bHQgPCBfX3N0YXJ0KQorCSAgICAgIGJyZWFrOworCisJICAgIF9fbG9jYWxfcmVzdWx0ID0gX19zZWxlY3Rvci5fTV9zZXF1ZW50aWFsX2FsZ29yaXRobQorCSAgICAgIChfX2JlZ2luMSArIF9fc3RhcnQsIF9fYmVnaW4xICsgX19zdG9wLAorCSAgICAgICBfX2JlZ2luMiArIF9fc3RhcnQsIF9fcHJlZCk7CisKKwkgICAgaWYgKF9fbG9jYWxfcmVzdWx0LmZpcnN0ICE9IChfX2JlZ2luMSArIF9fc3RvcCkpCisJICAgICAgeworCQlvbXBfc2V0X2xvY2soJl9fcmVzdWx0X2xvY2spOworCQlpZiAoKF9fbG9jYWxfcmVzdWx0LmZpcnN0IC0gX19iZWdpbjEpIDwgX19yZXN1bHQpCisJCSAgX19yZXN1bHQgPSBfX2xvY2FsX3Jlc3VsdC5maXJzdCAtIF9fYmVnaW4xOworCQlvbXBfdW5zZXRfbG9jaygmX19yZXN1bHRfbG9jayk7CisJCS8vIFdpbGwgbm90IGZpbmQgYmV0dGVyIHZhbHVlIGluIGl0cyBpbnRlcnZhbC4KKwkJYnJlYWs7CisJICAgICAgfQorCisJICAgIF9faXRlcmF0aW9uX3N0YXJ0ICs9IF9fbnVtX3RocmVhZHMgKiBfX2Jsb2NrX3NpemU7CisKKwkgICAgLy8gV2hlcmUgdG8gd29yay4KKwkgICAgX19zdGFydCA9IF9faXRlcmF0aW9uX3N0YXJ0ICsgX19pYW0gKiBfX2Jsb2NrX3NpemU7CisJICAgIF9fc3RvcCA9IHN0ZDo6bWluPF9EaWZmZXJlbmNlVHlwZT4oX19sZW5ndGgsCisJCQkJCSAgICAgICBfX3N0YXJ0ICsgX19ibG9ja19zaXplKTsKKwkgIH0KKyAgICAgIH0gLy9wYXJhbGxlbAorCisgICAgICBvbXBfZGVzdHJveV9sb2NrKCZfX3Jlc3VsdF9sb2NrKTsKKworICAgICAgLy8gUmV0dXJuIGl0ZXJhdG9yIG9uIGZvdW5kIGVsZW1lbnQuCisgICAgICByZXR1cm4gc3RkOjpwYWlyPF9SQUl0ZXIxLCBfUkFJdGVyMj4oX19iZWdpbjEgKyBfX3Jlc3VsdCwKKwkJCQkJICAgX19iZWdpbjIgKyBfX3Jlc3VsdCk7CisgICAgfQorI2VuZGlmCit9IC8vIGVuZCBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX0ZJTkRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9maW5kX3NlbGVjdG9ycy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9maW5kX3NlbGVjdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYzcwZGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2ZpbmRfc2VsZWN0b3JzLmgKQEAgLTAsMCArMSwxOTcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9maW5kX3NlbGVjdG9ycy5oCisgKiAgQGJyaWVmIF9GdW5jdGlvbiBvYmplY3RzIHJlcHJlc2VudGluZyBkaWZmZXJlbnQgdGFza3MgdG8gYmUgcGx1Z2dlZAorICogIGludG8gdGhlIHBhcmFsbGVsIGZpbmQgYWxnb3JpdGhtLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgRmVsaXggUHV0emUuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfRklORF9TRUxFQ1RPUlNfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9GSU5EX1NFTEVDVE9SU19IIDEKKworI2luY2x1ZGUgPHBhcmFsbGVsL3RhZ3MuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9iYXNpY19pdGVyYXRvci5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX3BhaXIuaD4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKiBAYnJpZWYgQmFzZSBjbGFzcyBvZiBhbGwgX19nbnVfcGFyYWxsZWw6Ol9fZmluZF90ZW1wbGF0ZSBzZWxlY3RvcnMuICovCisgIHN0cnVjdCBfX2dlbmVyaWNfZmluZF9zZWxlY3RvcgorICB7IH07CisKKyAgLyoqIAorICAgKiAgQGJyaWVmIFRlc3QgcHJlZGljYXRlIG9uIGEgc2luZ2xlIGVsZW1lbnQsIHVzZWQgZm9yIHN0ZDo6ZmluZCgpCisgICAqICBhbmQgc3RkOjpmaW5kX2lmICgpLgorICAgKi8KKyAgc3RydWN0IF9fZmluZF9pZl9zZWxlY3RvciA6IHB1YmxpYyBfX2dlbmVyaWNfZmluZF9zZWxlY3RvcgorICB7CisgICAgLyoqIEBicmllZiBUZXN0IG9uIG9uZSBwb3NpdGlvbi4KKyAgICAgKiBAcGFyYW0gX19pMSBfSXRlcmF0b3Igb24gZmlyc3Qgc2VxdWVuY2UuCisgICAgICogQHBhcmFtIF9faTIgX0l0ZXJhdG9yIG9uIHNlY29uZCBzZXF1ZW5jZSAodW51c2VkKS4KKyAgICAgKiBAcGFyYW0gX19wcmVkIEZpbmQgcHJlZGljYXRlLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIxLCB0eXBlbmFtZSBfUkFJdGVyMiwKKyAgICAgICAgICAgICB0eXBlbmFtZSBfUHJlZD4KKyAgICAgIGJvb2wgCisgICAgICBvcGVyYXRvcigpKF9SQUl0ZXIxIF9faTEsIF9SQUl0ZXIyIF9faTIsIF9QcmVkIF9fcHJlZCkKKyAgICAgIHsgcmV0dXJuIF9fcHJlZCgqX19pMSk7IH0KKworICAgIC8qKiBAYnJpZWYgQ29ycmVzcG9uZGluZyBzZXF1ZW50aWFsIGFsZ29yaXRobSBvbiBhIHNlcXVlbmNlLgorICAgICAqICBAcGFyYW0gX19iZWdpbjEgQmVnaW4gaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAgICogIEBwYXJhbSBfX2VuZDEgRW5kIGl0ZXJhdG9yIG9mIGZpcnN0IHNlcXVlbmNlLgorICAgICAqICBAcGFyYW0gX19iZWdpbjIgQmVnaW4gaXRlcmF0b3Igb2Ygc2Vjb25kIHNlcXVlbmNlLgorICAgICAqICBAcGFyYW0gX19wcmVkIEZpbmQgcHJlZGljYXRlLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIxLCB0eXBlbmFtZSBfUkFJdGVyMiwKKyAgICAgICAgICAgICB0eXBlbmFtZSBfUHJlZD4KKyAgICAgIHN0ZDo6cGFpcjxfUkFJdGVyMSwgX1JBSXRlcjI+IAorICAgICAgX01fc2VxdWVudGlhbF9hbGdvcml0aG0oX1JBSXRlcjEgX19iZWdpbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfUkFJdGVyMSBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfUkFJdGVyMiBfX2JlZ2luMiwgX1ByZWQgX19wcmVkKQorICAgICAgeyByZXR1cm4gc3RkOjptYWtlX3BhaXIoZmluZF9pZihfX2JlZ2luMSwgX19lbmQxLCBfX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbnRpYWxfdGFnKCkpLCBfX2JlZ2luMik7IH0KKyAgfTsKKworICAvKiogQGJyaWVmIFRlc3QgcHJlZGljYXRlIG9uIHR3byBhZGphY2VudCBlbGVtZW50cy4gKi8KKyAgc3RydWN0IF9fYWRqYWNlbnRfZmluZF9zZWxlY3RvciA6IHB1YmxpYyBfX2dlbmVyaWNfZmluZF9zZWxlY3RvcgorICB7CisgICAgLyoqIEBicmllZiBUZXN0IG9uIG9uZSBwb3NpdGlvbi4KKyAgICAgKiAgQHBhcmFtIF9faTEgX0l0ZXJhdG9yIG9uIGZpcnN0IHNlcXVlbmNlLgorICAgICAqICBAcGFyYW0gX19pMiBfSXRlcmF0b3Igb24gc2Vjb25kIHNlcXVlbmNlICh1bnVzZWQpLgorICAgICAqICBAcGFyYW0gX19wcmVkIEZpbmQgcHJlZGljYXRlLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIxLCB0eXBlbmFtZSBfUkFJdGVyMiwKKyAgICAgICAgICAgICB0eXBlbmFtZSBfUHJlZD4KKyAgICAgIGJvb2wgCisgICAgICBvcGVyYXRvcigpKF9SQUl0ZXIxIF9faTEsIF9SQUl0ZXIyIF9faTIsIF9QcmVkIF9fcHJlZCkKKyAgICAgIHsKKyAgICAgICAgLy8gUGFzc2VkIGVuZCBpdGVyYXRvciBpcyBvbmUgc2hvcnQuCisgICAgICAgIHJldHVybiBfX3ByZWQoKl9faTEsICooX19pMSArIDEpKTsKKyAgICAgIH0KKworICAgIC8qKiBAYnJpZWYgQ29ycmVzcG9uZGluZyBzZXF1ZW50aWFsIGFsZ29yaXRobSBvbiBhIHNlcXVlbmNlLgorICAgICAqICBAcGFyYW0gX19iZWdpbjEgQmVnaW4gaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAgICogIEBwYXJhbSBfX2VuZDEgRW5kIGl0ZXJhdG9yIG9mIGZpcnN0IHNlcXVlbmNlLgorICAgICAqICBAcGFyYW0gX19iZWdpbjIgQmVnaW4gaXRlcmF0b3Igb2Ygc2Vjb25kIHNlcXVlbmNlLgorICAgICAqICBAcGFyYW0gX19wcmVkIEZpbmQgcHJlZGljYXRlLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIxLCB0eXBlbmFtZSBfUkFJdGVyMiwKKyAgICAgICAgICAgICB0eXBlbmFtZSBfUHJlZD4KKyAgICAgIHN0ZDo6cGFpcjxfUkFJdGVyMSwgX1JBSXRlcjI+CisgICAgICBfTV9zZXF1ZW50aWFsX2FsZ29yaXRobShfUkFJdGVyMSBfX2JlZ2luMSwKKwkJCSAgICAgIF9SQUl0ZXIxIF9fZW5kMSwKKwkJCSAgICAgIF9SQUl0ZXIyIF9fYmVnaW4yLCBfUHJlZCBfX3ByZWQpCisgICAgICB7CisgICAgICAgIC8vIFBhc3NlZCBlbmQgaXRlcmF0b3IgaXMgb25lIHNob3J0LgorICAgICAgICBfUkFJdGVyMSBfX3Nwb3QgPSBhZGphY2VudF9maW5kKF9fYmVnaW4xLCBfX2VuZDEgKyAxLAorCQkJCQlfX3ByZWQsIHNlcXVlbnRpYWxfdGFnKCkpOworICAgICAgICBpZiAoX19zcG90ID09IChfX2VuZDEgKyAxKSkKKyAgICAgICAgICBfX3Nwb3QgPSBfX2VuZDE7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihfX3Nwb3QsIF9fYmVnaW4yKTsKKyAgICAgIH0KKyAgfTsKKworICAvKiogQGJyaWVmIFRlc3QgaW52ZXJ0ZWQgcHJlZGljYXRlIG9uIGEgc2luZ2xlIGVsZW1lbnQuICovCisgIHN0cnVjdCBfX21pc21hdGNoX3NlbGVjdG9yIDogcHVibGljIF9fZ2VuZXJpY19maW5kX3NlbGVjdG9yCisgIHsKKyAgICAvKiogCisgICAgICogIEBicmllZiBUZXN0IG9uIG9uZSBwb3NpdGlvbi4KKyAgICAgKiAgQHBhcmFtIF9faTEgX0l0ZXJhdG9yIG9uIGZpcnN0IHNlcXVlbmNlLgorICAgICAqICBAcGFyYW0gX19pMiBfSXRlcmF0b3Igb24gc2Vjb25kIHNlcXVlbmNlICh1bnVzZWQpLgorICAgICAqICBAcGFyYW0gX19wcmVkIEZpbmQgcHJlZGljYXRlLiAKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsCisgICAgICAgICAgICAgdHlwZW5hbWUgX1ByZWQ+CisgICAgICBib29sIAorICAgICAgb3BlcmF0b3IoKShfUkFJdGVyMSBfX2kxLCBfUkFJdGVyMiBfX2kyLCBfUHJlZCBfX3ByZWQpCisgICAgICB7IHJldHVybiAhX19wcmVkKCpfX2kxLCAqX19pMik7IH0KKworICAgIC8qKiAKKyAgICAgKiAgQGJyaWVmIENvcnJlc3BvbmRpbmcgc2VxdWVudGlhbCBhbGdvcml0aG0gb24gYSBzZXF1ZW5jZS4KKyAgICAgKiAgQHBhcmFtIF9fYmVnaW4xIEJlZ2luIGl0ZXJhdG9yIG9mIGZpcnN0IHNlcXVlbmNlLgorICAgICAqICBAcGFyYW0gX19lbmQxIEVuZCBpdGVyYXRvciBvZiBmaXJzdCBzZXF1ZW5jZS4KKyAgICAgKiAgQHBhcmFtIF9fYmVnaW4yIEJlZ2luIGl0ZXJhdG9yIG9mIHNlY29uZCBzZXF1ZW5jZS4KKyAgICAgKiAgQHBhcmFtIF9fcHJlZCBGaW5kIHByZWRpY2F0ZS4gCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLAorICAgICAgICAgICAgIHR5cGVuYW1lIF9QcmVkPgorICAgICAgc3RkOjpwYWlyPF9SQUl0ZXIxLCBfUkFJdGVyMj4KKyAgICAgIF9NX3NlcXVlbnRpYWxfYWxnb3JpdGhtKF9SQUl0ZXIxIF9fYmVnaW4xLAorCQkJICAgICAgX1JBSXRlcjEgX19lbmQxLAorCQkJICAgICAgX1JBSXRlcjIgX19iZWdpbjIsIF9QcmVkIF9fcHJlZCkKKyAgICAgIHsgcmV0dXJuIG1pc21hdGNoKF9fYmVnaW4xLCBfX2VuZDEsIF9fYmVnaW4yLAorCQkJX19wcmVkLCBzZXF1ZW50aWFsX3RhZygpKTsgfQorICB9OworCisKKyAgLyoqIEBicmllZiBUZXN0IHByZWRpY2F0ZSBvbiBzZXZlcmFsIGVsZW1lbnRzLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXJhdG9yPgorICAgIHN0cnVjdCBfX2ZpbmRfZmlyc3Rfb2Zfc2VsZWN0b3IgOiBwdWJsaWMgX19nZW5lcmljX2ZpbmRfc2VsZWN0b3IKKyAgICB7CisgICAgICBfRkl0ZXJhdG9yIF9NX2JlZ2luOworICAgICAgX0ZJdGVyYXRvciBfTV9lbmQ7CisKKyAgICAgIGV4cGxpY2l0IF9fZmluZF9maXJzdF9vZl9zZWxlY3RvcihfRkl0ZXJhdG9yIF9fYmVnaW4sCisJCQkJCV9GSXRlcmF0b3IgX19lbmQpCisgICAgICA6IF9NX2JlZ2luKF9fYmVnaW4pLCBfTV9lbmQoX19lbmQpIHsgfQorCisgICAgICAvKiogQGJyaWVmIFRlc3Qgb24gb25lIHBvc2l0aW9uLgorICAgICAgICogIEBwYXJhbSBfX2kxIF9JdGVyYXRvciBvbiBmaXJzdCBzZXF1ZW5jZS4KKyAgICAgICAqICBAcGFyYW0gX19pMiBfSXRlcmF0b3Igb24gc2Vjb25kIHNlcXVlbmNlICh1bnVzZWQpLgorICAgICAgICogIEBwYXJhbSBfX3ByZWQgRmluZCBwcmVkaWNhdGUuICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyMSwgdHlwZW5hbWUgX1JBSXRlcjIsCisJICAgICAgIHR5cGVuYW1lIF9QcmVkPgorICAgICAgICBib29sCisgICAgICAgIG9wZXJhdG9yKCkoX1JBSXRlcjEgX19pMSwgX1JBSXRlcjIgX19pMiwgX1ByZWQgX19wcmVkKQorICAgICAgICB7CisJICBmb3IgKF9GSXRlcmF0b3IgX19wb3NfaW5fY2FuZGlkYXRlcyA9IF9NX2JlZ2luOworCSAgICAgICBfX3Bvc19pbl9jYW5kaWRhdGVzICE9IF9NX2VuZDsgKytfX3Bvc19pbl9jYW5kaWRhdGVzKQorCSAgICBpZiAoX19wcmVkKCpfX2kxLCAqX19wb3NfaW5fY2FuZGlkYXRlcykpCisJICAgICAgcmV0dXJuIHRydWU7CisJICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICAvKiogQGJyaWVmIENvcnJlc3BvbmRpbmcgc2VxdWVudGlhbCBhbGdvcml0aG0gb24gYSBzZXF1ZW5jZS4KKyAgICAgICAqICBAcGFyYW0gX19iZWdpbjEgQmVnaW4gaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAgICAgKiAgQHBhcmFtIF9fZW5kMSBFbmQgaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAgICAgKiAgQHBhcmFtIF9fYmVnaW4yIEJlZ2luIGl0ZXJhdG9yIG9mIHNlY29uZCBzZXF1ZW5jZS4KKyAgICAgICAqICBAcGFyYW0gX19wcmVkIEZpbmQgcHJlZGljYXRlLiAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLAorCSAgICAgICB0eXBlbmFtZSBfUHJlZD4KKyAgICAgICAgc3RkOjpwYWlyPF9SQUl0ZXIxLCBfUkFJdGVyMj4KKyAgICAgICAgX01fc2VxdWVudGlhbF9hbGdvcml0aG0oX1JBSXRlcjEgX19iZWdpbjEsCisJCQkJX1JBSXRlcjEgX19lbmQxLAorCQkJCV9SQUl0ZXIyIF9fYmVnaW4yLCBfUHJlZCBfX3ByZWQpCisgICAgICAgIHsKKwkgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihmaW5kX2ZpcnN0X29mKF9fYmVnaW4xLCBfX2VuZDEsCisJCQkJCSAgICAgIF9NX2JlZ2luLCBfTV9lbmQsIF9fcHJlZCwKKwkJCQkJICAgICAgc2VxdWVudGlhbF90YWcoKSksIF9fYmVnaW4yKTsKKwl9CisgICAgIH07Cit9CisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9GSU5EX1NFTEVDVE9SU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2Zvcl9lYWNoLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2Zvcl9lYWNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjViZTMyMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvZm9yX2VhY2guaApAQCAtMCwwICsxLDkwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvZm9yX2VhY2guaAorICogIEBicmllZiBNYWluIGludGVyZmFjZSBmb3IgZW1iYXJyYXNzaW5nbHkgcGFyYWxsZWwgZnVuY3Rpb25zLgorICoKKyAqICBUaGUgZXhwbGljaXQgaW1wbGVtZW50YXRpb24gYXJlIGluIG90aGVyIGhlYWRlciBmaWxlcywgbGlrZQorICogIHdvcmtzdGVhbGluZy5oLCBwYXJfbG9vcC5oLCBvbXBfbG9vcC5oLCBhbmQgb21wX2xvb3Bfc3RhdGljLmguCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBGZWxpeCBQdXR6ZS4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9GT1JfRUFDSF9ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX0ZPUl9FQUNIX0ggMQorCisjaW5jbHVkZSA8cGFyYWxsZWwvc2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9wYXJfbG9vcC5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL29tcF9sb29wLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvd29ya3N0ZWFsaW5nLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAoreworICAvKiogQGJyaWVmIENob3NlIHRoZSBkZXNpcmVkIGFsZ29yaXRobSBieSBldmFsdWF0aW5nIEBjIF9fcGFyYWxsZWxpc21fdGFnLgorICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19lbmQgRW5kIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fdXNlcl9vcCBBIHVzZXItc3BlY2lmaWVkIGZ1bmN0b3IgKGNvbXBhcmF0b3IsIHByZWRpY2F0ZSwKKyAgICogIGFzc29jaWF0aXZlIG9wZXJhdG9yLC4uLikKKyAgICogIEBwYXJhbSBfX2Z1bmN0aW9uYWxpdHkgZnVuY3RvciB0byBAYSBwcm9jZXNzIGFuIGVsZW1lbnQgd2l0aAorICAgKiAgX191c2VyX29wIChkZXBlbmRzIG9uIGRlc2lyZWQgZnVuY3Rpb25hbGl0eSwgZS4gZy4gYWNjdW11bGF0ZSwKKyAgICogIGZvcl9lYWNoLC4uLgorICAgKiAgQHBhcmFtIF9fcmVkdWN0aW9uIFJlZHVjdGlvbiBmdW5jdG9yLgorICAgKiAgQHBhcmFtIF9fcmVkdWN0aW9uX3N0YXJ0IEluaXRpYWwgdmFsdWUgZm9yIHJlZHVjdGlvbi4KKyAgICogIEBwYXJhbSBfX291dHB1dCBPdXRwdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gX19ib3VuZCBNYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBwcm9jZXNzZWQuCisgICAqICBAcGFyYW0gX19wYXJhbGxlbGlzbV90YWcgUGFyYWxsZWxpemF0aW9uIG1ldGhvZCAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9Vc2VyT3AsCisgICAgICAgICAgIHR5cGVuYW1lIF9GdW5jdGlvbmFsaXR5LCB0eXBlbmFtZSBfUmVkLCB0eXBlbmFtZSBfUmVzdWx0PgorICAgIF9Vc2VyT3AKKyAgICBfX2Zvcl9lYWNoX3RlbXBsYXRlX3JhbmRvbV9hY2Nlc3MoX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1VzZXJPcCBfX3VzZXJfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9GdW5jdGlvbmFsaXR5JiBfX2Z1bmN0aW9uYWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SZWQgX19yZWR1Y3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SZXN1bHQgX19yZWR1Y3Rpb25fc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SZXN1bHQmIF9fb3V0cHV0LCB0eXBlbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+OjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9fYm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtX3RhZykKKyAgICB7CisgICAgICBpZiAoX19wYXJhbGxlbGlzbV90YWcgPT0gcGFyYWxsZWxfdW5iYWxhbmNlZCkKKyAgICAgICAgcmV0dXJuIF9fZm9yX2VhY2hfdGVtcGxhdGVfcmFuZG9tX2FjY2Vzc19lZAorCSAgKF9fYmVnaW4sIF9fZW5kLCBfX3VzZXJfb3AsIF9fZnVuY3Rpb25hbGl0eSwgX19yZWR1Y3Rpb24sCisJICAgX19yZWR1Y3Rpb25fc3RhcnQsIF9fb3V0cHV0LCBfX2JvdW5kKTsKKyAgICAgIGVsc2UgaWYgKF9fcGFyYWxsZWxpc21fdGFnID09IHBhcmFsbGVsX29tcF9sb29wKQorICAgICAgICByZXR1cm4gX19mb3JfZWFjaF90ZW1wbGF0ZV9yYW5kb21fYWNjZXNzX29tcF9sb29wCisJICAoX19iZWdpbiwgX19lbmQsIF9fdXNlcl9vcCwgX19mdW5jdGlvbmFsaXR5LCBfX3JlZHVjdGlvbiwKKwkgICBfX3JlZHVjdGlvbl9zdGFydCwgX19vdXRwdXQsIF9fYm91bmQpOworICAgICAgZWxzZSBpZiAoX19wYXJhbGxlbGlzbV90YWcgPT0gcGFyYWxsZWxfb21wX2xvb3Bfc3RhdGljKQorICAgICAgICByZXR1cm4gX19mb3JfZWFjaF90ZW1wbGF0ZV9yYW5kb21fYWNjZXNzX29tcF9sb29wCisJICAoX19iZWdpbiwgX19lbmQsIF9fdXNlcl9vcCwgX19mdW5jdGlvbmFsaXR5LCBfX3JlZHVjdGlvbiwKKwkgICBfX3JlZHVjdGlvbl9zdGFydCwgX19vdXRwdXQsIF9fYm91bmQpOworICAgICAgZWxzZSAgICAgIC8vZS4gZy4gcGFyYWxsZWxfYmFsYW5jZWQKKyAgICAgICAgcmV0dXJuIF9fZm9yX2VhY2hfdGVtcGxhdGVfcmFuZG9tX2FjY2Vzc193b3Jrc3RlYWxpbmcKKwkgIChfX2JlZ2luLCBfX2VuZCwgX191c2VyX29wLCBfX2Z1bmN0aW9uYWxpdHksIF9fcmVkdWN0aW9uLAorCSAgIF9fcmVkdWN0aW9uX3N0YXJ0LCBfX291dHB1dCwgX19ib3VuZCk7CisgIH0KK30KKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX0ZPUl9FQUNIX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvZm9yX2VhY2hfc2VsZWN0b3JzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2Zvcl9lYWNoX3NlbGVjdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NjMwODQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2Zvcl9lYWNoX3NlbGVjdG9ycy5oCkBAIC0wLDAgKzEsMzQ5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvZm9yX2VhY2hfc2VsZWN0b3JzLmgKKyAqICBAYnJpZWYgRnVuY3RvcnMgcmVwcmVzZW50aW5nIGRpZmZlcmVudCB0YXNrcyB0byBiZSBwbHVnZ2VkIGludG8gdGhlCisgKiAgZ2VuZXJpYyBwYXJhbGxlbGl6YXRpb24gbWV0aG9kcyBmb3IgZW1iYXJyYXNzaW5nbHkgcGFyYWxsZWwgZnVuY3Rpb25zLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgRmVsaXggUHV0emUuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfRk9SX0VBQ0hfU0VMRUNUT1JTX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfRk9SX0VBQ0hfU0VMRUNUT1JTX0ggMQorCisjaW5jbHVkZSA8cGFyYWxsZWwvYmFzaWNfaXRlcmF0b3IuaD4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKiBAYnJpZWYgR2VuZXJpYyBfX3NlbGVjdG9yIGZvciBlbWJhcnJhc3NpbmdseSBwYXJhbGxlbCBmdW5jdGlvbnMuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdD4KKyAgICBzdHJ1Y3QgX19nZW5lcmljX2Zvcl9lYWNoX3NlbGVjdG9yCisgICAgeworICAgICAgLyoqIEBicmllZiBfSXRlcmF0b3Igb24gbGFzdCBlbGVtZW50IHByb2Nlc3NlZDsgbmVlZGVkIGZvciBzb21lCisgICAgICAgKiAgYWxnb3JpdGhtcyAoZS4gZy4gc3RkOjp0cmFuc2Zvcm0oKSkuCisgICAgICAgKi8KKyAgICAgIF9JdCBfTV9maW5pc2hfaXRlcmF0b3I7CisgICAgfTsKKworICAvKiogQGJyaWVmIHN0ZDo6Zm9yX2VhY2goKSBzZWxlY3Rvci4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0PgorICAgIHN0cnVjdCBfX2Zvcl9lYWNoX3NlbGVjdG9yIDogcHVibGljIF9fZ2VuZXJpY19mb3JfZWFjaF9zZWxlY3RvcjxfSXQ+CisgICAgeworICAgICAgLyoqIEBicmllZiBGdW5jdG9yIGV4ZWN1dGlvbi4KKyAgICAgICAqICBAcGFyYW0gX19vIE9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSBfX2kgaXRlcmF0b3IgcmVmZXJlbmNpbmcgb2JqZWN0LiAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX09wPgorICAgICAgICBib29sCisgICAgICAgIG9wZXJhdG9yKCkoX09wJiBfX28sIF9JdCBfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBfX28oKl9faSk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9OworCisgIC8qKiBAYnJpZWYgc3RkOjpnZW5lcmF0ZSgpIHNlbGVjdG9yLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXQ+CisgICAgc3RydWN0IF9fZ2VuZXJhdGVfc2VsZWN0b3IgOiBwdWJsaWMgX19nZW5lcmljX2Zvcl9lYWNoX3NlbGVjdG9yPF9JdD4KKyAgICB7CisgICAgICAvKiogQGJyaWVmIEZ1bmN0b3IgZXhlY3V0aW9uLgorICAgICAgICogIEBwYXJhbSBfX28gT3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtIF9faSBpdGVyYXRvciByZWZlcmVuY2luZyBvYmplY3QuICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3A+CisgICAgICAgIGJvb2wKKyAgICAgICAgb3BlcmF0b3IoKShfT3AmIF9fbywgX0l0IF9faSkKKyAgICAgICAgeworICAgICAgICAgICpfX2kgPSBfX28oKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgLyoqIEBicmllZiBzdGQ6OmZpbGwoKSBzZWxlY3Rvci4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0PgorICAgIHN0cnVjdCBfX2ZpbGxfc2VsZWN0b3IgOiBwdWJsaWMgX19nZW5lcmljX2Zvcl9lYWNoX3NlbGVjdG9yPF9JdD4KKyAgICB7CisgICAgICAvKiogQGJyaWVmIEZ1bmN0b3IgZXhlY3V0aW9uLgorICAgICAgICogIEBwYXJhbSBfX3YgQ3VycmVudCB2YWx1ZS4KKyAgICAgICAqICBAcGFyYW0gX19pIGl0ZXJhdG9yIHJlZmVyZW5jaW5nIG9iamVjdC4gKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZVR5cGU+CisgICAgICAgIGJvb2wKKyAgICAgICAgb3BlcmF0b3IoKShfVmFsdWVUeXBlJiBfX3YsIF9JdCBfX2kpCisgICAgICAgIHsKKyAgICAgICAgICAqX19pID0gX192OworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfTsKKworICAvKiogQGJyaWVmIHN0ZDo6dHJhbnNmb3JtKCkgX19zZWxlY3Rvciwgb25lIGlucHV0IHNlcXVlbmNlIHZhcmlhbnQuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdD4KKyAgICBzdHJ1Y3QgX190cmFuc2Zvcm0xX3NlbGVjdG9yIDogcHVibGljIF9fZ2VuZXJpY19mb3JfZWFjaF9zZWxlY3RvcjxfSXQ+CisgICAgeworICAgICAgLyoqIEBicmllZiBGdW5jdG9yIGV4ZWN1dGlvbi4KKyAgICAgICAqICBAcGFyYW0gX19vIE9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSBfX2kgaXRlcmF0b3IgcmVmZXJlbmNpbmcgb2JqZWN0LiAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX09wPgorICAgICAgICBib29sCisgICAgICAgIG9wZXJhdG9yKCkoX09wJiBfX28sIF9JdCBfX2kpCisgICAgICAgIHsKKyAgICAgICAgICAqX19pLnNlY29uZCA9IF9fbygqX19pLmZpcnN0KTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgLyoqIEBicmllZiBzdGQ6OnRyYW5zZm9ybSgpIF9fc2VsZWN0b3IsIHR3byBpbnB1dCBzZXF1ZW5jZXMgdmFyaWFudC4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0PgorICAgIHN0cnVjdCBfX3RyYW5zZm9ybTJfc2VsZWN0b3IgOiBwdWJsaWMgX19nZW5lcmljX2Zvcl9lYWNoX3NlbGVjdG9yPF9JdD4KKyAgICB7CisgICAgICAvKiogQGJyaWVmIEZ1bmN0b3IgZXhlY3V0aW9uLgorICAgICAgICogIEBwYXJhbSBfX28gT3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtIF9faSBpdGVyYXRvciByZWZlcmVuY2luZyBvYmplY3QuICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3A+CisgICAgICAgIGJvb2wKKyAgICAgICAgb3BlcmF0b3IoKShfT3AmIF9fbywgX0l0IF9faSkKKyAgICAgICAgeworICAgICAgICAgICpfX2kuX01fdGhpcmQgPSBfX28oKl9faS5fTV9maXJzdCwgKl9faS5fTV9zZWNvbmQpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfTsKKworICAvKiogQGJyaWVmIHN0ZDo6cmVwbGFjZSgpIHNlbGVjdG9yLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXQsIHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19yZXBsYWNlX3NlbGVjdG9yIDogcHVibGljIF9fZ2VuZXJpY19mb3JfZWFjaF9zZWxlY3RvcjxfSXQ+CisgICAgeworICAgICAgLyoqIEBicmllZiBWYWx1ZSB0byByZXBsYWNlIHdpdGguICovCisgICAgICBjb25zdCBfVHAmIF9fbmV3X3ZhbDsKKworICAgICAgLyoqIEBicmllZiBDb25zdHJ1Y3RvcgorICAgICAgICogIEBwYXJhbSBfX25ld192YWwgVmFsdWUgdG8gcmVwbGFjZSB3aXRoLiAqLworICAgICAgZXhwbGljaXQKKyAgICAgIF9fcmVwbGFjZV9zZWxlY3Rvcihjb25zdCBfVHAgJl9fbmV3X3ZhbCkgOiBfX25ld192YWwoX19uZXdfdmFsKSB7fQorCisgICAgICAvKiogQGJyaWVmIEZ1bmN0b3IgZXhlY3V0aW9uLgorICAgICAgICogIEBwYXJhbSBfX3YgQ3VycmVudCB2YWx1ZS4KKyAgICAgICAqICBAcGFyYW0gX19pIGl0ZXJhdG9yIHJlZmVyZW5jaW5nIG9iamVjdC4gKi8KKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoX1RwJiBfX3YsIF9JdCBfX2kpCisgICAgICB7CisgICAgICAgIGlmICgqX19pID09IF9fdikKKyAgICAgICAgICAqX19pID0gX19uZXdfdmFsOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9OworCisgIC8qKiBAYnJpZWYgc3RkOjpyZXBsYWNlKCkgc2VsZWN0b3IuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdCwgdHlwZW5hbWUgX09wLCB0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fcmVwbGFjZV9pZl9zZWxlY3RvciA6IHB1YmxpYyBfX2dlbmVyaWNfZm9yX2VhY2hfc2VsZWN0b3I8X0l0PgorICAgIHsKKyAgICAgIC8qKiBAYnJpZWYgVmFsdWUgdG8gcmVwbGFjZSB3aXRoLiAqLworICAgICAgY29uc3QgX1RwJiBfX25ld192YWw7CisKKyAgICAgIC8qKiBAYnJpZWYgQ29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fbmV3X3ZhbCBWYWx1ZSB0byByZXBsYWNlIHdpdGguICovCisgICAgICBleHBsaWNpdAorICAgICAgX19yZXBsYWNlX2lmX3NlbGVjdG9yKGNvbnN0IF9UcCAmX19uZXdfdmFsKSA6IF9fbmV3X3ZhbChfX25ld192YWwpIHsgfQorCisgICAgICAvKiogQGJyaWVmIEZ1bmN0b3IgZXhlY3V0aW9uLgorICAgICAgICogIEBwYXJhbSBfX28gT3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtIF9faSBpdGVyYXRvciByZWZlcmVuY2luZyBvYmplY3QuICovCisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKF9PcCYgX19vLCBfSXQgX19pKQorICAgICAgeworICAgICAgICBpZiAoX19vKCpfX2kpKQorICAgICAgICAgICpfX2kgPSBfX25ld192YWw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH07CisKKyAgLyoqIEBicmllZiBzdGQ6OmNvdW50KCkgc2VsZWN0b3IuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdCwgdHlwZW5hbWUgX0RpZmY+CisgICAgc3RydWN0IF9fY291bnRfc2VsZWN0b3IgOiBwdWJsaWMgX19nZW5lcmljX2Zvcl9lYWNoX3NlbGVjdG9yPF9JdD4KKyAgICB7CisgICAgICAvKiogQGJyaWVmIEZ1bmN0b3IgZXhlY3V0aW9uLgorICAgICAgICogIEBwYXJhbSBfX3YgQ3VycmVudCB2YWx1ZS4KKyAgICAgICAqICBAcGFyYW0gX19pIGl0ZXJhdG9yIHJlZmVyZW5jaW5nIG9iamVjdC4KKyAgICAgICAqICBAcmV0dXJuIDEgaWYgY291bnQsIDAgaWYgZG9lcyBub3QgY291bnQuICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWVUeXBlPgorICAgICAgICBfRGlmZgorICAgICAgICBvcGVyYXRvcigpKF9WYWx1ZVR5cGUmIF9fdiwgX0l0IF9faSkKKyAgICAgICAgeyByZXR1cm4gKF9fdiA9PSAqX19pKSA/IDEgOiAwOyB9CisgICAgfTsKKworICAvKiogQGJyaWVmIHN0ZDo6Y291bnRfaWYgKCkgc2VsZWN0b3IuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdCwgdHlwZW5hbWUgX0RpZmY+CisgICAgc3RydWN0IF9fY291bnRfaWZfc2VsZWN0b3IgOiBwdWJsaWMgX19nZW5lcmljX2Zvcl9lYWNoX3NlbGVjdG9yPF9JdD4KKyAgICB7CisgICAgICAvKiogQGJyaWVmIEZ1bmN0b3IgZXhlY3V0aW9uLgorICAgICAgICogIEBwYXJhbSBfX28gT3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtIF9faSBpdGVyYXRvciByZWZlcmVuY2luZyBvYmplY3QuCisgICAgICAgKiAgQHJldHVybiAxIGlmIGNvdW50LCAwIGlmIGRvZXMgbm90IGNvdW50LiAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX09wPgorICAgICAgICBfRGlmZgorICAgICAgICBvcGVyYXRvcigpKF9PcCYgX19vLCBfSXQgX19pKQorICAgICAgICB7IHJldHVybiAoX19vKCpfX2kpKSA/IDEgOiAwOyB9CisgICAgfTsKKworICAvKiogQGJyaWVmIHN0ZDo6YWNjdW11bGF0ZSgpIHNlbGVjdG9yLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXQ+CisgICAgc3RydWN0IF9fYWNjdW11bGF0ZV9zZWxlY3RvciA6IHB1YmxpYyBfX2dlbmVyaWNfZm9yX2VhY2hfc2VsZWN0b3I8X0l0PgorICAgIHsKKyAgICAgIC8qKiBAYnJpZWYgRnVuY3RvciBleGVjdXRpb24uCisgICAgICAgKiAgQHBhcmFtIF9fbyBPcGVyYXRvciAodW51c2VkKS4KKyAgICAgICAqICBAcGFyYW0gX19pIGl0ZXJhdG9yIHJlZmVyZW5jaW5nIG9iamVjdC4KKyAgICAgICAqICBAcmV0dXJuIFRoZSBjdXJyZW50IHZhbHVlLiAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX09wPgorICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXQ+Ojp2YWx1ZV90eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX09wIF9fbywgX0l0IF9faSkKKyAgICAgICAgeyByZXR1cm4gKl9faTsgfQorICAgIH07CisKKyAgLyoqIEBicmllZiBzdGQ6OmlubmVyX3Byb2R1Y3QoKSBzZWxlY3Rvci4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0LCB0eXBlbmFtZSBfSXQyLCB0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faW5uZXJfcHJvZHVjdF9zZWxlY3RvciA6IHB1YmxpYyBfX2dlbmVyaWNfZm9yX2VhY2hfc2VsZWN0b3I8X0l0PgorICAgIHsKKyAgICAgIC8qKiBAYnJpZWYgQmVnaW4gaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuICovCisgICAgICBfSXQgIF9fYmVnaW4xX2l0ZXJhdG9yOworCisgICAgICAvKiogQGJyaWVmIEJlZ2luIGl0ZXJhdG9yIG9mIHNlY29uZCBzZXF1ZW5jZS4gKi8KKyAgICAgIF9JdDIgX19iZWdpbjJfaXRlcmF0b3I7CisKKyAgICAgIC8qKiBAYnJpZWYgQ29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fYjEgQmVnaW4gaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAgICAgKiAgQHBhcmFtIF9fYjIgQmVnaW4gaXRlcmF0b3Igb2Ygc2Vjb25kIHNlcXVlbmNlLiAqLworICAgICAgZXhwbGljaXQKKyAgICAgIF9faW5uZXJfcHJvZHVjdF9zZWxlY3RvcihfSXQgX19iMSwgX0l0MiBfX2IyKQorICAgICAgOiBfX2JlZ2luMV9pdGVyYXRvcihfX2IxKSwgX19iZWdpbjJfaXRlcmF0b3IoX19iMikgeyB9CisKKyAgICAgIC8qKiBAYnJpZWYgRnVuY3RvciBleGVjdXRpb24uCisgICAgICAgKiAgQHBhcmFtIF9fbXVsdCBNdWx0aXBsaWNhdGlvbiBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSBfX2N1cnJlbnQgaXRlcmF0b3IgcmVmZXJlbmNpbmcgb2JqZWN0LgorICAgICAgICogIEByZXR1cm4gSW5uZXIgcHJvZHVjdCBlbGVtZW50YWwgX19yZXN1bHQuICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3A+CisgICAgICAgIF9UcAorICAgICAgICBvcGVyYXRvcigpKF9PcCBfX211bHQsIF9JdCBfX2N1cnJlbnQpCisgICAgICAgIHsKKyAgICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXQ+OjpkaWZmZXJlbmNlX3R5cGUgX19wb3NpdGlvbgorICAgICAgICAgICAgPSBfX2N1cnJlbnQgLSBfX2JlZ2luMV9pdGVyYXRvcjsKKyAgICAgICAgICByZXR1cm4gX19tdWx0KCpfX2N1cnJlbnQsICooX19iZWdpbjJfaXRlcmF0b3IgKyBfX3Bvc2l0aW9uKSk7CisgICAgICAgIH0KKyAgICB9OworCisgIC8qKiBAYnJpZWYgU2VsZWN0b3IgdGhhdCBqdXN0IHJldHVybnMgdGhlIHBhc3NlZCBpdGVyYXRvci4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0PgorICAgIHN0cnVjdCBfX2lkZW50aXR5X3NlbGVjdG9yIDogcHVibGljIF9fZ2VuZXJpY19mb3JfZWFjaF9zZWxlY3RvcjxfSXQ+CisgICAgeworICAgICAgLyoqIEBicmllZiBGdW5jdG9yIGV4ZWN1dGlvbi4KKyAgICAgICAqICBAcGFyYW0gX19vIE9wZXJhdG9yICh1bnVzZWQpLgorICAgICAgICogIEBwYXJhbSBfX2kgaXRlcmF0b3IgcmVmZXJlbmNpbmcgb2JqZWN0LgorICAgICAgICogIEByZXR1cm4gUGFzc2VkIGl0ZXJhdG9yLiAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX09wPgorICAgICAgICBfSXQKKyAgICAgICAgb3BlcmF0b3IoKShfT3AgX19vLCBfSXQgX19pKQorICAgICAgICB7IHJldHVybiBfX2k7IH0KKyAgICB9OworCisgIC8qKiBAYnJpZWYgU2VsZWN0b3IgdGhhdCByZXR1cm5zIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGFkamFjZW50CisgICAqICBfX2VsZW1lbnRzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0PgorICAgIHN0cnVjdCBfX2FkamFjZW50X2RpZmZlcmVuY2Vfc2VsZWN0b3IKKyAgICA6IHB1YmxpYyBfX2dlbmVyaWNfZm9yX2VhY2hfc2VsZWN0b3I8X0l0PgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PcD4KKyAgICAgICAgYm9vbAorICAgICAgICBvcGVyYXRvcigpKF9PcCYgX19vLCBfSXQgX19pKQorICAgICAgICB7CisgICAgICAgICAgdHlwZW5hbWUgX0l0OjpmaXJzdF90eXBlIF9fZ29fYmFja19vbmUgPSBfX2kuZmlyc3Q7CisgICAgICAgICAgLS1fX2dvX2JhY2tfb25lOworICAgICAgICAgICpfX2kuc2Vjb25kID0gX19vKCpfX2kuZmlyc3QsICpfX2dvX2JhY2tfb25lKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgLyoqIEBicmllZiBGdW5jdG9yIGRvaW5nIG5vdGhpbmcKKyAgICoKKyAgICogIEZvciBzb21lIF9fcmVkdWN0aW9uIHRhc2tzICh0aGlzIGlzIG5vdCBhIGZ1bmN0aW9uIG9iamVjdCwgYnV0IGlzCisgICAqICBwYXNzZWQgYXMgX19zZWxlY3RvciBfX2R1bW15IHBhcmFtZXRlci4KKyAgICovCisgIHN0cnVjdCBfTm90aGluZworICB7CisgICAgLyoqIEBicmllZiBGdW5jdG9yIGV4ZWN1dGlvbi4KKyAgICAgKiAgQHBhcmFtIF9faSBpdGVyYXRvciByZWZlcmVuY2luZyBvYmplY3QuICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0PgorICAgICAgdm9pZAorICAgICAgb3BlcmF0b3IoKShfSXQgX19pKSB7IH0KKyAgfTsKKworICAvKiogQGJyaWVmIFJlZHVjdGlvbiBmdW5jdGlvbiBkb2luZyBub3RoaW5nLiAqLworICBzdHJ1Y3QgX0R1bW15UmVkdWN0CisgIHsKKyAgICBib29sCisgICAgb3BlcmF0b3IoKShib29sLCBib29sKSBjb25zdAorICAgIHsgcmV0dXJuIHRydWU7IH0KKyAgfTsKKworICAvKiogQGJyaWVmIFJlZHVjdGlvbiBmb3IgZmluZGluZyB0aGUgbWF4aW11bSBlbGVtZW50LCB1c2luZyBhIGNvbXBhcmF0b3IuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfSXQ+CisgICAgc3RydWN0IF9fbWluX2VsZW1lbnRfcmVkdWN0CisgICAgeworICAgICAgX0NvbXBhcmUmIF9fY29tcDsKKworICAgICAgZXhwbGljaXQKKyAgICAgIF9fbWluX2VsZW1lbnRfcmVkdWN0KF9Db21wYXJlICZfX2MpIDogX19jb21wKF9fYykgeyB9CisKKyAgICAgIF9JdAorICAgICAgb3BlcmF0b3IoKShfSXQgX194LCBfSXQgX195KQorICAgICAgeyByZXR1cm4gKF9fY29tcCgqX194LCAqX195KSkgPyBfX3ggOiBfX3k7IH0KKyAgICB9OworCisgIC8qKiBAYnJpZWYgUmVkdWN0aW9uIGZvciBmaW5kaW5nIHRoZSBtYXhpbXVtIGVsZW1lbnQsIHVzaW5nIGEgY29tcGFyYXRvci4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9JdD4KKyAgICBzdHJ1Y3QgX19tYXhfZWxlbWVudF9yZWR1Y3QKKyAgICB7CisgICAgICBfQ29tcGFyZSYgX19jb21wOworCisgICAgICBleHBsaWNpdAorICAgICAgX19tYXhfZWxlbWVudF9yZWR1Y3QoX0NvbXBhcmUmIF9fYykgOiBfX2NvbXAoX19jKSB7IH0KKworICAgICAgX0l0CisgICAgICBvcGVyYXRvcigpKF9JdCBfX3gsIF9JdCBfX3kpCisgICAgICB7IHJldHVybiAoX19jb21wKCpfX3gsICpfX3kpKSA/IF9feSA6IF9feDsgfQorICAgIH07CisKKyAgLyoqIEBicmllZiBHZW5lcmFsIHJlZHVjdGlvbiwgdXNpbmcgYSBiaW5hcnkgb3BlcmF0b3IuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaW5PcD4KKyAgICBzdHJ1Y3QgX19hY2N1bXVsYXRlX2Jpbm9wX3JlZHVjdAorICAgIHsKKyAgICAgIF9CaW5PcCYgX19iaW5vcDsKKworICAgICAgZXhwbGljaXQKKyAgICAgIF9fYWNjdW11bGF0ZV9iaW5vcF9yZWR1Y3QoX0Jpbk9wJiBfX2IpIDogX19iaW5vcChfX2IpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfQWRkZW5kPgorICAgICAgICBfUmVzdWx0CisgICAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1Jlc3VsdCYgX194LCBjb25zdCBfQWRkZW5kJiBfX3kpCisgICAgICAgIHsgcmV0dXJuIF9fYmlub3AoX194LCBfX3kpOyB9CisgICAgfTsKK30KKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX0ZPUl9FQUNIX1NFTEVDVE9SU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2l0ZXJhdG9yLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI1NTgyNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvaXRlcmF0b3IuaApAQCAtMCwwICsxLDE5OCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL2l0ZXJhdG9yLmgKKyAqIEBicmllZiBIZWxwZXIgaXRlcmF0b3IgY2xhc3NlcyBmb3IgdGhlIHN0ZDo6dHJhbnNmb3JtKCkgZnVuY3Rpb25zLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgSm9oYW5uZXMgU2luZ2xlci4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9JVEVSQVRPUl9ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX0lURVJBVE9SX0ggMQorCisjaW5jbHVkZSA8cGFyYWxsZWwvYmFzaWNfaXRlcmF0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9wYWlyLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAoreworICAvKiogQGJyaWVmIEEgcGFpciBvZiBpdGVyYXRvcnMuIFRoZSB1c3VhbCBpdGVyYXRvciBvcGVyYXRpb25zIGFyZQorICAgKiAgYXBwbGllZCB0byBib3RoIGNoaWxkIGl0ZXJhdG9ycy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcjEsIHR5cGVuYW1lIF9JdGVyYXRvcjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyYXRvckNhdGVnb3J5PgorICAgIGNsYXNzIF9JdGVyYXRvclBhaXIgOiBwdWJsaWMgc3RkOjpwYWlyPF9JdGVyYXRvcjEsIF9JdGVyYXRvcjI+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHN0ZDo6cGFpcjxfSXRlcmF0b3IxLCBfSXRlcmF0b3IyPiBfQmFzZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0l0ZXJhdG9yQ2F0ZWdvcnkgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHZvaWQgdmFsdWVfdHlwZTsKKworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3IxPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9JdGVyYXRvclBhaXIqIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIF9JdGVyYXRvclBhaXImIHJlZmVyZW5jZTsKKworICAgICAgX0l0ZXJhdG9yUGFpcigpIHsgfQorCisgICAgICBfSXRlcmF0b3JQYWlyKGNvbnN0IF9JdGVyYXRvcjEmIF9fZmlyc3QsIGNvbnN0IF9JdGVyYXRvcjImIF9fc2Vjb25kKQorICAgICAgOiBfQmFzZShfX2ZpcnN0LCBfX3NlY29uZCkgeyB9CisKKyAgICAgIC8vIFByZS1pbmNyZW1lbnQgb3BlcmF0b3IuCisgICAgICBfSXRlcmF0b3JQYWlyJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisgICAgICAgICsrX0Jhc2U6OmZpcnN0OworICAgICAgICArK19CYXNlOjpzZWNvbmQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8gUG9zdC1pbmNyZW1lbnQgb3BlcmF0b3IuCisgICAgICBjb25zdCBfSXRlcmF0b3JQYWlyCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgcmV0dXJuIF9JdGVyYXRvclBhaXIoX0Jhc2U6OmZpcnN0KyssIF9CYXNlOjpzZWNvbmQrKyk7IH0KKworICAgICAgLy8gUHJlLWRlY3JlbWVudCBvcGVyYXRvci4KKyAgICAgIF9JdGVyYXRvclBhaXImCisgICAgICBvcGVyYXRvci0tKCkKKyAgICAgIHsKKyAgICAgICAgLS1fQmFzZTo6Zmlyc3Q7CisgICAgICAgIC0tX0Jhc2U6OnNlY29uZDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLyBQb3N0LWRlY3JlbWVudCBvcGVyYXRvci4KKyAgICAgIGNvbnN0IF9JdGVyYXRvclBhaXIKKyAgICAgIG9wZXJhdG9yLS0oaW50KQorICAgICAgeyByZXR1cm4gX0l0ZXJhdG9yUGFpcihfQmFzZTo6Zmlyc3QtLSwgX0Jhc2U6OnNlY29uZC0tKTsgfQorCisgICAgICAvLyBUeXBlIGNvbnZlcnNpb24uCisgICAgICBvcGVyYXRvciBfSXRlcmF0b3IyKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9CYXNlOjpzZWNvbmQ7IH0KKworICAgICAgX0l0ZXJhdG9yUGFpciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfSXRlcmF0b3JQYWlyJiBfX290aGVyKQorICAgICAgeworICAgICAgICBfQmFzZTo6Zmlyc3QgPSBfX290aGVyLmZpcnN0OworICAgICAgICBfQmFzZTo6c2Vjb25kID0gX19vdGhlci5zZWNvbmQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX0l0ZXJhdG9yUGFpcgorICAgICAgb3BlcmF0b3IrKGRpZmZlcmVuY2VfdHlwZSBfX2RlbHRhKSBjb25zdAorICAgICAgeyByZXR1cm4gX0l0ZXJhdG9yUGFpcihfQmFzZTo6Zmlyc3QgKyBfX2RlbHRhLCBfQmFzZTo6c2Vjb25kICsgX19kZWx0YSk7CisgICAgICAgIH0KKworICAgICAgZGlmZmVyZW5jZV90eXBlCisgICAgICBvcGVyYXRvci0oY29uc3QgX0l0ZXJhdG9yUGFpciYgX19vdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9CYXNlOjpmaXJzdCAtIF9fb3RoZXIuZmlyc3Q7IH0KKyAgfTsKKworCisgIC8qKiBAYnJpZWYgQSB0cmlwbGUgb2YgaXRlcmF0b3JzLiBUaGUgdXN1YWwgaXRlcmF0b3Igb3BlcmF0aW9ucyBhcmUKKyAgICAgIGFwcGxpZWQgdG8gYWxsIHRocmVlIGNoaWxkIGl0ZXJhdG9ycy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcjEsIHR5cGVuYW1lIF9JdGVyYXRvcjIsIHR5cGVuYW1lIF9JdGVyYXRvcjMsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyYXRvckNhdGVnb3J5PgorICAgIGNsYXNzIF9JdGVyYXRvclRyaXBsZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9JdGVyYXRvckNhdGVnb3J5IGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiB2b2lkIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcjE+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0l0ZXJhdG9yVHJpcGxlKiBwb2ludGVyOworICAgICAgdHlwZWRlZiBfSXRlcmF0b3JUcmlwbGUmIHJlZmVyZW5jZTsKKworICAgICAgX0l0ZXJhdG9yMSBfTV9maXJzdDsKKyAgICAgIF9JdGVyYXRvcjIgX01fc2Vjb25kOworICAgICAgX0l0ZXJhdG9yMyBfTV90aGlyZDsKKworICAgICAgX0l0ZXJhdG9yVHJpcGxlKCkgeyB9CisKKyAgICAgIF9JdGVyYXRvclRyaXBsZShjb25zdCBfSXRlcmF0b3IxJiBfX2ZpcnN0LCBjb25zdCBfSXRlcmF0b3IyJiBfX3NlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSXRlcmF0b3IzJiBfX3RoaXJkKQorICAgICAgeworICAgICAgICBfTV9maXJzdCA9IF9fZmlyc3Q7CisgICAgICAgIF9NX3NlY29uZCA9IF9fc2Vjb25kOworICAgICAgICBfTV90aGlyZCA9IF9fdGhpcmQ7CisgICAgICB9CisKKyAgICAgIC8vIFByZS1pbmNyZW1lbnQgb3BlcmF0b3IuCisgICAgICBfSXRlcmF0b3JUcmlwbGUmCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKyAgICAgICAgKytfTV9maXJzdDsKKyAgICAgICAgKytfTV9zZWNvbmQ7CisgICAgICAgICsrX01fdGhpcmQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8gUG9zdC1pbmNyZW1lbnQgb3BlcmF0b3IuCisgICAgICBjb25zdCBfSXRlcmF0b3JUcmlwbGUKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeyByZXR1cm4gX0l0ZXJhdG9yVHJpcGxlKF9NX2ZpcnN0KyssIF9NX3NlY29uZCsrLCBfTV90aGlyZCsrKTsgfQorCisgICAgICAvLyBQcmUtZGVjcmVtZW50IG9wZXJhdG9yLgorICAgICAgX0l0ZXJhdG9yVHJpcGxlJgorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7CisgICAgICAgIC0tX01fZmlyc3Q7CisgICAgICAgIC0tX01fc2Vjb25kOworICAgICAgICAtLV9NX3RoaXJkOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vIFBvc3QtZGVjcmVtZW50IG9wZXJhdG9yLgorICAgICAgY29uc3QgX0l0ZXJhdG9yVHJpcGxlCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsgcmV0dXJuIF9JdGVyYXRvclRyaXBsZShfTV9maXJzdC0tLCBfTV9zZWNvbmQtLSwgX01fdGhpcmQtLSk7IH0KKworICAgICAgLy8gVHlwZSBjb252ZXJzaW9uLgorICAgICAgb3BlcmF0b3IgX0l0ZXJhdG9yMygpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90aGlyZDsgfQorCisgICAgICBfSXRlcmF0b3JUcmlwbGUmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX0l0ZXJhdG9yVHJpcGxlJiBfX290aGVyKQorICAgICAgeworICAgICAgICBfTV9maXJzdCA9IF9fb3RoZXIuX01fZmlyc3Q7CisgICAgICAgIF9NX3NlY29uZCA9IF9fb3RoZXIuX01fc2Vjb25kOworICAgICAgICBfTV90aGlyZCA9IF9fb3RoZXIuX01fdGhpcmQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX0l0ZXJhdG9yVHJpcGxlCisgICAgICBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIF9fZGVsdGEpIGNvbnN0CisgICAgICB7IHJldHVybiBfSXRlcmF0b3JUcmlwbGUoX01fZmlyc3QgKyBfX2RlbHRhLCBfTV9zZWNvbmQgKyBfX2RlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX3RoaXJkICsgX19kZWx0YSk7IH0KKworICAgICAgZGlmZmVyZW5jZV90eXBlCisgICAgICBvcGVyYXRvci0oY29uc3QgX0l0ZXJhdG9yVHJpcGxlJiBfX290aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZmlyc3QgLSBfX290aGVyLl9NX2ZpcnN0OyB9CisgIH07Cit9CisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9JVEVSQVRPUl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2xpc3RfcGFydGl0aW9uLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL2xpc3RfcGFydGl0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNiOWFjYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvbGlzdF9wYXJ0aXRpb24uaApAQCAtMCwwICsxLDE3OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIF9faXQgYW5kL29yIG1vZGlmeSBfX2l0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IF9faXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL2xpc3RfcGFydGl0aW9uLmgKKyAqICBAYnJpZWYgX0Z1bmN0aW9uYWxpdHkgdG8gc3BsaXQgX19zZXF1ZW5jZSByZWZlcmVuY2VkIGJ5IG9ubHkgaW5wdXQKKyAqICBpdGVyYXRvcnMuCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBMZW9ub3IgRnJpYXMgTW95YSBhbmQgSm9oYW5uZXMgU2luZ2xlci4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9MSVNUX1BBUlRJVElPTl9ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX0xJU1RfUEFSVElUSU9OX0ggMQorCisjaW5jbHVkZSA8cGFyYWxsZWwvcGFyYWxsZWwuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAoreworICAvKiogQGJyaWVmIFNocmlua3MgYW5kIGRvdWJsZXMgdGhlIHJhbmdlcy4KKyAgICogIEBwYXJhbSBfX29zX3N0YXJ0cyBTdGFydCBwb3NpdGlvbnMgd29ya2VkIG9uIChvdmVyc2FtcGxlZCkuCisgICAqICBAcGFyYW0gX19jb3VudF90b190d28gQ291bnRzIHVwIHRvIDIuCisgICAqICBAcGFyYW0gX19yYW5nZV9sZW5ndGggQ3VycmVudCBsZW5ndGggb2YgYSBjaHVuay4KKyAgICogIEBwYXJhbSBfX21ha2VfdHdpY2UgV2hldGhlciB0aGUgQGMgX19vc19zdGFydHMgaXMgYWxsb3dlZCB0byBiZQorICAgKiAgZ3Jvd24gb3Igbm90CisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXI+CisgICAgdm9pZAorICAgIF9fc2hyaW5rX2FuZF9kb3VibGUoc3RkOjp2ZWN0b3I8X0lJdGVyPiYgX19vc19zdGFydHMsCisJCQlzaXplX3QmIF9fY291bnRfdG9fdHdvLCBzaXplX3QmIF9fcmFuZ2VfbGVuZ3RoLAorCQkJY29uc3QgYm9vbCBfX21ha2VfdHdpY2UpCisgICAgeworICAgICAgKytfX2NvdW50X3RvX3R3bzsKKyAgICAgIGlmICghX19tYWtlX3R3aWNlIHx8IF9fY291bnRfdG9fdHdvIDwgMikKKyAgICAgICAgX19zaHJpbmsoX19vc19zdGFydHMsIF9fY291bnRfdG9fdHdvLCBfX3JhbmdlX2xlbmd0aCk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfX29zX3N0YXJ0cy5yZXNpemUoKF9fb3Nfc3RhcnRzLnNpemUoKSAtIDEpICogMiArIDEpOworICAgICAgICAgIF9fY291bnRfdG9fdHdvID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAvKiogQGJyaWVmIENvbWJpbmVzIHR3byByYW5nZXMgaW50byBvbmUgYW5kIHRodXMgaGFsdmVzIHRoZSBudW1iZXIgb2YgcmFuZ2VzLgorICAgKiAgQHBhcmFtIF9fb3Nfc3RhcnRzIFN0YXJ0IHBvc2l0aW9ucyB3b3JrZWQgb24gKG92ZXJzYW1wbGVkKS4KKyAgICogIEBwYXJhbSBfX2NvdW50X3RvX3R3byBDb3VudHMgdXAgdG8gMi4KKyAgICogIEBwYXJhbSBfX3JhbmdlX2xlbmd0aCBDdXJyZW50IGxlbmd0aCBvZiBhIGNodW5rLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXI+CisgICAgdm9pZAorICAgIF9fc2hyaW5rKHN0ZDo6dmVjdG9yPF9JSXRlcj4mIF9fb3Nfc3RhcnRzLCBzaXplX3QmIF9fY291bnRfdG9fdHdvLAorCSAgICAgc2l6ZV90JiBfX3JhbmdlX2xlbmd0aCkKKyAgICB7CisgICAgICBmb3IgKHR5cGVuYW1lIHN0ZDo6dmVjdG9yPF9JSXRlcj46OnNpemVfdHlwZSBfX2kgPSAwOworICAgICAgICAgICBfX2kgPD0gKF9fb3Nfc3RhcnRzLnNpemUoKSAvIDIpOyArK19faSkKKyAgICAgICAgX19vc19zdGFydHNbX19pXSA9IF9fb3Nfc3RhcnRzW19faSAqIDJdOworICAgICAgX19yYW5nZV9sZW5ndGggKj0gMjsKKyAgICB9CisKKyAgLyoqIEBicmllZiBTcGxpdHMgYSBzZXF1ZW5jZSBnaXZlbiBieSBpbnB1dCBpdGVyYXRvcnMgaW50byBwYXJ0cyBvZgorICAgKiBhbG1vc3QgZXF1YWwgc2l6ZQorICAgKgorICAgKiAgVGhlIGZ1bmN0aW9uIG5lZWRzIG9ubHkgb25lIHBhc3Mgb3ZlciB0aGUgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19zdGFydHMgU3RhcnQgaXRlcmF0b3JzIGZvciB0aGUgcmVzdWx0aW5nIHBhcnRzLCBkaW1lbnNpb24KKyAgICogIEBjIF9fbnVtX3BhcnRzKzEuIEZvciBjb252ZW5pZW5jZSwgQGMgX19zdGFydHMgQGMgW19fbnVtX3BhcnRzXQorICAgKiAgY29udGFpbnMgdGhlIGVuZCBpdGVyYXRvciBvZiB0aGUgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19sZW5ndGhzIExlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHBhcnRzLgorICAgKiAgQHBhcmFtIF9fbnVtX3BhcnRzIE51bWJlciBvZiBwYXJ0cyB0byBzcGxpdCB0aGUgc2VxdWVuY2UgaW50by4KKyAgICogIEBwYXJhbSBfX2YgRnVuY3RvciB0byBiZSBhcHBsaWVkIHRvIGVhY2ggZWxlbWVudCBieSB0cmF2ZXJzaW5nIF9faXQKKyAgICogIEBwYXJhbSBfX292ZXJzYW1wbGluZyBPdmVyc2FtcGxpbmcgZmFjdG9yLiBJZiAwLCB0aGVuIHRoZQorICAgKiAgcGFydGl0aW9ucyB3aWxsIGRpZmZlciBpbiBhdCBtb3N0IAorICAgKiAgXHNxcnR7XG1hdGhybXtfX2VuZH0gLSBcbWF0aHJte19fYmVnaW59fSAKKyAgICogIF9fZWxlbWVudHMuIE90aGVyd2lzZSwgdGhlIHJhdGlvIGJldHdlZW4gdGhlCisgICAqICBsb25nZXN0IGFuZCB0aGUgc2hvcnRlc3QgcGFydCBpcyBib3VuZGVkIGJ5CisgICAqICAxLyhcbWF0aHJte19fb3ZlcnNhbXBsaW5nfSBcY2RvdCBcbWF0aHJte251bVxfcGFydHN9KQorICAgKiAgQHJldHVybiBMZW5ndGggb2YgdGhlIHdob2xlIHNlcXVlbmNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfRnVuY3RvclR5cGU+CisgICAgc2l6ZV90CisgICAgbGlzdF9wYXJ0aXRpb24oY29uc3QgX0lJdGVyIF9fYmVnaW4sIGNvbnN0IF9JSXRlciBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICBfSUl0ZXIqIF9fc3RhcnRzLCBzaXplX3QqIF9fbGVuZ3RocywgY29uc3QgaW50IF9fbnVtX3BhcnRzLAorICAgICAgICAgICAgICAgICAgIF9GdW5jdG9yVHlwZSYgX19mLCBpbnQgX19vdmVyc2FtcGxpbmcgPSAwKQorICAgIHsKKyAgICAgIGJvb2wgX19tYWtlX3R3aWNlID0gZmFsc2U7CisKKyAgICAgIC8vIFRoZSByZXNpemluZyBhbGdvcml0aG0gaXMgY2hvc2VuIGFjY29yZGluZyB0byB0aGUgb3ZlcnNhbXBsaW5nIGZhY3Rvci4KKyAgICAgIGlmIChfX292ZXJzYW1wbGluZyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgX19tYWtlX3R3aWNlID0gdHJ1ZTsKKyAgICAgICAgICBfX292ZXJzYW1wbGluZyA9IDE7CisgICAgICAgIH0KKworICAgICAgc3RkOjp2ZWN0b3I8X0lJdGVyPiBfX29zX3N0YXJ0cygyICogX19vdmVyc2FtcGxpbmcgKiBfX251bV9wYXJ0cyArIDEpOworCisgICAgICBfX29zX3N0YXJ0c1swXSA9IF9fYmVnaW47CisgICAgICBfSUl0ZXIgX19wcmV2ICA9IF9fYmVnaW4sIF9faXQgPSBfX2JlZ2luOworICAgICAgc2l6ZV90IF9fZGlzdF9saW1pdCA9IDAsIF9fZGlzdCA9IDA7CisgICAgICBzaXplX3QgX19jdXIgPSAxLCBfX25leHQgPSAxOworICAgICAgc2l6ZV90IF9fcmFuZ2VfbGVuZ3RoID0gMTsKKyAgICAgIHNpemVfdCBfX2NvdW50X3RvX3R3byA9IDA7CisgICAgICB3aGlsZSAoX19pdCAhPSBfX2VuZCkKKyAgICAgICAgeworICAgICAgICAgIF9fY3VyID0gX19uZXh0OworICAgICAgICAgIGZvciAoOyBfX2N1ciA8IF9fb3Nfc3RhcnRzLnNpemUoKSBhbmQgX19pdCAhPSBfX2VuZDsgKytfX2N1cikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZm9yIChfX2Rpc3RfbGltaXQgKz0gX19yYW5nZV9sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgX19kaXN0IDwgX19kaXN0X2xpbWl0IGFuZCBfX2l0ICE9IF9fZW5kOyArK19fZGlzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfX2YoX19pdCk7CisgICAgICAgICAgICAgICAgICArK19faXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBfX29zX3N0YXJ0c1tfX2N1cl0gPSBfX2l0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgLy8gTXVzdCBjb21wYXJlIGZvciBlbmQgYW5kIG5vdCBfX2N1ciA8IF9fb3Nfc3RhcnRzLnNpemUoKSAsIGJlY2F1c2UKKyAgICAgICAgICAvLyBfX2N1ciBjb3VsZCBiZSA9PSBfX29zX3N0YXJ0cy5zaXplKCkgYXMgd2VsbAorICAgICAgICAgIGlmIChfX2l0ID09IF9fZW5kKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBfX3Nocmlua19hbmRfZG91YmxlKF9fb3Nfc3RhcnRzLCBfX2NvdW50X3RvX3R3bywgX19yYW5nZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX21ha2VfdHdpY2UpOworICAgICAgICAgIF9fbmV4dCA9IF9fb3Nfc3RhcnRzLnNpemUoKSAvIDIgKyAxOworICAgICAgICB9CisKKyAgICAgIC8vIENhbGN1bGF0aW9uIG9mIHRoZSBwYXJ0cyAob25lIG11c3QgYmUgZXh0cmFjdGVkIGZyb20gX19jdXJyZW50CisgICAgICAvLyBiZWNhdXNlIHRoZSBwYXJ0aXRpb24gYmVnaW5uaW5nIGF0IGVuZCwgY29uc2lzdHMgb25seSBvZgorICAgICAgLy8gaXRzZWxmKS4KKyAgICAgIHNpemVfdCBfX3NpemVfcGFydCA9IChfX2N1ciAtIDEpIC8gX19udW1fcGFydHM7CisgICAgICBpbnQgX19zaXplX2dyZWF0ZXIgPSBzdGF0aWNfY2FzdDxpbnQ+KChfX2N1ciAtIDEpICUgX19udW1fcGFydHMpOworICAgICAgX19zdGFydHNbMF0gPSBfX29zX3N0YXJ0c1swXTsKKworICAgICAgc2l6ZV90IF9faW5kZXggPSAwOworCisgICAgICAvLyBTbWFsbGVzdCBwYXJ0aXRpb25zLgorICAgICAgZm9yIChpbnQgX19pID0gMTsgX19pIDwgKF9fbnVtX3BhcnRzICsgMSAtIF9fc2l6ZV9ncmVhdGVyKTsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBfX2xlbmd0aHNbX19pIC0gMV0gPSAgX19zaXplX3BhcnQgKiBfX3JhbmdlX2xlbmd0aDsKKyAgICAgICAgICBfX2luZGV4ICs9IF9fc2l6ZV9wYXJ0OworICAgICAgICAgIF9fc3RhcnRzW19faV0gPSBfX29zX3N0YXJ0c1tfX2luZGV4XTsKKyAgICAgICAgfQorCisgICAgICAvLyBCaWdnZXN0IHBhcnRpdGlvbnMuCisgICAgICBmb3IgKGludCBfX2kgPSBfX251bV9wYXJ0cyArIDEgLSBfX3NpemVfZ3JlYXRlcjsgX19pIDw9IF9fbnVtX3BhcnRzOworICAgICAgICAgICArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9fbGVuZ3Roc1tfX2kgLSAxXSA9ICAoX19zaXplX3BhcnQrMSkgKiBfX3JhbmdlX2xlbmd0aDsKKyAgICAgICAgICBfX2luZGV4ICs9IChfX3NpemVfcGFydCsxKTsKKyAgICAgICAgICBfX3N0YXJ0c1tfX2ldID0gX19vc19zdGFydHNbX19pbmRleF07CisgICAgICAgIH0KKworICAgICAgLy8gQ29ycmVjdGlvbiBvZiB0aGUgZW5kIHNpemUgKHRoZSBlbmQgaXRlcmF0aW9uIGhhcyBub3QgZmluaXNoZWQpLgorICAgICAgX19sZW5ndGhzW19fbnVtX3BhcnRzIC0gMV0gLT0gKF9fZGlzdF9saW1pdCAtIF9fZGlzdCk7CisKKyAgICAgIHJldHVybiBfX2Rpc3Q7CisgICAgfQorfQorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfTElTVF9QQVJUSVRJT05fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9sb3NlcnRyZWUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvbG9zZXJ0cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwYTk4ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvbG9zZXJ0cmVlLmgKQEAgLTAsMCArMSwxMDYzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvbG9zZXJ0cmVlLmgKKyogIEBicmllZiBNYW55IGdlbmVyaWMgbG9zZXIgdHJlZSB2YXJpYW50cy4KKyogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorKi8KKworLy8gV3JpdHRlbiBieSBKb2hhbm5lcyBTaW5nbGVyLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX0xPU0VSVFJFRV9ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX0xPU0VSVFJFRV9IIDEKKworI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfZnVuY3Rpb24uaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9mZWF0dXJlcy5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL2Jhc2UuaD4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKgorICAgKiBAYnJpZWYgR3VhcmRlZCBsb3Nlci90b3VybmFtZW50IHRyZWUuCisgICAqCisgICAqIFRoZSBzbWFsbGVzdCBlbGVtZW50IGlzIGF0IHRoZSB0b3AuCisgICAqCisgICAqIEd1YXJkaW5nIGlzIGRvbmUgZXhwbGljaXRseSB0aHJvdWdoIG9uZSBmbGFnIF9NX3N1cCBwZXIgZWxlbWVudCwKKyAgICogaW5mIGlzIG5vdCBuZWVkZWQgZHVlIHRvIGEgYmV0dGVyIGluaXRpYWxpemF0aW9uIHJvdXRpbmUuICBUaGlzCisgICAqIGlzIGEgd2VsbC1wZXJmb3JtaW5nIHZhcmlhbnQuCisgICAqCisgICAqIEBwYXJhbSBfVHAgdGhlIGVsZW1lbnQgdHlwZQorICAgKiBAcGFyYW0gX0NvbXBhcmUgdGhlIGNvbXBhcmF0b3IgdG8gdXNlLCBkZWZhdWx0cyB0byBzdGQ6Omxlc3M8X1RwPgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBjbGFzcyBfTG9zZXJUcmVlQmFzZQorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvKiogQGJyaWVmIEludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgX0xvc2VyVHJlZSBlbGVtZW50LiAqLworICAgICAgc3RydWN0IF9Mb3NlcgorICAgICAgeworCS8qKiBAYnJpZWYgZmxhZywgdHJ1ZSBpZmYgdGhpcyBpcyBhICJtYXhpbXVtIiBfX3NlbnRpbmVsLiAqLworCWJvb2wgX01fc3VwOworCS8qKiBAYnJpZWYgX19pbmRleCBvZiB0aGUgX19zb3VyY2UgX19zZXF1ZW5jZS4gKi8KKwlpbnQgX01fc291cmNlOworCS8qKiBAYnJpZWYgX01fa2V5IG9mIHRoZSBlbGVtZW50IGluIHRoZSBfTG9zZXJUcmVlLiAqLworCV9UcCBfTV9rZXk7CisgICAgICB9OworCisgICAgICB1bnNpZ25lZCBpbnQgX01faWssIF9NX2ssIF9NX29mZnNldDsKKworICAgICAgLyoqIGxvZ18ye19NX2t9ICovCisgICAgICB1bnNpZ25lZCBpbnQgX01fbG9nX2s7CisKKyAgICAgIC8qKiBAYnJpZWYgX0xvc2VyVHJlZSBfX2VsZW1lbnRzLiAqLworICAgICAgX0xvc2VyKiBfTV9sb3NlcnM7CisKKyAgICAgIC8qKiBAYnJpZWYgX0NvbXBhcmUgdG8gdXNlLiAqLworICAgICAgX0NvbXBhcmUgX01fY29tcDsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU3RhdGUgZmxhZyB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgX0xvc2VyVHJlZSBpcyBlbXB0eS4KKyAgICAgICAqCisgICAgICAgKiBPbmx5IHVzZWQgZm9yIGJ1aWxkaW5nIHRoZSBfTG9zZXJUcmVlLgorICAgICAgICovCisgICAgICBib29sIF9NX2ZpcnN0X2luc2VydDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19rIFRoZSBudW1iZXIgb2Ygc2VxdWVuY2VzIHRvIG1lcmdlLgorICAgICAgICogQHBhcmFtIF9fY29tcCBUaGUgY29tcGFyYXRvciB0byB1c2UuCisgICAgICAgKi8KKyAgICAgIF9Mb3NlclRyZWVCYXNlKHVuc2lnbmVkIGludCBfX2ssIF9Db21wYXJlIF9fY29tcCkKKyAgICAgIDogX01fY29tcChfX2NvbXApCisgICAgICB7CisJX01faWsgPSBfX2s7CisKKwkvLyBDb21wdXRlIGxvZ18ye19NX2t9IGZvciB0aGUgX0xvc2VyIFRyZWUKKwlfTV9sb2dfayA9IF9fcmRfbG9nMihfTV9payAtIDEpICsgMTsKKworCS8vIE5leHQgZ3JlYXRlciBwb3dlciBvZiAyLgorCV9NX2sgPSAxIDw8IF9NX2xvZ19rOworCV9NX29mZnNldCA9IF9NX2s7CisKKwkvLyBBdm9pZCBkZWZhdWx0LWNvbnN0cnVjdGluZyBfTV9sb3NlcnNbXS5fTV9rZXkKKwlfTV9sb3NlcnMgPSBzdGF0aWNfY2FzdDxfTG9zZXIqPig6Om9wZXJhdG9yIG5ldygyICogX01faworCQkJCQkJCSogc2l6ZW9mKF9Mb3NlcikpKTsKKwlmb3IgKHVuc2lnbmVkIGludCBfX2kgPSBfTV9payAtIDE7IF9faSA8IF9NX2s7ICsrX19pKQorCSAgX01fbG9zZXJzW19faSArIF9NX2tdLl9NX3N1cCA9IHRydWU7CisKKwlfTV9maXJzdF9pbnNlcnQgPSB0cnVlOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBUaGUgZGVzdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgfl9Mb3NlclRyZWVCYXNlKCkKKyAgICAgIHsKKwlmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAwOyBfX2kgPCAoMiAqIF9NX2spOyArK19faSkKKwkgIF9NX2xvc2Vyc1tfX2ldLn5fTG9zZXIoKTsKKwk6Om9wZXJhdG9yIGRlbGV0ZShfTV9sb3NlcnMpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbml0aWFsaXplcyB0aGUgc2VxdWVuY2UgIl9NX3NvdXJjZSIgd2l0aCB0aGUgZWxlbWVudCAiX19rZXkiLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2tleSB0aGUgZWxlbWVudCB0byBpbnNlcnQKKyAgICAgICAqIEBwYXJhbSBfX3NvdXJjZSBfX2luZGV4IG9mIHRoZSBfX3NvdXJjZSBfX3NlcXVlbmNlCisgICAgICAgKiBAcGFyYW0gX19zdXAgZmxhZyB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgdmFsdWUgdG8gaW5zZXJ0IGlzIGFuCisgICAgICAgKiAgIGV4cGxpY2l0IF9fc3VwcmVtdW0uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIF9faW5zZXJ0X3N0YXJ0KGNvbnN0IF9UcCYgX19rZXksIGludCBfX3NvdXJjZSwgYm9vbCBfX3N1cCkKKyAgICAgIHsKKwl1bnNpZ25lZCBpbnQgX19wb3MgPSBfTV9rICsgX19zb3VyY2U7CisKKwlpZiAoX01fZmlyc3RfaW5zZXJ0KQorCSAgeworCSAgICAvLyBDb25zdHJ1Y3QgYWxsIGtleXMsIHNvIHdlIGNhbiBlYXNpbHkgZGVzdHJ1Y3QgdGhlbS4KKwkgICAgZm9yICh1bnNpZ25lZCBpbnQgX19pID0gMDsgX19pIDwgKDIgKiBfTV9rKTsgKytfX2kpCisJICAgICAgOjpuZXcoJihfTV9sb3NlcnNbX19pXS5fTV9rZXkpKSBfVHAoX19rZXkpOworCSAgICBfTV9maXJzdF9pbnNlcnQgPSBmYWxzZTsKKwkgIH0KKwllbHNlCisJICBfTV9sb3NlcnNbX19wb3NdLl9NX2tleSA9IF9fa2V5OworCisJX01fbG9zZXJzW19fcG9zXS5fTV9zdXAgPSBfX3N1cDsKKwlfTV9sb3NlcnNbX19wb3NdLl9NX3NvdXJjZSA9IF9fc291cmNlOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzZXF1ZW5jZSB3aXRoIHRoZSBzbWFsbGVzdCBlbGVtZW50LgorICAgICAgICovCisgICAgICBpbnQgX19nZXRfbWluX3NvdXJjZSgpCisgICAgICB7IHJldHVybiBfTV9sb3NlcnNbMF0uX01fc291cmNlOyB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEBicmllZiBTdGFibGUgX0xvc2VyVHJlZSB2YXJpYW50LgorICAgICAqCisgICAgICogUHJvdmlkZXMgdGhlIHN0YWJsZSBpbXBsZW1lbnRhdGlvbnMgb2YgaW5zZXJ0X3N0YXJ0LCBfX2luaXRfd2lubmVyLAorICAgICAqIF9faW5pdCBhbmQgX19kZWxldGVfbWluX2luc2VydC4KKyAgICAgKgorICAgICAqIFVuc3RhYmxlIHZhcmlhbnQgaXMgZG9uZSB1c2luZyBwYXJ0aWFsIHNwZWNpYWxpc2F0aW9uIGJlbG93LgorICAgICAqLworICB0ZW1wbGF0ZTxib29sIF9fc3RhYmxlLyogZGVmYXVsdCA9PSB0cnVlICovLCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgY2xhc3MgX0xvc2VyVHJlZQorICAgIDogcHVibGljIF9Mb3NlclRyZWVCYXNlPF9UcCwgX0NvbXBhcmU+CisgICAgeworICAgICAgdHlwZWRlZiBfTG9zZXJUcmVlQmFzZTxfVHAsIF9Db21wYXJlPiBfQmFzZTsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9rOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2NvbXA7CisgICAgICB1c2luZyBfQmFzZTo6X01fbG9zZXJzOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2ZpcnN0X2luc2VydDsKKworICAgIHB1YmxpYzoKKyAgICAgIF9Mb3NlclRyZWUodW5zaWduZWQgaW50IF9faywgX0NvbXBhcmUgX19jb21wKQorICAgICAgOiBfQmFzZTo6X0xvc2VyVHJlZUJhc2UoX19rLCBfX2NvbXApCisgICAgICB7IH0KKworICAgICAgdW5zaWduZWQgaW50CisgICAgICBfX2luaXRfd2lubmVyKHVuc2lnbmVkIGludCBfX3Jvb3QpCisgICAgICB7CisJaWYgKF9fcm9vdCA+PSBfTV9rKQorCSAgcmV0dXJuIF9fcm9vdDsKKwllbHNlCisJICB7CisJICAgIHVuc2lnbmVkIGludCBfX2xlZnQgPSBfX2luaXRfd2lubmVyKDIgKiBfX3Jvb3QpOworCSAgICB1bnNpZ25lZCBpbnQgX19yaWdodCA9IF9faW5pdF93aW5uZXIoMiAqIF9fcm9vdCArIDEpOworCSAgICBpZiAoX01fbG9zZXJzW19fcmlnaHRdLl9NX3N1cAorCQl8fCAoIV9NX2xvc2Vyc1tfX2xlZnRdLl9NX3N1cAorCQkgICAgJiYgIV9NX2NvbXAoX01fbG9zZXJzW19fcmlnaHRdLl9NX2tleSwKKwkJCQlfTV9sb3NlcnNbX19sZWZ0XS5fTV9rZXkpKSkKKwkgICAgICB7CisJCS8vIExlZnQgb25lIGlzIGxlc3Mgb3IgZXF1YWwuCisJCV9NX2xvc2Vyc1tfX3Jvb3RdID0gX01fbG9zZXJzW19fcmlnaHRdOworCQlyZXR1cm4gX19sZWZ0OworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJLy8gUmlnaHQgb25lIGlzIGxlc3MuCisJCV9NX2xvc2Vyc1tfX3Jvb3RdID0gX01fbG9zZXJzW19fbGVmdF07CisJCXJldHVybiBfX3JpZ2h0OworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworICAgICAgdm9pZCBfX2luaXQoKQorICAgICAgeyBfTV9sb3NlcnNbMF0gPSBfTV9sb3NlcnNbX19pbml0X3dpbm5lcigxKV07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRGVsZXRlIHRoZSBzbWFsbGVzdCBlbGVtZW50IGFuZCBpbnNlcnQgYSBuZXcgZWxlbWVudCBmcm9tCisgICAgICAgKiAgIHRoZSBwcmV2aW91c2x5IHNtYWxsZXN0IGVsZW1lbnQncyBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHN0YWJsZS4KKyAgICAgICAqLworICAgICAgLy8gRG8gbm90IHBhc3MgYSBjb25zdCByZWZlcmVuY2Ugc2luY2UgX19rZXkgd2lsbCBiZSB1c2VkIGFzCisgICAgICAvLyBsb2NhbCB2YXJpYWJsZS4KKyAgICAgIHZvaWQKKyAgICAgIF9fZGVsZXRlX21pbl9pbnNlcnQoX1RwIF9fa2V5LCBib29sIF9fc3VwKQorICAgICAgeworICAgICAgICB1c2luZyBzdGQ6OnN3YXA7CisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworCS8vIG5vIGR1bW15IHNlcXVlbmNlIGNhbiBldmVyIGJlIGF0IHRoZSB0b3AhCisJX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9NX2xvc2Vyc1swXS5fTV9zb3VyY2UgIT0gLTEpOworI2VuZGlmCisKKwlpbnQgX19zb3VyY2UgPSBfTV9sb3NlcnNbMF0uX01fc291cmNlOworCWZvciAodW5zaWduZWQgaW50IF9fcG9zID0gKF9NX2sgKyBfX3NvdXJjZSkgLyAyOyBfX3BvcyA+IDA7CisJICAgICBfX3BvcyAvPSAyKQorCSAgeworCSAgICAvLyBUaGUgc21hbGxlciBvbmUgZ2V0cyBwcm9tb3RlZCwgdGllcyBhcmUgYnJva2VuIGJ5IF9NX3NvdXJjZS4KKwkgICAgaWYgKChfX3N1cCAmJiAoIV9NX2xvc2Vyc1tfX3Bvc10uX01fc3VwCisJCQkgICB8fCBfTV9sb3NlcnNbX19wb3NdLl9NX3NvdXJjZSA8IF9fc291cmNlKSkKKwkJfHwgKCFfX3N1cCAmJiAhX01fbG9zZXJzW19fcG9zXS5fTV9zdXAKKwkJICAgICYmICgoX01fY29tcChfTV9sb3NlcnNbX19wb3NdLl9NX2tleSwgX19rZXkpKQorCQkJfHwgKCFfTV9jb21wKF9fa2V5LCBfTV9sb3NlcnNbX19wb3NdLl9NX2tleSkKKwkJCSAgICAmJiBfTV9sb3NlcnNbX19wb3NdLl9NX3NvdXJjZSA8IF9fc291cmNlKSkpKQorCSAgICAgIHsKKwkJLy8gVGhlIG90aGVyIG9uZSBpcyBzbWFsbGVyLgorCQlzdGQ6OnN3YXAoX01fbG9zZXJzW19fcG9zXS5fTV9zdXAsIF9fc3VwKTsKKwkJc3RkOjpzd2FwKF9NX2xvc2Vyc1tfX3Bvc10uX01fc291cmNlLCBfX3NvdXJjZSk7CisJCXN3YXAoX01fbG9zZXJzW19fcG9zXS5fTV9rZXksIF9fa2V5KTsKKwkgICAgICB9CisJICB9CisKKwlfTV9sb3NlcnNbMF0uX01fc3VwID0gX19zdXA7CisJX01fbG9zZXJzWzBdLl9NX3NvdXJjZSA9IF9fc291cmNlOworCV9NX2xvc2Vyc1swXS5fTV9rZXkgPSBfX2tleTsKKyAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogQGJyaWVmIFVuc3RhYmxlIF9Mb3NlclRyZWUgdmFyaWFudC4KKyAgICAgKgorICAgICAqIFN0YWJpbGl0eSAobm9uLXN0YWJsZSBoZXJlKSBpcyBzZWxlY3RlZCB3aXRoIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uCisgICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgY2xhc3MgX0xvc2VyVHJlZTwvKiBfX3N0YWJsZSA9PSAqL2ZhbHNlLCBfVHAsIF9Db21wYXJlPgorICAgIDogcHVibGljIF9Mb3NlclRyZWVCYXNlPF9UcCwgX0NvbXBhcmU+CisgICAgeworICAgICAgdHlwZWRlZiBfTG9zZXJUcmVlQmFzZTxfVHAsIF9Db21wYXJlPiBfQmFzZTsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9sb2dfazsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9rOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2NvbXA7CisgICAgICB1c2luZyBfQmFzZTo6X01fbG9zZXJzOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2ZpcnN0X2luc2VydDsKKworICAgIHB1YmxpYzoKKyAgICAgIF9Mb3NlclRyZWUodW5zaWduZWQgaW50IF9faywgX0NvbXBhcmUgX19jb21wKQorICAgICAgOiBfQmFzZTo6X0xvc2VyVHJlZUJhc2UoX19rLCBfX2NvbXApCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBDb21wdXRlcyB0aGUgd2lubmVyIG9mIHRoZSBjb21wZXRpdGlvbiBhdCBwb3NpdGlvbiAiX19yb290Ii4KKyAgICAgICAqCisgICAgICAgKiBDYWxsZWQgcmVjdXJzaXZlbHkgKHN0YXJ0aW5nIGF0IDApIHRvIGJ1aWxkIHRoZSBpbml0aWFsIHRyZWUuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcm9vdCBfX2luZGV4IG9mIHRoZSAiZ2FtZSIgdG8gc3RhcnQuCisgICAgICAgKi8KKyAgICAgIHVuc2lnbmVkIGludAorICAgICAgX19pbml0X3dpbm5lcih1bnNpZ25lZCBpbnQgX19yb290KQorICAgICAgeworCWlmIChfX3Jvb3QgPj0gX01faykKKwkgIHJldHVybiBfX3Jvb3Q7CisJZWxzZQorCSAgeworCSAgICB1bnNpZ25lZCBpbnQgX19sZWZ0ID0gX19pbml0X3dpbm5lcigyICogX19yb290KTsKKwkgICAgdW5zaWduZWQgaW50IF9fcmlnaHQgPSBfX2luaXRfd2lubmVyKDIgKiBfX3Jvb3QgKyAxKTsKKwkgICAgaWYgKF9NX2xvc2Vyc1tfX3JpZ2h0XS5fTV9zdXAKKwkJfHwgKCFfTV9sb3NlcnNbX19sZWZ0XS5fTV9zdXAKKwkJICAgICYmICFfTV9jb21wKF9NX2xvc2Vyc1tfX3JpZ2h0XS5fTV9rZXksCisJCQkJX01fbG9zZXJzW19fbGVmdF0uX01fa2V5KSkpCisJICAgICAgeworCQkvLyBMZWZ0IG9uZSBpcyBsZXNzIG9yIGVxdWFsLgorCQlfTV9sb3NlcnNbX19yb290XSA9IF9NX2xvc2Vyc1tfX3JpZ2h0XTsKKwkJcmV0dXJuIF9fbGVmdDsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCS8vIFJpZ2h0IG9uZSBpcyBsZXNzLgorCQlfTV9sb3NlcnNbX19yb290XSA9IF9NX2xvc2Vyc1tfX2xlZnRdOworCQlyZXR1cm4gX19yaWdodDsKKwkgICAgICB9CisJICB9CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9faW5pdCgpCisgICAgICB7IF9NX2xvc2Vyc1swXSA9IF9NX2xvc2Vyc1tfX2luaXRfd2lubmVyKDEpXTsgfQorCisgICAgICAvKioKKyAgICAgICAqIERlbGV0ZSB0aGUgX01fa2V5IHNtYWxsZXN0IGVsZW1lbnQgYW5kIGluc2VydCB0aGUgZWxlbWVudCBfX2tleQorICAgICAgICogaW5zdGVhZC4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19rZXkgdGhlIF9NX2tleSB0byBpbnNlcnQKKyAgICAgICAqIEBwYXJhbSBfX3N1cCB0cnVlIGlmZiBfX2tleSBpcyBhbiBleHBsaWNpdGx5IG1hcmtlZCBzdXByZW11bQorICAgICAgICovCisgICAgICAvLyBEbyBub3QgcGFzcyBhIGNvbnN0IHJlZmVyZW5jZSBzaW5jZSBfX2tleSB3aWxsIGJlIHVzZWQgYXMgbG9jYWwKKyAgICAgIC8vIHZhcmlhYmxlLgorICAgICAgdm9pZAorICAgICAgX19kZWxldGVfbWluX2luc2VydChfVHAgX19rZXksIGJvb2wgX19zdXApCisgICAgICB7CisgICAgICAgIHVzaW5nIHN0ZDo6c3dhcDsKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisJLy8gbm8gZHVtbXkgc2VxdWVuY2UgY2FuIGV2ZXIgYmUgYXQgdGhlIHRvcCEKKwlfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX01fbG9zZXJzWzBdLl9NX3NvdXJjZSAhPSAtMSk7CisjZW5kaWYKKworCWludCBfX3NvdXJjZSA9IF9NX2xvc2Vyc1swXS5fTV9zb3VyY2U7CisJZm9yICh1bnNpZ25lZCBpbnQgX19wb3MgPSAoX01fayArIF9fc291cmNlKSAvIDI7IF9fcG9zID4gMDsKKwkgICAgIF9fcG9zIC89IDIpCisJICB7CisJICAgIC8vIFRoZSBzbWFsbGVyIG9uZSBnZXRzIHByb21vdGVkLgorCSAgICBpZiAoX19zdXAgfHwgKCFfTV9sb3NlcnNbX19wb3NdLl9NX3N1cAorCQkJICAmJiBfTV9jb21wKF9NX2xvc2Vyc1tfX3Bvc10uX01fa2V5LCBfX2tleSkpKQorCSAgICAgIHsKKwkJLy8gVGhlIG90aGVyIG9uZSBpcyBzbWFsbGVyLgorCQlzdGQ6OnN3YXAoX01fbG9zZXJzW19fcG9zXS5fTV9zdXAsIF9fc3VwKTsKKwkJc3RkOjpzd2FwKF9NX2xvc2Vyc1tfX3Bvc10uX01fc291cmNlLCBfX3NvdXJjZSk7CisJCXN3YXAoX01fbG9zZXJzW19fcG9zXS5fTV9rZXksIF9fa2V5KTsKKwkgICAgICB9CisJICB9CisKKwlfTV9sb3NlcnNbMF0uX01fc3VwID0gX19zdXA7CisJX01fbG9zZXJzWzBdLl9NX3NvdXJjZSA9IF9fc291cmNlOworCV9NX2xvc2Vyc1swXS5fTV9rZXkgPSBfX2tleTsKKyAgICAgIH0KKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgQmFzZSBjbGFzcyBvZiBfTG9zZXIgVHJlZSBpbXBsZW1lbnRhdGlvbiB1c2luZyBwb2ludGVycy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgY2xhc3MgX0xvc2VyVHJlZVBvaW50ZXJCYXNlCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIC8qKiBAYnJpZWYgSW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgX0xvc2VyVHJlZSBfX2VsZW1lbnRzLiAqLworICAgICAgc3RydWN0IF9Mb3NlcgorICAgICAgeworCWJvb2wgX01fc3VwOworCWludCBfTV9zb3VyY2U7CisJY29uc3QgX1RwKiBfTV9rZXlwOworICAgICAgfTsKKworICAgICAgdW5zaWduZWQgaW50IF9NX2lrLCBfTV9rLCBfTV9vZmZzZXQ7CisgICAgICBfTG9zZXIqIF9NX2xvc2VyczsKKyAgICAgIF9Db21wYXJlIF9NX2NvbXA7CisKKyAgICBwdWJsaWM6CisgICAgICBfTG9zZXJUcmVlUG9pbnRlckJhc2UodW5zaWduZWQgaW50IF9faywKKwkJCSAgICBfQ29tcGFyZSBfX2NvbXAgPSBzdGQ6Omxlc3M8X1RwPigpKQorICAgICAgOiBfTV9jb21wKF9fY29tcCkKKyAgICAgIHsKKwlfTV9payA9IF9fazsKKworCS8vIE5leHQgZ3JlYXRlciBwb3dlciBvZiAyLgorCV9NX2sgPSAxIDw8IChfX3JkX2xvZzIoX01faWsgLSAxKSArIDEpOworCV9NX29mZnNldCA9IF9NX2s7CisJX01fbG9zZXJzID0gbmV3IF9Mb3NlcltfTV9rICogMl07CisJZm9yICh1bnNpZ25lZCBpbnQgX19pID0gX01faWsgLSAxOyBfX2kgPCBfTV9rOyBfX2krKykKKwkgIF9NX2xvc2Vyc1tfX2kgKyBfTV9rXS5fTV9zdXAgPSB0cnVlOworICAgICAgfQorCisgICAgICB+X0xvc2VyVHJlZVBvaW50ZXJCYXNlKCkKKyAgICAgIHsgZGVsZXRlW10gX01fbG9zZXJzOyB9CisKKyAgICAgIGludCBfX2dldF9taW5fc291cmNlKCkKKyAgICAgIHsgcmV0dXJuIF9NX2xvc2Vyc1swXS5fTV9zb3VyY2U7IH0KKworICAgICAgdm9pZCBfX2luc2VydF9zdGFydChjb25zdCBfVHAmIF9fa2V5LCBpbnQgX19zb3VyY2UsIGJvb2wgX19zdXApCisgICAgICB7CisJdW5zaWduZWQgaW50IF9fcG9zID0gX01fayArIF9fc291cmNlOworCisJX01fbG9zZXJzW19fcG9zXS5fTV9zdXAgPSBfX3N1cDsKKwlfTV9sb3NlcnNbX19wb3NdLl9NX3NvdXJjZSA9IF9fc291cmNlOworCV9NX2xvc2Vyc1tfX3Bvc10uX01fa2V5cCA9ICZfX2tleTsKKyAgICAgIH0KKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgU3RhYmxlIF9Mb3NlclRyZWUgaW1wbGVtZW50YXRpb24uCisgICAqCisgICAqIFRoZSB1bnN0YWJsZSB2YXJpYW50IGlzIGltcGxlbWVudGVkIHVzaW5nIHBhcnRpYWwgaW5zdGFudGlhdGlvbiBiZWxvdy4KKyAgICovCisgIHRlbXBsYXRlPGJvb2wgX19zdGFibGUvKiBkZWZhdWx0ID09IHRydWUgKi8sIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgY2xhc3MgX0xvc2VyVHJlZVBvaW50ZXIKKyAgICA6IHB1YmxpYyBfTG9zZXJUcmVlUG9pbnRlckJhc2U8X1RwLCBfQ29tcGFyZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9Mb3NlclRyZWVQb2ludGVyQmFzZTxfVHAsIF9Db21wYXJlPiBfQmFzZTsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9rOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2NvbXA7CisgICAgICB1c2luZyBfQmFzZTo6X01fbG9zZXJzOworCisgICAgcHVibGljOgorICAgICAgX0xvc2VyVHJlZVBvaW50ZXIodW5zaWduZWQgaW50IF9faywgX0NvbXBhcmUgX19jb21wID0gc3RkOjpsZXNzPF9UcD4oKSkKKyAgICAgIDogX0Jhc2U6Ol9Mb3NlclRyZWVQb2ludGVyQmFzZShfX2ssIF9fY29tcCkKKyAgICAgIHsgfQorCisgICAgICB1bnNpZ25lZCBpbnQKKyAgICAgIF9faW5pdF93aW5uZXIodW5zaWduZWQgaW50IF9fcm9vdCkKKyAgICAgIHsKKwlpZiAoX19yb290ID49IF9NX2spCisJICByZXR1cm4gX19yb290OworCWVsc2UKKwkgIHsKKwkgICAgdW5zaWduZWQgaW50IF9fbGVmdCA9IF9faW5pdF93aW5uZXIoMiAqIF9fcm9vdCk7CisJICAgIHVuc2lnbmVkIGludCBfX3JpZ2h0ID0gX19pbml0X3dpbm5lcigyICogX19yb290ICsgMSk7CisJICAgIGlmIChfTV9sb3NlcnNbX19yaWdodF0uX01fc3VwCisJCXx8ICghX01fbG9zZXJzW19fbGVmdF0uX01fc3VwCisJCSAgICAmJiAhX01fY29tcCgqX01fbG9zZXJzW19fcmlnaHRdLl9NX2tleXAsCisJCQkJKl9NX2xvc2Vyc1tfX2xlZnRdLl9NX2tleXApKSkKKwkgICAgICB7CisJCS8vIExlZnQgb25lIGlzIGxlc3Mgb3IgZXF1YWwuCisJCV9NX2xvc2Vyc1tfX3Jvb3RdID0gX01fbG9zZXJzW19fcmlnaHRdOworCQlyZXR1cm4gX19sZWZ0OworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJLy8gUmlnaHQgb25lIGlzIGxlc3MuCisJCV9NX2xvc2Vyc1tfX3Jvb3RdID0gX01fbG9zZXJzW19fbGVmdF07CisJCXJldHVybiBfX3JpZ2h0OworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworICAgICAgdm9pZCBfX2luaXQoKQorICAgICAgeyBfTV9sb3NlcnNbMF0gPSBfTV9sb3NlcnNbX19pbml0X3dpbm5lcigxKV07IH0KKworICAgICAgdm9pZCBfX2RlbGV0ZV9taW5faW5zZXJ0KGNvbnN0IF9UcCYgX19rZXksIGJvb2wgX19zdXApCisgICAgICB7CisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworCS8vIG5vIGR1bW15IHNlcXVlbmNlIGNhbiBldmVyIGJlIGF0IHRoZSB0b3AhCisJX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9NX2xvc2Vyc1swXS5fTV9zb3VyY2UgIT0gLTEpOworI2VuZGlmCisKKwljb25zdCBfVHAqIF9fa2V5cCA9ICZfX2tleTsKKwlpbnQgX19zb3VyY2UgPSBfTV9sb3NlcnNbMF0uX01fc291cmNlOworCWZvciAodW5zaWduZWQgaW50IF9fcG9zID0gKF9NX2sgKyBfX3NvdXJjZSkgLyAyOyBfX3BvcyA+IDA7CisJICAgICBfX3BvcyAvPSAyKQorCSAgeworCSAgICAvLyBUaGUgc21hbGxlciBvbmUgZ2V0cyBwcm9tb3RlZCwgdGllcyBhcmUgYnJva2VuIGJ5IF9fc291cmNlLgorCSAgICBpZiAoKF9fc3VwICYmICghX01fbG9zZXJzW19fcG9zXS5fTV9zdXAKKwkJCSAgIHx8IF9NX2xvc2Vyc1tfX3Bvc10uX01fc291cmNlIDwgX19zb3VyY2UpKQorCQl8fCAoIV9fc3VwICYmICFfTV9sb3NlcnNbX19wb3NdLl9NX3N1cCAmJgorCQkgICAgKChfTV9jb21wKCpfTV9sb3NlcnNbX19wb3NdLl9NX2tleXAsICpfX2tleXApKQorCQkgICAgIHx8ICghX01fY29tcCgqX19rZXlwLCAqX01fbG9zZXJzW19fcG9zXS5fTV9rZXlwKQorCQkJICYmIF9NX2xvc2Vyc1tfX3Bvc10uX01fc291cmNlIDwgX19zb3VyY2UpKSkpCisJICAgICAgeworCQkvLyBUaGUgb3RoZXIgb25lIGlzIHNtYWxsZXIuCisJCXN0ZDo6c3dhcChfTV9sb3NlcnNbX19wb3NdLl9NX3N1cCwgX19zdXApOworCQlzdGQ6OnN3YXAoX01fbG9zZXJzW19fcG9zXS5fTV9zb3VyY2UsIF9fc291cmNlKTsKKwkJc3RkOjpzd2FwKF9NX2xvc2Vyc1tfX3Bvc10uX01fa2V5cCwgX19rZXlwKTsKKwkgICAgICB9CisJICB9CisKKwlfTV9sb3NlcnNbMF0uX01fc3VwID0gX19zdXA7CisJX01fbG9zZXJzWzBdLl9NX3NvdXJjZSA9IF9fc291cmNlOworCV9NX2xvc2Vyc1swXS5fTV9rZXlwID0gX19rZXlwOworICAgICAgfQorICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBVbnN0YWJsZSBfTG9zZXJUcmVlIGltcGxlbWVudGF0aW9uLgorICAgKgorICAgKiBUaGUgc3RhYmxlIHZhcmlhbnQgaXMgYWJvdmUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGNsYXNzIF9Mb3NlclRyZWVQb2ludGVyPC8qIF9fc3RhYmxlID09ICovZmFsc2UsIF9UcCwgX0NvbXBhcmU+CisgICAgOiBwdWJsaWMgX0xvc2VyVHJlZVBvaW50ZXJCYXNlPF9UcCwgX0NvbXBhcmU+CisgICAgeworICAgICAgdHlwZWRlZiBfTG9zZXJUcmVlUG9pbnRlckJhc2U8X1RwLCBfQ29tcGFyZT4gX0Jhc2U7CisgICAgICB1c2luZyBfQmFzZTo6X01fazsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9jb21wOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2xvc2VyczsKKworICAgIHB1YmxpYzoKKyAgICAgIF9Mb3NlclRyZWVQb2ludGVyKHVuc2lnbmVkIGludCBfX2ssIF9Db21wYXJlIF9fY29tcCA9IHN0ZDo6bGVzczxfVHA+KCkpCisgICAgICA6IF9CYXNlOjpfTG9zZXJUcmVlUG9pbnRlckJhc2UoX19rLCBfX2NvbXApCisgICAgICB7IH0KKworICAgICAgdW5zaWduZWQgaW50CisgICAgICBfX2luaXRfd2lubmVyKHVuc2lnbmVkIGludCBfX3Jvb3QpCisgICAgICB7CisJaWYgKF9fcm9vdCA+PSBfTV9rKQorCSAgcmV0dXJuIF9fcm9vdDsKKwllbHNlCisJICB7CisJICAgIHVuc2lnbmVkIGludCBfX2xlZnQgPSBfX2luaXRfd2lubmVyKDIgKiBfX3Jvb3QpOworCSAgICB1bnNpZ25lZCBpbnQgX19yaWdodCA9IF9faW5pdF93aW5uZXIoMiAqIF9fcm9vdCArIDEpOworCSAgICBpZiAoX01fbG9zZXJzW19fcmlnaHRdLl9NX3N1cAorICAgICAgICAJfHwgKCFfTV9sb3NlcnNbX19sZWZ0XS5fTV9zdXAKKwkJICAgICYmICFfTV9jb21wKCpfTV9sb3NlcnNbX19yaWdodF0uX01fa2V5cCwKKwkJCQkqX01fbG9zZXJzW19fbGVmdF0uX01fa2V5cCkpKQorCSAgICAgIHsKKwkJLy8gTGVmdCBvbmUgaXMgbGVzcyBvciBlcXVhbC4KKwkJX01fbG9zZXJzW19fcm9vdF0gPSBfTV9sb3NlcnNbX19yaWdodF07CisJCXJldHVybiBfX2xlZnQ7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQkvLyBSaWdodCBvbmUgaXMgbGVzcy4KKwkJX01fbG9zZXJzW19fcm9vdF0gPSBfTV9sb3NlcnNbX19sZWZ0XTsKKwkJcmV0dXJuIF9fcmlnaHQ7CisJICAgICAgfQorCSAgfQorICAgICAgfQorCisgICAgICB2b2lkIF9faW5pdCgpCisgICAgICB7IF9NX2xvc2Vyc1swXSA9IF9NX2xvc2Vyc1tfX2luaXRfd2lubmVyKDEpXTsgfQorCisgICAgICB2b2lkIF9fZGVsZXRlX21pbl9pbnNlcnQoY29uc3QgX1RwJiBfX2tleSwgYm9vbCBfX3N1cCkKKyAgICAgIHsKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisJLy8gbm8gZHVtbXkgc2VxdWVuY2UgY2FuIGV2ZXIgYmUgYXQgdGhlIHRvcCEKKwlfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX01fbG9zZXJzWzBdLl9NX3NvdXJjZSAhPSAtMSk7CisjZW5kaWYKKworCWNvbnN0IF9UcCogX19rZXlwID0gJl9fa2V5OworCWludCBfX3NvdXJjZSA9IF9NX2xvc2Vyc1swXS5fTV9zb3VyY2U7CisJZm9yICh1bnNpZ25lZCBpbnQgX19wb3MgPSAoX01fayArIF9fc291cmNlKSAvIDI7IF9fcG9zID4gMDsKKwkgICAgIF9fcG9zIC89IDIpCisJICB7CisJICAgIC8vIFRoZSBzbWFsbGVyIG9uZSBnZXRzIHByb21vdGVkLgorCSAgICBpZiAoX19zdXAgfHwgKCFfTV9sb3NlcnNbX19wb3NdLl9NX3N1cAorCQkJICAmJiBfTV9jb21wKCpfTV9sb3NlcnNbX19wb3NdLl9NX2tleXAsICpfX2tleXApKSkKKwkgICAgICB7CisJCS8vIFRoZSBvdGhlciBvbmUgaXMgc21hbGxlci4KKwkJc3RkOjpzd2FwKF9NX2xvc2Vyc1tfX3Bvc10uX01fc3VwLCBfX3N1cCk7CisJCXN0ZDo6c3dhcChfTV9sb3NlcnNbX19wb3NdLl9NX3NvdXJjZSwgX19zb3VyY2UpOworCQlzdGQ6OnN3YXAoX01fbG9zZXJzW19fcG9zXS5fTV9rZXlwLCBfX2tleXApOworCSAgICAgIH0KKwkgIH0KKworCV9NX2xvc2Vyc1swXS5fTV9zdXAgPSBfX3N1cDsKKwlfTV9sb3NlcnNbMF0uX01fc291cmNlID0gX19zb3VyY2U7CisJX01fbG9zZXJzWzBdLl9NX2tleXAgPSBfX2tleXA7CisgICAgICB9CisgICAgfTsKKworICAvKiogQGJyaWVmIEJhc2UgY2xhc3MgZm9yIHVuZ3VhcmRlZCBfTG9zZXJUcmVlIGltcGxlbWVudGF0aW9uLgorICAgKiAKKyAgICogVGhlIHdob2xlIGVsZW1lbnQgaXMgY29waWVkIGludG8gdGhlIHRyZWUgc3RydWN0dXJlLgorICAgKgorICAgKiBObyBndWFyZGluZyBpcyBkb25lLCB0aGVyZWZvcmUgbm90IGEgc2luZ2xlIGlucHV0IHNlcXVlbmNlIG11c3QKKyAgICogcnVuIGVtcHR5LiAgVW51c2VkIF9fc2VxdWVuY2UgaGVhZHMgYXJlIG1hcmtlZCB3aXRoIGEgc2VudGluZWwgd2hpY2gKKyAgICogaXMgJmd0OyBhbGwgZWxlbWVudHMgdGhhdCBhcmUgdG8gYmUgbWVyZ2VkLgorICAgKgorICAgKiBUaGlzIGlzIGEgdmVyeSBmYXN0IHZhcmlhbnQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGNsYXNzIF9Mb3NlclRyZWVVbmd1YXJkZWRCYXNlCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHN0cnVjdCBfTG9zZXIKKyAgICAgIHsKKwlpbnQgX01fc291cmNlOworCV9UcCBfTV9rZXk7CisgICAgICB9OworCisgICAgICB1bnNpZ25lZCBpbnQgX01faWssIF9NX2ssIF9NX29mZnNldDsKKyAgICAgIF9Mb3NlciogX01fbG9zZXJzOworICAgICAgX0NvbXBhcmUgX01fY29tcDsKKworICAgIHB1YmxpYzoKKyAgICAgIF9Mb3NlclRyZWVVbmd1YXJkZWRCYXNlKHVuc2lnbmVkIGludCBfX2ssIGNvbnN0IF9UcCYgX19zZW50aW5lbCwKKwkJCSAgICAgIF9Db21wYXJlIF9fY29tcCA9IHN0ZDo6bGVzczxfVHA+KCkpCisgICAgICA6IF9NX2NvbXAoX19jb21wKQorICAgICAgeworCV9NX2lrID0gX19rOworCisJLy8gTmV4dCBncmVhdGVyIHBvd2VyIG9mIDIuCisJX01fayA9IDEgPDwgKF9fcmRfbG9nMihfTV9payAtIDEpICsgMSk7CisJX01fb2Zmc2V0ID0gX01fazsKKwkvLyBBdm9pZCBkZWZhdWx0LWNvbnN0cnVjdGluZyBfTV9sb3NlcnNbXS5fTV9rZXkKKwlfTV9sb3NlcnMgPSBzdGF0aWNfY2FzdDxfTG9zZXIqPig6Om9wZXJhdG9yIG5ldygyICogX01faworCQkJCQkJCSogc2l6ZW9mKF9Mb3NlcikpKTsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAwOyBfX2kgPCBfTV9rOyArK19faSkKKyAgICAgICAgICB7CisJICAgIDo6bmV3KCYoX01fbG9zZXJzW19faV0uX01fa2V5KSkgX1RwKF9fc2VudGluZWwpOworCSAgICBfTV9sb3NlcnNbX19pXS5fTV9zb3VyY2UgPSAtMTsKKwkgIH0KKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19pID0gX01fayArIF9NX2lrIC0gMTsgX19pIDwgKDIgKiBfTV9rKTsgKytfX2kpCisgICAgICAgICAgeworCSAgICA6Om5ldygmKF9NX2xvc2Vyc1tfX2ldLl9NX2tleSkpIF9UcChfX3NlbnRpbmVsKTsKKwkgICAgX01fbG9zZXJzW19faV0uX01fc291cmNlID0gLTE7CisJICB9CisgICAgICB9CisKKyAgICAgIH5fTG9zZXJUcmVlVW5ndWFyZGVkQmFzZSgpCisgICAgICB7CisJZm9yICh1bnNpZ25lZCBpbnQgX19pID0gMDsgX19pIDwgKDIgKiBfTV9rKTsgKytfX2kpCisJICBfTV9sb3NlcnNbX19pXS5+X0xvc2VyKCk7CisJOjpvcGVyYXRvciBkZWxldGUoX01fbG9zZXJzKTsKKyAgICAgIH0KKworICAgICAgaW50CisgICAgICBfX2dldF9taW5fc291cmNlKCkKKyAgICAgIHsKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisJLy8gbm8gZHVtbXkgc2VxdWVuY2UgY2FuIGV2ZXIgYmUgYXQgdGhlIHRvcCEKKwlfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX01fbG9zZXJzWzBdLl9NX3NvdXJjZSAhPSAtMSk7CisjZW5kaWYKKwlyZXR1cm4gX01fbG9zZXJzWzBdLl9NX3NvdXJjZTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX19pbnNlcnRfc3RhcnQoY29uc3QgX1RwJiBfX2tleSwgaW50IF9fc291cmNlLCBib29sKQorICAgICAgeworCXVuc2lnbmVkIGludCBfX3BvcyA9IF9NX2sgKyBfX3NvdXJjZTsKKworCTo6bmV3KCYoX01fbG9zZXJzW19fcG9zXS5fTV9rZXkpKSBfVHAoX19rZXkpOworCV9NX2xvc2Vyc1tfX3Bvc10uX01fc291cmNlID0gX19zb3VyY2U7CisgICAgICB9CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFN0YWJsZSBpbXBsZW1lbnRhdGlvbiBvZiB1bmd1YXJkZWQgX0xvc2VyVHJlZS4KKyAgICoKKyAgICogVW5zdGFibGUgdmFyaWFudCBpcyBzZWxlY3RlZCBiZWxvdyB3aXRoIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uCisgICAqLworICB0ZW1wbGF0ZTxib29sIF9fc3RhYmxlLyogZGVmYXVsdCA9PSB0cnVlICovLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGNsYXNzIF9Mb3NlclRyZWVVbmd1YXJkZWQKKyAgICA6IHB1YmxpYyBfTG9zZXJUcmVlVW5ndWFyZGVkQmFzZTxfVHAsIF9Db21wYXJlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0xvc2VyVHJlZVVuZ3VhcmRlZEJhc2U8X1RwLCBfQ29tcGFyZT4gX0Jhc2U7CisgICAgICB1c2luZyBfQmFzZTo6X01fazsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9jb21wOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2xvc2VyczsKKworICBwdWJsaWM6CisgICAgICBfTG9zZXJUcmVlVW5ndWFyZGVkKHVuc2lnbmVkIGludCBfX2ssIGNvbnN0IF9UcCYgX19zZW50aW5lbCwKKwkJCSAgX0NvbXBhcmUgX19jb21wID0gc3RkOjpsZXNzPF9UcD4oKSkKKyAgICAgIDogX0Jhc2U6Ol9Mb3NlclRyZWVVbmd1YXJkZWRCYXNlKF9faywgX19zZW50aW5lbCwgX19jb21wKQorICAgICAgeyB9CisKKyAgICAgIHVuc2lnbmVkIGludAorICAgICAgX19pbml0X3dpbm5lcih1bnNpZ25lZCBpbnQgX19yb290KQorICAgICAgeworCWlmIChfX3Jvb3QgPj0gX01faykKKwkgIHJldHVybiBfX3Jvb3Q7CisJZWxzZQorCSAgeworCSAgICB1bnNpZ25lZCBpbnQgX19sZWZ0ID0gX19pbml0X3dpbm5lcigyICogX19yb290KTsKKwkgICAgdW5zaWduZWQgaW50IF9fcmlnaHQgPSBfX2luaXRfd2lubmVyKDIgKiBfX3Jvb3QgKyAxKTsKKwkgICAgaWYgKCFfTV9jb21wKF9NX2xvc2Vyc1tfX3JpZ2h0XS5fTV9rZXksCisJCQkgX01fbG9zZXJzW19fbGVmdF0uX01fa2V5KSkKKwkgICAgICB7CisJCS8vIExlZnQgb25lIGlzIGxlc3Mgb3IgZXF1YWwuCisJCV9NX2xvc2Vyc1tfX3Jvb3RdID0gX01fbG9zZXJzW19fcmlnaHRdOworCQlyZXR1cm4gX19sZWZ0OworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJLy8gUmlnaHQgb25lIGlzIGxlc3MuCisJCV9NX2xvc2Vyc1tfX3Jvb3RdID0gX01fbG9zZXJzW19fbGVmdF07CisJCXJldHVybiBfX3JpZ2h0OworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX19pbml0KCkKKyAgICAgIHsKKwlfTV9sb3NlcnNbMF0gPSBfTV9sb3NlcnNbX19pbml0X3dpbm5lcigxKV07CisKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisJLy8gbm8gZHVtbXkgc2VxdWVuY2UgY2FuIGV2ZXIgYmUgYXQgdGhlIHRvcCBhdCB0aGUgYmVnaW5uaW5nCisJLy8gKDAgc2VxdWVuY2VzISkKKwlfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX01fbG9zZXJzWzBdLl9NX3NvdXJjZSAhPSAtMSk7CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgLy8gRG8gbm90IHBhc3MgYSBjb25zdCByZWZlcmVuY2Ugc2luY2UgX19rZXkgd2lsbCBiZSB1c2VkIGFzCisgICAgICAvLyBsb2NhbCB2YXJpYWJsZS4KKyAgICAgIHZvaWQKKyAgICAgIF9fZGVsZXRlX21pbl9pbnNlcnQoX1RwIF9fa2V5LCBib29sKQorICAgICAgeworICAgICAgICB1c2luZyBzdGQ6OnN3YXA7CisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworCS8vIG5vIGR1bW15IHNlcXVlbmNlIGNhbiBldmVyIGJlIGF0IHRoZSB0b3AhCisJX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9NX2xvc2Vyc1swXS5fTV9zb3VyY2UgIT0gLTEpOworI2VuZGlmCisKKwlpbnQgX19zb3VyY2UgPSBfTV9sb3NlcnNbMF0uX01fc291cmNlOworCWZvciAodW5zaWduZWQgaW50IF9fcG9zID0gKF9NX2sgKyBfX3NvdXJjZSkgLyAyOyBfX3BvcyA+IDA7CisJICAgICBfX3BvcyAvPSAyKQorCSAgeworCSAgICAvLyBUaGUgc21hbGxlciBvbmUgZ2V0cyBwcm9tb3RlZCwgdGllcyBhcmUgYnJva2VuIGJ5IF9NX3NvdXJjZS4KKwkgICAgaWYgKF9NX2NvbXAoX01fbG9zZXJzW19fcG9zXS5fTV9rZXksIF9fa2V5KQorICAgICAgICAJfHwgKCFfTV9jb21wKF9fa2V5LCBfTV9sb3NlcnNbX19wb3NdLl9NX2tleSkKKyAgICAgICAgICAgICAgICAgICAgJiYgX01fbG9zZXJzW19fcG9zXS5fTV9zb3VyY2UgPCBfX3NvdXJjZSkpCisJICAgICAgeworCQkvLyBUaGUgb3RoZXIgb25lIGlzIHNtYWxsZXIuCisJCXN0ZDo6c3dhcChfTV9sb3NlcnNbX19wb3NdLl9NX3NvdXJjZSwgX19zb3VyY2UpOworCQlzd2FwKF9NX2xvc2Vyc1tfX3Bvc10uX01fa2V5LCBfX2tleSk7CisJICAgICAgfQorCSAgfQorCisJX01fbG9zZXJzWzBdLl9NX3NvdXJjZSA9IF9fc291cmNlOworCV9NX2xvc2Vyc1swXS5fTV9rZXkgPSBfX2tleTsKKyAgICAgIH0KKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgTm9uLVN0YWJsZSBpbXBsZW1lbnRhdGlvbiBvZiB1bmd1YXJkZWQgX0xvc2VyVHJlZS4KKyAgICoKKyAgICogU3RhYmxlIGltcGxlbWVudGF0aW9uIGlzIGFib3ZlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBjbGFzcyBfTG9zZXJUcmVlVW5ndWFyZGVkPC8qIF9fc3RhYmxlID09ICovZmFsc2UsIF9UcCwgX0NvbXBhcmU+CisgICAgOiBwdWJsaWMgX0xvc2VyVHJlZVVuZ3VhcmRlZEJhc2U8X1RwLCBfQ29tcGFyZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9Mb3NlclRyZWVVbmd1YXJkZWRCYXNlPF9UcCwgX0NvbXBhcmU+IF9CYXNlOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2s7CisgICAgICB1c2luZyBfQmFzZTo6X01fY29tcDsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9sb3NlcnM7CisKKyAgICBwdWJsaWM6CisgICAgICBfTG9zZXJUcmVlVW5ndWFyZGVkKHVuc2lnbmVkIGludCBfX2ssIGNvbnN0IF9UcCYgX19zZW50aW5lbCwKKwkJCSAgX0NvbXBhcmUgX19jb21wID0gc3RkOjpsZXNzPF9UcD4oKSkKKyAgICAgIDogX0Jhc2U6Ol9Mb3NlclRyZWVVbmd1YXJkZWRCYXNlKF9faywgX19zZW50aW5lbCwgX19jb21wKQorICAgICAgeyB9CisKKyAgICAgIHVuc2lnbmVkIGludAorICAgICAgX19pbml0X3dpbm5lcih1bnNpZ25lZCBpbnQgX19yb290KQorICAgICAgeworCWlmIChfX3Jvb3QgPj0gX01faykKKwkgIHJldHVybiBfX3Jvb3Q7CisJZWxzZQorCSAgeworCSAgICB1bnNpZ25lZCBpbnQgX19sZWZ0ID0gX19pbml0X3dpbm5lcigyICogX19yb290KTsKKwkgICAgdW5zaWduZWQgaW50IF9fcmlnaHQgPSBfX2luaXRfd2lubmVyKDIgKiBfX3Jvb3QgKyAxKTsKKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKwkgICAgLy8gSWYgX19sZWZ0IG9uZSBpcyBzZW50aW5lbCB0aGVuIF9fcmlnaHQgb25lIG11c3QgYmUsIHRvby4KKwkgICAgaWYgKF9NX2xvc2Vyc1tfX2xlZnRdLl9NX3NvdXJjZSA9PSAtMSkKKwkgICAgICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX01fbG9zZXJzW19fcmlnaHRdLl9NX3NvdXJjZSA9PSAtMSk7CisjZW5kaWYKKworCSAgICBpZiAoIV9NX2NvbXAoX01fbG9zZXJzW19fcmlnaHRdLl9NX2tleSwKKwkJCSBfTV9sb3NlcnNbX19sZWZ0XS5fTV9rZXkpKQorCSAgICAgIHsKKwkJLy8gTGVmdCBvbmUgaXMgbGVzcyBvciBlcXVhbC4KKwkJX01fbG9zZXJzW19fcm9vdF0gPSBfTV9sb3NlcnNbX19yaWdodF07CisJCXJldHVybiBfX2xlZnQ7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQkvLyBSaWdodCBvbmUgaXMgbGVzcy4KKwkJX01fbG9zZXJzW19fcm9vdF0gPSBfTV9sb3NlcnNbX19sZWZ0XTsKKwkJcmV0dXJuIF9fcmlnaHQ7CisJICAgICAgfQorCSAgfQorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfX2luaXQoKQorICAgICAgeworCV9NX2xvc2Vyc1swXSA9IF9NX2xvc2Vyc1tfX2luaXRfd2lubmVyKDEpXTsKKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKwkvLyBubyBkdW1teSBzZXF1ZW5jZSBjYW4gZXZlciBiZSBhdCB0aGUgdG9wIGF0IHRoZSBiZWdpbm5pbmcKKwkvLyAoMCBzZXF1ZW5jZXMhKQorCV9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfTV9sb3NlcnNbMF0uX01fc291cmNlICE9IC0xKTsKKyNlbmRpZgorICAgICAgfQorCisgICAgICAvLyBEbyBub3QgcGFzcyBhIGNvbnN0IHJlZmVyZW5jZSBzaW5jZSBfX2tleSB3aWxsIGJlIHVzZWQgYXMKKyAgICAgIC8vIGxvY2FsIHZhcmlhYmxlLgorICAgICAgdm9pZAorICAgICAgX19kZWxldGVfbWluX2luc2VydChfVHAgX19rZXksIGJvb2wpCisgICAgICB7CisgICAgICAgIHVzaW5nIHN0ZDo6c3dhcDsKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisJLy8gbm8gZHVtbXkgc2VxdWVuY2UgY2FuIGV2ZXIgYmUgYXQgdGhlIHRvcCEKKwlfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX01fbG9zZXJzWzBdLl9NX3NvdXJjZSAhPSAtMSk7CisjZW5kaWYKKworCWludCBfX3NvdXJjZSA9IF9NX2xvc2Vyc1swXS5fTV9zb3VyY2U7CisJZm9yICh1bnNpZ25lZCBpbnQgX19wb3MgPSAoX01fayArIF9fc291cmNlKSAvIDI7IF9fcG9zID4gMDsKKwkgICAgIF9fcG9zIC89IDIpCisJICB7CisJICAgIC8vIFRoZSBzbWFsbGVyIG9uZSBnZXRzIHByb21vdGVkLgorCSAgICBpZiAoX01fY29tcChfTV9sb3NlcnNbX19wb3NdLl9NX2tleSwgX19rZXkpKQorCSAgICAgIHsKKwkJLy8gVGhlIG90aGVyIG9uZSBpcyBzbWFsbGVyLgorCQlzdGQ6OnN3YXAoX01fbG9zZXJzW19fcG9zXS5fTV9zb3VyY2UsIF9fc291cmNlKTsKKwkJc3dhcChfTV9sb3NlcnNbX19wb3NdLl9NX2tleSwgX19rZXkpOworCSAgICAgIH0KKwkgIH0KKworCV9NX2xvc2Vyc1swXS5fTV9zb3VyY2UgPSBfX3NvdXJjZTsKKwlfTV9sb3NlcnNbMF0uX01fa2V5ID0gX19rZXk7CisgICAgICB9CisgICAgfTsKKworICAvKiogQGJyaWVmIFVuZ3VhcmRlZCBsb3NlciB0cmVlLCBrZWVwaW5nIG9ubHkgcG9pbnRlcnMgdG8gdGhlCisgICogZWxlbWVudHMgaW4gdGhlIHRyZWUgc3RydWN0dXJlLgorICAqCisgICogIE5vIGd1YXJkaW5nIGlzIGRvbmUsIHRoZXJlZm9yZSBub3QgYSBzaW5nbGUgaW5wdXQgc2VxdWVuY2UgbXVzdAorICAqICBydW4gZW1wdHkuICBUaGlzIGlzIGEgdmVyeSBmYXN0IHZhcmlhbnQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgY2xhc3MgX0xvc2VyVHJlZVBvaW50ZXJVbmd1YXJkZWRCYXNlCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHN0cnVjdCBfTG9zZXIKKyAgICAgIHsKKwlpbnQgX01fc291cmNlOworCWNvbnN0IF9UcCogX01fa2V5cDsKKyAgICAgIH07CisKKyAgICAgIHVuc2lnbmVkIGludCBfTV9paywgX01faywgX01fb2Zmc2V0OworICAgICAgX0xvc2VyKiBfTV9sb3NlcnM7CisgICAgICBfQ29tcGFyZSBfTV9jb21wOworCisgICAgcHVibGljOgorCisgICAgICBfTG9zZXJUcmVlUG9pbnRlclVuZ3VhcmRlZEJhc2UodW5zaWduZWQgaW50IF9faywgY29uc3QgX1RwJiBfX3NlbnRpbmVsLAorCQkJCSAgICAgX0NvbXBhcmUgX19jb21wID0gc3RkOjpsZXNzPF9UcD4oKSkKKyAgICAgIDogX01fY29tcChfX2NvbXApCisgICAgICB7CisJX01faWsgPSBfX2s7CisKKwkvLyBOZXh0IGdyZWF0ZXIgcG93ZXIgb2YgMi4KKwlfTV9rID0gMSA8PCAoX19yZF9sb2cyKF9NX2lrIC0gMSkgKyAxKTsKKwlfTV9vZmZzZXQgPSBfTV9rOworCS8vIEF2b2lkIGRlZmF1bHQtY29uc3RydWN0aW5nIF9NX2xvc2Vyc1tdLl9NX2tleQorCV9NX2xvc2VycyA9IG5ldyBfTG9zZXJbMiAqIF9NX2tdOworCisJZm9yICh1bnNpZ25lZCBpbnQgX19pID0gX01fayArIF9NX2lrIC0gMTsgX19pIDwgKDIgKiBfTV9rKTsgKytfX2kpCisJICB7CisJICAgIF9NX2xvc2Vyc1tfX2ldLl9NX2tleXAgPSAmX19zZW50aW5lbDsKKwkgICAgX01fbG9zZXJzW19faV0uX01fc291cmNlID0gLTE7CisJICB9CisgICAgICB9CisKKyAgICAgIH5fTG9zZXJUcmVlUG9pbnRlclVuZ3VhcmRlZEJhc2UoKQorICAgICAgeyBkZWxldGVbXSBfTV9sb3NlcnM7IH0KKworICAgICAgaW50CisgICAgICBfX2dldF9taW5fc291cmNlKCkKKyAgICAgIHsKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisJLy8gbm8gZHVtbXkgc2VxdWVuY2UgY2FuIGV2ZXIgYmUgYXQgdGhlIHRvcCEKKwlfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX01fbG9zZXJzWzBdLl9NX3NvdXJjZSAhPSAtMSk7CisjZW5kaWYKKwlyZXR1cm4gX01fbG9zZXJzWzBdLl9NX3NvdXJjZTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX19pbnNlcnRfc3RhcnQoY29uc3QgX1RwJiBfX2tleSwgaW50IF9fc291cmNlLCBib29sKQorICAgICAgeworCXVuc2lnbmVkIGludCBfX3BvcyA9IF9NX2sgKyBfX3NvdXJjZTsKKworCV9NX2xvc2Vyc1tfX3Bvc10uX01fa2V5cCA9ICZfX2tleTsKKwlfTV9sb3NlcnNbX19wb3NdLl9NX3NvdXJjZSA9IF9fc291cmNlOworICAgICAgfQorICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBTdGFibGUgdW5ndWFyZGVkIF9Mb3NlclRyZWUgdmFyaWFudCBzdG9yaW5nIHBvaW50ZXJzLgorICAgKgorICAgKiBVbnN0YWJsZSB2YXJpYW50IGlzIGltcGxlbWVudGVkIGJlbG93IHVzaW5nIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uCisgICAqLworICB0ZW1wbGF0ZTxib29sIF9fc3RhYmxlLyogZGVmYXVsdCA9PSB0cnVlICovLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGNsYXNzIF9Mb3NlclRyZWVQb2ludGVyVW5ndWFyZGVkCisgICAgOiBwdWJsaWMgX0xvc2VyVHJlZVBvaW50ZXJVbmd1YXJkZWRCYXNlPF9UcCwgX0NvbXBhcmU+CisgICAgeworICAgICAgdHlwZWRlZiBfTG9zZXJUcmVlUG9pbnRlclVuZ3VhcmRlZEJhc2U8X1RwLCBfQ29tcGFyZT4gX0Jhc2U7CisgICAgICB1c2luZyBfQmFzZTo6X01fazsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9jb21wOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2xvc2VyczsKKworICAgIHB1YmxpYzoKKyAgICAgIF9Mb3NlclRyZWVQb2ludGVyVW5ndWFyZGVkKHVuc2lnbmVkIGludCBfX2ssIGNvbnN0IF9UcCYgX19zZW50aW5lbCwKKwkJCQkgX0NvbXBhcmUgX19jb21wID0gc3RkOjpsZXNzPF9UcD4oKSkKKyAgICAgIDogX0Jhc2U6Ol9Mb3NlclRyZWVQb2ludGVyVW5ndWFyZGVkQmFzZShfX2ssIF9fc2VudGluZWwsIF9fY29tcCkKKyAgICAgIHsgfQorCisgICAgICB1bnNpZ25lZCBpbnQKKyAgICAgIF9faW5pdF93aW5uZXIodW5zaWduZWQgaW50IF9fcm9vdCkKKyAgICAgIHsKKwlpZiAoX19yb290ID49IF9NX2spCisJICByZXR1cm4gX19yb290OworCWVsc2UKKwkgIHsKKwkgICAgdW5zaWduZWQgaW50IF9fbGVmdCA9IF9faW5pdF93aW5uZXIoMiAqIF9fcm9vdCk7CisJICAgIHVuc2lnbmVkIGludCBfX3JpZ2h0ID0gX19pbml0X3dpbm5lcigyICogX19yb290ICsgMSk7CisJICAgIGlmICghX01fY29tcCgqX01fbG9zZXJzW19fcmlnaHRdLl9NX2tleXAsCisJCQkgKl9NX2xvc2Vyc1tfX2xlZnRdLl9NX2tleXApKQorCSAgICAgIHsKKwkJLy8gTGVmdCBvbmUgaXMgbGVzcyBvciBlcXVhbC4KKwkJX01fbG9zZXJzW19fcm9vdF0gPSBfTV9sb3NlcnNbX19yaWdodF07CisJCXJldHVybiBfX2xlZnQ7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQkvLyBSaWdodCBvbmUgaXMgbGVzcy4KKwkJX01fbG9zZXJzW19fcm9vdF0gPSBfTV9sb3NlcnNbX19sZWZ0XTsKKwkJcmV0dXJuIF9fcmlnaHQ7CisJICAgICAgfQorCSAgfQorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfX2luaXQoKQorICAgICAgeworCV9NX2xvc2Vyc1swXSA9IF9NX2xvc2Vyc1tfX2luaXRfd2lubmVyKDEpXTsKKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKwkvLyBubyBkdW1teSBzZXF1ZW5jZSBjYW4gZXZlciBiZSBhdCB0aGUgdG9wIGF0IHRoZSBiZWdpbm5pbmcKKwkvLyAoMCBzZXF1ZW5jZXMhKQorCV9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfTV9sb3NlcnNbMF0uX01fc291cmNlICE9IC0xKTsKKyNlbmRpZgorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfX2RlbGV0ZV9taW5faW5zZXJ0KGNvbnN0IF9UcCYgX19rZXksIGJvb2wgX19zdXApCisgICAgICB7CisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworCS8vIG5vIGR1bW15IHNlcXVlbmNlIGNhbiBldmVyIGJlIGF0IHRoZSB0b3AhCisJX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9NX2xvc2Vyc1swXS5fTV9zb3VyY2UgIT0gLTEpOworI2VuZGlmCisKKwljb25zdCBfVHAqIF9fa2V5cCA9ICZfX2tleTsKKwlpbnQgX19zb3VyY2UgPSBfTV9sb3NlcnNbMF0uX01fc291cmNlOworCWZvciAodW5zaWduZWQgaW50IF9fcG9zID0gKF9NX2sgKyBfX3NvdXJjZSkgLyAyOyBfX3BvcyA+IDA7CisJICAgICBfX3BvcyAvPSAyKQorCSAgeworCSAgICAvLyBUaGUgc21hbGxlciBvbmUgZ2V0cyBwcm9tb3RlZCwgdGllcyBhcmUgYnJva2VuIGJ5IF9NX3NvdXJjZS4KKwkgICAgaWYgKF9NX2NvbXAoKl9NX2xvc2Vyc1tfX3Bvc10uX01fa2V5cCwgKl9fa2V5cCkKKwkJfHwgKCFfTV9jb21wKCpfX2tleXAsICpfTV9sb3NlcnNbX19wb3NdLl9NX2tleXApCisJCSAgICAmJiBfTV9sb3NlcnNbX19wb3NdLl9NX3NvdXJjZSA8IF9fc291cmNlKSkKKwkgICAgICB7CisJCS8vIFRoZSBvdGhlciBvbmUgaXMgc21hbGxlci4KKwkJc3RkOjpzd2FwKF9NX2xvc2Vyc1tfX3Bvc10uX01fc291cmNlLCBfX3NvdXJjZSk7CisJCXN0ZDo6c3dhcChfTV9sb3NlcnNbX19wb3NdLl9NX2tleXAsIF9fa2V5cCk7CisJICAgICAgfQorCSAgfQorCisJX01fbG9zZXJzWzBdLl9NX3NvdXJjZSA9IF9fc291cmNlOworCV9NX2xvc2Vyc1swXS5fTV9rZXlwID0gX19rZXlwOworICAgICAgfQorICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBVbnN0YWJsZSB1bmd1YXJkZWQgX0xvc2VyVHJlZSB2YXJpYW50IHN0b3JpbmcgcG9pbnRlcnMuCisgICAqCisgICAqIFN0YWJsZSB2YXJpYW50IGlzIGFib3ZlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBjbGFzcyBfTG9zZXJUcmVlUG9pbnRlclVuZ3VhcmRlZDwvKiBfX3N0YWJsZSA9PSAqL2ZhbHNlLCBfVHAsIF9Db21wYXJlPgorICAgIDogcHVibGljIF9Mb3NlclRyZWVQb2ludGVyVW5ndWFyZGVkQmFzZTxfVHAsIF9Db21wYXJlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0xvc2VyVHJlZVBvaW50ZXJVbmd1YXJkZWRCYXNlPF9UcCwgX0NvbXBhcmU+IF9CYXNlOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2s7CisgICAgICB1c2luZyBfQmFzZTo6X01fY29tcDsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9sb3NlcnM7CisKKyAgcHVibGljOgorICAgICAgX0xvc2VyVHJlZVBvaW50ZXJVbmd1YXJkZWQodW5zaWduZWQgaW50IF9faywgY29uc3QgX1RwJiBfX3NlbnRpbmVsLAorCQkJCSBfQ29tcGFyZSBfX2NvbXAgPSBzdGQ6Omxlc3M8X1RwPigpKQorICAgICAgOiBfQmFzZTo6X0xvc2VyVHJlZVBvaW50ZXJVbmd1YXJkZWRCYXNlKF9faywgX19zZW50aW5lbCwgX19jb21wKQorICAgICAgeyB9CisKKyAgICAgIHVuc2lnbmVkIGludAorICAgICAgX19pbml0X3dpbm5lcih1bnNpZ25lZCBpbnQgX19yb290KQorICAgICAgeworCWlmIChfX3Jvb3QgPj0gX01faykKKwkgIHJldHVybiBfX3Jvb3Q7CisJZWxzZQorCSAgeworCSAgICB1bnNpZ25lZCBpbnQgX19sZWZ0ID0gX19pbml0X3dpbm5lcigyICogX19yb290KTsKKwkgICAgdW5zaWduZWQgaW50IF9fcmlnaHQgPSBfX2luaXRfd2lubmVyKDIgKiBfX3Jvb3QgKyAxKTsKKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKwkgICAgLy8gSWYgX19sZWZ0IG9uZSBpcyBzZW50aW5lbCB0aGVuIF9fcmlnaHQgb25lIG11c3QgYmUsIHRvby4KKwkgICAgaWYgKF9NX2xvc2Vyc1tfX2xlZnRdLl9NX3NvdXJjZSA9PSAtMSkKKwkgICAgICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX01fbG9zZXJzW19fcmlnaHRdLl9NX3NvdXJjZSA9PSAtMSk7CisjZW5kaWYKKworCSAgICBpZiAoIV9NX2NvbXAoKl9NX2xvc2Vyc1tfX3JpZ2h0XS5fTV9rZXlwLAorCQkJICpfTV9sb3NlcnNbX19sZWZ0XS5fTV9rZXlwKSkKKwkgICAgICB7CisJCS8vIExlZnQgb25lIGlzIGxlc3Mgb3IgZXF1YWwuCisJCV9NX2xvc2Vyc1tfX3Jvb3RdID0gX01fbG9zZXJzW19fcmlnaHRdOworCQlyZXR1cm4gX19sZWZ0OworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJLy8gUmlnaHQgb25lIGlzIGxlc3MuCisJCV9NX2xvc2Vyc1tfX3Jvb3RdID0gX01fbG9zZXJzW19fbGVmdF07CisJCXJldHVybiBfX3JpZ2h0OworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX19pbml0KCkKKyAgICAgIHsKKwlfTV9sb3NlcnNbMF0gPSBfTV9sb3NlcnNbX19pbml0X3dpbm5lcigxKV07CisKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisJLy8gbm8gZHVtbXkgc2VxdWVuY2UgY2FuIGV2ZXIgYmUgYXQgdGhlIHRvcCBhdCB0aGUgYmVnaW5uaW5nCisJLy8gKDAgc2VxdWVuY2VzISkKKwlfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX01fbG9zZXJzWzBdLl9NX3NvdXJjZSAhPSAtMSk7CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX19kZWxldGVfbWluX2luc2VydChjb25zdCBfVHAmIF9fa2V5LCBib29sIF9fc3VwKQorICAgICAgeworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKwkvLyBubyBkdW1teSBzZXF1ZW5jZSBjYW4gZXZlciBiZSBhdCB0aGUgdG9wIQorCV9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfTV9sb3NlcnNbMF0uX01fc291cmNlICE9IC0xKTsKKyNlbmRpZgorCisJY29uc3QgX1RwKiBfX2tleXAgPSAmX19rZXk7CisJaW50IF9fc291cmNlID0gX01fbG9zZXJzWzBdLl9NX3NvdXJjZTsKKwlmb3IgKHVuc2lnbmVkIGludCBfX3BvcyA9IChfTV9rICsgX19zb3VyY2UpIC8gMjsgX19wb3MgPiAwOworCSAgICAgX19wb3MgLz0gMikKKwkgIHsKKwkgICAgLy8gVGhlIHNtYWxsZXIgb25lIGdldHMgcHJvbW90ZWQuCisJICAgIGlmIChfTV9jb21wKCooX01fbG9zZXJzW19fcG9zXS5fTV9rZXlwKSwgKl9fa2V5cCkpCisJICAgICAgeworCQkvLyBUaGUgb3RoZXIgb25lIGlzIHNtYWxsZXIuCisJCXN0ZDo6c3dhcChfTV9sb3NlcnNbX19wb3NdLl9NX3NvdXJjZSwgX19zb3VyY2UpOworCQlzdGQ6OnN3YXAoX01fbG9zZXJzW19fcG9zXS5fTV9rZXlwLCBfX2tleXApOworCSAgICAgIH0KKwkgIH0KKworCV9NX2xvc2Vyc1swXS5fTV9zb3VyY2UgPSBfX3NvdXJjZTsKKwlfTV9sb3NlcnNbMF0uX01fa2V5cCA9IF9fa2V5cDsKKyAgICAgIH0KKyAgICB9OworfSAvLyBuYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX0xPU0VSVFJFRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL21lcmdlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL21lcmdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkNGI0NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvbWVyZ2UuaApAQCAtMCwwICsxLDI1MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL21lcmdlLmgKKyAqICBAYnJpZWYgUGFyYWxsZWwgaW1wbGVtZW50YXRpb24gb2Ygc3RkOjptZXJnZSgpLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgSm9oYW5uZXMgU2luZ2xlci4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV9ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX01FUkdFX0ggMQorCisjaW5jbHVkZSA8cGFyYWxsZWwvYmFzaWNfaXRlcmF0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAoreworICAvKiogQGJyaWVmIE1lcmdlIHJvdXRpbmUgYmVpbmcgYWJsZSB0byBtZXJnZSBvbmx5IHRoZSBAYyBfX21heF9sZW5ndGgKKyAgICogc21hbGxlc3QgZWxlbWVudHMuCisgICAqCisgICAqIFRoZSBAYyBfX2JlZ2luIGl0ZXJhdG9ycyBhcmUgYWR2YW5jZWQgYWNjb3JkaW5nbHksIHRoZXkgbWlnaHQgbm90CisgICAqIHJlYWNoIEBjIF9fZW5kLCBpbiBjb250cmFzdCB0byB0aGUgdXN1YWwgdmFyaWFudC4KKyAgICogQHBhcmFtIF9fYmVnaW4xIEJlZ2luIGl0ZXJhdG9yIG9mIGZpcnN0IHNlcXVlbmNlLgorICAgKiBAcGFyYW0gX19lbmQxIEVuZCBpdGVyYXRvciBvZiBmaXJzdCBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fYmVnaW4yIEJlZ2luIGl0ZXJhdG9yIG9mIHNlY29uZCBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fZW5kMiBFbmQgaXRlcmF0b3Igb2Ygc2Vjb25kIHNlcXVlbmNlLgorICAgKiBAcGFyYW0gX190YXJnZXQgVGFyZ2V0IGJlZ2luIGl0ZXJhdG9yLgorICAgKiBAcGFyYW0gX19tYXhfbGVuZ3RoIE1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIG1lcmdlLgorICAgKiBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAqIEByZXR1cm4gT3V0cHV0IGVuZCBpdGVyYXRvci4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fbWVyZ2VfYWR2YW5jZV91c3VhbChfUkFJdGVyMSYgX19iZWdpbjEsIF9SQUl0ZXIxIF9fZW5kMSwKKwkJCSAgX1JBSXRlcjImIF9fYmVnaW4yLCBfUkFJdGVyMiBfX2VuZDIsCisJCQkgIF9PdXRwdXRJdGVyYXRvciBfX3RhcmdldCwKKwkJCSAgX0RpZmZlcmVuY2VUcCBfX21heF9sZW5ndGgsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIF9EaWZmZXJlbmNlVHAgX0RpZmZlcmVuY2VUeXBlOworICAgICAgd2hpbGUgKF9fYmVnaW4xICE9IF9fZW5kMSAmJiBfX2JlZ2luMiAhPSBfX2VuZDIgJiYgX19tYXhfbGVuZ3RoID4gMCkKKyAgICAgICAgeworICAgICAgICAgIC8vIGFycmF5MVtfX2kxXSA8IGFycmF5MFtpMF0KKyAgICAgICAgICBpZiAoX19jb21wKCpfX2JlZ2luMiwgKl9fYmVnaW4xKSkKKyAgICAgICAgICAgICpfX3RhcmdldCsrID0gKl9fYmVnaW4yKys7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgKl9fdGFyZ2V0KysgPSAqX19iZWdpbjErKzsKKyAgICAgICAgICAtLV9fbWF4X2xlbmd0aDsKKyAgICAgICAgfQorCisgICAgICBpZiAoX19iZWdpbjEgIT0gX19lbmQxKQorICAgICAgICB7CisgICAgICAgICAgX190YXJnZXQgPSBzdGQ6OmNvcHkoX19iZWdpbjEsIF9fYmVnaW4xICsgX19tYXhfbGVuZ3RoLCBfX3RhcmdldCk7CisgICAgICAgICAgX19iZWdpbjEgKz0gX19tYXhfbGVuZ3RoOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfX3RhcmdldCA9IHN0ZDo6Y29weShfX2JlZ2luMiwgX19iZWdpbjIgKyBfX21heF9sZW5ndGgsIF9fdGFyZ2V0KTsKKyAgICAgICAgICBfX2JlZ2luMiArPSBfX21heF9sZW5ndGg7CisgICAgICAgIH0KKyAgICAgIHJldHVybiBfX3RhcmdldDsKKyAgICB9CisKKyAgLyoqIEBicmllZiBNZXJnZSByb3V0aW5lIGJlaW5nIGFibGUgdG8gbWVyZ2Ugb25seSB0aGUgQGMgX19tYXhfbGVuZ3RoCisgICAqIHNtYWxsZXN0IGVsZW1lbnRzLgorICAgKgorICAgKiBUaGUgQGMgX19iZWdpbiBpdGVyYXRvcnMgYXJlIGFkdmFuY2VkIGFjY29yZGluZ2x5LCB0aGV5IG1pZ2h0IG5vdAorICAgKiByZWFjaCBAYyBfX2VuZCwgaW4gY29udHJhc3QgdG8gdGhlIHVzdWFsIHZhcmlhbnQuCisgICAqIFNwZWNpYWxseSBkZXNpZ25lZCBjb2RlIHNob3VsZCBhbGxvdyB0aGUgY29tcGlsZXIgdG8gZ2VuZXJhdGUKKyAgICogY29uZGl0aW9uYWwgbW92ZXMgaW5zdGVhZCBvZiBicmFuY2hlcy4KKyAgICogQHBhcmFtIF9fYmVnaW4xIEJlZ2luIGl0ZXJhdG9yIG9mIGZpcnN0IHNlcXVlbmNlLgorICAgKiBAcGFyYW0gX19lbmQxIEVuZCBpdGVyYXRvciBvZiBmaXJzdCBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fYmVnaW4yIEJlZ2luIGl0ZXJhdG9yIG9mIHNlY29uZCBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fZW5kMiBFbmQgaXRlcmF0b3Igb2Ygc2Vjb25kIHNlcXVlbmNlLgorICAgKiBAcGFyYW0gX190YXJnZXQgVGFyZ2V0IGJlZ2luIGl0ZXJhdG9yLgorICAgKiBAcGFyYW0gX19tYXhfbGVuZ3RoIE1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIG1lcmdlLgorICAgKiBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAqIEByZXR1cm4gT3V0cHV0IGVuZCBpdGVyYXRvci4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fbWVyZ2VfYWR2YW5jZV9tb3ZjKF9SQUl0ZXIxJiBfX2JlZ2luMSwgX1JBSXRlcjEgX19lbmQxLAorCQkJIF9SQUl0ZXIyJiBfX2JlZ2luMiwgX1JBSXRlcjIgX19lbmQyLAorCQkJIF9PdXRwdXRJdGVyYXRvciBfX3RhcmdldCwKKwkJCSBfRGlmZmVyZW5jZVRwIF9fbWF4X2xlbmd0aCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgX0RpZmZlcmVuY2VUcCBfRGlmZmVyZW5jZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXIxPjo6dmFsdWVfdHlwZQorICAgICAgICBfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcjI+Ojp2YWx1ZV90eXBlCisgICAgICAgIF9WYWx1ZVR5cGUyOworCisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9fbWF4X2xlbmd0aCA+PSAwKTsKKyNlbmRpZgorCisgICAgICB3aGlsZSAoX19iZWdpbjEgIT0gX19lbmQxICYmIF9fYmVnaW4yICE9IF9fZW5kMiAmJiBfX21heF9sZW5ndGggPiAwKQorICAgICAgICB7CisgICAgICAgICAgX1JBSXRlcjEgX19uZXh0MSA9IF9fYmVnaW4xICsgMTsKKyAgICAgICAgICBfUkFJdGVyMiBfX25leHQyID0gX19iZWdpbjIgKyAxOworICAgICAgICAgIF9WYWx1ZVR5cGUxIF9fZWxlbWVudDEgPSAqX19iZWdpbjE7CisgICAgICAgICAgX1ZhbHVlVHlwZTIgX19lbGVtZW50MiA9ICpfX2JlZ2luMjsKKworICAgICAgICAgIGlmIChfX2NvbXAoX19lbGVtZW50MiwgX19lbGVtZW50MSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fZWxlbWVudDEgPSBfX2VsZW1lbnQyOworICAgICAgICAgICAgICBfX2JlZ2luMiA9IF9fbmV4dDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX19iZWdpbjEgPSBfX25leHQxOworCisgICAgICAgICAgKl9fdGFyZ2V0ID0gX19lbGVtZW50MTsKKworICAgICAgICAgICsrX190YXJnZXQ7CisgICAgICAgICAgLS1fX21heF9sZW5ndGg7CisgICAgICAgIH0KKyAgICAgIGlmIChfX2JlZ2luMSAhPSBfX2VuZDEpCisgICAgICAgIHsKKyAgICAgICAgICBfX3RhcmdldCA9IHN0ZDo6Y29weShfX2JlZ2luMSwgX19iZWdpbjEgKyBfX21heF9sZW5ndGgsIF9fdGFyZ2V0KTsKKyAgICAgICAgICBfX2JlZ2luMSArPSBfX21heF9sZW5ndGg7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9fdGFyZ2V0ID0gc3RkOjpjb3B5KF9fYmVnaW4yLCBfX2JlZ2luMiArIF9fbWF4X2xlbmd0aCwgX190YXJnZXQpOworICAgICAgICAgIF9fYmVnaW4yICs9IF9fbWF4X2xlbmd0aDsKKyAgICAgICAgfQorICAgICAgcmV0dXJuIF9fdGFyZ2V0OworICAgIH0KKworICAvKiogQGJyaWVmIE1lcmdlIHJvdXRpbmUgYmVpbmcgYWJsZSB0byBtZXJnZSBvbmx5IHRoZSBAYyBfX21heF9sZW5ndGgKKyAgICogc21hbGxlc3QgZWxlbWVudHMuCisgICAqCisgICAqICBUaGUgQGMgX19iZWdpbiBpdGVyYXRvcnMgYXJlIGFkdmFuY2VkIGFjY29yZGluZ2x5LCB0aGV5IG1pZ2h0IG5vdAorICAgKiAgcmVhY2ggQGMgX19lbmQsIGluIGNvbnRyYXN0IHRvIHRoZSB1c3VhbCB2YXJpYW50LgorICAgKiAgU3RhdGljIHN3aXRjaCBvbiB3aGV0aGVyIHRvIHVzZSB0aGUgY29uZGl0aW9uYWwtbW92ZSB2YXJpYW50LgorICAgKiAgQHBhcmFtIF9fYmVnaW4xIEJlZ2luIGl0ZXJhdG9yIG9mIGZpcnN0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fZW5kMSBFbmQgaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19iZWdpbjIgQmVnaW4gaXRlcmF0b3Igb2Ygc2Vjb25kIHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fZW5kMiBFbmQgaXRlcmF0b3Igb2Ygc2Vjb25kIHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fdGFyZ2V0IFRhcmdldCBiZWdpbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSBfX21heF9sZW5ndGggTWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8gbWVyZ2UuCisgICAqICBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAqICBAcmV0dXJuIE91dHB1dCBlbmQgaXRlcmF0b3IuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIxLCB0eXBlbmFtZSBfUkFJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgX19tZXJnZV9hZHZhbmNlKF9SQUl0ZXIxJiBfX2JlZ2luMSwgX1JBSXRlcjEgX19lbmQxLAorCQkgICAgX1JBSXRlcjImIF9fYmVnaW4yLCBfUkFJdGVyMiBfX2VuZDIsCisJCSAgICBfT3V0cHV0SXRlcmF0b3IgX190YXJnZXQsIF9EaWZmZXJlbmNlVHAgX19tYXhfbGVuZ3RoLAorCQkgICAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19tYXhfbGVuZ3RoKQorCisgICAgICByZXR1cm4gX19tZXJnZV9hZHZhbmNlX21vdmMoX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwKKwkJCQkgIF9fdGFyZ2V0LCBfX21heF9sZW5ndGgsIF9fY29tcCk7CisgICAgfQorCisgIC8qKiBAYnJpZWYgTWVyZ2Ugcm91dGluZSBmYWxsYmFjayB0byBzZXF1ZW50aWFsIGluIGNhc2UgdGhlCisgICAgICBpdGVyYXRvcnMgb2YgdGhlIHR3byBpbnB1dCBzZXF1ZW5jZXMgYXJlIG9mIGRpZmZlcmVudCB0eXBlLgorICAgICAgKiAgQHBhcmFtIF9fYmVnaW4xIEJlZ2luIGl0ZXJhdG9yIG9mIGZpcnN0IHNlcXVlbmNlLgorICAgICAgKiAgQHBhcmFtIF9fZW5kMSBFbmQgaXRlcmF0b3Igb2YgZmlyc3Qgc2VxdWVuY2UuCisgICAgICAqICBAcGFyYW0gX19iZWdpbjIgQmVnaW4gaXRlcmF0b3Igb2Ygc2Vjb25kIHNlcXVlbmNlLgorICAgICAgKiAgQHBhcmFtIF9fZW5kMiBFbmQgaXRlcmF0b3Igb2Ygc2Vjb25kIHNlcXVlbmNlLgorICAgICAgKiAgQHBhcmFtIF9fdGFyZ2V0IFRhcmdldCBiZWdpbiBpdGVyYXRvci4KKyAgICAgICogIEBwYXJhbSBfX21heF9sZW5ndGggTWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8gbWVyZ2UuCisgICAgICAqICBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAgICAqICBAcmV0dXJuIE91dHB1dCBlbmQgaXRlcmF0b3IuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIxLCB0eXBlbmFtZSBfUkFJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX1JBSXRlcjMsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSBfUkFJdGVyMworICAgIF9fcGFyYWxsZWxfbWVyZ2VfYWR2YW5jZShfUkFJdGVyMSYgX19iZWdpbjEsIF9SQUl0ZXIxIF9fZW5kMSwKKwkJCSAgICAgX1JBSXRlcjImIF9fYmVnaW4yLAorCQkJICAgICAvLyBkaWZmZXJlbnQgaXRlcmF0b3JzLCBwYXJhbGxlbCBpbXBsZW1lbnRhdGlvbgorCQkJICAgICAvLyBub3QgYXZhaWxhYmxlCisJCQkgICAgIF9SQUl0ZXIyIF9fZW5kMiwgX1JBSXRlcjMgX190YXJnZXQsIHR5cGVuYW1lCisJCQkgICAgIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXIxPjo6CisJCQkgICAgIGRpZmZlcmVuY2VfdHlwZSBfX21heF9sZW5ndGgsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7IHJldHVybiBfX21lcmdlX2FkdmFuY2UoX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwgX190YXJnZXQsCisJCQkgICAgIF9fbWF4X2xlbmd0aCwgX19jb21wKTsgfQorCisgIC8qKiBAYnJpZWYgUGFyYWxsZWwgbWVyZ2Ugcm91dGluZSBiZWluZyBhYmxlIHRvIG1lcmdlIG9ubHkgdGhlIEBjCisgICAqIF9fbWF4X2xlbmd0aCBzbWFsbGVzdCBlbGVtZW50cy4KKyAgICoKKyAgICogIFRoZSBAYyBfX2JlZ2luIGl0ZXJhdG9ycyBhcmUgYWR2YW5jZWQgYWNjb3JkaW5nbHksIHRoZXkgbWlnaHQgbm90CisgICAqICByZWFjaCBAYyBfX2VuZCwgaW4gY29udHJhc3QgdG8gdGhlIHVzdWFsIHZhcmlhbnQuCisgICAqICBUaGUgZnVuY3Rpb25hbGl0eSBpcyBwcm9qZWN0ZWQgb250byBwYXJhbGxlbF9tdWx0aXdheV9tZXJnZS4KKyAgICogIEBwYXJhbSBfX2JlZ2luMSBCZWdpbiBpdGVyYXRvciBvZiBmaXJzdCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZDEgRW5kIGl0ZXJhdG9yIG9mIGZpcnN0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fYmVnaW4yIEJlZ2luIGl0ZXJhdG9yIG9mIHNlY29uZCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZDIgRW5kIGl0ZXJhdG9yIG9mIHNlY29uZCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX3RhcmdldCBUYXJnZXQgYmVnaW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gX19tYXhfbGVuZ3RoIE1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIG1lcmdlLgorICAgKiAgQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgKiAgQHJldHVybiBPdXRwdXQgZW5kIGl0ZXJhdG9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIzLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgX1JBSXRlcjMKKyAgICBfX3BhcmFsbGVsX21lcmdlX2FkdmFuY2UoX1JBSXRlcjEmIF9fYmVnaW4xLCBfUkFJdGVyMSBfX2VuZDEsCisJCQkgICAgIF9SQUl0ZXIxJiBfX2JlZ2luMiwgX1JBSXRlcjEgX19lbmQyLAorCQkJICAgICBfUkFJdGVyMyBfX3RhcmdldCwgdHlwZW5hbWUKKwkJCSAgICAgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcjE+OjoKKwkJCSAgICAgZGlmZmVyZW5jZV90eXBlIF9fbWF4X2xlbmd0aCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICAgICAgICBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyMT46OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcjE+OjoKKyAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTEgLyogPT0gZGlmZmVyZW5jZV90eXBlMiAqLzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcjM+OjoKKyAgICAgICAgZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6cGFpcjxfUkFJdGVyMSwgX1JBSXRlcjE+CisgICAgICAgIF9JdGVyYXRvclBhaXI7CisKKyAgICAgIF9JdGVyYXRvclBhaXIgX19zZXFzWzJdID0geyBzdGQ6Om1ha2VfcGFpcihfX2JlZ2luMSwgX19lbmQxKSwKKwkJCQkgIHN0ZDo6bWFrZV9wYWlyKF9fYmVnaW4yLCBfX2VuZDIpIH07CisgICAgICBfUkFJdGVyMyBfX3RhcmdldF9lbmQgPSBwYXJhbGxlbF9tdWx0aXdheV9tZXJnZQorCTwgLyogX19zdGFibGUgPSAqLyB0cnVlLCAvKiBfX3NlbnRpbmVscyA9ICovIGZhbHNlPgorCShfX3NlcXMsIF9fc2VxcyArIDIsIF9fdGFyZ2V0LCBtdWx0aXdheV9tZXJnZV9leGFjdF9zcGxpdHRpbmcKKwkgPCAvKiBfX3N0YWJsZSA9ICovIHRydWUsIF9JdGVyYXRvclBhaXIqLAorCSBfQ29tcGFyZSwgX0RpZmZlcmVuY2VUeXBlMT4sIF9fbWF4X2xlbmd0aCwgX19jb21wLAorCSBvbXBfZ2V0X21heF90aHJlYWRzKCkpOworCisgICAgICByZXR1cm4gX190YXJnZXRfZW5kOworICAgIH0KK30gICAgICAgLy9uYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX01FUkdFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvbXVsdGlzZXFfc2VsZWN0aW9uLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL211bHRpc2VxX3NlbGVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NDZjOWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL211bHRpc2VxX3NlbGVjdGlvbi5oCkBAIC0wLDAgKzEsNjQ0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvbXVsdGlzZXFfc2VsZWN0aW9uLmgKKyAqICBAYnJpZWYgRnVuY3Rpb25zIHRvIGZpbmQgZWxlbWVudHMgb2YgYSBjZXJ0YWluIGdsb2JhbCBfX3JhbmsgaW4KKyAqICBtdWx0aXBsZSBzb3J0ZWQgc2VxdWVuY2VzLiAgQWxzbyBzZXJ2ZXMgZm9yIHNwbGl0dGluZyBzdWNoCisgKiAgc2VxdWVuY2Ugc2V0cy4KKyAqCisgKiAgVGhlIGFsZ29yaXRobSBkZXNjcmlwdGlvbiBjYW4gYmUgZm91bmQgaW4gCisgKgorICogIFAuIEouIFZhcm1hbiwgUy4gRC4gU2NoZXVmbGVyLCBCLiBSLiBJeWVyLCBhbmQgRy4gUi4gUmljYXJkLgorICogIE1lcmdpbmcgTXVsdGlwbGUgTGlzdHMgb24gSGllcmFyY2hpY2FsLU1lbW9yeSBNdWx0aXByb2Nlc3NvcnMuCisgKiAgSm91cm5hbCBvZiBQYXJhbGxlbCBhbmQgRGlzdHJpYnV0ZWQgQ29tcHV0aW5nLCAxMigyKToxNzHigJMxNzcsIDE5OTEuCisgKgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgSm9oYW5uZXMgU2luZ2xlci4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9NVUxUSVNFUV9TRUxFQ1RJT05fSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9NVUxUSVNFUV9TRUxFQ1RJT05fSCAxCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8cXVldWU+CisKKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAoreworICAvKiogQGJyaWVmIENvbXBhcmUgX19hIHBhaXIgb2YgdHlwZXMgbGV4aWNvZ3JhcGhpY2FsbHksIGFzY2VuZGluZy4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGNsYXNzIF9MZXhpY29ncmFwaGljCisgICAgOiBwdWJsaWMgc3RkOjpiaW5hcnlfZnVuY3Rpb248c3RkOjpwYWlyPF9UMSwgX1QyPiwKKwkJCQkgIHN0ZDo6cGFpcjxfVDEsIF9UMj4sIGJvb2w+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICBfQ29tcGFyZSYgX01fY29tcDsKKworICAgIHB1YmxpYzoKKyAgICAgIF9MZXhpY29ncmFwaGljKF9Db21wYXJlJiBfX2NvbXApIDogX01fY29tcChfX2NvbXApIHsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6cGFpcjxfVDEsIF9UMj4mIF9fcDEsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6cGFpcjxfVDEsIF9UMj4mIF9fcDIpIGNvbnN0CisgICAgICB7CisgICAgICAgIGlmIChfTV9jb21wKF9fcDEuZmlyc3QsIF9fcDIuZmlyc3QpKQorICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGlmIChfTV9jb21wKF9fcDIuZmlyc3QsIF9fcDEuZmlyc3QpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBGaXJzdHMgYXJlIGVxdWFsLgorICAgICAgICByZXR1cm4gX19wMS5zZWNvbmQgPCBfX3AyLnNlY29uZDsKKyAgICAgIH0KKyAgICB9OworCisgIC8qKiBAYnJpZWYgQ29tcGFyZSBfX2EgcGFpciBvZiB0eXBlcyBsZXhpY29ncmFwaGljYWxseSwgZGVzY2VuZGluZy4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGNsYXNzIF9MZXhpY29ncmFwaGljUmV2ZXJzZSA6IHB1YmxpYyBzdGQ6OmJpbmFyeV9mdW5jdGlvbjxfVDEsIF9UMiwgYm9vbD4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIF9Db21wYXJlJiBfTV9jb21wOworCisgICAgcHVibGljOgorICAgICAgX0xleGljb2dyYXBoaWNSZXZlcnNlKF9Db21wYXJlJiBfX2NvbXApIDogX01fY29tcChfX2NvbXApIHsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6cGFpcjxfVDEsIF9UMj4mIF9fcDEsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6cGFpcjxfVDEsIF9UMj4mIF9fcDIpIGNvbnN0CisgICAgICB7CisgICAgICAgIGlmIChfTV9jb21wKF9fcDIuZmlyc3QsIF9fcDEuZmlyc3QpKQorICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGlmIChfTV9jb21wKF9fcDEuZmlyc3QsIF9fcDIuZmlyc3QpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBGaXJzdHMgYXJlIGVxdWFsLgorICAgICAgICByZXR1cm4gX19wMi5zZWNvbmQgPCBfX3AxLnNlY29uZDsKKyAgICAgIH0KKyAgICB9OworCisgIC8qKiAKKyAgICogIEBicmllZiBTcGxpdHMgc2V2ZXJhbCBzb3J0ZWQgc2VxdWVuY2VzIGF0IGEgY2VydGFpbiBnbG9iYWwgX19yYW5rLAorICAgKiAgcmVzdWx0aW5nIGluIGEgc3BsaXR0aW5nIHBvaW50IGZvciBlYWNoIHNlcXVlbmNlLgorICAgKiAgVGhlIHNlcXVlbmNlcyBhcmUgcGFzc2VkIHZpYSBhIHNlcXVlbmNlIG9mIHJhbmRvbS1hY2Nlc3MKKyAgICogIGl0ZXJhdG9yIHBhaXJzLCBub25lIG9mIHRoZSBzZXF1ZW5jZXMgbWF5IGJlIGVtcHR5LiAgSWYgdGhlcmUKKyAgICogIGFyZSBzZXZlcmFsIGVxdWFsIGVsZW1lbnRzIGFjcm9zcyB0aGUgc3BsaXQsIHRoZSBvbmVzIG9uIHRoZQorICAgKiAgX19sZWZ0IHNpZGUgd2lsbCBiZSBjaG9zZW4gZnJvbSBzZXF1ZW5jZXMgd2l0aCBzbWFsbGVyIG51bWJlci4KKyAgICogIEBwYXJhbSBfX2JlZ2luX3NlcXMgQmVnaW4gb2YgdGhlIHNlcXVlbmNlIG9mIGl0ZXJhdG9yIHBhaXJzLgorICAgKiAgQHBhcmFtIF9fZW5kX3NlcXMgRW5kIG9mIHRoZSBzZXF1ZW5jZSBvZiBpdGVyYXRvciBwYWlycy4KKyAgICogIEBwYXJhbSBfX3JhbmsgVGhlIGdsb2JhbCByYW5rIHRvIHBhcnRpdGlvbiBhdC4KKyAgICogIEBwYXJhbSBfX2JlZ2luX29mZnNldHMgQSByYW5kb20tYWNjZXNzIF9fc2VxdWVuY2UgX19iZWdpbiB3aGVyZSB0aGUKKyAgICogIF9fcmVzdWx0IHdpbGwgYmUgc3RvcmVkIGluLiBFYWNoIGVsZW1lbnQgb2YgdGhlIHNlcXVlbmNlIGlzIGFuCisgICAqICBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QgZWxlbWVudCBvbiB0aGUgZ3JlYXRlciBwYXJ0IG9mCisgICAqICB0aGUgcmVzcGVjdGl2ZSBfX3NlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fY29tcCBUaGUgb3JkZXJpbmcgZnVuY3RvciwgZGVmYXVsdHMgdG8gc3RkOjpsZXNzPF9UcD4uIAorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhblNlcXMsIHR5cGVuYW1lIF9SYW5rVHlwZSwgdHlwZW5hbWUgX1JhbmtJdGVyYXRvciwKKyAgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBtdWx0aXNlcV9wYXJ0aXRpb24oX1JhblNlcXMgX19iZWdpbl9zZXFzLCBfUmFuU2VxcyBfX2VuZF9zZXFzLAorICAgICAgICAgICAgICAgICAgICAgICBfUmFua1R5cGUgX19yYW5rLAorICAgICAgICAgICAgICAgICAgICAgICBfUmFua0l0ZXJhdG9yIF9fYmVnaW5fb2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wID0gc3RkOjpsZXNzPAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czx0eXBlbmFtZQorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUmFuU2Vxcz46OnZhbHVlX3R5cGU6OgorICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF90eXBlPjo6dmFsdWVfdHlwZT4oKSkgLy8gc3RkOjpsZXNzPF9UcD4KKyAgICB7CisgICAgICBfR0xJQkNYWF9DQUxMKF9fZW5kX3NlcXMgLSBfX2JlZ2luX3NlcXMpCisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JhblNlcXM+Ojp2YWx1ZV90eXBlOjpmaXJzdF90eXBlCisgICAgICAgIF9JdDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JhblNlcXM+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICAgICAgX1NlcU51bWJlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0Pjo6ZGlmZmVyZW5jZV90eXBlCisgICAgICAgICAgICAgICBfRGlmZmVyZW5jZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdD46OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKworICAgICAgX0xleGljb2dyYXBoaWM8X1ZhbHVlVHlwZSwgX1NlcU51bWJlciwgX0NvbXBhcmU+IF9fbGNvbXAoX19jb21wKTsKKyAgICAgIF9MZXhpY29ncmFwaGljUmV2ZXJzZTxfVmFsdWVUeXBlLCBfU2VxTnVtYmVyLCBfQ29tcGFyZT4gX19scmNvbXAoX19jb21wKTsKKworICAgICAgLy8gTnVtYmVyIG9mIHNlcXVlbmNlcywgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRvdGFsIChwb3NzaWJseQorICAgICAgLy8gaW5jbHVkaW5nIHBhZGRpbmcpLgorICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbSA9IHN0ZDo6ZGlzdGFuY2UoX19iZWdpbl9zZXFzLCBfX2VuZF9zZXFzKSwgX19ubiA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgX19ubWF4LCBfX24sIF9fcjsKKworICAgICAgZm9yIChfU2VxTnVtYmVyIF9faSA9IDA7IF9faSA8IF9fbTsgX19pKyspCisgICAgICAgIHsKKyAgICAgICAgICBfX25uICs9IHN0ZDo6ZGlzdGFuY2UoX19iZWdpbl9zZXFzW19faV0uZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iZWdpbl9zZXFzW19faV0uc2Vjb25kKTsKKyAgICAgICAgICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoCisgICAgICAgICAgICBzdGQ6OmRpc3RhbmNlKF9fYmVnaW5fc2Vxc1tfX2ldLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlZ2luX3NlcXNbX19pXS5zZWNvbmQpID4gMCk7CisgICAgICAgIH0KKworICAgICAgaWYgKF9fcmFuayA9PSBfX25uKQorICAgICAgICB7CisgICAgICAgICAgZm9yIChfU2VxTnVtYmVyIF9faSA9IDA7IF9faSA8IF9fbTsgX19pKyspCisgICAgICAgICAgICBfX2JlZ2luX29mZnNldHNbX19pXSA9IF9fYmVnaW5fc2Vxc1tfX2ldLnNlY29uZDsgLy8gVmVyeSBlbmQuCisgICAgICAgICAgLy8gUmV0dXJuIF9fbSAtIDE7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfX20gIT0gMCk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX19ubiAhPSAwKTsKKyAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfX3JhbmsgPj0gMCk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX19yYW5rIDwgX19ubik7CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSogX19ucyA9IG5ldyBfRGlmZmVyZW5jZVR5cGVbX19tXTsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSogX19hID0gbmV3IF9EaWZmZXJlbmNlVHlwZVtfX21dOworICAgICAgX0RpZmZlcmVuY2VUeXBlKiBfX2IgPSBuZXcgX0RpZmZlcmVuY2VUeXBlW19fbV07CisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19sOworCisgICAgICBfX25zWzBdID0gc3RkOjpkaXN0YW5jZShfX2JlZ2luX3NlcXNbMF0uZmlyc3QsIF9fYmVnaW5fc2Vxc1swXS5zZWNvbmQpOworICAgICAgX19ubWF4ID0gX19uc1swXTsKKyAgICAgIGZvciAoX1NlcU51bWJlciBfX2kgPSAwOyBfX2kgPCBfX207IF9faSsrKQorICAgICAgICB7CisgICAgICAgICAgX19uc1tfX2ldID0gc3RkOjpkaXN0YW5jZShfX2JlZ2luX3NlcXNbX19pXS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmVnaW5fc2Vxc1tfX2ldLnNlY29uZCk7CisgICAgICAgICAgX19ubWF4ID0gc3RkOjptYXgoX19ubWF4LCBfX25zW19faV0pOworICAgICAgICB9CisKKyAgICAgIF9fciA9IF9fcmRfbG9nMihfX25tYXgpICsgMTsKKworICAgICAgLy8gUGFkIGFsbCBsaXN0cyB0byB0aGlzIGxlbmd0aCwgYXQgbGVhc3QgYXMgbG9uZyBhcyBhbnkgbnNbX19pXSwKKyAgICAgIC8vIGVxdWFsaXR5IGlmZiBfX25tYXggPSAyXl9fayAtIDEuCisgICAgICBfX2wgPSAoMVVMTCA8PCBfX3IpIC0gMTsKKworICAgICAgZm9yIChfU2VxTnVtYmVyIF9faSA9IDA7IF9faSA8IF9fbTsgX19pKyspCisgICAgICAgIHsKKyAgICAgICAgICBfX2FbX19pXSA9IDA7CisgICAgICAgICAgX19iW19faV0gPSBfX2w7CisgICAgICAgIH0KKyAgICAgIF9fbiA9IF9fbCAvIDI7CisKKyAgICAgIC8vIEludmFyaWFudHM6CisgICAgICAvLyAwIDw9IF9fYVtfX2ldIDw9IF9fbnNbX19pXSwgMCA8PSBfX2JbX19pXSA8PSBfX2wKKworI2RlZmluZSBfX1MoX19pKSAoX19iZWdpbl9zZXFzW19faV0uZmlyc3QpCisKKyAgICAgIC8vIEluaXRpYWwgcGFydGl0aW9uLgorICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPF9WYWx1ZVR5cGUsIF9TZXFOdW1iZXI+ID4gX19zYW1wbGU7CisKKyAgICAgIGZvciAoX1NlcU51bWJlciBfX2kgPSAwOyBfX2kgPCBfX207IF9faSsrKQorICAgICAgICBpZiAoX19uIDwgX19uc1tfX2ldKSAgICAvL19fc2VxdWVuY2UgbG9uZyBlbm91Z2gKKyAgICAgICAgICBfX3NhbXBsZS5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoX19TKF9faSlbX19uXSwgX19pKSk7CisgICAgICBfX2dudV9zZXF1ZW50aWFsOjpzb3J0KF9fc2FtcGxlLmJlZ2luKCksIF9fc2FtcGxlLmVuZCgpLCBfX2xjb21wKTsKKworICAgICAgZm9yIChfU2VxTnVtYmVyIF9faSA9IDA7IF9faSA8IF9fbTsgX19pKyspICAgICAgIC8vY29uY2VwdHVhbCBpbmZpbml0eQorICAgICAgICBpZiAoX19uID49IF9fbnNbX19pXSkgICAvL19fc2VxdWVuY2UgdG9vIHNob3J0LCBjb25jZXB0dWFsIGluZmluaXR5CisgICAgICAgICAgX19zYW1wbGUucHVzaF9iYWNrKAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoX19TKF9faSlbMF0gLypfX2R1bW15IGVsZW1lbnQqLywgX19pKSk7CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2xvY2FscmFuayA9IF9fcmFuayAvIF9fbDsKKworICAgICAgX1NlcU51bWJlciBfX2o7CisgICAgICBmb3IgKF9faiA9IDA7CisgICAgICAgICAgIF9faiA8IF9fbG9jYWxyYW5rICYmICgoX19uICsgMSkgPD0gX19uc1tfX3NhbXBsZVtfX2pdLnNlY29uZF0pOworICAgICAgICAgICArK19faikKKyAgICAgICAgX19hW19fc2FtcGxlW19fal0uc2Vjb25kXSArPSBfX24gKyAxOworICAgICAgZm9yICg7IF9faiA8IF9fbTsgX19qKyspCisgICAgICAgIF9fYltfX3NhbXBsZVtfX2pdLnNlY29uZF0gLT0gX19uICsgMTsKKyAgICAgIAorICAgICAgLy8gRnVydGhlciByZWZpbmVtZW50LgorICAgICAgd2hpbGUgKF9fbiA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBfX24gLz0gMjsKKworICAgICAgICAgIF9TZXFOdW1iZXIgX19sbWF4X3NlcSA9IC0xOyAgLy8gdG8gYXZvaWQgd2FybmluZworICAgICAgICAgIGNvbnN0IF9WYWx1ZVR5cGUqIF9fbG1heCA9IDA7IC8vIGltcG9zc2libGUgdG8gYXZvaWQgdGhlIHdhcm5pbmc/CisgICAgICAgICAgZm9yIChfU2VxTnVtYmVyIF9faSA9IDA7IF9faSA8IF9fbTsgX19pKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChfX2FbX19pXSA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKCFfX2xtYXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBfX2xtYXggPSAmKF9fUyhfX2kpW19fYVtfX2ldIC0gMV0pOworICAgICAgICAgICAgICAgICAgICAgIF9fbG1heF9zZXEgPSBfX2k7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIC8vIE1heCwgZmF2b3IgcmVhciBzZXF1ZW5jZXMuCisgICAgICAgICAgICAgICAgICAgICAgaWYgKCFfX2NvbXAoX19TKF9faSlbX19hW19faV0gLSAxXSwgKl9fbG1heCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbG1heCA9ICYoX19TKF9faSlbX19hW19faV0gLSAxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbG1heF9zZXEgPSBfX2k7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfU2VxTnVtYmVyIF9faTsKKyAgICAgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fbTsgX19pKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX21pZGRsZSA9IChfX2JbX19pXSArIF9fYVtfX2ldKSAvIDI7CisgICAgICAgICAgICAgIGlmIChfX2xtYXggJiYgX19taWRkbGUgPCBfX25zW19faV0gJiYKKyAgICAgICAgICAgICAgICAgIF9fbGNvbXAoc3RkOjptYWtlX3BhaXIoX19TKF9faSlbX19taWRkbGVdLCBfX2kpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoKl9fbG1heCwgX19sbWF4X3NlcSkpKQorICAgICAgICAgICAgICAgIF9fYVtfX2ldID0gc3RkOjptaW4oX19hW19faV0gKyBfX24gKyAxLCBfX25zW19faV0pOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX19iW19faV0gLT0gX19uICsgMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2xlZnRzaXplID0gMDsKKyAgICAgICAgICBmb3IgKF9TZXFOdW1iZXIgX19pID0gMDsgX19pIDwgX19tOyBfX2krKykKKyAgICAgICAgICAgICAgX19sZWZ0c2l6ZSArPSBfX2FbX19pXSAvIChfX24gKyAxKTsKKworICAgICAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX3NrZXcgPSBfX3JhbmsgLyAoX19uICsgMSkgLSBfX2xlZnRzaXplOworCisgICAgICAgICAgaWYgKF9fc2tldyA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIE1vdmUgdG8gdGhlIGxlZnQsIGZpbmQgc21hbGxlc3QuCisgICAgICAgICAgICAgIHN0ZDo6cHJpb3JpdHlfcXVldWU8c3RkOjpwYWlyPF9WYWx1ZVR5cGUsIF9TZXFOdW1iZXI+LAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxfVmFsdWVUeXBlLCBfU2VxTnVtYmVyPiA+LAorICAgICAgICAgICAgICAgIF9MZXhpY29ncmFwaGljUmV2ZXJzZTxfVmFsdWVUeXBlLCBfU2VxTnVtYmVyLCBfQ29tcGFyZT4gPgorICAgICAgICAgICAgICAgIF9fcHEoX19scmNvbXApOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgZm9yIChfU2VxTnVtYmVyIF9faSA9IDA7IF9faSA8IF9fbTsgX19pKyspCisgICAgICAgICAgICAgICAgaWYgKF9fYltfX2ldIDwgX19uc1tfX2ldKQorICAgICAgICAgICAgICAgICAgX19wcS5wdXNoKHN0ZDo6bWFrZV9wYWlyKF9fUyhfX2kpW19fYltfX2ldXSwgX19pKSk7CisKKyAgICAgICAgICAgICAgZm9yICg7IF9fc2tldyAhPSAwICYmICFfX3BxLmVtcHR5KCk7IC0tX19za2V3KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9TZXFOdW1iZXIgX19zb3VyY2UgPSBfX3BxLnRvcCgpLnNlY29uZDsKKyAgICAgICAgICAgICAgICAgIF9fcHEucG9wKCk7CisKKyAgICAgICAgICAgICAgICAgIF9fYVtfX3NvdXJjZV0KKyAgICAgICAgICAgICAgICAgICAgICA9IHN0ZDo6bWluKF9fYVtfX3NvdXJjZV0gKyBfX24gKyAxLCBfX25zW19fc291cmNlXSk7CisgICAgICAgICAgICAgICAgICBfX2JbX19zb3VyY2VdICs9IF9fbiArIDE7CisKKyAgICAgICAgICAgICAgICAgIGlmIChfX2JbX19zb3VyY2VdIDwgX19uc1tfX3NvdXJjZV0pCisgICAgICAgICAgICAgICAgICAgIF9fcHEucHVzaCgKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihfX1MoX19zb3VyY2UpW19fYltfX3NvdXJjZV1dLCBfX3NvdXJjZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChfX3NrZXcgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBNb3ZlIHRvIHRoZSByaWdodCwgZmluZCBncmVhdGVzdC4KKyAgICAgICAgICAgICAgc3RkOjpwcmlvcml0eV9xdWV1ZTxzdGQ6OnBhaXI8X1ZhbHVlVHlwZSwgX1NlcU51bWJlcj4sCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPF9WYWx1ZVR5cGUsIF9TZXFOdW1iZXI+ID4sCisgICAgICAgICAgICAgICAgX0xleGljb2dyYXBoaWM8X1ZhbHVlVHlwZSwgX1NlcU51bWJlciwgX0NvbXBhcmU+ID4KKyAgICAgICAgICAgICAgICAgIF9fcHEoX19sY29tcCk7CisKKyAgICAgICAgICAgICAgZm9yIChfU2VxTnVtYmVyIF9faSA9IDA7IF9faSA8IF9fbTsgX19pKyspCisgICAgICAgICAgICAgICAgaWYgKF9fYVtfX2ldID4gMCkKKyAgICAgICAgICAgICAgICAgIF9fcHEucHVzaChzdGQ6Om1ha2VfcGFpcihfX1MoX19pKVtfX2FbX19pXSAtIDFdLCBfX2kpKTsKKworICAgICAgICAgICAgICBmb3IgKDsgX19za2V3ICE9IDA7ICsrX19za2V3KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9TZXFOdW1iZXIgX19zb3VyY2UgPSBfX3BxLnRvcCgpLnNlY29uZDsKKyAgICAgICAgICAgICAgICAgIF9fcHEucG9wKCk7CisKKyAgICAgICAgICAgICAgICAgIF9fYVtfX3NvdXJjZV0gLT0gX19uICsgMTsKKyAgICAgICAgICAgICAgICAgIF9fYltfX3NvdXJjZV0gLT0gX19uICsgMTsKKworICAgICAgICAgICAgICAgICAgaWYgKF9fYVtfX3NvdXJjZV0gPiAwKQorICAgICAgICAgICAgICAgICAgICBfX3BxLnB1c2goc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgICAgICAgICBfX1MoX19zb3VyY2UpW19fYVtfX3NvdXJjZV0gLSAxXSwgX19zb3VyY2UpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLy8gUG9zdGNvbmRpdGlvbnM6CisgICAgICAvLyBfX2FbX19pXSA9PSBfX2JbX19pXSBpbiBtb3N0IGNhc2VzLCBleGNlcHQgd2hlbiBfX2FbX19pXSBoYXMgYmVlbgorICAgICAgLy8gY2xhbXBlZCBiZWNhdXNlIG9mIGhhdmluZyByZWFjaGVkIHRoZSBib3VuZGFyeQorCisgICAgICAvLyBOb3cgcmV0dXJuIHRoZSByZXN1bHQsIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0LgorCisgICAgICAvLyBDb21wYXJlIHRoZSBrZXlzIG9uIGJvdGggZWRnZXMgb2YgdGhlIGJvcmRlci4KKworICAgICAgLy8gTWF4aW11bSBvZiBsZWZ0IGVkZ2UsIG1pbmltdW0gb2YgcmlnaHQgZWRnZS4KKyAgICAgIF9WYWx1ZVR5cGUqIF9fbWF4bGVmdCA9IDA7CisgICAgICBfVmFsdWVUeXBlKiBfX21pbnJpZ2h0ID0gMDsKKyAgICAgIGZvciAoX1NlcU51bWJlciBfX2kgPSAwOyBfX2kgPCBfX207IF9faSsrKQorICAgICAgICB7CisgICAgICAgICAgaWYgKF9fYVtfX2ldID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfX21heGxlZnQpCisgICAgICAgICAgICAgICAgX19tYXhsZWZ0ID0gJihfX1MoX19pKVtfX2FbX19pXSAtIDFdKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8vIE1heCwgZmF2b3IgcmVhciBzZXF1ZW5jZXMuCisgICAgICAgICAgICAgICAgICBpZiAoIV9fY29tcChfX1MoX19pKVtfX2FbX19pXSAtIDFdLCAqX19tYXhsZWZ0KSkKKyAgICAgICAgICAgICAgICAgICAgX19tYXhsZWZ0ID0gJihfX1MoX19pKVtfX2FbX19pXSAtIDFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKF9fYltfX2ldIDwgX19uc1tfX2ldKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIV9fbWlucmlnaHQpCisgICAgICAgICAgICAgICAgX19taW5yaWdodCA9ICYoX19TKF9faSlbX19iW19faV1dKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8vIE1pbiwgZmF2b3IgZm9yZSBzZXF1ZW5jZXMuCisgICAgICAgICAgICAgICAgICBpZiAoX19jb21wKF9fUyhfX2kpW19fYltfX2ldXSwgKl9fbWlucmlnaHQpKQorICAgICAgICAgICAgICAgICAgICBfX21pbnJpZ2h0ID0gJihfX1MoX19pKVtfX2JbX19pXV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBfU2VxTnVtYmVyIF9fc2VxID0gMDsKKyAgICAgIGZvciAoX1NlcU51bWJlciBfX2kgPSAwOyBfX2kgPCBfX207IF9faSsrKQorICAgICAgICBfX2JlZ2luX29mZnNldHNbX19pXSA9IF9fUyhfX2kpICsgX19hW19faV07CisKKyAgICAgIGRlbGV0ZVtdIF9fbnM7CisgICAgICBkZWxldGVbXSBfX2E7CisgICAgICBkZWxldGVbXSBfX2I7CisgICAgfQorCisKKyAgLyoqIAorICAgKiAgQGJyaWVmIFNlbGVjdHMgdGhlIGVsZW1lbnQgYXQgYSBjZXJ0YWluIGdsb2JhbCBfX3JhbmsgZnJvbSBzZXZlcmFsCisgICAqICBzb3J0ZWQgc2VxdWVuY2VzLgorICAgKgorICAgKiAgVGhlIHNlcXVlbmNlcyBhcmUgcGFzc2VkIHZpYSBhIHNlcXVlbmNlIG9mIHJhbmRvbS1hY2Nlc3MKKyAgICogIGl0ZXJhdG9yIHBhaXJzLCBub25lIG9mIHRoZSBzZXF1ZW5jZXMgbWF5IGJlIGVtcHR5LgorICAgKiAgQHBhcmFtIF9fYmVnaW5fc2VxcyBCZWdpbiBvZiB0aGUgc2VxdWVuY2Ugb2YgaXRlcmF0b3IgcGFpcnMuCisgICAqICBAcGFyYW0gX19lbmRfc2VxcyBFbmQgb2YgdGhlIHNlcXVlbmNlIG9mIGl0ZXJhdG9yIHBhaXJzLgorICAgKiAgQHBhcmFtIF9fcmFuayBUaGUgZ2xvYmFsIHJhbmsgdG8gcGFydGl0aW9uIGF0LgorICAgKiAgQHBhcmFtIF9fb2Zmc2V0IFRoZSByYW5rIG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50IGluIHRoZSBnbG9iYWwKKyAgICogIHN1YnNlcXVlbmNlIG9mIGVsZW1lbnRzIGVxdWFsIHRvIHRoZSBzZWxlY3RlZCBlbGVtZW50LiBJZiB0aGUKKyAgICogIHNlbGVjdGVkIGVsZW1lbnQgaXMgdW5pcXVlLCB0aGlzIG51bWJlciBpcyAwLgorICAgKiAgQHBhcmFtIF9fY29tcCBUaGUgb3JkZXJpbmcgZnVuY3RvciwgZGVmYXVsdHMgdG8gc3RkOjpsZXNzLiAKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1JhblNlcXMsIHR5cGVuYW1lIF9SYW5rVHlwZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1RwCisgICAgbXVsdGlzZXFfc2VsZWN0aW9uKF9SYW5TZXFzIF9fYmVnaW5fc2VxcywgX1JhblNlcXMgX19lbmRfc2VxcywKKyAgICAgICAgICAgICAgICAgICAgICAgX1JhbmtUeXBlIF9fcmFuaywKKyAgICAgICAgICAgICAgICAgICAgICAgX1JhbmtUeXBlJiBfX29mZnNldCwgX0NvbXBhcmUgX19jb21wID0gc3RkOjpsZXNzPF9UcD4oKSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9DQUxMKF9fZW5kX3NlcXMgLSBfX2JlZ2luX3NlcXMpCisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JhblNlcXM+Ojp2YWx1ZV90eXBlOjpmaXJzdF90eXBlCisgICAgICAgIF9JdDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JhblNlcXM+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICAgICAgX1NlcU51bWJlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0Pjo6ZGlmZmVyZW5jZV90eXBlCisgICAgICAgIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgX0xleGljb2dyYXBoaWM8X1RwLCBfU2VxTnVtYmVyLCBfQ29tcGFyZT4gX19sY29tcChfX2NvbXApOworICAgICAgX0xleGljb2dyYXBoaWNSZXZlcnNlPF9UcCwgX1NlcU51bWJlciwgX0NvbXBhcmU+IF9fbHJjb21wKF9fY29tcCk7CisKKyAgICAgIC8vIE51bWJlciBvZiBzZXF1ZW5jZXMsIG51bWJlciBvZiBlbGVtZW50cyBpbiB0b3RhbCAocG9zc2libHkKKyAgICAgIC8vIGluY2x1ZGluZyBwYWRkaW5nKS4KKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX20gPSBzdGQ6OmRpc3RhbmNlKF9fYmVnaW5fc2VxcywgX19lbmRfc2Vxcyk7CisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19ubiA9IDA7CisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19ubWF4LCBfX24sIF9fcjsKKworICAgICAgZm9yIChfU2VxTnVtYmVyIF9faSA9IDA7IF9faSA8IF9fbTsgX19pKyspCisgICAgICAgIF9fbm4gKz0gc3RkOjpkaXN0YW5jZShfX2JlZ2luX3NlcXNbX19pXS5maXJzdCwKKwkJCSAgICAgIF9fYmVnaW5fc2Vxc1tfX2ldLnNlY29uZCk7CisKKyAgICAgIGlmIChfX20gPT0gMCB8fCBfX25uID09IDAgfHwgX19yYW5rIDwgMCB8fCBfX3JhbmsgPj0gX19ubikKKyAgICAgICAgeworICAgICAgICAgIC8vIHJlc3VsdCB1bmRlZmluZWQgaWYgdGhlcmUgaXMgbm8gZGF0YSBvciBfX3JhbmsgaXMgb3V0c2lkZSBib3VuZHMKKyAgICAgICAgICB0aHJvdyBzdGQ6OmV4Y2VwdGlvbigpOworICAgICAgICB9CisKKworICAgICAgX0RpZmZlcmVuY2VUeXBlKiBfX25zID0gbmV3IF9EaWZmZXJlbmNlVHlwZVtfX21dOworICAgICAgX0RpZmZlcmVuY2VUeXBlKiBfX2EgPSBuZXcgX0RpZmZlcmVuY2VUeXBlW19fbV07CisgICAgICBfRGlmZmVyZW5jZVR5cGUqIF9fYiA9IG5ldyBfRGlmZmVyZW5jZVR5cGVbX19tXTsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2w7CisKKyAgICAgIF9fbnNbMF0gPSBzdGQ6OmRpc3RhbmNlKF9fYmVnaW5fc2Vxc1swXS5maXJzdCwgX19iZWdpbl9zZXFzWzBdLnNlY29uZCk7CisgICAgICBfX25tYXggPSBfX25zWzBdOworICAgICAgZm9yIChfU2VxTnVtYmVyIF9faSA9IDA7IF9faSA8IF9fbTsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBfX25zW19faV0gPSBzdGQ6OmRpc3RhbmNlKF9fYmVnaW5fc2Vxc1tfX2ldLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iZWdpbl9zZXFzW19faV0uc2Vjb25kKTsKKyAgICAgICAgICBfX25tYXggPSBzdGQ6Om1heChfX25tYXgsIF9fbnNbX19pXSk7CisgICAgICAgIH0KKworICAgICAgX19yID0gX19yZF9sb2cyKF9fbm1heCkgKyAxOworCisgICAgICAvLyBQYWQgYWxsIGxpc3RzIHRvIHRoaXMgbGVuZ3RoLCBhdCBsZWFzdCBhcyBsb25nIGFzIGFueSBuc1tfX2ldLAorICAgICAgLy8gZXF1YWxpdHkgaWZmIF9fbm1heCA9IDJeX19rIC0gMQorICAgICAgX19sID0gX19yb3VuZF91cF90b19wb3cyKF9fcikgLSAxOworCisgICAgICBmb3IgKF9TZXFOdW1iZXIgX19pID0gMDsgX19pIDwgX19tOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9fYVtfX2ldID0gMDsKKyAgICAgICAgICBfX2JbX19pXSA9IF9fbDsKKyAgICAgICAgfQorICAgICAgX19uID0gX19sIC8gMjsKKworICAgICAgLy8gSW52YXJpYW50czoKKyAgICAgIC8vIDAgPD0gX19hW19faV0gPD0gX19uc1tfX2ldLCAwIDw9IF9fYltfX2ldIDw9IF9fbAorCisjZGVmaW5lIF9fUyhfX2kpIChfX2JlZ2luX3NlcXNbX19pXS5maXJzdCkKKworICAgICAgLy8gSW5pdGlhbCBwYXJ0aXRpb24uCisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8X1RwLCBfU2VxTnVtYmVyPiA+IF9fc2FtcGxlOworCisgICAgICBmb3IgKF9TZXFOdW1iZXIgX19pID0gMDsgX19pIDwgX19tOyBfX2krKykKKyAgICAgICAgaWYgKF9fbiA8IF9fbnNbX19pXSkKKyAgICAgICAgICBfX3NhbXBsZS5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoX19TKF9faSlbX19uXSwgX19pKSk7CisgICAgICBfX2dudV9zZXF1ZW50aWFsOjpzb3J0KF9fc2FtcGxlLmJlZ2luKCksIF9fc2FtcGxlLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2xjb21wLCBzZXF1ZW50aWFsX3RhZygpKTsKKworICAgICAgLy8gQ29uY2VwdHVhbCBpbmZpbml0eS4KKyAgICAgIGZvciAoX1NlcU51bWJlciBfX2kgPSAwOyBfX2kgPCBfX207IF9faSsrKQorICAgICAgICBpZiAoX19uID49IF9fbnNbX19pXSkKKyAgICAgICAgICBfX3NhbXBsZS5wdXNoX2JhY2soCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihfX1MoX19pKVswXSAvKl9fZHVtbXkgZWxlbWVudCovLCBfX2kpKTsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbG9jYWxyYW5rID0gX19yYW5rIC8gX19sOworCisgICAgICBfU2VxTnVtYmVyIF9fajsKKyAgICAgIGZvciAoX19qID0gMDsKKyAgICAgICAgICAgX19qIDwgX19sb2NhbHJhbmsgJiYgKChfX24gKyAxKSA8PSBfX25zW19fc2FtcGxlW19fal0uc2Vjb25kXSk7CisgICAgICAgICAgICsrX19qKQorICAgICAgICBfX2FbX19zYW1wbGVbX19qXS5zZWNvbmRdICs9IF9fbiArIDE7CisgICAgICBmb3IgKDsgX19qIDwgX19tOyArK19faikKKyAgICAgICAgX19iW19fc2FtcGxlW19fal0uc2Vjb25kXSAtPSBfX24gKyAxOworCisgICAgICAvLyBGdXJ0aGVyIHJlZmluZW1lbnQuCisgICAgICB3aGlsZSAoX19uID4gMCkKKyAgICAgICAgeworICAgICAgICAgIF9fbiAvPSAyOworCisgICAgICAgICAgY29uc3QgX1RwKiBfX2xtYXggPSAwOworICAgICAgICAgIGZvciAoX1NlcU51bWJlciBfX2kgPSAwOyBfX2kgPCBfX207ICsrX19pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoX19hW19faV0gPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICghX19sbWF4KQorICAgICAgICAgICAgICAgICAgICBfX2xtYXggPSAmKF9fUyhfX2kpW19fYVtfX2ldIC0gMV0pOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKF9fY29tcCgqX19sbWF4LCBfX1MoX19pKVtfX2FbX19pXSAtIDFdKSkgICAgICAvL21heAorICAgICAgICAgICAgICAgICAgICAgICAgX19sbWF4ID0gJihfX1MoX19pKVtfX2FbX19pXSAtIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9TZXFOdW1iZXIgX19pOworICAgICAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19tOyBfX2krKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbWlkZGxlID0gKF9fYltfX2ldICsgX19hW19faV0pIC8gMjsKKyAgICAgICAgICAgICAgaWYgKF9fbG1heCAmJiBfX21pZGRsZSA8IF9fbnNbX19pXQorICAgICAgICAgICAgICAgICAgJiYgX19jb21wKF9fUyhfX2kpW19fbWlkZGxlXSwgKl9fbG1heCkpCisgICAgICAgICAgICAgICAgX19hW19faV0gPSBzdGQ6Om1pbihfX2FbX19pXSArIF9fbiArIDEsIF9fbnNbX19pXSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfX2JbX19pXSAtPSBfX24gKyAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbGVmdHNpemUgPSAwOworICAgICAgICAgIGZvciAoX1NlcU51bWJlciBfX2kgPSAwOyBfX2kgPCBfX207ICsrX19pKQorICAgICAgICAgICAgICBfX2xlZnRzaXplICs9IF9fYVtfX2ldIC8gKF9fbiArIDEpOworCisgICAgICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fc2tldyA9IF9fcmFuayAvIChfX24gKyAxKSAtIF9fbGVmdHNpemU7CisKKyAgICAgICAgICBpZiAoX19za2V3ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gTW92ZSB0byB0aGUgbGVmdCwgZmluZCBzbWFsbGVzdC4KKyAgICAgICAgICAgICAgc3RkOjpwcmlvcml0eV9xdWV1ZTxzdGQ6OnBhaXI8X1RwLCBfU2VxTnVtYmVyPiwKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8X1RwLCBfU2VxTnVtYmVyPiA+LAorICAgICAgICAgICAgICAgIF9MZXhpY29ncmFwaGljUmV2ZXJzZTxfVHAsIF9TZXFOdW1iZXIsIF9Db21wYXJlPiA+CisgICAgICAgICAgICAgICAgICBfX3BxKF9fbHJjb21wKTsKKworICAgICAgICAgICAgICBmb3IgKF9TZXFOdW1iZXIgX19pID0gMDsgX19pIDwgX19tOyArK19faSkKKyAgICAgICAgICAgICAgICBpZiAoX19iW19faV0gPCBfX25zW19faV0pCisgICAgICAgICAgICAgICAgICBfX3BxLnB1c2goc3RkOjptYWtlX3BhaXIoX19TKF9faSlbX19iW19faV1dLCBfX2kpKTsKKworICAgICAgICAgICAgICBmb3IgKDsgX19za2V3ICE9IDAgJiYgIV9fcHEuZW1wdHkoKTsgLS1fX3NrZXcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX1NlcU51bWJlciBfX3NvdXJjZSA9IF9fcHEudG9wKCkuc2Vjb25kOworICAgICAgICAgICAgICAgICAgX19wcS5wb3AoKTsKKworICAgICAgICAgICAgICAgICAgX19hW19fc291cmNlXQorICAgICAgICAgICAgICAgICAgICAgID0gc3RkOjptaW4oX19hW19fc291cmNlXSArIF9fbiArIDEsIF9fbnNbX19zb3VyY2VdKTsKKyAgICAgICAgICAgICAgICAgIF9fYltfX3NvdXJjZV0gKz0gX19uICsgMTsKKworICAgICAgICAgICAgICAgICAgaWYgKF9fYltfX3NvdXJjZV0gPCBfX25zW19fc291cmNlXSkKKyAgICAgICAgICAgICAgICAgICAgX19wcS5wdXNoKAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKF9fUyhfX3NvdXJjZSlbX19iW19fc291cmNlXV0sIF9fc291cmNlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKF9fc2tldyA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIE1vdmUgdG8gdGhlIHJpZ2h0LCBmaW5kIGdyZWF0ZXN0LgorICAgICAgICAgICAgICBzdGQ6OnByaW9yaXR5X3F1ZXVlPHN0ZDo6cGFpcjxfVHAsIF9TZXFOdW1iZXI+LAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxfVHAsIF9TZXFOdW1iZXI+ID4sCisgICAgICAgICAgICAgICAgX0xleGljb2dyYXBoaWM8X1RwLCBfU2VxTnVtYmVyLCBfQ29tcGFyZT4gPiBfX3BxKF9fbGNvbXApOworCisgICAgICAgICAgICAgIGZvciAoX1NlcU51bWJlciBfX2kgPSAwOyBfX2kgPCBfX207ICsrX19pKQorICAgICAgICAgICAgICAgIGlmIChfX2FbX19pXSA+IDApCisgICAgICAgICAgICAgICAgICBfX3BxLnB1c2goc3RkOjptYWtlX3BhaXIoX19TKF9faSlbX19hW19faV0gLSAxXSwgX19pKSk7CisKKyAgICAgICAgICAgICAgZm9yICg7IF9fc2tldyAhPSAwOyArK19fc2tldykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfU2VxTnVtYmVyIF9fc291cmNlID0gX19wcS50b3AoKS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICBfX3BxLnBvcCgpOworCisgICAgICAgICAgICAgICAgICBfX2FbX19zb3VyY2VdIC09IF9fbiArIDE7CisgICAgICAgICAgICAgICAgICBfX2JbX19zb3VyY2VdIC09IF9fbiArIDE7CisKKyAgICAgICAgICAgICAgICAgIGlmIChfX2FbX19zb3VyY2VdID4gMCkKKyAgICAgICAgICAgICAgICAgICAgX19wcS5wdXNoKHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgICAgICAgICAgX19TKF9fc291cmNlKVtfX2FbX19zb3VyY2VdIC0gMV0sIF9fc291cmNlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIC8vIFBvc3Rjb25kaXRpb25zOgorICAgICAgLy8gX19hW19faV0gPT0gX19iW19faV0gaW4gbW9zdCBjYXNlcywgZXhjZXB0IHdoZW4gX19hW19faV0gaGFzIGJlZW4KKyAgICAgIC8vIGNsYW1wZWQgYmVjYXVzZSBvZiBoYXZpbmcgcmVhY2hlZCB0aGUgYm91bmRhcnkKKworICAgICAgLy8gTm93IHJldHVybiB0aGUgcmVzdWx0LCBjYWxjdWxhdGUgdGhlIG9mZnNldC4KKworICAgICAgLy8gQ29tcGFyZSB0aGUga2V5cyBvbiBib3RoIGVkZ2VzIG9mIHRoZSBib3JkZXIuCisKKyAgICAgIC8vIE1heGltdW0gb2YgbGVmdCBlZGdlLCBtaW5pbXVtIG9mIHJpZ2h0IGVkZ2UuCisgICAgICBib29sIF9fbWF4bGVmdHNldCA9IGZhbHNlLCBfX21pbnJpZ2h0c2V0ID0gZmFsc2U7CisKKyAgICAgIC8vIEltcG9zc2libGUgdG8gYXZvaWQgdGhlIHdhcm5pbmc/CisgICAgICBfVHAgX19tYXhsZWZ0LCBfX21pbnJpZ2h0OworICAgICAgZm9yIChfU2VxTnVtYmVyIF9faSA9IDA7IF9faSA8IF9fbTsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX19hW19faV0gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIV9fbWF4bGVmdHNldCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfX21heGxlZnQgPSBfX1MoX19pKVtfX2FbX19pXSAtIDFdOworICAgICAgICAgICAgICAgICAgX19tYXhsZWZ0c2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvLyBNYXguCisgICAgICAgICAgICAgICAgICBpZiAoX19jb21wKF9fbWF4bGVmdCwgX19TKF9faSlbX19hW19faV0gLSAxXSkpCisgICAgICAgICAgICAgICAgICAgIF9fbWF4bGVmdCA9IF9fUyhfX2kpW19fYVtfX2ldIC0gMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGlmIChfX2JbX19pXSA8IF9fbnNbX19pXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfX21pbnJpZ2h0c2V0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9fbWlucmlnaHQgPSBfX1MoX19pKVtfX2JbX19pXV07CisgICAgICAgICAgICAgICAgICBfX21pbnJpZ2h0c2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvLyBNaW4uCisgICAgICAgICAgICAgICAgICBpZiAoX19jb21wKF9fUyhfX2kpW19fYltfX2ldXSwgX19taW5yaWdodCkpCisgICAgICAgICAgICAgICAgICAgIF9fbWlucmlnaHQgPSBfX1MoX19pKVtfX2JbX19pXV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBNaW5yaWdodCBpcyB0aGUgX19zcGxpdHRlciwgaW4gYW55IGNhc2UuCisKKyAgICAgIGlmICghX19tYXhsZWZ0c2V0IHx8IF9fY29tcChfX21pbnJpZ2h0LCBfX21heGxlZnQpKQorICAgICAgICB7CisgICAgICAgICAgLy8gR29vZCBsdWNrLCBldmVyeXRoaW5nIGlzIHNwbGl0IHVuYW1iaWd1b3VzbHkuCisgICAgICAgICAgX19vZmZzZXQgPSAwOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvLyBXZSBoYXZlIHRvIGNhbGN1bGF0ZSBhbiBvZmZzZXQuCisgICAgICAgICAgX19vZmZzZXQgPSAwOworCisgICAgICAgICAgZm9yIChfU2VxTnVtYmVyIF9faSA9IDA7IF9faSA8IF9fbTsgKytfX2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9EaWZmZXJlbmNlVHlwZSBsYgorICAgICAgICAgICAgICAgID0gc3RkOjpsb3dlcl9ib3VuZChfX1MoX19pKSwgX19TKF9faSkgKyBfX25zW19faV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbWlucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29tcCkgLSBfX1MoX19pKTsKKyAgICAgICAgICAgICAgX19vZmZzZXQgKz0gX19hW19faV0gLSBsYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBkZWxldGVbXSBfX25zOworICAgICAgZGVsZXRlW10gX19hOworICAgICAgZGVsZXRlW10gX19iOworCisgICAgICByZXR1cm4gX19taW5yaWdodDsKKyAgICB9Cit9CisKKyN1bmRlZiBfX1MKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX01VTFRJU0VRX1NFTEVDVElPTl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL211bHRpd2F5X21lcmdlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL211bHRpd2F5X21lcmdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjliYjk5NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvbXVsdGl3YXlfbWVyZ2UuaApAQCAtMCwwICsxLDIwNzIgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9tdWx0aXdheV9tZXJnZS5oCisqICBAYnJpZWYgSW1wbGVtZW50YXRpb24gb2Ygc2VxdWVudGlhbCBhbmQgcGFyYWxsZWwgbXVsdGl3YXkgbWVyZ2UuCisqCisqICBFeHBsYW5hdGlvbnMgb24gdGhlIGhpZ2gtc3BlZWQgbWVyZ2luZyByb3V0aW5lcyBpbiB0aGUgYXBwZW5kaXggb2YKKyoKKyogIFAuIFNhbmRlcnMuCisqICBGYXN0IHByaW9yaXR5IHF1ZXVlcyBmb3IgY2FjaGVkIG1lbW9yeS4KKyogIEFDTSBKb3VybmFsIG9mIEV4cGVyaW1lbnRhbCBBbGdvcml0aG1pY3MsIDUsIDIwMDAuCisqCisqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyovCisKKy8vIFdyaXR0ZW4gYnkgSm9oYW5uZXMgU2luZ2xlciBhbmQgTWFudWVsIEhvbHRncmV3ZS4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9NVUxUSVdBWV9NRVJHRV9ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX01VTFRJV0FZX01FUkdFX0gKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ28uaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9mZWF0dXJlcy5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3BhcmFsbGVsLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvbG9zZXJ0cmVlLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvbXVsdGlzZXFfc2VsZWN0aW9uLmg+CisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworI2luY2x1ZGUgPHBhcmFsbGVsL2NoZWNrZXJzLmg+CisjZW5kaWYKKworLyoqIEBicmllZiBMZW5ndGggb2YgYSBzZXF1ZW5jZSBkZXNjcmliZWQgYnkgYSBwYWlyIG9mIGl0ZXJhdG9ycy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfTEVOR1RIKF9fcykgKChfX3MpLnNlY29uZCAtIChfX3MpLmZpcnN0KQorCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgX19tZXJnZV9hZHZhbmNlKF9SQUl0ZXIxJiwgX1JBSXRlcjEsIF9SQUl0ZXIyJiwgX1JBSXRlcjIsCisJCSAgICBfT3V0cHV0SXRlcmF0b3IsIF9EaWZmZXJlbmNlVHAsIF9Db21wYXJlKTsKKworICAvKiogQGJyaWVmIF9JdGVyYXRvciB3cmFwcGVyIHN1cHBvcnRpbmcgYW4gaW1wbGljaXQgc3VwcmVtdW0gYXQgdGhlIGVuZAorICAgKiAgICAgICAgIG9mIHRoZSBzZXF1ZW5jZSwgZG9taW5hdGluZyBhbGwgY29tcGFyaXNvbnMuCisgICAqCisgICAqIFRoZSBpbXBsaWNpdCBzdXByZW11bSBjb21lcyB3aXRoIGEgcGVyZm9ybWFuY2UgY29zdC4KKyAgICoKKyAgICogRGVyaXZpbmcgZnJvbSBfUkFJdGVyIGlzIG5vdCBwb3NzaWJsZSBzaW5jZQorICAgKiBfUkFJdGVyIG5lZWQgbm90IGJlIGEgY2xhc3MuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBjbGFzcyBfR3VhcmRlZEl0ZXJhdG9yCisgICAgeworICAgIHByaXZhdGU6CisgICAgICAvKiogQGJyaWVmIEN1cnJlbnQgaXRlcmF0b3IgX19wb3NpdGlvbi4gKi8KKyAgICAgIF9SQUl0ZXIgX01fY3VycmVudDsKKworICAgICAgLyoqIEBicmllZiBFbmQgaXRlcmF0b3Igb2YgdGhlIHNlcXVlbmNlLiAqLworICAgICAgX1JBSXRlciBfTV9lbmQ7CisKKyAgICAgIC8qKiBAYnJpZWYgX0NvbXBhcmUuICovCisgICAgICBfQ29tcGFyZSYgX19jb21wOworCisgICAgcHVibGljOgorICAgICAgLyoqIEBicmllZiBDb25zdHJ1Y3Rvci4gU2V0cyBpdGVyYXRvciB0byBiZWdpbm5pbmcgb2Ygc2VxdWVuY2UuCisgICAgICAqICBAcGFyYW0gX19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBzZXF1ZW5jZS4KKyAgICAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2Ygc2VxdWVuY2UuCisgICAgICAqICBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IgcHJvdmlkZWQgZm9yIGFzc29jaWF0ZWQgb3ZlcmxvYWRlZAorICAgICAgKiAgY29tcGFyZSBvcGVyYXRvcnMuICovCisgICAgICBfR3VhcmRlZEl0ZXJhdG9yKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwgX0NvbXBhcmUmIF9fY29tcCkKKyAgICAgIDogX01fY3VycmVudChfX2JlZ2luKSwgX01fZW5kKF9fZW5kKSwgX19jb21wKF9fY29tcCkKKyAgICAgIHsgfQorCisgICAgICAvKiogQGJyaWVmIFByZS1pbmNyZW1lbnQgb3BlcmF0b3IuCisgICAgICAqICBAcmV0dXJuIFRoaXMuICovCisgICAgICBfR3VhcmRlZEl0ZXJhdG9yPF9SQUl0ZXIsIF9Db21wYXJlPiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCSsrX01fY3VycmVudDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKiBAYnJpZWYgRGVyZWZlcmVuY2Ugb3BlcmF0b3IuCisgICAgICAqICBAcmV0dXJuIFJlZmVyZW5jZWQgZWxlbWVudC4gKi8KKyAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+Ojp2YWx1ZV90eXBlJgorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsgcmV0dXJuICpfTV9jdXJyZW50OyB9CisKKyAgICAgIC8qKiBAYnJpZWYgQ29udmVydCB0byB3cmFwcGVkIGl0ZXJhdG9yLgorICAgICAgKiAgQHJldHVybiBXcmFwcGVkIGl0ZXJhdG9yLiAqLworICAgICAgb3BlcmF0b3IgX1JBSXRlcigpCisgICAgICB7IHJldHVybiBfTV9jdXJyZW50OyB9CisKKyAgICAgIC8qKiBAYnJpZWYgQ29tcGFyZSB0d28gZWxlbWVudHMgcmVmZXJlbmNlZCBieSBndWFyZGVkIGl0ZXJhdG9ycy4KKyAgICAgICAqICBAcGFyYW0gX19iaTEgRmlyc3QgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtIF9fYmkyIFNlY29uZCBpdGVyYXRvci4KKyAgICAgICAqICBAcmV0dXJuIEBjIHRydWUgaWYgbGVzcy4gKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcjwoX0d1YXJkZWRJdGVyYXRvcjxfUkFJdGVyLCBfQ29tcGFyZT4mIF9fYmkxLAorCQlfR3VhcmRlZEl0ZXJhdG9yPF9SQUl0ZXIsIF9Db21wYXJlPiYgX19iaTIpCisgICAgICB7CisJaWYgKF9fYmkxLl9NX2N1cnJlbnQgPT0gX19iaTEuX01fZW5kKSAgICAgICAvLyBfX2JpMSBpcyBzdXAKKwkgIHJldHVybiBfX2JpMi5fTV9jdXJyZW50ID09IF9fYmkyLl9NX2VuZDsgIC8vIF9fYmkyIGlzIG5vdCBzdXAKKwlpZiAoX19iaTIuX01fY3VycmVudCA9PSBfX2JpMi5fTV9lbmQpICAgICAgIC8vIF9fYmkyIGlzIHN1cAorCSAgcmV0dXJuIHRydWU7CisJcmV0dXJuIChfX2JpMS5fX2NvbXApKCpfX2JpMSwgKl9fYmkyKTsgICAgICAvLyBub3JtYWwgY29tcGFyZQorICAgICAgfQorCisgICAgICAvKiogQGJyaWVmIENvbXBhcmUgdHdvIGVsZW1lbnRzIHJlZmVyZW5jZWQgYnkgZ3VhcmRlZCBpdGVyYXRvcnMuCisgICAgICAgKiAgQHBhcmFtIF9fYmkxIEZpcnN0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSBfX2JpMiBTZWNvbmQgaXRlcmF0b3IuCisgICAgICAgKiAgQHJldHVybiBAYyBUcnVlIGlmIGxlc3MgZXF1YWwuICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I8PShfR3VhcmRlZEl0ZXJhdG9yPF9SQUl0ZXIsIF9Db21wYXJlPiYgX19iaTEsCisJCSBfR3VhcmRlZEl0ZXJhdG9yPF9SQUl0ZXIsIF9Db21wYXJlPiYgX19iaTIpCisgICAgICB7CisJaWYgKF9fYmkyLl9NX2N1cnJlbnQgPT0gX19iaTIuX01fZW5kKSAgICAgICAvLyBfX2JpMSBpcyBzdXAKKwkgIHJldHVybiBfX2JpMS5fTV9jdXJyZW50ICE9IF9fYmkxLl9NX2VuZDsgIC8vIF9fYmkyIGlzIG5vdCBzdXAKKwlpZiAoX19iaTEuX01fY3VycmVudCA9PSBfX2JpMS5fTV9lbmQpICAgICAgIC8vIF9fYmkyIGlzIHN1cAorCSAgcmV0dXJuIGZhbHNlOworCXJldHVybiAhKF9fYmkxLl9fY29tcCkoKl9fYmkyLCAqX19iaTEpOyAgICAgLy8gbm9ybWFsIGNvbXBhcmUKKyAgICAgIH0gCisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBjbGFzcyBfVW5ndWFyZGVkSXRlcmF0b3IKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIC8qKiBAYnJpZWYgQ3VycmVudCBpdGVyYXRvciBfX3Bvc2l0aW9uLiAqLworICAgICAgX1JBSXRlciBfTV9jdXJyZW50OworICAgICAgLyoqIEBicmllZiBfQ29tcGFyZS4gKi8KKyAgICAgIF9Db21wYXJlJiBfX2NvbXA7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogQGJyaWVmIENvbnN0cnVjdG9yLiBTZXRzIGl0ZXJhdG9yIHRvIGJlZ2lubmluZyBvZiBzZXF1ZW5jZS4KKyAgICAgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIHNlcXVlbmNlLgorICAgICAgKiAgQHBhcmFtIF9fZW5kIFVudXNlZCwgb25seSBmb3IgY29tcGF0aWJpbGl0eS4KKyAgICAgICogIEBwYXJhbSBfX2NvbXAgVW51c2VkLCBvbmx5IGZvciBjb21wYXRpYmlsaXR5LiAqLworICAgICAgX1VuZ3VhcmRlZEl0ZXJhdG9yKF9SQUl0ZXIgX19iZWdpbiwKKyAgICAgICAgICAgICAgICAJIF9SQUl0ZXIgLyogX19lbmQgKi8sIF9Db21wYXJlJiBfX2NvbXApCisgICAgICA6IF9NX2N1cnJlbnQoX19iZWdpbiksIF9fY29tcChfX2NvbXApCisgICAgICB7IH0KKworICAgICAgLyoqIEBicmllZiBQcmUtaW5jcmVtZW50IG9wZXJhdG9yLgorICAgICAgKiAgQHJldHVybiBUaGlzLiAqLworICAgICAgX1VuZ3VhcmRlZEl0ZXJhdG9yPF9SQUl0ZXIsIF9Db21wYXJlPiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCSsrX01fY3VycmVudDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKiBAYnJpZWYgRGVyZWZlcmVuY2Ugb3BlcmF0b3IuCisgICAgICAqICBAcmV0dXJuIFJlZmVyZW5jZWQgZWxlbWVudC4gKi8KKyAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+Ojp2YWx1ZV90eXBlJgorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsgcmV0dXJuICpfTV9jdXJyZW50OyB9CisKKyAgICAgIC8qKiBAYnJpZWYgQ29udmVydCB0byB3cmFwcGVkIGl0ZXJhdG9yLgorICAgICAgKiAgQHJldHVybiBXcmFwcGVkIGl0ZXJhdG9yLiAqLworICAgICAgb3BlcmF0b3IgX1JBSXRlcigpCisgICAgICB7IHJldHVybiBfTV9jdXJyZW50OyB9CisKKyAgICAgIC8qKiBAYnJpZWYgQ29tcGFyZSB0d28gZWxlbWVudHMgcmVmZXJlbmNlZCBieSB1bmd1YXJkZWQgaXRlcmF0b3JzLgorICAgICAgICogIEBwYXJhbSBfX2JpMSBGaXJzdCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gX19iaTIgU2Vjb25kIGl0ZXJhdG9yLgorICAgICAgICogIEByZXR1cm4gQGMgdHJ1ZSBpZiBsZXNzLiAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPChfVW5ndWFyZGVkSXRlcmF0b3I8X1JBSXRlciwgX0NvbXBhcmU+JiBfX2JpMSwKKwkJX1VuZ3VhcmRlZEl0ZXJhdG9yPF9SQUl0ZXIsIF9Db21wYXJlPiYgX19iaTIpCisgICAgICB7CisJLy8gTm9ybWFsIGNvbXBhcmUuCisJcmV0dXJuIChfX2JpMS5fX2NvbXApKCpfX2JpMSwgKl9fYmkyKTsKKyAgICAgIH0KKworICAgICAgLyoqIEBicmllZiBDb21wYXJlIHR3byBlbGVtZW50cyByZWZlcmVuY2VkIGJ5IHVuZ3VhcmRlZCBpdGVyYXRvcnMuCisgICAgICAgKiAgQHBhcmFtIF9fYmkxIEZpcnN0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSBfX2JpMiBTZWNvbmQgaXRlcmF0b3IuCisgICAgICAgKiAgQHJldHVybiBAYyBUcnVlIGlmIGxlc3MgZXF1YWwuICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I8PShfVW5ndWFyZGVkSXRlcmF0b3I8X1JBSXRlciwgX0NvbXBhcmU+JiBfX2JpMSwKKwkJIF9Vbmd1YXJkZWRJdGVyYXRvcjxfUkFJdGVyLCBfQ29tcGFyZT4mIF9fYmkyKQorICAgICAgeworCS8vIE5vcm1hbCBjb21wYXJlLgorCXJldHVybiAhKF9fYmkxLl9fY29tcCkoKl9fYmkyLCAqX19iaTEpOworICAgICAgfQorICAgIH07CisKKyAgLyoqIEBicmllZiBIaWdobHkgZWZmaWNpZW50IDMtd2F5IG1lcmdpbmcgcHJvY2VkdXJlLgorICAgKgorICAgKiBNZXJnaW5nIGlzIGRvbmUgd2l0aCB0aGUgYWxnb3JpdGhtIGltcGxlbWVudGF0aW9uIGRlc2NyaWJlZCBieSBQZXRlcgorICAgKiBTYW5kZXJzLiAgQmFzaWNhbGx5LCB0aGUgaWRlYSBpcyB0byBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIG5lY2Vzc2FyeQorICAgKiBjb21wYXJpc29uIGFmdGVyIG1lcmdpbmcgYW4gZWxlbWVudC4gIFRoZSBpbXBsZW1lbnRhdGlvbiB0cmljaworICAgKiB0aGF0IG1ha2VzIHRoaXMgZmFzdCBpcyB0aGF0IHRoZSBvcmRlciBvZiB0aGUgc2VxdWVuY2VzIGlzIHN0b3JlZAorICAgKiBpbiB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciAodHJhbnNsYXRlZCBpbnRvIGxhYmVscyBpbiBDKyspLgorICAgKgorICAgKiBUaGlzIHdvcmtzIHdlbGwgZm9yIG1lcmdpbmcgdXAgdG8gNCBzZXF1ZW5jZXMuCisgICAqCisgICAqIE5vdGUgdGhhdCBtYWtpbmcgdGhlIG1lcmdpbmcgc3RhYmxlIGRvZXMgQGEgbm90IGNvbWUgYXQgYQorICAgKiBwZXJmb3JtYW5jZSBoaXQuCisgICAqCisgICAqIFdoZXRoZXIgdGhlIG1lcmdpbmcgaXMgZG9uZSBndWFyZGVkIG9yIHVuZ3VhcmRlZCBpcyBzZWxlY3RlZCBieSB0aGUKKyAgICogdXNlZCBpdGVyYXRvciBjbGFzcy4KKyAgICoKKyAgICogQHBhcmFtIF9fc2Vxc19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBpdGVyYXRvciBwYWlyIGlucHV0IHNlcXVlbmNlLgorICAgKiBAcGFyYW0gX19zZXFzX2VuZCBFbmQgaXRlcmF0b3Igb2YgaXRlcmF0b3IgcGFpciBpbnB1dCBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fdGFyZ2V0IEJlZ2luIGl0ZXJhdG9yIG9mIG91dHB1dCBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgKiBAcGFyYW0gX19sZW5ndGggTWF4aW11bSBsZW5ndGggdG8gbWVyZ2UsIGxlc3MgZXF1YWwgdGhhbiB0aGUKKyAgICogdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGF2YWlsYWJsZS4KKyAgICoKKyAgICogQHJldHVybiBFbmQgaXRlcmF0b3Igb2Ygb3V0cHV0IHNlcXVlbmNlLgorICAgKi8KKyAgdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWUgUkFJLCB0eXBlbmFtZSBDPiBjbGFzcyBpdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX1JBSXRlckl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfUkFJdGVyMywKKyAgICAgICAgICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlcjMKKyAgICBtdWx0aXdheV9tZXJnZV8zX3ZhcmlhbnQoX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJCSAgICAgX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCQkgICAgIF9SQUl0ZXIzIF9fdGFyZ2V0LAorCQkJICAgICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgX0dMSUJDWFhfQ0FMTChfX2xlbmd0aCk7CisKKyAgICAgIHR5cGVkZWYgX0RpZmZlcmVuY2VUcCBfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlckl0ZXJhdG9yPgorCTo6dmFsdWVfdHlwZTo6Zmlyc3RfdHlwZQorCV9SQUl0ZXIxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICBpZiAoX19sZW5ndGggPT0gMCkKKwlyZXR1cm4gX190YXJnZXQ7CisKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisgICAgICBfRGlmZmVyZW5jZVRwIF9fb3JpZ19sZW5ndGggPSBfX2xlbmd0aDsKKyNlbmRpZgorCisgICAgICBpdGVyYXRvcjxfUkFJdGVyMSwgX0NvbXBhcmU+CisJX19zZXEwKF9fc2Vxc19iZWdpblswXS5maXJzdCwgX19zZXFzX2JlZ2luWzBdLnNlY29uZCwgX19jb21wKSwKKwlfX3NlcTEoX19zZXFzX2JlZ2luWzFdLmZpcnN0LCBfX3NlcXNfYmVnaW5bMV0uc2Vjb25kLCBfX2NvbXApLAorCV9fc2VxMihfX3NlcXNfYmVnaW5bMl0uZmlyc3QsIF9fc2Vxc19iZWdpblsyXS5zZWNvbmQsIF9fY29tcCk7CisKKyAgICAgIGlmIChfX3NlcTAgPD0gX19zZXExKQorCXsKKyAgICAgICAgICBpZiAoX19zZXExIDw9IF9fc2VxMikKKyAgICAgICAgICAgIGdvdG8gX19zMDEyOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIChfX3NlcTIgPCAgX19zZXEwKQorICAgICAgICAgICAgICBnb3RvIF9fczIwMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZ290byBfX3MwMjE7CisJfQorICAgICAgZWxzZQorCXsKKyAgICAgICAgICBpZiAoX19zZXExIDw9IF9fc2VxMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKF9fc2VxMCA8PSBfX3NlcTIpCisgICAgICAgIAlnb3RvIF9fczEwMjsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAJZ290byBfX3MxMjA7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZ290byBfX3MyMTA7CisJfQorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV8zX0NBU0UoX19hLCBfX2IsIF9fYywgX19jMCwgX19jMSkgXAorICAgICAgX19zICMjIF9fYSAjIyBfX2IgIyMgX19jIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSpfX3RhcmdldCA9ICpfX3NlcSAjIyBfX2E7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKytfX3RhcmdldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwktLV9fbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSsrX19zZXEgIyMgX19hOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKF9fbGVuZ3RoID09IDApIGdvdG8gX19maW5pc2g7ICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoX19zZXEgIyMgX19hIF9fYzAgX19zZXEgIyMgX19iKSBnb3RvIF9fcyAjIyBfX2EgIyMgX19iICMjIF9fYzsgXAorCWlmIChfX3NlcSAjIyBfX2EgX19jMSBfX3NlcSAjIyBfX2MpIGdvdG8gX19zICMjIF9fYiAjIyBfX2EgIyMgX19jOyBcCisJZ290byBfX3MgIyMgX19iICMjIF9fYyAjIyBfX2E7CisKKyAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX01FUkdFXzNfQ0FTRSgwLCAxLCAyLCA8PSwgPD0pOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfM19DQVNFKDEsIDIsIDAsIDw9LCA8ICk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV8zX0NBU0UoMiwgMCwgMSwgPCAsIDwgKTsKKyAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX01FUkdFXzNfQ0FTRSgxLCAwLCAyLCA8ICwgPD0pOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfM19DQVNFKDAsIDIsIDEsIDw9LCA8PSk7CisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9NRVJHRV8zX0NBU0UoMiwgMSwgMCwgPCAsIDwgKTsKKworI3VuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX01FUkdFXzNfQ0FTRQorCisgICAgX19maW5pc2g6CisgICAgICA7CisKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisgICAgX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKAorCSgoX1JBSXRlcjEpX19zZXEwIC0gX19zZXFzX2JlZ2luWzBdLmZpcnN0KSArCisJKChfUkFJdGVyMSlfX3NlcTEgLSBfX3NlcXNfYmVnaW5bMV0uZmlyc3QpICsKKwkoKF9SQUl0ZXIxKV9fc2VxMiAtIF9fc2Vxc19iZWdpblsyXS5maXJzdCkKKwk9PSBfX29yaWdfbGVuZ3RoKTsKKyNlbmRpZgorCisgICAgICBfX3NlcXNfYmVnaW5bMF0uZmlyc3QgPSBfX3NlcTA7CisgICAgICBfX3NlcXNfYmVnaW5bMV0uZmlyc3QgPSBfX3NlcTE7CisgICAgICBfX3NlcXNfYmVnaW5bMl0uZmlyc3QgPSBfX3NlcTI7CisKKyAgICAgIHJldHVybiBfX3RhcmdldDsKKyAgICB9CisKKyAgLyoqCisgICAqIEBicmllZiBIaWdobHkgZWZmaWNpZW50IDQtd2F5IG1lcmdpbmcgcHJvY2VkdXJlLgorICAgKgorICAgKiBNZXJnaW5nIGlzIGRvbmUgd2l0aCB0aGUgYWxnb3JpdGhtIGltcGxlbWVudGF0aW9uIGRlc2NyaWJlZCBieSBQZXRlcgorICAgKiBTYW5kZXJzLiBCYXNpY2FsbHksIHRoZSBpZGVhIGlzIHRvIG1pbmltaXplIHRoZSBudW1iZXIgb2YgbmVjZXNzYXJ5CisgICAqIGNvbXBhcmlzb24gYWZ0ZXIgbWVyZ2luZyBhbiBlbGVtZW50LiAgVGhlIGltcGxlbWVudGF0aW9uIHRyaWNrCisgICAqIHRoYXQgbWFrZXMgdGhpcyBmYXN0IGlzIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBzZXF1ZW5jZXMgaXMgc3RvcmVkCisgICAqIGluIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyICh0cmFuc2xhdGVkIGludG8gZ290byBsYWJlbHMgaW4gQysrKS4KKyAgICoKKyAgICogVGhpcyB3b3JrcyB3ZWxsIGZvciBtZXJnaW5nIHVwIHRvIDQgc2VxdWVuY2VzLgorICAgKgorICAgKiBOb3RlIHRoYXQgbWFraW5nIHRoZSBtZXJnaW5nIHN0YWJsZSBkb2VzIEBhIG5vdCBjb21lIGF0IGEKKyAgICogcGVyZm9ybWFuY2UgaGl0LgorICAgKgorICAgKiBXaGV0aGVyIHRoZSBtZXJnaW5nIGlzIGRvbmUgZ3VhcmRlZCBvciB1bmd1YXJkZWQgaXMgc2VsZWN0ZWQgYnkgdGhlCisgICAqIHVzZWQgaXRlcmF0b3IgY2xhc3MuCisgICAqCisgICAqIEBwYXJhbSBfX3NlcXNfYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2YgaXRlcmF0b3IgcGFpciBpbnB1dCBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fc2Vxc19lbmQgRW5kIGl0ZXJhdG9yIG9mIGl0ZXJhdG9yIHBhaXIgaW5wdXQgc2VxdWVuY2UuCisgICAqIEBwYXJhbSBfX3RhcmdldCBCZWdpbiBpdGVyYXRvciBvZiBvdXRwdXQgc2VxdWVuY2UuCisgICAqIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvci4KKyAgICogQHBhcmFtIF9fbGVuZ3RoIE1heGltdW0gbGVuZ3RoIHRvIG1lcmdlLCBsZXNzIGVxdWFsIHRoYW4gdGhlCisgICAqIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBhdmFpbGFibGUuCisgICAqCisgICAqIEByZXR1cm4gRW5kIGl0ZXJhdG9yIG9mIG91dHB1dCBzZXF1ZW5jZS4KKyAgICovCisgIHRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lIFJBSSwgdHlwZW5hbWUgQz4gY2xhc3MgaXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9SQUl0ZXJJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX1JBSXRlcjMsCisgICAgICAgICAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXIzCisgICAgbXVsdGl3YXlfbWVyZ2VfNF92YXJpYW50KF9SQUl0ZXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SQUl0ZXJJdGVyYXRvciBfX3NlcXNfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUkFJdGVyMyBfX3RhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RpZmZlcmVuY2VUcCBfX2xlbmd0aCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19sZW5ndGgpOworICAgICAgdHlwZWRlZiBfRGlmZmVyZW5jZVRwIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVySXRlcmF0b3I+CisJOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlCisJX1JBSXRlcjE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXIxPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIGl0ZXJhdG9yPF9SQUl0ZXIxLCBfQ29tcGFyZT4KKwlfX3NlcTAoX19zZXFzX2JlZ2luWzBdLmZpcnN0LCBfX3NlcXNfYmVnaW5bMF0uc2Vjb25kLCBfX2NvbXApLAorCV9fc2VxMShfX3NlcXNfYmVnaW5bMV0uZmlyc3QsIF9fc2Vxc19iZWdpblsxXS5zZWNvbmQsIF9fY29tcCksCisJX19zZXEyKF9fc2Vxc19iZWdpblsyXS5maXJzdCwgX19zZXFzX2JlZ2luWzJdLnNlY29uZCwgX19jb21wKSwKKwlfX3NlcTMoX19zZXFzX2JlZ2luWzNdLmZpcnN0LCBfX3NlcXNfYmVnaW5bM10uc2Vjb25kLCBfX2NvbXApOworCisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX0RFQ0lTSU9OKF9fYSwgX19iLCBfX2MsIF9fZCkgeyAgXAorCWlmIChfX3NlcSAjIyBfX2QgPCBfX3NlcSAjIyBfX2EpCQkgIFwKKwkgIGdvdG8gX19zICMjIF9fZCAjIyBfX2EgIyMgX19iICMjIF9fYzsJCSAgXAorCWlmIChfX3NlcSAjIyBfX2QgPCBfX3NlcSAjIyBfX2IpCQkgIFwKKwkgIGdvdG8gX19zICMjIF9fYSAjIyBfX2QgIyMgX19iICMjIF9fYzsJCSAgXAorCWlmIChfX3NlcSAjIyBfX2QgPCBfX3NlcSAjIyBfX2MpCQkgIFwKKwkgIGdvdG8gX19zICMjIF9fYSAjIyBfX2IgIyMgX19kICMjIF9fYzsJCSAgXAorCWdvdG8gX19zICMjIF9fYSAjIyBfX2IgIyMgX19jICMjIF9fZDsgIH0KKworICAgICAgaWYgKF9fc2VxMCA8PSBfX3NlcTEpCisJeworICAgICAgICAgIGlmIChfX3NlcTEgPD0gX19zZXEyKQorICAgICAgICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfREVDSVNJT04oMCwxLDIsMykKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgaWYgKF9fc2VxMiA8IF9fc2VxMCkKKyAgICAgICAgCV9HTElCQ1hYX1BBUkFMTEVMX0RFQ0lTSU9OKDIsMCwxLDMpCisgICAgICAgIAllbHNlCisgICAgICAgICAgICAgICAgICBfR0xJQkNYWF9QQVJBTExFTF9ERUNJU0lPTigwLDIsMSwzKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICBlbHNlCisJeworICAgICAgICAgIGlmIChfX3NlcTEgPD0gX19zZXEyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoX19zZXEwIDw9IF9fc2VxMikKKyAgICAgICAgCV9HTElCQ1hYX1BBUkFMTEVMX0RFQ0lTSU9OKDEsMCwyLDMpCisgICAgICAgIAllbHNlCisgICAgICAgICAgICAgICAgICBfR0xJQkNYWF9QQVJBTExFTF9ERUNJU0lPTigxLDIsMCwzKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfREVDSVNJT04oMiwxLDAsMykKKyAgICAgICAgICAgICAgfQorCisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX01FUkdFXzRfQ0FTRShfX2EsIF9fYiwgX19jLCBfX2QsICBcCisJCQkJICAgICAgIF9fYzAsIF9fYzEsIF9fYzIpICAgIFwKKyAgICAgIF9fcyAjIyBfX2EgIyMgX19iICMjIF9fYyAjIyBfX2Q6ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmIChfX2xlbmd0aCA9PSAwKSBnb3RvIF9fZmluaXNoOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICpfX3RhcmdldCA9ICpfX3NlcSAjIyBfX2E7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICsrX190YXJnZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIC0tX19sZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICsrX19zZXEgIyMgX19hOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmIChfX3NlcSAjIyBfX2EgX19jMCBfX3NlcSAjIyBfX2IpICAgICAgXAorCWdvdG8gX19zICMjIF9fYSAjIyBfX2IgIyMgX19jICMjIF9fZDsgIFwKKyAgICAgIGlmIChfX3NlcSAjIyBfX2EgX19jMSBfX3NlcSAjIyBfX2MpICAgICAgXAorCWdvdG8gX19zICMjIF9fYiAjIyBfX2EgIyMgX19jICMjIF9fZDsgIFwKKyAgICAgIGlmIChfX3NlcSAjIyBfX2EgX19jMiBfX3NlcSAjIyBfX2QpICAgICAgXAorCWdvdG8gX19zICMjIF9fYiAjIyBfX2MgIyMgX19hICMjIF9fZDsgIFwKKyAgICAgIGdvdG8gX19zICMjIF9fYiAjIyBfX2MgIyMgX19kICMjIF9fYTsKKworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDAsIDEsIDIsIDMsIDw9LCA8PSwgPD0pOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDAsIDEsIDMsIDIsIDw9LCA8PSwgPD0pOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDAsIDIsIDEsIDMsIDw9LCA8PSwgPD0pOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDAsIDIsIDMsIDEsIDw9LCA8PSwgPD0pOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDAsIDMsIDEsIDIsIDw9LCA8PSwgPD0pOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDAsIDMsIDIsIDEsIDw9LCA8PSwgPD0pOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDEsIDAsIDIsIDMsIDwgLCA8PSwgPD0pOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDEsIDAsIDMsIDIsIDwgLCA8PSwgPD0pOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDEsIDIsIDAsIDMsIDw9LCA8ICwgPD0pOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDEsIDIsIDMsIDAsIDw9LCA8PSwgPCApOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDEsIDMsIDAsIDIsIDw9LCA8ICwgPD0pOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDEsIDMsIDIsIDAsIDw9LCA8PSwgPCApOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDIsIDAsIDEsIDMsIDwgLCA8ICwgPD0pOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDIsIDAsIDMsIDEsIDwgLCA8PSwgPCApOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDIsIDEsIDAsIDMsIDwgLCA8ICwgPD0pOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDIsIDEsIDMsIDAsIDwgLCA8PSwgPCApOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDIsIDMsIDAsIDEsIDw9LCA8ICwgPCApOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDIsIDMsIDEsIDAsIDw9LCA8ICwgPCApOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDMsIDAsIDEsIDIsIDwgLCA8ICwgPCApOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDMsIDAsIDIsIDEsIDwgLCA8ICwgPCApOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDMsIDEsIDAsIDIsIDwgLCA8ICwgPCApOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDMsIDEsIDIsIDAsIDwgLCA8ICwgPCApOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDMsIDIsIDAsIDEsIDwgLCA8ICwgPCApOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFKDMsIDIsIDEsIDAsIDwgLCA8ICwgPCApOworCisjdW5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfTUVSR0VfNF9DQVNFCisjdW5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfREVDSVNJT04KKworICAgIF9fZmluaXNoOgorICAgICAgOworCisgICAgICBfX3NlcXNfYmVnaW5bMF0uZmlyc3QgPSBfX3NlcTA7CisgICAgICBfX3NlcXNfYmVnaW5bMV0uZmlyc3QgPSBfX3NlcTE7CisgICAgICBfX3NlcXNfYmVnaW5bMl0uZmlyc3QgPSBfX3NlcTI7CisgICAgICBfX3NlcXNfYmVnaW5bM10uZmlyc3QgPSBfX3NlcTM7CisKKyAgICAgIHJldHVybiBfX3RhcmdldDsKKyAgICB9CisKKyAgLyoqIEBicmllZiBNdWx0aS13YXkgbWVyZ2luZyBwcm9jZWR1cmUgZm9yIGEgaGlnaCBicmFuY2hpbmcgZmFjdG9yLAorICAgKiAgICAgICAgIGd1YXJkZWQgY2FzZS4KKyAgICoKKyAgICogVGhpcyBtZXJnaW5nIHZhcmlhbnQgdXNlcyBhIExvc2VyVHJlZSBjbGFzcyBhcyBzZWxlY3RlZCBieSA8dHQ+X0xUPC90dD4uCisgICAqCisgICAqIFN0YWJpbGl0eSBpcyBzZWxlY3RlZCB0aHJvdWdoIHRoZSB1c2VkIExvc2VyVHJlZSBjbGFzcyA8dHQ+X0xUPC90dD4uCisgICAqCisgICAqIEF0IGxlYXN0IG9uZSBub24tZW1wdHkgc2VxdWVuY2UgaXMgcmVxdWlyZWQuCisgICAqCisgICAqIEBwYXJhbSBfX3NlcXNfYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2YgaXRlcmF0b3IgcGFpciBpbnB1dCBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fc2Vxc19lbmQgRW5kIGl0ZXJhdG9yIG9mIGl0ZXJhdG9yIHBhaXIgaW5wdXQgc2VxdWVuY2UuCisgICAqIEBwYXJhbSBfX3RhcmdldCBCZWdpbiBpdGVyYXRvciBvZiBvdXRwdXQgc2VxdWVuY2UuCisgICAqIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvci4KKyAgICogQHBhcmFtIF9fbGVuZ3RoIE1heGltdW0gbGVuZ3RoIHRvIG1lcmdlLCBsZXNzIGVxdWFsIHRoYW4gdGhlCisgICAqIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBhdmFpbGFibGUuCisgICAqCisgICAqIEByZXR1cm4gRW5kIGl0ZXJhdG9yIG9mIG91dHB1dCBzZXF1ZW5jZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9MVCwKKyAgICAgICAgICAgdHlwZW5hbWUgX1JBSXRlckl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfUkFJdGVyMywKKyAgICAgICAgICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlcjMKKyAgICBtdWx0aXdheV9tZXJnZV9sb3Nlcl90cmVlKF9SQUl0ZXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUkFJdGVySXRlcmF0b3IgX19zZXFzX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SQUl0ZXIzIF9fdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RpZmZlcmVuY2VUcCBfX2xlbmd0aCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19sZW5ndGgpCisKKyAgICAgIHR5cGVkZWYgX0RpZmZlcmVuY2VUcCBfRGlmZmVyZW5jZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXJJdGVyYXRvcj4KKwk6OmRpZmZlcmVuY2VfdHlwZSBfU2VxTnVtYmVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVySXRlcmF0b3I+CisJOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlCisJX1JBSXRlcjE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXIxPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIF9TZXFOdW1iZXIgX19rID0gc3RhdGljX2Nhc3Q8X1NlcU51bWJlcj4oX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbik7CisKKyAgICAgIF9MVCBfX2x0KF9faywgX19jb21wKTsKKworICAgICAgLy8gRGVmYXVsdCB2YWx1ZSBmb3IgcG90ZW50aWFsbHkgbm9uLWRlZmF1bHQtY29uc3RydWN0aWJsZSB0eXBlcy4KKyAgICAgIF9WYWx1ZVR5cGUqIF9fYXJiaXRyYXJ5X2VsZW1lbnQgPSAwOworCisgICAgICBmb3IgKF9TZXFOdW1iZXIgX190ID0gMDsgX190IDwgX19rOyArK19fdCkKKwl7CisgICAgICAgICAgaWYoIV9fYXJiaXRyYXJ5X2VsZW1lbnQKKwkgICAgICYmIF9HTElCQ1hYX1BBUkFMTEVMX0xFTkdUSChfX3NlcXNfYmVnaW5bX190XSkgPiAwKQorICAgICAgICAgICAgX19hcmJpdHJhcnlfZWxlbWVudCA9ICYoKl9fc2Vxc19iZWdpbltfX3RdLmZpcnN0KTsKKwl9CisKKyAgICAgIGZvciAoX1NlcU51bWJlciBfX3QgPSAwOyBfX3QgPCBfX2s7ICsrX190KQorCXsKKyAgICAgICAgICBpZiAoX19zZXFzX2JlZ2luW19fdF0uZmlyc3QgPT0gX19zZXFzX2JlZ2luW19fdF0uc2Vjb25kKQorICAgICAgICAgICAgX19sdC5fX2luc2VydF9zdGFydCgqX19hcmJpdHJhcnlfZWxlbWVudCwgX190LCB0cnVlKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBfX2x0Ll9faW5zZXJ0X3N0YXJ0KCpfX3NlcXNfYmVnaW5bX190XS5maXJzdCwgX190LCBmYWxzZSk7CisJfQorCisgICAgICBfX2x0Ll9faW5pdCgpOworCisgICAgICBfU2VxTnVtYmVyIF9fc291cmNlOworCisgICAgICBmb3IgKF9EaWZmZXJlbmNlVHlwZSBfX2kgPSAwOyBfX2kgPCBfX2xlbmd0aDsgKytfX2kpCisJeworICAgICAgICAgIC8vdGFrZSBvdXQKKyAgICAgICAgICBfX3NvdXJjZSA9IF9fbHQuX19nZXRfbWluX3NvdXJjZSgpOworCisgICAgICAgICAgKihfX3RhcmdldCsrKSA9ICooX19zZXFzX2JlZ2luW19fc291cmNlXS5maXJzdCsrKTsKKworICAgICAgICAgIC8vIEZlZWQuCisgICAgICAgICAgaWYgKF9fc2Vxc19iZWdpbltfX3NvdXJjZV0uZmlyc3QgPT0gX19zZXFzX2JlZ2luW19fc291cmNlXS5zZWNvbmQpCisgICAgICAgICAgICBfX2x0Ll9fZGVsZXRlX21pbl9pbnNlcnQoKl9fYXJiaXRyYXJ5X2VsZW1lbnQsIHRydWUpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8vIFJlcGxhY2UgZnJvbSBzYW1lIF9fc291cmNlLgorICAgICAgICAgICAgX19sdC5fX2RlbGV0ZV9taW5faW5zZXJ0KCpfX3NlcXNfYmVnaW5bX19zb3VyY2VdLmZpcnN0LCBmYWxzZSk7CisJfQorCisgICAgICByZXR1cm4gX190YXJnZXQ7CisgICAgfQorCisgIC8qKiBAYnJpZWYgTXVsdGktd2F5IG1lcmdpbmcgcHJvY2VkdXJlIGZvciBhIGhpZ2ggYnJhbmNoaW5nIGZhY3RvciwKKyAgICogICAgICAgICB1bmd1YXJkZWQgY2FzZS4KKyAgICoKKyAgICogTWVyZ2luZyBpcyBkb25lIHVzaW5nIHRoZSBMb3NlclRyZWUgY2xhc3MgPHR0Pl9MVDwvdHQ+LgorICAgKgorICAgKiBTdGFiaWxpdHkgaXMgc2VsZWN0ZWQgYnkgdGhlIHVzZWQgTG9zZXJUcmVlcy4KKyAgICoKKyAgICogQHByZSBObyBpbnB1dCB3aWxsIHJ1biBvdXQgb2YgZWxlbWVudHMgZHVyaW5nIHRoZSBtZXJnZS4KKyAgICoKKyAgICogQHBhcmFtIF9fc2Vxc19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBpdGVyYXRvciBwYWlyIGlucHV0IHNlcXVlbmNlLgorICAgKiBAcGFyYW0gX19zZXFzX2VuZCBFbmQgaXRlcmF0b3Igb2YgaXRlcmF0b3IgcGFpciBpbnB1dCBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fdGFyZ2V0IEJlZ2luIGl0ZXJhdG9yIG9mIG91dHB1dCBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgKiBAcGFyYW0gX19sZW5ndGggTWF4aW11bSBsZW5ndGggdG8gbWVyZ2UsIGxlc3MgZXF1YWwgdGhhbiB0aGUKKyAgICogdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGF2YWlsYWJsZS4KKyAgICoKKyAgICogQHJldHVybiBFbmQgaXRlcmF0b3Igb2Ygb3V0cHV0IHNlcXVlbmNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0xULAorCSAgIHR5cGVuYW1lIF9SQUl0ZXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyMywKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyMworICAgIG11bHRpd2F5X21lcmdlX2xvc2VyX3RyZWVfdW5ndWFyZGVkKF9SQUl0ZXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisJCQkJCV9SQUl0ZXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkJCQlfUkFJdGVyMyBfX3RhcmdldCwKKyAgICAgICBjb25zdCB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czx0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czwKKwkgIF9SQUl0ZXJJdGVyYXRvcj46OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGU+Ojp2YWx1ZV90eXBlJgorCQkJCQlfX3NlbnRpbmVsLAorCQkJCQlfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLAorCQkJCQlfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgX0dMSUJDWFhfQ0FMTChfX2xlbmd0aCkKKyAgICAgIHR5cGVkZWYgX0RpZmZlcmVuY2VUcCBfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlckl0ZXJhdG9yPgorCTo6ZGlmZmVyZW5jZV90eXBlIF9TZXFOdW1iZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXJJdGVyYXRvcj4KKwk6OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUKKwlfUkFJdGVyMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcjE+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKworICAgICAgX1NlcU51bWJlciBfX2sgPSBfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luOworCisgICAgICBfTFQgX19sdChfX2ssIF9fc2VudGluZWwsIF9fY29tcCk7CisKKyAgICAgIGZvciAoX1NlcU51bWJlciBfX3QgPSAwOyBfX3QgPCBfX2s7ICsrX190KQorCXsKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisgICAgICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9fc2Vxc19iZWdpbltfX3RdLmZpcnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IF9fc2Vxc19iZWdpbltfX3RdLnNlY29uZCk7CisjZW5kaWYKKyAgICAgICAgICBfX2x0Ll9faW5zZXJ0X3N0YXJ0KCpfX3NlcXNfYmVnaW5bX190XS5maXJzdCwgX190LCBmYWxzZSk7CisJfQorCisgICAgICBfX2x0Ll9faW5pdCgpOworCisgICAgICBfU2VxTnVtYmVyIF9fc291cmNlOworCisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9faSA9IDA7CisjZW5kaWYKKworICAgICAgX1JBSXRlcjMgX190YXJnZXRfZW5kID0gX190YXJnZXQgKyBfX2xlbmd0aDsKKyAgICAgIHdoaWxlIChfX3RhcmdldCA8IF9fdGFyZ2V0X2VuZCkKKwl7CisgICAgICAgICAgLy8gVGFrZSBvdXQuCisgICAgICAgICAgX19zb3VyY2UgPSBfX2x0Ll9fZ2V0X21pbl9zb3VyY2UoKTsKKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKyAgICAgICAgICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoMCA8PSBfX3NvdXJjZSAmJiBfX3NvdXJjZSA8IF9fayk7CisgICAgICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9faSA9PSAwCisgICAgICAgICAgICAgIHx8ICFfX2NvbXAoKihfX3NlcXNfYmVnaW5bX19zb3VyY2VdLmZpcnN0KSwgKihfX3RhcmdldCAtIDEpKSk7CisjZW5kaWYKKworICAgICAgICAgIC8vIEZlZWQuCisgICAgICAgICAgKihfX3RhcmdldCsrKSA9ICooX19zZXFzX2JlZ2luW19fc291cmNlXS5maXJzdCsrKTsKKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKyAgICAgICAgICArK19faTsKKyNlbmRpZgorICAgICAgICAgIC8vIFJlcGxhY2UgZnJvbSBzYW1lIF9fc291cmNlLgorICAgICAgICAgIF9fbHQuX19kZWxldGVfbWluX2luc2VydCgqX19zZXFzX2JlZ2luW19fc291cmNlXS5maXJzdCwgZmFsc2UpOworCX0KKworICAgICAgcmV0dXJuIF9fdGFyZ2V0OworICAgIH0KKworCisgIC8qKiBAYnJpZWYgTXVsdGktd2F5IG1lcmdpbmcgcHJvY2VkdXJlIGZvciBhIGhpZ2ggYnJhbmNoaW5nIGZhY3RvciwKKyAgICogICAgICAgICByZXF1aXJpbmcgc2VudGluZWxzIHRvIGV4aXN0LgorICAgKgorICAgKiBAdHBhcmFtIFVuZ3VhcmRlZExvc2VyVHJlZSBfTG9zZXIgVHJlZSB2YXJpYW50IHRvIHVzZSBmb3IgdGhlIHVuZ3VhcmRlZAorICAgKiAgIG1lcmdpbmcuCisgICAqCisgICAqIEBwYXJhbSBfX3NlcXNfYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2YgaXRlcmF0b3IgcGFpciBpbnB1dCBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fc2Vxc19lbmQgRW5kIGl0ZXJhdG9yIG9mIGl0ZXJhdG9yIHBhaXIgaW5wdXQgc2VxdWVuY2UuCisgICAqIEBwYXJhbSBfX3RhcmdldCBCZWdpbiBpdGVyYXRvciBvZiBvdXRwdXQgc2VxdWVuY2UuCisgICAqIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvci4KKyAgICogQHBhcmFtIF9fbGVuZ3RoIE1heGltdW0gbGVuZ3RoIHRvIG1lcmdlLCBsZXNzIGVxdWFsIHRoYW4gdGhlCisgICAqIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBhdmFpbGFibGUuCisgICAqCisgICAqIEByZXR1cm4gRW5kIGl0ZXJhdG9yIG9mIG91dHB1dCBzZXF1ZW5jZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIFVuZ3VhcmRlZExvc2VyVHJlZSwKKwkgICB0eXBlbmFtZSBfUkFJdGVySXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1JBSXRlcjMsCisJICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyMworICAgIG11bHRpd2F5X21lcmdlX2xvc2VyX3RyZWVfc2VudGluZWwoX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJCQkgICAgICAgX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCQkJICAgICAgIF9SQUl0ZXIzIF9fdGFyZ2V0LAorICAgICAgY29uc3QgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8dHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8CisJX1JBSXRlckl0ZXJhdG9yPjo6dmFsdWVfdHlwZTo6Zmlyc3RfdHlwZT46OnZhbHVlX3R5cGUmCisJCQkJICAgICAgIF9fc2VudGluZWwsCisJCQkJICAgICAgIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsCisJCQkJICAgICAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBfR0xJQkNYWF9DQUxMKF9fbGVuZ3RoKQorCisgICAgICB0eXBlZGVmIF9EaWZmZXJlbmNlVHAgX0RpZmZlcmVuY2VUeXBlOworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVySXRlcmF0b3I+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVySXRlcmF0b3I+CisJOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlCisJX1JBSXRlcjE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXIxPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIF9SQUl0ZXIzIF9fdGFyZ2V0X2VuZDsKKworICAgICAgZm9yIChfUkFJdGVySXRlcmF0b3IgX19zID0gX19zZXFzX2JlZ2luOyBfX3MgIT0gX19zZXFzX2VuZDsgKytfX3MpCisJLy8gTW92ZSB0aGUgc2VxdWVuY2UgZW5kcyB0byB0aGUgc2VudGluZWwuICBUaGlzIGhhcyB0aGUKKwkvLyBlZmZlY3QgdGhhdCB0aGUgc2VudGluZWwgYXBwZWFycyB0byBiZSB3aXRoaW4gdGhlIHNlcXVlbmNlLiBUaGVuLAorCS8vIHdlIGNhbiB1c2UgdGhlIHVuZ3VhcmRlZCB2YXJpYW50IGlmIHdlIG1lcmdlIG91dCBhcyBtYW55CisJLy8gbm9uLXNlbnRpbmVsIGVsZW1lbnRzIGFzIHdlIGhhdmUuCisJKysoKCpfX3MpLnNlY29uZCk7CisKKyAgICAgIF9fdGFyZ2V0X2VuZCA9IG11bHRpd2F5X21lcmdlX2xvc2VyX3RyZWVfdW5ndWFyZGVkPFVuZ3VhcmRlZExvc2VyVHJlZT4KKwkoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwgX19zZW50aW5lbCwgX19sZW5ndGgsIF9fY29tcCk7CisKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX190YXJnZXRfZW5kID09IF9fdGFyZ2V0ICsgX19sZW5ndGgpOworICAgICAgX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9faXNfc29ydGVkKF9fdGFyZ2V0LCBfX3RhcmdldF9lbmQsIF9fY29tcCkpOworI2VuZGlmCisKKyAgICAgIC8vIFJlc3RvcmUgdGhlIHNlcXVlbmNlIGVuZHMgc28gdGhlIHNlbnRpbmVscyBhcmUgbm90IGNvbnRhaW5lZCBpbiB0aGUKKyAgICAgIC8vIHNlcXVlbmNlIGFueSBtb3JlIChzZWUgY29tbWVudCBpbiBsb29wIGFib3ZlKS4KKyAgICAgIGZvciAoX1JBSXRlckl0ZXJhdG9yIF9fcyA9IF9fc2Vxc19iZWdpbjsgX19zICE9IF9fc2Vxc19lbmQ7ICsrX19zKQorCS0tKCgqX19zKS5zZWNvbmQpOworCisgICAgICByZXR1cm4gX190YXJnZXRfZW5kOworICAgIH0KKworICAvKioKKyAgICogQGJyaWVmIFRyYWl0cyBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUgbG9zZXIgdHJlZSBzaG91bGQKKyAgICogICB1c2UgcG9pbnRlcnMgb3IgY29waWVzLgorICAgKgorICAgKiBUaGUgZmllbGQgIl9NX3VzZV9wb2ludGVyIiBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHVzZSBwb2ludGVycworICAgKiBpbiBoZSBsb3NlciB0cmVlcyBvciB3aGV0aGVyIHRvIGNvcHkgdGhlIHZhbHVlcyBpbnRvIHRoZSBsb3NlciB0cmVlLgorICAgKgorICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byB1c2UgcG9pbnRlcnMgaWYgdGhlIGRhdGEgdHlwZSBpcyA0IHRpbWVzIGFzCisgICAqIGJpZyBhcyB0aGUgcG9pbnRlciB0byBpdC4KKyAgICoKKyAgICogU3BlY2lhbGl6ZSBmb3IgeW91ciBkYXRhIHR5cGUgdG8gY3VzdG9taXplIHRoZSBiZWhhdmlvci4KKyAgICoKKyAgICogRXhhbXBsZToKKyAgICoKKyAgICogICB0ZW1wbGF0ZTw+CisgICAqICAgc3RydWN0IF9Mb3NlclRyZWVUcmFpdHM8aW50PgorICAgKiAgIHsgc3RhdGljIGNvbnN0IGJvb2wgX01fdXNlX3BvaW50ZXIgPSBmYWxzZTsgfTsKKyAgICoKKyAgICogICB0ZW1wbGF0ZTw+CisgICAqICAgc3RydWN0IF9Mb3NlclRyZWVUcmFpdHM8aGVhdnl3ZWlnaHRfdHlwZT4KKyAgICogICB7IHN0YXRpYyBjb25zdCBib29sIF9NX3VzZV9wb2ludGVyID0gdHJ1ZTsgfTsKKyAgICoKKyAgICogQHBhcmFtIF9UcCB0eXBlIHRvIGdpdmUgdGhlIGxvc2VyIHRyZWUgdHJhaXRzIGZvci4KKyAgICovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9Mb3NlclRyZWVUcmFpdHMKKyAgICB7CisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBUcnVlIGlmZiB0byB1c2UgcG9pbnRlcnMgaW5zdGVhZCBvZiB2YWx1ZXMgaW4gbG9zZXIgdHJlZXMuCisgICAgICAgKgorICAgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gdXNlIHBvaW50ZXJzIGlmIHRoZSBkYXRhIHR5cGUgaXMgZm91cgorICAgICAgICogdGltZXMgYXMgYmlnIGFzIHRoZSBwb2ludGVyIHRvIGl0LgorICAgICAgICovCisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBfTV91c2VfcG9pbnRlciA9IChzaXplb2YoX1RwKSA+IDQgKiBzaXplb2YoX1RwKikpOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBTd2l0Y2ggZm9yIDMtd2F5IG1lcmdpbmcgd2l0aCBfX3NlbnRpbmVscyB0dXJuZWQgb2ZmLgorICAgKgorICAgKiBOb3RlIHRoYXQgMy13YXkgbWVyZ2luZyBpcyBhbHdheXMgc3RhYmxlIQorICAgKi8KKyAgdGVtcGxhdGU8Ym9vbCBfX3NlbnRpbmVscyAvKmRlZmF1bHQgPT0gZmFsc2UqLywKKwkgICB0eXBlbmFtZSBfUkFJdGVySXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1JBSXRlcjMsCisJICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBzdHJ1Y3QgX19tdWx0aXdheV9tZXJnZV8zX3ZhcmlhbnRfc2VudGluZWxfc3dpdGNoCisgICAgeworICAgICAgX1JBSXRlcjMKKyAgICAgIG9wZXJhdG9yKCkoX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJIF9SQUl0ZXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkgX1JBSXRlcjMgX190YXJnZXQsCisJCSBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXApCisgICAgICB7IHJldHVybiBtdWx0aXdheV9tZXJnZV8zX3ZhcmlhbnQ8X0d1YXJkZWRJdGVyYXRvcj4KKwkgIChfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LCBfX2xlbmd0aCwgX19jb21wKTsgfQorICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBTd2l0Y2ggZm9yIDMtd2F5IG1lcmdpbmcgd2l0aCBfX3NlbnRpbmVscyB0dXJuZWQgb24uCisgICAqCisgICAqIE5vdGUgdGhhdCAzLXdheSBtZXJnaW5nIGlzIGFsd2F5cyBzdGFibGUhCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVySXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1JBSXRlcjMsCisJICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBzdHJ1Y3QgX19tdWx0aXdheV9tZXJnZV8zX3ZhcmlhbnRfc2VudGluZWxfc3dpdGNoPHRydWUsIF9SQUl0ZXJJdGVyYXRvciwKKwkJCQkJCSAgICAgIF9SQUl0ZXIzLCBfRGlmZmVyZW5jZVRwLAorCQkJCQkJICAgICAgX0NvbXBhcmU+CisgICAgeworICAgICAgX1JBSXRlcjMKKyAgICAgIG9wZXJhdG9yKCkoX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJIF9SQUl0ZXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkgX1JBSXRlcjMgX190YXJnZXQsCisJCSBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXApCisgICAgICB7IHJldHVybiBtdWx0aXdheV9tZXJnZV8zX3ZhcmlhbnQ8X1VuZ3VhcmRlZEl0ZXJhdG9yPgorCSAgKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsIF9fbGVuZ3RoLCBfX2NvbXApOyB9CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFN3aXRjaCBmb3IgNC13YXkgbWVyZ2luZyB3aXRoIF9fc2VudGluZWxzIHR1cm5lZCBvZmYuCisgICAqCisgICAqIE5vdGUgdGhhdCA0LXdheSBtZXJnaW5nIGlzIGFsd2F5cyBzdGFibGUhCisgICAqLworICB0ZW1wbGF0ZTxib29sIF9fc2VudGluZWxzIC8qZGVmYXVsdCA9PSBmYWxzZSovLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyMywKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHN0cnVjdCBfX211bHRpd2F5X21lcmdlXzRfdmFyaWFudF9zZW50aW5lbF9zd2l0Y2gKKyAgICB7CisgICAgICBfUkFJdGVyMworICAgICAgb3BlcmF0b3IoKShfUkFJdGVySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkgX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCSBfUkFJdGVyMyBfX3RhcmdldCwKKwkJIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsIF9Db21wYXJlIF9fY29tcCkKKyAgICAgIHsgcmV0dXJuIG11bHRpd2F5X21lcmdlXzRfdmFyaWFudDxfR3VhcmRlZEl0ZXJhdG9yPgorCSAgKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsIF9fbGVuZ3RoLCBfX2NvbXApOyB9CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFN3aXRjaCBmb3IgNC13YXkgbWVyZ2luZyB3aXRoIF9fc2VudGluZWxzIHR1cm5lZCBvbi4KKyAgICoKKyAgICogTm90ZSB0aGF0IDQtd2F5IG1lcmdpbmcgaXMgYWx3YXlzIHN0YWJsZSEKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyMywKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHN0cnVjdCBfX211bHRpd2F5X21lcmdlXzRfdmFyaWFudF9zZW50aW5lbF9zd2l0Y2g8dHJ1ZSwgX1JBSXRlckl0ZXJhdG9yLAorCQkJCQkJICAgICAgX1JBSXRlcjMsIF9EaWZmZXJlbmNlVHAsCisJCQkJCQkgICAgICBfQ29tcGFyZT4KKyAgICB7CisgICAgICBfUkFJdGVyMworICAgICAgb3BlcmF0b3IoKShfUkFJdGVySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkgX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCSBfUkFJdGVyMyBfX3RhcmdldCwKKwkJIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsIF9Db21wYXJlIF9fY29tcCkKKyAgICAgIHsgcmV0dXJuIG11bHRpd2F5X21lcmdlXzRfdmFyaWFudDxfVW5ndWFyZGVkSXRlcmF0b3I+CisJICAoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwgX19sZW5ndGgsIF9fY29tcCk7IH0KKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgU3dpdGNoIGZvciBrLXdheSBtZXJnaW5nIHdpdGggX19zZW50aW5lbHMgdHVybmVkIG9uLgorICAgKi8KKyAgdGVtcGxhdGU8Ym9vbCBfX3NlbnRpbmVscywKKwkgICBib29sIF9fc3RhYmxlLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyMywKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHN0cnVjdCBfX211bHRpd2F5X21lcmdlX2tfdmFyaWFudF9zZW50aW5lbF9zd2l0Y2gKKyAgICB7CisgICAgICBfUkFJdGVyMworICAgICAgb3BlcmF0b3IoKShfUkFJdGVySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkgX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCSBfUkFJdGVyMyBfX3RhcmdldCwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPAorICAgICAgX1JBSXRlckl0ZXJhdG9yPjo6dmFsdWVfdHlwZTo6Zmlyc3RfdHlwZT46OnZhbHVlX3R5cGUmCisJCSBfX3NlbnRpbmVsLAorCQkgX0RpZmZlcmVuY2VUcCBfX2xlbmd0aCwgX0NvbXBhcmUgX19jb21wKQorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlckl0ZXJhdG9yPgorCSAgOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlCisJICBfUkFJdGVyMTsKKwl0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXIxPjo6dmFsdWVfdHlwZQorCSAgX1ZhbHVlVHlwZTsKKworCXJldHVybiBtdWx0aXdheV9tZXJnZV9sb3Nlcl90cmVlX3NlbnRpbmVsPAorCXR5cGVuYW1lIF9fZ251X2N4eDo6X19jb25kaXRpb25hbF90eXBlPAorCV9Mb3NlclRyZWVUcmFpdHM8X1ZhbHVlVHlwZT46Ol9NX3VzZV9wb2ludGVyLAorCSAgX0xvc2VyVHJlZVBvaW50ZXJVbmd1YXJkZWQ8X19zdGFibGUsIF9WYWx1ZVR5cGUsIF9Db21wYXJlPiwKKwkgIF9Mb3NlclRyZWVVbmd1YXJkZWQ8X19zdGFibGUsIF9WYWx1ZVR5cGUsIF9Db21wYXJlPgorICAgICAgICAgID46Ol9fdHlwZT4KKwkgIChfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LCBfX3NlbnRpbmVsLCBfX2xlbmd0aCwgX19jb21wKTsKKyAgICAgIH0KKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgU3dpdGNoIGZvciBrLXdheSBtZXJnaW5nIHdpdGggX19zZW50aW5lbHMgdHVybmVkIG9mZi4KKyAgICovCisgIHRlbXBsYXRlPGJvb2wgX19zdGFibGUsCisJICAgdHlwZW5hbWUgX1JBSXRlckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXIzLAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgc3RydWN0IF9fbXVsdGl3YXlfbWVyZ2Vfa192YXJpYW50X3NlbnRpbmVsX3N3aXRjaDxmYWxzZSwgX19zdGFibGUsCisJCQkJCQkgICAgICBfUkFJdGVySXRlcmF0b3IsCisJCQkJCQkgICAgICBfUkFJdGVyMywgX0RpZmZlcmVuY2VUcCwKKwkJCQkJCSAgICAgIF9Db21wYXJlPgorICAgIHsKKyAgICAgIF9SQUl0ZXIzCisgICAgICBvcGVyYXRvcigpKF9SQUl0ZXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisJCSBfUkFJdGVySXRlcmF0b3IgX19zZXFzX2VuZCwKKwkJIF9SQUl0ZXIzIF9fdGFyZ2V0LAorICAgICAgIGNvbnN0IHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPAorICAgICAgIF9SQUl0ZXJJdGVyYXRvcj46OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGU+Ojp2YWx1ZV90eXBlJgorCQkgX19zZW50aW5lbCwKKwkJIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsIF9Db21wYXJlIF9fY29tcCkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXJJdGVyYXRvcj4KKwkgIDo6dmFsdWVfdHlwZTo6Zmlyc3RfdHlwZQorCSAgX1JBSXRlcjE7CisJdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyMT46OnZhbHVlX3R5cGUKKwkgIF9WYWx1ZVR5cGU7CisKKwlyZXR1cm4gbXVsdGl3YXlfbWVyZ2VfbG9zZXJfdHJlZTwKKwl0eXBlbmFtZSBfX2dudV9jeHg6Ol9fY29uZGl0aW9uYWxfdHlwZTwKKwlfTG9zZXJUcmVlVHJhaXRzPF9WYWx1ZVR5cGU+OjpfTV91c2VfcG9pbnRlciwKKwkgIF9Mb3NlclRyZWVQb2ludGVyPF9fc3RhYmxlLCBfVmFsdWVUeXBlLCBfQ29tcGFyZT4sCisJICBfTG9zZXJUcmVlPF9fc3RhYmxlLCBfVmFsdWVUeXBlLCBfQ29tcGFyZT4KKyAgICAgICAgICA+OjpfX3R5cGUgPihfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LCBfX2xlbmd0aCwgX19jb21wKTsKKyAgICAgIH0KKyAgICB9OworCisgIC8qKiBAYnJpZWYgU2VxdWVudGlhbCBtdWx0aS13YXkgbWVyZ2luZyBzd2l0Y2guCisgICAqCisgICAqICBUaGUgX0dMSUJDWFhfUEFSQUxMRUxfREVDSVNJT04gaXMgYmFzZWQgb24gdGhlIGJyYW5jaGluZyBmYWN0b3IgYW5kCisgICAqICBydW50aW1lIHNldHRpbmdzLgorICAgKiAgQHBhcmFtIF9fc2Vxc19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBpdGVyYXRvciBwYWlyIGlucHV0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fc2Vxc19lbmQgRW5kIGl0ZXJhdG9yIG9mIGl0ZXJhdG9yIHBhaXIgaW5wdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX190YXJnZXQgQmVnaW4gaXRlcmF0b3Igb2Ygb3V0cHV0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgKiAgQHBhcmFtIF9fbGVuZ3RoIE1heGltdW0gbGVuZ3RoIHRvIG1lcmdlLCBwb3NzaWJseSBsYXJnZXIgdGhhbiB0aGUKKyAgICogIG51bWJlciBvZiBlbGVtZW50cyBhdmFpbGFibGUuCisgICAqICBAcGFyYW0gX19zZW50aW5lbCBUaGUgc2VxdWVuY2VzIGhhdmUgX19hIF9fc2VudGluZWwgZWxlbWVudC4KKyAgICogIEByZXR1cm4gRW5kIGl0ZXJhdG9yIG9mIG91dHB1dCBzZXF1ZW5jZS4gKi8KKyAgdGVtcGxhdGU8Ym9vbCBfX3N0YWJsZSwKKwkgICBib29sIF9fc2VudGluZWxzLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyMywKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXIzCisgICAgX19zZXF1ZW50aWFsX211bHRpd2F5X21lcmdlKF9SQUl0ZXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisJCQkJX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCQkJX1JBSXRlcjMgX190YXJnZXQsCisgICAgICBjb25zdCB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czx0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czwKKwlfUkFJdGVySXRlcmF0b3I+Ojp2YWx1ZV90eXBlOjpmaXJzdF90eXBlPjo6dmFsdWVfdHlwZSYKKwkJCQlfX3NlbnRpbmVsLAorCQkJCV9EaWZmZXJlbmNlVHAgX19sZW5ndGgsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBfR0xJQkNYWF9DQUxMKF9fbGVuZ3RoKQorCisgICAgICB0eXBlZGVmIF9EaWZmZXJlbmNlVHAgX0RpZmZlcmVuY2VUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVySXRlcmF0b3I+CisJOjpkaWZmZXJlbmNlX3R5cGUgX1NlcU51bWJlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlckl0ZXJhdG9yPgorCTo6dmFsdWVfdHlwZTo6Zmlyc3RfdHlwZQorCV9SQUl0ZXIxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworICAgICAgZm9yIChfUkFJdGVySXRlcmF0b3IgX19zID0gX19zZXFzX2JlZ2luOyBfX3MgIT0gX19zZXFzX2VuZDsgKytfX3MpCisJeworICAgICAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfX2lzX3NvcnRlZCgoKl9fcykuZmlyc3QsCisJCQkJCSAgICAgICAoKl9fcykuc2Vjb25kLCBfX2NvbXApKTsKKwl9CisjZW5kaWYKKworICAgICAgX0RpZmZlcmVuY2VUcCBfX3RvdGFsX2xlbmd0aCA9IDA7CisgICAgICBmb3IgKF9SQUl0ZXJJdGVyYXRvciBfX3MgPSBfX3NlcXNfYmVnaW47IF9fcyAhPSBfX3NlcXNfZW5kOyArK19fcykKKwlfX3RvdGFsX2xlbmd0aCArPSBfR0xJQkNYWF9QQVJBTExFTF9MRU5HVEgoKl9fcyk7CisKKyAgICAgIF9fbGVuZ3RoID0gc3RkOjptaW48X0RpZmZlcmVuY2VUcD4oX19sZW5ndGgsIF9fdG90YWxfbGVuZ3RoKTsKKworICAgICAgaWYoX19sZW5ndGggPT0gMCkKKwlyZXR1cm4gX190YXJnZXQ7CisKKyAgICAgIF9SQUl0ZXIzIF9fcmV0dXJuX3RhcmdldCA9IF9fdGFyZ2V0OworICAgICAgX1NlcU51bWJlciBfX2sgPSBzdGF0aWNfY2FzdDxfU2VxTnVtYmVyPihfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luKTsKKworICAgICAgc3dpdGNoIChfX2spCisJeworCWNhc2UgMDoKKyAgICAgICAgICBicmVhazsKKwljYXNlIDE6CisgICAgICAgICAgX19yZXR1cm5fdGFyZ2V0ID0gc3RkOjpjb3B5KF9fc2Vxc19iZWdpblswXS5maXJzdCwKKwkJCQkgICAgICBfX3NlcXNfYmVnaW5bMF0uZmlyc3QgKyBfX2xlbmd0aCwKKwkJCQkgICAgICBfX3RhcmdldCk7CisgICAgICAgICAgX19zZXFzX2JlZ2luWzBdLmZpcnN0ICs9IF9fbGVuZ3RoOworICAgICAgICAgIGJyZWFrOworCWNhc2UgMjoKKyAgICAgICAgICBfX3JldHVybl90YXJnZXQgPSBfX21lcmdlX2FkdmFuY2UoX19zZXFzX2JlZ2luWzBdLmZpcnN0LAorCQkJCQkgICAgX19zZXFzX2JlZ2luWzBdLnNlY29uZCwKKwkJCQkJICAgIF9fc2Vxc19iZWdpblsxXS5maXJzdCwKKwkJCQkJICAgIF9fc2Vxc19iZWdpblsxXS5zZWNvbmQsCisJCQkJCSAgICBfX3RhcmdldCwgX19sZW5ndGgsIF9fY29tcCk7CisgICAgICAgICAgYnJlYWs7CisJY2FzZSAzOgorICAgICAgICAgIF9fcmV0dXJuX3RhcmdldCA9IF9fbXVsdGl3YXlfbWVyZ2VfM192YXJpYW50X3NlbnRpbmVsX3N3aXRjaAorCSAgICA8X19zZW50aW5lbHMsIF9SQUl0ZXJJdGVyYXRvciwgX1JBSXRlcjMsIF9EaWZmZXJlbmNlVHAsIF9Db21wYXJlPigpCisJICAgIChfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LCBfX2xlbmd0aCwgX19jb21wKTsKKyAgICAgICAgICBicmVhazsKKwljYXNlIDQ6CisgICAgICAgICAgX19yZXR1cm5fdGFyZ2V0ID0gX19tdWx0aXdheV9tZXJnZV80X3ZhcmlhbnRfc2VudGluZWxfc3dpdGNoCisJICAgIDxfX3NlbnRpbmVscywgX1JBSXRlckl0ZXJhdG9yLCBfUkFJdGVyMywgX0RpZmZlcmVuY2VUcCwgX0NvbXBhcmU+KCkKKwkgICAgKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsIF9fbGVuZ3RoLCBfX2NvbXApOworICAgICAgICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICBfX3JldHVybl90YXJnZXQgPSBfX211bHRpd2F5X21lcmdlX2tfdmFyaWFudF9zZW50aW5lbF9zd2l0Y2gKKwkgICAgPF9fc2VudGluZWxzLCBfX3N0YWJsZSwgX1JBSXRlckl0ZXJhdG9yLCBfUkFJdGVyMywgX0RpZmZlcmVuY2VUcCwKKwkgICAgIF9Db21wYXJlPigpCisJICAgIChfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LCBfX3NlbnRpbmVsLCBfX2xlbmd0aCwgX19jb21wKTsKKwkgIGJyZWFrOworCX0KKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoCisJX19pc19zb3J0ZWQoX190YXJnZXQsIF9fdGFyZ2V0ICsgX19sZW5ndGgsIF9fY29tcCkpOworI2VuZGlmCisKKyAgICAgIHJldHVybiBfX3JldHVybl90YXJnZXQ7CisgICAgfQorCisgIC8qKgorICAgKiBAYnJpZWYgU3RhYmxlIHNvcnRpbmcgZnVuY3Rvci4KKyAgICoKKyAgICogVXNlZCB0byByZWR1Y2UgY29kZSBpbnN0YW5jaWF0aW9uIGluIG11bHRpd2F5X21lcmdlX3NhbXBsaW5nX3NwbGl0dGluZy4KKyAgICovCisgIHRlbXBsYXRlPGJvb2wgX19zdGFibGUsIGNsYXNzIF9SQUl0ZXIsIGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgICAgc3RydWN0IF9TYW1wbGluZ1NvcnRlcgorICAgIHsKKyAgICAgIHZvaWQKKyAgICAgIG9wZXJhdG9yKCkoX1JBSXRlciBfX2ZpcnN0LCBfUkFJdGVyIF9fbGFzdCwgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApCisgICAgICB7IF9fZ251X3NlcXVlbnRpYWw6OnN0YWJsZV9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19jb21wKTsgfQorICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBOb24tX19zdGFibGUgc29ydGluZyBmdW5jdG9yLgorICAgKgorICAgKiBVc2VkIHRvIHJlZHVjZSBjb2RlIGluc3RhbnRpYXRpb24gaW4gbXVsdGl3YXlfbWVyZ2Vfc2FtcGxpbmdfc3BsaXR0aW5nLgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1JBSXRlciwgY2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgICBzdHJ1Y3QgX1NhbXBsaW5nU29ydGVyPGZhbHNlLCBfUkFJdGVyLCBfU3RyaWN0V2Vha09yZGVyaW5nPgorICAgIHsKKyAgICAgIHZvaWQKKyAgICAgIG9wZXJhdG9yKCkoX1JBSXRlciBfX2ZpcnN0LCBfUkFJdGVyIF9fbGFzdCwgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApCisgICAgICB7IF9fZ251X3NlcXVlbnRpYWw6OnNvcnQoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOyB9CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFNhbXBsaW5nIGJhc2VkIHNwbGl0dGluZyBmb3IgcGFyYWxsZWwgbXVsdGl3YXktbWVyZ2Ugcm91dGluZS4KKyAgICovCisgIHRlbXBsYXRlPGJvb2wgX19zdGFibGUsCisJICAgdHlwZW5hbWUgX1JBSXRlckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHlwZT4KKyAgICB2b2lkCisgICAgbXVsdGl3YXlfbWVyZ2Vfc2FtcGxpbmdfc3BsaXR0aW5nKF9SQUl0ZXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisJCQkJICAgICAgX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCQkJICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbGVuZ3RoLAorCQkJCSAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX3RvdGFsX2xlbmd0aCwKKwkJCQkgICAgICBfQ29tcGFyZSBfX2NvbXAsCisgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxfRGlmZmVyZW5jZVR5cGUsIF9EaWZmZXJlbmNlVHlwZT4gPiAqX19waWVjZXMpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVySXRlcmF0b3I+CisJOjpkaWZmZXJlbmNlX3R5cGUgX1NlcU51bWJlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlckl0ZXJhdG9yPgorCTo6dmFsdWVfdHlwZTo6Zmlyc3RfdHlwZQorCV9SQUl0ZXIxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICAvLyBfX2sgc2VxdWVuY2VzLgorICAgICAgY29uc3QgX1NlcU51bWJlciBfX2sKKwk9IHN0YXRpY19jYXN0PF9TZXFOdW1iZXI+KF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4pOworCisgICAgICBjb25zdCBfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKworICAgICAgY29uc3QgX0RpZmZlcmVuY2VUeXBlIF9fbnVtX3NhbXBsZXMgPQorCV9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLm1lcmdlX292ZXJzYW1wbGluZyAqIF9fbnVtX3RocmVhZHM7CisKKyAgICAgIF9WYWx1ZVR5cGUqIF9fc2FtcGxlcyA9IHN0YXRpY19jYXN0PF9WYWx1ZVR5cGUqPgorCSg6Om9wZXJhdG9yIG5ldyhzaXplb2YoX1ZhbHVlVHlwZSkgKiBfX2sgKiBfX251bV9zYW1wbGVzKSk7CisgICAgICAvLyBTYW1wbGUuCisgICAgICBmb3IgKF9TZXFOdW1iZXIgX19zID0gMDsgX19zIDwgX19rOyArK19fcykKKwlmb3IgKF9EaWZmZXJlbmNlVHlwZSBfX2kgPSAwOyBfX2kgPCBfX251bV9zYW1wbGVzOyArK19faSkKKwkgIHsKKwkgICAgX0RpZmZlcmVuY2VUeXBlIHNhbXBsZV9pbmRleCA9IHN0YXRpY19jYXN0PF9EaWZmZXJlbmNlVHlwZT4KKwkgICAgICAoX0dMSUJDWFhfUEFSQUxMRUxfTEVOR1RIKF9fc2Vxc19iZWdpbltfX3NdKQorCSAgICAgICAqIChkb3VibGUoX19pICsgMSkgLyAoX19udW1fc2FtcGxlcyArIDEpKQorCSAgICAgICAqIChkb3VibGUoX19sZW5ndGgpIC8gX190b3RhbF9sZW5ndGgpKTsKKwkgICAgbmV3KCYoX19zYW1wbGVzW19fcyAqIF9fbnVtX3NhbXBsZXMgKyBfX2ldKSkKKyAgICAgICAgICAgICAgX1ZhbHVlVHlwZShfX3NlcXNfYmVnaW5bX19zXS5maXJzdFtzYW1wbGVfaW5kZXhdKTsKKwkgIH0KKworICAgICAgLy8gU29ydCBzdGFibGUgb3Igbm9uLXN0YWJsZSwgZGVwZW5kaW5nIG9uIHZhbHVlIG9mIHRlbXBsYXRlIHBhcmFtZXRlcgorICAgICAgLy8gIl9fc3RhYmxlIi4KKyAgICAgIF9TYW1wbGluZ1NvcnRlcjxfX3N0YWJsZSwgX1ZhbHVlVHlwZSosIF9Db21wYXJlPigpCisJKF9fc2FtcGxlcywgX19zYW1wbGVzICsgKF9fbnVtX3NhbXBsZXMgKiBfX2spLCBfX2NvbXApOworCisgICAgICBmb3IgKF9UaHJlYWRJbmRleCBfX3NsYWIgPSAwOyBfX3NsYWIgPCBfX251bV90aHJlYWRzOyArK19fc2xhYikKKwkvLyBGb3IgZWFjaCBzbGFiIC8gcHJvY2Vzc29yLgorCWZvciAoX1NlcU51bWJlciBfX3NlcSA9IDA7IF9fc2VxIDwgX19rOyArK19fc2VxKQorCSAgeworCSAgICAvLyBGb3IgZWFjaCBzZXF1ZW5jZS4KKwkgICAgaWYgKF9fc2xhYiA+IDApCisJICAgICAgX19waWVjZXNbX19zbGFiXVtfX3NlcV0uZmlyc3QgPSBzdGQ6OnVwcGVyX2JvdW5kCisJCShfX3NlcXNfYmVnaW5bX19zZXFdLmZpcnN0LCBfX3NlcXNfYmVnaW5bX19zZXFdLnNlY29uZCwKKwkJIF9fc2FtcGxlc1tfX251bV9zYW1wbGVzICogX19rICogX19zbGFiIC8gX19udW1fdGhyZWFkc10sCisJCSBfX2NvbXApCisJCS0gX19zZXFzX2JlZ2luW19fc2VxXS5maXJzdDsKKwkgICAgZWxzZQorCSAgICAgIC8vIEFic29sdXRlIGJlZ2lubmluZy4KKwkgICAgICBfX3BpZWNlc1tfX3NsYWJdW19fc2VxXS5maXJzdCA9IDA7CisJICAgIGlmICgoX19zbGFiICsgMSkgPCBfX251bV90aHJlYWRzKQorCSAgICAgIF9fcGllY2VzW19fc2xhYl1bX19zZXFdLnNlY29uZCA9IHN0ZDo6dXBwZXJfYm91bmQKKwkJKF9fc2Vxc19iZWdpbltfX3NlcV0uZmlyc3QsIF9fc2Vxc19iZWdpbltfX3NlcV0uc2Vjb25kLAorCQkgX19zYW1wbGVzW19fbnVtX3NhbXBsZXMgKiBfX2sgKiAoX19zbGFiICsgMSkgLyBfX251bV90aHJlYWRzXSwKKwkJIF9fY29tcCkKKwkJLSBfX3NlcXNfYmVnaW5bX19zZXFdLmZpcnN0OworCSAgICBlbHNlCisgICAgICAgICAgICAgIC8vIEFic29sdXRlIGVuZC4KKwkgICAgICBfX3BpZWNlc1tfX3NsYWJdW19fc2VxXS5zZWNvbmQgPQorCQlfR0xJQkNYWF9QQVJBTExFTF9MRU5HVEgoX19zZXFzX2JlZ2luW19fc2VxXSk7CisJICB9CisKKyAgICAgIGZvciAoX1NlcU51bWJlciBfX3MgPSAwOyBfX3MgPCBfX2s7ICsrX19zKQorCWZvciAoX0RpZmZlcmVuY2VUeXBlIF9faSA9IDA7IF9faSA8IF9fbnVtX3NhbXBsZXM7ICsrX19pKQorCSAgX19zYW1wbGVzW19fcyAqIF9fbnVtX3NhbXBsZXMgKyBfX2ldLn5fVmFsdWVUeXBlKCk7CisgICAgICA6Om9wZXJhdG9yIGRlbGV0ZShfX3NhbXBsZXMpOworICAgIH0KKworICAvKioKKyAgICogQGJyaWVmIEV4YWN0IHNwbGl0dGluZyBmb3IgcGFyYWxsZWwgbXVsdGl3YXktbWVyZ2Ugcm91dGluZS4KKyAgICoKKyAgICogTm9uZSBvZiB0aGUgcGFzc2VkIHNlcXVlbmNlcyBtYXkgYmUgZW1wdHkuCisgICAqLworICB0ZW1wbGF0ZTxib29sIF9fc3RhYmxlLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVR5cGU+CisgICAgdm9pZAorICAgIG11bHRpd2F5X21lcmdlX2V4YWN0X3NwbGl0dGluZyhfUkFJdGVySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkJCSAgIF9SQUl0ZXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkJCSAgIF9EaWZmZXJlbmNlVHlwZSBfX2xlbmd0aCwKKwkJCQkgICBfRGlmZmVyZW5jZVR5cGUgX190b3RhbF9sZW5ndGgsCisJCQkJICAgX0NvbXBhcmUgX19jb21wLAorICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxfRGlmZmVyZW5jZVR5cGUsIF9EaWZmZXJlbmNlVHlwZT4gPiAqX19waWVjZXMpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVySXRlcmF0b3I+CisJOjpkaWZmZXJlbmNlX3R5cGUgX1NlcU51bWJlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlckl0ZXJhdG9yPgorCTo6dmFsdWVfdHlwZTo6Zmlyc3RfdHlwZQorCV9SQUl0ZXIxOworCisgICAgICBjb25zdCBib29sIF9fdGlnaHQgPSAoX190b3RhbF9sZW5ndGggPT0gX19sZW5ndGgpOworCisgICAgICAvLyBfX2sgc2VxdWVuY2VzLgorICAgICAgY29uc3QgX1NlcU51bWJlciBfX2sgPSBfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luOworCisgICAgICBjb25zdCBfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKworICAgICAgLy8gKFNldHRpbmdzOjptdWx0aXdheV9tZXJnZV9zcGxpdHRpbmcKKyAgICAgIC8vICA9PSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpFWEFDVCkuCisgICAgICBzdGQ6OnZlY3RvcjxfUkFJdGVyMT4qIF9fb2Zmc2V0cyA9IAorCW5ldyBzdGQ6OnZlY3RvcjxfUkFJdGVyMT5bX19udW1fdGhyZWFkc107CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8X1JBSXRlcjEsIF9SQUl0ZXIxPiA+IF9fc2UoX19rKTsKKworICAgICAgY29weShfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fc2UuYmVnaW4oKSk7CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSogX19ib3JkZXJzID0KKwluZXcgX0RpZmZlcmVuY2VUeXBlW19fbnVtX3RocmVhZHMgKyAxXTsKKyAgICAgIF9fZXF1YWxseV9zcGxpdChfX2xlbmd0aCwgX19udW1fdGhyZWFkcywgX19ib3JkZXJzKTsKKworICAgICAgZm9yIChfVGhyZWFkSW5kZXggX19zID0gMDsgX19zIDwgKF9fbnVtX3RocmVhZHMgLSAxKTsgKytfX3MpCisJeworCSAgX19vZmZzZXRzW19fc10ucmVzaXplKF9fayk7CisJICBtdWx0aXNlcV9wYXJ0aXRpb24oX19zZS5iZWdpbigpLCBfX3NlLmVuZCgpLCBfX2JvcmRlcnNbX19zICsgMV0sCisJCQkgICAgIF9fb2Zmc2V0c1tfX3NdLmJlZ2luKCksIF9fY29tcCk7CisKKwkgIC8vIExhc3Qgb25lIGFsc28gbmVlZGVkIGFuZCBhdmFpbGFibGUuCisJICBpZiAoIV9fdGlnaHQpCisJICAgIHsKKwkgICAgICBfX29mZnNldHNbX19udW1fdGhyZWFkcyAtIDFdLnJlc2l6ZShfX2spOworCSAgICAgIG11bHRpc2VxX3BhcnRpdGlvbihfX3NlLmJlZ2luKCksIF9fc2UuZW5kKCksCisJCQkJIF9EaWZmZXJlbmNlVHlwZShfX2xlbmd0aCksCisJCQkJIF9fb2Zmc2V0c1tfX251bV90aHJlYWRzIC0gMV0uYmVnaW4oKSwKKwkJCQkgX19jb21wKTsKKwkgICAgfQorCX0KKyAgICAgIGRlbGV0ZVtdIF9fYm9yZGVyczsKKworICAgICAgZm9yIChfVGhyZWFkSW5kZXggX19zbGFiID0gMDsgX19zbGFiIDwgX19udW1fdGhyZWFkczsgKytfX3NsYWIpCisJeworCSAgLy8gRm9yIGVhY2ggc2xhYiAvIHByb2Nlc3Nvci4KKwkgIGZvciAoX1NlcU51bWJlciBfX3NlcSA9IDA7IF9fc2VxIDwgX19rOyArK19fc2VxKQorCSAgICB7CisJICAgICAgLy8gRm9yIGVhY2ggc2VxdWVuY2UuCisJICAgICAgaWYgKF9fc2xhYiA9PSAwKQorCQl7CisJCSAgLy8gQWJzb2x1dGUgYmVnaW5uaW5nLgorCQkgIF9fcGllY2VzW19fc2xhYl1bX19zZXFdLmZpcnN0ID0gMDsKKwkJfQorCSAgICAgIGVsc2UKKwkJX19waWVjZXNbX19zbGFiXVtfX3NlcV0uZmlyc3QgPQorCQkgIF9fcGllY2VzW19fc2xhYiAtIDFdW19fc2VxXS5zZWNvbmQ7CisJICAgICAgaWYgKCFfX3RpZ2h0IHx8IF9fc2xhYiA8IChfX251bV90aHJlYWRzIC0gMSkpCisJCV9fcGllY2VzW19fc2xhYl1bX19zZXFdLnNlY29uZCA9CisJCSAgX19vZmZzZXRzW19fc2xhYl1bX19zZXFdIC0gX19zZXFzX2JlZ2luW19fc2VxXS5maXJzdDsKKwkgICAgICBlbHNlCisJCXsKKwkJICAvLyBfX3NsYWIgPT0gX19udW1fdGhyZWFkcyAtIDEKKwkJICBfX3BpZWNlc1tfX3NsYWJdW19fc2VxXS5zZWNvbmQgPQorICAgICAgICAgICAgICAgICAgICBfR0xJQkNYWF9QQVJBTExFTF9MRU5HVEgoX19zZXFzX2JlZ2luW19fc2VxXSk7CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGRlbGV0ZVtdIF9fb2Zmc2V0czsKKyAgICB9CisKKyAgLyoqIEBicmllZiBQYXJhbGxlbCBtdWx0aS13YXkgbWVyZ2Ugcm91dGluZS4KKyAgICoKKyAgICogVGhlIF9HTElCQ1hYX1BBUkFMTEVMX0RFQ0lTSU9OIGlzIGJhc2VkIG9uIHRoZSBicmFuY2hpbmcgZmFjdG9yCisgICAqIGFuZCBydW50aW1lIHNldHRpbmdzLgorICAgKgorICAgKiBNdXN0IG5vdCBiZSBjYWxsZWQgaWYgdGhlIG51bWJlciBvZiBzZXF1ZW5jZXMgaXMgMS4KKyAgICoKKyAgICogQHRwYXJhbSBfU3BsaXR0ZXIgZnVuY3RvciB0byBzcGxpdCBpbnB1dCAoZWl0aGVyIF9fZXhhY3Qgb3Igc2FtcGxpbmcgYmFzZWQpCisgICAqIEB0cGFyYW0gX19zdGFibGUgU3RhYmxlIG1lcmdpbmcgaW5jdXJzIGEgcGVyZm9ybWFuY2UgcGVuYWx0eS4KKyAgICogQHRwYXJhbSBfX3NlbnRpbmVsIElnbm9yZWQuCisgICAqCisgICAqIEBwYXJhbSBfX3NlcXNfYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2YgaXRlcmF0b3IgcGFpciBpbnB1dCBzZXF1ZW5jZS4KKyAgICogQHBhcmFtIF9fc2Vxc19lbmQgRW5kIGl0ZXJhdG9yIG9mIGl0ZXJhdG9yIHBhaXIgaW5wdXQgc2VxdWVuY2UuCisgICAqIEBwYXJhbSBfX3RhcmdldCBCZWdpbiBpdGVyYXRvciBvZiBvdXRwdXQgc2VxdWVuY2UuCisgICAqIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvci4KKyAgICogQHBhcmFtIF9fbGVuZ3RoIE1heGltdW0gbGVuZ3RoIHRvIG1lcmdlLCBwb3NzaWJseSBsYXJnZXIgdGhhbiB0aGUKKyAgICogbnVtYmVyIG9mIGVsZW1lbnRzIGF2YWlsYWJsZS4KKyAgICogQHJldHVybiBFbmQgaXRlcmF0b3Igb2Ygb3V0cHV0IHNlcXVlbmNlLgorICAgKi8KKyAgdGVtcGxhdGU8Ym9vbCBfX3N0YWJsZSwKKwkgICBib29sIF9fc2VudGluZWxzLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyMywKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorCSAgIHR5cGVuYW1lIF9TcGxpdHRlciwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyMworICAgIHBhcmFsbGVsX211bHRpd2F5X21lcmdlKF9SQUl0ZXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JBSXRlckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JBSXRlcjMgX190YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NwbGl0dGVyIF9fc3BsaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RpZmZlcmVuY2VUcCBfX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMpCisgICAgICB7CisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworCV9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luID4gMSk7CisjZW5kaWYKKworCV9HTElCQ1hYX0NBTEwoX19sZW5ndGgpCisKKwl0eXBlZGVmIF9EaWZmZXJlbmNlVHAgX0RpZmZlcmVuY2VUeXBlOworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXJJdGVyYXRvcj4KKwkgIDo6ZGlmZmVyZW5jZV90eXBlIF9TZXFOdW1iZXI7CisJdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVySXRlcmF0b3I+CisgICAgICAgICAgOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlCisgICAgICAgICAgX1JBSXRlcjE7CisJdHlwZWRlZiB0eXBlbmFtZQorICAgICAgICAgIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXIxPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworCisJLy8gTGVhdmUgb25seSBub24tZW1wdHkgc2VxdWVuY2VzLgorCXR5cGVkZWYgc3RkOjpwYWlyPF9SQUl0ZXIxLCBfUkFJdGVyMT4gc2VxX3R5cGU7CisJc2VxX3R5cGUqIF9fbmVfc2VxcyA9IG5ldyBzZXFfdHlwZVtfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luXTsKKwlfU2VxTnVtYmVyIF9fayA9IDA7CisJX0RpZmZlcmVuY2VUeXBlIF9fdG90YWxfbGVuZ3RoID0gMDsKKwlmb3IgKF9SQUl0ZXJJdGVyYXRvciBfX3JhaWkgPSBfX3NlcXNfYmVnaW47CisgICAgICAgICAgICAgX19yYWlpICE9IF9fc2Vxc19lbmQ7ICsrX19yYWlpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9EaWZmZXJlbmNlVHAgX19zZXFfbGVuZ3RoID0gX0dMSUJDWFhfUEFSQUxMRUxfTEVOR1RIKCpfX3JhaWkpOworICAgICAgICAgICAgaWYoX19zZXFfbGVuZ3RoID4gMCkKKyAgICAgICAgICAgICAgeworICAgICAgICAJX190b3RhbF9sZW5ndGggKz0gX19zZXFfbGVuZ3RoOworICAgICAgICAJX19uZV9zZXFzW19faysrXSA9ICpfX3JhaWk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKwlfR0xJQkNYWF9DQUxMKF9fdG90YWxfbGVuZ3RoKQorCisJX19sZW5ndGggPSBzdGQ6Om1pbjxfRGlmZmVyZW5jZVRwPihfX2xlbmd0aCwgX190b3RhbF9sZW5ndGgpOworCisJaWYgKF9fdG90YWxfbGVuZ3RoID09IDAgfHwgX19rID09IDApCisJICB7CisJICAgIGRlbGV0ZVtdIF9fbmVfc2VxczsKKwkgICAgcmV0dXJuIF9fdGFyZ2V0OworCSAgfQorCisJc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPF9EaWZmZXJlbmNlVHlwZSwgX0RpZmZlcmVuY2VUeXBlPiA+KiBfX3BpZWNlczsKKworCV9fbnVtX3RocmVhZHMgPSBzdGF0aWNfY2FzdDxfVGhyZWFkSW5kZXg+CisgICAgICAgICAgKHN0ZDo6bWluPF9EaWZmZXJlbmNlVHlwZT4oX19udW1fdGhyZWFkcywgX190b3RhbF9sZW5ndGgpKTsKKworIyAgICAgICBwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzIChfX251bV90aHJlYWRzKQorCXsKKyMgICAgICAgICBwcmFnbWEgb21wIHNpbmdsZQorCSAgeworCSAgICBfX251bV90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpOworCSAgICAvLyBUaHJlYWQgX190IHdpbGwgaGF2ZSB0byBtZXJnZSBwaWVjZXNbX19pYW1dWzAuLl9fayAtIDFdCisJICAgIF9fcGllY2VzID0gbmV3IHN0ZDo6dmVjdG9yPAorCSAgICBzdGQ6OnBhaXI8X0RpZmZlcmVuY2VUeXBlLCBfRGlmZmVyZW5jZVR5cGU+ID5bX19udW1fdGhyZWFkc107CisJICAgIGZvciAoX1RocmVhZEluZGV4IF9fcyA9IDA7IF9fcyA8IF9fbnVtX3RocmVhZHM7ICsrX19zKQorCSAgICAgIF9fcGllY2VzW19fc10ucmVzaXplKF9fayk7CisKKwkgICAgX0RpZmZlcmVuY2VUeXBlIF9fbnVtX3NhbXBsZXMgPQorCSAgICAgIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLm1lcmdlX292ZXJzYW1wbGluZworCSAgICAgICogX19udW1fdGhyZWFkczsKKworCSAgICBfX3NwbGl0dGVyKF9fbmVfc2VxcywgX19uZV9zZXFzICsgX19rLCBfX2xlbmd0aCwgX190b3RhbF9sZW5ndGgsCisJCSAgICAgICBfX2NvbXAsIF9fcGllY2VzKTsKKwkgIH0gLy9zaW5nbGUKKworCSAgX1RocmVhZEluZGV4IF9faWFtID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisKKwkgIF9EaWZmZXJlbmNlVHlwZSBfX3RhcmdldF9wb3NpdGlvbiA9IDA7CisKKwkgIGZvciAoX1NlcU51bWJlciBfX2MgPSAwOyBfX2MgPCBfX2s7ICsrX19jKQorCSAgICBfX3RhcmdldF9wb3NpdGlvbiArPSBfX3BpZWNlc1tfX2lhbV1bX19jXS5maXJzdDsKKworCSAgc2VxX3R5cGUqIF9fY2h1bmtzID0gbmV3IHNlcV90eXBlW19fa107CisKKwkgIGZvciAoX1NlcU51bWJlciBfX3MgPSAwOyBfX3MgPCBfX2s7ICsrX19zKQorCSAgICBfX2NodW5rc1tfX3NdID0gc3RkOjptYWtlX3BhaXIoX19uZV9zZXFzW19fc10uZmlyc3QKKwkJCQkJICAgKyBfX3BpZWNlc1tfX2lhbV1bX19zXS5maXJzdCwKKwkJCQkJICAgX19uZV9zZXFzW19fc10uZmlyc3QKKwkJCQkJICAgKyBfX3BpZWNlc1tfX2lhbV1bX19zXS5zZWNvbmQpOworCisJICBpZihfX2xlbmd0aCA+IF9fdGFyZ2V0X3Bvc2l0aW9uKQorCSAgICBfX3NlcXVlbnRpYWxfbXVsdGl3YXlfbWVyZ2U8X19zdGFibGUsIF9fc2VudGluZWxzPgorCSAgICAgIChfX2NodW5rcywgX19jaHVua3MgKyBfX2ssIF9fdGFyZ2V0ICsgX190YXJnZXRfcG9zaXRpb24sCisJICAgICAgICooX19zZXFzX2JlZ2luLT5zZWNvbmQpLCBfX2xlbmd0aCAtIF9fdGFyZ2V0X3Bvc2l0aW9uLCBfX2NvbXApOworCisJICBkZWxldGVbXSBfX2NodW5rczsKKwl9IC8vIHBhcmFsbGVsCisKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisJX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKAorICAgICAgICAgIF9faXNfc29ydGVkKF9fdGFyZ2V0LCBfX3RhcmdldCArIF9fbGVuZ3RoLCBfX2NvbXApKTsKKyNlbmRpZgorCisJX19rID0gMDsKKwkvLyBVcGRhdGUgZW5kcyBvZiBzZXF1ZW5jZXMuCisJZm9yIChfUkFJdGVySXRlcmF0b3IgX19yYWlpID0gX19zZXFzX2JlZ2luOworICAgICAgICAgICAgIF9fcmFpaSAhPSBfX3NlcXNfZW5kOyArK19fcmFpaSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoID0gX0dMSUJDWFhfUEFSQUxMRUxfTEVOR1RIKCpfX3JhaWkpOworICAgICAgICAgICAgaWYoX19sZW5ndGggPiAwKQorICAgICAgICAgICAgICAoKl9fcmFpaSkuZmlyc3QgKz0gX19waWVjZXNbX19udW1fdGhyZWFkcyAtIDFdW19faysrXS5zZWNvbmQ7CisgICAgICAgICAgfQorCisJZGVsZXRlW10gX19waWVjZXM7CisJZGVsZXRlW10gX19uZV9zZXFzOworCisJcmV0dXJuIF9fdGFyZ2V0ICsgX19sZW5ndGg7CisgICAgICB9CisKKyAgLyoqCisgICAqIEBicmllZiBNdWx0aXdheSBNZXJnZSBGcm9udGVuZC4KKyAgICoKKyAgICogTWVyZ2UgdGhlIHNlcXVlbmNlcyBzcGVjaWZpZWQgYnkgc2Vxc19iZWdpbiBhbmQgX19zZXFzX2VuZCBpbnRvCisgICAqIF9fdGFyZ2V0LiAgX19zZXFzX2JlZ2luIGFuZCBfX3NlcXNfZW5kIG11c3QgcG9pbnQgdG8gYSBzZXF1ZW5jZSBvZgorICAgKiBwYWlycy4gIFRoZXNlIHBhaXJzIG11c3QgY29udGFpbiBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nCisgICAqIG9mIGEgc2VxdWVuY2UgaW4gdGhlaXIgZmlyc3QgZW50cnkgYW5kIGFuIGl0ZXJhdG9yIHRoZSBfTV9lbmQgb2YKKyAgICogdGhlIHNhbWUgc2VxdWVuY2UgaW4gdGhlaXIgc2Vjb25kIGVudHJ5LgorICAgKgorICAgKiBUaWVzIGFyZSBicm9rZW4gYXJiaXRyYXJpbHkuICBTZWUgc3RhYmxlX211bHRpd2F5X21lcmdlIGZvciBhIHZhcmlhbnQKKyAgICogdGhhdCBicmVha3MgdGllcyBieSBzZXF1ZW5jZSBudW1iZXIgYnV0IGlzIHNsb3dlci4KKyAgICoKKyAgICogVGhlIGZpcnN0IGVudHJpZXMgb2YgdGhlIHBhaXJzIChpLmUuIHRoZSBiZWdpbiBpdGVyYXRvcnMpIHdpbGwgYmUgbW92ZWQKKyAgICogZm9yd2FyZC4KKyAgICoKKyAgICogVGhlIG91dHB1dCBzZXF1ZW5jZSBoYXMgdG8gcHJvdmlkZSBlbm91Z2ggc3BhY2UgZm9yIGFsbCBlbGVtZW50cworICAgKiB0aGF0IGFyZSB3cml0dGVuIHRvIGl0LgorICAgKgorICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbWVyZ2UgdGhlIGlucHV0IHNlcXVlbmNlczoKKyAgICoKKyAgICogLSBub3Qgc3RhYmxlCisgICAqIC0gcGFyYWxsZWwsIGRlcGVuZGluZyBvbiB0aGUgaW5wdXQgc2l6ZSBhbmQgU2V0dGluZ3MKKyAgICogLSB1c2luZyBzYW1wbGluZyBmb3Igc3BsaXR0aW5nCisgICAqIC0gbm90IHVzaW5nIHNlbnRpbmVscworICAgKgorICAgKiBFeGFtcGxlOgorICAgKgorICAgKiA8cHJlPgorICAgKiAgIGludCBzZXF1ZW5jZXNbMTBdWzEwXTsKKyAgICogICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCAxMDsgKytfX2kpCisgICAqICAgICBmb3IgKGludCBfX2ogPSAwOyBfX2kgPCAxMDsgKytfX2opCisgICAqICAgICAgIHNlcXVlbmNlc1tfX2ldW19fal0gPSBfX2o7CisgICAqCisgICAqICAgaW50IF9fb3V0WzMzXTsKKyAgICogICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50Kj4gPiBzZXFzOworICAgKiAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IDEwOyArK19faSkKKyAgICogICAgIHsgc2Vxcy5wdXNoKHN0ZDo6bWFrZV9wYWlyPGludCo+KHNlcXVlbmNlc1tfX2ldLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VzW19faV0gKyAxMCkpIH0KKyAgICoKKyAgICogICBtdWx0aXdheV9tZXJnZShzZXFzLmJlZ2luKCksIHNlcXMuZW5kKCksIF9fdGFyZ2V0LCBzdGQ6Omxlc3M8aW50PigpLCAzMyk7CisgICAqIDwvcHJlPgorICAgKgorICAgKiBAc2VlIHN0YWJsZV9tdWx0aXdheV9tZXJnZQorICAgKgorICAgKiBAcHJlIEFsbCBpbnB1dCBzZXF1ZW5jZXMgbXVzdCBiZSBzb3J0ZWQuCisgICAqIEBwcmUgVGFyZ2V0IG11c3QgcHJvdmlkZSBlbm91Z2ggc3BhY2UgdG8gbWVyZ2Ugb3V0IGxlbmd0aCBlbGVtZW50cyBvcgorICAgKiAgICB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFsbCBzZXF1ZW5jZXMsIHdoaWNoZXZlciBpcyBzbWFsbGVyLgorICAgKgorICAgKiBAcG9zdCBbX190YXJnZXQsIHJldHVybiBfX3ZhbHVlKSBjb250YWlucyBtZXJnZWQgX19lbGVtZW50cyBmcm9tIHRoZQorICAgKiAgICBpbnB1dCBzZXF1ZW5jZXMuCisgICAqIEBwb3N0IHJldHVybiBfX3ZhbHVlIC0gX190YXJnZXQgPSBtaW4oX19sZW5ndGgsIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbGwKKyAgICogICAgc2VxdWVuY2VzKS4KKyAgICoKKyAgICogQHRwYXJhbSBfUkFJdGVyUGFpckl0ZXJhdG9yIGl0ZXJhdG9yIG92ZXIgc2VxdWVuY2UKKyAgICogICAgb2YgcGFpcnMgb2YgaXRlcmF0b3JzCisgICAqIEB0cGFyYW0gX1JBSXRlck91dCBpdGVyYXRvciBvdmVyIHRhcmdldCBzZXF1ZW5jZQorICAgKiBAdHBhcmFtIF9EaWZmZXJlbmNlVHAgZGlmZmVyZW5jZSB0eXBlIGZvciB0aGUgc2VxdWVuY2UKKyAgICogQHRwYXJhbSBfQ29tcGFyZSBzdHJpY3Qgd2VhayBvcmRlcmluZyB0eXBlIHRvIGNvbXBhcmUgZWxlbWVudHMKKyAgICogICAgaW4gc2VxdWVuY2VzCisgICAqCisgICAqIEBwYXJhbSBfX3NlcXNfYmVnaW4gIF9fYmVnaW4gb2Ygc2VxdWVuY2UgX19zZXF1ZW5jZQorICAgKiBAcGFyYW0gX19zZXFzX2VuZCAgICBfTV9lbmQgb2Ygc2VxdWVuY2UgX19zZXF1ZW5jZQorICAgKiBAcGFyYW0gX190YXJnZXQgICAgICB0YXJnZXQgc2VxdWVuY2UgdG8gbWVyZ2UgdG8uCisgICAqIEBwYXJhbSBfX2NvbXAgICAgICAgIHN0cmljdCB3ZWFrIG9yZGVyaW5nIHRvIHVzZSBmb3IgZWxlbWVudCBjb21wYXJpc29uLgorICAgKiBAcGFyYW0gX19sZW5ndGggTWF4aW11bSBsZW5ndGggdG8gbWVyZ2UsIHBvc3NpYmx5IGxhcmdlciB0aGFuIHRoZQorICAgKiBudW1iZXIgb2YgZWxlbWVudHMgYXZhaWxhYmxlLgorICAgKgorICAgKiBAcmV0dXJuIF9NX2VuZCBpdGVyYXRvciBvZiBvdXRwdXQgc2VxdWVuY2UKKyAgICovCisgIC8vIG11bHRpd2F5X21lcmdlCisgIC8vIHB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlclBhaXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyT3V0LAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlck91dAorICAgIG11bHRpd2F5X21lcmdlKF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkgICBfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCSAgIF9SQUl0ZXJPdXQgX190YXJnZXQsCisJCSAgIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsIF9Db21wYXJlIF9fY29tcCwKKwkJICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgX0RpZmZlcmVuY2VUcCBfRGlmZmVyZW5jZVR5cGU7CisgICAgICBfR0xJQkNYWF9DQUxMKF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4pCisKKyAgICAgIC8vIGNhdGNoIHNwZWNpYWwgY2FzZTogbm8gc2VxdWVuY2VzCisgICAgICBpZiAoX19zZXFzX2JlZ2luID09IF9fc2Vxc19lbmQpCisJcmV0dXJuIF9fdGFyZ2V0OworCisgICAgICAvLyBFeGVjdXRlIG11bHRpd2F5IG1lcmdlICpzZXF1ZW50aWFsbHkqLgorICAgICAgcmV0dXJuIF9fc2VxdWVudGlhbF9tdWx0aXdheV9tZXJnZQorCTwvKiBfX3N0YWJsZSA9ICovIGZhbHNlLCAvKiBfX3NlbnRpbmVscyA9ICovIGZhbHNlPgorCShfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LAorCSAqKF9fc2Vxc19iZWdpbi0+c2Vjb25kKSwgX19sZW5ndGgsIF9fY29tcCk7CisgICAgfQorCisgIC8vIHB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlclBhaXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyT3V0LAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlck91dAorICAgIG11bHRpd2F5X21lcmdlKF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkgICBfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCSAgIF9SQUl0ZXJPdXQgX190YXJnZXQsCisJCSAgIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsIF9Db21wYXJlIF9fY29tcCwKKwkJICAgX19nbnVfcGFyYWxsZWw6OmV4YWN0X3RhZyBfX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIF9EaWZmZXJlbmNlVHAgX0RpZmZlcmVuY2VUeXBlOworICAgICAgX0dMSUJDWFhfQ0FMTChfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luKQorCisgICAgICAvLyBjYXRjaCBzcGVjaWFsIGNhc2U6IG5vIHNlcXVlbmNlcworICAgICAgaWYgKF9fc2Vxc19iZWdpbiA9PSBfX3NlcXNfZW5kKQorCXJldHVybiBfX3RhcmdldDsKKworICAgICAgLy8gRXhlY3V0ZSBtZXJnZTsgbWF5YmUgcGFyYWxsZWwsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIG1lcmdlZAorICAgICAgLy8gZWxlbWVudHMgYW5kIHRoZSBudW1iZXIgb2Ygc2VxdWVuY2VzIGFuZCBnbG9iYWwgdGhyZXNob2xkcyBpbgorICAgICAgLy8gU2V0dGluZ3MuCisgICAgICBpZiAoKF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4gPiAxKQorCSAgJiYgX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgKChfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luKSA+PQorICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkubXVsdGl3YXlfbWVyZ2VfbWluaW1hbF9rKQorICAgICAgICAgICAgJiYgKChfU2VxdWVuY2VJbmRleClfX2xlbmd0aCA+PQorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5tdWx0aXdheV9tZXJnZV9taW5pbWFsX24pKSkKKwlyZXR1cm4gcGFyYWxsZWxfbXVsdGl3YXlfbWVyZ2UKKwkgIDwvKiBfX3N0YWJsZSA9ICovIGZhbHNlLCAvKiBfX3NlbnRpbmVscyA9ICovIGZhbHNlPgorCSAgKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsCisJICAgbXVsdGl3YXlfbWVyZ2VfZXhhY3Rfc3BsaXR0aW5nPC8qIF9fc3RhYmxlID0gKi8gZmFsc2UsCisJICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlclBhaXJJdGVyYXRvcj4KKwkgICA6OnZhbHVlX3R5cGUqLCBfQ29tcGFyZSwgX0RpZmZlcmVuY2VUcD4sCisJICAgc3RhdGljX2Nhc3Q8X0RpZmZlcmVuY2VUeXBlPihfX2xlbmd0aCksIF9fY29tcCwKKwkgICBfX3RhZy5fX2dldF9udW1fdGhyZWFkcygpKTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gX19zZXF1ZW50aWFsX211bHRpd2F5X21lcmdlCisJICA8LyogX19zdGFibGUgPSAqLyBmYWxzZSwgLyogX19zZW50aW5lbHMgPSAqLyBmYWxzZT4KKwkgIChfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LAorCSAgICooX19zZXFzX2JlZ2luLT5zZWNvbmQpLCBfX2xlbmd0aCwgX19jb21wKTsKKyAgICB9CisKKyAgLy8gcHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyUGFpckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXJPdXQsCisJICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyT3V0CisgICAgbXVsdGl3YXlfbWVyZ2UoX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisJCSAgIF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2VuZCwKKwkJICAgX1JBSXRlck91dCBfX3RhcmdldCwKKwkJICAgX0RpZmZlcmVuY2VUcCBfX2xlbmd0aCwgX0NvbXBhcmUgX19jb21wLAorCQkgICBfX2dudV9wYXJhbGxlbDo6c2FtcGxpbmdfdGFnIF9fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgX0RpZmZlcmVuY2VUcCBfRGlmZmVyZW5jZVR5cGU7CisgICAgICBfR0xJQkNYWF9DQUxMKF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4pCisKKyAgICAgIC8vIGNhdGNoIHNwZWNpYWwgY2FzZTogbm8gc2VxdWVuY2VzCisgICAgICBpZiAoX19zZXFzX2JlZ2luID09IF9fc2Vxc19lbmQpCisJcmV0dXJuIF9fdGFyZ2V0OworCisgICAgICAvLyBFeGVjdXRlIG1lcmdlOyBtYXliZSBwYXJhbGxlbCwgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgbWVyZ2VkCisgICAgICAvLyBlbGVtZW50cyBhbmQgdGhlIG51bWJlciBvZiBzZXF1ZW5jZXMgYW5kIGdsb2JhbCB0aHJlc2hvbGRzIGluCisgICAgICAvLyBTZXR0aW5ncy4KKyAgICAgIGlmICgoX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbiA+IDEpCisJICAmJiBfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICAoKF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4pID49CisgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5tdWx0aXdheV9tZXJnZV9taW5pbWFsX2spCisgICAgICAgICAgICAmJiAoKF9TZXF1ZW5jZUluZGV4KV9fbGVuZ3RoID49CisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLm11bHRpd2F5X21lcmdlX21pbmltYWxfbikpKQorCXJldHVybiBwYXJhbGxlbF9tdWx0aXdheV9tZXJnZQorCSAgPC8qIF9fc3RhYmxlID0gKi8gZmFsc2UsIC8qIF9fc2VudGluZWxzID0gKi8gZmFsc2U+CisJICAoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwKKwkgICBtdWx0aXdheV9tZXJnZV9leGFjdF9zcGxpdHRpbmc8LyogX19zdGFibGUgPSAqLyBmYWxzZSwKKwkgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyUGFpckl0ZXJhdG9yPgorCSAgIDo6dmFsdWVfdHlwZSosIF9Db21wYXJlLCBfRGlmZmVyZW5jZVRwPiwKKwkgICBzdGF0aWNfY2FzdDxfRGlmZmVyZW5jZVR5cGU+KF9fbGVuZ3RoKSwgX19jb21wLAorCSAgIF9fdGFnLl9fZ2V0X251bV90aHJlYWRzKCkpOworICAgICAgZWxzZQorCXJldHVybiBfX3NlcXVlbnRpYWxfbXVsdGl3YXlfbWVyZ2UKKwkgIDwvKiBfX3N0YWJsZSA9ICovIGZhbHNlLCAvKiBfX3NlbnRpbmVscyA9ICovIGZhbHNlPgorCSAgKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsCisJICAgKihfX3NlcXNfYmVnaW4tPnNlY29uZCksIF9fbGVuZ3RoLCBfX2NvbXApOworICAgIH0KKworICAvLyBwdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXJQYWlySXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1JBSXRlck91dCwKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXJPdXQKKyAgICBtdWx0aXdheV9tZXJnZShfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJICAgX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkgICBfUkFJdGVyT3V0IF9fdGFyZ2V0LAorCQkgICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXAsCisJCSAgIHBhcmFsbGVsX3RhZyBfX3RhZyA9IHBhcmFsbGVsX3RhZygwKSkKKyAgICB7IHJldHVybiBtdWx0aXdheV9tZXJnZShfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LCBfX2xlbmd0aCwKKwkJCSAgICBfX2NvbXAsIGV4YWN0X3RhZyhfX3RhZy5fX2dldF9udW1fdGhyZWFkcygpKSk7IH0KKworICAvLyBwdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXJQYWlySXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1JBSXRlck91dCwKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXJPdXQKKyAgICBtdWx0aXdheV9tZXJnZShfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJICAgX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkgICBfUkFJdGVyT3V0IF9fdGFyZ2V0LAorCQkgICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXAsCisJCSAgIGRlZmF1bHRfcGFyYWxsZWxfdGFnIF9fdGFnKQorICAgIHsgcmV0dXJuIG11bHRpd2F5X21lcmdlKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsIF9fbGVuZ3RoLAorCQkJICAgIF9fY29tcCwgZXhhY3RfdGFnKF9fdGFnLl9fZ2V0X251bV90aHJlYWRzKCkpKTsgfQorCisgIC8vIHN0YWJsZV9tdWx0aXdheV9tZXJnZQorICAvLyBwdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXJQYWlySXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1JBSXRlck91dCwKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXJPdXQKKyAgICBzdGFibGVfbXVsdGl3YXlfbWVyZ2UoX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisJCQkgIF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2VuZCwKKwkJCSAgX1JBSXRlck91dCBfX3RhcmdldCwKKwkJCSAgX0RpZmZlcmVuY2VUcCBfX2xlbmd0aCwgX0NvbXBhcmUgX19jb21wLAorCQkJICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeworICAgICAgdHlwZWRlZiBfRGlmZmVyZW5jZVRwIF9EaWZmZXJlbmNlVHlwZTsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbikKKworICAgICAgLy8gY2F0Y2ggc3BlY2lhbCBjYXNlOiBubyBzZXF1ZW5jZXMKKyAgICAgIGlmIChfX3NlcXNfYmVnaW4gPT0gX19zZXFzX2VuZCkKKwlyZXR1cm4gX190YXJnZXQ7CisKKyAgICAgIC8vIEV4ZWN1dGUgbXVsdGl3YXkgbWVyZ2UgKnNlcXVlbnRpYWxseSouCisgICAgICByZXR1cm4gX19zZXF1ZW50aWFsX211bHRpd2F5X21lcmdlCisJPC8qIF9fc3RhYmxlID0gKi8gdHJ1ZSwgLyogX19zZW50aW5lbHMgPSAqLyBmYWxzZT4KKyAgICAgICAgICAoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwKKwkgICAqKF9fc2Vxc19iZWdpbi0+c2Vjb25kKSwgX19sZW5ndGgsIF9fY29tcCk7CisgICAgfQorCisgIC8vIHB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlclBhaXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyT3V0LAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlck91dAorICAgIHN0YWJsZV9tdWx0aXdheV9tZXJnZShfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJCSAgX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkJICBfUkFJdGVyT3V0IF9fdGFyZ2V0LAorCQkJICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXAsCisJCQkgIF9fZ251X3BhcmFsbGVsOjpleGFjdF90YWcgX190YWcpCisgICAgeworICAgICAgdHlwZWRlZiBfRGlmZmVyZW5jZVRwIF9EaWZmZXJlbmNlVHlwZTsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbikKKworICAgICAgLy8gY2F0Y2ggc3BlY2lhbCBjYXNlOiBubyBzZXF1ZW5jZXMKKyAgICAgIGlmIChfX3NlcXNfYmVnaW4gPT0gX19zZXFzX2VuZCkKKwlyZXR1cm4gX190YXJnZXQ7CisKKyAgICAgIC8vIEV4ZWN1dGUgbWVyZ2U7IG1heWJlIHBhcmFsbGVsLCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBtZXJnZWQKKyAgICAgIC8vIGVsZW1lbnRzIGFuZCB0aGUgbnVtYmVyIG9mIHNlcXVlbmNlcyBhbmQgZ2xvYmFsIHRocmVzaG9sZHMgaW4KKyAgICAgIC8vIFNldHRpbmdzLgorICAgICAgaWYgKChfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luID4gMSkKKwkgICYmIF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgICgoX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbikgPj0KKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkubXVsdGl3YXlfbWVyZ2VfbWluaW1hbF9rKQorICAgICAgICAgICAgJiYgKChfU2VxdWVuY2VJbmRleClfX2xlbmd0aCA+PQorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5tdWx0aXdheV9tZXJnZV9taW5pbWFsX24pKSkKKwlyZXR1cm4gcGFyYWxsZWxfbXVsdGl3YXlfbWVyZ2UKKyAgICAgICAgICA8LyogX19zdGFibGUgPSAqLyB0cnVlLCAvKiBfX3NlbnRpbmVscyA9ICovIGZhbHNlPgorCSAgKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsCisJICAgbXVsdGl3YXlfbWVyZ2VfZXhhY3Rfc3BsaXR0aW5nPC8qIF9fc3RhYmxlID0gKi8gdHJ1ZSwKKwkgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyUGFpckl0ZXJhdG9yPgorCSAgIDo6dmFsdWVfdHlwZSosIF9Db21wYXJlLCBfRGlmZmVyZW5jZVRwPiwKKwkgICBzdGF0aWNfY2FzdDxfRGlmZmVyZW5jZVR5cGU+KF9fbGVuZ3RoKSwgX19jb21wLAorCSAgIF9fdGFnLl9fZ2V0X251bV90aHJlYWRzKCkpOworICAgICAgZWxzZQorCXJldHVybiBfX3NlcXVlbnRpYWxfbXVsdGl3YXlfbWVyZ2UKKwkgIDwvKiBfX3N0YWJsZSA9ICovIHRydWUsIC8qIF9fc2VudGluZWxzID0gKi8gZmFsc2U+CisJICAoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwKKwkgICAqKF9fc2Vxc19iZWdpbi0+c2Vjb25kKSwgX19sZW5ndGgsIF9fY29tcCk7CisgICAgfQorCisgIC8vIHB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlclBhaXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyT3V0LAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlck91dAorICAgIHN0YWJsZV9tdWx0aXdheV9tZXJnZShfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJCSAgX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkJICBfUkFJdGVyT3V0IF9fdGFyZ2V0LAorCQkJICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXAsCisJCQkgIHNhbXBsaW5nX3RhZyBfX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIF9EaWZmZXJlbmNlVHAgX0RpZmZlcmVuY2VUeXBlOworICAgICAgX0dMSUJDWFhfQ0FMTChfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luKQorCisgICAgICAvLyBjYXRjaCBzcGVjaWFsIGNhc2U6IG5vIHNlcXVlbmNlcworICAgICAgaWYgKF9fc2Vxc19iZWdpbiA9PSBfX3NlcXNfZW5kKQorCXJldHVybiBfX3RhcmdldDsKKworICAgICAgLy8gRXhlY3V0ZSBtZXJnZTsgbWF5YmUgcGFyYWxsZWwsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIG1lcmdlZAorICAgICAgLy8gZWxlbWVudHMgYW5kIHRoZSBudW1iZXIgb2Ygc2VxdWVuY2VzIGFuZCBnbG9iYWwgdGhyZXNob2xkcyBpbgorICAgICAgLy8gU2V0dGluZ3MuCisgICAgICBpZiAoKF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4gPiAxKQorCSAgJiYgX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgKChfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luKSA+PQorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5tdWx0aXdheV9tZXJnZV9taW5pbWFsX2spCisgICAgICAgICAgICAmJiAoKF9TZXF1ZW5jZUluZGV4KV9fbGVuZ3RoID49CisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLm11bHRpd2F5X21lcmdlX21pbmltYWxfbikpKQorCXJldHVybiBwYXJhbGxlbF9tdWx0aXdheV9tZXJnZQorICAgICAgICAgIDwvKiBfX3N0YWJsZSA9ICovIHRydWUsIC8qIF9fc2VudGluZWxzID0gKi8gZmFsc2U+CisJICAoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwKKwkgICBtdWx0aXdheV9tZXJnZV9zYW1wbGluZ19zcGxpdHRpbmc8LyogX19zdGFibGUgPSAqLyB0cnVlLAorCSAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXJQYWlySXRlcmF0b3I+CisJICAgOjp2YWx1ZV90eXBlKiwgX0NvbXBhcmUsIF9EaWZmZXJlbmNlVHA+LAorCSAgIHN0YXRpY19jYXN0PF9EaWZmZXJlbmNlVHlwZT4oX19sZW5ndGgpLCBfX2NvbXAsCisJICAgX190YWcuX19nZXRfbnVtX3RocmVhZHMoKSk7CisgICAgICBlbHNlCisJcmV0dXJuIF9fc2VxdWVudGlhbF9tdWx0aXdheV9tZXJnZQorICAgICAgICAgIDwvKiBfX3N0YWJsZSA9ICovIHRydWUsIC8qIF9fc2VudGluZWxzID0gKi8gZmFsc2U+CisJICAoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwKKwkgICAqKF9fc2Vxc19iZWdpbi0+c2Vjb25kKSwgX19sZW5ndGgsIF9fY29tcCk7CisgICAgfQorCisgIC8vIHB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlclBhaXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyT3V0LAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlck91dAorICAgIHN0YWJsZV9tdWx0aXdheV9tZXJnZShfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJCSAgX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkJICBfUkFJdGVyT3V0IF9fdGFyZ2V0LAorCQkJICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXAsCisJCQkgIHBhcmFsbGVsX3RhZyBfX3RhZyA9IHBhcmFsbGVsX3RhZygwKSkKKyAgICB7CisgICAgICByZXR1cm4gc3RhYmxlX211bHRpd2F5X21lcmdlCisJKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsIF9fbGVuZ3RoLCBfX2NvbXAsCisJIGV4YWN0X3RhZyhfX3RhZy5fX2dldF9udW1fdGhyZWFkcygpKSk7CisgICAgfQorCisgIC8vIHB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlclBhaXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyT3V0LAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlck91dAorICAgIHN0YWJsZV9tdWx0aXdheV9tZXJnZShfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJCSAgX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkJICBfUkFJdGVyT3V0IF9fdGFyZ2V0LAorCQkJICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXAsCisJCQkgIGRlZmF1bHRfcGFyYWxsZWxfdGFnIF9fdGFnKQorICAgIHsKKyAgICAgIHJldHVybiBzdGFibGVfbXVsdGl3YXlfbWVyZ2UKKwkoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwgX19sZW5ndGgsIF9fY29tcCwKKwkgZXhhY3RfdGFnKF9fdGFnLl9fZ2V0X251bV90aHJlYWRzKCkpKTsKKyAgICB9CisKKyAgLyoqCisgICAqIEBicmllZiBNdWx0aXdheSBNZXJnZSBGcm9udGVuZC4KKyAgICoKKyAgICogTWVyZ2UgdGhlIHNlcXVlbmNlcyBzcGVjaWZpZWQgYnkgc2Vxc19iZWdpbiBhbmQgX19zZXFzX2VuZCBpbnRvCisgICAqIF9fdGFyZ2V0LiAgX19zZXFzX2JlZ2luIGFuZCBfX3NlcXNfZW5kIG11c3QgcG9pbnQgdG8gYSBzZXF1ZW5jZSBvZgorICAgKiBwYWlycy4gIFRoZXNlIHBhaXJzIG11c3QgY29udGFpbiBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nCisgICAqIG9mIGEgc2VxdWVuY2UgaW4gdGhlaXIgZmlyc3QgZW50cnkgYW5kIGFuIGl0ZXJhdG9yIHRoZSBfTV9lbmQgb2YKKyAgICogdGhlIHNhbWUgc2VxdWVuY2UgaW4gdGhlaXIgc2Vjb25kIGVudHJ5LgorICAgKgorICAgKiBUaWVzIGFyZSBicm9rZW4gYXJiaXRyYXJpbHkuICBTZWUgc3RhYmxlX211bHRpd2F5X21lcmdlIGZvciBhIHZhcmlhbnQKKyAgICogdGhhdCBicmVha3MgdGllcyBieSBzZXF1ZW5jZSBudW1iZXIgYnV0IGlzIHNsb3dlci4KKyAgICoKKyAgICogVGhlIGZpcnN0IGVudHJpZXMgb2YgdGhlIHBhaXJzIChpLmUuIHRoZSBiZWdpbiBpdGVyYXRvcnMpIHdpbGwgYmUgbW92ZWQKKyAgICogZm9yd2FyZCBhY2NvcmRpbmdseS4KKyAgICoKKyAgICogVGhlIG91dHB1dCBzZXF1ZW5jZSBoYXMgdG8gcHJvdmlkZSBlbm91Z2ggc3BhY2UgZm9yIGFsbCBlbGVtZW50cworICAgKiB0aGF0IGFyZSB3cml0dGVuIHRvIGl0LgorICAgKgorICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbWVyZ2UgdGhlIGlucHV0IHNlcXVlbmNlczoKKyAgICoKKyAgICogLSBub3Qgc3RhYmxlCisgICAqIC0gcGFyYWxsZWwsIGRlcGVuZGluZyBvbiB0aGUgaW5wdXQgc2l6ZSBhbmQgU2V0dGluZ3MKKyAgICogLSB1c2luZyBzYW1wbGluZyBmb3Igc3BsaXR0aW5nCisgICAqIC0gdXNpbmcgc2VudGluZWxzCisgICAqCisgICAqIFlvdSBoYXZlIHRvIHRha2UgY2FyZSB0aGF0IHRoZSBlbGVtZW50IHRoZSBfTV9lbmQgaXRlcmF0b3IgcG9pbnRzIHRvIGlzCisgICAqIHJlYWRhYmxlIGFuZCBjb250YWlucyBhIHZhbHVlIHRoYXQgaXMgZ3JlYXRlciB0aGFuIGFueSBvdGhlciBub24tc2VudGluZWwKKyAgICogdmFsdWUgaW4gYWxsIHNlcXVlbmNlcy4KKyAgICoKKyAgICogRXhhbXBsZToKKyAgICoKKyAgICogPHByZT4KKyAgICogICBpbnQgc2VxdWVuY2VzWzEwXVsxMV07CisgICAqICAgZm9yIChpbnQgX19pID0gMDsgX19pIDwgMTA7ICsrX19pKQorICAgKiAgICAgZm9yIChpbnQgX19qID0gMDsgX19pIDwgMTE7ICsrX19qKQorICAgKiAgICAgICBzZXF1ZW5jZXNbX19pXVtfX2pdID0gX19qOyAvLyBfX2xhc3Qgb25lIGlzIHNlbnRpbmVsIQorICAgKgorICAgKiAgIGludCBfX291dFszM107CisgICAqICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCo+ID4gc2VxczsKKyAgICogICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCAxMDsgKytfX2kpCisgICAqICAgICB7IHNlcXMucHVzaChzdGQ6Om1ha2VfcGFpcjxpbnQqPihzZXF1ZW5jZXNbX19pXSwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlc1tfX2ldICsgMTApKSB9CisgICAqCisgICAqICAgbXVsdGl3YXlfbWVyZ2Uoc2Vxcy5iZWdpbigpLCBzZXFzLmVuZCgpLCBfX3RhcmdldCwgc3RkOjpsZXNzPGludD4oKSwgMzMpOworICAgKiA8L3ByZT4KKyAgICoKKyAgICogQHByZSBBbGwgaW5wdXQgc2VxdWVuY2VzIG11c3QgYmUgc29ydGVkLgorICAgKiBAcHJlIFRhcmdldCBtdXN0IHByb3ZpZGUgZW5vdWdoIHNwYWNlIHRvIG1lcmdlIG91dCBsZW5ndGggZWxlbWVudHMgb3IKKyAgICogICAgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbGwgc2VxdWVuY2VzLCB3aGljaGV2ZXIgaXMgc21hbGxlci4KKyAgICogQHByZSBGb3IgZWFjaCBAYyBfX2ksIEBjIF9fc2Vxc19iZWdpbltfX2ldLnNlY29uZCBtdXN0IGJlIHRoZSBlbmQKKyAgICogICAgbWFya2VyIG9mIHRoZSBzZXF1ZW5jZSwgYnV0IGFsc28gcmVmZXJlbmNlIHRoZSBvbmUgbW9yZSBfX3NlbnRpbmVsCisgICAqICAgIGVsZW1lbnQuCisgICAqCisgICAqIEBwb3N0IFtfX3RhcmdldCwgcmV0dXJuIF9fdmFsdWUpIGNvbnRhaW5zIG1lcmdlZCBfX2VsZW1lbnRzIGZyb20gdGhlCisgICAqICAgIGlucHV0IHNlcXVlbmNlcy4KKyAgICogQHBvc3QgcmV0dXJuIF9fdmFsdWUgLSBfX3RhcmdldCA9IG1pbihfX2xlbmd0aCwgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFsbAorICAgKiAgICBzZXF1ZW5jZXMpLgorICAgKgorICAgKiBAc2VlIHN0YWJsZV9tdWx0aXdheV9tZXJnZV9zZW50aW5lbHMKKyAgICoKKyAgICogQHRwYXJhbSBfUkFJdGVyUGFpckl0ZXJhdG9yIGl0ZXJhdG9yIG92ZXIgc2VxdWVuY2UKKyAgICogICAgb2YgcGFpcnMgb2YgaXRlcmF0b3JzCisgICAqIEB0cGFyYW0gX1JBSXRlck91dCBpdGVyYXRvciBvdmVyIHRhcmdldCBzZXF1ZW5jZQorICAgKiBAdHBhcmFtIF9EaWZmZXJlbmNlVHAgZGlmZmVyZW5jZSB0eXBlIGZvciB0aGUgc2VxdWVuY2UKKyAgICogQHRwYXJhbSBfQ29tcGFyZSBzdHJpY3Qgd2VhayBvcmRlcmluZyB0eXBlIHRvIGNvbXBhcmUgZWxlbWVudHMKKyAgICogICAgaW4gc2VxdWVuY2VzCisgICAqCisgICAqIEBwYXJhbSBfX3NlcXNfYmVnaW4gIF9fYmVnaW4gb2Ygc2VxdWVuY2UgX19zZXF1ZW5jZQorICAgKiBAcGFyYW0gX19zZXFzX2VuZCAgICBfTV9lbmQgb2Ygc2VxdWVuY2UgX19zZXF1ZW5jZQorICAgKiBAcGFyYW0gX190YXJnZXQgICAgICB0YXJnZXQgc2VxdWVuY2UgdG8gbWVyZ2UgdG8uCisgICAqIEBwYXJhbSBfX2NvbXAgICAgICAgIHN0cmljdCB3ZWFrIG9yZGVyaW5nIHRvIHVzZSBmb3IgZWxlbWVudCBjb21wYXJpc29uLgorICAgKiBAcGFyYW0gX19sZW5ndGggTWF4aW11bSBsZW5ndGggdG8gbWVyZ2UsIHBvc3NpYmx5IGxhcmdlciB0aGFuIHRoZQorICAgKiBudW1iZXIgb2YgZWxlbWVudHMgYXZhaWxhYmxlLgorICAgKgorICAgKiBAcmV0dXJuIF9NX2VuZCBpdGVyYXRvciBvZiBvdXRwdXQgc2VxdWVuY2UKKyAgICovCisgIC8vIG11bHRpd2F5X21lcmdlX3NlbnRpbmVscworICAvLyBwdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXJQYWlySXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1JBSXRlck91dCwKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXJPdXQKKyAgICBtdWx0aXdheV9tZXJnZV9zZW50aW5lbHMoX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisJCQkgICAgIF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2VuZCwKKwkJCSAgICAgX1JBSXRlck91dCBfX3RhcmdldCwKKwkJCSAgICAgX0RpZmZlcmVuY2VUcCBfX2xlbmd0aCwgX0NvbXBhcmUgX19jb21wLAorCQkJICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeworICAgICAgdHlwZWRlZiBfRGlmZmVyZW5jZVRwIF9EaWZmZXJlbmNlVHlwZTsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbikKKworICAgICAgLy8gY2F0Y2ggc3BlY2lhbCBjYXNlOiBubyBzZXF1ZW5jZXMKKyAgICAgIGlmIChfX3NlcXNfYmVnaW4gPT0gX19zZXFzX2VuZCkKKwlyZXR1cm4gX190YXJnZXQ7CisKKyAgICAgIC8vIEV4ZWN1dGUgbXVsdGl3YXkgbWVyZ2UgKnNlcXVlbnRpYWxseSouCisgICAgICByZXR1cm4gX19zZXF1ZW50aWFsX211bHRpd2F5X21lcmdlCisJPC8qIF9fc3RhYmxlID0gKi8gZmFsc2UsIC8qIF9fc2VudGluZWxzID0gKi8gdHJ1ZT4KKyAgICAgICAgICAoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLAorICAgICAgICAgICBfX3RhcmdldCwgKihfX3NlcXNfYmVnaW4tPnNlY29uZCksIF9fbGVuZ3RoLCBfX2NvbXApOworICAgIH0KKworICAvLyBwdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXJQYWlySXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1JBSXRlck91dCwKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXJPdXQKKyAgICBtdWx0aXdheV9tZXJnZV9zZW50aW5lbHMoX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisJCQkgICAgIF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2VuZCwKKwkJCSAgICAgX1JBSXRlck91dCBfX3RhcmdldCwKKwkJCSAgICAgX0RpZmZlcmVuY2VUcCBfX2xlbmd0aCwgX0NvbXBhcmUgX19jb21wLAorCQkJICAgICBfX2dudV9wYXJhbGxlbDo6ZXhhY3RfdGFnIF9fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgX0RpZmZlcmVuY2VUcCBfRGlmZmVyZW5jZVR5cGU7CisgICAgICBfR0xJQkNYWF9DQUxMKF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4pCisKKyAgICAgIC8vIGNhdGNoIHNwZWNpYWwgY2FzZTogbm8gc2VxdWVuY2VzCisgICAgICBpZiAoX19zZXFzX2JlZ2luID09IF9fc2Vxc19lbmQpCisJcmV0dXJuIF9fdGFyZ2V0OworCisgICAgICAvLyBFeGVjdXRlIG1lcmdlOyBtYXliZSBwYXJhbGxlbCwgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgbWVyZ2VkCisgICAgICAvLyBlbGVtZW50cyBhbmQgdGhlIG51bWJlciBvZiBzZXF1ZW5jZXMgYW5kIGdsb2JhbCB0aHJlc2hvbGRzIGluCisgICAgICAvLyBTZXR0aW5ncy4KKyAgICAgIGlmICgoX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbiA+IDEpCisJICAmJiBfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICAoKF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4pID49CisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLm11bHRpd2F5X21lcmdlX21pbmltYWxfaykKKyAgICAgICAgICAgICYmICgoX1NlcXVlbmNlSW5kZXgpX19sZW5ndGggPj0KKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkubXVsdGl3YXlfbWVyZ2VfbWluaW1hbF9uKSkpCisJcmV0dXJuIHBhcmFsbGVsX211bHRpd2F5X21lcmdlCisgICAgICAgICAgPC8qIF9fc3RhYmxlID0gKi8gZmFsc2UsIC8qIF9fc2VudGluZWxzID0gKi8gdHJ1ZT4KKwkgIChfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LAorCSAgIG11bHRpd2F5X21lcmdlX2V4YWN0X3NwbGl0dGluZzwvKiBfX3N0YWJsZSA9ICovIGZhbHNlLAorCSAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXJQYWlySXRlcmF0b3I+CisJICAgOjp2YWx1ZV90eXBlKiwgX0NvbXBhcmUsIF9EaWZmZXJlbmNlVHA+LAorCSAgIHN0YXRpY19jYXN0PF9EaWZmZXJlbmNlVHlwZT4oX19sZW5ndGgpLCBfX2NvbXAsCisJICAgX190YWcuX19nZXRfbnVtX3RocmVhZHMoKSk7CisgICAgICBlbHNlCisJcmV0dXJuIF9fc2VxdWVudGlhbF9tdWx0aXdheV9tZXJnZQorICAgICAgICAgIDwvKiBfX3N0YWJsZSA9ICovIGZhbHNlLCAvKiBfX3NlbnRpbmVscyA9ICovIHRydWU+CisJICAoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwKKwkgICAqKF9fc2Vxc19iZWdpbi0+c2Vjb25kKSwgX19sZW5ndGgsIF9fY29tcCk7CisgICAgfQorCisgIC8vIHB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlclBhaXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyT3V0LAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlck91dAorICAgIG11bHRpd2F5X21lcmdlX3NlbnRpbmVscyhfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJCSAgICAgX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkJICAgICBfUkFJdGVyT3V0IF9fdGFyZ2V0LAorCQkJICAgICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXAsCisJCQkgICAgIHNhbXBsaW5nX3RhZyBfX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIF9EaWZmZXJlbmNlVHAgX0RpZmZlcmVuY2VUeXBlOworICAgICAgX0dMSUJDWFhfQ0FMTChfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luKQorCisgICAgICAvLyBjYXRjaCBzcGVjaWFsIGNhc2U6IG5vIHNlcXVlbmNlcworICAgICAgaWYgKF9fc2Vxc19iZWdpbiA9PSBfX3NlcXNfZW5kKQorCXJldHVybiBfX3RhcmdldDsKKworICAgICAgLy8gRXhlY3V0ZSBtZXJnZTsgbWF5YmUgcGFyYWxsZWwsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIG1lcmdlZAorICAgICAgLy8gZWxlbWVudHMgYW5kIHRoZSBudW1iZXIgb2Ygc2VxdWVuY2VzIGFuZCBnbG9iYWwgdGhyZXNob2xkcyBpbgorICAgICAgLy8gU2V0dGluZ3MuCisgICAgICBpZiAoKF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4gPiAxKQorCSAgJiYgX0dMSUJDWFhfUEFSQUxMRUxfQ09ORElUSU9OKAorICAgICAgICAgICAgKChfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luKSA+PQorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5tdWx0aXdheV9tZXJnZV9taW5pbWFsX2spCisgICAgICAgICAgICAmJiAoKF9TZXF1ZW5jZUluZGV4KV9fbGVuZ3RoID49CisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLm11bHRpd2F5X21lcmdlX21pbmltYWxfbikpKQorCXJldHVybiBwYXJhbGxlbF9tdWx0aXdheV9tZXJnZQorICAgICAgICAgIDwvKiBfX3N0YWJsZSA9ICovIGZhbHNlLCAvKiBfX3NlbnRpbmVscyA9ICovIHRydWU+CisJICAoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwKKwkgICBtdWx0aXdheV9tZXJnZV9zYW1wbGluZ19zcGxpdHRpbmc8LyogX19zdGFibGUgPSAqLyBmYWxzZSwKKwkgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyUGFpckl0ZXJhdG9yPgorCSAgIDo6dmFsdWVfdHlwZSosIF9Db21wYXJlLCBfRGlmZmVyZW5jZVRwPiwKKwkgICBzdGF0aWNfY2FzdDxfRGlmZmVyZW5jZVR5cGU+KF9fbGVuZ3RoKSwgX19jb21wLAorCSAgIF9fdGFnLl9fZ2V0X251bV90aHJlYWRzKCkpOworICAgICAgZWxzZQorCXJldHVybiBfX3NlcXVlbnRpYWxfbXVsdGl3YXlfbWVyZ2UKKyAgICAgICAgICA8LyogX19zdGFibGUgPSAqL2ZhbHNlLCAvKiBfX3NlbnRpbmVscyA9ICovIHRydWU+KAorICAgICAgICAgICAgX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwKKwkgICAgKihfX3NlcXNfYmVnaW4tPnNlY29uZCksIF9fbGVuZ3RoLCBfX2NvbXApOworICAgIH0KKworICAvLyBwdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXJQYWlySXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1JBSXRlck91dCwKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXJPdXQKKyAgICBtdWx0aXdheV9tZXJnZV9zZW50aW5lbHMoX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisJCQkgICAgIF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2VuZCwKKwkJCSAgICAgX1JBSXRlck91dCBfX3RhcmdldCwKKwkJCSAgICAgX0RpZmZlcmVuY2VUcCBfX2xlbmd0aCwgX0NvbXBhcmUgX19jb21wLAorCQkJICAgICBwYXJhbGxlbF90YWcgX190YWcgPSBwYXJhbGxlbF90YWcoMCkpCisgICAgeworICAgICAgcmV0dXJuIG11bHRpd2F5X21lcmdlX3NlbnRpbmVscworCShfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LCBfX2xlbmd0aCwgX19jb21wLAorCSBleGFjdF90YWcoX190YWcuX19nZXRfbnVtX3RocmVhZHMoKSkpOworICAgIH0KKworICAvLyBwdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXJQYWlySXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1JBSXRlck91dCwKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXJPdXQKKyAgICBtdWx0aXdheV9tZXJnZV9zZW50aW5lbHMoX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisJCQkgICAgIF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2VuZCwKKwkJCSAgICAgX1JBSXRlck91dCBfX3RhcmdldCwKKwkJCSAgICAgX0RpZmZlcmVuY2VUcCBfX2xlbmd0aCwgX0NvbXBhcmUgX19jb21wLAorCQkJICAgICBkZWZhdWx0X3BhcmFsbGVsX3RhZyBfX3RhZykKKyAgICB7CisgICAgICByZXR1cm4gbXVsdGl3YXlfbWVyZ2Vfc2VudGluZWxzCisJKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsIF9fbGVuZ3RoLCBfX2NvbXAsCisJIGV4YWN0X3RhZyhfX3RhZy5fX2dldF9udW1fdGhyZWFkcygpKSk7CisgICAgfQorCisgIC8vIHN0YWJsZV9tdWx0aXdheV9tZXJnZV9zZW50aW5lbHMKKyAgLy8gcHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyUGFpckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXJPdXQsCisJICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyT3V0CisgICAgc3RhYmxlX211bHRpd2F5X21lcmdlX3NlbnRpbmVscyhfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJCQkgICAgX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkJCSAgICBfUkFJdGVyT3V0IF9fdGFyZ2V0LAorCQkJCSAgICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXAsCisJCQkJICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIF9EaWZmZXJlbmNlVHAgX0RpZmZlcmVuY2VUeXBlOworICAgICAgX0dMSUJDWFhfQ0FMTChfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luKQorCisgICAgICAvLyBjYXRjaCBzcGVjaWFsIGNhc2U6IG5vIHNlcXVlbmNlcworICAgICAgaWYgKF9fc2Vxc19iZWdpbiA9PSBfX3NlcXNfZW5kKQorCXJldHVybiBfX3RhcmdldDsKKworICAgICAgLy8gRXhlY3V0ZSBtdWx0aXdheSBtZXJnZSAqc2VxdWVudGlhbGx5Ki4KKyAgICAgIHJldHVybiBfX3NlcXVlbnRpYWxfbXVsdGl3YXlfbWVyZ2UKKwk8LyogX19zdGFibGUgPSAqLyB0cnVlLCAvKiBfX3NlbnRpbmVscyA9ICovIHRydWU+CisJKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsCisJICooX19zZXFzX2JlZ2luLT5zZWNvbmQpLCBfX2xlbmd0aCwgX19jb21wKTsKKyAgICB9CisKKyAgLy8gcHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyUGFpckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXJPdXQsCisJICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyT3V0CisgICAgc3RhYmxlX211bHRpd2F5X21lcmdlX3NlbnRpbmVscyhfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJCQkgICAgX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkJCSAgICBfUkFJdGVyT3V0IF9fdGFyZ2V0LAorCQkJCSAgICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXAsCisJCQkJICAgIF9fZ251X3BhcmFsbGVsOjpleGFjdF90YWcgX190YWcpCisgICAgeworICAgICAgdHlwZWRlZiBfRGlmZmVyZW5jZVRwIF9EaWZmZXJlbmNlVHlwZTsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbikKKworICAgICAgLy8gY2F0Y2ggc3BlY2lhbCBjYXNlOiBubyBzZXF1ZW5jZXMKKyAgICAgIGlmIChfX3NlcXNfYmVnaW4gPT0gX19zZXFzX2VuZCkKKwlyZXR1cm4gX190YXJnZXQ7CisKKyAgICAgIC8vIEV4ZWN1dGUgbWVyZ2U7IG1heWJlIHBhcmFsbGVsLCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBtZXJnZWQKKyAgICAgIC8vIGVsZW1lbnRzIGFuZCB0aGUgbnVtYmVyIG9mIHNlcXVlbmNlcyBhbmQgZ2xvYmFsIHRocmVzaG9sZHMgaW4KKyAgICAgIC8vIFNldHRpbmdzLgorICAgICAgaWYgKChfX3NlcXNfZW5kIC0gX19zZXFzX2JlZ2luID4gMSkKKwkgICYmIF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgICgoX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbikgPj0KKyAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLm11bHRpd2F5X21lcmdlX21pbmltYWxfaykKKyAgICAgICAgICAgICYmICgoX1NlcXVlbmNlSW5kZXgpX19sZW5ndGggPj0KKyAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLm11bHRpd2F5X21lcmdlX21pbmltYWxfbikpKQorCXJldHVybiBwYXJhbGxlbF9tdWx0aXdheV9tZXJnZQorICAgICAgICAgIDwvKiBfX3N0YWJsZSA9ICovIHRydWUsIC8qIF9fc2VudGluZWxzID0gKi8gdHJ1ZT4KKwkgIChfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LAorCSAgIG11bHRpd2F5X21lcmdlX2V4YWN0X3NwbGl0dGluZzwvKiBfX3N0YWJsZSA9ICovIHRydWUsCisJICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlclBhaXJJdGVyYXRvcj4KKwkgICA6OnZhbHVlX3R5cGUqLCBfQ29tcGFyZSwgX0RpZmZlcmVuY2VUcD4sCisJICAgc3RhdGljX2Nhc3Q8X0RpZmZlcmVuY2VUeXBlPihfX2xlbmd0aCksIF9fY29tcCwKKwkgICBfX3RhZy5fX2dldF9udW1fdGhyZWFkcygpKTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gX19zZXF1ZW50aWFsX211bHRpd2F5X21lcmdlCisgICAgICAgICAgPC8qIF9fc3RhYmxlID0gKi8gdHJ1ZSwgLyogX19zZW50aW5lbHMgPSAqLyB0cnVlPgorCSAgKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsCisJICAgKihfX3NlcXNfYmVnaW4tPnNlY29uZCksIF9fbGVuZ3RoLCBfX2NvbXApOworICAgIH0KKworICAvLyBwdWJsaWMgaW50ZXJmYWNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXJQYWlySXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1JBSXRlck91dCwKKwkgICB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9SQUl0ZXJPdXQKKyAgICBzdGFibGVfbXVsdGl3YXlfbWVyZ2Vfc2VudGluZWxzKF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2JlZ2luLAorCQkJCSAgICBfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19lbmQsCisJCQkJICAgIF9SQUl0ZXJPdXQgX190YXJnZXQsCisJCQkJICAgIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsCisJCQkJICAgIF9Db21wYXJlIF9fY29tcCwKKwkJCQkgICAgc2FtcGxpbmdfdGFnIF9fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgX0RpZmZlcmVuY2VUcCBfRGlmZmVyZW5jZVR5cGU7CisgICAgICBfR0xJQkNYWF9DQUxMKF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4pCisKKyAgICAgIC8vIGNhdGNoIHNwZWNpYWwgY2FzZTogbm8gc2VxdWVuY2VzCisgICAgICBpZiAoX19zZXFzX2JlZ2luID09IF9fc2Vxc19lbmQpCisJcmV0dXJuIF9fdGFyZ2V0OworCisgICAgICAvLyBFeGVjdXRlIG1lcmdlOyBtYXliZSBwYXJhbGxlbCwgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgbWVyZ2VkCisgICAgICAvLyBlbGVtZW50cyBhbmQgdGhlIG51bWJlciBvZiBzZXF1ZW5jZXMgYW5kIGdsb2JhbCB0aHJlc2hvbGRzIGluCisgICAgICAvLyBTZXR0aW5ncy4KKyAgICAgIGlmICgoX19zZXFzX2VuZCAtIF9fc2Vxc19iZWdpbiA+IDEpCisJICAmJiBfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICAoKF9fc2Vxc19lbmQgLSBfX3NlcXNfYmVnaW4pID49CisgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLm11bHRpd2F5X21lcmdlX21pbmltYWxfaykKKyAgICAgICAgICAgICYmICgoX1NlcXVlbmNlSW5kZXgpX19sZW5ndGggPj0KKyAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkubXVsdGl3YXlfbWVyZ2VfbWluaW1hbF9uKSkpCisJcmV0dXJuIHBhcmFsbGVsX211bHRpd2F5X21lcmdlCisgICAgICAgICAgPC8qIF9fc3RhYmxlID0gKi8gdHJ1ZSwgLyogX19zZW50aW5lbHMgPSAqLyB0cnVlPgorCSAgKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsCisJICAgbXVsdGl3YXlfbWVyZ2Vfc2FtcGxpbmdfc3BsaXR0aW5nPC8qIF9fc3RhYmxlID0gKi8gdHJ1ZSwKKwkgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyUGFpckl0ZXJhdG9yPgorCSAgIDo6dmFsdWVfdHlwZSosIF9Db21wYXJlLCBfRGlmZmVyZW5jZVRwPiwKKwkgICBzdGF0aWNfY2FzdDxfRGlmZmVyZW5jZVR5cGU+KF9fbGVuZ3RoKSwgX19jb21wLAorCSAgIF9fdGFnLl9fZ2V0X251bV90aHJlYWRzKCkpOworICAgICAgZWxzZQorCXJldHVybiBfX3NlcXVlbnRpYWxfbXVsdGl3YXlfbWVyZ2UKKyAgICAgICAgICA8LyogX19zdGFibGUgPSAqLyB0cnVlLCAvKiBfX3NlbnRpbmVscyA9ICovIHRydWU+CisJICAoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwKKwkgICAqKF9fc2Vxc19iZWdpbi0+c2Vjb25kKSwgX19sZW5ndGgsIF9fY29tcCk7CisgICAgfQorCisgIC8vIHB1YmxpYyBpbnRlcmZhY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlclBhaXJJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUkFJdGVyT3V0LAorCSAgIHR5cGVuYW1lIF9EaWZmZXJlbmNlVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlck91dAorICAgIHN0YWJsZV9tdWx0aXdheV9tZXJnZV9zZW50aW5lbHMoX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfYmVnaW4sCisJCQkJICAgIF9SQUl0ZXJQYWlySXRlcmF0b3IgX19zZXFzX2VuZCwKKwkJCQkgICAgX1JBSXRlck91dCBfX3RhcmdldCwKKwkJCQkgICAgX0RpZmZlcmVuY2VUcCBfX2xlbmd0aCwKKwkJCQkgICAgX0NvbXBhcmUgX19jb21wLAorCQkJCSAgICBwYXJhbGxlbF90YWcgX190YWcgPSBwYXJhbGxlbF90YWcoMCkpCisgICAgeworICAgICAgcmV0dXJuIHN0YWJsZV9tdWx0aXdheV9tZXJnZV9zZW50aW5lbHMKKwkoX19zZXFzX2JlZ2luLCBfX3NlcXNfZW5kLCBfX3RhcmdldCwgX19sZW5ndGgsIF9fY29tcCwKKwkgZXhhY3RfdGFnKF9fdGFnLl9fZ2V0X251bV90aHJlYWRzKCkpKTsKKyAgICB9CisKKyAgLy8gcHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyUGFpckl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9SQUl0ZXJPdXQsCisJICAgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyT3V0CisgICAgc3RhYmxlX211bHRpd2F5X21lcmdlX3NlbnRpbmVscyhfUkFJdGVyUGFpckl0ZXJhdG9yIF9fc2Vxc19iZWdpbiwKKwkJCQkgICAgX1JBSXRlclBhaXJJdGVyYXRvciBfX3NlcXNfZW5kLAorCQkJCSAgICBfUkFJdGVyT3V0IF9fdGFyZ2V0LAorCQkJCSAgICBfRGlmZmVyZW5jZVRwIF9fbGVuZ3RoLCBfQ29tcGFyZSBfX2NvbXAsCisJCQkJICAgIGRlZmF1bHRfcGFyYWxsZWxfdGFnIF9fdGFnKQorICAgIHsKKyAgICAgIHJldHVybiBzdGFibGVfbXVsdGl3YXlfbWVyZ2Vfc2VudGluZWxzCisJKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsIF9fbGVuZ3RoLCBfX2NvbXAsCisJIGV4YWN0X3RhZyhfX3RhZy5fX2dldF9udW1fdGhyZWFkcygpKSk7CisgICAgfQorfTsgLy8gbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9NVUxUSVdBWV9NRVJHRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL211bHRpd2F5X21lcmdlc29ydC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9tdWx0aXdheV9tZXJnZXNvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODVjZWMyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9tdWx0aXdheV9tZXJnZXNvcnQuaApAQCAtMCwwICsxLDQ4MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL211bHRpd2F5X21lcmdlc29ydC5oCisgKiAgQGJyaWVmIFBhcmFsbGVsIG11bHRpd2F5IG1lcmdlIHNvcnQuCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBKb2hhbm5lcyBTaW5nbGVyLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX01VTFRJV0FZX01FUkdFU09SVF9ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX01VTFRJV0FZX01FUkdFU09SVF9IIDEKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHBhcmFsbGVsL2Jhc2ljX2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnby5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3BhcmFsbGVsLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvbXVsdGl3YXlfbWVyZ2UuaD4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKiBAYnJpZWYgU3Vic2VxdWVuY2UgZGVzY3JpcHRpb24uICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9EaWZmZXJlbmNlVHA+CisgICAgc3RydWN0IF9QaWVjZQorICAgIHsKKyAgICAgIHR5cGVkZWYgX0RpZmZlcmVuY2VUcCBfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIC8qKiBAYnJpZWYgQmVnaW4gb2Ygc3Vic2VxdWVuY2UuICovCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX01fYmVnaW47CisKKyAgICAgIC8qKiBAYnJpZWYgRW5kIG9mIHN1YnNlcXVlbmNlLiAqLworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9NX2VuZDsKKyAgICB9OworCisgIC8qKiBAYnJpZWYgRGF0YSBhY2Nlc3NlZCBieSBhbGwgdGhyZWFkcy4KKyAgICoKKyAgICogIFBNV01TID0gcGFyYWxsZWwgbXVsdGl3YXkgbWVyZ2Vzb3J0ICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgc3RydWN0IF9QTVdNU1NvcnRpbmdEYXRhCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIC8qKiBAYnJpZWYgTnVtYmVyIG9mIHRocmVhZHMgaW52b2x2ZWQuICovCisgICAgICBfVGhyZWFkSW5kZXggX01fbnVtX3RocmVhZHM7CisKKyAgICAgIC8qKiBAYnJpZWYgSW5wdXQgX19iZWdpbi4gKi8KKyAgICAgIF9SQUl0ZXIgX01fc291cmNlOworCisgICAgICAvKiogQGJyaWVmIFN0YXJ0IGluZGljZXMsIHBlciB0aHJlYWQuICovCisgICAgICBfRGlmZmVyZW5jZVR5cGUqIF9NX3N0YXJ0czsKKworICAgICAgLyoqIEBicmllZiBTdG9yYWdlIGluIHdoaWNoIHRvIHNvcnQuICovCisgICAgICBfVmFsdWVUeXBlKiogX01fdGVtcG9yYXJ5OworCisgICAgICAvKiogQGJyaWVmIFNhbXBsZXMuICovCisgICAgICBfVmFsdWVUeXBlKiBfTV9zYW1wbGVzOworCisgICAgICAvKiogQGJyaWVmIE9mZnNldHMgdG8gYWRkIHRvIHRoZSBmb3VuZCBwb3NpdGlvbnMuICovCisgICAgICBfRGlmZmVyZW5jZVR5cGUqIF9NX29mZnNldHM7CisKKyAgICAgIC8qKiBAYnJpZWYgUGllY2VzIG9mIGRhdGEgdG8gbWVyZ2UgQGMgW3RocmVhZF1bX19zZXF1ZW5jZV0gKi8KKyAgICAgIHN0ZDo6dmVjdG9yPF9QaWVjZTxfRGlmZmVyZW5jZVR5cGU+ID4qIF9NX3BpZWNlczsKKyAgfTsKKworICAvKioKKyAgICogIEBicmllZiBTZWxlY3QgX01fc2FtcGxlcyBmcm9tIGEgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19zZCBQb2ludGVyIHRvIGFsZ29yaXRobSBkYXRhLiBfUmVzdWx0IHdpbGwgYmUgcGxhY2VkIGluCisgICAqICBAYyBfX3NkLT5fTV9zYW1wbGVzLgorICAgKiAgQHBhcmFtIF9fbnVtX3NhbXBsZXMgTnVtYmVyIG9mIF9NX3NhbXBsZXMgdG8gc2VsZWN0LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0RpZmZlcmVuY2VUcD4KKyAgICB2b2lkCisgICAgX19kZXRlcm1pbmVfc2FtcGxlcyhfUE1XTVNTb3J0aW5nRGF0YTxfUkFJdGVyPiogX19zZCwKKwkJCV9EaWZmZXJlbmNlVHAgX19udW1fc2FtcGxlcykKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiBfRGlmZmVyZW5jZVRwIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgX1RocmVhZEluZGV4IF9faWFtID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSogX19lcyA9IG5ldyBfRGlmZmVyZW5jZVR5cGVbX19udW1fc2FtcGxlcyArIDJdOworCisgICAgICBfX2VxdWFsbHlfc3BsaXQoX19zZC0+X01fc3RhcnRzW19faWFtICsgMV0gLSBfX3NkLT5fTV9zdGFydHNbX19pYW1dLCAKKwkJICAgICAgX19udW1fc2FtcGxlcyArIDEsIF9fZXMpOworCisgICAgICBmb3IgKF9EaWZmZXJlbmNlVHlwZSBfX2kgPSAwOyBfX2kgPCBfX251bV9zYW1wbGVzOyArK19faSkKKwk6Om5ldygmKF9fc2QtPl9NX3NhbXBsZXNbX19pYW0gKiBfX251bV9zYW1wbGVzICsgX19pXSkpCisJICAgIF9WYWx1ZVR5cGUoX19zZC0+X01fc291cmNlW19fc2QtPl9NX3N0YXJ0c1tfX2lhbV0KKwkJCQkgICAgICAgKyBfX2VzW19faSArIDFdXSk7CisKKyAgICAgIGRlbGV0ZVtdIF9fZXM7CisgICAgfQorCisgIC8qKiBAYnJpZWYgU3BsaXQgY29uc2lzdGVudGx5LiAqLworICB0ZW1wbGF0ZTxib29sIF9fZXhhY3QsIHR5cGVuYW1lIF9SQUl0ZXIsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9Tb3J0aW5nUGxhY2VzSXRlcmF0b3I+CisgICAgc3RydWN0IF9TcGxpdENvbnNpc3RlbnRseQorICAgIHsgfTsKKworICAvKiogQGJyaWVmIFNwbGl0IGJ5IGV4YWN0IHNwbGl0dGluZy4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmUsCisJICAgdHlwZW5hbWUgX1NvcnRpbmdQbGFjZXNJdGVyYXRvcj4KKyAgICBzdHJ1Y3QgX1NwbGl0Q29uc2lzdGVudGx5PHRydWUsIF9SQUl0ZXIsIF9Db21wYXJlLCBfU29ydGluZ1BsYWNlc0l0ZXJhdG9yPgorICAgIHsKKyAgICAgIHZvaWQKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RocmVhZEluZGV4IF9faWFtLAorCQkgX1BNV01TU29ydGluZ0RhdGE8X1JBSXRlcj4qIF9fc2QsCisJCSBfQ29tcGFyZSYgX19jb21wLAorCQkgY29uc3QgdHlwZW5hbWUKKwkJIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKwkJIF9fbnVtX3NhbXBsZXMpIGNvbnN0CisgICAgICB7CisjICAgICAgIHByYWdtYSBvbXAgYmFycmllcgorCisJc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPF9Tb3J0aW5nUGxhY2VzSXRlcmF0b3IsCisJICAgICAgICAgICAgICAgICAgICAgIF9Tb3J0aW5nUGxhY2VzSXRlcmF0b3I+ID4KKwkgIF9fc2VxcyhfX3NkLT5fTV9udW1fdGhyZWFkcyk7CisJZm9yIChfVGhyZWFkSW5kZXggX19zID0gMDsgX19zIDwgX19zZC0+X01fbnVtX3RocmVhZHM7IF9fcysrKQorCSAgX19zZXFzW19fc10gPSBzdGQ6Om1ha2VfcGFpcihfX3NkLT5fTV90ZW1wb3JhcnlbX19zXSwKKwkJCQkgICAgICAgX19zZC0+X01fdGVtcG9yYXJ5W19fc10KKwkJCQkgICAgICAgKyAoX19zZC0+X01fc3RhcnRzW19fcyArIDFdCisJCQkJCSAgLSBfX3NkLT5fTV9zdGFydHNbX19zXSkpOworCisJc3RkOjp2ZWN0b3I8X1NvcnRpbmdQbGFjZXNJdGVyYXRvcj4gX19vZmZzZXRzKF9fc2QtPl9NX251bV90aHJlYWRzKTsKKworCS8vIGlmIG5vdCBsYXN0IHRocmVhZAorCWlmIChfX2lhbSA8IF9fc2QtPl9NX251bV90aHJlYWRzIC0gMSkKKwkgIG11bHRpc2VxX3BhcnRpdGlvbihfX3NlcXMuYmVnaW4oKSwgX19zZXFzLmVuZCgpLAorCQkJICAgICBfX3NkLT5fTV9zdGFydHNbX19pYW0gKyAxXSwgX19vZmZzZXRzLmJlZ2luKCksCisJCQkgICAgIF9fY29tcCk7CisKKwlmb3IgKF9UaHJlYWRJbmRleCBfX3NlcSA9IDA7IF9fc2VxIDwgX19zZC0+X01fbnVtX3RocmVhZHM7IF9fc2VxKyspCisJICB7CisJICAgIC8vIGZvciBlYWNoIHNlcXVlbmNlCisJICAgIGlmIChfX2lhbSA8IChfX3NkLT5fTV9udW1fdGhyZWFkcyAtIDEpKQorCSAgICAgIF9fc2QtPl9NX3BpZWNlc1tfX2lhbV1bX19zZXFdLl9NX2VuZAorCQk9IF9fb2Zmc2V0c1tfX3NlcV0gLSBfX3NlcXNbX19zZXFdLmZpcnN0OworCSAgICBlbHNlCisJICAgICAgLy8gdmVyeSBlbmQgb2YgdGhpcyBzZXF1ZW5jZQorCSAgICAgIF9fc2QtPl9NX3BpZWNlc1tfX2lhbV1bX19zZXFdLl9NX2VuZCA9CisJCV9fc2QtPl9NX3N0YXJ0c1tfX3NlcSArIDFdIC0gX19zZC0+X01fc3RhcnRzW19fc2VxXTsKKwkgIH0KKworIyAgICAgICBwcmFnbWEgb21wIGJhcnJpZXIKKworCWZvciAoX1RocmVhZEluZGV4IF9fc2VxID0gMDsgX19zZXEgPCBfX3NkLT5fTV9udW1fdGhyZWFkczsgX19zZXErKykKKwkgIHsKKwkgICAgLy8gRm9yIGVhY2ggc2VxdWVuY2UuCisJICAgIGlmIChfX2lhbSA+IDApCisJICAgICAgX19zZC0+X01fcGllY2VzW19faWFtXVtfX3NlcV0uX01fYmVnaW4gPQorCQlfX3NkLT5fTV9waWVjZXNbX19pYW0gLSAxXVtfX3NlcV0uX01fZW5kOworCSAgICBlbHNlCisJICAgICAgLy8gQWJzb2x1dGUgYmVnaW5uaW5nLgorCSAgICAgIF9fc2QtPl9NX3BpZWNlc1tfX2lhbV1bX19zZXFdLl9NX2JlZ2luID0gMDsKKwkgIH0KKyAgICAgIH0KKyAgfTsKKworICAvKiogQGJyaWVmIFNwbGl0IGJ5IHNhbXBsaW5nLiAqLyAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmUsCisJICAgdHlwZW5hbWUgX1NvcnRpbmdQbGFjZXNJdGVyYXRvcj4KKyAgICBzdHJ1Y3QgX1NwbGl0Q29uc2lzdGVudGx5PGZhbHNlLCBfUkFJdGVyLCBfQ29tcGFyZSwgX1NvcnRpbmdQbGFjZXNJdGVyYXRvcj4KKyAgICB7CisgICAgICB2b2lkCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UaHJlYWRJbmRleCBfX2lhbSwKKwkJIF9QTVdNU1NvcnRpbmdEYXRhPF9SQUl0ZXI+KiBfX3NkLAorCQkgX0NvbXBhcmUmIF9fY29tcCwKKwkJIGNvbnN0IHR5cGVuYW1lCisJCSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisJCSBfX251bV9zYW1wbGVzKSBjb25zdAorICAgICAgeworCXR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworCXR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisKKwlfX2RldGVybWluZV9zYW1wbGVzKF9fc2QsIF9fbnVtX3NhbXBsZXMpOworCisjICAgICAgIHByYWdtYSBvbXAgYmFycmllcgorCisjICAgICAgIHByYWdtYSBvbXAgc2luZ2xlCisJX19nbnVfc2VxdWVudGlhbDo6c29ydChfX3NkLT5fTV9zYW1wbGVzLAorCQkJICAgICAgIF9fc2QtPl9NX3NhbXBsZXMKKwkJCSAgICAgICArIChfX251bV9zYW1wbGVzICogX19zZC0+X01fbnVtX3RocmVhZHMpLAorCQkJICAgICAgIF9fY29tcCk7CisKKyMgICAgICAgcHJhZ21hIG9tcCBiYXJyaWVyCisKKwlmb3IgKF9UaHJlYWRJbmRleCBfX3MgPSAwOyBfX3MgPCBfX3NkLT5fTV9udW1fdGhyZWFkczsgKytfX3MpCisJICB7CisJICAgIC8vIEZvciBlYWNoIHNlcXVlbmNlLgorCSAgICBpZiAoX19udW1fc2FtcGxlcyAqIF9faWFtID4gMCkKKwkgICAgICBfX3NkLT5fTV9waWVjZXNbX19pYW1dW19fc10uX01fYmVnaW4gPQorICAgICAgICAgICAgICAgIHN0ZDo6bG93ZXJfYm91bmQoX19zZC0+X01fdGVtcG9yYXJ5W19fc10sCisJCQkJIF9fc2QtPl9NX3RlbXBvcmFyeVtfX3NdCisJCQkJICsgKF9fc2QtPl9NX3N0YXJ0c1tfX3MgKyAxXQorCQkJCSAgICAtIF9fc2QtPl9NX3N0YXJ0c1tfX3NdKSwKKwkJCQkgX19zZC0+X01fc2FtcGxlc1tfX251bV9zYW1wbGVzICogX19pYW1dLAorCQkJCSBfX2NvbXApCisgICAgICAgICAgICAgICAgLSBfX3NkLT5fTV90ZW1wb3JhcnlbX19zXTsKKwkgICAgZWxzZQorCSAgICAgIC8vIEFic29sdXRlIGJlZ2lubmluZy4KKwkgICAgICBfX3NkLT5fTV9waWVjZXNbX19pYW1dW19fc10uX01fYmVnaW4gPSAwOworCisJICAgIGlmICgoX19udW1fc2FtcGxlcyAqIChfX2lhbSArIDEpKSA8CisJCShfX251bV9zYW1wbGVzICogX19zZC0+X01fbnVtX3RocmVhZHMpKQorCSAgICAgIF9fc2QtPl9NX3BpZWNlc1tfX2lhbV1bX19zXS5fTV9lbmQgPQorICAgICAgICAgICAgICAgIHN0ZDo6bG93ZXJfYm91bmQoX19zZC0+X01fdGVtcG9yYXJ5W19fc10sCisJCQkJIF9fc2QtPl9NX3RlbXBvcmFyeVtfX3NdCisJCQkJICsgKF9fc2QtPl9NX3N0YXJ0c1tfX3MgKyAxXQorCQkJCSAgICAtIF9fc2QtPl9NX3N0YXJ0c1tfX3NdKSwKKwkJCQkgX19zZC0+X01fc2FtcGxlc1tfX251bV9zYW1wbGVzICogKF9faWFtICsgMSldLAorCQkJCSBfX2NvbXApCisgICAgICAgICAgICAgICAgLSBfX3NkLT5fTV90ZW1wb3JhcnlbX19zXTsKKwkgICAgZWxzZQorCSAgICAgIC8vIEFic29sdXRlIGVuZC4KKwkgICAgICBfX3NkLT5fTV9waWVjZXNbX19pYW1dW19fc10uX01fZW5kID0gKF9fc2QtPl9NX3N0YXJ0c1tfX3MgKyAxXQorCQkJCQkJICAgIC0gX19zZC0+X01fc3RhcnRzW19fc10pOworCSAgfQorICAgICAgfQorICB9OworICAKKyAgdGVtcGxhdGU8Ym9vbCBfX3N0YWJsZSwgdHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgc3RydWN0IF9fcG9zc2libHlfc3RhYmxlX3NvcnQKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgc3RydWN0IF9fcG9zc2libHlfc3RhYmxlX3NvcnQ8dHJ1ZSwgX1JBSXRlciwgX0NvbXBhcmU+CisgICAgeworICAgICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IF9SQUl0ZXImIF9fYmVnaW4sCisJCSAgICAgIGNvbnN0IF9SQUl0ZXImIF9fZW5kLCBfQ29tcGFyZSYgX19jb21wKSBjb25zdAorICAgICAgeyBfX2dudV9zZXF1ZW50aWFsOjpzdGFibGVfc29ydChfX2JlZ2luLCBfX2VuZCwgX19jb21wKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgc3RydWN0IF9fcG9zc2libHlfc3RhYmxlX3NvcnQ8ZmFsc2UsIF9SQUl0ZXIsIF9Db21wYXJlPgorICAgIHsKKyAgICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBfUkFJdGVyIF9fYmVnaW4sCisJCSAgICAgIGNvbnN0IF9SQUl0ZXIgX19lbmQsIF9Db21wYXJlJiBfX2NvbXApIGNvbnN0CisgICAgICB7IF9fZ251X3NlcXVlbnRpYWw6OnNvcnQoX19iZWdpbiwgX19lbmQsIF9fY29tcCk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGJvb2wgX19zdGFibGUsIHR5cGVuYW1lIFNlcV9SQUl0ZXIsCisJICAgdHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmUsCisJICAgdHlwZW5hbWUgRGlmZlR5cGU+CisgICAgc3RydWN0IF9fcG9zc2libHlfc3RhYmxlX211bHRpd2F5X21lcmdlCisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFNlcV9SQUl0ZXIsIHR5cGVuYW1lIF9SQUl0ZXIsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9EaWZmVHlwZT4KKyAgICBzdHJ1Y3QgX19wb3NzaWJseV9zdGFibGVfbXVsdGl3YXlfbWVyZ2U8dHJ1ZSwgU2VxX1JBSXRlciwKKwkJCQkJICAgIF9SQUl0ZXIsIF9Db21wYXJlLCBfRGlmZlR5cGU+CisgICAgeworICAgICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFNlcV9SQUl0ZXImIF9fc2Vxc19iZWdpbiwKKwkJICAgICAgY29uc3QgU2VxX1JBSXRlciYgX19zZXFzX2VuZCwKKwkJICAgICAgY29uc3QgX1JBSXRlciYgX190YXJnZXQsCisJCSAgICAgIF9Db21wYXJlJiBfX2NvbXAsCisJCSAgICAgIF9EaWZmVHlwZSBfX2xlbmd0aF9hbSkgY29uc3QKKyAgICAgIHsgc3RhYmxlX211bHRpd2F5X21lcmdlKF9fc2Vxc19iZWdpbiwgX19zZXFzX2VuZCwgX190YXJnZXQsCisJCQkgICAgICBfX2xlbmd0aF9hbSwgX19jb21wLCBzZXF1ZW50aWFsX3RhZygpKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgU2VxX1JBSXRlciwgdHlwZW5hbWUgX1JBSXRlciwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0RpZmZUeXBlPgorICAgIHN0cnVjdCBfX3Bvc3NpYmx5X3N0YWJsZV9tdWx0aXdheV9tZXJnZTxmYWxzZSwgU2VxX1JBSXRlciwKKwkJCQkJICAgIF9SQUl0ZXIsIF9Db21wYXJlLCBfRGlmZlR5cGU+CisgICAgeworICAgICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFNlcV9SQUl0ZXImIF9fc2Vxc19iZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXFfUkFJdGVyJiBfX3NlcXNfZW5kLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9SQUl0ZXImIF9fdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlJiBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgX0RpZmZUeXBlIF9fbGVuZ3RoX2FtKSBjb25zdAorICAgICAgeyBtdWx0aXdheV9tZXJnZShfX3NlcXNfYmVnaW4sIF9fc2Vxc19lbmQsIF9fdGFyZ2V0LCBfX2xlbmd0aF9hbSwKKwkJICAgICAgIF9fY29tcCwgc2VxdWVudGlhbF90YWcoKSk7IH0KKyAgICB9OworCisgIC8qKiBAYnJpZWYgUE1XTVMgY29kZSBleGVjdXRlZCBieSBlYWNoIHRocmVhZC4KKyAgICogIEBwYXJhbSBfX3NkIFBvaW50ZXIgdG8gYWxnb3JpdGhtIGRhdGEuCisgICAqICBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAqLworICB0ZW1wbGF0ZTxib29sIF9fc3RhYmxlLCBib29sIF9fZXhhY3QsIHR5cGVuYW1lIF9SQUl0ZXIsCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIHBhcmFsbGVsX3NvcnRfbXdtc19wdShfUE1XTVNTb3J0aW5nRGF0YTxfUkFJdGVyPiogX19zZCwKKwkJCSAgX0NvbXBhcmUmIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgX1RocmVhZEluZGV4IF9faWFtID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisKKyAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHRocmVhZCdzIGNodW5rLCBiZWZvcmUgbWVyZ2luZy4KKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2xlbmd0aF9sb2NhbCA9CisJX19zZC0+X01fc3RhcnRzW19faWFtICsgMV0gLSBfX3NkLT5fTV9zdGFydHNbX19pYW1dOworCisgICAgICAvLyBTb3J0IGluIHRlbXBvcmFyeSBzdG9yYWdlLCBsZWF2ZSBzcGFjZSBmb3Igc2VudGluZWwuCisKKyAgICAgIHR5cGVkZWYgX1ZhbHVlVHlwZSogX1NvcnRpbmdQbGFjZXNJdGVyYXRvcjsKKworICAgICAgX19zZC0+X01fdGVtcG9yYXJ5W19faWFtXSA9CisgICAgICAgIHN0YXRpY19jYXN0PF9WYWx1ZVR5cGUqPig6Om9wZXJhdG9yIG5ldyhzaXplb2YoX1ZhbHVlVHlwZSkKKwkJCQkJCSogKF9fbGVuZ3RoX2xvY2FsICsgMSkpKTsKKworICAgICAgLy8gQ29weSB0aGVyZS4KKyAgICAgIHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5KF9fc2QtPl9NX3NvdXJjZSArIF9fc2QtPl9NX3N0YXJ0c1tfX2lhbV0sCisJCQkgICAgICBfX3NkLT5fTV9zb3VyY2UgKyBfX3NkLT5fTV9zdGFydHNbX19pYW1dCisJCQkgICAgICArIF9fbGVuZ3RoX2xvY2FsLAorCQkJICAgICAgX19zZC0+X01fdGVtcG9yYXJ5W19faWFtXSk7CisKKyAgICAgIF9fcG9zc2libHlfc3RhYmxlX3NvcnQ8X19zdGFibGUsIF9Tb3J0aW5nUGxhY2VzSXRlcmF0b3IsIF9Db21wYXJlPigpCisgICAgICAgIChfX3NkLT5fTV90ZW1wb3JhcnlbX19pYW1dLAorCSBfX3NkLT5fTV90ZW1wb3JhcnlbX19pYW1dICsgX19sZW5ndGhfbG9jYWwsCisgICAgICAgICBfX2NvbXApOworCisgICAgICAvLyBJbnZhcmlhbnQ6IGxvY2FsbHkgc29ydGVkIHN1YnNlcXVlbmNlIGluIHNkLT5fTV90ZW1wb3JhcnlbX19pYW1dLAorICAgICAgLy8gX19zZC0+X01fdGVtcG9yYXJ5W19faWFtXSArIF9fbGVuZ3RoX2xvY2FsLgorCisgICAgICAvLyBObyBiYXJyaWVyIGhlcmU6IFN5bmNocm9uaXphdGlvbiBpcyBkb25lIGJ5IHRoZSBzcGxpdHRpbmcgcm91dGluZS4KKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbnVtX3NhbXBsZXMgPQorICAgICAgICBfU2V0dGluZ3M6OmdldCgpLnNvcnRfbXdtc19vdmVyc2FtcGxpbmcgKiBfX3NkLT5fTV9udW1fdGhyZWFkcyAtIDE7CisgICAgICBfU3BsaXRDb25zaXN0ZW50bHk8X19leGFjdCwgX1JBSXRlciwgX0NvbXBhcmUsIF9Tb3J0aW5nUGxhY2VzSXRlcmF0b3I+KCkKKyAgICAgICAgKF9faWFtLCBfX3NkLCBfX2NvbXAsIF9fbnVtX3NhbXBsZXMpOworCisgICAgICAvLyBPZmZzZXQgZnJvbSBfX3RhcmdldCBfX2JlZ2luLCBfX2xlbmd0aCBhZnRlciBtZXJnaW5nLgorICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fb2Zmc2V0ID0gMCwgX19sZW5ndGhfYW0gPSAwOworICAgICAgZm9yIChfVGhyZWFkSW5kZXggX19zID0gMDsgX19zIDwgX19zZC0+X01fbnVtX3RocmVhZHM7IF9fcysrKQorCXsKKwkgIF9fbGVuZ3RoX2FtICs9IChfX3NkLT5fTV9waWVjZXNbX19pYW1dW19fc10uX01fZW5kCisJCQkgIC0gX19zZC0+X01fcGllY2VzW19faWFtXVtfX3NdLl9NX2JlZ2luKTsKKwkgIF9fb2Zmc2V0ICs9IF9fc2QtPl9NX3BpZWNlc1tfX2lhbV1bX19zXS5fTV9iZWdpbjsKKwl9CisKKyAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8CisgICAgICAgIHN0ZDo6cGFpcjxfU29ydGluZ1BsYWNlc0l0ZXJhdG9yLCBfU29ydGluZ1BsYWNlc0l0ZXJhdG9yPiA+CisgICAgICAgIF9TZXFWZWN0b3I7CisgICAgICBfU2VxVmVjdG9yIF9fc2VxcyhfX3NkLT5fTV9udW1fdGhyZWFkcyk7CisKKyAgICAgIGZvciAoX1RocmVhZEluZGV4IF9fcyA9IDA7IF9fcyA8IF9fc2QtPl9NX251bV90aHJlYWRzOyArK19fcykKKwl7CisJICBfX3NlcXNbX19zXSA9CisJICAgIHN0ZDo6bWFrZV9wYWlyKF9fc2QtPl9NX3RlbXBvcmFyeVtfX3NdCisJCQkgICArIF9fc2QtPl9NX3BpZWNlc1tfX2lhbV1bX19zXS5fTV9iZWdpbiwKKwkJCSAgIF9fc2QtPl9NX3RlbXBvcmFyeVtfX3NdCisJCQkgICArIF9fc2QtPl9NX3BpZWNlc1tfX2lhbV1bX19zXS5fTV9lbmQpOworCX0KKworICAgICAgX19wb3NzaWJseV9zdGFibGVfbXVsdGl3YXlfbWVyZ2U8CisgICAgICAgIF9fc3RhYmxlLCB0eXBlbmFtZSBfU2VxVmVjdG9yOjppdGVyYXRvciwKKwlfUkFJdGVyLCBfQ29tcGFyZSwgX0RpZmZlcmVuY2VUeXBlPigpKF9fc2Vxcy5iZWdpbigpLCBfX3NlcXMuZW5kKCksCisJCQkJICAgICBfX3NkLT5fTV9zb3VyY2UgKyBfX29mZnNldCwgX19jb21wLAorCQkJCSAgICAgX19sZW5ndGhfYW0pOworCisjICAgICBwcmFnbWEgb21wIGJhcnJpZXIKKworICAgICAgZm9yIChfRGlmZmVyZW5jZVR5cGUgX19pID0gMDsgX19pIDwgX19sZW5ndGhfbG9jYWw7ICsrX19pKQorCV9fc2QtPl9NX3RlbXBvcmFyeVtfX2lhbV1bX19pXS5+X1ZhbHVlVHlwZSgpOworICAgICAgOjpvcGVyYXRvciBkZWxldGUoX19zZC0+X01fdGVtcG9yYXJ5W19faWFtXSk7CisgICAgfQorCisgIC8qKiBAYnJpZWYgUE1XTVMgbWFpbiBjYWxsLgorICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2Ygc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19lbmQgRW5kIGl0ZXJhdG9yIG9mIHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgKiAgQHBhcmFtIF9fbnVtX3RocmVhZHMgTnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlLgorICAgKi8KKyAgdGVtcGxhdGU8Ym9vbCBfX3N0YWJsZSwgYm9vbCBfX2V4YWN0LCB0eXBlbmFtZSBfUkFJdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgcGFyYWxsZWxfc29ydF9td21zKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKwkJICAgICAgIF9Db21wYXJlIF9fY29tcCwKKwkJICAgICAgIF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19lbmQgLSBfX2JlZ2luKQorCisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbiA9IF9fZW5kIC0gX19iZWdpbjsKKworICAgICAgaWYgKF9fbiA8PSAxKQorCXJldHVybjsKKworICAgICAgLy8gYXQgbGVhc3Qgb25lIGVsZW1lbnQgcGVyIHRocmVhZAorICAgICAgaWYgKF9fbnVtX3RocmVhZHMgPiBfX24pCisJX19udW1fdGhyZWFkcyA9IHN0YXRpY19jYXN0PF9UaHJlYWRJbmRleD4oX19uKTsKKworICAgICAgLy8gc2hhcmVkIHZhcmlhYmxlcworICAgICAgX1BNV01TU29ydGluZ0RhdGE8X1JBSXRlcj4gX19zZDsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSogX19zdGFydHM7CisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19zaXplOworCisjICAgICBwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzKF9fbnVtX3RocmVhZHMpCisgICAgICB7CisgICAgICAgIF9fbnVtX3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCk7IC8vbm8gbW9yZSB0aHJlYWRzIHRoYW4gcmVxdWVzdGVkCisKKyMgICAgICAgcHJhZ21hIG9tcCBzaW5nbGUKKwl7CisJICBfX3NkLl9NX251bV90aHJlYWRzID0gX19udW1fdGhyZWFkczsKKwkgIF9fc2QuX01fc291cmNlID0gX19iZWdpbjsKKwkgIAorCSAgX19zZC5fTV90ZW1wb3JhcnkgPSBuZXcgX1ZhbHVlVHlwZSpbX19udW1fdGhyZWFkc107CisKKwkgIGlmICghX19leGFjdCkKKwkgICAgeworCSAgICAgIF9fc2l6ZSA9CisJCShfU2V0dGluZ3M6OmdldCgpLnNvcnRfbXdtc19vdmVyc2FtcGxpbmcgKiBfX251bV90aHJlYWRzIC0gMSkKKwkJKiBfX251bV90aHJlYWRzOworCSAgICAgIF9fc2QuX01fc2FtcGxlcyA9IHN0YXRpY19jYXN0PF9WYWx1ZVR5cGUqPgorCQkoOjpvcGVyYXRvciBuZXcoX19zaXplICogc2l6ZW9mKF9WYWx1ZVR5cGUpKSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgX19zZC5fTV9zYW1wbGVzID0gMDsKKworCSAgX19zZC5fTV9vZmZzZXRzID0gbmV3IF9EaWZmZXJlbmNlVHlwZVtfX251bV90aHJlYWRzIC0gMV07CisJICBfX3NkLl9NX3BpZWNlcworCSAgICA9IG5ldyBzdGQ6OnZlY3RvcjxfUGllY2U8X0RpZmZlcmVuY2VUeXBlPiA+W19fbnVtX3RocmVhZHNdOworCSAgZm9yIChfVGhyZWFkSW5kZXggX19zID0gMDsgX19zIDwgX19udW1fdGhyZWFkczsgKytfX3MpCisJICAgIF9fc2QuX01fcGllY2VzW19fc10ucmVzaXplKF9fbnVtX3RocmVhZHMpOworCSAgX19zdGFydHMgPSBfX3NkLl9NX3N0YXJ0cyA9IG5ldyBfRGlmZmVyZW5jZVR5cGVbX19udW1fdGhyZWFkcyArIDFdOworCisJICBfRGlmZmVyZW5jZVR5cGUgX19jaHVua19sZW5ndGggPSBfX24gLyBfX251bV90aHJlYWRzOworCSAgX0RpZmZlcmVuY2VUeXBlIF9fc3BsaXQgPSBfX24gJSBfX251bV90aHJlYWRzOworCSAgX0RpZmZlcmVuY2VUeXBlIF9fcG9zID0gMDsKKwkgIGZvciAoX1RocmVhZEluZGV4IF9faSA9IDA7IF9faSA8IF9fbnVtX3RocmVhZHM7ICsrX19pKQorCSAgICB7CisJICAgICAgX19zdGFydHNbX19pXSA9IF9fcG9zOworCSAgICAgIF9fcG9zICs9ICgoX19pIDwgX19zcGxpdCkKKwkJCT8gKF9fY2h1bmtfbGVuZ3RoICsgMSkgOiBfX2NodW5rX2xlbmd0aCk7CisJICAgIH0KKwkgIF9fc3RhcnRzW19fbnVtX3RocmVhZHNdID0gX19wb3M7CisJfSAvL3NpbmdsZQorCisgICAgICAgIC8vIE5vdyBzb3J0IGluIHBhcmFsbGVsLgorICAgICAgICBwYXJhbGxlbF9zb3J0X213bXNfcHU8X19zdGFibGUsIF9fZXhhY3Q+KCZfX3NkLCBfX2NvbXApOworICAgICAgfSAvL3BhcmFsbGVsCisKKyAgICAgIGRlbGV0ZVtdIF9fc3RhcnRzOworICAgICAgZGVsZXRlW10gX19zZC5fTV90ZW1wb3Jhcnk7CisKKyAgICAgIGlmICghX19leGFjdCkKKwl7CisJICBmb3IgKF9EaWZmZXJlbmNlVHlwZSBfX2kgPSAwOyBfX2kgPCBfX3NpemU7ICsrX19pKQorCSAgICBfX3NkLl9NX3NhbXBsZXNbX19pXS5+X1ZhbHVlVHlwZSgpOworCSAgOjpvcGVyYXRvciBkZWxldGUoX19zZC5fTV9zYW1wbGVzKTsKKwl9CisKKyAgICAgIGRlbGV0ZVtdIF9fc2QuX01fb2Zmc2V0czsKKyAgICAgIGRlbGV0ZVtdIF9fc2QuX01fcGllY2VzOworICAgIH0KKworfSAvL25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfTVVMVElXQVlfTUVSR0VTT1JUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvbnVtZXJpYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvbnVtZXJpYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDU0NjEwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9udW1lcmljCkBAIC0wLDAgKzEsNTE0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKioKKyAqIEBmaWxlIHBhcmFsbGVsL251bWVyaWMKKyoKKyAqIEBicmllZiBQYXJhbGxlbCBTVEwgZnVuY3Rpb24gY2FsbHMgY29ycmVzcG9uZGluZyB0byBzdGxfbnVtZXJpYy5oLgorICogVGhlIGZ1bmN0aW9ucyBkZWZpbmVkIGhlcmUgbWFpbmx5IGRvIGNhc2Ugc3dpdGNoZXMgYW5kCisgKiBjYWxsIHRoZSBhY3R1YWwgcGFyYWxsZWxpemVkIHZlcnNpb25zIGluIG90aGVyIGZpbGVzLgorICogSW5saW5pbmcgcG9saWN5OiBGdW5jdGlvbnMgdGhhdCBiYXNpY2FsbHkgb25seSBjb250YWluIG9uZSBmdW5jdGlvbiBjYWxsLAorICogYXJlIGRlY2xhcmVkIGlubGluZS4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IEpvaGFubmVzIFNpbmdsZXIgYW5kIEZlbGl4IFB1dHplLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX05VTUVSSUNfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9OVU1FUklDX0ggMQorCisjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDxiaXRzL3N0bF9mdW5jdGlvbi5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL251bWVyaWNmd2QuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9pdGVyYXRvci5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL2Zvcl9lYWNoLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvZm9yX2VhY2hfc2VsZWN0b3JzLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvcGFydGlhbF9zdW0uaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19wYXJhbGxlbAoreworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgYWNjdW11bGF0ZShfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBfVHAgX19pbml0LCAKKyAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6YWNjdW11bGF0ZShfX2JlZ2luLCBfX2VuZCwgX19pbml0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uPgorICAgIGlubGluZSBfVHAKKyAgICBhY2N1bXVsYXRlKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsIF9UcCBfX2luaXQsCisgICAgICAgICAgICAgICBfQmluYXJ5T3BlcmF0aW9uIF9fYmluYXJ5X29wLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OmFjY3VtdWxhdGUoX19iZWdpbiwgX19lbmQsIF9faW5pdCwgX19iaW5hcnlfb3ApOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9JdGVyYXRvclRhZz4KKyAgICBpbmxpbmUgX1RwCisgICAgX19hY2N1bXVsYXRlX3N3aXRjaChfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgIF9UcCBfX2luaXQsIF9JdGVyYXRvclRhZykgCisgICAgeyByZXR1cm4gYWNjdW11bGF0ZShfX2JlZ2luLCBfX2VuZCwgX19pbml0LAorCQkJX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9CaW5hcnlPcGVyYXRpb24sCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyYXRvclRhZz4KKyAgICBpbmxpbmUgX1RwCisgICAgX19hY2N1bXVsYXRlX3N3aXRjaChfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBfVHAgX19pbml0LCAKKyAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5T3BlcmF0aW9uIF9fYmluYXJ5X29wLCBfSXRlcmF0b3JUYWcpCisgICAgeyByZXR1cm4gYWNjdW11bGF0ZShfX2JlZ2luLCBfX2VuZCwgX19pbml0LCBfX2JpbmFyeV9vcCwgCisgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7IH0KKworICAvLyBQYXJhbGxlbCBhbGdvcml0aG0gZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfX1JBSXRlciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uPgorICAgIF9UcAorICAgIF9fYWNjdW11bGF0ZV9zd2l0Y2goX19SQUl0ZXIgX19iZWdpbiwgX19SQUl0ZXIgX19lbmQsIAorICAgICAgICAgICAgICAgICAgICAgIF9UcCBfX2luaXQsIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3AsIAorICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCAKKyAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnICAKKyAgICAgICAgICAgICAgICAgICAgICA9IF9fZ251X3BhcmFsbGVsOjpwYXJhbGxlbF91bmJhbGFuY2VkKQorICAgIHsKKyAgICAgIGlmIChfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxfX2dudV9wYXJhbGxlbDo6X1NlcXVlbmNlSW5kZXg+KF9fZW5kIC0gX19iZWdpbikKKyAgICAgICAgICAgID49IF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmdldCgpLmFjY3VtdWxhdGVfbWluaW1hbF9uCisgICAgICAgICAgICAmJiBfX2dudV9wYXJhbGxlbDo6X19pc19wYXJhbGxlbChfX3BhcmFsbGVsaXNtX3RhZykpKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fcmVzID0gX19pbml0OworICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfX2FjY3VtdWxhdGVfc2VsZWN0b3I8X19SQUl0ZXI+CisgICAgICAgICAgICBfX215X3NlbGVjdG9yOworICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjoKKyAgICAgICAgICAgIF9fZm9yX2VhY2hfdGVtcGxhdGVfcmFuZG9tX2FjY2Vzc19lZChfX2JlZ2luLCBfX2VuZCwKKwkJCQkJCSBfX2dudV9wYXJhbGxlbDo6X05vdGhpbmcoKSwKKwkJCQkJCSBfX215X3NlbGVjdG9yLAorCQkJCQkJIF9fZ251X3BhcmFsbGVsOjoKKwkJCQkJCSBfX2FjY3VtdWxhdGVfYmlub3BfcmVkdWN0CisJCQkJCSAgICAgICA8X0JpbmFyeU9wZXJhdGlvbj4oX19iaW5hcnlfb3ApLAorCQkJCQkJIF9fcmVzLCBfX3JlcywgLTEpOworICAgICAgICAgIHJldHVybiBfX3JlczsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gYWNjdW11bGF0ZShfX2JlZ2luLCBfX2VuZCwgX19pbml0LCBfX2JpbmFyeV9vcCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIGFjY3VtdWxhdGUoX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgX1RwIF9faW5pdCwgCisgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfSXRlcmF0b3JUcmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvclRyYWl0czo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3JUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5OworCisgICAgICByZXR1cm4gX19hY2N1bXVsYXRlX3N3aXRjaChfX2JlZ2luLCBfX2VuZCwgX19pbml0LAorCQkJCSBfX2dudV9wYXJhbGxlbDo6X1BsdXM8X1RwLCBfVmFsdWVUeXBlPigpLAorCQkJCSBfSXRlcmF0b3JDYXRlZ29yeSgpLCBfX3BhcmFsbGVsaXNtX3RhZyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBhY2N1bXVsYXRlKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsIF9UcCBfX2luaXQpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+IF9JdGVyYXRvclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yVHJhaXRzOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvclRyYWl0czo6aXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJhdG9yQ2F0ZWdvcnk7CisKKyAgICAgIHJldHVybiBfX2FjY3VtdWxhdGVfc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX2luaXQsCisJCQkJIF9fZ251X3BhcmFsbGVsOjpfUGx1czxfVHAsIF9WYWx1ZVR5cGU+KCksCisJCQkJIF9JdGVyYXRvckNhdGVnb3J5KCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbj4KKyAgICBpbmxpbmUgX1RwCisgICAgYWNjdW11bGF0ZShfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBfVHAgX19pbml0LCAKKyAgICAgICAgICAgICAgIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3AsIAorICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+IF9JdGVyYXRvclRyYWl0czsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTsKKyAgICAgIHJldHVybiBfX2FjY3VtdWxhdGVfc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX2luaXQsIF9fYmluYXJ5X29wLCAKKwkJCQkgX0l0ZXJhdG9yQ2F0ZWdvcnkoKSwgX19wYXJhbGxlbGlzbV90YWcpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbj4KKyAgICBpbmxpbmUgX1RwCisgICAgYWNjdW11bGF0ZShfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBfVHAgX19pbml0LCAKKyAgICAgICAgICAgICAgIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3ApIAorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX0l0ZXJhdG9yVHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3JUcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5OworICAgICAgcmV0dXJuIF9fYWNjdW11bGF0ZV9zd2l0Y2goX19iZWdpbiwgX19lbmQsIF9faW5pdCwgX19iaW5hcnlfb3AsIAorCQkJCSBfSXRlcmF0b3JDYXRlZ29yeSgpKTsKKyAgICB9CisKKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIGlubmVyX3Byb2R1Y3QoX0lJdGVyMSBfX2ZpcnN0MSwgX0lJdGVyMSBfX2xhc3QxLCAKKyAgICAgICAgICAgICAgICAgIF9JSXRlcjIgX19maXJzdDIsIF9UcCBfX2luaXQsCisgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OmlubmVyX3Byb2R1Y3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2luaXQpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1RwLAorICAgICAgICAgICB0eXBlbmFtZSBfQmluYXJ5RnVuY3Rpb24xLCB0eXBlbmFtZSBfQmluYXJ5RnVuY3Rpb24yPgorICAgIGlubGluZSBfVHAKKyAgICBpbm5lcl9wcm9kdWN0KF9JSXRlcjEgX19maXJzdDEsIF9JSXRlcjEgX19sYXN0MSwKKyAgICAgICAgICAgICAgICAgIF9JSXRlcjIgX19maXJzdDIsIF9UcCBfX2luaXQsIF9CaW5hcnlGdW5jdGlvbjEgX19iaW5hcnlfb3AxLCAKKyAgICAgICAgICAgICAgICAgIF9CaW5hcnlGdW5jdGlvbjIgX19iaW5hcnlfb3AyLAorICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKQorICAgIHsgcmV0dXJuIF9HTElCQ1hYX1NURF9BOjppbm5lcl9wcm9kdWN0KF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19pbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmluYXJ5X29wMSwgX19iaW5hcnlfb3AyKTsgfQorCisgIC8vIFBhcmFsbGVsIGFsZ29yaXRobSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIxLCB0eXBlbmFtZSBfUkFJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQmluYXJ5RnVuY3Rpb24xLCB0eXBlbmFtZSBfQmluYXJ5RnVuY3Rpb24yPgorICAgIF9UcAorICAgIF9faW5uZXJfcHJvZHVjdF9zd2l0Y2goX1JBSXRlcjEgX19maXJzdDEsCisJCQkgICBfUkFJdGVyMSBfX2xhc3QxLAorCQkJICAgX1JBSXRlcjIgX19maXJzdDIsIF9UcCBfX2luaXQsCisJCQkgICBfQmluYXJ5RnVuY3Rpb24xIF9fYmluYXJ5X29wMSwKKwkJCSAgIF9CaW5hcnlGdW5jdGlvbjIgX19iaW5hcnlfb3AyLAorCQkJICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisJCQkgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKwkJCSAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbV90YWcKKwkJCSAgID0gX19nbnVfcGFyYWxsZWw6OnBhcmFsbGVsX3VuYmFsYW5jZWQpCisgICAgeworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigoX19sYXN0MSAtIF9fZmlyc3QxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PSBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZV9taW5pbWFsX24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgX19nbnVfcGFyYWxsZWw6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2lzX3BhcmFsbGVsKF9fcGFyYWxsZWxpc21fdGFnKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19yZXMgPSBfX2luaXQ7CisgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OgorICAgICAgICAgICAgX19pbm5lcl9wcm9kdWN0X3NlbGVjdG9yPF9SQUl0ZXIxLAorICAgICAgICAgICAgX1JBSXRlcjIsIF9UcD4gX19teV9zZWxlY3RvcihfX2ZpcnN0MSwgX19maXJzdDIpOworICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjoKKyAgICAgICAgICAgIF9fZm9yX2VhY2hfdGVtcGxhdGVfcmFuZG9tX2FjY2Vzc19lZCgKKyAgICAgICAgICAgICAgICBfX2ZpcnN0MSwgX19sYXN0MSwgX19iaW5hcnlfb3AyLCBfX215X3NlbGVjdG9yLCBfX2JpbmFyeV9vcDEsCisgICAgICAgICAgICAgICAgX19yZXMsIF9fcmVzLCAtMSk7CisgICAgICAgICAgcmV0dXJuIF9fcmVzOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBpbm5lcl9wcm9kdWN0KF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19pbml0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOworICAgIH0KKworICAvLyBObyBwYXJhbGxlbGlzbSBmb3IgaW5wdXQgaXRlcmF0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfVHAsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlGdW5jdGlvbjEsIHR5cGVuYW1lIF9CaW5hcnlGdW5jdGlvbjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyYXRvclRhZzEsIHR5cGVuYW1lIF9JdGVyYXRvclRhZzI+CisgICAgaW5saW5lIF9UcAorICAgIF9faW5uZXJfcHJvZHVjdF9zd2l0Y2goX0lJdGVyMSBfX2ZpcnN0MSwgX0lJdGVyMSBfX2xhc3QxLCAKKwkJCSAgIF9JSXRlcjIgX19maXJzdDIsIF9UcCBfX2luaXQsIAorCQkJICAgX0JpbmFyeUZ1bmN0aW9uMSBfX2JpbmFyeV9vcDEsCisJCQkgICBfQmluYXJ5RnVuY3Rpb24yIF9fYmluYXJ5X29wMiwgCisJCQkgICBfSXRlcmF0b3JUYWcxLCBfSXRlcmF0b3JUYWcyKQorICAgIHsgcmV0dXJuIGlubmVyX3Byb2R1Y3QoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2luaXQsIF9fYmluYXJ5X29wMSwKKwkJCSAgIF9fYmluYXJ5X29wMiwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKCkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1RwLAorICAgICAgICAgICB0eXBlbmFtZSBfQmluYXJ5RnVuY3Rpb24xLCB0eXBlbmFtZSBfQmluYXJ5RnVuY3Rpb24yPgorICAgIGlubGluZSBfVHAKKyAgICBpbm5lcl9wcm9kdWN0KF9JSXRlcjEgX19maXJzdDEsIF9JSXRlcjEgX19sYXN0MSwgCisgICAgICAgICAgICAgICAgICBfSUl0ZXIyIF9fZmlyc3QyLCBfVHAgX19pbml0LCBfQmluYXJ5RnVuY3Rpb24xIF9fYmluYXJ5X29wMSwgCisgICAgICAgICAgICAgICAgICBfQmluYXJ5RnVuY3Rpb24yIF9fYmluYXJ5X29wMiwgCisgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcjE+IF9UcmFpdHNUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGUxOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTE7CisKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcjI+IF9UcmFpdHNUeXBlMjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGUyOjppdGVyYXRvcl9jYXRlZ29yeSBfSXRlcmF0b3JDYXRlZ29yeTI7CisKKyAgICAgIHJldHVybiBfX2lubmVyX3Byb2R1Y3Rfc3dpdGNoKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19pbml0LAorCQkJCSAgICBfX2JpbmFyeV9vcDEsIF9fYmluYXJ5X29wMiwKKwkJCQkgICAgX0l0ZXJhdG9yQ2F0ZWdvcnkxKCksIF9JdGVyYXRvckNhdGVnb3J5MigpLAorCQkJCSAgICBfX3BhcmFsbGVsaXNtX3RhZyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9UcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeUZ1bmN0aW9uMSwgdHlwZW5hbWUgX0JpbmFyeUZ1bmN0aW9uMj4KKyAgICBpbmxpbmUgX1RwCisgICAgaW5uZXJfcHJvZHVjdChfSUl0ZXIxIF9fZmlyc3QxLCBfSUl0ZXIxIF9fbGFzdDEsIAorICAgICAgICAgICAgICAgICAgX0lJdGVyMiBfX2ZpcnN0MiwgX1RwIF9faW5pdCwgX0JpbmFyeUZ1bmN0aW9uMSBfX2JpbmFyeV9vcDEsIAorICAgICAgICAgICAgICAgICAgX0JpbmFyeUZ1bmN0aW9uMiBfX2JpbmFyeV9vcDIpCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0lJdGVyMT4gX1RyYWl0c1R5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTE6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5MTsKKworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0lJdGVyMj4gX1RyYWl0c1R5cGUyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTI6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyYXRvckNhdGVnb3J5MjsKKworICAgICAgcmV0dXJuIF9faW5uZXJfcHJvZHVjdF9zd2l0Y2goX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2luaXQsCisJCQkJICAgIF9fYmluYXJ5X29wMSwgX19iaW5hcnlfb3AyLAorCQkJCSAgICBfSXRlcmF0b3JDYXRlZ29yeTEoKSwKKwkJCQkgICAgX0l0ZXJhdG9yQ2F0ZWdvcnkyKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIGlubmVyX3Byb2R1Y3QoX0lJdGVyMSBfX2ZpcnN0MSwgX0lJdGVyMSBfX2xhc3QxLCAKKyAgICAgICAgICAgICAgICAgIF9JSXRlcjIgX19maXJzdDIsIF9UcCBfX2luaXQsIAorICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtX3RhZykKKyAgICB7CisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXIxPiBfVHJhaXRzVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlMTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcjI+IF9UcmFpdHNUeXBlMjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGUyOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lCisgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfTXVsdGlwbGllczxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+OjpyZXN1bHRfdHlwZQorICAgICAgICBfTXVsdGlwbGllc1Jlc3VsdFR5cGU7CisgICAgICByZXR1cm4gX19nbnVfcGFyYWxsZWw6OmlubmVyX3Byb2R1Y3QoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BsdXM8X1RwLCBfTXVsdGlwbGllc1Jlc3VsdFR5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBfTXVsdGlwbGllczxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3BhcmFsbGVsaXNtX3RhZyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgaW5uZXJfcHJvZHVjdChfSUl0ZXIxIF9fZmlyc3QxLCBfSUl0ZXIxIF9fbGFzdDEsIAorICAgICAgICAgICAgICAgICAgX0lJdGVyMiBfX2ZpcnN0MiwgX1RwIF9faW5pdCkKKyAgICB7CisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfSUl0ZXIxPiBfVHJhaXRzVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlMTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcjI+IF9UcmFpdHNUeXBlMjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGUyOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lCisgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfTXVsdGlwbGllczxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+OjpyZXN1bHRfdHlwZQorICAgICAgICBfTXVsdGlwbGllc1Jlc3VsdFR5cGU7CisgICAgICByZXR1cm4gX19nbnVfcGFyYWxsZWw6OmlubmVyX3Byb2R1Y3QoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BsdXM8X1RwLCBfTXVsdGlwbGllc1Jlc3VsdFR5cGU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBfTXVsdGlwbGllczxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+KCkpOworICAgIH0KKworICAvLyBTZXF1ZW50aWFsIGZhbGxiYWNrLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgcGFydGlhbF9zdW0oX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6cGFydGlhbF9zdW0oX19iZWdpbiwgX19lbmQsIF9fcmVzdWx0KTsgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2suCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlPcGVyYXRpb24+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIHBhcnRpYWxfc3VtKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICBfQmluYXJ5T3BlcmF0aW9uIF9fYmluX29wLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnBhcnRpYWxfc3VtKF9fYmVnaW4sIF9fZW5kLCBfX3Jlc3VsdCwgX19iaW5fb3ApOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlPcGVyYXRpb24sIHR5cGVuYW1lIF9JdGVyYXRvclRhZzEsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyYXRvclRhZzI+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fcGFydGlhbF9zdW1fc3dpdGNoKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsCisJCQkgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQmluYXJ5T3BlcmF0aW9uIF9fYmluX29wLAorCQkJIF9JdGVyYXRvclRhZzEsIF9JdGVyYXRvclRhZzIpCisgICAgeyByZXR1cm4gX0dMSUJDWFhfU1REX0E6OnBhcnRpYWxfc3VtKF9fYmVnaW4sIF9fZW5kLCBfX3Jlc3VsdCwgX19iaW5fb3ApOyB9CisKKyAgLy8gUGFyYWxsZWwgYWxnb3JpdGhtIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlPcGVyYXRpb24+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgX19wYXJ0aWFsX3N1bV9zd2l0Y2goX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwKKwkJCSBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9CaW5hcnlPcGVyYXRpb24gX19iaW5fb3AsCisJCQkgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisJCQkgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQgLSBfX2JlZ2luKQorICAgICAgICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkucGFydGlhbF9zdW1fbWluaW1hbF9uKSkKKyAgICAgICAgcmV0dXJuIF9fZ251X3BhcmFsbGVsOjpfX3BhcmFsbGVsX3BhcnRpYWxfc3VtKF9fYmVnaW4sIF9fZW5kLAorCQkJCQkJICAgICAgX19yZXN1bHQsIF9fYmluX29wKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHBhcnRpYWxfc3VtKF9fYmVnaW4sIF9fZW5kLCBfX3Jlc3VsdCwgX19iaW5fb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBwYXJ0aWFsX3N1bShfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgcmV0dXJuIF9fZ251X3BhcmFsbGVsOjpwYXJ0aWFsX3N1bShfX2JlZ2luLCBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yZXN1bHQsIHN0ZDo6cGx1czxfVmFsdWVUeXBlPigpKTsKKyAgICB9CisKKyAgLy8gUHVibGljIGludGVyZmFjZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgcGFydGlhbF9zdW0oX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3ApCisgICAgeworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfSVRyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JVHJhaXRzVHlwZTo6aXRlcmF0b3JfY2F0ZWdvcnkgX0lJdGVyYXRvckNhdGVnb3J5OworCisgICAgICB0eXBlZGVmIGl0ZXJhdG9yX3RyYWl0czxfT3V0cHV0SXRlcmF0b3I+IF9PVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX09UcmFpdHNUeXBlOjppdGVyYXRvcl9jYXRlZ29yeSBfT0l0ZXJDYXRlZ29yeTsKKworICAgICAgcmV0dXJuIF9fcGFydGlhbF9zdW1fc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX3Jlc3VsdCwgX19iaW5hcnlfb3AsCisJCQkJICBfSUl0ZXJhdG9yQ2F0ZWdvcnkoKSwgX09JdGVyQ2F0ZWdvcnkoKSk7CisgICAgfQorCisgIC8vIFNlcXVlbnRpYWwgZmFsbGJhY2suCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBhZGphY2VudF9kaWZmZXJlbmNlKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6YWRqYWNlbnRfZGlmZmVyZW5jZShfX2JlZ2luLCBfX2VuZCwgX19yZXN1bHQpOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlPcGVyYXRpb24+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIGFkamFjZW50X2RpZmZlcmVuY2UoX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0JpbmFyeU9wZXJhdGlvbiBfX2Jpbl9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZykKKyAgICB7IHJldHVybiBfR0xJQkNYWF9TVERfQTo6YWRqYWNlbnRfZGlmZmVyZW5jZShfX2JlZ2luLCBfX2VuZCwKKwkJCQkJCSBfX3Jlc3VsdCwgX19iaW5fb3ApOyB9CisKKyAgLy8gU2VxdWVudGlhbCBmYWxsYmFjayBmb3IgaW5wdXQgaXRlcmF0b3IgY2FzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlPcGVyYXRpb24sIHR5cGVuYW1lIF9JdGVyYXRvclRhZzEsCisgICAgICAgICAgIHR5cGVuYW1lIF9JdGVyYXRvclRhZzI+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fYWRqYWNlbnRfZGlmZmVyZW5jZV9zd2l0Y2goX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwKKwkJCQkgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorCQkJCSBfQmluYXJ5T3BlcmF0aW9uIF9fYmluX29wLCBfSXRlcmF0b3JUYWcxLAorCQkJCSBfSXRlcmF0b3JUYWcyKQorICAgIHsgcmV0dXJuIGFkamFjZW50X2RpZmZlcmVuY2UoX19iZWdpbiwgX19lbmQsIF9fcmVzdWx0LCBfX2Jpbl9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKTsgfQorCisgIC8vIFBhcmFsbGVsIGFsZ29yaXRobSBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fYWRqYWNlbnRfZGlmZmVyZW5jZV9zd2l0Y2goX0lJdGVyIF9fYmVnaW4sIF9JSXRlciBfX2VuZCwKKwkJCQkgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorCQkJCSBfQmluYXJ5T3BlcmF0aW9uIF9fYmluX29wLAorCQkJCSByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKwkJCQkgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisJCQkJIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20KKwkJCQkgX19wYXJhbGxlbGlzbV90YWcKKwkJCQkgPSBfX2dudV9wYXJhbGxlbDo6cGFyYWxsZWxfYmFsYW5jZWQpCisgICAgeworICAgICAgaWYgKF9HTElCQ1hYX1BBUkFMTEVMX0NPTkRJVElPTigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PF9fZ251X3BhcmFsbGVsOjpfU2VxdWVuY2VJbmRleD4oX19lbmQgLSBfX2JlZ2luKQorICAgICAgICAgICAgPj0gX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkuYWRqYWNlbnRfZGlmZmVyZW5jZV9taW5pbWFsX24KKyAgICAgICAgICAgICYmIF9fZ251X3BhcmFsbGVsOjpfX2lzX3BhcmFsbGVsKF9fcGFyYWxsZWxpc21fdGFnKSkpCisgICAgICAgIHsKKyAgICAgICAgICBib29sIF9fZHVtbXkgPSB0cnVlOworICAgICAgICAgIHR5cGVkZWYgX19nbnVfcGFyYWxsZWw6Ol9JdGVyYXRvclBhaXI8X0lJdGVyLCBfT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZz4gX0l0VHJpcDsKKyAgICAgICAgICAqX19yZXN1bHQgPSAqX19iZWdpbjsKKyAgICAgICAgICBfSXRUcmlwIF9fYmVnaW5fcGFpcihfX2JlZ2luICsgMSwgX19yZXN1bHQgKyAxKSwKKyAgICAgICAgICAgIF9fZW5kX3BhaXIoX19lbmQsIF9fcmVzdWx0ICsgKF9fZW5kIC0gX19iZWdpbikpOworICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfX2FkamFjZW50X2RpZmZlcmVuY2Vfc2VsZWN0b3I8X0l0VHJpcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY3Rpb25hbGl0eTsKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6CisgICAgICAgICAgICBfX2Zvcl9lYWNoX3RlbXBsYXRlX3JhbmRvbV9hY2Nlc3NfZWQoCisgICAgICAgICAgICAgICAgX19iZWdpbl9wYWlyLCBfX2VuZF9wYWlyLCBfX2Jpbl9vcCwgX19mdW5jdGlvbmFsaXR5LAorICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfRHVtbXlSZWR1Y3QoKSwgX19kdW1teSwgX19kdW1teSwgLTEpOworICAgICAgICAgIHJldHVybiBfX2Z1bmN0aW9uYWxpdHkuX01fZmluaXNoX2l0ZXJhdG9yOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBhZGphY2VudF9kaWZmZXJlbmNlKF9fYmVnaW4sIF9fZW5kLCBfX3Jlc3VsdCwgX19iaW5fb3AsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7CisgICAgfQorCisgIC8vIFB1YmxpYyBpbnRlcmZhY2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBhZGphY2VudF9kaWZmZXJlbmNlKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICByZXR1cm4gYWRqYWNlbnRfZGlmZmVyZW5jZShfX2JlZ2luLCBfX2VuZCwgX19yZXN1bHQsCisJCQkJIHN0ZDo6bWludXM8X1ZhbHVlVHlwZT4oKSwKKwkJCQkgX19wYXJhbGxlbGlzbV90YWcpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgYWRqYWNlbnRfZGlmZmVyZW5jZShfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICByZXR1cm4gYWRqYWNlbnRfZGlmZmVyZW5jZShfX2JlZ2luLCBfX2VuZCwgX19yZXN1bHQsCisJCQkJIHN0ZDo6bWludXM8X1ZhbHVlVHlwZT4oKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBhZGphY2VudF9kaWZmZXJlbmNlKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc21fdGFnKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX0lUcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSVRyYWl0c1R5cGU6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JSXRlcmF0b3JDYXRlZ29yeTsKKworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X091dHB1dEl0ZXJhdG9yPiBfT1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9PVHJhaXRzVHlwZTo6aXRlcmF0b3JfY2F0ZWdvcnkgX09JdGVyQ2F0ZWdvcnk7CisKKyAgICAgIHJldHVybiBfX2FkamFjZW50X2RpZmZlcmVuY2Vfc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX3Jlc3VsdCwKKwkJCQkJICBfX2JpbmFyeV9vcCwKKwkJCQkJICBfSUl0ZXJhdG9yQ2F0ZWdvcnkoKSwKKwkJCQkJICBfT0l0ZXJDYXRlZ29yeSgpLAorCQkJCQkgIF9fcGFyYWxsZWxpc21fdGFnKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgYWRqYWNlbnRfZGlmZmVyZW5jZShfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLAorCQkJX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQmluYXJ5T3BlcmF0aW9uIF9fYmluYXJ5X29wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX0lUcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSVRyYWl0c1R5cGU6Oml0ZXJhdG9yX2NhdGVnb3J5IF9JSXRlcmF0b3JDYXRlZ29yeTsKKworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X091dHB1dEl0ZXJhdG9yPiBfT1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9PVHJhaXRzVHlwZTo6aXRlcmF0b3JfY2F0ZWdvcnkgX09JdGVyQ2F0ZWdvcnk7CisKKyAgICAgIHJldHVybiBfX2FkamFjZW50X2RpZmZlcmVuY2Vfc3dpdGNoKF9fYmVnaW4sIF9fZW5kLCBfX3Jlc3VsdCwKKwkJCQkJICBfX2JpbmFyeV9vcCwKKwkJCQkJICBfSUl0ZXJhdG9yQ2F0ZWdvcnkoKSwKKwkJCQkJICBfT0l0ZXJDYXRlZ29yeSgpKTsKKyAgICB9Cit9IC8vIGVuZCBuYW1lc3BhY2UKK30gLy8gZW5kIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0dMSUJDWFhfTlVNRVJJQ19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL251bWVyaWNmd2QuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvbnVtZXJpY2Z3ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiM2QyZjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL251bWVyaWNmd2QuaApAQCAtMCwwICsxLDIwMyBAQAorLy8gPHBhcmFsbGVsL251bWVyaWM+IEZvcndhcmQgZGVjbGFyYXRpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9udW1lcmljZndkLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX05VTUVSSUNGV0RfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9OVU1FUklDRldEX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxwYXJhbGxlbC90YWdzLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvc2V0dGluZ3MuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19wYXJhbGxlbAoreworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBhY2N1bXVsYXRlKF9JSXRlciwgX0lJdGVyLCBfVHApOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIGFjY3VtdWxhdGUoX0lJdGVyLCBfSUl0ZXIsIF9UcCwgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBhY2N1bXVsYXRlKF9JSXRlciwgX0lJdGVyLCBfVHAsIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVGFnPgorICAgIF9UcAorICAgIF9fYWNjdW11bGF0ZV9zd2l0Y2goX0lJdGVyLCBfSUl0ZXIsIF9UcCwgX1RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9CaW5hcnlPcGVyPgorICAgIF9UcAorICAgIGFjY3VtdWxhdGUoX0lJdGVyLCBfSUl0ZXIsIF9UcCwgX0JpbmFyeU9wZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQmluYXJ5T3Blcj4KKyAgICBfVHAKKyAgICBhY2N1bXVsYXRlKF9JSXRlciwgX0lJdGVyLCBfVHAsIF9CaW5hcnlPcGVyLAorICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0JpbmFyeU9wZXI+CisgICAgX1RwCisgICAgYWNjdW11bGF0ZShfSUl0ZXIsIF9JSXRlciwgX1RwLCBfQmluYXJ5T3BlciwKKyAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQmluYXJ5T3BlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX1RhZz4KKyAgICBfVHAKKyAgICBfX2FjY3VtdWxhdGVfc3dpdGNoKF9JSXRlciwgX0lJdGVyLCBfVHAsIF9CaW5hcnlPcGVyLCBfVGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9CaW5hcnlPcGVyPgorICAgIF9UcAorICAgIF9fYWNjdW11bGF0ZV9zd2l0Y2goX1JBSXRlciwgX1JBSXRlciwgX1RwLCBfQmluYXJ5T3BlciwKKyAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtIF9fcGFyYWxsZWxpc20KKyAgICAgICAgICAgICAgICAgICAgICA9IF9fZ251X3BhcmFsbGVsOjpwYXJhbGxlbF91bmJhbGFuY2VkKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIKKyAgICBhZGphY2VudF9kaWZmZXJlbmNlKF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfQmluYXJ5T3Blcj4KKyAgICBfT0l0ZXIKKyAgICBhZGphY2VudF9kaWZmZXJlbmNlKF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIsIF9CaW5hcnlPcGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIKKyAgICBhZGphY2VudF9kaWZmZXJlbmNlKF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfQmluYXJ5T3Blcj4KKyAgICBfT0l0ZXIKKyAgICBhZGphY2VudF9kaWZmZXJlbmNlKF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIsIF9CaW5hcnlPcGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXI+CisgICAgX09JdGVyCisgICAgYWRqYWNlbnRfZGlmZmVyZW5jZShfSUl0ZXIsIF9JSXRlciwgX09JdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9CaW5hcnlPcGVyPgorICAgIF9PSXRlcgorICAgIGFkamFjZW50X2RpZmZlcmVuY2UoX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgX0JpbmFyeU9wZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9CaW5hcnlPcGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfVGFnMSwgdHlwZW5hbWUgX1RhZzI+CisgICAgX09JdGVyCisgICAgX19hZGphY2VudF9kaWZmZXJlbmNlX3N3aXRjaChfSUl0ZXIsIF9JSXRlciwgX09JdGVyLCBfQmluYXJ5T3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVGFnMSwgX1RhZzIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfQmluYXJ5T3Blcj4KKyAgICBfT0l0ZXIKKyAgICBfX2FkamFjZW50X2RpZmZlcmVuY2Vfc3dpdGNoKF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIsIF9CaW5hcnlPcGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20gX19wYXJhbGxlbGlzbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gX19nbnVfcGFyYWxsZWw6OnBhcmFsbGVsX3VuYmFsYW5jZWQpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBpbm5lcl9wcm9kdWN0KF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9UcCk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIGlubmVyX3Byb2R1Y3QoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX1RwLAorICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6OnNlcXVlbnRpYWxfdGFnKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgaW5uZXJfcHJvZHVjdChfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfVHAsCisgICAgICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X1BhcmFsbGVsaXNtKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfVHAsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlGdW5jdGlvbjEsIHR5cGVuYW1lIF9CaW5hcnlGdW5jdGlvbjI+CisgICAgX1RwCisgICAgaW5uZXJfcHJvZHVjdChfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfVHAsCisgICAgICAgICAgICAgICAgICBfQmluYXJ5RnVuY3Rpb24xLCBfQmluYXJ5RnVuY3Rpb24yKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfVHAsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlGdW5jdGlvbjEsIHR5cGVuYW1lIF9CaW5hcnlGdW5jdGlvbjI+CisgICAgX1RwCisgICAgaW5uZXJfcHJvZHVjdChfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfVHAsIF9CaW5hcnlGdW5jdGlvbjEsCisgICAgICAgICAgICAgICAgICBfQmluYXJ5RnVuY3Rpb24yLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9UcCwKKyAgICAgICAgICAgdHlwZW5hbWUgQmluYXJ5RnVuY3Rpb24xLCB0eXBlbmFtZSBCaW5hcnlGdW5jdGlvbjI+CisgICAgX1RwCisgICAgaW5uZXJfcHJvZHVjdChfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfVHAsIEJpbmFyeUZ1bmN0aW9uMSwKKyAgICAgICAgICAgICAgICAgIEJpbmFyeUZ1bmN0aW9uMiwgX19nbnVfcGFyYWxsZWw6Ol9QYXJhbGxlbGlzbSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcjEsIHR5cGVuYW1lIF9SQUl0ZXIyLCB0eXBlbmFtZSBfVHAsCisgICAgICAgICAgIHR5cGVuYW1lIEJpbmFyeUZ1bmN0aW9uMSwgdHlwZW5hbWUgQmluYXJ5RnVuY3Rpb24yPgorICAgIF9UcAorICAgIF9faW5uZXJfcHJvZHVjdF9zd2l0Y2goX1JBSXRlcjEsIF9SQUl0ZXIxLCBfUkFJdGVyMiwgX1RwLCBCaW5hcnlGdW5jdGlvbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5RnVuY3Rpb24yLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpfUGFyYWxsZWxpc20KKyAgICAgICAgICAgICAgICAgICAgICAgICA9IF9fZ251X3BhcmFsbGVsOjpwYXJhbGxlbF91bmJhbGFuY2VkKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfVHAsCisgICAgICAgICAgIHR5cGVuYW1lIF9CaW5hcnlGdW5jdGlvbjEsIHR5cGVuYW1lIF9CaW5hcnlGdW5jdGlvbjIsCisgICAgICAgICAgIHR5cGVuYW1lIF9UYWcxLCB0eXBlbmFtZSBfVGFnMj4KKyAgICBfVHAKKyAgICBfX2lubmVyX3Byb2R1Y3Rfc3dpdGNoKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9UcCwgX0JpbmFyeUZ1bmN0aW9uMSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgX0JpbmFyeUZ1bmN0aW9uMiwgX1RhZzEsIF9UYWcyKTsKKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlcgorICAgIHBhcnRpYWxfc3VtKF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIsIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9CaW5hcnlPcGVyPgorICAgIF9PSXRlcgorICAgIHBhcnRpYWxfc3VtKF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIsIF9CaW5hcnlPcGVyLAorICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXI+CisgICAgX09JdGVyCisgICAgcGFydGlhbF9zdW0oX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciBfX3Jlc3VsdCk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9CaW5hcnlPcGVyPgorICAgIF9PSXRlcgorICAgIHBhcnRpYWxfc3VtKF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIsIF9CaW5hcnlPcGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX0JpbmFyeU9wZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9UYWcxLCB0eXBlbmFtZSBfVGFnMj4KKyAgICBfT0l0ZXIKKyAgICBfX3BhcnRpYWxfc3VtX3N3aXRjaChfSUl0ZXIsIF9JSXRlciwgX09JdGVyLCBfQmluYXJ5T3BlciwgX1RhZzEsIF9UYWcyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX0JpbmFyeU9wZXI+CisgICAgX09JdGVyCisgICAgX19wYXJ0aWFsX3N1bV9zd2l0Y2goX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgX0JpbmFyeU9wZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyk7Cit9IC8vIGVuZCBuYW1lc3BhY2UKK30gLy8gZW5kIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfTlVNRVJJQ0ZXRF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL29tcF9sb29wLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL29tcF9sb29wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNlZGZmNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvb21wX2xvb3AuaApAQCAtMCwwICsxLDExNSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL29tcF9sb29wLmgKKyAqICBAYnJpZWYgUGFyYWxsZWxpemF0aW9uIG9mIGVtYmFycmFzc2luZ2x5IHBhcmFsbGVsIGV4ZWN1dGlvbiBieQorICogIG1lYW5zIG9mIGFuIE9wZW5NUCBmb3IgbG9vcC4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IEZlbGl4IFB1dHplLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX09NUF9MT09QX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfT01QX0xPT1BfSCAxCisKKyNpbmNsdWRlIDxvbXAuaD4KKworI2luY2x1ZGUgPHBhcmFsbGVsL3NldHRpbmdzLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvYmFzaWNfaXRlcmF0b3IuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9iYXNlLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAoreworICAvKiogQGJyaWVmIEVtYmFycmFzc2luZ2x5IHBhcmFsbGVsIGFsZ29yaXRobSBmb3IgcmFuZG9tIGFjY2VzcworICAgKiBpdGVyYXRvcnMsIHVzaW5nIGFuIE9wZW5NUCBmb3IgbG9vcC4KKyAgICoKKyAgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIGVsZW1lbnQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19lbmQgRW5kIGl0ZXJhdG9yIG9mIGVsZW1lbnQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19vIFVzZXItc3VwcGxpZWQgZnVuY3RvciAoY29tcGFyYXRvciwgcHJlZGljYXRlLCBhZGRpbmcKKyAgICogIGZ1bmN0b3IsIGV0Yy4pLgorICAgKiAgQHBhcmFtIF9fZiBGdW5jdG9yIHRvIEBhIHByb2Nlc3MgYW4gZWxlbWVudCB3aXRoIF9fb3AgKGRlcGVuZHMgb24KKyAgICogIGRlc2lyZWQgZnVuY3Rpb25hbGl0eSwgZS4gZy4gZm9yIHN0ZDo6Zm9yX2VhY2goKSwgLi4uKS4KKyAgICogIEBwYXJhbSBfX3IgRnVuY3RvciB0byBAYSBhZGQgYSBzaW5nbGUgX19yZXN1bHQgdG8gdGhlIGFscmVhZHkKKyAgICogIHByb2Nlc3NlZCBlbGVtZW50cyAoZGVwZW5kcyBvbiBmdW5jdGlvbmFsaXR5KS4KKyAgICogIEBwYXJhbSBfX2Jhc2UgQmFzZSB2YWx1ZSBmb3IgcmVkdWN0aW9uLgorICAgKiAgQHBhcmFtIF9fb3V0cHV0IFBvaW50ZXIgdG8gcG9zaXRpb24gd2hlcmUgZmluYWwgcmVzdWx0IGlzIHdyaXR0ZW4gdG8KKyAgICogIEBwYXJhbSBfX2JvdW5kIE1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHByb2Nlc3NlZCAoZS4gZy4gZm9yCisgICAqICBzdGQ6OmNvdW50X24oKSkuCisgICAqICBAcmV0dXJuIFVzZXItc3VwcGxpZWQgZnVuY3RvciAodGhhdCBtYXkgY29udGFpbiBhIHBhcnQgb2YgdGhlIHJlc3VsdCkuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLAorCSAgIHR5cGVuYW1lIF9PcCwKKwkgICB0eXBlbmFtZSBfRnUsCisJICAgdHlwZW5hbWUgX1JlZCwKKwkgICB0eXBlbmFtZSBfUmVzdWx0PgorICAgIF9PcAorICAgIF9fZm9yX2VhY2hfdGVtcGxhdGVfcmFuZG9tX2FjY2Vzc19vbXBfbG9vcChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisJCQkJCSAgICAgICBfT3AgX19vLCBfRnUmIF9fZiwgX1JlZCBfX3IsCisJCQkJCSAgICAgICBfUmVzdWx0IF9fYmFzZSwKKwkJCQkJICAgICAgIF9SZXN1bHQmIF9fb3V0cHV0LAorICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj46OmRpZmZlcmVuY2VfdHlwZSBfX2JvdW5kKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgICAgICBfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2xlbmd0aCA9IF9fZW5kIC0gX19iZWdpbjsKKyAgICAgIF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzID0gX19nbnVfcGFyYWxsZWw6Om1pbjxfRGlmZmVyZW5jZVR5cGU+CisJKF9fZ2V0X21heF90aHJlYWRzKCksIF9fbGVuZ3RoKTsKKworICAgICAgX1Jlc3VsdCAqX190aHJlYWRfcmVzdWx0czsKKworIyAgICAgcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyhfX251bV90aHJlYWRzKQorICAgICAgeworIyAgICAgICBwcmFnbWEgb21wIHNpbmdsZQorCXsKKwkgIF9fbnVtX3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCk7CisJICBfX3RocmVhZF9yZXN1bHRzID0gbmV3IF9SZXN1bHRbX19udW1fdGhyZWFkc107CisKKwkgIGZvciAoX1RocmVhZEluZGV4IF9faSA9IDA7IF9faSA8IF9fbnVtX3RocmVhZHM7ICsrX19pKQorCSAgICBfX3RocmVhZF9yZXN1bHRzW19faV0gPSBfUmVzdWx0KCk7CisJfQorCisgICAgICAgIF9UaHJlYWRJbmRleCBfX2lhbSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworCisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywgX1NldHRpbmdzOjpnZXQoKS53b3Jrc3RlYWxpbmdfY2h1bmtfc2l6ZSkKKyAgICAgICAgZm9yIChfRGlmZmVyZW5jZVR5cGUgX19wb3MgPSAwOyBfX3BvcyA8IF9fbGVuZ3RoOyArK19fcG9zKQorICAgICAgICAgIF9fdGhyZWFkX3Jlc3VsdHNbX19pYW1dID0gX19yKF9fdGhyZWFkX3Jlc3VsdHNbX19pYW1dLAorCQkJCQlfX2YoX19vLCBfX2JlZ2luK19fcG9zKSk7CisgICAgICB9IC8vcGFyYWxsZWwKKworICAgICAgZm9yIChfVGhyZWFkSW5kZXggX19pID0gMDsgX19pIDwgX19udW1fdGhyZWFkczsgKytfX2kpCisgICAgICAgIF9fb3V0cHV0ID0gX19yKF9fb3V0cHV0LCBfX3RocmVhZF9yZXN1bHRzW19faV0pOworCisgICAgICBkZWxldGUgW10gX190aHJlYWRfcmVzdWx0czsKKworICAgICAgLy8gUG9pbnRzIHRvIGxhc3QgZWxlbWVudCBwcm9jZXNzZWQgKG5lZWRlZCBhcyByZXR1cm4gdmFsdWUgZm9yCisgICAgICAvLyBzb21lIGFsZ29yaXRobXMgbGlrZSB0cmFuc2Zvcm0pLgorICAgICAgX19mLl9NX2ZpbmlzaF9pdGVyYXRvciA9IF9fYmVnaW4gKyBfX2xlbmd0aDsKKworICAgICAgcmV0dXJuIF9fbzsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfT01QX0xPT1BfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9vbXBfbG9vcF9zdGF0aWMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvb21wX2xvb3Bfc3RhdGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlmZDA5NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvb21wX2xvb3Bfc3RhdGljLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9vbXBfbG9vcF9zdGF0aWMuaAorICogIEBicmllZiBQYXJhbGxlbGl6YXRpb24gb2YgZW1iYXJyYXNzaW5nbHkgcGFyYWxsZWwgZXhlY3V0aW9uIGJ5CisgKiAgbWVhbnMgb2YgYW4gT3Blbk1QIGZvciBsb29wIHdpdGggc3RhdGljIHNjaGVkdWxpbmcuCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBGZWxpeCBQdXR6ZS4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9PTVBfTE9PUF9TVEFUSUNfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9PTVBfTE9PUF9TVEFUSUNfSCAxCisKKyNpbmNsdWRlIDxvbXAuaD4KKworI2luY2x1ZGUgPHBhcmFsbGVsL3NldHRpbmdzLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvYmFzaWNfaXRlcmF0b3IuaD4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKiBAYnJpZWYgRW1iYXJyYXNzaW5nbHkgcGFyYWxsZWwgYWxnb3JpdGhtIGZvciByYW5kb20gYWNjZXNzCisgICAqIGl0ZXJhdG9ycywgdXNpbmcgYW4gT3Blbk1QIGZvciBsb29wIHdpdGggc3RhdGljIHNjaGVkdWxpbmcuCisgICAqCisgICAqICBAcGFyYW0gX19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBlbGVtZW50IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fZW5kIEVuZCBpdGVyYXRvciBvZiBlbGVtZW50IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fbyBVc2VyLXN1cHBsaWVkIGZ1bmN0b3IgKGNvbXBhcmF0b3IsIHByZWRpY2F0ZSwgYWRkaW5nCisgICAqICBmdW5jdG9yLCAuLi4pLgorICAgKiAgQHBhcmFtIF9fZiBGdW5jdG9yIHRvIEBhIHByb2Nlc3MgYW4gZWxlbWVudCB3aXRoIF9fb3AgKGRlcGVuZHMgb24KKyAgICogIGRlc2lyZWQgZnVuY3Rpb25hbGl0eSwgZS4gZy4gZm9yIHN0ZDo6Zm9yX2VhY2goKSwgLi4uKS4KKyAgICogIEBwYXJhbSBfX3IgRnVuY3RvciB0byBAYSBhZGQgYSBzaW5nbGUgX19yZXN1bHQgdG8gdGhlIGFscmVhZHkgcHJvY2Vzc2VkCisgICAqICBfX2VsZW1lbnRzIChkZXBlbmRzIG9uIGZ1bmN0aW9uYWxpdHkpLgorICAgKiAgQHBhcmFtIF9fYmFzZSBCYXNlIHZhbHVlIGZvciByZWR1Y3Rpb24uCisgICAqICBAcGFyYW0gX19vdXRwdXQgUG9pbnRlciB0byBwb3NpdGlvbiB3aGVyZSBmaW5hbCByZXN1bHQgaXMgd3JpdHRlbiB0bworICAgKiAgQHBhcmFtIF9fYm91bmQgTWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgcHJvY2Vzc2VkIChlLiBnLiBmb3IKKyAgICogIHN0ZDo6Y291bnRfbigpKS4KKyAgICogIEByZXR1cm4gVXNlci1zdXBwbGllZCBmdW5jdG9yICh0aGF0IG1heSBjb250YWluIGEgcGFydCBvZiB0aGUgcmVzdWx0KS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsCisJICAgdHlwZW5hbWUgX09wLAorCSAgIHR5cGVuYW1lIF9GdSwKKwkgICB0eXBlbmFtZSBfUmVkLAorCSAgIHR5cGVuYW1lIF9SZXN1bHQ+CisgICAgX09wCisgICAgX19mb3JfZWFjaF90ZW1wbGF0ZV9yYW5kb21fYWNjZXNzX29tcF9sb29wX3N0YXRpYyhfUkFJdGVyIF9fYmVnaW4sCisJCQkJCQkgICAgICBfUkFJdGVyIF9fZW5kLCBfT3AgX19vLAorCQkJCQkJICAgICAgX0Z1JiBfX2YsIF9SZWQgX19yLAorCQkJCQkJICAgICAgX1Jlc3VsdCBfX2Jhc2UsCisJCQkJCQkgICAgICBfUmVzdWx0JiBfX291dHB1dCwKKyAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUgX19ib3VuZCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2xlbmd0aCA9IF9fZW5kIC0gX19iZWdpbjsKKyAgICAgIF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzID0gc3RkOjptaW48X0RpZmZlcmVuY2VUeXBlPgorCShfX2dldF9tYXhfdGhyZWFkcygpLCBfX2xlbmd0aCk7CisKKyAgICAgIF9SZXN1bHQgKl9fdGhyZWFkX3Jlc3VsdHM7CisKKyMgICAgIHByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoX19udW1fdGhyZWFkcykKKyAgICAgIHsKKyMgICAgICAgcHJhZ21hIG9tcCBzaW5nbGUKKwl7CisJICBfX251bV90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpOworCSAgX190aHJlYWRfcmVzdWx0cyA9IG5ldyBfUmVzdWx0W19fbnVtX3RocmVhZHNdOworCisJICBmb3IgKF9UaHJlYWRJbmRleCBfX2kgPSAwOyBfX2kgPCBfX251bV90aHJlYWRzOyArK19faSkKKwkgICAgX190aHJlYWRfcmVzdWx0c1tfX2ldID0gX1Jlc3VsdCgpOworCX0KKworICAgICAgICBfVGhyZWFkSW5kZXggX19pYW0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYywgX1NldHRpbmdzOjpnZXQoKS53b3Jrc3RlYWxpbmdfY2h1bmtfc2l6ZSkKKyAgICAgICAgZm9yIChfRGlmZmVyZW5jZVR5cGUgX19wb3MgPSAwOyBfX3BvcyA8IF9fbGVuZ3RoOyArK19fcG9zKQorICAgICAgICAgIF9fdGhyZWFkX3Jlc3VsdHNbX19pYW1dID0gX19yKF9fdGhyZWFkX3Jlc3VsdHNbX19pYW1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZihfX28sIF9fYmVnaW4rX19wb3MpKTsKKyAgICAgIH0gLy9wYXJhbGxlbAorCisgICAgICBmb3IgKF9UaHJlYWRJbmRleCBfX2kgPSAwOyBfX2kgPCBfX251bV90aHJlYWRzOyArK19faSkKKwlfX291dHB1dCA9IF9fcihfX291dHB1dCwgX190aHJlYWRfcmVzdWx0c1tfX2ldKTsKKworICAgICAgZGVsZXRlIFtdIF9fdGhyZWFkX3Jlc3VsdHM7CisKKyAgICAgIC8vIFBvaW50cyB0byBsYXN0IGVsZW1lbnQgcHJvY2Vzc2VkIChuZWVkZWQgYXMgcmV0dXJuIHZhbHVlIGZvcgorICAgICAgLy8gc29tZSBhbGdvcml0aG1zIGxpa2UgdHJhbnNmb3JtKS4KKyAgICAgIF9fZi5maW5pc2hfaXRlcmF0b3IgPSBfX2JlZ2luICsgX19sZW5ndGg7CisKKyAgICAgIHJldHVybiBfX287CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX09NUF9MT09QX1NUQVRJQ19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3Bhcl9sb29wLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3Bhcl9sb29wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwNjk3MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvcGFyX2xvb3AuaApAQCAtMCwwICsxLDEzOSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL3Bhcl9sb29wLmgKKyAqICBAYnJpZWYgUGFyYWxsZWxpemF0aW9uIG9mIGVtYmFycmFzc2luZ2x5IHBhcmFsbGVsIGV4ZWN1dGlvbiBieQorICogIG1lYW5zIG9mIGVxdWFsIHNwbGl0dGluZy4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IEZlbGl4IFB1dHplLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX1BBUl9MT09QX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfUEFSX0xPT1BfSCAxCisKKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9zZXR0aW5ncy5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL2Jhc2UuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9lcXVhbGx5X3NwbGl0Lmg+CisKK25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAoreworICAvKiogQGJyaWVmIEVtYmFycmFzc2luZ2x5IHBhcmFsbGVsIGFsZ29yaXRobSBmb3IgcmFuZG9tIGFjY2VzcworICAgKiBpdGVyYXRvcnMsIHVzaW5nIGhhbmQtY3JhZnRlZCBwYXJhbGxlbGl6YXRpb24gYnkgZXF1YWwgc3BsaXR0aW5nCisgICAqIHRoZSB3b3JrLgorICAgKgorICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2YgZWxlbWVudCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2YgZWxlbWVudCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX28gVXNlci1zdXBwbGllZCBmdW5jdG9yIChjb21wYXJhdG9yLCBwcmVkaWNhdGUsIGFkZGluZworICAgKiAgZnVuY3RvciwgLi4uKQorICAgKiAgQHBhcmFtIF9fZiBGdW5jdG9yIHRvICJwcm9jZXNzIiBhbiBlbGVtZW50IHdpdGggX19vcCAoZGVwZW5kcyBvbgorICAgKiAgZGVzaXJlZCBmdW5jdGlvbmFsaXR5LCBlLiBnLiBmb3Igc3RkOjpmb3JfZWFjaCgpLCAuLi4pLgorICAgKiAgQHBhcmFtIF9fciBGdW5jdG9yIHRvICJhZGQiIGEgc2luZ2xlIF9fcmVzdWx0IHRvIHRoZSBhbHJlYWR5CisgICAqICBwcm9jZXNzZWQgZWxlbWVudHMgKGRlcGVuZHMgb24gZnVuY3Rpb25hbGl0eSkuCisgICAqICBAcGFyYW0gX19iYXNlIEJhc2UgdmFsdWUgZm9yIHJlZHVjdGlvbi4KKyAgICogIEBwYXJhbSBfX291dHB1dCBQb2ludGVyIHRvIHBvc2l0aW9uIHdoZXJlIGZpbmFsIHJlc3VsdCBpcyB3cml0dGVuIHRvCisgICAqICBAcGFyYW0gX19ib3VuZCBNYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBwcm9jZXNzZWQgKGUuIGcuIGZvcgorICAgKiAgc3RkOjpjb3VudF9uKCkpLgorICAgKiAgQHJldHVybiBVc2VyLXN1cHBsaWVkIGZ1bmN0b3IgKHRoYXQgbWF5IGNvbnRhaW4gYSBwYXJ0IG9mIHRoZSByZXN1bHQpLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwKKwkgICB0eXBlbmFtZSBfT3AsCisJICAgdHlwZW5hbWUgX0Z1LAorCSAgIHR5cGVuYW1lIF9SZWQsCisJICAgdHlwZW5hbWUgX1Jlc3VsdD4KKyAgICBfT3AKKyAgICBfX2Zvcl9lYWNoX3RlbXBsYXRlX3JhbmRvbV9hY2Nlc3NfZWQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorCQkJCQkgX09wIF9fbywgX0Z1JiBfX2YsIF9SZWQgX19yLAorCQkJCQkgX1Jlc3VsdCBfX2Jhc2UsIF9SZXN1bHQmIF9fb3V0cHV0LAorICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj46OmRpZmZlcmVuY2VfdHlwZSBfX2JvdW5kKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworICAgICAgY29uc3QgX0RpZmZlcmVuY2VUeXBlIF9fbGVuZ3RoID0gX19lbmQgLSBfX2JlZ2luOworICAgICAgX1Jlc3VsdCAqX190aHJlYWRfcmVzdWx0czsKKyAgICAgIGJvb2wqIF9fY29uc3RydWN0ZWQ7CisKKyAgICAgIF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzID0gX19nbnVfcGFyYWxsZWw6Om1pbjxfRGlmZmVyZW5jZVR5cGU+CisJKF9fZ2V0X21heF90aHJlYWRzKCksIF9fbGVuZ3RoKTsKKworIyAgICAgcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyhfX251bV90aHJlYWRzKQorICAgICAgeworIyAgICAgICBwcmFnbWEgb21wIHNpbmdsZQorCXsKKwkgIF9fbnVtX3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCk7CisJICBfX3RocmVhZF9yZXN1bHRzID0gc3RhdGljX2Nhc3Q8X1Jlc3VsdCo+CisJICAgICg6Om9wZXJhdG9yIG5ldyhfX251bV90aHJlYWRzICogc2l6ZW9mKF9SZXN1bHQpKSk7CisJICBfX2NvbnN0cnVjdGVkID0gbmV3IGJvb2xbX19udW1fdGhyZWFkc107CisJfQorCisJX1RocmVhZEluZGV4IF9faWFtID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisKKwkvLyBOZXV0cmFsIGVsZW1lbnQuCisJX1Jlc3VsdCogX19yZWR1Y3Q7CisKKwlfRGlmZmVyZW5jZVR5cGUKKwkgIF9fc3RhcnQgPSBfX2VxdWFsbHlfc3BsaXRfcG9pbnQoX19sZW5ndGgsIF9fbnVtX3RocmVhZHMsIF9faWFtKSwKKwkgIF9fc3RvcCA9IF9fZXF1YWxseV9zcGxpdF9wb2ludChfX2xlbmd0aCwgX19udW1fdGhyZWFkcywgX19pYW0gKyAxKTsKKworCWlmIChfX3N0YXJ0IDwgX19zdG9wKQorCSAgeworCSAgICBfX3JlZHVjdCA9IG5ldyBfUmVzdWx0KF9fZihfX28sIF9fYmVnaW4gKyBfX3N0YXJ0KSk7CisJICAgICsrX19zdGFydDsKKwkgICAgX19jb25zdHJ1Y3RlZFtfX2lhbV0gPSB0cnVlOworCSAgfQorCWVsc2UKKwkgIF9fY29uc3RydWN0ZWRbX19pYW1dID0gZmFsc2U7CisKKwlmb3IgKDsgX19zdGFydCA8IF9fc3RvcDsgKytfX3N0YXJ0KQorCSAgKl9fcmVkdWN0ID0gX19yKCpfX3JlZHVjdCwgX19mKF9fbywgX19iZWdpbiArIF9fc3RhcnQpKTsKKworCWlmIChfX2NvbnN0cnVjdGVkW19faWFtXSkKKwkgIHsKKwkgICAgOjpuZXcoJl9fdGhyZWFkX3Jlc3VsdHNbX19pYW1dKSBfUmVzdWx0KCpfX3JlZHVjdCk7CisJICAgIGRlbGV0ZSBfX3JlZHVjdDsKKwkgIH0KKyAgICAgIH0gLy9wYXJhbGxlbAorCisgICAgICBmb3IgKF9UaHJlYWRJbmRleCBfX2kgPSAwOyBfX2kgPCBfX251bV90aHJlYWRzOyArK19faSkKKwlpZiAoX19jb25zdHJ1Y3RlZFtfX2ldKQorCSAgeworCSAgICBfX291dHB1dCA9IF9fcihfX291dHB1dCwgX190aHJlYWRfcmVzdWx0c1tfX2ldKTsKKwkgICAgX190aHJlYWRfcmVzdWx0c1tfX2ldLn5fUmVzdWx0KCk7CisJICB9CisKKyAgICAgIC8vIFBvaW50cyB0byBsYXN0IGVsZW1lbnQgcHJvY2Vzc2VkIChuZWVkZWQgYXMgcmV0dXJuIHZhbHVlIGZvcgorICAgICAgLy8gc29tZSBhbGdvcml0aG1zIGxpa2UgdHJhbnNmb3JtKS4KKyAgICAgIF9fZi5fTV9maW5pc2hfaXRlcmF0b3IgPSBfX2JlZ2luICsgX19sZW5ndGg7CisKKyAgICAgIDo6b3BlcmF0b3IgZGVsZXRlKF9fdGhyZWFkX3Jlc3VsdHMpOworCisgICAgICBkZWxldGVbXSBfX2NvbnN0cnVjdGVkOworCisgICAgICByZXR1cm4gX19vOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9QQVJfTE9PUF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3BhcmFsbGVsLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3BhcmFsbGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiY2ViZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvcGFyYWxsZWwuaApAQCAtMCwwICsxLDQyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvcGFyYWxsZWwuaAorICogIEBicmllZiBFbmQtdXNlciBpbmNsdWRlIGZpbGUuIFByb3ZpZGVzIGFkdmFuY2VkIHNldHRpbmdzIGFuZAorICogIHR1bmluZyBvcHRpb25zLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgRmVsaXggUHV0emUgYW5kIEpvaGFubmVzIFNpbmdsZXIuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfUEFSQUxMRUxfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9QQVJBTExFTF9IIDEKKworI2luY2x1ZGUgPHBhcmFsbGVsL2ZlYXR1cmVzLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvY29tcGlsZXRpbWVfc2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC90eXBlcy5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3RhZ3MuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9zZXR0aW5ncy5oPgorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfUEFSQUxMRUxfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9wYXJ0aWFsX3N1bS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9wYXJ0aWFsX3N1bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNTFiYWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3BhcnRpYWxfc3VtLmgKQEAgLTAsMCArMSwyMzAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC9wYXJ0aWFsX3N1bS5oCisgKiAgQGJyaWVmIFBhcmFsbGVsIGltcGxlbWVudGF0aW9uIG9mIHN0ZDo6cGFydGlhbF9zdW0oKSwgaS5lLiBwcmVmaXgKKyogIHN1bXMuCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBKb2hhbm5lcyBTaW5nbGVyLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX1BBUlRJQUxfU1VNX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfUEFSVElBTF9TVU1fSCAxCisKKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9wYXJhbGxlbC5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL251bWVyaWNmd2QuaD4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8vIFByb2JsZW06IHRoZXJlIGlzIG5vIDAtZWxlbWVudCBnaXZlbi4KKworICAvKiogQGJyaWVmIEJhc2UgY2FzZSBwcmVmaXggc3VtIHJvdXRpbmUuCisgICAqICBAcGFyYW0gX19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19yZXN1bHQgQmVnaW4gaXRlcmF0b3Igb2Ygb3V0cHV0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fYmluX29wIEFzc29jaWF0aXZlIGJpbmFyeSBmdW5jdGlvbi4KKyAgICogIEBwYXJhbSBfX3ZhbHVlIFN0YXJ0IHZhbHVlLiBNdXN0IGJlIHBhc3NlZCBzaW5jZSB0aGUgbmV1dHJhbAorICAgKiAgZWxlbWVudCBpcyB1bmtub3duIGluIGdlbmVyYWwuCisgICAqICBAcmV0dXJuIEVuZCBpdGVyYXRvciBvZiBvdXRwdXQgc2VxdWVuY2UuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwKKwkgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX3BhcmFsbGVsX3BhcnRpYWxfc3VtX2Jhc2VjYXNlKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsCisJCQkJICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKwkJCQkgICAgX0JpbmFyeU9wZXJhdGlvbiBfX2Jpbl9vcCwKKyAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzIDxfSUl0ZXI+Ojp2YWx1ZV90eXBlIF9fdmFsdWUpCisgICAgeworICAgICAgaWYgKF9fYmVnaW4gPT0gX19lbmQpCisJcmV0dXJuIF9fcmVzdWx0OworCisgICAgICB3aGlsZSAoX19iZWdpbiAhPSBfX2VuZCkKKwl7CisJICBfX3ZhbHVlID0gX19iaW5fb3AoX192YWx1ZSwgKl9fYmVnaW4pOworCSAgKl9fcmVzdWx0ID0gX192YWx1ZTsKKwkgICsrX19yZXN1bHQ7CisJICArK19fYmVnaW47CisJfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICAvKiogQGJyaWVmIFBhcmFsbGVsIHBhcnRpYWwgc3VtIGltcGxlbWVudGF0aW9uLCB0d28tcGhhc2UgYXBwcm9hY2gsCisgICAgICBubyByZWN1cnNpb24uCisgICAgICAqICBAcGFyYW0gX19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICAgICAqICBAcGFyYW0gX19yZXN1bHQgQmVnaW4gaXRlcmF0b3Igb2Ygb3V0cHV0IHNlcXVlbmNlLgorICAgICAgKiAgQHBhcmFtIF9fYmluX29wIEFzc29jaWF0aXZlIGJpbmFyeSBmdW5jdGlvbi4KKyAgICAgICogIEBwYXJhbSBfX24gTGVuZ3RoIG9mIHNlcXVlbmNlLgorICAgICAgKiAgQHJldHVybiBFbmQgaXRlcmF0b3Igb2Ygb3V0cHV0IHNlcXVlbmNlLgorICAgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLAorCSAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fcGFyYWxsZWxfcGFydGlhbF9zdW1fbGluZWFyKF9JSXRlciBfX2JlZ2luLCBfSUl0ZXIgX19lbmQsCisJCQkJICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisJCQkJICBfQmluYXJ5T3BlcmF0aW9uIF9fYmluX29wLAorICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyPjo6ZGlmZmVyZW5jZV90eXBlIF9fbikKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICBpZiAoX19iZWdpbiA9PSBfX2VuZCkKKwlyZXR1cm4gX19yZXN1bHQ7CisKKyAgICAgIF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzID0KKyAgICAgICAgc3RkOjptaW48X0RpZmZlcmVuY2VUeXBlPihfX2dldF9tYXhfdGhyZWFkcygpLCBfX24gLSAxKTsKKworICAgICAgaWYgKF9fbnVtX3RocmVhZHMgPCAyKQorCXsKKwkgICpfX3Jlc3VsdCA9ICpfX2JlZ2luOworCSAgcmV0dXJuIF9fcGFyYWxsZWxfcGFydGlhbF9zdW1fYmFzZWNhc2UoX19iZWdpbiArIDEsIF9fZW5kLAorCQkJCQkJIF9fcmVzdWx0ICsgMSwgX19iaW5fb3AsCisJCQkJCQkgKl9fYmVnaW4pOworCX0KKworICAgICAgX0RpZmZlcmVuY2VUeXBlKiBfX2JvcmRlcnM7CisgICAgICBfVmFsdWVUeXBlKiBfX3N1bXM7CisKKyAgICAgIGNvbnN0IF9TZXR0aW5ncyYgX19zID0gX1NldHRpbmdzOjpnZXQoKTsKKworIyAgICAgcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyhfX251bV90aHJlYWRzKQorICAgICAgeworIyAgICAgICBwcmFnbWEgb21wIHNpbmdsZQorCXsKKwkgIF9fbnVtX3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCk7CisJICAgIAorCSAgX19ib3JkZXJzID0gbmV3IF9EaWZmZXJlbmNlVHlwZVtfX251bV90aHJlYWRzICsgMl07CisKKwkgIGlmIChfX3MucGFydGlhbF9zdW1fZGlsYXRpb24gPT0gMS4wZikKKwkgICAgX19lcXVhbGx5X3NwbGl0KF9fbiwgX19udW1fdGhyZWFkcyArIDEsIF9fYm9yZGVycyk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfRGlmZmVyZW5jZVR5cGUgX19maXJzdF9wYXJ0X2xlbmd0aCA9CisJCSAgc3RkOjptYXg8X0RpZmZlcmVuY2VUeXBlPigxLAorCQkgICAgX19uIC8gKDEuMGYgKyBfX3MucGFydGlhbF9zdW1fZGlsYXRpb24gKiBfX251bV90aHJlYWRzKSk7CisJICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fY2h1bmtfbGVuZ3RoID0KKwkJICAoX19uIC0gX19maXJzdF9wYXJ0X2xlbmd0aCkgLyBfX251bV90aHJlYWRzOworCSAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2JvcmRlcnN0YXJ0ID0KKwkJICBfX24gLSBfX251bV90aHJlYWRzICogX19jaHVua19sZW5ndGg7CisJICAgICAgX19ib3JkZXJzWzBdID0gMDsKKwkgICAgICBmb3IgKF9UaHJlYWRJbmRleCBfX2kgPSAxOyBfX2kgPCAoX19udW1fdGhyZWFkcyArIDEpOyArK19faSkKKwkJeworCQkgIF9fYm9yZGVyc1tfX2ldID0gX19ib3JkZXJzdGFydDsKKwkJICBfX2JvcmRlcnN0YXJ0ICs9IF9fY2h1bmtfbGVuZ3RoOworCQl9CisJICAgICAgX19ib3JkZXJzW19fbnVtX3RocmVhZHMgKyAxXSA9IF9fbjsKKwkgICAgfQorCisJICBfX3N1bXMgPSBzdGF0aWNfY2FzdDxfVmFsdWVUeXBlKj4oOjpvcGVyYXRvciBuZXcoc2l6ZW9mKF9WYWx1ZVR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogX19udW1fdGhyZWFkcykpOworCSAgX091dHB1dEl0ZXJhdG9yIF9fdGFyZ2V0X2VuZDsKKwl9IC8vc2luZ2xlCisKKyAgICAgICAgX1RocmVhZEluZGV4IF9faWFtID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgIGlmIChfX2lhbSA9PSAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICpfX3Jlc3VsdCA9ICpfX2JlZ2luOworICAgICAgICAgICAgX19wYXJhbGxlbF9wYXJ0aWFsX3N1bV9iYXNlY2FzZShfX2JlZ2luICsgMSwKKwkJCQkJICAgIF9fYmVnaW4gKyBfX2JvcmRlcnNbMV0sCisJCQkJCSAgICBfX3Jlc3VsdCArIDEsCisJCQkJCSAgICBfX2Jpbl9vcCwgKl9fYmVnaW4pOworICAgICAgICAgICAgOjpuZXcoJihfX3N1bXNbX19pYW1dKSkgX1ZhbHVlVHlwZSgqKF9fcmVzdWx0ICsgX19ib3JkZXJzWzFdIC0gMSkpOworICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIDo6bmV3KCYoX19zdW1zW19faWFtXSkpCisgICAgICAgICAgICAgIF9WYWx1ZVR5cGUoX19nbnVfcGFyYWxsZWw6OmFjY3VtdWxhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYmVnaW4gKyBfX2JvcmRlcnNbX19pYW1dICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iZWdpbiArIF9fYm9yZGVyc1tfX2lhbSArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKF9fYmVnaW4gKyBfX2JvcmRlcnNbX19pYW1dKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iaW5fb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZ251X3BhcmFsbGVsOjpzZXF1ZW50aWFsX3RhZygpKSk7CisgICAgICAgICAgfQorCisjICAgICAgIHByYWdtYSBvbXAgYmFycmllcgorCisjICAgICAgIHByYWdtYSBvbXAgc2luZ2xlCisJX19wYXJhbGxlbF9wYXJ0aWFsX3N1bV9iYXNlY2FzZShfX3N1bXMgKyAxLCBfX3N1bXMgKyBfX251bV90aHJlYWRzLAorCQkJCQlfX3N1bXMgKyAxLCBfX2Jpbl9vcCwgX19zdW1zWzBdKTsKKworIyAgICAgICBwcmFnbWEgb21wIGJhcnJpZXIKKworCS8vIFN0aWxsIHNhbWUgdGVhbS4KKyAgICAgICAgX19wYXJhbGxlbF9wYXJ0aWFsX3N1bV9iYXNlY2FzZShfX2JlZ2luICsgX19ib3JkZXJzW19faWFtICsgMV0sCisJCQkJCV9fYmVnaW4gKyBfX2JvcmRlcnNbX19pYW0gKyAyXSwKKwkJCQkJX19yZXN1bHQgKyBfX2JvcmRlcnNbX19pYW0gKyAxXSwKKwkJCQkJX19iaW5fb3AsIF9fc3Vtc1tfX2lhbV0pOworICAgICAgfSAvL3BhcmFsbGVsCisKKyAgICAgIGZvciAoX1RocmVhZEluZGV4IF9faSA9IDA7IF9faSA8IF9fbnVtX3RocmVhZHM7ICsrX19pKQorCV9fc3Vtc1tfX2ldLn5fVmFsdWVUeXBlKCk7CisgICAgICA6Om9wZXJhdG9yIGRlbGV0ZShfX3N1bXMpOworCisgICAgICBkZWxldGVbXSBfX2JvcmRlcnM7CisKKyAgICAgIHJldHVybiBfX3Jlc3VsdCArIF9fbjsKKyAgICB9CisKKyAgLyoqIEBicmllZiBQYXJhbGxlbCBwYXJ0aWFsIHN1bSBmcm9udC1fX2VuZC4KKyAgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fZW5kIEVuZCBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX3Jlc3VsdCBCZWdpbiBpdGVyYXRvciBvZiBvdXRwdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19iaW5fb3AgQXNzb2NpYXRpdmUgYmluYXJ5IGZ1bmN0aW9uLgorICAgKiAgQHJldHVybiBFbmQgaXRlcmF0b3Igb2Ygb3V0cHV0IHNlcXVlbmNlLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsCisJICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlPcGVyYXRpb24+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgX19wYXJhbGxlbF9wYXJ0aWFsX3N1bShfSUl0ZXIgX19iZWdpbiwgX0lJdGVyIF9fZW5kLAorCQkJICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQmluYXJ5T3BlcmF0aW9uIF9fYmluX29wKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19iZWdpbiAtIF9fZW5kKQorCisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19uID0gX19lbmQgLSBfX2JlZ2luOworCisgICAgICBzd2l0Y2ggKF9TZXR0aW5nczo6Z2V0KCkucGFydGlhbF9zdW1fYWxnb3JpdGhtKQorCXsKKwljYXNlIExJTkVBUjoKKwkgIC8vIE5lZWQgYW4gaW5pdGlhbCBvZmZzZXQuCisJICByZXR1cm4gX19wYXJhbGxlbF9wYXJ0aWFsX3N1bV9saW5lYXIoX19iZWdpbiwgX19lbmQsIF9fcmVzdWx0LAorCQkJCQkgICAgICAgX19iaW5fb3AsIF9fbik7CisJZGVmYXVsdDoKKwkgIC8vIFBhcnRpYWxfc3VtIGFsZ29yaXRobSBub3QgaW1wbGVtZW50ZWQuCisJICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoMCk7CisJICByZXR1cm4gX19yZXN1bHQgKyBfX247CisJfQorICAgIH0KK30KKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX1BBUlRJQUxfU1VNX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvcGFydGl0aW9uLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3BhcnRpdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYzQzZDkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3BhcnRpdGlvbi5oCkBAIC0wLDAgKzEsNDM0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvcGFydGl0aW9uLmgKKyAqICBAYnJpZWYgUGFyYWxsZWwgaW1wbGVtZW50YXRpb24gb2Ygc3RkOjpwYXJ0aXRpb24oKSwKKyAqICBzdGQ6Om50aF9lbGVtZW50KCksIGFuZCBzdGQ6OnBhcnRpYWxfc29ydCgpLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgSm9oYW5uZXMgU2luZ2xlciBhbmQgRmVsaXggUHV0emUuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfUEFSVElUSU9OX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfUEFSVElUSU9OX0ggMQorCisjaW5jbHVkZSA8cGFyYWxsZWwvYmFzaWNfaXRlcmF0b3IuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9zb3J0Lmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvcmFuZG9tX251bWJlci5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ28uaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9wYXJhbGxlbC5oPgorCisvKiogQGJyaWVmIERlY2lkZSB3aGV0aGVyIHRvIGRlY2xhcmUgY2VydGFpbiB2YXJpYWJsZXMgdm9sYXRpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX1ZPTEFUSUxFIHZvbGF0aWxlCisKK25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAoreworICAvKiogQGJyaWVmIFBhcmFsbGVsIGltcGxlbWVudGF0aW9uIG9mIHN0ZDo6cGFydGl0aW9uLgorICAgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlIHRvIHNwbGl0LgorICAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UgdG8gc3BsaXQuCisgICAgKiAgQHBhcmFtIF9fcHJlZCBQYXJ0aXRpb24gcHJlZGljYXRlLCBwb3NzaWJseSBpbmNsdWRpbmcgc29tZSBraW5kCisgICAgKiAgICAgICAgIG9mIHBpdm90LgorICAgICogIEBwYXJhbSBfX251bV90aHJlYWRzIE1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlIGZvciB0aGlzIHRhc2suCisgICAgKiAgQHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgbm90IGZ1bGZpbGxpbmcgdGhlIHByZWRpY2F0ZS4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgX19wYXJhbGxlbF9wYXJ0aXRpb24oX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorCQkJIF9QcmVkaWNhdGUgX19wcmVkLCBfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcykKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbiA9IF9fZW5kIC0gX19iZWdpbjsKKworICAgICAgX0dMSUJDWFhfQ0FMTChfX24pCisKKyAgICAgIGNvbnN0IF9TZXR0aW5ncyYgX19zID0gX1NldHRpbmdzOjpnZXQoKTsKKworICAgICAgLy8gc2hhcmVkCisgICAgICBfR0xJQkNYWF9WT0xBVElMRSBfRGlmZmVyZW5jZVR5cGUgX19sZWZ0ID0gMCwgX19yaWdodCA9IF9fbiAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kaXN0ID0gX19uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbGVmdG92ZXJfbGVmdCwgX19sZWZ0b3Zlcl9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2xlZnRuZXcsIF9fcmlnaHRuZXc7CisKKyAgICAgIC8vIGp1c3QgMCBvciAxLCBidXQgaW50IHRvIGFsbG93IGF0b21pYyBvcGVyYXRpb25zCisgICAgICBpbnQqIF9fcmVzZXJ2ZWRfbGVmdCA9IDAsICogX19yZXNlcnZlZF9yaWdodCA9IDA7CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2NodW5rX3NpemUgPSBfX3MucGFydGl0aW9uX2NodW5rX3NpemU7CisKKyAgICAgIC8vYXQgbGVhc3QgdHdvIGNodW5rcyBwZXIgdGhyZWFkCisgICAgICBpZiAoX19kaXN0ID49IDIgKiBfX251bV90aHJlYWRzICogX19jaHVua19zaXplKQorIyAgICAgICBwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzKF9fbnVtX3RocmVhZHMpCisJeworIyAgICAgICAgIHByYWdtYSBvbXAgc2luZ2xlCisJICB7CisJICAgIF9fbnVtX3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCk7CisJICAgIF9fcmVzZXJ2ZWRfbGVmdCA9IG5ldyBpbnRbX19udW1fdGhyZWFkc107CisJICAgIF9fcmVzZXJ2ZWRfcmlnaHQgPSBuZXcgaW50W19fbnVtX3RocmVhZHNdOworCisJICAgIGlmIChfX3MucGFydGl0aW9uX2NodW5rX3NoYXJlID4gMC4wKQorCSAgICAgIF9fY2h1bmtfc2l6ZSA9IHN0ZDo6bWF4PF9EaWZmZXJlbmNlVHlwZT4KKwkJKF9fcy5wYXJ0aXRpb25fY2h1bmtfc2l6ZSwgKGRvdWJsZSlfX24gCisJCSAqIF9fcy5wYXJ0aXRpb25fY2h1bmtfc2hhcmUgLyAoZG91YmxlKV9fbnVtX3RocmVhZHMpOworCSAgICBlbHNlCisJICAgICAgX19jaHVua19zaXplID0gX19zLnBhcnRpdGlvbl9jaHVua19zaXplOworCSAgfQorCisJICB3aGlsZSAoX19kaXN0ID49IDIgKiBfX251bV90aHJlYWRzICogX19jaHVua19zaXplKQorCSAgICB7CisjICAgICAgICAgICAgIHByYWdtYSBvbXAgc2luZ2xlCisJICAgICAgeworCQlfRGlmZmVyZW5jZVR5cGUgX19udW1fY2h1bmtzID0gX19kaXN0IC8gX19jaHVua19zaXplOworCisJCWZvciAoX1RocmVhZEluZGV4IF9fciA9IDA7IF9fciA8IF9fbnVtX3RocmVhZHM7ICsrX19yKQorCQkgIHsKKwkJICAgIF9fcmVzZXJ2ZWRfbGVmdCBbX19yXSA9IDA7IC8vIGZhbHNlCisJCSAgICBfX3Jlc2VydmVkX3JpZ2h0W19fcl0gPSAwOyAvLyBmYWxzZQorCQkgIH0KKwkJX19sZWZ0b3Zlcl9sZWZ0ID0gMDsKKwkJX19sZWZ0b3Zlcl9yaWdodCA9IDA7CisJICAgICAgfSAvL2ltcGxpY2l0IGJhcnJpZXIKKworCSAgICAgIC8vIFByaXZhdGUuCisJICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fdGhyZWFkX2xlZnQsIF9fdGhyZWFkX2xlZnRfYm9yZGVyLAorCQkgICAgICAgICAgICAgIF9fdGhyZWFkX3JpZ2h0LCBfX3RocmVhZF9yaWdodF9ib3JkZXI7CisKKwkgICAgICBfX3RocmVhZF9sZWZ0ID0gX19sZWZ0ICsgMTsKKwkgICAgICAvLyBKdXN0IHRvIHNhdGlzZnkgdGhlIGNvbmRpdGlvbiBiZWxvdy4KKwkgICAgICBfX3RocmVhZF9sZWZ0X2JvcmRlciA9IF9fdGhyZWFkX2xlZnQgLSAxOworCisJICAgICAgX190aHJlYWRfcmlnaHQgPSBfX24gLSAxOworICAgICAgICAgICAgIC8vIEp1c3QgdG8gc2F0aXNmeSB0aGUgY29uZGl0aW9uIGJlbG93LgorCSAgICAgIF9fdGhyZWFkX3JpZ2h0X2JvcmRlciA9IF9fdGhyZWFkX3JpZ2h0ICsgMTsKKworCSAgICAgIGJvb2wgX19pYW1fZmluaXNoZWQgPSBmYWxzZTsKKwkgICAgICB3aGlsZSAoIV9faWFtX2ZpbmlzaGVkKQorCQl7CisJCSAgaWYgKF9fdGhyZWFkX2xlZnQgPiBfX3RocmVhZF9sZWZ0X2JvcmRlcikKKwkJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBfRGlmZmVyZW5jZVR5cGUgX19mb3JtZXJfZGlzdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ZldGNoX2FuZF9hZGQoJl9fZGlzdCwgLV9fY2h1bmtfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKF9fZm9ybWVyX2Rpc3QgPCBfX2NodW5rX3NpemUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZmV0Y2hfYW5kX2FkZCgmX19kaXN0LCBfX2NodW5rX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICBfX2lhbV9maW5pc2hlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX190aHJlYWRfbGVmdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mZXRjaF9hbmRfYWRkKCZfX2xlZnQsIF9fY2h1bmtfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGhyZWFkX2xlZnRfYm9yZGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RocmVhZF9sZWZ0ICsgKF9fY2h1bmtfc2l6ZSAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkgICAgfQorCisJCSAgaWYgKF9fdGhyZWFkX3JpZ2h0IDwgX190aHJlYWRfcmlnaHRfYm9yZGVyKQorCQkgICAgeworICAgICAgICAgICAgICAgICAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2Zvcm1lcl9kaXN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZmV0Y2hfYW5kX2FkZCgmX19kaXN0LCAtX19jaHVua19zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoX19mb3JtZXJfZGlzdCA8IF9fY2h1bmtfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19mZXRjaF9hbmRfYWRkKCZfX2Rpc3QsIF9fY2h1bmtfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIF9faWFtX2ZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RocmVhZF9yaWdodCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mZXRjaF9hbmRfYWRkKCZfX3JpZ2h0LCAtX19jaHVua19zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX190aHJlYWRfcmlnaHRfYm9yZGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RocmVhZF9yaWdodCAtIChfX2NodW5rX3NpemUgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJICAgIH0KKworCQkgIC8vIFN3YXAgYXMgdXN1YWwuCisJCSAgd2hpbGUgKF9fdGhyZWFkX2xlZnQgPCBfX3RocmVhZF9yaWdodCkKKwkJICAgIHsKKwkJICAgICAgd2hpbGUgKF9fcHJlZChfX2JlZ2luW19fdGhyZWFkX2xlZnRdKQorCQkJICAgICAmJiBfX3RocmVhZF9sZWZ0IDw9IF9fdGhyZWFkX2xlZnRfYm9yZGVyKQorCQkJKytfX3RocmVhZF9sZWZ0OworCQkgICAgICB3aGlsZSAoIV9fcHJlZChfX2JlZ2luW19fdGhyZWFkX3JpZ2h0XSkKKwkJCSAgICAgJiYgX190aHJlYWRfcmlnaHQgPj0gX190aHJlYWRfcmlnaHRfYm9yZGVyKQorCQkJLS1fX3RocmVhZF9yaWdodDsKKworCQkgICAgICBpZiAoX190aHJlYWRfbGVmdCA+IF9fdGhyZWFkX2xlZnRfYm9yZGVyCisJCQkgIHx8IF9fdGhyZWFkX3JpZ2h0IDwgX190aHJlYWRfcmlnaHRfYm9yZGVyKQorCQkJLy8gRmV0Y2ggbmV3IGNodW5rKF9fcykuCisJCQlicmVhazsKKworCQkgICAgICBzdGQ6Oml0ZXJfc3dhcChfX2JlZ2luICsgX190aHJlYWRfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19iZWdpbiArIF9fdGhyZWFkX3JpZ2h0KTsKKwkJICAgICAgKytfX3RocmVhZF9sZWZ0OworCQkgICAgICAtLV9fdGhyZWFkX3JpZ2h0OworCQkgICAgfQorCQl9CisKKwkgICAgICAvLyBOb3cgc3dhcCB0aGUgbGVmdG92ZXIgY2h1bmtzIHRvIHRoZSByaWdodCBwbGFjZXMuCisJICAgICAgaWYgKF9fdGhyZWFkX2xlZnQgPD0gX190aHJlYWRfbGVmdF9ib3JkZXIpCisjICAgICAgICAgICAgICAgcHJhZ21hIG9tcCBhdG9taWMKKwkJKytfX2xlZnRvdmVyX2xlZnQ7CisJICAgICAgaWYgKF9fdGhyZWFkX3JpZ2h0ID49IF9fdGhyZWFkX3JpZ2h0X2JvcmRlcikKKyMgICAgICAgICAgICAgICBwcmFnbWEgb21wIGF0b21pYworCQkrK19fbGVmdG92ZXJfcmlnaHQ7CisKKyMgICAgICAgICAgICAgcHJhZ21hIG9tcCBiYXJyaWVyCisKKyAgICAgICAgICAgICAgX0RpZmZlcmVuY2VUeXBlCisgICAgICAgICAgICAgICAgICAgIF9fbGVmdG9sZCA9IF9fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgX19sZWZ0bmV3ID0gX19sZWZ0IC0gX19sZWZ0b3Zlcl9sZWZ0ICogX19jaHVua19zaXplLAorICAgICAgICAgICAgICAgICAgICBfX3JpZ2h0b2xkID0gX19yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgX19yaWdodG5ldyA9IF9fcmlnaHQgKyBfX2xlZnRvdmVyX3JpZ2h0ICogX19jaHVua19zaXplOworCisJICAgICAgLy8gPD0+IF9fdGhyZWFkX2xlZnRfYm9yZGVyICsgKF9fY2h1bmtfc2l6ZSAtIDEpID49IF9fbGVmdG5ldworCSAgICAgIGlmIChfX3RocmVhZF9sZWZ0IDw9IF9fdGhyZWFkX2xlZnRfYm9yZGVyCisJCSAgJiYgX190aHJlYWRfbGVmdF9ib3JkZXIgPj0gX19sZWZ0bmV3KQorCQl7CisJCSAgLy8gQ2h1bmsgYWxyZWFkeSBpbiBwbGFjZSwgcmVzZXJ2ZSBzcG90LgorCQlfX3Jlc2VydmVkX2xlZnRbKF9fbGVmdCAtIChfX3RocmVhZF9sZWZ0X2JvcmRlciArIDEpKQorCQkJCS8gX19jaHVua19zaXplXSA9IDE7CisJCX0KKworCSAgICAgIC8vIDw9PiBfX3RocmVhZF9yaWdodF9ib3JkZXIgLSAoX19jaHVua19zaXplIC0gMSkgPD0gX19yaWdodG5ldworCSAgICAgIGlmIChfX3RocmVhZF9yaWdodCA+PSBfX3RocmVhZF9yaWdodF9ib3JkZXIKKwkJICAmJiBfX3RocmVhZF9yaWdodF9ib3JkZXIgPD0gX19yaWdodG5ldykKKwkJeworCQkgIC8vIENodW5rIGFscmVhZHkgaW4gcGxhY2UsIHJlc2VydmUgc3BvdC4KKwkJICBfX3Jlc2VydmVkX3JpZ2h0WygoX190aHJlYWRfcmlnaHRfYm9yZGVyIC0gMSkgLSBfX3JpZ2h0KQorCQkJCSAgIC8gX19jaHVua19zaXplXSA9IDE7CisJCX0KKworIyAgICAgICAgICAgICBwcmFnbWEgb21wIGJhcnJpZXIKKworCSAgICAgIGlmIChfX3RocmVhZF9sZWZ0IDw9IF9fdGhyZWFkX2xlZnRfYm9yZGVyCisJCSAgJiYgX190aHJlYWRfbGVmdF9ib3JkZXIgPCBfX2xlZnRuZXcpCisJCXsKKwkJICAvLyBGaW5kIHNwb3QgYW5kIHN3YXAuCisJCSAgX0RpZmZlcmVuY2VUeXBlIF9fc3dhcHN0YXJ0ID0gLTE7CisgICAgICAgICAgICAgICAgICBmb3IgKGludCBfX3IgPSAwOyBfX3IgPCBfX2xlZnRvdmVyX2xlZnQ7ICsrX19yKQorICAgICAgICAgICAgICAgICAgICBpZiAoX19yZXNlcnZlZF9sZWZ0W19fcl0gPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgX19jb21wYXJlX2FuZF9zd2FwKCYoX19yZXNlcnZlZF9sZWZ0W19fcl0pLCAwLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX3N3YXBzdGFydCA9IF9fbGVmdG9sZCAtIChfX3IgKyAxKSAqIF9fY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIH0KKworI2lmIF9HTElCQ1hYX0FTU0VSVElPTlMKKwkJICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX19zd2Fwc3RhcnQgIT0gLTEpOworI2VuZGlmCisKKwkJICBzdGQ6OnN3YXBfcmFuZ2VzKF9fYmVnaW4gKyBfX3RocmVhZF9sZWZ0X2JvcmRlcgorCQkJCSAgIC0gKF9fY2h1bmtfc2l6ZSAtIDEpLAorCQkJCSAgIF9fYmVnaW4gKyBfX3RocmVhZF9sZWZ0X2JvcmRlciArIDEsCisJCQkJICAgX19iZWdpbiArIF9fc3dhcHN0YXJ0KTsKKwkJfQorCisJICAgICAgaWYgKF9fdGhyZWFkX3JpZ2h0ID49IF9fdGhyZWFkX3JpZ2h0X2JvcmRlcgorCQkgICYmIF9fdGhyZWFkX3JpZ2h0X2JvcmRlciA+IF9fcmlnaHRuZXcpCisJCXsKKwkJICAvLyBGaW5kIHNwb3QgYW5kIHN3YXAKKwkJICBfRGlmZmVyZW5jZVR5cGUgX19zd2Fwc3RhcnQgPSAtMTsKKyAgICAgICAgICAgICAgICAgIGZvciAoaW50IF9fciA9IDA7IF9fciA8IF9fbGVmdG92ZXJfcmlnaHQ7ICsrX19yKQorICAgICAgICAgICAgICAgICAgICBpZiAoX19yZXNlcnZlZF9yaWdodFtfX3JdID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIF9fY29tcGFyZV9hbmRfc3dhcCgmKF9fcmVzZXJ2ZWRfcmlnaHRbX19yXSksIDAsIDEpKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fc3dhcHN0YXJ0ID0gX19yaWdodG9sZCArIF9fciAqIF9fY2h1bmtfc2l6ZSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICB9CisKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisJCSAgX0dMSUJDWFhfUEFSQUxMRUxfQVNTRVJUKF9fc3dhcHN0YXJ0ICE9IC0xKTsKKyNlbmRpZgorCisJCSAgc3RkOjpzd2FwX3JhbmdlcyhfX2JlZ2luICsgX190aHJlYWRfcmlnaHRfYm9yZGVyLAorCQkJCSAgIF9fYmVnaW4gKyBfX3RocmVhZF9yaWdodF9ib3JkZXIKKwkJCQkgICArIF9fY2h1bmtfc2l6ZSwgX19iZWdpbiArIF9fc3dhcHN0YXJ0KTsKKwkgICAgICB9CisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworIyAgICAgICAgICAgICBwcmFnbWEgb21wIGJhcnJpZXIKKworIyAgICAgICAgICAgICBwcmFnbWEgb21wIHNpbmdsZQorCSAgICAgIHsKKwkJZm9yIChfRGlmZmVyZW5jZVR5cGUgX19yID0gMDsgX19yIDwgX19sZWZ0b3Zlcl9sZWZ0OyArK19fcikKKwkJICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX19yZXNlcnZlZF9sZWZ0W19fcl0gPT0gMSk7CisJCWZvciAoX0RpZmZlcmVuY2VUeXBlIF9fciA9IDA7IF9fciA8IF9fbGVmdG92ZXJfcmlnaHQ7ICsrX19yKQorCQkgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfX3Jlc2VydmVkX3JpZ2h0W19fcl0gPT0gMSk7CisJICAgICAgfQorI2VuZGlmCisKKwkgICAgICBfX2xlZnQgPSBfX2xlZnRuZXc7CisJICAgICAgX19yaWdodCA9IF9fcmlnaHRuZXc7CisgICAgICAgICAgICAgIF9fZGlzdCA9IF9fcmlnaHQgLSBfX2xlZnQgKyAxOworCSAgICB9CisKKyMgICAgICAgICAgIHByYWdtYSBvbXAgZmx1c2goX19sZWZ0LCBfX3JpZ2h0KQorCX0gLy8gZW5kICJyZWN1cnNpb24iIC8vcGFyYWxsZWwKKworICAgICAgICBfRGlmZmVyZW5jZVR5cGUgX19maW5hbF9sZWZ0ID0gX19sZWZ0LCBfX2ZpbmFsX3JpZ2h0ID0gX19yaWdodDsKKworCXdoaWxlIChfX2ZpbmFsX2xlZnQgPCBfX2ZpbmFsX3JpZ2h0KQorCSAgeworCSAgICAvLyBHbyByaWdodCB1bnRpbCBrZXkgaXMgZ2VxIHRoYW4gcGl2b3QuCisJICAgIHdoaWxlIChfX3ByZWQoX19iZWdpbltfX2ZpbmFsX2xlZnRdKQorCQkgICAmJiBfX2ZpbmFsX2xlZnQgPCBfX2ZpbmFsX3JpZ2h0KQorCSAgICAgICsrX19maW5hbF9sZWZ0OworCisJICAgIC8vIEdvIGxlZnQgdW50aWwga2V5IGlzIGxlc3MgdGhhbiBwaXZvdC4KKwkgICAgd2hpbGUgKCFfX3ByZWQoX19iZWdpbltfX2ZpbmFsX3JpZ2h0XSkKKwkJICAgJiYgX19maW5hbF9sZWZ0IDwgX19maW5hbF9yaWdodCkKKwkgICAgICAtLV9fZmluYWxfcmlnaHQ7CisKKwkgICAgaWYgKF9fZmluYWxfbGVmdCA9PSBfX2ZpbmFsX3JpZ2h0KQorCSAgICAgIGJyZWFrOworCSAgICBzdGQ6Oml0ZXJfc3dhcChfX2JlZ2luICsgX19maW5hbF9sZWZ0LCBfX2JlZ2luICsgX19maW5hbF9yaWdodCk7CisJICAgICsrX19maW5hbF9sZWZ0OworCSAgICAtLV9fZmluYWxfcmlnaHQ7CisJICB9CisKKwkvLyBBbGwgZWxlbWVudHMgb24gdGhlIGxlZnQgc2lkZSBhcmUgPCBwaXYsIGFsbCBlbGVtZW50cyBvbiB0aGUKKwkvLyByaWdodCBhcmUgPj0gcGl2CisJZGVsZXRlW10gX19yZXNlcnZlZF9sZWZ0OworCWRlbGV0ZVtdIF9fcmVzZXJ2ZWRfcmlnaHQ7CisKKwkvLyBFbGVtZW50ICJiZXR3ZWVuIiBfX2ZpbmFsX2xlZnQgYW5kIF9fZmluYWxfcmlnaHQgbWlnaHQgbm90IGhhdmUKKwkvLyBiZWVuIHJlZ2FyZGVkIHlldAorCWlmIChfX2ZpbmFsX2xlZnQgPCBfX24gJiYgIV9fcHJlZChfX2JlZ2luW19fZmluYWxfbGVmdF0pKQorCSAgLy8gUmVhbGx5IHN3YXBwZWQuCisJICByZXR1cm4gX19maW5hbF9sZWZ0OworCWVsc2UKKwkgIHJldHVybiBfX2ZpbmFsX2xlZnQgKyAxOworICAgIH0KKworICAvKioKKyAgICAqICBAYnJpZWYgUGFyYWxsZWwgaW1wbGVtZW50YXRpb24gb2Ygc3RkOjpudGhfZWxlbWVudCgpLgorICAgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgICogIEBwYXJhbSBfX250aCBfSXRlcmF0b3Igb2YgZWxlbWVudCB0aGF0IG11c3QgYmUgaW4gcG9zaXRpb24gYWZ0ZXJ3YXJkcy4KKyAgICAqICBAcGFyYW0gX19lbmQgRW5kIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgICogIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvci4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkIAorICAgIF9fcGFyYWxsZWxfbnRoX2VsZW1lbnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fbnRoLCAKKwkJCSAgIF9SQUl0ZXIgX19lbmQsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgX0dMSUJDWFhfQ0FMTChfX2VuZCAtIF9fYmVnaW4pCisKKyAgICAgIF9SQUl0ZXIgX19zcGxpdDsKKyAgICAgIF9SYW5kb21OdW1iZXIgX19ybmc7CisKKyAgICAgIGNvbnN0IF9TZXR0aW5ncyYgX19zID0gX1NldHRpbmdzOjpnZXQoKTsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX21pbmltdW1fbGVuZ3RoID0gc3RkOjptYXg8X0RpZmZlcmVuY2VUeXBlPigyLAorICAgICAgICBzdGQ6Om1heChfX3MubnRoX2VsZW1lbnRfbWluaW1hbF9uLCBfX3MucGFydGl0aW9uX21pbmltYWxfbikpOworCisgICAgICAvLyBCcmVhayBpZiBpbnB1dCByYW5nZSB0byBzbWFsbC4KKyAgICAgIHdoaWxlIChzdGF0aWNfY2FzdDxfU2VxdWVuY2VJbmRleD4oX19lbmQgLSBfX2JlZ2luKSA+PSBfX21pbmltdW1fbGVuZ3RoKQorCXsKKyAgICAgICAgICBfRGlmZmVyZW5jZVR5cGUgX19uID0gX19lbmQgLSBfX2JlZ2luOworCisgICAgICAgICAgX1JBSXRlciBfX3Bpdm90X3BvcyA9IF9fYmVnaW4gKyBfX3JuZyhfX24pOworCisgICAgICAgICAgLy8gU3dhcCBfX3Bpdm90X3BvcyB2YWx1ZSB0byBlbmQuCisgICAgICAgICAgaWYgKF9fcGl2b3RfcG9zICE9IChfX2VuZCAtIDEpKQorICAgICAgICAgICAgc3RkOjppdGVyX3N3YXAoX19waXZvdF9wb3MsIF9fZW5kIC0gMSk7CisgICAgICAgICAgX19waXZvdF9wb3MgPSBfX2VuZCAtIDE7CisKKyAgICAgICAgICAvLyBfQ29tcGFyZSBtdXN0IGhhdmUgZmlyc3RfdmFsdWVfdHlwZSwgc2Vjb25kX3ZhbHVlX3R5cGUsCisgICAgICAgICAgLy8gcmVzdWx0X3R5cGUKKyAgICAgICAgICAvLyBfQ29tcGFyZSA9PQorICAgICAgICAgIC8vIF9fZ251X3BhcmFsbGVsOjpfTGV4aWNvZ3JhcGhpYzxTLCBpbnQsCisJICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbnVfcGFyYWxsZWw6Ol9MZXNzPFMsIFM+ID4KKyAgICAgICAgICAvLyBfX3Bpdm90X3BvcyA9PSBzdGQ6OnBhaXI8UywgaW50PioKKyAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X19iaW5kZXIybmQ8X0NvbXBhcmUsIF9WYWx1ZVR5cGUsIF9WYWx1ZVR5cGUsIGJvb2w+CisgICAgICAgICAgICBfX3ByZWQoX19jb21wLCAqX19waXZvdF9wb3MpOworCisgICAgICAgICAgLy8gRGl2aWRlLCBsZWF2ZSBwaXZvdCB1bmNoYW5nZWQgaW4gbGFzdCBwbGFjZS4KKyAgICAgICAgICBfUkFJdGVyIF9fc3BsaXRfcG9zMSwgX19zcGxpdF9wb3MyOworICAgICAgICAgIF9fc3BsaXRfcG9zMSA9IF9fYmVnaW4gKyBfX3BhcmFsbGVsX3BhcnRpdGlvbihfX2JlZ2luLCBfX2VuZCAtIDEsCisJCQkJCQkJX19wcmVkLAorCQkJCQkJCV9fZ2V0X21heF90aHJlYWRzKCkpOworCisgICAgICAgICAgLy8gTGVmdCBzaWRlOiA8IF9fcGl2b3RfcG9zOyBfX3JpZ2h0IHNpZGU6ID49IF9fcGl2b3RfcG9zCisKKyAgICAgICAgICAvLyBTd2FwIHBpdm90IGJhY2sgdG8gbWlkZGxlLgorICAgICAgICAgIGlmIChfX3NwbGl0X3BvczEgIT0gX19waXZvdF9wb3MpCisgICAgICAgICAgICBzdGQ6Oml0ZXJfc3dhcChfX3NwbGl0X3BvczEsIF9fcGl2b3RfcG9zKTsKKyAgICAgICAgICBfX3Bpdm90X3BvcyA9IF9fc3BsaXRfcG9zMTsKKworICAgICAgICAgIC8vIEluIGNhc2UgYWxsIGVsZW1lbnRzIGFyZSBlcXVhbCwgX19zcGxpdF9wb3MxID09IDAKKyAgICAgICAgICBpZiAoKF9fc3BsaXRfcG9zMSArIDEgLSBfX2JlZ2luKSA8IChfX24gPj4gNykKKyAgICAgICAgICAgICAgfHwgKF9fZW5kIC0gX19zcGxpdF9wb3MxKSA8IChfX24gPj4gNykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIFZlcnkgdW5lcXVhbCBzcGxpdCwgb25lIHBhcnQgc21hbGxlciB0aGFuIG9uZSAxMjh0aAorICAgICAgICAgICAgICAvLyBlbGVtZW50cyBub3Qgc3RyaWN0bHkgbGFyZ2VyIHRoYW4gdGhlIHBpdm90LgorICAgICAgICAgICAgICBfX2dudV9wYXJhbGxlbDo6X191bmFyeV9uZWdhdGU8X19nbnVfcGFyYWxsZWw6OgorICAgICAgICAJX19iaW5kZXIxc3Q8X0NvbXBhcmUsIF9WYWx1ZVR5cGUsCisJCSAgICAgICAgICAgIF9WYWx1ZVR5cGUsIGJvb2w+LCBfVmFsdWVUeXBlPgorICAgICAgICAJX19wcmVkKF9fZ251X3BhcmFsbGVsOjpfX2JpbmRlcjFzdDxfQ29tcGFyZSwgX1ZhbHVlVHlwZSwKKwkJICAgICAgIF9WYWx1ZVR5cGUsIGJvb2w+KF9fY29tcCwgKl9fcGl2b3RfcG9zKSk7CisKKyAgICAgICAgICAgICAgLy8gRmluZCBvdGhlciBlbmQgb2YgcGl2b3QtZXF1YWwgcmFuZ2UuCisgICAgICAgICAgICAgIF9fc3BsaXRfcG9zMiA9IF9fZ251X3NlcXVlbnRpYWw6OnBhcnRpdGlvbihfX3NwbGl0X3BvczEgKyAxLAorCQkJCQkJCSBfX2VuZCwgX19wcmVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAvLyBPbmx5IHNraXAgdGhlIHBpdm90LgorICAgICAgICAgICAgX19zcGxpdF9wb3MyID0gX19zcGxpdF9wb3MxICsgMTsKKworICAgICAgICAgIC8vIENvbXBhcmUgaXRlcmF0b3JzLgorICAgICAgICAgIGlmIChfX3NwbGl0X3BvczIgPD0gX19udGgpCisgICAgICAgICAgICBfX2JlZ2luID0gX19zcGxpdF9wb3MyOworICAgICAgICAgIGVsc2UgaWYgKF9fbnRoIDwgX19zcGxpdF9wb3MxKQorICAgICAgICAgICAgX19lbmQgPSBfX3NwbGl0X3BvczE7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisJfQorCisgICAgICAvLyBPbmx5IGF0IG1vc3QgX1NldHRpbmdzOjpwYXJ0aXRpb25fbWluaW1hbF9uIF9fZWxlbWVudHMgX19sZWZ0LgorICAgICAgX19nbnVfc2VxdWVudGlhbDo6bnRoX2VsZW1lbnQoX19iZWdpbiwgX19udGgsIF9fZW5kLCBfX2NvbXApOworICAgIH0KKworICAvKiogQGJyaWVmIFBhcmFsbGVsIGltcGxlbWVudGF0aW9uIG9mIHN0ZDo6cGFydGlhbF9zb3J0KCkuCisgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAqICBAcGFyYW0gX19taWRkbGUgU29ydCB1bnRpbCB0aGlzIHBvc2l0aW9uLgorICAqICBAcGFyYW0gX19lbmQgRW5kIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAqICBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX3BhcmFsbGVsX3BhcnRpYWxfc29ydChfUkFJdGVyIF9fYmVnaW4sCisJCQkgICAgX1JBSXRlciBfX21pZGRsZSwKKwkJCSAgICBfUkFJdGVyIF9fZW5kLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgX19wYXJhbGxlbF9udGhfZWxlbWVudChfX2JlZ2luLCBfX21pZGRsZSwgX19lbmQsIF9fY29tcCk7CisgICAgICBzdGQ6OnNvcnQoX19iZWdpbiwgX19taWRkbGUsIF9fY29tcCk7CisgICAgfQorCit9IC8vbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCisKKyN1bmRlZiBfR0xJQkNYWF9WT0xBVElMRQorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfUEFSVElUSU9OX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvcXVldWUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmU1YjlkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9xdWV1ZS5oCkBAIC0wLDAgKzEsMTU1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvcXVldWUuaAorICogIEBicmllZiBMb2NrLWZyZWUgZG91YmxlLWVuZGVkIHF1ZXVlLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgSm9oYW5uZXMgU2luZ2xlci4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9RVUVVRV9ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX1FVRVVFX0ggMQorCisjaW5jbHVkZSA8cGFyYWxsZWwvdHlwZXMuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9iYXNlLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvY29tcGF0aWJpbGl0eS5oPgorCisvKiogQGJyaWVmIERlY2lkZSB3aGV0aGVyIHRvIGRlY2xhcmUgY2VydGFpbiB2YXJpYWJsZSB2b2xhdGlsZSBpbiB0aGlzIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX1ZPTEFUSUxFIHZvbGF0aWxlCisKK25hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAoreworICAvKipAYnJpZWYgRG91YmxlLWVuZGVkIHF1ZXVlIG9mIGJvdW5kZWQgc2l6ZSwgYWxsb3dpbmcgbG9jay1mcmVlCisgICAqICBhdG9taWMgYWNjZXNzLiAgcHVzaF9mcm9udCgpIGFuZCBwb3BfZnJvbnQoKSBtdXN0IG5vdCBiZSBjYWxsZWQKKyAgICogIGNvbmN1cnJlbnRseSB0byBlYWNoIG90aGVyLCB3aGlsZSBwb3BfYmFjaygpIGNhbiBiZSBjYWxsZWQKKyAgICogIGNvbmN1cnJlbnRseSBhdCBhbGwgdGltZXMuCisgICAqICBAYyBlbXB0eSgpLCBAYyBzaXplKCksIGFuZCBAYyB0b3AoKSBhcmUgaW50ZW50aW9uYWxseSBub3QgcHJvdmlkZWQuCisgICAqICBDYWxsaW5nIHRoZW0gd291bGQgbm90IG1ha2Ugc2Vuc2UgaW4gYSBjb25jdXJyZW50IHNldHRpbmcuCisgICAqICBAcGFyYW0gX1RwIENvbnRhaW5lZCBlbGVtZW50IHR5cGUuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBfUmVzdHJpY3RlZEJvdW5kZWRDb25jdXJyZW50UXVldWUKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIC8qKiBAYnJpZWYgQXJyYXkgb2YgZWxlbWVudHMsIHNlZW4gYXMgY3ljbGljIGJ1ZmZlci4gKi8KKyAgICAgIF9UcCogX01fYmFzZTsKKworICAgICAgLyoqIEBicmllZiBNYXhpbWFsIG51bWJlciBvZiBlbGVtZW50cyBjb250YWluZWQgYXQgdGhlIHNhbWUgdGltZS4gKi8KKyAgICAgIF9TZXF1ZW5jZUluZGV4IF9NX21heF9zaXplOworCisgICAgICAvKiogQGJyaWVmIEN5Y2xpYyBfX2JlZ2luIGFuZCBfX2VuZCBwb2ludGVycyBjb250YWluZWQgaW4gb25lCisgICAgICAgICAgYXRvbWljYWxseSBjaGFuZ2VhYmxlIHZhbHVlLiAqLworICAgICAgX0dMSUJDWFhfVk9MQVRJTEUgX0NBU2FibGUgX01fYm9yZGVyczsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBAYnJpZWYgQ29uc3RydWN0b3IuIE5vdCB0byBiZSBjYWxsZWQgY29uY3VycmVudCwgb2YgY291cnNlLgorICAgICAgICogIEBwYXJhbSBfX21heF9zaXplIE1heGltYWwgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGJlIGNvbnRhaW5lZC4gKi8KKyAgICAgIF9SZXN0cmljdGVkQm91bmRlZENvbmN1cnJlbnRRdWV1ZShfU2VxdWVuY2VJbmRleCBfX21heF9zaXplKQorICAgICAgeworICAgICAgICBfTV9tYXhfc2l6ZSA9IF9fbWF4X3NpemU7CisgICAgICAgIF9NX2Jhc2UgPSBuZXcgX1RwW19fbWF4X3NpemVdOworICAgICAgICBfTV9ib3JkZXJzID0gX19lbmNvZGUyKDAsIDApOworI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgIH0KKworICAgICAgLyoqIEBicmllZiBEZXN0cnVjdG9yLiBOb3QgdG8gYmUgY2FsbGVkIGNvbmN1cnJlbnQsIG9mIGNvdXJzZS4gKi8KKyAgICAgIH5fUmVzdHJpY3RlZEJvdW5kZWRDb25jdXJyZW50UXVldWUoKQorICAgICAgeyBkZWxldGVbXSBfTV9iYXNlOyB9CisKKyAgICAgIC8qKiBAYnJpZWYgUHVzaGVzIG9uZSBlbGVtZW50IGludG8gdGhlIHF1ZXVlIGF0IHRoZSBmcm9udCBlbmQuCisgICAgICAgKiAgTXVzdCBub3QgYmUgY2FsbGVkIGNvbmN1cnJlbnRseSB3aXRoIHBvcF9mcm9udCgpLiAqLworICAgICAgdm9pZAorICAgICAgcHVzaF9mcm9udChjb25zdCBfVHAmIF9fdCkKKyAgICAgIHsKKyAgICAgICAgX0NBU2FibGUgX19mb3JtZXJfYm9yZGVycyA9IF9NX2JvcmRlcnM7CisgICAgICAgIGludCBfX2Zvcm1lcl9mcm9udCwgX19mb3JtZXJfYmFjazsKKyAgICAgICAgX19kZWNvZGUyKF9fZm9ybWVyX2JvcmRlcnMsIF9fZm9ybWVyX2Zyb250LCBfX2Zvcm1lcl9iYWNrKTsKKyAgICAgICAgKihfTV9iYXNlICsgX19mb3JtZXJfZnJvbnQgJSBfTV9tYXhfc2l6ZSkgPSBfX3Q7CisjaWYgX0dMSUJDWFhfQVNTRVJUSU9OUworICAgICAgICAvLyBPdGhlcndpc2U6IGZyb250IC0gYmFjayA+IF9NX21heF9zaXplIGV2ZW50dWFsbHkuCisgICAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVCgoKF9fZm9ybWVyX2Zyb250ICsgMSkgLSBfX2Zvcm1lcl9iYWNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gX01fbWF4X3NpemUpOworI2VuZGlmCisgICAgICAgIF9fZmV0Y2hfYW5kX2FkZCgmX01fYm9yZGVycywgX19lbmNvZGUyKDEsIDApKTsKKyAgICAgIH0KKworICAgICAgLyoqIEBicmllZiBQb3BzIG9uZSBlbGVtZW50IGZyb20gdGhlIHF1ZXVlIGF0IHRoZSBmcm9udCBlbmQuCisgICAgICAgKiAgTXVzdCBub3QgYmUgY2FsbGVkIGNvbmN1cnJlbnRseSB3aXRoIHBvcF9mcm9udCgpLiAqLworICAgICAgYm9vbAorICAgICAgcG9wX2Zyb250KF9UcCYgX190KQorICAgICAgeworICAgICAgICBpbnQgX19mb3JtZXJfZnJvbnQsIF9fZm9ybWVyX2JhY2s7CisjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgICBfX2RlY29kZTIoX01fYm9yZGVycywgX19mb3JtZXJfZnJvbnQsIF9fZm9ybWVyX2JhY2spOworICAgICAgICB3aGlsZSAoX19mb3JtZXJfZnJvbnQgPiBfX2Zvcm1lcl9iYWNrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENoYW5jZS4KKyAgICAgICAgICAgIF9DQVNhYmxlIF9fZm9ybWVyX2JvcmRlcnMgPSBfX2VuY29kZTIoX19mb3JtZXJfZnJvbnQsCisJCQkJCQkgIF9fZm9ybWVyX2JhY2spOworICAgICAgICAgICAgX0NBU2FibGUgX19uZXdfYm9yZGVycyA9IF9fZW5jb2RlMihfX2Zvcm1lcl9mcm9udCAtIDEsCisJCQkJCSAgICAgICBfX2Zvcm1lcl9iYWNrKTsKKyAgICAgICAgICAgIGlmIChfX2NvbXBhcmVfYW5kX3N3YXAoJl9NX2JvcmRlcnMsIF9fZm9ybWVyX2JvcmRlcnMsCisJCQkJICAgX19uZXdfYm9yZGVycykpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX3QgPSAqKF9NX2Jhc2UgKyAoX19mb3JtZXJfZnJvbnQgLSAxKSAlIF9NX21heF9zaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgfQorI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgICAgICAgIF9fZGVjb2RlMihfTV9ib3JkZXJzLCBfX2Zvcm1lcl9mcm9udCwgX19mb3JtZXJfYmFjayk7CisgICAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIC8qKiBAYnJpZWYgUG9wcyBvbmUgZWxlbWVudCBmcm9tIHRoZSBxdWV1ZSBhdCB0aGUgZnJvbnQgZW5kLgorICAgICAgICogIE11c3Qgbm90IGJlIGNhbGxlZCBjb25jdXJyZW50bHkgd2l0aCBwb3BfZnJvbnQoKS4gKi8KKyAgICAgIGJvb2wKKyAgICAgIHBvcF9iYWNrKF9UcCYgX190KSAgICAgICAgLy9xdWV1ZSBiZWhhdmlvcgorICAgICAgeworICAgICAgICBpbnQgX19mb3JtZXJfZnJvbnQsIF9fZm9ybWVyX2JhY2s7CisjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgICBfX2RlY29kZTIoX01fYm9yZGVycywgX19mb3JtZXJfZnJvbnQsIF9fZm9ybWVyX2JhY2spOworICAgICAgICB3aGlsZSAoX19mb3JtZXJfZnJvbnQgPiBfX2Zvcm1lcl9iYWNrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENoYW5jZS4KKyAgICAgICAgICAgIF9DQVNhYmxlIF9fZm9ybWVyX2JvcmRlcnMgPSBfX2VuY29kZTIoX19mb3JtZXJfZnJvbnQsCisJCQkJCQkgIF9fZm9ybWVyX2JhY2spOworICAgICAgICAgICAgX0NBU2FibGUgX19uZXdfYm9yZGVycyA9IF9fZW5jb2RlMihfX2Zvcm1lcl9mcm9udCwKKwkJCQkJICAgICAgIF9fZm9ybWVyX2JhY2sgKyAxKTsKKyAgICAgICAgICAgIGlmIChfX2NvbXBhcmVfYW5kX3N3YXAoJl9NX2JvcmRlcnMsIF9fZm9ybWVyX2JvcmRlcnMsCisJCQkJICAgX19uZXdfYm9yZGVycykpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX3QgPSAqKF9NX2Jhc2UgKyBfX2Zvcm1lcl9iYWNrICUgX01fbWF4X3NpemUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICB9CisjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgICAgICAgX19kZWNvZGUyKF9NX2JvcmRlcnMsIF9fZm9ybWVyX2Zyb250LCBfX2Zvcm1lcl9iYWNrKTsKKyAgICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgfTsKK30gICAgICAgLy9uYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKKworI3VuZGVmIF9HTElCQ1hYX1ZPTEFUSUxFCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9RVUVVRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3F1aWNrc29ydC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9xdWlja3NvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTc0Y2EwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9xdWlja3NvcnQuaApAQCAtMCwwICsxLDE3NiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL3F1aWNrc29ydC5oCisgKiAgQGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIGEgdW5iYWxhbmNlZCBwYXJhbGxlbCBxdWlja3NvcnQgKGluLXBsYWNlKS4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IEpvaGFubmVzIFNpbmdsZXIuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfUVVJQ0tTT1JUX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfUVVJQ0tTT1JUX0ggMQorCisjaW5jbHVkZSA8cGFyYWxsZWwvcGFyYWxsZWwuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9wYXJ0aXRpb24uaD4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKiBAYnJpZWYgVW5iYWxhbmNlZCBxdWlja3NvcnQgZGl2aWRlIHN0ZXAuCisgICAqICBAcGFyYW0gX19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBzdWJzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2Ygc3Vic2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAqICBAcGFyYW0gX19waXZvdF9yYW5rIERlc2lyZWQgX19yYW5rIG9mIHRoZSBwaXZvdC4KKyAgICogIEBwYXJhbSBfX251bV9zYW1wbGVzIENob29zZSBwaXZvdCBmcm9tIHRoYXQgbWFueSBzYW1wbGVzLgorICAgKiAgQHBhcmFtIF9fbnVtX3RocmVhZHMgTnVtYmVyIG9mIHRocmVhZHMgdGhhdCBhcmUgYWxsb3dlZCB0byB3b3JrIG9uCisgICAqICB0aGlzIHBhcnQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgX19wYXJhbGxlbF9zb3J0X3FzX2RpdmlkZShfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisJCQkgICAgICBfQ29tcGFyZSBfX2NvbXAsIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzCisJCQkgICAgICA8X1JBSXRlcj46OmRpZmZlcmVuY2VfdHlwZSBfX3Bpdm90X3JhbmssCisJCQkgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0cworCQkJICAgICAgPF9SQUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKwkJCSAgICAgIF9fbnVtX3NhbXBsZXMsIF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19uID0gX19lbmQgLSBfX2JlZ2luOworICAgICAgX19udW1fc2FtcGxlcyA9IHN0ZDo6bWluKF9fbnVtX3NhbXBsZXMsIF9fbik7CisKKyAgICAgIC8vIEFsbG9jYXRlIHVuaW5pdGlhbGl6ZWQsIHRvIGF2b2lkIGRlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICBfVmFsdWVUeXBlKiBfX3NhbXBsZXMgPSBzdGF0aWNfY2FzdDxfVmFsdWVUeXBlKj4KKwkoOjpvcGVyYXRvciBuZXcoX19udW1fc2FtcGxlcyAqIHNpemVvZihfVmFsdWVUeXBlKSkpOworCisgICAgICBmb3IgKF9EaWZmZXJlbmNlVHlwZSBfX3MgPSAwOyBfX3MgPCBfX251bV9zYW1wbGVzOyArK19fcykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBfX2luZGV4ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPgorCSAgICAoX19zKSAqIF9fbiAvIF9fbnVtX3NhbXBsZXM7CisgICAgICAgICAgOjpuZXcoJihfX3NhbXBsZXNbX19zXSkpIF9WYWx1ZVR5cGUoX19iZWdpbltfX2luZGV4XSk7CisgICAgICAgIH0KKworICAgICAgX19nbnVfc2VxdWVudGlhbDo6c29ydChfX3NhbXBsZXMsIF9fc2FtcGxlcyArIF9fbnVtX3NhbXBsZXMsIF9fY29tcCk7CisKKyAgICAgIF9WYWx1ZVR5cGUmIF9fcGl2b3QgPSBfX3NhbXBsZXNbX19waXZvdF9yYW5rICogX19udW1fc2FtcGxlcyAvIF9fbl07CisKKyAgICAgIF9fZ251X3BhcmFsbGVsOjpfX2JpbmRlcjJuZDxfQ29tcGFyZSwgX1ZhbHVlVHlwZSwgX1ZhbHVlVHlwZSwgYm9vbD4KKyAgICAgICAgX19wcmVkKF9fY29tcCwgX19waXZvdCk7CisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19zcGxpdCA9IF9fcGFyYWxsZWxfcGFydGl0aW9uKF9fYmVnaW4sIF9fZW5kLAorCQkJCQkJICAgICBfX3ByZWQsIF9fbnVtX3RocmVhZHMpOworCisgICAgICBmb3IgKF9EaWZmZXJlbmNlVHlwZSBfX3MgPSAwOyBfX3MgPCBfX251bV9zYW1wbGVzOyArK19fcykKKwlfX3NhbXBsZXNbX19zXS5+X1ZhbHVlVHlwZSgpOworICAgICAgOjpvcGVyYXRvciBkZWxldGUoX19zYW1wbGVzKTsKKworICAgICAgcmV0dXJuIF9fc3BsaXQ7CisgICAgfQorCisgIC8qKiBAYnJpZWYgVW5iYWxhbmNlZCBxdWlja3NvcnQgY29ucXVlciBzdGVwLgorICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2Ygc3Vic2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19lbmQgRW5kIGl0ZXJhdG9yIG9mIHN1YnNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgKiAgQHBhcmFtIF9fbnVtX3RocmVhZHMgTnVtYmVyIG9mIHRocmVhZHMgdGhhdCBhcmUgYWxsb3dlZCB0byB3b3JrIG9uCisgICAqICB0aGlzIHBhcnQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgX19wYXJhbGxlbF9zb3J0X3FzX2NvbnF1ZXIoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorCQkJICAgICAgIF9Db21wYXJlIF9fY29tcCwKKwkJCSAgICAgICBfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcykKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgaWYgKF9fbnVtX3RocmVhZHMgPD0gMSkKKyAgICAgICAgeworICAgICAgICAgIF9fZ251X3NlcXVlbnRpYWw6OnNvcnQoX19iZWdpbiwgX19lbmQsIF9fY29tcCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX24gPSBfX2VuZCAtIF9fYmVnaW4sIF9fcGl2b3RfcmFuazsKKworICAgICAgaWYgKF9fbiA8PSAxKQorICAgICAgICByZXR1cm47CisKKyAgICAgIF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzX2xlZnQ7CisKKyAgICAgIGlmICgoX19udW1fdGhyZWFkcyAlIDIpID09IDEpCisgICAgICAgIF9fbnVtX3RocmVhZHNfbGVmdCA9IF9fbnVtX3RocmVhZHMgLyAyICsgMTsKKyAgICAgIGVsc2UKKyAgICAgICAgX19udW1fdGhyZWFkc19sZWZ0ID0gX19udW1fdGhyZWFkcyAvIDI7CisKKyAgICAgIF9fcGl2b3RfcmFuayA9IF9fbiAqIF9fbnVtX3RocmVhZHNfbGVmdCAvIF9fbnVtX3RocmVhZHM7CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX3NwbGl0ID0gX19wYXJhbGxlbF9zb3J0X3FzX2RpdmlkZQorCShfX2JlZ2luLCBfX2VuZCwgX19jb21wLCBfX3Bpdm90X3JhbmssCisJIF9TZXR0aW5nczo6Z2V0KCkuc29ydF9xc19udW1fc2FtcGxlc19wcmVzZXQsIF9fbnVtX3RocmVhZHMpOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBudW1fdGhyZWFkcygyKQorICAgICAgeworI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgICBfX3BhcmFsbGVsX3NvcnRfcXNfY29ucXVlcihfX2JlZ2luLCBfX2JlZ2luICsgX19zcGxpdCwKKwkJCQkgICBfX2NvbXAsIF9fbnVtX3RocmVhZHNfbGVmdCk7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICAgIF9fcGFyYWxsZWxfc29ydF9xc19jb25xdWVyKF9fYmVnaW4gKyBfX3NwbGl0LCBfX2VuZCwKKwkJCQkgICBfX2NvbXAsIF9fbnVtX3RocmVhZHMgLSBfX251bV90aHJlYWRzX2xlZnQpOworICAgICAgfQorICAgIH0KKworCisgIC8qKiBAYnJpZWYgVW5iYWxhbmNlZCBxdWlja3NvcnQgbWFpbiBjYWxsLgorICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19lbmQgRW5kIGl0ZXJhdG9yIGlucHV0IHNlcXVlbmNlLCBpZ25vcmVkLgorICAgKiAgQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgKiAgQHBhcmFtIF9fbnVtX3RocmVhZHMgTnVtYmVyIG9mIHRocmVhZHMgdGhhdCBhcmUgYWxsb3dlZCB0byB3b3JrIG9uCisgICAqICB0aGlzIHBhcnQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgX19wYXJhbGxlbF9zb3J0X3FzKF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKwkJICAgICAgIF9Db21wYXJlIF9fY29tcCwKKwkJICAgICAgIF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19uKQorCisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9SQUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbiA9IF9fZW5kIC0gX19iZWdpbjsKKworICAgICAgLy8gQXQgbGVhc3Qgb25lIGVsZW1lbnQgcGVyIHByb2Nlc3Nvci4KKyAgICAgIGlmIChfX251bV90aHJlYWRzID4gX19uKQorICAgICAgICBfX251bV90aHJlYWRzID0gc3RhdGljX2Nhc3Q8X1RocmVhZEluZGV4PihfX24pOworCisgICAgICBfX3BhcmFsbGVsX3NvcnRfcXNfY29ucXVlcigKKyAgICAgICAgX19iZWdpbiwgX19iZWdpbiArIF9fbiwgX19jb21wLCBfX251bV90aHJlYWRzKTsKKyAgICB9CisKK30gLy9uYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX1FVSUNLU09SVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3JhbmRvbV9udW1iZXIuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvcmFuZG9tX251bWJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YWViOTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3JhbmRvbV9udW1iZXIuaApAQCAtMCwwICsxLDEyNSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL3JhbmRvbV9udW1iZXIuaAorICogIEBicmllZiBSYW5kb20gbnVtYmVyIGdlbmVyYXRvciBiYXNlZCBvbiB0aGUgTWVyc2VubmUgdHdpc3Rlci4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IEpvaGFubmVzIFNpbmdsZXIuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfUkFORE9NX05VTUJFUl9ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX1JBTkRPTV9OVU1CRVJfSCAxCisKKyNpbmNsdWRlIDxwYXJhbGxlbC90eXBlcy5oPgorI2luY2x1ZGUgPHRyMS9yYW5kb20+CisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgLyoqIEBicmllZiBSYW5kb20gbnVtYmVyIGdlbmVyYXRvciwgYmFzZWQgb24gdGhlIE1lcnNlbm5lIHR3aXN0ZXIuICovCisgIGNsYXNzIF9SYW5kb21OdW1iZXIKKyAgeworICBwcml2YXRlOgorICAgIHN0ZDo6dHIxOjptdDE5OTM3ICAgX01fbXQ7CisgICAgdWludDY0X3QgICAgICAgICAgICBfTV9zdXByZW11bTsKKyAgICB1aW50NjRfdCAgICAgICAgICAgIF9NX3JhbmRfc3VwOworICAgIGRvdWJsZSAgICAgICAgICAgICAgX01fc3VwcmVtdW1fcmVjaXByb2NhbDsKKyAgICBkb3VibGUgICAgICAgICAgICAgIF9NX3JhbmRfc3VwX3JlY2lwcm9jYWw7CisKKyAgICAvLyBBc3N1bWVkIHRvIGJlIHR3aWNlIGFzIGxvbmcgYXMgdGhlIHVzdWFsIHJhbmRvbSBudW1iZXIuCisgICAgdWludDY0X3QgICAgICAgICAgICAgIF9fY2FjaGU7CisKKyAgICAvLyBCaXQgcmVzdWx0cy4KKyAgICBpbnQgX19iaXRzX2xlZnQ7CisgICAgCisgICAgc3RhdGljIHVpbnQzMl90CisgICAgX19zY2FsZV9kb3duKHVpbnQ2NF90IF9feCwKKyNpZiBfR0xJQkNYWF9TQ0FMRV9ET1dOX0ZQVQorICAgICAgICAgICAgICAgdWludDY0X3QgLypfTV9zdXByZW11bSovLCBkb3VibGUgX01fc3VwcmVtdW1fcmVjaXByb2NhbCkKKyNlbHNlCisgICAgICAgICAgICAgICB1aW50NjRfdCBfTV9zdXByZW11bSwgZG91YmxlIC8qX01fc3VwcmVtdW1fcmVjaXByb2NhbCovKQorI2VuZGlmCisgICAgICAgIHsKKyNpZiBfR0xJQkNYWF9TQ0FMRV9ET1dOX0ZQVQorICAgICAgICAgIHJldHVybiB1aW50MzJfdChfX3ggKiBfTV9zdXByZW11bV9yZWNpcHJvY2FsKTsKKyNlbHNlCisgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihfX3ggJSBfTV9zdXByZW11bSk7CisjZW5kaWYKKyAgICAgICAgfQorCisgIHB1YmxpYzoKKyAgICAvKiogQGJyaWVmIERlZmF1bHQgY29uc3RydWN0b3IuIFNlZWQgd2l0aCAwLiAqLworICAgIF9SYW5kb21OdW1iZXIoKQorICAgIDogX01fbXQoMCksIF9NX3N1cHJlbXVtKDB4MTAwMDAwMDAwVUxMKSwKKyAgICAgIF9NX3JhbmRfc3VwKDFVTEwgPDwgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46OmRpZ2l0cyksCisgICAgICBfTV9zdXByZW11bV9yZWNpcHJvY2FsKGRvdWJsZShfTV9zdXByZW11bSkgLyBkb3VibGUoX01fcmFuZF9zdXApKSwKKyAgICAgIF9NX3JhbmRfc3VwX3JlY2lwcm9jYWwoMS4wIC8gZG91YmxlKF9NX3JhbmRfc3VwKSksCisgICAgICBfX2NhY2hlKDApLCBfX2JpdHNfbGVmdCgwKSB7IH0KKworICAgIC8qKiBAYnJpZWYgQ29uc3RydWN0b3IuCisgICAgICogIEBwYXJhbSBfX3NlZWQgUmFuZG9tIF9fc2VlZC4KKyAgICAgKiAgQHBhcmFtIF9NX3N1cHJlbXVtIEdlbmVyYXRlIGludGVnZXIgcmFuZG9tIG51bWJlcnMgaW4gdGhlCisgICAgICogICAgICAgICAgICAgICAgICBpbnRlcnZhbCBAYyBbMCxfTV9zdXByZW11bSkuICovCisgICAgX1JhbmRvbU51bWJlcih1aW50MzJfdCBfX3NlZWQsIHVpbnQ2NF90IF9NX3N1cHJlbXVtID0gMHgxMDAwMDAwMDBVTEwpCisgICAgOiBfTV9tdChfX3NlZWQpLCBfTV9zdXByZW11bShfTV9zdXByZW11bSksCisgICAgICBfTV9yYW5kX3N1cCgxVUxMIDw8IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjpkaWdpdHMpLAorICAgICAgX01fc3VwcmVtdW1fcmVjaXByb2NhbChkb3VibGUoX01fc3VwcmVtdW0pIC8gZG91YmxlKF9NX3JhbmRfc3VwKSksCisgICAgICBfTV9yYW5kX3N1cF9yZWNpcHJvY2FsKDEuMCAvIGRvdWJsZShfTV9yYW5kX3N1cCkpLAorICAgICAgX19jYWNoZSgwKSwgX19iaXRzX2xlZnQoMCkgeyB9CisKKyAgICAvKiogQGJyaWVmIEdlbmVyYXRlIHVuc2lnbmVkIHJhbmRvbSAzMi1iaXQgaW50ZWdlci4gKi8KKyAgICB1aW50MzJfdAorICAgIG9wZXJhdG9yKCkoKQorICAgIHsgcmV0dXJuIF9fc2NhbGVfZG93bihfTV9tdCgpLCBfTV9zdXByZW11bSwgX01fc3VwcmVtdW1fcmVjaXByb2NhbCk7IH0KKworICAgIC8qKiBAYnJpZWYgR2VuZXJhdGUgdW5zaWduZWQgcmFuZG9tIDMyLWJpdCBpbnRlZ2VyIGluIHRoZQorICAgICAgICBpbnRlcnZhbCBAYyBbMCxsb2NhbF9zdXByZW11bSkuICovCisgICAgdWludDMyX3QKKyAgICBvcGVyYXRvcigpKHVpbnQ2NF90IGxvY2FsX3N1cHJlbXVtKQorICAgIHsKKyAgICAgIHJldHVybiBfX3NjYWxlX2Rvd24oX01fbXQoKSwgbG9jYWxfc3VwcmVtdW0sCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUobG9jYWxfc3VwcmVtdW0gKiBfTV9yYW5kX3N1cF9yZWNpcHJvY2FsKSk7CisgICAgfQorCisgICAgLyoqIEBicmllZiBHZW5lcmF0ZSBhIG51bWJlciBvZiByYW5kb20gYml0cywgcnVuLXRpbWUgcGFyYW1ldGVyLgorICAgICAqICBAcGFyYW0gX19iaXRzIE51bWJlciBvZiBiaXRzIHRvIGdlbmVyYXRlLiAqLworICAgIHVuc2lnbmVkIGxvbmcKKyAgICBfX2dlbnJhbmRfYml0cyhpbnQgX19iaXRzKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgX19yZXMgPSBfX2NhY2hlICYgKCgxIDw8IF9fYml0cykgLSAxKTsKKyAgICAgIF9fY2FjaGUgPSBfX2NhY2hlID4+IF9fYml0czsKKyAgICAgIF9fYml0c19sZWZ0IC09IF9fYml0czsKKyAgICAgIGlmIChfX2JpdHNfbGVmdCA8IDMyKQorICAgICAgICB7CisgICAgICAgICAgX19jYWNoZSB8PSAoKHVpbnQ2NF90KF9NX210KCkpKSA8PCBfX2JpdHNfbGVmdCk7CisgICAgICAgICAgX19iaXRzX2xlZnQgKz0gMzI7CisgICAgICAgIH0KKyAgICAgIHJldHVybiBfX3JlczsKKyAgICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYXJhbGxlbAorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfUkFORE9NX05VTUJFUl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3JhbmRvbV9zaHVmZmxlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3JhbmRvbV9zaHVmZmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FlZWZjOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvcmFuZG9tX3NodWZmbGUuaApAQCAtMCwwICsxLDUzMyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL3JhbmRvbV9zaHVmZmxlLmgKKyAqICBAYnJpZWYgUGFyYWxsZWwgaW1wbGVtZW50YXRpb24gb2Ygc3RkOjpyYW5kb21fc2h1ZmZsZSgpLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgSm9oYW5uZXMgU2luZ2xlci4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9SQU5ET01fU0hVRkZMRV9ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX1JBTkRPTV9TSFVGRkxFX0ggMQorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGJpdHMvc3RsX251bWVyaWMuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9wYXJhbGxlbC5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3JhbmRvbV9udW1iZXIuaD4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKiBAYnJpZWYgVHlwZSB0byBob2xkIHRoZSBpbmRleCBvZiBhIGJpbi4KKyAgICAqCisgICAgKiAgU2luY2UgbWFueSB2YXJpYWJsZXMgb2YgdGhpcyB0eXBlIGFyZSBhbGxvY2F0ZWQsIGl0IHNob3VsZCBiZQorICAgICogIGNob3NlbiBhcyBzbWFsbCBhcyBwb3NzaWJsZS4KKyAgICAqLworICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IF9CaW5JbmRleDsKKworICAvKiogQGJyaWVmIERhdGEga25vd24gdG8gZXZlcnkgdGhyZWFkIHBhcnRpY2lwYXRpbmcgaW4KKyAgICAgIF9fZ251X3BhcmFsbGVsOjpfX3BhcmFsbGVsX3JhbmRvbV9zaHVmZmxlKCkuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgc3RydWN0IF9EUmFuZG9tU2h1ZmZsaW5nR2xvYmFsRGF0YQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICAvKiogQGJyaWVmIEJlZ2luIGl0ZXJhdG9yIG9mIHRoZSBfX3NvdXJjZS4gKi8KKyAgICAgIF9SQUl0ZXImIF9NX3NvdXJjZTsKKworICAgICAgLyoqIEBicmllZiBUZW1wb3JhcnkgYXJyYXlzIGZvciBlYWNoIHRocmVhZC4gKi8KKyAgICAgIF9WYWx1ZVR5cGUqKiBfTV90ZW1wb3JhcmllczsKKworICAgICAgLyoqIEBicmllZiBUd28tZGltZW5zaW9uYWwgYXJyYXkgdG8gaG9sZCB0aGUgdGhyZWFkLWJpbiBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogIERpbWVuc2lvbnMgKF9NX251bV90aHJlYWRzICsgMSkgX194IChfTV9udW1fYmlucyArIDEpLiAqLworICAgICAgX0RpZmZlcmVuY2VUeXBlKiogX01fZGlzdDsKKworICAgICAgLyoqIEBicmllZiBTdGFydCBpbmRleGVzIG9mIHRoZSB0aHJlYWRzJyBfX2NodW5rcy4gKi8KKyAgICAgIF9EaWZmZXJlbmNlVHlwZSogX01fc3RhcnRzOworCisgICAgICAvKiogQGJyaWVmIE51bWJlciBvZiB0aGUgdGhyZWFkIHRoYXQgd2lsbCBmdXJ0aGVyIHByb2Nlc3MgdGhlCisgICAgICAgICAgY29ycmVzcG9uZGluZyBiaW4uICovCisgICAgICBfVGhyZWFkSW5kZXgqIF9NX2Jpbl9wcm9jOworCisgICAgICAvKiogQGJyaWVmIE51bWJlciBvZiBiaW5zIHRvIGRpc3RyaWJ1dGUgdG8uICovCisgICAgICBpbnQgX01fbnVtX2JpbnM7CisKKyAgICAgIC8qKiBAYnJpZWYgTnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIGFkZHJlc3MgdGhlIGJpbnMuICovCisgICAgICBpbnQgX01fbnVtX2JpdHM7CisKKyAgICAgIC8qKiBAYnJpZWYgQ29uc3RydWN0b3IuICovCisgICAgICBfRFJhbmRvbVNodWZmbGluZ0dsb2JhbERhdGEoX1JBSXRlciYgX19zb3VyY2UpCisgICAgICA6IF9NX3NvdXJjZShfX3NvdXJjZSkgeyB9CisgICAgfTsKKworICAvKiogQGJyaWVmIExvY2FsIGRhdGEgZm9yIGEgdGhyZWFkIHBhcnRpY2lwYXRpbmcgaW4KKyAgICAgIF9fZ251X3BhcmFsbGVsOjpfX3BhcmFsbGVsX3JhbmRvbV9zaHVmZmxlKCkuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1JhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICBzdHJ1Y3QgX0RSU1NvcnRlclBVCisgICAgeworICAgICAgLyoqIEBicmllZiBOdW1iZXIgb2YgdGhyZWFkcyBwYXJ0aWNpcGF0aW5nIGluIHRvdGFsLiAqLworICAgICAgaW50IF9NX251bV90aHJlYWRzOworCisgICAgICAvKiogQGJyaWVmIEJlZ2luIGluZGV4IGZvciBiaW5zIHRha2VuIGNhcmUgb2YgYnkgdGhpcyB0aHJlYWQuICovCisgICAgICBfQmluSW5kZXggX01fYmluc19iZWdpbjsKKworICAgICAgLyoqIEBicmllZiBFbmQgaW5kZXggZm9yIGJpbnMgdGFrZW4gY2FyZSBvZiBieSB0aGlzIHRocmVhZC4gKi8KKyAgICAgIF9CaW5JbmRleCBfX2JpbnNfZW5kOworCisgICAgICAvKiogQGJyaWVmIFJhbmRvbSBfTV9zZWVkIGZvciB0aGlzIHRocmVhZC4gKi8KKyAgICAgIHVpbnQzMl90IF9NX3NlZWQ7CisKKyAgICAgIC8qKiBAYnJpZWYgUG9pbnRlciB0byBnbG9iYWwgZGF0YS4gKi8KKyAgICAgIF9EUmFuZG9tU2h1ZmZsaW5nR2xvYmFsRGF0YTxfUkFJdGVyPiogX01fc2Q7CisgICAgfTsKKworICAvKiogQGJyaWVmIEdlbmVyYXRlIGEgcmFuZG9tIG51bWJlciBpbiBAYyBbMCwyXl9fbG9ncCkuCisgICAgKiAgQHBhcmFtIF9fbG9ncCBMb2dhcml0aG0gKGJhc2lzIDIpIG9mIHRoZSB1cHBlciByYW5nZSBfX2JvdW5kLgorICAgICogIEBwYXJhbSBfX3JuZyBSYW5kb20gbnVtYmVyIGdlbmVyYXRvciB0byB1c2UuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICBpbmxpbmUgaW50CisgICAgX19yYW5kb21fbnVtYmVyX3BvdzIoaW50IF9fbG9ncCwgX1JhbmRvbU51bWJlckdlbmVyYXRvciYgX19ybmcpCisgICAgeyByZXR1cm4gX19ybmcuX19nZW5yYW5kX2JpdHMoX19sb2dwKTsgfQorCisgIC8qKiBAYnJpZWYgUmFuZG9tIHNodWZmbGUgY29kZSBleGVjdXRlZCBieSBlYWNoIHRocmVhZC4KKyAgICAqICBAcGFyYW0gX19wdXMgQXJyYXkgb2YgdGhyZWFkLWxvY2FsIGRhdGEgcmVjb3Jkcy4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1JhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICB2b2lkIAorICAgIF9fcGFyYWxsZWxfcmFuZG9tX3NodWZmbGVfZHJzX3B1KF9EUlNTb3J0ZXJQVTxfUkFJdGVyLAorCQkJCSAgICAgX1JhbmRvbU51bWJlckdlbmVyYXRvcj4qIF9fcHVzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICBfVGhyZWFkSW5kZXggX19pYW0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgIF9EUlNTb3J0ZXJQVTxfUkFJdGVyLCBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPiogX19kID0gJl9fcHVzW19faWFtXTsKKyAgICAgIF9EUmFuZG9tU2h1ZmZsaW5nR2xvYmFsRGF0YTxfUkFJdGVyPiogX19zZCA9IF9fZC0+X01fc2Q7CisKKyAgICAgIC8vIEluZGV4aW5nOiBfTV9kaXN0W2Jpbl1bcHJvY2Vzc29yXQorICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbGVuZ3RoID0gKF9fc2QtPl9NX3N0YXJ0c1tfX2lhbSArIDFdCisJCQkJICAtIF9fc2QtPl9NX3N0YXJ0c1tfX2lhbV0pOworICAgICAgX0JpbkluZGV4KiBfX29yYWNsZXMgPSBuZXcgX0JpbkluZGV4W19fbGVuZ3RoXTsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSogX19kaXN0ID0gbmV3IF9EaWZmZXJlbmNlVHlwZVtfX3NkLT5fTV9udW1fYmlucyArIDFdOworICAgICAgX0JpbkluZGV4KiBfX2Jpbl9wcm9jID0gbmV3IF9CaW5JbmRleFtfX3NkLT5fTV9udW1fYmluc107CisgICAgICBfVmFsdWVUeXBlKiogX190ZW1wb3JhcmllcyA9IG5ldyBfVmFsdWVUeXBlKltfX2QtPl9NX251bV90aHJlYWRzXTsKKworICAgICAgLy8gQ29tcHV0ZSBvcmFjbGVzIGFuZCBjb3VudCBhcHBlYXJhbmNlcy4KKyAgICAgIGZvciAoX0JpbkluZGV4IF9fYiA9IDA7IF9fYiA8IF9fc2QtPl9NX251bV9iaW5zICsgMTsgKytfX2IpCisJX19kaXN0W19fYl0gPSAwOworICAgICAgaW50IF9fbnVtX2JpdHMgPSBfX3NkLT5fTV9udW1fYml0czsKKworICAgICAgX1JhbmRvbU51bWJlciBfX3JuZyhfX2QtPl9NX3NlZWQpOworCisgICAgICAvLyBGaXJzdCBtYWluIGxvb3AuCisgICAgICBmb3IgKF9EaWZmZXJlbmNlVHlwZSBfX2kgPSAwOyBfX2kgPCBfX2xlbmd0aDsgKytfX2kpCisJeworICAgICAgICAgIF9CaW5JbmRleCBfX29yYWNsZSA9IF9fcmFuZG9tX251bWJlcl9wb3cyKF9fbnVtX2JpdHMsIF9fcm5nKTsKKyAgICAgICAgICBfX29yYWNsZXNbX19pXSA9IF9fb3JhY2xlOworCisgICAgICAgICAgLy8gVG8gYWxsb3cgcHJlZml4IChwYXJ0aWFsKSBzdW0uCisgICAgICAgICAgKysoX19kaXN0W19fb3JhY2xlICsgMV0pOworCX0KKworICAgICAgZm9yIChfQmluSW5kZXggX19iID0gMDsgX19iIDwgX19zZC0+X01fbnVtX2JpbnMgKyAxOyArK19fYikKKwlfX3NkLT5fTV9kaXN0W19fYl1bX19pYW0gKyAxXSA9IF9fZGlzdFtfX2JdOworCisjICAgICBwcmFnbWEgb21wIGJhcnJpZXIKKworIyAgICAgcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgIHsKKwkvLyBTdW0gdXAgYmlucywgX19zZC0+X01fZGlzdFtfX3MgKyAxXVtfX2QtPl9NX251bV90aHJlYWRzXSBub3cKKwkvLyBjb250YWlucyB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIGluIGJpbiBfX3MKKwlmb3IgKF9CaW5JbmRleCBfX3MgPSAwOyBfX3MgPCBfX3NkLT5fTV9udW1fYmluczsgKytfX3MpCisgICAgICAgICAgX19nbnVfc2VxdWVudGlhbDo6cGFydGlhbF9zdW0oX19zZC0+X01fZGlzdFtfX3MgKyAxXSwKKwkJCQkJX19zZC0+X01fZGlzdFtfX3MgKyAxXQorCQkJCQkrIF9fZC0+X01fbnVtX3RocmVhZHMgKyAxLAorCQkJCQlfX3NkLT5fTV9kaXN0W19fcyArIDFdKTsKKyAgICAgIH0KKworIyAgICAgcHJhZ21hIG9tcCBiYXJyaWVyCisKKyAgICAgIF9TZXF1ZW5jZUluZGV4IF9fb2Zmc2V0ID0gMCwgX19nbG9iYWxfb2Zmc2V0ID0gMDsKKyAgICAgIGZvciAoX0JpbkluZGV4IF9fcyA9IDA7IF9fcyA8IF9fZC0+X01fYmluc19iZWdpbjsgKytfX3MpCisJX19nbG9iYWxfb2Zmc2V0ICs9IF9fc2QtPl9NX2Rpc3RbX19zICsgMV1bX19kLT5fTV9udW1fdGhyZWFkc107CisKKyMgICAgIHByYWdtYSBvbXAgYmFycmllcgorCisgICAgICBmb3IgKF9CaW5JbmRleCBfX3MgPSBfX2QtPl9NX2JpbnNfYmVnaW47IF9fcyA8IF9fZC0+X19iaW5zX2VuZDsgKytfX3MpCisJeworICAgICAgICAgIGZvciAoaW50IF9fdCA9IDA7IF9fdCA8IF9fZC0+X01fbnVtX3RocmVhZHMgKyAxOyArK19fdCkKKyAgICAgICAgICAgIF9fc2QtPl9NX2Rpc3RbX19zICsgMV1bX190XSArPSBfX29mZnNldDsKKyAgICAgICAgICBfX29mZnNldCA9IF9fc2QtPl9NX2Rpc3RbX19zICsgMV1bX19kLT5fTV9udW1fdGhyZWFkc107CisJfQorCisgICAgICBfX3NkLT5fTV90ZW1wb3Jhcmllc1tfX2lhbV0gPSBzdGF0aWNfY2FzdDxfVmFsdWVUeXBlKj4KKwkoOjpvcGVyYXRvciBuZXcoc2l6ZW9mKF9WYWx1ZVR5cGUpICogX19vZmZzZXQpKTsKKworIyAgICAgcHJhZ21hIG9tcCBiYXJyaWVyCisKKyAgICAgIC8vIERyYXcgbG9jYWwgY29waWVzIHRvIGF2b2lkIGZhbHNlIHNoYXJpbmcuCisgICAgICBmb3IgKF9CaW5JbmRleCBfX2IgPSAwOyBfX2IgPCBfX3NkLT5fTV9udW1fYmlucyArIDE7ICsrX19iKQorCV9fZGlzdFtfX2JdID0gX19zZC0+X01fZGlzdFtfX2JdW19faWFtXTsKKyAgICAgIGZvciAoX0JpbkluZGV4IF9fYiA9IDA7IF9fYiA8IF9fc2QtPl9NX251bV9iaW5zOyArK19fYikKKwlfX2Jpbl9wcm9jW19fYl0gPSBfX3NkLT5fTV9iaW5fcHJvY1tfX2JdOworICAgICAgZm9yIChfVGhyZWFkSW5kZXggX190ID0gMDsgX190IDwgX19kLT5fTV9udW1fdGhyZWFkczsgKytfX3QpCisJX190ZW1wb3Jhcmllc1tfX3RdID0gX19zZC0+X01fdGVtcG9yYXJpZXNbX190XTsKKworICAgICAgX1JBSXRlciBfX3NvdXJjZSA9IF9fc2QtPl9NX3NvdXJjZTsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX3N0YXJ0ID0gX19zZC0+X01fc3RhcnRzW19faWFtXTsKKworICAgICAgLy8gRGlzdHJpYnV0ZSBhY2NvcmRpbmcgdG8gb3JhY2xlcywgc2Vjb25kIG1haW4gbG9vcC4KKyAgICAgIGZvciAoX0RpZmZlcmVuY2VUeXBlIF9faSA9IDA7IF9faSA8IF9fbGVuZ3RoOyArK19faSkKKwl7CisgICAgICAgICAgX0JpbkluZGV4IF9fdGFyZ2V0X2JpbiA9IF9fb3JhY2xlc1tfX2ldOworICAgICAgICAgIF9UaHJlYWRJbmRleCBfX3RhcmdldF9wID0gX19iaW5fcHJvY1tfX3RhcmdldF9iaW5dOworCisgICAgICAgICAgLy8gTGFzdCBjb2x1bW4gW19fZC0+X01fbnVtX3RocmVhZHNdIHN0YXlzIHVuY2hhbmdlZC4KKwkgIDo6bmV3KCYoX190ZW1wb3Jhcmllc1tfX3RhcmdldF9wXVtfX2Rpc3RbX190YXJnZXRfYmluICsgMV0rK10pKQorICAgICAgICAgICAgICBfVmFsdWVUeXBlKCooX19zb3VyY2UgKyBfX2kgKyBfX3N0YXJ0KSk7CisJfQorCisgICAgICBkZWxldGVbXSBfX29yYWNsZXM7CisgICAgICBkZWxldGVbXSBfX2Rpc3Q7CisgICAgICBkZWxldGVbXSBfX2Jpbl9wcm9jOworICAgICAgZGVsZXRlW10gX190ZW1wb3JhcmllczsKKworIyAgICAgcHJhZ21hIG9tcCBiYXJyaWVyCisKKyAgICAgIC8vIFNodWZmbGUgYmlucyBpbnRlcm5hbGx5LgorICAgICAgZm9yIChfQmluSW5kZXggX19iID0gX19kLT5fTV9iaW5zX2JlZ2luOyBfX2IgPCBfX2QtPl9fYmluc19lbmQ7ICsrX19iKQorCXsKKyAgICAgICAgICBfVmFsdWVUeXBlKiBfX2JlZ2luID0KKwkgICAgKF9fc2QtPl9NX3RlbXBvcmFyaWVzW19faWFtXQorCSAgICAgKyAoX19iID09IF9fZC0+X01fYmluc19iZWdpbgorCQk/IDAgOiBfX3NkLT5fTV9kaXN0W19fYl1bX19kLT5fTV9udW1fdGhyZWFkc10pKSwKKwkgICAgKl9fZW5kID0gKF9fc2QtPl9NX3RlbXBvcmFyaWVzW19faWFtXQorCQkgICAgICArIF9fc2QtPl9NX2Rpc3RbX19iICsgMV1bX19kLT5fTV9udW1fdGhyZWFkc10pOworCisgICAgICAgICAgX19zZXF1ZW50aWFsX3JhbmRvbV9zaHVmZmxlKF9fYmVnaW4sIF9fZW5kLCBfX3JuZyk7CisgICAgICAgICAgc3RkOjpjb3B5KF9fYmVnaW4sIF9fZW5kLCBfX3NkLT5fTV9zb3VyY2UgKyBfX2dsb2JhbF9vZmZzZXQKKwkJICAgICsgKF9fYiA9PSBfX2QtPl9NX2JpbnNfYmVnaW4KKwkJICAgICAgID8gMCA6IF9fc2QtPl9NX2Rpc3RbX19iXVtfX2QtPl9NX251bV90aHJlYWRzXSkpOworCX0KKworICAgICAgZm9yIChfU2VxdWVuY2VJbmRleCBfX2kgPSAwOyBfX2kgPCBfX29mZnNldDsgKytfX2kpCisJX19zZC0+X01fdGVtcG9yYXJpZXNbX19pYW1dW19faV0ufl9WYWx1ZVR5cGUoKTsKKyAgICAgIDo6b3BlcmF0b3IgZGVsZXRlKF9fc2QtPl9NX3RlbXBvcmFyaWVzW19faWFtXSk7CisgICAgfQorCisgIC8qKiBAYnJpZWYgUm91bmQgdXAgdG8gdGhlIG5leHQgZ3JlYXRlciBwb3dlciBvZiAyLgorICAgICogIEBwYXJhbSBfX3ggX0ludGVnZXIgdG8gcm91bmQgdXAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcCAKKyAgICBfX3JvdW5kX3VwX3RvX3BvdzIoX1RwIF9feCkKKyAgICB7CisgICAgICBpZiAoX194IDw9IDEpCisJcmV0dXJuIDE7CisgICAgICBlbHNlCisJcmV0dXJuIChfVHApMSA8PCAoX19yZF9sb2cyKF9feCAtIDEpICsgMSk7CisgICAgfQorCisgIC8qKiBAYnJpZWYgTWFpbiBwYXJhbGxlbCByYW5kb20gc2h1ZmZsZSBzdGVwLgorICAgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIHNlcXVlbmNlLgorICAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2Ygc2VxdWVuY2UuCisgICAgKiAgQHBhcmFtIF9fbiBMZW5ndGggb2Ygc2VxdWVuY2UuCisgICAgKiAgQHBhcmFtIF9fbnVtX3RocmVhZHMgTnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlLgorICAgICogIEBwYXJhbSBfX3JuZyBSYW5kb20gbnVtYmVyIGdlbmVyYXRvciB0byB1c2UuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX1JhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICB2b2lkCisgICAgX19wYXJhbGxlbF9yYW5kb21fc2h1ZmZsZV9kcnMoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorCQkJCSAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHMKKwkJCQkgIDxfUkFJdGVyPjo6ZGlmZmVyZW5jZV90eXBlIF9fbiwKKwkJCQkgIF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzLAorCQkJCSAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYgX19ybmcpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19uKQorCisgICAgICBjb25zdCBfU2V0dGluZ3MmIF9fcyA9IF9TZXR0aW5nczo6Z2V0KCk7CisKKyAgICAgIGlmIChfX251bV90aHJlYWRzID4gX19uKQorCV9fbnVtX3RocmVhZHMgPSBzdGF0aWNfY2FzdDxfVGhyZWFkSW5kZXg+KF9fbik7CisKKyAgICAgIF9CaW5JbmRleCBfX251bV9iaW5zLCBfX251bV9iaW5zX2NhY2hlOworCisjaWYgX0dMSUJDWFhfUkFORE9NX1NIVUZGTEVfQ09OU0lERVJfTDEKKyAgICAgIC8vIFRyeSB0aGUgTDEgY2FjaGUgZmlyc3QuCisKKyAgICAgIC8vIE11c3QgZml0IGludG8gTDEuCisgICAgICBfX251bV9iaW5zX2NhY2hlID0KKwlzdGQ6Om1heDxfRGlmZmVyZW5jZVR5cGU+KDEsIF9fbiAvIChfX3MuTDFfY2FjaGVfc2l6ZV9sYgorCQkJCQkgICAgLyBzaXplb2YoX1ZhbHVlVHlwZSkpKTsKKyAgICAgIF9fbnVtX2JpbnNfY2FjaGUgPSBfX3JvdW5kX3VwX3RvX3BvdzIoX19udW1fYmluc19jYWNoZSk7CisKKyAgICAgIC8vIE5vIG1vcmUgYnVja2V0cyB0aGFuIFRMQiBlbnRyaWVzLCBwb3dlciBvZiAyCisgICAgICAvLyBQb3dlciBvZiAyIGFuZCBhdCBsZWFzdCBvbmUgZWxlbWVudCBwZXIgYmluLCBhdCBtb3N0IHRoZSBUTEIgc2l6ZS4KKyAgICAgIF9fbnVtX2JpbnMgPSBzdGQ6Om1pbjxfRGlmZmVyZW5jZVR5cGU+KF9fbiwgX19udW1fYmluc19jYWNoZSk7CisKKyNpZiBfR0xJQkNYWF9SQU5ET01fU0hVRkZMRV9DT05TSURFUl9UTEIKKyAgICAgIC8vIDIgVExCIGVudHJpZXMgbmVlZGVkIHBlciBiaW4uCisgICAgICBfX251bV9iaW5zID0gc3RkOjptaW48X0RpZmZlcmVuY2VUeXBlPihfX3MuVExCX3NpemUgLyAyLCBfX251bV9iaW5zKTsKKyNlbmRpZgorICAgICAgX19udW1fYmlucyA9IF9fcm91bmRfdXBfdG9fcG93MihfX251bV9iaW5zKTsKKworICAgICAgaWYgKF9fbnVtX2JpbnMgPCBfX251bV9iaW5zX2NhY2hlKQorCXsKKyNlbmRpZgorICAgICAgICAgIC8vIE5vdyB0cnkgdGhlIEwyIGNhY2hlCisgICAgICAgICAgLy8gTXVzdCBmaXQgaW50byBMMgorICAgICAgICAgIF9fbnVtX2JpbnNfY2FjaGUgPSBzdGF0aWNfY2FzdDxfQmluSW5kZXg+CisJICAgIChzdGQ6Om1heDxfRGlmZmVyZW5jZVR5cGU+KDEsIF9fbiAvIChfX3MuTDJfY2FjaGVfc2l6ZQorCQkJCQkJIC8gc2l6ZW9mKF9WYWx1ZVR5cGUpKSkpOworICAgICAgICAgIF9fbnVtX2JpbnNfY2FjaGUgPSBfX3JvdW5kX3VwX3RvX3BvdzIoX19udW1fYmluc19jYWNoZSk7CisKKyAgICAgICAgICAvLyBObyBtb3JlIGJ1Y2tldHMgdGhhbiBUTEIgZW50cmllcywgcG93ZXIgb2YgMi4KKyAgICAgICAgICBfX251bV9iaW5zID0gc3RhdGljX2Nhc3Q8X0JpbkluZGV4PgorCSAgICAoc3RkOjptaW4oX19uLCBzdGF0aWNfY2FzdDxfRGlmZmVyZW5jZVR5cGU+KF9fbnVtX2JpbnNfY2FjaGUpKSk7CisgICAgICAgICAgLy8gUG93ZXIgb2YgMiBhbmQgYXQgbGVhc3Qgb25lIGVsZW1lbnQgcGVyIGJpbiwgYXQgbW9zdCB0aGUgVExCIHNpemUuCisjaWYgX0dMSUJDWFhfUkFORE9NX1NIVUZGTEVfQ09OU0lERVJfVExCCisgICAgICAgICAgLy8gMiBUTEIgZW50cmllcyBuZWVkZWQgcGVyIGJpbi4KKyAgICAgICAgICBfX251bV9iaW5zID0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8X0RpZmZlcmVuY2VUeXBlPihfX3MuVExCX3NpemUgLyAyKSwKKwkJCQlfX251bV9iaW5zKTsKKyNlbmRpZgorICAgICAgICAgICAgX19udW1fYmlucyA9IF9fcm91bmRfdXBfdG9fcG93MihfX251bV9iaW5zKTsKKyNpZiBfR0xJQkNYWF9SQU5ET01fU0hVRkZMRV9DT05TSURFUl9MMQorCX0KKyNlbmRpZgorCisgICAgICBfX251bV9iaW5zID0gX19yb3VuZF91cF90b19wb3cyKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXg8X0JpbkluZGV4PihfX251bV90aHJlYWRzLCBfX251bV9iaW5zKSk7CisKKyAgICAgIGlmIChfX251bV90aHJlYWRzIDw9IDEpCisgICAgICB7CisgICAgICAgIF9SYW5kb21OdW1iZXIgX19kZXJpdmVkX3JuZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3JuZyhzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpKTsKKwlfX3NlcXVlbnRpYWxfcmFuZG9tX3NodWZmbGUoX19iZWdpbiwgX19lbmQsIF9fZGVyaXZlZF9ybmcpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIF9EUmFuZG9tU2h1ZmZsaW5nR2xvYmFsRGF0YTxfUkFJdGVyPiBfX3NkKF9fYmVnaW4pOworICAgICAgX0RSU1NvcnRlclBVPF9SQUl0ZXIsIF9SYW5kb21OdW1iZXIgPiogX19wdXM7CisgICAgICBfRGlmZmVyZW5jZVR5cGUqIF9fc3RhcnRzOworCisjICAgICBwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzKF9fbnVtX3RocmVhZHMpCisgICAgICB7CisJX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCk7CisjICAgICAgIHByYWdtYSBvbXAgc2luZ2xlCisJeworCSAgX19wdXMgPSBuZXcgX0RSU1NvcnRlclBVPF9SQUl0ZXIsIF9SYW5kb21OdW1iZXI+W19fbnVtX3RocmVhZHNdOworCSAgCisJICBfX3NkLl9NX3RlbXBvcmFyaWVzID0gbmV3IF9WYWx1ZVR5cGUqW19fbnVtX3RocmVhZHNdOworCSAgX19zZC5fTV9kaXN0ID0gbmV3IF9EaWZmZXJlbmNlVHlwZSpbX19udW1fYmlucyArIDFdOworCSAgX19zZC5fTV9iaW5fcHJvYyA9IG5ldyBfVGhyZWFkSW5kZXhbX19udW1fYmluc107CisJICBmb3IgKF9CaW5JbmRleCBfX2IgPSAwOyBfX2IgPCBfX251bV9iaW5zICsgMTsgKytfX2IpCisJICAgIF9fc2QuX01fZGlzdFtfX2JdID0gbmV3IF9EaWZmZXJlbmNlVHlwZVtfX251bV90aHJlYWRzICsgMV07CisJICBmb3IgKF9CaW5JbmRleCBfX2IgPSAwOyBfX2IgPCAoX19udW1fYmlucyArIDEpOyArK19fYikKKwkgICAgeworCSAgICAgIF9fc2QuX01fZGlzdFswXVswXSA9IDA7CisJICAgICAgX19zZC5fTV9kaXN0W19fYl1bMF0gPSAwOworCSAgICB9CisJICBfX3N0YXJ0cyA9IF9fc2QuX01fc3RhcnRzID0gbmV3IF9EaWZmZXJlbmNlVHlwZVtfX251bV90aHJlYWRzICsgMV07CisJICBpbnQgX19iaW5fY3Vyc29yID0gMDsKKwkgIF9fc2QuX01fbnVtX2JpbnMgPSBfX251bV9iaW5zOworCSAgX19zZC5fTV9udW1fYml0cyA9IF9fcmRfbG9nMihfX251bV9iaW5zKTsKKworCSAgX0RpZmZlcmVuY2VUeXBlIF9fY2h1bmtfbGVuZ3RoID0gX19uIC8gX19udW1fdGhyZWFkcywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgX19zcGxpdCA9IF9fbiAlIF9fbnVtX3RocmVhZHMsCisJICAgICAgICAgICAgICAgICAgICAgICAgIF9fc3RhcnQgPSAwOworCSAgX0RpZmZlcmVuY2VUeXBlIF9fYmluX2NodW5rX2xlbmd0aCA9IF9fbnVtX2JpbnMgLyBfX251bV90aHJlYWRzLAorCSAgICAgICAgICAgICAgICAgICAgICAgICBfX2Jpbl9zcGxpdCA9IF9fbnVtX2JpbnMgJSBfX251bV90aHJlYWRzOworCSAgZm9yIChfVGhyZWFkSW5kZXggX19pID0gMDsgX19pIDwgX19udW1fdGhyZWFkczsgKytfX2kpCisJICAgIHsKKwkgICAgICBfX3N0YXJ0c1tfX2ldID0gX19zdGFydDsKKwkgICAgICBfX3N0YXJ0ICs9IChfX2kgPCBfX3NwbGl0CisJCQkgID8gKF9fY2h1bmtfbGVuZ3RoICsgMSkgOiBfX2NodW5rX2xlbmd0aCk7CisJICAgICAgaW50IF9faiA9IF9fcHVzW19faV0uX01fYmluc19iZWdpbiA9IF9fYmluX2N1cnNvcjsKKworCSAgICAgIC8vIFJhbmdlIG9mIGJpbnMgZm9yIHRoaXMgcHJvY2Vzc29yLgorCSAgICAgIF9fYmluX2N1cnNvciArPSAoX19pIDwgX19iaW5fc3BsaXQKKwkJCSAgICAgICA/IChfX2Jpbl9jaHVua19sZW5ndGggKyAxKQorCQkJICAgICAgIDogX19iaW5fY2h1bmtfbGVuZ3RoKTsKKwkgICAgICBfX3B1c1tfX2ldLl9fYmluc19lbmQgPSBfX2Jpbl9jdXJzb3I7CisJICAgICAgZm9yICg7IF9faiA8IF9fYmluX2N1cnNvcjsgKytfX2opCisJCV9fc2QuX01fYmluX3Byb2NbX19qXSA9IF9faTsKKwkgICAgICBfX3B1c1tfX2ldLl9NX251bV90aHJlYWRzID0gX19udW1fdGhyZWFkczsKKwkgICAgICBfX3B1c1tfX2ldLl9NX3NlZWQgPSBfX3JuZyhzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpOworCSAgICAgIF9fcHVzW19faV0uX01fc2QgPSAmX19zZDsKKwkgICAgfQorCSAgX19zdGFydHNbX19udW1fdGhyZWFkc10gPSBfX3N0YXJ0OworCX0gLy9zaW5nbGUKKyAgICAgICAgICAvLyBOb3cgc2h1ZmZsZSBpbiBwYXJhbGxlbC4KKwlfX3BhcmFsbGVsX3JhbmRvbV9zaHVmZmxlX2Ryc19wdShfX3B1cyk7CisgICAgICB9ICAvLyBwYXJhbGxlbAorCisgICAgICBkZWxldGVbXSBfX3N0YXJ0czsKKyAgICAgIGRlbGV0ZVtdIF9fc2QuX01fYmluX3Byb2M7CisgICAgICBmb3IgKGludCBfX3MgPSAwOyBfX3MgPCAoX19udW1fYmlucyArIDEpOyArK19fcykKKwlkZWxldGVbXSBfX3NkLl9NX2Rpc3RbX19zXTsKKyAgICAgIGRlbGV0ZVtdIF9fc2QuX01fZGlzdDsKKyAgICAgIGRlbGV0ZVtdIF9fc2QuX01fdGVtcG9yYXJpZXM7CisKKyAgICAgIGRlbGV0ZVtdIF9fcHVzOworICAgIH0KKworICAvKiogQGJyaWVmIFNlcXVlbnRpYWwgY2FjaGUtZWZmaWNpZW50IHJhbmRvbSBzaHVmZmxlLgorICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2Ygc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19lbmQgRW5kIGl0ZXJhdG9yIG9mIHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fcm5nIFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRvIHVzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgdm9pZAorICAgIF9fc2VxdWVudGlhbF9yYW5kb21fc2h1ZmZsZShfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisJCQkJX1JhbmRvbU51bWJlckdlbmVyYXRvciYgX19ybmcpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX24gPSBfX2VuZCAtIF9fYmVnaW47CisgICAgICBjb25zdCBfU2V0dGluZ3MmIF9fcyA9IF9TZXR0aW5nczo6Z2V0KCk7CisKKyAgICAgIF9CaW5JbmRleCBfX251bV9iaW5zLCBfX251bV9iaW5zX2NhY2hlOworCisjaWYgX0dMSUJDWFhfUkFORE9NX1NIVUZGTEVfQ09OU0lERVJfTDEKKyAgICAgIC8vIFRyeSB0aGUgTDEgY2FjaGUgZmlyc3QsIG11c3QgZml0IGludG8gTDEuCisgICAgICBfX251bV9iaW5zX2NhY2hlID0gc3RkOjptYXg8X0RpZmZlcmVuY2VUeXBlPgorCSgxLCBfX24gLyAoX19zLkwxX2NhY2hlX3NpemVfbGIgLyBzaXplb2YoX1ZhbHVlVHlwZSkpKTsKKyAgICAgIF9fbnVtX2JpbnNfY2FjaGUgPSBfX3JvdW5kX3VwX3RvX3BvdzIoX19udW1fYmluc19jYWNoZSk7CisKKyAgICAgIC8vIE5vIG1vcmUgYnVja2V0cyB0aGFuIFRMQiBlbnRyaWVzLCBwb3dlciBvZiAyCisgICAgICAvLyBQb3dlciBvZiAyIGFuZCBhdCBsZWFzdCBvbmUgZWxlbWVudCBwZXIgYmluLCBhdCBtb3N0IHRoZSBUTEIgc2l6ZQorICAgICAgX19udW1fYmlucyA9IHN0ZDo6bWluKF9fbiwgKF9EaWZmZXJlbmNlVHlwZSlfX251bV9iaW5zX2NhY2hlKTsKKyNpZiBfR0xJQkNYWF9SQU5ET01fU0hVRkZMRV9DT05TSURFUl9UTEIKKyAgICAgIC8vIDIgVExCIGVudHJpZXMgbmVlZGVkIHBlciBiaW4KKyAgICAgIF9fbnVtX2JpbnMgPSBzdGQ6Om1pbigoX0RpZmZlcmVuY2VUeXBlKV9fcy5UTEJfc2l6ZSAvIDIsIF9fbnVtX2JpbnMpOworI2VuZGlmCisgICAgICBfX251bV9iaW5zID0gX19yb3VuZF91cF90b19wb3cyKF9fbnVtX2JpbnMpOworCisgICAgICBpZiAoX19udW1fYmlucyA8IF9fbnVtX2JpbnNfY2FjaGUpCisJeworI2VuZGlmCisgICAgICAgICAgLy8gTm93IHRyeSB0aGUgTDIgY2FjaGUsIG11c3QgZml0IGludG8gTDIuCisgICAgICAgICAgX19udW1fYmluc19jYWNoZSA9IHN0YXRpY19jYXN0PF9CaW5JbmRleD4KKwkgICAgKHN0ZDo6bWF4PF9EaWZmZXJlbmNlVHlwZT4oMSwgX19uIC8gKF9fcy5MMl9jYWNoZV9zaXplCisJCQkJCQkgLyBzaXplb2YoX1ZhbHVlVHlwZSkpKSk7CisgICAgICAgICAgX19udW1fYmluc19jYWNoZSA9IF9fcm91bmRfdXBfdG9fcG93MihfX251bV9iaW5zX2NhY2hlKTsKKworICAgICAgICAgIC8vIE5vIG1vcmUgYnVja2V0cyB0aGFuIFRMQiBlbnRyaWVzLCBwb3dlciBvZiAyCisgICAgICAgICAgLy8gUG93ZXIgb2YgMiBhbmQgYXQgbGVhc3Qgb25lIGVsZW1lbnQgcGVyIGJpbiwgYXQgbW9zdCB0aGUgVExCIHNpemUuCisgICAgICAgICAgX19udW1fYmlucyA9IHN0YXRpY19jYXN0PF9CaW5JbmRleD4KKwkgICAgKHN0ZDo6bWluKF9fbiwgc3RhdGljX2Nhc3Q8X0RpZmZlcmVuY2VUeXBlPihfX251bV9iaW5zX2NhY2hlKSkpOworCisjaWYgX0dMSUJDWFhfUkFORE9NX1NIVUZGTEVfQ09OU0lERVJfVExCCisgICAgICAgICAgLy8gMiBUTEIgZW50cmllcyBuZWVkZWQgcGVyIGJpbgorICAgICAgICAgIF9fbnVtX2JpbnMgPSBzdGQ6Om1pbjxfRGlmZmVyZW5jZVR5cGU+KF9fcy5UTEJfc2l6ZSAvIDIsIF9fbnVtX2JpbnMpOworI2VuZGlmCisgICAgICAgICAgX19udW1fYmlucyA9IF9fcm91bmRfdXBfdG9fcG93MihfX251bV9iaW5zKTsKKyNpZiBfR0xJQkNYWF9SQU5ET01fU0hVRkZMRV9DT05TSURFUl9MMQorCX0KKyNlbmRpZgorCisgICAgICBpbnQgX19udW1fYml0cyA9IF9fcmRfbG9nMihfX251bV9iaW5zKTsKKworICAgICAgaWYgKF9fbnVtX2JpbnMgPiAxKQorCXsKKyAgICAgICAgICBfVmFsdWVUeXBlKiBfX3RhcmdldCA9CisJICAgIHN0YXRpY19jYXN0PF9WYWx1ZVR5cGUqPig6Om9wZXJhdG9yIG5ldyhzaXplb2YoX1ZhbHVlVHlwZSkgKiBfX24pKTsKKyAgICAgICAgICBfQmluSW5kZXgqIF9fb3JhY2xlcyA9IG5ldyBfQmluSW5kZXhbX19uXTsKKyAgICAgICAgICBfRGlmZmVyZW5jZVR5cGUqIF9fZGlzdDAgPSBuZXcgX0RpZmZlcmVuY2VUeXBlW19fbnVtX2JpbnMgKyAxXSwKKyAgICAgICAgICAgICAgICAJICogX19kaXN0MSA9IG5ldyBfRGlmZmVyZW5jZVR5cGVbX19udW1fYmlucyArIDFdOworCisgICAgICAgICAgZm9yIChpbnQgX19iID0gMDsgX19iIDwgX19udW1fYmlucyArIDE7ICsrX19iKQorICAgICAgICAgICAgX19kaXN0MFtfX2JdID0gMDsKKworICAgICAgICAgIF9SYW5kb21OdW1iZXIgX19iaXRybmcoX19ybmcoMHhGRkZGRkZGRikpOworCisgICAgICAgICAgZm9yIChfRGlmZmVyZW5jZVR5cGUgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0JpbkluZGV4IF9fb3JhY2xlID0gX19yYW5kb21fbnVtYmVyX3BvdzIoX19udW1fYml0cywgX19iaXRybmcpOworICAgICAgICAgICAgICBfX29yYWNsZXNbX19pXSA9IF9fb3JhY2xlOworCisgICAgICAgICAgICAgIC8vIFRvIGFsbG93IHByZWZpeCAocGFydGlhbCkgc3VtLgorICAgICAgICAgICAgICArKyhfX2Rpc3QwW19fb3JhY2xlICsgMV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgLy8gU3VtIHVwIGJpbnMuCisgICAgICAgICAgX19nbnVfc2VxdWVudGlhbDo6cGFydGlhbF9zdW0oX19kaXN0MCwgX19kaXN0MCArIF9fbnVtX2JpbnMgKyAxLAorCQkJCQlfX2Rpc3QwKTsKKworICAgICAgICAgIGZvciAoaW50IF9fYiA9IDA7IF9fYiA8IF9fbnVtX2JpbnMgKyAxOyArK19fYikKKyAgICAgICAgICAgIF9fZGlzdDFbX19iXSA9IF9fZGlzdDBbX19iXTsKKworICAgICAgICAgIC8vIERpc3RyaWJ1dGUgYWNjb3JkaW5nIHRvIG9yYWNsZXMuCisgICAgICAgICAgZm9yIChfRGlmZmVyZW5jZVR5cGUgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKyAgICAgICAgICAgIDo6bmV3KCYoX190YXJnZXRbKF9fZGlzdDBbX19vcmFjbGVzW19faV1dKSsrXSkpIAorCQlfVmFsdWVUeXBlKCooX19iZWdpbiArIF9faSkpOworCisgICAgICAgICAgZm9yIChpbnQgX19iID0gMDsgX19iIDwgX19udW1fYmluczsgKytfX2IpCisJICAgIF9fc2VxdWVudGlhbF9yYW5kb21fc2h1ZmZsZShfX3RhcmdldCArIF9fZGlzdDFbX19iXSwKKwkJCQkJX190YXJnZXQgKyBfX2Rpc3QxW19fYiArIDFdLCBfX3JuZyk7CisKKyAgICAgICAgICAvLyBDb3B5IGVsZW1lbnRzIGJhY2suCisgICAgICAgICAgc3RkOjpjb3B5KF9fdGFyZ2V0LCBfX3RhcmdldCArIF9fbiwgX19iZWdpbik7CisKKyAgICAgICAgICBkZWxldGVbXSBfX2Rpc3QwOworICAgICAgICAgIGRlbGV0ZVtdIF9fZGlzdDE7CisgICAgICAgICAgZGVsZXRlW10gX19vcmFjbGVzOworCSAgCisJICBmb3IgKF9EaWZmZXJlbmNlVHlwZSBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorCSAgICBfX3RhcmdldFtfX2ldLn5fVmFsdWVUeXBlKCk7CisgICAgICAgICAgOjpvcGVyYXRvciBkZWxldGUoX190YXJnZXQpOworCX0KKyAgICAgIGVsc2UKKwlfX2dudV9zZXF1ZW50aWFsOjpyYW5kb21fc2h1ZmZsZShfX2JlZ2luLCBfX2VuZCwgX19ybmcpOworICAgIH0KKworICAvKiogQGJyaWVmIFBhcmFsbGVsIHJhbmRvbSBwdWJsaWMgY2FsbC4KKyAgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fZW5kIEVuZCBpdGVyYXRvciBvZiBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX3JuZyBSYW5kb20gbnVtYmVyIGdlbmVyYXRvciB0byB1c2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgX19wYXJhbGxlbF9yYW5kb21fc2h1ZmZsZShfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisJCQkgICAgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yIF9fcm5nID0gX1JhbmRvbU51bWJlcigpKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fbiA9IF9fZW5kIC0gX19iZWdpbjsKKyAgICAgIF9fcGFyYWxsZWxfcmFuZG9tX3NodWZmbGVfZHJzKF9fYmVnaW4sIF9fZW5kLCBfX24sCisJCQkJICAgIF9fZ2V0X21heF90aHJlYWRzKCksIF9fcm5nKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9SQU5ET01fU0hVRkZMRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3NlYXJjaC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9zZWFyY2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzg4NjkyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9zZWFyY2guaApAQCAtMCwwICsxLDE3MiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL3NlYXJjaC5oCisgKiAgQGJyaWVmIFBhcmFsbGVsIGltcGxlbWVudGF0aW9uIGJhc2UgZm9yIHN0ZDo6c2VhcmNoKCkgYW5kCisgKiAgc3RkOjpzZWFyY2hfbigpLgorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwYXJhbGxlbCBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgRmVsaXggUHV0emUuCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfU0VBUkNIX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfU0VBUkNIX0ggMQorCisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4KKworI2luY2x1ZGUgPHBhcmFsbGVsL3BhcmFsbGVsLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvZXF1YWxseV9zcGxpdC5oPgorCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgLyoqCisgICAqICBAYnJpZWYgUHJlY2FsY3VsYXRlIF9fYWR2YW5jZXMgZm9yIEtudXRoLU1vcnJpcy1QcmF0dCBhbGdvcml0aG0uCisgICAqICBAcGFyYW0gX19lbGVtZW50cyBCZWdpbiBpdGVyYXRvciBvZiBzZXF1ZW5jZSB0byBzZWFyY2ggZm9yLgorICAgKiAgQHBhcmFtIF9fbGVuZ3RoIExlbmd0aCBvZiBzZXF1ZW5jZSB0byBzZWFyY2ggZm9yLgorICAgKiAgQHBhcmFtIF9fb2ZmIFJldHVybmVkIF9fb2Zmc2V0cy4gCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfRGlmZmVyZW5jZVRwPgorICAgIHZvaWQKKyAgICBfX2NhbGNfYm9yZGVycyhfUkFJdGVyIF9fZWxlbWVudHMsIF9EaWZmZXJlbmNlVHAgX19sZW5ndGgsIAorCQkgICBfRGlmZmVyZW5jZVRwKiBfX29mZikKKyAgICB7CisgICAgICB0eXBlZGVmIF9EaWZmZXJlbmNlVHAgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICBfX29mZlswXSA9IC0xOworICAgICAgaWYgKF9fbGVuZ3RoID4gMSkKKwlfX29mZlsxXSA9IDA7CisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19rID0gMDsKKyAgICAgIGZvciAoX0RpZmZlcmVuY2VUeXBlIF9faiA9IDI7IF9faiA8PSBfX2xlbmd0aDsgX19qKyspCisJeworICAgICAgICAgIHdoaWxlICgoX19rID49IDApICYmICEoX19lbGVtZW50c1tfX2tdID09IF9fZWxlbWVudHNbX19qLTFdKSkKKyAgICAgICAgICAgIF9fayA9IF9fb2ZmW19fa107CisgICAgICAgICAgX19vZmZbX19qXSA9ICsrX19rOworCX0KKyAgICB9CisKKyAgLy8gR2VuZXJpYyBwYXJhbGxlbCBmaW5kIGFsZ29yaXRobSAocmVxdWlyZXMgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcikuCisKKyAgLyoqIEBicmllZiBQYXJhbGxlbCBzdGQ6OnNlYXJjaC4KKyAgICogIEBwYXJhbSBfX2JlZ2luMSBCZWdpbiBpdGVyYXRvciBvZiBmaXJzdCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZDEgRW5kIGl0ZXJhdG9yIG9mIGZpcnN0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fYmVnaW4yIEJlZ2luIGl0ZXJhdG9yIG9mIHNlY29uZCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZDIgRW5kIGl0ZXJhdG9yIG9mIHNlY29uZCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX3ByZWQgRmluZCBwcmVkaWNhdGUuCisgICAqICBAcmV0dXJuIFBsYWNlIG9mIGZpbmRpbmcgaW4gZmlyc3Qgc2VxdWVuY2VzLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfX1JBSXRlcjEsCisgICAgICAgICAgIHR5cGVuYW1lIF9fUkFJdGVyMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX1ByZWQ+CisgICAgX19SQUl0ZXIxCisgICAgX19zZWFyY2hfdGVtcGxhdGUoX19SQUl0ZXIxIF9fYmVnaW4xLCBfX1JBSXRlcjEgX19lbmQxLAorCQkgICAgICBfX1JBSXRlcjIgX19iZWdpbjIsIF9fUkFJdGVyMiBfX2VuZDIsCisJCSAgICAgIF9QcmVkIF9fcHJlZCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9fUkFJdGVyMT4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICBfR0xJQkNYWF9DQUxMKChfX2VuZDEgLSBfX2JlZ2luMSkgKyAoX19lbmQyIC0gX19iZWdpbjIpKTsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fcGF0dGVybl9sZW5ndGggPSBfX2VuZDIgLSBfX2JlZ2luMjsKKworICAgICAgLy8gUGF0dGVybiB0b28gc2hvcnQuCisgICAgICBpZihfX3BhdHRlcm5fbGVuZ3RoIDw9IDApCisJcmV0dXJuIF9fZW5kMTsKKworICAgICAgLy8gTGFzdCBwb2ludCB0byBzdGFydCBzZWFyY2guCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19pbnB1dF9sZW5ndGggPSAoX19lbmQxIC0gX19iZWdpbjEpIC0gX19wYXR0ZXJuX2xlbmd0aDsKKworICAgICAgLy8gV2hlcmUgaXMgZmlyc3Qgb2NjdXJyZW5jZSBvZiBwYXR0ZXJuPyBkZWZhdWx0cyB0byBlbmQuCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19yZXN1bHQgPSAoX19lbmQxIC0gX19iZWdpbjEpOworICAgICAgX0RpZmZlcmVuY2VUeXBlICpfX3NwbGl0dGVyczsKKworICAgICAgLy8gUGF0dGVybiB0b28gbG9uZy4KKyAgICAgIGlmIChfX2lucHV0X2xlbmd0aCA8IDApCisJcmV0dXJuIF9fZW5kMTsKKworICAgICAgb21wX2xvY2tfdCBfX3Jlc3VsdF9sb2NrOworICAgICAgb21wX2luaXRfbG9jaygmX19yZXN1bHRfbG9jayk7CisKKyAgICAgIF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzID0gc3RkOjptYXg8X0RpZmZlcmVuY2VUeXBlPgorCSgxLCBzdGQ6Om1pbjxfRGlmZmVyZW5jZVR5cGU+KF9faW5wdXRfbGVuZ3RoLAorCQkJCSAgICAgIF9fZ2V0X21heF90aHJlYWRzKCkpKTsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fYWR2YW5jZXNbX19wYXR0ZXJuX2xlbmd0aF07CisgICAgICBfX2NhbGNfYm9yZGVycyhfX2JlZ2luMiwgX19wYXR0ZXJuX2xlbmd0aCwgX19hZHZhbmNlcyk7CisKKyMgICAgIHByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoX19udW1fdGhyZWFkcykKKyAgICAgIHsKKyMgICAgICAgcHJhZ21hIG9tcCBzaW5nbGUKKwl7CisJICBfX251bV90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpOworCSAgX19zcGxpdHRlcnMgPSBuZXcgX0RpZmZlcmVuY2VUeXBlW19fbnVtX3RocmVhZHMgKyAxXTsKKwkgIF9fZXF1YWxseV9zcGxpdChfX2lucHV0X2xlbmd0aCwgX19udW1fdGhyZWFkcywgX19zcGxpdHRlcnMpOworCX0KKworCV9UaHJlYWRJbmRleCBfX2lhbSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworCisJX0RpZmZlcmVuY2VUeXBlIF9fc3RhcnQgPSBfX3NwbGl0dGVyc1tfX2lhbV0sCisJICAgICAgICAgICAgICAgICBfX3N0b3AgPSBfX3NwbGl0dGVyc1tfX2lhbSArIDFdOworCisJX0RpZmZlcmVuY2VUeXBlIF9fcG9zX2luX3BhdHRlcm4gPSAwOworCWJvb2wgX19mb3VuZF9wYXR0ZXJuID0gZmFsc2U7CisKKwl3aGlsZSAoX19zdGFydCA8PSBfX3N0b3AgJiYgIV9fZm91bmRfcGF0dGVybikKKwkgIHsKKwkgICAgLy8gR2V0IG5ldyB2YWx1ZSBvZiByZXN1bHQuCisjcHJhZ21hIG9tcCBmbHVzaChfX3Jlc3VsdCkKKwkgICAgLy8gTm8gY2hhbmNlIGZvciB0aGlzIHRocmVhZCB0byBmaW5kIGZpcnN0IG9jY3VycmVuY2UuCisJICAgIGlmIChfX3Jlc3VsdCA8IF9fc3RhcnQpCisJICAgICAgYnJlYWs7CisJICAgIHdoaWxlIChfX3ByZWQoX19iZWdpbjFbX19zdGFydCArIF9fcG9zX2luX3BhdHRlcm5dLAorCQkJICBfX2JlZ2luMltfX3Bvc19pbl9wYXR0ZXJuXSkpCisJICAgICAgeworCQkrK19fcG9zX2luX3BhdHRlcm47CisJCWlmIChfX3Bvc19pbl9wYXR0ZXJuID09IF9fcGF0dGVybl9sZW5ndGgpCisJCSAgeworCQkgICAgLy8gRm91bmQgbmV3IGNhbmRpZGF0ZSBmb3IgcmVzdWx0LgorCQkgICAgb21wX3NldF9sb2NrKCZfX3Jlc3VsdF9sb2NrKTsKKwkJICAgIF9fcmVzdWx0ID0gc3RkOjptaW4oX19yZXN1bHQsIF9fc3RhcnQpOworCQkgICAgb21wX3Vuc2V0X2xvY2soJl9fcmVzdWx0X2xvY2spOworCisJCSAgICBfX2ZvdW5kX3BhdHRlcm4gPSB0cnVlOworCQkgICAgYnJlYWs7CisJCSAgfQorCSAgICAgIH0KKwkgICAgLy8gTWFrZSBzYWZlIGp1bXAuCisJICAgIF9fc3RhcnQgKz0gKF9fcG9zX2luX3BhdHRlcm4gLSBfX2FkdmFuY2VzW19fcG9zX2luX3BhdHRlcm5dKTsKKwkgICAgX19wb3NfaW5fcGF0dGVybiA9IChfX2FkdmFuY2VzW19fcG9zX2luX3BhdHRlcm5dIDwgMAorCQkJCT8gMCA6IF9fYWR2YW5jZXNbX19wb3NfaW5fcGF0dGVybl0pOworCSAgfQorICAgICAgfSAvL3BhcmFsbGVsCisKKyAgICAgIG9tcF9kZXN0cm95X2xvY2soJl9fcmVzdWx0X2xvY2spOworCisgICAgICBkZWxldGVbXSBfX3NwbGl0dGVyczsKKyAgICAgIAorICAgICAgLy8gUmV0dXJuIGl0ZXJhdG9yIG9uIGZvdW5kIGVsZW1lbnQuCisgICAgICByZXR1cm4gKF9fYmVnaW4xICsgX19yZXN1bHQpOworICAgIH0KK30gLy8gZW5kIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0dMSUJDWFhfUEFSQUxMRUxfU0VBUkNIX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvc2V0X29wZXJhdGlvbnMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvc2V0X29wZXJhdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDhiMWY0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9zZXRfb3BlcmF0aW9ucy5oCkBAIC0wLDAgKzEsNTI5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKioKKyAqIEBmaWxlIHBhcmFsbGVsL3NldF9vcGVyYXRpb25zLmgKKyAqIEBicmllZiBQYXJhbGxlbCBpbXBsZW1lbnRhdGlvbnMgb2Ygc2V0IG9wZXJhdGlvbnMgZm9yIHJhbmRvbS1hY2Nlc3MKKyAqIGl0ZXJhdG9ycy4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IE1hcml1cyBFbHZlcnQgYW5kIEZlbGl4IEJvbmRhcmVua28uCisKKyNpZm5kZWYgX0dMSUJDWFhfUEFSQUxMRUxfU0VUX09QRVJBVElPTlNfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9TRVRfT1BFUkFUSU9OU19IIDEKKworI2luY2x1ZGUgPG9tcC5oPgorCisjaW5jbHVkZSA8cGFyYWxsZWwvc2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9tdWx0aXNlcV9zZWxlY3Rpb24uaD4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fY29weV90YWlsKHN0ZDo6cGFpcjxfSUl0ZXIsIF9JSXRlcj4gX19iLAorCQlzdGQ6OnBhaXI8X0lJdGVyLCBfSUl0ZXI+IF9fZSwgX091dHB1dEl0ZXJhdG9yIF9fcikKKyAgICB7CisgICAgICBpZiAoX19iLmZpcnN0ICE9IF9fZS5maXJzdCkKKwl7CisgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgKl9fcisrID0gKl9fYi5maXJzdCsrOworICAgICAgICAgICAgfQorICAgICAgICAgIHdoaWxlIChfX2IuZmlyc3QgIT0gX19lLmZpcnN0KTsKKwl9CisgICAgICBlbHNlCisJeworICAgICAgICAgIHdoaWxlIChfX2Iuc2Vjb25kICE9IF9fZS5zZWNvbmQpCisgICAgICAgICAgICAqX19yKysgPSAqX19iLnNlY29uZCsrOworCX0KKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBzdHJ1Y3QgX19zeW1tZXRyaWNfZGlmZmVyZW5jZV9mdW5jCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpwYWlyPF9JSXRlciwgX0lJdGVyPiBfSXRlcmF0b3JQYWlyOworCisgICAgICBfX3N5bW1ldHJpY19kaWZmZXJlbmNlX2Z1bmMoX0NvbXBhcmUgX19jb21wKSA6IF9NX2NvbXAoX19jb21wKSB7fQorCisgICAgICBfQ29tcGFyZSBfTV9jb21wOworCisgICAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICAgIF9NX2ludm9rZShfSUl0ZXIgX19hLCBfSUl0ZXIgX19iLCBfSUl0ZXIgX19jLCBfSUl0ZXIgX19kLAorCQlfT3V0cHV0SXRlcmF0b3IgX19yKSBjb25zdAorICAgICAgeworCXdoaWxlIChfX2EgIT0gX19iICYmIF9fYyAhPSBfX2QpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKF9NX2NvbXAoKl9fYSwgKl9fYykpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgCSpfX3IgPSAqX19hOworICAgICAgICAJKytfX2E7CisgICAgICAgIAkrK19fcjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoX01fY29tcCgqX19jLCAqX19hKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAJKl9fciA9ICpfX2M7CisgICAgICAgIAkrK19fYzsKKyAgICAgICAgCSsrX19yOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgCSsrX19hOworICAgICAgICAJKytfX2M7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisJcmV0dXJuIHN0ZDo6Y29weShfX2MsIF9fZCwgc3RkOjpjb3B5KF9fYSwgX19iLCBfX3IpKTsKKyAgICAgIH0KKworICAgICAgX0RpZmZlcmVuY2VUeXBlCisgICAgICBfX2NvdW50KF9JSXRlciBfX2EsIF9JSXRlciBfX2IsIF9JSXRlciBfX2MsIF9JSXRlciBfX2QpIGNvbnN0CisgICAgICB7CisJX0RpZmZlcmVuY2VUeXBlIF9fY291bnRlciA9IDA7CisKKwl3aGlsZSAoX19hICE9IF9fYiAmJiBfX2MgIT0gX19kKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfTV9jb21wKCpfX2EsICpfX2MpKQorICAgICAgICAgICAgICB7CisgICAgICAgIAkrK19fYTsKKyAgICAgICAgCSsrX19jb3VudGVyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChfTV9jb21wKCpfX2MsICpfX2EpKQorICAgICAgICAgICAgICB7CisgICAgICAgIAkrK19fYzsKKyAgICAgICAgCSsrX19jb3VudGVyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgCSsrX19hOworICAgICAgICAJKytfX2M7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKwlyZXR1cm4gX19jb3VudGVyICsgKF9fYiAtIF9fYSkgKyAoX19kIC0gX19jKTsKKyAgICAgIH0KKworICAgICAgX091dHB1dEl0ZXJhdG9yCisgICAgICBfX2ZpcnN0X2VtcHR5KF9JSXRlciBfX2MsIF9JSXRlciBfX2QsIF9PdXRwdXRJdGVyYXRvciBfX291dCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6Y29weShfX2MsIF9fZCwgX19vdXQpOyB9CisKKyAgICAgIF9PdXRwdXRJdGVyYXRvcgorICAgICAgX19zZWNvbmRfZW1wdHkoX0lJdGVyIF9fYSwgX0lJdGVyIF9fYiwgX091dHB1dEl0ZXJhdG9yIF9fb3V0KSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpjb3B5KF9fYSwgX19iLCBfX291dCk7IH0KKyAgICB9OworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHN0cnVjdCBfX2RpZmZlcmVuY2VfZnVuYworICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6cGFpcjxfSUl0ZXIsIF9JSXRlcj4gX0l0ZXJhdG9yUGFpcjsKKworICAgICAgX19kaWZmZXJlbmNlX2Z1bmMoX0NvbXBhcmUgX19jb21wKSA6IF9NX2NvbXAoX19jb21wKSB7fQorCisgICAgICBfQ29tcGFyZSBfTV9jb21wOworCisgICAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICAgIF9NX2ludm9rZShfSUl0ZXIgX19hLCBfSUl0ZXIgX19iLCBfSUl0ZXIgX19jLCBfSUl0ZXIgX19kLAorCQlfT3V0cHV0SXRlcmF0b3IgX19yKSBjb25zdAorICAgICAgeworCXdoaWxlIChfX2EgIT0gX19iICYmIF9fYyAhPSBfX2QpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKF9NX2NvbXAoKl9fYSwgKl9fYykpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgCSpfX3IgPSAqX19hOworICAgICAgICAJKytfX2E7CisgICAgICAgIAkrK19fcjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoX01fY29tcCgqX19jLCAqX19hKSkKKyAgICAgICAgICAgICAgeyArK19fYzsgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgIAkrK19fYTsKKyAgICAgICAgCSsrX19jOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorCXJldHVybiBzdGQ6OmNvcHkoX19hLCBfX2IsIF9fcik7CisgICAgICB9CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZQorICAgICAgX19jb3VudChfSUl0ZXIgX19hLCBfSUl0ZXIgX19iLAorCSAgICAgIF9JSXRlciBfX2MsIF9JSXRlciBfX2QpIGNvbnN0CisgICAgICB7CisJX0RpZmZlcmVuY2VUeXBlIF9fY291bnRlciA9IDA7CisKKwl3aGlsZSAoX19hICE9IF9fYiAmJiBfX2MgIT0gX19kKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfTV9jb21wKCpfX2EsICpfX2MpKQorICAgICAgICAgICAgICB7CisgICAgICAgIAkrK19fYTsKKyAgICAgICAgCSsrX19jb3VudGVyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChfTV9jb21wKCpfX2MsICpfX2EpKQorICAgICAgICAgICAgICB7ICsrX19jOyB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgKytfX2E7ICsrX19jOyB9CisgICAgICAgICAgfQorCisJcmV0dXJuIF9fY291bnRlciArIChfX2IgLSBfX2EpOworICAgICAgfQorCisgICAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICAgIF9fZmlyc3RfZW1wdHkoX0lJdGVyLCBfSUl0ZXIsIF9PdXRwdXRJdGVyYXRvciBfX291dCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fb3V0OyB9CisKKyAgICAgIF9PdXRwdXRJdGVyYXRvcgorICAgICAgX19zZWNvbmRfZW1wdHkoX0lJdGVyIF9fYSwgX0lJdGVyIF9fYiwgX091dHB1dEl0ZXJhdG9yIF9fb3V0KSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpjb3B5KF9fYSwgX19iLCBfX291dCk7IH0KKyAgICB9OworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHN0cnVjdCBfX2ludGVyc2VjdGlvbl9mdW5jCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpwYWlyPF9JSXRlciwgX0lJdGVyPiBfSXRlcmF0b3JQYWlyOworCisgICAgICBfX2ludGVyc2VjdGlvbl9mdW5jKF9Db21wYXJlIF9fY29tcCkgOiBfTV9jb21wKF9fY29tcCkge30KKworICAgICAgX0NvbXBhcmUgX01fY29tcDsKKworICAgICAgX091dHB1dEl0ZXJhdG9yCisgICAgICBfTV9pbnZva2UoX0lJdGVyIF9fYSwgX0lJdGVyIF9fYiwgX0lJdGVyIF9fYywgX0lJdGVyIF9fZCwKKwkJX091dHB1dEl0ZXJhdG9yIF9fcikgY29uc3QKKyAgICAgIHsKKwl3aGlsZSAoX19hICE9IF9fYiAmJiBfX2MgIT0gX19kKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfTV9jb21wKCpfX2EsICpfX2MpKQorICAgICAgICAgICAgICB7ICsrX19hOyB9CisgICAgICAgICAgICBlbHNlIGlmIChfTV9jb21wKCpfX2MsICpfX2EpKQorICAgICAgICAgICAgICB7ICsrX19jOyB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgCSpfX3IgPSAqX19hOworICAgICAgICAJKytfX2E7CisgICAgICAgIAkrK19fYzsKKyAgICAgICAgCSsrX19yOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisJcmV0dXJuIF9fcjsKKyAgICAgIH0KKworICAgICAgX0RpZmZlcmVuY2VUeXBlCisgICAgICBfX2NvdW50KF9JSXRlciBfX2EsIF9JSXRlciBfX2IsIF9JSXRlciBfX2MsIF9JSXRlciBfX2QpIGNvbnN0CisgICAgICB7CisJX0RpZmZlcmVuY2VUeXBlIF9fY291bnRlciA9IDA7CisKKwl3aGlsZSAoX19hICE9IF9fYiAmJiBfX2MgIT0gX19kKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfTV9jb21wKCpfX2EsICpfX2MpKQorICAgICAgICAgICAgICB7ICsrX19hOyB9CisgICAgICAgICAgICBlbHNlIGlmIChfTV9jb21wKCpfX2MsICpfX2EpKQorICAgICAgICAgICAgICB7ICsrX19jOyB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgCSsrX19hOworICAgICAgICAJKytfX2M7CisgICAgICAgIAkrK19fY291bnRlcjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworCXJldHVybiBfX2NvdW50ZXI7CisgICAgICB9CisKKyAgICAgIF9PdXRwdXRJdGVyYXRvcgorICAgICAgX19maXJzdF9lbXB0eShfSUl0ZXIsIF9JSXRlciwgX091dHB1dEl0ZXJhdG9yIF9fb3V0KSBjb25zdAorICAgICAgeyByZXR1cm4gX19vdXQ7IH0KKworICAgICAgX091dHB1dEl0ZXJhdG9yCisgICAgICBfX3NlY29uZF9lbXB0eShfSUl0ZXIsIF9JSXRlciwgX091dHB1dEl0ZXJhdG9yIF9fb3V0KSBjb25zdAorICAgICAgeyByZXR1cm4gX19vdXQ7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9JSXRlciwgY2xhc3MgX091dHB1dEl0ZXJhdG9yLCBjbGFzcyBfQ29tcGFyZT4KKyAgICBzdHJ1Y3QgX191bmlvbl9mdW5jCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICAgIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgX191bmlvbl9mdW5jKF9Db21wYXJlIF9fY29tcCkgOiBfTV9jb21wKF9fY29tcCkge30KKworICAgICAgX0NvbXBhcmUgX01fY29tcDsKKworICAgICAgX091dHB1dEl0ZXJhdG9yCisgICAgICBfTV9pbnZva2UoX0lJdGVyIF9fYSwgY29uc3QgX0lJdGVyIF9fYiwgX0lJdGVyIF9fYywKKwkJY29uc3QgX0lJdGVyIF9fZCwgX091dHB1dEl0ZXJhdG9yIF9fcikgY29uc3QKKyAgICAgIHsKKwl3aGlsZSAoX19hICE9IF9fYiAmJiBfX2MgIT0gX19kKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfTV9jb21wKCpfX2EsICpfX2MpKQorICAgICAgICAgICAgICB7CisgICAgICAgIAkqX19yID0gKl9fYTsKKyAgICAgICAgCSsrX19hOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChfTV9jb21wKCpfX2MsICpfX2EpKQorICAgICAgICAgICAgICB7CisgICAgICAgIAkqX19yID0gKl9fYzsKKyAgICAgICAgCSsrX19jOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgCSpfX3IgPSAqX19hOworICAgICAgICAJKytfX2E7CisgICAgICAgIAkrK19fYzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKytfX3I7CisgICAgICAgICAgfQorCXJldHVybiBzdGQ6OmNvcHkoX19jLCBfX2QsIHN0ZDo6Y29weShfX2EsIF9fYiwgX19yKSk7CisgICAgICB9CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZQorICAgICAgX19jb3VudChfSUl0ZXIgX19hLCBfSUl0ZXIgX19iLCBfSUl0ZXIgX19jLCBfSUl0ZXIgX19kKSBjb25zdAorICAgICAgeworCV9EaWZmZXJlbmNlVHlwZSBfX2NvdW50ZXIgPSAwOworCisJd2hpbGUgKF9fYSAhPSBfX2IgJiYgX19jICE9IF9fZCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoX01fY29tcCgqX19hLCAqX19jKSkKKyAgICAgICAgICAgICAgeyArK19fYTsgfQorICAgICAgICAgICAgZWxzZSBpZiAoX01fY29tcCgqX19jLCAqX19hKSkKKyAgICAgICAgICAgICAgeyArK19fYzsgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgIAkrK19fYTsKKyAgICAgICAgCSsrX19jOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICArK19fY291bnRlcjsKKyAgICAgICAgICB9CisKKwlfX2NvdW50ZXIgKz0gKF9fYiAtIF9fYSk7CisJX19jb3VudGVyICs9IChfX2QgLSBfX2MpOworCXJldHVybiBfX2NvdW50ZXI7CisgICAgICB9CisKKyAgICAgIF9PdXRwdXRJdGVyYXRvcgorICAgICAgX19maXJzdF9lbXB0eShfSUl0ZXIgX19jLCBfSUl0ZXIgX19kLCBfT3V0cHV0SXRlcmF0b3IgX19vdXQpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6OmNvcHkoX19jLCBfX2QsIF9fb3V0KTsgfQorCisgICAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICAgIF9fc2Vjb25kX2VtcHR5KF9JSXRlciBfX2EsIF9JSXRlciBfX2IsIF9PdXRwdXRJdGVyYXRvciBfX291dCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6Y29weShfX2EsIF9fYiwgX19vdXQpOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX09wZXJhdGlvbj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX3BhcmFsbGVsX3NldF9vcGVyYXRpb24oX0lJdGVyIF9fYmVnaW4xLCBfSUl0ZXIgX19lbmQxLAorCQkJICAgICBfSUl0ZXIgX19iZWdpbjIsIF9JSXRlciBfX2VuZDIsCisJCQkgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX09wZXJhdGlvbiBfX29wKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0NBTEwoKF9fZW5kMSAtIF9fYmVnaW4xKSArIChfX2VuZDIgLSBfX2JlZ2luMikpCisKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6cGFpcjxfSUl0ZXIsIF9JSXRlcj4gX0l0ZXJhdG9yUGFpcjsKKworICAgICAgaWYgKF9fYmVnaW4xID09IF9fZW5kMSkKKwlyZXR1cm4gX19vcC5fX2ZpcnN0X2VtcHR5KF9fYmVnaW4yLCBfX2VuZDIsIF9fcmVzdWx0KTsKKworICAgICAgaWYgKF9fYmVnaW4yID09IF9fZW5kMikKKwlyZXR1cm4gX19vcC5fX3NlY29uZF9lbXB0eShfX2JlZ2luMSwgX19lbmQxLCBfX3Jlc3VsdCk7CisKKyAgICAgIGNvbnN0IF9EaWZmZXJlbmNlVHlwZSBfX3NpemUgPSAoX19lbmQxIC0gX19iZWdpbjEpICsgKF9fZW5kMiAtIF9fYmVnaW4yKTsKKworICAgICAgY29uc3QgX0l0ZXJhdG9yUGFpciBfX3NlcXVlbmNlWzJdID0geyBzdGQ6Om1ha2VfcGFpcihfX2JlZ2luMSwgX19lbmQxKSwKKwkJCQkJICAgIHN0ZDo6bWFrZV9wYWlyKF9fYmVnaW4yLCBfX2VuZDIpIH07CisgICAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXR1cm5fdmFsdWUgPSBfX3Jlc3VsdDsKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSAqX19ib3JkZXJzOworICAgICAgX0l0ZXJhdG9yUGFpciAqX19ibG9ja19iZWdpbnM7CisgICAgICBfRGlmZmVyZW5jZVR5cGUqIF9fbGVuZ3RoczsKKworICAgICAgX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMgPQorICAgICAgICAgIHN0ZDo6bWluPF9EaWZmZXJlbmNlVHlwZT4oX19nZXRfbWF4X3RocmVhZHMoKSwKKyAgICAgICAgICAgICAgc3RkOjptaW4oX19lbmQxIC0gX19iZWdpbjEsIF9fZW5kMiAtIF9fYmVnaW4yKSk7CisKKyMgICAgIHByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoX19udW1fdGhyZWFkcykKKyAgICAgIHsKKyMgICAgICAgcHJhZ21hIG9tcCBzaW5nbGUKKwl7CisJICBfX251bV90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpOworCisJICBfX2JvcmRlcnMgPSBuZXcgX0RpZmZlcmVuY2VUeXBlW19fbnVtX3RocmVhZHMgKyAyXTsKKwkgIF9fZXF1YWxseV9zcGxpdChfX3NpemUsIF9fbnVtX3RocmVhZHMgKyAxLCBfX2JvcmRlcnMpOworCSAgX19ibG9ja19iZWdpbnMgPSBuZXcgX0l0ZXJhdG9yUGFpcltfX251bV90aHJlYWRzICsgMV07CisJICAvLyBWZXJ5IF9fc3RhcnQuCisJICBfX2Jsb2NrX2JlZ2luc1swXSA9IHN0ZDo6bWFrZV9wYWlyKF9fYmVnaW4xLCBfX2JlZ2luMik7CisJICBfX2xlbmd0aHMgPSBuZXcgX0RpZmZlcmVuY2VUeXBlW19fbnVtX3RocmVhZHNdOworCX0gLy9zaW5nbGUKKworCV9UaHJlYWRJbmRleCBfX2lhbSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworCisJLy8gX1Jlc3VsdCBmcm9tIG11bHRpc2VxX3BhcnRpdGlvbi4KKwlfSUl0ZXIgX19vZmZzZXRbMl07CisJY29uc3QgX0RpZmZlcmVuY2VUeXBlIF9fcmFuayA9IF9fYm9yZGVyc1tfX2lhbSArIDFdOworCisJbXVsdGlzZXFfcGFydGl0aW9uKF9fc2VxdWVuY2UsIF9fc2VxdWVuY2UgKyAyLAorCQkJICAgX19yYW5rLCBfX29mZnNldCwgX19vcC5fTV9jb21wKTsKKworCS8vIGFsbG93ZWQgdG8gcmVhZD8KKwkvLyB0b2dldGhlcgorCS8vICooX19vZmZzZXRbIDAgXSAtIDEpID09ICpfX29mZnNldFsgMSBdCisJaWYgKF9fb2Zmc2V0WyAwIF0gIT0gX19iZWdpbjEgJiYgX19vZmZzZXRbMV0gIT0gX19lbmQyCisJICAgICYmICFfX29wLl9NX2NvbXAoKihfX29mZnNldFswXSAtIDEpLCAqX19vZmZzZXRbMV0pCisJICAgICYmICFfX29wLl9NX2NvbXAoKl9fb2Zmc2V0WzFdLCAqKF9fb2Zmc2V0WzBdIC0gMSkpKQorCSAgeworCSAgICAvLyBBdm9pZCBzcGxpdCBiZXR3ZWVuIGdsb2JhbGx5IGVxdWFsIGVsZW1lbnRzOiBtb3ZlIG9uZSB0bworCSAgICAvLyBmcm9udCBpbiBmaXJzdCBzZXF1ZW5jZS4KKyAgICAgICAgICAgICAgLS1fX29mZnNldFswXTsKKwkgIH0KKworCV9JdGVyYXRvclBhaXIgX19ibG9ja19lbmQgPSBfX2Jsb2NrX2JlZ2luc1tfX2lhbSArIDFdID0KKwkgIF9JdGVyYXRvclBhaXIoX19vZmZzZXRbMF0sIF9fb2Zmc2V0WzFdKTsKKworCS8vIE1ha2Ugc3VyZSBhbGwgdGhyZWFkcyBoYXZlIHRoZWlyIGJsb2NrX2JlZ2luIHJlc3VsdCB3cml0dGVuIG91dC4KKyMgICAgICAgcHJhZ21hIG9tcCBiYXJyaWVyCisKKwlfSXRlcmF0b3JQYWlyIF9fYmxvY2tfYmVnaW4gPSBfX2Jsb2NrX2JlZ2luc1tfX2lhbV07CisKKwkvLyBCZWdpbiB3b3JraW5nIGZvciB0aGUgZmlyc3QgYmxvY2ssIHdoaWxlIHRoZSBvdGhlcnMgZXhjZXB0CisJLy8gdGhlIGxhc3Qgc3RhcnQgdG8gY291bnQuCisJaWYgKF9faWFtID09IDApCisJICB7CisJICAgIC8vIFRoZSBmaXJzdCB0aHJlYWQgY2FuIGNvcHkgYWxyZWFkeS4KKwkgICAgX19sZW5ndGhzWyBfX2lhbSBdID0KKwkgICAgICBfX29wLl9NX2ludm9rZShfX2Jsb2NrX2JlZ2luLmZpcnN0LCBfX2Jsb2NrX2VuZC5maXJzdCwKKwkJCSAgICAgX19ibG9ja19iZWdpbi5zZWNvbmQsIF9fYmxvY2tfZW5kLnNlY29uZCwKKwkJCSAgICAgX19yZXN1bHQpIC0gX19yZXN1bHQ7CisJICB9CisJZWxzZQorCSAgeworCSAgICBfX2xlbmd0aHNbIF9faWFtIF0gPQorCSAgICAgIF9fb3AuX19jb3VudChfX2Jsb2NrX2JlZ2luLmZpcnN0LCBfX2Jsb2NrX2VuZC5maXJzdCwKKwkJCSAgIF9fYmxvY2tfYmVnaW4uc2Vjb25kLCBfX2Jsb2NrX2VuZC5zZWNvbmQpOworCSAgfQorCisJLy8gTWFrZSBzdXJlIGV2ZXJ5b25lIHdyb3RlIHRoZWlyIGxlbmd0aHMuCisjICAgICAgIHByYWdtYSBvbXAgYmFycmllcgorCisJX091dHB1dEl0ZXJhdG9yIF9fciA9IF9fcmVzdWx0OworCisJaWYgKF9faWFtID09IDApCisJICB7CisJICAgIC8vIERvIHRoZSBsYXN0IGJsb2NrLgorCSAgICBmb3IgKF9UaHJlYWRJbmRleCBfX2kgPSAwOyBfX2kgPCBfX251bV90aHJlYWRzOyArK19faSkKKwkgICAgICBfX3IgKz0gX19sZW5ndGhzW19faV07CisKKwkgICAgX19ibG9ja19iZWdpbiA9IF9fYmxvY2tfYmVnaW5zW19fbnVtX3RocmVhZHNdOworCisJICAgIC8vIFJldHVybiB0aGUgcmVzdWx0IGl0ZXJhdG9yIG9mIHRoZSBsYXN0IGJsb2NrLgorCSAgICBfX3JldHVybl92YWx1ZSA9CisJICAgICAgX19vcC5fTV9pbnZva2UoX19ibG9ja19iZWdpbi5maXJzdCwgX19lbmQxLAorCQkJICAgICBfX2Jsb2NrX2JlZ2luLnNlY29uZCwgX19lbmQyLCBfX3IpOworCisJICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmb3IgKF9UaHJlYWRJbmRleCBfX2kgPSAwOyBfX2kgPCBfX2lhbTsgKytfX2kpCisgICAgICAgIAlfX3IgKz0gX19sZW5ndGhzWyBfX2kgXTsKKworICAgICAgICAgICAgICAvLyBSZXNldCBiZWdpbnMgZm9yIGNvcHkgcGFzcy4KKyAgICAgICAgICAgICAgX19vcC5fTV9pbnZva2UoX19ibG9ja19iZWdpbi5maXJzdCwgX19ibG9ja19lbmQuZmlyc3QsCisJCQkgICAgIF9fYmxvY2tfYmVnaW4uc2Vjb25kLCBfX2Jsb2NrX2VuZC5zZWNvbmQsIF9fcik7CisgICAgICAgICAgICB9CisJfQorICAgICAgcmV0dXJuIF9fcmV0dXJuX3ZhbHVlOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fcGFyYWxsZWxfc2V0X3VuaW9uKF9JSXRlciBfX2JlZ2luMSwgX0lJdGVyIF9fZW5kMSwKKwkJCSBfSUl0ZXIgX19iZWdpbjIsIF9JSXRlciBfX2VuZDIsCisJCQkgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgcmV0dXJuIF9fcGFyYWxsZWxfc2V0X29wZXJhdGlvbihfX2JlZ2luMSwgX19lbmQxLCBfX2JlZ2luMiwgX19lbmQyLAorCQkJCSAgICAgIF9fcmVzdWx0LAorCQkJCSAgICAgIF9fdW5pb25fZnVuYzwgX0lJdGVyLCBfT3V0cHV0SXRlcmF0b3IsCisJCQkJICAgICAgX0NvbXBhcmU+KF9fY29tcCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fcGFyYWxsZWxfc2V0X2ludGVyc2VjdGlvbihfSUl0ZXIgX19iZWdpbjEsIF9JSXRlciBfX2VuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAJX0lJdGVyIF9fYmVnaW4yLCBfSUl0ZXIgX19lbmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgCV9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHJldHVybiBfX3BhcmFsbGVsX3NldF9vcGVyYXRpb24oX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwKKwkJCQkgICAgICBfX3Jlc3VsdCwKKwkJCQkgICAgICBfX2ludGVyc2VjdGlvbl9mdW5jPF9JSXRlciwKKwkJCQkgICAgICBfT3V0cHV0SXRlcmF0b3IsIF9Db21wYXJlPihfX2NvbXApKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLAorICAgICAgICAgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX3BhcmFsbGVsX3NldF9kaWZmZXJlbmNlKF9JSXRlciBfX2JlZ2luMSwgX0lJdGVyIF9fZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JSXRlciBfX2JlZ2luMiwgX0lJdGVyIF9fZW5kMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHJldHVybiBfX3BhcmFsbGVsX3NldF9vcGVyYXRpb24oX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwKKwkJCQkgICAgICBfX3Jlc3VsdCwKKwkJCQkgICAgICBfX2RpZmZlcmVuY2VfZnVuYzxfSUl0ZXIsCisJCQkJICAgICAgX091dHB1dEl0ZXJhdG9yLCBfQ29tcGFyZT4oX19jb21wKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgX19wYXJhbGxlbF9zZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX0lJdGVyIF9fYmVnaW4xLCBfSUl0ZXIgX19lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJX0lJdGVyIF9fYmVnaW4yLCBfSUl0ZXIgX19lbmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHJldHVybiBfX3BhcmFsbGVsX3NldF9vcGVyYXRpb24oX19iZWdpbjEsIF9fZW5kMSwgX19iZWdpbjIsIF9fZW5kMiwKKwkJCQkgICAgICBfX3Jlc3VsdCwKKwkJCQkgICAgICBfX3N5bW1ldHJpY19kaWZmZXJlbmNlX2Z1bmM8X0lJdGVyLAorCQkJCSAgICAgIF9PdXRwdXRJdGVyYXRvciwgX0NvbXBhcmU+KF9fY29tcCkpOworICAgIH0KK30KKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX1NFVF9PUEVSQVRJT05TX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvc2V0dGluZ3MuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvc2V0dGluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTQ2MjE2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC9zZXR0aW5ncy5oCkBAIC0wLDAgKzEsMzQzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcGFyYWxsZWwvc2V0dGluZ3MuaAorICogIEBicmllZiBSdW50aW1lIHNldHRpbmdzIGFuZCB0dW5pbmcgcGFyYW1ldGVycywgaGV1cmlzdGljcyB0byBkZWNpZGUKKyAqICB3aGV0aGVyIHRvIHVzZSBwYXJhbGxlbGl6ZWQgYWxnb3JpdGhtcy4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqCisgKiAgQHNlY3Rpb24gcGFyYWxsZWxpemF0aW9uX2RlY2lzaW9uIAorICogIFRoZSBkZWNpc2lvbiB3aGV0aGVyIHRvIHJ1biBhbiBhbGdvcml0aG0gaW4gcGFyYWxsZWwuCisgKgorICogIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMgdGhlIHVzZXIgY2FuIHN3aXRjaCBvbiBhbmQgX19vZmYgdGhlIHBhcmFsbGVsCisgKiAgZXhlY3V0aW9uIG9mIGFuIGFsZ29yaXRobSwgYm90aCBhdCBjb21waWxlLSBhbmQgcnVuLXRpbWUuCisgKgorICogIE9ubHkgc2VxdWVudGlhbCBleGVjdXRpb24gY2FuIGJlIGZvcmNlZCBhdCBjb21waWxlLXRpbWUuICBUaGlzCisgKiAgcmVkdWNlcyBjb2RlIHNpemUgYW5kIHByb3RlY3RzIGNvZGUgcGFydHMgdGhhdCBoYXZlCisgKiAgbm9uLXRocmVhZC1zYWZlIHNpZGUgZWZmZWN0cy4KKyAqCisgKiAgVWx0aW1hdGVseSwgZm9yY2luZyBwYXJhbGxlbCBleGVjdXRpb24gYXQgY29tcGlsZS10aW1lIG1ha2VzCisgKiAgc2Vuc2UuICBPZnRlbiwgdGhlIHNlcXVlbnRpYWwgYWxnb3JpdGhtIGltcGxlbWVudGF0aW9uIGlzIHVzZWQgYXMKKyAqICBhIHN1YnJvdXRpbmUsIHNvIG5vIHJlZHVjdGlvbiBpbiBjb2RlIHNpemUgY2FuIGJlIGFjaGlldmVkLiAgQWxzbywKKyAqICB0aGUgbWFjaGluZSB0aGUgcHJvZ3JhbSBpcyBydW4gb24gbWlnaHQgaGF2ZSBvbmx5IG9uZSBwcm9jZXNzb3IKKyAqICBjb3JlLCBzbyB0byBhdm9pZCBvdmVyaGVhZCwgdGhlIGFsZ29yaXRobSBpcyBleGVjdXRlZAorICogIHNlcXVlbnRpYWxseS4KKyAqCisgKiAgVG8gZm9yY2Ugc2VxdWVudGlhbCBleGVjdXRpb24gb2YgYW4gYWxnb3JpdGhtIHVsdGltYXRlbHkgYXQKKyAqICBjb21waWxlLXRpbWUsIHRoZSB1c2VyIG11c3QgYWRkIHRoZSB0YWcKKyogIGdudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSB0byB0aGUgZW5kIG9mIHRoZSBwYXJhbWV0ZXIgbGlzdCwKKyAqICBlLiBnLgorICoKKyAqICBcY29kZQorICogIHN0ZDo6c29ydChfX3YuYmVnaW4oKSwgX192LmVuZCgpLCBfX2dudV9wYXJhbGxlbDo6c2VxdWVudGlhbF90YWcoKSk7CisgKiAgXGVuZGNvZGUKKyAqCisgKiAgVGhpcyBpcyBjb21wYXRpYmxlIHdpdGggYWxsIG92ZXJsb2FkZWQgYWxnb3JpdGhtIHZhcmlhbnRzLiAgTm8KKyAqICBhZGRpdGlvbmFsIGNvZGUgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGF0IGFsbC4gIFRoZSBzYW1lIGhvbGRzIGZvcgorICogIG1vc3QgYWxnb3JpdGhtIGNhbGxzIHdpdGggaXRlcmF0b3JzIG5vdCBwcm92aWRpbmcgcmFuZG9tIGFjY2Vzcy4KKyAqCisgKiAgSWYgdGhlIGFsZ29yaXRobSBjYWxsIGlzIG5vdCBmb3JjZWQgdG8gYmUgZXhlY3V0ZWQgc2VxdWVudGlhbGx5CisgKiAgYXQgY29tcGlsZS10aW1lLCB0aGUgZGVjaXNpb24gaXMgbWFkZSBhdCBydW4tdGltZS4KKyAqICBUaGUgZ2xvYmFsIHZhcmlhYmxlIF9fZ251X3BhcmFsbGVsOjpfU2V0dGluZ3M6OmFsZ29yaXRobV9zdHJhdGVneQorICogIGlzIGNoZWNrZWQuIF9JdCBpcyBhIHRyaXN0YXRlIHZhcmlhYmxlIGNvcnJlc3BvbmRpbmcgdG86CisgKgorICogIGEuIGZvcmNlX3NlcXVlbnRpYWwsIG1lYW5pbmcgdGhlIHNlcXVlbnRpYWwgYWxnb3JpdGhtIGlzIGV4ZWN1dGVkLgorKiAgYi4gZm9yY2VfcGFyYWxsZWwsIG1lYW5pbmcgdGhlIHBhcmFsbGVsIGFsZ29yaXRobSBpcyBleGVjdXRlZC4KKyogIGMuIGhldXJpc3RpYworICoKKyAqICBGb3IgaGV1cmlzdGljLCB0aGUgcGFyYWxsZWwgYWxnb3JpdGhtIGltcGxlbWVudGF0aW9uIGlzIGNhbGxlZAorICogIG9ubHkgaWYgdGhlIGlucHV0IHNpemUgaXMgc3VmZmljaWVudGx5IGxhcmdlLiAgRm9yIG1vc3QKKyAqICBhbGdvcml0aG1zLCB0aGUgaW5wdXQgc2l6ZSBpcyB0aGUgKGNvbWJpbmVkKSBsZW5ndGggb2YgdGhlIGlucHV0CisqICBzZXF1ZW5jZShfX3MpLiAgVGhlIHRocmVzaG9sZCBjYW4gYmUgc2V0IGJ5IHRoZSB1c2VyLCBpbmRpdmlkdWFsbHkKKyAqICBmb3IgZWFjaCBhbGdvcml0aG0uICBUaGUgYWNjb3JkaW5nIHZhcmlhYmxlcyBhcmUgY2FsbGVkCisqICBnbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6W2FsZ29yaXRobV1fbWluaW1hbF9uIC4KKyAqCisgKiAgRm9yIHNvbWUgb2YgdGhlIGFsZ29yaXRobXMsIHRoZXJlIGFyZSBldmVuIG1vcmUgdHVuaW5nIG9wdGlvbnMsCisgKiAgZS4gZy4gdGhlIGFiaWxpdHkgdG8gY2hvb3NlIGZyb20gbXVsdGlwbGUgYWxnb3JpdGhtIHZhcmlhbnRzLiAgU2VlCisgKiAgYmVsb3cgZm9yIGRldGFpbHMuCisgKi8KKworLy8gV3JpdHRlbiBieSBKb2hhbm5lcyBTaW5nbGVyIGFuZCBGZWxpeCBQdXR6ZS4KKworI2lmbmRlZiBfR0xJQkNYWF9QQVJBTExFTF9TRVRUSU5HU19ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX1NFVFRJTkdTX0ggMQorCisjaW5jbHVkZSA8cGFyYWxsZWwvdHlwZXMuaD4KKworLyoqIAorICAqIEBicmllZiBEZXRlcm1pbmUgYXQgY29tcGlsZSg/KS10aW1lIGlmIHRoZSBwYXJhbGxlbCB2YXJpYW50IG9mIGFuCisgICogYWxnb3JpdGhtIHNob3VsZCBiZSBjYWxsZWQuCisgICogQHBhcmFtIF9fYyBBIGNvbmRpdGlvbiB0aGF0IGlzIGNvbnZlcnRpYmxlIHRvIGJvb2wgdGhhdCBpcyBvdmVycnVsZWQgYnkKKyAgKiBfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjphbGdvcml0aG1fc3RyYXRlZ3kuIFVzdWFsbHkgYSBkZWNpc2lvbgorICAqIGJhc2VkIG9uIHRoZSBpbnB1dCBzaXplLgorICAqLworI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9DT05ESVRJT04oX19jKSBcCisgIChfX2dudV9wYXJhbGxlbDo6X1NldHRpbmdzOjpnZXQoKS5hbGdvcml0aG1fc3RyYXRlZ3kgXAorICAgICE9IF9fZ251X3BhcmFsbGVsOjpmb3JjZV9zZXF1ZW50aWFsIFwKKyAgJiYgKChfX2dudV9wYXJhbGxlbDo6X19nZXRfbWF4X3RocmVhZHMoKSA+IDEgJiYgKF9fYykpIFwKKyAgICAgfHwgX19nbnVfcGFyYWxsZWw6Ol9TZXR0aW5nczo6Z2V0KCkuYWxnb3JpdGhtX3N0cmF0ZWd5IFwKKyAgICAgICAgPT0gX19nbnVfcGFyYWxsZWw6OmZvcmNlX3BhcmFsbGVsKSkKKworLyoKK2lubGluZSBib29sCitwYXJhbGxlbF9jb25kaXRpb24oYm9vbCBfX2MpCit7CisgIGJvb2wgcmV0ID0gZmFsc2U7CisgIGNvbnN0IF9TZXR0aW5ncyYgX19zID0gX1NldHRpbmdzOjpnZXQoKTsKKyAgaWYgKF9fcy5hbGdvcml0aG1fc3RyYXRlZ3kgIT0gZm9yY2Vfc2VxZW50aWFsKQorICAgIHsKKyAgICAgIGlmIChfX3MuYWxnb3JpdGhtX3N0cmF0ZWd5ID09IGZvcmNlX3BhcmFsbGVsKQorICAgICAgICByZXQgPSB0cnVlOworICAgICAgZWxzZQorICAgICAgICByZXQgPSBfX2dldF9tYXhfdGhyZWFkcygpID4gMSAmJiBfX2M7CisgICAgfQorICByZXR1cm4gcmV0OworfQorKi8KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8vLyBjbGFzcyBfU2V0dGluZ3MKKyAgLy8vIFJ1bi10aW1lIHNldHRpbmdzIGZvciB0aGUgcGFyYWxsZWwgbW9kZSBpbmNsdWRpbmcgYWxsIHR1bmFibGUgcGFyYW1ldGVycy4KKyAgc3RydWN0IF9TZXR0aW5ncworICB7CisgICAgX0FsZ29yaXRobVN0cmF0ZWd5ICAgICAgICAgIGFsZ29yaXRobV9zdHJhdGVneTsKKyAgICAKKyAgICBfU29ydEFsZ29yaXRobSAgICAgICAgICAgICAgc29ydF9hbGdvcml0aG07CisgICAgX1BhcnRpYWxTdW1BbGdvcml0aG0gICAgICAgIHBhcnRpYWxfc3VtX2FsZ29yaXRobTsKKyAgICBfTXVsdGl3YXlNZXJnZUFsZ29yaXRobSAgICAgbXVsdGl3YXlfbWVyZ2VfYWxnb3JpdGhtOworICAgIF9GaW5kQWxnb3JpdGhtICAgICAgICAgICAgICBmaW5kX2FsZ29yaXRobTsKKworICAgIF9TcGxpdHRpbmdBbGdvcml0aG0gICAgICAgICBzb3J0X3NwbGl0dGluZzsKKyAgICBfU3BsaXR0aW5nQWxnb3JpdGhtICAgICAgICAgbWVyZ2Vfc3BsaXR0aW5nOworICAgIF9TcGxpdHRpbmdBbGdvcml0aG0gICAgICAgICBtdWx0aXdheV9tZXJnZV9zcGxpdHRpbmc7CisKKyAgICAvLyBQZXItYWxnb3JpdGhtIHNldHRpbmdzLgorCisgICAgLy8vIE1pbmltYWwgaW5wdXQgc2l6ZSBmb3IgYWNjdW11bGF0ZS4KKyAgICBfU2VxdWVuY2VJbmRleCAgICAgICAgICAgICAgYWNjdW11bGF0ZV9taW5pbWFsX247CisKKyAgICAvLy8gTWluaW1hbCBpbnB1dCBzaXplIGZvciBhZGphY2VudF9kaWZmZXJlbmNlLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBhZGphY2VudF9kaWZmZXJlbmNlX21pbmltYWxfbjsKKworICAgIC8vLyBNaW5pbWFsIGlucHV0IHNpemUgZm9yIGNvdW50IGFuZCBjb3VudF9pZi4KKyAgICBfU2VxdWVuY2VJbmRleCAgICAgICAgICAgICAgY291bnRfbWluaW1hbF9uOworCisgICAgLy8vIE1pbmltYWwgaW5wdXQgc2l6ZSBmb3IgZmlsbC4KKyAgICBfU2VxdWVuY2VJbmRleCAgICAgICAgICAgICAgZmlsbF9taW5pbWFsX247CisKKyAgICAvLy8gQmxvY2sgc2l6ZSBpbmNyZWFzZSBmYWN0b3IgZm9yIGZpbmQuCisgICAgZG91YmxlICAgICAgICAgICAgICAgICAgICAgIGZpbmRfaW5jcmVhc2luZ19mYWN0b3I7CisKKyAgICAvLy8gSW5pdGlhbCBibG9jayBzaXplIGZvciBmaW5kLgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICBmaW5kX2luaXRpYWxfYmxvY2tfc2l6ZTsKKworICAgIC8vLyBNYXhpbWFsIGJsb2NrIHNpemUgZm9yIGZpbmQuCisgICAgX1NlcXVlbmNlSW5kZXggICAgICAgICAgICAgIGZpbmRfbWF4aW11bV9ibG9ja19zaXplOworCisgICAgLy8vIFN0YXJ0IHdpdGggbG9va2luZyBmb3IgdGhpcyBtYW55IGVsZW1lbnRzIHNlcXVlbnRpYWxseSwgZm9yIGZpbmQuCisgICAgX1NlcXVlbmNlSW5kZXggICAgICAgICAgICAgIGZpbmRfc2VxdWVudGlhbF9zZWFyY2hfc2l6ZTsKKworICAgIC8vLyBNaW5pbWFsIGlucHV0IHNpemUgZm9yIGZvcl9lYWNoLgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICBmb3JfZWFjaF9taW5pbWFsX247CisKKyAgICAvLy8gTWluaW1hbCBpbnB1dCBzaXplIGZvciBnZW5lcmF0ZS4KKyAgICBfU2VxdWVuY2VJbmRleCAgICAgICAgICAgICAgZ2VuZXJhdGVfbWluaW1hbF9uOworCisgICAgLy8vIE1pbmltYWwgaW5wdXQgc2l6ZSBmb3IgbWF4X2VsZW1lbnQuCisgICAgX1NlcXVlbmNlSW5kZXggICAgICAgICAgICAgIG1heF9lbGVtZW50X21pbmltYWxfbjsKKworICAgIC8vLyBNaW5pbWFsIGlucHV0IHNpemUgZm9yIG1lcmdlLgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICBtZXJnZV9taW5pbWFsX247CisKKyAgICAvLy8gT3ZlcnNhbXBsaW5nIGZhY3RvciBmb3IgbWVyZ2UuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIG1lcmdlX292ZXJzYW1wbGluZzsKKworICAgIC8vLyBNaW5pbWFsIGlucHV0IHNpemUgZm9yIG1pbl9lbGVtZW50LgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICBtaW5fZWxlbWVudF9taW5pbWFsX247CisKKyAgICAvLy8gTWluaW1hbCBpbnB1dCBzaXplIGZvciBtdWx0aXdheV9tZXJnZS4KKyAgICBfU2VxdWVuY2VJbmRleCAgICAgICAgICAgICAgbXVsdGl3YXlfbWVyZ2VfbWluaW1hbF9uOworCisgICAgLy8vIE92ZXJzYW1wbGluZyBmYWN0b3IgZm9yIG11bHRpd2F5X21lcmdlLgorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXdheV9tZXJnZV9taW5pbWFsX2s7CisKKyAgICAvLy8gT3ZlcnNhbXBsaW5nIGZhY3RvciBmb3IgbXVsdGl3YXlfbWVyZ2UuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIG11bHRpd2F5X21lcmdlX292ZXJzYW1wbGluZzsKKworICAgIC8vLyBNaW5pbWFsIGlucHV0IHNpemUgZm9yIG50aF9lbGVtZW50LgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICBudGhfZWxlbWVudF9taW5pbWFsX247CisKKyAgICAvLy8gQ2h1bmsgc2l6ZSBmb3IgcGFydGl0aW9uLgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICBwYXJ0aXRpb25fY2h1bmtfc2l6ZTsKKworICAgIC8vLyBDaHVuayBzaXplIGZvciBwYXJ0aXRpb24sIHJlbGF0aXZlIHRvIGlucHV0IHNpemUuICBJZiA+IDAuMCwKKyAgICAvLy8gdGhpcyB2YWx1ZSBvdmVycmlkZXMgcGFydGl0aW9uX2NodW5rX3NpemUuCisgICAgZG91YmxlICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9jaHVua19zaGFyZTsKKworICAgIC8vLyBNaW5pbWFsIGlucHV0IHNpemUgZm9yIHBhcnRpdGlvbi4KKyAgICBfU2VxdWVuY2VJbmRleCAgICAgICAgICAgICAgcGFydGl0aW9uX21pbmltYWxfbjsKKworICAgIC8vLyBNaW5pbWFsIGlucHV0IHNpemUgZm9yIHBhcnRpYWxfc29ydC4KKyAgICBfU2VxdWVuY2VJbmRleCAgICAgICAgICAgICAgcGFydGlhbF9zb3J0X21pbmltYWxfbjsKKworICAgIC8vLyBSYXRpbyBmb3IgcGFydGlhbF9zdW0uIEFzc3VtZSAic3VtIGFuZCB3cml0ZSByZXN1bHQiIHRvIGJlCisgICAgLy8vIHRoaXMgZmFjdG9yIHNsb3dlciB0aGFuIGp1c3QgInN1bSIuCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxfc3VtX2RpbGF0aW9uOworCisgICAgLy8vIE1pbmltYWwgaW5wdXQgc2l6ZSBmb3IgcGFydGlhbF9zdW0uCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIHBhcnRpYWxfc3VtX21pbmltYWxfbjsKKworICAgIC8vLyBNaW5pbWFsIGlucHV0IHNpemUgZm9yIHJhbmRvbV9zaHVmZmxlLgorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICByYW5kb21fc2h1ZmZsZV9taW5pbWFsX247CisKKyAgICAvLy8gTWluaW1hbCBpbnB1dCBzaXplIGZvciByZXBsYWNlIGFuZCByZXBsYWNlX2lmLgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICByZXBsYWNlX21pbmltYWxfbjsKKworICAgIC8vLyBNaW5pbWFsIGlucHV0IHNpemUgZm9yIHNldF9kaWZmZXJlbmNlLgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICBzZXRfZGlmZmVyZW5jZV9taW5pbWFsX247CisKKyAgICAvLy8gTWluaW1hbCBpbnB1dCBzaXplIGZvciBzZXRfaW50ZXJzZWN0aW9uLgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICBzZXRfaW50ZXJzZWN0aW9uX21pbmltYWxfbjsKKworICAgIC8vLyBNaW5pbWFsIGlucHV0IHNpemUgZm9yIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZS4KKyAgICBfU2VxdWVuY2VJbmRleCAgICAgICAgICAgICAgc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlX21pbmltYWxfbjsKKworICAgIC8vLyBNaW5pbWFsIGlucHV0IHNpemUgZm9yIHNldF91bmlvbi4KKyAgICBfU2VxdWVuY2VJbmRleCAgICAgICAgICAgICAgc2V0X3VuaW9uX21pbmltYWxfbjsKKworICAgIC8vLyBNaW5pbWFsIGlucHV0IHNpemUgZm9yIHBhcmFsbGVsIHNvcnRpbmcuCisgICAgX1NlcXVlbmNlSW5kZXggICAgICAgICAgICAgIHNvcnRfbWluaW1hbF9uOworCisgICAgLy8vIE92ZXJzYW1wbGluZyBmYWN0b3IgZm9yIHBhcmFsbGVsIHN0ZDo6c29ydCAoTVdNUykuCisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIHNvcnRfbXdtc19vdmVyc2FtcGxpbmc7CisKKyAgICAvLy8gU3VjaCBtYW55IHNhbXBsZXMgdG8gdGFrZSB0byBmaW5kIGEgZ29vZCBwaXZvdCAocXVpY2tzb3J0KS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgc29ydF9xc19udW1fc2FtcGxlc19wcmVzZXQ7CisKKyAgICAvLy8gTWF4aW1hbCBzdWJzZXF1ZW5jZSBfX2xlbmd0aCB0byBzd2l0Y2ggdG8gdW5iYWxhbmNlZCBfX2Jhc2UgY2FzZS4KKyAgICAvLy8gQXBwbGllcyB0byBzdGQ6OnNvcnQgd2l0aCBkeW5hbWljYWxseSBsb2FkLWJhbGFuY2VkIHF1aWNrc29ydC4KKyAgICBfU2VxdWVuY2VJbmRleCAgICAgICAgICAgICAgc29ydF9xc2JfYmFzZV9jYXNlX21heGltYWxfbjsKKworICAgIC8vLyBNaW5pbWFsIGlucHV0IHNpemUgZm9yIHBhcmFsbGVsIHN0ZDo6dHJhbnNmb3JtLgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICB0cmFuc2Zvcm1fbWluaW1hbF9uOworCisgICAgLy8vIE1pbmltYWwgaW5wdXQgc2l6ZSBmb3IgdW5pcXVlX2NvcHkuIAorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICB1bmlxdWVfY29weV9taW5pbWFsX247CisKKyAgICBfU2VxdWVuY2VJbmRleCAgICAgICAgICAgICAgd29ya3N0ZWFsaW5nX2NodW5rX3NpemU7CisKKyAgICAvLyBIYXJkd2FyZSBkZXBlbmRlbnQgdHVuaW5nIHBhcmFtZXRlcnMuCisKKyAgICAvLy8gc2l6ZSBvZiB0aGUgTDEgY2FjaGUgaW4gYnl0ZXMgKHVuZGVyZXN0aW1hdGlvbikuCisgICAgdW5zaWduZWQgbG9uZyBsb25nICAgICAgICAgIEwxX2NhY2hlX3NpemU7CisKKyAgICAvLy8gc2l6ZSBvZiB0aGUgTDIgY2FjaGUgaW4gYnl0ZXMgKHVuZGVyZXN0aW1hdGlvbikuCisgICAgdW5zaWduZWQgbG9uZyBsb25nICAgICAgICAgIEwyX2NhY2hlX3NpemU7CisKKyAgICAvLy8gc2l6ZSBvZiB0aGUgVHJhbnNsYXRpb24gTG9va2FzaWRlIEJ1ZmZlciAodW5kZXJlc3RpbWF0aW9uKS4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgVExCX3NpemU7CisKKyAgICAvLy8gT3ZlcmVzdGltYXRpb24gb2YgY2FjaGUgbGluZSBzaXplLiAgVXNlZCB0byBhdm9pZCBmYWxzZQorICAgIC8vLyBzaGFyaW5nLCBpLmUuIGVsZW1lbnRzIG9mIGRpZmZlcmVudCB0aHJlYWRzIGFyZSBhdCBsZWFzdCB0aGlzCisgICAgLy8vIGFtb3VudCBhcGFydC4KKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgY2FjaGVfbGluZV9zaXplOworCisgICAgLy8gU3RhdGlzdGljcy4KKworICAgIC8vLyBUaGUgbnVtYmVyIG9mIHN0b2xlbiByYW5nZXMgaW4gbG9hZC1iYWxhbmNlZCBxdWlja3NvcnQuCisgICAgX1NlcXVlbmNlSW5kZXggICAgICAgICAgICAgIHFzYl9zdGVhbHM7CisKKyAgICAvLy8gTWluaW1hbCBpbnB1dCBzaXplIGZvciBzZWFyY2ggYW5kIHNlYXJjaF9uLgorICAgIF9TZXF1ZW5jZUluZGV4ICAgICAgICAgICAgICBzZWFyY2hfbWluaW1hbF9uOworCisgICAgLy8vIEJsb2NrIHNpemUgc2NhbGUtZG93biBmYWN0b3Igd2l0aCByZXNwZWN0IHRvIGN1cnJlbnQgcG9zaXRpb24uCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIGZpbmRfc2NhbGVfZmFjdG9yOworCisgICAgLy8vIEdldCB0aGUgZ2xvYmFsIHNldHRpbmdzLgorICAgIF9HTElCQ1hYX0NPTlNUIHN0YXRpYyBjb25zdCBfU2V0dGluZ3MmCisgICAgZ2V0KCkgdGhyb3coKTsKKworICAgIC8vLyBTZXQgdGhlIGdsb2JhbCBzZXR0aW5ncy4KKyAgICBzdGF0aWMgdm9pZAorICAgIHNldChfU2V0dGluZ3MmKSB0aHJvdygpOworCisgICAgZXhwbGljaXQgCisgICAgX1NldHRpbmdzKCkgOgorICAgICAgICAgICAgYWxnb3JpdGhtX3N0cmF0ZWd5KGhldXJpc3RpYyksCisgICAgICAgICAgICBzb3J0X2FsZ29yaXRobShNV01TKSwKKyAgICAgICAgICAgIHBhcnRpYWxfc3VtX2FsZ29yaXRobShMSU5FQVIpLAorICAgICAgICAgICAgbXVsdGl3YXlfbWVyZ2VfYWxnb3JpdGhtKExPU0VSX1RSRUUpLAorICAgICAgICAgICAgZmluZF9hbGdvcml0aG0oQ09OU1RBTlRfU0laRV9CTE9DS1MpLAorICAgICAgICAgICAgc29ydF9zcGxpdHRpbmcoRVhBQ1QpLAorICAgICAgICAgICAgbWVyZ2Vfc3BsaXR0aW5nKEVYQUNUKSwKKyAgICAgICAgICAgIG11bHRpd2F5X21lcmdlX3NwbGl0dGluZyhFWEFDVCksCisgICAgICAgICAgICBhY2N1bXVsYXRlX21pbmltYWxfbigxMDAwKSwKKyAgICAgICAgICAgIGFkamFjZW50X2RpZmZlcmVuY2VfbWluaW1hbF9uKDEwMDApLAorICAgICAgICAgICAgY291bnRfbWluaW1hbF9uKDEwMDApLAorICAgICAgICAgICAgZmlsbF9taW5pbWFsX24oMTAwMCksCisgICAgICAgICAgICBmaW5kX2luY3JlYXNpbmdfZmFjdG9yKDIuMCksCisgICAgICAgICAgICBmaW5kX2luaXRpYWxfYmxvY2tfc2l6ZSgyNTYpLAorICAgICAgICAgICAgZmluZF9tYXhpbXVtX2Jsb2NrX3NpemUoODE5MiksCisgICAgICAgICAgICBmaW5kX3NlcXVlbnRpYWxfc2VhcmNoX3NpemUoMjU2KSwKKyAgICAgICAgICAgIGZvcl9lYWNoX21pbmltYWxfbigxMDAwKSwKKyAgICAgICAgICAgIGdlbmVyYXRlX21pbmltYWxfbigxMDAwKSwKKyAgICAgICAgICAgIG1heF9lbGVtZW50X21pbmltYWxfbigxMDAwKSwKKyAgICAgICAgICAgIG1lcmdlX21pbmltYWxfbigxMDAwKSwKKyAgICAgICAgICAgIG1lcmdlX292ZXJzYW1wbGluZygxMCksCisgICAgICAgICAgICBtaW5fZWxlbWVudF9taW5pbWFsX24oMTAwMCksCisgICAgICAgICAgICBtdWx0aXdheV9tZXJnZV9taW5pbWFsX24oMTAwMCksCisgICAgICAgICAgICBtdWx0aXdheV9tZXJnZV9taW5pbWFsX2soMiksIG11bHRpd2F5X21lcmdlX292ZXJzYW1wbGluZygxMCksCisgICAgICAgICAgICBudGhfZWxlbWVudF9taW5pbWFsX24oMTAwMCksCisgICAgICAgICAgICBwYXJ0aXRpb25fY2h1bmtfc2l6ZSgxMDAwKSwKKyAgICAgICAgICAgIHBhcnRpdGlvbl9jaHVua19zaGFyZSgwLjApLAorICAgICAgICAgICAgcGFydGl0aW9uX21pbmltYWxfbigxMDAwKSwKKyAgICAgICAgICAgIHBhcnRpYWxfc29ydF9taW5pbWFsX24oMTAwMCksCisgICAgICAgICAgICBwYXJ0aWFsX3N1bV9kaWxhdGlvbigxLjBmKSwKKyAgICAgICAgICAgIHBhcnRpYWxfc3VtX21pbmltYWxfbigxMDAwKSwKKyAgICAgICAgICAgIHJhbmRvbV9zaHVmZmxlX21pbmltYWxfbigxMDAwKSwKKyAgICAgICAgICAgIHJlcGxhY2VfbWluaW1hbF9uKDEwMDApLAorICAgICAgICAgICAgc2V0X2RpZmZlcmVuY2VfbWluaW1hbF9uKDEwMDApLAorICAgICAgICAgICAgc2V0X2ludGVyc2VjdGlvbl9taW5pbWFsX24oMTAwMCksCisgICAgICAgICAgICBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2VfbWluaW1hbF9uKDEwMDApLAorICAgICAgICAgICAgc2V0X3VuaW9uX21pbmltYWxfbigxMDAwKSwKKyAgICAgICAgICAgIHNvcnRfbWluaW1hbF9uKDEwMDApLAorICAgICAgICAgICAgc29ydF9td21zX292ZXJzYW1wbGluZygxMCksCisgICAgICAgICAgICBzb3J0X3FzX251bV9zYW1wbGVzX3ByZXNldCgxMDApLAorICAgICAgICAgICAgc29ydF9xc2JfYmFzZV9jYXNlX21heGltYWxfbigxMDApLAorICAgICAgICAgICAgdHJhbnNmb3JtX21pbmltYWxfbigxMDAwKSwKKyAgICAgICAgICAgIHVuaXF1ZV9jb3B5X21pbmltYWxfbigxMDAwMCksCisgICAgICAgICAgICB3b3Jrc3RlYWxpbmdfY2h1bmtfc2l6ZSgxMDApLAorICAgICAgICAgICAgTDFfY2FjaGVfc2l6ZSgxNiA8PCAxMCksCisgICAgICAgICAgICBMMl9jYWNoZV9zaXplKDI1NiA8PCAxMCksCisgICAgICAgICAgICBUTEJfc2l6ZSgxMjgpLAorICAgICAgICAgICAgY2FjaGVfbGluZV9zaXplKDY0KSwKKyAgICAgICAgICAgIHFzYl9zdGVhbHMoMCksCisgICAgICAgICAgICBzZWFyY2hfbWluaW1hbF9uKDEwMDApLAorICAgICAgICAgICAgZmluZF9zY2FsZV9mYWN0b3IoMC4wMWYpCisgICAgeyB9CisgIH07Cit9CisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9TRVRUSU5HU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3NvcnQuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvc29ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NTc5NTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3NvcnQuaApAQCAtMCwwICsxLDIzOCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL3NvcnQuaAorICogIEBicmllZiBQYXJhbGxlbCBzb3J0aW5nIGFsZ29yaXRobSBzd2l0Y2guCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHBhcmFsbGVsIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworLy8gV3JpdHRlbiBieSBKb2hhbm5lcyBTaW5nbGVyLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX1NPUlRfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9TT1JUX0ggMQorCisjaW5jbHVkZSA8cGFyYWxsZWwvYmFzaWNfaXRlcmF0b3IuaD4KKyNpbmNsdWRlIDxwYXJhbGxlbC9mZWF0dXJlcy5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL3BhcmFsbGVsLmg+CisKKyNpZiBfR0xJQkNYWF9BU1NFUlRJT05TCisjaW5jbHVkZSA8cGFyYWxsZWwvY2hlY2tlcnMuaD4KKyNlbmRpZgorCisjaWYgX0dMSUJDWFhfTUVSR0VTT1JUCisjaW5jbHVkZSA8cGFyYWxsZWwvbXVsdGl3YXlfbWVyZ2Vzb3J0Lmg+CisjZW5kaWYKKworI2lmIF9HTElCQ1hYX1FVSUNLU09SVAorI2luY2x1ZGUgPHBhcmFsbGVsL3F1aWNrc29ydC5oPgorI2VuZGlmCisKKyNpZiBfR0xJQkNYWF9CQUxfUVVJQ0tTT1JUCisjaW5jbHVkZSA8cGFyYWxsZWwvYmFsYW5jZWRfcXVpY2tzb3J0Lmg+CisjZW5kaWYKKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8vcHJvdG90eXBlCisgIHRlbXBsYXRlPGJvb2wgX19zdGFibGUsIHR5cGVuYW1lIF9SQUl0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfUGFyYWxsZWxpc20+CisgICAgdm9pZAorICAgIF9fcGFyYWxsZWxfc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisJCSAgICBfQ29tcGFyZSBfX2NvbXAsIF9QYXJhbGxlbGlzbSBfX3BhcmFsbGVsaXNtKTsKKyAgICAgICAgCisgIC8qKiAKKyAgICogIEBicmllZiBDaG9vc2UgbXVsdGl3YXkgbWVyZ2Vzb3J0LCBzcGxpdHRpbmcgdmFyaWFudCBhdCBydW4tdGltZSwKKyAgICogIGZvciBwYXJhbGxlbCBzb3J0aW5nLgorICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19lbmQgRW5kIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgKiAgQHRwYXJhbSBfX3N0YWJsZSBTb3J0IHN0YWJsZS4KKyAgICogIEBjYWxsZ3JhcGggCisgICAqLworICB0ZW1wbGF0ZTxib29sIF9fc3RhYmxlLCB0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fcGFyYWxsZWxfc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisJCSAgICBfQ29tcGFyZSBfX2NvbXAsIG11bHRpd2F5X21lcmdlc29ydF90YWcgX19wYXJhbGxlbGlzbSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9DQUxMKF9fZW5kIC0gX19iZWdpbikKKworICAgICAgaWYoX1NldHRpbmdzOjpnZXQoKS5zb3J0X3NwbGl0dGluZyA9PSBFWEFDVCkKKwlwYXJhbGxlbF9zb3J0X213bXM8X19zdGFibGUsIHRydWU+CisJICAoX19iZWdpbiwgX19lbmQsIF9fY29tcCwgX19wYXJhbGxlbGlzbS5fX2dldF9udW1fdGhyZWFkcygpKTsKKyAgICAgIGVsc2UKKwlwYXJhbGxlbF9zb3J0X213bXM8X19zdGFibGUsIGZhbHNlPgorCSAgKF9fYmVnaW4sIF9fZW5kLCBfX2NvbXAsIF9fcGFyYWxsZWxpc20uX19nZXRfbnVtX3RocmVhZHMoKSk7CisgICAgfQorCisgIC8qKiAKKyAgICogIEBicmllZiBDaG9vc2UgbXVsdGl3YXkgbWVyZ2Vzb3J0IHdpdGggZXhhY3Qgc3BsaXR0aW5nLAorICAgKiAgZm9yIHBhcmFsbGVsIHNvcnRpbmcuCisgICAqICBAcGFyYW0gX19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAqICBAdHBhcmFtIF9fc3RhYmxlIFNvcnQgc3RhYmxlLgorICAgKiAgQGNhbGxncmFwaCAKKyAgICovCisgIHRlbXBsYXRlPGJvb2wgX19zdGFibGUsIHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSB2b2lkCisgICAgX19wYXJhbGxlbF9zb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKwkJICAgIF9Db21wYXJlIF9fY29tcCwKKwkJICAgIG11bHRpd2F5X21lcmdlc29ydF9leGFjdF90YWcgX19wYXJhbGxlbGlzbSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9DQUxMKF9fZW5kIC0gX19iZWdpbikKKworICAgICAgcGFyYWxsZWxfc29ydF9td21zPF9fc3RhYmxlLCB0cnVlPgorICAgICAgICAoX19iZWdpbiwgX19lbmQsIF9fY29tcCwgX19wYXJhbGxlbGlzbS5fX2dldF9udW1fdGhyZWFkcygpKTsKKyAgICB9CisKKyAgLyoqIAorICAgKiAgQGJyaWVmIENob29zZSBtdWx0aXdheSBtZXJnZXNvcnQgd2l0aCBzcGxpdHRpbmcgYnkgc2FtcGxpbmcsCisgICAqICBmb3IgcGFyYWxsZWwgc29ydGluZy4KKyAgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fZW5kIEVuZCBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvci4KKyAgICogIEB0cGFyYW0gX19zdGFibGUgU29ydCBzdGFibGUuCisgICAqICBAY2FsbGdyYXBoIAorICAgKi8KKyAgdGVtcGxhdGU8Ym9vbCBfX3N0YWJsZSwgdHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3BhcmFsbGVsX3NvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorCQkgICAgX0NvbXBhcmUgX19jb21wLAorCQkgICAgbXVsdGl3YXlfbWVyZ2Vzb3J0X3NhbXBsaW5nX3RhZyBfX3BhcmFsbGVsaXNtKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19lbmQgLSBfX2JlZ2luKQorCisgICAgICBwYXJhbGxlbF9zb3J0X213bXM8X19zdGFibGUsIGZhbHNlPgorICAgICAgKF9fYmVnaW4sIF9fZW5kLCBfX2NvbXAsIF9fcGFyYWxsZWxpc20uX19nZXRfbnVtX3RocmVhZHMoKSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENob29zZSBxdWlja3NvcnQgZm9yIHBhcmFsbGVsIHNvcnRpbmcuCisgICAqICBAcGFyYW0gX19iZWdpbiBCZWdpbiBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2VuZCBFbmQgaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19jb21wIENvbXBhcmF0b3IuCisgICAqICBAdHBhcmFtIF9fc3RhYmxlIFNvcnQgc3RhYmxlLgorICAgKiAgQGNhbGxncmFwaCAKKyAgICovCisgIHRlbXBsYXRlPGJvb2wgX19zdGFibGUsIHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSB2b2lkCisgICAgX19wYXJhbGxlbF9zb3J0KF9SQUl0ZXIgX19iZWdpbiwgX1JBSXRlciBfX2VuZCwKKwkJICAgIF9Db21wYXJlIF9fY29tcCwgcXVpY2tzb3J0X3RhZyBfX3BhcmFsbGVsaXNtKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19lbmQgLSBfX2JlZ2luKQorCisgICAgICBfR0xJQkNYWF9QQVJBTExFTF9BU1NFUlQoX19zdGFibGUgPT0gZmFsc2UpOworCisgICAgICBfX3BhcmFsbGVsX3NvcnRfcXMoX19iZWdpbiwgX19lbmQsIF9fY29tcCwKKwkJCSBfX3BhcmFsbGVsaXNtLl9fZ2V0X251bV90aHJlYWRzKCkpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBDaG9vc2UgYmFsYW5jZWQgcXVpY2tzb3J0IGZvciBwYXJhbGxlbCBzb3J0aW5nLgorICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19lbmQgRW5kIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgKiAgQHRwYXJhbSBfX3N0YWJsZSBTb3J0IHN0YWJsZS4KKyAgICogIEBjYWxsZ3JhcGggCisgICAqLworICAgdGVtcGxhdGU8Ym9vbCBfX3N0YWJsZSwgdHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgIGlubGluZSB2b2lkCisgICAgIF9fcGFyYWxsZWxfc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisJCSAgICAgX0NvbXBhcmUgX19jb21wLCBiYWxhbmNlZF9xdWlja3NvcnRfdGFnIF9fcGFyYWxsZWxpc20pCisgICAgIHsKKyAgICAgICBfR0xJQkNYWF9DQUxMKF9fZW5kIC0gX19iZWdpbikKKworICAgICAgIF9HTElCQ1hYX1BBUkFMTEVMX0FTU0VSVChfX3N0YWJsZSA9PSBmYWxzZSk7CisKKyAgICAgICBfX3BhcmFsbGVsX3NvcnRfcXNiKF9fYmVnaW4sIF9fZW5kLCBfX2NvbXAsCisJCQkgICBfX3BhcmFsbGVsaXNtLl9fZ2V0X251bV90aHJlYWRzKCkpOworICAgICB9CisKKyAgLyoqIAorICAgKiAgQGJyaWVmIENob29zZSBtdWx0aXdheSBtZXJnZXNvcnQgd2l0aCBleGFjdCBzcGxpdHRpbmcsCisgICAqICBmb3IgcGFyYWxsZWwgc29ydGluZy4KKyAgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fZW5kIEVuZCBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICogIEBwYXJhbSBfX2NvbXAgQ29tcGFyYXRvci4KKyAgICogIEB0cGFyYW0gX19zdGFibGUgU29ydCBzdGFibGUuCisgICAqICBAY2FsbGdyYXBoIAorICAgKi8KKyAgdGVtcGxhdGU8Ym9vbCBfX3N0YWJsZSwgdHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3BhcmFsbGVsX3NvcnQoX1JBSXRlciBfX2JlZ2luLCBfUkFJdGVyIF9fZW5kLAorCQkgICAgX0NvbXBhcmUgX19jb21wLCBkZWZhdWx0X3BhcmFsbGVsX3RhZyBfX3BhcmFsbGVsaXNtKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19lbmQgLSBfX2JlZ2luKQorCisgICAgICBfX3BhcmFsbGVsX3NvcnQ8X19zdGFibGU+CisJKF9fYmVnaW4sIF9fZW5kLCBfX2NvbXAsCisJIG11bHRpd2F5X21lcmdlc29ydF9leGFjdF90YWcoX19wYXJhbGxlbGlzbS5fX2dldF9udW1fdGhyZWFkcygpKSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENob29zZSBhIHBhcmFsbGVsIHNvcnRpbmcgYWxnb3JpdGhtLgorICAgKiAgQHBhcmFtIF9fYmVnaW4gQmVnaW4gaXRlcmF0b3Igb2YgaW5wdXQgc2VxdWVuY2UuCisgICAqICBAcGFyYW0gX19lbmQgRW5kIGl0ZXJhdG9yIG9mIGlucHV0IHNlcXVlbmNlLgorICAgKiAgQHBhcmFtIF9fY29tcCBDb21wYXJhdG9yLgorICAgKiAgQHRwYXJhbSBfX3N0YWJsZSBTb3J0IHN0YWJsZS4KKyAgICogIEBjYWxsZ3JhcGggCisgICAqLworICB0ZW1wbGF0ZTxib29sIF9fc3RhYmxlLCB0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fcGFyYWxsZWxfc29ydChfUkFJdGVyIF9fYmVnaW4sIF9SQUl0ZXIgX19lbmQsCisJCSAgICBfQ29tcGFyZSBfX2NvbXAsIHBhcmFsbGVsX3RhZyBfX3BhcmFsbGVsaXNtKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19lbmQgLSBfX2JlZ2luKQorICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPiBfVHJhaXRzVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1R5cGU6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZVR5cGU7CisKKyAgICAgIGlmIChmYWxzZSkgOworI2lmIF9HTElCQ1hYX01FUkdFU09SVAorICAgICAgZWxzZSBpZiAoX19zdGFibGUgfHwgX1NldHRpbmdzOjpnZXQoKS5zb3J0X2FsZ29yaXRobSA9PSBNV01TKQorICAgICAgICB7CisgICAgICAgICAgaWYoX1NldHRpbmdzOjpnZXQoKS5zb3J0X3NwbGl0dGluZyA9PSBFWEFDVCkKKyAgICAgICAgICAgIHBhcmFsbGVsX3NvcnRfbXdtczxfX3N0YWJsZSwgdHJ1ZT4KKyAgICAgICAgICAgICAgKF9fYmVnaW4sIF9fZW5kLCBfX2NvbXAsIF9fcGFyYWxsZWxpc20uX19nZXRfbnVtX3RocmVhZHMoKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcGFyYWxsZWxfc29ydF9td21zPGZhbHNlLCBmYWxzZT4KKyAgICAgICAgICAgICAgKF9fYmVnaW4sIF9fZW5kLCBfX2NvbXAsIF9fcGFyYWxsZWxpc20uX19nZXRfbnVtX3RocmVhZHMoKSk7CisgICAgICAgIH0KKyNlbmRpZgorI2lmIF9HTElCQ1hYX1FVSUNLU09SVAorICAgICAgZWxzZSBpZiAoX1NldHRpbmdzOjpnZXQoKS5zb3J0X2FsZ29yaXRobSA9PSBRUykKKyAgICAgICAgX19wYXJhbGxlbF9zb3J0X3FzKF9fYmVnaW4sIF9fZW5kLCBfX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3BhcmFsbGVsaXNtLl9fZ2V0X251bV90aHJlYWRzKCkpOworI2VuZGlmCisjaWYgX0dMSUJDWFhfQkFMX1FVSUNLU09SVAorICAgICAgZWxzZSBpZiAoX1NldHRpbmdzOjpnZXQoKS5zb3J0X2FsZ29yaXRobSA9PSBRU19CQUxBTkNFRCkKKyAgICAgICAgX19wYXJhbGxlbF9zb3J0X3FzYihfX2JlZ2luLCBfX2VuZCwgX19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcGFyYWxsZWxpc20uX19nZXRfbnVtX3RocmVhZHMoKSk7CisjZW5kaWYKKyAgICAgIGVsc2UKKyAgICAgICAgX19nbnVfc2VxdWVudGlhbDo6c29ydChfX2JlZ2luLCBfX2VuZCwgX19jb21wKTsKKyAgICB9Cit9IC8vIGVuZCBuYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX1NPUlRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC90YWdzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3RhZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzkwODgwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC90YWdzLmgKQEAgLTAsMCArMSwxODUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKgorICogQGZpbGUgcGFyYWxsZWwvdGFncy5oCisgKiBAYnJpZWYgVGFncyBmb3IgY29tcGlsZS10aW1lIHNlbGVjdGlvbi4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IEpvaGFubmVzIFNpbmdsZXIgYW5kIEZlbGl4IFB1dHplLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX1RBR1NfSAorI2RlZmluZSBfR0xJQkNYWF9QQVJBTExFTF9UQUdTX0ggMQorCisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvdHlwZXMuaD4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8qKiBAYnJpZWYgRm9yY2VzIHNlcXVlbnRpYWwgZXhlY3V0aW9uIGF0IGNvbXBpbGUgdGltZS4gKi8KKyAgc3RydWN0IHNlcXVlbnRpYWxfdGFnIHsgfTsKKworICAvKiogQGJyaWVmIFJlY29tbWVuZHMgcGFyYWxsZWwgZXhlY3V0aW9uIGF0IGNvbXBpbGUgdGltZSwKKyAgICogIG9wdGlvbmFsbHkgdXNpbmcgYSB1c2VyLXNwZWNpZmllZCBudW1iZXIgb2YgdGhyZWFkcy4gKi8KKyAgc3RydWN0IHBhcmFsbGVsX3RhZworICB7CisgICAgcHJpdmF0ZToKKyAgICAgIF9UaHJlYWRJbmRleCBfTV9udW1fdGhyZWFkczsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBAYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3Rvci4gVXNlIGRlZmF1bHQgbnVtYmVyIG9mIHRocmVhZHMuICovCisgICAgICBwYXJhbGxlbF90YWcoKQorICAgICAgeyBfTV9udW1fdGhyZWFkcyA9IDA7IH0KKworICAgICAgLyoqIEBicmllZiBEZWZhdWx0IGNvbnN0cnVjdG9yLiBSZWNvbW1lbmQgbnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlLgorICAgICAgICogIEBwYXJhbSBfX251bV90aHJlYWRzIERlc2lyZWQgbnVtYmVyIG9mIHRocmVhZHMuICovCisgICAgICBwYXJhbGxlbF90YWcoX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMpCisgICAgICB7IF9NX251bV90aHJlYWRzID0gX19udW1fdGhyZWFkczsgfQorCisgICAgICAvKiogQGJyaWVmIEZpbmQgb3V0IGRlc2lyZWQgbnVtYmVyIG9mIHRocmVhZHMuCisgICAgICAgKiAgQHJldHVybiBEZXNpcmVkIG51bWJlciBvZiB0aHJlYWRzLiAqLworICAgICAgX1RocmVhZEluZGV4IF9fZ2V0X251bV90aHJlYWRzKCkKKyAgICAgIHsKKyAgICAgICAgaWYoX01fbnVtX3RocmVhZHMgPT0gMCkKKyAgICAgICAgICByZXR1cm4gb21wX2dldF9tYXhfdGhyZWFkcygpOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIF9NX251bV90aHJlYWRzOworICAgICAgfQorCisgICAgICAvKiogQGJyaWVmIFNldCB0aGUgZGVzaXJlZCBudW1iZXIgb2YgdGhyZWFkcy4KKyAgICAgICAqICBAcGFyYW0gX19udW1fdGhyZWFkcyBEZXNpcmVkIG51bWJlciBvZiB0aHJlYWRzLiAqLworICAgICAgdm9pZCBzZXRfbnVtX3RocmVhZHMoX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMpCisgICAgICB7IF9NX251bV90aHJlYWRzID0gX19udW1fdGhyZWFkczsgfQorICB9OworCisgIC8qKiBAYnJpZWYgUmVjb21tZW5kcyBwYXJhbGxlbCBleGVjdXRpb24gdXNpbmcgdGhlCisgICAgICBkZWZhdWx0IHBhcmFsbGVsIGFsZ29yaXRobS4gKi8KKyAgc3RydWN0IGRlZmF1bHRfcGFyYWxsZWxfdGFnIDogcHVibGljIHBhcmFsbGVsX3RhZworICB7CisgICAgZGVmYXVsdF9wYXJhbGxlbF90YWcoKSB7IH0KKyAgICBkZWZhdWx0X3BhcmFsbGVsX3RhZyhfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcykKKyAgICA6IHBhcmFsbGVsX3RhZyhfX251bV90aHJlYWRzKSB7IH0KKyAgfTsKKworICAvKiogQGJyaWVmIFJlY29tbWVuZHMgcGFyYWxsZWwgZXhlY3V0aW9uIHVzaW5nIGR5bmFtaWMKKyAgICAgIGxvYWQtYmFsYW5jaW5nIGF0IGNvbXBpbGUgdGltZS4gKi8KKyAgc3RydWN0IGJhbGFuY2VkX3RhZyA6IHB1YmxpYyBwYXJhbGxlbF90YWcgeyB9OworCisgIC8qKiBAYnJpZWYgUmVjb21tZW5kcyBwYXJhbGxlbCBleGVjdXRpb24gdXNpbmcgc3RhdGljCisgICAgICBsb2FkLWJhbGFuY2luZyBhdCBjb21waWxlIHRpbWUuICovCisgIHN0cnVjdCB1bmJhbGFuY2VkX3RhZyA6IHB1YmxpYyBwYXJhbGxlbF90YWcgeyB9OworCisgIC8qKiBAYnJpZWYgUmVjb21tZW5kcyBwYXJhbGxlbCBleGVjdXRpb24gdXNpbmcgT3Blbk1QIGR5bmFtaWMKKyAgICAgIGxvYWQtYmFsYW5jaW5nIGF0IGNvbXBpbGUgdGltZS4gKi8KKyAgc3RydWN0IG9tcF9sb29wX3RhZyA6IHB1YmxpYyBwYXJhbGxlbF90YWcgeyB9OworCisgIC8qKiBAYnJpZWYgUmVjb21tZW5kcyBwYXJhbGxlbCBleGVjdXRpb24gdXNpbmcgT3Blbk1QIHN0YXRpYworICAgICAgbG9hZC1iYWxhbmNpbmcgYXQgY29tcGlsZSB0aW1lLiAqLworICBzdHJ1Y3Qgb21wX2xvb3Bfc3RhdGljX3RhZyA6IHB1YmxpYyBwYXJhbGxlbF90YWcgeyB9OworCisKKyAgLyoqIEBicmllZiBCYXNlIGNsYXNzIGZvciBmb3Igc3RkOjpmaW5kKCkgdmFyaWFudHMuICovCisgIHN0cnVjdCBmaW5kX3RhZyB7IH07CisKKworICAvKiogQGJyaWVmIEZvcmNlcyBwYXJhbGxlbCBtZXJnaW5nCisgICAqICB3aXRoIGV4YWN0IHNwbGl0dGluZywgYXQgY29tcGlsZSB0aW1lLiAqLworICBzdHJ1Y3QgZXhhY3RfdGFnIDogcHVibGljIHBhcmFsbGVsX3RhZworICB7CisgICAgZXhhY3RfdGFnKCkgeyB9CisgICAgZXhhY3RfdGFnKF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzKQorICAgIDogcGFyYWxsZWxfdGFnKF9fbnVtX3RocmVhZHMpIHsgfQorICB9OworCisgIC8qKiBAYnJpZWYgRm9yY2VzIHBhcmFsbGVsIG1lcmdpbmcKKyAgICogIHdpdGggZXhhY3Qgc3BsaXR0aW5nLCBhdCBjb21waWxlIHRpbWUuICovCisgIHN0cnVjdCBzYW1wbGluZ190YWcgOiBwdWJsaWMgcGFyYWxsZWxfdGFnCisgIHsKKyAgICBzYW1wbGluZ190YWcoKSB7IH0KKyAgICBzYW1wbGluZ190YWcoX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMpCisgICAgOiBwYXJhbGxlbF90YWcoX19udW1fdGhyZWFkcykgeyB9CisgIH07CisKKworICAvKiogQGJyaWVmIEZvcmNlcyBwYXJhbGxlbCBzb3J0aW5nIHVzaW5nIG11bHRpd2F5IG1lcmdlc29ydAorICAgKiAgYXQgY29tcGlsZSB0aW1lLiAqLworICBzdHJ1Y3QgbXVsdGl3YXlfbWVyZ2Vzb3J0X3RhZyA6IHB1YmxpYyBwYXJhbGxlbF90YWcKKyAgeworICAgIG11bHRpd2F5X21lcmdlc29ydF90YWcoKSB7IH0KKyAgICBtdWx0aXdheV9tZXJnZXNvcnRfdGFnKF9UaHJlYWRJbmRleCBfX251bV90aHJlYWRzKQorICAgIDogcGFyYWxsZWxfdGFnKF9fbnVtX3RocmVhZHMpIHsgfQorICB9OworCisgIC8qKiBAYnJpZWYgRm9yY2VzIHBhcmFsbGVsIHNvcnRpbmcgdXNpbmcgbXVsdGl3YXkgbWVyZ2Vzb3J0CisgICAqICB3aXRoIGV4YWN0IHNwbGl0dGluZyBhdCBjb21waWxlIHRpbWUuICovCisgIHN0cnVjdCBtdWx0aXdheV9tZXJnZXNvcnRfZXhhY3RfdGFnIDogcHVibGljIHBhcmFsbGVsX3RhZworICB7CisgICAgbXVsdGl3YXlfbWVyZ2Vzb3J0X2V4YWN0X3RhZygpIHsgfQorICAgIG11bHRpd2F5X21lcmdlc29ydF9leGFjdF90YWcoX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMpCisgICAgOiBwYXJhbGxlbF90YWcoX19udW1fdGhyZWFkcykgeyB9CisgIH07CisKKyAgLyoqIEBicmllZiBGb3JjZXMgcGFyYWxsZWwgc29ydGluZyB1c2luZyBtdWx0aXdheSBtZXJnZXNvcnQKKyAgICogIHdpdGggc3BsaXR0aW5nIGJ5IHNhbXBsaW5nIGF0IGNvbXBpbGUgdGltZS4gKi8KKyAgc3RydWN0IG11bHRpd2F5X21lcmdlc29ydF9zYW1wbGluZ190YWcgOiBwdWJsaWMgcGFyYWxsZWxfdGFnCisgIHsKKyAgICBtdWx0aXdheV9tZXJnZXNvcnRfc2FtcGxpbmdfdGFnKCkgeyB9CisgICAgbXVsdGl3YXlfbWVyZ2Vzb3J0X3NhbXBsaW5nX3RhZyhfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcykKKyAgICA6IHBhcmFsbGVsX3RhZyhfX251bV90aHJlYWRzKSB7IH0KKyAgfTsKKworICAvKiogQGJyaWVmIEZvcmNlcyBwYXJhbGxlbCBzb3J0aW5nIHVzaW5nIHVuYmFsYW5jZWQgcXVpY2tzb3J0CisgICAqICBhdCBjb21waWxlIHRpbWUuICovCisgIHN0cnVjdCBxdWlja3NvcnRfdGFnIDogcHVibGljIHBhcmFsbGVsX3RhZworICB7CisgICAgcXVpY2tzb3J0X3RhZygpIHsgfQorICAgIHF1aWNrc29ydF90YWcoX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMpCisgICAgOiBwYXJhbGxlbF90YWcoX19udW1fdGhyZWFkcykgeyB9CisgIH07CisKKyAgLyoqIEBicmllZiBGb3JjZXMgcGFyYWxsZWwgc29ydGluZyB1c2luZyBiYWxhbmNlZCBxdWlja3NvcnQKKyAgICogIGF0IGNvbXBpbGUgdGltZS4gKi8KKyAgc3RydWN0IGJhbGFuY2VkX3F1aWNrc29ydF90YWcgOiBwdWJsaWMgcGFyYWxsZWxfdGFnCisgIHsKKyAgICBiYWxhbmNlZF9xdWlja3NvcnRfdGFnKCkgeyB9CisgICAgYmFsYW5jZWRfcXVpY2tzb3J0X3RhZyhfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcykKKyAgICA6IHBhcmFsbGVsX3RhZyhfX251bV90aHJlYWRzKSB7IH0KKyAgfTsKKworCisgIC8qKiBAYnJpZWYgU2VsZWN0cyB0aGUgZ3Jvd2luZyBibG9jayBzaXplIHZhcmlhbnQgZm9yIHN0ZDo6ZmluZCgpLgorICAgICAgQHNlZSBfR0xJQkNYWF9GSU5EX0dST1dJTkdfQkxPQ0tTICovCisgIHN0cnVjdCBncm93aW5nX2Jsb2Nrc190YWcgOiBwdWJsaWMgZmluZF90YWcgeyB9OworCisgIC8qKiBAYnJpZWYgU2VsZWN0cyB0aGUgY29uc3RhbnQgYmxvY2sgc2l6ZSB2YXJpYW50IGZvciBzdGQ6OmZpbmQoKS4KKyAgICAgIEBzZWUgX0dMSUJDWFhfRklORF9DT05TVEFOVF9TSVpFX0JMT0NLUyAqLworICBzdHJ1Y3QgY29uc3RhbnRfc2l6ZV9ibG9ja3NfdGFnIDogcHVibGljIGZpbmRfdGFnIHsgfTsKKworICAvKiogQGJyaWVmIFNlbGVjdHMgdGhlIGVxdWFsIHNwbGl0dGluZyB2YXJpYW50IGZvciBzdGQ6OmZpbmQoKS4KKyAgICAgIEBzZWUgX0dMSUJDWFhfRklORF9FUVVBTF9TUExJVCAqLworICBzdHJ1Y3QgZXF1YWxfc3BsaXRfdGFnIDogcHVibGljIGZpbmRfdGFnIHsgfTsKK30KKworI2VuZGlmIC8qIF9HTElCQ1hYX1BBUkFMTEVMX1RBR1NfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC90eXBlcy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwOWYzZWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3R5cGVzLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwYXJhbGxlbC90eXBlcy5oCisgKiAgQGJyaWVmIEJhc2ljIHR5cGVzIGFuZCB0eXBlZGVmcy4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IEpvaGFubmVzIFNpbmdsZXIgYW5kIEZlbGl4IFB1dHplLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX1RZUEVTX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfVFlQRVNfSCAxCisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx0cjEvY3N0ZGludD4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisgIC8vIEVudW1lcmF0ZWQgdHlwZXMuCisKKyAgLy8vIFJ1bi10aW1lIGVxdWl2YWxlbnRzIGZvciB0aGUgY29tcGlsZS10aW1lIHRhZ3MuCisgIGVudW0gX1BhcmFsbGVsaXNtCisgICAgeworICAgICAgLy8vIE5vdCBwYXJhbGxlbC4KKyAgICAgIHNlcXVlbnRpYWwsCisKKyAgICAgIC8vLyBQYXJhbGxlbCB1bmJhbGFuY2VkIChlcXVhbC1zaXplZCBjaHVua3MpLgorICAgICAgcGFyYWxsZWxfdW5iYWxhbmNlZCwKKworICAgICAgLy8vIFBhcmFsbGVsIGJhbGFuY2VkICh3b3JrLXN0ZWFsaW5nKS4KKyAgICAgIHBhcmFsbGVsX2JhbGFuY2VkLAorCisgICAgICAvLy8gUGFyYWxsZWwgd2l0aCBPcGVuTVAgZHluYW1pYyBsb2FkLWJhbGFuY2luZy4KKyAgICAgIHBhcmFsbGVsX29tcF9sb29wLAorCisgICAgICAvLy8gUGFyYWxsZWwgd2l0aCBPcGVuTVAgc3RhdGljIGxvYWQtYmFsYW5jaW5nLgorICAgICAgcGFyYWxsZWxfb21wX2xvb3Bfc3RhdGljLAorCisgICAgICAvLy8gUGFyYWxsZWwgd2l0aCBPcGVuTVAgdGFza3F1ZXVlIGNvbnN0cnVjdC4KKyAgICAgIHBhcmFsbGVsX3Rhc2txdWV1ZQorICAgIH07CisKKyAgLy8vIFN0cmF0ZWdpZXMgZm9yIHJ1bi10aW1lIGFsZ29yaXRobSBzZWxlY3Rpb246IAorICAvLyBmb3JjZV9zZXF1ZW50aWFsLCBmb3JjZV9wYXJhbGxlbCwgaGV1cmlzdGljLgorICBlbnVtIF9BbGdvcml0aG1TdHJhdGVneQorICAgIHsKKyAgICAgIGhldXJpc3RpYywKKyAgICAgIGZvcmNlX3NlcXVlbnRpYWwsCisgICAgICBmb3JjZV9wYXJhbGxlbAorICAgIH07CisKKyAgLy8vIFNvcnRpbmcgYWxnb3JpdGhtczogCisgIC8vIG11bHRpLXdheSBtZXJnZXNvcnQsIHF1aWNrc29ydCwgbG9hZC1iYWxhbmNlZCBxdWlja3NvcnQuCisgIGVudW0gX1NvcnRBbGdvcml0aG0gCisgICAgeyAKKyAgICAgIE1XTVMsIAorICAgICAgUVMsIAorICAgICAgUVNfQkFMQU5DRUQgCisgICAgfTsKKworICAvLy8gTWVyZ2luZyBhbGdvcml0aG1zOiAKKyAgLy8gYnViYmxlc29ydC1hbGlrZSwgbG9zZXItdHJlZSB2YXJpYW50cywgZW51bSBfX3NlbnRpbmVsLgorICBlbnVtIF9NdWx0aXdheU1lcmdlQWxnb3JpdGhtCisgICAgeworICAgICAgTE9TRVJfVFJFRQorICAgIH07CisKKyAgLy8vIFBhcnRpYWwgc3VtIGFsZ29yaXRobXM6IHJlY3Vyc2l2ZSwgbGluZWFyLgorICBlbnVtIF9QYXJ0aWFsU3VtQWxnb3JpdGhtIAorICAgIHsgCisgICAgICBSRUNVUlNJVkUsIAorICAgICAgTElORUFSIAorICAgIH07CisKKyAgLy8vIFNvcnRpbmcvbWVyZ2luZyBhbGdvcml0aG1zOiBzYW1wbGluZywgX19leGFjdC4KKyAgZW51bSBfU3BsaXR0aW5nQWxnb3JpdGhtIAorICAgIHsgCisgICAgICBTQU1QTElORywgCisgICAgICBFWEFDVCAKKyAgICB9OworCisgIC8vLyBGaW5kIGFsZ29yaXRobXM6CisgIC8vIGdyb3dpbmcgYmxvY2tzLCBlcXVhbC1zaXplZCBibG9ja3MsIGVxdWFsIHNwbGl0dGluZy4KKyAgZW51bSBfRmluZEFsZ29yaXRobSAKKyAgICB7IAorICAgICAgR1JPV0lOR19CTE9DS1MsIAorICAgICAgQ09OU1RBTlRfU0laRV9CTE9DS1MsIAorICAgICAgRVFVQUxfU1BMSVQgCisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFVuc2lnbmVkIGludGVnZXIgdG8gaW5kZXggX19lbGVtZW50cy4KKyAgICogVGhlIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBmb3IgZWFjaCBhbGdvcml0aG0gbXVzdCBmaXQgaW50byB0aGlzIHR5cGUuCisgICAqLworICB0eXBlZGVmIHVpbnQ2NF90IF9TZXF1ZW5jZUluZGV4OworCisgIC8qKgorICAgKiBAYnJpZWYgVW5zaWduZWQgaW50ZWdlciB0byBpbmRleCBhIHRocmVhZCBudW1iZXIuCisgICAqIFRoZSBtYXhpbXVtIHRocmVhZCBudW1iZXIgKGZvciBlYWNoIHByb2Nlc3NvcikgbXVzdCBmaXQgaW50byB0aGlzIHR5cGUuCisgICAqLworICB0eXBlZGVmIHVpbnQxNl90IF9UaHJlYWRJbmRleDsKKworICAvLyBYWFggYXRvbWljcyBpbnRlcmZhY2U/CisgIC8vLyBMb25nZXN0IGNvbXBhcmUtYW5kLXN3YXBwYWJsZSBpbnRlZ2VyIHR5cGUgb24gdGhpcyBwbGF0Zm9ybS4KKyAgdHlwZWRlZiBpbnQ2NF90IF9DQVNhYmxlOworCisgIC8vLyBOdW1iZXIgb2YgYml0cyBvZiBfQ0FTYWJsZS4KKyAgc3RhdGljIGNvbnN0IGludCBfQ0FTYWJsZV9iaXRzID0gc3RkOjpudW1lcmljX2xpbWl0czxfQ0FTYWJsZT46OmRpZ2l0czsKKworICAvLy8gOjpfQ0FTYWJsZSB3aXRoIHRoZSByaWdodCBoYWxmIG9mIGJpdHMgc2V0IHRvIDEuCisgIHN0YXRpYyBjb25zdCBfQ0FTYWJsZSBfQ0FTYWJsZV9tYXNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9DQVNhYmxlKDEpIDw8IChfQ0FTYWJsZV9iaXRzIC8gMikpIC0gMSk7Cit9CisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9UWVBFU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3VuaXF1ZV9jb3B5LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3VuaXF1ZV9jb3B5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkyMGMzNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcGFyYWxsZWwvdW5pcXVlX2NvcHkuaApAQCAtMCwwICsxLDE5NyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL3VuaXF1ZV9jb3B5LmgKKyAqICBAYnJpZWYgUGFyYWxsZWwgaW1wbGVtZW50YXRpb25zIG9mIHN0ZDo6dW5pcXVlX2NvcHkoKS4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IFJvYmVydCBHZWlzYmVyZ2VyIGFuZCBSb2JpbiBEYXBwLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX1VOSVFVRV9DT1BZX0gKKyNkZWZpbmUgX0dMSUJDWFhfUEFSQUxMRUxfVU5JUVVFX0NPUFlfSCAxCisKKyNpbmNsdWRlIDxwYXJhbGxlbC9wYXJhbGxlbC5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL211bHRpc2VxX3NlbGVjdGlvbi5oPgorCituYW1lc3BhY2UgX19nbnVfcGFyYWxsZWwKK3sKKyAgLyoqIEBicmllZiBQYXJhbGxlbCBzdGQ6OnVuaXF1ZV9jb3B5KCksIHcvX19vIGV4cGxpY2l0IGVxdWFsaXR5IHByZWRpY2F0ZS4KKyAgICAqICBAcGFyYW0gX19maXJzdCBCZWdpbiBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICAqICBAcGFyYW0gX19sYXN0IEVuZCBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICAqICBAcGFyYW0gX19yZXN1bHQgQmVnaW4gaXRlcmF0b3Igb2YgcmVzdWx0IF9fc2VxdWVuY2UuCisgICAgKiAgQHBhcmFtIF9fYmluYXJ5X3ByZWQgRXF1YWxpdHkgcHJlZGljYXRlLgorICAgICogIEByZXR1cm4gRW5kIGl0ZXJhdG9yIG9mIHJlc3VsdCBfX3NlcXVlbmNlLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsCisgICAgICAgICAgIGNsYXNzIF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX3BhcmFsbGVsX3VuaXF1ZV9jb3B5KF9JSXRlciBfX2ZpcnN0LCBfSUl0ZXIgX19sYXN0LAorCQkJICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorCQkJICAgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0NBTEwoX19sYXN0IC0gX19maXJzdCkKKworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSUl0ZXI+IF9UcmFpdHNUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVHlwZTo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmZXJlbmNlVHlwZTsKKworICAgICAgX0RpZmZlcmVuY2VUeXBlIF9fc2l6ZSA9IF9fbGFzdCAtIF9fZmlyc3Q7CisKKyAgICAgIGlmIChfX3NpemUgPT0gMCkKKwlyZXR1cm4gX19yZXN1bHQ7CisKKyAgICAgIC8vIExldCB0aGUgZmlyc3QgdGhyZWFkIHByb2Nlc3MgdHdvIHBhcnRzLgorICAgICAgX0RpZmZlcmVuY2VUeXBlICpfX2NvdW50ZXI7CisgICAgICBfRGlmZmVyZW5jZVR5cGUgKl9fYm9yZGVyczsKKworICAgICAgX1RocmVhZEluZGV4IF9fbnVtX3RocmVhZHMgPSBfX2dldF9tYXhfdGhyZWFkcygpOworICAgICAgLy8gRmlyc3QgcGFydCBjb250YWlucyBhdCBsZWFzdCBvbmUgZWxlbWVudC4KKyMgICAgIHByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoX19udW1fdGhyZWFkcykKKyAgICAgIHsKKyMgICAgICAgcHJhZ21hIG9tcCBzaW5nbGUKKwl7CisJICBfX251bV90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpOworCSAgX19ib3JkZXJzID0gbmV3IF9EaWZmZXJlbmNlVHlwZVtfX251bV90aHJlYWRzICsgMl07CisJICBfX2VxdWFsbHlfc3BsaXQoX19zaXplLCBfX251bV90aHJlYWRzICsgMSwgX19ib3JkZXJzKTsKKwkgIF9fY291bnRlciA9IG5ldyBfRGlmZmVyZW5jZVR5cGVbX19udW1fdGhyZWFkcyArIDFdOworCX0KKworCV9UaHJlYWRJbmRleCBfX2lhbSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworCisJX0RpZmZlcmVuY2VUeXBlIF9fYmVnaW4sIF9fZW5kOworCisJLy8gQ2hlY2sgZm9yIGxlbmd0aCB3aXRob3V0IGR1cGxpY2F0ZXMKKwkvLyBOZWVkZWQgZm9yIHBvc2l0aW9uIGluIG91dHB1dAorCV9EaWZmZXJlbmNlVHlwZSBfX2kgPSAwOworCV9PdXRwdXRJdGVyYXRvciBfX291dCA9IF9fcmVzdWx0OworCisJaWYgKF9faWFtID09IDApCisgICAgICAgICAgeworICAgICAgICAgICAgX19iZWdpbiA9IF9fYm9yZGVyc1swXSArIDE7ICAgLy8gPT0gMQorICAgICAgICAgICAgX19lbmQgPSBfX2JvcmRlcnNbX19pYW0gKyAxXTsKKworICAgICAgICAgICAgKytfX2k7CisgICAgICAgICAgICAqX19vdXQrKyA9ICpfX2ZpcnN0OworCisgICAgICAgICAgICBmb3IgKF9JSXRlciBfX2l0ZXIgPSBfX2ZpcnN0ICsgX19iZWdpbjsgX19pdGVyIDwgX19maXJzdCArIF9fZW5kOworCQkgKytfX2l0ZXIpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgCWlmICghX19iaW5hcnlfcHJlZCgqX19pdGVyLCAqKF9faXRlciAtIDEpKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytfX2k7CisgICAgICAgICAgICAgICAgICAgICpfX291dCsrID0gKl9faXRlcjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKwllbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgX19iZWdpbiA9IF9fYm9yZGVyc1tfX2lhbV07IC8vb25lIHBhcnQKKyAgICAgICAgICAgIF9fZW5kID0gX19ib3JkZXJzW19faWFtICsgMV07CisKKyAgICAgICAgICAgIGZvciAoX0lJdGVyIF9faXRlciA9IF9fZmlyc3QgKyBfX2JlZ2luOyBfX2l0ZXIgPCBfX2ZpcnN0ICsgX19lbmQ7CisJCSArK19faXRlcikKKyAgICAgICAgICAgICAgeworICAgICAgICAJaWYgKCFfX2JpbmFyeV9wcmVkKCpfX2l0ZXIsICooX19pdGVyIC0gMSkpKQorICAgICAgICAgICAgICAgICAgKytfX2k7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisJX19jb3VudGVyW19faWFtXSA9IF9faTsKKworCS8vIExhc3QgcGFydCBzdGlsbCB1bnRvdWNoZWQuCisJX0RpZmZlcmVuY2VUeXBlIF9fYmVnaW5fb3V0cHV0OworCisjICAgICAgIHByYWdtYSBvbXAgYmFycmllcgorCisJLy8gU3RvcmUgcmVzdWx0IGluIG91dHB1dCBvbiBjYWxjdWxhdGVkIHBvc2l0aW9ucy4KKwlfX2JlZ2luX291dHB1dCA9IDA7CisKKwlpZiAoX19pYW0gPT0gMCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBmb3IgKF9UaHJlYWRJbmRleCBfX3QgPSAwOyBfX3QgPCBfX251bV90aHJlYWRzOyArK19fdCkKKyAgICAgICAgICAgICAgX19iZWdpbl9vdXRwdXQgKz0gX19jb3VudGVyW19fdF07CisKKyAgICAgICAgICAgIF9faSA9IDA7CisKKyAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvciBfX2l0ZXJfb3V0ID0gX19yZXN1bHQgKyBfX2JlZ2luX291dHB1dDsKKworICAgICAgICAgICAgX19iZWdpbiA9IF9fYm9yZGVyc1tfX251bV90aHJlYWRzXTsKKyAgICAgICAgICAgIF9fZW5kID0gX19zaXplOworCisgICAgICAgICAgICBmb3IgKF9JSXRlciBfX2l0ZXIgPSBfX2ZpcnN0ICsgX19iZWdpbjsgX19pdGVyIDwgX19maXJzdCArIF9fZW5kOworCQkgKytfX2l0ZXIpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgCWlmIChfX2l0ZXIgPT0gX19maXJzdAorCQkgICAgfHwgIV9fYmluYXJ5X3ByZWQoKl9faXRlciwgKihfX2l0ZXIgLSAxKSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICsrX19pOworICAgICAgICAgICAgICAgICAgICAqX19pdGVyX291dCsrID0gKl9faXRlcjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2NvdW50ZXJbX19udW1fdGhyZWFkc10gPSBfX2k7CisgICAgICAgICAgfQorCWVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBmb3IgKF9UaHJlYWRJbmRleCBfX3QgPSAwOyBfX3QgPCBfX2lhbTsgX190KyspCisgICAgICAgICAgICAgIF9fYmVnaW5fb3V0cHV0ICs9IF9fY291bnRlcltfX3RdOworCisgICAgICAgICAgICBfT3V0cHV0SXRlcmF0b3IgX19pdGVyX291dCA9IF9fcmVzdWx0ICsgX19iZWdpbl9vdXRwdXQ7CisgICAgICAgICAgICBmb3IgKF9JSXRlciBfX2l0ZXIgPSBfX2ZpcnN0ICsgX19iZWdpbjsgX19pdGVyIDwgX19maXJzdCArIF9fZW5kOworCQkgKytfX2l0ZXIpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgCWlmICghX19iaW5hcnlfcHJlZCgqX19pdGVyLCAqKF9faXRlciAtIDEpKSkKKyAgICAgICAgICAgICAgICAgICpfX2l0ZXJfb3V0KysgPSAqX19pdGVyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgfQorCisgICAgICBfRGlmZmVyZW5jZVR5cGUgX19lbmRfb3V0cHV0ID0gMDsKKyAgICAgIGZvciAoX1RocmVhZEluZGV4IF9fdCA9IDA7IF9fdCA8IF9fbnVtX3RocmVhZHMgKyAxOyBfX3QrKykKKwlfX2VuZF9vdXRwdXQgKz0gX19jb3VudGVyW19fdF07CisKKyAgICAgIGRlbGV0ZVtdIF9fYm9yZGVyczsKKworICAgICAgcmV0dXJuIF9fcmVzdWx0ICsgX19lbmRfb3V0cHV0OworICAgIH0KKworICAvKiogQGJyaWVmIFBhcmFsbGVsIHN0ZDo6dW5pcXVlX2NvcHkoKSwgd2l0aG91dCBleHBsaWNpdCBlcXVhbGl0eSBwcmVkaWNhdGUKKyAgICAqICBAcGFyYW0gX19maXJzdCBCZWdpbiBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICAqICBAcGFyYW0gX19sYXN0IEVuZCBpdGVyYXRvciBvZiBpbnB1dCBzZXF1ZW5jZS4KKyAgICAqICBAcGFyYW0gX19yZXN1bHQgQmVnaW4gaXRlcmF0b3Igb2YgcmVzdWx0IF9fc2VxdWVuY2UuCisgICAgKiAgQHJldHVybiBFbmQgaXRlcmF0b3Igb2YgcmVzdWx0IF9fc2VxdWVuY2UuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgY2xhc3MgX091dHB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX3BhcmFsbGVsX3VuaXF1ZV9jb3B5KF9JSXRlciBfX2ZpcnN0LCBfSUl0ZXIgX19sYXN0LAorCQkJICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lJdGVyPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisgICAgICByZXR1cm4gX19wYXJhbGxlbF91bmlxdWVfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LAorCQkJCSAgICBzdGQ6OmVxdWFsX3RvPF9WYWx1ZVR5cGU+KCkpOworICAgIH0KKworfS8vbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9VTklRVUVfQ09QWV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3BhcmFsbGVsL3dvcmtzdGVhbGluZy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC93b3Jrc3RlYWxpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2FiOTNiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wYXJhbGxlbC93b3Jrc3RlYWxpbmcuaApAQCAtMCwwICsxLDMxMiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHBhcmFsbGVsL3dvcmtzdGVhbGluZy5oCisgKiAgQGJyaWVmIFBhcmFsbGVsaXphdGlvbiBvZiBlbWJhcnJhc3NpbmdseSBwYXJhbGxlbCBleGVjdXRpb24gYnkKKyAqICBtZWFucyBvZiB3b3JrLXN0ZWFsaW5nLgorICoKKyAqICBXb3JrIHN0ZWFsaW5nIGlzIGRlc2NyaWJlZCBpbgorICoKKyAqICBSLiBELiBCbHVtb2ZlIGFuZCBDLiBFLiBMZWlzZXJzb24uCisgKiAgU2NoZWR1bGluZyBtdWx0aXRocmVhZGVkIGNvbXB1dGF0aW9ucyBieSB3b3JrIHN0ZWFsaW5nLgorICogIEpvdXJuYWwgb2YgdGhlIEFDTSwgNDYoNSk6NzIw4oCTNzQ4LCAxOTk5LgorICoKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcGFyYWxsZWwgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IEZlbGl4IFB1dHplLgorCisjaWZuZGVmIF9HTElCQ1hYX1BBUkFMTEVMX1dPUktTVEVBTElOR19ICisjZGVmaW5lIF9HTElCQ1hYX1BBUkFMTEVMX1dPUktTVEVBTElOR19IIDEKKworI2luY2x1ZGUgPHBhcmFsbGVsL3BhcmFsbGVsLmg+CisjaW5jbHVkZSA8cGFyYWxsZWwvcmFuZG9tX251bWJlci5oPgorI2luY2x1ZGUgPHBhcmFsbGVsL2NvbXBhdGliaWxpdHkuaD4KKworbmFtZXNwYWNlIF9fZ251X3BhcmFsbGVsCit7CisKKyNkZWZpbmUgX0dMSUJDWFhfSk9CX1ZPTEFUSUxFIHZvbGF0aWxlCisKKyAgLyoqIEBicmllZiBPbmUgX19qb2IgZm9yIGEgY2VydGFpbiB0aHJlYWQuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9EaWZmZXJlbmNlVHA+CisgICAgc3RydWN0IF9Kb2IKKyAgICB7CisgICAgICB0eXBlZGVmIF9EaWZmZXJlbmNlVHAgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICAvKiogQGJyaWVmIEZpcnN0IGVsZW1lbnQuCisgICAgICAgKgorICAgICAgICogIENoYW5nZWQgYnkgb3duaW5nIGFuZCBzdGVhbGluZyB0aHJlYWQuIEJ5IHN0ZWFsaW5nIHRocmVhZCwKKyAgICAgICAqICBhbHdheXMgaW5jcmVtZW50ZWQuICovCisgICAgICBfR0xJQkNYWF9KT0JfVk9MQVRJTEUgX0RpZmZlcmVuY2VUeXBlIF9NX2ZpcnN0OworCisgICAgICAvKiogQGJyaWVmIExhc3QgZWxlbWVudC4KKyAgICAgICAqCisgICAgICAgKiAgQ2hhbmdlZCBieSBvd25pbmcgdGhyZWFkIG9ubHkuICovCisgICAgICBfR0xJQkNYWF9KT0JfVk9MQVRJTEUgX0RpZmZlcmVuY2VUeXBlIF9NX2xhc3Q7CisKKyAgICAgIC8qKiBAYnJpZWYgTnVtYmVyIG9mIGVsZW1lbnRzLCBpLmUuIEBjIF9NX2xhc3QtX01fZmlyc3QrMS4KKyAgICAgICAqCisgICAgICAgKiAgQ2hhbmdlZCBieSBvd25pbmcgdGhyZWFkIG9ubHkuICovCisgICAgICBfR0xJQkNYWF9KT0JfVk9MQVRJTEUgX0RpZmZlcmVuY2VUeXBlIF9NX2xvYWQ7CisgICAgfTsKKworICAvKiogQGJyaWVmIFdvcmsgc3RlYWxpbmcgYWxnb3JpdGhtIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4KKyAgICAqCisgICAgKiAgVXNlcyBPKDEpIGFkZGl0aW9uYWwgbWVtb3J5LiBTeW5jaHJvbml6YXRpb24gYXQgam9iIGxpc3RzIGlzCisgICAgKiAgZG9uZSB3aXRoIGF0b21pYyBvcGVyYXRpb25zLgorICAgICogIEBwYXJhbSBfX2JlZ2luIEJlZ2luIGl0ZXJhdG9yIG9mIGVsZW1lbnQgc2VxdWVuY2UuCisgICAgKiAgQHBhcmFtIF9fZW5kIEVuZCBpdGVyYXRvciBvZiBlbGVtZW50IHNlcXVlbmNlLgorICAgICogIEBwYXJhbSBfX29wIFVzZXItc3VwcGxpZWQgZnVuY3RvciAoY29tcGFyYXRvciwgcHJlZGljYXRlLCBhZGRpbmcKKyAgICAqICBmdW5jdG9yLCAuLi4pLgorICAgICogIEBwYXJhbSBfX2YgRnVuY3RvciB0byBAYSBwcm9jZXNzIGFuIGVsZW1lbnQgd2l0aCBfX29wIChkZXBlbmRzIG9uCisgICAgKiAgZGVzaXJlZCBmdW5jdGlvbmFsaXR5LCBlLiBnLiBmb3Igc3RkOjpmb3JfZWFjaCgpLCAuLi4pLgorICAgICogIEBwYXJhbSBfX3IgRnVuY3RvciB0byBAYSBhZGQgYSBzaW5nbGUgX19yZXN1bHQgdG8gdGhlIGFscmVhZHkKKyAgICAqICBwcm9jZXNzZWQgZWxlbWVudHMgKGRlcGVuZHMgb24gZnVuY3Rpb25hbGl0eSkuCisgICAgKiAgQHBhcmFtIF9fYmFzZSBCYXNlIHZhbHVlIGZvciByZWR1Y3Rpb24uCisgICAgKiAgQHBhcmFtIF9fb3V0cHV0IFBvaW50ZXIgdG8gcG9zaXRpb24gd2hlcmUgZmluYWwgcmVzdWx0IGlzIHdyaXR0ZW4gdG8KKyAgICAqICBAcGFyYW0gX19ib3VuZCBNYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBwcm9jZXNzZWQgKGUuIGcuIGZvcgorICAgICogIHN0ZDo6Y291bnRfbigpKS4KKyAgICAqICBAcmV0dXJuIFVzZXItc3VwcGxpZWQgZnVuY3RvciAodGhhdCBtYXkgY29udGFpbiBhIHBhcnQgb2YgdGhlIHJlc3VsdCkuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwKKyAgICAgICAgICAgdHlwZW5hbWUgX09wLAorICAgICAgICAgICB0eXBlbmFtZSBfRnUsCisgICAgICAgICAgIHR5cGVuYW1lIF9SZWQsCisgICAgICAgICAgIHR5cGVuYW1lIF9SZXN1bHQ+CisgICAgX09wCisgICAgX19mb3JfZWFjaF90ZW1wbGF0ZV9yYW5kb21fYWNjZXNzX3dvcmtzdGVhbGluZyhfUkFJdGVyIF9fYmVnaW4sCisJCQkJCQkgICBfUkFJdGVyIF9fZW5kLCBfT3AgX19vcCwKKwkJCQkJCSAgIF9GdSYgX19mLCBfUmVkIF9fciwKKwkJCQkJCSAgIF9SZXN1bHQgX19iYXNlLAorCQkJCQkJICAgX1Jlc3VsdCYgX19vdXRwdXQsCisgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUkFJdGVyPjo6ZGlmZmVyZW5jZV90eXBlIF9fYm91bmQpCisgICAgeworICAgICAgX0dMSUJDWFhfQ0FMTChfX2VuZCAtIF9fYmVnaW4pCisKKyAgICAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JBSXRlcj4gX1RyYWl0c1R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHNUeXBlOjpkaWZmZXJlbmNlX3R5cGUgX0RpZmZlcmVuY2VUeXBlOworCisgICAgICBjb25zdCBfU2V0dGluZ3MmIF9fcyA9IF9TZXR0aW5nczo6Z2V0KCk7CisKKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2NodW5rX3NpemUgPQorICAgICAgICAgIHN0YXRpY19jYXN0PF9EaWZmZXJlbmNlVHlwZT4oX19zLndvcmtzdGVhbGluZ19jaHVua19zaXplKTsKKworICAgICAgLy8gSG93IG1hbnkgam9icz8KKyAgICAgIF9EaWZmZXJlbmNlVHlwZSBfX2xlbmd0aCA9IChfX2JvdW5kIDwgMCkgPyAoX19lbmQgLSBfX2JlZ2luKSA6IF9fYm91bmQ7CisKKyAgICAgIC8vIFRvIGF2b2lkIGZhbHNlIHNoYXJpbmcgaW4gYSBjYWNoZSBsaW5lLgorICAgICAgY29uc3QgaW50IF9fc3RyaWRlID0gKF9fcy5jYWNoZV9saW5lX3NpemUgKiAxMAorCQkJICAgIC8gc2l6ZW9mKF9Kb2I8X0RpZmZlcmVuY2VUeXBlPikgKyAxKTsKKworICAgICAgLy8gVG90YWwgbnVtYmVyIG9mIHRocmVhZHMgY3VycmVudGx5IHdvcmtpbmcuCisgICAgICBfVGhyZWFkSW5kZXggX19idXN5ID0gMDsKKworICAgICAgX0pvYjxfRGlmZmVyZW5jZVR5cGU+ICpfX2pvYjsKKworICAgICAgb21wX2xvY2tfdCBfX291dHB1dF9sb2NrOworICAgICAgb21wX2luaXRfbG9jaygmX19vdXRwdXRfbG9jayk7CisKKyAgICAgIC8vIFdyaXRlIGJhc2UgdmFsdWUgdG8gb3V0cHV0LgorICAgICAgX19vdXRwdXQgPSBfX2Jhc2U7CisKKyAgICAgIC8vIE5vIG1vcmUgdGhyZWFkcyB0aGFuIGpvYnMsIGF0IGxlYXN0IG9uZSB0aHJlYWQuCisgICAgICBfVGhyZWFkSW5kZXggX19udW1fdGhyZWFkcyA9IF9fZ251X3BhcmFsbGVsOjptYXg8X1RocmVhZEluZGV4PgorCSgxLCBfX2dudV9wYXJhbGxlbDo6bWluPF9EaWZmZXJlbmNlVHlwZT4oX19sZW5ndGgsCisJCQkJCQkgX19nZXRfbWF4X3RocmVhZHMoKSkpOworCisjICAgICBwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChfX2J1c3kpIG51bV90aHJlYWRzKF9fbnVtX3RocmVhZHMpCisgICAgICB7CisjICAgICAgIHByYWdtYSBvbXAgc2luZ2xlCisJeworCSAgX19udW1fdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKworCSAgLy8gQ3JlYXRlIGpvYiBkZXNjcmlwdGlvbiBhcnJheS4KKwkgIF9fam9iID0gbmV3IF9Kb2I8X0RpZmZlcmVuY2VUeXBlPltfX251bV90aHJlYWRzICogX19zdHJpZGVdOworCX0KKworCS8vIEluaXRpYWxpemF0aW9uIHBoYXNlLgorCisJLy8gRmxhZ3MgZm9yIGV2ZXJ5IHRocmVhZCBpZiBpdCBpcyBkb2luZyBwcm9kdWN0aXZlIHdvcmsuCisJYm9vbCBfX2lhbV93b3JraW5nID0gZmFsc2U7CisKKwkvLyBUaHJlYWQgaWQuCisJX1RocmVhZEluZGV4IF9faWFtID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisKKwkvLyBUaGlzIGpvYi4KKwlfSm9iPF9EaWZmZXJlbmNlVHlwZT4mIF9fbXlfam9iID0gX19qb2JbX19pYW0gKiBfX3N0cmlkZV07CisKKwkvLyBSYW5kb20gbnVtYmVyIChmb3Igd29yayBzdGVhbGluZykuCisJX1RocmVhZEluZGV4IF9fdmljdGltOworCisJLy8gTG9jYWwgdmFsdWUgZm9yIHJlZHVjdGlvbi4KKwlfUmVzdWx0IF9fcmVzdWx0ID0gX1Jlc3VsdCgpOworCisJLy8gTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHN0ZWFsIGluIG9uZSBhdHRlbXB0LgorCV9EaWZmZXJlbmNlVHlwZSBfX3N0ZWFsOworCisJLy8gRXZlcnkgdGhyZWFkIGhhcyBpdHMgb3duIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisJLy8gKG1vZHVsbyBfX251bV90aHJlYWRzKS4KKwlfUmFuZG9tTnVtYmVyIF9fcmFuZF9nZW4oX19pYW0sIF9fbnVtX3RocmVhZHMpOworCisJLy8gVGhpcyB0aHJlYWQgaXMgY3VycmVudGx5IHdvcmtpbmcuCisjICAgICAgIHByYWdtYSBvbXAgYXRvbWljCisJKytfX2J1c3k7CisKKwlfX2lhbV93b3JraW5nID0gdHJ1ZTsKKworCS8vIEhvdyBtYW55IGpvYnMgcGVyIHRocmVhZD8gbGFzdCB0aHJlYWQgZ2V0cyB0aGUgcmVzdC4KKwlfX215X2pvYi5fTV9maXJzdCA9IHN0YXRpY19jYXN0PF9EaWZmZXJlbmNlVHlwZT4KKwkgIChfX2lhbSAqIChfX2xlbmd0aCAvIF9fbnVtX3RocmVhZHMpKTsKKworCV9fbXlfam9iLl9NX2xhc3QgPSAoX19pYW0gPT0gKF9fbnVtX3RocmVhZHMgLSAxKQorCQkJICAgID8gKF9fbGVuZ3RoIC0gMSkKKwkJCSAgICA6ICgoX19pYW0gKyAxKSAqIChfX2xlbmd0aCAvIF9fbnVtX3RocmVhZHMpIC0gMSkpOworCV9fbXlfam9iLl9NX2xvYWQgPSBfX215X2pvYi5fTV9sYXN0IC0gX19teV9qb2IuX01fZmlyc3QgKyAxOworCisJLy8gSW5pdCByZXN1bHQgd2l0aCBfTV9maXJzdCB2YWx1ZSAodG8gaGF2ZSBhIGJhc2UgdmFsdWUgZm9yIHJlZHVjdGlvbikKKwlpZiAoX19teV9qb2IuX01fZmlyc3QgPD0gX19teV9qb2IuX01fbGFzdCkKKwkgIHsKKwkgICAgLy8gQ2Fubm90IHVzZSB2b2xhdGlsZSB2YXJpYWJsZSBkaXJlY3RseS4KKwkgICAgX0RpZmZlcmVuY2VUeXBlIF9fbXlfZmlyc3QgPSBfX215X2pvYi5fTV9maXJzdDsKKwkgICAgX19yZXN1bHQgPSBfX2YoX19vcCwgX19iZWdpbiArIF9fbXlfZmlyc3QpOworCSAgICArK19fbXlfam9iLl9NX2ZpcnN0OworCSAgICAtLV9fbXlfam9iLl9NX2xvYWQ7CisJICB9CisKKwlfUkFJdGVyIF9fY3VycmVudDsKKworIyAgICAgICBwcmFnbWEgb21wIGJhcnJpZXIKKworCS8vIEFjdHVhbCB3b3JrIHBoYXNlCisJLy8gV29yayBvbiBvd24gb3Igc3RvbGVuIGN1cnJlbnQgc3RhcnQKKwl3aGlsZSAoX19idXN5ID4gMCkKKwkgIHsKKwkgICAgLy8gV29yayB1bnRpbCBubyBwcm9kdWN0aXZlIHRocmVhZCBsZWZ0LgorIyAgICAgICAgICAgcHJhZ21hIG9tcCBmbHVzaChfX2J1c3kpCisKKwkgICAgLy8gVGhyZWFkIGhhcyBvd24gd29yayB0byBkbworCSAgICB3aGlsZSAoX19teV9qb2IuX01fZmlyc3QgPD0gX19teV9qb2IuX01fbGFzdCkKKwkgICAgICB7CisJCS8vIGZldGNoLWFuZC1hZGQgY2FsbAorCQkvLyBSZXNlcnZlIGN1cnJlbnQgam9iIGJsb2NrIChzaXplIF9fY2h1bmtfc2l6ZSkgaW4gbXkgcXVldWUuCisJCV9EaWZmZXJlbmNlVHlwZSBfX2N1cnJlbnRfam9iID0KKwkJICBfX2ZldGNoX2FuZF9hZGQ8X0RpZmZlcmVuY2VUeXBlPigmKF9fbXlfam9iLl9NX2ZpcnN0KSwKKwkJCQkJCSAgIF9fY2h1bmtfc2l6ZSk7CisKKwkJLy8gVXBkYXRlIF9NX2xvYWQsIHRvIG1ha2UgdGhlIHRocmVlIHZhbHVlcyBjb25zaXN0ZW50LAorCQkvLyBfTV9maXJzdCBtaWdodCBoYXZlIGJlZW4gY2hhbmdlZCBpbiB0aGUgbWVhbnRpbWUKKwkJX19teV9qb2IuX01fbG9hZCA9IF9fbXlfam9iLl9NX2xhc3QgLSBfX215X2pvYi5fTV9maXJzdCArIDE7CisJCWZvciAoX0RpZmZlcmVuY2VUeXBlIF9fam9iX2NvdW50ZXIgPSAwOworCQkgICAgIF9fam9iX2NvdW50ZXIgPCBfX2NodW5rX3NpemUKKwkJICAgICAgICYmIF9fY3VycmVudF9qb2IgPD0gX19teV9qb2IuX01fbGFzdDsKKwkJICAgICArK19fam9iX2NvdW50ZXIpCisJCSAgeworCQkgICAgLy8gWWVzOiBwcm9jZXNzIGl0IQorCQkgICAgX19jdXJyZW50ID0gX19iZWdpbiArIF9fY3VycmVudF9qb2I7CisJCSAgICArK19fY3VycmVudF9qb2I7CisKKwkJICAgIC8vIERvIGFjdHVhbCB3b3JrLgorCQkgICAgX19yZXN1bHQgPSBfX3IoX19yZXN1bHQsIF9fZihfX29wLCBfX2N1cnJlbnQpKTsKKwkJICB9CisKKyMgICAgICAgICAgICAgICBwcmFnbWEgb21wIGZsdXNoKF9fYnVzeSkKKwkgICAgICB9CisKKwkgICAgLy8gQWZ0ZXIgcmVhY2hpbmcgdGhpcyBwb2ludCwgYSB0aHJlYWQncyBfX2pvYiBsaXN0IGlzIGVtcHR5LgorCSAgICBpZiAoX19pYW1fd29ya2luZykKKwkgICAgICB7CisJCS8vIFRoaXMgdGhyZWFkIG5vIGxvbmdlciBoYXMgd29yay4KKyMgICAgICAgICAgICAgICBwcmFnbWEgb21wIGF0b21pYworCQktLV9fYnVzeTsKKworCQlfX2lhbV93b3JraW5nID0gZmFsc2U7CisJICAgICAgfQorCisJICAgIF9EaWZmZXJlbmNlVHlwZSBfX3N1cHBvc2VkX2ZpcnN0LCBfX3N1cHBvc2VkX2xhc3QsCisJICAgICAgICAgICAgICAgICAgICBfX3N1cHBvc2VkX2xvYWQ7CisJICAgIGRvCisJICAgICAgeworCQkvLyBGaW5kIHJhbmRvbSBub25lbXB0eSBkZXF1ZSAobm90IG93biksIGRvIGNvbnNpc3RlbmN5IGNoZWNrLgorCQlfX3lpZWxkKCk7CisjICAgICAgICAgICAgICAgcHJhZ21hIG9tcCBmbHVzaChfX2J1c3kpCisJCV9fdmljdGltID0gX19yYW5kX2dlbigpOworCQlfX3N1cHBvc2VkX2ZpcnN0ID0gX19qb2JbX192aWN0aW0gKiBfX3N0cmlkZV0uX01fZmlyc3Q7CisJCV9fc3VwcG9zZWRfbGFzdCA9IF9fam9iW19fdmljdGltICogX19zdHJpZGVdLl9NX2xhc3Q7CisJCV9fc3VwcG9zZWRfbG9hZCA9IF9fam9iW19fdmljdGltICogX19zdHJpZGVdLl9NX2xvYWQ7CisJICAgICAgfQorCSAgICB3aGlsZSAoX19idXN5ID4gMAorCQkgICAmJiAoKF9fc3VwcG9zZWRfbG9hZCA8PSAwKQorCQkgICAgICAgfHwgKChfX3N1cHBvc2VkX2ZpcnN0ICsgX19zdXBwb3NlZF9sb2FkIC0gMSkKKwkJCSAgICE9IF9fc3VwcG9zZWRfbGFzdCkpKTsKKworCSAgICBpZiAoX19idXN5ID09IDApCisJICAgICAgYnJlYWs7CisKKwkgICAgaWYgKF9fc3VwcG9zZWRfbG9hZCA+IDApCisJICAgICAgeworCQkvLyBIYXMgd29yayBhbmQgd29yayB0byBkby4KKwkJLy8gTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHN0ZWFsIChhdCBsZWFzdCBvbmUpLgorCQlfX3N0ZWFsID0gKF9fc3VwcG9zZWRfbG9hZCA8IDIpID8gMSA6IF9fc3VwcG9zZWRfbG9hZCAvIDI7CisKKwkJLy8gUHVzaCBfX3ZpY3RpbSdzIGN1cnJlbnQgc3RhcnQgZm9yd2FyZC4KKwkJX0RpZmZlcmVuY2VUeXBlIF9fc3RvbGVuX2ZpcnN0ID0KKwkJICBfX2ZldGNoX2FuZF9hZGQ8X0RpZmZlcmVuY2VUeXBlPgorCQkgICgmKF9fam9iW19fdmljdGltICogX19zdHJpZGVdLl9NX2ZpcnN0KSwgX19zdGVhbCk7CisJCV9EaWZmZXJlbmNlVHlwZSBfX3N0b2xlbl90cnkgPSAoX19zdG9sZW5fZmlyc3QgKyBfX3N0ZWFsCisJCQkJCQktIF9EaWZmZXJlbmNlVHlwZSgxKSk7CisKKwkJX19teV9qb2IuX01fZmlyc3QgPSBfX3N0b2xlbl9maXJzdDsKKwkJX19teV9qb2IuX01fbGFzdCA9IF9fZ251X3BhcmFsbGVsOjptaW4oX19zdG9sZW5fdHJ5LAorCQkJCQkJICAgICAgIF9fc3VwcG9zZWRfbGFzdCk7CisJCV9fbXlfam9iLl9NX2xvYWQgPSBfX215X2pvYi5fTV9sYXN0IC0gX19teV9qb2IuX01fZmlyc3QgKyAxOworCisJCS8vIEhhcyBwb3RlbnRpYWwgd29yayBhZ2Fpbi4KKyMgICAgICAgICAgICAgICBwcmFnbWEgb21wIGF0b21pYworCQkrK19fYnVzeTsKKwkJX19pYW1fd29ya2luZyA9IHRydWU7CisKKyMgICAgICAgICAgICAgICBwcmFnbWEgb21wIGZsdXNoKF9fYnVzeSkKKwkgICAgICB9CisjICAgICAgICAgICBwcmFnbWEgb21wIGZsdXNoKF9fYnVzeSkKKwkgIH0gLy8gZW5kIHdoaWxlIF9fYnVzeSA+IDAKKwkvLyBBZGQgYWNjdW11bGF0ZWQgcmVzdWx0IHRvIG91dHB1dC4KKwlvbXBfc2V0X2xvY2soJl9fb3V0cHV0X2xvY2spOworCV9fb3V0cHV0ID0gX19yKF9fb3V0cHV0LCBfX3Jlc3VsdCk7CisJb21wX3Vuc2V0X2xvY2soJl9fb3V0cHV0X2xvY2spOworICAgICAgfQorCisgICAgICBkZWxldGVbXSBfX2pvYjsKKworICAgICAgLy8gUG9pbnRzIHRvIGxhc3QgZWxlbWVudCBwcm9jZXNzZWQgKG5lZWRlZCBhcyByZXR1cm4gdmFsdWUgZm9yCisgICAgICAvLyBzb21lIGFsZ29yaXRobXMgbGlrZSB0cmFuc2Zvcm0pCisgICAgICBfX2YuX01fZmluaXNoX2l0ZXJhdG9yID0gX19iZWdpbiArIF9fbGVuZ3RoOworCisgICAgICBvbXBfZGVzdHJveV9sb2NrKCZfX291dHB1dF9sb2NrKTsKKworICAgICAgcmV0dXJuIF9fb3A7CisgICAgfQorfSAvLyBlbmQgbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QQVJBTExFTF9XT1JLU1RFQUxJTkdfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2FycmF5IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2FycmF5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNmRhNmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvYXJyYXkKQEAgLTAsMCArMSwyNjcgQEAKKy8vIFByb2ZpbGUgYXJyYXkgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvYXJyYXkKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9BUlJBWQorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX0FSUkFZIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3Byb2ZpbGUKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgc3RydWN0IGFycmF5CisgICAgeworICAgICAgdHlwZWRlZiBfVHAgCSAgICAJCQkgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlKgkJCSAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAJICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAJICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpzaXplX3QgICAgICAgICAgICAgICAgICAgIAkgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90ICAgICAgICAgICAgICAgICAgIAkgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4JICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIC8vIFN1cHBvcnQgZm9yIHplcm8tc2l6ZWQgYXJyYXlzIG1hbmRhdG9yeS4KKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6Ol9fYXJyYXlfdHJhaXRzPF9UcCwgX05tPiBfQVRfVHlwZTsKKyAgICAgIHR5cGVuYW1lIF9BVF9UeXBlOjpfVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICBfTV9lbGVtczsKKworICAgICAgLy8gTm8gZXhwbGljaXQgY29uc3RydWN0L2NvcHkvZGVzdHJveSBmb3IgYWdncmVnYXRlIHR5cGUuCisKKyAgICAgIC8vIERSIDc3Ni4KKyAgICAgIHZvaWQKKyAgICAgIGZpbGwoY29uc3QgdmFsdWVfdHlwZSYgX191KQorICAgICAgeyBzdGQ6OmZpbGxfbihiZWdpbigpLCBzaXplKCksIF9fdSk7IH0KKworICAgICAgdm9pZAorICAgICAgc3dhcChhcnJheSYgX19vdGhlcikKKyAgICAgIG5vZXhjZXB0KG5vZXhjZXB0KHN3YXAoc3RkOjpkZWNsdmFsPF9UcCY+KCksIHN0ZDo6ZGVjbHZhbDxfVHAmPigpKSkpCisgICAgICB7IHN0ZDo6c3dhcF9yYW5nZXMoYmVnaW4oKSwgZW5kKCksIF9fb3RoZXIuYmVnaW4oKSk7IH0KKworICAgICAgLy8gSXRlcmF0b3JzLgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKGRhdGEoKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKGRhdGEoKSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBpdGVyYXRvcihkYXRhKCkgKyBfTm0pOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoZGF0YSgpICsgX05tKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yIAorICAgICAgcmJlZ2luKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgCisgICAgICByYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvciAKKyAgICAgIHJlbmQoKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIAorICAgICAgcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoZGF0YSgpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihkYXRhKCkgKyBfTm0pOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgCisgICAgICBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgCisgICAgICBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIC8vIENhcGFjaXR5LgorICAgICAgY29uc3RleHByIHNpemVfdHlwZSAKKyAgICAgIHNpemUoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBfTm07IH0KKworICAgICAgY29uc3RleHByIHNpemVfdHlwZSAKKyAgICAgIG1heF9zaXplKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gX05tOyB9CisKKyAgICAgIGNvbnN0ZXhwciBib29sIAorICAgICAgZW1wdHkoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBzaXplKCkgPT0gMDsgfQorCisgICAgICAvLyBFbGVtZW50IGFjY2Vzcy4KKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKQorICAgICAgewlyZXR1cm4gX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgX19uKTsgfQorCisgICAgICBjb25zdGV4cHIgY29uc3RfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfQVRfVHlwZTo6X1NfcmVmKF9NX2VsZW1zLCBfX24pOyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgYXQoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlpZiAoX19uID49IF9ObSkKKwkgIHN0ZDo6X190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJhcnJheTo6YXQiKSk7CisJcmV0dXJuIF9BVF9UeXBlOjpfU19yZWYoX01fZWxlbXMsIF9fbik7CisgICAgICB9CisKKyAgICAgIGNvbnN0ZXhwciBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7CisJLy8gUmVzdWx0IG9mIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gbXVzdCBiZSBhbiBsdmFsdWUgc28gdXNlCisJLy8gYm9vbGVhbiA/IGx2YWx1ZSA6ICh0aHJvdy1leHByLCBsdmFsdWUpCisJcmV0dXJuIF9fbiA8IF9ObSA/IF9BVF9UeXBlOjpfU19yZWYoX01fZWxlbXMsIF9fbikKKwkgIDogKHN0ZDo6X190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJhcnJheTo6YXQiKSksCisJICAgICBfQVRfVHlwZTo6X1NfcmVmKF9NX2VsZW1zLCAwKSk7CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZSAKKyAgICAgIGZyb250KCkKKyAgICAgIHsgcmV0dXJuICpiZWdpbigpOyB9CisKKyAgICAgIGNvbnN0ZXhwciBjb25zdF9yZWZlcmVuY2UgCisgICAgICBmcm9udCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfQVRfVHlwZTo6X1NfcmVmKF9NX2VsZW1zLCAwKTsgfQorCisgICAgICByZWZlcmVuY2UgCisgICAgICBiYWNrKCkKKyAgICAgIHsgcmV0dXJuIF9ObSA/ICooZW5kKCkgLSAxKSA6ICplbmQoKTsgfQorCisgICAgICBjb25zdGV4cHIgY29uc3RfcmVmZXJlbmNlIAorICAgICAgYmFjaygpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9ObSA/IF9BVF9UeXBlOjpfU19yZWYoX01fZWxlbXMsIF9ObSAtIDEpCisgCSAgICAgICAgICAgOiBfQVRfVHlwZTo6X1NfcmVmKF9NX2VsZW1zLCAwKTsJICAKKyAgICAgIH0KKworICAgICAgcG9pbnRlcgorICAgICAgZGF0YSgpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9BVF9UeXBlOjpfU19yZWYoX01fZWxlbXMsIDApKTsgfQorCisgICAgICBjb25zdF9wb2ludGVyCisgICAgICBkYXRhKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX0FUX1R5cGU6Ol9TX3JlZihfTV9lbGVtcywgMCkpOyB9CisgICAgfTsKKworICAvLyBBcnJheSBjb21wYXJpc29ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIGJvb2wgCisgICAgb3BlcmF0b3I9PShjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fb25lLCBjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fdHdvKQorICAgIHsgcmV0dXJuIHN0ZDo6ZXF1YWwoX19vbmUuYmVnaW4oKSwgX19vbmUuZW5kKCksIF9fdHdvLmJlZ2luKCkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgeyByZXR1cm4gIShfX29uZSA9PSBfX3R3byk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fYSwgY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX2IpCisgICAgeyAKKyAgICAgIHJldHVybiBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9fYS5iZWdpbigpLCBfX2EuZW5kKCksCisJCQkJCSAgX19iLmJlZ2luKCksIF9fYi5lbmQoKSk7IAorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fb25lLCBjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fdHdvKQorICAgIHsgcmV0dXJuIF9fdHdvIDwgX19vbmU7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX29uZSwgY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX3R3bykKKyAgICB7IHJldHVybiAhKF9fb25lID4gX190d28pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgeyByZXR1cm4gIShfX29uZSA8IF9fdHdvKTsgfQorCisgIC8vIFNwZWNpYWxpemVkIGFsZ29yaXRobXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChhcnJheTxfVHAsIF9ObT4mIF9fb25lLCBhcnJheTxfVHAsIF9ObT4mIF9fdHdvKQorICAgIG5vZXhjZXB0KG5vZXhjZXB0KF9fb25lLnN3YXAoX190d28pKSkKKyAgICB7IF9fb25lLnN3YXAoX190d28pOyB9CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0ludCwgdHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgY29uc3RleHByIF9UcCYKKyAgICBnZXQoYXJyYXk8X1RwLCBfTm0+JiBfX2Fycikgbm9leGNlcHQKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9JbnQgPCBfTm0sICJpbmRleCBpcyBvdXQgb2YgYm91bmRzIik7CisgICAgICByZXR1cm4gX0dMSUJDWFhfU1REX0M6Ol9fYXJyYXlfdHJhaXRzPF9UcCwgX05tPjo6CisJX1NfcmVmKF9fYXJyLl9NX2VsZW1zLCBfSW50KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0ludCwgdHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgY29uc3RleHByIF9UcCYmCisgICAgZ2V0KGFycmF5PF9UcCwgX05tPiYmIF9fYXJyKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoX0ludCA8IF9ObSwgImluZGV4IGlzIG91dCBvZiBib3VuZHMiKTsKKyAgICAgIHJldHVybiBzdGQ6Om1vdmUoZ2V0PF9JbnQ+KF9fYXJyKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JbnQsIHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGNvbnN0ZXhwciBjb25zdCBfVHAmCisgICAgZ2V0KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19hcnIpIG5vZXhjZXB0CisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChfSW50IDwgX05tLCAiaW5kZXggaXMgb3V0IG9mIGJvdW5kcyIpOworICAgICAgcmV0dXJuIF9HTElCQ1hYX1NURF9DOjpfX2FycmF5X3RyYWl0czxfVHAsIF9ObT46OgorCV9TX3JlZihfX2Fyci5fTV9lbGVtcywgX0ludCk7CisgICAgfQorfSAvLyBuYW1lc3BhY2UgX19wcm9maWxlCisKKyAgLy8gVHVwbGUgaW50ZXJmYWNlIHRvIGNsYXNzIHRlbXBsYXRlIGFycmF5LgorCisgIC8vLyB0dXBsZV9zaXplCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIHN0cnVjdCB0dXBsZV9zaXplPF9fcHJvZmlsZTo6YXJyYXk8X1RwLCBfTm0+PgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PHN0ZDo6c2l6ZV90LCBfTm0+IHsgfTsKKworICAvLy8gdHVwbGVfZWxlbWVudAorICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSW50LCB0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBzdHJ1Y3QgdHVwbGVfZWxlbWVudDxfSW50LCBfX3Byb2ZpbGU6OmFycmF5PF9UcCwgX05tPj4KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9JbnQgPCBfTm0sICJpbmRleCBpcyBvdXQgb2YgYm91bmRzIik7CisgICAgICB0eXBlZGVmIF9UcCB0eXBlOworICAgIH07Cit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8vIF9HTElCQ1hYX1BST0ZJTEVfQVJSQVkKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9iYXNlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMzdmMDQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvYmFzZS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvYmFzZS5oCisgKiAgQGJyaWVmIFNlcXVlbnRpYWwgaGVscGVyIGZ1bmN0aW9ucy4KKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcHJvZmlsZSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgTGl4aWEgTGl1CisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9CQVNFX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9CQVNFX0ggMQorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxwcm9maWxlL2ltcGwvcHJvZmlsZXIuaD4KKworLy8gUHJvZmlsaW5nIG1vZGUgbmFtZXNwYWNlcy4KKworLyoqCisgKiBAbmFtZXNwYWNlIHN0ZDo6X19wcm9maWxlCisgKiBAYnJpZWYgR05VIHByb2ZpbGUgY29kZSwgcmVwbGFjZXMgc3RhbmRhcmQgYmVoYXZpb3Igd2l0aCBwcm9maWxlIGJlaGF2aW9yLgorICovCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkgCit7IAorICBuYW1lc3BhY2UgX19wcm9maWxlIHsgfSAKK30KKworLyoqCisgKiBAbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKyAqIEBicmllZiBHTlUgcHJvZmlsZSBjb2RlIGZvciBwdWJsaWMgdXNlLgorICovCituYW1lc3BhY2UgX19nbnVfcHJvZmlsZQoreworICAvLyBJbXBvcnQgYWxsIHRoZSBwcm9maWxlIHZlcnNpb25zIG9mIGNvbXBvbmVudHMgaW4gbmFtZXNwYWNlIHN0ZC4KKyAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6X19wcm9maWxlOworfQorCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QUk9GSUxFX0JBU0VfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2JpdHNldCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9iaXRzZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE2NTBiMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9iaXRzZXQKQEAgLTAsMCArMSwzODIgQEAKKy8vIFByb2ZpbGluZyBiaXRzZXQgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvYml0c2V0CisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHByb2ZpbGUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfQklUU0VUCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfQklUU0VUCisKKyNpbmNsdWRlIDxiaXRzZXQ+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fcHJvZmlsZQoreworICAvLy8gQ2xhc3Mgc3RkOjpiaXRzZXQgd3JhcHBlciB3aXRoIHBlcmZvcm1hbmNlIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICBjbGFzcyBiaXRzZXQKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQzo6Yml0c2V0PF9OYj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX1NURF9DOjpiaXRzZXQ8X05iPiBfQmFzZTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIGJpdCByZWZlcmVuY2U6CisgICAgICBjbGFzcyByZWZlcmVuY2UKKyAgICAgIDogcHJpdmF0ZSBfQmFzZTo6cmVmZXJlbmNlCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlIF9CYXNlX3JlZjsKKworCWZyaWVuZCBjbGFzcyBiaXRzZXQ7CisJcmVmZXJlbmNlKCk7CisKKwlyZWZlcmVuY2UoY29uc3QgX0Jhc2VfcmVmJiBfX2Jhc2UsIGJpdHNldCogX19zZXEpIF9HTElCQ1hYX05PRVhDRVBUCisJOiBfQmFzZV9yZWYoX19iYXNlKQorCXsgfQorCisgICAgICBwdWJsaWM6CisJcmVmZXJlbmNlKGNvbnN0IHJlZmVyZW5jZSYgX194KSBfR0xJQkNYWF9OT0VYQ0VQVAorCTogX0Jhc2VfcmVmKF9feCkKKwl7IH0KKworCXJlZmVyZW5jZSYKKwlvcGVyYXRvcj0oYm9vbCBfX3gpIF9HTElCQ1hYX05PRVhDRVBUCisJeworCSAgKnN0YXRpY19jYXN0PF9CYXNlX3JlZio+KHRoaXMpID0gX194OworCSAgcmV0dXJuICp0aGlzOworCX0KKworCXJlZmVyZW5jZSYKKwlvcGVyYXRvcj0oY29uc3QgcmVmZXJlbmNlJiBfX3gpIF9HTElCQ1hYX05PRVhDRVBUCisJeworCSAgKnN0YXRpY19jYXN0PF9CYXNlX3JlZio+KHRoaXMpID0gX194OworCSAgcmV0dXJuICp0aGlzOworCX0KKworCWJvb2wKKwlvcGVyYXRvcn4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorCXsKKwkgIHJldHVybiB+KCpzdGF0aWNfY2FzdDxjb25zdCBfQmFzZV9yZWYqPih0aGlzKSk7CisJfQorCisJb3BlcmF0b3IgYm9vbCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisJeworCSAgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBfQmFzZV9yZWYqPih0aGlzKTsKKwl9CisKKwlyZWZlcmVuY2UmCisJZmxpcCgpIF9HTElCQ1hYX05PRVhDRVBUCisJeworCSAgX0Jhc2VfcmVmOjpmbGlwKCk7CisJICByZXR1cm4gKnRoaXM7CisJfQorICAgICAgfTsKKworICAgICAgLy8gMjMuMy41LjEgY29uc3RydWN0b3JzOgorICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGJpdHNldCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICA6IF9CYXNlKCkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBjb25zdGV4cHIgYml0c2V0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX3ZhbCkgbm9leGNlcHQKKyNlbHNlCisgICAgICBiaXRzZXQodW5zaWduZWQgbG9uZyBfX3ZhbCkKKyNlbmRpZgorICAgICAgOiBfQmFzZShfX3ZhbCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgICBleHBsaWNpdAorICAgICAgICBiaXRzZXQoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3N0ciwKKwkgICAgICAgdHlwZW5hbWUgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKKwkgICAgICAgX19wb3MgPSAwLAorCSAgICAgICB0eXBlbmFtZSBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorCSAgICAgICBfX24gPSAoc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpucG9zKSkKKwk6IF9CYXNlKF9fc3RyLCBfX3BvcywgX19uKSB7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMzk2LiB3aGF0IGFyZSBjaGFyYWN0ZXJzIHplcm8gYW5kIG9uZS4KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorCWJpdHNldChjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fc3RyLAorCSAgICAgICB0eXBlbmFtZSBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorCSAgICAgICBfX3BvcywKKwkgICAgICAgdHlwZW5hbWUgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKKwkgICAgICAgX19uLAorCSAgICAgICBfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSkKKwk6IF9CYXNlKF9fc3RyLCBfX3BvcywgX19uLCBfX3plcm8sIF9fb25lKSB7IH0KKworICAgICAgYml0c2V0KGNvbnN0IF9CYXNlJiBfX3gpIDogX0Jhc2UoX194KSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgYml0c2V0KGNvbnN0IF9DaGFyVCogX19zdHIsCisJICAgICAgIHR5cGVuYW1lIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVD46OnNpemVfdHlwZSBfX24KKwkgICAgICAgPSBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQ+OjpucG9zLAorCSAgICAgICBfQ2hhclQgX196ZXJvID0gX0NoYXJUKCcwJyksIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpKQorCTogX0Jhc2UoX19zdHIsIF9fbiwgX196ZXJvLCBfX29uZSkgeyB9CisjZW5kaWYKKworICAgICAgLy8gMjMuMy41LjIgYml0c2V0IG9wZXJhdGlvbnM6CisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIG9wZXJhdG9yJj0oY29uc3QgYml0c2V0PF9OYj4mIF9fcmhzKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCV9NX2Jhc2UoKSAmPSBfX3JoczsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgb3BlcmF0b3J8PShjb25zdCBiaXRzZXQ8X05iPiYgX19yaHMpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJX01fYmFzZSgpIHw9IF9fcmhzOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBvcGVyYXRvcl49KGNvbnN0IGJpdHNldDxfTmI+JiBfX3JocykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlfTV9iYXNlKCkgXj0gX19yaHM7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIG9wZXJhdG9yPDw9KHNpemVfdCBfX3BvcykgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlfTV9iYXNlKCkgPDw9IF9fcG9zOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBvcGVyYXRvcj4+PShzaXplX3QgX19wb3MpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisJX01fYmFzZSgpID4+PSBfX3BvczsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgc2V0KCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlfQmFzZTo6c2V0KCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAxODYuIGJpdHNldDo6c2V0KCkgc2Vjb25kIHBhcmFtZXRlciBzaG91bGQgYmUgYm9vbAorICAgICAgYml0c2V0PF9OYj4mCisgICAgICBzZXQoc2l6ZV90IF9fcG9zLCBib29sIF9fdmFsID0gdHJ1ZSkKKyAgICAgIHsKKwlfQmFzZTo6c2V0KF9fcG9zLCBfX3ZhbCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIHJlc2V0KCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKwlfQmFzZTo6cmVzZXQoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgcmVzZXQoc2l6ZV90IF9fcG9zKQorICAgICAgeworCV9CYXNlOjpyZXNldChfX3Bvcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPgorICAgICAgb3BlcmF0b3J+KCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGJpdHNldCh+X01fYmFzZSgpKTsgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIGZsaXAoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCV9CYXNlOjpmbGlwKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIGZsaXAoc2l6ZV90IF9fcG9zKQorICAgICAgeworCV9CYXNlOjpmbGlwKF9fcG9zKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vIGVsZW1lbnQgYWNjZXNzOgorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTEuIEJpdHNldCBtaW5vciBwcm9ibGVtcworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdCBfX3BvcykKKyAgICAgIHsKKwlyZXR1cm4gcmVmZXJlbmNlKF9NX2Jhc2UoKVtfX3Bvc10sIHRoaXMpOworICAgICAgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAxMS4gQml0c2V0IG1pbm9yIHByb2JsZW1zCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgICAgb3BlcmF0b3JbXShzaXplX3QgX19wb3MpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9CYXNlOjpvcGVyYXRvcltdKF9fcG9zKTsKKyAgICAgIH0KKworICAgICAgdXNpbmcgX0Jhc2U6OnRvX3Vsb25nOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHVzaW5nIF9CYXNlOjp0b191bGxvbmc7CisjZW5kaWYKKworICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgICBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKyAgICAgICAgdG9fc3RyaW5nKCkgY29uc3QKKyAgICAgICAgeyByZXR1cm4gX01fYmFzZSgpLnRlbXBsYXRlIHRvX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4oKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAzOTYuIHdoYXQgYXJlIGNoYXJhY3RlcnMgemVybyBhbmQgb25lLgorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisJc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisJdG9fc3RyaW5nKF9DaGFyVCBfX3plcm8sIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpKSBjb25zdAorCXsKKwkgIHJldHVybiBfTV9iYXNlKCkudGVtcGxhdGUKKwkgICAgdG9fc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPihfX3plcm8sIF9fb25lKTsKKwl9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQzNC4gYml0c2V0Ojp0b19zdHJpbmcoKSBoYXJkIHRvIHVzZS4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4KKyAgICAgICAgdG9fc3RyaW5nKCkgY29uc3QKKyAgICAgICAgeyByZXR1cm4gdG9fc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+KCk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gODUzLiB0b19zdHJpbmcgbmVlZHMgdXBkYXRpbmcgd2l0aCB6ZXJvIGFuZCBvbmUuCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisJc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4KKwl0b19zdHJpbmcoX0NoYXJUIF9femVybywgX0NoYXJUIF9fb25lID0gX0NoYXJUKCcxJykpIGNvbnN0CisJeyByZXR1cm4gdG9fc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywKKwkgICAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+KF9femVybywgX19vbmUpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICAgICAgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPgorICAgICAgICB0b19zdHJpbmcoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIHRvX3N0cmluZzxfQ2hhclQsIHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPigpOworICAgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVD4KKwlzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPiwKKwkgICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4KKwl0b19zdHJpbmcoX0NoYXJUIF9femVybywgX0NoYXJUIF9fb25lID0gX0NoYXJUKCcxJykpIGNvbnN0CisJeworCSAgcmV0dXJuIHRvX3N0cmluZzxfQ2hhclQsIHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPiwKKwkgICAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+KF9femVybywgX19vbmUpOworCX0KKworICAgICAgc3RkOjpiYXNpY19zdHJpbmc8Y2hhciwgc3RkOjpjaGFyX3RyYWl0czxjaGFyPiwgc3RkOjphbGxvY2F0b3I8Y2hhcj4gPgorICAgICAgdG9fc3RyaW5nKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gdG9fc3RyaW5nPGNoYXIsc3RkOjpjaGFyX3RyYWl0czxjaGFyPixzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+KCk7CisgICAgICB9CisKKyAgICAgIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4sIHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4KKyAgICAgIHRvX3N0cmluZyhjaGFyIF9femVybywgY2hhciBfX29uZSA9ICcxJykgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gdG9fc3RyaW5nPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4sCisJICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+KF9femVybywgX19vbmUpOworICAgICAgfQorCisgICAgICB1c2luZyBfQmFzZTo6Y291bnQ7CisgICAgICB1c2luZyBfQmFzZTo6c2l6ZTsKKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBiaXRzZXQ8X05iPiYgX19yaHMpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV9iYXNlKCkgPT0gX19yaHM7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBiaXRzZXQ8X05iPiYgX19yaHMpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBfTV9iYXNlKCkgIT0gX19yaHM7IH0KKworICAgICAgdXNpbmcgX0Jhc2U6OnRlc3Q7CisgICAgICB1c2luZyBfQmFzZTo6YWxsOworICAgICAgdXNpbmcgX0Jhc2U6OmFueTsKKyAgICAgIHVzaW5nIF9CYXNlOjpub25lOworCisgICAgICBiaXRzZXQ8X05iPgorICAgICAgb3BlcmF0b3I8PChzaXplX3QgX19wb3MpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBiaXRzZXQ8X05iPihfTV9iYXNlKCkgPDwgX19wb3MpOyB9CisKKyAgICAgIGJpdHNldDxfTmI+CisgICAgICBvcGVyYXRvcj4+KHNpemVfdCBfX3BvcykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGJpdHNldDxfTmI+KF9NX2Jhc2UoKSA+PiBfX3Bvcyk7IH0KKworICAgICAgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICBiaXRzZXQ8X05iPgorICAgIG9wZXJhdG9yJihjb25zdCBiaXRzZXQ8X05iPiYgX194LCBjb25zdCBiaXRzZXQ8X05iPiYgX195KSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIGJpdHNldDxfTmI+KF9feCkgJj0gX195OyB9CisKKyAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICBiaXRzZXQ8X05iPgorICAgIG9wZXJhdG9yfChjb25zdCBiaXRzZXQ8X05iPiYgX194LCBjb25zdCBiaXRzZXQ8X05iPiYgX195KSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIGJpdHNldDxfTmI+KF9feCkgfD0gX195OyB9CisKKyAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICBiaXRzZXQ8X05iPgorICAgIG9wZXJhdG9yXihjb25zdCBiaXRzZXQ8X05iPiYgX194LCBjb25zdCBiaXRzZXQ8X05iPiYgX195KSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIGJpdHNldDxfTmI+KF9feCkgXj0gX195OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCBzaXplX3QgX05iPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIGJpdHNldDxfTmI+JiBfX3gpCisgICAgeyByZXR1cm4gX19pcyA+PiBfX3guX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCBzaXplX3QgX05iPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGJpdHNldDxfTmI+JiBfX3gpCisgICAgeyByZXR1cm4gX19vcyA8PCBfX3guX01fYmFzZSgpOyB9Cit9IC8vIG5hbWVzcGFjZSBfX3Byb2ZpbGUKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgLy8gRFIgMTE4Mi4KKyAgLy8vIHN0ZDo6aGFzaCBzcGVjaWFsaXphdGlvbiBmb3IgYml0c2V0LgorICB0ZW1wbGF0ZTxzaXplX3QgX05iPgorICAgIHN0cnVjdCBoYXNoPF9fcHJvZmlsZTo6Yml0c2V0PF9OYj4+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBfX3Byb2ZpbGU6OmJpdHNldDxfTmI+PgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfX3Byb2ZpbGU6OmJpdHNldDxfTmI+JiBfX2IpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Omhhc2g8X0dMSUJDWFhfU1REX0M6OmJpdHNldDxfTmI+PigpKF9fYi5fTV9iYXNlKCkpOyB9CisgICAgfTsKKyNlbmRpZgorCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvZGVxdWUgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvZGVxdWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk4MjY4NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9kZXF1ZQpAQCAtMCwwICsxLDQ2NiBAQAorLy8gUHJvZmlsaW5nIGRlcXVlIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL2RlcXVlCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHByb2ZpbGUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfREVRVUUKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9ERVFVRSAxCisKKyNpbmNsdWRlIDxkZXF1ZT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19wcm9maWxlCit7CisgIC8vLyBDbGFzcyBzdGQ6OmRlcXVlIHdyYXBwZXIgd2l0aCBwZXJmb3JtYW5jZSBpbnN0cnVtZW50YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPF9UcD4gPgorICAgIGNsYXNzIGRlcXVlCisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6OmRlcXVlPF9UcCwgX0FsbG9jYXRvcj4KKyAgICB7CisgICAgICB0eXBlZGVmICBfR0xJQkNYWF9TVERfQzo6ZGVxdWU8X1RwLCBfQWxsb2NhdG9yPiBfQmFzZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlZmVyZW5jZSAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9yZWZlcmVuY2UgICAgICAgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmV2ZXJzZV9pdGVyYXRvciAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX1RwCQkJCSAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQWxsb2NhdG9yCQkJICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9wb2ludGVyICAgICAgICAgY29uc3RfcG9pbnRlcjsKKworICAgICAgLy8gMjMuMi4xLjEgY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICAgIGV4cGxpY2l0CisgICAgICBkZXF1ZShjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fYSkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBleHBsaWNpdAorICAgICAgZGVxdWUoc2l6ZV90eXBlIF9fbikKKyAgICAgIDogX0Jhc2UoX19uKSB7IH0KKworICAgICAgZGVxdWUoc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbHVlLAorCSAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX192YWx1ZSwgX19hKSB7IH0KKyNlbHNlCisgICAgICBleHBsaWNpdAorICAgICAgZGVxdWUoc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbHVlID0gX1RwKCksCisJICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX3ZhbHVlLCBfX2EpIHsgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyNlbmRpZgorICAgICAgICBkZXF1ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorCTogX0Jhc2UoX19maXJzdCwgX19sYXN0LCBfX2EpCisgICAgICAgIHsgfQorCisgICAgICBkZXF1ZShjb25zdCBkZXF1ZSYgX194KQorICAgICAgOiBfQmFzZShfX3gpIHsgfQorCisgICAgICBkZXF1ZShjb25zdCBfQmFzZSYgX194KQorICAgICAgOiBfQmFzZShfX3gpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgZGVxdWUoZGVxdWUmJiBfX3gpCisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3gpKQorICAgICAgeyB9CisKKyAgICAgIGRlcXVlKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLCBfX2EpIHsgfQorI2VuZGlmCisKKyAgICAgIH5kZXF1ZSgpIF9HTElCQ1hYX05PRVhDRVBUIHsgfQorCisgICAgICBkZXF1ZSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBkZXF1ZSYgX194KQorICAgICAgeworCSpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX194OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGRlcXVlJgorICAgICAgb3BlcmF0b3I9KGRlcXVlJiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5zd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBkZXF1ZSYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwkqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9fbDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICAgIHZvaWQKKyAgICAgICAgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgX0Jhc2U6OmFzc2lnbihfX2ZpcnN0LCBfX2xhc3QpOworCX0KKworICAgICAgdm9pZAorICAgICAgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX190KQorICAgICAgeworCV9CYXNlOjphc3NpZ24oX19uLCBfX3QpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgYXNzaWduKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCV9CYXNlOjphc3NpZ24oX19sKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB1c2luZyBfQmFzZTo6Z2V0X2FsbG9jYXRvcjsKKworICAgICAgLy8gaXRlcmF0b3JzOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorI2VuZGlmCisKKyAgICAgIC8vIDIzLjIuMS4yIGNhcGFjaXR5OgorICAgICAgdXNpbmcgX0Jhc2U6OnNpemU7CisgICAgICB1c2luZyBfQmFzZTo6bWF4X3NpemU7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3opCisgICAgICB7CisJX0Jhc2U6OnJlc2l6ZShfX3N6KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6LCBjb25zdCBfVHAmIF9fYykKKyAgICAgIHsKKwlfQmFzZTo6cmVzaXplKF9fc3osIF9fYyk7CisgICAgICB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6LCBfVHAgX19jID0gX1RwKCkpCisgICAgICB7CisJX0Jhc2U6OnJlc2l6ZShfX3N6LCBfX2MpOworICAgICAgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB1c2luZyBfQmFzZTo6c2hyaW5rX3RvX2ZpdDsKKyNlbmRpZgorCisgICAgICB1c2luZyBfQmFzZTo6ZW1wdHk7CisKKyAgICAgIC8vIGVsZW1lbnQgYWNjZXNzOgorICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pCisgICAgICB7CisJcmV0dXJuIF9NX2Jhc2UoKVtfX25dOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX01fYmFzZSgpW19fbl07CisgICAgICB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjphdDsKKworICAgICAgcmVmZXJlbmNlCisgICAgICBmcm9udCgpCisgICAgICB7CisJcmV0dXJuIF9CYXNlOjpmcm9udCgpOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGZyb250KCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX0Jhc2U6OmZyb250KCk7CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgYmFjaygpCisgICAgICB7CisJcmV0dXJuIF9CYXNlOjpiYWNrKCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgYmFjaygpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9CYXNlOjpiYWNrKCk7CisgICAgICB9CisKKyAgICAgIC8vIDIzLjIuMS4zIG1vZGlmaWVyczoKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfZnJvbnQoY29uc3QgX1RwJiBfX3gpCisgICAgICB7CisJX0Jhc2U6OnB1c2hfZnJvbnQoX194KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKGNvbnN0IF9UcCYgX194KQorICAgICAgeworCV9CYXNlOjpwdXNoX2JhY2soX194KTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfZnJvbnQoX1RwJiYgX194KQorICAgICAgeyBlbXBsYWNlX2Zyb250KHN0ZDo6bW92ZShfX3gpKTsgfQorCisgICAgICB2b2lkCisgICAgICBwdXNoX2JhY2soX1RwJiYgX194KQorICAgICAgeyBlbXBsYWNlX2JhY2soc3RkOjptb3ZlKF9feCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGVtcGxhY2VfZnJvbnQoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgX0Jhc2U6OmVtcGxhY2VfZnJvbnQoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGVtcGxhY2VfYmFjayhfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBfQmFzZTo6ZW1wbGFjZV9iYWNrKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgZW1wbGFjZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6ZW1wbGFjZShfX3Bvc2l0aW9uLAorCQkJCQkgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIHJldHVybiBpdGVyYXRvcihfX3Jlcyk7CisJfQorI2VuZGlmCisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgX1RwJiBfX3gpCisgICAgICB7CisJdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLCBfX3gpOworCXJldHVybiBpdGVyYXRvcihfX3Jlcyk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9UcCYmIF9feCkKKyAgICAgIHsgcmV0dXJuIGVtcGxhY2UoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3AsIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCV9CYXNlOjppbnNlcnQoX19wLCBfX2wpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9feCkKKyAgICAgIHsKKwlfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24sIF9fbiwgX194KTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sCisJICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLCBfX2ZpcnN0LCBfX2xhc3QpOworCX0KKworICAgICAgdm9pZAorICAgICAgcG9wX2Zyb250KCkKKyAgICAgIHsKKwlfQmFzZTo6cG9wX2Zyb250KCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHBvcF9iYWNrKCkKKyAgICAgIHsKKwlfQmFzZTo6cG9wX2JhY2soKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJaWYgKF9fcG9zaXRpb24gPT0gYmVnaW4oKSB8fCBfX3Bvc2l0aW9uID09IGVuZCgpLTEpCisJICB7CisJICAgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbikpOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24pOworCSAgICByZXR1cm4gaXRlcmF0b3IoX19yZXMpOworCSAgfQorICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAxNTEuIGNhbid0IGN1cnJlbnRseSBjbGVhcigpIGVtcHR5IGNvbnRhaW5lcgorICAgICAgICByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fZmlyc3QsIF9fbGFzdCkpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKGRlcXVlJiBfX3gpCisgICAgICB7CisJX0Jhc2U6OnN3YXAoX194KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworCV9CYXNlOjpjbGVhcigpOworICAgICAgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBfR0xJQkNYWF9OT0VYQ0VQVCAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVCB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID09IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSAhPSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDw9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsIGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX3Byb2ZpbGUKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9mb3J3YXJkX2xpc3QgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvZm9yd2FyZF9saXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZTA0ODMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvZm9yd2FyZF9saXN0CkBAIC0wLDAgKzEsMTgyIEBACisvLyA8Zm9yd2FyZF9saXN0PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9mb3J3YXJkX2xpc3QKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfRk9SV0FSRF9MSVNUCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfRk9SV0FSRF9MSVNUIDEKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxmb3J3YXJkX2xpc3Q+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fcHJvZmlsZQoreworICAvLy8gQ2xhc3Mgc3RkOjpmb3J3YXJkX2xpc3Qgd3JhcHBlciB3aXRoIHBlcmZvcm1hbmNlIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyBmb3J3YXJkX2xpc3QKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQzo6Zm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6OmZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4gX0Jhc2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2FsbG9jX3RyYWl0czxfQWxsb2M+Ojp0ZW1wbGF0ZQorICAgICAgICByZWJpbmQ8X0dMSUJDWFhfU1REX0M6Ol9Gd2RfbGlzdF9ub2RlPF9UcD4+OjpvdGhlciBfTm9kZV9hbGxvY190eXBlOworCisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6X19hbGxvY190cmFpdHM8X05vZGVfYWxsb2NfdHlwZT4gX05vZGVfYWxsb2NfdHJhaXRzOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgICAgICAgIHNpemVfdHlwZTsKKworICAgICAgLy8gMjMuMi4zLjEgY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICAgIGV4cGxpY2l0CisgICAgICBmb3J3YXJkX2xpc3QoY29uc3QgX0FsbG9jJiBfX2FsID0gX0FsbG9jKCkpCisgICAgICA6IF9CYXNlKF9fYWwpIHsgfQorCisgICAgICBmb3J3YXJkX2xpc3QoY29uc3QgZm9yd2FyZF9saXN0JiBfX2xpc3QsIGNvbnN0IF9BbGxvYyYgX19hbCkKKyAgICAgIDogX0Jhc2UoX19saXN0LCBfX2FsKQorICAgICAgeyB9CisKKyAgICAgIGZvcndhcmRfbGlzdChmb3J3YXJkX2xpc3QmJiBfX2xpc3QsIGNvbnN0IF9BbGxvYyYgX19hbCkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9fbGlzdCksIF9fYWwpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGZvcndhcmRfbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCBfQWxsb2MmIF9fYWwgPSBfQWxsb2MoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2FsKQorICAgICAgeyB9CisKKyAgICAgIGZvcndhcmRfbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgX0FsbG9jJiBfX2FsID0gX0FsbG9jKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX192YWx1ZSwgX19hbCkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyAgICAgICAgZm9yd2FyZF9saXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9BbGxvYyYgX19hbCA9IF9BbGxvYygpKQorICAgICAgICA6IF9CYXNlKF9fZmlyc3QsIF9fbGFzdCwgX19hbCkKKyAgICAgICAgeyB9CisKKyAgICAgIGZvcndhcmRfbGlzdChjb25zdCBmb3J3YXJkX2xpc3QmIF9fbGlzdCkKKyAgICAgIDogX0Jhc2UoX19saXN0KQorICAgICAgeyB9CisKKyAgICAgIGZvcndhcmRfbGlzdChmb3J3YXJkX2xpc3QmJiBfX2xpc3QpIG5vZXhjZXB0CisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX2xpc3QpKSB7IH0KKworICAgICAgZm9yd2FyZF9saXN0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9faWwsCisgICAgICAgICAgICAgICAgICAgY29uc3QgX0FsbG9jJiBfX2FsID0gX0FsbG9jKCkpCisgICAgICA6IF9CYXNlKF9faWwsIF9fYWwpCisgICAgICB7IH0KKworICAgICAgfmZvcndhcmRfbGlzdCgpIG5vZXhjZXB0CisgICAgICB7IH0KKworICAgICAgZm9yd2FyZF9saXN0JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IGZvcndhcmRfbGlzdCYgX19saXN0KQorICAgICAgeworCXN0YXRpY19jYXN0PF9CYXNlJj4oKnRoaXMpID0gX19saXN0OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgZm9yd2FyZF9saXN0JgorICAgICAgb3BlcmF0b3I9KGZvcndhcmRfbGlzdCYmIF9fbGlzdCkKKyAgICAgIG5vZXhjZXB0KF9Ob2RlX2FsbG9jX3RyYWl0czo6X1Nfbm90aHJvd19tb3ZlKCkpCisgICAgICB7CisJc3RhdGljX2Nhc3Q8X0Jhc2UmPigqdGhpcykgPSBzdGQ6Om1vdmUoX19saXN0KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGZvcndhcmRfbGlzdCYKKyAgICAgIG9wZXJhdG9yPShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2lsKQorICAgICAgeworCXN0YXRpY19jYXN0PF9CYXNlJj4oKnRoaXMpID0gX19pbDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBub2V4Y2VwdCAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgcmV0dXJuIF9fbHguX01fYmFzZSgpID09IF9fbHkuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IHJldHVybiBfX2x4Ll9NX2Jhc2UoKSA8IF9fbHkuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgcmV0dXJuICEoX19seCA9PSBfX2x5KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IHJldHVybiAoX19seSA8IF9fbHgpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHkpCisgICAgeyByZXR1cm4gIShfX2x4IDwgX19seSk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x4LAorICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IHJldHVybiAhKF9fbHkgPCBfX2x4KTsgfQorCisgIC8vLyBTZWUgc3RkOjpmb3J3YXJkX2xpc3Q6OnN3YXAoKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisJIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHkpCisgICAgeyBfX2x4LnN3YXAoX19seSk7IH0KKworfSAvLyBuYW1lc3BhY2UgX19wcm9maWxlCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8vIEMrKzExCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXIuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxYmI2NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyLmgKQEAgLTAsMCArMSw0MDUgQEAKKy8vIC0qLSBDKysgLSotCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisvLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9pbXBsL3Byb2ZpbGVyLmgKKyAqICBAYnJpZWYgSW50ZXJmYWNlIG9mIHRoZSBwcm9maWxpbmcgcnVudGltZSBsaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgTGl4aWEgTGl1IGFuZCBTaWx2aXVzIFJ1cy4KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9IIDEKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKKy8vIE1lY2hhbmlzbSB0byBkZWZpbmUgZGF0YSB3aXRoIGlubGluZSBsaW5rYWdlLgorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9VTklOSVRfREFUQShfX3R5cGUsIF9fbmFtZSkgICAgICAgICAgICAgXAorICBpbmxpbmUgX190eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2dldF8jI19fbmFtZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBfX3R5cGUgX19uYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBfX25hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX190eXBlLCBfX25hbWUsIF9faW5pdGlhbF92YWx1ZS4uLikgXAorICBpbmxpbmUgX190eXBlJiBfX2dldF8jI19fbmFtZSgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgX190eXBlIF9fbmFtZShfX2luaXRpYWxfdmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIF9fbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX25hbWUpIFwKKyAgX19nZXRfIyNfX25hbWUoKQorCituYW1lc3BhY2UgX19nbnVfcHJvZmlsZQoreworICAvKiogQGJyaWVmIFJlZW50cmFuY2UgZ3VhcmQuCisgICAqCisgICAqIE1lY2hhbmlzbSB0byBwcm90ZWN0IGFsbCBfX2dudV9wcm9maWxlIG9wZXJhdGlvbnMgYWdhaW5zdCByZWN1cnNpb24sCisgICAqIG11bHRpdGhyZWFkZWQgYW5kIGV4Y2VwdGlvbiByZWVudHJhbmNlLgorICAgKi8KKyAgc3RydWN0IF9fcmVlbnRyYW5jZV9ndWFyZAorICB7CisgICAgc3RhdGljIGJvb2wKKyAgICBfX2dldF9pbigpCisgICAgeworICAgICAgaWYgKF9faW5zaWRlKCkgPT0gdHJ1ZSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBlbHNlCisJeworCSAgX19pbnNpZGUoKSA9IHRydWU7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgfQorCisgICAgc3RhdGljIGJvb2wmCisgICAgX19pbnNpZGUoKQorICAgIHsKKyAgICAgIHN0YXRpYyBfX3RocmVhZCBib29sIF9TX2luc2lkZShmYWxzZSk7CisgICAgICByZXR1cm4gX1NfaW5zaWRlOworICAgIH0KKworICAgIF9fcmVlbnRyYW5jZV9ndWFyZCgpIHsgfQorICAgIH5fX3JlZW50cmFuY2VfZ3VhcmQoKSB7IF9faW5zaWRlKCkgPSBmYWxzZTsgfQorICB9OworCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRChfX3guLi4pCSAgICAgIAlcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChfX2dudV9wcm9maWxlOjpfX3JlZW50cmFuY2VfZ3VhcmQ6Ol9fZ2V0X2luKCkpICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3JlZW50cmFuY2VfZ3VhcmQgX19nZXRfb3V0OyAJCVwKKyAgICAgIF9feDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyAgLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zLgorICAvLyBEb24ndCB1c2UgYW55IF9fZ251X3Byb2ZpbGU6OiBpbiB1c2VyIGNvZGUuCisgIC8vIEluc3RlYWQsIHVzZSB0aGUgX19wcm9mY3h4Li4uIG1hY3Jvcywgd2hpY2ggb2ZmZXIgZ3VhcmRlZCBhY2Nlc3MuCisgIGJvb2wgX190dXJuX29uKCk7CisgIGJvb2wgX190dXJuX29mZigpOworICBib29sIF9faXNfaW52YWxpZCgpOworICBib29sIF9faXNfb24oKTsKKyAgYm9vbCBfX2lzX29mZigpOworICB2b2lkIF9fcmVwb3J0KHZvaWQpOworICB2b2lkIF9fdHJhY2VfaGFzaHRhYmxlX3NpemVfcmVzaXplKGNvbnN0IHZvaWQqLCBzdGQ6OnNpemVfdCwgc3RkOjpzaXplX3QpOworICB2b2lkIF9fdHJhY2VfaGFzaHRhYmxlX3NpemVfZGVzdHJ1Y3QoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90LCBzdGQ6OnNpemVfdCk7CisgIHZvaWQgX190cmFjZV9oYXNodGFibGVfc2l6ZV9jb25zdHJ1Y3QoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX3ZlY3Rvcl9zaXplX3Jlc2l6ZShjb25zdCB2b2lkKiwgc3RkOjpzaXplX3QsIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX3ZlY3Rvcl9zaXplX2Rlc3RydWN0KGNvbnN0IHZvaWQqLCBzdGQ6OnNpemVfdCwgc3RkOjpzaXplX3QpOworICB2b2lkIF9fdHJhY2VfdmVjdG9yX3NpemVfY29uc3RydWN0KGNvbnN0IHZvaWQqLCBzdGQ6OnNpemVfdCk7CisgIHZvaWQgX190cmFjZV9oYXNoX2Z1bmNfZGVzdHJ1Y3QoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90LCBzdGQ6OnNpemVfdCwKKwkJCQkgIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX2hhc2hfZnVuY19jb25zdHJ1Y3QoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfZGVzdHJ1Y3QoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfY29uc3RydWN0KGNvbnN0IHZvaWQqKTsKKyAgdm9pZCBfX3RyYWNlX3ZlY3Rvcl90b19saXN0X2luc2VydChjb25zdCB2b2lkKiwgc3RkOjpzaXplX3QsIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX3ZlY3Rvcl90b19saXN0X2l0ZXJhdGUoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX3ZlY3Rvcl90b19saXN0X2ludmFsaWRfb3BlcmF0b3IoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfcmVzaXplKGNvbnN0IHZvaWQqLCBzdGQ6OnNpemVfdCwgc3RkOjpzaXplX3QpOworICB2b2lkIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfZmluZChjb25zdCB2b2lkKiwgc3RkOjpzaXplX3QpOworCisgIHZvaWQgX190cmFjZV9saXN0X3RvX3NsaXN0X2Rlc3RydWN0KGNvbnN0IHZvaWQqKTsKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fc2xpc3RfY29uc3RydWN0KGNvbnN0IHZvaWQqKTsKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fc2xpc3RfcmV3aW5kKGNvbnN0IHZvaWQqKTsKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fc2xpc3Rfb3BlcmF0aW9uKGNvbnN0IHZvaWQqKTsKKworICB2b2lkIF9fdHJhY2VfbGlzdF90b192ZWN0b3JfZGVzdHJ1Y3QoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfbGlzdF90b192ZWN0b3JfY29uc3RydWN0KGNvbnN0IHZvaWQqKTsKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2luc2VydChjb25zdCB2b2lkKiwgc3RkOjpzaXplX3QsIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2l0ZXJhdGUoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2ludmFsaWRfb3BlcmF0b3IoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfbGlzdF90b192ZWN0b3JfcmVzaXplKGNvbnN0IHZvaWQqLCBzdGQ6OnNpemVfdCwgc3RkOjpzaXplX3QpOworCisgIHZvaWQgX190cmFjZV9saXN0X3RvX3NldF9kZXN0cnVjdChjb25zdCB2b2lkKik7CisgIHZvaWQgX190cmFjZV9saXN0X3RvX3NldF9jb25zdHJ1Y3QoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfbGlzdF90b19zZXRfaW5zZXJ0KGNvbnN0IHZvaWQqLCBzdGQ6OnNpemVfdCwgc3RkOjpzaXplX3QpOyAKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fc2V0X2l0ZXJhdGUoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fc2V0X2ludmFsaWRfb3BlcmF0b3IoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfbGlzdF90b19zZXRfZmluZChjb25zdCB2b2lkKiwgc3RkOjpzaXplX3QpOyAKKworICB2b2lkIF9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfY29uc3RydWN0KGNvbnN0IHZvaWQqKTsKKyAgdm9pZCBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW5zZXJ0KGNvbnN0IHZvaWQqLCBzdGQ6OnNpemVfdCwKKwkJCQkJICAgc3RkOjpzaXplX3QpOworICB2b2lkIF9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZXJhc2UoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90LAorCQkJCQkgIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2l0ZXJhdGUoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2ZpbmQoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2Rlc3RydWN0KGNvbnN0IHZvaWQqKTsKK30gLy8gbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKworLy8gTWFzdGVyIHN3aXRjaCB0dXJucyBvbiBhbGwgZGlhZ25vc3RpY3MgdGhhdCBhcmUgbm90IGV4cGxpY2l0bHkgdHVybmVkIG9mZi4KKyNpZmRlZiBfR0xJQkNYWF9QUk9GSUxFCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfTk9fSEFTSFRBQkxFX1RPT19TTUFMTAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX0hBU0hUQUJMRV9UT09fU01BTEwKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX05PX0hBU0hUQUJMRV9UT09fTEFSR0UKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9IQVNIVEFCTEVfVE9PX0xBUkdFCisjZW5kaWYKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9OT19WRUNUT1JfVE9PX1NNQUxMCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfVkVDVE9SX1RPT19TTUFMTAorI2VuZGlmCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfTk9fVkVDVE9SX1RPT19MQVJHRQorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1ZFQ1RPUl9UT09fTEFSR0UKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX05PX0lORUZGSUNJRU5UX0hBU0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9JTkVGRklDSUVOVF9IQVNICisjZW5kaWYKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9OT19WRUNUT1JfVE9fTElTVAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1ZFQ1RPUl9UT19MSVNUCisjZW5kaWYKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9OT19MSVNUX1RPX1NMSVNUCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfTElTVF9UT19TTElTVAorI2VuZGlmCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfTk9fTElTVF9UT19WRUNUT1IKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9MSVNUX1RPX1ZFQ1RPUgorI2VuZGlmCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfTk9fTUFQX1RPX1VOT1JERVJFRF9NQVAKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9NQVBfVE9fVU5PUkRFUkVEX01BUAorI2VuZGlmCisjZW5kaWYKKworLy8gRXhwb3NlIGdsb2JhbCBtYW5hZ2VtZW50IHJvdXRpbmVzIHRvIHVzZXIgY29kZS4KKyNpZmRlZiBfR0xJQkNYWF9QUk9GSUxFCisjZGVmaW5lIF9fcHJvZmN4eF9yZXBvcnQoKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRChfX2dudV9wcm9maWxlOjpfX3JlcG9ydCgpKQorI2RlZmluZSBfX3Byb2ZjeHhfdHVybl9vbigpIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKF9fZ251X3Byb2ZpbGU6Ol9fdHVybl9vbigpKQorI2RlZmluZSBfX3Byb2ZjeHhfdHVybl9vZmYoKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRChfX2dudV9wcm9maWxlOjpfX3R1cm5fb2ZmKCkpCisjZGVmaW5lIF9fcHJvZmN4eF9pc19pbnZhbGlkKCkgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoX19nbnVfcHJvZmlsZTo6X19pc19pbnZhbGlkKCkpCisjZGVmaW5lIF9fcHJvZmN4eF9pc19vbigpIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKF9fZ251X3Byb2ZpbGU6Ol9faXNfb24oKSkKKyNkZWZpbmUgX19wcm9mY3h4X2lzX29mZigpIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKF9fZ251X3Byb2ZpbGU6Ol9faXNfb2ZmKCkpCisjZWxzZQorI2RlZmluZSBfX3Byb2ZjeHhfcmVwb3J0KCkKKyNkZWZpbmUgX19wcm9mY3h4X3R1cm5fb24oKQorI2RlZmluZSBfX3Byb2ZjeHhfdHVybl9vZmYoKQorI2RlZmluZSBfX3Byb2ZjeHhfaXNfaW52YWxpZCgpCisjZGVmaW5lIF9fcHJvZmN4eF9pc19vbigpCisjZGVmaW5lIF9fcHJvZmN4eF9pc19vZmYoKQorI2VuZGlmCisKKy8vIFR1cm4gb24vb2ZmIGluc3RydW1lbnRhdGlvbiBmb3IgSEFTSFRBQkxFX1RPT19TTUFMTCBhbmQgSEFTSFRBQkxFX1RPT19MQVJHRS4KKyNpZiAoZGVmaW5lZChfR0xJQkNYWF9QUk9GSUxFX0hBU0hUQUJMRV9UT09fU01BTEwpIFwKKyAgICAgfHwgZGVmaW5lZChfR0xJQkNYWF9QUk9GSUxFX0hBU0hUQUJMRV9UT09fTEFSR0UpKQorI2RlZmluZSBfX3Byb2ZjeHhfaGFzaHRhYmxlX3Jlc2l6ZShfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX2hhc2h0YWJsZV9zaXplX3Jlc2l6ZShfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfaGFzaHRhYmxlX2Rlc3RydWN0KF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfaGFzaHRhYmxlX3NpemVfZGVzdHJ1Y3QoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X2hhc2h0YWJsZV9jb25zdHJ1Y3QoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV9oYXNodGFibGVfc2l6ZV9jb25zdHJ1Y3QoX194KSkKKyNlbHNlCisjZGVmaW5lIF9fcHJvZmN4eF9oYXNodGFibGVfcmVzaXplKF9feC4uLikgIAorI2RlZmluZSBfX3Byb2ZjeHhfaGFzaHRhYmxlX2Rlc3RydWN0KF9feC4uLikgCisjZGVmaW5lIF9fcHJvZmN4eF9oYXNodGFibGVfY29uc3RydWN0KF9feC4uLikgIAorI2VuZGlmCisKKy8vIFR1cm4gb24vb2ZmIGluc3RydW1lbnRhdGlvbiBmb3IgVkVDVE9SX1RPT19TTUFMTCBhbmQgVkVDVE9SX1RPT19MQVJHRS4KKyNpZiAoZGVmaW5lZChfR0xJQkNYWF9QUk9GSUxFX1ZFQ1RPUl9UT09fU01BTEwpIFwKKyAgICAgfHwgZGVmaW5lZChfR0xJQkNYWF9QUk9GSUxFX1ZFQ1RPUl9UT09fTEFSR0UpKQorI2RlZmluZSBfX3Byb2ZjeHhfdmVjdG9yX3Jlc2l6ZShfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX3ZlY3Rvcl9zaXplX3Jlc2l6ZShfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfdmVjdG9yX2Rlc3RydWN0KF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfdmVjdG9yX3NpemVfZGVzdHJ1Y3QoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X3ZlY3Rvcl9jb25zdHJ1Y3QoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV92ZWN0b3Jfc2l6ZV9jb25zdHJ1Y3QoX194KSkKKyNlbHNlCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfcmVzaXplKF9feC4uLikgIAorI2RlZmluZSBfX3Byb2ZjeHhfdmVjdG9yX2Rlc3RydWN0KF9feC4uLikgCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0KF9feC4uLikgIAorI2VuZGlmIAorCisvLyBUdXJuIG9uL29mZiBpbnN0cnVtZW50YXRpb24gZm9yIElORUZGSUNJRU5UX0hBU0guCisjaWYgZGVmaW5lZChfR0xJQkNYWF9QUk9GSUxFX0lORUZGSUNJRU5UX0hBU0gpCisjZGVmaW5lIF9fcHJvZmN4eF9pbmVmZmljaWVudF9oYXNoX2lzX29uKCkgXAorICBfX2dudV9wcm9maWxlOjpfX2lzX29uKCkKKyNkZWZpbmUgX19wcm9mY3h4X2hhc2h0YWJsZV9jb25zdHJ1Y3QyKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfaGFzaF9mdW5jX2NvbnN0cnVjdChfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfaGFzaHRhYmxlX2Rlc3RydWN0MihfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX2hhc2hfZnVuY19kZXN0cnVjdChfX3gpKQorI2Vsc2UKKyNkZWZpbmUgX19wcm9mY3h4X2luZWZmaWNpZW50X2hhc2hfaXNfb24oKSBmYWxzZQorI2RlZmluZSBfX3Byb2ZjeHhfaGFzaHRhYmxlX2Rlc3RydWN0MihfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF9oYXNodGFibGVfY29uc3RydWN0MihfX3guLi4pCisjZW5kaWYKKworLy8gVHVybiBvbi9vZmYgaW5zdHJ1bWVudGF0aW9uIGZvciBWRUNUT1JfVE9fTElTVC4KKyNpZiBkZWZpbmVkKF9HTElCQ1hYX1BST0ZJTEVfVkVDVE9SX1RPX0xJU1QpCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0MihfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX3ZlY3Rvcl90b19saXN0X2NvbnN0cnVjdChfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfdmVjdG9yX2Rlc3RydWN0MihfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX3ZlY3Rvcl90b19saXN0X2Rlc3RydWN0KF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfaW5zZXJ0KF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfaW5zZXJ0KF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfaXRlcmF0ZShfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX3ZlY3Rvcl90b19saXN0X2l0ZXJhdGUoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X3ZlY3Rvcl9pbnZhbGlkX29wZXJhdG9yKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfaW52YWxpZF9vcGVyYXRvcihfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfdmVjdG9yX3Jlc2l6ZTIoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV92ZWN0b3JfdG9fbGlzdF9yZXNpemUoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X3ZlY3Rvcl9maW5kKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfZmluZChfX3gpKQorI2Vsc2UKKyNkZWZpbmUgX19wcm9mY3h4X3ZlY3Rvcl9kZXN0cnVjdDIoX194Li4uKQorI2RlZmluZSBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdDIoX194Li4uKQorI2RlZmluZSBfX3Byb2ZjeHhfdmVjdG9yX2luc2VydChfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfaXRlcmF0ZShfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfaW52YWxpZF9vcGVyYXRvcihfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfcmVzaXplMihfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfZmluZChfX3guLi4pCisjZW5kaWYKKworLy8gVHVybiBvbi9vZmYgaW5zdHJ1bWVudGF0aW9uIGZvciBMSVNUX1RPX1ZFQ1RPUi4gCisjaWYgZGVmaW5lZChfR0xJQkNYWF9QUk9GSUxFX0xJU1RfVE9fVkVDVE9SKQorI2RlZmluZSBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QyKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfbGlzdF90b192ZWN0b3JfY29uc3RydWN0KF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X2Rlc3RydWN0MihfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2Rlc3RydWN0KF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X2luc2VydChfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2luc2VydChfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfbGlzdF9pdGVyYXRlKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfbGlzdF90b192ZWN0b3JfaXRlcmF0ZShfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfbGlzdF9pbnZhbGlkX29wZXJhdG9yKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfbGlzdF90b192ZWN0b3JfaW52YWxpZF9vcGVyYXRvcihfX3gpKQorI2Vsc2UKKyNkZWZpbmUgX19wcm9mY3h4X2xpc3RfZGVzdHJ1Y3QyKF9feC4uLikKKyNkZWZpbmUgX19wcm9mY3h4X2xpc3RfY29uc3RydWN0MihfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X2luc2VydChfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X2l0ZXJhdGUoX194Li4uKQorI2RlZmluZSBfX3Byb2ZjeHhfbGlzdF9pbnZhbGlkX29wZXJhdG9yKF9feC4uLikKKyNlbmRpZgorCisvLyBUdXJuIG9uL29mZiBpbnN0cnVtZW50YXRpb24gZm9yIExJU1RfVE9fU0xJU1QuICAKKyNpZiBkZWZpbmVkKF9HTElCQ1hYX1BST0ZJTEVfTElTVF9UT19TTElTVCkKKyNkZWZpbmUgX19wcm9mY3h4X2xpc3RfcmV3aW5kKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfbGlzdF90b19zbGlzdF9yZXdpbmQoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X2xpc3Rfb3BlcmF0aW9uKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfbGlzdF90b19zbGlzdF9vcGVyYXRpb24oX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X2xpc3RfZGVzdHJ1Y3QoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV9saXN0X3RvX3NsaXN0X2Rlc3RydWN0KF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdChfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX2xpc3RfdG9fc2xpc3RfY29uc3RydWN0KF9feCkpCisjZWxzZQorI2RlZmluZSBfX3Byb2ZjeHhfbGlzdF9yZXdpbmQoX194Li4uKSAgCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X29wZXJhdGlvbihfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X2Rlc3RydWN0KF9feC4uLikgCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdChfX3guLi4pICAKKyNlbmRpZiAKKworLy8gVHVybiBvbi9vZmYgaW5zdHJ1bWVudGF0aW9uIGZvciBNQVBfVE9fVU5PUkRFUkVEX01BUC4KKyNpZiBkZWZpbmVkKF9HTElCQ1hYX1BST0ZJTEVfTUFQX1RPX1VOT1JERVJFRF9NQVApCisjZGVmaW5lIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9jb25zdHJ1Y3QoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9jb25zdHJ1Y3QoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2Rlc3RydWN0KF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZGVzdHJ1Y3QoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2luc2VydChfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2luc2VydChfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZXJhc2UoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9lcmFzZShfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaXRlcmF0ZShfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2l0ZXJhdGUoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9maW5kKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZmluZChfX3gpKQorI2Vsc2UKKyNkZWZpbmUgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2NvbnN0cnVjdChfX3guLi4pIFwKKyAgCisjZGVmaW5lIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9kZXN0cnVjdChfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnNlcnQoX194Li4uKQorI2RlZmluZSBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZXJhc2UoX194Li4uKQorI2RlZmluZSBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaXRlcmF0ZShfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKF9feC4uLikKKyNkZWZpbmUgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ZpbmQoX194Li4uKQorI2VuZGlmCisKKy8vIFNldCBkZWZhdWx0IHZhbHVlcyBmb3IgY29tcGlsZS10aW1lIGN1c3RvbWl6YWJsZSB2YXJpYWJsZXMuCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfVFJBQ0VfUEFUSF9ST09UCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfVFJBQ0VfUEFUSF9ST09UICJsaWJzdGRjeHgtcHJvZmlsZSIKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX1RSQUNFX0VOVl9WQVIKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9UUkFDRV9FTlZfVkFSICJfR0xJQkNYWF9QUk9GSUxFX1RSQUNFX1BBVEhfUk9PVCIKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX01BWF9XQVJOX0NPVU5UX0VOVl9WQVIKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9NQVhfV0FSTl9DT1VOVF9FTlZfVkFSIFwKKyAgIl9HTElCQ1hYX1BST0ZJTEVfTUFYX1dBUk5fQ09VTlQiCisjZW5kaWYKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9NQVhfV0FSTl9DT1VOVAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX01BWF9XQVJOX0NPVU5UIDEwCisjZW5kaWYKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9NQVhfU1RBQ0tfREVQVEgKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9NQVhfU1RBQ0tfREVQVEggMzIKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX01BWF9TVEFDS19ERVBUSF9FTlZfVkFSCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfTUFYX1NUQUNLX0RFUFRIX0VOVl9WQVIgXAorICAiX0dMSUJDWFhfUFJPRklMRV9NQVhfU1RBQ0tfREVQVEgiCisjZW5kaWYKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9NRU1fUEVSX0RJQUdOT1NUSUMKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9NRU1fUEVSX0RJQUdOT1NUSUMgKDEgPDwgMjgpCisjZW5kaWYKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9NRU1fUEVSX0RJQUdOT1NUSUNfRU5WX1ZBUgorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX01FTV9QRVJfRElBR05PU1RJQ19FTlZfVkFSIFwKKyAgIl9HTElCQ1hYX1BST0ZJTEVfTUVNX1BFUl9ESUFHTk9TVElDIgorI2VuZGlmCisKKy8vIEluc3RydW1lbnRhdGlvbiBob29rIGltcGxlbWVudGF0aW9ucy4KKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfaGFzaF9mdW5jLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2hhc2h0YWJsZV9zaXplLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX21hcF90b191bm9yZGVyZWRfbWFwLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3ZlY3Rvcl9zaXplLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3ZlY3Rvcl90b19saXN0LmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2xpc3RfdG9fc2xpc3QuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfbGlzdF90b192ZWN0b3IuaCIKKworI2VuZGlmIC8vIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfYWxnb3MuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2FsZ29zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBkYjI1MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2FsZ29zLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8vIC0qLSBDKysgLSotCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisvLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2FsZ29zLmgKKyAqICBAYnJpZWYgQWxnb3JpdGhtcyB1c2VkIGJ5IHRoZSBwcm9maWxlIGV4dGVuc2lvbi4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIG5lZWRlZCB0byBhdm9pZCBpbmNsdWRpbmcgXDxhbGdvcml0aG1cPiBvciBcPGJpdHMvc3RsX2FsZ28uaFw+LgorICogIEluY2x1ZGluZyB0aG9zZSBmaWxlcyB3b3VsZCByZXN1bHQgaW4gcmVjdXJzaXZlIGluY2x1ZGVzLgorICogIFRoZXNlIGltcGxlbWVudGF0aW9ucyBhcmUgb3ZlcnNpbXBsaWZpZWQuICBJbiBnZW5lcmFsLCBlZmZpY2llbmN5IG1heSBiZQorICogIHNhY3JpZmljZWQgdG8gbWluaW1pemUgbWFpbnRlbmFuY2Ugb3ZlcmhlYWQuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX0FMR09TX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9BTEdPU19IIDEKKworbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKK3sKKyAgLyogSGVscGVyIGZvciBfX3RvcF9uLiAgSW5zZXJ0IGluIHNvcnRlZCB2ZWN0b3IsIGJ1dCBub3QgYmV5b25kIE50aCBlbGVtLiAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICB2b2lkCisgICAgX19pbnNlcnRfdG9wX24oX0NvbnRhaW5lciYgX19vdXRwdXQsCisJCSAgIGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsdWUsCisJCSAgIHR5cGVuYW1lIF9Db250YWluZXI6OnNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgX19pdCA9IF9fb3V0cHV0LmJlZ2luKCk7CisgICAgICB0eXBlbmFtZSBfQ29udGFpbmVyOjpzaXplX3R5cGUgX19jb3VudCA9IDA7CisKKyAgICAgIC8vIFNraXAgdXAgdG8gTiAtIDEgZWxlbWVudHMgbGFyZ2VyIHRoYW4gVkFMVUUuCisgICAgICAvLyBYWFg6IENvdWxkIGRvIGJpbmFyeSBzZWFyY2ggZm9yIHJhbmRvbSBpdGVyYXRvcnMuCisgICAgICB3aGlsZSAodHJ1ZSkKKwl7CisJICBpZiAoX19jb3VudCA+PSBfX24pCisJICAgIC8vIFZBTFVFIGlzIG5vdCBpbiB0b3AgTi4KKwkgICAgcmV0dXJuOworCisJICBpZiAoX19pdCA9PSBfX291dHB1dC5lbmQoKSkKKwkgICAgYnJlYWs7CisKKwkgIGlmICgqX19pdCA8IF9fdmFsdWUpCisJICAgIGJyZWFrOworCisJICArK19faXQ7CisJICArK19fY291bnQ7CisJfQorCisgICAgICBfX291dHB1dC5pbnNlcnQoX19pdCwgX192YWx1ZSk7CisgICAgfQorCisgIC8qIENvcHkgdGhlIHRvcCBOIGVsZW1lbnRzIGluIElOUFVULCBzb3J0ZWQgaW4gcmV2ZXJzZSBvcmRlciwgdG8gT1VUUFVULiAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICB2b2lkCisgICAgX190b3Bfbihjb25zdCBfQ29udGFpbmVyJiBfX2lucHV0LCBfQ29udGFpbmVyJiBfX291dHB1dCwKKwkgICAgdHlwZW5hbWUgX0NvbnRhaW5lcjo6c2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfX291dHB1dC5jbGVhcigpOworICAgICAgdHlwZW5hbWUgX0NvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgX19pdDsKKyAgICAgIGZvciAoX19pdCA9IF9faW5wdXQuYmVnaW4oKTsgX19pdCAhPSBfX2lucHV0LmVuZCgpOyArK19faXQpCisJX19pbnNlcnRfdG9wX24oX19vdXRwdXQsICpfX2l0LCBfX24pOworICAgIH0KKworICAvKiBTaW1wbGlmaWVkIGNsb25lIG9mIHN0ZDo6Zm9yX2VhY2guICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX0Z1bmN0aW9uPgorICAgIF9GdW5jdGlvbiAKKyAgICBfX2Zvcl9lYWNoKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX0Z1bmN0aW9uIF9fZikKKyAgICB7CisgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwlfX2YoKl9fZmlyc3QpOworICAgICAgcmV0dXJuIF9fZjsKKyAgICB9CisKKyAgLyogU2ltcGxpZmllZCBjbG9uZSBvZiBzdGQ6OnJlbW92ZS4gICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgX19yZW1vdmUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgIGNvbnN0IF9UcCYgX192YWx1ZSkKKyAgICB7CisgICAgICBpZihfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gX19maXJzdDsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQgPSBfX2ZpcnN0OworICAgICAgKytfX2ZpcnN0OworICAgICAgZm9yKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwlpZighKCpfX2ZpcnN0ID09IF9fdmFsdWUpKQorCSAgeworCSAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKwkgICAgKytfX3Jlc3VsdDsKKwkgIH0KKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9Cit9IC8vIG5hbWVzcGFjZSBfX2dudV9wcm9maWxlCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX0FMR09TX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2NvbnRhaW5lcl9zaXplLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl9jb250YWluZXJfc2l6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViY2RiMGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl9jb250YWluZXJfc2l6ZS5oCkBAIC0wLDAgKzEsMjE1IEBACisvLyAtKi0gQysrIC0qLQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvaW1wbC9wcm9maWxlcl9jb250YWluZXJfc2l6ZS5oCisgKiAgQGJyaWVmIERpYWdub3N0aWNzIGZvciBjb250YWluZXIgc2l6ZXMuCisgKi8KKworLy8gV3JpdHRlbiBieSBMaXhpYSBMaXUgYW5kIFNpbHZpdXMgUnVzLgorCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfQ09OVEFJTkVSX1NJWkVfSAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX0NPTlRBSU5FUl9TSVpFX0ggMQorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlci5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl9ub2RlLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3RyYWNlLmgiCisKK25hbWVzcGFjZSBfX2dudV9wcm9maWxlCit7CisgIC8qKiBAYnJpZWYgQSBjb250YWluZXIgc2l6ZSBpbnN0cnVtZW50YXRpb24gbGluZSBpbiB0aGUgb2JqZWN0IHRhYmxlLiAgKi8KKyAgY2xhc3MgX19jb250YWluZXJfc2l6ZV9pbmZvCisgIDogcHVibGljIF9fb2JqZWN0X2luZm9fYmFzZSAKKyAgeworICBwdWJsaWM6CisgICAgX19jb250YWluZXJfc2l6ZV9pbmZvKCkKKyAgICA6IF9NX2luaXQoMCksIF9NX21heCgwKSwgX01fbWluKDApLCBfTV90b3RhbCgwKSwgX01faXRlbV9taW4oMCksCisgICAgICBfTV9pdGVtX21heCgwKSwgX01faXRlbV90b3RhbCgwKSwgX01fY291bnQoMCksIF9NX3Jlc2l6ZSgwKSwgX01fY29zdCgwKSAKKyAgICB7IH0KKworICAgIF9fY29udGFpbmVyX3NpemVfaW5mbyhjb25zdCBfX2NvbnRhaW5lcl9zaXplX2luZm8mIF9fbykKKyAgICA6IF9fb2JqZWN0X2luZm9fYmFzZShfX28pLCBfTV9pbml0KF9fby5fTV9pbml0KSwgX01fbWF4KF9fby5fTV9tYXgpLAorICAgICAgX01fbWluKF9fby5fTV9taW4pLCBfTV90b3RhbChfX28uX01fdG90YWwpLAorICAgICAgX01faXRlbV9taW4oX19vLl9NX2l0ZW1fbWluKSwgX01faXRlbV9tYXgoX19vLl9NX2l0ZW1fbWF4KSwKKyAgICAgIF9NX2l0ZW1fdG90YWwoX19vLl9NX2l0ZW1fdG90YWwpLCBfTV9jb3VudChfX28uX01fY291bnQpLAorICAgICAgX01fcmVzaXplKF9fby5fTV9yZXNpemUpLCBfTV9jb3N0KF9fby5fTV9jb3N0KQorICAgIHsgfQorCisgICAgX19jb250YWluZXJfc2l6ZV9pbmZvKF9fc3RhY2tfdCBfX3N0YWNrLCBzdGQ6OnNpemVfdCBfX251bSkKKyAgICA6IF9fb2JqZWN0X2luZm9fYmFzZShfX3N0YWNrKSwgX01faW5pdChfX251bSksIF9NX21heChfX251bSksCisgICAgICBfTV9taW4oMCksIF9NX3RvdGFsKDApLCBfTV9pdGVtX21pbigwKSwgX01faXRlbV9tYXgoMCksCisgICAgICBfTV9pdGVtX3RvdGFsKDApLCBfTV9jb3VudCgwKSwgX01fcmVzaXplKDApLCBfTV9jb3N0KDApCisgICAgeyB9CisKKyAgICB2aXJ0dWFsIH5fX2NvbnRhaW5lcl9zaXplX2luZm8oKSB7IH0KKworICAgIHZvaWQKKyAgICBfX3dyaXRlKEZJTEUqIF9fZikgY29uc3QKKyAgICB7CisgICAgICBzdGQ6OmZwcmludGYoX19mLCAiJVp1ICVadSAlWnUgJVp1ICVadSAlWnUgJVp1ICVadSAlWnUgJVp1XG4iLCAKKwkJICAgX01faW5pdCwgX01fY291bnQsIF9NX2Nvc3QsIF9NX3Jlc2l6ZSwgX01fbWluLCBfTV9tYXgsCisJCSAgIF9NX3RvdGFsLCBfTV9pdGVtX21pbiwgX01faXRlbV9tYXgsIF9NX2l0ZW1fdG90YWwpOworICAgIH0KKworICAgIGZsb2F0CisgICAgX19tYWduaXR1ZGUoKSBjb25zdAorICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0PihfTV9jb3N0KTsgfQorCisgICAgc3RkOjpzdHJpbmcKKyAgICBfX2FkdmljZSgpIGNvbnN0CisgICAgeworICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gX19tZXNzYWdlOworICAgICAgaWYgKF9NX2luaXQgPCBfTV9pdGVtX21heCkKKwlfX21lc3NhZ2UgPDwgImNoYW5nZSBpbml0aWFsIGNvbnRhaW5lciBzaXplIGZyb20gIiA8PCBfTV9pbml0CisJCSAgPDwgIiB0byAiIDw8IF9NX2l0ZW1fbWF4OworICAgICAgcmV0dXJuIF9fbWVzc2FnZS5zdHIoKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19tZXJnZShjb25zdCBfX2NvbnRhaW5lcl9zaXplX2luZm8mIF9fbykKKyAgICB7CisgICAgICBfTV9pbml0ICAgICAgICA9IHN0ZDo6bWF4KF9NX2luaXQsIF9fby5fTV9pbml0KTsKKyAgICAgIF9NX21heCAgICAgICAgID0gc3RkOjptYXgoX01fbWF4LCBfX28uX01fbWF4KTsKKyAgICAgIF9NX2l0ZW1fbWF4ICAgID0gc3RkOjptYXgoX01faXRlbV9tYXgsIF9fby5fTV9pdGVtX21heCk7CisgICAgICBfTV9taW4gICAgICAgICA9IHN0ZDo6bWluKF9NX21pbiwgX19vLl9NX21pbik7CisgICAgICBfTV9pdGVtX21pbiAgICA9IHN0ZDo6bWluKF9NX2l0ZW1fbWluLCBfX28uX01faXRlbV9taW4pOworICAgICAgX01fdG90YWwgICAgICArPSBfX28uX01fdG90YWw7CisgICAgICBfTV9pdGVtX3RvdGFsICs9IF9fby5fTV9pdGVtX3RvdGFsOworICAgICAgX01fY291bnQgICAgICArPSBfX28uX01fY291bnQ7CisgICAgICBfTV9jb3N0ICAgICAgICs9IF9fby5fTV9jb3N0OworICAgICAgX01fcmVzaXplICAgICArPSBfX28uX01fcmVzaXplOworICAgIH0KKworICAgIC8vIENhbGwgaWYgYSBjb250YWluZXIgaXMgZGVzdHJ1Y3RlZCBvciBjbGVhbmVkLgorICAgIHZvaWQKKyAgICBfX2Rlc3RydWN0KHN0ZDo6c2l6ZV90IF9fbnVtLCBzdGQ6OnNpemVfdCBfX2ludW0pCisgICAgeworICAgICAgX01fbWF4ID0gc3RkOjptYXgoX01fbWF4LCBfX251bSk7CisgICAgICBfTV9pdGVtX21heCA9IHN0ZDo6bWF4KF9NX2l0ZW1fbWF4LCBfX2ludW0pOworICAgICAgaWYgKF9NX21pbiA9PSAwKQorCXsKKwkgIF9NX21pbiA9IF9fbnVtOyAKKwkgIF9NX2l0ZW1fbWluID0gX19pbnVtOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBfTV9taW4gPSBzdGQ6Om1pbihfTV9taW4sIF9fbnVtKTsKKwkgIF9NX2l0ZW1fbWluID0gc3RkOjptaW4oX01faXRlbV9taW4sIF9faW51bSk7CisJfQorICAgICAgX01fdG90YWwgKz0gX19udW07CisgICAgICBfTV9pdGVtX3RvdGFsICs9IF9faW51bTsKKyAgICAgIF9NX2NvdW50ICs9IDE7CisgICAgfQorCisgICAgLy8gRXN0aW1hdGUgdGhlIGNvc3Qgb2YgcmVzaXplL3JlaGFzaC4gCisgICAgZmxvYXQKKyAgICBfX3Jlc2l6ZV9jb3N0KHN0ZDo6c2l6ZV90IF9fZnJvbSwgc3RkOjpzaXplX3QpCisgICAgeyByZXR1cm4gX19mcm9tOyB9CisKKyAgICAvLyBDYWxsIGlmIGNvbnRhaW5lciBpcyByZXNpemVkLgorICAgIHZvaWQKKyAgICBfX3Jlc2l6ZShzdGQ6OnNpemVfdCBfX2Zyb20sIHN0ZDo6c2l6ZV90IF9fdG8pCisgICAgeworICAgICAgX01fY29zdCArPSB0aGlzLT5fX3Jlc2l6ZV9jb3N0KF9fZnJvbSwgX190byk7CisgICAgICBfTV9yZXNpemUgKz0gMTsKKyAgICAgIF9NX21heCA9IHN0ZDo6bWF4KF9NX21heCwgX190byk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3RkOjpzaXplX3QgX01faW5pdDsKKyAgICBzdGQ6OnNpemVfdCBfTV9tYXg7ICAvLyByYW5nZSBvZiAjIGJ1Y2tldHMKKyAgICBzdGQ6OnNpemVfdCBfTV9taW47CisgICAgc3RkOjpzaXplX3QgX01fdG90YWw7CisgICAgc3RkOjpzaXplX3QgX01faXRlbV9taW47ICAvLyByYW5nZSBvZiAjIGl0ZW1zCisgICAgc3RkOjpzaXplX3QgX01faXRlbV9tYXg7CisgICAgc3RkOjpzaXplX3QgX01faXRlbV90b3RhbDsKKyAgICBzdGQ6OnNpemVfdCBfTV9jb3VudDsKKyAgICBzdGQ6OnNpemVfdCBfTV9yZXNpemU7CisgICAgc3RkOjpzaXplX3QgX01fY29zdDsKKyAgfTsKKworCisgIC8qKiBAYnJpZWYgQSBjb250YWluZXIgc2l6ZSBpbnN0cnVtZW50YXRpb24gbGluZSBpbiB0aGUgc3RhY2sgdGFibGUuICAqLworICBjbGFzcyBfX2NvbnRhaW5lcl9zaXplX3N0YWNrX2luZm8KKyAgOiBwdWJsaWMgX19jb250YWluZXJfc2l6ZV9pbmZvCisgIHsKKyAgcHVibGljOgorICAgIF9fY29udGFpbmVyX3NpemVfc3RhY2tfaW5mbyhjb25zdCBfX2NvbnRhaW5lcl9zaXplX2luZm8mIF9fbykKKyAgICA6IF9fY29udGFpbmVyX3NpemVfaW5mbyhfX28pIHsgfQorICB9OworCisgIAorICAvKiogQGJyaWVmIENvbnRhaW5lciBzaXplIGluc3RydW1lbnRhdGlvbiB0cmFjZSBwcm9kdWNlci4gICovCisgIGNsYXNzIF9fdHJhY2VfY29udGFpbmVyX3NpemUKKyAgOiBwdWJsaWMgX190cmFjZV9iYXNlPF9fY29udGFpbmVyX3NpemVfaW5mbywgX19jb250YWluZXJfc2l6ZV9zdGFja19pbmZvPiAKKyAgeworICBwdWJsaWM6CisgICAgfl9fdHJhY2VfY29udGFpbmVyX3NpemUoKSB7IH0KKworICAgIF9fdHJhY2VfY29udGFpbmVyX3NpemUoKQorICAgIDogX190cmFjZV9iYXNlPF9fY29udGFpbmVyX3NpemVfaW5mbywgX19jb250YWluZXJfc2l6ZV9zdGFja19pbmZvPigpIHsgfTsKKworICAgIC8vIEluc2VydCBhIG5ldyBub2RlIGF0IGNvbnN0cnVjdCB3aXRoIG9iamVjdCwgY2FsbHN0YWNrIGFuZCBpbml0aWFsIHNpemUuIAorICAgIHZvaWQKKyAgICBfX2luc2VydChjb25zdCBfX29iamVjdF90IF9fb2JqLCBfX3N0YWNrX3QgX19zdGFjaywgc3RkOjpzaXplX3QgX19udW0pCisgICAgeyBfX2FkZF9vYmplY3QoX19vYmosIF9fY29udGFpbmVyX3NpemVfaW5mbyhfX3N0YWNrLCBfX251bSkpOyB9CisKKyAgICAvLyBYWFggVW5kZWZpbmVkPworICAgIHZvaWQKKyAgICBfX2NvbnN0cnVjdChjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19pbnVtKTsKKyAgCisgICAgLy8gQ2FsbCBhdCBkZXN0cnVjdGlvbi9jbGVhbiB0byBzZXQgY29udGFpbmVyIGZpbmFsIHNpemUuCisgICAgdm9pZAorICAgIF9fZGVzdHJ1Y3QoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fbnVtLCBzdGQ6OnNpemVfdCBfX2ludW0pCisgICAgeworICAgICAgaWYgKCFfX2lzX29uKCkpCisJcmV0dXJuOworCisgICAgICBfX29iamVjdF90IF9fb2JqX2hhbmRsZSA9IHN0YXRpY19jYXN0PF9fb2JqZWN0X3Q+KF9fb2JqKTsKKworICAgICAgX19jb250YWluZXJfc2l6ZV9pbmZvKiBfX29iamVjdF9pbmZvID0gX19nZXRfb2JqZWN0X2luZm8oX19vYmpfaGFuZGxlKTsKKyAgICAgIGlmICghX19vYmplY3RfaW5mbykKKwlyZXR1cm47CisKKyAgICAgIF9fb2JqZWN0X2luZm8tPl9fZGVzdHJ1Y3QoX19udW0sIF9faW51bSk7CisgICAgICBfX3JldGlyZV9vYmplY3QoX19vYmpfaGFuZGxlKTsKKyAgICB9CisKKyAgICAvLyBDYWxsIGF0IHJlc2l6ZSB0byBzZXQgcmVzaXplL2Nvc3QgaW5mb3JtYXRpb24uCisgICAgdm9pZAorICAgIF9fcmVzaXplKGNvbnN0IHZvaWQqIF9fb2JqLCBpbnQgX19mcm9tLCBpbnQgX190bykKKyAgICB7CisgICAgICBpZiAoIV9faXNfb24oKSkKKwlyZXR1cm47CisKKyAgICAgIF9fY29udGFpbmVyX3NpemVfaW5mbyogX19vYmplY3RfaW5mbyA9IF9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKyAgICAgIGlmICghX19vYmplY3RfaW5mbykKKwlyZXR1cm47CisKKyAgICAgIF9fb2JqZWN0X2luZm8tPl9fcmVzaXplKF9fZnJvbSwgX190byk7CisgICAgfQorICB9OworCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wcm9maWxlCisjZW5kaWYgLyogX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9DT05UQUlORVJfU0laRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl9oYXNoX2Z1bmMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2hhc2hfZnVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NzQ0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl9oYXNoX2Z1bmMuaApAQCAtMCwwICsxLDE3NCBAQAorLy8gLSotIEMrKyAtKi0KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKy8vIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL2ltcGwvcHJvZmlsZXJfaGFzaF9mdW5jLmgKKyAqICBAYnJpZWYgRGF0YSBzdHJ1Y3R1cmVzIHRvIHJlcHJlc2VudCBwcm9maWxpbmcgdHJhY2VzLgorICovCisKKy8vIFdyaXR0ZW4gYnkgTGl4aWEgTGl1IGFuZCBTaWx2aXVzIFJ1cy4KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX0hBU0hfRlVOQ19ICisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfSEFTSF9GVU5DX0ggMQorCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX25vZGUuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfdHJhY2UuaCIKKworbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKK3sKKyAgLyoqIEBicmllZiBBIGhhc2ggcGVyZm9ybWFuY2UgaW5zdHJ1bWVudGF0aW9uIGxpbmUgaW4gdGhlIG9iamVjdCB0YWJsZS4gICovCisgIGNsYXNzIF9faGFzaGZ1bmNfaW5mbworICA6IHB1YmxpYyBfX29iamVjdF9pbmZvX2Jhc2UKKyAgeworICBwdWJsaWM6CisgICAgX19oYXNoZnVuY19pbmZvKCkKKyAgICA6IF9NX2xvbmdlc3RfY2hhaW4oMCksIF9NX2FjY2Vzc2VzKDApLCBfTV9ob3BzKDApIHsgfQorCisgICAgX19oYXNoZnVuY19pbmZvKGNvbnN0IF9faGFzaGZ1bmNfaW5mbyYgX19vKQorICAgIDogX19vYmplY3RfaW5mb19iYXNlKF9fbyksIF9NX2xvbmdlc3RfY2hhaW4oX19vLl9NX2xvbmdlc3RfY2hhaW4pLAorICAgICAgX01fYWNjZXNzZXMoX19vLl9NX2FjY2Vzc2VzKSwgX01faG9wcyhfX28uX01faG9wcykgeyB9CisKKyAgICBfX2hhc2hmdW5jX2luZm8oX19zdGFja190IF9fc3RhY2spCisgICAgOiBfX29iamVjdF9pbmZvX2Jhc2UoX19zdGFjayksIF9NX2xvbmdlc3RfY2hhaW4oMCksCisgICAgICBfTV9hY2Nlc3NlcygwKSwgX01faG9wcygwKSB7IH0KKworICAgIHZpcnR1YWwgfl9faGFzaGZ1bmNfaW5mbygpIHsgfQorCisgICAgdm9pZAorICAgIF9fbWVyZ2UoY29uc3QgX19oYXNoZnVuY19pbmZvJiBfX28pCisgICAgeworICAgICAgX01fbG9uZ2VzdF9jaGFpbiAgPSBzdGQ6Om1heChfTV9sb25nZXN0X2NoYWluLCBfX28uX01fbG9uZ2VzdF9jaGFpbik7CisgICAgICBfTV9hY2Nlc3NlcyAgICAgICs9IF9fby5fTV9hY2Nlc3NlczsKKyAgICAgIF9NX2hvcHMgICAgICAgICAgKz0gX19vLl9NX2hvcHM7CisgICAgfQorCisgICAgdm9pZAorICAgIF9fZGVzdHJ1Y3Qoc3RkOjpzaXplX3QgX19jaGFpbiwgc3RkOjpzaXplX3QgX19hY2Nlc3NlcywKKwkgICAgICAgc3RkOjpzaXplX3QgX19ob3BzKQorICAgIHsgCisgICAgICBfTV9sb25nZXN0X2NoYWluICA9IHN0ZDo6bWF4KF9NX2xvbmdlc3RfY2hhaW4sIF9fY2hhaW4pOworICAgICAgX01fYWNjZXNzZXMgICAgICArPSBfX2FjY2Vzc2VzOworICAgICAgX01faG9wcyAgICAgICAgICArPSBfX2hvcHM7CisgICAgfQorCisgICAgdm9pZAorICAgIF9fd3JpdGUoRklMRSogX19mKSBjb25zdAorICAgIHsgc3RkOjpmcHJpbnRmKF9fZiwgIiVadSAlWnUgJVp1XG4iLCBfTV9ob3BzLAorCQkgICBfTV9hY2Nlc3NlcywgX01fbG9uZ2VzdF9jaGFpbik7IH0KKworICAgIGZsb2F0CisgICAgX19tYWduaXR1ZGUoKSBjb25zdAorICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0PihfTV9ob3BzKTsgfQorCisgICAgc3RkOjpzdHJpbmcKKyAgICBfX2FkdmljZSgpIGNvbnN0CisgICAgeyByZXR1cm4gImNoYW5nZSBoYXNoIGZ1bmN0aW9uIjsgfQorCisgIHByaXZhdGU6CisgICAgc3RkOjpzaXplX3QgX01fbG9uZ2VzdF9jaGFpbjsKKyAgICBzdGQ6OnNpemVfdCBfTV9hY2Nlc3NlczsKKyAgICBzdGQ6OnNpemVfdCBfTV9ob3BzOworICB9OworCisKKyAgLyoqIEBicmllZiBBIGhhc2ggcGVyZm9ybWFuY2UgaW5zdHJ1bWVudGF0aW9uIGxpbmUgaW4gdGhlIHN0YWNrIHRhYmxlLiAgKi8KKyAgY2xhc3MgX19oYXNoZnVuY19zdGFja19pbmZvIAorICA6IHB1YmxpYyBfX2hhc2hmdW5jX2luZm8KKyAgeworICBwdWJsaWM6CisgICAgX19oYXNoZnVuY19zdGFja19pbmZvKGNvbnN0IF9faGFzaGZ1bmNfaW5mbyYgX19vKQorICAgIDogX19oYXNoZnVuY19pbmZvKF9fbykgeyB9CisgIH07CisKKworICAvKiogQGJyaWVmIEhhc2ggcGVyZm9ybWFuY2UgaW5zdHJ1bWVudGF0aW9uIHByb2R1Y2VyLiAgKi8KKyAgY2xhc3MgX190cmFjZV9oYXNoX2Z1bmMKKyAgOiBwdWJsaWMgX190cmFjZV9iYXNlPF9faGFzaGZ1bmNfaW5mbywgX19oYXNoZnVuY19zdGFja19pbmZvPiAKKyAgeworICBwdWJsaWM6CisgICAgX190cmFjZV9oYXNoX2Z1bmMoKQorICAgIDogX190cmFjZV9iYXNlPF9faGFzaGZ1bmNfaW5mbywgX19oYXNoZnVuY19zdGFja19pbmZvPigpCisgICAgeyBfX2lkID0gImhhc2gtZGlzdHIiOyB9CisKKyAgICB+X190cmFjZV9oYXNoX2Z1bmMoKSB7fQorICAgIAorICAgIC8vIEluc2VydCBhIG5ldyBub2RlIGF0IGNvbnN0cnVjdCB3aXRoIG9iamVjdCwgY2FsbHN0YWNrIGFuZCBpbml0aWFsIHNpemUuCisgICAgdm9pZAorICAgIF9faW5zZXJ0KF9fb2JqZWN0X3QgX19vYmosIF9fc3RhY2tfdCBfX3N0YWNrKQorICAgIHsgX19hZGRfb2JqZWN0KF9fb2JqLCBfX2hhc2hmdW5jX2luZm8oX19zdGFjaykpOyB9CisKKyAgICAvLyBDYWxsIGF0IGRlc3RydWN0aW9uL2NsZWFuIHRvIHNldCBjb250YWluZXIgZmluYWwgc2l6ZS4KKyAgICB2b2lkCisgICAgX19kZXN0cnVjdChjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19jaGFpbiwKKwkgICAgICAgc3RkOjpzaXplX3QgX19hY2Nlc3Nlcywgc3RkOjpzaXplX3QgX19ob3BzKQorICAgIHsKKyAgICAgIGlmICghX19pc19vbigpKQorCXJldHVybjsKKworICAgICAgLy8gRmlyc3QgZmluZCB0aGUgaXRlbSBmcm9tIHRoZSBsaXZlIG9iamVjdHMgYW5kIHVwZGF0ZSB0aGUgaW5mb3JtYXRpb25zLgorICAgICAgX19oYXNoZnVuY19pbmZvKiBfX29ianMgPSBfX2dldF9vYmplY3RfaW5mbyhfX29iaik7CisgICAgICBpZiAoIV9fb2JqcykKKwlyZXR1cm47CisKKyAgICAgIF9fb2Jqcy0+X19kZXN0cnVjdChfX2NoYWluLCBfX2FjY2Vzc2VzLCBfX2hvcHMpOworICAgICAgX19yZXRpcmVfb2JqZWN0KF9fb2JqKTsKKyAgICB9CisgIH07CisKKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2hhc2hfZnVuY19pbml0KCkKKyAgeyBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfaGFzaF9mdW5jKSA9IG5ldyBfX3RyYWNlX2hhc2hfZnVuYygpOyB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9oYXNoX2Z1bmNfcmVwb3J0KEZJTEUqIF9fZiwgX193YXJuaW5nX3ZlY3Rvcl90JiBfX3dhcm5pbmdzKQorICB7CisgICAgaWYgKF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19oYXNoX2Z1bmMpKQorICAgICAgeworCV9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19oYXNoX2Z1bmMpLT5fX2NvbGxlY3Rfd2FybmluZ3MoX193YXJuaW5ncyk7CisJX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2hhc2hfZnVuYyktPl9fd3JpdGUoX19mKTsKKyAgICAgIH0KKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfaGFzaF9mdW5jX2NvbnN0cnVjdChjb25zdCB2b2lkKiBfX29iaikKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19oYXNoX2Z1bmMpLT5fX2luc2VydChfX29iaiwgX19nZXRfc3RhY2soKSk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2hhc2hfZnVuY19kZXN0cnVjdChjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19jaGFpbiwKKwkJCSAgICAgc3RkOjpzaXplX3QgX19hY2Nlc3Nlcywgc3RkOjpzaXplX3QgX19ob3BzKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2hhc2hfZnVuYyktPl9fZGVzdHJ1Y3QoX19vYmosIF9fY2hhaW4sCisJCQkJCQkgICAgX19hY2Nlc3NlcywgX19ob3BzKTsKKyAgfQorCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wcm9maWxlCisjZW5kaWYgLyogX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9IQVNIX0ZVTkNfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfaGFzaHRhYmxlX3NpemUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2hhc2h0YWJsZV9zaXplLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlYmE5ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2hhc2h0YWJsZV9zaXplLmgKQEAgLTAsMCArMSw5OCBAQAorLy8gLSotIEMrKyAtKi0KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKy8vIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL2ltcGwvcHJvZmlsZXJfaGFzaHRhYmxlX3NpemUuaAorICogIEBicmllZiBDb2xsZWN0aW9uIG9mIGhhc2h0YWJsZSBzaXplIHRyYWNlcy4KKyAqLworCisvLyBXcml0dGVuIGJ5IExpeGlhIExpdSBhbmQgU2lsdml1cyBSdXMuCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9IQVNIVEFCTEVfU0laRV9ICisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfSEFTSFRBQkxFX1NJWkVfSCAxCisKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXIuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfbm9kZS5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl90cmFjZS5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl9zdGF0ZS5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl9jb250YWluZXJfc2l6ZS5oIgorCituYW1lc3BhY2UgX19nbnVfcHJvZmlsZQoreworICAvKiogQGJyaWVmIEhhc2h0YWJsZSBzaXplIGluc3RydW1lbnRhdGlvbiB0cmFjZSBwcm9kdWNlci4gICovCisgIGNsYXNzIF9fdHJhY2VfaGFzaHRhYmxlX3NpemUKKyAgOiBwdWJsaWMgX190cmFjZV9jb250YWluZXJfc2l6ZQorICB7CisgIHB1YmxpYzoKKyAgICBfX3RyYWNlX2hhc2h0YWJsZV9zaXplKCkKKyAgICA6IF9fdHJhY2VfY29udGFpbmVyX3NpemUoKQorICAgIHsgX19pZCA9ICJoYXNodGFibGUtc2l6ZSI7IH0KKyAgfTsKKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2hhc2h0YWJsZV9zaXplX2luaXQoKQorICB7IF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19oYXNodGFibGVfc2l6ZSkgPSBuZXcgX190cmFjZV9oYXNodGFibGVfc2l6ZSgpOyB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9oYXNodGFibGVfc2l6ZV9yZXBvcnQoRklMRSogX19mLCBfX3dhcm5pbmdfdmVjdG9yX3QmIF9fd2FybmluZ3MpCisgIHsKKyAgICBpZiAoX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2hhc2h0YWJsZV9zaXplKSkKKyAgICAgIHsKKwlfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfaGFzaHRhYmxlX3NpemUpLT4KKwkgIF9fY29sbGVjdF93YXJuaW5ncyhfX3dhcm5pbmdzKTsKKwlfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfaGFzaHRhYmxlX3NpemUpLT5fX3dyaXRlKF9fZik7CisgICAgICB9CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2hhc2h0YWJsZV9zaXplX2NvbnN0cnVjdChjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19udW0pCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisgIAorICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19oYXNodGFibGVfc2l6ZSktPl9faW5zZXJ0KF9fb2JqLCBfX2dldF9zdGFjaygpLAorCQkJCQkJICAgICAgIF9fbnVtKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfaGFzaHRhYmxlX3NpemVfZGVzdHJ1Y3QoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fbnVtLCAKKwkJCQkgIHN0ZDo6c2l6ZV90IF9faW51bSkKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19oYXNodGFibGVfc2l6ZSktPl9fZGVzdHJ1Y3QoX19vYmosIF9fbnVtLCBfX2ludW0pOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9oYXNodGFibGVfc2l6ZV9yZXNpemUoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fZnJvbSwgCisJCQkJc3RkOjpzaXplX3QgX190bykKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19oYXNodGFibGVfc2l6ZSktPl9fcmVzaXplKF9fb2JqLCBfX2Zyb20sIF9fdG8pOworICB9CisKK30gLy8gbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfSEFTSFRBQkxFX1NJWkVfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfbGlzdF90b19zbGlzdC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfbGlzdF90b19zbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4Y2VjZjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl9saXN0X3RvX3NsaXN0LmgKQEAgLTAsMCArMSwyMDggQEAKKy8vIC0qLSBDKysgLSotCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisvLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2xpc3RfdG9fc2xpc3QuaAorICogIEBicmllZiBEaWFnbm9zdGljcyBmb3IgbGlzdCB0byBzbGlzdC4KKyAqLworCisvLyBXcml0dGVuIGJ5IENoYW5naGVlIEp1bmcuCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9MSVNUX1RPX1NMSVNUX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9MSVNUX1RPX1NMSVNUX0ggMQorCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX25vZGUuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfdHJhY2UuaCIKKworbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKK3sKKyAgY2xhc3MgX19saXN0MnNsaXN0X2luZm8KKyAgOiBwdWJsaWMgX19vYmplY3RfaW5mb19iYXNlCisgIHsKKyAgcHVibGljOgorICAgIF9fbGlzdDJzbGlzdF9pbmZvKCkKKyAgICA6IF9NX3Jld2luZChmYWxzZSksIF9NX29wZXJhdGlvbnMoMCkgeyB9CisgIAorICAgIF9fbGlzdDJzbGlzdF9pbmZvKF9fc3RhY2tfdCBfX3N0YWNrKQorICAgIDogX19vYmplY3RfaW5mb19iYXNlKF9fc3RhY2spLCBfTV9yZXdpbmQoZmFsc2UpLCBfTV9vcGVyYXRpb25zKDApIHsgfQorCisgICAgdmlydHVhbCB+X19saXN0MnNsaXN0X2luZm8oKSB7IH0KKworICAgIF9fbGlzdDJzbGlzdF9pbmZvKGNvbnN0IF9fbGlzdDJzbGlzdF9pbmZvJiBfX28pCisgICAgOiBfX29iamVjdF9pbmZvX2Jhc2UoX19vKSwgX01fcmV3aW5kKF9fby5fTV9yZXdpbmQpLAorICAgICAgX01fb3BlcmF0aW9ucyhfX28uX01fb3BlcmF0aW9ucykgeyB9CisgIAorICAgIC8vIFhYWDogdGhlIG1hZ25pdHVkZSBzaG91bGQgYmUgbXVsdGlwbGllZCB3aXRoIGEgY29uc3RhbnQgZmFjdG9yIEYsCisgICAgLy8gd2hlcmUgRiBpcyAxIHdoZW4gdGhlIG1hbGxvYyBzaXplIGNsYXNzIG9mIGxpc3Qgbm9kZXMgaXMgZGlmZmVyZW50CisgICAgLy8gZnJvbSB0aGUgbWFsbG9jIHNpemUgY2xhc3Mgb2Ygc2xpc3Qgbm9kZXMuICBXaGVuIHRoZXkgZmFsbCBpbnRvIHRoZSBzYW1lCisgICAgLy8gY2xhc3MsIHRoZSBvbmx5IHNsaXN0IGJlbmVmaXQgaXMgZnJvbSBoYXZpbmcgdG8gc2V0IGZld2VyIGxpbmtzLCBzbworICAgIC8vIHRoZSBmYWN0b3IgRiBzaG91bGQgYmUgbXVjaCBzbWFsbGVyLCBjbG9zZXIgdG8gMCB0aGFuIHRvIDEuCisgICAgLy8gVGhpcyBjb3VsZCBiZSBpbXBsZW1lbnRlZCBieSBwYXNzaW5nIHRoZSBzaXplIGNsYXNzZXMgaW4gdGhlIGNvbmZpZyAKKyAgICAvLyBmaWxlLiAgRm9yIG5vdywgd2UgYWx3YXlzIGFzc3VtZSBGIHRvIGJlIDEuCisKKyAgICBmbG9hdAorICAgIF9fbWFnbml0dWRlKCkgY29uc3QKKyAgICB7CisgICAgICBpZiAoIV9NX3Jld2luZCkKKwlyZXR1cm4gX01fb3BlcmF0aW9uczsKKyAgICAgIGVsc2UKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgdm9pZAorICAgIF9fbWVyZ2UoY29uc3QgX19saXN0MnNsaXN0X2luZm8mKSB7IH0KKworICAgIHZvaWQKKyAgICBfX3dyaXRlKEZJTEUqIF9fZikgY29uc3QKKyAgICB7IHN0ZDo6ZnByaW50ZihfX2YsICIlc1xuIiwgX01fcmV3aW5kID8gImludmFsaWQiIDogInZhbGlkIik7IH0KKworICAgIHN0ZDo6c3RyaW5nCisgICAgX19hZHZpY2UoKSBjb25zdAorICAgIHsgcmV0dXJuICJjaGFuZ2Ugc3RkOjpsaXN0IHRvIHN0ZDo6Zm9yd2FyZF9saXN0IjsgfQorCisgICAgdm9pZAorICAgIF9fb3ByX3Jld2luZCgpCisgICAgeworICAgICAgX01fcmV3aW5kID0gdHJ1ZTsKKyAgICAgIF9NX3ZhbGlkID0gZmFsc2U7CisgICAgfQorCisgICAgdm9pZAorICAgIF9fcmVjb3JkX29wZXJhdGlvbigpCisgICAgeyArK19NX29wZXJhdGlvbnM7IH0KKworICAgIGJvb2wKKyAgICBfX2hhc19yZXdpbmQoKQorICAgIHsgcmV0dXJuIF9NX3Jld2luZDsgfQorCisgIHByaXZhdGU6CisgICAgYm9vbCBfTV9yZXdpbmQ7CisgICAgc3RkOjpzaXplX3QgX01fb3BlcmF0aW9uczsKKyAgfTsKKworICBjbGFzcyBfX2xpc3Qyc2xpc3Rfc3RhY2tfaW5mbworICA6IHB1YmxpYyBfX2xpc3Qyc2xpc3RfaW5mbworICB7CisgIHB1YmxpYzoKKyAgICBfX2xpc3Qyc2xpc3Rfc3RhY2tfaW5mbyhjb25zdCBfX2xpc3Qyc2xpc3RfaW5mbyYgX19vKSAKKyAgICA6IF9fbGlzdDJzbGlzdF9pbmZvKF9fbykgeyB9CisgIH07CisKKyAgY2xhc3MgX190cmFjZV9saXN0X3RvX3NsaXN0CisgIDogcHVibGljIF9fdHJhY2VfYmFzZTxfX2xpc3Qyc2xpc3RfaW5mbywgX19saXN0MnNsaXN0X3N0YWNrX2luZm8+IAorICB7CisgIHB1YmxpYzoKKyAgICB+X190cmFjZV9saXN0X3RvX3NsaXN0KCkgeyB9CisKKyAgICBfX3RyYWNlX2xpc3RfdG9fc2xpc3QoKQorICAgIDogX190cmFjZV9iYXNlPF9fbGlzdDJzbGlzdF9pbmZvLCBfX2xpc3Qyc2xpc3Rfc3RhY2tfaW5mbz4oKQorICAgIHsgX19pZCA9ICJsaXN0LXRvLXNsaXN0IjsgfQorCisgICAgdm9pZAorICAgIF9fb3ByX3Jld2luZChjb25zdCB2b2lkKiBfX29iaikKKyAgICB7CisgICAgICBfX2xpc3Qyc2xpc3RfaW5mbyogX19yZXMgPSBfX2dldF9vYmplY3RfaW5mbyhfX29iaik7CisgICAgICBpZiAoX19yZXMpCisJX19yZXMtPl9fb3ByX3Jld2luZCgpOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX3JlY29yZF9vcGVyYXRpb24oY29uc3Qgdm9pZCogX19vYmopCisgICAgeworICAgICAgX19saXN0MnNsaXN0X2luZm8qIF9fcmVzID0gX19nZXRfb2JqZWN0X2luZm8oX19vYmopOworICAgICAgaWYgKF9fcmVzKQorCV9fcmVzLT5fX3JlY29yZF9vcGVyYXRpb24oKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19pbnNlcnQoY29uc3QgX19vYmplY3RfdCBfX29iaiwgX19zdGFja190IF9fc3RhY2spCisgICAgeyBfX2FkZF9vYmplY3QoX19vYmosIF9fbGlzdDJzbGlzdF9pbmZvKF9fc3RhY2spKTsgfQorICAKKyAgICB2b2lkCisgICAgX19kZXN0cnVjdChjb25zdCB2b2lkKiBfX29iaikKKyAgICB7CisgICAgICBpZiAoIV9faXNfb24oKSkKKwlyZXR1cm47CisKKyAgICAgIF9fbGlzdDJzbGlzdF9pbmZvKiBfX3JlcyA9IF9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKyAgICAgIGlmICghX19yZXMpCisJcmV0dXJuOworCisgICAgICBfX3JldGlyZV9vYmplY3QoX19vYmopOworICAgIH0KKyAgfTsKKworCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfbGlzdF90b19zbGlzdF9pbml0KCkKKyAgeyBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbGlzdF90b19zbGlzdCkgPSBuZXcgX190cmFjZV9saXN0X3RvX3NsaXN0KCk7IH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2xpc3RfdG9fc2xpc3RfcmVwb3J0KEZJTEUqIF9fZiwgX193YXJuaW5nX3ZlY3Rvcl90JiBfX3dhcm5pbmdzKQorICB7CisgICAgaWYgKF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19saXN0X3RvX3NsaXN0KSkKKyAgICAgIHsKKwlfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbGlzdF90b19zbGlzdCktPgorCSAgX19jb2xsZWN0X3dhcm5pbmdzKF9fd2FybmluZ3MpOworCV9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19saXN0X3RvX3NsaXN0KS0+X193cml0ZShfX2YpOworICAgICAgfQorICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9saXN0X3RvX3NsaXN0X3Jld2luZChjb25zdCB2b2lkKiBfX29iaikgCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbGlzdF90b19zbGlzdCktPl9fb3ByX3Jld2luZChfX29iaik7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2xpc3RfdG9fc2xpc3Rfb3BlcmF0aW9uKGNvbnN0IHZvaWQqIF9fb2JqKSAKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19saXN0X3RvX3NsaXN0KS0+X19yZWNvcmRfb3BlcmF0aW9uKF9fb2JqKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfbGlzdF90b19zbGlzdF9jb25zdHJ1Y3QoY29uc3Qgdm9pZCogX19vYmopCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbGlzdF90b19zbGlzdCktPl9faW5zZXJ0KF9fb2JqLCBfX2dldF9zdGFjaygpKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfbGlzdF90b19zbGlzdF9kZXN0cnVjdChjb25zdCB2b2lkKiBfX29iaikKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19saXN0X3RvX3NsaXN0KS0+X19kZXN0cnVjdChfX29iaik7CisgIH0KKworfSAvLyBuYW1lc3BhY2UgX19nbnVfcHJvZmlsZQorI2VuZGlmIC8qIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfTElTVF9UT19TTElTVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl9saXN0X3RvX3ZlY3Rvci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfbGlzdF90b192ZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGIxNDMzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfbGlzdF90b192ZWN0b3IuaApAQCAtMCwwICsxLDMyNCBAQAorLy8gLSotIEMrKyAtKi0KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKy8vIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL2ltcGwvcHJvZmlsZXJfbGlzdF90b192ZWN0b3IuaAorICogIEBicmllZiBkaWFnbm9zdGljcyBmb3IgbGlzdCB0byB2ZWN0b3IuCisgKi8KKworLy8gV3JpdHRlbiBieSBDaGFuZ2hlZSBKdW5nLgorCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfTElTVF9UT19WRUNUT1JfSAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX0xJU1RfVE9fVkVDVE9SX0ggMQorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlci5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl9ub2RlLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3RyYWNlLmgiCisKK25hbWVzcGFjZSBfX2dudV9wcm9maWxlCit7CisgIC8qKiBAYnJpZWYgQSBsaXN0LXRvLXZlY3RvciBpbnN0cnVtZW50YXRpb24gbGluZSBpbiB0aGUgb2JqZWN0IHRhYmxlLiAgKi8KKyAgY2xhc3MgX19saXN0MnZlY3Rvcl9pbmZvCisgIDogcHVibGljIF9fb2JqZWN0X2luZm9fYmFzZQorICB7CisgIHB1YmxpYzoKKyAgICBfX2xpc3QydmVjdG9yX2luZm8oKQorICAgIDogX01fc2hpZnRfY291bnQoMCksIF9NX2l0ZXJhdGUoMCksIF9NX3Jlc2l6ZSgwKSwgX01fbGlzdF9jb3N0KDApLAorICAgICAgX01fdmVjdG9yX2Nvc3QoMCksIF9NX3ZhbGlkKHRydWUpLCBfTV9tYXhfc2l6ZSgwKSB7IH0KKworICAgIF9fbGlzdDJ2ZWN0b3JfaW5mbyhfX3N0YWNrX3QgX19zdGFjaykKKyAgICA6IF9fb2JqZWN0X2luZm9fYmFzZShfX3N0YWNrKSwgX01fc2hpZnRfY291bnQoMCksIF9NX2l0ZXJhdGUoMCksCisgICAgICBfTV9yZXNpemUoMCksIF9NX2xpc3RfY29zdCgwKSwgX01fdmVjdG9yX2Nvc3QoMCksIF9NX3ZhbGlkKHRydWUpLAorICAgICAgX01fbWF4X3NpemUoMCkgeyB9CisKKyAgICB2aXJ0dWFsIH5fX2xpc3QydmVjdG9yX2luZm8oKSB7IH0KKworICAgIF9fbGlzdDJ2ZWN0b3JfaW5mbyhjb25zdCBfX2xpc3QydmVjdG9yX2luZm8mIF9fbykKKyAgICA6IF9fb2JqZWN0X2luZm9fYmFzZShfX28pLCBfTV9zaGlmdF9jb3VudChfX28uX01fc2hpZnRfY291bnQpLAorICAgICAgX01faXRlcmF0ZShfX28uX01faXRlcmF0ZSksIF9NX3Jlc2l6ZShfX28uX01fcmVzaXplKSwKKyAgICAgIF9NX2xpc3RfY29zdChfX28uX01fbGlzdF9jb3N0KSwgX01fdmVjdG9yX2Nvc3QoX19vLl9NX3ZlY3Rvcl9jb3N0KSwKKyAgICAgIF9NX3ZhbGlkKF9fby5fTV92YWxpZCksIF9NX21heF9zaXplKF9fby5fTV9tYXhfc2l6ZSkgeyB9CisKKyAgICB2b2lkCisgICAgX19tZXJnZShjb25zdCBfX2xpc3QydmVjdG9yX2luZm8mIF9fbykKKyAgICB7CisgICAgICBfTV9zaGlmdF9jb3VudCAgKz0gX19vLl9NX3NoaWZ0X2NvdW50OworICAgICAgX01faXRlcmF0ZSAgICAgICs9IF9fby5fTV9pdGVyYXRlOworICAgICAgX01fdmVjdG9yX2Nvc3QgICs9IF9fby5fTV92ZWN0b3JfY29zdDsKKyAgICAgIF9NX2xpc3RfY29zdCAgICArPSBfX28uX01fbGlzdF9jb3N0OworICAgICAgX01fdmFsaWQgICAgICAgICY9IF9fby5fTV92YWxpZDsKKyAgICAgIF9NX3Jlc2l6ZSAgICAgICArPSBfX28uX01fcmVzaXplOworICAgICAgX01fbWF4X3NpemUgICAgID0gc3RkOjptYXgoIF9NX21heF9zaXplLCBfX28uX01fbWF4X3NpemUpOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX3dyaXRlKEZJTEUqIF9fZikgY29uc3QKKyAgICB7CisgICAgICBzdGQ6OmZwcmludGYoX19mLCAiJVp1ICVadSAlWnUgJS4wZiAlLjBmXG4iLCBfTV9zaGlmdF9jb3VudCwKKwkJICAgX01fcmVzaXplLCBfTV9pdGVyYXRlLCBfTV92ZWN0b3JfY29zdCwgX01fbGlzdF9jb3N0KTsKKyAgICB9CisKKyAgICBmbG9hdAorICAgIF9fbWFnbml0dWRlKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9saXN0X2Nvc3QgLSBfTV92ZWN0b3JfY29zdDsgfQorICAKKyAgICBzdGQ6OnN0cmluZworICAgIF9fYWR2aWNlKCkgY29uc3QKKyAgICB7CisgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBfX3NzdHJlYW07CisgICAgICBfX3NzdHJlYW0gCisJPDwgImNoYW5nZSBzdGQ6Omxpc3QgdG8gc3RkOjp2ZWN0b3IgYW5kIGl0cyBpbml0aWFsIHNpemUgZnJvbSAwIHRvICIKKwk8PCBfTV9tYXhfc2l6ZTsKKyAgICAgIHJldHVybiBfX3NzdHJlYW0uc3RyKCk7CisgICAgfQorCisgICAgc3RkOjpzaXplX3QKKyAgICBfX3NoaWZ0X2NvdW50KCkKKyAgICB7IHJldHVybiBfTV9zaGlmdF9jb3VudDsgfQorICAKKyAgICBzdGQ6OnNpemVfdAorICAgIF9faXRlcmF0ZSgpCisgICAgeyByZXR1cm4gX01faXRlcmF0ZTsgfQorICAKKyAgICBmbG9hdAorICAgIF9fbGlzdF9jb3N0KCkKKyAgICB7IHJldHVybiBfTV9saXN0X2Nvc3Q7IH0KKyAgCisgICAgc3RkOjpzaXplX3QKKyAgICBfX3Jlc2l6ZSgpCisgICAgeyByZXR1cm4gX01fcmVzaXplOyB9CisgIAorICAgIHZvaWQKKyAgICBfX3NldF9saXN0X2Nvc3QoZmxvYXQgX19sYykKKyAgICB7IF9NX2xpc3RfY29zdCA9IF9fbGM7IH0KKyAgICAKKyAgICB2b2lkCisgICAgX19zZXRfdmVjdG9yX2Nvc3QoZmxvYXQgX192YykKKyAgICB7IF9NX3ZlY3Rvcl9jb3N0ID0gX192YzsgfQorICAgIAorICAgIGJvb2wKKyAgICBfX2lzX3ZhbGlkKCkKKyAgICB7IHJldHVybiBfTV92YWxpZDsgfQorICAgIAorICAgIHZvaWQKKyAgICBfX3NldF9pbnZhbGlkKCkKKyAgICB7IF9NX3ZhbGlkID0gZmFsc2U7IH0KKworICAgIHZvaWQKKyAgICBfX29wcl9pbnNlcnQoc3RkOjpzaXplX3QgX19zaGlmdCwgc3RkOjpzaXplX3QgX19zaXplKQorICAgIHsKKyAgICAgIF9NX3NoaWZ0X2NvdW50ICs9IF9fc2hpZnQ7CisgICAgICBfTV9tYXhfc2l6ZSA9IHN0ZDo6bWF4KF9NX21heF9zaXplLCBfX3NpemUpOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX29wcl9pdGVyYXRlKHN0ZDo6c2l6ZV90IF9fbnVtKQorICAgIHsgX01faXRlcmF0ZSArPSBfX251bTt9CisKKyAgICB2b2lkCisgICAgX19yZXNpemUoc3RkOjpzaXplX3QgX19mcm9tLCBzdGQ6OnNpemVfdCkKKyAgICB7IF9NX3Jlc2l6ZSArPSBfX2Zyb207IH0KKworICBwcml2YXRlOgorICAgIHN0ZDo6c2l6ZV90IF9NX3NoaWZ0X2NvdW50OworICAgIHN0ZDo6c2l6ZV90IF9NX2l0ZXJhdGU7CisgICAgc3RkOjpzaXplX3QgX01fcmVzaXplOworICAgIGZsb2F0IF9NX2xpc3RfY29zdDsKKyAgICBmbG9hdCBfTV92ZWN0b3JfY29zdDsKKyAgICBib29sICBfTV92YWxpZDsKKyAgICBzdGQ6OnNpemVfdCBfTV9tYXhfc2l6ZTsKKyAgfTsKKworICBjbGFzcyBfX2xpc3QydmVjdG9yX3N0YWNrX2luZm8gCisgIDogcHVibGljIF9fbGlzdDJ2ZWN0b3JfaW5mbworICB7CisgIHB1YmxpYzoKKyAgICBfX2xpc3QydmVjdG9yX3N0YWNrX2luZm8oY29uc3QgX19saXN0MnZlY3Rvcl9pbmZvJiBfX28pIAorICAgIDogX19saXN0MnZlY3Rvcl9pbmZvKF9fbykge30KKyAgfTsKKworICBjbGFzcyBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yCisgIDogcHVibGljIF9fdHJhY2VfYmFzZTxfX2xpc3QydmVjdG9yX2luZm8sIF9fbGlzdDJ2ZWN0b3Jfc3RhY2tfaW5mbz4gCisgIHsKKyAgcHVibGljOgorICAgIF9fdHJhY2VfbGlzdF90b192ZWN0b3IoKQorICAgIDogX190cmFjZV9iYXNlPF9fbGlzdDJ2ZWN0b3JfaW5mbywgX19saXN0MnZlY3Rvcl9zdGFja19pbmZvPigpCisgICAgeyBfX2lkID0gImxpc3QtdG8tdmVjdG9yIjsgfQorCisgICAgfl9fdHJhY2VfbGlzdF90b192ZWN0b3IoKSB7IH0KKworICAgIC8vIEluc2VydCBhIG5ldyBub2RlIGF0IGNvbnN0cnVjdCB3aXRoIG9iamVjdCwgY2FsbHN0YWNrIGFuZCBpbml0aWFsIHNpemUuCisgICAgdm9pZAorICAgIF9faW5zZXJ0KF9fb2JqZWN0X3QgX19vYmosIF9fc3RhY2tfdCBfX3N0YWNrKQorICAgIHsgX19hZGRfb2JqZWN0KF9fb2JqLCBfX2xpc3QydmVjdG9yX2luZm8oX19zdGFjaykpOyB9CisKKyAgICAvLyBDYWxsIGF0IGRlc3RydWN0aW9uL2NsZWFuIHRvIHNldCBjb250YWluZXIgZmluYWwgc2l6ZS4KKyAgICB2b2lkCisgICAgX19kZXN0cnVjdChjb25zdCB2b2lkKiBfX29iaikKKyAgICB7CisgICAgICBpZiAoIV9faXNfb24oKSkKKwlyZXR1cm47CisKKyAgICAgIF9fbGlzdDJ2ZWN0b3JfaW5mbyogX19yZXMgPSBfX2dldF9vYmplY3RfaW5mbyhfX29iaik7CisgICAgICBpZiAoIV9fcmVzKQorCXJldHVybjsKKworICAgICAgZmxvYXQgX192YyA9IF9fdmVjdG9yX2Nvc3QoX19yZXMtPl9fc2hpZnRfY291bnQoKSwgX19yZXMtPl9faXRlcmF0ZSgpKTsKKyAgICAgIGZsb2F0IF9fbGMgPSBfX2xpc3RfY29zdChfX3Jlcy0+X19zaGlmdF9jb3VudCgpLCBfX3Jlcy0+X19pdGVyYXRlKCkpOworICAgICAgX19yZXMtPl9fc2V0X3ZlY3Rvcl9jb3N0KF9fdmMpOworICAgICAgX19yZXMtPl9fc2V0X2xpc3RfY29zdChfX2xjKTsKKyAgICAgIF9fcmV0aXJlX29iamVjdChfX29iaik7CisgICAgfQorCisgICAgLy8gRmluZCB0aGUgbm9kZSBpbiB0aGUgbGl2ZSBtYXAuCisgICAgX19saXN0MnZlY3Rvcl9pbmZvKiBfX2ZpbmQoY29uc3Qgdm9pZCogX19vYmopOworCisgICAgLy8gQ29sbGVjdCBjb3N0IG9mIG9wZXJhdGlvbnMuCisgICAgdm9pZAorICAgIF9fb3ByX2luc2VydChjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19zaGlmdCwgc3RkOjpzaXplX3QgX19zaXplKQorICAgIHsKKyAgICAgIF9fbGlzdDJ2ZWN0b3JfaW5mbyogX19yZXMgPSBfX2dldF9vYmplY3RfaW5mbyhfX29iaik7CisgICAgICBpZiAoX19yZXMpCisJX19yZXMtPl9fb3ByX2luc2VydChfX3NoaWZ0LCBfX3NpemUpOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX29wcl9pdGVyYXRlKGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX251bSkKKyAgICB7CisgICAgICBfX2xpc3QydmVjdG9yX2luZm8qIF9fcmVzID0gX19nZXRfb2JqZWN0X2luZm8oX19vYmopOworICAgICAgaWYgKF9fcmVzKQorCV9fcmVzLT5fX29wcl9pdGVyYXRlKF9fbnVtKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19pbnZhbGlkX29wZXJhdG9yKGNvbnN0IHZvaWQqIF9fb2JqKQorICAgIHsKKyAgICAgIF9fbGlzdDJ2ZWN0b3JfaW5mbyogX19yZXMgPSBfX2dldF9vYmplY3RfaW5mbyhfX29iaik7CisgICAgICBpZiAoX19yZXMpCisJX19yZXMtPl9fc2V0X2ludmFsaWQoKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19yZXNpemUoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fZnJvbSwgc3RkOjpzaXplX3QgX190bykKKyAgICB7CisgICAgICBfX2xpc3QydmVjdG9yX2luZm8qIF9fcmVzID0gX19nZXRfb2JqZWN0X2luZm8oX19vYmopOworICAgICAgaWYgKF9fcmVzKQorCV9fcmVzLT5fX3Jlc2l6ZShfX2Zyb20sIF9fdG8pOworICAgIH0KKworICAgIGZsb2F0CisgICAgX192ZWN0b3JfY29zdChzdGQ6OnNpemVfdCBfX3NoaWZ0LCBzdGQ6OnNpemVfdCBfX2l0ZXJhdGUpCisgICAgeworICAgICAgLy8gVGhlIHJlc3VsdGluZyB2ZWN0b3Igd2lsbCB1c2UgYSAncmVzZXJ2ZScgbWV0aG9kLgorICAgICAgcmV0dXJuIChfX3NoaWZ0CisJICAgICAgKiBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX192ZWN0b3Jfc2hpZnRfY29zdF9mYWN0b3IpLl9fdmFsdWUKKwkgICAgICArIF9faXRlcmF0ZQorCSAgICAgICogX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fdmVjdG9yX2l0ZXJhdGVfY29zdF9mYWN0b3IpLl9fdmFsdWUpOyAKKyAgICB9CisKKyAgICBmbG9hdAorICAgIF9fbGlzdF9jb3N0KHN0ZDo6c2l6ZV90IF9fc2hpZnQsIHN0ZDo6c2l6ZV90IF9faXRlcmF0ZSkKKyAgICB7CisgICAgICByZXR1cm4gKF9fc2hpZnQKKwkgICAgICAqIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2xpc3Rfc2hpZnRfY29zdF9mYWN0b3IpLl9fdmFsdWUKKwkgICAgICArIF9faXRlcmF0ZQorCSAgICAgICogX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fbGlzdF9pdGVyYXRlX2Nvc3RfZmFjdG9yKS5fX3ZhbHVlKTsgCisgICAgfQorICB9OworCisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9saXN0X3RvX3ZlY3Rvcl9pbml0KCkKKyAgeyBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbGlzdF90b192ZWN0b3IpID0gbmV3IF9fdHJhY2VfbGlzdF90b192ZWN0b3IoKTsgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfbGlzdF90b192ZWN0b3JfcmVwb3J0KEZJTEUqIF9fZiwgX193YXJuaW5nX3ZlY3Rvcl90JiBfX3dhcm5pbmdzKQorICB7CisgICAgaWYgKF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19saXN0X3RvX3ZlY3RvcikpCisgICAgICB7CisJX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2xpc3RfdG9fdmVjdG9yKS0+CisJICBfX2NvbGxlY3Rfd2FybmluZ3MoX193YXJuaW5ncyk7CisJX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2xpc3RfdG9fdmVjdG9yKS0+X193cml0ZShfX2YpOworICAgICAgfQorICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9saXN0X3RvX3ZlY3Rvcl9jb25zdHJ1Y3QoY29uc3Qgdm9pZCogX19vYmopCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbGlzdF90b192ZWN0b3IpLT5fX2luc2VydChfX29iaiwgX19nZXRfc3RhY2soKSk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2Rlc3RydWN0KGNvbnN0IHZvaWQqIF9fb2JqKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2xpc3RfdG9fdmVjdG9yKS0+X19kZXN0cnVjdChfX29iaik7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2luc2VydChjb25zdCB2b2lkKiBfX29iaiwgCisJCQkJc3RkOjpzaXplX3QgX19zaGlmdCwgc3RkOjpzaXplX3QgX19zaXplKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2xpc3RfdG9fdmVjdG9yKS0+X19vcHJfaW5zZXJ0KF9fb2JqLCBfX3NoaWZ0LCAKKwkJCQkJCQkgICBfX3NpemUpOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9saXN0X3RvX3ZlY3Rvcl9pdGVyYXRlKGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX251bSA9IDEpCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbGlzdF90b192ZWN0b3IpLT5fX29wcl9pdGVyYXRlKF9fb2JqLCBfX251bSk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2ludmFsaWRfb3BlcmF0b3IoY29uc3Qgdm9pZCogX19vYmopCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbGlzdF90b192ZWN0b3IpLT5fX2ludmFsaWRfb3BlcmF0b3IoX19vYmopOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9saXN0X3RvX3ZlY3Rvcl9yZXNpemUoY29uc3Qgdm9pZCogX19vYmosIAorCQkJCXN0ZDo6c2l6ZV90IF9fZnJvbSwgc3RkOjpzaXplX3QgX190bykKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19saXN0X3RvX3ZlY3RvciktPl9fcmVzaXplKF9fb2JqLCBfX2Zyb20sIF9fdG8pOworICB9CisKK30gLy8gbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKyNlbmRpZiAvKiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX0xJU1RfVE9fVkVDVE9SX0hfXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfbWFwX3RvX3Vub3JkZXJlZF9tYXAuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX21hcF90b191bm9yZGVyZWRfbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y1NmMwNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX21hcF90b191bm9yZGVyZWRfbWFwLmgKQEAgLTAsMCArMSwyOTAgQEAKKy8vIC0qLSBDKysgLSotCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisvLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX21hcF90b191bm9yZGVyZWRfbWFwLmgKKyAqICBAYnJpZWYgRGlhZ25vc3RpY3MgZm9yIG1hcCB0byB1bm9yZGVyZWRfbWFwLgorICovCisKKy8vIFdyaXR0ZW4gYnkgU2lsdml1cyBSdXMuCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9NQVBfVE9fVU5PUkRFUkVEX01BUF9ICisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfTUFQX1RPX1VOT1JERVJFRF9NQVBfSCAxCisKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXIuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfbm9kZS5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl90cmFjZS5oIgorCituYW1lc3BhY2UgX19nbnVfcHJvZmlsZQoreworICBpbmxpbmUgaW50CisgIF9fbG9nMihzdGQ6OnNpemVfdCBfX3NpemUpCisgIHsKKyAgICBmb3IgKGludCBfX2JpdF9jb3VudCA9IHNpemVvZihzdGQ6OnNpemVfdCkgLSAxOyBfX2JpdF9jb3VudCA+PSAwOworCSAtLSBfX2JpdF9jb3VudCkgCisgICAgICBpZiAoKDIgPDwgX19iaXRfY291bnQpICYgX19zaXplKQorCXJldHVybiBfX2JpdF9jb3VudDsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlubGluZSBmbG9hdAorICBfX21hcF9pbnNlcnRfY29zdChzdGQ6OnNpemVfdCBfX3NpemUpCisgIHsgcmV0dXJuIChfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19tYXBfaW5zZXJ0X2Nvc3RfZmFjdG9yKS5fX3ZhbHVlIAorCSAgICAqIHN0YXRpY19jYXN0PGZsb2F0PihfX2xvZzIoX19zaXplKSkpOyB9CisKKyAgaW5saW5lIGZsb2F0CisgIF9fbWFwX2VyYXNlX2Nvc3Qoc3RkOjpzaXplX3QgX19zaXplKQorICB7IHJldHVybiAoX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fbWFwX2VyYXNlX2Nvc3RfZmFjdG9yKS5fX3ZhbHVlCisJICAgICogc3RhdGljX2Nhc3Q8ZmxvYXQ+KF9fbG9nMihfX3NpemUpKSk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgX19tYXBfZmluZF9jb3N0KHN0ZDo6c2l6ZV90IF9fc2l6ZSkKKyAgeyByZXR1cm4gKF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX21hcF9maW5kX2Nvc3RfZmFjdG9yKS5fX3ZhbHVlCisJICAgICogc3RhdGljX2Nhc3Q8ZmxvYXQ+KF9fbG9nMihfX3NpemUpKSk7IH0KKworICAvKiogQGJyaWVmIEEgbWFwLXRvLXVub3JkZXJlZF9tYXAgaW5zdHJ1bWVudGF0aW9uIGxpbmUgaW4gdGhlIAorICAgICAgb2JqZWN0IHRhYmxlLiAgKi8KKyAgY2xhc3MgX19tYXAydW1hcF9pbmZvCisgIDogcHVibGljIF9fb2JqZWN0X2luZm9fYmFzZQorICB7CisgIHB1YmxpYzoKKyAgICBfX21hcDJ1bWFwX2luZm8oKQorICAgIDogX01faW5zZXJ0KDApLCBfTV9lcmFzZSgwKSwgX01fZmluZCgwKSwgX01faXRlcmF0ZSgwKSwKKyAgICAgIF9NX3VtYXBfY29zdCgwLjApLCBfTV9tYXBfY29zdCgwLjApLCBfTV92YWxpZCh0cnVlKSB7IH0KKyAgICAKKyAgICBfX21hcDJ1bWFwX2luZm8oX19zdGFja190IF9fc3RhY2spCisgICAgOiBfX29iamVjdF9pbmZvX2Jhc2UoX19zdGFjayksIF9NX2luc2VydCgwKSwgX01fZXJhc2UoMCksIF9NX2ZpbmQoMCksIAorICAgICAgX01faXRlcmF0ZSgwKSwgX01fdW1hcF9jb3N0KDAuMCksIF9NX21hcF9jb3N0KDAuMCksIF9NX3ZhbGlkKHRydWUpIHsgfQorCisgICAgdmlydHVhbCB+X19tYXAydW1hcF9pbmZvKCkgeyB9CisKKyAgICBfX21hcDJ1bWFwX2luZm8oY29uc3QgX19tYXAydW1hcF9pbmZvJiBfX28pCisgICAgOiBfX29iamVjdF9pbmZvX2Jhc2UoX19vKSwgX01faW5zZXJ0KF9fby5fTV9pbnNlcnQpLAorICAgICAgX01fZXJhc2UoX19vLl9NX2VyYXNlKSwgX01fZmluZChfX28uX01fZmluZCksCisgICAgICBfTV9pdGVyYXRlKF9fby5fTV9pdGVyYXRlKSwgX01fdW1hcF9jb3N0KF9fby5fTV91bWFwX2Nvc3QpLAorICAgICAgX01fbWFwX2Nvc3QoX19vLl9NX21hcF9jb3N0KSwgX01fdmFsaWQoX19vLl9NX3ZhbGlkKSB7IH0KKworICAgIHZvaWQKKyAgICBfX21lcmdlKGNvbnN0IF9fbWFwMnVtYXBfaW5mbyYgX19vKQorICAgIHsKKyAgICAgIF9NX2luc2VydCAgICArPSBfX28uX01faW5zZXJ0OworICAgICAgX01fZXJhc2UgICAgICs9IF9fby5fTV9lcmFzZTsKKyAgICAgIF9NX2ZpbmQgICAgICArPSBfX28uX01fZmluZDsKKyAgICAgIF9NX3VtYXBfY29zdCArPSBfX28uX01fdW1hcF9jb3N0OworICAgICAgX01fbWFwX2Nvc3QgICs9IF9fby5fTV9tYXBfY29zdDsKKyAgICAgIF9NX3ZhbGlkICAgICAmPSBfX28uX01fdmFsaWQ7CisgICAgfQorCisgICAgdm9pZAorICAgIF9fd3JpdGUoRklMRSogX19mKSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6ZnByaW50ZihfX2YsICIlWnUgJVp1ICVadSAlWnUgJS4wZiAlLjBmICVzXG4iLAorCQkgICBfTV9pbnNlcnQsIF9NX2VyYXNlLCBfTV9maW5kLCBfTV9pdGVyYXRlLCBfTV9tYXBfY29zdCwKKwkJICAgX01fdW1hcF9jb3N0LCBfTV92YWxpZCA/ICJ2YWxpZCIgOiAiaW52YWxpZCIpOworICAgIH0KKworICAgIGZsb2F0CisgICAgX19tYWduaXR1ZGUoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX21hcF9jb3N0IC0gX01fdW1hcF9jb3N0OyB9CisKKyAgICBzdGQ6OnN0cmluZworICAgIF9fYWR2aWNlKCkgY29uc3QKKyAgICB7IHJldHVybiAiY2hhbmdlIHN0ZDo6bWFwIHRvIHN0ZDo6dW5vcmRlcmVkX21hcCI7IH0KKworICAgIHZvaWQKKyAgICBfX3JlY29yZF9pbnNlcnQoc3RkOjpzaXplX3QgX19zaXplLCBzdGQ6OnNpemVfdCBfX2NvdW50KQorICAgIHsKKyAgICAgIF9NX2luc2VydCArPSBfX2NvdW50OworICAgICAgX01fbWFwX2Nvc3QgKz0gX19jb3VudCAqIF9fbWFwX2luc2VydF9jb3N0KF9fc2l6ZSk7CisgICAgICBfTV91bWFwX2Nvc3QKKwkrPSAoX19jb3VudAorCSAgICAqIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX3VtYXBfaW5zZXJ0X2Nvc3RfZmFjdG9yKS5fX3ZhbHVlKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19yZWNvcmRfZXJhc2Uoc3RkOjpzaXplX3QgX19zaXplLCBzdGQ6OnNpemVfdCBfX2NvdW50KQorICAgIHsKKyAgICAgIF9NX2VyYXNlICs9IF9fY291bnQ7CisgICAgICBfTV9tYXBfY29zdCArPSBfX2NvdW50ICogX19tYXBfZXJhc2VfY29zdChfX3NpemUpOworICAgICAgX01fdW1hcF9jb3N0CisJKz0gKF9fY291bnQKKwkgICAgKiBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX191bWFwX2VyYXNlX2Nvc3RfZmFjdG9yKS5fX3ZhbHVlKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19yZWNvcmRfZmluZChzdGQ6OnNpemVfdCBfX3NpemUpCisgICAgeworICAgICAgX01fZmluZCArPSAxOworICAgICAgX01fbWFwX2Nvc3QgKz0gX19tYXBfZmluZF9jb3N0KF9fc2l6ZSk7CisgICAgICBfTV91bWFwX2Nvc3QgKz0gX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fdW1hcF9maW5kX2Nvc3RfZmFjdG9yKS5fX3ZhbHVlOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX3JlY29yZF9pdGVyYXRlKHN0ZDo6c2l6ZV90IF9fY291bnQpCisgICAgeworICAgICAgX01faXRlcmF0ZSArPSBfX2NvdW50OworICAgICAgX01fbWFwX2Nvc3QKKwkrPSAoX19jb3VudAorCSAgICAqIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX21hcF9pdGVyYXRlX2Nvc3RfZmFjdG9yKS5fX3ZhbHVlKTsKKyAgICAgIF9NX3VtYXBfY29zdAorCSs9IChfX2NvdW50CisJICAgICogX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fdW1hcF9pdGVyYXRlX2Nvc3RfZmFjdG9yKS5fX3ZhbHVlKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19yZWNvcmRfaW52YWxpZGF0ZSgpCisgICAgeyBfTV92YWxpZCA9IGZhbHNlOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnNpemVfdCBfTV9pbnNlcnQ7CisgICAgc3RkOjpzaXplX3QgX01fZXJhc2U7CisgICAgc3RkOjpzaXplX3QgX01fZmluZDsKKyAgICBzdGQ6OnNpemVfdCBfTV9pdGVyYXRlOworICAgIGZsb2F0IF9NX3VtYXBfY29zdDsKKyAgICBmbG9hdCBfTV9tYXBfY29zdDsKKyAgICBib29sICBfTV92YWxpZDsKKyAgfTsKKworCisgIC8qKiBAYnJpZWYgQSBtYXAtdG8tdW5vcmRlcmVkX21hcCBpbnN0cnVtZW50YXRpb24gbGluZSBpbiB0aGUgCisgICAgICBzdGFjayB0YWJsZS4gICovCisgIGNsYXNzIF9fbWFwMnVtYXBfc3RhY2tfaW5mbyAKKyAgOiBwdWJsaWMgX19tYXAydW1hcF9pbmZvCisgIHsKKyAgcHVibGljOgorICAgIF9fbWFwMnVtYXBfc3RhY2tfaW5mbyhjb25zdCBfX21hcDJ1bWFwX2luZm8mIF9fbykKKyAgICA6IF9fbWFwMnVtYXBfaW5mbyhfX28pIHsgfQorICB9OworCisgIC8qKiBAYnJpZWYgTWFwLXRvLXVub3JkZXJlZF9tYXAgaW5zdHJ1bWVudGF0aW9uIHByb2R1Y2VyLiAgKi8KKyAgY2xhc3MgX190cmFjZV9tYXAydW1hcAorICA6IHB1YmxpYyBfX3RyYWNlX2Jhc2U8X19tYXAydW1hcF9pbmZvLCBfX21hcDJ1bWFwX3N0YWNrX2luZm8+IAorICB7CisgIHB1YmxpYzoKKyAgICBfX3RyYWNlX21hcDJ1bWFwKCkKKyAgICA6IF9fdHJhY2VfYmFzZTxfX21hcDJ1bWFwX2luZm8sIF9fbWFwMnVtYXBfc3RhY2tfaW5mbz4oKQorICAgIHsgX19pZCA9ICJtYXAtdG8tdW5vcmRlcmVkLW1hcCI7IH0KKyAgfTsKKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2luaXQoKQorICB7IF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXAydW1hcCkgPSBuZXcgX190cmFjZV9tYXAydW1hcCgpOyB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9yZXBvcnQoRklMRSogX19mLAorCQkJCSAgICAgIF9fd2FybmluZ192ZWN0b3JfdCYgX193YXJuaW5ncykKKyAgeworICAgIGlmIChfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbWFwMnVtYXApKSAKKyAgICAgIHsKKwlfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbWFwMnVtYXApLT5fX2NvbGxlY3Rfd2FybmluZ3MoX193YXJuaW5ncyk7CisJX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX21hcDJ1bWFwKS0+X193cml0ZShfX2YpOworICAgICAgfQorICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9jb25zdHJ1Y3QoY29uc3Qgdm9pZCogX19vYmopCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbWFwMnVtYXApLT4KKyAgICAgIF9fYWRkX29iamVjdChfX29iaiwgX19tYXAydW1hcF9pbmZvKF9fZ2V0X3N0YWNrKCkpKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZGVzdHJ1Y3QoY29uc3Qgdm9pZCogX19vYmopCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbWFwMnVtYXApLT5fX3JldGlyZV9vYmplY3QoX19vYmopOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnNlcnQoY29uc3Qgdm9pZCogX19vYmosIAorCQkJCSAgICAgIHN0ZDo6c2l6ZV90IF9fc2l6ZSwgc3RkOjpzaXplX3QgX19jb3VudCkKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9fbWFwMnVtYXBfaW5mbyogX19pbmZvCisgICAgICA9IF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXAydW1hcCktPl9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKworICAgIGlmIChfX2luZm8pCisgICAgICBfX2luZm8tPl9fcmVjb3JkX2luc2VydChfX3NpemUsIF9fY291bnQpOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9lcmFzZShjb25zdCB2b2lkKiBfX29iaiwgCisJCQkJICAgICBzdGQ6OnNpemVfdCBfX3NpemUsIHN0ZDo6c2l6ZV90IF9fY291bnQpCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpIAorICAgICAgcmV0dXJuOworCisgICAgX19tYXAydW1hcF9pbmZvKiBfX2luZm8gCisgICAgICA9IF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXAydW1hcCktPl9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKworICAgIGlmIChfX2luZm8pCisgICAgICBfX2luZm8tPl9fcmVjb3JkX2VyYXNlKF9fc2l6ZSwgX19jb3VudCk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2ZpbmQoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fc2l6ZSkKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9fbWFwMnVtYXBfaW5mbyogX19pbmZvCisgICAgICA9IF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXAydW1hcCktPl9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKworICAgIGlmIChfX2luZm8pCisgICAgICBfX2luZm8tPl9fcmVjb3JkX2ZpbmQoX19zaXplKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaXRlcmF0ZShjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19jb3VudCkKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9fbWFwMnVtYXBfaW5mbyogX19pbmZvCisgICAgICA9IF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXAydW1hcCktPl9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKyAgICAKKyAgICBpZiAoX19pbmZvKQorICAgICAgX19pbmZvLT5fX3JlY29yZF9pdGVyYXRlKF9fY291bnQpOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKGNvbnN0IHZvaWQqIF9fb2JqKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX19tYXAydW1hcF9pbmZvKiBfX2luZm8KKyAgICAgID0gX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX21hcDJ1bWFwKS0+X19nZXRfb2JqZWN0X2luZm8oX19vYmopOworCisgICAgaWYgKF9faW5mbykKKyAgICAgIF9faW5mby0+X19yZWNvcmRfaW52YWxpZGF0ZSgpOworICB9CisKK30gLy8gbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKyNlbmRpZiAvKiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX01BUF9UT19VTk9SREVSRURfTUFQX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX25vZGUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX25vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2VjYTMxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfbm9kZS5oCkBAIC0wLDAgKzEsMTY2IEBACisvLyAtKi0gQysrIC0qLQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvaW1wbC9wcm9maWxlcl9ub2RlLmgKKyAqICBAYnJpZWYgRGF0YSBzdHJ1Y3R1cmVzIHRvIHJlcHJlc2VudCBhIHNpbmdsZSBwcm9maWxpbmcgZXZlbnQuCisgKi8KKworLy8gV3JpdHRlbiBieSBMaXhpYSBMaXUgYW5kIFNpbHZpdXMgUnVzLgorCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfTk9ERV9ICisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfTk9ERV9IIDEKKworI2luY2x1ZGUgPGNzdGRpbz4gLy8gRklMRSwgZnByaW50ZgorCisjaW5jbHVkZSA8dmVjdG9yPgorI2lmIGRlZmluZWQgX0dMSUJDWFhfSEFWRV9FWEVDSU5GT19ICisjaW5jbHVkZSA8ZXhlY2luZm8uaD4KKyNlbmRpZgorCituYW1lc3BhY2UgX19nbnVfcHJvZmlsZQoreworICB0eXBlZGVmIGNvbnN0IHZvaWQqIF9fb2JqZWN0X3Q7CisgIHR5cGVkZWYgdm9pZCogX19pbnN0cnVjdGlvbl9hZGRyZXNzX3Q7CisgIHR5cGVkZWYgc3RkOjpfR0xJQkNYWF9TVERfQzo6dmVjdG9yPF9faW5zdHJ1Y3Rpb25fYWRkcmVzc190PiBfX3N0YWNrX25wdDsKKyAgdHlwZWRlZiBfX3N0YWNrX25wdCogX19zdGFja190OworCisgIHN0ZDo6c2l6ZV90IF9fc3RhY2tfbWF4X2RlcHRoKCk7CisKKyAgaW5saW5lIF9fc3RhY2tfdAorICBfX2dldF9zdGFjaygpCisgIHsKKyNpZiBkZWZpbmVkIF9HTElCQ1hYX0hBVkVfRVhFQ0lORk9fSAorICAgIHN0ZDo6c2l6ZV90IF9fbWF4X2RlcHRoID0gX19zdGFja19tYXhfZGVwdGgoKTsKKyAgICBpZiAoX19tYXhfZGVwdGggPT0gMCkKKyAgICAgIHJldHVybiAwOworICAgIF9fc3RhY2tfbnB0IF9fYnVmZmVyKF9fbWF4X2RlcHRoKTsKKyAgICBpbnQgX19kZXB0aCA9IGJhY2t0cmFjZSgmX19idWZmZXJbMF0sIF9fbWF4X2RlcHRoKTsKKyAgICBfX3N0YWNrX3QgX19zdGFjayA9IG5ldyBfX3N0YWNrX25wdChfX2RlcHRoKTsKKyAgICBfX2J1aWx0aW5fbWVtY3B5KCYoKl9fc3RhY2spWzBdLCAmX19idWZmZXJbMF0sCisJCSAgICAgX19kZXB0aCAqIHNpemVvZihfX29iamVjdF90KSk7CisgICAgcmV0dXJuIF9fc3RhY2s7CisjZWxzZQorICAgIHJldHVybiAwOworI2VuZGlmCisgIH0KKworICBpbmxpbmUgc3RkOjpzaXplX3QKKyAgX19zaXplKF9fc3RhY2tfdCBfX3N0YWNrKQorICB7CisgICAgaWYgKCFfX3N0YWNrKQorICAgICAgcmV0dXJuIDA7CisgICAgZWxzZQorICAgICAgcmV0dXJuIF9fc3RhY2stPnNpemUoKTsKKyAgfQorCisgIC8vIFhYWAorICBpbmxpbmUgdm9pZAorICBfX3dyaXRlKEZJTEUqIF9fZiwgX19zdGFja190IF9fc3RhY2spCisgIHsKKyAgICBpZiAoIV9fc3RhY2spCisgICAgICByZXR1cm47CisgIAorICAgIF9fc3RhY2tfbnB0Ojpjb25zdF9pdGVyYXRvciBfX2l0OworICAgIGZvciAoX19pdCA9IF9fc3RhY2stPmJlZ2luKCk7IF9faXQgIT0gX19zdGFjay0+ZW5kKCk7ICsrX19pdCkKKyAgICAgIHN0ZDo6ZnByaW50ZihfX2YsICIlcCAiLCAqX19pdCk7CisgIH0KKworICAvKiogQGJyaWVmIEhhc2ggZnVuY3Rpb24gZm9yIHN1bW1hcnkgdHJhY2UgdXNpbmcgY2FsbCBzdGFjayBhcyBpbmRleC4gICovCisgIGNsYXNzIF9fc3RhY2tfaGFzaCAKKyAgeworICBwdWJsaWM6CisgICAgc3RkOjpzaXplX3QKKyAgICBvcGVyYXRvcigpKF9fc3RhY2tfdCBfX3MpIGNvbnN0CisgICAgeworICAgICAgaWYgKCFfX3MpIAorCXJldHVybiAwOworCisgICAgICBzdGQ6OnNpemVfdCBfX2luZGV4ID0gMDsKKyAgICAgIF9fc3RhY2tfbnB0Ojpjb25zdF9pdGVyYXRvciBfX2l0OworICAgICAgZm9yIChfX2l0ID0gX19zLT5iZWdpbigpOyBfX2l0ICE9IF9fcy0+ZW5kKCk7ICsrX19pdCkKKwlfX2luZGV4ICs9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjpzaXplX3Q+KCpfX2l0KTsKKyAgICAgIHJldHVybiBfX2luZGV4OworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IoKSAoX19zdGFja190IF9fc3RhY2sxLCBfX3N0YWNrX3QgX19zdGFjazIpIGNvbnN0CisgICAgeworICAgICAgaWYgKCFfX3N0YWNrMSAmJiAhX19zdGFjazIpCisJcmV0dXJuIHRydWU7CisgICAgICBpZiAoIV9fc3RhY2sxIHx8ICFfX3N0YWNrMikKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpZiAoX19zdGFjazEtPnNpemUoKSAhPSBfX3N0YWNrMi0+c2l6ZSgpKQorCXJldHVybiBmYWxzZTsKKworICAgICAgc3RkOjpzaXplX3QgX19ieXRlX3NpemUKKwk9IF9fc3RhY2sxLT5zaXplKCkgKiBzaXplb2YoX19zdGFja19ucHQ6OnZhbHVlX3R5cGUpOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9tZW1jbXAoJigqX19zdGFjazEpWzBdLCAmKCpfX3N0YWNrMilbMF0sCisJCQkgICAgICBfX2J5dGVfc2l6ZSkgPT0gMDsKKyAgICB9CisgIH07CisKKworICAvKiogQGJyaWVmIEJhc2UgY2xhc3MgZm9yIGEgbGluZSBpbiB0aGUgb2JqZWN0IHRhYmxlLiAgKi8KKyAgY2xhc3MgX19vYmplY3RfaW5mb19iYXNlCisgIHsKKyAgcHVibGljOgorICAgIF9fb2JqZWN0X2luZm9fYmFzZSgpIHsgfQorCisgICAgX19vYmplY3RfaW5mb19iYXNlKF9fc3RhY2tfdCBfX3N0YWNrKQorICAgIDogX01fc3RhY2soX19zdGFjayksIF9NX3ZhbGlkKHRydWUpIHsgfQorCisgICAgX19vYmplY3RfaW5mb19iYXNlKGNvbnN0IF9fb2JqZWN0X2luZm9fYmFzZSYgX19vKQorICAgIDogX01fc3RhY2soX19vLl9NX3N0YWNrKSwgX01fdmFsaWQoX19vLl9NX3ZhbGlkKSB7IH0KKworICAgIHZpcnR1YWwgfl9fb2JqZWN0X2luZm9fYmFzZSgpIHsgfQorCisgICAgYm9vbAorICAgIF9faXNfdmFsaWQoKSBjb25zdCAKKyAgICB7IHJldHVybiBfTV92YWxpZDsgfQorICAgIAorICAgIF9fc3RhY2tfdAorICAgIF9fc3RhY2soKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3N0YWNrOyB9CisgICAgCisgICAgdmlydHVhbCB2b2lkIF9fd3JpdGUoRklMRSogX19mKSBjb25zdCA9IDA7CisKKyAgcHJvdGVjdGVkOgorICAgIF9fc3RhY2tfdCBfTV9zdGFjazsKKyAgICBib29sIF9NX3ZhbGlkOworICB9OworCisKKyAgLyoqIEBicmllZiBCYXNlIGNsYXNzIGZvciBhIGxpbmUgaW4gdGhlIHN0YWNrIHRhYmxlLiAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX19vYmplY3RfaW5mbz4KKyAgICBjbGFzcyBfX3N0YWNrX2luZm9fYmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBfX3N0YWNrX2luZm9fYmFzZSgpIHsgfQorICAgICAgX19zdGFja19pbmZvX2Jhc2UoY29uc3QgX19vYmplY3RfaW5mbyYgX19pbmZvKSA9IDA7CisgICAgICB2aXJ0dWFsIH5fX3N0YWNrX2luZm9fYmFzZSgpIHt9CisgICAgICB2b2lkIF9fbWVyZ2UoY29uc3QgX19vYmplY3RfaW5mbyYgX19pbmZvKSA9IDA7CisgICAgICB2aXJ0dWFsIGZsb2F0IF9fbWFnbml0dWRlKCkgY29uc3QgPSAwOworICAgICAgdmlydHVhbCBjb25zdCBjaGFyKiBfX2dldF9pZCgpIGNvbnN0ID0gMDsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wcm9maWxlCisjZW5kaWYgLyogX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9OT0RFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3N0YXRlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl9zdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Mzk3MDQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl9zdGF0ZS5oCkBAIC0wLDAgKzEsNjkgQEAKKy8vIC0qLSBDKysgLSotCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisvLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3N0YXRlLmgKKyAqICBAYnJpZWYgR2xvYmFsIHByb2ZpbGVyIHN0YXRlLgorICovCisKKy8vIFdyaXR0ZW4gYnkgTGl4aWEgTGl1IGFuZCBTaWx2aXVzIFJ1cy4KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX1NUQVRFX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9TVEFURV9IIDEKKworbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKK3sKKyAgZW51bSBfX3N0YXRlX3R5cGUgeyBfX09OLCBfX09GRiwgX19JTlZBTElEIH07CisKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX3N0YXRlX3R5cGUsIF9fc3RhdGUsIF9fSU5WQUxJRCk7CisKKyAgaW5saW5lIGJvb2wKKyAgX190dXJuKF9fc3RhdGVfdHlwZSBfX3MpCisgIHsgCisgICAgX19zdGF0ZV90eXBlIGludihfX0lOVkFMSUQpOworICAgIHJldHVybiBfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX24oJl9HTElCQ1hYX1BST0ZJTEVfREFUQShfX3N0YXRlKSwKKwkJCQkgICAgICAgJmludiwgX19zLCBmYWxzZSwgX19BVE9NSUNfQUNRX1JFTCwgCisJCQkJICAgICAgIF9fQVRPTUlDX1JFTEFYRUQpOworICB9CisKKyAgaW5saW5lIGJvb2wKKyAgX190dXJuX29uKCkKKyAgeyByZXR1cm4gX190dXJuKF9fT04pOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgX190dXJuX29mZigpCisgIHsgcmV0dXJuIF9fdHVybihfX09GRik7IH0KKworICBpbmxpbmUgYm9vbAorICBfX2lzX29uKCkKKyAgeyByZXR1cm4gX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fc3RhdGUpID09IF9fT047IH0KKworICBpbmxpbmUgYm9vbAorICBfX2lzX29mZigpCisgIHsgcmV0dXJuIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX3N0YXRlKSA9PSBfX09GRjsgfQorCisgIGlubGluZSBib29sCisgIF9faXNfaW52YWxpZCgpCisgIHsgcmV0dXJuIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX3N0YXRlKSA9PSBfX0lOVkFMSUQ7IH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKyNlbmRpZiAvKiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX1NUQVRFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3RyYWNlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl90cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1OTA3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl90cmFjZS5oCkBAIC0wLDAgKzEsNjU5IEBACisvLyAtKi0gQysrIC0qLQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvaW1wbC9wcm9maWxlcl90cmFjZS5oCisgKiAgQGJyaWVmIERhdGEgc3RydWN0dXJlcyB0byByZXByZXNlbnQgcHJvZmlsaW5nIHRyYWNlcy4KKyAqLworCisvLyBXcml0dGVuIGJ5IExpeGlhIExpdSBhbmQgU2lsdml1cyBSdXMuCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9UUkFDRV9ICisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfVFJBQ0VfSCAxCisKKyNpbmNsdWRlIDxjc3RkaW8+ICAvLyBmb3BlbiwgZmNsb3NlLCBmcHJpbnRmLCBGSUxFCisjaW5jbHVkZSA8Y2Vycm5vPgorI2luY2x1ZGUgPGNzdGRsaWI+IC8vIGF0b2YsIGF0b2ksIHN0cnRvbCwgZ2V0ZW52LCBhdGV4aXQsIGFib3J0CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjZGVmaW5lIF9HTElCQ1hYX0lNUExfVU5PUkRFUkVEX01BUCBzdGQ6Ol9HTElCQ1hYX1NURF9DOjp1bm9yZGVyZWRfbWFwCisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNlbHNlCisjaW5jbHVkZSA8dHIxL3Vub3JkZXJlZF9tYXA+CisjZGVmaW5lIF9HTElCQ1hYX0lNUExfVU5PUkRFUkVEX01BUCBzdGQ6OnRyMTo6dW5vcmRlcmVkX21hcAorI2VuZGlmCisKKyNpbmNsdWRlIDxleHQvY29uY3VycmVuY2UuaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl9hbGdvcy5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl9zdGF0ZS5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl9ub2RlLmgiCisKK25hbWVzcGFjZSBfX2dudV9wcm9maWxlCit7CisgIC8qKiBAYnJpZWYgSW50ZXJuYWwgZW52aXJvbm1lbnQuICBWYWx1ZXMgY2FuIGJlIHNldCBvbmUgb2YgdHdvIHdheXM6CisgICAgICAxLiBJbiBjb25maWcgZmlsZSAidmFyID0gdmFsdWUiLiAgVGhlIGRlZmF1bHQgY29uZmlnIGZpbGUgcGF0aCBpcyAKKyAgICAgICAgIGxpYnN0ZGN4eC1wcm9maWxlLmNvbmYuCisgICAgICAyLiBCeSBzZXR0aW5nIHByb2Nlc3MgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgRm9yIGluc3RhbmNlLCBpbiBhIEJhc2gKKyAgICAgICAgIHNoZWxsIHlvdSBjYW4gc2V0IHRoZSB1bml0IGNvc3Qgb2YgaXRlcmF0aW5nIHRocm91Z2ggYSBtYXAgbGlrZSB0aGlzOgorICAgICAgICAgZXhwb3J0IF9fbWFwX2l0ZXJhdGVfY29zdF9mYWN0b3I9NS4wLgorCSBJZiBhIHZhbHVlIGlzIHNldCBib3RoIGluIHRoZSBpbnB1dCBmaWxlIGFuZCB0aHJvdWdoIGFuIGVudmlyb25tZW50CisJIHZhcmlhYmxlLCB0aGUgZW52aXJvbm1lbnQgdmFsdWUgdGFrZXMgcHJlY2VkZW5jZS4gICovCisgIHR5cGVkZWYgX0dMSUJDWFhfSU1QTF9VTk9SREVSRURfTUFQPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gX19lbnZfdDsKKworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9VTklOSVRfREFUQShfX2Vudl90LCBfX2Vudik7CisKKyAgLyoqIEBicmllZiBNYXN0ZXIgbG9jay4gICovCisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX1VOSU5JVF9EQVRBKF9fZ251X2N4eDo6X19tdXRleCwgX19nbG9iYWxfbG9jayk7CisKKyAgLyoqIEBicmllZiBSZXByZXNlbnRhdGlvbiBvZiBhIHdhcm5pbmcuICAqLworICBzdHJ1Y3QgX193YXJuaW5nX2RhdGEKKyAgeworICAgIGZsb2F0IF9fbWFnbml0dWRlOworICAgIF9fc3RhY2tfdCBfX2NvbnRleHQ7CisgICAgY29uc3QgY2hhciogX193YXJuaW5nX2lkOworICAgIHN0ZDo6c3RyaW5nIF9fd2FybmluZ19tZXNzYWdlOworCisgICAgX193YXJuaW5nX2RhdGEoKQorICAgIDogX19tYWduaXR1ZGUoMC4wKSwgX19jb250ZXh0KDApLCBfX3dhcm5pbmdfaWQoMCkgeyB9CisKKyAgICBfX3dhcm5pbmdfZGF0YShmbG9hdCBfX20sIF9fc3RhY2tfdCBfX2MsIGNvbnN0IGNoYXIqIF9faWQsIAorCQkgICBjb25zdCBzdGQ6OnN0cmluZyYgX19tc2cpCisgICAgOiBfX21hZ25pdHVkZShfX20pLCBfX2NvbnRleHQoX19jKSwgX193YXJuaW5nX2lkKF9faWQpLCAKKyAgICAgIF9fd2FybmluZ19tZXNzYWdlKF9fbXNnKSB7IH0KKworICAgIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgX193YXJuaW5nX2RhdGEmIF9fb3RoZXIpIGNvbnN0CisgICAgeyByZXR1cm4gX19tYWduaXR1ZGUgPCBfX290aGVyLl9fbWFnbml0dWRlOyB9CisgIH07CisKKyAgdHlwZWRlZiBzdGQ6Ol9HTElCQ1hYX1NURF9DOjp2ZWN0b3I8X193YXJuaW5nX2RhdGE+IF9fd2FybmluZ192ZWN0b3JfdDsKKworICAvLyBEZWZpbmVkIGluIHByb2ZpbGVyXzxkaWFnbm9zdGljIG5hbWU+LmguCisgIGNsYXNzIF9fdHJhY2VfaGFzaF9mdW5jOworICBjbGFzcyBfX3RyYWNlX2hhc2h0YWJsZV9zaXplOworICBjbGFzcyBfX3RyYWNlX21hcDJ1bWFwOworICBjbGFzcyBfX3RyYWNlX3ZlY3Rvcl9zaXplOworICBjbGFzcyBfX3RyYWNlX3ZlY3Rvcl90b19saXN0OworICBjbGFzcyBfX3RyYWNlX2xpc3RfdG9fc2xpc3Q7IAorICBjbGFzcyBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yOyAKKyAgdm9pZCBfX3RyYWNlX3ZlY3Rvcl9zaXplX2luaXQoKTsKKyAgdm9pZCBfX3RyYWNlX2hhc2h0YWJsZV9zaXplX2luaXQoKTsKKyAgdm9pZCBfX3RyYWNlX2hhc2hfZnVuY19pbml0KCk7CisgIHZvaWQgX190cmFjZV92ZWN0b3JfdG9fbGlzdF9pbml0KCk7CisgIHZvaWQgX190cmFjZV9saXN0X3RvX3NsaXN0X2luaXQoKTsgIAorICB2b2lkIF9fdHJhY2VfbGlzdF90b192ZWN0b3JfaW5pdCgpOyAgCisgIHZvaWQgX190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbml0KCk7CisgIHZvaWQgX190cmFjZV92ZWN0b3Jfc2l6ZV9yZXBvcnQoRklMRSosIF9fd2FybmluZ192ZWN0b3JfdCYpOworICB2b2lkIF9fdHJhY2VfaGFzaHRhYmxlX3NpemVfcmVwb3J0KEZJTEUqLCBfX3dhcm5pbmdfdmVjdG9yX3QmKTsKKyAgdm9pZCBfX3RyYWNlX2hhc2hfZnVuY19yZXBvcnQoRklMRSosIF9fd2FybmluZ192ZWN0b3JfdCYpOworICB2b2lkIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfcmVwb3J0KEZJTEUqLCBfX3dhcm5pbmdfdmVjdG9yX3QmKTsKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fc2xpc3RfcmVwb3J0KEZJTEUqLCBfX3dhcm5pbmdfdmVjdG9yX3QmKTsgCisgIHZvaWQgX190cmFjZV9saXN0X3RvX3ZlY3Rvcl9yZXBvcnQoRklMRSosIF9fd2FybmluZ192ZWN0b3JfdCYpOworICB2b2lkIF9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfcmVwb3J0KEZJTEUqLCBfX3dhcm5pbmdfdmVjdG9yX3QmKTsKKworICBzdHJ1Y3QgX19jb3N0X2ZhY3RvcgorICB7CisgICAgY29uc3QgY2hhciogX19lbnZfdmFyOworICAgIGZsb2F0IF9fdmFsdWU7CisgIH07CisKKyAgdHlwZWRlZiBzdGQ6Ol9HTElCQ1hYX1NURF9DOjp2ZWN0b3I8X19jb3N0X2ZhY3Rvcio+IF9fY29zdF9mYWN0b3JfdmVjdG9yOworCisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX190cmFjZV9oYXNoX2Z1bmMqLCBfU19oYXNoX2Z1bmMsIDApOworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fdHJhY2VfaGFzaHRhYmxlX3NpemUqLCBfU19oYXNodGFibGVfc2l6ZSwgMCk7CisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX190cmFjZV9tYXAydW1hcCosIF9TX21hcDJ1bWFwLCAwKTsKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX3RyYWNlX3ZlY3Rvcl9zaXplKiwgX1NfdmVjdG9yX3NpemUsIDApOworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fdHJhY2VfdmVjdG9yX3RvX2xpc3QqLCBfU192ZWN0b3JfdG9fbGlzdCwgMCk7CisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX190cmFjZV9saXN0X3RvX3NsaXN0KiwgX1NfbGlzdF90b19zbGlzdCwgMCk7IAorICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fdHJhY2VfbGlzdF90b192ZWN0b3IqLCBfU19saXN0X3RvX3ZlY3RvciwgMCk7CisKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX2Nvc3RfZmFjdG9yLCBfX3ZlY3Rvcl9zaGlmdF9jb3N0X2ZhY3RvciwgCisJCQkgICAgICAgeyJfX3ZlY3Rvcl9zaGlmdF9jb3N0X2ZhY3RvciIsIDEuMH0pOworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fY29zdF9mYWN0b3IsIF9fdmVjdG9yX2l0ZXJhdGVfY29zdF9mYWN0b3IsCisJCQkgICAgICAgeyJfX3ZlY3Rvcl9pdGVyYXRlX2Nvc3RfZmFjdG9yIiwgMS4wfSk7CisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX19jb3N0X2ZhY3RvciwgX192ZWN0b3JfcmVzaXplX2Nvc3RfZmFjdG9yLAorCQkJICAgICAgIHsiX192ZWN0b3JfcmVzaXplX2Nvc3RfZmFjdG9yIiwgMS4wfSk7IAorICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fY29zdF9mYWN0b3IsIF9fbGlzdF9zaGlmdF9jb3N0X2ZhY3RvciwKKwkJCSAgICAgICB7Il9fbGlzdF9zaGlmdF9jb3N0X2ZhY3RvciIsIDAuMH0pOworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fY29zdF9mYWN0b3IsIF9fbGlzdF9pdGVyYXRlX2Nvc3RfZmFjdG9yLAorCQkJICAgICAgIHsiX19saXN0X2l0ZXJhdGVfY29zdF9mYWN0b3IiLCAxMC4wfSk7IAorICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fY29zdF9mYWN0b3IsIF9fbGlzdF9yZXNpemVfY29zdF9mYWN0b3IsCisJCQkgICAgICAgeyJfX2xpc3RfcmVzaXplX2Nvc3RfZmFjdG9yIiwgMC4wfSk7IAorICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fY29zdF9mYWN0b3IsIF9fbWFwX2luc2VydF9jb3N0X2ZhY3RvciwKKwkJCSAgICAgICB7Il9fbWFwX2luc2VydF9jb3N0X2ZhY3RvciIsIDEuNX0pOworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fY29zdF9mYWN0b3IsIF9fbWFwX2VyYXNlX2Nvc3RfZmFjdG9yLAorCQkJICAgICAgIHsiX19tYXBfZXJhc2VfY29zdF9mYWN0b3IiLCAxLjV9KTsKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX2Nvc3RfZmFjdG9yLCBfX21hcF9maW5kX2Nvc3RfZmFjdG9yLAorCQkJICAgICAgIHsiX19tYXBfZmluZF9jb3N0X2ZhY3RvciIsIDF9KTsKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX2Nvc3RfZmFjdG9yLCBfX21hcF9pdGVyYXRlX2Nvc3RfZmFjdG9yLAorCQkJICAgICAgIHsiX19tYXBfaXRlcmF0ZV9jb3N0X2ZhY3RvciIsIDIuM30pOworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fY29zdF9mYWN0b3IsIF9fdW1hcF9pbnNlcnRfY29zdF9mYWN0b3IsCisJCQkgICAgICAgeyJfX3VtYXBfaW5zZXJ0X2Nvc3RfZmFjdG9yIiwgMTIuMH0pOworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fY29zdF9mYWN0b3IsIF9fdW1hcF9lcmFzZV9jb3N0X2ZhY3RvciwKKwkJCSAgICAgICB7Il9fdW1hcF9lcmFzZV9jb3N0X2ZhY3RvciIsIDEyLjB9KTsKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX2Nvc3RfZmFjdG9yLCBfX3VtYXBfZmluZF9jb3N0X2ZhY3RvciwKKwkJCSAgICAgICB7Il9fdW1hcF9maW5kX2Nvc3RfZmFjdG9yIiwgMTAuMH0pOworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fY29zdF9mYWN0b3IsIF9fdW1hcF9pdGVyYXRlX2Nvc3RfZmFjdG9yLAorCQkJICAgICAgIHsiX191bWFwX2l0ZXJhdGVfY29zdF9mYWN0b3IiLCAxLjd9KTsKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX2Nvc3RfZmFjdG9yX3ZlY3RvciosIF9fY29zdF9mYWN0b3JzLCAwKTsKKworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKGNvbnN0IGNoYXIqLCBfU190cmFjZV9maWxlX25hbWUsCisJCQkgICAgICAgX0dMSUJDWFhfUFJPRklMRV9UUkFDRV9QQVRIX1JPT1QpOworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKHN0ZDo6c2l6ZV90LCBfU19tYXhfd2Fybl9jb3VudCwKKwkJCSAgICAgICBfR0xJQkNYWF9QUk9GSUxFX01BWF9XQVJOX0NPVU5UKTsKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShzdGQ6OnNpemVfdCwgX1NfbWF4X3N0YWNrX2RlcHRoLAorCQkJICAgICAgIF9HTElCQ1hYX1BST0ZJTEVfTUFYX1NUQUNLX0RFUFRIKTsKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShzdGQ6OnNpemVfdCwgX1NfbWF4X21lbSwKKwkJCSAgICAgICBfR0xJQkNYWF9QUk9GSUxFX01FTV9QRVJfRElBR05PU1RJQyk7CisKKyAgaW5saW5lIHN0ZDo6c2l6ZV90CisgIF9fc3RhY2tfbWF4X2RlcHRoKCkKKyAgeyByZXR1cm4gX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX21heF9zdGFja19kZXB0aCk7IH0KKworICBpbmxpbmUgc3RkOjpzaXplX3QKKyAgX19tYXhfbWVtKCkKKyAgeyByZXR1cm4gX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX21heF9tZW0pOyB9CisKKyAgLyoqIEBicmllZiBCYXNlIGNsYXNzIGZvciBhbGwgdHJhY2UgcHJvZHVjZXJzLiAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX19vYmplY3RfaW5mbywgdHlwZW5hbWUgX19zdGFja19pbmZvPgorICAgIGNsYXNzIF9fdHJhY2VfYmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBEbyBub3QgcGljayB0aGUgaW5pdGlhbCBzaXplIHRvbyBsYXJnZSwgYXMgd2UgZG9uJ3Qga25vdyB3aGljaAorICAgICAgLy8gZGlhZ25vc3RpY3MgYXJlIG1vcmUgYWN0aXZlLgorICAgICAgX190cmFjZV9iYXNlKCkKKyAgICAgIDogX19vYmplY3RfdGFibGUoMTAwMDApLCBfX3N0YWNrX3RhYmxlKDEwMDAwKSwKKwlfX3N0YWNrX3RhYmxlX2J5dGVfc2l6ZSgwKSwgX19pZCgwKSB7IH0KKworICAgICAgdmlydHVhbCB+X190cmFjZV9iYXNlKCkgeyB9CisKKyAgICAgIHZvaWQgX19hZGRfb2JqZWN0KF9fb2JqZWN0X3Qgb2JqZWN0LCBfX29iamVjdF9pbmZvIF9faW5mbyk7CisgICAgICBfX29iamVjdF9pbmZvKiBfX2dldF9vYmplY3RfaW5mbyhfX29iamVjdF90IF9fb2JqZWN0KTsKKyAgICAgIHZvaWQgX19yZXRpcmVfb2JqZWN0KF9fb2JqZWN0X3QgX19vYmplY3QpOworICAgICAgdm9pZCBfX3dyaXRlKEZJTEUqIF9fZik7CisgICAgICB2b2lkIF9fY29sbGVjdF93YXJuaW5ncyhfX3dhcm5pbmdfdmVjdG9yX3QmIF9fd2FybmluZ3MpOworCisgICAgcHJpdmF0ZToKKyAgICAgIF9fZ251X2N4eDo6X19tdXRleCBfX29iamVjdF90YWJsZV9sb2NrOworICAgICAgX19nbnVfY3h4OjpfX211dGV4IF9fc3RhY2tfdGFibGVfbG9jazsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfSU1QTF9VTk9SREVSRURfTUFQPF9fb2JqZWN0X3QsIAorCQkJCQkgIF9fb2JqZWN0X2luZm8+IF9fb2JqZWN0X3RhYmxlX3Q7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX0lNUExfVU5PUkRFUkVEX01BUDxfX3N0YWNrX3QsIF9fc3RhY2tfaW5mbywKKwkJCQkJICBfX3N0YWNrX2hhc2gsIAorCQkJCQkgIF9fc3RhY2tfaGFzaD4gX19zdGFja190YWJsZV90OworICAgICAgX19vYmplY3RfdGFibGVfdCBfX29iamVjdF90YWJsZTsKKyAgICAgIF9fc3RhY2tfdGFibGVfdCBfX3N0YWNrX3RhYmxlOworICAgICAgc3RkOjpzaXplX3QgX19zdGFja190YWJsZV9ieXRlX3NpemU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBjb25zdCBjaGFyKiBfX2lkOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX19vYmplY3RfaW5mbywgdHlwZW5hbWUgX19zdGFja19pbmZvPgorICAgIHZvaWQKKyAgICBfX3RyYWNlX2Jhc2U8X19vYmplY3RfaW5mbywgX19zdGFja19pbmZvPjo6CisgICAgX19jb2xsZWN0X3dhcm5pbmdzKF9fd2FybmluZ192ZWN0b3JfdCYgX193YXJuaW5ncykKKyAgICB7CisgICAgICBmb3IgKHR5cGVuYW1lIF9fc3RhY2tfdGFibGVfdDo6aXRlcmF0b3IgX19pdAorCSAgICAgPSBfX3N0YWNrX3RhYmxlLmJlZ2luKCk7IF9faXQgIT0gX19zdGFja190YWJsZS5lbmQoKTsgKytfX2l0KQorCV9fd2FybmluZ3MucHVzaF9iYWNrKF9fd2FybmluZ19kYXRhKCgqX19pdCkuc2Vjb25kLl9fbWFnbml0dWRlKCksCisJCQkJCSAgICAoKl9faXQpLmZpcnN0LCBfX2lkLAorCQkJCQkgICAgKCpfX2l0KS5zZWNvbmQuX19hZHZpY2UoKSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfX29iamVjdF9pbmZvLCB0eXBlbmFtZSBfX3N0YWNrX2luZm8+CisgICAgdm9pZAorICAgIF9fdHJhY2VfYmFzZTxfX29iamVjdF9pbmZvLCBfX3N0YWNrX2luZm8+OjoKKyAgICBfX2FkZF9vYmplY3QoX19vYmplY3RfdCBfX29iamVjdCwgX19vYmplY3RfaW5mbyBfX2luZm8pCisgICAgeworICAgICAgaWYgKF9fbWF4X21lbSgpID09IDAgCisJICB8fCBfX29iamVjdF90YWJsZS5zaXplKCkgKiBzaXplb2YoX19vYmplY3RfaW5mbykgPD0gX19tYXhfbWVtKCkpCisJeworCSAgdGhpcy0+X19vYmplY3RfdGFibGVfbG9jay5sb2NrKCk7CisJICBfX29iamVjdF90YWJsZS5pbnNlcnQodHlwZW5hbWUgX19vYmplY3RfdGFibGVfdDo6CisJCQkJdmFsdWVfdHlwZShfX29iamVjdCwgX19pbmZvKSk7CisJICB0aGlzLT5fX29iamVjdF90YWJsZV9sb2NrLnVubG9jaygpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX19vYmplY3RfaW5mbywgdHlwZW5hbWUgX19zdGFja19pbmZvPgorICAgIF9fb2JqZWN0X2luZm8qCisgICAgX190cmFjZV9iYXNlPF9fb2JqZWN0X2luZm8sIF9fc3RhY2tfaW5mbz46OgorICAgIF9fZ2V0X29iamVjdF9pbmZvKF9fb2JqZWN0X3QgX19vYmplY3QpCisgICAgeworICAgICAgLy8gWFhYOiBSZXZpc2l0IHRoaXMgdG8gc2VlIGlmIHdlIGNhbiBkZWNyZWFzZSBtdXRleCBzcGFucy4KKyAgICAgIC8vIFdpdGhvdXQgdGhpcyBtdXRleCwgdGhlIG9iamVjdCB0YWJsZSBjb3VsZCBiZSByZWhhc2hlZCBkdXJpbmcgYW4KKyAgICAgIC8vIGluc2VydGlvbiBvbiBhbm90aGVyIHRocmVhZCwgd2hpY2ggY291bGQgcmVzdWx0IGluIGEgc2VnZmF1bHQuCisgICAgICB0aGlzLT5fX29iamVjdF90YWJsZV9sb2NrLmxvY2soKTsKKyAgICAgIHR5cGVuYW1lIF9fb2JqZWN0X3RhYmxlX3Q6Oml0ZXJhdG9yIF9fb2JqZWN0X2l0CisJPSAgX19vYmplY3RfdGFibGUuZmluZChfX29iamVjdCk7CisKKyAgICAgIGlmIChfX29iamVjdF9pdCA9PSBfX29iamVjdF90YWJsZS5lbmQoKSkKKwl7CisJICB0aGlzLT5fX29iamVjdF90YWJsZV9sb2NrLnVubG9jaygpOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHRoaXMtPl9fb2JqZWN0X3RhYmxlX2xvY2sudW5sb2NrKCk7CisJICByZXR1cm4gJl9fb2JqZWN0X2l0LT5zZWNvbmQ7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfX29iamVjdF9pbmZvLCB0eXBlbmFtZSBfX3N0YWNrX2luZm8+CisgICAgdm9pZAorICAgIF9fdHJhY2VfYmFzZTxfX29iamVjdF9pbmZvLCBfX3N0YWNrX2luZm8+OjoKKyAgICBfX3JldGlyZV9vYmplY3QoX19vYmplY3RfdCBfX29iamVjdCkKKyAgICB7CisgICAgICB0aGlzLT5fX29iamVjdF90YWJsZV9sb2NrLmxvY2soKTsKKyAgICAgIHRoaXMtPl9fc3RhY2tfdGFibGVfbG9jay5sb2NrKCk7CisgICAgICB0eXBlbmFtZSBfX29iamVjdF90YWJsZV90OjppdGVyYXRvciBfX29iamVjdF9pdAorCT0gX19vYmplY3RfdGFibGUuZmluZChfX29iamVjdCk7CisgIAorICAgICAgaWYgKF9fb2JqZWN0X2l0ICE9IF9fb2JqZWN0X3RhYmxlLmVuZCgpKQorCXsKKwkgIGNvbnN0IF9fb2JqZWN0X2luZm8mIF9faW5mbyA9IF9fb2JqZWN0X2l0LT5zZWNvbmQ7CisJICBjb25zdCBfX3N0YWNrX3QmIF9fc3RhY2sgPSBfX2luZm8uX19zdGFjaygpOworCSAgdHlwZW5hbWUgX19zdGFja190YWJsZV90OjppdGVyYXRvciBfX3N0YWNrX2l0CisJICAgID0gX19zdGFja190YWJsZS5maW5kKF9fc3RhY2spOworICAgIAorCSAgaWYgKF9fc3RhY2tfaXQgPT0gX19zdGFja190YWJsZS5lbmQoKSkKKwkgICAgeworCSAgICAgIC8vIEZpcnN0IG9jY3VyZW5jZSBvZiB0aGlzIGNhbGwgY29udGV4dC4KKwkgICAgICBpZiAoX19tYXhfbWVtKCkgPT0gMCB8fCBfX3N0YWNrX3RhYmxlX2J5dGVfc2l6ZSA8IF9fbWF4X21lbSgpKSAKKwkJeworCQkgIF9fc3RhY2tfdGFibGVfYnl0ZV9zaXplIAorCQkgICAgKz0gKHNpemVvZihfX2luc3RydWN0aW9uX2FkZHJlc3NfdCkgKiBfX3NpemUoX19zdGFjaykKKwkJCSsgc2l6ZW9mKF9fc3RhY2spICsgc2l6ZW9mKF9fc3RhY2tfaW5mbykpOworCQkgIF9fc3RhY2tfdGFibGUuaW5zZXJ0KG1ha2VfcGFpcihfX3N0YWNrLAorCQkJCQkJIF9fc3RhY2tfaW5mbyhfX2luZm8pKSk7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLy8gTWVyZ2Ugb2JqZWN0IGluZm8gaW50byBpbmZvIHN1bW1hcnkgZm9yIHRoaXMgY2FsbCBjb250ZXh0LgorCSAgICAgIF9fc3RhY2tfaXQtPnNlY29uZC5fX21lcmdlKF9faW5mbyk7CisJICAgICAgZGVsZXRlIF9fc3RhY2s7CisJICAgIH0KKwkgIF9fb2JqZWN0X3RhYmxlLmVyYXNlKF9fb2JqZWN0KTsKKwl9CisKKyAgICAgIHRoaXMtPl9fb2JqZWN0X3RhYmxlX2xvY2sudW5sb2NrKCk7CisgICAgICB0aGlzLT5fX3N0YWNrX3RhYmxlX2xvY2sudW5sb2NrKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9fb2JqZWN0X2luZm8sIHR5cGVuYW1lIF9fc3RhY2tfaW5mbz4KKyAgICB2b2lkCisgICAgX190cmFjZV9iYXNlPF9fb2JqZWN0X2luZm8sIF9fc3RhY2tfaW5mbz46OgorICAgIF9fd3JpdGUoRklMRSogX19mKQorICAgIHsKKyAgICAgIGZvciAodHlwZW5hbWUgX19zdGFja190YWJsZV90OjppdGVyYXRvciBfX2l0CisJICAgICA9IF9fc3RhY2tfdGFibGUuYmVnaW4oKTsgX19pdCAhPSBfX3N0YWNrX3RhYmxlLmVuZCgpOyArK19faXQpCisJaWYgKF9faXQtPnNlY29uZC5fX2lzX3ZhbGlkKCkpCisJICB7CisJICAgIHN0ZDo6ZnByaW50ZihfX2YsIF9faWQpOworCSAgICBzdGQ6OmZwcmludGYoX19mLCAifCIpOworCSAgICBfX2dudV9wcm9maWxlOjpfX3dyaXRlKF9fZiwgX19pdC0+Zmlyc3QpOworCSAgICBzdGQ6OmZwcmludGYoX19mLCAifCIpOworCSAgICBfX2l0LT5zZWNvbmQuX193cml0ZShfX2YpOworCSAgfQorICAgIH0KKworICBpbmxpbmUgc3RkOjpzaXplX3QKKyAgX19lbnZfdG9fc2l6ZV90KGNvbnN0IGNoYXIqIF9fZW52X3Zhciwgc3RkOjpzaXplX3QgX19kZWZhdWx0X3ZhbHVlKQorICB7CisgICAgY2hhciogX19lbnZfdmFsdWUgPSBzdGQ6OmdldGVudihfX2Vudl92YXIpOworICAgIGlmIChfX2Vudl92YWx1ZSkKKyAgICAgIHsKKwllcnJubyA9IDA7CisJbG9uZyBfX2NvbnZlcnRlZF92YWx1ZSA9IHN0ZDo6c3RydG9sKF9fZW52X3ZhbHVlLCAwLCAxMCk7CisJaWYgKGVycm5vIHx8IF9fY29udmVydGVkX3ZhbHVlIDwgMCkKKwkgIHsKKwkgICAgc3RkOjpmcHJpbnRmKHN0ZGVyciwKKwkJCSAiQmFkIHZhbHVlIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZSAnJXMnLlxuIiwKKwkJCSBfX2Vudl92YXIpOworCSAgICBzdGQ6OmFib3J0KCk7CisJICB9CisJZWxzZQorCSAgcmV0dXJuIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihfX2NvbnZlcnRlZF92YWx1ZSk7CisgICAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIF9fZGVmYXVsdF92YWx1ZTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fc2V0X21heF9zdGFja190cmFjZV9kZXB0aCgpCisgIHsKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbWF4X3N0YWNrX2RlcHRoKQorICAgICAgPSBfX2Vudl90b19zaXplX3QoX0dMSUJDWFhfUFJPRklMRV9NQVhfU1RBQ0tfREVQVEhfRU5WX1ZBUiwKKwkJCV9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXhfc3RhY2tfZGVwdGgpKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fc2V0X21heF9tZW0oKQorICB7CisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX21heF9tZW0pIAorICAgICAgPSBfX2Vudl90b19zaXplX3QoX0dMSUJDWFhfUFJPRklMRV9NRU1fUEVSX0RJQUdOT1NUSUNfRU5WX1ZBUiwKKwkJCV9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXhfbWVtKSk7CisgIH0KKworICBpbmxpbmUgaW50CisgIF9fbG9nX21hZ25pdHVkZShmbG9hdCBfX2YpCisgIHsKKyAgICBjb25zdCBmbG9hdCBfX2xvZ19iYXNlID0gMTAuMDsKKyAgICBpbnQgX19yZXN1bHQgPSAwOworICAgIGludCBfX3NpZ24gPSAxOworCisgICAgaWYgKF9fZiA8IDApIAorICAgICAgeworCV9fZiA9IC1fX2Y7CisJX19zaWduID0gLTE7CisgICAgICB9CisKKyAgICB3aGlsZSAoX19mID4gX19sb2dfYmFzZSkgCisgICAgICB7CisJKytfX3Jlc3VsdDsKKwlfX2YgLz0gMTAuMDsKKyAgICAgIH0KKyAgICByZXR1cm4gX19zaWduICogX19yZXN1bHQ7CisgIH0KKworICBpbmxpbmUgRklMRSogCisgIF9fb3Blbl9vdXRwdXRfZmlsZShjb25zdCBjaGFyKiBfX2V4dGVuc2lvbikKKyAgeworICAgIC8vIFRoZSBwYXRoIGlzIG1hZGUgb2YgX1NfdHJhY2VfZmlsZV9uYW1lICsgIi4iICsgZXh0ZW5zaW9uLgorICAgIHN0ZDo6c2l6ZV90IF9fcm9vdF9sZW4gCisgICAgICA9IF9fYnVpbHRpbl9zdHJsZW4oX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3RyYWNlX2ZpbGVfbmFtZSkpOworICAgIHN0ZDo6c2l6ZV90IF9fZXh0X2xlbiA9IF9fYnVpbHRpbl9zdHJsZW4oX19leHRlbnNpb24pOworICAgIGNoYXIqIF9fZmlsZV9uYW1lID0gbmV3IGNoYXJbX19yb290X2xlbiArIDEgKyBfX2V4dF9sZW4gKyAxXTsKKyAgICBfX2J1aWx0aW5fbWVtY3B5KF9fZmlsZV9uYW1lLAorCQkgICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU190cmFjZV9maWxlX25hbWUpLAorCQkgICAgIF9fcm9vdF9sZW4pOworICAgICooX19maWxlX25hbWUgKyBfX3Jvb3RfbGVuKSA9ICcuJzsKKyAgICBfX2J1aWx0aW5fbWVtY3B5KF9fZmlsZV9uYW1lICsgX19yb290X2xlbiArIDEsCisJCSAgICAgX19leHRlbnNpb24sIF9fZXh0X2xlbiArIDEpOworCisgICAgRklMRSogX19vdXRfZmlsZSA9IHN0ZDo6Zm9wZW4oX19maWxlX25hbWUsICJ3Iik7CisgICAgaWYgKCFfX291dF9maWxlKQorICAgICAgeworCXN0ZDo6ZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiB0cmFjZSBmaWxlICclcycuXG4iLAorCQkgICAgIF9fZmlsZV9uYW1lKTsKKwlzdGQ6OmFib3J0KCk7CisgICAgICB9CisKKyAgICBkZWxldGVbXSBfX2ZpbGVfbmFtZTsKKyAgICByZXR1cm4gX19vdXRfZmlsZTsKKyAgfQorCisgIHN0cnVjdCBfX3dhcm4KKyAgeworICAgIEZJTEUqIF9fZmlsZTsKKworICAgIF9fd2FybihGSUxFKiBfX2YpCisgICAgeyBfX2ZpbGUgPSBfX2Y7IH0KKworICAgIHZvaWQKKyAgICBvcGVyYXRvcigpKGNvbnN0IF9fd2FybmluZ19kYXRhJiBfX2luZm8pCisgICAgeworICAgICAgc3RkOjpmcHJpbnRmKF9fZmlsZSwgIF9faW5mby5fX3dhcm5pbmdfaWQpOworICAgICAgc3RkOjpmcHJpbnRmKF9fZmlsZSwgIjogaW1wcm92ZW1lbnQgPSAlZCIsCisJCSAgIF9fbG9nX21hZ25pdHVkZShfX2luZm8uX19tYWduaXR1ZGUpKTsKKyAgICAgIHN0ZDo6ZnByaW50ZihfX2ZpbGUsICI6IGNhbGwgc3RhY2sgPSAiKTsKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fd3JpdGUoX19maWxlLCBfX2luZm8uX19jb250ZXh0KTsKKyAgICAgIHN0ZDo6ZnByaW50ZihfX2ZpbGUsICI6IGFkdmljZSA9ICVzXG4iLAorCQkgICBfX2luZm8uX193YXJuaW5nX21lc3NhZ2UuY19zdHIoKSk7CisgICAgfQorICB9OworCisgIC8qKiBAYnJpZWYgRmluYWwgcmVwb3J0IG1ldGhvZCwgcmVnaXN0ZXJlZCB3aXRoIEBiIGF0ZXhpdC4KKyAgICoKKyAgICogVGhpcyBjYW4gYWxzbyBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgdXNlciBjb2RlLCBpbmNsdWRpbmcgc2lnbmFsIGhhbmRsZXJzLgorICAgKiBJdCBpcyBwcm90ZWN0ZWQgYWdhaW5zdCBkZWFkbG9ja3MgYnkgdGhlIHJlZW50cmFuY2UgZ3VhcmQgaW4gcHJvZmlsZXIuaC4KKyAgICogSG93ZXZlciwgd2hlbiBjYWxsZWQgZnJvbSBhIHNpZ25hbCBoYW5kbGVyIHRoYXQgdHJpZ2dlcnMgd2hpbGUgd2l0aGluCisgICAqIF9fZ251X3Byb2ZpbGUgKHVuZGVyIHRoZSBndWFyZGVkIHpvbmUpLCBubyBvdXRwdXQgd2lsbCBiZSBwcm9kdWNlZC4KKyAgICovCisgIGlubGluZSB2b2lkCisgIF9fcmVwb3J0KHZvaWQpCisgIHsKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19nbG9iYWxfbG9jaykubG9jaygpOworCisgICAgX193YXJuaW5nX3ZlY3Rvcl90IF9fd2FybmluZ3MsIF9fdG9wX3dhcm5pbmdzOworCisgICAgRklMRSogX19yYXdfZmlsZSA9IF9fb3Blbl9vdXRwdXRfZmlsZSgicmF3Iik7CisgICAgX190cmFjZV92ZWN0b3Jfc2l6ZV9yZXBvcnQoX19yYXdfZmlsZSwgX193YXJuaW5ncyk7CisgICAgX190cmFjZV9oYXNodGFibGVfc2l6ZV9yZXBvcnQoX19yYXdfZmlsZSwgX193YXJuaW5ncyk7CisgICAgX190cmFjZV9oYXNoX2Z1bmNfcmVwb3J0KF9fcmF3X2ZpbGUsIF9fd2FybmluZ3MpOworICAgIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfcmVwb3J0KF9fcmF3X2ZpbGUsIF9fd2FybmluZ3MpOworICAgIF9fdHJhY2VfbGlzdF90b19zbGlzdF9yZXBvcnQoX19yYXdfZmlsZSwgX193YXJuaW5ncyk7CisgICAgX190cmFjZV9saXN0X3RvX3ZlY3Rvcl9yZXBvcnQoX19yYXdfZmlsZSwgX193YXJuaW5ncyk7CisgICAgX190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9yZXBvcnQoX19yYXdfZmlsZSwgX193YXJuaW5ncyk7CisgICAgc3RkOjpmY2xvc2UoX19yYXdfZmlsZSk7CisKKyAgICAvLyBTb3J0IGRhdGEgYnkgbWFnbml0dWRlLCBrZWVwaW5nIGp1c3QgdG9wIE4uCisgICAgc3RkOjpzaXplX3QgX19jdXRvZmYgPSBzdGQ6Om1pbihfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbWF4X3dhcm5fY291bnQpLAorCQkJCSAgICBfX3dhcm5pbmdzLnNpemUoKSk7CisgICAgX190b3BfbihfX3dhcm5pbmdzLCBfX3RvcF93YXJuaW5ncywgX19jdXRvZmYpOworCisgICAgRklMRSogX193YXJuX2ZpbGUgPSBfX29wZW5fb3V0cHV0X2ZpbGUoInR4dCIpOworICAgIF9fZm9yX2VhY2goX190b3Bfd2FybmluZ3MuYmVnaW4oKSwgX190b3Bfd2FybmluZ3MuZW5kKCksCisJICAgICAgIF9fd2FybihfX3dhcm5fZmlsZSkpOworICAgIHN0ZDo6ZmNsb3NlKF9fd2Fybl9maWxlKTsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2dsb2JhbF9sb2NrKS51bmxvY2soKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fc2V0X3RyYWNlX3BhdGgoKQorICB7CisgICAgY2hhciogX19lbnZfdHJhY2VfZmlsZV9uYW1lID0gc3RkOjpnZXRlbnYoX0dMSUJDWFhfUFJPRklMRV9UUkFDRV9FTlZfVkFSKTsKKworICAgIGlmIChfX2Vudl90cmFjZV9maWxlX25hbWUpCisgICAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfdHJhY2VfZmlsZV9uYW1lKSA9IF9fZW52X3RyYWNlX2ZpbGVfbmFtZTsKKworICAgIC8vIE1ha2Ugc3VyZSBlYXJseSB0aGF0IHdlIGNhbiBjcmVhdGUgdGhlIHRyYWNlIGZpbGUuCisgICAgc3RkOjpmY2xvc2UoX19vcGVuX291dHB1dF9maWxlKCJ0eHQiKSk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3NldF9tYXhfd2Fybl9jb3VudCgpCisgIHsKKyAgICBjaGFyKiBfX2Vudl9tYXhfd2Fybl9jb3VudF9zdHIKKyAgICAgID0gc3RkOjpnZXRlbnYoX0dMSUJDWFhfUFJPRklMRV9NQVhfV0FSTl9DT1VOVF9FTlZfVkFSKTsKKworICAgIGlmIChfX2Vudl9tYXhfd2Fybl9jb3VudF9zdHIpCisgICAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbWF4X3dhcm5fY291bnQpCisJPSBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oc3RkOjphdG9pKF9fZW52X21heF93YXJuX2NvdW50X3N0cikpOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX19yZWFkX2Nvc3RfZmFjdG9ycygpCisgIHsKKyAgICBzdGQ6OnN0cmluZyBfX2NvbmZfZmlsZV9uYW1lKF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU190cmFjZV9maWxlX25hbWUpKTsKKyAgICBfX2NvbmZfZmlsZV9uYW1lICs9ICIuY29uZiI7CisKKyAgICBzdGQ6Omlmc3RyZWFtIF9fY29uZl9maWxlKF9fY29uZl9maWxlX25hbWUuY19zdHIoKSk7CisKKyAgICBpZiAoX19jb25mX2ZpbGUuaXNfb3BlbigpKQorICAgICAgeworCXN0ZDo6c3RyaW5nIF9fbGluZTsKKworCXdoaWxlIChzdGQ6OmdldGxpbmUoX19jb25mX2ZpbGUsIF9fbGluZSkpCisJICB7CisJICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgX19pID0gX19saW5lLmZpbmRfZmlyc3Rfbm90X29mKCIgXHRcblx2Iik7CisKKwkgICAgaWYgKF9fbGluZS5sZW5ndGgoKSA8PSAwIHx8IF9fbGluZVtfX2ldID09ICcjJykKKwkgICAgICAvLyBTa2lwIGVtcHR5IGxpbmVzIG9yIGNvbW1lbnRzLgorCSAgICAgIGNvbnRpbnVlOworCSAgfQorCisJLy8gVHJpbS4KKwlfX2xpbmUuZXJhc2UoX19yZW1vdmUoX19saW5lLmJlZ2luKCksIF9fbGluZS5lbmQoKSwgJyAnKSwKKwkJICAgICBfX2xpbmUuZW5kKCkpOworCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgX19wb3MgPSBfX2xpbmUuZmluZCgiPSIpOworCXN0ZDo6c3RyaW5nIF9fZmFjdG9yX25hbWUgPSBfX2xpbmUuc3Vic3RyKDAsIF9fcG9zKTsKKwlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIF9fZW5kID0gX19saW5lLmZpbmRfZmlyc3Rfb2YoIjtcbiIpOworCXN0ZDo6c3RyaW5nIF9fZmFjdG9yX3ZhbHVlID0gX19saW5lLnN1YnN0cihfX3BvcyArIDEsIF9fZW5kIC0gX19wb3MpOworCisJX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fZW52KVtfX2ZhY3Rvcl9uYW1lXSA9IF9fZmFjdG9yX3ZhbHVlOworICAgICAgfQorICB9CisKKyAgc3RydWN0IF9fY29zdF9mYWN0b3Jfd3JpdGVyCisgIHsKKyAgICBGSUxFKiBfX2ZpbGU7CisKKyAgICBfX2Nvc3RfZmFjdG9yX3dyaXRlcihGSUxFKiBfX2YpCisgICAgOiBfX2ZpbGUoX19mKSB7IH0KKworICAgIHZvaWQKKyAgICBvcGVyYXRvcigpIChjb25zdCBfX2Nvc3RfZmFjdG9yKiBfX2ZhY3RvcikKKyAgICB7IHN0ZDo6ZnByaW50ZihfX2ZpbGUsICIlcyA9ICVmXG4iLCBfX2ZhY3Rvci0+X19lbnZfdmFyLAorCQkgICBfX2ZhY3Rvci0+X192YWx1ZSk7IH0KKyAgfTsKKworICBpbmxpbmUgdm9pZAorICBfX3dyaXRlX2Nvc3RfZmFjdG9ycygpCisgIHsKKyAgICBGSUxFKiBfX2ZpbGUgPSBfX29wZW5fb3V0cHV0X2ZpbGUoImNvbmYub3V0Iik7CisgICAgX19mb3JfZWFjaChfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19jb3N0X2ZhY3RvcnMpLT5iZWdpbigpLAorCSAgICAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19jb3N0X2ZhY3RvcnMpLT5lbmQoKSwKKwkgICAgICAgX19jb3N0X2ZhY3Rvcl93cml0ZXIoX19maWxlKSk7CisgICAgc3RkOjpmY2xvc2UoX19maWxlKTsKKyAgfQorCisgIHN0cnVjdCBfX2Nvc3RfZmFjdG9yX3NldHRlcgorICB7CisgICAgdm9pZAorICAgIG9wZXJhdG9yKCkoX19jb3N0X2ZhY3RvciogX19mYWN0b3IpCisgICAgeworICAgICAgLy8gTG9vayBpdCB1cCBpbiB0aGUgcHJvY2VzcyBlbnZpcm9ubWVudCBmaXJzdC4KKyAgICAgIGNvbnN0IGNoYXIqIF9fZW52X3ZhbHVlID0gc3RkOjpnZXRlbnYoX19mYWN0b3ItPl9fZW52X3Zhcik7CisKKyAgICAgIGlmICghX19lbnZfdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAvLyBMb29rIGl0IHVwIGluIHRoZSBjb25maWcgZmlsZS4KKyAgICAgICAgICBfX2Vudl90OjppdGVyYXRvciBfX2l0IAorCSAgICA9IF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2VudikuZmluZChfX2ZhY3Rvci0+X19lbnZfdmFyKTsKKyAgICAgICAgICBpZiAoX19pdCAhPSBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19lbnYpLmVuZCgpKQorICAgICAgICAgICAgX19lbnZfdmFsdWUgPSAoKl9faXQpLnNlY29uZC5jX3N0cigpOworICAgICAgICB9CisKKyAgICAgIGlmIChfX2Vudl92YWx1ZSkKKyAgICAgICAgX19mYWN0b3ItPl9fdmFsdWUgPSBzdGQ6OmF0b2YoX19lbnZfdmFsdWUpOworICAgIH0KKyAgfTsKKworICBpbmxpbmUgdm9pZAorICBfX3NldF9jb3N0X2ZhY3RvcnMoKQorICB7CisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fY29zdF9mYWN0b3JzKSA9IG5ldyBfX2Nvc3RfZmFjdG9yX3ZlY3RvcjsKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19jb3N0X2ZhY3RvcnMpLT4KKyAgICAgIHB1c2hfYmFjaygmX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fdmVjdG9yX3NoaWZ0X2Nvc3RfZmFjdG9yKSk7CisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fY29zdF9mYWN0b3JzKS0+CisgICAgICBwdXNoX2JhY2soJl9HTElCQ1hYX1BST0ZJTEVfREFUQShfX3ZlY3Rvcl9pdGVyYXRlX2Nvc3RfZmFjdG9yKSk7CisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fY29zdF9mYWN0b3JzKS0+CisgICAgICBwdXNoX2JhY2soJl9HTElCQ1hYX1BST0ZJTEVfREFUQShfX3ZlY3Rvcl9yZXNpemVfY29zdF9mYWN0b3IpKTsKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19jb3N0X2ZhY3RvcnMpLT4KKyAgICAgIHB1c2hfYmFjaygmX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fbGlzdF9zaGlmdF9jb3N0X2ZhY3RvcikpOworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2Nvc3RfZmFjdG9ycyktPgorICAgICAgcHVzaF9iYWNrKCZfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19saXN0X2l0ZXJhdGVfY29zdF9mYWN0b3IpKTsKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19jb3N0X2ZhY3RvcnMpLT4KKyAgICAgIHB1c2hfYmFjaygmX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fbGlzdF9yZXNpemVfY29zdF9mYWN0b3IpKTsKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19jb3N0X2ZhY3RvcnMpLT4KKyAgICAgIHB1c2hfYmFjaygmX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fbWFwX2luc2VydF9jb3N0X2ZhY3RvcikpOworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2Nvc3RfZmFjdG9ycyktPgorICAgICAgcHVzaF9iYWNrKCZfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19tYXBfZXJhc2VfY29zdF9mYWN0b3IpKTsKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19jb3N0X2ZhY3RvcnMpLT4KKyAgICAgIHB1c2hfYmFjaygmX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fbWFwX2ZpbmRfY29zdF9mYWN0b3IpKTsKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19jb3N0X2ZhY3RvcnMpLT4KKyAgICAgIHB1c2hfYmFjaygmX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fbWFwX2l0ZXJhdGVfY29zdF9mYWN0b3IpKTsKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19jb3N0X2ZhY3RvcnMpLT4KKyAgICAgIHB1c2hfYmFjaygmX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fdW1hcF9pbnNlcnRfY29zdF9mYWN0b3IpKTsKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19jb3N0X2ZhY3RvcnMpLT4KKyAgICAgIHB1c2hfYmFjaygmX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fdW1hcF9lcmFzZV9jb3N0X2ZhY3RvcikpOworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2Nvc3RfZmFjdG9ycyktPgorICAgICAgcHVzaF9iYWNrKCZfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX191bWFwX2ZpbmRfY29zdF9mYWN0b3IpKTsKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19jb3N0X2ZhY3RvcnMpLT4KKyAgICAgIHB1c2hfYmFjaygmX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fdW1hcF9pdGVyYXRlX2Nvc3RfZmFjdG9yKSk7CisgICAgX19mb3JfZWFjaChfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19jb3N0X2ZhY3RvcnMpLT5iZWdpbigpLAorCSAgICAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19jb3N0X2ZhY3RvcnMpLT5lbmQoKSwKKwkgICAgICAgX19jb3N0X2ZhY3Rvcl9zZXR0ZXIoKSk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3Byb2ZjeHhfaW5pdF91bmNvbmRpdGlvbmFsKCkKKyAgeworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2dsb2JhbF9sb2NrKS5sb2NrKCk7CisKKyAgICBpZiAoX19pc19pbnZhbGlkKCkpCisgICAgICB7CisJX19zZXRfbWF4X3dhcm5fY291bnQoKTsKKworCWlmIChfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbWF4X3dhcm5fY291bnQpID09IDApCisJICBfX3R1cm5fb2ZmKCk7CisJZWxzZQorCSAgeworCSAgICBfX3NldF9tYXhfc3RhY2tfdHJhY2VfZGVwdGgoKTsKKwkgICAgX19zZXRfbWF4X21lbSgpOworCSAgICBfX3NldF90cmFjZV9wYXRoKCk7CisJICAgIF9fcmVhZF9jb3N0X2ZhY3RvcnMoKTsgCisJICAgIF9fc2V0X2Nvc3RfZmFjdG9ycygpOworCSAgICBfX3dyaXRlX2Nvc3RfZmFjdG9ycygpOworCisJICAgIF9fdHJhY2VfdmVjdG9yX3NpemVfaW5pdCgpOworCSAgICBfX3RyYWNlX2hhc2h0YWJsZV9zaXplX2luaXQoKTsKKwkgICAgX190cmFjZV9oYXNoX2Z1bmNfaW5pdCgpOworCSAgICBfX3RyYWNlX3ZlY3Rvcl90b19saXN0X2luaXQoKTsKKwkgICAgX190cmFjZV9saXN0X3RvX3NsaXN0X2luaXQoKTsgCisJICAgIF9fdHJhY2VfbGlzdF90b192ZWN0b3JfaW5pdCgpOworCSAgICBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2luaXQoKTsKKworCSAgICBzdGQ6OmF0ZXhpdChfX3JlcG9ydCk7CisKKwkgICAgX190dXJuX29uKCk7CisJICB9CisgICAgICB9CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19nbG9iYWxfbG9jaykudW5sb2NrKCk7CisgIH0KKworICAvKiogQGJyaWVmIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYnkgZWFjaCBpbnN0cnVtZW50YXRpb24gcG9pbnQuCisgICAqCisgICAqIFRoZSBjb21tb24gcGF0aCBpcyBpbmxpbmVkIGZ1bGx5LgorICAgKi8KKyAgaW5saW5lIGJvb2wKKyAgX19wcm9mY3h4X2luaXQoKQorICB7CisgICAgaWYgKF9faXNfaW52YWxpZCgpKQorICAgICAgX19wcm9mY3h4X2luaXRfdW5jb25kaXRpb25hbCgpOworCisgICAgcmV0dXJuIF9faXNfb24oKTsKKyAgfQorCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wcm9maWxlCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX1RSQUNFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3ZlY3Rvcl9zaXplLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl92ZWN0b3Jfc2l6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwY2I1ZmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaW1wbC9wcm9maWxlcl92ZWN0b3Jfc2l6ZS5oCkBAIC0wLDAgKzEsOTcgQEAKKy8vIC0qLSBDKysgLSotCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisvLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3ZlY3Rvcl9zaXplLmgKKyAqICBAYnJpZWYgQ29sbGVjdGlvbiBvZiB2ZWN0b3Igc2l6ZSB0cmFjZXMuCisgKi8KKworLy8gV3JpdHRlbiBieSBMaXhpYSBMaXUgYW5kIFNpbHZpdXMgUnVzLgorCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfVkVDVE9SX1NJWkVfSAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX1ZFQ1RPUl9TSVpFX0ggMQorCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX25vZGUuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfdHJhY2UuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfc3RhdGUuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfY29udGFpbmVyX3NpemUuaCIKKworbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKK3sKKyAgLyoqIEBicmllZiBIYXNodGFibGUgc2l6ZSBpbnN0cnVtZW50YXRpb24gdHJhY2UgcHJvZHVjZXIuICAqLworICBjbGFzcyBfX3RyYWNlX3ZlY3Rvcl9zaXplCisgIDogcHVibGljIF9fdHJhY2VfY29udGFpbmVyX3NpemUKKyAgeworICBwdWJsaWM6CisgICAgX190cmFjZV92ZWN0b3Jfc2l6ZSgpCisgICAgOiBfX3RyYWNlX2NvbnRhaW5lcl9zaXplKCkKKyAgICB7IF9faWQgPSAidmVjdG9yLXNpemUiOyB9CisgIH07CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV92ZWN0b3Jfc2l6ZV9pbml0KCkKKyAgeyBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfdmVjdG9yX3NpemUpID0gbmV3IF9fdHJhY2VfdmVjdG9yX3NpemUoKTsgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfdmVjdG9yX3NpemVfcmVwb3J0KEZJTEUqIF9fZiwgX193YXJuaW5nX3ZlY3Rvcl90JiBfX3dhcm5pbmdzKQorICB7CisgICAgaWYgKF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU192ZWN0b3Jfc2l6ZSkpCisgICAgICB7CisJX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl9zaXplKS0+X19jb2xsZWN0X3dhcm5pbmdzKF9fd2FybmluZ3MpOworCV9HTElCQ1hYX1BST0ZJTEVfREFUQShfU192ZWN0b3Jfc2l6ZSktPl9fd3JpdGUoX19mKTsKKyAgICAgIH0KKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfdmVjdG9yX3NpemVfY29uc3RydWN0KGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX251bSkKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU192ZWN0b3Jfc2l6ZSktPl9faW5zZXJ0KF9fb2JqLCBfX2dldF9zdGFjaygpLAorCQkJCQkJICAgIF9fbnVtKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfdmVjdG9yX3NpemVfZGVzdHJ1Y3QoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fbnVtLAorCQkJICAgICAgIHN0ZDo6c2l6ZV90IF9faW51bSkKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU192ZWN0b3Jfc2l6ZSktPl9fZGVzdHJ1Y3QoX19vYmosIF9fbnVtLCBfX2ludW0pOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV92ZWN0b3Jfc2l6ZV9yZXNpemUoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fZnJvbSwKKwkJCSAgICAgc3RkOjpzaXplX3QgX190bykKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU192ZWN0b3Jfc2l6ZSktPl9fcmVzaXplKF9fb2JqLCBfX2Zyb20sIF9fdG8pOworICB9CisKK30gLy8gbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfVkVDVE9SX1NJWkVfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2ltcGwvcHJvZmlsZXJfdmVjdG9yX3RvX2xpc3QuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3ZlY3Rvcl90b19saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhlMzc4YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3ZlY3Rvcl90b19saXN0LmgKQEAgLTAsMCArMSwzNDcgQEAKKy8vIC0qLSBDKysgLSotCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisvLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3ZlY3Rvcl90b19saXN0LmgKKyAqICBAYnJpZWYgZGlhZ25vc3RpY3MgZm9yIHZlY3RvciB0byBsaXN0LgorICovCisKKy8vIFdyaXR0ZW4gYnkgTGl4aWEgTGl1IGFuZCBTaWx2aXVzIFJ1cy4KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX1ZFQ1RPUl9UT19MSVNUX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9WRUNUT1JfVE9fTElTVF9IIDEKKworI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlci5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl9ub2RlLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3RyYWNlLmgiCisKK25hbWVzcGFjZSBfX2dudV9wcm9maWxlCit7CisgIC8qKiBAYnJpZWYgQSB2ZWN0b3ItdG8tbGlzdCBpbnN0cnVtZW50YXRpb24gbGluZSBpbiB0aGUgb2JqZWN0IHRhYmxlLiAgKi8KKyAgY2xhc3MgX192ZWN0b3IybGlzdF9pbmZvCisgIDogcHVibGljIF9fb2JqZWN0X2luZm9fYmFzZQorICB7CisgIHB1YmxpYzoKKyAgICBfX3ZlY3RvcjJsaXN0X2luZm8oKQorICAgIDogX01fc2hpZnRfY291bnQoMCksIF9NX2l0ZXJhdGUoMCksIF9NX3Jlc2l6ZSgwKSwgX01fbGlzdF9jb3N0KDApLAorICAgICAgX01fdmVjdG9yX2Nvc3QoMCksIF9NX3ZhbGlkKHRydWUpIHsgfQorCisgICAgX192ZWN0b3IybGlzdF9pbmZvKF9fc3RhY2tfdCBfX3N0YWNrKQorICAgIDogX19vYmplY3RfaW5mb19iYXNlKF9fc3RhY2spLCBfTV9zaGlmdF9jb3VudCgwKSwgX01faXRlcmF0ZSgwKSwKKyAgICAgIF9NX3Jlc2l6ZSgwKSwgX01fbGlzdF9jb3N0KDApLCBfTV92ZWN0b3JfY29zdCgwKSwgX01fdmFsaWQodHJ1ZSkgeyB9CisKKyAgICB2aXJ0dWFsIH5fX3ZlY3RvcjJsaXN0X2luZm8oKSB7IH0KKworICAgIF9fdmVjdG9yMmxpc3RfaW5mbyhjb25zdCBfX3ZlY3RvcjJsaXN0X2luZm8mIF9fbykKKyAgICA6IF9fb2JqZWN0X2luZm9fYmFzZShfX28pLCBfTV9zaGlmdF9jb3VudChfX28uX01fc2hpZnRfY291bnQpLAorICAgICAgX01faXRlcmF0ZShfX28uX01faXRlcmF0ZSksIF9NX3Jlc2l6ZShfX28uX01fcmVzaXplKSwKKyAgICAgIF9NX2xpc3RfY29zdChfX28uX01fbGlzdF9jb3N0KSwgX01fdmVjdG9yX2Nvc3QoX19vLl9NX3ZlY3Rvcl9jb3N0KSwKKyAgICAgIF9NX3ZhbGlkKF9fby5fTV92YWxpZCkgeyB9CisKKyAgICB2b2lkCisgICAgX19tZXJnZShjb25zdCBfX3ZlY3RvcjJsaXN0X2luZm8mIF9fbykKKyAgICB7CisgICAgICBfTV9zaGlmdF9jb3VudCAgKz0gX19vLl9NX3NoaWZ0X2NvdW50OworICAgICAgX01faXRlcmF0ZSAgICAgICs9IF9fby5fTV9pdGVyYXRlOworICAgICAgX01fdmVjdG9yX2Nvc3QgICs9IF9fby5fTV92ZWN0b3JfY29zdDsKKyAgICAgIF9NX2xpc3RfY29zdCAgICArPSBfX28uX01fbGlzdF9jb3N0OworICAgICAgX01fdmFsaWQgICAgICAgICY9IF9fby5fTV92YWxpZDsKKyAgICAgIF9NX3Jlc2l6ZSAgICAgICArPSBfX28uX01fcmVzaXplOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX3dyaXRlKEZJTEUqIF9fZikgY29uc3QKKyAgICB7CisgICAgICBzdGQ6OmZwcmludGYoX19mLCAiJVp1ICVadSAlWnUgJS4wZiAlLjBmXG4iLCBfTV9zaGlmdF9jb3VudCwKKwkJICAgX01fcmVzaXplLCBfTV9pdGVyYXRlLCBfTV92ZWN0b3JfY29zdCwgX01fbGlzdF9jb3N0KTsKKyAgICB9CisKKyAgICBmbG9hdAorICAgIF9fbWFnbml0dWRlKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV92ZWN0b3JfY29zdCAtIF9NX2xpc3RfY29zdDsgfQorCisgICAgc3RkOjpzdHJpbmcKKyAgICBfX2FkdmljZSgpIGNvbnN0IAorICAgIHsgcmV0dXJuICJjaGFuZ2Ugc3RkOjp2ZWN0b3IgdG8gc3RkOjpsaXN0IjsgfQorCisgICAgc3RkOjpzaXplX3QKKyAgICBfX3NoaWZ0X2NvdW50KCkKKyAgICB7IHJldHVybiBfTV9zaGlmdF9jb3VudDsgfQorCisgICAgc3RkOjpzaXplX3QKKyAgICBfX2l0ZXJhdGUoKQorICAgIHsgcmV0dXJuIF9NX2l0ZXJhdGU7IH0KKworICAgIGZsb2F0CisgICAgX19saXN0X2Nvc3QoKQorICAgIHsgcmV0dXJuIF9NX2xpc3RfY29zdDsgfQorCisgICAgc3RkOjpzaXplX3QKKyAgICBfX3Jlc2l6ZSgpCisgICAgeyByZXR1cm4gX01fcmVzaXplOyB9CisKKyAgICB2b2lkCisgICAgX19zZXRfbGlzdF9jb3N0KGZsb2F0IF9fbGMpCisgICAgeyBfTV9saXN0X2Nvc3QgPSBfX2xjOyB9CisgICAgCisgICAgdm9pZAorICAgIF9fc2V0X3ZlY3Rvcl9jb3N0KGZsb2F0IF9fdmMpCisgICAgeyBfTV92ZWN0b3JfY29zdCA9IF9fdmM7IH0KKyAgICAKKyAgICBib29sCisgICAgX19pc192YWxpZCgpCisgICAgeyByZXR1cm4gX01fdmFsaWQ7IH0KKyAgICAKKyAgICB2b2lkCisgICAgX19zZXRfaW52YWxpZCgpCisgICAgeyBfTV92YWxpZCA9IGZhbHNlOyB9CisKKyAgICB2b2lkCisgICAgX19vcHJfaW5zZXJ0KHN0ZDo6c2l6ZV90IF9fcG9zLCBzdGQ6OnNpemVfdCBfX251bSkKKyAgICB7IF9NX3NoaWZ0X2NvdW50ICs9IF9fbnVtIC0gX19wb3M7IH0KKworICAgIHZvaWQKKyAgICBfX29wcl9pdGVyYXRlKHN0ZDo6c2l6ZV90IF9fbnVtKQorICAgIHsgX01faXRlcmF0ZSArPSBfX251bTsgfQorCisgICAgdm9pZAorICAgIF9fcmVzaXplKHN0ZDo6c2l6ZV90IF9fZnJvbSwgc3RkOjpzaXplX3QpCisgICAgeyBfTV9yZXNpemUgKz0gX19mcm9tOyB9CisKKyAgICB2b2lkCisgICAgX19vcHJfZmluZChzdGQ6OnNpemVfdCBfX3NpemUpCisgICAgeworICAgICAgLy8gVXNlIGF2ZXJhZ2UgY2FzZSBjb21wbGV4aXR5LgorICAgICAgX01faXRlcmF0ZSArPSAzLjAgLyA0LjAgKiBfX3NpemU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3RkOjpzaXplX3QgX01fc2hpZnRfY291bnQ7CisgICAgc3RkOjpzaXplX3QgX01faXRlcmF0ZTsKKyAgICBzdGQ6OnNpemVfdCBfTV9yZXNpemU7CisgICAgZmxvYXQgX01fbGlzdF9jb3N0OworICAgIGZsb2F0IF9NX3ZlY3Rvcl9jb3N0OworICAgIGJvb2wgIF9NX3ZhbGlkOworICB9OworCisKKyAgLyoqIEBicmllZiBBIHZlY3Rvci10by1saXN0IGluc3RydW1lbnRhdGlvbiBsaW5lIGluIHRoZSBzdGFjayB0YWJsZS4gICovCisgIGNsYXNzIF9fdmVjdG9yMmxpc3Rfc3RhY2tfaW5mbworICA6IHB1YmxpYyBfX3ZlY3RvcjJsaXN0X2luZm8KKyAgeworICBwdWJsaWM6CisgICAgX192ZWN0b3IybGlzdF9zdGFja19pbmZvKGNvbnN0IF9fdmVjdG9yMmxpc3RfaW5mbyYgX19vKSAKKyAgICA6IF9fdmVjdG9yMmxpc3RfaW5mbyhfX28pIHsgfQorICB9OworCisKKyAgLyoqIEBicmllZiBWZWN0b3ItdG8tbGlzdCBpbnN0cnVtZW50YXRpb24gcHJvZHVjZXIuICAqLworICBjbGFzcyBfX3RyYWNlX3ZlY3Rvcl90b19saXN0CisgIDogcHVibGljIF9fdHJhY2VfYmFzZTxfX3ZlY3RvcjJsaXN0X2luZm8sIF9fdmVjdG9yMmxpc3Rfc3RhY2tfaW5mbz4gCisgIHsKKyAgcHVibGljOgorICAgIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3QoKQorICAgIDogX190cmFjZV9iYXNlPF9fdmVjdG9yMmxpc3RfaW5mbywgX192ZWN0b3IybGlzdF9zdGFja19pbmZvPigpCisgICAgeyBfX2lkID0gInZlY3Rvci10by1saXN0IjsgfQorCisgICAgfl9fdHJhY2VfdmVjdG9yX3RvX2xpc3QoKSB7IH0KKworICAgIC8vIEluc2VydCBhIG5ldyBub2RlIGF0IGNvbnN0cnVjdCB3aXRoIG9iamVjdCwgY2FsbHN0YWNrIGFuZCBpbml0aWFsIHNpemUuIAorICAgIHZvaWQKKyAgICBfX2luc2VydChfX29iamVjdF90IF9fb2JqLCBfX3N0YWNrX3QgX19zdGFjaykKKyAgICB7IF9fYWRkX29iamVjdChfX29iaiwgX192ZWN0b3IybGlzdF9pbmZvKF9fc3RhY2spKTsgfQorCisgICAgLy8gQ2FsbCBhdCBkZXN0cnVjdGlvbi9jbGVhbiB0byBzZXQgY29udGFpbmVyIGZpbmFsIHNpemUuCisgICAgdm9pZAorICAgIF9fZGVzdHJ1Y3QoY29uc3Qgdm9pZCogX19vYmopCisgICAgeworICAgICAgaWYgKCFfX2lzX29uKCkpCisJcmV0dXJuOworCisgICAgICBfX3ZlY3RvcjJsaXN0X2luZm8qIF9fcmVzID0gX19nZXRfb2JqZWN0X2luZm8oX19vYmopOworICAgICAgaWYgKCFfX3JlcykKKwlyZXR1cm47CisKKyAgICAgIGZsb2F0IF9fdmMgPSBfX3ZlY3Rvcl9jb3N0KF9fcmVzLT5fX3NoaWZ0X2NvdW50KCksIF9fcmVzLT5fX2l0ZXJhdGUoKSwKKwkJCQkgX19yZXMtPl9fcmVzaXplKCkpOworICAgICAgZmxvYXQgX19sYyA9IF9fbGlzdF9jb3N0KF9fcmVzLT5fX3NoaWZ0X2NvdW50KCksIF9fcmVzLT5fX2l0ZXJhdGUoKSwKKwkJCSAgICAgICBfX3Jlcy0+X19yZXNpemUoKSk7CisgICAgICBfX3Jlcy0+X19zZXRfdmVjdG9yX2Nvc3QoX192Yyk7CisgICAgICBfX3Jlcy0+X19zZXRfbGlzdF9jb3N0KF9fbGMpOworCisgICAgICBfX3JldGlyZV9vYmplY3QoX19vYmopOworICAgIH0KKworICAgIC8vIEZpbmQgdGhlIG5vZGUgaW4gdGhlIGxpdmUgbWFwLgorICAgIC8vIFhYWCBVbmRlZmluZWQ/IT8KKyAgICBfX3ZlY3RvcjJsaXN0X2luZm8qIF9fZmluZChjb25zdCB2b2lkKiBfX29iaik7CisKKyAgICAvLyBDb2xsZWN0IGNvc3Qgb2Ygb3BlcmF0aW9ucy4KKyAgICB2b2lkCisgICAgX19vcHJfaW5zZXJ0KGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX3Bvcywgc3RkOjpzaXplX3QgX19udW0pCisgICAgeworICAgICAgX192ZWN0b3IybGlzdF9pbmZvKiBfX3JlcyA9IF9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKyAgICAgIGlmIChfX3JlcykKKwlfX3Jlcy0+X19vcHJfaW5zZXJ0KF9fcG9zLCBfX251bSk7CisgICAgfQorCisgICAgdm9pZAorICAgIF9fb3ByX2l0ZXJhdGUoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fbnVtKQorICAgIHsKKyAgICAgIF9fdmVjdG9yMmxpc3RfaW5mbyogX19yZXMgPSBfX2dldF9vYmplY3RfaW5mbyhfX29iaik7CisgICAgICBpZiAoX19yZXMpCisJX19yZXMtPl9fb3ByX2l0ZXJhdGUoX19udW0pOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX2ludmFsaWRfb3BlcmF0b3IoY29uc3Qgdm9pZCogX19vYmopCisgICAgeworICAgICAgX192ZWN0b3IybGlzdF9pbmZvKiBfX3JlcyA9IF9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKyAgICAgIGlmIChfX3JlcykKKwlfX3Jlcy0+X19zZXRfaW52YWxpZCgpOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX3Jlc2l6ZShjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19mcm9tLCBzdGQ6OnNpemVfdCBfX3RvKQorICAgIHsKKyAgICAgIF9fdmVjdG9yMmxpc3RfaW5mbyogX19yZXMgPSBfX2dldF9vYmplY3RfaW5mbyhfX29iaik7CisgICAgICBpZiAoX19yZXMpCisJX19yZXMtPl9fcmVzaXplKF9fZnJvbSwgX190byk7CisgICAgfQorCisgICAgZmxvYXQKKyAgICBfX3ZlY3Rvcl9jb3N0KHN0ZDo6c2l6ZV90IF9fc2hpZnQsIHN0ZDo6c2l6ZV90IF9faXRlcmF0ZSwKKwkJICBzdGQ6OnNpemVfdCBfX3Jlc2l6ZSkKKyAgICB7CisgICAgICByZXR1cm4gKF9fc2hpZnQKKwkgICAgICAqIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX3ZlY3Rvcl9zaGlmdF9jb3N0X2ZhY3RvcikuX192YWx1ZQorCSAgICAgICsgX19pdGVyYXRlCisJICAgICAgKiBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX192ZWN0b3JfaXRlcmF0ZV9jb3N0X2ZhY3RvcikuX192YWx1ZQorCSAgICAgICsgX19yZXNpemUKKwkgICAgICAqIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX3ZlY3Rvcl9yZXNpemVfY29zdF9mYWN0b3IpLl9fdmFsdWUpOworICAgIH0KKworICAgIGZsb2F0CisgICAgX19saXN0X2Nvc3Qoc3RkOjpzaXplX3QgX19zaGlmdCwgc3RkOjpzaXplX3QgX19pdGVyYXRlLAorCQlzdGQ6OnNpemVfdCBfX3Jlc2l6ZSkKKyAgICB7CisgICAgICByZXR1cm4gKF9fc2hpZnQKKwkgICAgICAqIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2xpc3Rfc2hpZnRfY29zdF9mYWN0b3IpLl9fdmFsdWUKKwkgICAgICArIF9faXRlcmF0ZQorCSAgICAgICogX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fbGlzdF9pdGVyYXRlX2Nvc3RfZmFjdG9yKS5fX3ZhbHVlCisJICAgICAgKyBfX3Jlc2l6ZQorCSAgICAgICogX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fbGlzdF9yZXNpemVfY29zdF9mYWN0b3IpLl9fdmFsdWUpOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX29wcl9maW5kKGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX3NpemUpCisgICAgeworICAgICAgX192ZWN0b3IybGlzdF9pbmZvKiBfX3JlcyA9IF9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKyAgICAgIGlmIChfX3JlcykKKwlfX3Jlcy0+X19vcHJfZmluZChfX3NpemUpOworICAgIH0KKyAgfTsKKworCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfaW5pdCgpCisgIHsgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl90b19saXN0KSA9IG5ldyBfX3RyYWNlX3ZlY3Rvcl90b19saXN0KCk7IH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX3ZlY3Rvcl90b19saXN0X3JlcG9ydChGSUxFKiBfX2YsIF9fd2FybmluZ192ZWN0b3JfdCYgX193YXJuaW5ncykKKyAgeworICAgIGlmIChfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfdmVjdG9yX3RvX2xpc3QpKQorICAgICAgeworCV9HTElCQ1hYX1BST0ZJTEVfREFUQShfU192ZWN0b3JfdG9fbGlzdCktPgorCSAgX19jb2xsZWN0X3dhcm5pbmdzKF9fd2FybmluZ3MpOworCV9HTElCQ1hYX1BST0ZJTEVfREFUQShfU192ZWN0b3JfdG9fbGlzdCktPl9fd3JpdGUoX19mKTsKKyAgICAgIH0KKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfY29uc3RydWN0KGNvbnN0IHZvaWQqIF9fb2JqKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl90b19saXN0KS0+X19pbnNlcnQoX19vYmosIF9fZ2V0X3N0YWNrKCkpOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV92ZWN0b3JfdG9fbGlzdF9kZXN0cnVjdChjb25zdCB2b2lkKiBfX29iaikKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU192ZWN0b3JfdG9fbGlzdCktPl9fZGVzdHJ1Y3QoX19vYmopOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV92ZWN0b3JfdG9fbGlzdF9pbnNlcnQoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fcG9zLAorCQkJCXN0ZDo6c2l6ZV90IF9fbnVtKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl90b19saXN0KS0+X19vcHJfaW5zZXJ0KF9fb2JqLCBfX3BvcywKKwkJCQkJCQkgICBfX251bSk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX3ZlY3Rvcl90b19saXN0X2l0ZXJhdGUoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fbnVtID0gMSkKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU192ZWN0b3JfdG9fbGlzdCktPl9fb3ByX2l0ZXJhdGUoX19vYmosIF9fbnVtKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfaW52YWxpZF9vcGVyYXRvcihjb25zdCB2b2lkKiBfX29iaikKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU192ZWN0b3JfdG9fbGlzdCktPl9faW52YWxpZF9vcGVyYXRvcihfX29iaik7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX3ZlY3Rvcl90b19saXN0X3Jlc2l6ZShjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19mcm9tLAorCQkJCXN0ZDo6c2l6ZV90IF9fdG8pCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfdmVjdG9yX3RvX2xpc3QpLT5fX3Jlc2l6ZShfX29iaiwgX19mcm9tLCBfX3RvKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfZmluZChjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19zaXplKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl90b19saXN0KS0+X19vcHJfZmluZChfX29iaiwgX19zaXplKTsKKyAgfQorCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wcm9maWxlCisjZW5kaWYgLyogX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9WRUNUT1JfVE9fTElTVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvaXRlcmF0b3JfdHJhY2tlci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2l0ZXJhdG9yX3RyYWNrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTFlZmY3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL2l0ZXJhdG9yX3RyYWNrZXIuaApAQCAtMCwwICsxLDI3NCBAQAorLy8gUHJvZmlsaW5nIGl0ZXJhdG9yIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL2l0ZXJhdG9yX3RyYWNrZXIuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwcm9maWxlIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX0lURVJBVE9SX1RSQUNLRVIKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9JVEVSQVRPUl9UUkFDS0VSIDEKKworI2luY2x1ZGUgPGV4dC90eXBlX3RyYWl0cy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3Byb2ZpbGUKK3sKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBjbGFzcyBfX2l0ZXJhdG9yX3RyYWNrZXIgCisgICAgeworICAgICAgdHlwZWRlZiBfX2l0ZXJhdG9yX3RyYWNrZXIgX1NlbGY7CisKKyAgICAgIC8vIFRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yCisgICAgICBfSXRlcmF0b3IgX01fY3VycmVudDsKKworICAgICAgLy8gVGhlIHVuZGVybHlpbmcgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgIGNvbnN0IF9TZXF1ZW5jZSogX01fZHM7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj4gX1RyYWl0czsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0l0ZXJhdG9yCQkgICAgICAgICAgICAgIF9CYXNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBpdGVyYXRvcl9jYXRlZ29yeTsgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnZhbHVlX3R5cGUgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmRpZmZlcmVuY2VfdHlwZSAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cmVmZXJlbmNlICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb2ludGVyICAgICAgICAgICBwb2ludGVyOworCisgICAgICBfX2l0ZXJhdG9yX3RyYWNrZXIoKQorICAgICAgOiBfTV9jdXJyZW50KCksIF9NX2RzKDApIHsgfQorCisgICAgICBfX2l0ZXJhdG9yX3RyYWNrZXIoY29uc3QgX0l0ZXJhdG9yJiBfX2ksIGNvbnN0IF9TZXF1ZW5jZSogX19zZXEpIAorICAgICAgOiBfTV9jdXJyZW50KF9faSksIF9NX2RzKF9fc2VxKSB7IH0KKworICAgICAgX19pdGVyYXRvcl90cmFja2VyKGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlciYgX194KSAKKyAgICAgIDogX01fY3VycmVudChfX3guX01fY3VycmVudCksIF9NX2RzKF9feC5fTV9kcykgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9NdXRhYmxlSXRlcmF0b3I+CisgICAgICAgIF9faXRlcmF0b3JfdHJhY2tlcihjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X011dGFibGVJdGVyYXRvciwKKwkJCSAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWYKKwkJCSAgIDwoc3RkOjpfX2FyZV9zYW1lPF9NdXRhYmxlSXRlcmF0b3IsIHR5cGVuYW1lCisJCQkgICAgIF9TZXF1ZW5jZTo6aXRlcmF0b3I6Ol9CYXNlX2l0ZXJhdG9yPjo6X192YWx1ZSksCisJCQkgICBfU2VxdWVuY2U+OjpfX3R5cGU+JiBfX3gpCisJOiAgX01fY3VycmVudChfX3guYmFzZSgpKSwgX01fZHMoX194Ll9NX2dldF9zZXF1ZW5jZSgpKSB7IH0KKworICAgICAgX0l0ZXJhdG9yCisgICAgICBiYXNlKCkgY29uc3QgeyByZXR1cm4gX01fY3VycmVudDsgfQorICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnZlcnNpb24gdG8gdW5kZXJseWluZyBub24tZGVidWcgaXRlcmF0b3IgdG8gYWxsb3cKKyAgICAgICAqIGJldHRlciBpbnRlcmFjdGlvbiB3aXRoIG5vbi1wcm9maWxlIGNvbnRhaW5lcnMuCisgICAgICAgKi8KKyAgICAgIG9wZXJhdG9yIF9JdGVyYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2N1cnJlbnQ7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYqX01fY3VycmVudDsgfQorCisgICAgICBfX2l0ZXJhdG9yX3RyYWNrZXImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwlfTV9kcy0+X01fcHJvZmlsZV9pdGVyYXRlKCk7CisJKytfTV9jdXJyZW50OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX19pdGVyYXRvcl90cmFja2VyCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlfTV9kcy0+X01fcHJvZmlsZV9pdGVyYXRlKCk7CisJX19pdGVyYXRvcl90cmFja2VyIF9fdG1wKCp0aGlzKTsKKwkrK19NX2N1cnJlbnQ7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICBfX2l0ZXJhdG9yX3RyYWNrZXImCisgICAgICBvcGVyYXRvci0tKCkKKyAgICAgIHsKKwlfTV9kcy0+X01fcHJvZmlsZV9pdGVyYXRlKDEpOworCS0tX01fY3VycmVudDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9faXRlcmF0b3JfdHJhY2tlcgorICAgICAgb3BlcmF0b3ItLShpbnQpCisgICAgICB7CisJX01fZHMtPl9NX3Byb2ZpbGVfaXRlcmF0ZSgxKTsKKwlfX2l0ZXJhdG9yX3RyYWNrZXIgX190bXAoKnRoaXMpOworCS0tX01fY3VycmVudDsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIF9faXRlcmF0b3JfdHJhY2tlciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXImIF9feCkKKyAgICAgIHsKKwlfTV9jdXJyZW50ID0gX194Ll9NX2N1cnJlbnQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiAqX01fY3VycmVudDsgfQorCisgICAgICAvLyAtLS0tLS0gUmFuZG9tIGFjY2VzcyBpdGVyYXRvciByZXF1aXJlbWVudHMgLS0tLS0tCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oY29uc3QgZGlmZmVyZW5jZV90eXBlJiBfX24pIGNvbnN0IAorICAgICAgeyByZXR1cm4gX01fY3VycmVudFtfX25dOyB9CisKKyAgICAgIF9faXRlcmF0b3JfdHJhY2tlciYKKyAgICAgIG9wZXJhdG9yKz0oY29uc3QgZGlmZmVyZW5jZV90eXBlJiBfX24pCisgICAgICB7CisJX01fY3VycmVudCArPSBfX247CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfX2l0ZXJhdG9yX3RyYWNrZXIKKyAgICAgIG9wZXJhdG9yKyhjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikgY29uc3QKKyAgICAgIHsKKwlfX2l0ZXJhdG9yX3RyYWNrZXIgX190bXAoKnRoaXMpOworCV9fdG1wICs9IF9fbjsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIF9faXRlcmF0b3JfdHJhY2tlciYKKyAgICAgIG9wZXJhdG9yLT0oY29uc3QgZGlmZmVyZW5jZV90eXBlJiBfX24pCisgICAgICB7CisJX01fY3VycmVudCArPSAtX19uOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX19pdGVyYXRvcl90cmFja2VyCisgICAgICBvcGVyYXRvci0oY29uc3QgZGlmZmVyZW5jZV90eXBlJiBfX24pIGNvbnN0CisgICAgICB7CisJX19pdGVyYXRvcl90cmFja2VyIF9fdG1wKCp0aGlzKTsKKwlfX3RtcCAtPSBfX247CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9maW5kKCkKKyAgICAgIHsgX01fZHMtPl9NX3Byb2ZpbGVfZmluZCgpOyB9CisKKyAgICAgIGNvbnN0IF9TZXF1ZW5jZSoKKyAgICAgIF9NX2dldF9zZXF1ZW5jZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBfU2VxdWVuY2UqPihfTV9kcyk7IH0KKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3JMLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvclIsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSA9PSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSA9PSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3JMLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvclIsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSAhPSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19saHMsCisgICAgICAgICAgICAgICBjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgIT0gX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUiwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3JMLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yUiwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpIDwgX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpIDwgX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUiwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yTCwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3JSLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPD0gX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPD0gX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUiwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3JMLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yUiwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpID4gX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpID4gX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUiwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yTCwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3JSLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPj0gX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPj0gX19yaHMuYmFzZSgpOyB9CisKKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyBBY2NvcmRpbmcgdG8gdGhlIHJlc29sdXRpb24gb2YgRFIxNzkgbm90IG9ubHkgdGhlIHZhcmlvdXMgY29tcGFyaXNvbgorICAvLyBvcGVyYXRvcnMgYnV0IGFsc28gb3BlcmF0b3ItIG11c3QgYWNjZXB0IG1peGVkIGl0ZXJhdG9yL2NvbnN0X2l0ZXJhdG9yCisgIC8vIHBhcmFtZXRlcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvckwsIF9TZXF1ZW5jZT46OmRpZmZlcmVuY2VfdHlwZQorICAgIG9wZXJhdG9yLShjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yTCwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvclIsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSAtIF9fcmhzLmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBvcGVyYXRvci0oY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpIC0gX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4KKyAgICBvcGVyYXRvcisodHlwZW5hbWUgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvcixfU2VxdWVuY2U+OjpkaWZmZXJlbmNlX3R5cGUKKwkgICAgICBfX24sCisJICAgICAgY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19pKQorICAgIHsgcmV0dXJuIF9faSArIF9fbjsgfQorCQorfSAgLy8gbmFtZXNwYWNlIF9fcHJvZmlsZQorfSAgLy8gbmFtZXNwYWNlIHN0ZAorI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvbGlzdCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9saXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NzBjNGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvbGlzdApAQCAtMCwwICsxLDY1NyBAQAorLy8gUHJvZmlsaW5nIGxpc3QgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvbGlzdAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwcm9maWxlIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX0xJU1QKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9MSVNUIDEKKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8cHJvZmlsZS9iYXNlLmg+IAorI2luY2x1ZGUgPHByb2ZpbGUvaXRlcmF0b3JfdHJhY2tlci5oPiAKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19wcm9maWxlCit7CisgIC8qKiBAYnJpZWYgTGlzdCB3cmFwcGVyIHdpdGggcGVyZm9ybWFuY2UgaW5zdHJ1bWVudGF0aW9uLiAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPF9UcD4gPgorICAgIGNsYXNzIGxpc3QKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQzo6bGlzdDxfVHAsIF9BbGxvY2F0b3I+CisgICAgeworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQzo6bGlzdDxfVHAsIF9BbGxvY2F0b3I+IF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgX19pdGVyYXRvcl90cmFja2VyPHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciwgbGlzdD4gICAgICAgIAorCQkJCSAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9faXRlcmF0b3JfdHJhY2tlcjx0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IsIGxpc3Q+ICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX1RwCQkJCSAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQWxsb2NhdG9yCQkJICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9wb2ludGVyICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIC8vIDIzLjIuMi4xIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgICBleHBsaWNpdAorICAgICAgbGlzdChjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fYSkgCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdCh0aGlzKTsgCS8vIGxpc3Qyc2xpc3QKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfY29uc3RydWN0Mih0aGlzKTsgCS8vIGxpc3QydmVjdG9yCisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBleHBsaWNpdAorICAgICAgbGlzdChzaXplX3R5cGUgX19uKQorICAgICAgOiBfQmFzZShfX24pIAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QodGhpcyk7IAorICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QyKHRoaXMpOyAKKyAgICAgIH0KKworICAgICAgbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUsCisJICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX24sIF9fdmFsdWUsIF9fYSkgCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdCh0aGlzKTsgCisgICAgICAgIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdDIodGhpcyk7IAorICAgICAgfQorI2Vsc2UKKyAgICAgIGV4cGxpY2l0CisgICAgICBsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWx1ZSA9IF9UcCgpLAorCSAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX3ZhbHVlLCBfX2EpIAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QodGhpcyk7IAorICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QyKHRoaXMpOyAKKyAgICAgIH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisjZWxzZQorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisjZW5kaWYKKyAgICAgIGxpc3QoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19maXJzdCwgX19sYXN0LCBfX2EpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdCh0aGlzKTsgCisgICAgICAgIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdDIodGhpcyk7IAorICAgICAgfQorCisgICAgICBsaXN0KGNvbnN0IGxpc3QmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSAKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfY29uc3RydWN0KHRoaXMpOyAKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfY29uc3RydWN0Mih0aGlzKTsgCisgICAgICB9CisKKyAgICAgIGxpc3QoY29uc3QgX0Jhc2UmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSAKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfY29uc3RydWN0KHRoaXMpOyAKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfY29uc3RydWN0Mih0aGlzKTsgCisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBsaXN0KGxpc3QmJiBfX3gpIG5vZXhjZXB0CisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3gpKQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QodGhpcyk7IAorICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QyKHRoaXMpOyAKKyAgICAgIH0KKworICAgICAgbGlzdChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKyAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIDogX0Jhc2UoX19sLCBfX2EpIHsgfQorI2VuZGlmCisKKyAgICAgIH5saXN0KCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgCisgICAgICAgIF9fcHJvZmN4eF9saXN0X2Rlc3RydWN0KHRoaXMpOyAKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfZGVzdHJ1Y3QyKHRoaXMpOyAKKyAgICAgIH0KKworICAgICAgbGlzdCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBsaXN0JiBfX3gpCisgICAgICB7CisJc3RhdGljX2Nhc3Q8X0Jhc2UmPigqdGhpcykgPSBfX3g7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgbGlzdCYKKyAgICAgIG9wZXJhdG9yPShsaXN0JiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5zd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBsaXN0JgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXN0YXRpY19jYXN0PF9CYXNlJj4oKnRoaXMpID0gX19sOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgYXNzaWduKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgewlfQmFzZTo6YXNzaWduKF9fbCk7IH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisjZWxzZQorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisjZW5kaWYKKyAgICAgICAgdm9pZAorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7IF9CYXNlOjphc3NpZ24oX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3QpCisgICAgICB7CV9CYXNlOjphc3NpZ24oX19uLCBfX3QpOyB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjpnZXRfYWxsb2NhdG9yOworCisgICAgICAvLyBpdGVyYXRvcnM6CisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9saXN0X3Jld2luZCh0aGlzKTsKKyAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9yZXdpbmQodGhpcyk7CisgICAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOworICAgICAgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9yZXdpbmQodGhpcyk7CisgICAgICAgIHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgCisgICAgICAgIF9fcHJvZmN4eF9saXN0X3Jld2luZCh0aGlzKTsKKyAgICAgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOworICAgICAgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorI2VuZGlmCisKKyAgICAgIC8vIDIzLjIuMi4yIGNhcGFjaXR5OgorICAgICAgdXNpbmcgX0Jhc2U6OmVtcHR5OworICAgICAgdXNpbmcgX0Jhc2U6OnNpemU7CisgICAgICB1c2luZyBfQmFzZTo6bWF4X3NpemU7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3opCisgICAgICB7IF9CYXNlOjpyZXNpemUoX19zeik7IH0KKworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6LCBjb25zdCBfVHAmIF9fYykKKyAgICAgIHsgX0Jhc2U6OnJlc2l6ZShfX3N6LCBfX2MpOyB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6LCBfVHAgX19jID0gX1RwKCkpCisgICAgICB7IF9CYXNlOjpyZXNpemUoX19zeiwgX19jKTsgfQorI2VuZGlmCisKKyAgICAgIC8vIGVsZW1lbnQgYWNjZXNzOgorICAgICAgcmVmZXJlbmNlCisgICAgICBmcm9udCgpCisgICAgICB7IHJldHVybiBfQmFzZTo6ZnJvbnQoKTsgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGZyb250KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9CYXNlOjpmcm9udCgpOyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgYmFjaygpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9saXN0X3Jld2luZCh0aGlzKTsKKwlyZXR1cm4gX0Jhc2U6OmJhY2soKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBiYWNrKCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfcmV3aW5kKHRoaXMpOworCXJldHVybiBfQmFzZTo6YmFjaygpOworICAgICAgfQorCisgICAgICAvLyAyMy4yLjIuMyBtb2RpZmllcnM6CisgICAgICB2b2lkCisgICAgICBwdXNoX2Zyb250KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfaW52YWxpZF9vcGVyYXRvcih0aGlzKTsKKyAgICAgICAgX19wcm9mY3h4X2xpc3Rfb3BlcmF0aW9uKHRoaXMpOworICAgICAgICBfQmFzZTo6cHVzaF9mcm9udChfX3gpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdXNpbmcgX0Jhc2U6OmVtcGxhY2VfZnJvbnQ7CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgcG9wX2Zyb250KCkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X2xpc3Rfb3BlcmF0aW9uKHRoaXMpOworCV9CYXNlOjpwb3BfZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgdXNpbmcgX0Jhc2U6OnB1c2hfYmFjazsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHVzaW5nIF9CYXNlOjplbXBsYWNlX2JhY2s7CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgcG9wX2JhY2soKQorICAgICAgeworCWl0ZXJhdG9yIF9fdmljdGltID0gZW5kKCk7CisJLS1fX3ZpY3RpbTsKKwlfQmFzZTo6cG9wX2JhY2soKTsKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfcmV3aW5kKHRoaXMpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGVtcGxhY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbXBsYWNlKF9fcG9zaXRpb24uYmFzZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLAorCQkJICB0aGlzKTsKKwl9CisjZW5kaWYKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCBfVHAmIF9feCkKKyAgICAgIHsKKyAgICAgICAgX01fcHJvZmlsZV9pbnNlcnQodGhpcywgX19wb3NpdGlvbiwgc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIF9feCksIHRoaXMpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBfVHAmJiBfX3gpCisgICAgICB7IAorICAgICAgICBfTV9wcm9maWxlX2luc2VydCh0aGlzLCBfX3Bvc2l0aW9uLCBzaXplKCkpOworICAgICAgICByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVtcGxhY2UoX19wb3NpdGlvbi5iYXNlKCksIHN0ZDo6bW92ZShfX3gpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOyAKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworICAgICAgICBfTV9wcm9maWxlX2luc2VydCh0aGlzLCBfX3Bvc2l0aW9uLCBzaXplKCkpOworICAgICAgICBfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBfX2wpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9feCkKKyAgICAgIHsKKyAgICAgICAgX01fcHJvZmlsZV9pbnNlcnQodGhpcywgX19wb3NpdGlvbiwgc2l6ZSgpKTsKKwlfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBfX24sIF9feCk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyNlbmRpZgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorCSAgICAgICBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisJeworCSAgX01fcHJvZmlsZV9pbnNlcnQodGhpcywgX19wb3NpdGlvbiwgc2l6ZSgpKTsKKwkgIF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIF9fZmlyc3QsIF9fbGFzdCk7CisJfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uLmJhc2UoKSksIHRoaXMpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDE1MS4gY2FuJ3QgY3VycmVudGx5IGNsZWFyKCkgZW1wdHkgY29udGFpbmVyCisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uLmJhc2UoKSwgX19sYXN0LmJhc2UoKSksIHRoaXMpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKGxpc3QmIF9feCkKKyAgICAgIHsJX0Jhc2U6OnN3YXAoX194KTsgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CV9CYXNlOjpjbGVhcigpOyB9CisKKyAgICAgIC8vIDIzLjIuMi40IGxpc3Qgb3BlcmF0aW9uczoKKyAgICAgIHZvaWQKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYmIF9feCkKKyNlbHNlCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYgX194KQorI2VuZGlmCisgICAgICB7IHRoaXMtPnNwbGljZShfX3Bvc2l0aW9uLCBfR0xJQkNYWF9NT1ZFKF9feCksIF9feC5iZWdpbigpLCBfX3guZW5kKCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYgX194KQorICAgICAgeyB0aGlzLT5zcGxpY2UoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCkpOyB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiBfX3gsIGl0ZXJhdG9yIF9faSkKKyAgICAgIHsgdGhpcy0+c3BsaWNlKF9fcG9zaXRpb24sIHN0ZDo6bW92ZShfX3gpLCBfX2kpOyB9CisjZW5kaWYKKworICAgICAgdm9pZAorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiYgX194LCBpdGVyYXRvciBfX2kpCisjZWxzZQorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCwgaXRlcmF0b3IgX19pKQorI2VuZGlmCisgICAgICB7CisJLy8gV2UgdXNlZCB0byBwZXJmb3JtIHRoZSBzcGxpY2VfYWxsb2MgY2hlY2s6ICBub3QgYW55bW9yZSwgcmVkdW5kYW50CisJLy8gYWZ0ZXIgaW1wbGVtZW50aW5nIHRoZSByZWxldmFudCBiaXRzIG9mIE4xNTk5LgorCisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCV9CYXNlOjpzcGxpY2UoX19wb3NpdGlvbi5iYXNlKCksIF9HTElCQ1hYX01PVkUoX194Ll9NX2Jhc2UoKSksCisJCSAgICAgIF9faS5iYXNlKCkpOworICAgICAgfQorCisgICAgICB2b2lkCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmJiBfX3gsIGl0ZXJhdG9yIF9fZmlyc3QsCisJICAgICBpdGVyYXRvciBfX2xhc3QpCisjZWxzZQorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCwgaXRlcmF0b3IgX19maXJzdCwKKwkgICAgIGl0ZXJhdG9yIF9fbGFzdCkKKyNlbmRpZgorICAgICAgeworCS8vIFdlIHVzZWQgdG8gcGVyZm9ybSB0aGUgc3BsaWNlX2FsbG9jIGNoZWNrOiAgbm90IGFueW1vcmUsIHJlZHVuZGFudAorCS8vIGFmdGVyIGltcGxlbWVudGluZyB0aGUgcmVsZXZhbnQgYml0cyBvZiBOMTU5OS4KKworCV9CYXNlOjpzcGxpY2UoX19wb3NpdGlvbi5iYXNlKCksIF9HTElCQ1hYX01PVkUoX194Ll9NX2Jhc2UoKSksCisJCSAgICAgIF9fZmlyc3QuYmFzZSgpLCBfX2xhc3QuYmFzZSgpKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiBfX3gsIGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgdGhpcy0+c3BsaWNlKF9fcG9zaXRpb24sIHN0ZDo6bW92ZShfX3gpLCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgcmVtb3ZlKGNvbnN0IF9UcCYgX192YWx1ZSkKKyAgICAgIHsKKwlmb3IgKGl0ZXJhdG9yIF9feCA9IGJlZ2luKCk7IF9feCAhPSBlbmQoKTsgKQorCSAgeworCSAgICBpZiAoKl9feCA9PSBfX3ZhbHVlKQorCSAgICAgIF9feCA9IGVyYXNlKF9feCk7CisJICAgIGVsc2UKKwkgICAgICArK19feDsKKwkgIH0KKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1ByZWRpY2F0ZT4KKyAgICAgICAgdm9pZAorICAgICAgICByZW1vdmVfaWYoX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgICAgIHsKKwkgIGZvciAoaXRlcmF0b3IgX194ID0gYmVnaW4oKTsgX194ICE9IGVuZCgpOyApCisJICAgIHsKKyAgICAgICAgICAgICAgX19wcm9mY3h4X2xpc3Rfb3BlcmF0aW9uKHRoaXMpOworCSAgICAgIGlmIChfX3ByZWQoKl9feCkpCisJCV9feCA9IGVyYXNlKF9feCk7CisJICAgICAgZWxzZQorCQkrK19feDsKKwkgICAgfQorCX0KKworICAgICAgdm9pZAorICAgICAgdW5pcXVlKCkKKyAgICAgIHsKKwlpdGVyYXRvciBfX2ZpcnN0ID0gYmVnaW4oKTsKKwlpdGVyYXRvciBfX2xhc3QgPSBlbmQoKTsKKwlpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJICByZXR1cm47CisJaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKwl3aGlsZSAoKytfX25leHQgIT0gX19sYXN0KQorCSAgeworICAgICAgICAgICAgX19wcm9mY3h4X2xpc3Rfb3BlcmF0aW9uKHRoaXMpOworCSAgICBpZiAoKl9fZmlyc3QgPT0gKl9fbmV4dCkKKwkgICAgICBlcmFzZShfX25leHQpOworCSAgICBlbHNlCisJICAgICAgX19maXJzdCA9IF9fbmV4dDsKKwkgICAgX19uZXh0ID0gX19maXJzdDsKKwkgIH0KKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICAgICAgdm9pZAorICAgICAgICB1bmlxdWUoX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKQorICAgICAgICB7CisJICBpdGVyYXRvciBfX2ZpcnN0ID0gYmVnaW4oKTsKKwkgIGl0ZXJhdG9yIF9fbGFzdCA9IGVuZCgpOworCSAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCSAgICByZXR1cm47CisJICBpdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworCSAgd2hpbGUgKCsrX19uZXh0ICE9IF9fbGFzdCkKKwkgICAgeworICAgICAgICAgICAgICBfX3Byb2ZjeHhfbGlzdF9vcGVyYXRpb24odGhpcyk7CisJICAgICAgaWYgKF9fYmluYXJ5X3ByZWQoKl9fZmlyc3QsICpfX25leHQpKQorCQllcmFzZShfX25leHQpOworCSAgICAgIGVsc2UKKwkJX19maXJzdCA9IF9fbmV4dDsKKwkgICAgICBfX25leHQgPSBfX2ZpcnN0OworCSAgICB9CisJfQorCisgICAgICB2b2lkCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgbWVyZ2UobGlzdCYmIF9feCkKKyNlbHNlCisgICAgICBtZXJnZShsaXN0JiBfX3gpCisjZW5kaWYKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMzAwLiBsaXN0OjptZXJnZSgpIHNwZWNpZmljYXRpb24gaW5jb21wbGV0ZQorCWlmICh0aGlzICE9ICZfX3gpCisJICB7IF9CYXNlOjptZXJnZShfR0xJQkNYWF9NT1ZFKF9feC5fTV9iYXNlKCkpKTsgfQorICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgbWVyZ2UobGlzdCYgX194KQorICAgICAgeyB0aGlzLT5tZXJnZShzdGQ6Om1vdmUoX194KSk7IH0KKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ29tcGFyZT4KKyAgICAgICAgdm9pZAorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgICAgbWVyZ2UobGlzdCYmIF9feCwgX0NvbXBhcmUgX19jb21wKQorI2Vsc2UKKyAgICAgICAgbWVyZ2UobGlzdCYgX194LCBfQ29tcGFyZSBfX2NvbXApCisjZW5kaWYKKyAgICAgICAgeworCSAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgLy8gMzAwLiBsaXN0OjptZXJnZSgpIHNwZWNpZmljYXRpb24gaW5jb21wbGV0ZQorCSAgaWYgKHRoaXMgIT0gJl9feCkKKwkgICAgeyBfQmFzZTo6bWVyZ2UoX0dMSUJDWFhfTU9WRShfX3guX01fYmFzZSgpKSwgX19jb21wKTsgfQorCX0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db21wYXJlPgorICAgICAgICB2b2lkCisgICAgICAgIG1lcmdlKGxpc3QmIF9feCwgX0NvbXBhcmUgX19jb21wKQorICAgICAgICB7IHRoaXMtPm1lcmdlKHN0ZDo6bW92ZShfX3gpLCBfX2NvbXApOyB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgc29ydCgpIHsgX0Jhc2U6OnNvcnQoKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3RyaWN0V2Vha09yZGVyaW5nPgorICAgICAgICB2b2lkCisgICAgICAgIHNvcnQoX1N0cmljdFdlYWtPcmRlcmluZyBfX3ByZWQpIHsgX0Jhc2U6OnNvcnQoX19wcmVkKTsgfQorCisgICAgICB1c2luZyBfQmFzZTo6cmV2ZXJzZTsKKworICAgICAgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgX0dMSUJDWFhfTk9FWENFUFQgICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3QgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgdm9pZCBfTV9wcm9maWxlX2ZpbmQoKSBjb25zdAorICAgICAgeyB9CisKKyAgICAgIHZvaWQgX01fcHJvZmlsZV9pdGVyYXRlKGludCBfX3Jld2luZCA9IDApIGNvbnN0IAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9vcGVyYXRpb24odGhpcyk7CisgICAgICAgIF9fcHJvZmN4eF9saXN0X2l0ZXJhdGUodGhpcyk7IAorICAgICAgICBpZiAoX19yZXdpbmQpCisgICAgICAgICAgX19wcm9mY3h4X2xpc3RfcmV3aW5kKHRoaXMpOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHNpemVfdHlwZSBfTV9wcm9maWxlX2luc2VydCh2b2lkKiBvYmosIGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19zaXplKQorICAgICAgeworICAgICAgICBzaXplX3R5cGUgX19zaGlmdCA9IDA7CisgICAgICAgIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfX2l0ID0gX19wb3MuYmFzZSgpOworICAgICAgICBmb3IgKCA7IF9faXQhPV9CYXNlOjplbmQoKTsgX19pdCsrKQorICAgICAgICAgIF9fc2hpZnQrKzsKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfcmV3aW5kKHRoaXMpOworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9vcGVyYXRpb24odGhpcyk7CisgICAgICAgIF9fcHJvZmN4eF9saXN0X2luc2VydCh0aGlzLCBfX3NoaWZ0LCBfX3NpemUpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA9PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpICE9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID49IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGxpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywgbGlzdDxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgX19saHMuc3dhcChfX3Jocyk7IH0KKworfSAvLyBuYW1lc3BhY2UgX19wcm9maWxlCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvbWFwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDA3ZjU3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL21hcApAQCAtMCwwICsxLDM1IEBACisvLyBQcm9maWxpbmcgbWFwL211bHRpbWFwIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvbWFwCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHByb2ZpbGUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfTUFQCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfTUFQIDEKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxwcm9maWxlL21hcC5oPgorI2luY2x1ZGUgPHByb2ZpbGUvbXVsdGltYXAuaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvbWFwLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRhZjJiYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9tYXAuaApAQCAtMCwwICsxLDU2MSBAQAorLy8gUHJvZmlsaW5nIG1hcCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKy8vIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL21hcC5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHByb2ZpbGUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfTUFQX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9NQVBfSCAxCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHByb2ZpbGUvYmFzZS5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3Byb2ZpbGUKK3sKKyAgLy8vIENsYXNzIHN0ZDo6bWFwIHdyYXBwZXIgd2l0aCBwZXJmb3JtYW5jZSBpbnN0cnVtZW50YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleT4sCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4gPgorICAgIGNsYXNzIG1hcAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjptYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX1NURF9DOjptYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4gX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlczoKKyAgICAgIHR5cGVkZWYgX0tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQ29tcGFyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9jb21wYXJlOworICAgICAgdHlwZWRlZiBfQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnBvaW50ZXIgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICAvLyAyMy4zLjEuMSBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgZXhwbGljaXQKKyAgICAgIG1hcChjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19jb21wLCBfX2EpCisgICAgICB7IF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9jb25zdHJ1Y3QodGhpcyk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICAgIG1hcChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCSAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisJOiBfQmFzZShfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCwgX19hKQorICAgICAgICB7IF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9jb25zdHJ1Y3QodGhpcyk7IH0KKworICAgICAgbWFwKGNvbnN0IG1hcCYgX194KQorICAgICAgOiBfQmFzZShfX3gpCisgICAgICB7IF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9jb25zdHJ1Y3QodGhpcyk7IH0KKworICAgICAgbWFwKGNvbnN0IF9CYXNlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkKKyAgICAgIHsgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2NvbnN0cnVjdCh0aGlzKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgbWFwKG1hcCYmIF9feCkKKyAgICAgIG5vZXhjZXB0KGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPF9Db21wYXJlPjo6dmFsdWUpCisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3gpKQorICAgICAgeyB9CisKKyAgICAgIG1hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkgIGNvbnN0IF9Db21wYXJlJiBfX2MgPSBfQ29tcGFyZSgpLAorCSAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbCwgX19jLCBfX2EpIHsgfQorI2VuZGlmCisKKyAgICAgIH5tYXAoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZGVzdHJ1Y3QodGhpcyk7IH0KKworICAgICAgbWFwJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IG1hcCYgX194KQorICAgICAgeworCSpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX194OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIG1hcCYKKyAgICAgIG9wZXJhdG9yPShtYXAmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPnN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIG1hcCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAxMzMuIG1hcCBtaXNzaW5nIGdldF9hbGxvY2F0b3IoKQorICAgICAgdXNpbmcgX0Jhc2U6OmdldF9hbGxvY2F0b3I7CisKKyAgICAgIC8vIGl0ZXJhdG9yczoKKyAgICAgIGl0ZXJhdG9yIAorICAgICAgYmVnaW4oKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX0Jhc2U6OmJlZ2luKCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIF9CYXNlOjpiZWdpbigpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX0Jhc2U6OmVuZCgpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gX0Jhc2U6OmVuZCgpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IAorICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSh0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyAKKyAgICAgIH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUodGhpcyk7CisgICAgICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsKKyAgICAgIH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKHRoaXMpOworICAgICAgICByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKHRoaXMpOworICAgICAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKHRoaXMpOworICAgICAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUodGhpcyk7CisgICAgICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vIGNhcGFjaXR5OgorICAgICAgdXNpbmcgX0Jhc2U6OmVtcHR5OworICAgICAgdXNpbmcgX0Jhc2U6OnNpemU7CisgICAgICB1c2luZyBfQmFzZTo6bWF4X3NpemU7CisKKyAgICAgIC8vIDIzLjMuMS4yIGVsZW1lbnQgYWNjZXNzOgorICAgICAgbWFwcGVkX3R5cGUmCisgICAgICBvcGVyYXRvcltdKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9maW5kKHRoaXMsIHNpemUoKSk7CisgICAgICAgIHJldHVybiBfQmFzZTo6b3BlcmF0b3JbXShfX2spOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgbWFwcGVkX3R5cGUmCisgICAgICBvcGVyYXRvcltdKGtleV90eXBlJiYgX19rKQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZmluZCh0aGlzLCBzaXplKCkpOworICAgICAgICByZXR1cm4gX0Jhc2U6Om9wZXJhdG9yW10oc3RkOjptb3ZlKF9faykpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIG1hcHBlZF90eXBlJgorICAgICAgYXQoY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ZpbmQodGhpcywgc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIF9CYXNlOjphdChfX2spOworICAgICAgfQorCisgICAgICBjb25zdCBtYXBwZWRfdHlwZSYKKyAgICAgIGF0KGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0CisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9maW5kKHRoaXMsIHNpemUoKSk7CisgICAgICAgIHJldHVybiBfQmFzZTo6YXQoX19rKTsKKyAgICAgIH0KKworICAgICAgLy8gbW9kaWZpZXJzOgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKwllbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnNlcnQodGhpcywgc2l6ZSgpLCAxKTsKKwkgIGF1dG8gX19yZXMgPSBfQmFzZTo6ZW1wbGFjZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgcmV0dXJuIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4oaXRlcmF0b3IoX19yZXMuZmlyc3QpLAorCQkJCQkgICBfX3Jlcy5zZWNvbmQpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlX2hpbnQoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIHNpemVfdHlwZSBzaXplX2JlZm9yZSA9IHNpemUoKTsKKwkgIGF1dG8gX19yZXMgPSBfQmFzZTo6ZW1wbGFjZV9oaW50KF9fcG9zLAorCQkJCQkgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2luc2VydCh0aGlzLCBzaXplX2JlZm9yZSwKKwkJCQkJCXNpemUoKSAtIHNpemVfYmVmb3JlKTsKKwkgIHJldHVybiBfX3JlczsKKwl9CisjZW5kaWYKKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2luc2VydCh0aGlzLCBzaXplKCksIDEpOworCXR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworCXN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgYm9vbD4gX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9feCk7CisJcmV0dXJuIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4oaXRlcmF0b3IoX19yZXMuZmlyc3QpLAorCQkJCQkgX19yZXMuc2Vjb25kKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLAorCQkJCQkJICAgIF9QYWlyJiY+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgICAgaW5zZXJ0KF9QYWlyJiYgX194KQorICAgICAgICB7CisJICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW5zZXJ0KHRoaXMsIHNpemUoKSwgMSk7CisJICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKwkgIHN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgYm9vbD4gX19yZXMKKwkgICAgPSBfQmFzZTo6aW5zZXJ0KHN0ZDo6Zm9yd2FyZDxfUGFpcj4oX194KSk7CisJICByZXR1cm4gc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPihpdGVyYXRvcihfX3Jlcy5maXJzdCksCisJCQkJCSAgIF9fcmVzLnNlY29uZCk7CisJfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbGlzdCkKKyAgICAgIHsgCisgICAgICAgIHNpemVfdHlwZSBzaXplX2JlZm9yZSA9IHNpemUoKTsKKyAgICAgICAgX0Jhc2U6Omluc2VydChfX2xpc3QpOyAKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2luc2VydCh0aGlzLCBzaXplX2JlZm9yZSwgCisJCQkJCSAgICAgIHNpemUoKSAtIHNpemVfYmVmb3JlKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBpdGVyYXRvcgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZWxzZQorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbmRpZgorICAgICAgeworICAgICAgICBzaXplX3R5cGUgc2l6ZV9iZWZvcmUgPSBzaXplKCk7CisJaXRlcmF0b3IgX19pID0gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLCBfX3gpKTsKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2luc2VydCh0aGlzLCBzaXplX2JlZm9yZSwKKwkJCQkJICAgICAgc2l6ZSgpIC0gc2l6ZV9iZWZvcmUpOworCXJldHVybiBfX2k7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8dmFsdWVfdHlwZSwKKwkJCQkJCSAgICBfUGFpciYmPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgX1BhaXImJiBfX3gpCisgICAgICAgIHsKKwkgIHNpemVfdHlwZSBzaXplX2JlZm9yZSA9IHNpemUoKTsKKwkgIGl0ZXJhdG9yIF9faQorCSAgICA9IGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbiwgc3RkOjpmb3J3YXJkPF9QYWlyPihfX3gpKSk7CisJICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW5zZXJ0KHRoaXMsIHNpemVfYmVmb3JlLCAKKwkJCQkJCXNpemUoKSAtIHNpemVfYmVmb3JlKTsKKwkgIHJldHVybiBfX2k7CisgICAgICB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworICAgICAgICAgIHNpemVfdHlwZSBzaXplX2JlZm9yZSA9IHNpemUoKTsKKwkgIF9CYXNlOjppbnNlcnQoX19maXJzdCwgX19sYXN0KTsKKyAgICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW5zZXJ0KHRoaXMsIHNpemVfYmVmb3JlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUoKSAtIHNpemVfYmVmb3JlKTsKKwl9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsKKwlpdGVyYXRvciBfX2kgPSBfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbik7CisgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9lcmFzZSh0aGlzLCBzaXplKCksIDEpOworICAgICAgICByZXR1cm4gX19pOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgcmV0dXJuIGVyYXNlKGNvbnN0X2l0ZXJhdG9yKF9fcG9zaXRpb24pKTsgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24pOworICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZXJhc2UodGhpcywgc2l6ZSgpLCAxKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7CisJaXRlcmF0b3IgX192aWN0aW0gPSBmaW5kKF9feCk7CisJaWYgKF9fdmljdGltID09IGVuZCgpKQorCSAgcmV0dXJuIDA7CisJZWxzZQorCXsKKwkgIF9CYXNlOjplcmFzZShfX3ZpY3RpbSk7CisJICByZXR1cm4gMTsKKwl9CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fZmlyc3QsIF9fbGFzdCkpOyB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyBfQmFzZTo6ZXJhc2UoX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAobWFwJiBfX3gpCisgICAgICB7IF9CYXNlOjpzd2FwKF9feCk7IH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyB0aGlzLT5lcmFzZShiZWdpbigpLCBlbmQoKSk7IH0KKworICAgICAgLy8gb2JzZXJ2ZXJzOgorICAgICAgdXNpbmcgX0Jhc2U6OmtleV9jb21wOworICAgICAgdXNpbmcgX0Jhc2U6OnZhbHVlX2NvbXA7CisKKyAgICAgIC8vIDIzLjMuMS4zIG1hcCBvcGVyYXRpb25zOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ZpbmQodGhpcywgc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpmaW5kKF9feCkpOworICAgICAgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZmluZCh0aGlzLCBzaXplKCkpOworICAgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX194KSk7CisgICAgICB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ZpbmQodGhpcywgc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIF9CYXNlOjpjb3VudChfX3gpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgCisgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKHRoaXMpOworICAgICAgICByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omxvd2VyX2JvdW5kKF9feCkpOyAKKyAgICAgIH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IAorICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSh0aGlzKTsKKyAgICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpsb3dlcl9ib3VuZChfX3gpKTsgCisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyAKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUodGhpcyk7CisgICAgICAgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6dXBwZXJfYm91bmQoX194KSk7IAorICAgICAgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgCisgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKHRoaXMpOworICAgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OnVwcGVyX2JvdW5kKF9feCkpOyAKKyAgICAgIH0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3JlcyA9CisJX0Jhc2U6OmVxdWFsX3JhbmdlKF9feCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0KSwKKwkJCSAgICAgIGl0ZXJhdG9yKF9fcmVzLnNlY29uZCkpOworICAgICAgfQorCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZmluZCh0aGlzLCBzaXplKCkpOworCXR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlX2NvbnN0X2l0ZXJhdG9yOworCXN0ZDo6cGFpcjxfQmFzZV9jb25zdF9pdGVyYXRvciwgX0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9fcmVzID0KKwlfQmFzZTo6ZXF1YWxfcmFuZ2UoX194KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoY29uc3RfaXRlcmF0b3IoX19yZXMuZmlyc3QpLAorCQkJICAgICAgY29uc3RfaXRlcmF0b3IoX19yZXMuc2Vjb25kKSk7CisgICAgICB9CisKKyAgICAgIF9CYXNlJiAKKyAgICAgIF9NX2Jhc2UoKSBfR0xJQkNYWF9OT0VYQ0VQVCAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVCB7IHJldHVybiAqdGhpczsgfQorCisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyAKKyAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKCZfX2xocyk7CisgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSgmX19yaHMpOworICAgICAgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA9PSBfX3Jocy5fTV9iYXNlKCk7IAorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyAKKyAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKCZfX2xocyk7CisgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSgmX19yaHMpOworICAgICAgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSAhPSBfX3Jocy5fTV9iYXNlKCk7IAorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKCZfX2xocyk7CisgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSgmX19yaHMpOworICAgICAgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8IF9fcmhzLl9NX2Jhc2UoKTsgCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7CisgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSgmX19saHMpOworICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUoJl9fcmhzKTsKKyAgICAgIHJldHVybiBfX2xocy5fTV9iYXNlKCkgPD0gX19yaHMuX01fYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeworICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUoJl9fbGhzKTsKKyAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKCZfX3Jocyk7CisgICAgICByZXR1cm4gX19saHMuX01fYmFzZSgpID49IF9fcmhzLl9NX2Jhc2UoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7CisgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSgmX19saHMpOworICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUoJl9fcmhzKTsKKyAgICAgIHJldHVybiBfX2xocy5fTV9iYXNlKCkgPiBfX3Jocy5fTV9iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAobWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fcHJvZmlsZQorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL211bHRpbWFwLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvbXVsdGltYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmNkMDIwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL211bHRpbWFwLmgKQEAgLTAsMCArMSw0MDggQEAKKy8vIFByb2ZpbGluZyBtdWx0aW1hcCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9tdWx0aW1hcC5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHByb2ZpbGUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfTVVMVElNQVBfSAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX01VTFRJTUFQX0ggMQorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19wcm9maWxlCit7CisgIC8vLyBDbGFzcyBzdGQ6Om11bHRpbWFwIHdyYXBwZXIgd2l0aCBwZXJmb3JtYW5jZSBpbnN0cnVtZW50YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleT4sCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4gPgorICAgIGNsYXNzIG11bHRpbWFwCisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6Om11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+CisgICAgeworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQzo6bXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4gX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlczoKKyAgICAgIHR5cGVkZWYgX0tleQkJCQkgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfVHAJCQkJICAgICBtYXBwZWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0NvbXBhcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9BbGxvY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9yZWZlcmVuY2UgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZXZlcnNlX2l0ZXJhdG9yICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpwb2ludGVyICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9wb2ludGVyICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisKKyAgICAgIC8vIDIzLjMuMS4xIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgICBleHBsaWNpdCBtdWx0aW1hcChjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkJCWNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19jb21wLCBfX2EpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisjZW5kaWYKKyAgICAgIG11bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJICAgICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19maXJzdCwgX19sYXN0LCBfX2NvbXAsIF9fYSkgeyB9CisKKyAgICAgIG11bHRpbWFwKGNvbnN0IG11bHRpbWFwJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkgeyB9CisKKyAgICAgIG11bHRpbWFwKGNvbnN0IF9CYXNlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBtdWx0aW1hcChtdWx0aW1hcCYmIF9feCkKKyAgICAgIG5vZXhjZXB0KGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPF9Db21wYXJlPjo6dmFsdWUpCisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3gpKQorICAgICAgeyB9CisKKyAgICAgIG11bHRpbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCSAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jID0gX0NvbXBhcmUoKSwKKwkgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbCwgX19jLCBfX2EpIHsgfQorI2VuZGlmCisKKyAgICAgIH5tdWx0aW1hcCgpIF9HTElCQ1hYX05PRVhDRVBUIHsgfQorCisgICAgICBtdWx0aW1hcCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBtdWx0aW1hcCYgX194KQorICAgICAgeworCSpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX194OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIG11bHRpbWFwJgorICAgICAgb3BlcmF0b3I9KG11bHRpbWFwJiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5zd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBtdWx0aW1hcCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB1c2luZyBfQmFzZTo6Z2V0X2FsbG9jYXRvcjsKKworICAgICAgLy8gaXRlcmF0b3JzOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorI2VuZGlmCisKKyAgICAgIC8vIGNhcGFjaXR5OgorICAgICAgdXNpbmcgX0Jhc2U6OmVtcHR5OworICAgICAgdXNpbmcgX0Jhc2U6OnNpemU7CisgICAgICB1c2luZyBfQmFzZTo6bWF4X3NpemU7CisKKyAgICAgIC8vIG1vZGlmaWVyczoKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbXBsYWNlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlX2hpbnQoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW1wbGFjZV9oaW50KF9fcG9zLAorCQkJCQkgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKTsKKwl9CisjZW5kaWYKKyAgICAgIAorICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9feCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8dmFsdWVfdHlwZSwKKwkJCQkJCSAgICBfUGFpciYmPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBpbnNlcnQoX1BhaXImJiBfX3gpCisgICAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoc3RkOjpmb3J3YXJkPF9QYWlyPihfX3gpKSk7IH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2xpc3QpCisgICAgICB7IF9CYXNlOjppbnNlcnQoX19saXN0KTsgfQorI2VuZGlmCisKKyAgICAgIGl0ZXJhdG9yCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbHNlCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorI2VuZGlmCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24sIF9feCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8dmFsdWVfdHlwZSwKKwkJCQkJCSAgICBfUGFpciYmPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgX1BhaXImJiBfX3gpCisgICAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbiwKKwkJCQkJc3RkOjpmb3J3YXJkPF9QYWlyPihfX3gpKSk7IH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisjZW5kaWYKKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7IF9CYXNlOjppbnNlcnQoX19maXJzdCwgX19sYXN0KTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbikpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24pKTsgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uKTsgfQorI2VuZGlmCisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBfX3ZpY3RpbXMgPSB0aGlzLT5lcXVhbF9yYW5nZShfX3gpOworCXNpemVfdHlwZSBfX2NvdW50ID0gMDsKKwl3aGlsZSAoX192aWN0aW1zLmZpcnN0ICE9IF9fdmljdGltcy5zZWNvbmQpCisJeworCSAgaXRlcmF0b3IgX192aWN0aW0gPSBfX3ZpY3RpbXMuZmlyc3QrKzsKKwkgIF9CYXNlOjplcmFzZShfX3ZpY3RpbSk7CisJICArK19fY291bnQ7CisJfQorCXJldHVybiBfX2NvdW50OworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX2ZpcnN0LCBfX2xhc3QpKTsgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgX0Jhc2U6OmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBzd2FwKG11bHRpbWFwJiBfX3gpCisgICAgICB7IF9CYXNlOjpzd2FwKF9feCk7IH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyB0aGlzLT5lcmFzZShiZWdpbigpLCBlbmQoKSk7IH0KKworICAgICAgLy8gb2JzZXJ2ZXJzOgorICAgICAgdXNpbmcgX0Jhc2U6OmtleV9jb21wOworICAgICAgdXNpbmcgX0Jhc2U6OnZhbHVlX2NvbXA7CisKKyAgICAgIC8vIDIzLjMuMS4zIG11bHRpbWFwIG9wZXJhdGlvbnM6CisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX194KSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpmaW5kKF9feCkpOyB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjpjb3VudDsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6bG93ZXJfYm91bmQoX194KSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6bG93ZXJfYm91bmQoX194KSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6dXBwZXJfYm91bmQoX194KSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6dXBwZXJfYm91bmQoX194KSk7IH0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3JlcyA9CisJX0Jhc2U6OmVxdWFsX3JhbmdlKF9feCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0KSwKKwkJCSAgICAgIGl0ZXJhdG9yKF9fcmVzLnNlY29uZCkpOworICAgICAgfQorCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlX2NvbnN0X2l0ZXJhdG9yOworCXN0ZDo6cGFpcjxfQmFzZV9jb25zdF9pdGVyYXRvciwgX0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9fcmVzID0KKwlfQmFzZTo6ZXF1YWxfcmFuZ2UoX194KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoY29uc3RfaXRlcmF0b3IoX19yZXMuZmlyc3QpLAorCQkJICAgICAgY29uc3RfaXRlcmF0b3IoX19yZXMuc2Vjb25kKSk7CisgICAgICB9CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpIF9HTElCQ1hYX05PRVhDRVBUICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUIHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA9PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSAhPSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPCBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPiBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgX19saHMuc3dhcChfX3Jocyk7IH0KKworfSAvLyBuYW1lc3BhY2UgX19wcm9maWxlCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvbXVsdGlzZXQuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9tdWx0aXNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNzQ2YjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvbXVsdGlzZXQuaApAQCAtMCwwICsxLDM5MyBAQAorLy8gUHJvZmlsaW5nIG11bHRpc2V0IGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL211bHRpc2V0LmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcHJvZmlsZSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9NVUxUSVNFVF9ICisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfTVVMVElTRVRfSCAxCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3Byb2ZpbGUKK3sKKyAgLy8vIENsYXNzIHN0ZDo6bXVsdGlzZXQgd3JhcHBlciB3aXRoIHBlcmZvcm1hbmNlIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleT4sCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPF9LZXk+ID4KKyAgICBjbGFzcyBtdWx0aXNldAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjptdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX1NURF9DOjptdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4gX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlczoKKyAgICAgIHR5cGVkZWYgX0tleQkJCQkgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfS2V5CQkJCSAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0NvbXBhcmUJCQkJICAgICBrZXlfY29tcGFyZTsKKyAgICAgIHR5cGVkZWYgX0NvbXBhcmUJCQkJICAgICB2YWx1ZV9jb21wYXJlOworICAgICAgdHlwZWRlZiBfQWxsb2NhdG9yCQkJICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlZmVyZW5jZQkgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmV2ZXJzZV9pdGVyYXRvciAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgICBjb25zdF9wb2ludGVyOworCisgICAgICAvLyAyMy4zLjMuMSBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgZXhwbGljaXQgbXVsdGlzZXQoY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJCQljb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fY29tcCwgX19hKSB7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICAgIG11bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCQkgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorCTogX0Jhc2UoX19maXJzdCwgX19sYXN0LCBfX2NvbXAsIF9fYSkgeyB9CisKKyAgICAgIG11bHRpc2V0KGNvbnN0IG11bHRpc2V0JiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkgeyB9CisKKyAgICAgIG11bHRpc2V0KGNvbnN0IF9CYXNlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkgeyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBtdWx0aXNldChtdWx0aXNldCYmIF9feCkKKyAgICAgIG5vZXhjZXB0KGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPF9Db21wYXJlPjo6dmFsdWUpCisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3gpKQorICAgICAgeyB9CisKKyAgICAgIG11bHRpc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCSAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbCwgX19jb21wLCBfX2EpIHsgfQorI2VuZGlmCisKKyAgICAgIH5tdWx0aXNldCgpIF9HTElCQ1hYX05PRVhDRVBUIHsgfQorCisgICAgICBtdWx0aXNldCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBtdWx0aXNldCYgX194KQorICAgICAgeworCSpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX194OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIG11bHRpc2V0JgorICAgICAgb3BlcmF0b3I9KG11bHRpc2V0JiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5zd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBtdWx0aXNldCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB1c2luZyBfQmFzZTo6Z2V0X2FsbG9jYXRvcjsKKworICAgICAgLy8gaXRlcmF0b3JzOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorI2VuZGlmCisKKyAgICAgIC8vIGNhcGFjaXR5OgorICAgICAgdXNpbmcgX0Jhc2U6OmVtcHR5OworICAgICAgdXNpbmcgX0Jhc2U6OnNpemU7CisgICAgICB1c2luZyBfQmFzZTo6bWF4X3NpemU7CisKKyAgICAgIC8vIG1vZGlmaWVyczoKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVtcGxhY2Uoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlX2hpbnQoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW1wbGFjZV9oaW50KF9fcG9zLAorCQkJCQkgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKTsKKwl9CisjZW5kaWYKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9feCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KHN0ZDo6bW92ZShfX3gpKSk7IH0KKyNlbmRpZgorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbiwgX194KSk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgdmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCkpKTsgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyNlbmRpZgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsgX0Jhc2U6Omluc2VydChfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IF9CYXNlOjppbnNlcnQoX19sKTsgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uKSk7IH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyBfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbik7IH0KKyNlbmRpZgorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7CisJc3RkOjpwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gX192aWN0aW1zID0gdGhpcy0+ZXF1YWxfcmFuZ2UoX194KTsKKwlzaXplX3R5cGUgX19jb3VudCA9IDA7CisJd2hpbGUgKF9fdmljdGltcy5maXJzdCAhPSBfX3ZpY3RpbXMuc2Vjb25kKQorCXsKKwkgIGl0ZXJhdG9yIF9fdmljdGltID0gX192aWN0aW1zLmZpcnN0Kys7CisJICBfQmFzZTo6ZXJhc2UoX192aWN0aW0pOworCSAgKytfX2NvdW50OworCX0KKwlyZXR1cm4gX19jb3VudDsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19maXJzdCwgX19sYXN0KSk7IH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7IF9CYXNlOjplcmFzZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgc3dhcChtdWx0aXNldCYgX194KQorICAgICAgeyBfQmFzZTo6c3dhcChfX3gpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgdGhpcy0+ZXJhc2UoYmVnaW4oKSwgZW5kKCkpOyB9CisKKyAgICAgIC8vIG9ic2VydmVyczoKKyAgICAgIHVzaW5nIF9CYXNlOjprZXlfY29tcDsKKyAgICAgIHVzaW5nIF9CYXNlOjp2YWx1ZV9jb21wOworCisgICAgICAvLyBtdWx0aXNldCBvcGVyYXRpb25zOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpmaW5kKF9feCkpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxNC4gc2V0OjpmaW5kKCkgbWlzc2luZyBjb25zdCBvdmVybG9hZAorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpmaW5kKF9feCkpOyB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjpjb3VudDsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6bG93ZXJfYm91bmQoX194KSk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjE0LiBzZXQ6OmZpbmQoKSBtaXNzaW5nIGNvbnN0IG92ZXJsb2FkCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpsb3dlcl9ib3VuZChfX3gpKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjp1cHBlcl9ib3VuZChfX3gpKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTQuIHNldDo6ZmluZCgpIG1pc3NpbmcgY29uc3Qgb3ZlcmxvYWQKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OnVwcGVyX2JvdW5kKF9feCkpOyB9CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvcixpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX19yZXMgPQorICAgICAgICBfQmFzZTo6ZXF1YWxfcmFuZ2UoX194KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoX19yZXMuZmlyc3QpLAorCQkJICAgICAgaXRlcmF0b3IoX19yZXMuc2Vjb25kKSk7CisgICAgICB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxNC4gc2V0OjpmaW5kKCkgbWlzc2luZyBjb25zdCBvdmVybG9hZAorICAgICAgc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3JlcyA9CisgICAgICAgIF9CYXNlOjplcXVhbF9yYW5nZShfX3gpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihjb25zdF9pdGVyYXRvcihfX3Jlcy5maXJzdCksCisJCQkgICAgICBjb25zdF9pdGVyYXRvcihfX3Jlcy5zZWNvbmQpKTsKKyAgICAgIH0KKworICAgICAgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgX0dMSUJDWFhfTk9FWENFUFQgICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3QgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQgeyByZXR1cm4gKnRoaXM7IH0KKworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID09IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSAhPSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDw9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgdm9pZAorICAgIHN3YXAobXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3gsCisJIG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5zd2FwKF9feSk7IH0KKworfSAvLyBuYW1lc3BhY2UgX19wcm9maWxlCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvc2V0IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL3NldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGUwNDM0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL3NldApAQCAtMCwwICsxLDM1IEBACisvLyBQcm9maWxpbmcgc2V0L211bHRpc2V0IGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvc2V0CisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHByb2ZpbGUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfU0VUCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfU0VUIDEKKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxwcm9maWxlL3NldC5oPgorI2luY2x1ZGUgPHByb2ZpbGUvbXVsdGlzZXQuaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvc2V0LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkMGJjNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS9zZXQuaApAQCAtMCwwICsxLDQwNyBAQAorLy8gUHJvZmlsaW5nIHNldCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9zZXQuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwcm9maWxlIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX1NFVF9ICisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfU0VUX0ggMQorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpIAoreworbmFtZXNwYWNlIF9fcHJvZmlsZQoreworICAvLy8gQ2xhc3Mgc3RkOjpzZXQgd3JhcHBlciB3aXRoIHBlcmZvcm1hbmNlIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleT4sCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPF9LZXk+ID4KKyAgICBjbGFzcyBzZXQKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQzo6c2V0PF9LZXksX0NvbXBhcmUsX0FsbG9jYXRvcj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX1NURF9DOjpzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+IF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgLy8gdHlwZXM6CisgICAgICB0eXBlZGVmIF9LZXkJCQkJICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfS2V5CQkJCSAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQ29tcGFyZQkJCQkgICAga2V5X2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9Db21wYXJlCQkJCSAgICB2YWx1ZV9jb21wYXJlOworICAgICAgdHlwZWRlZiBfQWxsb2NhdG9yCQkJICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmV2ZXJzZV9pdGVyYXRvciAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnBvaW50ZXIgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisKKyAgICAgIC8vIDIzLjMuMy4xIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgICBleHBsaWNpdCBzZXQoY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJCSAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19jb21wLCBfX2EpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsCisJICAgICAgIHR5cGVuYW1lID0gc3RkOjpfUmVxdWlyZUlucHV0SXRlcjxfSW5wdXRJdGVyYXRvcj4+CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisjZW5kaWYKKyAgICAgICAgc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKwk6IF9CYXNlKF9fZmlyc3QsIF9fbGFzdCwgX19jb21wLCBfX2EpIHsgfQorCisgICAgICBzZXQoY29uc3Qgc2V0JiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkgeyB9CisKKyAgICAgIHNldChjb25zdCBfQmFzZSYgX194KQorICAgICAgOiBfQmFzZShfX3gpIHsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc2V0KHNldCYmIF9feCkKKyAgICAgIG5vZXhjZXB0KGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlPF9Db21wYXJlPjo6dmFsdWUpCisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3gpKQorICAgICAgeyB9CisKKyAgICAgIHNldChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCSAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbCwgX19jb21wLCBfX2EpIHsgfQorI2VuZGlmCisKKyAgICAgIH5zZXQoKSBfR0xJQkNYWF9OT0VYQ0VQVCB7IH0KKworICAgICAgc2V0JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHNldCYgX194KQorICAgICAgeworCSpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX194OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHNldCYKKyAgICAgIG9wZXJhdG9yPShzZXQmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPnN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHNldCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB1c2luZyBfQmFzZTo6Z2V0X2FsbG9jYXRvcjsKKworICAgICAgLy8gaXRlcmF0b3JzOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorI2VuZGlmCisKKyAgICAgIC8vIGNhcGFjaXR5OgorICAgICAgdXNpbmcgX0Jhc2U6OmVtcHR5OworICAgICAgdXNpbmcgX0Jhc2U6OnNpemU7CisgICAgICB1c2luZyBfQmFzZTo6bWF4X3NpemU7CisKKyAgICAgIC8vIG1vZGlmaWVyczoKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisJZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBhdXRvIF9fcmVzID0gX0Jhc2U6OmVtcGxhY2Uoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIHJldHVybiBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fcmVzLmZpcnN0KSwKKwkJCQkJICAgX19yZXMuc2Vjb25kKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVtcGxhY2VfaGludChfX3BvcywKKwkJCQkJICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSk7CisJfQorI2VuZGlmCisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBib29sPiBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX194KTsKKwlyZXR1cm4gc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPihpdGVyYXRvcihfX3Jlcy5maXJzdCksCisJCQkJCSBfX3Jlcy5zZWNvbmQpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBib29sPiBfX3JlcworCSAgPSBfQmFzZTo6aW5zZXJ0KHN0ZDo6bW92ZShfX3gpKTsKKwlyZXR1cm4gc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPihpdGVyYXRvcihfX3Jlcy5maXJzdCksCisJCQkJCSBfX3Jlcy5zZWNvbmQpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLCBfX3gpKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCB2YWx1ZV90eXBlJiYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194KSkpOyB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeyBfQmFzZTo6aW5zZXJ0KF9fZmlyc3QsIF9fbGFzdCk7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgX0Jhc2U6Omluc2VydChfX2wpOyB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24pKTsgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uKTsgfQorI2VuZGlmCisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKwlpdGVyYXRvciBfX3ZpY3RpbSA9IGZpbmQoX194KTsKKwlpZiAoX192aWN0aW0gPT0gZW5kKCkpCisgICAgICAgICAgcmV0dXJuIDA7CisJZWxzZQorICAgICAgICB7CisJICBfQmFzZTo6ZXJhc2UoX192aWN0aW0pOworCSAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19maXJzdCwgX19sYXN0KSk7IH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7IF9CYXNlOjplcmFzZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgc3dhcChzZXQmIF9feCkKKyAgICAgIHsgX0Jhc2U6OnN3YXAoX194KTsgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHRoaXMtPmVyYXNlKGJlZ2luKCksIGVuZCgpKTsgfQorCisgICAgICAvLyBvYnNlcnZlcnM6CisgICAgICB1c2luZyBfQmFzZTo6a2V5X2NvbXA7CisgICAgICB1c2luZyBfQmFzZTo6dmFsdWVfY29tcDsKKworICAgICAgLy8gc2V0IG9wZXJhdGlvbnM6CisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX194KSk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjE0LiBzZXQ6OmZpbmQoKSBtaXNzaW5nIGNvbnN0IG92ZXJsb2FkCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX194KSk7IH0KKworICAgICAgdXNpbmcgX0Jhc2U6OmNvdW50OworCisgICAgICBpdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpsb3dlcl9ib3VuZChfX3gpKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTQuIHNldDo6ZmluZCgpIG1pc3NpbmcgY29uc3Qgb3ZlcmxvYWQKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6Omxvd2VyX2JvdW5kKF9feCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OnVwcGVyX2JvdW5kKF9feCkpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxNC4gc2V0OjpmaW5kKCkgbWlzc2luZyBjb25zdCBvdmVybG9hZAorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6dXBwZXJfYm91bmQoX194KSk7IH0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3JlcyA9CisgICAgICAgIF9CYXNlOjplcXVhbF9yYW5nZShfX3gpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihfX3Jlcy5maXJzdCksCisJCQkgICAgICBpdGVyYXRvcihfX3Jlcy5zZWNvbmQpKTsKKyAgICAgIH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjE0LiBzZXQ6OmZpbmQoKSBtaXNzaW5nIGNvbnN0IG92ZXJsb2FkCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworCXN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgX0Jhc2VfaXRlcmF0b3I+IF9fcmVzID0KKyAgICAgICAgX0Jhc2U6OmVxdWFsX3JhbmdlKF9feCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGNvbnN0X2l0ZXJhdG9yKF9fcmVzLmZpcnN0KSwKKwkJCSAgICAgIGNvbnN0X2l0ZXJhdG9yKF9fcmVzLnNlY29uZCkpOworICAgICAgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBfR0xJQkNYWF9OT0VYQ0VQVCAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVCB7IHJldHVybiAqdGhpczsgfQorCisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA9PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSAhPSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPCBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPiBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICB2b2lkCisgICAgc3dhcChzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3gsCisJIHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feSkKKyAgICB7IHJldHVybiBfX3guc3dhcChfX3kpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fcHJvZmlsZQorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL3Vub3JkZXJlZF9iYXNlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvdW5vcmRlcmVkX2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTk0MjEyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL3Vub3JkZXJlZF9iYXNlLmgKQEAgLTAsMCArMSwyNjIgQEAKKy8vIFByb2ZpbGluZyB1bm9yZGVyZWQgY29udGFpbmVycyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKy8vIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL3Vub3JkZXJlZF9iYXNlLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcHJvZmlsZSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9VTk9SREVSRUQKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9VTk9SREVSRUQgMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3Byb2ZpbGUKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Vub3JkZXJlZENvbnQsCisJICAgdHlwZW5hbWUgX1ZhbHVlLCBib29sIF9DYWNoZV9oYXNoX2NvZGU+CisgICAgc3RydWN0IF9CdWNrZXRfaW5kZXhfaGVscGVyOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbm9yZGVyZWRDb250LCB0eXBlbmFtZSBfVmFsdWU+CisgICAgc3RydWN0IF9CdWNrZXRfaW5kZXhfaGVscGVyPF9Vbm9yZGVyZWRDb250LCBfVmFsdWUsIHRydWU+CisgICAgeworICAgICAgc3RhdGljIHN0ZDo6c2l6ZV90CisgICAgICBidWNrZXQoY29uc3QgX1Vub3JkZXJlZENvbnQmIF9fdWMsCisJICAgICBjb25zdCBfX2RldGFpbDo6X0hhc2hfbm9kZTxfVmFsdWUsIHRydWU+KiBfX25vZGUpCisgICAgICB7IHJldHVybiBfX25vZGUtPl9NX2hhc2hfY29kZSAlIF9fdWMuYnVja2V0X2NvdW50KCk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbm9yZGVyZWRDb250LCB0eXBlbmFtZSBfVmFsdWU+CisgICAgc3RydWN0IF9CdWNrZXRfaW5kZXhfaGVscGVyPF9Vbm9yZGVyZWRDb250LCBfVmFsdWUsIGZhbHNlPgorICAgIHsKKyAgICAgIHN0YXRpYyBzdGQ6OnNpemVfdAorICAgICAgYnVja2V0KGNvbnN0IF9Vbm9yZGVyZWRDb250JiBfX3VjLAorCSAgICAgY29uc3QgX19kZXRhaWw6Ol9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4qIF9fbm9kZSkKKyAgICAgIHsgcmV0dXJuIF9fdWMuYnVja2V0KF9fbm9kZS0+X01fdik7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbm9yZGVyZWRDb250LCB0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfTWFwcGVkPgorICAgIHN0cnVjdCBfQnVja2V0X2luZGV4X2hlbHBlcjxfVW5vcmRlcmVkQ29udCwKKwkJCQlzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX01hcHBlZD4sIGZhbHNlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IF9LZXksIF9NYXBwZWQ+IF9WYWx1ZTsKKworICAgICAgc3RhdGljIHN0ZDo6c2l6ZV90CisgICAgICBidWNrZXQoY29uc3QgX1Vub3JkZXJlZENvbnQmIF9fdWMsCisJICAgICBjb25zdCBfX2RldGFpbDo6X0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiogX19ub2RlKQorICAgICAgeyByZXR1cm4gX191Yy5idWNrZXQoX19ub2RlLT5fTV92LmZpcnN0KTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Vub3JkZXJlZENvbnQsIHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfQ2FjaGVfaGFzaF9jb2RlPgorICAgIHN0ZDo6c2l6ZV90CisgICAgX19nZXRfYnVja2V0X2luZGV4KGNvbnN0IF9Vbm9yZGVyZWRDb250JiBfX3VjLAorCQkgICAgICAgY29uc3QgX19kZXRhaWw6Ol9IYXNoX25vZGU8X1ZhbHVlLCBfQ2FjaGVfaGFzaF9jb2RlPiogX19ub2RlKQorICAgIHsKKyAgICAgIHVzaW5nIF9fYnVja2V0X2luZGV4X2hlbHBlcgorCT0gX0J1Y2tldF9pbmRleF9oZWxwZXI8X1Vub3JkZXJlZENvbnQsIF9WYWx1ZSwgX0NhY2hlX2hhc2hfY29kZT47CisgICAgICByZXR1cm4gX19idWNrZXRfaW5kZXhfaGVscGVyOjpidWNrZXQoX191YywgX19ub2RlKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Vub3JkZXJlZENvbnQsCisJICAgdHlwZW5hbWUgX1ZhbHVlLCBib29sIF9DYWNoZV9oYXNoX2NvZGU+CisgICAgc3RydWN0IF9FcXVhbF9oZWxwZXI7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Vub3JkZXJlZENvbnQsIHR5cGVuYW1lIF9WYWx1ZT4KKyAgICBzdHJ1Y3QgX0VxdWFsX2hlbHBlcjxfVW5vcmRlcmVkQ29udCwgX1ZhbHVlLCB0cnVlPgorICAgIHsKKyAgICAgIHN0YXRpYyBzdGQ6OnNpemVfdAorICAgICAgYXJlX2VxdWFsKGNvbnN0IF9Vbm9yZGVyZWRDb250JiBfX3VjLAorCQljb25zdCBfX2RldGFpbDo6X0hhc2hfbm9kZTxfVmFsdWUsIHRydWU+KiBfX2xocywKKwkJY29uc3QgX19kZXRhaWw6Ol9IYXNoX25vZGU8X1ZhbHVlLCB0cnVlPiogX19yaHMpCisgICAgICB7CisJcmV0dXJuIF9fbGhzLT5fTV9oYXNoX2NvZGUgPT0gX19yaHMtPl9NX2hhc2hfY29kZQorCSAgJiYgX191Yy5rZXlfZXEoKShfX2xocy0+X01fdiwgX19yaHMtPl9NX3YpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Vub3JkZXJlZENvbnQsCisJICAgdHlwZW5hbWUgX1ZhbHVlPgorICAgIHN0cnVjdCBfRXF1YWxfaGVscGVyPF9Vbm9yZGVyZWRDb250LCBfVmFsdWUsIGZhbHNlPgorICAgIHsKKyAgICAgIHN0YXRpYyBzdGQ6OnNpemVfdAorICAgICAgYXJlX2VxdWFsKGNvbnN0IF9Vbm9yZGVyZWRDb250JiBfX3VjLAorCQljb25zdCBfX2RldGFpbDo6X0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiogX19saHMsCisJCWNvbnN0IF9fZGV0YWlsOjpfSGFzaF9ub2RlPF9WYWx1ZSwgZmFsc2U+KiBfX3JocykKKyAgICAgIHsgcmV0dXJuIF9fdWMua2V5X2VxKCkoX19saHMtPl9NX3YsIF9fcmhzLT5fTV92KTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Vub3JkZXJlZENvbnQsCisJICAgdHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX01hcHBlZD4KKyAgICBzdHJ1Y3QgX0VxdWFsX2hlbHBlcjxfVW5vcmRlcmVkQ29udCwgc3RkOjpwYWlyPGNvbnN0IF9LZXksIF9NYXBwZWQ+LCB0cnVlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IF9LZXksIF9NYXBwZWQ+IF9WYWx1ZTsKKworICAgICAgc3RhdGljIHN0ZDo6c2l6ZV90CisgICAgICBhcmVfZXF1YWwoY29uc3QgX1Vub3JkZXJlZENvbnQmIF9fdWMsCisJCWNvbnN0IF9fZGV0YWlsOjpfSGFzaF9ub2RlPF9WYWx1ZSwgdHJ1ZT4qIF9fbGhzLAorCQljb25zdCBfX2RldGFpbDo6X0hhc2hfbm9kZTxfVmFsdWUsIHRydWU+KiBfX3JocykKKyAgICAgIHsKKwlyZXR1cm4gX19saHMtPl9NX2hhc2hfY29kZSA9PSBfX3Jocy0+X01faGFzaF9jb2RlCisJICAmJiBfX3VjLmtleV9lcSgpKF9fbGhzLT5fTV92LmZpcnN0LCBfX3Jocy0+X01fdi5maXJzdCk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5vcmRlcmVkQ29udCwKKwkgICB0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfTWFwcGVkPgorICAgIHN0cnVjdCBfRXF1YWxfaGVscGVyPF9Vbm9yZGVyZWRDb250LCBzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX01hcHBlZD4sIGZhbHNlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IF9LZXksIF9NYXBwZWQ+IF9WYWx1ZTsKKworICAgICAgc3RhdGljIHN0ZDo6c2l6ZV90CisgICAgICBhcmVfZXF1YWwoY29uc3QgX1Vub3JkZXJlZENvbnQmIF9fdWMsCisJCWNvbnN0IF9fZGV0YWlsOjpfSGFzaF9ub2RlPF9WYWx1ZSwgZmFsc2U+KiBfX2xocywKKwkJY29uc3QgX19kZXRhaWw6Ol9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4qIF9fcmhzKQorICAgICAgeyByZXR1cm4gX191Yy5rZXlfZXEoKShfX2xocy0+X01fdi5maXJzdCwgX19yaHMtPl9NX3YuZmlyc3QpOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5vcmRlcmVkQ29udCwgdHlwZW5hbWUgX1ZhbHVlLCBib29sIF9DYWNoZV9oYXNoX2NvZGU+CisgICAgYm9vbAorICAgIF9fYXJlX2VxdWFsKGNvbnN0IF9Vbm9yZGVyZWRDb250JiBfX3VjLAorCQljb25zdCBfX2RldGFpbDo6X0hhc2hfbm9kZTxfVmFsdWUsIF9DYWNoZV9oYXNoX2NvZGU+KiBfX2xocywKKwkJY29uc3QgX19kZXRhaWw6Ol9IYXNoX25vZGU8X1ZhbHVlLCBfQ2FjaGVfaGFzaF9jb2RlPiogX19yaHMpCisgIHsKKyAgICB1c2luZyBfX2VxdWFsX2hlbHBlcgorICAgICAgPSBfRXF1YWxfaGVscGVyPF9Vbm9yZGVyZWRDb250LCBfVmFsdWUsIF9DYWNoZV9oYXNoX2NvZGU+OworICAgIHJldHVybiBfX2VxdWFsX2hlbHBlcjo6YXJlX2VxdWFsKF9fdWMsIF9fbGhzLCBfX3Jocyk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5vcmRlcmVkQ29udCwgYm9vbCBfVW5pcXVlX2tleXM+CisgICAgY2xhc3MgX1Vub3JkZXJlZF9wcm9maWxlCisgICAgeworICAgICAgX1Vub3JkZXJlZENvbnQmCisgICAgICBfTV9jb25qdXJlKCkKKyAgICAgIHsgcmV0dXJuICooc3RhdGljX2Nhc3Q8X1Vub3JkZXJlZENvbnQqPih0aGlzKSk7IH0KKworICAgICAgdXNpbmcgX191bmlxdWVfa2V5cyA9IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX1VuaXF1ZV9rZXlzPjsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9Vbm9yZGVyZWRfcHJvZmlsZSgpCisgICAgICB7CisJYXV0byYgX191YyA9IF9NX2Nvbmp1cmUoKTsKKyAgICAgICAgX19wcm9mY3h4X2hhc2h0YWJsZV9jb25zdHJ1Y3QoJl9fdWMsIF9fdWMuYnVja2V0X2NvdW50KCkpOworCV9fcHJvZmN4eF9oYXNodGFibGVfY29uc3RydWN0MigmX191Yyk7CisgICAgICB9CisgICAgICBfVW5vcmRlcmVkX3Byb2ZpbGUoY29uc3QgX1Vub3JkZXJlZF9wcm9maWxlJikKKwk6IF9Vbm9yZGVyZWRfcHJvZmlsZSgpIHsgfQorICAgICAgX1Vub3JkZXJlZF9wcm9maWxlKF9Vbm9yZGVyZWRfcHJvZmlsZSYmKQorCTogX1Vub3JkZXJlZF9wcm9maWxlKCkgeyB9CisKKyAgICAgIH5fVW5vcmRlcmVkX3Byb2ZpbGUoKSBub2V4Y2VwdAorICAgICAgeworCWF1dG8mIF9fdWMgPSBfTV9jb25qdXJlKCk7CisgICAgICAgIF9fcHJvZmN4eF9oYXNodGFibGVfZGVzdHJ1Y3QoJl9fdWMsIF9fdWMuYnVja2V0X2NvdW50KCksIF9fdWMuc2l6ZSgpKTsKKyAgICAgICAgX01fcHJvZmlsZV9kZXN0cnVjdCgpOworICAgICAgfQorCisgICAgICBfVW5vcmRlcmVkX3Byb2ZpbGUmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1Vub3JkZXJlZF9wcm9maWxlJikgPSBkZWZhdWx0OworCisgICAgICBfVW5vcmRlcmVkX3Byb2ZpbGUmCisgICAgICBvcGVyYXRvcj0oX1Vub3JkZXJlZF9wcm9maWxlJiYpID0gZGVmYXVsdDsKKworICAgICAgdm9pZAorICAgICAgX01fcHJvZmlsZV9kZXN0cnVjdCgpCisgICAgICB7CisJaWYgKCFfX3Byb2ZjeHhfaW5lZmZpY2llbnRfaGFzaF9pc19vbigpKQorCSAgcmV0dXJuOworCisJX01fcHJvZmlsZV9kZXN0cnVjdChfX3VuaXF1ZV9rZXlzKCkpOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX3Byb2ZpbGVfZGVzdHJ1Y3Qoc3RkOjp0cnVlX3R5cGUpOworCisgICAgICB2b2lkCisgICAgICBfTV9wcm9maWxlX2Rlc3RydWN0KHN0ZDo6ZmFsc2VfdHlwZSk7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5vcmRlcmVkQ29udCwgYm9vbCBfVW5pcXVlX2tleXM+CisgICAgdm9pZAorICAgIF9Vbm9yZGVyZWRfcHJvZmlsZTxfVW5vcmRlcmVkQ29udCwgX1VuaXF1ZV9rZXlzPjo6CisgICAgX01fcHJvZmlsZV9kZXN0cnVjdChzdGQ6OnRydWVfdHlwZSkKKyAgICB7CisgICAgICBhdXRvJiBfX3VjID0gX01fY29uanVyZSgpOworICAgICAgc3RkOjpzaXplX3QgX19ob3BzID0gMCwgX19sYyA9IDAsIF9fY2hhaW4gPSAwOworICAgICAgYXV0byBfX2l0ID0gX191Yy5iZWdpbigpOworICAgICAgd2hpbGUgKF9faXQgIT0gX191Yy5lbmQoKSkKKwl7CisJICBhdXRvIF9fYmt0ID0gX19nZXRfYnVja2V0X2luZGV4KF9fdWMsIF9faXQuX01fY3VyKTsKKwkgIGF1dG8gX19saXQgPSBfX3VjLmJlZ2luKF9fYmt0KTsKKwkgIGF1dG8gX19sZW5kID0gX191Yy5lbmQoX19ia3QpOworCSAgZm9yICgrK19faXQsICsrX19saXQ7IF9fbGl0ICE9IF9fbGVuZDsgKytfX2l0LCArK19fbGl0KQorCSAgICArK19fY2hhaW47CisJICBpZiAoX19jaGFpbikKKwkgICAgeworCSAgICAgICsrX19jaGFpbjsKKwkgICAgICBfX2xjID0gX19sYyA+IF9fY2hhaW4gPyBfX2xjIDogX19jaGFpbjsKKwkgICAgICBfX2hvcHMgKz0gX19jaGFpbiAqIChfX2NoYWluIC0gMSkgLyAyOworCSAgICAgIF9fY2hhaW4gPSAwOworCSAgICB9CisJfQorICAgICAgX19wcm9mY3h4X2hhc2h0YWJsZV9kZXN0cnVjdDIoJl9fdWMsIF9fbGMsIF9fdWMuc2l6ZSgpLCBfX2hvcHMpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5vcmRlcmVkQ29udCwgYm9vbCBfVW5pcXVlX2tleXM+CisgICAgdm9pZAorICAgIF9Vbm9yZGVyZWRfcHJvZmlsZTxfVW5vcmRlcmVkQ29udCwgX1VuaXF1ZV9rZXlzPjo6CisgICAgX01fcHJvZmlsZV9kZXN0cnVjdChzdGQ6OmZhbHNlX3R5cGUpCisgICAgeworICAgICAgYXV0byYgX191YyA9IF9NX2Nvbmp1cmUoKTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9faG9wcyA9IDAsIF9fbGMgPSAwLCBfX2NoYWluID0gMCwgX191bmlxdWVfc2l6ZSA9IDA7CisgICAgICBhdXRvIF9faXQgPSBfX3VjLmJlZ2luKCk7CisgICAgICB3aGlsZSAoX19pdCAhPSBfX3VjLmVuZCgpKQorCXsKKwkgIGF1dG8gX19ia3QgPSBfX2dldF9idWNrZXRfaW5kZXgoX191YywgX19pdC5fTV9jdXIpOworCSAgYXV0byBfX2xpdCA9IF9fdWMuYmVnaW4oX19ia3QpOworCSAgYXV0byBfX2xlbmQgPSBfX3VjLmVuZChfX2JrdCk7CisJICBhdXRvIF9fcGl0ID0gX19pdDsKKwkgICsrX191bmlxdWVfc2l6ZTsKKwkgIGZvciAoKytfX2l0LCArK19fbGl0OyBfX2xpdCAhPSBfX2xlbmQ7ICsrX19pdCwgKytfX2xpdCkKKwkgICAgeworCSAgICAgIGlmICghX19hcmVfZXF1YWwoX191YywgX19waXQuX01fY3VyLCBfX2l0Ll9NX2N1cikpCisJCXsKKwkJICArK19fY2hhaW47CisJCSAgKytfX3VuaXF1ZV9zaXplOworCQkgIF9fcGl0ID0gX19pdDsKKwkJfQorCSAgICB9CisJICBpZiAoX19jaGFpbikKKwkgICAgeworCSAgICAgICsrX19jaGFpbjsKKwkgICAgICBfX2xjID0gX19sYyA+IF9fY2hhaW4gPyBfX2xjIDogX19jaGFpbjsKKwkgICAgICBfX2hvcHMgKz0gX19jaGFpbiAqIChfX2NoYWluIC0gMSkgLyAyOworCSAgICAgIF9fY2hhaW4gPSAwOworCSAgICB9CisJfQorICAgICAgX19wcm9mY3h4X2hhc2h0YWJsZV9kZXN0cnVjdDIoJl9fdWMsIF9fbGMsIF9fdW5pcXVlX3NpemUsIF9faG9wcyk7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBfX3Byb2ZpbGUKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS91bm9yZGVyZWRfbWFwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL3Vub3JkZXJlZF9tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTliOTQwMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS91bm9yZGVyZWRfbWFwCkBAIC0wLDAgKzEsNTAyIEBACisvLyBQcm9maWxpbmcgdW5vcmRlcmVkX21hcC91bm9yZGVyZWRfbXVsdGltYXAgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisvLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS91bm9yZGVyZWRfbWFwCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHByb2ZpbGUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfVU5PUkRFUkVEX01BUAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1VOT1JERVJFRF9NQVAgMQorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworI2luY2x1ZGUgPHByb2ZpbGUvYmFzZS5oPgorI2luY2x1ZGUgPHByb2ZpbGUvdW5vcmRlcmVkX2Jhc2UuaD4KKworI2RlZmluZSBfR0xJQkNYWF9CQVNFIHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4KKyNkZWZpbmUgX0dMSUJDWFhfU1REX0JBU0UgX0dMSUJDWFhfU1REX0M6Ol9HTElCQ1hYX0JBU0UKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19wcm9maWxlCit7CisgIC8vLyBDbGFzcyBzdGQ6OnVub3JkZXJlZF9tYXAgd3JhcHBlciB3aXRoIHBlcmZvcm1hbmNlIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9IYXNoID0gc3RkOjpoYXNoPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9QcmVkID0gc3RkOjplcXVhbF90bzxfS2V5PiwKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+ID4KKyAgICBjbGFzcyB1bm9yZGVyZWRfbWFwCisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0JBU0UsCisgICAgICBwdWJsaWMgX1Vub3JkZXJlZF9wcm9maWxlPHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4sCisJCQkJdHJ1ZT4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9HTElCQ1hYX1NURF9CQVNFIF9CYXNlOworCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBub2V4Y2VwdCAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiAqdGhpczsgfQorCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Omhhc2hlciAgICAgICAgICBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfZXF1YWwgICAgICAga2V5X2VxdWFsOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X3R5cGUgICAgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjptYXBwZWRfdHlwZSAgICAgIG1hcHBlZF90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICBleHBsaWNpdAorICAgICAgdW5vcmRlcmVkX21hcChzaXplX3R5cGUgX19uID0gMTAsCisJCSAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB1bm9yZGVyZWRfbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorCQkgICAgICBzaXplX3R5cGUgX19uID0gMCwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJICA6IF9CYXNlKF9fZiwgX19sLCBfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICAgIHsgfQorCisgICAgICB1bm9yZGVyZWRfbWFwKGNvbnN0IHVub3JkZXJlZF9tYXAmKSA9IGRlZmF1bHQ7CisKKyAgICAgIHVub3JkZXJlZF9tYXAoY29uc3QgX0Jhc2UmIF9feCkKKwk6IF9CYXNlKF9feCkKKyAgICAgIHsgfQorCisgICAgICB1bm9yZGVyZWRfbWFwKHVub3JkZXJlZF9tYXAmJikgPSBkZWZhdWx0OworCisgICAgICB1bm9yZGVyZWRfbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCQkgICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCSAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19sLCBfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7IH0KKworICAgICAgdW5vcmRlcmVkX21hcCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB1bm9yZGVyZWRfbWFwJikgPSBkZWZhdWx0OworCisgICAgICB1bm9yZGVyZWRfbWFwJgorICAgICAgb3BlcmF0b3I9KHVub3JkZXJlZF9tYXAmJikgPSBkZWZhdWx0OworCisgICAgICB1bm9yZGVyZWRfbWFwJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCV9NX2Jhc2UoKSA9IF9fbDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgbm9leGNlcHQKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X2hhc2h0YWJsZV9kZXN0cnVjdCh0aGlzLCBfQmFzZTo6YnVja2V0X2NvdW50KCksCisJCQkJICAgICBfQmFzZTo6c2l6ZSgpKTsKKyAgICAgICAgdGhpcy0+X01fcHJvZmlsZV9kZXN0cnVjdCgpOworCV9CYXNlOjpjbGVhcigpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisJZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKwkgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gX19yZXMKKwkgICAgPSBfQmFzZTo6ZW1wbGFjZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7CisJICByZXR1cm4gX19yZXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2VfaGludChjb25zdF9pdGVyYXRvciBfX2l0LCBfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKwkgIGl0ZXJhdG9yIF9fcmVzCisJICAgID0gX0Jhc2U6OmVtcGxhY2VfaGludChfX2l0LCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7CisJICByZXR1cm4gX19yZXM7CisJfQorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgCisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOyAKKyAgICAgICAgX0Jhc2U6Omluc2VydChfX2wpOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsgCisgICAgICB9CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisgICAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9fb2JqKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19pdGVyLCBjb25zdCB2YWx1ZV90eXBlJiBfX3YpCisgICAgICB7IAorICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsgCisgICAgICAgIGl0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6Omluc2VydChfX2l0ZXIsIF9fdik7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOyAKKyAgICAgICAgcmV0dXJuIF9fcmVzOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8dmFsdWVfdHlwZSwKKwkJCQkJCSAgICBfUGFpciYmPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICAgIGluc2VydChfUGFpciYmIF9fb2JqKQorICAgICAgICB7CisJICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKwkgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gX19yZXMKKwkgICAgPSBfQmFzZTo6aW5zZXJ0KHN0ZDo6Zm9yd2FyZDxfUGFpcj4oX19vYmopKTsKKwkgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOyAKKwkgIHJldHVybiBfX3JlczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLAorCQkJCQkJICAgIF9QYWlyJiY+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2l0ZXIsIF9QYWlyJiYgX192KQorICAgICAgICB7IAorCSAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7IAorCSAgaXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9faXRlciwgc3RkOjpmb3J3YXJkPF9QYWlyPihfX3YpKTsKKwkgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOyAKKwkgIHJldHVybiBfX3JlczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXI+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QpCisgICAgICAgIHsKKwkgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOyAKKwkgIF9CYXNlOjppbnNlcnQoX19maXJzdCwgX19sYXN0KTsKKwkgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOyAKKwl9CisKKyAgICAgIC8vIG9wZXJhdG9yW10KKyAgICAgIG1hcHBlZF90eXBlJgorICAgICAgb3BlcmF0b3JbXShjb25zdCBfS2V5JiBfX2spCisgICAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworICAgICAgICBtYXBwZWRfdHlwZSYgX19yZXMgPSBfTV9iYXNlKClbX19rXTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICB9CisKKyAgICAgIG1hcHBlZF90eXBlJgorICAgICAgb3BlcmF0b3JbXShfS2V5JiYgX19rKQorICAgICAgeworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKyAgICAgICAgbWFwcGVkX3R5cGUmIF9fcmVzID0gX01fYmFzZSgpW3N0ZDo6bW92ZShfX2spXTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodW5vcmRlcmVkX21hcCYgX194KQorICAgICAgeyBfQmFzZTo6c3dhcChfX3guX01fYmFzZSgpKTsgfQorCisgICAgICB2b2lkIHJlaGFzaChzaXplX3R5cGUgX19uKQorICAgICAgeworCXNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworCV9CYXNlOjpyZWhhc2goX19uKTsKKwlfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsgCisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01fcHJvZmlsZV9yZXNpemUoc2l6ZV90eXBlIF9fb2xkX3NpemUpCisgICAgICB7CisJc2l6ZV90eXBlIF9fbmV3X3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisJaWYgKF9fb2xkX3NpemUgIT0gX19uZXdfc2l6ZSkKKwkgIF9fcHJvZmN4eF9oYXNodGFibGVfcmVzaXplKHRoaXMsIF9fb2xkX3NpemUsIF9fbmV3X3NpemUpOworICAgICAgfQorICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBfR0xJQkNYWF9TVERfQkFTRSY+KF9feCkgPT0gX195OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyN1bmRlZiBfR0xJQkNYWF9CQVNFCisjdW5kZWYgX0dMSUJDWFhfU1REX0JBU0UKKyNkZWZpbmUgX0dMSUJDWFhfQkFTRSB1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4KKyNkZWZpbmUgX0dMSUJDWFhfU1REX0JBU0UgX0dMSUJDWFhfU1REX0M6Ol9HTElCQ1hYX0JBU0UKKworICAvLy8gQ2xhc3Mgc3RkOjp1bm9yZGVyZWRfbXVsdGltYXAgd3JhcHBlciB3aXRoIHBlcmZvcm1hbmNlIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9IYXNoID0gc3RkOjpoYXNoPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9QcmVkID0gc3RkOjplcXVhbF90bzxfS2V5PiwKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+ID4KKyAgICBjbGFzcyB1bm9yZGVyZWRfbXVsdGltYXAKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQkFTRSwKKyAgICAgIHB1YmxpYyBfVW5vcmRlcmVkX3Byb2ZpbGU8dW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwKKwkJCQkJCSAgIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiwKKwkJCQlmYWxzZT4KKyAgICB7ICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9HTElCQ1hYX1NURF9CQVNFIF9CYXNlOworCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBub2V4Y2VwdCAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiAqdGhpczsgfQorCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Omhhc2hlciAgICAgICAgICBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfZXF1YWwgICAgICAga2V5X2VxdWFsOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X3R5cGUgICAgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkJIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9CYXNlKF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdW5vcmRlcmVkX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorCQkJICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCQkgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCSAgOiBfQmFzZShfX2YsIF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcChjb25zdCB1bm9yZGVyZWRfbXVsdGltYXAmKSA9IGRlZmF1bHQ7CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcChjb25zdCBfQmFzZSYgX194KQorCTogX0Jhc2UoX194KQorICAgICAgeyB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcCh1bm9yZGVyZWRfbXVsdGltYXAmJikgPSBkZWZhdWx0OworCisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJCQkgc2l6ZV90eXBlIF9fbiA9IDAsCisJCQkgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgIHsgfQorCisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0oY29uc3QgdW5vcmRlcmVkX211bHRpbWFwJikgPSBkZWZhdWx0OworCisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0odW5vcmRlcmVkX211bHRpbWFwJiYpID0gZGVmYXVsdDsKKworICAgICAgdW5vcmRlcmVkX211bHRpbWFwJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCV9NX2Jhc2UoKSA9IF9fbDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkgbm9leGNlcHQKKyAgICAgIHsKKwlfX3Byb2ZjeHhfaGFzaHRhYmxlX2Rlc3RydWN0KHRoaXMsIF9CYXNlOjpidWNrZXRfY291bnQoKSwgCisJCQkJICAgICBfQmFzZTo6c2l6ZSgpKTsKKwl0aGlzLT5fTV9wcm9maWxlX2Rlc3RydWN0KCk7CisJX0Jhc2U6OmNsZWFyKCk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKwkgIGl0ZXJhdG9yIF9fcmVzCisJICAgID0gX0Jhc2U6OmVtcGxhY2Uoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOworCSAgcmV0dXJuIF9fcmVzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlX2hpbnQoY29uc3RfaXRlcmF0b3IgX19pdCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisJICBpdGVyYXRvciBfX3JlcworCSAgICA9IF9CYXNlOjplbXBsYWNlX2hpbnQoX19pdCwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOworCSAgcmV0dXJuIF9fcmVzOworCX0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IAorICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKyAgICAgICAgX0Jhc2U6Omluc2VydChfX2wpOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisgICAgICAgIGl0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6Omluc2VydChfX29iaik7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOyAKKyAgICAgICAgcmV0dXJuIF9fcmVzOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faXRlciwgY29uc3QgdmFsdWVfdHlwZSYgX192KQorICAgICAgeyAKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7IAorICAgICAgICBpdGVyYXRvciBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX19pdGVyLCBfX3YpOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsgCisgICAgICAgIHJldHVybiBfX3JlczsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPHZhbHVlX3R5cGUsCisJCQkJCQkgICAgX1BhaXImJj46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgaW5zZXJ0KF9QYWlyJiYgX19vYmopCisgICAgICAgIHsKKwkgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworCSAgaXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6aW5zZXJ0KHN0ZDo6Zm9yd2FyZDxfUGFpcj4oX19vYmopKTsKKwkgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOyAKKwkgIHJldHVybiBfX3JlczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx2YWx1ZV90eXBlLAorCQkJCQkJICAgIF9QYWlyJiY+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2l0ZXIsIF9QYWlyJiYgX192KQorICAgICAgICB7CisJICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsgCisJICBpdGVyYXRvciBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX19pdGVyLCBzdGQ6OmZvcndhcmQ8X1BhaXI+KF9fdikpOworCSAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorCSAgcmV0dXJuIF9fcmVzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkKKyAgICAgICAgeworCSAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7IAorCSAgX0Jhc2U6Omluc2VydChfX2ZpcnN0LCBfX2xhc3QpOworCSAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorCX0KKworICAgICAgdm9pZAorICAgICAgc3dhcCh1bm9yZGVyZWRfbXVsdGltYXAmIF9feCkKKyAgICAgIHsgX0Jhc2U6OnN3YXAoX194Ll9NX2Jhc2UoKSk7IH0KKworICAgICAgdm9pZAorICAgICAgcmVoYXNoKHNpemVfdHlwZSBfX24pCisgICAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworICAgICAgICBfQmFzZTo6cmVoYXNoKF9fbik7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOyAKKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShzaXplX3R5cGUgX19vbGRfc2l6ZSkKKyAgICAgIHsKKwlzaXplX3R5cGUgX19uZXdfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKyAgICAgICAgaWYgKF9fb2xkX3NpemUgIT0gX19uZXdfc2l6ZSkKKyAgICAgICAgICBfX3Byb2ZjeHhfaGFzaHRhYmxlX3Jlc2l6ZSh0aGlzLCBfX29sZF9zaXplLCBfX25ld19zaXplKTsKKyAgICAgIH0KKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9QcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSB1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9QcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBfR0xJQkNYWF9TVERfQkFTRSY+KF9feCkgPT0gX195OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX3Byb2ZpbGUKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjdW5kZWYgX0dMSUJDWFhfQkFTRQorI3VuZGVmIF9HTElCQ1hYX1NURF9CQVNFCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS91bm9yZGVyZWRfc2V0IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9wcm9maWxlL3Vub3JkZXJlZF9zZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcwMTVhYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS91bm9yZGVyZWRfc2V0CkBAIC0wLDAgKzEsNDYzIEBACisvLyBQcm9maWxpbmcgdW5vcmRlcmVkX3NldC91bm9yZGVyZWRfbXVsdGlzZXQgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisvLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS91bm9yZGVyZWRfc2V0CisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHByb2ZpbGUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfVU5PUkRFUkVEX1NFVAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1VOT1JERVJFRF9TRVQgMQorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworI2luY2x1ZGUgPHByb2ZpbGUvYmFzZS5oPgorI2luY2x1ZGUgPHByb2ZpbGUvdW5vcmRlcmVkX2Jhc2UuaD4KKworI2RlZmluZSBfR0xJQkNYWF9CQVNFIHVub3JkZXJlZF9zZXQ8X0tleSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+CisjZGVmaW5lIF9HTElCQ1hYX1NURF9CQVNFIF9HTElCQ1hYX1NURF9DOjpfR0xJQkNYWF9CQVNFCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fcHJvZmlsZQoreworICAvKiogQGJyaWVmIFVub3JkZXJlZF9zZXQgd3JhcHBlciB3aXRoIHBlcmZvcm1hbmNlIGluc3RydW1lbnRhdGlvbi4gICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIAorCSAgIHR5cGVuYW1lIF9IYXNoID0gc3RkOjpoYXNoPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9QcmVkID0gc3RkOjplcXVhbF90bzxfS2V5PiwKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSAgc3RkOjphbGxvY2F0b3I8X0tleT4gPgorICAgIGNsYXNzIHVub3JkZXJlZF9zZXQKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQkFTRSwKKyAgICAgIHB1YmxpYyBfVW5vcmRlcmVkX3Byb2ZpbGU8dW5vcmRlcmVkX3NldDxfS2V5LCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4sCisJCQkJdHJ1ZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX1NURF9CQVNFIF9CYXNlOworCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBub2V4Y2VwdCAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiAqdGhpczsgfQorCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Omhhc2hlciAgICAgICAgICBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfZXF1YWwgICAgICAga2V5X2VxdWFsOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X3R5cGUgICAgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB1bm9yZGVyZWRfc2V0KHNpemVfdHlwZSBfX24gPSAxMCwKKwkJICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHVub3JkZXJlZF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCSAgICAgIHNpemVfdHlwZSBfX24gPSAwLAorCQkgICAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwkgIDogX0Jhc2UoX19mLCBfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgIHsgfQorCisgICAgICB1bm9yZGVyZWRfc2V0KGNvbnN0IHVub3JkZXJlZF9zZXQmKSA9IGRlZmF1bHQ7CisKKyAgICAgIHVub3JkZXJlZF9zZXQoY29uc3QgX0Jhc2UmIF9feCkKKwk6IF9CYXNlKF9feCkKKyAgICAgIHsgfQorCisgICAgICB1bm9yZGVyZWRfc2V0KHVub3JkZXJlZF9zZXQmJikgPSBkZWZhdWx0OworCisgICAgICB1bm9yZGVyZWRfc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCQkgICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCSAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgIHsgfQorCisgICAgICB1bm9yZGVyZWRfc2V0JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHVub3JkZXJlZF9zZXQmKSA9IGRlZmF1bHQ7CisKKyAgICAgIHVub3JkZXJlZF9zZXQmCisgICAgICBvcGVyYXRvcj0odW5vcmRlcmVkX3NldCYmKSA9IGRlZmF1bHQ7CisKKyAgICAgIHVub3JkZXJlZF9zZXQmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJX01fYmFzZSgpID0gX19sOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgc3dhcCh1bm9yZGVyZWRfc2V0JiBfX3gpCisgICAgICB7IF9CYXNlOjpzd2FwKF9feCk7IH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBub2V4Y2VwdAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfaGFzaHRhYmxlX2Rlc3RydWN0KHRoaXMsIF9CYXNlOjpidWNrZXRfY291bnQoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Jhc2U6OnNpemUoKSk7CisgICAgICAgIHRoaXMtPl9NX3Byb2ZpbGVfZGVzdHJ1Y3QoKTsKKyAgICAgICAgX0Jhc2U6OmNsZWFyKCk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKwllbXBsYWNlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworCSAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBfX3JlcworCSAgICA9IF9CYXNlOjplbXBsYWNlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsKKwkgIHJldHVybiBfX3JlczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJhdG9yIF9faXQsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworCSAgaXRlcmF0b3IgX19yZXMKKwkgICAgPSBfQmFzZTo6ZW1wbGFjZV9oaW50KF9faXQsIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsKKwkgIHJldHVybiBfX3JlczsKKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyAKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisgICAgICAgIF9CYXNlOjppbnNlcnQoX19sKTsgCisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOyAKKyAgICAgIH0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKyAgICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX19vYmopOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsgCisgICAgICAgIHJldHVybiBfX3JlczsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2l0ZXIsIGNvbnN0IHZhbHVlX3R5cGUmIF9fdikKKyAgICAgIHsgCisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOyAKKyAgICAgICAgaXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9faXRlciwgX192KTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICB9CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydCh2YWx1ZV90eXBlJiYgX19vYmopCisgICAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworICAgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IF9fcmVzID0gX0Jhc2U6Omluc2VydChzdGQ6Om1vdmUoX19vYmopKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19pdGVyLCB2YWx1ZV90eXBlJiYgX192KQorICAgICAgeyAKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisgICAgICAgIGl0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6Omluc2VydChfX2l0ZXIsIHN0ZDo6bW92ZShfX3YpKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXI+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QpCisgICAgICAgIHsKKwkgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOyAKKwkgIF9CYXNlOjppbnNlcnQoX19maXJzdCwgX19sYXN0KTsKKwkgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOyAKKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlaGFzaChzaXplX3R5cGUgX19uKQorICAgICAgeworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKyAgICAgICAgX0Jhc2U6OnJlaGFzaChfX24pOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsgCisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01fcHJvZmlsZV9yZXNpemUoc2l6ZV90eXBlIF9fb2xkX3NpemUpCisgICAgICB7CisJc2l6ZV90eXBlIF9fbmV3X3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisJaWYgKF9fb2xkX3NpemUgIT0gX19uZXdfc2l6ZSkKKwkgIF9fcHJvZmN4eF9oYXNodGFibGVfcmVzaXplKHRoaXMsIF9fb2xkX3NpemUsIF9fbmV3X3NpemUpOworICAgICAgfQorICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh1bm9yZGVyZWRfc2V0PF9LZXksIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSB1bm9yZGVyZWRfc2V0PF9LZXksIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfc2V0PF9LZXksIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfc2V0PF9LZXksIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IF9HTElCQ1hYX1NURF9CQVNFJj4oX194KSA9PSBfX3k7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgdW5vcmRlcmVkX3NldDxfS2V5LCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX3NldDxfS2V5LCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyN1bmRlZiBfR0xJQkNYWF9CQVNFCisjdW5kZWYgX0dMSUJDWFhfU1REX0JBU0UKKyNkZWZpbmUgX0dMSUJDWFhfU1REX0JBU0UgX0dMSUJDWFhfU1REX0M6Ol9HTElCQ1hYX0JBU0UKKyNkZWZpbmUgX0dMSUJDWFhfQkFTRSB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4KKworICAvKiogQGJyaWVmIFVub3JkZXJlZF9tdWx0aXNldCB3cmFwcGVyIHdpdGggcGVyZm9ybWFuY2UgaW5zdHJ1bWVudGF0aW9uLiAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9IYXNoID0gc3RkOjpoYXNoPF9WYWx1ZT4sCisJICAgdHlwZW5hbWUgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9WYWx1ZT4sCisJICAgdHlwZW5hbWUgX0FsbG9jID0gIHN0ZDo6YWxsb2NhdG9yPF9WYWx1ZT4gPgorICAgIGNsYXNzIHVub3JkZXJlZF9tdWx0aXNldAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9CQVNFLAorICAgICAgcHVibGljIF9Vbm9yZGVyZWRfcHJvZmlsZTx1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLAorCQkJCQkJICAgX0hhc2gsIF9QcmVkLCBfQWxsb2M+LAorCQkJCWZhbHNlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0JBU0UgX0Jhc2U7CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpIG5vZXhjZXB0ICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aGFzaGVyICAgICAgICAgIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV9lcXVhbCAgICAgICBrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfdHlwZSAgICAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldChzaXplX3R5cGUgX19uID0gMTAsCisJCQkgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCQkgICBzaXplX3R5cGUgX19uID0gMCwKKwkJCSAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJICA6IF9CYXNlKF9fZiwgX19sLCBfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7IH0KKworICAgICAgdW5vcmRlcmVkX211bHRpc2V0KGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldCYpID0gZGVmYXVsdDsKKworICAgICAgdW5vcmRlcmVkX211bHRpc2V0KGNvbnN0IF9CYXNlJiBfX3gpCisJOiBfQmFzZShfX3gpCisgICAgICB7IH0KKworICAgICAgdW5vcmRlcmVkX211bHRpc2V0KHVub3JkZXJlZF9tdWx0aXNldCYmKSA9IGRlZmF1bHQ7CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkJCSBzaXplX3R5cGUgX19uID0gMCwKKwkJCSBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgIHsgfQorCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQmCisgICAgICBvcGVyYXRvcj0oY29uc3QgdW5vcmRlcmVkX211bHRpc2V0JikgPSBkZWZhdWx0OworCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQmCisgICAgICBvcGVyYXRvcj0odW5vcmRlcmVkX211bHRpc2V0JiYpID0gZGVmYXVsdDsKKworICAgICAgdW5vcmRlcmVkX211bHRpc2V0JgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCV9NX2Jhc2UoKSA9IF9fbDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodW5vcmRlcmVkX211bHRpc2V0JiBfX3gpCisgICAgICB7IF9CYXNlOjpzd2FwKF9feCk7IH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKSBub2V4Y2VwdAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfaGFzaHRhYmxlX2Rlc3RydWN0KHRoaXMsIF9CYXNlOjpidWNrZXRfY291bnQoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Jhc2U6OnNpemUoKSk7CisgICAgICAgIHRoaXMtPl9NX3Byb2ZpbGVfZGVzdHJ1Y3QoKTsKKyAgICAgICAgX0Jhc2U6OmNsZWFyKCk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWl0ZXJhdG9yCisJZW1wbGFjZShfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKwkgIGl0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6OmVtcGxhY2Uoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOworCSAgcmV0dXJuIF9fcmVzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJaXRlcmF0b3IKKwllbXBsYWNlX2hpbnQoY29uc3RfaXRlcmF0b3IgX19pdCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisJICBpdGVyYXRvciBfX3JlcworCSAgICA9IF9CYXNlOjplbXBsYWNlX2hpbnQoX19pdCwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOworCSAgcmV0dXJuIF9fcmVzOworCX0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IAorICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKyAgICAgICAgX0Jhc2U6Omluc2VydChfX2wpOyAKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsKKyAgICAgICAgaXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9fb2JqKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19pdGVyLCBjb25zdCB2YWx1ZV90eXBlJiBfX3YpCisgICAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOyAKKyAgICAgICAgaXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9faXRlciwgX192KTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQodmFsdWVfdHlwZSYmIF9fb2JqKQorICAgICAgeworCXNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworICAgICAgICBpdGVyYXRvciBfX3JlcyA9IF9CYXNlOjppbnNlcnQoc3RkOjptb3ZlKF9fb2JqKSk7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOyAKKyAgICAgICAgcmV0dXJuIF9fcmVzOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faXRlciwgdmFsdWVfdHlwZSYmIF9fdikKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7IAorICAgICAgICBpdGVyYXRvciBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX19pdGVyLCBzdGQ6Om1vdmUoX192KSk7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOyAKKyAgICAgICAgcmV0dXJuIF9fcmVzOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0KQorICAgICAgICB7CisJICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsgCisJICBfQmFzZTo6aW5zZXJ0KF9fZmlyc3QsIF9fbGFzdCk7CisJICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsgCisJfQorCisgICAgICB2b2lkCisgICAgICByZWhhc2goc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisgICAgICAgIF9CYXNlOjpyZWhhc2goX19uKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKHNpemVfdHlwZSBfX29sZF9zaXplKQorICAgICAgeworCXNpemVfdHlwZSBfX25ld19zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworICAgICAgICBpZiAoX19vbGRfc2l6ZSAhPSBfX25ld19zaXplKQorICAgICAgICAgIF9fcHJvZmN4eF9oYXNodGFibGVfcmVzaXplKHRoaXMsIF9fb2xkX3NpemUsIF9fbmV3X3NpemUpOworICAgICAgfQorICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IF9HTElCQ1hYX1NURF9CQVNFJj4oX194KSA9PSBfX3k7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX3Byb2ZpbGUKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjdW5kZWYgX0dMSUJDWFhfQkFTRQorI3VuZGVmIF9HTElCQ1hYX1NURF9CQVNFCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcHJvZmlsZS92ZWN0b3IgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvdmVjdG9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MmU0MjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Byb2ZpbGUvdmVjdG9yCkBAIC0wLDAgKzEsNTU0IEBACisvLyBQcm9maWxpbmcgdmVjdG9yIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvdmVjdG9yCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHByb2ZpbGUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfVkVDVE9SCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfVkVDVE9SIDEKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHByb2ZpbGUvYmFzZS5oPgorI2luY2x1ZGUgPHByb2ZpbGUvaXRlcmF0b3JfdHJhY2tlci5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3Byb2ZpbGUKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyB2ZWN0b3IKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQzo6dmVjdG9yPF9UcCwgX0FsbG9jYXRvcj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX1NURF9DOjp2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPiBfQmFzZTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX2FsbG9jX3RyYWl0czxfQWxsb2NhdG9yPiAgX0FsbG9jX3RyYWl0czsKKyNlbmRpZgorCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgX19pdGVyYXRvcl90cmFja2VyPHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciwgdmVjdG9yPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2l0ZXJhdG9yX3RyYWNrZXI8dHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yLCB2ZWN0b3I+CisJCQkJICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX1RwCQkJCSAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQWxsb2NhdG9yCQkJICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9wb2ludGVyICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgICAgICAKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpIF9HTElCQ1hYX05PRVhDRVBUIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIC8vIDIzLjIuNC4xIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgICBleHBsaWNpdAorICAgICAgdmVjdG9yKGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19hKQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdCh0aGlzLCB0aGlzLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9jb25zdHJ1Y3QyKHRoaXMpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgZXhwbGljaXQKKyAgICAgIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX19hKQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdCh0aGlzLCB0aGlzLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9jb25zdHJ1Y3QyKHRoaXMpOworICAgICAgfQorCisgICAgICB2ZWN0b3Ioc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbHVlLAorCSAgICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiAgX0Jhc2UoX19uLCBfX3ZhbHVlLCBfX2EpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0KHRoaXMsIHRoaXMtPmNhcGFjaXR5KCkpOworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdDIodGhpcyk7CisgICAgICB9CisjZWxzZQorICAgICAgZXhwbGljaXQKKyAgICAgIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUgPSBfVHAoKSwKKwkgICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX3ZhbHVlLCBfX2EpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0KHRoaXMsIHRoaXMtPmNhcGFjaXR5KCkpOworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdDIodGhpcyk7CisgICAgICB9CisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgICAgICB0eXBlbmFtZSA9IHN0ZDo6X1JlcXVpcmVJbnB1dEl0ZXI8X0lucHV0SXRlcmF0b3I+PgorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorI2VuZGlmCisgICAgICAgIHZlY3RvcihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKwk6IF9CYXNlKF9fZmlyc3QsIF9fbGFzdCwgX19hKQorICAgICAgICB7CisJICBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdCh0aGlzLCB0aGlzLT5jYXBhY2l0eSgpKTsKKwkgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0Mih0aGlzKTsKKwl9CisKKyAgICAgIHZlY3Rvcihjb25zdCB2ZWN0b3ImIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSAKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9jb25zdHJ1Y3QodGhpcywgdGhpcy0+Y2FwYWNpdHkoKSk7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0Mih0aGlzKTsKKyAgICAgIH0KKworICAgICAgLy8vIENvbnN0cnVjdGlvbiBmcm9tIGEgcmVsZWFzZS1tb2RlIHZlY3RvcgorICAgICAgdmVjdG9yKGNvbnN0IF9CYXNlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkgCisgICAgICB7IAorICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdCh0aGlzLCB0aGlzLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9jb25zdHJ1Y3QyKHRoaXMpOworICAgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdmVjdG9yKHZlY3RvciYmIF9feCkgbm9leGNlcHQKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0KHRoaXMsIHRoaXMtPmNhcGFjaXR5KCkpOworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdDIodGhpcyk7CisgICAgICB9CisKKyAgICAgIHZlY3Rvcihjb25zdCBfQmFzZSYgX194LCBjb25zdCBfQWxsb2NhdG9yJiBfX2EpCisgICAgICA6IF9CYXNlKF9feCwgX19hKQorICAgICAgeyAKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9jb25zdHJ1Y3QodGhpcywgdGhpcy0+Y2FwYWNpdHkoKSk7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0Mih0aGlzKTsKKyAgICAgIH0KKworICAgICAgdmVjdG9yKHZlY3RvciYmIF9feCwgY29uc3QgX0FsbG9jYXRvciYgX19hKSBub2V4Y2VwdAorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSwgX19hKQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdCh0aGlzLCB0aGlzLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9jb25zdHJ1Y3QyKHRoaXMpOworICAgICAgfQorCisgICAgICB2ZWN0b3IoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLCBfX2EpIHsgfQorI2VuZGlmCisKKyAgICAgIH52ZWN0b3IoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2Rlc3RydWN0KHRoaXMsIHRoaXMtPmNhcGFjaXR5KCksIHRoaXMtPnNpemUoKSk7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfZGVzdHJ1Y3QyKHRoaXMpOworICAgICAgfQorCisgICAgICB2ZWN0b3ImCisgICAgICBvcGVyYXRvcj0oY29uc3QgdmVjdG9yJiBfX3gpCisgICAgICB7CisgICAgICAgIHN0YXRpY19jYXN0PF9CYXNlJj4oKnRoaXMpID0gX194OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2ZWN0b3ImCisgICAgICBvcGVyYXRvcj0odmVjdG9yJiYgX194KSBub2V4Y2VwdChfQWxsb2NfdHJhaXRzOjpfU19ub3Rocm93X21vdmUoKSkKKyAgICAgIHsKKwlfX3Byb2ZjeHhfdmVjdG9yX2Rlc3RydWN0KHRoaXMsIHRoaXMtPmNhcGFjaXR5KCksIHRoaXMtPnNpemUoKSk7CisJX19wcm9mY3h4X3ZlY3Rvcl9kZXN0cnVjdDIodGhpcyk7CisJc3RhdGljX2Nhc3Q8X0Jhc2UmPigqdGhpcykgPSBzdGQ6Om1vdmUoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHZlY3RvciYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfQmFzZSY+KCp0aGlzKSA9IF9fbDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgdXNpbmcgX0Jhc2U6OmFzc2lnbjsKKyAgICAgIHVzaW5nIF9CYXNlOjpnZXRfYWxsb2NhdG9yOworCisKKyAgICAgIC8vIGl0ZXJhdG9yczoKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgX0dMSUJDWFhfTk9FWENFUFQKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyNlbmRpZgorCisgICAgICAvLyAyMy4yLjQuMiBjYXBhY2l0eToKKyAgICAgIHVzaW5nIF9CYXNlOjpzaXplOworICAgICAgdXNpbmcgX0Jhc2U6Om1heF9zaXplOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6KQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2ludmFsaWRfb3BlcmF0b3IodGhpcyk7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKHRoaXMsIHRoaXMtPmNhcGFjaXR5KCksIF9fc3opOworICAgICAgICBfQmFzZTo6cmVzaXplKF9fc3opOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3osIGNvbnN0IF9UcCYgX19jKQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2ludmFsaWRfb3BlcmF0b3IodGhpcyk7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKHRoaXMsIHRoaXMtPmNhcGFjaXR5KCksIF9fc3opOworICAgICAgICBfQmFzZTo6cmVzaXplKF9fc3osIF9fYyk7CisgICAgICB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6LCBfVHAgX19jID0gX1RwKCkpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfaW52YWxpZF9vcGVyYXRvcih0aGlzKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUodGhpcywgdGhpcy0+Y2FwYWNpdHkoKSwgX19zeik7CisgICAgICAgIF9CYXNlOjpyZXNpemUoX19zeiwgX19jKTsKKyAgICAgIH0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdXNpbmcgX0Jhc2U6OnNocmlua190b19maXQ7CisjZW5kaWYKKworICAgICAgdXNpbmcgX0Jhc2U6OmVtcHR5OworCisgICAgICAvLyBlbGVtZW50IGFjY2VzczoKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2ludmFsaWRfb3BlcmF0b3IodGhpcyk7CisgICAgICAgIHJldHVybiBfTV9iYXNlKClbX19uXTsKKyAgICAgIH0KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2ludmFsaWRfb3BlcmF0b3IodGhpcyk7CisgICAgICAgIHJldHVybiBfTV9iYXNlKClbX19uXTsKKyAgICAgIH0KKworICAgICAgdXNpbmcgX0Jhc2U6OmF0OworCisgICAgICByZWZlcmVuY2UKKyAgICAgIGZyb250KCkKKyAgICAgIHsgCisgICAgICAgIHJldHVybiBfQmFzZTo6ZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBmcm9udCgpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9CYXNlOjpmcm9udCgpOworICAgICAgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIGJhY2soKQorICAgICAgeworCXJldHVybiBfQmFzZTo6YmFjaygpOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGJhY2soKSBjb25zdAorICAgICAgeworCXJldHVybiBfQmFzZTo6YmFjaygpOworICAgICAgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiA0NjQuIFN1Z2dlc3Rpb24gZm9yIG5ldyBtZW1iZXIgZnVuY3Rpb25zIGluIHN0YW5kYXJkIGNvbnRhaW5lcnMuCisgICAgICB1c2luZyBfQmFzZTo6ZGF0YTsKKworICAgICAgLy8gMjMuMi40LjMgbW9kaWZpZXJzOgorICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKGNvbnN0IF9UcCYgX194KQorICAgICAgeworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHRoaXMtPmNhcGFjaXR5KCk7CisJX0Jhc2U6OnB1c2hfYmFjayhfX3gpOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZSh0aGlzLCBfX29sZF9zaXplLCB0aGlzLT5jYXBhY2l0eSgpKTsKKyAgICAgIH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfYmFjayhfVHAmJiBfX3gpCisgICAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gdGhpcy0+Y2FwYWNpdHkoKTsKKyAgICAgICAgX0Jhc2U6OnB1c2hfYmFjayhzdGQ6Om1vdmUoX194KSk7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKHRoaXMsIF9fb2xkX3NpemUsIHRoaXMtPmNhcGFjaXR5KCkpOworICAgICAgfQorCisjZW5kaWYKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCBfVHAmIF9feCkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9pbnNlcnQodGhpcywgX19wb3NpdGlvbi5iYXNlKCkgLSBfQmFzZTo6YmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+c2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSB0aGlzLT5jYXBhY2l0eSgpOworCXR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIF9feCk7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKHRoaXMsIF9fb2xkX3NpemUsIHRoaXMtPmNhcGFjaXR5KCkpOworCXJldHVybiBpdGVyYXRvcihfX3JlcywgdGhpcyk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9UcCYmIF9feCkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9pbnNlcnQodGhpcywgX19wb3NpdGlvbi5iYXNlKCkgLSBfQmFzZTo6YmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+c2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSB0aGlzLT5jYXBhY2l0eSgpOworCXR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIF9feCk7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKHRoaXMsIF9fb2xkX3NpemUsIHRoaXMtPmNhcGFjaXR5KCkpOworCXJldHVybiBpdGVyYXRvcihfX3JlcywgdGhpcyk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBlbXBsYWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgICB7CisJICB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX19yZXMKKwkgICAgPSBfQmFzZTo6ZW1wbGFjZShfX3Bvc2l0aW9uLmJhc2UoKSwKKwkJCSAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIHJldHVybiBpdGVyYXRvcihfX3JlcywgdGhpcyk7CisJfQorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IHRoaXMtPmluc2VydChfX3Bvc2l0aW9uLCBfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB2b2lkCisgICAgICBzd2FwKHZlY3RvciYmIF9feCkKKyAgICAgIHsKKyAgICAgICAgX0Jhc2U6OnN3YXAoX194KTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBzd2FwKHZlY3RvciYgX194KQorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKwkJCW5vZXhjZXB0KF9BbGxvY190cmFpdHM6Ol9TX25vdGhyb3dfc3dhcCgpKQorI2VuZGlmCisgICAgICB7CisgICAgICAgIF9CYXNlOjpzd2FwKF9feCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9feCkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9pbnNlcnQodGhpcywgX19wb3NpdGlvbi5iYXNlKCkgLSBfQmFzZTo6YmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+c2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSB0aGlzLT5jYXBhY2l0eSgpOworICAgICAgICBfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24sIF9fbiwgX194KTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUodGhpcywgX19vbGRfc2l6ZSwgdGhpcy0+Y2FwYWNpdHkoKSk7CisgICAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwKKwkgICAgICAgdHlwZW5hbWUgPSBzdGQ6Ol9SZXF1aXJlSW5wdXRJdGVyPF9JbnB1dEl0ZXJhdG9yPj4KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyNlbmRpZgorICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sCisgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2luc2VydCh0aGlzLCBfX3Bvc2l0aW9uLmJhc2UoKS1fQmFzZTo6YmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+c2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSB0aGlzLT5jYXBhY2l0eSgpOworICAgICAgICBfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24sIF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKHRoaXMsIF9fb2xkX3NpemUsIHRoaXMtPmNhcGFjaXR5KCkpOworICAgICAgfQorCisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeworCXR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfX3JlcyA9IF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uLmJhc2UoKSk7CisJcmV0dXJuIGl0ZXJhdG9yKF9fcmVzLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMTUxLiBjYW4ndCBjdXJyZW50bHkgY2xlYXIoKSBlbXB0eSBjb250YWluZXIKKwl0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2xhc3QuYmFzZSgpKTsKKwlyZXR1cm4gaXRlcmF0b3IoX19yZXMsIHRoaXMpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpIF9HTElCQ1hYX05PRVhDRVBUCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfZGVzdHJ1Y3QodGhpcywgdGhpcy0+Y2FwYWNpdHkoKSwgdGhpcy0+c2l6ZSgpKTsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9kZXN0cnVjdDIodGhpcyk7CisgICAgICAgIF9CYXNlOjpjbGVhcigpOworICAgICAgfQorCisgICAgICBpbmxpbmUgdm9pZCBfTV9wcm9maWxlX2ZpbmQoKSBjb25zdCAKKyAgICAgIHsgCisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfZmluZCh0aGlzLCBzaXplKCkpOyAKKyAgICAgIH0KKworICAgICAgaW5saW5lIHZvaWQgX01fcHJvZmlsZV9pdGVyYXRlKGludCBfX3Jld2luZCA9IDApIGNvbnN0IAorICAgICAgeyAKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9pdGVyYXRlKHRoaXMpOyAKKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkIF9NX3Byb2ZpbGVfcmVzaXplKHZvaWQqIG9iaiwgc2l6ZV90eXBlIF9fb2xkX3NpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uZXdfc2l6ZSkKKyAgICAgIHsKKyAgICAgICAgaWYgKF9fb2xkX3NpemUgPCBfX25ld19zaXplKSB7CisgICAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9yZXNpemUodGhpcywgdGhpcy0+c2l6ZSgpLCBfX25ld19zaXplKTsKKyAgICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX3Jlc2l6ZTIodGhpcywgdGhpcy0+c2l6ZSgpLCBfX25ld19zaXplKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLAorICAgICAgICAgICBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLAorICAgICAgICAgICBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgIT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19saHMsCisgICAgICAgICAgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLAorICAgICAgICAgICBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPD0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLAorICAgICAgICAgICBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPj0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19saHMsCisgICAgICAgICAgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh2ZWN0b3I8X1RwLCBfQWxsb2M+JiYgX19saHMsIHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgX19saHMuc3dhcChfX3Jocyk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodmVjdG9yPF9UcCwgX0FsbG9jPiYgX19saHMsIHZlY3RvcjxfVHAsIF9BbGxvYz4mJiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgX19wcm9maWxlCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIC8vIERSIDExODIuCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIHZlY3Rvcjxib29sPi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBoYXNoPF9fcHJvZmlsZTo6dmVjdG9yPGJvb2wsIF9BbGxvYz4+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBfX3Byb2ZpbGU6OnZlY3Rvcjxib29sLCBfQWxsb2M+PgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfX3Byb2ZpbGU6OnZlY3Rvcjxib29sLCBfQWxsb2M+JiBfX2IpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Omhhc2g8X0dMSUJDWFhfU1REX0M6OnZlY3Rvcjxib29sLCBfQWxsb2M+PigpCisJICAoX19iLl9NX2Jhc2UoKSk7IH0KKyAgICB9OworI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcXVldWUgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3F1ZXVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZTdmNTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3F1ZXVlCkBAIC0wLDAgKzEsNjYgQEAKKy8vIDxxdWV1ZT4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGluY2x1ZGUvcXVldWUKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUVVFVUUKKyNkZWZpbmUgX0dMSUJDWFhfUVVFVUUgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Yml0cy9zdGxfaGVhcC5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2Z1bmN0aW9uLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfcXVldWUuaD4KKworI2VuZGlmIC8qIF9HTElCQ1hYX1FVRVVFICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3JhbmRvbSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcmFuZG9tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYjM4MjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3JhbmRvbQpAQCAtMCwwICsxLDU4IEBACisvLyA8cmFuZG9tPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9yYW5kb20KKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUkFORE9NCisjZGVmaW5lIF9HTElCQ1hYX1JBTkRPTSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaWZkZWYgX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxCisKKyNpbmNsdWRlIDxjc3RkaW50PiAvLyBGb3IgdWludF9mYXN0MzJfdCwgdWludF9mYXN0NjRfdCwgdWludF9sZWFzdDMyX3QKKyNpbmNsdWRlIDxiaXRzL3JhbmRvbS5oPgorI2luY2x1ZGUgPGJpdHMvb3B0X3JhbmRvbS5oPgorI2luY2x1ZGUgPGJpdHMvcmFuZG9tLnRjYz4KKworI2VuZGlmIC8vIF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMQorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vIF9HTElCQ1hYX1JBTkRPTQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9yYXRpbyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcmF0aW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiZjk5MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcmF0aW8KQEAgLTAsMCArMSw1MzggQEAKKy8vIHJhdGlvIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSAKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL3JhdGlvCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1JBVElPCisjZGVmaW5lIF9HTElCQ1hYX1JBVElPIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAZGVmZ3JvdXAgcmF0aW8gUmF0aW9uYWwgQXJpdGhtZXRpYworICAgKiBAaW5ncm91cCB1dGlsaXRpZXMKKyAgICoKKyAgICogQ29tcGlsZSB0aW1lIHJlcHJlc2VudGF0aW9uIG9mIGZpbml0ZSByYXRpb25hbCBudW1iZXJzLgorICAgKiBAeworICAgKi8KKworICB0ZW1wbGF0ZTxpbnRtYXhfdCBfUG4+CisgICAgc3RydWN0IF9fc3RhdGljX3NpZ24KKyAgICA6IGludGVncmFsX2NvbnN0YW50PGludG1heF90LCAoX1BuIDwgMCkgPyAtMSA6IDE+CisgICAgeyB9OworCisgIHRlbXBsYXRlPGludG1heF90IF9Qbj4KKyAgICBzdHJ1Y3QgX19zdGF0aWNfYWJzCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxpbnRtYXhfdCwgX1BuICogX19zdGF0aWNfc2lnbjxfUG4+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8aW50bWF4X3QgX1BuLCBpbnRtYXhfdCBfUW4+CisgICAgc3RydWN0IF9fc3RhdGljX2djZAorICAgIDogX19zdGF0aWNfZ2NkPF9RbiwgKF9QbiAlIF9Rbik+CisgICAgeyB9OworCisgIHRlbXBsYXRlPGludG1heF90IF9Qbj4KKyAgICBzdHJ1Y3QgX19zdGF0aWNfZ2NkPF9QbiwgMD4KKyAgICA6IGludGVncmFsX2NvbnN0YW50PGludG1heF90LCBfX3N0YXRpY19hYnM8X1BuPjo6dmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPGludG1heF90IF9Rbj4KKyAgICBzdHJ1Y3QgX19zdGF0aWNfZ2NkPDAsIF9Rbj4KKyAgICA6IGludGVncmFsX2NvbnN0YW50PGludG1heF90LCBfX3N0YXRpY19hYnM8X1FuPjo6dmFsdWU+CisgICAgeyB9OworCisgIC8vIExldCBjID0gMl4oaGFsZiAjIG9mIGJpdHMgaW4gYW4gaW50bWF4X3QpCisgIC8vIHRoZW4gd2UgZmluZCBhMSwgYTAsIGIxLCBiMCBzLnQuIE4gPSBhMSpjICsgYTAsIE0gPSBiMSpjICsgYjAKKyAgLy8gVGhlIG11bHRpcGxpY2F0aW9uIG9mIE4gYW5kIE0gYmVjb21lcywKKyAgLy8gTiAqIE0gPSAoYTEgKiBiMSljXjIgKyAoYTAgKiBiMSArIGIwICogYTEpYyArIGEwICogYjAKKyAgLy8gTXVsdGlwbGljYXRpb24gaXMgc2FmZSBpZiBlYWNoIHRlcm0gYW5kIHRoZSBzdW0gb2YgdGhlIHRlcm1zCisgIC8vIGlzIHJlcHJlc2VudGFibGUgYnkgaW50bWF4X3QuCisgIHRlbXBsYXRlPGludG1heF90IF9QbiwgaW50bWF4X3QgX1FuPgorICAgIHN0cnVjdCBfX3NhZmVfbXVsdGlwbHkKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHN0YXRpYyBjb25zdCB1aW50bWF4X3QgX19jID0gdWludG1heF90KDEpIDw8IChzaXplb2YoaW50bWF4X3QpICogNCk7CisKKyAgICAgIHN0YXRpYyBjb25zdCB1aW50bWF4X3QgX19hMCA9IF9fc3RhdGljX2FiczxfUG4+Ojp2YWx1ZSAlIF9fYzsKKyAgICAgIHN0YXRpYyBjb25zdCB1aW50bWF4X3QgX19hMSA9IF9fc3RhdGljX2FiczxfUG4+Ojp2YWx1ZSAvIF9fYzsKKyAgICAgIHN0YXRpYyBjb25zdCB1aW50bWF4X3QgX19iMCA9IF9fc3RhdGljX2FiczxfUW4+Ojp2YWx1ZSAlIF9fYzsKKyAgICAgIHN0YXRpYyBjb25zdCB1aW50bWF4X3QgX19iMSA9IF9fc3RhdGljX2FiczxfUW4+Ojp2YWx1ZSAvIF9fYzsKKworICAgICAgc3RhdGljX2Fzc2VydChfX2ExID09IDAgfHwgX19iMSA9PSAwLCAKKwkJICAgICJvdmVyZmxvdyBpbiBtdWx0aXBsaWNhdGlvbiIpOworICAgICAgc3RhdGljX2Fzc2VydChfX2EwICogX19iMSArIF9fYjAgKiBfX2ExIDwgKF9fYyA+PiAxKSwgCisJCSAgICAib3ZlcmZsb3cgaW4gbXVsdGlwbGljYXRpb24iKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19iMCAqIF9fYTAgPD0gX19JTlRNQVhfTUFYX18sIAorCQkgICAgIm92ZXJmbG93IGluIG11bHRpcGxpY2F0aW9uIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KChfX2EwICogX19iMSArIF9fYjAgKiBfX2ExKSAqIF9fYworCQkgICAgPD0gX19JTlRNQVhfTUFYX18gLSAgX19iMCAqIF9fYTAsCisJCSAgICAib3ZlcmZsb3cgaW4gbXVsdGlwbGljYXRpb24iKTsKKworICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCB2YWx1ZSA9IF9QbiAqIF9RbjsKKyAgICB9OworCisgIC8vIFNvbWUgZG91YmxlLXByZWNpc2lvbiB1dGlsaXRpZXMsIHdoZXJlIG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGFzCisgIC8vIF9faGkqMl4oOCpzaXplb2YodWludG1heF90KSkgKyBfX2xvLgorICB0ZW1wbGF0ZTx1aW50bWF4X3QgX19oaTEsIHVpbnRtYXhfdCBfX2xvMSwgdWludG1heF90IF9faGkyLCB1aW50bWF4X3QgX19sbzI+CisgICAgc3RydWN0IF9fYmlnX2xlc3MKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2hpMSA8IF9faGkyCisJCQkgICAgICAgfHwgKF9faGkxID09IF9faGkyICYmIF9fbG8xIDwgX19sbzIpKT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dWludG1heF90IF9faGkxLCB1aW50bWF4X3QgX19sbzEsIHVpbnRtYXhfdCBfX2hpMiwgdWludG1heF90IF9fbG8yPgorICAgIHN0cnVjdCBfX2JpZ19hZGQKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX2xvID0gX19sbzEgKyBfX2xvMjsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9faGkgPSAoX19oaTEgKyBfX2hpMiArCisJCQkJCSAoX19sbzEgKyBfX2xvMiA8IF9fbG8xKSk7IC8vIGNhcnJ5CisgICAgfTsKKworICAvLyBTdWJ0cmFjdCBhIG51bWJlciBmcm9tIGEgYmlnZ2VyIG9uZS4KKyAgdGVtcGxhdGU8dWludG1heF90IF9faGkxLCB1aW50bWF4X3QgX19sbzEsIHVpbnRtYXhfdCBfX2hpMiwgdWludG1heF90IF9fbG8yPgorICAgIHN0cnVjdCBfX2JpZ19zdWIKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KCFfX2JpZ19sZXNzPF9faGkxLCBfX2xvMSwgX19oaTIsIF9fbG8yPjo6dmFsdWUsCisJCSAgICAiSW50ZXJuYWwgbGlicmFyeSBlcnJvciIpOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19sbyA9IF9fbG8xIC0gX19sbzI7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX2hpID0gKF9faGkxIC0gX19oaTIgLQorCQkJCQkgKF9fbG8xIDwgX19sbzIpKTsgLy8gY2FycnkKKyAgICB9OworCisgIC8vIFNhbWUgcHJpbmNpcGxlIGFzIF9fc2FmZV9tdWx0aXBseS4KKyAgdGVtcGxhdGU8dWludG1heF90IF9feCwgdWludG1heF90IF9feT4KKyAgICBzdHJ1Y3QgX19iaWdfbXVsCisgICAgeworICAgIHByaXZhdGU6CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX2MgPSB1aW50bWF4X3QoMSkgPDwgKHNpemVvZihpbnRtYXhfdCkgKiA0KTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9feDAgPSBfX3ggJSBfX2M7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX3gxID0gX194IC8gX19jOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX195MCA9IF9feSAlIF9fYzsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9feTEgPSBfX3kgLyBfX2M7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX3gweTAgPSBfX3gwICogX195MDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9feDB5MSA9IF9feDAgKiBfX3kxOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX194MXkwID0gX194MSAqIF9feTA7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX3gxeTEgPSBfX3gxICogX195MTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fbWl4ID0gX194MHkxICsgX194MXkwOyAvLyBwb3NzaWJsZSBjYXJyeS4uLgorICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19taXhfbG8gPSBfX21peCAqIF9fYzsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fbWl4X2hpCisgICAgICA9IF9fbWl4IC8gX19jICsgKChfX21peCA8IF9feDB5MSkgPyBfX2MgOiAwKTsgLy8gLi4uIGFkZGVkIGhlcmUKKyAgICAgIHR5cGVkZWYgX19iaWdfYWRkPF9fbWl4X2hpLCBfX21peF9sbywgX194MXkxLCBfX3gweTA+IF9SZXM7CisgICAgcHVibGljOgorICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19oaSA9IF9SZXM6Ol9faGk7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX2xvID0gX1Jlczo6X19sbzsKKyAgICB9OworCisgIC8vIEFkYXB0ZWQgZnJvbSBfX3VkaXZfcXJubmRfYyBpbiBsb25nbG9uZy5oCisgIC8vIFRoaXMgdmVyc2lvbiBhc3N1bWVzIHRoYXQgdGhlIGhpZ2ggYml0IG9mIF9fZCBpcyAxLgorICB0ZW1wbGF0ZTx1aW50bWF4X3QgX19uMSwgdWludG1heF90IF9fbjAsIHVpbnRtYXhfdCBfX2Q+CisgICAgc3RydWN0IF9fYmlnX2Rpdl9pbXBsCisgICAgeworICAgIHByaXZhdGU6CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fZCA+PSAodWludG1heF90KDEpIDw8IChzaXplb2YoaW50bWF4X3QpICogOCAtIDEpKSwKKwkJICAgICJJbnRlcm5hbCBsaWJyYXJ5IGVycm9yIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fbjEgPCBfX2QsICJJbnRlcm5hbCBsaWJyYXJ5IGVycm9yIik7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX2MgPSB1aW50bWF4X3QoMSkgPDwgKHNpemVvZihpbnRtYXhfdCkgKiA0KTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fZDEgPSBfX2QgLyBfX2M7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX2QwID0gX19kICUgX19jOworCisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX3ExeCA9IF9fbjEgLyBfX2QxOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19yMXggPSBfX24xICUgX19kMTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fbSA9IF9fcTF4ICogX19kMDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fcjF5ID0gX19yMXggKiBfX2MgKyBfX24wIC8gX19jOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19yMXogPSBfX3IxeSArIF9fZDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fcjEKKyAgICAgID0gKChfX3IxeSA8IF9fbSkgPyAoKF9fcjF6ID49IF9fZCkgJiYgKF9fcjF6IDwgX19tKSkKKwkgPyAoX19yMXogKyBfX2QpIDogX19yMXogOiBfX3IxeSkgLSBfX207CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX3ExCisgICAgICA9IF9fcTF4IC0gKChfX3IxeSA8IF9fbSkKKwkJID8gKChfX3IxeiA+PSBfX2QpICYmIChfX3IxeiA8IF9fbSkpID8gMiA6IDEgOiAwKTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fcTB4ID0gX19yMSAvIF9fZDE7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX3IweCA9IF9fcjEgJSBfX2QxOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19uID0gX19xMHggKiBfX2QwOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19yMHkgPSBfX3IweCAqIF9fYyArIF9fbjAgJSBfX2M7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX3IweiA9IF9fcjB5ICsgX19kOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19yMAorICAgICAgPSAoKF9fcjB5IDwgX19uKSA/ICgoX19yMHogPj0gX19kKSAmJiAoX19yMHogPCBfX24pKQorCSA/IChfX3IweiArIF9fZCkgOiBfX3IweiA6IF9fcjB5KSAtIF9fbjsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fcTAKKyAgICAgID0gX19xMHggLSAoKF9fcjB5IDwgX19uKSA/ICgoX19yMHogPj0gX19kKQorCQkJCSAgJiYgKF9fcjB6IDwgX19uKSkgPyAyIDogMSA6IDApOworCisgICAgcHVibGljOgorICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19xdW90ID0gX19xMSAqIF9fYyArIF9fcTA7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX3JlbSA9IF9fcjA7CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2JpZ19tdWw8X19xdW90LCBfX2Q+IF9Qcm9kOworICAgICAgdHlwZWRlZiBfX2JpZ19hZGQ8X1Byb2Q6Ol9faGksIF9Qcm9kOjpfX2xvLCAwLCBfX3JlbT4gX1N1bTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX1N1bTo6X19oaSA9PSBfX24xICYmIF9TdW06Ol9fbG8gPT0gX19uMCwKKwkJICAgICJJbnRlcm5hbCBsaWJyYXJ5IGVycm9yIik7CisgIH07CisKKyAgdGVtcGxhdGU8dWludG1heF90IF9fbjEsIHVpbnRtYXhfdCBfX24wLCB1aW50bWF4X3QgX19kPgorICAgIHN0cnVjdCBfX2JpZ19kaXYKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHN0YXRpY19hc3NlcnQoX19kICE9IDAsICJJbnRlcm5hbCBsaWJyYXJ5IGVycm9yIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZiAodWludG1heF90KSA9PSBzaXplb2YgKHVuc2lnbmVkIGxvbmcgbG9uZyksCisJCSAgICAiVGhpcyBsaWJyYXJ5IGNhbGxzIF9fYnVpbHRpbl9jbHpsbCBvbiB1aW50bWF4X3QsIHdoaWNoICIKKwkJICAgICJpcyB1bnNhZmUgb24geW91ciBwbGF0Zm9ybS4gUGxlYXNlIGNvbXBsYWluIHRvICIKKwkJICAgICJodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvIik7CisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBfX3NoaWZ0ID0gX19idWlsdGluX2NsemxsKF9fZCk7CisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBfX2Nvc2hpZnRfID0gc2l6ZW9mKHVpbnRtYXhfdCkgKiA4IC0gX19zaGlmdDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IF9fY29zaGlmdCA9IChfX3NoaWZ0ICE9IDApID8gX19jb3NoaWZ0XyA6IDA7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX2MxID0gdWludG1heF90KDEpIDw8IF9fc2hpZnQ7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX2MyID0gdWludG1heF90KDEpIDw8IF9fY29zaGlmdDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fbmV3X2QgPSBfX2QgKiBfX2MxOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19uZXdfbjAgPSBfX24wICogX19jMTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fbjFfc2hpZnRlZCA9IChfX24xICUgX19kKSAqIF9fYzE7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX24wX3RvcCA9IChfX3NoaWZ0ICE9IDApID8gKF9fbjAgLyBfX2MyKSA6IDA7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX25ld19uMSA9IF9fbjFfc2hpZnRlZCArIF9fbjBfdG9wOworICAgICAgdHlwZWRlZiBfX2JpZ19kaXZfaW1wbDxfX25ld19uMSwgX19uZXdfbjAsIF9fbmV3X2Q+IF9SZXM7CisKKyAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnRtYXhfdCBfX3F1b3RfaGkgPSBfX24xIC8gX19kOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19xdW90X2xvID0gX1Jlczo6X19xdW90OworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19yZW0gPSBfUmVzOjpfX3JlbSAvIF9fYzE7CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2JpZ19tdWw8X19xdW90X2xvLCBfX2Q+IF9QMDsKKyAgICAgIHR5cGVkZWYgX19iaWdfbXVsPF9fcXVvdF9oaSwgX19kPiBfUDE7CisgICAgICB0eXBlZGVmIF9fYmlnX2FkZDxfUDA6Ol9faGksIF9QMDo6X19sbywgX1AxOjpfX2xvLCBfX3JlbT4gX1N1bTsKKyAgICAgIC8vIE5vIG92ZXJmbG93LgorICAgICAgc3RhdGljX2Fzc2VydChfUDE6Ol9faGkgPT0gMCwgIkludGVybmFsIGxpYnJhcnkgZXJyb3IiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX1N1bTo6X19oaSA+PSBfUDA6Ol9faGksICJJbnRlcm5hbCBsaWJyYXJ5IGVycm9yIik7CisgICAgICAvLyBNYXRjaGVzIHRoZSBpbnB1dCBkYXRhLgorICAgICAgc3RhdGljX2Fzc2VydChfU3VtOjpfX2hpID09IF9fbjEgJiYgX1N1bTo6X19sbyA9PSBfX24wLAorCQkgICAgIkludGVybmFsIGxpYnJhcnkgZXJyb3IiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19yZW0gPCBfX2QsICJJbnRlcm5hbCBsaWJyYXJ5IGVycm9yIik7CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiBQcm92aWRlcyBjb21waWxlLXRpbWUgcmF0aW9uYWwgYXJpdGhtZXRpYy4KKyAgICoKKyAgICogIFRoaXMgY2xhc3MgdGVtcGxhdGUgcmVwcmVzZW50cyBhbnkgZmluaXRlIHJhdGlvbmFsIG51bWJlciB3aXRoIGEKKyAgICogIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3IgcmVwcmVzZW50YWJsZSBieSBjb21waWxlLXRpbWUgY29uc3RhbnRzIG9mCisgICAqICB0eXBlIGludG1heF90LiBUaGUgcmF0aW8gaXMgc2ltcGxpZmllZCB3aGVuIGluc3RhbnRpYXRlZC4KKyAgICoKKyAgICogIEZvciBleGFtcGxlOgorICAgKiAgQGNvZGUKKyAgICogICAgc3RkOjpyYXRpbzw3LC0yMT46Om51bSA9PSAtMTsKKyAgICogICAgc3RkOjpyYXRpbzw3LC0yMT46OmRlbiA9PSAzOworICAgKiAgQGVuZGNvZGUKKyAgICogIAorICAqLworICB0ZW1wbGF0ZTxpbnRtYXhfdCBfTnVtLCBpbnRtYXhfdCBfRGVuID0gMT4KKyAgICBzdHJ1Y3QgcmF0aW8KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9EZW4gIT0gMCwgImRlbm9taW5hdG9yIGNhbm5vdCBiZSB6ZXJvIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9OdW0gPj0gLV9fSU5UTUFYX01BWF9fICYmIF9EZW4gPj0gLV9fSU5UTUFYX01BWF9fLAorCQkgICAgIm91dCBvZiByYW5nZSIpOworCisgICAgICAvLyBOb3RlOiBzaWduKE4pICogYWJzKE4pID09IE4KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50bWF4X3QgbnVtID0KKyAgICAgICAgX051bSAqIF9fc3RhdGljX3NpZ248X0Rlbj46OnZhbHVlIC8gX19zdGF0aWNfZ2NkPF9OdW0sIF9EZW4+Ojp2YWx1ZTsKKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnRtYXhfdCBkZW4gPQorICAgICAgICBfX3N0YXRpY19hYnM8X0Rlbj46OnZhbHVlIC8gX19zdGF0aWNfZ2NkPF9OdW0sIF9EZW4+Ojp2YWx1ZTsKKworICAgICAgdHlwZWRlZiByYXRpbzxudW0sIGRlbj4gdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPGludG1heF90IF9OdW0sIGludG1heF90IF9EZW4+CisgICAgY29uc3RleHByIGludG1heF90IHJhdGlvPF9OdW0sIF9EZW4+OjpudW07CisKKyAgdGVtcGxhdGU8aW50bWF4X3QgX051bSwgaW50bWF4X3QgX0Rlbj4KKyAgICBjb25zdGV4cHIgaW50bWF4X3QgcmF0aW88X051bSwgX0Rlbj46OmRlbjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBzdHJ1Y3QgX19yYXRpb19tdWx0aXBseQorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgc3RhdGljIGNvbnN0IGludG1heF90IF9fZ2NkMSA9CisgICAgICAgIF9fc3RhdGljX2djZDxfUjE6Om51bSwgX1IyOjpkZW4+Ojp2YWx1ZTsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBfX2djZDIgPQorICAgICAgICBfX3N0YXRpY19nY2Q8X1IyOjpudW0sIF9SMTo6ZGVuPjo6dmFsdWU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHJhdGlvPAorICAgICAgICBfX3NhZmVfbXVsdGlwbHk8KF9SMTo6bnVtIC8gX19nY2QxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfUjI6Om51bSAvIF9fZ2NkMik+Ojp2YWx1ZSwKKyAgICAgICAgX19zYWZlX211bHRpcGx5PChfUjE6OmRlbiAvIF9fZ2NkMiksCisgICAgICAgICAgICAgICAgICAgICAgICAoX1IyOjpkZW4gLyBfX2djZDEpPjo6dmFsdWU+IHR5cGU7CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50bWF4X3QgbnVtID0gdHlwZTo6bnVtOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnRtYXhfdCBkZW4gPSB0eXBlOjpkZW47CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBjb25zdGV4cHIgaW50bWF4X3QgX19yYXRpb19tdWx0aXBseTxfUjEsIF9SMj46Om51bTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBjb25zdGV4cHIgaW50bWF4X3QgX19yYXRpb19tdWx0aXBseTxfUjEsIF9SMj46OmRlbjsKKworICAvLy8gcmF0aW9fbXVsdGlwbHkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgdXNpbmcgcmF0aW9fbXVsdGlwbHkgPSB0eXBlbmFtZSBfX3JhdGlvX211bHRpcGx5PF9SMSwgX1IyPjo6dHlwZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBzdHJ1Y3QgX19yYXRpb19kaXZpZGUKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9SMjo6bnVtICE9IDAsICJkaXZpc2lvbiBieSAwIik7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19yYXRpb19tdWx0aXBseTwKKyAgICAgICAgX1IxLAorICAgICAgICByYXRpbzxfUjI6OmRlbiwgX1IyOjpudW0+Pjo6dHlwZSB0eXBlOworCisgICAgICBzdGF0aWMgY29uc3RleHByIGludG1heF90IG51bSA9IHR5cGU6Om51bTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50bWF4X3QgZGVuID0gdHlwZTo6ZGVuOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgY29uc3RleHByIGludG1heF90IF9fcmF0aW9fZGl2aWRlPF9SMSwgX1IyPjo6bnVtOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIGNvbnN0ZXhwciBpbnRtYXhfdCBfX3JhdGlvX2RpdmlkZTxfUjEsIF9SMj46OmRlbjsKKworICAvLy8gcmF0aW9fZGl2aWRlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIHVzaW5nIHJhdGlvX2RpdmlkZSA9IHR5cGVuYW1lIF9fcmF0aW9fZGl2aWRlPF9SMSwgX1IyPjo6dHlwZTsKKworICAvLy8gcmF0aW9fZXF1YWwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgc3RydWN0IHJhdGlvX2VxdWFsCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfUjE6Om51bSA9PSBfUjI6Om51bSAmJiBfUjE6OmRlbiA9PSBfUjI6OmRlbj4KKyAgICB7IH07CisgIAorICAvLy8gcmF0aW9fbm90X2VxdWFsCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIHN0cnVjdCByYXRpb19ub3RfZXF1YWwKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsICFyYXRpb19lcXVhbDxfUjEsIF9SMj46OnZhbHVlPgorICAgIHsgfTsKKworICAvLyBCb3RoIG51bWJlcnMgYXJlIHBvc2l0aXZlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMiwKKyAgICAgICAgICAgdHlwZW5hbWUgX0xlZnQgPSBfX2JpZ19tdWw8X1IxOjpudW0sX1IyOjpkZW4+LAorICAgICAgICAgICB0eXBlbmFtZSBfUmlnaHQgPSBfX2JpZ19tdWw8X1IyOjpudW0sX1IxOjpkZW4+ID4KKyAgICBzdHJ1Y3QgX19yYXRpb19sZXNzX2ltcGxfMQorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19iaWdfbGVzczxfTGVmdDo6X19oaSwgX0xlZnQ6Ol9fbG8sCisgICAgICAgICAgIF9SaWdodDo6X19oaSwgX1JpZ2h0OjpfX2xvPjo6dmFsdWU+CisgICAgeyB9OyAKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMiwKKwkgICBib29sID0gKF9SMTo6bnVtID09IDAgfHwgX1IyOjpudW0gPT0gMAorCQkgICB8fCAoX19zdGF0aWNfc2lnbjxfUjE6Om51bT46OnZhbHVlCisJCSAgICAgICAhPSBfX3N0YXRpY19zaWduPF9SMjo6bnVtPjo6dmFsdWUpKSwKKwkgICBib29sID0gKF9fc3RhdGljX3NpZ248X1IxOjpudW0+Ojp2YWx1ZSA9PSAtMQorCQkgICAmJiBfX3N0YXRpY19zaWduPF9SMjo6bnVtPjo6dmFsdWUgPT0gLTEpPgorICAgIHN0cnVjdCBfX3JhdGlvX2xlc3NfaW1wbAorICAgIDogX19yYXRpb19sZXNzX2ltcGxfMTxfUjEsIF9SMj46OnR5cGUKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgc3RydWN0IF9fcmF0aW9fbGVzc19pbXBsPF9SMSwgX1IyLCB0cnVlLCBmYWxzZT4KKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9SMTo6bnVtIDwgX1IyOjpudW0+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIHN0cnVjdCBfX3JhdGlvX2xlc3NfaW1wbDxfUjEsIF9SMiwgZmFsc2UsIHRydWU+CisgICAgOiBfX3JhdGlvX2xlc3NfaW1wbF8xPHJhdGlvPC1fUjI6Om51bSwgX1IyOjpkZW4+LAorICAgICAgICAgICByYXRpbzwtX1IxOjpudW0sIF9SMTo6ZGVuPiA+Ojp0eXBlCisgICAgeyB9OworCisgIC8vLyByYXRpb19sZXNzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIHN0cnVjdCByYXRpb19sZXNzCisgICAgOiBfX3JhdGlvX2xlc3NfaW1wbDxfUjEsIF9SMj46OnR5cGUKKyAgICB7IH07CisgICAgCisgIC8vLyByYXRpb19sZXNzX2VxdWFsCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIHN0cnVjdCByYXRpb19sZXNzX2VxdWFsCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAhcmF0aW9fbGVzczxfUjIsIF9SMT46OnZhbHVlPgorICAgIHsgfTsKKyAgCisgIC8vLyByYXRpb19ncmVhdGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIHN0cnVjdCByYXRpb19ncmVhdGVyCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCByYXRpb19sZXNzPF9SMiwgX1IxPjo6dmFsdWU+CisgICAgeyB9OworCisgIC8vLyByYXRpb19ncmVhdGVyX2VxdWFsCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIHN0cnVjdCByYXRpb19ncmVhdGVyX2VxdWFsCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAhcmF0aW9fbGVzczxfUjEsIF9SMj46OnZhbHVlPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMiwKKyAgICAgIGJvb2wgPSAoX1IxOjpudW0gPj0gMCksCisgICAgICBib29sID0gKF9SMjo6bnVtID49IDApLAorICAgICAgYm9vbCA9IHJhdGlvX2xlc3M8cmF0aW88X19zdGF0aWNfYWJzPF9SMTo6bnVtPjo6dmFsdWUsIF9SMTo6ZGVuPiwKKyAgICAgICAgcmF0aW88X19zdGF0aWNfYWJzPF9SMjo6bnVtPjo6dmFsdWUsIF9SMjo6ZGVuPiA+Ojp2YWx1ZT4KKyAgICBzdHJ1Y3QgX19yYXRpb19hZGRfaW1wbAorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JhdGlvX2FkZF9pbXBsPAorICAgICAgICByYXRpbzwtX1IxOjpudW0sIF9SMTo6ZGVuPiwKKyAgICAgICAgcmF0aW88LV9SMjo6bnVtLCBfUjI6OmRlbj4gPjo6dHlwZSBfX3Q7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiByYXRpbzwtX190OjpudW0sIF9fdDo6ZGVuPiB0eXBlOworICAgIH07CisKKyAgLy8gVHJ1ZSBhZGRpdGlvbiBvZiBub25uZWdhdGl2ZSBudW1iZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMiwgYm9vbCBfX2I+CisgICAgc3RydWN0IF9fcmF0aW9fYWRkX2ltcGw8X1IxLCBfUjIsIHRydWUsIHRydWUsIF9fYj4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fZyA9IF9fc3RhdGljX2djZDxfUjE6OmRlbiwgX1IyOjpkZW4+Ojp2YWx1ZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludG1heF90IF9fZDIgPSBfUjI6OmRlbiAvIF9fZzsKKyAgICAgIHR5cGVkZWYgX19iaWdfbXVsPF9SMTo6ZGVuLCBfX2QyPiBfX2Q7CisgICAgICB0eXBlZGVmIF9fYmlnX211bDxfUjE6Om51bSwgX1IyOjpkZW4gLyBfX2c+IF9feDsKKyAgICAgIHR5cGVkZWYgX19iaWdfbXVsPF9SMjo6bnVtLCBfUjE6OmRlbiAvIF9fZz4gX195OworICAgICAgdHlwZWRlZiBfX2JpZ19hZGQ8X194OjpfX2hpLCBfX3g6Ol9fbG8sIF9feTo6X19oaSwgX195OjpfX2xvPiBfX247CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fbjo6X19oaSA+PSBfX3g6Ol9faGksICJJbnRlcm5hbCBsaWJyYXJ5IGVycm9yIik7CisgICAgICB0eXBlZGVmIF9fYmlnX2RpdjxfX246Ol9faGksIF9fbjo6X19sbywgX19nPiBfX25nOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19nMiA9IF9fc3RhdGljX2djZDxfX25nOjpfX3JlbSwgX19nPjo6dmFsdWU7CisgICAgICB0eXBlZGVmIF9fYmlnX2RpdjxfX246Ol9faGksIF9fbjo6X19sbywgX19nMj4gX19uX2ZpbmFsOworICAgICAgc3RhdGljX2Fzc2VydChfX25fZmluYWw6Ol9fcmVtID09IDAsICJJbnRlcm5hbCBsaWJyYXJ5IGVycm9yIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fbl9maW5hbDo6X19xdW90X2hpID09IDAgJiYKKyAgICAgICAgX19uX2ZpbmFsOjpfX3F1b3RfbG8gPD0gX19JTlRNQVhfTUFYX18sICJvdmVyZmxvdyBpbiBhZGRpdGlvbiIpOworICAgICAgdHlwZWRlZiBfX2JpZ19tdWw8X1IxOjpkZW4gLyBfX2cyLCBfX2QyPiBfX2RfZmluYWw7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fZF9maW5hbDo6X19oaSA9PSAwICYmCisgICAgICAgIF9fZF9maW5hbDo6X19sbyA8PSBfX0lOVE1BWF9NQVhfXywgIm92ZXJmbG93IGluIGFkZGl0aW9uIik7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiByYXRpbzxfX25fZmluYWw6Ol9fcXVvdF9sbywgX19kX2ZpbmFsOjpfX2xvPiB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgc3RydWN0IF9fcmF0aW9fYWRkX2ltcGw8X1IxLCBfUjIsIGZhbHNlLCB0cnVlLCB0cnVlPgorICAgIDogX19yYXRpb19hZGRfaW1wbDxfUjIsIF9SMT4KKyAgICB7IH07CisKKyAgLy8gVHJ1ZSBzdWJ0cmFjdGlvbiBvZiBub25uZWdhdGl2ZSBudW1iZXJzIHlpZWxkaW5nIGEgbm9ubmVnYXRpdmUgcmVzdWx0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBzdHJ1Y3QgX19yYXRpb19hZGRfaW1wbDxfUjEsIF9SMiwgdHJ1ZSwgZmFsc2UsIGZhbHNlPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19nID0gX19zdGF0aWNfZ2NkPF9SMTo6ZGVuLCBfUjI6OmRlbj46OnZhbHVlOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19kMiA9IF9SMjo6ZGVuIC8gX19nOworICAgICAgdHlwZWRlZiBfX2JpZ19tdWw8X1IxOjpkZW4sIF9fZDI+IF9fZDsKKyAgICAgIHR5cGVkZWYgX19iaWdfbXVsPF9SMTo6bnVtLCBfUjI6OmRlbiAvIF9fZz4gX194OworICAgICAgdHlwZWRlZiBfX2JpZ19tdWw8LV9SMjo6bnVtLCBfUjE6OmRlbiAvIF9fZz4gX195OworICAgICAgdHlwZWRlZiBfX2JpZ19zdWI8X194OjpfX2hpLCBfX3g6Ol9fbG8sIF9feTo6X19oaSwgX195OjpfX2xvPiBfX247CisgICAgICB0eXBlZGVmIF9fYmlnX2RpdjxfX246Ol9faGksIF9fbjo6X19sbywgX19nPiBfX25nOworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50bWF4X3QgX19nMiA9IF9fc3RhdGljX2djZDxfX25nOjpfX3JlbSwgX19nPjo6dmFsdWU7CisgICAgICB0eXBlZGVmIF9fYmlnX2RpdjxfX246Ol9faGksIF9fbjo6X19sbywgX19nMj4gX19uX2ZpbmFsOworICAgICAgc3RhdGljX2Fzc2VydChfX25fZmluYWw6Ol9fcmVtID09IDAsICJJbnRlcm5hbCBsaWJyYXJ5IGVycm9yIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fbl9maW5hbDo6X19xdW90X2hpID09IDAgJiYKKyAgICAgICAgX19uX2ZpbmFsOjpfX3F1b3RfbG8gPD0gX19JTlRNQVhfTUFYX18sICJvdmVyZmxvdyBpbiBhZGRpdGlvbiIpOworICAgICAgdHlwZWRlZiBfX2JpZ19tdWw8X1IxOjpkZW4gLyBfX2cyLCBfX2QyPiBfX2RfZmluYWw7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fZF9maW5hbDo6X19oaSA9PSAwICYmCisgICAgICAgIF9fZF9maW5hbDo6X19sbyA8PSBfX0lOVE1BWF9NQVhfXywgIm92ZXJmbG93IGluIGFkZGl0aW9uIik7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiByYXRpbzxfX25fZmluYWw6Ol9fcXVvdF9sbywgX19kX2ZpbmFsOjpfX2xvPiB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgc3RydWN0IF9fcmF0aW9fYWRkCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3JhdGlvX2FkZF9pbXBsPF9SMSwgX1IyPjo6dHlwZSB0eXBlOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnRtYXhfdCBudW0gPSB0eXBlOjpudW07CisgICAgICBzdGF0aWMgY29uc3RleHByIGludG1heF90IGRlbiA9IHR5cGU6OmRlbjsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIGNvbnN0ZXhwciBpbnRtYXhfdCBfX3JhdGlvX2FkZDxfUjEsIF9SMj46Om51bTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBjb25zdGV4cHIgaW50bWF4X3QgX19yYXRpb19hZGQ8X1IxLCBfUjI+OjpkZW47CisKKyAgLy8vIHJhdGlvX2FkZAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICB1c2luZyByYXRpb19hZGQgPSB0eXBlbmFtZSBfX3JhdGlvX2FkZDxfUjEsIF9SMj46OnR5cGU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgc3RydWN0IF9fcmF0aW9fc3VidHJhY3QKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcmF0aW9fYWRkPAorICAgICAgICBfUjEsCisgICAgICAgIHJhdGlvPC1fUjI6Om51bSwgX1IyOjpkZW4+Pjo6dHlwZSB0eXBlOworCisgICAgICBzdGF0aWMgY29uc3RleHByIGludG1heF90IG51bSA9IHR5cGU6Om51bTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50bWF4X3QgZGVuID0gdHlwZTo6ZGVuOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgY29uc3RleHByIGludG1heF90IF9fcmF0aW9fc3VidHJhY3Q8X1IxLCBfUjI+OjpudW07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgY29uc3RleHByIGludG1heF90IF9fcmF0aW9fc3VidHJhY3Q8X1IxLCBfUjI+OjpkZW47CisKKyAgLy8vIHJhdGlvX3N1YnRyYWN0CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIHVzaW5nIHJhdGlvX3N1YnRyYWN0ID0gdHlwZW5hbWUgX19yYXRpb19zdWJ0cmFjdDxfUjEsIF9SMj46OnR5cGU7CisKKworICB0eXBlZGVmIHJhdGlvPDEsICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDA+IGF0dG87CisgIHR5cGVkZWYgcmF0aW88MSwgICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMD4gZmVtdG87CisgIHR5cGVkZWYgcmF0aW88MSwgICAgICAgICAgICAgMTAwMDAwMDAwMDAwMD4gcGljbzsKKyAgdHlwZWRlZiByYXRpbzwxLCAgICAgICAgICAgICAgICAxMDAwMDAwMDAwPiBuYW5vOworICB0eXBlZGVmIHJhdGlvPDEsICAgICAgICAgICAgICAgICAgIDEwMDAwMDA+IG1pY3JvOworICB0eXBlZGVmIHJhdGlvPDEsICAgICAgICAgICAgICAgICAgICAgIDEwMDA+IG1pbGxpOworICB0eXBlZGVmIHJhdGlvPDEsICAgICAgICAgICAgICAgICAgICAgICAxMDA+IGNlbnRpOworICB0eXBlZGVmIHJhdGlvPDEsICAgICAgICAgICAgICAgICAgICAgICAgMTA+IGRlY2k7CisgIHR5cGVkZWYgcmF0aW88ICAgICAgICAgICAgICAgICAgICAgICAxMCwgMT4gZGVjYTsKKyAgdHlwZWRlZiByYXRpbzwgICAgICAgICAgICAgICAgICAgICAgMTAwLCAxPiBoZWN0bzsKKyAgdHlwZWRlZiByYXRpbzwgICAgICAgICAgICAgICAgICAgICAxMDAwLCAxPiBraWxvOworICB0eXBlZGVmIHJhdGlvPCAgICAgICAgICAgICAgICAgIDEwMDAwMDAsIDE+IG1lZ2E7CisgIHR5cGVkZWYgcmF0aW88ICAgICAgICAgICAgICAgMTAwMDAwMDAwMCwgMT4gZ2lnYTsKKyAgdHlwZWRlZiByYXRpbzwgICAgICAgICAgICAxMDAwMDAwMDAwMDAwLCAxPiB0ZXJhOworICB0eXBlZGVmIHJhdGlvPCAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAsIDE+IHBldGE7CisgIHR5cGVkZWYgcmF0aW88ICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMCwgMT4gZXhhOworCisgIC8vIEB9IGdyb3VwIHJhdGlvCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvL19HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMQorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vX0dMSUJDWFhfUkFUSU8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvcmVnZXggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3JlZ2V4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwN2Y1YmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3JlZ2V4CkBAIC0wLDAgKzEsNjYgQEAKKy8vIDxyZWdleD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvcmVnZXgKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUkVHRVgKKyNkZWZpbmUgX0dMSUJDWFhfUkVHRVggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjIGluY2x1ZGUgPGlvc2Z3ZD4KKyNlbmRpZgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGxvY2FsZT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RhY2s+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGJpdHMvcmFuZ2VfYWNjZXNzLmg+CisjaW5jbHVkZSA8Yml0cy9yZWdleF9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxiaXRzL3JlZ2V4X2Vycm9yLmg+CisjaW5jbHVkZSA8Yml0cy9yZWdleF9jdXJzb3IuaD4KKyNpbmNsdWRlIDxiaXRzL3JlZ2V4X25mYS5oPgorI2luY2x1ZGUgPGJpdHMvcmVnZXhfY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxiaXRzL3JlZ2V4X2dyZXBfbWF0Y2hlci5oPgorI2luY2x1ZGUgPGJpdHMvcmVnZXguaD4KKworI2VuZGlmIC8vIEMrKzExCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9SRUdFWApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9zY29wZWRfYWxsb2NhdG9yIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9zY29wZWRfYWxsb2NhdG9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYjE5MzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Njb3BlZF9hbGxvY2F0b3IKQEAgLTAsMCArMSw0NjMgQEAKKy8vIDxzY29wZWRfYWxsb2NhdG9yPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9zY29wZWRfYWxsb2NhdG9yCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9TQ09QRURfQUxMT0NBVE9SCisjZGVmaW5lIF9TQ09QRURfQUxMT0NBVE9SIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8Yml0cy9hbGxvY190cmFpdHMuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lPiBjbGFzcyBfUHJlZCwgdHlwZW5hbWUuLi4gX0FsbG9jcz4KKyAgICBzdHJ1Y3QgX19hbnlfb2Y7CisKKyAgdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzIF9QcmVkLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lLi4uIF9BbGxvY3M+CisgICAgc3RydWN0IF9fYW55X29mPF9QcmVkLCBfQWxsb2MsIF9BbGxvY3MuLi4+CisgICAgOiBfX29yXzxfUHJlZDxfQWxsb2M+LCBfX2FueV9vZjxfUHJlZCwgX0FsbG9jcy4uLj4+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lPiBjbGFzcyBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBfX2FueV9vZjxfUHJlZCwgX0FsbG9jPgorICAgIDogX1ByZWQ8X0FsbG9jPgorICAgIHsgfTsKKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgYWxsb2NhdG9ycworICAgKiBAeworICAgKi8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IF9fcHJvcGFnYXRlX29uX2NvcHkKKyAgICA6IGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPjo6cHJvcGFnYXRlX29uX2NvbnRhaW5lcl9jb3B5X2Fzc2lnbm1lbnQKKyAgICB7IH07CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX19wcm9wYWdhdGVfb25fbW92ZQorICAgIDogYWxsb2NhdG9yX3RyYWl0czxfQWxsb2M+Ojpwcm9wYWdhdGVfb25fY29udGFpbmVyX21vdmVfYXNzaWdubWVudAorICAgIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBfX3Byb3BhZ2F0ZV9vbl9zd2FwCisgICAgOiBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz46OnByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcAorICAgIHsgfTsKKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYXV0bworICAgIF9fZG9fb3V0ZXJtb3N0KF9BbGxvYyYgX19hLCBfQWxsb2MqKSAtPiBkZWNsdHlwZShfX2Eub3V0ZXJfYWxsb2NhdG9yKCkpCisgICAgeyByZXR1cm4gX19hLm91dGVyX2FsbG9jYXRvcigpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBfQWxsb2MmCisgICAgX19kb19vdXRlcm1vc3QoX0FsbG9jJiBfX2EsIC4uLikKKyAgICB7IHJldHVybiBfX2E7IH0KKworICAvLyBUT0RPOiBtYWtlIHJlY3Vyc2l2ZSAoc2VlIG5vdGUgaW4gMjAuMTIuNC8xKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGF1dG8KKyAgICBfX291dGVybW9zdChfQWxsb2MmIF9fYSkgLT4gZGVjbHR5cGUoX19kb19vdXRlcm1vc3QoX19hLCAmX19hKSkKKyAgICB7IHJldHVybiBfX2RvX291dGVybW9zdChfX2EsICZfX2EpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX091dGVyQWxsb2MsIHR5cGVuYW1lLi4uIF9Jbm5lckFsbG9jcz4KKyAgICBjbGFzcyBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3I7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4+IAorICAgIHN0cnVjdCBfX2lubmVyX3R5cGVfaW1wbDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0ZXI+CisgICAgc3RydWN0IF9faW5uZXJfdHlwZV9pbXBsPF9PdXRlcj4KKyAgICB7CisgICAgICB0eXBlZGVmIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjxfT3V0ZXI+IF9fdHlwZTsKKworICAgICAgX19pbm5lcl90eXBlX2ltcGwoKSA9IGRlZmF1bHQ7CisgICAgICBfX2lubmVyX3R5cGVfaW1wbChjb25zdCBfX2lubmVyX3R5cGVfaW1wbCYpID0gZGVmYXVsdDsKKyAgICAgIF9faW5uZXJfdHlwZV9pbXBsKF9faW5uZXJfdHlwZV9pbXBsJiYpID0gZGVmYXVsdDsKKyAgICAgIAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgICAgX19pbm5lcl90eXBlX2ltcGwoY29uc3QgX19pbm5lcl90eXBlX2ltcGw8X0FsbG9jPiYgX19vdGhlcikKKyAgICAgIHsgfQorICAgICAgCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgICBfX2lubmVyX3R5cGVfaW1wbChfX2lubmVyX3R5cGVfaW1wbDxfQWxsb2M+JiYgX19vdGhlcikKKyAgICAgIHsgfQorICAgICAgCisgICAgICBfX3R5cGUmIAorICAgICAgX01fZ2V0KF9fdHlwZSogX19wKSBub2V4Y2VwdCB7IHJldHVybiAqX19wOyB9CisKKyAgICAgIGNvbnN0IF9fdHlwZSYgCisgICAgICBfTV9nZXQoY29uc3QgX190eXBlKiBfX3ApIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuICpfX3A7IH0KKyAgICAgIAorICAgICAgdHVwbGU8PiAKKyAgICAgIF9NX3RpZSgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuIHR1cGxlPD4oKTsgfQorICAgICAgCisgICAgICBib29sIAorICAgICAgb3BlcmF0b3I9PShjb25zdCBfX2lubmVyX3R5cGVfaW1wbCYpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiB0cnVlOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0ZXIsIHR5cGVuYW1lIF9Jbm5lckhlYWQsIHR5cGVuYW1lLi4uIF9Jbm5lclRhaWw+CisgICAgc3RydWN0IF9faW5uZXJfdHlwZV9pbXBsPF9PdXRlciwgX0lubmVySGVhZCwgX0lubmVyVGFpbC4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjxfSW5uZXJIZWFkLCBfSW5uZXJUYWlsLi4uPiBfX3R5cGU7CisgICAgICAKKyAgICAgIF9faW5uZXJfdHlwZV9pbXBsKCkgPSBkZWZhdWx0OworICAgICAgX19pbm5lcl90eXBlX2ltcGwoY29uc3QgX19pbm5lcl90eXBlX2ltcGwmKSA9IGRlZmF1bHQ7CisgICAgICBfX2lubmVyX3R5cGVfaW1wbChfX2lubmVyX3R5cGVfaW1wbCYmKSA9IGRlZmF1bHQ7CisgICAgICAKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BbGxvY3M+CisgICAgICBfX2lubmVyX3R5cGVfaW1wbChjb25zdCBfX2lubmVyX3R5cGVfaW1wbDxfQWxsb2NzLi4uPiYgX19vdGhlcikKKyAgICAgIDogX01faW5uZXIoX19vdGhlci5fTV9pbm5lcikgeyB9CisgICAgICAKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BbGxvY3M+CisgICAgICBfX2lubmVyX3R5cGVfaW1wbChfX2lubmVyX3R5cGVfaW1wbDxfQWxsb2NzLi4uPiYmIF9fb3RoZXIpCisgICAgICA6IF9NX2lubmVyKHN0ZDo6bW92ZShfX290aGVyLl9NX2lubmVyKSkgeyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIGV4cGxpY2l0CisgICAgICBfX2lubmVyX3R5cGVfaW1wbChfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIDogX01faW5uZXIoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSB7IH0KKworICAgICAgX190eXBlJiAKKyAgICAgIF9NX2dldCh2b2lkKikgbm9leGNlcHQgeyByZXR1cm4gX01faW5uZXI7IH0KKyAgICAgIAorICAgICAgY29uc3QgX190eXBlJiAKKyAgICAgIF9NX2dldChjb25zdCB2b2lkKikgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gX01faW5uZXI7IH0KKyAgICAgIAorICAgICAgdHVwbGU8Y29uc3QgX0lubmVySGVhZCYsIGNvbnN0IF9Jbm5lclRhaWwmLi4uPiAKKyAgICAgIF9NX3RpZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9pbm5lci5fTV90aWUoKTsgfQorICAgICAgCisgICAgICBib29sIAorICAgICAgb3BlcmF0b3I9PShjb25zdCBfX2lubmVyX3R5cGVfaW1wbCYgX19vdGhlcikgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2lubmVyID09IF9fb3RoZXIuX01faW5uZXI7IH0KKyAgICAgIAorICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLj4gZnJpZW5kIGNsYXNzIF9faW5uZXJfdHlwZV9pbXBsOworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lLi4uPiBmcmllbmQgY2xhc3Mgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yOworICAgICAgCisgICAgICBfX3R5cGUgX01faW5uZXI7CisgICAgfTsKKworICAvLy8gUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX091dGVyQWxsb2MsIHR5cGVuYW1lLi4uIF9Jbm5lckFsbG9jcz4KKyAgICBjbGFzcyBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3IKKyAgICA6IHB1YmxpYyBfT3V0ZXJBbGxvYworICAgIHsKKyAgICAgIHR5cGVkZWYgYWxsb2NhdG9yX3RyYWl0czxfT3V0ZXJBbGxvYz4gX190cmFpdHM7CisKKyAgICAgIHR5cGVkZWYgX19pbm5lcl90eXBlX2ltcGw8X091dGVyQWxsb2MsIF9Jbm5lckFsbG9jcy4uLj4gX19pbm5lcl90eXBlOworICAgICAgX19pbm5lcl90eXBlIF9NX2lubmVyOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0ZXIsIHR5cGVuYW1lLi4uIF9Jbm5lcj4KKyAgICAgICAgZnJpZW5kIGNsYXNzIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4+CisgICAgICAgIGZyaWVuZCBjbGFzcyBfX2lubmVyX3R5cGVfaW1wbDsKKworICAgICAgdHVwbGU8Y29uc3QgX091dGVyQWxsb2MmLCBjb25zdCBfSW5uZXJBbGxvY3MmLi4uPgorICAgICAgX01fdGllKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6dHVwbGVfY2F0KHN0ZDo6dGllKG91dGVyX2FsbG9jYXRvcigpKSwgX01faW5uZXIuX01fdGllKCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKwl1c2luZyBfX291dGVybW9zdF90eXBlID0gdHlwZW5hbWUKKwkgIHN0ZDo6ZGVjYXk8ZGVjbHR5cGUoX19vdXRlcm1vc3Qoc3RkOjpkZWNsdmFsPF9BbGxvYyY+KCkpKT46OnR5cGU7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKwl1c2luZyBfX291dGVybW9zdF9hbGxvY190cmFpdHMKKwkgID0gYWxsb2NhdG9yX3RyYWl0czxfX291dGVybW9zdF90eXBlPF9BbGxvYz4+OworICAgICAgCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkIAorICAgICAgICBfTV9jb25zdHJ1Y3QoX191c2VzX2FsbG9jMCwgX1RwKiBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgICB7CisJICB0eXBlZGVmIF9fb3V0ZXJtb3N0X2FsbG9jX3RyYWl0czxzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3I+IF9PX3RyYWl0czsKKwkgIF9PX3RyYWl0czo6Y29uc3RydWN0KF9fb3V0ZXJtb3N0KCp0aGlzKSwgX19wLAorCQkJICAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgICAgIH0KKworICAgICAgdHlwZWRlZiBfX3VzZXNfYWxsb2MxPHR5cGVuYW1lIF9faW5uZXJfdHlwZTo6X190eXBlPiBfX3VzZXNfYWxsb2MxXzsKKyAgICAgIHR5cGVkZWYgX191c2VzX2FsbG9jMjx0eXBlbmFtZSBfX2lubmVyX3R5cGU6Ol9fdHlwZT4gX191c2VzX2FsbG9jMl87CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQgCisgICAgICAgIF9NX2NvbnN0cnVjdChfX3VzZXNfYWxsb2MxXywgX1RwKiBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgICB7CisJICB0eXBlZGVmIF9fb3V0ZXJtb3N0X2FsbG9jX3RyYWl0czxzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3I+IF9PX3RyYWl0czsKKwkgIF9PX3RyYWl0czo6Y29uc3RydWN0KF9fb3V0ZXJtb3N0KCp0aGlzKSwgX19wLAorCQkJICAgICAgIGFsbG9jYXRvcl9hcmcsIGlubmVyX2FsbG9jYXRvcigpLAorCQkJICAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZCAKKyAgICAgICAgX01fY29uc3RydWN0KF9fdXNlc19hbGxvYzJfLCBfVHAqIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICAgIHsKKwkgIHR5cGVkZWYgX19vdXRlcm1vc3RfYWxsb2NfdHJhaXRzPHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcj4gX09fdHJhaXRzOworCSAgX09fdHJhaXRzOjpjb25zdHJ1Y3QoX19vdXRlcm1vc3QoKnRoaXMpLCBfX3AsCisJCQkgICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uLAorCQkJICAgICAgIGlubmVyX2FsbG9jYXRvcigpKTsKKyAgICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgICAgIHN0YXRpYyBfQWxsb2MKKyAgICAgICAgX1Nfc2VsZWN0X29uX2NvcHkoY29uc3QgX0FsbG9jJiBfX2EpCisgICAgICAgIHsKKyAgICAgICAgICB0eXBlZGVmIGFsbG9jYXRvcl90cmFpdHM8X0FsbG9jPiBfX2FfdHJhaXRzOworICAgICAgICAgIHJldHVybiBfX2FfdHJhaXRzOjpzZWxlY3Rfb25fY29udGFpbmVyX2NvcHlfY29uc3RydWN0aW9uKF9fYSk7CisgICAgICAgIH0KKworICAgICAgdGVtcGxhdGU8c3RkOjpzaXplX3QuLi4gX0luZGljZXM+CisgICAgICAgIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcih0dXBsZTxjb25zdCBfT3V0ZXJBbGxvYyYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfSW5uZXJBbGxvY3MmLi4uPiBfX3JlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5kZXhfdHVwbGU8X0luZGljZXMuLi4+KQorICAgICAgICA6IF9PdXRlckFsbG9jKF9TX3NlbGVjdF9vbl9jb3B5KHN0ZDo6Z2V0PDA+KF9fcmVmcykpKSwKKyAgICAgICAgICBfTV9pbm5lcihfU19zZWxlY3Rfb25fY29weShzdGQ6OmdldDxfSW5kaWNlcysxPihfX3JlZnMpKS4uLikKKyAgICAgICAgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9PdXRlckFsbG9jICAgICAgICAgICAgICAgICAgICAgICBvdXRlcl9hbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pbm5lcl90eXBlOjpfX3R5cGUgICAgIGlubmVyX2FsbG9jYXRvcl90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzOjp2YWx1ZV90eXBlICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzOjpzaXplX3R5cGUgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHM6OmRpZmZlcmVuY2VfdHlwZSAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0czo6cG9pbnRlciAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0czo6Y29uc3RfcG9pbnRlciAgICAgICAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0czo6dm9pZF9wb2ludGVyICAgICAgICAgICB2b2lkX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzOjpjb25zdF92b2lkX3BvaW50ZXIgICAgIGNvbnN0X3ZvaWRfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDwKKyAgICAgICAgX19hbnlfb2Y8X19wcm9wYWdhdGVfb25fY29weSwgX091dGVyQWxsb2MsIF9Jbm5lckFsbG9jcy4uLj46OnZhbHVlLAorICAgICAgICB0cnVlX3R5cGUsIGZhbHNlX3R5cGU+Ojp0eXBlIHByb3BhZ2F0ZV9vbl9jb250YWluZXJfY29weV9hc3NpZ25tZW50OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDwKKyAgICAgICAgX19hbnlfb2Y8X19wcm9wYWdhdGVfb25fbW92ZSwgX091dGVyQWxsb2MsIF9Jbm5lckFsbG9jcy4uLj46OnZhbHVlLAorICAgICAgICB0cnVlX3R5cGUsIGZhbHNlX3R5cGU+Ojp0eXBlIHByb3BhZ2F0ZV9vbl9jb250YWluZXJfbW92ZV9hc3NpZ25tZW50OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDwKKyAgICAgICAgX19hbnlfb2Y8X19wcm9wYWdhdGVfb25fc3dhcCwgX091dGVyQWxsb2MsIF9Jbm5lckFsbG9jcy4uLj46OnZhbHVlLAorICAgICAgICB0cnVlX3R5cGUsIGZhbHNlX3R5cGU+Ojp0eXBlIHByb3BhZ2F0ZV9vbl9jb250YWluZXJfc3dhcDsKKworICAgICAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICAgICAgc3RydWN0IHJlYmluZAorICAgICAgICB7CisgICAgICAgICAgdHlwZWRlZiBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3I8CisgICAgICAgICAgICB0eXBlbmFtZSBfX3RyYWl0czo6dGVtcGxhdGUgcmViaW5kX2FsbG9jPF9UcD4sCisgICAgICAgICAgICBfSW5uZXJBbGxvY3MuLi4+IG90aGVyOworICAgICAgICB9OworCisgICAgICBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3IoKSA6IF9PdXRlckFsbG9jKCksIF9NX2lubmVyKCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRlcjI+CisgICAgICAgIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcihfT3V0ZXIyJiYgX19vdXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Jbm5lckFsbG9jcyYuLi4gX19pbm5lcikKKyAgICAgICAgOiBfT3V0ZXJBbGxvYyhzdGQ6OmZvcndhcmQ8X091dGVyMj4oX19vdXRlcikpLAorICAgICAgICAgIF9NX2lubmVyKF9faW5uZXIuLi4pCisgICAgICAgIHsgfQorCisgICAgICBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3IoY29uc3Qgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yJiBfX290aGVyKQorICAgICAgOiBfT3V0ZXJBbGxvYyhfX290aGVyLm91dGVyX2FsbG9jYXRvcigpKSwKKwlfTV9pbm5lcihfX290aGVyLl9NX2lubmVyKQorICAgICAgeyB9CisKKyAgICAgIHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcihzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3ImJiBfX290aGVyKQorICAgICAgOiBfT3V0ZXJBbGxvYyhzdGQ6Om1vdmUoX19vdGhlci5vdXRlcl9hbGxvY2F0b3IoKSkpLAorCV9NX2lubmVyKHN0ZDo6bW92ZShfX290aGVyLl9NX2lubmVyKSkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0ZXIyPgorICAgICAgICBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3IoCisgICAgICAgICAgICBjb25zdCBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3I8X091dGVyMiwgX0lubmVyQWxsb2NzLi4uPiYgX19vdGhlcikKKyAgICAgICAgOiBfT3V0ZXJBbGxvYyhfX290aGVyLm91dGVyX2FsbG9jYXRvcigpKSwKKyAgICAgICAgICBfTV9pbm5lcihfX290aGVyLl9NX2lubmVyKQorICAgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX091dGVyMj4KKyAgICAgICAgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yKAorICAgICAgICAgICAgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yPF9PdXRlcjIsIF9Jbm5lckFsbG9jcy4uLj4mJiBfX290aGVyKQorICAgICAgICA6IF9PdXRlckFsbG9jKHN0ZDo6bW92ZShfX290aGVyLm91dGVyX2FsbG9jYXRvcigpKSksCisgICAgICAgICAgX01faW5uZXIoc3RkOjptb3ZlKF9fb3RoZXIuX01faW5uZXIpKQorICAgICAgICB7IH0KKworICAgICAgaW5uZXJfYWxsb2NhdG9yX3R5cGUmIGlubmVyX2FsbG9jYXRvcigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9pbm5lci5fTV9nZXQodGhpcyk7IH0KKworICAgICAgY29uc3QgaW5uZXJfYWxsb2NhdG9yX3R5cGUmIGlubmVyX2FsbG9jYXRvcigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9pbm5lci5fTV9nZXQodGhpcyk7IH0KKworICAgICAgb3V0ZXJfYWxsb2NhdG9yX3R5cGUmIG91dGVyX2FsbG9jYXRvcigpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfT3V0ZXJBbGxvYyY+KCp0aGlzKTsgfQorCisgICAgICBjb25zdCBvdXRlcl9hbGxvY2F0b3JfdHlwZSYgb3V0ZXJfYWxsb2NhdG9yKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IF9PdXRlckFsbG9jJj4oKnRoaXMpOyB9CisKKyAgICAgIHBvaW50ZXIgYWxsb2NhdGUoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIF9fdHJhaXRzOjphbGxvY2F0ZShvdXRlcl9hbGxvY2F0b3IoKSwgX19uKTsgfQorCisgICAgICBwb2ludGVyIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIGNvbnN0X3ZvaWRfcG9pbnRlciBfX2hpbnQpCisgICAgICB7IHJldHVybiBfX3RyYWl0czo6YWxsb2NhdGUob3V0ZXJfYWxsb2NhdG9yKCksIF9fbiwgX19oaW50KTsgfQorCisgICAgICB2b2lkIGRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlwZSBfX24pCisgICAgICB7IHJldHVybiBfX3RyYWl0czo6ZGVhbGxvY2F0ZShvdXRlcl9hbGxvY2F0b3IoKSwgX19wLCBfX24pOyB9CisKKyAgICAgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3RyYWl0czo6bWF4X3NpemUob3V0ZXJfYWxsb2NhdG9yKCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQgY29uc3RydWN0KF9UcCogX19wLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgICAgeworICAgICAgICAgIGF1dG8mIF9faW5uZXIgPSBpbm5lcl9hbGxvY2F0b3IoKTsKKyAgICAgICAgICBhdXRvIF9fdXNlX3RhZworICAgICAgICAgICAgPSBfX3VzZV9hbGxvYzxfVHAsIGlubmVyX2FsbG9jYXRvcl90eXBlLCBfQXJncy4uLj4oX19pbm5lcik7CisgICAgICAgICAgX01fY29uc3RydWN0KF9fdXNlX3RhZywgX19wLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyLCB0eXBlbmFtZS4uLiBfQXJnczEsCisJICAgICAgIHR5cGVuYW1lLi4uIF9BcmdzMj4KKwl2b2lkCisJY29uc3RydWN0KHBhaXI8X1QxLCBfVDI+KiBfX3AsIHBpZWNld2lzZV9jb25zdHJ1Y3RfdCwKKwkJICB0dXBsZTxfQXJnczEuLi4+IF9feCwgdHVwbGU8X0FyZ3MyLi4uPiBfX3kpCisJeworCSAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgLy8gMjIwMy4gIHdyb25nIGFyZ3VtZW50IHR5cGVzIGZvciBwaWVjZXdpc2UgY29uc3RydWN0aW9uCisJICBhdXRvJiBfX2lubmVyID0gaW5uZXJfYWxsb2NhdG9yKCk7CisJICBhdXRvIF9feF91c2VfdGFnCisJICAgID0gX191c2VfYWxsb2M8X1QxLCBpbm5lcl9hbGxvY2F0b3JfdHlwZSwgX0FyZ3MxLi4uPihfX2lubmVyKTsKKwkgIGF1dG8gX195X3VzZV90YWcKKwkgICAgPSBfX3VzZV9hbGxvYzxfVDIsIGlubmVyX2FsbG9jYXRvcl90eXBlLCBfQXJnczIuLi4+KF9faW5uZXIpOworCSAgdHlwZWRlZiBfX291dGVybW9zdF9hbGxvY190cmFpdHM8c2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yPiBfT190cmFpdHM7CisJICBfT190cmFpdHM6OmNvbnN0cnVjdChfX291dGVybW9zdCgqdGhpcyksIF9fcCwgcGllY2V3aXNlX2NvbnN0cnVjdCwKKwkJCSAgICAgICBfTV9jb25zdHJ1Y3RfcChfX3hfdXNlX3RhZywgX194KSwKKwkJCSAgICAgICBfTV9jb25zdHJ1Y3RfcChfX3lfdXNlX3RhZywgX195KSk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKwl2b2lkCisJY29uc3RydWN0KHBhaXI8X1QxLCBfVDI+KiBfX3ApCisJeyBjb25zdHJ1Y3QoX19wLCBwaWVjZXdpc2VfY29uc3RydWN0LCB0dXBsZTw+KCksIHR1cGxlPD4oKSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDIsIHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUgX1ZwPgorCXZvaWQKKwljb25zdHJ1Y3QocGFpcjxfVDEsIF9UMj4qIF9fcCwgX1VwJiYgX191LCBfVnAmJiBfX3YpCisJeworCSAgY29uc3RydWN0KF9fcCwgcGllY2V3aXNlX2NvbnN0cnVjdCwKKwkJICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShzdGQ6OmZvcndhcmQ8X1VwPihfX3UpKSwKKwkJICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShzdGQ6OmZvcndhcmQ8X1ZwPihfX3YpKSk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMiwgdHlwZW5hbWUgX1VwLCB0eXBlbmFtZSBfVnA+CisJdm9pZAorCWNvbnN0cnVjdChwYWlyPF9UMSwgX1QyPiogX19wLCBjb25zdCBwYWlyPF9VcCwgX1ZwPiYgX194KQorCXsKKwkgIGNvbnN0cnVjdChfX3AsIHBpZWNld2lzZV9jb25zdHJ1Y3QsCisJCSAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoX194LmZpcnN0KSwKKwkJICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShfX3guc2Vjb25kKSk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMiwgdHlwZW5hbWUgX1VwLCB0eXBlbmFtZSBfVnA+CisJdm9pZAorCWNvbnN0cnVjdChwYWlyPF9UMSwgX1QyPiogX19wLCBwYWlyPF9VcCwgX1ZwPiYmIF9feCkKKwl7CisJICBjb25zdHJ1Y3QoX19wLCBwaWVjZXdpc2VfY29uc3RydWN0LAorCQkgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHN0ZDo6Zm9yd2FyZDxfVXA+KF9feC5maXJzdCkpLAorCQkgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHN0ZDo6Zm9yd2FyZDxfVnA+KF9feC5zZWNvbmQpKSk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIHZvaWQgZGVzdHJveShfVHAqIF9fcCkKKyAgICAgICAgeworCSAgdHlwZWRlZiBfX291dGVybW9zdF9hbGxvY190cmFpdHM8c2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yPiBfT190cmFpdHM7CisJICBfT190cmFpdHM6OmRlc3Ryb3koX19vdXRlcm1vc3QoKnRoaXMpLCBfX3ApOworCX0KKworICAgICAgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yCisgICAgICBzZWxlY3Rfb25fY29udGFpbmVyX2NvcHlfY29uc3RydWN0aW9uKCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQnVpbGRfaW5kZXhfdHVwbGU8c2l6ZW9mLi4uKF9Jbm5lckFsbG9jcyk+OjpfX3R5cGUKKwkgICAgX0luZGljZXM7CisgICAgICAgIHJldHVybiBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3IoX01fdGllKCksIF9JbmRpY2VzKCkpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX091dEExLCB0eXBlbmFtZSBfT3V0QTIsIHR5cGVuYW1lLi4uIF9JbkE+CisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3I8X091dEExLCBfSW5BLi4uPiYgX19hLAorICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3I8X091dEEyLCBfSW5BLi4uPiYgX19iKSBub2V4Y2VwdDsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHVwbGU+CisJX1R1cGxlJiYKKwlfTV9jb25zdHJ1Y3RfcChfX3VzZXNfYWxsb2MwLCBfVHVwbGUmIF9fdCkKKwl7IHJldHVybiBzdGQ6Om1vdmUoX190KTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlzdGQ6OnR1cGxlPGFsbG9jYXRvcl9hcmdfdCwgaW5uZXJfYWxsb2NhdG9yX3R5cGUmLCBfQXJncy4uLj4KKwlfTV9jb25zdHJ1Y3RfcChfX3VzZXNfYWxsb2MxXywgc3RkOjp0dXBsZTxfQXJncy4uLj4mIF9fdCkKKwl7CisJICB0eXBlZGVmIHN0ZDo6dHVwbGU8YWxsb2NhdG9yX2FyZ190LCBpbm5lcl9hbGxvY2F0b3JfdHlwZSY+IF9UdXBsZTsKKwkgIHJldHVybiBzdGQ6OnR1cGxlX2NhdChfVHVwbGUoYWxsb2NhdG9yX2FyZywgaW5uZXJfYWxsb2NhdG9yKCkpLAorCQkJCXN0ZDo6bW92ZShfX3QpKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXN0ZDo6dHVwbGU8X0FyZ3MuLi4sIGlubmVyX2FsbG9jYXRvcl90eXBlJj4KKwlfTV9jb25zdHJ1Y3RfcChfX3VzZXNfYWxsb2MyXywgc3RkOjp0dXBsZTxfQXJncy4uLj4mIF9fdCkKKwl7CisJICB0eXBlZGVmIHN0ZDo6dHVwbGU8aW5uZXJfYWxsb2NhdG9yX3R5cGUmPiBfVHVwbGU7CisJICByZXR1cm4gc3RkOjp0dXBsZV9jYXQoc3RkOjptb3ZlKF9fdCksIF9UdXBsZShpbm5lcl9hbGxvY2F0b3IoKSkpOworCX0KKyAgICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfT3V0QTEsIHR5cGVuYW1lIF9PdXRBMiwgdHlwZW5hbWUuLi4gX0luQT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc2NvcGVkX2FsbG9jYXRvcl9hZGFwdG9yPF9PdXRBMSwgX0luQS4uLj4mIF9fYSwKKyAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjxfT3V0QTIsIF9JbkEuLi4+JiBfX2IpIG5vZXhjZXB0CisgICAgeworICAgICAgcmV0dXJuIF9fYS5vdXRlcl9hbGxvY2F0b3IoKSA9PSBfX2Iub3V0ZXJfYWxsb2NhdG9yKCkKKyAgICAgICAgICAmJiBfX2EuX01faW5uZXIgPT0gX19iLl9NX2lubmVyOworICAgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX091dEExLCB0eXBlbmFtZSBfT3V0QTIsIHR5cGVuYW1lLi4uIF9JbkE+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHNjb3BlZF9hbGxvY2F0b3JfYWRhcHRvcjxfT3V0QTEsIF9JbkEuLi4+JiBfX2EsCisgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfYWxsb2NhdG9yX2FkYXB0b3I8X091dEEyLCBfSW5BLi4uPiYgX19iKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuICEoX19hID09IF9fYik7IH0KKworICAvLy8gQH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vIF9TQ09QRURfQUxMT0NBVE9SCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3NldCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80Ljgvc2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZTQ2NDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3NldApAQCAtMCwwICsxLDczIEBACisvLyA8c2V0PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgaW5jbHVkZS9zZXQKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfU0VUCisjZGVmaW5lIF9HTElCQ1hYX1NFVCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvc3RsX3RyZWUuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9zZXQuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9tdWx0aXNldC5oPgorI2luY2x1ZGUgPGJpdHMvcmFuZ2VfYWNjZXNzLmg+CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworIyBpbmNsdWRlIDxkZWJ1Zy9zZXQ+CisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1BST0ZJTEUKKyMgaW5jbHVkZSA8cHJvZmlsZS9zZXQ+CisjZW5kaWYKKworI2VuZGlmIC8qIF9HTElCQ1hYX1NFVCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9zc3RyZWFtIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9zc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMWZkNDQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3NzdHJlYW0KQEAgLTAsMCArMSw2MDIgQEAKKy8vIFN0cmluZyBiYXNlZCBzdHJlYW1zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL3NzdHJlYW0KKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy43ICBTdHJpbmctYmFzZWQgc3RyZWFtcworLy8KKworI2lmbmRlZiBfR0xJQkNYWF9TU1RSRUFNCisjZGVmaW5lIF9HTElCQ1hYX1NTVFJFQU0gMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxpc3RyZWFtPgorI2luY2x1ZGUgPG9zdHJlYW0+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBbMjcuNy4xXSB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19zdHJpbmdidWYKKyAgLyoqCisgICAqICBAYnJpZWYgIFRoZSBhY3R1YWwgd29yayBvZiBpbnB1dCBhbmQgb3V0cHV0IChmb3Igc3RkOjpzdHJpbmcpLgorICAgKiAgQGluZ3JvdXAgaW8KKyAgICoKKyAgICogIEB0cGFyYW0gX0NoYXJUICBUeXBlIG9mIGNoYXJhY3RlciBzdHJlYW0uCisgICAqICBAdHBhcmFtIF9UcmFpdHMgIFRyYWl0cyBmb3IgY2hhcmFjdGVyIHR5cGUsIGRlZmF1bHRzIHRvCisgICAqICAgICAgICAgICAgICAgICAgIGNoYXJfdHJhaXRzPF9DaGFyVD4uCisgICAqICBAdHBhcmFtIF9BbGxvYyAgQWxsb2NhdG9yIHR5cGUsIGRlZmF1bHRzIHRvIGFsbG9jYXRvcjxfQ2hhclQ+LgorICAgKgorICAgKiAgVGhpcyBjbGFzcyBhc3NvY2lhdGVzIGVpdGhlciBvciBib3RoIG9mIGl0cyBpbnB1dCBhbmQgb3V0cHV0IHNlcXVlbmNlcworICAgKiAgd2l0aCBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMsIHdoaWNoIGNhbiBiZSBpbml0aWFsaXplZCBmcm9tLCBvciBtYWRlCisgICAqICBhdmFpbGFibGUgYXMsIGEgQGMgc3RkOjpiYXNpY19zdHJpbmcuICAoUGFyYXBocmFzZWQgZnJvbSBbMjcuNy4xXS8xLikKKyAgICoKKyAgICogIEZvciB0aGlzIGNsYXNzLCBvcGVuIG1vZGVzIChvZiB0eXBlIEBjIGlvc19iYXNlOjpvcGVubW9kZSkgaGF2ZQorICAgKiAgQGMgaW4gc2V0IGlmIHRoZSBpbnB1dCBzZXF1ZW5jZSBjYW4gYmUgcmVhZCwgYW5kIEBjIG91dCBzZXQgaWYgdGhlCisgICAqICBvdXRwdXQgc2VxdWVuY2UgY2FuIGJlIHdyaXR0ZW4uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIGJhc2ljX3N0cmluZ2J1ZiA6IHB1YmxpYyBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIHR5cGVkZWYgX0NoYXJUIAkJCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfVHJhaXRzIAkJCQkJdHJhaXRzX3R5cGU7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyNTEuIGJhc2ljX3N0cmluZ2J1ZiBtaXNzaW5nIGFsbG9jYXRvcl90eXBlCisgICAgICB0eXBlZGVmIF9BbGxvYwkJCQkgICAgICAgCWFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlIAkJcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSAJCW9mZl90eXBlOworCisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiAgCV9fc3RyZWFtYnVmX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyX3R5cGUsIF9UcmFpdHMsIF9BbGxvYz4gCV9fc3RyaW5nX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fc3RyaW5nX3R5cGU6OnNpemVfdHlwZQkJX19zaXplX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLy8gUGxhY2UgdG8gc3Rhc2ggaW4gfHwgb3V0IHx8IGluIHwgb3V0IHNldHRpbmdzIGZvciBjdXJyZW50IHN0cmluZ2J1Zi4KKyAgICAgIGlvc19iYXNlOjpvcGVubW9kZSAJX01fbW9kZTsKKworICAgICAgLy8gRGF0YSBNZW1iZXJzOgorICAgICAgX19zdHJpbmdfdHlwZSAJCV9NX3N0cmluZzsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIENvbnN0cnVjdG9yczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3RhcnRzIHdpdGggYW4gZW1wdHkgc3RyaW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIF9fbW9kZSAgV2hldGhlciB0aGUgYnVmZmVyIGNhbiByZWFkLCBvciB3cml0ZSwgb3IgYm90aC4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXMgdGhlIHBhcmVudCBjbGFzcyB1c2luZyBpdHMKKyAgICAgICAqICBvd24gZGVmYXVsdCBjdG9yLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19zdHJpbmdidWYoaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpCisgICAgICA6IF9fc3RyZWFtYnVmX3R5cGUoKSwgX01fbW9kZShfX21vZGUpLCBfTV9zdHJpbmcoKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3RhcnRzIHdpdGggYW4gZXhpc3Rpbmcgc3RyaW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBBIHN0cmluZyB0byBjb3B5IGFzIGEgc3RhcnRpbmcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgX19tb2RlICBXaGV0aGVyIHRoZSBidWZmZXIgY2FuIHJlYWQsIG9yIHdyaXRlLCBvciBib3RoLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGluaXRpYWxpemVzIHRoZSBwYXJlbnQgY2xhc3MgdXNpbmcgaXRzCisgICAgICAgKiAgb3duIGRlZmF1bHQgY3Rvci4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgYmFzaWNfc3RyaW5nYnVmKGNvbnN0IF9fc3RyaW5nX3R5cGUmIF9fc3RyLAorCQkgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCkKKyAgICAgIDogX19zdHJlYW1idWZfdHlwZSgpLCBfTV9tb2RlKCksIF9NX3N0cmluZyhfX3N0ci5kYXRhKCksIF9fc3RyLnNpemUoKSkKKyAgICAgIHsgX01fc3RyaW5nYnVmX2luaXQoX19tb2RlKTsgfQorCisgICAgICAvLyBHZXQgYW5kIHNldDoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29weWluZyBvdXQgdGhlIHN0cmluZyBidWZmZXIuCisgICAgICAgKiAgQHJldHVybiAgQSBjb3B5IG9mIG9uZSBvZiB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZXMuCisgICAgICAgKgorICAgICAgICogIDxlbT5JZiB0aGUgYnVmZmVyIGlzIG9ubHkgY3JlYXRlZCBpbiBpbnB1dCBtb2RlLCB0aGUgdW5kZXJseWluZworICAgICAgICogIGNoYXJhY3RlciBzZXF1ZW5jZSBpcyBlcXVhbCB0byB0aGUgaW5wdXQgc2VxdWVuY2U7IG90aGVyd2lzZSwgaXQKKyAgICAgICAqICBpcyBlcXVhbCB0byB0aGUgb3V0cHV0IHNlcXVlbmNlLjwvZW0+IFsyNy43LjEuMl0vMQorICAgICAgKi8KKyAgICAgIF9fc3RyaW5nX3R5cGUKKyAgICAgIHN0cigpIGNvbnN0CisgICAgICB7CisJX19zdHJpbmdfdHlwZSBfX3JldDsKKwlpZiAodGhpcy0+cHB0cigpKQorCSAgeworCSAgICAvLyBUaGUgY3VycmVudCBlZ3B0cigpIG1heSBub3QgYmUgdGhlIGFjdHVhbCBzdHJpbmcgZW5kLgorCSAgICBpZiAodGhpcy0+cHB0cigpID4gdGhpcy0+ZWdwdHIoKSkKKwkgICAgICBfX3JldCA9IF9fc3RyaW5nX3R5cGUodGhpcy0+cGJhc2UoKSwgdGhpcy0+cHB0cigpKTsKKwkgICAgZWxzZQorIAkgICAgICBfX3JldCA9IF9fc3RyaW5nX3R5cGUodGhpcy0+cGJhc2UoKSwgdGhpcy0+ZWdwdHIoKSk7CisJICB9CisJZWxzZQorCSAgX19yZXQgPSBfTV9zdHJpbmc7CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldHRpbmcgYSBuZXcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgX19zICBUaGUgc3RyaW5nIHRvIHVzZSBhcyBhIG5ldyBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgRGVhbGxvY2F0ZXMgYW55IHByZXZpb3VzIHN0b3JlZCBzZXF1ZW5jZSwgdGhlbiBjb3BpZXMgQGEgcyB0bworICAgICAgICogIHVzZSBhcyBhIG5ldyBvbmUuCisgICAgICAqLworICAgICAgdm9pZAorICAgICAgc3RyKGNvbnN0IF9fc3RyaW5nX3R5cGUmIF9fcykKKyAgICAgIHsKKwkvLyBDYW5ub3QgdXNlIF9NX3N0cmluZyA9IF9fcywgc2luY2UgdjMgc3RyaW5ncyBhcmUgQ09XLgorCV9NX3N0cmluZy5hc3NpZ24oX19zLmRhdGEoKSwgX19zLnNpemUoKSk7CisJX01fc3RyaW5nYnVmX2luaXQoX01fbW9kZSk7CisgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLyBDb21tb24gaW5pdGlhbGl6YXRpb24gY29kZSBnb2VzIGhlcmUuCisgICAgICB2b2lkCisgICAgICBfTV9zdHJpbmdidWZfaW5pdChpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKQorICAgICAgeworCV9NX21vZGUgPSBfX21vZGU7CisJX19zaXplX3R5cGUgX19sZW4gPSAwOworCWlmIChfTV9tb2RlICYgKGlvc19iYXNlOjphdGUgfCBpb3NfYmFzZTo6YXBwKSkKKwkgIF9fbGVuID0gX01fc3RyaW5nLnNpemUoKTsKKwlfTV9zeW5jKGNvbnN0X2Nhc3Q8Y2hhcl90eXBlKj4oX01fc3RyaW5nLmRhdGEoKSksIDAsIF9fbGVuKTsKKyAgICAgIH0KKworICAgICAgdmlydHVhbCBzdHJlYW1zaXplCisgICAgICBzaG93bWFueWMoKQorICAgICAgeyAKKwlzdHJlYW1zaXplIF9fcmV0ID0gLTE7CisJaWYgKF9NX21vZGUgJiBpb3NfYmFzZTo6aW4pCisJICB7CisJICAgIF9NX3VwZGF0ZV9lZ3B0cigpOworCSAgICBfX3JldCA9IHRoaXMtPmVncHRyKCkgLSB0aGlzLT5ncHRyKCk7CisJICB9CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgICAgICB2aXJ0dWFsIGludF90eXBlCisgICAgICB1bmRlcmZsb3coKTsKKworICAgICAgdmlydHVhbCBpbnRfdHlwZQorICAgICAgcGJhY2tmYWlsKGludF90eXBlIF9fYyA9IHRyYWl0c190eXBlOjplb2YoKSk7CisKKyAgICAgIHZpcnR1YWwgaW50X3R5cGUKKyAgICAgIG92ZXJmbG93KGludF90eXBlIF9fYyA9IHRyYWl0c190eXBlOjplb2YoKSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTWFuaXB1bGF0ZXMgdGhlIGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgUG9pbnRlciB0byBhIGJ1ZmZlciBhcmVhLgorICAgICAgICogIEBwYXJhbSAgX19uICBTaXplIG9mIEBhIF9fcy4KKyAgICAgICAqICBAcmV0dXJuICBAYyB0aGlzCisgICAgICAgKgorICAgICAgICogIElmIG5vIGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIGFuZCBib3RoIEBhIF9fcyBhbmQgQGEgX19uIGFyZQorICAgICAgICogIG5vbi16ZXJvLCB0aGVuIEBjIF9fcyBpcyB1c2VkIGFzIGEgYnVmZmVyOyBzZWUKKyAgICAgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDExY2gyNXMwMi5odG1sCisgICAgICAgKiAgZm9yIG1vcmUuCisgICAgICAqLworICAgICAgdmlydHVhbCBfX3N0cmVhbWJ1Zl90eXBlKgorICAgICAgc2V0YnVmKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICAgIHsKKwlpZiAoX19zICYmIF9fbiA+PSAwKQorCSAgeworCSAgICAvLyBUaGlzIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQgYmVoYXZpb3IsIGFuZCBhc3N1bWVzCisJICAgIC8vIHRoYXQgYW4gZXh0ZXJuYWwgY2hhcl90eXBlIGFycmF5IG9mIGxlbmd0aCBfX24gZXhpc3RzCisJICAgIC8vIGFuZCBoYXMgYmVlbiBwcmUtYWxsb2NhdGVkLiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwKKwkgICAgLy8gdGhpbmdzIHdpbGwgcXVpY2tseSBibG93IHVwLgorCSAgICAKKwkgICAgLy8gU3RlcCAxOiBEZXN0cm95IHRoZSBjdXJyZW50IGludGVybmFsIGFycmF5LgorCSAgICBfTV9zdHJpbmcuY2xlYXIoKTsKKwkgICAgCisJICAgIC8vIFN0ZXAgMjogVXNlIHRoZSBleHRlcm5hbCBhcnJheS4KKwkgICAgX01fc3luYyhfX3MsIF9fbiwgMCk7CisJICB9CisJcmV0dXJuIHRoaXM7CisgICAgICB9CisKKyAgICAgIHZpcnR1YWwgcG9zX3R5cGUKKyAgICAgIHNlZWtvZmYob2ZmX3R5cGUgX19vZmYsIGlvc19iYXNlOjpzZWVrZGlyIF9fd2F5LAorCSAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKworICAgICAgdmlydHVhbCBwb3NfdHlwZQorICAgICAgc2Vla3Bvcyhwb3NfdHlwZSBfX3NwLAorCSAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKworICAgICAgLy8gSW50ZXJuYWwgZnVuY3Rpb24gZm9yIGNvcnJlY3RseSB1cGRhdGluZyB0aGUgaW50ZXJuYWwgYnVmZmVyCisgICAgICAvLyBmb3IgYSBwYXJ0aWN1bGFyIF9NX3N0cmluZywgZHVlIHRvIGluaXRpYWxpemF0aW9uIG9yIHJlLXNpemluZworICAgICAgLy8gb2YgYW4gZXhpc3RpbmcgX01fc3RyaW5nLgorICAgICAgdm9pZAorICAgICAgX01fc3luYyhjaGFyX3R5cGUqIF9fYmFzZSwgX19zaXplX3R5cGUgX19pLCBfX3NpemVfdHlwZSBfX28pOworCisgICAgICAvLyBJbnRlcm5hbCBmdW5jdGlvbiBmb3IgY29ycmVjdGx5IHVwZGF0aW5nIGVncHRyKCkgdG8gdGhlIGFjdHVhbAorICAgICAgLy8gc3RyaW5nIGVuZC4KKyAgICAgIHZvaWQKKyAgICAgIF9NX3VwZGF0ZV9lZ3B0cigpCisgICAgICB7CisJY29uc3QgYm9vbCBfX3Rlc3RpbiA9IF9NX21vZGUgJiBpb3NfYmFzZTo6aW47CisJaWYgKHRoaXMtPnBwdHIoKSAmJiB0aGlzLT5wcHRyKCkgPiB0aGlzLT5lZ3B0cigpKQorCSAgeworCSAgICBpZiAoX190ZXN0aW4pCisJICAgICAgdGhpcy0+c2V0Zyh0aGlzLT5lYmFjaygpLCB0aGlzLT5ncHRyKCksIHRoaXMtPnBwdHIoKSk7CisJICAgIGVsc2UKKwkgICAgICB0aGlzLT5zZXRnKHRoaXMtPnBwdHIoKSwgdGhpcy0+cHB0cigpLCB0aGlzLT5wcHRyKCkpOworCSAgfQorICAgICAgfQorCisgICAgICAvLyBXb3JrcyBhcm91bmQgdGhlIGlzc3VlIHdpdGggcGJ1bXAsIHBhcnQgb2YgdGhlIHByb3RlY3RlZAorICAgICAgLy8gaW50ZXJmYWNlIG9mIGJhc2ljX3N0cmVhbWJ1ZiwgdGFraW5nIGp1c3QgYW4gaW50LgorICAgICAgdm9pZAorICAgICAgX01fcGJ1bXAoY2hhcl90eXBlKiBfX3BiZWcsIGNoYXJfdHlwZSogX19wZW5kLCBvZmZfdHlwZSBfX29mZik7CisgICAgfTsKKworCisgIC8vIFsyNy43LjJdIFRlbXBsYXRlIGNsYXNzIGJhc2ljX2lzdHJpbmdzdHJlYW0KKyAgLyoqCisgICAqICBAYnJpZWYgIENvbnRyb2xsaW5nIGlucHV0IGZvciBzdGQ6OnN0cmluZy4KKyAgICogIEBpbmdyb3VwIGlvCisgICAqCisgICAqICBAdHBhcmFtIF9DaGFyVCAgVHlwZSBvZiBjaGFyYWN0ZXIgc3RyZWFtLgorICAgKiAgQHRwYXJhbSBfVHJhaXRzICBUcmFpdHMgZm9yIGNoYXJhY3RlciB0eXBlLCBkZWZhdWx0cyB0bworICAgKiAgICAgICAgICAgICAgICAgICBjaGFyX3RyYWl0czxfQ2hhclQ+LgorICAgKiAgQHRwYXJhbSBfQWxsb2MgIEFsbG9jYXRvciB0eXBlLCBkZWZhdWx0cyB0byBhbGxvY2F0b3I8X0NoYXJUPi4KKyAgICoKKyAgICogIFRoaXMgY2xhc3Mgc3VwcG9ydHMgcmVhZGluZyBmcm9tIG9iamVjdHMgb2YgdHlwZSBzdGQ6OmJhc2ljX3N0cmluZywKKyAgICogIHVzaW5nIHRoZSBpbmhlcml0ZWQgZnVuY3Rpb25zIGZyb20gc3RkOjpiYXNpY19pc3RyZWFtLiAgVG8gY29udHJvbAorICAgKiAgdGhlIGFzc29jaWF0ZWQgc2VxdWVuY2UsIGFuIGluc3RhbmNlIG9mIHN0ZDo6YmFzaWNfc3RyaW5nYnVmIGlzIHVzZWQsCisgICAqICB3aGljaCB0aGlzIHBhZ2UgcmVmZXJzIHRvIGFzIEBjIHNiLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBiYXNpY19pc3RyaW5nc3RyZWFtIDogcHVibGljIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIHR5cGVkZWYgX0NoYXJUIAkJCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfVHJhaXRzIAkJCQkJdHJhaXRzX3R5cGU7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyNTEuIGJhc2ljX3N0cmluZ2J1ZiBtaXNzaW5nIGFsbG9jYXRvcl90eXBlCisgICAgICB0eXBlZGVmIF9BbGxvYwkJCQkgICAgICAgCWFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlIAkJcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSAJCW9mZl90eXBlOworCisgICAgICAvLyBOb24tc3RhbmRhcmQgdHlwZXM6CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gCV9fc3RyaW5nX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gCV9fc3RyaW5nYnVmX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4JX19pc3RyZWFtX3R5cGU7CisKKyAgICBwcml2YXRlOgorICAgICAgX19zdHJpbmdidWZfdHlwZQlfTV9zdHJpbmdidWY7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBDb25zdHJ1Y3RvcnM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3Igc3RhcnRzIHdpdGggYW4gZW1wdHkgc3RyaW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIF9fbW9kZSAgV2hldGhlciB0aGUgYnVmZmVyIGNhbiByZWFkLCBvciB3cml0ZSwgb3IgYm90aC4KKyAgICAgICAqCisgICAgICAgKiAgQGMgaW9zX2Jhc2U6OmluIGlzIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgaW4gQGEgX19tb2RlLgorICAgICAgICoKKyAgICAgICAqICBJbml0aWFsaXplcyBAYyBzYiB1c2luZyBAYyBfX21vZGV8aW4sIGFuZCBwYXNzZXMgQGMgJnNiIHRvIHRoZSBiYXNlCisgICAgICAgKiAgY2xhc3MgaW5pdGlhbGl6ZXIuICBEb2VzIG5vdCBhbGxvY2F0ZSBhbnkgYnVmZmVyLgorICAgICAgICoKKyAgICAgICAqICBUaGF0J3MgYSBsaWUuICBXZSBpbml0aWFsaXplIHRoZSBiYXNlIGNsYXNzIHdpdGggTlVMTCwgYmVjYXVzZSB0aGUKKyAgICAgICAqICBzdHJpbmcgY2xhc3MgZG9lcyBpdHMgb3duIG1lbW9yeSBtYW5hZ2VtZW50LgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19pc3RyaW5nc3RyZWFtKGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4pCisgICAgICA6IF9faXN0cmVhbV90eXBlKCksIF9NX3N0cmluZ2J1ZihfX21vZGUgfCBpb3NfYmFzZTo6aW4pCisgICAgICB7IHRoaXMtPmluaXQoJl9NX3N0cmluZ2J1Zik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdGFydHMgd2l0aCBhbiBleGlzdGluZyBzdHJpbmcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgX19zdHIgIEEgc3RyaW5nIHRvIGNvcHkgYXMgYSBzdGFydGluZyBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICBfX21vZGUgIFdoZXRoZXIgdGhlIGJ1ZmZlciBjYW4gcmVhZCwgb3Igd3JpdGUsIG9yIGJvdGguCisgICAgICAgKgorICAgICAgICogIEBjIGlvc19iYXNlOjppbiBpcyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluIEBhIG1vZGUuCisgICAgICAgKgorICAgICAgICogIEluaXRpYWxpemVzIEBjIHNiIHVzaW5nIEBhIHN0ciBhbmQgQGMgbW9kZXxpbiwgYW5kIHBhc3NlcyBAYyAmc2IKKyAgICAgICAqICB0byB0aGUgYmFzZSBjbGFzcyBpbml0aWFsaXplci4KKyAgICAgICAqCisgICAgICAgKiAgVGhhdCdzIGEgbGllLiAgV2UgaW5pdGlhbGl6ZSB0aGUgYmFzZSBjbGFzcyB3aXRoIE5VTEwsIGJlY2F1c2UgdGhlCisgICAgICAgKiAgc3RyaW5nIGNsYXNzIGRvZXMgaXRzIG93biBtZW1vcnkgbWFuYWdlbWVudC4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgYmFzaWNfaXN0cmluZ3N0cmVhbShjb25zdCBfX3N0cmluZ190eXBlJiBfX3N0ciwKKwkJCSAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbikKKyAgICAgIDogX19pc3RyZWFtX3R5cGUoKSwgX01fc3RyaW5nYnVmKF9fc3RyLCBfX21vZGUgfCBpb3NfYmFzZTo6aW4pCisgICAgICB7IHRoaXMtPmluaXQoJl9NX3N0cmluZ2J1Zik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUaGUgZGVzdHJ1Y3RvciBkb2VzIG5vdGhpbmcuCisgICAgICAgKgorICAgICAgICogIFRoZSBidWZmZXIgaXMgZGVhbGxvY2F0ZWQgYnkgdGhlIHN0cmluZ2J1ZiBvYmplY3QsIG5vdCB0aGUKKyAgICAgICAqICBmb3JtYXR0aW5nIHN0cmVhbS4KKyAgICAgICovCisgICAgICB+YmFzaWNfaXN0cmluZ3N0cmVhbSgpCisgICAgICB7IH0KKworICAgICAgLy8gTWVtYmVyczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWNjZXNzaW5nIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY3VycmVudCBiYXNpY19zdHJpbmdidWYgYnVmZmVyLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGhpZGVzIGJvdGggc2lnbmF0dXJlcyBvZiBzdGQ6OmJhc2ljX2lvczo6cmRidWYoKS4KKyAgICAgICovCisgICAgICBfX3N0cmluZ2J1Zl90eXBlKgorICAgICAgcmRidWYoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfY2FzdDxfX3N0cmluZ2J1Zl90eXBlKj4oJl9NX3N0cmluZ2J1Zik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb3B5aW5nIG91dCB0aGUgc3RyaW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcmV0dXJuICBAYyByZGJ1ZigpLT5zdHIoKQorICAgICAgKi8KKyAgICAgIF9fc3RyaW5nX3R5cGUKKyAgICAgIHN0cigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9zdHJpbmdidWYuc3RyKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXR0aW5nIGEgbmV3IGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgVGhlIHN0cmluZyB0byB1c2UgYXMgYSBuZXcgc2VxdWVuY2UuCisgICAgICAgKgorICAgICAgICogIENhbGxzIEBjIHJkYnVmKCktPnN0cihzKS4KKyAgICAgICovCisgICAgICB2b2lkCisgICAgICBzdHIoY29uc3QgX19zdHJpbmdfdHlwZSYgX19zKQorICAgICAgeyBfTV9zdHJpbmdidWYuc3RyKF9fcyk7IH0KKyAgICB9OworCisKKyAgLy8gWzI3LjcuM10gVGVtcGxhdGUgY2xhc3MgYmFzaWNfb3N0cmluZ3N0cmVhbQorICAvKioKKyAgICogIEBicmllZiAgQ29udHJvbGxpbmcgb3V0cHV0IGZvciBzdGQ6OnN0cmluZy4KKyAgICogIEBpbmdyb3VwIGlvCisgICAqCisgICAqICBAdHBhcmFtIF9DaGFyVCAgVHlwZSBvZiBjaGFyYWN0ZXIgc3RyZWFtLgorICAgKiAgQHRwYXJhbSBfVHJhaXRzICBUcmFpdHMgZm9yIGNoYXJhY3RlciB0eXBlLCBkZWZhdWx0cyB0bworICAgKiAgICAgICAgICAgICAgICAgICBjaGFyX3RyYWl0czxfQ2hhclQ+LgorICAgKiAgQHRwYXJhbSBfQWxsb2MgIEFsbG9jYXRvciB0eXBlLCBkZWZhdWx0cyB0byBhbGxvY2F0b3I8X0NoYXJUPi4KKyAgICoKKyAgICogIFRoaXMgY2xhc3Mgc3VwcG9ydHMgd3JpdGluZyB0byBvYmplY3RzIG9mIHR5cGUgc3RkOjpiYXNpY19zdHJpbmcsCisgICAqICB1c2luZyB0aGUgaW5oZXJpdGVkIGZ1bmN0aW9ucyBmcm9tIHN0ZDo6YmFzaWNfb3N0cmVhbS4gIFRvIGNvbnRyb2wKKyAgICogIHRoZSBhc3NvY2lhdGVkIHNlcXVlbmNlLCBhbiBpbnN0YW5jZSBvZiBzdGQ6OmJhc2ljX3N0cmluZ2J1ZiBpcyB1c2VkLAorICAgKiAgd2hpY2ggdGhpcyBwYWdlIHJlZmVycyB0byBhcyBAYyBzYi4KKyAgKi8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIGJhc2ljX29zdHJpbmdzdHJlYW0gOiBwdWJsaWMgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiBfQ2hhclQgCQkJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcmFpdHMgCQkJCQl0cmFpdHNfdHlwZTsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDI1MS4gYmFzaWNfc3RyaW5nYnVmIG1pc3NpbmcgYWxsb2NhdG9yX3R5cGUKKyAgICAgIHR5cGVkZWYgX0FsbG9jCQkJCSAgICAgICAJYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSAJCWludF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6cG9zX3R5cGUgCQlwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om9mZl90eXBlIAkJb2ZmX3R5cGU7CisKKyAgICAgIC8vIE5vbi1zdGFuZGFyZCB0eXBlczoKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiAJX19zdHJpbmdfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiAJX19zdHJpbmdidWZfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPglfX29zdHJlYW1fdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICBfX3N0cmluZ2J1Zl90eXBlCV9NX3N0cmluZ2J1ZjsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZWZhdWx0IGNvbnN0cnVjdG9yIHN0YXJ0cyB3aXRoIGFuIGVtcHR5IHN0cmluZyBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICBfX21vZGUgIFdoZXRoZXIgdGhlIGJ1ZmZlciBjYW4gcmVhZCwgb3Igd3JpdGUsIG9yIGJvdGguCisgICAgICAgKgorICAgICAgICogIEBjIGlvc19iYXNlOjpvdXQgaXMgYXV0b21hdGljYWxseSBpbmNsdWRlZCBpbiBAYSBtb2RlLgorICAgICAgICoKKyAgICAgICAqICBJbml0aWFsaXplcyBAYyBzYiB1c2luZyBAYyBtb2RlfG91dCwgYW5kIHBhc3NlcyBAYyAmc2IgdG8gdGhlIGJhc2UKKyAgICAgICAqICBjbGFzcyBpbml0aWFsaXplci4gIERvZXMgbm90IGFsbG9jYXRlIGFueSBidWZmZXIuCisgICAgICAgKgorICAgICAgICogIFRoYXQncyBhIGxpZS4gIFdlIGluaXRpYWxpemUgdGhlIGJhc2UgY2xhc3Mgd2l0aCBOVUxMLCBiZWNhdXNlIHRoZQorICAgICAgICogIHN0cmluZyBjbGFzcyBkb2VzIGl0cyBvd24gbWVtb3J5IG1hbmFnZW1lbnQuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX29zdHJpbmdzdHJlYW0oaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjpvdXQpCisgICAgICA6IF9fb3N0cmVhbV90eXBlKCksIF9NX3N0cmluZ2J1ZihfX21vZGUgfCBpb3NfYmFzZTo6b3V0KQorICAgICAgeyB0aGlzLT5pbml0KCZfTV9zdHJpbmdidWYpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3RhcnRzIHdpdGggYW4gZXhpc3Rpbmcgc3RyaW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBBIHN0cmluZyB0byBjb3B5IGFzIGEgc3RhcnRpbmcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgX19tb2RlICBXaGV0aGVyIHRoZSBidWZmZXIgY2FuIHJlYWQsIG9yIHdyaXRlLCBvciBib3RoLgorICAgICAgICoKKyAgICAgICAqICBAYyBpb3NfYmFzZTo6b3V0IGlzIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgaW4gQGEgbW9kZS4KKyAgICAgICAqCisgICAgICAgKiAgSW5pdGlhbGl6ZXMgQGMgc2IgdXNpbmcgQGEgc3RyIGFuZCBAYyBtb2RlfG91dCwgYW5kIHBhc3NlcyBAYyAmc2IKKyAgICAgICAqICB0byB0aGUgYmFzZSBjbGFzcyBpbml0aWFsaXplci4KKyAgICAgICAqCisgICAgICAgKiAgVGhhdCdzIGEgbGllLiAgV2UgaW5pdGlhbGl6ZSB0aGUgYmFzZSBjbGFzcyB3aXRoIE5VTEwsIGJlY2F1c2UgdGhlCisgICAgICAgKiAgc3RyaW5nIGNsYXNzIGRvZXMgaXRzIG93biBtZW1vcnkgbWFuYWdlbWVudC4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgYmFzaWNfb3N0cmluZ3N0cmVhbShjb25zdCBfX3N0cmluZ190eXBlJiBfX3N0ciwKKwkJCSAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjpvdXQpCisgICAgICA6IF9fb3N0cmVhbV90eXBlKCksIF9NX3N0cmluZ2J1ZihfX3N0ciwgX19tb2RlIHwgaW9zX2Jhc2U6Om91dCkKKyAgICAgIHsgdGhpcy0+aW5pdCgmX01fc3RyaW5nYnVmKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRoZSBkZXN0cnVjdG9yIGRvZXMgbm90aGluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGJ1ZmZlciBpcyBkZWFsbG9jYXRlZCBieSB0aGUgc3RyaW5nYnVmIG9iamVjdCwgbm90IHRoZQorICAgICAgICogIGZvcm1hdHRpbmcgc3RyZWFtLgorICAgICAgKi8KKyAgICAgIH5iYXNpY19vc3RyaW5nc3RyZWFtKCkKKyAgICAgIHsgfQorCisgICAgICAvLyBNZW1iZXJzOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBY2Nlc3NpbmcgdGhlIHVuZGVybHlpbmcgYnVmZmVyLgorICAgICAgICogIEByZXR1cm4gIFRoZSBjdXJyZW50IGJhc2ljX3N0cmluZ2J1ZiBidWZmZXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaGlkZXMgYm90aCBzaWduYXR1cmVzIG9mIHN0ZDo6YmFzaWNfaW9zOjpyZGJ1ZigpLgorICAgICAgKi8KKyAgICAgIF9fc3RyaW5nYnVmX3R5cGUqCisgICAgICByZGJ1ZigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9jYXN0PF9fc3RyaW5nYnVmX3R5cGUqPigmX01fc3RyaW5nYnVmKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvcHlpbmcgb3V0IHRoZSBzdHJpbmcgYnVmZmVyLgorICAgICAgICogIEByZXR1cm4gIEBjIHJkYnVmKCktPnN0cigpCisgICAgICAqLworICAgICAgX19zdHJpbmdfdHlwZQorICAgICAgc3RyKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3N0cmluZ2J1Zi5zdHIoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldHRpbmcgYSBuZXcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgX19zICBUaGUgc3RyaW5nIHRvIHVzZSBhcyBhIG5ldyBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgQ2FsbHMgQGMgcmRidWYoKS0+c3RyKHMpLgorICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN0cihjb25zdCBfX3N0cmluZ190eXBlJiBfX3MpCisgICAgICB7IF9NX3N0cmluZ2J1Zi5zdHIoX19zKTsgfQorICAgIH07CisKKworICAvLyBbMjcuNy40XSBUZW1wbGF0ZSBjbGFzcyBiYXNpY19zdHJpbmdzdHJlYW0KKyAgLyoqCisgICAqICBAYnJpZWYgIENvbnRyb2xsaW5nIGlucHV0IGFuZCBvdXRwdXQgZm9yIHN0ZDo6c3RyaW5nLgorICAgKiAgQGluZ3JvdXAgaW8KKyAgICoKKyAgICogIEB0cGFyYW0gX0NoYXJUICBUeXBlIG9mIGNoYXJhY3RlciBzdHJlYW0uCisgICAqICBAdHBhcmFtIF9UcmFpdHMgIFRyYWl0cyBmb3IgY2hhcmFjdGVyIHR5cGUsIGRlZmF1bHRzIHRvCisgICAqICAgICAgICAgICAgICAgICAgIGNoYXJfdHJhaXRzPF9DaGFyVD4uCisgICAqICBAdHBhcmFtIF9BbGxvYyAgQWxsb2NhdG9yIHR5cGUsIGRlZmF1bHRzIHRvIGFsbG9jYXRvcjxfQ2hhclQ+LgorICAgKgorICAgKiAgVGhpcyBjbGFzcyBzdXBwb3J0cyByZWFkaW5nIGZyb20gYW5kIHdyaXRpbmcgdG8gb2JqZWN0cyBvZiB0eXBlCisgICAqICBzdGQ6OmJhc2ljX3N0cmluZywgdXNpbmcgdGhlIGluaGVyaXRlZCBmdW5jdGlvbnMgZnJvbQorICAgKiAgc3RkOjpiYXNpY19pb3N0cmVhbS4gIFRvIGNvbnRyb2wgdGhlIGFzc29jaWF0ZWQgc2VxdWVuY2UsIGFuIGluc3RhbmNlCisgICAqICBvZiBzdGQ6OmJhc2ljX3N0cmluZ2J1ZiBpcyB1c2VkLCB3aGljaCB0aGlzIHBhZ2UgcmVmZXJzIHRvIGFzIEBjIHNiLgorICAqLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgYmFzaWNfc3RyaW5nc3RyZWFtIDogcHVibGljIGJhc2ljX2lvc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICB0eXBlZGVmIF9DaGFyVCAJCQkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cyAJCQkJCXRyYWl0c190eXBlOworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjUxLiBiYXNpY19zdHJpbmdidWYgbWlzc2luZyBhbGxvY2F0b3JfdHlwZQorICAgICAgdHlwZWRlZiBfQWxsb2MJCQkJICAgICAgIAlhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlIAkJaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZSAJCXBvc190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6b2ZmX3R5cGUgCQlvZmZfdHlwZTsKKworICAgICAgLy8gTm9uLXN0YW5kYXJkIFR5cGVzOgorICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IAlfX3N0cmluZ190eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IAlfX3N0cmluZ2J1Zl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19pb3N0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPglfX2lvc3RyZWFtX3R5cGU7CisKKyAgICBwcml2YXRlOgorICAgICAgX19zdHJpbmdidWZfdHlwZQlfTV9zdHJpbmdidWY7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3RvciBzdGFydHMgd2l0aCBhbiBlbXB0eSBzdHJpbmcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgX19tICBXaGV0aGVyIHRoZSBidWZmZXIgY2FuIHJlYWQsIG9yIHdyaXRlLCBvciBib3RoLgorICAgICAgICoKKyAgICAgICAqICBJbml0aWFsaXplcyBAYyBzYiB1c2luZyB0aGUgbW9kZSBmcm9tIEBjIF9fbSwgYW5kIHBhc3NlcyBAYworICAgICAgICogICZzYiB0byB0aGUgYmFzZSBjbGFzcyBpbml0aWFsaXplci4gIERvZXMgbm90IGFsbG9jYXRlIGFueQorICAgICAgICogIGJ1ZmZlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhhdCdzIGEgbGllLiAgV2UgaW5pdGlhbGl6ZSB0aGUgYmFzZSBjbGFzcyB3aXRoIE5VTEwsIGJlY2F1c2UgdGhlCisgICAgICAgKiAgc3RyaW5nIGNsYXNzIGRvZXMgaXRzIG93biBtZW1vcnkgbWFuYWdlbWVudC4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgYmFzaWNfc3RyaW5nc3RyZWFtKGlvc19iYXNlOjpvcGVubW9kZSBfX20gPSBpb3NfYmFzZTo6b3V0IHwgaW9zX2Jhc2U6OmluKQorICAgICAgOiBfX2lvc3RyZWFtX3R5cGUoKSwgX01fc3RyaW5nYnVmKF9fbSkKKyAgICAgIHsgdGhpcy0+aW5pdCgmX01fc3RyaW5nYnVmKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN0YXJ0cyB3aXRoIGFuIGV4aXN0aW5nIHN0cmluZyBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICBfX3N0ciAgQSBzdHJpbmcgdG8gY29weSBhcyBhIHN0YXJ0aW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIF9fbSAgV2hldGhlciB0aGUgYnVmZmVyIGNhbiByZWFkLCBvciB3cml0ZSwgb3IgYm90aC4KKyAgICAgICAqCisgICAgICAgKiAgSW5pdGlhbGl6ZXMgQGMgc2IgdXNpbmcgQGEgX19zdHIgYW5kIEBjIF9fbSwgYW5kIHBhc3NlcyBAYyAmc2IKKyAgICAgICAqICB0byB0aGUgYmFzZSBjbGFzcyBpbml0aWFsaXplci4KKyAgICAgICAqCisgICAgICAgKiAgVGhhdCdzIGEgbGllLiAgV2UgaW5pdGlhbGl6ZSB0aGUgYmFzZSBjbGFzcyB3aXRoIE5VTEwsIGJlY2F1c2UgdGhlCisgICAgICAgKiAgc3RyaW5nIGNsYXNzIGRvZXMgaXRzIG93biBtZW1vcnkgbWFuYWdlbWVudC4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgYmFzaWNfc3RyaW5nc3RyZWFtKGNvbnN0IF9fc3RyaW5nX3R5cGUmIF9fc3RyLAorCQkJIGlvc19iYXNlOjpvcGVubW9kZSBfX20gPSBpb3NfYmFzZTo6b3V0IHwgaW9zX2Jhc2U6OmluKQorICAgICAgOiBfX2lvc3RyZWFtX3R5cGUoKSwgX01fc3RyaW5nYnVmKF9fc3RyLCBfX20pCisgICAgICB7IHRoaXMtPmluaXQoJl9NX3N0cmluZ2J1Zik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUaGUgZGVzdHJ1Y3RvciBkb2VzIG5vdGhpbmcuCisgICAgICAgKgorICAgICAgICogIFRoZSBidWZmZXIgaXMgZGVhbGxvY2F0ZWQgYnkgdGhlIHN0cmluZ2J1ZiBvYmplY3QsIG5vdCB0aGUKKyAgICAgICAqICBmb3JtYXR0aW5nIHN0cmVhbS4KKyAgICAgICovCisgICAgICB+YmFzaWNfc3RyaW5nc3RyZWFtKCkKKyAgICAgIHsgfQorCisgICAgICAvLyBNZW1iZXJzOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBY2Nlc3NpbmcgdGhlIHVuZGVybHlpbmcgYnVmZmVyLgorICAgICAgICogIEByZXR1cm4gIFRoZSBjdXJyZW50IGJhc2ljX3N0cmluZ2J1ZiBidWZmZXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaGlkZXMgYm90aCBzaWduYXR1cmVzIG9mIHN0ZDo6YmFzaWNfaW9zOjpyZGJ1ZigpLgorICAgICAgKi8KKyAgICAgIF9fc3RyaW5nYnVmX3R5cGUqCisgICAgICByZGJ1ZigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9jYXN0PF9fc3RyaW5nYnVmX3R5cGUqPigmX01fc3RyaW5nYnVmKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvcHlpbmcgb3V0IHRoZSBzdHJpbmcgYnVmZmVyLgorICAgICAgICogIEByZXR1cm4gIEBjIHJkYnVmKCktPnN0cigpCisgICAgICAqLworICAgICAgX19zdHJpbmdfdHlwZQorICAgICAgc3RyKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3N0cmluZ2J1Zi5zdHIoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldHRpbmcgYSBuZXcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgX19zICBUaGUgc3RyaW5nIHRvIHVzZSBhcyBhIG5ldyBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgQ2FsbHMgQGMgcmRidWYoKS0+c3RyKHMpLgorICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN0cihjb25zdCBfX3N0cmluZ190eXBlJiBfX3MpCisgICAgICB7IF9NX3N0cmluZ2J1Zi5zdHIoX19zKTsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2luY2x1ZGUgPGJpdHMvc3N0cmVhbS50Y2M+CisKKyNlbmRpZiAvKiBfR0xJQkNYWF9TU1RSRUFNICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3N0YWNrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9zdGFjawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTI4MmUxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9zdGFjawpAQCAtMCwwICsxLDYzIEBACisvLyA8c3RhY2s+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBpbmNsdWRlL3N0YWNrCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1NUQUNLCisjZGVmaW5lIF9HTElCQ1hYX1NUQUNLIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8Yml0cy9zdGxfc3RhY2suaD4KKworI2VuZGlmIC8qIF9HTElCQ1hYX1NUQUNLICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3N0ZGV4Y2VwdCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80Ljgvc3RkZXhjZXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NzFkZDcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3N0ZGV4Y2VwdApAQCAtMCwwICsxLDE1OCBAQAorLy8gU3RhbmRhcmQgZXhjZXB0aW9uIGNsYXNzZXMgIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL3N0ZGV4Y2VwdAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTkuMSAgRXhjZXB0aW9uIGNsYXNzZXMKKy8vCisKKyNpZm5kZWYgX0dMSUJDWFhfU1RERVhDRVBUCisjZGVmaW5lIF9HTElCQ1hYX1NUREVYQ0VQVCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgZXhjZXB0aW9ucworICAgKiBAeworICAgKi8KKworICAvKiogTG9naWMgZXJyb3JzIHJlcHJlc2VudCBwcm9ibGVtcyBpbiB0aGUgaW50ZXJuYWwgbG9naWMgb2YgYSBwcm9ncmFtOworICAgKiAgaW4gdGhlb3J5LCB0aGVzZSBhcmUgcHJldmVudGFibGUsIGFuZCBldmVuIGRldGVjdGFibGUgYmVmb3JlIHRoZQorICAgKiAgcHJvZ3JhbSBydW5zIChlLmcuLCB2aW9sYXRpb25zIG9mIGNsYXNzIGludmFyaWFudHMpLgorICAgKiAgQGJyaWVmIE9uZSBvZiB0d28gc3ViY2xhc3NlcyBvZiBleGNlcHRpb24uCisgICAqLworICBjbGFzcyBsb2dpY19lcnJvciA6IHB1YmxpYyBleGNlcHRpb24gCisgIHsKKyAgICBzdHJpbmcgX01fbXNnOworCisgIHB1YmxpYzoKKyAgICAvKiogVGFrZXMgYSBjaGFyYWN0ZXIgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGVycm9yLiAgKi8KKyAgICBleHBsaWNpdCAKKyAgICBsb2dpY19lcnJvcihjb25zdCBzdHJpbmcmIF9fYXJnKTsKKworICAgIHZpcnR1YWwgfmxvZ2ljX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworCisgICAgLyoqIFJldHVybnMgYSBDLXN0eWxlIGNoYXJhY3RlciBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZ2VuZXJhbCBjYXVzZSBvZgorICAgICAqICB0aGUgY3VycmVudCBlcnJvciAodGhlIHNhbWUgc3RyaW5nIHBhc3NlZCB0byB0aGUgY3RvcikuICAqLworICAgIHZpcnR1YWwgY29uc3QgY2hhciogCisgICAgd2hhdCgpIGNvbnN0IF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKyAgfTsKKworICAvKiogVGhyb3duIGJ5IHRoZSBsaWJyYXJ5LCBvciBieSB5b3UsIHRvIHJlcG9ydCBkb21haW4gZXJyb3JzIChkb21haW4gaW4KKyAgICogIHRoZSBtYXRoZW1hdGljYWwgc2Vuc2UpLiAgKi8KKyAgY2xhc3MgZG9tYWluX2Vycm9yIDogcHVibGljIGxvZ2ljX2Vycm9yIAorICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBkb21haW5fZXJyb3IoY29uc3Qgc3RyaW5nJiBfX2FyZyk7CisgICAgdmlydHVhbCB+ZG9tYWluX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworICB9OworCisgIC8qKiBUaHJvd24gdG8gcmVwb3J0IGludmFsaWQgYXJndW1lbnRzIHRvIGZ1bmN0aW9ucy4gICovCisgIGNsYXNzIGludmFsaWRfYXJndW1lbnQgOiBwdWJsaWMgbG9naWNfZXJyb3IgCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IGludmFsaWRfYXJndW1lbnQoY29uc3Qgc3RyaW5nJiBfX2FyZyk7CisgICAgdmlydHVhbCB+aW52YWxpZF9hcmd1bWVudCgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKyAgfTsKKworICAvKiogVGhyb3duIHdoZW4gYW4gb2JqZWN0IGlzIGNvbnN0cnVjdGVkIHRoYXQgd291bGQgZXhjZWVkIGl0cyBtYXhpbXVtCisgICAqICBwZXJtaXR0ZWQgc2l6ZSAoZS5nLiwgYSBiYXNpY19zdHJpbmcgaW5zdGFuY2UpLiAgKi8KKyAgY2xhc3MgbGVuZ3RoX2Vycm9yIDogcHVibGljIGxvZ2ljX2Vycm9yIAorICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBsZW5ndGhfZXJyb3IoY29uc3Qgc3RyaW5nJiBfX2FyZyk7CisgICAgdmlydHVhbCB+bGVuZ3RoX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworICB9OworCisgIC8qKiBUaGlzIHJlcHJlc2VudHMgYW4gYXJndW1lbnQgd2hvc2UgdmFsdWUgaXMgbm90IHdpdGhpbiB0aGUgZXhwZWN0ZWQKKyAgICogIHJhbmdlIChlLmcuLCBib3VuZGFyeSBjaGVja3MgaW4gYmFzaWNfc3RyaW5nKS4gICovCisgIGNsYXNzIG91dF9vZl9yYW5nZSA6IHB1YmxpYyBsb2dpY19lcnJvciAKKyAgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgb3V0X29mX3JhbmdlKGNvbnN0IHN0cmluZyYgX19hcmcpOworICAgIHZpcnR1YWwgfm91dF9vZl9yYW5nZSgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKyAgfTsKKworICAvKiogUnVudGltZSBlcnJvcnMgcmVwcmVzZW50IHByb2JsZW1zIG91dHNpZGUgdGhlIHNjb3BlIG9mIGEgcHJvZ3JhbTsKKyAgICogIHRoZXkgY2Fubm90IGJlIGVhc2lseSBwcmVkaWN0ZWQgYW5kIGNhbiBnZW5lcmFsbHkgb25seSBiZSBjYXVnaHQgYXMKKyAgICogIHRoZSBwcm9ncmFtIGV4ZWN1dGVzLgorICAgKiAgQGJyaWVmIE9uZSBvZiB0d28gc3ViY2xhc3NlcyBvZiBleGNlcHRpb24uCisgICAqLworICBjbGFzcyBydW50aW1lX2Vycm9yIDogcHVibGljIGV4Y2VwdGlvbiAKKyAgeworICAgIHN0cmluZyBfTV9tc2c7CisKKyAgcHVibGljOgorICAgIC8qKiBUYWtlcyBhIGNoYXJhY3RlciBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IuICAqLworICAgIGV4cGxpY2l0IAorICAgIHJ1bnRpbWVfZXJyb3IoY29uc3Qgc3RyaW5nJiBfX2FyZyk7CisKKyAgICB2aXJ0dWFsIH5ydW50aW1lX2Vycm9yKCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworCisgICAgLyoqIFJldHVybnMgYSBDLXN0eWxlIGNoYXJhY3RlciBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZ2VuZXJhbCBjYXVzZSBvZgorICAgICAqICB0aGUgY3VycmVudCBlcnJvciAodGhlIHNhbWUgc3RyaW5nIHBhc3NlZCB0byB0aGUgY3RvcikuICAqLworICAgIHZpcnR1YWwgY29uc3QgY2hhciogCisgICAgd2hhdCgpIGNvbnN0IF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKyAgfTsKKworICAvKiogVGhyb3duIHRvIGluZGljYXRlIHJhbmdlIGVycm9ycyBpbiBpbnRlcm5hbCBjb21wdXRhdGlvbnMuICAqLworICBjbGFzcyByYW5nZV9lcnJvciA6IHB1YmxpYyBydW50aW1lX2Vycm9yIAorICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCByYW5nZV9lcnJvcihjb25zdCBzdHJpbmcmIF9fYXJnKTsKKyAgICB2aXJ0dWFsIH5yYW5nZV9lcnJvcigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKyAgfTsKKworICAvKiogVGhyb3duIHRvIGluZGljYXRlIGFyaXRobWV0aWMgb3ZlcmZsb3cuICAqLworICBjbGFzcyBvdmVyZmxvd19lcnJvciA6IHB1YmxpYyBydW50aW1lX2Vycm9yIAorICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBvdmVyZmxvd19lcnJvcihjb25zdCBzdHJpbmcmIF9fYXJnKTsKKyAgICB2aXJ0dWFsIH5vdmVyZmxvd19lcnJvcigpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKyAgfTsKKworICAvKiogVGhyb3duIHRvIGluZGljYXRlIGFyaXRobWV0aWMgdW5kZXJmbG93LiAgKi8KKyAgY2xhc3MgdW5kZXJmbG93X2Vycm9yIDogcHVibGljIHJ1bnRpbWVfZXJyb3IgCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IHVuZGVyZmxvd19lcnJvcihjb25zdCBzdHJpbmcmIF9fYXJnKTsKKyAgICB2aXJ0dWFsIH51bmRlcmZsb3dfZXJyb3IoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisgIH07CisKKyAgLy8gQH0gZ3JvdXAgZXhjZXB0aW9ucworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9TVERFWENFUFQgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80Ljgvc3RyZWFtYnVmIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9zdHJlYW1idWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZhMzg3MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80Ljgvc3RyZWFtYnVmCkBAIC0wLDAgKzEsODMwIEBACisvLyBTdHJlYW0gYnVmZmVyIGNsYXNzZXMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvc3RyZWFtYnVmCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjcuNSAgU3RyZWFtIGJ1ZmZlcnMKKy8vCisKKyNpZm5kZWYgX0dMSUJYWF9TVFJFQU1CVUYKKyNkZWZpbmUgX0dMSUJYWF9TVFJFQU1CVUYgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxiaXRzL2xvY2FsZWZ3ZC5oPgorI2luY2x1ZGUgPGJpdHMvaW9zX2Jhc2UuaD4KKyNpbmNsdWRlIDxiaXRzL2NwcF90eXBlX3RyYWl0cy5oPgorI2luY2x1ZGUgPGV4dC90eXBlX3RyYWl0cy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0cmVhbXNpemUKKyAgICBfX2NvcHlfc3RyZWFtYnVmc19lb2YoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qLAorCQkJICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiosIGJvb2wmKTsKKworICAvKioKKyAgICogIEBicmllZiAgVGhlIGFjdHVhbCB3b3JrIG9mIGlucHV0IGFuZCBvdXRwdXQgKGludGVyZmFjZSkuCisgICAqICBAaW5ncm91cCBpbworICAgKgorICAgKiAgQHRwYXJhbSBfQ2hhclQgIFR5cGUgb2YgY2hhcmFjdGVyIHN0cmVhbS4KKyAgICogIEB0cGFyYW0gX1RyYWl0cyAgVHJhaXRzIGZvciBjaGFyYWN0ZXIgdHlwZSwgZGVmYXVsdHMgdG8KKyAgICogICAgICAgICAgICAgICAgICAgY2hhcl90cmFpdHM8X0NoYXJUPi4KKyAgICoKKyAgICogIFRoaXMgaXMgYSBiYXNlIGNsYXNzLiAgRGVyaXZlZCBzdHJlYW0gYnVmZmVycyBlYWNoIGNvbnRyb2wgYQorICAgKiAgcGFpciBvZiBjaGFyYWN0ZXIgc2VxdWVuY2VzOiAgb25lIGZvciBpbnB1dCwgYW5kIG9uZSBmb3Igb3V0cHV0LgorICAgKgorICAgKiAgU2VjdGlvbiBbMjcuNS4xXSBvZiB0aGUgc3RhbmRhcmQgZGVzY3JpYmVzIHRoZSByZXF1aXJlbWVudHMgYW5kCisgICAqICBiZWhhdmlvciBvZiBzdHJlYW0gYnVmZmVyIGNsYXNzZXMuICBUaGF0IHNlY3Rpb24gKHRocmVlIHBhcmFncmFwaHMpCisgICAqICBpcyByZXByb2R1Y2VkIGhlcmUsIGZvciBzaW1wbGljaXR5IGFuZCBhY2N1cmFjeS4KKyAgICoKKyAgICogIC0jIFN0cmVhbSBidWZmZXJzIGNhbiBpbXBvc2UgdmFyaW91cyBjb25zdHJhaW50cyBvbiB0aGUgc2VxdWVuY2VzCisgICAqICAgICB0aGV5IGNvbnRyb2wuICBTb21lIGNvbnN0cmFpbnRzIGFyZToKKyAgICogICAgIC0gVGhlIGNvbnRyb2xsZWQgaW5wdXQgc2VxdWVuY2UgY2FuIGJlIG5vdCByZWFkYWJsZS4KKyAgICogICAgIC0gVGhlIGNvbnRyb2xsZWQgb3V0cHV0IHNlcXVlbmNlIGNhbiBiZSBub3Qgd3JpdGFibGUuCisgICAqICAgICAtIFRoZSBjb250cm9sbGVkIHNlcXVlbmNlcyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZW50cyBvZgorICAgKiAgICAgICBvdGhlciByZXByZXNlbnRhdGlvbnMgZm9yIGNoYXJhY3RlciBzZXF1ZW5jZXMsIHN1Y2ggYXMgZXh0ZXJuYWwKKyAgICogICAgICAgZmlsZXMuCisgICAqICAgICAtIFRoZSBjb250cm9sbGVkIHNlcXVlbmNlcyBjYW4gc3VwcG9ydCBvcGVyYXRpb25zIEBlIGRpcmVjdGx5IHRvIG9yCisgICAqICAgICAgIGZyb20gYXNzb2NpYXRlZCBzZXF1ZW5jZXMuCisgICAqICAgICAtIFRoZSBjb250cm9sbGVkIHNlcXVlbmNlcyBjYW4gaW1wb3NlIGxpbWl0YXRpb25zIG9uIGhvdyB0aGUKKyAgICogICAgICAgcHJvZ3JhbSBjYW4gcmVhZCBjaGFyYWN0ZXJzIGZyb20gYSBzZXF1ZW5jZSwgd3JpdGUgY2hhcmFjdGVycyB0bworICAgKiAgICAgICBhIHNlcXVlbmNlLCBwdXQgY2hhcmFjdGVycyBiYWNrIGludG8gYW4gaW5wdXQgc2VxdWVuY2UsIG9yIGFsdGVyCisgICAqICAgICAgIHRoZSBzdHJlYW0gcG9zaXRpb24uCisgICAqICAgICAuCisgICAqICAtIyBFYWNoIHNlcXVlbmNlIGlzIGNoYXJhY3Rlcml6ZWQgYnkgdGhyZWUgcG9pbnRlcnMgd2hpY2gsIGlmIG5vbi1udWxsLAorICAgKiAgICAgYWxsIHBvaW50IGludG8gdGhlIHNhbWUgQGMgY2hhclQgYXJyYXkgb2JqZWN0LiAgVGhlIGFycmF5IG9iamVjdAorICAgKiAgICAgcmVwcmVzZW50cywgYXQgYW55IG1vbWVudCwgYSAoc3ViKXNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUKKyAgICogICAgIHNlcXVlbmNlLiAgT3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gYSBzZXF1ZW5jZSBhbHRlciB0aGUgdmFsdWVzCisgICAqICAgICBzdG9yZWQgaW4gdGhlc2UgcG9pbnRlcnMsIHBlcmZvcm0gcmVhZHMgYW5kIHdyaXRlcyBkaXJlY3RseSB0byBvcgorICAgKiAgICAgZnJvbSBhc3NvY2lhdGVkIHNlcXVlbmNlcywgYW5kIGFsdGVyIDxlbT50aGUgc3RyZWFtIHBvc2l0aW9uPC9lbT4gYW5kCisgICAqICAgICBjb252ZXJzaW9uIHN0YXRlIGFzIG5lZWRlZCB0byBtYWludGFpbiB0aGlzIHN1YnNlcXVlbmNlIHJlbGF0aW9uc2hpcC4KKyAgICogICAgIFRoZSB0aHJlZSBwb2ludGVycyBhcmU6CisgICAqICAgICAtIHRoZSA8ZW0+YmVnaW5uaW5nIHBvaW50ZXI8L2VtPiwgb3IgbG93ZXN0IGVsZW1lbnQgYWRkcmVzcyBpbiB0aGUKKyAgICogICAgICAgYXJyYXkgKGNhbGxlZCBAZSB4YmVnIGhlcmUpOworICAgKiAgICAgLSB0aGUgPGVtPm5leHQgcG9pbnRlcjwvZW0+LCBvciBuZXh0IGVsZW1lbnQgYWRkcmVzcyB0aGF0IGlzIGEKKyAgICogICAgICAgY3VycmVudCBjYW5kaWRhdGUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZyAoY2FsbGVkIEBlIHhuZXh0IGhlcmUpOworICAgKiAgICAgLSB0aGUgPGVtPmVuZCBwb2ludGVyPC9lbT4sIG9yIGZpcnN0IGVsZW1lbnQgYWRkcmVzcyBiZXlvbmQgdGhlCisgICAqICAgICAgIGVuZCBvZiB0aGUgYXJyYXkgKGNhbGxlZCBAZSB4ZW5kIGhlcmUpLgorICAgKiAgICAgLgorICAgKiAgLSMgVGhlIGZvbGxvd2luZyBzZW1hbnRpYyBjb25zdHJhaW50cyBzaGFsbCBhbHdheXMgYXBwbHkgZm9yIGFueSBzZXQKKyAgICogICAgIG9mIHRocmVlIHBvaW50ZXJzIGZvciBhIHNlcXVlbmNlLCB1c2luZyB0aGUgcG9pbnRlciBuYW1lcyBnaXZlbgorICAgKiAgICAgaW1tZWRpYXRlbHkgYWJvdmU6CisgICAqICAgICAtIElmIEBlIHhuZXh0IGlzIG5vdCBhIG51bGwgcG9pbnRlciwgdGhlbiBAZSB4YmVnIGFuZCBAZSB4ZW5kIHNoYWxsCisgICAqICAgICAgIGFsc28gYmUgbm9uLW51bGwgcG9pbnRlcnMgaW50byB0aGUgc2FtZSBAYyBjaGFyVCBhcnJheSwgYXMKKyAgICogICAgICAgZGVzY3JpYmVkIGFib3ZlOyBvdGhlcndpc2UsIEBlIHhiZWcgYW5kIEBlIHhlbmQgc2hhbGwgYWxzbyBiZSBudWxsLgorICAgKiAgICAgLSBJZiBAZSB4bmV4dCBpcyBub3QgYSBudWxsIHBvaW50ZXIgYW5kIEBlIHhuZXh0IDwgQGUgeGVuZCBmb3IgYW4KKyAgICogICAgICAgb3V0cHV0IHNlcXVlbmNlLCB0aGVuIGEgPGVtPndyaXRlIHBvc2l0aW9uPC9lbT4gaXMgYXZhaWxhYmxlLgorICAgKiAgICAgICBJbiB0aGlzIGNhc2UsIEBlICp4bmV4dCBzaGFsbCBiZSBhc3NpZ25hYmxlIGFzIHRoZSBuZXh0IGVsZW1lbnQKKyAgICogICAgICAgdG8gd3JpdGUgKHRvIHB1dCwgb3IgdG8gc3RvcmUgYSBjaGFyYWN0ZXIgdmFsdWUsIGludG8gdGhlIHNlcXVlbmNlKS4KKyAgICogICAgIC0gSWYgQGUgeG5leHQgaXMgbm90IGEgbnVsbCBwb2ludGVyIGFuZCBAZSB4YmVnIDwgQGUgeG5leHQgZm9yIGFuCisgICAqICAgICAgIGlucHV0IHNlcXVlbmNlLCB0aGVuIGEgPGVtPnB1dGJhY2sgcG9zaXRpb248L2VtPiBpcyBhdmFpbGFibGUuCisgICAqICAgICAgIEluIHRoaXMgY2FzZSwgQGUgeG5leHRbLTFdIHNoYWxsIGhhdmUgYSBkZWZpbmVkIHZhbHVlIGFuZCBpcyB0aGUKKyAgICogICAgICAgbmV4dCAocHJlY2VkaW5nKSBlbGVtZW50IHRvIHN0b3JlIGEgY2hhcmFjdGVyIHRoYXQgaXMgcHV0IGJhY2sKKyAgICogICAgICAgaW50byB0aGUgaW5wdXQgc2VxdWVuY2UuCisgICAqICAgICAtIElmIEBlIHhuZXh0IGlzIG5vdCBhIG51bGwgcG9pbnRlciBhbmQgQGUgeG5leHQ8IEBlIHhlbmQgZm9yIGFuCisgICAqICAgICAgIGlucHV0IHNlcXVlbmNlLCB0aGVuIGEgPGVtPnJlYWQgcG9zaXRpb248L2VtPiBpcyBhdmFpbGFibGUuCisgICAqICAgICAgIEluIHRoaXMgY2FzZSwgQGUgKnhuZXh0IHNoYWxsIGhhdmUgYSBkZWZpbmVkIHZhbHVlIGFuZCBpcyB0aGUKKyAgICogICAgICAgbmV4dCBlbGVtZW50IHRvIHJlYWQgKHRvIGdldCwgb3IgdG8gb2J0YWluIGEgY2hhcmFjdGVyIHZhbHVlLAorICAgKiAgICAgICBmcm9tIHRoZSBzZXF1ZW5jZSkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBjbGFzcyBiYXNpY19zdHJlYW1idWYgCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIFRoZXNlIGFyZSBzdGFuZGFyZCB0eXBlcy4gIFRoZXkgcGVybWl0IGEgc3RhbmRhcmRpemVkIHdheSBvZgorICAgICAgICogIHJlZmVycmluZyB0byBuYW1lcyBvZiAob3IgbmFtZXMgZGVwZW5kZW50IG9uKSB0aGUgdGVtcGxhdGUKKyAgICAgICAqICBwYXJhbWV0ZXJzLCB3aGljaCBhcmUgc3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uLgorICAgICAgKi8KKyAgICAgIHR5cGVkZWYgX0NoYXJUIAkJCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfVHJhaXRzIAkJCQkJdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSAJCWludF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6cG9zX3R5cGUgCQlwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om9mZl90eXBlIAkJb2ZmX3R5cGU7CisgICAgICAvL0B9CisKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBUaGlzIGlzIGEgbm9uLXN0YW5kYXJkIHR5cGUuCisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiAgCV9fc3RyZWFtYnVmX3R5cGU7CisgICAgICAvL0B9CisgICAgICAKKyAgICAgIGZyaWVuZCBjbGFzcyBiYXNpY19pb3M8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT47CisgICAgICBmcmllbmQgY2xhc3MgYmFzaWNfaXN0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPjsKKyAgICAgIGZyaWVuZCBjbGFzcyBiYXNpY19vc3RyZWFtPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+OworICAgICAgZnJpZW5kIGNsYXNzIGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT47CisgICAgICBmcmllbmQgY2xhc3Mgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPjsKKworICAgICAgZnJpZW5kIHN0cmVhbXNpemUKKyAgICAgIF9fY29weV9zdHJlYW1idWZzX2VvZjw+KGJhc2ljX3N0cmVhbWJ1ZiosIGJhc2ljX3N0cmVhbWJ1ZiosIGJvb2wmKTsKKworICAgICAgdGVtcGxhdGU8Ym9vbCBfSXNNb3ZlLCB0eXBlbmFtZSBfQ2hhclQyPgorICAgICAgICBmcmllbmQgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2NoYXI8X0NoYXJUMj46Ol9fdmFsdWUsIAorCQkJCQkgICAgICAgX0NoYXJUMio+OjpfX3R5cGUKKyAgICAgICAgX19jb3B5X21vdmVfYTIoaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQyPiwKKwkJICAgICAgIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUMj4sIF9DaGFyVDIqKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUMj4KKyAgICAgICAgZnJpZW5kIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19jaGFyPF9DaGFyVDI+OjpfX3ZhbHVlLAorCQkJCSAgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQyPiA+OjpfX3R5cGUKKyAgICAgICAgZmluZChpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVDI+LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVDI+LAorCSAgICAgY29uc3QgX0NoYXJUMiYpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQyLCB0eXBlbmFtZSBfVHJhaXRzMj4KKyAgICAgICAgZnJpZW5kIGJhc2ljX2lzdHJlYW08X0NoYXJUMiwgX1RyYWl0czI+JgorICAgICAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJUMiwgX1RyYWl0czI+JiwgX0NoYXJUMiopOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQyLCB0eXBlbmFtZSBfVHJhaXRzMiwgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgICBmcmllbmQgYmFzaWNfaXN0cmVhbTxfQ2hhclQyLCBfVHJhaXRzMj4mCisgICAgICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQyLCBfVHJhaXRzMj4mLAorCQkgICBiYXNpY19zdHJpbmc8X0NoYXJUMiwgX1RyYWl0czIsIF9BbGxvYz4mKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUMiwgdHlwZW5hbWUgX1RyYWl0czIsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgICAgZnJpZW5kIGJhc2ljX2lzdHJlYW08X0NoYXJUMiwgX1RyYWl0czI+JgorICAgICAgICBnZXRsaW5lKGJhc2ljX2lzdHJlYW08X0NoYXJUMiwgX1RyYWl0czI+JiwKKwkJYmFzaWNfc3RyaW5nPF9DaGFyVDIsIF9UcmFpdHMyLCBfQWxsb2M+JiwgX0NoYXJUMik7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvKgorICAgICAgICogIFRoaXMgaXMgYmFzZWQgb24gX0lPX0ZJTEUsIGp1c3QgcmVvcmRlcmVkIHRvIGJlIG1vcmUgY29uc2lzdGVudCwKKyAgICAgICAqICBhbmQgaXMgaW50ZW5kZWQgdG8gYmUgdGhlIG1vc3QgbWluaW1hbCBhYnN0cmFjdGlvbiBmb3IgYW4KKyAgICAgICAqICBpbnRlcm5hbCBidWZmZXIuCisgICAgICAgKiAgLSAgZ2V0ID09IGlucHV0ID09IHJlYWQKKyAgICAgICAqICAtICBwdXQgPT0gb3V0cHV0ID09IHdyaXRlCisgICAgICAqLworICAgICAgY2hhcl90eXBlKiAJCV9NX2luX2JlZzsgICAgIC8vLzwgU3RhcnQgb2YgZ2V0IGFyZWEuCisgICAgICBjaGFyX3R5cGUqIAkJX01faW5fY3VyOyAgICAgLy8vPCBDdXJyZW50IHJlYWQgYXJlYS4KKyAgICAgIGNoYXJfdHlwZSogCQlfTV9pbl9lbmQ7ICAgICAvLy88IEVuZCBvZiBnZXQgYXJlYS4KKyAgICAgIGNoYXJfdHlwZSogCQlfTV9vdXRfYmVnOyAgICAvLy88IFN0YXJ0IG9mIHB1dCBhcmVhLgorICAgICAgY2hhcl90eXBlKiAJCV9NX291dF9jdXI7ICAgIC8vLzwgQ3VycmVudCBwdXQgYXJlYS4KKyAgICAgIGNoYXJfdHlwZSogCQlfTV9vdXRfZW5kOyAgICAvLy88IEVuZCBvZiBwdXQgYXJlYS4KKworICAgICAgLy8vIEN1cnJlbnQgbG9jYWxlIHNldHRpbmcuCisgICAgICBsb2NhbGUgCQkJX01fYnVmX2xvY2FsZTsJCisKKyAgcHVibGljOgorICAgICAgLy8vIERlc3RydWN0b3IgZGVhbGxvY2F0ZXMgbm8gYnVmZmVyIHNwYWNlLgorICAgICAgdmlydHVhbCAKKyAgICAgIH5iYXNpY19zdHJlYW1idWYoKSAKKyAgICAgIHsgfQorCisgICAgICAvLyBbMjcuNS4yLjIuMV0gbG9jYWxlcworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBFbnRyeSBwb2ludCBmb3IgaW1idWUoKS4KKyAgICAgICAqICBAcGFyYW0gIF9fbG9jICBUaGUgbmV3IGxvY2FsZS4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgcHJldmlvdXMgbG9jYWxlLgorICAgICAgICoKKyAgICAgICAqICBDYWxscyB0aGUgZGVyaXZlZCBpbWJ1ZShfX2xvYykuCisgICAgICAqLworICAgICAgbG9jYWxlIAorICAgICAgcHViaW1idWUoY29uc3QgbG9jYWxlJiBfX2xvYykKKyAgICAgIHsKKwlsb2NhbGUgX190bXAodGhpcy0+Z2V0bG9jKCkpOworCXRoaXMtPmltYnVlKF9fbG9jKTsKKwlfTV9idWZfbG9jYWxlID0gX19sb2M7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIExvY2FsZSBhY2Nlc3MuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGN1cnJlbnQgbG9jYWxlIGluIGVmZmVjdC4KKyAgICAgICAqCisgICAgICAgKiAgSWYgcHViaW1idWUobG9jKSBoYXMgYmVlbiBjYWxsZWQsIHRoZW4gdGhlIG1vc3QgcmVjZW50IEBjIGxvYworICAgICAgICogIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlIHRoZSBnbG9iYWwgbG9jYWxlIGluIGVmZmVjdCBhdCB0aGUgdGltZQorICAgICAgICogIG9mIGNvbnN0cnVjdGlvbiBpcyByZXR1cm5lZC4KKyAgICAgICovCisgICAgICBsb2NhbGUgICAKKyAgICAgIGdldGxvYygpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9idWZfbG9jYWxlOyB9IAorCisgICAgICAvLyBbMjcuNS4yLjIuMl0gYnVmZmVyIG1hbmFnZW1lbnQgYW5kIHBvc2l0aW9uaW5nCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEVudHJ5IHBvaW50cyBmb3IgZGVyaXZlZCBidWZmZXIgZnVuY3Rpb25zLgorICAgICAgICoKKyAgICAgICAqICBUaGUgcHVibGljIHZlcnNpb25zIG9mIEBjIHB1YmZvbyBkaXNwYXRjaCB0byB0aGUgcHJvdGVjdGVkCisgICAgICAgKiAgZGVyaXZlZCBAYyBmb28gbWVtYmVyIGZ1bmN0aW9ucywgcGFzc2luZyB0aGUgYXJndW1lbnRzIChpZiBhbnkpCisgICAgICAgKiAgYW5kIHJldHVybmluZyB0aGUgcmVzdWx0IHVuY2hhbmdlZC4KKyAgICAgICovCisgICAgICBiYXNpY19zdHJlYW1idWYqCisgICAgICBwdWJzZXRidWYoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKSAKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnNldGJ1ZihfX3MsIF9fbik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBbHRlcnMgdGhlIHN0cmVhbSBwb3NpdGlvbi4KKyAgICAgICAqICBAcGFyYW0gIF9fb2ZmICBPZmZzZXQuCisgICAgICAgKiAgQHBhcmFtICBfX3dheSAgVmFsdWUgZm9yIGlvc19iYXNlOjpzZWVrZGlyLgorICAgICAgICogIEBwYXJhbSAgX19tb2RlIFZhbHVlIGZvciBpb3NfYmFzZTo6b3Blbm1vZGUuCisgICAgICAgKgorICAgICAgICogIENhbGxzIHZpcnR1YWwgc2Vla29mZiBmdW5jdGlvbi4KKyAgICAgICovCisgICAgICBwb3NfdHlwZSAKKyAgICAgIHB1YnNlZWtvZmYob2ZmX3R5cGUgX19vZmYsIGlvc19iYXNlOjpzZWVrZGlyIF9fd2F5LCAKKwkJIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KQorICAgICAgeyByZXR1cm4gdGhpcy0+c2Vla29mZihfX29mZiwgX193YXksIF9fbW9kZSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBbHRlcnMgdGhlIHN0cmVhbSBwb3NpdGlvbi4KKyAgICAgICAqICBAcGFyYW0gIF9fc3AgIFBvc2l0aW9uCisgICAgICAgKiAgQHBhcmFtICBfX21vZGUgVmFsdWUgZm9yIGlvc19iYXNlOjpvcGVubW9kZS4KKyAgICAgICAqCisgICAgICAgKiAgQ2FsbHMgdmlydHVhbCBzZWVrcG9zIGZ1bmN0aW9uLgorICAgICAgKi8KKyAgICAgIHBvc190eXBlIAorICAgICAgcHVic2Vla3Bvcyhwb3NfdHlwZSBfX3NwLAorCQkgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpCisgICAgICB7IHJldHVybiB0aGlzLT5zZWVrcG9zKF9fc3AsIF9fbW9kZSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDYWxscyB2aXJ0dWFsIHN5bmMgZnVuY3Rpb24uCisgICAgICAqLworICAgICAgaW50IAorICAgICAgcHVic3luYygpIHsgcmV0dXJuIHRoaXMtPnN5bmMoKTsgfQorICAgICAgLy9AfQorCisgICAgICAvLyBbMjcuNS4yLjIuM10gZ2V0IGFyZWEKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTG9va2luZyBhaGVhZCBpbnRvIHRoZSBzdHJlYW0uCisgICAgICAgKiAgQHJldHVybiAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGF2YWlsYWJsZS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgYSByZWFkIHBvc2l0aW9uIGlzIGF2YWlsYWJsZSwgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMKKyAgICAgICAqICBhdmFpbGFibGUgZm9yIHJlYWRpbmcgYmVmb3JlIHRoZSBidWZmZXIgbXVzdCBiZSByZWZpbGxlZC4KKyAgICAgICAqICBPdGhlcndpc2UgcmV0dXJucyB0aGUgZGVyaXZlZCBAYyBzaG93bWFueWMoKS4KKyAgICAgICovCisgICAgICBzdHJlYW1zaXplIAorICAgICAgaW5fYXZhaWwoKSAKKyAgICAgIHsgCisJY29uc3Qgc3RyZWFtc2l6ZSBfX3JldCA9IHRoaXMtPmVncHRyKCkgLSB0aGlzLT5ncHRyKCk7CisJcmV0dXJuIF9fcmV0ID8gX19yZXQgOiB0aGlzLT5zaG93bWFueWMoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBHZXR0aW5nIHRoZSBuZXh0IGNoYXJhY3Rlci4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgbmV4dCBjaGFyYWN0ZXIsIG9yIGVvZi4KKyAgICAgICAqCisgICAgICAgKiAgQ2FsbHMgQGMgc2J1bXBjKCksIGFuZCBpZiB0aGF0IGZ1bmN0aW9uIHJldHVybnMKKyAgICAgICAqICBAYyB0cmFpdHM6OmVvZigpLCBzbyBkb2VzIHRoaXMgZnVuY3Rpb24uICBPdGhlcndpc2UsIEBjIHNnZXRjKCkuCisgICAgICAqLworICAgICAgaW50X3R5cGUgCisgICAgICBzbmV4dGMoKQorICAgICAgeworCWludF90eXBlIF9fcmV0ID0gdHJhaXRzX3R5cGU6OmVvZigpOworCWlmIChfX2J1aWx0aW5fZXhwZWN0KCF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUodGhpcy0+c2J1bXBjKCksIAorCQkJCQkJICAgICAgIF9fcmV0KSwgdHJ1ZSkpCisJICBfX3JldCA9IHRoaXMtPnNnZXRjKCk7CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEdldHRpbmcgdGhlIG5leHQgY2hhcmFjdGVyLgorICAgICAgICogIEByZXR1cm4gIFRoZSBuZXh0IGNoYXJhY3Rlciwgb3IgZW9mLgorICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgaW5wdXQgcmVhZCBwb3NpdGlvbiBpcyBhdmFpbGFibGUsIHJldHVybnMgdGhhdCBjaGFyYWN0ZXIKKyAgICAgICAqICBhbmQgaW5jcmVtZW50cyB0aGUgcmVhZCBwb2ludGVyLCBvdGhlcndpc2UgY2FsbHMgYW5kIHJldHVybnMKKyAgICAgICAqICBAYyB1ZmxvdygpLgorICAgICAgKi8KKyAgICAgIGludF90eXBlIAorICAgICAgc2J1bXBjKCkKKyAgICAgIHsKKwlpbnRfdHlwZSBfX3JldDsKKwlpZiAoX19idWlsdGluX2V4cGVjdCh0aGlzLT5ncHRyKCkgPCB0aGlzLT5lZ3B0cigpLCB0cnVlKSkKKwkgIHsKKwkgICAgX19yZXQgPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKnRoaXMtPmdwdHIoKSk7CisJICAgIHRoaXMtPmdidW1wKDEpOworCSAgfQorCWVsc2UgCisJICBfX3JldCA9IHRoaXMtPnVmbG93KCk7CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEdldHRpbmcgdGhlIG5leHQgY2hhcmFjdGVyLgorICAgICAgICogIEByZXR1cm4gIFRoZSBuZXh0IGNoYXJhY3Rlciwgb3IgZW9mLgorICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgaW5wdXQgcmVhZCBwb3NpdGlvbiBpcyBhdmFpbGFibGUsIHJldHVybnMgdGhhdCBjaGFyYWN0ZXIsCisgICAgICAgKiAgb3RoZXJ3aXNlIGNhbGxzIGFuZCByZXR1cm5zIEBjIHVuZGVyZmxvdygpLiAgRG9lcyBub3QgbW92ZSB0aGUgCisgICAgICAgKiAgcmVhZCBwb3NpdGlvbiBhZnRlciBmZXRjaGluZyB0aGUgY2hhcmFjdGVyLgorICAgICAgKi8KKyAgICAgIGludF90eXBlIAorICAgICAgc2dldGMoKQorICAgICAgeworCWludF90eXBlIF9fcmV0OworCWlmIChfX2J1aWx0aW5fZXhwZWN0KHRoaXMtPmdwdHIoKSA8IHRoaXMtPmVncHRyKCksIHRydWUpKQorCSAgX19yZXQgPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKnRoaXMtPmdwdHIoKSk7CisJZWxzZSAKKwkgIF9fcmV0ID0gdGhpcy0+dW5kZXJmbG93KCk7CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEVudHJ5IHBvaW50IGZvciB4c2dldG4uCisgICAgICAgKiAgQHBhcmFtICBfX3MgIEEgYnVmZmVyIGFyZWEuCisgICAgICAgKiAgQHBhcmFtICBfX24gIEEgY291bnQuCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgeHNnZXRuKF9fcyxfX24pLiAgVGhlIGVmZmVjdCBpcyB0byBmaWxsIEBhIF9fc1swXSB0aHJvdWdoCisgICAgICAgKiAgQGEgX19zW19fbi0xXSB3aXRoIGNoYXJhY3RlcnMgZnJvbSB0aGUgaW5wdXQgc2VxdWVuY2UsIGlmIHBvc3NpYmxlLgorICAgICAgKi8KKyAgICAgIHN0cmVhbXNpemUgCisgICAgICBzZ2V0bihjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pCisgICAgICB7IHJldHVybiB0aGlzLT54c2dldG4oX19zLCBfX24pOyB9CisKKyAgICAgIC8vIFsyNy41LjIuMi40XSBwdXRiYWNrCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFB1c2hpbmcgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgICAqICBAcGFyYW0gIF9fYyAgVGhlIGNoYXJhY3RlciB0byBwdXNoIGJhY2suCisgICAgICAgKiAgQHJldHVybiAgVGhlIHByZXZpb3VzIGNoYXJhY3RlciwgaWYgcG9zc2libGUuCisgICAgICAgKgorICAgICAgICogIFNpbWlsYXIgdG8gc3VuZ2V0YygpLCBidXQgQGEgX19jIGlzIHB1c2hlZCBvbnRvIHRoZSBzdHJlYW0KKyAgICAgICAqICBpbnN0ZWFkIG9mIDxlbT50aGUgcHJldmlvdXMgY2hhcmFjdGVyLjwvZW0+IElmIHN1Y2Nlc3NmdWwsCisgICAgICAgKiAgdGhlIG5leHQgY2hhcmFjdGVyIGZldGNoZWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIHdpbGwgYmUgQGEKKyAgICAgICAqICBfX2MuCisgICAgICAqLworICAgICAgaW50X3R5cGUgCisgICAgICBzcHV0YmFja2MoY2hhcl90eXBlIF9fYykKKyAgICAgIHsKKwlpbnRfdHlwZSBfX3JldDsKKwljb25zdCBib29sIF9fdGVzdHBvcyA9IHRoaXMtPmViYWNrKCkgPCB0aGlzLT5ncHRyKCk7CisJaWYgKF9fYnVpbHRpbl9leHBlY3QoIV9fdGVzdHBvcyB8fCAKKwkJCSAgICAgIXRyYWl0c190eXBlOjplcShfX2MsIHRoaXMtPmdwdHIoKVstMV0pLCBmYWxzZSkpCisJICBfX3JldCA9IHRoaXMtPnBiYWNrZmFpbCh0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoX19jKSk7CisJZWxzZSAKKwkgIHsKKwkgICAgdGhpcy0+Z2J1bXAoLTEpOworCSAgICBfX3JldCA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqdGhpcy0+Z3B0cigpKTsKKwkgIH0KKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTW92aW5nIGJhY2t3YXJkcyBpbiB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAgICogIEByZXR1cm4gIFRoZSBwcmV2aW91cyBjaGFyYWN0ZXIsIGlmIHBvc3NpYmxlLgorICAgICAgICoKKyAgICAgICAqICBJZiBhIHB1dGJhY2sgcG9zaXRpb24gaXMgYXZhaWxhYmxlLCB0aGlzIGZ1bmN0aW9uIGRlY3JlbWVudHMKKyAgICAgICAqICB0aGUgaW5wdXQgcG9pbnRlciBhbmQgcmV0dXJucyB0aGF0IGNoYXJhY3Rlci4gIE90aGVyd2lzZSwKKyAgICAgICAqICBjYWxscyBhbmQgcmV0dXJucyBwYmFja2ZhaWwoKS4gIFRoZSBlZmZlY3QgaXMgdG8gQGEgdW5nZXQKKyAgICAgICAqICB0aGUgbGFzdCBjaGFyYWN0ZXIgQGEgZ290dGVuLgorICAgICAgKi8KKyAgICAgIGludF90eXBlIAorICAgICAgc3VuZ2V0YygpCisgICAgICB7CisJaW50X3R5cGUgX19yZXQ7CisJaWYgKF9fYnVpbHRpbl9leHBlY3QodGhpcy0+ZWJhY2soKSA8IHRoaXMtPmdwdHIoKSwgdHJ1ZSkpCisJICB7CisJICAgIHRoaXMtPmdidW1wKC0xKTsKKwkgICAgX19yZXQgPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKnRoaXMtPmdwdHIoKSk7CisJICB9CisJZWxzZSAKKwkgIF9fcmV0ID0gdGhpcy0+cGJhY2tmYWlsKCk7CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgICAgICAvLyBbMjcuNS4yLjIuNV0gcHV0IGFyZWEKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRW50cnkgcG9pbnQgZm9yIGFsbCBzaW5nbGUtY2hhcmFjdGVyIG91dHB1dCBmdW5jdGlvbnMuCisgICAgICAgKiAgQHBhcmFtICBfX2MgIEEgY2hhcmFjdGVyIHRvIG91dHB1dC4KKyAgICAgICAqICBAcmV0dXJuICBAYSBfX2MsIGlmIHBvc3NpYmxlLgorICAgICAgICoKKyAgICAgICAqICBPbmUgb2YgdHdvIHB1YmxpYyBvdXRwdXQgZnVuY3Rpb25zLgorICAgICAgICoKKyAgICAgICAqICBJZiBhIHdyaXRlIHBvc2l0aW9uIGlzIGF2YWlsYWJsZSBmb3IgdGhlIG91dHB1dCBzZXF1ZW5jZSAoaS5lLiwKKyAgICAgICAqICB0aGUgYnVmZmVyIGlzIG5vdCBmdWxsKSwgc3RvcmVzIEBhIF9fYyBpbiB0aGF0IHBvc2l0aW9uLCBpbmNyZW1lbnRzCisgICAgICAgKiAgdGhlIHBvc2l0aW9uLCBhbmQgcmV0dXJucyBAYyB0cmFpdHM6OnRvX2ludF90eXBlKF9fYykuICBJZiBhIHdyaXRlCisgICAgICAgKiAgcG9zaXRpb24gaXMgbm90IGF2YWlsYWJsZSwgcmV0dXJucyBAYyBvdmVyZmxvdyhfX2MpLgorICAgICAgKi8KKyAgICAgIGludF90eXBlIAorICAgICAgc3B1dGMoY2hhcl90eXBlIF9fYykKKyAgICAgIHsKKwlpbnRfdHlwZSBfX3JldDsKKwlpZiAoX19idWlsdGluX2V4cGVjdCh0aGlzLT5wcHRyKCkgPCB0aGlzLT5lcHB0cigpLCB0cnVlKSkKKwkgIHsKKwkgICAgKnRoaXMtPnBwdHIoKSA9IF9fYzsKKwkgICAgdGhpcy0+cGJ1bXAoMSk7CisJICAgIF9fcmV0ID0gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKF9fYyk7CisJICB9CisJZWxzZQorCSAgX19yZXQgPSB0aGlzLT5vdmVyZmxvdyh0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoX19jKSk7CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEVudHJ5IHBvaW50IGZvciBhbGwgc2luZ2xlLWNoYXJhY3RlciBvdXRwdXQgZnVuY3Rpb25zLgorICAgICAgICogIEBwYXJhbSAgX19zICBBIGJ1ZmZlciByZWFkIGFyZWEuCisgICAgICAgKiAgQHBhcmFtICBfX24gIEEgY291bnQuCisgICAgICAgKgorICAgICAgICogIE9uZSBvZiB0d28gcHVibGljIG91dHB1dCBmdW5jdGlvbnMuCisgICAgICAgKgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIHhzcHV0bihfX3MsX19uKS4gIFRoZSBlZmZlY3QgaXMgdG8gd3JpdGUgQGEgX19zWzBdIHRocm91Z2gKKyAgICAgICAqICBAYSBfX3NbX19uLTFdIHRvIHRoZSBvdXRwdXQgc2VxdWVuY2UsIGlmIHBvc3NpYmxlLgorICAgICAgKi8KKyAgICAgIHN0cmVhbXNpemUgCisgICAgICBzcHV0bihjb25zdCBjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pCisgICAgICB7IHJldHVybiB0aGlzLT54c3B1dG4oX19zLCBfX24pOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJhc2UgY29uc3RydWN0b3IuCisgICAgICAgKgorICAgICAgICogIE9ubHkgY2FsbGVkIGZyb20gZGVyaXZlZCBjb25zdHJ1Y3RvcnMsIGFuZCBzZXRzIHVwIGFsbCB0aGUKKyAgICAgICAqICBidWZmZXIgZGF0YSB0byB6ZXJvLCBpbmNsdWRpbmcgdGhlIHBvaW50ZXJzIGRlc2NyaWJlZCBpbiB0aGUKKyAgICAgICAqICBiYXNpY19zdHJlYW1idWYgY2xhc3MgZGVzY3JpcHRpb24uICBOb3RlIHRoYXQsIGFzIGEgcmVzdWx0LAorICAgICAgICogIC0gdGhlIGNsYXNzIHN0YXJ0cyB3aXRoIG5vIHJlYWQgbm9yIHdyaXRlIHBvc2l0aW9ucyBhdmFpbGFibGUsCisgICAgICAgKiAgLSB0aGlzIGlzIG5vdCBhbiBlcnJvcgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmVhbWJ1ZigpCisgICAgICA6IF9NX2luX2JlZygwKSwgX01faW5fY3VyKDApLCBfTV9pbl9lbmQoMCksIAorICAgICAgX01fb3V0X2JlZygwKSwgX01fb3V0X2N1cigwKSwgX01fb3V0X2VuZCgwKSwKKyAgICAgIF9NX2J1Zl9sb2NhbGUobG9jYWxlKCkpIAorICAgICAgeyB9CisKKyAgICAgIC8vIFsyNy41LjIuMy4xXSBnZXQgYXJlYSBhY2Nlc3MKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWNjZXNzIHRvIHRoZSBnZXQgYXJlYS4KKyAgICAgICAqCisgICAgICAgKiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSB0byBvdGhlciBwcm90ZWN0ZWQgZnVuY3Rpb25zLAorICAgICAgICogIGluY2x1ZGluZyBkZXJpdmVkIGNsYXNzZXMuCisgICAgICAgKgorICAgICAgICogIC0gZWJhY2soKSByZXR1cm5zIHRoZSBiZWdpbm5pbmcgcG9pbnRlciBmb3IgdGhlIGlucHV0IHNlcXVlbmNlCisgICAgICAgKiAgLSBncHRyKCkgcmV0dXJucyB0aGUgbmV4dCBwb2ludGVyIGZvciB0aGUgaW5wdXQgc2VxdWVuY2UKKyAgICAgICAqICAtIGVncHRyKCkgcmV0dXJucyB0aGUgZW5kIHBvaW50ZXIgZm9yIHRoZSBpbnB1dCBzZXF1ZW5jZQorICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZSogCisgICAgICBlYmFjaygpIGNvbnN0IHsgcmV0dXJuIF9NX2luX2JlZzsgfQorCisgICAgICBjaGFyX3R5cGUqIAorICAgICAgZ3B0cigpICBjb25zdCB7IHJldHVybiBfTV9pbl9jdXI7ICB9CisKKyAgICAgIGNoYXJfdHlwZSogCisgICAgICBlZ3B0cigpIGNvbnN0IHsgcmV0dXJuIF9NX2luX2VuZDsgfQorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1vdmluZyB0aGUgcmVhZCBwb3NpdGlvbi4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgVGhlIGRlbHRhIGJ5IHdoaWNoIHRvIG1vdmUuCisgICAgICAgKgorICAgICAgICogIFRoaXMganVzdCBhZHZhbmNlcyB0aGUgcmVhZCBwb3NpdGlvbiB3aXRob3V0IHJldHVybmluZyBhbnkgZGF0YS4KKyAgICAgICovCisgICAgICB2b2lkIAorICAgICAgZ2J1bXAoaW50IF9fbikgeyBfTV9pbl9jdXIgKz0gX19uOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0dGluZyB0aGUgdGhyZWUgcmVhZCBhcmVhIHBvaW50ZXJzLgorICAgICAgICogIEBwYXJhbSAgX19nYmVnICBBIHBvaW50ZXIuCisgICAgICAgKiAgQHBhcmFtICBfX2duZXh0ICBBIHBvaW50ZXIuCisgICAgICAgKiAgQHBhcmFtICBfX2dlbmQgIEEgcG9pbnRlci4KKyAgICAgICAqICBAcG9zdCAgQGEgX19nYmVnID09IEBjIGViYWNrKCksIEBhIF9fZ25leHQgPT0gQGMgZ3B0cigpLCBhbmQKKyAgICAgICAqICAgICAgICAgQGEgX19nZW5kID09IEBjIGVncHRyKCkKKyAgICAgICovCisgICAgICB2b2lkIAorICAgICAgc2V0ZyhjaGFyX3R5cGUqIF9fZ2JlZywgY2hhcl90eXBlKiBfX2duZXh0LCBjaGFyX3R5cGUqIF9fZ2VuZCkKKyAgICAgIHsKKwlfTV9pbl9iZWcgPSBfX2diZWc7CisJX01faW5fY3VyID0gX19nbmV4dDsKKwlfTV9pbl9lbmQgPSBfX2dlbmQ7CisgICAgICB9CisKKyAgICAgIC8vIFsyNy41LjIuMy4yXSBwdXQgYXJlYSBhY2Nlc3MKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWNjZXNzIHRvIHRoZSBwdXQgYXJlYS4KKyAgICAgICAqCisgICAgICAgKiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSB0byBvdGhlciBwcm90ZWN0ZWQgZnVuY3Rpb25zLAorICAgICAgICogIGluY2x1ZGluZyBkZXJpdmVkIGNsYXNzZXMuCisgICAgICAgKgorICAgICAgICogIC0gcGJhc2UoKSByZXR1cm5zIHRoZSBiZWdpbm5pbmcgcG9pbnRlciBmb3IgdGhlIG91dHB1dCBzZXF1ZW5jZQorICAgICAgICogIC0gcHB0cigpIHJldHVybnMgdGhlIG5leHQgcG9pbnRlciBmb3IgdGhlIG91dHB1dCBzZXF1ZW5jZQorICAgICAgICogIC0gZXBwdHIoKSByZXR1cm5zIHRoZSBlbmQgcG9pbnRlciBmb3IgdGhlIG91dHB1dCBzZXF1ZW5jZQorICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZSogCisgICAgICBwYmFzZSgpIGNvbnN0IHsgcmV0dXJuIF9NX291dF9iZWc7IH0KKworICAgICAgY2hhcl90eXBlKiAKKyAgICAgIHBwdHIoKSBjb25zdCB7IHJldHVybiBfTV9vdXRfY3VyOyB9CisKKyAgICAgIGNoYXJfdHlwZSogCisgICAgICBlcHB0cigpIGNvbnN0IHsgcmV0dXJuIF9NX291dF9lbmQ7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNb3ZpbmcgdGhlIHdyaXRlIHBvc2l0aW9uLgorICAgICAgICogIEBwYXJhbSAgX19uICBUaGUgZGVsdGEgYnkgd2hpY2ggdG8gbW92ZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBqdXN0IGFkdmFuY2VzIHRoZSB3cml0ZSBwb3NpdGlvbiB3aXRob3V0IHJldHVybmluZyBhbnkgZGF0YS4KKyAgICAgICovCisgICAgICB2b2lkIAorICAgICAgcGJ1bXAoaW50IF9fbikgeyBfTV9vdXRfY3VyICs9IF9fbjsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldHRpbmcgdGhlIHRocmVlIHdyaXRlIGFyZWEgcG9pbnRlcnMuCisgICAgICAgKiAgQHBhcmFtICBfX3BiZWcgIEEgcG9pbnRlci4KKyAgICAgICAqICBAcGFyYW0gIF9fcGVuZCAgQSBwb2ludGVyLgorICAgICAgICogIEBwb3N0ICBAYSBfX3BiZWcgPT0gQGMgcGJhc2UoKSwgQGEgX19wYmVnID09IEBjIHBwdHIoKSwgYW5kCisgICAgICAgKiAgICAgICAgIEBhIF9fcGVuZCA9PSBAYyBlcHB0cigpCisgICAgICAqLworICAgICAgdm9pZCAKKyAgICAgIHNldHAoY2hhcl90eXBlKiBfX3BiZWcsIGNoYXJfdHlwZSogX19wZW5kKQorICAgICAgeyAKKwlfTV9vdXRfYmVnID0gX01fb3V0X2N1ciA9IF9fcGJlZzsgCisJX01fb3V0X2VuZCA9IF9fcGVuZDsKKyAgICAgIH0KKworICAgICAgLy8gWzI3LjUuMi40XSB2aXJ0dWFsIGZ1bmN0aW9ucworICAgICAgLy8gWzI3LjUuMi40LjFdIGxvY2FsZXMKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ2hhbmdlcyB0cmFuc2xhdGlvbnMuCisgICAgICAgKiAgQHBhcmFtICBfX2xvYyAgQSBuZXcgbG9jYWxlLgorICAgICAgICoKKyAgICAgICAqICBUcmFuc2xhdGlvbnMgZG9uZSBkdXJpbmcgSS9PIHdoaWNoIGRlcGVuZCBvbiB0aGUgY3VycmVudAorICAgICAgICogIGxvY2FsZSBhcmUgY2hhbmdlZCBieSB0aGlzIGNhbGwuICBUaGUgc3RhbmRhcmQgYWRkcywKKyAgICAgICAqICA8ZW0+QmV0d2VlbiBpbnZvY2F0aW9ucyBvZiB0aGlzIGZ1bmN0aW9uIGEgY2xhc3MgZGVyaXZlZAorICAgICAgICogIGZyb20gc3RyZWFtYnVmIGNhbiBzYWZlbHkgY2FjaGUgcmVzdWx0cyBvZiBjYWxscyB0byBsb2NhbGUKKyAgICAgICAqICBmdW5jdGlvbnMgYW5kIHRvIG1lbWJlcnMgb2YgZmFjZXRzIHNvIG9idGFpbmVkLjwvZW0+CisgICAgICAgKgorICAgICAgICogIEBub3RlICBCYXNlIGNsYXNzIHZlcnNpb24gZG9lcyBub3RoaW5nLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgdm9pZCAKKyAgICAgIGltYnVlKGNvbnN0IGxvY2FsZSYgX19sb2MpIAorICAgICAgeyB9CisKKyAgICAgIC8vIFsyNy41LjIuNC4yXSBidWZmZXIgbWFuYWdlbWVudCBhbmQgcG9zaXRpb25pbmcKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTWFuaXB1bGF0ZXMgdGhlIGJ1ZmZlci4KKyAgICAgICAqCisgICAgICAgKiAgRWFjaCBkZXJpdmVkIGNsYXNzIHByb3ZpZGVzIGl0cyBvd24gYXBwcm9wcmlhdGUgYmVoYXZpb3IuICBTZWUKKyAgICAgICAqICB0aGUgbmV4dC10by1sYXN0IHBhcmFncmFwaCBvZiAKKyAgICAgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDExY2gyNXMwMi5odG1sCisgICAgICAgKiAgZm9yIG1vcmUgb24gdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgQG5vdGUgIEJhc2UgY2xhc3MgdmVyc2lvbiBkb2VzIG5vdGhpbmcsIHJldHVybnMgQGMgdGhpcy4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyX3R5cGUsX1RyYWl0cz4qIAorICAgICAgc2V0YnVmKGNoYXJfdHlwZSosIHN0cmVhbXNpemUpCisgICAgICB7CXJldHVybiB0aGlzOyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWx0ZXJzIHRoZSBzdHJlYW0gcG9zaXRpb25zLgorICAgICAgICoKKyAgICAgICAqICBFYWNoIGRlcml2ZWQgY2xhc3MgcHJvdmlkZXMgaXRzIG93biBhcHByb3ByaWF0ZSBiZWhhdmlvci4KKyAgICAgICAqICBAbm90ZSAgQmFzZSBjbGFzcyB2ZXJzaW9uIGRvZXMgbm90aGluZywgcmV0dXJucyBhIEBjIHBvc190eXBlCisgICAgICAgKiAgICAgICAgIHRoYXQgcmVwcmVzZW50cyBhbiBpbnZhbGlkIHN0cmVhbSBwb3NpdGlvbi4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIHBvc190eXBlIAorICAgICAgc2Vla29mZihvZmZfdHlwZSwgaW9zX2Jhc2U6OnNlZWtkaXIsCisJICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIC8qX19tb2RlKi8gPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KQorICAgICAgeyByZXR1cm4gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsgfSAKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBbHRlcnMgdGhlIHN0cmVhbSBwb3NpdGlvbnMuCisgICAgICAgKgorICAgICAgICogIEVhY2ggZGVyaXZlZCBjbGFzcyBwcm92aWRlcyBpdHMgb3duIGFwcHJvcHJpYXRlIGJlaGF2aW9yLgorICAgICAgICogIEBub3RlICBCYXNlIGNsYXNzIHZlcnNpb24gZG9lcyBub3RoaW5nLCByZXR1cm5zIGEgQGMgcG9zX3R5cGUKKyAgICAgICAqICAgICAgICAgdGhhdCByZXByZXNlbnRzIGFuIGludmFsaWQgc3RyZWFtIHBvc2l0aW9uLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgcG9zX3R5cGUgCisgICAgICBzZWVrcG9zKHBvc190eXBlLCAKKwkgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgLypfX21vZGUqLyA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpCisgICAgICB7IHJldHVybiBwb3NfdHlwZShvZmZfdHlwZSgtMSkpOyB9IAorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN5bmNocm9uaXplcyB0aGUgYnVmZmVyIGFycmF5cyB3aXRoIHRoZSBjb250cm9sbGVkIHNlcXVlbmNlcy4KKyAgICAgICAqICBAcmV0dXJuICAtMSBvbiBmYWlsdXJlLgorICAgICAgICoKKyAgICAgICAqICBFYWNoIGRlcml2ZWQgY2xhc3MgcHJvdmlkZXMgaXRzIG93biBhcHByb3ByaWF0ZSBiZWhhdmlvciwKKyAgICAgICAqICBpbmNsdWRpbmcgdGhlIGRlZmluaXRpb24gb2YgQGEgZmFpbHVyZS4KKyAgICAgICAqICBAbm90ZSAgQmFzZSBjbGFzcyB2ZXJzaW9uIGRvZXMgbm90aGluZywgcmV0dXJucyB6ZXJvLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgaW50IAorICAgICAgc3luYygpIHsgcmV0dXJuIDA7IH0KKworICAgICAgLy8gWzI3LjUuMi40LjNdIGdldCBhcmVhCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEludmVzdGlnYXRpbmcgdGhlIGRhdGEgYXZhaWxhYmxlLgorICAgICAgICogIEByZXR1cm4gIEFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhdmFpbGFibGUgaW4gdGhlCisgICAgICAgKiAgICAgICAgICAgaW5wdXQgc2VxdWVuY2UsIG9yIC0xLgorICAgICAgICoKKyAgICAgICAqICA8ZW0+SWYgaXQgcmV0dXJucyBhIHBvc2l0aXZlIHZhbHVlLCB0aGVuIHN1Y2Nlc3NpdmUgY2FsbHMgdG8KKyAgICAgICAqICBAYyB1bmRlcmZsb3coKSB3aWxsIG5vdCByZXR1cm4gQGMgdHJhaXRzOjplb2YoKSB1bnRpbCBhdAorICAgICAgICogIGxlYXN0IHRoYXQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIHN1cHBsaWVkLiAgSWYgQGMKKyAgICAgICAqICBzaG93bWFueWMoKSByZXR1cm5zIC0xLCB0aGVuIGNhbGxzIHRvIEBjIHVuZGVyZmxvdygpIG9yIEBjCisgICAgICAgKiAgdWZsb3coKSB3aWxsIGZhaWwuPC9lbT4gWzI3LjUuMi40LjNdLzEKKyAgICAgICAqCisgICAgICAgKiAgQG5vdGUgIEJhc2UgY2xhc3MgdmVyc2lvbiBkb2VzIG5vdGhpbmcsIHJldHVybnMgemVyby4KKyAgICAgICAqICBAbm90ZSAgVGhlIHN0YW5kYXJkIGFkZHMgdGhhdCA8ZW0+dGhlIGludGVudGlvbiBpcyBub3Qgb25seSB0aGF0IHRoZQorICAgICAgICogICAgICAgICBjYWxscyBbdG8gdW5kZXJmbG93IG9yIHVmbG93XSB3aWxsIG5vdCByZXR1cm4gQGMgZW9mKCkgYnV0CisgICAgICAgKiAgICAgICAgIHRoYXQgdGhleSB3aWxsIHJldHVybiBpbW1lZGlhdGVseS48L2VtPgorICAgICAgICogIEBub3RlICBUaGUgc3RhbmRhcmQgYWRkcyB0aGF0IDxlbT50aGUgbW9ycGhlbWVzIG9mIEBjIHNob3dtYW55YyBhcmUKKyAgICAgICAqICAgICAgICAgQGIgZXMtaG93LW1hbnktc2VlLCBub3QgQGIgc2hvdy1tYW5pYy48L2VtPgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgc3RyZWFtc2l6ZSAKKyAgICAgIHNob3dtYW55YygpIHsgcmV0dXJuIDA7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNdWx0aXBsZSBjaGFyYWN0ZXIgZXh0cmFjdGlvbi4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgQSBidWZmZXIgYXJlYS4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBhc3NpZ24uCisgICAgICAgKiAgQHJldHVybiAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFzc2lnbmVkLgorICAgICAgICoKKyAgICAgICAqICBGaWxscyBAYSBfX3NbMF0gdGhyb3VnaCBAYSBfX3NbX19uLTFdIHdpdGggY2hhcmFjdGVycyBmcm9tIHRoZSBpbnB1dAorICAgICAgICogIHNlcXVlbmNlLCBhcyBpZiBieSBAYyBzYnVtcGMoKS4gIFN0b3BzIHdoZW4gZWl0aGVyIEBhIF9fbiBjaGFyYWN0ZXJzCisgICAgICAgKiAgaGF2ZSBiZWVuIGNvcGllZCwgb3Igd2hlbiBAYyB0cmFpdHM6OmVvZigpIHdvdWxkIGJlIGNvcGllZC4KKyAgICAgICAqCisgICAgICAgKiAgSXQgaXMgZXhwZWN0ZWQgdGhhdCBkZXJpdmVkIGNsYXNzZXMgcHJvdmlkZSBhIG1vcmUgZWZmaWNpZW50CisgICAgICAgKiAgaW1wbGVtZW50YXRpb24gYnkgb3ZlcnJpZGluZyB0aGlzIGRlZmluaXRpb24uCisgICAgICAqLworICAgICAgdmlydHVhbCBzdHJlYW1zaXplIAorICAgICAgeHNnZXRuKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbik7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmV0Y2hlcyBtb3JlIGRhdGEgZnJvbSB0aGUgY29udHJvbGxlZCBzZXF1ZW5jZS4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgZmlyc3QgY2hhcmFjdGVyIGZyb20gdGhlIDxlbT5wZW5kaW5nIHNlcXVlbmNlPC9lbT4uCisgICAgICAgKgorICAgICAgICogIEluZm9ybWFsbHksIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGlucHV0IGJ1ZmZlciBpcworICAgICAgICogIGV4aGF1c3RlZCAob3IgZG9lcyBub3QgZXhpc3QsIGFzIGJ1ZmZlcmluZyBuZWVkIG5vdCBhY3R1YWxseSBiZQorICAgICAgICogIGRvbmUpLiAgSWYgYSBidWZmZXIgZXhpc3RzLCBpdCBpcyBAYSByZWZpbGxlZC4gIEluIGVpdGhlciBjYXNlLCB0aGUKKyAgICAgICAqICBuZXh0IGF2YWlsYWJsZSBjaGFyYWN0ZXIgaXMgcmV0dXJuZWQsIG9yIEBjIHRyYWl0czo6ZW9mKCkgdG8KKyAgICAgICAqICBpbmRpY2F0ZSBhIG51bGwgcGVuZGluZyBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIGEgZm9ybWFsIGRlZmluaXRpb24gb2YgdGhlIHBlbmRpbmcgc2VxdWVuY2UsIHNlZSBhIGdvb2QgdGV4dAorICAgICAgICogIHN1Y2ggYXMgTGFuZ2VyICYgS3JlZnQsIG9yIFsyNy41LjIuNC4zXS83LTE0LgorICAgICAgICoKKyAgICAgICAqICBBIGZ1bmN0aW9uaW5nIGlucHV0IHN0cmVhbWJ1ZiBjYW4gYmUgY3JlYXRlZCBieSBvdmVycmlkaW5nIG9ubHkKKyAgICAgICAqICB0aGlzIGZ1bmN0aW9uIChubyBidWZmZXIgYXJlYSB3aWxsIGJlIHVzZWQpLiAgRm9yIGFuIGV4YW1wbGUsIHNlZQorICAgICAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MTFjaDI1Lmh0bWwKKyAgICAgICAqCisgICAgICAgKiAgQG5vdGUgIEJhc2UgY2xhc3MgdmVyc2lvbiBkb2VzIG5vdGhpbmcsIHJldHVybnMgZW9mKCkuCisgICAgICAqLworICAgICAgdmlydHVhbCBpbnRfdHlwZSAKKyAgICAgIHVuZGVyZmxvdygpCisgICAgICB7IHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGZXRjaGVzIG1vcmUgZGF0YSBmcm9tIHRoZSBjb250cm9sbGVkIHNlcXVlbmNlLgorICAgICAgICogIEByZXR1cm4gIFRoZSBmaXJzdCBjaGFyYWN0ZXIgZnJvbSB0aGUgPGVtPnBlbmRpbmcgc2VxdWVuY2U8L2VtPi4KKyAgICAgICAqCisgICAgICAgKiAgSW5mb3JtYWxseSwgdGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIEBjIHVuZGVyZmxvdygpLAorICAgICAgICogIGFuZCBpbiBmYWN0IGlzIHJlcXVpcmVkIHRvIGNhbGwgdGhhdCBmdW5jdGlvbi4gIEl0IGFsc28gcmV0dXJucworICAgICAgICogIHRoZSBuZXcgY2hhcmFjdGVyLCBsaWtlIEBjIHVuZGVyZmxvdygpIGRvZXMuICBIb3dldmVyLCB0aGlzCisgICAgICAgKiAgZnVuY3Rpb24gYWxzbyBtb3ZlcyB0aGUgcmVhZCBwb3NpdGlvbiBmb3J3YXJkIGJ5IG9uZS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGludF90eXBlIAorICAgICAgdWZsb3coKSAKKyAgICAgIHsKKwlpbnRfdHlwZSBfX3JldCA9IHRyYWl0c190eXBlOjplb2YoKTsKKwljb25zdCBib29sIF9fdGVzdGVvZiA9IHRyYWl0c190eXBlOjplcV9pbnRfdHlwZSh0aGlzLT51bmRlcmZsb3coKSwgCisJCQkJCQkJX19yZXQpOworCWlmICghX190ZXN0ZW9mKQorCSAgeworCSAgICBfX3JldCA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqdGhpcy0+Z3B0cigpKTsKKwkgICAgdGhpcy0+Z2J1bXAoMSk7CisJICB9CisJcmV0dXJuIF9fcmV0OyAgICAKKyAgICAgIH0KKworICAgICAgLy8gWzI3LjUuMi40LjRdIHB1dGJhY2sKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVHJpZXMgdG8gYmFjayB1cCB0aGUgaW5wdXQgc2VxdWVuY2UuCisgICAgICAgKiAgQHBhcmFtICBfX2MgIFRoZSBjaGFyYWN0ZXIgdG8gYmUgaW5zZXJ0ZWQgYmFjayBpbnRvIHRoZSBzZXF1ZW5jZS4KKyAgICAgICAqICBAcmV0dXJuICBlb2YoKSBvbiBmYWlsdXJlLCA8ZW0+c29tZSBvdGhlciB2YWx1ZTwvZW0+IG9uIHN1Y2Nlc3MKKyAgICAgICAqICBAcG9zdCAgVGhlIGNvbnN0cmFpbnRzIG9mIEBjIGdwdHIoKSwgQGMgZWJhY2soKSwgYW5kIEBjIHBwdHIoKQorICAgICAgICogICAgICAgICBhcmUgdGhlIHNhbWUgYXMgZm9yIEBjIHVuZGVyZmxvdygpLgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgQmFzZSBjbGFzcyB2ZXJzaW9uIGRvZXMgbm90aGluZywgcmV0dXJucyBlb2YoKS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGludF90eXBlIAorICAgICAgcGJhY2tmYWlsKGludF90eXBlIF9fYyAgPSB0cmFpdHNfdHlwZTo6ZW9mKCkpCisgICAgICB7IHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7IH0KKworICAgICAgLy8gUHV0IGFyZWE6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE11bHRpcGxlIGNoYXJhY3RlciBpbnNlcnRpb24uCisgICAgICAgKiAgQHBhcmFtICBfX3MgIEEgYnVmZmVyIGFyZWEuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gd3JpdGUuCisgICAgICAgKiAgQHJldHVybiAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4uCisgICAgICAgKgorICAgICAgICogIFdyaXRlcyBAYSBfX3NbMF0gdGhyb3VnaCBAYSBfX3NbX19uLTFdIHRvIHRoZSBvdXRwdXQgc2VxdWVuY2UsIGFzIGlmCisgICAgICAgKiAgYnkgQGMgc3B1dGMoKS4gIFN0b3BzIHdoZW4gZWl0aGVyIEBhIG4gY2hhcmFjdGVycyBoYXZlIGJlZW4KKyAgICAgICAqICBjb3BpZWQsIG9yIHdoZW4gQGMgc3B1dGMoKSB3b3VsZCByZXR1cm4gQGMgdHJhaXRzOjplb2YoKS4KKyAgICAgICAqCisgICAgICAgKiAgSXQgaXMgZXhwZWN0ZWQgdGhhdCBkZXJpdmVkIGNsYXNzZXMgcHJvdmlkZSBhIG1vcmUgZWZmaWNpZW50CisgICAgICAgKiAgaW1wbGVtZW50YXRpb24gYnkgb3ZlcnJpZGluZyB0aGlzIGRlZmluaXRpb24uCisgICAgICAqLworICAgICAgdmlydHVhbCBzdHJlYW1zaXplIAorICAgICAgeHNwdXRuKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbik7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3VtZXMgZGF0YSBmcm9tIHRoZSBidWZmZXI7IHdyaXRlcyB0byB0aGUKKyAgICAgICAqICAgICAgICAgIGNvbnRyb2xsZWQgc2VxdWVuY2UuCisgICAgICAgKiAgQHBhcmFtICBfX2MgIEFuIGFkZGl0aW9uYWwgY2hhcmFjdGVyIHRvIGNvbnN1bWUuCisgICAgICAgKiAgQHJldHVybiAgZW9mKCkgdG8gaW5kaWNhdGUgZmFpbHVyZSwgc29tZXRoaW5nIGVsc2UgKHVzdWFsbHkKKyAgICAgICAqICAgICAgICAgICBAYSBfX2MsIG9yIG5vdF9lb2YoKSkKKyAgICAgICAqCisgICAgICAgKiAgSW5mb3JtYWxseSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlcgorICAgICAgICogIGlzIGZ1bGwgKG9yIGRvZXMgbm90IGV4aXN0LCBhcyBidWZmZXJpbmcgbmVlZCBub3QgYWN0dWFsbHkKKyAgICAgICAqICBiZSBkb25lKS4gIElmIGEgYnVmZmVyIGV4aXN0cywgaXQgaXMgQGEgY29uc3VtZWQsIHdpdGgKKyAgICAgICAqICA8ZW0+c29tZSBlZmZlY3Q8L2VtPiBvbiB0aGUgY29udHJvbGxlZCBzZXF1ZW5jZS4KKyAgICAgICAqICAoVHlwaWNhbGx5LCB0aGUgYnVmZmVyIGlzIHdyaXR0ZW4gb3V0IHRvIHRoZSBzZXF1ZW5jZQorICAgICAgICogIHZlcmJhdGltLikgIEluIGVpdGhlciBjYXNlLCB0aGUgY2hhcmFjdGVyIEBhIGMgaXMgYWxzbworICAgICAgICogIHdyaXR0ZW4gb3V0LCBpZiBAYSBfX2MgaXMgbm90IEBjIGVvZigpLgorICAgICAgICoKKyAgICAgICAqICBGb3IgYSBmb3JtYWwgZGVmaW5pdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLCBzZWUgYSBnb29kIHRleHQKKyAgICAgICAqICBzdWNoIGFzIExhbmdlciAmIEtyZWZ0LCBvciBbMjcuNS4yLjQuNV0vMy03LgorICAgICAgICoKKyAgICAgICAqICBBIGZ1bmN0aW9uaW5nIG91dHB1dCBzdHJlYW1idWYgY2FuIGJlIGNyZWF0ZWQgYnkgb3ZlcnJpZGluZyBvbmx5CisgICAgICAgKiAgdGhpcyBmdW5jdGlvbiAobm8gYnVmZmVyIGFyZWEgd2lsbCBiZSB1c2VkKS4KKyAgICAgICAqCisgICAgICAgKiAgQG5vdGUgIEJhc2UgY2xhc3MgdmVyc2lvbiBkb2VzIG5vdGhpbmcsIHJldHVybnMgZW9mKCkuCisgICAgICAqLworICAgICAgdmlydHVhbCBpbnRfdHlwZSAKKyAgICAgIG92ZXJmbG93KGludF90eXBlIF9fYyAgPSB0cmFpdHNfdHlwZTo6ZW9mKCkpCisgICAgICB7IHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7IH0KKworI2lmIF9HTElCQ1hYX1VTRV9ERVBSRUNBVEVECisgICAgLy8gQW5uZXggRC42CisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUb3NzZXMgYSBjaGFyYWN0ZXIuCisgICAgICAgKgorICAgICAgICogIEFkdmFuY2VzIHRoZSByZWFkIHBvaW50ZXIsIGlnbm9yaW5nIHRoZSBjaGFyYWN0ZXIgdGhhdCB3b3VsZCBoYXZlCisgICAgICAgKiAgYmVlbiByZWFkLgorICAgICAgICoKKyAgICAgICAqICBTZWUgaHR0cDovL2djYy5nbnUub3JnL21sL2xpYnN0ZGMrKy8yMDAyLTA1L21zZzAwMTY4Lmh0bWwKKyAgICAgICAqLworICAgICAgdm9pZCAKKyAgICAgIHN0b3NzYygpIAorICAgICAgeworCWlmICh0aGlzLT5ncHRyKCkgPCB0aGlzLT5lZ3B0cigpKSAKKwkgIHRoaXMtPmdidW1wKDEpOworCWVsc2UgCisJICB0aGlzLT51ZmxvdygpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vIEFsc28gdXNlZCBieSBzcGVjaWFsaXphdGlvbnMgZm9yIGNoYXIgYW5kIHdjaGFyX3QgaW4gc3JjLgorICAgICAgdm9pZCAKKyAgICAgIF9fc2FmZV9nYnVtcChzdHJlYW1zaXplIF9fbikgeyBfTV9pbl9jdXIgKz0gX19uOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9fc2FmZV9wYnVtcChzdHJlYW1zaXplIF9fbikgeyBfTV9vdXRfY3VyICs9IF9fbjsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIFNpZGUgZWZmZWN0IG9mIERSIDUwLiAKKyAgICAgIGJhc2ljX3N0cmVhbWJ1Zihjb25zdCBiYXNpY19zdHJlYW1idWYmIF9fc2IpCisgICAgICA6IF9NX2luX2JlZyhfX3NiLl9NX2luX2JlZyksIF9NX2luX2N1cihfX3NiLl9NX2luX2N1ciksIAorICAgICAgX01faW5fZW5kKF9fc2IuX01faW5fZW5kKSwgX01fb3V0X2JlZyhfX3NiLl9NX291dF9iZWcpLCAKKyAgICAgIF9NX291dF9jdXIoX19zYi5fTV9vdXRfY3VyKSwgX01fb3V0X2VuZChfX3NiLl9NX291dF9jdXIpLAorICAgICAgX01fYnVmX2xvY2FsZShfX3NiLl9NX2J1Zl9sb2NhbGUpIAorICAgICAgeyB9CisKKyAgICAgIGJhc2ljX3N0cmVhbWJ1ZiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBiYXNpY19zdHJlYW1idWYmKSB7IHJldHVybiAqdGhpczsgfTsKKyAgICB9OworCisgIC8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGRlY2xhcmF0aW9ucywgZGVmaW5lZCBpbiBzcmMvc3RyZWFtYnVmLmNjLgorICB0ZW1wbGF0ZTw+CisgICAgc3RyZWFtc2l6ZQorICAgIF9fY29weV9zdHJlYW1idWZzX2VvZihiYXNpY19zdHJlYW1idWY8Y2hhcj4qIF9fc2JpbiwKKwkJCSAgYmFzaWNfc3RyZWFtYnVmPGNoYXI+KiBfX3Nib3V0LCBib29sJiBfX2luZW9mKTsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+CisgICAgc3RyZWFtc2l6ZQorICAgIF9fY29weV9zdHJlYW1idWZzX2VvZihiYXNpY19zdHJlYW1idWY8d2NoYXJfdD4qIF9fc2JpbiwKKwkJCSAgYmFzaWNfc3RyZWFtYnVmPHdjaGFyX3Q+KiBfX3Nib3V0LCBib29sJiBfX2luZW9mKTsKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNpbmNsdWRlIDxiaXRzL3N0cmVhbWJ1Zi50Y2M+CisKKyNlbmRpZiAvKiBfR0xJQkNYWF9TVFJFQU1CVUYgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80Ljgvc3RyaW5nIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9zdHJpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNhZTNiNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80Ljgvc3RyaW5nCkBAIC0wLDAgKzEsNTUgQEAKKy8vIENvbXBvbmVudHMgZm9yIG1hbmlwdWxhdGluZyBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9zdHJpbmcKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMSAgU3RyaW5ncyBsaWJyYXJ5CisvLworCisjaWZuZGVmIF9HTElCQ1hYX1NUUklORworI2RlZmluZSBfR0xJQkNYWF9TVFJJTkcJMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvc3RyaW5nZndkLmg+CisjaW5jbHVkZSA8Yml0cy9jaGFyX3RyYWl0cy5oPiAgLy8gTkI6IEluIHR1cm4gaW5jbHVkZXMgc3RsX2FsZ29iYXNlLmgKKyNpbmNsdWRlIDxiaXRzL2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGJpdHMvY3BwX3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8Yml0cy9sb2NhbGVmd2QuaD4gICAgLy8gRm9yIG9wZXJhdG9ycyA+PiwgPDwsIGFuZCBnZXRsaW5lLgorI2luY2x1ZGUgPGJpdHMvb3N0cmVhbV9pbnNlcnQuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9pdGVyYXRvcl9iYXNlX3R5cGVzLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3JfYmFzZV9mdW5jcy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfZnVuY3Rpb24uaD4gLy8gRm9yIGxlc3MKKyNpbmNsdWRlIDxleHQvbnVtZXJpY190cmFpdHMuaD4gCisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4gCisjaW5jbHVkZSA8Yml0cy9yYW5nZV9hY2Nlc3MuaD4KKyNpbmNsdWRlIDxiaXRzL2Jhc2ljX3N0cmluZy5oPgorI2luY2x1ZGUgPGJpdHMvYmFzaWNfc3RyaW5nLnRjYz4gCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9TVFJJTkcgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80Ljgvc3lzdGVtX2Vycm9yIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC9zeXN0ZW1fZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYzYjc0ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80Ljgvc3lzdGVtX2Vycm9yCkBAIC0wLDAgKzEsMzc4IEBACisvLyA8c3lzdGVtX2Vycm9yPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9zeXN0ZW1fZXJyb3IKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfU1lTVEVNX0VSUk9SCisjZGVmaW5lIF9HTElCQ1hYX1NZU1RFTV9FUlJPUiAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvZXJyb3JfY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIGNsYXNzIGVycm9yX2NvZGU7CisgIGNsYXNzIGVycm9yX2NvbmRpdGlvbjsKKyAgY2xhc3MgZXJyb3JfY2F0ZWdvcnk7CisgIGNsYXNzIHN5c3RlbV9lcnJvcjsKKworICAvLy8gaXNfZXJyb3JfY29kZV9lbnVtCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfZXJyb3JfY29kZV9lbnVtIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIC8vLyBpc19lcnJvcl9jb25kaXRpb25fZW51bQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2Vycm9yX2NvbmRpdGlvbl9lbnVtIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPD4gCisgICAgc3RydWN0IGlzX2Vycm9yX2NvbmRpdGlvbl9lbnVtPGVycmM+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworCisgIC8vLyBlcnJvcl9jYXRlZ29yeQorICBjbGFzcyBlcnJvcl9jYXRlZ29yeQorICB7CisgIHByb3RlY3RlZDoKKyAgICBlcnJvcl9jYXRlZ29yeSgpIG5vZXhjZXB0OworCisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5lcnJvcl9jYXRlZ29yeSgpIG5vZXhjZXB0OworCisgICAgZXJyb3JfY2F0ZWdvcnkoY29uc3QgZXJyb3JfY2F0ZWdvcnkmKSA9IGRlbGV0ZTsKKyAgICBlcnJvcl9jYXRlZ29yeSYgb3BlcmF0b3I9KGNvbnN0IGVycm9yX2NhdGVnb3J5JikgPSBkZWxldGU7CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIAorICAgIG5hbWUoKSBjb25zdCBub2V4Y2VwdCA9IDA7CisKKyAgICB2aXJ0dWFsIHN0cmluZyAKKyAgICBtZXNzYWdlKGludCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBlcnJvcl9jb25kaXRpb24KKyAgICBkZWZhdWx0X2Vycm9yX2NvbmRpdGlvbihpbnQgX19pKSBjb25zdCBub2V4Y2VwdDsKKworICAgIHZpcnR1YWwgYm9vbCAKKyAgICBlcXVpdmFsZW50KGludCBfX2ksIGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX19jb25kKSBjb25zdCBub2V4Y2VwdDsKKworICAgIHZpcnR1YWwgYm9vbCAKKyAgICBlcXVpdmFsZW50KGNvbnN0IGVycm9yX2NvZGUmIF9fY29kZSwgaW50IF9faSkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICBib29sIAorICAgIG9wZXJhdG9yPChjb25zdCBlcnJvcl9jYXRlZ29yeSYgX19vdGhlcikgY29uc3Qgbm9leGNlcHQKKyAgICB7IHJldHVybiBsZXNzPGNvbnN0IGVycm9yX2NhdGVnb3J5Kj4oKSh0aGlzLCAmX19vdGhlcik7IH0KKworICAgIGJvb2wgCisgICAgb3BlcmF0b3I9PShjb25zdCBlcnJvcl9jYXRlZ29yeSYgX19vdGhlcikgY29uc3Qgbm9leGNlcHQKKyAgICB7IHJldHVybiB0aGlzID09ICZfX290aGVyOyB9CisKKyAgICBib29sIAorICAgIG9wZXJhdG9yIT0oY29uc3QgZXJyb3JfY2F0ZWdvcnkmIF9fb3RoZXIpIGNvbnN0IG5vZXhjZXB0CisgICAgeyByZXR1cm4gdGhpcyAhPSAmX19vdGhlcjsgfQorICB9OworCisgIC8vIERSIDg5MC4KKyAgX0dMSUJDWFhfQ09OU1QgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIHN5c3RlbV9jYXRlZ29yeSgpIG5vZXhjZXB0OworICBfR0xJQkNYWF9DT05TVCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgZ2VuZXJpY19jYXRlZ29yeSgpIG5vZXhjZXB0OworCisgIGVycm9yX2NvZGUgbWFrZV9lcnJvcl9jb2RlKGVycmMpIG5vZXhjZXB0OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzaDsKKworICAvLy8gZXJyb3JfY29kZQorICAvLyBJbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBlcnJvciBpZGVudGlmaWNhdGlvbgorICBzdHJ1Y3QgZXJyb3JfY29kZQorICB7CisgICAgZXJyb3JfY29kZSgpIG5vZXhjZXB0CisgICAgOiBfTV92YWx1ZSgwKSwgX01fY2F0KCZzeXN0ZW1fY2F0ZWdvcnkoKSkgeyB9CisKKyAgICBlcnJvcl9jb2RlKGludCBfX3YsIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBfX2NhdCkgbm9leGNlcHQKKyAgICA6IF9NX3ZhbHVlKF9fdiksIF9NX2NhdCgmX19jYXQpIHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Vycm9yQ29kZUVudW0sIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgIGVuYWJsZV9pZjxpc19lcnJvcl9jb2RlX2VudW08X0Vycm9yQ29kZUVudW0+Ojp2YWx1ZT46OnR5cGU+CisgICAgICBlcnJvcl9jb2RlKF9FcnJvckNvZGVFbnVtIF9fZSkgbm9leGNlcHQKKyAgICAgIHsgKnRoaXMgPSBtYWtlX2Vycm9yX2NvZGUoX19lKTsgfQorCisgICAgdm9pZCAKKyAgICBhc3NpZ24oaW50IF9fdiwgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIF9fY2F0KSBub2V4Y2VwdAorICAgIHsKKyAgICAgIF9NX3ZhbHVlID0gX192OworICAgICAgX01fY2F0ID0gJl9fY2F0OyAKKyAgICB9CisKKyAgICB2b2lkIAorICAgIGNsZWFyKCkgbm9leGNlcHQKKyAgICB7IGFzc2lnbigwLCBzeXN0ZW1fY2F0ZWdvcnkoKSk7IH0KKworICAgIC8vIERSIDgwNC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXJyb3JDb2RlRW51bT4KKyAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxpc19lcnJvcl9jb2RlX2VudW08X0Vycm9yQ29kZUVudW0+Ojp2YWx1ZSwKKwkJCSBlcnJvcl9jb2RlJj46OnR5cGUKKyAgICAgIG9wZXJhdG9yPShfRXJyb3JDb2RlRW51bSBfX2UpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiAqdGhpcyA9IG1ha2VfZXJyb3JfY29kZShfX2UpOyB9CisKKyAgICBpbnQKKyAgICB2YWx1ZSgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuIF9NX3ZhbHVlOyB9CisgICAgICAKKyAgICBjb25zdCBlcnJvcl9jYXRlZ29yeSYgIAorICAgIGNhdGVnb3J5KCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gKl9NX2NhdDsgfQorCisgICAgZXJyb3JfY29uZGl0aW9uIAorICAgIGRlZmF1bHRfZXJyb3JfY29uZGl0aW9uKCkgY29uc3Qgbm9leGNlcHQ7CisKKyAgICBzdHJpbmcgCisgICAgbWVzc2FnZSgpIGNvbnN0CisgICAgeyByZXR1cm4gY2F0ZWdvcnkoKS5tZXNzYWdlKHZhbHVlKCkpOyB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7IHJldHVybiBfTV92YWx1ZSAhPSAwID8gdHJ1ZSA6IGZhbHNlOyB9CisKKyAgICAvLyBEUiA4MDQuCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIGhhc2g8ZXJyb3JfY29kZT47CisKKyAgICBpbnQgICAgICAgICAgICAJCV9NX3ZhbHVlOworICAgIGNvbnN0IGVycm9yX2NhdGVnb3J5KiAJX01fY2F0OworICB9OworCisgIC8vIDE5LjQuMi42IG5vbi1tZW1iZXIgZnVuY3Rpb25zCisgIGlubGluZSBlcnJvcl9jb2RlCisgIG1ha2VfZXJyb3JfY29kZShlcnJjIF9fZSkgbm9leGNlcHQKKyAgeyByZXR1cm4gZXJyb3JfY29kZShzdGF0aWNfY2FzdDxpbnQ+KF9fZSksIGdlbmVyaWNfY2F0ZWdvcnkoKSk7IH0KKworICBpbmxpbmUgYm9vbAorICBvcGVyYXRvcjwoY29uc3QgZXJyb3JfY29kZSYgX19saHMsIGNvbnN0IGVycm9yX2NvZGUmIF9fcmhzKSBub2V4Y2VwdAorICB7IAorICAgIHJldHVybiAoX19saHMuY2F0ZWdvcnkoKSA8IF9fcmhzLmNhdGVnb3J5KCkKKwkgICAgfHwgKF9fbGhzLmNhdGVnb3J5KCkgPT0gX19yaHMuY2F0ZWdvcnkoKQorCQkmJiBfX2xocy52YWx1ZSgpIDwgX19yaHMudmFsdWUoKSkpOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgY29uc3QgZXJyb3JfY29kZSYgX19lKQorICAgIHsgcmV0dXJuIChfX29zIDw8IF9fZS5jYXRlZ29yeSgpLm5hbWUoKSA8PCAnOicgPDwgX19lLnZhbHVlKCkpOyB9CisKKyAgZXJyb3JfY29uZGl0aW9uIG1ha2VfZXJyb3JfY29uZGl0aW9uKGVycmMpIG5vZXhjZXB0OworCisgIC8vLyBlcnJvcl9jb25kaXRpb24KKyAgLy8gUG9ydGFibGUgZXJyb3IgaWRlbnRpZmljYXRpb24KKyAgc3RydWN0IGVycm9yX2NvbmRpdGlvbiAKKyAgeworICAgIGVycm9yX2NvbmRpdGlvbigpIG5vZXhjZXB0CisgICAgOiBfTV92YWx1ZSgwKSwgX01fY2F0KCZnZW5lcmljX2NhdGVnb3J5KCkpIHsgfQorCisgICAgZXJyb3JfY29uZGl0aW9uKGludCBfX3YsIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBfX2NhdCkgbm9leGNlcHQKKyAgICA6IF9NX3ZhbHVlKF9fdiksIF9NX2NhdCgmX19jYXQpIHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Vycm9yQ29uZGl0aW9uRW51bSwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSBlbmFibGVfaWY8aXNfZXJyb3JfY29uZGl0aW9uX2VudW08X0Vycm9yQ29uZGl0aW9uRW51bT46OnZhbHVlPjo6dHlwZT4KKyAgICAgIGVycm9yX2NvbmRpdGlvbihfRXJyb3JDb25kaXRpb25FbnVtIF9fZSkgbm9leGNlcHQKKyAgICAgIHsgKnRoaXMgPSBtYWtlX2Vycm9yX2NvbmRpdGlvbihfX2UpOyB9CisKKyAgICB2b2lkCisgICAgYXNzaWduKGludCBfX3YsIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBfX2NhdCkgbm9leGNlcHQKKyAgICB7CisgICAgICBfTV92YWx1ZSA9IF9fdjsKKyAgICAgIF9NX2NhdCA9ICZfX2NhdDsKKyAgICB9CisKKyAgICAvLyBEUiA4MDQuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Vycm9yQ29uZGl0aW9uRW51bT4KKyAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxpc19lcnJvcl9jb25kaXRpb25fZW51bQorCQkJIDxfRXJyb3JDb25kaXRpb25FbnVtPjo6dmFsdWUsIGVycm9yX2NvbmRpdGlvbiY+Ojp0eXBlCisgICAgICBvcGVyYXRvcj0oX0Vycm9yQ29uZGl0aW9uRW51bSBfX2UpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiAqdGhpcyA9IG1ha2VfZXJyb3JfY29uZGl0aW9uKF9fZSk7IH0KKworICAgIHZvaWQgCisgICAgY2xlYXIoKSBub2V4Y2VwdAorICAgIHsgYXNzaWduKDAsIGdlbmVyaWNfY2F0ZWdvcnkoKSk7IH0KKworICAgIC8vIDE5LjQuMy40IG9ic2VydmVycworICAgIGludAorICAgIHZhbHVlKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gX01fdmFsdWU7IH0KKworICAgIGNvbnN0IGVycm9yX2NhdGVnb3J5JgorICAgIGNhdGVnb3J5KCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gKl9NX2NhdDsgfQorCisgICAgc3RyaW5nIAorICAgIG1lc3NhZ2UoKSBjb25zdAorICAgIHsgcmV0dXJuIGNhdGVnb3J5KCkubWVzc2FnZSh2YWx1ZSgpKTsgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IG5vZXhjZXB0CisgICAgeyByZXR1cm4gX01fdmFsdWUgIT0gMCA/IHRydWUgOiBmYWxzZTsgfQorCisgICAgLy8gRFIgODA0LgorICBwcml2YXRlOgorICAgIGludCAJCQlfTV92YWx1ZTsKKyAgICBjb25zdCBlcnJvcl9jYXRlZ29yeSogCV9NX2NhdDsKKyAgfTsKKworICAvLyAxOS40LjMuNiBub24tbWVtYmVyIGZ1bmN0aW9ucworICBpbmxpbmUgZXJyb3JfY29uZGl0aW9uCisgIG1ha2VfZXJyb3JfY29uZGl0aW9uKGVycmMgX19lKSBub2V4Y2VwdAorICB7IHJldHVybiBlcnJvcl9jb25kaXRpb24oc3RhdGljX2Nhc3Q8aW50PihfX2UpLCBnZW5lcmljX2NhdGVnb3J5KCkpOyB9CisKKyAgaW5saW5lIGJvb2wgCisgIG9wZXJhdG9yPChjb25zdCBlcnJvcl9jb25kaXRpb24mIF9fbGhzLAorCSAgICBjb25zdCBlcnJvcl9jb25kaXRpb24mIF9fcmhzKSBub2V4Y2VwdAorICB7CisgICAgcmV0dXJuIChfX2xocy5jYXRlZ29yeSgpIDwgX19yaHMuY2F0ZWdvcnkoKQorCSAgICB8fCAoX19saHMuY2F0ZWdvcnkoKSA9PSBfX3Jocy5jYXRlZ29yeSgpCisJCSYmIF9fbGhzLnZhbHVlKCkgPCBfX3Jocy52YWx1ZSgpKSk7CisgIH0KKworICAvLyAxOS40LjQgQ29tcGFyaXNvbiBvcGVyYXRvcnMKKyAgaW5saW5lIGJvb2wKKyAgb3BlcmF0b3I9PShjb25zdCBlcnJvcl9jb2RlJiBfX2xocywgY29uc3QgZXJyb3JfY29kZSYgX19yaHMpIG5vZXhjZXB0CisgIHsgcmV0dXJuIChfX2xocy5jYXRlZ29yeSgpID09IF9fcmhzLmNhdGVnb3J5KCkKKwkgICAgJiYgX19saHMudmFsdWUoKSA9PSBfX3Jocy52YWx1ZSgpKTsgfQorCisgIGlubGluZSBib29sCisgIG9wZXJhdG9yPT0oY29uc3QgZXJyb3JfY29kZSYgX19saHMsIGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX19yaHMpIG5vZXhjZXB0CisgIHsKKyAgICByZXR1cm4gKF9fbGhzLmNhdGVnb3J5KCkuZXF1aXZhbGVudChfX2xocy52YWx1ZSgpLCBfX3JocykKKwkgICAgfHwgX19yaHMuY2F0ZWdvcnkoKS5lcXVpdmFsZW50KF9fbGhzLCBfX3Jocy52YWx1ZSgpKSk7CisgIH0KKworICBpbmxpbmUgYm9vbAorICBvcGVyYXRvcj09KGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX19saHMsIGNvbnN0IGVycm9yX2NvZGUmIF9fcmhzKSBub2V4Y2VwdAorICB7CisgICAgcmV0dXJuIChfX3Jocy5jYXRlZ29yeSgpLmVxdWl2YWxlbnQoX19yaHMudmFsdWUoKSwgX19saHMpCisJICAgIHx8IF9fbGhzLmNhdGVnb3J5KCkuZXF1aXZhbGVudChfX3JocywgX19saHMudmFsdWUoKSkpOworICB9CisKKyAgaW5saW5lIGJvb2wKKyAgb3BlcmF0b3I9PShjb25zdCBlcnJvcl9jb25kaXRpb24mIF9fbGhzLAorCSAgICAgY29uc3QgZXJyb3JfY29uZGl0aW9uJiBfX3Jocykgbm9leGNlcHQKKyAgeworICAgIHJldHVybiAoX19saHMuY2F0ZWdvcnkoKSA9PSBfX3Jocy5jYXRlZ29yeSgpCisJICAgICYmIF9fbGhzLnZhbHVlKCkgPT0gX19yaHMudmFsdWUoKSk7CisgIH0KKworICBpbmxpbmUgYm9vbAorICBvcGVyYXRvciE9KGNvbnN0IGVycm9yX2NvZGUmIF9fbGhzLCBjb25zdCBlcnJvcl9jb2RlJiBfX3Jocykgbm9leGNlcHQKKyAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICBpbmxpbmUgYm9vbAorICBvcGVyYXRvciE9KGNvbnN0IGVycm9yX2NvZGUmIF9fbGhzLCBjb25zdCBlcnJvcl9jb25kaXRpb24mIF9fcmhzKSBub2V4Y2VwdAorICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgIGlubGluZSBib29sCisgIG9wZXJhdG9yIT0oY29uc3QgZXJyb3JfY29uZGl0aW9uJiBfX2xocywgY29uc3QgZXJyb3JfY29kZSYgX19yaHMpIG5vZXhjZXB0CisgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgb3BlcmF0b3IhPShjb25zdCBlcnJvcl9jb25kaXRpb24mIF9fbGhzLAorCSAgICAgY29uc3QgZXJyb3JfY29uZGl0aW9uJiBfX3Jocykgbm9leGNlcHQKKyAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworCisgIC8qKiAKKyAgICogIEBicmllZiBUaHJvd24gdG8gaW5kaWNhdGUgZXJyb3IgY29kZSBvZiB1bmRlcmx5aW5nIHN5c3RlbS4KKyAgICoKKyAgICogIEBpbmdyb3VwIGV4Y2VwdGlvbnMKKyAgICovCisgIGNsYXNzIHN5c3RlbV9lcnJvciA6IHB1YmxpYyBzdGQ6OnJ1bnRpbWVfZXJyb3IKKyAgeworICBwcml2YXRlOgorICAgIGVycm9yX2NvZGUgCV9NX2NvZGU7CisKKyAgcHVibGljOgorICAgIHN5c3RlbV9lcnJvcihlcnJvcl9jb2RlIF9fZWMgPSBlcnJvcl9jb2RlKCkpCisgICAgOiBydW50aW1lX2Vycm9yKF9fZWMubWVzc2FnZSgpKSwgX01fY29kZShfX2VjKSB7IH0KKworICAgIHN5c3RlbV9lcnJvcihlcnJvcl9jb2RlIF9fZWMsIGNvbnN0IHN0cmluZyYgX193aGF0KQorICAgIDogcnVudGltZV9lcnJvcihfX3doYXQgKyAiOiAiICsgX19lYy5tZXNzYWdlKCkpLCBfTV9jb2RlKF9fZWMpIHsgfQorCisgICAgLyoKKyAgICAgKiBUT0RPOiBBZGQgY29uc3QgY2hhciogY3RvcnMgdG8gYWxsIGV4Y2VwdGlvbnMuCisgICAgICoKKyAgICAgKiBzeXN0ZW1fZXJyb3IoZXJyb3JfY29kZSBfX2VjLCBjb25zdCBjaGFyKiBfX3doYXQpCisgICAgICogOiBydW50aW1lX2Vycm9yKF9fd2hhdCArICgiOiAiICsgX19lYy5tZXNzYWdlKCkpKSwgX01fY29kZShfX2VjKSB7IH0KKyAgICAgKgorICAgICAqIHN5c3RlbV9lcnJvcihpbnQgX192LCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgX19lY2F0LCBjb25zdCBjaGFyKiBfX3doYXQpCisgICAgICogOiBydW50aW1lX2Vycm9yKF9fd2hhdCArICgiOiAiICsgX19lYy5tZXNzYWdlKCkpKSwKKyAgICAgKiAgIF9NX2NvZGUoZXJyb3JfY29kZShfX3YsIF9fZWNhdCkpIHsgfQorICAgICAqLworCisgICAgc3lzdGVtX2Vycm9yKGludCBfX3YsIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBfX2VjYXQpCisgICAgOiBydW50aW1lX2Vycm9yKGVycm9yX2NvZGUoX192LCBfX2VjYXQpLm1lc3NhZ2UoKSksCisgICAgICBfTV9jb2RlKF9fdiwgX19lY2F0KSB7IH0KKworICAgIHN5c3RlbV9lcnJvcihpbnQgX192LCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgX19lY2F0LCBjb25zdCBzdHJpbmcmIF9fd2hhdCkKKyAgICA6IHJ1bnRpbWVfZXJyb3IoX193aGF0ICsgIjogIiArIGVycm9yX2NvZGUoX192LCBfX2VjYXQpLm1lc3NhZ2UoKSksCisgICAgICBfTV9jb2RlKF9fdiwgX19lY2F0KSB7IH0KKworICAgIHZpcnR1YWwgfnN5c3RlbV9lcnJvcigpIG5vZXhjZXB0OworCisgICAgY29uc3QgZXJyb3JfY29kZSYgCisgICAgY29kZSgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuIF9NX2NvZGU7IH0KKyAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjaWZuZGVmIF9HTElCQ1hYX0NPTVBBVElCSUxJVFlfQ1hYMFgKKworI2luY2x1ZGUgPGJpdHMvZnVuY3Rpb25hbF9oYXNoLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBEUiAxMTgyLgorICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciBlcnJvcl9jb2RlLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8ZXJyb3JfY29kZT4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIGVycm9yX2NvZGU+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IGVycm9yX2NvZGUmIF9fZSkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsKKwljb25zdCBzaXplX3QgX190bXAgPSBzdGQ6Ol9IYXNoX2ltcGw6Omhhc2goX19lLl9NX3ZhbHVlKTsKKwlyZXR1cm4gc3RkOjpfSGFzaF9pbXBsOjpfX2hhc2hfY29tYmluZShfX2UuX01fY2F0LCBfX3RtcCk7CisgICAgICB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gX0dMSUJDWFhfQ09NUEFUSUJJTElUWV9DWFgwWAorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vIF9HTElCQ1hYX1NZU1RFTV9FUlJPUgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90Z21hdGguaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdGdtYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ5ZTUzNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdGdtYXRoLmgKQEAgLTAsMCArMSw0MiBAQAorLy8gLSotIEMrKyAtKi0gY29tcGF0aWJpbGl0eSBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0Z21hdGguaAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjIGluY2x1ZGUgPGN0Z21hdGg+CisjZWxzZQorIyBpZiBfR0xJQkNYWF9IQVZFX1RHTUFUSF9ICisjICBpbmNsdWRlX25leHQgPHRnbWF0aC5oPgorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfVEdNQVRIX0gKKyNkZWZpbmUgX0dMSUJDWFhfVEdNQVRIX0ggMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdGhyZWFkIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90aHJlYWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU3ZTIxYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdGhyZWFkCkBAIC0wLDAgKzEsMzAyIEBACisvLyA8dGhyZWFkPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS90aHJlYWQKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVEhSRUFECisjZGVmaW5lIF9HTElCQ1hYX1RIUkVBRCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPgorI2luY2x1ZGUgPGJpdHMvZnVuY3Rpb25hbF9oYXNoLmg+CisjaW5jbHVkZSA8Yml0cy9ndGhyLmg+CisKKyNpZiBkZWZpbmVkKF9HTElCQ1hYX0hBU19HVEhSRUFEUykgJiYgZGVmaW5lZChfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEpCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGRlZmdyb3VwIHRocmVhZHMgVGhyZWFkcworICAgKiBAaW5ncm91cCBjb25jdXJyZW5jeQorICAgKgorICAgKiBDbGFzc2VzIGZvciB0aHJlYWQgc3VwcG9ydC4KKyAgICogQHsKKyAgICovCisKKyAgLy8vIHRocmVhZAorICBjbGFzcyB0aHJlYWQKKyAgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfX2d0aHJlYWRfdAkJCW5hdGl2ZV9oYW5kbGVfdHlwZTsKKyAgICBzdHJ1Y3QgX0ltcGxfYmFzZTsKKyAgICB0eXBlZGVmIHNoYXJlZF9wdHI8X0ltcGxfYmFzZT4JX19zaGFyZWRfYmFzZV90eXBlOworCisgICAgLy8vIHRocmVhZDo6aWQKKyAgICBjbGFzcyBpZAorICAgIHsKKyAgICAgIG5hdGl2ZV9oYW5kbGVfdHlwZQlfTV90aHJlYWQ7CisKKyAgICBwdWJsaWM6CisgICAgICBpZCgpIG5vZXhjZXB0IDogX01fdGhyZWFkKCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBpZChuYXRpdmVfaGFuZGxlX3R5cGUgX19pZCkgOiBfTV90aHJlYWQoX19pZCkgeyB9CisKKyAgICBwcml2YXRlOgorICAgICAgZnJpZW5kIGNsYXNzIHRocmVhZDsKKyAgICAgIGZyaWVuZCBjbGFzcyBoYXNoPHRocmVhZDo6aWQ+OworCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PSh0aHJlYWQ6OmlkIF9feCwgdGhyZWFkOjppZCBfX3kpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX2d0aHJlYWRfZXF1YWwoX194Ll9NX3RocmVhZCwgX195Ll9NX3RocmVhZCk7IH0KKworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPCh0aHJlYWQ6OmlkIF9feCwgdGhyZWFkOjppZCBfX3kpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX3guX01fdGhyZWFkIDwgX195Ll9NX3RocmVhZDsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisJZnJpZW5kIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vdXQsIHRocmVhZDo6aWQgX19pZCk7CisgICAgfTsKKworICAgIC8vIFNpbXBsZSBiYXNlIHR5cGUgdGhhdCB0aGUgdGVtcGxhdGl6ZWQsIGRlcml2ZWQgY2xhc3MgY29udGFpbmluZworICAgIC8vIGFuIGFyYml0cmFyeSBmdW5jdG9yIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYW5kIGNhbGxlZC4KKyAgICBzdHJ1Y3QgX0ltcGxfYmFzZQorICAgIHsKKyAgICAgIF9fc2hhcmVkX2Jhc2VfdHlwZQlfTV90aGlzX3B0cjsKKworICAgICAgaW5saW5lIHZpcnR1YWwgfl9JbXBsX2Jhc2UoKTsKKworICAgICAgdmlydHVhbCB2b2lkIF9NX3J1bigpID0gMDsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NhbGxhYmxlPgorICAgICAgc3RydWN0IF9JbXBsIDogcHVibGljIF9JbXBsX2Jhc2UKKyAgICAgIHsKKwlfQ2FsbGFibGUJCV9NX2Z1bmM7CisKKwlfSW1wbChfQ2FsbGFibGUmJiBfX2YpIDogX01fZnVuYyhzdGQ6OmZvcndhcmQ8X0NhbGxhYmxlPihfX2YpKQorCXsgfQorCisJdm9pZAorCV9NX3J1bigpIHsgX01fZnVuYygpOyB9CisgICAgICB9OworCisgIHByaXZhdGU6CisgICAgaWQJCQkJX01faWQ7CisKKyAgcHVibGljOgorICAgIHRocmVhZCgpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKyAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgLy8gMjA5Ny4gIHBhY2thZ2VkX3Rhc2sgY29uc3RydWN0b3JzIHNob3VsZCBiZSBjb25zdHJhaW5lZAorICAgIHRocmVhZCh0aHJlYWQmKSA9IGRlbGV0ZTsKKyAgICB0aHJlYWQoY29uc3QgdGhyZWFkJikgPSBkZWxldGU7CisKKyAgICB0aHJlYWQodGhyZWFkJiYgX190KSBub2V4Y2VwdAorICAgIHsgc3dhcChfX3QpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2FsbGFibGUsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgZXhwbGljaXQgCisgICAgICB0aHJlYWQoX0NhbGxhYmxlJiYgX19mLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIHsKKyAgICAgICAgX01fc3RhcnRfdGhyZWFkKF9NX21ha2Vfcm91dGluZShzdGQ6Ol9fYmluZF9zaW1wbGUoCisgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkPF9DYWxsYWJsZT4oX19mKSwKKyAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKSk7CisgICAgICB9CisKKyAgICB+dGhyZWFkKCkKKyAgICB7CisgICAgICBpZiAoam9pbmFibGUoKSkKKwlzdGQ6OnRlcm1pbmF0ZSgpOworICAgIH0KKworICAgIHRocmVhZCYgb3BlcmF0b3I9KGNvbnN0IHRocmVhZCYpID0gZGVsZXRlOworCisgICAgdGhyZWFkJiBvcGVyYXRvcj0odGhyZWFkJiYgX190KSBub2V4Y2VwdAorICAgIHsKKyAgICAgIGlmIChqb2luYWJsZSgpKQorCXN0ZDo6dGVybWluYXRlKCk7CisgICAgICBzd2FwKF9fdCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdm9pZAorICAgIHN3YXAodGhyZWFkJiBfX3QpIG5vZXhjZXB0CisgICAgeyBzdGQ6OnN3YXAoX01faWQsIF9fdC5fTV9pZCk7IH0KKworICAgIGJvb2wKKyAgICBqb2luYWJsZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgeyByZXR1cm4gIShfTV9pZCA9PSBpZCgpKTsgfQorCisgICAgdm9pZAorICAgIGpvaW4oKTsKKworICAgIHZvaWQKKyAgICBkZXRhY2goKTsKKworICAgIHRocmVhZDo6aWQKKyAgICBnZXRfaWQoKSBjb25zdCBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9NX2lkOyB9CisKKyAgICAvKiogQHByZSB0aHJlYWQgaXMgam9pbmFibGUKKyAgICAgKi8KKyAgICBuYXRpdmVfaGFuZGxlX3R5cGUKKyAgICBuYXRpdmVfaGFuZGxlKCkKKyAgICB7IHJldHVybiBfTV9pZC5fTV90aHJlYWQ7IH0KKworICAgIC8vIFJldHVybnMgYSB2YWx1ZSB0aGF0IGhpbnRzIGF0IHRoZSBudW1iZXIgb2YgaGFyZHdhcmUgdGhyZWFkIGNvbnRleHRzLgorICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQKKyAgICBoYXJkd2FyZV9jb25jdXJyZW5jeSgpIG5vZXhjZXB0OworCisgIHByaXZhdGU6CisgICAgdm9pZAorICAgIF9NX3N0YXJ0X3RocmVhZChfX3NoYXJlZF9iYXNlX3R5cGUpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NhbGxhYmxlPgorICAgICAgc2hhcmVkX3B0cjxfSW1wbDxfQ2FsbGFibGU+PgorICAgICAgX01fbWFrZV9yb3V0aW5lKF9DYWxsYWJsZSYmIF9fZikKKyAgICAgIHsKKwkvLyBDcmVhdGUgYW5kIGFsbG9jYXRlIGZ1bGwgZGF0YSBzdHJ1Y3R1cmUsIG5vdCBiYXNlLgorCXJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPF9JbXBsPF9DYWxsYWJsZT4+KHN0ZDo6Zm9yd2FyZDxfQ2FsbGFibGU+KF9fZikpOworICAgICAgfQorICB9OworCisgIGlubGluZSB0aHJlYWQ6Ol9JbXBsX2Jhc2U6On5fSW1wbF9iYXNlKCkgPSBkZWZhdWx0OworCisgIGlubGluZSB2b2lkCisgIHN3YXAodGhyZWFkJiBfX3gsIHRocmVhZCYgX195KSBub2V4Y2VwdAorICB7IF9feC5zd2FwKF9feSk7IH0KKworICBpbmxpbmUgYm9vbAorICBvcGVyYXRvciE9KHRocmVhZDo6aWQgX194LCB0aHJlYWQ6OmlkIF9feSkgbm9leGNlcHQKKyAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgIGlubGluZSBib29sCisgIG9wZXJhdG9yPD0odGhyZWFkOjppZCBfX3gsIHRocmVhZDo6aWQgX195KSBub2V4Y2VwdAorICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICBpbmxpbmUgYm9vbAorICBvcGVyYXRvcj4odGhyZWFkOjppZCBfX3gsIHRocmVhZDo6aWQgX195KSBub2V4Y2VwdAorICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICBpbmxpbmUgYm9vbAorICBvcGVyYXRvcj49KHRocmVhZDo6aWQgX194LCB0aHJlYWQ6OmlkIF9feSkgbm9leGNlcHQKKyAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyAgLy8gRFIgODg5LgorICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciB0aHJlYWQ6OmlkLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8dGhyZWFkOjppZD4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIHRocmVhZDo6aWQ+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IHRocmVhZDo6aWQmIF9faWQpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Ol9IYXNoX2ltcGw6Omhhc2goX19pZC5fTV90aHJlYWQpOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vdXQsIHRocmVhZDo6aWQgX19pZCkKKyAgICB7CisgICAgICBpZiAoX19pZCA9PSB0aHJlYWQ6OmlkKCkpCisJcmV0dXJuIF9fb3V0IDw8ICJ0aHJlYWQ6OmlkIG9mIGEgbm9uLWV4ZWN1dGluZyB0aHJlYWQiOworICAgICAgZWxzZQorCXJldHVybiBfX291dCA8PCBfX2lkLl9NX3RocmVhZDsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKiBAbmFtZXNwYWNlIHN0ZDo6dGhpc190aHJlYWQKKyAgICogIEBicmllZiBJU08gQysrIDIwMTEgZW50aXRpZXMgc3ViLW5hbWVzcGFjZSBmb3IgdGhyZWFkLgorICAgKiAgMzAuMy4yIE5hbWVzcGFjZSB0aGlzX3RocmVhZC4KKyAgICovCisgIG5hbWVzcGFjZSB0aGlzX3RocmVhZAorICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICAvLy8gZ2V0X2lkCisgICAgaW5saW5lIHRocmVhZDo6aWQKKyAgICBnZXRfaWQoKSBub2V4Y2VwdCB7IHJldHVybiB0aHJlYWQ6OmlkKF9fZ3RocmVhZF9zZWxmKCkpOyB9CisKKyAgICAvLy8geWllbGQKKyAgICBpbmxpbmUgdm9pZAorICAgIHlpZWxkKCkgbm9leGNlcHQKKyAgICB7CisjaWZkZWYgX0dMSUJDWFhfVVNFX1NDSEVEX1lJRUxECisgICAgICBfX2d0aHJlYWRfeWllbGQoKTsKKyNlbmRpZgorICAgIH0KKworICAgIHZvaWQKKyAgICBfX3NsZWVwX2ZvcihjaHJvbm86OnNlY29uZHMsIGNocm9ubzo6bmFub3NlY29uZHMpOworCisgICAgLy8vIHNsZWVwX2ZvcgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAsIHR5cGVuYW1lIF9QZXJpb2Q+CisgICAgICBpbmxpbmUgdm9pZAorICAgICAgc2xlZXBfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcnRpbWUpCisgICAgICB7CisJYXV0byBfX3MgPSBjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8Y2hyb25vOjpzZWNvbmRzPihfX3J0aW1lKTsKKwlhdXRvIF9fbnMgPSBjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8Y2hyb25vOjpuYW5vc2Vjb25kcz4oX19ydGltZSAtIF9fcyk7CisjaWZkZWYgX0dMSUJDWFhfVVNFX05BTk9TTEVFUAorCV9fZ3RocmVhZF90aW1lX3QgX190cyA9CisJICB7CisJICAgIHN0YXRpY19jYXN0PHN0ZDo6dGltZV90PihfX3MuY291bnQoKSksCisJICAgIHN0YXRpY19jYXN0PGxvbmc+KF9fbnMuY291bnQoKSkKKwkgIH07CisJOjpuYW5vc2xlZXAoJl9fdHMsIDApOworI2Vsc2UKKwlfX3NsZWVwX2ZvcihfX3MsIF9fbnMpOworI2VuZGlmCisgICAgICB9CisKKyAgICAvLy8gc2xlZXBfdW50aWwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXJhdGlvbj4KKyAgICAgIGlubGluZSB2b2lkCisgICAgICBzbGVlcF91bnRpbChjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX2F0aW1lKQorICAgICAgeyBzbGVlcF9mb3IoX19hdGltZSAtIF9DbG9jazo6bm93KCkpOyB9CisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0KKworICAvLyBAfSBncm91cCB0aHJlYWRzCisKK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9IQVNfR1RIUkVBRFMgJiYgX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxCisKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVEhSRUFECmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9hcnJheSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2FycmF5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YmU0MWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9hcnJheQpAQCAtMCwwICsxLDI1MSBAQAorLy8gY2xhc3MgdGVtcGxhdGUgYXJyYXkgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9hcnJheQorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9BUlJBWQorI2RlZmluZSBfR0xJQkNYWF9UUjFfQVJSQVkgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgZm9yIHN0b3JpbmcgYSBmaXhlZCBzaXplIHNlcXVlbmNlIG9mIGVsZW1lbnRzLgorICAgKgorICAgKiAgQGluZ3JvdXAgc2VxdWVuY2VzCisgICAqCisgICAqICBNZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sIGEKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY2Ij5yZXZlcnNpYmxlIGNvbnRhaW5lcjwvYT4sIGFuZCBhCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NyI+c2VxdWVuY2U8L2E+LgorICAgKgorICAgKiAgU2V0cyBzdXBwb3J0IHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLgorICAgKgorICAgKiAgQHBhcmFtICBUcCAgVHlwZSBvZiBlbGVtZW50LiBSZXF1aXJlZCB0byBiZSBhIGNvbXBsZXRlIHR5cGUuCisgICAqICBAcGFyYW0gIE4gIE51bWJlciBvZiBlbGVtZW50cy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgc3RydWN0IGFycmF5CisgICAgeworICAgICAgdHlwZWRlZiBfVHAgCSAgICAJCQkgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAJICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAJICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlKiAgICAgICAgICAJCSAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKgkJCSAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCAgICAgICAgICAgICAgICAgICAgCSAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgCSAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPgkgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+ICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgLy8gU3VwcG9ydCBmb3IgemVyby1zaXplZCBhcnJheXMgbWFuZGF0b3J5LgorICAgICAgdmFsdWVfdHlwZSBfTV9pbnN0YW5jZVtfTm0gPyBfTm0gOiAxXTsKKworICAgICAgLy8gTm8gZXhwbGljaXQgY29uc3RydWN0L2NvcHkvZGVzdHJveSBmb3IgYWdncmVnYXRlIHR5cGUuCisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2lnbihjb25zdCB2YWx1ZV90eXBlJiBfX3UpCisgICAgICB7IHN0ZDo6ZmlsbF9uKGJlZ2luKCksIHNpemUoKSwgX191KTsgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKGFycmF5JiBfX290aGVyKQorICAgICAgeyBzdGQ6OnN3YXBfcmFuZ2VzKGJlZ2luKCksIGVuZCgpLCBfX290aGVyLmJlZ2luKCkpOyB9CisKKyAgICAgIC8vIEl0ZXJhdG9ycy4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihzdGQ6Ol9fYWRkcmVzc29mKF9NX2luc3RhbmNlWzBdKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QgCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihzdGQ6Ol9fYWRkcmVzc29mKF9NX2luc3RhbmNlWzBdKSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihzdGQ6Ol9fYWRkcmVzc29mKF9NX2luc3RhbmNlW19ObV0pKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHN0ZDo6X19hZGRyZXNzb2YoX01faW5zdGFuY2VbX05tXSkpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IgCisgICAgICByYmVnaW4oKQorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciAKKyAgICAgIHJiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yIAorICAgICAgcmVuZCgpCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgCisgICAgICByZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgLy8gQ2FwYWNpdHkuCisgICAgICBzaXplX3R5cGUgCisgICAgICBzaXplKCkgY29uc3QgeyByZXR1cm4gX05tOyB9CisKKyAgICAgIHNpemVfdHlwZSAKKyAgICAgIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX05tOyB9CisKKyAgICAgIGJvb2wgCisgICAgICBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHNpemUoKSA9PSAwOyB9CisKKyAgICAgIC8vIEVsZW1lbnQgYWNjZXNzLgorICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pCisgICAgICB7IHJldHVybiBfTV9pbnN0YW5jZVtfX25dOyB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faW5zdGFuY2VbX19uXTsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIGF0KHNpemVfdHlwZSBfX24pCisgICAgICB7CisJaWYgKF9fbiA+PSBfTm0pCisJICBzdGQ6Ol9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiYXJyYXk6OmF0IikpOworCXJldHVybiBfTV9pbnN0YW5jZVtfX25dOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7CisJaWYgKF9fbiA+PSBfTm0pCisJICBzdGQ6Ol9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiYXJyYXk6OmF0IikpOworCXJldHVybiBfTV9pbnN0YW5jZVtfX25dOworICAgICAgfQorCisgICAgICByZWZlcmVuY2UgCisgICAgICBmcm9udCgpCisgICAgICB7IHJldHVybiAqYmVnaW4oKTsgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UgCisgICAgICBmcm9udCgpIGNvbnN0CisgICAgICB7IHJldHVybiAqYmVnaW4oKTsgfQorCisgICAgICByZWZlcmVuY2UgCisgICAgICBiYWNrKCkKKyAgICAgIHsgcmV0dXJuIF9ObSA/ICooZW5kKCkgLSAxKSA6ICplbmQoKTsgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UgCisgICAgICBiYWNrKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9ObSA/ICooZW5kKCkgLSAxKSA6ICplbmQoKTsgfQorCisgICAgICBfVHAqCisgICAgICBkYXRhKCkKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX01faW5zdGFuY2VbMF0pOyB9CisKKyAgICAgIGNvbnN0IF9UcCoKKyAgICAgIGRhdGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfTV9pbnN0YW5jZVswXSk7IH0KKyAgICB9OworCisgIC8vIEFycmF5IGNvbXBhcmlzb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbCAKKyAgICBvcGVyYXRvcj09KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgeyByZXR1cm4gc3RkOjplcXVhbChfX29uZS5iZWdpbigpLCBfX29uZS5lbmQoKSwgX190d28uYmVnaW4oKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX29uZSwgY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX3R3bykKKyAgICB7IHJldHVybiAhKF9fb25lID09IF9fdHdvKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19hLCBjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fYikKKyAgICB7IAorICAgICAgcmV0dXJuIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX19hLmJlZ2luKCksIF9fYS5lbmQoKSwKKwkJCQkJICBfX2IuYmVnaW4oKSwgX19iLmVuZCgpKTsgCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgeyByZXR1cm4gX190d28gPCBfX29uZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fb25lLCBjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fdHdvKQorICAgIHsgcmV0dXJuICEoX19vbmUgPiBfX3R3byk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX29uZSwgY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX3R3bykKKyAgICB7IHJldHVybiAhKF9fb25lIDwgX190d28pOyB9CisKKyAgLy8gU3BlY2lhbGl6ZWQgYWxnb3JpdGhtcyBbNi4yLjIuMl0uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChhcnJheTxfVHAsIF9ObT4mIF9fb25lLCBhcnJheTxfVHAsIF9ObT4mIF9fdHdvKQorICAgIHsgX19vbmUuc3dhcChfX3R3byk7IH0KKworICAvLyBUdXBsZSBpbnRlcmZhY2UgdG8gY2xhc3MgdGVtcGxhdGUgYXJyYXkgWzYuMi4yLjVdLgorCisgIC8vLyB0dXBsZV9zaXplCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gCisgICAgY2xhc3MgdHVwbGVfc2l6ZTsKKworICAvLy8gdHVwbGVfZWxlbWVudAorICB0ZW1wbGF0ZTxpbnQgX0ludCwgdHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIHR1cGxlX2VsZW1lbnQ7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgc3RydWN0IHR1cGxlX3NpemU8YXJyYXk8X1RwLCBfTm0+ID4KKyAgICB7IHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSBfTm07IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgY29uc3QgaW50CisgICAgdHVwbGVfc2l6ZTxhcnJheTxfVHAsIF9ObT4gPjo6dmFsdWU7ICAKKworICB0ZW1wbGF0ZTxpbnQgX0ludCwgdHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ8X0ludCwgYXJyYXk8X1RwLCBfTm0+ID4KKyAgICB7IHR5cGVkZWYgX1RwIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8aW50IF9JbnQsIHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBfVHAmCisgICAgZ2V0KGFycmF5PF9UcCwgX05tPiYgX19hcnIpCisgICAgeyByZXR1cm4gX19hcnJbX0ludF07IH0KKworICB0ZW1wbGF0ZTxpbnQgX0ludCwgdHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIGNvbnN0IF9UcCYKKyAgICBnZXQoY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX2FycikKKyAgICB7IHJldHVybiBfX2FycltfSW50XTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9BUlJBWQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvYmVzc2VsX2Z1bmN0aW9uLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2Jlc3NlbF9mdW5jdGlvbi50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA0ODFiOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2Jlc3NlbF9mdW5jdGlvbi50Y2MKQEAgLTAsMCArMSw2MjggQEAKKy8vIFNwZWNpYWwgZnVuY3Rpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2Jlc3NlbF9mdW5jdGlvbi50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt0cjEvY21hdGh9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODIgVFIxOiA1LjIgIFNwZWNpYWwgZnVuY3Rpb25zCisvLworCisvLyBXcml0dGVuIGJ5IEVkd2FyZCBTbWl0aC1Sb3dsYW5kLgorLy8KKy8vIFJlZmVyZW5jZXM6CisvLyAgICgxKSBIYW5kYm9vayBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zLAorLy8gICAgICAgZWQuIE1pbHRvbiBBYnJhbW93aXR6IGFuZCBJcmVuZSBBLiBTdGVndW4sCisvLyAgICAgICBEb3ZlciBQdWJsaWNhdGlvbnMsCisvLyAgICAgICBTZWN0aW9uIDksIHBwLiAzNTUtNDM0LCBTZWN0aW9uIDEwIHBwLiA0MzUtNDc4CisvLyAgICgyKSBUaGUgR251IFNjaWVudGlmaWMgTGlicmFyeSwgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dzbAorLy8gICAoMykgTnVtZXJpY2FsIFJlY2lwZXMgaW4gQywgYnkgVy4gSC4gUHJlc3MsIFMuIEEuIFRldWtvbHNreSwKKy8vICAgICAgIFcuIFQuIFZldHRlcmxpbmcsIEIuIFAuIEZsYW5uZXJ5LCBDYW1icmlkZ2UgVW5pdmVyc2l0eSBQcmVzcyAoMTk5MiksCisvLyAgICAgICAybmQgZWQsIHBwLiAyNDAtMjQ1CisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0JFU1NFTF9GVU5DVElPTl9UQ0MKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0JFU1NFTF9GVU5DVElPTl9UQ0MgMQorCisjaW5jbHVkZSAic3BlY2lhbF9mdW5jdGlvbl91dGlsLmgiCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworICAvLyBbNS4yXSBTcGVjaWFsIGZ1bmN0aW9ucworCisgIC8vIEltcGxlbWVudGF0aW9uLXNwYWNlIGRldGFpbHMuCisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBDb21wdXRlIHRoZSBnYW1tYSBmdW5jdGlvbnMgcmVxdWlyZWQgYnkgdGhlIFRlbW1lIHNlcmllcworICAgICAqICAgICAgICAgIGV4cGFuc2lvbnMgb2YgQGYkIE5fXG51KHgpIEBmJCBhbmQgQGYkIEtfXG51KHgpIEBmJC4KKyAgICAgKiAgIEBmWworICAgICAqICAgICBcR2FtbWFfMSA9IFxmcmFjezF9ezJcbXV9CisgICAgICogICAgICAgICAgICAgICAgW1xmcmFjezF9e1xHYW1tYSgxIC0gXG11KX0gLSBcZnJhY3sxfXtcR2FtbWEoMSArIFxtdSl9XQorICAgICAqICAgQGZdCisgICAgICogICBhbmQKKyAgICAgKiAgIEBmWworICAgICAqICAgICBcR2FtbWFfMiA9IFxmcmFjezF9ezJ9CisgICAgICogICAgICAgICAgICAgICAgW1xmcmFjezF9e1xHYW1tYSgxIC0gXG11KX0gKyBcZnJhY3sxfXtcR2FtbWEoMSArIFxtdSl9XQorICAgICAqICAgQGZdCisgICAgICogICB3aGVyZSBAZiQgLTEvMiA8PSBcbXUgPD0gMS8yIEBmJCBpcyBAZiQgXG11ID0gXG51IC0gTiBAZiQgYW5kIEBmJCBOIEBmJC4KKyAgICAgKiAgIGlzIHRoZSBuZWFyZXN0IGludGVnZXIgdG8gQGYkIFxudSBAZiQuCisgICAgICogICBUaGUgdmFsdWVzIG9mIFxmJCBcR2FtbWEoMSArIFxtdSkgXGYkIGFuZCBcZiQgXEdhbW1hKDEgLSBcbXUpIFxmJAorICAgICAqICAgYXJlIHJldHVybmVkIGFzIHdlbGwuCisgICAgICogCisgICAgICogICBUaGUgYWNjdXJhY3kgcmVxdWlyZW1lbnRzIG9uIHRoaXMgYXJlIGV4cXVpc2l0ZS4KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9fbXUgICAgIFRoZSBpbnB1dCBwYXJhbWV0ZXIgb2YgdGhlIGdhbW1hIGZ1bmN0aW9ucy4KKyAgICAgKiAgIEBwYXJhbSBfX2dhbTEgICBUaGUgb3V0cHV0IGZ1bmN0aW9uIFxmJCBcR2FtbWFfMShcbXUpIFxmJAorICAgICAqICAgQHBhcmFtIF9fZ2FtMiAgIFRoZSBvdXRwdXQgZnVuY3Rpb24gXGYkIFxHYW1tYV8yKFxtdSkgXGYkCisgICAgICogICBAcGFyYW0gX19nYW1wbCAgVGhlIG91dHB1dCBmdW5jdGlvbiBcZiQgXEdhbW1hKDEgKyBcbXUpIFxmJAorICAgICAqICAgQHBhcmFtIF9fZ2FtbWkgIFRoZSBvdXRwdXQgZnVuY3Rpb24gXGYkIFxHYW1tYSgxIC0gXG11KSBcZiQKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX2dhbW1hX3RlbW1lKF9UcCBfX211LAorICAgICAgICAgICAgICAgICAgX1RwICYgX19nYW0xLCBfVHAgJiBfX2dhbTIsIF9UcCAmIF9fZ2FtcGwsIF9UcCAmIF9fZ2FtbWkpCisgICAgeworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgIF9fZ2FtcGwgPSBfVHAoMSkgLyBzdGQ6OnRyMTo6dGdhbW1hKF9UcCgxKSArIF9fbXUpOworICAgICAgX19nYW1taSA9IF9UcCgxKSAvIHN0ZDo6dHIxOjp0Z2FtbWEoX1RwKDEpIC0gX19tdSk7CisjZWxzZQorICAgICAgX19nYW1wbCA9IF9UcCgxKSAvIF9fZ2FtbWEoX1RwKDEpICsgX19tdSk7CisgICAgICBfX2dhbW1pID0gX1RwKDEpIC8gX19nYW1tYShfVHAoMSkgLSBfX211KTsKKyNlbmRpZgorCisgICAgICBpZiAoc3RkOjphYnMoX19tdSkgPCBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKSkKKyAgICAgICAgX19nYW0xID0gLV9UcChfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fZ2FtbWFfZSgpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgX19nYW0xID0gKF9fZ2FtbWkgLSBfX2dhbXBsKSAvIChfVHAoMikgKiBfX211KTsKKworICAgICAgX19nYW0yID0gKF9fZ2FtbWkgKyBfX2dhbXBsKSAvIChfVHAoMikpOworCisgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgQ29tcHV0ZSB0aGUgQmVzc2VsIEBmJCBKX1xudSh4KSBAZiQgYW5kIE5ldW1hbm4KKyAgICAgKiAgICAgICAgICAgQGYkIE5fXG51KHgpIEBmJCBmdW5jdGlvbnMgYW5kIHRoZWlyIGZpcnN0IGRlcml2YXRpdmVzCisgICAgICogICAgICAgICAgIEBmJCBKJ19cbnUoeCkgQGYkIGFuZCBAZiQgTidfXG51KHgpIEBmJCByZXNwZWN0aXZlbHkuCisgICAgICogICAgICAgICAgIFRoZXNlIGZvdXIgZnVuY3Rpb25zIGFyZSBjb21wdXRlZCB0b2dldGhlciBmb3IgbnVtZXJpY2FsCisgICAgICogICAgICAgICAgIHN0YWJpbGl0eS4KKyAgICAgKgorICAgICAqICAgQHBhcmFtICBfX251ICBUaGUgb3JkZXIgb2YgdGhlIEJlc3NlbCBmdW5jdGlvbnMuCisgICAgICogICBAcGFyYW0gIF9feCAgIFRoZSBhcmd1bWVudCBvZiB0aGUgQmVzc2VsIGZ1bmN0aW9ucy4KKyAgICAgKiAgIEBwYXJhbSAgX19KbnUgIFRoZSBvdXRwdXQgQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kLgorICAgICAqICAgQHBhcmFtICBfX05udSAgVGhlIG91dHB1dCBOZXVtYW5uIGZ1bmN0aW9uIChCZXNzZWwgZnVuY3Rpb24gb2YgdGhlIHNlY29uZCBraW5kKS4KKyAgICAgKiAgIEBwYXJhbSAgX19KcG51ICBUaGUgb3V0cHV0IGRlcml2YXRpdmUgb2YgdGhlIEJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgZmlyc3Qga2luZC4KKyAgICAgKiAgIEBwYXJhbSAgX19OcG51ICBUaGUgb3V0cHV0IGRlcml2YXRpdmUgb2YgdGhlIE5ldW1hbm4gZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgX19iZXNzZWxfam4oX1RwIF9fbnUsIF9UcCBfX3gsCisgICAgICAgICAgICAgICAgX1RwICYgX19KbnUsIF9UcCAmIF9fTm51LCBfVHAgJiBfX0pwbnUsIF9UcCAmIF9fTnBudSkKKyAgICB7CisgICAgICBpZiAoX194ID09IF9UcCgwKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChfX251ID09IF9UcCgwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19KbnUgPSBfVHAoMSk7CisgICAgICAgICAgICAgIF9fSnBudSA9IF9UcCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChfX251ID09IF9UcCgxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19KbnUgPSBfVHAoMCk7CisgICAgICAgICAgICAgIF9fSnBudSA9IF9UcCgwLjVMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fSm51ID0gX1RwKDApOworICAgICAgICAgICAgICBfX0pwbnUgPSBfVHAoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgX19ObnUgPSAtc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjppbmZpbml0eSgpOworICAgICAgICAgIF9fTnBudSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6aW5maW5pdHkoKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgY29uc3QgX1RwIF9fZXBzID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisgICAgICAvLyAgV2hlbiB0aGUgbXVsdGlwbGllciBpcyBOIGkuZS4KKyAgICAgIC8vICBmcF9taW4gPSBOICogbWluKCkKKyAgICAgIC8vICBUaGVuIEpfMCBhbmQgTl8wIHRhbmsgYXQgeCA9IDggKiBOIChKXzAgPSAwIGFuZCBOXzAgPSBuYW4pIQorICAgICAgLy9jb25zdCBfVHAgX19mcF9taW4gPSBfVHAoMjApICogc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjptaW4oKTsKKyAgICAgIGNvbnN0IF9UcCBfX2ZwX21pbiA9IHN0ZDo6c3FydChzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46Om1pbigpKTsKKyAgICAgIGNvbnN0IGludCBfX21heF9pdGVyID0gMTUwMDA7CisgICAgICBjb25zdCBfVHAgX194X21pbiA9IF9UcCgyKTsKKworICAgICAgY29uc3QgaW50IF9fbmwgPSAoX194IDwgX194X21pbgorICAgICAgICAgICAgICAgICAgICA/IHN0YXRpY19jYXN0PGludD4oX19udSArIF9UcCgwLjVMKSkKKyAgICAgICAgICAgICAgICAgICAgOiBzdGQ6Om1heCgwLCBzdGF0aWNfY2FzdDxpbnQ+KF9fbnUgLSBfX3ggKyBfVHAoMS41TCkpKSk7CisKKyAgICAgIGNvbnN0IF9UcCBfX211ID0gX19udSAtIF9fbmw7CisgICAgICBjb25zdCBfVHAgX19tdTIgPSBfX211ICogX19tdTsKKyAgICAgIGNvbnN0IF9UcCBfX3hpID0gX1RwKDEpIC8gX194OworICAgICAgY29uc3QgX1RwIF9feGkyID0gX1RwKDIpICogX194aTsKKyAgICAgIF9UcCBfX3cgPSBfX3hpMiAvIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpOworICAgICAgaW50IF9faXNpZ24gPSAxOworICAgICAgX1RwIF9faCA9IF9fbnUgKiBfX3hpOworICAgICAgaWYgKF9faCA8IF9fZnBfbWluKQorICAgICAgICBfX2ggPSBfX2ZwX21pbjsKKyAgICAgIF9UcCBfX2IgPSBfX3hpMiAqIF9fbnU7CisgICAgICBfVHAgX19kID0gX1RwKDApOworICAgICAgX1RwIF9fYyA9IF9faDsKKyAgICAgIGludCBfX2k7CisgICAgICBmb3IgKF9faSA9IDE7IF9faSA8PSBfX21heF9pdGVyOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9fYiArPSBfX3hpMjsKKyAgICAgICAgICBfX2QgPSBfX2IgLSBfX2Q7CisgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fZCkgPCBfX2ZwX21pbikKKyAgICAgICAgICAgIF9fZCA9IF9fZnBfbWluOworICAgICAgICAgIF9fYyA9IF9fYiAtIF9UcCgxKSAvIF9fYzsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX19jKSA8IF9fZnBfbWluKQorICAgICAgICAgICAgX19jID0gX19mcF9taW47CisgICAgICAgICAgX19kID0gX1RwKDEpIC8gX19kOworICAgICAgICAgIGNvbnN0IF9UcCBfX2RlbCA9IF9fYyAqIF9fZDsKKyAgICAgICAgICBfX2ggKj0gX19kZWw7CisgICAgICAgICAgaWYgKF9fZCA8IF9UcCgwKSkKKyAgICAgICAgICAgIF9faXNpZ24gPSAtX19pc2lnbjsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX19kZWwgLSBfVHAoMSkpIDwgX19lcHMpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgaWYgKF9faSA+IF9fbWF4X2l0ZXIpCisgICAgICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiQXJndW1lbnQgeCB0b28gbGFyZ2UgaW4gX19iZXNzZWxfam47ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cnkgYXN5bXB0b3RpYyBleHBhbnNpb24uIikpOworICAgICAgX1RwIF9fSm51bCA9IF9faXNpZ24gKiBfX2ZwX21pbjsKKyAgICAgIF9UcCBfX0pwbnVsID0gX19oICogX19KbnVsOworICAgICAgX1RwIF9fSm51bDEgPSBfX0pudWw7CisgICAgICBfVHAgX19KcG51MSA9IF9fSnBudWw7CisgICAgICBfVHAgX19mYWN0ID0gX19udSAqIF9feGk7CisgICAgICBmb3IgKCBpbnQgX19sID0gX19ubDsgX19sID49IDE7IC0tX19sICkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX0pudXRlbXAgPSBfX2ZhY3QgKiBfX0pudWwgKyBfX0pwbnVsOworICAgICAgICAgIF9fZmFjdCAtPSBfX3hpOworICAgICAgICAgIF9fSnBudWwgPSBfX2ZhY3QgKiBfX0pudXRlbXAgLSBfX0pudWw7CisgICAgICAgICAgX19KbnVsID0gX19KbnV0ZW1wOworICAgICAgICB9CisgICAgICBpZiAoX19KbnVsID09IF9UcCgwKSkKKyAgICAgICAgX19KbnVsID0gX19lcHM7CisgICAgICBfVHAgX19mPSBfX0pwbnVsIC8gX19KbnVsOworICAgICAgX1RwIF9fTm11LCBfX05udTEsIF9fTnBtdSwgX19KbXU7CisgICAgICBpZiAoX194IDwgX194X21pbikKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX3gyID0gX194IC8gX1RwKDIpOworICAgICAgICAgIGNvbnN0IF9UcCBfX3BpbXUgPSBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSAqIF9fbXU7CisgICAgICAgICAgX1RwIF9fZmFjdCA9IChzdGQ6OmFicyhfX3BpbXUpIDwgX19lcHMKKyAgICAgICAgICAgICAgICAgICAgICA/IF9UcCgxKSA6IF9fcGltdSAvIHN0ZDo6c2luKF9fcGltdSkpOworICAgICAgICAgIF9UcCBfX2QgPSAtc3RkOjpsb2coX194Mik7CisgICAgICAgICAgX1RwIF9fZSA9IF9fbXUgKiBfX2Q7CisgICAgICAgICAgX1RwIF9fZmFjdDIgPSAoc3RkOjphYnMoX19lKSA8IF9fZXBzCisgICAgICAgICAgICAgICAgICAgICAgID8gX1RwKDEpIDogc3RkOjpzaW5oKF9fZSkgLyBfX2UpOworICAgICAgICAgIF9UcCBfX2dhbTEsIF9fZ2FtMiwgX19nYW1wbCwgX19nYW1taTsKKyAgICAgICAgICBfX2dhbW1hX3RlbW1lKF9fbXUsIF9fZ2FtMSwgX19nYW0yLCBfX2dhbXBsLCBfX2dhbW1pKTsKKyAgICAgICAgICBfVHAgX19mZiA9IChfVHAoMikgLyBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSkKKyAgICAgICAgICAgICAgICAgICAqIF9fZmFjdCAqIChfX2dhbTEgKiBzdGQ6OmNvc2goX19lKSArIF9fZ2FtMiAqIF9fZmFjdDIgKiBfX2QpOworICAgICAgICAgIF9fZSA9IHN0ZDo6ZXhwKF9fZSk7CisgICAgICAgICAgX1RwIF9fcCA9IF9fZSAvIChfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSAqIF9fZ2FtcGwpOworICAgICAgICAgIF9UcCBfX3EgPSBfVHAoMSkgLyAoX19lICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkgKiBfX2dhbW1pKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19waW11MiA9IF9fcGltdSAvIF9UcCgyKTsKKyAgICAgICAgICBfVHAgX19mYWN0MyA9IChzdGQ6OmFicyhfX3BpbXUyKSA8IF9fZXBzCisgICAgICAgICAgICAgICAgICAgICAgID8gX1RwKDEpIDogc3RkOjpzaW4oX19waW11MikgLyBfX3BpbXUyICk7CisgICAgICAgICAgX1RwIF9fciA9IF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpICogX19waW11MiAqIF9fZmFjdDMgKiBfX2ZhY3QzOworICAgICAgICAgIF9UcCBfX2MgPSBfVHAoMSk7CisgICAgICAgICAgX19kID0gLV9feDIgKiBfX3gyOworICAgICAgICAgIF9UcCBfX3N1bSA9IF9fZmYgKyBfX3IgKiBfX3E7CisgICAgICAgICAgX1RwIF9fc3VtMSA9IF9fcDsKKyAgICAgICAgICBmb3IgKF9faSA9IDE7IF9faSA8PSBfX21heF9pdGVyOyArK19faSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19mZiA9IChfX2kgKiBfX2ZmICsgX19wICsgX19xKSAvIChfX2kgKiBfX2kgLSBfX211Mik7CisgICAgICAgICAgICAgIF9fYyAqPSBfX2QgLyBfVHAoX19pKTsKKyAgICAgICAgICAgICAgX19wIC89IF9UcChfX2kpIC0gX19tdTsKKyAgICAgICAgICAgICAgX19xIC89IF9UcChfX2kpICsgX19tdTsKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9fZGVsID0gX19jICogKF9fZmYgKyBfX3IgKiBfX3EpOworICAgICAgICAgICAgICBfX3N1bSArPSBfX2RlbDsgCisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX2RlbDEgPSBfX2MgKiBfX3AgLSBfX2kgKiBfX2RlbDsKKyAgICAgICAgICAgICAgX19zdW0xICs9IF9fZGVsMTsKKyAgICAgICAgICAgICAgaWYgKCBzdGQ6OmFicyhfX2RlbCkgPCBfX2VwcyAqIChfVHAoMSkgKyBzdGQ6OmFicyhfX3N1bSkpICkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIF9faSA+IF9fbWF4X2l0ZXIgKQorICAgICAgICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJCZXNzZWwgeSBzZXJpZXMgZmFpbGVkIHRvIGNvbnZlcmdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19iZXNzZWxfam4uIikpOworICAgICAgICAgIF9fTm11ID0gLV9fc3VtOworICAgICAgICAgIF9fTm51MSA9IC1fX3N1bTEgKiBfX3hpMjsKKyAgICAgICAgICBfX05wbXUgPSBfX211ICogX194aSAqIF9fTm11IC0gX19ObnUxOworICAgICAgICAgIF9fSm11ID0gX193IC8gKF9fTnBtdSAtIF9fZiAqIF9fTm11KTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fYSA9IF9UcCgwLjI1TCkgLSBfX211MjsKKyAgICAgICAgICBfVHAgX19xID0gX1RwKDEpOworICAgICAgICAgIF9UcCBfX3AgPSAtX194aSAvIF9UcCgyKTsKKyAgICAgICAgICBfVHAgX19iciA9IF9UcCgyKSAqIF9feDsKKyAgICAgICAgICBfVHAgX19iaSA9IF9UcCgyKTsKKyAgICAgICAgICBfVHAgX19mYWN0ID0gX19hICogX194aSAvIChfX3AgKiBfX3AgKyBfX3EgKiBfX3EpOworICAgICAgICAgIF9UcCBfX2NyID0gX19iciArIF9fcSAqIF9fZmFjdDsKKyAgICAgICAgICBfVHAgX19jaSA9IF9fYmkgKyBfX3AgKiBfX2ZhY3Q7CisgICAgICAgICAgX1RwIF9fZGVuID0gX19iciAqIF9fYnIgKyBfX2JpICogX19iaTsKKyAgICAgICAgICBfVHAgX19kciA9IF9fYnIgLyBfX2RlbjsKKyAgICAgICAgICBfVHAgX19kaSA9IC1fX2JpIC8gX19kZW47CisgICAgICAgICAgX1RwIF9fZGxyID0gX19jciAqIF9fZHIgLSBfX2NpICogX19kaTsKKyAgICAgICAgICBfVHAgX19kbGkgPSBfX2NyICogX19kaSArIF9fY2kgKiBfX2RyOworICAgICAgICAgIF9UcCBfX3RlbXAgPSBfX3AgKiBfX2RsciAtIF9fcSAqIF9fZGxpOworICAgICAgICAgIF9fcSA9IF9fcCAqIF9fZGxpICsgX19xICogX19kbHI7CisgICAgICAgICAgX19wID0gX190ZW1wOworICAgICAgICAgIGludCBfX2k7CisgICAgICAgICAgZm9yIChfX2kgPSAyOyBfX2kgPD0gX19tYXhfaXRlcjsgKytfX2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fYSArPSBfVHAoMiAqIChfX2kgLSAxKSk7CisgICAgICAgICAgICAgIF9fYmkgKz0gX1RwKDIpOworICAgICAgICAgICAgICBfX2RyID0gX19hICogX19kciArIF9fYnI7CisgICAgICAgICAgICAgIF9fZGkgPSBfX2EgKiBfX2RpICsgX19iaTsKKyAgICAgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fZHIpICsgc3RkOjphYnMoX19kaSkgPCBfX2ZwX21pbikKKyAgICAgICAgICAgICAgICBfX2RyID0gX19mcF9taW47CisgICAgICAgICAgICAgIF9fZmFjdCA9IF9fYSAvIChfX2NyICogX19jciArIF9fY2kgKiBfX2NpKTsKKyAgICAgICAgICAgICAgX19jciA9IF9fYnIgKyBfX2NyICogX19mYWN0OworICAgICAgICAgICAgICBfX2NpID0gX19iaSAtIF9fY2kgKiBfX2ZhY3Q7CisgICAgICAgICAgICAgIGlmIChzdGQ6OmFicyhfX2NyKSArIHN0ZDo6YWJzKF9fY2kpIDwgX19mcF9taW4pCisgICAgICAgICAgICAgICAgX19jciA9IF9fZnBfbWluOworICAgICAgICAgICAgICBfX2RlbiA9IF9fZHIgKiBfX2RyICsgX19kaSAqIF9fZGk7CisgICAgICAgICAgICAgIF9fZHIgLz0gX19kZW47CisgICAgICAgICAgICAgIF9fZGkgLz0gLV9fZGVuOworICAgICAgICAgICAgICBfX2RsciA9IF9fY3IgKiBfX2RyIC0gX19jaSAqIF9fZGk7CisgICAgICAgICAgICAgIF9fZGxpID0gX19jciAqIF9fZGkgKyBfX2NpICogX19kcjsKKyAgICAgICAgICAgICAgX190ZW1wID0gX19wICogX19kbHIgLSBfX3EgKiBfX2RsaTsKKyAgICAgICAgICAgICAgX19xID0gX19wICogX19kbGkgKyBfX3EgKiBfX2RscjsKKyAgICAgICAgICAgICAgX19wID0gX190ZW1wOworICAgICAgICAgICAgICBpZiAoc3RkOjphYnMoX19kbHIgLSBfVHAoMSkpICsgc3RkOjphYnMoX19kbGkpIDwgX19lcHMpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChfX2kgPiBfX21heF9pdGVyKQorICAgICAgICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJMZW50eidzIG1ldGhvZCBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2Jlc3NlbF9qbi4iKSk7CisgICAgICAgICAgY29uc3QgX1RwIF9fZ2FtID0gKF9fcCAtIF9fZikgLyBfX3E7CisgICAgICAgICAgX19KbXUgPSBzdGQ6OnNxcnQoX193IC8gKChfX3AgLSBfX2YpICogX19nYW0gKyBfX3EpKTsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICAgICAgX19KbXUgPSBzdGQ6OnRyMTo6Y29weXNpZ24oX19KbXUsIF9fSm51bCk7CisjZWxzZQorICAgICAgICAgIGlmIChfX0ptdSAqIF9fSm51bCA8IF9UcCgwKSkKKyAgICAgICAgICAgIF9fSm11ID0gLV9fSm11OworI2VuZGlmCisgICAgICAgICAgX19ObXUgPSBfX2dhbSAqIF9fSm11OworICAgICAgICAgIF9fTnBtdSA9IChfX3AgKyBfX3EgLyBfX2dhbSkgKiBfX05tdTsKKyAgICAgICAgICBfX05udTEgPSBfX211ICogX194aSAqIF9fTm11IC0gX19OcG11OworICAgICAgfQorICAgICAgX19mYWN0ID0gX19KbXUgLyBfX0pudWw7CisgICAgICBfX0pudSA9IF9fZmFjdCAqIF9fSm51bDE7CisgICAgICBfX0pwbnUgPSBfX2ZhY3QgKiBfX0pwbnUxOworICAgICAgZm9yIChfX2kgPSAxOyBfX2kgPD0gX19ubDsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX19ObnV0ZW1wID0gKF9fbXUgKyBfX2kpICogX194aTIgKiBfX05udTEgLSBfX05tdTsKKyAgICAgICAgICBfX05tdSA9IF9fTm51MTsKKyAgICAgICAgICBfX05udTEgPSBfX05udXRlbXA7CisgICAgICAgIH0KKyAgICAgIF9fTm51ID0gX19ObXU7CisgICAgICBfX05wbnUgPSBfX251ICogX194aSAqIF9fTm11IC0gX19ObnUxOworCisgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIGFzeW1wdG90aWMgY3lsaW5kcmljYWwgQmVzc2VsCisgICAgICogICAgICAgICAgYW5kIE5ldW1hbm4gZnVuY3Rpb25zIG9mIG9yZGVyIG51OiBcZiQgSl97XG51fSBcZiQsCisgICAgICogICAgICAgICAgXGYkIE5fe1xudX0gXGYkLgorICAgICAqCisgICAgICogICBSZWZlcmVuY2VzOgorICAgICAqICAgICgxKSBIYW5kYm9vayBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zLAorICAgICAqICAgICAgICBlZC4gTWlsdG9uIEFicmFtb3dpdHogYW5kIElyZW5lIEEuIFN0ZWd1biwKKyAgICAgKiAgICAgICAgRG92ZXIgUHVibGljYXRpb25zLAorICAgICAqICAgICAgICBTZWN0aW9uIDkgcC4gMzY0LCBFcXVhdGlvbnMgOS4yLjUtOS4yLjEwCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX19udSAgVGhlIG9yZGVyIG9mIHRoZSBCZXNzZWwgZnVuY3Rpb25zLgorICAgICAqICAgQHBhcmFtICBfX3ggICBUaGUgYXJndW1lbnQgb2YgdGhlIEJlc3NlbCBmdW5jdGlvbnMuCisgICAgICogICBAcGFyYW0gIF9fSm51ICBUaGUgb3V0cHV0IEJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgZmlyc3Qga2luZC4KKyAgICAgKiAgIEBwYXJhbSAgX19ObnUgIFRoZSBvdXRwdXQgTmV1bWFubiBmdW5jdGlvbiAoQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBzZWNvbmQga2luZCkuCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgX19jeWxfYmVzc2VsX2puX2FzeW1wKF9UcCBfX251LCBfVHAgX194LCBfVHAgJiBfX0pudSwgX1RwICYgX19ObnUpCisgICAgeworICAgICAgY29uc3QgX1RwIF9fbXUgICA9IF9UcCg0KSAqIF9fbnUgKiBfX251OworICAgICAgY29uc3QgX1RwIF9fbXVtMSA9IF9fbXUgLSBfVHAoMSk7CisgICAgICBjb25zdCBfVHAgX19tdW05ID0gX19tdSAtIF9UcCg5KTsKKyAgICAgIGNvbnN0IF9UcCBfX211bTI1ID0gX19tdSAtIF9UcCgyNSk7CisgICAgICBjb25zdCBfVHAgX19tdW00OSA9IF9fbXUgLSBfVHAoNDkpOworICAgICAgY29uc3QgX1RwIF9feHggPSBfVHAoNjQpICogX194ICogX194OworICAgICAgY29uc3QgX1RwIF9fUCA9IF9UcCgxKSAtIF9fbXVtMSAqIF9fbXVtOSAvIChfVHAoMikgKiBfX3h4KQorICAgICAgICAgICAgICAgICAgICAqIChfVHAoMSkgLSBfX211bTI1ICogX19tdW00OSAvIChfVHAoMTIpICogX194eCkpOworICAgICAgY29uc3QgX1RwIF9fUSA9IF9fbXVtMSAvIChfVHAoOCkgKiBfX3gpCisgICAgICAgICAgICAgICAgICAgICogKF9UcCgxKSAtIF9fbXVtOSAqIF9fbXVtMjUgLyAoX1RwKDYpICogX194eCkpOworCisgICAgICBjb25zdCBfVHAgX19jaGkgPSBfX3ggLSAoX19udSArIF9UcCgwLjVMKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waV8yKCk7CisgICAgICBjb25zdCBfVHAgX19jID0gc3RkOjpjb3MoX19jaGkpOworICAgICAgY29uc3QgX1RwIF9fcyA9IHN0ZDo6c2luKF9fY2hpKTsKKworICAgICAgY29uc3QgX1RwIF9fY29lZiA9IHN0ZDo6c3FydChfVHAoMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkgKiBfX3gpKTsKKyAgICAgIF9fSm51ID0gX19jb2VmICogKF9fYyAqIF9fUCAtIF9fcyAqIF9fUSk7CisgICAgICBfX05udSA9IF9fY29lZiAqIChfX3MgKiBfX1AgKyBfX2MgKiBfX1EpOworCisgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgY3lsaW5kcmljYWwgQmVzc2VsIGZ1bmN0aW9ucworICAgICAqICAgICAgICAgIG9mIG9yZGVyIFxmJCBcbnUgXGYkOiBcZiQgSl97XG51fSBcZiQgb3IgXGYkIElfe1xudX0gXGYkCisgICAgICogICAgICAgICAgYnkgc2VyaWVzIGV4cGFuc2lvbi4KKyAgICAgKgorICAgICAqICAgVGhlIG1vZGlmaWVkIGN5bGluZHJpY2FsIEJlc3NlbCBmdW5jdGlvbiBpczoKKyAgICAgKiAgIEBmWworICAgICAqICAgIFpfe1xudX0oeCkgPSBcc3VtX3trPTB9XntcaW5mdHl9CisgICAgICogICAgICAgICAgICAgIFxmcmFje1xzaWdtYV5rICh4LzIpXntcbnUgKyAya319e2shXEdhbW1hKFxudStrKzEpfQorICAgICAqICAgQGZdCisgICAgICogICB3aGVyZSBcZiQgXHNpZ21hID0gKzEgXGYkIG9yXGYkICAtMSBcZiQgZm9yCisgICAgICogICBcZiQgWiA9IEkgXGYkIG9yIFxmJCBKIFxmJCByZXNwZWN0aXZlbHkuCisgICAgICogCisgICAgICogICBTZWUgQWJyYW1vd2l0eiAmIFN0ZWd1biwgOS4xLjEwCisgICAgICogICAgICAgQWJyYW1vd2l0eiAmIFN0ZWd1biwgOS42LjcKKyAgICAgKiAgICAoMSkgSGFuZGJvb2sgb2YgTWF0aGVtYXRpY2FsIEZ1bmN0aW9ucywKKyAgICAgKiAgICAgICAgZWQuIE1pbHRvbiBBYnJhbW93aXR6IGFuZCBJcmVuZSBBLiBTdGVndW4sCisgICAgICogICAgICAgIERvdmVyIFB1YmxpY2F0aW9ucywKKyAgICAgKiAgICAgICAgRXF1YXRpb24gOS4xLjEwIHAuIDM2MCBhbmQgRXF1YXRpb24gOS42LjEwIHAuIDM3NQorICAgICAqCisgICAgICogICBAcGFyYW0gIF9fbnUgIFRoZSBvcmRlciBvZiB0aGUgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX3ggICBUaGUgYXJndW1lbnQgb2YgdGhlIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19zZ24gIFRoZSBzaWduIG9mIHRoZSBhbHRlcm5hdGUgdGVybXMKKyAgICAgKiAgICAgICAgICAgICAgICAgIC0xIGZvciB0aGUgQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kLgorICAgICAqICAgICAgICAgICAgICAgICAgKzEgZm9yIHRoZSBtb2RpZmllZCBCZXNzZWwgZnVuY3Rpb24gb2YgdGhlIGZpcnN0IGtpbmQuCisgICAgICogICBAcmV0dXJuICBUaGUgb3V0cHV0IEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fY3lsX2Jlc3NlbF9pal9zZXJpZXMoX1RwIF9fbnUsIF9UcCBfX3gsIF9UcCBfX3NnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBfX21heF9pdGVyKQorICAgIHsKKyAgICAgIGlmIChfX3ggPT0gX1RwKDApKQorCXJldHVybiBfX251ID09IF9UcCgwKSA/IF9UcCgxKSA6IF9UcCgwKTsKKworICAgICAgY29uc3QgX1RwIF9feDIgPSBfX3ggLyBfVHAoMik7CisgICAgICBfVHAgX19mYWN0ID0gX19udSAqIHN0ZDo6bG9nKF9feDIpOworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgIF9fZmFjdCAtPSBzdGQ6OnRyMTo6bGdhbW1hKF9fbnUgKyBfVHAoMSkpOworI2Vsc2UKKyAgICAgIF9fZmFjdCAtPSBfX2xvZ19nYW1tYShfX251ICsgX1RwKDEpKTsKKyNlbmRpZgorICAgICAgX19mYWN0ID0gc3RkOjpleHAoX19mYWN0KTsKKyAgICAgIGNvbnN0IF9UcCBfX3h4NCA9IF9fc2duICogX194MiAqIF9feDI7CisgICAgICBfVHAgX19KbiA9IF9UcCgxKTsKKyAgICAgIF9UcCBfX3Rlcm0gPSBfVHAoMSk7CisKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9faSA9IDE7IF9faSA8IF9fbWF4X2l0ZXI7ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgX190ZXJtICo9IF9feHg0IC8gKF9UcChfX2kpICogKF9fbnUgKyBfVHAoX19pKSkpOworICAgICAgICAgIF9fSm4gKz0gX190ZXJtOworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX3Rlcm0gLyBfX0puKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIF9fZmFjdCAqIF9fSm47CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBCZXNzZWwgZnVuY3Rpb24gb2Ygb3JkZXIgXGYkIFxudSBcZiQ6CisgICAgICogICAgICAgICAgIFxmJCBKX3tcbnV9KHgpIFxmJC4KKyAgICAgKgorICAgICAqICAgVGhlIGN5bGluZHJpY2FsIEJlc3NlbCBmdW5jdGlvbiBpczoKKyAgICAgKiAgIEBmWworICAgICAqICAgIEpfe1xudX0oeCkgPSBcc3VtX3trPTB9XntcaW5mdHl9CisgICAgICogICAgICAgICAgICAgIFxmcmFjeygtMSleayAoeC8yKV57XG51ICsgMmt9fXtrIVxHYW1tYShcbnUraysxKX0KKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBAcGFyYW0gIF9fbnUgIFRoZSBvcmRlciBvZiB0aGUgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX3ggICBUaGUgYXJndW1lbnQgb2YgdGhlIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBvdXRwdXQgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2N5bF9iZXNzZWxfaihfVHAgX19udSwgX1RwIF9feCkKKyAgICB7CisgICAgICBpZiAoX19udSA8IF9UcCgwKSB8fCBfX3ggPCBfVHAoMCkpCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJCYWQgYXJndW1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19jeWxfYmVzc2VsX2ouIikpOworICAgICAgZWxzZSBpZiAoX19pc25hbihfX251KSB8fCBfX2lzbmFuKF9feCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZSBpZiAoX194ICogX194IDwgX1RwKDEwKSAqIChfX251ICsgX1RwKDEpKSkKKyAgICAgICAgcmV0dXJuIF9fY3lsX2Jlc3NlbF9pal9zZXJpZXMoX19udSwgX194LCAtX1RwKDEpLCAyMDApOworICAgICAgZWxzZSBpZiAoX194ID4gX1RwKDEwMDApKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fSl9udSwgX19OX251OworICAgICAgICAgIF9fY3lsX2Jlc3NlbF9qbl9hc3ltcChfX251LCBfX3gsIF9fSl9udSwgX19OX251KTsKKyAgICAgICAgICByZXR1cm4gX19KX251OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19KX251LCBfX05fbnUsIF9fSnBfbnUsIF9fTnBfbnU7CisgICAgICAgICAgX19iZXNzZWxfam4oX19udSwgX194LCBfX0pfbnUsIF9fTl9udSwgX19KcF9udSwgX19OcF9udSk7CisgICAgICAgICAgcmV0dXJuIF9fSl9udTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgTmV1bWFubiBmdW5jdGlvbiBvZiBvcmRlciBcZiQgXG51IFxmJDoKKyAgICAgKiAgICAgICAgICAgXGYkIE5fe1xudX0oeCkgXGYkLgorICAgICAqCisgICAgICogICBUaGUgTmV1bWFubiBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgICBOX3tcbnV9KHgpID0gXGZyYWN7Sl97XG51fSh4KSBcY29zIFxudVxwaSAtIEpfey1cbnV9KHgpfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAge1xzaW4gXG51XHBpfQorICAgICAqICAgQGZdCisgICAgICogICB3aGVyZSBmb3IgaW50ZWdyYWwgXGYkIFxudSA9IG4gXGYkIGEgbGltaXQgaXMgdGFrZW46CisgICAgICogICBcZiQgbGltX3tcbnUgXHRvIG59IFxmJC4KKyAgICAgKgorICAgICAqICAgQHBhcmFtICBfX251ICBUaGUgb3JkZXIgb2YgdGhlIE5ldW1hbm4gZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9feCAgIFRoZSBhcmd1bWVudCBvZiB0aGUgTmV1bWFubiBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBvdXRwdXQgTmV1bWFubiBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19jeWxfbmV1bWFubl9uKF9UcCBfX251LCBfVHAgX194KQorICAgIHsKKyAgICAgIGlmIChfX251IDwgX1RwKDApIHx8IF9feCA8IF9UcCgwKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkJhZCBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2N5bF9uZXVtYW5uX24uIikpOworICAgICAgZWxzZSBpZiAoX19pc25hbihfX251KSB8fCBfX2lzbmFuKF9feCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZSBpZiAoX194ID4gX1RwKDEwMDApKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fSl9udSwgX19OX251OworICAgICAgICAgIF9fY3lsX2Jlc3NlbF9qbl9hc3ltcChfX251LCBfX3gsIF9fSl9udSwgX19OX251KTsKKyAgICAgICAgICByZXR1cm4gX19OX251OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19KX251LCBfX05fbnUsIF9fSnBfbnUsIF9fTnBfbnU7CisgICAgICAgICAgX19iZXNzZWxfam4oX19udSwgX194LCBfX0pfbnUsIF9fTl9udSwgX19KcF9udSwgX19OcF9udSk7CisgICAgICAgICAgcmV0dXJuIF9fTl9udTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIENvbXB1dGUgdGhlIHNwaGVyaWNhbCBCZXNzZWwgQGYkIGpfbih4KSBAZiQKKyAgICAgKiAgICAgICAgICAgYW5kIE5ldW1hbm4gQGYkIG5fbih4KSBAZiQgZnVuY3Rpb25zIGFuZCB0aGVpciBmaXJzdAorICAgICAqICAgICAgICAgICBkZXJpdmF0aXZlcyBAZiQgaidfbih4KSBAZiQgYW5kIEBmJCBuJ19uKHgpIEBmJAorICAgICAqICAgICAgICAgICByZXNwZWN0aXZlbHkuCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX19uICBUaGUgb3JkZXIgb2YgdGhlIHNwaGVyaWNhbCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBzcGhlcmljYWwgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX2pfbiAgVGhlIG91dHB1dCBzcGhlcmljYWwgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX25fbiAgVGhlIG91dHB1dCBzcGhlcmljYWwgTmV1bWFubiBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19qcF9uIFRoZSBvdXRwdXQgZGVyaXZhdGl2ZSBvZiB0aGUgc3BoZXJpY2FsIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19ucF9uIFRoZSBvdXRwdXQgZGVyaXZhdGl2ZSBvZiB0aGUgc3BoZXJpY2FsIE5ldW1hbm4gZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgX19zcGhfYmVzc2VsX2puKHVuc2lnbmVkIGludCBfX24sIF9UcCBfX3gsCisgICAgICAgICAgICAgICAgICAgIF9UcCAmIF9fal9uLCBfVHAgJiBfX25fbiwgX1RwICYgX19qcF9uLCBfVHAgJiBfX25wX24pCisgICAgeworICAgICAgY29uc3QgX1RwIF9fbnUgPSBfVHAoX19uKSArIF9UcCgwLjVMKTsKKworICAgICAgX1RwIF9fSl9udSwgX19OX251LCBfX0pwX251LCBfX05wX251OworICAgICAgX19iZXNzZWxfam4oX19udSwgX194LCBfX0pfbnUsIF9fTl9udSwgX19KcF9udSwgX19OcF9udSk7CisKKyAgICAgIGNvbnN0IF9UcCBfX2ZhY3RvciA9IF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19zcXJ0cGlvMigpCisgICAgICAgICAgICAgICAgICAgICAgICAgLyBzdGQ6OnNxcnQoX194KTsKKworICAgICAgX19qX24gPSBfX2ZhY3RvciAqIF9fSl9udTsKKyAgICAgIF9fbl9uID0gX19mYWN0b3IgKiBfX05fbnU7CisgICAgICBfX2pwX24gPSBfX2ZhY3RvciAqIF9fSnBfbnUgLSBfX2pfbiAvIChfVHAoMikgKiBfX3gpOworICAgICAgX19ucF9uID0gX19mYWN0b3IgKiBfX05wX251IC0gX19uX24gLyAoX1RwKDIpICogX194KTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgc3BoZXJpY2FsIEJlc3NlbCBmdW5jdGlvbgorICAgICAqICAgICAgICAgICBAZiQgal9uKHgpIEBmJCBvZiBvcmRlciBuLgorICAgICAqCisgICAgICogICBUaGUgc3BoZXJpY2FsIEJlc3NlbCBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgal9uKHgpID0gXGxlZnQoIFxmcmFje1xwaX17Mnh9IFxyaWdodCkgXnsxLzJ9IEpfe24rMS8yfSh4KQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX19uICBUaGUgb3JkZXIgb2YgdGhlIHNwaGVyaWNhbCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBzcGhlcmljYWwgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIG91dHB1dCBzcGhlcmljYWwgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19zcGhfYmVzc2VsKHVuc2lnbmVkIGludCBfX24sIF9UcCBfX3gpCisgICAgeworICAgICAgaWYgKF9feCA8IF9UcCgwKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkJhZCBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX3NwaF9iZXNzZWwuIikpOworICAgICAgZWxzZSBpZiAoX19pc25hbihfX3gpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKF9feCA9PSBfVHAoMCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX19uID09IDApCisgICAgICAgICAgICByZXR1cm4gX1RwKDEpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBfVHAoMCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX2pfbiwgX19uX24sIF9fanBfbiwgX19ucF9uOworICAgICAgICAgIF9fc3BoX2Jlc3NlbF9qbihfX24sIF9feCwgX19qX24sIF9fbl9uLCBfX2pwX24sIF9fbnBfbik7CisgICAgICAgICAgcmV0dXJuIF9fal9uOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBzcGhlcmljYWwgTmV1bWFubiBmdW5jdGlvbgorICAgICAqICAgICAgICAgICBAZiQgbl9uKHgpIEBmJC4KKyAgICAgKgorICAgICAqICAgVGhlIHNwaGVyaWNhbCBOZXVtYW5uIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICBuX24oeCkgPSBcbGVmdCggXGZyYWN7XHBpfXsyeH0gXHJpZ2h0KSBeezEvMn0gTl97bisxLzJ9KHgpCisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQHBhcmFtICBfX24gIFRoZSBvcmRlciBvZiB0aGUgc3BoZXJpY2FsIE5ldW1hbm4gZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBzcGhlcmljYWwgTmV1bWFubiBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBvdXRwdXQgc3BoZXJpY2FsIE5ldW1hbm4gZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3NwaF9uZXVtYW5uKHVuc2lnbmVkIGludCBfX24sIF9UcCBfX3gpCisgICAgeworICAgICAgaWYgKF9feCA8IF9UcCgwKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkJhZCBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX3NwaF9uZXVtYW5uLiIpKTsKKyAgICAgIGVsc2UgaWYgKF9faXNuYW4oX194KSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChfX3ggPT0gX1RwKDApKQorICAgICAgICByZXR1cm4gLXN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6aW5maW5pdHkoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX2pfbiwgX19uX24sIF9fanBfbiwgX19ucF9uOworICAgICAgICAgIF9fc3BoX2Jlc3NlbF9qbihfX24sIF9feCwgX19qX24sIF9fbl9uLCBfX2pwX24sIF9fbnBfbik7CisgICAgICAgICAgcmV0dXJuIF9fbl9uOworICAgICAgICB9CisgICAgfQorCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSBzdGQ6OnRyMTo6X19kZXRhaWwKK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9CRVNTRUxfRlVOQ1RJT05fVENDCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9iZXRhX2Z1bmN0aW9uLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2JldGFfZnVuY3Rpb24udGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNDJhMmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9iZXRhX2Z1bmN0aW9uLnRjYwpAQCAtMCwwICsxLDE5NyBAQAorLy8gU3BlY2lhbCBmdW5jdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvYmV0YV9mdW5jdGlvbi50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt0cjEvY21hdGh9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODIgVFIxOiA1LjIgIFNwZWNpYWwgZnVuY3Rpb25zCisvLworCisvLyBXcml0dGVuIGJ5IEVkd2FyZCBTbWl0aC1Sb3dsYW5kIGJhc2VkIG9uOgorLy8gICAoMSkgSGFuZGJvb2sgb2YgTWF0aGVtYXRpY2FsIEZ1bmN0aW9ucywKKy8vICAgICAgIGVkLiBNaWx0b24gQWJyYW1vd2l0eiBhbmQgSXJlbmUgQS4gU3RlZ3VuLAorLy8gICAgICAgRG92ZXIgUHVibGljYXRpb25zLAorLy8gICAgICAgU2VjdGlvbiA2LCBwcC4gMjUzLTI2NgorLy8gICAoMikgVGhlIEdudSBTY2llbnRpZmljIExpYnJhcnksIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nc2wKKy8vICAgKDMpIE51bWVyaWNhbCBSZWNpcGVzIGluIEMsIGJ5IFcuIEguIFByZXNzLCBTLiBBLiBUZXVrb2xza3ksCisvLyAgICAgICBXLiBULiBWZXR0ZXJsaW5nLCBCLiBQLiBGbGFubmVyeSwgQ2FtYnJpZGdlIFVuaXZlcnNpdHkgUHJlc3MgKDE5OTIpLAorLy8gICAgICAgMm5kIGVkLCBwcC4gMjEzLTIxNgorLy8gICAoNCkgR2FtbWEsIEV4cGxvcmluZyBFdWxlcidzIENvbnN0YW50LCBKdWxpYW4gSGF2aWwsCisvLyAgICAgICBQcmluY2V0b24sIDIwMDMuCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0JFVEFfRlVOQ1RJT05fVENDCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9CRVRBX0ZVTkNUSU9OX1RDQyAxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworICAvLyBbNS4yXSBTcGVjaWFsIGZ1bmN0aW9ucworCisgIC8vIEltcGxlbWVudGF0aW9uLXNwYWNlIGRldGFpbHMuCisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBiZXRhIGZ1bmN0aW9uOiBcZiRCKHgseSlcZiQuCisgICAgICogCisgICAgICogICBUaGUgYmV0YSBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5CisgICAgICogICBAZlsKKyAgICAgKiAgICAgQih4LHkpID0gXGZyYWN7XEdhbW1hKHgpXEdhbW1hKHkpfXtcR2FtbWEoeCt5KX0KKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBAcGFyYW0gX194IFRoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgYmV0YSBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSBfX3kgVGhlIHNlY29uZCBhcmd1bWVudCBvZiB0aGUgYmV0YSBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBiZXRhIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2JldGFfZ2FtbWEoX1RwIF9feCwgX1RwIF9feSkKKyAgICB7CisKKyAgICAgIF9UcCBfX2JldDsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICBpZiAoX194ID4gX195KQorICAgICAgICB7CisgICAgICAgICAgX19iZXQgPSBzdGQ6OnRyMTo6dGdhbW1hKF9feCkKKyAgICAgICAgICAgICAgICAvIHN0ZDo6dHIxOjp0Z2FtbWEoX194ICsgX195KTsKKyAgICAgICAgICBfX2JldCAqPSBzdGQ6OnRyMTo6dGdhbW1hKF9feSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9fYmV0ID0gc3RkOjp0cjE6OnRnYW1tYShfX3kpCisgICAgICAgICAgICAgICAgLyBzdGQ6OnRyMTo6dGdhbW1hKF9feCArIF9feSk7CisgICAgICAgICAgX19iZXQgKj0gc3RkOjp0cjE6OnRnYW1tYShfX3gpOworICAgICAgICB9CisjZWxzZQorICAgICAgaWYgKF9feCA+IF9feSkKKyAgICAgICAgeworICAgICAgICAgIF9fYmV0ID0gX19nYW1tYShfX3gpIC8gX19nYW1tYShfX3ggKyBfX3kpOworICAgICAgICAgIF9fYmV0ICo9IF9fZ2FtbWEoX195KTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX19iZXQgPSBfX2dhbW1hKF9feSkgLyBfX2dhbW1hKF9feCArIF9feSk7CisgICAgICAgICAgX19iZXQgKj0gX19nYW1tYShfX3gpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgcmV0dXJuIF9fYmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIGJldGEgZnVuY3Rpb24gXGYkQih4LHkpXGYkIHVzaW5nCisgICAgICogICAgICAgICAgIHRoZSBsb2cgZ2FtbWEgZnVuY3Rpb25zLgorICAgICAqIAorICAgICAqICAgVGhlIGJldGEgZnVuY3Rpb24gaXMgZGVmaW5lZCBieQorICAgICAqICAgQGZbCisgICAgICogICAgIEIoeCx5KSA9IFxmcmFje1xHYW1tYSh4KVxHYW1tYSh5KX17XEdhbW1hKHgreSl9CisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9feCBUaGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIGJldGEgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gX195IFRoZSBzZWNvbmQgYXJndW1lbnQgb2YgdGhlIGJldGEgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgYmV0YSBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19iZXRhX2xnYW1tYShfVHAgX194LCBfVHAgX195KQorICAgIHsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICBfVHAgX19iZXQgPSBzdGQ6OnRyMTo6bGdhbW1hKF9feCkKKyAgICAgICAgICAgICAgICArIHN0ZDo6dHIxOjpsZ2FtbWEoX195KQorICAgICAgICAgICAgICAgIC0gc3RkOjp0cjE6OmxnYW1tYShfX3ggKyBfX3kpOworI2Vsc2UKKyAgICAgIF9UcCBfX2JldCA9IF9fbG9nX2dhbW1hKF9feCkKKyAgICAgICAgICAgICAgICArIF9fbG9nX2dhbW1hKF9feSkKKyAgICAgICAgICAgICAgICAtIF9fbG9nX2dhbW1hKF9feCArIF9feSk7CisjZW5kaWYKKyAgICAgIF9fYmV0ID0gc3RkOjpleHAoX19iZXQpOworICAgICAgcmV0dXJuIF9fYmV0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgYmV0YSBmdW5jdGlvbiBcZiRCKHgseSlcZiQgdXNpbmcKKyAgICAgKiAgICAgICAgICAgdGhlIHByb2R1Y3QgZm9ybS4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBiZXRhIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnkKKyAgICAgKiAgIEBmWworICAgICAqICAgICBCKHgseSkgPSBcZnJhY3tcR2FtbWEoeClcR2FtbWEoeSl9e1xHYW1tYSh4K3kpfQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSBfX3ggVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBiZXRhIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtIF9feSBUaGUgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBiZXRhIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGJldGEgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fYmV0YV9wcm9kdWN0KF9UcCBfX3gsIF9UcCBfX3kpCisgICAgeworCisgICAgICBfVHAgX19iZXQgPSAoX194ICsgX195KSAvIChfX3ggKiBfX3kpOworCisgICAgICB1bnNpZ25lZCBpbnQgX19tYXhfaXRlciA9IDEwMDAwMDA7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2sgPSAxOyBfX2sgPCBfX21heF9pdGVyOyArK19faykKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX3Rlcm0gPSAoX1RwKDEpICsgKF9feCArIF9feSkgLyBfX2spCisgICAgICAgICAgICAgICAgICAgICAvICgoX1RwKDEpICsgX194IC8gX19rKSAqIChfVHAoMSkgKyBfX3kgLyBfX2spKTsKKyAgICAgICAgICBfX2JldCAqPSBfX3Rlcm07CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIF9fYmV0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgYmV0YSBmdW5jdGlvbiBcZiQgQih4LHkpIFxmJC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBiZXRhIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnkKKyAgICAgKiAgIEBmWworICAgICAqICAgICBCKHgseSkgPSBcZnJhY3tcR2FtbWEoeClcR2FtbWEoeSl9e1xHYW1tYSh4K3kpfQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSBfX3ggVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBiZXRhIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtIF9feSBUaGUgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBiZXRhIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGJldGEgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBfX2JldGEoX1RwIF9feCwgX1RwIF9feSkKKyAgICB7CisgICAgICBpZiAoX19pc25hbihfX3gpIHx8IF9faXNuYW4oX195KSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfX2JldGFfbGdhbW1hKF9feCwgX195KTsKKyAgICB9CisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0gLy8gbmFtZXNwYWNlIHN0ZDo6dHIxOjpfX2RldGFpbAorfQorfQorCisjZW5kaWYgLy8gX19HTElCQ1hYX1RSMV9CRVRBX0ZVTkNUSU9OX1RDQwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY2NvbXBsZXggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jY29tcGxleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjY1NzZmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY2NvbXBsZXgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIGNjb21wbGV4IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY2NvbXBsZXgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQ0NPTVBMRVgKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0NDT01QTEVYIDEKKworI2luY2x1ZGUgPHRyMS9jb21wbGV4PgorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NDT01QTEVYCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jY3R5cGUgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jY3R5cGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiYTE1OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NjdHlwZQpAQCAtMCwwICsxLDQ5IEBACisvLyBUUjEgY2N0eXBlIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY2N0eXBlCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0NDVFlQRQorI2RlZmluZSBfR0xJQkNYWF9UUjFfQ0NUWVBFIDEKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Y2N0eXBlPgorCisjaWZkZWYgX0dMSUJDWFhfVVNFX0M5OV9DVFlQRV9UUjEKKworI3VuZGVmIGlzYmxhbmsKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIHVzaW5nIDo6aXNibGFuazsKK30KK30KKworI2VuZGlmCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfQ0NUWVBFCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jZmVudiBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NmZW52Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNGE4OWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jZmVudgpAQCAtMCwwICsxLDgxIEBACisvLyBUUjEgY2ZlbnYgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9jZmVudgorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9DRkVOVgorI2RlZmluZSBfR0xJQkNYWF9UUjFfQ0ZFTlYgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCisjaWYgX0dMSUJDWFhfSEFWRV9GRU5WX0gKKyMgaW5jbHVkZSA8ZmVudi5oPgorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X0ZFTlZfVFIxCisKKyN1bmRlZiBmZWNsZWFyZXhjZXB0CisjdW5kZWYgZmVnZXRleGNlcHRmbGFnCisjdW5kZWYgZmVyYWlzZWV4Y2VwdAorI3VuZGVmIGZlc2V0ZXhjZXB0ZmxhZworI3VuZGVmIGZldGVzdGV4Y2VwdAorI3VuZGVmIGZlZ2V0cm91bmQKKyN1bmRlZiBmZXNldHJvdW5kCisjdW5kZWYgZmVnZXRlbnYKKyN1bmRlZiBmZWhvbGRleGNlcHQKKyN1bmRlZiBmZXNldGVudgorI3VuZGVmIGZldXBkYXRlZW52CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworICAvLyB0eXBlcworICB1c2luZyA6OmZlbnZfdDsKKyAgdXNpbmcgOjpmZXhjZXB0X3Q7CisKKyAgLy8gZnVuY3Rpb25zCisgIHVzaW5nIDo6ZmVjbGVhcmV4Y2VwdDsKKyAgdXNpbmcgOjpmZWdldGV4Y2VwdGZsYWc7CisgIHVzaW5nIDo6ZmVyYWlzZWV4Y2VwdDsKKyAgdXNpbmcgOjpmZXNldGV4Y2VwdGZsYWc7CisgIHVzaW5nIDo6ZmV0ZXN0ZXhjZXB0OworCisgIHVzaW5nIDo6ZmVnZXRyb3VuZDsKKyAgdXNpbmcgOjpmZXNldHJvdW5kOworCisgIHVzaW5nIDo6ZmVnZXRlbnY7CisgIHVzaW5nIDo6ZmVob2xkZXhjZXB0OworICB1c2luZyA6OmZlc2V0ZW52OworICB1c2luZyA6OmZldXBkYXRlZW52OworfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVVNFX0M5OV9GRU5WX1RSMQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NGRU5WCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jZmxvYXQgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jZmxvYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2N2ZhMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NmbG9hdApAQCAtMCwwICsxLDQyIEBACisvLyBUUjEgY2Zsb2F0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY2Zsb2F0CisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0NGTE9BVAorI2RlZmluZSBfR0xJQkNYWF9UUjFfQ0ZMT0FUIDEKKworI2luY2x1ZGUgPGNmbG9hdD4KKworI2lmbmRlZiBERUNJTUFMX0RJRworI2RlZmluZSBERUNJTUFMX0RJRyBfX0RFQ0lNQUxfRElHX18KKyNlbmRpZgorCisjaWZuZGVmIEZMVF9FVkFMX01FVEhPRAorI2RlZmluZSBGTFRfRVZBTF9NRVRIT0QgX19GTFRfRVZBTF9NRVRIT0RfXworI2VuZGlmCisKKyNlbmRpZiAvL19HTElCQ1hYX1RSMV9DRkxPQVQgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jaW50dHlwZXMgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jaW50dHlwZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlNTFlZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NpbnR0eXBlcwpAQCAtMCwwICsxLDg0IEBACisvLyBUUjEgY2ludHR5cGVzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY2ludHR5cGVzCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0NJTlRUWVBFUworI2RlZmluZSBfR0xJQkNYWF9UUjFfQ0lOVFRZUEVTIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8dHIxL2NzdGRpbnQ+CisKKy8vIEZvciA4LjExLjEvMSAoc2VlIEM5OSwgTm90ZSAxODQpCisjaWYgX0dMSUJDWFhfSEFWRV9JTlRUWVBFU19ICisjIGlmbmRlZiBfX1NURENfRk9STUFUX01BQ1JPUworIyAgZGVmaW5lIF9VTkRFRl9fU1REQ19GT1JNQVRfTUFDUk9TCisjICBkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKKyMgZW5kaWYKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyMgaWZkZWYgX1VOREVGX19TVERDX0ZPUk1BVF9NQUNST1MKKyMgIHVuZGVmIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjICB1bmRlZiBfVU5ERUZfX1NURENfRk9STUFUX01BQ1JPUworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X0lOVFRZUEVTX1RSMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKKyAgLy8gdHlwZXMKKyAgdXNpbmcgOjppbWF4ZGl2X3Q7CisKKyAgLy8gZnVuY3Rpb25zCisgIHVzaW5nIDo6aW1heGFiczsKKworICAvLyBNYXkgY29sbGlkZSB3aXRoIF9Mb25nbG9uZyBhYnMoX0xvbmdsb25nKSwgYW5kIGlzIG5vdCBkZXNjcmliZWQKKyAgLy8gYW55d2hlcmUgb3V0c2lkZSB0aGUgc3lub3BzaXMuICBMaWtlbHksIGEgZGVmZWN0LgorICAvLworICAvLyBpbnRtYXhfdCBhYnMoaW50bWF4X3QpCisKKyAgdXNpbmcgOjppbWF4ZGl2OworCisgIC8vIExpa2V3aXNlLCB3aXRoIGxsZGl2X3QgZGl2KF9Mb25nbG9uZywgX0xvbmdsb25nKS4KKyAgLy8KKyAgLy8gaW1heGRpdl90IGRpdihpbnRtYXhfdCwgaW50bWF4X3QpCisKKyAgdXNpbmcgOjpzdHJ0b2ltYXg7CisgIHVzaW5nIDo6c3RydG91bWF4OworCisjaWYgZGVmaW5lZChfR0xJQkNYWF9VU0VfV0NIQVJfVCkgJiYgX0dMSUJDWFhfVVNFX0M5OV9JTlRUWVBFU19XQ0hBUl9UX1RSMQorICB1c2luZyA6Ondjc3RvaW1heDsKKyAgdXNpbmcgOjp3Y3N0b3VtYXg7CisjZW5kaWYKK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1VTRV9DOTlfSU5UVFlQRVNfVFIxCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfQ0lOVFRZUEVTCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jbGltaXRzIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY2xpbWl0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWUwOTg4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY2xpbWl0cwpAQCAtMCwwICsxLDQ2IEBACisvLyBUUjEgY2xpbWl0cyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2NsaW1pdHMKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQ0xJTUlUUworI2RlZmluZSBfR0xJQkNYWF9UUjFfQ0xJTUlUUyAxCisKKyNpbmNsdWRlIDxjbGltaXRzPgorCisjaWZuZGVmIExMT05HX01JTgorI2RlZmluZSBMTE9OR19NSU4gKC1fX0xPTkdfTE9OR19NQVhfXyAtIDEpCisjZW5kaWYKKworI2lmbmRlZiBMTE9OR19NQVgKKyNkZWZpbmUgTExPTkdfTUFYIF9fTE9OR19MT05HX01BWF9fCisjZW5kaWYKKworI2lmbmRlZiBVTExPTkdfTUFYCisjZGVmaW5lIFVMTE9OR19NQVggKF9fTE9OR19MT05HX01BWF9fICogMlVMTCArIDEpCisjZW5kaWYKKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9DTElNSVRTCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jbWF0aCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NtYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NThhZmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jbWF0aApAQCAtMCwwICsxLDE0NDAgQEAKKy8vIFRSMSBjbWF0aCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2NtYXRoCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0NNQVRICisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DTUFUSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGNtYXRoPgorCisjaWZkZWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorCisjdW5kZWYgYWNvc2gKKyN1bmRlZiBhY29zaGYKKyN1bmRlZiBhY29zaGwKKyN1bmRlZiBhc2luaAorI3VuZGVmIGFzaW5oZgorI3VuZGVmIGFzaW5obAorI3VuZGVmIGF0YW5oCisjdW5kZWYgYXRhbmhmCisjdW5kZWYgYXRhbmhsCisjdW5kZWYgY2JydAorI3VuZGVmIGNicnRmCisjdW5kZWYgY2JydGwKKyN1bmRlZiBjb3B5c2lnbgorI3VuZGVmIGNvcHlzaWduZgorI3VuZGVmIGNvcHlzaWdubAorI3VuZGVmIGVyZgorI3VuZGVmIGVyZmYKKyN1bmRlZiBlcmZsCisjdW5kZWYgZXJmYworI3VuZGVmIGVyZmNmCisjdW5kZWYgZXJmY2wKKyN1bmRlZiBleHAyCisjdW5kZWYgZXhwMmYKKyN1bmRlZiBleHAybAorI3VuZGVmIGV4cG0xCisjdW5kZWYgZXhwbTFmCisjdW5kZWYgZXhwbTFsCisjdW5kZWYgZmRpbQorI3VuZGVmIGZkaW1mCisjdW5kZWYgZmRpbWwKKyN1bmRlZiBmbWEKKyN1bmRlZiBmbWFmCisjdW5kZWYgZm1hbAorI3VuZGVmIGZtYXgKKyN1bmRlZiBmbWF4ZgorI3VuZGVmIGZtYXhsCisjdW5kZWYgZm1pbgorI3VuZGVmIGZtaW5mCisjdW5kZWYgZm1pbmwKKyN1bmRlZiBoeXBvdAorI3VuZGVmIGh5cG90ZgorI3VuZGVmIGh5cG90bAorI3VuZGVmIGlsb2diCisjdW5kZWYgaWxvZ2JmCisjdW5kZWYgaWxvZ2JsCisjdW5kZWYgbGdhbW1hCisjdW5kZWYgbGdhbW1hZgorI3VuZGVmIGxnYW1tYWwKKyN1bmRlZiBsbHJpbnQKKyN1bmRlZiBsbHJpbnRmCisjdW5kZWYgbGxyaW50bAorI3VuZGVmIGxscm91bmQKKyN1bmRlZiBsbHJvdW5kZgorI3VuZGVmIGxscm91bmRsCisjdW5kZWYgbG9nMXAKKyN1bmRlZiBsb2cxcGYKKyN1bmRlZiBsb2cxcGwKKyN1bmRlZiBsb2cyCisjdW5kZWYgbG9nMmYKKyN1bmRlZiBsb2cybAorI3VuZGVmIGxvZ2IKKyN1bmRlZiBsb2diZgorI3VuZGVmIGxvZ2JsCisjdW5kZWYgbHJpbnQKKyN1bmRlZiBscmludGYKKyN1bmRlZiBscmludGwKKyN1bmRlZiBscm91bmQKKyN1bmRlZiBscm91bmRmCisjdW5kZWYgbHJvdW5kbAorI3VuZGVmIG5hbgorI3VuZGVmIG5hbmYKKyN1bmRlZiBuYW5sCisjdW5kZWYgbmVhcmJ5aW50CisjdW5kZWYgbmVhcmJ5aW50ZgorI3VuZGVmIG5lYXJieWludGwKKyN1bmRlZiBuZXh0YWZ0ZXIKKyN1bmRlZiBuZXh0YWZ0ZXJmCisjdW5kZWYgbmV4dGFmdGVybAorI3VuZGVmIG5leHR0b3dhcmQKKyN1bmRlZiBuZXh0dG93YXJkZgorI3VuZGVmIG5leHR0b3dhcmRsCisjdW5kZWYgcmVtYWluZGVyCisjdW5kZWYgcmVtYWluZGVyZgorI3VuZGVmIHJlbWFpbmRlcmwKKyN1bmRlZiByZW1xdW8KKyN1bmRlZiByZW1xdW9mCisjdW5kZWYgcmVtcXVvbAorI3VuZGVmIHJpbnQKKyN1bmRlZiByaW50ZgorI3VuZGVmIHJpbnRsCisjdW5kZWYgcm91bmQKKyN1bmRlZiByb3VuZGYKKyN1bmRlZiByb3VuZGwKKyN1bmRlZiBzY2FsYmxuCisjdW5kZWYgc2NhbGJsbmYKKyN1bmRlZiBzY2FsYmxubAorI3VuZGVmIHNjYWxibgorI3VuZGVmIHNjYWxibmYKKyN1bmRlZiBzY2FsYm5sCisjdW5kZWYgdGdhbW1hCisjdW5kZWYgdGdhbW1hZgorI3VuZGVmIHRnYW1tYWwKKyN1bmRlZiB0cnVuYworI3VuZGVmIHRydW5jZgorI3VuZGVmIHRydW5jbAorCisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorCisgIC8vIHR5cGVzCisgIHVzaW5nIDo6ZG91YmxlX3Q7CisgIHVzaW5nIDo6ZmxvYXRfdDsKKworICAvLyBmdW5jdGlvbnMKKyAgdXNpbmcgOjphY29zaDsKKyAgdXNpbmcgOjphY29zaGY7CisgIHVzaW5nIDo6YWNvc2hsOworCisgIHVzaW5nIDo6YXNpbmg7CisgIHVzaW5nIDo6YXNpbmhmOworICB1c2luZyA6OmFzaW5obDsKKworICB1c2luZyA6OmF0YW5oOworICB1c2luZyA6OmF0YW5oZjsKKyAgdXNpbmcgOjphdGFuaGw7CisKKyAgdXNpbmcgOjpjYnJ0OworICB1c2luZyA6OmNicnRmOworICB1c2luZyA6OmNicnRsOworCisgIHVzaW5nIDo6Y29weXNpZ247CisgIHVzaW5nIDo6Y29weXNpZ25mOworICB1c2luZyA6OmNvcHlzaWdubDsKKworICB1c2luZyA6OmVyZjsKKyAgdXNpbmcgOjplcmZmOworICB1c2luZyA6OmVyZmw7CisKKyAgdXNpbmcgOjplcmZjOworICB1c2luZyA6OmVyZmNmOworICB1c2luZyA6OmVyZmNsOworCisgIHVzaW5nIDo6ZXhwMjsKKyAgdXNpbmcgOjpleHAyZjsKKyAgdXNpbmcgOjpleHAybDsKKworICB1c2luZyA6OmV4cG0xOworICB1c2luZyA6OmV4cG0xZjsKKyAgdXNpbmcgOjpleHBtMWw7CisKKyAgdXNpbmcgOjpmZGltOworICB1c2luZyA6OmZkaW1mOworICB1c2luZyA6OmZkaW1sOworCisgIHVzaW5nIDo6Zm1hOworICB1c2luZyA6OmZtYWY7CisgIHVzaW5nIDo6Zm1hbDsKKworICB1c2luZyA6OmZtYXg7CisgIHVzaW5nIDo6Zm1heGY7CisgIHVzaW5nIDo6Zm1heGw7CisKKyAgdXNpbmcgOjpmbWluOworICB1c2luZyA6OmZtaW5mOworICB1c2luZyA6OmZtaW5sOworCisgIHVzaW5nIDo6aHlwb3Q7CisgIHVzaW5nIDo6aHlwb3RmOworICB1c2luZyA6Omh5cG90bDsKKworICB1c2luZyA6Omlsb2diOworICB1c2luZyA6Omlsb2diZjsKKyAgdXNpbmcgOjppbG9nYmw7CisKKyAgdXNpbmcgOjpsZ2FtbWE7CisgIHVzaW5nIDo6bGdhbW1hZjsKKyAgdXNpbmcgOjpsZ2FtbWFsOworCisgIHVzaW5nIDo6bGxyaW50OworICB1c2luZyA6OmxscmludGY7CisgIHVzaW5nIDo6bGxyaW50bDsKKworICB1c2luZyA6Omxscm91bmQ7CisgIHVzaW5nIDo6bGxyb3VuZGY7CisgIHVzaW5nIDo6bGxyb3VuZGw7CisKKyAgdXNpbmcgOjpsb2cxcDsKKyAgdXNpbmcgOjpsb2cxcGY7CisgIHVzaW5nIDo6bG9nMXBsOworCisgIHVzaW5nIDo6bG9nMjsKKyAgdXNpbmcgOjpsb2cyZjsKKyAgdXNpbmcgOjpsb2cybDsKKworICB1c2luZyA6OmxvZ2I7CisgIHVzaW5nIDo6bG9nYmY7CisgIHVzaW5nIDo6bG9nYmw7CisKKyAgdXNpbmcgOjpscmludDsKKyAgdXNpbmcgOjpscmludGY7CisgIHVzaW5nIDo6bHJpbnRsOworCisgIHVzaW5nIDo6bHJvdW5kOworICB1c2luZyA6Omxyb3VuZGY7CisgIHVzaW5nIDo6bHJvdW5kbDsKKworICB1c2luZyA6Om5hbjsKKyAgdXNpbmcgOjpuYW5mOworICB1c2luZyA6Om5hbmw7CisKKyAgdXNpbmcgOjpuZWFyYnlpbnQ7CisgIHVzaW5nIDo6bmVhcmJ5aW50ZjsKKyAgdXNpbmcgOjpuZWFyYnlpbnRsOworCisgIHVzaW5nIDo6bmV4dGFmdGVyOworICB1c2luZyA6Om5leHRhZnRlcmY7CisgIHVzaW5nIDo6bmV4dGFmdGVybDsKKworICB1c2luZyA6Om5leHR0b3dhcmQ7CisgIHVzaW5nIDo6bmV4dHRvd2FyZGY7CisgIHVzaW5nIDo6bmV4dHRvd2FyZGw7CisKKyAgdXNpbmcgOjpyZW1haW5kZXI7CisgIHVzaW5nIDo6cmVtYWluZGVyZjsKKyAgdXNpbmcgOjpyZW1haW5kZXJsOworCisgIHVzaW5nIDo6cmVtcXVvOworICB1c2luZyA6OnJlbXF1b2Y7CisgIHVzaW5nIDo6cmVtcXVvbDsKKworICB1c2luZyA6OnJpbnQ7CisgIHVzaW5nIDo6cmludGY7CisgIHVzaW5nIDo6cmludGw7CisKKyAgdXNpbmcgOjpyb3VuZDsKKyAgdXNpbmcgOjpyb3VuZGY7CisgIHVzaW5nIDo6cm91bmRsOworCisgIHVzaW5nIDo6c2NhbGJsbjsKKyAgdXNpbmcgOjpzY2FsYmxuZjsKKyAgdXNpbmcgOjpzY2FsYmxubDsKKworICB1c2luZyA6OnNjYWxibjsKKyAgdXNpbmcgOjpzY2FsYm5mOworICB1c2luZyA6OnNjYWxibmw7CisKKyAgdXNpbmcgOjp0Z2FtbWE7CisgIHVzaW5nIDo6dGdhbW1hZjsKKyAgdXNpbmcgOjp0Z2FtbWFsOworCisgIHVzaW5nIDo6dHJ1bmM7CisgIHVzaW5nIDo6dHJ1bmNmOworICB1c2luZyA6OnRydW5jbDsKKworI2VuZGlmCisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEgKKyNpZiAhX0dMSUJDWFhfVVNFX0M5OV9GUF9NQUNST1NfRFlOQU1JQworCisgIC8vLyBGdW5jdGlvbiB0ZW1wbGF0ZSBkZWZpbml0aW9ucyBbOC4xNi4zXS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBmcGNsYXNzaWZ5KF9UcCBfX2YpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9mcGNsYXNzaWZ5KEZQX05BTiwgRlBfSU5GSU5JVEUsIEZQX05PUk1BTCwKKwkJCQkgIEZQX1NVQk5PUk1BTCwgRlBfWkVSTywgX190eXBlKF9fZikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzZmluaXRlKF9UcCBfX2YpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc2Zpbml0ZShfX3R5cGUoX19mKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXNpbmYoX1RwIF9fZikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzaW5mKF9fdHlwZShfX2YpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBpc25hbihfVHAgX19mKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNuYW4oX190eXBlKF9fZikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzbm9ybWFsKF9UcCBfX2YpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc25vcm1hbChfX3R5cGUoX19mKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgc2lnbmJpdChfVHAgX19mKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5fc2lnbmJpdChfX3R5cGUoX19mKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXNncmVhdGVyKF9UcCBfX2YxLCBfVHAgX19mMikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzZ3JlYXRlcihfX3R5cGUoX19mMSksIF9fdHlwZShfX2YyKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXNncmVhdGVyZXF1YWwoX1RwIF9fZjEsIF9UcCBfX2YyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNncmVhdGVyZXF1YWwoX190eXBlKF9fZjEpLCBfX3R5cGUoX19mMikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzbGVzcyhfVHAgX19mMSwgX1RwIF9fZjIpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc2xlc3MoX190eXBlKF9fZjEpLCBfX3R5cGUoX19mMikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzbGVzc2VxdWFsKF9UcCBfX2YxLCBfVHAgX19mMikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzbGVzc2VxdWFsKF9fdHlwZShfX2YxKSwgX190eXBlKF9fZjIpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBpc2xlc3NncmVhdGVyKF9UcCBfX2YxLCBfVHAgX19mMikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzbGVzc2dyZWF0ZXIoX190eXBlKF9fZjEpLCBfX3R5cGUoX19mMikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzdW5vcmRlcmVkKF9UcCBfX2YxLCBfVHAgX19mMikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzdW5vcmRlcmVkKF9fdHlwZShfX2YxKSwgX190eXBlKF9fZjIpKTsKKyAgICB9CisKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisKKyAgLy8vIEFkZGl0aW9uYWwgb3ZlcmxvYWRzIFs4LjE2LjRdLgorICB1c2luZyBzdGQ6OmFjb3M7CisKKyAgaW5saW5lIGZsb2F0CisgIGFjb3NoKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2Fjb3NoZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGFjb3NoKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2Fjb3NobChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgZG91YmxlPjo6X190eXBlCisgICAgYWNvc2goX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fYWNvc2goX194KTsgfQorCisgIHVzaW5nIHN0ZDo6YXNpbjsKKworICBpbmxpbmUgZmxvYXQKKyAgYXNpbmgoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fYXNpbmhmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgYXNpbmgobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fYXNpbmhsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBhc2luaChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9hc2luaChfX3gpOyB9CisKKyAgdXNpbmcgc3RkOjphdGFuOworICB1c2luZyBzdGQ6OmF0YW4yOworCisgIGlubGluZSBmbG9hdAorICBhdGFuaChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9hdGFuaGYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBhdGFuaChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9hdGFuaGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGF0YW5oKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2F0YW5oKF9feCk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgY2JydChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYnJ0ZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGNicnQobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2JydGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGNicnQoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fY2JydChfX3gpOyB9CisKKyAgdXNpbmcgc3RkOjpjZWlsOworCisgIGlubGluZSBmbG9hdAorICBjb3B5c2lnbihmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2NvcHlzaWduZihfX3gsIF9feSk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgY29weXNpZ24obG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jb3B5c2lnbmwoX194LCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUKKyAgICBjb3B5c2lnbihfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gY29weXNpZ24oX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyAgdXNpbmcgc3RkOjpjb3M7CisgIHVzaW5nIHN0ZDo6Y29zaDsgIAorCisgIGlubGluZSBmbG9hdAorICBlcmYoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZXJmZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGVyZihsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9lcmZsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBlcmYoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fZXJmKF9feCk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgZXJmYyhmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9lcmZjZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGVyZmMobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZXJmY2woX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGVyZmMoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fZXJmYyhfX3gpOyB9CisKKyAgdXNpbmcgc3RkOjpleHA7CisKKyAgaW5saW5lIGZsb2F0CisgIGV4cDIoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZXhwMmYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBleHAyKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2V4cDJsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBleHAyKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2V4cDIoX194KTsgfQorCisgIGlubGluZSBmbG9hdAorICBleHBtMShmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9leHBtMWYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBleHBtMShsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9leHBtMWwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGV4cG0xKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2V4cG0xKF9feCk7IH0KKworICAvLyBOb3RlOiB3ZSBkZWFsIHdpdGggZmFicyBpbiBhIHNwZWNpYWwgd2F5LCBiZWNhdXNlIGFuIHVzaW5nIHN0ZDo6ZmFicworICAvLyB3b3VsZCBicmluZyBpbiBhbHNvIHRoZSBvdmVybG9hZHMgZm9yIGNvbXBsZXggdHlwZXMsIHdoaWNoIGluIEMrKzB4CisgIC8vIG1vZGUgaGF2ZSBhIGRpZmZlcmVudCByZXR1cm4gdHlwZS4KKyAgLy8gV2l0aCBfX0NPUlJFQ1RfSVNPX0NQUF9NQVRIX0hfUFJPVE8sIG1hdGguaCBpbXBvcnRzIHN0ZDo6ZmFicyBpbiB0aGUKKyAgLy8gZ2xvYmFsIG5hbWVzcGFjZSBhZnRlciB0aGUgZGVjbGFyYXRpb25zIG9mIHRoZSBmbG9hdCAvIGRvdWJsZSAvIGxvbmcKKyAgLy8gZG91YmxlIG92ZXJsb2FkcyBidXQgYmVmb3JlIHRoZSBzdGQ6OmNvbXBsZXggb3ZlcmxvYWRzLgorICB1c2luZyA6OmZhYnM7CisKKyNpZm5kZWYgX19DT1JSRUNUX0lTT19DUFBfTUFUSF9IX1BST1RPCisgIGlubGluZSBmbG9hdAorICBmYWJzKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZhYnNmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgZmFicyhsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mYWJzbChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgZG91YmxlPjo6X190eXBlCisgICAgZmFicyhfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9mYWJzKF9feCk7IH0KKyNlbmRpZgorCisgIGlubGluZSBmbG9hdAorICBmZGltKGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fZmRpbWYoX194LCBfX3kpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGZkaW0obG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mZGltbChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZQorICAgIGZkaW0oX1RwIF9feCwgX1VwIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIGZkaW0oX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyAgdXNpbmcgc3RkOjpmbG9vcjsKKworICBpbmxpbmUgZmxvYXQKKyAgZm1hKGZsb2F0IF9feCwgZmxvYXQgX195LCBmbG9hdCBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mbWFmKF9feCwgX195LCBfX3opOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGZtYShsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSwgbG9uZyBkb3VibGUgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fZm1hbChfX3gsIF9feSwgX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwLCB0eXBlbmFtZSBfVnA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzM8X1RwLCBfVXAsIF9WcD46Ol9fdHlwZQorICAgIGZtYShfVHAgX194LCBfVXAgX195LCBfVnAgX196KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMzxfVHAsIF9VcCwgX1ZwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBmbWEoX190eXBlKF9feCksIF9fdHlwZShfX3kpLCBfX3R5cGUoX196KSk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBmbWF4KGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fZm1heGYoX194LCBfX3kpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGZtYXgobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mbWF4bChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZQorICAgIGZtYXgoX1RwIF9feCwgX1VwIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIGZtYXgoX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGZtaW4oZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mbWluZihfX3gsIF9feSk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgZm1pbihsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZtaW5sKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlCisgICAgZm1pbihfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gZm1pbihfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICB1c2luZyBzdGQ6OmZtb2Q7CisgIHVzaW5nIHN0ZDo6ZnJleHA7CisKKyAgaW5saW5lIGZsb2F0CisgIGh5cG90KGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5faHlwb3RmKF9feCwgX195KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBoeXBvdChsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2h5cG90bChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZQorICAgIGh5cG90KF9UcCBfX3ksIF9VcCBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBoeXBvdChfX3R5cGUoX195KSwgX190eXBlKF9feCkpOworICAgIH0KKworICBpbmxpbmUgaW50CisgIGlsb2diKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2lsb2diZihfX3gpOyB9CisKKyAgaW5saW5lIGludAorICBpbG9nYihsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pbG9nYmwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlsb2diKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2lsb2diKF9feCk7IH0KKworICB1c2luZyBzdGQ6OmxkZXhwOworCisgIGlubGluZSBmbG9hdAorICBsZ2FtbWEoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbGdhbW1hZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGxnYW1tYShsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sZ2FtbWFsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBsZ2FtbWEoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fbGdhbW1hKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBsb25nCisgIGxscmludChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sbHJpbnRmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBsb25nCisgIGxscmludChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sbHJpbnRsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBsb25nIGxvbmc+OjpfX3R5cGUKKyAgICBsbHJpbnQoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fbGxyaW50KF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBsb25nCisgIGxscm91bmQoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbGxyb3VuZGYoX194KTsgfQorCisgIGlubGluZSBsb25nIGxvbmcKKyAgbGxyb3VuZChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sbHJvdW5kbChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgbG9uZyBsb25nPjo6X190eXBlCisgICAgbGxyb3VuZChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9sbHJvdW5kKF9feCk7IH0KKworICB1c2luZyBzdGQ6OmxvZzsKKyAgdXNpbmcgc3RkOjpsb2cxMDsKKworICBpbmxpbmUgZmxvYXQKKyAgbG9nMXAoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbG9nMXBmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgbG9nMXAobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbG9nMXBsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBsb2cxcChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2cxcChfX3gpOyB9CisKKyAgLy8gRFIgNTY4LgorICBpbmxpbmUgZmxvYXQKKyAgbG9nMihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2cyZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGxvZzIobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbG9nMmwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGxvZzIoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fbG9nMihfX3gpOyB9CisKKyAgaW5saW5lIGZsb2F0CisgIGxvZ2IoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbG9nYmYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBsb2diKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xvZ2JsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBsb2diKF9UcCBfX3gpCisgICAgeworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9sb2diKF9feCk7CisgICAgfQorCisgIGlubGluZSBsb25nCisgIGxyaW50KGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xyaW50ZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcKKyAgbHJpbnQobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbHJpbnRsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBsb25nPjo6X190eXBlCisgICAgbHJpbnQoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fbHJpbnQoX194KTsgfQorCisgIGlubGluZSBsb25nCisgIGxyb3VuZChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9scm91bmRmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZworICBscm91bmQobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbHJvdW5kbChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgbG9uZz46Ol9fdHlwZQorICAgIGxyb3VuZChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9scm91bmQoX194KTsgfQorCisgIGlubGluZSBmbG9hdAorICBuZWFyYnlpbnQoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbmVhcmJ5aW50ZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIG5lYXJieWludChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZWFyYnlpbnRsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBuZWFyYnlpbnQoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fbmVhcmJ5aW50KF9feCk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgbmV4dGFmdGVyKGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fbmV4dGFmdGVyZihfX3gsIF9feSk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgbmV4dGFmdGVyKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fbmV4dGFmdGVybChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZQorICAgIG5leHRhZnRlcihfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gbmV4dGFmdGVyKF9fdHlwZShfX3gpLCBfX3R5cGUoX195KSk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBuZXh0dG93YXJkKGZsb2F0IF9feCwgbG9uZyBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fbmV4dHRvd2FyZGYoX194LCBfX3kpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIG5leHR0b3dhcmQobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZXh0dG93YXJkbChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBuZXh0dG93YXJkKF9UcCBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fbmV4dHRvd2FyZChfX3gsIF9feSk7IH0KKworICAvLyBEUiA1NTAuIFdoYXQgc2hvdWxkIHRoZSByZXR1cm4gdHlwZSBvZiBwb3coZmxvYXQsaW50KSBiZT8KKyAgLy8gTkI6IEMrKzB4IGFuZCBUUjEgIT0gQysrMDMuCisgIC8vICAgdXNpbmcgc3RkOjpwb3c7CisKKyAgaW5saW5lIGZsb2F0CisgIHJlbWFpbmRlcihmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX3JlbWFpbmRlcmYoX194LCBfX3kpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHJlbWFpbmRlcihsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX3JlbWFpbmRlcmwoX194LCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUKKyAgICByZW1haW5kZXIoX1RwIF9feCwgX1VwIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIHJlbWFpbmRlcihfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgcmVtcXVvKGZsb2F0IF9feCwgZmxvYXQgX195LCBpbnQqIF9fcHF1bykKKyAgeyByZXR1cm4gX19idWlsdGluX3JlbXF1b2YoX194LCBfX3ksIF9fcHF1byk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgcmVtcXVvKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195LCBpbnQqIF9fcHF1bykKKyAgeyByZXR1cm4gX19idWlsdGluX3JlbXF1b2woX194LCBfX3ksIF9fcHF1byk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZQorICAgIHJlbXF1byhfVHAgX194LCBfVXAgX195LCBpbnQqIF9fcHF1bykKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIHJlbXF1byhfX3R5cGUoX194KSwgX190eXBlKF9feSksIF9fcHF1byk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICByaW50KGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3JpbnRmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgcmludChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9yaW50bChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgZG91YmxlPjo6X190eXBlCisgICAgcmludChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9yaW50KF9feCk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgcm91bmQoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fcm91bmRmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgcm91bmQobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fcm91bmRsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICByb3VuZChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9yb3VuZChfX3gpOyB9CisKKyAgaW5saW5lIGZsb2F0CisgIHNjYWxibG4oZmxvYXQgX194LCBsb25nIF9fZXgpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9zY2FsYmxuZihfX3gsIF9fZXgpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHNjYWxibG4obG9uZyBkb3VibGUgX194LCBsb25nIF9fZXgpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9zY2FsYmxubChfX3gsIF9fZXgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgZG91YmxlPjo6X190eXBlCisgICAgc2NhbGJsbihfVHAgX194LCBsb25nIF9fZXgpCisgICAgeyByZXR1cm4gX19idWlsdGluX3NjYWxibG4oX194LCBfX2V4KTsgfQorIAorICBpbmxpbmUgZmxvYXQKKyAgc2NhbGJuKGZsb2F0IF9feCwgaW50IF9fZXgpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9zY2FsYm5mKF9feCwgX19leCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgc2NhbGJuKGxvbmcgZG91YmxlIF9feCwgaW50IF9fZXgpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9zY2FsYm5sKF9feCwgX19leCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBzY2FsYm4oX1RwIF9feCwgaW50IF9fZXgpCisgICAgeyByZXR1cm4gX19idWlsdGluX3NjYWxibihfX3gsIF9fZXgpOyB9CisKKyAgdXNpbmcgc3RkOjpzaW47CisgIHVzaW5nIHN0ZDo6c2luaDsKKyAgdXNpbmcgc3RkOjpzcXJ0OworICB1c2luZyBzdGQ6OnRhbjsKKyAgdXNpbmcgc3RkOjp0YW5oOworCisgIGlubGluZSBmbG9hdAorICB0Z2FtbWEoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fdGdhbW1hZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHRnYW1tYShsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl90Z2FtbWFsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICB0Z2FtbWEoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fdGdhbW1hKF9feCk7IH0KKyAKKyAgaW5saW5lIGZsb2F0CisgIHRydW5jKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3RydW5jZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHRydW5jKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3RydW5jbChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgZG91YmxlPjo6X190eXBlCisgICAgdHJ1bmMoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fdHJ1bmMoX194KTsgfQorCisjZW5kaWYKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorfQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gRFIgNTUwLiBXaGF0IHNob3VsZCB0aGUgcmV0dXJuIHR5cGUgb2YgcG93KGZsb2F0LGludCkgYmU/CisgIC8vIE5COiBDKysweCBhbmQgVFIxICE9IEMrKzAzLgorICBpbmxpbmUgZG91YmxlCisgIHBvdyhkb3VibGUgX194LCBkb3VibGUgX195KQorICB7IHJldHVybiBzdGQ6OnBvdyhfX3gsIF9feSk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgcG93KGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBzdGQ6OnBvdyhfX3gsIF9feSk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgcG93KGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KQorICB7IHJldHVybiBzdGQ6OnBvdyhfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZQorICAgIHBvdyhfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gc3RkOjpwb3coX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorfQorCisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dHIxL3R5cGVfdHJhaXRzPgorCisjaW5jbHVkZSA8dHIxL2dhbW1hLnRjYz4KKyNpbmNsdWRlIDx0cjEvYmVzc2VsX2Z1bmN0aW9uLnRjYz4KKyNpbmNsdWRlIDx0cjEvYmV0YV9mdW5jdGlvbi50Y2M+CisjaW5jbHVkZSA8dHIxL2VsbF9pbnRlZ3JhbC50Y2M+CisjaW5jbHVkZSA8dHIxL2V4cF9pbnRlZ3JhbC50Y2M+CisjaW5jbHVkZSA8dHIxL2h5cGVyZ2VvbWV0cmljLnRjYz4KKyNpbmNsdWRlIDx0cjEvbGVnZW5kcmVfZnVuY3Rpb24udGNjPgorI2luY2x1ZGUgPHRyMS9tb2RpZmllZF9iZXNzZWxfZnVuYy50Y2M+CisjaW5jbHVkZSA8dHIxL3BvbHlfaGVybWl0ZS50Y2M+CisjaW5jbHVkZSA8dHIxL3BvbHlfbGFndWVycmUudGNjPgorI2luY2x1ZGUgPHRyMS9yaWVtYW5uX3pldGEudGNjPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBkZWZncm91cCB0cjFfbWF0aF9zcGVjX2Z1bmMgTWF0aGVtYXRpY2FsIFNwZWNpYWwgRnVuY3Rpb25zCisgICAqIEBpbmdyb3VwIG51bWVyaWNzCisgICAqCisgICAqIEEgY29sbGVjdGlvbiBvZiBhZHZhbmNlZCBtYXRoZW1hdGljYWwgc3BlY2lhbCBmdW5jdGlvbnMuCisgICAqIEB7CisgICAqLworCisgIGlubGluZSBmbG9hdAorICBhc3NvY19sYWd1ZXJyZWYodW5zaWduZWQgaW50IF9fbiwgdW5zaWduZWQgaW50IF9fbSwgZmxvYXQgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19hc3NvY19sYWd1ZXJyZTxmbG9hdD4oX19uLCBfX20sIF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgYXNzb2NfbGFndWVycmVsKHVuc2lnbmVkIGludCBfX24sIHVuc2lnbmVkIGludCBfX20sIGxvbmcgZG91YmxlIF9feCkKKyAgeworICAgIHJldHVybiBfX2RldGFpbDo6X19hc3NvY19sYWd1ZXJyZTxsb25nIGRvdWJsZT4oX19uLCBfX20sIF9feCk7CisgIH0KKworICAvLy8gIDUuMi4xLjEgIEFzc29jaWF0ZWQgTGFndWVycmUgcG9seW5vbWlhbHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgYXNzb2NfbGFndWVycmUodW5zaWduZWQgaW50IF9fbiwgdW5zaWduZWQgaW50IF9fbSwgX1RwIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19kZXRhaWw6Ol9fYXNzb2NfbGFndWVycmU8X190eXBlPihfX24sIF9fbSwgX194KTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGFzc29jX2xlZ2VuZHJlZih1bnNpZ25lZCBpbnQgX19sLCB1bnNpZ25lZCBpbnQgX19tLCBmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2Fzc29jX2xlZ2VuZHJlX3A8ZmxvYXQ+KF9fbCwgX19tLCBfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGFzc29jX2xlZ2VuZHJlbCh1bnNpZ25lZCBpbnQgX19sLCB1bnNpZ25lZCBpbnQgX19tLCBsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2Fzc29jX2xlZ2VuZHJlX3A8bG9uZyBkb3VibGU+KF9fbCwgX19tLCBfX3gpOyB9CisKKyAgLy8vICA1LjIuMS4yICBBc3NvY2lhdGVkIExlZ2VuZHJlIGZ1bmN0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUKKyAgICBhc3NvY19sZWdlbmRyZSh1bnNpZ25lZCBpbnQgX19sLCB1bnNpZ25lZCBpbnQgX19tLCBfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19hc3NvY19sZWdlbmRyZV9wPF9fdHlwZT4oX19sLCBfX20sIF9feCk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBiZXRhZihmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fYmV0YTxmbG9hdD4oX194LCBfX3kpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGJldGFsKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KQorICB7IHJldHVybiBfX2RldGFpbDo6X19iZXRhPGxvbmcgZG91YmxlPihfX3gsIF9feSk7IH0KKworICAvLy8gIDUuMi4xLjMgIEJldGEgZnVuY3Rpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHB4LCB0eXBlbmFtZSBfVHB5PgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcHgsIF9UcHk+OjpfX3R5cGUKKyAgICBiZXRhKF9UcHggX194LCBfVHB5IF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RweCwgX1RweT46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19kZXRhaWw6Ol9fYmV0YTxfX3R5cGU+KF9feCwgX195KTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGNvbXBfZWxsaW50XzFmKGZsb2F0IF9faykKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fY29tcF9lbGxpbnRfMTxmbG9hdD4oX19rKTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBjb21wX2VsbGludF8xbChsb25nIGRvdWJsZSBfX2spCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2NvbXBfZWxsaW50XzE8bG9uZyBkb3VibGU+KF9fayk7IH0KKworICAvLy8gIDUuMi4xLjQgIENvbXBsZXRlIGVsbGlwdGljIGludGVncmFscyBvZiB0aGUgZmlyc3Qga2luZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUKKyAgICBjb21wX2VsbGludF8xKF9UcCBfX2spCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fZGV0YWlsOjpfX2NvbXBfZWxsaW50XzE8X190eXBlPihfX2spOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgY29tcF9lbGxpbnRfMmYoZmxvYXQgX19rKQorICB7IHJldHVybiBfX2RldGFpbDo6X19jb21wX2VsbGludF8yPGZsb2F0PihfX2spOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGNvbXBfZWxsaW50XzJsKGxvbmcgZG91YmxlIF9faykKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fY29tcF9lbGxpbnRfMjxsb25nIGRvdWJsZT4oX19rKTsgfQorCisgIC8vLyAgNS4yLjEuNSAgQ29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWxzIG9mIHRoZSBzZWNvbmQga2luZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUKKyAgICBjb21wX2VsbGludF8yKF9UcCBfX2spCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fZGV0YWlsOjpfX2NvbXBfZWxsaW50XzI8X190eXBlPihfX2spOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgY29tcF9lbGxpbnRfM2YoZmxvYXQgX19rLCBmbG9hdCBfX251KQorICB7IHJldHVybiBfX2RldGFpbDo6X19jb21wX2VsbGludF8zPGZsb2F0PihfX2ssIF9fbnUpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGNvbXBfZWxsaW50XzNsKGxvbmcgZG91YmxlIF9faywgbG9uZyBkb3VibGUgX19udSkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fY29tcF9lbGxpbnRfMzxsb25nIGRvdWJsZT4oX19rLCBfX251KTsgfQorCisgIC8vLyAgNS4yLjEuNiAgQ29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWxzIG9mIHRoZSB0aGlyZCBraW5kLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UcG4+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVHBuPjo6X190eXBlCisgICAgY29tcF9lbGxpbnRfMyhfVHAgX19rLCBfVHBuIF9fbnUpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1Rwbj46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19kZXRhaWw6Ol9fY29tcF9lbGxpbnRfMzxfX3R5cGU+KF9faywgX19udSk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBjb25mX2h5cGVyZ2YoZmxvYXQgX19hLCBmbG9hdCBfX2MsIGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fY29uZl9oeXBlcmc8ZmxvYXQ+KF9fYSwgX19jLCBfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGNvbmZfaHlwZXJnbChsb25nIGRvdWJsZSBfX2EsIGxvbmcgZG91YmxlIF9fYywgbG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19jb25mX2h5cGVyZzxsb25nIGRvdWJsZT4oX19hLCBfX2MsIF9feCk7IH0KKworICAvLy8gIDUuMi4xLjcgIENvbmZsdWVudCBoeXBlcmdlb21ldHJpYyBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcGEsIHR5cGVuYW1lIF9UcGMsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMzxfVHBhLCBfVHBjLCBfVHA+OjpfX3R5cGUKKyAgICBjb25mX2h5cGVyZyhfVHBhIF9fYSwgX1RwYyBfX2MsIF9UcCBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8zPF9UcGEsIF9UcGMsIF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19kZXRhaWw6Ol9fY29uZl9oeXBlcmc8X190eXBlPihfX2EsIF9fYywgX194KTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGN5bF9iZXNzZWxfaWYoZmxvYXQgX19udSwgZmxvYXQgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19jeWxfYmVzc2VsX2k8ZmxvYXQ+KF9fbnUsIF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgY3lsX2Jlc3NlbF9pbChsb25nIGRvdWJsZSBfX251LCBsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2N5bF9iZXNzZWxfaTxsb25nIGRvdWJsZT4oX19udSwgX194KTsgfQorCisgIC8vLyAgNS4yLjEuOCAgUmVndWxhciBtb2RpZmllZCBjeWxpbmRyaWNhbCBCZXNzZWwgZnVuY3Rpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHBudSwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcG51LCBfVHA+OjpfX3R5cGUKKyAgICBjeWxfYmVzc2VsX2koX1RwbnUgX19udSwgX1RwIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwbnUsIF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19kZXRhaWw6Ol9fY3lsX2Jlc3NlbF9pPF9fdHlwZT4oX19udSwgX194KTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGN5bF9iZXNzZWxfamYoZmxvYXQgX19udSwgZmxvYXQgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19jeWxfYmVzc2VsX2o8ZmxvYXQ+KF9fbnUsIF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgY3lsX2Jlc3NlbF9qbChsb25nIGRvdWJsZSBfX251LCBsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2N5bF9iZXNzZWxfajxsb25nIGRvdWJsZT4oX19udSwgX194KTsgfQorCisgIC8vLyAgNS4yLjEuOSAgQ3lsaW5kcmljYWwgQmVzc2VsIGZ1bmN0aW9ucyAob2YgdGhlIGZpcnN0IGtpbmQpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHBudSwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcG51LCBfVHA+OjpfX3R5cGUKKyAgICBjeWxfYmVzc2VsX2ooX1RwbnUgX19udSwgX1RwIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwbnUsIF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19kZXRhaWw6Ol9fY3lsX2Jlc3NlbF9qPF9fdHlwZT4oX19udSwgX194KTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGN5bF9iZXNzZWxfa2YoZmxvYXQgX19udSwgZmxvYXQgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19jeWxfYmVzc2VsX2s8ZmxvYXQ+KF9fbnUsIF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgY3lsX2Jlc3NlbF9rbChsb25nIGRvdWJsZSBfX251LCBsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2N5bF9iZXNzZWxfazxsb25nIGRvdWJsZT4oX19udSwgX194KTsgfQorCisgIC8vLyAgNS4yLjEuMTAgIElycmVndWxhciBtb2RpZmllZCBjeWxpbmRyaWNhbCBCZXNzZWwgZnVuY3Rpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHBudSwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcG51LCBfVHA+OjpfX3R5cGUKKyAgICBjeWxfYmVzc2VsX2soX1RwbnUgX19udSwgX1RwIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwbnUsIF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19kZXRhaWw6Ol9fY3lsX2Jlc3NlbF9rPF9fdHlwZT4oX19udSwgX194KTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGN5bF9uZXVtYW5uZihmbG9hdCBfX251LCBmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2N5bF9uZXVtYW5uX248ZmxvYXQ+KF9fbnUsIF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgY3lsX25ldW1hbm5sKGxvbmcgZG91YmxlIF9fbnUsIGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fY3lsX25ldW1hbm5fbjxsb25nIGRvdWJsZT4oX19udSwgX194KTsgfQorCisgIC8vLyAgNS4yLjEuMTEgIEN5bGluZHJpY2FsIE5ldW1hbm4gZnVuY3Rpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHBudSwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcG51LCBfVHA+OjpfX3R5cGUKKyAgICBjeWxfbmV1bWFubihfVHBudSBfX251LCBfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHBudSwgX1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19jeWxfbmV1bWFubl9uPF9fdHlwZT4oX19udSwgX194KTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGVsbGludF8xZihmbG9hdCBfX2ssIGZsb2F0IF9fcGhpKQorICB7IHJldHVybiBfX2RldGFpbDo6X19lbGxpbnRfMTxmbG9hdD4oX19rLCBfX3BoaSk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgZWxsaW50XzFsKGxvbmcgZG91YmxlIF9faywgbG9uZyBkb3VibGUgX19waGkpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2VsbGludF8xPGxvbmcgZG91YmxlPihfX2ssIF9fcGhpKTsgfQorCisgIC8vLyAgNS4yLjEuMTIgIEluY29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWxzIG9mIHRoZSBmaXJzdCBraW5kLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UcHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVHBwPjo6X190eXBlCisgICAgZWxsaW50XzEoX1RwIF9faywgX1RwcCBfX3BoaSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVHBwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19lbGxpbnRfMTxfX3R5cGU+KF9faywgX19waGkpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgZWxsaW50XzJmKGZsb2F0IF9faywgZmxvYXQgX19waGkpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2VsbGludF8yPGZsb2F0PihfX2ssIF9fcGhpKTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBlbGxpbnRfMmwobG9uZyBkb3VibGUgX19rLCBsb25nIGRvdWJsZSBfX3BoaSkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fZWxsaW50XzI8bG9uZyBkb3VibGU+KF9faywgX19waGkpOyB9CisKKyAgLy8vICA1LjIuMS4xMyAgSW5jb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbHMgb2YgdGhlIHNlY29uZCBraW5kLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UcHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVHBwPjo6X190eXBlCisgICAgZWxsaW50XzIoX1RwIF9faywgX1RwcCBfX3BoaSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVHBwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19lbGxpbnRfMjxfX3R5cGU+KF9faywgX19waGkpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgZWxsaW50XzNmKGZsb2F0IF9faywgZmxvYXQgX19udSwgZmxvYXQgX19waGkpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2VsbGludF8zPGZsb2F0PihfX2ssIF9fbnUsIF9fcGhpKTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBlbGxpbnRfM2wobG9uZyBkb3VibGUgX19rLCBsb25nIGRvdWJsZSBfX251LCBsb25nIGRvdWJsZSBfX3BoaSkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fZWxsaW50XzM8bG9uZyBkb3VibGU+KF9faywgX19udSwgX19waGkpOyB9CisKKyAgLy8vICA1LjIuMS4xNCAgSW5jb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbHMgb2YgdGhlIHRoaXJkIGtpbmQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwbiwgdHlwZW5hbWUgX1RwcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMzxfVHAsIF9UcG4sIF9UcHA+OjpfX3R5cGUKKyAgICBlbGxpbnRfMyhfVHAgX19rLCBfVHBuIF9fbnUsIF9UcHAgX19waGkpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8zPF9UcCwgX1RwbiwgX1RwcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19kZXRhaWw6Ol9fZWxsaW50XzM8X190eXBlPihfX2ssIF9fbnUsIF9fcGhpKTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGV4cGludGYoZmxvYXQgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19leHBpbnQ8ZmxvYXQ+KF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgZXhwaW50bChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2V4cGludDxsb25nIGRvdWJsZT4oX194KTsgfQorCisgIC8vLyAgNS4yLjEuMTUgIEV4cG9uZW50aWFsIGludGVncmFscy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUKKyAgICBleHBpbnQoX1RwIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19kZXRhaWw6Ol9fZXhwaW50PF9fdHlwZT4oX194KTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGhlcm1pdGVmKHVuc2lnbmVkIGludCBfX24sIGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fcG9seV9oZXJtaXRlPGZsb2F0PihfX24sIF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgaGVybWl0ZWwodW5zaWduZWQgaW50IF9fbiwgbG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19wb2x5X2hlcm1pdGU8bG9uZyBkb3VibGU+KF9fbiwgX194KTsgfQorCisgIC8vLyAgNS4yLjEuMTYgIEhlcm1pdGUgcG9seW5vbWlhbHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgaGVybWl0ZSh1bnNpZ25lZCBpbnQgX19uLCBfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19wb2x5X2hlcm1pdGU8X190eXBlPihfX24sIF9feCk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBoeXBlcmdmKGZsb2F0IF9fYSwgZmxvYXQgX19iLCBmbG9hdCBfX2MsIGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9faHlwZXJnPGZsb2F0PihfX2EsIF9fYiwgX19jLCBfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGh5cGVyZ2wobG9uZyBkb3VibGUgX19hLCBsb25nIGRvdWJsZSBfX2IsIGxvbmcgZG91YmxlIF9fYywgbG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19oeXBlcmc8bG9uZyBkb3VibGU+KF9fYSwgX19iLCBfX2MsIF9feCk7IH0KKworICAvLy8gIDUuMi4xLjE3ICBIeXBlcmdlb21ldHJpYyBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcGEsIHR5cGVuYW1lIF9UcGIsIHR5cGVuYW1lIF9UcGMsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfNDxfVHBhLCBfVHBiLCBfVHBjLCBfVHA+OjpfX3R5cGUKKyAgICBoeXBlcmcoX1RwYSBfX2EsIF9UcGIgX19iLCBfVHBjIF9fYywgX1RwIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzQ8X1RwYSwgX1RwYiwgX1RwYywgX1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19oeXBlcmc8X190eXBlPihfX2EsIF9fYiwgX19jLCBfX3gpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgbGFndWVycmVmKHVuc2lnbmVkIGludCBfX24sIGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fbGFndWVycmU8ZmxvYXQ+KF9fbiwgX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBsYWd1ZXJyZWwodW5zaWduZWQgaW50IF9fbiwgbG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19sYWd1ZXJyZTxsb25nIGRvdWJsZT4oX19uLCBfX3gpOyB9CisKKyAgLy8vICA1LjIuMS4xOCAgTGFndWVycmUgcG9seW5vbWlhbHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgbGFndWVycmUodW5zaWduZWQgaW50IF9fbiwgX1RwIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19kZXRhaWw6Ol9fbGFndWVycmU8X190eXBlPihfX24sIF9feCk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBsZWdlbmRyZWYodW5zaWduZWQgaW50IF9fbiwgZmxvYXQgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19wb2x5X2xlZ2VuZHJlX3A8ZmxvYXQ+KF9fbiwgX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBsZWdlbmRyZWwodW5zaWduZWQgaW50IF9fbiwgbG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19wb2x5X2xlZ2VuZHJlX3A8bG9uZyBkb3VibGU+KF9fbiwgX194KTsgfQorCisgIC8vLyAgNS4yLjEuMTkgIExlZ2VuZHJlIHBvbHlub21pYWxzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIGxlZ2VuZHJlKHVuc2lnbmVkIGludCBfX24sIF9UcCBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fZGV0YWlsOjpfX3BvbHlfbGVnZW5kcmVfcDxfX3R5cGU+KF9fbiwgX194KTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIHJpZW1hbm5femV0YWYoZmxvYXQgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19yaWVtYW5uX3pldGE8ZmxvYXQ+KF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgcmllbWFubl96ZXRhbChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX3JpZW1hbm5femV0YTxsb25nIGRvdWJsZT4oX194KTsgfQorCisgIC8vLyAgNS4yLjEuMjAgIFJpZW1hbm4gemV0YSBmdW5jdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUKKyAgICByaWVtYW5uX3pldGEoX1RwIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19kZXRhaWw6Ol9fcmllbWFubl96ZXRhPF9fdHlwZT4oX194KTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIHNwaF9iZXNzZWxmKHVuc2lnbmVkIGludCBfX24sIGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fc3BoX2Jlc3NlbDxmbG9hdD4oX19uLCBfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHNwaF9iZXNzZWxsKHVuc2lnbmVkIGludCBfX24sIGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fc3BoX2Jlc3NlbDxsb25nIGRvdWJsZT4oX19uLCBfX3gpOyB9CisKKyAgLy8vICA1LjIuMS4yMSAgU3BoZXJpY2FsIEJlc3NlbCBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgc3BoX2Jlc3NlbCh1bnNpZ25lZCBpbnQgX19uLCBfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19zcGhfYmVzc2VsPF9fdHlwZT4oX19uLCBfX3gpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgc3BoX2xlZ2VuZHJlZih1bnNpZ25lZCBpbnQgX19sLCB1bnNpZ25lZCBpbnQgX19tLCBmbG9hdCBfX3RoZXRhKQorICB7IHJldHVybiBfX2RldGFpbDo6X19zcGhfbGVnZW5kcmU8ZmxvYXQ+KF9fbCwgX19tLCBfX3RoZXRhKTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBzcGhfbGVnZW5kcmVsKHVuc2lnbmVkIGludCBfX2wsIHVuc2lnbmVkIGludCBfX20sIGxvbmcgZG91YmxlIF9fdGhldGEpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX3NwaF9sZWdlbmRyZTxsb25nIGRvdWJsZT4oX19sLCBfX20sIF9fdGhldGEpOyB9CisKKyAgLy8vICA1LjIuMS4yMiAgU3BoZXJpY2FsIGFzc29jaWF0ZWQgTGVnZW5kcmUgZnVuY3Rpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIHNwaF9sZWdlbmRyZSh1bnNpZ25lZCBpbnQgX19sLCB1bnNpZ25lZCBpbnQgX19tLCBfVHAgX190aGV0YSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19kZXRhaWw6Ol9fc3BoX2xlZ2VuZHJlPF9fdHlwZT4oX19sLCBfX20sIF9fdGhldGEpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgc3BoX25ldW1hbm5mKHVuc2lnbmVkIGludCBfX24sIGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fc3BoX25ldW1hbm48ZmxvYXQ+KF9fbiwgX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBzcGhfbmV1bWFubmwodW5zaWduZWQgaW50IF9fbiwgbG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19zcGhfbmV1bWFubjxsb25nIGRvdWJsZT4oX19uLCBfX3gpOyB9CisKKyAgLy8vICA1LjIuMS4yMyAgU3BoZXJpY2FsIE5ldW1hbm4gZnVuY3Rpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIHNwaF9uZXVtYW5uKHVuc2lnbmVkIGludCBfX24sIF9UcCBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fZGV0YWlsOjpfX3NwaF9uZXVtYW5uPF9fdHlwZT4oX19uLCBfX3gpOworICAgIH0KKworICAvKiBAfSAqLyAvLyB0cjFfbWF0aF9zcGVjX2Z1bmMKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NNQVRICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jb21wbGV4IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY29tcGxleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzg3OGNjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY29tcGxleApAQCAtMCwwICsxLDQxOCBAQAorLy8gVFIxIGNvbXBsZXggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9jb21wbGV4CisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0NPTVBMRVgKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0NPTVBMRVggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxjb21wbGV4PgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIGNvbXBsZXhfbnVtYmVycworICAgKiBAeworICAgKi8KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdXNpbmcgc3RkOjphY29zOworICB1c2luZyBzdGQ6OmFzaW47CisgIHVzaW5nIHN0ZDo6YXRhbjsKKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gc3RkOjpjb21wbGV4PF9UcD4gYWNvcyhjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHN0ZDo6Y29tcGxleDxfVHA+IGFzaW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mKTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBzdGQ6OmNvbXBsZXg8X1RwPiBhdGFuKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+Jik7CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHN0ZDo6Y29tcGxleDxfVHA+IGFjb3NoKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+Jik7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gc3RkOjpjb21wbGV4PF9UcD4gYXNpbmgoY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mKTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBzdGQ6OmNvbXBsZXg8X1RwPiBhdGFuaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYpOworCisgIC8vIFRoZSBzdGQ6OmZhYnMgcmV0dXJuIHR5cGUgaW4gQysrMHggbW9kZSBpcyBkaWZmZXJlbnQgKGp1c3QgX1RwKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBzdGQ6OmNvbXBsZXg8X1RwPiBmYWJzKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+Jik7CisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9hY29zKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4gX190ID0gc3RkOjp0cjE6OmFzaW4oX196KTsKKyAgICAgIGNvbnN0IF9UcCBfX3BpXzIgPSAxLjU3MDc5NjMyNjc5NDg5NjYxOTIzMTMyMTY5MTYzOTc1MTRMOworICAgICAgcmV0dXJuIHN0ZDo6Y29tcGxleDxfVHA+KF9fcGlfMiAtIF9fdC5yZWFsKCksIC1fX3QuaW1hZygpKTsKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfYWNvcyhfX2NvbXBsZXhfXyBmbG9hdCBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYWNvc2YoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X2Fjb3MoX19jb21wbGV4X18gZG91YmxlIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhY29zKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2Fjb3MoY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhY29zbChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGFjb3MoY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYWNvcyhfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIC8vLyBhY29zKF9feikgWzguMS4yXS4KKyAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYWNvcywgZGVmaW5lZAorICAvLyAgICAgICAgICAgIGluIHN1YmNsYXVzZSA3LjMuNS4xLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYWNvcyhjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9hY29zKF9feik7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBfX2NvbXBsZXhfYXNpbihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsKKyAgICAgIHN0ZDo6Y29tcGxleDxfVHA+IF9fdCgtX196LmltYWcoKSwgX196LnJlYWwoKSk7CisgICAgICBfX3QgPSBzdGQ6OnRyMTo6YXNpbmgoX190KTsKKyAgICAgIHJldHVybiBzdGQ6OmNvbXBsZXg8X1RwPihfX3QuaW1hZygpLCAtX190LnJlYWwoKSk7CisgICAgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYX1RSMQorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X2FzaW4oX19jb21wbGV4X18gZmxvYXQgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2FzaW5mKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9hc2luKF9fY29tcGxleF9fIGRvdWJsZSBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXNpbihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9hc2luKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXNpbmwoX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBhc2luKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2FzaW4oX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICAvLy8gYXNpbihfX3opIFs4LjEuM10uCisgIC8vICBFZmZlY3RzOiAgQmVoYXZlcyB0aGUgc2FtZSBhcyBDOTkgZnVuY3Rpb24gY2FzaW4sIGRlZmluZWQKKyAgLy8gICAgICAgICAgICBpbiBzdWJjbGF1c2UgNy4zLjUuMi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGFzaW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYXNpbihfX3opOyB9CisjZW5kaWYKKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9hdGFuKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgY29uc3QgX1RwIF9fcjIgPSBfX3oucmVhbCgpICogX196LnJlYWwoKTsKKyAgICAgIGNvbnN0IF9UcCBfX3ggPSBfVHAoMS4wKSAtIF9fcjIgLSBfX3ouaW1hZygpICogX196LmltYWcoKTsKKworICAgICAgX1RwIF9fbnVtID0gX196LmltYWcoKSArIF9UcCgxLjApOworICAgICAgX1RwIF9fZGVuID0gX196LmltYWcoKSAtIF9UcCgxLjApOworCisgICAgICBfX251bSA9IF9fcjIgKyBfX251bSAqIF9fbnVtOworICAgICAgX19kZW4gPSBfX3IyICsgX19kZW4gKiBfX2RlbjsKKworICAgICAgcmV0dXJuIHN0ZDo6Y29tcGxleDxfVHA+KF9UcCgwLjUpICogYXRhbjIoX1RwKDIuMCkgKiBfX3oucmVhbCgpLCBfX3gpLAorCQkJICAgICAgIF9UcCgwLjI1KSAqIGxvZyhfX251bSAvIF9fZGVuKSk7CisgICAgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYX1RSMQorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X2F0YW4oX19jb21wbGV4X18gZmxvYXQgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2F0YW5mKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9hdGFuKF9fY29tcGxleF9fIGRvdWJsZSBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXRhbihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9hdGFuKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXRhbmwoX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBhdGFuKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2F0YW4oX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICAvLy8gYXRhbihfX3opIFs4LjEuNF0uCisgIC8vICBFZmZlY3RzOiAgQmVoYXZlcyB0aGUgc2FtZSBhcyBDOTkgZnVuY3Rpb24gY2F0YW4sIGRlZmluZWQKKyAgLy8gICAgICAgICAgICBpbiBzdWJjbGF1c2UgNy4zLjUuMy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGF0YW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYXRhbihfX3opOyB9CisjZW5kaWYKKworI2VuZGlmIC8vIEMrKzExCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X2Fjb3NoKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgLy8gS2FoYW4ncyBmb3JtdWxhLgorICAgICAgcmV0dXJuIF9UcCgyLjApICogc3RkOjpsb2coc3RkOjpzcXJ0KF9UcCgwLjUpICogKF9feiArIF9UcCgxLjApKSkKKwkJCQkgKyBzdGQ6OnNxcnQoX1RwKDAuNSkgKiAoX196IC0gX1RwKDEuMCkpKSk7CisgICAgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYX1RSMQorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X2Fjb3NoKF9fY29tcGxleF9fIGZsb2F0IF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhY29zaGYoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X2Fjb3NoKF9fY29tcGxleF9fIGRvdWJsZSBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYWNvc2goX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZQorICBfX2NvbXBsZXhfYWNvc2goY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhY29zaGwoX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBhY29zaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9hY29zaChfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIC8vLyBhY29zaChfX3opIFs4LjEuNV0uCisgIC8vICBFZmZlY3RzOiAgQmVoYXZlcyB0aGUgc2FtZSBhcyBDOTkgZnVuY3Rpb24gY2Fjb3NoLCBkZWZpbmVkCisgIC8vICAgICAgICAgICAgaW4gc3ViY2xhdXNlIDcuMy42LjEuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBhY29zaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9hY29zaChfX3opOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBfX2NvbXBsZXhfYXNpbmgoY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICBzdGQ6OmNvbXBsZXg8X1RwPiBfX3QoKF9fei5yZWFsKCkgLSBfX3ouaW1hZygpKQorCQkJICAgICogKF9fei5yZWFsKCkgKyBfX3ouaW1hZygpKSArIF9UcCgxLjApLAorCQkJICAgIF9UcCgyLjApICogX196LnJlYWwoKSAqIF9fei5pbWFnKCkpOworICAgICAgX190ID0gc3RkOjpzcXJ0KF9fdCk7CisKKyAgICAgIHJldHVybiBzdGQ6OmxvZyhfX3QgKyBfX3opOworICAgIH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWF9UUjEKKyAgaW5saW5lIF9fY29tcGxleF9fIGZsb2F0CisgIF9fY29tcGxleF9hc2luaChfX2NvbXBsZXhfXyBmbG9hdCBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXNpbmhmKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9hc2luaChfX2NvbXBsZXhfXyBkb3VibGUgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2FzaW5oKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2FzaW5oKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXNpbmhsKF9feik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYXNpbmgoY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYXNpbmgoX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICAvLy8gYXNpbmgoX196KSBbOC4xLjZdLgorICAvLyAgRWZmZWN0czogIEJlaGF2ZXMgdGhlIHNhbWUgYXMgQzk5IGZ1bmN0aW9uIGNhc2luLCBkZWZpbmVkCisgIC8vICAgICAgICAgICAgaW4gc3ViY2xhdXNlIDcuMy42LjIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBhc2luaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9hc2luaChfX3opOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBfX2NvbXBsZXhfYXRhbmgoY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19pMiA9IF9fei5pbWFnKCkgKiBfX3ouaW1hZygpOworICAgICAgY29uc3QgX1RwIF9feCA9IF9UcCgxLjApIC0gX19pMiAtIF9fei5yZWFsKCkgKiBfX3oucmVhbCgpOworCisgICAgICBfVHAgX19udW0gPSBfVHAoMS4wKSArIF9fei5yZWFsKCk7CisgICAgICBfVHAgX19kZW4gPSBfVHAoMS4wKSAtIF9fei5yZWFsKCk7CisKKyAgICAgIF9fbnVtID0gX19pMiArIF9fbnVtICogX19udW07CisgICAgICBfX2RlbiA9IF9faTIgKyBfX2RlbiAqIF9fZGVuOworCisgICAgICByZXR1cm4gc3RkOjpjb21wbGV4PF9UcD4oX1RwKDAuMjUpICogKGxvZyhfX251bSkgLSBsb2coX19kZW4pKSwKKwkJCSAgICAgICBfVHAoMC41KSAqIGF0YW4yKF9UcCgyLjApICogX196LmltYWcoKSwgX194KSk7CisgICAgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYX1RSMQorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X2F0YW5oKF9fY29tcGxleF9fIGZsb2F0IF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhdGFuaGYoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X2F0YW5oKF9fY29tcGxleF9fIGRvdWJsZSBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXRhbmgoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZQorICBfX2NvbXBsZXhfYXRhbmgoY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhdGFuaGwoX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBhdGFuaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9hdGFuaChfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIC8vLyBhdGFuaChfX3opIFs4LjEuN10uCisgIC8vICBFZmZlY3RzOiAgQmVoYXZlcyB0aGUgc2FtZSBhcyBDOTkgZnVuY3Rpb24gY2F0YW5oLCBkZWZpbmVkCisgIC8vICAgICAgICAgICAgaW4gc3ViY2xhdXNlIDcuMy42LjMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBhdGFuaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9hdGFuaChfX3opOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgLy8vIGZhYnMoX196KSBbOC4xLjhdLgorICAgIC8vICBFZmZlY3RzOiAgQmVoYXZlcyB0aGUgc2FtZSBhcyBDOTkgZnVuY3Rpb24gY2FicywgZGVmaW5lZAorICAgIC8vICAgICAgICAgICAgaW4gc3ViY2xhdXNlIDcuMy44LjEuCisgICAgZmFicyhjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIHN0ZDo6YWJzKF9feik7IH0KKworICAvLy8gQWRkaXRpb25hbCBvdmVybG9hZHMgWzguMS45XS4KKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIGFyZyhfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyNpZiAoX0dMSUJDWFhfVVNFX0M5OV9NQVRIICYmICFfR0xJQkNYWF9VU0VfQzk5X0ZQX01BQ1JPU19EWU5BTUlDKQorICAgICAgcmV0dXJuIHN0ZDo6c2lnbmJpdChfX3gpID8gX190eXBlKDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NTAyOUwpCisJICAgICAgICAgICAgICAgICAgICAgICA6IF9fdHlwZSgpOworI2Vsc2UKKyAgICAgIHJldHVybiBzdGQ6OmFyZyhzdGQ6OmNvbXBsZXg8X190eXBlPihfX3gpKTsKKyNlbmRpZgorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIGltYWcoX1RwKQorICAgIHsgcmV0dXJuIF9UcCgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUKKyAgICBub3JtKF9UcCBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fdHlwZShfX3gpICogX190eXBlKF9feCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgcmVhbChfVHAgX194KQorICAgIHsgcmV0dXJuIF9feDsgfQorCisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGU+CisgICAgcG93KGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IF9VcCYgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gc3RkOjpwb3coc3RkOjpjb21wbGV4PF9fdHlwZT4oX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGU+CisgICAgcG93KGNvbnN0IF9UcCYgX194LCBjb25zdCBzdGQ6OmNvbXBsZXg8X1VwPiYgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gc3RkOjpwb3coX190eXBlKF9feCksIHN0ZDo6Y29tcGxleDxfX3R5cGU+KF9feSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGU+CisgICAgcG93KGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IHN0ZDo6Y29tcGxleDxfVXA+JiBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBzdGQ6OnBvdyhzdGQ6OmNvbXBsZXg8X190eXBlPihfX3gpLAorCQkgICAgICBzdGQ6OmNvbXBsZXg8X190eXBlPihfX3kpKTsKKyAgICB9CisKKyAgdXNpbmcgc3RkOjphcmc7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGNvbmooY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBzdGQ6OmNvbmooX196KTsgfSAgCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlPgorICAgIGNvbmooX1RwIF9feCkKKyAgICB7IHJldHVybiBfX3g7IH0KKworICB1c2luZyBzdGQ6OmltYWc7CisgIHVzaW5nIHN0ZDo6bm9ybTsKKyAgdXNpbmcgc3RkOjpwb2xhcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGU+CisgICAgcG9sYXIoY29uc3QgX1RwJiBfX3JobywgY29uc3QgX1VwJiBfX3RoZXRhKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gc3RkOjpwb2xhcihfX3R5cGUoX19yaG8pLCBfX3R5cGUoX190aGV0YSkpOworICAgIH0KKworICB1c2luZyBzdGQ6OnJlYWw7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIHBvdyhjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBfVHAmIF9feSkKKyAgICB7IHJldHVybiBzdGQ6OnBvdyhfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgcG93KGNvbnN0IF9UcCYgX194LCBjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX195KQorICAgIHsgcmV0dXJuIHN0ZDo6cG93KF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBwb3coY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feCwgY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feSkKKyAgICB7IHJldHVybiBzdGQ6OnBvdyhfX3gsIF9feSk7IH0KKworLy8gQH0gZ3JvdXAgY29tcGxleF9udW1iZXJzCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NPTVBMRVgKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NvbXBsZXguaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NvbXBsZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2I3ODlmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY29tcGxleC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIFRSMSBjb21wbGV4LmggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9jb21wbGV4LmgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQ09NUExFWF9ICisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DT01QTEVYX0ggMQorCisjaW5jbHVkZSA8dHIxL2Njb21wbGV4PgorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NPTVBMRVhfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY3N0ZGFyZyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NzdGRhcmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM1Nzc3MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NzdGRhcmcKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIGNzdGRhcmcgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9jc3RkYXJnCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0NTVERBUkcKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0NTVERBUkcgMQorCisjaW5jbHVkZSA8Y3N0ZGFyZz4KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9DU1REQVJHCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jc3RkYm9vbCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NzdGRib29sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZjllZTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jc3RkYm9vbApAQCAtMCwwICsxLDQwIEBACisvLyBUUjEgY3N0ZGJvb2wgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9jc3RkYm9vbAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9DU1REQk9PTAorI2RlZmluZSBfR0xJQkNYWF9UUjFfQ1NUREJPT0wgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCisjaWYgX0dMSUJDWFhfSEFWRV9TVERCT09MX0gKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjZW5kaWYKKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9DU1REQk9PTApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY3N0ZGludCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NzdGRpbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgzYTcwOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NzdGRpbnQKQEAgLTAsMCArMSwxMDQgQEAKKy8vIFRSMSBjc3RkaW50IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY3N0ZGludAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9DU1RESU5UCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DU1RESU5UIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworLy8gRm9yIDguMjIuMS8xIChzZWUgQzk5LCBOb3RlcyAyMTksIDIyMCwgMjIyKQorIyBpZiBfR0xJQkNYWF9IQVZFX1NURElOVF9ICisjICBpZm5kZWYgX19TVERDX0xJTUlUX01BQ1JPUworIyAgIGRlZmluZSBfVU5ERUZfX1NURENfTElNSVRfTUFDUk9TCisjICAgZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyMgIGVuZGlmCisjICBpZm5kZWYgX19TVERDX0NPTlNUQU5UX01BQ1JPUworIyAgIGRlZmluZSBfVU5ERUZfX1NURENfQ09OU1RBTlRfTUFDUk9TCisjICAgZGVmaW5lIF9fU1REQ19DT05TVEFOVF9NQUNST1MKKyMgIGVuZGlmCisjICBpbmNsdWRlIDxzdGRpbnQuaD4KKyMgIGlmZGVmIF9VTkRFRl9fU1REQ19MSU1JVF9NQUNST1MKKyMgICB1bmRlZiBfX1NURENfTElNSVRfTUFDUk9TCisjICAgdW5kZWYgX1VOREVGX19TVERDX0xJTUlUX01BQ1JPUworIyAgZW5kaWYKKyMgIGlmZGVmIF9VTkRFRl9fU1REQ19DT05TVEFOVF9NQUNST1MKKyMgICB1bmRlZiBfX1NURENfQ09OU1RBTlRfTUFDUk9TCisjICAgdW5kZWYgX1VOREVGX19TVERDX0NPTlNUQU5UX01BQ1JPUworIyAgZW5kaWYKKyMgZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKKyAgdXNpbmcgOjppbnQ4X3Q7CisgIHVzaW5nIDo6aW50MTZfdDsKKyAgdXNpbmcgOjppbnQzMl90OworICB1c2luZyA6OmludDY0X3Q7CisKKyAgdXNpbmcgOjppbnRfZmFzdDhfdDsKKyAgdXNpbmcgOjppbnRfZmFzdDE2X3Q7CisgIHVzaW5nIDo6aW50X2Zhc3QzMl90OworICB1c2luZyA6OmludF9mYXN0NjRfdDsKKworICB1c2luZyA6OmludF9sZWFzdDhfdDsKKyAgdXNpbmcgOjppbnRfbGVhc3QxNl90OworICB1c2luZyA6OmludF9sZWFzdDMyX3Q7CisgIHVzaW5nIDo6aW50X2xlYXN0NjRfdDsKKworICB1c2luZyA6OmludG1heF90OworICB1c2luZyA6OmludHB0cl90OworICAKKyAgdXNpbmcgOjp1aW50OF90OworICB1c2luZyA6OnVpbnQxNl90OworICB1c2luZyA6OnVpbnQzMl90OworICB1c2luZyA6OnVpbnQ2NF90OworCisgIHVzaW5nIDo6dWludF9mYXN0OF90OworICB1c2luZyA6OnVpbnRfZmFzdDE2X3Q7CisgIHVzaW5nIDo6dWludF9mYXN0MzJfdDsKKyAgdXNpbmcgOjp1aW50X2Zhc3Q2NF90OworCisgIHVzaW5nIDo6dWludF9sZWFzdDhfdDsKKyAgdXNpbmcgOjp1aW50X2xlYXN0MTZfdDsKKyAgdXNpbmcgOjp1aW50X2xlYXN0MzJfdDsKKyAgdXNpbmcgOjp1aW50X2xlYXN0NjRfdDsKKworICB1c2luZyA6OnVpbnRtYXhfdDsKKyAgdXNpbmcgOjp1aW50cHRyX3Q7Cit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9DU1RESU5UCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NzdGRpbyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NzdGRpbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWJhNWM0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY3N0ZGlvCkBAIC0wLDAgKzEsNTMgQEAKKy8vIFRSMSBjc3RkaW8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9jc3RkaW8KKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQ1NURElPCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DU1RESU8gMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxjc3RkaW8+CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworICB1c2luZyBzdGQ6OnNucHJpbnRmOworICB1c2luZyBzdGQ6OnZzbnByaW50ZjsKKworICB1c2luZyBzdGQ6OnZmc2NhbmY7CisgIHVzaW5nIHN0ZDo6dnNjYW5mOworICB1c2luZyBzdGQ6OnZzc2NhbmY7Cit9Cit9CisKKyNlbmRpZgorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NTVERJTwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY3N0ZGxpYiBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NzdGRsaWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1ZTdiMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2NzdGRsaWIKQEAgLTAsMCArMSw3MiBAQAorLy8gVFIxIGNzdGRsaWIgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9jc3RkbGliCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0NTVERMSUIKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0NTVERMSUIgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxjc3RkbGliPgorCisjaWYgX0dMSUJDWFhfSE9TVEVECisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworI2lmICFfR0xJQkNYWF9VU0VfQzk5X0xPTkdfTE9OR19EWU5BTUlDCisgIC8vIHR5cGVzCisgIHVzaW5nIHN0ZDo6bGxkaXZfdDsKKworICAvLyBmdW5jdGlvbnMKKyAgdXNpbmcgc3RkOjpsbGFiczsKKyAgdXNpbmcgc3RkOjpsbGRpdjsKKyNlbmRpZgorCisgIHVzaW5nIHN0ZDo6YXRvbGw7CisgIHVzaW5nIHN0ZDo6c3RydG9sbDsKKyAgdXNpbmcgc3RkOjpzdHJ0b3VsbDsKKworICB1c2luZyBzdGQ6OnN0cnRvZjsKKyAgdXNpbmcgc3RkOjpzdHJ0b2xkOworCisgIC8vIG92ZXJsb2FkcworICB1c2luZyBzdGQ6OmFiczsKKyNpZiAhX0dMSUJDWFhfVVNFX0M5OV9MT05HX0xPTkdfRFlOQU1JQworICB1c2luZyBzdGQ6OmRpdjsKKyNlbmRpZgorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVVNFX0M5OSAKKworI2VuZGlmIC8vIF9HTElCQ1hYX0hPU1RFRAorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NTVERMSUIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2N0Z21hdGggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jdGdtYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYjk2YmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jdGdtYXRoCkBAIC0wLDAgKzEsMzQgQEAKKy8vIFRSMSBjdGdtYXRoIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY3RnbWF0aAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9DVEdNQVRICisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DVEdNQVRIIDEKKworI2luY2x1ZGUgPHRyMS9jbWF0aD4KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9DVEdNQVRICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jdGltZSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2N0aW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyN2Q0ZTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jdGltZQpAQCAtMCwwICsxLDM0IEBACisvLyBUUjEgY3RpbWUgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9jdGltZQorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9DVElNRQorI2RlZmluZSBfR0xJQkNYWF9UUjFfQ1RJTUUgMQorCisjaW5jbHVkZSA8Y3RpbWU+CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfQ1RJTUUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2N0eXBlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNzU4MGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jdHlwZS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIFRSMSBjdHlwZS5oIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY3R5cGUuaAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9UUjFfQ1RZUEVfSAorI2RlZmluZSBfVFIxX0NUWVBFX0ggMQorCisjaW5jbHVkZSA8dHIxL2NjdHlwZT4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jd2NoYXIgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9jd2NoYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTliMWY4YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2N3Y2hhcgpAQCAtMCwwICsxLDY1IEBACisvLyBUUjEgY3djaGFyIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY3djaGFyCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0NXQ0hBUgorI2RlZmluZSBfR0xJQkNYWF9UUjFfQ1dDSEFSIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Y3djaGFyPgorCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisjaWYgX0dMSUJDWFhfSEFWRV9XQ1NUT0YKKyAgdXNpbmcgc3RkOjp3Y3N0b2Y7CisjZW5kaWYKKyNpZiBfR0xJQkNYWF9IQVZFX1ZGV1NDQU5GCisgIHVzaW5nIHN0ZDo6dmZ3c2NhbmY7CisjZW5kaWYKKyNpZiBfR0xJQkNYWF9IQVZFX1ZTV1NDQU5GCisgIHVzaW5nIHN0ZDo6dnN3c2NhbmY7CisjZW5kaWYKKyNpZiBfR0xJQkNYWF9IQVZFX1ZXU0NBTkYKKyAgdXNpbmcgc3RkOjp2d3NjYW5mOworI2VuZGlmCisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5CisgIHVzaW5nIHN0ZDo6d2NzdG9sZDsKKyAgdXNpbmcgc3RkOjp3Y3N0b2xsOworICB1c2luZyBzdGQ6Ondjc3RvdWxsOworI2VuZGlmCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9VU0VfV0NIQVJfVAorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NXQ0hBUgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvY3djdHlwZSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2N3Y3R5cGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE2NmJiMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2N3Y3R5cGUKQEAgLTAsMCArMSw1MCBAQAorLy8gVFIxIGN3Y3R5cGUgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9jd2N0eXBlCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0NXQ1RZUEUKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0NXQ1RZUEUgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxjd2N0eXBlPgorCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisjaWYgX0dMSUJDWFhfSEFWRV9JU1dCTEFOSworICB1c2luZyBzdGQ6Omlzd2JsYW5rOworI2VuZGlmICAKK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfQ1dDVFlQRQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvZWxsX2ludGVncmFsLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2VsbF9pbnRlZ3JhbC50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUzMDc2YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2VsbF9pbnRlZ3JhbC50Y2MKQEAgLTAsMCArMSw3NTAgQEAKKy8vIFNwZWNpYWwgZnVuY3Rpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2VsbF9pbnRlZ3JhbC50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt0cjEvY21hdGh9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODIgVFIxOiA1LjIgIFNwZWNpYWwgZnVuY3Rpb25zCisvLworCisvLyBXcml0dGVuIGJ5IEVkd2FyZCBTbWl0aC1Sb3dsYW5kIGJhc2VkIG9uOgorLy8gICAoMSkgIEIuIEMuIENhcmxzb24gTnVtZXIuIE1hdGguIDMzLCAxICgxOTc5KQorLy8gICAoMikgIEIuIEMuIENhcmxzb24sIFNwZWNpYWwgRnVuY3Rpb25zIG9mIEFwcGxpZWQgTWF0aGVtYXRpY3MgKDE5NzcpCisvLyAgICgzKSAgVGhlIEdudSBTY2llbnRpZmljIExpYnJhcnksIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nc2wKKy8vICAgKDQpICBOdW1lcmljYWwgUmVjaXBlcyBpbiBDLCAybmQgZWQsIGJ5IFcuIEguIFByZXNzLCBTLiBBLiBUZXVrb2xza3ksCisvLyAgICAgICAgVy4gVC4gVmV0dGVybGluZywgQi4gUC4gRmxhbm5lcnksIENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzCisvLyAgICAgICAgKDE5OTIpLCBwcC4gMjYxLTI2OQorCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9FTExfSU5URUdSQUxfVENDCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9FTExfSU5URUdSQUxfVENDIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIC8vIFs1LjJdIFNwZWNpYWwgZnVuY3Rpb25zCisKKyAgLy8gSW1wbGVtZW50YXRpb24tc3BhY2UgZGV0YWlscy4KKyAgbmFtZXNwYWNlIF9fZGV0YWlsCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgQ2FybHNvbiBlbGxpcHRpYyBmdW5jdGlvbiBAZiQgUl9GKHgseSx6KSBAZiQKKyAgICAgKiAgICAgICAgICBvZiB0aGUgZmlyc3Qga2luZC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBDYXJsc29uIGVsbGlwdGljIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kIGlzIGRlZmluZWQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgICBSX0YoeCx5LHopID0gXGZyYWN7MX17Mn0gXGludF8wXlxpbmZ0eQorICAgICAqICAgICAgICAgICAgICAgICBcZnJhY3tkdH17KHQgKyB4KV57MS8yfSh0ICsgeSleezEvMn0odCArIHopXnsxLzJ9fQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgZmlyc3Qgb2YgdGhyZWUgc3ltbWV0cmljIGFyZ3VtZW50cy4KKyAgICAgKiAgIEBwYXJhbSAgX195ICBUaGUgc2Vjb25kIG9mIHRocmVlIHN5bW1ldHJpYyBhcmd1bWVudHMuCisgICAgICogICBAcGFyYW0gIF9feiAgVGhlIHRoaXJkIG9mIHRocmVlIHN5bW1ldHJpYyBhcmd1bWVudHMuCisgICAgICogICBAcmV0dXJuICBUaGUgQ2FybHNvbiBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgZmlyc3Qga2luZC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19lbGxpbnRfcmYoX1RwIF9feCwgX1RwIF9feSwgX1RwIF9feikKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19taW4gPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46Om1pbigpOworICAgICAgY29uc3QgX1RwIF9fbWF4ID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjptYXgoKTsKKyAgICAgIGNvbnN0IF9UcCBfX2xvbGltID0gX1RwKDUpICogX19taW47CisgICAgICBjb25zdCBfVHAgX191cGxpbSA9IF9fbWF4IC8gX1RwKDUpOworCisgICAgICBpZiAoX194IDwgX1RwKDApIHx8IF9feSA8IF9UcCgwKSB8fCBfX3ogPCBfVHAoMCkpCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJBcmd1bWVudCBsZXNzIHRoYW4gemVybyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2VsbGludF9yZi4iKSk7CisgICAgICBlbHNlIGlmIChfX3ggKyBfX3kgPCBfX2xvbGltIHx8IF9feCArIF9feiA8IF9fbG9saW0KKyAgICAgICAgICAgIHx8IF9feSArIF9feiA8IF9fbG9saW0pCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJBcmd1bWVudCB0b28gc21hbGwgaW4gX19lbGxpbnRfcmYiKSk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX19jMCA9IF9UcCgxKSAvIF9UcCg0KTsKKyAgICAgICAgICBjb25zdCBfVHAgX19jMSA9IF9UcCgxKSAvIF9UcCgyNCk7CisgICAgICAgICAgY29uc3QgX1RwIF9fYzIgPSBfVHAoMSkgLyBfVHAoMTApOworICAgICAgICAgIGNvbnN0IF9UcCBfX2MzID0gX1RwKDMpIC8gX1RwKDQ0KTsKKyAgICAgICAgICBjb25zdCBfVHAgX19jNCA9IF9UcCgxKSAvIF9UcCgxNCk7CisKKyAgICAgICAgICBfVHAgX194biA9IF9feDsKKyAgICAgICAgICBfVHAgX195biA9IF9feTsKKyAgICAgICAgICBfVHAgX196biA9IF9fejsKKworICAgICAgICAgIGNvbnN0IF9UcCBfX2VwcyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2VycnRvbCA9IHN0ZDo6cG93KF9fZXBzLCBfVHAoMSkgLyBfVHAoNikpOworICAgICAgICAgIF9UcCBfX211OworICAgICAgICAgIF9UcCBfX3huZGV2LCBfX3luZGV2LCBfX3puZGV2OworCisgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbWF4X2l0ZXIgPSAxMDA7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19pdGVyID0gMDsgX19pdGVyIDwgX19tYXhfaXRlcjsgKytfX2l0ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fbXUgPSAoX194biArIF9feW4gKyBfX3puKSAvIF9UcCgzKTsKKyAgICAgICAgICAgICAgX194bmRldiA9IDIgLSAoX19tdSArIF9feG4pIC8gX19tdTsKKyAgICAgICAgICAgICAgX195bmRldiA9IDIgLSAoX19tdSArIF9feW4pIC8gX19tdTsKKyAgICAgICAgICAgICAgX196bmRldiA9IDIgLSAoX19tdSArIF9fem4pIC8gX19tdTsKKyAgICAgICAgICAgICAgX1RwIF9fZXBzaWxvbiA9IHN0ZDo6bWF4KHN0ZDo6YWJzKF9feG5kZXYpLCBzdGQ6OmFicyhfX3luZGV2KSk7CisgICAgICAgICAgICAgIF9fZXBzaWxvbiA9IHN0ZDo6bWF4KF9fZXBzaWxvbiwgc3RkOjphYnMoX196bmRldikpOworICAgICAgICAgICAgICBpZiAoX19lcHNpbG9uIDwgX19lcnJ0b2wpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX3hucm9vdCA9IHN0ZDo6c3FydChfX3huKTsKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9feW5yb290ID0gc3RkOjpzcXJ0KF9feW4pOworICAgICAgICAgICAgICBjb25zdCBfVHAgX196bnJvb3QgPSBzdGQ6OnNxcnQoX196bik7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX2xhbWJkYSA9IF9feG5yb290ICogKF9feW5yb290ICsgX196bnJvb3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9feW5yb290ICogX196bnJvb3Q7CisgICAgICAgICAgICAgIF9feG4gPSBfX2MwICogKF9feG4gKyBfX2xhbWJkYSk7CisgICAgICAgICAgICAgIF9feW4gPSBfX2MwICogKF9feW4gKyBfX2xhbWJkYSk7CisgICAgICAgICAgICAgIF9fem4gPSBfX2MwICogKF9fem4gKyBfX2xhbWJkYSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBjb25zdCBfVHAgX19lMiA9IF9feG5kZXYgKiBfX3luZGV2IC0gX196bmRldiAqIF9fem5kZXY7CisgICAgICAgICAgY29uc3QgX1RwIF9fZTMgPSBfX3huZGV2ICogX195bmRldiAqIF9fem5kZXY7CisgICAgICAgICAgY29uc3QgX1RwIF9fcyAgPSBfVHAoMSkgKyAoX19jMSAqIF9fZTIgLSBfX2MyIC0gX19jMyAqIF9fZTMpICogX19lMgorICAgICAgICAgICAgICAgICAgICsgX19jNCAqIF9fZTM7CisKKyAgICAgICAgICByZXR1cm4gX19zIC8gc3RkOjpzcXJ0KF9fbXUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIGNvbXBsZXRlIGVsbGlwdGljIGludGVncmFsIG9mIHRoZSBmaXJzdCBraW5kCisgICAgICogICAgICAgICAgQGYkIEsoaykgQGYkIGJ5IHNlcmllcyBleHBhbnNpb24uCisgICAgICogCisgICAgICogICBUaGUgY29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWwgb2YgdGhlIGZpcnN0IGtpbmQgaXMgZGVmaW5lZCBhcworICAgICAqICAgQGZbCisgICAgICogICAgIEsoaykgPSBGKGssXHBpLzIpID0gXGludF8wXntccGkvMn1cZnJhY3tkXHRoZXRhfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xzcXJ0ezEgLSBrXjJzaW5eMlx0aGV0YX19CisgICAgICogICBAZl0KKyAgICAgKiAKKyAgICAgKiAgIFRoaXMgcm91dGluZSBpcyBub3QgYmFkIGFzIGxvbmcgYXMgfGt8IGlzIHNvbWV3aGF0IHNtYWxsZXIgdGhhbiAxCisgICAgICogICBidXQgaXMgbm90IGlzIGdvb2QgYXMgdGhlIENhcmxzb24gZWxsaXB0aWMgaW50ZWdyYWwgZm9ybXVsYXRpb24uCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9fayAgVGhlIGFyZ3VtZW50IG9mIHRoZSBjb21wbGV0ZSBlbGxpcHRpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBjb21wbGV0ZSBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgZmlyc3Qga2luZC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19jb21wX2VsbGludF8xX3NlcmllcyhfVHAgX19rKQorICAgIHsKKworICAgICAgY29uc3QgX1RwIF9fa2sgPSBfX2sgKiBfX2s7CisKKyAgICAgIF9UcCBfX3Rlcm0gPSBfX2trIC8gX1RwKDQpOworICAgICAgX1RwIF9fc3VtID0gX1RwKDEpICsgX190ZXJtOworCisgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgX19tYXhfaXRlciA9IDEwMDA7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAyOyBfX2kgPCBfX21heF9pdGVyOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9fdGVybSAqPSAoMiAqIF9faSAtIDEpICogX19rayAvICgyICogX19pKTsKKyAgICAgICAgICBpZiAoX190ZXJtIDwgc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBfX3N1bSArPSBfX3Rlcm07CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waV8yKCkgKiBfX3N1bTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIGNvbXBsZXRlIGVsbGlwdGljIGludGVncmFsIG9mIHRoZSBmaXJzdCBraW5kCisgICAgICogICAgICAgICAgIEBmJCBLKGspIEBmJCB1c2luZyB0aGUgQ2FybHNvbiBmb3JtdWxhdGlvbi4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBjb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbCBvZiB0aGUgZmlyc3Qga2luZCBpcyBkZWZpbmVkIGFzCisgICAgICogICBAZlsKKyAgICAgKiAgICAgSyhrKSA9IEYoayxccGkvMikgPSBcaW50XzBee1xwaS8yfVxmcmFje2RcdGhldGF9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xzcXJ0ezEgLSBrXjIgc2luXjJcdGhldGF9fQorICAgICAqICAgQGZdCisgICAgICogICB3aGVyZSBAZiQgRihrLFxwaGkpIEBmJCBpcyB0aGUgaW5jb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbCBvZiB0aGUKKyAgICAgKiAgIGZpcnN0IGtpbmQuCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9fayAgVGhlIGFyZ3VtZW50IG9mIHRoZSBjb21wbGV0ZSBlbGxpcHRpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBjb21wbGV0ZSBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgZmlyc3Qga2luZC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19jb21wX2VsbGludF8xKF9UcCBfX2spCisgICAgeworCisgICAgICBpZiAoX19pc25hbihfX2spKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKHN0ZDo6YWJzKF9faykgPj0gX1RwKDEpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9fZWxsaW50X3JmKF9UcCgwKSwgX1RwKDEpIC0gX19rICogX19rLCBfVHAoMSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgaW5jb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbCBvZiB0aGUgZmlyc3Qga2luZAorICAgICAqICAgICAgICAgICBAZiQgRihrLFxwaGkpIEBmJCB1c2luZyB0aGUgQ2FybHNvbiBmb3JtdWxhdGlvbi4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBpbmNvbXBsZXRlIGVsbGlwdGljIGludGVncmFsIG9mIHRoZSBmaXJzdCBraW5kIGlzIGRlZmluZWQgYXMKKyAgICAgKiAgIEBmWworICAgICAqICAgICBGKGssXHBoaSkgPSBcaW50XzBee1xwaGl9XGZyYWN7ZFx0aGV0YX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xzcXJ0ezEgLSBrXjIgc2luXjJcdGhldGF9fQorICAgICAqICAgQGZdCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9fayAgVGhlIGFyZ3VtZW50IG9mIHRoZSBlbGxpcHRpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19waGkgIFRoZSBpbnRlZ3JhbCBsaW1pdCBhcmd1bWVudCBvZiB0aGUgZWxsaXB0aWMgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgZWxsaXB0aWMgZnVuY3Rpb24gb2YgdGhlIGZpcnN0IGtpbmQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZWxsaW50XzEoX1RwIF9faywgX1RwIF9fcGhpKQorICAgIHsKKworICAgICAgaWYgKF9faXNuYW4oX19rKSB8fCBfX2lzbmFuKF9fcGhpKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChzdGQ6OmFicyhfX2spID4gX1RwKDEpKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQmFkIGFyZ3VtZW50IGluIF9fZWxsaW50XzEuIikpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLy8gIFJlZHVjZSBwaGkgdG8gLXBpLzIgPCBwaGkgPCArcGkvMi4KKyAgICAgICAgICBjb25zdCBpbnQgX19uID0gc3RkOjpmbG9vcihfX3BoaSAvIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX1RwKDAuNUwpKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19waGlfcmVkID0gX19waGkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gX19uICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCk7CisKKyAgICAgICAgICBjb25zdCBfVHAgX19zID0gc3RkOjpzaW4oX19waGlfcmVkKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19jID0gc3RkOjpjb3MoX19waGlfcmVkKTsKKworICAgICAgICAgIGNvbnN0IF9UcCBfX0YgPSBfX3MKKyAgICAgICAgICAgICAgICAgICAgICAgICogX19lbGxpbnRfcmYoX19jICogX19jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAoMSkgLSBfX2sgKiBfX2sgKiBfX3MgKiBfX3MsIF9UcCgxKSk7CisKKyAgICAgICAgICBpZiAoX19uID09IDApCisgICAgICAgICAgICByZXR1cm4gX19GOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBfX0YgKyBfVHAoMikgKiBfX24gKiBfX2NvbXBfZWxsaW50XzEoX19rKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIHRoZSBjb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbCBvZiB0aGUgc2Vjb25kIGtpbmQKKyAgICAgKiAgICAgICAgICBAZiQgRShrKSBAZiQgYnkgc2VyaWVzIGV4cGFuc2lvbi4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBjb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbCBvZiB0aGUgc2Vjb25kIGtpbmQgaXMgZGVmaW5lZCBhcworICAgICAqICAgQGZbCisgICAgICogICAgIEUoayxccGkvMikgPSBcaW50XzBee1xwaS8yfVxzcXJ0ezEgLSBrXjIgc2luXjJcdGhldGF9CisgICAgICogICBAZl0KKyAgICAgKiAKKyAgICAgKiAgIFRoaXMgcm91dGluZSBpcyBub3QgYmFkIGFzIGxvbmcgYXMgfGt8IGlzIHNvbWV3aGF0IHNtYWxsZXIgdGhhbiAxCisgICAgICogICBidXQgaXMgbm90IGlzIGdvb2QgYXMgdGhlIENhcmxzb24gZWxsaXB0aWMgaW50ZWdyYWwgZm9ybXVsYXRpb24uCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9fayAgVGhlIGFyZ3VtZW50IG9mIHRoZSBjb21wbGV0ZSBlbGxpcHRpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBjb21wbGV0ZSBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fY29tcF9lbGxpbnRfMl9zZXJpZXMoX1RwIF9faykKKyAgICB7CisKKyAgICAgIGNvbnN0IF9UcCBfX2trID0gX19rICogX19rOworCisgICAgICBfVHAgX190ZXJtID0gX19razsKKyAgICAgIF9UcCBfX3N1bSA9IF9fdGVybTsKKworICAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbWF4X2l0ZXIgPSAxMDAwOworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19pID0gMjsgX19pIDwgX19tYXhfaXRlcjsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX19pMm0gPSAyICogX19pIC0gMTsKKyAgICAgICAgICBjb25zdCBfVHAgX19pMiA9IDIgKiBfX2k7CisgICAgICAgICAgX190ZXJtICo9IF9faTJtICogX19pMm0gKiBfX2trIC8gKF9faTIgKiBfX2kyKTsKKyAgICAgICAgICBpZiAoX190ZXJtIDwgc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBfX3N1bSArPSBfX3Rlcm0gLyBfX2kybTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpXzIoKSAqIChfVHAoMSkgLSBfX3N1bSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBDYXJsc29uIGVsbGlwdGljIGZ1bmN0aW9uIG9mIHRoZSBzZWNvbmQga2luZAorICAgICAqICAgICAgICAgICBAZiQgUl9EKHgseSx6KSA9IFJfSih4LHkseix6KSBAZiQgd2hlcmUKKyAgICAgKiAgICAgICAgICAgQGYkIFJfSih4LHkseixwKSBAZiQgaXMgdGhlIENhcmxzb24gZWxsaXB0aWMgZnVuY3Rpb24KKyAgICAgKiAgICAgICAgICAgb2YgdGhlIHRoaXJkIGtpbmQuCisgICAgICogCisgICAgICogICBUaGUgQ2FybHNvbiBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQgaXMgZGVmaW5lZCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICAgIFJfRCh4LHkseikgPSBcZnJhY3szfXsyfSBcaW50XzBeXGluZnR5CisgICAgICogICAgICAgICAgICAgICAgIFxmcmFje2R0fXsodCArIHgpXnsxLzJ9KHQgKyB5KV57MS8yfSh0ICsgeileezMvMn19CisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQmFzZWQgb24gQ2FybHNvbidzIGFsZ29yaXRobXM6CisgICAgICogICAtICBCLiBDLiBDYXJsc29uIE51bWVyLiBNYXRoLiAzMywgMSAoMTk3OSkKKyAgICAgKiAgIC0gIEIuIEMuIENhcmxzb24sIFNwZWNpYWwgRnVuY3Rpb25zIG9mIEFwcGxpZWQgTWF0aGVtYXRpY3MgKDE5NzcpCisgICAgICogICAtICBOdW1lcmljYWwgUmVjaXBlcyBpbiBDLCAybmQgZWQsIHBwLiAyNjEtMjY5LAorICAgICAqICAgICAgYnkgUHJlc3MsIFRldWtvbHNreSwgVmV0dGVybGluZywgRmxhbm5lcnkgKDE5OTIpCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgZmlyc3Qgb2YgdHdvIHN5bW1ldHJpYyBhcmd1bWVudHMuCisgICAgICogICBAcGFyYW0gIF9feSAgVGhlIHNlY29uZCBvZiB0d28gc3ltbWV0cmljIGFyZ3VtZW50cy4KKyAgICAgKiAgIEBwYXJhbSAgX196ICBUaGUgdGhpcmQgYXJndW1lbnQuCisgICAgICogICBAcmV0dXJuICBUaGUgQ2FybHNvbiBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZWxsaW50X3JkKF9UcCBfX3gsIF9UcCBfX3ksIF9UcCBfX3opCisgICAgeworICAgICAgY29uc3QgX1RwIF9fZXBzID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisgICAgICBjb25zdCBfVHAgX19lcnJ0b2wgPSBzdGQ6OnBvdyhfX2VwcyAvIF9UcCg4KSwgX1RwKDEpIC8gX1RwKDYpKTsKKyAgICAgIGNvbnN0IF9UcCBfX21pbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6bWluKCk7CisgICAgICBjb25zdCBfVHAgX19tYXggPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46Om1heCgpOworICAgICAgY29uc3QgX1RwIF9fbG9saW0gPSBfVHAoMikgLyBzdGQ6OnBvdyhfX21heCwgX1RwKDIpIC8gX1RwKDMpKTsKKyAgICAgIGNvbnN0IF9UcCBfX3VwbGltID0gc3RkOjpwb3coX1RwKDAuMUwpICogX19lcnJ0b2wgLyBfX21pbiwgX1RwKDIpIC8gX1RwKDMpKTsKKworICAgICAgaWYgKF9feCA8IF9UcCgwKSB8fCBfX3kgPCBfVHAoMCkpCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJBcmd1bWVudCBsZXNzIHRoYW4gemVybyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2VsbGludF9yZC4iKSk7CisgICAgICBlbHNlIGlmIChfX3ggKyBfX3kgPCBfX2xvbGltIHx8IF9feiA8IF9fbG9saW0pCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJBcmd1bWVudCB0b28gc21hbGwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19lbGxpbnRfcmQuIikpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9fYzAgPSBfVHAoMSkgLyBfVHAoNCk7CisgICAgICAgICAgY29uc3QgX1RwIF9fYzEgPSBfVHAoMykgLyBfVHAoMTQpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2MyID0gX1RwKDEpIC8gX1RwKDYpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2MzID0gX1RwKDkpIC8gX1RwKDIyKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19jNCA9IF9UcCgzKSAvIF9UcCgyNik7CisKKyAgICAgICAgICBfVHAgX194biA9IF9feDsKKyAgICAgICAgICBfVHAgX195biA9IF9feTsKKyAgICAgICAgICBfVHAgX196biA9IF9fejsKKyAgICAgICAgICBfVHAgX19zaWdtYSA9IF9UcCgwKTsKKyAgICAgICAgICBfVHAgX19wb3dlcjQgPSBfVHAoMSk7CisKKyAgICAgICAgICBfVHAgX19tdTsKKyAgICAgICAgICBfVHAgX194bmRldiwgX195bmRldiwgX196bmRldjsKKworICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBfX21heF9pdGVyID0gMTAwOworICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IF9faXRlciA9IDA7IF9faXRlciA8IF9fbWF4X2l0ZXI7ICsrX19pdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX211ID0gKF9feG4gKyBfX3luICsgX1RwKDMpICogX196bikgLyBfVHAoNSk7CisgICAgICAgICAgICAgIF9feG5kZXYgPSAoX19tdSAtIF9feG4pIC8gX19tdTsKKyAgICAgICAgICAgICAgX195bmRldiA9IChfX211IC0gX195bikgLyBfX211OworICAgICAgICAgICAgICBfX3puZGV2ID0gKF9fbXUgLSBfX3puKSAvIF9fbXU7CisgICAgICAgICAgICAgIF9UcCBfX2Vwc2lsb24gPSBzdGQ6Om1heChzdGQ6OmFicyhfX3huZGV2KSwgc3RkOjphYnMoX195bmRldikpOworICAgICAgICAgICAgICBfX2Vwc2lsb24gPSBzdGQ6Om1heChfX2Vwc2lsb24sIHN0ZDo6YWJzKF9fem5kZXYpKTsKKyAgICAgICAgICAgICAgaWYgKF9fZXBzaWxvbiA8IF9fZXJydG9sKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBfVHAgX194bnJvb3QgPSBzdGQ6OnNxcnQoX194bik7CisgICAgICAgICAgICAgIF9UcCBfX3lucm9vdCA9IHN0ZDo6c3FydChfX3luKTsKKyAgICAgICAgICAgICAgX1RwIF9fem5yb290ID0gc3RkOjpzcXJ0KF9fem4pOworICAgICAgICAgICAgICBfVHAgX19sYW1iZGEgPSBfX3hucm9vdCAqIChfX3lucm9vdCArIF9fem5yb290KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfX3lucm9vdCAqIF9fem5yb290OworICAgICAgICAgICAgICBfX3NpZ21hICs9IF9fcG93ZXI0IC8gKF9fem5yb290ICogKF9fem4gKyBfX2xhbWJkYSkpOworICAgICAgICAgICAgICBfX3Bvd2VyNCAqPSBfX2MwOworICAgICAgICAgICAgICBfX3huID0gX19jMCAqIChfX3huICsgX19sYW1iZGEpOworICAgICAgICAgICAgICBfX3luID0gX19jMCAqIChfX3luICsgX19sYW1iZGEpOworICAgICAgICAgICAgICBfX3puID0gX19jMCAqIChfX3puICsgX19sYW1iZGEpOworICAgICAgICAgICAgfQorCisJICAvLyBOb3RlOiBfX2VhIGlzIGFuIFNQVSBiYWRuYW1lLgorICAgICAgICAgIF9UcCBfX2VhYSA9IF9feG5kZXYgKiBfX3luZGV2OworICAgICAgICAgIF9UcCBfX2ViID0gX196bmRldiAqIF9fem5kZXY7CisgICAgICAgICAgX1RwIF9fZWMgPSBfX2VhYSAtIF9fZWI7CisgICAgICAgICAgX1RwIF9fZWQgPSBfX2VhYSAtIF9UcCg2KSAqIF9fZWI7CisgICAgICAgICAgX1RwIF9fZWYgPSBfX2VkICsgX19lYyArIF9fZWM7CisgICAgICAgICAgX1RwIF9fczEgPSBfX2VkICogKC1fX2MxICsgX19jMyAqIF9fZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfVHAoMykgLSBfVHAoMykgKiBfX2M0ICogX196bmRldiAqIF9fZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfVHAoMikpOworICAgICAgICAgIF9UcCBfX3MyID0gX196bmRldgorICAgICAgICAgICAgICAgICAgICogKF9fYzIgKiBfX2VmCisgICAgICAgICAgICAgICAgICAgICsgX196bmRldiAqICgtX19jMyAqIF9fZWMgLSBfX3puZGV2ICogX19jNCAtIF9fZWFhKSk7CisKKyAgICAgICAgICByZXR1cm4gX1RwKDMpICogX19zaWdtYSArIF9fcG93ZXI0ICogKF9UcCgxKSArIF9fczEgKyBfX3MyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKF9fbXUgKiBzdGQ6OnNxcnQoX19tdSkpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBjb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbCBvZiB0aGUgc2Vjb25kIGtpbmQKKyAgICAgKiAgICAgICAgICAgQGYkIEUoaykgQGYkIHVzaW5nIHRoZSBDYXJsc29uIGZvcm11bGF0aW9uLgorICAgICAqIAorICAgICAqICAgVGhlIGNvbXBsZXRlIGVsbGlwdGljIGludGVncmFsIG9mIHRoZSBzZWNvbmQga2luZCBpcyBkZWZpbmVkIGFzCisgICAgICogICBAZlsKKyAgICAgKiAgICAgRShrLFxwaS8yKSA9IFxpbnRfMF57XHBpLzJ9XHNxcnR7MSAtIGteMiBzaW5eMlx0aGV0YX0KKyAgICAgKiAgIEBmXQorICAgICAqIAorICAgICAqICAgQHBhcmFtICBfX2sgIFRoZSBhcmd1bWVudCBvZiB0aGUgY29tcGxldGUgZWxsaXB0aWMgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgY29tcGxldGUgZWxsaXB0aWMgZnVuY3Rpb24gb2YgdGhlIHNlY29uZCBraW5kLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2NvbXBfZWxsaW50XzIoX1RwIF9faykKKyAgICB7CisKKyAgICAgIGlmIChfX2lzbmFuKF9faykpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZSBpZiAoc3RkOjphYnMoX19rKSA9PSAxKQorICAgICAgICByZXR1cm4gX1RwKDEpOworICAgICAgZWxzZSBpZiAoc3RkOjphYnMoX19rKSA+IF9UcCgxKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkJhZCBhcmd1bWVudCBpbiBfX2NvbXBfZWxsaW50XzIuIikpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9fa2sgPSBfX2sgKiBfX2s7CisKKyAgICAgICAgICByZXR1cm4gX19lbGxpbnRfcmYoX1RwKDApLCBfVHAoMSkgLSBfX2trLCBfVHAoMSkpCisgICAgICAgICAgICAgICAtIF9fa2sgKiBfX2VsbGludF9yZChfVHAoMCksIF9UcCgxKSAtIF9fa2ssIF9UcCgxKSkgLyBfVHAoMyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIGluY29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWwgb2YgdGhlIHNlY29uZCBraW5kCisgICAgICogICAgICAgICAgIEBmJCBFKGssXHBoaSkgQGYkIHVzaW5nIHRoZSBDYXJsc29uIGZvcm11bGF0aW9uLgorICAgICAqIAorICAgICAqICAgVGhlIGluY29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWwgb2YgdGhlIHNlY29uZCBraW5kIGlzIGRlZmluZWQgYXMKKyAgICAgKiAgIEBmWworICAgICAqICAgICBFKGssXHBoaSkgPSBcaW50XzBee1xwaGl9IFxzcXJ0ezEgLSBrXjIgc2luXjJcdGhldGF9CisgICAgICogICBAZl0KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX19rICBUaGUgYXJndW1lbnQgb2YgdGhlIGVsbGlwdGljIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX3BoaSAgVGhlIGludGVncmFsIGxpbWl0IGFyZ3VtZW50IG9mIHRoZSBlbGxpcHRpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZWxsaW50XzIoX1RwIF9faywgX1RwIF9fcGhpKQorICAgIHsKKworICAgICAgaWYgKF9faXNuYW4oX19rKSB8fCBfX2lzbmFuKF9fcGhpKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChzdGQ6OmFicyhfX2spID4gX1RwKDEpKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQmFkIGFyZ3VtZW50IGluIF9fZWxsaW50XzIuIikpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLy8gIFJlZHVjZSBwaGkgdG8gLXBpLzIgPCBwaGkgPCArcGkvMi4KKyAgICAgICAgICBjb25zdCBpbnQgX19uID0gc3RkOjpmbG9vcihfX3BoaSAvIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX1RwKDAuNUwpKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19waGlfcmVkID0gX19waGkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gX19uICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCk7CisKKyAgICAgICAgICBjb25zdCBfVHAgX19rayA9IF9fayAqIF9fazsKKyAgICAgICAgICBjb25zdCBfVHAgX19zID0gc3RkOjpzaW4oX19waGlfcmVkKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19zcyA9IF9fcyAqIF9fczsKKyAgICAgICAgICBjb25zdCBfVHAgX19zc3MgPSBfX3NzICogX19zOworICAgICAgICAgIGNvbnN0IF9UcCBfX2MgPSBzdGQ6OmNvcyhfX3BoaV9yZWQpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2NjID0gX19jICogX19jOworCisgICAgICAgICAgY29uc3QgX1RwIF9fRSA9IF9fcworICAgICAgICAgICAgICAgICAgICAgICAgKiBfX2VsbGludF9yZihfX2NjLCBfVHAoMSkgLSBfX2trICogX19zcywgX1RwKDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgLSBfX2trICogX19zc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICogX19lbGxpbnRfcmQoX19jYywgX1RwKDEpIC0gX19rayAqIF9fc3MsIF9UcCgxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gX1RwKDMpOworCisgICAgICAgICAgaWYgKF9fbiA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIF9fRTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gX19FICsgX1RwKDIpICogX19uICogX19jb21wX2VsbGludF8yKF9fayk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIENhcmxzb24gZWxsaXB0aWMgZnVuY3Rpb24KKyAgICAgKiAgICAgICAgICAgQGYkIFJfQyh4LHkpID0gUl9GKHgseSx5KSBAZiQgd2hlcmUgQGYkIFJfRih4LHkseikgQGYkCisgICAgICogICAgICAgICAgIGlzIHRoZSBDYXJsc29uIGVsbGlwdGljIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kLgorICAgICAqIAorICAgICAqICAgVGhlIENhcmxzb24gZWxsaXB0aWMgZnVuY3Rpb24gaXMgZGVmaW5lZCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICAgIFJfQyh4LHkpID0gXGZyYWN7MX17Mn0gXGludF8wXlxpbmZ0eQorICAgICAqICAgICAgICAgICAgICAgICBcZnJhY3tkdH17KHQgKyB4KV57MS8yfSh0ICsgeSl9CisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQmFzZWQgb24gQ2FybHNvbidzIGFsZ29yaXRobXM6CisgICAgICogICAtICBCLiBDLiBDYXJsc29uIE51bWVyLiBNYXRoLiAzMywgMSAoMTk3OSkKKyAgICAgKiAgIC0gIEIuIEMuIENhcmxzb24sIFNwZWNpYWwgRnVuY3Rpb25zIG9mIEFwcGxpZWQgTWF0aGVtYXRpY3MgKDE5NzcpCisgICAgICogICAtICBOdW1lcmljYWwgUmVjaXBlcyBpbiBDLCAybmQgZWQsIHBwLiAyNjEtMjY5LAorICAgICAqICAgICAgYnkgUHJlc3MsIFRldWtvbHNreSwgVmV0dGVybGluZywgRmxhbm5lcnkgKDE5OTIpCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgZmlyc3QgYXJndW1lbnQuCisgICAgICogICBAcGFyYW0gIF9feSAgVGhlIHNlY29uZCBhcmd1bWVudC4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBDYXJsc29uIGVsbGlwdGljIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2VsbGludF9yYyhfVHAgX194LCBfVHAgX195KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX21pbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6bWluKCk7CisgICAgICBjb25zdCBfVHAgX19tYXggPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46Om1heCgpOworICAgICAgY29uc3QgX1RwIF9fbG9saW0gPSBfVHAoNSkgKiBfX21pbjsKKyAgICAgIGNvbnN0IF9UcCBfX3VwbGltID0gX19tYXggLyBfVHAoNSk7CisKKyAgICAgIGlmIChfX3ggPCBfVHAoMCkgfHwgX195IDwgX1RwKDApIHx8IF9feCArIF9feSA8IF9fbG9saW0pCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJBcmd1bWVudCBsZXNzIHRoYW4gemVybyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2VsbGludF9yYy4iKSk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX19jMCA9IF9UcCgxKSAvIF9UcCg0KTsKKyAgICAgICAgICBjb25zdCBfVHAgX19jMSA9IF9UcCgxKSAvIF9UcCg3KTsKKyAgICAgICAgICBjb25zdCBfVHAgX19jMiA9IF9UcCg5KSAvIF9UcCgyMik7CisgICAgICAgICAgY29uc3QgX1RwIF9fYzMgPSBfVHAoMykgLyBfVHAoMTApOworICAgICAgICAgIGNvbnN0IF9UcCBfX2M0ID0gX1RwKDMpIC8gX1RwKDgpOworCisgICAgICAgICAgX1RwIF9feG4gPSBfX3g7CisgICAgICAgICAgX1RwIF9feW4gPSBfX3k7CisKKyAgICAgICAgICBjb25zdCBfVHAgX19lcHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19lcnJ0b2wgPSBzdGQ6OnBvdyhfX2VwcyAvIF9UcCgzMCksIF9UcCgxKSAvIF9UcCg2KSk7CisgICAgICAgICAgX1RwIF9fbXU7CisgICAgICAgICAgX1RwIF9fc247CisKKyAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgX19tYXhfaXRlciA9IDEwMDsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2l0ZXIgPSAwOyBfX2l0ZXIgPCBfX21heF9pdGVyOyArK19faXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19tdSA9IChfX3huICsgX1RwKDIpICogX195bikgLyBfVHAoMyk7CisgICAgICAgICAgICAgIF9fc24gPSAoX195biArIF9fbXUpIC8gX19tdSAtIF9UcCgyKTsKKyAgICAgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fc24pIDwgX19lcnJ0b2wpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX2xhbWJkYSA9IF9UcCgyKSAqIHN0ZDo6c3FydChfX3huKSAqIHN0ZDo6c3FydChfX3luKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9feW47CisgICAgICAgICAgICAgIF9feG4gPSBfX2MwICogKF9feG4gKyBfX2xhbWJkYSk7CisgICAgICAgICAgICAgIF9feW4gPSBfX2MwICogKF9feW4gKyBfX2xhbWJkYSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfVHAgX19zID0gX19zbiAqIF9fc24KKyAgICAgICAgICAgICAgICAgICogKF9fYzMgKyBfX3NuKihfX2MxICsgX19zbiAqIChfX2M0ICsgX19zbiAqIF9fYzIpKSk7CisKKyAgICAgICAgICByZXR1cm4gKF9UcCgxKSArIF9fcykgLyBzdGQ6OnNxcnQoX19tdSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIENhcmxzb24gZWxsaXB0aWMgZnVuY3Rpb24gQGYkIFJfSih4LHkseixwKSBAZiQKKyAgICAgKiAgICAgICAgICAgb2YgdGhlIHRoaXJkIGtpbmQuCisgICAgICogCisgICAgICogICBUaGUgQ2FybHNvbiBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgdGhpcmQga2luZCBpcyBkZWZpbmVkIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgICAgUl9KKHgseSx6LHApID0gXGZyYWN7M317Mn0gXGludF8wXlxpbmZ0eQorICAgICAqICAgICAgIFxmcmFje2R0fXsodCArIHgpXnsxLzJ9KHQgKyB5KV57MS8yfSh0ICsgeileezEvMn0odCArIHApfQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIEJhc2VkIG9uIENhcmxzb24ncyBhbGdvcml0aG1zOgorICAgICAqICAgLSAgQi4gQy4gQ2FybHNvbiBOdW1lci4gTWF0aC4gMzMsIDEgKDE5NzkpCisgICAgICogICAtICBCLiBDLiBDYXJsc29uLCBTcGVjaWFsIEZ1bmN0aW9ucyBvZiBBcHBsaWVkIE1hdGhlbWF0aWNzICgxOTc3KQorICAgICAqICAgLSAgTnVtZXJpY2FsIFJlY2lwZXMgaW4gQywgMm5kIGVkLCBwcC4gMjYxLTI2OSwKKyAgICAgKiAgICAgIGJ5IFByZXNzLCBUZXVrb2xza3ksIFZldHRlcmxpbmcsIEZsYW5uZXJ5ICgxOTkyKQorICAgICAqCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGZpcnN0IG9mIHRocmVlIHN5bW1ldHJpYyBhcmd1bWVudHMuCisgICAgICogICBAcGFyYW0gIF9feSAgVGhlIHNlY29uZCBvZiB0aHJlZSBzeW1tZXRyaWMgYXJndW1lbnRzLgorICAgICAqICAgQHBhcmFtICBfX3ogIFRoZSB0aGlyZCBvZiB0aHJlZSBzeW1tZXRyaWMgYXJndW1lbnRzLgorICAgICAqICAgQHBhcmFtICBfX3AgIFRoZSBmb3VydGggYXJndW1lbnQuCisgICAgICogICBAcmV0dXJuICBUaGUgQ2FybHNvbiBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgZm91cnRoIGtpbmQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZWxsaW50X3JqKF9UcCBfX3gsIF9UcCBfX3ksIF9UcCBfX3osIF9UcCBfX3ApCisgICAgeworICAgICAgY29uc3QgX1RwIF9fbWluID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjptaW4oKTsKKyAgICAgIGNvbnN0IF9UcCBfX21heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6bWF4KCk7CisgICAgICBjb25zdCBfVHAgX19sb2xpbSA9IHN0ZDo6cG93KF9UcCg1KSAqIF9fbWluLCBfVHAoMSkvX1RwKDMpKTsKKyAgICAgIGNvbnN0IF9UcCBfX3VwbGltID0gX1RwKDAuM0wpCisgICAgICAgICAgICAgICAgICAgICAgICAqIHN0ZDo6cG93KF9UcCgwLjJMKSAqIF9fbWF4LCBfVHAoMSkvX1RwKDMpKTsKKworICAgICAgaWYgKF9feCA8IF9UcCgwKSB8fCBfX3kgPCBfVHAoMCkgfHwgX196IDwgX1RwKDApKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQXJndW1lbnQgbGVzcyB0aGFuIHplcm8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19lbGxpbnRfcmouIikpOworICAgICAgZWxzZSBpZiAoX194ICsgX195IDwgX19sb2xpbSB8fCBfX3ggKyBfX3ogPCBfX2xvbGltCisgICAgICAgICAgICB8fCBfX3kgKyBfX3ogPCBfX2xvbGltIHx8IF9fcCA8IF9fbG9saW0pCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJBcmd1bWVudCB0b28gc21hbGwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19lbGxpbnRfcmoiKSk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX19jMCA9IF9UcCgxKSAvIF9UcCg0KTsKKyAgICAgICAgICBjb25zdCBfVHAgX19jMSA9IF9UcCgzKSAvIF9UcCgxNCk7CisgICAgICAgICAgY29uc3QgX1RwIF9fYzIgPSBfVHAoMSkgLyBfVHAoMyk7CisgICAgICAgICAgY29uc3QgX1RwIF9fYzMgPSBfVHAoMykgLyBfVHAoMjIpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2M0ID0gX1RwKDMpIC8gX1RwKDI2KTsKKworICAgICAgICAgIF9UcCBfX3huID0gX194OworICAgICAgICAgIF9UcCBfX3luID0gX195OworICAgICAgICAgIF9UcCBfX3puID0gX196OworICAgICAgICAgIF9UcCBfX3BuID0gX19wOworICAgICAgICAgIF9UcCBfX3NpZ21hID0gX1RwKDApOworICAgICAgICAgIF9UcCBfX3Bvd2VyNCA9IF9UcCgxKTsKKworICAgICAgICAgIGNvbnN0IF9UcCBfX2VwcyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2VycnRvbCA9IHN0ZDo6cG93KF9fZXBzIC8gX1RwKDgpLCBfVHAoMSkgLyBfVHAoNikpOworCisgICAgICAgICAgX1RwIF9fbGFtYmRhLCBfX211OworICAgICAgICAgIF9UcCBfX3huZGV2LCBfX3luZGV2LCBfX3puZGV2LCBfX3BuZGV2OworCisgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbWF4X2l0ZXIgPSAxMDA7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19pdGVyID0gMDsgX19pdGVyIDwgX19tYXhfaXRlcjsgKytfX2l0ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fbXUgPSAoX194biArIF9feW4gKyBfX3puICsgX1RwKDIpICogX19wbikgLyBfVHAoNSk7CisgICAgICAgICAgICAgIF9feG5kZXYgPSAoX19tdSAtIF9feG4pIC8gX19tdTsKKyAgICAgICAgICAgICAgX195bmRldiA9IChfX211IC0gX195bikgLyBfX211OworICAgICAgICAgICAgICBfX3puZGV2ID0gKF9fbXUgLSBfX3puKSAvIF9fbXU7CisgICAgICAgICAgICAgIF9fcG5kZXYgPSAoX19tdSAtIF9fcG4pIC8gX19tdTsKKyAgICAgICAgICAgICAgX1RwIF9fZXBzaWxvbiA9IHN0ZDo6bWF4KHN0ZDo6YWJzKF9feG5kZXYpLCBzdGQ6OmFicyhfX3luZGV2KSk7CisgICAgICAgICAgICAgIF9fZXBzaWxvbiA9IHN0ZDo6bWF4KF9fZXBzaWxvbiwgc3RkOjphYnMoX196bmRldikpOworICAgICAgICAgICAgICBfX2Vwc2lsb24gPSBzdGQ6Om1heChfX2Vwc2lsb24sIHN0ZDo6YWJzKF9fcG5kZXYpKTsKKyAgICAgICAgICAgICAgaWYgKF9fZXBzaWxvbiA8IF9fZXJydG9sKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjb25zdCBfVHAgX194bnJvb3QgPSBzdGQ6OnNxcnQoX194bik7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX3lucm9vdCA9IHN0ZDo6c3FydChfX3luKTsKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9fem5yb290ID0gc3RkOjpzcXJ0KF9fem4pOworICAgICAgICAgICAgICBjb25zdCBfVHAgX19sYW1iZGEgPSBfX3hucm9vdCAqIChfX3lucm9vdCArIF9fem5yb290KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfX3lucm9vdCAqIF9fem5yb290OworICAgICAgICAgICAgICBjb25zdCBfVHAgX19hbHBoYTEgPSBfX3BuICogKF9feG5yb290ICsgX195bnJvb3QgKyBfX3pucm9vdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfX3hucm9vdCAqIF9feW5yb290ICogX196bnJvb3Q7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX2FscGhhMiA9IF9fYWxwaGExICogX19hbHBoYTE7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX2JldGEgPSBfX3BuICogKF9fcG4gKyBfX2xhbWJkYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoX19wbiArIF9fbGFtYmRhKTsKKyAgICAgICAgICAgICAgX19zaWdtYSArPSBfX3Bvd2VyNCAqIF9fZWxsaW50X3JjKF9fYWxwaGEyLCBfX2JldGEpOworICAgICAgICAgICAgICBfX3Bvd2VyNCAqPSBfX2MwOworICAgICAgICAgICAgICBfX3huID0gX19jMCAqIChfX3huICsgX19sYW1iZGEpOworICAgICAgICAgICAgICBfX3luID0gX19jMCAqIChfX3luICsgX19sYW1iZGEpOworICAgICAgICAgICAgICBfX3puID0gX19jMCAqIChfX3puICsgX19sYW1iZGEpOworICAgICAgICAgICAgICBfX3BuID0gX19jMCAqIChfX3BuICsgX19sYW1iZGEpOworICAgICAgICAgICAgfQorCisJICAvLyBOb3RlOiBfX2VhIGlzIGFuIFNQVSBiYWRuYW1lLgorICAgICAgICAgIF9UcCBfX2VhYSA9IF9feG5kZXYgKiAoX195bmRldiArIF9fem5kZXYpICsgX195bmRldiAqIF9fem5kZXY7CisgICAgICAgICAgX1RwIF9fZWIgPSBfX3huZGV2ICogX195bmRldiAqIF9fem5kZXY7CisgICAgICAgICAgX1RwIF9fZWMgPSBfX3BuZGV2ICogX19wbmRldjsKKyAgICAgICAgICBfVHAgX19lMiA9IF9fZWFhIC0gX1RwKDMpICogX19lYzsKKyAgICAgICAgICBfVHAgX19lMyA9IF9fZWIgKyBfVHAoMikgKiBfX3BuZGV2ICogKF9fZWFhIC0gX19lYyk7CisgICAgICAgICAgX1RwIF9fczEgPSBfVHAoMSkgKyBfX2UyICogKC1fX2MxICsgX1RwKDMpICogX19jMyAqIF9fZTIgLyBfVHAoNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIF9UcCgzKSAqIF9fYzQgKiBfX2UzIC8gX1RwKDIpKTsKKyAgICAgICAgICBfVHAgX19zMiA9IF9fZWIgKiAoX19jMiAvIF9UcCgyKQorICAgICAgICAgICAgICAgICAgICsgX19wbmRldiAqICgtX19jMyAtIF9fYzMgKyBfX3BuZGV2ICogX19jNCkpOworICAgICAgICAgIF9UcCBfX3MzID0gX19wbmRldiAqIF9fZWFhICogKF9fYzIgLSBfX3BuZGV2ICogX19jMykKKyAgICAgICAgICAgICAgICAgICAtIF9fYzIgKiBfX3BuZGV2ICogX19lYzsKKworICAgICAgICAgIHJldHVybiBfVHAoMykgKiBfX3NpZ21hICsgX19wb3dlcjQgKiAoX19zMSArIF9fczIgKyBfX3MzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoX19tdSAqIHN0ZDo6c3FydChfX211KSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgY29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWwgb2YgdGhlIHRoaXJkIGtpbmQKKyAgICAgKiAgICAgICAgICBAZiQgXFBpKGssXG51KSA9IFxQaShrLFxudSxccGkvMikgQGYkIHVzaW5nIHRoZQorICAgICAqICAgICAgICAgIENhcmxzb24gZm9ybXVsYXRpb24uCisgICAgICogCisgICAgICogICBUaGUgY29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWwgb2YgdGhlIHRoaXJkIGtpbmQgaXMgZGVmaW5lZCBhcworICAgICAqICAgQGZbCisgICAgICogICAgIFxQaShrLFxudSkgPSBcaW50XzBee1xwaS8yfQorICAgICAqICAgICAgICAgICAgICAgICAgIFxmcmFje2RcdGhldGF9CisgICAgICogICAgICAgICAgICAgICAgIHsoMSAtIFxudSBcc2luXjJcdGhldGEpXHNxcnR7MSAtIGteMiBcc2luXjJcdGhldGF9fQorICAgICAqICAgQGZdCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9fayAgVGhlIGFyZ3VtZW50IG9mIHRoZSBlbGxpcHRpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19udSAgVGhlIHNlY29uZCBhcmd1bWVudCBvZiB0aGUgZWxsaXB0aWMgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgY29tcGxldGUgZWxsaXB0aWMgZnVuY3Rpb24gb2YgdGhlIHRoaXJkIGtpbmQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fY29tcF9lbGxpbnRfMyhfVHAgX19rLCBfVHAgX19udSkKKyAgICB7CisKKyAgICAgIGlmIChfX2lzbmFuKF9faykgfHwgX19pc25hbihfX251KSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChfX251ID09IF9UcCgxKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6aW5maW5pdHkoKTsKKyAgICAgIGVsc2UgaWYgKHN0ZDo6YWJzKF9faykgPiBfVHAoMSkpCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJCYWQgYXJndW1lbnQgaW4gX19jb21wX2VsbGludF8zLiIpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX2trID0gX19rICogX19rOworCisgICAgICAgICAgcmV0dXJuIF9fZWxsaW50X3JmKF9UcCgwKSwgX1RwKDEpIC0gX19raywgX1RwKDEpKQorICAgICAgICAgICAgICAgLSBfX251CisgICAgICAgICAgICAgICAqIF9fZWxsaW50X3JqKF9UcCgwKSwgX1RwKDEpIC0gX19raywgX1RwKDEpLCBfVHAoMSkgKyBfX251KQorICAgICAgICAgICAgICAgLyBfVHAoMyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgaW5jb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbCBvZiB0aGUgdGhpcmQga2luZAorICAgICAqICAgICAgICAgIEBmJCBcUGkoayxcbnUsXHBoaSkgQGYkIHVzaW5nIHRoZSBDYXJsc29uIGZvcm11bGF0aW9uLgorICAgICAqIAorICAgICAqICAgVGhlIGluY29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWwgb2YgdGhlIHRoaXJkIGtpbmQgaXMgZGVmaW5lZCBhcworICAgICAqICAgQGZbCisgICAgICogICAgIFxQaShrLFxudSxccGhpKSA9IFxpbnRfMF57XHBoaX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgXGZyYWN7ZFx0aGV0YX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KDEgLSBcbnUgXHNpbl4yXHRoZXRhKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcc3FydHsxIC0ga14yIFxzaW5eMlx0aGV0YX19CisgICAgICogICBAZl0KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX19rICBUaGUgYXJndW1lbnQgb2YgdGhlIGVsbGlwdGljIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX251ICBUaGUgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBlbGxpcHRpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19waGkgIFRoZSBpbnRlZ3JhbCBsaW1pdCBhcmd1bWVudCBvZiB0aGUgZWxsaXB0aWMgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgZWxsaXB0aWMgZnVuY3Rpb24gb2YgdGhlIHRoaXJkIGtpbmQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZWxsaW50XzMoX1RwIF9faywgX1RwIF9fbnUsIF9UcCBfX3BoaSkKKyAgICB7CisKKyAgICAgIGlmIChfX2lzbmFuKF9faykgfHwgX19pc25hbihfX251KSB8fCBfX2lzbmFuKF9fcGhpKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChzdGQ6OmFicyhfX2spID4gX1RwKDEpKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQmFkIGFyZ3VtZW50IGluIF9fZWxsaW50XzMuIikpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLy8gIFJlZHVjZSBwaGkgdG8gLXBpLzIgPCBwaGkgPCArcGkvMi4KKyAgICAgICAgICBjb25zdCBpbnQgX19uID0gc3RkOjpmbG9vcihfX3BoaSAvIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX1RwKDAuNUwpKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19waGlfcmVkID0gX19waGkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gX19uICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCk7CisKKyAgICAgICAgICBjb25zdCBfVHAgX19rayA9IF9fayAqIF9fazsKKyAgICAgICAgICBjb25zdCBfVHAgX19zID0gc3RkOjpzaW4oX19waGlfcmVkKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19zcyA9IF9fcyAqIF9fczsKKyAgICAgICAgICBjb25zdCBfVHAgX19zc3MgPSBfX3NzICogX19zOworICAgICAgICAgIGNvbnN0IF9UcCBfX2MgPSBzdGQ6OmNvcyhfX3BoaV9yZWQpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2NjID0gX19jICogX19jOworCisgICAgICAgICAgY29uc3QgX1RwIF9fUGkgPSBfX3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIF9fZWxsaW50X3JmKF9fY2MsIF9UcCgxKSAtIF9fa2sgKiBfX3NzLCBfVHAoMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLSBfX251ICogX19zc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIF9fZWxsaW50X3JqKF9fY2MsIF9UcCgxKSAtIF9fa2sgKiBfX3NzLCBfVHAoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAoMSkgKyBfX251ICogX19zcykgLyBfVHAoMyk7CisKKyAgICAgICAgICBpZiAoX19uID09IDApCisgICAgICAgICAgICByZXR1cm4gX19QaTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gX19QaSArIF9UcCgyKSAqIF9fbiAqIF9fY29tcF9lbGxpbnRfMyhfX2ssIF9fbnUpOworICAgICAgICB9CisgICAgfQorCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSBzdGQ6OnRyMTo6X19kZXRhaWwKK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9FTExfSU5URUdSQUxfVENDCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2V4cF9pbnRlZ3JhbC50Y2MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9leHBfaW50ZWdyYWwudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YzAzYTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9leHBfaW50ZWdyYWwudGNjCkBAIC0wLDAgKzEsNTI2IEBACisvLyBTcGVjaWFsIGZ1bmN0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9leHBfaW50ZWdyYWwudGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dHIxL2NtYXRofQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyIFRSMTogNS4yICBTcGVjaWFsIGZ1bmN0aW9ucworLy8KKworLy8gIFdyaXR0ZW4gYnkgRWR3YXJkIFNtaXRoLVJvd2xhbmQgYmFzZWQgb246CisvLworLy8gICAoMSkgSGFuZGJvb2sgb2YgTWF0aGVtYXRpY2FsIEZ1bmN0aW9ucywKKy8vICAgICAgIEVkLiBieSBNaWx0b24gQWJyYW1vd2l0eiBhbmQgSXJlbmUgQS4gU3RlZ3VuLAorLy8gICAgICAgRG92ZXIgUHVibGljYXRpb25zLCBOZXctWW9yaywgU2VjdGlvbiA1LCBwcC4gMjI4LTI1MS4KKy8vICAgKDIpIFRoZSBHbnUgU2NpZW50aWZpYyBMaWJyYXJ5LCBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ3NsCisvLyAgICgzKSBOdW1lcmljYWwgUmVjaXBlcyBpbiBDLCBieSBXLiBILiBQcmVzcywgUy4gQS4gVGV1a29sc2t5LAorLy8gICAgICAgVy4gVC4gVmV0dGVybGluZywgQi4gUC4gRmxhbm5lcnksIENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzICgxOTkyKSwKKy8vICAgICAgIDJuZCBlZCwgcHAuIDIyMi0yMjUuCisvLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9FWFBfSU5URUdSQUxfVENDCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9FWFBfSU5URUdSQUxfVENDIDEKKworI2luY2x1ZGUgInNwZWNpYWxfZnVuY3Rpb25fdXRpbC5oIgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKKyAgLy8gWzUuMl0gU3BlY2lhbCBmdW5jdGlvbnMKKworICAvLyBJbXBsZW1lbnRhdGlvbi1zcGFjZSBkZXRhaWxzLgorICBuYW1lc3BhY2UgX19kZXRhaWwKKyAgeworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBfVHAgX19leHBpbnRfRTEoX1RwKTsKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgQGYkIEVfMSh4KSBAZiQKKyAgICAgKiAgICAgICAgICBieSBzZXJpZXMgc3VtbWF0aW9uLiAgVGhpcyBzaG91bGQgYmUgZ29vZAorICAgICAqICAgICAgICAgIGZvciBAZiQgeCA8IDEgQGYkLgorICAgICAqIAorICAgICAqICAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsIGlzIGdpdmVuIGJ5CisgICAgICogICAgICAgICAgXGZbCisgICAgICogICAgICAgICAgICBFXzEoeCkgPSBcaW50X3sxfV57XGluZnR5fSBcZnJhY3tlXnsteHR9fXt0fSBkdAorICAgICAqICAgICAgICAgIFxmXQorICAgICAqIAorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBhcmd1bWVudCBvZiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZXhwaW50X0UxX3NlcmllcyhfVHAgX194KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX2VwcyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworICAgICAgX1RwIF9fdGVybSA9IF9UcCgxKTsKKyAgICAgIF9UcCBfX2VzdW0gPSBfVHAoMCk7CisgICAgICBfVHAgX19vc3VtID0gX1RwKDApOworICAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbWF4X2l0ZXIgPSAxMDA7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAxOyBfX2kgPCBfX21heF9pdGVyOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9fdGVybSAqPSAtIF9feCAvIF9faTsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX190ZXJtKSA8IF9fZXBzKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKF9fdGVybSA+PSBfVHAoMCkpCisgICAgICAgICAgICBfX2VzdW0gKz0gX190ZXJtIC8gX19pOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9fb3N1bSArPSBfX3Rlcm0gLyBfX2k7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIC0gX19lc3VtIC0gX19vc3VtCisgICAgICAgICAgICAgLSBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fZ2FtbWFfZSgpIC0gc3RkOjpsb2coX194KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgQGYkIEVfMSh4KSBAZiQKKyAgICAgKiAgICAgICAgICBieSBhc3ltcHRvdGljIGV4cGFuc2lvbi4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBpcyBnaXZlbiBieQorICAgICAqICAgICAgICAgIFxmWworICAgICAqICAgICAgICAgICAgRV8xKHgpID0gXGludF97MX1eXGluZnR5IFxmcmFje2Veey14dH19e3R9IGR0CisgICAgICogICAgICAgICAgXGZdCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19leHBpbnRfRTFfYXN5bXAoX1RwIF9feCkKKyAgICB7CisgICAgICBfVHAgX190ZXJtID0gX1RwKDEpOworICAgICAgX1RwIF9fZXN1bSA9IF9UcCgxKTsKKyAgICAgIF9UcCBfX29zdW0gPSBfVHAoMCk7CisgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgX19tYXhfaXRlciA9IDEwMDA7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAxOyBfX2kgPCBfX21heF9pdGVyOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX3ByZXYgPSBfX3Rlcm07CisgICAgICAgICAgX190ZXJtICo9IC0gX19pIC8gX194OworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX3Rlcm0pID4gc3RkOjphYnMoX19wcmV2KSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmIChfX3Rlcm0gPj0gX1RwKDApKQorICAgICAgICAgICAgX19lc3VtICs9IF9fdGVybTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBfX29zdW0gKz0gX190ZXJtOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBzdGQ6OmV4cCgtIF9feCkgKiAoX19lc3VtICsgX19vc3VtKSAvIF9feDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgQGYkIEVfbih4KSBAZiQKKyAgICAgKiAgICAgICAgICBieSBzZXJpZXMgc3VtbWF0aW9uLgorICAgICAqIAorICAgICAqICAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsIGlzIGdpdmVuIGJ5CisgICAgICogICAgICAgICAgXGZbCisgICAgICogICAgICAgICAgICBFX24oeCkgPSBcaW50X3sxfV5caW5mdHkgXGZyYWN7ZV57LXh0fX17dF5ufSBkdAorICAgICAqICAgICAgICAgIFxmXQorICAgICAqIAorICAgICAqICAgQHBhcmFtICBfX24gIFRoZSBvcmRlciBvZiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19leHBpbnRfRW5fc2VyaWVzKHVuc2lnbmVkIGludCBfX24sIF9UcCBfX3gpCisgICAgeworICAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbWF4X2l0ZXIgPSAxMDA7CisgICAgICBjb25zdCBfVHAgX19lcHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKTsKKyAgICAgIGNvbnN0IGludCBfX25tMSA9IF9fbiAtIDE7CisgICAgICBfVHAgX19hbnMgPSAoX19ubTEgIT0gMAorICAgICAgICAgICAgICAgID8gX1RwKDEpIC8gX19ubTEgOiAtc3RkOjpsb2coX194KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19nYW1tYV9lKCkpOworICAgICAgX1RwIF9fZmFjdCA9IF9UcCgxKTsKKyAgICAgIGZvciAoaW50IF9faSA9IDE7IF9faSA8PSBfX21heF9pdGVyOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9fZmFjdCAqPSAtX194IC8gX1RwKF9faSk7CisgICAgICAgICAgX1RwIF9fZGVsOworICAgICAgICAgIGlmICggX19pICE9IF9fbm0xICkKKyAgICAgICAgICAgIF9fZGVsID0gLV9fZmFjdCAvIF9UcChfX2kgLSBfX25tMSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfVHAgX19wc2kgPSAtX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpnYW1tYV9lKCk7CisgICAgICAgICAgICAgIGZvciAoaW50IF9faWkgPSAxOyBfX2lpIDw9IF9fbm0xOyArK19faWkpCisgICAgICAgICAgICAgICAgX19wc2kgKz0gX1RwKDEpIC8gX1RwKF9faWkpOworICAgICAgICAgICAgICBfX2RlbCA9IF9fZmFjdCAqIChfX3BzaSAtIHN0ZDo6bG9nKF9feCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBfX2FucyArPSBfX2RlbDsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX19kZWwpIDwgX19lcHMgKiBzdGQ6OmFicyhfX2FucykpCisgICAgICAgICAgICByZXR1cm4gX19hbnM7CisgICAgICAgIH0KKyAgICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiU2VyaWVzIHN1bW1hdGlvbiBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2V4cGludF9Fbl9zZXJpZXMuIikpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBAZiQgRV9uKHgpIEBmJAorICAgICAqICAgICAgICAgIGJ5IGNvbnRpbnVlZCBmcmFjdGlvbnMuCisgICAgICogCisgICAgICogICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgaXMgZ2l2ZW4gYnkKKyAgICAgKiAgICAgICAgICBcZlsKKyAgICAgKiAgICAgICAgICAgIEVfbih4KSA9IFxpbnRfezF9XlxpbmZ0eSBcZnJhY3tlXnsteHR9fXt0Xm59IGR0CisgICAgICogICAgICAgICAgXGZdCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9fbiAgVGhlIG9yZGVyIG9mIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIGV4cG9uZW50aWFsIGludGVncmFsIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2V4cGludF9Fbl9jb250X2ZyYWModW5zaWduZWQgaW50IF9fbiwgX1RwIF9feCkKKyAgICB7CisgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgX19tYXhfaXRlciA9IDEwMDsKKyAgICAgIGNvbnN0IF9UcCBfX2VwcyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworICAgICAgY29uc3QgX1RwIF9fZnBfbWluID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjptaW4oKTsKKyAgICAgIGNvbnN0IGludCBfX25tMSA9IF9fbiAtIDE7CisgICAgICBfVHAgX19iID0gX194ICsgX1RwKF9fbik7CisgICAgICBfVHAgX19jID0gX1RwKDEpIC8gX19mcF9taW47CisgICAgICBfVHAgX19kID0gX1RwKDEpIC8gX19iOworICAgICAgX1RwIF9faCA9IF9fZDsKKyAgICAgIGZvciAoIHVuc2lnbmVkIGludCBfX2kgPSAxOyBfX2kgPD0gX19tYXhfaXRlcjsgKytfX2kgKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fYSA9IC1fVHAoX19pICogKF9fbm0xICsgX19pKSk7CisgICAgICAgICAgX19iICs9IF9UcCgyKTsKKyAgICAgICAgICBfX2QgPSBfVHAoMSkgLyAoX19hICogX19kICsgX19iKTsKKyAgICAgICAgICBfX2MgPSBfX2IgKyBfX2EgLyBfX2M7CisgICAgICAgICAgY29uc3QgX1RwIF9fZGVsID0gX19jICogX19kOworICAgICAgICAgIF9faCAqPSBfX2RlbDsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX19kZWwgLSBfVHAoMSkpIDwgX19lcHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX2FucyA9IF9faCAqIHN0ZDo6ZXhwKC1fX3gpOworICAgICAgICAgICAgICByZXR1cm4gX19hbnM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiQ29udGludWVkIGZyYWN0aW9uIGZhaWxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9fZXhwaW50X0VuX2NvbnRfZnJhYy4iKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIGV4cG9uZW50aWFsIGludGVncmFsIEBmJCBFX24oeCkgQGYkCisgICAgICogICAgICAgICAgYnkgcmVjdXJzaW9uLiAgVXNlIHVwd2FyZCByZWN1cnNpb24gZm9yIEBmJCB4IDwgbiBAZiQKKyAgICAgKiAgICAgICAgICBhbmQgZG93bndhcmQgcmVjdXJzaW9uIChNaWxsZXIncyBhbGdvcml0aG0pIG90aGVyd2lzZS4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBpcyBnaXZlbiBieQorICAgICAqICAgICAgICAgIFxmWworICAgICAqICAgICAgICAgICAgRV9uKHgpID0gXGludF97MX1eXGluZnR5IFxmcmFje2Veey14dH19e3Rebn0gZHQKKyAgICAgKiAgICAgICAgICBcZl0KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX19uICBUaGUgb3JkZXIgb2YgdGhlIGV4cG9uZW50aWFsIGludGVncmFsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBhcmd1bWVudCBvZiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZXhwaW50X0VuX3JlY3Vyc2lvbih1bnNpZ25lZCBpbnQgX19uLCBfVHAgX194KQorICAgIHsKKyAgICAgIF9UcCBfX0VuOworICAgICAgX1RwIF9fRTEgPSBfX2V4cGludF9FMShfX3gpOworICAgICAgaWYgKF9feCA8IF9UcChfX24pKQorICAgICAgICB7CisgICAgICAgICAgLy8gIEZvcndhcmQgcmVjdXJzaW9uIGlzIHN0YWJsZSBvbmx5IGZvciBuIDwgeC4KKyAgICAgICAgICBfX0VuID0gX19FMTsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2ogPSAyOyBfX2ogPCBfX247ICsrX19qKQorICAgICAgICAgICAgX19FbiA9IChzdGQ6OmV4cCgtX194KSAtIF9feCAqIF9fRW4pIC8gX1RwKF9faiAtIDEpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvLyAgQmFja3dhcmQgcmVjdXJzaW9uIGlzIHN0YWJsZSBvbmx5IGZvciBuID49IHguCisgICAgICAgICAgX19FbiA9IF9UcCgxKTsKKyAgICAgICAgICBjb25zdCBpbnQgX19OID0gX19uICsgMjA7ICAvLyAgVE9ETzogQ2hlY2sgdGhpcyBzdGFydGluZyBudW1iZXIuCisgICAgICAgICAgX1RwIF9fc2F2ZSA9IF9UcCgwKTsKKyAgICAgICAgICBmb3IgKGludCBfX2ogPSBfX047IF9faiA+IDA7IC0tX19qKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX0VuID0gKHN0ZDo6ZXhwKC1fX3gpIC0gX19qICogX19FbikgLyBfX3g7CisgICAgICAgICAgICAgIGlmIChfX2ogPT0gX19uKQorICAgICAgICAgICAgICAgIF9fc2F2ZSA9IF9fRW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfVHAgX19ub3JtID0gX19FbiAvIF9fRTE7CisgICAgICAgICAgICBfX0VuIC89IF9fbm9ybTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gX19FbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIGV4cG9uZW50aWFsIGludGVncmFsIEBmJCBFaSh4KSBAZiQKKyAgICAgKiAgICAgICAgICBieSBzZXJpZXMgc3VtbWF0aW9uLgorICAgICAqIAorICAgICAqICAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsIGlzIGdpdmVuIGJ5CisgICAgICogICAgICAgICAgXGZbCisgICAgICogICAgICAgICAgICBFaSh4KSA9IC1caW50X3steH1eXGluZnR5IFxmcmFje2VedH17dH0gZHQKKyAgICAgKiAgICAgICAgICBcZl0KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIGV4cG9uZW50aWFsIGludGVncmFsIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2V4cGludF9FaV9zZXJpZXMoX1RwIF9feCkKKyAgICB7CisgICAgICBfVHAgX190ZXJtID0gX1RwKDEpOworICAgICAgX1RwIF9fc3VtID0gX1RwKDApOworICAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbWF4X2l0ZXIgPSAxMDAwOworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19pID0gMTsgX19pIDwgX19tYXhfaXRlcjsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBfX3Rlcm0gKj0gX194IC8gX19pOworICAgICAgICAgIF9fc3VtICs9IF9fdGVybSAvIF9faTsKKyAgICAgICAgICBpZiAoX190ZXJtIDwgc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCkgKiBfX3N1bSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fZ2FtbWFfZSgpICsgX19zdW0gKyBzdGQ6OmxvZyhfX3gpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBAZiQgRWkoeCkgQGYkCisgICAgICogICAgICAgICAgYnkgYXN5bXB0b3RpYyBleHBhbnNpb24uCisgICAgICogCisgICAgICogICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgaXMgZ2l2ZW4gYnkKKyAgICAgKiAgICAgICAgICBcZlsKKyAgICAgKiAgICAgICAgICAgIEVpKHgpID0gLVxpbnRfey14fV5caW5mdHkgXGZyYWN7ZV50fXt0fSBkdAorICAgICAqICAgICAgICAgIFxmXQorICAgICAqIAorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBhcmd1bWVudCBvZiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZXhwaW50X0VpX2FzeW1wKF9UcCBfX3gpCisgICAgeworICAgICAgX1RwIF9fdGVybSA9IF9UcCgxKTsKKyAgICAgIF9UcCBfX3N1bSA9IF9UcCgxKTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBfX21heF9pdGVyID0gMTAwMDsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9faSA9IDE7IF9faSA8IF9fbWF4X2l0ZXI7ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fcHJldiA9IF9fdGVybTsKKyAgICAgICAgICBfX3Rlcm0gKj0gX19pIC8gX194OworICAgICAgICAgIGlmIChfX3Rlcm0gPCBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmIChfX3Rlcm0gPj0gX19wcmV2KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgX19zdW0gKz0gX190ZXJtOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBzdGQ6OmV4cChfX3gpICogX19zdW0gLyBfX3g7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIGV4cG9uZW50aWFsIGludGVncmFsIEBmJCBFaSh4KSBAZiQuCisgICAgICogCisgICAgICogICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgaXMgZ2l2ZW4gYnkKKyAgICAgKiAgICAgICAgICBcZlsKKyAgICAgKiAgICAgICAgICAgIEVpKHgpID0gLVxpbnRfey14fV5caW5mdHkgXGZyYWN7ZV50fXt0fSBkdAorICAgICAqICAgICAgICAgIFxmXQorICAgICAqIAorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBhcmd1bWVudCBvZiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZXhwaW50X0VpKF9UcCBfX3gpCisgICAgeworICAgICAgaWYgKF9feCA8IF9UcCgwKSkKKyAgICAgICAgcmV0dXJuIC1fX2V4cGludF9FMSgtX194KTsKKyAgICAgIGVsc2UgaWYgKF9feCA8IC1zdGQ6OmxvZyhzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKSkpCisgICAgICAgIHJldHVybiBfX2V4cGludF9FaV9zZXJpZXMoX194KTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9fZXhwaW50X0VpX2FzeW1wKF9feCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIGV4cG9uZW50aWFsIGludGVncmFsIEBmJCBFXzEoeCkgQGYkLgorICAgICAqIAorICAgICAqICAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsIGlzIGdpdmVuIGJ5CisgICAgICogICAgICAgICAgXGZbCisgICAgICogICAgICAgICAgICBFXzEoeCkgPSBcaW50X3sxfV5caW5mdHkgXGZyYWN7ZV57LXh0fX17dH0gZHQKKyAgICAgKiAgICAgICAgICBcZl0KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIGV4cG9uZW50aWFsIGludGVncmFsIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2V4cGludF9FMShfVHAgX194KQorICAgIHsKKyAgICAgIGlmIChfX3ggPCBfVHAoMCkpCisgICAgICAgIHJldHVybiAtX19leHBpbnRfRWkoLV9feCk7CisgICAgICBlbHNlIGlmIChfX3ggPCBfVHAoMSkpCisgICAgICAgIHJldHVybiBfX2V4cGludF9FMV9zZXJpZXMoX194KTsKKyAgICAgIGVsc2UgaWYgKF9feCA8IF9UcCgxMDApKSAgLy8gIFRPRE86IEZpbmQgYSBnb29kIGFzeW1wdG90aWMgc3dpdGNoIHBvaW50LgorICAgICAgICByZXR1cm4gX19leHBpbnRfRW5fY29udF9mcmFjKDEsIF9feCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfX2V4cGludF9FMV9hc3ltcChfX3gpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBAZiQgRV9uKHgpIEBmJAorICAgICAqICAgICAgICAgIGZvciBsYXJnZSBhcmd1bWVudC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBpcyBnaXZlbiBieQorICAgICAqICAgICAgICAgIFxmWworICAgICAqICAgICAgICAgICAgRV9uKHgpID0gXGludF97MX1eXGluZnR5IFxmcmFje2Veey14dH19e3Rebn0gZHQKKyAgICAgKiAgICAgICAgICBcZl0KKyAgICAgKiAKKyAgICAgKiAgIFRoaXMgaXMgc29tZXRoaW5nIG9mIGFuIGV4dGVuc2lvbi4KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX19uICBUaGUgb3JkZXIgb2YgdGhlIGV4cG9uZW50aWFsIGludGVncmFsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBhcmd1bWVudCBvZiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZXhwaW50X2FzeW1wKHVuc2lnbmVkIGludCBfX24sIF9UcCBfX3gpCisgICAgeworICAgICAgX1RwIF9fdGVybSA9IF9UcCgxKTsKKyAgICAgIF9UcCBfX3N1bSA9IF9UcCgxKTsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9faSA9IDE7IF9faSA8PSBfX247ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fcHJldiA9IF9fdGVybTsKKyAgICAgICAgICBfX3Rlcm0gKj0gLShfX24gLSBfX2kgKyAxKSAvIF9feDsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX190ZXJtKSA+IHN0ZDo6YWJzKF9fcHJldikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBfX3N1bSArPSBfX3Rlcm07CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIHN0ZDo6ZXhwKC1fX3gpICogX19zdW0gLyBfX3g7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIGV4cG9uZW50aWFsIGludGVncmFsIEBmJCBFX24oeCkgQGYkCisgICAgICogICAgICAgICAgZm9yIGxhcmdlIG9yZGVyLgorICAgICAqIAorICAgICAqICAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsIGlzIGdpdmVuIGJ5CisgICAgICogICAgICAgICAgXGZbCisgICAgICogICAgICAgICAgICBFX24oeCkgPSBcaW50X3sxfV5caW5mdHkgXGZyYWN7ZV57LXh0fX17dF5ufSBkdAorICAgICAqICAgICAgICAgIFxmXQorICAgICAqICAgICAgICAKKyAgICAgKiAgIFRoaXMgaXMgc29tZXRoaW5nIG9mIGFuIGV4dGVuc2lvbi4KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX19uICBUaGUgb3JkZXIgb2YgdGhlIGV4cG9uZW50aWFsIGludGVncmFsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBhcmd1bWVudCBvZiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZXhwaW50X2xhcmdlX24odW5zaWduZWQgaW50IF9fbiwgX1RwIF9feCkKKyAgICB7CisgICAgICBjb25zdCBfVHAgX194cG4gPSBfX3ggKyBfX247CisgICAgICBjb25zdCBfVHAgX194cG4yID0gX194cG4gKiBfX3hwbjsKKyAgICAgIF9UcCBfX3Rlcm0gPSBfVHAoMSk7CisgICAgICBfVHAgX19zdW0gPSBfVHAoMSk7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAxOyBfX2kgPD0gX19uOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX3ByZXYgPSBfX3Rlcm07CisgICAgICAgICAgX190ZXJtICo9IChfX24gLSAyICogKF9faSAtIDEpICogX194KSAvIF9feHBuMjsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX190ZXJtKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgX19zdW0gKz0gX190ZXJtOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBzdGQ6OmV4cCgtX194KSAqIF9fc3VtIC8gX194cG47CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIGV4cG9uZW50aWFsIGludGVncmFsIEBmJCBFX24oeCkgQGYkLgorICAgICAqIAorICAgICAqICAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsIGlzIGdpdmVuIGJ5CisgICAgICogICAgICAgICAgXGZbCisgICAgICogICAgICAgICAgICBFX24oeCkgPSBcaW50X3sxfV5caW5mdHkgXGZyYWN7ZV57LXh0fX17dF5ufSBkdAorICAgICAqICAgICAgICAgIFxmXQorICAgICAqICAgVGhpcyBpcyBzb21ldGhpbmcgb2YgYW4gZXh0ZW5zaW9uLgorICAgICAqIAorICAgICAqICAgQHBhcmFtICBfX24gIFRoZSBvcmRlciBvZiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19leHBpbnQodW5zaWduZWQgaW50IF9fbiwgX1RwIF9feCkKKyAgICB7CisgICAgICAvLyAgUmV0dXJuIE5hTiBvbiBOYU4gaW5wdXQuCisgICAgICBpZiAoX19pc25hbihfX3gpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKF9fbiA8PSAxICYmIF9feCA9PSBfVHAoMCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmluZmluaXR5KCk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19FMCA9IHN0ZDo6ZXhwKF9feCkgLyBfX3g7CisgICAgICAgICAgaWYgKF9fbiA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIF9fRTA7CisKKyAgICAgICAgICBfVHAgX19FMSA9IF9fZXhwaW50X0UxKF9feCk7CisgICAgICAgICAgaWYgKF9fbiA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIF9fRTE7CisKKyAgICAgICAgICBpZiAoX194ID09IF9UcCgwKSkKKyAgICAgICAgICAgIHJldHVybiBfVHAoMSkgLyBzdGF0aWNfY2FzdDxfVHA+KF9fbiAtIDEpOworCisgICAgICAgICAgX1RwIF9fRW4gPSBfX2V4cGludF9Fbl9yZWN1cnNpb24oX19uLCBfX3gpOworCisgICAgICAgICAgcmV0dXJuIF9fRW47CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgQGYkIEVpKHgpIEBmJC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBpcyBnaXZlbiBieQorICAgICAqICAgXGZbCisgICAgICogICAgIEVpKHgpID0gLVxpbnRfey14fV5caW5mdHkgXGZyYWN7ZV50fXt0fSBkdAorICAgICAqICAgXGZdCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIF9fZXhwaW50KF9UcCBfX3gpCisgICAgeworICAgICAgaWYgKF9faXNuYW4oX194KSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfX2V4cGludF9FaShfX3gpOworICAgIH0KKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2Ugc3RkOjp0cjE6Ol9fZGV0YWlsCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfRVhQX0lOVEVHUkFMX1RDQwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvZmVudi5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZmJlYWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9mZW52LmgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIGZlbnYuaCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2ZlbnYuaAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9UUjFfRkVOVl9ICisjZGVmaW5lIF9UUjFfRkVOVl9IIDEKKworI2luY2x1ZGUgPHRyMS9jZmVudj4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9mbG9hdC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvZmxvYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTk3NjdjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvZmxvYXQuaApAQCAtMCwwICsxLDM0IEBACisvLyBUUjEgZmxvYXQuaCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2Zsb2F0LmgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfVFIxX0ZMT0FUX0gKKyNkZWZpbmUgX1RSMV9GTE9BVF9IIDEKKworI2luY2x1ZGUgPHRyMS9jZmxvYXQ+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvZnVuY3Rpb25hbCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2Z1bmN0aW9uYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3OWZiZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2Z1bmN0aW9uYWwKQEAgLTAsMCArMSwyMzA4IEBACisvLyBUUjEgZnVuY3Rpb25hbCBoZWFkZXIgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9mdW5jdGlvbmFsCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfRlVOQ1RJT05BTAorI2RlZmluZSBfR0xJQkNYWF9UUjFfRlVOQ1RJT05BTCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfZnVuY3Rpb24uaD4KKworI2luY2x1ZGUgPHR5cGVpbmZvPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDx0cjEvdHVwbGU+CisjaW5jbHVkZSA8dHIxL3R5cGVfdHJhaXRzPgorI2luY2x1ZGUgPGJpdHMvc3RyaW5nZndkLmg+CisjaW5jbHVkZSA8dHIxL2Z1bmN0aW9uYWxfaGFzaC5oPgorI2luY2x1ZGUgPGV4dC90eXBlX3RyYWl0cy5oPgorI2luY2x1ZGUgPGJpdHMvbW92ZS5oPiAvLyBmb3Igc3RkOjpfX2FkZHJlc3NvZgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyMgIGluY2x1ZGUgPHR5cGVfdHJhaXRzPiAvLyBmb3IgaW50ZWdyYWxfY29uc3RhbnQsIHRydWVfdHlwZSwgZmFsc2VfdHlwZQorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisgIHRlbXBsYXRlPGludD4gc3RydWN0IF9QbGFjZWhvbGRlcjsKKyAgdGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzIF9CaW5kOworICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CaW5kX3Jlc3VsdDsKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorI2VuZGlmCisKK25hbWVzcGFjZSB0cjEKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01lbWJlclBvaW50ZXI+CisgICAgY2xhc3MgX01lbV9mbjsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ2xhc3M+CisgICAgX01lbV9mbjxfVHAgX0NsYXNzOjoqPgorICAgIG1lbV9mbihfVHAgX0NsYXNzOjoqKTsKKworICAvKioKKyAgICogIEFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiBfSGFzX3Jlc3VsdF90eXBlLCB3aGljaCB1c2VzIFNGSU5BRSB0bworICAgKiAgZGV0ZXJtaW5lIGlmIHRoZSB0eXBlIF9UcCBoYXMgYSBwdWJsaWNseS1hY2Nlc3NpYmxlIG1lbWJlciB0eXBlCisgICAqICByZXN1bHRfdHlwZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIF9IYXNfcmVzdWx0X3R5cGVfaGVscGVyIDogX19zZmluYWVfdHlwZXMKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIHN0cnVjdCBfV3JhcF90eXBlCisJeyB9OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIHN0YXRpYyBfX29uZSBfX3Rlc3QoX1dyYXBfdHlwZTx0eXBlbmFtZSBfVXA6OnJlc3VsdF90eXBlPiopOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIHN0YXRpYyBfX3R3byBfX3Rlc3QoLi4uKTsKKworICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gc2l6ZW9mKF9fdGVzdDxfVHA+KDApKSA9PSAxOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfSGFzX3Jlc3VsdF90eXBlCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorCSAgICAgIF9IYXNfcmVzdWx0X3R5cGVfaGVscGVyPHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPjo6dmFsdWU+CisgICAgeyB9OworCisgIC8qKgorICAgKiAgCisgICovCisgIC8vLyBJZiB3ZSBoYXZlIGZvdW5kIGEgcmVzdWx0X3R5cGUsIGV4dHJhY3QgaXQuCisgIHRlbXBsYXRlPGJvb2wgX0hhc19yZXN1bHRfdHlwZSwgdHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgc3RydWN0IF9NYXliZV9nZXRfcmVzdWx0X3R5cGUKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgc3RydWN0IF9NYXliZV9nZXRfcmVzdWx0X3R5cGU8dHJ1ZSwgX0Z1bmN0b3I+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRnVuY3Rvcjo6cmVzdWx0X3R5cGUgcmVzdWx0X3R5cGU7CisgICAgfTsKKworICAvKioKKyAgICogIEJhc2UgY2xhc3MgZm9yIGFueSBmdW5jdGlvbiBvYmplY3QgdGhhdCBoYXMgYSB3ZWFrIHJlc3VsdCB0eXBlLCBhcworICAgKiAgZGVmaW5lZCBpbiAzLjMvMyBvZiBUUjEuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsCisgICAgOiBfTWF5YmVfZ2V0X3Jlc3VsdF90eXBlPF9IYXNfcmVzdWx0X3R5cGU8X0Z1bmN0b3I+Ojp2YWx1ZSwgX0Z1bmN0b3I+CisgICAgeworICAgIH07CisKKyAgLy8vIFJldHJpZXZlIHRoZSByZXN1bHQgdHlwZSBmb3IgYSBmdW5jdGlvbiB0eXBlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+IAorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMoX0FyZ1R5cGVzLi4uKT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7CisgICAgfTsKKworICAvLy8gUmV0cmlldmUgdGhlIHJlc3VsdCB0eXBlIGZvciBhIGZ1bmN0aW9uIHJlZmVyZW5jZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPiAKKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzKCYpKF9BcmdUeXBlcy4uLik+CisgICAgeworICAgICAgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOworICAgIH07CisKKyAgLy8vIFJldHJpZXZlIHRoZSByZXN1bHQgdHlwZSBmb3IgYSBmdW5jdGlvbiBwb2ludGVyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+IAorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMoKikoX0FyZ1R5cGVzLi4uKT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7CisgICAgfTsKKworICAvLy8gUmV0cmlldmUgcmVzdWx0IHR5cGUgZm9yIGEgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIuIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4gCisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyAoX0NsYXNzOjoqKShfQXJnVHlwZXMuLi4pPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIC8vLyBSZXRyaWV2ZSByZXN1bHQgdHlwZSBmb3IgYSBjb25zdCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlci4gCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPiAKKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzIChfQ2xhc3M6OiopKF9BcmdUeXBlcy4uLikgY29uc3Q+CisgICAgeworICAgICAgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOworICAgIH07CisKKyAgLy8vIFJldHJpZXZlIHJlc3VsdCB0eXBlIGZvciBhIHZvbGF0aWxlIG1lbWJlciBmdW5jdGlvbiBwb2ludGVyLiAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+IAorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uKSB2b2xhdGlsZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7CisgICAgfTsKKworICAvLy8gUmV0cmlldmUgcmVzdWx0IHR5cGUgZm9yIGEgY29uc3Qgdm9sYXRpbGUgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIuIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4gCisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyAoX0NsYXNzOjoqKShfQXJnVHlwZXMuLi4pY29uc3Qgdm9sYXRpbGU+CisgICAgeworICAgICAgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOworICAgIH07CisKKyAgLyoqCisgICAqICBTdHJpcCB0b3AtbGV2ZWwgY3YtcXVhbGlmaWVycyBmcm9tIHRoZSBmdW5jdGlvbiBvYmplY3QgYW5kIGxldAorICAgKiAgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbCBwZXJmb3JtIHRoZSByZWFsIHdvcmsuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZQorICAgIDogX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDx0eXBlbmFtZSByZW1vdmVfY3Y8X0Z1bmN0b3I+Ojp0eXBlPgorICAgIHsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgY2xhc3MgcmVzdWx0X29mOworCisgIC8qKgorICAgKiAgQWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHJlc3VsdF9vZi4gV2hlbiBfSGFzX3Jlc3VsdF90eXBlIGlzCisgICAqICB0cnVlLCBnZXRzIGl0cyByZXN1bHQgZnJvbSBfV2Vha19yZXN1bHRfdHlwZS4gT3RoZXJ3aXNlLCB1c2VzCisgICAqICB0aGUgZnVuY3Rpb24gb2JqZWN0J3MgbWVtYmVyIHRlbXBsYXRlIHJlc3VsdCB0byBleHRyYWN0IHRoZQorICAgKiAgcmVzdWx0IHR5cGUuCisgICovCisgIHRlbXBsYXRlPGJvb2wgX0hhc19yZXN1bHRfdHlwZSwgdHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgX1Jlc3VsdF9vZl9pbXBsOworCisgIC8vIEhhbmRsZSBtZW1iZXIgZGF0YSBwb2ludGVycyB1c2luZyBfTWVtX2ZuJ3MgbG9naWMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZSBfVDE+CisgICAgc3RydWN0IF9SZXN1bHRfb2ZfaW1wbDxmYWxzZSwgX1JlcyBfQ2xhc3M6OiooX1QxKT4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9NZW1fZm48X1JlcyBfQ2xhc3M6Oio+CisgICAgICAgICAgICAgICAgOjp0ZW1wbGF0ZSBfUmVzdWx0X3R5cGU8X1QxPjo6dHlwZSB0eXBlOworICAgIH07CisKKyAgLyoqCisgICAqIERldGVybWluZSB3aGV0aGVyIHdlIGNhbiBkZXRlcm1pbmUgYSByZXN1bHQgdHlwZSBmcm9tIEBjIEZ1bmN0b3IgCisgICAqIGFsb25lLgorICAgKi8gCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY2xhc3MgcmVzdWx0X29mPF9GdW5jdG9yKF9BcmdUeXBlcy4uLik+CisgICAgOiBwdWJsaWMgX1Jlc3VsdF9vZl9pbXBsPAorICAgICAgICAgICAgICAgX0hhc19yZXN1bHRfdHlwZTxfV2Vha19yZXN1bHRfdHlwZTxfRnVuY3Rvcj4gPjo6dmFsdWUsCisgICAgICAgICAgICAgICBfRnVuY3RvcihfQXJnVHlwZXMuLi4pPgorICAgIHsKKyAgICB9OworCisgIC8vLyBXZSBhbHJlYWR5IGtub3cgdGhlIHJlc3VsdCB0eXBlIGZvciBAYyBGdW5jdG9yOyB1c2UgaXQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9SZXN1bHRfb2ZfaW1wbDx0cnVlLCBfRnVuY3RvcihfQXJnVHlwZXMuLi4pPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1dlYWtfcmVzdWx0X3R5cGU8X0Z1bmN0b3I+OjpyZXN1bHRfdHlwZSB0eXBlOworICAgIH07CisKKyAgLyoqCisgICAqIFdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgcmVzdWx0IHR5cGUgZm9yIHRoaXMgaW52b2NhdGlvbiB0aGUgaGFyZCAKKyAgICogd2F5LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1Jlc3VsdF9vZl9pbXBsPGZhbHNlLCBfRnVuY3RvcihfQXJnVHlwZXMuLi4pPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Z1bmN0b3IKKyAgICAgICAgICAgICAgICA6OnRlbXBsYXRlIHJlc3VsdDxfRnVuY3RvcihfQXJnVHlwZXMuLi4pPjo6dHlwZSB0eXBlOworICAgIH07CisKKyAgLyoqCisgICAqIEl0IGlzIHVuc2FmZSB0byBhY2Nlc3MgOjpyZXN1bHQgd2hlbiB0aGVyZSBhcmUgemVybyBhcmd1bWVudHMsIHNvIHdlIAorICAgKiByZXR1cm4gQGMgdm9pZCBpbnN0ZWFkLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgc3RydWN0IF9SZXN1bHRfb2ZfaW1wbDxmYWxzZSwgX0Z1bmN0b3IoKT4KKyAgICB7CisgICAgICB0eXBlZGVmIHZvaWQgdHlwZTsKKyAgICB9OworCisgIC8vLyBEZXRlcm1pbmVzIGlmIHRoZSB0eXBlIF9UcCBkZXJpdmVzIGZyb20gdW5hcnlfZnVuY3Rpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0Rlcml2ZXNfZnJvbV91bmFyeV9mdW5jdGlvbiA6IF9fc2ZpbmFlX3R5cGVzCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9SZXM+CisgICAgICAgIHN0YXRpYyBfX29uZSBfX3Rlc3QoY29uc3Qgdm9sYXRpbGUgdW5hcnlfZnVuY3Rpb248X1QxLCBfUmVzPiopOworCisgICAgICAvLyBJdCdzIHRlbXB0aW5nIHRvIGNoYW5nZSAiLi4uIiB0byBjb25zdCB2b2xhdGlsZSB2b2lkKiwgYnV0CisgICAgICAvLyB0aGF0IGZhaWxzIHdoZW4gX1RwIGlzIGEgZnVuY3Rpb24gdHlwZS4KKyAgICAgIHN0YXRpYyBfX3R3byBfX3Rlc3QoLi4uKTsKKworICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gc2l6ZW9mKF9fdGVzdCgoX1RwKikwKSkgPT0gMTsKKyAgICB9OworCisgIC8vLyBEZXRlcm1pbmVzIGlmIHRoZSB0eXBlIF9UcCBkZXJpdmVzIGZyb20gYmluYXJ5X2Z1bmN0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9EZXJpdmVzX2Zyb21fYmluYXJ5X2Z1bmN0aW9uIDogX19zZmluYWVfdHlwZXMKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyLCB0eXBlbmFtZSBfUmVzPgorICAgICAgICBzdGF0aWMgX19vbmUgX190ZXN0KGNvbnN0IHZvbGF0aWxlIGJpbmFyeV9mdW5jdGlvbjxfVDEsIF9UMiwgX1Jlcz4qKTsKKworICAgICAgLy8gSXQncyB0ZW1wdGluZyB0byBjaGFuZ2UgIi4uLiIgdG8gY29uc3Qgdm9sYXRpbGUgdm9pZCosIGJ1dAorICAgICAgLy8gdGhhdCBmYWlscyB3aGVuIF9UcCBpcyBhIGZ1bmN0aW9uIHR5cGUuCisgICAgICBzdGF0aWMgX190d28gX190ZXN0KC4uLik7CisKKyAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHNpemVvZihfX3Rlc3QoKF9UcCopMCkpID09IDE7CisgICAgfTsKKworICAvLy8gVHVybnMgYSBmdW5jdGlvbiB0eXBlIGludG8gYSBmdW5jdGlvbiBwb2ludGVyIHR5cGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBib29sIF9Jc0Z1bmN0aW9uVHlwZSA9IGlzX2Z1bmN0aW9uPF9UcD46OnZhbHVlPgorICAgIHN0cnVjdCBfRnVuY3Rpb25fdG9fZnVuY3Rpb25fcG9pbnRlcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwIHR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9GdW5jdGlvbl90b19mdW5jdGlvbl9wb2ludGVyPF9UcCwgdHJ1ZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9UcCogdHlwZTsKKyAgICB9OworCisgIC8qKgorICAgKiBJbnZva2UgYSBmdW5jdGlvbiBvYmplY3QsIHdoaWNoIG1heSBiZSBlaXRoZXIgYSBtZW1iZXIgcG9pbnRlciBvciBhCisgICAqIGZ1bmN0aW9uIG9iamVjdC4gVGhlIGZpcnN0IHBhcmFtZXRlciB3aWxsIHRlbGwgd2hpY2guCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgaW5saW5lCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjwKKyAgICAgICAgICAgICAoIWlzX21lbWJlcl9wb2ludGVyPF9GdW5jdG9yPjo6dmFsdWUKKyAgICAgICAgICAgICAgJiYgIWlzX2Z1bmN0aW9uPF9GdW5jdG9yPjo6dmFsdWUKKyAgICAgICAgICAgICAgJiYgIWlzX2Z1bmN0aW9uPHR5cGVuYW1lIHJlbW92ZV9wb2ludGVyPF9GdW5jdG9yPjo6dHlwZT46OnZhbHVlKSwKKyAgICAgICAgICAgICB0eXBlbmFtZSByZXN1bHRfb2Y8X0Z1bmN0b3IoX0FyZ3MuLi4pPjo6dHlwZQorICAgICAgICAgICA+OjpfX3R5cGUKKyAgICBfX2ludm9rZShfRnVuY3RvciYgX19mLCBfQXJncyYuLi4gX19hcmdzKQorICAgIHsKKyAgICAgIHJldHVybiBfX2YoX19hcmdzLi4uKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGlubGluZQorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8CisgICAgICAgICAgICAgKGlzX21lbWJlcl9wb2ludGVyPF9GdW5jdG9yPjo6dmFsdWUKKyAgICAgICAgICAgICAgJiYgIWlzX2Z1bmN0aW9uPF9GdW5jdG9yPjo6dmFsdWUKKyAgICAgICAgICAgICAgJiYgIWlzX2Z1bmN0aW9uPHR5cGVuYW1lIHJlbW92ZV9wb2ludGVyPF9GdW5jdG9yPjo6dHlwZT46OnZhbHVlKSwKKyAgICAgICAgICAgICB0eXBlbmFtZSByZXN1bHRfb2Y8X0Z1bmN0b3IoX0FyZ3MuLi4pPjo6dHlwZQorICAgICAgICAgICA+OjpfX3R5cGUKKyAgICBfX2ludm9rZShfRnVuY3RvciYgX19mLCBfQXJncyYuLi4gX19hcmdzKQorICAgIHsKKyAgICAgIHJldHVybiBtZW1fZm4oX19mKShfX2FyZ3MuLi4pOworICAgIH0KKworICAvLyBUbyBwaWNrIHVwIGZ1bmN0aW9uIHJlZmVyZW5jZXMgKHRoYXQgd2lsbCBiZWNvbWUgZnVuY3Rpb24gcG9pbnRlcnMpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBpbmxpbmUKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPAorICAgICAgICAgICAgIChpc19wb2ludGVyPF9GdW5jdG9yPjo6dmFsdWUKKyAgICAgICAgICAgICAgJiYgaXNfZnVuY3Rpb248dHlwZW5hbWUgcmVtb3ZlX3BvaW50ZXI8X0Z1bmN0b3I+Ojp0eXBlPjo6dmFsdWUpLAorICAgICAgICAgICAgIHR5cGVuYW1lIHJlc3VsdF9vZjxfRnVuY3RvcihfQXJncy4uLik+Ojp0eXBlCisgICAgICAgICAgID46Ol9fdHlwZQorICAgIF9faW52b2tlKF9GdW5jdG9yIF9fZiwgX0FyZ3MmLi4uIF9fYXJncykKKyAgICB7CisgICAgICByZXR1cm4gX19mKF9fYXJncy4uLik7CisgICAgfQorCisgIC8qKgorICAgKiAgS25vd2luZyB3aGljaCBvZiB1bmFyeV9mdW5jdGlvbiBhbmQgYmluYXJ5X2Z1bmN0aW9uIF9UcCBkZXJpdmVzCisgICAqICBmcm9tLCBkZXJpdmVzIGZyb20gdGhlIHNhbWUgYW5kIGVuc3VyZXMgdGhhdCByZWZlcmVuY2Vfd3JhcHBlcgorICAgKiAgd2lsbCBoYXZlIGEgd2VhayByZXN1bHQgdHlwZS4gU2VlIGNhc2VzIGJlbG93LgorICAgKi8KKyAgdGVtcGxhdGU8Ym9vbCBfVW5hcnksIGJvb2wgX0JpbmFyeSwgdHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZV9pbXBsOworCisgIC8vIE5vdCBhIHVuYXJ5X2Z1bmN0aW9uIG9yIGJpbmFyeV9mdW5jdGlvbiwgc28gdHJ5IGEgd2VhayByZXN1bHQgdHlwZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZV9pbXBsPGZhbHNlLCBmYWxzZSwgX1RwPgorICAgIDogX1dlYWtfcmVzdWx0X3R5cGU8X1RwPgorICAgIHsgfTsKKworICAvLyB1bmFyeV9mdW5jdGlvbiBidXQgbm90IGJpbmFyeV9mdW5jdGlvbgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlX2ltcGw8dHJ1ZSwgZmFsc2UsIF9UcD4KKyAgICA6IHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9UcDo6YXJndW1lbnRfdHlwZSwKKwkJICAgICB0eXBlbmFtZSBfVHA6OnJlc3VsdF90eXBlPgorICAgIHsgfTsKKworICAvLyBiaW5hcnlfZnVuY3Rpb24gYnV0IG5vdCB1bmFyeV9mdW5jdGlvbgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlX2ltcGw8ZmFsc2UsIHRydWUsIF9UcD4KKyAgICA6IGJpbmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfVHA6OmZpcnN0X2FyZ3VtZW50X3R5cGUsCisJCSAgICAgIHR5cGVuYW1lIF9UcDo6c2Vjb25kX2FyZ3VtZW50X3R5cGUsCisJCSAgICAgIHR5cGVuYW1lIF9UcDo6cmVzdWx0X3R5cGU+CisgICAgeyB9OworCisgIC8vIEJvdGggdW5hcnlfZnVuY3Rpb24gYW5kIGJpbmFyeV9mdW5jdGlvbi4gSW1wb3J0IHJlc3VsdF90eXBlIHRvCisgIC8vIGF2b2lkIGNvbmZsaWN0cy4KKyAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2VfaW1wbDx0cnVlLCB0cnVlLCBfVHA+CisgICAgOiB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfVHA6OmFyZ3VtZW50X3R5cGUsCisJCSAgICAgdHlwZW5hbWUgX1RwOjpyZXN1bHRfdHlwZT4sCisgICAgICBiaW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX1RwOjpmaXJzdF9hcmd1bWVudF90eXBlLAorCQkgICAgICB0eXBlbmFtZSBfVHA6OnNlY29uZF9hcmd1bWVudF90eXBlLAorCQkgICAgICB0eXBlbmFtZSBfVHA6OnJlc3VsdF90eXBlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RwOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIC8qKgorICAgKiAgRGVyaXZlcyBmcm9tIHVuYXJ5X2Z1bmN0aW9uIG9yIGJpbmFyeV9mdW5jdGlvbiB3aGVuIGl0CisgICAqICBjYW4uIFNwZWNpYWxpemF0aW9ucyBoYW5kbGUgYWxsIG9mIHRoZSBlYXN5IGNhc2VzLiBUaGUgcHJpbWFyeQorICAgKiAgdGVtcGxhdGUgZGV0ZXJtaW5lcyB3aGF0IHRvIGRvIHdpdGggYSBjbGFzcyB0eXBlLCB3aGljaCBtYXkKKyAgICogIGRlcml2ZSBmcm9tIGJvdGggdW5hcnlfZnVuY3Rpb24gYW5kIGJpbmFyeV9mdW5jdGlvbi4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZQorICAgIDogX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2VfaW1wbDwKKyAgICAgIF9EZXJpdmVzX2Zyb21fdW5hcnlfZnVuY3Rpb248X1RwPjo6dmFsdWUsCisgICAgICBfRGVyaXZlc19mcm9tX2JpbmFyeV9mdW5jdGlvbjxfVHA+Ojp2YWx1ZSwKKyAgICAgIF9UcD4KKyAgICB7IH07CisKKyAgLy8gLSBhIGZ1bmN0aW9uIHR5cGUgKHVuYXJ5KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDE+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMoX1QxKT4KKyAgICA6IHVuYXJ5X2Z1bmN0aW9uPF9UMSwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8gLSBhIGZ1bmN0aW9uIHR5cGUgKGJpbmFyeSkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMoX1QxLCBfVDIpPgorICAgIDogYmluYXJ5X2Z1bmN0aW9uPF9UMSwgX1QyLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgZnVuY3Rpb24gcG9pbnRlciB0eXBlICh1bmFyeSkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzKCopKF9UMSk+CisgICAgOiB1bmFyeV9mdW5jdGlvbjxfVDEsIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBmdW5jdGlvbiBwb2ludGVyIHR5cGUgKGJpbmFyeSkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMoKikoX1QxLCBfVDIpPgorICAgIDogYmluYXJ5X2Z1bmN0aW9uPF9UMSwgX1QyLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gdHlwZSAodW5hcnksIG5vIHF1YWxpZmllcnMpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMT4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyAoX1QxOjoqKSgpPgorICAgIDogdW5hcnlfZnVuY3Rpb248X1QxKiwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8gLSBhIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIHR5cGUgKGJpbmFyeSwgbm8gcXVhbGlmaWVycykKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMgKF9UMTo6KikoX1QyKT4KKyAgICA6IGJpbmFyeV9mdW5jdGlvbjxfVDEqLCBfVDIsIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiB0eXBlICh1bmFyeSwgY29uc3QpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMT4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyAoX1QxOjoqKSgpIGNvbnN0PgorICAgIDogdW5hcnlfZnVuY3Rpb248Y29uc3QgX1QxKiwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8gLSBhIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIHR5cGUgKGJpbmFyeSwgY29uc3QpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzIChfVDE6OiopKF9UMikgY29uc3Q+CisgICAgOiBiaW5hcnlfZnVuY3Rpb248Y29uc3QgX1QxKiwgX1QyLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gdHlwZSAodW5hcnksIHZvbGF0aWxlKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDE+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMgKF9UMTo6KikoKSB2b2xhdGlsZT4KKyAgICA6IHVuYXJ5X2Z1bmN0aW9uPHZvbGF0aWxlIF9UMSosIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiB0eXBlIChiaW5hcnksIHZvbGF0aWxlKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyAoX1QxOjoqKShfVDIpIHZvbGF0aWxlPgorICAgIDogYmluYXJ5X2Z1bmN0aW9uPHZvbGF0aWxlIF9UMSosIF9UMiwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8gLSBhIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIHR5cGUgKHVuYXJ5LCBjb25zdCB2b2xhdGlsZSkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzIChfVDE6OiopKCkgY29uc3Qgdm9sYXRpbGU+CisgICAgOiB1bmFyeV9mdW5jdGlvbjxjb25zdCB2b2xhdGlsZSBfVDEqLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gdHlwZSAoYmluYXJ5LCBjb25zdCB2b2xhdGlsZSkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMgKF9UMTo6KikoX1QyKSBjb25zdCB2b2xhdGlsZT4KKyAgICA6IGJpbmFyeV9mdW5jdGlvbjxjb25zdCB2b2xhdGlsZSBfVDEqLCBfVDIsIF9SZXM+CisgICAgeyB9OworCisgIC8vLyByZWZlcmVuY2Vfd3JhcHBlcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgcmVmZXJlbmNlX3dyYXBwZXIKKyAgICA6IHB1YmxpYyBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTx0eXBlbmFtZSByZW1vdmVfY3Y8X1RwPjo6dHlwZT4KKyAgICB7CisgICAgICAvLyBJZiBfVHAgaXMgYSBmdW5jdGlvbiB0eXBlLCB3ZSBjYW4ndCBmb3JtIHJlc3VsdF9vZjxfVHAoLi4uKT4sCisgICAgICAvLyBzbyB0dXJuIGl0IGludG8gYSBmdW5jdGlvbiBwb2ludGVyIHR5cGUuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9GdW5jdGlvbl90b19mdW5jdGlvbl9wb2ludGVyPF9UcD46OnR5cGUKKyAgICAgICAgX01fZnVuY190eXBlOworCisgICAgICBfVHAqIF9NX2RhdGE7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHAgdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHJlZmVyZW5jZV93cmFwcGVyKF9UcCYgX19pbmRhdGEpCisgICAgICA6IF9NX2RhdGEoc3RkOjpfX2FkZHJlc3NvZihfX2luZGF0YSkpCisgICAgICB7IH0KKworICAgICAgcmVmZXJlbmNlX3dyYXBwZXIoY29uc3QgcmVmZXJlbmNlX3dyYXBwZXI8X1RwPiYgX19pbnJlZik6CisgICAgICBfTV9kYXRhKF9faW5yZWYuX01fZGF0YSkKKyAgICAgIHsgfQorCisgICAgICByZWZlcmVuY2Vfd3JhcHBlciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCByZWZlcmVuY2Vfd3JhcHBlcjxfVHA+JiBfX2lucmVmKQorICAgICAgeworICAgICAgICBfTV9kYXRhID0gX19pbnJlZi5fTV9kYXRhOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIG9wZXJhdG9yIF9UcCYoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+Z2V0KCk7IH0KKworICAgICAgX1RwJgorICAgICAgZ2V0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpfTV9kYXRhOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB0eXBlbmFtZSByZXN1bHRfb2Y8X01fZnVuY190eXBlKF9BcmdzLi4uKT46OnR5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfQXJncyYuLi4gX19hcmdzKSBjb25zdAorICAgICAgICB7CisJICByZXR1cm4gX19pbnZva2UoZ2V0KCksIF9fYXJncy4uLik7CisJfQorICAgIH07CisKKworICAvLyBEZW5vdGVzIGEgcmVmZXJlbmNlIHNob3VsZCBiZSB0YWtlbiB0byBhIHZhcmlhYmxlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHJlZmVyZW5jZV93cmFwcGVyPF9UcD4KKyAgICByZWYoX1RwJiBfX3QpCisgICAgeyByZXR1cm4gcmVmZXJlbmNlX3dyYXBwZXI8X1RwPihfX3QpOyB9CisKKyAgLy8gRGVub3RlcyBhIGNvbnN0IHJlZmVyZW5jZSBzaG91bGQgYmUgdGFrZW4gdG8gYSB2YXJpYWJsZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSByZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCBfVHA+CisgICAgY3JlZihjb25zdCBfVHAmIF9fdCkKKyAgICB7IHJldHVybiByZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCBfVHA+KF9fdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHJlZmVyZW5jZV93cmFwcGVyPF9UcD4KKyAgICByZWYocmVmZXJlbmNlX3dyYXBwZXI8X1RwPiBfX3QpCisgICAgeyByZXR1cm4gcmVmKF9fdC5nZXQoKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHJlZmVyZW5jZV93cmFwcGVyPGNvbnN0IF9UcD4KKyAgICBjcmVmKHJlZmVyZW5jZV93cmFwcGVyPF9UcD4gX190KQorICAgIHsgcmV0dXJuIGNyZWYoX190LmdldCgpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgYm9vbD4KKyAgICBzdHJ1Y3QgX01lbV9mbl9jb25zdF9vcl9ub24KKyAgICB7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCYgdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX01lbV9mbl9jb25zdF9vcl9ub248X1RwLCBmYWxzZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9UcCYgdHlwZTsKKyAgICB9OworCisgIC8qKgorICAgKiBEZXJpdmVzIGZyb20gQGMgdW5hcnlfZnVuY3Rpb24gb3IgQGMgYmluYXJ5X2Z1bmN0aW9uLCBvciBwZXJoYXBzCisgICAqIG5vdGhpbmcsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBwcm92aWRlZC4gVGhlCisgICAqIHByaW1hcnkgdGVtcGxhdGUgaXMgdGhlIGJhc2lzIGNhc2UsIHdoaWNoIGRlcml2ZXMgbm90aGluZy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4gCisgICAgc3RydWN0IF9NYXliZV91bmFyeV9vcl9iaW5hcnlfZnVuY3Rpb24geyB9OworCisgIC8vLyBEZXJpdmVzIGZyb20gQGMgdW5hcnlfZnVuY3Rpb24sIGFzIGFwcHJvcHJpYXRlLiAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxPiAKKyAgICBzdHJ1Y3QgX01heWJlX3VuYXJ5X29yX2JpbmFyeV9mdW5jdGlvbjxfUmVzLCBfVDE+CisgICAgOiBzdGQ6OnVuYXJ5X2Z1bmN0aW9uPF9UMSwgX1Jlcz4geyB9OworCisgIC8vLyBEZXJpdmVzIGZyb20gQGMgYmluYXJ5X2Z1bmN0aW9uLCBhcyBhcHByb3ByaWF0ZS4gCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPiAKKyAgICBzdHJ1Y3QgX01heWJlX3VuYXJ5X29yX2JpbmFyeV9mdW5jdGlvbjxfUmVzLCBfVDEsIF9UMj4KKyAgICA6IHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPF9UMSwgX1QyLCBfUmVzPiB7IH07CisKKyAgLy8vIEltcGxlbWVudGF0aW9uIG9mIEBjIG1lbV9mbiBmb3IgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfTWVtX2ZuPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uKT4KKyAgICA6IHB1YmxpYyBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uPF9SZXMsIF9DbGFzcyosIF9BcmdUeXBlcy4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgKF9DbGFzczo6Kl9GdW5jdG9yKShfQXJnVHlwZXMuLi4pOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIF9SZXMKKyAgICAgICAgX01fY2FsbChfVHAmIF9fb2JqZWN0LCBjb25zdCB2b2xhdGlsZSBfQ2xhc3MgKiwgCisgICAgICAgICAgICAgICAgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgICAgeyByZXR1cm4gKF9fb2JqZWN0LipfX3BtZikoX19hcmdzLi4uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIF9SZXMKKyAgICAgICAgX01fY2FsbChfVHAmIF9fcHRyLCBjb25zdCB2b2xhdGlsZSB2b2lkICosIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuICgoKl9fcHRyKS4qX19wbWYpKF9fYXJncy4uLik7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsKKworICAgICAgZXhwbGljaXQgX01lbV9mbihfRnVuY3RvciBfX3BtZikgOiBfX3BtZihfX3BtZikgeyB9CisKKyAgICAgIC8vIEhhbmRsZSBvYmplY3RzCisgICAgICBfUmVzCisgICAgICBvcGVyYXRvcigpKF9DbGFzcyYgX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICB7IHJldHVybiAoX19vYmplY3QuKl9fcG1mKShfX2FyZ3MuLi4pOyB9CisKKyAgICAgIC8vIEhhbmRsZSBwb2ludGVycworICAgICAgX1JlcworICAgICAgb3BlcmF0b3IoKShfQ2xhc3MqIF9fb2JqZWN0LCBfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorICAgICAgeyByZXR1cm4gKF9fb2JqZWN0LT4qX19wbWYpKF9fYXJncy4uLik7IH0KKworICAgICAgLy8gSGFuZGxlIHNtYXJ0IHBvaW50ZXJzLCByZWZlcmVuY2VzIGFuZCBwb2ludGVycyB0byBkZXJpdmVkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIF9SZXMKKwlvcGVyYXRvcigpKF9UcCYgX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIF9NX2NhbGwoX19vYmplY3QsICZfX29iamVjdCwgX19hcmdzLi4uKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9GdW5jdG9yIF9fcG1mOworICAgIH07CisKKyAgLy8vIEltcGxlbWVudGF0aW9uIG9mIEBjIG1lbV9mbiBmb3IgY29uc3QgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfTWVtX2ZuPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uKSBjb25zdD4KKyAgICA6IHB1YmxpYyBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uPF9SZXMsIGNvbnN0IF9DbGFzcyosIAorCQkJCQkgICAgIF9BcmdUeXBlcy4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgKF9DbGFzczo6Kl9GdW5jdG9yKShfQXJnVHlwZXMuLi4pIGNvbnN0OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIF9SZXMKKyAgICAgICAgX01fY2FsbChfVHAmIF9fb2JqZWN0LCBjb25zdCB2b2xhdGlsZSBfQ2xhc3MgKiwgCisgICAgICAgICAgICAgICAgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgICAgeyByZXR1cm4gKF9fb2JqZWN0LipfX3BtZikoX19hcmdzLi4uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIF9SZXMKKyAgICAgICAgX01fY2FsbChfVHAmIF9fcHRyLCBjb25zdCB2b2xhdGlsZSB2b2lkICosIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuICgoKl9fcHRyKS4qX19wbWYpKF9fYXJncy4uLik7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsKKworICAgICAgZXhwbGljaXQgX01lbV9mbihfRnVuY3RvciBfX3BtZikgOiBfX3BtZihfX3BtZikgeyB9CisKKyAgICAgIC8vIEhhbmRsZSBvYmplY3RzCisgICAgICBfUmVzCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9DbGFzcyYgX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICB7IHJldHVybiAoX19vYmplY3QuKl9fcG1mKShfX2FyZ3MuLi4pOyB9CisKKyAgICAgIC8vIEhhbmRsZSBwb2ludGVycworICAgICAgX1JlcworICAgICAgb3BlcmF0b3IoKShjb25zdCBfQ2xhc3MqIF9fb2JqZWN0LCBfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorICAgICAgeyByZXR1cm4gKF9fb2JqZWN0LT4qX19wbWYpKF9fYXJncy4uLik7IH0KKworICAgICAgLy8gSGFuZGxlIHNtYXJ0IHBvaW50ZXJzLCByZWZlcmVuY2VzIGFuZCBwb2ludGVycyB0byBkZXJpdmVkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIF9SZXMgb3BlcmF0b3IoKShfVHAmIF9fb2JqZWN0LCBfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorICAgICAgICB7IHJldHVybiBfTV9jYWxsKF9fb2JqZWN0LCAmX19vYmplY3QsIF9fYXJncy4uLik7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfRnVuY3RvciBfX3BtZjsKKyAgICB9OworCisgIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiBAYyBtZW1fZm4gZm9yIHZvbGF0aWxlIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY2xhc3MgX01lbV9mbjxfUmVzIChfQ2xhc3M6OiopKF9BcmdUeXBlcy4uLikgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgX01heWJlX3VuYXJ5X29yX2JpbmFyeV9mdW5jdGlvbjxfUmVzLCB2b2xhdGlsZSBfQ2xhc3MqLCAKKwkJCQkJICAgICBfQXJnVHlwZXMuLi4+CisgICAgeworICAgICAgdHlwZWRlZiBfUmVzIChfQ2xhc3M6OipfRnVuY3RvcikoX0FyZ1R5cGVzLi4uKSB2b2xhdGlsZTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBfUmVzCisgICAgICAgIF9NX2NhbGwoX1RwJiBfX29iamVjdCwgY29uc3Qgdm9sYXRpbGUgX0NsYXNzICosIAorICAgICAgICAgICAgICAgIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIChfX29iamVjdC4qX19wbWYpKF9fYXJncy4uLik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBfUmVzCisgICAgICAgIF9NX2NhbGwoX1RwJiBfX3B0ciwgY29uc3Qgdm9sYXRpbGUgdm9pZCAqLCBfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorICAgICAgICB7IHJldHVybiAoKCpfX3B0cikuKl9fcG1mKShfX2FyZ3MuLi4pOyB9CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7CisKKyAgICAgIGV4cGxpY2l0IF9NZW1fZm4oX0Z1bmN0b3IgX19wbWYpIDogX19wbWYoX19wbWYpIHsgfQorCisgICAgICAvLyBIYW5kbGUgb2JqZWN0cworICAgICAgX1JlcworICAgICAgb3BlcmF0b3IoKSh2b2xhdGlsZSBfQ2xhc3MmIF9fb2JqZWN0LCBfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorICAgICAgeyByZXR1cm4gKF9fb2JqZWN0LipfX3BtZikoX19hcmdzLi4uKTsgfQorCisgICAgICAvLyBIYW5kbGUgcG9pbnRlcnMKKyAgICAgIF9SZXMKKyAgICAgIG9wZXJhdG9yKCkodm9sYXRpbGUgX0NsYXNzKiBfX29iamVjdCwgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfX29iamVjdC0+Kl9fcG1mKShfX2FyZ3MuLi4pOyB9CisKKyAgICAgIC8vIEhhbmRsZSBzbWFydCBwb2ludGVycywgcmVmZXJlbmNlcyBhbmQgcG9pbnRlcnMgdG8gZGVyaXZlZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBfUmVzCisJb3BlcmF0b3IoKShfVHAmIF9fb2JqZWN0LCBfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorICAgICAgICB7IHJldHVybiBfTV9jYWxsKF9fb2JqZWN0LCAmX19vYmplY3QsIF9fYXJncy4uLik7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfRnVuY3RvciBfX3BtZjsKKyAgICB9OworCisgIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiBAYyBtZW1fZm4gZm9yIGNvbnN0IHZvbGF0aWxlIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY2xhc3MgX01lbV9mbjxfUmVzIChfQ2xhc3M6OiopKF9BcmdUeXBlcy4uLikgY29uc3Qgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgX01heWJlX3VuYXJ5X29yX2JpbmFyeV9mdW5jdGlvbjxfUmVzLCBjb25zdCB2b2xhdGlsZSBfQ2xhc3MqLCAKKwkJCQkJICAgICBfQXJnVHlwZXMuLi4+CisgICAgeworICAgICAgdHlwZWRlZiBfUmVzIChfQ2xhc3M6OipfRnVuY3RvcikoX0FyZ1R5cGVzLi4uKSBjb25zdCB2b2xhdGlsZTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBfUmVzCisgICAgICAgIF9NX2NhbGwoX1RwJiBfX29iamVjdCwgY29uc3Qgdm9sYXRpbGUgX0NsYXNzICosIAorICAgICAgICAgICAgICAgIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIChfX29iamVjdC4qX19wbWYpKF9fYXJncy4uLik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBfUmVzCisgICAgICAgIF9NX2NhbGwoX1RwJiBfX3B0ciwgY29uc3Qgdm9sYXRpbGUgdm9pZCAqLCBfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorICAgICAgICB7IHJldHVybiAoKCpfX3B0cikuKl9fcG1mKShfX2FyZ3MuLi4pOyB9CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7CisKKyAgICAgIGV4cGxpY2l0IF9NZW1fZm4oX0Z1bmN0b3IgX19wbWYpIDogX19wbWYoX19wbWYpIHsgfQorCisgICAgICAvLyBIYW5kbGUgb2JqZWN0cworICAgICAgX1JlcyAKKyAgICAgIG9wZXJhdG9yKCkoY29uc3Qgdm9sYXRpbGUgX0NsYXNzJiBfX29iamVjdCwgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfX29iamVjdC4qX19wbWYpKF9fYXJncy4uLik7IH0KKworICAgICAgLy8gSGFuZGxlIHBvaW50ZXJzCisgICAgICBfUmVzIAorICAgICAgb3BlcmF0b3IoKShjb25zdCB2b2xhdGlsZSBfQ2xhc3MqIF9fb2JqZWN0LCBfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorICAgICAgeyByZXR1cm4gKF9fb2JqZWN0LT4qX19wbWYpKF9fYXJncy4uLik7IH0KKworICAgICAgLy8gSGFuZGxlIHNtYXJ0IHBvaW50ZXJzLCByZWZlcmVuY2VzIGFuZCBwb2ludGVycyB0byBkZXJpdmVkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIF9SZXMgb3BlcmF0b3IoKShfVHAmIF9fb2JqZWN0LCBfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorICAgICAgICB7IHJldHVybiBfTV9jYWxsKF9fb2JqZWN0LCAmX19vYmplY3QsIF9fYXJncy4uLik7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfRnVuY3RvciBfX3BtZjsKKyAgICB9OworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzPgorICAgIGNsYXNzIF9NZW1fZm48X1JlcyBfQ2xhc3M6Oio+CisgICAgeworICAgICAgLy8gVGhpcyBiaXQgb2YgZ2VuaXVzIGlzIGR1ZSB0byBQZXRlciBEaW1vdiwgaW1wcm92ZWQgc2xpZ2h0bHkgYnkKKyAgICAgIC8vIERvdWdsYXMgR3JlZ29yLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBfUmVzJgorICAgICAgICBfTV9jYWxsKF9UcCYgX19vYmplY3QsIF9DbGFzcyAqKSBjb25zdAorICAgICAgICB7IHJldHVybiBfX29iamVjdC4qX19wbTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICAgICAgX1JlcyYKKyAgICAgICAgX01fY2FsbChfVHAmIF9fb2JqZWN0LCBfVXAgKiBjb25zdCAqKSBjb25zdAorICAgICAgICB7IHJldHVybiAoKl9fb2JqZWN0KS4qX19wbTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICAgICAgY29uc3QgX1JlcyYKKyAgICAgICAgX01fY2FsbChfVHAmIF9fb2JqZWN0LCBjb25zdCBfVXAgKiBjb25zdCAqKSBjb25zdAorICAgICAgICB7IHJldHVybiAoKl9fb2JqZWN0KS4qX19wbTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIGNvbnN0IF9SZXMmCisgICAgICAgIF9NX2NhbGwoX1RwJiBfX29iamVjdCwgY29uc3QgX0NsYXNzICopIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIF9fb2JqZWN0LipfX3BtOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgY29uc3QgX1JlcyYKKyAgICAgICAgX01fY2FsbChfVHAmIF9fcHRyLCBjb25zdCB2b2xhdGlsZSB2b2lkKikgY29uc3QKKyAgICAgICAgeyByZXR1cm4gKCpfX3B0cikuKl9fcG07IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBzdGF0aWMgX1RwJiBfX2dldF9yZWYoKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBzdGF0aWMgX19zZmluYWVfdHlwZXM6Ol9fb25lIF9fY2hlY2tfY29uc3QoX1RwJiwgX0NsYXNzKik7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICAgICAgc3RhdGljIF9fc2ZpbmFlX3R5cGVzOjpfX29uZSBfX2NoZWNrX2NvbnN0KF9UcCYsIF9VcCAqIGNvbnN0ICopOworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgICAgIHN0YXRpYyBfX3NmaW5hZV90eXBlczo6X190d28gX19jaGVja19jb25zdChfVHAmLCBjb25zdCBfVXAgKiBjb25zdCAqKTsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgc3RhdGljIF9fc2ZpbmFlX3R5cGVzOjpfX3R3byBfX2NoZWNrX2NvbnN0KF9UcCYsIGNvbnN0IF9DbGFzcyopOworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBzdGF0aWMgX19zZmluYWVfdHlwZXM6Ol9fdHdvIF9fY2hlY2tfY29uc3QoX1RwJiwgY29uc3Qgdm9sYXRpbGUgdm9pZCopOworCisgICAgcHVibGljOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBzdHJ1Y3QgX1Jlc3VsdF90eXBlCisJOiBfTWVtX2ZuX2NvbnN0X29yX25vbjxfUmVzLAorCSAgKHNpemVvZihfX3NmaW5hZV90eXBlczo6X190d28pCisJICAgPT0gc2l6ZW9mKF9fY2hlY2tfY29uc3Q8X1RwPihfX2dldF9yZWY8X1RwPigpLCAoX1RwKikwKSkpPgorICAgICAgICB7IH07CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgICAgIHN0cnVjdCByZXN1bHQ7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DVk1lbSwgdHlwZW5hbWUgX1RwPgorICAgICAgICBzdHJ1Y3QgcmVzdWx0PF9DVk1lbShfVHApPgorCTogcHVibGljIF9SZXN1bHRfdHlwZTxfVHA+IHsgfTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NWTWVtLCB0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0cnVjdCByZXN1bHQ8X0NWTWVtKF9UcCYpPgorCTogcHVibGljIF9SZXN1bHRfdHlwZTxfVHA+IHsgfTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIF9NZW1fZm4oX1JlcyBfQ2xhc3M6OipfX3BtKSA6IF9fcG0oX19wbSkgeyB9CisKKyAgICAgIC8vIEhhbmRsZSBvYmplY3RzCisgICAgICBfUmVzJgorICAgICAgb3BlcmF0b3IoKShfQ2xhc3MmIF9fb2JqZWN0KSBjb25zdAorICAgICAgeyByZXR1cm4gX19vYmplY3QuKl9fcG07IH0KKworICAgICAgY29uc3QgX1JlcyYKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0NsYXNzJiBfX29iamVjdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fb2JqZWN0LipfX3BtOyB9CisKKyAgICAgIC8vIEhhbmRsZSBwb2ludGVycworICAgICAgX1JlcyYKKyAgICAgIG9wZXJhdG9yKCkoX0NsYXNzKiBfX29iamVjdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fb2JqZWN0LT4qX19wbTsgfQorCisgICAgICBjb25zdCBfUmVzJgorICAgICAgb3BlcmF0b3IoKShjb25zdCBfQ2xhc3MqIF9fb2JqZWN0KSBjb25zdAorICAgICAgeyByZXR1cm4gX19vYmplY3QtPipfX3BtOyB9CisKKyAgICAgIC8vIEhhbmRsZSBzbWFydCBwb2ludGVycyBhbmQgZGVyaXZlZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICB0eXBlbmFtZSBfUmVzdWx0X3R5cGU8X1RwPjo6dHlwZQorICAgICAgICBvcGVyYXRvcigpKF9UcCYgX191bmtub3duKSBjb25zdAorICAgICAgICB7IHJldHVybiBfTV9jYWxsKF9fdW5rbm93biwgJl9fdW5rbm93bik7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfUmVzIF9DbGFzczo6Kl9fcG07CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiBSZXR1cm5zIGEgZnVuY3Rpb24gb2JqZWN0IHRoYXQgZm9yd2FyZHMgdG8gdGhlIG1lbWJlcgorICAgKiAgcG9pbnRlciBAYSBwbS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NsYXNzPgorICAgIGlubGluZSBfTWVtX2ZuPF9UcCBfQ2xhc3M6Oio+CisgICAgbWVtX2ZuKF9UcCBfQ2xhc3M6OiogX19wbSkKKyAgICB7CisgICAgICByZXR1cm4gX01lbV9mbjxfVHAgX0NsYXNzOjoqPihfX3BtKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gdHlwZSBfVHAgaXMgYSBmdW5jdGlvbiBvYmplY3QKKyAgICogIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgc3ViZXhwcmVzc2lvbiB3aGVuIGV2YWx1YXRpbmcgY2FsbHMgdG8KKyAgICogIGZ1bmN0aW9uIG9iamVjdHMgcmV0dXJuZWQgYnkgYmluZCgpLiBbVFIxIDMuNi4xXQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb24KKyAgICB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0IGJvb2wgaXNfYmluZF9leHByZXNzaW9uPF9UcD46OnZhbHVlOworCisgIC8qKgorICAgKiAgQGJyaWVmIERldGVybWluZXMgaWYgdGhlIGdpdmVuIHR5cGUgX1RwIGlzIGEgcGxhY2Vob2xkZXIgaW4gYQorICAgKiAgYmluZCgpIGV4cHJlc3Npb24gYW5kLCBpZiBzbywgd2hpY2ggcGxhY2Vob2xkZXIgaXQgaXMuIFtUUjEgMy42LjJdCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3BsYWNlaG9sZGVyCisgICAgeyBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMDsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3QgaW50IGlzX3BsYWNlaG9sZGVyPF9UcD46OnZhbHVlOworCisgIC8vLyBUaGUgdHlwZSBvZiBwbGFjZWhvbGRlciBvYmplY3RzIGRlZmluZWQgYnkgbGlic3RkYysrLgorICB0ZW1wbGF0ZTxpbnQgX051bT4gc3RydWN0IF9QbGFjZWhvbGRlciB7IH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKiBAbmFtZXNwYWNlIHN0ZDo6dHIxOjpwbGFjZWhvbGRlcnMKKyAgICogIEBicmllZiBTdWItbmFtZXNwYWNlIGZvciB0cjEvZnVuY3Rpb25hbC4KKyAgICovCisgIG5hbWVzcGFjZSBwbGFjZWhvbGRlcnMgCisgIHsgCisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisgICAgLyogIERlZmluZSBhIGxhcmdlIG51bWJlciBvZiBwbGFjZWhvbGRlcnMuIFRoZXJlIGlzIG5vIHdheSB0bworICAgICAqICBzaW1wbGlmeSB0aGlzIHdpdGggdmFyaWFkaWMgdGVtcGxhdGVzLCBiZWNhdXNlIHdlJ3JlIGludHJvZHVjaW5nCisgICAgICogIHVuaXF1ZSBuYW1lcyBmb3IgZWFjaC4KKyAgICAgKi8KKyAgICBuYW1lc3BhY2UgCisgICAgeworICAgICAgX1BsYWNlaG9sZGVyPDE+IF8xOworICAgICAgX1BsYWNlaG9sZGVyPDI+IF8yOworICAgICAgX1BsYWNlaG9sZGVyPDM+IF8zOworICAgICAgX1BsYWNlaG9sZGVyPDQ+IF80OworICAgICAgX1BsYWNlaG9sZGVyPDU+IF81OworICAgICAgX1BsYWNlaG9sZGVyPDY+IF82OworICAgICAgX1BsYWNlaG9sZGVyPDc+IF83OworICAgICAgX1BsYWNlaG9sZGVyPDg+IF84OworICAgICAgX1BsYWNlaG9sZGVyPDk+IF85OworICAgICAgX1BsYWNlaG9sZGVyPDEwPiBfMTA7CisgICAgICBfUGxhY2Vob2xkZXI8MTE+IF8xMTsKKyAgICAgIF9QbGFjZWhvbGRlcjwxMj4gXzEyOworICAgICAgX1BsYWNlaG9sZGVyPDEzPiBfMTM7CisgICAgICBfUGxhY2Vob2xkZXI8MTQ+IF8xNDsKKyAgICAgIF9QbGFjZWhvbGRlcjwxNT4gXzE1OworICAgICAgX1BsYWNlaG9sZGVyPDE2PiBfMTY7CisgICAgICBfUGxhY2Vob2xkZXI8MTc+IF8xNzsKKyAgICAgIF9QbGFjZWhvbGRlcjwxOD4gXzE4OworICAgICAgX1BsYWNlaG9sZGVyPDE5PiBfMTk7CisgICAgICBfUGxhY2Vob2xkZXI8MjA+IF8yMDsKKyAgICAgIF9QbGFjZWhvbGRlcjwyMT4gXzIxOworICAgICAgX1BsYWNlaG9sZGVyPDIyPiBfMjI7CisgICAgICBfUGxhY2Vob2xkZXI8MjM+IF8yMzsKKyAgICAgIF9QbGFjZWhvbGRlcjwyND4gXzI0OworICAgICAgX1BsYWNlaG9sZGVyPDI1PiBfMjU7CisgICAgICBfUGxhY2Vob2xkZXI8MjY+IF8yNjsKKyAgICAgIF9QbGFjZWhvbGRlcjwyNz4gXzI3OworICAgICAgX1BsYWNlaG9sZGVyPDI4PiBfMjg7CisgICAgICBfUGxhY2Vob2xkZXI8Mjk+IF8yOTsKKyAgICB9IAorICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfQorCitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorICAvKioKKyAgICogIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gb2YgaXNfcGxhY2Vob2xkZXIgdGhhdCBwcm92aWRlcyB0aGUgcGxhY2Vob2xkZXIKKyAgICogIG51bWJlciBmb3IgdGhlIHBsYWNlaG9sZGVyIG9iamVjdHMgZGVmaW5lZCBieSBsaWJzdGRjKysuCisgICAqLworICB0ZW1wbGF0ZTxpbnQgX051bT4KKyAgICBzdHJ1Y3QgaXNfcGxhY2Vob2xkZXI8X1BsYWNlaG9sZGVyPF9OdW0+ID4KKyAgICB7IHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSBfTnVtOyB9OworCisgIHRlbXBsYXRlPGludCBfTnVtPgorICAgIGNvbnN0IGludCBpc19wbGFjZWhvbGRlcjxfUGxhY2Vob2xkZXI8X051bT4gPjo6dmFsdWU7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPGludCBfTnVtPgorICAgIHN0cnVjdCBpc19wbGFjZWhvbGRlcjxzdGQ6Ol9QbGFjZWhvbGRlcjxfTnVtPj4KKyAgICA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LCBfTnVtPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTxpbnQgX051bT4KKyAgICBzdHJ1Y3QgaXNfcGxhY2Vob2xkZXI8Y29uc3Qgc3RkOjpfUGxhY2Vob2xkZXI8X051bT4+CisgICAgOiBzdGQ6OmludGVncmFsX2NvbnN0YW50PGludCwgX051bT4KKyAgICB7IH07CisjZW5kaWYKKworICAvKioKKyAgICogU3RvcmVzIGEgdHVwbGUgb2YgaW5kaWNlcy4gVXNlZCBieSBiaW5kKCkgdG8gZXh0cmFjdCB0aGUgZWxlbWVudHMKKyAgICogaW4gYSB0dXBsZS4gCisgICAqLworICB0ZW1wbGF0ZTxpbnQuLi4gX0luZGV4ZXM+CisgICAgc3RydWN0IF9JbmRleF90dXBsZSB7IH07CisKKyAgLy8vIEJ1aWxkcyBhbiBfSW5kZXhfdHVwbGU8MCwgMSwgMiwgLi4uLCBfTnVtLTE+LgorICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfTnVtLCB0eXBlbmFtZSBfVHVwbGUgPSBfSW5kZXhfdHVwbGU8PiA+CisgICAgc3RydWN0IF9CdWlsZF9pbmRleF90dXBsZTsKKyAKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX051bSwgaW50Li4uIF9JbmRleGVzPiAKKyAgICBzdHJ1Y3QgX0J1aWxkX2luZGV4X3R1cGxlPF9OdW0sIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4gPgorICAgIDogX0J1aWxkX2luZGV4X3R1cGxlPF9OdW0gLSAxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4sIHNpemVvZi4uLihfSW5kZXhlcyk+ID4KKyAgICB7CisgICAgfTsKKworICB0ZW1wbGF0ZTxpbnQuLi4gX0luZGV4ZXM+CisgICAgc3RydWN0IF9CdWlsZF9pbmRleF90dXBsZTwwLCBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4gX190eXBlOworICAgIH07CisKKyAgLyoqIAorICAgKiBVc2VkIGJ5IF9TYWZlX3R1cGxlX2VsZW1lbnQgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyB0dXBsZQorICAgKiBlbGVtZW50IGF0IHRoaXMgcG9zaXRpb24uCisgICAqLworICBzdHJ1Y3QgX05vX3R1cGxlX2VsZW1lbnQ7CisKKyAgLyoqCisgICAqIEltcGxlbWVudGF0aW9uIGhlbHBlciBmb3IgX1NhZmVfdHVwbGVfZWxlbWVudC4gVGhpcyBwcmltYXJ5CisgICAqIHRlbXBsYXRlIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgaXQgaXMgc2FmZSB0byB1c2UgQGMKKyAgICogdHVwbGVfZWxlbWVudC4KKyAgICovCisgIHRlbXBsYXRlPGludCBfX2ksIHR5cGVuYW1lIF9UdXBsZSwgYm9vbCBfSXNTYWZlPgorICAgIHN0cnVjdCBfU2FmZV90dXBsZV9lbGVtZW50X2ltcGwKKyAgICA6IHR1cGxlX2VsZW1lbnQ8X19pLCBfVHVwbGU+IHsgfTsKKworICAvKioKKyAgICogSW1wbGVtZW50YXRpb24gaGVscGVyIGZvciBfU2FmZV90dXBsZV9lbGVtZW50LiBUaGlzIHBhcnRpYWwKKyAgICogc3BlY2lhbGl6YXRpb24gaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBpdCBpcyBub3Qgc2FmZSB0byB1c2UgQGMKKyAgICogdHVwbGVfZWxlbWVudC4gV2UganVzdCByZXR1cm4gQGMgX05vX3R1cGxlX2VsZW1lbnQuCisgICAqLworICB0ZW1wbGF0ZTxpbnQgX19pLCB0eXBlbmFtZSBfVHVwbGU+CisgICAgc3RydWN0IF9TYWZlX3R1cGxlX2VsZW1lbnRfaW1wbDxfX2ksIF9UdXBsZSwgZmFsc2U+CisgICAgeworICAgICAgdHlwZWRlZiBfTm9fdHVwbGVfZWxlbWVudCB0eXBlOworICAgIH07CisKKyAgLyoqCisgICAqIExpa2UgdHVwbGVfZWxlbWVudCwgYnV0IHJldHVybnMgQGMgX05vX3R1cGxlX2VsZW1lbnQgd2hlbgorICAgKiB0dXBsZV9lbGVtZW50IHdvdWxkIHJldHVybiBhbiBlcnJvci4KKyAgICovCisgdGVtcGxhdGU8aW50IF9faSwgdHlwZW5hbWUgX1R1cGxlPgorICAgc3RydWN0IF9TYWZlX3R1cGxlX2VsZW1lbnQKKyAgIDogX1NhZmVfdHVwbGVfZWxlbWVudF9pbXBsPF9faSwgX1R1cGxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX2kgPj0gMCAmJiBfX2kgPCB0dXBsZV9zaXplPF9UdXBsZT46OnZhbHVlKT4KKyAgIHsKKyAgIH07CisKKyAgLyoqCisgICAqICBNYXBzIGFuIGFyZ3VtZW50IHRvIGJpbmQoKSBpbnRvIGFuIGFjdHVhbCBhcmd1bWVudCB0byB0aGUgYm91bmQKKyAgICogIGZ1bmN0aW9uIG9iamVjdCBbVFIxIDMuNi4zLzVdLiBPbmx5IHRoZSBmaXJzdCBwYXJhbWV0ZXIgc2hvdWxkCisgICAqICBiZSBzcGVjaWZpZWQ6IHRoZSByZXN0IGFyZSB1c2VkIHRvIGRldGVybWluZSBhbW9uZyB0aGUgdmFyaW91cworICAgKiAgaW1wbGVtZW50YXRpb25zLiBOb3RlIHRoYXQsIGFsdGhvdWdoIHRoaXMgY2xhc3MgaXMgYSBmdW5jdGlvbgorICAgKiAgb2JqZWN0LCBpdCBpc24ndCBlbnRpcmVseSBub3JtYWwgYmVjYXVzZSBpdCB0YWtlcyBvbmx5IHR3bworICAgKiAgcGFyYW1ldGVycyByZWdhcmRsZXNzIG9mIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlCisgICAqICBiaW5kIGV4cHJlc3Npb24uIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIGJvdW5kIGFyZ3VtZW50IGFuZAorICAgKiAgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgYSB0dXBsZSBjb250YWluaW5nIHJlZmVyZW5jZXMgdG8gdGhlCisgICAqICByZXN0IG9mIHRoZSBhcmd1bWVudHMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnLAorICAgICAgICAgICBib29sIF9Jc0JpbmRFeHAgPSBpc19iaW5kX2V4cHJlc3Npb248X0FyZz46OnZhbHVlLAorICAgICAgICAgICBib29sIF9Jc1BsYWNlaG9sZGVyID0gKGlzX3BsYWNlaG9sZGVyPF9Bcmc+Ojp2YWx1ZSA+IDApPgorICAgIGNsYXNzIF9NdTsKKworICAvKioKKyAgICogIElmIHRoZSBhcmd1bWVudCBpcyByZWZlcmVuY2Vfd3JhcHBlcjxfVHA+LCByZXR1cm5zIHRoZQorICAgKiAgdW5kZXJseWluZyByZWZlcmVuY2UuIFtUUjEgMy42LjMvNSBidWxsZXQgMV0KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBfTXU8cmVmZXJlbmNlX3dyYXBwZXI8X1RwPiwgZmFsc2UsIGZhbHNlPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCYgcmVzdWx0X3R5cGU7CisKKyAgICAgIC8qIE5vdGU6IFRoaXMgd29uJ3QgYWN0dWFsbHkgd29yayBmb3IgY29uc3Qgdm9sYXRpbGUKKyAgICAgICAqIHJlZmVyZW5jZV93cmFwcGVycywgYmVjYXVzZSByZWZlcmVuY2Vfd3JhcHBlcjo6Z2V0KCkgaXMgY29uc3QKKyAgICAgICAqIGJ1dCBub3Qgdm9sYXRpbGUtcXVhbGlmaWVkLiBUaGlzIG1pZ2h0IGJlIGEgZGVmZWN0IGluIHRoZSBUUi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NWUmVmLCB0eXBlbmFtZSBfVHVwbGU+CisgICAgICAgIHJlc3VsdF90eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX0NWUmVmJiBfX2FyZywgY29uc3QgX1R1cGxlJikgY29uc3Qgdm9sYXRpbGUKKyAgICAgICAgeyByZXR1cm4gX19hcmcuZ2V0KCk7IH0KKyAgICB9OworCisgIC8qKgorICAgKiAgSWYgdGhlIGFyZ3VtZW50IGlzIGEgYmluZCBleHByZXNzaW9uLCB3ZSBpbnZva2UgdGhlIHVuZGVybHlpbmcKKyAgICogIGZ1bmN0aW9uIG9iamVjdCB3aXRoIHRoZSBzYW1lIGN2LXF1YWxpZmllcnMgYXMgd2UgYXJlIGdpdmVuIGFuZAorICAgKiAgcGFzcyBhbG9uZyBhbGwgb2Ygb3VyIGFyZ3VtZW50cyAodW53cmFwcGVkKS4gW1RSMSAzLjYuMy81IGJ1bGxldCAyXQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKyAgICBjbGFzcyBfTXU8X0FyZywgdHJ1ZSwgZmFsc2U+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+IGNsYXNzIHJlc3VsdDsKKworICAgICAgLy8gRGV0ZXJtaW5lIHRoZSByZXN1bHQgdHlwZSB3aGVuIHdlIHBhc3MgdGhlIGFyZ3VtZW50cyBhbG9uZy4gVGhpcworICAgICAgLy8gaW52b2x2ZXMgcGFzc2luZyBhbG9uZyB0aGUgY3YtcXVhbGlmaWVycyBwbGFjZWQgb24gX011IGFuZAorICAgICAgLy8gdW53cmFwcGluZyB0aGUgYXJndW1lbnQgYnVuZGxlLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NWTXUsIHR5cGVuYW1lIF9DVkFyZywgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIGNsYXNzIHJlc3VsdDxfQ1ZNdShfQ1ZBcmcsIHR1cGxlPF9BcmdzLi4uPik+CisJOiBwdWJsaWMgcmVzdWx0X29mPF9DVkFyZyhfQXJncy4uLik+IHsgfTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NWQXJnLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdHlwZW5hbWUgcmVzdWx0X29mPF9DVkFyZyhfQXJncy4uLik+Ojp0eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX0NWQXJnJiBfX2FyZywKKwkJICAgY29uc3QgdHVwbGU8X0FyZ3MuLi4+JiBfX3R1cGxlKSBjb25zdCB2b2xhdGlsZQorICAgICAgICB7CisJICAvLyBDb25zdHJ1Y3QgYW4gaW5kZXggdHVwbGUgYW5kIGZvcndhcmQgdG8gX19jYWxsCisJICB0eXBlZGVmIHR5cGVuYW1lIF9CdWlsZF9pbmRleF90dXBsZTxzaXplb2YuLi4oX0FyZ3MpPjo6X190eXBlCisJICAgIF9JbmRleGVzOworCSAgcmV0dXJuIHRoaXMtPl9fY2FsbChfX2FyZywgX190dXBsZSwgX0luZGV4ZXMoKSk7CisJfQorCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIEludm9rZXMgdGhlIHVuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0IF9fYXJnIGJ5IHVucGFja2luZyBhbGwKKyAgICAgIC8vIG9mIHRoZSBhcmd1bWVudHMgaW4gdGhlIHR1cGxlLiAKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DVkFyZywgdHlwZW5hbWUuLi4gX0FyZ3MsIGludC4uLiBfSW5kZXhlcz4KKyAgICAgICAgdHlwZW5hbWUgcmVzdWx0X29mPF9DVkFyZyhfQXJncy4uLik+Ojp0eXBlCisgICAgICAgIF9fY2FsbChfQ1ZBcmcmIF9fYXJnLCBjb25zdCB0dXBsZTxfQXJncy4uLj4mIF9fdHVwbGUsCisJICAgICAgIGNvbnN0IF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4mKSBjb25zdCB2b2xhdGlsZQorICAgICAgICB7CisJICByZXR1cm4gX19hcmcodHIxOjpnZXQ8X0luZGV4ZXM+KF9fdHVwbGUpLi4uKTsKKwl9CisgICAgfTsKKworICAvKioKKyAgICogIElmIHRoZSBhcmd1bWVudCBpcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgTnRoIGFyZ3VtZW50LCByZXR1cm5zCisgICAqICBhIHJlZmVyZW5jZSB0byB0aGUgTnRoIGFyZ3VtZW50IHRvIHRoZSBiaW5kIGZ1bmN0aW9uIG9iamVjdC4KKyAgICogIFtUUjEgMy42LjMvNSBidWxsZXQgM10KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisgICAgY2xhc3MgX011PF9BcmcsIGZhbHNlLCB0cnVlPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPiBjbGFzcyByZXN1bHQ7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DVk11LCB0eXBlbmFtZSBfQ1ZBcmcsIHR5cGVuYW1lIF9UdXBsZT4KKyAgICAgICAgY2xhc3MgcmVzdWx0PF9DVk11KF9DVkFyZywgX1R1cGxlKT4KKyAgICAgICAgeworCSAgLy8gQWRkIGEgcmVmZXJlbmNlLCBpZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIGRvbmUgZm9yIHVzLgorCSAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gYmUgYSBsaXR0bGUgYml0IHNsb3BweSBpbiBjb25zdHJ1Y3RpbmcKKwkgIC8vIHRoZSB0dXBsZSB0aGF0IHdlIHBhc3MgdG8gcmVzdWx0X29mPC4uLj4uCisJICB0eXBlZGVmIHR5cGVuYW1lIF9TYWZlX3R1cGxlX2VsZW1lbnQ8KGlzX3BsYWNlaG9sZGVyPF9Bcmc+Ojp2YWx1ZQorCQkJCQkJLSAxKSwgX1R1cGxlPjo6dHlwZQorCSAgICBfX2Jhc2VfdHlwZTsKKworCXB1YmxpYzoKKwkgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX3JlZmVyZW5jZTxfX2Jhc2VfdHlwZT46OnR5cGUgdHlwZTsKKwl9OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHVwbGU+CisgICAgICAgIHR5cGVuYW1lIHJlc3VsdDxfTXUoX0FyZywgX1R1cGxlKT46OnR5cGUKKyAgICAgICAgb3BlcmF0b3IoKShjb25zdCB2b2xhdGlsZSBfQXJnJiwgY29uc3QgX1R1cGxlJiBfX3R1cGxlKSBjb25zdCB2b2xhdGlsZQorICAgICAgICB7CisJICByZXR1cm4gOjpzdGQ6OnRyMTo6Z2V0PChpc19wbGFjZWhvbGRlcjxfQXJnPjo6dmFsdWUgLSAxKT4oX190dXBsZSk7CisJfQorICAgIH07CisKKyAgLyoqCisgICAqICBJZiB0aGUgYXJndW1lbnQgaXMganVzdCBhIHZhbHVlLCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoYXQKKyAgICogIHZhbHVlLiBUaGUgY3YtcXVhbGlmaWVycyBvbiB0aGUgcmVmZXJlbmNlIGFyZSB0aGUgc2FtZSBhcyB0aGUKKyAgICogIGN2LXF1YWxpZmllcnMgb24gdGhlIF9NdSBvYmplY3QuIFtUUjEgMy42LjMvNSBidWxsZXQgNF0KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisgICAgY2xhc3MgX011PF9BcmcsIGZhbHNlLCBmYWxzZT4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4gc3RydWN0IHJlc3VsdDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NWTXUsIHR5cGVuYW1lIF9DVkFyZywgdHlwZW5hbWUgX1R1cGxlPgorICAgICAgICBzdHJ1Y3QgcmVzdWx0PF9DVk11KF9DVkFyZywgX1R1cGxlKT4KKyAgICAgICAgeworCSAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfcmVmZXJlbmNlPF9DVkFyZz46OnR5cGUgdHlwZTsKKwl9OworCisgICAgICAvLyBQaWNrIHVwIHRoZSBjdi1xdWFsaWZpZXJzIG9mIHRoZSBhcmd1bWVudAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NWQXJnLCB0eXBlbmFtZSBfVHVwbGU+CisgICAgICAgIF9DVkFyZyYKKyAgICAgICAgb3BlcmF0b3IoKShfQ1ZBcmcmIF9fYXJnLCBjb25zdCBfVHVwbGUmKSBjb25zdCB2b2xhdGlsZQorICAgICAgICB7IHJldHVybiBfX2FyZzsgfQorICAgIH07CisKKyAgLyoqCisgICAqICBNYXBzIG1lbWJlciBwb2ludGVycyBpbnRvIGluc3RhbmNlcyBvZiBfTWVtX2ZuIGJ1dCBsZWF2ZXMgYWxsCisgICAqICBvdGhlciBmdW5jdGlvbiBvYmplY3RzIHVudG91Y2hlZC4gVXNlZCBieSB0cjE6OmJpbmQoKS4gVGhlCisgICAqICBwcmltYXJ5IHRlbXBsYXRlIGhhbmRsZXMgdGhlIG5vbi0tbWVtYmVyLXBvaW50ZXIgY2FzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX01heWJlX3dyYXBfbWVtYmVyX3BvaW50ZXIKKyAgICB7CisgICAgICB0eXBlZGVmIF9UcCB0eXBlOworICAgICAgCisgICAgICBzdGF0aWMgY29uc3QgX1RwJgorICAgICAgX19kb193cmFwKGNvbnN0IF9UcCYgX194KQorICAgICAgeyByZXR1cm4gX194OyB9CisgICAgfTsKKworICAvKioKKyAgICogIE1hcHMgbWVtYmVyIHBvaW50ZXJzIGludG8gaW5zdGFuY2VzIG9mIF9NZW1fZm4gYnV0IGxlYXZlcyBhbGwKKyAgICogIG90aGVyIGZ1bmN0aW9uIG9iamVjdHMgdW50b3VjaGVkLiBVc2VkIGJ5IHRyMTo6YmluZCgpLiBUaGlzCisgICAqICBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGhhbmRsZXMgdGhlIG1lbWJlciBwb2ludGVyIGNhc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9DbGFzcz4KKyAgICBzdHJ1Y3QgX01heWJlX3dyYXBfbWVtYmVyX3BvaW50ZXI8X1RwIF9DbGFzczo6Kj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9NZW1fZm48X1RwIF9DbGFzczo6Kj4gdHlwZTsKKyAgICAgIAorICAgICAgc3RhdGljIHR5cGUKKyAgICAgIF9fZG9fd3JhcChfVHAgX0NsYXNzOjoqIF9fcG0pCisgICAgICB7IHJldHVybiB0eXBlKF9fcG0pOyB9CisgICAgfTsKKworICAvLy8gVHlwZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0IHJldHVybmVkIGZyb20gYmluZCgpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBfQmluZDsKKworICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9Cb3VuZF9hcmdzPgorICAgIGNsYXNzIF9CaW5kPF9GdW5jdG9yKF9Cb3VuZF9hcmdzLi4uKT4KKyAgICA6IHB1YmxpYyBfV2Vha19yZXN1bHRfdHlwZTxfRnVuY3Rvcj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9CaW5kIF9fc2VsZl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQnVpbGRfaW5kZXhfdHVwbGU8c2l6ZW9mLi4uKF9Cb3VuZF9hcmdzKT46Ol9fdHlwZSAKKyAgICAgICAgX0JvdW5kX2luZGV4ZXM7CisKKyAgICAgIF9GdW5jdG9yIF9NX2Y7CisgICAgICB0dXBsZTxfQm91bmRfYXJncy4uLj4gX01fYm91bmRfYXJnczsKKworICAgICAgLy8gQ2FsbCB1bnF1YWxpZmllZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIGludC4uLiBfSW5kZXhlcz4KKyAgICAgICAgdHlwZW5hbWUgcmVzdWx0X29mPAorICAgICAgICAgICAgICAgICAgIF9GdW5jdG9yKHR5cGVuYW1lIHJlc3VsdF9vZjxfTXU8X0JvdW5kX2FyZ3M+IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfQm91bmRfYXJncywgdHVwbGU8X0FyZ3MuLi4+KT46OnR5cGUuLi4pCisgICAgICAgICAgICAgICAgID46OnR5cGUKKyAgICAgICAgX19jYWxsKGNvbnN0IHR1cGxlPF9BcmdzLi4uPiYgX19hcmdzLCBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+KQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisgICAgICAgICAgICAgICAgICAgICAgKHRyMTo6Z2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisgICAgICAgIH0KKworICAgICAgLy8gQ2FsbCBhcyBjb25zdAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIGludC4uLiBfSW5kZXhlcz4KKyAgICAgICAgdHlwZW5hbWUgcmVzdWx0X29mPAorICAgICAgICAgICAgICAgICAgIGNvbnN0IF9GdW5jdG9yKHR5cGVuYW1lIHJlc3VsdF9vZjxfTXU8X0JvdW5kX2FyZ3M+IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IF9Cb3VuZF9hcmdzLCB0dXBsZTxfQXJncy4uLj4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZS4uLik+Ojp0eXBlCisgICAgICAgIF9fY2FsbChjb25zdCB0dXBsZTxfQXJncy4uLj4mIF9fYXJncywgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBfTV9mKF9NdTxfQm91bmRfYXJncz4oKQorICAgICAgICAgICAgICAgICAgICAgICh0cjE6OmdldDxfSW5kZXhlcz4oX01fYm91bmRfYXJncyksIF9fYXJncykuLi4pOworICAgICAgICB9CisKKyAgICAgIC8vIENhbGwgYXMgdm9sYXRpbGUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzLCBpbnQuLi4gX0luZGV4ZXM+CisgICAgICAgIHR5cGVuYW1lIHJlc3VsdF9vZjwKKyAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBfRnVuY3Rvcih0eXBlbmFtZSByZXN1bHRfb2Y8X011PF9Cb3VuZF9hcmdzPiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2xhdGlsZSBfQm91bmRfYXJncywgdHVwbGU8X0FyZ3MuLi4+KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID46OnR5cGUuLi4pPjo6dHlwZQorICAgICAgICBfX2NhbGwoY29uc3QgdHVwbGU8X0FyZ3MuLi4+JiBfX2FyZ3MsIAorICAgICAgICAgICAgICAgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPikgdm9sYXRpbGUKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBfTV9mKF9NdTxfQm91bmRfYXJncz4oKQorICAgICAgICAgICAgICAgICAgICAgICh0cjE6OmdldDxfSW5kZXhlcz4oX01fYm91bmRfYXJncyksIF9fYXJncykuLi4pOworICAgICAgICB9CisKKyAgICAgIC8vIENhbGwgYXMgY29uc3Qgdm9sYXRpbGUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzLCBpbnQuLi4gX0luZGV4ZXM+CisgICAgICAgIHR5cGVuYW1lIHJlc3VsdF9vZjwKKyAgICAgICAgICAgICAgICAgICBjb25zdCB2b2xhdGlsZSBfRnVuY3Rvcih0eXBlbmFtZSByZXN1bHRfb2Y8X011PF9Cb3VuZF9hcmdzPiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB2b2xhdGlsZSBfQm91bmRfYXJncywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGU8X0FyZ3MuLi4+KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID46OnR5cGUuLi4pPjo6dHlwZQorICAgICAgICBfX2NhbGwoY29uc3QgdHVwbGU8X0FyZ3MuLi4+JiBfX2FyZ3MsIAorICAgICAgICAgICAgICAgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPikgY29uc3Qgdm9sYXRpbGUKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBfTV9mKF9NdTxfQm91bmRfYXJncz4oKQorICAgICAgICAgICAgICAgICAgICAgICh0cjE6OmdldDxfSW5kZXhlcz4oX01fYm91bmRfYXJncyksIF9fYXJncykuLi4pOworICAgICAgICB9CisKKyAgICAgcHVibGljOgorICAgICAgZXhwbGljaXQgX0JpbmQoX0Z1bmN0b3IgX19mLCBfQm91bmRfYXJncy4uLiBfX2JvdW5kX2FyZ3MpCisgICAgICAgIDogX01fZihfX2YpLCBfTV9ib3VuZF9hcmdzKF9fYm91bmRfYXJncy4uLikgeyB9CisKKyAgICAgIC8vIENhbGwgdW5xdWFsaWZpZWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB0eXBlbmFtZSByZXN1bHRfb2Y8CisgICAgICAgICAgICAgICAgICAgX0Z1bmN0b3IodHlwZW5hbWUgcmVzdWx0X29mPF9NdTxfQm91bmRfYXJncz4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9Cb3VuZF9hcmdzLCB0dXBsZTxfQXJncy4uLj4pPjo6dHlwZS4uLikKKyAgICAgICAgICAgICAgICAgPjo6dHlwZQorICAgICAgICBvcGVyYXRvcigpKF9BcmdzJi4uLiBfX2FyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy0+X19jYWxsKHRyMTo6dGllKF9fYXJncy4uLiksIF9Cb3VuZF9pbmRleGVzKCkpOworICAgICAgICB9CisKKyAgICAgIC8vIENhbGwgYXMgY29uc3QKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB0eXBlbmFtZSByZXN1bHRfb2Y8CisgICAgICAgICAgICAgICAgICAgY29uc3QgX0Z1bmN0b3IodHlwZW5hbWUgcmVzdWx0X29mPF9NdTxfQm91bmRfYXJncz4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IF9Cb3VuZF9hcmdzLCB0dXBsZTxfQXJncy4uLj4pPjo6dHlwZS4uLikKKyAgICAgICAgICAgICAgICAgPjo6dHlwZQorICAgICAgICBvcGVyYXRvcigpKF9BcmdzJi4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy0+X19jYWxsKHRyMTo6dGllKF9fYXJncy4uLiksIF9Cb3VuZF9pbmRleGVzKCkpOworICAgICAgICB9CisKKworICAgICAgLy8gQ2FsbCBhcyB2b2xhdGlsZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHR5cGVuYW1lIHJlc3VsdF9vZjwKKyAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBfRnVuY3Rvcih0eXBlbmFtZSByZXN1bHRfb2Y8X011PF9Cb3VuZF9hcmdzPiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9sYXRpbGUgX0JvdW5kX2FyZ3MsIHR1cGxlPF9BcmdzLi4uPik+Ojp0eXBlLi4uKQorICAgICAgICAgICAgICAgICA+Ojp0eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX0FyZ3MmLi4uIF9fYXJncykgdm9sYXRpbGUKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiB0aGlzLT5fX2NhbGwodHIxOjp0aWUoX19hcmdzLi4uKSwgX0JvdW5kX2luZGV4ZXMoKSk7CisgICAgICAgIH0KKworCisgICAgICAvLyBDYWxsIGFzIGNvbnN0IHZvbGF0aWxlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdHlwZW5hbWUgcmVzdWx0X29mPAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvbGF0aWxlIF9GdW5jdG9yKHR5cGVuYW1lIHJlc3VsdF9vZjxfTXU8X0JvdW5kX2FyZ3M+IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB2b2xhdGlsZSBfQm91bmRfYXJncywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlPF9BcmdzLi4uPik+Ojp0eXBlLi4uKQorICAgICAgICAgICAgICAgICA+Ojp0eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX0FyZ3MmLi4uIF9fYXJncykgY29uc3Qgdm9sYXRpbGUKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiB0aGlzLT5fX2NhbGwodHIxOjp0aWUoX19hcmdzLi4uKSwgX0JvdW5kX2luZGV4ZXMoKSk7CisgICAgICAgIH0KKyAgICB9OworCisgIC8vLyBUeXBlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QgcmV0dXJuZWQgZnJvbSBiaW5kPFI+KCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IF9CaW5kX3Jlc3VsdDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0JvdW5kX2FyZ3M+CisgICAgY2xhc3MgX0JpbmRfcmVzdWx0PF9SZXN1bHQsIF9GdW5jdG9yKF9Cb3VuZF9hcmdzLi4uKT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9CaW5kX3Jlc3VsdCBfX3NlbGZfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0J1aWxkX2luZGV4X3R1cGxlPHNpemVvZi4uLihfQm91bmRfYXJncyk+OjpfX3R5cGUgCisgICAgICAgIF9Cb3VuZF9pbmRleGVzOworCisgICAgICBfRnVuY3RvciBfTV9mOworICAgICAgdHVwbGU8X0JvdW5kX2FyZ3MuLi4+IF9NX2JvdW5kX2FyZ3M7CisKKyAgICAgIC8vIENhbGwgdW5xdWFsaWZpZWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzLCBpbnQuLi4gX0luZGV4ZXM+CisgICAgICAgIF9SZXN1bHQKKyAgICAgICAgX19jYWxsKGNvbnN0IHR1cGxlPF9BcmdzLi4uPiYgX19hcmdzLCBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+KQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisgICAgICAgICAgICAgICAgICAgICAgKHRyMTo6Z2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisgICAgICAgIH0KKworICAgICAgLy8gQ2FsbCBhcyBjb25zdAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIGludC4uLiBfSW5kZXhlcz4KKyAgICAgICAgX1Jlc3VsdAorICAgICAgICBfX2NhbGwoY29uc3QgdHVwbGU8X0FyZ3MuLi4+JiBfX2FyZ3MsIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4pIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKyAgICAgICAgICAgICAgICAgICAgICAodHIxOjpnZXQ8X0luZGV4ZXM+KF9NX2JvdW5kX2FyZ3MpLCBfX2FyZ3MpLi4uKTsKKyAgICAgICAgfQorCisgICAgICAvLyBDYWxsIGFzIHZvbGF0aWxlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncywgaW50Li4uIF9JbmRleGVzPgorICAgICAgICBfUmVzdWx0CisgICAgICAgIF9fY2FsbChjb25zdCB0dXBsZTxfQXJncy4uLj4mIF9fYXJncywgCisgICAgICAgICAgICAgICBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+KSB2b2xhdGlsZQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisgICAgICAgICAgICAgICAgICAgICAgKHRyMTo6Z2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisgICAgICAgIH0KKworICAgICAgLy8gQ2FsbCBhcyBjb25zdCB2b2xhdGlsZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIGludC4uLiBfSW5kZXhlcz4KKyAgICAgICAgX1Jlc3VsdAorICAgICAgICBfX2NhbGwoY29uc3QgdHVwbGU8X0FyZ3MuLi4+JiBfX2FyZ3MsIAorICAgICAgICAgICAgICAgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPikgY29uc3Qgdm9sYXRpbGUKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBfTV9mKF9NdTxfQm91bmRfYXJncz4oKQorICAgICAgICAgICAgICAgICAgICAgICh0cjE6OmdldDxfSW5kZXhlcz4oX01fYm91bmRfYXJncyksIF9fYXJncykuLi4pOworICAgICAgICB9CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9SZXN1bHQgcmVzdWx0X3R5cGU7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfQmluZF9yZXN1bHQoX0Z1bmN0b3IgX19mLCBfQm91bmRfYXJncy4uLiBfX2JvdW5kX2FyZ3MpCisgICAgICA6IF9NX2YoX19mKSwgX01fYm91bmRfYXJncyhfX2JvdW5kX2FyZ3MuLi4pIHsgfQorCisgICAgICAvLyBDYWxsIHVucXVhbGlmaWVkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfQXJncyYuLi4gX19hcmdzKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIHRoaXMtPl9fY2FsbCh0cjE6OnRpZShfX2FyZ3MuLi4pLCBfQm91bmRfaW5kZXhlcygpKTsKKyAgICAgICAgfQorCisgICAgICAvLyBDYWxsIGFzIGNvbnN0CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfQXJncyYuLi4gX19hcmdzKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIHRoaXMtPl9fY2FsbCh0cjE6OnRpZShfX2FyZ3MuLi4pLCBfQm91bmRfaW5kZXhlcygpKTsKKyAgICAgICAgfQorCisgICAgICAvLyBDYWxsIGFzIHZvbGF0aWxlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfQXJncyYuLi4gX19hcmdzKSB2b2xhdGlsZQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIHRoaXMtPl9fY2FsbCh0cjE6OnRpZShfX2FyZ3MuLi4pLCBfQm91bmRfaW5kZXhlcygpKTsKKyAgICAgICAgfQorCisgICAgICAvLyBDYWxsIGFzIGNvbnN0IHZvbGF0aWxlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfQXJncyYuLi4gX19hcmdzKSBjb25zdCB2b2xhdGlsZQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIHRoaXMtPl9fY2FsbCh0cjE6OnRpZShfX2FyZ3MuLi4pLCBfQm91bmRfaW5kZXhlcygpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgLy8vIENsYXNzIHRlbXBsYXRlIF9CaW5kIGlzIGFsd2F5cyBhIGJpbmQgZXhwcmVzc2lvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPF9CaW5kPF9TaWduYXR1cmU+ID4KKyAgICB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIGNvbnN0IGJvb2wgaXNfYmluZF9leHByZXNzaW9uPF9CaW5kPF9TaWduYXR1cmU+ID46OnZhbHVlOworCisgIC8vLyBDbGFzcyB0ZW1wbGF0ZSBfQmluZCBpcyBhbHdheXMgYSBiaW5kIGV4cHJlc3Npb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjxjb25zdCBfQmluZDxfU2lnbmF0dXJlPiA+CisgICAgeyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBjb25zdCBib29sIGlzX2JpbmRfZXhwcmVzc2lvbjxjb25zdCBfQmluZDxfU2lnbmF0dXJlPiA+Ojp2YWx1ZTsKKworICAvLy8gQ2xhc3MgdGVtcGxhdGUgX0JpbmQgaXMgYWx3YXlzIGEgYmluZCBleHByZXNzaW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248dm9sYXRpbGUgX0JpbmQ8X1NpZ25hdHVyZT4gPgorICAgIHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgY29uc3QgYm9vbCBpc19iaW5kX2V4cHJlc3Npb248dm9sYXRpbGUgX0JpbmQ8X1NpZ25hdHVyZT4gPjo6dmFsdWU7CisKKyAgLy8vIENsYXNzIHRlbXBsYXRlIF9CaW5kIGlzIGFsd2F5cyBhIGJpbmQgZXhwcmVzc2lvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPGNvbnN0IHZvbGF0aWxlIF9CaW5kPF9TaWduYXR1cmU+ID4KKyAgICB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIGNvbnN0IGJvb2wgaXNfYmluZF9leHByZXNzaW9uPGNvbnN0IHZvbGF0aWxlIF9CaW5kPF9TaWduYXR1cmU+ID46OnZhbHVlOworCisgIC8vLyBDbGFzcyB0ZW1wbGF0ZSBfQmluZF9yZXN1bHQgaXMgYWx3YXlzIGEgYmluZCBleHByZXNzaW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248X0JpbmRfcmVzdWx0PF9SZXN1bHQsIF9TaWduYXR1cmU+ID4KKyAgICB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIGNvbnN0IGJvb2wgaXNfYmluZF9leHByZXNzaW9uPF9CaW5kX3Jlc3VsdDxfUmVzdWx0LCBfU2lnbmF0dXJlPiA+Ojp2YWx1ZTsKKworICAvLy8gQ2xhc3MgdGVtcGxhdGUgX0JpbmRfcmVzdWx0IGlzIGFsd2F5cyBhIGJpbmQgZXhwcmVzc2lvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPGNvbnN0IF9CaW5kX3Jlc3VsdDxfUmVzdWx0LCBfU2lnbmF0dXJlPiA+CisgICAgeyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBjb25zdCBib29sCisgICAgaXNfYmluZF9leHByZXNzaW9uPGNvbnN0IF9CaW5kX3Jlc3VsdDxfUmVzdWx0LCBfU2lnbmF0dXJlPiA+Ojp2YWx1ZTsKKworICAvLy8gQ2xhc3MgdGVtcGxhdGUgX0JpbmRfcmVzdWx0IGlzIGFsd2F5cyBhIGJpbmQgZXhwcmVzc2lvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPHZvbGF0aWxlIF9CaW5kX3Jlc3VsdDxfUmVzdWx0LCBfU2lnbmF0dXJlPiA+CisgICAgeyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBjb25zdCBib29sCisgICAgaXNfYmluZF9leHByZXNzaW9uPHZvbGF0aWxlIF9CaW5kX3Jlc3VsdDxfUmVzdWx0LCBfU2lnbmF0dXJlPiA+Ojp2YWx1ZTsKKworICAvLy8gQ2xhc3MgdGVtcGxhdGUgX0JpbmRfcmVzdWx0IGlzIGFsd2F5cyBhIGJpbmQgZXhwcmVzc2lvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QKKyAgICBpc19iaW5kX2V4cHJlc3Npb248Y29uc3Qgdm9sYXRpbGUgX0JpbmRfcmVzdWx0PF9SZXN1bHQsIF9TaWduYXR1cmU+ID4KKyAgICB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIGNvbnN0IGJvb2wKKyAgICBpc19iaW5kX2V4cHJlc3Npb248Y29uc3Qgdm9sYXRpbGUgX0JpbmRfcmVzdWx0PF9SZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU2lnbmF0dXJlPiA+Ojp2YWx1ZTsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPHN0ZDo6X0JpbmQ8X1NpZ25hdHVyZT4+CisgICAgOiB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjxjb25zdCBzdGQ6Ol9CaW5kPF9TaWduYXR1cmU+PgorICAgIDogdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248dm9sYXRpbGUgc3RkOjpfQmluZDxfU2lnbmF0dXJlPj4KKyAgICA6IHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPGNvbnN0IHZvbGF0aWxlIHN0ZDo6X0JpbmQ8X1NpZ25hdHVyZT4+CisgICAgOiB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjxzdGQ6Ol9CaW5kX3Jlc3VsdDxfUmVzdWx0LCBfU2lnbmF0dXJlPj4KKyAgICA6IHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPGNvbnN0IHN0ZDo6X0JpbmRfcmVzdWx0PF9SZXN1bHQsIF9TaWduYXR1cmU+PgorICAgIDogdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248dm9sYXRpbGUgc3RkOjpfQmluZF9yZXN1bHQ8X1Jlc3VsdCwgX1NpZ25hdHVyZT4+CisgICAgOiB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjxjb25zdCB2b2xhdGlsZSBzdGQ6Ol9CaW5kX3Jlc3VsdDxfUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NpZ25hdHVyZT4+CisgICAgOiB0cnVlX3R5cGUgeyB9OworI2VuZGlmCisKKyAgLy8vIGJpbmQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBpbmxpbmUKKyAgICBfQmluZDx0eXBlbmFtZSBfTWF5YmVfd3JhcF9tZW1iZXJfcG9pbnRlcjxfRnVuY3Rvcj46OnR5cGUoX0FyZ1R5cGVzLi4uKT4KKyAgICBiaW5kKF9GdW5jdG9yIF9fZiwgX0FyZ1R5cGVzLi4uIF9fYXJncykKKyAgICB7CisgICAgICB0eXBlZGVmIF9NYXliZV93cmFwX21lbWJlcl9wb2ludGVyPF9GdW5jdG9yPiBfX21heWJlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fbWF5YmVfdHlwZTo6dHlwZSBfX2Z1bmN0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0JpbmQ8X19mdW5jdG9yX3R5cGUoX0FyZ1R5cGVzLi4uKT4gX19yZXN1bHRfdHlwZTsKKyAgICAgIHJldHVybiBfX3Jlc3VsdF90eXBlKF9fbWF5YmVfdHlwZTo6X19kb193cmFwKF9fZiksIF9fYXJncy4uLik7CisgICAgfSAKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGlubGluZQorICAgIF9CaW5kX3Jlc3VsdDxfUmVzdWx0LAorCQkgdHlwZW5hbWUgX01heWJlX3dyYXBfbWVtYmVyX3BvaW50ZXI8X0Z1bmN0b3I+Ojp0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9BcmdUeXBlcy4uLik+CisgICAgYmluZChfRnVuY3RvciBfX2YsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpCisgICAgeworICAgICAgdHlwZWRlZiBfTWF5YmVfd3JhcF9tZW1iZXJfcG9pbnRlcjxfRnVuY3Rvcj4gX19tYXliZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX21heWJlX3R5cGU6OnR5cGUgX19mdW5jdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIF9CaW5kX3Jlc3VsdDxfUmVzdWx0LCBfX2Z1bmN0b3JfdHlwZShfQXJnVHlwZXMuLi4pPgorCV9fcmVzdWx0X3R5cGU7CisgICAgICByZXR1cm4gX19yZXN1bHRfdHlwZShfX21heWJlX3R5cGU6Ol9fZG9fd3JhcChfX2YpLCBfX2FyZ3MuLi4pOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBFeGNlcHRpb24gY2xhc3MgdGhyb3duIHdoZW4gY2xhc3MgdGVtcGxhdGUgZnVuY3Rpb24ncworICAgKiAgb3BlcmF0b3IoKSBpcyBjYWxsZWQgd2l0aCBhbiBlbXB0eSB0YXJnZXQuCisgICAqICBAaW5ncm91cCBleGNlcHRpb25zCisgICAqLworICBjbGFzcyBiYWRfZnVuY3Rpb25fY2FsbCA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbiB7IH07CisKKyAgLyoqCisgICAqICBUaGUgaW50ZWdyYWwgY29uc3RhbnQgZXhwcmVzc2lvbiAwIGNhbiBiZSBjb252ZXJ0ZWQgaW50byBhCisgICAqICBwb2ludGVyIHRvIHRoaXMgdHlwZS4gSXQgaXMgdXNlZCBieSB0aGUgZnVuY3Rpb24gdGVtcGxhdGUgdG8KKyAgICogIGFjY2VwdCBOVUxMIHBvaW50ZXJzLgorICAgKi8KKyAgc3RydWN0IF9NX2NsZWFyX3R5cGU7CisKKyAgLyoqCisgICAqICBUcmFpdCBpZGVudGlmeWluZyBAYSBsb2NhdGlvbi1pbnZhcmlhbnQgdHlwZXMsIG1lYW5pbmcgdGhhdCB0aGUKKyAgICogIGFkZHJlc3Mgb2YgdGhlIG9iamVjdCAob3IgYW55IG9mIGl0cyBtZW1iZXJzKSB3aWxsIG5vdCBlc2NhcGUuCisgICAqICBBbHNvIGltcGxpZXMgYSB0cml2aWFsIGNvcHkgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbG9jYXRpb25faW52YXJpYW50CisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAgICAgICAgICAgICAgICAgKGlzX3BvaW50ZXI8X1RwPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpc19tZW1iZXJfcG9pbnRlcjxfVHA+Ojp2YWx1ZSk+CisgICAgeworICAgIH07CisKKyAgY2xhc3MgX1VuZGVmaW5lZF9jbGFzczsKKworICB1bmlvbiBfTm9jb3B5X3R5cGVzCisgIHsKKyAgICB2b2lkKiAgICAgICBfTV9vYmplY3Q7CisgICAgY29uc3Qgdm9pZCogX01fY29uc3Rfb2JqZWN0OworICAgIHZvaWQgKCpfTV9mdW5jdGlvbl9wb2ludGVyKSgpOworICAgIHZvaWQgKF9VbmRlZmluZWRfY2xhc3M6OipfTV9tZW1iZXJfcG9pbnRlcikoKTsKKyAgfTsKKworICB1bmlvbiBfQW55X2RhdGEKKyAgeworICAgIHZvaWQqICAgICAgIF9NX2FjY2VzcygpICAgICAgIHsgcmV0dXJuICZfTV9wb2RfZGF0YVswXTsgfQorICAgIGNvbnN0IHZvaWQqIF9NX2FjY2VzcygpIGNvbnN0IHsgcmV0dXJuICZfTV9wb2RfZGF0YVswXTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwJgorICAgICAgX01fYWNjZXNzKCkKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxfVHAqPihfTV9hY2Nlc3MoKSk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIGNvbnN0IF9UcCYKKyAgICAgIF9NX2FjY2VzcygpIGNvbnN0CisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgX1RwKj4oX01fYWNjZXNzKCkpOyB9CisKKyAgICBfTm9jb3B5X3R5cGVzIF9NX3VudXNlZDsKKyAgICBjaGFyIF9NX3BvZF9kYXRhW3NpemVvZihfTm9jb3B5X3R5cGVzKV07CisgIH07CisKKyAgZW51bSBfTWFuYWdlcl9vcGVyYXRpb24KKyAgeworICAgIF9fZ2V0X3R5cGVfaW5mbywKKyAgICBfX2dldF9mdW5jdG9yX3B0ciwKKyAgICBfX2Nsb25lX2Z1bmN0b3IsCisgICAgX19kZXN0cm95X2Z1bmN0b3IKKyAgfTsKKworICAvLyBTaW1wbGUgdHlwZSB3cmFwcGVyIHRoYXQgaGVscHMgYXZvaWQgYW5ub3lpbmcgY29uc3QgcHJvYmxlbXMKKyAgLy8gd2hlbiBjYXN0aW5nIGJldHdlZW4gdm9pZCBwb2ludGVycyBhbmQgcG9pbnRlcnMtdG8tcG9pbnRlcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX1NpbXBsZV90eXBlX3dyYXBwZXIKKyAgICB7CisgICAgICBfU2ltcGxlX3R5cGVfd3JhcHBlcihfVHAgX192YWx1ZSkgOiBfX3ZhbHVlKF9fdmFsdWUpIHsgfQorCisgICAgICBfVHAgX192YWx1ZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19sb2NhdGlvbl9pbnZhcmlhbnQ8X1NpbXBsZV90eXBlX3dyYXBwZXI8X1RwPiA+CisgICAgOiBfX2lzX2xvY2F0aW9uX2ludmFyaWFudDxfVHA+CisgICAgeworICAgIH07CisKKyAgLy8gQ29udmVydHMgYSByZWZlcmVuY2UgdG8gYSBmdW5jdGlvbiBvYmplY3QgaW50byBhIGNhbGxhYmxlCisgIC8vIGZ1bmN0aW9uIG9iamVjdC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgaW5saW5lIF9GdW5jdG9yJgorICAgIF9fY2FsbGFibGVfZnVuY3RvcihfRnVuY3RvciYgX19mKQorICAgIHsgcmV0dXJuIF9fZjsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9NZW1iZXIsIHR5cGVuYW1lIF9DbGFzcz4KKyAgICBpbmxpbmUgX01lbV9mbjxfTWVtYmVyIF9DbGFzczo6Kj4KKyAgICBfX2NhbGxhYmxlX2Z1bmN0b3IoX01lbWJlciBfQ2xhc3M6OiogJl9fcCkKKyAgICB7IHJldHVybiBtZW1fZm4oX19wKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9NZW1iZXIsIHR5cGVuYW1lIF9DbGFzcz4KKyAgICBpbmxpbmUgX01lbV9mbjxfTWVtYmVyIF9DbGFzczo6Kj4KKyAgICBfX2NhbGxhYmxlX2Z1bmN0b3IoX01lbWJlciBfQ2xhc3M6OiogY29uc3QgJl9fcCkKKyAgICB7IHJldHVybiBtZW1fZm4oX19wKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgY2xhc3MgZnVuY3Rpb247CisKKyAgLy8vIEJhc2UgY2xhc3Mgb2YgYWxsIHBvbHltb3JwaGljIGZ1bmN0aW9uIG9iamVjdCB3cmFwcGVycy4KKyAgY2xhc3MgX0Z1bmN0aW9uX2Jhc2UKKyAgeworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2l6ZV90IF9NX21heF9zaXplID0gc2l6ZW9mKF9Ob2NvcHlfdHlwZXMpOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNpemVfdCBfTV9tYXhfYWxpZ24gPSBfX2FsaWdub2ZfXyhfTm9jb3B5X3R5cGVzKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorICAgICAgY2xhc3MgX0Jhc2VfbWFuYWdlcgorICAgICAgeworICAgICAgcHJvdGVjdGVkOgorCXN0YXRpYyBjb25zdCBib29sIF9fc3RvcmVkX2xvY2FsbHkgPQorICAgICAgICAoX19pc19sb2NhdGlvbl9pbnZhcmlhbnQ8X0Z1bmN0b3I+Ojp2YWx1ZQorICAgICAgICAgJiYgc2l6ZW9mKF9GdW5jdG9yKSA8PSBfTV9tYXhfc2l6ZQorICAgICAgICAgJiYgX19hbGlnbm9mX18oX0Z1bmN0b3IpIDw9IF9NX21heF9hbGlnbgorICAgICAgICAgJiYgKF9NX21heF9hbGlnbiAlIF9fYWxpZ25vZl9fKF9GdW5jdG9yKSA9PSAwKSk7CisJCisJdHlwZWRlZiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX3N0b3JlZF9sb2NhbGx5PiBfTG9jYWxfc3RvcmFnZTsKKworCS8vIFJldHJpZXZlIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gb2JqZWN0CisJc3RhdGljIF9GdW5jdG9yKgorCV9NX2dldF9wb2ludGVyKGNvbnN0IF9BbnlfZGF0YSYgX19zb3VyY2UpCisJeworCSAgY29uc3QgX0Z1bmN0b3IqIF9fcHRyID0KKwkgICAgX19zdG9yZWRfbG9jYWxseT8gc3RkOjpfX2FkZHJlc3NvZihfX3NvdXJjZS5fTV9hY2Nlc3M8X0Z1bmN0b3I+KCkpCisJICAgIC8qIGhhdmUgc3RvcmVkIGEgcG9pbnRlciAqLyA6IF9fc291cmNlLl9NX2FjY2VzczxfRnVuY3Rvcio+KCk7CisJICByZXR1cm4gY29uc3RfY2FzdDxfRnVuY3Rvcio+KF9fcHRyKTsKKwl9CisKKwkvLyBDbG9uZSBhIGxvY2F0aW9uLWludmFyaWFudCBmdW5jdGlvbiBvYmplY3QgdGhhdCBmaXRzIHdpdGhpbgorCS8vIGFuIF9BbnlfZGF0YSBzdHJ1Y3R1cmUuCisJc3RhdGljIHZvaWQKKwlfTV9jbG9uZShfQW55X2RhdGEmIF9fZGVzdCwgY29uc3QgX0FueV9kYXRhJiBfX3NvdXJjZSwgdHJ1ZV90eXBlKQorCXsKKwkgIG5ldyAoX19kZXN0Ll9NX2FjY2VzcygpKSBfRnVuY3RvcihfX3NvdXJjZS5fTV9hY2Nlc3M8X0Z1bmN0b3I+KCkpOworCX0KKworCS8vIENsb25lIGEgZnVuY3Rpb24gb2JqZWN0IHRoYXQgaXMgbm90IGxvY2F0aW9uLWludmFyaWFudCBvcgorCS8vIHRoYXQgY2Fubm90IGZpdCBpbnRvIGFuIF9BbnlfZGF0YSBzdHJ1Y3R1cmUuCisJc3RhdGljIHZvaWQKKwlfTV9jbG9uZShfQW55X2RhdGEmIF9fZGVzdCwgY29uc3QgX0FueV9kYXRhJiBfX3NvdXJjZSwgZmFsc2VfdHlwZSkKKwl7CisJICBfX2Rlc3QuX01fYWNjZXNzPF9GdW5jdG9yKj4oKSA9CisJICAgIG5ldyBfRnVuY3RvcigqX19zb3VyY2UuX01fYWNjZXNzPF9GdW5jdG9yKj4oKSk7CisJfQorCisJLy8gRGVzdHJveWluZyBhIGxvY2F0aW9uLWludmFyaWFudCBvYmplY3QgbWF5IHN0aWxsIHJlcXVpcmUKKwkvLyBkZXN0cnVjdGlvbi4KKwlzdGF0aWMgdm9pZAorCV9NX2Rlc3Ryb3koX0FueV9kYXRhJiBfX3ZpY3RpbSwgdHJ1ZV90eXBlKQorCXsKKwkgIF9fdmljdGltLl9NX2FjY2VzczxfRnVuY3Rvcj4oKS5+X0Z1bmN0b3IoKTsKKwl9CisJCisJLy8gRGVzdHJveWluZyBhbiBvYmplY3QgbG9jYXRlZCBvbiB0aGUgaGVhcC4KKwlzdGF0aWMgdm9pZAorCV9NX2Rlc3Ryb3koX0FueV9kYXRhJiBfX3ZpY3RpbSwgZmFsc2VfdHlwZSkKKwl7CisJICBkZWxldGUgX192aWN0aW0uX01fYWNjZXNzPF9GdW5jdG9yKj4oKTsKKwl9CisJCisgICAgICBwdWJsaWM6CisJc3RhdGljIGJvb2wKKwlfTV9tYW5hZ2VyKF9BbnlfZGF0YSYgX19kZXN0LCBjb25zdCBfQW55X2RhdGEmIF9fc291cmNlLAorCQkgICBfTWFuYWdlcl9vcGVyYXRpb24gX19vcCkKKwl7CisJICBzd2l0Y2ggKF9fb3ApCisJICAgIHsKKyNpZmRlZiBfX0dYWF9SVFRJCisJICAgIGNhc2UgX19nZXRfdHlwZV9pbmZvOgorCSAgICAgIF9fZGVzdC5fTV9hY2Nlc3M8Y29uc3QgdHlwZV9pbmZvKj4oKSA9ICZ0eXBlaWQoX0Z1bmN0b3IpOworCSAgICAgIGJyZWFrOworI2VuZGlmCisJICAgIGNhc2UgX19nZXRfZnVuY3Rvcl9wdHI6CisJICAgICAgX19kZXN0Ll9NX2FjY2VzczxfRnVuY3Rvcio+KCkgPSBfTV9nZXRfcG9pbnRlcihfX3NvdXJjZSk7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgX19jbG9uZV9mdW5jdG9yOgorCSAgICAgIF9NX2Nsb25lKF9fZGVzdCwgX19zb3VyY2UsIF9Mb2NhbF9zdG9yYWdlKCkpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgX19kZXN0cm95X2Z1bmN0b3I6CisJICAgICAgX01fZGVzdHJveShfX2Rlc3QsIF9Mb2NhbF9zdG9yYWdlKCkpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICByZXR1cm4gZmFsc2U7CisJfQorCisJc3RhdGljIHZvaWQKKwlfTV9pbml0X2Z1bmN0b3IoX0FueV9kYXRhJiBfX2Z1bmN0b3IsIGNvbnN0IF9GdW5jdG9yJiBfX2YpCisJeyBfTV9pbml0X2Z1bmN0b3IoX19mdW5jdG9yLCBfX2YsIF9Mb2NhbF9zdG9yYWdlKCkpOyB9CisJCisJdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKwkgIHN0YXRpYyBib29sCisJICBfTV9ub3RfZW1wdHlfZnVuY3Rpb24oY29uc3QgZnVuY3Rpb248X1NpZ25hdHVyZT4mIF9fZikKKyAgICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxib29sPihfX2YpOyB9CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisJICBzdGF0aWMgYm9vbAorCSAgX01fbm90X2VtcHR5X2Z1bmN0aW9uKGNvbnN0IF9UcComIF9fZnApCisJICB7IHJldHVybiBfX2ZwOyB9CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lIF9UcD4KKwkgIHN0YXRpYyBib29sCisJICBfTV9ub3RfZW1wdHlfZnVuY3Rpb24oX1RwIF9DbGFzczo6KiBjb25zdCYgX19tcCkKKwkgIHsgcmV0dXJuIF9fbXA7IH0KKworCXRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKwkgIHN0YXRpYyBib29sCisJICBfTV9ub3RfZW1wdHlfZnVuY3Rpb24oY29uc3QgX1RwJikKKwkgIHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgcHJpdmF0ZToKKwlzdGF0aWMgdm9pZAorCV9NX2luaXRfZnVuY3RvcihfQW55X2RhdGEmIF9fZnVuY3RvciwgY29uc3QgX0Z1bmN0b3ImIF9fZiwgdHJ1ZV90eXBlKQorCXsgbmV3IChfX2Z1bmN0b3IuX01fYWNjZXNzKCkpIF9GdW5jdG9yKF9fZik7IH0KKworCXN0YXRpYyB2b2lkCisJX01faW5pdF9mdW5jdG9yKF9BbnlfZGF0YSYgX19mdW5jdG9yLCBjb25zdCBfRnVuY3RvciYgX19mLCBmYWxzZV90eXBlKQorCXsgX19mdW5jdG9yLl9NX2FjY2VzczxfRnVuY3Rvcio+KCkgPSBuZXcgX0Z1bmN0b3IoX19mKTsgfQorICAgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorICAgICAgY2xhc3MgX1JlZl9tYW5hZ2VyIDogcHVibGljIF9CYXNlX21hbmFnZXI8X0Z1bmN0b3IqPgorICAgICAgeworCXR5cGVkZWYgX0Z1bmN0aW9uX2Jhc2U6Ol9CYXNlX21hbmFnZXI8X0Z1bmN0b3IqPiBfQmFzZTsKKworICAgIHB1YmxpYzoKKwlzdGF0aWMgYm9vbAorCV9NX21hbmFnZXIoX0FueV9kYXRhJiBfX2Rlc3QsIGNvbnN0IF9BbnlfZGF0YSYgX19zb3VyY2UsCisJCSAgIF9NYW5hZ2VyX29wZXJhdGlvbiBfX29wKQorCXsKKwkgIHN3aXRjaCAoX19vcCkKKwkgICAgeworI2lmZGVmIF9fR1hYX1JUVEkKKwkgICAgY2FzZSBfX2dldF90eXBlX2luZm86CisJICAgICAgX19kZXN0Ll9NX2FjY2Vzczxjb25zdCB0eXBlX2luZm8qPigpID0gJnR5cGVpZChfRnVuY3Rvcik7CisJICAgICAgYnJlYWs7CisjZW5kaWYKKwkgICAgY2FzZSBfX2dldF9mdW5jdG9yX3B0cjoKKwkgICAgICBfX2Rlc3QuX01fYWNjZXNzPF9GdW5jdG9yKj4oKSA9ICpfQmFzZTo6X01fZ2V0X3BvaW50ZXIoX19zb3VyY2UpOworCSAgICAgIHJldHVybiBpc19jb25zdDxfRnVuY3Rvcj46OnZhbHVlOworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBkZWZhdWx0OgorCSAgICAgIF9CYXNlOjpfTV9tYW5hZ2VyKF9fZGVzdCwgX19zb3VyY2UsIF9fb3ApOworCSAgICB9CisJICByZXR1cm4gZmFsc2U7CisJfQorCisJc3RhdGljIHZvaWQKKwlfTV9pbml0X2Z1bmN0b3IoX0FueV9kYXRhJiBfX2Z1bmN0b3IsIHJlZmVyZW5jZV93cmFwcGVyPF9GdW5jdG9yPiBfX2YpCisJeworCSAgX0Jhc2U6Ol9NX2luaXRfZnVuY3RvcihfX2Z1bmN0b3IsIHN0ZDo6X19hZGRyZXNzb2YoX19mLmdldCgpKSk7CisJfQorICAgICAgfTsKKworICAgIF9GdW5jdGlvbl9iYXNlKCkgOiBfTV9tYW5hZ2VyKDApIHsgfQorICAgIAorICAgIH5fRnVuY3Rpb25fYmFzZSgpCisgICAgeworICAgICAgaWYgKF9NX21hbmFnZXIpCisJX01fbWFuYWdlcihfTV9mdW5jdG9yLCBfTV9mdW5jdG9yLCBfX2Rlc3Ryb3lfZnVuY3Rvcik7CisgICAgfQorCisKKyAgICBib29sIF9NX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gIV9NX21hbmFnZXI7IH0KKworICAgIHR5cGVkZWYgYm9vbCAoKl9NYW5hZ2VyX3R5cGUpKF9BbnlfZGF0YSYsIGNvbnN0IF9BbnlfZGF0YSYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01hbmFnZXJfb3BlcmF0aW9uKTsKKworICAgIF9BbnlfZGF0YSAgICAgX01fZnVuY3RvcjsKKyAgICBfTWFuYWdlcl90eXBlIF9NX21hbmFnZXI7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZSwgdHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgY2xhc3MgX0Z1bmN0aW9uX2hhbmRsZXI7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfRnVuY3Rpb25faGFuZGxlcjxfUmVzKF9BcmdUeXBlcy4uLiksIF9GdW5jdG9yPgorICAgIDogcHVibGljIF9GdW5jdGlvbl9iYXNlOjpfQmFzZV9tYW5hZ2VyPF9GdW5jdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0Z1bmN0aW9uX2Jhc2U6Ol9CYXNlX21hbmFnZXI8X0Z1bmN0b3I+IF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgc3RhdGljIF9SZXMKKyAgICAgIF9NX2ludm9rZShjb25zdCBfQW55X2RhdGEmIF9fZnVuY3RvciwgX0FyZ1R5cGVzLi4uIF9fYXJncykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuICgqX0Jhc2U6Ol9NX2dldF9wb2ludGVyKF9fZnVuY3RvcikpKF9fYXJncy4uLik7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIF9GdW5jdGlvbl9oYW5kbGVyPHZvaWQoX0FyZ1R5cGVzLi4uKSwgX0Z1bmN0b3I+CisgICAgOiBwdWJsaWMgX0Z1bmN0aW9uX2Jhc2U6Ol9CYXNlX21hbmFnZXI8X0Z1bmN0b3I+CisgICAgeworICAgICAgdHlwZWRlZiBfRnVuY3Rpb25fYmFzZTo6X0Jhc2VfbWFuYWdlcjxfRnVuY3Rvcj4gX0Jhc2U7CisKKyAgICAgcHVibGljOgorICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9NX2ludm9rZShjb25zdCBfQW55X2RhdGEmIF9fZnVuY3RvciwgX0FyZ1R5cGVzLi4uIF9fYXJncykKKyAgICAgIHsKKyAgICAgICAgKCpfQmFzZTo6X01fZ2V0X3BvaW50ZXIoX19mdW5jdG9yKSkoX19hcmdzLi4uKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY2xhc3MgX0Z1bmN0aW9uX2hhbmRsZXI8X1JlcyhfQXJnVHlwZXMuLi4pLCByZWZlcmVuY2Vfd3JhcHBlcjxfRnVuY3Rvcj4gPgorICAgIDogcHVibGljIF9GdW5jdGlvbl9iYXNlOjpfUmVmX21hbmFnZXI8X0Z1bmN0b3I+CisgICAgeworICAgICAgdHlwZWRlZiBfRnVuY3Rpb25fYmFzZTo6X1JlZl9tYW5hZ2VyPF9GdW5jdG9yPiBfQmFzZTsKKworICAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgX1JlcworICAgICAgX01faW52b2tlKGNvbnN0IF9BbnlfZGF0YSYgX19mdW5jdG9yLCBfQXJnVHlwZXMuLi4gX19hcmdzKQorICAgICAgeworICAgICAgICByZXR1cm4gCisgICAgICAgICAgX19jYWxsYWJsZV9mdW5jdG9yKCoqX0Jhc2U6Ol9NX2dldF9wb2ludGVyKF9fZnVuY3RvcikpKF9fYXJncy4uLik7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIF9GdW5jdGlvbl9oYW5kbGVyPHZvaWQoX0FyZ1R5cGVzLi4uKSwgcmVmZXJlbmNlX3dyYXBwZXI8X0Z1bmN0b3I+ID4KKyAgICA6IHB1YmxpYyBfRnVuY3Rpb25fYmFzZTo6X1JlZl9tYW5hZ2VyPF9GdW5jdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0Z1bmN0aW9uX2Jhc2U6Ol9SZWZfbWFuYWdlcjxfRnVuY3Rvcj4gX0Jhc2U7CisKKyAgICAgcHVibGljOgorICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9NX2ludm9rZShjb25zdCBfQW55X2RhdGEmIF9fZnVuY3RvciwgX0FyZ1R5cGVzLi4uIF9fYXJncykKKyAgICAgIHsKKyAgICAgICAgX19jYWxsYWJsZV9mdW5jdG9yKCoqX0Jhc2U6Ol9NX2dldF9wb2ludGVyKF9fZnVuY3RvcikpKF9fYXJncy4uLik7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lIF9NZW1iZXIsIHR5cGVuYW1lIF9SZXMsIAorICAgICAgICAgICB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY2xhc3MgX0Z1bmN0aW9uX2hhbmRsZXI8X1JlcyhfQXJnVHlwZXMuLi4pLCBfTWVtYmVyIF9DbGFzczo6Kj4KKyAgICA6IHB1YmxpYyBfRnVuY3Rpb25faGFuZGxlcjx2b2lkKF9BcmdUeXBlcy4uLiksIF9NZW1iZXIgX0NsYXNzOjoqPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0Z1bmN0aW9uX2hhbmRsZXI8dm9pZChfQXJnVHlwZXMuLi4pLCBfTWVtYmVyIF9DbGFzczo6Kj4KKyAgICAgICAgX0Jhc2U7CisKKyAgICAgcHVibGljOgorICAgICAgc3RhdGljIF9SZXMKKyAgICAgIF9NX2ludm9rZShjb25zdCBfQW55X2RhdGEmIF9fZnVuY3RvciwgX0FyZ1R5cGVzLi4uIF9fYXJncykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIHRyMTo6CisJICBtZW1fZm4oX0Jhc2U6Ol9NX2dldF9wb2ludGVyKF9fZnVuY3RvciktPl9fdmFsdWUpKF9fYXJncy4uLik7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lIF9NZW1iZXIsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfRnVuY3Rpb25faGFuZGxlcjx2b2lkKF9BcmdUeXBlcy4uLiksIF9NZW1iZXIgX0NsYXNzOjoqPgorICAgIDogcHVibGljIF9GdW5jdGlvbl9iYXNlOjpfQmFzZV9tYW5hZ2VyPAorICAgICAgICAgICAgICAgICBfU2ltcGxlX3R5cGVfd3JhcHBlcjwgX01lbWJlciBfQ2xhc3M6OiogPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfTWVtYmVyIF9DbGFzczo6KiBfRnVuY3RvcjsKKyAgICAgIHR5cGVkZWYgX1NpbXBsZV90eXBlX3dyYXBwZXI8X0Z1bmN0b3I+IF9XcmFwcGVyOworICAgICAgdHlwZWRlZiBfRnVuY3Rpb25fYmFzZTo6X0Jhc2VfbWFuYWdlcjxfV3JhcHBlcj4gX0Jhc2U7CisKKyAgICAgcHVibGljOgorICAgICAgc3RhdGljIGJvb2wKKyAgICAgIF9NX21hbmFnZXIoX0FueV9kYXRhJiBfX2Rlc3QsIGNvbnN0IF9BbnlfZGF0YSYgX19zb3VyY2UsCisgICAgICAgICAgICAgICAgIF9NYW5hZ2VyX29wZXJhdGlvbiBfX29wKQorICAgICAgeworICAgICAgICBzd2l0Y2ggKF9fb3ApCisJICB7CisjaWZkZWYgX19HWFhfUlRUSQorCSAgY2FzZSBfX2dldF90eXBlX2luZm86CisJICAgIF9fZGVzdC5fTV9hY2Nlc3M8Y29uc3QgdHlwZV9pbmZvKj4oKSA9ICZ0eXBlaWQoX0Z1bmN0b3IpOworCSAgICBicmVhazsKKyNlbmRpZgkgICAgCisJICBjYXNlIF9fZ2V0X2Z1bmN0b3JfcHRyOgorCSAgICBfX2Rlc3QuX01fYWNjZXNzPF9GdW5jdG9yKj4oKSA9CisJICAgICAgJl9CYXNlOjpfTV9nZXRfcG9pbnRlcihfX3NvdXJjZSktPl9fdmFsdWU7CisJICAgIGJyZWFrOworCSAgICAKKwkgIGRlZmF1bHQ6CisJICAgIF9CYXNlOjpfTV9tYW5hZ2VyKF9fZGVzdCwgX19zb3VyY2UsIF9fb3ApOworCSAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfTV9pbnZva2UoY29uc3QgX0FueV9kYXRhJiBfX2Z1bmN0b3IsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpCisgICAgICB7CisJdHIxOjptZW1fZm4oX0Jhc2U6Ol9NX2dldF9wb2ludGVyKF9fZnVuY3RvciktPl9fdmFsdWUpKF9fYXJncy4uLik7CisgICAgICB9CisgICAgfTsKKworICAvLy8gY2xhc3MgZnVuY3Rpb24KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIGZ1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uKT4KKyAgICA6IHB1YmxpYyBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uPF9SZXMsIF9BcmdUeXBlcy4uLj4sCisgICAgICBwcml2YXRlIF9GdW5jdGlvbl9iYXNlCisgICAgeworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorICAgICAgLy8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIHNhZmVfYm9vbCBpZGlvbS4KKyAgICAgIHN0cnVjdCBfSGlkZGVuX3R5cGUKKyAgICAgIHsKKwlfSGlkZGVuX3R5cGUqIF9NX2Jvb2w7CisgICAgICB9OworCisgICAgICAvLy8gVGhpcyB0eXBlZGVmIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBzYWZlX2Jvb2wgaWRpb20uCisgICAgICB0eXBlZGVmIF9IaWRkZW5fdHlwZSogX0hpZGRlbl90eXBlOjoqIF9TYWZlX2Jvb2w7CisjZW5kaWYKKworICAgICAgdHlwZWRlZiBfUmVzIF9TaWduYXR1cmVfdHlwZShfQXJnVHlwZXMuLi4pOworICAgICAgCisgICAgICBzdHJ1Y3QgX1VzZWxlc3MgeyB9OworICAgICAgCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOworICAgICAgCisgICAgICAvLyBbMy43LjIuMV0gY29uc3RydWN0L2NvcHkvZGVzdHJveQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3QgY3JlYXRlcyBhbiBlbXB0eSBmdW5jdGlvbiBjYWxsIHdyYXBwZXIuCisgICAgICAgKiAgQHBvc3QgQGMgIShib29sKSp0aGlzCisgICAgICAgKi8KKyAgICAgIGZ1bmN0aW9uKCkgOiBfRnVuY3Rpb25fYmFzZSgpIHsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3QgY3JlYXRlcyBhbiBlbXB0eSBmdW5jdGlvbiBjYWxsIHdyYXBwZXIuCisgICAgICAgKiAgQHBvc3QgQGMgIShib29sKSp0aGlzCisgICAgICAgKi8KKyAgICAgIGZ1bmN0aW9uKF9NX2NsZWFyX3R5cGUqKSA6IF9GdW5jdGlvbl9iYXNlKCkgeyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAlRnVuY3Rpb24gY29weSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0geCBBICVmdW5jdGlvbiBvYmplY3Qgd2l0aCBpZGVudGljYWwgY2FsbCBzaWduYXR1cmUuCisgICAgICAgKiAgQHBvc3QgQGMgKGJvb2wpKnRoaXMgPT0gKGJvb2wpeAorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY3JlYXRlZCAlZnVuY3Rpb24gY29udGFpbnMgYSBjb3B5IG9mIHRoZSB0YXJnZXQgb2YgQGEKKyAgICAgICAqICB4IChpZiBpdCBoYXMgb25lKS4KKyAgICAgICAqLworICAgICAgZnVuY3Rpb24oY29uc3QgZnVuY3Rpb24mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBCdWlsZHMgYSAlZnVuY3Rpb24gdGhhdCB0YXJnZXRzIGEgY29weSBvZiB0aGUgaW5jb21pbmcKKyAgICAgICAqICBmdW5jdGlvbiBvYmplY3QuCisgICAgICAgKiAgQHBhcmFtIGYgQSAlZnVuY3Rpb24gb2JqZWN0IHRoYXQgaXMgY2FsbGFibGUgd2l0aCBwYXJhbWV0ZXJzIG9mCisgICAgICAgKiAgdHlwZSBAYyBUMSwgQGMgVDIsIC4uLiwgQGMgVE4gYW5kIHJldHVybnMgYSB2YWx1ZSBjb252ZXJ0aWJsZQorICAgICAgICogIHRvIEBjIFJlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJWZ1bmN0aW9uIG9iamVjdCB3aWxsIHRhcmdldCBhIGNvcHkgb2YgQGEKKyAgICAgICAqICBmLiBJZiBAYSBmIGlzIEBjIHJlZmVyZW5jZV93cmFwcGVyPEY+LCB0aGVuIHRoaXMgZnVuY3Rpb24KKyAgICAgICAqICBvYmplY3Qgd2lsbCBjb250YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvbiBvYmplY3QgQGMKKyAgICAgICAqICBmLmdldCgpLiBJZiBAYSBmIGlzIGEgTlVMTCBmdW5jdGlvbiBwb2ludGVyIG9yIE5VTEwKKyAgICAgICAqICBwb2ludGVyLXRvLW1lbWJlciwgdGhlIG5ld2x5LWNyZWF0ZWQgb2JqZWN0IHdpbGwgYmUgZW1wdHkuCisgICAgICAgKgorICAgICAgICogIElmIEBhIGYgaXMgYSBub24tTlVMTCBmdW5jdGlvbiBwb2ludGVyIG9yIGFuIG9iamVjdCBvZiB0eXBlIEBjCisgICAgICAgKiAgcmVmZXJlbmNlX3dyYXBwZXI8Rj4sIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorICAgICAgICBmdW5jdGlvbihfRnVuY3RvciBfX2YsCisgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNfaW50ZWdyYWw8X0Z1bmN0b3I+Ojp2YWx1ZSwgX1VzZWxlc3M+OjpfX3R5cGUKKyAgICAgICAgICAgICAgICAgICA9IF9Vc2VsZXNzKCkpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgJUZ1bmN0aW9uIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtIHggQSAlZnVuY3Rpb24gd2l0aCBpZGVudGljYWwgY2FsbCBzaWduYXR1cmUuCisgICAgICAgKiAgQHBvc3QgQGMgKGJvb2wpKnRoaXMgPT0gKGJvb2wpeAorICAgICAgICogIEByZXR1cm5zIEBjICp0aGlzCisgICAgICAgKgorICAgICAgICogIFRoZSB0YXJnZXQgb2YgQGEgeCBpcyBjb3BpZWQgdG8gQGMgKnRoaXMuIElmIEBhIHggaGFzIG5vCisgICAgICAgKiAgdGFyZ2V0LCB0aGVuIEBjICp0aGlzIHdpbGwgYmUgZW1wdHkuCisgICAgICAgKgorICAgICAgICogIElmIEBhIHggdGFyZ2V0cyBhIGZ1bmN0aW9uIHBvaW50ZXIgb3IgYSByZWZlcmVuY2UgdG8gYSBmdW5jdGlvbgorICAgICAgICogIG9iamVjdCwgdGhlbiB0aGlzIG9wZXJhdGlvbiB3aWxsIG5vdCB0aHJvdyBhbiAlZXhjZXB0aW9uLgorICAgICAgICovCisgICAgICBmdW5jdGlvbiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBmdW5jdGlvbiYgX194KQorICAgICAgeworICAgICAgICBmdW5jdGlvbihfX3gpLnN3YXAoKnRoaXMpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAlRnVuY3Rpb24gYXNzaWdubWVudCB0byB6ZXJvLgorICAgICAgICogIEBwb3N0IEBjICEoYm9vbCkqdGhpcworICAgICAgICogIEByZXR1cm5zIEBjICp0aGlzCisgICAgICAgKgorICAgICAgICogIFRoZSB0YXJnZXQgb2YgQGMgKnRoaXMgaXMgZGVhbGxvY2F0ZWQsIGxlYXZpbmcgaXQgZW1wdHkuCisgICAgICAgKi8KKyAgICAgIGZ1bmN0aW9uJgorICAgICAgb3BlcmF0b3I9KF9NX2NsZWFyX3R5cGUqKQorICAgICAgeworICAgICAgICBpZiAoX01fbWFuYWdlcikKKwkgIHsKKwkgICAgX01fbWFuYWdlcihfTV9mdW5jdG9yLCBfTV9mdW5jdG9yLCBfX2Rlc3Ryb3lfZnVuY3Rvcik7CisJICAgIF9NX21hbmFnZXIgPSAwOworCSAgICBfTV9pbnZva2VyID0gMDsKKwkgIH0KKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgJUZ1bmN0aW9uIGFzc2lnbm1lbnQgdG8gYSBuZXcgdGFyZ2V0LgorICAgICAgICogIEBwYXJhbSBmIEEgJWZ1bmN0aW9uIG9iamVjdCB0aGF0IGlzIGNhbGxhYmxlIHdpdGggcGFyYW1ldGVycyBvZgorICAgICAgICogIHR5cGUgQGMgVDEsIEBjIFQyLCAuLi4sIEBjIFROIGFuZCByZXR1cm5zIGEgdmFsdWUgY29udmVydGlibGUKKyAgICAgICAqICB0byBAYyBSZXMuCisgICAgICAgKiAgQHJldHVybiBAYyAqdGhpcworICAgICAgICoKKyAgICAgICAqICBUaGlzICAlZnVuY3Rpb24gb2JqZWN0IHdyYXBwZXIgd2lsbCB0YXJnZXQgYSBjb3B5IG9mIEBhCisgICAgICAgKiAgZi4gSWYgQGEgZiBpcyBAYyByZWZlcmVuY2Vfd3JhcHBlcjxGPiwgdGhlbiB0aGlzIGZ1bmN0aW9uCisgICAgICAgKiAgb2JqZWN0IHdpbGwgY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb24gb2JqZWN0IEBjCisgICAgICAgKiAgZi5nZXQoKS4gSWYgQGEgZiBpcyBhIE5VTEwgZnVuY3Rpb24gcG9pbnRlciBvciBOVUxMCisgICAgICAgKiAgcG9pbnRlci10by1tZW1iZXIsIEBjIHRoaXMgb2JqZWN0IHdpbGwgYmUgZW1wdHkuCisgICAgICAgKgorICAgICAgICogIElmIEBhIGYgaXMgYSBub24tTlVMTCBmdW5jdGlvbiBwb2ludGVyIG9yIGFuIG9iamVjdCBvZiB0eXBlIEBjCisgICAgICAgKiAgcmVmZXJlbmNlX3dyYXBwZXI8Rj4sIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorICAgICAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPCFpc19pbnRlZ3JhbDxfRnVuY3Rvcj46OnZhbHVlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24mPjo6X190eXBlCisJb3BlcmF0b3I9KF9GdW5jdG9yIF9fZikKKwl7CisJICBmdW5jdGlvbihfX2YpLnN3YXAoKnRoaXMpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgLy8gWzMuNy4yLjJdIGZ1bmN0aW9uIG1vZGlmaWVycworICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgU3dhcCB0aGUgdGFyZ2V0cyBvZiB0d28gJWZ1bmN0aW9uIG9iamVjdHMuCisgICAgICAgKiAgQHBhcmFtIGYgQSAlZnVuY3Rpb24gd2l0aCBpZGVudGljYWwgY2FsbCBzaWduYXR1cmUuCisgICAgICAgKgorICAgICAgICogIFN3YXAgdGhlIHRhcmdldHMgb2YgQGMgdGhpcyBmdW5jdGlvbiBvYmplY3QgYW5kIEBhIGYuIFRoaXMKKyAgICAgICAqICBmdW5jdGlvbiB3aWxsIG5vdCB0aHJvdyBhbiAlZXhjZXB0aW9uLgorICAgICAgICovCisgICAgICB2b2lkIHN3YXAoZnVuY3Rpb24mIF9feCkKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fZnVuY3RvciwgX194Ll9NX2Z1bmN0b3IpOworCXN0ZDo6c3dhcChfTV9tYW5hZ2VyLCBfX3guX01fbWFuYWdlcik7CisJc3RkOjpzd2FwKF9NX2ludm9rZXIsIF9feC5fTV9pbnZva2VyKTsKKyAgICAgIH0KKworICAgICAgLy8gWzMuNy4yLjNdIGZ1bmN0aW9uIGNhcGFjaXR5CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlICVmdW5jdGlvbiB3cmFwcGVyIGhhcyBhIHRhcmdldC4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiBAYyB0cnVlIHdoZW4gdGhpcyAlZnVuY3Rpb24gb2JqZWN0IGNvbnRhaW5zIGEgdGFyZ2V0LAorICAgICAgICogIG9yIEBjIGZhbHNlIHdoZW4gaXQgaXMgZW1wdHkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cgYW4gJWV4Y2VwdGlvbi4KKyAgICAgICAqLworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdAorICAgICAgeyByZXR1cm4gIV9NX2VtcHR5KCk7IH0KKyNlbHNlCisgICAgICBvcGVyYXRvciBfU2FmZV9ib29sKCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgaWYgKF9NX2VtcHR5KCkpCisJICByZXR1cm4gMDsKKwllbHNlCisJICByZXR1cm4gJl9IaWRkZW5fdHlwZTo6X01fYm9vbDsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvLyBbMy43LjIuNF0gZnVuY3Rpb24gaW52b2NhdGlvbgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgSW52b2tlcyB0aGUgZnVuY3Rpb24gdGFyZ2V0ZWQgYnkgQGMgKnRoaXMuCisgICAgICAgKiAgQHJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgdGFyZ2V0LgorICAgICAgICogIEB0aHJvd3MgYmFkX2Z1bmN0aW9uX2NhbGwgd2hlbiBAYyAhKGJvb2wpKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgVGhlIGZ1bmN0aW9uIGNhbGwgb3BlcmF0b3IgaW52b2tlcyB0aGUgdGFyZ2V0IGZ1bmN0aW9uIG9iamVjdAorICAgICAgICogIHN0b3JlZCBieSBAYyB0aGlzLgorICAgICAgICovCisgICAgICBfUmVzIG9wZXJhdG9yKCkoX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3Q7CisKKyNpZmRlZiBfX0dYWF9SVFRJCisgICAgICAvLyBbMy43LjIuNV0gZnVuY3Rpb24gdGFyZ2V0IGFjY2VzcworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIERldGVybWluZSB0aGUgdHlwZSBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgZnVuY3Rpb24gb2JqZWN0CisgICAgICAgKiAgd3JhcHBlci4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybnMgdGhlIHR5cGUgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGZ1bmN0aW9uIG9iamVjdCwgb3IKKyAgICAgICAqICBAYyB0eXBlaWQodm9pZCkgaWYgQGMgIShib29sKSp0aGlzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IHRocm93IGFuICVleGNlcHRpb24uCisgICAgICAgKi8KKyAgICAgIGNvbnN0IHR5cGVfaW5mbyYgdGFyZ2V0X3R5cGUoKSBjb25zdDsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEFjY2VzcyB0aGUgc3RvcmVkIHRhcmdldCBmdW5jdGlvbiBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0b3JlZCB0YXJnZXQgZnVuY3Rpb24gb2JqZWN0LAorICAgICAgICogIGlmIEBjIHR5cGVpZChGdW5jdG9yKS5lcXVhbHModGFyZ2V0X3R5cGUoKSk7IG90aGVyd2lzZSwgYSBOVUxMCisgICAgICAgKiAgcG9pbnRlci4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IHRocm93IGFuICVleGNlcHRpb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPiAgICAgICBfRnVuY3RvciogdGFyZ2V0KCk7CisgICAgICAKKyAgICAgIC8vLyBAb3ZlcmxvYWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPiBjb25zdCBfRnVuY3RvciogdGFyZ2V0KCkgY29uc3Q7CisjZW5kaWYKKworICAgIHByaXZhdGU6CisgICAgICAvLyBbMy43LjIuNl0gdW5kZWZpbmVkIG9wZXJhdG9ycworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0aW9uPgorCXZvaWQgb3BlcmF0b3I9PShjb25zdCBmdW5jdGlvbjxfRnVuY3Rpb24+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rpb24+CisJdm9pZCBvcGVyYXRvciE9KGNvbnN0IGZ1bmN0aW9uPF9GdW5jdGlvbj4mKSBjb25zdDsKKworICAgICAgdHlwZWRlZiBfUmVzICgqX0ludm9rZXJfdHlwZSkoY29uc3QgX0FueV9kYXRhJiwgX0FyZ1R5cGVzLi4uKTsKKyAgICAgIF9JbnZva2VyX3R5cGUgX01faW52b2tlcjsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pPjo6CisgICAgZnVuY3Rpb24oY29uc3QgZnVuY3Rpb24mIF9feCkKKyAgICA6IF9GdW5jdGlvbl9iYXNlKCkKKyAgICB7CisgICAgICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4oX194KSkKKwl7CisJICBfTV9pbnZva2VyID0gX194Ll9NX2ludm9rZXI7CisJICBfTV9tYW5hZ2VyID0gX194Ll9NX21hbmFnZXI7CisJICBfX3guX01fbWFuYWdlcihfTV9mdW5jdG9yLCBfX3guX01fZnVuY3RvciwgX19jbG9uZV9mdW5jdG9yKTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4KKyAgICAgIGZ1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uKT46OgorICAgICAgZnVuY3Rpb24oX0Z1bmN0b3IgX19mLAorCSAgICAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICAgICAgICAhaXNfaW50ZWdyYWw8X0Z1bmN0b3I+Ojp2YWx1ZSwgX1VzZWxlc3M+OjpfX3R5cGUpCisgICAgICA6IF9GdW5jdGlvbl9iYXNlKCkKKyAgICAgIHsKKwl0eXBlZGVmIF9GdW5jdGlvbl9oYW5kbGVyPF9TaWduYXR1cmVfdHlwZSwgX0Z1bmN0b3I+IF9NeV9oYW5kbGVyOworCisJaWYgKF9NeV9oYW5kbGVyOjpfTV9ub3RfZW1wdHlfZnVuY3Rpb24oX19mKSkKKwkgIHsKKwkgICAgX01faW52b2tlciA9ICZfTXlfaGFuZGxlcjo6X01faW52b2tlOworCSAgICBfTV9tYW5hZ2VyID0gJl9NeV9oYW5kbGVyOjpfTV9tYW5hZ2VyOworCSAgICBfTXlfaGFuZGxlcjo6X01faW5pdF9mdW5jdG9yKF9NX2Z1bmN0b3IsIF9fZik7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIF9SZXMKKyAgICBmdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLik+OjoKKyAgICBvcGVyYXRvcigpKF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgeworICAgICAgaWYgKF9NX2VtcHR5KCkpCisJX0dMSUJDWFhfVEhST1dfT1JfQUJPUlQoYmFkX2Z1bmN0aW9uX2NhbGwoKSk7CisgICAgICByZXR1cm4gX01faW52b2tlcihfTV9mdW5jdG9yLCBfX2FyZ3MuLi4pOworICAgIH0KKworI2lmZGVmIF9fR1hYX1JUVEkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNvbnN0IHR5cGVfaW5mbyYKKyAgICBmdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLik+OjoKKyAgICB0YXJnZXRfdHlwZSgpIGNvbnN0CisgICAgeworICAgICAgaWYgKF9NX21hbmFnZXIpCisgICAgICAgIHsKKyAgICAgICAgICBfQW55X2RhdGEgX190eXBlaW5mb19yZXN1bHQ7CisgICAgICAgICAgX01fbWFuYWdlcihfX3R5cGVpbmZvX3Jlc3VsdCwgX01fZnVuY3RvciwgX19nZXRfdHlwZV9pbmZvKTsKKyAgICAgICAgICByZXR1cm4gKl9fdHlwZWluZm9fcmVzdWx0Ll9NX2FjY2Vzczxjb25zdCB0eXBlX2luZm8qPigpOworICAgICAgICB9CisgICAgICBlbHNlCisJcmV0dXJuIHR5cGVpZCh2b2lkKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorICAgICAgX0Z1bmN0b3IqCisgICAgICBmdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLik+OjoKKyAgICAgIHRhcmdldCgpCisgICAgICB7CisJaWYgKHR5cGVpZChfRnVuY3RvcikgPT0gdGFyZ2V0X3R5cGUoKSAmJiBfTV9tYW5hZ2VyKQorCSAgeworCSAgICBfQW55X2RhdGEgX19wdHI7CisJICAgIGlmIChfTV9tYW5hZ2VyKF9fcHRyLCBfTV9mdW5jdG9yLCBfX2dldF9mdW5jdG9yX3B0cikKKwkJJiYgIWlzX2NvbnN0PF9GdW5jdG9yPjo6dmFsdWUpCisJICAgICAgcmV0dXJuIDA7CisJICAgIGVsc2UKKwkgICAgICByZXR1cm4gX19wdHIuX01fYWNjZXNzPF9GdW5jdG9yKj4oKTsKKwkgIH0KKwllbHNlCisJICByZXR1cm4gMDsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgICBjb25zdCBfRnVuY3RvcioKKyAgICAgIGZ1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uKT46OgorICAgICAgdGFyZ2V0KCkgY29uc3QKKyAgICAgIHsKKwlpZiAodHlwZWlkKF9GdW5jdG9yKSA9PSB0YXJnZXRfdHlwZSgpICYmIF9NX21hbmFnZXIpCisJICB7CisJICAgIF9BbnlfZGF0YSBfX3B0cjsKKwkgICAgX01fbWFuYWdlcihfX3B0ciwgX01fZnVuY3RvciwgX19nZXRfZnVuY3Rvcl9wdHIpOworCSAgICByZXR1cm4gX19wdHIuX01fYWNjZXNzPGNvbnN0IF9GdW5jdG9yKj4oKTsKKwkgIH0KKwllbHNlCisJICByZXR1cm4gMDsKKyAgICAgIH0KKyNlbmRpZgorCisgIC8vIFszLjcuMi43XSBudWxsIHBvaW50ZXIgY29tcGFyaXNvbnMKKworICAvKioKKyAgICogIEBicmllZiBDb21wYXJlcyBhIHBvbHltb3JwaGljIGZ1bmN0aW9uIG9iamVjdCB3cmFwcGVyIGFnYWluc3QgMAorICAgKiAgKHRoZSBOVUxMIHBvaW50ZXIpLgorICAgKiAgQHJldHVybnMgQGMgdHJ1ZSBpZiB0aGUgd3JhcHBlciBoYXMgbm8gdGFyZ2V0LCBAYyBmYWxzZSBvdGhlcndpc2UKKyAgICoKKyAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cgYW4gJWV4Y2VwdGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGZ1bmN0aW9uPF9TaWduYXR1cmU+JiBfX2YsIF9NX2NsZWFyX3R5cGUqKQorICAgIHsgcmV0dXJuICFzdGF0aWNfY2FzdDxib29sPihfX2YpOyB9CisKKyAgLy8vIEBvdmVybG9hZAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShfTV9jbGVhcl90eXBlKiwgY29uc3QgZnVuY3Rpb248X1NpZ25hdHVyZT4mIF9fZikKKyAgICB7IHJldHVybiAhc3RhdGljX2Nhc3Q8Ym9vbD4oX19mKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENvbXBhcmVzIGEgcG9seW1vcnBoaWMgZnVuY3Rpb24gb2JqZWN0IHdyYXBwZXIgYWdhaW5zdCAwCisgICAqICAodGhlIE5VTEwgcG9pbnRlcikuCisgICAqICBAcmV0dXJucyBAYyBmYWxzZSBpZiB0aGUgd3JhcHBlciBoYXMgbm8gdGFyZ2V0LCBAYyB0cnVlIG90aGVyd2lzZQorICAgKgorICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCB0aHJvdyBhbiAlZXhjZXB0aW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgZnVuY3Rpb248X1NpZ25hdHVyZT4mIF9fZiwgX01fY2xlYXJfdHlwZSopCisgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX19mKTsgfQorCisgIC8vLyBAb3ZlcmxvYWQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oX01fY2xlYXJfdHlwZSosIGNvbnN0IGZ1bmN0aW9uPF9TaWduYXR1cmU+JiBfX2YpCisgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX19mKTsgfQorCisgIC8vIFszLjcuMi44XSBzcGVjaWFsaXplZCBhbGdvcml0aG1zCisKKyAgLyoqCisgICAqICBAYnJpZWYgU3dhcCB0aGUgdGFyZ2V0cyBvZiB0d28gcG9seW1vcnBoaWMgZnVuY3Rpb24gb2JqZWN0IHdyYXBwZXJzLgorICAgKgorICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCB0aHJvdyBhbiAlZXhjZXB0aW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoZnVuY3Rpb248X1NpZ25hdHVyZT4mIF9feCwgZnVuY3Rpb248X1NpZ25hdHVyZT4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lPiBzdHJ1Y3QgaXNfcGxhY2Vob2xkZXI7CisKKyAgdGVtcGxhdGU8aW50IF9OdW0+CisgICAgc3RydWN0IGlzX3BsYWNlaG9sZGVyPHRyMTo6X1BsYWNlaG9sZGVyPF9OdW0+PgorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8aW50LCBfTnVtPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTxpbnQgX051bT4KKyAgICBzdHJ1Y3QgaXNfcGxhY2Vob2xkZXI8Y29uc3QgdHIxOjpfUGxhY2Vob2xkZXI8X051bT4+CisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxpbnQsIF9OdW0+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lPiBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjx0cjE6Ol9CaW5kPF9TaWduYXR1cmU+PgorICAgIDogdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248Y29uc3QgdHIxOjpfQmluZDxfU2lnbmF0dXJlPj4KKyAgICA6IHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPHZvbGF0aWxlIHRyMTo6X0JpbmQ8X1NpZ25hdHVyZT4+CisgICAgOiB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjxjb25zdCB2b2xhdGlsZSB0cjE6Ol9CaW5kPF9TaWduYXR1cmU+PgorICAgIDogdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248dHIxOjpfQmluZF9yZXN1bHQ8X1Jlc3VsdCwgX1NpZ25hdHVyZT4+CisgICAgOiB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjxjb25zdCB0cjE6Ol9CaW5kX3Jlc3VsdDxfUmVzdWx0LCBfU2lnbmF0dXJlPj4KKyAgICA6IHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgaXNfYmluZF9leHByZXNzaW9uPHZvbGF0aWxlIHRyMTo6X0JpbmRfcmVzdWx0PF9SZXN1bHQsIF9TaWduYXR1cmU+PgorICAgIDogdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248Y29uc3Qgdm9sYXRpbGUgdHIxOjpfQmluZF9yZXN1bHQ8X1Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TaWduYXR1cmU+PgorICAgIDogdHJ1ZV90eXBlIHsgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisjZW5kaWYKK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9GVU5DVElPTkFMCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9mdW5jdGlvbmFsX2hhc2guaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2Z1bmN0aW9uYWxfaGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNzRhMTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9mdW5jdGlvbmFsX2hhc2guaApAQCAtMCwwICsxLDE5NiBAQAorLy8gVFIxIGZ1bmN0aW9uYWxfaGFzaC5oIGhlYWRlciAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2Z1bmN0aW9uYWxfaGFzaC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dHIxL2Z1bmN0aW9uYWx9CisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfRlVOQ1RJT05BTF9IQVNIX0gKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0ZVTkNUSU9OQUxfSEFTSF9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8vIENsYXNzIHRlbXBsYXRlIGhhc2guCisgIC8vIERlY2xhcmF0aW9uIG9mIGRlZmF1bHQgaGFzaCBmdW5jdG9yIHN0ZDo6dHIxOjpoYXNoLiAgVGhlIHR5cGVzIGZvcgorICAvLyB3aGljaCBzdGQ6OnRyMTo6aGFzaDxUPiBpcyB3ZWxsLWRlZmluZWQgaXMgaW4gY2xhdXNlIDYuMy4zLiBvZiB0aGUgUERUUi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBoYXNoIDogcHVibGljIHN0ZDo6dW5hcnlfZnVuY3Rpb248X1RwLCBzaXplX3Q+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKF9UcCBfX3ZhbCkgY29uc3Q7CisgICAgfTsKKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbnMgZm9yIHBvaW50ZXIgdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzaDxfVHAqPiA6IHB1YmxpYyBzdGQ6OnVuYXJ5X2Z1bmN0aW9uPF9UcCosIHNpemVfdD4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoX1RwKiBfX3ApIGNvbnN0CisgICAgICB7IHJldHVybiByZWludGVycHJldF9jYXN0PHNpemVfdD4oX19wKTsgfQorICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9ucyBmb3IgaW50ZWdlciB0eXBlcy4KKyNkZWZpbmUgX1RSMV9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChfVHApIAlcCisgIHRlbXBsYXRlPD4JCQkJCQlcCisgICAgaW5saW5lIHNpemVfdAkJCQkJXAorICAgIGhhc2g8X1RwPjo6b3BlcmF0b3IoKShfVHAgX192YWwpIGNvbnN0CQlcCisgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihfX3ZhbCk7IH0KKworICBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKGJvb2wpOworICBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKGNoYXIpOworICBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHNpZ25lZCBjaGFyKTsKKyAgX1RSMV9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaCh1bnNpZ25lZCBjaGFyKTsKKyAgX1RSMV9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaCh3Y2hhcl90KTsKKyAgX1RSMV9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChzaG9ydCk7CisgIF9UUjFfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2goaW50KTsKKyAgX1RSMV9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChsb25nKTsKKyAgX1RSMV9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChsb25nIGxvbmcpOworICBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHVuc2lnbmVkIHNob3J0KTsKKyAgX1RSMV9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaCh1bnNpZ25lZCBpbnQpOworICBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHVuc2lnbmVkIGxvbmcpOworICBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHVuc2lnbmVkIGxvbmcgbG9uZyk7CisKKyN1bmRlZiBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoCisKKyAgLy8gRm93bGVyIC8gTm9sbCAvIFZvIChGTlYpIEhhc2ggKHR5cGUgRk5WLTFhKQorICAvLyAoVXNlZCBieSB0aGUgbmV4dCBzcGVjaWFsaXphdGlvbnMgb2Ygc3RkOjp0cjE6Omhhc2guKQorCisgIC8vLyBEdW1teSBnZW5lcmljIGltcGxlbWVudGF0aW9uIChmb3Igc2l6ZW9mKHNpemVfdCkgIT0gNCwgOCkuCisgIHRlbXBsYXRlPHNpemVfdD4KKyAgICBzdHJ1Y3QgX0Zudl9oYXNoX2Jhc2UKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0YXRpYyBzaXplX3QKKyAgICAgICAgaGFzaChjb25zdCBfVHAqIF9fcHRyLCBzaXplX3QgX19jbGVuZ3RoKQorICAgICAgICB7CisJICBzaXplX3QgX19yZXN1bHQgPSAwOworCSAgY29uc3QgY2hhciogX19jcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oX19wdHIpOworCSAgZm9yICg7IF9fY2xlbmd0aDsgLS1fX2NsZW5ndGgpCisJICAgIF9fcmVzdWx0ID0gKF9fcmVzdWx0ICogMTMxKSArICpfX2NwdHIrKzsKKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9GbnZfaGFzaF9iYXNlPDQ+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBzdGF0aWMgc2l6ZV90CisgICAgICAgIGhhc2goY29uc3QgX1RwKiBfX3B0ciwgc2l6ZV90IF9fY2xlbmd0aCkKKyAgICAgICAgeworCSAgc2l6ZV90IF9fcmVzdWx0ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PigyMTY2MTM2MjYxVUwpOworCSAgY29uc3QgY2hhciogX19jcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oX19wdHIpOworCSAgZm9yICg7IF9fY2xlbmd0aDsgLS1fX2NsZW5ndGgpCisJICAgIHsKKwkgICAgICBfX3Jlc3VsdCBePSBzdGF0aWNfY2FzdDxzaXplX3Q+KCpfX2NwdHIrKyk7CisJICAgICAgX19yZXN1bHQgKj0gc3RhdGljX2Nhc3Q8c2l6ZV90PigxNjc3NzYxOVVMKTsKKwkgICAgfQorCSAgcmV0dXJuIF9fcmVzdWx0OworCX0KKyAgICB9OworICAKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfRm52X2hhc2hfYmFzZTw4PgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgc3RhdGljIHNpemVfdAorICAgICAgICBoYXNoKGNvbnN0IF9UcCogX19wdHIsIHNpemVfdCBfX2NsZW5ndGgpCisgICAgICAgIHsKKwkgIHNpemVfdCBfX3Jlc3VsdAorCSAgICA9IHN0YXRpY19jYXN0PHNpemVfdD4oMTQ2OTU5ODEwMzkzNDY2NTYwMzdVTEwpOworCSAgY29uc3QgY2hhciogX19jcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oX19wdHIpOworCSAgZm9yICg7IF9fY2xlbmd0aDsgLS1fX2NsZW5ndGgpCisJICAgIHsKKwkgICAgICBfX3Jlc3VsdCBePSBzdGF0aWNfY2FzdDxzaXplX3Q+KCpfX2NwdHIrKyk7CisJICAgICAgX19yZXN1bHQgKj0gc3RhdGljX2Nhc3Q8c2l6ZV90PigxMDk5NTExNjI4MjExVUxMKTsKKwkgICAgfQorCSAgcmV0dXJuIF9fcmVzdWx0OworCX0KKyAgICB9OworCisgIHN0cnVjdCBfRm52X2hhc2gKKyAgOiBwdWJsaWMgX0Zudl9oYXNoX2Jhc2U8c2l6ZW9mKHNpemVfdCk+CisgIHsKKyAgICB1c2luZyBfRm52X2hhc2hfYmFzZTxzaXplb2Yoc2l6ZV90KT46Omhhc2g7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBzdGF0aWMgc2l6ZV90CisgICAgICBoYXNoKGNvbnN0IF9UcCYgX192YWwpCisgICAgICB7IHJldHVybiBoYXNoKCZfX3ZhbCwgc2l6ZW9mKF9fdmFsKSk7IH0KKyAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb25zIGZvciBmbG9hdC4KKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSBzaXplX3QKKyAgICBoYXNoPGZsb2F0Pjo6b3BlcmF0b3IoKShmbG9hdCBfX3ZhbCkgY29uc3QKKyAgICB7CisgICAgICAvLyAwIGFuZCAtMCBib3RoIGhhc2ggdG8gemVyby4KKyAgICAgIHJldHVybiBfX3ZhbCAhPSAwLjBmID8gc3RkOjp0cjE6Ol9GbnZfaGFzaDo6aGFzaChfX3ZhbCkgOiAwOworICAgIH0KKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb25zIGZvciBkb3VibGUuCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgc2l6ZV90CisgICAgaGFzaDxkb3VibGU+OjpvcGVyYXRvcigpKGRvdWJsZSBfX3ZhbCkgY29uc3QKKyAgICB7CisgICAgICAvLyAwIGFuZCAtMCBib3RoIGhhc2ggdG8gemVyby4KKyAgICAgIHJldHVybiBfX3ZhbCAhPSAwLjAgPyBzdGQ6OnRyMTo6X0Zudl9oYXNoOjpoYXNoKF9fdmFsKSA6IDA7CisgICAgfQorCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbnMgZm9yIGxvbmcgZG91YmxlLgorICB0ZW1wbGF0ZTw+CisgICAgX0dMSUJDWFhfUFVSRSBzaXplX3QKKyAgICBoYXNoPGxvbmcgZG91YmxlPjo6b3BlcmF0b3IoKShsb25nIGRvdWJsZSBfX3ZhbCkgY29uc3Q7CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIG9mIG1lbWJlciBvcGVyYXRvciBmb3Igbm9uLWJ1aWx0aW4gdHlwZXMuCisgIHRlbXBsYXRlPD4KKyAgICBfR0xJQkNYWF9QVVJFIHNpemVfdAorICAgIGhhc2g8c3RyaW5nPjo6b3BlcmF0b3IoKShzdHJpbmcpIGNvbnN0OworCisgIHRlbXBsYXRlPD4KKyAgICBfR0xJQkNYWF9QVVJFIHNpemVfdAorICAgIGhhc2g8Y29uc3Qgc3RyaW5nJj46Om9wZXJhdG9yKCkoY29uc3Qgc3RyaW5nJikgY29uc3Q7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+CisgICAgX0dMSUJDWFhfUFVSRSBzaXplX3QKKyAgICBoYXNoPHdzdHJpbmc+OjpvcGVyYXRvcigpKHdzdHJpbmcpIGNvbnN0OworCisgIHRlbXBsYXRlPD4KKyAgICBfR0xJQkNYWF9QVVJFIHNpemVfdAorICAgIGhhc2g8Y29uc3Qgd3N0cmluZyY+OjpvcGVyYXRvcigpKGNvbnN0IHdzdHJpbmcmKSBjb25zdDsKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9GVU5DVElPTkFMX0hBU0hfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvZ2FtbWEudGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvZ2FtbWEudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzE5YTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9nYW1tYS50Y2MKQEAgLTAsMCArMSw0NjkgQEAKKy8vIFNwZWNpYWwgZnVuY3Rpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2dhbW1hLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3RyMS9jbWF0aH0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MiBUUjE6IDUuMiAgU3BlY2lhbCBmdW5jdGlvbnMKKy8vCisKKy8vIFdyaXR0ZW4gYnkgRWR3YXJkIFNtaXRoLVJvd2xhbmQgYmFzZWQgb246CisvLyAgICgxKSBIYW5kYm9vayBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zLAorLy8gICAgICAgZWQuIE1pbHRvbiBBYnJhbW93aXR6IGFuZCBJcmVuZSBBLiBTdGVndW4sCisvLyAgICAgICBEb3ZlciBQdWJsaWNhdGlvbnMsCisvLyAgICAgICBTZWN0aW9uIDYsIHBwLiAyNTMtMjY2CisvLyAgICgyKSBUaGUgR251IFNjaWVudGlmaWMgTGlicmFyeSwgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dzbAorLy8gICAoMykgTnVtZXJpY2FsIFJlY2lwZXMgaW4gQywgYnkgVy4gSC4gUHJlc3MsIFMuIEEuIFRldWtvbHNreSwKKy8vICAgICAgIFcuIFQuIFZldHRlcmxpbmcsIEIuIFAuIEZsYW5uZXJ5LCBDYW1icmlkZ2UgVW5pdmVyc2l0eSBQcmVzcyAoMTk5MiksCisvLyAgICAgICAybmQgZWQsIHBwLiAyMTMtMjE2CisvLyAgICg0KSBHYW1tYSwgRXhwbG9yaW5nIEV1bGVyJ3MgQ29uc3RhbnQsIEp1bGlhbiBIYXZpbCwKKy8vICAgICAgIFByaW5jZXRvbiwgMjAwMy4KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfR0FNTUFfVENDCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9HQU1NQV9UQ0MgMQorCisjaW5jbHVkZSAic3BlY2lhbF9mdW5jdGlvbl91dGlsLmgiCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworICAvLyBJbXBsZW1lbnRhdGlvbi1zcGFjZSBkZXRhaWxzLgorICBuYW1lc3BhY2UgX19kZXRhaWwKKyAgeworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgICAgLyoqCisgICAgICogICBAYnJpZWYgVGhpcyByZXR1cm5zIEJlcm5vdWxsaSBudW1iZXJzIGZyb20gYSB0YWJsZSBvciBieSBzdW1tYXRpb24KKyAgICAgKiAgICAgICAgICBmb3IgbGFyZ2VyIHZhbHVlcy4KKyAgICAgKgorICAgICAqICAgUmVjdXJzaW9uIGlzIHVuc3RhYmxlLgorICAgICAqCisgICAgICogICBAcGFyYW0gX19uIHRoZSBvcmRlciBuIG9mIHRoZSBCZXJub3VsbGkgbnVtYmVyLgorICAgICAqICAgQHJldHVybiAgVGhlIEJlcm5vdWxsaSBudW1iZXIgb2Ygb3JkZXIgbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fYmVybm91bGxpX3Nlcmllcyh1bnNpZ25lZCBpbnQgX19uKQorICAgIHsKKworICAgICAgc3RhdGljIGNvbnN0IF9UcCBfX251bVsyOF0gPSB7CisgICAgICAgIF9UcCgxVUwpLCAgICAgICAgICAgICAgICAgICAgICAgIC1fVHAoMVVMKSAvIF9UcCgyVUwpLAorICAgICAgICBfVHAoMVVMKSAvIF9UcCg2VUwpLCAgICAgICAgICAgICBfVHAoMFVMKSwKKyAgICAgICAgLV9UcCgxVUwpIC8gX1RwKDMwVUwpLCAgICAgICAgICAgX1RwKDBVTCksCisgICAgICAgIF9UcCgxVUwpIC8gX1RwKDQyVUwpLCAgICAgICAgICAgIF9UcCgwVUwpLAorICAgICAgICAtX1RwKDFVTCkgLyBfVHAoMzBVTCksICAgICAgICAgICBfVHAoMFVMKSwKKyAgICAgICAgX1RwKDVVTCkgLyBfVHAoNjZVTCksICAgICAgICAgICAgX1RwKDBVTCksCisgICAgICAgIC1fVHAoNjkxVUwpIC8gX1RwKDI3MzBVTCksICAgICAgIF9UcCgwVUwpLAorICAgICAgICBfVHAoN1VMKSAvIF9UcCg2VUwpLCAgICAgICAgICAgICBfVHAoMFVMKSwKKyAgICAgICAgLV9UcCgzNjE3VUwpIC8gX1RwKDUxMFVMKSwgICAgICAgX1RwKDBVTCksCisgICAgICAgIF9UcCg0Mzg2N1VMKSAvIF9UcCg3OThVTCksICAgICAgIF9UcCgwVUwpLAorICAgICAgICAtX1RwKDE3NDYxMSkgLyBfVHAoMzMwVUwpLCAgICAgICBfVHAoMFVMKSwKKyAgICAgICAgX1RwKDg1NDUxM1VMKSAvIF9UcCgxMzhVTCksICAgICAgX1RwKDBVTCksCisgICAgICAgIC1fVHAoMjM2MzY0MDkxVUwpIC8gX1RwKDI3MzBVTCksIF9UcCgwVUwpLAorICAgICAgICBfVHAoODU1MzEwM1VMKSAvIF9UcCg2VUwpLCAgICAgICBfVHAoMFVMKQorICAgICAgfTsKKworICAgICAgaWYgKF9fbiA9PSAwKQorICAgICAgICByZXR1cm4gX1RwKDEpOworCisgICAgICBpZiAoX19uID09IDEpCisgICAgICAgIHJldHVybiAtX1RwKDEpIC8gX1RwKDIpOworCisgICAgICAvLyAgVGFrZSBjYXJlIG9mIHRoZSByZXN0IG9mIHRoZSBvZGQgb25lcy4KKyAgICAgIGlmIChfX24gJSAyID09IDEpCisgICAgICAgIHJldHVybiBfVHAoMCk7CisKKyAgICAgIC8vICBUYWtlIGNhcmUgb2Ygc29tZSBzbWFsbCBldmVucyB0aGF0IGFyZSBwYWluZnVsIGZvciB0aGUgc2VyaWVzLgorICAgICAgaWYgKF9fbiA8IDI4KQorICAgICAgICByZXR1cm4gX19udW1bX19uXTsKKworCisgICAgICBfVHAgX19mYWN0ID0gX1RwKDEpOworICAgICAgaWYgKChfX24gLyAyKSAlIDIgPT0gMCkKKyAgICAgICAgX19mYWN0ICo9IF9UcCgtMSk7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2sgPSAxOyBfX2sgPD0gX19uOyArK19faykKKyAgICAgICAgX19mYWN0ICo9IF9fayAvIChfVHAoMikgKiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSk7CisgICAgICBfX2ZhY3QgKj0gX1RwKDIpOworCisgICAgICBfVHAgX19zdW0gPSBfVHAoMCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAxOyBfX2kgPCAxMDAwOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX3Rlcm0gPSBzdGQ6OnBvdyhfVHAoX19pKSwgLV9UcChfX24pKTsKKyAgICAgICAgICBpZiAoX190ZXJtIDwgc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBfX3N1bSArPSBfX3Rlcm07CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIF9fZmFjdCAqIF9fc3VtOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgVGhpcyByZXR1cm5zIEJlcm5vdWxsaSBudW1iZXIgXGYkQl9uXGYkLgorICAgICAqCisgICAgICogICBAcGFyYW0gX19uIHRoZSBvcmRlciBuIG9mIHRoZSBCZXJub3VsbGkgbnVtYmVyLgorICAgICAqICAgQHJldHVybiAgVGhlIEJlcm5vdWxsaSBudW1iZXIgb2Ygb3JkZXIgbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIF9fYmVybm91bGxpKGludCBfX24pCisgICAgeyByZXR1cm4gX19iZXJub3VsbGlfc2VyaWVzPF9UcD4oX19uKTsgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gXGYkbG9nKFxHYW1tYSh4KSlcZiQgYnkgYXN5bXB0b3RpYyBleHBhbnNpb24KKyAgICAgKiAgICAgICAgICB3aXRoIEJlcm5vdWxsaSBudW1iZXIgY29lZmZpY2llbnRzLiAgVGhpcyBpcyBsaWtlCisgICAgICogICAgICAgICAgU3RlcmxpbmcncyBhcHByb3hpbWF0aW9uLgorICAgICAqCisgICAgICogICBAcGFyYW0gX194IFRoZSBhcmd1bWVudCBvZiB0aGUgbG9nIG9mIHRoZSBnYW1tYSBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBsb2dhcml0aG0gb2YgdGhlIGdhbW1hIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2xvZ19nYW1tYV9iZXJub3VsbGkoX1RwIF9feCkKKyAgICB7CisgICAgICBfVHAgX19sZyA9IChfX3ggLSBfVHAoMC41TCkpICogc3RkOjpsb2coX194KSAtIF9feAorICAgICAgICAgICAgICAgKyBfVHAoMC41TCkgKiBzdGQ6OmxvZyhfVHAoMikKKyAgICAgICAgICAgICAgICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkpOworCisgICAgICBjb25zdCBfVHAgX194eCA9IF9feCAqIF9feDsKKyAgICAgIF9UcCBfX2hlbHAgPSBfVHAoMSkgLyBfX3g7CisgICAgICBmb3IgKCB1bnNpZ25lZCBpbnQgX19pID0gMTsgX19pIDwgMjA7ICsrX19pICkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfXzJpID0gX1RwKDIgKiBfX2kpOworICAgICAgICAgIF9faGVscCAvPSBfXzJpICogKF9fMmkgLSBfVHAoMSkpICogX194eDsKKyAgICAgICAgICBfX2xnICs9IF9fYmVybm91bGxpPF9UcD4oMiAqIF9faSkgKiBfX2hlbHA7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIF9fbGc7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gXGYkbG9nKFxHYW1tYSh4KSlcZiQgYnkgdGhlIExhbmN6b3MgbWV0aG9kLgorICAgICAqICAgICAgICAgIFRoaXMgbWV0aG9kIGRvbWluYXRlcyBhbGwgb3RoZXJzIG9uIHRoZSBwb3NpdGl2ZSBheGlzIEkgdGhpbmsuCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSBfX3ggVGhlIGFyZ3VtZW50IG9mIHRoZSBsb2cgb2YgdGhlIGdhbW1hIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGxvZ2FyaXRobSBvZiB0aGUgZ2FtbWEgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fbG9nX2dhbW1hX2xhbmN6b3MoX1RwIF9feCkKKyAgICB7CisgICAgICBjb25zdCBfVHAgX194bTEgPSBfX3ggLSBfVHAoMSk7CisKKyAgICAgIHN0YXRpYyBjb25zdCBfVHAgX19sYW5jem9zX2NoZWJfN1s5XSA9IHsKKyAgICAgICBfVHAoIDAuOTk5OTk5OTk5OTk5ODA5OTMyMjc2ODQ3MDA0NzM0NzhMKSwKKyAgICAgICBfVHAoIDY3Ni41MjAzNjgxMjE4ODUwOTg1NjcwMDkxOTA0NDQwMTlMKSwKKyAgICAgICBfVHAoLTEyNTkuMTM5MjE2NzIyNDAyODcwNDcxNTYwNzg3NTUyODNMKSwKKyAgICAgICBfVHAoIDc3MS4zMjM0Mjg3Nzc2NTMwNzg4NDg2NTI4MjU4ODk0TCksCisgICAgICAgX1RwKC0xNzYuNjE1MDI5MTYyMTQwNTk5MDY1ODQ1NTEzNTRMKSwKKyAgICAgICBfVHAoIDEyLjUwNzM0MzI3ODY4NjkwNDgxNDQ1ODkzNjg1M0wpLAorICAgICAgIF9UcCgtMC4xMzg1NzEwOTUyNjU3MjAxMTY4OTU1NDcwN0wpLAorICAgICAgIF9UcCggOS45ODQzNjk1NzgwMTk1NzA4NTk1NjNlLTZMKSwKKyAgICAgICBfVHAoIDEuNTA1NjMyNzM1MTQ5MzExNTU4MzRlLTdMKQorICAgICAgfTsKKworICAgICAgc3RhdGljIGNvbnN0IF9UcCBfX0xPR1JPT1QyUEkKKyAgICAgICAgICA9IF9UcCgwLjkxODkzODUzMzIwNDY3Mjc0MTc4MDMyOTczNjQwNTYxNzZMKTsKKworICAgICAgX1RwIF9fc3VtID0gX19sYW5jem9zX2NoZWJfN1swXTsKKyAgICAgIGZvcih1bnNpZ25lZCBpbnQgX19rID0gMTsgX19rIDwgOTsgKytfX2spCisgICAgICAgIF9fc3VtICs9IF9fbGFuY3pvc19jaGViXzdbX19rXSAvIChfX3htMSArIF9fayk7CisKKyAgICAgIGNvbnN0IF9UcCBfX3Rlcm0xID0gKF9feG0xICsgX1RwKDAuNUwpKQorICAgICAgICAgICAgICAgICAgICAgICAgKiBzdGQ6OmxvZygoX194bTEgKyBfVHAoNy41TCkpCisgICAgICAgICAgICAgICAgICAgICAgIC8gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX2V1bGVyKCkpOworICAgICAgY29uc3QgX1RwIF9fdGVybTIgPSBfX0xPR1JPT1QyUEkgKyBzdGQ6OmxvZyhfX3N1bSk7CisgICAgICBjb25zdCBfVHAgX19yZXN1bHQgPSBfX3Rlcm0xICsgKF9fdGVybTIgLSBfVHAoNykpOworCisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gXGYkIGxvZyh8XEdhbW1hKHgpfCkgXGYkLgorICAgICAqICAgICAgICAgIFRoaXMgd2lsbCByZXR1cm4gdmFsdWVzIGV2ZW4gZm9yIFxmJCB4IDwgMCBcZiQuCisgICAgICogICAgICAgICAgVG8gcmVjb3ZlciB0aGUgc2lnbiBvZiBcZiQgXEdhbW1hKHgpIFxmJCBmb3IKKyAgICAgKiAgICAgICAgICBhbnkgYXJndW1lbnQgdXNlIEBhIF9fbG9nX2dhbW1hX3NpZ24uCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSBfX3ggVGhlIGFyZ3VtZW50IG9mIHRoZSBsb2cgb2YgdGhlIGdhbW1hIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGxvZ2FyaXRobSBvZiB0aGUgZ2FtbWEgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fbG9nX2dhbW1hKF9UcCBfX3gpCisgICAgeworICAgICAgaWYgKF9feCA+IF9UcCgwLjVMKSkKKyAgICAgICAgcmV0dXJuIF9fbG9nX2dhbW1hX2xhbmN6b3MoX194KTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX3Npbl9mYWN0CisgICAgICAgICAgICAgICAgID0gc3RkOjphYnMoc3RkOjpzaW4oX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkgKiBfX3gpKTsKKyAgICAgICAgICBpZiAoX19zaW5fZmFjdCA9PSBfVHAoMCkpCisgICAgICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQXJndW1lbnQgaXMgbm9ucG9zaXRpdmUgaW50ZWdlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19sb2dfZ2FtbWEiKSk7CisgICAgICAgICAgcmV0dXJuIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19sbnBpKCkKKyAgICAgICAgICAgICAgICAgICAgIC0gc3RkOjpsb2coX19zaW5fZmFjdCkKKyAgICAgICAgICAgICAgICAgICAgIC0gX19sb2dfZ2FtbWFfbGFuY3pvcyhfVHAoMSkgLSBfX3gpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIHNpZ24gb2YgXGYkIFxHYW1tYSh4KSBcZiQuCisgICAgICogICAgICAgICAgQXQgbm9ucG9zaXRpdmUgaW50ZWdlcnMgemVybyBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9feCBUaGUgYXJndW1lbnQgb2YgdGhlIGdhbW1hIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIHNpZ24gb2YgdGhlIGdhbW1hIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2xvZ19nYW1tYV9zaWduKF9UcCBfX3gpCisgICAgeworICAgICAgaWYgKF9feCA+IF9UcCgwKSkKKyAgICAgICAgcmV0dXJuIF9UcCgxKTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX3Npbl9mYWN0CisgICAgICAgICAgICAgICAgICA9IHN0ZDo6c2luKF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpICogX194KTsKKyAgICAgICAgICBpZiAoX19zaW5fZmFjdCA+IF9UcCgwKSkKKyAgICAgICAgICAgIHJldHVybiAoMSk7CisgICAgICAgICAgZWxzZSBpZiAoX19zaW5fZmFjdCA8IF9UcCgwKSkKKyAgICAgICAgICAgIHJldHVybiAtX1RwKDEpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBfVHAoMCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgbG9nYXJpdGhtIG9mIHRoZSBiaW5vbWlhbCBjb2VmZmljaWVudC4KKyAgICAgKiAgIFRoZSBiaW5vbWlhbCBjb2VmZmljaWVudCBpcyBnaXZlbiBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgXGxlZnQoICBccmlnaHQpID0gXGZyYWN7biF9eyhuLWspISBrIX0KKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBAcGFyYW0gX19uIFRoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgYmlub21pYWwgY29lZmZpY2llbnQuCisgICAgICogICBAcGFyYW0gX19rIFRoZSBzZWNvbmQgYXJndW1lbnQgb2YgdGhlIGJpbm9taWFsIGNvZWZmaWNpZW50LgorICAgICAqICAgQHJldHVybiAgVGhlIGJpbm9taWFsIGNvZWZmaWNpZW50LgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2xvZ19iaW5jb2VmKHVuc2lnbmVkIGludCBfX24sIHVuc2lnbmVkIGludCBfX2spCisgICAgeworICAgICAgLy8gIE1heCBlIGV4cG9uZW50IGJlZm9yZSBvdmVyZmxvdy4KKyAgICAgIHN0YXRpYyBjb25zdCBfVHAgX19tYXhfYmluY29lZmYKKyAgICAgICAgICAgICAgICAgICAgICA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6bWF4X2V4cG9uZW50MTAKKyAgICAgICAgICAgICAgICAgICAgICAqIHN0ZDo6bG9nKF9UcCgxMCkpIC0gX1RwKDEpOworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgIF9UcCBfX2NvZWZmID0gIHN0ZDo6dHIxOjpsZ2FtbWEoX1RwKDEgKyBfX24pKQorICAgICAgICAgICAgICAgICAgLSBzdGQ6OnRyMTo6bGdhbW1hKF9UcCgxICsgX19rKSkKKyAgICAgICAgICAgICAgICAgIC0gc3RkOjp0cjE6OmxnYW1tYShfVHAoMSArIF9fbiAtIF9faykpOworI2Vsc2UKKyAgICAgIF9UcCBfX2NvZWZmID0gIF9fbG9nX2dhbW1hKF9UcCgxICsgX19uKSkKKyAgICAgICAgICAgICAgICAgIC0gX19sb2dfZ2FtbWEoX1RwKDEgKyBfX2spKQorICAgICAgICAgICAgICAgICAgLSBfX2xvZ19nYW1tYShfVHAoMSArIF9fbiAtIF9faykpOworI2VuZGlmCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIGJpbm9taWFsIGNvZWZmaWNpZW50LgorICAgICAqICAgVGhlIGJpbm9taWFsIGNvZWZmaWNpZW50IGlzIGdpdmVuIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICBcbGVmdCggIFxyaWdodCkgPSBcZnJhY3tuIX17KG4taykhIGshfQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSBfX24gVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBiaW5vbWlhbCBjb2VmZmljaWVudC4KKyAgICAgKiAgIEBwYXJhbSBfX2sgVGhlIHNlY29uZCBhcmd1bWVudCBvZiB0aGUgYmlub21pYWwgY29lZmZpY2llbnQuCisgICAgICogICBAcmV0dXJuICBUaGUgYmlub21pYWwgY29lZmZpY2llbnQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fYmluY29lZih1bnNpZ25lZCBpbnQgX19uLCB1bnNpZ25lZCBpbnQgX19rKQorICAgIHsKKyAgICAgIC8vICBNYXggZSBleHBvbmVudCBiZWZvcmUgb3ZlcmZsb3cuCisgICAgICBzdGF0aWMgY29uc3QgX1RwIF9fbWF4X2JpbmNvZWZmCisgICAgICAgICAgICAgICAgICAgICAgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46Om1heF9leHBvbmVudDEwCisgICAgICAgICAgICAgICAgICAgICAgKiBzdGQ6OmxvZyhfVHAoMTApKSAtIF9UcCgxKTsKKworICAgICAgY29uc3QgX1RwIF9fbG9nX2NvZWZmID0gX19sb2dfYmluY29lZjxfVHA+KF9fbiwgX19rKTsKKyAgICAgIGlmIChfX2xvZ19jb2VmZiA+IF9fbWF4X2JpbmNvZWZmKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHN0ZDo6ZXhwKF9fbG9nX2NvZWZmKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiBcZiQgXEdhbW1hKHgpIFxmJC4KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9feCBUaGUgYXJndW1lbnQgb2YgdGhlIGdhbW1hIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGdhbW1hIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX19nYW1tYShfVHAgX194KQorICAgIHsgcmV0dXJuIHN0ZDo6ZXhwKF9fbG9nX2dhbW1hKF9feCkpOyB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIGRpZ2FtbWEgZnVuY3Rpb24gYnkgc2VyaWVzIGV4cGFuc2lvbi4KKyAgICAgKiAgIFRoZSBkaWdhbW1hIG9yIEBmJCBccHNpKHgpIEBmJCBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5CisgICAgICogICBAZlsKKyAgICAgKiAgICAgXHBzaSh4KSA9IFxmcmFje1xHYW1tYScoeCl9e1xHYW1tYSh4KX0KKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBUaGUgc2VyaWVzIGlzIGdpdmVuIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgIFxwc2koeCkgPSAtXGdhbW1hX0UgLSBcZnJhY3sxfXt4fQorICAgICAqICAgICAgICAgICAgICBcc3VtX3trPTF9XntcaW5mdHl9IFxmcmFje3h9e2soeCArIGspfQorICAgICAqICAgQGZdCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fcHNpX3NlcmllcyhfVHAgX194KQorICAgIHsKKyAgICAgIF9UcCBfX3N1bSA9IC1fX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fZ2FtbWFfZSgpIC0gX1RwKDEpIC8gX194OworICAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbWF4X2l0ZXIgPSAxMDAwMDA7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2sgPSAxOyBfX2sgPCBfX21heF9pdGVyOyArK19faykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX3Rlcm0gPSBfX3ggLyAoX19rICogKF9fayArIF9feCkpOworICAgICAgICAgIF9fc3VtICs9IF9fdGVybTsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX190ZXJtIC8gX19zdW0pIDwgc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgcmV0dXJuIF9fc3VtOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgZGlnYW1tYSBmdW5jdGlvbiBmb3IgbGFyZ2UgYXJndW1lbnQuCisgICAgICogICBUaGUgZGlnYW1tYSBvciBAZiQgXHBzaSh4KSBAZiQgZnVuY3Rpb24gaXMgZGVmaW5lZCBieQorICAgICAqICAgQGZbCisgICAgICogICAgIFxwc2koeCkgPSBcZnJhY3tcR2FtbWEnKHgpfXtcR2FtbWEoeCl9CisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgVGhlIGFzeW1wdG90aWMgc2VyaWVzIGlzIGdpdmVuIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgIFxwc2koeCkgPSBcbG4oeCkgLSBcZnJhY3sxfXsyeH0KKyAgICAgKiAgICAgICAgICAgICAtIFxzdW1fe249MX1ee1xpbmZ0eX0gXGZyYWN7Ql97Mm59fXsyIG4geF57Mm59fQorICAgICAqICAgQGZdCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fcHNpX2FzeW1wKF9UcCBfX3gpCisgICAgeworICAgICAgX1RwIF9fc3VtID0gc3RkOjpsb2coX194KSAtIF9UcCgwLjVMKSAvIF9feDsKKyAgICAgIGNvbnN0IF9UcCBfX3h4ID0gX194ICogX194OworICAgICAgX1RwIF9feHAgPSBfX3h4OworICAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbWF4X2l0ZXIgPSAxMDA7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2sgPSAxOyBfX2sgPCBfX21heF9pdGVyOyArK19faykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX3Rlcm0gPSBfX2Jlcm5vdWxsaTxfVHA+KDIgKiBfX2spIC8gKDIgKiBfX2sgKiBfX3hwKTsKKyAgICAgICAgICBfX3N1bSAtPSBfX3Rlcm07CisgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fdGVybSAvIF9fc3VtKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgX194cCAqPSBfX3h4OworICAgICAgICB9CisgICAgICByZXR1cm4gX19zdW07CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBkaWdhbW1hIGZ1bmN0aW9uLgorICAgICAqICAgVGhlIGRpZ2FtbWEgb3IgQGYkIFxwc2koeCkgQGYkIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnkKKyAgICAgKiAgIEBmWworICAgICAqICAgICBccHNpKHgpID0gXGZyYWN7XEdhbW1hJyh4KX17XEdhbW1hKHgpfQorICAgICAqICAgQGZdCisgICAgICogICBGb3IgbmVnYXRpdmUgYXJndW1lbnQgdGhlIHJlZmxlY3Rpb24gZm9ybXVsYSBpcyB1c2VkOgorICAgICAqICAgQGZbCisgICAgICogICAgIFxwc2koeCkgPSBccHNpKDEteCkgLSBccGkgXGNvdChccGkgeCkKKyAgICAgKiAgIEBmXQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3BzaShfVHAgX194KQorICAgIHsKKyAgICAgIGNvbnN0IGludCBfX24gPSBzdGF0aWNfY2FzdDxpbnQ+KF9feCArIDAuNUwpOworICAgICAgY29uc3QgX1RwIF9fZXBzID0gX1RwKDQpICogc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisgICAgICBpZiAoX19uIDw9IDAgJiYgc3RkOjphYnMoX194IC0gX1RwKF9fbikpIDwgX19lcHMpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZSBpZiAoX194IDwgX1RwKDApKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9fcGkgPSBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKTsKKyAgICAgICAgICByZXR1cm4gX19wc2koX1RwKDEpIC0gX194KQorICAgICAgICAgICAgICAgLSBfX3BpICogc3RkOjpjb3MoX19waSAqIF9feCkgLyBzdGQ6OnNpbihfX3BpICogX194KTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX194ID4gX1RwKDEwMCkpCisgICAgICAgIHJldHVybiBfX3BzaV9hc3ltcChfX3gpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX19wc2lfc2VyaWVzKF9feCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBwb2x5Z2FtbWEgZnVuY3Rpb24gQGYkIFxwc2leeyhuKX0oeCkgQGYkLgorICAgICAqIAorICAgICAqICAgVGhlIHBvbHlnYW1tYSBmdW5jdGlvbiBpcyByZWxhdGVkIHRvIHRoZSBIdXJ3aXR6IHpldGEgZnVuY3Rpb246CisgICAgICogICBAZlsKKyAgICAgKiAgICAgXHBzaV57KG4pfSh4KSA9ICgtMSlee24rMX0gbSEgXHpldGEobSsxLHgpCisgICAgICogICBAZl0KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19wc2kodW5zaWduZWQgaW50IF9fbiwgX1RwIF9feCkKKyAgICB7CisgICAgICBpZiAoX194IDw9IF9UcCgwKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkFyZ3VtZW50IG91dCBvZiByYW5nZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX3BzaSIpKTsKKyAgICAgIGVsc2UgaWYgKF9fbiA9PSAwKQorICAgICAgICByZXR1cm4gX19wc2koX194KTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX2h6ZXRhID0gX19odXJ3aXR6X3pldGEoX1RwKF9fbiArIDEpLCBfX3gpOworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgICAgICBjb25zdCBfVHAgX19sbl9uZmFjdCA9IHN0ZDo6dHIxOjpsZ2FtbWEoX1RwKF9fbiArIDEpKTsKKyNlbHNlCisgICAgICAgICAgY29uc3QgX1RwIF9fbG5fbmZhY3QgPSBfX2xvZ19nYW1tYShfVHAoX19uICsgMSkpOworI2VuZGlmCisgICAgICAgICAgX1RwIF9fcmVzdWx0ID0gc3RkOjpleHAoX19sbl9uZmFjdCkgKiBfX2h6ZXRhOworICAgICAgICAgIGlmIChfX24gJSAyID09IDEpCisgICAgICAgICAgICBfX3Jlc3VsdCA9IC1fX3Jlc3VsdDsKKyAgICAgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0gLy8gbmFtZXNwYWNlIHN0ZDo6dHIxOjpfX2RldGFpbAorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0dBTU1BX1RDQworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9oYXNodGFibGUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2hhc2h0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYmZkMWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9oYXNodGFibGUuaApAQCAtMCwwICsxLDExODEgQEAKKy8vIFRSMSBoYXNodGFibGUuaCBoZWFkZXIgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9oYXNodGFibGUuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuCisgKiAgQGhlYWRlcm5hbWV7dHIxL3Vub3JkZXJlZF9zZXQsIHRyMS91bm9yZGVyZWRfbWFwfQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0hBU0hUQUJMRV9ICisjZGVmaW5lIF9HTElCQ1hYX1RSMV9IQVNIVEFCTEVfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPHRyMS9oYXNodGFibGVfcG9saWN5Lmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBDbGFzcyB0ZW1wbGF0ZSBfSGFzaHRhYmxlLCBjbGFzcyBkZWZpbml0aW9uLgorCisgIC8vIE1lYW5pbmcgb2YgY2xhc3MgdGVtcGxhdGUgX0hhc2h0YWJsZSdzIHRlbXBsYXRlIHBhcmFtZXRlcnMKKworICAvLyBfS2V5IGFuZCBfVmFsdWU6IGFyYml0cmFyeSBDb3B5Q29uc3RydWN0aWJsZSB0eXBlcy4KKworICAvLyBfQWxsb2NhdG9yOiBhbiBhbGxvY2F0b3IgdHlwZSAoW2xpYi5hbGxvY2F0b3IucmVxdWlyZW1lbnRzXSkgd2hvc2UKKyAgLy8gdmFsdWUgdHlwZSBpcyBWYWx1ZS4gIEFzIGEgY29uZm9ybWluZyBleHRlbnNpb24sIHdlIGFsbG93IGZvcgorICAvLyB2YWx1ZSB0eXBlICE9IFZhbHVlLgorCisgIC8vIF9FeHRyYWN0S2V5OiBmdW5jdGlvbiBvYmplY3QgdGhhdCB0YWtlcyBhIG9iamVjdCBvZiB0eXBlIFZhbHVlCisgIC8vIGFuZCByZXR1cm5zIGEgdmFsdWUgb2YgdHlwZSBfS2V5LgorCisgIC8vIF9FcXVhbDogZnVuY3Rpb24gb2JqZWN0IHRoYXQgdGFrZXMgdHdvIG9iamVjdHMgb2YgdHlwZSBrIGFuZCByZXR1cm5zCisgIC8vIGEgYm9vbC1saWtlIHZhbHVlIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZXF1YWwuCisKKyAgLy8gX0gxOiB0aGUgaGFzaCBmdW5jdGlvbi4gIEEgdW5hcnkgZnVuY3Rpb24gb2JqZWN0IHdpdGggYXJndW1lbnQgdHlwZQorICAvLyBLZXkgYW5kIHJlc3VsdCB0eXBlIHNpemVfdC4gIFJldHVybiB2YWx1ZXMgc2hvdWxkIGJlIGRpc3RyaWJ1dGVkCisgIC8vIG92ZXIgdGhlIGVudGlyZSByYW5nZSBbMCwgbnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6Om1heCgpXS4KKworICAvLyBfSDI6IHRoZSByYW5nZS1oYXNoaW5nIGZ1bmN0aW9uIChpbiB0aGUgdGVybWlub2xvZ3kgb2YgVGF2b3JpIGFuZAorICAvLyBEcmVpemluKS4gIEEgYmluYXJ5IGZ1bmN0aW9uIG9iamVjdCB3aG9zZSBhcmd1bWVudCB0eXBlcyBhbmQgcmVzdWx0CisgIC8vIHR5cGUgYXJlIGFsbCBzaXplX3QuICBHaXZlbiBhcmd1bWVudHMgciBhbmQgTiwgdGhlIHJldHVybiB2YWx1ZSBpcworICAvLyBpbiB0aGUgcmFuZ2UgWzAsIE4pLgorCisgIC8vIF9IYXNoOiB0aGUgcmFuZ2VkIGhhc2ggZnVuY3Rpb24gKFRhdm9yaSBhbmQgRHJlaXppbikuIEEgYmluYXJ5IGZ1bmN0aW9uCisgIC8vIHdob3NlIGFyZ3VtZW50IHR5cGVzIGFyZSBfS2V5IGFuZCBzaXplX3QgYW5kIHdob3NlIHJlc3VsdCB0eXBlIGlzCisgIC8vIHNpemVfdC4gIEdpdmVuIGFyZ3VtZW50cyBrIGFuZCBOLCB0aGUgcmV0dXJuIHZhbHVlIGlzIGluIHRoZSByYW5nZQorICAvLyBbMCwgTikuICBEZWZhdWx0OiBoYXNoKGssIE4pID0gaDIoaDEoayksIE4pLiAgSWYgX0hhc2ggaXMgYW55dGhpbmcgb3RoZXIKKyAgLy8gdGhhbiB0aGUgZGVmYXVsdCwgX0gxIGFuZCBfSDIgYXJlIGlnbm9yZWQuCisKKyAgLy8gX1JlaGFzaFBvbGljeTogUG9saWN5IGNsYXNzIHdpdGggdGhyZWUgbWVtYmVycywgYWxsIG9mIHdoaWNoIGdvdmVybgorICAvLyB0aGUgYnVja2V0IGNvdW50LiBfTV9uZXh0X2JrdChuKSByZXR1cm5zIGEgYnVja2V0IGNvdW50IG5vIHNtYWxsZXIKKyAgLy8gdGhhbiBuLiAgX01fYmt0X2Zvcl9lbGVtZW50cyhuKSByZXR1cm5zIGEgYnVja2V0IGNvdW50IGFwcHJvcHJpYXRlCisgIC8vIGZvciBhbiBlbGVtZW50IGNvdW50IG9mIG4uICBfTV9uZWVkX3JlaGFzaChuX2JrdCwgbl9lbHQsIG5faW5zKQorICAvLyBkZXRlcm1pbmVzIHdoZXRoZXIsIGlmIHRoZSBjdXJyZW50IGJ1Y2tldCBjb3VudCBpcyBuX2JrdCBhbmQgdGhlCisgIC8vIGN1cnJlbnQgZWxlbWVudCBjb3VudCBpcyBuX2VsdCwgd2UgbmVlZCB0byBpbmNyZWFzZSB0aGUgYnVja2V0CisgIC8vIGNvdW50LiAgSWYgc28sIHJldHVybnMgbWFrZV9wYWlyKHRydWUsIG4pLCB3aGVyZSBuIGlzIHRoZSBuZXcKKyAgLy8gYnVja2V0IGNvdW50LiAgSWYgbm90LCByZXR1cm5zIG1ha2VfcGFpcihmYWxzZSwgPGFueXRoaW5nPikuCisKKyAgLy8gPz8/IFJpZ2h0IG5vdyBpdCBpcyBoYXJkLXdpcmVkIHRoYXQgdGhlIG51bWJlciBvZiBidWNrZXRzIG5ldmVyCisgIC8vIHNocmlua3MuICBTaG91bGQgd2UgYWxsb3cgX1JlaGFzaFBvbGljeSB0byBjaGFuZ2UgdGhhdD8KKworICAvLyBfX2NhY2hlX2hhc2hfY29kZTogYm9vbC4gIHRydWUgaWYgd2Ugc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBoYXNoCisgIC8vIGZ1bmN0aW9uIGFsb25nIHdpdGggdGhlIHZhbHVlLiAgVGhpcyBpcyBhIHRpbWUtc3BhY2UgdHJhZGVvZmYuCisgIC8vIFN0b3JpbmcgaXQgbWF5IGltcHJvdmUgbG9va3VwIHNwZWVkIGJ5IHJlZHVjaW5nIHRoZSBudW1iZXIgb2YgdGltZXMKKyAgLy8gd2UgbmVlZCB0byBjYWxsIHRoZSBFcXVhbCBmdW5jdGlvbi4KKworICAvLyBfX2NvbnN0YW50X2l0ZXJhdG9yczogYm9vbC4gIHRydWUgaWYgaXRlcmF0b3IgYW5kIGNvbnN0X2l0ZXJhdG9yIGFyZQorICAvLyBib3RoIGNvbnN0YW50IGl0ZXJhdG9yIHR5cGVzLiAgVGhpcyBpcyB0cnVlIGZvciB1bm9yZGVyZWRfc2V0IGFuZAorICAvLyB1bm9yZGVyZWRfbXVsdGlzZXQsIGZhbHNlIGZvciB1bm9yZGVyZWRfbWFwIGFuZCB1bm9yZGVyZWRfbXVsdGltYXAuCisKKyAgLy8gX191bmlxdWVfa2V5czogYm9vbC4gIHRydWUgaWYgdGhlIHJldHVybiB2YWx1ZSBvZiBfSGFzaHRhYmxlOjpjb3VudChrKQorICAvLyBpcyBhbHdheXMgYXQgbW9zdCBvbmUsIGZhbHNlIGlmIGl0IG1heSBiZSBhbiBhcmJpdHJhcnkgbnVtYmVyLiAgVGhpcworICAvLyB0cnVlIGZvciB1bm9yZGVyZWRfc2V0IGFuZCB1bm9yZGVyZWRfbWFwLCBmYWxzZSBmb3IgdW5vcmRlcmVkX211bHRpc2V0CisgIC8vIGFuZCB1bm9yZGVyZWRfbXVsdGltYXAuCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfQWxsb2NhdG9yLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZSwKKwkgICBib29sIF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCSAgIGJvb2wgX191bmlxdWVfa2V5cz4KKyAgICBjbGFzcyBfSGFzaHRhYmxlCisgICAgOiBwdWJsaWMgX19kZXRhaWw6Ol9SZWhhc2hfYmFzZTxfUmVoYXNoUG9saWN5LAorCQkJCSAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwKKwkJCQkJICAgICAgIF9FeHRyYWN0S2V5LAorCQkJCQkgICAgICAgX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsCisJCQkJCSAgICAgICBfUmVoYXNoUG9saWN5LAorCQkJCQkgICAgICAgX19jYWNoZV9oYXNoX2NvZGUsCisJCQkJCSAgICAgICBfX2NvbnN0YW50X2l0ZXJhdG9ycywKKwkJCQkJICAgICAgIF9fdW5pcXVlX2tleXM+ID4sCisgICAgICBwdWJsaWMgX19kZXRhaWw6Ol9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQkJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX19jYWNoZV9oYXNoX2NvZGU+LAorICAgICAgcHVibGljIF9fZGV0YWlsOjpfTWFwX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX191bmlxdWVfa2V5cywKKwkJCQkgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsCisJCQkJCSAgICBfRXh0cmFjdEtleSwKKwkJCQkJICAgIF9FcXVhbCwgX0gxLCBfSDIsIF9IYXNoLAorCQkJCQkgICAgX1JlaGFzaFBvbGljeSwKKwkJCQkJICAgIF9fY2FjaGVfaGFzaF9jb2RlLAorCQkJCQkgICAgX19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkJCSAgICBfX3VuaXF1ZV9rZXlzPiA+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0FsbG9jYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1ZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfRXF1YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9lcXVhbDsKKyAgICAgIC8vIG1hcHBlZF90eXBlLCBpZiBwcmVzZW50LCBjb21lcyBmcm9tIF9NYXBfYmFzZS4KKyAgICAgIC8vIGhhc2hlciwgaWYgcHJlc2VudCwgY29tZXMgZnJvbSBfSGFzaF9jb2RlX2Jhc2UuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY2F0b3I6OmRpZmZlcmVuY2VfdHlwZSAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NhdG9yOjpzaXplX3R5cGUgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jYXRvcjo6cG9pbnRlciAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NhdG9yOjpjb25zdF9wb2ludGVyICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY2F0b3I6OnJlZmVyZW5jZSAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NhdG9yOjpjb25zdF9yZWZlcmVuY2UgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiBfX2RldGFpbDo6X05vZGVfaXRlcmF0b3I8dmFsdWVfdHlwZSwgX19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkJICAgICAgIF9fY2FjaGVfaGFzaF9jb2RlPgorCQkJCQkJCSAgbG9jYWxfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZGV0YWlsOjpfTm9kZV9jb25zdF9pdGVyYXRvcjx2YWx1ZV90eXBlLAorCQkJCQkgICAgIF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCQkJCQkgICAgIF9fY2FjaGVfaGFzaF9jb2RlPgorCQkJCQkJCSAgY29uc3RfbG9jYWxfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgX19kZXRhaWw6Ol9IYXNodGFibGVfaXRlcmF0b3I8dmFsdWVfdHlwZSwgX19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkJCSAgICBfX2NhY2hlX2hhc2hfY29kZT4KKwkJCQkJCQkgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2RldGFpbDo6X0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcjx2YWx1ZV90eXBlLAorCQkJCQkJICBfX2NvbnN0YW50X2l0ZXJhdG9ycywKKwkJCQkJCSAgX19jYWNoZV9oYXNoX2NvZGU+CisJCQkJCQkJICBjb25zdF9pdGVyYXRvcjsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleTIsIHR5cGVuYW1lIF9WYWx1ZTIsIHR5cGVuYW1lIF9FeDIsIGJvb2wgX191bmlxdWUyLAorCSAgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlMj4KKwlmcmllbmQgc3RydWN0IF9fZGV0YWlsOjpfTWFwX2Jhc2U7CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2RldGFpbDo6X0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGVfaGFzaF9jb2RlPiBfTm9kZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPF9Ob2RlPjo6b3RoZXIKKwkJCQkJCQlfTm9kZV9hbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPF9Ob2RlKj46Om90aGVyCisJCQkJCQkJX0J1Y2tldF9hbGxvY2F0b3JfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8X1ZhbHVlPjo6b3RoZXIKKwkJCQkJCQlfVmFsdWVfYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIF9Ob2RlX2FsbG9jYXRvcl90eXBlICAgX01fbm9kZV9hbGxvY2F0b3I7CisgICAgICBfTm9kZSoqICAgICAgICAgICAgICAgIF9NX2J1Y2tldHM7CisgICAgICBzaXplX3R5cGUgICAgICAgICAgICAgIF9NX2J1Y2tldF9jb3VudDsKKyAgICAgIHNpemVfdHlwZSAgICAgICAgICAgICAgX01fZWxlbWVudF9jb3VudDsKKyAgICAgIF9SZWhhc2hQb2xpY3kgICAgICAgICAgX01fcmVoYXNoX3BvbGljeTsKKworICAgICAgX05vZGUqCisgICAgICBfTV9hbGxvY2F0ZV9ub2RlKGNvbnN0IHZhbHVlX3R5cGUmIF9fdik7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RlYWxsb2NhdGVfbm9kZShfTm9kZSogX19uKTsKKworICAgICAgdm9pZAorICAgICAgX01fZGVhbGxvY2F0ZV9ub2RlcyhfTm9kZSoqLCBzaXplX3R5cGUpOworCisgICAgICBfTm9kZSoqCisgICAgICBfTV9hbGxvY2F0ZV9idWNrZXRzKHNpemVfdHlwZSBfX24pOworCisgICAgICB2b2lkCisgICAgICBfTV9kZWFsbG9jYXRlX2J1Y2tldHMoX05vZGUqKiwgc2l6ZV90eXBlIF9fbik7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBDb25zdHJ1Y3RvciwgZGVzdHJ1Y3RvciwgYXNzaWdubWVudCwgc3dhcAorICAgICAgX0hhc2h0YWJsZShzaXplX3R5cGUgX19idWNrZXRfaGludCwKKwkJIGNvbnN0IF9IMSYsIGNvbnN0IF9IMiYsIGNvbnN0IF9IYXNoJiwKKwkJIGNvbnN0IF9FcXVhbCYsIGNvbnN0IF9FeHRyYWN0S2V5JiwKKwkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCV9IYXNodGFibGUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgICBzaXplX3R5cGUgX19idWNrZXRfaGludCwKKwkJICAgY29uc3QgX0gxJiwgY29uc3QgX0gyJiwgY29uc3QgX0hhc2gmLAorCQkgICBjb25zdCBfRXF1YWwmLCBjb25zdCBfRXh0cmFjdEtleSYsCisJCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJik7CisKKyAgICAgIF9IYXNodGFibGUoY29uc3QgX0hhc2h0YWJsZSYpOworCisgICAgICBfSGFzaHRhYmxlJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9IYXNodGFibGUmKTsKKworICAgICAgfl9IYXNodGFibGUoKTsKKworICAgICAgdm9pZCBzd2FwKF9IYXNodGFibGUmKTsKKworICAgICAgLy8gQmFzaWMgY29udGFpbmVyIG9wZXJhdGlvbnMKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpCisgICAgICB7CisJaXRlcmF0b3IgX19pKF9NX2J1Y2tldHMpOworCWlmICghX19pLl9NX2N1cl9ub2RlKQorCSAgX19pLl9NX2luY3JfYnVja2V0KCk7CisJcmV0dXJuIF9faTsKKyAgICAgIH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsKKwljb25zdF9pdGVyYXRvciBfX2koX01fYnVja2V0cyk7CisJaWYgKCFfX2kuX01fY3VyX25vZGUpCisJICBfX2kuX01faW5jcl9idWNrZXQoKTsKKwlyZXR1cm4gX19pOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2J1Y2tldHMgKyBfTV9idWNrZXRfY291bnQpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX01fYnVja2V0cyArIF9NX2J1Y2tldF9jb3VudCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2VsZW1lbnRfY291bnQ7IH0KKworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gc2l6ZSgpID09IDA7IH0KKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gYWxsb2NhdG9yX3R5cGUoX01fbm9kZV9hbGxvY2F0b3IpOyB9CisKKyAgICAgIF9WYWx1ZV9hbGxvY2F0b3JfdHlwZQorICAgICAgX01fZ2V0X1ZhbHVlX2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBfVmFsdWVfYWxsb2NhdG9yX3R5cGUoX01fbm9kZV9hbGxvY2F0b3IpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbm9kZV9hbGxvY2F0b3IubWF4X3NpemUoKTsgfQorCisgICAgICAvLyBPYnNlcnZlcnMKKyAgICAgIGtleV9lcXVhbAorICAgICAga2V5X2VxKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2VxOyB9CisKKyAgICAgIC8vIGhhc2hfZnVuY3Rpb24sIGlmIHByZXNlbnQsIGNvbWVzIGZyb20gX0hhc2hfY29kZV9iYXNlLgorCisgICAgICAvLyBCdWNrZXQgb3BlcmF0aW9ucworICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYnVja2V0X2NvdW50OyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBtYXhfc2l6ZSgpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0X3NpemUoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6ZGlzdGFuY2UoYmVnaW4oX19uKSwgZW5kKF9fbikpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0KGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0CisgICAgICB7CisJcmV0dXJuIHRoaXMtPl9NX2J1Y2tldF9pbmRleChfX2ssIHRoaXMtPl9NX2hhc2hfY29kZShfX2spLAorCQkJCSAgICAgYnVja2V0X2NvdW50KCkpOworICAgICAgfQorCisgICAgICBsb2NhbF9pdGVyYXRvcgorICAgICAgYmVnaW4oc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIGxvY2FsX2l0ZXJhdG9yKF9NX2J1Y2tldHNbX19uXSk7IH0KKworICAgICAgbG9jYWxfaXRlcmF0b3IKKyAgICAgIGVuZChzaXplX3R5cGUpCisgICAgICB7IHJldHVybiBsb2NhbF9pdGVyYXRvcigwKTsgfQorCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2xvY2FsX2l0ZXJhdG9yKF9NX2J1Y2tldHNbX19uXSk7IH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGVuZChzaXplX3R5cGUpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcigwKTsgfQorCisgICAgICBmbG9hdAorICAgICAgbG9hZF9mYWN0b3IoKSBjb25zdAorICAgICAgeworCXJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4oc2l6ZSgpKSAvIHN0YXRpY19jYXN0PGZsb2F0PihidWNrZXRfY291bnQoKSk7CisgICAgICB9CisKKyAgICAgIC8vIG1heF9sb2FkX2ZhY3RvciwgaWYgcHJlc2VudCwgY29tZXMgZnJvbSBfUmVoYXNoX2Jhc2UuCisKKyAgICAgIC8vIEdlbmVyYWxpemF0aW9uIG9mIG1heF9sb2FkX2ZhY3Rvci4gIEV4dGVuc2lvbiwgbm90IGZvdW5kIGluIFRSMS4gIE9ubHkKKyAgICAgIC8vIHVzZWZ1bCBpZiBfUmVoYXNoUG9saWN5IGlzIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0LgorICAgICAgY29uc3QgX1JlaGFzaFBvbGljeSYKKyAgICAgIF9fcmVoYXNoX3BvbGljeSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9yZWhhc2hfcG9saWN5OyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9fcmVoYXNoX3BvbGljeShjb25zdCBfUmVoYXNoUG9saWN5Jik7CisKKyAgICAgIC8vIExvb2t1cC4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2spOworCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdDsKKworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdDsKKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2spOworCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Q7CisKKyAgICBwcml2YXRlOgkJCS8vIEZpbmQsIGluc2VydCBhbmQgZXJhc2UgaGVscGVyIGZ1bmN0aW9ucworICAgICAgLy8gPz8/IFRoaXMgZGlzcGF0Y2hpbmcgaXMgYSB3b3JrYXJvdW5kIGZvciB0aGUgZmFjdCB0aGF0IHdlIGRvbid0CisgICAgICAvLyBoYXZlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gb2YgbWVtYmVyIHRlbXBsYXRlczsgaXQgd291bGQgYmUKKyAgICAgIC8vIGJldHRlciB0byBqdXN0IHNwZWNpYWxpemUgaW5zZXJ0IG9uIF9fdW5pcXVlX2tleXMuICBUaGVyZSBtYXkgYmUgYQorICAgICAgLy8gY2xlYW5lciB3b3JrYXJvdW5kLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fY29uZGl0aW9uYWxfdHlwZTxfX3VuaXF1ZV9rZXlzLAorCQkgICAgICAgCSAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+LCBpdGVyYXRvcj46Ol9fdHlwZQorCV9JbnNlcnRfUmV0dXJuX1R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2NvbmRpdGlvbmFsX3R5cGU8X191bmlxdWVfa2V5cywKKwkJCQkJICBzdGQ6Ol9TZWxlY3Qxc3Q8X0luc2VydF9SZXR1cm5fVHlwZT4sCisJCQkJICAJICBzdGQ6Ol9JZGVudGl0eTxfSW5zZXJ0X1JldHVybl9UeXBlPgorCQkJCSAgID46Ol9fdHlwZQorCV9JbnNlcnRfQ29udl9UeXBlOworCisgICAgICBfTm9kZSoKKyAgICAgIF9NX2ZpbmRfbm9kZShfTm9kZSosIGNvbnN0IGtleV90eXBlJiwKKwkJICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X0hhc2hfY29kZV90eXBlKSBjb25zdDsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX2luc2VydF9idWNrZXQoY29uc3QgdmFsdWVfdHlwZSYsIHNpemVfdHlwZSwKKwkJICAgICAgIHR5cGVuYW1lIF9IYXNodGFibGU6Ol9IYXNoX2NvZGVfdHlwZSk7CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIF9NX2luc2VydChjb25zdCB2YWx1ZV90eXBlJiwgc3RkOjp0cjE6OnRydWVfdHlwZSk7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9pbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYsIHN0ZDo6dHIxOjpmYWxzZV90eXBlKTsKKworICAgICAgdm9pZAorICAgICAgX01fZXJhc2Vfbm9kZShfTm9kZSosIF9Ob2RlKiopOworCisgICAgcHVibGljOgorICAgICAgLy8gSW5zZXJ0IGFuZCBlcmFzZQorICAgICAgX0luc2VydF9SZXR1cm5fVHlwZQorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fdikKKyAgICAgIHsgcmV0dXJuIF9NX2luc2VydChfX3YsIHN0ZDo6dHIxOjppbnRlZ3JhbF9jb25zdGFudDxib29sLAorCQkJIF9fdW5pcXVlX2tleXM+KCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IsIGNvbnN0IHZhbHVlX3R5cGUmIF9fdikKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9JbnNlcnRfQ29udl9UeXBlKCkodGhpcy0+aW5zZXJ0KF9fdikpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yLCBjb25zdCB2YWx1ZV90eXBlJiBfX3YpCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfSW5zZXJ0X0NvbnZfVHlwZSgpKHRoaXMtPmluc2VydChfX3YpKSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJdm9pZAorCWluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpOworCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IpOworCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IpOworCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJik7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciwgaXRlcmF0b3IpOworCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yKTsKKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKTsKKworICAgICAgLy8gU2V0IG51bWJlciBvZiBidWNrZXRzIHRvIGJlIGFwcHJvcHJpYXRlIGZvciBjb250YWluZXIgb2YgbiBlbGVtZW50LgorICAgICAgdm9pZCByZWhhc2goc2l6ZV90eXBlIF9fbik7CisKKyAgICBwcml2YXRlOgorICAgICAgLy8gVW5jb25kaXRpb25hbGx5IGNoYW5nZSBzaXplIG9mIGJ1Y2tldCBhcnJheSB0byBuLgorICAgICAgdm9pZCBfTV9yZWhhc2goc2l6ZV90eXBlIF9fbik7CisgICAgfTsKKworCisgIC8vIERlZmluaXRpb25zIG9mIGNsYXNzIHRlbXBsYXRlIF9IYXNodGFibGUncyBvdXQtb2YtbGluZSBtZW1iZXIgZnVuY3Rpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX19jaGMsIF9fY2l0LCBfX3VrPjo6X05vZGUqCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgX01fYWxsb2NhdGVfbm9kZShjb25zdCB2YWx1ZV90eXBlJiBfX3YpCisgICAgeworICAgICAgX05vZGUqIF9fbiA9IF9NX25vZGVfYWxsb2NhdG9yLmFsbG9jYXRlKDEpOworICAgICAgX190cnkKKwl7CisJICBfTV9nZXRfVmFsdWVfYWxsb2NhdG9yKCkuY29uc3RydWN0KCZfX24tPl9NX3YsIF9fdik7CisJICBfX24tPl9NX25leHQgPSAwOworCSAgcmV0dXJuIF9fbjsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBfTV9ub2RlX2FsbG9jYXRvci5kZWFsbG9jYXRlKF9fbiwgMSk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdm9pZAorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIF9NX2RlYWxsb2NhdGVfbm9kZShfTm9kZSogX19uKQorICAgIHsKKyAgICAgIF9NX2dldF9WYWx1ZV9hbGxvY2F0b3IoKS5kZXN0cm95KCZfX24tPl9NX3YpOworICAgICAgX01fbm9kZV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShfX24sIDEpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfTV9kZWFsbG9jYXRlX25vZGVzKF9Ob2RlKiogX19hcnJheSwgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBmb3IgKHNpemVfdHlwZSBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorCXsKKwkgIF9Ob2RlKiBfX3AgPSBfX2FycmF5W19faV07CisJICB3aGlsZSAoX19wKQorCSAgICB7CisJICAgICAgX05vZGUqIF9fdG1wID0gX19wOworCSAgICAgIF9fcCA9IF9fcC0+X01fbmV4dDsKKwkgICAgICBfTV9kZWFsbG9jYXRlX25vZGUoX190bXApOworCSAgICB9CisJICBfX2FycmF5W19faV0gPSAwOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9fY2hjLCBfX2NpdCwgX191az46Ol9Ob2RlKioKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfTV9hbGxvY2F0ZV9idWNrZXRzKHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX0J1Y2tldF9hbGxvY2F0b3JfdHlwZSBfX2FsbG9jKF9NX25vZGVfYWxsb2NhdG9yKTsKKworICAgICAgLy8gV2UgYWxsb2NhdGUgb25lIGV4dHJhIGJ1Y2tldCB0byBob2xkIGEgc2VudGluZWwsIGFuIGFyYml0cmFyeQorICAgICAgLy8gbm9uLW51bGwgcG9pbnRlci4gIEl0ZXJhdG9yIGluY3JlbWVudCByZWxpZXMgb24gdGhpcy4KKyAgICAgIF9Ob2RlKiogX19wID0gX19hbGxvYy5hbGxvY2F0ZShfX24gKyAxKTsKKyAgICAgIHN0ZDo6ZmlsbChfX3AsIF9fcCArIF9fbiwgKF9Ob2RlKikgMCk7CisgICAgICBfX3BbX19uXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8X05vZGUqPigweDEwMDApOworICAgICAgcmV0dXJuIF9fcDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgX01fZGVhbGxvY2F0ZV9idWNrZXRzKF9Ob2RlKiogX19wLCBzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIF9CdWNrZXRfYWxsb2NhdG9yX3R5cGUgX19hbGxvYyhfTV9ub2RlX2FsbG9jYXRvcik7CisgICAgICBfX2FsbG9jLmRlYWxsb2NhdGUoX19wLCBfX24gKyAxKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfSGFzaHRhYmxlKHNpemVfdHlwZSBfX2J1Y2tldF9oaW50LAorCSAgICAgICBjb25zdCBfSDEmIF9faDEsIGNvbnN0IF9IMiYgX19oMiwgY29uc3QgX0hhc2gmIF9faCwKKwkgICAgICAgY29uc3QgX0VxdWFsJiBfX2VxLCBjb25zdCBfRXh0cmFjdEtleSYgX19leGssCisJICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX2RldGFpbDo6X1JlaGFzaF9iYXNlPF9SZWhhc2hQb2xpY3ksIF9IYXNodGFibGU+KCksCisgICAgICBfX2RldGFpbDo6X0hhc2hfY29kZV9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCQlfSDEsIF9IMiwgX0hhc2gsIF9fY2hjPihfX2V4aywgX19lcSwKKwkJCQkJCQlfX2gxLCBfX2gyLCBfX2gpLAorICAgICAgX19kZXRhaWw6Ol9NYXBfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfX3VrLCBfSGFzaHRhYmxlPigpLAorICAgICAgX01fbm9kZV9hbGxvY2F0b3IoX19hKSwKKyAgICAgIF9NX2J1Y2tldF9jb3VudCgwKSwKKyAgICAgIF9NX2VsZW1lbnRfY291bnQoMCksCisgICAgICBfTV9yZWhhc2hfcG9saWN5KCkKKyAgICB7CisgICAgICBfTV9idWNrZXRfY291bnQgPSBfTV9yZWhhc2hfcG9saWN5Ll9NX25leHRfYmt0KF9fYnVja2V0X2hpbnQpOworICAgICAgX01fYnVja2V0cyA9IF9NX2FsbG9jYXRlX2J1Y2tldHMoX01fYnVja2V0X2NvdW50KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICAgIF9IYXNodGFibGUoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCSBzaXplX3R5cGUgX19idWNrZXRfaGludCwKKwkJIGNvbnN0IF9IMSYgX19oMSwgY29uc3QgX0gyJiBfX2gyLCBjb25zdCBfSGFzaCYgX19oLAorCQkgY29uc3QgX0VxdWFsJiBfX2VxLCBjb25zdCBfRXh0cmFjdEtleSYgX19leGssCisJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfX2RldGFpbDo6X1JlaGFzaF9iYXNlPF9SZWhhc2hQb2xpY3ksIF9IYXNodGFibGU+KCksCisJX19kZXRhaWw6Ol9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQkJICBfSDEsIF9IMiwgX0hhc2gsIF9fY2hjPihfX2V4aywgX19lcSwKKwkJCQkJCQkgIF9faDEsIF9faDIsIF9faCksCisJX19kZXRhaWw6Ol9NYXBfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfX3VrLCBfSGFzaHRhYmxlPigpLAorCV9NX25vZGVfYWxsb2NhdG9yKF9fYSksCisJX01fYnVja2V0X2NvdW50KDApLAorCV9NX2VsZW1lbnRfY291bnQoMCksCisJX01fcmVoYXNoX3BvbGljeSgpCisgICAgICB7CisJX01fYnVja2V0X2NvdW50ID0gc3RkOjptYXgoX01fcmVoYXNoX3BvbGljeS5fTV9uZXh0X2JrdChfX2J1Y2tldF9oaW50KSwKKwkJCQkgICBfTV9yZWhhc2hfcG9saWN5LgorCQkJCSAgIF9NX2JrdF9mb3JfZWxlbWVudHMoX19kZXRhaWw6OgorCQkJCQkJICAgICAgIF9fZGlzdGFuY2VfZncoX19mLAorCQkJCQkJCQkgICAgIF9fbCkpKTsKKwlfTV9idWNrZXRzID0gX01fYWxsb2NhdGVfYnVja2V0cyhfTV9idWNrZXRfY291bnQpOworCV9fdHJ5CisJICB7CisJICAgIGZvciAoOyBfX2YgIT0gX19sOyArK19fZikKKwkgICAgICB0aGlzLT5pbnNlcnQoKl9fZik7CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIGNsZWFyKCk7CisJICAgIF9NX2RlYWxsb2NhdGVfYnVja2V0cyhfTV9idWNrZXRzLCBfTV9idWNrZXRfY291bnQpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIF9IYXNodGFibGUoY29uc3QgX0hhc2h0YWJsZSYgX19odCkKKyAgICA6IF9fZGV0YWlsOjpfUmVoYXNoX2Jhc2U8X1JlaGFzaFBvbGljeSwgX0hhc2h0YWJsZT4oX19odCksCisgICAgICBfX2RldGFpbDo6X0hhc2hfY29kZV9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCQlfSDEsIF9IMiwgX0hhc2gsIF9fY2hjPihfX2h0KSwKKyAgICAgIF9fZGV0YWlsOjpfTWFwX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX191aywgX0hhc2h0YWJsZT4oX19odCksCisgICAgICBfTV9ub2RlX2FsbG9jYXRvcihfX2h0Ll9NX25vZGVfYWxsb2NhdG9yKSwKKyAgICAgIF9NX2J1Y2tldF9jb3VudChfX2h0Ll9NX2J1Y2tldF9jb3VudCksCisgICAgICBfTV9lbGVtZW50X2NvdW50KF9faHQuX01fZWxlbWVudF9jb3VudCksCisgICAgICBfTV9yZWhhc2hfcG9saWN5KF9faHQuX01fcmVoYXNoX3BvbGljeSkKKyAgICB7CisgICAgICBfTV9idWNrZXRzID0gX01fYWxsb2NhdGVfYnVja2V0cyhfTV9idWNrZXRfY291bnQpOworICAgICAgX190cnkKKwl7CisJICBmb3IgKHNpemVfdHlwZSBfX2kgPSAwOyBfX2kgPCBfX2h0Ll9NX2J1Y2tldF9jb3VudDsgKytfX2kpCisJICAgIHsKKwkgICAgICBfTm9kZSogX19uID0gX19odC5fTV9idWNrZXRzW19faV07CisJICAgICAgX05vZGUqKiBfX3RhaWwgPSBfTV9idWNrZXRzICsgX19pOworCSAgICAgIHdoaWxlIChfX24pCisJCXsKKwkJICAqX190YWlsID0gX01fYWxsb2NhdGVfbm9kZShfX24tPl9NX3YpOworCQkgIHRoaXMtPl9NX2NvcHlfY29kZSgqX190YWlsLCBfX24pOworCQkgIF9fdGFpbCA9ICYoKCpfX3RhaWwpLT5fTV9uZXh0KTsKKwkJICBfX24gPSBfX24tPl9NX25leHQ7CisJCX0KKwkgICAgfQorCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIGNsZWFyKCk7CisJICBfTV9kZWFsbG9jYXRlX2J1Y2tldHMoX01fYnVja2V0cywgX01fYnVja2V0X2NvdW50KTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+JgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIG9wZXJhdG9yPShjb25zdCBfSGFzaHRhYmxlJiBfX2h0KQorICAgIHsKKyAgICAgIF9IYXNodGFibGUgX190bXAoX19odCk7CisgICAgICB0aGlzLT5zd2FwKF9fdG1wKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICB+X0hhc2h0YWJsZSgpCisgICAgeworICAgICAgY2xlYXIoKTsKKyAgICAgIF9NX2RlYWxsb2NhdGVfYnVja2V0cyhfTV9idWNrZXRzLCBfTV9idWNrZXRfY291bnQpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBzd2FwKF9IYXNodGFibGUmIF9feCkKKyAgICB7CisgICAgICAvLyBUaGUgb25seSBiYXNlIGNsYXNzIHdpdGggbWVtYmVyIHZhcmlhYmxlcyBpcyBoYXNoX2NvZGVfYmFzZS4gIFdlCisgICAgICAvLyBkZWZpbmUgX0hhc2hfY29kZV9iYXNlOjpfTV9zd2FwIGJlY2F1c2UgZGlmZmVyZW50IHNwZWNpYWxpemF0aW9ucworICAgICAgLy8gaGF2ZSBkaWZmZXJlbnQgbWVtYmVycy4KKyAgICAgIF9fZGV0YWlsOjpfSGFzaF9jb2RlX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCV9IMSwgX0gyLCBfSGFzaCwgX19jaGM+OjpfTV9zd2FwKF9feCk7CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQzMS4gU3dhcHBpbmcgY29udGFpbmVycyB3aXRoIHVuZXF1YWwgYWxsb2NhdG9ycy4KKyAgICAgIHN0ZDo6X19hbGxvY19zd2FwPF9Ob2RlX2FsbG9jYXRvcl90eXBlPjo6X1NfZG9faXQoX01fbm9kZV9hbGxvY2F0b3IsCisJCQkJCQkJX194Ll9NX25vZGVfYWxsb2NhdG9yKTsKKworICAgICAgc3RkOjpzd2FwKF9NX3JlaGFzaF9wb2xpY3ksIF9feC5fTV9yZWhhc2hfcG9saWN5KTsKKyAgICAgIHN0ZDo6c3dhcChfTV9idWNrZXRzLCBfX3guX01fYnVja2V0cyk7CisgICAgICBzdGQ6OnN3YXAoX01fYnVja2V0X2NvdW50LCBfX3guX01fYnVja2V0X2NvdW50KTsKKyAgICAgIHN0ZDo6c3dhcChfTV9lbGVtZW50X2NvdW50LCBfX3guX01fZWxlbWVudF9jb3VudCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdm9pZAorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIF9fcmVoYXNoX3BvbGljeShjb25zdCBfUmVoYXNoUG9saWN5JiBfX3BvbCkKKyAgICB7CisgICAgICBfTV9yZWhhc2hfcG9saWN5ID0gX19wb2w7CisgICAgICBzaXplX3R5cGUgX19uX2JrdCA9IF9fcG9sLl9NX2JrdF9mb3JfZWxlbWVudHMoX01fZWxlbWVudF9jb3VudCk7CisgICAgICBpZiAoX19uX2JrdCA+IF9NX2J1Y2tldF9jb3VudCkKKwlfTV9yZWhhc2goX19uX2JrdCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfX2NoYywgX19jaXQsIF9fdWs+OjppdGVyYXRvcgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICB7CisgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlOjpfSGFzaF9jb2RlX3R5cGUgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9fayk7CisgICAgICBzdGQ6OnNpemVfdCBfX24gPSB0aGlzLT5fTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUsIF9NX2J1Y2tldF9jb3VudCk7CisgICAgICBfTm9kZSogX19wID0gX01fZmluZF9ub2RlKF9NX2J1Y2tldHNbX19uXSwgX19rLCBfX2NvZGUpOworICAgICAgcmV0dXJuIF9fcCA/IGl0ZXJhdG9yKF9fcCwgX01fYnVja2V0cyArIF9fbikgOiB0aGlzLT5lbmQoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9fY2hjLCBfX2NpdCwgX191az46OmNvbnN0X2l0ZXJhdG9yCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVuYW1lIF9IYXNodGFibGU6Ol9IYXNoX2NvZGVfdHlwZSBfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUoX19rKTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fbiA9IHRoaXMtPl9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSwgX01fYnVja2V0X2NvdW50KTsKKyAgICAgIF9Ob2RlKiBfX3AgPSBfTV9maW5kX25vZGUoX01fYnVja2V0c1tfX25dLCBfX2ssIF9fY29kZSk7CisgICAgICByZXR1cm4gX19wID8gY29uc3RfaXRlcmF0b3IoX19wLCBfTV9idWNrZXRzICsgX19uKSA6IHRoaXMtPmVuZCgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX19jaGMsIF9fY2l0LCBfX3VrPjo6c2l6ZV90eXBlCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICB7CisgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlOjpfSGFzaF9jb2RlX3R5cGUgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9fayk7CisgICAgICBzdGQ6OnNpemVfdCBfX24gPSB0aGlzLT5fTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUsIF9NX2J1Y2tldF9jb3VudCk7CisgICAgICBzdGQ6OnNpemVfdCBfX3Jlc3VsdCA9IDA7CisgICAgICBmb3IgKF9Ob2RlKiBfX3AgPSBfTV9idWNrZXRzW19fbl07IF9fcDsgX19wID0gX19wLT5fTV9uZXh0KQorCWlmICh0aGlzLT5fTV9jb21wYXJlKF9faywgX19jb2RlLCBfX3ApKQorCSAgKytfX3Jlc3VsdDsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICBzdGQ6OnBhaXI8dHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsCisJCQkJICBfRXh0cmFjdEtleSwgX0VxdWFsLCBfSDEsCisJCQkJICBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJCSAgX19jaGMsIF9fY2l0LCBfX3VrPjo6aXRlcmF0b3IsCisJICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsCisJCQkJICBfRXh0cmFjdEtleSwgX0VxdWFsLCBfSDEsCisJCQkJICBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJCSAgX19jaGMsIF9fY2l0LCBfX3VrPjo6aXRlcmF0b3I+CisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICB7CisgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlOjpfSGFzaF9jb2RlX3R5cGUgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9fayk7CisgICAgICBzdGQ6OnNpemVfdCBfX24gPSB0aGlzLT5fTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUsIF9NX2J1Y2tldF9jb3VudCk7CisgICAgICBfTm9kZSoqIF9faGVhZCA9IF9NX2J1Y2tldHMgKyBfX247CisgICAgICBfTm9kZSogX19wID0gX01fZmluZF9ub2RlKCpfX2hlYWQsIF9faywgX19jb2RlKTsKKworICAgICAgaWYgKF9fcCkKKwl7CisJICBfTm9kZSogX19wMSA9IF9fcC0+X01fbmV4dDsKKwkgIGZvciAoOyBfX3AxOyBfX3AxID0gX19wMS0+X01fbmV4dCkKKwkgICAgaWYgKCF0aGlzLT5fTV9jb21wYXJlKF9faywgX19jb2RlLCBfX3AxKSkKKwkgICAgICBicmVhazsKKworCSAgaXRlcmF0b3IgX19maXJzdChfX3AsIF9faGVhZCk7CisJICBpdGVyYXRvciBfX2xhc3QoX19wMSwgX19oZWFkKTsKKwkgIGlmICghX19wMSkKKwkgICAgX19sYXN0Ll9NX2luY3JfYnVja2V0KCk7CisJICByZXR1cm4gc3RkOjptYWtlX3BhaXIoX19maXJzdCwgX19sYXN0KTsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHRoaXMtPmVuZCgpLCB0aGlzLT5lbmQoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgc3RkOjpwYWlyPHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLAorCQkJCSAgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLAorCQkJCSAgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCQkgIF9fY2hjLCBfX2NpdCwgX191az46OmNvbnN0X2l0ZXJhdG9yLAorCSAgICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLAorCQkJCSAgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLAorCQkJCSAgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCQkgIF9fY2hjLCBfX2NpdCwgX191az46OmNvbnN0X2l0ZXJhdG9yPgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0CisgICAgeworICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X0hhc2hfY29kZV90eXBlIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc3RkOjpzaXplX3QgX19uID0gdGhpcy0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlLCBfTV9idWNrZXRfY291bnQpOworICAgICAgX05vZGUqKiBfX2hlYWQgPSBfTV9idWNrZXRzICsgX19uOworICAgICAgX05vZGUqIF9fcCA9IF9NX2ZpbmRfbm9kZSgqX19oZWFkLCBfX2ssIF9fY29kZSk7CisKKyAgICAgIGlmIChfX3ApCisJeworCSAgX05vZGUqIF9fcDEgPSBfX3AtPl9NX25leHQ7CisJICBmb3IgKDsgX19wMTsgX19wMSA9IF9fcDEtPl9NX25leHQpCisJICAgIGlmICghdGhpcy0+X01fY29tcGFyZShfX2ssIF9fY29kZSwgX19wMSkpCisJICAgICAgYnJlYWs7CisKKwkgIGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QoX19wLCBfX2hlYWQpOworCSAgY29uc3RfaXRlcmF0b3IgX19sYXN0KF9fcDEsIF9faGVhZCk7CisJICBpZiAoIV9fcDEpCisJICAgIF9fbGFzdC5fTV9pbmNyX2J1Y2tldCgpOworCSAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKF9fZmlyc3QsIF9fbGFzdCk7CisJfQorICAgICAgZWxzZQorCXJldHVybiBzdGQ6Om1ha2VfcGFpcih0aGlzLT5lbmQoKSwgdGhpcy0+ZW5kKCkpOworICAgIH0KKworICAvLyBGaW5kIHRoZSBub2RlIHdob3NlIGtleSBjb21wYXJlcyBlcXVhbCB0byBrLCBiZWdpbm5pbmcgdGhlIHNlYXJjaAorICAvLyBhdCBwICh1c3VhbGx5IHRoZSBoZWFkIG9mIGEgYnVja2V0KS4gIFJldHVybiB6ZXJvIGlmIG5vIG5vZGUgaXMgZm91bmQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LAorCQkJX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfX2NoYywgX19jaXQsIF9fdWs+OjpfTm9kZSoKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfTV9maW5kX25vZGUoX05vZGUqIF9fcCwgY29uc3Qga2V5X3R5cGUmIF9faywKKwkJdHlwZW5hbWUgX0hhc2h0YWJsZTo6X0hhc2hfY29kZV90eXBlIF9fY29kZSkgY29uc3QKKyAgICB7CisgICAgICBmb3IgKDsgX19wOyBfX3AgPSBfX3AtPl9NX25leHQpCisJaWYgKHRoaXMtPl9NX2NvbXBhcmUoX19rLCBfX2NvZGUsIF9fcCkpCisJICByZXR1cm4gX19wOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8vIEluc2VydCB2IGluIGJ1Y2tldCBuIChhc3N1bWVzIG5vIGVsZW1lbnQgd2l0aCBpdHMga2V5IGFscmVhZHkgcHJlc2VudCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfX2NoYywgX19jaXQsIF9fdWs+OjppdGVyYXRvcgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIF9NX2luc2VydF9idWNrZXQoY29uc3QgdmFsdWVfdHlwZSYgX192LCBzaXplX3R5cGUgX19uLAorCQkgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X0hhc2hfY29kZV90eXBlIF9fY29kZSkKKyAgICB7CisgICAgICBzdGQ6OnBhaXI8Ym9vbCwgc3RkOjpzaXplX3Q+IF9fZG9fcmVoYXNoCisJPSBfTV9yZWhhc2hfcG9saWN5Ll9NX25lZWRfcmVoYXNoKF9NX2J1Y2tldF9jb3VudCwKKwkJCQkJICBfTV9lbGVtZW50X2NvdW50LCAxKTsKKworICAgICAgLy8gQWxsb2NhdGUgdGhlIG5ldyBub2RlIGJlZm9yZSBkb2luZyB0aGUgcmVoYXNoIHNvIHRoYXQgd2UgZG9uJ3QKKyAgICAgIC8vIGRvIGEgcmVoYXNoIGlmIHRoZSBhbGxvY2F0aW9uIHRocm93cy4KKyAgICAgIF9Ob2RlKiBfX25ld19ub2RlID0gX01fYWxsb2NhdGVfbm9kZShfX3YpOworCisgICAgICBfX3RyeQorCXsKKwkgIGlmIChfX2RvX3JlaGFzaC5maXJzdCkKKwkgICAgeworCSAgICAgIGNvbnN0IGtleV90eXBlJiBfX2sgPSB0aGlzLT5fTV9leHRyYWN0KF9fdik7CisJICAgICAgX19uID0gdGhpcy0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlLCBfX2RvX3JlaGFzaC5zZWNvbmQpOworCSAgICAgIF9NX3JlaGFzaChfX2RvX3JlaGFzaC5zZWNvbmQpOworCSAgICB9CisKKwkgIF9fbmV3X25vZGUtPl9NX25leHQgPSBfTV9idWNrZXRzW19fbl07CisJICB0aGlzLT5fTV9zdG9yZV9jb2RlKF9fbmV3X25vZGUsIF9fY29kZSk7CisJICBfTV9idWNrZXRzW19fbl0gPSBfX25ld19ub2RlOworCSAgKytfTV9lbGVtZW50X2NvdW50OworCSAgcmV0dXJuIGl0ZXJhdG9yKF9fbmV3X25vZGUsIF9NX2J1Y2tldHMgKyBfX24pOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIF9NX2RlYWxsb2NhdGVfbm9kZShfX25ld19ub2RlKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgLy8gSW5zZXJ0IHYgaWYgbm8gZWxlbWVudCB3aXRoIGl0cyBrZXkgaXMgYWxyZWFkeSBwcmVzZW50LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHN0ZDo6cGFpcjx0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwKKwkJCQkgIF9FeHRyYWN0S2V5LCBfRXF1YWwsIF9IMSwKKwkJCQkgIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQkJICBfX2NoYywgX19jaXQsIF9fdWs+OjppdGVyYXRvciwgYm9vbD4KKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgX01faW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fdiwgc3RkOjp0cjE6OnRydWVfdHlwZSkKKyAgICB7CisgICAgICBjb25zdCBrZXlfdHlwZSYgX19rID0gdGhpcy0+X01fZXh0cmFjdChfX3YpOworICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X0hhc2hfY29kZV90eXBlIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc2l6ZV90eXBlIF9fbiA9IHRoaXMtPl9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSwgX01fYnVja2V0X2NvdW50KTsKKworICAgICAgaWYgKF9Ob2RlKiBfX3AgPSBfTV9maW5kX25vZGUoX01fYnVja2V0c1tfX25dLCBfX2ssIF9fY29kZSkpCisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcCwgX01fYnVja2V0cyArIF9fbiksIGZhbHNlKTsKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihfTV9pbnNlcnRfYnVja2V0KF9fdiwgX19uLCBfX2NvZGUpLCB0cnVlKTsKKyAgICB9CisKKyAgLy8gSW5zZXJ0IHYgdW5jb25kaXRpb25hbGx5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX19jaGMsIF9fY2l0LCBfX3VrPjo6aXRlcmF0b3IKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfTV9pbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX192LCBzdGQ6OnRyMTo6ZmFsc2VfdHlwZSkKKyAgICB7CisgICAgICBzdGQ6OnBhaXI8Ym9vbCwgc3RkOjpzaXplX3Q+IF9fZG9fcmVoYXNoCisJPSBfTV9yZWhhc2hfcG9saWN5Ll9NX25lZWRfcmVoYXNoKF9NX2J1Y2tldF9jb3VudCwKKwkJCQkJICBfTV9lbGVtZW50X2NvdW50LCAxKTsKKyAgICAgIGlmIChfX2RvX3JlaGFzaC5maXJzdCkKKwlfTV9yZWhhc2goX19kb19yZWhhc2guc2Vjb25kKTsKKworICAgICAgY29uc3Qga2V5X3R5cGUmIF9fayA9IHRoaXMtPl9NX2V4dHJhY3QoX192KTsKKyAgICAgIHR5cGVuYW1lIF9IYXNodGFibGU6Ol9IYXNoX2NvZGVfdHlwZSBfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUoX19rKTsKKyAgICAgIHNpemVfdHlwZSBfX24gPSB0aGlzLT5fTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUsIF9NX2J1Y2tldF9jb3VudCk7CisKKyAgICAgIC8vIEZpcnN0IGZpbmQgdGhlIG5vZGUsIGF2b2lkIGxlYWtpbmcgbmV3X25vZGUgaWYgY29tcGFyZSB0aHJvd3MuCisgICAgICBfTm9kZSogX19wcmV2ID0gX01fZmluZF9ub2RlKF9NX2J1Y2tldHNbX19uXSwgX19rLCBfX2NvZGUpOworICAgICAgX05vZGUqIF9fbmV3X25vZGUgPSBfTV9hbGxvY2F0ZV9ub2RlKF9fdik7CisKKyAgICAgIGlmIChfX3ByZXYpCisJeworCSAgX19uZXdfbm9kZS0+X01fbmV4dCA9IF9fcHJldi0+X01fbmV4dDsKKwkgIF9fcHJldi0+X01fbmV4dCA9IF9fbmV3X25vZGU7CisJfQorICAgICAgZWxzZQorCXsKKwkgIF9fbmV3X25vZGUtPl9NX25leHQgPSBfTV9idWNrZXRzW19fbl07CisJICBfTV9idWNrZXRzW19fbl0gPSBfX25ld19ub2RlOworCX0KKyAgICAgIHRoaXMtPl9NX3N0b3JlX2NvZGUoX19uZXdfbm9kZSwgX19jb2RlKTsKKworICAgICAgKytfTV9lbGVtZW50X2NvdW50OworICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9fbmV3X25vZGUsIF9NX2J1Y2tldHMgKyBfX24pOworICAgIH0KKworICAvLyBGb3IgZXJhc2UoaXRlcmF0b3IpIGFuZCBlcmFzZShjb25zdF9pdGVyYXRvcikuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdm9pZAorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIF9NX2VyYXNlX25vZGUoX05vZGUqIF9fcCwgX05vZGUqKiBfX2IpCisgICAgeworICAgICAgX05vZGUqIF9fY3VyID0gKl9fYjsKKyAgICAgIGlmIChfX2N1ciA9PSBfX3ApCisJKl9fYiA9IF9fY3VyLT5fTV9uZXh0OworICAgICAgZWxzZQorCXsKKwkgIF9Ob2RlKiBfX25leHQgPSBfX2N1ci0+X01fbmV4dDsKKwkgIHdoaWxlIChfX25leHQgIT0gX19wKQorCSAgICB7CisJICAgICAgX19jdXIgPSBfX25leHQ7CisJICAgICAgX19uZXh0ID0gX19jdXItPl9NX25leHQ7CisJICAgIH0KKwkgIF9fY3VyLT5fTV9uZXh0ID0gX19uZXh0LT5fTV9uZXh0OworCX0KKworICAgICAgX01fZGVhbGxvY2F0ZV9ub2RlKF9fcCk7CisgICAgICAtLV9NX2VsZW1lbnRfY291bnQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCXNpemVfdHlwZSBfX25fZWx0ID0gX19kZXRhaWw6Ol9fZGlzdGFuY2VfZncoX19maXJzdCwgX19sYXN0KTsKKwlzdGQ6OnBhaXI8Ym9vbCwgc3RkOjpzaXplX3Q+IF9fZG9fcmVoYXNoCisJICA9IF9NX3JlaGFzaF9wb2xpY3kuX01fbmVlZF9yZWhhc2goX01fYnVja2V0X2NvdW50LAorCQkJCQkgICAgX01fZWxlbWVudF9jb3VudCwgX19uX2VsdCk7CisJaWYgKF9fZG9fcmVoYXNoLmZpcnN0KQorCSAgX01fcmVoYXNoKF9fZG9fcmVoYXNoLnNlY29uZCk7CisKKwlmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwkgIHRoaXMtPmluc2VydCgqX19maXJzdCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9fY2hjLCBfX2NpdCwgX191az46Oml0ZXJhdG9yCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgZXJhc2UoaXRlcmF0b3IgX19pdCkKKyAgICB7CisgICAgICBpdGVyYXRvciBfX3Jlc3VsdCA9IF9faXQ7CisgICAgICArK19fcmVzdWx0OworICAgICAgX01fZXJhc2Vfbm9kZShfX2l0Ll9NX2N1cl9ub2RlLCBfX2l0Ll9NX2N1cl9idWNrZXQpOworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX19jaGMsIF9fY2l0LCBfX3VrPjo6Y29uc3RfaXRlcmF0b3IKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2l0KQorICAgIHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fcmVzdWx0ID0gX19pdDsKKyAgICAgICsrX19yZXN1bHQ7CisgICAgICBfTV9lcmFzZV9ub2RlKF9faXQuX01fY3VyX25vZGUsIF9faXQuX01fY3VyX2J1Y2tldCk7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfX2NoYywgX19jaXQsIF9fdWs+OjpzaXplX3R5cGUKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rKQorICAgIHsKKyAgICAgIHR5cGVuYW1lIF9IYXNodGFibGU6Ol9IYXNoX2NvZGVfdHlwZSBfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUoX19rKTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fbiA9IHRoaXMtPl9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSwgX01fYnVja2V0X2NvdW50KTsKKyAgICAgIHNpemVfdHlwZSBfX3Jlc3VsdCA9IDA7CisKKyAgICAgIF9Ob2RlKiogX19zbG90ID0gX01fYnVja2V0cyArIF9fbjsKKyAgICAgIHdoaWxlICgqX19zbG90ICYmICF0aGlzLT5fTV9jb21wYXJlKF9faywgX19jb2RlLCAqX19zbG90KSkKKwlfX3Nsb3QgPSAmKCgqX19zbG90KS0+X01fbmV4dCk7CisKKyAgICAgIF9Ob2RlKiogX19zYXZlZF9zbG90ID0gMDsKKyAgICAgIHdoaWxlICgqX19zbG90ICYmIHRoaXMtPl9NX2NvbXBhcmUoX19rLCBfX2NvZGUsICpfX3Nsb3QpKQorCXsKKwkgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgIC8vIDUyNi4gSXMgaXQgdW5kZWZpbmVkIGlmIGEgZnVuY3Rpb24gaW4gdGhlIHN0YW5kYXJkIGNoYW5nZXMKKwkgIC8vIGluIHBhcmFtZXRlcnM/CisJICBpZiAoJnRoaXMtPl9NX2V4dHJhY3QoKCpfX3Nsb3QpLT5fTV92KSAhPSAmX19rKQorCSAgICB7CisJICAgICAgX05vZGUqIF9fcCA9ICpfX3Nsb3Q7CisJICAgICAgKl9fc2xvdCA9IF9fcC0+X01fbmV4dDsKKwkgICAgICBfTV9kZWFsbG9jYXRlX25vZGUoX19wKTsKKwkgICAgICAtLV9NX2VsZW1lbnRfY291bnQ7CisJICAgICAgKytfX3Jlc3VsdDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgX19zYXZlZF9zbG90ID0gX19zbG90OworCSAgICAgIF9fc2xvdCA9ICYoKCpfX3Nsb3QpLT5fTV9uZXh0KTsKKwkgICAgfQorCX0KKworICAgICAgaWYgKF9fc2F2ZWRfc2xvdCkKKwl7CisJICBfTm9kZSogX19wID0gKl9fc2F2ZWRfc2xvdDsKKwkgICpfX3NhdmVkX3Nsb3QgPSBfX3AtPl9NX25leHQ7CisJICBfTV9kZWFsbG9jYXRlX25vZGUoX19wKTsKKwkgIC0tX01fZWxlbWVudF9jb3VudDsKKwkgICsrX19yZXN1bHQ7CisJfQorCisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8vID8/PyBUaGlzIGNvdWxkIGJlIG9wdGltaXplZCBieSB0YWtpbmcgYWR2YW50YWdlIG9mIHRoZSBidWNrZXQKKyAgLy8gc3RydWN0dXJlLCBidXQgaXQncyBub3QgY2xlYXIgdGhhdCBpdCdzIHdvcnRoIGRvaW5nLiAgSXQgcHJvYmFibHkKKyAgLy8gd291bGRuJ3QgZXZlbiBiZSBhbiBvcHRpbWl6YXRpb24gdW5sZXNzIHRoZSBsb2FkIGZhY3RvciBpcyBsYXJnZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9fY2hjLCBfX2NpdCwgX191az46Oml0ZXJhdG9yCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwlfX2ZpcnN0ID0gdGhpcy0+ZXJhc2UoX19maXJzdCk7CisgICAgICByZXR1cm4gX19sYXN0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX19jaGMsIF9fY2l0LCBfX3VrPjo6Y29uc3RfaXRlcmF0b3IKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorCV9fZmlyc3QgPSB0aGlzLT5lcmFzZShfX2ZpcnN0KTsKKyAgICAgIHJldHVybiBfX2xhc3Q7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdm9pZAorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIGNsZWFyKCkKKyAgICB7CisgICAgICBfTV9kZWFsbG9jYXRlX25vZGVzKF9NX2J1Y2tldHMsIF9NX2J1Y2tldF9jb3VudCk7CisgICAgICBfTV9lbGVtZW50X2NvdW50ID0gMDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgcmVoYXNoKHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX01fcmVoYXNoKHN0ZDo6bWF4KF9NX3JlaGFzaF9wb2xpY3kuX01fbmV4dF9ia3QoX19uKSwKKwkJCSBfTV9yZWhhc2hfcG9saWN5Ll9NX2JrdF9mb3JfZWxlbWVudHMoX01fZWxlbWVudF9jb3VudAorCQkJCQkJCSAgICAgICsgMSkpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgX01fcmVoYXNoKHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX05vZGUqKiBfX25ld19hcnJheSA9IF9NX2FsbG9jYXRlX2J1Y2tldHMoX19uKTsKKyAgICAgIF9fdHJ5CisJeworCSAgZm9yIChzaXplX3R5cGUgX19pID0gMDsgX19pIDwgX01fYnVja2V0X2NvdW50OyArK19faSkKKwkgICAgd2hpbGUgKF9Ob2RlKiBfX3AgPSBfTV9idWNrZXRzW19faV0pCisJICAgICAgeworCQlzdGQ6OnNpemVfdCBfX25ld19pbmRleCA9IHRoaXMtPl9NX2J1Y2tldF9pbmRleChfX3AsIF9fbik7CisJCV9NX2J1Y2tldHNbX19pXSA9IF9fcC0+X01fbmV4dDsKKwkJX19wLT5fTV9uZXh0ID0gX19uZXdfYXJyYXlbX19uZXdfaW5kZXhdOworCQlfX25ld19hcnJheVtfX25ld19pbmRleF0gPSBfX3A7CisJICAgICAgfQorCSAgX01fZGVhbGxvY2F0ZV9idWNrZXRzKF9NX2J1Y2tldHMsIF9NX2J1Y2tldF9jb3VudCk7CisJICBfTV9idWNrZXRfY291bnQgPSBfX247CisJICBfTV9idWNrZXRzID0gX19uZXdfYXJyYXk7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgLy8gQSBmYWlsdXJlIGhlcmUgbWVhbnMgdGhhdCBhIGhhc2ggZnVuY3Rpb24gdGhyZXcgYW4gZXhjZXB0aW9uLgorCSAgLy8gV2UgY2FuJ3QgcmVzdG9yZSB0aGUgcHJldmlvdXMgc3RhdGUgd2l0aG91dCBjYWxsaW5nIHRoZSBoYXNoCisJICAvLyBmdW5jdGlvbiBhZ2Fpbiwgc28gdGhlIG9ubHkgc2Vuc2libGUgcmVjb3ZlcnkgaXMgdG8gZGVsZXRlCisJICAvLyBldmVyeXRoaW5nLgorCSAgX01fZGVhbGxvY2F0ZV9ub2RlcyhfX25ld19hcnJheSwgX19uKTsKKwkgIF9NX2RlYWxsb2NhdGVfYnVja2V0cyhfX25ld19hcnJheSwgX19uKTsKKwkgIF9NX2RlYWxsb2NhdGVfbm9kZXMoX01fYnVja2V0cywgX01fYnVja2V0X2NvdW50KTsKKwkgIF9NX2VsZW1lbnRfY291bnQgPSAwOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSB0cjEKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0hBU0hUQUJMRV9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9oYXNodGFibGVfcG9saWN5LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9oYXNodGFibGVfcG9saWN5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdjODJkYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2hhc2h0YWJsZV9wb2xpY3kuaApAQCAtMCwwICsxLDc4MyBAQAorLy8gSW50ZXJuYWwgcG9saWN5IGhlYWRlciBmb3IgVFIxIHVub3JkZXJlZF9zZXQgYW5kIHVub3JkZXJlZF9tYXAgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9oYXNodGFibGVfcG9saWN5LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiAKKyAqICBAaGVhZGVybmFtZXt0cjEvdW5vcmRlcmVkX21hcCwgdHIxL3Vub3JkZXJlZF9zZXR9CisgKi8KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7IAorbmFtZXNwYWNlIHRyMQoreworbmFtZXNwYWNlIF9fZGV0YWlsCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIEhlbHBlciBmdW5jdGlvbjogcmV0dXJuIGRpc3RhbmNlKGZpcnN0LCBsYXN0KSBmb3IgZm9yd2FyZAorICAvLyBpdGVyYXRvcnMsIG9yIDAgZm9yIGlucHV0IGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGU8Y2xhc3MgX0l0ZXJhdG9yPgorICAgIGlubGluZSB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBfX2Rpc3RhbmNlX2Z3KF9JdGVyYXRvciBfX2ZpcnN0LCBfSXRlcmF0b3IgX19sYXN0LAorCQkgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKQorICAgIHsgcmV0dXJuIDA7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfSXRlcmF0b3I+CisgICAgaW5saW5lIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIF9fZGlzdGFuY2VfZncoX0l0ZXJhdG9yIF9fZmlyc3QsIF9JdGVyYXRvciBfX2xhc3QsCisJCSAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICB7IHJldHVybiBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfSXRlcmF0b3I+CisgICAgaW5saW5lIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIF9fZGlzdGFuY2VfZncoX0l0ZXJhdG9yIF9fZmlyc3QsIF9JdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSBfVGFnOworICAgICAgcmV0dXJuIF9fZGlzdGFuY2VfZncoX19maXJzdCwgX19sYXN0LCBfVGFnKCkpOworICAgIH0KKworICAvLyBBdXhpbGlhcnkgdHlwZXMgdXNlZCBmb3IgYWxsIGluc3RhbnRpYXRpb25zIG9mIF9IYXNodGFibGU6IG5vZGVzCisgIC8vIGFuZCBpdGVyYXRvcnMuCisgIAorICAvLyBOb2RlcywgdXNlZCB0byB3cmFwIGVsZW1lbnRzIHN0b3JlZCBpbiB0aGUgaGFzaCB0YWJsZS4gIEEgcG9saWN5CisgIC8vIHRlbXBsYXRlIHBhcmFtZXRlciBvZiBjbGFzcyB0ZW1wbGF0ZSBfSGFzaHRhYmxlIGNvbnRyb2xzIHdoZXRoZXIKKyAgLy8gbm9kZXMgYWxzbyBzdG9yZSBhIGhhc2ggY29kZS4gSW4gc29tZSBjYXNlcyAoZS5nLiBzdHJpbmdzKSB0aGlzCisgIC8vIG1heSBiZSBhIHBlcmZvcm1hbmNlIHdpbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCBib29sIF9fY2FjaGVfaGFzaF9jb2RlPgorICAgIHN0cnVjdCBfSGFzaF9ub2RlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZT4KKyAgICBzdHJ1Y3QgX0hhc2hfbm9kZTxfVmFsdWUsIHRydWU+CisgICAgeworICAgICAgX1ZhbHVlICAgICAgIF9NX3Y7CisgICAgICBzdGQ6OnNpemVfdCAgX01faGFzaF9jb2RlOworICAgICAgX0hhc2hfbm9kZSogIF9NX25leHQ7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWU+CisgICAgc3RydWN0IF9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4KKyAgICB7CisgICAgICBfVmFsdWUgICAgICAgX01fdjsKKyAgICAgIF9IYXNoX25vZGUqICBfTV9uZXh0OworICAgIH07CisKKyAgLy8gTG9jYWwgaXRlcmF0b3JzLCB1c2VkIHRvIGl0ZXJhdGUgd2l0aGluIGEgYnVja2V0IGJ1dCBub3QgYmV0d2VlbgorICAvLyBidWNrZXRzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX19jYWNoZT4KKyAgICBzdHJ1Y3QgX05vZGVfaXRlcmF0b3JfYmFzZQorICAgIHsKKyAgICAgIF9Ob2RlX2l0ZXJhdG9yX2Jhc2UoX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiBfX3ApCisgICAgICA6IF9NX2N1cihfX3ApIHsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICBfTV9pbmNyKCkKKyAgICAgIHsgX01fY3VyID0gX01fY3VyLT5fTV9uZXh0OyB9CisKKyAgICAgIF9IYXNoX25vZGU8X1ZhbHVlLCBfX2NhY2hlPiogIF9NX2N1cjsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NhY2hlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4mIF9feCwKKwkgICAgICAgY29uc3QgX05vZGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2N1ciA9PSBfX3kuX01fY3VyOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCBib29sIF9fY2FjaGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPiYgX194LAorCSAgICAgICBjb25zdCBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fY3VyICE9IF9feS5fTV9jdXI7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX19jb25zdGFudF9pdGVyYXRvcnMsIGJvb2wgX19jYWNoZT4KKyAgICBzdHJ1Y3QgX05vZGVfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9WYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICAgIF9fZ251X2N4eDo6X19jb25kaXRpb25hbF90eXBlPF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCQkJCSAgICBjb25zdCBfVmFsdWUqLCBfVmFsdWUqPjo6X190eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICAgIF9fZ251X2N4eDo6X19jb25kaXRpb25hbF90eXBlPF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCQkJCSAgICBjb25zdCBfVmFsdWUmLCBfVmFsdWUmPjo6X190eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgX05vZGVfaXRlcmF0b3IoKQorICAgICAgOiBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4oMCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfTm9kZV9pdGVyYXRvcihfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qIF9fcCkKKyAgICAgIDogX05vZGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+KF9fcCkgeyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2N1ci0+X01fdjsgfQorICAKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZih0aGlzLT5fTV9jdXItPl9NX3YpOyB9CisKKyAgICAgIF9Ob2RlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7IAorCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gKnRoaXM7IAorICAgICAgfQorICAKKyAgICAgIF9Ob2RlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgCisJX05vZGVfaXRlcmF0b3IgX190bXAoKnRoaXMpOworCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX19jb25zdGFudF9pdGVyYXRvcnMsIGJvb2wgX19jYWNoZT4KKyAgICBzdHJ1Y3QgX05vZGVfY29uc3RfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9WYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1ZhbHVlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBfVmFsdWUmICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgICAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIF9Ob2RlX2NvbnN0X2l0ZXJhdG9yKCkKKyAgICAgIDogX05vZGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+KDApIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgX05vZGVfY29uc3RfaXRlcmF0b3IoX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiBfX3ApCisgICAgICA6IF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPihfX3ApIHsgfQorCisgICAgICBfTm9kZV9jb25zdF9pdGVyYXRvcihjb25zdCBfTm9kZV9pdGVyYXRvcjxfVmFsdWUsIF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCQkJICAgX19jYWNoZT4mIF9feCkKKyAgICAgIDogX05vZGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+KF9feC5fTV9jdXIpIHsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9jdXItPl9NX3Y7IH0KKyAgCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YodGhpcy0+X01fY3VyLT5fTV92KTsgfQorCisgICAgICBfTm9kZV9jb25zdF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeyAKKwl0aGlzLT5fTV9pbmNyKCk7CisJcmV0dXJuICp0aGlzOyAKKyAgICAgIH0KKyAgCisgICAgICBfTm9kZV9jb25zdF9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IAorCV9Ob2RlX2NvbnN0X2l0ZXJhdG9yIF9fdG1wKCp0aGlzKTsKKwl0aGlzLT5fTV9pbmNyKCk7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCBib29sIF9fY2FjaGU+CisgICAgc3RydWN0IF9IYXNodGFibGVfaXRlcmF0b3JfYmFzZQorICAgIHsKKyAgICAgIF9IYXNodGFibGVfaXRlcmF0b3JfYmFzZShfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qIF9fbm9kZSwKKwkJCSAgICAgICBfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qKiBfX2J1Y2tldCkKKyAgICAgIDogX01fY3VyX25vZGUoX19ub2RlKSwgX01fY3VyX2J1Y2tldChfX2J1Y2tldCkgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luY3IoKQorICAgICAgeworCV9NX2N1cl9ub2RlID0gX01fY3VyX25vZGUtPl9NX25leHQ7CisJaWYgKCFfTV9jdXJfbm9kZSkKKwkgIF9NX2luY3JfYnVja2V0KCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luY3JfYnVja2V0KCk7CisKKyAgICAgIF9IYXNoX25vZGU8X1ZhbHVlLCBfX2NhY2hlPiogICBfTV9jdXJfbm9kZTsKKyAgICAgIF9IYXNoX25vZGU8X1ZhbHVlLCBfX2NhY2hlPioqICBfTV9jdXJfYnVja2V0OworICAgIH07CisKKyAgLy8gR2xvYmFsIGl0ZXJhdG9ycywgdXNlZCBmb3IgYXJiaXRyYXJ5IGl0ZXJhdGlvbiB3aXRoaW4gYSBoYXNoCisgIC8vIHRhYmxlLiAgTGFyZ2VyIGFuZCBtb3JlIGV4cGVuc2l2ZSB0aGFuIGxvY2FsIGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCBib29sIF9fY2FjaGU+CisgICAgdm9pZAorICAgIF9IYXNodGFibGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+OjoKKyAgICBfTV9pbmNyX2J1Y2tldCgpCisgICAgeworICAgICAgKytfTV9jdXJfYnVja2V0OworCisgICAgICAvLyBUaGlzIGxvb3AgcmVxdWlyZXMgdGhlIGJ1Y2tldCBhcnJheSB0byBoYXZlIGEgbm9uLW51bGwgc2VudGluZWwuCisgICAgICB3aGlsZSAoISpfTV9jdXJfYnVja2V0KQorCSsrX01fY3VyX2J1Y2tldDsKKyAgICAgIF9NX2N1cl9ub2RlID0gKl9NX2N1cl9idWNrZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NhY2hlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPiYgX194LAorCSAgICAgICBjb25zdCBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9jdXJfbm9kZSA9PSBfX3kuX01fY3VyX25vZGU7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX19jYWNoZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4mIF9feCwKKwkgICAgICAgY29uc3QgX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fY3VyX25vZGUgIT0gX195Ll9NX2N1cl9ub2RlOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCBib29sIF9fY29uc3RhbnRfaXRlcmF0b3JzLCBib29sIF9fY2FjaGU+CisgICAgc3RydWN0IF9IYXNodGFibGVfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1ZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZQorICAgICAgX19nbnVfY3h4OjpfX2NvbmRpdGlvbmFsX3R5cGU8X19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkJICAgIGNvbnN0IF9WYWx1ZSosIF9WYWx1ZSo+OjpfX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZQorICAgICAgX19nbnVfY3h4OjpfX2NvbmRpdGlvbmFsX3R5cGU8X19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkJICAgIGNvbnN0IF9WYWx1ZSYsIF9WYWx1ZSY+OjpfX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgICBfSGFzaHRhYmxlX2l0ZXJhdG9yKCkKKyAgICAgIDogX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4oMCwgMCkgeyB9CisKKyAgICAgIF9IYXNodGFibGVfaXRlcmF0b3IoX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiBfX3AsCisJCQkgIF9IYXNoX25vZGU8X1ZhbHVlLCBfX2NhY2hlPioqIF9fYikKKyAgICAgIDogX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4oX19wLCBfX2IpIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgX0hhc2h0YWJsZV9pdGVyYXRvcihfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qKiBfX2IpCisgICAgICA6IF9IYXNodGFibGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+KCpfX2IsIF9fYikgeyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2N1cl9ub2RlLT5fTV92OyB9CisgIAorICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKHRoaXMtPl9NX2N1cl9ub2RlLT5fTV92KTsgfQorCisgICAgICBfSGFzaHRhYmxlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7IAorCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisgIAorICAgICAgX0hhc2h0YWJsZV9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IAorCV9IYXNodGFibGVfaXRlcmF0b3IgX190bXAoKnRoaXMpOworCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX19jb25zdGFudF9pdGVyYXRvcnMsIGJvb2wgX19jYWNoZT4KKyAgICBzdHJ1Y3QgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcgorICAgIDogcHVibGljIF9IYXNodGFibGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+CisgICAgeworICAgICAgdHlwZWRlZiBfVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIGNvbnN0IF9WYWx1ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1ZhbHVlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yKCkKKyAgICAgIDogX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4oMCwgMCkgeyB9CisKKyAgICAgIF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3IoX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiBfX3AsCisJCQkJX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiogX19iKQorICAgICAgOiBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPihfX3AsIF9fYikgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yKF9IYXNoX25vZGU8X1ZhbHVlLCBfX2NhY2hlPioqIF9fYikKKyAgICAgIDogX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4oKl9fYiwgX19iKSB7IH0KKworICAgICAgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcihjb25zdCBfSGFzaHRhYmxlX2l0ZXJhdG9yPF9WYWx1ZSwKKwkJCQlfX2NvbnN0YW50X2l0ZXJhdG9ycywgX19jYWNoZT4mIF9feCkKKyAgICAgIDogX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4oX194Ll9NX2N1cl9ub2RlLAorCQkJCQkJICBfX3guX01fY3VyX2J1Y2tldCkgeyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2N1cl9ub2RlLT5fTV92OyB9CisgIAorICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKHRoaXMtPl9NX2N1cl9ub2RlLT5fTV92KTsgfQorCisgICAgICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7IAorCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisgIAorICAgICAgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IAorCV9IYXNodGFibGVfY29uc3RfaXRlcmF0b3IgX190bXAoKnRoaXMpOworCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisgICAgfTsKKworCisgIC8vIE1hbnkgb2YgY2xhc3MgdGVtcGxhdGUgX0hhc2h0YWJsZSdzIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIHBvbGljeQorICAvLyBjbGFzc2VzLiAgVGhlc2UgYXJlIGRlZmF1bHRzIGZvciB0aGUgcG9saWNpZXMuCisKKyAgLy8gRGVmYXVsdCByYW5nZSBoYXNoaW5nIGZ1bmN0aW9uOiB1c2UgZGl2aXNpb24gdG8gZm9sZCBhIGxhcmdlIG51bWJlcgorICAvLyBpbnRvIHRoZSByYW5nZSBbMCwgTikuCisgIHN0cnVjdCBfTW9kX3JhbmdlX2hhc2hpbmcKKyAgeworICAgIHR5cGVkZWYgc3RkOjpzaXplX3QgZmlyc3RfYXJndW1lbnRfdHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IHNlY29uZF9hcmd1bWVudF90eXBlOworICAgIHR5cGVkZWYgc3RkOjpzaXplX3QgcmVzdWx0X3R5cGU7CisKKyAgICByZXN1bHRfdHlwZQorICAgIG9wZXJhdG9yKCkoZmlyc3RfYXJndW1lbnRfdHlwZSBfX251bSwgc2Vjb25kX2FyZ3VtZW50X3R5cGUgX19kZW4pIGNvbnN0CisgICAgeyByZXR1cm4gX19udW0gJSBfX2RlbjsgfQorICB9OworCisgIC8vIERlZmF1bHQgcmFuZ2VkIGhhc2ggZnVuY3Rpb24gSC4gIEluIHByaW5jaXBsZSBpdCBzaG91bGQgYmUgYQorICAvLyBmdW5jdGlvbiBvYmplY3QgY29tcG9zZWQgZnJvbSBvYmplY3RzIG9mIHR5cGUgSDEgYW5kIEgyIHN1Y2ggdGhhdAorICAvLyBoKGssIE4pID0gaDIoaDEoayksIE4pLCBidXQgdGhhdCB3b3VsZCBtZWFuIG1ha2luZyBleHRyYSBjb3BpZXMgb2YKKyAgLy8gaDEgYW5kIGgyLiAgU28gaW5zdGVhZCB3ZSdsbCBqdXN0IHVzZSBhIHRhZyB0byB0ZWxsIGNsYXNzIHRlbXBsYXRlCisgIC8vIGhhc2h0YWJsZSB0byBkbyB0aGF0IGNvbXBvc2l0aW9uLgorICBzdHJ1Y3QgX0RlZmF1bHRfcmFuZ2VkX2hhc2ggeyB9OworCisgIC8vIERlZmF1bHQgdmFsdWUgZm9yIHJlaGFzaCBwb2xpY3kuICBCdWNrZXQgc2l6ZSBpcyAodXN1YWxseSkgdGhlCisgIC8vIHNtYWxsZXN0IHByaW1lIHRoYXQga2VlcHMgdGhlIGxvYWQgZmFjdG9yIHNtYWxsIGVub3VnaC4KKyAgc3RydWN0IF9QcmltZV9yZWhhc2hfcG9saWN5CisgIHsKKyAgICBfUHJpbWVfcmVoYXNoX3BvbGljeShmbG9hdCBfX3ogPSAxLjApCisgICAgOiBfTV9tYXhfbG9hZF9mYWN0b3IoX196KSwgX01fZ3Jvd3RoX2ZhY3RvcigyLmYpLCBfTV9uZXh0X3Jlc2l6ZSgwKSB7IH0KKworICAgIGZsb2F0CisgICAgbWF4X2xvYWRfZmFjdG9yKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9tYXhfbG9hZF9mYWN0b3I7IH0gICAgICAKKworICAgIC8vIFJldHVybiBhIGJ1Y2tldCBzaXplIG5vIHNtYWxsZXIgdGhhbiBuLgorICAgIHN0ZDo6c2l6ZV90CisgICAgX01fbmV4dF9ia3Qoc3RkOjpzaXplX3QgX19uKSBjb25zdDsKKyAgICAKKyAgICAvLyBSZXR1cm4gYSBidWNrZXQgY291bnQgYXBwcm9wcmlhdGUgZm9yIG4gZWxlbWVudHMKKyAgICBzdGQ6OnNpemVfdAorICAgIF9NX2JrdF9mb3JfZWxlbWVudHMoc3RkOjpzaXplX3QgX19uKSBjb25zdDsKKyAgICAKKyAgICAvLyBfX25fYmt0IGlzIGN1cnJlbnQgYnVja2V0IGNvdW50LCBfX25fZWx0IGlzIGN1cnJlbnQgZWxlbWVudCBjb3VudCwKKyAgICAvLyBhbmQgX19uX2lucyBpcyBudW1iZXIgb2YgZWxlbWVudHMgdG8gYmUgaW5zZXJ0ZWQuICBEbyB3ZSBuZWVkIHRvCisgICAgLy8gaW5jcmVhc2UgYnVja2V0IGNvdW50PyAgSWYgc28sIHJldHVybiBtYWtlX3BhaXIodHJ1ZSwgbiksIHdoZXJlIG4KKyAgICAvLyBpcyB0aGUgbmV3IGJ1Y2tldCBjb3VudC4gIElmIG5vdCwgcmV0dXJuIG1ha2VfcGFpcihmYWxzZSwgMCkuCisgICAgc3RkOjpwYWlyPGJvb2wsIHN0ZDo6c2l6ZV90PgorICAgIF9NX25lZWRfcmVoYXNoKHN0ZDo6c2l6ZV90IF9fbl9ia3QsIHN0ZDo6c2l6ZV90IF9fbl9lbHQsCisJCSAgIHN0ZDo6c2l6ZV90IF9fbl9pbnMpIGNvbnN0OworCisgICAgZW51bSB7IF9TX25fcHJpbWVzID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICE9IDggPyAyNTYgOiAyNTYgKyA0OCB9OworCisgICAgZmxvYXQgICAgICAgICAgICAgICAgX01fbWF4X2xvYWRfZmFjdG9yOworICAgIGZsb2F0ICAgICAgICAgICAgICAgIF9NX2dyb3d0aF9mYWN0b3I7CisgICAgbXV0YWJsZSBzdGQ6OnNpemVfdCAgX01fbmV4dF9yZXNpemU7CisgIH07CisKKyAgZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcgX19wcmltZV9saXN0W107CisKKyAgLy8gWFhYIFRoaXMgaXMgYSBoYWNrLiAgVGhlcmUncyBubyBnb29kIHJlYXNvbiBmb3IgYW55IG9mCisgIC8vIF9QcmltZV9yZWhhc2hfcG9saWN5J3MgbWVtYmVyIGZ1bmN0aW9ucyB0byBiZSBpbmxpbmUuICAKKworICAvLyBSZXR1cm4gYSBwcmltZSBubyBzbWFsbGVyIHRoYW4gbi4KKyAgaW5saW5lIHN0ZDo6c2l6ZV90CisgIF9QcmltZV9yZWhhc2hfcG9saWN5OjoKKyAgX01fbmV4dF9ia3Qoc3RkOjpzaXplX3QgX19uKSBjb25zdAorICB7CisgICAgY29uc3QgdW5zaWduZWQgbG9uZyogX19wID0gc3RkOjpsb3dlcl9ib3VuZChfX3ByaW1lX2xpc3QsIF9fcHJpbWVfbGlzdAorCQkJCQkJKyBfU19uX3ByaW1lcywgX19uKTsKKyAgICBfTV9uZXh0X3Jlc2l6ZSA9IAorICAgICAgc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KF9fYnVpbHRpbl9jZWlsKCpfX3AgKiBfTV9tYXhfbG9hZF9mYWN0b3IpKTsKKyAgICByZXR1cm4gKl9fcDsKKyAgfQorCisgIC8vIFJldHVybiB0aGUgc21hbGxlc3QgcHJpbWUgcCBzdWNoIHRoYXQgYWxwaGEgcCA+PSBuLCB3aGVyZSBhbHBoYQorICAvLyBpcyB0aGUgbG9hZCBmYWN0b3IuCisgIGlubGluZSBzdGQ6OnNpemVfdAorICBfUHJpbWVfcmVoYXNoX3BvbGljeTo6CisgIF9NX2JrdF9mb3JfZWxlbWVudHMoc3RkOjpzaXplX3QgX19uKSBjb25zdAorICB7CisgICAgY29uc3QgZmxvYXQgX19taW5fYmt0cyA9IF9fbiAvIF9NX21heF9sb2FkX2ZhY3RvcjsKKyAgICBjb25zdCB1bnNpZ25lZCBsb25nKiBfX3AgPSBzdGQ6Omxvd2VyX2JvdW5kKF9fcHJpbWVfbGlzdCwgX19wcmltZV9saXN0CisJCQkJCQkrIF9TX25fcHJpbWVzLCBfX21pbl9ia3RzKTsKKyAgICBfTV9uZXh0X3Jlc2l6ZSA9CisgICAgICBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oX19idWlsdGluX2NlaWwoKl9fcCAqIF9NX21heF9sb2FkX2ZhY3RvcikpOworICAgIHJldHVybiAqX19wOworICB9CisKKyAgLy8gRmluZHMgdGhlIHNtYWxsZXN0IHByaW1lIHAgc3VjaCB0aGF0IGFscGhhIHAgPiBfX25fZWx0ICsgX19uX2lucy4KKyAgLy8gSWYgcCA+IF9fbl9ia3QsIHJldHVybiBtYWtlX3BhaXIodHJ1ZSwgcCk7IG90aGVyd2lzZSByZXR1cm4KKyAgLy8gbWFrZV9wYWlyKGZhbHNlLCAwKS4gIEluIHByaW5jaXBsZSB0aGlzIGlzbid0IHZlcnkgZGlmZmVyZW50IGZyb20gCisgIC8vIF9NX2JrdF9mb3JfZWxlbWVudHMuCisKKyAgLy8gVGhlIG9ubHkgdHJpY2t5IHBhcnQgaXMgdGhhdCB3ZSdyZSBjYWNoaW5nIHRoZSBlbGVtZW50IGNvdW50IGF0CisgIC8vIHdoaWNoIHdlIG5lZWQgdG8gcmVoYXNoLCBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIGEgZmxvYXRpbmctcG9pbnQKKyAgLy8gbXVsdGlwbHkgZm9yIGV2ZXJ5IGluc2VydGlvbi4KKworICBpbmxpbmUgc3RkOjpwYWlyPGJvb2wsIHN0ZDo6c2l6ZV90PgorICBfUHJpbWVfcmVoYXNoX3BvbGljeTo6CisgIF9NX25lZWRfcmVoYXNoKHN0ZDo6c2l6ZV90IF9fbl9ia3QsIHN0ZDo6c2l6ZV90IF9fbl9lbHQsCisJCSBzdGQ6OnNpemVfdCBfX25faW5zKSBjb25zdAorICB7CisgICAgaWYgKF9fbl9lbHQgKyBfX25faW5zID4gX01fbmV4dF9yZXNpemUpCisgICAgICB7CisJZmxvYXQgX19taW5fYmt0cyA9ICgoZmxvYXQoX19uX2lucykgKyBmbG9hdChfX25fZWx0KSkKKwkJCSAgICAvIF9NX21heF9sb2FkX2ZhY3Rvcik7CisJaWYgKF9fbWluX2JrdHMgPiBfX25fYmt0KQorCSAgeworCSAgICBfX21pbl9ia3RzID0gc3RkOjptYXgoX19taW5fYmt0cywgX01fZ3Jvd3RoX2ZhY3RvciAqIF9fbl9ia3QpOworCSAgICBjb25zdCB1bnNpZ25lZCBsb25nKiBfX3AgPQorCSAgICAgIHN0ZDo6bG93ZXJfYm91bmQoX19wcmltZV9saXN0LCBfX3ByaW1lX2xpc3QgKyBfU19uX3ByaW1lcywKKwkJCSAgICAgICBfX21pbl9ia3RzKTsKKwkgICAgX01fbmV4dF9yZXNpemUgPSBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4KKwkgICAgICAoX19idWlsdGluX2NlaWwoKl9fcCAqIF9NX21heF9sb2FkX2ZhY3RvcikpOworCSAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIodHJ1ZSwgKl9fcCk7CisJICB9CisJZWxzZSAKKwkgIHsKKwkgICAgX01fbmV4dF9yZXNpemUgPSBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4KKwkgICAgICAoX19idWlsdGluX2NlaWwoX19uX2JrdCAqIF9NX21heF9sb2FkX2ZhY3RvcikpOworCSAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZmFsc2UsIDApOworCSAgfQorICAgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihmYWxzZSwgMCk7CisgIH0KKworICAvLyBCYXNlIGNsYXNzZXMgZm9yIHN0ZDo6dHIxOjpfSGFzaHRhYmxlLiAgV2UgZGVmaW5lIHRoZXNlIGJhc2UKKyAgLy8gY2xhc3NlcyBiZWNhdXNlIGluIHNvbWUgY2FzZXMgd2Ugd2FudCB0byBkbyBkaWZmZXJlbnQgdGhpbmdzCisgIC8vIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgYSBwb2xpY3kgY2xhc3MuICBJbiBzb21lIGNhc2VzIHRoZQorICAvLyBwb2xpY3kgY2xhc3MgYWZmZWN0cyB3aGljaCBtZW1iZXIgZnVuY3Rpb25zIGFuZCBuZXN0ZWQgdHlwZWRlZnMKKyAgLy8gYXJlIGRlZmluZWQ7IHdlIGhhbmRsZSB0aGF0IGJ5IHNwZWNpYWxpemluZyBiYXNlIGNsYXNzIHRlbXBsYXRlcy4KKyAgLy8gU2V2ZXJhbCBvZiB0aGUgYmFzZSBjbGFzcyB0ZW1wbGF0ZXMgbmVlZCB0byBhY2Nlc3Mgb3RoZXIgbWVtYmVycworICAvLyBvZiBjbGFzcyB0ZW1wbGF0ZSBfSGFzaHRhYmxlLCBzbyB3ZSB1c2UgdGhlICJjdXJpb3VzbHkgcmVjdXJyaW5nCisgIC8vIHRlbXBsYXRlIHBhdHRlcm4iIGZvciB0aGVtLgorCisgIC8vIGNsYXNzIHRlbXBsYXRlIF9NYXBfYmFzZS4gIElmIHRoZSBoYXNodGFibGUgaGFzIGEgdmFsdWUgdHlwZSBvZiB0aGUKKyAgLy8gZm9ybSBwYWlyPFQxLCBUMj4gYW5kIGEga2V5IGV4dHJhY3Rpb24gcG9saWN5IHRoYXQgcmV0dXJucyB0aGUKKyAgLy8gZmlyc3QgcGFydCBvZiB0aGUgcGFpciwgdGhlIGhhc2h0YWJsZSBnZXRzIGEgbWFwcGVkX3R5cGUgdHlwZWRlZi4KKyAgLy8gSWYgaXQgc2F0aXNmaWVzIHRob3NlIGNyaXRlcmlhIGFuZCBhbHNvIGhhcyB1bmlxdWUga2V5cywgdGhlbiBpdAorICAvLyBhbHNvIGdldHMgYW4gb3BlcmF0b3JbXS4gIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9FeCwgYm9vbCBfX3VuaXF1ZSwKKwkgICB0eXBlbmFtZSBfSGFzaHRhYmxlPgorICAgIHN0cnVjdCBfTWFwX2Jhc2UgeyB9OworCSAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSBfSGFzaHRhYmxlPgorICAgIHN0cnVjdCBfTWFwX2Jhc2U8X0tleSwgX1BhaXIsIHN0ZDo6X1NlbGVjdDFzdDxfUGFpcj4sIGZhbHNlLCBfSGFzaHRhYmxlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1BhaXI6OnNlY29uZF90eXBlIG1hcHBlZF90eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lIF9IYXNodGFibGU+CisgICAgc3RydWN0IF9NYXBfYmFzZTxfS2V5LCBfUGFpciwgc3RkOjpfU2VsZWN0MXN0PF9QYWlyPiwgdHJ1ZSwgX0hhc2h0YWJsZT4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9QYWlyOjpzZWNvbmRfdHlwZSBtYXBwZWRfdHlwZTsKKyAgICAgIAorICAgICAgbWFwcGVkX3R5cGUmCisgICAgICBvcGVyYXRvcltdKGNvbnN0IF9LZXkmIF9fayk7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgX0hhc2h0YWJsZT4KKyAgICB0eXBlbmFtZSBfTWFwX2Jhc2U8X0tleSwgX1BhaXIsIHN0ZDo6X1NlbGVjdDFzdDxfUGFpcj4sCisJCSAgICAgICB0cnVlLCBfSGFzaHRhYmxlPjo6bWFwcGVkX3R5cGUmCisgICAgX01hcF9iYXNlPF9LZXksIF9QYWlyLCBzdGQ6Ol9TZWxlY3Qxc3Q8X1BhaXI+LCB0cnVlLCBfSGFzaHRhYmxlPjo6CisgICAgb3BlcmF0b3JbXShjb25zdCBfS2V5JiBfX2spCisgICAgeworICAgICAgX0hhc2h0YWJsZSogX19oID0gc3RhdGljX2Nhc3Q8X0hhc2h0YWJsZSo+KHRoaXMpOworICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X0hhc2hfY29kZV90eXBlIF9fY29kZSA9IF9faC0+X01faGFzaF9jb2RlKF9fayk7CisgICAgICBzdGQ6OnNpemVfdCBfX24gPSBfX2gtPl9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSwKKwkJCQkJICAgICBfX2gtPl9NX2J1Y2tldF9jb3VudCk7CisKKyAgICAgIHR5cGVuYW1lIF9IYXNodGFibGU6Ol9Ob2RlKiBfX3AgPQorCV9faC0+X01fZmluZF9ub2RlKF9faC0+X01fYnVja2V0c1tfX25dLCBfX2ssIF9fY29kZSk7CisgICAgICBpZiAoIV9fcCkKKwlyZXR1cm4gX19oLT5fTV9pbnNlcnRfYnVja2V0KHN0ZDo6bWFrZV9wYWlyKF9faywgbWFwcGVkX3R5cGUoKSksCisJCQkJICAgICBfX24sIF9fY29kZSktPnNlY29uZDsKKyAgICAgIHJldHVybiAoX19wLT5fTV92KS5zZWNvbmQ7CisgICAgfQorCisgIC8vIGNsYXNzIHRlbXBsYXRlIF9SZWhhc2hfYmFzZS4gIEdpdmUgaGFzaHRhYmxlIHRoZSBtYXhfbG9hZF9mYWN0b3IKKyAgLy8gZnVuY3Rpb25zIGlmZiB0aGUgcmVoYXNoIHBvbGljeSBpcyBfUHJpbWVfcmVoYXNoX3BvbGljeS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlaGFzaFBvbGljeSwgdHlwZW5hbWUgX0hhc2h0YWJsZT4KKyAgICBzdHJ1Y3QgX1JlaGFzaF9iYXNlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSGFzaHRhYmxlPgorICAgIHN0cnVjdCBfUmVoYXNoX2Jhc2U8X1ByaW1lX3JlaGFzaF9wb2xpY3ksIF9IYXNodGFibGU+CisgICAgeworICAgICAgZmxvYXQKKyAgICAgIG1heF9sb2FkX2ZhY3RvcigpIGNvbnN0CisgICAgICB7CisJY29uc3QgX0hhc2h0YWJsZSogX190aGlzID0gc3RhdGljX2Nhc3Q8Y29uc3QgX0hhc2h0YWJsZSo+KHRoaXMpOworCXJldHVybiBfX3RoaXMtPl9fcmVoYXNoX3BvbGljeSgpLm1heF9sb2FkX2ZhY3RvcigpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBtYXhfbG9hZF9mYWN0b3IoZmxvYXQgX196KQorICAgICAgeworCV9IYXNodGFibGUqIF9fdGhpcyA9IHN0YXRpY19jYXN0PF9IYXNodGFibGUqPih0aGlzKTsKKwlfX3RoaXMtPl9fcmVoYXNoX3BvbGljeShfUHJpbWVfcmVoYXNoX3BvbGljeShfX3opKTsKKyAgICAgIH0KKyAgICB9OworCisgIC8vIENsYXNzIHRlbXBsYXRlIF9IYXNoX2NvZGVfYmFzZS4gIEVuY2Fwc3VsYXRlcyB0d28gcG9saWN5IGlzc3VlcyB0aGF0CisgIC8vIGFyZW4ndCBxdWl0ZSBvcnRob2dvbmFsLgorICAvLyAgICgxKSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHVzaW5nIGEgcmFuZ2VkIGhhc2ggZnVuY3Rpb24gYW5kIHVzaW5nCisgIC8vICAgICAgIHRoZSBjb21iaW5hdGlvbiBvZiBhIGhhc2ggZnVuY3Rpb24gYW5kIGEgcmFuZ2UtaGFzaGluZyBmdW5jdGlvbi4KKyAgLy8gICAgICAgSW4gdGhlIGZvcm1lciBjYXNlIHdlIGRvbid0IGhhdmUgc3VjaCB0aGluZ3MgYXMgaGFzaCBjb2Rlcywgc28KKyAgLy8gICAgICAgd2UgaGF2ZSBhIGR1bW15IHR5cGUgYXMgcGxhY2Vob2xkZXIuCisgIC8vICAgKDIpIFdoZXRoZXIgb3Igbm90IHdlIGNhY2hlIGhhc2ggY29kZXMuICBDYWNoaW5nIGhhc2ggY29kZXMgaXMKKyAgLy8gICAgICAgbWVhbmluZ2xlc3MgaWYgd2UgaGF2ZSBhIHJhbmdlZCBoYXNoIGZ1bmN0aW9uLgorICAvLyBXZSBhbHNvIHB1dCB0aGUga2V5IGV4dHJhY3Rpb24gYW5kIGVxdWFsaXR5IGNvbXBhcmlzb24gZnVuY3Rpb24gCisgIC8vIG9iamVjdHMgaGVyZSwgZm9yIGNvbnZlbmllbmNlLgorICAKKyAgLy8gUHJpbWFyeSB0ZW1wbGF0ZTogdW51c2VkIGV4Y2VwdCBhcyBhIGhvb2sgZm9yIHNwZWNpYWxpemF0aW9ucy4gIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsCisJICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZT4KKyAgICBzdHJ1Y3QgX0hhc2hfY29kZV9iYXNlOworCisgIC8vIFNwZWNpYWxpemF0aW9uOiByYW5nZWQgaGFzaCBmdW5jdGlvbiwgbm8gY2FjaGluZyBoYXNoIGNvZGVzLiAgSDEKKyAgLy8gYW5kIEgyIGFyZSBwcm92aWRlZCBidXQgaWdub3JlZC4gIFdlIGRlZmluZSBhIGR1bW15IGhhc2ggY29kZSB0eXBlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2g+CisgICAgc3RydWN0IF9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfRXF1YWwsIF9IMSwgX0gyLAorCQkJICAgX0hhc2gsIGZhbHNlPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfSGFzaF9jb2RlX2Jhc2UoY29uc3QgX0V4dHJhY3RLZXkmIF9fZXgsIGNvbnN0IF9FcXVhbCYgX19lcSwKKwkJICAgICAgY29uc3QgX0gxJiwgY29uc3QgX0gyJiwgY29uc3QgX0hhc2gmIF9faCkKKyAgICAgIDogX01fZXh0cmFjdChfX2V4KSwgX01fZXEoX19lcSksIF9NX3JhbmdlZF9oYXNoKF9faCkgeyB9CisKKyAgICAgIHR5cGVkZWYgdm9pZCogX0hhc2hfY29kZV90eXBlOworICAKKyAgICAgIF9IYXNoX2NvZGVfdHlwZQorICAgICAgX01faGFzaF9jb2RlKGNvbnN0IF9LZXkmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gMDsgfQorICAKKyAgICAgIHN0ZDo6c2l6ZV90CisgICAgICBfTV9idWNrZXRfaW5kZXgoY29uc3QgX0tleSYgX19rLCBfSGFzaF9jb2RlX3R5cGUsCisJCSAgICAgIHN0ZDo6c2l6ZV90IF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3JhbmdlZF9oYXNoKF9faywgX19uKTsgfQorCisgICAgICBzdGQ6OnNpemVfdAorICAgICAgX01fYnVja2V0X2luZGV4KGNvbnN0IF9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4qIF9fcCwKKwkJICAgICAgc3RkOjpzaXplX3QgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcmFuZ2VkX2hhc2goX01fZXh0cmFjdChfX3AtPl9NX3YpLCBfX24pOyB9CisgIAorICAgICAgYm9vbAorICAgICAgX01fY29tcGFyZShjb25zdCBfS2V5JiBfX2ssIF9IYXNoX2NvZGVfdHlwZSwKKwkJIF9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4qIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2VxKF9faywgX01fZXh0cmFjdChfX24tPl9NX3YpKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zdG9yZV9jb2RlKF9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4qLCBfSGFzaF9jb2RlX3R5cGUpIGNvbnN0CisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fY29weV9jb2RlKF9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4qLAorCQkgICBjb25zdCBfSGFzaF9ub2RlPF9WYWx1ZSwgZmFsc2U+KikgY29uc3QKKyAgICAgIHsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICBfTV9zd2FwKF9IYXNoX2NvZGVfYmFzZSYgX194KQorICAgICAgeworCXN0ZDo6c3dhcChfTV9leHRyYWN0LCBfX3guX01fZXh0cmFjdCk7CisJc3RkOjpzd2FwKF9NX2VxLCBfX3guX01fZXEpOworCXN0ZDo6c3dhcChfTV9yYW5nZWRfaGFzaCwgX194Ll9NX3JhbmdlZF9oYXNoKTsKKyAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9FeHRyYWN0S2V5ICBfTV9leHRyYWN0OworICAgICAgX0VxdWFsICAgICAgIF9NX2VxOworICAgICAgX0hhc2ggICAgICAgIF9NX3JhbmdlZF9oYXNoOworICAgIH07CisKKworICAvLyBObyBzcGVjaWFsaXphdGlvbiBmb3IgcmFuZ2VkIGhhc2ggZnVuY3Rpb24gd2hpbGUgY2FjaGluZyBoYXNoIGNvZGVzLgorICAvLyBUaGF0IGNvbWJpbmF0aW9uIGlzIG1lYW5pbmdsZXNzLCBhbmQgdHJ5aW5nIHRvIGRvIGl0IGlzIGFuIGVycm9yLgorICAKKyAgCisgIC8vIFNwZWNpYWxpemF0aW9uOiByYW5nZWQgaGFzaCBmdW5jdGlvbiwgY2FjaGUgaGFzaCBjb2Rlcy4gIFRoaXMKKyAgLy8gY29tYmluYXRpb24gaXMgbWVhbmluZ2xlc3MsIHNvIHdlIHByb3ZpZGUgb25seSBhIGRlY2xhcmF0aW9uCisgIC8vIGFuZCBubyBkZWZpbml0aW9uLiAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaD4KKyAgICBzdHJ1Y3QgX0hhc2hfY29kZV9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLCBfSDIsCisJCQkgICBfSGFzaCwgdHJ1ZT47CisKKyAgLy8gU3BlY2lhbGl6YXRpb246IGhhc2ggZnVuY3Rpb24gYW5kIHJhbmdlLWhhc2hpbmcgZnVuY3Rpb24sIG5vCisgIC8vIGNhY2hpbmcgb2YgaGFzaCBjb2Rlcy4gIEggaXMgcHJvdmlkZWQgYnV0IGlnbm9yZWQuICBQcm92aWRlcworICAvLyB0eXBlZGVmIGFuZCBhY2Nlc3NvciByZXF1aXJlZCBieSBUUjEuICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDI+CisgICAgc3RydWN0IF9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfRXF1YWwsIF9IMSwgX0gyLAorCQkJICAgX0RlZmF1bHRfcmFuZ2VkX2hhc2gsIGZhbHNlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0gxIGhhc2hlcjsKKworICAgICAgaGFzaGVyCisgICAgICBoYXNoX2Z1bmN0aW9uKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2gxOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfSGFzaF9jb2RlX2Jhc2UoY29uc3QgX0V4dHJhY3RLZXkmIF9fZXgsIGNvbnN0IF9FcXVhbCYgX19lcSwKKwkJICAgICAgY29uc3QgX0gxJiBfX2gxLCBjb25zdCBfSDImIF9faDIsCisJCSAgICAgIGNvbnN0IF9EZWZhdWx0X3JhbmdlZF9oYXNoJikKKyAgICAgIDogX01fZXh0cmFjdChfX2V4KSwgX01fZXEoX19lcSksIF9NX2gxKF9faDEpLCBfTV9oMihfX2gyKSB7IH0KKworICAgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCBfSGFzaF9jb2RlX3R5cGU7CisKKyAgICAgIF9IYXNoX2NvZGVfdHlwZQorICAgICAgX01faGFzaF9jb2RlKGNvbnN0IF9LZXkmIF9faykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2gxKF9fayk7IH0KKyAgICAgIAorICAgICAgc3RkOjpzaXplX3QKKyAgICAgIF9NX2J1Y2tldF9pbmRleChjb25zdCBfS2V5JiwgX0hhc2hfY29kZV90eXBlIF9fYywKKwkJICAgICAgc3RkOjpzaXplX3QgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faDIoX19jLCBfX24pOyB9CisKKyAgICAgIHN0ZDo6c2l6ZV90CisgICAgICBfTV9idWNrZXRfaW5kZXgoY29uc3QgX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiogX19wLAorCQkgICAgICBzdGQ6OnNpemVfdCBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oMihfTV9oMShfTV9leHRyYWN0KF9fcC0+X01fdikpLCBfX24pOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2NvbXBhcmUoY29uc3QgX0tleSYgX19rLCBfSGFzaF9jb2RlX3R5cGUsCisJCSBfSGFzaF9ub2RlPF9WYWx1ZSwgZmFsc2U+KiBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9lcShfX2ssIF9NX2V4dHJhY3QoX19uLT5fTV92KSk7IH0KKworICAgICAgdm9pZAorICAgICAgX01fc3RvcmVfY29kZShfSGFzaF9ub2RlPF9WYWx1ZSwgZmFsc2U+KiwgX0hhc2hfY29kZV90eXBlKSBjb25zdAorICAgICAgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2NvcHlfY29kZShfSGFzaF9ub2RlPF9WYWx1ZSwgZmFsc2U+KiwKKwkJICAgY29uc3QgX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiopIGNvbnN0CisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fc3dhcChfSGFzaF9jb2RlX2Jhc2UmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fZXh0cmFjdCwgX194Ll9NX2V4dHJhY3QpOworCXN0ZDo6c3dhcChfTV9lcSwgX194Ll9NX2VxKTsKKwlzdGQ6OnN3YXAoX01faDEsIF9feC5fTV9oMSk7CisJc3RkOjpzd2FwKF9NX2gyLCBfX3guX01faDIpOworICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgX0V4dHJhY3RLZXkgIF9NX2V4dHJhY3Q7CisgICAgICBfRXF1YWwgICAgICAgX01fZXE7CisgICAgICBfSDEgICAgICAgICAgX01faDE7CisgICAgICBfSDIgICAgICAgICAgX01faDI7CisgICAgfTsKKworICAvLyBTcGVjaWFsaXphdGlvbjogaGFzaCBmdW5jdGlvbiBhbmQgcmFuZ2UtaGFzaGluZyBmdW5jdGlvbiwgCisgIC8vIGNhY2hpbmcgaGFzaCBjb2Rlcy4gIEggaXMgcHJvdmlkZWQgYnV0IGlnbm9yZWQuICBQcm92aWRlcworICAvLyB0eXBlZGVmIGFuZCBhY2Nlc3NvciByZXF1aXJlZCBieSBUUjEuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyPgorICAgIHN0cnVjdCBfSGFzaF9jb2RlX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX0VxdWFsLCBfSDEsIF9IMiwKKwkJCSAgIF9EZWZhdWx0X3JhbmdlZF9oYXNoLCB0cnVlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0gxIGhhc2hlcjsKKyAgICAgIAorICAgICAgaGFzaGVyCisgICAgICBoYXNoX2Z1bmN0aW9uKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2gxOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfSGFzaF9jb2RlX2Jhc2UoY29uc3QgX0V4dHJhY3RLZXkmIF9fZXgsIGNvbnN0IF9FcXVhbCYgX19lcSwKKwkJICAgICAgY29uc3QgX0gxJiBfX2gxLCBjb25zdCBfSDImIF9faDIsCisJCSAgICAgIGNvbnN0IF9EZWZhdWx0X3JhbmdlZF9oYXNoJikKKyAgICAgIDogX01fZXh0cmFjdChfX2V4KSwgX01fZXEoX19lcSksIF9NX2gxKF9faDEpLCBfTV9oMihfX2gyKSB7IH0KKworICAgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCBfSGFzaF9jb2RlX3R5cGU7CisgIAorICAgICAgX0hhc2hfY29kZV90eXBlCisgICAgICBfTV9oYXNoX2NvZGUoY29uc3QgX0tleSYgX19rKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faDEoX19rKTsgfQorICAKKyAgICAgIHN0ZDo6c2l6ZV90CisgICAgICBfTV9idWNrZXRfaW5kZXgoY29uc3QgX0tleSYsIF9IYXNoX2NvZGVfdHlwZSBfX2MsCisJCSAgICAgIHN0ZDo6c2l6ZV90IF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2gyKF9fYywgX19uKTsgfQorCisgICAgICBzdGQ6OnNpemVfdAorICAgICAgX01fYnVja2V0X2luZGV4KGNvbnN0IF9IYXNoX25vZGU8X1ZhbHVlLCB0cnVlPiogX19wLAorCQkgICAgICBzdGQ6OnNpemVfdCBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oMihfX3AtPl9NX2hhc2hfY29kZSwgX19uKTsgfQorCisgICAgICBib29sCisgICAgICBfTV9jb21wYXJlKGNvbnN0IF9LZXkmIF9faywgX0hhc2hfY29kZV90eXBlIF9fYywKKwkJIF9IYXNoX25vZGU8X1ZhbHVlLCB0cnVlPiogX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX19jID09IF9fbi0+X01faGFzaF9jb2RlICYmIF9NX2VxKF9faywgX01fZXh0cmFjdChfX24tPl9NX3YpKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zdG9yZV9jb2RlKF9IYXNoX25vZGU8X1ZhbHVlLCB0cnVlPiogX19uLCBfSGFzaF9jb2RlX3R5cGUgX19jKSBjb25zdAorICAgICAgeyBfX24tPl9NX2hhc2hfY29kZSA9IF9fYzsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9jb3B5X2NvZGUoX0hhc2hfbm9kZTxfVmFsdWUsIHRydWU+KiBfX3RvLAorCQkgICBjb25zdCBfSGFzaF9ub2RlPF9WYWx1ZSwgdHJ1ZT4qIF9fZnJvbSkgY29uc3QKKyAgICAgIHsgX190by0+X01faGFzaF9jb2RlID0gX19mcm9tLT5fTV9oYXNoX2NvZGU7IH0KKworICAgICAgdm9pZAorICAgICAgX01fc3dhcChfSGFzaF9jb2RlX2Jhc2UmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fZXh0cmFjdCwgX194Ll9NX2V4dHJhY3QpOworCXN0ZDo6c3dhcChfTV9lcSwgX194Ll9NX2VxKTsKKwlzdGQ6OnN3YXAoX01faDEsIF9feC5fTV9oMSk7CisJc3RkOjpzd2FwKF9NX2gyLCBfX3guX01faDIpOworICAgICAgfQorICAgICAgCisgICAgcHJvdGVjdGVkOgorICAgICAgX0V4dHJhY3RLZXkgIF9NX2V4dHJhY3Q7CisgICAgICBfRXF1YWwgICAgICAgX01fZXE7CisgICAgICBfSDEgICAgICAgICAgX01faDE7CisgICAgICBfSDIgICAgICAgICAgX01faDI7CisgICAgfTsKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgX19kZXRhaWwKK30KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2h5cGVyZ2VvbWV0cmljLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2h5cGVyZ2VvbWV0cmljLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGY3MjU4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvaHlwZXJnZW9tZXRyaWMudGNjCkBAIC0wLDAgKzEsNzc1IEBACisvLyBTcGVjaWFsIGZ1bmN0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9oeXBlcmdlb21ldHJpYy50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt0cjEvY21hdGh9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODIgVFIxOiA1LjIgIFNwZWNpYWwgZnVuY3Rpb25zCisvLworCisvLyBXcml0dGVuIGJ5IEVkd2FyZCBTbWl0aC1Sb3dsYW5kIGJhc2VkOgorLy8gICAoMSkgSGFuZGJvb2sgb2YgTWF0aGVtYXRpY2FsIEZ1bmN0aW9ucywKKy8vICAgICAgIGVkLiBNaWx0b24gQWJyYW1vd2l0eiBhbmQgSXJlbmUgQS4gU3RlZ3VuLAorLy8gICAgICAgRG92ZXIgUHVibGljYXRpb25zLAorLy8gICAgICAgU2VjdGlvbiA2LCBwcC4gNTU1LTU2NgorLy8gICAoMikgVGhlIEdudSBTY2llbnRpZmljIExpYnJhcnksIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nc2wKKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfSFlQRVJHRU9NRVRSSUNfVENDCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9IWVBFUkdFT01FVFJJQ19UQ0MgMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKKyAgLy8gWzUuMl0gU3BlY2lhbCBmdW5jdGlvbnMKKworICAvLyBJbXBsZW1lbnRhdGlvbi1zcGFjZSBkZXRhaWxzLgorICBuYW1lc3BhY2UgX19kZXRhaWwKKyAgeworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgICAgLyoqCisgICAgICogICBAYnJpZWYgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGNvbmZsdWVudCBoeXBlcmdlb21ldHJpYyBmdW5jdGlvbgorICAgICAqICAgICAgICAgIGJ5IHNlcmllcyBleHBhbnNpb24uCisgICAgICogCisgICAgICogICBAZlsKKyAgICAgKiAgICAgXzFGXzEoYTtjO3gpID0gXGZyYWN7XEdhbW1hKGMpfXtcR2FtbWEoYSl9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgXHN1bV97bj0wfV57XGluZnR5fQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFxmcmFje1xHYW1tYShhK24pfXtcR2FtbWEoYytuKX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcZnJhY3t4Xm59e24hfQorICAgICAqICAgQGZdCisgICAgICogCisgICAgICogICBJZiBhIGFuZCBiIGFyZSBpbnRlZ2VycyBhbmQgYSA8IDAgYW5kIGVpdGhlciBiID4gMCBvciBiIDwgYQorICAgICAqICAgdGhlbiB0aGUgc2VyaWVzIGlzIGEgcG9seW5vbWlhbCB3aXRoIGEgZmluaXRlIG51bWJlciBvZgorICAgICAqICAgdGVybXMuICBJZiBiIGlzIGFuIGludGVnZXIgYW5kIGIgPD0gMCB0aGUgY29uZmx1ZW50CisgICAgICogICBoeXBlcmdlb21ldHJpYyBmdW5jdGlvbiBpcyB1bmRlZmluZWQuCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX19hICBUaGUgIm51bWVyYXRvciIgcGFyYW1ldGVyLgorICAgICAqICAgQHBhcmFtICBfX2MgIFRoZSAiZGVub21pbmF0b3IiIHBhcmFtZXRlci4KKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIGNvbmZsdWVudCBoeXBlcmdlb21ldHJpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBjb25mbHVlbnQgaHlwZXJnZW9tZXRyaWMgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fY29uZl9oeXBlcmdfc2VyaWVzKF9UcCBfX2EsIF9UcCBfX2MsIF9UcCBfX3gpCisgICAgeworICAgICAgY29uc3QgX1RwIF9fZXBzID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisKKyAgICAgIF9UcCBfX3Rlcm0gPSBfVHAoMSk7CisgICAgICBfVHAgX19GYWMgPSBfVHAoMSk7CisgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgX19tYXhfaXRlciA9IDEwMDAwMDsKKyAgICAgIHVuc2lnbmVkIGludCBfX2k7CisgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fbWF4X2l0ZXI7ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgX190ZXJtICo9IChfX2EgKyBfVHAoX19pKSkgKiBfX3gKKyAgICAgICAgICAgICAgICAgIC8gKChfX2MgKyBfVHAoX19pKSkgKiBfVHAoMSArIF9faSkpOworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX3Rlcm0pIDwgX19lcHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIF9fRmFjICs9IF9fdGVybTsKKyAgICAgICAgfQorICAgICAgaWYgKF9faSA9PSBfX21heF9pdGVyKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oIlNlcmllcyBmYWlsZWQgdG8gY29udmVyZ2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9fY29uZl9oeXBlcmdfc2VyaWVzLiIpKTsKKworICAgICAgcmV0dXJuIF9fRmFjOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIEBicmllZiAgUmV0dXJuIHRoZSBoeXBvZ2VvbWV0cmljIGZ1bmN0aW9uIEBmJCBfMkZfMShhLGI7Yzt4KSBAZiQKKyAgICAgKiAgICAgICAgICBieSBhbiBpdGVyYXRpdmUgcHJvY2VkdXJlIGRlc2NyaWJlZCBpbgorICAgICAqICAgICAgICAgIEx1a2UsIEFsZ29yaXRobXMgZm9yIHRoZSBDb21wdXRhdGlvbiBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zLgorICAgICAqCisgICAgICogIExpa2UgdGhlIGNhc2Ugb2YgdGhlIDJGMSByYXRpb25hbCBhcHByb3hpbWF0aW9ucywgdGhlc2UgYXJlIAorICAgICAqICBwcm9iYWJseSBndWFyYW50ZWVkIHRvIGNvbnZlcmdlIGZvciB4IDwgMCwgYmFycmluZyBncm9zcyAgICAKKyAgICAgKiAgbnVtZXJpY2FsIGluc3RhYmlsaXR5IGluIHRoZSBwcmUtYXN5bXB0b3RpYyByZWdpbWUuICAgICAgICAgCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fY29uZl9oeXBlcmdfbHVrZShfVHAgX19hLCBfVHAgX19jLCBfVHAgX194aW4pCisgICAgeworICAgICAgY29uc3QgX1RwIF9fYmlnID0gc3RkOjpwb3coc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjptYXgoKSwgX1RwKDAuMTZMKSk7CisgICAgICBjb25zdCBpbnQgX19ubWF4ID0gMjAwMDA7CisgICAgICBjb25zdCBfVHAgX19lcHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKTsKKyAgICAgIGNvbnN0IF9UcCBfX3ggID0gLV9feGluOworICAgICAgY29uc3QgX1RwIF9feDMgPSBfX3ggKiBfX3ggKiBfX3g7CisgICAgICBjb25zdCBfVHAgX190MCA9IF9fYSAvIF9fYzsKKyAgICAgIGNvbnN0IF9UcCBfX3QxID0gKF9fYSArIF9UcCgxKSkgLyAoX1RwKDIpICogX19jKTsKKyAgICAgIGNvbnN0IF9UcCBfX3QyID0gKF9fYSArIF9UcCgyKSkgLyAoX1RwKDIpICogKF9fYyArIF9UcCgxKSkpOworICAgICAgX1RwIF9fRiA9IF9UcCgxKTsKKyAgICAgIF9UcCBfX3ByZWM7CisKKyAgICAgIF9UcCBfX0JubTMgPSBfVHAoMSk7CisgICAgICBfVHAgX19Cbm0yID0gX1RwKDEpICsgX190MSAqIF9feDsKKyAgICAgIF9UcCBfX0JubTEgPSBfVHAoMSkgKyBfX3QyICogX194ICogKF9UcCgxKSArIF9fdDEgLyBfVHAoMykgKiBfX3gpOworCisgICAgICBfVHAgX19Bbm0zID0gX1RwKDEpOworICAgICAgX1RwIF9fQW5tMiA9IF9fQm5tMiAtIF9fdDAgKiBfX3g7CisgICAgICBfVHAgX19Bbm0xID0gX19Cbm0xIC0gX190MCAqIChfVHAoMSkgKyBfX3QyICogX194KSAqIF9feAorICAgICAgICAgICAgICAgICArIF9fdDAgKiBfX3QxICogKF9fYyAvIChfX2MgKyBfVHAoMSkpKSAqIF9feCAqIF9feDsKKworICAgICAgaW50IF9fbiA9IDM7CisgICAgICB3aGlsZSgxKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fbnBhbTEgPSBfVHAoX19uIC0gMSkgKyBfX2E7CisgICAgICAgICAgX1RwIF9fbnBjbTEgPSBfVHAoX19uIC0gMSkgKyBfX2M7CisgICAgICAgICAgX1RwIF9fbnBhbTIgPSBfVHAoX19uIC0gMikgKyBfX2E7CisgICAgICAgICAgX1RwIF9fbnBjbTIgPSBfVHAoX19uIC0gMikgKyBfX2M7CisgICAgICAgICAgX1RwIF9fdG5tMSAgPSBfVHAoMiAqIF9fbiAtIDEpOworICAgICAgICAgIF9UcCBfX3RubTMgID0gX1RwKDIgKiBfX24gLSAzKTsKKyAgICAgICAgICBfVHAgX190bm01ICA9IF9UcCgyICogX19uIC0gNSk7CisgICAgICAgICAgX1RwIF9fRjEgPSAgKF9UcChfX24gLSAyKSAtIF9fYSkgLyAoX1RwKDIpICogX190bm0zICogX19ucGNtMSk7CisgICAgICAgICAgX1RwIF9fRjIgPSAgKF9UcChfX24pICsgX19hKSAqIF9fbnBhbTEKKyAgICAgICAgICAgICAgICAgICAvIChfVHAoNCkgKiBfX3RubTEgKiBfX3RubTMgKiBfX25wY20yICogX19ucGNtMSk7CisgICAgICAgICAgX1RwIF9fRjMgPSAtX19ucGFtMiAqIF9fbnBhbTEgKiAoX1RwKF9fbiAtIDIpIC0gX19hKQorICAgICAgICAgICAgICAgICAgIC8gKF9UcCg4KSAqIF9fdG5tMyAqIF9fdG5tMyAqIF9fdG5tNQorICAgICAgICAgICAgICAgICAgICogKF9UcChfX24gLSAzKSArIF9fYykgKiBfX25wY20yICogX19ucGNtMSk7CisgICAgICAgICAgX1RwIF9fRSAgPSAtX19ucGFtMSAqIChfVHAoX19uIC0gMSkgLSBfX2MpCisgICAgICAgICAgICAgICAgICAgLyAoX1RwKDIpICogX190bm0zICogX19ucGNtMiAqIF9fbnBjbTEpOworCisgICAgICAgICAgX1RwIF9fQW4gPSAoX1RwKDEpICsgX19GMSAqIF9feCkgKiBfX0FubTEKKyAgICAgICAgICAgICAgICAgICArIChfX0UgKyBfX0YyICogX194KSAqIF9feCAqIF9fQW5tMiArIF9fRjMgKiBfX3gzICogX19Bbm0zOworICAgICAgICAgIF9UcCBfX0JuID0gKF9UcCgxKSArIF9fRjEgKiBfX3gpICogX19Cbm0xCisgICAgICAgICAgICAgICAgICAgKyAoX19FICsgX19GMiAqIF9feCkgKiBfX3ggKiBfX0JubTIgKyBfX0YzICogX194MyAqIF9fQm5tMzsKKyAgICAgICAgICBfVHAgX19yID0gX19BbiAvIF9fQm47CisKKyAgICAgICAgICBfX3ByZWMgPSBzdGQ6OmFicygoX19GIC0gX19yKSAvIF9fRik7CisgICAgICAgICAgX19GID0gX19yOworCisgICAgICAgICAgaWYgKF9fcHJlYyA8IF9fZXBzIHx8IF9fbiA+IF9fbm1heCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fQW4pID4gX19iaWcgfHwgc3RkOjphYnMoX19CbikgPiBfX2JpZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19BbiAgIC89IF9fYmlnOworICAgICAgICAgICAgICBfX0JuICAgLz0gX19iaWc7CisgICAgICAgICAgICAgIF9fQW5tMSAvPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Cbm0xIC89IF9fYmlnOworICAgICAgICAgICAgICBfX0FubTIgLz0gX19iaWc7CisgICAgICAgICAgICAgIF9fQm5tMiAvPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Bbm0zIC89IF9fYmlnOworICAgICAgICAgICAgICBfX0JubTMgLz0gX19iaWc7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoc3RkOjphYnMoX19BbikgPCBfVHAoMSkgLyBfX2JpZworICAgICAgICAgICAgICAgIHx8IHN0ZDo6YWJzKF9fQm4pIDwgX1RwKDEpIC8gX19iaWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fQW4gICAqPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19CbiAgICo9IF9fYmlnOworICAgICAgICAgICAgICBfX0FubTEgKj0gX19iaWc7CisgICAgICAgICAgICAgIF9fQm5tMSAqPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Bbm0yICo9IF9fYmlnOworICAgICAgICAgICAgICBfX0JubTIgKj0gX19iaWc7CisgICAgICAgICAgICAgIF9fQW5tMyAqPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Cbm0zICo9IF9fYmlnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgKytfX247CisgICAgICAgICAgX19Cbm0zID0gX19Cbm0yOworICAgICAgICAgIF9fQm5tMiA9IF9fQm5tMTsKKyAgICAgICAgICBfX0JubTEgPSBfX0JuOworICAgICAgICAgIF9fQW5tMyA9IF9fQW5tMjsKKyAgICAgICAgICBfX0FubTIgPSBfX0FubTE7CisgICAgICAgICAgX19Bbm0xID0gX19BbjsKKyAgICAgICAgfQorCisgICAgICBpZiAoX19uID49IF9fbm1heCkKKyAgICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJJdGVyYXRpb24gZmFpbGVkIHRvIGNvbnZlcmdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2NvbmZfaHlwZXJnX2x1a2UuIikpOworCisgICAgICByZXR1cm4gX19GOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgY29uZmx1ZW50IGh5cG9nZW9tZXRyaWMgZnVuY3Rpb24KKyAgICAgKiAgICAgICAgICAgQGYkIF8xRl8xKGE7Yzt4KSBAZiQuCisgICAgICogCisgICAgICogICBAdG9kbyAgSGFuZGxlIGIgPT0gbm9ucG9zaXRpdmUgaW50ZWdlciBibG93dXAgLSByZXR1cm4gTmFOLgorICAgICAqCisgICAgICogICBAcGFyYW0gIF9fYSAgVGhlIEBhIG51bWVyYXRvciBwYXJhbWV0ZXIuCisgICAgICogICBAcGFyYW0gIF9fYyAgVGhlIEBhIGRlbm9taW5hdG9yIHBhcmFtZXRlci4KKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIGNvbmZsdWVudCBoeXBlcmdlb21ldHJpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBjb25mbHVlbnQgaHlwZXJnZW9tZXRyaWMgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fY29uZl9oeXBlcmcoX1RwIF9fYSwgX1RwIF9fYywgX1RwIF9feCkKKyAgICB7CisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgICAgY29uc3QgX1RwIF9fY19uaW50ID0gc3RkOjp0cjE6Om5lYXJieWludChfX2MpOworI2Vsc2UKKyAgICAgIGNvbnN0IF9UcCBfX2NfbmludCA9IHN0YXRpY19jYXN0PGludD4oX19jICsgX1RwKDAuNUwpKTsKKyNlbmRpZgorICAgICAgaWYgKF9faXNuYW4oX19hKSB8fCBfX2lzbmFuKF9fYykgfHwgX19pc25hbihfX3gpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKF9fY19uaW50ID09IF9fYyAmJiBfX2NfbmludCA8PSAwKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjppbmZpbml0eSgpOworICAgICAgZWxzZSBpZiAoX19hID09IF9UcCgwKSkKKyAgICAgICAgcmV0dXJuIF9UcCgxKTsKKyAgICAgIGVsc2UgaWYgKF9fYyA9PSBfX2EpCisgICAgICAgIHJldHVybiBzdGQ6OmV4cChfX3gpOworICAgICAgZWxzZSBpZiAoX194IDwgX1RwKDApKQorICAgICAgICByZXR1cm4gX19jb25mX2h5cGVyZ19sdWtlKF9fYSwgX19jLCBfX3gpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX19jb25mX2h5cGVyZ19zZXJpZXMoX19hLCBfX2MsIF9feCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIGh5cG9nZW9tZXRyaWMgZnVuY3Rpb24gQGYkIF8yRl8xKGEsYjtjO3gpIEBmJAorICAgICAqICAgYnkgc2VyaWVzIGV4cGFuc2lvbi4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBoeXBvZ2VvbWV0cmljIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnkKKyAgICAgKiAgIEBmWworICAgICAqICAgICBfMkZfMShhLGI7Yzt4KSA9IFxmcmFje1xHYW1tYShjKX17XEdhbW1hKGEpXEdhbW1hKGIpfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFxzdW1fe249MH1ee1xpbmZ0eX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcZnJhY3tcR2FtbWEoYStuKVxHYW1tYShiK24pfXtcR2FtbWEoYytuKX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcZnJhY3t4Xm59e24hfQorICAgICAqICAgQGZdCisgICAgICogCisgICAgICogICBUaGlzIHdvcmtzIGFuZCBpdCdzIHByZXR0eSBmYXN0LgorICAgICAqCisgICAgICogICBAcGFyYW0gIF9fYSAgVGhlIGZpcnN0IEBhIG51bWVyYXRvciBwYXJhbWV0ZXIuCisgICAgICogICBAcGFyYW0gIF9fYSAgVGhlIHNlY29uZCBAYSBudW1lcmF0b3IgcGFyYW1ldGVyLgorICAgICAqICAgQHBhcmFtICBfX2MgIFRoZSBAYSBkZW5vbWluYXRvciBwYXJhbWV0ZXIuCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBjb25mbHVlbnQgaHlwZXJnZW9tZXRyaWMgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgY29uZmx1ZW50IGh5cGVyZ2VvbWV0cmljIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2h5cGVyZ19zZXJpZXMoX1RwIF9fYSwgX1RwIF9fYiwgX1RwIF9fYywgX1RwIF9feCkKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19lcHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKTsKKworICAgICAgX1RwIF9fdGVybSA9IF9UcCgxKTsKKyAgICAgIF9UcCBfX0ZhYmMgPSBfVHAoMSk7CisgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgX19tYXhfaXRlciA9IDEwMDAwMDsKKyAgICAgIHVuc2lnbmVkIGludCBfX2k7CisgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fbWF4X2l0ZXI7ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgX190ZXJtICo9IChfX2EgKyBfVHAoX19pKSkgKiAoX19iICsgX1RwKF9faSkpICogX194CisgICAgICAgICAgICAgICAgICAvICgoX19jICsgX1RwKF9faSkpICogX1RwKDEgKyBfX2kpKTsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX190ZXJtKSA8IF9fZXBzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBfX0ZhYmMgKz0gX190ZXJtOworICAgICAgICB9CisgICAgICBpZiAoX19pID09IF9fbWF4X2l0ZXIpCisgICAgICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiU2VyaWVzIGZhaWxlZCB0byBjb252ZXJnZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19oeXBlcmdfc2VyaWVzLiIpKTsKKworICAgICAgcmV0dXJuIF9fRmFiYzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIGh5cG9nZW9tZXRyaWMgZnVuY3Rpb24gQGYkIF8yRl8xKGEsYjtjO3gpIEBmJAorICAgICAqICAgICAgICAgICBieSBhbiBpdGVyYXRpdmUgcHJvY2VkdXJlIGRlc2NyaWJlZCBpbgorICAgICAqICAgICAgICAgICBMdWtlLCBBbGdvcml0aG1zIGZvciB0aGUgQ29tcHV0YXRpb24gb2YgTWF0aGVtYXRpY2FsIEZ1bmN0aW9ucy4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19oeXBlcmdfbHVrZShfVHAgX19hLCBfVHAgX19iLCBfVHAgX19jLCBfVHAgX194aW4pCisgICAgeworICAgICAgY29uc3QgX1RwIF9fYmlnID0gc3RkOjpwb3coc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjptYXgoKSwgX1RwKDAuMTZMKSk7CisgICAgICBjb25zdCBpbnQgX19ubWF4ID0gMjAwMDA7CisgICAgICBjb25zdCBfVHAgX19lcHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKTsKKyAgICAgIGNvbnN0IF9UcCBfX3ggID0gLV9feGluOworICAgICAgY29uc3QgX1RwIF9feDMgPSBfX3ggKiBfX3ggKiBfX3g7CisgICAgICBjb25zdCBfVHAgX190MCA9IF9fYSAqIF9fYiAvIF9fYzsKKyAgICAgIGNvbnN0IF9UcCBfX3QxID0gKF9fYSArIF9UcCgxKSkgKiAoX19iICsgX1RwKDEpKSAvIChfVHAoMikgKiBfX2MpOworICAgICAgY29uc3QgX1RwIF9fdDIgPSAoX19hICsgX1RwKDIpKSAqIChfX2IgKyBfVHAoMikpCisgICAgICAgICAgICAgICAgICAgICAvIChfVHAoMikgKiAoX19jICsgX1RwKDEpKSk7CisKKyAgICAgIF9UcCBfX0YgPSBfVHAoMSk7CisKKyAgICAgIF9UcCBfX0JubTMgPSBfVHAoMSk7CisgICAgICBfVHAgX19Cbm0yID0gX1RwKDEpICsgX190MSAqIF9feDsKKyAgICAgIF9UcCBfX0JubTEgPSBfVHAoMSkgKyBfX3QyICogX194ICogKF9UcCgxKSArIF9fdDEgLyBfVHAoMykgKiBfX3gpOworCisgICAgICBfVHAgX19Bbm0zID0gX1RwKDEpOworICAgICAgX1RwIF9fQW5tMiA9IF9fQm5tMiAtIF9fdDAgKiBfX3g7CisgICAgICBfVHAgX19Bbm0xID0gX19Cbm0xIC0gX190MCAqIChfVHAoMSkgKyBfX3QyICogX194KSAqIF9feAorICAgICAgICAgICAgICAgICArIF9fdDAgKiBfX3QxICogKF9fYyAvIChfX2MgKyBfVHAoMSkpKSAqIF9feCAqIF9feDsKKworICAgICAgaW50IF9fbiA9IDM7CisgICAgICB3aGlsZSAoMSkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX25wYW0xID0gX1RwKF9fbiAtIDEpICsgX19hOworICAgICAgICAgIGNvbnN0IF9UcCBfX25wYm0xID0gX1RwKF9fbiAtIDEpICsgX19iOworICAgICAgICAgIGNvbnN0IF9UcCBfX25wY20xID0gX1RwKF9fbiAtIDEpICsgX19jOworICAgICAgICAgIGNvbnN0IF9UcCBfX25wYW0yID0gX1RwKF9fbiAtIDIpICsgX19hOworICAgICAgICAgIGNvbnN0IF9UcCBfX25wYm0yID0gX1RwKF9fbiAtIDIpICsgX19iOworICAgICAgICAgIGNvbnN0IF9UcCBfX25wY20yID0gX1RwKF9fbiAtIDIpICsgX19jOworICAgICAgICAgIGNvbnN0IF9UcCBfX3RubTEgID0gX1RwKDIgKiBfX24gLSAxKTsKKyAgICAgICAgICBjb25zdCBfVHAgX190bm0zICA9IF9UcCgyICogX19uIC0gMyk7CisgICAgICAgICAgY29uc3QgX1RwIF9fdG5tNSAgPSBfVHAoMiAqIF9fbiAtIDUpOworICAgICAgICAgIGNvbnN0IF9UcCBfX24yID0gX19uICogX19uOworICAgICAgICAgIGNvbnN0IF9UcCBfX0YxID0gKF9UcCgzKSAqIF9fbjIgKyAoX19hICsgX19iIC0gX1RwKDYpKSAqIF9fbgorICAgICAgICAgICAgICAgICAgICAgICAgICsgX1RwKDIpIC0gX19hICogX19iIC0gX1RwKDIpICogKF9fYSArIF9fYikpCisgICAgICAgICAgICAgICAgICAgICAgICAgLyAoX1RwKDIpICogX190bm0zICogX19ucGNtMSk7CisgICAgICAgICAgY29uc3QgX1RwIF9fRjIgPSAtKF9UcCgzKSAqIF9fbjIgLSAoX19hICsgX19iICsgX1RwKDYpKSAqIF9fbgorICAgICAgICAgICAgICAgICAgICAgICAgICsgX1RwKDIpIC0gX19hICogX19iKSAqIF9fbnBhbTEgKiBfX25wYm0xCisgICAgICAgICAgICAgICAgICAgICAgICAgLyAoX1RwKDQpICogX190bm0xICogX190bm0zICogX19ucGNtMiAqIF9fbnBjbTEpOworICAgICAgICAgIGNvbnN0IF9UcCBfX0YzID0gKF9fbnBhbTIgKiBfX25wYW0xICogX19ucGJtMiAqIF9fbnBibTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIChfVHAoX19uIC0gMikgLSBfX2EpICogKF9UcChfX24gLSAyKSAtIF9fYikpCisgICAgICAgICAgICAgICAgICAgICAgICAgLyAoX1RwKDgpICogX190bm0zICogX190bm0zICogX190bm01CisgICAgICAgICAgICAgICAgICAgICAgICAgKiAoX1RwKF9fbiAtIDMpICsgX19jKSAqIF9fbnBjbTIgKiBfX25wY20xKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19FICA9IC1fX25wYW0xICogX19ucGJtMSAqIChfVHAoX19uIC0gMSkgLSBfX2MpCisgICAgICAgICAgICAgICAgICAgICAgICAgLyAoX1RwKDIpICogX190bm0zICogX19ucGNtMiAqIF9fbnBjbTEpOworCisgICAgICAgICAgX1RwIF9fQW4gPSAoX1RwKDEpICsgX19GMSAqIF9feCkgKiBfX0FubTEKKyAgICAgICAgICAgICAgICAgICArIChfX0UgKyBfX0YyICogX194KSAqIF9feCAqIF9fQW5tMiArIF9fRjMgKiBfX3gzICogX19Bbm0zOworICAgICAgICAgIF9UcCBfX0JuID0gKF9UcCgxKSArIF9fRjEgKiBfX3gpICogX19Cbm0xCisgICAgICAgICAgICAgICAgICAgKyAoX19FICsgX19GMiAqIF9feCkgKiBfX3ggKiBfX0JubTIgKyBfX0YzICogX194MyAqIF9fQm5tMzsKKyAgICAgICAgICBjb25zdCBfVHAgX19yID0gX19BbiAvIF9fQm47CisKKyAgICAgICAgICBjb25zdCBfVHAgX19wcmVjID0gc3RkOjphYnMoKF9fRiAtIF9fcikgLyBfX0YpOworICAgICAgICAgIF9fRiA9IF9fcjsKKworICAgICAgICAgIGlmIChfX3ByZWMgPCBfX2VwcyB8fCBfX24gPiBfX25tYXgpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX0FuKSA+IF9fYmlnIHx8IHN0ZDo6YWJzKF9fQm4pID4gX19iaWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fQW4gICAvPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19CbiAgIC89IF9fYmlnOworICAgICAgICAgICAgICBfX0FubTEgLz0gX19iaWc7CisgICAgICAgICAgICAgIF9fQm5tMSAvPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Bbm0yIC89IF9fYmlnOworICAgICAgICAgICAgICBfX0JubTIgLz0gX19iaWc7CisgICAgICAgICAgICAgIF9fQW5tMyAvPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Cbm0zIC89IF9fYmlnOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKHN0ZDo6YWJzKF9fQW4pIDwgX1RwKDEpIC8gX19iaWcKKyAgICAgICAgICAgICAgICB8fCBzdGQ6OmFicyhfX0JuKSA8IF9UcCgxKSAvIF9fYmlnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX0FuICAgKj0gX19iaWc7CisgICAgICAgICAgICAgIF9fQm4gICAqPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Bbm0xICo9IF9fYmlnOworICAgICAgICAgICAgICBfX0JubTEgKj0gX19iaWc7CisgICAgICAgICAgICAgIF9fQW5tMiAqPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Cbm0yICo9IF9fYmlnOworICAgICAgICAgICAgICBfX0FubTMgKj0gX19iaWc7CisgICAgICAgICAgICAgIF9fQm5tMyAqPSBfX2JpZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICsrX19uOworICAgICAgICAgIF9fQm5tMyA9IF9fQm5tMjsKKyAgICAgICAgICBfX0JubTIgPSBfX0JubTE7CisgICAgICAgICAgX19Cbm0xID0gX19CbjsKKyAgICAgICAgICBfX0FubTMgPSBfX0FubTI7CisgICAgICAgICAgX19Bbm0yID0gX19Bbm0xOworICAgICAgICAgIF9fQW5tMSA9IF9fQW47CisgICAgICAgIH0KKworICAgICAgaWYgKF9fbiA+PSBfX25tYXgpCisgICAgICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiSXRlcmF0aW9uIGZhaWxlZCB0byBjb252ZXJnZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19oeXBlcmdfbHVrZS4iKSk7CisKKyAgICAgIHJldHVybiBfX0Y7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBSZXR1cm4gdGhlIGh5cG9nZW9tZXRyaWMgZnVuY3Rpb24gQGYkIF8yRl8xKGEsYjtjO3gpIEBmJCAKKyAgICAgKiAgYnkgdGhlIHJlZmxlY3Rpb24gZm9ybXVsYWUgaW4gQWJyYW1vd2l0eiAmIFN0ZWd1biBmb3JtdWxhCisgICAgICogIDE1LjMuNiBmb3IgZCA9IGMgLSBhIC0gYiBub3QgaW50ZWdyYWwgYW5kIGZvcm11bGEgMTUuMy4xMSBmb3IKKyAgICAgKiAgZCA9IGMgLSBhIC0gYiBpbnRlZ3JhbC4gIFRoaXMgYXNzdW1lcyBhLCBiLCBjICE9IG5lZ2F0aXZlCisgICAgICogIGludGVnZXIuCisgICAgICoKKyAgICAgKiAgIFRoZSBoeXBvZ2VvbWV0cmljIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnkKKyAgICAgKiAgIEBmWworICAgICAqICAgICBfMkZfMShhLGI7Yzt4KSA9IFxmcmFje1xHYW1tYShjKX17XEdhbW1hKGEpXEdhbW1hKGIpfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFxzdW1fe249MH1ee1xpbmZ0eX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcZnJhY3tcR2FtbWEoYStuKVxHYW1tYShiK24pfXtcR2FtbWEoYytuKX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcZnJhY3t4Xm59e24hfQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIFRoZSByZWZsZWN0aW9uIGZvcm11bGEgZm9yIG5vbmludGVncmFsIEBmJCBkID0gYyAtIGEgLSBiIEBmJCBpczoKKyAgICAgKiAgIEBmWworICAgICAqICAgICBfMkZfMShhLGI7Yzt4KSA9IFxmcmFje1xHYW1tYShjKVxHYW1tYShkKX17XEdhbW1hKGMtYSlcR2FtbWEoYy1iKX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfMkZfMShhLGI7MS1kOzEteCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgKyBcZnJhY3tcR2FtbWEoYylcR2FtbWEoLWQpfXtcR2FtbWEoYSlcR2FtbWEoYil9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgXzJGXzEoYy1hLGMtYjsxK2Q7MS14KQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIFRoZSByZWZsZWN0aW9uIGZvcm11bGEgZm9yIGludGVncmFsIEBmJCBtID0gYyAtIGEgLSBiIEBmJCBpczoKKyAgICAgKiAgIEBmWworICAgICAqICAgICBfMkZfMShhLGI7YStiK207eCkgPSBcZnJhY3tcR2FtbWEobSlcR2FtbWEoYStiK20pfXtcR2FtbWEoYSttKVxHYW1tYShiK20pfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgXHN1bV97az0wfV57bS0xfSBcZnJhY3sobSthKV9rKG0rYilfa317ayEoMS1tKV9rfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIC0gCisgICAgICogICBAZl0KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19oeXBlcmdfcmVmbGVjdChfVHAgX19hLCBfVHAgX19iLCBfVHAgX19jLCBfVHAgX194KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX2QgPSBfX2MgLSBfX2EgLSBfX2I7CisgICAgICBjb25zdCBpbnQgX19pbnRkICA9IHN0ZDo6Zmxvb3IoX19kICsgX1RwKDAuNUwpKTsKKyAgICAgIGNvbnN0IF9UcCBfX2VwcyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworICAgICAgY29uc3QgX1RwIF9fdG9sZXIgPSBfVHAoMTAwMCkgKiBfX2VwczsKKyAgICAgIGNvbnN0IF9UcCBfX2xvZ19tYXggPSBzdGQ6OmxvZyhzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46Om1heCgpKTsKKyAgICAgIGNvbnN0IGJvb2wgX19kX2ludGVnZXIgPSAoc3RkOjphYnMoX19kIC0gX19pbnRkKSA8IF9fdG9sZXIpOworCisgICAgICBpZiAoX19kX2ludGVnZXIpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX19sbl9vbXggPSBzdGQ6OmxvZyhfVHAoMSkgLSBfX3gpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2FkID0gc3RkOjphYnMoX19kKTsKKyAgICAgICAgICBfVHAgX19GMSwgX19GMjsKKworICAgICAgICAgIF9UcCBfX2QxLCBfX2QyOworICAgICAgICAgIGlmIChfX2QgPj0gX1RwKDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX2QxID0gX19kOworICAgICAgICAgICAgICBfX2QyID0gX1RwKDApOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19kMSA9IF9UcCgwKTsKKyAgICAgICAgICAgICAgX19kMiA9IF9fZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGNvbnN0IF9UcCBfX2xuZ19jID0gX19sb2dfZ2FtbWEoX19jKTsKKworICAgICAgICAgIC8vICBFdmFsdWF0ZSBGMS4KKyAgICAgICAgICBpZiAoX19hZCA8IF9fZXBzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyAgZCA9IGMgLSBhIC0gYiA9IDAuCisgICAgICAgICAgICAgIF9fRjEgPSBfVHAoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgIGJvb2wgX19va19kMSA9IHRydWU7CisgICAgICAgICAgICAgIF9UcCBfX2xuZ19hZCwgX19sbmdfYWQxLCBfX2xuZ19iZDE7CisgICAgICAgICAgICAgIF9fdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX19sbmdfYWQgPSBfX2xvZ19nYW1tYShfX2FkKTsKKyAgICAgICAgICAgICAgICAgIF9fbG5nX2FkMSA9IF9fbG9nX2dhbW1hKF9fYSArIF9fZDEpOworICAgICAgICAgICAgICAgICAgX19sbmdfYmQxID0gX19sb2dfZ2FtbWEoX19iICsgX19kMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBfX2NhdGNoKC4uLikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfX29rX2QxID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChfX29rX2QxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIEdhbW1hIGZ1bmN0aW9ucyBpbiB0aGUgZGVub21pbmF0b3IgYXJlIG9rLgorICAgICAgICAgICAgICAgICAgICogUHJvY2VlZCB3aXRoIGV2YWx1YXRpb24uCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIF9UcCBfX3N1bTEgPSBfVHAoMSk7CisgICAgICAgICAgICAgICAgICBfVHAgX190ZXJtID0gX1RwKDEpOworICAgICAgICAgICAgICAgICAgX1RwIF9fbG5fcHJlMSA9IF9fbG5nX2FkICsgX19sbmdfYyArIF9fZDIgKiBfX2xuX29teAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIF9fbG5nX2FkMSAtIF9fbG5nX2JkMTsKKworICAgICAgICAgICAgICAgICAgLyogRG8gRjEgc3VtLgorICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBmb3IgKGludCBfX2kgPSAxOyBfX2kgPCBfX2FkOyArK19faSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBfX2ogPSBfX2kgLSAxOworICAgICAgICAgICAgICAgICAgICAgIF9fdGVybSAqPSAoX19hICsgX19kMiArIF9faikgKiAoX19iICsgX19kMiArIF9faikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKF9UcCgxKSArIF9fZDIgKyBfX2opIC8gX19pICogKF9UcCgxKSAtIF9feCk7CisgICAgICAgICAgICAgICAgICAgICAgX19zdW0xICs9IF9fdGVybTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBpZiAoX19sbl9wcmUxID4gX19sb2dfbWF4KQorICAgICAgICAgICAgICAgICAgICBzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oIk92ZXJmbG93IG9mIGdhbW1hIGZ1bmN0aW9ucyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW4gX19oeXBlcmdfbHVrZS4iKSk7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIF9fRjEgPSBzdGQ6OmV4cChfX2xuX3ByZTEpICogX19zdW0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8vICBHYW1tYSBmdW5jdGlvbnMgaW4gdGhlIGRlbm9taW5hdG9yIHdlcmUgbm90IG9rLgorICAgICAgICAgICAgICAgICAgLy8gIFNvIHRoZSBGMSB0ZXJtIGlzIHplcm8uCisgICAgICAgICAgICAgICAgICBfX0YxID0gX1RwKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLy8gZW5kIEYxIGV2YWx1YXRpb24KKworICAgICAgICAgIC8vIEV2YWx1YXRlIEYyLgorICAgICAgICAgIGJvb2wgX19va19kMiA9IHRydWU7CisgICAgICAgICAgX1RwIF9fbG5nX2FkMiwgX19sbmdfYmQyOworICAgICAgICAgIF9fdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fbG5nX2FkMiA9IF9fbG9nX2dhbW1hKF9fYSArIF9fZDIpOworICAgICAgICAgICAgICBfX2xuZ19iZDIgPSBfX2xvZ19nYW1tYShfX2IgKyBfX2QyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBfX2NhdGNoKC4uLikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19va19kMiA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKF9fb2tfZDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vICBHYW1tYSBmdW5jdGlvbnMgaW4gdGhlIGRlbm9taW5hdG9yIGFyZSBvay4KKyAgICAgICAgICAgICAgLy8gIFByb2NlZWQgd2l0aCBldmFsdWF0aW9uLgorICAgICAgICAgICAgICBjb25zdCBpbnQgX19tYXhpdGVyID0gMjAwMDsKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9fcHNpXzEgPSAtX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX2dhbW1hX2UoKTsKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9fcHNpXzFwZCA9IF9fcHNpKF9UcCgxKSArIF9fYWQpOworICAgICAgICAgICAgICBjb25zdCBfVHAgX19wc2lfYXBkMSA9IF9fcHNpKF9fYSArIF9fZDEpOworICAgICAgICAgICAgICBjb25zdCBfVHAgX19wc2lfYnBkMSA9IF9fcHNpKF9fYiArIF9fZDEpOworCisgICAgICAgICAgICAgIF9UcCBfX3BzaV90ZXJtID0gX19wc2lfMSArIF9fcHNpXzFwZCAtIF9fcHNpX2FwZDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBfX3BzaV9icGQxIC0gX19sbl9vbXg7CisgICAgICAgICAgICAgIF9UcCBfX2ZhY3QgPSBfVHAoMSk7CisgICAgICAgICAgICAgIF9UcCBfX3N1bTIgPSBfX3BzaV90ZXJtOworICAgICAgICAgICAgICBfVHAgX19sbl9wcmUyID0gX19sbmdfYyArIF9fZDEgKiBfX2xuX29teAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gX19sbmdfYWQyIC0gX19sbmdfYmQyOworCisgICAgICAgICAgICAgIC8vIERvIEYyIHN1bS4KKyAgICAgICAgICAgICAgaW50IF9fajsKKyAgICAgICAgICAgICAgZm9yIChfX2ogPSAxOyBfX2ogPCBfX21heGl0ZXI7ICsrX19qKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8vICBWYWx1ZXMgZm9yIHBzaSBmdW5jdGlvbnMgdXNlIHJlY3VycmVuY2U7CisgICAgICAgICAgICAgICAgICAvLyAgQWJyYW1vd2l0eiAmIFN0ZWd1biA2LjMuNQorICAgICAgICAgICAgICAgICAgY29uc3QgX1RwIF9fdGVybTEgPSBfVHAoMSkgLyBfVHAoX19qKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfVHAoMSkgLyAoX19hZCArIF9faik7CisgICAgICAgICAgICAgICAgICBjb25zdCBfVHAgX190ZXJtMiA9IF9UcCgxKSAvIChfX2EgKyBfX2QxICsgX1RwKF9faiAtIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfVHAoMSkgLyAoX19iICsgX19kMSArIF9UcChfX2ogLSAxKSk7CisgICAgICAgICAgICAgICAgICBfX3BzaV90ZXJtICs9IF9fdGVybTEgLSBfX3Rlcm0yOworICAgICAgICAgICAgICAgICAgX19mYWN0ICo9IChfX2EgKyBfX2QxICsgX1RwKF9faiAtIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAqIChfX2IgKyBfX2QxICsgX1RwKF9faiAtIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAvICgoX19hZCArIF9faikgKiBfX2opICogKF9UcCgxKSAtIF9feCk7CisgICAgICAgICAgICAgICAgICBjb25zdCBfVHAgX19kZWx0YSA9IF9fZmFjdCAqIF9fcHNpX3Rlcm07CisgICAgICAgICAgICAgICAgICBfX3N1bTIgKz0gX19kZWx0YTsKKyAgICAgICAgICAgICAgICAgIGlmIChzdGQ6OmFicyhfX2RlbHRhKSA8IF9fZXBzICogc3RkOjphYnMoX19zdW0yKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoX19qID09IF9fbWF4aXRlcikKKyAgICAgICAgICAgICAgICBzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oIlN1bSBGMiBmYWlsZWQgdG8gY29udmVyZ2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19oeXBlcmdfcmVmbGVjdCIpKTsKKworICAgICAgICAgICAgICBpZiAoX19zdW0yID09IF9UcCgwKSkKKyAgICAgICAgICAgICAgICBfX0YyID0gX1RwKDApOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX19GMiA9IHN0ZDo6ZXhwKF9fbG5fcHJlMikgKiBfX3N1bTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBHYW1tYSBmdW5jdGlvbnMgaW4gdGhlIGRlbm9taW5hdG9yIG5vdCBvay4KKyAgICAgICAgICAgICAgLy8gU28gdGhlIEYyIHRlcm0gaXMgemVyby4KKyAgICAgICAgICAgICAgX19GMiA9IF9UcCgwKTsKKyAgICAgICAgICAgIH0gLy8gZW5kIEYyIGV2YWx1YXRpb24KKworICAgICAgICAgIGNvbnN0IF9UcCBfX3Nnbl8yID0gKF9faW50ZCAlIDIgPT0gMSA/IC1fVHAoMSkgOiBfVHAoMSkpOworICAgICAgICAgIGNvbnN0IF9UcCBfX0YgPSBfX0YxICsgX19zZ25fMiAqIF9fRjI7CisKKyAgICAgICAgICByZXR1cm4gX19GOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvLyAgZCA9IGMgLSBhIC0gYiBub3QgYW4gaW50ZWdlci4KKworICAgICAgICAgIC8vICBUaGVzZSBnYW1tYSBmdW5jdGlvbnMgYXBwZWFyIGluIHRoZSBkZW5vbWluYXRvciwgc28gd2UKKyAgICAgICAgICAvLyAgY2F0Y2ggdGhlaXIgaGFybWxlc3MgZG9tYWluIGVycm9ycyBhbmQgc2V0IHRoZSB0ZXJtcyB0byB6ZXJvLgorICAgICAgICAgIGJvb2wgX19vazEgPSB0cnVlOworICAgICAgICAgIF9UcCBfX3Nnbl9nMWNhID0gX1RwKDApLCBfX2xuX2cxY2EgPSBfVHAoMCk7CisgICAgICAgICAgX1RwIF9fc2duX2cxY2IgPSBfVHAoMCksIF9fbG5fZzFjYiA9IF9UcCgwKTsKKyAgICAgICAgICBfX3RyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX3Nnbl9nMWNhID0gX19sb2dfZ2FtbWFfc2lnbihfX2MgLSBfX2EpOworICAgICAgICAgICAgICBfX2xuX2cxY2EgPSBfX2xvZ19nYW1tYShfX2MgLSBfX2EpOworICAgICAgICAgICAgICBfX3Nnbl9nMWNiID0gX19sb2dfZ2FtbWFfc2lnbihfX2MgLSBfX2IpOworICAgICAgICAgICAgICBfX2xuX2cxY2IgPSBfX2xvZ19nYW1tYShfX2MgLSBfX2IpOworICAgICAgICAgICAgfQorICAgICAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX29rMSA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgYm9vbCBfX29rMiA9IHRydWU7CisgICAgICAgICAgX1RwIF9fc2duX2cyYSA9IF9UcCgwKSwgX19sbl9nMmEgPSBfVHAoMCk7CisgICAgICAgICAgX1RwIF9fc2duX2cyYiA9IF9UcCgwKSwgX19sbl9nMmIgPSBfVHAoMCk7CisgICAgICAgICAgX190cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19zZ25fZzJhID0gX19sb2dfZ2FtbWFfc2lnbihfX2EpOworICAgICAgICAgICAgICBfX2xuX2cyYSA9IF9fbG9nX2dhbW1hKF9fYSk7CisgICAgICAgICAgICAgIF9fc2duX2cyYiA9IF9fbG9nX2dhbW1hX3NpZ24oX19iKTsKKyAgICAgICAgICAgICAgX19sbl9nMmIgPSBfX2xvZ19nYW1tYShfX2IpOworICAgICAgICAgICAgfQorICAgICAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX29rMiA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgY29uc3QgX1RwIF9fc2duX2djID0gX19sb2dfZ2FtbWFfc2lnbihfX2MpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2xuX2djID0gX19sb2dfZ2FtbWEoX19jKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19zZ25fZ2QgPSBfX2xvZ19nYW1tYV9zaWduKF9fZCk7CisgICAgICAgICAgY29uc3QgX1RwIF9fbG5fZ2QgPSBfX2xvZ19nYW1tYShfX2QpOworICAgICAgICAgIGNvbnN0IF9UcCBfX3Nnbl9nbWQgPSBfX2xvZ19nYW1tYV9zaWduKC1fX2QpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2xuX2dtZCA9IF9fbG9nX2dhbW1hKC1fX2QpOworCisgICAgICAgICAgY29uc3QgX1RwIF9fc2duMSA9IF9fc2duX2djICogX19zZ25fZ2QgICogX19zZ25fZzFjYSAqIF9fc2duX2cxY2I7CisgICAgICAgICAgY29uc3QgX1RwIF9fc2duMiA9IF9fc2duX2djICogX19zZ25fZ21kICogX19zZ25fZzJhICAqIF9fc2duX2cyYjsKKworICAgICAgICAgIF9UcCBfX3ByZTEsIF9fcHJlMjsKKyAgICAgICAgICBpZiAoX19vazEgJiYgX19vazIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9UcCBfX2xuX3ByZTEgPSBfX2xuX2djICsgX19sbl9nZCAgLSBfX2xuX2cxY2EgLSBfX2xuX2cxY2I7CisgICAgICAgICAgICAgIF9UcCBfX2xuX3ByZTIgPSBfX2xuX2djICsgX19sbl9nbWQgLSBfX2xuX2cyYSAgLSBfX2xuX2cyYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX19kICogc3RkOjpsb2coX1RwKDEpIC0gX194KTsKKyAgICAgICAgICAgICAgaWYgKF9fbG5fcHJlMSA8IF9fbG9nX21heCAmJiBfX2xuX3ByZTIgPCBfX2xvZ19tYXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX19wcmUxID0gc3RkOjpleHAoX19sbl9wcmUxKTsKKyAgICAgICAgICAgICAgICAgIF9fcHJlMiA9IHN0ZDo6ZXhwKF9fbG5fcHJlMik7CisgICAgICAgICAgICAgICAgICBfX3ByZTEgKj0gX19zZ24xOworICAgICAgICAgICAgICAgICAgX19wcmUyICo9IF9fc2duMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oIk92ZXJmbG93IG9mIGdhbW1hIGZ1bmN0aW9ucyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9faHlwZXJnX3JlZmxlY3QiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKF9fb2sxICYmICFfX29rMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX1RwIF9fbG5fcHJlMSA9IF9fbG5fZ2MgKyBfX2xuX2dkIC0gX19sbl9nMWNhIC0gX19sbl9nMWNiOworICAgICAgICAgICAgICBpZiAoX19sbl9wcmUxIDwgX19sb2dfbWF4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9fcHJlMSA9IHN0ZDo6ZXhwKF9fbG5fcHJlMSk7CisgICAgICAgICAgICAgICAgICBfX3ByZTEgKj0gX19zZ24xOworICAgICAgICAgICAgICAgICAgX19wcmUyID0gX1RwKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiT3ZlcmZsb3cgb2YgZ2FtbWEgZnVuY3Rpb25zICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19oeXBlcmdfcmVmbGVjdCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoIV9fb2sxICYmIF9fb2syKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfVHAgX19sbl9wcmUyID0gX19sbl9nYyArIF9fbG5fZ21kIC0gX19sbl9nMmEgLSBfX2xuX2cyYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX19kICogc3RkOjpsb2coX1RwKDEpIC0gX194KTsKKyAgICAgICAgICAgICAgaWYgKF9fbG5fcHJlMiA8IF9fbG9nX21heCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfX3ByZTEgPSBfVHAoMCk7CisgICAgICAgICAgICAgICAgICBfX3ByZTIgPSBzdGQ6OmV4cChfX2xuX3ByZTIpOworICAgICAgICAgICAgICAgICAgX19wcmUyICo9IF9fc2duMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oIk92ZXJmbG93IG9mIGdhbW1hIGZ1bmN0aW9ucyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9faHlwZXJnX3JlZmxlY3QiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19wcmUxID0gX1RwKDApOworICAgICAgICAgICAgICBfX3ByZTIgPSBfVHAoMCk7CisgICAgICAgICAgICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiVW5kZXJmbG93IG9mIGdhbW1hIGZ1bmN0aW9ucyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19oeXBlcmdfcmVmbGVjdCIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGNvbnN0IF9UcCBfX0YxID0gX19oeXBlcmdfc2VyaWVzKF9fYSwgX19iLCBfVHAoMSkgLSBfX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwKDEpIC0gX194KTsKKyAgICAgICAgICBjb25zdCBfVHAgX19GMiA9IF9faHlwZXJnX3NlcmllcyhfX2MgLSBfX2EsIF9fYyAtIF9fYiwgX1RwKDEpICsgX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcCgxKSAtIF9feCk7CisKKyAgICAgICAgICBjb25zdCBfVHAgX19GID0gX19wcmUxICogX19GMSArIF9fcHJlMiAqIF9fRjI7CisKKyAgICAgICAgICByZXR1cm4gX19GOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIGh5cG9nZW9tZXRyaWMgZnVuY3Rpb24gQGYkIF8yRl8xKGEsYjtjO3gpIEBmJC4KKyAgICAgKgorICAgICAqICAgVGhlIGh5cG9nZW9tZXRyaWMgZnVuY3Rpb24gaXMgZGVmaW5lZCBieQorICAgICAqICAgQGZbCisgICAgICogICAgIF8yRl8xKGEsYjtjO3gpID0gXGZyYWN7XEdhbW1hKGMpfXtcR2FtbWEoYSlcR2FtbWEoYil9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgXHN1bV97bj0wfV57XGluZnR5fQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFxmcmFje1xHYW1tYShhK24pXEdhbW1hKGIrbil9e1xHYW1tYShjK24pfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFxmcmFje3hebn17biF9CisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQHBhcmFtICBfX2EgIFRoZSBmaXJzdCBAYSBudW1lcmF0b3IgcGFyYW1ldGVyLgorICAgICAqICAgQHBhcmFtICBfX2EgIFRoZSBzZWNvbmQgQGEgbnVtZXJhdG9yIHBhcmFtZXRlci4KKyAgICAgKiAgIEBwYXJhbSAgX19jICBUaGUgQGEgZGVub21pbmF0b3IgcGFyYW1ldGVyLgorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBhcmd1bWVudCBvZiB0aGUgY29uZmx1ZW50IGh5cGVyZ2VvbWV0cmljIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGNvbmZsdWVudCBoeXBlcmdlb21ldHJpYyBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19oeXBlcmcoX1RwIF9fYSwgX1RwIF9fYiwgX1RwIF9fYywgX1RwIF9feCkKKyAgICB7CisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgICAgY29uc3QgX1RwIF9fYV9uaW50ID0gc3RkOjp0cjE6Om5lYXJieWludChfX2EpOworICAgICAgY29uc3QgX1RwIF9fYl9uaW50ID0gc3RkOjp0cjE6Om5lYXJieWludChfX2IpOworICAgICAgY29uc3QgX1RwIF9fY19uaW50ID0gc3RkOjp0cjE6Om5lYXJieWludChfX2MpOworI2Vsc2UKKyAgICAgIGNvbnN0IF9UcCBfX2FfbmludCA9IHN0YXRpY19jYXN0PGludD4oX19hICsgX1RwKDAuNUwpKTsKKyAgICAgIGNvbnN0IF9UcCBfX2JfbmludCA9IHN0YXRpY19jYXN0PGludD4oX19iICsgX1RwKDAuNUwpKTsKKyAgICAgIGNvbnN0IF9UcCBfX2NfbmludCA9IHN0YXRpY19jYXN0PGludD4oX19jICsgX1RwKDAuNUwpKTsKKyNlbmRpZgorICAgICAgY29uc3QgX1RwIF9fdG9sZXIgPSBfVHAoMTAwMCkgKiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKTsKKyAgICAgIGlmIChzdGQ6OmFicyhfX3gpID49IF9UcCgxKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkFyZ3VtZW50IG91dHNpZGUgdW5pdCBjaXJjbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19oeXBlcmcuIikpOworICAgICAgZWxzZSBpZiAoX19pc25hbihfX2EpIHx8IF9faXNuYW4oX19iKQorICAgICAgICAgICAgfHwgX19pc25hbihfX2MpIHx8IF9faXNuYW4oX194KSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChfX2NfbmludCA9PSBfX2MgJiYgX19jX25pbnQgPD0gX1RwKDApKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjppbmZpbml0eSgpOworICAgICAgZWxzZSBpZiAoc3RkOjphYnMoX19jIC0gX19iKSA8IF9fdG9sZXIgfHwgc3RkOjphYnMoX19jIC0gX19hKSA8IF9fdG9sZXIpCisgICAgICAgIHJldHVybiBzdGQ6OnBvdyhfVHAoMSkgLSBfX3gsIF9fYyAtIF9fYSAtIF9fYik7CisgICAgICBlbHNlIGlmIChfX2EgPj0gX1RwKDApICYmIF9fYiA+PSBfVHAoMCkgJiYgX19jID49IF9UcCgwKQorICAgICAgICAgICAgJiYgX194ID49IF9UcCgwKSAmJiBfX3ggPCBfVHAoMC45OTVMKSkKKyAgICAgICAgcmV0dXJuIF9faHlwZXJnX3NlcmllcyhfX2EsIF9fYiwgX19jLCBfX3gpOworICAgICAgZWxzZSBpZiAoc3RkOjphYnMoX19hKSA8IF9UcCgxMCkgJiYgc3RkOjphYnMoX19iKSA8IF9UcCgxMCkpCisgICAgICAgIHsKKyAgICAgICAgICAvLyAgRm9yIGludGVnZXIgYSBhbmQgYiB0aGUgaHlwZXJnZW9tZXRyaWMgZnVuY3Rpb24gaXMgYQorICAgICAgICAgIC8vICBmaW5pdGUgcG9seW5vbWlhbC4KKyAgICAgICAgICBpZiAoX19hIDwgX1RwKDApICAmJiAgc3RkOjphYnMoX19hIC0gX19hX25pbnQpIDwgX190b2xlcikKKyAgICAgICAgICAgIHJldHVybiBfX2h5cGVyZ19zZXJpZXMoX19hX25pbnQsIF9fYiwgX19jLCBfX3gpOworICAgICAgICAgIGVsc2UgaWYgKF9fYiA8IF9UcCgwKSAgJiYgIHN0ZDo6YWJzKF9fYiAtIF9fYl9uaW50KSA8IF9fdG9sZXIpCisgICAgICAgICAgICByZXR1cm4gX19oeXBlcmdfc2VyaWVzKF9fYSwgX19iX25pbnQsIF9fYywgX194KTsKKyAgICAgICAgICBlbHNlIGlmIChfX3ggPCAtX1RwKDAuMjVMKSkKKyAgICAgICAgICAgIHJldHVybiBfX2h5cGVyZ19sdWtlKF9fYSwgX19iLCBfX2MsIF9feCk7CisgICAgICAgICAgZWxzZSBpZiAoX194IDwgX1RwKDAuNUwpKQorICAgICAgICAgICAgcmV0dXJuIF9faHlwZXJnX3NlcmllcyhfX2EsIF9fYiwgX19jLCBfX3gpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIChzdGQ6OmFicyhfX2MpID4gX1RwKDEwKSkKKyAgICAgICAgICAgICAgcmV0dXJuIF9faHlwZXJnX3NlcmllcyhfX2EsIF9fYiwgX19jLCBfX3gpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICByZXR1cm4gX19oeXBlcmdfcmVmbGVjdChfX2EsIF9fYiwgX19jLCBfX3gpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfX2h5cGVyZ19sdWtlKF9fYSwgX19iLCBfX2MsIF9feCk7CisgICAgfQorCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSBzdGQ6OnRyMTo6X19kZXRhaWwKK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9IWVBFUkdFT01FVFJJQ19UQ0MKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2ludHR5cGVzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9pbnR0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZTJjZTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9pbnR0eXBlcy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIFRSMSBpbnR0eXBlcy5oIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvaW50dHlwZXMuaAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9JTlRUWVBFU19ICisjZGVmaW5lIF9HTElCQ1hYX1RSMV9JTlRUWVBFU19IIDEKKworI2luY2x1ZGUgPHRyMS9jaW50dHlwZXM+CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfSU5UVFlQRVNfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvbGVnZW5kcmVfZnVuY3Rpb24udGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvbGVnZW5kcmVfZnVuY3Rpb24udGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZWNmMDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9sZWdlbmRyZV9mdW5jdGlvbi50Y2MKQEAgLTAsMCArMSwzMDMgQEAKKy8vIFNwZWNpYWwgZnVuY3Rpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2xlZ2VuZHJlX2Z1bmN0aW9uLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3RyMS9jbWF0aH0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MiBUUjE6IDUuMiAgU3BlY2lhbCBmdW5jdGlvbnMKKy8vCisKKy8vIFdyaXR0ZW4gYnkgRWR3YXJkIFNtaXRoLVJvd2xhbmQgYmFzZWQgb246CisvLyAgICgxKSBIYW5kYm9vayBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zLAorLy8gICAgICAgZWQuIE1pbHRvbiBBYnJhbW93aXR6IGFuZCBJcmVuZSBBLiBTdGVndW4sCisvLyAgICAgICBEb3ZlciBQdWJsaWNhdGlvbnMsCisvLyAgICAgICBTZWN0aW9uIDgsIHBwLiAzMzEtMzQxCisvLyAgICgyKSBUaGUgR251IFNjaWVudGlmaWMgTGlicmFyeSwgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dzbAorLy8gICAoMykgTnVtZXJpY2FsIFJlY2lwZXMgaW4gQywgYnkgVy4gSC4gUHJlc3MsIFMuIEEuIFRldWtvbHNreSwKKy8vICAgICAgIFcuIFQuIFZldHRlcmxpbmcsIEIuIFAuIEZsYW5uZXJ5LCBDYW1icmlkZ2UgVW5pdmVyc2l0eSBQcmVzcyAoMTk5MiksCisvLyAgICAgICAybmQgZWQsIHBwLiAyNTItMjU0CisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0xFR0VORFJFX0ZVTkNUSU9OX1RDQworI2RlZmluZSBfR0xJQkNYWF9UUjFfTEVHRU5EUkVfRlVOQ1RJT05fVENDIDEKKworI2luY2x1ZGUgInNwZWNpYWxfZnVuY3Rpb25fdXRpbC5oIgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKKyAgLy8gWzUuMl0gU3BlY2lhbCBmdW5jdGlvbnMKKworICAvLyBJbXBsZW1lbnRhdGlvbi1zcGFjZSBkZXRhaWxzLgorICBuYW1lc3BhY2UgX19kZXRhaWwKKyAgeworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgTGVnZW5kcmUgcG9seW5vbWlhbCBieSByZWN1cnNpb24gb24gb3JkZXIKKyAgICAgKiAgICAgICAgICAgQGYkIGwgQGYkLgorICAgICAqIAorICAgICAqICAgVGhlIExlZ2VuZHJlIGZ1bmN0aW9uIG9mIEBmJCBsIEBmJCBhbmQgQGYkIHggQGYkLAorICAgICAqICAgQGYkIFBfbCh4KSBAZiQsIGlzIGRlZmluZWQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgUF9sKHgpID0gXGZyYWN7MX17Ml5sIGwhfVxmcmFje2RebH17ZHhebH0oeF4yIC0gMSlee2x9CisgICAgICogICBAZl0KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgbCAgVGhlIG9yZGVyIG9mIHRoZSBMZWdlbmRyZSBwb2x5bm9taWFsLiAgQGYkbCA+PSAwQGYkLgorICAgICAqICAgQHBhcmFtICB4ICBUaGUgYXJndW1lbnQgb2YgdGhlIExlZ2VuZHJlIHBvbHlub21pYWwuICBAZiR8eHwgPD0gMUBmJC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19wb2x5X2xlZ2VuZHJlX3AodW5zaWduZWQgaW50IF9fbCwgX1RwIF9feCkKKyAgICB7CisKKyAgICAgIGlmICgoX194IDwgX1RwKC0xKSkgfHwgKF9feCA+IF9UcCgrMSkpKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIF9fcG9seV9sZWdlbmRyZV9wLiIpKTsKKyAgICAgIGVsc2UgaWYgKF9faXNuYW4oX194KSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChfX3ggPT0gK19UcCgxKSkKKyAgICAgICAgcmV0dXJuICtfVHAoMSk7CisgICAgICBlbHNlIGlmIChfX3ggPT0gLV9UcCgxKSkKKyAgICAgICAgcmV0dXJuIChfX2wgJSAyID09IDEgPyAtX1RwKDEpIDogK19UcCgxKSk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19wX2xtMiA9IF9UcCgxKTsKKyAgICAgICAgICBpZiAoX19sID09IDApCisgICAgICAgICAgICByZXR1cm4gX19wX2xtMjsKKworICAgICAgICAgIF9UcCBfX3BfbG0xID0gX194OworICAgICAgICAgIGlmIChfX2wgPT0gMSkKKyAgICAgICAgICAgIHJldHVybiBfX3BfbG0xOworCisgICAgICAgICAgX1RwIF9fcF9sID0gMDsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2xsID0gMjsgX19sbCA8PSBfX2w7ICsrX19sbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gIFRoaXMgYXJyYW5nZW1lbnQgaXMgc3VwcG9zZWQgdG8gYmUgYmV0dGVyIGZvciByb3VuZG9mZgorICAgICAgICAgICAgICAvLyAgcHJvdGVjdGlvbiwgQXJma2VuLCAybmQgRWQsIEVxIDEyLjE3YS4KKyAgICAgICAgICAgICAgX19wX2wgPSBfVHAoMikgKiBfX3ggKiBfX3BfbG0xIC0gX19wX2xtMgorICAgICAgICAgICAgICAgICAgICAtIChfX3ggKiBfX3BfbG0xIC0gX19wX2xtMikgLyBfVHAoX19sbCk7CisgICAgICAgICAgICAgIF9fcF9sbTIgPSBfX3BfbG0xOworICAgICAgICAgICAgICBfX3BfbG0xID0gX19wX2w7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gX19wX2w7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIGFzc29jaWF0ZWQgTGVnZW5kcmUgZnVuY3Rpb24gYnkgcmVjdXJzaW9uCisgICAgICogICAgICAgICAgIG9uIEBmJCBsIEBmJC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBhc3NvY2lhdGVkIExlZ2VuZHJlIGZ1bmN0aW9uIGlzIGRlcml2ZWQgZnJvbSB0aGUgTGVnZW5kcmUgZnVuY3Rpb24KKyAgICAgKiAgIEBmJCBQX2woeCkgQGYkIGJ5IHRoZSBSb2RyaWd1ZXMgZm9ybXVsYToKKyAgICAgKiAgIEBmWworICAgICAqICAgICBQX2xebSh4KSA9ICgxIC0geF4yKV57bS8yfVxmcmFje2RebX17ZHhebX1QX2woeCkKKyAgICAgKiAgIEBmXQorICAgICAqIAorICAgICAqICAgQHBhcmFtICBsICBUaGUgb3JkZXIgb2YgdGhlIGFzc29jaWF0ZWQgTGVnZW5kcmUgZnVuY3Rpb24uCisgICAgICogICAgICAgICAgICAgIEBmJCBsID49IDAgQGYkLgorICAgICAqICAgQHBhcmFtICBtICBUaGUgb3JkZXIgb2YgdGhlIGFzc29jaWF0ZWQgTGVnZW5kcmUgZnVuY3Rpb24uCisgICAgICogICAgICAgICAgICAgIEBmJCBtIDw9IGwgQGYkLgorICAgICAqICAgQHBhcmFtICB4ICBUaGUgYXJndW1lbnQgb2YgdGhlIGFzc29jaWF0ZWQgTGVnZW5kcmUgZnVuY3Rpb24uCisgICAgICogICAgICAgICAgICAgIEBmJCB8eHwgPD0gMSBAZiQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fYXNzb2NfbGVnZW5kcmVfcCh1bnNpZ25lZCBpbnQgX19sLCB1bnNpZ25lZCBpbnQgX19tLCBfVHAgX194KQorICAgIHsKKworICAgICAgaWYgKF9feCA8IF9UcCgtMSkgfHwgX194ID4gX1RwKCsxKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkFyZ3VtZW50IG91dCBvZiByYW5nZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpbiBfX2Fzc29jX2xlZ2VuZHJlX3AuIikpOworICAgICAgZWxzZSBpZiAoX19tID4gX19sKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiRGVncmVlIG91dCBvZiByYW5nZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpbiBfX2Fzc29jX2xlZ2VuZHJlX3AuIikpOworICAgICAgZWxzZSBpZiAoX19pc25hbihfX3gpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKF9fbSA9PSAwKQorICAgICAgICByZXR1cm4gX19wb2x5X2xlZ2VuZHJlX3AoX19sLCBfX3gpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fcF9tbSA9IF9UcCgxKTsKKyAgICAgICAgICBpZiAoX19tID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gIFR3byBzcXVhcmUgcm9vdHMgc2VlbSBtb3JlIGFjY3VyYXRlIG1vcmUgb2YgdGhlIHRpbWUKKyAgICAgICAgICAgICAgLy8gIHRoYW4ganVzdCBvbmUuCisgICAgICAgICAgICAgIF9UcCBfX3Jvb3QgPSBzdGQ6OnNxcnQoX1RwKDEpIC0gX194KSAqIHN0ZDo6c3FydChfVHAoMSkgKyBfX3gpOworICAgICAgICAgICAgICBfVHAgX19mYWN0ID0gX1RwKDEpOworICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAxOyBfX2kgPD0gX19tOyArK19faSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfX3BfbW0gKj0gLV9fZmFjdCAqIF9fcm9vdDsKKyAgICAgICAgICAgICAgICAgIF9fZmFjdCArPSBfVHAoMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGlmIChfX2wgPT0gX19tKQorICAgICAgICAgICAgcmV0dXJuIF9fcF9tbTsKKworICAgICAgICAgIF9UcCBfX3BfbXAxbSA9IF9UcCgyICogX19tICsgMSkgKiBfX3ggKiBfX3BfbW07CisgICAgICAgICAgaWYgKF9fbCA9PSBfX20gKyAxKQorICAgICAgICAgICAgcmV0dXJuIF9fcF9tcDFtOworCisgICAgICAgICAgX1RwIF9fcF9sbTJtID0gX19wX21tOworICAgICAgICAgIF9UcCBfX1BfbG0xbSA9IF9fcF9tcDFtOworICAgICAgICAgIF9UcCBfX3BfbG0gPSBfVHAoMCk7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19qID0gX19tICsgMjsgX19qIDw9IF9fbDsgKytfX2opCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fcF9sbSA9IChfVHAoMiAqIF9faiAtIDEpICogX194ICogX19QX2xtMW0KKyAgICAgICAgICAgICAgICAgICAgICAtIF9UcChfX2ogKyBfX20gLSAxKSAqIF9fcF9sbTJtKSAvIF9UcChfX2ogLSBfX20pOworICAgICAgICAgICAgICBfX3BfbG0ybSA9IF9fUF9sbTFtOworICAgICAgICAgICAgICBfX1BfbG0xbSA9IF9fcF9sbTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBfX3BfbG07CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIHNwaGVyaWNhbCBhc3NvY2lhdGVkIExlZ2VuZHJlIGZ1bmN0aW9uLgorICAgICAqIAorICAgICAqICAgVGhlIHNwaGVyaWNhbCBhc3NvY2lhdGVkIExlZ2VuZHJlIGZ1bmN0aW9uIG9mIEBmJCBsIEBmJCwgQGYkIG0gQGYkLAorICAgICAqICAgYW5kIEBmJCBcdGhldGEgQGYkIGlzIGRlZmluZWQgYXMgQGYkIFlfbF5tKFx0aGV0YSwwKSBAZiQgd2hlcmUKKyAgICAgKiAgIEBmWworICAgICAqICAgICAgWV9sXm0oXHRoZXRhLFxwaGkpID0gKC0xKV5tW1xmcmFjeygybCsxKX17NFxwaX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcZnJhY3sobC1tKSF9eyhsK20pIX1dCisgICAgICogICAgICAgICAgICAgICAgICAgICBQX2xebShcY29zXHRoZXRhKSBcZXhwXntpbVxwaGl9CisgICAgICogICBAZl0KKyAgICAgKiAgIGlzIHRoZSBzcGhlcmljYWwgaGFybW9uaWMgZnVuY3Rpb24gYW5kIEBmJCBQX2xebSh4KSBAZiQgaXMgdGhlCisgICAgICogICBhc3NvY2lhdGVkIExlZ2VuZHJlIGZ1bmN0aW9uLgorICAgICAqIAorICAgICAqICAgVGhpcyBmdW5jdGlvbiBkaWZmZXJzIGZyb20gdGhlIGFzc29jaWF0ZWQgTGVnZW5kcmUgZnVuY3Rpb24gYnkKKyAgICAgKiAgIGFyZ3VtZW50IChAZiR4ID0gXGNvcyhcdGhldGEpQGYkKSBhbmQgYnkgYSBub3JtYWxpemF0aW9uIGZhY3RvcgorICAgICAqICAgYnV0IHRoaXMgZmFjdG9yIGlzIHJhdGhlciBsYXJnZSBmb3IgbGFyZ2UgQGYkIGwgQGYkIGFuZCBAZiQgbSBAZiQKKyAgICAgKiAgIGFuZCBzbyB0aGlzIGZ1bmN0aW9uIGlzIHN0YWJsZSBmb3IgbGFyZ2VyIGRpZmZlcmVuY2VzIG9mIEBmJCBsIEBmJAorICAgICAqICAgYW5kIEBmJCBtIEBmJC4KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgbCAgVGhlIG9yZGVyIG9mIHRoZSBzcGhlcmljYWwgYXNzb2NpYXRlZCBMZWdlbmRyZSBmdW5jdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgQGYkIGwgPj0gMCBAZiQuCisgICAgICogICBAcGFyYW0gIG0gIFRoZSBvcmRlciBvZiB0aGUgc3BoZXJpY2FsIGFzc29jaWF0ZWQgTGVnZW5kcmUgZnVuY3Rpb24uCisgICAgICogICAgICAgICAgICAgIEBmJCBtIDw9IGwgQGYkLgorICAgICAqICAgQHBhcmFtICB0aGV0YSAgVGhlIHJhZGlhbiBhbmdsZSBhcmd1bWVudCBvZiB0aGUgc3BoZXJpY2FsIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgIExlZ2VuZHJlIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19zcGhfbGVnZW5kcmUodW5zaWduZWQgaW50IF9fbCwgdW5zaWduZWQgaW50IF9fbSwgX1RwIF9fdGhldGEpCisgICAgeworICAgICAgaWYgKF9faXNuYW4oX190aGV0YSkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworCisgICAgICBjb25zdCBfVHAgX194ID0gc3RkOjpjb3MoX190aGV0YSk7CisKKyAgICAgIGlmIChfX2wgPCBfX20pCisgICAgICAgIHsKKyAgICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQmFkIGFyZ3VtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19zcGhfbGVnZW5kcmUuIikpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfX20gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX1AgPSBfX3BvbHlfbGVnZW5kcmVfcChfX2wsIF9feCk7CisgICAgICAgICAgX1RwIF9fZmFjdCA9IHN0ZDo6c3FydChfVHAoMiAqIF9fbCArIDEpCisgICAgICAgICAgICAgICAgICAgICAvIChfVHAoNCkgKiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSkpOworICAgICAgICAgIF9fUCAqPSBfX2ZhY3Q7CisgICAgICAgICAgcmV0dXJuIF9fUDsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX194ID09IF9UcCgxKSB8fCBfX3ggPT0gLV9UcCgxKSkKKyAgICAgICAgeworICAgICAgICAgIC8vICBtID4gMCBoZXJlCisgICAgICAgICAgcmV0dXJuIF9UcCgwKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLy8gbSA+IDAgYW5kIHx4fCA8IDEgaGVyZQorCisgICAgICAgICAgLy8gU3RhcnRpbmcgdmFsdWUgZm9yIHJlY3Vyc2lvbi4KKyAgICAgICAgICAvLyBZX21ebSh4KSA9IHNxcnQoICgybSsxKS8oNHBpIG0pIGdhbW1hKG0rMS8yKS9nYW1tYShtKSApCisgICAgICAgICAgLy8gICAgICAgICAgICAgKC0xKV5tICgxLXheMileKG0vMikgLyBwaV4oMS80KQorICAgICAgICAgIGNvbnN0IF9UcCBfX3NnbiA9ICggX19tICUgMiA9PSAxID8gLV9UcCgxKSA6IF9UcCgxKSk7CisgICAgICAgICAgY29uc3QgX1RwIF9feV9tcDFtX2ZhY3RvciA9IF9feCAqIHN0ZDo6c3FydChfVHAoMiAqIF9fbSArIDMpKTsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICAgICAgY29uc3QgX1RwIF9fbG5jaXJjID0gc3RkOjp0cjE6OmxvZzFwKC1fX3ggKiBfX3gpOworI2Vsc2UKKyAgICAgICAgICBjb25zdCBfVHAgX19sbmNpcmMgPSBzdGQ6OmxvZyhfVHAoMSkgLSBfX3ggKiBfX3gpOworI2VuZGlmCisgICAgICAgICAgLy8gIEdhbW1hKG0rMS8yKSAvIEdhbW1hKG0pCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgICAgICAgIGNvbnN0IF9UcCBfX2xucG9jaCA9IHN0ZDo6dHIxOjpsZ2FtbWEoX1RwKF9fbSArIF9UcCgwLjVMKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc3RkOjp0cjE6OmxnYW1tYShfVHAoX19tKSk7CisjZWxzZQorICAgICAgICAgIGNvbnN0IF9UcCBfX2xucG9jaCA9IF9fbG9nX2dhbW1hKF9UcChfX20gKyBfVHAoMC41TCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIF9fbG9nX2dhbW1hKF9UcChfX20pKTsKKyNlbmRpZgorICAgICAgICAgIGNvbnN0IF9UcCBfX2xucHJlX3ZhbCA9CisgICAgICAgICAgICAgICAgICAgIC1fVHAoMC4yNUwpICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX2xucGkoKQorICAgICAgICAgICAgICAgICAgICArIF9UcCgwLjVMKSAqIChfX2xucG9jaCArIF9fbSAqIF9fbG5jaXJjKTsKKyAgICAgICAgICBfVHAgX19zciA9IHN0ZDo6c3FydCgoX1RwKDIpICsgX1RwKDEpIC8gX19tKQorICAgICAgICAgICAgICAgICAgIC8gKF9UcCg0KSAqIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpKSk7CisgICAgICAgICAgX1RwIF9feV9tbSA9IF9fc2duICogX19zciAqIHN0ZDo6ZXhwKF9fbG5wcmVfdmFsKTsKKyAgICAgICAgICBfVHAgX195X21wMW0gPSBfX3lfbXAxbV9mYWN0b3IgKiBfX3lfbW07CisKKyAgICAgICAgICBpZiAoX19sID09IF9fbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmV0dXJuIF9feV9tbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChfX2wgPT0gX19tICsgMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmV0dXJuIF9feV9tcDFtOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX1RwIF9feV9sbSA9IF9UcCgwKTsKKworICAgICAgICAgICAgICAvLyBDb21wdXRlIFlfbF5tLCBsID4gbSsxLCB1cHdhcmQgcmVjdXJzaW9uIG9uIGwuCisgICAgICAgICAgICAgIGZvciAoIGludCBfX2xsID0gX19tICsgMjsgX19sbCA8PSBfX2w7ICsrX19sbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjb25zdCBfVHAgX19yYXQxID0gX1RwKF9fbGwgLSBfX20pIC8gX1RwKF9fbGwgKyBfX20pOworICAgICAgICAgICAgICAgICAgY29uc3QgX1RwIF9fcmF0MiA9IF9UcChfX2xsIC0gX19tIC0gMSkgLyBfVHAoX19sbCArIF9fbSAtIDEpOworICAgICAgICAgICAgICAgICAgY29uc3QgX1RwIF9fZmFjdDEgPSBzdGQ6OnNxcnQoX19yYXQxICogX1RwKDIgKiBfX2xsICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIF9UcCgyICogX19sbCAtIDEpKTsKKyAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX2ZhY3QyID0gc3RkOjpzcXJ0KF9fcmF0MSAqIF9fcmF0MiAqIF9UcCgyICogX19sbCArIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfVHAoMiAqIF9fbGwgLSAzKSk7CisgICAgICAgICAgICAgICAgICBfX3lfbG0gPSAoX194ICogX195X21wMW0gKiBfX2ZhY3QxCisgICAgICAgICAgICAgICAgICAgICAgICAgLSAoX19sbCArIF9fbSAtIDEpICogX195X21tICogX19mYWN0MikgLyBfVHAoX19sbCAtIF9fbSk7CisgICAgICAgICAgICAgICAgICBfX3lfbW0gPSBfX3lfbXAxbTsKKyAgICAgICAgICAgICAgICAgIF9feV9tcDFtID0gX195X2xtOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICByZXR1cm4gX195X2xtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSBzdGQ6OnRyMTo6X19kZXRhaWwKK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9MRUdFTkRSRV9GVU5DVElPTl9UQ0MKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2xpbWl0cy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvbGltaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFhZDQzNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL2xpbWl0cy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIFRSMSBsaW1pdHMuaCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2xpbWl0cy5oCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX1RSMV9MSU1JVFNfSAorI2RlZmluZSBfVFIxX0xJTUlUU19IIDEKKworI2luY2x1ZGUgPHRyMS9jbGltaXRzPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL21hdGguaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL21hdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTE3NjZmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvbWF0aC5oCkBAIC0wLDAgKzEsMTg2IEBACisvLyBUUjEgbWF0aC5oIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvbWF0aC5oCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX01BVEhfSAorI2RlZmluZSBfR0xJQkNYWF9UUjFfTUFUSF9IIDEKKworI2luY2x1ZGUgPHRyMS9jbWF0aD4KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKwordXNpbmcgc3RkOjp0cjE6OmFjb3M7Cit1c2luZyBzdGQ6OnRyMTo6YWNvc2g7Cit1c2luZyBzdGQ6OnRyMTo6YXNpbjsKK3VzaW5nIHN0ZDo6dHIxOjphc2luaDsKK3VzaW5nIHN0ZDo6dHIxOjphdGFuOwordXNpbmcgc3RkOjp0cjE6OmF0YW4yOwordXNpbmcgc3RkOjp0cjE6OmF0YW5oOwordXNpbmcgc3RkOjp0cjE6OmNicnQ7Cit1c2luZyBzdGQ6OnRyMTo6Y2VpbDsKK3VzaW5nIHN0ZDo6dHIxOjpjb3B5c2lnbjsKK3VzaW5nIHN0ZDo6dHIxOjpjb3M7Cit1c2luZyBzdGQ6OnRyMTo6Y29zaDsKK3VzaW5nIHN0ZDo6dHIxOjplcmY7Cit1c2luZyBzdGQ6OnRyMTo6ZXJmYzsKK3VzaW5nIHN0ZDo6dHIxOjpleHA7Cit1c2luZyBzdGQ6OnRyMTo6ZXhwMjsKK3VzaW5nIHN0ZDo6dHIxOjpleHBtMTsKK3VzaW5nIHN0ZDo6dHIxOjpmYWJzOwordXNpbmcgc3RkOjp0cjE6OmZkaW07Cit1c2luZyBzdGQ6OnRyMTo6Zmxvb3I7Cit1c2luZyBzdGQ6OnRyMTo6Zm1hOwordXNpbmcgc3RkOjp0cjE6OmZtYXg7Cit1c2luZyBzdGQ6OnRyMTo6Zm1pbjsKK3VzaW5nIHN0ZDo6dHIxOjpmbW9kOwordXNpbmcgc3RkOjp0cjE6OmZyZXhwOwordXNpbmcgc3RkOjp0cjE6Omh5cG90OwordXNpbmcgc3RkOjp0cjE6Omlsb2diOwordXNpbmcgc3RkOjp0cjE6OmxkZXhwOwordXNpbmcgc3RkOjp0cjE6OmxnYW1tYTsKK3VzaW5nIHN0ZDo6dHIxOjpsbHJpbnQ7Cit1c2luZyBzdGQ6OnRyMTo6bGxyb3VuZDsKK3VzaW5nIHN0ZDo6dHIxOjpsb2c7Cit1c2luZyBzdGQ6OnRyMTo6bG9nMTA7Cit1c2luZyBzdGQ6OnRyMTo6bG9nMXA7Cit1c2luZyBzdGQ6OnRyMTo6bG9nMjsKK3VzaW5nIHN0ZDo6dHIxOjpsb2diOwordXNpbmcgc3RkOjp0cjE6OmxyaW50OwordXNpbmcgc3RkOjp0cjE6Omxyb3VuZDsKK3VzaW5nIHN0ZDo6dHIxOjpuZWFyYnlpbnQ7Cit1c2luZyBzdGQ6OnRyMTo6bmV4dGFmdGVyOwordXNpbmcgc3RkOjp0cjE6Om5leHR0b3dhcmQ7Cit1c2luZyBzdGQ6OnRyMTo6cG93OwordXNpbmcgc3RkOjp0cjE6OnJlbWFpbmRlcjsKK3VzaW5nIHN0ZDo6dHIxOjpyZW1xdW87Cit1c2luZyBzdGQ6OnRyMTo6cmludDsKK3VzaW5nIHN0ZDo6dHIxOjpyb3VuZDsKK3VzaW5nIHN0ZDo6dHIxOjpzY2FsYmxuOwordXNpbmcgc3RkOjp0cjE6OnNjYWxibjsKK3VzaW5nIHN0ZDo6dHIxOjpzaW47Cit1c2luZyBzdGQ6OnRyMTo6c2luaDsKK3VzaW5nIHN0ZDo6dHIxOjpzcXJ0OwordXNpbmcgc3RkOjp0cjE6OnRhbjsKK3VzaW5nIHN0ZDo6dHIxOjp0YW5oOwordXNpbmcgc3RkOjp0cjE6OnRnYW1tYTsKK3VzaW5nIHN0ZDo6dHIxOjp0cnVuYzsKKworI2VuZGlmCisKK3VzaW5nIHN0ZDo6dHIxOjphc3NvY19sYWd1ZXJyZWY7Cit1c2luZyBzdGQ6OnRyMTo6YXNzb2NfbGFndWVycmU7Cit1c2luZyBzdGQ6OnRyMTo6YXNzb2NfbGFndWVycmVsOworCit1c2luZyBzdGQ6OnRyMTo6YXNzb2NfbGVnZW5kcmVmOwordXNpbmcgc3RkOjp0cjE6OmFzc29jX2xlZ2VuZHJlOwordXNpbmcgc3RkOjp0cjE6OmFzc29jX2xlZ2VuZHJlbDsKKwordXNpbmcgc3RkOjp0cjE6OmJldGFmOwordXNpbmcgc3RkOjp0cjE6OmJldGE7Cit1c2luZyBzdGQ6OnRyMTo6YmV0YWw7CisKK3VzaW5nIHN0ZDo6dHIxOjpjb21wX2VsbGludF8xZjsKK3VzaW5nIHN0ZDo6dHIxOjpjb21wX2VsbGludF8xOwordXNpbmcgc3RkOjp0cjE6OmNvbXBfZWxsaW50XzFsOworCit1c2luZyBzdGQ6OnRyMTo6Y29tcF9lbGxpbnRfMmY7Cit1c2luZyBzdGQ6OnRyMTo6Y29tcF9lbGxpbnRfMjsKK3VzaW5nIHN0ZDo6dHIxOjpjb21wX2VsbGludF8ybDsKKwordXNpbmcgc3RkOjp0cjE6OmNvbXBfZWxsaW50XzNmOwordXNpbmcgc3RkOjp0cjE6OmNvbXBfZWxsaW50XzM7Cit1c2luZyBzdGQ6OnRyMTo6Y29tcF9lbGxpbnRfM2w7CisKK3VzaW5nIHN0ZDo6dHIxOjpjb25mX2h5cGVyZ2Y7Cit1c2luZyBzdGQ6OnRyMTo6Y29uZl9oeXBlcmc7Cit1c2luZyBzdGQ6OnRyMTo6Y29uZl9oeXBlcmdsOworCit1c2luZyBzdGQ6OnRyMTo6Y3lsX2Jlc3NlbF9pZjsKK3VzaW5nIHN0ZDo6dHIxOjpjeWxfYmVzc2VsX2k7Cit1c2luZyBzdGQ6OnRyMTo6Y3lsX2Jlc3NlbF9pbDsKKwordXNpbmcgc3RkOjp0cjE6OmN5bF9iZXNzZWxfamY7Cit1c2luZyBzdGQ6OnRyMTo6Y3lsX2Jlc3NlbF9qOwordXNpbmcgc3RkOjp0cjE6OmN5bF9iZXNzZWxfamw7CisKK3VzaW5nIHN0ZDo6dHIxOjpjeWxfYmVzc2VsX2tmOwordXNpbmcgc3RkOjp0cjE6OmN5bF9iZXNzZWxfazsKK3VzaW5nIHN0ZDo6dHIxOjpjeWxfYmVzc2VsX2tsOworCit1c2luZyBzdGQ6OnRyMTo6Y3lsX25ldW1hbm5mOwordXNpbmcgc3RkOjp0cjE6OmN5bF9uZXVtYW5uOwordXNpbmcgc3RkOjp0cjE6OmN5bF9uZXVtYW5ubDsKKwordXNpbmcgc3RkOjp0cjE6OmVsbGludF8xZjsKK3VzaW5nIHN0ZDo6dHIxOjplbGxpbnRfMTsKK3VzaW5nIHN0ZDo6dHIxOjplbGxpbnRfMWw7CisKK3VzaW5nIHN0ZDo6dHIxOjplbGxpbnRfMmY7Cit1c2luZyBzdGQ6OnRyMTo6ZWxsaW50XzI7Cit1c2luZyBzdGQ6OnRyMTo6ZWxsaW50XzJsOworCit1c2luZyBzdGQ6OnRyMTo6ZWxsaW50XzNmOwordXNpbmcgc3RkOjp0cjE6OmVsbGludF8zOwordXNpbmcgc3RkOjp0cjE6OmVsbGludF8zbDsKKwordXNpbmcgc3RkOjp0cjE6OmV4cGludGY7Cit1c2luZyBzdGQ6OnRyMTo6ZXhwaW50OwordXNpbmcgc3RkOjp0cjE6OmV4cGludGw7CisKK3VzaW5nIHN0ZDo6dHIxOjpoZXJtaXRlZjsKK3VzaW5nIHN0ZDo6dHIxOjpoZXJtaXRlOwordXNpbmcgc3RkOjp0cjE6Omhlcm1pdGVsOworCit1c2luZyBzdGQ6OnRyMTo6aHlwZXJnZjsKK3VzaW5nIHN0ZDo6dHIxOjpoeXBlcmc7Cit1c2luZyBzdGQ6OnRyMTo6aHlwZXJnbDsKKwordXNpbmcgc3RkOjp0cjE6OmxhZ3VlcnJlZjsKK3VzaW5nIHN0ZDo6dHIxOjpsYWd1ZXJyZTsKK3VzaW5nIHN0ZDo6dHIxOjpsYWd1ZXJyZWw7CisKK3VzaW5nIHN0ZDo6dHIxOjpsZWdlbmRyZWY7Cit1c2luZyBzdGQ6OnRyMTo6bGVnZW5kcmU7Cit1c2luZyBzdGQ6OnRyMTo6bGVnZW5kcmVsOworCit1c2luZyBzdGQ6OnRyMTo6cmllbWFubl96ZXRhZjsKK3VzaW5nIHN0ZDo6dHIxOjpyaWVtYW5uX3pldGE7Cit1c2luZyBzdGQ6OnRyMTo6cmllbWFubl96ZXRhbDsKKwordXNpbmcgc3RkOjp0cjE6OnNwaF9iZXNzZWxmOwordXNpbmcgc3RkOjp0cjE6OnNwaF9iZXNzZWw7Cit1c2luZyBzdGQ6OnRyMTo6c3BoX2Jlc3NlbGw7CisKK3VzaW5nIHN0ZDo6dHIxOjpzcGhfbGVnZW5kcmVmOwordXNpbmcgc3RkOjp0cjE6OnNwaF9sZWdlbmRyZTsKK3VzaW5nIHN0ZDo6dHIxOjpzcGhfbGVnZW5kcmVsOworCit1c2luZyBzdGQ6OnRyMTo6c3BoX25ldW1hbm5mOwordXNpbmcgc3RkOjp0cjE6OnNwaF9uZXVtYW5uOwordXNpbmcgc3RkOjp0cjE6OnNwaF9uZXVtYW5ubDsKKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9NQVRIX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL21lbW9yeSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL21lbW9yeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjRjZTUxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvbWVtb3J5CkBAIC0wLDAgKzEsNTIgQEAKKy8vIDx0cjEvbWVtb3J5PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKioKKyAqIEBmaWxlIHRyMS9tZW1vcnkKKyAqIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9NRU1PUlkKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX01FTU9SWSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIGRlZmluZWQoX0dMSUJDWFhfSU5DTFVERV9BU19DWFgxMSkKKyMgIGVycm9yIFRSMSBoZWFkZXIgY2Fubm90IGJlIGluY2x1ZGVkIGZyb20gQysrMTEgaGVhZGVyCisjZW5kaWYKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxleGNlcHRpb24+ICAgICAgICAJLy8gc3RkOjpleGNlcHRpb24KKyNpbmNsdWRlIDx0eXBlaW5mbz4gICAgICAgICAJLy8gc3RkOjp0eXBlX2luZm8gaW4gZ2V0X2RlbGV0ZXIKKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPiAgLy8gc3RkOjpzd2FwCisjaW5jbHVkZSA8aW9zZndkPiAgICAgICAgICAgCS8vIHN0ZDo6YmFzaWNfb3N0cmVhbQorI2luY2x1ZGUgPGV4dC9hdG9taWNpdHkuaD4KKyNpbmNsdWRlIDxleHQvY29uY3VycmVuY2UuaD4KKyNpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfZnVuY3Rpb24uaD4gCS8vIHN0ZDo6bGVzcworI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisjaW5jbHVkZSA8dHIxL3R5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHRyMS9zaGFyZWRfcHRyLmg+CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfTUVNT1JZCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9tb2RpZmllZF9iZXNzZWxfZnVuYy50Y2MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9tb2RpZmllZF9iZXNzZWxfZnVuYy50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QxZmI5MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL21vZGlmaWVkX2Jlc3NlbF9mdW5jLnRjYwpAQCAtMCwwICsxLDQzNSBAQAorLy8gU3BlY2lhbCBmdW5jdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvbW9kaWZpZWRfYmVzc2VsX2Z1bmMudGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dHIxL2NtYXRofQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyIFRSMTogNS4yICBTcGVjaWFsIGZ1bmN0aW9ucworLy8KKworLy8gV3JpdHRlbiBieSBFZHdhcmQgU21pdGgtUm93bGFuZC4KKy8vCisvLyBSZWZlcmVuY2VzOgorLy8gICAoMSkgSGFuZGJvb2sgb2YgTWF0aGVtYXRpY2FsIEZ1bmN0aW9ucywKKy8vICAgICAgIEVkLiBNaWx0b24gQWJyYW1vd2l0eiBhbmQgSXJlbmUgQS4gU3RlZ3VuLAorLy8gICAgICAgRG92ZXIgUHVibGljYXRpb25zLAorLy8gICAgICAgU2VjdGlvbiA5LCBwcC4gMzU1LTQzNCwgU2VjdGlvbiAxMCBwcC4gNDM1LTQ3OAorLy8gICAoMikgVGhlIEdudSBTY2llbnRpZmljIExpYnJhcnksIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nc2wKKy8vICAgKDMpIE51bWVyaWNhbCBSZWNpcGVzIGluIEMsIGJ5IFcuIEguIFByZXNzLCBTLiBBLiBUZXVrb2xza3ksCisvLyAgICAgICBXLiBULiBWZXR0ZXJsaW5nLCBCLiBQLiBGbGFubmVyeSwgQ2FtYnJpZGdlIFVuaXZlcnNpdHkgUHJlc3MgKDE5OTIpLAorLy8gICAgICAgMm5kIGVkLCBwcC4gMjQ2LTI0OS4KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfTU9ESUZJRURfQkVTU0VMX0ZVTkNfVENDCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9NT0RJRklFRF9CRVNTRUxfRlVOQ19UQ0MgMQorCisjaW5jbHVkZSAic3BlY2lhbF9mdW5jdGlvbl91dGlsLmgiCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworICAvLyBbNS4yXSBTcGVjaWFsIGZ1bmN0aW9ucworCisgIC8vIEltcGxlbWVudGF0aW9uLXNwYWNlIGRldGFpbHMuCisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgQ29tcHV0ZSB0aGUgbW9kaWZpZWQgQmVzc2VsIGZ1bmN0aW9ucyBAZiQgSV9cbnUoeCkgQGYkIGFuZAorICAgICAqICAgICAgICAgICBAZiQgS19cbnUoeCkgQGYkIGFuZCB0aGVpciBmaXJzdCBkZXJpdmF0aXZlcworICAgICAqICAgICAgICAgICBAZiQgSSdfXG51KHgpIEBmJCBhbmQgQGYkIEsnX1xudSh4KSBAZiQgcmVzcGVjdGl2ZWx5LgorICAgICAqICAgICAgICAgICBUaGVzZSBmb3VyIGZ1bmN0aW9ucyBhcmUgY29tcHV0ZWQgdG9nZXRoZXIgZm9yIG51bWVyaWNhbAorICAgICAqICAgICAgICAgICBzdGFiaWxpdHkuCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX19udSAgVGhlIG9yZGVyIG9mIHRoZSBCZXNzZWwgZnVuY3Rpb25zLgorICAgICAqICAgQHBhcmFtICBfX3ggICBUaGUgYXJndW1lbnQgb2YgdGhlIEJlc3NlbCBmdW5jdGlvbnMuCisgICAgICogICBAcGFyYW0gIF9fSW51ICBUaGUgb3V0cHV0IHJlZ3VsYXIgbW9kaWZpZWQgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX0tudSAgVGhlIG91dHB1dCBpcnJlZ3VsYXIgbW9kaWZpZWQgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX0lwbnUgIFRoZSBvdXRwdXQgZGVyaXZhdGl2ZSBvZiB0aGUgcmVndWxhcgorICAgICAqICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19LcG51ICBUaGUgb3V0cHV0IGRlcml2YXRpdmUgb2YgdGhlIGlycmVndWxhcgorICAgICAqICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX2Jlc3NlbF9payhfVHAgX19udSwgX1RwIF9feCwKKyAgICAgICAgICAgICAgICBfVHAgJiBfX0ludSwgX1RwICYgX19LbnUsIF9UcCAmIF9fSXBudSwgX1RwICYgX19LcG51KQorICAgIHsKKyAgICAgIGlmIChfX3ggPT0gX1RwKDApKQorICAgICAgICB7CisgICAgICAgICAgaWYgKF9fbnUgPT0gX1RwKDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX0ludSA9IF9UcCgxKTsKKyAgICAgICAgICAgICAgX19JcG51ID0gX1RwKDApOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKF9fbnUgPT0gX1RwKDEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX0ludSA9IF9UcCgwKTsKKyAgICAgICAgICAgICAgX19JcG51ID0gX1RwKDAuNUwpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19JbnUgPSBfVHAoMCk7CisgICAgICAgICAgICAgIF9fSXBudSA9IF9UcCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBfX0tudSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6aW5maW5pdHkoKTsKKyAgICAgICAgICBfX0twbnUgPSAtc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjppbmZpbml0eSgpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICBjb25zdCBfVHAgX19lcHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKTsKKyAgICAgIGNvbnN0IF9UcCBfX2ZwX21pbiA9IF9UcCgxMCkgKiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKTsKKyAgICAgIGNvbnN0IGludCBfX21heF9pdGVyID0gMTUwMDA7CisgICAgICBjb25zdCBfVHAgX194X21pbiA9IF9UcCgyKTsKKworICAgICAgY29uc3QgaW50IF9fbmwgPSBzdGF0aWNfY2FzdDxpbnQ+KF9fbnUgKyBfVHAoMC41TCkpOworCisgICAgICBjb25zdCBfVHAgX19tdSA9IF9fbnUgLSBfX25sOworICAgICAgY29uc3QgX1RwIF9fbXUyID0gX19tdSAqIF9fbXU7CisgICAgICBjb25zdCBfVHAgX194aSA9IF9UcCgxKSAvIF9feDsKKyAgICAgIGNvbnN0IF9UcCBfX3hpMiA9IF9UcCgyKSAqIF9feGk7CisgICAgICBfVHAgX19oID0gX19udSAqIF9feGk7CisgICAgICBpZiAoIF9faCA8IF9fZnBfbWluICkKKyAgICAgICAgX19oID0gX19mcF9taW47CisgICAgICBfVHAgX19iID0gX194aTIgKiBfX251OworICAgICAgX1RwIF9fZCA9IF9UcCgwKTsKKyAgICAgIF9UcCBfX2MgPSBfX2g7CisgICAgICBpbnQgX19pOworICAgICAgZm9yICggX19pID0gMTsgX19pIDw9IF9fbWF4X2l0ZXI7ICsrX19pICkKKyAgICAgICAgeworICAgICAgICAgIF9fYiArPSBfX3hpMjsKKyAgICAgICAgICBfX2QgPSBfVHAoMSkgLyAoX19iICsgX19kKTsKKyAgICAgICAgICBfX2MgPSBfX2IgKyBfVHAoMSkgLyBfX2M7CisgICAgICAgICAgY29uc3QgX1RwIF9fZGVsID0gX19jICogX19kOworICAgICAgICAgIF9faCAqPSBfX2RlbDsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX19kZWwgLSBfVHAoMSkpIDwgX19lcHMpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgaWYgKF9faSA+IF9fbWF4X2l0ZXIpCisgICAgICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiQXJndW1lbnQgeCB0b28gbGFyZ2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9fYmVzc2VsX2lrOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJ5IGFzeW1wdG90aWMgZXhwYW5zaW9uLiIpKTsKKyAgICAgIF9UcCBfX0ludWwgPSBfX2ZwX21pbjsKKyAgICAgIF9UcCBfX0lwbnVsID0gX19oICogX19JbnVsOworICAgICAgX1RwIF9fSW51bDEgPSBfX0ludWw7CisgICAgICBfVHAgX19JcG51MSA9IF9fSXBudWw7CisgICAgICBfVHAgX19mYWN0ID0gX19udSAqIF9feGk7CisgICAgICBmb3IgKGludCBfX2wgPSBfX25sOyBfX2wgPj0gMTsgLS1fX2wpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX19JbnV0ZW1wID0gX19mYWN0ICogX19JbnVsICsgX19JcG51bDsKKyAgICAgICAgICBfX2ZhY3QgLT0gX194aTsKKyAgICAgICAgICBfX0lwbnVsID0gX19mYWN0ICogX19JbnV0ZW1wICsgX19JbnVsOworICAgICAgICAgIF9fSW51bCA9IF9fSW51dGVtcDsKKyAgICAgICAgfQorICAgICAgX1RwIF9fZiA9IF9fSXBudWwgLyBfX0ludWw7CisgICAgICBfVHAgX19LbXUsIF9fS251MTsKKyAgICAgIGlmIChfX3ggPCBfX3hfbWluKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9feDIgPSBfX3ggLyBfVHAoMik7CisgICAgICAgICAgY29uc3QgX1RwIF9fcGltdSA9IF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpICogX19tdTsKKyAgICAgICAgICBjb25zdCBfVHAgX19mYWN0ID0gKHN0ZDo6YWJzKF9fcGltdSkgPCBfX2VwcworICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX1RwKDEpIDogX19waW11IC8gc3RkOjpzaW4oX19waW11KSk7CisgICAgICAgICAgX1RwIF9fZCA9IC1zdGQ6OmxvZyhfX3gyKTsKKyAgICAgICAgICBfVHAgX19lID0gX19tdSAqIF9fZDsKKyAgICAgICAgICBjb25zdCBfVHAgX19mYWN0MiA9IChzdGQ6OmFicyhfX2UpIDwgX19lcHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9UcCgxKSA6IHN0ZDo6c2luaChfX2UpIC8gX19lKTsKKyAgICAgICAgICBfVHAgX19nYW0xLCBfX2dhbTIsIF9fZ2FtcGwsIF9fZ2FtbWk7CisgICAgICAgICAgX19nYW1tYV90ZW1tZShfX211LCBfX2dhbTEsIF9fZ2FtMiwgX19nYW1wbCwgX19nYW1taSk7CisgICAgICAgICAgX1RwIF9fZmYgPSBfX2ZhY3QKKyAgICAgICAgICAgICAgICAgICAqIChfX2dhbTEgKiBzdGQ6OmNvc2goX19lKSArIF9fZ2FtMiAqIF9fZmFjdDIgKiBfX2QpOworICAgICAgICAgIF9UcCBfX3N1bSA9IF9fZmY7CisgICAgICAgICAgX19lID0gc3RkOjpleHAoX19lKTsKKyAgICAgICAgICBfVHAgX19wID0gX19lIC8gKF9UcCgyKSAqIF9fZ2FtcGwpOworICAgICAgICAgIF9UcCBfX3EgPSBfVHAoMSkgLyAoX1RwKDIpICogX19lICogX19nYW1taSk7CisgICAgICAgICAgX1RwIF9fYyA9IF9UcCgxKTsKKyAgICAgICAgICBfX2QgPSBfX3gyICogX194MjsKKyAgICAgICAgICBfVHAgX19zdW0xID0gX19wOworICAgICAgICAgIGludCBfX2k7CisgICAgICAgICAgZm9yIChfX2kgPSAxOyBfX2kgPD0gX19tYXhfaXRlcjsgKytfX2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fZmYgPSAoX19pICogX19mZiArIF9fcCArIF9fcSkgLyAoX19pICogX19pIC0gX19tdTIpOworICAgICAgICAgICAgICBfX2MgKj0gX19kIC8gX19pOworICAgICAgICAgICAgICBfX3AgLz0gX19pIC0gX19tdTsKKyAgICAgICAgICAgICAgX19xIC89IF9faSArIF9fbXU7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX2RlbCA9IF9fYyAqIF9fZmY7CisgICAgICAgICAgICAgIF9fc3VtICs9IF9fZGVsOyAKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9fZGVsMSA9IF9fYyAqIChfX3AgLSBfX2kgKiBfX2ZmKTsKKyAgICAgICAgICAgICAgX19zdW0xICs9IF9fZGVsMTsKKyAgICAgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fZGVsKSA8IF9fZXBzICogc3RkOjphYnMoX19zdW0pKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmIChfX2kgPiBfX21heF9pdGVyKQorICAgICAgICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJCZXNzZWwgayBzZXJpZXMgZmFpbGVkIHRvIGNvbnZlcmdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19iZXNzZWxfaWsuIikpOworICAgICAgICAgIF9fS211ID0gX19zdW07CisgICAgICAgICAgX19LbnUxID0gX19zdW0xICogX194aTI7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX2IgPSBfVHAoMikgKiAoX1RwKDEpICsgX194KTsKKyAgICAgICAgICBfVHAgX19kID0gX1RwKDEpIC8gX19iOworICAgICAgICAgIF9UcCBfX2RlbGggPSBfX2Q7CisgICAgICAgICAgX1RwIF9faCA9IF9fZGVsaDsKKyAgICAgICAgICBfVHAgX19xMSA9IF9UcCgwKTsKKyAgICAgICAgICBfVHAgX19xMiA9IF9UcCgxKTsKKyAgICAgICAgICBfVHAgX19hMSA9IF9UcCgwLjI1TCkgLSBfX211MjsKKyAgICAgICAgICBfVHAgX19xID0gX19jID0gX19hMTsKKyAgICAgICAgICBfVHAgX19hID0gLV9fYTE7CisgICAgICAgICAgX1RwIF9fcyA9IF9UcCgxKSArIF9fcSAqIF9fZGVsaDsKKyAgICAgICAgICBpbnQgX19pOworICAgICAgICAgIGZvciAoX19pID0gMjsgX19pIDw9IF9fbWF4X2l0ZXI7ICsrX19pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX2EgLT0gMiAqIChfX2kgLSAxKTsKKyAgICAgICAgICAgICAgX19jID0gLV9fYSAqIF9fYyAvIF9faTsKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9fcW5ldyA9IChfX3ExIC0gX19iICogX19xMikgLyBfX2E7CisgICAgICAgICAgICAgIF9fcTEgPSBfX3EyOworICAgICAgICAgICAgICBfX3EyID0gX19xbmV3OworICAgICAgICAgICAgICBfX3EgKz0gX19jICogX19xbmV3OworICAgICAgICAgICAgICBfX2IgKz0gX1RwKDIpOworICAgICAgICAgICAgICBfX2QgPSBfVHAoMSkgLyAoX19iICsgX19hICogX19kKTsKKyAgICAgICAgICAgICAgX19kZWxoID0gKF9fYiAqIF9fZCAtIF9UcCgxKSkgKiBfX2RlbGg7CisgICAgICAgICAgICAgIF9faCArPSBfX2RlbGg7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX2RlbHMgPSBfX3EgKiBfX2RlbGg7CisgICAgICAgICAgICAgIF9fcyArPSBfX2RlbHM7CisgICAgICAgICAgICAgIGlmICggc3RkOjphYnMoX19kZWxzIC8gX19zKSA8IF9fZXBzICkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoX19pID4gX19tYXhfaXRlcikKKyAgICAgICAgICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiU3RlZWQncyBtZXRob2QgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19iZXNzZWxfaWsuIikpOworICAgICAgICAgIF9faCA9IF9fYTEgKiBfX2g7CisgICAgICAgICAgX19LbXUgPSBzdGQ6OnNxcnQoX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkgLyAoX1RwKDIpICogX194KSkKKyAgICAgICAgICAgICAgICAqIHN0ZDo6ZXhwKC1fX3gpIC8gX19zOworICAgICAgICAgIF9fS251MSA9IF9fS211ICogKF9fbXUgKyBfX3ggKyBfVHAoMC41TCkgLSBfX2gpICogX194aTsKKyAgICAgICAgfQorCisgICAgICBfVHAgX19LcG11ID0gX19tdSAqIF9feGkgKiBfX0ttdSAtIF9fS251MTsKKyAgICAgIF9UcCBfX0ludW11ID0gX194aSAvIChfX2YgKiBfX0ttdSAtIF9fS3BtdSk7CisgICAgICBfX0ludSA9IF9fSW51bXUgKiBfX0ludWwxIC8gX19JbnVsOworICAgICAgX19JcG51ID0gX19JbnVtdSAqIF9fSXBudTEgLyBfX0ludWw7CisgICAgICBmb3IgKCBfX2kgPSAxOyBfX2kgPD0gX19ubDsgKytfX2kgKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9fS251dGVtcCA9IChfX211ICsgX19pKSAqIF9feGkyICogX19LbnUxICsgX19LbXU7CisgICAgICAgICAgX19LbXUgPSBfX0tudTE7CisgICAgICAgICAgX19LbnUxID0gX19LbnV0ZW1wOworICAgICAgICB9CisgICAgICBfX0tudSA9IF9fS211OworICAgICAgX19LcG51ID0gX19udSAqIF9feGkgKiBfX0ttdSAtIF9fS251MTsKKyAgCisgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSByZWd1bGFyIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbiBvZiBvcmRlcgorICAgICAqICAgICAgICAgICBcZiQgXG51IFxmJDogXGYkIElfe1xudX0oeCkgXGYkLgorICAgICAqCisgICAgICogICBUaGUgcmVndWxhciBtb2RpZmllZCBjeWxpbmRyaWNhbCBCZXNzZWwgZnVuY3Rpb24gaXM6CisgICAgICogICBAZlsKKyAgICAgKiAgICBJX3tcbnV9KHgpID0gXHN1bV97az0wfV57XGluZnR5fQorICAgICAqICAgICAgICAgICAgICBcZnJhY3soeC8yKV57XG51ICsgMmt9fXtrIVxHYW1tYShcbnUraysxKX0KKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBAcGFyYW0gIF9fbnUgIFRoZSBvcmRlciBvZiB0aGUgcmVndWxhciBtb2RpZmllZCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9feCAgIFRoZSBhcmd1bWVudCBvZiB0aGUgcmVndWxhciBtb2RpZmllZCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgb3V0cHV0IHJlZ3VsYXIgbW9kaWZpZWQgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2N5bF9iZXNzZWxfaShfVHAgX19udSwgX1RwIF9feCkKKyAgICB7CisgICAgICBpZiAoX19udSA8IF9UcCgwKSB8fCBfX3ggPCBfVHAoMCkpCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJCYWQgYXJndW1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19jeWxfYmVzc2VsX2kuIikpOworICAgICAgZWxzZSBpZiAoX19pc25hbihfX251KSB8fCBfX2lzbmFuKF9feCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZSBpZiAoX194ICogX194IDwgX1RwKDEwKSAqIChfX251ICsgX1RwKDEpKSkKKyAgICAgICAgcmV0dXJuIF9fY3lsX2Jlc3NlbF9pal9zZXJpZXMoX19udSwgX194LCArX1RwKDEpLCAyMDApOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fSV9udSwgX19LX251LCBfX0lwX251LCBfX0twX251OworICAgICAgICAgIF9fYmVzc2VsX2lrKF9fbnUsIF9feCwgX19JX251LCBfX0tfbnUsIF9fSXBfbnUsIF9fS3BfbnUpOworICAgICAgICAgIHJldHVybiBfX0lfbnU7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIGlycmVndWxhciBtb2RpZmllZCBCZXNzZWwgZnVuY3Rpb24KKyAgICAgKiAgICAgICAgICAgXGYkIEtfe1xudX0oeCkgXGYkIG9mIG9yZGVyIFxmJCBcbnUgXGYkLgorICAgICAqCisgICAgICogICBUaGUgaXJyZWd1bGFyIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgICBLX3tcbnV9KHgpID0gXGZyYWN7XHBpfXsyfQorICAgICAqICAgICAgICAgICAgICAgICAgIFxmcmFje0lfey1cbnV9KHgpIC0gSV97XG51fSh4KX17XHNpbiBcbnVccGl9CisgICAgICogICBAZl0KKyAgICAgKiAgIHdoZXJlIGZvciBpbnRlZ3JhbCBcZiQgXG51ID0gbiBcZiQgYSBsaW1pdCBpcyB0YWtlbjoKKyAgICAgKiAgIFxmJCBsaW1fe1xudSBcdG8gbn0gXGYkLgorICAgICAqCisgICAgICogICBAcGFyYW0gIF9fbnUgIFRoZSBvcmRlciBvZiB0aGUgaXJyZWd1bGFyIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX194ICAgVGhlIGFyZ3VtZW50IG9mIHRoZSBpcnJlZ3VsYXIgbW9kaWZpZWQgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIG91dHB1dCBpcnJlZ3VsYXIgbW9kaWZpZWQgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2N5bF9iZXNzZWxfayhfVHAgX19udSwgX1RwIF9feCkKKyAgICB7CisgICAgICBpZiAoX19udSA8IF9UcCgwKSB8fCBfX3ggPCBfVHAoMCkpCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJCYWQgYXJndW1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19jeWxfYmVzc2VsX2suIikpOworICAgICAgZWxzZSBpZiAoX19pc25hbihfX251KSB8fCBfX2lzbmFuKF9feCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fSV9udSwgX19LX251LCBfX0lwX251LCBfX0twX251OworICAgICAgICAgIF9fYmVzc2VsX2lrKF9fbnUsIF9feCwgX19JX251LCBfX0tfbnUsIF9fSXBfbnUsIF9fS3BfbnUpOworICAgICAgICAgIHJldHVybiBfX0tfbnU7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBDb21wdXRlIHRoZSBzcGhlcmljYWwgbW9kaWZpZWQgQmVzc2VsIGZ1bmN0aW9ucworICAgICAqICAgICAgICAgICBAZiQgaV9uKHgpIEBmJCBhbmQgQGYkIGtfbih4KSBAZiQgYW5kIHRoZWlyIGZpcnN0CisgICAgICogICAgICAgICAgIGRlcml2YXRpdmVzIEBmJCBpJ19uKHgpIEBmJCBhbmQgQGYkIGsnX24oeCkgQGYkCisgICAgICogICAgICAgICAgIHJlc3BlY3RpdmVseS4KKyAgICAgKgorICAgICAqICAgQHBhcmFtICBfX24gIFRoZSBvcmRlciBvZiB0aGUgbW9kaWZpZWQgc3BoZXJpY2FsIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIG1vZGlmaWVkIHNwaGVyaWNhbCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9faV9uICBUaGUgb3V0cHV0IHJlZ3VsYXIgbW9kaWZpZWQgc3BoZXJpY2FsIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19rX24gIFRoZSBvdXRwdXQgaXJyZWd1bGFyIG1vZGlmaWVkIHNwaGVyaWNhbAorICAgICAqICAgICAgICAgICAgICAgICAgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX2lwX24gIFRoZSBvdXRwdXQgZGVyaXZhdGl2ZSBvZiB0aGUgcmVndWxhciBtb2RpZmllZAorICAgICAqICAgICAgICAgICAgICAgICAgIHNwaGVyaWNhbCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9fa3BfbiAgVGhlIG91dHB1dCBkZXJpdmF0aXZlIG9mIHRoZSBpcnJlZ3VsYXIgbW9kaWZpZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICBzcGhlcmljYWwgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIF9fc3BoX2Jlc3NlbF9payh1bnNpZ25lZCBpbnQgX19uLCBfVHAgX194LAorICAgICAgICAgICAgICAgICAgICBfVHAgJiBfX2lfbiwgX1RwICYgX19rX24sIF9UcCAmIF9faXBfbiwgX1RwICYgX19rcF9uKQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX251ID0gX1RwKF9fbikgKyBfVHAoMC41TCk7CisKKyAgICAgIF9UcCBfX0lfbnUsIF9fSXBfbnUsIF9fS19udSwgX19LcF9udTsKKyAgICAgIF9fYmVzc2VsX2lrKF9fbnUsIF9feCwgX19JX251LCBfX0tfbnUsIF9fSXBfbnUsIF9fS3BfbnUpOworCisgICAgICBjb25zdCBfVHAgX19mYWN0b3IgPSBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fc3FydHBpbzIoKQorICAgICAgICAgICAgICAgICAgICAgICAgIC8gc3RkOjpzcXJ0KF9feCk7CisKKyAgICAgIF9faV9uID0gX19mYWN0b3IgKiBfX0lfbnU7CisgICAgICBfX2tfbiA9IF9fZmFjdG9yICogX19LX251OworICAgICAgX19pcF9uID0gX19mYWN0b3IgKiBfX0lwX251IC0gX19pX24gLyAoX1RwKDIpICogX194KTsKKyAgICAgIF9fa3BfbiA9IF9fZmFjdG9yICogX19LcF9udSAtIF9fa19uIC8gKF9UcCgyKSAqIF9feCk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBDb21wdXRlIHRoZSBBaXJ5IGZ1bmN0aW9ucworICAgICAqICAgICAgICAgICBAZiQgQWkoeCkgQGYkIGFuZCBAZiQgQmkoeCkgQGYkIGFuZCB0aGVpciBmaXJzdAorICAgICAqICAgICAgICAgICBkZXJpdmF0aXZlcyBAZiQgQWknKHgpIEBmJCBhbmQgQGYkIEJpKHgpIEBmJAorICAgICAqICAgICAgICAgICByZXNwZWN0aXZlbHkuCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX19uICBUaGUgb3JkZXIgb2YgdGhlIEFpcnkgZnVuY3Rpb25zLgorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBhcmd1bWVudCBvZiB0aGUgQWlyeSBmdW5jdGlvbnMuCisgICAgICogICBAcGFyYW0gIF9faV9uICBUaGUgb3V0cHV0IEFpcnkgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9fa19uICBUaGUgb3V0cHV0IEFpcnkgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9faXBfbiAgVGhlIG91dHB1dCBkZXJpdmF0aXZlIG9mIHRoZSBBaXJ5IGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX2twX24gIFRoZSBvdXRwdXQgZGVyaXZhdGl2ZSBvZiB0aGUgQWlyeSBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX2FpcnkoX1RwIF9feCwgX1RwICYgX19BaSwgX1RwICYgX19CaSwgX1RwICYgX19BaXAsIF9UcCAmIF9fQmlwKQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX2Fic3ggPSBzdGQ6OmFicyhfX3gpOworICAgICAgY29uc3QgX1RwIF9fcm9vdHggPSBzdGQ6OnNxcnQoX19hYnN4KTsKKyAgICAgIGNvbnN0IF9UcCBfX3ogPSBfVHAoMikgKiBfX2Fic3ggKiBfX3Jvb3R4IC8gX1RwKDMpOworCisgICAgICBpZiAoX19pc25hbihfX3gpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKF9feCA+IF9UcCgwKSkKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX0lfbnUsIF9fSXBfbnUsIF9fS19udSwgX19LcF9udTsKKworICAgICAgICAgIF9fYmVzc2VsX2lrKF9UcCgxKSAvIF9UcCgzKSwgX196LCBfX0lfbnUsIF9fS19udSwgX19JcF9udSwgX19LcF9udSk7CisgICAgICAgICAgX19BaSA9IF9fcm9vdHggKiBfX0tfbnUKKyAgICAgICAgICAgICAgIC8gKF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19zcXJ0MygpCisgICAgICAgICAgICAgICAgKiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSk7CisgICAgICAgICAgX19CaSA9IF9fcm9vdHggKiAoX19LX251IC8gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkKKyAgICAgICAgICAgICAgICAgKyBfVHAoMikgKiBfX0lfbnUgLyBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fc3FydDMoKSk7CisKKyAgICAgICAgICBfX2Jlc3NlbF9payhfVHAoMikgLyBfVHAoMyksIF9feiwgX19JX251LCBfX0tfbnUsIF9fSXBfbnUsIF9fS3BfbnUpOworICAgICAgICAgIF9fQWlwID0gLV9feCAqIF9fS19udQorICAgICAgICAgICAgICAgIC8gKF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19zcXJ0MygpCisgICAgICAgICAgICAgICAgICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkpOworICAgICAgICAgIF9fQmlwID0gX194ICogKF9fS19udSAvIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpCisgICAgICAgICAgICAgICAgICAgICAgKyBfVHAoMikgKiBfX0lfbnUKKyAgICAgICAgICAgICAgICAgICAgICAvIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19zcXJ0MygpKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX194IDwgX1RwKDApKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fSl9udSwgX19KcF9udSwgX19OX251LCBfX05wX251OworCisgICAgICAgICAgX19iZXNzZWxfam4oX1RwKDEpIC8gX1RwKDMpLCBfX3osIF9fSl9udSwgX19OX251LCBfX0pwX251LCBfX05wX251KTsKKyAgICAgICAgICBfX0FpID0gX19yb290eCAqIChfX0pfbnUKKyAgICAgICAgICAgICAgICAgICAgLSBfX05fbnUgLyBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fc3FydDMoKSkgLyBfVHAoMik7CisgICAgICAgICAgX19CaSA9IC1fX3Jvb3R4ICogKF9fTl9udQorICAgICAgICAgICAgICAgICAgICArIF9fSl9udSAvIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19zcXJ0MygpKSAvIF9UcCgyKTsKKworICAgICAgICAgIF9fYmVzc2VsX2puKF9UcCgyKSAvIF9UcCgzKSwgX196LCBfX0pfbnUsIF9fTl9udSwgX19KcF9udSwgX19OcF9udSk7CisgICAgICAgICAgX19BaXAgPSBfX2Fic3ggKiAoX19OX251IC8gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3NxcnQzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfX0pfbnUpIC8gX1RwKDIpOworICAgICAgICAgIF9fQmlwID0gX19hYnN4ICogKF9fSl9udSAvIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19zcXJ0MygpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0gX19OX251KSAvIF9UcCgyKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLy8gIFJlZmVyZW5jZToKKyAgICAgICAgICAvLyAgICBBYnJhbW93aXR6ICYgU3RlZ3VuLCBwYWdlIDQ0NiBzZWN0aW9uIDEwLjQuNCBvbiBBaXJ5IGZ1bmN0aW9ucy4KKyAgICAgICAgICAvLyAgVGhlIG51bWJlciBpcyBBaSgwKSA9IDNeey0yLzN9L1xHYW1tYSgyLzMpLgorICAgICAgICAgIF9fQWkgPSBfVHAoMC4zNTUwMjgwNTM4ODc4MTcyMzkyNkwpOworICAgICAgICAgIF9fQmkgPSBfX0FpICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3NxcnQzKCk7CisKKyAgICAgICAgICAvLyAgUmVmZXJlbmNlOgorICAgICAgICAgIC8vICAgIEFicmFtb3dpdHogJiBTdGVndW4sIHBhZ2UgNDQ2IHNlY3Rpb24gMTAuNC41IG9uIEFpcnkgZnVuY3Rpb25zLgorICAgICAgICAgIC8vICBUaGUgbnVtYmVyIGlzIEFpJygwKSA9IC0zXnstMS8zfS9cR2FtbWEoMS8zKS4KKyAgICAgICAgICBfX0FpcCA9IC1fVHAoMC4yNTg4MTk0MDM3OTI4MDY3OTg0MEwpOworICAgICAgICAgIF9fQmlwID0gLV9fQWlwICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3NxcnQzKCk7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuOworICAgIH0KKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2Ugc3RkOjp0cjE6Ol9fZGV0YWlsCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfTU9ESUZJRURfQkVTU0VMX0ZVTkNfVENDCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9wb2x5X2hlcm1pdGUudGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvcG9seV9oZXJtaXRlLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjA1Zjc5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvcG9seV9oZXJtaXRlLnRjYwpAQCAtMCwwICsxLDEyNCBAQAorLy8gU3BlY2lhbCBmdW5jdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvcG9seV9oZXJtaXRlLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3RyMS9jbWF0aH0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MiBUUjE6IDUuMiAgU3BlY2lhbCBmdW5jdGlvbnMKKy8vCisKKy8vIFdyaXR0ZW4gYnkgRWR3YXJkIFNtaXRoLVJvd2xhbmQgYmFzZWQgb246CisvLyAgICgxKSBIYW5kYm9vayBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zLAorLy8gICAgICAgRWQuIE1pbHRvbiBBYnJhbW93aXR6IGFuZCBJcmVuZSBBLiBTdGVndW4sCisvLyAgICAgICBEb3ZlciBQdWJsaWNhdGlvbnMsIFNlY3Rpb24gMjIgcHAuIDc3My04MDIKKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfUE9MWV9IRVJNSVRFX1RDQworI2RlZmluZSBfR0xJQkNYWF9UUjFfUE9MWV9IRVJNSVRFX1RDQyAxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworICAvLyBbNS4yXSBTcGVjaWFsIGZ1bmN0aW9ucworCisgIC8vIEltcGxlbWVudGF0aW9uLXNwYWNlIGRldGFpbHMuCisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgSGVybWl0ZSBwb2x5bm9taWFsCisgICAgICogICAgICAgICAgb2Ygb3JkZXIgbjogXGYkIEhfbih4KSBcZiQgYnkgcmVjdXJzaW9uIG9uIG4uCisgICAgICogCisgICAgICogICBUaGUgSGVybWl0ZSBwb2x5bm9taWFsIGlzIGRlZmluZWQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgSF9uKHgpID0gKC0xKV5uIGVee3heMn0gXGZyYWN7ZF5ufXtkeF5ufSBlXnsteF4yfQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSBfX24gVGhlIG9yZGVyIG9mIHRoZSBIZXJtaXRlIHBvbHlub21pYWwuCisgICAgICogICBAcGFyYW0gX194IFRoZSBhcmd1bWVudCBvZiB0aGUgSGVybWl0ZSBwb2x5bm9taWFsLgorICAgICAqICAgQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEhlcm1pdGUgcG9seW5vbWlhbCBvZiBvcmRlciBuCisgICAgICogICAgICAgICAgIGFuZCBhcmd1bWVudCB4LgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3BvbHlfaGVybWl0ZV9yZWN1cnNpb24odW5zaWduZWQgaW50IF9fbiwgX1RwIF9feCkKKyAgICB7CisgICAgICAvLyAgQ29tcHV0ZSBIXzAuCisgICAgICBfVHAgX19IXzAgPSAxOworICAgICAgaWYgKF9fbiA9PSAwKQorICAgICAgICByZXR1cm4gX19IXzA7CisKKyAgICAgIC8vICBDb21wdXRlIEhfMS4KKyAgICAgIF9UcCBfX0hfMSA9IDIgKiBfX3g7CisgICAgICBpZiAoX19uID09IDEpCisgICAgICAgIHJldHVybiBfX0hfMTsKKworICAgICAgLy8gIENvbXB1dGUgSF9uLgorICAgICAgX1RwIF9fSF9uLCBfX0hfbm0xLCBfX0hfbm0yOworICAgICAgdW5zaWduZWQgaW50IF9faTsKKyAgICAgIGZvciAgKF9fSF9ubTIgPSBfX0hfMCwgX19IX25tMSA9IF9fSF8xLCBfX2kgPSAyOyBfX2kgPD0gX19uOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9fSF9uID0gMiAqIChfX3ggKiBfX0hfbm0xIC0gKF9faSAtIDEpICogX19IX25tMik7CisgICAgICAgICAgX19IX25tMiA9IF9fSF9ubTE7CisgICAgICAgICAgX19IX25tMSA9IF9fSF9uOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBfX0hfbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBIZXJtaXRlIHBvbHlub21pYWwKKyAgICAgKiAgICAgICAgICBvZiBvcmRlciBuOiBcZiQgSF9uKHgpIFxmJC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBIZXJtaXRlIHBvbHlub21pYWwgaXMgZGVmaW5lZCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICBIX24oeCkgPSAoLTEpXm4gZV57eF4yfSBcZnJhY3tkXm59e2R4Xm59IGVeey14XjJ9CisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9fbiBUaGUgb3JkZXIgb2YgdGhlIEhlcm1pdGUgcG9seW5vbWlhbC4KKyAgICAgKiAgIEBwYXJhbSBfX3ggVGhlIGFyZ3VtZW50IG9mIHRoZSBIZXJtaXRlIHBvbHlub21pYWwuCisgICAgICogICBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSGVybWl0ZSBwb2x5bm9taWFsIG9mIG9yZGVyIG4KKyAgICAgKiAgICAgICAgICAgYW5kIGFyZ3VtZW50IHguCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBfX3BvbHlfaGVybWl0ZSh1bnNpZ25lZCBpbnQgX19uLCBfVHAgX194KQorICAgIHsKKyAgICAgIGlmIChfX2lzbmFuKF9feCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX19wb2x5X2hlcm1pdGVfcmVjdXJzaW9uKF9fbiwgX194KTsKKyAgICB9CisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0gLy8gbmFtZXNwYWNlIHN0ZDo6dHIxOjpfX2RldGFpbAorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX1BPTFlfSEVSTUlURV9UQ0MKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3BvbHlfbGFndWVycmUudGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvcG9seV9sYWd1ZXJyZS50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkNGExNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3BvbHlfbGFndWVycmUudGNjCkBAIC0wLDAgKzEsMzE5IEBACisvLyBTcGVjaWFsIGZ1bmN0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9wb2x5X2xhZ3VlcnJlLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3RyMS9jbWF0aH0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MiBUUjE6IDUuMiAgU3BlY2lhbCBmdW5jdGlvbnMKKy8vCisKKy8vIFdyaXR0ZW4gYnkgRWR3YXJkIFNtaXRoLVJvd2xhbmQgYmFzZWQgb246CisvLyAgICgxKSBIYW5kYm9vayBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zLAorLy8gICAgICAgRWQuIE1pbHRvbiBBYnJhbW93aXR6IGFuZCBJcmVuZSBBLiBTdGVndW4sCisvLyAgICAgICBEb3ZlciBQdWJsaWNhdGlvbnMsCisvLyAgICAgICBTZWN0aW9uIDEzLCBwcC4gNTA5LTUxMCwgU2VjdGlvbiAyMiBwcC4gNzczLTgwMgorLy8gICAoMikgVGhlIEdudSBTY2llbnRpZmljIExpYnJhcnksIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nc2wKKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfUE9MWV9MQUdVRVJSRV9UQ0MKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX1BPTFlfTEFHVUVSUkVfVENDIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIC8vIFs1LjJdIFNwZWNpYWwgZnVuY3Rpb25zCisKKyAgLy8gSW1wbGVtZW50YXRpb24tc3BhY2UgZGV0YWlscy4KKyAgbmFtZXNwYWNlIF9fZGV0YWlsCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBhc3NvY2lhdGVkIExhZ3VlcnJlIHBvbHlub21pYWwgCisgICAgICogICAgICAgICAgb2Ygb3JkZXIgQGYkIG4gQGYkLCBkZWdyZWUgQGYkIFxhbHBoYSBAZiQgZm9yIGxhcmdlIG4uCisgICAgICogICBBYnJhbW93aXR6ICYgU3RlZ3VuLCAxMy41LjIxCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSBfX24gVGhlIG9yZGVyIG9mIHRoZSBMYWd1ZXJyZSBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSBfX2FscGhhIFRoZSBkZWdyZWUgb2YgdGhlIExhZ3VlcnJlIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtIF9feCBUaGUgYXJndW1lbnQgb2YgdGhlIExhZ3VlcnJlIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIExhZ3VlcnJlIGZ1bmN0aW9uIG9mIG9yZGVyIG4sCisgICAgICogICAgICAgICAgIGRlZ3JlZSBAZiQgXGFscGhhIEBmJCwgYW5kIGFyZ3VtZW50IHguCisgICAgICoKKyAgICAgKiAgVGhpcyBpcyBmcm9tIHRoZSBHTlUgU2NpZW50aWZpYyBMaWJyYXJ5LgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcGEsIHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3BvbHlfbGFndWVycmVfbGFyZ2Vfbih1bnNpZ25lZCBfX24sIF9UcGEgX19hbHBoYTEsIF9UcCBfX3gpCisgICAgeworICAgICAgY29uc3QgX1RwIF9fYSA9IC1fVHAoX19uKTsKKyAgICAgIGNvbnN0IF9UcCBfX2IgPSBfVHAoX19hbHBoYTEpICsgX1RwKDEpOworICAgICAgY29uc3QgX1RwIF9fZXRhID0gX1RwKDIpICogX19iIC0gX1RwKDQpICogX19hOworICAgICAgY29uc3QgX1RwIF9fY29zMnRoID0gX194IC8gX19ldGE7CisgICAgICBjb25zdCBfVHAgX19zaW4ydGggPSBfVHAoMSkgLSBfX2NvczJ0aDsKKyAgICAgIGNvbnN0IF9UcCBfX3RoID0gc3RkOjphY29zKHN0ZDo6c3FydChfX2NvczJ0aCkpOworICAgICAgY29uc3QgX1RwIF9fcHJlX2ggPSBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGlfMigpCisgICAgICAgICAgICAgICAgICAgICAgICAqIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waV8yKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICogX19ldGEgKiBfX2V0YSAqIF9fY29zMnRoICogX19zaW4ydGg7CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICBjb25zdCBfVHAgX19sZ19iID0gc3RkOjp0cjE6OmxnYW1tYShfVHAoX19uKSArIF9fYik7CisgICAgICBjb25zdCBfVHAgX19sbmZhY3QgPSBzdGQ6OnRyMTo6bGdhbW1hKF9UcChfX24gKyAxKSk7CisjZWxzZQorICAgICAgY29uc3QgX1RwIF9fbGdfYiA9IF9fbG9nX2dhbW1hKF9UcChfX24pICsgX19iKTsKKyAgICAgIGNvbnN0IF9UcCBfX2xuZmFjdCA9IF9fbG9nX2dhbW1hKF9UcChfX24gKyAxKSk7CisjZW5kaWYKKworICAgICAgX1RwIF9fcHJlX3Rlcm0xID0gX1RwKDAuNUwpICogKF9UcCgxKSAtIF9fYikKKyAgICAgICAgICAgICAgICAgICAgICAqIHN0ZDo6bG9nKF9UcCgwLjI1TCkgKiBfX3ggKiBfX2V0YSk7CisgICAgICBfVHAgX19wcmVfdGVybTIgPSBfVHAoMC4yNUwpICogc3RkOjpsb2coX19wcmVfaCk7CisgICAgICBfVHAgX19sbnByZSA9IF9fbGdfYiAtIF9fbG5mYWN0ICsgX1RwKDAuNUwpICogX194CisgICAgICAgICAgICAgICAgICAgICAgKyBfX3ByZV90ZXJtMSAtIF9fcHJlX3Rlcm0yOworICAgICAgX1RwIF9fc2VyX3Rlcm0xID0gc3RkOjpzaW4oX19hICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkpOworICAgICAgX1RwIF9fc2VyX3Rlcm0yID0gc3RkOjpzaW4oX1RwKDAuMjVMKSAqIF9fZXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChfVHAoMikgKiBfX3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzdGQ6OnNpbihfVHAoMikgKiBfX3RoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waV80KCkpOworICAgICAgX1RwIF9fc2VyID0gX19zZXJfdGVybTEgKyBfX3Nlcl90ZXJtMjsKKworICAgICAgcmV0dXJuIHN0ZDo6ZXhwKF9fbG5wcmUpICogX19zZXI7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBFdmFsdWF0ZSB0aGUgcG9seW5vbWlhbCBiYXNlZCBvbiB0aGUgY29uZmx1ZW50IGh5cGVyZ2VvbWV0cmljCisgICAgICogICAgICAgICAgZnVuY3Rpb24gaW4gYSBzYWZlIHdheSwgd2l0aCBubyByZXN0cmljdGlvbiBvbiB0aGUgYXJndW1lbnRzLgorICAgICAqCisgICAgICogICBUaGUgYXNzb2NpYXRlZCBMYWd1ZXJyZSBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5CisgICAgICogICBAZlsKKyAgICAgKiAgICAgICBMX25eXGFscGhhKHgpID0gXGZyYWN7KFxhbHBoYSArIDEpX259e24hfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBfMUZfMSgtbjsgXGFscGhhICsgMTsgeCkKKyAgICAgKiAgIEBmXQorICAgICAqICAgd2hlcmUgQGYkIChcYWxwaGEpX24gQGYkIGlzIHRoZSBQb2NoaGFtbWVyIHN5bWJvbCBhbmQKKyAgICAgKiAgIEBmJCBfMUZfMShhOyBjOyB4KSBAZiQgaXMgdGhlIGNvbmZsdWVudCBoeXBlcmdlb21ldHJpYyBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqICBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgeCAhPSAwLgorICAgICAqCisgICAgICogIFRoaXMgaXMgZnJvbSB0aGUgR05VIFNjaWVudGlmaWMgTGlicmFyeS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHBhLCB0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19wb2x5X2xhZ3VlcnJlX2h5cGVyZyh1bnNpZ25lZCBpbnQgX19uLCBfVHBhIF9fYWxwaGExLCBfVHAgX194KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX2IgPSBfVHAoX19hbHBoYTEpICsgX1RwKDEpOworICAgICAgY29uc3QgX1RwIF9fbXggPSAtX194OworICAgICAgY29uc3QgX1RwIF9fdGNfc2duID0gKF9feCA8IF9UcCgwKSA/IF9UcCgxKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogKChfX24gJSAyID09IDEpID8gLV9UcCgxKSA6IF9UcCgxKSkpOworICAgICAgLy8gIEdldCB8eHxebi9uIQorICAgICAgX1RwIF9fdGMgPSBfVHAoMSk7CisgICAgICBjb25zdCBfVHAgX19heCA9IHN0ZDo6YWJzKF9feCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2sgPSAxOyBfX2sgPD0gX19uOyArK19faykKKyAgICAgICAgX190YyAqPSAoX19heCAvIF9fayk7CisKKyAgICAgIF9UcCBfX3Rlcm0gPSBfX3RjICogX190Y19zZ247CisgICAgICBfVHAgX19zdW0gPSBfX3Rlcm07CisgICAgICBmb3IgKGludCBfX2sgPSBpbnQoX19uKSAtIDE7IF9fayA+PSAwOyAtLV9faykKKyAgICAgICAgeworICAgICAgICAgIF9fdGVybSAqPSAoKF9fYiArIF9UcChfX2spKSAvIF9UcChpbnQoX19uKSAtIF9faykpCisgICAgICAgICAgICAgICAgICAqIF9UcChfX2sgKyAxKSAvIF9fbXg7CisgICAgICAgICAgX19zdW0gKz0gX190ZXJtOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBfX3N1bTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBhc3NvY2lhdGVkIExhZ3VlcnJlIHBvbHlub21pYWwgCisgICAgICogICAgICAgICAgb2Ygb3JkZXIgQGYkIG4gQGYkLCBkZWdyZWUgQGYkIFxhbHBoYSBAZiQ6IEBmJCBMX25eXGFscGhhKHgpIEBmJAorICAgICAqICAgICAgICAgIGJ5IHJlY3Vyc2lvbi4KKyAgICAgKgorICAgICAqICAgVGhlIGFzc29jaWF0ZWQgTGFndWVycmUgZnVuY3Rpb24gaXMgZGVmaW5lZCBieQorICAgICAqICAgQGZbCisgICAgICogICAgICAgTF9uXlxhbHBoYSh4KSA9IFxmcmFjeyhcYWxwaGEgKyAxKV9ufXtuIX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgXzFGXzEoLW47IFxhbHBoYSArIDE7IHgpCisgICAgICogICBAZl0KKyAgICAgKiAgIHdoZXJlIEBmJCAoXGFscGhhKV9uIEBmJCBpcyB0aGUgUG9jaGhhbW1lciBzeW1ib2wgYW5kCisgICAgICogICBAZiQgXzFGXzEoYTsgYzsgeCkgQGYkIGlzIHRoZSBjb25mbHVlbnQgaHlwZXJnZW9tZXRyaWMgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiAgIFRoZSBhc3NvY2lhdGVkIExhZ3VlcnJlIHBvbHlub21pYWwgaXMgZGVmaW5lZCBmb3IgaW50ZWdyYWwKKyAgICAgKiAgIEBmJCBcYWxwaGEgPSBtIEBmJCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICAgIExfbl5tKHgpID0gKC0xKV5tIFxmcmFje2RebX17ZHhebX0gTF97biArIG19KHgpCisgICAgICogICBAZl0KKyAgICAgKiAgIHdoZXJlIHRoZSBMYWd1ZXJyZSBwb2x5bm9taWFsIGlzIGRlZmluZWQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgICBMX24oeCkgPSBcZnJhY3tlXnh9e24hfSBcZnJhY3tkXm59e2R4Xm59ICh4Xm5lXnsteH0pCisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9fbiBUaGUgb3JkZXIgb2YgdGhlIExhZ3VlcnJlIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtIF9fYWxwaGEgVGhlIGRlZ3JlZSBvZiB0aGUgTGFndWVycmUgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gX194IFRoZSBhcmd1bWVudCBvZiB0aGUgTGFndWVycmUgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTGFndWVycmUgZnVuY3Rpb24gb2Ygb3JkZXIgbiwKKyAgICAgKiAgICAgICAgICAgZGVncmVlIEBmJCBcYWxwaGEgQGYkLCBhbmQgYXJndW1lbnQgeC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHBhLCB0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19wb2x5X2xhZ3VlcnJlX3JlY3Vyc2lvbih1bnNpZ25lZCBpbnQgX19uLCBfVHBhIF9fYWxwaGExLCBfVHAgX194KQorICAgIHsKKyAgICAgIC8vICAgQ29tcHV0ZSBsXzAuCisgICAgICBfVHAgX19sXzAgPSBfVHAoMSk7CisgICAgICBpZiAgKF9fbiA9PSAwKQorICAgICAgICByZXR1cm4gX19sXzA7CisKKyAgICAgIC8vICBDb21wdXRlIGxfMV5hbHBoYS4KKyAgICAgIF9UcCBfX2xfMSA9IC1fX3ggKyBfVHAoMSkgKyBfVHAoX19hbHBoYTEpOworICAgICAgaWYgIChfX24gPT0gMSkKKyAgICAgICAgcmV0dXJuIF9fbF8xOworCisgICAgICAvLyAgQ29tcHV0ZSBsX25eYWxwaGEgYnkgcmVjdXJzaW9uIG9uIG4uCisgICAgICBfVHAgX19sX24yID0gX19sXzA7CisgICAgICBfVHAgX19sX24xID0gX19sXzE7CisgICAgICBfVHAgX19sX24gPSBfVHAoMCk7CisgICAgICBmb3IgICh1bnNpZ25lZCBpbnQgX19ubiA9IDI7IF9fbm4gPD0gX19uOyArK19fbm4pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fbF9uID0gKF9UcCgyICogX19ubiAtIDEpICsgX1RwKF9fYWxwaGExKSAtIF9feCkKKyAgICAgICAgICAgICAgICAgICogX19sX24xIC8gX1RwKF9fbm4pCisgICAgICAgICAgICAgICAgICAtIChfVHAoX19ubiAtIDEpICsgX1RwKF9fYWxwaGExKSkgKiBfX2xfbjIgLyBfVHAoX19ubik7CisgICAgICAgICAgICBfX2xfbjIgPSBfX2xfbjE7CisgICAgICAgICAgICBfX2xfbjEgPSBfX2xfbjsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gX19sX247CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgYXNzb2NpYXRlZCBMYWd1ZXJyZSBwb2x5bm9taWFsCisgICAgICogICAgICAgICAgb2Ygb3JkZXIgbiwgZGVncmVlIEBmJCBcYWxwaGEgQGYkOiBAZiQgTF9uXmFscGhhKHgpIEBmJC4KKyAgICAgKgorICAgICAqICAgVGhlIGFzc29jaWF0ZWQgTGFndWVycmUgZnVuY3Rpb24gaXMgZGVmaW5lZCBieQorICAgICAqICAgQGZbCisgICAgICogICAgICAgTF9uXlxhbHBoYSh4KSA9IFxmcmFjeyhcYWxwaGEgKyAxKV9ufXtuIX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgXzFGXzEoLW47IFxhbHBoYSArIDE7IHgpCisgICAgICogICBAZl0KKyAgICAgKiAgIHdoZXJlIEBmJCAoXGFscGhhKV9uIEBmJCBpcyB0aGUgUG9jaGhhbW1lciBzeW1ib2wgYW5kCisgICAgICogICBAZiQgXzFGXzEoYTsgYzsgeCkgQGYkIGlzIHRoZSBjb25mbHVlbnQgaHlwZXJnZW9tZXRyaWMgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiAgIFRoZSBhc3NvY2lhdGVkIExhZ3VlcnJlIHBvbHlub21pYWwgaXMgZGVmaW5lZCBmb3IgaW50ZWdyYWwKKyAgICAgKiAgIEBmJCBcYWxwaGEgPSBtIEBmJCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICAgIExfbl5tKHgpID0gKC0xKV5tIFxmcmFje2RebX17ZHhebX0gTF97biArIG19KHgpCisgICAgICogICBAZl0KKyAgICAgKiAgIHdoZXJlIHRoZSBMYWd1ZXJyZSBwb2x5bm9taWFsIGlzIGRlZmluZWQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgICBMX24oeCkgPSBcZnJhY3tlXnh9e24hfSBcZnJhY3tkXm59e2R4Xm59ICh4Xm5lXnsteH0pCisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9fbiBUaGUgb3JkZXIgb2YgdGhlIExhZ3VlcnJlIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtIF9fYWxwaGEgVGhlIGRlZ3JlZSBvZiB0aGUgTGFndWVycmUgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gX194IFRoZSBhcmd1bWVudCBvZiB0aGUgTGFndWVycmUgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTGFndWVycmUgZnVuY3Rpb24gb2Ygb3JkZXIgbiwKKyAgICAgKiAgICAgICAgICAgZGVncmVlIEBmJCBcYWxwaGEgQGYkLCBhbmQgYXJndW1lbnQgeC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHBhLCB0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19wb2x5X2xhZ3VlcnJlKHVuc2lnbmVkIGludCBfX24sIF9UcGEgX19hbHBoYTEsIF9UcCBfX3gpCisgICAgeworICAgICAgaWYgKF9feCA8IF9UcCgwKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIk5lZ2F0aXZlIGFyZ3VtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9fcG9seV9sYWd1ZXJyZS4iKSk7CisgICAgICAvLyAgUmV0dXJuIE5hTiBvbiBOYU4gaW5wdXQuCisgICAgICBlbHNlIGlmIChfX2lzbmFuKF9feCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZSBpZiAoX19uID09IDApCisgICAgICAgIHJldHVybiBfVHAoMSk7CisgICAgICBlbHNlIGlmIChfX24gPT0gMSkKKyAgICAgICAgcmV0dXJuIF9UcCgxKSArIF9UcChfX2FscGhhMSkgLSBfX3g7CisgICAgICBlbHNlIGlmIChfX3ggPT0gX1RwKDApKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fcHJvZCA9IF9UcChfX2FscGhhMSkgKyBfVHAoMSk7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19rID0gMjsgX19rIDw9IF9fbjsgKytfX2spCisgICAgICAgICAgICBfX3Byb2QgKj0gKF9UcChfX2FscGhhMSkgKyBfVHAoX19rKSkgLyBfVHAoX19rKTsKKyAgICAgICAgICByZXR1cm4gX19wcm9kOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfX24gPiAxMDAwMDAwMCAmJiBfVHAoX19hbHBoYTEpID4gLV9UcCgxKQorICAgICAgICAgICAgJiYgX194IDwgX1RwKDIpICogKF9UcChfX2FscGhhMSkgKyBfVHAoMSkpICsgX1RwKDQgKiBfX24pKQorICAgICAgICByZXR1cm4gX19wb2x5X2xhZ3VlcnJlX2xhcmdlX24oX19uLCBfX2FscGhhMSwgX194KTsKKyAgICAgIGVsc2UgaWYgKF9UcChfX2FscGhhMSkgPj0gX1RwKDApCisgICAgICAgICAgIHx8IChfX3ggPiBfVHAoMCkgJiYgX1RwKF9fYWxwaGExKSA8IC1fVHAoX19uICsgMSkpKQorICAgICAgICByZXR1cm4gX19wb2x5X2xhZ3VlcnJlX3JlY3Vyc2lvbihfX24sIF9fYWxwaGExLCBfX3gpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX19wb2x5X2xhZ3VlcnJlX2h5cGVyZyhfX24sIF9fYWxwaGExLCBfX3gpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGFzc29jaWF0ZWQgTGFndWVycmUgcG9seW5vbWlhbAorICAgICAqICAgICAgICAgIG9mIG9yZGVyIG4sIGRlZ3JlZSBtOiBAZiQgTF9uXm0oeCkgQGYkLgorICAgICAqCisgICAgICogICBUaGUgYXNzb2NpYXRlZCBMYWd1ZXJyZSBwb2x5bm9taWFsIGlzIGRlZmluZWQgZm9yIGludGVncmFsCisgICAgICogICBAZiQgXGFscGhhID0gbSBAZiQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgICBMX25ebSh4KSA9ICgtMSlebSBcZnJhY3tkXm19e2R4Xm19IExfe24gKyBtfSh4KQorICAgICAqICAgQGZdCisgICAgICogICB3aGVyZSB0aGUgTGFndWVycmUgcG9seW5vbWlhbCBpcyBkZWZpbmVkIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgICAgTF9uKHgpID0gXGZyYWN7ZV54fXtuIX0gXGZyYWN7ZF5ufXtkeF5ufSAoeF5uZV57LXh9KQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSBfX24gVGhlIG9yZGVyIG9mIHRoZSBMYWd1ZXJyZSBwb2x5bm9taWFsLgorICAgICAqICAgQHBhcmFtIF9fbSBUaGUgZGVncmVlIG9mIHRoZSBMYWd1ZXJyZSBwb2x5bm9taWFsLgorICAgICAqICAgQHBhcmFtIF9feCBUaGUgYXJndW1lbnQgb2YgdGhlIExhZ3VlcnJlIHBvbHlub21pYWwuCisgICAgICogICBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgYXNzb2NpYXRlZCBMYWd1ZXJyZSBwb2x5bm9taWFsIG9mIG9yZGVyIG4sCisgICAgICogICAgICAgICAgIGRlZ3JlZSBtLCBhbmQgYXJndW1lbnQgeC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIF9fYXNzb2NfbGFndWVycmUodW5zaWduZWQgaW50IF9fbiwgdW5zaWduZWQgaW50IF9fbSwgX1RwIF9feCkKKyAgICB7IHJldHVybiBfX3BvbHlfbGFndWVycmU8dW5zaWduZWQgaW50LCBfVHA+KF9fbiwgX19tLCBfX3gpOyB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBMYWd1ZXJyZSBwb2x5bm9taWFsCisgICAgICogICAgICAgICAgb2Ygb3JkZXIgbjogQGYkIExfbih4KSBAZiQuCisgICAgICoKKyAgICAgKiAgIFRoZSBMYWd1ZXJyZSBwb2x5bm9taWFsIGlzIGRlZmluZWQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgICBMX24oeCkgPSBcZnJhY3tlXnh9e24hfSBcZnJhY3tkXm59e2R4Xm59ICh4Xm5lXnsteH0pCisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9fbiBUaGUgb3JkZXIgb2YgdGhlIExhZ3VlcnJlIHBvbHlub21pYWwuCisgICAgICogICBAcGFyYW0gX194IFRoZSBhcmd1bWVudCBvZiB0aGUgTGFndWVycmUgcG9seW5vbWlhbC4KKyAgICAgKiAgIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBMYWd1ZXJyZSBwb2x5bm9taWFsIG9mIG9yZGVyIG4KKyAgICAgKiAgICAgICAgICAgYW5kIGFyZ3VtZW50IHguCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBfX2xhZ3VlcnJlKHVuc2lnbmVkIGludCBfX24sIF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19wb2x5X2xhZ3VlcnJlPHVuc2lnbmVkIGludCwgX1RwPihfX24sIDAsIF9feCk7IH0KKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2Ugc3RkOjp0cjE6Ol9fZGV0YWlsCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfUE9MWV9MQUdVRVJSRV9UQ0MKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3JhbmRvbSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3JhbmRvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGQzMDg0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvcmFuZG9tCkBAIC0wLDAgKzEsNTAgQEAKKy8vIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKioKKyAqIEBmaWxlIHRyMS9yYW5kb20KKyAqIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9SQU5ET00KKyNkZWZpbmUgX0dMSUJDWFhfVFIxX1JBTkRPTSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGV4dC90eXBlX3RyYWl0cy5oPgorI2luY2x1ZGUgPGV4dC9udW1lcmljX3RyYWl0cy5oPgorI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisjaW5jbHVkZSA8dHIxL3R5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHRyMS9jbWF0aD4KKyNpbmNsdWRlIDx0cjEvcmFuZG9tLmg+CisjaW5jbHVkZSA8dHIxL3JhbmRvbS50Y2M+CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfUkFORE9NCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9yYW5kb20uaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3JhbmRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZjk1M2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9yYW5kb20uaApAQCAtMCwwICsxLDI0MTcgQEAKKy8vIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKioKKyAqIEBmaWxlIHRyMS9yYW5kb20uaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3RyMS9yYW5kb219CisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfUkFORE9NX0gKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX1JBTkRPTV9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKKyAgLy8gWzUuMV0gUmFuZG9tIG51bWJlciBnZW5lcmF0aW9uCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIHRyMV9yYW5kb20gUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisgICAqIEEgZmFjaWxpdHkgZm9yIGdlbmVyYXRpbmcgcmFuZG9tIG51bWJlcnMgb24gc2VsZWN0ZWQgZGlzdHJpYnV0aW9ucy4KKyAgICogQHsKKyAgICovCisKKyAgLyoKKyAgICogSW1wbGVtZW50YXRpb24tc3BhY2UgZGV0YWlscy4KKyAgICovCisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIGludCBfX3csIAorCSAgICAgYm9vbCA9IF9fdyA8IHN0ZDo6bnVtZXJpY19saW1pdHM8X1VJbnRUeXBlPjo6ZGlnaXRzPgorICAgICAgc3RydWN0IF9TaGlmdAorICAgICAgeyBzdGF0aWMgY29uc3QgX1VJbnRUeXBlIF9fdmFsdWUgPSAwOyB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBpbnQgX193PgorICAgICAgc3RydWN0IF9TaGlmdDxfVUludFR5cGUsIF9fdywgdHJ1ZT4KKyAgICAgIHsgc3RhdGljIGNvbnN0IF9VSW50VHlwZSBfX3ZhbHVlID0gX1VJbnRUeXBlKDEpIDw8IF9fdzsgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX1RwIF9fYSwgX1RwIF9fYywgX1RwIF9fbSwgYm9vbD4KKyAgICAgIHN0cnVjdCBfTW9kOworCisgICAgLy8gRGlzcGF0Y2ggYmFzZWQgb24gbW9kdWx1cyB2YWx1ZSB0byBwcmV2ZW50IGRpdmlkZS1ieS16ZXJvIGNvbXBpbGUtdGltZQorICAgIC8vIGVycm9ycyB3aGVuIG0gPT0gMC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9UcCBfX2EsIF9UcCBfX2MsIF9UcCBfX20+CisgICAgICBpbmxpbmUgX1RwCisgICAgICBfX21vZChfVHAgX194KQorICAgICAgeyByZXR1cm4gX01vZDxfVHAsIF9fYSwgX19jLCBfX20sIF9fbSA9PSAwPjo6X19jYWxjKF9feCk7IH0KKworICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX2NvbmRpdGlvbmFsX3R5cGU8KHNpemVvZih1bnNpZ25lZCkgPT0gNCksCisJCSAgICB1bnNpZ25lZCwgdW5zaWduZWQgbG9uZz46Ol9fdHlwZSBfVUludDMyVHlwZTsKKworICAgIC8qCisgICAgICogQW4gYWRhcHRvciBjbGFzcyBmb3IgY29udmVydGluZyB0aGUgb3V0cHV0IG9mIGFueSBHZW5lcmF0b3IgaW50bworICAgICAqIHRoZSBpbnB1dCBmb3IgYSBzcGVjaWZpYyBEaXN0cmlidXRpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0VuZ2luZSwgdHlwZW5hbWUgX0Rpc3RyaWJ1dGlvbj4KKyAgICAgIHN0cnVjdCBfQWRhcHRvcgorICAgICAgeyAKKwl0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X0VuZ2luZT46OnR5cGUgX0JFbmdpbmU7CisJdHlwZWRlZiB0eXBlbmFtZSBfQkVuZ2luZTo6cmVzdWx0X3R5cGUgICAgICAgICAgIF9FbmdpbmVfcmVzdWx0X3R5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBfRGlzdHJpYnV0aW9uOjppbnB1dF90eXBlICAgICAgIHJlc3VsdF90eXBlOworCisgICAgICBwdWJsaWM6CisJX0FkYXB0b3IoY29uc3QgX0VuZ2luZSYgX19nKQorCTogX01fZyhfX2cpIHsgfQorCisJcmVzdWx0X3R5cGUKKwltaW4oKSBjb25zdAorCXsKKwkgIHJlc3VsdF90eXBlIF9fcmV0dXJuX3ZhbHVlOworCSAgaWYgKGlzX2ludGVncmFsPF9FbmdpbmVfcmVzdWx0X3R5cGU+Ojp2YWx1ZQorCSAgICAgICYmIGlzX2ludGVncmFsPHJlc3VsdF90eXBlPjo6dmFsdWUpCisJICAgIF9fcmV0dXJuX3ZhbHVlID0gX01fZy5taW4oKTsKKwkgIGVsc2UKKwkgICAgX19yZXR1cm5fdmFsdWUgPSByZXN1bHRfdHlwZSgwKTsKKwkgIHJldHVybiBfX3JldHVybl92YWx1ZTsKKwl9CisKKwlyZXN1bHRfdHlwZQorCW1heCgpIGNvbnN0CisJeworCSAgcmVzdWx0X3R5cGUgX19yZXR1cm5fdmFsdWU7CisJICBpZiAoaXNfaW50ZWdyYWw8X0VuZ2luZV9yZXN1bHRfdHlwZT46OnZhbHVlCisJICAgICAgJiYgaXNfaW50ZWdyYWw8cmVzdWx0X3R5cGU+Ojp2YWx1ZSkKKwkgICAgX19yZXR1cm5fdmFsdWUgPSBfTV9nLm1heCgpOworCSAgZWxzZSBpZiAoIWlzX2ludGVncmFsPHJlc3VsdF90eXBlPjo6dmFsdWUpCisJICAgIF9fcmV0dXJuX3ZhbHVlID0gcmVzdWx0X3R5cGUoMSk7CisJICBlbHNlCisJICAgIF9fcmV0dXJuX3ZhbHVlID0gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1heCgpIC0gMTsKKwkgIHJldHVybiBfX3JldHVybl92YWx1ZTsKKwl9CisKKwkvKgorCSAqIENvbnZlcnRzIGEgdmFsdWUgZ2VuZXJhdGVkIGJ5IHRoZSBhZGFwdGVkIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisJICogaW50byBhIHZhbHVlIGluIHRoZSBpbnB1dCBkb21haW4gZm9yIHRoZSBkZXBlbmRlbnQgcmFuZG9tIG51bWJlcgorCSAqIGRpc3RyaWJ1dGlvbi4KKwkgKgorCSAqIEJlY2F1c2UgdGhlIHR5cGUgdHJhaXRzIGFyZSBjb21waWxlIHRpbWUgY29uc3RhbnRzIG9ubHkgdGhlCisJICogYXBwcm9wcmlhdGUgY2xhdXNlIG9mIHRoZSBpZiBzdGF0ZW1lbnRzIHdpbGwgYWN0dWFsbHkgYmUgZW1pdHRlZAorCSAqIGJ5IHRoZSBjb21waWxlci4KKwkgKi8KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoKQorCXsKKwkgIHJlc3VsdF90eXBlIF9fcmV0dXJuX3ZhbHVlOworCSAgaWYgKGlzX2ludGVncmFsPF9FbmdpbmVfcmVzdWx0X3R5cGU+Ojp2YWx1ZQorCSAgICAgICYmIGlzX2ludGVncmFsPHJlc3VsdF90eXBlPjo6dmFsdWUpCisJICAgIF9fcmV0dXJuX3ZhbHVlID0gX01fZygpOworCSAgZWxzZSBpZiAoIWlzX2ludGVncmFsPF9FbmdpbmVfcmVzdWx0X3R5cGU+Ojp2YWx1ZQorCQkgICAmJiAhaXNfaW50ZWdyYWw8cmVzdWx0X3R5cGU+Ojp2YWx1ZSkKKwkgICAgX19yZXR1cm5fdmFsdWUgPSByZXN1bHRfdHlwZShfTV9nKCkgLSBfTV9nLm1pbigpKQorCSAgICAgIC8gcmVzdWx0X3R5cGUoX01fZy5tYXgoKSAtIF9NX2cubWluKCkpOworCSAgZWxzZSBpZiAoaXNfaW50ZWdyYWw8X0VuZ2luZV9yZXN1bHRfdHlwZT46OnZhbHVlCisJCSAgICYmICFpc19pbnRlZ3JhbDxyZXN1bHRfdHlwZT46OnZhbHVlKQorCSAgICBfX3JldHVybl92YWx1ZSA9IHJlc3VsdF90eXBlKF9NX2coKSAtIF9NX2cubWluKCkpCisJICAgICAgLyByZXN1bHRfdHlwZShfTV9nLm1heCgpIC0gX01fZy5taW4oKSArIHJlc3VsdF90eXBlKDEpKTsKKwkgIGVsc2UKKwkgICAgX19yZXR1cm5fdmFsdWUgPSAoKChfTV9nKCkgLSBfTV9nLm1pbigpKSAKKwkJCSAgICAgICAvIChfTV9nLm1heCgpIC0gX01fZy5taW4oKSkpCisJCQkgICAgICAqIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKSk7CisJICByZXR1cm4gX19yZXR1cm5fdmFsdWU7CisJfQorCisgICAgICBwcml2YXRlOgorCV9FbmdpbmUgX01fZzsKKyAgICAgIH07CisKKyAgICAvLyBTcGVjaWFsaXphdGlvbiBmb3IgX0VuZ2luZSouCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0VuZ2luZSwgdHlwZW5hbWUgX0Rpc3RyaWJ1dGlvbj4KKyAgICAgIHN0cnVjdCBfQWRhcHRvcjxfRW5naW5lKiwgX0Rpc3RyaWJ1dGlvbj4KKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9FbmdpbmU6OnJlc3VsdF90eXBlICAgICAgX0VuZ2luZV9yZXN1bHRfdHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9EaXN0cmlidXRpb246OmlucHV0X3R5cGUgcmVzdWx0X3R5cGU7CisKKyAgICAgIHB1YmxpYzoKKwlfQWRhcHRvcihfRW5naW5lKiBfX2cpCisJOiBfTV9nKF9fZykgeyB9CisKKwlyZXN1bHRfdHlwZQorCW1pbigpIGNvbnN0CisJeworCSAgcmVzdWx0X3R5cGUgX19yZXR1cm5fdmFsdWU7CisJICBpZiAoaXNfaW50ZWdyYWw8X0VuZ2luZV9yZXN1bHRfdHlwZT46OnZhbHVlCisJICAgICAgJiYgaXNfaW50ZWdyYWw8cmVzdWx0X3R5cGU+Ojp2YWx1ZSkKKwkgICAgX19yZXR1cm5fdmFsdWUgPSBfTV9nLT5taW4oKTsKKwkgIGVsc2UKKwkgICAgX19yZXR1cm5fdmFsdWUgPSByZXN1bHRfdHlwZSgwKTsKKwkgIHJldHVybiBfX3JldHVybl92YWx1ZTsKKwl9CisKKwlyZXN1bHRfdHlwZQorCW1heCgpIGNvbnN0CisJeworCSAgcmVzdWx0X3R5cGUgX19yZXR1cm5fdmFsdWU7CisJICBpZiAoaXNfaW50ZWdyYWw8X0VuZ2luZV9yZXN1bHRfdHlwZT46OnZhbHVlCisJICAgICAgJiYgaXNfaW50ZWdyYWw8cmVzdWx0X3R5cGU+Ojp2YWx1ZSkKKwkgICAgX19yZXR1cm5fdmFsdWUgPSBfTV9nLT5tYXgoKTsKKwkgIGVsc2UgaWYgKCFpc19pbnRlZ3JhbDxyZXN1bHRfdHlwZT46OnZhbHVlKQorCSAgICBfX3JldHVybl92YWx1ZSA9IHJlc3VsdF90eXBlKDEpOworCSAgZWxzZQorCSAgICBfX3JldHVybl92YWx1ZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKSAtIDE7CisJICByZXR1cm4gX19yZXR1cm5fdmFsdWU7CisJfQorCisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKCkKKwl7CisJICByZXN1bHRfdHlwZSBfX3JldHVybl92YWx1ZTsKKwkgIGlmIChpc19pbnRlZ3JhbDxfRW5naW5lX3Jlc3VsdF90eXBlPjo6dmFsdWUKKwkgICAgICAmJiBpc19pbnRlZ3JhbDxyZXN1bHRfdHlwZT46OnZhbHVlKQorCSAgICBfX3JldHVybl92YWx1ZSA9ICgqX01fZykoKTsKKwkgIGVsc2UgaWYgKCFpc19pbnRlZ3JhbDxfRW5naW5lX3Jlc3VsdF90eXBlPjo6dmFsdWUKKwkJICAgJiYgIWlzX2ludGVncmFsPHJlc3VsdF90eXBlPjo6dmFsdWUpCisJICAgIF9fcmV0dXJuX3ZhbHVlID0gcmVzdWx0X3R5cGUoKCpfTV9nKSgpIC0gX01fZy0+bWluKCkpCisJICAgICAgLyByZXN1bHRfdHlwZShfTV9nLT5tYXgoKSAtIF9NX2ctPm1pbigpKTsKKwkgIGVsc2UgaWYgKGlzX2ludGVncmFsPF9FbmdpbmVfcmVzdWx0X3R5cGU+Ojp2YWx1ZQorCQkgICAmJiAhaXNfaW50ZWdyYWw8cmVzdWx0X3R5cGU+Ojp2YWx1ZSkKKwkgICAgX19yZXR1cm5fdmFsdWUgPSByZXN1bHRfdHlwZSgoKl9NX2cpKCkgLSBfTV9nLT5taW4oKSkKKwkgICAgICAvIHJlc3VsdF90eXBlKF9NX2ctPm1heCgpIC0gX01fZy0+bWluKCkgKyByZXN1bHRfdHlwZSgxKSk7CisJICBlbHNlCisJICAgIF9fcmV0dXJuX3ZhbHVlID0gKCgoKCpfTV9nKSgpIC0gX01fZy0+bWluKCkpIAorCQkJICAgICAgIC8gKF9NX2ctPm1heCgpIC0gX01fZy0+bWluKCkpKQorCQkJICAgICAgKiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCkpOworCSAgcmV0dXJuIF9fcmV0dXJuX3ZhbHVlOworCX0KKworICAgICAgcHJpdmF0ZToKKwlfRW5naW5lKiBfTV9nOworICAgICAgfTsKKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2UgX19kZXRhaWwKKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogUHJvZHVjZXMgcmFuZG9tIG51bWJlcnMgb24gYSBnaXZlbiBkaXN0cmlidXRpb24gZnVuY3Rpb24gdXNpbmcgYQorICAgKiBub24tdW5pZm9ybSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gZW5naW5lLgorICAgKgorICAgKiBAdG9kbyB0aGUgZW5naW5lX3ZhbHVlX3R5cGUgbmVlZHMgdG8gYmUgc3R1ZGllZCBtb3JlIGNhcmVmdWxseS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9FbmdpbmUsIHR5cGVuYW1lIF9EaXN0PgorICAgIGNsYXNzIHZhcmlhdGVfZ2VuZXJhdG9yCisgICAgeworICAgICAgLy8gQ29uY2VwdCByZXF1aXJlbWVudHMuCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX0VuZ2luZSwgX0NvcHlDb25zdHJ1Y3RpYmxlQ29uY2VwdCkKKyAgICAgIC8vICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX0VuZ2luZSwgX0VuZ2luZUNvbmNlcHQpCisgICAgICAvLyAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9EaXN0LCBfRW5naW5lQ29uY2VwdCkKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0VuZ2luZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lX3R5cGU7CisgICAgICB0eXBlZGVmIF9fZGV0YWlsOjpfQWRhcHRvcjxfRW5naW5lLCBfRGlzdD4gICAgIGVuZ2luZV92YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfRGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb25fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Rpc3Q6OnJlc3VsdF90eXBlICAgICAgICAgICAgcmVzdWx0X3R5cGU7CisKKyAgICAgIC8vIHRyMTo1LjEuMSB0YWJsZSA1LjEgcmVxdWlyZW1lbnQKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjwKKwlpc19hcml0aG1ldGljPHJlc3VsdF90eXBlPjo6dmFsdWUsIHJlc3VsdF90eXBlPjo6X190eXBlIF9Jc1ZhbGlkVHlwZTsKKworICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgdmFyaWF0ZSBnZW5lcmF0b3Igd2l0aCB0aGUgdW5pZm9ybSByYW5kb20gbnVtYmVyCisgICAgICAgKiBnZW5lcmF0b3IgQHAgX19lbmcgZm9yIHRoZSByYW5kb20gZGlzdHJpYnV0aW9uIEBwIF9fZGlzdC4KKyAgICAgICAqCisgICAgICAgKiBAdGhyb3dzIEFueSBleGNlcHRpb25zIHdoaWNoIG1heSB0aHJvd24gYnkgdGhlIGNvcHkgY29uc3RydWN0b3JzIG9mCisgICAgICAgKiB0aGUgQHAgX0VuZ2luZSBvciBAcCBfRGlzdCBvYmplY3RzLgorICAgICAgICovCisgICAgICB2YXJpYXRlX2dlbmVyYXRvcihlbmdpbmVfdHlwZSBfX2VuZywgZGlzdHJpYnV0aW9uX3R5cGUgX19kaXN0KQorICAgICAgOiBfTV9lbmdpbmUoX19lbmcpLCBfTV9kaXN0KF9fZGlzdCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgbmV4dCBnZW5lcmF0ZWQgdmFsdWUgb24gdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoKQorICAgICAgeyByZXR1cm4gX01fZGlzdChfTV9lbmdpbmUpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogV1RGPworICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIHJlc3VsdF90eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX1RwIF9fdmFsdWUpCisgICAgICAgIHsgcmV0dXJuIF9NX2Rpc3QoX01fZW5naW5lLCBfX3ZhbHVlKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgYSByZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgdW5pZm9ybSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogb2JqZWN0LgorICAgICAgICovCisgICAgICBlbmdpbmVfdmFsdWVfdHlwZSYKKyAgICAgIGVuZ2luZSgpCisgICAgICB7IHJldHVybiBfTV9lbmdpbmU7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIHVuaWZvcm0gcmFuZG9tIG51bWJlcgorICAgICAgICogZ2VuZXJhdG9yIG9iamVjdC4KKyAgICAgICAqLworICAgICAgY29uc3QgZW5naW5lX3ZhbHVlX3R5cGUmCisgICAgICBlbmdpbmUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZW5naW5lOyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyByYW5kb20gZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBkaXN0cmlidXRpb25fdHlwZSYKKyAgICAgIGRpc3RyaWJ1dGlvbigpCisgICAgICB7IHJldHVybiBfTV9kaXN0OyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyByYW5kb20gZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBjb25zdCBkaXN0cmlidXRpb25fdHlwZSYKKyAgICAgIGRpc3RyaWJ1dGlvbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kaXN0OyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgY2xvc2VkIGxvd2VyIGJvdW5kIG9mIHRoZSBkaXN0cmlidXRpb24gaW50ZXJ2YWwuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZGlzdHJpYnV0aW9uKCkubWluKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBjbG9zZWQgdXBwZXIgYm91bmQgb2YgdGhlIGRpc3RyaWJ1dGlvbiBpbnRlcnZhbC4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kaXN0cmlidXRpb24oKS5tYXgoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGVuZ2luZV92YWx1ZV90eXBlIF9NX2VuZ2luZTsKKyAgICAgIGRpc3RyaWJ1dGlvbl90eXBlIF9NX2Rpc3Q7CisgICAgfTsKKworCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCB0cjFfcmFuZG9tX2dlbmVyYXRvcnMgUmFuZG9tIE51bWJlciBHZW5lcmF0b3JzCisgICAqIEBpbmdyb3VwIHRyMV9yYW5kb20KKyAgICoKKyAgICogVGhlc2UgY2xhc3NlcyBkZWZpbmUgb2JqZWN0cyB3aGljaCBwcm92aWRlIHJhbmRvbSBvciBwc2V1ZG9yYW5kb20KKyAgICogbnVtYmVycywgZWl0aGVyIGZyb20gYSBkaXNjcmV0ZSBvciBhIGNvbnRpbnVvdXMgaW50ZXJ2YWwuICBUaGUKKyAgICogcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igc3VwcGxpZWQgYXMgYSBwYXJ0IG9mIHRoaXMgbGlicmFyeSBhcmUKKyAgICogYWxsIHVuaWZvcm0gcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzIHdoaWNoIHByb3ZpZGUgYSBzZXF1ZW5jZSBvZgorICAgKiByYW5kb20gbnVtYmVyIHVuaWZvcm1seSBkaXN0cmlidXRlZCBvdmVyIHRoZWlyIHJhbmdlLgorICAgKgorICAgKiBBIG51bWJlciBnZW5lcmF0b3IgaXMgYSBmdW5jdGlvbiBvYmplY3Qgd2l0aCBhbiBvcGVyYXRvcigpIHRoYXQKKyAgICogdGFrZXMgemVybyBhcmd1bWVudHMgYW5kIHJldHVybnMgYSBudW1iZXIuCisgICAqCisgICAqIEEgY29tcGxpYW50IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG11c3Qgc2F0aXNmeSB0aGUgZm9sbG93aW5nCisgICAqIHJlcXVpcmVtZW50cy4gIDx0YWJsZSBib3JkZXI9MSBjZWxscGFkZGluZz0xMCBjZWxsc3BhY2luZz0wPgorICAgKiA8Y2FwdGlvbiBhbGlnbj10b3A+UmFuZG9tIE51bWJlciBHZW5lcmF0b3IgUmVxdWlyZW1lbnRzPC9jYXB0aW9uPgorICAgKiA8dHI+PHRkPlRvIGJlIGRvY3VtZW50ZWQuPC90ZD48L3RyPiA8L3RhYmxlPgorICAgKiAKKyAgICogQHsKKyAgICovCisKKyAgLyoqCisgICAqIEBicmllZiBBIG1vZGVsIG9mIGEgbGluZWFyIGNvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICoKKyAgICogQSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB0aGF0IHByb2R1Y2VzIHBzZXVkb3JhbmRvbSBudW1iZXJzIHVzaW5nIHRoZQorICAgKiBsaW5lYXIgZnVuY3Rpb24gQGYkeF97aSsxfVxsZWZ0YXJyb3coYXhfe2l9ICsgYykgXGJtb2QgbSBAZiQuCisgICAqCisgICAqIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgQHAgX1VJbnRUeXBlIG11c3QgYmUgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZQorICAgKiBsYXJnZSBlbm91Z2ggdG8gc3RvcmUgdmFsdWVzIHVwIHRvIChfX20tMSkuIElmIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIKKyAgICogQHAgX19tIGlzIDAsIHRoZSBtb2R1bHVzIEBwIF9fbSB1c2VkIGlzCisgICAqIHN0ZDo6bnVtZXJpY19saW1pdHM8X1VJbnRUeXBlPjo6bWF4KCkgcGx1cyAxLiBPdGhlcndpc2UsIHRoZSB0ZW1wbGF0ZQorICAgKiBwYXJhbWV0ZXJzIEBwIF9fYSBhbmQgQHAgX19jIG11c3QgYmUgbGVzcyB0aGFuIEBwIF9fbS4KKyAgICoKKyAgICogVGhlIHNpemUgb2YgdGhlIHN0YXRlIGlzIEBmJCAxIEBmJC4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbT4KKyAgICBjbGFzcyBsaW5lYXJfY29uZ3J1ZW50aWFsCisgICAgeworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9VSW50VHlwZSwgX1Vuc2lnbmVkSW50ZWdlckNvbmNlcHQpCisgICAgICAvLyAgX19nbGliY3BwX2NsYXNzX3JlcXVpcmVzKF9fYSA8IF9fbSAmJiBfX2MgPCBfX20pCisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIGdlbmVyYXRlZCByYW5kb20gdmFsdWUuICovCisgICAgICB0eXBlZGVmIF9VSW50VHlwZSByZXN1bHRfdHlwZTsKKworICAgICAgLyoqIFRoZSBtdWx0aXBsaWVyLiAqLworICAgICAgc3RhdGljIGNvbnN0IF9VSW50VHlwZSBtdWx0aXBsaWVyID0gX19hOworICAgICAgLyoqIEFuIGluY3JlbWVudC4gKi8KKyAgICAgIHN0YXRpYyBjb25zdCBfVUludFR5cGUgaW5jcmVtZW50ID0gX19jOworICAgICAgLyoqIFRoZSBtb2R1bHVzLiAqLworICAgICAgc3RhdGljIGNvbnN0IF9VSW50VHlwZSBtb2R1bHVzID0gX19tOworCisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSAlbGluZWFyX2NvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUgd2l0aAorICAgICAgICogc2VlZCBAcCBfX3MuICBUaGUgZGVmYXVsdCBzZWVkIHZhbHVlIGlzIDEuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcyBUaGUgaW5pdGlhbCBzZWVkIHZhbHVlLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgbGluZWFyX2NvbmdydWVudGlhbCh1bnNpZ25lZCBsb25nIF9feDAgPSAxKQorICAgICAgeyB0aGlzLT5zZWVkKF9feDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhICVsaW5lYXJfY29uZ3J1ZW50aWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZQorICAgICAgICogc2VlZGVkIGZyb20gdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBAcCBfX2cuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fZyBUaGUgc2VlZCBnZW5lcmF0b3IgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICAgIGxpbmVhcl9jb25ncnVlbnRpYWwoX0dlbiYgX19nKQorICAgICAgICB7IHRoaXMtPnNlZWQoX19nKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIFJlc2VlZHMgdGhlICVsaW5lYXJfY29uZ3J1ZW50aWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZQorICAgICAgICogc2VxdWVuY2UgdG8gdGhlIHNlZWQgQGcgX19zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX3MgVGhlIG5ldyBzZWVkLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzZWVkKHVuc2lnbmVkIGxvbmcgX19zID0gMSk7CisKKyAgICAgIC8qKgorICAgICAgICogUmVzZWVkcyB0aGUgJWxpbmVhcl9jb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lCisgICAgICAgKiBzZXF1ZW5jZSB1c2luZyB2YWx1ZXMgZnJvbSB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uIEBwIF9fZy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19nIHRoZSBzZWVkIGdlbmVyYXRvciBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0dlbj4KKyAgICAgICAgdm9pZAorICAgICAgICBzZWVkKF9HZW4mIF9fZykKKyAgICAgICAgeyBzZWVkKF9fZywgdHlwZW5hbWUgaXNfZnVuZGFtZW50YWw8X0dlbj46OnR5cGUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSB2YWx1ZSBpbiB0aGUgb3V0cHV0IHJhbmdlLgorICAgICAgICoKKyAgICAgICAqIFRoZSBtaW5pbXVtIGRlcGVuZHMgb24gdGhlIEBwIF9fYyBwYXJhbWV0ZXI6IGlmIGl0IGlzIHplcm8sIHRoZQorICAgICAgICogbWluaW11bSBnZW5lcmF0ZWQgbXVzdCBiZSA+IDAsIG90aGVyd2lzZSAwIGlzIGFsbG93ZWQuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gKF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIDEsIDAsIF9fbT4oX19jKSA9PSAwKSA/IDEgOiAwOyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgbGFyZ2VzdCBwb3NzaWJsZSB2YWx1ZSBpbiB0aGUgb3V0cHV0IHJhbmdlLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fbSAtIDE7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBuZXh0IHJhbmRvbSBudW1iZXIgaW4gdGhlIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKSgpOworCisgICAgICAvKioKKyAgICAgICAqIENvbXBhcmVzIHR3byBsaW5lYXIgY29uZ3J1ZW50aWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgZm9yIGVxdWFsaXR5LgorICAgICAgICogIAorICAgICAgICogQHBhcmFtIF9fbGhzIEEgbGluZWFyIGNvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3QuCisgICAgICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciBsaW5lYXIgY29uZ3J1ZW50aWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iai4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0d28gb2JqZWN0cyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgbGluZWFyX2NvbmdydWVudGlhbCYgX19saHMsCisJCSBjb25zdCBsaW5lYXJfY29uZ3J1ZW50aWFsJiBfX3JocykKKyAgICAgIHsgcmV0dXJuIF9fbGhzLl9NX3ggPT0gX19yaHMuX01feDsgfQorCisgICAgICAvKioKKyAgICAgICAqIENvbXBhcmVzIHR3byBsaW5lYXIgY29uZ3J1ZW50aWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgZm9yIGluZXF1YWxpdHkuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fbGhzIEEgbGluZWFyIGNvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3QuCisgICAgICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciBsaW5lYXIgY29uZ3J1ZW50aWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iai4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0d28gb2JqZWN0cyBhcmUgbm90IGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IGxpbmVhcl9jb25ncnVlbnRpYWwmIF9fbGhzLAorCQkgY29uc3QgbGluZWFyX2NvbmdydWVudGlhbCYgX19yaHMpCisgICAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIFdyaXRlcyB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RhdGUgeChpKSBvZiB4IHRvIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgIFRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9fbGNyIEEgJSBsaW5lYXJfY29uZ3J1ZW50aWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICogQHJldHVybnMgX19vcy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlMSwgX1VJbnRUeXBlMSBfX2ExLCBfVUludFR5cGUxIF9fYzEsCisJICAgICAgIF9VSW50VHlwZTEgX19tMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IGxpbmVhcl9jb25ncnVlbnRpYWw8X1VJbnRUeXBlMSwgX19hMSwgX19jMSwKKwkJICAgX19tMT4mIF9fbGNyKTsKKworICAgICAgLyoqCisgICAgICAgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgZW5naW5lIGJ5IHJlYWRpbmcgaXRzIHRleHR1YWwKKyAgICAgICAqIHJlcHJlc2VudGF0aW9uIGZyb20gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBUaGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IHdyaXR0ZW4gdXNpbmcgYW4KKyAgICAgICAqIG91dHB1dCBzdHJlYW0gd2hvc2UgaW1idWVkIGxvY2FsZSBhbmQgd2hvc2UgdHlwZSdzIHRlbXBsYXRlCisgICAgICAgKiBzcGVjaWFsaXphdGlvbiBhcmd1bWVudHMgX0NoYXJUIGFuZCBfVHJhaXRzIHdlcmUgdGhlIHNhbWUgYXMgdGhvc2Ugb2YKKyAgICAgICAqIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgIFRoZSBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX19sY3IgQSAlIGxpbmVhcl9jb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAgICAgKiBAcmV0dXJucyBfX2lzLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUxLCBfVUludFR5cGUxIF9fYTEsIF9VSW50VHlwZTEgX19jMSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX20xLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgbGluZWFyX2NvbmdydWVudGlhbDxfVUludFR5cGUxLCBfX2ExLCBfX2MxLCBfX20xPiYgX19sY3IpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICAgIHZvaWQKKyAgICAgICAgc2VlZChfR2VuJiBfX2csIHRydWVfdHlwZSkKKyAgICAgICAgeyByZXR1cm4gc2VlZChzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihfX2cpKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgICB2b2lkCisgICAgICAgIHNlZWQoX0dlbiYgX19nLCBmYWxzZV90eXBlKTsKKworICAgICAgX1VJbnRUeXBlIF9NX3g7CisgICAgfTsKKworICAvKioKKyAgICogVGhlIGNsYXNzaWMgTWluaW11bSBTdGFuZGFyZCByYW5kMCBvZiBMZXdpcywgR29vZG1hbiwgYW5kIE1pbGxlci4KKyAgICovCisgIHR5cGVkZWYgbGluZWFyX2NvbmdydWVudGlhbDx1bnNpZ25lZCBsb25nLCAxNjgwNywgMCwgMjE0NzQ4MzY0Nz4gbWluc3RkX3JhbmQwOworCisgIC8qKgorICAgKiBBbiBhbHRlcm5hdGl2ZSBMQ1IgKExlaG1lciBHZW5lcmF0b3IgZnVuY3Rpb24pIC4KKyAgICovCisgIHR5cGVkZWYgbGluZWFyX2NvbmdydWVudGlhbDx1bnNpZ25lZCBsb25nLCA0ODI3MSwgMCwgMjE0NzQ4MzY0Nz4gbWluc3RkX3JhbmQ7CisKKworICAvKioKKyAgICogQSBnZW5lcmFsaXplZCBmZWVkYmFjayBzaGlmdCByZWdpc3RlciBkaXNjcmV0ZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICoKKyAgICogVGhpcyBhbGdvcml0aG0gYXZvaWRzIG11bHRpcGxpY2F0aW9uIGFuZCBkaXZpc2lvbiBhbmQgaXMgZGVzaWduZWQgdG8gYmUKKyAgICogZnJpZW5kbHkgdG8gYSBwaXBlbGluZWQgYXJjaGl0ZWN0dXJlLiAgSWYgdGhlIHBhcmFtZXRlcnMgYXJlIGNob3NlbgorICAgKiBjb3JyZWN0bHksIHRoaXMgZ2VuZXJhdG9yIHdpbGwgcHJvZHVjZSBudW1iZXJzIHdpdGggYSB2ZXJ5IGxvbmcgcGVyaW9kIGFuZAorICAgKiBmYWlybHkgZ29vZCBhcHBhcmVudCBlbnRyb3B5LCBhbHRob3VnaCBzdGlsbCBub3QgY3J5cHRvZ3JhcGhpY2FsbHkgc3Ryb25nLgorICAgKgorICAgKiBUaGUgYmVzdCB3YXkgdG8gdXNlIHRoaXMgZ2VuZXJhdG9yIGlzIHdpdGggdGhlIHByZWRlZmluZWQgbXQxOTkzNyBjbGFzcy4KKyAgICoKKyAgICogVGhpcyBhbGdvcml0aG0gd2FzIG9yaWdpbmFsbHkgaW52ZW50ZWQgYnkgTWFrb3RvIE1hdHN1bW90byBhbmQKKyAgICogVGFrdWppIE5pc2hpbXVyYS4KKyAgICoKKyAgICogQHZhciB3b3JkX3NpemUgICBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gZWFjaCBlbGVtZW50IG9mIHRoZSBzdGF0ZSB2ZWN0b3IuCisgICAqIEB2YXIgc3RhdGVfc2l6ZSAgVGhlIGRlZ3JlZSBvZiByZWN1cnNpb24uCisgICAqIEB2YXIgc2hpZnRfc2l6ZSAgVGhlIHBlcmlvZCBwYXJhbWV0ZXIuCisgICAqIEB2YXIgbWFza19iaXRzICAgVGhlIHNlcGFyYXRpb24gcG9pbnQgYml0IGluZGV4LgorICAgKiBAdmFyIHBhcmFtZXRlcl9hIFRoZSBsYXN0IHJvdyBvZiB0aGUgdHdpc3QgbWF0cml4LgorICAgKiBAdmFyIG91dHB1dF91ICAgIFRoZSBmaXJzdCByaWdodC1zaGlmdCB0ZW1wZXJpbmcgbWF0cml4IHBhcmFtZXRlci4KKyAgICogQHZhciBvdXRwdXRfcyAgICBUaGUgZmlyc3QgbGVmdC1zaGlmdCB0ZW1wZXJpbmcgbWF0cml4IHBhcmFtZXRlci4KKyAgICogQHZhciBvdXRwdXRfYiAgICBUaGUgZmlyc3QgbGVmdC1zaGlmdCB0ZW1wZXJpbmcgbWF0cml4IG1hc2suCisgICAqIEB2YXIgb3V0cHV0X3QgICAgVGhlIHNlY29uZCBsZWZ0LXNoaWZ0IHRlbXBlcmluZyBtYXRyaXggcGFyYW1ldGVyLgorICAgKiBAdmFyIG91dHB1dF9jICAgIFRoZSBzZWNvbmQgbGVmdC1zaGlmdCB0ZW1wZXJpbmcgbWF0cml4IG1hc2suCisgICAqIEB2YXIgb3V0cHV0X2wgICAgVGhlIHNlY29uZCByaWdodC1zaGlmdCB0ZW1wZXJpbmcgbWF0cml4IHBhcmFtZXRlci4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgaW50IF9fdywgaW50IF9fbiwgaW50IF9fbSwgaW50IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBpbnQgX191LCBpbnQgX19zLCBfVUludFR5cGUgX19iLCBpbnQgX190LAorCSAgIF9VSW50VHlwZSBfX2MsIGludCBfX2w+CisgICAgY2xhc3MgbWVyc2VubmVfdHdpc3RlcgorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfVUludFR5cGUsIF9VbnNpZ25lZEludGVnZXJDb25jZXB0KQorCisgICAgcHVibGljOgorICAgICAgLy8gdHlwZXMKKyAgICAgIHR5cGVkZWYgX1VJbnRUeXBlIHJlc3VsdF90eXBlOworCisgICAgICAvLyBwYXJhbWV0ZXIgdmFsdWVzCisgICAgICBzdGF0aWMgY29uc3QgaW50ICAgICAgIHdvcmRfc2l6ZSAgID0gX193OworICAgICAgc3RhdGljIGNvbnN0IGludCAgICAgICBzdGF0ZV9zaXplICA9IF9fbjsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICAgc2hpZnRfc2l6ZSAgPSBfX207CisgICAgICBzdGF0aWMgY29uc3QgaW50ICAgICAgIG1hc2tfYml0cyAgID0gX19yOworICAgICAgc3RhdGljIGNvbnN0IF9VSW50VHlwZSBwYXJhbWV0ZXJfYSA9IF9fYTsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICAgb3V0cHV0X3UgICAgPSBfX3U7CisgICAgICBzdGF0aWMgY29uc3QgaW50ICAgICAgIG91dHB1dF9zICAgID0gX19zOworICAgICAgc3RhdGljIGNvbnN0IF9VSW50VHlwZSBvdXRwdXRfYiAgICA9IF9fYjsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICAgb3V0cHV0X3QgICAgPSBfX3Q7CisgICAgICBzdGF0aWMgY29uc3QgX1VJbnRUeXBlIG91dHB1dF9jICAgID0gX19jOworICAgICAgc3RhdGljIGNvbnN0IGludCAgICAgICBvdXRwdXRfbCAgICA9IF9fbDsKKworICAgICAgLy8gY29uc3RydWN0b3JzIGFuZCBtZW1iZXIgZnVuY3Rpb24KKyAgICAgIG1lcnNlbm5lX3R3aXN0ZXIoKQorICAgICAgeyBzZWVkKCk7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIG1lcnNlbm5lX3R3aXN0ZXIodW5zaWduZWQgbG9uZyBfX3ZhbHVlKQorICAgICAgeyBzZWVkKF9fdmFsdWUpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICAgIG1lcnNlbm5lX3R3aXN0ZXIoX0dlbiYgX19nKQorICAgICAgICB7IHNlZWQoX19nKTsgfQorCisgICAgICB2b2lkCisgICAgICBzZWVkKCkKKyAgICAgIHsgc2VlZCg1NDg5VUwpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHNlZWQodW5zaWduZWQgbG9uZyBfX3ZhbHVlKTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0dlbj4KKyAgICAgICAgdm9pZAorICAgICAgICBzZWVkKF9HZW4mIF9fZykKKyAgICAgICAgeyBzZWVkKF9fZywgdHlwZW5hbWUgaXNfZnVuZGFtZW50YWw8X0dlbj46OnR5cGUoKSk7IH0KKworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiAwOyB9OworCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCBfX3c+OjpfX3ZhbHVlIC0gMTsgfQorCisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKSgpOworCisgICAgICAvKioKKyAgICAgICAqIENvbXBhcmVzIHR3byAlIG1lcnNlbm5lX3R3aXN0ZXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0cyBvZgorICAgICAgICogdGhlIHNhbWUgdHlwZSBmb3IgZXF1YWxpdHkuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fbGhzIEEgJSBtZXJzZW5uZV90d2lzdGVyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICAgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICUgbWVyc2VubmVfdHdpc3RlciByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0d28gb2JqZWN0cyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgbWVyc2VubmVfdHdpc3RlciYgX19saHMsCisJCSBjb25zdCBtZXJzZW5uZV90d2lzdGVyJiBfX3JocykKKyAgICAgIHsgcmV0dXJuIHN0ZDo6ZXF1YWwoX19saHMuX01feCwgX19saHMuX01feCArIHN0YXRlX3NpemUsIF9fcmhzLl9NX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQ29tcGFyZXMgdHdvICUgbWVyc2VubmVfdHdpc3RlciByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3RzIG9mCisgICAgICAgKiB0aGUgc2FtZSB0eXBlIGZvciBpbmVxdWFsaXR5LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2xocyBBICUgbWVyc2VubmVfdHdpc3RlciByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3QuCisgICAgICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAlIG1lcnNlbm5lX3R3aXN0ZXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIG5vdCBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBtZXJzZW5uZV90d2lzdGVyJiBfX2xocywKKwkJIGNvbnN0IG1lcnNlbm5lX3R3aXN0ZXImIF9fcmhzKQorICAgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBJbnNlcnRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgJSBtZXJzZW5uZV90d2lzdGVyIHJhbmRvbSBudW1iZXIKKyAgICAgICAqIGdlbmVyYXRvciBlbmdpbmUgQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlIG1lcnNlbm5lX3R3aXN0ZXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZTEsIGludCBfX3cxLCBpbnQgX19uMSwgaW50IF9fbTEsIGludCBfX3IxLAorCSAgICAgICBfVUludFR5cGUxIF9fYTEsIGludCBfX3UxLCBpbnQgX19zMSwgX1VJbnRUeXBlMSBfX2IxLCBpbnQgX190MSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX2MxLCBpbnQgX19sMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IG1lcnNlbm5lX3R3aXN0ZXI8X1VJbnRUeXBlMSwgX193MSwgX19uMSwgX19tMSwgX19yMSwKKwkJICAgX19hMSwgX191MSwgX19zMSwgX19iMSwgX190MSwgX19jMSwgX19sMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogRXh0cmFjdHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAlIG1lcnNlbm5lX3R3aXN0ZXIgcmFuZG9tIG51bWJlcgorICAgICAgICogZ2VuZXJhdG9yIGVuZ2luZSBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlIG1lcnNlbm5lX3R3aXN0ZXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGV4dHJhY3RlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZTEsIGludCBfX3cxLCBpbnQgX19uMSwgaW50IF9fbTEsIGludCBfX3IxLAorCSAgICAgICBfVUludFR5cGUxIF9fYTEsIGludCBfX3UxLCBpbnQgX19zMSwgX1VJbnRUeXBlMSBfX2IxLCBpbnQgX190MSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX2MxLCBpbnQgX19sMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIG1lcnNlbm5lX3R3aXN0ZXI8X1VJbnRUeXBlMSwgX193MSwgX19uMSwgX19tMSwgX19yMSwKKwkJICAgX19hMSwgX191MSwgX19zMSwgX19iMSwgX190MSwgX19jMSwgX19sMT4mIF9feCk7CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0dlbj4KKyAgICAgICAgdm9pZAorICAgICAgICBzZWVkKF9HZW4mIF9fZywgdHJ1ZV90eXBlKQorICAgICAgICB7IHJldHVybiBzZWVkKHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KF9fZykpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICAgIHZvaWQKKyAgICAgICAgc2VlZChfR2VuJiBfX2csIGZhbHNlX3R5cGUpOworCisgICAgICBfVUludFR5cGUgX01feFtzdGF0ZV9zaXplXTsKKyAgICAgIGludCAgICAgICBfTV9wOworICAgIH07CisKKyAgLyoqCisgICAqIFRoZSBjbGFzc2ljIE1lcnNlbm5lIFR3aXN0ZXIuCisgICAqCisgICAqIFJlZmVyZW5jZToKKyAgICogTS4gTWF0c3Vtb3RvIGFuZCBULiBOaXNoaW11cmEsIE1lcnNlbm5lIFR3aXN0ZXI6IEEgNjIzLURpbWVuc2lvbmFsbHkKKyAgICogRXF1aWRpc3RyaWJ1dGVkIFVuaWZvcm0gUHNldWRvLVJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yLCBBQ00gVHJhbnNhY3Rpb25zCisgICAqIG9uIE1vZGVsaW5nIGFuZCBDb21wdXRlciBTaW11bGF0aW9uLCBWb2wuIDgsIE5vLiAxLCBKYW51YXJ5IDE5OTgsIHBwIDMtMzAuCisgICAqLworICB0eXBlZGVmIG1lcnNlbm5lX3R3aXN0ZXI8CisgICAgdW5zaWduZWQgbG9uZywgMzIsIDYyNCwgMzk3LCAzMSwKKyAgICAweDk5MDhiMGRmdWwsIDExLCA3LAorICAgIDB4OWQyYzU2ODB1bCwgMTUsCisgICAgMHhlZmM2MDAwMHVsLCAxOAorICAgID4gbXQxOTkzNzsKKworCisgIC8qKgorICAgKiBAYnJpZWYgVGhlIE1hcnNhZ2xpYS1aYW1hbiBnZW5lcmF0b3IuCisgICAqIAorICAgKiBUaGlzIGlzIGEgbW9kZWwgb2YgYSBHZW5lcmFsaXplZCBGaWJvbmFjY2kgZGlzY3JldGUgcmFuZG9tIG51bWJlcgorICAgKiBnZW5lcmF0b3IsIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyB0aGUgU1dDIGdlbmVyYXRvci4KKyAgICoKKyAgICogQSBkaXNjcmV0ZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB0aGF0IHByb2R1Y2VzIHBzZXVkb3JhbmRvbQorICAgKiBudW1iZXJzIHVzaW5nIEBmJHhfe2l9XGxlZnRhcnJvdyh4X3tpIC0gc30gLSB4X3tpIC0gcn0gLQorICAgKiBjYXJyeV97aS0xfSkgXGJtb2QgbSBAZiQuCisgICAqCisgICAqIFRoZSBzaXplIG9mIHRoZSBzdGF0ZSBpcyBAZiQgciBAZiQKKyAgICogYW5kIHRoZSBtYXhpbXVtIHBlcmlvZCBvZiB0aGUgZ2VuZXJhdG9yIGlzIEBmJCBtXnIgLSBtXnMgLTEgQGYkLgorICAgKgorICAgKiBOMTY4OFs0LjEzXSBzYXlzIDxlbT50aGUgdGVtcGxhdGUgcGFyYW1ldGVyIF9JbnRUeXBlIHNoYWxsIGRlbm90ZQorICAgKiBhbiBpbnRlZ3JhbCB0eXBlIGxhcmdlIGVub3VnaCB0byBzdG9yZSB2YWx1ZXMgdXAgdG8gbTwvZW0+LgorICAgKgorICAgKiBAdmFyIF9NX3ggICAgIFRoZSBzdGF0ZSBvZiB0aGUgZ2VuZXJhdG9yLiAgVGhpcyBpcyBhIHJpbmcgYnVmZmVyLgorICAgKiBAdmFyIF9NX2NhcnJ5IFRoZSBjYXJyeS4KKyAgICogQHZhciBfTV9wICAgICBDdXJyZW50IGluZGV4IG9mIHgoaSAtIHIpLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIF9JbnRUeXBlIF9fbSwgaW50IF9fcywgaW50IF9fcj4KKyAgICBjbGFzcyBzdWJ0cmFjdF93aXRoX2NhcnJ5CisgICAgeworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9JbnRUeXBlLCBfSW50ZWdlckNvbmNlcHQpCisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIGdlbmVyYXRlZCByYW5kb20gdmFsdWUuICovCisgICAgICB0eXBlZGVmIF9JbnRUeXBlIHJlc3VsdF90eXBlOworICAgICAgCisgICAgICAvLyBwYXJhbWV0ZXIgdmFsdWVzCisgICAgICBzdGF0aWMgY29uc3QgX0ludFR5cGUgbW9kdWx1cyAgID0gX19tOworICAgICAgc3RhdGljIGNvbnN0IGludCAgICAgIGxvbmdfbGFnICA9IF9fcjsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICBzaG9ydF9sYWcgPSBfX3M7CisKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhIGRlZmF1bHQtaW5pdGlhbGl6ZWQgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5IHJhbmRvbSBudW1iZXIKKyAgICAgICAqIGdlbmVyYXRvci4KKyAgICAgICAqLworICAgICAgc3VidHJhY3Rfd2l0aF9jYXJyeSgpCisgICAgICB7IHRoaXMtPnNlZWQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYW4gZXhwbGljaXRseSBzZWVkZWQgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5IHJhbmRvbSBudW1iZXIKKyAgICAgICAqIGdlbmVyYXRvci4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHN1YnRyYWN0X3dpdGhfY2FycnkodW5zaWduZWQgbG9uZyBfX3ZhbHVlKQorICAgICAgeyB0aGlzLT5zZWVkKF9fdmFsdWUpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhICVzdWJ0cmFjdF93aXRoX2NhcnJ5IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZQorICAgICAgICogc2VlZGVkIGZyb20gdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBAcCBfX2cuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fZyBUaGUgc2VlZCBnZW5lcmF0b3IgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICAgIHN1YnRyYWN0X3dpdGhfY2FycnkoX0dlbiYgX19nKQorICAgICAgICB7IHRoaXMtPnNlZWQoX19nKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIFNlZWRzIHRoZSBpbml0aWFsIHN0YXRlIEBmJCB4XzAgQGYkIG9mIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICAgICAqCisgICAgICAgKiBOMTY4OFs0LjE5XSBtb2RpZmllcyB0aGlzIGFzIGZvbGxvd3MuICBJZiBAcCBfX3ZhbHVlID09IDAsCisgICAgICAgKiBzZXRzIHZhbHVlIHRvIDE5NzgwNTAzLiAgSW4gYW55IGNhc2UsIHdpdGggYSBsaW5lYXIKKyAgICAgICAqIGNvbmdydWVudGlhbCBnZW5lcmF0b3IgbGNnKGkpIGhhdmluZyBwYXJhbWV0ZXJzIEBmJCBtX3tsY2d9ID0KKyAgICAgICAqIDIxNDc0ODM1NjMsIGFfe2xjZ30gPSA0MDAxNCwgY197bGNnfSA9IDAsIGFuZCBsY2coMCkgPSB2YWx1ZQorICAgICAgICogQGYkLCBzZXRzIEBmJCB4X3stcn0gXGRvdHMgeF97LTF9IEBmJCB0byBAZiQgbGNnKDEpIFxibW9kIG0KKyAgICAgICAqIFxkb3RzIGxjZyhyKSBcYm1vZCBtIEBmJCByZXNwZWN0aXZlbHkuICBJZiBAZiQgeF97LTF9ID0gMCBAZiQKKyAgICAgICAqIHNldCBjYXJyeSB0byAxLCBvdGhlcndpc2Ugc2V0cyBjYXJyeSB0byAwLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzZWVkKHVuc2lnbmVkIGxvbmcgX192YWx1ZSA9IDE5NzgwNTAzKTsKKworICAgICAgLyoqCisgICAgICAgKiBTZWVkcyB0aGUgaW5pdGlhbCBzdGF0ZSBAZiQgeF8wIEBmJCBvZiB0aGUgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5CisgICAgICAgKiByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0dlbj4KKyAgICAgICAgdm9pZAorICAgICAgICBzZWVkKF9HZW4mIF9fZykKKyAgICAgICAgeyBzZWVkKF9fZywgdHlwZW5hbWUgaXNfZnVuZGFtZW50YWw8X0dlbj46OnR5cGUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBpbmNsdXNpdmUgbWluaW11bSB2YWx1ZSBvZiB0aGUgcmFuZ2Ugb2YgcmFuZG9tIGludGVnZXJzCisgICAgICAgKiByZXR1cm5lZCBieSB0aGlzIGdlbmVyYXRvci4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiAwOyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgaW5jbHVzaXZlIG1heGltdW0gdmFsdWUgb2YgdGhlIHJhbmdlIG9mIHJhbmRvbSBpbnRlZ2VycworICAgICAgICogcmV0dXJuZWQgYnkgdGhpcyBnZW5lcmF0b3IuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+bW9kdWx1cyAtIDE7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBuZXh0IHJhbmRvbSBudW1iZXIgaW4gdGhlIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKSgpOworCisgICAgICAvKioKKyAgICAgICAqIENvbXBhcmVzIHR3byAlIHN1YnRyYWN0X3dpdGhfY2FycnkgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0cyBvZgorICAgICAgICogdGhlIHNhbWUgdHlwZSBmb3IgZXF1YWxpdHkuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fbGhzIEEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICAgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICUgc3VidHJhY3Rfd2l0aF9jYXJyeSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0d28gb2JqZWN0cyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeSYgX19saHMsCisJCSBjb25zdCBzdWJ0cmFjdF93aXRoX2NhcnJ5JiBfX3JocykKKyAgICAgIHsgcmV0dXJuIHN0ZDo6ZXF1YWwoX19saHMuX01feCwgX19saHMuX01feCArIGxvbmdfbGFnLCBfX3Jocy5fTV94KTsgfQorCisgICAgICAvKioKKyAgICAgICAqIENvbXBhcmVzIHR3byAlIHN1YnRyYWN0X3dpdGhfY2FycnkgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0cyBvZgorICAgICAgICogdGhlIHNhbWUgdHlwZSBmb3IgaW5lcXVhbGl0eS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19saHMgQSAlIHN1YnRyYWN0X3dpdGhfY2FycnkgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0LgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHR3byBvYmplY3RzIGFyZSBub3QgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeSYgX19saHMsCisJCSBjb25zdCBzdWJ0cmFjdF93aXRoX2NhcnJ5JiBfX3JocykKKyAgICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogSW5zZXJ0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhICUgc3VidHJhY3Rfd2l0aF9jYXJyeSByYW5kb20gbnVtYmVyCisgICAgICAgKiBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZTEsIF9JbnRUeXBlMSBfX20xLCBpbnQgX19zMSwgaW50IF9fcjEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBzdWJ0cmFjdF93aXRoX2NhcnJ5PF9JbnRUeXBlMSwgX19tMSwgX19zMSwKKwkJICAgX19yMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogRXh0cmFjdHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAlIHN1YnRyYWN0X3dpdGhfY2FycnkgcmFuZG9tIG51bWJlcgorICAgICAgICogZ2VuZXJhdG9yIGVuZ2luZSBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlIHN1YnRyYWN0X3dpdGhfY2FycnkgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGV4dHJhY3RlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlMSwgX0ludFR5cGUxIF9fbTEsIGludCBfX3MxLCBpbnQgX19yMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIHN1YnRyYWN0X3dpdGhfY2Fycnk8X0ludFR5cGUxLCBfX20xLCBfX3MxLCBfX3IxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgICB2b2lkCisgICAgICAgIHNlZWQoX0dlbiYgX19nLCB0cnVlX3R5cGUpCisgICAgICAgIHsgcmV0dXJuIHNlZWQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oX19nKSk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0dlbj4KKyAgICAgICAgdm9pZAorICAgICAgICBzZWVkKF9HZW4mIF9fZywgZmFsc2VfdHlwZSk7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2FkZF91bnNpZ25lZDxfSW50VHlwZT46Ol9fdHlwZSBfVUludFR5cGU7CisKKyAgICAgIF9VSW50VHlwZSAgX01feFtsb25nX2xhZ107CisgICAgICBfVUludFR5cGUgIF9NX2NhcnJ5OworICAgICAgaW50ICAgICAgICBfTV9wOworICAgIH07CisKKworICAvKioKKyAgICogQGJyaWVmIFRoZSBNYXJzYWdsaWEtWmFtYW4gZ2VuZXJhdG9yIChmbG9hdHMgdmVyc2lvbikuCisgICAqCisgICAqIEB2YXIgX01feCAgICAgVGhlIHN0YXRlIG9mIHRoZSBnZW5lcmF0b3IuICBUaGlzIGlzIGEgcmluZyBidWZmZXIuCisgICAqIEB2YXIgX01fY2FycnkgVGhlIGNhcnJ5LgorICAgKiBAdmFyIF9NX3AgICAgIEN1cnJlbnQgaW5kZXggb2YgeChpIC0gcikuCisgICAqIEB2YXIgX01fbnBvd3MgUHJlY29tcHV0ZWQgbmVnYXRpdmUgcG93ZXJzIG9mIDIuICAgCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIGludCBfX3csIGludCBfX3MsIGludCBfX3I+CisgICAgY2xhc3Mgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIGdlbmVyYXRlZCByYW5kb20gdmFsdWUuICovCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIAorICAgICAgLy8gcGFyYW1ldGVyIHZhbHVlcworICAgICAgc3RhdGljIGNvbnN0IGludCAgICAgIHdvcmRfc2l6ZSA9IF9fdzsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICBsb25nX2xhZyAgPSBfX3I7CisgICAgICBzdGF0aWMgY29uc3QgaW50ICAgICAgc2hvcnRfbGFnID0gX19zOworCisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSBkZWZhdWx0LWluaXRpYWxpemVkICUgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMSByYW5kb20KKyAgICAgICAqIG51bWJlciBnZW5lcmF0b3IuCisgICAgICAgKi8KKyAgICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfMDEoKQorICAgICAgeworCXRoaXMtPnNlZWQoKTsKKwlfTV9pbml0aWFsaXplX25wb3dzKCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhbiBleHBsaWNpdGx5IHNlZWRlZCAlIHN1YnRyYWN0X3dpdGhfY2FycnlfMDEgcmFuZG9tIG51bWJlcgorICAgICAgICogZ2VuZXJhdG9yLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMSh1bnNpZ25lZCBsb25nIF9fdmFsdWUpCisgICAgICB7CisJdGhpcy0+c2VlZChfX3ZhbHVlKTsKKwlfTV9pbml0aWFsaXplX25wb3dzKCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhICUgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUKKyAgICAgICAqIHNlZWRlZCBmcm9tIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gQHAgX19nLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2cgVGhlIHNlZWQgZ2VuZXJhdG9yIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxKF9HZW4mIF9fZykKKyAgICAgICAgeworCSAgdGhpcy0+c2VlZChfX2cpOworCSAgX01faW5pdGlhbGl6ZV9ucG93cygpOwkgIAorCX0KKworICAgICAgLyoqCisgICAgICAgKiBTZWVkcyB0aGUgaW5pdGlhbCBzdGF0ZSBAZiQgeF8wIEBmJCBvZiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHNlZWQodW5zaWduZWQgbG9uZyBfX3ZhbHVlID0gMTk3ODA1MDMpOworCisgICAgICAvKioKKyAgICAgICAqIFNlZWRzIHRoZSBpbml0aWFsIHN0YXRlIEBmJCB4XzAgQGYkIG9mIHRoZSAlIHN1YnRyYWN0X3dpdGhfY2FycnlfMDEKKyAgICAgICAqIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgICB2b2lkCisgICAgICAgIHNlZWQoX0dlbiYgX19nKQorICAgICAgICB7IHNlZWQoX19nLCB0eXBlbmFtZSBpc19mdW5kYW1lbnRhbDxfR2VuPjo6dHlwZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIHJhbmdlIG9mIHJhbmRvbSBmbG9hdHMKKyAgICAgICAqIHJldHVybmVkIGJ5IHRoaXMgZ2VuZXJhdG9yLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIDAuMDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIHJhbmdlIG9mIHJhbmRvbSBmbG9hdHMKKyAgICAgICAqIHJldHVybmVkIGJ5IHRoaXMgZ2VuZXJhdG9yLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIDEuMDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIG5leHQgcmFuZG9tIG51bWJlciBpbiB0aGUgc2VxdWVuY2UuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBvcGVyYXRvcigpKCk7CisKKyAgICAgIC8qKgorICAgICAgICogQ29tcGFyZXMgdHdvICUgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3RzCisgICAgICAgKiBvZiB0aGUgc2FtZSB0eXBlIGZvciBlcXVhbGl0eS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19saHMgQSAlIHN1YnRyYWN0X3dpdGhfY2FycnlfMDEgcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICAgIGdlbmVyYXRvciBvYmplY3QuCisgICAgICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAlIHN1YnRyYWN0X3dpdGhfY2FycnlfMDEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfMDEmIF9fbGhzLAorCQkgY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMSYgX19yaHMpCisgICAgICB7CisJZm9yIChpbnQgX19pID0gMDsgX19pIDwgbG9uZ19sYWc7ICsrX19pKQorCSAgaWYgKCFzdGQ6OmVxdWFsKF9fbGhzLl9NX3hbX19pXSwgX19saHMuX01feFtfX2ldICsgX19uLAorCQkJICBfX3Jocy5fTV94W19faV0pKQorCSAgICByZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQ29tcGFyZXMgdHdvICUgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3RzCisgICAgICAgKiBvZiB0aGUgc2FtZSB0eXBlIGZvciBpbmVxdWFsaXR5LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2xocyBBICUgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMSByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgICAgICAgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAlIHN1YnRyYWN0X3dpdGhfY2FycnlfMDEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIG5vdCBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxJiBfX2xocywKKwkJIGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfMDEmIF9fcmhzKQorICAgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBJbnNlcnRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxIHJhbmRvbSBudW1iZXIKKyAgICAgICAqIGdlbmVyYXRvciBlbmdpbmUgQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlIHN1YnRyYWN0X3dpdGhfY2FycnlfMDEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIGludCBfX3cxLCBpbnQgX19zMSwgaW50IF9fcjEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxPF9SZWFsVHlwZTEsIF9fdzEsIF9fczEsCisJCSAgIF9fcjE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEV4dHJhY3RzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxIHJhbmRvbSBudW1iZXIKKyAgICAgICAqIGdlbmVyYXRvciBlbmdpbmUgQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCBpbnQgX193MSwgaW50IF9fczEsIGludCBfX3IxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMTxfUmVhbFR5cGUxLCBfX3cxLCBfX3MxLCBfX3IxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgICB2b2lkCisgICAgICAgIHNlZWQoX0dlbiYgX19nLCB0cnVlX3R5cGUpCisgICAgICAgIHsgcmV0dXJuIHNlZWQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oX19nKSk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0dlbj4KKyAgICAgICAgdm9pZAorICAgICAgICBzZWVkKF9HZW4mIF9fZywgZmFsc2VfdHlwZSk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luaXRpYWxpemVfbnBvd3MoKTsKKworICAgICAgc3RhdGljIGNvbnN0IGludCBfX24gPSAoX193ICsgMzEpIC8gMzI7CisKKyAgICAgIHR5cGVkZWYgX19kZXRhaWw6Ol9VSW50MzJUeXBlIF9VSW50MzJUeXBlOworICAgICAgX1VJbnQzMlR5cGUgIF9NX3hbbG9uZ19sYWddW19fbl07CisgICAgICBfUmVhbFR5cGUgICAgX01fbnBvd3NbX19uXTsKKyAgICAgIF9VSW50MzJUeXBlICBfTV9jYXJyeTsKKyAgICAgIGludCAgICAgICAgICBfTV9wOworICAgIH07CisKKyAgdHlwZWRlZiBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxPGZsb2F0LCAyNCwgMTAsIDI0PiAgIHJhbmx1eF9iYXNlXzAxOworCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gNTA4LiBCYWQgcGFyYW1ldGVycyBmb3IgcmFubHV4NjRfYmFzZV8wMS4KKyAgdHlwZWRlZiBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxPGRvdWJsZSwgNDgsIDUsIDEyPiByYW5sdXg2NF9iYXNlXzAxOyAgCisKKworICAvKioKKyAgICogUHJvZHVjZXMgcmFuZG9tIG51bWJlcnMgZnJvbSBzb21lIGJhc2UgZW5naW5lIGJ5IGRpc2NhcmRpbmcgYmxvY2tzIG9mCisgICAqIGRhdGEuCisgICAqCisgICAqIDAgPD0gQHAgX19yIDw9IEBwIF9fcAorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIGludCBfX3AsIGludCBfX3I+CisgICAgY2xhc3MgZGlzY2FyZF9ibG9jaworICAgIHsKKyAgICAgIC8vIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyh0eXBlbmFtZSBiYXNlX3R5cGU6OnJlc3VsdF90eXBlLAorICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIEFyaXRobWV0aWNUeXBlQ29uY2VwdCkKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgdW5kZXJseWluZyBnZW5lcmF0b3IgZW5naW5lLiAqLworICAgICAgdHlwZWRlZiBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciAgIGJhc2VfdHlwZTsKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSB2YWx1ZS4gKi8KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKKworICAgICAgLy8gcGFyYW1ldGVyIHZhbHVlcworICAgICAgc3RhdGljIGNvbnN0IGludCBibG9ja19zaXplID0gX19wOworICAgICAgc3RhdGljIGNvbnN0IGludCB1c2VkX2Jsb2NrID0gX19yOworCisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSBkZWZhdWx0ICVkaXNjYXJkX2Jsb2NrIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBUaGUgdW5kZXJseWluZyBlbmdpbmUgaXMgZGVmYXVsdCBjb25zdHJ1Y3RlZCBhcyB3ZWxsLgorICAgICAgICovCisgICAgICBkaXNjYXJkX2Jsb2NrKCkKKyAgICAgIDogX01fbigwKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBDb3B5IGNvbnN0cnVjdHMgYSAlZGlzY2FyZF9ibG9jayBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQ29waWVzIGFuIGV4aXN0aW5nIGJhc2UgY2xhc3MgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAgICAgKiBAcGFyYW0gcm5nIEFuIGV4aXN0aW5nIChiYXNlIGNsYXNzKSBlbmdpbmUgb2JqZWN0LgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgZGlzY2FyZF9ibG9jayhjb25zdCBiYXNlX3R5cGUmIF9fcm5nKQorICAgICAgOiBfTV9iKF9fcm5nKSwgX01fbigwKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBTZWVkIGNvbnN0cnVjdHMgYSAlZGlzY2FyZF9ibG9jayBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQ29uc3RydWN0cyB0aGUgdW5kZXJseWluZyBnZW5lcmF0b3IgZW5naW5lIHNlZWRlZCB3aXRoIEBwIF9fcy4KKyAgICAgICAqIEBwYXJhbSBfX3MgQSBzZWVkIHZhbHVlIGZvciB0aGUgYmFzZSBjbGFzcyBlbmdpbmUuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBkaXNjYXJkX2Jsb2NrKHVuc2lnbmVkIGxvbmcgX19zKQorICAgICAgOiBfTV9iKF9fcyksIF9NX24oMCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2VuZXJhdG9yIGNvbnN0cnVjdCBhICVkaXNjYXJkX2Jsb2NrIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19nIEEgc2VlZCBnZW5lcmF0b3IgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICAgIGRpc2NhcmRfYmxvY2soX0dlbiYgX19nKQorCTogX01fYihfX2cpLCBfTV9uKDApIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIFJlc2VlZHMgdGhlICVkaXNjYXJkX2Jsb2NrIG9iamVjdCB3aXRoIHRoZSBkZWZhdWx0IHNlZWQgZm9yIHRoZQorICAgICAgICogdW5kZXJseWluZyBiYXNlIGNsYXNzIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKi8KKyAgICAgIHZvaWQgc2VlZCgpCisgICAgICB7CisJX01fYi5zZWVkKCk7CisJX01fbiA9IDA7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogUmVzZWVkcyB0aGUgJWRpc2NhcmRfYmxvY2sgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHNlZWQgZ2VuZXJhdG9yCisgICAgICAgKiBmdW5jdGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX2cgQSBzZWVkIGdlbmVyYXRvciBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0dlbj4KKyAgICAgICAgdm9pZCBzZWVkKF9HZW4mIF9fZykKKyAgICAgICAgeworCSAgX01fYi5zZWVkKF9fZyk7CisJICBfTV9uID0gMDsKKwl9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBnZW5lcmF0b3IgZW5naW5lIG9iamVjdC4KKyAgICAgICAqLworICAgICAgY29uc3QgYmFzZV90eXBlJgorICAgICAgYmFzZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9iOyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgbWluaW11bSB2YWx1ZSBpbiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSBudW1iZXIgcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYi5taW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIG1heGltdW0gdmFsdWUgaW4gdGhlIGdlbmVyYXRlZCByYW5kb20gbnVtYmVyIHJhbmdlLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2IubWF4KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBuZXh0IHZhbHVlIGluIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIG51bWJlciBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoKTsKKworICAgICAgLyoqCisgICAgICAgKiBDb21wYXJlcyB0d28gJWRpc2NhcmRfYmxvY2sgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0cyBvZgorICAgICAgICogdGhlIHNhbWUgdHlwZSBmb3IgZXF1YWxpdHkuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fbGhzIEEgJWRpc2NhcmRfYmxvY2sgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0LgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgJWRpc2NhcmRfYmxvY2sgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGRpc2NhcmRfYmxvY2smIF9fbGhzLCBjb25zdCBkaXNjYXJkX2Jsb2NrJiBfX3JocykKKyAgICAgIHsgcmV0dXJuIChfX2xocy5fTV9iID09IF9fcmhzLl9NX2IpICYmIChfX2xocy5fTV9uID09IF9fcmhzLl9NX24pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQ29tcGFyZXMgdHdvICVkaXNjYXJkX2Jsb2NrIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdHMgb2YKKyAgICAgICAqIHRoZSBzYW1lIHR5cGUgZm9yIGluZXF1YWxpdHkuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fbGhzIEEgJWRpc2NhcmRfYmxvY2sgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0LgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgJWRpc2NhcmRfYmxvY2sgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIG5vdCBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBkaXNjYXJkX2Jsb2NrJiBfX2xocywgY29uc3QgZGlzY2FyZF9ibG9jayYgX19yaHMpCisgICAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEluc2VydHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAlZGlzY2FyZF9ibG9jayByYW5kb20gbnVtYmVyCisgICAgICAgKiBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWRpc2NhcmRfYmxvY2sgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwgaW50IF9fcDEsIGludCBfX3IxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3QgZGlzY2FyZF9ibG9jazxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEsCisJCSAgIF9fcDEsIF9fcjE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEV4dHJhY3RzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5IHJhbmRvbSBudW1iZXIKKyAgICAgICAqIGdlbmVyYXRvciBlbmdpbmUgQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWRpc2NhcmRfYmxvY2sgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGV4dHJhY3RlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwgaW50IF9fcDEsIGludCBfX3IxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgZGlzY2FyZF9ibG9jazxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEsCisJCSAgIF9fcDEsIF9fcjE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIGJhc2VfdHlwZSBfTV9iOworICAgICAgaW50ICAgICAgIF9NX247CisgICAgfTsKKworCisgIC8qKgorICAgKiBKYW1lcydzIGx1eHVyeS1sZXZlbC0zIGludGVnZXIgYWRhcHRhdGlvbiBvZiBMdWVzY2hlcidzIGdlbmVyYXRvci4KKyAgICovCisgIHR5cGVkZWYgZGlzY2FyZF9ibG9jazwKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5PHVuc2lnbmVkIGxvbmcsICgxVUwgPDwgMjQpLCAxMCwgMjQ+LAorICAgICAgMjIzLAorICAgICAgMjQKKyAgICAgID4gcmFubHV4MzsKKworICAvKioKKyAgICogSmFtZXMncyBsdXh1cnktbGV2ZWwtNCBpbnRlZ2VyIGFkYXB0YXRpb24gb2YgTHVlc2NoZXIncyBnZW5lcmF0b3IuCisgICAqLworICB0eXBlZGVmIGRpc2NhcmRfYmxvY2s8CisgICAgc3VidHJhY3Rfd2l0aF9jYXJyeTx1bnNpZ25lZCBsb25nLCAoMVVMIDw8IDI0KSwgMTAsIDI0PiwKKyAgICAgIDM4OSwKKyAgICAgIDI0CisgICAgICA+IHJhbmx1eDQ7CisKKyAgdHlwZWRlZiBkaXNjYXJkX2Jsb2NrPAorICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfMDE8ZmxvYXQsIDI0LCAxMCwgMjQ+LAorICAgICAgMjIzLAorICAgICAgMjQKKyAgICAgID4gcmFubHV4M18wMTsKKworICB0eXBlZGVmIGRpc2NhcmRfYmxvY2s8CisgICAgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMTxmbG9hdCwgMjQsIDEwLCAyND4sCisgICAgICAzODksCisgICAgICAyNAorICAgICAgPiByYW5sdXg0XzAxOworCisKKyAgLyoqCisgICAqIEEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgYWRhcHRvciBjbGFzcyB0aGF0IGNvbWJpbmVzIHR3byByYW5kb20gbnVtYmVyCisgICAqIGdlbmVyYXRvciBlbmdpbmVzIGludG8gYSBzaW5nbGUgb3V0cHV0IHNlcXVlbmNlLgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IxLCBpbnQgX19zMSwKKwkgICBjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjIsIGludCBfX3MyPgorICAgIGNsYXNzIHhvcl9jb21iaW5lCisgICAgeworICAgICAgLy8gX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMTo6CisgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X3R5cGUsIEFyaXRobWV0aWNUeXBlQ29uY2VwdCkKKyAgICAgIC8vIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyh0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjI6OgorICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF90eXBlLCBBcml0aG1ldGljVHlwZUNvbmNlcHQpCisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIGZpcnN0IHVuZGVybHlpbmcgZ2VuZXJhdG9yIGVuZ2luZS4gKi8KKyAgICAgIHR5cGVkZWYgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IxICAgYmFzZTFfdHlwZTsKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgc2Vjb25kIHVuZGVybHlpbmcgZ2VuZXJhdG9yIGVuZ2luZS4gKi8KKyAgICAgIHR5cGVkZWYgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyICAgYmFzZTJfdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2UxX3R5cGU6OnJlc3VsdF90eXBlIF9SZXN1bHRfdHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2UyX3R5cGU6OnJlc3VsdF90eXBlIF9SZXN1bHRfdHlwZTI7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIGdlbmVyYXRlZCByYW5kb20gdmFsdWUuICovCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19jb25kaXRpb25hbF90eXBlPChzaXplb2YoX1Jlc3VsdF90eXBlMSkKKwkJCQkJCSAgICAgID4gc2l6ZW9mKF9SZXN1bHRfdHlwZTIpKSwKKwlfUmVzdWx0X3R5cGUxLCBfUmVzdWx0X3R5cGUyPjo6X190eXBlIHJlc3VsdF90eXBlOworCisgICAgICAvLyBwYXJhbWV0ZXIgdmFsdWVzCisgICAgICBzdGF0aWMgY29uc3QgaW50IHNoaWZ0MSA9IF9fczE7CisgICAgICBzdGF0aWMgY29uc3QgaW50IHNoaWZ0MiA9IF9fczI7CisKKyAgICAgIC8vIGNvbnN0cnVjdG9ycyBhbmQgbWVtYmVyIGZ1bmN0aW9uCisgICAgICB4b3JfY29tYmluZSgpCisgICAgICA6IF9NX2IxKCksIF9NX2IyKCkJCisgICAgICB7IF9NX2luaXRpYWxpemVfbWF4KCk7IH0KKworICAgICAgeG9yX2NvbWJpbmUoY29uc3QgYmFzZTFfdHlwZSYgX19ybmcxLCBjb25zdCBiYXNlMl90eXBlJiBfX3JuZzIpCisgICAgICA6IF9NX2IxKF9fcm5nMSksIF9NX2IyKF9fcm5nMikKKyAgICAgIHsgX01faW5pdGlhbGl6ZV9tYXgoKTsgfQorCisgICAgICB4b3JfY29tYmluZSh1bnNpZ25lZCBsb25nIF9fcykKKyAgICAgIDogX01fYjEoX19zKSwgX01fYjIoX19zICsgMSkKKyAgICAgIHsgX01faW5pdGlhbGl6ZV9tYXgoKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgICB4b3JfY29tYmluZShfR2VuJiBfX2cpCisJOiBfTV9iMShfX2cpLCBfTV9iMihfX2cpCisgICAgICAgIHsgX01faW5pdGlhbGl6ZV9tYXgoKTsgfQorCisgICAgICB2b2lkCisgICAgICBzZWVkKCkKKyAgICAgIHsKKwlfTV9iMS5zZWVkKCk7CisJX01fYjIuc2VlZCgpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgICB2b2lkCisgICAgICAgIHNlZWQoX0dlbiYgX19nKQorICAgICAgICB7CisJICBfTV9iMS5zZWVkKF9fZyk7CisJICBfTV9iMi5zZWVkKF9fZyk7CisJfQorCisgICAgICBjb25zdCBiYXNlMV90eXBlJgorICAgICAgYmFzZTEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYjE7IH0KKworICAgICAgY29uc3QgYmFzZTJfdHlwZSYKKyAgICAgIGJhc2UyKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2IyOyB9CisKKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gMDsgfQorCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX21heDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIG5leHQgcmFuZG9tIG51bWJlciBpbiB0aGUgc2VxdWVuY2UuCisgICAgICAgKi8KKyAgICAgIC8vIE5COiBOb3QgZXhhY3RseSB0aGUgVFIxIGZvcm11bGEsIHBlciBOMjA3OSBpbnN0ZWFkLgorICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoKQorICAgICAgeworCXJldHVybiAoKHJlc3VsdF90eXBlKF9NX2IxKCkgLSBfTV9iMS5taW4oKSkgPDwgc2hpZnQxKQorCQleIChyZXN1bHRfdHlwZShfTV9iMigpIC0gX01fYjIubWluKCkpIDw8IHNoaWZ0MikpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIENvbXBhcmVzIHR3byAleG9yX2NvbWJpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0cyBvZgorICAgICAgICogdGhlIHNhbWUgdHlwZSBmb3IgZXF1YWxpdHkuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fbGhzIEEgJXhvcl9jb21iaW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICAgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICV4b3JfY29tYmluZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0d28gb2JqZWN0cyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgeG9yX2NvbWJpbmUmIF9fbGhzLCBjb25zdCB4b3JfY29tYmluZSYgX19yaHMpCisgICAgICB7CisJcmV0dXJuIChfX2xocy5iYXNlMSgpID09IF9fcmhzLmJhc2UxKCkpCisJICAgICAgICAmJiAoX19saHMuYmFzZTIoKSA9PSBfX3Jocy5iYXNlMigpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBDb21wYXJlcyB0d28gJXhvcl9jb21iaW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdHMgb2YKKyAgICAgICAqIHRoZSBzYW1lIHR5cGUgZm9yIGluZXF1YWxpdHkuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fbGhzIEEgJXhvcl9jb21iaW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICAgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICV4b3JfY29tYmluZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0d28gb2JqZWN0cyBhcmUgbm90IGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IHhvcl9jb21iaW5lJiBfX2xocywgY29uc3QgeG9yX2NvbWJpbmUmIF9fcmhzKQorICAgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBJbnNlcnRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgJXhvcl9jb21iaW5lIHJhbmRvbSBudW1iZXIKKyAgICAgICAqIGdlbmVyYXRvciBlbmdpbmUgQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAleG9yX2NvbWJpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMTEsIGludCBfX3MxMSwKKwkgICAgICAgY2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyMSwgaW50IF9fczIxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3QgeG9yX2NvbWJpbmU8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IxMSwgX19zMTEsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMjEsIF9fczIxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBFeHRyYWN0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhICV4b3JfY29tYmluZSByYW5kb20gbnVtYmVyCisgICAgICAgKiBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICV4b3JfY29tYmluZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggZXh0cmFjdGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IxMSwgaW50IF9fczExLAorCSAgICAgICBjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjIxLCBpbnQgX19zMjEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICB4b3JfY29tYmluZTxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjExLCBfX3MxMSwKKwkJICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyMSwgX19zMjE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luaXRpYWxpemVfbWF4KCk7CisKKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBfTV9pbml0aWFsaXplX21heF9hdXgocmVzdWx0X3R5cGUsIHJlc3VsdF90eXBlLCBpbnQpOworCisgICAgICBiYXNlMV90eXBlICBfTV9iMTsKKyAgICAgIGJhc2UyX3R5cGUgIF9NX2IyOworICAgICAgcmVzdWx0X3R5cGUgX01fbWF4OworICAgIH07CisKKworICAvKioKKyAgICogQSBzdGFuZGFyZCBpbnRlcmZhY2UgdG8gYSBwbGF0Zm9ybS1zcGVjaWZpYyBub24tZGV0ZXJtaW5pc3RpYworICAgKiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciAoaWYgYW55IGFyZSBhdmFpbGFibGUpLgorICAgKi8KKyAgY2xhc3MgcmFuZG9tX2RldmljZQorICB7CisgIHB1YmxpYzoKKyAgICAvLyB0eXBlcworICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IHJlc3VsdF90eXBlOworCisgICAgLy8gY29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycyBhbmQgbWVtYmVyIGZ1bmN0aW9ucworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1JBTkRPTV9UUjEKKworICAgIGV4cGxpY2l0CisgICAgcmFuZG9tX2RldmljZShjb25zdCBzdGQ6OnN0cmluZyYgX190b2tlbiA9ICIvZGV2L3VyYW5kb20iKQorICAgIHsKKyAgICAgIGlmICgoX190b2tlbiAhPSAiL2Rldi91cmFuZG9tIiAmJiBfX3Rva2VuICE9ICIvZGV2L3JhbmRvbSIpCisJICB8fCAhKF9NX2ZpbGUgPSBzdGQ6OmZvcGVuKF9fdG9rZW4uY19zdHIoKSwgInJiIikpKQorCXN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigicmFuZG9tX2RldmljZTo6IgorCQkJCSAgICAgICAicmFuZG9tX2RldmljZShjb25zdCBzdGQ6OnN0cmluZyYpIikpOworICAgIH0KKworICAgIH5yYW5kb21fZGV2aWNlKCkKKyAgICB7IHN0ZDo6ZmNsb3NlKF9NX2ZpbGUpOyB9CisKKyNlbHNlCisKKyAgICBleHBsaWNpdAorICAgIHJhbmRvbV9kZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIF9fdG9rZW4gPSAibXQxOTkzNyIpCisgICAgOiBfTV9tdChfTV9zdHJ0b3VsKF9fdG9rZW4pKSB7IH0KKworICBwcml2YXRlOgorICAgIHN0YXRpYyB1bnNpZ25lZCBsb25nCisgICAgX01fc3RydG91bChjb25zdCBzdGQ6OnN0cmluZyYgX19zdHIpCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBfX3JldCA9IDU0ODlVTDsKKyAgICAgIGlmIChfX3N0ciAhPSAibXQxOTkzNyIpCisJeworCSAgY29uc3QgY2hhciogX19ucHRyID0gX19zdHIuY19zdHIoKTsKKwkgIGNoYXIqIF9fZW5kcHRyOworCSAgX19yZXQgPSBzdGQ6OnN0cnRvdWwoX19ucHRyLCAmX19lbmRwdHIsIDApOworCSAgaWYgKCpfX25wdHIgPT0gJ1wwJyB8fCAqX19lbmRwdHIgIT0gJ1wwJykKKwkgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJyYW5kb21fZGV2aWNlOjpfTV9zdHJ0b3VsIgorCQkJCQkgICAiKGNvbnN0IHN0ZDo6c3RyaW5nJikiKSk7CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICBwdWJsaWM6CisKKyNlbmRpZgorCisgICAgcmVzdWx0X3R5cGUKKyAgICBtaW4oKSBjb25zdAorICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptaW4oKTsgfQorCisgICAgcmVzdWx0X3R5cGUKKyAgICBtYXgoKSBjb25zdAorICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgZG91YmxlCisgICAgZW50cm9weSgpIGNvbnN0CisgICAgeyByZXR1cm4gMC4wOyB9CisKKyAgICByZXN1bHRfdHlwZQorICAgIG9wZXJhdG9yKCkoKQorICAgIHsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfUkFORE9NX1RSMQorICAgICAgcmVzdWx0X3R5cGUgX19yZXQ7CisgICAgICBzdGQ6OmZyZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KCZfX3JldCksIHNpemVvZihyZXN1bHRfdHlwZSksCisJCSAxLCBfTV9maWxlKTsKKyAgICAgIHJldHVybiBfX3JldDsKKyNlbHNlCisgICAgICByZXR1cm4gX01fbXQoKTsKKyNlbmRpZgorICAgIH0KKworICBwcml2YXRlOgorICAgIHJhbmRvbV9kZXZpY2UoY29uc3QgcmFuZG9tX2RldmljZSYpOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHJhbmRvbV9kZXZpY2UmKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9SQU5ET01fVFIxCisgICAgRklMRSogICAgICAgIF9NX2ZpbGU7CisjZWxzZQorICAgIG10MTk5MzcgICAgICBfTV9tdDsKKyNlbmRpZgorICB9OworCisgIC8qIEB9ICovIC8vIGdyb3VwIHRyMV9yYW5kb21fZ2VuZXJhdG9ycworCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCB0cjFfcmFuZG9tX2Rpc3RyaWJ1dGlvbnMgUmFuZG9tIE51bWJlciBEaXN0cmlidXRpb25zCisgICAqIEBpbmdyb3VwIHRyMV9yYW5kb20KKyAgICogQHsKKyAgICovCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIHRyMV9yYW5kb21fZGlzdHJpYnV0aW9uc19kaXNjcmV0ZSBEaXNjcmV0ZSBEaXN0cmlidXRpb25zCisgICAqIEBpbmdyb3VwIHRyMV9yYW5kb21fZGlzdHJpYnV0aW9ucworICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogQGJyaWVmIFVuaWZvcm0gZGlzY3JldGUgZGlzdHJpYnV0aW9uIGZvciByYW5kb20gbnVtYmVycy4KKyAgICogQSBkaXNjcmV0ZSByYW5kb20gZGlzdHJpYnV0aW9uIG9uIHRoZSByYW5nZSBAZiRbbWluLCBtYXhdQGYkIHdpdGggZXF1YWwKKyAgICogcHJvYmFiaWxpdHkgdGhyb3VnaG91dCB0aGUgcmFuZ2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSA9IGludD4KKyAgICBjbGFzcyB1bmlmb3JtX2ludAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfSW50VHlwZSwgX0ludGVnZXJDb25jZXB0KQorIAorICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVycyBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfSW50VHlwZSBpbnB1dF90eXBlOworICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfSW50VHlwZSByZXN1bHRfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHVuaWZvcm1faW50KF9JbnRUeXBlIF9fbWluID0gMCwgX0ludFR5cGUgX19tYXggPSA5KQorICAgICAgOiBfTV9taW4oX19taW4pLCBfTV9tYXgoX19tYXgpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX21pbiA8PSBfTV9tYXgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIGluY2x1c2l2ZSBsb3dlciBib3VuZCBvZiB0aGUgZGlzdHJpYnV0aW9uIHJhbmdlLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX21pbjsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIGluY2x1c2l2ZSB1cHBlciBib3VuZCBvZiB0aGUgZGlzdHJpYnV0aW9uIHJhbmdlLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX21heDsgfQorCisgICAgICAvKioKKyAgICAgICAqIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICoKKyAgICAgICAqIERvZXMgbm90aGluZyBmb3IgdGhlIHVuaWZvcm0gaW50ZWdlciBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyBhIHVuaWZvcm1seSBkaXN0cmlidXRlZCByYW5kb20gbnVtYmVyIGluIHRoZSByYW5nZQorICAgICAgICogQGYkKG1pbiwgbWF4KUBmJC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICAgIHJlc3VsdF90eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgICAgeworCSAgdHlwZWRlZiB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjo6cmVzdWx0X3R5cGUKKwkgICAgX1VSZXN1bHRfdHlwZTsKKwkgIHJldHVybiBfTV9jYWxsKF9fdXJuZywgX01fbWluLCBfTV9tYXgsCisJCQkgdHlwZW5hbWUgaXNfaW50ZWdyYWw8X1VSZXN1bHRfdHlwZT46OnR5cGUoKSk7CisJfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgYSB1bmlmb3JtIHJhbmRvbSBudW1iZXIgaW4gdGhlIHJhbmdlIEBmJFswLCBuKUBmJC4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGFpbWVkIGF0IHVzZSB3aXRoIHN0ZDo6cmFuZG9tX3NodWZmbGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsIHJlc3VsdF90eXBlIF9fbikKKyAgICAgICAgeworCSAgdHlwZWRlZiB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjo6cmVzdWx0X3R5cGUKKwkgICAgX1VSZXN1bHRfdHlwZTsKKwkgIHJldHVybiBfTV9jYWxsKF9fdXJuZywgMCwgX19uIC0gMSwKKwkJCSB0eXBlbmFtZSBpc19pbnRlZ3JhbDxfVVJlc3VsdF90eXBlPjo6dHlwZSgpKTsKKwl9CisKKyAgICAgIC8qKgorICAgICAgICogSW5zZXJ0cyBhICV1bmlmb3JtX2ludCByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbiBAcCBfX3ggaW50byB0aGUKKyAgICAgICAqIG91dHB1dCBzdHJlYW0gQHAgb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJXVuaWZvcm1faW50IHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IHVuaWZvcm1faW50PF9JbnRUeXBlMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogRXh0cmFjdHMgYSAldW5pZm9ybV9pbnQgcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICV1bmlmb3JtX2ludCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIHVuaWZvcm1faW50PF9JbnRUeXBlMT4mIF9feCk7CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICAgIHJlc3VsdF90eXBlCisgICAgICAgIF9NX2NhbGwoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJcmVzdWx0X3R5cGUgX19taW4sIHJlc3VsdF90eXBlIF9fbWF4LCB0cnVlX3R5cGUpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgX01fY2FsbChfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQlyZXN1bHRfdHlwZSBfX21pbiwgcmVzdWx0X3R5cGUgX19tYXgsIGZhbHNlX3R5cGUpCisgICAgICAgIHsKKwkgIHJldHVybiByZXN1bHRfdHlwZSgoX191cm5nKCkgLSBfX3VybmcubWluKCkpCisJCQkgICAgIC8gKF9fdXJuZy5tYXgoKSAtIF9fdXJuZy5taW4oKSkKKwkJCSAgICAgKiAoX19tYXggLSBfX21pbiArIDEpKSArIF9fbWluOworCX0KKworICAgICAgX0ludFR5cGUgX01fbWluOworICAgICAgX0ludFR5cGUgX01fbWF4OworICAgIH07CisKKworICAvKioKKyAgICogQGJyaWVmIEEgQmVybm91bGxpIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBHZW5lcmF0ZXMgYSBzZXF1ZW5jZSBvZiB0cnVlIGFuZCBmYWxzZSB2YWx1ZXMgd2l0aCBsaWtlbGlob29kIEBmJCBwIEBmJAorICAgKiB0aGF0IHRydWUgd2lsbCBjb21lIHVwIGFuZCBAZiQgKDEgLSBwKSBAZiQgdGhhdCBmYWxzZSB3aWxsIGFwcGVhci4KKyAgICovCisgIGNsYXNzIGJlcm5vdWxsaV9kaXN0cmlidXRpb24KKyAgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBpbnQgIGlucHV0X3R5cGU7CisgICAgdHlwZWRlZiBib29sIHJlc3VsdF90eXBlOworCisgIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgQmVybm91bGxpIGRpc3RyaWJ1dGlvbiB3aXRoIGxpa2VsaWhvb2QgQHAgcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBfX3AgIFtJTl0gIFRoZSBsaWtlbGlob29kIG9mIGEgdHJ1ZSByZXN1bHQgYmVpbmcgcmV0dXJuZWQuICBNdXN0CisgICAgICogYmUgaW4gdGhlIGludGVydmFsIEBmJCBbMCwgMV0gQGYkLgorICAgICAqLworICAgIGV4cGxpY2l0CisgICAgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbihkb3VibGUgX19wID0gMC41KQorICAgIDogX01fcChfX3ApCisgICAgeyAKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCgoX01fcCA+PSAwLjApICYmIChfTV9wIDw9IDEuMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIEBwIHAgcGFyYW1ldGVyIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICovCisgICAgZG91YmxlCisgICAgcCgpIGNvbnN0CisgICAgeyByZXR1cm4gX01fcDsgfQorCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICoKKyAgICAgKiBEb2VzIG5vdGhpbmcgZm9yIGEgQmVybm91bGxpIGRpc3RyaWJ1dGlvbi4KKyAgICAgKi8KKyAgICB2b2lkCisgICAgcmVzZXQoKSB7IH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG5leHQgdmFsdWUgaW4gdGhlIEJlcm5vdWxsaWFuIHNlcXVlbmNlLgorICAgICAqLworICAgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgIHsKKwlpZiAoKF9fdXJuZygpIC0gX191cm5nLm1pbigpKSA8IF9NX3AgKiAoX191cm5nLm1heCgpIC0gX191cm5nLm1pbigpKSkKKwkgIHJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydHMgYSAlYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAqIEBwYXJhbSBfX3ggIEEgJWJlcm5vdWxsaV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICBmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgY29uc3QgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiYgX194KTsKKworICAgIC8qKgorICAgICAqIEV4dHJhY3RzIGEgJWJlcm5vdWxsaV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICogQHBhcmFtIF9feCAgQSAlYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICoKKyAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICBmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiYgX194KQorICAgICAgeyByZXR1cm4gX19pcyA+PiBfX3guX01fcDsgfQorCisgIHByaXZhdGU6CisgICAgZG91YmxlIF9NX3A7CisgIH07CisKKworICAvKioKKyAgICogQGJyaWVmIEEgZGlzY3JldGUgZ2VvbWV0cmljIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIGdlb21ldHJpYyBwcm9iYWJpbGl0eSBtYXNzIGZ1bmN0aW9uIGlzIAorICAgKiBAZiQgcChpKSA9ICgxIC0gcClwXntpLTF9IEBmJCB3aGVyZSBAZiQgcCBAZiQgaXMgdGhlIHBhcmFtZXRlciBvZiB0aGUKKyAgICogZGlzdHJpYnV0aW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUgPSBpbnQsIHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcyBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVzCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSBpbnB1dF90eXBlOworICAgICAgdHlwZWRlZiBfSW50VHlwZSAgcmVzdWx0X3R5cGU7CisKKyAgICAgIC8vIGNvbnN0cnVjdG9ycyBhbmQgbWVtYmVyIGZ1bmN0aW9uCisgICAgICBleHBsaWNpdAorICAgICAgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbihjb25zdCBfUmVhbFR5cGUmIF9fcCA9IF9SZWFsVHlwZSgwLjUpKQorICAgICAgOiBfTV9wKF9fcCkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoKF9NX3AgPiAwLjApICYmIChfTV9wIDwgMS4wKSk7CisJX01faW5pdGlhbGl6ZSgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIGRpc3RyaWJ1dGlvbiBwYXJhbWV0ZXIgQHAgcC4KKyAgICAgICAqLworICAgICAgX1JlYWxUeXBlCisgICAgICBwKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3A7IH0KKworICAgICAgdm9pZAorICAgICAgcmVzZXQoKSB7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICAgIHJlc3VsdF90eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZyk7CisKKyAgICAgIC8qKgorICAgICAgICogSW5zZXJ0cyBhICVnZW9tZXRyaWNfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVnZW9tZXRyaWNfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlMSwgdHlwZW5hbWUgX1JlYWxUeXBlMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IGdlb21ldHJpY19kaXN0cmlidXRpb248X0ludFR5cGUxLCBfUmVhbFR5cGUxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBFeHRyYWN0cyBhICVnZW9tZXRyaWNfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uJiBfX3gpCisgICAgICAgIHsKKwkgIF9faXMgPj4gX194Ll9NX3A7CisJICBfX3guX01faW5pdGlhbGl6ZSgpOworCSAgcmV0dXJuIF9faXM7CisJfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luaXRpYWxpemUoKQorICAgICAgeyBfTV9sb2dfcCA9IHN0ZDo6bG9nKF9NX3ApOyB9CisKKyAgICAgIF9SZWFsVHlwZSBfTV9wOworICAgICAgX1JlYWxUeXBlIF9NX2xvZ19wOworICAgIH07CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgY2xhc3Mgbm9ybWFsX2Rpc3RyaWJ1dGlvbjsKKworICAvKioKKyAgICogQGJyaWVmIEEgZGlzY3JldGUgUG9pc3NvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBQb2lzc29uIHByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb24gaXMKKyAgICogQGYkIHAoaSkgPSBcZnJhY3ttZWFuXml9e2khfSBlXnstbWVhbn0gQGYkIHdoZXJlIEBmJCBtZWFuIEBmJCBpcyB0aGUKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSA9IGludCwgdHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIHBvaXNzb25fZGlzdHJpYnV0aW9uCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVzCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSBpbnB1dF90eXBlOworICAgICAgdHlwZWRlZiBfSW50VHlwZSAgcmVzdWx0X3R5cGU7CisKKyAgICAgIC8vIGNvbnN0cnVjdG9ycyBhbmQgbWVtYmVyIGZ1bmN0aW9uCisgICAgICBleHBsaWNpdAorICAgICAgcG9pc3Nvbl9kaXN0cmlidXRpb24oY29uc3QgX1JlYWxUeXBlJiBfX21lYW4gPSBfUmVhbFR5cGUoMSkpCisgICAgICA6IF9NX21lYW4oX19tZWFuKSwgX01fbmQoKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9tZWFuID4gMC4wKTsKKwlfTV9pbml0aWFsaXplKCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgZGlzdHJpYnV0aW9uIHBhcmFtZXRlciBAcCBtZWFuLgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIG1lYW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbWVhbjsgfQorCisgICAgICB2b2lkCisgICAgICByZXNldCgpCisgICAgICB7IF9NX25kLnJlc2V0KCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICAgIHJlc3VsdF90eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZyk7CisKKyAgICAgIC8qKgorICAgICAgICogSW5zZXJ0cyBhICVwb2lzc29uX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlcG9pc3Nvbl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUxLCB0eXBlbmFtZSBfUmVhbFR5cGUxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3QgcG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGUxLCBfUmVhbFR5cGUxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBFeHRyYWN0cyBhICVwb2lzc29uX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJXBvaXNzb25fZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUxLCB0eXBlbmFtZSBfUmVhbFR5cGUxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgcG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGUxLCBfUmVhbFR5cGUxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9pbml0aWFsaXplKCk7CisKKyAgICAgIC8vIE5COiBVbnVzZWQgd2hlbiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxIGlzIHVuZGVmaW5lZC4KKyAgICAgIG5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiBfTV9uZDsKKworICAgICAgX1JlYWxUeXBlIF9NX21lYW47CisKKyAgICAgIC8vIEhvc3RzIGVpdGhlciBsb2cobWVhbikgb3IgdGhlIHRocmVzaG9sZCBvZiB0aGUgc2ltcGxlIG1ldGhvZC4KKyAgICAgIF9SZWFsVHlwZSBfTV9sbV90aHI7CisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgICAgX1JlYWxUeXBlIF9NX2xmbSwgX01fc20sIF9NX2QsIF9NX3NjeCwgX01fMWN4LCBfTV9jMmIsIF9NX2NiOworI2VuZGlmCisgICAgfTsKKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBkaXNjcmV0ZSBiaW5vbWlhbCByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBiaW5vbWlhbCBwcm9iYWJpbGl0eSBtYXNzIGZ1bmN0aW9uIGlzIAorICAgKiBAZiQgcChpKSA9IFxiaW5vbXtufXtpfSBwXmkgKDEgLSBwKV57dCAtIGl9IEBmJCB3aGVyZSBAZiQgdCBAZiQKKyAgICogYW5kIEBmJCBwIEBmJCBhcmUgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlID0gaW50LCB0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MgYmlub21pYWxfZGlzdHJpYnV0aW9uCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVzCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSBpbnB1dF90eXBlOworICAgICAgdHlwZWRlZiBfSW50VHlwZSAgcmVzdWx0X3R5cGU7CisKKyAgICAgIC8vIGNvbnN0cnVjdG9ycyBhbmQgbWVtYmVyIGZ1bmN0aW9uCisgICAgICBleHBsaWNpdAorICAgICAgYmlub21pYWxfZGlzdHJpYnV0aW9uKF9JbnRUeXBlIF9fdCA9IDEsCisJCQkgICAgY29uc3QgX1JlYWxUeXBlJiBfX3AgPSBfUmVhbFR5cGUoMC41KSkKKyAgICAgIDogX01fdChfX3QpLCBfTV9wKF9fcCksIF9NX25kKCkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoKF9NX3QgPj0gMCkgJiYgKF9NX3AgPj0gMC4wKSAmJiAoX01fcCA8PSAxLjApKTsKKwlfTV9pbml0aWFsaXplKCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgZGlzdHJpYnV0aW9uIEBwIHQgcGFyYW1ldGVyLgorICAgICAgICovCisgICAgICBfSW50VHlwZQorICAgICAgdCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90OyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgZGlzdHJpYnV0aW9uIEBwIHAgcGFyYW1ldGVyLgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIHAoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcDsgfQorCisgICAgICB2b2lkCisgICAgICByZXNldCgpCisgICAgICB7IF9NX25kLnJlc2V0KCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICAgIHJlc3VsdF90eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZyk7CisKKyAgICAgIC8qKgorICAgICAgICogSW5zZXJ0cyBhICViaW5vbWlhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWJpbm9taWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZTEsIHR5cGVuYW1lIF9SZWFsVHlwZTEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUxLCBfUmVhbFR5cGUxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBFeHRyYWN0cyBhICViaW5vbWlhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICViaW5vbWlhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZTEsIHR5cGVuYW1lIF9SZWFsVHlwZTEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUxLCBfUmVhbFR5cGUxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9pbml0aWFsaXplKCk7CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBfTV93YWl0aW5nKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsIF9JbnRUeXBlIF9fdCk7CisKKyAgICAgIC8vIE5COiBVbnVzZWQgd2hlbiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxIGlzIHVuZGVmaW5lZC4KKyAgICAgIG5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiBfTV9uZDsKKworICAgICAgX1JlYWxUeXBlIF9NX3E7CisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgICAgX1JlYWxUeXBlIF9NX2QxLCBfTV9kMiwgX01fczEsIF9NX3MyLCBfTV9jLAorCSAgICAgICAgX01fYTEsIF9NX2ExMjMsIF9NX3MsIF9NX2xmLCBfTV9scDFwOworI2VuZGlmCisgICAgICBfUmVhbFR5cGUgX01fcDsKKyAgICAgIF9JbnRUeXBlICBfTV90OworCisgICAgICBib29sICAgICAgX01fZWFzeTsKKyAgICB9OworCisgIC8qIEB9ICovIC8vIGdyb3VwIHRyMV9yYW5kb21fZGlzdHJpYnV0aW9uc19kaXNjcmV0ZQorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCB0cjFfcmFuZG9tX2Rpc3RyaWJ1dGlvbnNfY29udGludW91cyBDb250aW51b3VzIERpc3RyaWJ1dGlvbnMKKyAgICogQGluZ3JvdXAgdHIxX3JhbmRvbV9kaXN0cmlidXRpb25zCisgICAqIEB7CisgICAqLworCisgIC8qKgorICAgKiBAYnJpZWYgVW5pZm9ybSBjb250aW51b3VzIGRpc3RyaWJ1dGlvbiBmb3IgcmFuZG9tIG51bWJlcnMuCisgICAqCisgICAqIEEgY29udGludW91cyByYW5kb20gZGlzdHJpYnV0aW9uIG9uIHRoZSByYW5nZSBbbWluLCBtYXgpIHdpdGggZXF1YWwKKyAgICogcHJvYmFiaWxpdHkgdGhyb3VnaG91dCB0aGUgcmFuZ2UuICBUaGUgVVJORyBzaG91bGQgYmUgcmVhbC12YWx1ZWQgYW5kCisgICAqIGRlbGl2ZXIgbnVtYmVyIGluIHRoZSByYW5nZSBbMCwgMSkuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MgdW5pZm9ybV9yZWFsCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVzCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSBpbnB1dF90eXBlOworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSB1bmlmb3JtX3JlYWwgb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX21pbiBbSU5dICBUaGUgbG93ZXIgYm91bmQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX21heCBbSU5dICBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHVuaWZvcm1fcmVhbChfUmVhbFR5cGUgX19taW4gPSBfUmVhbFR5cGUoMCksCisJCSAgIF9SZWFsVHlwZSBfX21heCA9IF9SZWFsVHlwZSgxKSkKKyAgICAgIDogX01fbWluKF9fbWluKSwgX01fbWF4KF9fbWF4KQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9taW4gPD0gX01fbWF4KTsKKyAgICAgIH0KKworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9taW47IH0KKworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9tYXg7IH0KKworICAgICAgdm9pZAorICAgICAgcmVzZXQoKSB7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICAgIHJlc3VsdF90eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgICAgeyByZXR1cm4gKF9fdXJuZygpICogKF9NX21heCAtIF9NX21pbikpICsgX01fbWluOyB9CisKKyAgICAgIC8qKgorICAgICAgICogSW5zZXJ0cyBhICV1bmlmb3JtX3JlYWwgcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24gQHAgX194IGludG8gdGhlCisgICAgICAgKiBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJXVuaWZvcm1fcmVhbCByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3QgdW5pZm9ybV9yZWFsPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEV4dHJhY3RzIGEgJXVuaWZvcm1fcmVhbCByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJXVuaWZvcm1fcmVhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICB1bmlmb3JtX3JlYWw8X1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICBwcml2YXRlOgorICAgICAgX1JlYWxUeXBlIF9NX21pbjsKKyAgICAgIF9SZWFsVHlwZSBfTV9tYXg7CisgICAgfTsKKworCisgIC8qKgorICAgKiBAYnJpZWYgQW4gZXhwb25lbnRpYWwgY29udGludW91cyBkaXN0cmlidXRpb24gZm9yIHJhbmRvbSBudW1iZXJzLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIGV4cG9uZW50aWFsIHByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb24gaXMgCisgICAqIEBmJCBwKHgpID0gXGxhbWJkYSBlXnstXGxhbWJkYSB4fSBAZiQuCisgICAqCisgICAqIDx0YWJsZSBib3JkZXI9MSBjZWxscGFkZGluZz0xMCBjZWxsc3BhY2luZz0wPgorICAgKiA8Y2FwdGlvbiBhbGlnbj10b3A+RGlzdHJpYnV0aW9uIFN0YXRpc3RpY3M8L2NhcHRpb24+CisgICAqIDx0cj48dGQ+TWVhbjwvdGQ+PHRkPkBmJCBcZnJhY3sxfXtcbGFtYmRhfSBAZiQ8L3RkPjwvdHI+CisgICAqIDx0cj48dGQ+TWVkaWFuPC90ZD48dGQ+QGYkIFxmcmFje1xsbiAyfXtcbGFtYmRhfSBAZiQ8L3RkPjwvdHI+CisgICAqIDx0cj48dGQ+TW9kZTwvdGQ+PHRkPkBmJCB6ZXJvIEBmJDwvdGQ+PC90cj4KKyAgICogPHRyPjx0ZD5SYW5nZTwvdGQ+PHRkPkBmJFswLCBcaW5mdHldQGYkPC90ZD48L3RyPgorICAgKiA8dHI+PHRkPlN0YW5kYXJkIERldmlhdGlvbjwvdGQ+PHRkPkBmJCBcZnJhY3sxfXtcbGFtYmRhfSBAZiQ8L3RkPjwvdHI+CisgICAqIDwvdGFibGU+CisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MgZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVzCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSBpbnB1dF90eXBlOworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYW4gZXhwb25lbnRpYWwgZGlzdHJpYnV0aW9uIHdpdGggaW52ZXJzZSBzY2FsZSBwYXJhbWV0ZXIKKyAgICAgICAqIEBmJCBcbGFtYmRhIEBmJC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbihjb25zdCByZXN1bHRfdHlwZSYgX19sYW1iZGEgPSByZXN1bHRfdHlwZSgxKSkKKyAgICAgIDogX01fbGFtYmRhKF9fbGFtYmRhKQorICAgICAgeyAKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fbGFtYmRhID4gMCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgaW52ZXJzZSBzY2FsZSBwYXJhbWV0ZXIgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgX1JlYWxUeXBlCisgICAgICBsYW1iZGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbGFtYmRhOyB9CisKKyAgICAgIC8qKgorICAgICAgICogUmVzZXRzIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogSGFzIG5vIGVmZmVjdCBvbiBleHBvbmVudGlhbCBkaXN0cmlidXRpb25zLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpIHsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgICB7IHJldHVybiAtc3RkOjpsb2coX191cm5nKCkpIC8gX01fbGFtYmRhOyB9CisKKyAgICAgIC8qKgorICAgICAgICogSW5zZXJ0cyBhICVleHBvbmVudGlhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3QgZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEV4dHJhY3RzIGEgJWV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggQSAlZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbiYgX194KQorICAgICAgICB7IHJldHVybiBfX2lzID4+IF9feC5fTV9sYW1iZGE7IH0KKworICAgIHByaXZhdGU6CisgICAgICByZXN1bHRfdHlwZSBfTV9sYW1iZGE7CisgICAgfTsKKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBub3JtYWwgY29udGludW91cyBkaXN0cmlidXRpb24gZm9yIHJhbmRvbSBudW1iZXJzLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIG5vcm1hbCBwcm9iYWJpbGl0eSBtYXNzIGZ1bmN0aW9uIGlzIAorICAgKiBAZiQgcCh4KSA9IFxmcmFjezF9e1xzaWdtYSBcc3FydHsyIFxwaX19IAorICAgKiAgICAgICAgICAgIGVeey0gXGZyYWN7e3ggLSBtZWFufV4gezJ9fXsyIFxzaWdtYSBeIHsyfX0gfSBAZiQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3Mgbm9ybWFsX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlcworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgaW5wdXRfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiB3aXRoIHBhcmFtZXRlcnMgQGYkIG1lYW4gQGYkIGFuZAorICAgICAgICogQGYkIFxzaWdtYSBAZiQuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBub3JtYWxfZGlzdHJpYnV0aW9uKGNvbnN0IHJlc3VsdF90eXBlJiBfX21lYW4gPSByZXN1bHRfdHlwZSgwKSwKKwkJCSAgY29uc3QgcmVzdWx0X3R5cGUmIF9fc2lnbWEgPSByZXN1bHRfdHlwZSgxKSkKKyAgICAgIDogX01fbWVhbihfX21lYW4pLCBfTV9zaWdtYShfX3NpZ21hKSwgX01fc2F2ZWRfYXZhaWxhYmxlKGZhbHNlKQorICAgICAgeyAKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fc2lnbWEgPiAwKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBtZWFuIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgbWVhbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9tZWFuOyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgQGYkIFxzaWdtYSBAZiQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgX1JlYWxUeXBlCisgICAgICBzaWdtYSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9zaWdtYTsgfQorCisgICAgICAvKioKKyAgICAgICAqIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpCisgICAgICB7IF9NX3NhdmVkX2F2YWlsYWJsZSA9IGZhbHNlOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpOworCisgICAgICAvKioKKyAgICAgICAqIEluc2VydHMgYSAlbm9ybWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlbm9ybWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3Qgbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBFeHRyYWN0cyBhICVub3JtYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlbm9ybWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHJlc3VsdF90eXBlIF9NX21lYW47CisgICAgICByZXN1bHRfdHlwZSBfTV9zaWdtYTsKKyAgICAgIHJlc3VsdF90eXBlIF9NX3NhdmVkOworICAgICAgYm9vbCAgICAgICAgX01fc2F2ZWRfYXZhaWxhYmxlOyAgICAgCisgICAgfTsKKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBnYW1tYSBjb250aW51b3VzIGRpc3RyaWJ1dGlvbiBmb3IgcmFuZG9tIG51bWJlcnMuCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgZ2FtbWEgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbiBpcyAKKyAgICogQGYkIHAoeCkgPSBcZnJhY3sxfXtcR2FtbWEoXGFscGhhKX0geF57XGFscGhhIC0gMX0gZV57LXh9IEBmJC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcyBnYW1tYV9kaXN0cmlidXRpb24KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gdHlwZXMKKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIGlucHV0X3R5cGU7CisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhIGdhbW1hIGRpc3RyaWJ1dGlvbiB3aXRoIHBhcmFtZXRlcnMgQGYkIFxhbHBoYSBAZiQuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBnYW1tYV9kaXN0cmlidXRpb24oY29uc3QgcmVzdWx0X3R5cGUmIF9fYWxwaGFfdmFsID0gcmVzdWx0X3R5cGUoMSkpCisgICAgICA6IF9NX2FscGhhKF9fYWxwaGFfdmFsKQorICAgICAgeyAKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fYWxwaGEgPiAwKTsKKwlfTV9pbml0aWFsaXplKCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgQGYkIFxhbHBoYSBAZiQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgX1JlYWxUeXBlCisgICAgICBhbHBoYSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9hbHBoYTsgfQorCisgICAgICAvKioKKyAgICAgICAqIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpIHsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKTsKKworICAgICAgLyoqCisgICAgICAgKiBJbnNlcnRzIGEgJWdhbW1hX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlZ2FtbWFfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBnYW1tYV9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogRXh0cmFjdHMgYSAlZ2FtbWFfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlZ2FtbWFfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIGdhbW1hX2Rpc3RyaWJ1dGlvbiYgX194KQorICAgICAgICB7CisJICBfX2lzID4+IF9feC5fTV9hbHBoYTsKKwkgIF9feC5fTV9pbml0aWFsaXplKCk7CisJICByZXR1cm4gX19pczsKKwl9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01faW5pdGlhbGl6ZSgpOworCisgICAgICByZXN1bHRfdHlwZSBfTV9hbHBoYTsKKworICAgICAgLy8gSG9zdHMgZWl0aGVyIGxhbWJkYSBvZiBHQiBvciBkIG9mIG1vZGlmaWVkIFZhZHV2YSdzLgorICAgICAgcmVzdWx0X3R5cGUgX01fbF9kOworICAgIH07CisKKyAgLyogQH0gKi8gLy8gZ3JvdXAgdHIxX3JhbmRvbV9kaXN0cmlidXRpb25zX2NvbnRpbnVvdXMKKyAgLyogQH0gKi8gLy8gZ3JvdXAgdHIxX3JhbmRvbV9kaXN0cmlidXRpb25zCisgIC8qIEB9ICovIC8vIGdyb3VwIHRyMV9yYW5kb20KK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX1JBTkRPTV9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9yYW5kb20udGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvcmFuZG9tLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWI0ZDRkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvcmFuZG9tLnRjYwpAQCAtMCwwICsxLDE3MjEgQEAKKy8vIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiAob3V0IG9mIGxpbmUpIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKworLyoqIEBmaWxlIHRyMS9yYW5kb20udGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dHIxL3JhbmRvbX0KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9SQU5ET01fVENDCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9SQU5ET01fVENDIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIC8qCisgICAqIChGdXJ0aGVyKSBpbXBsZW1lbnRhdGlvbi1zcGFjZSBkZXRhaWxzLgorICAgKi8KKyAgbmFtZXNwYWNlIF9fZGV0YWlsCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIC8vIEdlbmVyYWwgY2FzZSBmb3IgeCA9IChheCArIGMpIG1vZCBtIC0tIHVzZSBTY2hyYWdlJ3MgYWxnb3JpdGhtIHRvIGF2b2lkCisgICAgLy8gaW50ZWdlciBvdmVyZmxvdy4KKyAgICAvLworICAgIC8vIEJlY2F1c2UgYSBhbmQgYyBhcmUgY29tcGlsZS10aW1lIGludGVncmFsIGNvbnN0YW50cyB0aGUgY29tcGlsZXIga2luZGx5CisgICAgLy8gZWxpZGVzIGFueSB1bnJlYWNoYWJsZSBwYXRocy4KKyAgICAvLworICAgIC8vIFByZWNvbmRpdGlvbnM6ICBhID4gMCwgbSA+IDAuCisgICAgLy8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9UcCBfX2EsIF9UcCBfX2MsIF9UcCBfX20sIGJvb2w+CisgICAgICBzdHJ1Y3QgX01vZAorICAgICAgeworCXN0YXRpYyBfVHAKKwlfX2NhbGMoX1RwIF9feCkKKwl7CisJICBpZiAoX19hID09IDEpCisJICAgIF9feCAlPSBfX207CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzdGF0aWMgY29uc3QgX1RwIF9fcSA9IF9fbSAvIF9fYTsKKwkgICAgICBzdGF0aWMgY29uc3QgX1RwIF9fciA9IF9fbSAlIF9fYTsKKwkgICAgICAKKwkgICAgICBfVHAgX190MSA9IF9fYSAqIChfX3ggJSBfX3EpOworCSAgICAgIF9UcCBfX3QyID0gX19yICogKF9feCAvIF9fcSk7CisJICAgICAgaWYgKF9fdDEgPj0gX190MikKKwkJX194ID0gX190MSAtIF9fdDI7CisJICAgICAgZWxzZQorCQlfX3ggPSBfX20gLSBfX3QyICsgX190MTsKKwkgICAgfQorCisJICBpZiAoX19jICE9IDApCisJICAgIHsKKwkgICAgICBjb25zdCBfVHAgX19kID0gX19tIC0gX194OworCSAgICAgIGlmIChfX2QgPiBfX2MpCisJCV9feCArPSBfX2M7CisJICAgICAgZWxzZQorCQlfX3ggPSBfX2MgLSBfX2Q7CisJICAgIH0KKwkgIHJldHVybiBfX3g7CisJfQorICAgICAgfTsKKworICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgbSA9PSAwIC0tIHVzZSB1bnNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93IGFzIG1vZHVsbworICAgIC8vIG9wZXJhdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX1RwIF9fYSwgX1RwIF9fYywgX1RwIF9fbT4KKyAgICAgIHN0cnVjdCBfTW9kPF9UcCwgX19hLCBfX2MsIF9fbSwgdHJ1ZT4KKyAgICAgIHsKKwlzdGF0aWMgX1RwCisJX19jYWxjKF9UcCBfX3gpCisJeyByZXR1cm4gX19hICogX194ICsgX19jOyB9CisgICAgICB9OworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2UgX19kZXRhaWwKKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20+CisgICAgY29uc3QgX1VJbnRUeXBlCisgICAgbGluZWFyX2NvbmdydWVudGlhbDxfVUludFR5cGUsIF9fYSwgX19jLCBfX20+OjptdWx0aXBsaWVyOworCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbT4KKyAgICBjb25zdCBfVUludFR5cGUKKyAgICBsaW5lYXJfY29uZ3J1ZW50aWFsPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT46OmluY3JlbWVudDsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20+CisgICAgY29uc3QgX1VJbnRUeXBlCisgICAgbGluZWFyX2NvbmdydWVudGlhbDxfVUludFR5cGUsIF9fYSwgX19jLCBfX20+Ojptb2R1bHVzOworCisgIC8qKgorICAgKiBTZWVkcyB0aGUgTENSIHdpdGggaW50ZWdyYWwgdmFsdWUgQHAgX194MCwgYWRqdXN0ZWQgc28gdGhhdCB0aGUgCisgICAqIHJpbmcgaWRlbnRpdHkgaXMgbmV2ZXIgYSBtZW1iZXIgb2YgdGhlIGNvbnZlcmdlbmNlIHNldC4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbT4KKyAgICB2b2lkCisgICAgbGluZWFyX2NvbmdydWVudGlhbDxfVUludFR5cGUsIF9fYSwgX19jLCBfX20+OjoKKyAgICBzZWVkKHVuc2lnbmVkIGxvbmcgX194MCkKKyAgICB7CisgICAgICBpZiAoKF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIDEsIDAsIF9fbT4oX19jKSA9PSAwKQorCSAgJiYgKF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIDEsIDAsIF9fbT4oX194MCkgPT0gMCkpCisJX01feCA9IF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIDEsIDAsIF9fbT4oMSk7CisgICAgICBlbHNlCisJX01feCA9IF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIDEsIDAsIF9fbT4oX194MCk7CisgICAgfQorCisgIC8qKgorICAgKiBTZWVkcyB0aGUgTENSIGVuZ2luZSB3aXRoIGEgdmFsdWUgZ2VuZXJhdGVkIGJ5IEBwIF9fZy4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbT4KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgdm9pZAorICAgICAgbGluZWFyX2NvbmdydWVudGlhbDxfVUludFR5cGUsIF9fYSwgX19jLCBfX20+OjoKKyAgICAgIHNlZWQoX0dlbiYgX19nLCBmYWxzZV90eXBlKQorICAgICAgeworCV9VSW50VHlwZSBfX3gwID0gX19nKCk7CisJaWYgKChfX2RldGFpbDo6X19tb2Q8X1VJbnRUeXBlLCAxLCAwLCBfX20+KF9fYykgPT0gMCkKKwkgICAgJiYgKF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIDEsIDAsIF9fbT4oX194MCkgPT0gMCkpCisJICBfTV94ID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgMSwgMCwgX19tPigxKTsKKwllbHNlCisJICBfTV94ID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgMSwgMCwgX19tPihfX3gwKTsKKyAgICAgIH0KKworICAvKioKKyAgICogR2V0cyB0aGUgbmV4dCBnZW5lcmF0ZWQgdmFsdWUgaW4gc2VxdWVuY2UuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20+CisgICAgdHlwZW5hbWUgbGluZWFyX2NvbmdydWVudGlhbDxfVUludFR5cGUsIF9fYSwgX19jLCBfX20+OjpyZXN1bHRfdHlwZQorICAgIGxpbmVhcl9jb25ncnVlbnRpYWw8X1VJbnRUeXBlLCBfX2EsIF9fYywgX19tPjo6CisgICAgb3BlcmF0b3IoKSgpCisgICAgeworICAgICAgX01feCA9IF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIF9fYSwgX19jLCBfX20+KF9NX3gpOworICAgICAgcmV0dXJuIF9NX3g7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbSwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgbGluZWFyX2NvbmdydWVudGlhbDxfVUludFR5cGUsIF9fYSwgX19jLCBfX20+JiBfX2xjcikKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OmZpeGVkIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19vcy53aWRlbignICcpKTsKKworICAgICAgX19vcyA8PCBfX2xjci5fTV94OworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBsaW5lYXJfY29uZ3J1ZW50aWFsPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT4mIF9fbGNyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjKTsKKworICAgICAgX19pcyA+PiBfX2xjci5fTV94OworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfSAKKworCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgaW50IF9fdywgaW50IF9fbiwgaW50IF9fbSwgaW50IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBpbnQgX191LCBpbnQgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIGludCBfX3QsIF9VSW50VHlwZSBfX2MsIGludCBfX2w+CisgICAgY29uc3QgaW50CisgICAgbWVyc2VubmVfdHdpc3RlcjxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fcywKKwkJICAgICBfX2IsIF9fdCwgX19jLCBfX2w+Ojp3b3JkX3NpemU7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgaW50IF9fdCwgX1VJbnRUeXBlIF9fYywgaW50IF9fbD4KKyAgICBjb25zdCBpbnQKKyAgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19zLAorCQkgICAgIF9fYiwgX190LCBfX2MsIF9fbD46OnN0YXRlX3NpemU7CisgICAgCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgaW50IF9fdywgaW50IF9fbiwgaW50IF9fbSwgaW50IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBpbnQgX191LCBpbnQgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIGludCBfX3QsIF9VSW50VHlwZSBfX2MsIGludCBfX2w+CisgICAgY29uc3QgaW50CisgICAgbWVyc2VubmVfdHdpc3RlcjxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fcywKKwkJICAgICBfX2IsIF9fdCwgX19jLCBfX2w+OjpzaGlmdF9zaXplOworCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgaW50IF9fdywgaW50IF9fbiwgaW50IF9fbSwgaW50IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBpbnQgX191LCBpbnQgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIGludCBfX3QsIF9VSW50VHlwZSBfX2MsIGludCBfX2w+CisgICAgY29uc3QgaW50CisgICAgbWVyc2VubmVfdHdpc3RlcjxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fcywKKwkJICAgICBfX2IsIF9fdCwgX19jLCBfX2w+OjptYXNrX2JpdHM7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgaW50IF9fdCwgX1VJbnRUeXBlIF9fYywgaW50IF9fbD4KKyAgICBjb25zdCBfVUludFR5cGUKKyAgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19zLAorCQkgICAgIF9fYiwgX190LCBfX2MsIF9fbD46OnBhcmFtZXRlcl9hOworCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgaW50IF9fdywgaW50IF9fbiwgaW50IF9fbSwgaW50IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBpbnQgX191LCBpbnQgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIGludCBfX3QsIF9VSW50VHlwZSBfX2MsIGludCBfX2w+CisgICAgY29uc3QgaW50CisgICAgbWVyc2VubmVfdHdpc3RlcjxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fcywKKwkJICAgICBfX2IsIF9fdCwgX19jLCBfX2w+OjpvdXRwdXRfdTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIGludCBfX3csIGludCBfX24sIGludCBfX20sIGludCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgaW50IF9fdSwgaW50IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBpbnQgX190LCBfVUludFR5cGUgX19jLCBpbnQgX19sPgorICAgIGNvbnN0IGludAorICAgIG1lcnNlbm5lX3R3aXN0ZXI8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX3MsCisJCSAgICAgX19iLCBfX3QsIF9fYywgX19sPjo6b3V0cHV0X3M7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgaW50IF9fdCwgX1VJbnRUeXBlIF9fYywgaW50IF9fbD4KKyAgICBjb25zdCBfVUludFR5cGUKKyAgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19zLAorCQkgICAgIF9fYiwgX190LCBfX2MsIF9fbD46Om91dHB1dF9iOworCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgaW50IF9fdywgaW50IF9fbiwgaW50IF9fbSwgaW50IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBpbnQgX191LCBpbnQgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIGludCBfX3QsIF9VSW50VHlwZSBfX2MsIGludCBfX2w+CisgICAgY29uc3QgaW50CisgICAgbWVyc2VubmVfdHdpc3RlcjxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fcywKKwkJICAgICBfX2IsIF9fdCwgX19jLCBfX2w+OjpvdXRwdXRfdDsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIGludCBfX3csIGludCBfX24sIGludCBfX20sIGludCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgaW50IF9fdSwgaW50IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBpbnQgX190LCBfVUludFR5cGUgX19jLCBpbnQgX19sPgorICAgIGNvbnN0IF9VSW50VHlwZQorICAgIG1lcnNlbm5lX3R3aXN0ZXI8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX3MsCisJCSAgICAgX19iLCBfX3QsIF9fYywgX19sPjo6b3V0cHV0X2M7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgaW50IF9fdCwgX1VJbnRUeXBlIF9fYywgaW50IF9fbD4KKyAgICBjb25zdCBpbnQKKyAgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19zLAorCQkgICAgIF9fYiwgX190LCBfX2MsIF9fbD46Om91dHB1dF9sOworCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgaW50IF9fdywgaW50IF9fbiwgaW50IF9fbSwgaW50IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBpbnQgX191LCBpbnQgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIGludCBfX3QsIF9VSW50VHlwZSBfX2MsIGludCBfX2w+CisgICAgdm9pZAorICAgIG1lcnNlbm5lX3R3aXN0ZXI8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX3MsCisJCSAgICAgX19iLCBfX3QsIF9fYywgX19sPjo6CisgICAgc2VlZCh1bnNpZ25lZCBsb25nIF9fdmFsdWUpCisgICAgeworICAgICAgX01feFswXSA9IF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIDEsIDAsCisJX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIF9fdz46Ol9fdmFsdWU+KF9fdmFsdWUpOworCisgICAgICBmb3IgKGludCBfX2kgPSAxOyBfX2kgPCBzdGF0ZV9zaXplOyArK19faSkKKwl7CisJICBfVUludFR5cGUgX194ID0gX01feFtfX2kgLSAxXTsKKwkgIF9feCBePSBfX3ggPj4gKF9fdyAtIDIpOworCSAgX194ICo9IDE4MTI0MzMyNTN1bDsKKwkgIF9feCArPSBfX2k7CisJICBfTV94W19faV0gPSBfX2RldGFpbDo6X19tb2Q8X1VJbnRUeXBlLCAxLCAwLAorCSAgICBfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgX193Pjo6X192YWx1ZT4oX194KTsJICAKKwl9CisgICAgICBfTV9wID0gc3RhdGVfc2l6ZTsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgaW50IF9fdCwgX1VJbnRUeXBlIF9fYywgaW50IF9fbD4KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgdm9pZAorICAgICAgbWVyc2VubmVfdHdpc3RlcjxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fcywKKwkJICAgICAgIF9fYiwgX190LCBfX2MsIF9fbD46OgorICAgICAgc2VlZChfR2VuJiBfX2dlbiwgZmFsc2VfdHlwZSkKKyAgICAgIHsKKwlmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBzdGF0ZV9zaXplOyArK19faSkKKwkgIF9NX3hbX19pXSA9IF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIDEsIDAsCisJICAgIF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCBfX3c+OjpfX3ZhbHVlPihfX2dlbigpKTsKKwlfTV9wID0gc3RhdGVfc2l6ZTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIGludCBfX3csIGludCBfX24sIGludCBfX20sIGludCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgaW50IF9fdSwgaW50IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBpbnQgX190LCBfVUludFR5cGUgX19jLCBpbnQgX19sPgorICAgIHR5cGVuYW1lCisgICAgbWVyc2VubmVfdHdpc3RlcjxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fcywKKwkJICAgICBfX2IsIF9fdCwgX19jLCBfX2w+OjpyZXN1bHRfdHlwZQorICAgIG1lcnNlbm5lX3R3aXN0ZXI8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX3MsCisJCSAgICAgX19iLCBfX3QsIF9fYywgX19sPjo6CisgICAgb3BlcmF0b3IoKSgpCisgICAgeworICAgICAgLy8gUmVsb2FkIHRoZSB2ZWN0b3IgLSBjb3N0IGlzIE8obikgYW1vcnRpemVkIG92ZXIgbiBjYWxscy4KKyAgICAgIGlmIChfTV9wID49IHN0YXRlX3NpemUpCisJeworCSAgY29uc3QgX1VJbnRUeXBlIF9fdXBwZXJfbWFzayA9ICh+X1VJbnRUeXBlKCkpIDw8IF9fcjsKKwkgIGNvbnN0IF9VSW50VHlwZSBfX2xvd2VyX21hc2sgPSB+X191cHBlcl9tYXNrOworCisJICBmb3IgKGludCBfX2sgPSAwOyBfX2sgPCAoX19uIC0gX19tKTsgKytfX2spCisJICAgIHsKKwkgICAgICBfVUludFR5cGUgX195ID0gKChfTV94W19fa10gJiBfX3VwcGVyX21hc2spCisJCQkgICAgICAgfCAoX01feFtfX2sgKyAxXSAmIF9fbG93ZXJfbWFzaykpOworCSAgICAgIF9NX3hbX19rXSA9IChfTV94W19fayArIF9fbV0gXiAoX195ID4+IDEpCisJCQkgICBeICgoX195ICYgMHgwMSkgPyBfX2EgOiAwKSk7CisJICAgIH0KKworCSAgZm9yIChpbnQgX19rID0gKF9fbiAtIF9fbSk7IF9fayA8IChfX24gLSAxKTsgKytfX2spCisJICAgIHsKKwkgICAgICBfVUludFR5cGUgX195ID0gKChfTV94W19fa10gJiBfX3VwcGVyX21hc2spCisJCQkgICAgICAgfCAoX01feFtfX2sgKyAxXSAmIF9fbG93ZXJfbWFzaykpOworCSAgICAgIF9NX3hbX19rXSA9IChfTV94W19fayArIChfX20gLSBfX24pXSBeIChfX3kgPj4gMSkKKwkJCSAgIF4gKChfX3kgJiAweDAxKSA/IF9fYSA6IDApKTsKKwkgICAgfQorCisJICBfVUludFR5cGUgX195ID0gKChfTV94W19fbiAtIDFdICYgX191cHBlcl9tYXNrKQorCQkJICAgfCAoX01feFswXSAmIF9fbG93ZXJfbWFzaykpOworCSAgX01feFtfX24gLSAxXSA9IChfTV94W19fbSAtIDFdIF4gKF9feSA+PiAxKQorCQkJICAgXiAoKF9feSAmIDB4MDEpID8gX19hIDogMCkpOworCSAgX01fcCA9IDA7CisJfQorCisgICAgICAvLyBDYWxjdWxhdGUgbyh4KGkpKS4KKyAgICAgIHJlc3VsdF90eXBlIF9feiA9IF9NX3hbX01fcCsrXTsKKyAgICAgIF9feiBePSAoX196ID4+IF9fdSk7CisgICAgICBfX3ogXj0gKF9feiA8PCBfX3MpICYgX19iOworICAgICAgX196IF49IChfX3ogPDwgX190KSAmIF9fYzsKKyAgICAgIF9feiBePSAoX196ID4+IF9fbCk7CisKKyAgICAgIHJldHVybiBfX3o7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgaW50IF9fdywgaW50IF9fbiwgaW50IF9fbSwgaW50IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBpbnQgX191LCBpbnQgX19zLCBfVUludFR5cGUgX19iLCBpbnQgX190LAorCSAgIF9VSW50VHlwZSBfX2MsIGludCBfX2wsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IG1lcnNlbm5lX3R3aXN0ZXI8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLAorCSAgICAgICBfX3IsIF9fYSwgX191LCBfX3MsIF9fYiwgX190LCBfX2MsIF9fbD4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6Zml4ZWQgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKworICAgICAgZm9yIChpbnQgX19pID0gMDsgX19pIDwgX19uIC0gMTsgKytfX2kpCisJX19vcyA8PCBfX3guX01feFtfX2ldIDw8IF9fc3BhY2U7CisgICAgICBfX29zIDw8IF9feC5fTV94W19fbiAtIDFdOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsIF9VSW50VHlwZSBfX2IsIGludCBfX3QsCisJICAgX1VJbnRUeXBlIF9fYywgaW50IF9fbCwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgbWVyc2VubmVfdHdpc3RlcjxfVUludFR5cGUsIF9fdywgX19uLCBfX20sCisJICAgICAgIF9fciwgX19hLCBfX3UsIF9fcywgX19iLCBfX3QsIF9fYywgX19sPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgZm9yIChpbnQgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKwlfX2lzID4+IF9feC5fTV94W19faV07CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgX0ludFR5cGUgX19tLCBpbnQgX19zLCBpbnQgX19yPgorICAgIGNvbnN0IF9JbnRUeXBlCisgICAgc3VidHJhY3Rfd2l0aF9jYXJyeTxfSW50VHlwZSwgX19tLCBfX3MsIF9fcj46Om1vZHVsdXM7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIF9JbnRUeXBlIF9fbSwgaW50IF9fcywgaW50IF9fcj4KKyAgICBjb25zdCBpbnQKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5PF9JbnRUeXBlLCBfX20sIF9fcywgX19yPjo6bG9uZ19sYWc7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIF9JbnRUeXBlIF9fbSwgaW50IF9fcywgaW50IF9fcj4KKyAgICBjb25zdCBpbnQKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5PF9JbnRUeXBlLCBfX20sIF9fcywgX19yPjo6c2hvcnRfbGFnOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCBfSW50VHlwZSBfX20sIGludCBfX3MsIGludCBfX3I+CisgICAgdm9pZAorICAgIHN1YnRyYWN0X3dpdGhfY2Fycnk8X0ludFR5cGUsIF9fbSwgX19zLCBfX3I+OjoKKyAgICBzZWVkKHVuc2lnbmVkIGxvbmcgX192YWx1ZSkKKyAgICB7CisgICAgICBpZiAoX192YWx1ZSA9PSAwKQorCV9fdmFsdWUgPSAxOTc4MDUwMzsKKworICAgICAgc3RkOjp0cjE6OmxpbmVhcl9jb25ncnVlbnRpYWw8dW5zaWduZWQgbG9uZywgNDAwMTQsIDAsIDIxNDc0ODM1NjM+CisJX19sY2coX192YWx1ZSk7CisKKyAgICAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IGxvbmdfbGFnOyArK19faSkKKwlfTV94W19faV0gPSBfX2RldGFpbDo6X19tb2Q8X1VJbnRUeXBlLCAxLCAwLCBtb2R1bHVzPihfX2xjZygpKTsKKworICAgICAgX01fY2FycnkgPSAoX01feFtsb25nX2xhZyAtIDFdID09IDApID8gMSA6IDA7CisgICAgICBfTV9wID0gMDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIF9JbnRUeXBlIF9fbSwgaW50IF9fcywgaW50IF9fcj4KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgdm9pZAorICAgICAgc3VidHJhY3Rfd2l0aF9jYXJyeTxfSW50VHlwZSwgX19tLCBfX3MsIF9fcj46OgorICAgICAgc2VlZChfR2VuJiBfX2dlbiwgZmFsc2VfdHlwZSkKKyAgICAgIHsKKwljb25zdCBpbnQgX19uID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8X1VJbnRUeXBlPjo6ZGlnaXRzICsgMzEpIC8gMzI7CisKKwlmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBsb25nX2xhZzsgKytfX2kpCisJICB7CisJICAgIF9VSW50VHlwZSBfX3RtcCA9IDA7CisJICAgIF9VSW50VHlwZSBfX2ZhY3RvciA9IDE7CisJICAgIGZvciAoaW50IF9faiA9IDA7IF9faiA8IF9fbjsgKytfX2opCisJICAgICAgeworCQlfX3RtcCArPSBfX2RldGFpbDo6X19tb2Q8X19kZXRhaWw6Ol9VSW50MzJUeXBlLCAxLCAwLCAwPgorCQkgICAgICAgICAoX19nZW4oKSkgKiBfX2ZhY3RvcjsKKwkJX19mYWN0b3IgKj0gX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIDMyPjo6X192YWx1ZTsKKwkgICAgICB9CisJICAgIF9NX3hbX19pXSA9IF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIDEsIDAsIG1vZHVsdXM+KF9fdG1wKTsKKwkgIH0KKwlfTV9jYXJyeSA9IChfTV94W2xvbmdfbGFnIC0gMV0gPT0gMCkgPyAxIDogMDsKKwlfTV9wID0gMDsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgX0ludFR5cGUgX19tLCBpbnQgX19zLCBpbnQgX19yPgorICAgIHR5cGVuYW1lIHN1YnRyYWN0X3dpdGhfY2Fycnk8X0ludFR5cGUsIF9fbSwgX19zLCBfX3I+OjpyZXN1bHRfdHlwZQorICAgIHN1YnRyYWN0X3dpdGhfY2Fycnk8X0ludFR5cGUsIF9fbSwgX19zLCBfX3I+OjoKKyAgICBvcGVyYXRvcigpKCkKKyAgICB7CisgICAgICAvLyBEZXJpdmUgc2hvcnQgbGFnIGluZGV4IGZyb20gY3VycmVudCBpbmRleC4KKyAgICAgIGludCBfX3BzID0gX01fcCAtIHNob3J0X2xhZzsKKyAgICAgIGlmIChfX3BzIDwgMCkKKwlfX3BzICs9IGxvbmdfbGFnOworCisgICAgICAvLyBDYWxjdWxhdGUgbmV3IHgoaSkgd2l0aG91dCBvdmVyZmxvdyBvciBkaXZpc2lvbi4KKyAgICAgIC8vIE5COiBUaGFua3MgdG8gdGhlIHJlcXVpcmVtZW50cyBmb3IgX0ludFR5cGUsIF9NX3hbX01fcF0gKyBfTV9jYXJyeQorICAgICAgLy8gY2Fubm90IG92ZXJmbG93LgorICAgICAgX1VJbnRUeXBlIF9feGk7CisgICAgICBpZiAoX01feFtfX3BzXSA+PSBfTV94W19NX3BdICsgX01fY2FycnkpCisJeworCSAgX194aSA9IF9NX3hbX19wc10gLSBfTV94W19NX3BdIC0gX01fY2Fycnk7CisJICBfTV9jYXJyeSA9IDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIF9feGkgPSBtb2R1bHVzIC0gX01feFtfTV9wXSAtIF9NX2NhcnJ5ICsgX01feFtfX3BzXTsKKwkgIF9NX2NhcnJ5ID0gMTsKKwl9CisgICAgICBfTV94W19NX3BdID0gX194aTsKKworICAgICAgLy8gQWRqdXN0IGN1cnJlbnQgaW5kZXggdG8gbG9vcCBhcm91bmQgaW4gcmluZyBidWZmZXIuCisgICAgICBpZiAoKytfTV9wID49IGxvbmdfbGFnKQorCV9NX3AgPSAwOworCisgICAgICByZXR1cm4gX194aTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIF9JbnRUeXBlIF9fbSwgaW50IF9fcywgaW50IF9fciwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeTxfSW50VHlwZSwgX19tLCBfX3MsIF9fcj4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6Zml4ZWQgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKworICAgICAgZm9yIChpbnQgX19pID0gMDsgX19pIDwgX19yOyArK19faSkKKwlfX29zIDw8IF9feC5fTV94W19faV0gPDwgX19zcGFjZTsKKyAgICAgIF9fb3MgPDwgX194Ll9NX2NhcnJ5OworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIF9JbnRUeXBlIF9fbSwgaW50IF9fcywgaW50IF9fciwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgc3VidHJhY3Rfd2l0aF9jYXJyeTxfSW50VHlwZSwgX19tLCBfX3MsIF9fcj4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IF9fcjsgKytfX2kpCisJX19pcyA+PiBfX3guX01feFtfX2ldOworICAgICAgX19pcyA+PiBfX3guX01fY2Fycnk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIGludCBfX3csIGludCBfX3MsIGludCBfX3I+CisgICAgY29uc3QgaW50CisgICAgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMTxfUmVhbFR5cGUsIF9fdywgX19zLCBfX3I+Ojp3b3JkX3NpemU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCBpbnQgX193LCBpbnQgX19zLCBpbnQgX19yPgorICAgIGNvbnN0IGludAorICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfMDE8X1JlYWxUeXBlLCBfX3csIF9fcywgX19yPjo6bG9uZ19sYWc7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCBpbnQgX193LCBpbnQgX19zLCBpbnQgX19yPgorICAgIGNvbnN0IGludAorICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfMDE8X1JlYWxUeXBlLCBfX3csIF9fcywgX19yPjo6c2hvcnRfbGFnOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgaW50IF9fdywgaW50IF9fcywgaW50IF9fcj4KKyAgICB2b2lkCisgICAgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMTxfUmVhbFR5cGUsIF9fdywgX19zLCBfX3I+OjoKKyAgICBfTV9pbml0aWFsaXplX25wb3dzKCkKKyAgICB7CisgICAgICBmb3IgKGludCBfX2ogPSAwOyBfX2ogPCBfX247ICsrX19qKQorI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKwlfTV9ucG93c1tfX2pdID0gc3RkOjp0cjE6OmxkZXhwKF9SZWFsVHlwZSgxKSwgLV9fdyArIF9faiAqIDMyKTsKKyNlbHNlCisgICAgICAgIF9NX25wb3dzW19fal0gPSBzdGQ6OnBvdyhfUmVhbFR5cGUoMiksIC1fX3cgKyBfX2ogKiAzMik7CisjZW5kaWYKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCBpbnQgX193LCBpbnQgX19zLCBpbnQgX19yPgorICAgIHZvaWQKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxPF9SZWFsVHlwZSwgX193LCBfX3MsIF9fcj46OgorICAgIHNlZWQodW5zaWduZWQgbG9uZyBfX3ZhbHVlKQorICAgIHsKKyAgICAgIGlmIChfX3ZhbHVlID09IDApCisJX192YWx1ZSA9IDE5NzgwNTAzOworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA1MTIuIFNlZWRpbmcgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMSBmcm9tIGEgc2luZ2xlIHVuc2lnbmVkIGxvbmcuCisgICAgICBzdGQ6OnRyMTo6bGluZWFyX2NvbmdydWVudGlhbDx1bnNpZ25lZCBsb25nLCA0MDAxNCwgMCwgMjE0NzQ4MzU2Mz4KKwlfX2xjZyhfX3ZhbHVlKTsKKworICAgICAgdGhpcy0+c2VlZChfX2xjZyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgaW50IF9fdywgaW50IF9fcywgaW50IF9fcj4KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgdm9pZAorICAgICAgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMTxfUmVhbFR5cGUsIF9fdywgX19zLCBfX3I+OjoKKyAgICAgIHNlZWQoX0dlbiYgX19nZW4sIGZhbHNlX3R5cGUpCisgICAgICB7CisJZm9yIChpbnQgX19pID0gMDsgX19pIDwgbG9uZ19sYWc7ICsrX19pKQorCSAgeworCSAgICBmb3IgKGludCBfX2ogPSAwOyBfX2ogPCBfX24gLSAxOyArK19faikKKwkgICAgICBfTV94W19faV1bX19qXSA9IF9fZGV0YWlsOjpfX21vZDxfVUludDMyVHlwZSwgMSwgMCwgMD4oX19nZW4oKSk7CisJICAgIF9NX3hbX19pXVtfX24gLSAxXSA9IF9fZGV0YWlsOjpfX21vZDxfVUludDMyVHlwZSwgMSwgMCwKKwkgICAgICBfX2RldGFpbDo6X1NoaWZ0PF9VSW50MzJUeXBlLCBfX3cgJSAzMj46Ol9fdmFsdWU+KF9fZ2VuKCkpOworCSAgfQorCisJX01fY2FycnkgPSAxOworCWZvciAoaW50IF9faiA9IDA7IF9faiA8IF9fbjsgKytfX2opCisJICBpZiAoX01feFtsb25nX2xhZyAtIDFdW19fal0gIT0gMCkKKwkgICAgeworCSAgICAgIF9NX2NhcnJ5ID0gMDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJX01fcCA9IDA7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCBpbnQgX193LCBpbnQgX19zLCBpbnQgX19yPgorICAgIHR5cGVuYW1lIHN1YnRyYWN0X3dpdGhfY2FycnlfMDE8X1JlYWxUeXBlLCBfX3csIF9fcywgX19yPjo6cmVzdWx0X3R5cGUKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxPF9SZWFsVHlwZSwgX193LCBfX3MsIF9fcj46OgorICAgIG9wZXJhdG9yKCkoKQorICAgIHsKKyAgICAgIC8vIERlcml2ZSBzaG9ydCBsYWcgaW5kZXggZnJvbSBjdXJyZW50IGluZGV4LgorICAgICAgaW50IF9fcHMgPSBfTV9wIC0gc2hvcnRfbGFnOworICAgICAgaWYgKF9fcHMgPCAwKQorCV9fcHMgKz0gbG9uZ19sYWc7CisKKyAgICAgIF9VSW50MzJUeXBlIF9fbmV3X2NhcnJ5OworICAgICAgZm9yIChpbnQgX19qID0gMDsgX19qIDwgX19uIC0gMTsgKytfX2opCisJeworCSAgaWYgKF9NX3hbX19wc11bX19qXSA+IF9NX3hbX01fcF1bX19qXQorCSAgICAgIHx8IChfTV94W19fcHNdW19fal0gPT0gX01feFtfTV9wXVtfX2pdICYmIF9NX2NhcnJ5ID09IDApKQorCSAgICBfX25ld19jYXJyeSA9IDA7CisJICBlbHNlCisJICAgIF9fbmV3X2NhcnJ5ID0gMTsKKworCSAgX01feFtfTV9wXVtfX2pdID0gX01feFtfX3BzXVtfX2pdIC0gX01feFtfTV9wXVtfX2pdIC0gX01fY2Fycnk7CisJICBfTV9jYXJyeSA9IF9fbmV3X2NhcnJ5OworCX0KKworICAgICAgaWYgKF9NX3hbX19wc11bX19uIC0gMV0gPiBfTV94W19NX3BdW19fbiAtIDFdCisJICB8fCAoX01feFtfX3BzXVtfX24gLSAxXSA9PSBfTV94W19NX3BdW19fbiAtIDFdICYmIF9NX2NhcnJ5ID09IDApKQorCV9fbmV3X2NhcnJ5ID0gMDsKKyAgICAgIGVsc2UKKwlfX25ld19jYXJyeSA9IDE7CisgICAgICAKKyAgICAgIF9NX3hbX01fcF1bX19uIC0gMV0gPSBfX2RldGFpbDo6X19tb2Q8X1VJbnQzMlR5cGUsIDEsIDAsCisJX19kZXRhaWw6Ol9TaGlmdDxfVUludDMyVHlwZSwgX193ICUgMzI+OjpfX3ZhbHVlPgorCShfTV94W19fcHNdW19fbiAtIDFdIC0gX01feFtfTV9wXVtfX24gLSAxXSAtIF9NX2NhcnJ5KTsKKyAgICAgIF9NX2NhcnJ5ID0gX19uZXdfY2Fycnk7CisKKyAgICAgIHJlc3VsdF90eXBlIF9fcmV0ID0gMC4wOworICAgICAgZm9yIChpbnQgX19qID0gMDsgX19qIDwgX19uOyArK19faikKKwlfX3JldCArPSBfTV94W19NX3BdW19fal0gKiBfTV9ucG93c1tfX2pdOworCisgICAgICAvLyBBZGp1c3QgY3VycmVudCBpbmRleCB0byBsb29wIGFyb3VuZCBpbiByaW5nIGJ1ZmZlci4KKyAgICAgIGlmICgrK19NX3AgPj0gbG9uZ19sYWcpCisJX01fcCA9IDA7CisKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCBpbnQgX193LCBpbnQgX19zLCBpbnQgX19yLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxPF9SZWFsVHlwZSwgX193LCBfX3MsIF9fcj4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6Zml4ZWQgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKworICAgICAgZm9yIChpbnQgX19pID0gMDsgX19pIDwgX19yOyArK19faSkKKwlmb3IgKGludCBfX2ogPSAwOyBfX2ogPCBfX3guX19uOyArK19faikKKwkgIF9fb3MgPDwgX194Ll9NX3hbX19pXVtfX2pdIDw8IF9fc3BhY2U7CisgICAgICBfX29zIDw8IF9feC5fTV9jYXJyeTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgaW50IF9fdywgaW50IF9fcywgaW50IF9fciwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMTxfUmVhbFR5cGUsIF9fdywgX19zLCBfX3I+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBfX3I7ICsrX19pKQorCWZvciAoaW50IF9faiA9IDA7IF9faiA8IF9feC5fX247ICsrX19qKQorCSAgX19pcyA+PiBfX3guX01feFtfX2ldW19fal07CisgICAgICBfX2lzID4+IF9feC5fTV9jYXJyeTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgaW50IF9fcCwgaW50IF9fcj4KKyAgICBjb25zdCBpbnQKKyAgICBkaXNjYXJkX2Jsb2NrPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBfX3AsIF9fcj46OmJsb2NrX3NpemU7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIGludCBfX3AsIGludCBfX3I+CisgICAgY29uc3QgaW50CisgICAgZGlzY2FyZF9ibG9jazxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgX19wLCBfX3I+Ojp1c2VkX2Jsb2NrOworCisgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBpbnQgX19wLCBpbnQgX19yPgorICAgIHR5cGVuYW1lIGRpc2NhcmRfYmxvY2s8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsCisJCQkgICBfX3AsIF9fcj46OnJlc3VsdF90eXBlCisgICAgZGlzY2FyZF9ibG9jazxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgX19wLCBfX3I+OjoKKyAgICBvcGVyYXRvcigpKCkKKyAgICB7CisgICAgICBpZiAoX01fbiA+PSB1c2VkX2Jsb2NrKQorCXsKKwkgIHdoaWxlIChfTV9uIDwgYmxvY2tfc2l6ZSkKKwkgICAgeworCSAgICAgIF9NX2IoKTsKKwkgICAgICArK19NX247CisJICAgIH0KKwkgIF9NX24gPSAwOworCX0KKyAgICAgICsrX01fbjsKKyAgICAgIHJldHVybiBfTV9iKCk7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBpbnQgX19wLCBpbnQgX19yLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBkaXNjYXJkX2Jsb2NrPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLAorCSAgICAgICBfX3AsIF9fcj4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6Zml4ZWQKKwkJIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisKKyAgICAgIF9fb3MgPDwgX194Ll9NX2IgPDwgX19zcGFjZSA8PCBfX3guX01fbjsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBpbnQgX19wLCBpbnQgX19yLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBkaXNjYXJkX2Jsb2NrPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBfX3AsIF9fcj4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9faXMgPj4gX194Ll9NX2IgPj4gX194Ll9NX247CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEsIGludCBfX3MxLAorCSAgIGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMiwgaW50IF9fczI+CisgICAgY29uc3QgaW50CisgICAgeG9yX2NvbWJpbmU8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IxLCBfX3MxLAorCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjIsIF9fczI+OjpzaGlmdDE7CisgICAgIAorICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEsIGludCBfX3MxLAorCSAgIGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMiwgaW50IF9fczI+CisgICAgY29uc3QgaW50CisgICAgeG9yX2NvbWJpbmU8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IxLCBfX3MxLAorCQlfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjIsIF9fczI+OjpzaGlmdDI7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IxLCBpbnQgX19zMSwKKwkgICBjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjIsIGludCBfX3MyPgorICAgIHZvaWQKKyAgICB4b3JfY29tYmluZTxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEsIF9fczEsCisJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMiwgX19zMj46OgorICAgIF9NX2luaXRpYWxpemVfbWF4KCkKKyAgICB7CisgICAgICBjb25zdCBpbnQgX193ID0gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46OmRpZ2l0czsKKworICAgICAgY29uc3QgcmVzdWx0X3R5cGUgX19tMSA9CisJc3RkOjptaW4ocmVzdWx0X3R5cGUoX01fYjEubWF4KCkgLSBfTV9iMS5taW4oKSksCisJCSBfX2RldGFpbDo6X1NoaWZ0PHJlc3VsdF90eXBlLCBfX3cgLSBfX3MxPjo6X192YWx1ZSAtIDEpOworCisgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX20yID0KKwlzdGQ6Om1pbihyZXN1bHRfdHlwZShfTV9iMi5tYXgoKSAtIF9NX2IyLm1pbigpKSwKKwkJIF9fZGV0YWlsOjpfU2hpZnQ8cmVzdWx0X3R5cGUsIF9fdyAtIF9fczI+OjpfX3ZhbHVlIC0gMSk7CisKKyAgICAgIC8vIE5COiBJbiBUUjEgczEgaXMgbm90IHJlcXVpcmVkIHRvIGJlID49IHMyLgorICAgICAgaWYgKF9fczEgPCBfX3MyKQorCV9NX21heCA9IF9NX2luaXRpYWxpemVfbWF4X2F1eChfX20yLCBfX20xLCBfX3MyIC0gX19zMSkgPDwgX19zMTsKKyAgICAgIGVsc2UKKwlfTV9tYXggPSBfTV9pbml0aWFsaXplX21heF9hdXgoX19tMSwgX19tMiwgX19zMSAtIF9fczIpIDw8IF9fczI7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwgaW50IF9fczEsCisJICAgY2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyLCBpbnQgX19zMj4KKyAgICB0eXBlbmFtZSB4b3JfY29tYmluZTxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEsIF9fczEsCisJCQkgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyLCBfX3MyPjo6cmVzdWx0X3R5cGUKKyAgICB4b3JfY29tYmluZTxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEsIF9fczEsCisJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMiwgX19zMj46OgorICAgIF9NX2luaXRpYWxpemVfbWF4X2F1eChyZXN1bHRfdHlwZSBfX2EsIHJlc3VsdF90eXBlIF9fYiwgaW50IF9fZCkKKyAgICB7CisgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX3R3bzJkID0gcmVzdWx0X3R5cGUoMSkgPDwgX19kOworICAgICAgY29uc3QgcmVzdWx0X3R5cGUgX19jID0gX19hICogX190d28yZDsKKworICAgICAgaWYgKF9fYSA9PSAwIHx8IF9fYiA8IF9fdHdvMmQpCisJcmV0dXJuIF9fYyArIF9fYjsKKworICAgICAgY29uc3QgcmVzdWx0X3R5cGUgX190ID0gc3RkOjptYXgoX19jLCBfX2IpOworICAgICAgY29uc3QgcmVzdWx0X3R5cGUgX191ID0gc3RkOjptaW4oX19jLCBfX2IpOworCisgICAgICByZXN1bHRfdHlwZSBfX3ViID0gX191OworICAgICAgcmVzdWx0X3R5cGUgX19wOworICAgICAgZm9yIChfX3AgPSAwOyBfX3ViICE9IDE7IF9fdWIgPj49IDEpCisJKytfX3A7CisKKyAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fdHdvMnAgPSByZXN1bHRfdHlwZSgxKSA8PCBfX3A7CisgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX2sgPSBfX3QgLyBfX3R3bzJwOworCisgICAgICBpZiAoX19rICYgMSkKKwlyZXR1cm4gKF9fayArIDEpICogX190d28ycCAtIDE7CisKKyAgICAgIGlmIChfX2MgPj0gX19iKQorCXJldHVybiAoX19rICsgMSkgKiBfX3R3bzJwICsgX01faW5pdGlhbGl6ZV9tYXhfYXV4KChfX3QgJSBfX3R3bzJwKQorCQkJCQkJCSAgIC8gX190d28yZCwKKwkJCQkJCQkgICBfX3UgJSBfX3R3bzJwLCBfX2QpOworICAgICAgZWxzZQorCXJldHVybiAoX19rICsgMSkgKiBfX3R3bzJwICsgX01faW5pdGlhbGl6ZV9tYXhfYXV4KChfX3UgJSBfX3R3bzJwKQorCQkJCQkJCSAgIC8gX190d28yZCwKKwkJCQkJCQkgICBfX3QgJSBfX3R3bzJwLCBfX2QpOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEsIGludCBfX3MxLAorCSAgIGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMiwgaW50IF9fczIsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHhvcl9jb21iaW5lPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwgX19zMSwKKwkgICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyLCBfX3MyPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpmaXhlZCB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworCisgICAgICBfX29zIDw8IF9feC5iYXNlMSgpIDw8IF9fc3BhY2UgPDwgX194LmJhc2UyKCk7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIHJldHVybiBfX29zOyAKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IxLCBpbnQgX19zMSwKKwkgICBjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjIsIGludCBfX3MyLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICB4b3JfY29tYmluZTxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEsIF9fczEsCisJICAgICAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMiwgX19zMj4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9faXMgPj4gX194Ll9NX2IxID4+IF9feC5fTV9iMjsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgdW5pZm9ybV9pbnQ8X0ludFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgdW5pZm9ybV9pbnQ8X0ludFR5cGU+OjoKKyAgICAgIF9NX2NhbGwoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkgICAgICByZXN1bHRfdHlwZSBfX21pbiwgcmVzdWx0X3R5cGUgX19tYXgsIHRydWVfdHlwZSkKKyAgICAgIHsKKwkvLyBYWFggTXVzdCBiZSBmaXhlZCB0byB3b3JrIHdlbGwgZm9yICphcmJpdHJhcnkqIF9fdXJuZy5tYXgoKSwKKwkvLyBfX3VybmcubWluKCksIF9fbWF4LCBfX21pbi4gIEN1cnJlbnRseSB3b3JrcyBmaW5lIG9ubHkgaW4gdGhlCisJLy8gbW9zdCBjb21tb24gY2FzZSBfX3VybmcubWF4KCkgLSBfX3VybmcubWluKCkgPj0gX19tYXggLSBfX21pbiwKKwkvLyB3aXRoIF9fdXJuZy5tYXgoKSA+IF9fdXJuZy5taW4oKSA+PSAwLgorCXR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2FkZF91bnNpZ25lZDx0eXBlbmFtZQorCSAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I6OnJlc3VsdF90eXBlPjo6X190eXBlIF9fdXJudHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19hZGRfdW5zaWduZWQ8cmVzdWx0X3R5cGU+OjpfX3R5cGUKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3V0eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2NvbmRpdGlvbmFsX3R5cGU8KHNpemVvZihfX3VybnR5cGUpCisJCQkJCQkJPiBzaXplb2YoX191dHlwZSkpLAorCSAgX191cm50eXBlLCBfX3V0eXBlPjo6X190eXBlICAgICAgICAgICAgICAgICAgICAgICAgIF9fdWN0eXBlOworCisJcmVzdWx0X3R5cGUgX19yZXQ7CisKKwljb25zdCBfX3VybnR5cGUgX191cm5taW4gPSBfX3VybmcubWluKCk7CisJY29uc3QgX191cm50eXBlIF9fdXJubWF4ID0gX191cm5nLm1heCgpOworCWNvbnN0IF9fdXJudHlwZSBfX3VybnJhbmdlID0gX191cm5tYXggLSBfX3Vybm1pbjsKKwljb25zdCBfX3VjdHlwZSBfX3VyYW5nZSA9IF9fbWF4IC0gX19taW47CisJY29uc3QgX191Y3R5cGUgX191ZGVub20gPSAoX191cm5yYW5nZSA8PSBfX3VyYW5nZQorCQkJCSAgID8gMSA6IF9fdXJucmFuZ2UgLyAoX191cmFuZ2UgKyAxKSk7CisJZG8KKwkgIF9fcmV0ID0gKF9fdXJudHlwZShfX3VybmcoKSkgLSAgX191cm5taW4pIC8gX191ZGVub207CisJd2hpbGUgKF9fcmV0ID4gX19tYXggLSBfX21pbik7CisKKwlyZXR1cm4gX19yZXQgKyBfX21pbjsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHVuaWZvcm1faW50PF9JbnRUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisKKyAgICAgIF9fb3MgPDwgX194Lm1pbigpIDw8IF9fc3BhY2UgPDwgX194Lm1heCgpOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICB1bmlmb3JtX2ludDxfSW50VHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9faXMgPj4gX194Ll9NX21pbiA+PiBfX3guX01fbWF4OworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX29zLndpZGVuKCcgJykpOworICAgICAgX19vcy5wcmVjaXNpb24oX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPGRvdWJsZT46Ol9fbWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3gucCgpOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZSwgX1JlYWxUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIGdlb21ldHJpY19kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgeworCS8vIEFib3V0IHRoZSBlcHNpbG9uIHRoaW5nIHNlZSB0aGlzIHRocmVhZDoKKyAgICAgICAgLy8gaHR0cDovL2djYy5nbnUub3JnL21sL2djYy1wYXRjaGVzLzIwMDYtMTAvbXNnMDA5NzEuaHRtbAorCWNvbnN0IF9SZWFsVHlwZSBfX25hZiA9CisJICAoMSAtIHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6ZXBzaWxvbigpKSAvIDI7CisJLy8gVGhlIGxhcmdlc3QgX1JlYWxUeXBlIGNvbnZlcnRpYmxlIHRvIF9JbnRUeXBlLgorCWNvbnN0IF9SZWFsVHlwZSBfX3RociA9CisJICBzdGQ6Om51bWVyaWNfbGltaXRzPF9JbnRUeXBlPjo6bWF4KCkgKyBfX25hZjsKKworCV9SZWFsVHlwZSBfX2NhbmQ7CisJZG8KKwkgIF9fY2FuZCA9IHN0ZDo6Y2VpbChzdGQ6OmxvZyhfX3VybmcoKSkgLyBfTV9sb2dfcCk7CisJd2hpbGUgKF9fY2FuZCA+PSBfX3Rocik7CisKKwlyZXR1cm4gcmVzdWx0X3R5cGUoX19jYW5kICsgX19uYWYpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCB0eXBlbmFtZSBfUmVhbFR5cGUsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGdlb21ldHJpY19kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19vcy53aWRlbignICcpKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxfUmVhbFR5cGU+OjpfX21heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194LnAoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB2b2lkCisgICAgcG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT46OgorICAgIF9NX2luaXRpYWxpemUoKQorICAgIHsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICBpZiAoX01fbWVhbiA+PSAxMikKKwl7CisJICBjb25zdCBfUmVhbFR5cGUgX19tID0gc3RkOjpmbG9vcihfTV9tZWFuKTsKKwkgIF9NX2xtX3RociA9IHN0ZDo6bG9nKF9NX21lYW4pOworCSAgX01fbGZtID0gc3RkOjp0cjE6OmxnYW1tYShfX20gKyAxKTsKKwkgIF9NX3NtID0gc3RkOjpzcXJ0KF9fbSk7CisKKwkgIGNvbnN0IF9SZWFsVHlwZSBfX3BpXzQgPSAwLjc4NTM5ODE2MzM5NzQ0ODMwOTYxNTY2MDg0NTgxOTg3NTdMOworCSAgY29uc3QgX1JlYWxUeXBlIF9fZHggPSBzdGQ6OnNxcnQoMiAqIF9fbSAqIHN0ZDo6bG9nKDMyICogX19tCisJCQkJCQkJICAgICAgLyBfX3BpXzQpKTsKKwkgIF9NX2QgPSBzdGQ6OnRyMTo6cm91bmQoc3RkOjptYXgoX1JlYWxUeXBlKDYpLAorCQkJCQkgIHN0ZDo6bWluKF9fbSwgX19keCkpKTsKKwkgIGNvbnN0IF9SZWFsVHlwZSBfX2N4ID0gMiAqIF9fbSArIF9NX2Q7CisJICBfTV9zY3ggPSBzdGQ6OnNxcnQoX19jeCAvIDIpOworCSAgX01fMWN4ID0gMSAvIF9fY3g7CisKKwkgIF9NX2MyYiA9IHN0ZDo6c3FydChfX3BpXzQgKiBfX2N4KSAqIHN0ZDo6ZXhwKF9NXzFjeCk7CisJICBfTV9jYiA9IDIgKiBfX2N4ICogc3RkOjpleHAoLV9NX2QgKiBfTV8xY3ggKiAoMSArIF9NX2QgLyAyKSkgLyBfTV9kOworCX0KKyAgICAgIGVsc2UKKyNlbmRpZgorCV9NX2xtX3RociA9IHN0ZDo6ZXhwKC1fTV9tZWFuKTsKKyAgICAgIH0KKworICAvKioKKyAgICogQSByZWplY3Rpb24gYWxnb3JpdGhtIHdoZW4gbWVhbiA+PSAxMiBhbmQgYSBzaW1wbGUgbWV0aG9kIGJhc2VkCisgICAqIHVwb24gdGhlIG11bHRpcGxpY2F0aW9uIG9mIHVuaWZvcm0gcmFuZG9tIHZhcmlhdGVzIG90aGVyd2lzZS4KKyAgICogTkI6IFRoZSBmb3JtZXIgaXMgYXZhaWxhYmxlIG9ubHkgaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgKiBpcyBkZWZpbmVkLgorICAgKgorICAgKiBSZWZlcmVuY2U6CisgICAqIERldnJveWUsIEwuIE5vbi1Vbmlmb3JtIFJhbmRvbSBWYXJpYXRlcyBHZW5lcmF0aW9uLiBTcHJpbmdlci1WZXJsYWcsCisgICAqIE5ldyBZb3JrLCAxOTg2LCBDaC4gWCwgU2VjdHMuIDMuMyAmIDMuNCAoKyBFcnJhdGEhKS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCB0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZSwgX1JlYWxUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIHBvaXNzb25fZGlzdHJpYnV0aW9uPF9JbnRUeXBlLCBfUmVhbFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgIHsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisJaWYgKF9NX21lYW4gPj0gMTIpCisJICB7CisJICAgIF9SZWFsVHlwZSBfX3g7CisKKwkgICAgLy8gU2VlIGNvbW1lbnRzIGFib3ZlLi4uCisJICAgIGNvbnN0IF9SZWFsVHlwZSBfX25hZiA9CisJICAgICAgKDEgLSBzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46OmVwc2lsb24oKSkgLyAyOworCSAgICBjb25zdCBfUmVhbFR5cGUgX190aHIgPQorCSAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8X0ludFR5cGU+OjptYXgoKSArIF9fbmFmOworCisJICAgIGNvbnN0IF9SZWFsVHlwZSBfX20gPSBzdGQ6OmZsb29yKF9NX21lYW4pOworCSAgICAvLyBzcXJ0KHBpIC8gMikKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fc3BpXzIgPSAxLjI1MzMxNDEzNzMxNTUwMDI1MTIwNzg4MjY0MjQwNTUyMjZMOworCSAgICBjb25zdCBfUmVhbFR5cGUgX19jMSA9IF9NX3NtICogX19zcGlfMjsKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fYzIgPSBfTV9jMmIgKyBfX2MxOyAKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fYzMgPSBfX2MyICsgMTsKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fYzQgPSBfX2MzICsgMTsKKwkgICAgLy8gZV4oMSAvIDc4KQorCSAgICBjb25zdCBfUmVhbFR5cGUgX19lMTc4ID0gMS4wMTI5MDMwNDc5MzIwMDE4NTgzMTg1NTE0Nzc3NTEyOTgzTDsKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fYzUgPSBfX2M0ICsgX19lMTc4OworCSAgICBjb25zdCBfUmVhbFR5cGUgX19jID0gX01fY2IgKyBfX2M1OworCSAgICBjb25zdCBfUmVhbFR5cGUgX18yY3ggPSAyICogKDIgKiBfX20gKyBfTV9kKTsKKworCSAgICBib29sIF9fcmVqZWN0ID0gdHJ1ZTsKKwkgICAgZG8KKwkgICAgICB7CisJCWNvbnN0IF9SZWFsVHlwZSBfX3UgPSBfX2MgKiBfX3VybmcoKTsKKwkJY29uc3QgX1JlYWxUeXBlIF9fZSA9IC1zdGQ6OmxvZyhfX3VybmcoKSk7CisKKwkJX1JlYWxUeXBlIF9fdyA9IDAuMDsKKwkJCisJCWlmIChfX3UgPD0gX19jMSkKKwkJICB7CisJCSAgICBjb25zdCBfUmVhbFR5cGUgX19uID0gX01fbmQoX191cm5nKTsKKwkJICAgIGNvbnN0IF9SZWFsVHlwZSBfX3kgPSAtc3RkOjphYnMoX19uKSAqIF9NX3NtIC0gMTsKKwkJICAgIF9feCA9IHN0ZDo6Zmxvb3IoX195KTsKKwkJICAgIF9fdyA9IC1fX24gKiBfX24gLyAyOworCQkgICAgaWYgKF9feCA8IC1fX20pCisJCSAgICAgIGNvbnRpbnVlOworCQkgIH0KKwkJZWxzZSBpZiAoX191IDw9IF9fYzIpCisJCSAgeworCQkgICAgY29uc3QgX1JlYWxUeXBlIF9fbiA9IF9NX25kKF9fdXJuZyk7CisJCSAgICBjb25zdCBfUmVhbFR5cGUgX195ID0gMSArIHN0ZDo6YWJzKF9fbikgKiBfTV9zY3g7CisJCSAgICBfX3ggPSBzdGQ6OmNlaWwoX195KTsKKwkJICAgIF9fdyA9IF9feSAqICgyIC0gX195KSAqIF9NXzFjeDsKKwkJICAgIGlmIChfX3ggPiBfTV9kKQorCQkgICAgICBjb250aW51ZTsKKwkJICB9CisJCWVsc2UgaWYgKF9fdSA8PSBfX2MzKQorCQkgIC8vIE5COiBUaGlzIGNhc2Ugbm90IGluIHRoZSBib29rLCBub3IgaW4gdGhlIEVycmF0YSwKKwkJICAvLyBidXQgc2hvdWxkIGJlIG9rLi4uCisJCSAgX194ID0gLTE7CisJCWVsc2UgaWYgKF9fdSA8PSBfX2M0KQorCQkgIF9feCA9IDA7CisJCWVsc2UgaWYgKF9fdSA8PSBfX2M1KQorCQkgIF9feCA9IDE7CisJCWVsc2UKKwkJICB7CisJCSAgICBjb25zdCBfUmVhbFR5cGUgX192ID0gLXN0ZDo6bG9nKF9fdXJuZygpKTsKKwkJICAgIGNvbnN0IF9SZWFsVHlwZSBfX3kgPSBfTV9kICsgX192ICogX18yY3ggLyBfTV9kOworCQkgICAgX194ID0gc3RkOjpjZWlsKF9feSk7CisJCSAgICBfX3cgPSAtX01fZCAqIF9NXzFjeCAqICgxICsgX195IC8gMik7CisJCSAgfQorCisJCV9fcmVqZWN0ID0gKF9fdyAtIF9fZSAtIF9feCAqIF9NX2xtX3RocgorCQkJICAgID4gX01fbGZtIC0gc3RkOjp0cjE6OmxnYW1tYShfX3ggKyBfX20gKyAxKSk7CisKKwkJX19yZWplY3QgfD0gX194ICsgX19tID49IF9fdGhyOworCisJICAgICAgfSB3aGlsZSAoX19yZWplY3QpOworCisJICAgIHJldHVybiByZXN1bHRfdHlwZShfX3ggKyBfX20gKyBfX25hZik7CisJICB9CisJZWxzZQorI2VuZGlmCisJICB7CisJICAgIF9JbnRUeXBlICAgICBfX3ggPSAwOworCSAgICBfUmVhbFR5cGUgX19wcm9kID0gMS4wOworCisJICAgIGRvCisJICAgICAgeworCQlfX3Byb2QgKj0gX191cm5nKCk7CisJCV9feCArPSAxOworCSAgICAgIH0KKwkgICAgd2hpbGUgKF9fcHJvZCA+IF9NX2xtX3Rocik7CisKKwkgICAgcmV0dXJuIF9feCAtIDE7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9SZWFsVHlwZSwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgcG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxfUmVhbFR5cGU+OjpfX21heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194Lm1lYW4oKSA8PCBfX3NwYWNlIDw8IF9feC5fTV9uZDsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCB0eXBlbmFtZSBfUmVhbFR5cGUsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHBvaXNzb25fZGlzdHJpYnV0aW9uPF9JbnRUeXBlLCBfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfX2lzID4+IF9feC5fTV9tZWFuID4+IF9feC5fTV9uZDsKKyAgICAgIF9feC5fTV9pbml0aWFsaXplKCk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHZvaWQKKyAgICBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT46OgorICAgIF9NX2luaXRpYWxpemUoKQorICAgIHsKKyAgICAgIGNvbnN0IF9SZWFsVHlwZSBfX3AxMiA9IF9NX3AgPD0gMC41ID8gX01fcCA6IDEuMCAtIF9NX3A7CisKKyAgICAgIF9NX2Vhc3kgPSB0cnVlOworCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgICAgaWYgKF9NX3QgKiBfX3AxMiA+PSA4KQorCXsKKwkgIF9NX2Vhc3kgPSBmYWxzZTsKKwkgIGNvbnN0IF9SZWFsVHlwZSBfX25wID0gc3RkOjpmbG9vcihfTV90ICogX19wMTIpOworCSAgY29uc3QgX1JlYWxUeXBlIF9fcGEgPSBfX25wIC8gX01fdDsKKwkgIGNvbnN0IF9SZWFsVHlwZSBfXzFwID0gMSAtIF9fcGE7CisJICAKKwkgIGNvbnN0IF9SZWFsVHlwZSBfX3BpXzQgPSAwLjc4NTM5ODE2MzM5NzQ0ODMwOTYxNTY2MDg0NTgxOTg3NTdMOworCSAgY29uc3QgX1JlYWxUeXBlIF9fZDF4ID0KKwkgICAgc3RkOjpzcXJ0KF9fbnAgKiBfXzFwICogc3RkOjpsb2coMzIgKiBfX25wCisJCQkJCSAgICAgLyAoODEgKiBfX3BpXzQgKiBfXzFwKSkpOworCSAgX01fZDEgPSBzdGQ6OnRyMTo6cm91bmQoc3RkOjptYXgoX1JlYWxUeXBlKDEpLCBfX2QxeCkpOworCSAgY29uc3QgX1JlYWxUeXBlIF9fZDJ4ID0KKwkgICAgc3RkOjpzcXJ0KF9fbnAgKiBfXzFwICogc3RkOjpsb2coMzIgKiBfTV90ICogX18xcAorCQkJCQkgICAgIC8gKF9fcGlfNCAqIF9fcGEpKSk7CisJICBfTV9kMiA9IHN0ZDo6dHIxOjpyb3VuZChzdGQ6Om1heChfUmVhbFR5cGUoMSksIF9fZDJ4KSk7CisJICAKKwkgIC8vIHNxcnQocGkgLyAyKQorCSAgY29uc3QgX1JlYWxUeXBlIF9fc3BpXzIgPSAxLjI1MzMxNDEzNzMxNTUwMDI1MTIwNzg4MjY0MjQwNTUyMjZMOworCSAgX01fczEgPSBzdGQ6OnNxcnQoX19ucCAqIF9fMXApICogKDEgKyBfTV9kMSAvICg0ICogX19ucCkpOworCSAgX01fczIgPSBzdGQ6OnNxcnQoX19ucCAqIF9fMXApICogKDEgKyBfTV9kMiAvICg0ICogX01fdCAqIF9fMXApKTsKKwkgIF9NX2MgPSAyICogX01fZDEgLyBfX25wOworCSAgX01fYTEgPSBzdGQ6OmV4cChfTV9jKSAqIF9NX3MxICogX19zcGlfMjsKKwkgIGNvbnN0IF9SZWFsVHlwZSBfX2ExMiA9IF9NX2ExICsgX01fczIgKiBfX3NwaV8yOworCSAgY29uc3QgX1JlYWxUeXBlIF9fczFzID0gX01fczEgKiBfTV9zMTsKKwkgIF9NX2ExMjMgPSBfX2ExMiArIChzdGQ6OmV4cChfTV9kMSAvIChfTV90ICogX18xcCkpCisJCQkgICAgICogMiAqIF9fczFzIC8gX01fZDEKKwkJCSAgICAgKiBzdGQ6OmV4cCgtX01fZDEgKiBfTV9kMSAvICgyICogX19zMXMpKSk7CisJICBjb25zdCBfUmVhbFR5cGUgX19zMnMgPSBfTV9zMiAqIF9NX3MyOworCSAgX01fcyA9IChfTV9hMTIzICsgMiAqIF9fczJzIC8gX01fZDIKKwkJICAqIHN0ZDo6ZXhwKC1fTV9kMiAqIF9NX2QyIC8gKDIgKiBfX3MycykpKTsKKwkgIF9NX2xmID0gKHN0ZDo6dHIxOjpsZ2FtbWEoX19ucCArIDEpCisJCSAgICsgc3RkOjp0cjE6OmxnYW1tYShfTV90IC0gX19ucCArIDEpKTsKKwkgIF9NX2xwMXAgPSBzdGQ6OmxvZyhfX3BhIC8gX18xcCk7CisKKwkgIF9NX3EgPSAtc3RkOjpsb2coMSAtIChfX3AxMiAtIF9fcGEpIC8gX18xcCk7CisJfQorICAgICAgZWxzZQorI2VuZGlmCisJX01fcSA9IC1zdGQ6OmxvZygxIC0gX19wMTIpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlLCBfUmVhbFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlLCBfUmVhbFR5cGU+OjoKKyAgICAgIF9NX3dhaXRpbmcoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywgX0ludFR5cGUgX190KQorICAgICAgeworCV9JbnRUeXBlICAgIF9feCA9IDA7CisJX1JlYWxUeXBlIF9fc3VtID0gMDsKKworCWRvCisJICB7CisJICAgIGNvbnN0IF9SZWFsVHlwZSBfX2UgPSAtc3RkOjpsb2coX191cm5nKCkpOworCSAgICBfX3N1bSArPSBfX2UgLyAoX190IC0gX194KTsKKwkgICAgX194ICs9IDE7CisJICB9CisJd2hpbGUgKF9fc3VtIDw9IF9NX3EpOworCisJcmV0dXJuIF9feCAtIDE7CisgICAgICB9CisKKyAgLyoqCisgICAqIEEgcmVqZWN0aW9uIGFsZ29yaXRobSB3aGVuIHQgKiBwID49IDggYW5kIGEgc2ltcGxlIHdhaXRpbmcgdGltZQorICAgKiBtZXRob2QgLSB0aGUgc2Vjb25kIGluIHRoZSByZWZlcmVuY2VkIGJvb2sgLSBvdGhlcndpc2UuCisgICAqIE5COiBUaGUgZm9ybWVyIGlzIGF2YWlsYWJsZSBvbmx5IGlmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICogaXMgZGVmaW5lZC4KKyAgICoKKyAgICogUmVmZXJlbmNlOgorICAgKiBEZXZyb3llLCBMLiBOb24tVW5pZm9ybSBSYW5kb20gVmFyaWF0ZXMgR2VuZXJhdGlvbi4gU3ByaW5nZXItVmVybGFnLAorICAgKiBOZXcgWW9yaywgMTk4NiwgQ2guIFgsIFNlY3QuIDQgKCsgRXJyYXRhISkuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlLCBfUmVhbFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlLCBfUmVhbFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgIHsKKwlyZXN1bHRfdHlwZSBfX3JldDsKKwljb25zdCBfUmVhbFR5cGUgX19wMTIgPSBfTV9wIDw9IDAuNSA/IF9NX3AgOiAxLjAgLSBfTV9wOworCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorCWlmICghX01fZWFzeSkKKwkgIHsKKwkgICAgX1JlYWxUeXBlIF9feDsKKworCSAgICAvLyBTZWUgY29tbWVudHMgYWJvdmUuLi4KKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fbmFmID0KKwkgICAgICAoMSAtIHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6ZXBzaWxvbigpKSAvIDI7CisJICAgIGNvbnN0IF9SZWFsVHlwZSBfX3RociA9CisJICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxfSW50VHlwZT46Om1heCgpICsgX19uYWY7CisKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fbnAgPSBzdGQ6OmZsb29yKF9NX3QgKiBfX3AxMik7CisJICAgIGNvbnN0IF9SZWFsVHlwZSBfX3BhID0gX19ucCAvIF9NX3Q7CisKKwkgICAgLy8gc3FydChwaSAvIDIpCisJICAgIGNvbnN0IF9SZWFsVHlwZSBfX3NwaV8yID0gMS4yNTMzMTQxMzczMTU1MDAyNTEyMDc4ODI2NDI0MDU1MjI2TDsKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fYTEgPSBfTV9hMTsKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fYTEyID0gX19hMSArIF9NX3MyICogX19zcGlfMjsKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fYTEyMyA9IF9NX2ExMjM7CisJICAgIGNvbnN0IF9SZWFsVHlwZSBfX3MxcyA9IF9NX3MxICogX01fczE7CisJICAgIGNvbnN0IF9SZWFsVHlwZSBfX3MycyA9IF9NX3MyICogX01fczI7CisKKwkgICAgYm9vbCBfX3JlamVjdDsKKwkgICAgZG8KKwkgICAgICB7CisJCWNvbnN0IF9SZWFsVHlwZSBfX3UgPSBfTV9zICogX191cm5nKCk7CisKKwkJX1JlYWxUeXBlIF9fdjsKKworCQlpZiAoX191IDw9IF9fYTEpCisJCSAgeworCQkgICAgY29uc3QgX1JlYWxUeXBlIF9fbiA9IF9NX25kKF9fdXJuZyk7CisJCSAgICBjb25zdCBfUmVhbFR5cGUgX195ID0gX01fczEgKiBzdGQ6OmFicyhfX24pOworCQkgICAgX19yZWplY3QgPSBfX3kgPj0gX01fZDE7CisJCSAgICBpZiAoIV9fcmVqZWN0KQorCQkgICAgICB7CisJCQljb25zdCBfUmVhbFR5cGUgX19lID0gLXN0ZDo6bG9nKF9fdXJuZygpKTsKKwkJCV9feCA9IHN0ZDo6Zmxvb3IoX195KTsKKwkJCV9fdiA9IC1fX2UgLSBfX24gKiBfX24gLyAyICsgX01fYzsKKwkJICAgICAgfQorCQkgIH0KKwkJZWxzZSBpZiAoX191IDw9IF9fYTEyKQorCQkgIHsKKwkJICAgIGNvbnN0IF9SZWFsVHlwZSBfX24gPSBfTV9uZChfX3VybmcpOworCQkgICAgY29uc3QgX1JlYWxUeXBlIF9feSA9IF9NX3MyICogc3RkOjphYnMoX19uKTsKKwkJICAgIF9fcmVqZWN0ID0gX195ID49IF9NX2QyOworCQkgICAgaWYgKCFfX3JlamVjdCkKKwkJICAgICAgeworCQkJY29uc3QgX1JlYWxUeXBlIF9fZSA9IC1zdGQ6OmxvZyhfX3VybmcoKSk7CisJCQlfX3ggPSBzdGQ6OmZsb29yKC1fX3kpOworCQkJX192ID0gLV9fZSAtIF9fbiAqIF9fbiAvIDI7CisJCSAgICAgIH0KKwkJICB9CisJCWVsc2UgaWYgKF9fdSA8PSBfX2ExMjMpCisJCSAgeworCQkgICAgY29uc3QgX1JlYWxUeXBlIF9fZTEgPSAtc3RkOjpsb2coX191cm5nKCkpOwkJICAgIAorCQkgICAgY29uc3QgX1JlYWxUeXBlIF9fZTIgPSAtc3RkOjpsb2coX191cm5nKCkpOworCisJCSAgICBjb25zdCBfUmVhbFR5cGUgX195ID0gX01fZDEgKyAyICogX19zMXMgKiBfX2UxIC8gX01fZDE7CisJCSAgICBfX3ggPSBzdGQ6OmZsb29yKF9feSk7CisJCSAgICBfX3YgPSAoLV9fZTIgKyBfTV9kMSAqICgxIC8gKF9NX3QgLSBfX25wKQorCQkJCQkgICAgLV9feSAvICgyICogX19zMXMpKSk7CisJCSAgICBfX3JlamVjdCA9IGZhbHNlOworCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIGNvbnN0IF9SZWFsVHlwZSBfX2UxID0gLXN0ZDo6bG9nKF9fdXJuZygpKTsJCSAgICAKKwkJICAgIGNvbnN0IF9SZWFsVHlwZSBfX2UyID0gLXN0ZDo6bG9nKF9fdXJuZygpKTsKKworCQkgICAgY29uc3QgX1JlYWxUeXBlIF9feSA9IF9NX2QyICsgMiAqIF9fczJzICogX19lMSAvIF9NX2QyOworCQkgICAgX194ID0gc3RkOjpmbG9vcigtX195KTsKKwkJICAgIF9fdiA9IC1fX2UyIC0gX01fZDIgKiBfX3kgLyAoMiAqIF9fczJzKTsKKwkJICAgIF9fcmVqZWN0ID0gZmFsc2U7CisJCSAgfQorCisJCV9fcmVqZWN0ID0gX19yZWplY3QgfHwgX194IDwgLV9fbnAgfHwgX194ID4gX01fdCAtIF9fbnA7CisJCWlmICghX19yZWplY3QpCisJCSAgeworCQkgICAgY29uc3QgX1JlYWxUeXBlIF9fbGZ4ID0KKwkJICAgICAgc3RkOjp0cjE6OmxnYW1tYShfX25wICsgX194ICsgMSkKKwkJICAgICAgKyBzdGQ6OnRyMTo6bGdhbW1hKF9NX3QgLSAoX19ucCArIF9feCkgKyAxKTsKKwkJICAgIF9fcmVqZWN0ID0gX192ID4gX01fbGYgLSBfX2xmeCArIF9feCAqIF9NX2xwMXA7CisJCSAgfQorCisJCV9fcmVqZWN0IHw9IF9feCArIF9fbnAgPj0gX190aHI7CisJICAgICAgfQorCSAgICB3aGlsZSAoX19yZWplY3QpOworCisJICAgIF9feCArPSBfX25wICsgX19uYWY7CisKKwkgICAgY29uc3QgX0ludFR5cGUgX196ID0gX01fd2FpdGluZyhfX3VybmcsIF9NX3QgLSBfSW50VHlwZShfX3gpKTsgCisJICAgIF9fcmV0ID0gX0ludFR5cGUoX194KSArIF9fejsKKwkgIH0KKwllbHNlCisjZW5kaWYKKwkgIF9fcmV0ID0gX01fd2FpdGluZyhfX3VybmcsIF9NX3QpOworCisJaWYgKF9fcDEyICE9IF9NX3ApCisJICBfX3JldCA9IF9NX3QgLSBfX3JldDsKKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9SZWFsVHlwZSwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlLCBfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1JlYWxUeXBlPjo6X19tYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC50KCkgPDwgX19zcGFjZSA8PCBfX3gucCgpIAorCSAgIDw8IF9fc3BhY2UgPDwgX194Ll9NX25kOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9SZWFsVHlwZSwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlLCBfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfX2lzID4+IF9feC5fTV90ID4+IF9feC5fTV9wID4+IF9feC5fTV9uZDsKKyAgICAgIF9feC5fTV9pbml0aWFsaXplKCk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCB1bmlmb3JtX3JlYWw8X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPF9SZWFsVHlwZT46Ol9fbWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3gubWluKCkgPDwgX19zcGFjZSA8PCBfX3gubWF4KCk7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICB1bmlmb3JtX3JlYWw8X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX19pcyA+PiBfX3guX01fbWluID4+IF9feC5fTV9tYXg7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBleHBvbmVudGlhbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX29zLndpZGVuKCcgJykpOworICAgICAgX19vcy5wcmVjaXNpb24oX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPF9SZWFsVHlwZT46Ol9fbWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3gubGFtYmRhKCk7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworCisgIC8qKgorICAgKiBQb2xhciBtZXRob2QgZHVlIHRvIE1hcnNhZ2xpYS4KKyAgICoKKyAgICogRGV2cm95ZSwgTC4gTm9uLVVuaWZvcm0gUmFuZG9tIFZhcmlhdGVzIEdlbmVyYXRpb24uIFNwcmluZ2VyLVZlcmxhZywKKyAgICogTmV3IFlvcmssIDE5ODYsIENoLiBWLCBTZWN0LiA0LjQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnJlc3VsdF90eXBlCisgICAgICBub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgeworCXJlc3VsdF90eXBlIF9fcmV0OworCisJaWYgKF9NX3NhdmVkX2F2YWlsYWJsZSkKKwkgIHsKKwkgICAgX01fc2F2ZWRfYXZhaWxhYmxlID0gZmFsc2U7CisJICAgIF9fcmV0ID0gX01fc2F2ZWQ7CisJICB9CisJZWxzZQorCSAgeworCSAgICByZXN1bHRfdHlwZSBfX3gsIF9feSwgX19yMjsKKwkgICAgZG8KKwkgICAgICB7CisJCV9feCA9IHJlc3VsdF90eXBlKDIuMCkgKiBfX3VybmcoKSAtIDEuMDsKKwkJX195ID0gcmVzdWx0X3R5cGUoMi4wKSAqIF9fdXJuZygpIC0gMS4wOworCQlfX3IyID0gX194ICogX194ICsgX195ICogX195OworCSAgICAgIH0KKwkgICAgd2hpbGUgKF9fcjIgPiAxLjAgfHwgX19yMiA9PSAwLjApOworCisJICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fbXVsdCA9IHN0ZDo6c3FydCgtMiAqIHN0ZDo6bG9nKF9fcjIpIC8gX19yMik7CisJICAgIF9NX3NhdmVkID0gX194ICogX19tdWx0OworCSAgICBfTV9zYXZlZF9hdmFpbGFibGUgPSB0cnVlOworCSAgICBfX3JldCA9IF9feSAqIF9fbXVsdDsKKwkgIH0KKwkKKwlfX3JldCA9IF9fcmV0ICogX01fc2lnbWEgKyBfTV9tZWFuOworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxfUmVhbFR5cGU+OjpfX21heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194Ll9NX3NhdmVkX2F2YWlsYWJsZSA8PCBfX3NwYWNlCisJICAgPDwgX194Lm1lYW4oKSA8PCBfX3NwYWNlCisJICAgPDwgX194LnNpZ21hKCk7CisgICAgICBpZiAoX194Ll9NX3NhdmVkX2F2YWlsYWJsZSkKKwlfX29zIDw8IF9fc3BhY2UgPDwgX194Ll9NX3NhdmVkOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfX2lzID4+IF9feC5fTV9zYXZlZF9hdmFpbGFibGUgPj4gX194Ll9NX21lYW4KKwkgICA+PiBfX3guX01fc2lnbWE7CisgICAgICBpZiAoX194Ll9NX3NhdmVkX2F2YWlsYWJsZSkKKwlfX2lzID4+IF9feC5fTV9zYXZlZDsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB2b2lkCisgICAgZ2FtbWFfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgIF9NX2luaXRpYWxpemUoKQorICAgIHsKKyAgICAgIGlmIChfTV9hbHBoYSA+PSAxKQorCV9NX2xfZCA9IHN0ZDo6c3FydCgyICogX01fYWxwaGEgLSAxKTsKKyAgICAgIGVsc2UKKwlfTV9sX2QgPSAoc3RkOjpwb3coX01fYWxwaGEsIF9NX2FscGhhIC8gKDEgLSBfTV9hbHBoYSkpCisJCSAgKiAoMSAtIF9NX2FscGhhKSk7CisgICAgfQorCisgIC8qKgorICAgKiBDaGVuZydzIHJlamVjdGlvbiBhbGdvcml0aG0gR0IgZm9yIGFscGhhID49IDEgYW5kIGEgbW9kaWZpY2F0aW9uCisgICAqIG9mIFZhZHV2YSdzIHJlamVjdGlvbiBmcm9tIFdlaWJ1bGwgYWxnb3JpdGhtIGR1ZSB0byBEZXZyb3llIGZvcgorICAgKiBhbHBoYSA8IDEuCisgICAqCisgICAqIFJlZmVyZW5jZXM6CisgICAqIENoZW5nLCBSLiBDLiBUaGUgR2VuZXJhdGlvbiBvZiBHYW1tYSBSYW5kb20gVmFyaWFibGVzIHdpdGggTm9uLWludGVncmFsCisgICAqIFNoYXBlIFBhcmFtZXRlci4gQXBwbGllZCBTdGF0aXN0aWNzLCAyNiwgNzEtNzUsIDE5NzcuCisgICAqCisgICAqIFZhZHV2YSwgSS4gQ29tcHV0ZXIgR2VuZXJhdGlvbiBvZiBHYW1tYSBHYW5kb20gVmFyaWFibGVzIGJ5IFJlamVjdGlvbgorICAgKiBhbmQgQ29tcG9zaXRpb24gUHJvY2VkdXJlcy4gTWF0aC4gT3BlcmF0aW9uc2ZvcnNjaHVuZyBhbmQgU3RhdGlzdGlrLAorICAgKiBTZXJpZXMgaW4gU3RhdGlzdGljcywgOCwgNTQ1LTU3NiwgMTk3Ny4KKyAgICoKKyAgICogRGV2cm95ZSwgTC4gTm9uLVVuaWZvcm0gUmFuZG9tIFZhcmlhdGVzIEdlbmVyYXRpb24uIFNwcmluZ2VyLVZlcmxhZywKKyAgICogTmV3IFlvcmssIDE5ODYsIENoLiBJWCwgU2VjdC4gMy40ICgrIEVycmF0YSEpLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgZ2FtbWFfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnJlc3VsdF90eXBlCisgICAgICBnYW1tYV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgICB7CisJcmVzdWx0X3R5cGUgX194OworCisJYm9vbCBfX3JlamVjdDsKKwlpZiAoX01fYWxwaGEgPj0gMSkKKwkgIHsKKwkgICAgLy8gYWxwaGEgLSBsb2coNCkKKwkgICAgY29uc3QgcmVzdWx0X3R5cGUgX19iID0gX01fYWxwaGEKKwkgICAgICAtIHJlc3VsdF90eXBlKDEuMzg2Mjk0MzYxMTE5ODkwNjE4ODM0NDY0MjQyOTE2MzUzMUwpOworCSAgICBjb25zdCByZXN1bHRfdHlwZSBfX2MgPSBfTV9hbHBoYSArIF9NX2xfZDsKKwkgICAgY29uc3QgcmVzdWx0X3R5cGUgX18xbCA9IDEgLyBfTV9sX2Q7CisKKwkgICAgLy8gMSArIGxvZyg5IC8gMikKKwkgICAgY29uc3QgcmVzdWx0X3R5cGUgX19rID0gMi41MDQwNzczOTY3NzYyNzQwNzMzNzMyNTgzNTIzODY4NzQ4TDsKKworCSAgICBkbworCSAgICAgIHsKKwkJY29uc3QgcmVzdWx0X3R5cGUgX191ID0gX191cm5nKCk7CisJCWNvbnN0IHJlc3VsdF90eXBlIF9fdiA9IF9fdXJuZygpOworCisJCWNvbnN0IHJlc3VsdF90eXBlIF9feSA9IF9fMWwgKiBzdGQ6OmxvZyhfX3YgLyAoMSAtIF9fdikpOworCQlfX3ggPSBfTV9hbHBoYSAqIHN0ZDo6ZXhwKF9feSk7CisKKwkJY29uc3QgcmVzdWx0X3R5cGUgX196ID0gX191ICogX192ICogX192OworCQljb25zdCByZXN1bHRfdHlwZSBfX3IgPSBfX2IgKyBfX2MgKiBfX3kgLSBfX3g7CisKKwkJX19yZWplY3QgPSBfX3IgPCByZXN1bHRfdHlwZSg0LjUpICogX196IC0gX19rOworCQlpZiAoX19yZWplY3QpCisJCSAgX19yZWplY3QgPSBfX3IgPCBzdGQ6OmxvZyhfX3opOworCSAgICAgIH0KKwkgICAgd2hpbGUgKF9fcmVqZWN0KTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fYyA9IDEgLyBfTV9hbHBoYTsKKworCSAgICBkbworCSAgICAgIHsKKwkJY29uc3QgcmVzdWx0X3R5cGUgX196ID0gLXN0ZDo6bG9nKF9fdXJuZygpKTsKKwkJY29uc3QgcmVzdWx0X3R5cGUgX19lID0gLXN0ZDo6bG9nKF9fdXJuZygpKTsKKworCQlfX3ggPSBzdGQ6OnBvdyhfX3osIF9fYyk7CisKKwkJX19yZWplY3QgPSBfX3ogKyBfX2UgPCBfTV9sX2QgKyBfX3g7CisJICAgICAgfQorCSAgICB3aGlsZSAoX19yZWplY3QpOworCSAgfQorCisJcmV0dXJuIF9feDsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBnYW1tYV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX29zLndpZGVuKCcgJykpOworICAgICAgX19vcy5wcmVjaXNpb24oX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPF9SZWFsVHlwZT46Ol9fbWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3guYWxwaGEoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9yZWdleCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3JlZ2V4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmY2MzYTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9yZWdleApAQCAtMCwwICsxLDI3MzAgQEAKKy8vIGNsYXNzIHRlbXBsYXRlIHJlZ2V4IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKgorICogQGZpbGUgdHIxL3JlZ2V4CisgKiBAYXV0aG9yIFN0ZXBoZW4gTS4gV2ViYiAgPHN0ZXBoZW4ud2ViYkBicmVnbWFzb2Z0LmNhPgorICogVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX1JFR0VYCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9SRUdFWCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bG9jYWxlPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisvKioKKyAqIEBkZWZncm91cCB0cjFfcmVnZXggUmVndWxhciBFeHByZXNzaW9ucworICogQSBmYWNpbGl0eSBmb3IgcGVyZm9ybWluZyByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiBtYXRjaGluZy4KKyAqLworIC8vQHsKKworLyoqIEBuYW1lc3BhY2Ugc3RkOjpyZWdleF9jb25zdGFudHMKKyAqICBAYnJpZWYgSVNPIEMrKyAweCBlbnRpdGllcyBzdWIgbmFtZXNwYWNlIGZvciByZWdleC4KKyAqLworbmFtZXNwYWNlIHJlZ2V4X2NvbnN0YW50cworeworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQG5hbWUgNS4xIFJlZ3VsYXIgRXhwcmVzc2lvbiBTeW50YXggT3B0aW9ucworICAgKi8KKyAgLy9AeworICBlbnVtIF9fc3ludGF4X29wdGlvbgorICAgIHsKKyAgICAgIF9TX2ljYXNlLAorICAgICAgX1Nfbm9zdWJzLAorICAgICAgX1Nfb3B0aW1pemUsCisgICAgICBfU19jb2xsYXRlLAorICAgICAgX1NfRUNNQVNjcmlwdCwKKyAgICAgIF9TX2Jhc2ljLAorICAgICAgX1NfZXh0ZW5kZWQsCisgICAgICBfU19hd2ssCisgICAgICBfU19ncmVwLAorICAgICAgX1NfZWdyZXAsCisgICAgICBfU19zeW50YXhfbGFzdAorICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBUaGlzIGlzIGEgYml0bWFzayB0eXBlIGluZGljYXRpbmcgaG93IHRvIGludGVycHJldCB0aGUgcmVnZXguCisgICAqCisgICAqIFRoZSBAYyBzeW50YXhfb3B0aW9uX3R5cGUgaXMgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBidXQgaXQgaXMgdmFsaWQgdG8KKyAgICogcGVyZm9ybSBiaXR3aXNlIG9wZXJhdGlvbnMgb24gdGhlc2UgdmFsdWVzIGFuZCBleHBlY3QgdGhlIHJpZ2h0IHRoaW5nIHRvCisgICAqIGhhcHBlbi4KKyAgICoKKyAgICogQSB2YWxpZCB2YWx1ZSBvZiB0eXBlIHN5bnRheF9vcHRpb25fdHlwZSBzaGFsbCBoYXZlIGV4YWN0bHkgb25lIG9mIHRoZQorICAgKiBlbGVtZW50cyBAYyBFQ01BU2NyaXB0LCBAYyBiYXNpYywgQGMgZXh0ZW5kZWQsIEBjIGF3aywgQGMgZ3JlcCwgQGMgZWdyZXAKKyAgICogJXNldC4KKyAgICovCisgIHR5cGVkZWYgdW5zaWduZWQgaW50IHN5bnRheF9vcHRpb25fdHlwZTsKKworICAvKiogCisgICAqIFNwZWNpZmllcyB0aGF0IHRoZSBtYXRjaGluZyBvZiByZWd1bGFyIGV4cHJlc3Npb25zIGFnYWluc3QgYSBjaGFyYWN0ZXIKKyAgICogc2VxdWVuY2Ugc2hhbGwgYmUgcGVyZm9ybWVkIHdpdGhvdXQgcmVnYXJkIHRvIGNhc2UuCisgICAqLworICBzdGF0aWMgY29uc3Qgc3ludGF4X29wdGlvbl90eXBlIGljYXNlICAgICAgPSAxIDw8IF9TX2ljYXNlOworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhhdCB3aGVuIGEgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQgYWdhaW5zdCBhIGNoYXJhY3RlcgorICAgKiBjb250YWluZXIgc2VxdWVuY2UsIG5vIHN1Yi1leHByZXNzaW9uIG1hdGNoZXMgYXJlIHRvIGJlIHN0b3JlZCBpbiB0aGUKKyAgICogc3VwcGxpZWQgbWF0Y2hfcmVzdWx0cyBzdHJ1Y3R1cmUuCisgICAqLworICBzdGF0aWMgY29uc3Qgc3ludGF4X29wdGlvbl90eXBlIG5vc3VicyAgICAgPSAxIDw8IF9TX25vc3ViczsKKworICAvKioKKyAgICogU3BlY2lmaWVzIHRoYXQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBlbmdpbmUgc2hvdWxkIHBheSBtb3JlIGF0dGVudGlvbiB0bworICAgKiB0aGUgc3BlZWQgd2l0aCB3aGljaCByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBtYXRjaGVkLCBhbmQgbGVzcyB0byB0aGUKKyAgICogc3BlZWQgd2l0aCB3aGljaCByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0cyBhcmUgY29uc3RydWN0ZWQuIE90aGVyd2lzZQorICAgKiBpdCBoYXMgbm8gZGV0ZWN0YWJsZSBlZmZlY3Qgb24gdGhlIHByb2dyYW0gb3V0cHV0LgorICAgKi8KKyAgc3RhdGljIGNvbnN0IHN5bnRheF9vcHRpb25fdHlwZSBvcHRpbWl6ZSAgID0gMSA8PCBfU19vcHRpbWl6ZTsKKworICAvKioKKyAgICogU3BlY2lmaWVzIHRoYXQgY2hhcmFjdGVyIHJhbmdlcyBvZiB0aGUgZm9ybSBbYS1iXSBzaG91bGQgYmUgbG9jYWxlCisgICAqIHNlbnNpdGl2ZS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBzeW50YXhfb3B0aW9uX3R5cGUgY29sbGF0ZSAgICA9IDEgPDwgX1NfY29sbGF0ZTsKKworICAvKioKKyAgICogU3BlY2lmaWVzIHRoYXQgdGhlIGdyYW1tYXIgcmVjb2duaXplZCBieSB0aGUgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZSBpcworICAgKiB0aGF0IHVzZWQgYnkgRUNNQVNjcmlwdCBpbiBFQ01BLTI2MiBbRWNtYSBJbnRlcm5hdGlvbmFsLCBFQ01BU2NyaXB0CisgICAqIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIFN0YW5kYXJkIEVjbWEtMjYyLCB0aGlyZCBlZGl0aW9uLCAxOTk5XSwgYXMKKyAgICogbW9kaWZpZWQgaW4gdHIxIHNlY3Rpb24gWzcuMTNdLiAgVGhpcyBncmFtbWFyIGlzIHNpbWlsYXIgdG8gdGhhdCBkZWZpbmVkCisgICAqIGluIHRoZSBQRVJMIHNjcmlwdGluZyBsYW5ndWFnZSBidXQgZXh0ZW5kZWQgd2l0aCBlbGVtZW50cyBmb3VuZCBpbiB0aGUKKyAgICogUE9TSVggcmVndWxhciBleHByZXNzaW9uIGdyYW1tYXIuCisgICAqLworICBzdGF0aWMgY29uc3Qgc3ludGF4X29wdGlvbl90eXBlIEVDTUFTY3JpcHQgPSAxIDw8IF9TX0VDTUFTY3JpcHQ7CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyB0aGF0IHRoZSBncmFtbWFyIHJlY29nbml6ZWQgYnkgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBlbmdpbmUgaXMKKyAgICogdGhhdCB1c2VkIGJ5IFBPU0lYIGJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaW4gSUVFRSBTdGQgMTAwMy4xLTIwMDEsCisgICAqIFBvcnRhYmxlIE9wZXJhdGluZyBTeXN0ZW0gSW50ZXJmYWNlIChQT1NJWCksIEJhc2UgRGVmaW5pdGlvbnMgYW5kCisgICAqIEhlYWRlcnMsIFNlY3Rpb24gOSwgUmVndWxhciBFeHByZXNzaW9ucyBbSUVFRSwgSW5mb3JtYXRpb24gVGVjaG5vbG9neSAtLQorICAgKiBQb3J0YWJsZSBPcGVyYXRpbmcgU3lzdGVtIEludGVyZmFjZSAoUE9TSVgpLCBJRUVFIFN0YW5kYXJkIDEwMDMuMS0yMDAxXS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBzeW50YXhfb3B0aW9uX3R5cGUgYmFzaWMgICAgICA9IDEgPDwgX1NfYmFzaWM7CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyB0aGF0IHRoZSBncmFtbWFyIHJlY29nbml6ZWQgYnkgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBlbmdpbmUgaXMKKyAgICogdGhhdCB1c2VkIGJ5IFBPU0lYIGV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaW4gSUVFRSBTdGQgMTAwMy4xLTIwMDEsCisgICAqIFBvcnRhYmxlIE9wZXJhdGluZyBTeXN0ZW0gSW50ZXJmYWNlIChQT1NJWCksIEJhc2UgRGVmaW5pdGlvbnMgYW5kIEhlYWRlcnMsCisgICAqIFNlY3Rpb24gOSwgUmVndWxhciBFeHByZXNzaW9ucy4KKyAgICovCisgIHN0YXRpYyBjb25zdCBzeW50YXhfb3B0aW9uX3R5cGUgZXh0ZW5kZWQgICA9IDEgPDwgX1NfZXh0ZW5kZWQ7CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyB0aGF0IHRoZSBncmFtbWFyIHJlY29nbml6ZWQgYnkgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBlbmdpbmUgaXMKKyAgICogdGhhdCB1c2VkIGJ5IFBPU0lYIHV0aWxpdHkgYXdrIGluIElFRUUgU3RkIDEwMDMuMS0yMDAxLiAgVGhpcyBvcHRpb24gaXMKKyAgICogaWRlbnRpY2FsIHRvIHN5bnRheF9vcHRpb25fdHlwZSBleHRlbmRlZCwgZXhjZXB0IHRoYXQgQy1zdHlsZSBlc2NhcGUKKyAgICogc2VxdWVuY2VzIGFyZSBzdXBwb3J0ZWQuICBUaGVzZSBzZXF1ZW5jZXMgYXJlOiAKKyAgICogXFxcXCwgXFxhLCBcXGIsIFxcZiwgCisgICAqIFxcbiwgXFxyLCBcXHQgLCBcXHYsIAorICAgKiBcXCZhcG9zOywgJmFwb3M7LCBhbmQgXFxkZGQgCisgICAqICh3aGVyZSBkZGQgaXMgb25lLCB0d28sIG9yIHRocmVlIG9jdGFsIGRpZ2l0cykuICAKKyAgICovCisgIHN0YXRpYyBjb25zdCBzeW50YXhfb3B0aW9uX3R5cGUgYXdrICAgICAgICA9IDEgPDwgX1NfYXdrOworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgZ3JhbW1hciByZWNvZ25pemVkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lIGlzCisgICAqIHRoYXQgdXNlZCBieSBQT1NJWCB1dGlsaXR5IGdyZXAgaW4gSUVFRSBTdGQgMTAwMy4xLTIwMDEuICBUaGlzIG9wdGlvbiBpcworICAgKiBpZGVudGljYWwgdG8gc3ludGF4X29wdGlvbl90eXBlIGJhc2ljLCBleGNlcHQgdGhhdCBuZXdsaW5lcyBhcmUgdHJlYXRlZAorICAgKiBhcyB3aGl0ZXNwYWNlLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IHN5bnRheF9vcHRpb25fdHlwZSBncmVwICAgICAgID0gMSA8PCBfU19ncmVwOworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgZ3JhbW1hciByZWNvZ25pemVkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lIGlzCisgICAqIHRoYXQgdXNlZCBieSBQT1NJWCB1dGlsaXR5IGdyZXAgd2hlbiBnaXZlbiB0aGUgLUUgb3B0aW9uIGluCisgICAqIElFRUUgU3RkIDEwMDMuMS0yMDAxLiAgVGhpcyBvcHRpb24gaXMgaWRlbnRpY2FsIHRvIHN5bnRheF9vcHRpb25fdHlwZSAKKyAgICogZXh0ZW5kZWQsIGV4Y2VwdCB0aGF0IG5ld2xpbmVzIGFyZSB0cmVhdGVkIGFzIHdoaXRlc3BhY2UuCisgICAqLworICBzdGF0aWMgY29uc3Qgc3ludGF4X29wdGlvbl90eXBlIGVncmVwICAgICAgPSAxIDw8IF9TX2VncmVwOworCisgIC8vQH0KKworICAvKioKKyAgICogQG5hbWUgNS4yIE1hdGNoaW5nIFJ1bGVzCisgICAqCisgICAqIE1hdGNoaW5nIGEgcmVndWxhciBleHByZXNzaW9uIGFnYWluc3QgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIFtmaXJzdCwKKyAgICogbGFzdCkgcHJvY2VlZHMgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBvZiB0aGUgZ3JhbW1hciBzcGVjaWZpZWQgZm9yIHRoZQorICAgKiByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0LCBtb2RpZmllZCBhY2NvcmRpbmcgdG8gdGhlIGVmZmVjdHMgbGlzdGVkCisgICAqIGJlbG93IGZvciBhbnkgYml0bWFzayBlbGVtZW50cyBzZXQuCisgICAqCisgICAqLworICAvL0B7CisKKyAgZW51bSBfX21hdGNoX2ZsYWcKKyAgICB7CisgICAgICBfU19ub3RfYm9sLAorICAgICAgX1Nfbm90X2VvbCwKKyAgICAgIF9TX25vdF9ib3csCisgICAgICBfU19ub3RfZW93LAorICAgICAgX1NfYW55LAorICAgICAgX1Nfbm90X251bGwsCisgICAgICBfU19jb250aW51b3VzLAorICAgICAgX1NfcHJldl9hdmFpbCwKKyAgICAgIF9TX3NlZCwKKyAgICAgIF9TX25vX2NvcHksCisgICAgICBfU19maXJzdF9vbmx5LAorICAgICAgX1NfbWF0Y2hfZmxhZ19sYXN0CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFRoaXMgaXMgYSBiaXRtYXNrIHR5cGUgaW5kaWNhdGluZyByZWdleCBtYXRjaGluZyBydWxlcy4KKyAgICoKKyAgICogVGhlIEBjIG1hdGNoX2ZsYWdfdHlwZSBpcyBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJ1dCBpdCBpcyB2YWxpZCB0bworICAgKiBwZXJmb3JtIGJpdHdpc2Ugb3BlcmF0aW9ucyBvbiB0aGVzZSB2YWx1ZXMgYW5kIGV4cGVjdCB0aGUgcmlnaHQgdGhpbmcgdG8KKyAgICogaGFwcGVuLgorICAgKi8KKyAgdHlwZWRlZiBzdGQ6OmJpdHNldDxfU19tYXRjaF9mbGFnX2xhc3Q+IG1hdGNoX2ZsYWdfdHlwZTsKKworICAvKioKKyAgICogVGhlIGRlZmF1bHQgbWF0Y2hpbmcgcnVsZXMuCisgICAqLworICBzdGF0aWMgY29uc3QgbWF0Y2hfZmxhZ190eXBlIG1hdGNoX2RlZmF1bHQgICAgID0gMDsKKworICAvKioKKyAgICogVGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgc2VxdWVuY2UgW2ZpcnN0LCBsYXN0KSBpcyB0cmVhdGVkIGFzIHRob3VnaCBpdAorICAgKiBpcyBub3QgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUsIHNvIHRoZSBjaGFyYWN0ZXIgKF4pIGluIHRoZSByZWd1bGFyCisgICAqIGV4cHJlc3Npb24gc2hhbGwgbm90IG1hdGNoIFtmaXJzdCwgZmlyc3QpLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9ub3RfYm9sICAgICA9IDEgPDwgX1Nfbm90X2JvbDsKKworICAvKioKKyAgICogVGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBzZXF1ZW5jZSBbZmlyc3QsIGxhc3QpIGlzIHRyZWF0ZWQgYXMgdGhvdWdoIGl0CisgICAqIGlzIG5vdCBhdCB0aGUgZW5kIG9mIGEgbGluZSwgc28gdGhlIGNoYXJhY3RlciAoJCkgaW4gdGhlIHJlZ3VsYXIKKyAgICogZXhwcmVzc2lvbiBzaGFsbCBub3QgbWF0Y2ggW2xhc3QsIGxhc3QpLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9ub3RfZW9sICAgICA9IDEgPDwgX1Nfbm90X2VvbDsKKyAgIAorICAvKioKKyAgICogVGhlIGV4cHJlc3Npb24gXFxiIGlzIG5vdCBtYXRjaGVkIGFnYWluc3QgdGhlIHN1Yi1zZXF1ZW5jZQorICAgKiBbZmlyc3QsZmlyc3QpLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9ub3RfYm93ICAgICA9IDEgPDwgX1Nfbm90X2JvdzsKKyAgIAorICAvKioKKyAgICogVGhlIGV4cHJlc3Npb24gXFxiIHNob3VsZCBub3QgYmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBzdWItc2VxdWVuY2UKKyAgICogW2xhc3QsbGFzdCkuCisgICAqLworICBzdGF0aWMgY29uc3QgbWF0Y2hfZmxhZ190eXBlIG1hdGNoX25vdF9lb3cgICAgID0gMSA8PCBfU19ub3RfZW93OworICAgCisgIC8qKgorICAgKiBJZiBtb3JlIHRoYW4gb25lIG1hdGNoIGlzIHBvc3NpYmxlIHRoZW4gYW55IG1hdGNoIGlzIGFuIGFjY2VwdGFibGUKKyAgICogcmVzdWx0LgorICAgKi8KKyAgc3RhdGljIGNvbnN0IG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9hbnkgICAgICAgICA9IDEgPDwgX1NfYW55OworICAgCisgIC8qKgorICAgKiBUaGUgZXhwcmVzc2lvbiBkb2VzIG5vdCBtYXRjaCBhbiBlbXB0eSBzZXF1ZW5jZS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBtYXRjaF9mbGFnX3R5cGUgbWF0Y2hfbm90X251bGwgICAgPSAxIDw8IF9TX25vdF9udWxsOworICAgCisgIC8qKgorICAgKiBUaGUgZXhwcmVzc2lvbiBvbmx5IG1hdGNoZXMgYSBzdWItc2VxdWVuY2UgdGhhdCBiZWdpbnMgYXQgZmlyc3QgLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9jb250aW51b3VzICA9IDEgPDwgX1NfY29udGludW91czsKKyAgIAorICAvKioKKyAgICogLS1maXJzdCBpcyBhIHZhbGlkIGl0ZXJhdG9yIHBvc2l0aW9uLiAgV2hlbiB0aGlzIGZsYWcgaXMgc2V0IHRoZW4gdGhlCisgICAqIGZsYWdzIG1hdGNoX25vdF9ib2wgYW5kIG1hdGNoX25vdF9ib3cgYXJlIGlnbm9yZWQgYnkgdGhlIHJlZ3VsYXIKKyAgICogZXhwcmVzc2lvbiBhbGdvcml0aG1zIDcuMTEgYW5kIGl0ZXJhdG9ycyA3LjEyLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9wcmV2X2F2YWlsICA9IDEgPDwgX1NfcHJldl9hdmFpbDsKKworICAvKioKKyAgICogV2hlbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCBpcyB0byBiZSByZXBsYWNlZCBieSBhIG5ldyBzdHJpbmcsIHRoZQorICAgKiBuZXcgc3RyaW5nIGlzIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBydWxlcyB1c2VkIGJ5IHRoZSBFQ01BU2NyaXB0IHJlcGxhY2UKKyAgICogZnVuY3Rpb24gaW4gRUNNQS0gMjYyIFtFY21hIEludGVybmF0aW9uYWwsIEVDTUFTY3JpcHQgTGFuZ3VhZ2UKKyAgICogU3BlY2lmaWNhdGlvbiwgU3RhbmRhcmQgRWNtYS0yNjIsIHRoaXJkIGVkaXRpb24sIDE5OTldLCBwYXJ0IDE1LjUuNC4xMQorICAgKiBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UuIEluIGFkZGl0aW9uLCBkdXJpbmcgc2VhcmNoIGFuZCByZXBsYWNlCisgICAqIG9wZXJhdGlvbnMgYWxsIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uCisgICAqIGFyZSBsb2NhdGVkIGFuZCByZXBsYWNlZCwgYW5kIHNlY3Rpb25zIG9mIHRoZSBpbnB1dCB0aGF0IGRpZCBub3QgbWF0Y2gKKyAgICogdGhlIGV4cHJlc3Npb24gYXJlIGNvcGllZCB1bmNoYW5nZWQgdG8gdGhlIG91dHB1dCBzdHJpbmcuCisgICAqIAorICAgKiBGb3JtYXQgc3RyaW5ncyAoZnJvbSBFQ01BLTI2MiBbMTUuNS40LjExXSk6CisgICAqIEBsaSAkJCAgVGhlIGRvbGxhci1zaWduIGl0c2VsZiAoJCkKKyAgICogQGxpICQmICBUaGUgbWF0Y2hlZCBzdWJzdHJpbmcuCisgICAqIEBsaSAkYCAgVGhlIHBvcnRpb24gb2YgQGEgc3RyaW5nIHRoYXQgcHJlY2VkZXMgdGhlIG1hdGNoZWQgc3Vic3RyaW5nLgorICAgKiAgICAgICAgIFRoaXMgd291bGQgYmUgbWF0Y2hfcmVzdWx0czo6cHJlZml4KCkuCisgICAqIEBsaSAkJyAgVGhlIHBvcnRpb24gb2YgQGEgc3RyaW5nIHRoYXQgZm9sbG93cyB0aGUgbWF0Y2hlZCBzdWJzdHJpbmcuCisgICAqICAgICAgICAgVGhpcyB3b3VsZCBiZSBtYXRjaF9yZXN1bHRzOjpzdWZmaXgoKS4KKyAgICogQGxpICRuICBUaGUgbnRoIGNhcHR1cmUsIHdoZXJlIG4gaXMgaW4gWzEsOV0gYW5kICRuIGlzIG5vdCBmb2xsb3dlZCBieSBhCisgICAqICAgICAgICAgZGVjaW1hbCBkaWdpdC4gIElmIG4gPD0gbWF0Y2hfcmVzdWx0czo6c2l6ZSgpIGFuZCB0aGUgbnRoIGNhcHR1cmUKKyAgICogICAgICAgICBpcyB1bmRlZmluZWQsIHVzZSB0aGUgZW1wdHkgc3RyaW5nIGluc3RlYWQuICBJZiBuID4KKyAgICogICAgICAgICBtYXRjaF9yZXN1bHRzOjpzaXplKCksIHRoZSByZXN1bHQgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KKyAgICogQGxpICRubiBUaGUgbm50aCBjYXB0dXJlLCB3aGVyZSBubiBpcyBhIHR3by1kaWdpdCBkZWNpbWFsIG51bWJlciBvbgorICAgKiAgICAgICAgIFswMSwgOTldLiAgSWYgbm4gPD0gbWF0Y2hfcmVzdWx0czo6c2l6ZSgpIGFuZCB0aGUgbnRoIGNhcHR1cmUgaXMKKyAgICogICAgICAgICB1bmRlZmluZWQsIHVzZSB0aGUgZW1wdHkgc3RyaW5nIGluc3RlYWQuIElmCisgICAqICAgICAgICAgbm4gPiBtYXRjaF9yZXN1bHRzOjpzaXplKCksIHRoZSByZXN1bHQgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KKyAgICovCisgIHN0YXRpYyBjb25zdCBtYXRjaF9mbGFnX3R5cGUgZm9ybWF0X2RlZmF1bHQgICAgPSAwOworCisgIC8qKgorICAgKiBXaGVuIGEgcmVndWxhciBleHByZXNzaW9uIG1hdGNoIGlzIHRvIGJlIHJlcGxhY2VkIGJ5IGEgbmV3IHN0cmluZywgdGhlCisgICAqIG5ldyBzdHJpbmcgaXMgY29uc3RydWN0ZWQgdXNpbmcgdGhlIHJ1bGVzIHVzZWQgYnkgdGhlIFBPU0lYIHNlZCB1dGlsaXR5CisgICAqIGluIElFRUUgU3RkIDEwMDMuMS0gMjAwMSBbSUVFRSwgSW5mb3JtYXRpb24gVGVjaG5vbG9neSAtLSBQb3J0YWJsZQorICAgKiBPcGVyYXRpbmcgU3lzdGVtIEludGVyZmFjZSAoUE9TSVgpLCBJRUVFIFN0YW5kYXJkIDEwMDMuMS0yMDAxXS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBtYXRjaF9mbGFnX3R5cGUgZm9ybWF0X3NlZCAgICAgICAgPSAxIDw8IF9TX3NlZDsKKworICAvKioKKyAgICogRHVyaW5nIGEgc2VhcmNoIGFuZCByZXBsYWNlIG9wZXJhdGlvbiwgc2VjdGlvbnMgb2YgdGhlIGNoYXJhY3RlcgorICAgKiBjb250YWluZXIgc2VxdWVuY2UgYmVpbmcgc2VhcmNoZWQgdGhhdCBkbyBub3QgbWF0Y2ggdGhlIHJlZ3VsYXIKKyAgICogZXhwcmVzc2lvbiBzaGFsbCBub3QgYmUgY29waWVkIHRvIHRoZSBvdXRwdXQgc3RyaW5nLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IG1hdGNoX2ZsYWdfdHlwZSBmb3JtYXRfbm9fY29weSAgICA9IDEgPDwgX1Nfbm9fY29weTsKKworICAvKioKKyAgICogV2hlbiBzcGVjaWZpZWQgZHVyaW5nIGEgc2VhcmNoIGFuZCByZXBsYWNlIG9wZXJhdGlvbiwgb25seSB0aGUgZmlyc3QKKyAgICogb2NjdXJyZW5jZSBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uIHNoYWxsIGJlIHJlcGxhY2VkLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IG1hdGNoX2ZsYWdfdHlwZSBmb3JtYXRfZmlyc3Rfb25seSA9IDEgPDwgX1NfZmlyc3Rfb25seTsKKworICAvL0B9CisKKyAgLyoqCisgICAqIEBuYW1lIDUuMyBFcnJvciBUeXBlcworICAgKi8KKyAgLy9AeworIAorICBlbnVtIGVycm9yX3R5cGUKKyAgICB7CisgICAgICBfU19lcnJvcl9jb2xsYXRlLAorICAgICAgX1NfZXJyb3JfY3R5cGUsCisgICAgICBfU19lcnJvcl9lc2NhcGUsCisgICAgICBfU19lcnJvcl9iYWNrcmVmLAorICAgICAgX1NfZXJyb3JfYnJhY2ssCisgICAgICBfU19lcnJvcl9wYXJlbiwKKyAgICAgIF9TX2Vycm9yX2JyYWNlLAorICAgICAgX1NfZXJyb3JfYmFkYnJhY2UsCisgICAgICBfU19lcnJvcl9yYW5nZSwKKyAgICAgIF9TX2Vycm9yX3NwYWNlLAorICAgICAgX1NfZXJyb3JfYmFkcmVwZWF0LAorICAgICAgX1NfZXJyb3JfY29tcGxleGl0eSwKKyAgICAgIF9TX2Vycm9yX3N0YWNrLAorICAgICAgX1NfZXJyb3JfbGFzdAorICAgIH07CisKKyAgLyoqIFRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBhbiBpbnZhbGlkIGNvbGxhdGluZyBlbGVtZW50IG5hbWUuICovCisgIHN0YXRpYyBjb25zdCBlcnJvcl90eXBlIGVycm9yX2NvbGxhdGUoX1NfZXJyb3JfY29sbGF0ZSk7CisKKyAgLyoqIFRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBhbiBpbnZhbGlkIGNoYXJhY3RlciBjbGFzcyBuYW1lLiAqLworICBzdGF0aWMgY29uc3QgZXJyb3JfdHlwZSBlcnJvcl9jdHlwZShfU19lcnJvcl9jdHlwZSk7CisKKyAgLyoqCisgICAqIFRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBhbiBpbnZhbGlkIGVzY2FwZWQgY2hhcmFjdGVyLCBvciBhIHRyYWlsaW5nCisgICAqIGVzY2FwZS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBlcnJvcl90eXBlIGVycm9yX2VzY2FwZShfU19lcnJvcl9lc2NhcGUpOworCisgIC8qKiBUaGUgZXhwcmVzc2lvbiBjb250YWluZWQgYW4gaW52YWxpZCBiYWNrIHJlZmVyZW5jZS4gKi8KKyAgc3RhdGljIGNvbnN0IGVycm9yX3R5cGUgZXJyb3JfYmFja3JlZihfU19lcnJvcl9iYWNrcmVmKTsKKworICAvKiogVGhlIGV4cHJlc3Npb24gY29udGFpbmVkIG1pc21hdGNoZWQgWyBhbmQgXS4gKi8KKyAgc3RhdGljIGNvbnN0IGVycm9yX3R5cGUgZXJyb3JfYnJhY2soX1NfZXJyb3JfYnJhY2spOworCisgIC8qKiBUaGUgZXhwcmVzc2lvbiBjb250YWluZWQgbWlzbWF0Y2hlZCAoIGFuZCApLiAqLworICBzdGF0aWMgY29uc3QgZXJyb3JfdHlwZSBlcnJvcl9wYXJlbihfU19lcnJvcl9wYXJlbik7CisKKyAgLyoqIFRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBtaXNtYXRjaGVkIHsgYW5kIH0gKi8KKyAgc3RhdGljIGNvbnN0IGVycm9yX3R5cGUgZXJyb3JfYnJhY2UoX1NfZXJyb3JfYnJhY2UpOworCisgIC8qKiBUaGUgZXhwcmVzc2lvbiBjb250YWluZWQgYW4gaW52YWxpZCByYW5nZSBpbiBhIHt9IGV4cHJlc3Npb24uICovCisgIHN0YXRpYyBjb25zdCBlcnJvcl90eXBlIGVycm9yX2JhZGJyYWNlKF9TX2Vycm9yX2JhZGJyYWNlKTsKKworICAvKioKKyAgICogVGhlIGV4cHJlc3Npb24gY29udGFpbmVkIGFuIGludmFsaWQgY2hhcmFjdGVyIHJhbmdlLAorICAgKiBzdWNoIGFzIFtiLWFdIGluIG1vc3QgZW5jb2RpbmdzLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IGVycm9yX3R5cGUgZXJyb3JfcmFuZ2UoX1NfZXJyb3JfcmFuZ2UpOworCisgIC8qKgorICAgKiBUaGVyZSB3YXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBjb252ZXJ0IHRoZSBleHByZXNzaW9uIGludG8gYQorICAgKiBmaW5pdGUgc3RhdGUgbWFjaGluZS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBlcnJvcl90eXBlIGVycm9yX3NwYWNlKF9TX2Vycm9yX3NwYWNlKTsKKworICAvKioKKyAgICogT25lIG9mIDxlbT4qPyt7PC9lbT4gd2FzIG5vdCBwcmVjZWRlZCBieSBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICovCisgIHN0YXRpYyBjb25zdCBlcnJvcl90eXBlIGVycm9yX2JhZHJlcGVhdChfU19lcnJvcl9iYWRyZXBlYXQpOworCisgIC8qKgorICAgKiBUaGUgY29tcGxleGl0eSBvZiBhbiBhdHRlbXB0ZWQgbWF0Y2ggYWdhaW5zdCBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgKiBleGNlZWRlZCBhIHByZS1zZXQgbGV2ZWwuCisgICAqLworICBzdGF0aWMgY29uc3QgZXJyb3JfdHlwZSBlcnJvcl9jb21wbGV4aXR5KF9TX2Vycm9yX2NvbXBsZXhpdHkpOworCisgIC8qKgorICAgKiBUaGVyZSB3YXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUKKyAgICogcmVndWxhciBleHByZXNzaW9uIGNvdWxkIG1hdGNoIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IGVycm9yX3R5cGUgZXJyb3Jfc3RhY2soX1NfZXJyb3Jfc3RhY2spOworCisgIC8vQH0KK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorCitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFs3LjhdIENsYXNzIHJlZ2V4X2Vycm9yCisgIC8qKgorICAgKiAgQGJyaWVmIEEgcmVndWxhciBleHByZXNzaW9uIGV4Y2VwdGlvbiBjbGFzcy4KKyAgICogIEBpbmdyb3VwIGV4Y2VwdGlvbnMKKyAgICoKKyAgICogIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gbGlicmFyeSB0aHJvd3Mgb2JqZWN0cyBvZiB0aGlzIGNsYXNzIG9uIGVycm9yLgorICAgKi8KKyAgY2xhc3MgcmVnZXhfZXJyb3IKKyAgOiBwdWJsaWMgc3RkOjpydW50aW1lX2Vycm9yCisgIHsKKyAgcHVibGljOgorICAgIC8qKgorICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgcmVnZXhfZXJyb3Igb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGVjb2RlIHRoZSByZWdleCBlcnJvciBjb2RlLgorICAgICAqLworICAgIGV4cGxpY2l0CisgICAgcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl90eXBlIF9fZWNvZGUpCisgICAgOiBzdGQ6OnJ1bnRpbWVfZXJyb3IoInJlZ2V4X2Vycm9yIiksIF9NX2NvZGUoX19lY29kZSkKKyAgICB7IH0KKworICAgIC8qKgorICAgICAqIEBicmllZiBHZXRzIHRoZSByZWdleCBlcnJvciBjb2RlLgorICAgICAqCisgICAgICogQHJldHVybnMgdGhlIHJlZ2V4IGVycm9yIGNvZGUuCisgICAgICovCisgICAgcmVnZXhfY29uc3RhbnRzOjplcnJvcl90eXBlCisgICAgY29kZSgpIGNvbnN0CisgICAgeyByZXR1cm4gX01fY29kZTsgfQorCisgIHByb3RlY3RlZDoKKyAgICByZWdleF9jb25zdGFudHM6OmVycm9yX3R5cGUgX01fY29kZTsKKyAgfTsKKworICAvLyBbNy43XSBDbGFzcyByZWdleF90cmFpdHMKKyAgLyoqCisgICAqIEBicmllZiBEZXNjcmliZXMgYXNwZWN0cyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICoKKyAgICogQSByZWd1bGFyIGV4cHJlc3Npb24gdHJhaXRzIGNsYXNzIHRoYXQgc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudHMgb2YgdHIxCisgICAqIHNlY3Rpb24gWzcuMl0uCisgICAqCisgICAqIFRoZSBjbGFzcyAlcmVnZXggaXMgcGFyYW1ldGVyaXplZCBhcm91bmQgYSBzZXQgb2YgcmVsYXRlZCB0eXBlcyBhbmQKKyAgICogZnVuY3Rpb25zIHVzZWQgdG8gY29tcGxldGUgdGhlIGRlZmluaXRpb24gb2YgaXRzIHNlbWFudGljcy4gIFRoaXMgY2xhc3MKKyAgICogc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudHMgb2Ygc3VjaCBhIHRyYWl0cyBjbGFzcy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlPgorICAgIHN0cnVjdCByZWdleF90cmFpdHMKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQ2hfdHlwZSAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19zdHJpbmc8Y2hhcl90eXBlPiBzdHJpbmdfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpsb2NhbGUgICAgICAgICAgICAgICAgICBsb2NhbGVfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpjdHlwZV9iYXNlOjptYXNrICAgICAgICBjaGFyX2NsYXNzX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgZGVmYXVsdCB0cmFpdHMgb2JqZWN0LgorICAgICAgICovCisgICAgICByZWdleF90cmFpdHMoKQorICAgICAgeyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdpdmVzIHRoZSBsZW5ndGggb2YgYSBDLXN0eWxlIHN0cmluZyBzdGFydGluZyBhdCBAcCBfX3AuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcCBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGEgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBiZXR3ZWVuIEBwICpfX3AgYW5kIHRoZSBmaXJzdAorICAgICAgICogZGVmYXVsdC1pbml0aWFsaXplZCB2YWx1ZSBvZiB0eXBlIEBwIGNoYXJfdHlwZS4gIEluIG90aGVyIHdvcmRzLCB1c2VzCisgICAgICAgKiB0aGUgQy1zdHJpbmcgYWxnb3JpdGhtIGZvciBkZXRlcm1pbmluZyB0aGUgbGVuZ3RoIG9mIGEgc2VxdWVuY2Ugb2YKKyAgICAgICAqIGNoYXJhY3RlcnMuCisgICAgICAgKi8KKyAgICAgIHN0YXRpYyBzdGQ6OnNpemVfdAorICAgICAgbGVuZ3RoKGNvbnN0IGNoYXJfdHlwZSogX19wKQorICAgICAgeyByZXR1cm4gc3RyaW5nX3R5cGU6OnRyYWl0c190eXBlOjpsZW5ndGgoX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBQZXJmb3JtcyB0aGUgaWRlbnRpdHkgdHJhbnNsYXRpb24uCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGMgQSBjaGFyYWN0ZXIgdG8gdGhlIGxvY2FsZS1zcGVjaWZpYyBjaGFyYWN0ZXIgc2V0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIGMuCisgICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZQorICAgICAgdHJhbnNsYXRlKGNoYXJfdHlwZSBfX2MpIGNvbnN0CisgICAgICB7IHJldHVybiBfX2M7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgVHJhbnNsYXRlcyBhIGNoYXJhY3RlciBpbnRvIGEgY2FzZS1pbnNlbnNpdGl2ZSBlcXVpdmFsZW50LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBjIEEgY2hhcmFjdGVyIHRvIHRoZSBsb2NhbGUtc3BlY2lmaWMgY2hhcmFjdGVyIHNldC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIGxvd2VyLWNhc2UgZXF1aXZhbGVudCBvZiBjLgorICAgICAgICogQHRocm93cyBzdGQ6OmJhZF9jYXN0IGlmIHRoZSBpbWJ1ZWQgbG9jYWxlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGN0eXBlCisgICAgICAgKiAgICAgICAgIGZhY2V0LgorICAgICAgICovCisgICAgICBjaGFyX3R5cGUKKyAgICAgIHRyYW5zbGF0ZV9ub2Nhc2UoY2hhcl90eXBlIF9fYykgY29uc3QKKyAgICAgIHsKKwl1c2luZyBzdGQ6OmN0eXBlOworCXVzaW5nIHN0ZDo6dXNlX2ZhY2V0OworCXJldHVybiB1c2VfZmFjZXQ8Y3R5cGU8Y2hhcl90eXBlPiA+KF9NX2xvY2FsZSkudG9sb3dlcihfX2MpOworICAgICAgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGEgc29ydCBrZXkgZm9yIGEgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBmaXJzdCBiZWdpbm5pbmcgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgICAqIEBwYXJhbSBsYXN0ICBvbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UuCisgICAgICAgKgorICAgICAgICogUmV0dXJucyBhIHNvcnQga2V5IGZvciB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGRlc2lnbmF0ZWQgYnkgdGhlCisgICAgICAgKiBpdGVyYXRvciByYW5nZSBbRjEsIEYyKSBzdWNoIHRoYXQgaWYgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBbRzEsIEcyKQorICAgICAgICogc29ydHMgYmVmb3JlIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgW0gxLCBIMikgdGhlbgorICAgICAgICogdi50cmFuc2Zvcm0oRzEsIEcyKSA8IHYudHJhbnNmb3JtKEgxLCBIMikuCisgICAgICAgKgorICAgICAgICogV2hhdCB0aGlzIHJlYWxseSBkb2VzIGlzIHByb3ZpZGUgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gY29tcGFyZSBhCisgICAgICAgKiBzdHJpbmcgdG8gbXVsdGlwbGUgb3RoZXIgc3RyaW5ncyBpbiBsb2NhbGVzIHdpdGggZmFuY3kgY29sbGF0aW9uCisgICAgICAgKiBydWxlcyBhbmQgZXF1aXZhbGVuY2UgY2xhc3Nlcy4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBhIGxvY2FsZS1zcGVjaWZpYyBzb3J0IGtleSBlcXVpdmFsZW50IHRvIHRoZSBpbnB1dCByYW5nZS4KKyAgICAgICAqCisgICAgICAgKiBAdGhyb3dzIHN0ZDo6YmFkX2Nhc3QgaWYgdGhlIGN1cnJlbnQgbG9jYWxlIGRvZXMgbm90IGhhdmUgYSBjb2xsYXRlCisgICAgICAgKiAgICAgICAgIGZhY2V0LgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRndkX2l0ZXI+CisgICAgICAgIHN0cmluZ190eXBlCisgICAgICAgIHRyYW5zZm9ybShfRndkX2l0ZXIgX19maXJzdCwgX0Z3ZF9pdGVyIF9fbGFzdCkgY29uc3QKKyAgICAgICAgeworCSAgdXNpbmcgc3RkOjpjb2xsYXRlOworCSAgdXNpbmcgc3RkOjp1c2VfZmFjZXQ7CisJICBjb25zdCBjb2xsYXRlPF9DaF90eXBlPiYgX19jKHVzZV9mYWNldDwKKwkJCQkgICAgICAgY29sbGF0ZTxfQ2hfdHlwZT4gPihfTV9sb2NhbGUpKTsKKwkgIHN0cmluZ190eXBlIF9fcyhfX2ZpcnN0LCBfX2xhc3QpOworCSAgcmV0dXJuIF9fYy50cmFuc2Zvcm0oX19zLmRhdGEoKSwgX19zLmRhdGEoKSArIF9fcy5zaXplKCkpOworCX0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRHVubm8uCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGZpcnN0IGJlZ2lubmluZyBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgICAgICogQHBhcmFtIGxhc3QgIG9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiBFZmZlY3RzOiBpZiB0eXBlaWQodXNlX2ZhY2V0PGNvbGxhdGU8X0NoX3R5cGU+ID4pID09CisgICAgICAgKiB0eXBlaWQoY29sbGF0ZV9ieW5hbWU8X0NoX3R5cGU+KSBhbmQgdGhlIGZvcm0gb2YgdGhlIHNvcnQga2V5CisgICAgICAgKiByZXR1cm5lZCBieSBjb2xsYXRlX2J5bmFtZTxfQ2hfdHlwZT46OnRyYW5zZm9ybShmaXJzdCwgbGFzdCkgaXMga25vd24KKyAgICAgICAqIGFuZCBjYW4gYmUgY29udmVydGVkIGludG8gYSBwcmltYXJ5IHNvcnQga2V5IHRoZW4gcmV0dXJucyB0aGF0IGtleSwKKyAgICAgICAqIG90aGVyd2lzZSByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4gV1RGPz8KKyAgICAgICAqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z3ZF9pdGVyPgorICAgICAgICBzdHJpbmdfdHlwZQorICAgICAgICB0cmFuc2Zvcm1fcHJpbWFyeShfRndkX2l0ZXIgX19maXJzdCwgX0Z3ZF9pdGVyIF9fbGFzdCkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgYSBjb2xsYXRpb24gZWxlbWVudCBieSBuYW1lLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBmaXJzdCBiZWdpbm5pbmcgb2YgdGhlIGNvbGxhdGlvbiBlbGVtZW50IG5hbWUuCisgICAgICAgKiBAcGFyYW0gbGFzdCAgb25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgY29sbGF0aW9uIGVsZW1lbnQgbmFtZS4KKyAgICAgICAqIAorICAgICAgICogQHJldHVybnMgYSBzZXF1ZW5jZSBvZiBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIHRoYXQgcmVwcmVzZW50cyB0aGUKKyAgICAgICAqIGNvbGxhdGluZyBlbGVtZW50IGNvbnNpc3Rpbmcgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBkZXNpZ25hdGVkIGJ5CisgICAgICAgKiB0aGUgaXRlcmF0b3IgcmFuZ2UgW2ZpcnN0LCBsYXN0KS4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlCisgICAgICAgKiBjaGFyYWN0ZXIgc2VxdWVuY2UgaXMgbm90IGEgdmFsaWQgY29sbGF0aW5nIGVsZW1lbnQuCisgICAgICAgKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gd2RfaXRlcj4KKyAgICAgICAgc3RyaW5nX3R5cGUKKyAgICAgICAgbG9va3VwX2NvbGxhdGVuYW1lKF9Gd2RfaXRlciBfX2ZpcnN0LCBfRndkX2l0ZXIgX19sYXN0KSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgTWFwcyBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIHRvIGEgbmFtZWQgY2hhcmFjdGVyCisgICAgICAgKiAgICAgICAgY2xhc3NpZmljYXRpb24uCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGZpcnN0IGJlZ2lubmluZyBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgICAgICogQHBhcmFtIGxhc3QgIG9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBhbiB1bnNwZWNpZmllZCB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIGNoYXJhY3RlcgorICAgICAgICogY2xhc3NpZmljYXRpb24gbmFtZWQgYnkgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBkZXNpZ25hdGVkIGJ5IHRoZQorICAgICAgICogaXRlcmF0b3IgcmFuZ2UgW2ZpcnN0LCBsYXN0KS4gVGhlIHZhbHVlIHJldHVybmVkIHNoYWxsIGJlIGluZGVwZW5kZW50CisgICAgICAgKiBvZiB0aGUgY2FzZSBvZiB0aGUgY2hhcmFjdGVycyBpbiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlLiBJZiB0aGUgbmFtZQorICAgICAgICogaXMgbm90IHJlY29nbml6ZWQgdGhlbiByZXR1cm5zIGEgdmFsdWUgdGhhdCBjb21wYXJlcyBlcXVhbCB0byAwLgorICAgICAgICoKKyAgICAgICAqIEF0IGxlYXN0IHRoZSBmb2xsb3dpbmcgbmFtZXMgKG9yIHRoZWlyIHdpZGUtY2hhcmFjdGVyIGVxdWl2YWxlbnQpIGFyZQorICAgICAgICogc3VwcG9ydGVkLgorICAgICAgICogLSBkCisgICAgICAgKiAtIHcKKyAgICAgICAqIC0gcworICAgICAgICogLSBhbG51bQorICAgICAgICogLSBhbHBoYQorICAgICAgICogLSBibGFuaworICAgICAgICogLSBjbnRybAorICAgICAgICogLSBkaWdpdAorICAgICAgICogLSBncmFwaAorICAgICAgICogLSBsb3dlcgorICAgICAgICogLSBwcmludAorICAgICAgICogLSBwdW5jdAorICAgICAgICogLSBzcGFjZQorICAgICAgICogLSB1cHBlcgorICAgICAgICogLSB4ZGlnaXQKKyAgICAgICAqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z3ZF9pdGVyPgorICAgICAgICBjaGFyX2NsYXNzX3R5cGUKKyAgICAgICAgbG9va3VwX2NsYXNzbmFtZShfRndkX2l0ZXIgX19maXJzdCwgX0Z3ZF9pdGVyIF9fbGFzdCkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIERldGVybWluZXMgaWYgQHAgYyBpcyBhIG1lbWJlciBvZiBhbiBpZGVudGlmaWVkIGNsYXNzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBjIGEgY2hhcmFjdGVyLgorICAgICAgICogQHBhcmFtIGYgYSBjbGFzcyB0eXBlIChhcyByZXR1cm5lZCBmcm9tIGxvb2t1cF9jbGFzc25hbWUpLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBAcCBjIGlzIGEgbWVtYmVyIG9mIHRoZSBjbGFzc2lmaWNhdGlvbgorICAgICAgICogcmVwcmVzZW50ZWQgYnkgQHAgZiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3Mgc3RkOjpiYWRfY2FzdCBpZiB0aGUgY3VycmVudCBsb2NhbGUgZG9lcyBub3QgaGF2ZSBhIGN0eXBlCisgICAgICAgKiAgICAgICAgIGZhY2V0LgorICAgICAgICovCisgICAgICBib29sCisgICAgICBpc2N0eXBlKF9DaF90eXBlIF9fYywgY2hhcl9jbGFzc190eXBlIF9fZikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnZlcnRzIGEgZGlnaXQgdG8gYW4gaW50LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBjaCAgICBhIGNoYXJhY3RlciByZXByZXNlbnRpbmcgYSBkaWdpdC4KKyAgICAgICAqIEBwYXJhbSByYWRpeCB0aGUgcmFkaXggaWYgdGhlIG51bWVyaWMgY29udmVyc2lvbiAobGltaXRlZCB0byA4LCAxMCwKKyAgICAgICAqICAgICAgICAgICAgICBvciAxNikuCisgICAgICAgKiAKKyAgICAgICAqIEByZXR1cm5zIHRoZSB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgZGlnaXQgY2ggaW4gYmFzZSByYWRpeCBpZiB0aGUKKyAgICAgICAqIGNoYXJhY3RlciBjaCBpcyBhIHZhbGlkIGRpZ2l0IGluIGJhc2UgcmFkaXg7IG90aGVyd2lzZSByZXR1cm5zIC0xLgorICAgICAgICovCisgICAgICBpbnQKKyAgICAgIHZhbHVlKF9DaF90eXBlIF9fY2gsIGludCBfX3JhZGl4KSBjb25zdDsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW1idWVzIHRoZSByZWdleF90cmFpdHMgb2JqZWN0IHdpdGggYSBjb3B5IG9mIGEgbmV3IGxvY2FsZS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gbG9jIEEgbG9jYWxlLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIGEgY29weSBvZiB0aGUgcHJldmlvdXMgbG9jYWxlIGluIHVzZSBieSB0aGUgcmVnZXhfdHJhaXRzCisgICAgICAgKiAgICAgICAgICBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQG5vdGUgQ2FsbGluZyBpbWJ1ZSB3aXRoIGEgZGlmZmVyZW50IGxvY2FsZSB0aGFuIHRoZSBvbmUgY3VycmVudGx5IGluCisgICAgICAgKiAgICAgICB1c2UgaW52YWxpZGF0ZXMgYWxsIGNhY2hlZCBkYXRhIGhlbGQgYnkgKnRoaXMuCisgICAgICAgKi8KKyAgICAgIGxvY2FsZV90eXBlCisgICAgICBpbWJ1ZShsb2NhbGVfdHlwZSBfX2xvYykKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fbG9jYWxlLCBfX2xvYyk7CisJcmV0dXJuIF9fbG9jOworICAgICAgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGEgY29weSBvZiB0aGUgY3VycmVudCBsb2NhbGUgaW4gdXNlIGJ5IHRoZSByZWdleF90cmFpdHMKKyAgICAgICAqIG9iamVjdC4KKyAgICAgICAqLworICAgICAgbG9jYWxlX3R5cGUKKyAgICAgIGdldGxvYygpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9sb2NhbGU7IH0KKyAgICAgIAorICAgIHByb3RlY3RlZDoKKyAgICAgIGxvY2FsZV90eXBlIF9NX2xvY2FsZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlPgorICAgIGJvb2wgcmVnZXhfdHJhaXRzPF9DaF90eXBlPjo6CisgICAgaXNjdHlwZShfQ2hfdHlwZSBfX2MsIGNoYXJfY2xhc3NfdHlwZSBfX2YpIGNvbnN0CisgICAgeworICAgICAgdXNpbmcgc3RkOjpjdHlwZTsKKyAgICAgIHVzaW5nIHN0ZDo6dXNlX2ZhY2V0OworICAgICAgY29uc3QgY3R5cGU8X0NoX3R5cGU+JiBfX2N0eXBlKHVzZV9mYWNldDwKKwkJCQkgICAgIGN0eXBlPF9DaF90eXBlPiA+KF9NX2xvY2FsZSkpOworICAgICAgCisgICAgICBpZiAoX19jdHlwZS5pcyhfX2MsIF9fZikpCisJcmV0dXJuIHRydWU7CisgICAgICAKKyAgICAgIC8vIHNwZWNpYWwgY2FzZSBvZiB1bmRlcnNjb3JlIGluIFtbOnc6XV0KKyAgICAgIGlmIChfX2MgPT0gX19jdHlwZS53aWRlbignXycpKQorCXsKKwkgIGNvbnN0IGNoYXIqIGNvbnN0IF9fd2JbXSA9ICJ3IjsKKwkgIGNoYXJfY2xhc3NfdHlwZSBfX3d0ID0gdGhpcy0+bG9va3VwX2NsYXNzbmFtZShfX3diLAorCQkJCQkJCV9fd2IgKyBzaXplb2YoX193YikpOworCSAgaWYgKF9fZiB8IF9fd3QpCisJICAgIHJldHVybiB0cnVlOworCX0KKyAgICAKKyAgICAgIC8vIHNwZWNpYWwgY2FzZSBvZiBbWzpzcGFjZTpdXSBpbiBbWzpibGFuazpdXQorICAgICAgaWYgKF9fYyA9PSBfX2N0eXBlLmlzc3BhY2UoX19jKSkKKwl7CisJICBjb25zdCBjaGFyKiBjb25zdCBfX2JiW10gPSAiYmxhbmsiOworCSAgY2hhcl9jbGFzc190eXBlIF9fYnQgPSB0aGlzLT5sb29rdXBfY2xhc3NuYW1lKF9fYmIsCisJCQkJCQkJX19iYiArIHNpemVvZihfX2JiKSk7CisJICBpZiAoX19mIHwgX19idCkKKwkgICAgcmV0dXJuIHRydWU7CisJfQorICAgICAgCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlPgorICAgIGludCByZWdleF90cmFpdHM8X0NoX3R5cGU+OjoKKyAgICB2YWx1ZShfQ2hfdHlwZSBfX2NoLCBpbnQgX19yYWRpeCkgY29uc3QKKyAgICB7CisgICAgICBzdGQ6OmJhc2ljX2lzdHJpbmdzdHJlYW08X0NoX3R5cGU+IF9faXMoc3RyaW5nX3R5cGUoMSwgX19jaCkpOworICAgICAgaW50IF9fdjsKKyAgICAgIGlmIChfX3JhZGl4ID09IDgpCisJX19pcyA+PiBzdGQ6Om9jdDsKKyAgICAgIGVsc2UgaWYgKF9fcmFkaXggPT0gMTYpCisJX19pcyA+PiBzdGQ6OmhleDsKKyAgICAgIF9faXMgPj4gX192OworICAgICAgcmV0dXJuIF9faXMuZmFpbCgpID8gLTEgOiBfX3Y7CisgICAgfQorCisgIC8vIFs3LjhdIENsYXNzIGJhc2ljX3JlZ2V4CisgIC8qKgorICAgKiBPYmplY3RzIG9mIHNwZWNpYWxpemF0aW9ucyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCByZWd1bGFyIGV4cHJlc3Npb25zCisgICAqIGNvbnN0cnVjdGVkIGZyb20gc2VxdWVuY2VzIG9mIGNoYXJhY3RlciB0eXBlIEBwIF9DaF90eXBlLgorICAgKgorICAgKiBTdG9yYWdlIGZvciB0aGUgcmVndWxhciBleHByZXNzaW9uIGlzIGFsbG9jYXRlZCBhbmQgZGVhbGxvY2F0ZWQgYXMKKyAgICogbmVjZXNzYXJ5IGJ5IHRoZSBtZW1iZXIgZnVuY3Rpb25zIG9mIHRoaXMgY2xhc3MuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cyA9IHJlZ2V4X3RyYWl0czxfQ2hfdHlwZT4gPgorICAgIGNsYXNzIGJhc2ljX3JlZ2V4CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVzOgorICAgICAgdHlwZWRlZiBfQ2hfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIGZsYWdfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1J4X3RyYWl0czo6bG9jYWxlX3R5cGUgIGxvY2FsZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUnhfdHJhaXRzOjpzdHJpbmdfdHlwZSAgc3RyaW5nX3R5cGU7CisKKyAgICAgIC8qKgorICAgICAgICogQG5hbWUgQ29uc3RhbnRzCisgICAgICAgKiB0cjEgWzcuOC4xXSBzdGQgWzI4LjguMV0KKyAgICAgICAqLworICAgICAgLy9AeworICAgICAgc3RhdGljIGNvbnN0IHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIGljYXNlCisgICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjppY2FzZTsKKyAgICAgIHN0YXRpYyBjb25zdCByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBub3N1YnMKKyAgICAgICAgPSByZWdleF9jb25zdGFudHM6Om5vc3ViczsKKyAgICAgIHN0YXRpYyBjb25zdCByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBvcHRpbWl6ZQorICAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6b3B0aW1pemU7CisgICAgICBzdGF0aWMgY29uc3QgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgY29sbGF0ZQorICAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6Y29sbGF0ZTsKKyAgICAgIHN0YXRpYyBjb25zdCByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBFQ01BU2NyaXB0CisgICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0OworICAgICAgc3RhdGljIGNvbnN0IHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIGJhc2ljCisgICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjpiYXNpYzsKKyAgICAgIHN0YXRpYyBjb25zdCByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBleHRlbmRlZAorICAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6ZXh0ZW5kZWQ7CisgICAgICBzdGF0aWMgY29uc3QgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgYXdrCisgICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjphd2s7CisgICAgICBzdGF0aWMgY29uc3QgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgZ3JlcAorICAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6Z3JlcDsKKyAgICAgIHN0YXRpYyBjb25zdCByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBlZ3JlcAorICAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6ZWdyZXA7CisgICAgICAvL0B9CisKKyAgICAgIC8vIFs3LjguMl0gY29uc3RydWN0L2NvcHkvZGVzdHJveQorICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uIHRoYXQgZG9lcyBub3QgbWF0Y2ggYW55CisgICAgICAgKiBjaGFyYWN0ZXIgc2VxdWVuY2UuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4KCkKKyAgICAgIDogX01fZmxhZ3MocmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KSwgX01fcGF0dGVybigpLCBfTV9tYXJrX2NvdW50KDApCisgICAgICB7IF9NX2NvbXBpbGUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIHNlcXVlbmNlCisgICAgICAgKiBbcCwgcCArIGNoYXJfdHJhaXRzPF9DaF90eXBlPjo6bGVuZ3RoKHApKSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgKiBmbGFncyBpbiBAcCBmLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBwIEEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgYSBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcKKyAgICAgICAqICAgICAgICAgIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gZiBGbGFncyBpbmRpY2F0aW5nIHRoZSBzeW50YXggcnVsZXMgYW5kIG9wdGlvbnMuCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBAcCBwIGlzIG5vdCBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX3JlZ2V4KGNvbnN0IF9DaF90eXBlKiBfX3AsCisJCSAgZmxhZ190eXBlIF9fZiA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKyAgICAgIDogX01fZmxhZ3MoX19mKSwgX01fcGF0dGVybihfX3ApLCBfTV9tYXJrX2NvdW50KDApCisgICAgICB7IF9NX2NvbXBpbGUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIHNlcXVlbmNlCisgICAgICAgKiBbcCwgcCArIGxlbikgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBmbGFncyBpbiBAcCBmLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBwICAgQSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBhIHN0cmluZyBjb250YWluaW5nIGEgcmVndWxhcgorICAgICAgICogICAgICAgICAgICBleHByZXNzaW9uLgorICAgICAgICogQHBhcmFtIGxlbiBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICogQHBhcmFtIGYgICBGbGFncyBpbmRpY2F0aW5nIHRoZSBzeW50YXggcnVsZXMgYW5kIG9wdGlvbnMuCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBAcCBwIGlzIG5vdCBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqLworICAgICAgYmFzaWNfcmVnZXgoY29uc3QgX0NoX3R5cGUqIF9fcCwgc3RkOjpzaXplX3QgX19sZW4sIGZsYWdfdHlwZSBfX2YpCisgICAgICA6IF9NX2ZsYWdzKF9fZikgLCBfTV9wYXR0ZXJuKF9fcCwgX19sZW4pLCBfTV9tYXJrX2NvdW50KDApCisgICAgICB7IF9NX2NvbXBpbGUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb3B5LWNvbnN0cnVjdHMgYSBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHJocyBBIEBwIHJlZ2V4IG9iamVjdC4KKyAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4KGNvbnN0IGJhc2ljX3JlZ2V4JiBfX3JocykKKyAgICAgIDogX01fZmxhZ3MoX19yaHMuX01fZmxhZ3MpLCBfTV9wYXR0ZXJuKF9fcmhzLl9NX3BhdHRlcm4pLAorCV9NX21hcmtfY291bnQoX19yaHMuX01fbWFya19jb3VudCkKKyAgICAgIHsgX01fY29tcGlsZSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSB0aGUgc3RyaW5nCisgICAgICAgKiBAcCBzIGludGVycHJldGVkIGFjY29yZGluZyB0byB0aGUgZmxhZ3MgaW4gQHAgZi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gcyBBIHN0cmluZyBjb250YWluaW5nIGEgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICogQHBhcmFtIGYgRmxhZ3MgaW5kaWNhdGluZyB0aGUgc3ludGF4IHJ1bGVzIGFuZCBvcHRpb25zLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgcmVnZXhfZXJyb3IgaWYgQHAgcyBpcyBub3QgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYz4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgYmFzaWNfcmVnZXgoY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlLCBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3MsCisJCSAgICBmbGFnX3R5cGUgX19mID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KQorCTogX01fZmxhZ3MoX19mKSwgX01fcGF0dGVybihfX3MuYmVnaW4oKSwgX19zLmVuZCgpKSwgX01fbWFya19jb3VudCgwKQorICAgICAgICB7IF9NX2NvbXBpbGUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIHJhbmdlCisgICAgICAgKiBbZmlyc3QsIGxhc3QpIGludGVycHJldGVkIGFjY29yZGluZyB0byB0aGUgZmxhZ3MgaW4gQHAgZi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gZmlyc3QgVGhlIHN0YXJ0IG9mIGEgcmFuZ2UgY29udGFpbmluZyBhIHZhbGlkIHJlZ3VsYXIKKyAgICAgICAqICAgICAgICAgICAgICBleHByZXNzaW9uLgorICAgICAgICogQHBhcmFtIGxhc3QgIFRoZSBlbmQgb2YgYSByYW5nZSBjb250YWluaW5nIGEgdmFsaWQgcmVndWxhcgorICAgICAgICogICAgICAgICAgICAgIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gZiAgICAgVGhlIGZvcm1hdCBmbGFncyBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgcmVnZXhfZXJyb3IgaWYgQHAgW2ZpcnN0LCBsYXN0KSBpcyBub3QgYSB2YWxpZCByZWd1bGFyCisgICAgICAgKiAgICAgICAgIGV4cHJlc3Npb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBiYXNpY19yZWdleChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIAorCQkgICAgZmxhZ190eXBlIF9fZiA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKwk6IF9NX2ZsYWdzKF9fZiksIF9NX3BhdHRlcm4oX19maXJzdCwgX19sYXN0KSwgX01fbWFya19jb3VudCgwKQorICAgICAgICB7IF9NX2NvbXBpbGUoKTsgfQorCisjaWZkZWYgX0dMSUJDWFhfSU5DTFVERV9BU19DWFgxMQorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhIGJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbiBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGwgIFRoZSBpbml0aWFsaXplciBsaXN0LgorICAgICAgICogQHBhcmFtIGYgIFRoZSBmb3JtYXQgZmxhZ3Mgb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqCisgICAgICAgKiBAdGhyb3dzIHJlZ2V4X2Vycm9yIGlmIEBwIGwgaXMgbm90IGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleChpbml0aWFsaXplcl9saXN0PF9DaF90eXBlPiBfX2wsCisJCSAgZmxhZ190eXBlIF9fZiA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKwk6IF9NX2ZsYWdzKF9fZiksIF9NX3BhdHRlcm4oX19sLmJlZ2luKCksIF9fbC5lbmQoKSksIF9NX21hcmtfY291bnQoMCkKKyAgICAgICAgeyBfTV9jb21waWxlKCk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBEZXN0cm95cyBhIGJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqLworICAgICAgfmJhc2ljX3JlZ2V4KCkKKyAgICAgIHsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBBc3NpZ25zIG9uZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gYW5vdGhlci4KKyAgICAgICAqLworICAgICAgYmFzaWNfcmVnZXgmCisgICAgICBvcGVyYXRvcj0oY29uc3QgYmFzaWNfcmVnZXgmIF9fcmhzKQorICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKF9fcmhzKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXBsYWNlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoIGEgbmV3IG9uZSBjb25zdHJ1Y3RlZCBmcm9tCisgICAgICAgKiBhIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gQSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBhIG51bGwtdGVybWluYXRlZCBDLXN0eWxlIHN0cmluZworICAgICAgICogICAgICAgIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9DaF90eXBlKiBfX3ApCisgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oX19wLCBmbGFncygpKTsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXBsYWNlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoIGEgbmV3IG9uZSBjb25zdHJ1Y3RlZCBmcm9tCisgICAgICAgKiBhIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gQSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgICBvcGVyYXRvcj0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlLCBfQ2hfdHlwZXJhaXRzLCBfQWxsb2NhdG9yPiYgX19zKQorICAgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oX19zLCBmbGFncygpKTsgfQorCisgICAgICAvLyBbNy44LjNdIGFzc2lnbgorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgdGhlIHJlYWwgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gdGhhdCBBbm90aGVyIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgYXNzaWduKGNvbnN0IGJhc2ljX3JlZ2V4JiBfX3RoYXQpCisgICAgICB7CisJYmFzaWNfcmVnZXggX190bXAoX190aGF0KTsKKwl0aGlzLT5zd2FwKF9fdG1wKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEFzc2lnbnMgYSBuZXcgcmVndWxhciBleHByZXNzaW9uIHRvIGEgcmVnZXggb2JqZWN0IGZyb20gYQorICAgICAgICogQy1zdHlsZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAqIHBhdHRlcm4uCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHAgICAgIEEgcG9pbnRlciB0byBhIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBjb250YWluaW5nCisgICAgICAgKiAgICAgICAgICAgICAgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KKyAgICAgICAqIEBwYXJhbSBmbGFncyBTeW50YXggb3B0aW9uIGZsYWdzLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgcmVnZXhfZXJyb3IgaWYgcCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uCisgICAgICAgKiBwYXR0ZXJuIGludGVycHJldGVkIGFjY29yZGluZyB0byBAcCBmbGFncy4gIElmIHJlZ2V4X2Vycm9yIGlzIHRocm93biwKKyAgICAgICAqICp0aGlzIHJlbWFpbnMgdW5jaGFuZ2VkLgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleCYKKyAgICAgIGFzc2lnbihjb25zdCBfQ2hfdHlwZSogX19wLAorCSAgICAgZmxhZ190eXBlIF9fZmxhZ3MgPSByZWdleF9jb25zdGFudHM6OkVDTUFTY3JpcHQpCisgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oc3RyaW5nX3R5cGUoX19wKSwgX19mbGFncyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQXNzaWducyBhIG5ldyByZWd1bGFyIGV4cHJlc3Npb24gdG8gYSByZWdleCBvYmplY3QgZnJvbSBhCisgICAgICAgKiBDLXN0eWxlIHN0cmluZyBjb250YWluaW5nIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHAgICAgIEEgcG9pbnRlciB0byBhIEMtc3R5bGUgc3RyaW5nIGNvbnRhaW5pbmcgYQorICAgICAgICogICAgICAgICAgICAgIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgorICAgICAgICogQHBhcmFtIGxlbiAgIFRoZSBsZW5ndGggb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHN0cmluZy4KKyAgICAgICAqIEBwYXJhbSBmbGFncyBTeW50YXggb3B0aW9uIGZsYWdzLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgcmVnZXhfZXJyb3IgaWYgcCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uCisgICAgICAgKiBwYXR0ZXJuIGludGVycHJldGVkIGFjY29yZGluZyB0byBAcCBmbGFncy4gIElmIHJlZ2V4X2Vycm9yIGlzIHRocm93biwKKyAgICAgICAqICp0aGlzIHJlbWFpbnMgdW5jaGFuZ2VkLgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleCYKKyAgICAgIGFzc2lnbihjb25zdCBfQ2hfdHlwZSogX19wLCBzdGQ6OnNpemVfdCBfX2xlbiwgZmxhZ190eXBlIF9fZmxhZ3MpCisgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oc3RyaW5nX3R5cGUoX19wLCBfX2xlbiksIF9fZmxhZ3MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEFzc2lnbnMgYSBuZXcgcmVndWxhciBleHByZXNzaW9uIHRvIGEgcmVnZXggb2JqZWN0IGZyb20gYSAKKyAgICAgICAqIHN0cmluZyBjb250YWluaW5nIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHMgICAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KKyAgICAgICAqIEBwYXJhbSBmbGFncyBTeW50YXggb3B0aW9uIGZsYWdzLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgcmVnZXhfZXJyb3IgaWYgcCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uCisgICAgICAgKiBwYXR0ZXJuIGludGVycHJldGVkIGFjY29yZGluZyB0byBAcCBmbGFncy4gIElmIHJlZ2V4X2Vycm9yIGlzIHRocm93biwKKyAgICAgICAqICp0aGlzIHJlbWFpbnMgdW5jaGFuZ2VkLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZXJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgICAgICBiYXNpY19yZWdleCYKKyAgICAgICAgYXNzaWduKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hfdHlwZSwgX0NoX3R5cGVyYWl0cywgX0FsbG9jYXRvcj4mIF9fcywKKwkgICAgICAgZmxhZ190eXBlIF9fZiA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKyAgICAgICAgeyAKKwkgIGJhc2ljX3JlZ2V4IF9fdG1wKF9fcywgX19mKTsKKwkgIHRoaXMtPnN3YXAoX190bXApOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQXNzaWducyBhIG5ldyByZWd1bGFyIGV4cHJlc3Npb24gdG8gYSByZWdleCBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGZpcnN0IFRoZSBzdGFydCBvZiBhIHJhbmdlIGNvbnRhaW5pbmcgYSB2YWxpZCByZWd1bGFyCisgICAgICAgKiAgICAgICAgICAgICAgZXhwcmVzc2lvbi4KKyAgICAgICAqIEBwYXJhbSBsYXN0ICBUaGUgZW5kIG9mIGEgcmFuZ2UgY29udGFpbmluZyBhIHZhbGlkIHJlZ3VsYXIKKyAgICAgICAqICAgICAgICAgICAgICBleHByZXNzaW9uLgorICAgICAgICogQHBhcmFtIGZsYWdzIFN5bnRheCBvcHRpb24gZmxhZ3MuCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBwIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAqIHBhdHRlcm4gaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIEBwIGZsYWdzLiAgSWYgcmVnZXhfZXJyb3IgaXMgdGhyb3duLAorICAgICAgICogdGhlIG9iamVjdCByZW1haW5zIHVuY2hhbmdlZC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBmbGFnX3R5cGUgX19mbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKyAgICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKHN0cmluZ190eXBlKF9fZmlyc3QsIF9fbGFzdCksIF9fZmxhZ3MpOyB9CisKKyNpZmRlZiBfR0xJQkNYWF9JTkNMVURFX0FTX0NYWDExCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBBc3NpZ25zIGEgbmV3IHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBhIHJlZ2V4IG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gbCAgICAgQW4gaW5pdGlhbGl6ZXIgbGlzdCByZXByZXNlbnRpbmcgYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gZmxhZ3MgU3ludGF4IG9wdGlvbiBmbGFncy4KKyAgICAgICAqCisgICAgICAgKiBAdGhyb3dzIHJlZ2V4X2Vycm9yIGlmIEBwIGwgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIHJlZ3VsYXIKKyAgICAgICAqIGV4cHJlc3Npb24gcGF0dGVybiBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gQHAgZmxhZ3MuICBJZiByZWdleF9lcnJvcgorICAgICAgICogaXMgdGhyb3duLCB0aGUgb2JqZWN0IHJlbWFpbnMgdW5jaGFuZ2VkLgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleCYKKyAgICAgIGFzc2lnbihpbml0aWFsaXplcl9saXN0PF9DaF90eXBlPiBfX2wsCisJICAgICBmbGFnX3R5cGUgX19mID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KQorICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKF9fbC5iZWdpbigpLCBfX2wuZW5kKCksIF9fZik7IH0KKyNlbmRpZgorCisgICAgICAvLyBbNy44LjRdIGNvbnN0IG9wZXJhdGlvbnMKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG51bWJlciBvZiBtYXJrZWQgc3ViZXhwcmVzc2lvbnMgd2l0aGluIHRoZSByZWd1bGFyCisgICAgICAgKiBleHByZXNzaW9uLgorICAgICAgICovCisgICAgICB1bnNpZ25lZCBpbnQKKyAgICAgIG1hcmtfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbWFya19jb3VudDsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBmbGFncyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgcmVndWxhciBleHByZXNzaW9uCisgICAgICAgKiBvciBpbiB0aGUgbGFzdCBjYWxsIHRvIGFzc2lnbigpLgorICAgICAgICovCisgICAgICBmbGFnX3R5cGUKKyAgICAgIGZsYWdzKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2ZsYWdzOyB9CisgICAgICAKKyAgICAgIC8vIFs3LjguNV0gbG9jYWxlCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbWJ1ZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gbG9jYWxlLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBsb2MgQSBsb2NhbGUuCisgICAgICAgKi8KKyAgICAgIGxvY2FsZV90eXBlCisgICAgICBpbWJ1ZShsb2NhbGVfdHlwZSBfX2xvYykKKyAgICAgIHsgcmV0dXJuIF9NX3RyYWl0cy5pbWJ1ZShfX2xvYyk7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbG9jYWxlIGN1cnJlbnRseSBpbWJ1ZWQgaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICAgICogICAgICAgIG9iamVjdC4KKyAgICAgICAqLworICAgICAgbG9jYWxlX3R5cGUKKyAgICAgIGdldGxvYygpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90cmFpdHMuZ2V0bG9jKCk7IH0KKyAgICAgIAorICAgICAgLy8gWzcuOC42XSBzd2FwCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTd2FwcyB0aGUgY29udGVudHMgb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3RzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSByaHMgQW5vdGhlciByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzd2FwKGJhc2ljX3JlZ2V4JiBfX3JocykKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fZmxhZ3MsICAgICAgX19yaHMuX01fZmxhZ3MpOworCXN0ZDo6c3dhcChfTV9wYXR0ZXJuLCAgICBfX3Jocy5fTV9wYXR0ZXJuKTsKKwlzdGQ6OnN3YXAoX01fbWFya19jb3VudCwgX19yaHMuX01fbWFya19jb3VudCk7CisJc3RkOjpzd2FwKF9NX3RyYWl0cywgICAgIF9fcmhzLl9NX3RyYWl0cyk7CisgICAgICB9CisgICAgICAKKyAgICBwcml2YXRlOgorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29tcGlsZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiBpbnRvIGEgTkZBLgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQgX01fY29tcGlsZSgpOworCisgICAgcHJvdGVjdGVkOgorICAgICAgZmxhZ190eXBlICAgIF9NX2ZsYWdzOworICAgICAgc3RyaW5nX3R5cGUgIF9NX3BhdHRlcm47CisgICAgICB1bnNpZ25lZCBpbnQgX01fbWFya19jb3VudDsKKyAgICAgIF9SeF90cmFpdHMgICBfTV90cmFpdHM7CisgICAgfTsKKyAgCisgIC8qKiBAYnJpZWYgU3RhbmRhcmQgcmVndWxhciBleHByZXNzaW9ucy4gKi8KKyAgdHlwZWRlZiBiYXNpY19yZWdleDxjaGFyPiAgICByZWdleDsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICAvKiogQGJyaWVmIFN0YW5kYXJkIHdpZGUtY2hhcmFjdGVyIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICovCisgIHR5cGVkZWYgYmFzaWNfcmVnZXg8d2NoYXJfdD4gd3JlZ2V4OworI2VuZGlmCisKKworICAvLyBbNy44LjZdIGJhc2ljX3JlZ2V4IHN3YXAKKyAgLyoqCisgICAqIEBicmllZiBTd2FwcyB0aGUgY29udGVudHMgb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3RzLgorICAgKiBAcGFyYW0gbGhzIEZpcnN0IHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICogQHBhcmFtIHJocyBTZWNvbmQgcmVndWxhciBleHByZXNzaW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19saHMsCisJIGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorCisKKyAgLy8gWzcuOV0gQ2xhc3MgdGVtcGxhdGUgc3ViX21hdGNoCisgIC8qKgorICAgKiBBIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgbWF0Y2hlZCBieSBhIHBhcnRpY3VsYXIgbWFya2VkIHN1Yi1leHByZXNzaW9uLgorICAgKgorICAgKiBBbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBlc3NlbnRpYWxseSBhIHBhaXIgb2YgaXRlcmF0b3JzIG1hcmtpbmcgYQorICAgKiBtYXRjaGVkIHN1YmV4cHJlc3Npb24gd2l0aGluIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gbWF0Y2guIFN1Y2gKKyAgICogb2JqZWN0cyBjYW4gYmUgY29udmVydGVkIHRvIGFuZCBjb21wYXJlZCB3aXRoIHN0ZDo6YmFzaWNfc3RyaW5nIG9iamVjdHMKKyAgICogb2YgYSBzaW1pbGFyIGJhc2UgY2hhcmFjdGVyIHR5cGUgYXMgdGhlIHBhdHRlcm4gbWF0Y2hlZCBieSB0aGUgcmVndWxhcgorICAgKiBleHByZXNzaW9uLgorICAgKgorICAgKiBUaGUgaXRlcmF0b3JzIHRoYXQgbWFrZSB1cCB0aGUgcGFpciBhcmUgdGhlIHVzdWFsIGhhbGYtb3BlbiBpbnRlcnZhbAorICAgKiByZWZlcmVuY2luZyB0aGUgYWN0dWFsIG9yaWdpbmFsIHBhdHRlcm4gbWF0Y2hlZC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaUl0ZXI+CisgICAgY2xhc3Mgc3ViX21hdGNoIDogcHVibGljIHN0ZDo6cGFpcjxfQmlJdGVyLCBfQmlJdGVyPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlJdGVyPjo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9CaUl0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisKKyAgICBwdWJsaWM6CisgICAgICBib29sIG1hdGNoZWQ7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGluZyBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgZGlmZmVyZW5jZV90eXBlCisgICAgICBsZW5ndGgoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+bWF0Y2hlZCA/IHN0ZDo6ZGlzdGFuY2UodGhpcy0+Zmlyc3QsIHRoaXMtPnNlY29uZCkgOiAwOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG1hdGNoaW5nIHNlcXVlbmNlIGFzIGEgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRoZSBtYXRjaGluZyBzZXF1ZW5jZSBhcyBhIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGlzIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIG9wZXJhdG9yLiAgSXQgaXMgaWRlbnRpY2FsIHRvIHRoZQorICAgICAgICogc3RyKCkgbWVtYmVyIGZ1bmN0aW9uIGV4Y2VwdCB0aGF0IGl0IHdpbGwgd2FudCB0byBwb3AgdXAgaW4KKyAgICAgICAqIHVuZXhwZWN0ZWQgcGxhY2VzIGFuZCBjYXVzZSBhIGdyZWF0IGRlYWwgb2YgY29uZnVzaW9uIGFuZCBjdXJzaW5nCisgICAgICAgKiBmcm9tIHRoZSB1bndhcnkuCisgICAgICAgKi8KKyAgICAgIG9wZXJhdG9yIGJhc2ljX3N0cmluZzx2YWx1ZV90eXBlPigpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIHRoaXMtPm1hdGNoZWQKKwkgID8gc3RkOjpiYXNpY19zdHJpbmc8dmFsdWVfdHlwZT4odGhpcy0+Zmlyc3QsIHRoaXMtPnNlY29uZCkKKwkgIDogc3RkOjpiYXNpY19zdHJpbmc8dmFsdWVfdHlwZT4oKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbWF0Y2hpbmcgc2VxdWVuY2UgYXMgYSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdGhlIG1hdGNoaW5nIHNlcXVlbmNlIGFzIGEgc3RyaW5nLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmc8dmFsdWVfdHlwZT4KKyAgICAgIHN0cigpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIHRoaXMtPm1hdGNoZWQKKwkgID8gc3RkOjpiYXNpY19zdHJpbmc8dmFsdWVfdHlwZT4odGhpcy0+Zmlyc3QsIHRoaXMtPnNlY29uZCkKKwkgIDogc3RkOjpiYXNpY19zdHJpbmc8dmFsdWVfdHlwZT4oKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29tcGFyZXMgdGhpcyBhbmQgYW5vdGhlciBtYXRjaGVkIHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBzIEFub3RoZXIgbWF0Y2hlZCBzZXF1ZW5jZSB0byBjb21wYXJlIHRvIHRoaXMgb25lLgorICAgICAgICoKKyAgICAgICAqIEByZXR2YWwgPDAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIHdpbGwgY29sbGF0ZSBiZWZvcmUgQHAgcy4KKyAgICAgICAqIEByZXR2YWwgPTAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIGlzIGVxdWl2YWxlbnQgdG8gQHAgcy4KKyAgICAgICAqIEByZXR2YWwgPDAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIHdpbGwgY29sbGF0ZSBhZnRlciBAcCBzLgorICAgICAgICovCisgICAgICBpbnQKKyAgICAgIGNvbXBhcmUoY29uc3Qgc3ViX21hdGNoJiBfX3MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5zdHIoKS5jb21wYXJlKF9fcy5zdHIoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29tcGFyZXMgdGhpcyBzdWJfbWF0Y2ggdG8gYSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHMgQSBzdHJpbmcgdG8gY29tcGFyZSB0byB0aGlzIHN1Yl9tYXRjaC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dmFsIDwwIHRoaXMgbWF0Y2hlZCBzZXF1ZW5jZSB3aWxsIGNvbGxhdGUgYmVmb3JlIEBwIHMuCisgICAgICAgKiBAcmV0dmFsID0wIHRoaXMgbWF0Y2hlZCBzZXF1ZW5jZSBpcyBlcXVpdmFsZW50IHRvIEBwIHMuCisgICAgICAgKiBAcmV0dmFsIDwwIHRoaXMgbWF0Y2hlZCBzZXF1ZW5jZSB3aWxsIGNvbGxhdGUgYWZ0ZXIgQHAgcy4KKyAgICAgICAqLworICAgICAgaW50CisgICAgICBjb21wYXJlKGNvbnN0IGJhc2ljX3N0cmluZzx2YWx1ZV90eXBlPiYgX19zKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+c3RyKCkuY29tcGFyZShfX3MpOyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbXBhcmVzIHRoaXMgc3ViX21hdGNoIHRvIGEgQy1zdHlsZSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHMgQSBDLXN0eWxlIHN0cmluZyB0byBjb21wYXJlIHRvIHRoaXMgc3ViX21hdGNoLgorICAgICAgICoKKyAgICAgICAqIEByZXR2YWwgPDAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIHdpbGwgY29sbGF0ZSBiZWZvcmUgQHAgcy4KKyAgICAgICAqIEByZXR2YWwgPTAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIGlzIGVxdWl2YWxlbnQgdG8gQHAgcy4KKyAgICAgICAqIEByZXR2YWwgPDAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIHdpbGwgY29sbGF0ZSBhZnRlciBAcCBzLgorICAgICAgICovCisgICAgICBpbnQKKyAgICAgIGNvbXBhcmUoY29uc3QgdmFsdWVfdHlwZSogX19zKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+c3RyKCkuY29tcGFyZShfX3MpOyB9CisgICAgfTsKKyAgCisgIAorICAvKiogQGJyaWVmIFN0YW5kYXJkIHJlZ2V4IHN1Ym1hdGNoIG92ZXIgYSBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcuICovCisgIHR5cGVkZWYgc3ViX21hdGNoPGNvbnN0IGNoYXIqPiAgICAgICAgICAgICBjc3ViX21hdGNoOworICAvKiogQGJyaWVmIFN0YW5kYXJkIHJlZ2V4IHN1Ym1hdGNoIG92ZXIgYSBzdGFuZGFyZCBzdHJpbmcuICovCisgIHR5cGVkZWYgc3ViX21hdGNoPHN0cmluZzo6Y29uc3RfaXRlcmF0b3I+ICBzc3ViX21hdGNoOworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIC8qKiBAYnJpZWYgUmVnZXggc3VibWF0Y2ggb3ZlciBhIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHdpZGUgc3RyaW5nLiAqLworICB0eXBlZGVmIHN1Yl9tYXRjaDxjb25zdCB3Y2hhcl90Kj4gICAgICAgICAgd2NzdWJfbWF0Y2g7CisgIC8qKiBAYnJpZWYgUmVnZXggc3VibWF0Y2ggb3ZlciBhIHN0YW5kYXJkIHdpZGUgc3RyaW5nLiAqLworICB0eXBlZGVmIHN1Yl9tYXRjaDx3c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gd3NzdWJfbWF0Y2g7CisjZW5kaWYKKworICAvLyBbNy45LjJdIHN1Yl9tYXRjaCBub24tbWVtYmVyIG9wZXJhdG9ycworICAKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgZXF1aXZhbGVuY2Ugb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaGVzLgorICAgKiBAcGFyYW0gbGhzIEZpcnN0IHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBTZWNvbmQgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyAgaXMgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaUl0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPT0gMDsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGluZXF1aXZhbGVuY2Ugb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaGVzLgorICAgKiBAcGFyYW0gbGhzIEZpcnN0IHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBTZWNvbmQgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyAgaXMgbm90IGVxdWl2YWxlbnQgdG8gQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlJdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpICE9IDA7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoZXMuCisgICAqIEBwYXJhbSBsaHMgRmlyc3QgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIFNlY29uZCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHByZWNlZGVzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpSXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPCAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaGVzLgorICAgKiBAcGFyYW0gbGhzIEZpcnN0IHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBTZWNvbmQgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBkb2VzIG5vdCBzdWNjZWVkIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpSXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA8PSAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaGVzLgorICAgKiBAcGFyYW0gbGhzIEZpcnN0IHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBTZWNvbmQgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBkb2VzIG5vdCBwcmVjZWRlIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpSXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA+PSAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaGVzLgorICAgKiBAcGFyYW0gbGhzIEZpcnN0IHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBTZWNvbmQgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBzdWNjZWVkcyBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaUl0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX2xocywKKwkgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID4gMDsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGVxdWl2YWxlbmNlIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgKiAgICAgICAgc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzICBpcyBlcXVpdmFsZW50IHRvIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgICAgICBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMgPT0gX19yaHMuc3RyKCk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBpbmVxdWl2YWxlbmNlIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgKiAgICAgICAgc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzICBpcyBub3QgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGJhc2ljX3N0cmluZzwKKwkgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSwKKwkgICAgICAgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19saHMsIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzICE9IF9fcmhzLnN0cigpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBwcmVjZWRlcyBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisJICAgICAgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19saHMsIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgICB7IHJldHVybiBfX2xocyA8IF9fcmhzLnN0cigpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBzdWNjZWVkcyBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsIAorCSAgICAgIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fbGhzLCBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocyA+IF9fcmhzLnN0cigpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBkb2VzIG5vdCBwcmVjZWRlIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgICAgICBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX2xocywgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMgPj0gX19yaHMuc3RyKCk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHN1Y2NlZWQgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBiYXNpY19zdHJpbmc8CisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisJICAgICAgIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fbGhzLCBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocyA8PSBfX3Jocy5zdHIoKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGVxdWl2YWxlbmNlIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhCisgICAqICAgICAgICBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGlzIGVxdWl2YWxlbnQgdG8gQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgICAgICBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSA9PSBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGluZXF1aXZhbGVuY2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEKKyAgICogICAgICAgIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgaXMgbm90IGVxdWl2YWxlbnQgdG8gQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgICAgICBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSAhPSBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgcHJlY2VkZXMgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgY2xhc3MgX0NoX3RyYWl0cywgY2xhc3MgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzwKKwkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgICAgIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLnN0cigpIDwgX19yaHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYSBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHN1Y2NlZWRzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIGNsYXNzIF9DaF90cmFpdHMsIGNsYXNzIF9DaF9hbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8CisJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSwKKwkgICAgICBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSA+IF9fcmhzOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIEEgc3RyaW5nLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBkb2VzIG5vdCBwcmVjZWRlIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIGNsYXNzIF9DaF90cmFpdHMsIGNsYXNzIF9DaF9hbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzwKKwkgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSwKKwkgICAgICAgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuc3RyKCkgPj0gX19yaHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYSBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHN1Y2NlZWQgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgY2xhc3MgX0NoX3RyYWl0cywgY2xhc3MgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgICAgICBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSA8PSBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGVxdWl2YWxlbmNlIG9mIGEgQyBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uCisgICAqICAgICAgICBzdWJtYXRjaC4KKyAgICogQHBhcmFtIGxocyBBIEMgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyAgaXMgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PSh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMgPT0gX19yaHMuc3RyKCk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBpbmVxdWl2YWxlbmNlIG9mIGFuIGl0ZXJhdG9yIHZhbHVlIGFuZCBhIHJlZ3VsYXIKKyAgICogICAgICAgIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGlzIG5vdCBlcXVpdmFsZW50IHRvIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocyAhPSBfX3Jocy5zdHIoKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIGxocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIHJocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgcHJlY2VkZXMgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPCh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX2xocywKKwkgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocyA8IF9fcmhzLnN0cigpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBzdWNjZWVkcyBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fbGhzLAorCSAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzID4gX19yaHMuc3RyKCk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHByZWNlZGUgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzID49IF9fcmhzLnN0cigpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBkb2VzIG5vdCBzdWNjZWVkIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocyA8PSBfX3Jocy5zdHIoKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGVxdWl2YWxlbmNlIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhCisgICAqICAgICAgICBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBwb2ludGVyIHRvIGEgc3RyaW5nPworICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyAgaXMgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuc3RyKCkgPT0gX19yaHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBpbmVxdWl2YWxlbmNlIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhCisgICAqICAgICAgICBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBwb2ludGVyIHRvIGEgc3RyaW5nLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBpcyBub3QgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuc3RyKCkgIT0gX19yaHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYSBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHByZWNlZGVzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuc3RyKCkgPCBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgc3VjY2VlZHMgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSA+IF9fcmhzOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIEEgc3RyaW5nLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBkb2VzIG5vdCBwcmVjZWRlIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSA+PSBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgZG9lcyBub3Qgc3VjY2VlZCBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuc3RyKCkgPD0gX19yaHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBlcXVpdmFsZW5jZSBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICogICAgICAgIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBpcyBlcXVpdmFsZW50IHRvIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocyA9PSBfX3Jocy5zdHIoKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGluZXF1aXZhbGVuY2Ugb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uCisgICAqICAgICAgICBzdWJtYXRjaC4KKyAgICogQHBhcmFtIGxocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIHJocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgaXMgbm90IGVxdWl2YWxlbnQgdG8gQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzICE9IF9fcmhzLnN0cigpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBwcmVjZWRlcyBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fbGhzLAorCSAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzIDwgX19yaHMuc3RyKCk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHN1Y2NlZWRzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19saHMsCisJICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMgPiBfX3Jocy5zdHIoKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIGxocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIHJocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgZG9lcyBub3QgcHJlY2VkZSBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PSh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMgPj0gX19yaHMuc3RyKCk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHN1Y2NlZWQgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzIDw9IF9fcmhzLnN0cigpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgZXF1aXZhbGVuY2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEKKyAgICogICAgICAgIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIGNvbnN0IHN0cmluZyByZWZlcmVuY2UuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzICBpcyBlcXVpdmFsZW50IHRvIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSA9PSBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGluZXF1aXZhbGVuY2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEKKyAgICogICAgICAgIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIGNvbnN0IHN0cmluZyByZWZlcmVuY2UuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGlzIG5vdCBlcXVpdmFsZW50IHRvIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSAhPSBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIGNvbnN0IHN0cmluZyByZWZlcmVuY2UuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHByZWNlZGVzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuc3RyKCkgPCBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIGNvbnN0IHN0cmluZyByZWZlcmVuY2UuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHN1Y2NlZWRzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuc3RyKCkgPiBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIGNvbnN0IHN0cmluZyByZWZlcmVuY2UuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHByZWNlZGUgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLnN0cigpID49IF9fcmhzOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIEEgY29uc3Qgc3RyaW5nIHJlZmVyZW5jZS4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgZG9lcyBub3Qgc3VjY2VlZCBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuc3RyKCkgPD0gX19yaHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIEluc2VydHMgYSBtYXRjaGVkIHN0cmluZyBpbnRvIGFuIG91dHB1dCBzdHJlYW0uCisgICAqCisgICAqIEBwYXJhbSBvcyBUaGUgb3V0cHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIG0gIEEgc3VibWF0Y2ggc3RyaW5nLgorICAgKgorICAgKiBAcmV0dXJucyB0aGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdWJtYXRjaCBzdHJpbmcgaW5zZXJ0ZWQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lCisgICAgYmFzaWNfb3N0cmVhbTxfQ2hfdHlwZSwgX0NoX3RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaF90eXBlLCBfQ2hfdHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19tKQorICAgIHsgcmV0dXJuIF9fb3MgPDwgX19tLnN0cigpOyB9CisKKyAgLy8gWzcuMTBdIENsYXNzIHRlbXBsYXRlIG1hdGNoX3Jlc3VsdHMKKyAgLyoqCisgICAqIEBicmllZiBUaGUgcmVzdWx0cyBvZiBhIG1hdGNoIG9yIHNlYXJjaCBvcGVyYXRpb24uCisgICAqCisgICAqIEEgY29sbGVjdGlvbiBvZiBjaGFyYWN0ZXIgc2VxdWVuY2VzIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0IG9mIGEgcmVndWxhcgorICAgKiBleHByZXNzaW9uIG1hdGNoLiAgU3RvcmFnZSBmb3IgdGhlIGNvbGxlY3Rpb24gaXMgYWxsb2NhdGVkIGFuZCBmcmVlZCBhcworICAgKiBuZWNlc3NhcnkgYnkgdGhlIG1lbWJlciBmdW5jdGlvbnMgb2YgY2xhc3MgdGVtcGxhdGUgbWF0Y2hfcmVzdWx0cy4KKyAgICoKKyAgICogVGhpcyBjbGFzcyBzYXRpc2ZpZXMgdGhlIFNlcXVlbmNlIHJlcXVpcmVtZW50cywgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQKKyAgICogb25seSB0aGUgb3BlcmF0aW9ucyBkZWZpbmVkIGZvciBhIGNvbnN0LXF1YWxpZmllZCBTZXF1ZW5jZSBhcmUgc3VwcG9ydGVkLgorICAgKgorICAgKiBUaGUgc3ViX21hdGNoIG9iamVjdCBzdG9yZWQgYXQgaW5kZXggMCByZXByZXNlbnRzIHN1Yi1leHByZXNzaW9uIDAsIGkuZS4KKyAgICogdGhlIHdob2xlIG1hdGNoLiBJbiB0aGlzIGNhc2UgdGhlIHN1Yl9tYXRjaCBtZW1iZXIgbWF0Y2hlZCBpcyBhbHdheXMgdHJ1ZS4KKyAgICogVGhlIHN1Yl9tYXRjaCBvYmplY3Qgc3RvcmVkIGF0IGluZGV4IG4gZGVub3RlcyB3aGF0IG1hdGNoZWQgdGhlIG1hcmtlZAorICAgKiBzdWItZXhwcmVzc2lvbiBuIHdpdGhpbiB0aGUgbWF0Y2hlZCBleHByZXNzaW9uLiBJZiB0aGUgc3ViLWV4cHJlc3Npb24gbgorICAgKiBwYXJ0aWNpcGF0ZWQgaW4gYSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2ggdGhlbiB0aGUgc3ViX21hdGNoIG1lbWJlcgorICAgKiBtYXRjaGVkIGV2YWx1YXRlcyB0byB0cnVlLCBhbmQgbWVtYmVycyBmaXJzdCBhbmQgc2Vjb25kIGRlbm90ZSB0aGUgcmFuZ2UKKyAgICogb2YgY2hhcmFjdGVycyBbZmlyc3QsIHNlY29uZCkgd2hpY2ggZm9ybWVkIHRoYXQgbWF0Y2guIE90aGVyd2lzZSBtYXRjaGVkCisgICAqIGlzIGZhbHNlLCBhbmQgbWVtYmVycyBmaXJzdCBhbmQgc2Vjb25kIHBvaW50IHRvIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlCisgICAqIHRoYXQgd2FzIHNlYXJjaGVkLgorICAgKgorICAgKiBAbm9zdWJncm91cGluZworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciA9IGFsbG9jYXRvcjxzdWJfbWF0Y2g8X0JpX2l0ZXI+ID4gPgorICAgIGNsYXNzIG1hdGNoX3Jlc3VsdHMKKyAgICA6IHByaXZhdGUgc3RkOjp2ZWN0b3I8c3RkOjp0cjE6OnN1Yl9tYXRjaDxfQmlfaXRlcj4sIF9BbGxvY2F0b3I+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6dHIxOjpzdWJfbWF0Y2g8X0JpX2l0ZXI+LCBfQWxsb2NhdG9yPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmFzZV90eXBlOworCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBAbmFtZSAxMC4/IFB1YmxpYyBUeXBlcworICAgICAgICovCisgICAgICAvL0B7CisgICAgICB0eXBlZGVmIHN1Yl9tYXRjaDxfQmlfaXRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY2F0b3I6OmNvbnN0X3JlZmVyZW5jZSAgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3RfcmVmZXJlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZV90eXBlOjpjb25zdF9pdGVyYXRvciAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY2F0b3I6OnNpemVfdHlwZSAgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPGNoYXJfdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGU7CisgICAgICAvL0B9CisgIAorICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQG5hbWUgMTAuMSBDb25zdHJ1Y3Rpb24sIENvcHlpbmcsIGFuZCBEZXN0cnVjdGlvbgorICAgICAgICovCisgICAgICAvL0B7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBkZWZhdWx0ICVtYXRjaF9yZXN1bHRzIGNvbnRhaW5lci4KKyAgICAgICAqIEBwb3N0IHNpemUoKSByZXR1cm5zIDAgYW5kIHN0cigpIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgbWF0Y2hfcmVzdWx0cyhjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlX3R5cGUoX19hKSwgX01fbWF0Y2hlZChmYWxzZSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb3B5IGNvbnN0cnVjdHMgYSAlbWF0Y2hfcmVzdWx0cy4KKyAgICAgICAqLworICAgICAgbWF0Y2hfcmVzdWx0cyhjb25zdCBtYXRjaF9yZXN1bHRzJiBfX3JocykKKyAgICAgIDogX0Jhc2VfdHlwZShfX3JocyksIF9NX21hdGNoZWQoX19yaHMuX01fbWF0Y2hlZCksCisJX01fcHJlZml4KF9fcmhzLl9NX3ByZWZpeCksIF9NX3N1ZmZpeChfX3Jocy5fTV9zdWZmaXgpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQXNzaWducyByaHMgdG8gKnRoaXMuCisgICAgICAgKi8KKyAgICAgIG1hdGNoX3Jlc3VsdHMmCisgICAgICBvcGVyYXRvcj0oY29uc3QgbWF0Y2hfcmVzdWx0cyYgX19yaHMpCisgICAgICB7CisJbWF0Y2hfcmVzdWx0cyBfX3RtcChfX3Jocyk7CisJdGhpcy0+c3dhcChfX3RtcCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBEZXN0cm95cyBhICVtYXRjaF9yZXN1bHRzIG9iamVjdC4KKyAgICAgICAqLworICAgICAgfm1hdGNoX3Jlc3VsdHMoKQorICAgICAgeyB9CisgICAgICAKKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiBAbmFtZSAxMC4yIFNpemUKKyAgICAgICAqLworICAgICAgLy9AeworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBudW1iZXIgb2YgbWF0Y2hlcyBhbmQgc3VibWF0Y2hlcy4KKyAgICAgICAqCisgICAgICAgKiBUaGUgbnVtYmVyIG9mIG1hdGNoZXMgZm9yIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIHdpbGwgYmUgZWl0aGVyIDAKKyAgICAgICAqIGlmIHRoZXJlIHdhcyBubyBtYXRjaCBvciBtYXJrX2NvdW50KCkgKyAxIGlmIGEgbWF0Y2ggd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAgKiBTb21lIG1hdGNoZXMgbWF5IGJlIGVtcHR5LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgbWF0Y2hlcyBmb3VuZC4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX21hdGNoZWQgPyBfQmFzZV90eXBlOjpzaXplKCkgKyAxIDogMDsgfQorICAgICAgCisgICAgICAvL3NpemVfdHlwZQorICAgICAgLy9tYXhfc2l6ZSgpIGNvbnN0OworICAgICAgdXNpbmcgX0Jhc2VfdHlwZTo6bWF4X3NpemU7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluZGljYXRlcyBpZiB0aGUgJW1hdGNoX3Jlc3VsdHMgY29udGFpbnMgbm8gcmVzdWx0cy4KKyAgICAgICAqIEByZXR2YWwgdHJ1ZSBUaGUgJW1hdGNoX3Jlc3VsdHMgb2JqZWN0IGlzIGVtcHR5LgorICAgICAgICogQHJldHZhbCBmYWxzZSBUaGUgJW1hdGNoX3Jlc3VsdHMgb2JqZWN0IGlzIG5vdCBlbXB0eS4KKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gc2l6ZSgpID09IDA7IH0KKyAgICAgIAorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqIEBuYW1lIDEwLjMgRWxlbWVudCBBY2Nlc3MKKyAgICAgICAqLworICAgICAgLy9AeworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBsZW5ndGggb2YgdGhlIGluZGljYXRlZCBzdWJtYXRjaC4KKyAgICAgICAqIEBwYXJhbSBzdWIgaW5kaWNhdGVzIHRoZSBzdWJtYXRjaC4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgaW5kaWNhdGVkIHN1Ym1hdGNoLCBvciB0aGUKKyAgICAgICAqIGxlbmd0aCBvZiB0aGUgZW50aXJlIG1hdGNoIGlmIEBwIHN1YiBpcyB6ZXJvICh0aGUgZGVmYXVsdCkuCisgICAgICAgKi8KKyAgICAgIGRpZmZlcmVuY2VfdHlwZQorICAgICAgbGVuZ3RoKHNpemVfdHlwZSBfX3N1YiA9IDApIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9tYXRjaGVkID8gdGhpcy0+c3RyKF9fc3ViKS5sZW5ndGgoKSA6IDA7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGluZGljYXRlZCBzdWJtYXRjaC4KKyAgICAgICAqIEBwYXJhbSBzdWIgaW5kaWNhdGVzIHRoZSBzdWJtYXRjaC4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRhcmdldAorICAgICAgICogc2VxdWVuY2UgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3VibWF0Y2gsIHVubGVzcyB0aGUgdmFsdWUgb2YgQHAgc3ViCisgICAgICAgKiBpcyB6ZXJvICh0aGUgZGVmYXVsdCksIGluIHdoaWNoIGNhc2UgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBvZmZzZXQKKyAgICAgICAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgdGFyZ2V0IHNlcXVlbmNlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICAgICAgKiBtYXRjaC4KKyAgICAgICAqLworICAgICAgZGlmZmVyZW5jZV90eXBlCisgICAgICBwb3NpdGlvbihzaXplX3R5cGUgX19zdWIgPSAwKSBjb25zdAorICAgICAgeworCXJldHVybiBfTV9tYXRjaGVkID8gc3RkOjpkaXN0YW5jZSh0aGlzLT5wcmVmaXgoKS5maXJzdCwKKwkJCQkJICAoKnRoaXMpW19fc3ViXS5maXJzdCkgOiAwOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBtYXRjaCBvciBzdWJtYXRjaCBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgdHlwZS4KKyAgICAgICAqIEBwYXJhbSBzdWIgaW5kaWNhdGVzIHRoZSBzdWJtYXRjaC4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIHN1Ym1hdGNoIChvciBtYXRjaCwgaWYgQHAgc3ViIGlzIHplcm8pIGV4dHJhY3RlZAorICAgICAgICogZnJvbSB0aGUgdGFyZ2V0IHJhbmdlIGFuZCBjb252ZXJ0ZWQgdG8gdGhlIGFzc29jaWF0ZWQgc3RyaW5nIHR5cGUuCisgICAgICAgKi8KKyAgICAgIHN0cmluZ190eXBlCisgICAgICBzdHIoc2l6ZV90eXBlIF9fc3ViID0gMCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX21hdGNoZWQgPyAoKnRoaXMpW19fc3ViXS5zdHIoKSA6IHN0cmluZ190eXBlKCk7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhICVzdWJfbWF0Y2ggcmVmZXJlbmNlIGZvciB0aGUgbWF0Y2ggb3Igc3VibWF0Y2guCisgICAgICAgKiBAcGFyYW0gc3ViIGluZGljYXRlcyB0aGUgc3VibWF0Y2guCisgICAgICAgKgorICAgICAgICogVGhpcyBmdW5jdGlvbiBnZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBpbmRpY2F0ZWQgc3VibWF0Y2gsIG9yIHRoZSBlbnRpcmUKKyAgICAgICAqIG1hdGNoIGlmIEBwIHN1YiBpcyB6ZXJvLgorICAgICAgICoKKyAgICAgICAqIElmIEBwIHN1YiA+PSBzaXplKCkgdGhlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSAlc3ViX21hdGNoIHdpdGggYQorICAgICAgICogc3BlY2lhbCB2YWx1ZSBpbmRpY2F0aW5nIG5vIHN1Ym1hdGNoLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fc3ViKSBjb25zdAorICAgICAgeyByZXR1cm4gX0Jhc2VfdHlwZTo6b3BlcmF0b3JbXShfX3N1Yik7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhICVzdWJfbWF0Y2ggcmVwcmVzZW50aW5nIHRoZSBtYXRjaCBwcmVmaXguCisgICAgICAgKgorICAgICAgICogVGhpcyBmdW5jdGlvbiBnZXRzIGEgcmVmZXJlbmNlIHRvIGEgJXN1Yl9tYXRjaCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZQorICAgICAgICogcGFydCBvZiB0aGUgdGFyZ2V0IHJhbmdlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIHRoZSB0YXJnZXQgcmFuZ2UgYW5kIHRoZQorICAgICAgICogc3RhcnQgb2YgdGhlIG1hdGNoLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIHByZWZpeCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wcmVmaXg7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhICVzdWJfbWF0Y2ggcmVwcmVzZW50aW5nIHRoZSBtYXRjaCBzdWZmaXguCisgICAgICAgKgorICAgICAgICogVGhpcyBmdW5jdGlvbiBnZXRzIGEgcmVmZXJlbmNlIHRvIGEgJXN1Yl9tYXRjaCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZQorICAgICAgICogcGFydCBvZiB0aGUgdGFyZ2V0IHJhbmdlIGJldHdlZW4gdGhlIGVuZCBvZiB0aGUgbWF0Y2ggYW5kIHRoZSBlbmQgb2YKKyAgICAgICAqIHRoZSB0YXJnZXQgcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgc3VmZml4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3N1ZmZpeDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGFuIGl0ZXJhdG9yIHRvIHRoZSBzdGFydCBvZiB0aGUgJXN1Yl9tYXRjaCBjb2xsZWN0aW9uLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX0Jhc2VfdHlwZTo6YmVnaW4oKTsgfQorICAgICAgCisjaWZkZWYgX0dMSUJDWFhfSU5DTFVERV9BU19DWFgxMQorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhbiBpdGVyYXRvciB0byB0aGUgc3RhcnQgb2YgdGhlICVzdWJfbWF0Y2ggY29sbGVjdGlvbi4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfQmFzZV90eXBlOjpiZWdpbigpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhbiBpdGVyYXRvciB0byBvbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBjb2xsZWN0aW9uLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9CYXNlX3R5cGU6OmVuZCgpOyB9CisgICAgICAKKyNpZmRlZiBfR0xJQkNYWF9JTkNMVURFX0FTX0NYWDExCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGFuIGl0ZXJhdG9yIHRvIG9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNvbGxlY3Rpb24uCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9CYXNlX3R5cGU6OmVuZCgpOyB9CisjZW5kaWYKKworICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqIEBuYW1lIDEwLjQgRm9ybWF0dGluZworICAgICAgICoKKyAgICAgICAqIFRoZXNlIGZ1bmN0aW9ucyBwZXJmb3JtIGZvcm1hdHRlZCBzdWJzdGl0dXRpb24gb2YgdGhlIG1hdGNoZWQKKyAgICAgICAqIGNoYXJhY3RlciBzZXF1ZW5jZXMgaW50byB0aGVpciB0YXJnZXQuICBUaGUgZm9ybWF0IHNwZWNpZmllcnMKKyAgICAgICAqIGFuZCBlc2NhcGUgc2VxdWVuY2VzIGFjY2VwdGVkIGJ5IHRoZXNlIGZ1bmN0aW9ucyBhcmUKKyAgICAgICAqIGRldGVybWluZWQgYnkgdGhlaXIgQHAgZmxhZ3MgcGFyYW1ldGVyIGFzIGRvY3VtZW50ZWQgYWJvdmUuCisgICAgICAgKi8KKyAgICAgICAvL0B7CisKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRfaXRlcj4KKyAgICAgICAgX091dF9pdGVyCisgICAgICAgIGZvcm1hdChfT3V0X2l0ZXIgX19vdXQsIGNvbnN0IHN0cmluZ190eXBlJiBfX2ZtdCwKKwkgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncworCSAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6Zm9ybWF0X2RlZmF1bHQpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICBzdHJpbmdfdHlwZQorICAgICAgZm9ybWF0KGNvbnN0IHN0cmluZ190eXBlJiBfX2ZtdCwKKwkgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkgICAgID0gcmVnZXhfY29uc3RhbnRzOjpmb3JtYXRfZGVmYXVsdCkgY29uc3Q7CisKKyAgICAgIC8vQH0gCisKKyAgICAgIC8qKgorICAgICAgICogQG5hbWUgMTAuNSBBbGxvY2F0b3IKKyAgICAgICAqLworICAgICAgLy9AeyAKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhIGNvcHkgb2YgdGhlIGFsbG9jYXRvci4KKyAgICAgICAqLworICAgICAgLy9hbGxvY2F0b3JfdHlwZQorICAgICAgLy9nZXRfYWxsb2NhdG9yKCkgY29uc3Q7CisgICAgICB1c2luZyBfQmFzZV90eXBlOjpnZXRfYWxsb2NhdG9yOworICAgICAgCisgICAgICAvL0B9IAorCisgICAgICAvKioKKyAgICAgICAqIEBuYW1lIDEwLjYgU3dhcAorICAgICAgICovCisgICAgICAgLy9AeyAKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU3dhcHMgdGhlIGNvbnRlbnRzIG9mIHR3byBtYXRjaF9yZXN1bHRzLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzd2FwKG1hdGNoX3Jlc3VsdHMmIF9fdGhhdCkKKyAgICAgIHsKKwlfQmFzZV90eXBlOjpzd2FwKF9fdGhhdCk7CisJc3RkOjpzd2FwKF9NX21hdGNoZWQsIF9fdGhhdC5fTV9tYXRjaGVkKTsKKwlzdGQ6OnN3YXAoX01fcHJlZml4LCAgX190aGF0Ll9NX3ByZWZpeCk7CisJc3RkOjpzd2FwKF9NX3N1ZmZpeCwgIF9fdGhhdC5fTV9zdWZmaXgpOworICAgICAgfQorICAgICAgLy9AfSAKKyAgICAgIAorICAgIHByaXZhdGU6CisgICAgICBib29sICAgICAgIF9NX21hdGNoZWQ7CisgICAgICB2YWx1ZV90eXBlIF9NX3ByZWZpeDsKKyAgICAgIHZhbHVlX3R5cGUgX01fc3VmZml4OworICAgIH07CisgIAorICB0eXBlZGVmIG1hdGNoX3Jlc3VsdHM8Y29uc3QgY2hhcio+ICAgICAgICAgICAgIGNtYXRjaDsKKyAgdHlwZWRlZiBtYXRjaF9yZXN1bHRzPHN0cmluZzo6Y29uc3RfaXRlcmF0b3I+ICBzbWF0Y2g7CisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdHlwZWRlZiBtYXRjaF9yZXN1bHRzPGNvbnN0IHdjaGFyX3QqPiAgICAgICAgICB3Y21hdGNoOworICB0eXBlZGVmIG1hdGNoX3Jlc3VsdHM8d3N0cmluZzo6Y29uc3RfaXRlcmF0b3I+IHdzbWF0Y2g7CisjZW5kaWYKKworICAvLyBtYXRjaF9yZXN1bHRzIGNvbXBhcmlzb25zCisgIC8qKgorICAgKiBAYnJpZWYgQ29tcGFyZXMgdHdvIG1hdGNoX3Jlc3VsdHMgZm9yIGVxdWFsaXR5LgorICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0d28gb2JqZWN0cyByZWZlciB0byB0aGUgc2FtZSBtYXRjaCwKKyAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBtYXRjaF9yZXN1bHRzPF9CaV9pdGVyLCBfQWxsb2NhdG9yPiYgX19tMSwKKwkgICAgICAgY29uc3QgbWF0Y2hfcmVzdWx0czxfQmlfaXRlciwgX0FsbG9jYXRvcj4mIF9fbTIpOworCisgIC8qKgorICAgKiBAYnJpZWYgQ29tcGFyZXMgdHdvIG1hdGNoX3Jlc3VsdHMgZm9yIGluZXF1YWxpdHkuCisgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHR3byBvYmplY3RzIGRvIG5vdCByZWZlciB0byB0aGUgc2FtZSBtYXRjaCwKKyAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIGNsYXNzIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXIsIF9BbGxvY2F0b3I+JiBfX20xLAorCSAgICAgICBjb25zdCBtYXRjaF9yZXN1bHRzPF9CaV9pdGVyLCBfQWxsb2NhdG9yPiYgX19tMikKKyAgICB7IHJldHVybiAhKF9fbTEgPT0gX19tMik7IH0KKworICAvLyBbNy4xMC42XSBtYXRjaF9yZXN1bHRzIHN3YXAKKyAgLyoqCisgICAqIEBicmllZiBTd2FwcyB0d28gbWF0Y2ggcmVzdWx0cy4KKyAgICogQHBhcmFtIGxocyBBIG1hdGNoIHJlc3VsdC4KKyAgICogQHBhcmFtIHJocyBBIG1hdGNoIHJlc3VsdC4KKyAgICoKKyAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSB0d28gbWF0Y2hfcmVzdWx0cyBvYmplY3RzIGFyZSBzd2FwcGVkLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXIsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgbWF0Y2hfcmVzdWx0czxfQmlfaXRlciwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgX19saHMuc3dhcChfX3Jocyk7IH0KKworICAvLyBbNy4xMS4yXSBGdW5jdGlvbiB0ZW1wbGF0ZSByZWdleF9tYXRjaAorICAvKioKKyAgICogQG5hbWUgTWF0Y2hpbmcsIFNlYXJjaGluZywgYW5kIFJlcGxhY2luZworICAgKi8KKyAgLy9AeworCisgIC8qKgorICAgKiBAYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGVyZSBpcyBhIG1hdGNoIGJldHdlZW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBAcCBlCisgICAqIGFuZCBhbGwgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBbZmlyc3QsIGxhc3QpLgorICAgKgorICAgKiBAcGFyYW0gZmlyc3QgQmVnaW5uaW5nIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgdG8gbWF0Y2guCisgICAqIEBwYXJhbSBsYXN0ICBPbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgdG8gbWF0Y2guCisgICAqIEBwYXJhbSBtICAgICBUaGUgbWF0Y2ggcmVzdWx0cy4KKyAgICogQHBhcmFtIHJlICAgIFRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqIEBwYXJhbSBmbGFncyBDb250cm9scyBob3cgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLgorICAgKgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggZXhpc3RzLgorICAgKiBAcmV0dmFsIGZhbHNlIE90aGVyd2lzZS4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICoKKyAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0FsbG9jYXRvciwKKwkgICB0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBib29sCisgICAgcmVnZXhfbWF0Y2goX0JpX2l0ZXIgX19maXJzdCwgX0JpX2l0ZXIgX19sYXN0LAorCQltYXRjaF9yZXN1bHRzPF9CaV9pdGVyLCBfQWxsb2NhdG9yPiYgX19tLAorCQljb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fcmUsCisJCXJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworCisgIC8qKgorICAgKiBAYnJpZWYgSW5kaWNhdGVzIGlmIHRoZXJlIGlzIGEgbWF0Y2ggYmV0d2VlbiB0aGUgcmVndWxhciBleHByZXNzaW9uIEBwIGUKKyAgICogYW5kIGFsbCBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIFtmaXJzdCwgbGFzdCkuCisgICAqCisgICAqIEBwYXJhbSBmaXJzdCBCZWdpbm5pbmcgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSB0byBtYXRjaC4KKyAgICogQHBhcmFtIGxhc3QgIE9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSB0byBtYXRjaC4KKyAgICogQHBhcmFtIHJlICAgIFRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqIEBwYXJhbSBmbGFncyBDb250cm9scyBob3cgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLgorICAgKgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggZXhpc3RzLgorICAgKiBAcmV0dmFsIGZhbHNlIE90aGVyd2lzZS4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBib29sCisgICAgcmVnZXhfbWF0Y2goX0JpX2l0ZXIgX19maXJzdCwgX0JpX2l0ZXIgX19sYXN0LAorCQljb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fcmUsCisJCXJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyAKKyAgICAgIG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXI+IF9fd2hhdDsKKyAgICAgIHJldHVybiByZWdleF9tYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9fd2hhdCwgX19yZSwgX19mbGFncyk7CisgICAgfQorCisgIC8qKgorICAgKiBAYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGVyZSBpcyBhIG1hdGNoIGJldHdlZW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBAcCBlCisgICAqIGFuZCBhIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KKyAgICoKKyAgICogQHBhcmFtIHMgIFRoZSBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcgdG8gbWF0Y2guCisgICAqIEBwYXJhbSBtICBUaGUgbWF0Y2ggcmVzdWx0cy4KKyAgICogQHBhcmFtIHJlIFRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqIEBwYXJhbSBmICBDb250cm9scyBob3cgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLgorICAgKgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggZXhpc3RzLgorICAgKiBAcmV0dmFsIGZhbHNlIE90aGVyd2lzZS4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfbWF0Y2goY29uc3QgX0NoX3R5cGUqIF9fcywKKwkJbWF0Y2hfcmVzdWx0czxjb25zdCBfQ2hfdHlwZSosIF9BbGxvY2F0b3I+JiBfX20sCisJCWNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yZSwKKwkJcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mCisJCT0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgcmV0dXJuIHJlZ2V4X21hdGNoKF9fcywgX19zICsgX1J4X3RyYWl0czo6bGVuZ3RoKF9fcyksIF9fbSwgX19yZSwgX19mKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGVyZSBpcyBhIG1hdGNoIGJldHdlZW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBAcCBlCisgICAqIGFuZCBhIHN0cmluZy4KKyAgICoKKyAgICogQHBhcmFtIHMgICAgIFRoZSBzdHJpbmcgdG8gbWF0Y2guCisgICAqIEBwYXJhbSBtICAgICBUaGUgbWF0Y2ggcmVzdWx0cy4KKyAgICogQHBhcmFtIHJlICAgIFRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqIEBwYXJhbSBmbGFncyBDb250cm9scyBob3cgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLgorICAgKgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggZXhpc3RzLgorICAgKiBAcmV0dmFsIGZhbHNlIE90aGVyd2lzZS4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYywKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlZ2V4X21hdGNoKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hfdHlwZSwgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19zLAorCQltYXRjaF9yZXN1bHRzPHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hfdHlwZSwgCisJCV9DaF90cmFpdHMsIF9DaF9hbGxvYz46OmNvbnN0X2l0ZXJhdG9yLCBfQWxsb2NhdG9yPiYgX19tLAorCQljb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fcmUsCisJCXJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gcmVnZXhfbWF0Y2goX19zLmJlZ2luKCksIF9fcy5lbmQoKSwgX19tLCBfX3JlLCBfX2ZsYWdzKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgSW5kaWNhdGVzIGlmIHRoZXJlIGlzIGEgbWF0Y2ggYmV0d2VlbiB0aGUgcmVndWxhciBleHByZXNzaW9uIEBwIGUKKyAgICogYW5kIGEgQy1zdHlsZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLgorICAgKgorICAgKiBAcGFyYW0gcyAgVGhlIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byBtYXRjaC4KKyAgICogQHBhcmFtIHJlIFRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqIEBwYXJhbSBmICBDb250cm9scyBob3cgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLgorICAgKgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggZXhpc3RzLgorICAgKiBAcmV0dmFsIGZhbHNlIE90aGVyd2lzZS4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlLCBjbGFzcyBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfbWF0Y2goY29uc3QgX0NoX3R5cGUqIF9fcywKKwkJY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX3JlLAorCQlyZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2YKKwkJPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gcmVnZXhfbWF0Y2goX19zLCBfX3MgKyBfUnhfdHJhaXRzOjpsZW5ndGgoX19zKSwgX19yZSwgX19mKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgSW5kaWNhdGVzIGlmIHRoZXJlIGlzIGEgbWF0Y2ggYmV0d2VlbiB0aGUgcmVndWxhciBleHByZXNzaW9uIEBwIGUKKyAgICogYW5kIGEgc3RyaW5nLgorICAgKgorICAgKiBAcGFyYW0gcyAgICAgW0lOXSBUaGUgc3RyaW5nIHRvIG1hdGNoLgorICAgKiBAcGFyYW0gcmUgICAgW0lOXSBUaGUgcmVndWxhciBleHByZXNzaW9uLgorICAgKiBAcGFyYW0gZmxhZ3MgW0lOXSBDb250cm9scyBob3cgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLgorICAgKgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggZXhpc3RzLgorICAgKiBAcmV0dmFsIGZhbHNlIE90aGVyd2lzZS4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9TdHJfYWxsb2NhdG9yLAorCSAgIHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfbWF0Y2goY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlLCBfQ2hfdHJhaXRzLCBfU3RyX2FsbG9jYXRvcj4mIF9fcywKKwkJY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX3JlLAorCQlyZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzCisJCT0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgcmV0dXJuIHJlZ2V4X21hdGNoKF9fcy5iZWdpbigpLCBfX3MuZW5kKCksIF9fcmUsIF9fZmxhZ3MpOyB9CisKKyAgLy8gWzcuMTEuM10gRnVuY3Rpb24gdGVtcGxhdGUgcmVnZXhfc2VhcmNoCisgIC8qKgorICAgKiBTZWFyY2hlcyBmb3IgYSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aGluIGEgcmFuZ2UuCisgICAqIEBwYXJhbSBmaXJzdCBbSU5dICBUaGUgc3RhcnQgb2YgdGhlIHN0cmluZyB0byBzZWFyY2guCisgICAqIEBwYXJhbSBsYXN0ICBbSU5dICBPbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBzdHJpbmcgdG8gc2VhcmNoLgorICAgKiBAcGFyYW0gbSAgICAgW09VVF0gVGhlIG1hdGNoIHJlc3VsdHMuCisgICAqIEBwYXJhbSByZSAgICBbSU5dICBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIHNlYXJjaCBmb3IuCisgICAqIEBwYXJhbSBmbGFncyBbSU5dICBTZWFyY2ggcG9saWN5IGZsYWdzLgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLgorICAgKiBAcmV0dmFsIGZhbHNlIE5vIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZywgdGhlIGNvbnRlbnQgb2YgJW0gaXMKKyAgICogICAgICAgICAgICAgICB1bmRlZmluZWQuCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqCisgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9BbGxvY2F0b3IsCisJICAgdHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICByZWdleF9zZWFyY2goX0JpX2l0ZXIgX19maXJzdCwgX0JpX2l0ZXIgX19sYXN0LAorCQkgbWF0Y2hfcmVzdWx0czxfQmlfaXRlciwgX0FsbG9jYXRvcj4mIF9fbSwKKwkJIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yZSwKKwkJIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KTsKKworICAvKioKKyAgICogU2VhcmNoZXMgZm9yIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGhpbiBhIHJhbmdlLgorICAgKiBAcGFyYW0gZmlyc3QgW0lOXSAgVGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcgdG8gc2VhcmNoLgorICAgKiBAcGFyYW0gbGFzdCAgW0lOXSAgT25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgc3RyaW5nIHRvIHNlYXJjaC4KKyAgICogQHBhcmFtIHJlICAgIFtJTl0gIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VhcmNoIGZvci4KKyAgICogQHBhcmFtIGZsYWdzIFtJTl0gIFNlYXJjaCBwb2xpY3kgZmxhZ3MuCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEByZXR2YWwgZmFsc2UgTm8gbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLgorICAgKiBAZG9jdG9kbworICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfc2VhcmNoKF9CaV9pdGVyIF9fZmlyc3QsIF9CaV9pdGVyIF9fbGFzdCwKKwkJIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yZSwKKwkJIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsKKyAgICAgIG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXI+IF9fd2hhdDsKKyAgICAgIHJldHVybiByZWdleF9zZWFyY2goX19maXJzdCwgX19sYXN0LCBfX3doYXQsIF9fcmUsIF9fZmxhZ3MpOworICAgIH0KKworICAvKioKKyAgICogQGJyaWVmIFNlYXJjaGVzIGZvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gYSBDLXN0cmluZy4KKyAgICogQHBhcmFtIHMgW0lOXSAgQSBDLXN0cmluZyB0byBzZWFyY2ggZm9yIHRoZSByZWdleC4KKyAgICogQHBhcmFtIG0gW09VVF0gVGhlIHNldCBvZiByZWdleCBtYXRjaGVzLgorICAgKiBAcGFyYW0gZSBbSU5dICBUaGUgcmVnZXggdG8gc2VhcmNoIGZvciBpbiBAcCBzLgorICAgKiBAcGFyYW0gZiBbSU5dICBUaGUgc2VhcmNoIGZsYWdzLgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLgorICAgKiBAcmV0dmFsIGZhbHNlIE5vIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZywgdGhlIGNvbnRlbnQgb2YgJW0gaXMKKyAgICogICAgICAgICAgICAgICB1bmRlZmluZWQuCisgICAqIEBkb2N0b2RvCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZSwgY2xhc3MgX0FsbG9jYXRvciwgY2xhc3MgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlZ2V4X3NlYXJjaChjb25zdCBfQ2hfdHlwZSogX19zLAorCQkgbWF0Y2hfcmVzdWx0czxjb25zdCBfQ2hfdHlwZSosIF9BbGxvY2F0b3I+JiBfX20sCisJCSBjb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fZSwKKwkJIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZgorCQkgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gcmVnZXhfc2VhcmNoKF9fcywgX19zICsgX1J4X3RyYWl0czo6bGVuZ3RoKF9fcyksIF9fbSwgX19lLCBfX2YpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBTZWFyY2hlcyBmb3IgYSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aGluIGEgQy1zdHJpbmcuCisgICAqIEBwYXJhbSBzIFtJTl0gIFRoZSBDLXN0cmluZyB0byBzZWFyY2guCisgICAqIEBwYXJhbSBlIFtJTl0gIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VhcmNoIGZvci4KKyAgICogQHBhcmFtIGYgW0lOXSAgU2VhcmNoIHBvbGljeSBmbGFncy4KKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZy4KKyAgICogQHJldHZhbCBmYWxzZSBObyBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEBkb2N0b2RvCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlZ2V4X3NlYXJjaChjb25zdCBfQ2hfdHlwZSogX19zLAorCQkgY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX2UsCisJCSByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2YKKwkJID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgcmV0dXJuIHJlZ2V4X3NlYXJjaChfX3MsIF9fcyArIF9SeF90cmFpdHM6Omxlbmd0aChfX3MpLCBfX2UsIF9fZik7IH0KKworICAvKioKKyAgICogQGJyaWVmIFNlYXJjaGVzIGZvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gYSBzdHJpbmcuCisgICAqIEBwYXJhbSBzICAgICBbSU5dICBUaGUgc3RyaW5nIHRvIHNlYXJjaC4KKyAgICogQHBhcmFtIGUgICAgIFtJTl0gIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VhcmNoIGZvci4KKyAgICogQHBhcmFtIGZsYWdzIFtJTl0gIFNlYXJjaCBwb2xpY3kgZmxhZ3MuCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEByZXR2YWwgZmFsc2UgTm8gbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLgorICAgKiBAZG9jdG9kbworICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX1N0cmluZ19hbGxvY2F0b3IsCisJICAgdHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICByZWdleF9zZWFyY2goY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlLCBfQ2hfdHJhaXRzLAorCQkgX1N0cmluZ19hbGxvY2F0b3I+JiBfX3MsCisJCSBjb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fZSwKKwkJIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgcmV0dXJuIHJlZ2V4X3NlYXJjaChfX3MuYmVnaW4oKSwgX19zLmVuZCgpLCBfX2UsIF9fZmxhZ3MpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBTZWFyY2hlcyBmb3IgYSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aGluIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gcyBbSU5dICBBIEMrKyBzdHJpbmcgdG8gc2VhcmNoIGZvciB0aGUgcmVnZXguCisgICAqIEBwYXJhbSBtIFtPVVRdIFRoZSBzZXQgb2YgcmVnZXggbWF0Y2hlcy4KKyAgICogQHBhcmFtIGUgW0lOXSAgVGhlIHJlZ2V4IHRvIHNlYXJjaCBmb3IgaW4gQHAgcy4KKyAgICogQHBhcmFtIGYgW0lOXSAgVGhlIHNlYXJjaCBmbGFncy4KKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZy4KKyAgICogQHJldHZhbCBmYWxzZSBObyBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcsIHRoZSBjb250ZW50IG9mICVtIGlzCisgICAqICAgICAgICAgICAgICAgdW5kZWZpbmVkLgorICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9DaF90eXBlLAorCSAgIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICByZWdleF9zZWFyY2goY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlLCBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3MsCisJCSBtYXRjaF9yZXN1bHRzPHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hfdHlwZSwKKwkJIF9DaF90cmFpdHMsIF9DaF9hbGxvYz46OmNvbnN0X2l0ZXJhdG9yLCBfQWxsb2NhdG9yPiYgX19tLAorCQkgY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX2UsCisJCSByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2YKKwkJID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgcmV0dXJuIHJlZ2V4X3NlYXJjaChfX3MuYmVnaW4oKSwgX19zLmVuZCgpLCBfX20sIF9fZSwgX19mKTsgfQorCisgIC8vIHRyMSBbNy4xMS40XSBzdGQgWzI4LjExLjRdIEZ1bmN0aW9uIHRlbXBsYXRlIHJlZ2V4X3JlcGxhY2UKKyAgLyoqCisgICAqIEBkb2N0b2RvCisgICAqIEBwYXJhbSBvdXQKKyAgICogQHBhcmFtIGZpcnN0CisgICAqIEBwYXJhbSBsYXN0CisgICAqIEBwYXJhbSBlCisgICAqIEBwYXJhbSBmbXQKKyAgICogQHBhcmFtIGZsYWdzCisgICAqCisgICAqIEByZXR1cm5zIG91dAorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKgorICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRfaXRlciwgdHlwZW5hbWUgX0JpX2l0ZXIsCisJICAgdHlwZW5hbWUgX1J4X3RyYWl0cywgdHlwZW5hbWUgX0NoX3R5cGU+CisgICAgaW5saW5lIF9PdXRfaXRlcgorICAgIHJlZ2V4X3JlcGxhY2UoX091dF9pdGVyIF9fb3V0LCBfQmlfaXRlciBfX2ZpcnN0LCBfQmlfaXRlciBfX2xhc3QsCisJCSAgY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX2UsCisJCSAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlPiYgX19mbXQsCisJCSAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncworCQkgID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KTsKKworICAvKioKKyAgICogQGRvY3RvZG8KKyAgICogQHBhcmFtIHMKKyAgICogQHBhcmFtIGUKKyAgICogQHBhcmFtIGZtdAorICAgKiBAcGFyYW0gZmxhZ3MKKyAgICoKKyAgICogQHJldHVybnMgYSBjb3B5IG9mIHN0cmluZyBAcCBzIHdpdGggcmVwbGFjZW1lbnRzLgorICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1J4X3RyYWl0cywgdHlwZW5hbWUgX0NoX3R5cGU+CisgICAgaW5saW5lIGJhc2ljX3N0cmluZzxfQ2hfdHlwZT4KKyAgICByZWdleF9yZXBsYWNlKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hfdHlwZT4mIF9fcywKKwkJICBjb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fZSwKKwkJICBjb25zdCBiYXNpY19zdHJpbmc8X0NoX3R5cGU+JiBfX2ZtdCwKKwkJICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzCisJCSAgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeworICAgICAgc3RkOjpzdHJpbmcgX19yZXN1bHQ7CisgICAgICByZWdleF9yZXBsYWNlKHN0ZDo6YmFja19pbnNlcnRlcihfX3Jlc3VsdCksCisJCSAgICBfX3MuYmVnaW4oKSwgX19zLmVuZCgpLCBfX2UsIF9fZm10LCBfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgLy9AfQorCisgIC8vIHRyMSBbNy4xMi4xXSBzdGQgWzI4LjEyXSBDbGFzcyB0ZW1wbGF0ZSByZWdleF9pdGVyYXRvcgorICAvKioKKyAgICogQW4gaXRlcmF0b3IgYWRhcHRvciB0aGF0IHdpbGwgcHJvdmlkZSByZXBlYXRlZCBjYWxscyBvZiByZWdleF9zZWFyY2ggb3ZlciAKKyAgICogYSByYW5nZSB1bnRpbCBubyBtb3JlIG1hdGNoZXMgcmVtYWluLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsCisJICAgdHlwZW5hbWUgX0NoX3R5cGUgPSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgIHR5cGVuYW1lIF9SeF90cmFpdHMgPSByZWdleF90cmFpdHM8X0NoX3R5cGU+ID4KKyAgICBjbGFzcyByZWdleF9pdGVyYXRvcgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiAgcmVnZXhfdHlwZTsKKyAgICAgIHR5cGVkZWYgbWF0Y2hfcmVzdWx0czxfQmlfaXRlcj4gICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFByb3ZpZGVzIGEgc2luZ3VsYXIgaXRlcmF0b3IsIHVzZWZ1bCBmb3IgaW5kaWNhdGluZworICAgICAgICogb25lLXBhc3QtdGhlLWVuZCBvZiBhIHJhbmdlLgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICByZWdleF9pdGVyYXRvcigpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSAlcmVnZXhfaXRlcmF0b3IuLi4KKyAgICAgICAqIEBwYXJhbSBhICBbSU5dIFRoZSBzdGFydCBvZiBhIHRleHQgcmFuZ2UgdG8gc2VhcmNoLgorICAgICAgICogQHBhcmFtIGIgIFtJTl0gT25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgdGV4dCByYW5nZSB0byBzZWFyY2guCisgICAgICAgKiBAcGFyYW0gcmUgW0lOXSBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoLgorICAgICAgICogQHBhcmFtIG0gIFtJTl0gUG9saWN5IGZsYWdzIGZvciBtYXRjaCBydWxlcy4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgcmVnZXhfaXRlcmF0b3IoX0JpX2l0ZXIgX19hLCBfQmlfaXRlciBfX2IsIGNvbnN0IHJlZ2V4X3R5cGUmIF9fcmUsCisJCSAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19tCisJCSAgICAgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworCisgICAgICAvKioKKyAgICAgICAqIENvcHkgY29uc3RydWN0cyBhICVyZWdleF9pdGVyYXRvci4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgcmVnZXhfaXRlcmF0b3IoY29uc3QgcmVnZXhfaXRlcmF0b3ImIF9fcmhzKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIEBkb2N0b2RvCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHJlZ2V4X2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHJlZ2V4X2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IHJlZ2V4X2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICBjb25zdCB2YWx1ZV90eXBlJgorICAgICAgb3BlcmF0b3IqKCk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICBjb25zdCB2YWx1ZV90eXBlKgorICAgICAgb3BlcmF0b3ItPigpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgcmVnZXhfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICByZWdleF9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpOworICAgICAgCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIHRoZXNlIG1lbWJlcnMgYXJlIHNob3duIGZvciBleHBvc2l0aW9uIG9ubHk6CisgICAgICBfQmlfaXRlciAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjsKKyAgICAgIF9CaV9pdGVyICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDsKKyAgICAgIGNvbnN0IHJlZ2V4X3R5cGUqICAgICAgICAgICAgICAgIHByZWdleDsKKyAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIGZsYWdzOworICAgICAgbWF0Y2hfcmVzdWx0czxfQmlfaXRlcj4gICAgICAgICAgbWF0Y2g7CisgICAgfTsKKyAgCisgIHR5cGVkZWYgcmVnZXhfaXRlcmF0b3I8Y29uc3QgY2hhcio+ICAgICAgICAgICAgIGNyZWdleF9pdGVyYXRvcjsKKyAgdHlwZWRlZiByZWdleF9pdGVyYXRvcjxzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPiAgc3JlZ2V4X2l0ZXJhdG9yOworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHR5cGVkZWYgcmVnZXhfaXRlcmF0b3I8Y29uc3Qgd2NoYXJfdCo+ICAgICAgICAgIHdjcmVnZXhfaXRlcmF0b3I7CisgIHR5cGVkZWYgcmVnZXhfaXRlcmF0b3I8d3N0cmluZzo6Y29uc3RfaXRlcmF0b3I+IHdzcmVnZXhfaXRlcmF0b3I7CisjZW5kaWYKKworICAvLyBbNy4xMi4yXSBDbGFzcyB0ZW1wbGF0ZSByZWdleF90b2tlbl9pdGVyYXRvcgorICAvKioKKyAgICogSXRlcmF0ZXMgb3ZlciBzdWJtYXRjaGVzIGluIGEgcmFuZ2UgKG9yIEBhIHNwbGl0cyBhIHRleHQgc3RyaW5nKS4KKyAgICoKKyAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBpdGVyYXRvciBpcyB0byBlbnVtZXJhdGUgYWxsLCBvciBhbGwgc3BlY2lmaWVkLAorICAgKiBtYXRjaGVzIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGhpbiBhIHRleHQgcmFuZ2UuICBUaGUgZGVyZWZlcmVuY2VkCisgICAqIHZhbHVlIG9mIGFuIGl0ZXJhdG9yIG9mIHRoaXMgY2xhc3MgaXMgYSBzdGQ6OnRyMTo6c3ViX21hdGNoIG9iamVjdC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLAorCSAgIHR5cGVuYW1lIF9DaF90eXBlID0gdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSwKKwkgICB0eXBlbmFtZSBfUnhfdHJhaXRzID0gcmVnZXhfdHJhaXRzPF9DaF90eXBlPiA+CisgICAgY2xhc3MgcmVnZXhfdG9rZW5faXRlcmF0b3IKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4gcmVnZXhfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3ViX21hdGNoPF9CaV9pdGVyPiAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICAKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBEZWZhdWx0IGNvbnN0cnVjdHMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIAorICAgICAgICogQSBkZWZhdWx0LWNvbnN0cnVjdGVkICVyZWdleF90b2tlbl9pdGVyYXRvciBpcyBhIHNpbmd1bGFyIGl0ZXJhdG9yCisgICAgICAgKiB0aGF0IHdpbGwgY29tcGFyZSBlcXVhbCB0byB0aGUgb25lLXBhc3QtdGhlLWVuZCB2YWx1ZSBmb3IgYW55CisgICAgICAgKiBpdGVyYXRvciBvZiB0aGUgc2FtZSB0eXBlLgorICAgICAgICovCisgICAgICByZWdleF90b2tlbl9pdGVyYXRvcigpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IuLi4KKyAgICAgICAqIEBwYXJhbSBhICAgICAgICAgIFtJTl0gVGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHNlYXJjaC4KKyAgICAgICAqIEBwYXJhbSBiICAgICAgICAgIFtJTl0gT25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgdGV4dCB0byBzZWFyY2guCisgICAgICAgKiBAcGFyYW0gcmUgICAgICAgICBbSU5dIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VhcmNoIGZvci4KKyAgICAgICAqIEBwYXJhbSBzdWJtYXRjaCAgIFtJTl0gV2hpY2ggc3VibWF0Y2ggdG8gcmV0dXJuLiAgVGhlcmUgYXJlIHNvbWUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbCB2YWx1ZXMgZm9yIHRoaXMgcGFyYW1ldGVyOgorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAtIC0xIGVhY2ggZW51bWVyYXRlZCBzdWJleHByZXNzaW9uIGRvZXMgTk9UCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiAoYWthIGZpZWxkCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXR0aW5nKQorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAtIDAgdGhlIGVudGlyZSBzdHJpbmcgbWF0Y2hpbmcgdGhlCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZXhwcmVzc2lvbiBpcyByZXR1cm5lZCBmb3IgZWFjaCBtYXRjaAorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhpbiB0aGUgdGV4dC4KKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgLSA+MCBlbnVtZXJhdGVzIG9ubHkgdGhlIGluZGljYXRlZAorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmV4cHJlc3Npb24gZnJvbSBhIG1hdGNoIHdpdGhpbiB0aGUgdGV4dC4KKyAgICAgICAqIEBwYXJhbSBtICAgICAgICAgIFtJTl0gUG9saWN5IGZsYWdzIGZvciBtYXRjaCBydWxlcy4KKyAgICAgICAqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIEBkb2N0b2RvCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKF9CaV9pdGVyIF9fYSwgX0JpX2l0ZXIgX19iLCBjb25zdCByZWdleF90eXBlJiBfX3JlLAorCQkJICAgaW50IF9fc3VibWF0Y2ggPSAwLAorCQkJICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19tCisJCQkgICA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCk7CisKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhICVyZWdleF90b2tlbl9pdGVyYXRvci4uLgorICAgICAgICogQHBhcmFtIGEgICAgICAgICAgW0lOXSBUaGUgc3RhcnQgb2YgdGhlIHRleHQgdG8gc2VhcmNoLgorICAgICAgICogQHBhcmFtIGIgICAgICAgICAgW0lOXSBPbmUtcGFzdC10aGUtZW5kIG9mIHRoZSB0ZXh0IHRvIHNlYXJjaC4KKyAgICAgICAqIEBwYXJhbSByZSAgICAgICAgIFtJTl0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzZWFyY2ggZm9yLgorICAgICAgICogQHBhcmFtIHN1Ym1hdGNoZXMgW0lOXSBBIGxpc3Qgb2Ygc3ViZXhwcmVzc2lvbnMgdG8gcmV0dXJuIGZvciBlYWNoCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCB3aXRoaW4gdGhlIHRleHQuCisgICAgICAgKiBAcGFyYW0gbSAgICAgICAgICBbSU5dIFBvbGljeSBmbGFncyBmb3IgbWF0Y2ggcnVsZXMuCisgICAgICAgKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICByZWdleF90b2tlbl9pdGVyYXRvcihfQmlfaXRlciBfX2EsIF9CaV9pdGVyIF9fYiwKKwkJCSAgIGNvbnN0IHJlZ2V4X3R5cGUmIF9fcmUsCisJCQkgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBfX3N1Ym1hdGNoZXMsCisJCQkgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX20KKwkJCSAgICAgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworCisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IuLi4KKyAgICAgICAqIEBwYXJhbSBhICAgICAgICAgIFtJTl0gVGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHNlYXJjaC4KKyAgICAgICAqIEBwYXJhbSBiICAgICAgICAgIFtJTl0gT25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgdGV4dCB0byBzZWFyY2guCisgICAgICAgKiBAcGFyYW0gcmUgICAgICAgICBbSU5dIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VhcmNoIGZvci4KKyAgICAgICAqIEBwYXJhbSBzdWJtYXRjaGVzIFtJTl0gQSBsaXN0IG9mIHN1YmV4cHJlc3Npb25zIHRvIHJldHVybiBmb3IgZWFjaAorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2ggd2l0aGluIHRoZSB0ZXh0LgorICAgICAgICogQHBhcmFtIG0gICAgICAgICAgW0lOXSBQb2xpY3kgZmxhZ3MgZm9yIG1hdGNoIHJ1bGVzLgorICAgICAgIAorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfTm0+CisgICAgICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKF9CaV9pdGVyIF9fYSwgX0JpX2l0ZXIgX19iLAorCQkJICAgICBjb25zdCByZWdleF90eXBlJiBfX3JlLAorCQkJICAgICBjb25zdCBpbnQgKCZfX3N1Ym1hdGNoZXMpW19ObV0sCisJCQkgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fbQorCQkJICAgICA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCk7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvcHkgY29uc3RydWN0cyBhICVyZWdleF90b2tlbl9pdGVyYXRvci4KKyAgICAgICAqIEBwYXJhbSByaHMgW0lOXSBBICVyZWdleF90b2tlbl9pdGVyYXRvciB0byBjb3B5LgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKGNvbnN0IHJlZ2V4X3Rva2VuX2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEFzc2lnbnMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IgdG8gYW5vdGhlci4KKyAgICAgICAqIEBwYXJhbSByaHMgW0lOXSBBICVyZWdleF90b2tlbl9pdGVyYXRvciB0byBjb3B5LgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHJlZ2V4X3Rva2VuX2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbXBhcmVzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yIHRvIGFub3RoZXIgZm9yIGVxdWFsaXR5LgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgcmVnZXhfdG9rZW5faXRlcmF0b3ImIF9fcmhzKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29tcGFyZXMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IgdG8gYW5vdGhlciBmb3IgaW5lcXVhbGl0eS4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IHJlZ2V4X3Rva2VuX2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIERlcmVmZXJlbmNlcyBhICVyZWdleF90b2tlbl9pdGVyYXRvci4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICBjb25zdCB2YWx1ZV90eXBlJgorICAgICAgb3BlcmF0b3IqKCk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNlbGVjdHMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IgbWVtYmVyLgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIGNvbnN0IHZhbHVlX3R5cGUqCisgICAgICBvcGVyYXRvci0+KCk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluY3JlbWVudHMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgcmVnZXhfdG9rZW5faXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFBvc3RpbmNyZW1lbnRzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yLgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCk7CisgICAgICAKKyAgICBwcml2YXRlOiAvLyBkYXRhIG1lbWJlcnMgZm9yIGV4cG9zaXRpb24gb25seToKKyAgICAgIHR5cGVkZWYgcmVnZXhfaXRlcmF0b3I8X0JpX2l0ZXIsIF9DaF90eXBlLCBfUnhfdHJhaXRzPiBwb3NpdGlvbl9pdGVyYXRvcjsKKworICAgICAgcG9zaXRpb25faXRlcmF0b3IgX19wb3NpdGlvbjsKKyAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fcmVzdWx0OworICAgICAgdmFsdWVfdHlwZSAgICAgICAgX19zdWZmaXg7CisgICAgICBzdGQ6OnNpemVfdCAgICAgICBfX247CisgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICBfX3N1YnM7CisgICAgfTsKKworICAvKiogQGJyaWVmIFRva2VuIGl0ZXJhdG9yIGZvciBDLXN0eWxlIE5VTEwtdGVybWluYXRlZCBzdHJpbmdzLiAqLworICB0eXBlZGVmIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yPGNvbnN0IGNoYXIqPiAgICAgICAgICAgICBjcmVnZXhfdG9rZW5faXRlcmF0b3I7CisgIC8qKiBAYnJpZWYgVG9rZW4gaXRlcmF0b3IgZm9yIHN0YW5kYXJkIHN0cmluZ3MuICovCisgIHR5cGVkZWYgcmVnZXhfdG9rZW5faXRlcmF0b3I8c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gIHNyZWdleF90b2tlbl9pdGVyYXRvcjsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICAvKiogQGJyaWVmIFRva2VuIGl0ZXJhdG9yIGZvciBDLXN0eWxlIE5VTEwtdGVybWluYXRlZCB3aWRlIHN0cmluZ3MuICovCisgIHR5cGVkZWYgcmVnZXhfdG9rZW5faXRlcmF0b3I8Y29uc3Qgd2NoYXJfdCo+ICAgICAgICAgIHdjcmVnZXhfdG9rZW5faXRlcmF0b3I7CisgIC8qKiBAYnJpZWYgVG9rZW4gaXRlcmF0b3IgZm9yIHN0YW5kYXJkIHdpZGUtY2hhcmFjdGVyIHN0cmluZ3MuICovCisgIHR5cGVkZWYgcmVnZXhfdG9rZW5faXRlcmF0b3I8d3N0cmluZzo6Y29uc3RfaXRlcmF0b3I+IHdzcmVnZXhfdG9rZW5faXRlcmF0b3I7CisjZW5kaWYKKyAgCisgIC8vQH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfUkVHRVgKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3JpZW1hbm5femV0YS50Y2MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9yaWVtYW5uX3pldGEudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjMyMDQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9yaWVtYW5uX3pldGEudGNjCkBAIC0wLDAgKzEsNDMzIEBACisvLyBTcGVjaWFsIGZ1bmN0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9yaWVtYW5uX3pldGEudGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dHIxL2NtYXRofQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyIFRSMTogNS4yICBTcGVjaWFsIGZ1bmN0aW9ucworLy8KKworLy8gV3JpdHRlbiBieSBFZHdhcmQgU21pdGgtUm93bGFuZCBiYXNlZCBvbjoKKy8vICAgKDEpIEhhbmRib29rIG9mIE1hdGhlbWF0aWNhbCBGdW5jdGlvbnMsCisvLyAgICAgICBFZC4gYnkgTWlsdG9uIEFicmFtb3dpdHogYW5kIElyZW5lIEEuIFN0ZWd1biwKKy8vICAgICAgIERvdmVyIFB1YmxpY2F0aW9ucywgTmV3LVlvcmssIFNlY3Rpb24gNSwgcHAuIDgwNy04MDguCisvLyAgICgyKSBUaGUgR251IFNjaWVudGlmaWMgTGlicmFyeSwgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dzbAorLy8gICAoMykgR2FtbWEsIEV4cGxvcmluZyBFdWxlcidzIENvbnN0YW50LCBKdWxpYW4gSGF2aWwsCisvLyAgICAgICBQcmluY2V0b24sIDIwMDMuCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX1JJRU1BTk5fWkVUQV9UQ0MKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX1JJRU1BTk5fWkVUQV9UQ0MgMQorCisjaW5jbHVkZSAic3BlY2lhbF9mdW5jdGlvbl91dGlsLmgiCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworICAvLyBbNS4yXSBTcGVjaWFsIGZ1bmN0aW9ucworCisgIC8vIEltcGxlbWVudGF0aW9uLXNwYWNlIGRldGFpbHMuCisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgQ29tcHV0ZSB0aGUgUmllbWFubiB6ZXRhIGZ1bmN0aW9uIEBmJCBcemV0YShzKSBAZiQKKyAgICAgKiAgICAgICAgICAgYnkgc3VtbWF0aW9uIGZvciBzID4gMS4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBSaWVtYW5uIHpldGEgZnVuY3Rpb24gaXMgZGVmaW5lZCBieToKKyAgICAgKiAgICBcZlsKKyAgICAgKiAgICAgIFx6ZXRhKHMpID0gXHN1bV97az0xfV57XGluZnR5fSBcZnJhY3sxfXtrXntzfX0gZm9yIHMgPiAxCisgICAgICogICAgXGZdCisgICAgICogICBGb3IgcyA8IDEgdXNlIHRoZSByZWZsZWN0aW9uIGZvcm11bGE6CisgICAgICogICAgXGZbCisgICAgICogICAgICBcemV0YShzKSA9IDJecyBccGlee3MtMX0gXEdhbW1hKDEtcykgXHpldGEoMS1zKQorICAgICAqICAgIFxmXQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3JpZW1hbm5femV0YV9zdW0oX1RwIF9fcykKKyAgICB7CisgICAgICAvLyAgQSB1c2VyIHNob3VsZG4ndCBnZXQgdG8gdGhpcy4KKyAgICAgIGlmIChfX3MgPCBfVHAoMSkpCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJCYWQgYXJndW1lbnQgaW4gemV0YSBzdW0uIikpOworCisgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgbWF4X2l0ZXIgPSAxMDAwMDsKKyAgICAgIF9UcCBfX3pldGEgPSBfVHAoMCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2sgPSAxOyBfX2sgPCBtYXhfaXRlcjsgKytfX2spCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX190ZXJtID0gc3RkOjpwb3coc3RhdGljX2Nhc3Q8X1RwPihfX2spLCAtX19zKTsKKyAgICAgICAgICBpZiAoX190ZXJtIDwgc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIF9femV0YSArPSBfX3Rlcm07CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIF9femV0YTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBFdmFsdWF0ZSB0aGUgUmllbWFubiB6ZXRhIGZ1bmN0aW9uIEBmJCBcemV0YShzKSBAZiQKKyAgICAgKiAgICAgICAgICAgYnkgYW4gYWx0ZXJuYXRlIHNlcmllcyBmb3IgcyA+IDAuCisgICAgICogCisgICAgICogICBUaGUgUmllbWFubiB6ZXRhIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnk6CisgICAgICogICAgXGZbCisgICAgICogICAgICBcemV0YShzKSA9IFxzdW1fe2s9MX1ee1xpbmZ0eX0gXGZyYWN7MX17a157c319IGZvciBzID4gMQorICAgICAqICAgIFxmXQorICAgICAqICAgRm9yIHMgPCAxIHVzZSB0aGUgcmVmbGVjdGlvbiBmb3JtdWxhOgorICAgICAqICAgIFxmWworICAgICAqICAgICAgXHpldGEocykgPSAyXnMgXHBpXntzLTF9IFxHYW1tYSgxLXMpIFx6ZXRhKDEtcykKKyAgICAgKiAgICBcZl0KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19yaWVtYW5uX3pldGFfYWx0KF9UcCBfX3MpCisgICAgeworICAgICAgX1RwIF9fc2duID0gX1RwKDEpOworICAgICAgX1RwIF9femV0YSA9IF9UcCgwKTsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9faSA9IDE7IF9faSA8IDEwMDAwMDAwOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX3Rlcm0gPSBfX3NnbiAvIHN0ZDo6cG93KF9faSwgX19zKTsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX190ZXJtKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgX196ZXRhICs9IF9fdGVybTsKKyAgICAgICAgICBfX3NnbiAqPSBfVHAoLTEpOworICAgICAgICB9CisgICAgICBfX3pldGEgLz0gX1RwKDEpIC0gc3RkOjpwb3coX1RwKDIpLCBfVHAoMSkgLSBfX3MpOworCisgICAgICByZXR1cm4gX196ZXRhOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIEV2YWx1YXRlIHRoZSBSaWVtYW5uIHpldGEgZnVuY3Rpb24gYnkgc2VyaWVzIGZvciBhbGwgcyAhPSAxLgorICAgICAqICAgICAgICAgICBDb252ZXJnZW5jZSBpcyBncmVhdCB1bnRpbCBsYXJnaXNoIG5lZ2F0aXZlIG51bWJlcnMuCisgICAgICogICAgICAgICAgIFRoZW4gdGhlIGNvbnZlcmdlbmNlIG9mIHRoZSA+IDAgc3VtIGdldHMgYmV0dGVyLgorICAgICAqCisgICAgICogICBUaGUgc2VyaWVzIGlzOgorICAgICAqICAgIFxmWworICAgICAqICAgICAgXHpldGEocykgPSBcZnJhY3sxfXsxLTJeezEtc319CisgICAgICogICAgICAgICAgICAgICAgIFxzdW1fe249MH1ee1xpbmZ0eX0gXGZyYWN7MX17Ml57bisxfX0KKyAgICAgKiAgICAgICAgICAgICAgICAgXHN1bV97az0wfV57bn0gKC0xKV5rIFxmcmFje24hfXsobi1rKSFrIX0gKGsrMSleey1zfQorICAgICAqICAgIFxmXQorICAgICAqICAgSGF2aWwgMjAwMywgcC4gMjA2LgorICAgICAqCisgICAgICogICBUaGUgUmllbWFubiB6ZXRhIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnk6CisgICAgICogICAgXGZbCisgICAgICogICAgICBcemV0YShzKSA9IFxzdW1fe2s9MX1ee1xpbmZ0eX0gXGZyYWN7MX17a157c319IGZvciBzID4gMQorICAgICAqICAgIFxmXQorICAgICAqICAgRm9yIHMgPCAxIHVzZSB0aGUgcmVmbGVjdGlvbiBmb3JtdWxhOgorICAgICAqICAgIFxmWworICAgICAqICAgICAgXHpldGEocykgPSAyXnMgXHBpXntzLTF9IFxHYW1tYSgxLXMpIFx6ZXRhKDEtcykKKyAgICAgKiAgICBcZl0KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19yaWVtYW5uX3pldGFfZ2xvYihfVHAgX19zKQorICAgIHsKKyAgICAgIF9UcCBfX3pldGEgPSBfVHAoMCk7CisKKyAgICAgIGNvbnN0IF9UcCBfX2VwcyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworICAgICAgLy8gIE1heCBlIGV4cG9uZW50IGJlZm9yZSBvdmVyZmxvdy4KKyAgICAgIGNvbnN0IF9UcCBfX21heF9iaW5jb2VmZiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6bWF4X2V4cG9uZW50MTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0ZDo6bG9nKF9UcCgxMCkpIC0gX1RwKDEpOworCisgICAgICAvLyAgVGhpcyBzZXJpZXMgd29ya3MgdW50aWwgdGhlIGJpbm9taWFsIGNvZWZmaWNpZW50IGJsb3dzIHVwCisgICAgICAvLyAgc28gdXNlIHJlZmxlY3Rpb24uCisgICAgICBpZiAoX19zIDwgX1RwKDApKQorICAgICAgICB7CisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgICAgICAgIGlmIChzdGQ6OnRyMTo6Zm1vZChfX3MsX1RwKDIpKSA9PSBfVHAoMCkpCisgICAgICAgICAgICByZXR1cm4gX1RwKDApOworICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfVHAgX196ZXRhID0gX19yaWVtYW5uX3pldGFfZ2xvYihfVHAoMSkgLSBfX3MpOworICAgICAgICAgICAgICBfX3pldGEgKj0gc3RkOjpwb3coX1RwKDIpCisgICAgICAgICAgICAgICAgICAgICAqIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpLCBfX3MpCisgICAgICAgICAgICAgICAgICAgICAqIHN0ZDo6c2luKF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waV8yKCkgKiBfX3MpCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgICAgICAgICAgICAgICAgICAgKiBzdGQ6OmV4cChzdGQ6OnRyMTo6bGdhbW1hKF9UcCgxKSAtIF9fcykpCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgKiBzdGQ6OmV4cChfX2xvZ19nYW1tYShfVHAoMSkgLSBfX3MpKQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAvIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpOworICAgICAgICAgICAgICByZXR1cm4gX196ZXRhOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIF9UcCBfX251bSA9IF9UcCgwLjVMKTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBfX21heGl0ID0gMTAwMDA7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAwOyBfX2kgPCBfX21heGl0OyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIGJvb2wgX19wdW50ID0gZmFsc2U7CisgICAgICAgICAgX1RwIF9fc2duID0gX1RwKDEpOworICAgICAgICAgIF9UcCBfX3Rlcm0gPSBfVHAoMCk7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19qID0gMDsgX19qIDw9IF9faTsgKytfX2opCisgICAgICAgICAgICB7CisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgICAgICAgICAgICBfVHAgX19iaW5jb2VmZiA9ICBzdGQ6OnRyMTo6bGdhbW1hKF9UcCgxICsgX19pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc3RkOjp0cjE6OmxnYW1tYShfVHAoMSArIF9faikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHN0ZDo6dHIxOjpsZ2FtbWEoX1RwKDEgKyBfX2kgLSBfX2opKTsKKyNlbHNlCisgICAgICAgICAgICAgIF9UcCBfX2JpbmNvZWZmID0gIF9fbG9nX2dhbW1hKF9UcCgxICsgX19pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gX19sb2dfZ2FtbWEoX1RwKDEgKyBfX2opKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBfX2xvZ19nYW1tYShfVHAoMSArIF9faSAtIF9faikpOworI2VuZGlmCisgICAgICAgICAgICAgIGlmIChfX2JpbmNvZWZmID4gX19tYXhfYmluY29lZmYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLy8gIFRoaXMgb25seSBnZXRzIGhpdCBmb3IgeCA8PCAwLgorICAgICAgICAgICAgICAgICAgX19wdW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgX19iaW5jb2VmZiA9IHN0ZDo6ZXhwKF9fYmluY29lZmYpOworICAgICAgICAgICAgICBfX3Rlcm0gKz0gX19zZ24gKiBfX2JpbmNvZWZmICogc3RkOjpwb3coX1RwKDEgKyBfX2opLCAtX19zKTsKKyAgICAgICAgICAgICAgX19zZ24gKj0gX1RwKC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoX19wdW50KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgX190ZXJtICo9IF9fbnVtOworICAgICAgICAgIF9femV0YSArPSBfX3Rlcm07CisgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fdGVybS9fX3pldGEpIDwgX19lcHMpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBfX251bSAqPSBfVHAoMC41TCk7CisgICAgICAgIH0KKworICAgICAgX196ZXRhIC89IF9UcCgxKSAtIHN0ZDo6cG93KF9UcCgyKSwgX1RwKDEpIC0gX19zKTsKKworICAgICAgcmV0dXJuIF9femV0YTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBDb21wdXRlIHRoZSBSaWVtYW5uIHpldGEgZnVuY3Rpb24gQGYkIFx6ZXRhKHMpIEBmJAorICAgICAqICAgICAgICAgICB1c2luZyB0aGUgcHJvZHVjdCBvdmVyIHByaW1lIGZhY3RvcnMuCisgICAgICogICAgXGZbCisgICAgICogICAgICBcemV0YShzKSA9IFxQaV97aT0xfV5caW5mdHkgXGZyYWN7MX17MSAtIHBfaV57LXN9fQorICAgICAqICAgIFxmXQorICAgICAqICAgIHdoZXJlIEBmJCB7cF9pfSBAZiQgYXJlIHRoZSBwcmltZSBudW1iZXJzLgorICAgICAqIAorICAgICAqICAgVGhlIFJpZW1hbm4gemV0YSBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5OgorICAgICAqICAgIFxmWworICAgICAqICAgICAgXHpldGEocykgPSBcc3VtX3trPTF9XntcaW5mdHl9IFxmcmFjezF9e2tee3N9fSBmb3IgcyA+IDEKKyAgICAgKiAgICBcZl0KKyAgICAgKiAgIEZvciBzIDwgMSB1c2UgdGhlIHJlZmxlY3Rpb24gZm9ybXVsYToKKyAgICAgKiAgICBcZlsKKyAgICAgKiAgICAgIFx6ZXRhKHMpID0gMl5zIFxwaV57cy0xfSBcR2FtbWEoMS1zKSBcemV0YSgxLXMpCisgICAgICogICAgXGZdCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fcmllbWFubl96ZXRhX3Byb2R1Y3QoX1RwIF9fcykKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgX1RwIF9fcHJpbWVbXSA9IHsKKyAgICAgICAgX1RwKDIpLCBfVHAoMyksIF9UcCg1KSwgX1RwKDcpLCBfVHAoMTEpLCBfVHAoMTMpLCBfVHAoMTcpLCBfVHAoMTkpLAorICAgICAgICBfVHAoMjMpLCBfVHAoMjkpLCBfVHAoMzEpLCBfVHAoMzcpLCBfVHAoNDEpLCBfVHAoNDMpLCBfVHAoNDcpLAorICAgICAgICBfVHAoNTMpLCBfVHAoNTkpLCBfVHAoNjEpLCBfVHAoNjcpLCBfVHAoNzEpLCBfVHAoNzMpLCBfVHAoNzkpLAorICAgICAgICBfVHAoODMpLCBfVHAoODkpLCBfVHAoOTcpLCBfVHAoMTAxKSwgX1RwKDEwMyksIF9UcCgxMDcpLCBfVHAoMTA5KQorICAgICAgfTsKKyAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgX19udW1fcHJpbWVzID0gc2l6ZW9mKF9fcHJpbWUpIC8gc2l6ZW9mKF9UcCk7CisKKyAgICAgIF9UcCBfX3pldGEgPSBfVHAoMSk7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAwOyBfX2kgPCBfX251bV9wcmltZXM7ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9fZmFjdCA9IF9UcCgxKSAtIHN0ZDo6cG93KF9fcHJpbWVbX19pXSwgLV9fcyk7CisgICAgICAgICAgX196ZXRhICo9IF9fZmFjdDsKKyAgICAgICAgICBpZiAoX1RwKDEpIC0gX19mYWN0IDwgc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICBfX3pldGEgPSBfVHAoMSkgLyBfX3pldGE7CisKKyAgICAgIHJldHVybiBfX3pldGE7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBSaWVtYW5uIHpldGEgZnVuY3Rpb24gQGYkIFx6ZXRhKHMpIEBmJC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBSaWVtYW5uIHpldGEgZnVuY3Rpb24gaXMgZGVmaW5lZCBieToKKyAgICAgKiAgICBcZlsKKyAgICAgKiAgICAgIFx6ZXRhKHMpID0gXHN1bV97az0xfV57XGluZnR5fSBrXnstc30gZm9yIHMgPiAxCisgICAgICogICAgICAgICAgICAgICAgIFxmcmFjeygyXHBpKV5zfXtwaX0gc2luKFxmcmFje1xwaSBzfXsyfSkKKyAgICAgKiAgICAgICAgICAgICAgICAgXEdhbW1hICgxIC0gcykgXHpldGEgKDEgLSBzKSBmb3IgcyA8IDEKKyAgICAgKiAgICBcZl0KKyAgICAgKiAgIEZvciBzIDwgMSB1c2UgdGhlIHJlZmxlY3Rpb24gZm9ybXVsYToKKyAgICAgKiAgICBcZlsKKyAgICAgKiAgICAgIFx6ZXRhKHMpID0gMl5zIFxwaV57cy0xfSBcR2FtbWEoMS1zKSBcemV0YSgxLXMpCisgICAgICogICAgXGZdCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fcmllbWFubl96ZXRhKF9UcCBfX3MpCisgICAgeworICAgICAgaWYgKF9faXNuYW4oX19zKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChfX3MgPT0gX1RwKDEpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjppbmZpbml0eSgpOworICAgICAgZWxzZSBpZiAoX19zIDwgLV9UcCgxOSkpCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX196ZXRhID0gX19yaWVtYW5uX3pldGFfcHJvZHVjdChfVHAoMSkgLSBfX3MpOworICAgICAgICAgIF9femV0YSAqPSBzdGQ6OnBvdyhfVHAoMikgKiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSwgX19zKQorICAgICAgICAgICAgICAgICAqIHN0ZDo6c2luKF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waV8yKCkgKiBfX3MpCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgICAgICAgICAgICAgICAqIHN0ZDo6ZXhwKHN0ZDo6dHIxOjpsZ2FtbWEoX1RwKDEpIC0gX19zKSkKKyNlbHNlCisgICAgICAgICAgICAgICAgICogc3RkOjpleHAoX19sb2dfZ2FtbWEoX1RwKDEpIC0gX19zKSkKKyNlbmRpZgorICAgICAgICAgICAgICAgICAvIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpOworICAgICAgICAgIHJldHVybiBfX3pldGE7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9fcyA8IF9UcCgyMCkpCisgICAgICAgIHsKKyAgICAgICAgICAvLyAgR2xvYmFsIGRvdWJsZSBzdW0gb3IgTWNMYXVyaW4/CisgICAgICAgICAgYm9vbCBfX2dsb2IgPSB0cnVlOworICAgICAgICAgIGlmIChfX2dsb2IpCisgICAgICAgICAgICByZXR1cm4gX19yaWVtYW5uX3pldGFfZ2xvYihfX3MpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKF9fcyA+IF9UcCgxKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gX19yaWVtYW5uX3pldGFfc3VtKF9fcyk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfVHAgX196ZXRhID0gc3RkOjpwb3coX1RwKDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCksIF9fcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0ZDo6c2luKF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waV8yKCkgKiBfX3MpCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0ZDo6dHIxOjp0Z2FtbWEoX1RwKDEpIC0gX19zKQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdGQ6OmV4cChfX2xvZ19nYW1tYShfVHAoMSkgLSBfX3MpKQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogX19yaWVtYW5uX3pldGFfc3VtKF9UcCgxKSAtIF9fcyk7CisgICAgICAgICAgICAgICAgICByZXR1cm4gX196ZXRhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX19yaWVtYW5uX3pldGFfcHJvZHVjdChfX3MpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgSHVyd2l0eiB6ZXRhIGZ1bmN0aW9uIEBmJCBcemV0YSh4LHMpIEBmJAorICAgICAqICAgICAgICAgICBmb3IgYWxsIHMgIT0gMSBhbmQgeCA+IC0xLgorICAgICAqIAorICAgICAqICAgVGhlIEh1cndpdHogemV0YSBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgIFx6ZXRhKHgscykgPSBcc3VtX3tuPTB9XntcaW5mdHl9IFxmcmFjezF9eyhuICsgeClec30KKyAgICAgKiAgIEBmXQorICAgICAqICAgVGhlIFJpZW1hbm4gemV0YSBmdW5jdGlvbiBpcyBhIHNwZWNpYWwgY2FzZToKKyAgICAgKiAgIEBmWworICAgICAqICAgICBcemV0YShzKSA9IFx6ZXRhKDEscykKKyAgICAgKiAgIEBmXQorICAgICAqIAorICAgICAqICAgVGhpcyBmdW5jdGlvbnMgdXNlcyB0aGUgZG91YmxlIHN1bSB0aGF0IGNvbnZlcmdlcyBmb3IgcyAhPSAxCisgICAgICogICBhbmQgeCA+IC0xOgorICAgICAqICAgQGZbCisgICAgICogICAgIFx6ZXRhKHgscykgPSBcZnJhY3sxfXtzLTF9CisgICAgICogICAgICAgICAgICAgICAgXHN1bV97bj0wfV57XGluZnR5fSBcZnJhY3sxfXtuICsgMX0KKyAgICAgKiAgICAgICAgICAgICAgICBcc3VtX3trPTB9XntufSAoLTEpXmsgXGZyYWN7biF9eyhuLWspIWshfSAoeCtrKV57LXN9CisgICAgICogICBAZl0KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19odXJ3aXR6X3pldGFfZ2xvYihfVHAgX19hLCBfVHAgX19zKQorICAgIHsKKyAgICAgIF9UcCBfX3pldGEgPSBfVHAoMCk7CisKKyAgICAgIGNvbnN0IF9UcCBfX2VwcyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworICAgICAgLy8gIE1heCBlIGV4cG9uZW50IGJlZm9yZSBvdmVyZmxvdy4KKyAgICAgIGNvbnN0IF9UcCBfX21heF9iaW5jb2VmZiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6bWF4X2V4cG9uZW50MTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0ZDo6bG9nKF9UcCgxMCkpIC0gX1RwKDEpOworCisgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgX19tYXhpdCA9IDEwMDAwOworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19pID0gMDsgX19pIDwgX19tYXhpdDsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBib29sIF9fcHVudCA9IGZhbHNlOworICAgICAgICAgIF9UcCBfX3NnbiA9IF9UcCgxKTsKKyAgICAgICAgICBfVHAgX190ZXJtID0gX1RwKDApOworICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IF9faiA9IDA7IF9faiA8PSBfX2k7ICsrX19qKQorICAgICAgICAgICAgeworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgICAgICAgICAgX1RwIF9fYmluY29lZmYgPSAgc3RkOjp0cjE6OmxnYW1tYShfVHAoMSArIF9faSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHN0ZDo6dHIxOjpsZ2FtbWEoX1RwKDEgKyBfX2opKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzdGQ6OnRyMTo6bGdhbW1hKF9UcCgxICsgX19pIC0gX19qKSk7CisjZWxzZQorICAgICAgICAgICAgICBfVHAgX19iaW5jb2VmZiA9ICBfX2xvZ19nYW1tYShfVHAoMSArIF9faSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIF9fbG9nX2dhbW1hKF9UcCgxICsgX19qKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gX19sb2dfZ2FtbWEoX1RwKDEgKyBfX2kgLSBfX2opKTsKKyNlbmRpZgorICAgICAgICAgICAgICBpZiAoX19iaW5jb2VmZiA+IF9fbWF4X2JpbmNvZWZmKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8vICBUaGlzIG9ubHkgZ2V0cyBoaXQgZm9yIHggPDwgMC4KKyAgICAgICAgICAgICAgICAgIF9fcHVudCA9IHRydWU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIF9fYmluY29lZmYgPSBzdGQ6OmV4cChfX2JpbmNvZWZmKTsKKyAgICAgICAgICAgICAgX190ZXJtICs9IF9fc2duICogX19iaW5jb2VmZiAqIHN0ZDo6cG93KF9UcChfX2EgKyBfX2opLCAtX19zKTsKKyAgICAgICAgICAgICAgX19zZ24gKj0gX1RwKC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoX19wdW50KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgX190ZXJtIC89IF9UcChfX2kgKyAxKTsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX190ZXJtIC8gX196ZXRhKSA8IF9fZXBzKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgX196ZXRhICs9IF9fdGVybTsKKyAgICAgICAgfQorCisgICAgICBfX3pldGEgLz0gX19zIC0gX1RwKDEpOworCisgICAgICByZXR1cm4gX196ZXRhOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgSHVyd2l0eiB6ZXRhIGZ1bmN0aW9uIEBmJCBcemV0YSh4LHMpIEBmJAorICAgICAqICAgICAgICAgICBmb3IgYWxsIHMgIT0gMSBhbmQgeCA+IC0xLgorICAgICAqIAorICAgICAqICAgVGhlIEh1cndpdHogemV0YSBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgIFx6ZXRhKHgscykgPSBcc3VtX3tuPTB9XntcaW5mdHl9IFxmcmFjezF9eyhuICsgeClec30KKyAgICAgKiAgIEBmXQorICAgICAqICAgVGhlIFJpZW1hbm4gemV0YSBmdW5jdGlvbiBpcyBhIHNwZWNpYWwgY2FzZToKKyAgICAgKiAgIEBmWworICAgICAqICAgICBcemV0YShzKSA9IFx6ZXRhKDEscykKKyAgICAgKiAgIEBmXQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX19odXJ3aXR6X3pldGEoX1RwIF9fYSwgX1RwIF9fcykKKyAgICB7IHJldHVybiBfX2h1cndpdHpfemV0YV9nbG9iKF9fYSwgX19zKTsgfQorCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSBzdGQ6OnRyMTo6X19kZXRhaWwKK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9SSUVNQU5OX1pFVEFfVENDCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9zaGFyZWRfcHRyLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9zaGFyZWRfcHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E4ZjA2NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3NoYXJlZF9wdHIuaApAQCAtMCwwICsxLDExNzIgQEAKKy8vIDx0cjEvc2hhcmVkX3B0ci5oPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyAgc2hhcmVkX2NvdW50LmhwcAorLy8gIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiwgMjAwMyBQZXRlciBEaW1vdiBhbmQgTXVsdGkgTWVkaWEgTHRkLgorCisvLyAgc2hhcmVkX3B0ci5ocHAKKy8vICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgR3JlZyBDb2x2aW4gYW5kIEJlbWFuIERhd2VzLgorLy8gIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMyBQZXRlciBEaW1vdgorCisvLyAgd2Vha19wdHIuaHBwCisvLyAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzIFBldGVyIERpbW92CisKKy8vICBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcy5ocHAKKy8vICBDb3B5cmlnaHQgKEMpIDIwMDIgUGV0ZXIgRGltb3YKKworLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlCisvLyBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvLyBHQ0MgTm90ZTogIGJhc2VkIG9uIHZlcnNpb24gMS4zMi4wIG9mIHRoZSBCb29zdCBsaWJyYXJ5LgorCisvKiogQGZpbGUgdHIxL3NoYXJlZF9wdHIuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3RyMS9tZW1vcnl9CisgKi8KKworI2lmbmRlZiBfVFIxX1NIQVJFRF9QVFJfSAorI2RlZmluZSBfVFIxX1NIQVJFRF9QVFJfSCAxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworIC8qKgorICAgKiAgQGJyaWVmICBFeGNlcHRpb24gcG9zc2libHkgdGhyb3duIGJ5IEBjIHNoYXJlZF9wdHIuCisgICAqICBAaW5ncm91cCBleGNlcHRpb25zCisgICAqLworICBjbGFzcyBiYWRfd2Vha19wdHIgOiBwdWJsaWMgc3RkOjpleGNlcHRpb24KKyAgeworICBwdWJsaWM6CisgICAgdmlydHVhbCBjaGFyIGNvbnN0KgorICAgIHdoYXQoKSBjb25zdCB0aHJvdygpCisgICAgeyByZXR1cm4gInRyMTo6YmFkX3dlYWtfcHRyIjsgfQorICB9OworCisgIC8vIFN1YnN0aXR1dGUgZm9yIGJhZF93ZWFrX3B0ciBvYmplY3QgaW4gdGhlIGNhc2Ugb2YgLWZuby1leGNlcHRpb25zLgorICBpbmxpbmUgdm9pZAorICBfX3Rocm93X2JhZF93ZWFrX3B0cigpCisgIHsgX0dMSUJDWFhfVEhST1dfT1JfQUJPUlQoYmFkX3dlYWtfcHRyKCkpOyB9CisKKyAgdXNpbmcgX19nbnVfY3h4OjpfTG9ja19wb2xpY3k7CisgIHVzaW5nIF9fZ251X2N4eDo6X19kZWZhdWx0X2xvY2tfcG9saWN5OworICB1c2luZyBfX2dudV9jeHg6Ol9TX3NpbmdsZTsKKyAgdXNpbmcgX19nbnVfY3h4OjpfU19tdXRleDsKKyAgdXNpbmcgX19nbnVfY3h4OjpfU19hdG9taWM7CisKKyAgLy8gRW1wdHkgaGVscGVyIGNsYXNzIGV4Y2VwdCB3aGVuIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBpcyBfU19tdXRleC4KKyAgdGVtcGxhdGU8X0xvY2tfcG9saWN5IF9McD4KKyAgICBjbGFzcyBfTXV0ZXhfYmFzZQorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLyBUaGUgYXRvbWljIHBvbGljeSB1c2VzIGZ1bGx5LWZlbmNlZCBidWlsdGlucywgc2luZ2xlIGRvZXNuJ3QgY2FyZS4KKyAgICAgIGVudW0geyBfU19uZWVkX2JhcnJpZXJzID0gMCB9OworICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIGNsYXNzIF9NdXRleF9iYXNlPF9TX211dGV4PgorICAgIDogcHVibGljIF9fZ251X2N4eDo6X19tdXRleAorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLyBUaGlzIHBvbGljeSBpcyB1c2VkIHdoZW4gYXRvbWljIGJ1aWx0aW5zIGFyZSBub3QgYXZhaWxhYmxlLgorICAgICAgLy8gVGhlIHJlcGxhY2VtZW50IGF0b21pYyBvcGVyYXRpb25zIG1pZ2h0IG5vdCBoYXZlIHRoZSBuZWNlc3NhcnkKKyAgICAgIC8vIG1lbW9yeSBiYXJyaWVycy4KKyAgICAgIGVudW0geyBfU19uZWVkX2JhcnJpZXJzID0gMSB9OworICAgIH07CisKKyAgdGVtcGxhdGU8X0xvY2tfcG9saWN5IF9McCA9IF9fZGVmYXVsdF9sb2NrX3BvbGljeT4KKyAgICBjbGFzcyBfU3BfY291bnRlZF9iYXNlCisgICAgOiBwdWJsaWMgX011dGV4X2Jhc2U8X0xwPgorICAgIHsKKyAgICBwdWJsaWM6ICAKKyAgICAgIF9TcF9jb3VudGVkX2Jhc2UoKQorICAgICAgOiBfTV91c2VfY291bnQoMSksIF9NX3dlYWtfY291bnQoMSkgeyB9CisgICAgICAKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5fU3BfY291bnRlZF9iYXNlKCkgLy8gbm90aHJvdyAKKyAgICAgIHsgfQorICAKKyAgICAgIC8vIENhbGxlZCB3aGVuIF9NX3VzZV9jb3VudCBkcm9wcyB0byB6ZXJvLCB0byByZWxlYXNlIHRoZSByZXNvdXJjZXMKKyAgICAgIC8vIG1hbmFnZWQgYnkgKnRoaXMuCisgICAgICB2aXJ0dWFsIHZvaWQKKyAgICAgIF9NX2Rpc3Bvc2UoKSA9IDA7IC8vIG5vdGhyb3cKKyAgICAgIAorICAgICAgLy8gQ2FsbGVkIHdoZW4gX01fd2Vha19jb3VudCBkcm9wcyB0byB6ZXJvLgorICAgICAgdmlydHVhbCB2b2lkCisgICAgICBfTV9kZXN0cm95KCkgLy8gbm90aHJvdworICAgICAgeyBkZWxldGUgdGhpczsgfQorICAgICAgCisgICAgICB2aXJ0dWFsIHZvaWQqCisgICAgICBfTV9nZXRfZGVsZXRlcihjb25zdCBzdGQ6OnR5cGVfaW5mbyYpID0gMDsKKworICAgICAgdm9pZAorICAgICAgX01fYWRkX3JlZl9jb3B5KCkKKyAgICAgIHsgX19nbnVfY3h4OjpfX2F0b21pY19hZGRfZGlzcGF0Y2goJl9NX3VzZV9jb3VudCwgMSk7IH0KKyAgCisgICAgICB2b2lkCisgICAgICBfTV9hZGRfcmVmX2xvY2soKTsKKyAgICAgIAorICAgICAgdm9pZAorICAgICAgX01fcmVsZWFzZSgpIC8vIG5vdGhyb3cKKyAgICAgIHsKKyAgICAgICAgLy8gQmUgcmFjZS1kZXRlY3Rvci1mcmllbmRseS4gIEZvciBtb3JlIGluZm8gc2VlIGJpdHMvYysrY29uZmlnLgorICAgICAgICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19CRUZPUkUoJl9NX3VzZV9jb3VudCk7CisJaWYgKF9fZ251X2N4eDo6X19leGNoYW5nZV9hbmRfYWRkX2Rpc3BhdGNoKCZfTV91c2VfY291bnQsIC0xKSA9PSAxKQorCSAgeworICAgICAgICAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQUZURVIoJl9NX3VzZV9jb3VudCk7CisJICAgIF9NX2Rpc3Bvc2UoKTsKKwkgICAgLy8gVGhlcmUgbXVzdCBiZSBhIG1lbW9yeSBiYXJyaWVyIGJldHdlZW4gZGlzcG9zZSgpIGFuZCBkZXN0cm95KCkKKwkgICAgLy8gdG8gZW5zdXJlIHRoYXQgdGhlIGVmZmVjdHMgb2YgZGlzcG9zZSgpIGFyZSBvYnNlcnZlZCBpbiB0aGUKKwkgICAgLy8gdGhyZWFkIHRoYXQgcnVucyBkZXN0cm95KCkuCisJICAgIC8vIFNlZSBodHRwOi8vZ2NjLmdudS5vcmcvbWwvbGlic3RkYysrLzIwMDUtMTEvbXNnMDAxMzYuaHRtbAorCSAgICBpZiAoX011dGV4X2Jhc2U8X0xwPjo6X1NfbmVlZF9iYXJyaWVycykKKwkgICAgICB7CisJICAgICAgICBfR0xJQkNYWF9SRUFEX01FTV9CQVJSSUVSOworCSAgICAgICAgX0dMSUJDWFhfV1JJVEVfTUVNX0JBUlJJRVI7CisJICAgICAgfQorCisgICAgICAgICAgICAvLyBCZSByYWNlLWRldGVjdG9yLWZyaWVuZGx5LiAgRm9yIG1vcmUgaW5mbyBzZWUgYml0cy9jKytjb25maWcuCisgICAgICAgICAgICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19CRUZPUkUoJl9NX3dlYWtfY291bnQpOworCSAgICBpZiAoX19nbnVfY3h4OjpfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2goJl9NX3dlYWtfY291bnQsCisJCQkJCQkgICAgICAgLTEpID09IDEpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19BRlRFUigmX01fd2Vha19jb3VudCk7CisJICAgICAgICBfTV9kZXN0cm95KCk7CisgICAgICAgICAgICAgIH0KKwkgIH0KKyAgICAgIH0KKyAgCisgICAgICB2b2lkCisgICAgICBfTV93ZWFrX2FkZF9yZWYoKSAvLyBub3Rocm93CisgICAgICB7IF9fZ251X2N4eDo6X19hdG9taWNfYWRkX2Rpc3BhdGNoKCZfTV93ZWFrX2NvdW50LCAxKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV93ZWFrX3JlbGVhc2UoKSAvLyBub3Rocm93CisgICAgICB7CisgICAgICAgIC8vIEJlIHJhY2UtZGV0ZWN0b3ItZnJpZW5kbHkuIEZvciBtb3JlIGluZm8gc2VlIGJpdHMvYysrY29uZmlnLgorICAgICAgICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19CRUZPUkUoJl9NX3dlYWtfY291bnQpOworCWlmIChfX2dudV9jeHg6Ol9fZXhjaGFuZ2VfYW5kX2FkZF9kaXNwYXRjaCgmX01fd2Vha19jb3VudCwgLTEpID09IDEpCisJICB7CisgICAgICAgICAgICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19BRlRFUigmX01fd2Vha19jb3VudCk7CisJICAgIGlmIChfTXV0ZXhfYmFzZTxfTHA+OjpfU19uZWVkX2JhcnJpZXJzKQorCSAgICAgIHsKKwkgICAgICAgIC8vIFNlZSBfTV9yZWxlYXNlKCksCisJICAgICAgICAvLyBkZXN0cm95KCkgbXVzdCBvYnNlcnZlIHJlc3VsdHMgb2YgZGlzcG9zZSgpCisJICAgICAgICBfR0xJQkNYWF9SRUFEX01FTV9CQVJSSUVSOworCSAgICAgICAgX0dMSUJDWFhfV1JJVEVfTUVNX0JBUlJJRVI7CisJICAgICAgfQorCSAgICBfTV9kZXN0cm95KCk7CisJICB9CisgICAgICB9CisgIAorICAgICAgbG9uZworICAgICAgX01fZ2V0X3VzZV9jb3VudCgpIGNvbnN0IC8vIG5vdGhyb3cKKyAgICAgIHsKKyAgICAgICAgLy8gTm8gbWVtb3J5IGJhcnJpZXIgaXMgdXNlZCBoZXJlIHNvIHRoZXJlIGlzIG5vIHN5bmNocm9uaXphdGlvbgorICAgICAgICAvLyB3aXRoIG90aGVyIHRocmVhZHMuCisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PGNvbnN0IHZvbGF0aWxlIF9BdG9taWNfd29yZCY+KF9NX3VzZV9jb3VudCk7CisgICAgICB9CisKKyAgICBwcml2YXRlOiAgCisgICAgICBfU3BfY291bnRlZF9iYXNlKF9TcF9jb3VudGVkX2Jhc2UgY29uc3QmKTsKKyAgICAgIF9TcF9jb3VudGVkX2Jhc2UmIG9wZXJhdG9yPShfU3BfY291bnRlZF9iYXNlIGNvbnN0Jik7CisKKyAgICAgIF9BdG9taWNfd29yZCAgX01fdXNlX2NvdW50OyAgICAgLy8gI3NoYXJlZAorICAgICAgX0F0b21pY193b3JkICBfTV93ZWFrX2NvdW50OyAgICAvLyAjd2VhayArICgjc2hhcmVkICE9IDApCisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIHZvaWQKKyAgICBfU3BfY291bnRlZF9iYXNlPF9TX3NpbmdsZT46OgorICAgIF9NX2FkZF9yZWZfbG9jaygpCisgICAgeworICAgICAgaWYgKF9fZ251X2N4eDo6X19leGNoYW5nZV9hbmRfYWRkX2Rpc3BhdGNoKCZfTV91c2VfY291bnQsIDEpID09IDApCisJeworCSAgX01fdXNlX2NvdW50ID0gMDsKKwkgIF9fdGhyb3dfYmFkX3dlYWtfcHRyKCk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIHZvaWQKKyAgICBfU3BfY291bnRlZF9iYXNlPF9TX211dGV4Pjo6CisgICAgX01fYWRkX3JlZl9sb2NrKCkKKyAgICB7CisgICAgICBfX2dudV9jeHg6Ol9fc2NvcGVkX2xvY2sgc2VudHJ5KCp0aGlzKTsKKyAgICAgIGlmIChfX2dudV9jeHg6Ol9fZXhjaGFuZ2VfYW5kX2FkZF9kaXNwYXRjaCgmX01fdXNlX2NvdW50LCAxKSA9PSAwKQorCXsKKwkgIF9NX3VzZV9jb3VudCA9IDA7CisJICBfX3Rocm93X2JhZF93ZWFrX3B0cigpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8PiAKKyAgICBpbmxpbmUgdm9pZAorICAgIF9TcF9jb3VudGVkX2Jhc2U8X1NfYXRvbWljPjo6CisgICAgX01fYWRkX3JlZl9sb2NrKCkKKyAgICB7CisgICAgICAvLyBQZXJmb3JtIGxvY2stZnJlZSBhZGQtaWYtbm90LXplcm8gb3BlcmF0aW9uLgorICAgICAgX0F0b21pY193b3JkIF9fY291bnQgPSBfTV91c2VfY291bnQ7CisgICAgICBkbworCXsKKwkgIGlmIChfX2NvdW50ID09IDApCisJICAgIF9fdGhyb3dfYmFkX3dlYWtfcHRyKCk7CisJICAvLyBSZXBsYWNlIHRoZSBjdXJyZW50IGNvdW50ZXIgdmFsdWUgd2l0aCB0aGUgb2xkIHZhbHVlICsgMSwgYXMKKwkgIC8vIGxvbmcgYXMgaXQncyBub3QgY2hhbmdlZCBtZWFud2hpbGUuIAorCX0KKyAgICAgIHdoaWxlICghX19hdG9taWNfY29tcGFyZV9leGNoYW5nZV9uKCZfTV91c2VfY291bnQsICZfX2NvdW50LCBfX2NvdW50ICsgMSwKKwkJCQkJICB0cnVlLCBfX0FUT01JQ19BQ1FfUkVMLCAKKwkJCQkJICBfX0FUT01JQ19SRUxBWEVEKSk7CisgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHRyLCB0eXBlbmFtZSBfRGVsZXRlciwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBjbGFzcyBfU3BfY291bnRlZF9iYXNlX2ltcGwKKyAgICA6IHB1YmxpYyBfU3BfY291bnRlZF9iYXNlPF9McD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gUHJlY29uZGl0aW9uOiBfX2QoX19wKSBtdXN0IG5vdCB0aHJvdy4KKyAgICAgIF9TcF9jb3VudGVkX2Jhc2VfaW1wbChfUHRyIF9fcCwgX0RlbGV0ZXIgX19kKQorICAgICAgOiBfTV9wdHIoX19wKSwgX01fZGVsKF9fZCkgeyB9CisgICAgCisgICAgICB2aXJ0dWFsIHZvaWQKKyAgICAgIF9NX2Rpc3Bvc2UoKSAvLyBub3Rocm93CisgICAgICB7IF9NX2RlbChfTV9wdHIpOyB9CisgICAgICAKKyAgICAgIHZpcnR1YWwgdm9pZCoKKyAgICAgIF9NX2dldF9kZWxldGVyKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiBfX3RpKQorICAgICAgeworI2lmZGVmIF9fR1hYX1JUVEkKKyAgICAgICAgcmV0dXJuIF9fdGkgPT0gdHlwZWlkKF9EZWxldGVyKSA/ICZfTV9kZWwgOiAwOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIDA7CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIAorICAgIHByaXZhdGU6CisgICAgICBfU3BfY291bnRlZF9iYXNlX2ltcGwoY29uc3QgX1NwX2NvdW50ZWRfYmFzZV9pbXBsJik7CisgICAgICBfU3BfY291bnRlZF9iYXNlX2ltcGwmIG9wZXJhdG9yPShjb25zdCBfU3BfY291bnRlZF9iYXNlX2ltcGwmKTsKKyAgICAgIAorICAgICAgX1B0ciAgICAgIF9NX3B0cjsgIC8vIGNvcHkgY29uc3RydWN0b3IgbXVzdCBub3QgdGhyb3cKKyAgICAgIF9EZWxldGVyICBfTV9kZWw7ICAvLyBjb3B5IGNvbnN0cnVjdG9yIG11c3Qgbm90IHRocm93CisgICAgfTsKKworICB0ZW1wbGF0ZTxfTG9ja19wb2xpY3kgX0xwID0gX19kZWZhdWx0X2xvY2tfcG9saWN5PgorICAgIGNsYXNzIF9fd2Vha19jb3VudDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9TcF9kZWxldGVyCisgICAgeworICAgICAgdHlwZWRlZiB2b2lkIHJlc3VsdF90eXBlOworICAgICAgdHlwZWRlZiBfVHAqIGFyZ3VtZW50X3R5cGU7CisgICAgICB2b2lkIG9wZXJhdG9yKCkoX1RwKiBfX3ApIGNvbnN0IHsgZGVsZXRlIF9fcDsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8X0xvY2tfcG9saWN5IF9McCA9IF9fZGVmYXVsdF9sb2NrX3BvbGljeT4KKyAgICBjbGFzcyBfX3NoYXJlZF9jb3VudAorICAgIHsKKyAgICBwdWJsaWM6IAorICAgICAgX19zaGFyZWRfY291bnQoKQorICAgICAgOiBfTV9waSgwKSAvLyBub3Rocm93CisgICAgICB7IH0KKyAgCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHRyPgorICAgICAgICBfX3NoYXJlZF9jb3VudChfUHRyIF9fcCkgOiBfTV9waSgwKQorICAgICAgICB7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnRyMTo6cmVtb3ZlX3BvaW50ZXI8X1B0cj46OnR5cGUgX1RwOworCSAgICAgIF9NX3BpID0gbmV3IF9TcF9jb3VudGVkX2Jhc2VfaW1wbDxfUHRyLCBfU3BfZGVsZXRlcjxfVHA+LCBfTHA+KAorCSAgICAgICAgICBfX3AsIF9TcF9kZWxldGVyPF9UcD4oKSk7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgZGVsZXRlIF9fcDsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1B0ciwgdHlwZW5hbWUgX0RlbGV0ZXI+CisgICAgICAgIF9fc2hhcmVkX2NvdW50KF9QdHIgX19wLCBfRGVsZXRlciBfX2QpIDogX01fcGkoMCkKKyAgICAgICAgeworCSAgX190cnkKKwkgICAgeworCSAgICAgIF9NX3BpID0gbmV3IF9TcF9jb3VudGVkX2Jhc2VfaW1wbDxfUHRyLCBfRGVsZXRlciwgX0xwPihfX3AsIF9fZCk7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgX19kKF9fcCk7IC8vIENhbGwgX0RlbGV0ZXIgb24gX19wLgorCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJfQorCisgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGF1dG9fcHRyPF9UcD4gdG8gcHJvdmlkZSB0aGUgc3Ryb25nIGd1YXJhbnRlZS4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgX19zaGFyZWRfY291bnQoc3RkOjphdXRvX3B0cjxfVHA+JiBfX3IpCisJOiBfTV9waShuZXcgX1NwX2NvdW50ZWRfYmFzZV9pbXBsPF9UcCosCisJCV9TcF9kZWxldGVyPF9UcD4sIF9McCA+KF9fci5nZXQoKSwgX1NwX2RlbGV0ZXI8X1RwPigpKSkKKyAgICAgICAgeyBfX3IucmVsZWFzZSgpOyB9CisKKyAgICAgIC8vIFRocm93IGJhZF93ZWFrX3B0ciB3aGVuIF9fci5fTV9nZXRfdXNlX2NvdW50KCkgPT0gMC4KKyAgICAgIGV4cGxpY2l0CisgICAgICBfX3NoYXJlZF9jb3VudChjb25zdCBfX3dlYWtfY291bnQ8X0xwPiYgX19yKTsKKyAgCisgICAgICB+X19zaGFyZWRfY291bnQoKSAvLyBub3Rocm93CisgICAgICB7CisJaWYgKF9NX3BpICE9IDApCisJICBfTV9waS0+X01fcmVsZWFzZSgpOworICAgICAgfQorICAgICAgCisgICAgICBfX3NoYXJlZF9jb3VudChjb25zdCBfX3NoYXJlZF9jb3VudCYgX19yKQorICAgICAgOiBfTV9waShfX3IuX01fcGkpIC8vIG5vdGhyb3cKKyAgICAgIHsKKwlpZiAoX01fcGkgIT0gMCkKKwkgIF9NX3BpLT5fTV9hZGRfcmVmX2NvcHkoKTsKKyAgICAgIH0KKyAgCisgICAgICBfX3NoYXJlZF9jb3VudCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfX3NoYXJlZF9jb3VudCYgX19yKSAvLyBub3Rocm93CisgICAgICB7CisJX1NwX2NvdW50ZWRfYmFzZTxfTHA+KiBfX3RtcCA9IF9fci5fTV9waTsKKwlpZiAoX190bXAgIT0gX01fcGkpCisJICB7CisJICAgIGlmIChfX3RtcCAhPSAwKQorCSAgICAgIF9fdG1wLT5fTV9hZGRfcmVmX2NvcHkoKTsKKwkgICAgaWYgKF9NX3BpICE9IDApCisJICAgICAgX01fcGktPl9NX3JlbGVhc2UoKTsKKwkgICAgX01fcGkgPSBfX3RtcDsKKwkgIH0KKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisgIAorICAgICAgdm9pZAorICAgICAgX01fc3dhcChfX3NoYXJlZF9jb3VudCYgX19yKSAvLyBub3Rocm93CisgICAgICB7CisJX1NwX2NvdW50ZWRfYmFzZTxfTHA+KiBfX3RtcCA9IF9fci5fTV9waTsKKwlfX3IuX01fcGkgPSBfTV9waTsKKwlfTV9waSA9IF9fdG1wOworICAgICAgfQorICAKKyAgICAgIGxvbmcKKyAgICAgIF9NX2dldF91c2VfY291bnQoKSBjb25zdCAvLyBub3Rocm93CisgICAgICB7IHJldHVybiBfTV9waSAhPSAwID8gX01fcGktPl9NX2dldF91c2VfY291bnQoKSA6IDA7IH0KKworICAgICAgYm9vbAorICAgICAgX01fdW5pcXVlKCkgY29uc3QgLy8gbm90aHJvdworICAgICAgeyByZXR1cm4gdGhpcy0+X01fZ2V0X3VzZV9jb3VudCgpID09IDE7IH0KKyAgICAgIAorICAgICAgZnJpZW5kIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IF9fc2hhcmVkX2NvdW50JiBfX2EsIGNvbnN0IF9fc2hhcmVkX2NvdW50JiBfX2IpCisgICAgICB7IHJldHVybiBfX2EuX01fcGkgPT0gX19iLl9NX3BpOyB9CisgIAorICAgICAgZnJpZW5kIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcjwoY29uc3QgX19zaGFyZWRfY291bnQmIF9fYSwgY29uc3QgX19zaGFyZWRfY291bnQmIF9fYikKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bGVzczxfU3BfY291bnRlZF9iYXNlPF9McD4qPigpKF9fYS5fTV9waSwgX19iLl9NX3BpKTsgfQorICAKKyAgICAgIHZvaWQqCisgICAgICBfTV9nZXRfZGVsZXRlcihjb25zdCBzdGQ6OnR5cGVfaW5mbyYgX190aSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BpID8gX01fcGktPl9NX2dldF9kZWxldGVyKF9fdGkpIDogMDsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGZyaWVuZCBjbGFzcyBfX3dlYWtfY291bnQ8X0xwPjsKKworICAgICAgX1NwX2NvdW50ZWRfYmFzZTxfTHA+KiAgX01fcGk7CisgICAgfTsKKworCisgIHRlbXBsYXRlPF9Mb2NrX3BvbGljeSBfTHA+CisgICAgY2xhc3MgX193ZWFrX2NvdW50CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIF9fd2Vha19jb3VudCgpCisgICAgICA6IF9NX3BpKDApIC8vIG5vdGhyb3cKKyAgICAgIHsgfQorICAKKyAgICAgIF9fd2Vha19jb3VudChjb25zdCBfX3NoYXJlZF9jb3VudDxfTHA+JiBfX3IpCisgICAgICA6IF9NX3BpKF9fci5fTV9waSkgLy8gbm90aHJvdworICAgICAgeworCWlmIChfTV9waSAhPSAwKQorCSAgX01fcGktPl9NX3dlYWtfYWRkX3JlZigpOworICAgICAgfQorICAgICAgCisgICAgICBfX3dlYWtfY291bnQoY29uc3QgX193ZWFrX2NvdW50PF9McD4mIF9fcikKKyAgICAgIDogX01fcGkoX19yLl9NX3BpKSAvLyBub3Rocm93CisgICAgICB7CisJaWYgKF9NX3BpICE9IDApCisJICBfTV9waS0+X01fd2Vha19hZGRfcmVmKCk7CisgICAgICB9CisgICAgICAKKyAgICAgIH5fX3dlYWtfY291bnQoKSAvLyBub3Rocm93CisgICAgICB7CisJaWYgKF9NX3BpICE9IDApCisJICBfTV9waS0+X01fd2Vha19yZWxlYXNlKCk7CisgICAgICB9CisgICAgICAKKyAgICAgIF9fd2Vha19jb3VudDxfTHA+JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9fc2hhcmVkX2NvdW50PF9McD4mIF9fcikgLy8gbm90aHJvdworICAgICAgeworCV9TcF9jb3VudGVkX2Jhc2U8X0xwPiogX190bXAgPSBfX3IuX01fcGk7CisJaWYgKF9fdG1wICE9IDApCisJICBfX3RtcC0+X01fd2Vha19hZGRfcmVmKCk7CisJaWYgKF9NX3BpICE9IDApCisJICBfTV9waS0+X01fd2Vha19yZWxlYXNlKCk7CisJX01fcGkgPSBfX3RtcDsgIAorCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIAorICAgICAgX193ZWFrX2NvdW50PF9McD4mCisgICAgICBvcGVyYXRvcj0oY29uc3QgX193ZWFrX2NvdW50PF9McD4mIF9fcikgLy8gbm90aHJvdworICAgICAgeworCV9TcF9jb3VudGVkX2Jhc2U8X0xwPiogX190bXAgPSBfX3IuX01fcGk7CisJaWYgKF9fdG1wICE9IDApCisJICBfX3RtcC0+X01fd2Vha19hZGRfcmVmKCk7CisJaWYgKF9NX3BpICE9IDApCisJICBfTV9waS0+X01fd2Vha19yZWxlYXNlKCk7CisJX01fcGkgPSBfX3RtcDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N3YXAoX193ZWFrX2NvdW50PF9McD4mIF9fcikgLy8gbm90aHJvdworICAgICAgeworCV9TcF9jb3VudGVkX2Jhc2U8X0xwPiogX190bXAgPSBfX3IuX01fcGk7CisJX19yLl9NX3BpID0gX01fcGk7CisJX01fcGkgPSBfX3RtcDsKKyAgICAgIH0KKyAgCisgICAgICBsb25nCisgICAgICBfTV9nZXRfdXNlX2NvdW50KCkgY29uc3QgLy8gbm90aHJvdworICAgICAgeyByZXR1cm4gX01fcGkgIT0gMCA/IF9NX3BpLT5fTV9nZXRfdXNlX2NvdW50KCkgOiAwOyB9CisKKyAgICAgIGZyaWVuZCBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBfX3dlYWtfY291bnQ8X0xwPiYgX19hLCBjb25zdCBfX3dlYWtfY291bnQ8X0xwPiYgX19iKQorICAgICAgeyByZXR1cm4gX19hLl9NX3BpID09IF9fYi5fTV9waTsgfQorICAgICAgCisgICAgICBmcmllbmQgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPChjb25zdCBfX3dlYWtfY291bnQ8X0xwPiYgX19hLCBjb25zdCBfX3dlYWtfY291bnQ8X0xwPiYgX19iKQorICAgICAgeyByZXR1cm4gc3RkOjpsZXNzPF9TcF9jb3VudGVkX2Jhc2U8X0xwPio+KCkoX19hLl9NX3BpLCBfX2IuX01fcGkpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgZnJpZW5kIGNsYXNzIF9fc2hhcmVkX2NvdW50PF9McD47CisKKyAgICAgIF9TcF9jb3VudGVkX2Jhc2U8X0xwPiogIF9NX3BpOworICAgIH07CisKKyAgLy8gbm93IHRoYXQgX193ZWFrX2NvdW50IGlzIGRlZmluZWQgd2UgY2FuIGRlZmluZSB0aGlzIGNvbnN0cnVjdG9yOgorICB0ZW1wbGF0ZTxfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZQorICAgIF9fc2hhcmVkX2NvdW50PF9McD46OgorICAgIF9fc2hhcmVkX2NvdW50KGNvbnN0IF9fd2Vha19jb3VudDxfTHA+JiBfX3IpCisgICAgOiBfTV9waShfX3IuX01fcGkpCisgICAgeworICAgICAgaWYgKF9NX3BpICE9IDApCisJX01fcGktPl9NX2FkZF9yZWZfbG9jaygpOworICAgICAgZWxzZQorCV9fdGhyb3dfYmFkX3dlYWtfcHRyKCk7CisgICAgfQorCisgIC8vIEZvcndhcmQgZGVjbGFyYXRpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHAgPSBfX2RlZmF1bHRfbG9ja19wb2xpY3k+CisgICAgY2xhc3MgX19zaGFyZWRfcHRyOworICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwID0gX19kZWZhdWx0X2xvY2tfcG9saWN5PgorICAgIGNsYXNzIF9fd2Vha19wdHI7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwID0gX19kZWZhdWx0X2xvY2tfcG9saWN5PgorICAgIGNsYXNzIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIHNoYXJlZF9wdHI7CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3Mgd2Vha19wdHI7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzOworCisgIC8vIFN1cHBvcnQgZm9yIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzLgorCisgIC8vIEZyaWVuZCBvZiBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzLgorICB0ZW1wbGF0ZTxfTG9ja19wb2xpY3kgX0xwLCB0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPgorICAgIHZvaWQKKyAgICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzX2hlbHBlcihjb25zdCBfX3NoYXJlZF9jb3VudDxfTHA+JiwKKwkJCQkgICAgIGNvbnN0IF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8X1RwMSwKKwkJCQkgICAgIF9McD4qLCBjb25zdCBfVHAyKik7CisKKyAgLy8gRnJpZW5kIG9mIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPgorICAgIHZvaWQKKyAgICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzX2hlbHBlcihjb25zdCBfX3NoYXJlZF9jb3VudDw+JiwKKwkJCQkgICAgIGNvbnN0IGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPF9UcDE+KiwKKwkJCQkgICAgIGNvbnN0IF9UcDIqKTsKKworICB0ZW1wbGF0ZTxfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSB2b2lkCisgICAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoY29uc3QgX19zaGFyZWRfY291bnQ8X0xwPiYsIC4uLikKKyAgICB7IH0KKworCisgIHN0cnVjdCBfX3N0YXRpY19jYXN0X3RhZyB7IH07CisgIHN0cnVjdCBfX2NvbnN0X2Nhc3RfdGFnIHsgfTsKKyAgc3RydWN0IF9fZHluYW1pY19jYXN0X3RhZyB7IH07CisKKyAgLy8gQSBzbWFydCBwb2ludGVyIHdpdGggcmVmZXJlbmNlLWNvdW50ZWQgY29weSBzZW1hbnRpY3MuICBUaGUKKyAgLy8gb2JqZWN0IHBvaW50ZWQgdG8gaXMgZGVsZXRlZCB3aGVuIHRoZSBsYXN0IHNoYXJlZF9wdHIgcG9pbnRpbmcgdG8KKyAgLy8gaXQgaXMgZGVzdHJveWVkIG9yIHJlc2V0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgY2xhc3MgX19zaGFyZWRfcHRyCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwICAgZWxlbWVudF90eXBlOworICAgICAgCisgICAgICBfX3NoYXJlZF9wdHIoKQorICAgICAgOiBfTV9wdHIoMCksIF9NX3JlZmNvdW50KCkgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgX19zaGFyZWRfcHRyKF9UcDEqIF9fcCkKKwk6IF9NX3B0cihfX3ApLCBfTV9yZWZjb3VudChfX3ApCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9UcDEqLCBfVHAqPikKKwkgIHR5cGVkZWYgaW50IF9Jc0NvbXBsZXRlW3NpemVvZihfVHAxKV07CisJICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzX2hlbHBlcihfTV9yZWZjb3VudCwgX19wLCBfX3ApOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX0RlbGV0ZXI+CisgICAgICAgIF9fc2hhcmVkX3B0cihfVHAxKiBfX3AsIF9EZWxldGVyIF9fZCkKKyAgICAgICAgOiBfTV9wdHIoX19wKSwgX01fcmVmY291bnQoX19wLCBfX2QpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9UcDEqLCBfVHAqPikKKwkgIC8vIFRPRE8gcmVxdWlyZXMgX0RlbGV0ZXIgQ29weUNvbnN0cnVjdGlibGUgYW5kIF9fZChfX3ApIHdlbGwtZm9ybWVkCisJICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzX2hlbHBlcihfTV9yZWZjb3VudCwgX19wLCBfX3ApOworCX0KKyAgICAgIAorICAgICAgLy8gIGdlbmVyYXRlZCBjb3B5IGNvbnN0cnVjdG9yLCBhc3NpZ25tZW50LCBkZXN0cnVjdG9yIGFyZSBmaW5lLgorICAgICAgCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBfX3NoYXJlZF9wdHIoY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fcikKKwk6IF9NX3B0cihfX3IuX01fcHRyKSwgX01fcmVmY291bnQoX19yLl9NX3JlZmNvdW50KSAvLyBuZXZlciB0aHJvd3MKKyAgICAgICAgeyBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVHAxKiwgX1RwKj4pIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgX19zaGFyZWRfcHRyKGNvbnN0IF9fd2Vha19wdHI8X1RwMSwgX0xwPiYgX19yKQorCTogX01fcmVmY291bnQoX19yLl9NX3JlZmNvdW50KSAvLyBtYXkgdGhyb3cKKyAgICAgICAgeworCSAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Db252ZXJ0aWJsZUNvbmNlcHQ8X1RwMSosIF9UcCo+KQorCSAgLy8gSXQgaXMgbm93IHNhZmUgdG8gY29weSBfX3IuX01fcHRyLCBhcyBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpCisJICAvLyBkaWQgbm90IHRocm93LgorCSAgX01fcHRyID0gX19yLl9NX3B0cjsKKwl9CisKKyNpZiAoX19jcGx1c3BsdXMgPCAyMDExMDNMKSB8fCBfR0xJQkNYWF9VU0VfREVQUkVDQVRFRAorICAgICAgLy8gUG9zdGNvbmRpdGlvbjogdXNlX2NvdW50KCkgPT0gMSBhbmQgX19yLmdldCgpID09IDAKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIF9fc2hhcmVkX3B0cihzdGQ6OmF1dG9fcHRyPF9UcDE+JiBfX3IpCisJOiBfTV9wdHIoX19yLmdldCgpKSwgX01fcmVmY291bnQoKQorICAgICAgICB7IC8vIFRPRE8gcmVxdXJpZXMgZGVsZXRlIF9fci5yZWxlYXNlKCkgd2VsbC1mb3JtZWQKKwkgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9UcDEqLCBfVHAqPikKKwkgIHR5cGVkZWYgaW50IF9Jc0NvbXBsZXRlW3NpemVvZihfVHAxKV07CisJICBfVHAxKiBfX3RtcCA9IF9fci5nZXQoKTsKKwkgIF9NX3JlZmNvdW50ID0gX19zaGFyZWRfY291bnQ8X0xwPihfX3IpOworCSAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoX01fcmVmY291bnQsIF9fdG1wLCBfX3RtcCk7CisJfQorCisjZW5kaWYKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgX19zaGFyZWRfcHRyKGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX3IsIF9fc3RhdGljX2Nhc3RfdGFnKQorCTogX01fcHRyKHN0YXRpY19jYXN0PGVsZW1lbnRfdHlwZSo+KF9fci5fTV9wdHIpKSwKKwkgIF9NX3JlZmNvdW50KF9fci5fTV9yZWZjb3VudCkKKyAgICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIF9fc2hhcmVkX3B0cihjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yLCBfX2NvbnN0X2Nhc3RfdGFnKQorCTogX01fcHRyKGNvbnN0X2Nhc3Q8ZWxlbWVudF90eXBlKj4oX19yLl9NX3B0cikpLAorCSAgX01fcmVmY291bnQoX19yLl9NX3JlZmNvdW50KQorICAgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgX19zaGFyZWRfcHRyKGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX3IsIF9fZHluYW1pY19jYXN0X3RhZykKKwk6IF9NX3B0cihkeW5hbWljX2Nhc3Q8ZWxlbWVudF90eXBlKj4oX19yLl9NX3B0cikpLAorCSAgX01fcmVmY291bnQoX19yLl9NX3JlZmNvdW50KQorICAgICAgICB7CisJICBpZiAoX01fcHRyID09IDApIC8vIG5lZWQgdG8gYWxsb2NhdGUgbmV3IGNvdW50ZXIgLS0gdGhlIGNhc3QgZmFpbGVkCisJICAgIF9NX3JlZmNvdW50ID0gX19zaGFyZWRfY291bnQ8X0xwPigpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgX19zaGFyZWRfcHRyJgorICAgICAgICBvcGVyYXRvcj0oY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fcikgLy8gbmV2ZXIgdGhyb3dzCisgICAgICAgIHsKKwkgIF9NX3B0ciA9IF9fci5fTV9wdHI7CisJICBfTV9yZWZjb3VudCA9IF9fci5fTV9yZWZjb3VudDsgLy8gX19zaGFyZWRfY291bnQ6Om9wPSBkb2Vzbid0IHRocm93CisJICByZXR1cm4gKnRoaXM7CisJfQorCisjaWYgKF9fY3BsdXNwbHVzIDwgMjAxMTAzTCkgfHwgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIF9fc2hhcmVkX3B0ciYKKyAgICAgICAgb3BlcmF0b3I9KHN0ZDo6YXV0b19wdHI8X1RwMT4mIF9fcikKKyAgICAgICAgeworCSAgX19zaGFyZWRfcHRyKF9fcikuc3dhcCgqdGhpcyk7CisJICByZXR1cm4gKnRoaXM7CisJfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7IF9fc2hhcmVkX3B0cigpLnN3YXAoKnRoaXMpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHZvaWQKKyAgICAgICAgcmVzZXQoX1RwMSogX19wKSAvLyBfVHAxIG11c3QgYmUgY29tcGxldGUuCisgICAgICAgIHsKKwkgIC8vIENhdGNoIHNlbGYtcmVzZXQgZXJyb3JzLgorCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9fcCA9PSAwIHx8IF9fcCAhPSBfTV9wdHIpOyAKKwkgIF9fc2hhcmVkX3B0cihfX3ApLnN3YXAoKnRoaXMpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX0RlbGV0ZXI+CisgICAgICAgIHZvaWQKKyAgICAgICAgcmVzZXQoX1RwMSogX19wLCBfRGVsZXRlciBfX2QpCisgICAgICAgIHsgX19zaGFyZWRfcHRyKF9fcCwgX19kKS5zd2FwKCp0aGlzKTsgfQorCisgICAgICAvLyBBbGxvdyBjbGFzcyBpbnN0YW50aWF0aW9uIHdoZW4gX1RwIGlzIFtjdi1xdWFsXSB2b2lkLgorICAgICAgdHlwZW5hbWUgc3RkOjp0cjE6OmFkZF9yZWZlcmVuY2U8X1RwPjo6dHlwZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX3B0ciAhPSAwKTsKKwlyZXR1cm4gKl9NX3B0cjsKKyAgICAgIH0KKworICAgICAgX1RwKgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0IC8vIG5ldmVyIHRocm93cworICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9wdHIgIT0gMCk7CisJcmV0dXJuIF9NX3B0cjsKKyAgICAgIH0KKyAgICAKKyAgICAgIF9UcCoKKyAgICAgIGdldCgpIGNvbnN0IC8vIG5ldmVyIHRocm93cworICAgICAgeyByZXR1cm4gX01fcHRyOyB9CisKKyAgICAgIC8vIEltcGxpY2l0IGNvbnZlcnNpb24gdG8gImJvb2wiCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX1RwKiBfX3NoYXJlZF9wdHI6OipfX3Vuc3BlY2lmaWVkX2Jvb2xfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIG9wZXJhdG9yIF9fdW5zcGVjaWZpZWRfYm9vbF90eXBlKCkgY29uc3QgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7IHJldHVybiBfTV9wdHIgPT0gMCA/IDAgOiAmX19zaGFyZWRfcHRyOjpfTV9wdHI7IH0KKworICAgICAgYm9vbAorICAgICAgdW5pcXVlKCkgY29uc3QgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7IHJldHVybiBfTV9yZWZjb3VudC5fTV91bmlxdWUoKTsgfQorCisgICAgICBsb25nCisgICAgICB1c2VfY291bnQoKSBjb25zdCAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsgcmV0dXJuIF9NX3JlZmNvdW50Ll9NX2dldF91c2VfY291bnQoKTsgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKF9fc2hhcmVkX3B0cjxfVHAsIF9McD4mIF9fb3RoZXIpIC8vIG5ldmVyIHRocm93cworICAgICAgeworCXN0ZDo6c3dhcChfTV9wdHIsIF9fb3RoZXIuX01fcHRyKTsKKwlfTV9yZWZjb3VudC5fTV9zd2FwKF9fb3RoZXIuX01fcmVmY291bnQpOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQqCisgICAgICBfTV9nZXRfZGVsZXRlcihjb25zdCBzdGQ6OnR5cGVfaW5mbyYgX190aSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3JlZmNvdW50Ll9NX2dldF9kZWxldGVyKF9fdGkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIF9Mb2NrX3BvbGljeSBfTHAxPgorICAgICAgICBib29sCisgICAgICAgIF9NX2xlc3MoY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McDE+JiBfX3JocykgY29uc3QKKyAgICAgICAgeyByZXR1cm4gX01fcmVmY291bnQgPCBfX3Jocy5fTV9yZWZjb3VudDsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCBfTG9ja19wb2xpY3kgX0xwMT4gZnJpZW5kIGNsYXNzIF9fc2hhcmVkX3B0cjsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIF9Mb2NrX3BvbGljeSBfTHAxPiBmcmllbmQgY2xhc3MgX193ZWFrX3B0cjsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0RlbCwgdHlwZW5hbWUgX1RwMSwgX0xvY2tfcG9saWN5IF9McDE+CisgICAgICAgIGZyaWVuZCBfRGVsKiBnZXRfZGVsZXRlcihjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwMT4mKTsKKworICAgICAgLy8gRnJpZW5kcyBpbmplY3RlZCBpbnRvIGVuY2xvc2luZyBuYW1lc3BhY2UgYW5kIGZvdW5kIGJ5IEFETDoKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIGZyaWVuZCBpbmxpbmUgYm9vbAorICAgICAgICBvcGVyYXRvcj09KGNvbnN0IF9fc2hhcmVkX3B0ciYgX19hLCBjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19iKQorICAgICAgICB7IHJldHVybiBfX2EuZ2V0KCkgPT0gX19iLmdldCgpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIGZyaWVuZCBpbmxpbmUgYm9vbAorICAgICAgICBvcGVyYXRvciE9KGNvbnN0IF9fc2hhcmVkX3B0ciYgX19hLCBjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19iKQorICAgICAgICB7IHJldHVybiBfX2EuZ2V0KCkgIT0gX19iLmdldCgpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIGZyaWVuZCBpbmxpbmUgYm9vbAorICAgICAgICBvcGVyYXRvcjwoY29uc3QgX19zaGFyZWRfcHRyJiBfX2EsIGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX2IpCisgICAgICAgIHsgcmV0dXJuIF9fYS5fTV9sZXNzKF9fYik7IH0KKworICAgICAgX1RwKiAgICAgICAgIAkgICBfTV9wdHI7ICAgICAgICAgLy8gQ29udGFpbmVkIHBvaW50ZXIuCisgICAgICBfX3NoYXJlZF9jb3VudDxfTHA+ICBfTV9yZWZjb3VudDsgICAgLy8gUmVmZXJlbmNlIGNvdW50ZXIuCisgICAgfTsKKworICAvLyAyLjIuMy44IHNoYXJlZF9wdHIgc3BlY2lhbGl6ZWQgYWxnb3JpdGhtcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX2EsIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4mIF9fYikKKyAgICB7IF9fYS5zd2FwKF9fYik7IH0KKworICAvLyAyLjIuMy45IHNoYXJlZF9wdHIgY2FzdHMKKyAgLyogIFRoZSBzZWVtaW5nbHkgZXF1aXZhbGVudAorICAgKiAgICAgICAgICAgc2hhcmVkX3B0cjxfVHAsIF9McD4oc3RhdGljX2Nhc3Q8X1RwKj4oX19yLmdldCgpKSkKKyAgICogIHdpbGwgZXZlbnR1YWxseSByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW91ciwKKyAgICogIGF0dGVtcHRpbmcgdG8gZGVsZXRlIHRoZSBzYW1lIG9iamVjdCB0d2ljZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwMSwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgX19zaGFyZWRfcHRyPF9UcCwgX0xwPgorICAgIHN0YXRpY19wb2ludGVyX2Nhc3QoY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fcikKKyAgICB7IHJldHVybiBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+KF9fciwgX19zdGF0aWNfY2FzdF90YWcoKSk7IH0KKworICAvKiAgVGhlIHNlZW1pbmdseSBlcXVpdmFsZW50CisgICAqICAgICAgICAgICBzaGFyZWRfcHRyPF9UcCwgX0xwPihjb25zdF9jYXN0PF9UcCo+KF9fci5nZXQoKSkpCisgICAqICB3aWxsIGV2ZW50dWFsbHkgcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvdXIsCisgICAqICBhdHRlbXB0aW5nIHRvIGRlbGV0ZSB0aGUgc2FtZSBvYmplY3QgdHdpY2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UcDEsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4KKyAgICBjb25zdF9wb2ludGVyX2Nhc3QoY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fcikKKyAgICB7IHJldHVybiBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+KF9fciwgX19jb25zdF9jYXN0X3RhZygpKTsgfQorCisgIC8qICBUaGUgc2VlbWluZ2x5IGVxdWl2YWxlbnQKKyAgICogICAgICAgICAgIHNoYXJlZF9wdHI8X1RwLCBfTHA+KGR5bmFtaWNfY2FzdDxfVHAqPihfX3IuZ2V0KCkpKQorICAgKiAgd2lsbCBldmVudHVhbGx5IHJlc3VsdCBpbiB1bmRlZmluZWQgYmVoYXZpb3VyLAorICAgKiAgYXR0ZW1wdGluZyB0byBkZWxldGUgdGhlIHNhbWUgb2JqZWN0IHR3aWNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVHAxLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+CisgICAgZHluYW1pY19wb2ludGVyX2Nhc3QoY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fcikKKyAgICB7IHJldHVybiBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+KF9fciwgX19keW5hbWljX2Nhc3RfdGFnKCkpOyB9CisKKyAgLy8gMi4yLjMuNyBzaGFyZWRfcHRyIEkvTworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2gsIHR5cGVuYW1lIF9UciwgdHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2gsIF9Ucj4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoLCBfVHI+JiBfX29zLCAKKwkgICAgICAgY29uc3QgX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19wKQorICAgIHsKKyAgICAgIF9fb3MgPDwgX19wLmdldCgpOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIC8vIDIuMi4zLjEwIHNoYXJlZF9wdHIgZ2V0X2RlbGV0ZXIgKGV4cGVyaW1lbnRhbCkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0RlbCwgdHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBfRGVsKgorICAgIGdldF9kZWxldGVyKGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAsIF9McD4mIF9fcCkKKyAgICB7CisjaWZkZWYgX19HWFhfUlRUSQorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9EZWwqPihfX3AuX01fZ2V0X2RlbGV0ZXIodHlwZWlkKF9EZWwpKSk7CisjZWxzZQorICAgICAgcmV0dXJuIDA7CisjZW5kaWYKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgY2xhc3MgX193ZWFrX3B0cgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCBlbGVtZW50X3R5cGU7CisgICAgICAKKyAgICAgIF9fd2Vha19wdHIoKQorICAgICAgOiBfTV9wdHIoMCksIF9NX3JlZmNvdW50KCkgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7IH0KKworICAgICAgLy8gR2VuZXJhdGVkIGNvcHkgY29uc3RydWN0b3IsIGFzc2lnbm1lbnQsIGRlc3RydWN0b3IgYXJlIGZpbmUuCisgICAgICAKKyAgICAgIC8vIFRoZSAib2J2aW91cyIgY29udmVydGluZyBjb25zdHJ1Y3RvciBpbXBsZW1lbnRhdGlvbjoKKyAgICAgIC8vCisgICAgICAvLyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgIC8vICAgIF9fd2Vha19wdHIoY29uc3QgX193ZWFrX3B0cjxfVHAxLCBfTHA+JiBfX3IpCisgICAgICAvLyAgICA6IF9NX3B0cihfX3IuX01fcHRyKSwgX01fcmVmY291bnQoX19yLl9NX3JlZmNvdW50KSAvLyBuZXZlciB0aHJvd3MKKyAgICAgIC8vICAgIHsgfQorICAgICAgLy8KKyAgICAgIC8vIGhhcyBhIHNlcmlvdXMgcHJvYmxlbS4KKyAgICAgIC8vCisgICAgICAvLyAgX19yLl9NX3B0ciBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gaW52YWxpZGF0ZWQuIFRoZSBfTV9wdHIoX19yLl9NX3B0cikKKyAgICAgIC8vICBjb252ZXJzaW9uIG1heSByZXF1aXJlIGFjY2VzcyB0byAqX19yLl9NX3B0ciAodmlydHVhbCBpbmhlcml0YW5jZSkuCisgICAgICAvLworICAgICAgLy8gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGF2b2lkIHNwdXJpb3VzIGFjY2VzcyB2aW9sYXRpb25zIHNpbmNlCisgICAgICAvLyBpbiBtdWx0aXRocmVhZGVkIHByb2dyYW1zIF9fci5fTV9wdHIgbWF5IGJlIGludmFsaWRhdGVkIGF0IGFueSBwb2ludC4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIF9fd2Vha19wdHIoY29uc3QgX193ZWFrX3B0cjxfVHAxLCBfTHA+JiBfX3IpCisJOiBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpIC8vIG5ldmVyIHRocm93cworICAgICAgICB7CisJICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVHAxKiwgX1RwKj4pCisJICBfTV9wdHIgPSBfX3IubG9jaygpLmdldCgpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgX193ZWFrX3B0cihjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yKQorCTogX01fcHRyKF9fci5fTV9wdHIpLCBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpIC8vIG5ldmVyIHRocm93cworICAgICAgICB7IF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9UcDEqLCBfVHAqPikgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBfX3dlYWtfcHRyJgorICAgICAgICBvcGVyYXRvcj0oY29uc3QgX193ZWFrX3B0cjxfVHAxLCBfTHA+JiBfX3IpIC8vIG5ldmVyIHRocm93cworICAgICAgICB7CisJICBfTV9wdHIgPSBfX3IubG9jaygpLmdldCgpOworCSAgX01fcmVmY291bnQgPSBfX3IuX01fcmVmY291bnQ7CisJICByZXR1cm4gKnRoaXM7CisJfQorICAgICAgCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBfX3dlYWtfcHRyJgorICAgICAgICBvcGVyYXRvcj0oY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fcikgLy8gbmV2ZXIgdGhyb3dzCisgICAgICAgIHsKKwkgIF9NX3B0ciA9IF9fci5fTV9wdHI7CisJICBfTV9yZWZjb3VudCA9IF9fci5fTV9yZWZjb3VudDsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4KKyAgICAgIGxvY2soKSBjb25zdCAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsKKyNpZmRlZiBfX0dUSFJFQURTCisJLy8gT3B0aW1pemF0aW9uOiBhdm9pZCB0aHJvdyBvdmVyaGVhZC4KKwlpZiAoZXhwaXJlZCgpKQorCSAgcmV0dXJuIF9fc2hhcmVkX3B0cjxlbGVtZW50X3R5cGUsIF9McD4oKTsKKworCV9fdHJ5CisJICB7CisJICAgIHJldHVybiBfX3NoYXJlZF9wdHI8ZWxlbWVudF90eXBlLCBfTHA+KCp0aGlzKTsKKwkgIH0KKwlfX2NhdGNoKGNvbnN0IGJhZF93ZWFrX3B0ciYpCisJICB7CisJICAgIC8vIFE6IEhvdyBjYW4gd2UgZ2V0IGhlcmU/CisJICAgIC8vIEE6IEFub3RoZXIgdGhyZWFkIG1heSBoYXZlIGludmFsaWRhdGVkIHIgYWZ0ZXIgdGhlCisJICAgIC8vICAgIHVzZV9jb3VudCB0ZXN0IGFib3ZlLgorCSAgICByZXR1cm4gX19zaGFyZWRfcHRyPGVsZW1lbnRfdHlwZSwgX0xwPigpOworCSAgfQorCQorI2Vsc2UKKwkvLyBPcHRpbWl6YXRpb246IGF2b2lkIHRyeS9jYXRjaCBvdmVyaGVhZCB3aGVuIHNpbmdsZSB0aHJlYWRlZC4KKwlyZXR1cm4gZXhwaXJlZCgpID8gX19zaGFyZWRfcHRyPGVsZW1lbnRfdHlwZSwgX0xwPigpCisJICAgICAgICAgICAgICAgICA6IF9fc2hhcmVkX3B0cjxlbGVtZW50X3R5cGUsIF9McD4oKnRoaXMpOworCisjZW5kaWYKKyAgICAgIH0gLy8gWFhYIE1UCisKKyAgICAgIGxvbmcKKyAgICAgIHVzZV9jb3VudCgpIGNvbnN0IC8vIG5ldmVyIHRocm93cworICAgICAgeyByZXR1cm4gX01fcmVmY291bnQuX01fZ2V0X3VzZV9jb3VudCgpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGV4cGlyZWQoKSBjb25zdCAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsgcmV0dXJuIF9NX3JlZmNvdW50Ll9NX2dldF91c2VfY291bnQoKSA9PSAwOyB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7IF9fd2Vha19wdHIoKS5zd2FwKCp0aGlzKTsgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKF9fd2Vha19wdHImIF9fcykgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7CisJc3RkOjpzd2FwKF9NX3B0ciwgX19zLl9NX3B0cik7CisJX01fcmVmY291bnQuX01fc3dhcChfX3MuX01fcmVmY291bnQpOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIFVzZWQgYnkgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcy4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2Fzc2lnbihfVHAqIF9fcHRyLCBjb25zdCBfX3NoYXJlZF9jb3VudDxfTHA+JiBfX3JlZmNvdW50KQorICAgICAgeworCV9NX3B0ciA9IF9fcHRyOworCV9NX3JlZmNvdW50ID0gX19yZWZjb3VudDsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgYm9vbAorICAgICAgICBfTV9sZXNzKGNvbnN0IF9fd2Vha19wdHI8X1RwMSwgX0xwPiYgX19yaHMpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIF9NX3JlZmNvdW50IDwgX19yaHMuX01fcmVmY291bnQ7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgX0xvY2tfcG9saWN5IF9McDE+IGZyaWVuZCBjbGFzcyBfX3NoYXJlZF9wdHI7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCBfTG9ja19wb2xpY3kgX0xwMT4gZnJpZW5kIGNsYXNzIF9fd2Vha19wdHI7CisgICAgICBmcmllbmQgY2xhc3MgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpczxfVHAsIF9McD47CisgICAgICBmcmllbmQgY2xhc3MgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8X1RwPjsKKworICAgICAgLy8gRnJpZW5kIGluamVjdGVkIGludG8gbmFtZXNwYWNlIGFuZCBmb3VuZCBieSBBREwuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBmcmllbmQgaW5saW5lIGJvb2wKKyAgICAgICAgb3BlcmF0b3I8KGNvbnN0IF9fd2Vha19wdHImIF9fbGhzLCBjb25zdCBfX3dlYWtfcHRyPF9UcDEsIF9McD4mIF9fcmhzKQorICAgICAgICB7IHJldHVybiBfX2xocy5fTV9sZXNzKF9fcmhzKTsgfQorCisgICAgICBfVHAqICAgICAgIAkgX01fcHRyOyAgICAgICAgIC8vIENvbnRhaW5lZCBwb2ludGVyLgorICAgICAgX193ZWFrX2NvdW50PF9McD4gIF9NX3JlZmNvdW50OyAgICAvLyBSZWZlcmVuY2UgY291bnRlci4KKyAgICB9OworCisgIC8vIDIuMi40Ljcgd2Vha19wdHIgc3BlY2lhbGl6ZWQgYWxnb3JpdGhtcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfX3dlYWtfcHRyPF9UcCwgX0xwPiYgX19hLCBfX3dlYWtfcHRyPF9UcCwgX0xwPiYgX19iKQorICAgIHsgX19hLnN3YXAoX19iKTsgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGNsYXNzIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcygpIHsgfQorICAgICAgCisgICAgICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzKGNvbnN0IF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMmKSB7IH0KKyAgICAgIAorICAgICAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzJikKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIH5fX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzKCkgeyB9CisgICAgICAKKyAgICBwdWJsaWM6CisgICAgICBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+CisgICAgICBzaGFyZWRfZnJvbV90aGlzKCkKKyAgICAgIHsgcmV0dXJuIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4odGhpcy0+X01fd2Vha190aGlzKTsgfQorCisgICAgICBfX3NoYXJlZF9wdHI8Y29uc3QgX1RwLCBfTHA+CisgICAgICBzaGFyZWRfZnJvbV90aGlzKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fc2hhcmVkX3B0cjxjb25zdCBfVHAsIF9McD4odGhpcy0+X01fd2Vha190aGlzKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fd2Vha19hc3NpZ24oX1RwMSogX19wLCBjb25zdCBfX3NoYXJlZF9jb3VudDxfTHA+JiBfX24pIGNvbnN0CisgICAgICAgIHsgX01fd2Vha190aGlzLl9NX2Fzc2lnbihfX3AsIF9fbik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgZnJpZW5kIHZvaWQKKyAgICAgICAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoY29uc3QgX19zaGFyZWRfY291bnQ8X0xwPiYgX19wbiwKKwkJCQkJIGNvbnN0IF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMqIF9fcGUsCisJCQkJCSBjb25zdCBfVHAxKiBfX3B4KQorICAgICAgICB7CisJICBpZiAoX19wZSAhPSAwKQorCSAgICBfX3BlLT5fTV93ZWFrX2Fzc2lnbihjb25zdF9jYXN0PF9UcDEqPihfX3B4KSwgX19wbik7CisJfQorCisgICAgICBtdXRhYmxlIF9fd2Vha19wdHI8X1RwLCBfTHA+ICBfTV93ZWFrX3RoaXM7CisgICAgfTsKKworCisgIC8vIFRoZSBhY3R1YWwgc2hhcmVkX3B0ciwgd2l0aCBmb3J3YXJkaW5nIGNvbnN0cnVjdG9ycyBhbmQKKyAgLy8gYXNzaWdubWVudCBvcGVyYXRvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBzaGFyZWRfcHRyCisgICAgOiBwdWJsaWMgX19zaGFyZWRfcHRyPF9UcD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgc2hhcmVkX3B0cigpCisgICAgICA6IF9fc2hhcmVkX3B0cjxfVHA+KCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIHNoYXJlZF9wdHIoX1RwMSogX19wKQorCTogX19zaGFyZWRfcHRyPF9UcD4oX19wKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX0RlbGV0ZXI+CisgICAgICAgIHNoYXJlZF9wdHIoX1RwMSogX19wLCBfRGVsZXRlciBfX2QpCisJOiBfX3NoYXJlZF9wdHI8X1RwPihfX3AsIF9fZCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHNoYXJlZF9wdHIoY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19yKQorCTogX19zaGFyZWRfcHRyPF9UcD4oX19yKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgc2hhcmVkX3B0cihjb25zdCB3ZWFrX3B0cjxfVHAxPiYgX19yKQorCTogX19zaGFyZWRfcHRyPF9UcD4oX19yKSB7IH0KKworI2lmIChfX2NwbHVzcGx1cyA8IDIwMTEwM0wpIHx8IF9HTElCQ1hYX1VTRV9ERVBSRUNBVEVECisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBleHBsaWNpdAorICAgICAgICBzaGFyZWRfcHRyKHN0ZDo6YXV0b19wdHI8X1RwMT4mIF9fcikKKwk6IF9fc2hhcmVkX3B0cjxfVHA+KF9fcikgeyB9CisjZW5kaWYKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgc2hhcmVkX3B0cihjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IsIF9fc3RhdGljX2Nhc3RfdGFnKQorCTogX19zaGFyZWRfcHRyPF9UcD4oX19yLCBfX3N0YXRpY19jYXN0X3RhZygpKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgc2hhcmVkX3B0cihjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IsIF9fY29uc3RfY2FzdF90YWcpCisJOiBfX3NoYXJlZF9wdHI8X1RwPihfX3IsIF9fY29uc3RfY2FzdF90YWcoKSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHNoYXJlZF9wdHIoY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19yLCBfX2R5bmFtaWNfY2FzdF90YWcpCisJOiBfX3NoYXJlZF9wdHI8X1RwPihfX3IsIF9fZHluYW1pY19jYXN0X3RhZygpKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgc2hhcmVkX3B0ciYKKyAgICAgICAgb3BlcmF0b3I9KGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fcikgLy8gbmV2ZXIgdGhyb3dzCisgICAgICAgIHsKKwkgIHRoaXMtPl9fc2hhcmVkX3B0cjxfVHA+OjpvcGVyYXRvcj0oX19yKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyNpZiAoX19jcGx1c3BsdXMgPCAyMDExMDNMKSB8fCBfR0xJQkNYWF9VU0VfREVQUkVDQVRFRAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgc2hhcmVkX3B0ciYKKyAgICAgICAgb3BlcmF0b3I9KHN0ZDo6YXV0b19wdHI8X1RwMT4mIF9fcikKKyAgICAgICAgeworCSAgdGhpcy0+X19zaGFyZWRfcHRyPF9UcD46Om9wZXJhdG9yPShfX3IpOworCSAgcmV0dXJuICp0aGlzOworCX0KKyNlbmRpZgorICAgIH07CisKKyAgLy8gMi4yLjMuOCBzaGFyZWRfcHRyIHNwZWNpYWxpemVkIGFsZ29yaXRobXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoX19zaGFyZWRfcHRyPF9UcD4mIF9fYSwgX19zaGFyZWRfcHRyPF9UcD4mIF9fYikKKyAgICB7IF9fYS5zd2FwKF9fYik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UcDE+CisgICAgaW5saW5lIHNoYXJlZF9wdHI8X1RwPgorICAgIHN0YXRpY19wb2ludGVyX2Nhc3QoY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19yKQorICAgIHsgcmV0dXJuIHNoYXJlZF9wdHI8X1RwPihfX3IsIF9fc3RhdGljX2Nhc3RfdGFnKCkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVHAxPgorICAgIGlubGluZSBzaGFyZWRfcHRyPF9UcD4KKyAgICBjb25zdF9wb2ludGVyX2Nhc3QoY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19yKQorICAgIHsgcmV0dXJuIHNoYXJlZF9wdHI8X1RwPihfX3IsIF9fY29uc3RfY2FzdF90YWcoKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UcDE+CisgICAgaW5saW5lIHNoYXJlZF9wdHI8X1RwPgorICAgIGR5bmFtaWNfcG9pbnRlcl9jYXN0KGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fcikKKyAgICB7IHJldHVybiBzaGFyZWRfcHRyPF9UcD4oX19yLCBfX2R5bmFtaWNfY2FzdF90YWcoKSk7IH0KKworCisgIC8vIFRoZSBhY3R1YWwgd2Vha19wdHIsIHdpdGggZm9yd2FyZGluZyBjb25zdHJ1Y3RvcnMgYW5kCisgIC8vIGFzc2lnbm1lbnQgb3BlcmF0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3Mgd2Vha19wdHIKKyAgICA6IHB1YmxpYyBfX3dlYWtfcHRyPF9UcD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgd2Vha19wdHIoKQorICAgICAgOiBfX3dlYWtfcHRyPF9UcD4oKSB7IH0KKyAgICAgIAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgd2Vha19wdHIoY29uc3Qgd2Vha19wdHI8X1RwMT4mIF9fcikKKwk6IF9fd2Vha19wdHI8X1RwPihfX3IpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICB3ZWFrX3B0cihjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IpCisJOiBfX3dlYWtfcHRyPF9UcD4oX19yKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgd2Vha19wdHImCisgICAgICAgIG9wZXJhdG9yPShjb25zdCB3ZWFrX3B0cjxfVHAxPiYgX19yKSAvLyBuZXZlciB0aHJvd3MKKyAgICAgICAgeworCSAgdGhpcy0+X193ZWFrX3B0cjxfVHA+OjpvcGVyYXRvcj0oX19yKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHdlYWtfcHRyJgorICAgICAgICBvcGVyYXRvcj0oY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19yKSAvLyBuZXZlciB0aHJvd3MKKyAgICAgICAgeworCSAgdGhpcy0+X193ZWFrX3B0cjxfVHA+OjpvcGVyYXRvcj0oX19yKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHNoYXJlZF9wdHI8X1RwPgorICAgICAgbG9jaygpIGNvbnN0IC8vIG5ldmVyIHRocm93cworICAgICAgeworI2lmZGVmIF9fR1RIUkVBRFMKKwlpZiAodGhpcy0+ZXhwaXJlZCgpKQorCSAgcmV0dXJuIHNoYXJlZF9wdHI8X1RwPigpOworCisJX190cnkKKwkgIHsKKwkgICAgcmV0dXJuIHNoYXJlZF9wdHI8X1RwPigqdGhpcyk7CisJICB9CisJX19jYXRjaChjb25zdCBiYWRfd2Vha19wdHImKQorCSAgeworCSAgICByZXR1cm4gc2hhcmVkX3B0cjxfVHA+KCk7CisJICB9CisjZWxzZQorCXJldHVybiB0aGlzLT5leHBpcmVkKCkgPyBzaGFyZWRfcHRyPF9UcD4oKQorCSAgICAgICAgICAgICAgICAgICAgICAgOiBzaGFyZWRfcHRyPF9UcD4oKnRoaXMpOworI2VuZGlmCisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMoKSB7IH0KKyAgICAgIAorICAgICAgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMoY29uc3QgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMmKSB7IH0KKworICAgICAgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMmCisgICAgICBvcGVyYXRvcj0oY29uc3QgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMmKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgfmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzKCkgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICBzaGFyZWRfcHRyPF9UcD4KKyAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKQorICAgICAgeyByZXR1cm4gc2hhcmVkX3B0cjxfVHA+KHRoaXMtPl9NX3dlYWtfdGhpcyk7IH0KKworICAgICAgc2hhcmVkX3B0cjxjb25zdCBfVHA+CisgICAgICBzaGFyZWRfZnJvbV90aGlzKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHNoYXJlZF9wdHI8Y29uc3QgX1RwPih0aGlzLT5fTV93ZWFrX3RoaXMpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV93ZWFrX2Fzc2lnbihfVHAxKiBfX3AsIGNvbnN0IF9fc2hhcmVkX2NvdW50PD4mIF9fbikgY29uc3QKKyAgICAgICAgeyBfTV93ZWFrX3RoaXMuX01fYXNzaWduKF9fcCwgX19uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBmcmllbmQgdm9pZAorICAgICAgICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzX2hlbHBlcihjb25zdCBfX3NoYXJlZF9jb3VudDw+JiBfX3BuLAorCQkJCQkgY29uc3QgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMqIF9fcGUsCisJCQkJCSBjb25zdCBfVHAxKiBfX3B4KQorICAgICAgICB7CisJICBpZiAoX19wZSAhPSAwKQorCSAgICBfX3BlLT5fTV93ZWFrX2Fzc2lnbihjb25zdF9jYXN0PF9UcDEqPihfX3B4KSwgX19wbik7CisJfQorCisgICAgICBtdXRhYmxlIHdlYWtfcHRyPF9UcD4gIF9NX3dlYWtfdGhpczsKKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30KK30KKworI2VuZGlmIC8vIF9UUjFfU0hBUkVEX1BUUl9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9zcGVjaWFsX2Z1bmN0aW9uX3V0aWwuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3NwZWNpYWxfZnVuY3Rpb25fdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZWMwNTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9zcGVjaWFsX2Z1bmN0aW9uX3V0aWwuaApAQCAtMCwwICsxLDEzNSBAQAorLy8gU3BlY2lhbCBmdW5jdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9zcGVjaWFsX2Z1bmN0aW9uX3V0aWwuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3RyMS9jbWF0aH0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MiBUUjE6IDUuMiAgU3BlY2lhbCBmdW5jdGlvbnMKKy8vCisKKy8vIFdyaXR0ZW4gYnkgRWR3YXJkIFNtaXRoLVJvd2xhbmQgYmFzZWQgb24gbnVtZXJvdXMgbWF0aGVtYXRpY3MgYm9va3MuCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX1NQRUNJQUxfRlVOQ1RJT05fVVRJTF9ICisjZGVmaW5lIF9HTElCQ1hYX1RSMV9TUEVDSUFMX0ZVTkNUSU9OX1VUSUxfSCAxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworICBuYW1lc3BhY2UgX19kZXRhaWwKKyAgeworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgICAgLy8vIEEgY2xhc3MgdG8gZW5jYXBzdWxhdGUgdHlwZSBkZXBlbmRlbnQgZmxvYXRpbmcgcG9pbnQKKyAgICAvLy8gY29uc3RhbnRzLiAgTm90IGV2ZXJ5dGhpbmcgd2lsbCBiZSBhYmxlIHRvIGJlIGV4cHJlc3NlZCBhcworICAgIC8vLyB0eXBlIGxvZ2ljLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19mbG9hdGluZ19wb2ludF9jb25zdGFudAorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCBfVHAgX192YWx1ZTsKKyAgICB9OworCisKKyAgICAvLy8gQSBzdHJ1Y3R1cmUgZm9yIG51bWVyaWMgY29uc3RhbnRzLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIHN0cnVjdCBfX251bWVyaWNfY29uc3RhbnRzCisgICAgICB7CisgICAgICAgIC8vLyAgQ29uc3RhbnQgQGYkIFxwaSBAZiQuCisgICAgICAgIHN0YXRpYyBfVHAgX19waSgpIHRocm93KCkKKyAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwPigzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUwMjlMKTsgfQorICAgICAgICAvLy8gIENvbnN0YW50IEBmJCBccGkgLyAyIEBmJC4KKyAgICAgICAgc3RhdGljIF9UcCBfX3BpXzIoKSB0aHJvdygpCisgICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oMS41NzA3OTYzMjY3OTQ4OTY2MTkyMzEzMjE2OTE2Mzk3NTE0TCk7IH0KKyAgICAgICAgLy8vICBDb25zdGFudCBAZiQgXHBpIC8gMyBAZiQuCisgICAgICAgIHN0YXRpYyBfVHAgX19waV8zKCkgdGhyb3coKQorICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfVHA+KDEuMDQ3MTk3NTUxMTk2NTk3NzQ2MTU0MjE0NDYxMDkzMTY3NkwpOyB9CisgICAgICAgIC8vLyAgQ29uc3RhbnQgQGYkIFxwaSAvIDQgQGYkLgorICAgICAgICBzdGF0aWMgX1RwIF9fcGlfNCgpIHRocm93KCkKKyAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwPigwLjc4NTM5ODE2MzM5NzQ0ODMwOTYxNTY2MDg0NTgxOTg3NTdMKTsgfQorICAgICAgICAvLy8gIENvbnN0YW50IEBmJCAxIC8gXHBpIEBmJC4KKyAgICAgICAgc3RhdGljIF9UcCBfXzFfcGkoKSB0aHJvdygpCisgICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oMC4zMTgzMDk4ODYxODM3OTA2NzE1Mzc3Njc1MjY3NDUwMjg3TCk7IH0KKyAgICAgICAgLy8vICBDb25zdGFudCBAZiQgMiAvIFxzcXJ0KFxwaSkgQGYkLgorICAgICAgICBzdGF0aWMgX1RwIF9fMl9zcXJ0cGkoKSB0aHJvdygpCisgICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oMS4xMjgzNzkxNjcwOTU1MTI1NzM4OTYxNTg5MDMxMjE1NDUyTCk7IH0KKyAgICAgICAgLy8vICBDb25zdGFudCBAZiQgXHNxcnQoMikgQGYkLgorICAgICAgICBzdGF0aWMgX1RwIF9fc3FydDIoKSB0aHJvdygpCisgICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oMS40MTQyMTM1NjIzNzMwOTUwNDg4MDE2ODg3MjQyMDk2OTgxTCk7IH0KKyAgICAgICAgLy8vICBDb25zdGFudCBAZiQgXHNxcnQoMykgQGYkLgorICAgICAgICBzdGF0aWMgX1RwIF9fc3FydDMoKSB0aHJvdygpCisgICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oMS43MzIwNTA4MDc1Njg4NzcyOTM1Mjc0NDYzNDE1MDU4NzIzTCk7IH0KKyAgICAgICAgLy8vICBDb25zdGFudCBAZiQgXHNxcnQoXHBpLzIpIEBmJC4KKyAgICAgICAgc3RhdGljIF9UcCBfX3NxcnRwaW8yKCkgdGhyb3coKQorICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfVHA+KDEuMjUzMzE0MTM3MzE1NTAwMjUxMjA3ODgyNjQyNDA1NTIyNkwpOyB9CisgICAgICAgIC8vLyAgQ29uc3RhbnQgQGYkIDEgLyBzcXJ0KDIpIEBmJC4KKyAgICAgICAgc3RhdGljIF9UcCBfX3NxcnQxXzIoKSB0aHJvdygpCisgICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oMC43MDcxMDY3ODExODY1NDc1MjQ0MDA4NDQzNjIxMDQ4NDkwTCk7IH0KKyAgICAgICAgLy8vICBDb25zdGFudCBAZiQgXGxvZyhccGkpIEBmJC4KKyAgICAgICAgc3RhdGljIF9UcCBfX2xucGkoKSB0aHJvdygpCisgICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oMS4xNDQ3Mjk4ODU4NDk0MDAxNzQxNDM0MjczNTEzNTMwNTg3TCk7IH0KKyAgICAgICAgLy8vICBDb25zdGFudCBFdWxlcidzIGNvbnN0YW50IEBmJCBcZ2FtbWFfRSBAZiQuCisgICAgICAgIHN0YXRpYyBfVHAgX19nYW1tYV9lKCkgdGhyb3coKQorICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfVHA+KDAuNTc3MjE1NjY0OTAxNTMyODYwNjA2NTEyMDkwMDgyNDAyNEwpOyB9CisgICAgICAgIC8vLyAgQ29uc3RhbnQgRXVsZXItTWFzY2hlcm9uaSBAZiQgZSBAZiQKKyAgICAgICAgc3RhdGljIF9UcCBfX2V1bGVyKCkgdGhyb3coKQorICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfVHA+KDIuNzE4MjgxODI4NDU5MDQ1MjM1MzYwMjg3NDcxMzUyNjYyNUwpOyB9CisgICAgICB9OworCisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEggJiYgIV9HTElCQ1hYX1VTRV9DOTlfRlBfTUFDUk9TX0RZTkFNSUMKKworICAgIC8vLyBUaGlzIGlzIGEgd3JhcHBlciBmb3IgdGhlIGlzbmFuIGZ1bmN0aW9uLiBPdGhlcndpc2UsIGZvciBOYU4sCisgICAgLy8vIGFsbCBjb21wYXJpc29ucyByZXN1bHQgaW4gZmFsc2UuIElmL3doZW4gd2UgYnVpbGQgYSBzdGQ6OmlzbmFuCisgICAgLy8vIG91dCBvZiBpbnRyaW5zaWNzLCB0aGlzIHdpbGwgZGlzYXBwZWFyIGNvbXBsZXRlbHkgaW4gZmF2b3Igb2YKKyAgICAvLy8gc3RkOjppc25hbi4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wgX19pc25hbihfVHAgX194KQorICAgIHsgcmV0dXJuIHN0ZDo6aXNuYW4oX194KTsgfQorCisjZWxzZQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sIF9faXNuYW4oY29uc3QgX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5faXNuYW4oX194KTsgfQorCisgICAgdGVtcGxhdGU8PgorICAgIGlubGluZSBib29sIF9faXNuYW48ZmxvYXQ+KGZsb2F0IF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5faXNuYW5mKF9feCk7IH0KKworICAgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgYm9vbCBfX2lzbmFuPGxvbmcgZG91YmxlPihsb25nIGRvdWJsZSBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2lzbmFubChfX3gpOyB9CisKKyNlbmRpZgorCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSBfX2RldGFpbAorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX1NQRUNJQUxfRlVOQ1RJT05fVVRJTF9ICisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3N0ZGFyZy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvc3RkYXJnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDczOTZjZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3N0ZGFyZy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIFRSMSBzdGRhcmcuaCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3N0ZGFyZy5oCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX1RSMV9TVERBUkdfSAorI2RlZmluZSBfVFIxX1NUREFSR19IIDEKKworI2luY2x1ZGUgPHRyMS9jc3RkYXJnPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3N0ZGJvb2wuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3N0ZGJvb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjEyZjUxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvc3RkYm9vbC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIFRSMSBzdGRib29sLmggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9zdGRib29sLmgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfVFIxX1NUREJPT0xfSAorI2RlZmluZSBfVFIxX1NUREJPT0xfSCAxCisKKyNpbmNsdWRlIDx0cjEvY3N0ZGJvb2w+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvc3RkaW50LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS9zdGRpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDllMWRkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvc3RkaW50LmgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIHN0ZGludC5oIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvc3RkaW50LmgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfVFIxX1NURElOVF9ICisjZGVmaW5lIF9UUjFfU1RESU5UX0ggMQorCisjaW5jbHVkZSA8dHIxL2NzdGRpbnQ+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvc3RkaW8uaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3N0ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E1ZTA3OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3N0ZGlvLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIHN0ZGlvLmggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9zdGRpby5oCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX1RSMV9TVERJT19ICisjZGVmaW5lIF9UUjFfU1RESU9fSCAxCisKKyNpbmNsdWRlIDx0cjEvY3N0ZGlvPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3N0ZGxpYi5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvc3RkbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3MGMyNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3N0ZGxpYi5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIFRSMSBzdGRsaWIuaCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3N0ZGxpYi5oCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX1NURExJQl9ICisjZGVmaW5lIF9HTElCQ1hYX1RSMV9TVERMSUJfSCAxCisKKyNpbmNsdWRlIDx0cjEvY3N0ZGxpYj4KKworI2lmIF9HTElCQ1hYX0hPU1RFRAorCisjaWYgX0dMSUJDWFhfVVNFX0M5OQorCit1c2luZyBzdGQ6OnRyMTo6YXRvbGw7Cit1c2luZyBzdGQ6OnRyMTo6c3RydG9sbDsKK3VzaW5nIHN0ZDo6dHIxOjpzdHJ0b3VsbDsKKwordXNpbmcgc3RkOjp0cjE6OmFiczsKKyNpZiAhX0dMSUJDWFhfVVNFX0M5OV9MT05HX0xPTkdfRFlOQU1JQwordXNpbmcgc3RkOjp0cjE6OmRpdjsKKyNlbmRpZgorCisjZW5kaWYKKworI2VuZGlmCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfU1RETElCX0gKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvdGdtYXRoLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS90Z21hdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGM5YmQwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvdGdtYXRoLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIHRnbWF0aC5oIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvdGdtYXRoLmgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfVEdNQVRIX0gKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX1RHTUFUSF9IIDEKKworI2luY2x1ZGUgPHRyMS9jdGdtYXRoPgorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX1RHTUFUSF9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS90dXBsZSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3R1cGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmN2NjMzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS90dXBsZQpAQCAtMCwwICsxLDQyNiBAQAorLy8gY2xhc3MgdGVtcGxhdGUgdHVwbGUgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS90dXBsZQorKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuCisqLworCisvLyBDaHJpcyBKZWZmZXJzb24gPGNocmlzQGJ1YmJsZXNjb3BlLm5ldD4KKy8vIFZhcmlhZGljIFRlbXBsYXRlcyBzdXBwb3J0IGJ5IERvdWdsYXMgR3JlZ29yIDxkb3VnLmdyZWdvckBnbWFpbC5jb20+CisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX1RVUExFCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9UVVBMRSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBBZGRzIGEgY29uc3QgcmVmZXJlbmNlIHRvIGEgbm9uLXJlZmVyZW5jZSB0eXBlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fYWRkX2NfcmVmCisgICAgeyB0eXBlZGVmIGNvbnN0IF9UcCYgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fYWRkX2NfcmVmPF9UcCY+CisgICAgeyB0eXBlZGVmIF9UcCYgdHlwZTsgfTsKKworICAvLyBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgbm9uLXJlZmVyZW5jZSB0eXBlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fYWRkX3JlZgorICAgIHsgdHlwZWRlZiBfVHAmIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2FkZF9yZWY8X1RwJj4KKyAgICB7IHR5cGVkZWYgX1RwJiB0eXBlOyB9OworCisgIC8qKgorICAgKiBDb250YWlucyB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBAYyB0dXBsZSB0ZW1wbGF0ZSwgc3RvcmVkCisgICAqIGFzIGEgcmVjdXJzaXZlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBmcm9tIHRoZSBmaXJzdCBlbGVtZW50IChtb3N0CisgICAqIGRlcml2ZWQgY2xhc3MpIHRvIHRoZSBsYXN0IChsZWFzdCBkZXJpdmVkIGNsYXNzKS4gVGhlIEBjIElkeAorICAgKiBwYXJhbWV0ZXIgZ2l2ZXMgdGhlIDAtYmFzZWQgaW5kZXggb2YgdGhlIGVsZW1lbnQgc3RvcmVkIGF0IHRoaXMKKyAgICogcG9pbnQgaW4gdGhlIGhpZXJhcmNoeTsgd2UgdXNlIGl0IHRvIGltcGxlbWVudCBhIGNvbnN0YW50LXRpbWUKKyAgICogZ2V0KCkgb3BlcmF0aW9uLgorICAgKi8KKyAgdGVtcGxhdGU8aW50IF9JZHgsIHR5cGVuYW1lLi4uIF9FbGVtZW50cz4KKyAgICBzdHJ1Y3QgX1R1cGxlX2ltcGw7IAorCisgIC8qKgorICAgKiBaZXJvLWVsZW1lbnQgdHVwbGUgaW1wbGVtZW50YXRpb24uIFRoaXMgaXMgdGhlIGJhc2lzIGNhc2UgZm9yIHRoZSAKKyAgICogaW5oZXJpdGFuY2UgcmVjdXJzaW9uLgorICAgKi8KKyAgdGVtcGxhdGU8aW50IF9JZHg+CisgICAgc3RydWN0IF9UdXBsZV9pbXBsPF9JZHg+IHsgfTsKKworICAvKioKKyAgICogUmVjdXJzaXZlIHR1cGxlIGltcGxlbWVudGF0aW9uLiBIZXJlIHdlIHN0b3JlIHRoZSBAYyBIZWFkIGVsZW1lbnQKKyAgICogYW5kIGRlcml2ZSBmcm9tIGEgQGMgVHVwbGVfaW1wbCBjb250YWluaW5nIHRoZSByZW1haW5pbmcgZWxlbWVudHMKKyAgICogKHdoaWNoIGNvbnRhaW5zIHRoZSBAYyBUYWlsKS4KKyAgICovCisgIHRlbXBsYXRlPGludCBfSWR4LCB0eXBlbmFtZSBfSGVhZCwgdHlwZW5hbWUuLi4gX1RhaWw+CisgICAgc3RydWN0IF9UdXBsZV9pbXBsPF9JZHgsIF9IZWFkLCBfVGFpbC4uLj4KKyAgICA6IHB1YmxpYyBfVHVwbGVfaW1wbDxfSWR4ICsgMSwgX1RhaWwuLi4+CisgICAgeworICAgICAgdHlwZWRlZiBfVHVwbGVfaW1wbDxfSWR4ICsgMSwgX1RhaWwuLi4+IF9Jbmhlcml0ZWQ7CisgICAgICAKKyAgICAgIF9IZWFkIF9NX2hlYWQ7CisgICAgICAKKyAgICAgIF9Jbmhlcml0ZWQmICAgICAgIF9NX3RhaWwoKSAgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgICAgY29uc3QgX0luaGVyaXRlZCYgX01fdGFpbCgpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9CisgICAgICAKKyAgICAgIF9UdXBsZV9pbXBsKCkgOiBfSW5oZXJpdGVkKCksIF9NX2hlYWQoKSB7IH0KKyAgICAgIAorICAgICAgZXhwbGljaXQgCisgICAgICBfVHVwbGVfaW1wbCh0eXBlbmFtZSBfX2FkZF9jX3JlZjxfSGVhZD46OnR5cGUgX19oZWFkLAorCQkgIHR5cGVuYW1lIF9fYWRkX2NfcmVmPF9UYWlsPjo6dHlwZS4uLiBfX3RhaWwpCisgICAgICA6IF9Jbmhlcml0ZWQoX190YWlsLi4uKSwgX01faGVhZChfX2hlYWQpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgICAgX1R1cGxlX2ltcGwoY29uc3QgX1R1cGxlX2ltcGw8X0lkeCwgX1VFbGVtZW50cy4uLj4mIF9faW4pCisgICAgICA6IF9Jbmhlcml0ZWQoX19pbi5fTV90YWlsKCkpLCBfTV9oZWFkKF9faW4uX01faGVhZCkgeyB9CisKKyAgICAgIF9UdXBsZV9pbXBsKGNvbnN0IF9UdXBsZV9pbXBsJiBfX2luKQorICAgICAgOiBfSW5oZXJpdGVkKF9faW4uX01fdGFpbCgpKSwgX01faGVhZChfX2luLl9NX2hlYWQpIHsgfQorICAgICAKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9VRWxlbWVudHM+CisgICAgICAgIF9UdXBsZV9pbXBsJgorICAgICAgICBvcGVyYXRvcj0oY29uc3QgX1R1cGxlX2ltcGw8X0lkeCwgX1VFbGVtZW50cy4uLj4mIF9faW4pCisgICAgICAgIHsKKwkgIF9NX2hlYWQgPSBfX2luLl9NX2hlYWQ7CisJICBfTV90YWlsKCkgPSBfX2luLl9NX3RhaWwoKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIF9UdXBsZV9pbXBsJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9UdXBsZV9pbXBsJiBfX2luKQorICAgICAgeworCV9NX2hlYWQgPSBfX2luLl9NX2hlYWQ7CisJX01fdGFpbCgpID0gX19pbi5fTV90YWlsKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0VsZW1lbnRzPiAKKyAgICBjbGFzcyB0dXBsZSA6IHB1YmxpYyBfVHVwbGVfaW1wbDwwLCBfRWxlbWVudHMuLi4+CisgICAgeworICAgICAgdHlwZWRlZiBfVHVwbGVfaW1wbDwwLCBfRWxlbWVudHMuLi4+IF9Jbmhlcml0ZWQ7CisKKyAgICBwdWJsaWM6CisgICAgICB0dXBsZSgpIDogX0luaGVyaXRlZCgpIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgdHVwbGUodHlwZW5hbWUgX19hZGRfY19yZWY8X0VsZW1lbnRzPjo6dHlwZS4uLiBfX2VsZW1lbnRzKQorICAgICAgOiBfSW5oZXJpdGVkKF9fZWxlbWVudHMuLi4pIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgICAgICB0dXBsZShjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX19pbikKKwk6IF9Jbmhlcml0ZWQoX19pbikgeyB9CisKKyAgICAgIHR1cGxlKGNvbnN0IHR1cGxlJiBfX2luKQorICAgICAgOiBfSW5oZXJpdGVkKF9faW4pIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgICAgICB0dXBsZSYKKyAgICAgICAgb3BlcmF0b3I9KGNvbnN0IHR1cGxlPF9VRWxlbWVudHMuLi4+JiBfX2luKQorICAgICAgICB7CisJICBzdGF0aWNfY2FzdDxfSW5oZXJpdGVkJj4oKnRoaXMpID0gX19pbjsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHR1cGxlJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiBfX2luKQorICAgICAgeworCXN0YXRpY19jYXN0PF9Jbmhlcml0ZWQmPigqdGhpcykgPSBfX2luOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4gY2xhc3MgdHVwbGU8PiB7IH07CisKKyAgLy8gMi1lbGVtZW50IHR1cGxlLCB3aXRoIGNvbnN0cnVjdGlvbiBhbmQgYXNzaWdubWVudCBmcm9tIGEgcGFpci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgICAgY2xhc3MgdHVwbGU8X1QxLCBfVDI+IDogcHVibGljIF9UdXBsZV9pbXBsPDAsIF9UMSwgX1QyPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1R1cGxlX2ltcGw8MCwgX1QxLCBfVDI+IF9Jbmhlcml0ZWQ7CisKKyAgICBwdWJsaWM6CisgICAgICB0dXBsZSgpIDogX0luaGVyaXRlZCgpIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgdHVwbGUodHlwZW5hbWUgX19hZGRfY19yZWY8X1QxPjo6dHlwZSBfX2ExLAorCSAgICB0eXBlbmFtZSBfX2FkZF9jX3JlZjxfVDI+Ojp0eXBlIF9fYTIpCisgICAgICA6IF9Jbmhlcml0ZWQoX19hMSwgX19hMikgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VMSwgdHlwZW5hbWUgX1UyPgorICAgICAgICB0dXBsZShjb25zdCB0dXBsZTxfVTEsIF9VMj4mIF9faW4pCisJOiBfSW5oZXJpdGVkKF9faW4pIHsgfQorCisgICAgICB0dXBsZShjb25zdCB0dXBsZSYgX19pbikKKyAgICAgIDogX0luaGVyaXRlZChfX2luKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1UxLCB0eXBlbmFtZSBfVTI+CisgICAgICAgIHR1cGxlKGNvbnN0IHBhaXI8X1UxLCBfVTI+JiBfX2luKQorCTogX0luaGVyaXRlZChfVHVwbGVfaW1wbDwwLCAKKwkJICAgICB0eXBlbmFtZSBfX2FkZF9jX3JlZjxfVTE+Ojp0eXBlLAorCQkgICAgIHR5cGVuYW1lIF9fYWRkX2NfcmVmPF9VMj46OnR5cGU+KF9faW4uZmlyc3QsIAorCQkJCQkJICAgICAgX19pbi5zZWNvbmQpKQorICAgICAgICB7IH0KKyAgCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVTEsIHR5cGVuYW1lIF9VMj4KKyAgICAgICAgdHVwbGUmCisgICAgICAgIG9wZXJhdG9yPShjb25zdCB0dXBsZTxfVTEsIF9VMj4mIF9faW4pCisgICAgICAgIHsKKwkgIHN0YXRpY19jYXN0PF9Jbmhlcml0ZWQmPigqdGhpcykgPSBfX2luOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdHVwbGUmCisgICAgICBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIF9faW4pCisgICAgICB7CisJc3RhdGljX2Nhc3Q8X0luaGVyaXRlZCY+KCp0aGlzKSA9IF9faW47CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVTEsIHR5cGVuYW1lIF9VMj4KKyAgICAgICAgdHVwbGUmCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBwYWlyPF9VMSwgX1UyPiYgX19pbikKKyAgICAgICAgeworCSAgdGhpcy0+X01faGVhZCA9IF9faW4uZmlyc3Q7CisJICB0aGlzLT5fTV90YWlsKCkuX01faGVhZCA9IF9faW4uc2Vjb25kOworCSAgcmV0dXJuICp0aGlzOworCX0KKyAgICB9OworCisgIAorICAvLy8gR2l2ZXMgdGhlIHR5cGUgb2YgdGhlIGl0aCBlbGVtZW50IG9mIGEgZ2l2ZW4gdHVwbGUgdHlwZS4KKyAgdGVtcGxhdGU8aW50IF9faSwgdHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCB0dXBsZV9lbGVtZW50OworCisgIC8qKgorICAgKiBSZWN1cnNpdmUgY2FzZSBmb3IgdHVwbGVfZWxlbWVudDogc3RyaXAgb2ZmIHRoZSBmaXJzdCBlbGVtZW50IGluCisgICAqIHRoZSB0dXBsZSBhbmQgcmV0cmlldmUgdGhlIChpLTEpdGggZWxlbWVudCBvZiB0aGUgcmVtYWluaW5nIHR1cGxlLgorICAgKi8KKyAgdGVtcGxhdGU8aW50IF9faSwgdHlwZW5hbWUgX0hlYWQsIHR5cGVuYW1lLi4uIF9UYWlsPgorICAgIHN0cnVjdCB0dXBsZV9lbGVtZW50PF9faSwgdHVwbGU8X0hlYWQsIF9UYWlsLi4uPiA+CisgICAgOiB0dXBsZV9lbGVtZW50PF9faSAtIDEsIHR1cGxlPF9UYWlsLi4uPiA+IHsgfTsKKworICAvKioKKyAgICogQmFzaXMgY2FzZSBmb3IgdHVwbGVfZWxlbWVudDogVGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIG9uZSB3ZSdyZSBzZWVraW5nLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0hlYWQsIHR5cGVuYW1lLi4uIF9UYWlsPgorICAgIHN0cnVjdCB0dXBsZV9lbGVtZW50PDAsIHR1cGxlPF9IZWFkLCBfVGFpbC4uLj4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0hlYWQgdHlwZTsKKyAgICB9OworCisgIC8vLyBGaW5kcyB0aGUgc2l6ZSBvZiBhIGdpdmVuIHR1cGxlIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgdHVwbGVfc2l6ZTsKKworICAvLy8gY2xhc3MgdHVwbGVfc2l6ZQorICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfRWxlbWVudHM+CisgICAgc3RydWN0IHR1cGxlX3NpemU8dHVwbGU8X0VsZW1lbnRzLi4uPiA+CisgICAgeworICAgICAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IHNpemVvZi4uLihfRWxlbWVudHMpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0VsZW1lbnRzPgorICAgIGNvbnN0IGludCB0dXBsZV9zaXplPHR1cGxlPF9FbGVtZW50cy4uLj4gPjo6dmFsdWU7CisKKyAgdGVtcGxhdGU8aW50IF9faSwgdHlwZW5hbWUgX0hlYWQsIHR5cGVuYW1lLi4uIF9UYWlsPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2FkZF9yZWY8X0hlYWQ+Ojp0eXBlCisgICAgX19nZXRfaGVscGVyKF9UdXBsZV9pbXBsPF9faSwgX0hlYWQsIF9UYWlsLi4uPiYgX190KQorICAgIHsKKyAgICAgIHJldHVybiBfX3QuX01faGVhZDsKKyAgICB9CisKKyAgdGVtcGxhdGU8aW50IF9faSwgdHlwZW5hbWUgX0hlYWQsIHR5cGVuYW1lLi4uIF9UYWlsPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2FkZF9jX3JlZjxfSGVhZD46OnR5cGUKKyAgICBfX2dldF9oZWxwZXIoY29uc3QgX1R1cGxlX2ltcGw8X19pLCBfSGVhZCwgX1RhaWwuLi4+JiBfX3QpCisgICAgeworICAgICAgcmV0dXJuIF9fdC5fTV9oZWFkOworICAgIH0KKworICAvLyBSZXR1cm4gYSByZWZlcmVuY2UgKGNvbnN0IHJlZmVyZW5jZSkgdG8gdGhlIGl0aCBlbGVtZW50IG9mIGEgdHVwbGUuCisgIC8vIEFueSBjb25zdCBvciBub24tY29uc3QgcmVmIGVsZW1lbnRzIGFyZSByZXR1cm5lZCB3aXRoIHRoZWlyIG9yaWdpbmFsIHR5cGUuCisgIHRlbXBsYXRlPGludCBfX2ksIHR5cGVuYW1lLi4uIF9FbGVtZW50cz4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19hZGRfcmVmPAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X19pLCB0dXBsZTxfRWxlbWVudHMuLi4+ID46OnR5cGUKKyAgICAgICAgICAgICAgICAgICAgPjo6dHlwZQorICAgIGdldCh0dXBsZTxfRWxlbWVudHMuLi4+JiBfX3QpCisgICAgeyAKKyAgICAgIHJldHVybiBfX2dldF9oZWxwZXI8X19pPihfX3QpOyAKKyAgICB9CisKKyAgdGVtcGxhdGU8aW50IF9faSwgdHlwZW5hbWUuLi4gX0VsZW1lbnRzPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2FkZF9jX3JlZjwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9faSwgdHVwbGU8X0VsZW1lbnRzLi4uPiA+Ojp0eXBlCisgICAgICAgICAgICAgICAgICAgID46OnR5cGUKKyAgICBnZXQoY29uc3QgdHVwbGU8X0VsZW1lbnRzLi4uPiYgX190KQorICAgIHsKKyAgICAgIHJldHVybiBfX2dldF9oZWxwZXI8X19pPihfX3QpOworICAgIH0KKworICAvLyBUaGlzIGNsYXNzIGhlbHBzIGNvbnN0cnVjdCB0aGUgdmFyaW91cyBjb21wYXJpc29uIG9wZXJhdGlvbnMgb24gdHVwbGVzCisgIHRlbXBsYXRlPGludCBfX2NoZWNrX2VxdWFsX3NpemUsIGludCBfX2ksIGludCBfX2osCisJICAgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgc3RydWN0IF9fdHVwbGVfY29tcGFyZTsKKworICB0ZW1wbGF0ZTxpbnQgX19pLCBpbnQgX19qLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBzdHJ1Y3QgX190dXBsZV9jb21wYXJlPDAsIF9faSwgX19qLCBfVHAsIF9VcD4KKyAgICB7CisgICAgICBzdGF0aWMgYm9vbCBfX2VxKGNvbnN0IF9UcCYgX190LCBjb25zdCBfVXAmIF9fdSkKKyAgICAgIHsKKwlyZXR1cm4gKGdldDxfX2k+KF9fdCkgPT0gZ2V0PF9faT4oX191KSAmJgorCQlfX3R1cGxlX2NvbXBhcmU8MCwgX19pKzEsIF9faiwgX1RwLCBfVXA+OjpfX2VxKF9fdCwgX191KSk7CisgICAgICB9CisgICAgIAorICAgICAgc3RhdGljIGJvb2wgX19sZXNzKGNvbnN0IF9UcCYgX190LCBjb25zdCBfVXAmIF9fdSkKKyAgICAgIHsKKwlyZXR1cm4gKChnZXQ8X19pPihfX3QpIDwgZ2V0PF9faT4oX191KSkKKwkJfHwgIShnZXQ8X19pPihfX3UpIDwgZ2V0PF9faT4oX190KSkgJiYKKwkJX190dXBsZV9jb21wYXJlPDAsIF9faSsxLCBfX2osIF9UcCwgX1VwPjo6X19sZXNzKF9fdCwgX191KSk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxpbnQgX19pLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBzdHJ1Y3QgX190dXBsZV9jb21wYXJlPDAsIF9faSwgX19pLCBfVHAsIF9VcD4KKyAgICB7CisgICAgICBzdGF0aWMgYm9vbCBfX2VxKGNvbnN0IF9UcCYsIGNvbnN0IF9VcCYpCisgICAgICB7IHJldHVybiB0cnVlOyB9CisgICAgIAorICAgICAgc3RhdGljIGJvb2wgX19sZXNzKGNvbnN0IF9UcCYsIGNvbnN0IF9VcCYpCisgICAgICB7IHJldHVybiBmYWxzZTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1RFbGVtZW50cywgdHlwZW5hbWUuLi4gX1VFbGVtZW50cz4KKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB0dXBsZTxfVEVsZW1lbnRzLi4uPiYgX190LAorCSAgICAgICBjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX191KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHVwbGU8X1RFbGVtZW50cy4uLj4gX1RwOworICAgICAgdHlwZWRlZiB0dXBsZTxfVUVsZW1lbnRzLi4uPiBfVXA7CisgICAgICByZXR1cm4gKF9fdHVwbGVfY29tcGFyZTx0dXBsZV9zaXplPF9UcD46OnZhbHVlIC0gdHVwbGVfc2l6ZTxfVXA+Ojp2YWx1ZSwKKwkgICAgICAwLCB0dXBsZV9zaXplPF9UcD46OnZhbHVlLCBfVHAsIF9VcD46Ol9fZXEoX190LCBfX3UpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1RFbGVtZW50cywgdHlwZW5hbWUuLi4gX1VFbGVtZW50cz4KKyAgICBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHR1cGxlPF9URWxlbWVudHMuLi4+JiBfX3QsCisJICAgICAgY29uc3QgdHVwbGU8X1VFbGVtZW50cy4uLj4mIF9fdSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR1cGxlPF9URWxlbWVudHMuLi4+IF9UcDsKKyAgICAgIHR5cGVkZWYgdHVwbGU8X1VFbGVtZW50cy4uLj4gX1VwOworICAgICAgcmV0dXJuIChfX3R1cGxlX2NvbXBhcmU8dHVwbGVfc2l6ZTxfVHA+Ojp2YWx1ZSAtIHR1cGxlX3NpemU8X1VwPjo6dmFsdWUsCisJICAgICAgMCwgdHVwbGVfc2l6ZTxfVHA+Ojp2YWx1ZSwgX1RwLCBfVXA+OjpfX2xlc3MoX190LCBfX3UpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1RFbGVtZW50cywgdHlwZW5hbWUuLi4gX1VFbGVtZW50cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgdHVwbGU8X1RFbGVtZW50cy4uLj4mIF9fdCwKKwkgICAgICAgY29uc3QgdHVwbGU8X1VFbGVtZW50cy4uLj4mIF9fdSkKKyAgICB7IHJldHVybiAhKF9fdCA9PSBfX3UpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1RFbGVtZW50cywgdHlwZW5hbWUuLi4gX1VFbGVtZW50cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCB0dXBsZTxfVEVsZW1lbnRzLi4uPiYgX190LAorCSAgICAgIGNvbnN0IHR1cGxlPF9VRWxlbWVudHMuLi4+JiBfX3UpCisgICAgeyByZXR1cm4gX191IDwgX190OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1RFbGVtZW50cywgdHlwZW5hbWUuLi4gX1VFbGVtZW50cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgdHVwbGU8X1RFbGVtZW50cy4uLj4mIF9fdCwKKwkgICAgICAgY29uc3QgdHVwbGU8X1VFbGVtZW50cy4uLj4mIF9fdSkKKyAgICB7IHJldHVybiAhKF9fdSA8IF9fdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCB0dXBsZTxfVEVsZW1lbnRzLi4uPiYgX190LAorCSAgICAgICBjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX191KQorICAgIHsgcmV0dXJuICEoX190IDwgX191KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyByZWZlcmVuY2Vfd3JhcHBlcjsKKworICAvLyBIZWxwZXIgd2hpY2ggYWRkcyBhIHJlZmVyZW5jZSB0byBhIHR5cGUgd2hlbiBnaXZlbiBhIHJlZmVyZW5jZV93cmFwcGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19zdHJpcF9yZWZlcmVuY2Vfd3JhcHBlcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19zdHJpcF9yZWZlcmVuY2Vfd3JhcHBlcjxyZWZlcmVuY2Vfd3JhcHBlcjxfVHA+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9UcCYgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX3N0cmlwX3JlZmVyZW5jZV93cmFwcGVyPGNvbnN0IHJlZmVyZW5jZV93cmFwcGVyPF9UcD4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwJiBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfRWxlbWVudHM+CisgICAgaW5saW5lIHR1cGxlPHR5cGVuYW1lIF9fc3RyaXBfcmVmZXJlbmNlX3dyYXBwZXI8X0VsZW1lbnRzPjo6X190eXBlLi4uPgorICAgIG1ha2VfdHVwbGUoX0VsZW1lbnRzLi4uIF9fYXJncykKKyAgICB7CisgICAgICB0eXBlZGVmIHR1cGxlPHR5cGVuYW1lIF9fc3RyaXBfcmVmZXJlbmNlX3dyYXBwZXI8X0VsZW1lbnRzPjo6X190eXBlLi4uPgorICAgICAgICBfX3Jlc3VsdF90eXBlOworICAgICAgcmV0dXJuIF9fcmVzdWx0X3R5cGUoX19hcmdzLi4uKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0VsZW1lbnRzPgorICAgIGlubGluZSB0dXBsZTxfRWxlbWVudHMmLi4uPgorICAgIHRpZShfRWxlbWVudHMmLi4uIF9fYXJncykKKyAgICB7CisgICAgICByZXR1cm4gdHVwbGU8X0VsZW1lbnRzJi4uLj4oX19hcmdzLi4uKTsKKyAgICB9CisKKyAgLy8gQSBjbGFzcyAoYW5kIGluc3RhbmNlKSB3aGljaCBjYW4gYmUgdXNlZCBpbiAndGllJyB3aGVuIGFuIGVsZW1lbnQKKyAgLy8gb2YgYSB0dXBsZSBpcyBub3QgcmVxdWlyZWQKKyAgc3RydWN0IF9Td2FsbG93X2Fzc2lnbgorICB7CisgICAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgICAgX1N3YWxsb3dfYXNzaWduJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9UcCYpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICB9OworCisgIC8vIFRPRE86IFB1dCB0aGlzIGluIHNvbWUga2luZCBvZiBzaGFyZWQgZmlsZS4KKyAgbmFtZXNwYWNlCisgIHsKKyAgICBfU3dhbGxvd19hc3NpZ24gaWdub3JlOworICB9OyAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX1RVUExFCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS90eXBlX3RyYWl0cyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3R5cGVfdHJhaXRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NzkyNzYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS90eXBlX3RyYWl0cwpAQCAtMCwwICsxLDY4NyBAQAorLy8gVFIxIHR5cGVfdHJhaXRzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvdHlwZV90cmFpdHMKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfVFlQRV9UUkFJVFMKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX1RZUEVfVFJBSVRTIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBtZXRhcHJvZ3JhbW1pbmcKKyAgICogQHsKKyAgICovCisKKyAgc3RydWN0IF9fc2ZpbmFlX3R5cGVzCisgIHsKKyAgICB0eXBlZGVmIGNoYXIgX19vbmU7CisgICAgdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIF9fYXJyWzJdOyB9IF9fdHdvOworICB9OworCisjZGVmaW5lIF9ERUZJTkVfU1BFQ18wX0hFTFBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTw+CisKKyNkZWZpbmUgX0RFRklORV9TUEVDXzFfSEVMUEVSICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKworI2RlZmluZSBfREVGSU5FX1NQRUNfMl9IRUxQRVIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ3A+CisKKyNkZWZpbmUgX0RFRklORV9TUEVDKF9PcmRlciwgX1RyYWl0LCBfVHlwZSwgX1ZhbHVlKSAgICBcCisgIF9ERUZJTkVfU1BFQ18jI19PcmRlciMjX0hFTFBFUiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cnVjdCBfVHJhaXQ8X1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfVmFsdWU+IHsgfTsKKworICAvLyBoZWxwZXIgY2xhc3NlcyBbNC4zXS4KKworICAvLy8gaW50ZWdyYWxfY29uc3RhbnQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfVHAgX192PgorICAgIHN0cnVjdCBpbnRlZ3JhbF9jb25zdGFudAorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCBfVHAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBfX3Y7CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIGludGVncmFsX2NvbnN0YW50PF9UcCwgX192PiAgIHR5cGU7CisgICAgfTsKKyAgCisgIC8vLyB0eXBlZGVmIGZvciB0cnVlX3R5cGUKKyAgdHlwZWRlZiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCB0cnVlPiAgICAgdHJ1ZV90eXBlOworCisgIC8vLyB0eXBlZGVmIGZvciBmYWxzZV90eXBlCisgIHR5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgZmFsc2U+ICAgIGZhbHNlX3R5cGU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfVHAgX192PgorICAgIGNvbnN0IF9UcCBpbnRlZ3JhbF9jb25zdGFudDxfVHAsIF9fdj46OnZhbHVlOworCisgIC8vLyByZW1vdmVfY3YKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IHJlbW92ZV9jdjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19pc192b2lkX2hlbHBlcgorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworICBfREVGSU5FX1NQRUMoMCwgX19pc192b2lkX2hlbHBlciwgdm9pZCwgdHJ1ZSkKKworICAvLyBwcmltYXJ5IHR5cGUgY2F0ZWdvcmllcyBbNC41LjFdLgorCisgIC8vLyBpc192b2lkCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfdm9pZAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX3ZvaWRfaGVscGVyPHR5cGVuYW1lCisJCQkJICAgICAgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBfX2lzX2ludGVncmFsX2hlbHBlcgorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworICBfREVGSU5FX1NQRUMoMCwgX19pc19pbnRlZ3JhbF9oZWxwZXIsIGJvb2wsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2ludGVncmFsX2hlbHBlciwgY2hhciwgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfaW50ZWdyYWxfaGVscGVyLCBzaWduZWQgY2hhciwgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfaW50ZWdyYWxfaGVscGVyLCB1bnNpZ25lZCBjaGFyLCB0cnVlKQorI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2ludGVncmFsX2hlbHBlciwgd2NoYXJfdCwgdHJ1ZSkKKyNlbmRpZgorICBfREVGSU5FX1NQRUMoMCwgX19pc19pbnRlZ3JhbF9oZWxwZXIsIHNob3J0LCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc19pbnRlZ3JhbF9oZWxwZXIsIHVuc2lnbmVkIHNob3J0LCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc19pbnRlZ3JhbF9oZWxwZXIsIGludCwgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfaW50ZWdyYWxfaGVscGVyLCB1bnNpZ25lZCBpbnQsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2ludGVncmFsX2hlbHBlciwgbG9uZywgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfaW50ZWdyYWxfaGVscGVyLCB1bnNpZ25lZCBsb25nLCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc19pbnRlZ3JhbF9oZWxwZXIsIGxvbmcgbG9uZywgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfaW50ZWdyYWxfaGVscGVyLCB1bnNpZ25lZCBsb25nIGxvbmcsIHRydWUpCisKKyAgLy8vIGlzX2ludGVncmFsCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfaW50ZWdyYWwKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoX19pc19pbnRlZ3JhbF9oZWxwZXI8dHlwZW5hbWUKKwkJCQkgICAgICByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfZmxvYXRpbmdfcG9pbnRfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2Zsb2F0aW5nX3BvaW50X2hlbHBlciwgZmxvYXQsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2Zsb2F0aW5nX3BvaW50X2hlbHBlciwgZG91YmxlLCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc19mbG9hdGluZ19wb2ludF9oZWxwZXIsIGxvbmcgZG91YmxlLCB0cnVlKQorCisgIC8vLyBpc19mbG9hdGluZ19wb2ludAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2Zsb2F0aW5nX3BvaW50CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfZmxvYXRpbmdfcG9pbnRfaGVscGVyPHR5cGVuYW1lCisJCQkJICAgICAgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIC8vLyBpc19hcnJheQorICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfYXJyYXkKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9TaXplPgorICAgIHN0cnVjdCBpc19hcnJheTxfVHBbX1NpemVdPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19hcnJheTxfVHBbXT4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBfX2lzX3BvaW50ZXJfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisgIF9ERUZJTkVfU1BFQygxLCBfX2lzX3BvaW50ZXJfaGVscGVyLCBfVHAqLCB0cnVlKQorCisgIC8vLyBpc19wb2ludGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfcG9pbnRlcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX3BvaW50ZXJfaGVscGVyPHR5cGVuYW1lCisJCQkJICAgICAgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIC8vLyBpc19yZWZlcmVuY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19yZWZlcmVuY2U7CisKKyAgLy8vIGlzX2Z1bmN0aW9uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfZnVuY3Rpb247CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfbWVtYmVyX29iamVjdF9wb2ludGVyX2hlbHBlcgorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworICBfREVGSU5FX1NQRUMoMiwgX19pc19tZW1iZXJfb2JqZWN0X3BvaW50ZXJfaGVscGVyLCBfVHAgX0NwOjoqLAorCSAgICAgICAhaXNfZnVuY3Rpb248X1RwPjo6dmFsdWUpCisKKyAgLy8vIGlzX21lbWJlcl9vYmplY3RfcG9pbnRlcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX21lbWJlcl9vYmplY3RfcG9pbnRlcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX21lbWJlcl9vYmplY3RfcG9pbnRlcl9oZWxwZXI8CisJCQkJICAgICAgdHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBfX2lzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyX2hlbHBlcgorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworICBfREVGSU5FX1NQRUMoMiwgX19pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcl9oZWxwZXIsIF9UcCBfQ3A6OiosCisJICAgICAgIGlzX2Z1bmN0aW9uPF9UcD46OnZhbHVlKQorCisgIC8vLyBpc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXJfaGVscGVyPAorCQkJCSAgICAgIHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPjo6dmFsdWUpPgorICAgIHsgfTsKKworICAvLy8gaXNfZW51bQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2VudW0KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX2VudW0oX1RwKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX3VuaW9uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfdW5pb24KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX3VuaW9uKF9UcCk+CisgICAgeyB9OworCisgIC8vLyBpc19jbGFzcworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2NsYXNzCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19jbGFzcyhfVHApPgorICAgIHsgfTsKKworICAvLy8gaXNfZnVuY3Rpb24KKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IGlzX2Z1bmN0aW9uCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgaXNfZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgaXNfZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4uLi4pPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgaXNfZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pIGNvbnN0PgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgaXNfZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4uLi4pIGNvbnN0PgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgaXNfZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pIHZvbGF0aWxlPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgaXNfZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4uLi4pIHZvbGF0aWxlPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgaXNfZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pIGNvbnN0IHZvbGF0aWxlPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgaXNfZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4uLi4pIGNvbnN0IHZvbGF0aWxlPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgLy8gY29tcG9zaXRlIHR5cGUgdHJhaXRzIFs0LjUuMl0uCisgIAorICAvLy8gaXNfYXJpdGhtZXRpYworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2FyaXRobWV0aWMKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoaXNfaW50ZWdyYWw8X1RwPjo6dmFsdWUKKwkJCQkgICAgICB8fCBpc19mbG9hdGluZ19wb2ludDxfVHA+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIC8vLyBpc19mdW5kYW1lbnRhbAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2Z1bmRhbWVudGFsCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKGlzX2FyaXRobWV0aWM8X1RwPjo6dmFsdWUKKwkJCQkgICAgICB8fCBpc192b2lkPF9UcD46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX29iamVjdAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX29iamVjdAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsICEoaXNfZnVuY3Rpb248X1RwPjo6dmFsdWUKKwkJCQkgICAgICAgfHwgaXNfcmVmZXJlbmNlPF9UcD46OnZhbHVlCisJCQkJICAgICAgIHx8IGlzX3ZvaWQ8X1RwPjo6dmFsdWUpPgorICAgIHsgfTsKKworICAvLy8gaXNfbWVtYmVyX3BvaW50ZXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19tZW1iZXJfcG9pbnRlcjsKKworICAvLy8gaXNfc2NhbGFyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfc2NhbGFyCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKGlzX2FyaXRobWV0aWM8X1RwPjo6dmFsdWUKKwkJCQkgICAgICB8fCBpc19lbnVtPF9UcD46OnZhbHVlCisJCQkJICAgICAgfHwgaXNfcG9pbnRlcjxfVHA+Ojp2YWx1ZQorCQkJCSAgICAgIHx8IGlzX21lbWJlcl9wb2ludGVyPF9UcD46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX2NvbXBvdW5kCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfY29tcG91bmQKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAhaXNfZnVuZGFtZW50YWw8X1RwPjo6dmFsdWU+IHsgfTsKKworICAvLy8gaXNfbWVtYmVyX3BvaW50ZXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX21lbWJlcl9wb2ludGVyX2hlbHBlcgorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworICBfREVGSU5FX1NQRUMoMiwgX19pc19tZW1iZXJfcG9pbnRlcl9oZWxwZXIsIF9UcCBfQ3A6OiosIHRydWUpCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICBzdHJ1Y3QgaXNfbWVtYmVyX3BvaW50ZXIKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoX19pc19tZW1iZXJfcG9pbnRlcl9oZWxwZXI8CisJCQkJICAgICAgdHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIC8vIHR5cGUgcHJvcGVydGllcyBbNC41LjNdLgorICAvLy8gaXNfY29uc3QKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IGlzX2NvbnN0CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19jb25zdDxfVHAgY29uc3Q+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgCisgIC8vLyBpc192b2xhdGlsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfdm9sYXRpbGUKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3ZvbGF0aWxlPF9UcCB2b2xhdGlsZT4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIC8vLyBpc19lbXB0eQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2VtcHR5CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19lbXB0eShfVHApPgorICAgIHsgfTsKKworICAvLy8gaXNfcG9seW1vcnBoaWMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19wb2x5bW9ycGhpYworICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfcG9seW1vcnBoaWMoX1RwKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX2Fic3RyYWN0CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfYWJzdHJhY3QKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX2Fic3RyYWN0KF9UcCk+CisgICAgeyB9OworCisgIC8vLyBoYXNfdmlydHVhbF9kZXN0cnVjdG9yCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzX3ZpcnR1YWxfZGVzdHJ1Y3RvcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faGFzX3ZpcnR1YWxfZGVzdHJ1Y3RvcihfVHApPgorICAgIHsgfTsKKworICAvLy8gYWxpZ25tZW50X29mCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYWxpZ25tZW50X29mCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIF9fYWxpZ25vZl9fKF9UcCk+IHsgfTsKKyAgCisgIC8vLyByYW5rCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCByYW5rCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIDA+IHsgfTsKKyAgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9TaXplPgorICAgIHN0cnVjdCByYW5rPF9UcFtfU2l6ZV0+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIDEgKyByYW5rPF9UcD46OnZhbHVlPiB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByYW5rPF9UcFtdPgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PHN0ZDo6c2l6ZV90LCAxICsgcmFuazxfVHA+Ojp2YWx1ZT4geyB9OworCisgIC8vLyBleHRlbnQKKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHVuc2lnbmVkIF9VaW50ID0gMD4KKyAgICBzdHJ1Y3QgZXh0ZW50CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIDA+IHsgfTsKKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdW5zaWduZWQgX1VpbnQsIHN0ZDo6c2l6ZV90IF9TaXplPgorICAgIHN0cnVjdCBleHRlbnQ8X1RwW19TaXplXSwgX1VpbnQ+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsCisJCQkgICAgICAgX1VpbnQgPT0gMCA/IF9TaXplIDogZXh0ZW50PF9UcCwKKwkJCQkJCQkgICBfVWludCAtIDE+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB1bnNpZ25lZCBfVWludD4KKyAgICBzdHJ1Y3QgZXh0ZW50PF9UcFtdLCBfVWludD4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwKKwkJCSAgICAgICBfVWludCA9PSAwID8gMCA6IGV4dGVudDxfVHAsCisJCQkJCQkgICAgICAgX1VpbnQgLSAxPjo6dmFsdWU+CisgICAgeyB9OworCisgIC8vIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0eXBlcyBbNC42XS4KKworICAvLy8gaXNfc2FtZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+CisgICAgc3RydWN0IGlzX3NhbWUKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3NhbWU8X1RwLCBfVHA+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICAvLyBjb25zdC12b2xhdGlsZSBtb2RpZmljYXRpb25zIFs0LjcuMV0uCisKKyAgLy8vIHJlbW92ZV9jb25zdAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9jb25zdAorICAgIHsgdHlwZWRlZiBfVHAgICAgIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfY29uc3Q8X1RwIGNvbnN0PgorICAgIHsgdHlwZWRlZiBfVHAgICAgIHR5cGU7IH07CisgIAorICAvLy8gcmVtb3ZlX3ZvbGF0aWxlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX3ZvbGF0aWxlCisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV92b2xhdGlsZTxfVHAgdm9sYXRpbGU+CisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKyAgCisgIC8vLyByZW1vdmVfY3YKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfY3YKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lCisgICAgICByZW1vdmVfY29uc3Q8dHlwZW5hbWUgcmVtb3ZlX3ZvbGF0aWxlPF9UcD46OnR5cGU+Ojp0eXBlICAgICB0eXBlOworICAgIH07CisgIAorICAvLy8gYWRkX2NvbnN0CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYWRkX2NvbnN0CisgICAgeyB0eXBlZGVmIF9UcCBjb25zdCAgICAgdHlwZTsgfTsKKyAgIAorICAvLy8gYWRkX3ZvbGF0aWxlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYWRkX3ZvbGF0aWxlCisgICAgeyB0eXBlZGVmIF9UcCB2b2xhdGlsZSAgICAgdHlwZTsgfTsKKyAgCisgIC8vLyBhZGRfY3YKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhZGRfY3YKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lCisgICAgICBhZGRfY29uc3Q8dHlwZW5hbWUgYWRkX3ZvbGF0aWxlPF9UcD46OnR5cGU+Ojp0eXBlICAgICB0eXBlOworICAgIH07CisKKyAgLy8gYXJyYXkgbW9kaWZpY2F0aW9ucyBbNC43LjNdLgorCisgIC8vLyByZW1vdmVfZXh0ZW50CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX2V4dGVudAorICAgIHsgdHlwZWRlZiBfVHAgICAgIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfU2l6ZT4KKyAgICBzdHJ1Y3QgcmVtb3ZlX2V4dGVudDxfVHBbX1NpemVdPgorICAgIHsgdHlwZWRlZiBfVHAgICAgIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfZXh0ZW50PF9UcFtdPgorICAgIHsgdHlwZWRlZiBfVHAgICAgIHR5cGU7IH07CisKKyAgLy8vIHJlbW92ZV9hbGxfZXh0ZW50cworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9hbGxfZXh0ZW50cworICAgIHsgdHlwZWRlZiBfVHAgICAgIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfU2l6ZT4KKyAgICBzdHJ1Y3QgcmVtb3ZlX2FsbF9leHRlbnRzPF9UcFtfU2l6ZV0+CisgICAgeyB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGxfZXh0ZW50czxfVHA+Ojp0eXBlICAgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX2FsbF9leHRlbnRzPF9UcFtdPgorICAgIHsgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsX2V4dGVudHM8X1RwPjo6dHlwZSAgICAgdHlwZTsgfTsKKworICAvLyBwb2ludGVyIG1vZGlmaWNhdGlvbnMgWzQuNy40XS4KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lPgorICAgIHN0cnVjdCBfX3JlbW92ZV9wb2ludGVyX2hlbHBlcgorICAgIHsgdHlwZWRlZiBfVHAgICAgIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgc3RydWN0IF9fcmVtb3ZlX3BvaW50ZXJfaGVscGVyPF9UcCwgX1VwKj4KKyAgICB7IHR5cGVkZWYgX1VwICAgICB0eXBlOyB9OworCisgIC8vLyByZW1vdmVfcG9pbnRlcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9wb2ludGVyCisgICAgOiBwdWJsaWMgX19yZW1vdmVfcG9pbnRlcl9oZWxwZXI8X1RwLCB0eXBlbmFtZSByZW1vdmVfY3Y8X1RwPjo6dHlwZT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IHJlbW92ZV9yZWZlcmVuY2U7CisKKyAgLy8vIGFkZF9wb2ludGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYWRkX3BvaW50ZXIKKyAgICB7IHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlKiAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfcmVmZXJlbmNlCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19yZWZlcmVuY2U8X1RwJj4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfcG9kCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19wb2QoX1RwKSB8fCBpc192b2lkPF9UcD46OnZhbHVlPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGhhc190cml2aWFsX2NvbnN0cnVjdG9yCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfcG9kPF9UcD46OnZhbHVlPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGhhc190cml2aWFsX2NvcHkKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19wb2Q8X1RwPjo6dmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzX3RyaXZpYWxfYXNzaWduCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfcG9kPF9UcD46OnZhbHVlPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGhhc190cml2aWFsX2Rlc3RydWN0b3IKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19wb2Q8X1RwPjo6dmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzX25vdGhyb3dfY29uc3RydWN0b3IKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19wb2Q8X1RwPjo6dmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzX25vdGhyb3dfY29weQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX3BvZDxfVHA+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBoYXNfbm90aHJvd19hc3NpZ24KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19wb2Q8X1RwPjo6dmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBfX2lzX3NpZ25lZF9oZWxwZXIKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfc2lnbmVkX2hlbHBlciwgc2lnbmVkIGNoYXIsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX3NpZ25lZF9oZWxwZXIsIHNob3J0LCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc19zaWduZWRfaGVscGVyLCBpbnQsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX3NpZ25lZF9oZWxwZXIsIGxvbmcsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX3NpZ25lZF9oZWxwZXIsIGxvbmcgbG9uZywgdHJ1ZSkKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3NpZ25lZAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX3NpZ25lZF9oZWxwZXI8dHlwZW5hbWUKKwkJCQkgICAgICByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfdW5zaWduZWRfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX3Vuc2lnbmVkX2hlbHBlciwgdW5zaWduZWQgY2hhciwgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfdW5zaWduZWRfaGVscGVyLCB1bnNpZ25lZCBzaG9ydCwgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfdW5zaWduZWRfaGVscGVyLCB1bnNpZ25lZCBpbnQsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX3Vuc2lnbmVkX2hlbHBlciwgdW5zaWduZWQgbG9uZywgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfdW5zaWduZWRfaGVscGVyLCB1bnNpZ25lZCBsb25nIGxvbmcsIHRydWUpCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc191bnNpZ25lZAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX3Vuc2lnbmVkX2hlbHBlcjx0eXBlbmFtZQorCQkJCSAgICAgIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPjo6dmFsdWUpPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmFzZSwgdHlwZW5hbWUgX0Rlcml2ZWQ+CisgICAgc3RydWN0IF9faXNfYmFzZV9vZl9oZWxwZXIKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9jdjxfQmFzZT46OnR5cGUgICAgX05vQ3ZfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2N2PF9EZXJpdmVkPjo6dHlwZSBfTm9Ddl9EZXJpdmVkOworICAgICAgc3RhdGljIGNvbnN0IGJvb2wgX192YWx1ZSA9IChpc19zYW1lPF9CYXNlLCBfRGVyaXZlZD46OnZhbHVlCisJCQkJICAgfHwgKF9faXNfYmFzZV9vZihfQmFzZSwgX0Rlcml2ZWQpCisJCQkJICAgICAgICYmICFpc19zYW1lPF9Ob0N2X0Jhc2UsCisJCQkJICAgICAgICAgICAgICAgICAgIF9Ob0N2X0Rlcml2ZWQ+Ojp2YWx1ZSkpOworICAgIH07CisgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CYXNlLCB0eXBlbmFtZSBfRGVyaXZlZD4KKyAgICBzdHJ1Y3QgaXNfYmFzZV9vZgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsCisJCQkgICAgICAgX19pc19iYXNlX29mX2hlbHBlcjxfQmFzZSwgX0Rlcml2ZWQ+OjpfX3ZhbHVlPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnJvbSwgdHlwZW5hbWUgX1RvPgorICAgIHN0cnVjdCBfX2lzX2NvbnZlcnRpYmxlX3NpbXBsZQorICAgIDogcHVibGljIF9fc2ZpbmFlX3R5cGVzCisgICAgeworICAgIHByaXZhdGU6CisgICAgICBzdGF0aWMgX19vbmUgX190ZXN0KF9Ubyk7CisgICAgICBzdGF0aWMgX190d28gX190ZXN0KC4uLik7CisgICAgICBzdGF0aWMgX0Zyb20gX19tYWtlRnJvbSgpOworICAgIAorICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIF9fdmFsdWUgPSBzaXplb2YoX190ZXN0KF9fbWFrZUZyb20oKSkpID09IDE7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGFkZF9yZWZlcmVuY2U7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2ludF9vcl9jcmVmCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9UcD46OnR5cGUgX19ycl9UcDsKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIF9fdmFsdWUgPSAoaXNfaW50ZWdyYWw8X1RwPjo6dmFsdWUKKwkJCQkgICB8fCAoaXNfaW50ZWdyYWw8X19ycl9UcD46OnZhbHVlCisJCQkJICAgICAgICYmIGlzX2NvbnN0PF9fcnJfVHA+Ojp2YWx1ZQorCQkJCSAgICAgICAmJiAhaXNfdm9sYXRpbGU8X19ycl9UcD46OnZhbHVlKSk7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnJvbSwgdHlwZW5hbWUgX1RvLAorCSAgIGJvb2wgPSAoaXNfdm9pZDxfRnJvbT46OnZhbHVlIHx8IGlzX3ZvaWQ8X1RvPjo6dmFsdWUKKwkJICAgfHwgaXNfZnVuY3Rpb248X1RvPjo6dmFsdWUgfHwgaXNfYXJyYXk8X1RvPjo6dmFsdWUKKwkJICAgLy8gVGhpcyBzcGVjaWFsIGNhc2UgaXMgaGVyZSBvbmx5IHRvIGF2b2lkIHdhcm5pbmdzLgkKKwkJICAgfHwgKGlzX2Zsb2F0aW5nX3BvaW50PHR5cGVuYW1lCisJCSAgICAgICByZW1vdmVfcmVmZXJlbmNlPF9Gcm9tPjo6dHlwZT46OnZhbHVlCisJCSAgICAgICAmJiBfX2lzX2ludF9vcl9jcmVmPF9Ubz46Ol9fdmFsdWUpKT4KKyAgICBzdHJ1Y3QgX19pc19jb252ZXJ0aWJsZV9oZWxwZXIKKyAgICB7CisgICAgICAvLyAiQW4gaW1hZ2luYXJ5IGx2YWx1ZSBvZiB0eXBlIEZyb20uLi4iLgorICAgICAgc3RhdGljIGNvbnN0IGJvb2wgX192YWx1ZSA9IChfX2lzX2NvbnZlcnRpYmxlX3NpbXBsZTx0eXBlbmFtZQorCQkJCSAgIGFkZF9yZWZlcmVuY2U8X0Zyb20+Ojp0eXBlLCBfVG8+OjpfX3ZhbHVlKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gcm9tLCB0eXBlbmFtZSBfVG8+CisgICAgc3RydWN0IF9faXNfY29udmVydGlibGVfaGVscGVyPF9Gcm9tLCBfVG8sIHRydWU+CisgICAgeyBzdGF0aWMgY29uc3QgYm9vbCBfX3ZhbHVlID0gKGlzX3ZvaWQ8X1RvPjo6dmFsdWUKKwkJCQkgICB8fCAoX19pc19pbnRfb3JfY3JlZjxfVG8+OjpfX3ZhbHVlCisJCQkJICAgICAgICYmICFpc192b2lkPF9Gcm9tPjo6dmFsdWUpKTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnJvbSwgdHlwZW5hbWUgX1RvPgorICAgIHN0cnVjdCBpc19jb252ZXJ0aWJsZQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsCisJCQkgICAgICAgX19pc19jb252ZXJ0aWJsZV9oZWxwZXI8X0Zyb20sIF9Ubz46Ol9fdmFsdWU+CisgICAgeyB9OworCisgIC8vIHJlZmVyZW5jZSBtb2RpZmljYXRpb25zIFs0LjcuMl0uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX3JlZmVyZW5jZQorICAgIHsgdHlwZWRlZiBfVHAgICAgIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfcmVmZXJlbmNlPF9UcCY+CisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICAvLyBOQjogQ2FyZWZ1bCB3aXRoIHJlZmVyZW5jZSB0byB2b2lkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2wgPSAoaXNfdm9pZDxfVHA+Ojp2YWx1ZQorCQkJCSB8fCBpc19yZWZlcmVuY2U8X1RwPjo6dmFsdWUpPgorICAgIHN0cnVjdCBfX2FkZF9yZWZlcmVuY2VfaGVscGVyCisgICAgeyB0eXBlZGVmIF9UcCYgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fYWRkX3JlZmVyZW5jZV9oZWxwZXI8X1RwLCB0cnVlPgorICAgIHsgdHlwZWRlZiBfVHAgICAgIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhZGRfcmVmZXJlbmNlCisgICAgOiBwdWJsaWMgX19hZGRfcmVmZXJlbmNlX2hlbHBlcjxfVHA+CisgICAgeyB9OworCisgIC8vIG90aGVyIHRyYW5zZm9ybWF0aW9ucyBbNC44XS4KKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0xlbiwgc3RkOjpzaXplX3QgX0FsaWduPgorICAgIHN0cnVjdCBhbGlnbmVkX3N0b3JhZ2UKKyAgICB7IAorICAgICAgdW5pb24gdHlwZQorICAgICAgeworCXVuc2lnbmVkIGNoYXIgX19kYXRhW19MZW5dOworCXN0cnVjdCBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXygoX0FsaWduKSkpKSB7IH0gX19hbGlnbjsgCisgICAgICB9OworICAgIH07CisKKyN1bmRlZiBfREVGSU5FX1NQRUNfMF9IRUxQRVIKKyN1bmRlZiBfREVGSU5FX1NQRUNfMV9IRUxQRVIKKyN1bmRlZiBfREVGSU5FX1NQRUNfMl9IRUxQRVIKKyN1bmRlZiBfREVGSU5FX1NQRUMKKworICAvLy8gQH0gZ3JvdXAgbWV0YXByb2dyYW1taW5nCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX1RZUEVfVFJBSVRTCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS91bm9yZGVyZWRfbWFwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvdW5vcmRlcmVkX21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODEyMzY3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvdW5vcmRlcmVkX21hcApAQCAtMCwwICsxLDQ0IEBACisvLyBUUjEgdW5vcmRlcmVkX21hcCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3Vub3JkZXJlZF9tYXAKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfVU5PUkRFUkVEX01BUAorI2RlZmluZSBfR0xJQkNYWF9UUjFfVU5PUkRFUkVEX01BUCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4KKyNpbmNsdWRlIDxiaXRzL2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2Z1bmN0aW9uLmg+IC8vIGVxdWFsX3RvLCBfSWRlbnRpdHksIF9TZWxlY3Qxc3QKKyNpbmNsdWRlIDxiaXRzL3N0cmluZ2Z3ZC5oPgorI2luY2x1ZGUgPHRyMS90eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbF9oYXNoLmg+CisjaW5jbHVkZSA8dHIxL2hhc2h0YWJsZS5oPgorI2luY2x1ZGUgPHRyMS91bm9yZGVyZWRfbWFwLmg+CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfVU5PUkRFUkVEX01BUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvdW5vcmRlcmVkX21hcC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvdW5vcmRlcmVkX21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzUwZDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS91bm9yZGVyZWRfbWFwLmgKQEAgLTAsMCArMSwyNzggQEAKKy8vIFRSMSB1bm9yZGVyZWRfbWFwIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvdW5vcmRlcmVkX21hcC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dHIxL3Vub3JkZXJlZF9tYXB9CisgKi8KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIE5COiBXaGVuIHdlIGdldCB0eXBlZGVmIHRlbXBsYXRlcyB0aGVzZSBjbGFzcyBkZWZpbml0aW9ucworICAvLyB3aWxsIGJlIHVubmVjZXNzYXJ5LgorICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsCisJICAgY2xhc3MgX0hhc2ggPSBoYXNoPF9LZXk+LAorCSAgIGNsYXNzIF9QcmVkID0gc3RkOjplcXVhbF90bzxfS2V5PiwKKwkgICBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+LAorCSAgIGJvb2wgX19jYWNoZV9oYXNoX2NvZGUgPSBmYWxzZT4KKyAgICBjbGFzcyBfX3Vub3JkZXJlZF9tYXAKKyAgICA6IHB1YmxpYyBfSGFzaHRhYmxlPF9LZXksIHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+LCBfQWxsb2MsCisJCQlzdGQ6Ol9TZWxlY3Qxc3Q8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiwgX1ByZWQsCisJCQlfSGFzaCwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZywKKwkJCV9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCwKKwkJCV9fZGV0YWlsOjpfUHJpbWVfcmVoYXNoX3BvbGljeSwKKwkJCV9fY2FjaGVfaGFzaF9jb2RlLCBmYWxzZSwgdHJ1ZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9IYXNodGFibGU8X0tleSwgc3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4sIF9BbGxvYywKKwkJCSBzdGQ6Ol9TZWxlY3Qxc3Q8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiwgX1ByZWQsCisJCQkgX0hhc2gsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcsCisJCQkgX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoLAorCQkJIF9fZGV0YWlsOjpfUHJpbWVfcmVoYXNoX3BvbGljeSwKKwkJCSBfX2NhY2hlX2hhc2hfY29kZSwgZmFsc2UsIHRydWU+CisJX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aGFzaGVyICAgICAgICAgIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV9lcXVhbCAgICAgICBrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX3Vub3JkZXJlZF9tYXAoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkgICAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2hmLCBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nKCksCisJICAgICAgX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoKCksCisJICAgICAgX19lcWwsIHN0ZDo6X1NlbGVjdDFzdDxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+KCksIF9fYSkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwlfX3Vub3JkZXJlZF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCQlzaXplX3R5cGUgX19uID0gMTAsCisJCQljb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCWNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCWNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19mLCBfX2wsIF9fbiwgX19oZiwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZygpLAorCQlfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2goKSwKKwkJX19lcWwsIHN0ZDo6X1NlbGVjdDFzdDxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+KCksIF9fYSkKKwl7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwKKwkgICBjbGFzcyBfSGFzaCA9IGhhc2g8X0tleT4sCisJICAgY2xhc3MgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9LZXk+LAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4sCisJICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZSA9IGZhbHNlPgorICAgIGNsYXNzIF9fdW5vcmRlcmVkX211bHRpbWFwCisgICAgOiBwdWJsaWMgX0hhc2h0YWJsZTxfS2V5LCBzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiwKKwkJCV9BbGxvYywKKwkJCXN0ZDo6X1NlbGVjdDFzdDxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+LCBfUHJlZCwKKwkJCV9IYXNoLCBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nLAorCQkJX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoLAorCQkJX19kZXRhaWw6Ol9QcmltZV9yZWhhc2hfcG9saWN5LAorCQkJX19jYWNoZV9oYXNoX2NvZGUsIGZhbHNlLCBmYWxzZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9IYXNodGFibGU8X0tleSwgc3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4sCisJCQkgX0FsbG9jLAorCQkJIHN0ZDo6X1NlbGVjdDFzdDxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+LCBfUHJlZCwKKwkJCSBfSGFzaCwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZywKKwkJCSBfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2gsCisJCQkgX19kZXRhaWw6Ol9QcmltZV9yZWhhc2hfcG9saWN5LAorCQkJIF9fY2FjaGVfaGFzaF9jb2RlLCBmYWxzZSwgZmFsc2U+CisJX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aGFzaGVyICAgICAgICAgIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV9lcXVhbCAgICAgICBrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX3Vub3JkZXJlZF9tdWx0aW1hcChzaXplX3R5cGUgX19uID0gMTAsCisJCQkgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9faGYsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcoKSwKKwkgICAgICBfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2goKSwKKwkgICAgICBfX2VxbCwgc3RkOjpfU2VsZWN0MXN0PHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4oKSwgX19hKQorICAgICAgeyB9CisKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJX191bm9yZGVyZWRfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCQkgICAgIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgX19uID0gMCwKKwkJCSAgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2YsIF9fbCwgX19uLCBfX2hmLCBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nKCksCisJCV9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCgpLAorCQlfX2VxbCwgc3RkOjpfU2VsZWN0MXN0PHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4oKSwgX19hKQorCXsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYywKKwkgICBib29sIF9fY2FjaGVfaGFzaF9jb2RlPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfX3Vub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsCisJIF9BbGxvYywgX19jYWNoZV9oYXNoX2NvZGU+JiBfX3gsCisJIF9fdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwKKwkgX0FsbG9jLCBfX2NhY2hlX2hhc2hfY29kZT4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jLAorCSAgIGJvb2wgX19jYWNoZV9oYXNoX2NvZGU+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKF9fdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLAorCSBfQWxsb2MsIF9fY2FjaGVfaGFzaF9jb2RlPiYgX194LAorCSBfX3Vub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwKKwkgX0FsbG9jLCBfX2NhY2hlX2hhc2hfY29kZT4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmIEEgc3RhbmRhcmQgY29udGFpbmVyIGNvbXBvc2VkIG9mIHVuaXF1ZSBrZXlzIChjb250YWluaW5nCisgICAqICBhdCBtb3N0IG9uZSBvZiBlYWNoIGtleSB2YWx1ZSkgdGhhdCBhc3NvY2lhdGVzIHZhbHVlcyBvZiBhbm90aGVyIHR5cGUKKyAgICogIHdpdGggdGhlIGtleXMuCisgICAqCisgICAqICBAaW5ncm91cCB1bm9yZGVyZWRfYXNzb2NpYXRpdmVfY29udGFpbmVycworICAgKgorICAgKiAgTWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LCBhbmQKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sI3h4Ij51bm9yZGVyZWQgYXNzb2NpYXRpdmUgY29udGFpbmVyPC9hPgorICAgKgorICAgKiAgQHBhcmFtICBLZXkgIFR5cGUgb2Yga2V5IG9iamVjdHMuCisgICAqICBAcGFyYW0gIFRwICBUeXBlIG9mIG1hcHBlZCBvYmplY3RzLgorICAgKiAgQHBhcmFtICBIYXNoICBIYXNoaW5nIGZ1bmN0aW9uIG9iamVjdCB0eXBlLCBkZWZhdWx0cyB0byBoYXNoPFZhbHVlPi4KKyAgICogIEBwYXJhbSAgUHJlZCAgUHJlZGljYXRlIGZ1bmN0aW9uIG9iamVjdCB0eXBlLCBkZWZhdWx0cyB0byBlcXVhbF90bzxWYWx1ZT4uCisgICAqICBAcGFyYW0gIEFsbG9jICBBbGxvY2F0b3IgdHlwZSwgZGVmYXVsdHMgdG8gYWxsb2NhdG9yPEtleT4uCisgICAqCisgICAqIFRoZSByZXN1bHRpbmcgdmFsdWUgdHlwZSBvZiB0aGUgY29udGFpbmVyIGlzIHN0ZDo6cGFpcjxjb25zdCBLZXksIFRwPi4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwKKwkgICBjbGFzcyBfSGFzaCA9IGhhc2g8X0tleT4sCisJICAgY2xhc3MgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9LZXk+LAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4gPgorICAgIGNsYXNzIHVub3JkZXJlZF9tYXAKKyAgICA6IHB1YmxpYyBfX3Vub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4KKyAgICB7CisgICAgICB0eXBlZGVmIF9fdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiAgX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHVub3JkZXJlZF9tYXAoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXVub3JkZXJlZF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCSAgICAgIHNpemVfdHlwZSBfX24gPSAxMCwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2YsIF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKQorCXsgfQorICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgY29tcG9zZWQgb2YgZXF1aXZhbGVudCBrZXlzCisgICAqICAocG9zc2libHkgY29udGFpbmluZyBtdWx0aXBsZSBvZiBlYWNoIGtleSB2YWx1ZSkgdGhhdCBhc3NvY2lhdGVzCisgICAqICB2YWx1ZXMgb2YgYW5vdGhlciB0eXBlIHdpdGggdGhlIGtleXMuCisgICAqCisgICAqICBAaW5ncm91cCB1bm9yZGVyZWRfYXNzb2NpYXRpdmVfY29udGFpbmVycworICAgKgorICAgKiAgTWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LCBhbmQKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sI3h4Ij51bm9yZGVyZWQgYXNzb2NpYXRpdmUgY29udGFpbmVyPC9hPgorICAgKgorICAgKiAgQHBhcmFtICBLZXkgIFR5cGUgb2Yga2V5IG9iamVjdHMuCisgICAqICBAcGFyYW0gIFRwICBUeXBlIG9mIG1hcHBlZCBvYmplY3RzLgorICAgKiAgQHBhcmFtICBIYXNoICBIYXNoaW5nIGZ1bmN0aW9uIG9iamVjdCB0eXBlLCBkZWZhdWx0cyB0byBoYXNoPFZhbHVlPi4KKyAgICogIEBwYXJhbSAgUHJlZCAgUHJlZGljYXRlIGZ1bmN0aW9uIG9iamVjdCB0eXBlLCBkZWZhdWx0cyB0byBlcXVhbF90bzxWYWx1ZT4uCisgICAqICBAcGFyYW0gIEFsbG9jICBBbGxvY2F0b3IgdHlwZSwgZGVmYXVsdHMgdG8gYWxsb2NhdG9yPEtleT4uCisgICAqCisgICAqIFRoZSByZXN1bHRpbmcgdmFsdWUgdHlwZSBvZiB0aGUgY29udGFpbmVyIGlzIHN0ZDo6cGFpcjxjb25zdCBLZXksIFRwPi4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwKKwkgICBjbGFzcyBfSGFzaCA9IGhhc2g8X0tleT4sCisJICAgY2xhc3MgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9LZXk+LAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4gPgorICAgIGNsYXNzIHVub3JkZXJlZF9tdWx0aW1hcAorICAgIDogcHVibGljIF9fdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+CisgICAgeworICAgICAgdHlwZWRlZiBfX3Vub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiAgX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcChzaXplX3R5cGUgX19uID0gMTAsCisJCQkgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7IH0KKworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwl1bm9yZGVyZWRfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCQkgICB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlIF9fbiA9IDAsCisJCQkgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19mLCBfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKwl7IH0KKworICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJIHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3Vub3JkZXJlZF9zZXQgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS91bm9yZGVyZWRfc2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NjhhNjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS91bm9yZGVyZWRfc2V0CkBAIC0wLDAgKzEsNDQgQEAKKy8vIFRSMSB1bm9yZGVyZWRfc2V0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvdW5vcmRlcmVkX3NldAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9VTk9SREVSRURfU0VUCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9VTk9SREVSRURfU0VUIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPgorI2luY2x1ZGUgPGJpdHMvYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfZnVuY3Rpb24uaD4gLy8gZXF1YWxfdG8sIF9JZGVudGl0eSwgX1NlbGVjdDFzdAorI2luY2x1ZGUgPGJpdHMvc3RyaW5nZndkLmg+CisjaW5jbHVkZSA8dHIxL3R5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsX2hhc2guaD4KKyNpbmNsdWRlIDx0cjEvaGFzaHRhYmxlLmg+CisjaW5jbHVkZSA8dHIxL3Vub3JkZXJlZF9zZXQuaD4KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9VTk9SREVSRURfU0VUCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS91bm9yZGVyZWRfc2V0LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS91bm9yZGVyZWRfc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY3MTJlNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3Vub3JkZXJlZF9zZXQuaApAQCAtMCwwICsxLDI2NyBAQAorLy8gVFIxIHVub3JkZXJlZF9zZXQgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS91bm9yZGVyZWRfc2V0LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt0cjEvdW5vcmRlcmVkX3NldH0KKyAqLworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gTkI6IFdoZW4gd2UgZ2V0IHR5cGVkZWYgdGVtcGxhdGVzIHRoZXNlIGNsYXNzIGRlZmluaXRpb25zCisgIC8vIHdpbGwgYmUgdW5uZWNlc3NhcnkuCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwKKwkgICBjbGFzcyBfSGFzaCA9IGhhc2g8X1ZhbHVlPiwKKwkgICBjbGFzcyBfUHJlZCA9IHN0ZDo6ZXF1YWxfdG88X1ZhbHVlPiwKKwkgICBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfVmFsdWU+LAorCSAgIGJvb2wgX19jYWNoZV9oYXNoX2NvZGUgPSBmYWxzZT4KKyAgICBjbGFzcyBfX3Vub3JkZXJlZF9zZXQKKyAgICA6IHB1YmxpYyBfSGFzaHRhYmxlPF9WYWx1ZSwgX1ZhbHVlLCBfQWxsb2MsCisJCQlzdGQ6Ol9JZGVudGl0eTxfVmFsdWU+LCBfUHJlZCwKKwkJCV9IYXNoLCBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nLAorCQkJX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoLAorCQkJX19kZXRhaWw6Ol9QcmltZV9yZWhhc2hfcG9saWN5LAorCQkJX19jYWNoZV9oYXNoX2NvZGUsIHRydWUsIHRydWU+CisgICAgeworICAgICAgdHlwZWRlZiBfSGFzaHRhYmxlPF9WYWx1ZSwgX1ZhbHVlLCBfQWxsb2MsCisJCQkgc3RkOjpfSWRlbnRpdHk8X1ZhbHVlPiwgX1ByZWQsCisJCQkgX0hhc2gsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcsCisJCQkgX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoLAorCQkJIF9fZGV0YWlsOjpfUHJpbWVfcmVoYXNoX3BvbGljeSwKKwkJCSBfX2NhY2hlX2hhc2hfY29kZSwgdHJ1ZSwgdHJ1ZT4KKwlfQmFzZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIF9fdW5vcmRlcmVkX3NldChzaXplX3R5cGUgX19uID0gMTAsCisJCSAgICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9faGYsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcoKSwKKwkgICAgICBfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2goKSwgX19lcWwsCisJICAgICAgc3RkOjpfSWRlbnRpdHk8X1ZhbHVlPigpLCBfX2EpCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJX191bm9yZGVyZWRfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorCQkJc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkJY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQljb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQljb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9CYXNlKF9fZiwgX19sLCBfX24sIF9faGYsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcoKSwKKwkJX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoKCksIF9fZXFsLAorCQlzdGQ6Ol9JZGVudGl0eTxfVmFsdWU+KCksIF9fYSkKKwl7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwKKwkgICBjbGFzcyBfSGFzaCA9IGhhc2g8X1ZhbHVlPiwKKwkgICBjbGFzcyBfUHJlZCA9IHN0ZDo6ZXF1YWxfdG88X1ZhbHVlPiwKKwkgICBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfVmFsdWU+LAorCSAgIGJvb2wgX19jYWNoZV9oYXNoX2NvZGUgPSBmYWxzZT4KKyAgICBjbGFzcyBfX3Vub3JkZXJlZF9tdWx0aXNldAorICAgIDogcHVibGljIF9IYXNodGFibGU8X1ZhbHVlLCBfVmFsdWUsIF9BbGxvYywKKwkJCXN0ZDo6X0lkZW50aXR5PF9WYWx1ZT4sIF9QcmVkLAorCQkJX0hhc2gsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcsCisJCQlfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2gsCisJCQlfX2RldGFpbDo6X1ByaW1lX3JlaGFzaF9wb2xpY3ksCisJCQlfX2NhY2hlX2hhc2hfY29kZSwgdHJ1ZSwgZmFsc2U+CisgICAgeworICAgICAgdHlwZWRlZiBfSGFzaHRhYmxlPF9WYWx1ZSwgX1ZhbHVlLCBfQWxsb2MsCisJCQkgc3RkOjpfSWRlbnRpdHk8X1ZhbHVlPiwgX1ByZWQsCisJCQkgX0hhc2gsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcsCisJCQkgX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoLAorCQkJIF9fZGV0YWlsOjpfUHJpbWVfcmVoYXNoX3BvbGljeSwKKwkJCSBfX2NhY2hlX2hhc2hfY29kZSwgdHJ1ZSwgZmFsc2U+CisJX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aGFzaGVyICAgICAgICAgIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV9lcXVhbCAgICAgICBrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX3Vub3JkZXJlZF9tdWx0aXNldChzaXplX3R5cGUgX19uID0gMTAsCisJCQkgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9faGYsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcoKSwKKwkgICAgICBfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2goKSwgX19lcWwsCisJICAgICAgc3RkOjpfSWRlbnRpdHk8X1ZhbHVlPigpLCBfX2EpCisgICAgICB7IH0KKworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwlfX3Vub3JkZXJlZF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKwkJCSAgICAgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSBfX24gPSAwLAorCQkJICAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9CYXNlKF9fZiwgX19sLCBfX24sIF9faGYsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcoKSwKKwkJX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoKCksIF9fZXFsLAorCQlzdGQ6Ol9JZGVudGl0eTxfVmFsdWU+KCksIF9fYSkKKwl7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2MsCisJICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoX191bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2MsIF9fY2FjaGVfaGFzaF9jb2RlPiYgX194LAorCSBfX3Vub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYywgX19jYWNoZV9oYXNoX2NvZGU+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYywKKwkgICBib29sIF9fY2FjaGVfaGFzaF9jb2RlPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfX3Vub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwKKwkgX0FsbG9jLCBfX2NhY2hlX2hhc2hfY29kZT4mIF9feCwKKwkgX191bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsCisJIF9BbGxvYywgX19jYWNoZV9oYXNoX2NvZGU+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKworICAvKioKKyAgICogIEBicmllZiBBIHN0YW5kYXJkIGNvbnRhaW5lciBjb21wb3NlZCBvZiB1bmlxdWUga2V5cyAoY29udGFpbmluZworICAgKiAgYXQgbW9zdCBvbmUgb2YgZWFjaCBrZXkgdmFsdWUpIGluIHdoaWNoIHRoZSBlbGVtZW50cycga2V5cyBhcmUKKyAgICogIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzLgorICAgKgorICAgKiAgQGluZ3JvdXAgdW5vcmRlcmVkX2Fzc29jaWF0aXZlX2NvbnRhaW5lcnMKKyAgICoKKyAgICogIE1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgYSA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPiwgYW5kCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCN4eCI+dW5vcmRlcmVkIGFzc29jaWF0aXZlIGNvbnRhaW5lcjwvYT4KKyAgICoKKyAgICogIEBwYXJhbSAgVmFsdWUgIFR5cGUgb2Yga2V5IG9iamVjdHMuCisgICAqICBAcGFyYW0gIEhhc2ggIEhhc2hpbmcgZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzIHRvIGhhc2g8VmFsdWU+LgorICAgKiAgQHBhcmFtICBQcmVkICBQcmVkaWNhdGUgZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzIHRvIGVxdWFsX3RvPFZhbHVlPi4KKyAgICogIEBwYXJhbSAgQWxsb2MgIEFsbG9jYXRvciB0eXBlLCBkZWZhdWx0cyB0byBhbGxvY2F0b3I8S2V5Pi4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwKKwkgICBjbGFzcyBfSGFzaCA9IGhhc2g8X1ZhbHVlPiwKKwkgICBjbGFzcyBfUHJlZCA9IHN0ZDo6ZXF1YWxfdG88X1ZhbHVlPiwKKwkgICBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfVmFsdWU+ID4KKyAgICBjbGFzcyB1bm9yZGVyZWRfc2V0CisgICAgOiBwdWJsaWMgX191bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+CisgICAgeworICAgICAgdHlwZWRlZiBfX3Vub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4gIF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aGFzaGVyICAgICAgICAgIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV9lcXVhbCAgICAgICBrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB1bm9yZGVyZWRfc2V0KHNpemVfdHlwZSBfX24gPSAxMCwKKwkJICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwl1bm9yZGVyZWRfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorCQkgICAgICBzaXplX3R5cGUgX19uID0gMTAsCisJCSAgICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19mLCBfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKwl7IH0KKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIEEgc3RhbmRhcmQgY29udGFpbmVyIGNvbXBvc2VkIG9mIGVxdWl2YWxlbnQga2V5cworICAgKiAgKHBvc3NpYmx5IGNvbnRhaW5pbmcgbXVsdGlwbGUgb2YgZWFjaCBrZXkgdmFsdWUpIGluIHdoaWNoIHRoZQorICAgKiAgZWxlbWVudHMnIGtleXMgYXJlIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzLgorICAgKgorICAgKiAgQGluZ3JvdXAgdW5vcmRlcmVkX2Fzc29jaWF0aXZlX2NvbnRhaW5lcnMKKyAgICoKKyAgICogIE1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgYSA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPiwgYW5kCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCN4eCI+dW5vcmRlcmVkIGFzc29jaWF0aXZlIGNvbnRhaW5lcjwvYT4KKyAgICoKKyAgICogIEBwYXJhbSAgVmFsdWUgIFR5cGUgb2Yga2V5IG9iamVjdHMuCisgICAqICBAcGFyYW0gIEhhc2ggIEhhc2hpbmcgZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzIHRvIGhhc2g8VmFsdWU+LgorICAgKiAgQHBhcmFtICBQcmVkICBQcmVkaWNhdGUgZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzIHRvIGVxdWFsX3RvPFZhbHVlPi4KKyAgICogIEBwYXJhbSAgQWxsb2MgIEFsbG9jYXRvciB0eXBlLCBkZWZhdWx0cyB0byBhbGxvY2F0b3I8S2V5Pi4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwKKwkgICBjbGFzcyBfSGFzaCA9IGhhc2g8X1ZhbHVlPiwKKwkgICBjbGFzcyBfUHJlZCA9IHN0ZDo6ZXF1YWxfdG88X1ZhbHVlPiwKKwkgICBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfVmFsdWU+ID4KKyAgICBjbGFzcyB1bm9yZGVyZWRfbXVsdGlzZXQKKyAgICA6IHB1YmxpYyBfX3Vub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX191bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4gIF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aGFzaGVyICAgICAgICAgIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV9lcXVhbCAgICAgICBrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkJIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJdW5vcmRlcmVkX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorCQkJICAgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSBfX24gPSAwLAorCQkJICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9CYXNlKF9fZiwgX19sLCBfX24sIF9faGYsIF9fZXFsLCBfX2EpCisJeyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJIHVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvdXRpbGl0eSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3V0aWxpdHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyZDJkNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3V0aWxpdHkKQEAgLTAsMCArMSwxMDggQEAKKy8vIFRSMSB1dGlsaXR5IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvdXRpbGl0eQorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9VVElMSVRZCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9VVElMSVRZIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9yZWxvcHMuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9wYWlyLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgY2xhc3MgdHVwbGVfc2l6ZTsKKworICB0ZW1wbGF0ZTxpbnQgX0ludCwgY2xhc3MgX1RwPgorICAgIGNsYXNzIHR1cGxlX2VsZW1lbnQ7CisKKyAgIC8vIFZhcmlvdXMgZnVuY3Rpb25zIHdoaWNoIGdpdmUgc3RkOjpwYWlyIGEgdHVwbGUtbGlrZSBpbnRlcmZhY2UuCisgIHRlbXBsYXRlPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CisgICAgc3RydWN0IHR1cGxlX3NpemU8c3RkOjpwYWlyPF9UcDEsIF9UcDI+ID4KKyAgICB7IHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAyOyB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CisgICAgY29uc3QgaW50CisgICAgdHVwbGVfc2l6ZTxzdGQ6OnBhaXI8X1RwMSwgX1RwMj4gPjo6dmFsdWU7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KKyAgICBzdHJ1Y3QgdHVwbGVfZWxlbWVudDwwLCBzdGQ6OnBhaXI8X1RwMSwgX1RwMj4gPgorICAgIHsgdHlwZWRlZiBfVHAxIHR5cGU7IH07CisgCisgIHRlbXBsYXRlPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ8MSwgc3RkOjpwYWlyPF9UcDEsIF9UcDI+ID4KKyAgICB7IHR5cGVkZWYgX1RwMiB0eXBlOyB9OworCisgIHRlbXBsYXRlPGludCBfSW50PgorICAgIHN0cnVjdCBfX3BhaXJfZ2V0OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19wYWlyX2dldDwwPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgICBzdGF0aWMgX1RwMSYgX19nZXQoc3RkOjpwYWlyPF9UcDEsIF9UcDI+JiBfX3BhaXIpCisgICAgICB7IHJldHVybiBfX3BhaXIuZmlyc3Q7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICAgIHN0YXRpYyBjb25zdCBfVHAxJiBfX2NvbnN0X2dldChjb25zdCBzdGQ6OnBhaXI8X1RwMSwgX1RwMj4mIF9fcGFpcikKKyAgICAgIHsgcmV0dXJuIF9fcGFpci5maXJzdDsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3BhaXJfZ2V0PDE+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICAgIHN0YXRpYyBfVHAyJiBfX2dldChzdGQ6OnBhaXI8X1RwMSwgX1RwMj4mIF9fcGFpcikKKyAgICAgIHsgcmV0dXJuIF9fcGFpci5zZWNvbmQ7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICAgIHN0YXRpYyBjb25zdCBfVHAyJiBfX2NvbnN0X2dldChjb25zdCBzdGQ6OnBhaXI8X1RwMSwgX1RwMj4mIF9fcGFpcikKKyAgICAgIHsgcmV0dXJuIF9fcGFpci5zZWNvbmQ7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGludCBfSW50LCBjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorICAgIGlubGluZSB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9JbnQsIHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiA+Ojp0eXBlJgorICAgIGdldChzdGQ6OnBhaXI8X1RwMSwgX1RwMj4mIF9faW4pCisgICAgeyByZXR1cm4gX19wYWlyX2dldDxfSW50Pjo6X19nZXQoX19pbik7IH0KKworICB0ZW1wbGF0ZTxpbnQgX0ludCwgY2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KKyAgICBpbmxpbmUgY29uc3QgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfSW50LCBzdGQ6OnBhaXI8X1RwMSwgX1RwMj4gPjo6dHlwZSYKKyAgICBnZXQoY29uc3Qgc3RkOjpwYWlyPF9UcDEsIF9UcDI+JiBfX2luKQorICAgIHsgcmV0dXJuIF9fcGFpcl9nZXQ8X0ludD46Ol9fY29uc3RfZ2V0KF9faW4pOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX1VUSUxJVFkKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIxL3djaGFyLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS93Y2hhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMTZhODUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS93Y2hhci5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIFRSMSB3Y2hhci5oIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvd2NoYXIuaAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9XQ0hBUl9ICisjZGVmaW5lIF9HTElCQ1hYX1RSMV9XQ0hBUl9IIDEKKworI2luY2x1ZGUgPHRyMS9jd2NoYXI+CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfV0NIQVJfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvd2N0eXBlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMS93Y3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTY4YTEzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjEvd2N0eXBlLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIHdjdHlwZS5oIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvd2N0eXBlLmgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfV0NUWVBFX0gKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX1dDVFlQRV9IIDEKKworI2luY2x1ZGUgPHRyMS9jd2N0eXBlPgorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX1dDVFlQRV9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMi9ib29sX3NldCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIyL2Jvb2xfc2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YTU2ZTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMi9ib29sX3NldApAQCAtMCwwICsxLDMyMCBAQAorLy8gVFIyIDxib29sX3NldD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMi9ib29sX3NldAorICogIFRoaXMgaXMgYSBUUjIgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIyX0JPT0xfU0VUCisjZGVmaW5lIF9HTElCQ1hYX1RSMl9CT09MX1NFVCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPHR5cGVpbmZvPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjIKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBib29sX3NldAorICAgKgorICAgKiAgU2VlIE4yMTM2LCBCb29sX3NldDogbXVsdGktdmFsdWVkIGxvZ2ljCisgICAqICBieSBIZXJ26SBCcvZubmltYW5uLCBHdWlsbGF1bWUgTWVscXVpb25kLCBTeWx2YWluIFBpb24uCisgICAqCisgICAqICBUaGUgaW1wbGljaXQgY29udmVyc2lvbiB0byBib29sIGlzIHNsaXBwZXJ5ISAgSSBtYXkgdXNlIHRoZSBuZXcKKyAgICogIGV4cGxpY2l0IGNvbnZlcnNpb24uICBUaGlzIGhhcyBiZWVuIHNwZWNpYWxpemVkIGluIHRoZSBsYW5ndWFnZQorICAgKiAgc28gdGhhdCBpbiBjb250ZXh0cyByZXF1aXJpbmcgYSBib29sIHRoZSBjb252ZXJzaW9uIGhhcHBlbnMKKyAgICogIGltcGxpY2l0bHkuICBUaHVzIG1vc3Qgb2JqZWN0aW9ucyBzaG91bGQgYmUgZWxpbWluYXRlZC4KKyAgICovCisgIGNsYXNzIGJvb2xfc2V0CisgIHsKKyAgcHVibGljOgorCisgICAgLy8vICBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIGNvbnN0ZXhwciBib29sX3NldCgpIDogX01fYihfU19mYWxzZSkgeyB9CisKKyAgICAvLy8gIENvbnN0cnVjdG9yIGZyb20gYm9vbC4KKyAgICBjb25zdGV4cHIgYm9vbF9zZXQoYm9vbCBfX3QpIDogX01fYihfQm9vbF9zZXRfdmFsKF9fdCkpIHsgfQorCisgICAgLy8gSSdtIG5vdCBzdXJlIGFib3V0IHRoaXMuCisgICAgYm9vbCBjb250YWlucyhib29sX3NldCBfX2IpIGNvbnN0CisgICAgeyByZXR1cm4gdGhpcy0+aXNfc2luZ2xldG9uKCkgJiYgdGhpcy0+ZXF1YWxzKF9fYik7IH0KKworICAgIC8vLyAgUmV0dXJuIHRydWUgaWYgc3RhdGVzIGFyZSBlcXVhbC4KKyAgICBib29sIGVxdWFscyhib29sX3NldCBfX2IpIGNvbnN0CisgICAgeyByZXR1cm4gX19iLl9NX2IgPT0gX01fYjsgfQorCisgICAgLy8vICBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGVtcHR5LgorICAgIGJvb2wgaXNfZW1wdHlzZXQoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX2IgPT0gX1NfZW1wdHk7IH0KKworICAgIC8vLyAgUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBpbmRldGVybWluYXRlLgorICAgIGJvb2wgaXNfaW5kZXRlcm1pbmF0ZSgpIGNvbnN0CisgICAgeyByZXR1cm4gX01fYiA9PSBfU19pbmRldDsgfQorCisgICAgLy8vICBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGZhbHNlIG9yIHRydWUgKG5vcm1hbCBib29sZWFuKS4KKyAgICBib29sIGlzX3NpbmdsZXRvbigpIGNvbnN0CisgICAgeyByZXR1cm4gX01fYiA9PSBfU19mYWxzZSB8fCBfTV9iID09IF9TX3RydWVfOyB9CisKKyAgICAvLy8gIENvbnZlcnNpb24gdG8gYm9vbC4KKyAgICAvL2V4cGxpY2l0CisgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0CisgICAgeworICAgICAgaWYgKCEgaXNfc2luZ2xldG9uKCkpCisJdGhyb3cgc3RkOjpiYWRfY2FzdCgpOworICAgICAgcmV0dXJuIF9NX2I7CisgICAgfQorCisgICAgLy8vCisgICAgc3RhdGljIGJvb2xfc2V0IGluZGV0ZXJtaW5hdGUoKQorICAgIHsKKyAgICAgIGJvb2xfc2V0IF9fYjsKKyAgICAgIF9fYi5fTV9iID0gX1NfaW5kZXQ7CisgICAgICByZXR1cm4gX19iOworICAgIH0KKworICAgIC8vLworICAgIHN0YXRpYyBib29sX3NldCBlbXB0eXNldCgpCisgICAgeworICAgICAgYm9vbF9zZXQgX19iOworICAgICAgX19iLl9NX2IgPSBfU19lbXB0eTsKKyAgICAgIHJldHVybiBfX2I7CisgICAgfQorCisgICAgZnJpZW5kIGJvb2xfc2V0CisgICAgb3BlcmF0b3IhKGJvb2xfc2V0IF9fYikKKyAgICB7IHJldHVybiBfX2IuX01fbm90KCk7IH0KKworICAgIGZyaWVuZCBib29sX3NldAorICAgIG9wZXJhdG9yXihib29sX3NldCBfX3MsIGJvb2xfc2V0IF9fdCkKKyAgICB7IHJldHVybiBfX3MuX01feG9yKF9fdCk7IH0KKworICAgIGZyaWVuZCBib29sX3NldAorICAgIG9wZXJhdG9yfChib29sX3NldCBfX3MsIGJvb2xfc2V0IF9fdCkKKyAgICB7IHJldHVybiBfX3MuX01fb3IoX190KTsgfQorCisgICAgZnJpZW5kIGJvb2xfc2V0CisgICAgb3BlcmF0b3ImKGJvb2xfc2V0IF9fcywgYm9vbF9zZXQgX190KQorICAgIHsgcmV0dXJuIF9fcy5fTV9hbmQoX190KTsgfQorCisgICAgZnJpZW5kIGJvb2xfc2V0CisgICAgb3BlcmF0b3I9PShib29sX3NldCBfX3MsIGJvb2xfc2V0IF9fdCkKKyAgICB7IHJldHVybiBfX3MuX01fZXEoX190KTsgfQorCisKKyAgICAvLyAgVGhlc2Ugb3ZlcmxvYWRzIHJlcGxhY2UgdGhlIGZhY2V0IGFkZGl0aW9ucyBpbiB0aGUgcGFwZXIhCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyVCwgdHlwZW5hbWUgVHJhaXRzPgorICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyVCwgVHJhaXRzPiYKKyAgICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPENoYXJULCBUcmFpdHM+JiBfX291dCwgYm9vbF9zZXQgX19iKQorICAgICAgeworCWludCBfX2EgPSBfX2IuX01fYjsKKwlfX291dCA8PCBfX2E7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyVCwgdHlwZW5hbWUgVHJhaXRzPgorICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxDaGFyVCwgVHJhaXRzPiYKKyAgICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPENoYXJULCBUcmFpdHM+JiBfX2luLCBib29sX3NldCYgX19iKQorICAgICAgeworCWxvbmcgX19jOworCV9faW4gPj4gX19jOworCWlmIChfX2MgPj0gX1NfZmFsc2UgJiYgX19jIDwgX1NfZW1wdHkpCisJICBfX2IuX01fYiA9IHN0YXRpY19jYXN0PF9Cb29sX3NldF92YWw+KF9fYyk7CisgICAgICB9CisKKyAgcHJpdmF0ZToKKworICAgIC8vLworICAgIGVudW0gX0Jvb2xfc2V0X3ZhbDogdW5zaWduZWQgY2hhcgorICAgIHsKKyAgICAgIF9TX2ZhbHNlID0gMCwKKyAgICAgIF9TX3RydWVfID0gMSwKKyAgICAgIF9TX2luZGV0ID0gMiwKKyAgICAgIF9TX2VtcHR5ID0gMworICAgIH07CisKKyAgICAvLy8gIEJvb2wgc2V0IHN0YXRlLgorICAgIF9Cb29sX3NldF92YWwgX01fYjsKKworICAgIC8vLworICAgIGJvb2xfc2V0KF9Cb29sX3NldF92YWwgX19jKSA6IF9NX2IoX19jKSB7IH0KKworICAgIC8vLworICAgIGJvb2xfc2V0IF9NX25vdCgpIGNvbnN0CisgICAgeyByZXR1cm4gX1Nfbm90W3RoaXMtPl9NX2JdOyB9CisKKyAgICAvLy8KKyAgICBib29sX3NldCBfTV94b3IoYm9vbF9zZXQgX19iKSBjb25zdAorICAgIHsgcmV0dXJuIF9TX3hvclt0aGlzLT5fTV9iXVtfX2IuX01fYl07IH0KKworICAgIC8vLworICAgIGJvb2xfc2V0IF9NX29yKGJvb2xfc2V0IF9fYikgY29uc3QKKyAgICB7IHJldHVybiBfU19vclt0aGlzLT5fTV9iXVtfX2IuX01fYl07IH0KKworICAgIC8vLworICAgIGJvb2xfc2V0IF9NX2FuZChib29sX3NldCBfX2IpIGNvbnN0CisgICAgeyByZXR1cm4gX1NfYW5kW3RoaXMtPl9NX2JdW19fYi5fTV9iXTsgfQorCisgICAgLy8vCisgICAgYm9vbF9zZXQgX01fZXEoYm9vbF9zZXQgX19iKSBjb25zdAorICAgIHsgcmV0dXJuIF9TX2VxW3RoaXMtPl9NX2JdW19fYi5fTV9iXTsgfQorCisgICAgLy8vCisgICAgc3RhdGljIF9Cb29sX3NldF92YWwgX1Nfbm90WzRdOworCisgICAgLy8vCisgICAgc3RhdGljIF9Cb29sX3NldF92YWwgX1NfeG9yWzRdWzRdOworCisgICAgLy8vCisgICAgc3RhdGljIF9Cb29sX3NldF92YWwgX1Nfb3JbNF1bNF07CisKKyAgICAvLy8KKyAgICBzdGF0aWMgX0Jvb2xfc2V0X3ZhbCBfU19hbmRbNF1bNF07CisKKyAgICAvLy8KKyAgICBzdGF0aWMgX0Jvb2xfc2V0X3ZhbCBfU19lcVs0XVs0XTsKKyAgfTsKKworICAvLyAgMjAuMi4zLjIgYm9vbF9zZXQgdmFsdWVzCisKKyAgaW5saW5lIGJvb2wKKyAgY29udGFpbnMoYm9vbF9zZXQgX19zLCBib29sX3NldCBfX3QpCisgIHsgcmV0dXJuIF9fcy5jb250YWlucyhfX3QpOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgZXF1YWxzKGJvb2xfc2V0IF9fcywgYm9vbF9zZXQgX190KQorICB7IHJldHVybiBfX3MuZXF1YWxzKF9fdCk7IH0KKworICBpbmxpbmUgYm9vbAorICBpc19lbXB0eXNldChib29sX3NldCBfX2IpCisgIHsgcmV0dXJuIF9fYi5pc19lbXB0eXNldCgpOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgaXNfaW5kZXRlcm1pbmF0ZShib29sX3NldCBfX2IpCisgIHsgcmV0dXJuIF9fYi5pc19pbmRldGVybWluYXRlKCk7IH0KKworICBpbmxpbmUgYm9vbAorICBpc19zaW5nbGV0b24oYm9vbF9zZXQgX19iKQorICB7IHJldHVybiBfX2IuaXNfc2luZ2xldG9uKCk7IH0KKworICBpbmxpbmUgYm9vbAorICBjZXJ0YWlubHkoYm9vbF9zZXQgX19iKQorICB7IHJldHVybiAhIF9fYi5jb250YWlucyhmYWxzZSk7IH0KKworICBpbmxpbmUgYm9vbAorICBwb3NzaWJseShib29sX3NldCBfX2IpCisgIHsgcmV0dXJuIF9fYi5jb250YWlucyh0cnVlKTsgfQorCisKKyAgLy8gIDIwLjIuMy4zIGJvb2xfc2V0IHNldCBvcGVyYXRpb25zCisKKyAgaW5saW5lIGJvb2xfc2V0CisgIHNldF91bmlvbihib29sIF9fcywgYm9vbF9zZXQgX190KQorICB7IHJldHVybiBib29sX3NldChfX3MpIHwgX190OyB9CisKKyAgaW5saW5lIGJvb2xfc2V0CisgIHNldF91bmlvbihib29sX3NldCBfX3MsIGJvb2wgX190KQorICB7IHJldHVybiBfX3MgfCBib29sX3NldChfX3QpOyB9CisKKyAgaW5saW5lIGJvb2xfc2V0CisgIHNldF91bmlvbihib29sX3NldCBfX3MsIGJvb2xfc2V0IF9fdCkKKyAgeyByZXR1cm4gX19zIHwgX190OyB9CisKKyAgaW5saW5lIGJvb2xfc2V0CisgIHNldF9pbnRlcnNlY3Rpb24oYm9vbCBfX3MsIGJvb2xfc2V0IF9fdCkKKyAgeyByZXR1cm4gYm9vbF9zZXQoX19zKSAmIF9fdDsgfQorCisgIGlubGluZSBib29sX3NldAorICBzZXRfaW50ZXJzZWN0aW9uKGJvb2xfc2V0IF9fcywgYm9vbCBfX3QpCisgIHsgcmV0dXJuIF9fcyAmIGJvb2xfc2V0KF9fdCk7IH0KKworICBpbmxpbmUgYm9vbF9zZXQKKyAgc2V0X2ludGVyc2VjdGlvbihib29sX3NldCBfX3MsIGJvb2xfc2V0IF9fdCkKKyAgeyByZXR1cm4gX19zICYgX190OyB9CisKKyAgaW5saW5lIGJvb2xfc2V0CisgIHNldF9jb21wbGVtZW50KGJvb2xfc2V0IF9fYikKKyAgeyByZXR1cm4gISBfX2I7IH0KKworCisgIC8vICAyMC4yLjMuNCBib29sX3NldCBsb2dpY2FsIG9wZXJhdG9ycworCisgIGlubGluZSBib29sX3NldAorICBvcGVyYXRvcl4oYm9vbCBfX3MsIGJvb2xfc2V0IF9fdCkKKyAgeyByZXR1cm4gYm9vbF9zZXQoX19zKSBeIF9fdDsgfQorCisgIGlubGluZSBib29sX3NldAorICBvcGVyYXRvcl4oYm9vbF9zZXQgX19zLCBib29sIF9fdCkKKyAgeyByZXR1cm4gX19zIF4gYm9vbF9zZXQoX190KTsgfQorCisgIGlubGluZSBib29sX3NldAorICBvcGVyYXRvcnwoYm9vbCBfX3MsIGJvb2xfc2V0IF9fdCkKKyAgeyByZXR1cm4gYm9vbF9zZXQoX19zKSB8IF9fdDsgfQorCisgIGlubGluZSBib29sX3NldAorICBvcGVyYXRvcnwoYm9vbF9zZXQgX19zLCBib29sIF9fdCkKKyAgeyByZXR1cm4gX19zIHwgYm9vbF9zZXQoX190KTsgfQorCisgIGlubGluZSBib29sX3NldAorICBvcGVyYXRvciYoYm9vbCBfX3MsIGJvb2xfc2V0IF9fdCkKKyAgeyByZXR1cm4gYm9vbF9zZXQoX19zKSAmIF9fdDsgfQorCisgIGlubGluZSBib29sX3NldAorICBvcGVyYXRvciYoYm9vbF9zZXQgX19zLCBib29sIF9fdCkKKyAgeyByZXR1cm4gX19zICYgYm9vbF9zZXQoX190KTsgfQorCisKKyAgLy8gIDIwLjIuMy41IGJvb2xfc2V0IHJlbGF0aW9uYWwgb3BlcmF0b3JzCisKKyAgaW5saW5lIGJvb2xfc2V0CisgIG9wZXJhdG9yPT0oYm9vbCBfX3MsIGJvb2xfc2V0IF9fdCkKKyAgeyByZXR1cm4gYm9vbF9zZXQoX19zKSA9PSBfX3Q7IH0KKworICBpbmxpbmUgYm9vbF9zZXQKKyAgb3BlcmF0b3I9PShib29sX3NldCBfX3MsIGJvb2wgX190KQorICB7IHJldHVybiBfX3MgPT0gYm9vbF9zZXQoX190KTsgfQorCisgIGlubGluZSBib29sX3NldAorICBvcGVyYXRvciE9KGJvb2wgX19zLCBib29sX3NldCBfX3QpCisgIHsgcmV0dXJuICEgKF9fcyA9PSBfX3QpOyB9CisKKyAgaW5saW5lIGJvb2xfc2V0CisgIG9wZXJhdG9yIT0oYm9vbF9zZXQgX19zLCBib29sIF9fdCkKKyAgeyByZXR1cm4gISAoX19zID09IF9fdCk7IH0KKworICBpbmxpbmUgYm9vbF9zZXQKKyAgb3BlcmF0b3IhPShib29sX3NldCBfX3MsIGJvb2xfc2V0IF9fdCkKKyAgeyByZXR1cm4gISAoX19zID09IF9fdCk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Cit9CisKKyNpbmNsdWRlIDx0cjIvYm9vbF9zZXQudGNjPgorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIyX0JPT0xfU0VUCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMi9ib29sX3NldC50Y2MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMi9ib29sX3NldC50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4ODdjYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIyL2Jvb2xfc2V0LnRjYwpAQCAtMCwwICsxLDI3NyBAQAorLy8gVFIyIDxib29sX3NldD4gc3VwcG9ydCBmaWxlcyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIyL2Jvb2xfc2V0LnRjYworICogIFRoaXMgaXMgYSBUUjIgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIyX0JPT0xfU0VUX1RDQworI2RlZmluZSBfR0xJQkNYWF9UUjJfQk9PTF9TRVRfVENDIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjIKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgYm9vbF9zZXQ6Ol9Cb29sX3NldF92YWwKKyAgYm9vbF9zZXQ6Ol9TX25vdFs0XSA9CisgIHsgX1NfdHJ1ZV8sIF9TX2ZhbHNlLCBfU19pbmRldCwgX1NfZW1wdHkgfTsKKworICBib29sX3NldDo6X0Jvb2xfc2V0X3ZhbAorICBib29sX3NldDo6X1NfeG9yWzRdWzRdID0KKyAgeyB7IF9TX2ZhbHNlLCBfU190cnVlXywgX1NfaW5kZXQsIF9TX2VtcHR5IH0sCisgICAgeyBfU190cnVlXywgX1NfZmFsc2UsIF9TX2luZGV0LCBfU19lbXB0eSB9LAorICAgIHsgX1NfaW5kZXQsIF9TX2luZGV0LCBfU19pbmRldCwgX1NfZW1wdHkgfSwKKyAgICB7IF9TX2VtcHR5LCBfU19lbXB0eSwgX1NfZW1wdHksIF9TX2VtcHR5IH0gfTsKKworICBib29sX3NldDo6X0Jvb2xfc2V0X3ZhbAorICBib29sX3NldDo6X1Nfb3JbNF1bNF0gPQorICB7IHsgX1NfZmFsc2UsIF9TX3RydWVfLCBfU19pbmRldCwgX1NfZW1wdHkgfSwKKyAgICB7IF9TX3RydWVfLCBfU190cnVlXywgX1NfdHJ1ZV8sIF9TX2VtcHR5IH0sCisgICAgeyBfU19pbmRldCwgX1NfdHJ1ZV8sIF9TX2luZGV0LCBfU19lbXB0eSB9LAorICAgIHsgX1NfZW1wdHksIF9TX2VtcHR5LCBfU19lbXB0eSwgX1NfZW1wdHkgfSB9OworCisgIGJvb2xfc2V0OjpfQm9vbF9zZXRfdmFsCisgIGJvb2xfc2V0OjpfU19hbmRbNF1bNF0gPQorICB7IHsgX1NfZmFsc2UsIF9TX2ZhbHNlLCBfU19mYWxzZSwgX1NfZW1wdHkgfSwKKyAgICB7IF9TX2ZhbHNlLCBfU190cnVlXywgX1NfaW5kZXQsIF9TX2VtcHR5IH0sCisgICAgeyBfU19mYWxzZSwgX1NfaW5kZXQsIF9TX2luZGV0LCBfU19lbXB0eSB9LAorICAgIHsgX1NfZW1wdHksIF9TX2VtcHR5LCBfU19lbXB0eSwgX1NfZW1wdHkgfSB9OworCisgIGJvb2xfc2V0OjpfQm9vbF9zZXRfdmFsCisgIGJvb2xfc2V0OjpfU19lcVs0XVs0XSA9CisgIHsgeyBfU190cnVlXywgX1NfZmFsc2UsIF9TX2luZGV0LCBfU19lbXB0eSB9LAorICAgIHsgX1NfZmFsc2UsIF9TX3RydWVfLCBfU19pbmRldCwgX1NfZW1wdHkgfSwKKyAgICB7IF9TX2luZGV0LCBfU19pbmRldCwgX1NfaW5kZXQsIF9TX2VtcHR5IH0sCisgICAgeyBfU19lbXB0eSwgX1NfZW1wdHksIF9TX2VtcHR5LCBfU19lbXB0eSB9IH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorfQorCisvLyAgSSBvYmplY3QgdG8gdGhlc2UgdGhpbmdzLgorLy8gIFRoZSBzdHVmZiBpbiBsb2NhbGUgZmFjZXRzIGFyZSBmb3IgYmFzaWMgdHlwZXMuCisvLyAgSSB0aGluayB3ZSBjb3VsZCBoYWNrIG9wZXJhdG9yPDwgYW5kIG9wZXJhdG9yPj4uCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTnVtZXJpYyBwYXJzaW5nLgorICAgICAgICoKKyAgICAgICAqICBQYXJzZXMgdGhlIGlucHV0IHN0cmVhbSBpbnRvIHRoZSBib29sIEBhIHYuICBJdCBkb2VzIHNvIGJ5IGNhbGxpbmcKKyAgICAgICAqICBudW1fZ2V0Ojpkb19nZXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgaW9zX2Jhc2U6OmJvb2xhbHBoYSBpcyBzZXQsIGF0dGVtcHRzIHRvIHJlYWQKKyAgICAgICAqICBjdHlwZTxDaGFyVD46OnRydWVuYW1lKCkgb3IgY3R5cGU8Q2hhclQ+OjpmYWxzZW5hbWUoKS4gIFNldHMKKyAgICAgICAqICBAYSB2IHRvIHRydWUgb3IgZmFsc2UgaWYgc3VjY2Vzc2Z1bC4gIFNldHMgZXJyIHRvCisgICAgICAgKiAgaW9zX2Jhc2U6OmZhaWxiaXQgaWYgcmVhZGluZyB0aGUgc3RyaW5nIGZhaWxzLiAgU2V0cyBlcnIgdG8KKyAgICAgICAqICBpb3NfYmFzZTo6ZW9mYml0IGlmIHRoZSBzdHJlYW0gaXMgZW1wdGllZC4KKyAgICAgICAqCisgICAgICAgKiAgSWYgaW9zX2Jhc2U6OmJvb2xhbHBoYSBpcyBub3Qgc2V0LCBwcm9jZWVkcyBhcyB3aXRoIHJlYWRpbmcgYSBsb25nLAorICAgICAgICogIGV4Y2VwdCBpZiB0aGUgdmFsdWUgaXMgMSwgc2V0cyBAYSB2IHRvIHRydWUsIGlmIHRoZSB2YWx1ZSBpcyAwLCBzZXRzCisgICAgICAgKiAgQGEgdiB0byBmYWxzZSwgYW5kIG90aGVyd2lzZSBzZXQgZXJyIHRvIGlvc19iYXNlOjpmYWlsYml0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIGluICBTdGFydCBvZiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiAgQHBhcmFtICBlbmQgIEVuZCBvZiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiAgQHBhcmFtICBpbyAgU291cmNlIG9mIGxvY2FsZSBhbmQgZmxhZ3MuCisgICAgICAgKiAgQHBhcmFtICBlcnIgIEVycm9yIGZsYWdzIHRvIHNldC4KKyAgICAgICAqICBAcGFyYW0gIHYgIFZhbHVlIHRvIGZvcm1hdCBhbmQgaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIGFmdGVyIHJlYWRpbmcuCisgICAgICBpdGVyX3R5cGUKKyAgICAgIGdldChpdGVyX3R5cGUgX19pbiwgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgYm9vbCYgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZ2V0KF9faW4sIF9fZW5kLCBfX2lvLCBfX2VyciwgX192KTsgfQorICAgICAgICovCisvKgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgX0luSXRlcgorICAgIG51bV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGJvb2xfc2V0JiBfX3YpIGNvbnN0CisgICAgeworICAgICAgaWYgKCEoX19pby5mbGFncygpICYgaW9zX2Jhc2U6OmJvb2xhbHBoYSkpCisJeworCSAgLy8gUGFyc2UgYm9vbCB2YWx1ZXMgYXMgbG9uZy4KKwkgIC8vIE5COiBXZSBjYW4ndCBqdXN0IGNhbGwgZG9fZ2V0KGxvbmcpIGhlcmUsIGFzIGl0IG1pZ2h0CisJICAvLyByZWZlciB0byBhIGRlcml2ZWQgY2xhc3MuCisJICBsb25nIF9fbCA9IC0xOworCSAgX19iZWcgPSBfTV9leHRyYWN0X2ludChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX2wpOworCSAgaWYgKF9fYyA+PSBfU19mYWxzZSAmJiBfX2MgPCBfU19lbXB0eSkKKwkgICAgX19iLl9NX2IgPSBzdGF0aWNfY2FzdDxfQm9vbF9zZXRfdmFsPihfX2MpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgLy8gV2hhdCBzaG91bGQgd2UgZG8gaGVyZT8KKwkgICAgICBfX3YgPSB0cnVlOworCSAgICAgIF9fZXJyID0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJICAgICAgaWYgKF9fYmVnID09IF9fZW5kKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8vIFBhcnNlIGJvb2wgdmFsdWVzIGFzIGFscGhhbnVtZXJpYy4KKwkgIHR5cGVkZWYgX19udW1wdW5jdF9jYWNoZTxfQ2hhclQ+ICBfX2NhY2hlX3R5cGU7CisJICBfX3VzZV9jYWNoZTxfX2NhY2hlX3R5cGU+IF9fdWM7CisJICBjb25zdCBsb2NhbGUmIF9fbG9jID0gX19pby5fTV9nZXRsb2MoKTsKKwkgIGNvbnN0IF9fY2FjaGVfdHlwZSogX19sYyA9IF9fdWMoX19sb2MpOworCisJICBib29sIF9fdGVzdGYgPSB0cnVlOworCSAgYm9vbCBfX3Rlc3R0ID0gdHJ1ZTsKKwkgIGJvb2wgX19kb25lZiA9IF9fbGMtPl9NX2ZhbHNlbmFtZV9zaXplID09IDA7CisJICBib29sIF9fZG9uZXQgPSBfX2xjLT5fTV90cnVlbmFtZV9zaXplID09IDA7CisJICBib29sIF9fdGVzdGVvZiA9IGZhbHNlOworCSAgc2l6ZV90IF9fbiA9IDA7CisJICB3aGlsZSAoIV9fZG9uZWYgfHwgIV9fZG9uZXQpCisJICAgIHsKKwkgICAgICBpZiAoX19iZWcgPT0gX19lbmQpCisJCXsKKwkJICBfX3Rlc3Rlb2YgPSB0cnVlOworCQkgIGJyZWFrOworCQl9CisKKwkgICAgICBjb25zdCBjaGFyX3R5cGUgX19jID0gKl9fYmVnOworCisJICAgICAgaWYgKCFfX2RvbmVmKQorCQlfX3Rlc3RmID0gX19jID09IF9fbGMtPl9NX2ZhbHNlbmFtZVtfX25dOworCisJICAgICAgaWYgKCFfX3Rlc3RmICYmIF9fZG9uZXQpCisJCWJyZWFrOworCisJICAgICAgaWYgKCFfX2RvbmV0KQorCQlfX3Rlc3R0ID0gX19jID09IF9fbGMtPl9NX3RydWVuYW1lW19fbl07CisKKwkgICAgICBpZiAoIV9fdGVzdHQgJiYgX19kb25lZikKKwkJYnJlYWs7CisKKwkgICAgICBpZiAoIV9fdGVzdHQgJiYgIV9fdGVzdGYpCisJCWJyZWFrOworCisJICAgICAgKytfX247CisJICAgICAgKytfX2JlZzsKKworCSAgICAgIF9fZG9uZWYgPSAhX190ZXN0ZiB8fCBfX24gPj0gX19sYy0+X01fZmFsc2VuYW1lX3NpemU7CisJICAgICAgX19kb25ldCA9ICFfX3Rlc3R0IHx8IF9fbiA+PSBfX2xjLT5fTV90cnVlbmFtZV9zaXplOworCSAgICB9CisJICBpZiAoX190ZXN0ZiAmJiBfX24gPT0gX19sYy0+X01fZmFsc2VuYW1lX3NpemUgJiYgX19uKQorCSAgICB7CisJICAgICAgX192ID0gZmFsc2U7CisJICAgICAgaWYgKF9fdGVzdHQgJiYgX19uID09IF9fbGMtPl9NX3RydWVuYW1lX3NpemUpCisJCV9fZXJyID0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJICAgICAgZWxzZQorCQlfX2VyciA9IF9fdGVzdGVvZiA/IGlvc19iYXNlOjplb2ZiaXQgOiBpb3NfYmFzZTo6Z29vZGJpdDsKKwkgICAgfQorCSAgZWxzZSBpZiAoX190ZXN0dCAmJiBfX24gPT0gX19sYy0+X01fdHJ1ZW5hbWVfc2l6ZSAmJiBfX24pCisJICAgIHsKKwkgICAgICBfX3YgPSB0cnVlOworCSAgICAgIF9fZXJyID0gX190ZXN0ZW9mID8gaW9zX2Jhc2U6OmVvZmJpdCA6IGlvc19iYXNlOjpnb29kYml0OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAgICAgLy8gMjMuIE51bV9nZXQgb3ZlcmZsb3cgcmVzdWx0LgorCSAgICAgIF9fdiA9IGZhbHNlOworCSAgICAgIF9fZXJyID0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJICAgICAgaWYgKF9fdGVzdGVvZikKKwkJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisqLworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE51bWVyaWMgZm9ybWF0dGluZy4KKyAgICAgICAqCisgICAgICAgKiAgRm9ybWF0cyB0aGUgYm9vbGVhbiBAYSB2IGFuZCBpbnNlcnRzIGl0IGludG8gYSBzdHJlYW0uICBJdCBkb2VzIHNvCisgICAgICAgKiAgYnkgY2FsbGluZyBudW1fcHV0Ojpkb19wdXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgaW9zX2Jhc2U6OmJvb2xhbHBoYSBpcyBzZXQsIHdyaXRlcyBjdHlwZTxDaGFyVD46OnRydWVuYW1lKCkgb3IKKyAgICAgICAqICBjdHlwZTxDaGFyVD46OmZhbHNlbmFtZSgpLiAgT3RoZXJ3aXNlIGZvcm1hdHMgQGEgdiBhcyBhbiBpbnQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgcyAgU3RyZWFtIHRvIHdyaXRlIHRvLgorICAgICAgICogIEBwYXJhbSAgaW8gIFNvdXJjZSBvZiBsb2NhbGUgYW5kIGZsYWdzLgorICAgICAgICogIEBwYXJhbSAgZmlsbCAgQ2hhcl90eXBlIHRvIHVzZSBmb3IgZmlsbGluZy4KKyAgICAgICAqICBAcGFyYW0gIHYgIFZhbHVlIHRvIGZvcm1hdCBhbmQgaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIGFmdGVyIHdyaXRpbmcuCisgICAgICBpdGVyX3R5cGUKKyAgICAgIHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19mLCBjaGFyX3R5cGUgX19maWxsLCBib29sIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3B1dChfX3MsIF9fZiwgX19maWxsLCBfX3YpOyB9CisgICAgICAgKi8KKworLyoKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICBfT3V0SXRlcgorICAgIG51bV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OgorICAgIGRvX3B1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwgYm9vbF9zZXQgX192KSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pby5mbGFncygpOworICAgICAgaWYgKChfX2ZsYWdzICYgaW9zX2Jhc2U6OmJvb2xhbHBoYSkgPT0gMCkKKwl7CisJICBjb25zdCBsb25nIF9fbCA9IF9fdjsKKwkgIF9fcyA9IF9NX2luc2VydF9pbnQoX19zLCBfX2lvLCBfX2ZpbGwsIF9fbCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHR5cGVkZWYgX19udW1wdW5jdF9jYWNoZTxfQ2hhclQ+IF9fY2FjaGVfdHlwZTsKKwkgIF9fdXNlX2NhY2hlPF9fY2FjaGVfdHlwZT4gX191YzsKKwkgIGNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworCSAgY29uc3QgX19jYWNoZV90eXBlKiBfX2xjID0gX191YyhfX2xvYyk7CisKKwkgIGNvbnN0IF9DaGFyVCogX19uYW1lID0gX192ID8gX19sYy0+X01fdHJ1ZW5hbWUKKwkJCQkgICAgIDogX19sYy0+X01fZmFsc2VuYW1lOworCSAgaW50IF9fbGVuID0gX192ID8gX19sYy0+X01fdHJ1ZW5hbWVfc2l6ZQorCQkJICA6IF9fbGMtPl9NX2ZhbHNlbmFtZV9zaXplOworCisJICBjb25zdCBzdHJlYW1zaXplIF9fdyA9IF9faW8ud2lkdGgoKTsKKwkgIGlmIChfX3cgPiBzdGF0aWNfY2FzdDxzdHJlYW1zaXplPihfX2xlbikpCisJICAgIHsKKwkgICAgICBjb25zdCBzdHJlYW1zaXplIF9fcGxlbiA9IF9fdyAtIF9fbGVuOworCSAgICAgIF9DaGFyVCogX19wcworCQk9IHN0YXRpY19jYXN0PF9DaGFyVCo+KF9fYnVpbHRpbl9hbGxvY2Eoc2l6ZW9mKF9DaGFyVCkKKwkJCQkJCQkqIF9fcGxlbikpOworCisJICAgICAgY2hhcl90cmFpdHM8X0NoYXJUPjo6YXNzaWduKF9fcHMsIF9fcGxlbiwgX19maWxsKTsKKwkgICAgICBfX2lvLndpZHRoKDApOworCisJICAgICAgaWYgKChfX2ZsYWdzICYgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKSA9PSBpb3NfYmFzZTo6bGVmdCkKKwkJeworCQkgIF9fcyA9IHN0ZDo6X193cml0ZShfX3MsIF9fbmFtZSwgX19sZW4pOworCQkgIF9fcyA9IHN0ZDo6X193cml0ZShfX3MsIF9fcHMsIF9fcGxlbik7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBfX3MgPSBzdGQ6Ol9fd3JpdGUoX19zLCBfX3BzLCBfX3BsZW4pOworCQkgIF9fcyA9IHN0ZDo6X193cml0ZShfX3MsIF9fbmFtZSwgX19sZW4pOworCQl9CisJICAgICAgcmV0dXJuIF9fczsKKwkgICAgfQorCSAgX19pby53aWR0aCgwKTsKKwkgIF9fcyA9IHN0ZDo6X193cml0ZShfX3MsIF9fbmFtZSwgX19sZW4pOworCX0KKyAgICAgIHJldHVybiBfX3M7CisgICAgfQorKi8KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMl9CT09MX1NFVF9UQ0MKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIyL2R5bmFtaWNfYml0c2V0IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjIvZHluYW1pY19iaXRzZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlOWRjMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIyL2R5bmFtaWNfYml0c2V0CkBAIC0wLDAgKzEsMTQ3MiBAQAorLy8gVFIyIDxkeW5hbWljX2JpdHNldD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMi9keW5hbWljX2JpdHNldAorICogIFRoaXMgaXMgYSBUUjIgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIyX0RZTkFNSUNfQklUU0VUCisjZGVmaW5lIF9HTElCQ1hYX1RSMl9EWU5BTUlDX0JJVFNFVCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1lbW9yeT4gLy8gRm9yIHN0ZDo6YWxsb2NhdG9yCisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPiAgIC8vIEZvciBpbnZhbGlkX2FyZ3VtZW50LCBvdXRfb2ZfcmFuZ2UsCisJCQkJLy8gb3ZlcmZsb3dfZXJyb3IKKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8Yml0cy9jeHhhYmlfZm9yY2VkLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMgoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIER5bmFtaWMgQml0c2V0LgorICAgKgorICAgKiAgU2VlIE4yMDUwLAorICAgKiAgUHJvcG9zYWwgdG8gQWRkIGEgRHluYW1pY2FsbHkgU2l6ZWFibGUgQml0c2V0IHRvIHRoZSBTdGFuZGFyZCBMaWJyYXJ5LgorICAgKi8KK25hbWVzcGFjZSBfX2RldGFpbAoreworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgX0Jvb2wyVUNoYXIKK3sKKyAgdHlwZWRlZiBUIHR5cGU7Cit9OworCit0ZW1wbGF0ZTw+CitjbGFzcyBfQm9vbDJVQ2hhcjxib29sPgoreworcHVibGljOgorICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdHlwZTsKK307CisKK30KKworICAvKioKKyAgICogIEJhc2UgY2xhc3MsIGdlbmVyYWwgY2FzZS4KKyAgICoKKyAgICogIFNlZSBkb2N1bWVudGF0aW9uIGZvciBkeW5hbWljX2JpdHNldC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Xb3JkVCA9IHVuc2lnbmVkIGxvbmcgbG9uZywKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfV29yZFQ+PgorICAgIHN0cnVjdCBfX2R5bmFtaWNfYml0c2V0X2Jhc2UKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdW5zaWduZWQ8X1dvcmRUPjo6dmFsdWUsICJ0ZW1wbGF0ZSBhcmd1bWVudCAiCisJCSAgICAiX1dvcmRUIG5vdCBhbiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlIik7CisKKyAgICAgIHR5cGVkZWYgX1dvcmRUIGJsb2NrX3R5cGU7CisgICAgICB0eXBlZGVmIF9BbGxvYyBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKKworICAgICAgc3RhdGljIGNvbnN0IHNpemVfdHlwZSBfU19iaXRzX3Blcl9ibG9jayA9IF9fQ0hBUl9CSVRfXyAqIHNpemVvZihibG9ja190eXBlKTsKKyAgICAgIHN0YXRpYyBjb25zdCBzaXplX3R5cGUgbnBvcyA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oLTEpOworCisgICAgICAvLy8gMCBpcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgd29yZC4KKyAgICAgIHN0ZDo6dmVjdG9yPGJsb2NrX3R5cGUsIGFsbG9jYXRvcl90eXBlPiBfTV93OworCisgICAgICBleHBsaWNpdAorICAgICAgX19keW5hbWljX2JpdHNldF9iYXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2FsbG9jID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01fdyhfX2FsbG9jKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX2R5bmFtaWNfYml0c2V0X2Jhc2UoX19keW5hbWljX2JpdHNldF9iYXNlJiYgX19iKQorICAgICAgeyB0aGlzLT5fTV93LnN3YXAoX19iLl9NX3cpOyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX2R5bmFtaWNfYml0c2V0X2Jhc2Uoc2l6ZV90eXBlIF9fbmJpdHMsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX3ZhbCA9IDBVTEwsCisJCQkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hbGxvYyA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX3coX19uYml0cyAvIF9TX2JpdHNfcGVyX2Jsb2NrCisJICAgICArIChfX25iaXRzICUgX1NfYml0c19wZXJfYmxvY2sgPiAwKSwKKwkgICAgIF9fdmFsLCBfX2FsbG9jKQorICAgICAgeworCXVuc2lnbmVkIGxvbmcgbG9uZyBfX21hc2sgPSB+c3RhdGljX2Nhc3Q8YmxvY2tfdHlwZT4oMCk7CisJc2l6ZV90IF9fbiA9IHN0ZDo6bWluKHRoaXMtPl9NX3cuc2l6ZSgpLAorCQkJICAgICAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykgLyBzaXplb2YoYmxvY2tfdHlwZSkpOworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisJICB7CisJICAgIHRoaXMtPl9NX3dbX19pXSA9IChfX3ZhbCAmIF9fbWFzaykgPj4gKF9faSAqIF9TX2JpdHNfcGVyX2Jsb2NrKTsKKwkgICAgX19tYXNrIDw8PSBfU19iaXRzX3Blcl9ibG9jazsKKwkgIH0KKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fYXNzaWduKGNvbnN0IF9fZHluYW1pY19iaXRzZXRfYmFzZSYgX19iKQorICAgICAgeyB0aGlzLT5fTV93ID0gX19iLl9NX3c7IH0KKworICAgICAgdm9pZAorICAgICAgX01fc3dhcChfX2R5bmFtaWNfYml0c2V0X2Jhc2UmIF9fYikKKyAgICAgIHsgdGhpcy0+X01fdy5zd2FwKF9fYi5fTV93KTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9jbGVhcigpCisgICAgICB7IHRoaXMtPl9NX3cuY2xlYXIoKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9yZXNpemUoc2l6ZV90IF9fbmJpdHMsIGJvb2wgX192YWx1ZSkKKyAgICAgIHsKKwlzaXplX3QgX19zeiA9IF9fbmJpdHMgLyBfU19iaXRzX3Blcl9ibG9jazsKKwlpZiAoX19uYml0cyAlIF9TX2JpdHNfcGVyX2Jsb2NrID4gMCkKKwkgICsrX19zejsKKwlpZiAoX19zeiAhPSB0aGlzLT5fTV93LnNpemUoKSkKKwkgIHRoaXMtPl9NX3cucmVzaXplKF9fc3opOworICAgICAgfQorCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgX01fZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV93LmdldF9hbGxvY2F0b3IoKTsgfQorCisgICAgICBzdGF0aWMgc2l6ZV90eXBlCisgICAgICBfU193aGljaHdvcmQoc2l6ZV90eXBlIF9fcG9zKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gX19wb3MgLyBfU19iaXRzX3Blcl9ibG9jazsgfQorCisgICAgICBzdGF0aWMgc2l6ZV90eXBlCisgICAgICBfU193aGljaGJ5dGUoc2l6ZV90eXBlIF9fcG9zKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gKF9fcG9zICUgX1NfYml0c19wZXJfYmxvY2spIC8gX19DSEFSX0JJVF9fOyB9CisKKyAgICAgIHN0YXRpYyBzaXplX3R5cGUKKyAgICAgIF9TX3doaWNoYml0KHNpemVfdHlwZSBfX3Bvcykgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9fcG9zICUgX1NfYml0c19wZXJfYmxvY2s7IH0KKworICAgICAgc3RhdGljIGJsb2NrX3R5cGUKKyAgICAgIF9TX21hc2tiaXQoc2l6ZV90eXBlIF9fcG9zKSBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gKHN0YXRpY19jYXN0PGJsb2NrX3R5cGU+KDEpKSA8PCBfU193aGljaGJpdChfX3Bvcyk7IH0KKworICAgICAgYmxvY2tfdHlwZSYKKyAgICAgIF9NX2dldHdvcmQoc2l6ZV90eXBlIF9fcG9zKQorICAgICAgeyByZXR1cm4gdGhpcy0+X01fd1tfU193aGljaHdvcmQoX19wb3MpXTsgfQorCisgICAgICBibG9ja190eXBlCisgICAgICBfTV9nZXR3b3JkKHNpemVfdHlwZSBfX3BvcykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX3dbX1Nfd2hpY2h3b3JkKF9fcG9zKV07IH0KKworICAgICAgYmxvY2tfdHlwZSYKKyAgICAgIF9NX2hpd29yZCgpCisgICAgICB7IHJldHVybiB0aGlzLT5fTV93W19NX3cuc2l6ZSgpIC0gMV07IH0KKworICAgICAgYmxvY2tfdHlwZQorICAgICAgX01faGl3b3JkKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX3dbX01fdy5zaXplKCkgLSAxXTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19hbmQoY29uc3QgX19keW5hbWljX2JpdHNldF9iYXNlJiBfX3gpCisgICAgICB7CisJaWYgKF9feC5fTV93LnNpemUoKSA9PSB0aGlzLT5fTV93LnNpemUoKSkKKwkgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPl9NX3cuc2l6ZSgpOyArK19faSkKKwkgICAgdGhpcy0+X01fd1tfX2ldICY9IF9feC5fTV93W19faV07CisJZWxzZQorCSAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19vcihjb25zdCBfX2R5bmFtaWNfYml0c2V0X2Jhc2UmIF9feCkKKyAgICAgIHsKKwlpZiAoX194Ll9NX3cuc2l6ZSgpID09IHRoaXMtPl9NX3cuc2l6ZSgpKQorCSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+X01fdy5zaXplKCk7ICsrX19pKQorCSAgICB0aGlzLT5fTV93W19faV0gfD0gX194Ll9NX3dbX19pXTsKKwllbHNlCisJICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX3hvcihjb25zdCBfX2R5bmFtaWNfYml0c2V0X2Jhc2UmIF9feCkKKyAgICAgIHsKKwlpZiAoX194Ll9NX3cuc2l6ZSgpID09IHRoaXMtPl9NX3cuc2l6ZSgpKQorCSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+X01fdy5zaXplKCk7ICsrX19pKQorCSAgICB0aGlzLT5fTV93W19faV0gXj0gX194Ll9NX3dbX19pXTsKKwllbHNlCisJICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX2RpZihjb25zdCBfX2R5bmFtaWNfYml0c2V0X2Jhc2UmIF9feCkKKyAgICAgIHsKKwlpZiAoX194Ll9NX3cuc2l6ZSgpID09IHRoaXMtPl9NX3cuc2l6ZSgpKQorCSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgdGhpcy0+X01fdy5zaXplKCk7ICsrX19pKQorCSAgICB0aGlzLT5fTV93W19faV0gJj0gfl9feC5fTV93W19faV07CisJZWxzZQorCSAgcmV0dXJuOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19sZWZ0X3NoaWZ0KHNpemVfdCBfX3NoaWZ0KTsKKworICAgICAgdm9pZAorICAgICAgX01fZG9fcmlnaHRfc2hpZnQoc2l6ZV90IF9fc2hpZnQpOworCisgICAgICB2b2lkCisgICAgICBfTV9kb19mbGlwKCkKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5fTV93LnNpemUoKTsgKytfX2kpCisJICB0aGlzLT5fTV93W19faV0gPSB+dGhpcy0+X01fd1tfX2ldOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19zZXQoKQorICAgICAgeworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPl9NX3cuc2l6ZSgpOyArK19faSkKKwkgIHRoaXMtPl9NX3dbX19pXSA9IH5zdGF0aWNfY2FzdDxibG9ja190eXBlPigwKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9fcmVzZXQoKQorICAgICAgeworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPl9NX3cuc2l6ZSgpOyArK19faSkKKwkgIHRoaXMtPl9NX3dbX19pXSA9IHN0YXRpY19jYXN0PGJsb2NrX3R5cGU+KDApOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBfTV9pc19lcXVhbChjb25zdCBfX2R5bmFtaWNfYml0c2V0X2Jhc2UmIF9feCkgY29uc3QKKyAgICAgIHsKKwlpZiAoX194LnNpemUoKSA9PSB0aGlzLT5zaXplKCkpCisJICB7CisJICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPl9NX3cuc2l6ZSgpOyArK19faSkKKwkgICAgICBpZiAodGhpcy0+X01fd1tfX2ldICE9IF9feC5fTV93W19faV0pCisJCXJldHVybiBmYWxzZTsKKwkgICAgcmV0dXJuIHRydWU7CisJICB9CisJZWxzZQorCSAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBfTV9pc19sZXNzKGNvbnN0IF9fZHluYW1pY19iaXRzZXRfYmFzZSYgX194KSBjb25zdAorICAgICAgeworCWlmIChfX3guc2l6ZSgpID09IHRoaXMtPnNpemUoKSkKKwkgIHsKKwkgICAgZm9yIChzaXplX3QgX19pID0gdGhpcy0+X01fdy5zaXplKCk7IF9faSA+IDA7IC0tX19pKQorCSAgICAgIHsKKwkJaWYgKHRoaXMtPl9NX3dbX19pLTFdIDwgX194Ll9NX3dbX19pLTFdKQorCQkgIHJldHVybiB0cnVlOworCQllbHNlIGlmICh0aGlzLT5fTV93W19faS0xXSA+IF9feC5fTV93W19faS0xXSkKKwkJICByZXR1cm4gZmFsc2U7CisJICAgICAgfQorCSAgICByZXR1cm4gZmFsc2U7CisJICB9CisJZWxzZQorCSAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBzaXplX3QKKyAgICAgIF9NX2FyZV9hbGxfYXV4KCkgY29uc3QKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5fTV93LnNpemUoKSAtIDE7ICsrX19pKQorCSAgaWYgKF9NX3dbX19pXSAhPSB+c3RhdGljX2Nhc3Q8YmxvY2tfdHlwZT4oMCkpCisJICAgIHJldHVybiAwOworCXJldHVybiAoKHRoaXMtPl9NX3cuc2l6ZSgpIC0gMSkgKiBfU19iaXRzX3Blcl9ibG9jaworCQkrIF9fYnVpbHRpbl9wb3Bjb3VudGwodGhpcy0+X01faGl3b3JkKCkpKTsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgX01faXNfYW55KCkgY29uc3QKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5fTV93LnNpemUoKTsgKytfX2kpCisJICBpZiAodGhpcy0+X01fd1tfX2ldICE9IHN0YXRpY19jYXN0PGJsb2NrX3R5cGU+KDApKQorCSAgICByZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2lzX3N1YnNldF9vZihjb25zdCBfX2R5bmFtaWNfYml0c2V0X2Jhc2UmIF9fYikKKyAgICAgIHsKKwlpZiAoX19iLnNpemUoKSA9PSB0aGlzLT5zaXplKCkpCisJICB7CisJICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9NX3cuc2l6ZSgpOyArK19faSkKKwkgICAgICBpZiAodGhpcy0+X01fd1tfX2ldICE9ICh0aGlzLT5fTV93W19faV0gfCBfX2IuX01fd1tfX2ldKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICByZXR1cm4gdHJ1ZTsKKwkgIH0KKwllbHNlCisJICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2lzX3Byb3Blcl9zdWJzZXRfb2YoY29uc3QgX19keW5hbWljX2JpdHNldF9iYXNlJiBfX2IpIGNvbnN0CisgICAgICB7CisJaWYgKHRoaXMtPmlzX3N1YnNldF9vZihfX2IpKQorCSAgeworCSAgICBpZiAoKnRoaXMgPT0gX19iKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgZWxzZQorCSAgICAgIHJldHVybiB0cnVlOworCSAgfQorCWVsc2UKKwkgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgc2l6ZV90CisgICAgICBfTV9kb19jb3VudCgpIGNvbnN0CisgICAgICB7CisJc2l6ZV90IF9fcmVzdWx0ID0gMDsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCB0aGlzLT5fTV93LnNpemUoKTsgKytfX2kpCisJICBfX3Jlc3VsdCArPSBfX2J1aWx0aW5fcG9wY291bnRsKHRoaXMtPl9NX3dbX19pXSk7CisJcmV0dXJuIF9fcmVzdWx0OworICAgICAgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX3NpemUoKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fdy5zaXplKCk7IH0KKworICAgICAgdW5zaWduZWQgbG9uZworICAgICAgX01fZG9fdG9fdWxvbmcoKSBjb25zdDsKKworICAgICAgdW5zaWduZWQgbG9uZyBsb25nCisgICAgICBfTV9kb190b191bGxvbmcoKSBjb25zdDsKKworICAgICAgLy8gZmluZCBmaXJzdCAib24iIGJpdAorICAgICAgc2l6ZV90eXBlCisgICAgICBfTV9kb19maW5kX2ZpcnN0KHNpemVfdCBfX25vdF9mb3VuZCkgY29uc3Q7CisKKyAgICAgIC8vIGZpbmQgdGhlIG5leHQgIm9uIiBiaXQgdGhhdCBmb2xsb3dzICJwcmV2IgorICAgICAgc2l6ZV90eXBlCisgICAgICBfTV9kb19maW5kX25leHQoc2l6ZV90IF9fcHJldiwgc2l6ZV90IF9fbm90X2ZvdW5kKSBjb25zdDsKKworICAgICAgLy8gZG8gYXBwZW5kIG9mIGJsb2NrCisgICAgICB2b2lkCisgICAgICBfTV9kb19hcHBlbmRfYmxvY2soYmxvY2tfdHlwZSBfX2Jsb2NrLCBzaXplX3R5cGUgX19wb3MpCisgICAgICB7CisJc2l6ZV90IF9fb2Zmc2V0ID0gX19wb3MgJSBfU19iaXRzX3Blcl9ibG9jazsKKwlpZiAoX19vZmZzZXQgPT0gMCkKKwkgIHRoaXMtPl9NX3cucHVzaF9iYWNrKF9fYmxvY2spOworCWVsc2UKKwkgIHsKKwkgICAgdGhpcy0+X01faGl3b3JkKCkgfD0gKF9fYmxvY2sgPDwgX19vZmZzZXQpOworCSAgICB0aGlzLT5fTV93LnB1c2hfYmFjayhfX2Jsb2NrID4+IChfU19iaXRzX3Blcl9ibG9jayAtIF9fb2Zmc2V0KSk7CisJICB9CisgICAgICB9CisgICAgfTsKKworICAvLyBEZWZpbml0aW9ucyBvZiBub24taW5saW5lIGZ1bmN0aW9ucyBmcm9tIF9fZHluYW1pY19iaXRzZXRfYmFzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1dvcmRULCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9fZHluYW1pY19iaXRzZXRfYmFzZTxfV29yZFQsIF9BbGxvYz46Ol9NX2RvX2xlZnRfc2hpZnQoc2l6ZV90IF9fc2hpZnQpCisgICAgeworICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoX19zaGlmdCAhPSAwLCAxKSkKKwl7CisJICBjb25zdCBzaXplX3QgX193c2hpZnQgPSBfX3NoaWZ0IC8gX1NfYml0c19wZXJfYmxvY2s7CisJICBjb25zdCBzaXplX3QgX19vZmZzZXQgPSBfX3NoaWZ0ICUgX1NfYml0c19wZXJfYmxvY2s7CisKKwkgIGlmIChfX29mZnNldCA9PSAwKQorCSAgICBmb3IgKHNpemVfdCBfX24gPSB0aGlzLT5fTV93LnNpemUoKSAtIDE7IF9fbiA+PSBfX3dzaGlmdDsgLS1fX24pCisJICAgICAgdGhpcy0+X01fd1tfX25dID0gdGhpcy0+X01fd1tfX24gLSBfX3dzaGlmdF07CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb25zdCBzaXplX3QgX19zdWJfb2Zmc2V0ID0gX1NfYml0c19wZXJfYmxvY2sgLSBfX29mZnNldDsKKwkgICAgICBmb3IgKHNpemVfdCBfX24gPSBfTV93LnNpemUoKSAtIDE7IF9fbiA+IF9fd3NoaWZ0OyAtLV9fbikKKwkJdGhpcy0+X01fd1tfX25dID0gKCh0aGlzLT5fTV93W19fbiAtIF9fd3NoaWZ0XSA8PCBfX29mZnNldCkKKwkJCSAgICAgfCAodGhpcy0+X01fd1tfX24gLSBfX3dzaGlmdCAtIDFdID4+IF9fc3ViX29mZnNldCkpOworCSAgICAgIHRoaXMtPl9NX3dbX193c2hpZnRdID0gdGhpcy0+X01fd1swXSA8PCBfX29mZnNldDsKKwkgICAgfQorCisJICAvLy8vIHN0ZDo6ZmlsbCh0aGlzLT5fTV93LmJlZ2luKCksIHRoaXMtPl9NX3cuYmVnaW4oKSArIF9fd3NoaWZ0LAorCSAgLy8vLyAgICAgICAgICBzdGF0aWNfY2FzdDxfV29yZFQ+KDApKTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Xb3JkVCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfX2R5bmFtaWNfYml0c2V0X2Jhc2U8X1dvcmRULCBfQWxsb2M+OjpfTV9kb19yaWdodF9zaGlmdChzaXplX3QgX19zaGlmdCkKKyAgICB7CisgICAgICBpZiAoX19idWlsdGluX2V4cGVjdChfX3NoaWZ0ICE9IDAsIDEpKQorCXsKKwkgIGNvbnN0IHNpemVfdCBfX3dzaGlmdCA9IF9fc2hpZnQgLyBfU19iaXRzX3Blcl9ibG9jazsKKwkgIGNvbnN0IHNpemVfdCBfX29mZnNldCA9IF9fc2hpZnQgJSBfU19iaXRzX3Blcl9ibG9jazsKKwkgIGNvbnN0IHNpemVfdCBfX2xpbWl0ID0gdGhpcy0+X01fdy5zaXplKCkgLSBfX3dzaGlmdCAtIDE7CisKKwkgIGlmIChfX29mZnNldCA9PSAwKQorCSAgICBmb3IgKHNpemVfdCBfX24gPSAwOyBfX24gPD0gX19saW1pdDsgKytfX24pCisJICAgICAgdGhpcy0+X01fd1tfX25dID0gdGhpcy0+X01fd1tfX24gKyBfX3dzaGlmdF07CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb25zdCBzaXplX3QgX19zdWJfb2Zmc2V0ID0gKF9TX2JpdHNfcGVyX2Jsb2NrCisJCQkJCSAgIC0gX19vZmZzZXQpOworCSAgICAgIGZvciAoc2l6ZV90IF9fbiA9IDA7IF9fbiA8IF9fbGltaXQ7ICsrX19uKQorCQl0aGlzLT5fTV93W19fbl0gPSAoKHRoaXMtPl9NX3dbX19uICsgX193c2hpZnRdID4+IF9fb2Zmc2V0KQorCQkJICAgICB8ICh0aGlzLT5fTV93W19fbiArIF9fd3NoaWZ0ICsgMV0gPDwgX19zdWJfb2Zmc2V0KSk7CisJICAgICAgdGhpcy0+X01fd1tfX2xpbWl0XSA9IHRoaXMtPl9NX3dbX01fdy5zaXplKCktMV0gPj4gX19vZmZzZXQ7CisJICAgIH0KKworCSAgLy8vL3N0ZDo6ZmlsbCh0aGlzLT5fTV93LmJlZ2luKCkgKyBfX2xpbWl0ICsgMSwgdGhpcy0+X01fdy5lbmQoKSwKKwkgIC8vLy8gICAgICAgICAgc3RhdGljX2Nhc3Q8X1dvcmRUPigwKSk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfV29yZFQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB1bnNpZ25lZCBsb25nCisgICAgX19keW5hbWljX2JpdHNldF9iYXNlPF9Xb3JkVCwgX0FsbG9jPjo6X01fZG9fdG9fdWxvbmcoKSBjb25zdAorICAgIHsKKyAgICAgIHNpemVfdCBfX24gPSBzaXplb2YodW5zaWduZWQgbG9uZykgLyBzaXplb2YoYmxvY2tfdHlwZSk7CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSBfX247IF9faSA8IHRoaXMtPl9NX3cuc2l6ZSgpOyArK19faSkKKwlpZiAodGhpcy0+X01fd1tfX2ldKQorCSAgX190aHJvd19vdmVyZmxvd19lcnJvcihfX04oIl9fZHluYW1pY19iaXRzZXRfYmFzZTo6X01fZG9fdG9fdWxvbmciKSk7CisgICAgICB1bnNpZ25lZCBsb25nIF9fcmVzID0gMFVMOworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uICYmIF9faSA8IHRoaXMtPl9NX3cuc2l6ZSgpOyArK19faSkKKwlfX3JlcyArPSB0aGlzLT5fTV93W19faV0gPDwgKF9faSAqIF9TX2JpdHNfcGVyX2Jsb2NrKTsKKyAgICAgIHJldHVybiBfX3JlczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1dvcmRULCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdW5zaWduZWQgbG9uZyBsb25nCisgICAgX19keW5hbWljX2JpdHNldF9iYXNlPF9Xb3JkVCwgX0FsbG9jPjo6X01fZG9fdG9fdWxsb25nKCkgY29uc3QKKyAgICB7CisgICAgICBzaXplX3QgX19uID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykgLyBzaXplb2YoYmxvY2tfdHlwZSk7CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSBfX247IF9faSA8IHRoaXMtPl9NX3cuc2l6ZSgpOyArK19faSkKKwlpZiAodGhpcy0+X01fd1tfX2ldKQorCSAgX190aHJvd19vdmVyZmxvd19lcnJvcihfX04oIl9fZHluYW1pY19iaXRzZXRfYmFzZTo6X01fZG9fdG9fdWxsb25nIikpOworICAgICAgdW5zaWduZWQgbG9uZyBsb25nIF9fcmVzID0gMFVMTDsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbiAmJiBfX2kgPCB0aGlzLT5fTV93LnNpemUoKTsgKytfX2kpCisJX19yZXMgKz0gdGhpcy0+X01fd1tfX2ldIDw8IChfX2kgKiBfU19iaXRzX3Blcl9ibG9jayk7CisgICAgICByZXR1cm4gX19yZXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Xb3JkVCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHNpemVfdAorICAgIF9fZHluYW1pY19iaXRzZXRfYmFzZTxfV29yZFQsIF9BbGxvYz4KKyAgICA6Ol9NX2RvX2ZpbmRfZmlyc3Qoc2l6ZV90IF9fbm90X2ZvdW5kKSBjb25zdAorICAgIHsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHRoaXMtPl9NX3cuc2l6ZSgpOyArK19faSkKKwl7CisJICBfV29yZFQgX190aGlzd29yZCA9IHRoaXMtPl9NX3dbX19pXTsKKwkgIGlmIChfX3RoaXN3b3JkICE9IHN0YXRpY19jYXN0PF9Xb3JkVD4oMCkpCisJICAgIHJldHVybiAoX19pICogX1NfYml0c19wZXJfYmxvY2sKKwkJICAgICsgX19idWlsdGluX2N0emwoX190aGlzd29yZCkpOworCX0KKyAgICAgIC8vIG5vdCBmb3VuZCwgc28gcmV0dXJuIGFuIGluZGljYXRpb24gb2YgZmFpbHVyZS4KKyAgICAgIHJldHVybiBfX25vdF9mb3VuZDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1dvcmRULCB0eXBlbmFtZSBfQWxsb2M+CisgICAgc2l6ZV90CisgICAgX19keW5hbWljX2JpdHNldF9iYXNlPF9Xb3JkVCwgX0FsbG9jPgorICAgIDo6X01fZG9fZmluZF9uZXh0KHNpemVfdCBfX3ByZXYsIHNpemVfdCBfX25vdF9mb3VuZCkgY29uc3QKKyAgICB7CisgICAgICAvLyBtYWtlIGJvdW5kIGluY2x1c2l2ZQorICAgICAgKytfX3ByZXY7CisKKyAgICAgIC8vIGNoZWNrIG91dCBvZiBib3VuZHMKKyAgICAgIGlmIChfX3ByZXYgPj0gdGhpcy0+X01fdy5zaXplKCkgKiBfU19iaXRzX3Blcl9ibG9jaykKKwlyZXR1cm4gX19ub3RfZm91bmQ7CisKKyAgICAgIC8vIHNlYXJjaCBmaXJzdCB3b3JkCisgICAgICBzaXplX3QgX19pID0gX1Nfd2hpY2h3b3JkKF9fcHJldik7CisgICAgICBfV29yZFQgX190aGlzd29yZCA9IHRoaXMtPl9NX3dbX19pXTsKKworICAgICAgLy8gbWFzayBvZmYgYml0cyBiZWxvdyBib3VuZAorICAgICAgX190aGlzd29yZCAmPSAofnN0YXRpY19jYXN0PF9Xb3JkVD4oMCkpIDw8IF9TX3doaWNoYml0KF9fcHJldik7CisKKyAgICAgIGlmIChfX3RoaXN3b3JkICE9IHN0YXRpY19jYXN0PF9Xb3JkVD4oMCkpCisJcmV0dXJuIChfX2kgKiBfU19iaXRzX3Blcl9ibG9jaworCQkrIF9fYnVpbHRpbl9jdHpsKF9fdGhpc3dvcmQpKTsKKworICAgICAgLy8gY2hlY2sgc3Vic2VxdWVudCB3b3JkcworICAgICAgZm9yICgrK19faTsgX19pIDwgdGhpcy0+X01fdy5zaXplKCk7ICsrX19pKQorCXsKKwkgIF9fdGhpc3dvcmQgPSB0aGlzLT5fTV93W19faV07CisJICBpZiAoX190aGlzd29yZCAhPSBzdGF0aWNfY2FzdDxfV29yZFQ+KDApKQorCSAgICByZXR1cm4gKF9faSAqIF9TX2JpdHNfcGVyX2Jsb2NrCisJCSAgICArIF9fYnVpbHRpbl9jdHpsKF9fdGhpc3dvcmQpKTsKKwl9CisgICAgICAvLyBub3QgZm91bmQsIHNvIHJldHVybiBhbiBpbmRpY2F0aW9uIG9mIGZhaWx1cmUuCisgICAgICByZXR1cm4gX19ub3RfZm91bmQ7CisgICAgfSAvLyBlbmQgX01fZG9fZmluZF9uZXh0CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRoZSAlZHluYW1pY19iaXRzZXQgY2xhc3MgcmVwcmVzZW50cyBhIHNlcXVlbmNlIG9mIGJpdHMuCisgICAqCisgICAqICBAaW5ncm91cCBjb250YWluZXJzCisgICAqCisgICAqICAoTm90ZSB0aGF0ICVkeW5hbWljX2JpdHNldCBkb2VzIEBlIG5vdCBtZWV0IHRoZSBmb3JtYWwKKyAgICogIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LgorICAgKiAgTWFpbmx5LCBpdCBsYWNrcyBpdGVyYXRvcnMuKQorICAgKgorICAgKiAgVGhlIHRlbXBsYXRlIGFyZ3VtZW50LCBAYSBOYiwgbWF5IGJlIGFueSBub24tbmVnYXRpdmUgbnVtYmVyLAorICAgKiAgc3BlY2lmeWluZyB0aGUgbnVtYmVyIG9mIGJpdHMgKGUuZy4sICIwIiwgIjEyIiwgIjEwMjQqMTAyNCIpLgorICAgKgorICAgKiAgSW4gdGhlIGdlbmVyYWwgdW5vcHRpbWl6ZWQgY2FzZSwgc3RvcmFnZSBpcyBhbGxvY2F0ZWQgaW4KKyAgICogIHdvcmQtc2l6ZWQgYmxvY2tzLiAgTGV0IEIgYmUgdGhlIG51bWJlciBvZiBiaXRzIGluIGEgd29yZCwgdGhlbgorICAgKiAgKE5iKyhCLTEpKS9CIHdvcmRzIHdpbGwgYmUgdXNlZCBmb3Igc3RvcmFnZS4gIEIgLSBOYiVCIGJpdHMgYXJlCisgICAqICB1bnVzZWQuICAoVGhleSBhcmUgdGhlIGhpZ2gtb3JkZXIgYml0cyBpbiB0aGUgaGlnaGVzdCB3b3JkLikgIEl0CisgICAqICBpcyBhIGNsYXNzIGludmFyaWFudCB0aGF0IHRob3NlIHVudXNlZCBiaXRzIGFyZSBhbHdheXMgemVyby4KKyAgICoKKyAgICogIElmIHlvdSB0aGluayBvZiAlZHluYW1pY19iaXRzZXQgYXMgImEgc2ltcGxlIGFycmF5IG9mIGJpdHMsIiBiZQorICAgKiAgYXdhcmUgdGhhdCB5b3VyIG1lbnRhbCBwaWN0dXJlIGlzIHJldmVyc2VkOiBhICVkeW5hbWljX2JpdHNldAorICAgKiAgYmVoYXZlcyB0aGUgc2FtZSB3YXkgYXMgYml0cyBpbiBpbnRlZ2VycyBkbywgd2l0aCB0aGUgYml0IGF0CisgICAqICBpbmRleCAwIGluIHRoZSAibGVhc3Qgc2lnbmlmaWNhbnQgLyByaWdodC1oYW5kIiBwb3NpdGlvbiwgYW5kCisgICAqICB0aGUgYml0IGF0IGluZGV4IE5iLTEgaW4gdGhlICJtb3N0IHNpZ25pZmljYW50IC8gbGVmdC1oYW5kIgorICAgKiAgcG9zaXRpb24uICBUaHVzLCB1bmxpa2Ugb3RoZXIgY29udGFpbmVycywgYSAlZHluYW1pY19iaXRzZXQncworICAgKiAgaW5kZXggImNvdW50cyBmcm9tIHJpZ2h0IHRvIGxlZnQsIiB0byBwdXQgaXQgdmVyeSBsb29zZWx5LgorICAgKgorICAgKiAgVGhpcyBiZWhhdmlvciBpcyBwcmVzZXJ2ZWQgd2hlbiB0cmFuc2xhdGluZyB0byBhbmQgZnJvbSBzdHJpbmdzLgorICAgKiAgRm9yIGV4YW1wbGUsIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBwcm9iYWJseQorICAgKiAgcHJpbnRzICJiKCdhJykgaXMgMDAwMTEwMDAwMSIgb24gYSBtb2Rlcm4gQVNDSUkgc3lzdGVtLgorICAgKgorICAgKiAgQGNvZGUKKyAgICogICAgICNpbmNsdWRlIDxkeW5hbWljX2JpdHNldD4KKyAgICogICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KKyAgICogICAgICNpbmNsdWRlIDxzc3RyZWFtPgorICAgKgorICAgKiAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICoKKyAgICogICAgIGludCBtYWluKCkKKyAgICogICAgIHsKKyAgICogICAgICAgICBsb25nICAgICAgICAgYSA9ICdhJzsKKyAgICogICAgICAgICBkeW5hbWljX2JpdHNldCAgIGIoYSk7CisgICAqCisgICAqICAgICAgICAgY291dCA8PCAiYignYScpIGlzICIgPDwgYiA8PCBlbmRsOworICAgKgorICAgKiAgICAgICAgIG9zdHJpbmdzdHJlYW0gczsKKyAgICogICAgICAgICBzIDw8IGI7CisgICAqICAgICAgICAgc3RyaW5nICBzdHIgPSBzLnN0cigpOworICAgKiAgICAgICAgIGNvdXQgPDwgImluZGV4IDMgaW4gdGhlIHN0cmluZyBpcyAiIDw8IHN0clszXSA8PCAiIGJ1dFxuIgorICAgKiAgICAgICAgICAgICAgPDwgImluZGV4IDMgaW4gdGhlIGJpdHNldCBpcyAiIDw8IGJbM10gPDwgZW5kbDsKKyAgICogICAgIH0KKyAgICogIEBlbmRjb2RlCisgICAqCisgICAqICBBbHNvIHNlZToKKyAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MTJjaDMzczAyLmh0bWwKKyAgICogIGZvciBhIGRlc2NyaXB0aW9uIG9mIGV4dGVuc2lvbnMuCisgICAqCisgICAqICBNb3N0IG9mIHRoZSBhY3R1YWwgY29kZSBpc24ndCBjb250YWluZWQgaW4gJWR5bmFtaWNfYml0c2V0PD4KKyAgICogIGl0c2VsZiwgYnV0IGluIHRoZSBiYXNlIGNsYXNzIF9fZHluYW1pY19iaXRzZXRfYmFzZS4gIFRoZSBiYXNlCisgICAqICBjbGFzcyB3b3JrcyB3aXRoIHdob2xlIHdvcmRzLCBub3Qgd2l0aCBpbmRpdmlkdWFsIGJpdHMuICBUaGlzCisgICAqICBhbGxvd3MgdXMgdG8gc3BlY2lhbGl6ZSBfX2R5bmFtaWNfYml0c2V0X2Jhc2UgZm9yIHRoZSBpbXBvcnRhbnQKKyAgICogIHNwZWNpYWwgY2FzZSB3aGVyZSB0aGUgJWR5bmFtaWNfYml0c2V0IGlzIG9ubHkgYSBzaW5nbGUgd29yZC4KKyAgICoKKyAgICogIEV4dHJhIGNvbmZ1c2lvbiBjYW4gcmVzdWx0IGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSBzdG9yYWdlIGZvcgorICAgKiAgX19keW5hbWljX2JpdHNldF9iYXNlIEBlIGlzIGEgdmVjdG9yLCBhbmQgaXMgaW5kZXhlZCBhcyBzdWNoLiAgVGhpcyBpcworICAgKiAgY2FyZWZ1bGx5IGVuY2Fwc3VsYXRlZC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Xb3JkVCA9IHVuc2lnbmVkIGxvbmcgbG9uZywKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfV29yZFQ+PgorICAgIGNsYXNzIGR5bmFtaWNfYml0c2V0CisgICAgOiBwcml2YXRlIF9fZHluYW1pY19iaXRzZXRfYmFzZTxfV29yZFQsIF9BbGxvYz4KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdW5zaWduZWQ8X1dvcmRUPjo6dmFsdWUsICJ0ZW1wbGF0ZSBhcmd1bWVudCAiCisJCSAgICAiX1dvcmRUIG5vdCBhbiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisKKyAgICAgIHR5cGVkZWYgX19keW5hbWljX2JpdHNldF9iYXNlPF9Xb3JkVCwgX0FsbG9jPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgX1dvcmRUIGJsb2NrX3R5cGU7CisgICAgICB0eXBlZGVmIF9BbGxvYyBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKKworICAgICAgc3RhdGljIGNvbnN0IHNpemVfdHlwZSBiaXRzX3Blcl9ibG9jayA9IF9fQ0hBUl9CSVRfXyAqIHNpemVvZihibG9ja190eXBlKTsKKyAgICAgIC8vIFVzZSB0aGlzOiBjb25zdGV4cHIgc2l6ZV90eXBlIHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90eXBlPjo6bWF4KCkuCisgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBlIG5wb3MgPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KC0xKTsKKworICAgIHByaXZhdGU6CisKKyAgICAgIC8vICBDbGVhciB0aGUgdW51c2VkIGJpdHMgaW4gdGhlIHVwcGVybW9zdCB3b3JkLgorICAgICAgdm9pZAorICAgICAgX01fZG9fc2FuaXRpemUoKQorICAgICAgeworCXNpemVfdHlwZSBfX3NoaWZ0ID0gdGhpcy0+X01fTmIgJSBiaXRzX3Blcl9ibG9jazsKKwlpZiAoX19zaGlmdCA+IDApCisJICB0aGlzLT5fTV9oaXdvcmQoKSAmPSB+KCh+c3RhdGljX2Nhc3Q8YmxvY2tfdHlwZT4oMCkpIDw8IF9fc2hpZnQpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBUaGVzZSB2ZXJzaW9ucyBvZiBzaW5nbGUtYml0IHNldCwgcmVzZXQsIGZsaXAsIGFuZCB0ZXN0CisgICAgICAgKiAgZG8gbm8gcmFuZ2UgY2hlY2tpbmcuCisgICAgICAgKi8KKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYKKyAgICAgIF9NX3VuY2hlY2tlZF9zZXQoc2l6ZV90eXBlIF9fcG9zKQorICAgICAgeworCXRoaXMtPl9NX2dldHdvcmQoX19wb3MpIHw9IF9CYXNlOjpfU19tYXNrYml0KF9fcG9zKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYKKyAgICAgIF9NX3VuY2hlY2tlZF9zZXQoc2l6ZV90eXBlIF9fcG9zLCBpbnQgX192YWwpCisgICAgICB7CisJaWYgKF9fdmFsKQorCSAgdGhpcy0+X01fZ2V0d29yZChfX3BvcykgfD0gX0Jhc2U6Ol9TX21hc2tiaXQoX19wb3MpOworCWVsc2UKKwkgIHRoaXMtPl9NX2dldHdvcmQoX19wb3MpICY9IH5fQmFzZTo6X1NfbWFza2JpdChfX3Bvcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mCisgICAgICBfTV91bmNoZWNrZWRfcmVzZXQoc2l6ZV90eXBlIF9fcG9zKQorICAgICAgeworCXRoaXMtPl9NX2dldHdvcmQoX19wb3MpICY9IH5fQmFzZTo6X1NfbWFza2JpdChfX3Bvcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mCisgICAgICBfTV91bmNoZWNrZWRfZmxpcChzaXplX3R5cGUgX19wb3MpCisgICAgICB7CisJdGhpcy0+X01fZ2V0d29yZChfX3BvcykgXj0gX0Jhc2U6Ol9TX21hc2tiaXQoX19wb3MpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgX01fdW5jaGVja2VkX3Rlc3Qoc2l6ZV90eXBlIF9fcG9zKSBjb25zdAorICAgICAgeyByZXR1cm4gKCh0aGlzLT5fTV9nZXR3b3JkKF9fcG9zKSAmIF9CYXNlOjpfU19tYXNrYml0KF9fcG9zKSkKKwkJIT0gc3RhdGljX2Nhc3Q8X1dvcmRUPigwKSk7IH0KKworICAgICAgc2l6ZV90eXBlIF9NX05iOworCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiAgVGhpcyBlbmNhcHN1bGF0ZXMgdGhlIGNvbmNlcHQgb2YgYSBzaW5nbGUgYml0LiAgQW4gaW5zdGFuY2UKKyAgICAgICAqICBvZiB0aGlzIGNsYXNzIGlzIGEgcHJveHkgZm9yIGFuIGFjdHVhbCBiaXQ7IHRoaXMgd2F5IHRoZQorICAgICAgICogIGluZGl2aWR1YWwgYml0IG9wZXJhdGlvbnMgYXJlIGRvbmUgYXMgZmFzdGVyIHdvcmQtc2l6ZQorICAgICAgICogIGJpdHdpc2UgaW5zdHJ1Y3Rpb25zLgorICAgICAgICoKKyAgICAgICAqICBNb3N0IHVzZXJzIHdpbGwgbmV2ZXIgbmVlZCB0byB1c2UgdGhpcyBjbGFzcyBkaXJlY3RseTsKKyAgICAgICAqICBjb252ZXJzaW9ucyB0byBhbmQgZnJvbSBib29sIGFyZSBhdXRvbWF0aWMgYW5kIHNob3VsZCBiZQorICAgICAgICogIHRyYW5zcGFyZW50LiAgT3ZlcmxvYWRlZCBvcGVyYXRvcnMgaGVscCB0byBwcmVzZXJ2ZSB0aGUKKyAgICAgICAqICBpbGx1c2lvbi4KKyAgICAgICAqCisgICAgICAgKiAgKE9uIGEgdHlwaWNhbCBzeXN0ZW0sIHRoaXMgImJpdCAlcmVmZXJlbmNlIiBpcyA2NCB0aW1lcyB0aGUKKyAgICAgICAqICBzaXplIG9mIGFuIGFjdHVhbCBiaXQuICBIYS4pCisgICAgICAgKi8KKyAgICAgIGNsYXNzIHJlZmVyZW5jZQorICAgICAgeworCWZyaWVuZCBjbGFzcyBkeW5hbWljX2JpdHNldDsKKworCWJsb2NrX3R5cGUgKl9NX3dwOworCXNpemVfdHlwZSBfTV9icG9zOworCisJLy8gbGVmdCB1bmRlZmluZWQKKwlyZWZlcmVuY2UoKTsKKworICAgICAgcHVibGljOgorCXJlZmVyZW5jZShkeW5hbWljX2JpdHNldCYgX19iLCBzaXplX3R5cGUgX19wb3MpCisJeworCSAgdGhpcy0+X01fd3AgPSAmX19iLl9NX2dldHdvcmQoX19wb3MpOworCSAgdGhpcy0+X01fYnBvcyA9IF9CYXNlOjpfU193aGljaGJpdChfX3Bvcyk7CisJfQorCisJfnJlZmVyZW5jZSgpCisJeyB9CisKKwkvLyBGb3IgYltpXSA9IF9feDsKKwlyZWZlcmVuY2UmCisJb3BlcmF0b3I9KGJvb2wgX194KQorCXsKKwkgIGlmIChfX3gpCisJICAgICp0aGlzLT5fTV93cCB8PSBfQmFzZTo6X1NfbWFza2JpdCh0aGlzLT5fTV9icG9zKTsKKwkgIGVsc2UKKwkgICAgKnRoaXMtPl9NX3dwICY9IH5fQmFzZTo6X1NfbWFza2JpdCh0aGlzLT5fTV9icG9zKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKwkvLyBGb3IgYltpXSA9IGJbX19qXTsKKwlyZWZlcmVuY2UmCisJb3BlcmF0b3I9KGNvbnN0IHJlZmVyZW5jZSYgX19qKQorCXsKKwkgIGlmICgoKihfX2ouX01fd3ApICYgX0Jhc2U6Ol9TX21hc2tiaXQoX19qLl9NX2Jwb3MpKSkKKwkgICAgKnRoaXMtPl9NX3dwIHw9IF9CYXNlOjpfU19tYXNrYml0KHRoaXMtPl9NX2Jwb3MpOworCSAgZWxzZQorCSAgICAqdGhpcy0+X01fd3AgJj0gfl9CYXNlOjpfU19tYXNrYml0KHRoaXMtPl9NX2Jwb3MpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworCS8vIEZsaXBzIHRoZSBiaXQKKwlib29sCisJb3BlcmF0b3J+KCkgY29uc3QKKwl7IHJldHVybiAoKihfTV93cCkgJiBfQmFzZTo6X1NfbWFza2JpdCh0aGlzLT5fTV9icG9zKSkgPT0gMDsgfQorCisJLy8gRm9yIF9feCA9IGJbaV07CisJb3BlcmF0b3IgYm9vbCgpIGNvbnN0CisJeyByZXR1cm4gKCoodGhpcy0+X01fd3ApICYgX0Jhc2U6Ol9TX21hc2tiaXQodGhpcy0+X01fYnBvcykpICE9IDA7IH0KKworCS8vIEZvciBiW2ldLmZsaXAoKTsKKwlyZWZlcmVuY2UmCisJZmxpcCgpCisJeworCSAgKnRoaXMtPl9NX3dwIF49IF9CYXNlOjpfU19tYXNrYml0KHRoaXMtPl9NX2Jwb3MpOworCSAgcmV0dXJuICp0aGlzOworCX0KKyAgICAgIH07CisKKyAgICAgIGZyaWVuZCBjbGFzcyByZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgYm9vbCBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIC8vIDIzLjMuNS4xIGNvbnN0cnVjdG9yczoKKyAgICAgIC8vLyBBbGwgYml0cyBzZXQgdG8gemVyby4KKyAgICAgIGV4cGxpY2l0CisgICAgICBkeW5hbWljX2JpdHNldChjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hbGxvYyA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fYWxsb2MpLCBfTV9OYigwKQorICAgICAgeyB9CisKKyAgICAgIC8vLyBJbml0aWFsIGJpdHMgYml0d2lzZS1jb3BpZWQgZnJvbSBhIHNpbmdsZSB3b3JkIChvdGhlcnMgc2V0IHRvIHplcm8pLgorICAgICAgZXhwbGljaXQKKyAgICAgIGR5bmFtaWNfYml0c2V0KHNpemVfdHlwZSBfX25iaXRzLCB1bnNpZ25lZCBsb25nIGxvbmcgX192YWwgPSAwVUxMLAorCQkgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2FsbG9jID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19uYml0cywgX192YWwsIF9fYWxsb2MpLAorCV9NX05iKF9fbmJpdHMpCisgICAgICB7IH0KKworICAgICAgZHluYW1pY19iaXRzZXQoaW5pdGlhbGl6ZXJfbGlzdDxibG9ja190eXBlPiBfX2lsLAorCQkgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2FsbG9jID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hbGxvYyksIF9NX05iKDApCisgICAgICB7IHRoaXMtPmFwcGVuZChfX2lsKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFVzZSBhIHN1YnNldCBvZiBhIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBBIHN0cmluZyBvZiAnMCcgYW5kICcxJyBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIEluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gQHAgX19zdHIgdG8gdXNlLgorICAgICAgICogIEBwYXJhbSAgX19uICAgIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBjb3B5LgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBwIF9fcG9zIGlzIGJpZ2dlciB0aGUgc2l6ZSBvZiBAcCBfX3N0ci4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6aW52YWxpZF9hcmd1bWVudCAgSWYgYSBjaGFyYWN0ZXIgYXBwZWFycyBpbiB0aGUgc3RyaW5nCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGlzIG5laXRoZXIgJzAnIG5vciAnMScuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jMT4KKwlleHBsaWNpdAorCWR5bmFtaWNfYml0c2V0KGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jMT4mIF9fc3RyLAorCQkgICAgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYzE+OjpzaXplX3R5cGUKKwkJICAgICAgIF9fcG9zID0gMCwKKwkJICAgICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2MxPjo6c2l6ZV90eXBlCisJCSAgICAgICBfX24gPSBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYzE+OjpucG9zLAorCQkgICAgICAgX0NoYXJUIF9femVybyA9IF9DaGFyVCgnMCcpLCBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSwKKwkJICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2FsbG9jID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9CYXNlKF9fYWxsb2MpLAorCSAgX01fTmIoMCkgLy8gV2F0Y2ggZm9yIG5wb3MuCisJeworCSAgaWYgKF9fcG9zID4gX19zdHIuc2l6ZSgpKQorCSAgICBfX3Rocm93X291dF9vZl9yYW5nZShfX04oImR5bmFtaWNfYml0c2V0OjpiaXRzZXQgaW5pdGlhbCBwb3NpdGlvbiAiCisJCQkJICAgICAibm90IHZhbGlkIikpOworCisJICAvLyBXYXRjaCBmb3IgbnBvcy4KKwkgIHRoaXMtPl9NX05iID0gKF9fbiA+IF9fc3RyLnNpemUoKSA/IF9fc3RyLnNpemUoKSAtIF9fcG9zIDogX19uKTsKKwkgIHRoaXMtPnJlc2l6ZSh0aGlzLT5fTV9OYik7CisJICB0aGlzLT5fTV9jb3B5X2Zyb21fc3RyaW5nKF9fc3RyLCBfX3BvcywgX19uLAorCQkJCSAgICBfQ2hhclQoJzAnKSwgX0NoYXJUKCcxJykpOworCX0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3QgZnJvbSBhIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBBIHN0cmluZyBvZiAnMCcgYW5kICcxJyBjaGFyYWN0ZXJzLgorICAgICAgICogIEB0aHJvdyAgc3RkOjppbnZhbGlkX2FyZ3VtZW50ICBJZiBhIGNoYXJhY3RlciBhcHBlYXJzIGluIHRoZSBzdHJpbmcKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggaXMgbmVpdGhlciAnMCcgbm9yICcxJy4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGR5bmFtaWNfYml0c2V0KGNvbnN0IGNoYXIqIF9fc3RyLAorCQkgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2FsbG9jID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hbGxvYykKKyAgICAgIHsKKwlzaXplX3QgX19sZW4gPSAwOworCWlmIChfX3N0cikKKwkgIHdoaWxlIChfX3N0cltfX2xlbl0gIT0gJ1wwJykKKwkgICAgKytfX2xlbjsKKwl0aGlzLT5yZXNpemUoX19sZW4pOworCXRoaXMtPl9NX2NvcHlfZnJvbV9wdHI8Y2hhcixzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+PgorCQkgICAoX19zdHIsIF9fbGVuLCAwLCBfX2xlbiwgJzAnLCAnMScpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvcHkgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIGR5bmFtaWNfYml0c2V0KGNvbnN0IGR5bmFtaWNfYml0c2V0JiBfX2IpCisgICAgICA6IF9CYXNlKF9fYiksIF9NX05iKF9fYi5zaXplKCkpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNb3ZlIGNvbnN0cnVjdG9yLgorICAgICAgICovCisgICAgICBkeW5hbWljX2JpdHNldChkeW5hbWljX2JpdHNldCYmIF9fYikKKyAgICAgIDogX0Jhc2Uoc3RkOjpmb3J3YXJkPF9CYXNlPihfX2IpKSwgX01fTmIoX19iLnNpemUoKSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN3YXAgd2l0aCBhbm90aGVyIGJpdHNldC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc3dhcChkeW5hbWljX2JpdHNldCYgX19iKQorICAgICAgeworCXRoaXMtPl9NX3N3YXAoX19iKTsKKwlzdGQ6OnN3YXAodGhpcy0+X01fTmIsIF9fYi5fTV9OYik7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWdubWVudC4KKyAgICAgICAqLworICAgICAgZHluYW1pY19iaXRzZXQmCisgICAgICBvcGVyYXRvcj0oY29uc3QgZHluYW1pY19iaXRzZXQmIF9fYikKKyAgICAgIHsKKwlpZiAoJl9fYiAhPSB0aGlzKQorCSAgeworCSAgICB0aGlzLT5fTV9hc3NpZ24oX19iKTsKKwkgICAgdGhpcy0+X01fTmIgPSBfX2IuX01fTmI7CisJICB9CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTW92ZSBhc3NpZ25tZW50LgorICAgICAgICovCisgICAgICBkeW5hbWljX2JpdHNldCYKKyAgICAgIG9wZXJhdG9yPShkeW5hbWljX2JpdHNldCYmIF9fYikKKyAgICAgIHsKKwl0aGlzLT5zd2FwKF9fYik7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiB0aGUgYWxsb2NhdG9yIGZvciB0aGUgYml0c2V0LgorICAgICAgICovCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9nZXRfYWxsb2NhdG9yKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXNpemUgdGhlIGJpdHNldC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX25iaXRzLCBib29sIF9fdmFsdWUgPSBmYWxzZSkKKyAgICAgIHsKKwl0aGlzLT5fTV9yZXNpemUoX19uYml0cywgX192YWx1ZSk7CisJdGhpcy0+X01fTmIgPSBfX25iaXRzOworCXRoaXMtPl9NX2RvX3Nhbml0aXplKCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ2xlYXIgdGhlIGJpdHNldC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgY2xlYXIoKQorICAgICAgeworCXRoaXMtPl9NX2NsZWFyKCk7CisJdGhpcy0+X01fTmIgPSAwOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFB1c2ggYSBiaXQgb250byB0aGUgaGlnaCBlbmQgb2YgdGhlIGJpdHNldC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKGJvb2wgX19iaXQpCisgICAgICB7CisJaWYgKHNpemVfdCBfX29mZnNldCA9IHRoaXMtPnNpemUoKSAlIGJpdHNfcGVyX2Jsb2NrID09IDApCisJICB0aGlzLT5fTV9kb19hcHBlbmRfYmxvY2soYmxvY2tfdHlwZSgwKSwgdGhpcy0+X01fTmIpOworCSsrdGhpcy0+X01fTmI7CisJdGhpcy0+X01fdW5jaGVja2VkX3NldCh0aGlzLT5fTV9OYiwgX19iaXQpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhIGJsb2NrLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBhcHBlbmQoYmxvY2tfdHlwZSBfX2Jsb2NrKQorICAgICAgeworCXRoaXMtPl9NX2RvX2FwcGVuZF9ibG9jayhfX2Jsb2NrLCB0aGlzLT5fTV9OYik7CisJdGhpcy0+X01fTmIgKz0gYml0c19wZXJfYmxvY2s7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBhcHBlbmQoaW5pdGlhbGl6ZXJfbGlzdDxibG9ja190eXBlPiBfX2lsKQorICAgICAgeyB0aGlzLT5hcHBlbmQoX19pbC5iZWdpbigpLCBfX2lsLmVuZCgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhbiBpdGVyYXRvciByYW5nZSBvZiBibG9ja3MuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfQmxvY2tJbnB1dEl0ZXJhdG9yPgorCXZvaWQKKwlhcHBlbmQoX0Jsb2NrSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfQmxvY2tJbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKwl7CisJICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwkgICAgdGhpcy0+YXBwZW5kKCpfX2ZpcnN0KTsKKwl9CisKKyAgICAgIC8vIDIzLjMuNS4yIGR5bmFtaWNfYml0c2V0IG9wZXJhdGlvbnM6CisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE9wZXJhdGlvbnMgb24gZHluYW1pY19iaXRzZXRzLgorICAgICAgICogIEBwYXJhbSAgX19yaHMgIEEgc2FtZS1zaXplZCBkeW5hbWljX2JpdHNldC4KKyAgICAgICAqCisgICAgICAgKiAgVGhlc2Ugc2hvdWxkIGJlIHNlbGYtZXhwbGFuYXRvcnkuCisgICAgICAgKi8KKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYKKyAgICAgIG9wZXJhdG9yJj0oY29uc3QgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JiBfX3JocykKKyAgICAgIHsKKwl0aGlzLT5fTV9kb19hbmQoX19yaHMpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JgorICAgICAgb3BlcmF0b3ImPShkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mJiBfX3JocykKKyAgICAgIHsKKwl0aGlzLT5fTV9kb19hbmQoc3RkOjptb3ZlKF9fcmhzKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mCisgICAgICBvcGVyYXRvcnw9KGNvbnN0IGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYgX19yaHMpCisgICAgICB7CisJdGhpcy0+X01fZG9fb3IoX19yaHMpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JgorICAgICAgb3BlcmF0b3JePShjb25zdCBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mIF9fcmhzKQorICAgICAgeworCXRoaXMtPl9NX2RvX3hvcihfX3Jocyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mCisgICAgICBvcGVyYXRvci09KGNvbnN0IGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYgX19yaHMpCisgICAgICB7CisJdGhpcy0+X01fZG9fZGlmKF9fcmhzKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICAvL0B9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgT3BlcmF0aW9ucyBvbiBkeW5hbWljX2JpdHNldHMuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyBUaGUgbnVtYmVyIG9mIHBsYWNlcyB0byBzaGlmdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhlc2Ugc2hvdWxkIGJlIHNlbGYtZXhwbGFuYXRvcnkuCisgICAgICAgKi8KKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYKKyAgICAgIG9wZXJhdG9yPDw9KHNpemVfdHlwZSBfX3BvcykKKyAgICAgIHsKKwlpZiAoX19idWlsdGluX2V4cGVjdChfX3BvcyA8IHRoaXMtPl9NX05iLCAxKSkKKwkgIHsKKwkgICAgdGhpcy0+X01fZG9fbGVmdF9zaGlmdChfX3Bvcyk7CisJICAgIHRoaXMtPl9NX2RvX3Nhbml0aXplKCk7CisJICB9CisJZWxzZQorCSAgdGhpcy0+X01fZG9fcmVzZXQoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYKKyAgICAgIG9wZXJhdG9yPj49KHNpemVfdHlwZSBfX3BvcykKKyAgICAgIHsKKwlpZiAoX19idWlsdGluX2V4cGVjdChfX3BvcyA8IHRoaXMtPl9NX05iLCAxKSkKKwkgIHsKKwkgICAgdGhpcy0+X01fZG9fcmlnaHRfc2hpZnQoX19wb3MpOworCSAgICB0aGlzLT5fTV9kb19zYW5pdGl6ZSgpOworCSAgfQorCWVsc2UKKwkgIHRoaXMtPl9NX2RvX3Jlc2V0KCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgICAgLy9AfQorCisgICAgICAvLyBTZXQsIHJlc2V0LCBhbmQgZmxpcC4KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBTZXRzIGV2ZXJ5IGJpdCB0byB0cnVlLgorICAgICAgICovCisgICAgICBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mCisgICAgICBzZXQoKQorICAgICAgeworCXRoaXMtPl9NX2RvX3NldCgpOworCXRoaXMtPl9NX2RvX3Nhbml0aXplKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgU2V0cyBhIGdpdmVuIGJpdCB0byBhIHBhcnRpY3VsYXIgdmFsdWUuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgVGhlIGluZGV4IG9mIHRoZSBiaXQuCisgICAgICAgKiAgQHBhcmFtICBfX3ZhbCAgRWl0aGVyIHRydWUgb3IgZmFsc2UsIGRlZmF1bHRzIHRvIHRydWUuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19wb3MgaXMgYmlnZ2VyIHRoZSBzaXplIG9mIHRoZSAlc2V0LgorICAgICAgICovCisgICAgICBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mCisgICAgICBzZXQoc2l6ZV90eXBlIF9fcG9zLCBib29sIF9fdmFsID0gdHJ1ZSkKKyAgICAgIHsKKwlpZiAoX19wb3MgPj0gX01fTmIpCisJICBfX3Rocm93X291dF9vZl9yYW5nZShfX04oImR5bmFtaWNfYml0c2V0OjpzZXQiKSk7CisJcmV0dXJuIHRoaXMtPl9NX3VuY2hlY2tlZF9zZXQoX19wb3MsIF9fdmFsKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFNldHMgZXZlcnkgYml0IHRvIGZhbHNlLgorICAgICAgICovCisgICAgICBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mCisgICAgICByZXNldCgpCisgICAgICB7CisJdGhpcy0+X01fZG9fcmVzZXQoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBTZXRzIGEgZ2l2ZW4gYml0IHRvIGZhbHNlLgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIFRoZSBpbmRleCBvZiB0aGUgYml0LgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIF9fcG9zIGlzIGJpZ2dlciB0aGUgc2l6ZSBvZiB0aGUgJXNldC4KKyAgICAgICAqCisgICAgICAgKiAgU2FtZSBhcyB3cml0aW5nIEBjIHNldChfX3BvcywgZmFsc2UpLgorICAgICAgICovCisgICAgICBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mCisgICAgICByZXNldChzaXplX3R5cGUgX19wb3MpCisgICAgICB7CisJaWYgKF9fcG9zID49IF9NX05iKQorCSAgX190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJkeW5hbWljX2JpdHNldDo6cmVzZXQiKSk7CisJcmV0dXJuIHRoaXMtPl9NX3VuY2hlY2tlZF9yZXNldChfX3Bvcyk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUb2dnbGVzIGV2ZXJ5IGJpdCB0byBpdHMgb3Bwb3NpdGUgdmFsdWUuCisgICAgICAgKi8KKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYKKyAgICAgIGZsaXAoKQorICAgICAgeworCXRoaXMtPl9NX2RvX2ZsaXAoKTsKKwl0aGlzLT5fTV9kb19zYW5pdGl6ZSgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFRvZ2dsZXMgYSBnaXZlbiBiaXQgdG8gaXRzIG9wcG9zaXRlIHZhbHVlLgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIFRoZSBpbmRleCBvZiB0aGUgYml0LgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIF9fcG9zIGlzIGJpZ2dlciB0aGUgc2l6ZSBvZiB0aGUgJXNldC4KKyAgICAgICAqLworICAgICAgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JgorICAgICAgZmxpcChzaXplX3R5cGUgX19wb3MpCisgICAgICB7CisJaWYgKF9fcG9zID49IF9NX05iKQorCSAgX190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJkeW5hbWljX2JpdHNldDo6ZmxpcCIpKTsKKwlyZXR1cm4gdGhpcy0+X01fdW5jaGVja2VkX2ZsaXAoX19wb3MpOworICAgICAgfQorCisgICAgICAvLy8gU2VlIHRoZSBuby1hcmd1bWVudCBmbGlwKCkuCisgICAgICBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4KKyAgICAgIG9wZXJhdG9yfigpIGNvbnN0CisgICAgICB7IHJldHVybiBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4oKnRoaXMpLmZsaXAoKTsgfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFycmF5LWluZGV4aW5nIHN1cHBvcnQuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgSW5kZXggaW50byB0aGUgJWR5bmFtaWNfYml0c2V0LgorICAgICAgICogIEByZXR1cm4gQSBib29sIGZvciBhICdjb25zdCAlZHluYW1pY19iaXRzZXQnLiAgRm9yIG5vbi1jb25zdAorICAgICAgICogICAgICAgICAgIGJpdHNldHMsIGFuIGluc3RhbmNlIG9mIHRoZSByZWZlcmVuY2UgcHJveHkgY2xhc3MuCisgICAgICAgKiAgQG5vdGUgVGhlc2Ugb3BlcmF0b3JzIGRvIG5vIHJhbmdlIGNoZWNraW5nIGFuZCB0aHJvdyBubworICAgICAgICogICAgICAgICBleGNlcHRpb25zLCBhcyByZXF1aXJlZCBieSBEUiAxMSB0byB0aGUgc3RhbmRhcmQuCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19wb3MpCisgICAgICB7IHJldHVybiByZWZlcmVuY2UoKnRoaXMsX19wb3MpOyB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19wb3MpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV91bmNoZWNrZWRfdGVzdChfX3Bvcyk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFJldHVybnMgYSBudW1lcmljYWwgaW50ZXJwcmV0YXRpb24gb2YgdGhlICVkeW5hbWljX2JpdHNldC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgaW50ZWdyYWwgZXF1aXZhbGVudCBvZiB0aGUgYml0cy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3ZlcmZsb3dfZXJyb3IgIElmIHRoZXJlIGFyZSB0b28gbWFueSBiaXRzIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRlZCBpbiBhbiBAYyB1bnNpZ25lZCBAYyBsb25nLgorICAgICAgICovCisgICAgICB1bnNpZ25lZCBsb25nCisgICAgICB0b191bG9uZygpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9kb190b191bG9uZygpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBSZXR1cm5zIGEgbnVtZXJpY2FsIGludGVycHJldGF0aW9uIG9mIHRoZSAlZHluYW1pY19iaXRzZXQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGludGVncmFsIGVxdWl2YWxlbnQgb2YgdGhlIGJpdHMuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om92ZXJmbG93X2Vycm9yICBJZiB0aGVyZSBhcmUgdG9vIG1hbnkgYml0cyB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gYW4gQGMgdW5zaWduZWQgQGMgbG9uZy4KKyAgICAgICAqLworICAgICAgdW5zaWduZWQgbG9uZyBsb25nCisgICAgICB0b191bGxvbmcoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fZG9fdG9fdWxsb25nKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFJldHVybnMgYSBjaGFyYWN0ZXIgaW50ZXJwcmV0YXRpb24gb2YgdGhlICVkeW5hbWljX2JpdHNldC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgc3RyaW5nIGVxdWl2YWxlbnQgb2YgdGhlIGJpdHMuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhlIG9yZGVyaW5nIG9mIHRoZSBiaXRzOiAgZGVjcmVhc2luZyBjaGFyYWN0ZXIgcG9zaXRpb25zCisgICAgICAgKiAgY29ycmVzcG9uZCB0byBpbmNyZWFzaW5nIGJpdCBwb3NpdGlvbnMgKHNlZSB0aGUgbWFpbiBjbGFzcyBub3RlcyBmb3IKKyAgICAgICAqICBhbiBleGFtcGxlKS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUID0gY2hhciwKKwkgICAgICAgdHlwZW5hbWUgX1RyYWl0cyA9IHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPiwKKwkgICAgICAgdHlwZW5hbWUgX0FsbG9jMSA9IHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4+CisJc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MxPgorCXRvX3N0cmluZyhfQ2hhclQgX196ZXJvID0gX0NoYXJUKCcwJyksIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpKSBjb25zdAorCXsKKwkgIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jMT4gX19yZXN1bHQ7CisJICBfTV9jb3B5X3RvX3N0cmluZyhfX3Jlc3VsdCwgX196ZXJvLCBfX29uZSk7CisJICByZXR1cm4gX19yZXN1bHQ7CisJfQorCisgICAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBzdHJpbmcgb3BlcmF0aW9ucy4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwl2b2lkCisJX01fY29weV9mcm9tX3B0cihjb25zdCBfQ2hhclQqLCBzaXplX3QsIHNpemVfdCwgc2l6ZV90LAorCQkJIF9DaGFyVCwgX0NoYXJUKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MxPgorCXZvaWQKKwlfTV9jb3B5X2Zyb21fc3RyaW5nKGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwKKwkJCSAgICBfVHJhaXRzLCBfQWxsb2MxPiYgX19zdHIsIHNpemVfdCBfX3Bvcywgc2l6ZV90IF9fbiwKKwkJCSAgICBfQ2hhclQgX196ZXJvID0gX0NoYXJUKCcwJyksCisJCQkgICAgX0NoYXJUIF9fb25lID0gX0NoYXJUKCcxJykpCisJeyBfTV9jb3B5X2Zyb21fcHRyPF9DaGFyVCwgX1RyYWl0cz4oX19zdHIuZGF0YSgpLCBfX3N0ci5zaXplKCksCisJCQkJCSAgICBfX3BvcywgX19uLCBfX3plcm8sIF9fb25lKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYzE+CisJdm9pZAorCV9NX2NvcHlfdG9fc3RyaW5nKHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jMT4mIF9fc3RyLAorCQkJICBfQ2hhclQgX196ZXJvID0gX0NoYXJUKCcwJyksCisJCQkgIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpKSBjb25zdDsKKworICAgICAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIHdoaWNoIGFyZSBzZXQuCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNvdW50KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2RvX2NvdW50KCk7IH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBiaXRzLgorICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX05iOyB9CisKKyAgICAgIC8vLyBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgYmxvY2tzLgorICAgICAgc2l6ZV90eXBlCisgICAgICBudW1fYmxvY2tzKCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX3NpemUoKTsgfQorCisgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBkeW5hbWljX2JpdHNldCBpcyBlbXB0eS4KKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuICh0aGlzLT5fTV9OYiA9PSAwKTsgfQorCisgICAgICAvLy8gUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIGEgZHluYW1pY19iaXRzZXQgb2JqZWN0IGhhdmluZyB0aGUgc2FtZQorICAgICAgLy8vIHR5cGUgYXMgKnRoaXMuCisgICAgICAvLy8gVGhlIHJlYWwgYW5zd2VyIGlzIG1heCgpICogYml0c19wZXJfYmxvY2sgYnV0IGlzIGxpa2VseSB0byBvdmVyZmxvdy4KKyAgICAgIGNvbnN0ZXhwciBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8YmxvY2tfdHlwZT46Om1heCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUZXN0cyB0aGUgdmFsdWUgb2YgYSBiaXQuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgVGhlIGluZGV4IG9mIGEgYml0LgorICAgICAgICogIEByZXR1cm4gIFRoZSB2YWx1ZSBhdCBAYSBfX3Bvcy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBfX3BvcyBpcyBiaWdnZXIgdGhlIHNpemUgb2YgdGhlICVzZXQuCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIHRlc3Qoc2l6ZV90eXBlIF9fcG9zKSBjb25zdAorICAgICAgeworCWlmIChfX3BvcyA+PSBfTV9OYikKKwkgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiZHluYW1pY19iaXRzZXQ6OnRlc3QiKSk7CisJcmV0dXJuIF9NX3VuY2hlY2tlZF90ZXN0KF9fcG9zKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFRlc3RzIHdoZXRoZXIgYWxsIHRoZSBiaXRzIGFyZSBvbi4KKyAgICAgICAqICBAcmV0dXJuICBUcnVlIGlmIGFsbCB0aGUgYml0cyBhcmUgc2V0LgorICAgICAgICovCisgICAgICBib29sCisgICAgICBhbGwoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fYXJlX2FsbF9hdXgoKSA9PSBfTV9OYjsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgVGVzdHMgd2hldGhlciBhbnkgb2YgdGhlIGJpdHMgYXJlIG9uLgorICAgICAgICogIEByZXR1cm4gIFRydWUgaWYgYXQgbGVhc3Qgb25lIGJpdCBpcyBzZXQuCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGFueSgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pc19hbnkoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgVGVzdHMgd2hldGhlciBhbnkgb2YgdGhlIGJpdHMgYXJlIG9uLgorICAgICAgICogIEByZXR1cm4gIFRydWUgaWYgbm9uZSBvZiB0aGUgYml0cyBhcmUgc2V0LgorICAgICAgICovCisgICAgICBib29sCisgICAgICBub25lKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICF0aGlzLT5fTV9pc19hbnkoKTsgfQorCisgICAgICAvL0B7CisgICAgICAvLy8gU2VsZi1leHBsYW5hdG9yeS4KKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPgorICAgICAgb3BlcmF0b3I8PChzaXplX3R5cGUgX19wb3MpIGNvbnN0CisgICAgICB7IHJldHVybiBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4oKnRoaXMpIDw8PSBfX3BvczsgfQorCisgICAgICBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4KKyAgICAgIG9wZXJhdG9yPj4oc2l6ZV90eXBlIF9fcG9zKSBjb25zdAorICAgICAgeyByZXR1cm4gZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+KCp0aGlzKSA+Pj0gX19wb3M7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0ICJvbiIgYml0LgorICAgICAgICogIEByZXR1cm4gIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYml0IHNldCwgb3Igc2l6ZSgpIGlmIG5vdCBmb3VuZC4KKyAgICAgICAqICBAc2EgIGZpbmRfbmV4dAorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfZmlyc3QoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fZG9fZmluZF9maXJzdCh0aGlzLT5fTV9OYik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgIm9uIiBiaXQgYWZ0ZXIgcHJldi4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgaW5kZXggb2YgdGhlIG5leHQgYml0IHNldCwgb3Igc2l6ZSgpIGlmIG5vdCBmb3VuZC4KKyAgICAgICAqICBAcGFyYW0gIF9fcHJldiAgV2hlcmUgdG8gc3RhcnQgc2VhcmNoaW5nLgorICAgICAgICogIEBzYSAgZmluZF9maXJzdAorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfbmV4dChzaXplX3QgX19wcmV2KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fZG9fZmluZF9uZXh0KF9fcHJldiwgdGhpcy0+X01fTmIpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGlzX3N1YnNldF9vZihjb25zdCBkeW5hbWljX2JpdHNldCYgX19iKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01faXNfc3Vic2V0X29mKF9fYik7IH0KKworICAgICAgYm9vbAorICAgICAgaXNfcHJvcGVyX3N1YnNldF9vZihjb25zdCBkeW5hbWljX2JpdHNldCYgX19iKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01faXNfcHJvcGVyX3N1YnNldF9vZihfX2IpOyB9CisgICAgfTsKKworICAvLyBEZWZpbml0aW9ucyBvZiBub24taW5saW5lIG1lbWJlciBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Xb3JkVCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgIHZvaWQKKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPjo6CisgICAgICBfTV9jb3B5X2Zyb21fcHRyKGNvbnN0IF9DaGFyVCogX19zdHIsIHNpemVfdCBfX2xlbiwKKwkJICAgICAgIHNpemVfdCBfX3Bvcywgc2l6ZV90IF9fbiwgX0NoYXJUIF9femVybywgX0NoYXJUIF9fb25lKQorICAgICAgeworCXJlc2V0KCk7CisJY29uc3Qgc2l6ZV90IF9fbmJpdHMgPSBzdGQ6Om1pbihfTV9OYiwgc3RkOjptaW4oX19uLCBfX2xlbiAtIF9fcG9zKSk7CisJZm9yIChzaXplX3QgX19pID0gX19uYml0czsgX19pID4gMDsgLS1fX2kpCisJICB7CisJICAgIGNvbnN0IF9DaGFyVCBfX2MgPSBfX3N0cltfX3BvcyArIF9fbmJpdHMgLSBfX2ldOworCSAgICBpZiAoX1RyYWl0czo6ZXEoX19jLCBfX3plcm8pKQorCSAgICAgIDsKKwkgICAgZWxzZSBpZiAoX1RyYWl0czo6ZXEoX19jLCBfX29uZSkpCisJICAgICAgX01fdW5jaGVja2VkX3NldChfX2kgLSAxKTsKKwkgICAgZWxzZQorCSAgICAgIF9fdGhyb3dfaW52YWxpZF9hcmd1bWVudChfX04oImR5bmFtaWNfYml0c2V0OjpfTV9jb3B5X2Zyb21fcHRyIikpOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Xb3JkVCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jMT4KKyAgICAgIHZvaWQKKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPjo6CisgICAgICBfTV9jb3B5X3RvX3N0cmluZyhzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYzE+JiBfX3N0ciwKKwkJCV9DaGFyVCBfX3plcm8sIF9DaGFyVCBfX29uZSkgY29uc3QKKyAgICAgIHsKKwlfX3N0ci5hc3NpZ24oX01fTmIsIF9femVybyk7CisJZm9yIChzaXplX3QgX19pID0gX01fTmI7IF9faSA+IDA7IC0tX19pKQorCSAgaWYgKF9NX3VuY2hlY2tlZF90ZXN0KF9faSAtIDEpKQorCSAgICBfVHJhaXRzOjphc3NpZ24oX19zdHJbX01fTmIgLSBfX2ldLCBfX29uZSk7CisgICAgICB9CisKKworICAvL0B7CisgIC8vLyBUaGVzZSBjb21wYXJpc29ucyBmb3IgZXF1YWxpdHkvaW5lcXVhbGl0eSBhcmUsIHdlbGwsIEBlIGJpdHdpc2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Xb3JkVCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01faXNfZXF1YWwoX19yaHMpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1dvcmRULCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiAhX19saHMuX01faXNfZXF1YWwoX19yaHMpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1dvcmRULCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgIGNvbnN0IGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01faXNfbGVzcyhfX3Jocyk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfV29yZFQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPiBfX3Jocyk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfV29yZFQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgY29uc3QgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX3JocyA8IF9fbGhzOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1dvcmRULCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzIDwgX19yaHMpOyB9CisgIC8vQH0KKworICAvLyAyMy4zLjUuMyBiaXRzZXQgb3BlcmF0aW9uczoKKyAgLy9AeworICAvKioKKyAgICogIEBicmllZiAgR2xvYmFsIGJpdHdpc2Ugb3BlcmF0aW9ucyBvbiBiaXRzZXRzLgorICAgKiAgQHBhcmFtICBfX3ggIEEgYml0c2V0LgorICAgKiAgQHBhcmFtICBfX3kgIEEgYml0c2V0IG9mIHRoZSBzYW1lIHNpemUgYXMgQGEgX194LgorICAgKiAgQHJldHVybiAgQSBuZXcgYml0c2V0LgorICAgKgorICAgKiAgVGhlc2Ugc2hvdWxkIGJlIHNlbGYtZXhwbGFuYXRvcnkuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfV29yZFQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+CisgICAgb3BlcmF0b3ImKGNvbnN0IGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYgX195KQorICAgIHsKKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiBfX3Jlc3VsdChfX3gpOworICAgICAgX19yZXN1bHQgJj0gX195OworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfV29yZFQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+CisgICAgb3BlcmF0b3J8KGNvbnN0IGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiYgX195KQorICAgIHsKKyAgICAgIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPiBfX3Jlc3VsdChfX3gpOworICAgICAgX19yZXN1bHQgfD0gX195OworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1dvcmRULCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGR5bmFtaWNfYml0c2V0PF9Xb3JkVCwgX0FsbG9jPgorICAgIG9wZXJhdG9yXihjb25zdCBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mIF9feCwKKwkgICAgICBjb25zdCBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mIF9feSkKKyAgICB7CisgICAgICBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4gX19yZXN1bHQoX194KTsKKyAgICAgIF9fcmVzdWx0IF49IF9feTsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9Xb3JkVCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4KKyAgICBvcGVyYXRvci0oY29uc3QgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JiBfX3gsCisJICAgICAgY29uc3QgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JiBfX3kpCisgICAgeworICAgICAgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+IF9fcmVzdWx0KF9feCk7CisgICAgICBfX3Jlc3VsdCAtPSBfX3k7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorICAvL0B9CisKKyAgLy9AeworICAvKioKKyAgICogIEBicmllZiBHbG9iYWwgSS9PIG9wZXJhdG9ycyBmb3IgYml0c2V0cy4KKyAgICoKKyAgICogIERpcmVjdCBJL08gYmV0d2VlbiBzdHJlYW1zIGFuZCBiaXRzZXRzIGlzIHN1cHBvcnRlZC4gIE91dHB1dCBpcworICAgKiAgc3RyYWlnaHRmb3J3YXJkLiAgSW5wdXQgd2lsbCBza2lwIHdoaXRlc3BhY2UgYW5kIG9ubHkgYWNjZXB0ICcwJworICAgKiAgYW5kICcxJyBjaGFyYWN0ZXJzLiAgVGhlICVkeW5hbWljX2JpdHNldCB3aWxsIGdyb3cgYXMgbmVjZXNzYXJ5CisgICAqICB0byBob2xkIHRoZSBzdHJpbmcgb2YgYml0cy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywKKwkgICB0eXBlbmFtZSBfV29yZFQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBkeW5hbWljX2JpdHNldDxfV29yZFQsIF9BbGxvYz4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSAgICAgICAgICBjaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cz4gX190bXA7CisgICAgICBfX3RtcC5yZXNlcnZlKF9feC5zaXplKCkpOworCisgICAgICBjb25zdCBjaGFyX3R5cGUgX196ZXJvID0gX19pcy53aWRlbignMCcpOworICAgICAgY29uc3QgY2hhcl90eXBlIF9fb25lID0gX19pcy53aWRlbignMScpOworCisgICAgICB0eXBlbmFtZSBfX2lvc19iYXNlOjppb3N0YXRlIF9fc3RhdGUgPSBfX2lvc19iYXNlOjpnb29kYml0OworICAgICAgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6OnNlbnRyeSBfX3NlbnRyeShfX2lzKTsKKyAgICAgIGlmIChfX3NlbnRyeSkKKwl7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgd2hpbGUgKDEpCisJCXsKKwkJICBzdGF0aWMgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgX19lb2YgPSBfVHJhaXRzOjplb2YoKTsKKworCQkgIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIF9fYzEgPSBfX2lzLnJkYnVmKCktPnNidW1wYygpOworCQkgIGlmIChfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MxLCBfX2VvZikpCisJCSAgICB7CisJCSAgICAgIF9fc3RhdGUgfD0gX19pb3NfYmFzZTo6ZW9mYml0OworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGNvbnN0IGNoYXJfdHlwZSBfX2MyID0gX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYzEpOworCQkgICAgICBpZiAoX1RyYWl0czo6ZXEoX19jMiwgX196ZXJvKSkKKwkJCV9fdG1wLnB1c2hfYmFjayhfX3plcm8pOworCQkgICAgICBlbHNlIGlmIChfVHJhaXRzOjplcShfX2MyLCBfX29uZSkpCisJCQlfX3RtcC5wdXNoX2JhY2soX19vbmUpOworCQkgICAgICBlbHNlIGlmIChfVHJhaXRzOjoKKwkJCSAgICAgICBlcV9pbnRfdHlwZShfX2lzLnJkYnVmKCktPnNwdXRiYWNrYyhfX2MyKSwKKwkJCQkJICAgX19lb2YpKQorCQkJeworCQkJICBfX3N0YXRlIHw9IF9faW9zX2Jhc2U6OmZhaWxiaXQ7CisJCQkgIGJyZWFrOworCQkJfQorCQkgICAgICBlbHNlCisJCQlicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICBfX2lzLl9NX3NldHN0YXRlKF9faW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IF9faXMuX01fc2V0c3RhdGUoX19pb3NfYmFzZTo6YmFkYml0KTsgfQorCX0KKworICAgICAgX194LnJlc2l6ZShfX3RtcC5zaXplKCkpOworCisgICAgICBpZiAoX190bXAuZW1wdHkoKSAmJiBfX3guc2l6ZSgpKQorCV9fc3RhdGUgfD0gX19pb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgIGVsc2UKKwlfX3guX01fY29weV9mcm9tX3N0cmluZyhfX3RtcCwgc3RhdGljX2Nhc3Q8c2l6ZV90PigwKSwgX194LnNpemUoKSwKKwkJCQlfX3plcm8sIF9fb25lKTsKKyAgICAgIGlmIChfX3N0YXRlKQorCV9faXMuc2V0c3RhdGUoX19zdGF0ZSk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywKKwkgICAgdHlwZW5hbWUgX1dvcmRULCB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgZHluYW1pY19iaXRzZXQ8X1dvcmRULCBfQWxsb2M+JiBfX3gpCisgICAgeworICAgICAgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzPiBfX3RtcDsKKworICAgICAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdCA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+PihfX29zLmdldGxvYygpKTsKKyAgICAgIF9feC5fTV9jb3B5X3RvX3N0cmluZyhfX3RtcCwgX19jdC53aWRlbignMCcpLCBfX2N0LndpZGVuKCcxJykpOworICAgICAgcmV0dXJuIF9fb3MgPDwgX190bXA7CisgICAgfQorICAvL0B9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyB0cjIKK30gLy8gc3RkCisKKyN1bmRlZiBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRAorCisjZW5kaWYgLyogX0dMSUJDWFhfVFIyX0RZTkFNSUNfQklUU0VUICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMi9yYXRpbyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIyL3JhdGlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OGQ1ODUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3RyMi9yYXRpbwpAQCAtMCwwICsxLDU5IEBACisvLyBUUjIgPHJhdGlvPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIyL3JhdGlvCisgKiAgVGhpcyBpcyBhIFRSMiBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2luY2x1ZGUgPHJhdGlvPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjIKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8aW50bWF4X3QgX1BuLCBzaXplX3QgX0JpdCwKKwkgICAgIGJvb2wgPSBfQml0IDwgc3RhdGljX2Nhc3Q8c2l6ZV90PgorCQkJICAoc3RkOjpudW1lcmljX2xpbWl0czxpbnRtYXhfdD46OmRpZ2l0cyk+CisgICAgc3RydWN0IF9fc2FmZV9sc2hpZnQKKyAgICB7IHN0YXRpYyBjb25zdCBpbnRtYXhfdCBfX3ZhbHVlID0gMDsgfTsKKworICAgIHRlbXBsYXRlPGludG1heF90IF9Qbiwgc2l6ZV90IF9CaXQ+CisgICAgICBzdHJ1Y3QgX19zYWZlX2xzaGlmdDxfUG4sIF9CaXQsIHRydWU+CisgICAgICB7IHN0YXRpYyBjb25zdCBpbnRtYXhfdCBfX3ZhbHVlID0gX1BuIDw8IF9CaXQ7IH07CisKKyAgLy8vIEFkZCBiaW5hcnkgcHJlZml4ZXMgKElFQyA2MDAyNy0yIEEuMiBhbmQgSVNPL0lFQyA4MDAwMCkuCisgIHR5cGVkZWYgcmF0aW88X19zYWZlX2xzaGlmdDwxLCAxMD46Ol9fdmFsdWUsIDE+IGtpYmk7CisgIHR5cGVkZWYgcmF0aW88X19zYWZlX2xzaGlmdDwxLCAyMD46Ol9fdmFsdWUsIDE+IG1lYmk7CisgIHR5cGVkZWYgcmF0aW88X19zYWZlX2xzaGlmdDwxLCAzMD46Ol9fdmFsdWUsIDE+IGdpYmk7CisgIHR5cGVkZWYgcmF0aW88X19zYWZlX2xzaGlmdDwxLCA0MD46Ol9fdmFsdWUsIDE+IHRlYmk7CisgIHR5cGVkZWYgcmF0aW88X19zYWZlX2xzaGlmdDwxLCA1MD46Ol9fdmFsdWUsIDE+IHBlYmk7CisgIHR5cGVkZWYgcmF0aW88X19zYWZlX2xzaGlmdDwxLCA2MD46Ol9fdmFsdWUsIDE+IGV4Ymk7CisgIC8vdHlwZWRlZiByYXRpbzxfX3NhZmVfbHNoaWZ0PDEsIDcwPjo6X192YWx1ZSwgMT4gemViaTsKKyAgLy90eXBlZGVmIHJhdGlvPF9fc2FmZV9sc2hpZnQ8MSwgODA+OjpfX3ZhbHVlLCAxPiB5b2JpOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIyL3R5cGVfdHJhaXRzIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90cjIvdHlwZV90cmFpdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYxNjEyNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHIyL3R5cGVfdHJhaXRzCkBAIC0wLDAgKzEsMTA2IEBACisvLyBUUjIgPHR5cGVfdHJhaXRzPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIyL3R5cGVfdHJhaXRzCisgKiAgVGhpcyBpcyBhIFRSMiBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjJfVFlQRV9UUkFJVFMKKyNkZWZpbmUgX0dMSUJDWFhfVFIyX1RZUEVfVFJBSVRTIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMgoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgbWV0YXByb2dyYW1taW5nCisgICAqIEB7CisgICAqLworCisgIC8qKgorICAgKiAgU2VlIE4yOTY1OiBUeXBlIHRyYWl0cyBhbmQgYmFzZSBjbGFzc2VzCisgICAqICBieSBNaWNoYWVsIFNwZXJ0dXMKKyAgICovCisKKyAgLyoqCisgICAqICBTaW1wbGUgdHlwZWxpc3QuIENvbXBpbGUtdGltZSBsaXN0IG9mIHR5cGVzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0VsZW1lbnRzPgorICAgIHN0cnVjdCBfX3JlZmxlY3Rpb25fdHlwZWxpc3Q7CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBlbXB0eSB0eXBlbGlzdC4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3JlZmxlY3Rpb25fdHlwZWxpc3Q8PgorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjp0cnVlX3R5cGUJCQkJCWVtcHR5OworICAgIH07CisKKyAgLy8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GaXJzdCwgdHlwZW5hbWUuLi4gX1Jlc3Q+CisgICAgc3RydWN0IF9fcmVmbGVjdGlvbl90eXBlbGlzdDxfRmlyc3QsIF9SZXN0Li4uPgorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpmYWxzZV90eXBlCQkJCQllbXB0eTsKKworICAgICAgc3RydWN0IGZpcnN0CisgICAgICB7CisJdHlwZWRlZiBfRmlyc3QJCQkJCQl0eXBlOworICAgICAgfTsKKworICAgICAgc3RydWN0IHJlc3QKKyAgICAgIHsKKwl0eXBlZGVmIF9fcmVmbGVjdGlvbl90eXBlbGlzdDxfUmVzdC4uLj4JCQl0eXBlOworICAgICAgfTsKKyAgICB9OworCisgIC8vLyBTZXF1ZW5jZSBhYnN0cmFjdGlvbiBtZXRhZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgYSB0eXBlbGlzdC4KKworCisKKyAgLy8vIEVudW1lcmF0ZSBhbGwgdGhlIGJhc2UgY2xhc3NlcyBvZiBhIGNsYXNzLiBGb3JtIG9mIGEgdHlwZWxpc3QuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYmFzZXMKKyAgICB7CisgICAgICB0eXBlZGVmIF9fcmVmbGVjdGlvbl90eXBlbGlzdDxfX2Jhc2VzKF9UcCkuLi4+CQl0eXBlOworICAgIH07CisKKyAgLy8vIEVudW1lcmF0ZSBhbGwgdGhlIGRpcmVjdCBiYXNlIGNsYXNzZXMgb2YgYSBjbGFzcy4gRm9ybSBvZiBhIHR5cGVsaXN0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGRpcmVjdF9iYXNlcworICAgIHsKKyAgICAgIHR5cGVkZWYgX19yZWZsZWN0aW9uX3R5cGVsaXN0PF9fZGlyZWN0X2Jhc2VzKF9UcCkuLi4+CXR5cGU7CisgICAgfTsKKworICAvLy8gQH0gZ3JvdXAgbWV0YXByb2dyYW1taW5nCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIyX1RZUEVfVFJBSVRTCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3R1cGxlIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90dXBsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWIzMGU1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90dXBsZQpAQCAtMCwwICsxLDEwOTggQEAKKy8vIDx0dXBsZT4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvdHVwbGUKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFVQTEUKKyNkZWZpbmUgX0dMSUJDWFhfVFVQTEUgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxiaXRzL3VzZXNfYWxsb2NhdG9yLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBhZGR0b2dyb3VwIHV0aWxpdGllcworICAgKiAgQHsKKyAgICovCisKKyAgLy8gQWRkcyBhIGNvbnN0IHJlZmVyZW5jZSB0byBhIG5vbi1yZWZlcmVuY2UgdHlwZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2FkZF9jX3JlZgorICAgIHsgdHlwZWRlZiBjb25zdCBfVHAmIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2FkZF9jX3JlZjxfVHAmPgorICAgIHsgdHlwZWRlZiBfVHAmIHR5cGU7IH07CisKKyAgLy8gQWRkcyBhIHJlZmVyZW5jZSB0byBhIG5vbi1yZWZlcmVuY2UgdHlwZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2FkZF9yZWYKKyAgICB7IHR5cGVkZWYgX1RwJiB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hZGRfcmVmPF9UcCY+CisgICAgeyB0eXBlZGVmIF9UcCYgdHlwZTsgfTsKKworICAvLyBBZGRzIGFuIHJ2YWx1ZSByZWZlcmVuY2UgdG8gYSBub24tcmVmZXJlbmNlIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hZGRfcl9yZWYKKyAgICB7IHR5cGVkZWYgX1RwJiYgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fYWRkX3JfcmVmPF9UcCY+CisgICAgeyB0eXBlZGVmIF9UcCYgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSWR4LCB0eXBlbmFtZSBfSGVhZCwgYm9vbCBfSXNFbXB0eU5vdEZpbmFsPgorICAgIHN0cnVjdCBfSGVhZF9iYXNlOworCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JZHgsIHR5cGVuYW1lIF9IZWFkPgorICAgIHN0cnVjdCBfSGVhZF9iYXNlPF9JZHgsIF9IZWFkLCB0cnVlPgorICAgIDogcHVibGljIF9IZWFkCisgICAgeworICAgICAgY29uc3RleHByIF9IZWFkX2Jhc2UoKQorICAgICAgOiBfSGVhZCgpIHsgfQorCisgICAgICBjb25zdGV4cHIgX0hlYWRfYmFzZShjb25zdCBfSGVhZCYgX19oKQorICAgICAgOiBfSGVhZChfX2gpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUhlYWQsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgZW5hYmxlX2lmPCFpc19jb252ZXJ0aWJsZTxfVUhlYWQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191c2VzX2FsbG9jX2Jhc2U+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGNvbnN0ZXhwciBfSGVhZF9iYXNlKF9VSGVhZCYmIF9faCkKKwk6IF9IZWFkKHN0ZDo6Zm9yd2FyZDxfVUhlYWQ+KF9faCkpIHsgfQorCisgICAgICBfSGVhZF9iYXNlKF9fdXNlc19hbGxvYzApCisgICAgICA6IF9IZWFkKCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKwlfSGVhZF9iYXNlKF9fdXNlc19hbGxvYzE8X0FsbG9jPiBfX2EpCisJOiBfSGVhZChhbGxvY2F0b3JfYXJnLCAqX19hLl9NX2EpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisJX0hlYWRfYmFzZShfX3VzZXNfYWxsb2MyPF9BbGxvYz4gX19hKQorCTogX0hlYWQoKl9fYS5fTV9hKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VIZWFkPgorCV9IZWFkX2Jhc2UoX191c2VzX2FsbG9jMCwgX1VIZWFkJiYgX191aGVhZCkKKwk6IF9IZWFkKHN0ZDo6Zm9yd2FyZDxfVUhlYWQ+KF9fdWhlYWQpKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfVUhlYWQ+CisJX0hlYWRfYmFzZShfX3VzZXNfYWxsb2MxPF9BbGxvYz4gX19hLCBfVUhlYWQmJiBfX3VoZWFkKQorCTogX0hlYWQoYWxsb2NhdG9yX2FyZywgKl9fYS5fTV9hLCBzdGQ6OmZvcndhcmQ8X1VIZWFkPihfX3VoZWFkKSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX1VIZWFkPgorCV9IZWFkX2Jhc2UoX191c2VzX2FsbG9jMjxfQWxsb2M+IF9fYSwgX1VIZWFkJiYgX191aGVhZCkKKwk6IF9IZWFkKHN0ZDo6Zm9yd2FyZDxfVUhlYWQ+KF9fdWhlYWQpLCAqX19hLl9NX2EpIHsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIF9IZWFkJgorICAgICAgX01faGVhZChfSGVhZF9iYXNlJiBfX2IpIG5vZXhjZXB0IHsgcmV0dXJuIF9fYjsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IF9IZWFkJgorICAgICAgX01faGVhZChjb25zdCBfSGVhZF9iYXNlJiBfX2IpIG5vZXhjZXB0IHsgcmV0dXJuIF9fYjsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0lkeCwgdHlwZW5hbWUgX0hlYWQ+CisgICAgc3RydWN0IF9IZWFkX2Jhc2U8X0lkeCwgX0hlYWQsIGZhbHNlPgorICAgIHsKKyAgICAgIGNvbnN0ZXhwciBfSGVhZF9iYXNlKCkKKyAgICAgIDogX01faGVhZF9pbXBsKCkgeyB9CisKKyAgICAgIGNvbnN0ZXhwciBfSGVhZF9iYXNlKGNvbnN0IF9IZWFkJiBfX2gpCisgICAgICA6IF9NX2hlYWRfaW1wbChfX2gpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUhlYWQsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgZW5hYmxlX2lmPCFpc19jb252ZXJ0aWJsZTxfVUhlYWQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191c2VzX2FsbG9jX2Jhc2U+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGNvbnN0ZXhwciBfSGVhZF9iYXNlKF9VSGVhZCYmIF9faCkKKwk6IF9NX2hlYWRfaW1wbChzdGQ6OmZvcndhcmQ8X1VIZWFkPihfX2gpKSB7IH0KKworICAgICAgX0hlYWRfYmFzZShfX3VzZXNfYWxsb2MwKQorICAgICAgOiBfTV9oZWFkX2ltcGwoKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorCV9IZWFkX2Jhc2UoX191c2VzX2FsbG9jMTxfQWxsb2M+IF9fYSkKKwk6IF9NX2hlYWRfaW1wbChhbGxvY2F0b3JfYXJnLCAqX19hLl9NX2EpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisJX0hlYWRfYmFzZShfX3VzZXNfYWxsb2MyPF9BbGxvYz4gX19hKQorCTogX01faGVhZF9pbXBsKCpfX2EuX01fYSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSGVhZD4KKwlfSGVhZF9iYXNlKF9fdXNlc19hbGxvYzAsIF9VSGVhZCYmIF9fdWhlYWQpCisJOiBfTV9oZWFkX2ltcGwoc3RkOjpmb3J3YXJkPF9VSGVhZD4oX191aGVhZCkpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9VSGVhZD4KKwlfSGVhZF9iYXNlKF9fdXNlc19hbGxvYzE8X0FsbG9jPiBfX2EsIF9VSGVhZCYmIF9fdWhlYWQpCisJOiBfTV9oZWFkX2ltcGwoYWxsb2NhdG9yX2FyZywgKl9fYS5fTV9hLCBzdGQ6OmZvcndhcmQ8X1VIZWFkPihfX3VoZWFkKSkKKwl7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfVUhlYWQ+CisJX0hlYWRfYmFzZShfX3VzZXNfYWxsb2MyPF9BbGxvYz4gX19hLCBfVUhlYWQmJiBfX3VoZWFkKQorCTogX01faGVhZF9pbXBsKHN0ZDo6Zm9yd2FyZDxfVUhlYWQ+KF9fdWhlYWQpLCAqX19hLl9NX2EpIHsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIF9IZWFkJgorICAgICAgX01faGVhZChfSGVhZF9iYXNlJiBfX2IpIG5vZXhjZXB0IHsgcmV0dXJuIF9fYi5fTV9oZWFkX2ltcGw7IH0KKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBfSGVhZCYKKyAgICAgIF9NX2hlYWQoY29uc3QgX0hlYWRfYmFzZSYgX19iKSBub2V4Y2VwdCB7IHJldHVybiBfX2IuX01faGVhZF9pbXBsOyB9CisKKyAgICAgIF9IZWFkIF9NX2hlYWRfaW1wbDsKKyAgICB9OworCisgIC8qKgorICAgKiBDb250YWlucyB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBAYyB0dXBsZSB0ZW1wbGF0ZSwgc3RvcmVkCisgICAqIGFzIGEgcmVjdXJzaXZlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBmcm9tIHRoZSBmaXJzdCBlbGVtZW50IChtb3N0CisgICAqIGRlcml2ZWQgY2xhc3MpIHRvIHRoZSBsYXN0IChsZWFzdCBkZXJpdmVkIGNsYXNzKS4gVGhlIEBjIElkeAorICAgKiBwYXJhbWV0ZXIgZ2l2ZXMgdGhlIDAtYmFzZWQgaW5kZXggb2YgdGhlIGVsZW1lbnQgc3RvcmVkIGF0IHRoaXMKKyAgICogcG9pbnQgaW4gdGhlIGhpZXJhcmNoeTsgd2UgdXNlIGl0IHRvIGltcGxlbWVudCBhIGNvbnN0YW50LXRpbWUKKyAgICogZ2V0KCkgb3BlcmF0aW9uLgorICAgKi8KKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0lkeCwgdHlwZW5hbWUuLi4gX0VsZW1lbnRzPgorICAgIHN0cnVjdCBfVHVwbGVfaW1wbDsgCisKKyAgLyoqCisgICAqIFplcm8tZWxlbWVudCB0dXBsZSBpbXBsZW1lbnRhdGlvbi4gVGhpcyBpcyB0aGUgYmFzaXMgY2FzZSBmb3IgdGhlIAorICAgKiBpbmhlcml0YW5jZSByZWN1cnNpb24uCisgICAqLworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSWR4PgorICAgIHN0cnVjdCBfVHVwbGVfaW1wbDxfSWR4PgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90LCB0eXBlbmFtZS4uLj4gZnJpZW5kIGNsYXNzIF9UdXBsZV9pbXBsOworCisgICAgICBfVHVwbGVfaW1wbCgpID0gZGVmYXVsdDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgICAgICBfVHVwbGVfaW1wbChhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgICAgIF9UdXBsZV9pbXBsKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jJiwgY29uc3QgX1R1cGxlX2ltcGwmKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgICAgICBfVHVwbGVfaW1wbChhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvYyYsIF9UdXBsZV9pbXBsJiYpIHsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgdm9pZCBfTV9zd2FwKF9UdXBsZV9pbXBsJikgbm9leGNlcHQgeyAvKiBuby1vcCAqLyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfZW1wdHlfbm9uX3R1cGxlIDogaXNfZW1wdHk8X1RwPiB7IH07CisKKyAgLy8gVXNpbmcgRUJPIGZvciBlbGVtZW50cyB0aGF0IGFyZSB0dXBsZXMgY2F1c2VzIGFtYmlndW91cyBiYXNlIGVycm9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0VsMCwgdHlwZW5hbWUuLi4gX0VsPgorICAgIHN0cnVjdCBfX2lzX2VtcHR5X25vbl90dXBsZTx0dXBsZTxfRWwwLCBfRWwuLi4+PiA6IGZhbHNlX3R5cGUgeyB9OworCisgIC8vIFVzZSB0aGUgRW1wdHkgQmFzZS1jbGFzcyBPcHRpbWl6YXRpb24gZm9yIGVtcHR5LCBub24tZmluYWwgdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB1c2luZyBfX2VtcHR5X25vdF9maW5hbAorICAgID0gdHlwZW5hbWUgY29uZGl0aW9uYWw8X19pc19maW5hbChfVHApLCBmYWxzZV90eXBlLAorCQkJICAgX19pc19lbXB0eV9ub25fdHVwbGU8X1RwPj46OnR5cGU7CisKKyAgLyoqCisgICAqIFJlY3Vyc2l2ZSB0dXBsZSBpbXBsZW1lbnRhdGlvbi4gSGVyZSB3ZSBzdG9yZSB0aGUgQGMgSGVhZCBlbGVtZW50CisgICAqIGFuZCBkZXJpdmUgZnJvbSBhIEBjIFR1cGxlX2ltcGwgY29udGFpbmluZyB0aGUgcmVtYWluaW5nIGVsZW1lbnRzCisgICAqICh3aGljaCBjb250YWlucyB0aGUgQGMgVGFpbCkuCisgICAqLworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSWR4LCB0eXBlbmFtZSBfSGVhZCwgdHlwZW5hbWUuLi4gX1RhaWw+CisgICAgc3RydWN0IF9UdXBsZV9pbXBsPF9JZHgsIF9IZWFkLCBfVGFpbC4uLj4KKyAgICA6IHB1YmxpYyBfVHVwbGVfaW1wbDxfSWR4ICsgMSwgX1RhaWwuLi4+LAorICAgICAgcHJpdmF0ZSBfSGVhZF9iYXNlPF9JZHgsIF9IZWFkLCBfX2VtcHR5X25vdF9maW5hbDxfSGVhZD46OnZhbHVlPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90LCB0eXBlbmFtZS4uLj4gZnJpZW5kIGNsYXNzIF9UdXBsZV9pbXBsOworCisgICAgICB0eXBlZGVmIF9UdXBsZV9pbXBsPF9JZHggKyAxLCBfVGFpbC4uLj4gX0luaGVyaXRlZDsKKyAgICAgIHR5cGVkZWYgX0hlYWRfYmFzZTxfSWR4LCBfSGVhZCwgX19lbXB0eV9ub3RfZmluYWw8X0hlYWQ+Ojp2YWx1ZT4gX0Jhc2U7CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX0hlYWQmICAKKyAgICAgIF9NX2hlYWQoX1R1cGxlX2ltcGwmIF9fdCkgbm9leGNlcHQgeyByZXR1cm4gX0Jhc2U6Ol9NX2hlYWQoX190KTsgfQorCisgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IF9IZWFkJgorICAgICAgX01faGVhZChjb25zdCBfVHVwbGVfaW1wbCYgX190KSBub2V4Y2VwdCB7IHJldHVybiBfQmFzZTo6X01faGVhZChfX3QpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX0luaGVyaXRlZCYKKyAgICAgIF9NX3RhaWwoX1R1cGxlX2ltcGwmIF9fdCkgbm9leGNlcHQgeyByZXR1cm4gX190OyB9CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgX0luaGVyaXRlZCYKKyAgICAgIF9NX3RhaWwoY29uc3QgX1R1cGxlX2ltcGwmIF9fdCkgbm9leGNlcHQgeyByZXR1cm4gX190OyB9CisKKyAgICAgIGNvbnN0ZXhwciBfVHVwbGVfaW1wbCgpCisgICAgICA6IF9Jbmhlcml0ZWQoKSwgX0Jhc2UoKSB7IH0KKworICAgICAgZXhwbGljaXQgCisgICAgICBjb25zdGV4cHIgX1R1cGxlX2ltcGwoY29uc3QgX0hlYWQmIF9faGVhZCwgY29uc3QgX1RhaWwmLi4uIF9fdGFpbCkKKyAgICAgIDogX0luaGVyaXRlZChfX3RhaWwuLi4pLCBfQmFzZShfX2hlYWQpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUhlYWQsIHR5cGVuYW1lLi4uIF9VVGFpbCwgdHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICAgICAgICAgZW5hYmxlX2lmPHNpemVvZi4uLihfVGFpbCkgPT0gc2l6ZW9mLi4uKF9VVGFpbCk+Ojp0eXBlPiAKKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgY29uc3RleHByIF9UdXBsZV9pbXBsKF9VSGVhZCYmIF9faGVhZCwgX1VUYWlsJiYuLi4gX190YWlsKQorCTogX0luaGVyaXRlZChzdGQ6OmZvcndhcmQ8X1VUYWlsPihfX3RhaWwpLi4uKSwKKwkgIF9CYXNlKHN0ZDo6Zm9yd2FyZDxfVUhlYWQ+KF9faGVhZCkpIHsgfQorCisgICAgICBjb25zdGV4cHIgX1R1cGxlX2ltcGwoY29uc3QgX1R1cGxlX2ltcGwmKSA9IGRlZmF1bHQ7CisKKyAgICAgIGNvbnN0ZXhwcgorICAgICAgX1R1cGxlX2ltcGwoX1R1cGxlX2ltcGwmJiBfX2luKQorICAgICAgbm9leGNlcHQoX19hbmRfPGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPF9IZWFkPiwKKwkgICAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPF9Jbmhlcml0ZWQ+Pjo6dmFsdWUpCisgICAgICA6IF9Jbmhlcml0ZWQoc3RkOjptb3ZlKF9NX3RhaWwoX19pbikpKSwgCisJX0Jhc2Uoc3RkOjpmb3J3YXJkPF9IZWFkPihfTV9oZWFkKF9faW4pKSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9VRWxlbWVudHM+CisgICAgICAgIGNvbnN0ZXhwciBfVHVwbGVfaW1wbChjb25zdCBfVHVwbGVfaW1wbDxfSWR4LCBfVUVsZW1lbnRzLi4uPiYgX19pbikKKwk6IF9Jbmhlcml0ZWQoX1R1cGxlX2ltcGw8X0lkeCwgX1VFbGVtZW50cy4uLj46Ol9NX3RhaWwoX19pbikpLAorCSAgX0Jhc2UoX1R1cGxlX2ltcGw8X0lkeCwgX1VFbGVtZW50cy4uLj46Ol9NX2hlYWQoX19pbikpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUhlYWQsIHR5cGVuYW1lLi4uIF9VVGFpbHM+CisgICAgICAgIGNvbnN0ZXhwciBfVHVwbGVfaW1wbChfVHVwbGVfaW1wbDxfSWR4LCBfVUhlYWQsIF9VVGFpbHMuLi4+JiYgX19pbikKKwk6IF9Jbmhlcml0ZWQoc3RkOjptb3ZlCisJCSAgICAgKF9UdXBsZV9pbXBsPF9JZHgsIF9VSGVhZCwgX1VUYWlscy4uLj46Ol9NX3RhaWwoX19pbikpKSwKKwkgIF9CYXNlKHN0ZDo6Zm9yd2FyZDxfVUhlYWQ+CisJCShfVHVwbGVfaW1wbDxfSWR4LCBfVUhlYWQsIF9VVGFpbHMuLi4+OjpfTV9oZWFkKF9faW4pKSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKwlfVHVwbGVfaW1wbChhbGxvY2F0b3JfYXJnX3QgX190YWcsIGNvbnN0IF9BbGxvYyYgX19hKQorCTogX0luaGVyaXRlZChfX3RhZywgX19hKSwKKyAgICAgICAgICBfQmFzZShfX3VzZV9hbGxvYzxfSGVhZD4oX19hKSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKwlfVHVwbGVfaW1wbChhbGxvY2F0b3JfYXJnX3QgX190YWcsIGNvbnN0IF9BbGxvYyYgX19hLAorCQkgICAgY29uc3QgX0hlYWQmIF9faGVhZCwgY29uc3QgX1RhaWwmLi4uIF9fdGFpbCkKKwk6IF9Jbmhlcml0ZWQoX190YWcsIF9fYSwgX190YWlsLi4uKSwKKyAgICAgICAgICBfQmFzZShfX3VzZV9hbGxvYzxfSGVhZCwgX0FsbG9jLCBfSGVhZD4oX19hKSwgX19oZWFkKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfVUhlYWQsIHR5cGVuYW1lLi4uIF9VVGFpbCwKKyAgICAgICAgICAgICAgIHR5cGVuYW1lID0gdHlwZW5hbWUgZW5hYmxlX2lmPHNpemVvZi4uLihfVGFpbCkKKwkJCQkJICAgICA9PSBzaXplb2YuLi4oX1VUYWlsKT46OnR5cGU+CisJX1R1cGxlX2ltcGwoYWxsb2NhdG9yX2FyZ190IF9fdGFnLCBjb25zdCBfQWxsb2MmIF9fYSwKKwkgICAgICAgICAgICBfVUhlYWQmJiBfX2hlYWQsIF9VVGFpbCYmLi4uIF9fdGFpbCkKKwk6IF9Jbmhlcml0ZWQoX190YWcsIF9fYSwgc3RkOjpmb3J3YXJkPF9VVGFpbD4oX190YWlsKS4uLiksCisgICAgICAgICAgX0Jhc2UoX191c2VfYWxsb2M8X0hlYWQsIF9BbGxvYywgX1VIZWFkPihfX2EpLAorCSAgICAgICAgc3RkOjpmb3J3YXJkPF9VSGVhZD4oX19oZWFkKSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgICAgX1R1cGxlX2ltcGwoYWxsb2NhdG9yX2FyZ190IF9fdGFnLCBjb25zdCBfQWxsb2MmIF9fYSwKKwkgICAgICAgICAgICBjb25zdCBfVHVwbGVfaW1wbCYgX19pbikKKwk6IF9Jbmhlcml0ZWQoX190YWcsIF9fYSwgX01fdGFpbChfX2luKSksIAorICAgICAgICAgIF9CYXNlKF9fdXNlX2FsbG9jPF9IZWFkLCBfQWxsb2MsIF9IZWFkPihfX2EpLCBfTV9oZWFkKF9faW4pKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorCV9UdXBsZV9pbXBsKGFsbG9jYXRvcl9hcmdfdCBfX3RhZywgY29uc3QgX0FsbG9jJiBfX2EsCisJICAgICAgICAgICAgX1R1cGxlX2ltcGwmJiBfX2luKQorCTogX0luaGVyaXRlZChfX3RhZywgX19hLCBzdGQ6Om1vdmUoX01fdGFpbChfX2luKSkpLCAKKwkgIF9CYXNlKF9fdXNlX2FsbG9jPF9IZWFkLCBfQWxsb2MsIF9IZWFkPihfX2EpLAorCSAgICAgICAgc3RkOjpmb3J3YXJkPF9IZWFkPihfTV9oZWFkKF9faW4pKSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUuLi4gX1VFbGVtZW50cz4KKwlfVHVwbGVfaW1wbChhbGxvY2F0b3JfYXJnX3QgX190YWcsIGNvbnN0IF9BbGxvYyYgX19hLAorCSAgICAgICAgICAgIGNvbnN0IF9UdXBsZV9pbXBsPF9JZHgsIF9VRWxlbWVudHMuLi4+JiBfX2luKQorCTogX0luaGVyaXRlZChfX3RhZywgX19hLAorCQkgICAgIF9UdXBsZV9pbXBsPF9JZHgsIF9VRWxlbWVudHMuLi4+OjpfTV90YWlsKF9faW4pKSwKKwkgIF9CYXNlKF9fdXNlX2FsbG9jPF9IZWFkLCBfQWxsb2MsIF9IZWFkPihfX2EpLAorCQlfVHVwbGVfaW1wbDxfSWR4LCBfVUVsZW1lbnRzLi4uPjo6X01faGVhZChfX2luKSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX1VIZWFkLCB0eXBlbmFtZS4uLiBfVVRhaWxzPgorCV9UdXBsZV9pbXBsKGFsbG9jYXRvcl9hcmdfdCBfX3RhZywgY29uc3QgX0FsbG9jJiBfX2EsCisJICAgICAgICAgICAgX1R1cGxlX2ltcGw8X0lkeCwgX1VIZWFkLCBfVVRhaWxzLi4uPiYmIF9faW4pCisJOiBfSW5oZXJpdGVkKF9fdGFnLCBfX2EsIHN0ZDo6bW92ZQorCQkgICAgIChfVHVwbGVfaW1wbDxfSWR4LCBfVUhlYWQsIF9VVGFpbHMuLi4+OjpfTV90YWlsKF9faW4pKSksCisJICBfQmFzZShfX3VzZV9hbGxvYzxfSGVhZCwgX0FsbG9jLCBfVUhlYWQ+KF9fYSksCisgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkPF9VSGVhZD4KKwkJKF9UdXBsZV9pbXBsPF9JZHgsIF9VSGVhZCwgX1VUYWlscy4uLj46Ol9NX2hlYWQoX19pbikpKSB7IH0KKworICAgICAgX1R1cGxlX2ltcGwmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1R1cGxlX2ltcGwmIF9faW4pCisgICAgICB7CisJX01faGVhZCgqdGhpcykgPSBfTV9oZWFkKF9faW4pOworCV9NX3RhaWwoKnRoaXMpID0gX01fdGFpbChfX2luKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9UdXBsZV9pbXBsJgorICAgICAgb3BlcmF0b3I9KF9UdXBsZV9pbXBsJiYgX19pbikKKyAgICAgIG5vZXhjZXB0KF9fYW5kXzxpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfSGVhZD4sCisJICAgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfSW5oZXJpdGVkPj46OnZhbHVlKQorICAgICAgeworCV9NX2hlYWQoKnRoaXMpID0gc3RkOjpmb3J3YXJkPF9IZWFkPihfTV9oZWFkKF9faW4pKTsKKwlfTV90YWlsKCp0aGlzKSA9IHN0ZDo6bW92ZShfTV90YWlsKF9faW4pKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9VRWxlbWVudHM+CisgICAgICAgIF9UdXBsZV9pbXBsJgorICAgICAgICBvcGVyYXRvcj0oY29uc3QgX1R1cGxlX2ltcGw8X0lkeCwgX1VFbGVtZW50cy4uLj4mIF9faW4pCisgICAgICAgIHsKKwkgIF9NX2hlYWQoKnRoaXMpID0gX1R1cGxlX2ltcGw8X0lkeCwgX1VFbGVtZW50cy4uLj46Ol9NX2hlYWQoX19pbik7CisJICBfTV90YWlsKCp0aGlzKSA9IF9UdXBsZV9pbXBsPF9JZHgsIF9VRWxlbWVudHMuLi4+OjpfTV90YWlsKF9faW4pOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VIZWFkLCB0eXBlbmFtZS4uLiBfVVRhaWxzPgorICAgICAgICBfVHVwbGVfaW1wbCYKKyAgICAgICAgb3BlcmF0b3I9KF9UdXBsZV9pbXBsPF9JZHgsIF9VSGVhZCwgX1VUYWlscy4uLj4mJiBfX2luKQorICAgICAgICB7CisJICBfTV9oZWFkKCp0aGlzKSA9IHN0ZDo6Zm9yd2FyZDxfVUhlYWQ+CisJICAgIChfVHVwbGVfaW1wbDxfSWR4LCBfVUhlYWQsIF9VVGFpbHMuLi4+OjpfTV9oZWFkKF9faW4pKTsKKwkgIF9NX3RhaWwoKnRoaXMpID0gc3RkOjptb3ZlCisJICAgIChfVHVwbGVfaW1wbDxfSWR4LCBfVUhlYWQsIF9VVGFpbHMuLi4+OjpfTV90YWlsKF9faW4pKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2b2lkCisgICAgICBfTV9zd2FwKF9UdXBsZV9pbXBsJiBfX2luKQorICAgICAgbm9leGNlcHQobm9leGNlcHQoc3dhcChzdGQ6OmRlY2x2YWw8X0hlYWQmPigpLAorCQkJICAgICBzdGQ6OmRlY2x2YWw8X0hlYWQmPigpKSkKKwkgICAgICAgJiYgbm9leGNlcHQoX01fdGFpbChfX2luKS5fTV9zd2FwKF9NX3RhaWwoX19pbikpKSkKKyAgICAgIHsKKwl1c2luZyBzdGQ6OnN3YXA7CisJc3dhcChfTV9oZWFkKCp0aGlzKSwgX01faGVhZChfX2luKSk7CisJX0luaGVyaXRlZDo6X01fc3dhcChfTV90YWlsKF9faW4pKTsKKyAgICAgIH0KKyAgICB9OworCisgIC8vLyBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlLCB0dXBsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfRWxlbWVudHM+IAorICAgIGNsYXNzIHR1cGxlIDogcHVibGljIF9UdXBsZV9pbXBsPDAsIF9FbGVtZW50cy4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9UdXBsZV9pbXBsPDAsIF9FbGVtZW50cy4uLj4gX0luaGVyaXRlZDsKKworICAgIHB1YmxpYzoKKyAgICAgIGNvbnN0ZXhwciB0dXBsZSgpCisgICAgICA6IF9Jbmhlcml0ZWQoKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGNvbnN0ZXhwciB0dXBsZShjb25zdCBfRWxlbWVudHMmLi4uIF9fZWxlbWVudHMpCisgICAgICA6IF9Jbmhlcml0ZWQoX19lbGVtZW50cy4uLikgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9VRWxlbWVudHMsIHR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgZW5hYmxlX2lmPF9fYW5kXzxpc19jb252ZXJ0aWJsZTxfVUVsZW1lbnRzLAorCQkJCQlfRWxlbWVudHM+Li4uPjo6dmFsdWU+Ojp0eXBlPgorCWV4cGxpY2l0CisgICAgICAgIGNvbnN0ZXhwciB0dXBsZShfVUVsZW1lbnRzJiYuLi4gX19lbGVtZW50cykKKwk6IF9Jbmhlcml0ZWQoc3RkOjpmb3J3YXJkPF9VRWxlbWVudHM+KF9fZWxlbWVudHMpLi4uKSB7CX0KKworICAgICAgY29uc3RleHByIHR1cGxlKGNvbnN0IHR1cGxlJikgPSBkZWZhdWx0OworCisgICAgICBjb25zdGV4cHIgdHVwbGUodHVwbGUmJikgPSBkZWZhdWx0OyAKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1VFbGVtZW50cywgdHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBlbmFibGVfaWY8X19hbmRfPGlzX2NvbnZlcnRpYmxlPGNvbnN0IF9VRWxlbWVudHMmLAorCQkJCQlfRWxlbWVudHM+Li4uPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBjb25zdGV4cHIgdHVwbGUoY29uc3QgdHVwbGU8X1VFbGVtZW50cy4uLj4mIF9faW4pCisgICAgICAgIDogX0luaGVyaXRlZChzdGF0aWNfY2FzdDxjb25zdCBfVHVwbGVfaW1wbDwwLCBfVUVsZW1lbnRzLi4uPiY+KF9faW4pKQorICAgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1VFbGVtZW50cywgdHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBlbmFibGVfaWY8X19hbmRfPGlzX2NvbnZlcnRpYmxlPF9VRWxlbWVudHMsCisJCQkJCV9FbGVtZW50cz4uLi4+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGNvbnN0ZXhwciB0dXBsZSh0dXBsZTxfVUVsZW1lbnRzLi4uPiYmIF9faW4pCisgICAgICAgIDogX0luaGVyaXRlZChzdGF0aWNfY2FzdDxfVHVwbGVfaW1wbDwwLCBfVUVsZW1lbnRzLi4uPiYmPihfX2luKSkgeyB9CisKKyAgICAgIC8vIEFsbG9jYXRvci1leHRlbmRlZCBjb25zdHJ1Y3RvcnMuCisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKwl0dXBsZShhbGxvY2F0b3JfYXJnX3QgX190YWcsIGNvbnN0IF9BbGxvYyYgX19hKQorCTogX0luaGVyaXRlZChfX3RhZywgX19hKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorCXR1cGxlKGFsbG9jYXRvcl9hcmdfdCBfX3RhZywgY29uc3QgX0FsbG9jJiBfX2EsCisJICAgICAgY29uc3QgX0VsZW1lbnRzJi4uLiBfX2VsZW1lbnRzKQorCTogX0luaGVyaXRlZChfX3RhZywgX19hLCBfX2VsZW1lbnRzLi4uKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIGVuYWJsZV9pZjxzaXplb2YuLi4oX1VFbGVtZW50cykKKwkJCSA9PSBzaXplb2YuLi4oX0VsZW1lbnRzKT46OnR5cGU+CisJdHVwbGUoYWxsb2NhdG9yX2FyZ190IF9fdGFnLCBjb25zdCBfQWxsb2MmIF9fYSwKKwkgICAgICBfVUVsZW1lbnRzJiYuLi4gX19lbGVtZW50cykKKwk6IF9Jbmhlcml0ZWQoX190YWcsIF9fYSwgc3RkOjpmb3J3YXJkPF9VRWxlbWVudHM+KF9fZWxlbWVudHMpLi4uKQorICAgICAgIAl7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorCXR1cGxlKGFsbG9jYXRvcl9hcmdfdCBfX3RhZywgY29uc3QgX0FsbG9jJiBfX2EsIGNvbnN0IHR1cGxlJiBfX2luKQorCTogX0luaGVyaXRlZChfX3RhZywgX19hLCBzdGF0aWNfY2FzdDxjb25zdCBfSW5oZXJpdGVkJj4oX19pbikpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisJdHVwbGUoYWxsb2NhdG9yX2FyZ190IF9fdGFnLCBjb25zdCBfQWxsb2MmIF9fYSwgdHVwbGUmJiBfX2luKQorCTogX0luaGVyaXRlZChfX3RhZywgX19hLCBzdGF0aWNfY2FzdDxfSW5oZXJpdGVkJiY+KF9faW4pKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIGVuYWJsZV9pZjxzaXplb2YuLi4oX1VFbGVtZW50cykKKwkJCSA9PSBzaXplb2YuLi4oX0VsZW1lbnRzKT46OnR5cGU+CisJdHVwbGUoYWxsb2NhdG9yX2FyZ190IF9fdGFnLCBjb25zdCBfQWxsb2MmIF9fYSwKKwkgICAgICBjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX19pbikKKwk6IF9Jbmhlcml0ZWQoX190YWcsIF9fYSwKKwkgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgX1R1cGxlX2ltcGw8MCwgX1VFbGVtZW50cy4uLj4mPihfX2luKSkKKwl7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIGVuYWJsZV9pZjxzaXplb2YuLi4oX1VFbGVtZW50cykKKwkJCSA9PSBzaXplb2YuLi4oX0VsZW1lbnRzKT46OnR5cGU+CisJdHVwbGUoYWxsb2NhdG9yX2FyZ190IF9fdGFnLCBjb25zdCBfQWxsb2MmIF9fYSwKKwkgICAgICB0dXBsZTxfVUVsZW1lbnRzLi4uPiYmIF9faW4pCisJOiBfSW5oZXJpdGVkKF9fdGFnLCBfX2EsCisJICAgICAgICAgICAgIHN0YXRpY19jYXN0PF9UdXBsZV9pbXBsPDAsIF9VRWxlbWVudHMuLi4+JiY+KF9faW4pKQorCXsgfQorCisgICAgICB0dXBsZSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgX19pbikKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfSW5oZXJpdGVkJj4oKnRoaXMpID0gX19pbjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHR1cGxlJgorICAgICAgb3BlcmF0b3I9KHR1cGxlJiYgX19pbikKKyAgICAgIG5vZXhjZXB0KGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPF9Jbmhlcml0ZWQ+Ojp2YWx1ZSkKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfSW5oZXJpdGVkJj4oKnRoaXMpID0gc3RkOjptb3ZlKF9faW4pOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1VFbGVtZW50cywgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBlbmFibGVfaWY8c2l6ZW9mLi4uKF9VRWxlbWVudHMpCisJCQkgPT0gc2l6ZW9mLi4uKF9FbGVtZW50cyk+Ojp0eXBlPgorICAgICAgICB0dXBsZSYKKyAgICAgICAgb3BlcmF0b3I9KGNvbnN0IHR1cGxlPF9VRWxlbWVudHMuLi4+JiBfX2luKQorICAgICAgICB7CisJICBzdGF0aWNfY2FzdDxfSW5oZXJpdGVkJj4oKnRoaXMpID0gX19pbjsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9VRWxlbWVudHMsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgZW5hYmxlX2lmPHNpemVvZi4uLihfVUVsZW1lbnRzKQorCQkJID09IHNpemVvZi4uLihfRWxlbWVudHMpPjo6dHlwZT4KKyAgICAgICAgdHVwbGUmCisgICAgICAgIG9wZXJhdG9yPSh0dXBsZTxfVUVsZW1lbnRzLi4uPiYmIF9faW4pCisgICAgICAgIHsKKwkgIHN0YXRpY19jYXN0PF9Jbmhlcml0ZWQmPigqdGhpcykgPSBzdGQ6Om1vdmUoX19pbik7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHR1cGxlJiBfX2luKQorICAgICAgbm9leGNlcHQobm9leGNlcHQoX19pbi5fTV9zd2FwKF9faW4pKSkKKyAgICAgIHsgX0luaGVyaXRlZDo6X01fc3dhcChfX2luKTsgfQorICAgIH07CisKKyAgLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24sIHplcm8tZWxlbWVudCB0dXBsZS4KKyAgdGVtcGxhdGU8PiAgCisgICAgY2xhc3MgdHVwbGU8PgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB2b2lkIHN3YXAodHVwbGUmKSBub2V4Y2VwdCB7IC8qIG5vLW9wICovIH0KKyAgICB9OworCisgIC8vLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uLCAyLWVsZW1lbnQgdHVwbGUuCisgIC8vLyBJbmNsdWRlcyBjb25zdHJ1Y3Rpb24gYW5kIGFzc2lnbm1lbnQgZnJvbSBhIHBhaXIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICAgIGNsYXNzIHR1cGxlPF9UMSwgX1QyPiA6IHB1YmxpYyBfVHVwbGVfaW1wbDwwLCBfVDEsIF9UMj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9UdXBsZV9pbXBsPDAsIF9UMSwgX1QyPiBfSW5oZXJpdGVkOworCisgICAgcHVibGljOgorICAgICAgY29uc3RleHByIHR1cGxlKCkKKyAgICAgIDogX0luaGVyaXRlZCgpIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgY29uc3RleHByIHR1cGxlKGNvbnN0IF9UMSYgX19hMSwgY29uc3QgX1QyJiBfX2EyKQorICAgICAgOiBfSW5oZXJpdGVkKF9fYTEsIF9fYTIpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVTEsIHR5cGVuYW1lIF9VMiwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBlbmFibGVfaWY8X19hbmRfPGlzX2NvbnZlcnRpYmxlPF9VMSwgX1QxPiwKKwkJCQlpc19jb252ZXJ0aWJsZTxfVTIsIF9UMj4+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIGNvbnN0ZXhwciB0dXBsZShfVTEmJiBfX2ExLCBfVTImJiBfX2EyKQorCTogX0luaGVyaXRlZChzdGQ6OmZvcndhcmQ8X1UxPihfX2ExKSwgc3RkOjpmb3J3YXJkPF9VMj4oX19hMikpIHsgfQorCisgICAgICBjb25zdGV4cHIgdHVwbGUoY29uc3QgdHVwbGUmKSA9IGRlZmF1bHQ7CisKKyAgICAgIGNvbnN0ZXhwciB0dXBsZSh0dXBsZSYmKSA9IGRlZmF1bHQ7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VMSwgdHlwZW5hbWUgX1UyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJZW5hYmxlX2lmPF9fYW5kXzxpc19jb252ZXJ0aWJsZTxjb25zdCBfVTEmLCBfVDE+LAorCQkJIGlzX2NvbnZlcnRpYmxlPGNvbnN0IF9VMiYsIF9UMj4+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGNvbnN0ZXhwciB0dXBsZShjb25zdCB0dXBsZTxfVTEsIF9VMj4mIF9faW4pCisJOiBfSW5oZXJpdGVkKHN0YXRpY19jYXN0PGNvbnN0IF9UdXBsZV9pbXBsPDAsIF9VMSwgX1UyPiY+KF9faW4pKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1UxLCB0eXBlbmFtZSBfVTIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgZW5hYmxlX2lmPF9fYW5kXzxpc19jb252ZXJ0aWJsZTxfVTEsIF9UMT4sCisJCQkJaXNfY29udmVydGlibGU8X1UyLCBfVDI+Pjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBjb25zdGV4cHIgdHVwbGUodHVwbGU8X1UxLCBfVTI+JiYgX19pbikKKwk6IF9Jbmhlcml0ZWQoc3RhdGljX2Nhc3Q8X1R1cGxlX2ltcGw8MCwgX1UxLCBfVTI+JiY+KF9faW4pKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1UxLCB0eXBlbmFtZSBfVTIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwllbmFibGVfaWY8X19hbmRfPGlzX2NvbnZlcnRpYmxlPGNvbnN0IF9VMSYsIF9UMT4sCisJCQkgaXNfY29udmVydGlibGU8Y29uc3QgX1UyJiwgX1QyPj46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgY29uc3RleHByIHR1cGxlKGNvbnN0IHBhaXI8X1UxLCBfVTI+JiBfX2luKQorCTogX0luaGVyaXRlZChfX2luLmZpcnN0LCBfX2luLnNlY29uZCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VMSwgdHlwZW5hbWUgX1UyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIGVuYWJsZV9pZjxfX2FuZF88aXNfY29udmVydGlibGU8X1UxLCBfVDE+LAorCQkJCWlzX2NvbnZlcnRpYmxlPF9VMiwgX1QyPj46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgY29uc3RleHByIHR1cGxlKHBhaXI8X1UxLCBfVTI+JiYgX19pbikKKwk6IF9Jbmhlcml0ZWQoc3RkOjpmb3J3YXJkPF9VMT4oX19pbi5maXJzdCksCisJCSAgICAgc3RkOjpmb3J3YXJkPF9VMj4oX19pbi5zZWNvbmQpKSB7IH0KKworICAgICAgLy8gQWxsb2NhdG9yLWV4dGVuZGVkIGNvbnN0cnVjdG9ycy4KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorCXR1cGxlKGFsbG9jYXRvcl9hcmdfdCBfX3RhZywgY29uc3QgX0FsbG9jJiBfX2EpCisJOiBfSW5oZXJpdGVkKF9fdGFnLCBfX2EpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisJdHVwbGUoYWxsb2NhdG9yX2FyZ190IF9fdGFnLCBjb25zdCBfQWxsb2MmIF9fYSwKKwkgICAgICBjb25zdCBfVDEmIF9fYTEsIGNvbnN0IF9UMiYgX19hMikKKwk6IF9Jbmhlcml0ZWQoX190YWcsIF9fYSwgX19hMSwgX19hMikgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX1UxLCB0eXBlbmFtZSBfVTI+CisJdHVwbGUoYWxsb2NhdG9yX2FyZ190IF9fdGFnLCBjb25zdCBfQWxsb2MmIF9fYSwgX1UxJiYgX19hMSwgX1UyJiYgX19hMikKKwk6IF9Jbmhlcml0ZWQoX190YWcsIF9fYSwgc3RkOjpmb3J3YXJkPF9VMT4oX19hMSksCisJICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxfVTI+KF9fYTIpKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorCXR1cGxlKGFsbG9jYXRvcl9hcmdfdCBfX3RhZywgY29uc3QgX0FsbG9jJiBfX2EsIGNvbnN0IHR1cGxlJiBfX2luKQorCTogX0luaGVyaXRlZChfX3RhZywgX19hLCBzdGF0aWNfY2FzdDxjb25zdCBfSW5oZXJpdGVkJj4oX19pbikpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisJdHVwbGUoYWxsb2NhdG9yX2FyZ190IF9fdGFnLCBjb25zdCBfQWxsb2MmIF9fYSwgdHVwbGUmJiBfX2luKQorCTogX0luaGVyaXRlZChfX3RhZywgX19hLCBzdGF0aWNfY2FzdDxfSW5oZXJpdGVkJiY+KF9faW4pKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZSBfVTEsIHR5cGVuYW1lIF9VMj4KKwl0dXBsZShhbGxvY2F0b3JfYXJnX3QgX190YWcsIGNvbnN0IF9BbGxvYyYgX19hLAorCSAgICAgIGNvbnN0IHR1cGxlPF9VMSwgX1UyPiYgX19pbikKKwk6IF9Jbmhlcml0ZWQoX190YWcsIF9fYSwKKwkgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgX1R1cGxlX2ltcGw8MCwgX1UxLCBfVTI+Jj4oX19pbikpCisJeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX1UxLCB0eXBlbmFtZSBfVTI+CisJdHVwbGUoYWxsb2NhdG9yX2FyZ190IF9fdGFnLCBjb25zdCBfQWxsb2MmIF9fYSwgdHVwbGU8X1UxLCBfVTI+JiYgX19pbikKKwk6IF9Jbmhlcml0ZWQoX190YWcsIF9fYSwgc3RhdGljX2Nhc3Q8X1R1cGxlX2ltcGw8MCwgX1UxLCBfVTI+JiY+KF9faW4pKQorCXsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lIF9VMSwgdHlwZW5hbWUgX1UyPgorICAgICAgICB0dXBsZShhbGxvY2F0b3JfYXJnX3QgX190YWcsIGNvbnN0IF9BbGxvYyYgX19hLAorCSAgICAgIGNvbnN0IHBhaXI8X1UxLCBfVTI+JiBfX2luKQorCTogX0luaGVyaXRlZChfX3RhZywgX19hLCBfX2luLmZpcnN0LCBfX2luLnNlY29uZCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUgX1UxLCB0eXBlbmFtZSBfVTI+CisgICAgICAgIHR1cGxlKGFsbG9jYXRvcl9hcmdfdCBfX3RhZywgY29uc3QgX0FsbG9jJiBfX2EsIHBhaXI8X1UxLCBfVTI+JiYgX19pbikKKwk6IF9Jbmhlcml0ZWQoX190YWcsIF9fYSwgc3RkOjpmb3J3YXJkPF9VMT4oX19pbi5maXJzdCksCisJCSAgICAgc3RkOjpmb3J3YXJkPF9VMj4oX19pbi5zZWNvbmQpKSB7IH0KKworICAgICAgdHVwbGUmCisgICAgICBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIF9faW4pCisgICAgICB7CisJc3RhdGljX2Nhc3Q8X0luaGVyaXRlZCY+KCp0aGlzKSA9IF9faW47CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB0dXBsZSYKKyAgICAgIG9wZXJhdG9yPSh0dXBsZSYmIF9faW4pCisgICAgICBub2V4Y2VwdChpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxfSW5oZXJpdGVkPjo6dmFsdWUpCisgICAgICB7CisJc3RhdGljX2Nhc3Q8X0luaGVyaXRlZCY+KCp0aGlzKSA9IHN0ZDo6bW92ZShfX2luKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VMSwgdHlwZW5hbWUgX1UyPgorICAgICAgICB0dXBsZSYKKyAgICAgICAgb3BlcmF0b3I9KGNvbnN0IHR1cGxlPF9VMSwgX1UyPiYgX19pbikKKyAgICAgICAgeworCSAgc3RhdGljX2Nhc3Q8X0luaGVyaXRlZCY+KCp0aGlzKSA9IF9faW47CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVTEsIHR5cGVuYW1lIF9VMj4KKyAgICAgICAgdHVwbGUmCisgICAgICAgIG9wZXJhdG9yPSh0dXBsZTxfVTEsIF9VMj4mJiBfX2luKQorICAgICAgICB7CisJICBzdGF0aWNfY2FzdDxfSW5oZXJpdGVkJj4oKnRoaXMpID0gc3RkOjptb3ZlKF9faW4pOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1UxLCB0eXBlbmFtZSBfVTI+CisgICAgICAgIHR1cGxlJgorICAgICAgICBvcGVyYXRvcj0oY29uc3QgcGFpcjxfVTEsIF9VMj4mIF9faW4pCisgICAgICAgIHsKKwkgIHRoaXMtPl9NX2hlYWQoKnRoaXMpID0gX19pbi5maXJzdDsKKwkgIHRoaXMtPl9NX3RhaWwoKnRoaXMpLl9NX2hlYWQoKnRoaXMpID0gX19pbi5zZWNvbmQ7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVTEsIHR5cGVuYW1lIF9VMj4KKyAgICAgICAgdHVwbGUmCisgICAgICAgIG9wZXJhdG9yPShwYWlyPF9VMSwgX1UyPiYmIF9faW4pCisgICAgICAgIHsKKwkgIHRoaXMtPl9NX2hlYWQoKnRoaXMpID0gc3RkOjpmb3J3YXJkPF9VMT4oX19pbi5maXJzdCk7CisJICB0aGlzLT5fTV90YWlsKCp0aGlzKS5fTV9oZWFkKCp0aGlzKSA9IHN0ZDo6Zm9yd2FyZDxfVTI+KF9faW4uc2Vjb25kKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodHVwbGUmIF9faW4pCisgICAgICBub2V4Y2VwdChub2V4Y2VwdChfX2luLl9NX3N3YXAoX19pbikpKQorICAgICAgeyBfSW5oZXJpdGVkOjpfTV9zd2FwKF9faW4pOyB9CisgICAgfTsKKworCisgIC8vLyBHaXZlcyB0aGUgdHlwZSBvZiB0aGUgaXRoIGVsZW1lbnQgb2YgYSBnaXZlbiB0dXBsZSB0eXBlLgorICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfX2ksIHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgdHVwbGVfZWxlbWVudDsKKworICAvKioKKyAgICogUmVjdXJzaXZlIGNhc2UgZm9yIHR1cGxlX2VsZW1lbnQ6IHN0cmlwIG9mZiB0aGUgZmlyc3QgZWxlbWVudCBpbgorICAgKiB0aGUgdHVwbGUgYW5kIHJldHJpZXZlIHRoZSAoaS0xKXRoIGVsZW1lbnQgb2YgdGhlIHJlbWFpbmluZyB0dXBsZS4KKyAgICovCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9faSwgdHlwZW5hbWUgX0hlYWQsIHR5cGVuYW1lLi4uIF9UYWlsPgorICAgIHN0cnVjdCB0dXBsZV9lbGVtZW50PF9faSwgdHVwbGU8X0hlYWQsIF9UYWlsLi4uPiA+CisgICAgOiB0dXBsZV9lbGVtZW50PF9faSAtIDEsIHR1cGxlPF9UYWlsLi4uPiA+IHsgfTsKKworICAvKioKKyAgICogQmFzaXMgY2FzZSBmb3IgdHVwbGVfZWxlbWVudDogVGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIG9uZSB3ZSdyZSBzZWVraW5nLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0hlYWQsIHR5cGVuYW1lLi4uIF9UYWlsPgorICAgIHN0cnVjdCB0dXBsZV9lbGVtZW50PDAsIHR1cGxlPF9IZWFkLCBfVGFpbC4uLj4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0hlYWQgdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9faSwgdHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCB0dXBsZV9lbGVtZW50PF9faSwgY29uc3QgX1RwPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICAgIGFkZF9jb25zdDx0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9faSwgX1RwPjo6dHlwZT46OnR5cGUgdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9faSwgdHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCB0dXBsZV9lbGVtZW50PF9faSwgdm9sYXRpbGUgX1RwPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICAgIGFkZF92b2xhdGlsZTx0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9faSwgX1RwPjo6dHlwZT46OnR5cGUgdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9faSwgdHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCB0dXBsZV9lbGVtZW50PF9faSwgY29uc3Qgdm9sYXRpbGUgX1RwPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICAgIGFkZF9jdjx0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9faSwgX1RwPjo6dHlwZT46OnR5cGUgdHlwZTsKKyAgICB9OworCisgIC8vLyBGaW5kcyB0aGUgc2l6ZSBvZiBhIGdpdmVuIHR1cGxlIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgdHVwbGVfc2l6ZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHR1cGxlX3NpemU8Y29uc3QgX1RwPgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PAorICAgICAgICAgICAgIHR5cGVuYW1lIHJlbW92ZV9jdjxkZWNsdHlwZSh0dXBsZV9zaXplPF9UcD46OnZhbHVlKT46OnR5cGUsCisgICAgICAgICAgICAgdHVwbGVfc2l6ZTxfVHA+Ojp2YWx1ZT4geyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgdHVwbGVfc2l6ZTx2b2xhdGlsZSBfVHA+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8CisgICAgICAgICAgICAgdHlwZW5hbWUgcmVtb3ZlX2N2PGRlY2x0eXBlKHR1cGxlX3NpemU8X1RwPjo6dmFsdWUpPjo6dHlwZSwKKyAgICAgICAgICAgICB0dXBsZV9zaXplPF9UcD46OnZhbHVlPiB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCB0dXBsZV9zaXplPGNvbnN0IHZvbGF0aWxlIF9UcD4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDwKKyAgICAgICAgICAgICB0eXBlbmFtZSByZW1vdmVfY3Y8ZGVjbHR5cGUodHVwbGVfc2l6ZTxfVHA+Ojp2YWx1ZSk+Ojp0eXBlLAorICAgICAgICAgICAgIHR1cGxlX3NpemU8X1RwPjo6dmFsdWU+IHsgfTsKKworICAvLy8gY2xhc3MgdHVwbGVfc2l6ZQorICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfRWxlbWVudHM+CisgICAgc3RydWN0IHR1cGxlX3NpemU8dHVwbGU8X0VsZW1lbnRzLi4uPj4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwgc2l6ZW9mLi4uKF9FbGVtZW50cyk+IHsgfTsKKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfX2ksIHR5cGVuYW1lIF9IZWFkLCB0eXBlbmFtZS4uLiBfVGFpbD4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19hZGRfcmVmPF9IZWFkPjo6dHlwZQorICAgIF9fZ2V0X2hlbHBlcihfVHVwbGVfaW1wbDxfX2ksIF9IZWFkLCBfVGFpbC4uLj4mIF9fdCkgbm9leGNlcHQKKyAgICB7IHJldHVybiBfVHVwbGVfaW1wbDxfX2ksIF9IZWFkLCBfVGFpbC4uLj46Ol9NX2hlYWQoX190KTsgfQorCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9faSwgdHlwZW5hbWUgX0hlYWQsIHR5cGVuYW1lLi4uIF9UYWlsPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2FkZF9jX3JlZjxfSGVhZD46OnR5cGUKKyAgICBfX2dldF9oZWxwZXIoY29uc3QgX1R1cGxlX2ltcGw8X19pLCBfSGVhZCwgX1RhaWwuLi4+JiBfX3QpIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX1R1cGxlX2ltcGw8X19pLCBfSGVhZCwgX1RhaWwuLi4+OjpfTV9oZWFkKF9fdCk7IH0KKworICAvLyBSZXR1cm4gYSByZWZlcmVuY2UgKGNvbnN0IHJlZmVyZW5jZSwgcnZhbHVlIHJlZmVyZW5jZSkgdG8gdGhlIGl0aCBlbGVtZW50CisgIC8vIG9mIGEgdHVwbGUuICBBbnkgY29uc3Qgb3Igbm9uLWNvbnN0IHJlZiBlbGVtZW50cyBhcmUgcmV0dXJuZWQgd2l0aCB0aGVpcgorICAvLyBvcmlnaW5hbCB0eXBlLgorICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfX2ksIHR5cGVuYW1lLi4uIF9FbGVtZW50cz4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19hZGRfcmVmPAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X19pLCB0dXBsZTxfRWxlbWVudHMuLi4+Pjo6dHlwZQorICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlCisgICAgZ2V0KHR1cGxlPF9FbGVtZW50cy4uLj4mIF9fdCkgbm9leGNlcHQKKyAgICB7IHJldHVybiBzdGQ6Ol9fZ2V0X2hlbHBlcjxfX2k+KF9fdCk7IH0KKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfX2ksIHR5cGVuYW1lLi4uIF9FbGVtZW50cz4KKyAgICBjb25zdGV4cHIgdHlwZW5hbWUgX19hZGRfY19yZWY8CisgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfX2ksIHR1cGxlPF9FbGVtZW50cy4uLj4+Ojp0eXBlCisgICAgICAgICAgICAgICAgICAgID46OnR5cGUKKyAgICBnZXQoY29uc3QgdHVwbGU8X0VsZW1lbnRzLi4uPiYgX190KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIHN0ZDo6X19nZXRfaGVscGVyPF9faT4oX190KTsgfQorCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9faSwgdHlwZW5hbWUuLi4gX0VsZW1lbnRzPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSBfX2FkZF9yX3JlZjwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9faSwgdHVwbGU8X0VsZW1lbnRzLi4uPj46OnR5cGUKKyAgICAgICAgICAgICAgICAgICAgPjo6dHlwZQorICAgIGdldCh0dXBsZTxfRWxlbWVudHMuLi4+JiYgX190KSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIHN0ZDo6Zm9yd2FyZDx0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9faSwKKwl0dXBsZTxfRWxlbWVudHMuLi4+Pjo6dHlwZSYmPihnZXQ8X19pPihfX3QpKTsgfQorCisgIC8vIFRoaXMgY2xhc3MgaGVscHMgY29uc3RydWN0IHRoZSB2YXJpb3VzIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBvbiB0dXBsZXMKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX19jaGVja19lcXVhbF9zaXplLCBzdGQ6OnNpemVfdCBfX2ksIHN0ZDo6c2l6ZV90IF9faiwKKwkgICB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBzdHJ1Y3QgX190dXBsZV9jb21wYXJlOworCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9faSwgc3RkOjpzaXplX3QgX19qLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBzdHJ1Y3QgX190dXBsZV9jb21wYXJlPDAsIF9faSwgX19qLCBfVHAsIF9VcD4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgCisgICAgICBfX2VxKGNvbnN0IF9UcCYgX190LCBjb25zdCBfVXAmIF9fdSkKKyAgICAgIHsKKwlyZXR1cm4gKGdldDxfX2k+KF9fdCkgPT0gZ2V0PF9faT4oX191KSAmJgorCQlfX3R1cGxlX2NvbXBhcmU8MCwgX19pICsgMSwgX19qLCBfVHAsIF9VcD46Ol9fZXEoX190LCBfX3UpKTsKKyAgICAgIH0KKyAgICAgCisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgCisgICAgICBfX2xlc3MoY29uc3QgX1RwJiBfX3QsIGNvbnN0IF9VcCYgX191KQorICAgICAgeworCXJldHVybiAoKGdldDxfX2k+KF9fdCkgPCBnZXQ8X19pPihfX3UpKQorCQl8fCAhKGdldDxfX2k+KF9fdSkgPCBnZXQ8X19pPihfX3QpKSAmJgorCQlfX3R1cGxlX2NvbXBhcmU8MCwgX19pICsgMSwgX19qLCBfVHAsIF9VcD46Ol9fbGVzcyhfX3QsIF9fdSkpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX19pLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBzdHJ1Y3QgX190dXBsZV9jb21wYXJlPDAsIF9faSwgX19pLCBfVHAsIF9VcD4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgCisgICAgICBfX2VxKGNvbnN0IF9UcCYsIGNvbnN0IF9VcCYpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAgCisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgCisgICAgICBfX2xlc3MoY29uc3QgX1RwJiwgY29uc3QgX1VwJikgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9URWxlbWVudHMsIHR5cGVuYW1lLi4uIF9VRWxlbWVudHM+CisgICAgY29uc3RleHByIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHR1cGxlPF9URWxlbWVudHMuLi4+JiBfX3QsCisJICAgICAgIGNvbnN0IHR1cGxlPF9VRWxlbWVudHMuLi4+JiBfX3UpCisgICAgeworICAgICAgdHlwZWRlZiB0dXBsZTxfVEVsZW1lbnRzLi4uPiBfVHA7CisgICAgICB0eXBlZGVmIHR1cGxlPF9VRWxlbWVudHMuLi4+IF9VcDsKKyAgICAgIHJldHVybiBib29sKF9fdHVwbGVfY29tcGFyZTx0dXBsZV9zaXplPF9UcD46OnZhbHVlIC0gdHVwbGVfc2l6ZTxfVXA+Ojp2YWx1ZSwKKwkgICAgICAwLCB0dXBsZV9zaXplPF9UcD46OnZhbHVlLCBfVHAsIF9VcD46Ol9fZXEoX190LCBfX3UpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1RFbGVtZW50cywgdHlwZW5hbWUuLi4gX1VFbGVtZW50cz4KKyAgICBjb25zdGV4cHIgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCB0dXBsZTxfVEVsZW1lbnRzLi4uPiYgX190LAorCSAgICAgIGNvbnN0IHR1cGxlPF9VRWxlbWVudHMuLi4+JiBfX3UpCisgICAgeworICAgICAgdHlwZWRlZiB0dXBsZTxfVEVsZW1lbnRzLi4uPiBfVHA7CisgICAgICB0eXBlZGVmIHR1cGxlPF9VRWxlbWVudHMuLi4+IF9VcDsKKyAgICAgIHJldHVybiBib29sKF9fdHVwbGVfY29tcGFyZTx0dXBsZV9zaXplPF9UcD46OnZhbHVlIC0gdHVwbGVfc2l6ZTxfVXA+Ojp2YWx1ZSwKKwkgICAgICAwLCB0dXBsZV9zaXplPF9UcD46OnZhbHVlLCBfVHAsIF9VcD46Ol9fbGVzcyhfX3QsIF9fdSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgIGlubGluZSBjb25zdGV4cHIgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgdHVwbGU8X1RFbGVtZW50cy4uLj4mIF9fdCwKKwkgICAgICAgY29uc3QgdHVwbGU8X1VFbGVtZW50cy4uLj4mIF9fdSkKKyAgICB7IHJldHVybiAhKF9fdCA9PSBfX3UpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1RFbGVtZW50cywgdHlwZW5hbWUuLi4gX1VFbGVtZW50cz4KKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgdHVwbGU8X1RFbGVtZW50cy4uLj4mIF9fdCwKKwkgICAgICBjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX191KQorICAgIHsgcmV0dXJuIF9fdSA8IF9fdDsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9URWxlbWVudHMsIHR5cGVuYW1lLi4uIF9VRWxlbWVudHM+CisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCB0dXBsZTxfVEVsZW1lbnRzLi4uPiYgX190LAorCSAgICAgICBjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX191KQorICAgIHsgcmV0dXJuICEoX191IDwgX190KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9URWxlbWVudHMsIHR5cGVuYW1lLi4uIF9VRWxlbWVudHM+CisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCB0dXBsZTxfVEVsZW1lbnRzLi4uPiYgX190LAorCSAgICAgICBjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX191KQorICAgIHsgcmV0dXJuICEoX190IDwgX191KTsgfQorCisgIC8vIE5COiBEUiA3MDUuCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9FbGVtZW50cz4KKyAgICBjb25zdGV4cHIgdHVwbGU8dHlwZW5hbWUgX19kZWNheV9hbmRfc3RyaXA8X0VsZW1lbnRzPjo6X190eXBlLi4uPgorICAgIG1ha2VfdHVwbGUoX0VsZW1lbnRzJiYuLi4gX19hcmdzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHVwbGU8dHlwZW5hbWUgX19kZWNheV9hbmRfc3RyaXA8X0VsZW1lbnRzPjo6X190eXBlLi4uPgorCV9fcmVzdWx0X3R5cGU7CisgICAgICByZXR1cm4gX19yZXN1bHRfdHlwZShzdGQ6OmZvcndhcmQ8X0VsZW1lbnRzPihfX2FyZ3MpLi4uKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0VsZW1lbnRzPgorICAgIHR1cGxlPF9FbGVtZW50cyYmLi4uPgorICAgIGZvcndhcmRfYXNfdHVwbGUoX0VsZW1lbnRzJiYuLi4gX19hcmdzKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIHR1cGxlPF9FbGVtZW50cyYmLi4uPihzdGQ6OmZvcndhcmQ8X0VsZW1lbnRzPihfX2FyZ3MpLi4uKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBfX2lzX3R1cGxlX2xpa2VfaW1wbCA6IGZhbHNlX3R5cGUKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1Rwcz4KKyAgICBzdHJ1Y3QgX19pc190dXBsZV9saWtlX2ltcGw8dHVwbGU8X1Rwcy4uLj4+IDogdHJ1ZV90eXBlCisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICAgIHN0cnVjdCBfX2lzX3R1cGxlX2xpa2VfaW1wbDxwYWlyPF9UMSwgX1QyPj4gOiB0cnVlX3R5cGUKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgc3RydWN0IF9faXNfdHVwbGVfbGlrZV9pbXBsPGFycmF5PF9UcCwgX05tPj4gOiB0cnVlX3R5cGUKKyAgICB7IH07CisKKyAgLy8gSW50ZXJuYWwgdHlwZSB0cmFpdCB0aGF0IGFsbG93cyB1cyB0byBzZmluYWUtcHJvdGVjdCB0dXBsZV9jYXQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc190dXBsZV9saWtlCisgICAgOiBwdWJsaWMgX19pc190dXBsZV9saWtlX2ltcGw8dHlwZW5hbWUgc3RkOjpyZW1vdmVfY3YKKyAgICAgICAgICAgIDx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZT46OnR5cGU+Ojp0eXBlCisgICAgeyB9OworCisgIC8vIFN0b3JlcyBhIHR1cGxlIG9mIGluZGljZXMuICBBbHNvIHVzZWQgYnkgYmluZCgpIHRvIGV4dHJhY3QgdGhlIGVsZW1lbnRzCisgIC8vIGluIGEgdHVwbGUuIAorICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdC4uLiBfSW5kZXhlcz4KKyAgICBzdHJ1Y3QgX0luZGV4X3R1cGxlCisgICAgeworICAgICAgdHlwZWRlZiBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4sIHNpemVvZi4uLihfSW5kZXhlcyk+IF9fbmV4dDsKKyAgICB9OworCisgIC8vIEJ1aWxkcyBhbiBfSW5kZXhfdHVwbGU8MCwgMSwgMiwgLi4uLCBfTnVtLTE+LgorICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfTnVtPgorICAgIHN0cnVjdCBfQnVpbGRfaW5kZXhfdHVwbGUKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CdWlsZF9pbmRleF90dXBsZTxfTnVtIC0gMT46Ol9fdHlwZTo6X19uZXh0IF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX0J1aWxkX2luZGV4X3R1cGxlPDA+CisgICAgeworICAgICAgdHlwZWRlZiBfSW5kZXhfdHVwbGU8PiBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCwgdHlwZW5hbWUsIHR5cGVuYW1lLCBzdGQ6OnNpemVfdD4KKyAgICBzdHJ1Y3QgX19tYWtlX3R1cGxlX2ltcGw7CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0lkeCwgdHlwZW5hbWUgX1R1cGxlLCB0eXBlbmFtZS4uLiBfVHAsCisgICAgICAgICAgIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBzdHJ1Y3QgX19tYWtlX3R1cGxlX2ltcGw8X0lkeCwgdHVwbGU8X1RwLi4uPiwgX1R1cGxlLCBfTm0+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX21ha2VfdHVwbGVfaW1wbDxfSWR4ICsgMSwgdHVwbGU8X1RwLi4uLAorCXR5cGVuYW1lIHN0ZDo6dHVwbGVfZWxlbWVudDxfSWR4LCBfVHVwbGU+Ojp0eXBlPiwgX1R1cGxlLCBfTm0+OjpfX3R5cGUKKyAgICAgIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9ObSwgdHlwZW5hbWUgX1R1cGxlLCB0eXBlbmFtZS4uLiBfVHA+CisgICAgc3RydWN0IF9fbWFrZV90dXBsZV9pbXBsPF9ObSwgdHVwbGU8X1RwLi4uPiwgX1R1cGxlLCBfTm0+CisgICAgeworICAgICAgdHlwZWRlZiB0dXBsZTxfVHAuLi4+IF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UdXBsZT4KKyAgICBzdHJ1Y3QgX19kb19tYWtlX3R1cGxlCisgICAgOiBwdWJsaWMgX19tYWtlX3R1cGxlX2ltcGw8MCwgdHVwbGU8PiwgX1R1cGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dHVwbGVfc2l6ZTxfVHVwbGU+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgLy8gUmV0dXJucyB0aGUgc3RkOjp0dXBsZSBlcXVpdmFsZW50IG9mIGEgdHVwbGUtbGlrZSB0eXBlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHVwbGU+CisgICAgc3RydWN0IF9fbWFrZV90dXBsZQorICAgIDogcHVibGljIF9fZG9fbWFrZV90dXBsZTx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jdgorICAgICAgICAgICAgPHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxfVHVwbGU+Ojp0eXBlPjo6dHlwZT4KKyAgICB7IH07CisKKyAgLy8gQ29tYmluZXMgc2V2ZXJhbCBzdGQ6OnR1cGxlJ3MgaW50byBhIHNpbmdsZSBvbmUuCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uPgorICAgIHN0cnVjdCBfX2NvbWJpbmVfdHVwbGVzOworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19jb21iaW5lX3R1cGxlczw+CisgICAgeworICAgICAgdHlwZWRlZiB0dXBsZTw+IF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9Ucz4KKyAgICBzdHJ1Y3QgX19jb21iaW5lX3R1cGxlczx0dXBsZTxfVHMuLi4+PgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHVwbGU8X1RzLi4uPiBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVDFzLCB0eXBlbmFtZS4uLiBfVDJzLCB0eXBlbmFtZS4uLiBfUmVtPgorICAgIHN0cnVjdCBfX2NvbWJpbmVfdHVwbGVzPHR1cGxlPF9UMXMuLi4+LCB0dXBsZTxfVDJzLi4uPiwgX1JlbS4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fY29tYmluZV90dXBsZXM8dHVwbGU8X1Qxcy4uLiwgX1Qycy4uLj4sCisJCQkJCV9SZW0uLi4+OjpfX3R5cGUgX190eXBlOworICAgIH07CisKKyAgLy8gQ29tcHV0ZXMgdGhlIHJlc3VsdCB0eXBlIG9mIHR1cGxlX2NhdCBnaXZlbiBhIHNldCBvZiB0dXBsZS1saWtlIHR5cGVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVHBscz4KKyAgICBzdHJ1Y3QgX190dXBsZV9jYXRfcmVzdWx0CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2NvbWJpbmVfdHVwbGVzCisgICAgICAgIDx0eXBlbmFtZSBfX21ha2VfdHVwbGU8X1RwbHM+OjpfX3R5cGUuLi4+OjpfX3R5cGUgX190eXBlOworICAgIH07CisKKyAgLy8gSGVscGVyIHRvIGRldGVybWluZSB0aGUgaW5kZXggc2V0IGZvciB0aGUgZmlyc3QgdHVwbGUtbGlrZQorICAvLyB0eXBlIG9mIGEgZ2l2ZW4gc2V0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLj4KKyAgICBzdHJ1Y3QgX19tYWtlXzFzdF9pbmRpY2VzOworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19tYWtlXzFzdF9pbmRpY2VzPD4KKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6X0luZGV4X3R1cGxlPD4gX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfVHBscz4KKyAgICBzdHJ1Y3QgX19tYWtlXzFzdF9pbmRpY2VzPF9UcCwgX1RwbHMuLi4+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9CdWlsZF9pbmRleF90dXBsZTxzdGQ6OnR1cGxlX3NpemU8CisJdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPF9UcD46OnR5cGU+Ojp2YWx1ZT46Ol9fdHlwZSBfX3R5cGU7CisgICAgfTsKKworICAvLyBQZXJmb3JtcyB0aGUgYWN0dWFsIGNvbmNhdGVuYXRpb24gYnkgc3RlcC13aXNlIGV4cGFuZGluZyB0dXBsZS1saWtlCisgIC8vIG9iamVjdHMgaW50byB0aGUgZWxlbWVudHMsICB3aGljaCBhcmUgZmluYWxseSBmb3J3YXJkZWQgaW50byB0aGUKKyAgLy8gcmVzdWx0IHR1cGxlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmV0LCB0eXBlbmFtZSBfSW5kaWNlcywgdHlwZW5hbWUuLi4gX1RwbHM+CisgICAgc3RydWN0IF9fdHVwbGVfY29uY2F0ZXI7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JldCwgc3RkOjpzaXplX3QuLi4gX0lzLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9UcGxzPgorICAgIHN0cnVjdCBfX3R1cGxlX2NvbmNhdGVyPF9SZXQsIHN0ZDo6X0luZGV4X3R1cGxlPF9Jcy4uLj4sIF9UcCwgX1RwbHMuLi4+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1VzPgorICAgICAgICBzdGF0aWMgY29uc3RleHByIF9SZXQKKyAgICAgICAgX1NfZG8oX1RwJiYgX190cCwgX1RwbHMmJi4uLiBfX3RwcywgX1VzJiYuLi4gX191cykKKyAgICAgICAgeworCSAgdHlwZWRlZiB0eXBlbmFtZSBfX21ha2VfMXN0X2luZGljZXM8X1RwbHMuLi4+OjpfX3R5cGUgX19pZHg7CisJICB0eXBlZGVmIF9fdHVwbGVfY29uY2F0ZXI8X1JldCwgX19pZHgsIF9UcGxzLi4uPiAgICAgIF9fbmV4dDsKKwkgIHJldHVybiBfX25leHQ6Ol9TX2RvKHN0ZDo6Zm9yd2FyZDxfVHBscz4oX190cHMpLi4uLAorCQkJICAgICAgIHN0ZDo6Zm9yd2FyZDxfVXM+KF9fdXMpLi4uLAorCQkJICAgICAgIHN0ZDo6Z2V0PF9Jcz4oc3RkOjpmb3J3YXJkPF9UcD4oX190cCkpLi4uKTsKKwl9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmV0PgorICAgIHN0cnVjdCBfX3R1cGxlX2NvbmNhdGVyPF9SZXQsIHN0ZDo6X0luZGV4X3R1cGxlPD4+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1VzPgorCXN0YXRpYyBjb25zdGV4cHIgX1JldAorCV9TX2RvKF9VcyYmLi4uIF9fdXMpCisgICAgICAgIHsKKwkgIHJldHVybiBfUmV0KHN0ZDo6Zm9yd2FyZDxfVXM+KF9fdXMpLi4uKTsKKwl9CisgICAgfTsKKworICAvLy8gdHVwbGVfY2F0CisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9UcGxzLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgICAgIGVuYWJsZV9pZjxfX2FuZF88X19pc190dXBsZV9saWtlPF9UcGxzPi4uLj46OnZhbHVlPjo6dHlwZT4KKyAgICBjb25zdGV4cHIgYXV0bworICAgIHR1cGxlX2NhdChfVHBscyYmLi4uIF9fdHBscykKKyAgICAtPiB0eXBlbmFtZSBfX3R1cGxlX2NhdF9yZXN1bHQ8X1RwbHMuLi4+OjpfX3R5cGUKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHVwbGVfY2F0X3Jlc3VsdDxfVHBscy4uLj46Ol9fdHlwZSBfX3JldDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19tYWtlXzFzdF9pbmRpY2VzPF9UcGxzLi4uPjo6X190eXBlIF9faWR4OworICAgICAgdHlwZWRlZiBfX3R1cGxlX2NvbmNhdGVyPF9fcmV0LCBfX2lkeCwgX1RwbHMuLi4+IF9fY29uY2F0ZXI7CisgICAgICByZXR1cm4gX19jb25jYXRlcjo6X1NfZG8oc3RkOjpmb3J3YXJkPF9UcGxzPihfX3RwbHMpLi4uKTsKKyAgICB9CisKKyAgLy8vIHRpZQorICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfRWxlbWVudHM+CisgICAgaW5saW5lIHR1cGxlPF9FbGVtZW50cyYuLi4+CisgICAgdGllKF9FbGVtZW50cyYuLi4gX19hcmdzKSBub2V4Y2VwdAorICAgIHsgcmV0dXJuIHR1cGxlPF9FbGVtZW50cyYuLi4+KF9fYXJncy4uLik7IH0KKworICAvLy8gc3dhcAorICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfRWxlbWVudHM+CisgICAgaW5saW5lIHZvaWQgCisgICAgc3dhcCh0dXBsZTxfRWxlbWVudHMuLi4+JiBfX3gsIHR1cGxlPF9FbGVtZW50cy4uLj4mIF9feSkKKyAgICBub2V4Y2VwdChub2V4Y2VwdChfX3guc3dhcChfX3kpKSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICAvLyBBIGNsYXNzIChhbmQgaW5zdGFuY2UpIHdoaWNoIGNhbiBiZSB1c2VkIGluICd0aWUnIHdoZW4gYW4gZWxlbWVudAorICAvLyBvZiBhIHR1cGxlIGlzIG5vdCByZXF1aXJlZAorICBzdHJ1Y3QgX1N3YWxsb3dfYXNzaWduCisgIHsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgICBjb25zdCBfU3dhbGxvd19hc3NpZ24mCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1RwJikgY29uc3QKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgIH07CisKKyAgY29uc3QgX1N3YWxsb3dfYXNzaWduIGlnbm9yZXt9OworCisgIC8vLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciB0dXBsZXMKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1R5cGVzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHVzZXNfYWxsb2NhdG9yPHR1cGxlPF9UeXBlcy4uLj4sIF9BbGxvYz4gOiB0cnVlX3R5cGUgeyB9OworCisgIC8vIFNlZSBzdGxfcGFpci5oLi4uCisgIHRlbXBsYXRlPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzMSwgdHlwZW5hbWUuLi4gX0FyZ3MyPgorICAgICAgaW5saW5lCisgICAgICBwYWlyPF9UMSwgX1QyPjo6CisgICAgICBwYWlyKHBpZWNld2lzZV9jb25zdHJ1Y3RfdCwKKwkgICB0dXBsZTxfQXJnczEuLi4+IF9fZmlyc3QsIHR1cGxlPF9BcmdzMi4uLj4gX19zZWNvbmQpCisgICAgICA6IHBhaXIoX19maXJzdCwgX19zZWNvbmQsCisJICAgICB0eXBlbmFtZSBfQnVpbGRfaW5kZXhfdHVwbGU8c2l6ZW9mLi4uKF9BcmdzMSk+OjpfX3R5cGUoKSwKKwkgICAgIHR5cGVuYW1lIF9CdWlsZF9pbmRleF90dXBsZTxzaXplb2YuLi4oX0FyZ3MyKT46Ol9fdHlwZSgpKQorICAgICAgeyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MxLCBzdGQ6OnNpemVfdC4uLiBfSW5kZXhlczEsCisgICAgICAgICAgICAgdHlwZW5hbWUuLi4gX0FyZ3MyLCBzdGQ6OnNpemVfdC4uLiBfSW5kZXhlczI+CisgICAgICBpbmxpbmUKKyAgICAgIHBhaXI8X1QxLCBfVDI+OjoKKyAgICAgIHBhaXIodHVwbGU8X0FyZ3MxLi4uPiYgX190dXBsZTEsIHR1cGxlPF9BcmdzMi4uLj4mIF9fdHVwbGUyLAorCSAgIF9JbmRleF90dXBsZTxfSW5kZXhlczEuLi4+LCBfSW5kZXhfdHVwbGU8X0luZGV4ZXMyLi4uPikKKyAgICAgIDogZmlyc3Qoc3RkOjpmb3J3YXJkPF9BcmdzMT4oc3RkOjpnZXQ8X0luZGV4ZXMxPihfX3R1cGxlMSkpLi4uKSwKKyAgICAgICAgc2Vjb25kKHN0ZDo6Zm9yd2FyZDxfQXJnczI+KHN0ZDo6Z2V0PF9JbmRleGVzMj4oX190dXBsZTIpKS4uLikKKyAgICAgIHsgfQorCisgIC8vLyBAfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vIF9HTElCQ1hYX1RVUExFCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3R5cGVfdHJhaXRzIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90eXBlX3RyYWl0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjdiOTg2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90eXBlX3RyYWl0cwpAQCAtMCwwICsxLDIwNzQgQEAKKy8vIEMrKzExIDx0eXBlX3RyYWl0cz4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvdHlwZV90cmFpdHMKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFlQRV9UUkFJVFMKKyNkZWZpbmUgX0dMSUJDWFhfVFlQRV9UUkFJVFMgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAZGVmZ3JvdXAgbWV0YXByb2dyYW1taW5nIE1ldGFwcm9ncmFtbWluZworICAgKiBAaW5ncm91cCB1dGlsaXRpZXMKKyAgICoKKyAgICogVGVtcGxhdGUgdXRpbGl0aWVzIGZvciBjb21waWxlLXRpbWUgaW50cm9zcGVjdGlvbiBhbmQgbW9kaWZpY2F0aW9uLAorICAgKiBpbmNsdWRpbmcgdHlwZSBjbGFzc2lmaWNhdGlvbiB0cmFpdHMsIHR5cGUgcHJvcGVydHkgaW5zcGVjdGlvbiB0cmFpdHMKKyAgICogYW5kIHR5cGUgdHJhbnNmb3JtYXRpb24gdHJhaXRzLgorICAgKgorICAgKiBAeworICAgKi8KKworICAvLy8gaW50ZWdyYWxfY29uc3RhbnQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfVHAgX192PgorICAgIHN0cnVjdCBpbnRlZ3JhbF9jb25zdGFudAorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX1RwICAgICAgICAgICAgICAgICAgdmFsdWUgPSBfX3Y7CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIGludGVncmFsX2NvbnN0YW50PF9UcCwgX192PiAgIHR5cGU7CisgICAgICBjb25zdGV4cHIgb3BlcmF0b3IgdmFsdWVfdHlwZSgpIHsgcmV0dXJuIHZhbHVlOyB9CisgICAgfTsKKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX1RwIF9fdj4KKyAgICBjb25zdGV4cHIgX1RwIGludGVncmFsX2NvbnN0YW50PF9UcCwgX192Pjo6dmFsdWU7CisKKyAgLy8vIFRoZSB0eXBlIHVzZWQgYXMgYSBjb21waWxlLXRpbWUgYm9vbGVhbiB3aXRoIHRydWUgdmFsdWUuCisgIHR5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgdHJ1ZT4gICAgIHRydWVfdHlwZTsKKworICAvLy8gVGhlIHR5cGUgdXNlZCBhcyBhIGNvbXBpbGUtdGltZSBib29sZWFuIHdpdGggZmFsc2UgdmFsdWUuCisgIHR5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgZmFsc2U+ICAgIGZhbHNlX3R5cGU7CisKKyAgLy8gTWV0YSBwcm9ncmFtbWluZyBoZWxwZXIgdHlwZXMuCisKKyAgdGVtcGxhdGU8Ym9vbCwgdHlwZW5hbWUsIHR5cGVuYW1lPgorICAgIHN0cnVjdCBjb25kaXRpb25hbDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLj4KKyAgICBzdHJ1Y3QgX19vcl87CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX29yXzw+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQjE+CisgICAgc3RydWN0IF9fb3JfPF9CMT4KKyAgICA6IHB1YmxpYyBfQjEKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0IxLCB0eXBlbmFtZSBfQjI+CisgICAgc3RydWN0IF9fb3JfPF9CMSwgX0IyPgorICAgIDogcHVibGljIGNvbmRpdGlvbmFsPF9CMTo6dmFsdWUsIF9CMSwgX0IyPjo6dHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQjEsIHR5cGVuYW1lIF9CMiwgdHlwZW5hbWUgX0IzLCB0eXBlbmFtZS4uLiBfQm4+CisgICAgc3RydWN0IF9fb3JfPF9CMSwgX0IyLCBfQjMsIF9Cbi4uLj4KKyAgICA6IHB1YmxpYyBjb25kaXRpb25hbDxfQjE6OnZhbHVlLCBfQjEsIF9fb3JfPF9CMiwgX0IzLCBfQm4uLi4+Pjo6dHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLj4KKyAgICBzdHJ1Y3QgX19hbmRfOworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19hbmRfPD4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0IxPgorICAgIHN0cnVjdCBfX2FuZF88X0IxPgorICAgIDogcHVibGljIF9CMQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQjEsIHR5cGVuYW1lIF9CMj4KKyAgICBzdHJ1Y3QgX19hbmRfPF9CMSwgX0IyPgorICAgIDogcHVibGljIGNvbmRpdGlvbmFsPF9CMTo6dmFsdWUsIF9CMiwgX0IxPjo6dHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQjEsIHR5cGVuYW1lIF9CMiwgdHlwZW5hbWUgX0IzLCB0eXBlbmFtZS4uLiBfQm4+CisgICAgc3RydWN0IF9fYW5kXzxfQjEsIF9CMiwgX0IzLCBfQm4uLi4+CisgICAgOiBwdWJsaWMgY29uZGl0aW9uYWw8X0IxOjp2YWx1ZSwgX19hbmRfPF9CMiwgX0IzLCBfQm4uLi4+LCBfQjE+Ojp0eXBlCisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9QcD4KKyAgICBzdHJ1Y3QgX19ub3RfCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgIV9QcDo6dmFsdWU+CisgICAgeyB9OworCisgIHN0cnVjdCBfX3NmaW5hZV90eXBlcworICB7CisgICAgdHlwZWRlZiBjaGFyIF9fb25lOworICAgIHR5cGVkZWYgc3RydWN0IHsgY2hhciBfX2FyclsyXTsgfSBfX3R3bzsKKyAgfTsKKworICAvLyBGb3Igc2V2ZXJhbCBzZmluYWUtZnJpZW5kbHkgdHJhaXQgaW1wbGVtZW50YXRpb25zIHdlIHRyYW5zcG9ydCBib3RoIHRoZQorICAvLyByZXN1bHQgaW5mb3JtYXRpb24gKGFzIHRoZSBtZW1iZXIgdHlwZSkgYW5kIHRoZSBmYWlsdXJlIGluZm9ybWF0aW9uIChubworICAvLyBtZW1iZXIgdHlwZSkuIFRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIHN0ZDo6ZW5hYmxlX2lmLCBidXQgd2UgY2Fubm90IHVzZQorICAvLyB0aGVtLCBiZWNhdXNlIHdlIG5lZWQgdG8gZGVyaXZlIGZyb20gdGhlbSBhcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX3N1Y2Nlc3NfdHlwZQorICAgIHsgdHlwZWRlZiBfVHAgdHlwZTsgfTsKKworICBzdHJ1Y3QgX19mYWlsdXJlX3R5cGUKKyAgeyB9OworCisgIC8vIFByaW1hcnkgdHlwZSBjYXRlZ29yaWVzLgorCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCByZW1vdmVfY3Y7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfdm9pZF9oZWxwZXIKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfdm9pZF9oZWxwZXI8dm9pZD4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIC8vLyBpc192b2lkCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfdm9pZAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX3ZvaWRfaGVscGVyPHR5cGVuYW1lCisJCQkJICAgICAgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBfX2lzX2ludGVncmFsX2hlbHBlcgorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ3JhbF9oZWxwZXI8Ym9vbD4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworICAKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVncmFsX2hlbHBlcjxjaGFyPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVncmFsX2hlbHBlcjxzaWduZWQgY2hhcj4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ3JhbF9oZWxwZXI8dW5zaWduZWQgY2hhcj4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVncmFsX2hlbHBlcjx3Y2hhcl90PgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisjZW5kaWYKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfaW50ZWdyYWxfaGVscGVyPGNoYXIxNl90PgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVncmFsX2hlbHBlcjxjaGFyMzJfdD4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ3JhbF9oZWxwZXI8c2hvcnQ+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfaW50ZWdyYWxfaGVscGVyPHVuc2lnbmVkIHNob3J0PgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVncmFsX2hlbHBlcjxpbnQ+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfaW50ZWdyYWxfaGVscGVyPHVuc2lnbmVkIGludD4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ3JhbF9oZWxwZXI8bG9uZz4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ3JhbF9oZWxwZXI8dW5zaWduZWQgbG9uZz4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ3JhbF9oZWxwZXI8bG9uZyBsb25nPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVncmFsX2hlbHBlcjx1bnNpZ25lZCBsb25nIGxvbmc+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfR0xJQkNYWF9VU0VfSU5UMTI4KQorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfaW50ZWdyYWxfaGVscGVyPF9faW50MTI4PgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVncmFsX2hlbHBlcjx1bnNpZ25lZCBfX2ludDEyOD4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworI2VuZGlmCisKKyAgLy8vIGlzX2ludGVncmFsCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfaW50ZWdyYWwKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoX19pc19pbnRlZ3JhbF9oZWxwZXI8dHlwZW5hbWUKKwkJCQkgICAgICByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfZmxvYXRpbmdfcG9pbnRfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2Zsb2F0aW5nX3BvaW50X2hlbHBlcjxmbG9hdD4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19mbG9hdGluZ19wb2ludF9oZWxwZXI8ZG91YmxlPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2Zsb2F0aW5nX3BvaW50X2hlbHBlcjxsb25nIGRvdWJsZT4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisjaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9HTElCQ1hYX1VTRV9GTE9BVDEyOCkgJiYgKCFkZWZpbmVkKF9fY2xhbmdfXykgfHwgX19jbGFuZ19tYWpvcl9fID4gMyB8fCAoX19jbGFuZ19tYWpvcl9fID09IDMgJiYgX19jbGFuZ19taW5vcl9fID49IDQpKQorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfZmxvYXRpbmdfcG9pbnRfaGVscGVyPF9fZmxvYXQxMjg+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyNlbmRpZgorCisgIC8vLyBpc19mbG9hdGluZ19wb2ludAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2Zsb2F0aW5nX3BvaW50CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfZmxvYXRpbmdfcG9pbnRfaGVscGVyPHR5cGVuYW1lCisJCQkJICAgICAgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIC8vLyBpc19hcnJheQorICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfYXJyYXkKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9TaXplPgorICAgIHN0cnVjdCBpc19hcnJheTxfVHBbX1NpemVdPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19hcnJheTxfVHBbXT4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBfX2lzX3BvaW50ZXJfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX3BvaW50ZXJfaGVscGVyPF9UcCo+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICAvLy8gaXNfcG9pbnRlcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3BvaW50ZXIKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoX19pc19wb2ludGVyX2hlbHBlcjx0eXBlbmFtZQorCQkJCSAgICAgIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPjo6dmFsdWUpPgorICAgIHsgfTsKKworICAvLy8gaXNfbHZhbHVlX3JlZmVyZW5jZQorICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfbHZhbHVlX3JlZmVyZW5jZQorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfbHZhbHVlX3JlZmVyZW5jZTxfVHAmPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgLy8vIGlzX3J2YWx1ZV9yZWZlcmVuY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IGlzX3J2YWx1ZV9yZWZlcmVuY2UKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3J2YWx1ZV9yZWZlcmVuY2U8X1RwJiY+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfZnVuY3Rpb247CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfbWVtYmVyX29iamVjdF9wb2ludGVyX2hlbHBlcgorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NwPgorICAgIHN0cnVjdCBfX2lzX21lbWJlcl9vYmplY3RfcG9pbnRlcl9oZWxwZXI8X1RwIF9DcDo6Kj4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAhaXNfZnVuY3Rpb248X1RwPjo6dmFsdWU+IHsgfTsKKworICAvLy8gaXNfbWVtYmVyX29iamVjdF9wb2ludGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfbWVtYmVyX29iamVjdF9wb2ludGVyCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfbWVtYmVyX29iamVjdF9wb2ludGVyX2hlbHBlcjwKKwkJCQkgICAgICB0eXBlbmFtZSByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXJfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ3A+CisgICAgc3RydWN0IF9faXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXJfaGVscGVyPF9UcCBfQ3A6Oio+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfZnVuY3Rpb248X1RwPjo6dmFsdWU+IHsgfTsKKworICAvLy8gaXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyX2hlbHBlcjwKKwkJCQkgICAgICB0eXBlbmFtZSByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX2VudW0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19lbnVtCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19lbnVtKF9UcCk+CisgICAgeyB9OworCisgIC8vLyBpc191bmlvbgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3VuaW9uCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc191bmlvbihfVHApPgorICAgIHsgfTsKKworICAvLy8gaXNfY2xhc3MKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19jbGFzcworICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfY2xhc3MoX1RwKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX2Z1bmN0aW9uCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbgorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgaXNfZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLi4uLik+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IGlzX2Z1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uKSBjb25zdD4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgaXNfZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4uLi4pIGNvbnN0PgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLikgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IGlzX2Z1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uLi4uKSB2b2xhdGlsZT4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgaXNfZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pIGNvbnN0IHZvbGF0aWxlPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLi4uLikgY29uc3Qgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19pc19udWxscHRyX3RfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX251bGxwdHJfdF9oZWxwZXI8c3RkOjpudWxscHRyX3Q+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICAvLyBfX2lzX251bGxwdHJfdCAoZXh0ZW5zaW9uKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX251bGxwdHJfdAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX251bGxwdHJfdF9oZWxwZXI8dHlwZW5hbWUKKwkJCQkgICAgICByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgLy8gQ29tcG9zaXRlIHR5cGUgY2F0ZWdvcmllcy4KKworICAvLy8gaXNfcmVmZXJlbmNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfcmVmZXJlbmNlCisgICAgOiBwdWJsaWMgX19vcl88aXNfbHZhbHVlX3JlZmVyZW5jZTxfVHA+LAorICAgICAgICAgICAgICAgICAgIGlzX3J2YWx1ZV9yZWZlcmVuY2U8X1RwPj46OnR5cGUKKyAgICB7IH07CisKKyAgLy8vIGlzX2FyaXRobWV0aWMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19hcml0aG1ldGljCisgICAgOiBwdWJsaWMgX19vcl88aXNfaW50ZWdyYWw8X1RwPiwgaXNfZmxvYXRpbmdfcG9pbnQ8X1RwPj46OnR5cGUKKyAgICB7IH07CisKKyAgLy8vIGlzX2Z1bmRhbWVudGFsCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfZnVuZGFtZW50YWwKKyAgICA6IHB1YmxpYyBfX29yXzxpc19hcml0aG1ldGljPF9UcD4sIGlzX3ZvaWQ8X1RwPiwgX19pc19udWxscHRyX3Q8X1RwPj46OnR5cGUKKyAgICB7IH07CisKKyAgLy8vIGlzX29iamVjdAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX29iamVjdAorICAgIDogcHVibGljIF9fbm90XzxfX29yXzxpc19mdW5jdGlvbjxfVHA+LCBpc19yZWZlcmVuY2U8X1RwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfdm9pZDxfVHA+Pj46OnR5cGUKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IGlzX21lbWJlcl9wb2ludGVyOworCisgIC8vLyBpc19zY2FsYXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19zY2FsYXIKKyAgICA6IHB1YmxpYyBfX29yXzxpc19hcml0aG1ldGljPF9UcD4sIGlzX2VudW08X1RwPiwgaXNfcG9pbnRlcjxfVHA+LAorICAgICAgICAgICAgICAgICAgIGlzX21lbWJlcl9wb2ludGVyPF9UcD4sIF9faXNfbnVsbHB0cl90PF9UcD4+Ojp0eXBlCisgICAgeyB9OworCisgIC8vLyBpc19jb21wb3VuZAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2NvbXBvdW5kCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgIWlzX2Z1bmRhbWVudGFsPF9UcD46OnZhbHVlPiB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX21lbWJlcl9wb2ludGVyX2hlbHBlcgorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NwPgorICAgIHN0cnVjdCBfX2lzX21lbWJlcl9wb2ludGVyX2hlbHBlcjxfVHAgX0NwOjoqPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgLy8vIGlzX21lbWJlcl9wb2ludGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfbWVtYmVyX3BvaW50ZXIKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoX19pc19tZW1iZXJfcG9pbnRlcl9oZWxwZXI8CisJCQkJICAgICAgdHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIC8vIFR5cGUgcHJvcGVydGllcy4KKworICAvLy8gaXNfY29uc3QKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IGlzX2NvbnN0CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19jb25zdDxfVHAgY29uc3Q+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgCisgIC8vLyBpc192b2xhdGlsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfdm9sYXRpbGUKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3ZvbGF0aWxlPF9UcCB2b2xhdGlsZT4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIC8vLyBpc190cml2aWFsCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfdHJpdmlhbAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfdHJpdmlhbChfVHApPgorICAgIHsgfTsKKworICAvLyBpc190cml2aWFsbHlfY29weWFibGUgKHN0aWxsIHVuaW1wbGVtZW50ZWQpCisKKyAgLy8vIGlzX3N0YW5kYXJkX2xheW91dAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3N0YW5kYXJkX2xheW91dAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfc3RhbmRhcmRfbGF5b3V0KF9UcCk+CisgICAgeyB9OworCisgIC8vLyBpc19wb2QKKyAgLy8gQ291bGQgdXNlIGlzX3N0YW5kYXJkX2xheW91dCAmJiBpc190cml2aWFsIGluc3RlYWQgb2YgdGhlIGJ1aWx0aW4uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfcG9kCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19wb2QoX1RwKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX2xpdGVyYWxfdHlwZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2xpdGVyYWxfdHlwZQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfbGl0ZXJhbF90eXBlKF9UcCk+CisgICAgeyB9OworCisgIC8vLyBpc19lbXB0eQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2VtcHR5CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19lbXB0eShfVHApPgorICAgIHsgfTsKKworICAvLy8gaXNfcG9seW1vcnBoaWMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19wb2x5bW9ycGhpYworICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfcG9seW1vcnBoaWMoX1RwKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX2Fic3RyYWN0CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfYWJzdHJhY3QKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX2Fic3RyYWN0KF9UcCk+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwKKwkgICBib29sID0gaXNfaW50ZWdyYWw8X1RwPjo6dmFsdWUsCisJICAgYm9vbCA9IGlzX2Zsb2F0aW5nX3BvaW50PF9UcD46OnZhbHVlPgorICAgIHN0cnVjdCBfX2lzX3NpZ25lZF9oZWxwZXIKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfc2lnbmVkX2hlbHBlcjxfVHAsIGZhbHNlLCB0cnVlPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX3NpZ25lZF9oZWxwZXI8X1RwLCB0cnVlLCBmYWxzZT4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBzdGF0aWNfY2FzdDxib29sPihfVHAoLTEpIDwgX1RwKDApKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX3NpZ25lZAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3NpZ25lZAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfc2lnbmVkX2hlbHBlcjxfVHA+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgLy8vIGlzX3Vuc2lnbmVkCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfdW5zaWduZWQKKyAgICA6IHB1YmxpYyBfX2FuZF88aXNfYXJpdGhtZXRpYzxfVHA+LCBfX25vdF88aXNfc2lnbmVkPF9UcD4+Pjo6dHlwZQorICAgIHsgfTsKKworCisgIC8vIERlc3RydWN0aWJsZSBhbmQgY29uc3RydWN0aWJsZSB0eXBlIHByb3BlcnRpZXMuCisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IGFkZF9ydmFsdWVfcmVmZXJlbmNlOworCisgIC8qKgorICAgKiAgQGJyaWVmICBVdGlsaXR5IHRvIHNpbXBsaWZ5IGV4cHJlc3Npb25zIHVzZWQgaW4gdW5ldmFsdWF0ZWQgb3BlcmFuZHMKKyAgICogIEBpbmdyb3VwIHV0aWxpdGllcworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHR5cGVuYW1lIGFkZF9ydmFsdWVfcmVmZXJlbmNlPF9UcD46OnR5cGUgZGVjbHZhbCgpIG5vZXhjZXB0OworCisgIHRlbXBsYXRlPHR5cGVuYW1lLCB1bnNpZ25lZCA9IDA+CisgICAgc3RydWN0IGV4dGVudDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgcmVtb3ZlX2FsbF9leHRlbnRzOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19hcnJheV9rbm93bl9ib3VuZHMKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoZXh0ZW50PF9UcD46OnZhbHVlID4gMCk+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19hcnJheV91bmtub3duX2JvdW5kcworICAgIDogcHVibGljIF9fYW5kXzxpc19hcnJheTxfVHA+LCBfX25vdF88ZXh0ZW50PF9UcD4+Pjo6dHlwZQorICAgIHsgfTsKKyAgICAKKyAgLy8gSW4gTjMyOTAgaXNfZGVzdHJ1Y3RpYmxlIGRvZXMgbm90IHNheSBhbnl0aGluZyBhYm91dCBmdW5jdGlvbgorICAvLyB0eXBlcyBhbmQgYWJzdHJhY3QgdHlwZXMsIHNlZSBMV0cgMjA0OS4gVGhpcyBpbXBsZW1lbnRhdGlvbgorICAvLyBkZXNjcmliZXMgZnVuY3Rpb24gdHlwZXMgYXMgbm9uLWRlc3RydWN0aWJsZSBhbmQgYWxsIGNvbXBsZXRlCisgIC8vIG9iamVjdCB0eXBlcyBhcyBkZXN0cnVjdGlibGUsIGlmZiB0aGUgZXhwbGljaXQgZGVzdHJ1Y3RvcgorICAvLyBjYWxsIGV4cHJlc3Npb24gaXMgd2VsbGZvcm1lZC4KKyAgc3RydWN0IF9fZG9faXNfZGVzdHJ1Y3RpYmxlX2ltcGwKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgPSBkZWNsdHlwZShkZWNsdmFsPF9UcCY+KCkufl9UcCgpKT4KKyAgICAgIHN0YXRpYyB0cnVlX3R5cGUgX190ZXN0KGludCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICAgIHN0YXRpYyBmYWxzZV90eXBlIF9fdGVzdCguLi4pOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19kZXN0cnVjdGlibGVfaW1wbAorICAgIDogcHVibGljIF9fZG9faXNfZGVzdHJ1Y3RpYmxlX2ltcGwKKyAgICB7CisgICAgICB0eXBlZGVmIGRlY2x0eXBlKF9fdGVzdDxfVHA+KDApKSB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLAorICAgICAgICAgICBib29sID0gX19vcl88aXNfdm9pZDxfVHA+LAorICAgICAgICAgICAgICAgICAgICAgICAgX19pc19hcnJheV91bmtub3duX2JvdW5kczxfVHA+LAorICAgICAgICAgICAgICAgICAgICAgICAgaXNfZnVuY3Rpb248X1RwPj46OnZhbHVlLAorICAgICAgICAgICBib29sID0gX19vcl88aXNfcmVmZXJlbmNlPF9UcD4sIGlzX3NjYWxhcjxfVHA+Pjo6dmFsdWU+CisgICAgc3RydWN0IF9faXNfZGVzdHJ1Y3RpYmxlX3NhZmU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2Rlc3RydWN0aWJsZV9zYWZlPF9UcCwgZmFsc2UsIGZhbHNlPgorICAgIDogcHVibGljIF9faXNfZGVzdHJ1Y3RpYmxlX2ltcGw8dHlwZW5hbWUKKyAgICAgICAgICAgICAgIHJlbW92ZV9hbGxfZXh0ZW50czxfVHA+Ojp0eXBlPjo6dHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfZGVzdHJ1Y3RpYmxlX3NhZmU8X1RwLCB0cnVlLCBmYWxzZT4KKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfZGVzdHJ1Y3RpYmxlX3NhZmU8X1RwLCBmYWxzZSwgdHJ1ZT4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIC8vLyBpc19kZXN0cnVjdGlibGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19kZXN0cnVjdGlibGUKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoX19pc19kZXN0cnVjdGlibGVfc2FmZTxfVHA+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIC8vIGlzX25vdGhyb3dfZGVzdHJ1Y3RpYmxlIHJlcXVpcmVzIHRoYXQgaXNfZGVzdHJ1Y3RpYmxlIGlzCisgIC8vIHNhdGlzZmllZCBhcyB3ZWxsLiAgV2UgcmVhbGl6ZSB0aGF0IGJ5IG1pbWljaW5nIHRoZQorICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBpc19kZXN0cnVjdGlibGUgYnV0IHJlZmVyIHRvIG5vZXhjZXB0KGV4cHIpCisgIC8vIGluc3RlYWQgb2YgZGVjbHR5cGUoZXhwcikuCisgIHN0cnVjdCBfX2RvX2lzX250X2Rlc3RydWN0aWJsZV9pbXBsCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBzdGF0aWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgbm9leGNlcHQoZGVjbHZhbDxfVHAmPigpLn5fVHAoKSk+CisgICAgICAgIF9fdGVzdChpbnQpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgICBzdGF0aWMgZmFsc2VfdHlwZSBfX3Rlc3QoLi4uKTsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbnRfZGVzdHJ1Y3RpYmxlX2ltcGwKKyAgICA6IHB1YmxpYyBfX2RvX2lzX250X2Rlc3RydWN0aWJsZV9pbXBsCisgICAgeworICAgICAgdHlwZWRlZiBkZWNsdHlwZShfX3Rlc3Q8X1RwPigwKSkgdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwKKyAgICAgICAgICAgYm9vbCA9IF9fb3JfPGlzX3ZvaWQ8X1RwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXNfYXJyYXlfdW5rbm93bl9ib3VuZHM8X1RwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Z1bmN0aW9uPF9UcD4+Ojp2YWx1ZSwKKyAgICAgICAgICAgYm9vbCA9IF9fb3JfPGlzX3JlZmVyZW5jZTxfVHA+LCBpc19zY2FsYXI8X1RwPj46OnZhbHVlPgorICAgIHN0cnVjdCBfX2lzX250X2Rlc3RydWN0aWJsZV9zYWZlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19udF9kZXN0cnVjdGlibGVfc2FmZTxfVHAsIGZhbHNlLCBmYWxzZT4KKyAgICA6IHB1YmxpYyBfX2lzX250X2Rlc3RydWN0aWJsZV9pbXBsPHR5cGVuYW1lCisgICAgICAgICAgICAgICByZW1vdmVfYWxsX2V4dGVudHM8X1RwPjo6dHlwZT46OnR5cGUKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX250X2Rlc3RydWN0aWJsZV9zYWZlPF9UcCwgdHJ1ZSwgZmFsc2U+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX250X2Rlc3RydWN0aWJsZV9zYWZlPF9UcCwgZmFsc2UsIHRydWU+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICAvLy8gaXNfbm90aHJvd19kZXN0cnVjdGlibGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19ub3Rocm93X2Rlc3RydWN0aWJsZQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX250X2Rlc3RydWN0aWJsZV9zYWZlPF9UcD46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgc3RydWN0IF9fZG9faXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX2ltcGwKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgPSBkZWNsdHlwZShfVHAoKSk+CisgICAgICBzdGF0aWMgdHJ1ZV90eXBlIF9fdGVzdChpbnQpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgICBzdGF0aWMgZmFsc2VfdHlwZSBfX3Rlc3QoLi4uKTsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX2ltcGwKKyAgICA6IHB1YmxpYyBfX2RvX2lzX2RlZmF1bHRfY29uc3RydWN0aWJsZV9pbXBsCisgICAgeworICAgICAgdHlwZWRlZiBkZWNsdHlwZShfX3Rlc3Q8X1RwPigwKSkgdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19kZWZhdWx0X2NvbnN0cnVjdGlibGVfYXRvbQorICAgIDogcHVibGljIF9fYW5kXzxfX25vdF88aXNfdm9pZDxfVHA+PiwKKyAgICAgICAgICAgICAgICAgICAgX19pc19kZWZhdWx0X2NvbnN0cnVjdGlibGVfaW1wbDxfVHA+Pjo6dHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2wgPSBpc19hcnJheTxfVHA+Ojp2YWx1ZT4KKyAgICBzdHJ1Y3QgX19pc19kZWZhdWx0X2NvbnN0cnVjdGlibGVfc2FmZTsKKworICAvLyBUaGUgZm9sbG93aW5nIHRlY2huaXF1ZSBpcyBhIHdvcmthcm91bmQgZm9yIGEgY3VycmVudCBjb3JlIGxhbmd1YWdlCisgIC8vIHJlc3RyaWN0aW9uLCB3aGljaCBkb2VzIG5vdCBhbGxvdyBmb3IgYXJyYXkgdHlwZXMgdG8gb2NjdXIgaW4gCisgIC8vIGZ1bmN0aW9uYWwgY2FzdHMgb2YgdGhlIGZvcm0gVCgpLiAgQ29tcGxldGUgYXJyYXlzIGNhbiBiZSBkZWZhdWx0LQorICAvLyBjb25zdHJ1Y3RlZCwgaWYgdGhlIGVsZW1lbnQgdHlwZSBpcyBkZWZhdWx0LWNvbnN0cnVjdGlibGUsIGJ1dCAKKyAgLy8gYXJyYXlzIHdpdGggdW5rbm93biBib3VuZHMgYXJlIG5vdC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2RlZmF1bHRfY29uc3RydWN0aWJsZV9zYWZlPF9UcCwgdHJ1ZT4KKyAgICA6IHB1YmxpYyBfX2FuZF88X19pc19hcnJheV9rbm93bl9ib3VuZHM8X1RwPiwKKwkJICAgIF9faXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX2F0b208dHlwZW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfYWxsX2V4dGVudHM8X1RwPjo6dHlwZT4+Ojp0eXBlCisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19kZWZhdWx0X2NvbnN0cnVjdGlibGVfc2FmZTxfVHAsIGZhbHNlPgorICAgIDogcHVibGljIF9faXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX2F0b208X1RwPjo6dHlwZQorICAgIHsgfTsKKworICAvLy8gaXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX3NhZmU8CisJCQkJICAgICAgX1RwPjo6dmFsdWUpPgorICAgIHsgfTsKKworCisgIC8vIEltcGxlbWVudGF0aW9uIG9mIGlzX2NvbnN0cnVjdGlibGUuCisKKyAgLy8gVGhlIGhhcmRlc3QgcGFydCBvZiB0aGlzIHRyYWl0IGlzIHRoZSBiaW5hcnkgZGlyZWN0LWluaXRpYWxpemF0aW9uCisgIC8vIGNhc2UsIGJlY2F1c2Ugd2UgaGl0IGludG8gYSBmdW5jdGlvbmFsIGNhc3Qgb2YgdGhlIGZvcm0gVChhcmcpLgorICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgZGlmZmVyZW50IHN0cmF0ZWdpZXMgZGVwZW5kaW5nIG9uIHRoZQorICAvLyB0YXJnZXQgdHlwZSB0byByZWR1Y2UgdGhlIHRlc3Qgb3ZlcmhlYWQgYXMgbXVjaCBhcyBwb3NzaWJsZToKKyAgLy8KKyAgLy8gYSkgRm9yIGEgcmVmZXJlbmNlIHRhcmdldCB0eXBlLCB3ZSB1c2UgYSBzdGF0aWNfY2FzdCBleHByZXNzaW9uIAorICAvLyAgICBtb2R1bG8gaXRzIGV4dHJhIGNhc2VzLgorICAvLworICAvLyBiKSBGb3IgYSBub24tcmVmZXJlbmNlIHRhcmdldCB0eXBlIHdlIHVzZSBhIDo6bmV3IGV4cHJlc3Npb24uCisgIHN0cnVjdCBfX2RvX2lzX3N0YXRpY19jYXN0YWJsZV9pbXBsCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnJvbSwgdHlwZW5hbWUgX1RvLCB0eXBlbmFtZQorICAgICAgICAgICAgID0gZGVjbHR5cGUoc3RhdGljX2Nhc3Q8X1RvPihkZWNsdmFsPF9Gcm9tPigpKSk+CisgICAgICBzdGF0aWMgdHJ1ZV90eXBlIF9fdGVzdChpbnQpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPgorICAgICAgc3RhdGljIGZhbHNlX3R5cGUgX190ZXN0KC4uLik7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Zyb20sIHR5cGVuYW1lIF9Ubz4KKyAgICBzdHJ1Y3QgX19pc19zdGF0aWNfY2FzdGFibGVfaW1wbAorICAgIDogcHVibGljIF9fZG9faXNfc3RhdGljX2Nhc3RhYmxlX2ltcGwKKyAgICB7CisgICAgICB0eXBlZGVmIGRlY2x0eXBlKF9fdGVzdDxfRnJvbSwgX1RvPigwKSkgdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gcm9tLCB0eXBlbmFtZSBfVG8+CisgICAgc3RydWN0IF9faXNfc3RhdGljX2Nhc3RhYmxlX3NhZmUKKyAgICA6IHB1YmxpYyBfX2lzX3N0YXRpY19jYXN0YWJsZV9pbXBsPF9Gcm9tLCBfVG8+Ojp0eXBlCisgICAgeyB9OworCisgIC8vIF9faXNfc3RhdGljX2Nhc3RhYmxlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gcm9tLCB0eXBlbmFtZSBfVG8+CisgICAgc3RydWN0IF9faXNfc3RhdGljX2Nhc3RhYmxlCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfc3RhdGljX2Nhc3RhYmxlX3NhZmU8CisJCQkJICAgICAgX0Zyb20sIF9Ubz46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgLy8gSW1wbGVtZW50YXRpb24gZm9yIG5vbi1yZWZlcmVuY2UgdHlwZXMuIFRvIG1lZXQgdGhlIHByb3BlcgorICAvLyB2YXJpYWJsZSBkZWZpbml0aW9uIHNlbWFudGljcywgd2UgYWxzbyBuZWVkIHRvIHRlc3QgZm9yCisgIC8vIGlzX2Rlc3RydWN0aWJsZSBpbiB0aGlzIGNhc2UuCisgIC8vIFRoaXMgZm9ybSBzaG91bGQgYmUgc2ltcGxpZmllZCBieSBhIHNpbmdsZSBleHByZXNzaW9uOgorICAvLyA6OmRlbGV0ZSA6Om5ldyBfVHAoZGVjbHZhbDxfQXJnPigpKSwgc2VlIGMrKy81MTIyMi4KKyAgc3RydWN0IF9fZG9faXNfZGlyZWN0X2NvbnN0cnVjdGlibGVfaW1wbAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQXJnLCB0eXBlbmFtZQorCSAgICAgPSBkZWNsdHlwZSg6Om5ldyBfVHAoZGVjbHZhbDxfQXJnPigpKSk+CisgICAgICBzdGF0aWMgdHJ1ZV90eXBlIF9fdGVzdChpbnQpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPgorICAgICAgc3RhdGljIGZhbHNlX3R5cGUgX190ZXN0KC4uLik7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQXJnPgorICAgIHN0cnVjdCBfX2lzX2RpcmVjdF9jb25zdHJ1Y3RpYmxlX2ltcGwKKyAgICA6IHB1YmxpYyBfX2RvX2lzX2RpcmVjdF9jb25zdHJ1Y3RpYmxlX2ltcGwKKyAgICB7CisgICAgICB0eXBlZGVmIGRlY2x0eXBlKF9fdGVzdDxfVHAsIF9Bcmc+KDApKSB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQXJnPgorICAgIHN0cnVjdCBfX2lzX2RpcmVjdF9jb25zdHJ1Y3RpYmxlX25ld19zYWZlCisgICAgOiBwdWJsaWMgX19hbmRfPGlzX2Rlc3RydWN0aWJsZTxfVHA+LAorICAgICAgICAgICAgICAgICAgICBfX2lzX2RpcmVjdF9jb25zdHJ1Y3RpYmxlX2ltcGw8X1RwLCBfQXJnPj46OnR5cGUKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPgorICAgIHN0cnVjdCBpc19zYW1lOworCisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfYmFzZV9vZjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgcmVtb3ZlX3JlZmVyZW5jZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnJvbSwgdHlwZW5hbWUgX1RvLCBib29sCisgICAgICAgICAgID0gX19ub3RfPF9fb3JfPGlzX3ZvaWQ8X0Zyb20+LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZnVuY3Rpb248X0Zyb20+Pj46OnZhbHVlPgorICAgIHN0cnVjdCBfX2lzX2Jhc2VfdG9fZGVyaXZlZF9yZWY7CisKKyAgLy8gRGV0ZWN0IHdoZXRoZXIgd2UgaGF2ZSBhIGRvd25jYXN0IHNpdHVhdGlvbiBkdXJpbmcKKyAgLy8gcmVmZXJlbmNlIGJpbmRpbmcuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gcm9tLCB0eXBlbmFtZSBfVG8+CisgICAgc3RydWN0IF9faXNfYmFzZV90b19kZXJpdmVkX3JlZjxfRnJvbSwgX1RvLCB0cnVlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2N2PHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X0Zyb20KKyAgICAgICAgPjo6dHlwZT46OnR5cGUgX19zcmNfdDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2N2PHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1RvCisgICAgICAgID46OnR5cGU+Ojp0eXBlIF9fZHN0X3Q7CisgICAgICB0eXBlZGVmIF9fYW5kXzxfX25vdF88aXNfc2FtZTxfX3NyY190LCBfX2RzdF90Pj4sCisJCSAgICAgaXNfYmFzZV9vZjxfX3NyY190LCBfX2RzdF90Pj4gdHlwZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCB2YWx1ZSA9IHR5cGU6OnZhbHVlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Zyb20sIHR5cGVuYW1lIF9Ubz4KKyAgICBzdHJ1Y3QgX19pc19iYXNlX3RvX2Rlcml2ZWRfcmVmPF9Gcm9tLCBfVG8sIGZhbHNlPgorICAgIDogcHVibGljIGZhbHNlX3R5cGUKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Zyb20sIHR5cGVuYW1lIF9UbywgYm9vbAorICAgICAgICAgICA9IF9fYW5kXzxpc19sdmFsdWVfcmVmZXJlbmNlPF9Gcm9tPiwKKyAgICAgICAgICAgICAgICAgICAgaXNfcnZhbHVlX3JlZmVyZW5jZTxfVG8+Pjo6dmFsdWU+CisgICAgc3RydWN0IF9faXNfbHZhbHVlX3RvX3J2YWx1ZV9yZWY7CisKKyAgLy8gRGV0ZWN0IHdoZXRoZXIgd2UgaGF2ZSBhbiBsdmFsdWUgb2Ygbm9uLWZ1bmN0aW9uIHR5cGUKKyAgLy8gYm91bmQgdG8gYSByZWZlcmVuY2UtY29tcGF0aWJsZSBydmFsdWUtcmVmZXJlbmNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnJvbSwgdHlwZW5hbWUgX1RvPgorICAgIHN0cnVjdCBfX2lzX2x2YWx1ZV90b19ydmFsdWVfcmVmPF9Gcm9tLCBfVG8sIHRydWU+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfY3Y8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTwKKyAgICAgICAgX0Zyb20+Ojp0eXBlPjo6dHlwZSBfX3NyY190OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfY3Y8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTwKKyAgICAgICAgX1RvPjo6dHlwZT46OnR5cGUgX19kc3RfdDsKKyAgICAgIHR5cGVkZWYgX19hbmRfPF9fbm90Xzxpc19mdW5jdGlvbjxfX3NyY190Pj4sIAorICAgICAgICBfX29yXzxpc19zYW1lPF9fc3JjX3QsIF9fZHN0X3Q+LAorCQkgICAgaXNfYmFzZV9vZjxfX2RzdF90LCBfX3NyY190Pj4+IHR5cGU7CisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPSB0eXBlOjp2YWx1ZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gcm9tLCB0eXBlbmFtZSBfVG8+CisgICAgc3RydWN0IF9faXNfbHZhbHVlX3RvX3J2YWx1ZV9yZWY8X0Zyb20sIF9UbywgZmFsc2U+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZQorICAgIHsgfTsKKworICAvLyBIZXJlIHdlIGhhbmRsZSBkaXJlY3QtaW5pdGlhbGl6YXRpb24gdG8gYSByZWZlcmVuY2UgdHlwZSBhcyAKKyAgLy8gZXF1aXZhbGVudCB0byBhIHN0YXRpY19jYXN0IG1vZHVsbyBvdmVyc2hvb3RpbmcgY29udmVyc2lvbnMuCisgIC8vIFRoZXNlIGFyZSByZXN0cmljdGVkIHRvIHRoZSBmb2xsb3dpbmcgY29udmVyc2lvbnM6CisgIC8vICAgIGEpIEEgYmFzZSBjbGFzcyB2YWx1ZSB0byBhIGRlcml2ZWQgY2xhc3MgcmVmZXJlbmNlCisgIC8vICAgIGIpIEFuIGx2YWx1ZSB0byBhbiBydmFsdWUtcmVmZXJlbmNlIG9mIHJlZmVyZW5jZS1jb21wYXRpYmxlIAorICAvLyAgICAgICB0eXBlcyB0aGF0IGFyZSBub3QgZnVuY3Rpb25zCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FyZz4KKyAgICBzdHJ1Y3QgX19pc19kaXJlY3RfY29uc3RydWN0aWJsZV9yZWZfY2FzdAorICAgIDogcHVibGljIF9fYW5kXzxfX2lzX3N0YXRpY19jYXN0YWJsZTxfQXJnLCBfVHA+LAorICAgICAgICAgICAgICAgICAgICBfX25vdF88X19vcl88X19pc19iYXNlX3RvX2Rlcml2ZWRfcmVmPF9BcmcsIF9UcD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2lzX2x2YWx1ZV90b19ydmFsdWVfcmVmPF9BcmcsIF9UcD4KKyAgICAgICAgICAgICAgICAgICA+Pj46OnR5cGUKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQXJnPgorICAgIHN0cnVjdCBfX2lzX2RpcmVjdF9jb25zdHJ1Y3RpYmxlX25ldworICAgIDogcHVibGljIGNvbmRpdGlvbmFsPGlzX3JlZmVyZW5jZTxfVHA+Ojp2YWx1ZSwKKwkJCSBfX2lzX2RpcmVjdF9jb25zdHJ1Y3RpYmxlX3JlZl9jYXN0PF9UcCwgX0FyZz4sCisJCQkgX19pc19kaXJlY3RfY29uc3RydWN0aWJsZV9uZXdfc2FmZTxfVHAsIF9Bcmc+CisJCQkgPjo6dHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Bcmc+CisgICAgc3RydWN0IF9faXNfZGlyZWN0X2NvbnN0cnVjdGlibGUKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoX19pc19kaXJlY3RfY29uc3RydWN0aWJsZV9uZXc8CisJCQkJICAgICAgX1RwLCBfQXJnPjo6dmFsdWUpPgorICAgIHsgfTsKKworICAvLyBTaW5jZSBkZWZhdWx0LWNvbnN0cnVjdGlvbiBhbmQgYmluYXJ5IGRpcmVjdC1pbml0aWFsaXphdGlvbiBoYXZlCisgIC8vIGJlZW4gaGFuZGxlZCBzZXBhcmF0ZWx5LCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlbWFpbmluZworICAvLyBuLWFyeSBjb25zdHJ1Y3Rpb24gY2FzZXMgaXMgcmF0aGVyIHN0cmFpZ2h0Zm9yd2FyZC4gV2UgY2FuIHVzZQorICAvLyBoZXJlIGEgZnVuY3Rpb25hbCBjYXN0LCBiZWNhdXNlIGFycmF5IHR5cGVzIGFyZSBleGNsdWRlZCBhbnl3YXkKKyAgLy8gYW5kIHRoaXMgZm9ybSBpcyBuZXZlciBpbnRlcnByZXRlZCBhcyBhIEMgY2FzdC4KKyAgc3RydWN0IF9fZG9faXNfbmFyeV9jb25zdHJ1Y3RpYmxlX2ltcGwKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3MsIHR5cGVuYW1lCisgICAgICAgICAgICAgPSBkZWNsdHlwZShfVHAoZGVjbHZhbDxfQXJncz4oKS4uLikpPgorICAgICAgc3RhdGljIHRydWVfdHlwZSBfX3Rlc3QoaW50KTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZS4uLj4KKyAgICAgIHN0YXRpYyBmYWxzZV90eXBlIF9fdGVzdCguLi4pOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgc3RydWN0IF9faXNfbmFyeV9jb25zdHJ1Y3RpYmxlX2ltcGwKKyAgICA6IHB1YmxpYyBfX2RvX2lzX25hcnlfY29uc3RydWN0aWJsZV9pbXBsCisgICAgeworICAgICAgdHlwZWRlZiBkZWNsdHlwZShfX3Rlc3Q8X1RwLCBfQXJncy4uLj4oMCkpIHR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHN0cnVjdCBfX2lzX25hcnlfY29uc3RydWN0aWJsZQorICAgIDogcHVibGljIF9faXNfbmFyeV9jb25zdHJ1Y3RpYmxlX2ltcGw8X1RwLCBfQXJncy4uLj46OnR5cGUKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZi4uLihfQXJncykgPiAxLAorICAgICAgICAgICAgICAgICAgICAiT25seSB1c2VmdWwgZm9yID4gMSBhcmd1bWVudHMiKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgc3RydWN0IF9faXNfY29uc3RydWN0aWJsZV9pbXBsCisgICAgOiBwdWJsaWMgX19pc19uYXJ5X2NvbnN0cnVjdGlibGU8X1RwLCBfQXJncy4uLj4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQXJnPgorICAgIHN0cnVjdCBfX2lzX2NvbnN0cnVjdGlibGVfaW1wbDxfVHAsIF9Bcmc+CisgICAgOiBwdWJsaWMgX19pc19kaXJlY3RfY29uc3RydWN0aWJsZTxfVHAsIF9Bcmc+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19jb25zdHJ1Y3RpYmxlX2ltcGw8X1RwPgorICAgIDogcHVibGljIGlzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxfVHA+CisgICAgeyB9OworCisgIC8vLyBpc19jb25zdHJ1Y3RpYmxlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgc3RydWN0IGlzX2NvbnN0cnVjdGlibGUKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoX19pc19jb25zdHJ1Y3RpYmxlX2ltcGw8X1RwLAorCQkJCSAgICAgIF9BcmdzLi4uPjo6dmFsdWUpPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2wgPSBpc192b2lkPF9UcD46OnZhbHVlPgorICAgIHN0cnVjdCBfX2lzX2NvcHlfY29uc3RydWN0aWJsZV9pbXBsOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19jb3B5X2NvbnN0cnVjdGlibGVfaW1wbDxfVHAsIHRydWU+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2NvcHlfY29uc3RydWN0aWJsZV9pbXBsPF9UcCwgZmFsc2U+CisgICAgOiBwdWJsaWMgaXNfY29uc3RydWN0aWJsZTxfVHAsIGNvbnN0IF9UcCY+CisgICAgeyB9OworCisgIC8vLyBpc19jb3B5X2NvbnN0cnVjdGlibGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19jb3B5X2NvbnN0cnVjdGlibGUKKyAgICA6IHB1YmxpYyBfX2lzX2NvcHlfY29uc3RydWN0aWJsZV9pbXBsPF9UcD4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBib29sID0gaXNfdm9pZDxfVHA+Ojp2YWx1ZT4KKyAgICBzdHJ1Y3QgX19pc19tb3ZlX2NvbnN0cnVjdGlibGVfaW1wbDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbW92ZV9jb25zdHJ1Y3RpYmxlX2ltcGw8X1RwLCB0cnVlPgorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19tb3ZlX2NvbnN0cnVjdGlibGVfaW1wbDxfVHAsIGZhbHNlPgorICAgIDogcHVibGljIGlzX2NvbnN0cnVjdGlibGU8X1RwLCBfVHAmJj4KKyAgICB7IH07CisKKyAgLy8vIGlzX21vdmVfY29uc3RydWN0aWJsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX21vdmVfY29uc3RydWN0aWJsZQorICAgIDogcHVibGljIF9faXNfbW92ZV9jb25zdHJ1Y3RpYmxlX2ltcGw8X1RwPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbnRfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX2F0b20KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBub2V4Y2VwdChfVHAoKSk+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgYm9vbCA9IGlzX2FycmF5PF9UcD46OnZhbHVlPgorICAgIHN0cnVjdCBfX2lzX250X2RlZmF1bHRfY29uc3RydWN0aWJsZV9pbXBsOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19udF9kZWZhdWx0X2NvbnN0cnVjdGlibGVfaW1wbDxfVHAsIHRydWU+CisgICAgOiBwdWJsaWMgX19hbmRfPF9faXNfYXJyYXlfa25vd25fYm91bmRzPF9UcD4sCisJCSAgICBfX2lzX250X2RlZmF1bHRfY29uc3RydWN0aWJsZV9hdG9tPHR5cGVuYW1lCisgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX2FsbF9leHRlbnRzPF9UcD46OnR5cGU+Pjo6dHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbnRfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX2ltcGw8X1RwLCBmYWxzZT4KKyAgICA6IHB1YmxpYyBfX2lzX250X2RlZmF1bHRfY29uc3RydWN0aWJsZV9hdG9tPF9UcD4KKyAgICB7IH07CisKKyAgLy8vIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGUKKyAgICA6IHB1YmxpYyBfX2FuZF88aXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPF9UcD4sCisgICAgICAgICAgICAgICAgICAgIF9faXNfbnRfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX2ltcGw8X1RwPj46OnR5cGUKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgX19pc19udF9jb25zdHJ1Y3RpYmxlX2ltcGwKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBub2V4Y2VwdChfVHAoZGVjbHZhbDxfQXJncz4oKS4uLikpPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Bcmc+CisgICAgc3RydWN0IF9faXNfbnRfY29uc3RydWN0aWJsZV9pbXBsPF9UcCwgX0FyZz4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZXhjZXB0KHN0YXRpY19jYXN0PF9UcD4oZGVjbHZhbDxfQXJnPigpKSk+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19udF9jb25zdHJ1Y3RpYmxlX2ltcGw8X1RwPgorICAgIDogcHVibGljIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPF9UcD4KKyAgICB7IH07CisKKyAgLy8vIGlzX25vdGhyb3dfY29uc3RydWN0aWJsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHN0cnVjdCBpc19ub3Rocm93X2NvbnN0cnVjdGlibGUKKyAgICA6IHB1YmxpYyBfX2FuZF88aXNfY29uc3RydWN0aWJsZTxfVHAsIF9BcmdzLi4uPiwKKwkJICAgIF9faXNfbnRfY29uc3RydWN0aWJsZV9pbXBsPF9UcCwgX0FyZ3MuLi4+Pjo6dHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2wgPSBpc192b2lkPF9UcD46OnZhbHVlPgorICAgIHN0cnVjdCBfX2lzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlX2ltcGw7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlX2ltcGw8X1RwLCB0cnVlPgorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19ub3Rocm93X2NvcHlfY29uc3RydWN0aWJsZV9pbXBsPF9UcCwgZmFsc2U+CisgICAgOiBwdWJsaWMgaXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlPF9UcCwgY29uc3QgX1RwJj4KKyAgICB7IH07CisKKyAgLy8vIGlzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGUKKyAgICA6IHB1YmxpYyBfX2lzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RpYmxlX2ltcGw8X1RwPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2wgPSBpc192b2lkPF9UcD46OnZhbHVlPgorICAgIHN0cnVjdCBfX2lzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlX2ltcGw7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlX2ltcGw8X1RwLCB0cnVlPgorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZV9pbXBsPF9UcCwgZmFsc2U+CisgICAgOiBwdWJsaWMgaXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlPF9UcCwgX1RwJiY+CisgICAgeyB9OworCisgIC8vLyBpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlCisgICAgOiBwdWJsaWMgX19pc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZV9pbXBsPF9UcD4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgY2xhc3MgX19pc19hc3NpZ25hYmxlX2hlbHBlcgorICAgIDogcHVibGljIF9fc2ZpbmFlX3R5cGVzCisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1VwMT4KKyAgICAgICAgc3RhdGljIGRlY2x0eXBlKGRlY2x2YWw8X1RwMT4oKSA9IGRlY2x2YWw8X1VwMT4oKSwgX19vbmUoKSkKKwlfX3Rlc3QoaW50KTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPgorICAgICAgICBzdGF0aWMgX190d28gX190ZXN0KC4uLik7CisKKyAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPSBzaXplb2YoX190ZXN0PF9UcCwgX1VwPigwKSkgPT0gMTsKKyAgICB9OworCisgIC8vLyBpc19hc3NpZ25hYmxlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIHN0cnVjdCBpc19hc3NpZ25hYmxlCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2lzX2Fzc2lnbmFibGVfaGVscGVyPF9UcCwgX1VwPjo6dmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgYm9vbCA9IGlzX3ZvaWQ8X1RwPjo6dmFsdWU+CisgICAgc3RydWN0IF9faXNfY29weV9hc3NpZ25hYmxlX2ltcGw7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2NvcHlfYXNzaWduYWJsZV9pbXBsPF9UcCwgdHJ1ZT4KKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfY29weV9hc3NpZ25hYmxlX2ltcGw8X1RwLCBmYWxzZT4KKyAgICA6IHB1YmxpYyBpc19hc3NpZ25hYmxlPF9UcCYsIGNvbnN0IF9UcCY+CisgICAgeyB9OworCisgIC8vLyBpc19jb3B5X2Fzc2lnbmFibGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19jb3B5X2Fzc2lnbmFibGUKKyAgICA6IHB1YmxpYyBfX2lzX2NvcHlfYXNzaWduYWJsZV9pbXBsPF9UcD4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBib29sID0gaXNfdm9pZDxfVHA+Ojp2YWx1ZT4KKyAgICBzdHJ1Y3QgX19pc19tb3ZlX2Fzc2lnbmFibGVfaW1wbDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbW92ZV9hc3NpZ25hYmxlX2ltcGw8X1RwLCB0cnVlPgorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19tb3ZlX2Fzc2lnbmFibGVfaW1wbDxfVHAsIGZhbHNlPgorICAgIDogcHVibGljIGlzX2Fzc2lnbmFibGU8X1RwJiwgX1RwJiY+CisgICAgeyB9OworCisgIC8vLyBpc19tb3ZlX2Fzc2lnbmFibGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19tb3ZlX2Fzc2lnbmFibGUKKyAgICA6IHB1YmxpYyBfX2lzX21vdmVfYXNzaWduYWJsZV9pbXBsPF9UcD4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgc3RydWN0IF9faXNfbnRfYXNzaWduYWJsZV9pbXBsCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgbm9leGNlcHQoZGVjbHZhbDxfVHA+KCkgPSBkZWNsdmFsPF9VcD4oKSk+CisgICAgeyB9OworCisgIC8vLyBpc19ub3Rocm93X2Fzc2lnbmFibGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgc3RydWN0IGlzX25vdGhyb3dfYXNzaWduYWJsZQorICAgIDogcHVibGljIF9fYW5kXzxpc19hc3NpZ25hYmxlPF9UcCwgX1VwPiwKKwkJICAgIF9faXNfbnRfYXNzaWduYWJsZV9pbXBsPF9UcCwgX1VwPj46OnR5cGUKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBib29sID0gaXNfdm9pZDxfVHA+Ojp2YWx1ZT4KKyAgICBzdHJ1Y3QgX19pc19udF9jb3B5X2Fzc2lnbmFibGVfaW1wbDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbnRfY29weV9hc3NpZ25hYmxlX2ltcGw8X1RwLCB0cnVlPgorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19udF9jb3B5X2Fzc2lnbmFibGVfaW1wbDxfVHAsIGZhbHNlPgorICAgIDogcHVibGljIGlzX25vdGhyb3dfYXNzaWduYWJsZTxfVHAmLCBjb25zdCBfVHAmPgorICAgIHsgfTsKKworICAvLy8gaXNfbm90aHJvd19jb3B5X2Fzc2lnbmFibGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19ub3Rocm93X2NvcHlfYXNzaWduYWJsZQorICAgIDogcHVibGljIF9faXNfbnRfY29weV9hc3NpZ25hYmxlX2ltcGw8X1RwPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2wgPSBpc192b2lkPF9UcD46OnZhbHVlPgorICAgIHN0cnVjdCBfX2lzX250X21vdmVfYXNzaWduYWJsZV9pbXBsOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19udF9tb3ZlX2Fzc2lnbmFibGVfaW1wbDxfVHAsIHRydWU+CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX250X21vdmVfYXNzaWduYWJsZV9pbXBsPF9UcCwgZmFsc2U+CisgICAgOiBwdWJsaWMgaXNfbm90aHJvd19hc3NpZ25hYmxlPF9UcCYsIF9UcCYmPgorICAgIHsgfTsKKworICAvLy8gaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZQorICAgIDogcHVibGljIF9faXNfbnRfbW92ZV9hc3NpZ25hYmxlX2ltcGw8X1RwPgorICAgIHsgfTsKKworICAvLy8gaXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUgKHN0aWxsIHVuaW1wbGVtZW50ZWQpCisgIAorICAvLy8gaXNfdHJpdmlhbGx5X2RlZmF1bHRfY29uc3RydWN0aWJsZSAoc3RpbGwgdW5pbXBsZW1lbnRlZCkKKworICAvLy8gaXNfdHJpdmlhbGx5X2NvcHlfY29uc3RydWN0aWJsZSAoc3RpbGwgdW5pbXBsZW1lbnRlZCkKKworICAvLy8gaXNfdHJpdmlhbGx5X21vdmVfY29uc3RydWN0aWJsZSAoc3RpbGwgdW5pbXBsZW1lbnRlZCkKKworICAvLy8gaXNfdHJpdmlhbGx5X2Fzc2lnbmFibGUgKHN0aWxsIHVuaW1wbGVtZW50ZWQpCisKKyAgLy8vIGlzX3RyaXZpYWxseV9jb3B5X2Fzc2lnbmFibGUgKHN0aWxsIHVuaW1wbGVtZW50ZWQpCisKKyAgLy8vIGlzX3RyaXZpYWxseV9tb3ZlX2Fzc2lnbmFibGUgKHN0aWxsIHVuaW1wbGVtZW50ZWQpCisKKyAgLy8vIGlzX3RyaXZpYWxseV9kZXN0cnVjdGlibGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc190cml2aWFsbHlfZGVzdHJ1Y3RpYmxlCisgICAgOiBwdWJsaWMgX19hbmRfPGlzX2Rlc3RydWN0aWJsZTxfVHA+LCBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorCQkJICAgICAgX19oYXNfdHJpdmlhbF9kZXN0cnVjdG9yKF9UcCk+Pjo6dHlwZQorICAgIHsgfTsKKworICAvLy8gaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvciAodGVtcG9yYXJ5IGxlZ2FjeSkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19oYXNfdHJpdmlhbF9jb25zdHJ1Y3RvcihfVHApPgorICAgIHsgfTsKKworICAvLy8gaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvciAodGVtcG9yYXJ5IGxlZ2FjeSkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19oYXNfdHJpdmlhbF9jb3B5KF9UcCk+CisgICAgeyB9OworCisgIC8vLyBoYXNfdHJpdmlhbF9jb3B5X2Fzc2lnbiAodGVtcG9yYXJ5IGxlZ2FjeSkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBoYXNfdHJpdmlhbF9jb3B5X2Fzc2lnbgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faGFzX3RyaXZpYWxfYXNzaWduKF9UcCk+CisgICAgeyB9OworCisgIC8vLyBoYXNfdmlydHVhbF9kZXN0cnVjdG9yCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzX3ZpcnR1YWxfZGVzdHJ1Y3RvcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faGFzX3ZpcnR1YWxfZGVzdHJ1Y3RvcihfVHApPgorICAgIHsgfTsKKworICAKKyAgLy8gdHlwZSBwcm9wZXJ0eSBxdWVyaWVzLgorCisgIC8vLyBhbGlnbm1lbnRfb2YKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhbGlnbm1lbnRfb2YKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwgX19hbGlnbm9mX18oX1RwKT4geyB9OworICAKKyAgLy8vIHJhbmsKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IHJhbmsKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwgMD4geyB9OworICAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX1NpemU+CisgICAgc3RydWN0IHJhbms8X1RwW19TaXplXT4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwgMSArIHJhbms8X1RwPjo6dmFsdWU+IHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJhbms8X1RwW10+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIDEgKyByYW5rPF9UcD46OnZhbHVlPiB7IH07CisKKyAgLy8vIGV4dGVudAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdW5zaWduZWQgX1VpbnQ+CisgICAgc3RydWN0IGV4dGVudAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PHN0ZDo6c2l6ZV90LCAwPiB7IH07CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHVuc2lnbmVkIF9VaW50LCBzdGQ6OnNpemVfdCBfU2l6ZT4KKyAgICBzdHJ1Y3QgZXh0ZW50PF9UcFtfU2l6ZV0sIF9VaW50PgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PHN0ZDo6c2l6ZV90LAorCQkJICAgICAgIF9VaW50ID09IDAgPyBfU2l6ZSA6IGV4dGVudDxfVHAsCisJCQkJCQkJICAgX1VpbnQgLSAxPjo6dmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdW5zaWduZWQgX1VpbnQ+CisgICAgc3RydWN0IGV4dGVudDxfVHBbXSwgX1VpbnQ+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsCisJCQkgICAgICAgX1VpbnQgPT0gMCA/IDAgOiBleHRlbnQ8X1RwLAorCQkJCQkJICAgICAgIF9VaW50IC0gMT46OnZhbHVlPgorICAgIHsgfTsKKworCisgIC8vIFR5cGUgcmVsYXRpb25zLgorCisgIC8vLyBpc19zYW1lCisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfc2FtZQorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfc2FtZTxfVHAsIF9UcD4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIC8vLyBpc19iYXNlX29mCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CYXNlLCB0eXBlbmFtZSBfRGVyaXZlZD4KKyAgICBzdHJ1Y3QgaXNfYmFzZV9vZgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfYmFzZV9vZihfQmFzZSwgX0Rlcml2ZWQpPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnJvbSwgdHlwZW5hbWUgX1RvLAorICAgICAgICAgICBib29sID0gX19vcl88aXNfdm9pZDxfRnJvbT4sIGlzX2Z1bmN0aW9uPF9Ubz4sCisgICAgICAgICAgICAgICAgICAgICAgICBpc19hcnJheTxfVG8+Pjo6dmFsdWU+CisgICAgc3RydWN0IF9faXNfY29udmVydGlibGVfaGVscGVyCisgICAgeyBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPSBpc192b2lkPF9Ubz46OnZhbHVlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gcm9tLCB0eXBlbmFtZSBfVG8+CisgICAgY2xhc3MgX19pc19jb252ZXJ0aWJsZV9oZWxwZXI8X0Zyb20sIF9UbywgZmFsc2U+CisgICAgOiBwdWJsaWMgX19zZmluYWVfdHlwZXMKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG8xPgorICAgICAgICBzdGF0aWMgdm9pZCBfX3Rlc3RfYXV4KF9UbzEpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnJvbTEsIHR5cGVuYW1lIF9UbzE+CisgICAgICAgIHN0YXRpYyBkZWNsdHlwZShfX3Rlc3RfYXV4PF9UbzE+KHN0ZDo6ZGVjbHZhbDxfRnJvbTE+KCkpLCBfX29uZSgpKQorCV9fdGVzdChpbnQpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+CisgICAgICAgIHN0YXRpYyBfX3R3byBfX3Rlc3QoLi4uKTsKKworICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCB2YWx1ZSA9IHNpemVvZihfX3Rlc3Q8X0Zyb20sIF9Ubz4oMCkpID09IDE7CisgICAgfTsKKworICAvLy8gaXNfY29udmVydGlibGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Zyb20sIHR5cGVuYW1lIF9Ubz4KKyAgICBzdHJ1Y3QgaXNfY29udmVydGlibGUKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorCQkJICAgICAgIF9faXNfY29udmVydGlibGVfaGVscGVyPF9Gcm9tLCBfVG8+Ojp2YWx1ZT4KKyAgICB7IH07CisKKworICAvLyBDb25zdC12b2xhdGlsZSBtb2RpZmljYXRpb25zLgorCisgIC8vLyByZW1vdmVfY29uc3QKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfY29uc3QKKyAgICB7IHR5cGVkZWYgX1RwICAgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX2NvbnN0PF9UcCBjb25zdD4KKyAgICB7IHR5cGVkZWYgX1RwICAgICB0eXBlOyB9OworICAKKyAgLy8vIHJlbW92ZV92b2xhdGlsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV92b2xhdGlsZQorICAgIHsgdHlwZWRlZiBfVHAgICAgIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfdm9sYXRpbGU8X1RwIHZvbGF0aWxlPgorICAgIHsgdHlwZWRlZiBfVHAgICAgIHR5cGU7IH07CisgIAorICAvLy8gcmVtb3ZlX2N2CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX2N2CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZQorICAgICAgcmVtb3ZlX2NvbnN0PHR5cGVuYW1lIHJlbW92ZV92b2xhdGlsZTxfVHA+Ojp0eXBlPjo6dHlwZSAgICAgdHlwZTsKKyAgICB9OworICAKKyAgLy8vIGFkZF9jb25zdAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGFkZF9jb25zdAorICAgIHsgdHlwZWRlZiBfVHAgY29uc3QgICAgIHR5cGU7IH07CisgICAKKyAgLy8vIGFkZF92b2xhdGlsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGFkZF92b2xhdGlsZQorICAgIHsgdHlwZWRlZiBfVHAgdm9sYXRpbGUgICAgIHR5cGU7IH07CisgIAorICAvLy8gYWRkX2N2CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYWRkX2N2CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZQorICAgICAgYWRkX2NvbnN0PHR5cGVuYW1lIGFkZF92b2xhdGlsZTxfVHA+Ojp0eXBlPjo6dHlwZSAgICAgdHlwZTsKKyAgICB9OworCisKKyAgLy8gUmVmZXJlbmNlIHRyYW5zZm9ybWF0aW9ucy4KKworICAvLy8gcmVtb3ZlX3JlZmVyZW5jZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9yZWZlcmVuY2UKKyAgICB7IHR5cGVkZWYgX1RwICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9yZWZlcmVuY2U8X1RwJj4KKyAgICB7IHR5cGVkZWYgX1RwICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9yZWZlcmVuY2U8X1RwJiY+CisgICAgeyB0eXBlZGVmIF9UcCAgIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLAorCSAgIGJvb2wgPSBfX2FuZF88X19ub3RfPGlzX3JlZmVyZW5jZTxfVHA+PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX25vdF88aXNfdm9pZDxfVHA+Pj46OnZhbHVlLAorCSAgIGJvb2wgPSBpc19ydmFsdWVfcmVmZXJlbmNlPF9UcD46OnZhbHVlPgorICAgIHN0cnVjdCBfX2FkZF9sdmFsdWVfcmVmZXJlbmNlX2hlbHBlcgorICAgIHsgdHlwZWRlZiBfVHAgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hZGRfbHZhbHVlX3JlZmVyZW5jZV9oZWxwZXI8X1RwLCB0cnVlLCBmYWxzZT4KKyAgICB7IHR5cGVkZWYgX1RwJiAgIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2FkZF9sdmFsdWVfcmVmZXJlbmNlX2hlbHBlcjxfVHAsIGZhbHNlLCB0cnVlPgorICAgIHsgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9UcD46OnR5cGUmICAgdHlwZTsgfTsKKworICAvLy8gYWRkX2x2YWx1ZV9yZWZlcmVuY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhZGRfbHZhbHVlX3JlZmVyZW5jZQorICAgIDogcHVibGljIF9fYWRkX2x2YWx1ZV9yZWZlcmVuY2VfaGVscGVyPF9UcD4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLAorICAgICAgICAgICBib29sID0gX19hbmRfPF9fbm90Xzxpc19yZWZlcmVuY2U8X1RwPj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgX19ub3RfPGlzX3ZvaWQ8X1RwPj4+Ojp2YWx1ZT4KKyAgICBzdHJ1Y3QgX19hZGRfcnZhbHVlX3JlZmVyZW5jZV9oZWxwZXIKKyAgICB7IHR5cGVkZWYgX1RwICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fYWRkX3J2YWx1ZV9yZWZlcmVuY2VfaGVscGVyPF9UcCwgdHJ1ZT4KKyAgICB7IHR5cGVkZWYgX1RwJiYgICB0eXBlOyB9OworCisgIC8vLyBhZGRfcnZhbHVlX3JlZmVyZW5jZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGFkZF9ydmFsdWVfcmVmZXJlbmNlCisgICAgOiBwdWJsaWMgX19hZGRfcnZhbHVlX3JlZmVyZW5jZV9oZWxwZXI8X1RwPgorICAgIHsgfTsKKworCisgIC8vIFNpZ24gbW9kaWZpY2F0aW9ucy4KKworICAvLyBVdGlsaXR5IGZvciBjb25zdHJ1Y3RpbmcgaWRlbnRpY2FsbHkgY3YtcXVhbGlmaWVkIHR5cGVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5xdWFsaWZpZWQsIGJvb2wgX0lzQ29uc3QsIGJvb2wgX0lzVm9sPgorICAgIHN0cnVjdCBfX2N2X3NlbGVjdG9yOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VbnF1YWxpZmllZD4KKyAgICBzdHJ1Y3QgX19jdl9zZWxlY3RvcjxfVW5xdWFsaWZpZWQsIGZhbHNlLCBmYWxzZT4KKyAgICB7IHR5cGVkZWYgX1VucXVhbGlmaWVkIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5xdWFsaWZpZWQ+CisgICAgc3RydWN0IF9fY3Zfc2VsZWN0b3I8X1VucXVhbGlmaWVkLCBmYWxzZSwgdHJ1ZT4KKyAgICB7IHR5cGVkZWYgdm9sYXRpbGUgX1VucXVhbGlmaWVkIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5xdWFsaWZpZWQ+CisgICAgc3RydWN0IF9fY3Zfc2VsZWN0b3I8X1VucXVhbGlmaWVkLCB0cnVlLCBmYWxzZT4KKyAgICB7IHR5cGVkZWYgY29uc3QgX1VucXVhbGlmaWVkIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5xdWFsaWZpZWQ+CisgICAgc3RydWN0IF9fY3Zfc2VsZWN0b3I8X1VucXVhbGlmaWVkLCB0cnVlLCB0cnVlPgorICAgIHsgdHlwZWRlZiBjb25zdCB2b2xhdGlsZSBfVW5xdWFsaWZpZWQgX190eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9RdWFsaWZpZWQsIHR5cGVuYW1lIF9VbnF1YWxpZmllZCwKKwkgICBib29sIF9Jc0NvbnN0ID0gaXNfY29uc3Q8X1F1YWxpZmllZD46OnZhbHVlLAorCSAgIGJvb2wgX0lzVm9sID0gaXNfdm9sYXRpbGU8X1F1YWxpZmllZD46OnZhbHVlPgorICAgIGNsYXNzIF9fbWF0Y2hfY3ZfcXVhbGlmaWVycworICAgIHsKKyAgICAgIHR5cGVkZWYgX19jdl9zZWxlY3RvcjxfVW5xdWFsaWZpZWQsIF9Jc0NvbnN0LCBfSXNWb2w+IF9fbWF0Y2g7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fbWF0Y2g6Ol9fdHlwZSBfX3R5cGU7IAorICAgIH07CisKKyAgLy8gVXRpbGl0eSBmb3IgZmluZGluZyB0aGUgdW5zaWduZWQgdmVyc2lvbnMgb2Ygc2lnbmVkIGludGVncmFsIHR5cGVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fbWFrZV91bnNpZ25lZAorICAgIHsgdHlwZWRlZiBfVHAgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19tYWtlX3Vuc2lnbmVkPGNoYXI+CisgICAgeyB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19tYWtlX3Vuc2lnbmVkPHNpZ25lZCBjaGFyPgorICAgIHsgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fbWFrZV91bnNpZ25lZDxzaG9ydD4KKyAgICB7IHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19tYWtlX3Vuc2lnbmVkPGludD4KKyAgICB7IHR5cGVkZWYgdW5zaWduZWQgaW50IF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fbWFrZV91bnNpZ25lZDxsb25nPgorICAgIHsgdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fbWFrZV91bnNpZ25lZDxsb25nIGxvbmc+CisgICAgeyB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBfX3R5cGU7IH07CisKKyNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pICYmIGRlZmluZWQoX0dMSUJDWFhfVVNFX0lOVDEyOCkKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX21ha2VfdW5zaWduZWQ8X19pbnQxMjg+CisgICAgeyB0eXBlZGVmIHVuc2lnbmVkIF9faW50MTI4IF9fdHlwZTsgfTsKKyNlbmRpZgorCisgIC8vIFNlbGVjdCBiZXR3ZWVuIGludGVncmFsIGFuZCBlbnVtOiBub3QgcG9zc2libGUgdG8gYmUgYm90aC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCAKKwkgICBib29sIF9Jc0ludCA9IGlzX2ludGVncmFsPF9UcD46OnZhbHVlLAorCSAgIGJvb2wgX0lzRW51bSA9IGlzX2VudW08X1RwPjo6dmFsdWU+CisgICAgY2xhc3MgX19tYWtlX3Vuc2lnbmVkX3NlbGVjdG9yOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBfX21ha2VfdW5zaWduZWRfc2VsZWN0b3I8X1RwLCB0cnVlLCBmYWxzZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9fbWFrZV91bnNpZ25lZDx0eXBlbmFtZSByZW1vdmVfY3Y8X1RwPjo6dHlwZT4gX191bnNpZ25lZHQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdW5zaWduZWR0OjpfX3R5cGUgX191bnNpZ25lZF90eXBlOworICAgICAgdHlwZWRlZiBfX21hdGNoX2N2X3F1YWxpZmllcnM8X1RwLCBfX3Vuc2lnbmVkX3R5cGU+IF9fY3ZfdW5zaWduZWQ7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fY3ZfdW5zaWduZWQ6Ol9fdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgX19tYWtlX3Vuc2lnbmVkX3NlbGVjdG9yPF9UcCwgZmFsc2UsIHRydWU+CisgICAgeworICAgICAgLy8gV2l0aCAtZnNob3J0LWVudW1zLCBhbiBlbnVtIG1heSBiZSBhcyBzbWFsbCBhcyBhIGNoYXIuCisgICAgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX19zbWFsbGVzdDsKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIF9fYjAgPSBzaXplb2YoX1RwKSA8PSBzaXplb2YoX19zbWFsbGVzdCk7CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBfX2IxID0gc2l6ZW9mKF9UcCkgPD0gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIF9fYjIgPSBzaXplb2YoX1RwKSA8PSBzaXplb2YodW5zaWduZWQgaW50KTsKKyAgICAgIHR5cGVkZWYgY29uZGl0aW9uYWw8X19iMiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nPiBfX2NvbmQyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2NvbmQyOjp0eXBlIF9fY29uZDJfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uZGl0aW9uYWw8X19iMSwgdW5zaWduZWQgc2hvcnQsIF9fY29uZDJfdHlwZT4gX19jb25kMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19jb25kMTo6dHlwZSBfX2NvbmQxX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPF9fYjAsIF9fc21hbGxlc3QsIF9fY29uZDFfdHlwZT46OnR5cGUgX190eXBlOworICAgIH07CisKKyAgLy8gR2l2ZW4gYW4gaW50ZWdyYWwvZW51bSB0eXBlLCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgdW5zaWduZWQKKyAgLy8gaW50ZWdlciB0eXBlLgorICAvLyBQcmltYXJ5IHRlbXBsYXRlLgorICAvLy8gbWFrZV91bnNpZ25lZAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IG1ha2VfdW5zaWduZWQgCisgICAgeyB0eXBlZGVmIHR5cGVuYW1lIF9fbWFrZV91bnNpZ25lZF9zZWxlY3RvcjxfVHA+OjpfX3R5cGUgdHlwZTsgfTsKKworICAvLyBJbnRlZ3JhbCwgYnV0IGRvbid0IGRlZmluZS4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBtYWtlX3Vuc2lnbmVkPGJvb2w+OworCisKKyAgLy8gVXRpbGl0eSBmb3IgZmluZGluZyB0aGUgc2lnbmVkIHZlcnNpb25zIG9mIHVuc2lnbmVkIGludGVncmFsIHR5cGVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fbWFrZV9zaWduZWQKKyAgICB7IHR5cGVkZWYgX1RwIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fbWFrZV9zaWduZWQ8Y2hhcj4KKyAgICB7IHR5cGVkZWYgc2lnbmVkIGNoYXIgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19tYWtlX3NpZ25lZDx1bnNpZ25lZCBjaGFyPgorICAgIHsgdHlwZWRlZiBzaWduZWQgY2hhciBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX21ha2Vfc2lnbmVkPHVuc2lnbmVkIHNob3J0PgorICAgIHsgdHlwZWRlZiBzaWduZWQgc2hvcnQgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19tYWtlX3NpZ25lZDx1bnNpZ25lZCBpbnQ+CisgICAgeyB0eXBlZGVmIHNpZ25lZCBpbnQgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19tYWtlX3NpZ25lZDx1bnNpZ25lZCBsb25nPgorICAgIHsgdHlwZWRlZiBzaWduZWQgbG9uZyBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX21ha2Vfc2lnbmVkPHVuc2lnbmVkIGxvbmcgbG9uZz4KKyAgICB7IHR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBfX3R5cGU7IH07CisKKyNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pICYmIGRlZmluZWQoX0dMSUJDWFhfVVNFX0lOVDEyOCkKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX21ha2Vfc2lnbmVkPHVuc2lnbmVkIF9faW50MTI4PgorICAgIHsgdHlwZWRlZiBfX2ludDEyOCBfX3R5cGU7IH07CisjZW5kaWYKKworICAvLyBTZWxlY3QgYmV0d2VlbiBpbnRlZ3JhbCBhbmQgZW51bTogbm90IHBvc3NpYmxlIHRvIGJlIGJvdGguCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgCisJICAgYm9vbCBfSXNJbnQgPSBpc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZSwKKwkgICBib29sIF9Jc0VudW0gPSBpc19lbnVtPF9UcD46OnZhbHVlPgorICAgIGNsYXNzIF9fbWFrZV9zaWduZWRfc2VsZWN0b3I7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIF9fbWFrZV9zaWduZWRfc2VsZWN0b3I8X1RwLCB0cnVlLCBmYWxzZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9fbWFrZV9zaWduZWQ8dHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+IF9fc2lnbmVkdDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19zaWduZWR0OjpfX3R5cGUgX19zaWduZWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgX19tYXRjaF9jdl9xdWFsaWZpZXJzPF9UcCwgX19zaWduZWRfdHlwZT4gX19jdl9zaWduZWQ7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fY3Zfc2lnbmVkOjpfX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIF9fbWFrZV9zaWduZWRfc2VsZWN0b3I8X1RwLCBmYWxzZSwgdHJ1ZT4KKyAgICB7CisgICAgICAvLyBXaXRoIC1mc2hvcnQtZW51bXMsIGFuIGVudW0gbWF5IGJlIGFzIHNtYWxsIGFzIGEgY2hhci4KKyAgICAgIHR5cGVkZWYgc2lnbmVkIGNoYXIgX19zbWFsbGVzdDsKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIF9fYjAgPSBzaXplb2YoX1RwKSA8PSBzaXplb2YoX19zbWFsbGVzdCk7CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBfX2IxID0gc2l6ZW9mKF9UcCkgPD0gc2l6ZW9mKHNpZ25lZCBzaG9ydCk7CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBfX2IyID0gc2l6ZW9mKF9UcCkgPD0gc2l6ZW9mKHNpZ25lZCBpbnQpOworICAgICAgdHlwZWRlZiBjb25kaXRpb25hbDxfX2IyLCBzaWduZWQgaW50LCBzaWduZWQgbG9uZz4gX19jb25kMjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19jb25kMjo6dHlwZSBfX2NvbmQyX3R5cGU7CisgICAgICB0eXBlZGVmIGNvbmRpdGlvbmFsPF9fYjEsIHNpZ25lZCBzaG9ydCwgX19jb25kMl90eXBlPiBfX2NvbmQxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2NvbmQxOjp0eXBlIF9fY29uZDFfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8X19iMCwgX19zbWFsbGVzdCwgX19jb25kMV90eXBlPjo6dHlwZSBfX3R5cGU7CisgICAgfTsKKworICAvLyBHaXZlbiBhbiBpbnRlZ3JhbC9lbnVtIHR5cGUsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBzaWduZWQKKyAgLy8gaW50ZWdlciB0eXBlLgorICAvLyBQcmltYXJ5IHRlbXBsYXRlLgorICAvLy8gbWFrZV9zaWduZWQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBtYWtlX3NpZ25lZCAKKyAgICB7IHR5cGVkZWYgdHlwZW5hbWUgX19tYWtlX3NpZ25lZF9zZWxlY3RvcjxfVHA+OjpfX3R5cGUgdHlwZTsgfTsKKworICAvLyBJbnRlZ3JhbCwgYnV0IGRvbid0IGRlZmluZS4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBtYWtlX3NpZ25lZDxib29sPjsKKworCisgIC8vIEFycmF5IG1vZGlmaWNhdGlvbnMuCisKKyAgLy8vIHJlbW92ZV9leHRlbnQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfZXh0ZW50CisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9TaXplPgorICAgIHN0cnVjdCByZW1vdmVfZXh0ZW50PF9UcFtfU2l6ZV0+CisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9leHRlbnQ8X1RwW10+CisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICAvLy8gcmVtb3ZlX2FsbF9leHRlbnRzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX2FsbF9leHRlbnRzCisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9TaXplPgorICAgIHN0cnVjdCByZW1vdmVfYWxsX2V4dGVudHM8X1RwW19TaXplXT4KKyAgICB7IHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbF9leHRlbnRzPF9UcD46OnR5cGUgICAgIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfYWxsX2V4dGVudHM8X1RwW10+CisgICAgeyB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGxfZXh0ZW50czxfVHA+Ojp0eXBlICAgICB0eXBlOyB9OworCisKKyAgLy8gUG9pbnRlciBtb2RpZmljYXRpb25zLgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWU+CisgICAgc3RydWN0IF9fcmVtb3ZlX3BvaW50ZXJfaGVscGVyCisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBzdHJ1Y3QgX19yZW1vdmVfcG9pbnRlcl9oZWxwZXI8X1RwLCBfVXAqPgorICAgIHsgdHlwZWRlZiBfVXAgICAgIHR5cGU7IH07CisKKyAgLy8vIHJlbW92ZV9wb2ludGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX3BvaW50ZXIKKyAgICA6IHB1YmxpYyBfX3JlbW92ZV9wb2ludGVyX2hlbHBlcjxfVHAsIHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPgorICAgIHsgfTsKKworICAvLy8gYWRkX3BvaW50ZXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhZGRfcG9pbnRlcgorICAgIHsgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9UcD46OnR5cGUqICAgICB0eXBlOyB9OworCisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0xlbj4KKyAgICBzdHJ1Y3QgX19hbGlnbmVkX3N0b3JhZ2VfbXNhCisgICAgeyAKKyAgICAgIHVuaW9uIF9fdHlwZQorICAgICAgeworCXVuc2lnbmVkIGNoYXIgX19kYXRhW19MZW5dOworCXN0cnVjdCBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXykpIHsgfSBfX2FsaWduOyAKKyAgICAgIH07CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiBBbGlnbm1lbnQgdHlwZS4KKyAgICoKKyAgICogIFRoZSB2YWx1ZSBvZiBfQWxpZ24gaXMgYSBkZWZhdWx0LWFsaWdubWVudCB3aGljaCBzaGFsbCBiZSB0aGUKKyAgICogIG1vc3Qgc3RyaW5nZW50IGFsaWdubWVudCByZXF1aXJlbWVudCBmb3IgYW55IEMrKyBvYmplY3QgdHlwZQorICAgKiAgd2hvc2Ugc2l6ZSBpcyBubyBncmVhdGVyIHRoYW4gX0xlbiAoMy45KS4gVGhlIG1lbWJlciB0eXBlZGVmCisgICAqICB0eXBlIHNoYWxsIGJlIGEgUE9EIHR5cGUgc3VpdGFibGUgZm9yIHVzZSBhcyB1bmluaXRpYWxpemVkCisgICAqICBzdG9yYWdlIGZvciBhbnkgb2JqZWN0IHdob3NlIHNpemUgaXMgYXQgbW9zdCBfTGVuIGFuZCB3aG9zZQorICAgKiAgYWxpZ25tZW50IGlzIGEgZGl2aXNvciBvZiBfQWxpZ24uCisgICovCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9MZW4sIHN0ZDo6c2l6ZV90IF9BbGlnbiA9CisJICAgX19hbGlnbm9mX18odHlwZW5hbWUgX19hbGlnbmVkX3N0b3JhZ2VfbXNhPF9MZW4+OjpfX3R5cGUpPgorICAgIHN0cnVjdCBhbGlnbmVkX3N0b3JhZ2UKKyAgICB7IAorICAgICAgdW5pb24gdHlwZQorICAgICAgeworCXVuc2lnbmVkIGNoYXIgX19kYXRhW19MZW5dOworCXN0cnVjdCBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXygoX0FsaWduKSkpKSB7IH0gX19hbGlnbjsgCisgICAgICB9OworICAgIH07CisKKworICAvLyBEZWNheSB0cmFpdCBmb3IgYXJyYXlzIGFuZCBmdW5jdGlvbnMsIHVzZWQgZm9yIHBlcmZlY3QgZm9yd2FyZGluZworICAvLyBpbiBtYWtlX3BhaXIsIG1ha2VfdHVwbGUsIGV0Yy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwLCAKKwkgICBib29sIF9Jc0FycmF5ID0gaXNfYXJyYXk8X1VwPjo6dmFsdWUsCisJICAgYm9vbCBfSXNGdW5jdGlvbiA9IGlzX2Z1bmN0aW9uPF9VcD46OnZhbHVlPiAKKyAgICBzdHJ1Y3QgX19kZWNheV9zZWxlY3RvcjsKKworICAvLyBOQjogRFIgNzA1LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+IAorICAgIHN0cnVjdCBfX2RlY2F5X3NlbGVjdG9yPF9VcCwgZmFsc2UsIGZhbHNlPgorICAgIHsgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfY3Y8X1VwPjo6dHlwZSBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPiAKKyAgICBzdHJ1Y3QgX19kZWNheV9zZWxlY3RvcjxfVXAsIHRydWUsIGZhbHNlPgorICAgIHsgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfZXh0ZW50PF9VcD46OnR5cGUqIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+IAorICAgIHN0cnVjdCBfX2RlY2F5X3NlbGVjdG9yPF9VcCwgZmFsc2UsIHRydWU+CisgICAgeyB0eXBlZGVmIHR5cGVuYW1lIGFkZF9wb2ludGVyPF9VcD46OnR5cGUgX190eXBlOyB9OworCisgIC8vLyBkZWNheQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IAorICAgIGNsYXNzIGRlY2F5IAorICAgIHsgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZSBfX3JlbW92ZV90eXBlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2RlY2F5X3NlbGVjdG9yPF9fcmVtb3ZlX3R5cGU+OjpfX3R5cGUgdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyByZWZlcmVuY2Vfd3JhcHBlcjsKKworICAvLyBIZWxwZXIgd2hpY2ggYWRkcyBhIHJlZmVyZW5jZSB0byBhIHR5cGUgd2hlbiBnaXZlbiBhIHJlZmVyZW5jZV93cmFwcGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19zdHJpcF9yZWZlcmVuY2Vfd3JhcHBlcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19zdHJpcF9yZWZlcmVuY2Vfd3JhcHBlcjxyZWZlcmVuY2Vfd3JhcHBlcjxfVHA+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9UcCYgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX3N0cmlwX3JlZmVyZW5jZV93cmFwcGVyPGNvbnN0IHJlZmVyZW5jZV93cmFwcGVyPF9UcD4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwJiBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fZGVjYXlfYW5kX3N0cmlwCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3N0cmlwX3JlZmVyZW5jZV93cmFwcGVyPAorCXR5cGVuYW1lIGRlY2F5PF9UcD46OnR5cGU+OjpfX3R5cGUgX190eXBlOworICAgIH07CisKKworICAvLyBQcmltYXJ5IHRlbXBsYXRlLgorICAvLy8gRGVmaW5lIGEgbWVtYmVyIHR5cGVkZWYgQGMgdHlwZSBvbmx5IGlmIGEgYm9vbGVhbiBjb25zdGFudCBpcyB0cnVlLgorICB0ZW1wbGF0ZTxib29sLCB0eXBlbmFtZSBfVHAgPSB2b2lkPgorICAgIHN0cnVjdCBlbmFibGVfaWYgCisgICAgeyB9OworCisgIC8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yIHRydWUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgZW5hYmxlX2lmPHRydWUsIF9UcD4KKyAgICB7IHR5cGVkZWYgX1RwIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0NvbmQ+CisgICAgdXNpbmcgX1JlcXVpcmUgPSB0eXBlbmFtZSBlbmFibGVfaWY8X19hbmRfPF9Db25kLi4uPjo6dmFsdWU+Ojp0eXBlOworCisgIC8vIFByaW1hcnkgdGVtcGxhdGUuCisgIC8vLyBEZWZpbmUgYSBtZW1iZXIgdHlwZWRlZiBAYyB0eXBlIHRvIG9uZSBvZiB0d28gYXJndW1lbnQgdHlwZXMuCisgIHRlbXBsYXRlPGJvb2wgX0NvbmQsIHR5cGVuYW1lIF9JZnRydWUsIHR5cGVuYW1lIF9JZmZhbHNlPgorICAgIHN0cnVjdCBjb25kaXRpb25hbAorICAgIHsgdHlwZWRlZiBfSWZ0cnVlIHR5cGU7IH07CisKKyAgLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgZmFsc2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JZnRydWUsIHR5cGVuYW1lIF9JZmZhbHNlPgorICAgIHN0cnVjdCBjb25kaXRpb25hbDxmYWxzZSwgX0lmdHJ1ZSwgX0lmZmFsc2U+CisgICAgeyB0eXBlZGVmIF9JZmZhbHNlIHR5cGU7IH07CisKKyAgLy8vIGNvbW1vbl90eXBlCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9UcD4KKyAgICBzdHJ1Y3QgY29tbW9uX3R5cGU7CisKKyAgLy8gU2ZpbmFlLWZyaWVuZGx5IGNvbW1vbl90eXBlIGltcGxlbWVudGF0aW9uOgorCisgIHN0cnVjdCBfX2RvX2NvbW1vbl90eXBlX2ltcGwKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgICAgc3RhdGljIF9fc3VjY2Vzc190eXBlPHR5cGVuYW1lIGRlY2F5PGRlY2x0eXBlCisJCQkgICAgKHRydWUgPyBzdGQ6OmRlY2x2YWw8X1RwPigpCisJCQkgICAgIDogc3RkOjpkZWNsdmFsPF9VcD4oKSk+Ojp0eXBlPiBfU190ZXN0KGludCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+CisgICAgICBzdGF0aWMgX19mYWlsdXJlX3R5cGUgX1NfdGVzdCguLi4pOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIHN0cnVjdCBfX2NvbW1vbl90eXBlX2ltcGwKKyAgICA6IHByaXZhdGUgX19kb19jb21tb25fdHlwZV9pbXBsCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBkZWNheTxkZWNsdHlwZShfU190ZXN0PF9UcCwgX1VwPigwKSk+Ojp0eXBlIHR5cGU7CisgICAgfTsKKworICBzdHJ1Y3QgX19kb19tZW1iZXJfdHlwZV93cmFwcGVyCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBzdGF0aWMgX19zdWNjZXNzX3R5cGU8dHlwZW5hbWUgX1RwOjp0eXBlPiBfU190ZXN0KGludCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICAgIHN0YXRpYyBfX2ZhaWx1cmVfdHlwZSBfU190ZXN0KC4uLik7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX21lbWJlcl90eXBlX3dyYXBwZXIKKyAgICA6IHByaXZhdGUgX19kb19tZW1iZXJfdHlwZV93cmFwcGVyCisgICAgeworICAgICAgdHlwZWRlZiBkZWNsdHlwZShfU190ZXN0PF9UcD4oMCkpIHR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgX19leHBhbmRlZF9jb21tb25fdHlwZV93cmFwcGVyCisgICAgeworICAgICAgdHlwZWRlZiBjb21tb25fdHlwZTx0eXBlbmFtZSBfQ1RwOjp0eXBlLCBfQXJncy4uLj4gdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHN0cnVjdCBfX2V4cGFuZGVkX2NvbW1vbl90eXBlX3dyYXBwZXI8X19mYWlsdXJlX3R5cGUsIF9BcmdzLi4uPgorICAgIHsgdHlwZWRlZiBfX2ZhaWx1cmVfdHlwZSB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgY29tbW9uX3R5cGU8X1RwPgorICAgIHsgdHlwZWRlZiB0eXBlbmFtZSBkZWNheTxfVHA+Ojp0eXBlIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgc3RydWN0IGNvbW1vbl90eXBlPF9UcCwgX1VwPgorICAgIDogcHVibGljIF9fY29tbW9uX3R5cGVfaW1wbDxfVHAsIF9VcD46OnR5cGUKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXAsIHR5cGVuYW1lLi4uIF9WcD4KKyAgICBzdHJ1Y3QgY29tbW9uX3R5cGU8X1RwLCBfVXAsIF9WcC4uLj4KKyAgICA6IHB1YmxpYyBfX2V4cGFuZGVkX2NvbW1vbl90eXBlX3dyYXBwZXI8dHlwZW5hbWUgX19tZW1iZXJfdHlwZV93cmFwcGVyPAorICAgICAgICAgICAgICAgY29tbW9uX3R5cGU8X1RwLCBfVXA+Pjo6dHlwZSwgX1ZwLi4uPjo6dHlwZQorICAgIHsgfTsKKworICAvLy8gVGhlIHVuZGVybHlpbmcgdHlwZSBvZiBhbiBlbnVtLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHVuZGVybHlpbmdfdHlwZQorICAgIHsKKyAgICAgIHR5cGVkZWYgX191bmRlcmx5aW5nX3R5cGUoX1RwKSB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2RlY2x2YWxfcHJvdGVjdG9yCisgICAgeworICAgICAgc3RhdGljIGNvbnN0IGJvb2wgX19zdG9wID0gZmFsc2U7CisgICAgICBzdGF0aWMgdHlwZW5hbWUgYWRkX3J2YWx1ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZSBfX2RlbGVnYXRlKCk7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIGFkZF9ydmFsdWVfcmVmZXJlbmNlPF9UcD46OnR5cGUKKyAgICBkZWNsdmFsKCkgbm9leGNlcHQKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fZGVjbHZhbF9wcm90ZWN0b3I8X1RwPjo6X19zdG9wLAorCQkgICAgImRlY2x2YWwoKSBtdXN0IG5vdCBiZSB1c2VkISIpOworICAgICAgcmV0dXJuIF9fZGVjbHZhbF9wcm90ZWN0b3I8X1RwPjo6X19kZWxlZ2F0ZSgpOworICAgIH0KKworICAvLy8gcmVzdWx0X29mCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgY2xhc3MgcmVzdWx0X29mOworCisgIC8vIFNmaW5hZS1mcmllbmRseSByZXN1bHRfb2YgaW1wbGVtZW50YXRpb246CisKKyAgLy8gW2Z1bmMucmVxdWlyZV0gcGFyYWdyYXBoIDEgYnVsbGV0IDE6CisgIHN0cnVjdCBfX3Jlc3VsdF9vZl9tZW1mdW5fcmVmX2ltcGwKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GcCwgdHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICBzdGF0aWMgX19zdWNjZXNzX3R5cGU8ZGVjbHR5cGUoCisgICAgICAoc3RkOjpkZWNsdmFsPF9UcDE+KCkuKnN0ZDo6ZGVjbHZhbDxfRnA+KCkpKHN0ZDo6ZGVjbHZhbDxfQXJncz4oKS4uLikKKyAgICAgICk+IF9TX3Rlc3QoaW50KTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uPgorICAgICAgc3RhdGljIF9fZmFpbHVyZV90eXBlIF9TX3Rlc3QoLi4uKTsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTWVtUHRyLCB0eXBlbmFtZSBfQXJnLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgX19yZXN1bHRfb2ZfbWVtZnVuX3JlZgorICAgIDogcHJpdmF0ZSBfX3Jlc3VsdF9vZl9tZW1mdW5fcmVmX2ltcGwKKyAgICB7CisgICAgICB0eXBlZGVmIGRlY2x0eXBlKF9TX3Rlc3Q8X01lbVB0ciwgX0FyZywgX0FyZ3MuLi4+KDApKSB0eXBlOworICAgIH07CisKKyAgLy8gW2Z1bmMucmVxdWlyZV0gcGFyYWdyYXBoIDEgYnVsbGV0IDI6CisgIHN0cnVjdCBfX3Jlc3VsdF9vZl9tZW1mdW5fZGVyZWZfaW1wbAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZwLCB0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHN0YXRpYyBfX3N1Y2Nlc3NfdHlwZTxkZWNsdHlwZSgKKyAgICAgICgoKnN0ZDo6ZGVjbHZhbDxfVHAxPigpKS4qc3RkOjpkZWNsdmFsPF9GcD4oKSkoc3RkOjpkZWNsdmFsPF9BcmdzPigpLi4uKQorICAgICAgKT4gX1NfdGVzdChpbnQpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4+CisgICAgICBzdGF0aWMgX19mYWlsdXJlX3R5cGUgX1NfdGVzdCguLi4pOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9NZW1QdHIsIHR5cGVuYW1lIF9BcmcsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHN0cnVjdCBfX3Jlc3VsdF9vZl9tZW1mdW5fZGVyZWYKKyAgICA6IHByaXZhdGUgX19yZXN1bHRfb2ZfbWVtZnVuX2RlcmVmX2ltcGwKKyAgICB7CisgICAgICB0eXBlZGVmIGRlY2x0eXBlKF9TX3Rlc3Q8X01lbVB0ciwgX0FyZywgX0FyZ3MuLi4+KDApKSB0eXBlOworICAgIH07CisKKyAgLy8gW2Z1bmMucmVxdWlyZV0gcGFyYWdyYXBoIDEgYnVsbGV0IDM6CisgIHN0cnVjdCBfX3Jlc3VsdF9vZl9tZW1vYmpfcmVmX2ltcGwKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GcCwgdHlwZW5hbWUgX1RwMT4KKyAgICAgIHN0YXRpYyBfX3N1Y2Nlc3NfdHlwZTxkZWNsdHlwZSgKKyAgICAgIHN0ZDo6ZGVjbHZhbDxfVHAxPigpLipzdGQ6OmRlY2x2YWw8X0ZwPigpCisgICAgICApPiBfU190ZXN0KGludCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+CisgICAgICBzdGF0aWMgX19mYWlsdXJlX3R5cGUgX1NfdGVzdCguLi4pOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9NZW1QdHIsIHR5cGVuYW1lIF9Bcmc+CisgICAgc3RydWN0IF9fcmVzdWx0X29mX21lbW9ial9yZWYKKyAgICA6IHByaXZhdGUgX19yZXN1bHRfb2ZfbWVtb2JqX3JlZl9pbXBsCisgICAgeworICAgICAgdHlwZWRlZiBkZWNsdHlwZShfU190ZXN0PF9NZW1QdHIsIF9Bcmc+KDApKSB0eXBlOworICAgIH07CisKKyAgLy8gW2Z1bmMucmVxdWlyZV0gcGFyYWdyYXBoIDEgYnVsbGV0IDQ6CisgIHN0cnVjdCBfX3Jlc3VsdF9vZl9tZW1vYmpfZGVyZWZfaW1wbAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZwLCB0eXBlbmFtZSBfVHAxPgorICAgICAgc3RhdGljIF9fc3VjY2Vzc190eXBlPGRlY2x0eXBlKAorICAgICAgKCpzdGQ6OmRlY2x2YWw8X1RwMT4oKSkuKnN0ZDo6ZGVjbHZhbDxfRnA+KCkKKyAgICAgICk+IF9TX3Rlc3QoaW50KTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4KKyAgICAgIHN0YXRpYyBfX2ZhaWx1cmVfdHlwZSBfU190ZXN0KC4uLik7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01lbVB0ciwgdHlwZW5hbWUgX0FyZz4KKyAgICBzdHJ1Y3QgX19yZXN1bHRfb2ZfbWVtb2JqX2RlcmVmCisgICAgOiBwcml2YXRlIF9fcmVzdWx0X29mX21lbW9ial9kZXJlZl9pbXBsCisgICAgeworICAgICAgdHlwZWRlZiBkZWNsdHlwZShfU190ZXN0PF9NZW1QdHIsIF9Bcmc+KDApKSB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01lbVB0ciwgdHlwZW5hbWUgX0FyZz4KKyAgICBzdHJ1Y3QgX19yZXN1bHRfb2ZfbWVtb2JqOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUgX0FyZz4KKyAgICBzdHJ1Y3QgX19yZXN1bHRfb2ZfbWVtb2JqPF9SZXMgX0NsYXNzOjoqLCBfQXJnPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2N2PHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8CisgICAgICAgIF9Bcmc+Ojp0eXBlPjo6dHlwZSBfQXJndmFsOworICAgICAgdHlwZWRlZiBfUmVzIF9DbGFzczo6KiBfTWVtUHRyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxfX29yXzxpc19zYW1lPF9Bcmd2YWwsIF9DbGFzcz4sCisgICAgICAgIGlzX2Jhc2Vfb2Y8X0NsYXNzLCBfQXJndmFsPj46OnZhbHVlLAorICAgICAgICBfX3Jlc3VsdF9vZl9tZW1vYmpfcmVmPF9NZW1QdHIsIF9Bcmc+LAorICAgICAgICBfX3Jlc3VsdF9vZl9tZW1vYmpfZGVyZWY8X01lbVB0ciwgX0FyZz4KKyAgICAgID46OnR5cGU6OnR5cGUgdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9NZW1QdHIsIHR5cGVuYW1lIF9BcmcsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHN0cnVjdCBfX3Jlc3VsdF9vZl9tZW1mdW47CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZSBfQXJnLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgX19yZXN1bHRfb2ZfbWVtZnVuPF9SZXMgX0NsYXNzOjoqLCBfQXJnLCBfQXJncy4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9jdjx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPAorICAgICAgICBfQXJnPjo6dHlwZT46OnR5cGUgX0FyZ3ZhbDsKKyAgICAgIHR5cGVkZWYgX1JlcyBfQ2xhc3M6OiogX01lbVB0cjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8X19vcl88aXNfc2FtZTxfQXJndmFsLCBfQ2xhc3M+LAorICAgICAgICBpc19iYXNlX29mPF9DbGFzcywgX0FyZ3ZhbD4+Ojp2YWx1ZSwKKyAgICAgICAgX19yZXN1bHRfb2ZfbWVtZnVuX3JlZjxfTWVtUHRyLCBfQXJnLCBfQXJncy4uLj4sCisgICAgICAgIF9fcmVzdWx0X29mX21lbWZ1bl9kZXJlZjxfTWVtUHRyLCBfQXJnLCBfQXJncy4uLj4KKyAgICAgID46OnR5cGU6OnR5cGUgdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPGJvb2wsIGJvb2wsIHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9fcmVzdWx0X29mX2ltcGwKKyAgICB7CisgICAgICB0eXBlZGVmIF9fZmFpbHVyZV90eXBlIHR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTWVtUHRyLCB0eXBlbmFtZSBfQXJnPgorICAgIHN0cnVjdCBfX3Jlc3VsdF9vZl9pbXBsPHRydWUsIGZhbHNlLCBfTWVtUHRyLCBfQXJnPgorICAgIDogcHVibGljIF9fcmVzdWx0X29mX21lbW9iajx0eXBlbmFtZSBkZWNheTxfTWVtUHRyPjo6dHlwZSwgX0FyZz4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01lbVB0ciwgdHlwZW5hbWUgX0FyZywgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgc3RydWN0IF9fcmVzdWx0X29mX2ltcGw8ZmFsc2UsIHRydWUsIF9NZW1QdHIsIF9BcmcsIF9BcmdzLi4uPgorICAgIDogcHVibGljIF9fcmVzdWx0X29mX21lbWZ1bjx0eXBlbmFtZSBkZWNheTxfTWVtUHRyPjo6dHlwZSwgX0FyZywgX0FyZ3MuLi4+CisgICAgeyB9OworCisgIC8vIFtmdW5jLnJlcXVpcmVdIHBhcmFncmFwaCAxIGJ1bGxldCA1OgorICBzdHJ1Y3QgX19yZXN1bHRfb2Zfb3RoZXJfaW1wbAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZuLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHN0YXRpYyBfX3N1Y2Nlc3NfdHlwZTxkZWNsdHlwZSgKKyAgICAgIHN0ZDo6ZGVjbHZhbDxfRm4+KCkoc3RkOjpkZWNsdmFsPF9BcmdzPigpLi4uKQorICAgICAgKT4gX1NfdGVzdChpbnQpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4+CisgICAgICBzdGF0aWMgX19mYWlsdXJlX3R5cGUgX1NfdGVzdCguLi4pOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9fcmVzdWx0X29mX2ltcGw8ZmFsc2UsIGZhbHNlLCBfRnVuY3RvciwgX0FyZ1R5cGVzLi4uPgorICAgIDogcHJpdmF0ZSBfX3Jlc3VsdF9vZl9vdGhlcl9pbXBsCisgICAgeworICAgICAgdHlwZWRlZiBkZWNsdHlwZShfU190ZXN0PF9GdW5jdG9yLCBfQXJnVHlwZXMuLi4+KDApKSB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgcmVzdWx0X29mPF9GdW5jdG9yKF9BcmdUeXBlcy4uLik+CisgICAgOiBwdWJsaWMgX19yZXN1bHRfb2ZfaW1wbDwKKyAgICAgICAgaXNfbWVtYmVyX29iamVjdF9wb2ludGVyPAorICAgICAgICAgIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X0Z1bmN0b3I+Ojp0eXBlCisgICAgICAgID46OnZhbHVlLAorICAgICAgICBpc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcjwKKyAgICAgICAgICB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9GdW5jdG9yPjo6dHlwZQorICAgICAgICA+Ojp2YWx1ZSwKKwkgICAgX0Z1bmN0b3IsIF9BcmdUeXBlcy4uLgorICAgICAgPjo6dHlwZQorICAgIHsgfTsKKworICAvLy8gQH0gZ3JvdXAgbWV0YXByb2dyYW1taW5nCisJCisgIC8qKgorICAgKiAgVXNlIFNGSU5BRSB0byBkZXRlcm1pbmUgaWYgdGhlIHR5cGUgX1RwIGhhcyBhIHB1YmxpY2x5LWFjY2Vzc2libGUKKyAgICogIG1lbWJlciB0eXBlIF9OVFlQRS4KKyAgICovCisjZGVmaW5lIF9HTElCQ1hYX0hBU19ORVNURURfVFlQRShfTlRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXNzIF9faGFzXyMjX05UWVBFIyNfaGVscGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOiBfX3NmaW5hZV90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cnVjdCBfV3JhcF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0aWMgX19vbmUgX190ZXN0KF9XcmFwX3R5cGU8dHlwZW5hbWUgX1VwOjpfTlRZUEU+Kik7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0aWMgX190d28gX190ZXN0KC4uLik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIHZhbHVlID0gc2l6ZW9mKF9fdGVzdDxfVHA+KDApKSA9PSAxOyBcCisgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RydWN0IF9faGFzXyMjX05UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faGFzXyMjX05UWVBFIyNfaGVscGVyICAgICAgICAgICAgXAorCQkJPHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPjo6dmFsdWU+ICBcCisgICAgeyB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgIC8vIEMrKzExCisKKyNlbmRpZiAgLy8gX0dMSUJDWFhfVFlQRV9UUkFJVFMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHlwZWluZGV4IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90eXBlaW5kZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU2ZGIzMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHlwZWluZGV4CkBAIC0wLDAgKzEsMTEyIEBACisvLyBDKysxMSA8dHlwZWluZGV4PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS90eXBlaW5kZXgKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFlQRUlOREVYCisjZGVmaW5lIF9HTElCQ1hYX1RZUEVJTkRFWCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDx0eXBlaW5mbz4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYnJpZWYgQ2xhc3MgdHlwZV9pbmRleAorICAgKiBAaW5ncm91cCB1dGlsaXRpZXMKKyAgICoKKyAgICogIFRoZSBjbGFzcyB0eXBlX2luZGV4IHByb3ZpZGVzIGEgc2ltcGxlIHdyYXBwZXIgZm9yIHR5cGVfaW5mbworICAgKiAgd2hpY2ggY2FuIGJlIHVzZWQgYXMgYW4gaW5kZXggdHlwZSBpbiBhc3NvY2lhdGl2ZSBjb250YWluZXJzCisgICAqICAoMjMuNikgYW5kIGluIHVub3JkZXJlZCBhc3NvY2lhdGl2ZSBjb250YWluZXJzICgyMy43KS4KKyAgICovCisgIHN0cnVjdCB0eXBlX2luZGV4CisgIHsKKyAgICB0eXBlX2luZGV4KGNvbnN0IHR5cGVfaW5mbyYgX19yaHMpIG5vZXhjZXB0CisgICAgOiBfTV90YXJnZXQoJl9fcmhzKSB7IH0KKworICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHR5cGVfaW5kZXgmIF9fcmhzKSBjb25zdCBub2V4Y2VwdAorICAgIHsgcmV0dXJuICpfTV90YXJnZXQgPT0gKl9fcmhzLl9NX3RhcmdldDsgfQorCisgICAgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgdHlwZV9pbmRleCYgX19yaHMpIGNvbnN0IG5vZXhjZXB0CisgICAgeyByZXR1cm4gKl9NX3RhcmdldCAhPSAqX19yaHMuX01fdGFyZ2V0OyB9CisKKyAgICBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHR5cGVfaW5kZXgmIF9fcmhzKSBjb25zdCBub2V4Y2VwdAorICAgIHsgcmV0dXJuIF9NX3RhcmdldC0+YmVmb3JlKCpfX3Jocy5fTV90YXJnZXQpOyB9CisKKyAgICBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCB0eXBlX2luZGV4JiBfX3JocykgY29uc3Qgbm9leGNlcHQKKyAgICB7IHJldHVybiAhX19yaHMuX01fdGFyZ2V0LT5iZWZvcmUoKl9NX3RhcmdldCk7IH0KKworICAgIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgdHlwZV9pbmRleCYgX19yaHMpIGNvbnN0IG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19yaHMuX01fdGFyZ2V0LT5iZWZvcmUoKl9NX3RhcmdldCk7IH0KKworICAgIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHR5cGVfaW5kZXgmIF9fcmhzKSBjb25zdCBub2V4Y2VwdAorICAgIHsgcmV0dXJuICFfTV90YXJnZXQtPmJlZm9yZSgqX19yaHMuX01fdGFyZ2V0KTsgfQorCisgICAgc2l6ZV90CisgICAgaGFzaF9jb2RlKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7IHJldHVybiBfTV90YXJnZXQtPmhhc2hfY29kZSgpOyB9CisKKyAgICBjb25zdCBjaGFyKgorICAgIG5hbWUoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3RhcmdldC0+bmFtZSgpOyB9CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCB0eXBlX2luZm8qIF9NX3RhcmdldDsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHN0cnVjdCBoYXNoOworCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIHR5cGVfaW5kZXguCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDx0eXBlX2luZGV4PgorICAgIHsKKyAgICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICByZXN1bHRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZV9pbmRleCAgYXJndW1lbnRfdHlwZTsKKworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IHR5cGVfaW5kZXgmIF9fdGkpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX3RpLmhhc2hfY29kZSgpOyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmICAvLyBDKysxMQorCisjZW5kaWYgIC8vIF9HTElCQ1hYX1RZUEVJTkRFWApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC90eXBlaW5mbyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHlwZWluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEzZDBlZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdHlwZWluZm8KQEAgLTAsMCArMSwyMjIgQEAKKy8vIFJUVEkgc3VwcG9ydCBmb3IgLSotIEMrKyAtKi0KKy8vIENvcHlyaWdodCAoQykgMTk5NC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKy8vCisvLyBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKy8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHR5cGVpbmZvCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9UWVBFSU5GTworI2RlZmluZSBfVFlQRUlORk8KKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNpbmNsdWRlIDxiaXRzL2hhc2hfYnl0ZXMuaD4KKyNlbmRpZgorCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHB1c2goZGVmYXVsdCkKKworZXh0ZXJuICJDKysiIHsKKworbmFtZXNwYWNlIF9fY3h4YWJpdjEKK3sKKyAgY2xhc3MgX19jbGFzc190eXBlX2luZm87Cit9IC8vIG5hbWVzcGFjZSBfX2N4eGFiaXYxCisKKy8vIERldGVybWluZSB3aGV0aGVyIHR5cGVpbmZvIG5hbWVzIGZvciB0aGUgc2FtZSB0eXBlIGFyZSBtZXJnZWQgKGluIHdoaWNoCisvLyBjYXNlIGNvbXBhcmlzb24gY2FuIGp1c3QgY29tcGFyZSBwb2ludGVycykgb3Igbm90IChpbiB3aGljaCBjYXNlIHN0cmluZ3MKKy8vIG11c3QgYmUgY29tcGFyZWQpLCBhbmQgd2hldGhlciBjb21wYXJpc29uIGlzIHRvIGJlIGltcGxlbWVudGVkIGlubGluZSBvcgorLy8gbm90LiAgV2UgdXNlZCB0byBkbyBpbmxpbmUgcG9pbnRlciBjb21wYXJpc29uIGJ5IGRlZmF1bHQgaWYgd2VhayBzeW1ib2xzCisvLyBhcmUgYXZhaWxhYmxlLCBidXQgZXZlbiB3aXRoIHdlYWsgc3ltYm9scyBzb21ldGltZXMgbmFtZXMgYXJlIG5vdCBtZXJnZWQKKy8vIHdoZW4gb2JqZWN0cyBhcmUgbG9hZGVkIHdpdGggUlRMRF9MT0NBTCwgc28gbm93IHdlIGFsd2F5cyB1c2Ugc3RyY21wIGJ5CisvLyBkZWZhdWx0LiAgRm9yIEFCSSBjb21wYXRpYmlsaXR5LCB3ZSBkbyB0aGUgc3RyY21wIGlubGluZSBpZiB3ZWFrIHN5bWJvbHMKKy8vIGFyZSBhdmFpbGFibGUsIGFuZCBvdXQtb2YtbGluZSBpZiBub3QuICBPdXQtb2YtbGluZSBwb2ludGVyIGNvbXBhcmlzb24KKy8vIGlzIHVzZWQgd2hlcmUgdGhlIG9iamVjdCBmaWxlcyBhcmUgdG8gYmUgcG9ydGFibGUgdG8gbXVsdGlwbGUgc3lzdGVtcywKKy8vIHNvbWUgb2Ygd2hpY2ggbWF5IG5vdCBiZSBhYmxlIHRvIHVzZSBwb2ludGVyIGNvbXBhcmlzb24sIGJ1dCB0aGUKKy8vIHBhcnRpY3VsYXIgc3lzdGVtIGZvciB3aGljaCBsaWJzdGRjKysgaXMgYmVpbmcgYnVpbHQgY2FuIHVzZSBwb2ludGVyCisvLyBjb21wYXJpc29uOyBpbiBwYXJ0aWN1bGFyIGZvciBtb3N0IEFSTSBFQUJJIHN5c3RlbXMsIHdoZXJlIHRoZSBBQkkKKy8vIHNwZWNpZmllcyBvdXQtb2YtbGluZSBjb21wYXJpc29uLiAgVGhlIGNvbXBpbGVyJ3MgdGFyZ2V0IGNvbmZpZ3VyYXRpb24KKy8vIGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdHMgYnkgZGVmaW5pbmcgX19HWFhfVFlQRUlORk9fRVFVQUxJVFlfSU5MSU5FIHRvCisvLyAxIG9yIDAgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgY29tcGFyaXNvbiBpcyBpbmxpbmUsIGFuZAorLy8gX19HWFhfTUVSR0VEX1RZUEVJTkZPX05BTUVTIHRvIDEgb3IgMCB0byBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCBwb2ludGVyCisvLyBjb21wYXJpc29uIGNhbiBiZSB1c2VkLgorCisjaWZuZGVmIF9fR1hYX01FUkdFRF9UWVBFSU5GT19OQU1FUworLy8gQnkgZGVmYXVsdCwgdHlwZWluZm8gbmFtZXMgYXJlIG5vdCBtZXJnZWQuCisjZGVmaW5lIF9fR1hYX01FUkdFRF9UWVBFSU5GT19OQU1FUyAwCisjZW5kaWYKKworLy8gQnkgZGVmYXVsdCBmb2xsb3cgdGhlIG9sZCBpbmxpbmUgcnVsZXMgdG8gYXZvaWQgQUJJIGNoYW5nZXMuCisjaWZuZGVmIF9fR1hYX1RZUEVJTkZPX0VRVUFMSVRZX0lOTElORQorICAjaWYgIV9fR1hYX1dFQUtfXworICAgICNkZWZpbmUgX19HWFhfVFlQRUlORk9fRVFVQUxJVFlfSU5MSU5FIDAKKyAgI2Vsc2UKKyAgICAjZGVmaW5lIF9fR1hYX1RZUEVJTkZPX0VRVUFMSVRZX0lOTElORSAxCisgICNlbmRpZgorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQKK3sKKyAgLyoqCisgICAqICBAYnJpZWYgIFBhcnQgb2YgUlRUSS4KKyAgICoKKyAgICogIFRoZSBAYyB0eXBlX2luZm8gY2xhc3MgZGVzY3JpYmVzIHR5cGUgaW5mb3JtYXRpb24gZ2VuZXJhdGVkIGJ5CisgICAqICBhbiBpbXBsZW1lbnRhdGlvbi4KKyAgKi8KKyAgY2xhc3MgdHlwZV9pbmZvCisgIHsKKyAgcHVibGljOgorICAgIC8qKiBEZXN0cnVjdG9yIGZpcnN0LiBCZWluZyB0aGUgZmlyc3Qgbm9uLWlubGluZSB2aXJ0dWFsIGZ1bmN0aW9uLCB0aGlzCisgICAgICogIGNvbnRyb2xzIGluIHdoaWNoIHRyYW5zbGF0aW9uIHVuaXQgdGhlIHZ0YWJsZSBpcyBlbWl0dGVkLiBUaGUKKyAgICAgKiAgY29tcGlsZXIgbWFrZXMgdXNlIG9mIHRoYXQgaW5mb3JtYXRpb24gdG8ga25vdyB3aGVyZSB0byBlbWl0CisgICAgICogIHRoZSBydW50aW1lLW1hbmRhdGVkIHR5cGVfaW5mbyBzdHJ1Y3R1cmVzIGluIHRoZSBuZXctYWJpLiAgKi8KKyAgICB2aXJ0dWFsIH50eXBlX2luZm8oKTsKKworICAgIC8qKiBSZXR1cm5zIGFuIEBlIGltcGxlbWVudGF0aW9uLWRlZmluZWQgYnl0ZSBzdHJpbmc7IHRoaXMgaXMgbm90CisgICAgICogIHBvcnRhYmxlIGJldHdlZW4gY29tcGlsZXJzISAgKi8KKyAgICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiBfX25hbWVbMF0gPT0gJyonID8gX19uYW1lICsgMSA6IF9fbmFtZTsgfQorCisjaWYgIV9fR1hYX1RZUEVJTkZPX0VRVUFMSVRZX0lOTElORQorICAgIC8vIEluIG9sZCBhYmksIG9yIHdoZW4gd2VhayBzeW1ib2xzIGFyZSBub3Qgc3VwcG9ydGVkLCB0aGVyZSBjYW4KKyAgICAvLyBiZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgYSB0eXBlX2luZm8gb2JqZWN0IGZvciBvbmUKKyAgICAvLyB0eXBlLiBVbmlxdWVuZXNzIG11c3QgdXNlIHRoZSBfbmFtZSB2YWx1ZSwgbm90IG9iamVjdCBhZGRyZXNzLgorICAgIGJvb2wgYmVmb3JlKGNvbnN0IHR5cGVfaW5mbyYgX19hcmcpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUOworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCB0eXBlX2luZm8mIF9fYXJnKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVDsKKyNlbHNlCisgICNpZiAhX19HWFhfTUVSR0VEX1RZUEVJTkZPX05BTUVTCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBAYyAqdGhpcyBwcmVjZWRlcyBAYyBfX2FyZyBpbiB0aGUgaW1wbGVtZW50YXRpb24ncworICAgICAqICBjb2xsYXRpb24gb3JkZXIuICAqLworICAgIC8vIEV2ZW4gd2l0aCB0aGUgbmV3IGFiaSwgb24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgZGxvcGVuCisgICAgLy8gd2UgY2FuIHJ1biBpbnRvIGNhc2VzIHdoZXJlIHR5cGVfaW5mbyBuYW1lcyBhcmVuJ3QgbWVyZ2VkLAorICAgIC8vIHNvIHdlIHN0aWxsIG5lZWQgdG8gZG8gc3RyaW5nIGNvbXBhcmlzb24uCisgICAgYm9vbCBiZWZvcmUoY29uc3QgdHlwZV9pbmZvJiBfX2FyZykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7IHJldHVybiAoX19uYW1lWzBdID09ICcqJyAmJiBfX2FyZy5fX25hbWVbMF0gPT0gJyonKQorCT8gX19uYW1lIDwgX19hcmcuX19uYW1lCisJOiBfX2J1aWx0aW5fc3RyY21wIChfX25hbWUsIF9fYXJnLl9fbmFtZSkgPCAwOyB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgdHlwZV9pbmZvJiBfX2FyZykgY29uc3QgX0dMSUJDWFhfTk9FWENFUFQKKyAgICB7CisgICAgICByZXR1cm4gKChfX25hbWUgPT0gX19hcmcuX19uYW1lKQorCSAgICAgIHx8IChfX25hbWVbMF0gIT0gJyonICYmCisJCSAgX19idWlsdGluX3N0cmNtcCAoX19uYW1lLCBfX2FyZy5fX25hbWUpID09IDApKTsKKyAgICB9CisgICNlbHNlCisgICAgLy8gT24gc29tZSB0YXJnZXRzIHdlIGNhbiByZWx5IG9uIHR5cGVfaW5mbydzIE5UQlMgYmVpbmcgdW5pcXVlLAorICAgIC8vIGFuZCB0aGVyZWZvcmUgYWRkcmVzcyBjb21wYXJpc29ucyBhcmUgc3VmZmljaWVudC4KKyAgICBib29sIGJlZm9yZShjb25zdCB0eXBlX2luZm8mIF9fYXJnKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuIF9fbmFtZSA8IF9fYXJnLl9fbmFtZTsgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHR5cGVfaW5mbyYgX19hcmcpIGNvbnN0IF9HTElCQ1hYX05PRVhDRVBUCisgICAgeyByZXR1cm4gX19uYW1lID09IF9fYXJnLl9fbmFtZTsgfQorICAjZW5kaWYKKyNlbmRpZgorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCB0eXBlX2luZm8mIF9fYXJnKSBjb25zdCBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsgcmV0dXJuICFvcGVyYXRvcj09KF9fYXJnKTsgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIHNpemVfdCBoYXNoX2NvZGUoKSBjb25zdCBub2V4Y2VwdAorICAgIHsKKyMgIGlmICFfX0dYWF9NRVJHRURfVFlQRUlORk9fTkFNRVMKKyAgICAgIHJldHVybiBfSGFzaF9ieXRlcyhuYW1lKCksIF9fYnVpbHRpbl9zdHJsZW4obmFtZSgpKSwKKwkJCSBzdGF0aWNfY2FzdDxzaXplX3Q+KDB4YzcwZjY5MDdVTCkpOworIyAgZWxzZQorICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90PihfX25hbWUpOworIyAgZW5kaWYKKyAgICB9CisjZW5kaWYgLy8gQysrMTEKKworICAgIC8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBwb2ludGVyIHR5cGUgb2Ygc29tZSBraW5kCisgICAgdmlydHVhbCBib29sIF9faXNfcG9pbnRlcl9wKCkgY29uc3Q7CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgZnVuY3Rpb24gdHlwZQorICAgIHZpcnR1YWwgYm9vbCBfX2lzX2Z1bmN0aW9uX3AoKSBjb25zdDsKKworICAgIC8vIFRyeSBhbmQgY2F0Y2ggYSB0aHJvd24gdHlwZS4gU3RvcmUgYW4gYWRqdXN0ZWQgcG9pbnRlciB0byB0aGUKKyAgICAvLyBjYXVnaHQgdHlwZSBpbiBUSFJfT0JKLiBJZiBUSFJfVFlQRSBpcyBub3QgYSBwb2ludGVyIHR5cGUsIHRoZW4KKyAgICAvLyBUSFJfT0JKIHBvaW50cyB0byB0aGUgdGhyb3duIG9iamVjdC4gSWYgVEhSX1RZUEUgaXMgYSBwb2ludGVyCisgICAgLy8gdHlwZSwgdGhlbiBUSFJfT0JKIGlzIHRoZSBwb2ludGVyIGl0c2VsZi4gT1VURVIgaW5kaWNhdGVzIHRoZQorICAgIC8vIG51bWJlciBvZiBvdXRlciBwb2ludGVycywgYW5kIHdoZXRoZXIgdGhleSB3ZXJlIGNvbnN0CisgICAgLy8gcXVhbGlmaWVkLgorICAgIHZpcnR1YWwgYm9vbCBfX2RvX2NhdGNoKGNvbnN0IHR5cGVfaW5mbyAqX190aHJfdHlwZSwgdm9pZCAqKl9fdGhyX29iaiwKKwkJCSAgICB1bnNpZ25lZCBfX291dGVyKSBjb25zdDsKKworICAgIC8vIEludGVybmFsbHkgdXNlZCBkdXJpbmcgY2F0Y2ggbWF0Y2hpbmcKKyAgICB2aXJ0dWFsIGJvb2wgX19kb191cGNhc3QoY29uc3QgX19jeHhhYml2MTo6X19jbGFzc190eXBlX2luZm8gKl9fdGFyZ2V0LAorCQkJICAgICB2b2lkICoqX19vYmpfcHRyKSBjb25zdDsKKworICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgY2hhciAqX19uYW1lOworCisgICAgZXhwbGljaXQgdHlwZV9pbmZvKGNvbnN0IGNoYXIgKl9fbik6IF9fbmFtZShfX24pIHsgfQorCisgIHByaXZhdGU6CisgICAgLy8vIEFzc2lnbmluZyB0eXBlX2luZm8gaXMgbm90IHN1cHBvcnRlZC4KKyAgICB0eXBlX2luZm8mIG9wZXJhdG9yPShjb25zdCB0eXBlX2luZm8mKTsKKyAgICB0eXBlX2luZm8oY29uc3QgdHlwZV9pbmZvJik7CisgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRocm93biBkdXJpbmcgaW5jb3JyZWN0IHR5cGVjYXN0aW5nLgorICAgKiAgQGluZ3JvdXAgZXhjZXB0aW9ucworICAgKgorICAgKiAgSWYgeW91IGF0dGVtcHQgYW4gaW52YWxpZCBAYyBkeW5hbWljX2Nhc3QgZXhwcmVzc2lvbiwgYW4gaW5zdGFuY2Ugb2YKKyAgICogIHRoaXMgY2xhc3MgKG9yIHNvbWV0aGluZyBkZXJpdmVkIGZyb20gdGhpcyBjbGFzcykgaXMgdGhyb3duLiAgKi8KKyAgY2xhc3MgYmFkX2Nhc3QgOiBwdWJsaWMgZXhjZXB0aW9uCisgIHsKKyAgcHVibGljOgorICAgIGJhZF9jYXN0KCkgX0dMSUJDWFhfVVNFX05PRVhDRVBUIHsgfQorCisgICAgLy8gVGhpcyBkZWNsYXJhdGlvbiBpcyBub3QgdXNlbGVzczoKKyAgICAvLyBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MtMy4wLjIvZ2NjXzYuaHRtbCNTRUMxMTgKKyAgICB2aXJ0dWFsIH5iYWRfY2FzdCgpIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVDsKKworICAgIC8vIFNlZSBjb21tZW50IGluIGVoX2V4Y2VwdGlvbi5jYy4KKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgVGhyb3duIHdoZW4gYSBOVUxMIHBvaW50ZXIgaW4gYSBAYyB0eXBlaWQgZXhwcmVzc2lvbiBpcyB1c2VkLgorICAgKiAgQGluZ3JvdXAgZXhjZXB0aW9ucworICAgKi8KKyAgY2xhc3MgYmFkX3R5cGVpZCA6IHB1YmxpYyBleGNlcHRpb24KKyAgeworICBwdWJsaWM6CisgICAgYmFkX3R5cGVpZCAoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQgeyB9CisKKyAgICAvLyBUaGlzIGRlY2xhcmF0aW9uIGlzIG5vdCB1c2VsZXNzOgorICAgIC8vIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2djYy0zLjAuMi9nY2NfNi5odG1sI1NFQzExOAorICAgIHZpcnR1YWwgfmJhZF90eXBlaWQoKSBfR0xJQkNYWF9VU0VfTk9FWENFUFQ7CisKKyAgICAvLyBTZWUgY29tbWVudCBpbiBlaF9leGNlcHRpb24uY2MuCisgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgX0dMSUJDWFhfVVNFX05PRVhDRVBUOworICB9OworfSAvLyBuYW1lc3BhY2Ugc3RkCisKK30gLy8gZXh0ZXJuICJDKysiCisKKyNwcmFnbWEgR0NDIHZpc2liaWxpdHkgcG9wCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC91bm9yZGVyZWRfbWFwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC91bm9yZGVyZWRfbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMTAxNzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3Vub3JkZXJlZF9tYXAKQEAgLTAsMCArMSw2MSBAQAorLy8gPHVub3JkZXJlZF9tYXA+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL3Vub3JkZXJlZF9tYXAKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVU5PUkRFUkVEX01BUAorI2RlZmluZSBfR0xJQkNYWF9VTk9SREVSRURfTUFQIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPgorI2luY2x1ZGUgPGJpdHMvYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8Yml0cy9hbGxvY190cmFpdHMuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9mdW5jdGlvbi5oPiAvLyBlcXVhbF90bywgX0lkZW50aXR5LCBfU2VsZWN0MXN0CisjaW5jbHVkZSA8Yml0cy9mdW5jdGlvbmFsX2hhc2guaD4KKyNpbmNsdWRlIDxiaXRzL2hhc2h0YWJsZS5oPgorI2luY2x1ZGUgPGJpdHMvdW5vcmRlcmVkX21hcC5oPgorI2luY2x1ZGUgPGJpdHMvcmFuZ2VfYWNjZXNzLmg+CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworIyBpbmNsdWRlIDxkZWJ1Zy91bm9yZGVyZWRfbWFwPgorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9QUk9GSUxFCisjIGluY2x1ZGUgPHByb2ZpbGUvdW5vcmRlcmVkX21hcD4KKyNlbmRpZgorCisjZW5kaWYgLy8gQysrMTEKKworI2VuZGlmIC8vIF9HTElCQ1hYX1VOT1JERVJFRF9NQVAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdW5vcmRlcmVkX3NldCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdW5vcmRlcmVkX3NldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmU5MWFkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC91bm9yZGVyZWRfc2V0CkBAIC0wLDAgKzEsNjAgQEAKKy8vIDx1bm9yZGVyZWRfc2V0PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS91bm9yZGVyZWRfc2V0CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1VOT1JERVJFRF9TRVQKKyNkZWZpbmUgX0dMSUJDWFhfVU5PUkRFUkVEX1NFVCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4KKyNpbmNsdWRlIDxiaXRzL2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGJpdHMvYWxsb2NfdHJhaXRzLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfZnVuY3Rpb24uaD4gLy8gZXF1YWxfdG8sIF9JZGVudGl0eSwgX1NlbGVjdDFzdAorI2luY2x1ZGUgPGJpdHMvZnVuY3Rpb25hbF9oYXNoLmg+CisjaW5jbHVkZSA8Yml0cy9oYXNodGFibGUuaD4KKyNpbmNsdWRlIDxiaXRzL3Vub3JkZXJlZF9zZXQuaD4KKyNpbmNsdWRlIDxiaXRzL3JhbmdlX2FjY2Vzcy5oPgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyMgaW5jbHVkZSA8ZGVidWcvdW5vcmRlcmVkX3NldD4KKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfUFJPRklMRQorIyBpbmNsdWRlIDxwcm9maWxlL3Vub3JkZXJlZF9zZXQ+CisjZW5kaWYKKyNlbmRpZiAvLyBDKysxMQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVU5PUkRFUkVEX1NFVApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC91dGlsaXR5IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC91dGlsaXR5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNDJlYTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3V0aWxpdHkKQEAgLTAsMCArMSwxNjAgQEAKKy8vIDx1dGlsaXR5PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgaW5jbHVkZS91dGlsaXR5CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9VVElMSVRZCisjZGVmaW5lIF9HTElCQ1hYX1VUSUxJVFkgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKy8qKgorICogQGRlZmdyb3VwIHV0aWxpdGllcyBVdGlsaXRpZXMKKyAqCisgKiBDb21wb25lbnRzIGRlZW1lZCBnZW5lcmFsbHkgdXNlZnVsLiBJbmNsdWRlcyBwYWlyLCB0dXBsZSwKKyAqIGZvcndhcmQvbW92ZSBoZWxwZXJzLCByYXRpbywgZnVuY3Rpb24gb2JqZWN0LCBtZXRhcHJvZ3JhbW1pbmcgYW5kCisgKiB0eXBlIHRyYWl0cywgdGltZSwgZGF0ZSwgYW5kIG1lbW9yeSBmdW5jdGlvbnMuCisgKi8KKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfcmVsb3BzLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfcGFpci5oPgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPGJpdHMvbW92ZS5oPgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgY2xhc3MgdHVwbGVfc2l6ZTsKKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSW50LCBjbGFzcyBfVHA+CisgICAgY2xhc3MgdHVwbGVfZWxlbWVudDsKKworICAgLy8gVmFyaW91cyBmdW5jdGlvbnMgd2hpY2ggZ2l2ZSBzdGQ6OnBhaXIgYSB0dXBsZS1saWtlIGludGVyZmFjZS4KKyAgdGVtcGxhdGU8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KKyAgICBzdHJ1Y3QgdHVwbGVfc2l6ZTxzdGQ6OnBhaXI8X1RwMSwgX1RwMj4+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIDI+IHsgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorICAgIHN0cnVjdCB0dXBsZV9lbGVtZW50PDAsIHN0ZDo6cGFpcjxfVHAxLCBfVHAyPj4KKyAgICB7IHR5cGVkZWYgX1RwMSB0eXBlOyB9OworIAorICB0ZW1wbGF0ZTxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorICAgIHN0cnVjdCB0dXBsZV9lbGVtZW50PDEsIHN0ZDo6cGFpcjxfVHAxLCBfVHAyPj4KKyAgICB7IHR5cGVkZWYgX1RwMiB0eXBlOyB9OworCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JbnQ+CisgICAgc3RydWN0IF9fcGFpcl9nZXQ7CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3BhaXJfZ2V0PDA+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBfVHAxJgorICAgICAgICBfX2dldChzdGQ6OnBhaXI8X1RwMSwgX1RwMj4mIF9fcGFpcikgbm9leGNlcHQKKyAgICAgICAgeyByZXR1cm4gX19wYWlyLmZpcnN0OyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgX1RwMSYmCisgICAgICAgIF9fbW92ZV9nZXQoc3RkOjpwYWlyPF9UcDEsIF9UcDI+JiYgX19wYWlyKSBub2V4Y2VwdAorICAgICAgICB7IHJldHVybiBzdGQ6OmZvcndhcmQ8X1RwMT4oX19wYWlyLmZpcnN0KTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPgorICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IF9UcDEmCisgICAgICAgIF9fY29uc3RfZ2V0KGNvbnN0IHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiYgX19wYWlyKSBub2V4Y2VwdAorICAgICAgICB7IHJldHVybiBfX3BhaXIuZmlyc3Q7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19wYWlyX2dldDwxPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgX1RwMiYKKyAgICAgICAgX19nZXQoc3RkOjpwYWlyPF9UcDEsIF9UcDI+JiBfX3BhaXIpIG5vZXhjZXB0CisgICAgICAgIHsgcmV0dXJuIF9fcGFpci5zZWNvbmQ7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBfVHAyJiYKKyAgICAgICAgX19tb3ZlX2dldChzdGQ6OnBhaXI8X1RwMSwgX1RwMj4mJiBfX3BhaXIpIG5vZXhjZXB0CisgICAgICAgIHsgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxfVHAyPihfX3BhaXIuc2Vjb25kKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPgorICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IF9UcDImCisgICAgICAgIF9fY29uc3RfZ2V0KGNvbnN0IHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiYgX19wYWlyKSBub2V4Y2VwdAorICAgICAgICB7IHJldHVybiBfX3BhaXIuc2Vjb25kOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSW50LCBjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorICAgIGNvbnN0ZXhwciB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9JbnQsIHN0ZDo6cGFpcjxfVHAxLCBfVHAyPj46OnR5cGUmCisgICAgZ2V0KHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiYgX19pbikgbm9leGNlcHQKKyAgICB7IHJldHVybiBfX3BhaXJfZ2V0PF9JbnQ+OjpfX2dldChfX2luKTsgfQorCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JbnQsIGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CisgICAgY29uc3RleHByIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0ludCwgc3RkOjpwYWlyPF9UcDEsIF9UcDI+Pjo6dHlwZSYmCisgICAgZ2V0KHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiYmIF9faW4pIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19wYWlyX2dldDxfSW50Pjo6X19tb3ZlX2dldChzdGQ6Om1vdmUoX19pbikpOyB9CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0ludCwgY2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KKyAgICBjb25zdGV4cHIgY29uc3QgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfSW50LCBzdGQ6OnBhaXI8X1RwMSwgX1RwMj4+Ojp0eXBlJgorICAgIGdldChjb25zdCBzdGQ6OnBhaXI8X1RwMSwgX1RwMj4mIF9faW4pIG5vZXhjZXB0CisgICAgeyByZXR1cm4gX19wYWlyX2dldDxfSW50Pjo6X19jb25zdF9nZXQoX19pbik7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKKworI2VuZGlmIC8qIF9HTElCQ1hYX1VUSUxJVFkgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdmFsYXJyYXkgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3ZhbGFycmF5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOTZhZjYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3ZhbGFycmF5CkBAIC0wLDAgKzEsMTIzNSBAQAorLy8gVGhlIHRlbXBsYXRlIGFuZCBpbmxpbmVzIGZvciB0aGUgLSotIEMrKyAtKi0gdmFsYXJyYXkgY2xhc3MuCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL3ZhbGFycmF5CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworLy8gV3JpdHRlbiBieSBHYWJyaWVsIERvcyBSZWlzIDxHYWJyaWVsLkRvcy1SZWlzQERQVE1hdGhzLkVOUy1DYWNoYW4uRnI+CisKKyNpZm5kZWYgX0dMSUJDWFhfVkFMQVJSQVkKKyNkZWZpbmUgX0dMSUJDWFhfVkFMQVJSQVkgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2xvcywgdHlwZW5hbWUgX1RwPiAKKyAgICBjbGFzcyBfRXhwcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPiAKKyAgICBjbGFzcyBfVmFsQXJyYXk7ICAgIAorCisgIHRlbXBsYXRlPGNsYXNzIF9PcGVyLCB0ZW1wbGF0ZTxjbGFzcywgY2xhc3M+IGNsYXNzIF9NZXRhLCBjbGFzcyBfRG9tPgorICAgIHN0cnVjdCBfVW5DbG9zOworCisgIHRlbXBsYXRlPGNsYXNzIF9PcGVyLAorICAgICAgICB0ZW1wbGF0ZTxjbGFzcywgY2xhc3M+IGNsYXNzIF9NZXRhMSwKKyAgICAgICAgdGVtcGxhdGU8Y2xhc3MsIGNsYXNzPiBjbGFzcyBfTWV0YTIsCisgICAgICAgIGNsYXNzIF9Eb20xLCBjbGFzcyBfRG9tMj4gCisgICAgY2xhc3MgX0JpbkNsb3M7CisKKyAgdGVtcGxhdGU8dGVtcGxhdGU8Y2xhc3MsIGNsYXNzPiBjbGFzcyBfTWV0YSwgY2xhc3MgX0RvbT4gCisgICAgY2xhc3MgX1NDbG9zOworCisgIHRlbXBsYXRlPHRlbXBsYXRlPGNsYXNzLCBjbGFzcz4gY2xhc3MgX01ldGEsIGNsYXNzIF9Eb20+IAorICAgIGNsYXNzIF9HQ2xvczsKKyAgICAKKyAgdGVtcGxhdGU8dGVtcGxhdGU8Y2xhc3MsIGNsYXNzPiBjbGFzcyBfTWV0YSwgY2xhc3MgX0RvbT4gCisgICAgY2xhc3MgX0lDbG9zOworICAgIAorICB0ZW1wbGF0ZTx0ZW1wbGF0ZTxjbGFzcywgY2xhc3M+IGNsYXNzIF9NZXRhLCBjbGFzcyBfRG9tPiAKKyAgICBjbGFzcyBfVmFsRnVuQ2xvczsKKyAgCisgIHRlbXBsYXRlPHRlbXBsYXRlPGNsYXNzLCBjbGFzcz4gY2xhc3MgX01ldGEsIGNsYXNzIF9Eb20+IAorICAgIGNsYXNzIF9SZWZGdW5DbG9zOworCisgIHRlbXBsYXRlPGNsYXNzIF9UcD4gY2xhc3MgdmFsYXJyYXk7ICAgLy8gQW4gYXJyYXkgb2YgdHlwZSBfVHAKKyAgY2xhc3Mgc2xpY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCTEFTLWxpa2Ugc2xpY2Ugb3V0IG9mIGFuIGFycmF5CisgIHRlbXBsYXRlPGNsYXNzIF9UcD4gY2xhc3Mgc2xpY2VfYXJyYXk7CisgIGNsYXNzIGdzbGljZTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2VuZXJhbGl6ZWQgc2xpY2Ugb3V0IG9mIGFuIGFycmF5CisgIHRlbXBsYXRlPGNsYXNzIF9UcD4gY2xhc3MgZ3NsaWNlX2FycmF5OworICB0ZW1wbGF0ZTxjbGFzcyBfVHA+IGNsYXNzIG1hc2tfYXJyYXk7ICAgICAvLyBtYXNrZWQgYXJyYXkKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPiBjbGFzcyBpbmRpcmVjdF9hcnJheTsgLy8gaW5kaXJlY3RlZCBhcnJheQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNpbmNsdWRlIDxiaXRzL3ZhbGFycmF5X2FycmF5Lmg+CisjaW5jbHVkZSA8Yml0cy92YWxhcnJheV9iZWZvcmUuaD4KKyAgCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBkZWZncm91cCBudW1lcmljX2FycmF5cyBOdW1lcmljIEFycmF5cworICAgKiBAaW5ncm91cCBudW1lcmljcworICAgKgorICAgKiBDbGFzc2VzIGFuZCBmdW5jdGlvbnMgZm9yIHJlcHJlc2VudGluZyBhbmQgbWFuaXB1bGF0aW5nIGFycmF5cyBvZiBlbGVtZW50cy4KKyAgICogQHsKKyAgICovCisKKyAgLyoqCisgICAqICBAYnJpZWYgIFNtYXJ0IGFycmF5IGRlc2lnbmVkIHRvIHN1cHBvcnQgbnVtZXJpYyBwcm9jZXNzaW5nLgorICAgKgorICAgKiAgQSB2YWxhcnJheSBpcyBhbiBhcnJheSB0aGF0IHByb3ZpZGVzIGNvbnN0cmFpbnRzIGludGVuZGVkIHRvIGFsbG93IGZvcgorICAgKiAgZWZmZWN0aXZlIG9wdGltaXphdGlvbiBvZiBudW1lcmljIGFycmF5IHByb2Nlc3NpbmcgYnkgcmVkdWNpbmcgdGhlCisgICAqICBhbGlhc2luZyB0aGF0IGNhbiByZXN1bHQgZnJvbSBwb2ludGVyIHJlcHJlc2VudGF0aW9ucy4gIEl0IHJlcHJlc2VudHMgYQorICAgKiAgb25lLWRpbWVuc2lvbmFsIGFycmF5IGZyb20gd2hpY2ggZGlmZmVyZW50IG11bHRpZGltZW5zaW9uYWwgc3Vic2V0cyBjYW4KKyAgICogIGJlIGFjY2Vzc2VkIGFuZCBtb2RpZmllZC4KKyAgICogIAorICAgKiAgQHRwYXJhbSAgX1RwICBUeXBlIG9mIG9iamVjdCBpbiB0aGUgYXJyYXkuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVHA+IAorICAgIGNsYXNzIHZhbGFycmF5CisgICAgeworICAgICAgdGVtcGxhdGU8Y2xhc3MgX09wPgorCXN0cnVjdCBfVW5hcnlPcCAKKwl7CisJICB0eXBlZGVmIHR5cGVuYW1lIF9fZnVuPF9PcCwgX1RwPjo6cmVzdWx0X3R5cGUgX19ydDsKKwkgIHR5cGVkZWYgX0V4cHI8X1VuQ2xvczxfT3AsIF9WYWxBcnJheSwgX1RwPiwgX19ydD4gX1J0OworCX07CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKyAgICAgIAorCS8vIF9saWIudmFsYXJyYXkuY29uc18gY29uc3RydWN0L2Rlc3Ryb3k6CisgICAgICAvLy8gIENvbnN0cnVjdCBhbiBlbXB0eSBhcnJheS4KKyAgICAgIHZhbGFycmF5KCk7CisKKyAgICAgIC8vLyAgQ29uc3RydWN0IGFuIGFycmF5IHdpdGggQGEgbiBlbGVtZW50cy4KKyAgICAgIGV4cGxpY2l0IHZhbGFycmF5KHNpemVfdCk7CisKKyAgICAgIC8vLyAgQ29uc3RydWN0IGFuIGFycmF5IHdpdGggQGEgbiBlbGVtZW50cyBpbml0aWFsaXplZCB0byBAYSB0LgorICAgICAgdmFsYXJyYXkoY29uc3QgX1RwJiwgc2l6ZV90KTsKKworICAgICAgLy8vICBDb25zdHJ1Y3QgYW4gYXJyYXkgaW5pdGlhbGl6ZWQgdG8gdGhlIGZpcnN0IEBhIG4gZWxlbWVudHMgb2YgQGEgdC4KKyAgICAgIHZhbGFycmF5KGNvbnN0IF9UcCogX19yZXN0cmljdF9fLCBzaXplX3QpOworCisgICAgICAvLy8gIENvcHkgY29uc3RydWN0b3IuCisgICAgICB2YWxhcnJheShjb25zdCB2YWxhcnJheSYpOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLy8vICBNb3ZlIGNvbnN0cnVjdG9yLgorICAgICAgdmFsYXJyYXkodmFsYXJyYXkmJikgbm9leGNlcHQ7CisjZW5kaWYKKworICAgICAgLy8vICBDb25zdHJ1Y3QgYW4gYXJyYXkgd2l0aCB0aGUgc2FtZSBzaXplIGFuZCB2YWx1ZXMgaW4gQGEgc2EuCisgICAgICB2YWxhcnJheShjb25zdCBzbGljZV9hcnJheTxfVHA+Jik7CisKKyAgICAgIC8vLyAgQ29uc3RydWN0IGFuIGFycmF5IHdpdGggdGhlIHNhbWUgc2l6ZSBhbmQgdmFsdWVzIGluIEBhIGdhLgorICAgICAgdmFsYXJyYXkoY29uc3QgZ3NsaWNlX2FycmF5PF9UcD4mKTsKKworICAgICAgLy8vICBDb25zdHJ1Y3QgYW4gYXJyYXkgd2l0aCB0aGUgc2FtZSBzaXplIGFuZCB2YWx1ZXMgaW4gQGEgbWEuCisgICAgICB2YWxhcnJheShjb25zdCBtYXNrX2FycmF5PF9UcD4mKTsKKworICAgICAgLy8vICBDb25zdHJ1Y3QgYW4gYXJyYXkgd2l0aCB0aGUgc2FtZSBzaXplIGFuZCB2YWx1ZXMgaW4gQGEgaWEuCisgICAgICB2YWxhcnJheShjb25zdCBpbmRpcmVjdF9hcnJheTxfVHA+Jik7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLy8gIENvbnN0cnVjdCBhbiBhcnJheSB3aXRoIGFuIGluaXRpYWxpemVyX2xpc3Qgb2YgdmFsdWVzLgorICAgICAgdmFsYXJyYXkoaW5pdGlhbGl6ZXJfbGlzdDxfVHA+KTsKKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorCXZhbGFycmF5KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSk7CisKKyAgICAgIH52YWxhcnJheSgpIF9HTElCQ1hYX05PRVhDRVBUOworCisgICAgICAvLyBfbGliLnZhbGFycmF5LmFzc2lnbl8gYXNzaWdubWVudDoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWduIGVsZW1lbnRzIHRvIGFuIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBBc3NpZ24gZWxlbWVudHMgb2YgYXJyYXkgdG8gdmFsdWVzIGluIEBhIHYuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX192ICBWYWxhcnJheSB0byBnZXQgdmFsdWVzIGZyb20uCisgICAgICAgKi8KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yPShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YpOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNb3ZlIGFzc2lnbiBlbGVtZW50cyB0byBhbiBhcnJheS4KKyAgICAgICAqCisgICAgICAgKiAgTW92ZSBhc3NpZ24gZWxlbWVudHMgb2YgYXJyYXkgdG8gdmFsdWVzIGluIEBhIHYuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX192ICBWYWxhcnJheSB0byBnZXQgdmFsdWVzIGZyb20uCisgICAgICAgKi8KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yPSh2YWxhcnJheTxfVHA+JiYgX192KSBub2V4Y2VwdDsKKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbiBlbGVtZW50cyB0byBhIHZhbHVlLgorICAgICAgICoKKyAgICAgICAqICBBc3NpZ24gYWxsIGVsZW1lbnRzIG9mIGFycmF5IHRvIEBhIHQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX190ICBWYWx1ZSBmb3IgZWxlbWVudHMuCisgICAgICAgKi8KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yPShjb25zdCBfVHAmIF9fdCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWduIGVsZW1lbnRzIHRvIGFuIGFycmF5IHN1YnNldC4KKyAgICAgICAqCisgICAgICAgKiAgQXNzaWduIGVsZW1lbnRzIG9mIGFycmF5IHRvIHZhbHVlcyBpbiBAYSBzYS4gIFJlc3VsdHMgYXJlIHVuZGVmaW5lZAorICAgICAgICogIGlmIEBhIHNhIGRvZXMgbm90IGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGlzIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fc2EgIEFycmF5IHNsaWNlIHRvIGdldCB2YWx1ZXMgZnJvbS4KKyAgICAgICAqLworICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I9KGNvbnN0IHNsaWNlX2FycmF5PF9UcD4mIF9fc2EpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbiBlbGVtZW50cyB0byBhbiBhcnJheSBzdWJzZXQuCisgICAgICAgKgorICAgICAgICogIEFzc2lnbiBlbGVtZW50cyBvZiBhcnJheSB0byB2YWx1ZXMgaW4gQGEgZ2EuICBSZXN1bHRzIGFyZSB1bmRlZmluZWQKKyAgICAgICAqICBpZiBAYSBnYSBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIHNpemUgYXMgdGhpcyBhcnJheS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX2dhICBBcnJheSBzbGljZSB0byBnZXQgdmFsdWVzIGZyb20uCisgICAgICAgKi8KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yPShjb25zdCBnc2xpY2VfYXJyYXk8X1RwPiYgX19nYSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWduIGVsZW1lbnRzIHRvIGFuIGFycmF5IHN1YnNldC4KKyAgICAgICAqCisgICAgICAgKiAgQXNzaWduIGVsZW1lbnRzIG9mIGFycmF5IHRvIHZhbHVlcyBpbiBAYSBtYS4gIFJlc3VsdHMgYXJlIHVuZGVmaW5lZAorICAgICAgICogIGlmIEBhIG1hIGRvZXMgbm90IGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGlzIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fbWEgIEFycmF5IHNsaWNlIHRvIGdldCB2YWx1ZXMgZnJvbS4KKyAgICAgICAqLworICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I9KGNvbnN0IG1hc2tfYXJyYXk8X1RwPiYgX19tYSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWduIGVsZW1lbnRzIHRvIGFuIGFycmF5IHN1YnNldC4KKyAgICAgICAqCisgICAgICAgKiAgQXNzaWduIGVsZW1lbnRzIG9mIGFycmF5IHRvIHZhbHVlcyBpbiBAYSBpYS4gIFJlc3VsdHMgYXJlIHVuZGVmaW5lZAorICAgICAgICogIGlmIEBhIGlhIGRvZXMgbm90IGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGlzIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9faWEgIEFycmF5IHNsaWNlIHRvIGdldCB2YWx1ZXMgZnJvbS4KKyAgICAgICAqLworICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I9KGNvbnN0IGluZGlyZWN0X2FycmF5PF9UcD4mIF9faWEpOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBc3NpZ24gZWxlbWVudHMgdG8gYW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqCisgICAgICAgKiAgQXNzaWduIGVsZW1lbnRzIG9mIGFycmF5IHRvIHZhbHVlcyBpbiBAYSBfX2wuICBSZXN1bHRzIGFyZSB1bmRlZmluZWQKKyAgICAgICAqICBpZiBAYSBfX2wgZG9lcyBub3QgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHRoaXMgYXJyYXkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19sICBpbml0aWFsaXplcl9saXN0IHRvIGdldCB2YWx1ZXMgZnJvbS4KKyAgICAgICAqLworICAgICAgdmFsYXJyYXkmIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PF9UcD4gX19sKTsKKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPiB2YWxhcnJheTxfVHA+JgorCW9wZXJhdG9yPSAoY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpOworCisgICAgICAvLyBfbGliLnZhbGFycmF5LmFjY2Vzc18gZWxlbWVudCBhY2Nlc3M6CisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGkndGggYXJyYXkgZWxlbWVudC4gIAorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9faSAgSW5kZXggb2YgZWxlbWVudCB0byByZXR1cm4uCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoZSBpJ3RoIGVsZW1lbnQuCisgICAgICAgKi8KKyAgICAgIF9UcCYgICAgICAgICAgICAgICAgb3BlcmF0b3JbXShzaXplX3QgX19pKTsKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMzg5LiBDb25zdCBvdmVybG9hZCBvZiB2YWxhcnJheTo6b3BlcmF0b3JbXSByZXR1cm5zIGJ5IHZhbHVlLgorICAgICAgY29uc3QgX1RwJiAgICAgICAgICBvcGVyYXRvcltdKHNpemVfdCkgY29uc3Q7CisKKyAgICAgIC8vIF9saWIudmFsYXJyYXkuc3ViXyBzdWJzZXQgb3BlcmF0aW9uczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGFuIGFycmF5IHN1YnNldC4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIG5ldyB2YWxhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkKKyAgICAgICAqICBpbmRpY2F0ZWQgYnkgdGhlIHNsaWNlIGFyZ3VtZW50LiAgVGhlIG5ldyB2YWxhcnJheSBoYXMgdGhlIHNhbWUgc2l6ZQorICAgICAgICogIGFzIHRoZSBpbnB1dCBzbGljZS4gIEBzZWUgc2xpY2UuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19zICBUaGUgc291cmNlIHNsaWNlLgorICAgICAgICogIEByZXR1cm4gIE5ldyB2YWxhcnJheSBjb250YWluaW5nIGVsZW1lbnRzIGluIEBhIF9fcy4KKyAgICAgICAqLworICAgICAgX0V4cHI8X1NDbG9zPF9WYWxBcnJheSwgX1RwPiwgX1RwPiBvcGVyYXRvcltdKHNsaWNlIF9fcykgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGEgcmVmZXJlbmNlIHRvIGFuIGFycmF5IHN1YnNldC4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIG5ldyB2YWxhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkKKyAgICAgICAqICBpbmRpY2F0ZWQgYnkgdGhlIHNsaWNlIGFyZ3VtZW50LiAgVGhlIG5ldyB2YWxhcnJheSBoYXMgdGhlIHNhbWUgc2l6ZQorICAgICAgICogIGFzIHRoZSBpbnB1dCBzbGljZS4gIEBzZWUgc2xpY2UuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19zICBUaGUgc291cmNlIHNsaWNlLgorICAgICAgICogIEByZXR1cm4gIE5ldyB2YWxhcnJheSBjb250YWluaW5nIGVsZW1lbnRzIGluIEBhIF9fcy4KKyAgICAgICAqLworICAgICAgc2xpY2VfYXJyYXk8X1RwPiAgICBvcGVyYXRvcltdKHNsaWNlIF9fcyk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGFuIGFycmF5IHN1YnNldC4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIHNsaWNlX2FycmF5IHJlZmVyZW5jaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkKKyAgICAgICAqICBpbmRpY2F0ZWQgYnkgdGhlIHNsaWNlIGFyZ3VtZW50LiAgQHNlZSBnc2xpY2UuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19zICBUaGUgc291cmNlIHNsaWNlLgorICAgICAgICogIEByZXR1cm4gIFNsaWNlX2FycmF5IHJlZmVyZW5jaW5nIGVsZW1lbnRzIGluZGljYXRlZCBieSBAYSBfX3MuCisgICAgICAgKi8KKyAgICAgIF9FeHByPF9HQ2xvczxfVmFsQXJyYXksIF9UcD4sIF9UcD4gb3BlcmF0b3JbXShjb25zdCBnc2xpY2UmIF9fcykgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGEgcmVmZXJlbmNlIHRvIGFuIGFycmF5IHN1YnNldC4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIG5ldyB2YWxhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkKKyAgICAgICAqICBpbmRpY2F0ZWQgYnkgdGhlIGdzbGljZSBhcmd1bWVudC4gIFRoZSBuZXcgdmFsYXJyYXkgaGFzCisgICAgICAgKiAgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgaW5wdXQgZ3NsaWNlLiAgQHNlZSBnc2xpY2UuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19zICBUaGUgc291cmNlIGdzbGljZS4KKyAgICAgICAqICBAcmV0dXJuICBOZXcgdmFsYXJyYXkgY29udGFpbmluZyBlbGVtZW50cyBpbiBAYSBfX3MuCisgICAgICAgKi8KKyAgICAgIGdzbGljZV9hcnJheTxfVHA+ICAgb3BlcmF0b3JbXShjb25zdCBnc2xpY2UmIF9fcyk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGFuIGFycmF5IHN1YnNldC4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIG5ldyB2YWxhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkKKyAgICAgICAqICBpbmRpY2F0ZWQgYnkgdGhlIGFyZ3VtZW50LiAgVGhlIGlucHV0IGlzIGEgdmFsYXJyYXkgb2YgYm9vbCB3aGljaAorICAgICAgICogIHJlcHJlc2VudHMgYSBiaXRtYXNrIGluZGljYXRpbmcgd2hpY2ggZWxlbWVudHMgc2hvdWxkIGJlIGNvcGllZCBpbnRvCisgICAgICAgKiAgdGhlIG5ldyB2YWxhcnJheS4gIEVhY2ggZWxlbWVudCBvZiB0aGUgYXJyYXkgaXMgYWRkZWQgdG8gdGhlIHJldHVybgorICAgICAgICogIHZhbGFycmF5IGlmIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgdGhlIGFyZ3VtZW50IGlzIHRydWUuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19tICBUaGUgdmFsYXJyYXkgYml0bWFzay4KKyAgICAgICAqICBAcmV0dXJuICBOZXcgdmFsYXJyYXkgY29udGFpbmluZyBlbGVtZW50cyBpbmRpY2F0ZWQgYnkgQGEgX19tLgorICAgICAgICovCisgICAgICB2YWxhcnJheTxfVHA+ICAgICAgIG9wZXJhdG9yW10oY29uc3QgdmFsYXJyYXk8Ym9vbD4mIF9fbSkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGEgcmVmZXJlbmNlIHRvIGFuIGFycmF5IHN1YnNldC4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIG5ldyBtYXNrX2FycmF5IHJlZmVyZW5jaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkKKyAgICAgICAqICBpbmRpY2F0ZWQgYnkgdGhlIGFyZ3VtZW50LiAgVGhlIGlucHV0IGlzIGEgdmFsYXJyYXkgb2YgYm9vbCB3aGljaAorICAgICAgICogIHJlcHJlc2VudHMgYSBiaXRtYXNrIGluZGljYXRpbmcgd2hpY2ggZWxlbWVudHMgYXJlIHBhcnQgb2YgdGhlCisgICAgICAgKiAgc3Vic2V0LiAgRWxlbWVudHMgb2YgdGhlIGFycmF5IGFyZSBwYXJ0IG9mIHRoZSBzdWJzZXQgaWYgdGhlCisgICAgICAgKiAgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIHRoZSBhcmd1bWVudCBpcyB0cnVlLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fbSAgVGhlIHZhbGFycmF5IGJpdG1hc2suCisgICAgICAgKiAgQHJldHVybiAgTmV3IHZhbGFycmF5IGNvbnRhaW5pbmcgZWxlbWVudHMgaW5kaWNhdGVkIGJ5IEBhIF9fbS4KKyAgICAgICAqLworICAgICAgbWFza19hcnJheTxfVHA+ICAgICBvcGVyYXRvcltdKGNvbnN0IHZhbGFycmF5PGJvb2w+JiBfX20pOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBhbiBhcnJheSBzdWJzZXQuCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgYSBuZXcgdmFsYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5CisgICAgICAgKiAgaW5kaWNhdGVkIGJ5IHRoZSBhcmd1bWVudC4gIFRoZSBlbGVtZW50cyBpbiB0aGUgYXJndW1lbnQgYXJlCisgICAgICAgKiAgaW50ZXJwcmV0ZWQgYXMgdGhlIGluZGljZXMgb2YgZWxlbWVudHMgb2YgdGhpcyB2YWxhcnJheSB0byBjb3B5IHRvCisgICAgICAgKiAgdGhlIHJldHVybiB2YWxhcnJheS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX2kgIFRoZSB2YWxhcnJheSBlbGVtZW50IGluZGV4IGxpc3QuCisgICAgICAgKiAgQHJldHVybiAgTmV3IHZhbGFycmF5IGNvbnRhaW5pbmcgZWxlbWVudHMgaW4gQGEgX19zLgorICAgICAgICovCisgICAgICBfRXhwcjxfSUNsb3M8X1ZhbEFycmF5LCBfVHA+LCBfVHA+CisgICAgICAgIG9wZXJhdG9yW10oY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX19pKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gYSByZWZlcmVuY2UgdG8gYW4gYXJyYXkgc3Vic2V0LgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGFuIGluZGlyZWN0X2FycmF5IHJlZmVyZW5jaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkKKyAgICAgICAqICBpbmRpY2F0ZWQgYnkgdGhlIGFyZ3VtZW50LiAgVGhlIGVsZW1lbnRzIGluIHRoZSBhcmd1bWVudCBhcmUKKyAgICAgICAqICBpbnRlcnByZXRlZCBhcyB0aGUgaW5kaWNlcyBvZiBlbGVtZW50cyBvZiB0aGlzIHZhbGFycmF5IHRvIGluY2x1ZGUKKyAgICAgICAqICBpbiB0aGUgc3Vic2V0LiAgVGhlIHJldHVybmVkIGluZGlyZWN0X2FycmF5IHJlZmVycyB0byB0aGVzZQorICAgICAgICogIGVsZW1lbnRzLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9faSAgVGhlIHZhbGFycmF5IGVsZW1lbnQgaW5kZXggbGlzdC4KKyAgICAgICAqICBAcmV0dXJuICBJbmRpcmVjdF9hcnJheSByZWZlcmVuY2luZyBlbGVtZW50cyBpbiBAYSBfX2kuCisgICAgICAgKi8KKyAgICAgIGluZGlyZWN0X2FycmF5PF9UcD4gb3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfX2kpOworCisgICAgICAvLyBfbGliLnZhbGFycmF5LnVuYXJ5XyB1bmFyeSBvcGVyYXRvcnM6CisgICAgICAvLy8gIFJldHVybiBhIG5ldyB2YWxhcnJheSBieSBhcHBseWluZyB1bmFyeSArIHRvIGVhY2ggZWxlbWVudC4KKyAgICAgIHR5cGVuYW1lIF9VbmFyeU9wPF9fdW5hcnlfcGx1cz46Ol9SdCAgb3BlcmF0b3IrKCkgY29uc3Q7CisKKyAgICAgIC8vLyAgUmV0dXJuIGEgbmV3IHZhbGFycmF5IGJ5IGFwcGx5aW5nIHVuYXJ5IC0gdG8gZWFjaCBlbGVtZW50LgorICAgICAgdHlwZW5hbWUgX1VuYXJ5T3A8X19uZWdhdGU+OjpfUnQgICAgICBvcGVyYXRvci0oKSBjb25zdDsKKworICAgICAgLy8vICBSZXR1cm4gYSBuZXcgdmFsYXJyYXkgYnkgYXBwbHlpbmcgdW5hcnkgfiB0byBlYWNoIGVsZW1lbnQuCisgICAgICB0eXBlbmFtZSBfVW5hcnlPcDxfX2JpdHdpc2Vfbm90Pjo6X1J0IG9wZXJhdG9yfigpIGNvbnN0OworCisgICAgICAvLy8gIFJldHVybiBhIG5ldyB2YWxhcnJheSBieSBhcHBseWluZyB1bmFyeSAhIHRvIGVhY2ggZWxlbWVudC4KKyAgICAgIHR5cGVuYW1lIF9VbmFyeU9wPF9fbG9naWNhbF9ub3Q+OjpfUnQgb3BlcmF0b3IhKCkgY29uc3Q7CisKKyAgICAgIC8vIF9saWIudmFsYXJyYXkuY2Fzc2lnbl8gY29tcHV0ZWQgYXNzaWdubWVudDoKKyAgICAgIC8vLyAgTXVsdGlwbHkgZWFjaCBlbGVtZW50IG9mIGFycmF5IGJ5IEBhIHQuCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcio9KGNvbnN0IF9UcCYpOworCisgICAgICAvLy8gIERpdmlkZSBlYWNoIGVsZW1lbnQgb2YgYXJyYXkgYnkgQGEgdC4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yLz0oY29uc3QgX1RwJik7CisKKyAgICAgIC8vLyAgU2V0IGVhY2ggZWxlbWVudCBlIG9mIGFycmF5IHRvIGUgJSBAYSB0LgorICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IlPShjb25zdCBfVHAmKTsKKworICAgICAgLy8vICBBZGQgQGEgdCB0byBlYWNoIGVsZW1lbnQgb2YgYXJyYXkuCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcis9KGNvbnN0IF9UcCYpOworCisgICAgICAvLy8gIFN1YnRyYWN0IEBhIHQgdG8gZWFjaCBlbGVtZW50IG9mIGFycmF5LgorICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3ItPShjb25zdCBfVHAmKTsKKworICAgICAgLy8vICBTZXQgZWFjaCBlbGVtZW50IGUgb2YgYXJyYXkgdG8gZSBeIEBhIHQuCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcl49KGNvbnN0IF9UcCYpOworCisgICAgICAvLy8gIFNldCBlYWNoIGVsZW1lbnQgZSBvZiBhcnJheSB0byBlICYgQGEgdC4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yJj0oY29uc3QgX1RwJik7CisKKyAgICAgIC8vLyAgU2V0IGVhY2ggZWxlbWVudCBlIG9mIGFycmF5IHRvIGUgfCBAYSB0LgorICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3J8PShjb25zdCBfVHAmKTsKKworICAgICAgLy8vICBMZWZ0IHNoaWZ0IGVhY2ggZWxlbWVudCBlIG9mIGFycmF5IGJ5IEBhIHQgYml0cy4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yPDw9KGNvbnN0IF9UcCYpOworCisgICAgICAvLy8gIFJpZ2h0IHNoaWZ0IGVhY2ggZWxlbWVudCBlIG9mIGFycmF5IGJ5IEBhIHQgYml0cy4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yPj49KGNvbnN0IF9UcCYpOworCisgICAgICAvLy8gIE11bHRpcGx5IGVsZW1lbnRzIG9mIGFycmF5IGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yKj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpOworCisgICAgICAvLy8gIERpdmlkZSBlbGVtZW50cyBvZiBhcnJheSBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvci89KGNvbnN0IHZhbGFycmF5PF9UcD4mKTsKKworICAgICAgLy8vICBNb2R1bG8gZWxlbWVudHMgb2YgYXJyYXkgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IlPShjb25zdCB2YWxhcnJheTxfVHA+Jik7CisKKyAgICAgIC8vLyAgQWRkIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdiB0byBlbGVtZW50cyBvZiBhcnJheS4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yKz0oY29uc3QgdmFsYXJyYXk8X1RwPiYpOworCisgICAgICAvLy8gIFN1YnRyYWN0IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdiBmcm9tIGVsZW1lbnRzIG9mIGFycmF5LgorICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3ItPShjb25zdCB2YWxhcnJheTxfVHA+Jik7CisKKyAgICAgIC8vLyAgTG9naWNhbCB4b3IgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2IHdpdGggZWxlbWVudHMgb2YgYXJyYXkuCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcl49KGNvbnN0IHZhbGFycmF5PF9UcD4mKTsKKworICAgICAgLy8vICBMb2dpY2FsIG9yIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdiB3aXRoIGVsZW1lbnRzIG9mIGFycmF5LgorICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3J8PShjb25zdCB2YWxhcnJheTxfVHA+Jik7CisKKyAgICAgIC8vLyAgTG9naWNhbCBhbmQgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2IHdpdGggZWxlbWVudHMgb2YgYXJyYXkuCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvciY9KGNvbnN0IHZhbGFycmF5PF9UcD4mKTsKKworICAgICAgLy8vICBMZWZ0IHNoaWZ0IGVsZW1lbnRzIG9mIGFycmF5IGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yPDw9KGNvbnN0IHZhbGFycmF5PF9UcD4mKTsKKworICAgICAgLy8vICBSaWdodCBzaGlmdCBlbGVtZW50cyBvZiBhcnJheSBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcj4+PShjb25zdCB2YWxhcnJheTxfVHA+Jik7CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisJdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IqPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+Jik7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorCXZhbGFycmF5PF9UcD4mIG9wZXJhdG9yLz0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpOworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2YWxhcnJheTxfVHA+JiBvcGVyYXRvciU9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKTsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisJdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IrPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+Jik7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorCXZhbGFycmF5PF9UcD4mIG9wZXJhdG9yLT0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpOworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2YWxhcnJheTxfVHA+JiBvcGVyYXRvcl49KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKTsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisJdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3J8PShjb25zdCBfRXhwcjxfRG9tLCBfVHA+Jik7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorCXZhbGFycmF5PF9UcD4mIG9wZXJhdG9yJj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpOworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I8PD0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpOworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2YWxhcnJheTxfVHA+JiBvcGVyYXRvcj4+PShjb25zdCBfRXhwcjxfRG9tLCBfVHA+Jik7CisKKyAgICAgIC8vIF9saWIudmFsYXJyYXkubWVtYmVyc18gbWVtYmVyIGZ1bmN0aW9uczoKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgICAvLy8gIFN3YXAuCisgICAgICB2b2lkIHN3YXAodmFsYXJyYXk8X1RwPiYgX192KSBub2V4Y2VwdDsKKyNlbmRpZgorCisgICAgICAvLy8gIFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFycmF5LgorICAgICAgc2l6ZV90IHNpemUoKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gdGhlIHN1bSBvZiBhbGwgZWxlbWVudHMgaW4gdGhlIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBBY2N1bXVsYXRlcyB0aGUgc3VtIG9mIGFsbCBlbGVtZW50cyBpbnRvIGEgVHAgdXNpbmcgKz0uICBUaGUgb3JkZXIKKyAgICAgICAqICBvZiBhZGRpbmcgdGhlIGVsZW1lbnRzIGlzIHVuc3BlY2lmaWVkLgorICAgICAgICovCisgICAgICBfVHAgICAgc3VtKCkgY29uc3Q7CisKKyAgICAgIC8vLyAgUmV0dXJuIHRoZSBtaW5pbXVtIGVsZW1lbnQgdXNpbmcgb3BlcmF0b3I8KCkuCisgICAgICBfVHAgICAgbWluKCkgY29uc3Q7CQorCisgICAgICAvLy8gIFJldHVybiB0aGUgbWF4aW11bSBlbGVtZW50IHVzaW5nIG9wZXJhdG9yPCgpLgorICAgICAgX1RwICAgIG1heCgpIGNvbnN0OwkKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gYSBzaGlmdGVkIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBBIG5ldyB2YWxhcnJheSBpcyBjb25zdHJ1Y3RlZCBhcyBhIGNvcHkgb2YgdGhpcyBhcnJheSB3aXRoIGVsZW1lbnRzCisgICAgICAgKiAgaW4gc2hpZnRlZCBwb3NpdGlvbnMuICBGb3IgYW4gZWxlbWVudCB3aXRoIGluZGV4IGksIHRoZSBuZXcgcG9zaXRpb24KKyAgICAgICAqICBpcyBpIC0gbi4gIFRoZSBuZXcgdmFsYXJyYXkgaGFzIHRoZSBzYW1lIHNpemUgYXMgdGhlIGN1cnJlbnQgb25lLgorICAgICAgICogIE5ldyBlbGVtZW50cyB3aXRob3V0IGEgdmFsdWUgYXJlIHNldCB0byAwLiAgRWxlbWVudHMgd2hvc2UgbmV3CisgICAgICAgKiAgcG9zaXRpb24gaXMgb3V0c2lkZSB0aGUgYm91bmRzIG9mIHRoZSBhcnJheSBhcmUgZGlzY2FyZGVkLgorICAgICAgICoKKyAgICAgICAqICBQb3NpdGl2ZSBhcmd1bWVudHMgc2hpZnQgdG93YXJkIGluZGV4IDAsIGRpc2NhcmRpbmcgZWxlbWVudHMgWzAsIG4pLgorICAgICAgICogIE5lZ2F0aXZlIGFyZ3VtZW50cyBkaXNjYXJkIGVsZW1lbnRzIGZyb20gdGhlIHRvcCBvZiB0aGUgYXJyYXkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgX19uICBOdW1iZXIgb2YgZWxlbWVudCBwb3NpdGlvbnMgdG8gc2hpZnQuCisgICAgICAgKiAgQHJldHVybiAgTmV3IHZhbGFycmF5IHdpdGggZWxlbWVudHMgaW4gc2hpZnRlZCBwb3NpdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHZhbGFycmF5PF9UcD4gc2hpZnQgKGludCBfX24pIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBhIHJvdGF0ZWQgYXJyYXkuCisgICAgICAgKgorICAgICAgICogIEEgbmV3IHZhbGFycmF5IGlzIGNvbnN0cnVjdGVkIGFzIGEgY29weSBvZiB0aGlzIGFycmF5IHdpdGggZWxlbWVudHMKKyAgICAgICAqICBpbiBzaGlmdGVkIHBvc2l0aW9ucy4gIEZvciBhbiBlbGVtZW50IHdpdGggaW5kZXggaSwgdGhlIG5ldyBwb3NpdGlvbgorICAgICAgICogIGlzIChpIC0gbikgJSBzaXplKCkuICBUaGUgbmV3IHZhbGFycmF5IGhhcyB0aGUgc2FtZSBzaXplIGFzIHRoZQorICAgICAgICogIGN1cnJlbnQgb25lLiAgRWxlbWVudHMgdGhhdCBhcmUgc2hpZnRlZCBiZXlvbmQgdGhlIGFycmF5IGJvdW5kcyBhcmUKKyAgICAgICAqICBzaGlmdGVkIGludG8gdGhlIG90aGVyIGVuZCBvZiB0aGUgYXJyYXkuICBObyBlbGVtZW50cyBhcmUgbG9zdC4KKyAgICAgICAqCisgICAgICAgKiAgUG9zaXRpdmUgYXJndW1lbnRzIHNoaWZ0IHRvd2FyZCBpbmRleCAwLCB3cmFwcGluZyBhcm91bmQgdGhlIHRvcC4KKyAgICAgICAqICBOZWdhdGl2ZSBhcmd1bWVudHMgc2hpZnQgdG93YXJkcyB0aGUgdG9wLCB3cmFwcGluZyBhcm91bmQgdG8gMC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBlbGVtZW50IHBvc2l0aW9ucyB0byByb3RhdGUuCisgICAgICAgKiAgQHJldHVybiAgTmV3IHZhbGFycmF5IHdpdGggZWxlbWVudHMgaW4gc2hpZnRlZCBwb3NpdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHZhbGFycmF5PF9UcD4gY3NoaWZ0KGludCBfX24pIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGx5IGEgZnVuY3Rpb24gdG8gdGhlIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGEgbmV3IHZhbGFycmF5IHdpdGggZWxlbWVudHMgYXNzaWduZWQgdG8gdGhlIHJlc3VsdCBvZgorICAgICAgICogIGFwcGx5aW5nIGZ1bmMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiB0aGlzIGFycmF5LiAgVGhlIG5ldworICAgICAgICogIGFycmF5IGhhcyB0aGUgc2FtZSBzaXplIGFzIHRoaXMgb25lLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIGZ1bmMgIEZ1bmN0aW9uIG9mIFRwIHJldHVybmluZyBUcCB0byBhcHBseS4KKyAgICAgICAqICBAcmV0dXJuICBOZXcgdmFsYXJyYXkgd2l0aCB0cmFuc2Zvcm1lZCBlbGVtZW50cy4KKyAgICAgICAqLworICAgICAgX0V4cHI8X1ZhbEZ1bkNsb3M8X1ZhbEFycmF5LCBfVHA+LCBfVHA+IGFwcGx5KF9UcCBmdW5jKF9UcCkpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGx5IGEgZnVuY3Rpb24gdG8gdGhlIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGEgbmV3IHZhbGFycmF5IHdpdGggZWxlbWVudHMgYXNzaWduZWQgdG8gdGhlIHJlc3VsdCBvZgorICAgICAgICogIGFwcGx5aW5nIGZ1bmMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiB0aGlzIGFycmF5LiAgVGhlIG5ldworICAgICAgICogIGFycmF5IGhhcyB0aGUgc2FtZSBzaXplIGFzIHRoaXMgb25lLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIGZ1bmMgIEZ1bmN0aW9uIG9mIGNvbnN0IFRwJiByZXR1cm5pbmcgVHAgdG8gYXBwbHkuCisgICAgICAgKiAgQHJldHVybiAgTmV3IHZhbGFycmF5IHdpdGggdHJhbnNmb3JtZWQgZWxlbWVudHMuCisgICAgICAgKi8KKyAgICAgIF9FeHByPF9SZWZGdW5DbG9zPF9WYWxBcnJheSwgX1RwPiwgX1RwPiBhcHBseShfVHAgZnVuYyhjb25zdCBfVHAmKSkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVzaXplIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBSZXNpemUgdGhpcyBhcnJheSB0byBAYSBzaXplIGFuZCBzZXQgYWxsIGVsZW1lbnRzIHRvIEBhIGMuICBBbGwKKyAgICAgICAqICByZWZlcmVuY2VzIGFuZCBpdGVyYXRvcnMgYXJlIGludmFsaWRhdGVkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIF9fc2l6ZSAgTmV3IGFycmF5IHNpemUuCisgICAgICAgKiAgQHBhcmFtICBfX2MgIE5ldyB2YWx1ZSBmb3IgYWxsIGVsZW1lbnRzLgorICAgICAgICovCisgICAgICB2b2lkIHJlc2l6ZShzaXplX3QgX19zaXplLCBfVHAgX19jID0gX1RwKCkpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHNpemVfdCBfTV9zaXplOworICAgICAgX1RwKiBfX3Jlc3RyaWN0X18gX01fZGF0YTsKKyAgICAgIAorICAgICAgZnJpZW5kIGNsYXNzIF9BcnJheTxfVHA+OworICAgIH07CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbnN0IF9UcCYKKyAgICB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKHNpemVfdCBfX2kpIGNvbnN0CisgICAgeyAKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdWJzY3JpcHQoX19pKTsKKyAgICAgIHJldHVybiBfTV9kYXRhW19faV07CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwJgorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oc2l6ZV90IF9faSkKKyAgICB7IAorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N1YnNjcmlwdChfX2kpOworICAgICAgcmV0dXJuIF9NX2RhdGFbX19pXTsKKyAgICB9CisKKyAgLy8gQH0gZ3JvdXAgbnVtZXJpY19hcnJheXMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjaW5jbHVkZSA8Yml0cy92YWxhcnJheV9hZnRlci5oPgorI2luY2x1ZGUgPGJpdHMvc2xpY2VfYXJyYXkuaD4KKyNpbmNsdWRlIDxiaXRzL2dzbGljZS5oPgorI2luY2x1ZGUgPGJpdHMvZ3NsaWNlX2FycmF5Lmg+CisjaW5jbHVkZSA8Yml0cy9tYXNrX2FycmF5Lmg+CisjaW5jbHVkZSA8Yml0cy9pbmRpcmVjdF9hcnJheS5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIG51bWVyaWNfYXJyYXlzCisgICAqIEB7CisgICAqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICB2YWxhcnJheTxfVHA+Ojp2YWxhcnJheSgpIDogX01fc2l6ZSgwKSwgX01fZGF0YSgwKSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgCisgICAgdmFsYXJyYXk8X1RwPjo6dmFsYXJyYXkoc2l6ZV90IF9fbikgCisgICAgOiBfTV9zaXplKF9fbiksIF9NX2RhdGEoX192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9fbikpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfZGVmYXVsdF9jb25zdHJ1Y3QoX01fZGF0YSwgX01fZGF0YSArIF9fbik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lCisgICAgdmFsYXJyYXk8X1RwPjo6dmFsYXJyYXkoY29uc3QgX1RwJiBfX3QsIHNpemVfdCBfX24pCisgICAgOiBfTV9zaXplKF9fbiksIF9NX2RhdGEoX192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9fbikpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfZmlsbF9jb25zdHJ1Y3QoX01fZGF0YSwgX01fZGF0YSArIF9fbiwgX190KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICB2YWxhcnJheTxfVHA+Ojp2YWxhcnJheShjb25zdCBfVHAqIF9fcmVzdHJpY3RfXyBfX3AsIHNpemVfdCBfX24pCisgICAgOiBfTV9zaXplKF9fbiksIF9NX2RhdGEoX192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9fbikpCisgICAgeyAKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfX3AgIT0gMCB8fCBfX24gPT0gMCk7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX19wLCBfX3AgKyBfX24sIF9NX2RhdGEpOyAKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIHZhbGFycmF5PF9UcD46OnZhbGFycmF5KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdikKKyAgICA6IF9NX3NpemUoX192Ll9NX3NpemUpLCBfTV9kYXRhKF9fdmFsYXJyYXlfZ2V0X3N0b3JhZ2U8X1RwPihfX3YuX01fc2l6ZSkpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX192Ll9NX2RhdGEsIF9fdi5fTV9kYXRhICsgX01fc2l6ZSwKKwkJCQkgICAgIF9NX2RhdGEpOyB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICB2YWxhcnJheTxfVHA+Ojp2YWxhcnJheSh2YWxhcnJheTxfVHA+JiYgX192KSBub2V4Y2VwdAorICAgIDogX01fc2l6ZShfX3YuX01fc2l6ZSksIF9NX2RhdGEoX192Ll9NX2RhdGEpCisgICAgeworICAgICAgX192Ll9NX3NpemUgPSAwOworICAgICAgX192Ll9NX2RhdGEgPSAwOworICAgIH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICB2YWxhcnJheTxfVHA+Ojp2YWxhcnJheShjb25zdCBzbGljZV9hcnJheTxfVHA+JiBfX3NhKQorICAgIDogX01fc2l6ZShfX3NhLl9NX3N6KSwgX01fZGF0YShfX3ZhbGFycmF5X2dldF9zdG9yYWdlPF9UcD4oX19zYS5fTV9zeikpCisgICAgeworICAgICAgc3RkOjpfX3ZhbGFycmF5X2NvcHlfY29uc3RydWN0CisJKF9fc2EuX01fYXJyYXksIF9fc2EuX01fc3osIF9fc2EuX01fc3RyaWRlLCBfQXJyYXk8X1RwPihfTV9kYXRhKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICB2YWxhcnJheTxfVHA+Ojp2YWxhcnJheShjb25zdCBnc2xpY2VfYXJyYXk8X1RwPiYgX19nYSkKKyAgICA6IF9NX3NpemUoX19nYS5fTV9pbmRleC5zaXplKCkpLAorICAgICAgX01fZGF0YShfX3ZhbGFycmF5X2dldF9zdG9yYWdlPF9UcD4oX01fc2l6ZSkpCisgICAgeworICAgICAgc3RkOjpfX3ZhbGFycmF5X2NvcHlfY29uc3RydWN0CisJKF9fZ2EuX01fYXJyYXksIF9BcnJheTxzaXplX3Q+KF9fZ2EuX01faW5kZXgpLAorCSBfQXJyYXk8X1RwPihfTV9kYXRhKSwgX01fc2l6ZSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICB2YWxhcnJheTxfVHA+Ojp2YWxhcnJheShjb25zdCBtYXNrX2FycmF5PF9UcD4mIF9fbWEpCisgICAgOiBfTV9zaXplKF9fbWEuX01fc3opLCBfTV9kYXRhKF9fdmFsYXJyYXlfZ2V0X3N0b3JhZ2U8X1RwPihfX21hLl9NX3N6KSkKKyAgICB7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QKKwkoX19tYS5fTV9hcnJheSwgX19tYS5fTV9tYXNrLCBfQXJyYXk8X1RwPihfTV9kYXRhKSwgX01fc2l6ZSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICB2YWxhcnJheTxfVHA+Ojp2YWxhcnJheShjb25zdCBpbmRpcmVjdF9hcnJheTxfVHA+JiBfX2lhKQorICAgIDogX01fc2l6ZShfX2lhLl9NX3N6KSwgX01fZGF0YShfX3ZhbGFycmF5X2dldF9zdG9yYWdlPF9UcD4oX19pYS5fTV9zeikpCisgICAgeworICAgICAgc3RkOjpfX3ZhbGFycmF5X2NvcHlfY29uc3RydWN0CisJKF9faWEuX01fYXJyYXksIF9faWEuX01faW5kZXgsIF9BcnJheTxfVHA+KF9NX2RhdGEpLCBfTV9zaXplKTsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICB2YWxhcnJheTxfVHA+Ojp2YWxhcnJheShpbml0aWFsaXplcl9saXN0PF9UcD4gX19sKQorICAgIDogX01fc2l6ZShfX2wuc2l6ZSgpKSwgX01fZGF0YShfX3ZhbGFycmF5X2dldF9zdG9yYWdlPF9UcD4oX19sLnNpemUoKSkpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX19sLmJlZ2luKCksIF9fbC5lbmQoKSwgX01fZGF0YSk7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICBpbmxpbmUKKyAgICB2YWxhcnJheTxfVHA+Ojp2YWxhcnJheShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JiBfX2UpCisgICAgOiBfTV9zaXplKF9fZS5zaXplKCkpLCBfTV9kYXRhKF9fdmFsYXJyYXlfZ2V0X3N0b3JhZ2U8X1RwPihfTV9zaXplKSkKKyAgICB7IHN0ZDo6X192YWxhcnJheV9jb3B5X2NvbnN0cnVjdChfX2UsIF9NX3NpemUsIF9BcnJheTxfVHA+KF9NX2RhdGEpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICB2YWxhcnJheTxfVHA+Ojp+dmFsYXJyYXkoKSBfR0xJQkNYWF9OT0VYQ0VQVAorICAgIHsKKyAgICAgIHN0ZDo6X192YWxhcnJheV9kZXN0cm95X2VsZW1lbnRzKF9NX2RhdGEsIF9NX2RhdGEgKyBfTV9zaXplKTsKKyAgICAgIHN0ZDo6X192YWxhcnJheV9yZWxlYXNlX21lbW9yeShfTV9kYXRhKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2YWxhcnJheTxfVHA+JgorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNjMwLiBhcnJheXMgb2YgdmFsYXJyYXkuCisgICAgICBpZiAoX01fc2l6ZSA9PSBfX3YuX01fc2l6ZSkKKwlzdGQ6Ol9fdmFsYXJyYXlfY29weShfX3YuX01fZGF0YSwgX01fc2l6ZSwgX01fZGF0YSk7CisgICAgICBlbHNlCisJeworCSAgaWYgKF9NX2RhdGEpCisJICAgIHsKKwkgICAgICBzdGQ6Ol9fdmFsYXJyYXlfZGVzdHJveV9lbGVtZW50cyhfTV9kYXRhLCBfTV9kYXRhICsgX01fc2l6ZSk7CisJICAgICAgc3RkOjpfX3ZhbGFycmF5X3JlbGVhc2VfbWVtb3J5KF9NX2RhdGEpOworCSAgICB9CisJICBfTV9zaXplID0gX192Ll9NX3NpemU7CisJICBfTV9kYXRhID0gX192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9NX3NpemUpOworCSAgc3RkOjpfX3ZhbGFycmF5X2NvcHlfY29uc3RydWN0KF9fdi5fTV9kYXRhLCBfX3YuX01fZGF0YSArIF9NX3NpemUsCisJCQkJCSBfTV9kYXRhKTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4mCisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3I9KHZhbGFycmF5PF9UcD4mJiBfX3YpIG5vZXhjZXB0CisgICAgeworICAgICAgaWYgKF9NX2RhdGEpCisJeworCSAgc3RkOjpfX3ZhbGFycmF5X2Rlc3Ryb3lfZWxlbWVudHMoX01fZGF0YSwgX01fZGF0YSArIF9NX3NpemUpOworCSAgc3RkOjpfX3ZhbGFycmF5X3JlbGVhc2VfbWVtb3J5KF9NX2RhdGEpOworCX0KKyAgICAgIF9NX3NpemUgPSBfX3YuX01fc2l6ZTsKKyAgICAgIF9NX2RhdGEgPSBfX3YuX01fZGF0YTsKKyAgICAgIF9fdi5fTV9zaXplID0gMDsKKyAgICAgIF9fdi5fTV9kYXRhID0gMDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2YWxhcnJheTxfVHA+JgorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PF9UcD4gX19sKQorICAgIHsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDYzMC4gYXJyYXlzIG9mIHZhbGFycmF5LgorICAgICAgaWYgKF9NX3NpemUgPT0gX19sLnNpemUoKSkKKwlzdGQ6Ol9fdmFsYXJyYXlfY29weShfX2wuYmVnaW4oKSwgX19sLnNpemUoKSwgX01fZGF0YSk7CisgICAgICBlbHNlCisJeworCSAgaWYgKF9NX2RhdGEpCisJICAgIHsKKwkgICAgICBzdGQ6Ol9fdmFsYXJyYXlfZGVzdHJveV9lbGVtZW50cyhfTV9kYXRhLCBfTV9kYXRhICsgX01fc2l6ZSk7CisJICAgICAgc3RkOjpfX3ZhbGFycmF5X3JlbGVhc2VfbWVtb3J5KF9NX2RhdGEpOworCSAgICB9CisJICBfTV9zaXplID0gX19sLnNpemUoKTsKKwkgIF9NX2RhdGEgPSBfX3ZhbGFycmF5X2dldF9zdG9yYWdlPF9UcD4oX01fc2l6ZSk7CisJICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX19sLmJlZ2luKCksIF9fbC5iZWdpbigpICsgX01fc2l6ZSwKKwkJCQkJIF9NX2RhdGEpOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4mCisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IF9UcCYgX190KQorICAgIHsKKyAgICAgIHN0ZDo6X192YWxhcnJheV9maWxsKF9NX2RhdGEsIF9NX3NpemUsIF9fdCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPiYKKyAgICB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3Qgc2xpY2VfYXJyYXk8X1RwPiYgX19zYSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fc2l6ZSA9PSBfX3NhLl9NX3N6KTsKKyAgICAgIHN0ZDo6X192YWxhcnJheV9jb3B5KF9fc2EuX01fYXJyYXksIF9fc2EuX01fc3osCisJCQkgICBfX3NhLl9NX3N0cmlkZSwgX0FycmF5PF9UcD4oX01fZGF0YSkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4mCisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IGdzbGljZV9hcnJheTxfVHA+JiBfX2dhKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9zaXplID09IF9fZ2EuX01faW5kZXguc2l6ZSgpKTsKKyAgICAgIHN0ZDo6X192YWxhcnJheV9jb3B5KF9fZ2EuX01fYXJyYXksIF9BcnJheTxzaXplX3Q+KF9fZ2EuX01faW5kZXgpLAorCQkJICAgX0FycmF5PF9UcD4oX01fZGF0YSksIF9NX3NpemUpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4mCisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IG1hc2tfYXJyYXk8X1RwPiYgX19tYSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fc2l6ZSA9PSBfX21hLl9NX3N6KTsKKyAgICAgIHN0ZDo6X192YWxhcnJheV9jb3B5KF9fbWEuX01fYXJyYXksIF9fbWEuX01fbWFzaywKKwkJCSAgIF9BcnJheTxfVHA+KF9NX2RhdGEpLCBfTV9zaXplKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2YWxhcnJheTxfVHA+JgorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBpbmRpcmVjdF9hcnJheTxfVHA+JiBfX2lhKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9zaXplID09IF9faWEuX01fc3opOworICAgICAgc3RkOjpfX3ZhbGFycmF5X2NvcHkoX19pYS5fTV9hcnJheSwgX19pYS5fTV9pbmRleCwKKwkJCSAgIF9BcnJheTxfVHA+KF9NX2RhdGEpLCBfTV9zaXplKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgIGlubGluZSB2YWxhcnJheTxfVHA+JgorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JiBfX2UpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNjMwLiBhcnJheXMgb2YgdmFsYXJyYXkuCisgICAgICBpZiAoX01fc2l6ZSA9PSBfX2Uuc2l6ZSgpKQorCXN0ZDo6X192YWxhcnJheV9jb3B5KF9fZSwgX01fc2l6ZSwgX0FycmF5PF9UcD4oX01fZGF0YSkpOworICAgICAgZWxzZQorCXsKKwkgIGlmIChfTV9kYXRhKQorCSAgICB7CisJICAgICAgc3RkOjpfX3ZhbGFycmF5X2Rlc3Ryb3lfZWxlbWVudHMoX01fZGF0YSwgX01fZGF0YSArIF9NX3NpemUpOworCSAgICAgIHN0ZDo6X192YWxhcnJheV9yZWxlYXNlX21lbW9yeShfTV9kYXRhKTsKKwkgICAgfQorCSAgX01fc2l6ZSA9IF9fZS5zaXplKCk7CisJICBfTV9kYXRhID0gX192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9NX3NpemUpOworCSAgc3RkOjpfX3ZhbGFycmF5X2NvcHlfY29uc3RydWN0KF9fZSwgX01fc2l6ZSwgX0FycmF5PF9UcD4oX01fZGF0YSkpOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfRXhwcjxfU0Nsb3M8X1ZhbEFycmF5LF9UcD4sIF9UcD4KKyAgICB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKHNsaWNlIF9fcykgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIF9TQ2xvczxfVmFsQXJyYXksX1RwPiBfQ2xvc3VyZTsKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1RwPihfQ2xvc3VyZSAoX0FycmF5PF9UcD4oX01fZGF0YSksIF9fcykpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHNsaWNlX2FycmF5PF9UcD4KKyAgICB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKHNsaWNlIF9fcykKKyAgICB7IHJldHVybiBzbGljZV9hcnJheTxfVHA+KF9BcnJheTxfVHA+KF9NX2RhdGEpLCBfX3MpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfRXhwcjxfR0Nsb3M8X1ZhbEFycmF5LF9UcD4sIF9UcD4KKyAgICB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKGNvbnN0IGdzbGljZSYgX19ncykgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIF9HQ2xvczxfVmFsQXJyYXksX1RwPiBfQ2xvc3VyZTsKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1RwPgorCShfQ2xvc3VyZShfQXJyYXk8X1RwPihfTV9kYXRhKSwgX19ncy5fTV9pbmRleC0+X01faW5kZXgpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBnc2xpY2VfYXJyYXk8X1RwPgorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oY29uc3QgZ3NsaWNlJiBfX2dzKQorICAgIHsKKyAgICAgIHJldHVybiBnc2xpY2VfYXJyYXk8X1RwPgorCShfQXJyYXk8X1RwPihfTV9kYXRhKSwgX19ncy5fTV9pbmRleC0+X01faW5kZXgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4KKyAgICB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKGNvbnN0IHZhbGFycmF5PGJvb2w+JiBfX20pIGNvbnN0CisgICAgeworICAgICAgc2l6ZV90IF9fcyA9IDA7CisgICAgICBzaXplX3QgX19lID0gX19tLnNpemUoKTsKKyAgICAgIGZvciAoc2l6ZV90IF9faT0wOyBfX2k8X19lOyArK19faSkKKwlpZiAoX19tW19faV0pICsrX19zOworICAgICAgcmV0dXJuIHZhbGFycmF5PF9UcD4obWFza19hcnJheTxfVHA+KF9BcnJheTxfVHA+KF9NX2RhdGEpLCBfX3MsCisJCQkJCSAgIF9BcnJheTxib29sPiAoX19tKSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIG1hc2tfYXJyYXk8X1RwPgorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oY29uc3QgdmFsYXJyYXk8Ym9vbD4mIF9fbSkKKyAgICB7CisgICAgICBzaXplX3QgX19zID0gMDsKKyAgICAgIHNpemVfdCBfX2UgPSBfX20uc2l6ZSgpOworICAgICAgZm9yIChzaXplX3QgX19pPTA7IF9faTxfX2U7ICsrX19pKQorCWlmIChfX21bX19pXSkgKytfX3M7CisgICAgICByZXR1cm4gbWFza19hcnJheTxfVHA+KF9BcnJheTxfVHA+KF9NX2RhdGEpLCBfX3MsIF9BcnJheTxib29sPihfX20pKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfRXhwcjxfSUNsb3M8X1ZhbEFycmF5LF9UcD4sIF9UcD4KKyAgICB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9faSkgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIF9JQ2xvczxfVmFsQXJyYXksX1RwPiBfQ2xvc3VyZTsKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1RwPihfQ2xvc3VyZSgqdGhpcywgX19pKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgaW5kaXJlY3RfYXJyYXk8X1RwPgorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX19pKQorICAgIHsKKyAgICAgIHJldHVybiBpbmRpcmVjdF9hcnJheTxfVHA+KF9BcnJheTxfVHA+KF9NX2RhdGEpLCBfX2kuc2l6ZSgpLAorCQkJCSBfQXJyYXk8c2l6ZV90PihfX2kpKTsKKyAgICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPGNsYXNzIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHZhbGFycmF5PF9UcD46OnN3YXAodmFsYXJyYXk8X1RwPiYgX192KSBub2V4Y2VwdAorICAgIHsKKyAgICAgIHN0ZDo6c3dhcChfTV9zaXplLCBfX3YuX01fc2l6ZSk7CisgICAgICBzdGQ6OnN3YXAoX01fZGF0YSwgX192Ll9NX2RhdGEpOworICAgIH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPGNsYXNzIF9UcD4KKyAgICBpbmxpbmUgc2l6ZV90IAorICAgIHZhbGFycmF5PF9UcD46OnNpemUoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3NpemU7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIHZhbGFycmF5PF9UcD46OnN1bSgpIGNvbnN0CisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX3NpemUgPiAwKTsKKyAgICAgIHJldHVybiBzdGQ6Ol9fdmFsYXJyYXlfc3VtKF9NX2RhdGEsIF9NX2RhdGEgKyBfTV9zaXplKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPgorICAgICB2YWxhcnJheTxfVHA+OjpzaGlmdChpbnQgX19uKSBjb25zdAorICAgICB7CisgICAgICAgdmFsYXJyYXk8X1RwPiBfX3JldDsKKworICAgICAgIGlmIChfTV9zaXplID09IDApCisJIHJldHVybiBfX3JldDsKKworICAgICAgIF9UcCogX19yZXN0cmljdF9fIF9fdG1wX01fZGF0YSA9CisJIHN0ZDo6X192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9NX3NpemUpOworCisgICAgICAgaWYgKF9fbiA9PSAwKQorCSBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX01fZGF0YSwKKwkJCQkJX01fZGF0YSArIF9NX3NpemUsIF9fdG1wX01fZGF0YSk7CisgICAgICAgZWxzZSBpZiAoX19uID4gMCkgICAgICAvLyBzaGlmdCBsZWZ0CisJIHsKKwkgICBpZiAoc2l6ZV90KF9fbikgPiBfTV9zaXplKQorCSAgICAgX19uID0gaW50KF9NX3NpemUpOworCisJICAgc3RkOjpfX3ZhbGFycmF5X2NvcHlfY29uc3RydWN0KF9NX2RhdGEgKyBfX24sCisJCQkJCSAgX01fZGF0YSArIF9NX3NpemUsIF9fdG1wX01fZGF0YSk7CisJICAgc3RkOjpfX3ZhbGFycmF5X2RlZmF1bHRfY29uc3RydWN0KF9fdG1wX01fZGF0YSArIF9NX3NpemUgLSBfX24sCisJCQkJCSAgICAgX190bXBfTV9kYXRhICsgX01fc2l6ZSk7CisJIH0KKyAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgIC8vIHNoaWZ0IHJpZ2h0CisJIHsKKwkgICBpZiAoLXNpemVfdChfX24pID4gX01fc2l6ZSkKKwkgICAgIF9fbiA9IC1pbnQoX01fc2l6ZSk7CisKKwkgICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX01fZGF0YSwgX01fZGF0YSArIF9NX3NpemUgKyBfX24sCisJCQkJCSAgX190bXBfTV9kYXRhIC0gX19uKTsKKwkgICBzdGQ6Ol9fdmFsYXJyYXlfZGVmYXVsdF9jb25zdHJ1Y3QoX190bXBfTV9kYXRhLAorCQkJCQkgICAgIF9fdG1wX01fZGF0YSAtIF9fbik7CisJIH0KKworICAgICAgIF9fcmV0Ll9NX3NpemUgPSBfTV9zaXplOworICAgICAgIF9fcmV0Ll9NX2RhdGEgPSBfX3RtcF9NX2RhdGE7CisgICAgICAgcmV0dXJuIF9fcmV0OworICAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPgorICAgICB2YWxhcnJheTxfVHA+Ojpjc2hpZnQoaW50IF9fbikgY29uc3QKKyAgICAgeworICAgICAgIHZhbGFycmF5PF9UcD4gX19yZXQ7CisKKyAgICAgICBpZiAoX01fc2l6ZSA9PSAwKQorCSByZXR1cm4gX19yZXQ7CisKKyAgICAgICBfVHAqIF9fcmVzdHJpY3RfXyBfX3RtcF9NX2RhdGEgPQorCSBzdGQ6Ol9fdmFsYXJyYXlfZ2V0X3N0b3JhZ2U8X1RwPihfTV9zaXplKTsKKworICAgICAgIGlmIChfX24gPT0gMCkKKwkgc3RkOjpfX3ZhbGFycmF5X2NvcHlfY29uc3RydWN0KF9NX2RhdGEsCisJCQkJCV9NX2RhdGEgKyBfTV9zaXplLCBfX3RtcF9NX2RhdGEpOworICAgICAgIGVsc2UgaWYgKF9fbiA+IDApICAgICAgLy8gY3NoaWZ0IGxlZnQKKwkgeworCSAgIGlmIChzaXplX3QoX19uKSA+IF9NX3NpemUpCisJICAgICBfX24gPSBpbnQoX19uICUgX01fc2l6ZSk7CisKKwkgICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX01fZGF0YSwgX01fZGF0YSArIF9fbiwKKwkJCQkJICBfX3RtcF9NX2RhdGEgKyBfTV9zaXplIC0gX19uKTsKKwkgICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX01fZGF0YSArIF9fbiwgX01fZGF0YSArIF9NX3NpemUsCisJCQkJCSAgX190bXBfTV9kYXRhKTsKKwkgfQorICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgLy8gY3NoaWZ0IHJpZ2h0CisJIHsKKwkgICBpZiAoLXNpemVfdChfX24pID4gX01fc2l6ZSkKKwkgICAgIF9fbiA9IC1pbnQoLXNpemVfdChfX24pICUgX01fc2l6ZSk7CisKKwkgICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX01fZGF0YSArIF9NX3NpemUgKyBfX24sCisJCQkJCSAgX01fZGF0YSArIF9NX3NpemUsIF9fdG1wX01fZGF0YSk7CisJICAgc3RkOjpfX3ZhbGFycmF5X2NvcHlfY29uc3RydWN0KF9NX2RhdGEsIF9NX2RhdGEgKyBfTV9zaXplICsgX19uLAorCQkJCQkgIF9fdG1wX01fZGF0YSAtIF9fbik7CisJIH0KKworICAgICAgIF9fcmV0Ll9NX3NpemUgPSBfTV9zaXplOworICAgICAgIF9fcmV0Ll9NX2RhdGEgPSBfX3RtcF9NX2RhdGE7CisgICAgICAgcmV0dXJuIF9fcmV0OworICAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgdmFsYXJyYXk8X1RwPjo6cmVzaXplKHNpemVfdCBfX24sIF9UcCBfX2MpCisgICAgeworICAgICAgLy8gVGhpcyBjb21wbGljYXRpb24gaXMgc28gdG8gbWFrZSB2YWxhcnJheTx2YWxhcnJheTxUPiA+IHdvcmsKKyAgICAgIC8vIGV2ZW4gdGhvdWdoIGl0IGlzIG5vdCByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQuICBOb2JvZHkgc2hvdWxkCisgICAgICAvLyBiZSBzYXlpbmcgdmFsYXJyYXk8dmFsYXJyYXk8VD4gPiBhbnl3YXkuICBTZWUgdGhlIHNwZWNzLgorICAgICAgc3RkOjpfX3ZhbGFycmF5X2Rlc3Ryb3lfZWxlbWVudHMoX01fZGF0YSwgX01fZGF0YSArIF9NX3NpemUpOworICAgICAgaWYgKF9NX3NpemUgIT0gX19uKQorCXsKKwkgIHN0ZDo6X192YWxhcnJheV9yZWxlYXNlX21lbW9yeShfTV9kYXRhKTsKKwkgIF9NX3NpemUgPSBfX247CisJICBfTV9kYXRhID0gX192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9fbik7CisJfQorICAgICAgc3RkOjpfX3ZhbGFycmF5X2ZpbGxfY29uc3RydWN0KF9NX2RhdGEsIF9NX2RhdGEgKyBfX24sIF9fYyk7CisgICAgfQorICAgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIHZhbGFycmF5PF9UcD46Om1pbigpIGNvbnN0CisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX3NpemUgPiAwKTsKKyAgICAgIHJldHVybiAqc3RkOjptaW5fZWxlbWVudChfTV9kYXRhLCBfTV9kYXRhICsgX01fc2l6ZSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgdmFsYXJyYXk8X1RwPjo6bWF4KCkgY29uc3QKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fc2l6ZSA+IDApOworICAgICAgcmV0dXJuICpzdGQ6Om1heF9lbGVtZW50KF9NX2RhdGEsIF9NX2RhdGEgKyBfTV9zaXplKTsKKyAgICB9CisgIAorICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgaW5saW5lIF9FeHByPF9WYWxGdW5DbG9zPF9WYWxBcnJheSwgX1RwPiwgX1RwPgorICAgIHZhbGFycmF5PF9UcD46OmFwcGx5KF9UcCBmdW5jKF9UcCkpIGNvbnN0CisgICAgeworICAgICAgdHlwZWRlZiBfVmFsRnVuQ2xvczxfVmFsQXJyYXksIF9UcD4gX0Nsb3N1cmU7CisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4oX0Nsb3N1cmUoKnRoaXMsIGZ1bmMpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgIGlubGluZSBfRXhwcjxfUmVmRnVuQ2xvczxfVmFsQXJyYXksIF9UcD4sIF9UcD4KKyAgICB2YWxhcnJheTxfVHA+OjphcHBseShfVHAgZnVuYyhjb25zdCBfVHAgJikpIGNvbnN0CisgICAgeworICAgICAgdHlwZWRlZiBfUmVmRnVuQ2xvczxfVmFsQXJyYXksIF9UcD4gX0Nsb3N1cmU7CisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4oX0Nsb3N1cmUoKnRoaXMsIGZ1bmMpKTsKKyAgICB9CisKKyNkZWZpbmUgX0RFRklORV9WQUxBUlJBWV9VTkFSWV9PUEVSQVRPUihfT3AsIF9OYW1lKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgkJCQkJCVwKKyAgICBpbmxpbmUgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6dGVtcGxhdGUgX1VuYXJ5T3A8X05hbWU+OjpfUnQgICAgICAJXAorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yIF9PcCgpIGNvbnN0CQkJCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIHR5cGVkZWYgX1VuQ2xvczxfTmFtZSwgX1ZhbEFycmF5LCBfVHA+IF9DbG9zdXJlOwkgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgX1RwPjo6cmVzdWx0X3R5cGUgX1J0OyAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfUnQ+KF9DbG9zdXJlKCp0aGlzKSk7CQkJXAorICAgIH0KKworICAgIF9ERUZJTkVfVkFMQVJSQVlfVU5BUllfT1BFUkFUT1IoKywgX191bmFyeV9wbHVzKQorICAgIF9ERUZJTkVfVkFMQVJSQVlfVU5BUllfT1BFUkFUT1IoLSwgX19uZWdhdGUpCisgICAgX0RFRklORV9WQUxBUlJBWV9VTkFSWV9PUEVSQVRPUih+LCBfX2JpdHdpc2Vfbm90KQorICAgIF9ERUZJTkVfVkFMQVJSQVlfVU5BUllfT1BFUkFUT1IgKCEsIF9fbG9naWNhbF9ub3QpCisKKyN1bmRlZiBfREVGSU5FX1ZBTEFSUkFZX1VOQVJZX09QRVJBVE9SCisKKyNkZWZpbmUgX0RFRklORV9WQUxBUlJBWV9BVUdNRU5URURfQVNTSUdOTUVOVChfT3AsIF9OYW1lKSAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgkJCQkJCQlcCisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4mCQkJCQkJXAorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yIF9PcCMjPShjb25zdCBfVHAgJl9fdCkJCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPihfTV9kYXRhKSwgX01fc2l6ZSwgX190KTsJXAorICAgICAgcmV0dXJuICp0aGlzOwkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgkJCQkJCQlcCisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4mCQkJCQkJXAorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yIF9PcCMjPShjb25zdCB2YWxhcnJheTxfVHA+ICZfX3YpCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9zaXplID09IF9fdi5fTV9zaXplKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPihfTV9kYXRhKSwgX01fc2l6ZSwgCQlcCisJCQkgICAgICAgX0FycmF5PF9UcD4oX192Ll9NX2RhdGEpKTsJCVwKKyAgICAgIHJldHVybiAqdGhpczsJCQkJCQkJXAorICAgIH0KKworX0RFRklORV9WQUxBUlJBWV9BVUdNRU5URURfQVNTSUdOTUVOVCgrLCBfX3BsdXMpCitfREVGSU5FX1ZBTEFSUkFZX0FVR01FTlRFRF9BU1NJR05NRU5UKC0sIF9fbWludXMpCitfREVGSU5FX1ZBTEFSUkFZX0FVR01FTlRFRF9BU1NJR05NRU5UKCosIF9fbXVsdGlwbGllcykKK19ERUZJTkVfVkFMQVJSQVlfQVVHTUVOVEVEX0FTU0lHTk1FTlQoLywgX19kaXZpZGVzKQorX0RFRklORV9WQUxBUlJBWV9BVUdNRU5URURfQVNTSUdOTUVOVCglLCBfX21vZHVsdXMpCitfREVGSU5FX1ZBTEFSUkFZX0FVR01FTlRFRF9BU1NJR05NRU5UKF4sIF9fYml0d2lzZV94b3IpCitfREVGSU5FX1ZBTEFSUkFZX0FVR01FTlRFRF9BU1NJR05NRU5UKCYsIF9fYml0d2lzZV9hbmQpCitfREVGSU5FX1ZBTEFSUkFZX0FVR01FTlRFRF9BU1NJR05NRU5UKHwsIF9fYml0d2lzZV9vcikKK19ERUZJTkVfVkFMQVJSQVlfQVVHTUVOVEVEX0FTU0lHTk1FTlQoPDwsIF9fc2hpZnRfbGVmdCkKK19ERUZJTkVfVkFMQVJSQVlfQVVHTUVOVEVEX0FTU0lHTk1FTlQoPj4sIF9fc2hpZnRfcmlnaHQpCisKKyN1bmRlZiBfREVGSU5FX1ZBTEFSUkFZX0FVR01FTlRFRF9BU1NJR05NRU5UCisKKyNkZWZpbmUgX0RFRklORV9WQUxBUlJBWV9FWFBSX0FVR01FTlRFRF9BU1NJR05NRU5UKF9PcCwgX05hbWUpICAgICAgICAgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPiB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgkJCQlcCisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4mCQkJCQkJXAorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yIF9PcCMjPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JiBfX2UpCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPihfTV9kYXRhKSwgX19lLCBfTV9zaXplKTsJXAorICAgICAgcmV0dXJuICp0aGlzOwkJCQkJCQlcCisgICAgfQorCitfREVGSU5FX1ZBTEFSUkFZX0VYUFJfQVVHTUVOVEVEX0FTU0lHTk1FTlQoKywgX19wbHVzKQorX0RFRklORV9WQUxBUlJBWV9FWFBSX0FVR01FTlRFRF9BU1NJR05NRU5UKC0sIF9fbWludXMpCitfREVGSU5FX1ZBTEFSUkFZX0VYUFJfQVVHTUVOVEVEX0FTU0lHTk1FTlQoKiwgX19tdWx0aXBsaWVzKQorX0RFRklORV9WQUxBUlJBWV9FWFBSX0FVR01FTlRFRF9BU1NJR05NRU5UKC8sIF9fZGl2aWRlcykKK19ERUZJTkVfVkFMQVJSQVlfRVhQUl9BVUdNRU5URURfQVNTSUdOTUVOVCglLCBfX21vZHVsdXMpCitfREVGSU5FX1ZBTEFSUkFZX0VYUFJfQVVHTUVOVEVEX0FTU0lHTk1FTlQoXiwgX19iaXR3aXNlX3hvcikKK19ERUZJTkVfVkFMQVJSQVlfRVhQUl9BVUdNRU5URURfQVNTSUdOTUVOVCgmLCBfX2JpdHdpc2VfYW5kKQorX0RFRklORV9WQUxBUlJBWV9FWFBSX0FVR01FTlRFRF9BU1NJR05NRU5UKHwsIF9fYml0d2lzZV9vcikKK19ERUZJTkVfVkFMQVJSQVlfRVhQUl9BVUdNRU5URURfQVNTSUdOTUVOVCg8PCwgX19zaGlmdF9sZWZ0KQorX0RFRklORV9WQUxBUlJBWV9FWFBSX0FVR01FTlRFRF9BU1NJR05NRU5UKD4+LCBfX3NoaWZ0X3JpZ2h0KQorCisjdW5kZWYgX0RFRklORV9WQUxBUlJBWV9FWFBSX0FVR01FTlRFRF9BU1NJR05NRU5UCisgICAgCisKKyNkZWZpbmUgX0RFRklORV9CSU5BUllfT1BFUkFUT1IoX09wLCBfTmFtZSkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CQkJCQkJXAorICAgIGlubGluZSBfRXhwcjxfQmluQ2xvczxfTmFtZSwgX1ZhbEFycmF5LCBfVmFsQXJyYXksIF9UcCwgX1RwPiwgICAgICAgXAorICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgX1RwPjo6cmVzdWx0X3R5cGU+ICAgICAgICAgICAgICAgXAorICAgIG9wZXJhdG9yIF9PcChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdykJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX192LnNpemUoKSA9PSBfX3cuc2l6ZSgpKTsgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIF9CaW5DbG9zPF9OYW1lLCBfVmFsQXJyYXksIF9WYWxBcnJheSwgX1RwLCBfVHA+IF9DbG9zdXJlOyBcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZnVuPF9OYW1lLCBfVHA+OjpyZXN1bHRfdHlwZSBfUnQ7ICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9SdD4oX0Nsb3N1cmUoX192LCBfX3cpKTsgICAgICAgICAgICAgICAgICBcCisgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgkJCQkJCVwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X05hbWUsIF9WYWxBcnJheSxfQ29uc3RhbnQsIF9UcCwgX1RwPiwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19mdW48X05hbWUsIF9UcD46OnJlc3VsdF90eXBlPiAgICAgICAgICAgICAgIFwKKyAgICBvcGVyYXRvciBfT3AoY29uc3QgdmFsYXJyYXk8X1RwPiYgX192LCBjb25zdCBfVHAmIF9fdCkJCVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfTmFtZSwgX1ZhbEFycmF5LCBfQ29uc3RhbnQsIF9UcCwgX1RwPiBfQ2xvc3VyZTsJXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgX1RwPjo6cmVzdWx0X3R5cGUgX1J0OyAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfUnQ+KF9DbG9zdXJlKF9fdiwgX190KSk7CSAgICAgICAgICAgICAgICBcCisgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgkJCQkJCVwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X05hbWUsIF9Db25zdGFudCwgX1ZhbEFycmF5LCBfVHAsIF9UcD4sICAgICAgIFwKKyAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19mdW48X05hbWUsIF9UcD46OnJlc3VsdF90eXBlPiAgICAgICAgICAgICAgIFwKKyAgICBvcGVyYXRvciBfT3AoY29uc3QgX1RwJiBfX3QsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdikJCVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfTmFtZSwgX0NvbnN0YW50LCBfVmFsQXJyYXksIF9UcCwgX1RwPiBfQ2xvc3VyZTsgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgX1RwPjo6cmVzdWx0X3R5cGUgX1J0OyAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfUnQ+KF9DbG9zdXJlKF9fdCwgX192KSk7ICAgICAgICAJICAgICAgICBcCisgICAgfQorCitfREVGSU5FX0JJTkFSWV9PUEVSQVRPUigrLCBfX3BsdXMpCitfREVGSU5FX0JJTkFSWV9PUEVSQVRPUigtLCBfX21pbnVzKQorX0RFRklORV9CSU5BUllfT1BFUkFUT1IoKiwgX19tdWx0aXBsaWVzKQorX0RFRklORV9CSU5BUllfT1BFUkFUT1IoLywgX19kaXZpZGVzKQorX0RFRklORV9CSU5BUllfT1BFUkFUT1IoJSwgX19tb2R1bHVzKQorX0RFRklORV9CSU5BUllfT1BFUkFUT1IoXiwgX19iaXR3aXNlX3hvcikKK19ERUZJTkVfQklOQVJZX09QRVJBVE9SKCYsIF9fYml0d2lzZV9hbmQpCitfREVGSU5FX0JJTkFSWV9PUEVSQVRPUih8LCBfX2JpdHdpc2Vfb3IpCitfREVGSU5FX0JJTkFSWV9PUEVSQVRPUig8PCwgX19zaGlmdF9sZWZ0KQorX0RFRklORV9CSU5BUllfT1BFUkFUT1IoPj4sIF9fc2hpZnRfcmlnaHQpCitfREVGSU5FX0JJTkFSWV9PUEVSQVRPUigmJiwgX19sb2dpY2FsX2FuZCkKK19ERUZJTkVfQklOQVJZX09QRVJBVE9SKHx8LCBfX2xvZ2ljYWxfb3IpCitfREVGSU5FX0JJTkFSWV9PUEVSQVRPUig9PSwgX19lcXVhbF90bykKK19ERUZJTkVfQklOQVJZX09QRVJBVE9SKCE9LCBfX25vdF9lcXVhbF90bykKK19ERUZJTkVfQklOQVJZX09QRVJBVE9SKDwsIF9fbGVzcykKK19ERUZJTkVfQklOQVJZX09QRVJBVE9SKD4sIF9fZ3JlYXRlcikKK19ERUZJTkVfQklOQVJZX09QRVJBVE9SKDw9LCBfX2xlc3NfZXF1YWwpCitfREVGSU5FX0JJTkFSWV9PUEVSQVRPUig+PSwgX19ncmVhdGVyX2VxdWFsKQorCisjdW5kZWYgX0RFRklORV9CSU5BUllfT1BFUkFUT1IKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBhbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudCBvZgorICAgKiAgICAgICAgICB0aGUgdmFsYXJyYXkuCisgICAqICBAcGFyYW0gIF9fdmEgIHZhbGFycmF5LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgIGlubGluZSBfVHAqCisgICAgYmVnaW4odmFsYXJyYXk8X1RwPiYgX192YSkKKyAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9fdmFbMF0pOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBhbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudCBvZgorICAgKiAgICAgICAgICB0aGUgY29uc3QgdmFsYXJyYXkuCisgICAqICBAcGFyYW0gIF9fdmEgIHZhbGFycmF5LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgIGlubGluZSBjb25zdCBfVHAqCisgICAgYmVnaW4oY29uc3QgdmFsYXJyYXk8X1RwPiYgX192YSkKKyAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9fdmFbMF0pOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBhbiBpdGVyYXRvciBwb2ludGluZyB0byBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50IG9mCisgICAqICAgICAgICAgIHRoZSB2YWxhcnJheS4KKyAgICogIEBwYXJhbSAgX192YSAgdmFsYXJyYXkuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgaW5saW5lIF9UcCoKKyAgICBlbmQodmFsYXJyYXk8X1RwPiYgX192YSkKKyAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9fdmFbMF0pICsgX192YS5zaXplKCk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIG9uZSBwYXN0IHRoZSBsYXN0IGVsZW1lbnQgb2YKKyAgICogICAgICAgICAgdGhlIGNvbnN0IHZhbGFycmF5LgorICAgKiAgQHBhcmFtICBfX3ZhICB2YWxhcnJheS4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9UcD4KKyAgICBpbmxpbmUgY29uc3QgX1RwKgorICAgIGVuZChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3ZhKQorICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX192YVswXSkgKyBfX3ZhLnNpemUoKTsgfQorI2VuZGlmIC8vIEMrKzExCisKKyAgLy8gQH0gZ3JvdXAgbnVtZXJpY19hcnJheXMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0dMSUJDWFhfVkFMQVJSQVkgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdmVjdG9yIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC92ZWN0b3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxYzVlNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgvdmVjdG9yCkBAIC0wLDAgKzEsODEgQEAKKy8vIDx2ZWN0b3I+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NgorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGluY2x1ZGUvdmVjdG9yCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1ZFQ1RPUgorI2RlZmluZSBfR0xJQkNYWF9WRUNUT1IgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPgorI2luY2x1ZGUgPGJpdHMvYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfY29uc3RydWN0Lmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfdW5pbml0aWFsaXplZC5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX3ZlY3Rvci5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2J2ZWN0b3IuaD4gCisjaW5jbHVkZSA8Yml0cy9yYW5nZV9hY2Nlc3MuaD4KKworI2lmbmRlZiBfR0xJQkNYWF9FWFBPUlRfVEVNUExBVEUKKyMgaW5jbHVkZSA8Yml0cy92ZWN0b3IudGNjPgorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworIyBpbmNsdWRlIDxkZWJ1Zy92ZWN0b3I+CisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1BST0ZJTEUKKyMgaW5jbHVkZSA8cHJvZmlsZS92ZWN0b3I+CisjZW5kaWYKKworI2VuZGlmIC8qIF9HTElCQ1hYX1ZFQ1RPUiAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2F0b21pY193b3JkLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2F0b21pY193b3JkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4MzdmNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvYXRvbWljX3dvcmQuaApAQCAtMCwwICsxLDQ3IEBACisvLyBMb3ctbGV2ZWwgdHlwZSBmb3IgYXRvbWljIG9wZXJhdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGF0b21pY193b3JkLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0FUT01JQ19XT1JEX0gKKyNkZWZpbmUgX0dMSUJDWFhfQVRPTUlDX1dPUkRfSAkxCisKK3R5cGVkZWYgaW50IF9BdG9taWNfd29yZDsKKworLy8gRGVmaW5lIHRoZXNlIHR3byBtYWNyb3MgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIG1lbW9yeSBiYXJyaWVyIGZvciB0aGUgdGFyZ2V0LgorLy8gVGhlIGNvbW1lbnRlZCBvdXQgdmVyc2lvbnMgYmVsb3cgYXJlIHRoZSBkZWZhdWx0cy4KKy8vIFNlZSBpYTY0L2F0b21pY193b3JkLmggZm9yIGFuIGFsdGVybmF0aXZlIGFwcHJvYWNoLgorCisvLyBUaGlzIG9uZSBwcmV2ZW50cyBsb2FkcyBmcm9tIGJlaW5nIGhvaXN0ZWQgYWNyb3NzIHRoZSBiYXJyaWVyOworLy8gaW4gb3RoZXIgd29yZHMsIHRoaXMgaXMgYSBMb2FkLUxvYWQgYWNxdWlyZSBiYXJyaWVyLgorLy8gVGhpcyBpcyBuZWNlc3NhcnkgaWZmIFRBUkdFVF9SRUxBWEVEX09SREVSSU5HIGlzIGRlZmluZWQgaW4gdG0uaC4gIAorLy8gI2RlZmluZSBfR0xJQkNYWF9SRUFEX01FTV9CQVJSSUVSIF9fYXNtIF9fdm9sYXRpbGUgKCIiOjo6Im1lbW9yeSIpCisKKy8vIFRoaXMgb25lIHByZXZlbnRzIHN0b3JlcyBmcm9tIGJlaW5nIHN1bmsgYWNyb3NzIHRoZSBiYXJyaWVyOyBpbiBvdGhlcgorLy8gd29yZHMsIGEgU3RvcmUtU3RvcmUgcmVsZWFzZSBiYXJyaWVyLgorLy8gI2RlZmluZSBfR0xJQkNYWF9XUklURV9NRU1fQkFSUklFUiBfX2FzbSBfX3ZvbGF0aWxlICgiIjo6OiJtZW1vcnkiKQorCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2Jhc2ljX2ZpbGUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvYmFzaWNfZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZThjOGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2Jhc2ljX2ZpbGUuaApAQCAtMCwwICsxLDExMCBAQAorLy8gV3JhcHBlciBvZiBDLWxhbmd1YWdlIEZJTEUgc3RydWN0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy44ICBGaWxlLWJhc2VkIHN0cmVhbXMKKy8vCisKKy8qKiBAZmlsZSBiaXRzL2Jhc2ljX2ZpbGUuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2lvc30KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0JBU0lDX0ZJTEVfU1RESU9fSAorI2RlZmluZSBfR0xJQkNYWF9CQVNJQ19GSUxFX1NURElPX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvYysraW8uaD4gIC8vIGZvciBfX2NfbG9jayBhbmQgX19jX2ZpbGUKKyNpbmNsdWRlIDxpb3M+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBHZW5lcmljIGRlY2xhcmF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY2xhc3MgX19iYXNpY19maWxlOyAKKworICAvLyBTcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIGNsYXNzIF9fYmFzaWNfZmlsZTxjaGFyPgorICAgIHsKKyAgICAgIC8vIFVuZGVybHlpbmcgZGF0YSBzb3VyY2Uvc2luay4KKyAgICAgIF9fY19maWxlKiAJX01fY2ZpbGU7CisKKyAgICAgIC8vIFRydWUgaWZmIHdlIG9wZW5lZCBfTV9jZmlsZSwgYW5kIHRodXMgbXVzdCBjbG9zZSBpdCBvdXJzZWx2ZXMuCisgICAgICBib29sIAkJX01fY2ZpbGVfY3JlYXRlZDsKKworICAgIHB1YmxpYzoKKyAgICAgIF9fYmFzaWNfZmlsZShfX2NfbG9jayogX19sb2NrID0gMCkgdGhyb3cgKCk7CisKKyAgICAgIF9fYmFzaWNfZmlsZSogCisgICAgICBvcGVuKGNvbnN0IGNoYXIqIF9fbmFtZSwgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSwgaW50IF9fcHJvdCA9IDA2NjQpOworCisgICAgICBfX2Jhc2ljX2ZpbGUqCisgICAgICBzeXNfb3BlbihfX2NfZmlsZSogX19maWxlLCBpb3NfYmFzZTo6b3Blbm1vZGUpOworCisgICAgICBfX2Jhc2ljX2ZpbGUqCisgICAgICBzeXNfb3BlbihpbnQgX19mZCwgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkgdGhyb3cgKCk7CisKKyAgICAgIF9fYmFzaWNfZmlsZSogCisgICAgICBjbG9zZSgpOyAKKworICAgICAgX0dMSUJDWFhfUFVSRSBib29sIAorICAgICAgaXNfb3BlbigpIGNvbnN0IHRocm93ICgpOworCisgICAgICBfR0xJQkNYWF9QVVJFIGludCAKKyAgICAgIGZkKCkgdGhyb3cgKCk7CisKKyAgICAgIF9HTElCQ1hYX1BVUkUgX19jX2ZpbGUqCisgICAgICBmaWxlKCkgdGhyb3cgKCk7CisKKyAgICAgIH5fX2Jhc2ljX2ZpbGUoKTsKKworICAgICAgc3RyZWFtc2l6ZSAKKyAgICAgIHhzcHV0bihjb25zdCBjaGFyKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKworICAgICAgc3RyZWFtc2l6ZSAKKyAgICAgIHhzcHV0bl8yKGNvbnN0IGNoYXIqIF9fczEsIHN0cmVhbXNpemUgX19uMSwKKwkgICAgICAgY29uc3QgY2hhciogX19zMiwgc3RyZWFtc2l6ZSBfX24yKTsKKworICAgICAgc3RyZWFtc2l6ZSAKKyAgICAgIHhzZ2V0bihjaGFyKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKworICAgICAgc3RyZWFtb2ZmCisgICAgICBzZWVrb2ZmKHN0cmVhbW9mZiBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX193YXkpIHRocm93ICgpOworCisgICAgICBpbnQgCisgICAgICBzeW5jKCk7CisKKyAgICAgIHN0cmVhbXNpemUKKyAgICAgIHNob3dtYW55YygpOworICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9jKythbGxvY2F0b3IuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvYysrYWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ3MGJjYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvYysrYWxsb2NhdG9yLmgKQEAgLTAsMCArMSw1NSBAQAorLy8gQmFzZSB0byBzdGQ6OmFsbG9jYXRvciAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9jKythbGxvY2F0b3IuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le21lbW9yeX0KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0NYWF9BTExPQ0FUT1JfSAorI2RlZmluZSBfR0xJQkNYWF9DWFhfQUxMT0NBVE9SX0ggMQorCisjaW5jbHVkZSA8ZXh0L25ld19hbGxvY2F0b3IuaD4KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKK25hbWVzcGFjZSBzdGQKK3sKKyAgLyoqCisgICAqICBAYnJpZWYgIEFuIGFsaWFzIHRvIHRoZSBiYXNlIGNsYXNzIGZvciBzdGQ6OmFsbG9jYXRvci4KKyAgICogIEBpbmdyb3VwIGFsbG9jYXRvcnMKKyAgICoKKyAgICogIFVzZWQgdG8gc2V0IHRoZSBzdGQ6OmFsbG9jYXRvciBiYXNlIGNsYXNzIHRvCisgICAqICBfX2dudV9jeHg6Om5ld19hbGxvY2F0b3IuCisgICAqCisgICAqICBAdHBhcmFtICBfVHAgIFR5cGUgb2YgYWxsb2NhdGVkIG9iamVjdC4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdXNpbmcgX19hbGxvY2F0b3JfYmFzZSA9IF9fZ251X2N4eDo6bmV3X2FsbG9jYXRvcjxfVHA+OworfQorI2Vsc2UKKy8vIERlZmluZSBuZXdfYWxsb2NhdG9yIGFzIHRoZSBiYXNlIGNsYXNzIHRvIHN0ZDo6YWxsb2NhdG9yLgorIyBkZWZpbmUgX19hbGxvY2F0b3JfYmFzZSAgX19nbnVfY3h4OjpuZXdfYWxsb2NhdG9yCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2MrK2NvbmZpZy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9jKytjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGQxMmFmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9jKytjb25maWcuaApAQCAtMCwwICsxLDE2NjYgQEAKKy8vIFByZWRlZmluZWQgc3ltYm9scyBhbmQgbWFjcm9zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2MrK2NvbmZpZy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aW9zZndkfQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQ1hYX0NPTkZJR19ICisjZGVmaW5lIF9HTElCQ1hYX0NYWF9DT05GSUdfSCAxCisKKy8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIEMrKyBsaWJyYXJ5IGluIGNvbXByZXNzZWQgSVNPIGRhdGUgZm9ybWF0LgorI2RlZmluZSBfX0dMSUJDWFhfXyAyMDE0MDUyMgorCisvLyBNYWNyb3MgZm9yIHZhcmlvdXMgYXR0cmlidXRlcy4KKy8vICAgX0dMSUJDWFhfUFVSRQorLy8gICBfR0xJQkNYWF9DT05TVAorLy8gICBfR0xJQkNYWF9OT1JFVFVSTgorLy8gICBfR0xJQkNYWF9OT1RIUk9XCisvLyAgIF9HTElCQ1hYX1ZJU0lCSUxJVFkKKyNpZm5kZWYgX0dMSUJDWFhfUFVSRQorIyBkZWZpbmUgX0dMSUJDWFhfUFVSRSBfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKQorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfQ09OU1QKKyMgZGVmaW5lIF9HTElCQ1hYX0NPTlNUIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKQorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfTk9SRVRVUk4KKyMgZGVmaW5lIF9HTElCQ1hYX05PUkVUVVJOIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKQorI2VuZGlmCisKKy8vIFNlZSBiZWxvdyBmb3IgQysrCisjaWZuZGVmIF9HTElCQ1hYX05PVEhST1cKKyMgaWZuZGVmIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgX0dMSUJDWFhfTk9USFJPVyBfX2F0dHJpYnV0ZV9fKChfX25vdGhyb3dfXykpCisjIGVuZGlmCisjZW5kaWYKKworLy8gTWFjcm9zIGZvciB2aXNpYmlsaXR5IGF0dHJpYnV0ZXMuCisvLyAgIF9HTElCQ1hYX0hBVkVfQVRUUklCVVRFX1ZJU0lCSUxJVFkKKy8vICAgX0dMSUJDWFhfVklTSUJJTElUWQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9BVFRSSUJVVEVfVklTSUJJTElUWSAxCisKKyNpZiBfR0xJQkNYWF9IQVZFX0FUVFJJQlVURV9WSVNJQklMSVRZCisjIGRlZmluZSBfR0xJQkNYWF9WSVNJQklMSVRZKFYpIF9fYXR0cmlidXRlX18gKChfX3Zpc2liaWxpdHlfXyAoI1YpKSkKKyNlbHNlCisvLyBJZiB0aGlzIGlzIG5vdCBzdXBwbGllZCBieSB0aGUgT1Mtc3BlY2lmaWMgb3IgQ1BVLXNwZWNpZmljCisvLyBoZWFkZXJzIGluY2x1ZGVkIGJlbG93LCBpdCB3aWxsIGJlIGRlZmluZWQgdG8gYW4gZW1wdHkgZGVmYXVsdC4KKyMgZGVmaW5lIF9HTElCQ1hYX1ZJU0lCSUxJVFkoVikgX0dMSUJDWFhfUFNFVURPX1ZJU0lCSUxJVFkoVikKKyNlbmRpZgorCisvLyBNYWNyb3MgZm9yIGRlcHJlY2F0ZWQgYXR0cmlidXRlcy4KKy8vICAgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQKKy8vICAgX0dMSUJDWFhfREVQUkVDQVRFRAorI2lmbmRlZiBfR0xJQkNYWF9VU0VfREVQUkVDQVRFRAorIyBkZWZpbmUgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fREVQUkVDQVRFRCkgJiYgKF9fY3BsdXNwbHVzID49IDIwMTEwM0wpCisjIGRlZmluZSBfR0xJQkNYWF9ERVBSRUNBVEVEIF9fYXR0cmlidXRlX18gKChfX2RlcHJlY2F0ZWRfXykpCisjZWxzZQorIyBkZWZpbmUgX0dMSUJDWFhfREVQUkVDQVRFRAorI2VuZGlmCisKKy8vIE1hY3JvcyBmb3IgQUJJIHRhZyBhdHRyaWJ1dGVzLgorI2lmbmRlZiBfR0xJQkNYWF9BQklfVEFHX0NYWDExCisjIGRlZmluZSBfR0xJQkNYWF9BQklfVEFHX0NYWDExIF9fYXR0cmlidXRlICgoX19hYmlfdGFnX18gKCJjeHgxMSIpKSkKKyNlbmRpZgorCisKKyNpZiBfX2NwbHVzcGx1cworCisvLyBNYWNybyBmb3IgY29uc3RleHByLCB0byBzdXBwb3J0IGluIG1peGVkIDAzLzB4IG1vZGUuCisjaWZuZGVmIF9HTElCQ1hYX0NPTlNURVhQUgorIyBpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjICBkZWZpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGNvbnN0ZXhwcgorIyAgZGVmaW5lIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgY29uc3RleHByCisjIGVsc2UKKyMgIGRlZmluZSBfR0xJQkNYWF9DT05TVEVYUFIKKyMgIGRlZmluZSBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGNvbnN0CisjIGVuZGlmCisjZW5kaWYKKworLy8gTWFjcm8gZm9yIG5vZXhjZXB0LCB0byBzdXBwb3J0IGluIG1peGVkIDAzLzB4IG1vZGUuCisjaWZuZGVmIF9HTElCQ1hYX05PRVhDRVBUCisjIGlmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyMgIGRlZmluZSBfR0xJQkNYWF9OT0VYQ0VQVCBub2V4Y2VwdAorIyAgZGVmaW5lIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCBub2V4Y2VwdAorIyAgZGVmaW5lIF9HTElCQ1hYX1RIUk9XKF9FWEMpCisjIGVsc2UKKyMgIGRlZmluZSBfR0xJQkNYWF9OT0VYQ0VQVAorIyAgZGVmaW5lIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB0aHJvdygpCisjICBkZWZpbmUgX0dMSUJDWFhfVEhST1coX0VYQykgdGhyb3coX0VYQykKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX05PVEhST1cKKyMgZGVmaW5lIF9HTElCQ1hYX05PVEhST1cgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9USFJPV19PUl9BQk9SVAorIyBpZiBfX0VYQ0VQVElPTlMKKyMgIGRlZmluZSBfR0xJQkNYWF9USFJPV19PUl9BQk9SVChfRVhDKSAodGhyb3cgKF9FWEMpKQorIyBlbHNlCisjICBkZWZpbmUgX0dMSUJDWFhfVEhST1dfT1JfQUJPUlQoX0VYQykgKF9fYnVpbHRpbl9hYm9ydCgpKQorIyBlbmRpZgorI2VuZGlmCisKKy8vIE1hY3JvIGZvciBleHRlcm4gdGVtcGxhdGUsIGllIGNvbnRyb2xpbmcgdGVtcGxhdGUgbGlua2FnZSB2aWEgdXNlCisvLyBvZiBleHRlcm4ga2V5d29yZCBvbiB0ZW1wbGF0ZSBkZWNsYXJhdGlvbi4gQXMgZG9jdW1lbnRlZCBpbiB0aGUgZysrCisvLyBtYW51YWwsIGl0IGluaGliaXRzIGFsbCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBhbmQgaXMgdXNlZAorLy8gdGhyb3VnaG91dCB0aGUgbGlicmFyeSB0byBhdm9pZCBtdWx0aXBsZSB3ZWFrIGRlZmluaXRpb25zIGZvcgorLy8gcmVxdWlyZWQgdHlwZXMgdGhhdCBhcmUgYWxyZWFkeSBleHBsaWNpdGx5IGluc3RhbnRpYXRlZCBpbiB0aGUKKy8vIGxpYnJhcnkgYmluYXJ5LiBUaGlzIHN1YnN0YW50aWFsbHkgcmVkdWNlcyB0aGUgYmluYXJ5IHNpemUgb2YKKy8vIHJlc3VsdGluZyBleGVjdXRhYmxlcy4KKy8vIFNwZWNpYWwgY2FzZTogX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFID09IC0xIGRpc2FsbG93cyBleHRlcm4KKy8vIHRlbXBsYXRlcyBvbmx5IGluIGJhc2ljX3N0cmluZywgdGh1cyBhY3RpdmF0aW5nIGl0cyBkZWJ1Zy1tb2RlCisvLyBjaGVja3MgZXZlbiBhdCAtTzAuCisjIGRlZmluZSBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUgMQorCisvKgorICBPdXRsaW5lIG9mIGxpYnN0ZGMrKyBuYW1lc3BhY2VzLgorCisgIG5hbWVzcGFjZSBzdGQKKyAgeworICAgIG5hbWVzcGFjZSBfX2RlYnVnIHsgfQorICAgIG5hbWVzcGFjZSBfX3BhcmFsbGVsIHsgfQorICAgIG5hbWVzcGFjZSBfX3Byb2ZpbGUgeyB9CisgICAgbmFtZXNwYWNlIF9fY3h4MTk5OCB7IH0KKworICAgIG5hbWVzcGFjZSBfX2RldGFpbCB7IH0KKworICAgIG5hbWVzcGFjZSByZWxfb3BzIHsgfQorCisgICAgbmFtZXNwYWNlIHRyMQorICAgIHsKKyAgICAgIG5hbWVzcGFjZSBwbGFjZWhvbGRlcnMgeyB9CisgICAgICBuYW1lc3BhY2UgcmVnZXhfY29uc3RhbnRzIHsgfQorICAgICAgbmFtZXNwYWNlIF9fZGV0YWlsIHsgfQorICAgIH0KKworICAgIG5hbWVzcGFjZSB0cjIgeyB9CisgICAgCisgICAgbmFtZXNwYWNlIGRlY2ltYWwgeyB9CisKKyAgICBuYW1lc3BhY2UgY2hyb25vIHsgfQorICAgIG5hbWVzcGFjZSBwbGFjZWhvbGRlcnMgeyB9CisgICAgbmFtZXNwYWNlIHJlZ2V4X2NvbnN0YW50cyB7IH0KKyAgICBuYW1lc3BhY2UgdGhpc190aHJlYWQgeyB9CisgIH0KKworICBuYW1lc3BhY2UgYWJpIHsgfQorCisgIG5hbWVzcGFjZSBfX2dudV9jeHgKKyAgeworICAgIG5hbWVzcGFjZSBfX2RldGFpbCB7IH0KKyAgfQorCisgIEZvciBmdWxsIGRldGFpbHMgc2VlOgorICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbGF0ZXN0LWRveHlnZW4vbmFtZXNwYWNlcy5odG1sCisqLworbmFtZXNwYWNlIHN0ZAoreworICB0eXBlZGVmIF9fU0laRV9UWVBFX18gCXNpemVfdDsKKyAgdHlwZWRlZiBfX1BUUkRJRkZfVFlQRV9fCXB0cmRpZmZfdDsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdHlwZWRlZiBkZWNsdHlwZShudWxscHRyKQludWxscHRyX3Q7CisjZW5kaWYKK30KKworCisvLyBEZWZpbmVkIGlmIGlubGluZSBuYW1lc3BhY2VzIGFyZSB1c2VkIGZvciB2ZXJzaW9uaW5nLgorIyBkZWZpbmUgX0dMSUJDWFhfSU5MSU5FX1ZFUlNJT04gMCAKKworLy8gSW5saW5lIG5hbWVzcGFjZSBmb3Igc3ltYm9sIHZlcnNpb25pbmcuCisjaWYgX0dMSUJDWFhfSU5MSU5FX1ZFUlNJT04KKworbmFtZXNwYWNlIHN0ZAoreworICBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0KKworICBuYW1lc3BhY2UgcmVsX29wcyB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9CisKKyAgbmFtZXNwYWNlIHRyMQorICB7CisgICAgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9CisgICAgbmFtZXNwYWNlIHBsYWNlaG9sZGVycyB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9CisgICAgbmFtZXNwYWNlIHJlZ2V4X2NvbnN0YW50cyB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9CisgICAgbmFtZXNwYWNlIF9fZGV0YWlsIHsgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9IH0KKyAgfQorCisgIG5hbWVzcGFjZSB0cjIKKyAgeyBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0gfQorCisgIG5hbWVzcGFjZSBkZWNpbWFsIHsgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9IH0KKworICBuYW1lc3BhY2UgY2hyb25vIHsgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9IH0KKyAgbmFtZXNwYWNlIHBsYWNlaG9sZGVycyB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9CisgIG5hbWVzcGFjZSByZWdleF9jb25zdGFudHMgeyBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0gfQorICBuYW1lc3BhY2UgdGhpc190aHJlYWQgeyBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0gfQorCisgIG5hbWVzcGFjZSBfX2RldGFpbCB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9Cit9CisKK25hbWVzcGFjZSBfX2dudV9jeHgKK3sKKyAgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9CisgIG5hbWVzcGFjZSBfX2RldGFpbCB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9Cit9CisjIGRlZmluZSBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTiBuYW1lc3BhY2UgX183IHsKKyMgZGVmaW5lIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTiB9CisjZWxzZQorIyBkZWZpbmUgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKyMgZGVmaW5lIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorI2VuZGlmCisKKworLy8gSW5saW5lIG5hbWVzcGFjZXMgZm9yIHNwZWNpYWwgbW9kZXM6IGRlYnVnLCBwYXJhbGxlbCwgcHJvZmlsZS4KKyNpZiBkZWZpbmVkKF9HTElCQ1hYX0RFQlVHKSB8fCBkZWZpbmVkKF9HTElCQ1hYX1BBUkFMTEVMKSBcCisgICAgfHwgZGVmaW5lZChfR0xJQkNYWF9QUk9GSUxFKQorbmFtZXNwYWNlIHN0ZAoreworICAvLyBOb24taW5saW5lIG5hbWVzcGFjZSBmb3IgY29tcG9uZW50cyByZXBsYWNlZCBieSBhbHRlcm5hdGVzIGluIGFjdGl2ZSBtb2RlLgorICBuYW1lc3BhY2UgX19jeHgxOTk4CisgIHsKKyNpZiBfR0xJQkNYWF9JTkxJTkVfVkVSU0lPTgorIGlubGluZSBuYW1lc3BhY2UgX183IHsgfQorI2VuZGlmCisgIH0KKworICAvLyBJbmxpbmUgbmFtZXNwYWNlIGZvciBkZWJ1ZyBtb2RlLgorIyBpZmRlZiBfR0xJQkNYWF9ERUJVRworICBpbmxpbmUgbmFtZXNwYWNlIF9fZGVidWcgeyB9CisjIGVuZGlmCisKKyAgLy8gSW5saW5lIG5hbWVzcGFjZXMgZm9yIHBhcmFsbGVsIG1vZGUuCisjIGlmZGVmIF9HTElCQ1hYX1BBUkFMTEVMCisgIGlubGluZSBuYW1lc3BhY2UgX19wYXJhbGxlbCB7IH0KKyMgZW5kaWYKKworICAvLyBJbmxpbmUgbmFtZXNwYWNlcyBmb3IgcHJvZmlsZSBtb2RlCisjIGlmZGVmIF9HTElCQ1hYX1BST0ZJTEUKKyAgaW5saW5lIG5hbWVzcGFjZSBfX3Byb2ZpbGUgeyB9CisjIGVuZGlmCit9CisKKy8vIENoZWNrIGZvciBpbnZhbGlkIHVzYWdlIGFuZCB1bnN1cHBvcnRlZCBtaXhlZC1tb2RlIHVzZS4KKyMgaWYgZGVmaW5lZChfR0xJQkNYWF9ERUJVRykgJiYgZGVmaW5lZChfR0xJQkNYWF9QQVJBTExFTCkKKyMgIGVycm9yIGlsbGVnYWwgdXNlIG9mIG11bHRpcGxlIGlubGluZWQgbmFtZXNwYWNlcworIyBlbmRpZgorIyBpZiBkZWZpbmVkKF9HTElCQ1hYX1BST0ZJTEUpICYmIGRlZmluZWQoX0dMSUJDWFhfREVCVUcpCisjICBlcnJvciBpbGxlZ2FsIHVzZSBvZiBtdWx0aXBsZSBpbmxpbmVkIG5hbWVzcGFjZXMKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChfR0xJQkNYWF9QUk9GSUxFKSAmJiBkZWZpbmVkKF9HTElCQ1hYX1BBUkFMTEVMKQorIyAgZXJyb3IgaWxsZWdhbCB1c2Ugb2YgbXVsdGlwbGUgaW5saW5lZCBuYW1lc3BhY2VzCisjIGVuZGlmCisKKy8vIENoZWNrIGZvciBpbnZhbGlkIHVzZSBkdWUgdG8gbGFjayBmb3Igd2VhayBzeW1ib2xzLgorIyBpZiBfX05PX0lOTElORV9fICYmICFfX0dYWF9XRUFLX18KKyMgIHdhcm5pbmcgY3VycmVudGx5IHVzaW5nIGlubGluZWQgbmFtZXNwYWNlIG1vZGUgd2hpY2ggbWF5IGZhaWwgXAorICAgd2l0aG91dCBpbmxpbmluZyBkdWUgdG8gbGFjayBvZiB3ZWFrIHN5bWJvbHMKKyMgZW5kaWYKKyNlbmRpZgorCisvLyBNYWNyb3MgZm9yIG5hbWVzcGFjZSBzY29wZS4gRWl0aGVyIG5hbWVzcGFjZSBzdGQ6OiBvciB0aGUgbmFtZQorLy8gb2Ygc29tZSBuZXN0ZWQgbmFtZXNwYWNlIHdpdGhpbiBpdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBhY3RpdmUgbW9kZS4KKy8vIF9HTElCQ1hYX1NURF9BCisvLyBfR0xJQkNYWF9TVERfQworLy8KKy8vIE1hY3JvcyBmb3Igb3BlbmluZy9jbG9zaW5nIGNvbmRpdGlvbmFsIG5hbWVzcGFjZXMuCisvLyBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQUxHTworLy8gX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9BTEdPCisvLyBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisvLyBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorI2lmIGRlZmluZWQoX0dMSUJDWFhfREVCVUcpIHx8IGRlZmluZWQoX0dMSUJDWFhfUFJPRklMRSkKKyMgZGVmaW5lIF9HTElCQ1hYX1NURF9DIF9fY3h4MTk5OAorIyBkZWZpbmUgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUiBcCisJIG5hbWVzcGFjZSBfR0xJQkNYWF9TVERfQyB7IF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisjIGRlZmluZSBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUiBcCisJIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTiB9CisjIHVuZGVmIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURQorIyBkZWZpbmUgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFIC0xCisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1BBUkFMTEVMCisjIGRlZmluZSBfR0xJQkNYWF9TVERfQSBfX2N4eDE5OTgKKyMgZGVmaW5lIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9BTEdPIFwKKwkgbmFtZXNwYWNlIF9HTElCQ1hYX1NURF9BIHsgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKyMgZGVmaW5lIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQUxHTyBcCisJIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTiB9CisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9TVERfQQorIyBkZWZpbmUgX0dMSUJDWFhfU1REX0Egc3RkCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9TVERfQworIyBkZWZpbmUgX0dMSUJDWFhfU1REX0Mgc3RkCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQUxHTworIyBkZWZpbmUgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0FMR08KKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQUxHTworIyBkZWZpbmUgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9BTEdPCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisjIGRlZmluZSBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorIyBkZWZpbmUgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKKyNlbmRpZgorCisvLyBHTElCQ1hYX0FCSSBEZXByZWNhdGVkCisvLyBEZWZpbmUgaWYgY29tcGF0aWJpbGl0eSBzaG91bGQgYmUgcHJvdmlkZWQgZm9yIC1tbG9uZy1kb3VibGUtNjQuCisjdW5kZWYgX0dMSUJDWFhfTE9OR19ET1VCTEVfQ09NUEFUCisKKy8vIElubGluZSBuYW1lc3BhY2UgZm9yIGxvbmcgZG91YmxlIDEyOCBtb2RlLgorI2lmIGRlZmluZWQgX0dMSUJDWFhfTE9OR19ET1VCTEVfQ09NUEFUICYmIGRlZmluZWQgX19MT05HX0RPVUJMRV8xMjhfXworbmFtZXNwYWNlIHN0ZAoreworICBpbmxpbmUgbmFtZXNwYWNlIF9fZ251X2N4eF9sZGJsMTI4IHsgfQorfQorIyBkZWZpbmUgX0dMSUJDWFhfTkFNRVNQQUNFX0xEQkwgX19nbnVfY3h4X2xkYmwxMjg6OgorIyBkZWZpbmUgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0xEQkwgbmFtZXNwYWNlIF9fZ251X2N4eF9sZGJsMTI4IHsKKyMgZGVmaW5lIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfTERCTCB9CisjZWxzZQorIyBkZWZpbmUgX0dMSUJDWFhfTkFNRVNQQUNFX0xEQkwKKyMgZGVmaW5lIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9MREJMCisjIGRlZmluZSBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0xEQkwKKyNlbmRpZgorCisvLyBBc3NlcnQuCisjaWYgIWRlZmluZWQoX0dMSUJDWFhfREVCVUcpICYmICFkZWZpbmVkKF9HTElCQ1hYX1BBUkFMTEVMKQorIyBkZWZpbmUgX19nbGliY3h4X2Fzc2VydChfQ29uZGl0aW9uKQorI2Vsc2UKK25hbWVzcGFjZSBzdGQKK3sKKyAgLy8gQXZvaWQgdGhlIHVzZSBvZiBhc3NlcnQsIGJlY2F1c2Ugd2UncmUgdHJ5aW5nIHRvIGtlZXAgdGhlIDxjYXNzZXJ0PgorICAvLyBpbmNsdWRlIG91dCBvZiB0aGUgbWl4LgorICBpbmxpbmUgdm9pZAorICBfX3JlcGxhY2VtZW50X2Fzc2VydChjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUsCisJCSAgICAgICBjb25zdCBjaGFyKiBfX2Z1bmN0aW9uLCBjb25zdCBjaGFyKiBfX2NvbmRpdGlvbikKKyAgeworICAgIF9fYnVpbHRpbl9wcmludGYoIiVzOiVkOiAlczogQXNzZXJ0aW9uICclcycgZmFpbGVkLlxuIiwgX19maWxlLCBfX2xpbmUsCisJCSAgICAgX19mdW5jdGlvbiwgX19jb25kaXRpb24pOworICAgIF9fYnVpbHRpbl9hYm9ydCgpOworICB9Cit9CisjZGVmaW5lIF9fZ2xpYmN4eF9hc3NlcnQoX0NvbmRpdGlvbikJCQkJICAgCSBcCisgIGRvIAkJCQkJCQkJCSBcCisgIHsJCQkJCQkJICAgICAgCQkgXAorICAgIGlmICghIChfQ29uZGl0aW9uKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0ZDo6X19yZXBsYWNlbWVudF9hc3NlcnQoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBcCisJCQkJI19Db25kaXRpb24pOwkJCQkgXAorICB9IHdoaWxlIChmYWxzZSkKKyNlbmRpZgorCisvLyBNYWNyb3MgZm9yIHJhY2UgZGV0ZWN0b3JzLgorLy8gX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQkVGT1JFKEEpIGFuZAorLy8gX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQUZURVIoQSkgc2hvdWxkIGJlIHVzZWQgdG8gZXhwbGFpbgorLy8gYXRvbWljIChsb2NrLWZyZWUpIHN5bmNocm9uaXphdGlvbiB0byByYWNlIGRldGVjdG9yczoKKy8vIHRoZSByYWNlIGRldGVjdG9yIHdpbGwgaW5mZXIgYSBoYXBwZW5zLWJlZm9yZSBhcmMgZnJvbSB0aGUgZm9ybWVyIHRvIHRoZQorLy8gbGF0dGVyIHdoZW4gdGhleSBzaGFyZSB0aGUgc2FtZSBhcmd1bWVudCBwb2ludGVyLgorLy8KKy8vIFRoZSBtb3N0IGZyZXF1ZW50IHVzZSBjYXNlIGZvciB0aGVzZSBtYWNyb3MgKGFuZCB0aGUgb25seSBjYXNlIGluIHRoZQorLy8gY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbGlicmFyeSkgaXMgYXRvbWljIHJlZmVyZW5jZSBjb3VudGluZzoKKy8vICAgdm9pZCBfTV9yZW1vdmVfcmVmZXJlbmNlKCkKKy8vICAgeworLy8gICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0JFRk9SRSgmdGhpcy0+X01fcmVmY291bnQpOworLy8gICAgIGlmIChfX2dudV9jeHg6Ol9fZXhjaGFuZ2VfYW5kX2FkZF9kaXNwYXRjaCgmdGhpcy0+X01fcmVmY291bnQsIC0xKSA8PSAwKQorLy8gICAgICAgeworLy8gICAgICAgICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19BRlRFUigmdGhpcy0+X01fcmVmY291bnQpOworLy8gICAgICAgICBfTV9kZXN0cm95KF9fYSk7CisvLyAgICAgICB9CisvLyAgIH0KKy8vIFRoZSBhbm5vdGF0aW9ucyBpbiB0aGlzIGV4YW1wbGUgdGVsbCB0aGUgcmFjZSBkZXRlY3RvciB0aGF0IGFsbCBtZW1vcnkKKy8vIGFjY2Vzc2VzIG9jY3VycmVkIHdoZW4gdGhlIHJlZmNvdW50IHdhcyBwb3NpdGl2ZSBkbyBub3QgcmFjZSB3aXRoCisvLyBtZW1vcnkgYWNjZXNzZXMgd2hpY2ggb2NjdXJyZWQgYWZ0ZXIgdGhlIHJlZmNvdW50IGJlY2FtZSB6ZXJvLgorI2lmbmRlZiBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19CRUZPUkUKKyMgZGVmaW5lICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19CRUZPUkUoQSkKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19BRlRFUgorIyBkZWZpbmUgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0FGVEVSKEEpCisjZW5kaWYKKworLy8gTWFjcm9zIGZvciBDIGxpbmthZ2U6IGRlZmluZSBleHRlcm4gIkMiIGxpbmthZ2Ugb25seSB3aGVuIHVzaW5nIEMrKy4KKyMgZGVmaW5lIF9HTElCQ1hYX0JFR0lOX0VYVEVSTl9DIGV4dGVybiAiQyIgeworIyBkZWZpbmUgX0dMSUJDWFhfRU5EX0VYVEVSTl9DIH0KKworI2Vsc2UgLy8gIV9fY3BsdXNwbHVzCisjIGRlZmluZSBfR0xJQkNYWF9CRUdJTl9FWFRFUk5fQworIyBkZWZpbmUgX0dMSUJDWFhfRU5EX0VYVEVSTl9DCisjZW5kaWYKKworCisvLyBGaXJzdCBpbmNsdWRlcy4KKworLy8gUGljayB1cCBhbnkgT1Mtc3BlY2lmaWMgZGVmaW5pdGlvbnMuCisjaW5jbHVkZSA8Yml0cy9vc19kZWZpbmVzLmg+CisKKy8vIFBpY2sgdXAgYW55IENQVS1zcGVjaWZpYyBkZWZpbml0aW9ucy4KKyNpbmNsdWRlIDxiaXRzL2NwdV9kZWZpbmVzLmg+CisKKy8vIElmIHBsYXRmb3JtIHVzZXMgbmVpdGhlciB2aXNpYmlsaXR5IG5vciBwc3VlZG8tdmlzaWJpbGl0eSwKKy8vIHNwZWNpZnkgZW1wdHkgZGVmYXVsdCBmb3IgbmFtZXNwYWNlIGFubm90YXRpb24gbWFjcm9zLgorI2lmbmRlZiBfR0xJQkNYWF9QU0VVRE9fVklTSUJJTElUWQorIyBkZWZpbmUgX0dMSUJDWFhfUFNFVURPX1ZJU0lCSUxJVFkoVikKKyNlbmRpZgorCisvLyBDZXJ0YWluIGZ1bmN0aW9uIGRlZmluaXRpb25zIHRoYXQgYXJlIG1lYW50IHRvIGJlIG92ZXJyaWRhYmxlIGZyb20KKy8vIHVzZXIgY29kZSBhcmUgZGVjb3JhdGVkIHdpdGggdGhpcyBtYWNyby4gIEZvciBzb21lIHRhcmdldHMsIHRoaXMKKy8vIG1hY3JvIGNhdXNlcyB0aGVzZSBkZWZpbml0aW9ucyB0byBiZSB3ZWFrLgorI2lmbmRlZiBfR0xJQkNYWF9XRUFLX0RFRklOSVRJT04KKyMgZGVmaW5lIF9HTElCQ1hYX1dFQUtfREVGSU5JVElPTgorI2VuZGlmCisKKworLy8gVGhlIHJlbWFpbmRlciBvZiB0aGUgcHJld3JpdHRlbiBjb25maWcgaXMgYXV0b21hdGljOyBhbGwgdGhlCisvLyB1c2VyIGhvb2tzIGFyZSBsaXN0ZWQgYWJvdmUuCisKKy8vIENyZWF0ZSBhIGJvb2xlYW4gZmxhZyB0byBiZSB1c2VkIHRvIGRldGVybWluZSBpZiAtLWZhc3QtbWF0aCBpcyBzZXQuCisjaWZkZWYgX19GQVNUX01BVEhfXworIyBkZWZpbmUgX0dMSUJDWFhfRkFTVF9NQVRIIDEKKyNlbHNlCisjIGRlZmluZSBfR0xJQkNYWF9GQVNUX01BVEggMAorI2VuZGlmCisKKy8vIFRoaXMgbWFya3Mgc3RyaW5nIGxpdGVyYWxzIGluIGhlYWRlciBmaWxlcyB0byBiZSBleHRyYWN0ZWQgZm9yIGV2ZW50dWFsCisvLyB0cmFuc2xhdGlvbi4gIEl0IGlzIHByaW1hcmlseSB1c2VkIGZvciBtZXNzYWdlcyBpbiB0aHJvd24gZXhjZXB0aW9uczsgc2VlCisvLyBzcmMvZnVuY3RleGNlcHQuY2MuICBXZSB1c2UgX19OIGJlY2F1c2UgdGhlIG1vcmUgdHJhZGl0aW9uYWwgX04gaXMgdXNlZAorLy8gZm9yIHNvbWV0aGluZyBlbHNlIHVuZGVyIGNlcnRhaW4gT1NlcyAoc2VlIEJBRE5BTUVTKS4KKyNkZWZpbmUgX19OKG1zZ2lkKSAgICAgKG1zZ2lkKQorCisvLyBGb3IgZXhhbXBsZSwgPHdpbmRvd3MuaD4gaXMga25vd24gdG8gI2RlZmluZSBtaW4gYW5kIG1heCBhcyBtYWNyb3MuLi4KKyN1bmRlZiBtaW4KKyN1bmRlZiBtYXgKKworLy8gRW5kIG9mIHByZXdyaXR0ZW4gY29uZmlnOyB0aGUgc2V0dGluZ3MgZGlzY292ZXJlZCBhdCBjb25maWd1cmUgdGltZSBmb2xsb3cuCisvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZy5oLmluIGJ5IGNvbmZpZ3VyZS4gICovCisvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhY29zZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfQUNPU0YgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFjb3NsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9BQ09TTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXNpbmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0FTSU5GIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhc2lubCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfQVNJTkwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgdGFyZ2V0IGFzc2VtYmxlciBzdXBwb3J0cyAuc3ltdmVyIGRpcmVjdGl2ZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9BU19TWU1WRVJfRElSRUNUSVZFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhdGFuMmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0FUQU4yRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXRhbjJsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9BVEFOMkwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGF0YW5mJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9BVEFORiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXRhbmwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0FUQU5MIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhdF9xdWlja19leGl0JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9BVF9RVUlDS19FWElUIDEKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHRhcmdldCBhc3NlbWJsZXIgc3VwcG9ydHMgdGhyZWFkLWxvY2FsIHN0b3JhZ2UuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9DQ19UTFMgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjZWlsZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfQ0VJTEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNlaWxsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9DRUlMTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Y29tcGxleC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9DT01QTEVYX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNvc2YnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0NPU0YgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNvc2hmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9DT1NIRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY29zaGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0NPU0hMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjb3NsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9DT1NMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkbGZjbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9ETEZDTl9IIDEKKworLyogRGVmaW5lIGlmIEVCQURNU0cgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VCQURNU0cgMQorCisvKiBEZWZpbmUgaWYgRUNBTkNFTEVEIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FQ0FOQ0VMRUQgMQorCisvKiBEZWZpbmUgaWYgRUNISUxEIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FQ0hJTEQgMQorCisvKiBEZWZpbmUgaWYgRUlEUk0gZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VJRFJNIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxlbmRpYW4uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRU5ESUFOX0ggMQorCisvKiBEZWZpbmUgaWYgRU5PREFUQSBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRU5PREFUQSAxCisKKy8qIERlZmluZSBpZiBFTk9MSU5LIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FTk9MSU5LIDEKKworLyogRGVmaW5lIGlmIEVOT1NQQyBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRU5PU1BDIDEKKworLyogRGVmaW5lIGlmIEVOT1NSIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FTk9TUiAxCisKKy8qIERlZmluZSBpZiBFTk9TVFIgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VOT1NUUiAxCisKKy8qIERlZmluZSBpZiBFTk9UUkVDT1ZFUkFCTEUgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VOT1RSRUNPVkVSQUJMRSAxCisKKy8qIERlZmluZSBpZiBFTk9UU1VQIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FTk9UU1VQIDEKKworLyogRGVmaW5lIGlmIEVPVkVSRkxPVyBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRU9WRVJGTE9XIDEKKworLyogRGVmaW5lIGlmIEVPV05FUkRFQUQgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VPV05FUkRFQUQgMQorCisvKiBEZWZpbmUgaWYgRVBFUk0gZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VQRVJNIDEKKworLyogRGVmaW5lIGlmIEVQUk9UTyBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRVBST1RPIDEKKworLyogRGVmaW5lIGlmIEVUSU1FIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FVElNRSAxCisKKy8qIERlZmluZSBpZiBFVElNRURPVVQgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VUSU1FRE9VVCAxCisKKy8qIERlZmluZSBpZiBFVFhUQlNZIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FVFhUQlNZIDEKKworLyogRGVmaW5lIGlmIEVXT1VMREJMT0NLIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FV09VTERCTE9DSyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZXhlY2luZm8uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRVhFQ0lORk9fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZXhwZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRVhQRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZXhwbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRVhQTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZmFic2YnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0ZBQlNGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmYWJzbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRkFCU0wgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZlbnYuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRkVOVl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmaW5pdGUnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0ZJTklURSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZmluaXRlZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRklOSVRFRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZmluaXRlbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRklOSVRFTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmxvYXQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRkxPQVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZmxvb3JmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GTE9PUkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZsb29ybCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRkxPT1JMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmbW9kZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRk1PREYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZtb2RsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GTU9ETCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZnBjbGFzcycgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9GUENMQVNTICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZnAuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9GUF9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZnJleHBmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GUkVYUEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZyZXhwbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRlJFWFBMIDEKKworLyogRGVmaW5lIGlmIF9VbndpbmRfR2V0SVBJbmZvIGlzIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9HRVRJUElORk8gMQorCisvKiBEZWZpbmUgaWYgZ2V0cyBpcyBhdmFpbGFibGUgaW4gPHN0ZGlvLmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0dFVFMgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGh5cG90JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9IWVBPVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaHlwb3RmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9IWVBPVEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGh5cG90bCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfSFlQT1RMIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBpY29udigpIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lDT05WIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpZWVlZnAuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9JRUVFRlBfSCAqLworCisvKiBEZWZpbmUgaWYgaW50NjRfdCBpcyBhdmFpbGFibGUgaW4gPHN0ZGludC5oPi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9JTlQ2NF9UIDEKKworLyogRGVmaW5lIGlmIGludDY0X3QgaXMgYSBsb25nLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfSU5UNjRfVF9MT05HICovCisKKy8qIERlZmluZSBpZiBpbnQ2NF90IGlzIGEgbG9uZyBsb25nLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lOVDY0X1RfTE9OR19MT05HIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9JTlRUWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpc2luZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfSVNJTkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGlzaW5mZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfSVNJTkZGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpc2luZmwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lTSU5GTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaXNuYW4nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lTTkFOIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpc25hbmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lTTkFORiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaXNuYW5sJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9JU05BTkwgMQorCisvKiBEZWZpbmVkIGlmIGlzd2JsYW5rIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9JU1dCTEFOSyAxCisKKy8qIERlZmluZSBpZiBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MQ19NRVNTQUdFUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbGRleHBmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MREVYUEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxkZXhwbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfTERFWFBMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaWJpbnRsLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfTElCSU5UTF9IICovCisKKy8qIE9ubHkgdXNlZCBpbiBidWlsZCBkaXJlY3RvcnkgdGVzdHN1aXRlX2hvb2tzLmguICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9MSU1JVF9BUyAqLworCisvKiBPbmx5IHVzZWQgaW4gYnVpbGQgZGlyZWN0b3J5IHRlc3RzdWl0ZV9ob29rcy5oLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfTElNSVRfREFUQSAqLworCisvKiBPbmx5IHVzZWQgaW4gYnVpbGQgZGlyZWN0b3J5IHRlc3RzdWl0ZV9ob29rcy5oLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfTElNSVRfRlNJWkUgKi8KKworLyogT25seSB1c2VkIGluIGJ1aWxkIGRpcmVjdG9yeSB0ZXN0c3VpdGVfaG9va3MuaC4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX0xJTUlUX1JTUyAqLworCisvKiBPbmx5IHVzZWQgaW4gYnVpbGQgZGlyZWN0b3J5IHRlc3RzdWl0ZV9ob29rcy5oLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfTElNSVRfVk1FTSAqLworCisvKiBEZWZpbmUgaWYgZnV0ZXggc3lzY2FsbCBpcyBhdmFpbGFibGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfTElOVVhfRlVURVggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0NBTEVfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbG9nMTBmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0cxMEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxvZzEwbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfTE9HMTBMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsb2dmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0dGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsb2dsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0dMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtYWNoaW5lL2VuZGlhbi5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX01BQ0hJTkVfRU5ESUFOX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtYWNoaW5lL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfTUFDSElORV9QQVJBTV9IICovCisKKy8qIERlZmluZSBpZiBtYnN0YXRlX3QgZXhpc3RzIGluIHdjaGFyLmguICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfTUJTVEFURV9UIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfTUVNT1JZX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1vZGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX01PREYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1vZGZmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9NT0RGRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbW9kZmwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX01PREZMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuYW4uaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9OQU5fSCAqLworCisvKiBEZWZpbmUgaWYgcG9sbCBpcyBhdmFpbGFibGUgaW4gPHBvbGwuaD4uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfUE9MTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcG93ZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfUE9XRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcG93bCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfUE9XTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcWZwY2xhc3MnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfUUZQQ0xBU1MgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBxdWlja19leGl0JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9RVUlDS19FWElUIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRlbnYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfU0VURU5WICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2luY29zJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TSU5DT1MgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpbmNvc2YnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkNPU0YgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpbmNvc2wnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkNPU0wgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpbmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpbmhmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TSU5IRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2luaGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkhMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaW5sJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TSU5MIDEKKworLyogRGVmaW5lZCBpZiBzbGVlcCBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0xFRVAgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNxcnRmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TUVJURiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3FydGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NRUlRMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRhbGlnbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVERBTElHTl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRib29sLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NUREJPT0xfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NURElOVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1RETElCX0ggMQorCisvKiBEZWZpbmUgaWYgc3RyZXJyb3JfbCBpcyBhdmFpbGFibGUgaW4gPHN0cmluZy5oPi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVFJFUlJPUl9MIDEKKworLyogRGVmaW5lIGlmIHN0cmVycm9yX3IgaXMgYXZhaWxhYmxlIGluIDxzdHJpbmcuaD4uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1RSRVJST1JfUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVFJJTkdTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVFJJTkdfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RydG9mJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVFJUT0YgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnRvbGQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NUUlRPTEQgMQorCisvKiBEZWZpbmUgaWYgc3RyeGZybV9sIGlzIGF2YWlsYWJsZSBpbiA8c3RyaW5nLmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NUUlhGUk1fTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSB0YXJnZXQgcnVudGltZSBsaW5rZXIgc3VwcG9ydHMgYmluZGluZyB0aGUgc2FtZSBzeW1ib2wKKyAgIHRvIGRpZmZlcmVudCB2ZXJzaW9ucy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TWU1WRVJfU1lNQk9MX1JFTkFNSU5HX1JVTlRJTUVfU1VQUE9SVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2ZpbGlvLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfU1lTX0ZJTElPX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvaW9jdGwuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1lTX0lPQ1RMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pcGMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1lTX0lQQ19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvaXNhX2RlZnMuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9TWVNfSVNBX0RFRlNfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9tYWNoaW5lLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfU1lTX01BQ0hJTkVfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TWVNfUEFSQU1fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Jlc291cmNlLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZU19SRVNPVVJDRV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgYSBzdWl0YWJsZSA8c3lzL3NkdC5oPiBoZWFkZXIgZmlsZSAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfU1lTX1NEVF9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NlbS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TWVNfU0VNX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZU19TVEFUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zeXNpbmZvLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZU19TWVNJTkZPX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZU19USU1FX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TWVNfVFlQRVNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Vpby5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TWVNfVUlPX0ggMQorCisvKiBEZWZpbmUgaWYgU19JRlJFRyBpcyBhdmFpbGFibGUgaW4gPHN5cy9zdGF0Lmg+LiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfU19JRlJFRyAqLworCisvKiBEZWZpbmUgaWYgU19JRlJFRyBpcyBhdmFpbGFibGUgaW4gPHN5cy9zdGF0Lmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NfSVNSRUcgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHRhbmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1RBTkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHRhbmhmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9UQU5IRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdGFuaGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1RBTkhMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0YW5sJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9UQU5MIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx0Z21hdGguaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVEdNQVRIX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgdGFyZ2V0IHN1cHBvcnRzIHRocmVhZC1sb2NhbCBzdG9yYWdlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1RMUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1VOSVNURF9IIDEKKworLyogRGVmaW5lZCBpZiB1c2xlZXAgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1VTTEVFUCAxCisKKy8qIERlZmluZWQgaWYgdmZ3c2NhbmYgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1ZGV1NDQU5GIDEKKworLyogRGVmaW5lZCBpZiB2c3dzY2FuZiBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVlNXU0NBTkYgMQorCisvKiBEZWZpbmVkIGlmIHZ3c2NhbmYgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1ZXU0NBTkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHdjaGFyLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1dDSEFSX0ggMQorCisvKiBEZWZpbmVkIGlmIHdjc3RvZiBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfV0NTVE9GIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx3Y3R5cGUuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfV0NUWVBFX0ggMQorCisvKiBEZWZpbmVkIGlmIFNsZWVwIGV4aXN0cy4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX1dJTjMyX1NMRUVQICovCisKKy8qIERlZmluZSBpZiB3cml0ZXYgaXMgYXZhaWxhYmxlIGluIDxzeXMvdWlvLmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1dSSVRFViAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Fjb3NmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19BQ09TRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9hY29zbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQUNPU0wgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfYXNpbmYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0FTSU5GICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2FzaW5sJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19BU0lOTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9hdGFuMmYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0FUQU4yRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9hdGFuMmwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0FUQU4yTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9hdGFuZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQVRBTkYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfYXRhbmwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0FUQU5MICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2NlaWxmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19DRUlMRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9jZWlsbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQ0VJTEwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfY29zZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQ09TRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9jb3NoZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQ09TSEYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfY29zaGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0NPU0hMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Nvc2wnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0NPU0wgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZXhwZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRVhQRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9leHBsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19FWFBMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2ZhYnNmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GQUJTRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9mYWJzbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRkFCU0wgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZmluaXRlJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GSU5JVEUgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZmluaXRlZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRklOSVRFRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9maW5pdGVsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GSU5JVEVMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Zsb29yZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRkxPT1JGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Zsb29ybCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRkxPT1JMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Ztb2RmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GTU9ERiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9mbW9kbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRk1PREwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZnBjbGFzcycgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRlBDTEFTUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9mcmV4cGYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0ZSRVhQRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9mcmV4cGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0ZSRVhQTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9oeXBvdCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fSFlQT1QgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfaHlwb3RmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19IWVBPVEYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfaHlwb3RsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19IWVBPVEwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfaXNpbmYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0lTSU5GICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2lzaW5mZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fSVNJTkZGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2lzaW5mbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fSVNJTkZMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2lzbmFuJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19JU05BTiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9pc25hbmYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0lTTkFORiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9pc25hbmwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0lTTkFOTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9sZGV4cGYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0xERVhQRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9sZGV4cGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0xERVhQTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9sb2cxMGYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0xPRzEwRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9sb2cxMGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0xPRzEwTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9sb2dmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19MT0dGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2xvZ2wnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0xPR0wgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfbW9kZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fTU9ERiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9tb2RmZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fTU9ERkYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfbW9kZmwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX01PREZMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3Bvd2YnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1BPV0YgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfcG93bCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fUE9XTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9xZnBjbGFzcycgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fUUZQQ0xBU1MgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfc2luY29zJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19TSU5DT1MgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfc2luY29zZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fU0lOQ09TRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9zaW5jb3NsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19TSU5DT1NMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3NpbmYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1NJTkYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfc2luaGYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1NJTkhGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3NpbmhsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19TSU5ITCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9zaW5sJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19TSU5MICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3NxcnRmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19TUVJURiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9zcXJ0bCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fU1FSVEwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfdGFuZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fVEFORiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF90YW5oZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fVEFOSEYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfdGFuaGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1RBTkhMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3RhbmwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1RBTkwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfX2N4YV90aHJlYWRfYXRleGl0X2ltcGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX19DWEFfVEhSRUFEX0FURVhJVF9JTVBMICovCisKKy8qIERlZmluZSBhcyBjb25zdCBpZiB0aGUgZGVjbGFyYXRpb24gb2YgaWNvbnYoKSBuZWVkcyBjb25zdC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSUNPTlZfQ09OU1QgCisKKy8qIERlZmluZSB0byB0aGUgc3ViLWRpcmVjdG9yeSBpbiB3aGljaCBsaWJ0b29sIHN0b3JlcyB1bmluc3RhbGxlZCBsaWJyYXJpZXMuCisgICAqLworI2RlZmluZSBMVF9PQkpESVIgIi5saWJzLyIKKworLyogTmFtZSBvZiBwYWNrYWdlICovCisvKiAjdW5kZWYgX0dMSUJDWFhfUEFDS0FHRSAqLworCisvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfUEFDS0FHRV9CVUdSRVBPUlQgIiIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBfR0xJQkNYWF9QQUNLQUdFX05BTUUgInBhY2thZ2UtdW51c2VkIgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIF9HTElCQ1hYX1BBQ0tBR0VfU1RSSU5HICJwYWNrYWdlLXVudXNlZCB2ZXJzaW9uLXVudXNlZCIKKworLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBfR0xJQkNYWF9QQUNLQUdFX1RBUk5BTUUgImxpYnN0ZGMrKyIKKworLyogRGVmaW5lIHRvIHRoZSBob21lIHBhZ2UgZm9yIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfUEFDS0FHRV9VUkwgIiIKKworLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfUEFDS0FHRV9fR0xJQkNYWF9WRVJTSU9OICJ2ZXJzaW9uLXVudXNlZCIKKworLyogVGhlIHNpemUgb2YgYGNoYXInLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisvKiAjdW5kZWYgU0laRU9GX0NIQVIgKi8KKworLyogVGhlIHNpemUgb2YgYGludCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qICN1bmRlZiBTSVpFT0ZfSU5UICovCisKKy8qIFRoZSBzaXplIG9mIGBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9MT05HICovCisKKy8qIFRoZSBzaXplIG9mIGBzaG9ydCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qICN1bmRlZiBTSVpFT0ZfU0hPUlQgKi8KKworLyogVGhlIHNpemUgb2YgYHZvaWQgKicsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qICN1bmRlZiBTSVpFT0ZfVk9JRF9QICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI2RlZmluZSBTVERDX0hFQURFUlMgMQorCisvKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCisvKiAjdW5kZWYgX0dMSUJDWFhfVkVSU0lPTiAqLworCisvKiBEZWZpbmUgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIEMrKzExIGF0b21pY3MuICovCisjZGVmaW5lIF9HTElCQ1hYX0FUT01JQ19CVUlMVElOUyAxCisKKy8qIERlZmluZSB0byB1c2UgY29uY2VwdCBjaGVja2luZyBjb2RlIGZyb20gdGhlIGJvb3N0IGxpYnJhcmllcy4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9DT05DRVBUX0NIRUNLUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiBhIGZ1bGx5IGR5bmFtaWMgYmFzaWNfc3RyaW5nIGlzIHdhbnRlZCwgMCB0byBkaXNhYmxlLAorICAgdW5kZWZpbmVkIGZvciBwbGF0Zm9ybSBkZWZhdWx0cyAqLworI2RlZmluZSBfR0xJQkNYWF9GVUxMWV9EWU5BTUlDX1NUUklORyAwCisKKy8qIERlZmluZSBpZiBndGhyZWFkcyBsaWJyYXJ5IGlzIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFTX0dUSFJFQURTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgYSBmdWxsIGhvc3RlZCBsaWJyYXJ5IGlzIGJ1aWx0LCBvciAwIGlmIGZyZWVzdGFuZGluZy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSE9TVEVEIDEKKworLyogRGVmaW5lIGlmIGNvbXBhdGliaWxpdHkgc2hvdWxkIGJlIHByb3ZpZGVkIGZvciAtbWxvbmctZG91YmxlLTY0LiAqLworCisvKiBEZWZpbmUgaWYgcHRyZGlmZl90IGlzIGludC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfUFRSRElGRl9UX0lTX0lOVCAxCisKKy8qIERlZmluZSBpZiB1c2luZyBzZXRybGltaXQgdG8gc2V0IHJlc291cmNlIGxpbWl0cyBkdXJpbmcgIm1ha2UgY2hlY2siICovCisvKiAjdW5kZWYgX0dMSUJDWFhfUkVTX0xJTUlUUyAqLworCisvKiBEZWZpbmUgaWYgc2l6ZV90IGlzIHVuc2lnbmVkIGludC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfU0laRV9UX0lTX1VJTlQgMQorCisvKiBEZWZpbmUgaWYgdGhlIGNvbXBpbGVyIGlzIGNvbmZpZ3VyZWQgZm9yIHNldGptcC9sb25nam1wIGV4Y2VwdGlvbnMuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfU0pMSl9FWENFUFRJT05TICovCisKKy8qIERlZmluZSB0byB0aGUgdmFsdWUgb2YgdGhlIEVPRiBpbnRlZ2VyIGNvbnN0YW50LiAqLworI2RlZmluZSBfR0xJQkNYWF9TVERJT19FT0YgLTEKKworLyogRGVmaW5lIHRvIHRoZSB2YWx1ZSBvZiB0aGUgU0VFS19DVVIgaW50ZWdlciBjb25zdGFudC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfU1RESU9fU0VFS19DVVIgMQorCisvKiBEZWZpbmUgdG8gdGhlIHZhbHVlIG9mIHRoZSBTRUVLX0VORCBpbnRlZ2VyIGNvbnN0YW50LiAqLworI2RlZmluZSBfR0xJQkNYWF9TVERJT19TRUVLX0VORCAyCisKKy8qIERlZmluZSB0byB1c2Ugc3ltYm9sIHZlcnNpb25pbmcgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAqLworI2RlZmluZSBfR0xJQkNYWF9TWU1WRVIgMQorCisvKiBEZWZpbmUgdG8gdXNlIGRhcndpbiB2ZXJzaW9uaW5nIGluIHRoZSBzaGFyZWQgbGlicmFyeS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9TWU1WRVJfREFSV0lOICovCisKKy8qIERlZmluZSB0byB1c2UgR05VIHZlcnNpb25pbmcgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAqLworI2RlZmluZSBfR0xJQkNYWF9TWU1WRVJfR05VIDEKKworLyogRGVmaW5lIHRvIHVzZSBHTlUgbmFtZXNwYWNlIHZlcnNpb25pbmcgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAqLworLyogI3VuZGVmIF9HTElCQ1hYX1NZTVZFUl9HTlVfTkFNRVNQQUNFICovCisKKy8qIERlZmluZSB0byB1c2UgU3VuIHZlcnNpb25pbmcgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAqLworLyogI3VuZGVmIF9HTElCQ1hYX1NZTVZFUl9TVU4gKi8KKworLyogRGVmaW5lIGlmIEM5OSBmdW5jdGlvbnMgb3IgbWFjcm9zIGZyb20gPHdjaGFyLmg+LCA8bWF0aC5oPiwgPGNvbXBsZXguaD4sCisgICA8c3RkaW8uaD4sIGFuZCA8c3RkbGliLmg+IGNhbiBiZSB1c2VkIG9yIGV4cG9zZWQuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DOTkgMQorCisvKiBEZWZpbmUgaWYgQzk5IGZ1bmN0aW9ucyBpbiA8Y29tcGxleC5oPiBzaG91bGQgYmUgdXNlZCBpbiA8Y29tcGxleD4uIFVzaW5nCisgICBjb21waWxlciBidWlsdGlucyBmb3IgdGhlc2UgZnVuY3Rpb25zIHJlcXVpcmVzIGNvcnJlc3BvbmRpbmcgQzk5IGxpYnJhcnkKKyAgIGZ1bmN0aW9ucyB0byBiZSBwcmVzZW50LiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVggMQorCisvKiBEZWZpbmUgaWYgQzk5IGZ1bmN0aW9ucyBpbiA8Y29tcGxleC5oPiBzaG91bGQgYmUgdXNlZCBpbiA8dHIxL2NvbXBsZXg+LgorICAgVXNpbmcgY29tcGlsZXIgYnVpbHRpbnMgZm9yIHRoZXNlIGZ1bmN0aW9ucyByZXF1aXJlcyBjb3JyZXNwb25kaW5nIEM5OQorICAgbGlicmFyeSBmdW5jdGlvbnMgdG8gYmUgcHJlc2VudC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYX1RSMSAxCisKKy8qIERlZmluZSBpZiBDOTkgZnVuY3Rpb25zIGluIDxjdHlwZS5oPiBzaG91bGQgYmUgaW1wb3J0ZWQgaW4gPHRyMS9jY3R5cGU+IGluCisgICBuYW1lc3BhY2Ugc3RkOjp0cjEuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DOTlfQ1RZUEVfVFIxIDEKKworLyogRGVmaW5lIGlmIEM5OSBmdW5jdGlvbnMgaW4gPGZlbnYuaD4gc2hvdWxkIGJlIGltcG9ydGVkIGluIDx0cjEvY2ZlbnY+IGluCisgICBuYW1lc3BhY2Ugc3RkOjp0cjEuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DOTlfRkVOVl9UUjEgMQorCisvKiBEZWZpbmUgaWYgQzk5IGZ1bmN0aW9ucyBpbiA8aW50dHlwZXMuaD4gc2hvdWxkIGJlIGltcG9ydGVkIGluCisgICA8dHIxL2NpbnR0eXBlcz4gaW4gbmFtZXNwYWNlIHN0ZDo6dHIxLiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfQzk5X0lOVFRZUEVTX1RSMSAxCisKKy8qIERlZmluZSBpZiB3Y2hhcl90IEM5OSBmdW5jdGlvbnMgaW4gPGludHR5cGVzLmg+IHNob3VsZCBiZSBpbXBvcnRlZCBpbgorICAgPHRyMS9jaW50dHlwZXM+IGluIG5hbWVzcGFjZSBzdGQ6OnRyMS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0M5OV9JTlRUWVBFU19XQ0hBUl9UX1RSMSAxCisKKy8qIERlZmluZSBpZiBDOTkgZnVuY3Rpb25zIG9yIG1hY3JvcyBpbiA8bWF0aC5oPiBzaG91bGQgYmUgaW1wb3J0ZWQgaW4gPGNtYXRoPgorICAgaW4gbmFtZXNwYWNlIHN0ZC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0M5OV9NQVRIIDEKKworLyogRGVmaW5lIGlmIEM5OSBmdW5jdGlvbnMgb3IgbWFjcm9zIGluIDxtYXRoLmg+IHNob3VsZCBiZSBpbXBvcnRlZCBpbgorICAgPHRyMS9jbWF0aD4gaW4gbmFtZXNwYWNlIHN0ZDo6dHIxLiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxIDEKKworLyogRGVmaW5lIGlmIEM5OSB0eXBlcyBpbiA8c3RkaW50Lmg+IHNob3VsZCBiZSBpbXBvcnRlZCBpbiA8dHIxL2NzdGRpbnQ+IGluCisgICBuYW1lc3BhY2Ugc3RkOjp0cjEuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMSAxCisKKy8qIERlZmluZWQgaWYgY2xvY2tfZ2V0dGltZSBoYXMgbW9ub3RvbmljIGNsb2NrIHN1cHBvcnQuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DTE9DS19NT05PVE9OSUMgMQorCisvKiBEZWZpbmVkIGlmIGNsb2NrX2dldHRpbWUgc3lzY2FsbCBoYXMgbW9ub3RvbmljIGFuZCByZWFsdGltZSBjbG9jayBzdXBwb3J0LiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfQ0xPQ0tfR0VUVElNRV9TWVNDQUxMIDEKKworLyogRGVmaW5lZCBpZiBjbG9ja19nZXR0aW1lIGhhcyByZWFsdGltZSBjbG9jayBzdXBwb3J0LiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfQ0xPQ0tfUkVBTFRJTUUgMQorCisvKiBEZWZpbmUgaWYgSVNPL0lFQyBUUiAyNDczMyBkZWNpbWFsIGZsb2F0aW5nIHBvaW50IHR5cGVzIGFyZSBzdXBwb3J0ZWQgb24KKyAgIHRoaXMgaG9zdC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0RFQ0lNQUxfRkxPQVQgMQorCisvKiBEZWZpbmUgaWYgX19mbG9hdDEyOCBpcyBzdXBwb3J0ZWQgb24gdGhpcyBob3N0LiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfRkxPQVQxMjggMQorCisvKiBEZWZpbmVkIGlmIGdldHRpbWVvZmRheSBpcyBhdmFpbGFibGUuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9HRVRUSU1FT0ZEQVkgMQorCisvKiBEZWZpbmUgaWYgZ2V0X25wcm9jcyBpcyBhdmFpbGFibGUgaW4gPHN5cy9zeXNpbmZvLmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfR0VUX05QUk9DUyAxCisKKy8qIERlZmluZSBpZiBfX2ludDEyOCBpcyBzdXBwb3J0ZWQgb24gdGhpcyBob3N0LiAqLworLyogI3VuZGVmIF9HTElCQ1hYX1VTRV9JTlQxMjggKi8KKworLyogRGVmaW5lIGlmIExGUyBzdXBwb3J0IGlzIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0xGUyAxCisKKy8qIERlZmluZSBpZiBjb2RlIHNwZWNpYWxpemVkIGZvciBsb25nIGxvbmcgc2hvdWxkIGJlIHVzZWQuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9MT05HX0xPTkcgMQorCisvKiBEZWZpbmVkIGlmIG5hbm9zbGVlcCBpcyBhdmFpbGFibGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfVVNFX05BTk9TTEVFUCAqLworCisvKiBEZWZpbmUgaWYgTkxTIHRyYW5zbGF0aW9ucyBhcmUgdG8gYmUgdXNlZC4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9VU0VfTkxTICovCisKKy8qIERlZmluZSBpZiBwdGhyZWFkc19udW1fcHJvY2Vzc29yc19ucCBpcyBhdmFpbGFibGUgaW4gPHB0aHJlYWQuaD4uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfVVNFX1BUSFJFQURTX05VTV9QUk9DRVNTT1JTX05QICovCisKKy8qIERlZmluZSBpZiAvZGV2L3JhbmRvbSBhbmQgL2Rldi91cmFuZG9tIGFyZSBhdmFpbGFibGUgZm9yIHRoZSByYW5kb21fZGV2aWNlCisgICBvZiBUUjEgKENoYXB0ZXIgNS4xKS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX1JBTkRPTV9UUjEgMQorCisvKiBEZWZpbmVkIGlmIHNjaGVkX3lpZWxkIGlzIGF2YWlsYWJsZS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9VU0VfU0NIRURfWUlFTEQgKi8KKworLyogRGVmaW5lIGlmIF9TQ19OUFJPQ0VTU09SU19PTkxOIGlzIGF2YWlsYWJsZSBpbiA8dW5pc3RkLmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfU0NfTlBST0NFU1NPUlNfT05MTiAxCisKKy8qIERlZmluZSBpZiBfU0NfTlBST0NfT05MTiBpcyBhdmFpbGFibGUgaW4gPHVuaXN0ZC5oPi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9VU0VfU0NfTlBST0NfT05MTiAqLworCisvKiBEZWZpbmUgaWYgc3lzY3RsKCksIENUTF9IVyBhbmQgSFdfTkNQVSBhcmUgYXZhaWxhYmxlIGluIDxzeXMvc3lzY3RsLmg+LiAqLworLyogI3VuZGVmIF9HTElCQ1hYX1VTRV9TWVNDVExfSFdfTkNQVSAqLworCisvKiBEZWZpbmUgaWYgY29kZSBzcGVjaWFsaXplZCBmb3Igd2NoYXJfdCBzaG91bGQgYmUgdXNlZC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX1dDSEFSX1QgMQorCisvKiBEZWZpbmUgdG8gMSBpZiBhIHZlcmJvc2UgbGlicmFyeSBpcyBidWlsdCwgb3IgMCBvdGhlcndpc2UuICovCisjZGVmaW5lIF9HTElCQ1hYX1ZFUkJPU0UgMQorCisvKiBEZWZpbmVkIGlmIGFzIGNhbiBoYW5kbGUgcmRyYW5kLiAqLworI2RlZmluZSBfR0xJQkNYWF9YODZfUkRSQU5EIDEKKworLyogRGVmaW5lIHRvIDEgaWYgbXV0ZXhfdGltZWRsb2NrIGlzIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgX0dUSFJFQURfVVNFX01VVEVYX1RJTUVETE9DSyAxCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19BQ09TRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0FDT1NGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9BQ09TRiAxCisjIGRlZmluZSBhY29zZiBfYWNvc2YKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQUNPU0wpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9BQ09TTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQUNPU0wgMQorIyBkZWZpbmUgYWNvc2wgX2Fjb3NsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0FTSU5GKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQVNJTkYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0FTSU5GIDEKKyMgZGVmaW5lIGFzaW5mIF9hc2luZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19BU0lOTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0FTSU5MKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9BU0lOTCAxCisjIGRlZmluZSBhc2lubCBfYXNpbmwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQVRBTjJGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQVRBTjJGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9BVEFOMkYgMQorIyBkZWZpbmUgYXRhbjJmIF9hdGFuMmYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQVRBTjJMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQVRBTjJMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9BVEFOMkwgMQorIyBkZWZpbmUgYXRhbjJsIF9hdGFuMmwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQVRBTkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9BVEFORikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQVRBTkYgMQorIyBkZWZpbmUgYXRhbmYgX2F0YW5mCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0FUQU5MKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQVRBTkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0FUQU5MIDEKKyMgZGVmaW5lIGF0YW5sIF9hdGFubAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19DRUlMRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0NFSUxGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9DRUlMRiAxCisjIGRlZmluZSBjZWlsZiBfY2VpbGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQ0VJTEwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9DRUlMTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQ0VJTEwgMQorIyBkZWZpbmUgY2VpbGwgX2NlaWxsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0NPU0YpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9DT1NGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9DT1NGIDEKKyMgZGVmaW5lIGNvc2YgX2Nvc2YKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQ09TSEYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9DT1NIRikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQ09TSEYgMQorIyBkZWZpbmUgY29zaGYgX2Nvc2hmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0NPU0hMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQ09TSEwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0NPU0hMIDEKKyMgZGVmaW5lIGNvc2hsIF9jb3NobAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19DT1NMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQ09TTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQ09TTCAxCisjIGRlZmluZSBjb3NsIF9jb3NsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0VYUEYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9FWFBGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9FWFBGIDEKKyMgZGVmaW5lIGV4cGYgX2V4cGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRVhQTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0VYUEwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0VYUEwgMQorIyBkZWZpbmUgZXhwbCBfZXhwbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GQUJTRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZBQlNGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GQUJTRiAxCisjIGRlZmluZSBmYWJzZiBfZmFic2YKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRkFCU0wpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GQUJTTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfRkFCU0wgMQorIyBkZWZpbmUgZmFic2wgX2ZhYnNsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0ZJTklURSkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZJTklURSkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfRklOSVRFIDEKKyMgZGVmaW5lIGZpbml0ZSBfZmluaXRlCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0ZJTklURUYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GSU5JVEVGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GSU5JVEVGIDEKKyMgZGVmaW5lIGZpbml0ZWYgX2Zpbml0ZWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRklOSVRFTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZJTklURUwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZJTklURUwgMQorIyBkZWZpbmUgZmluaXRlbCBfZmluaXRlbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GTE9PUkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GTE9PUkYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZMT09SRiAxCisjIGRlZmluZSBmbG9vcmYgX2Zsb29yZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GTE9PUkwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GTE9PUkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZMT09STCAxCisjIGRlZmluZSBmbG9vcmwgX2Zsb29ybAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GTU9ERikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZNT0RGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GTU9ERiAxCisjIGRlZmluZSBmbW9kZiBfZm1vZGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRk1PREwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GTU9ETCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfRk1PREwgMQorIyBkZWZpbmUgZm1vZGwgX2Ztb2RsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0ZQQ0xBU1MpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GUENMQVNTKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GUENMQVNTIDEKKyMgZGVmaW5lIGZwY2xhc3MgX2ZwY2xhc3MKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRlJFWFBGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfRlJFWFBGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GUkVYUEYgMQorIyBkZWZpbmUgZnJleHBmIF9mcmV4cGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRlJFWFBMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfRlJFWFBMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GUkVYUEwgMQorIyBkZWZpbmUgZnJleHBsIF9mcmV4cGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fSFlQT1QpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9IWVBPVCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfSFlQT1QgMQorIyBkZWZpbmUgaHlwb3QgX2h5cG90CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0hZUE9URikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0hZUE9URikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfSFlQT1RGIDEKKyMgZGVmaW5lIGh5cG90ZiBfaHlwb3RmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0hZUE9UTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0hZUE9UTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfSFlQT1RMIDEKKyMgZGVmaW5lIGh5cG90bCBfaHlwb3RsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0lTSU5GKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfSVNJTkYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0lTSU5GIDEKKyMgZGVmaW5lIGlzaW5mIF9pc2luZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19JU0lORkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9JU0lORkYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0lTSU5GRiAxCisjIGRlZmluZSBpc2luZmYgX2lzaW5mZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19JU0lORkwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9JU0lORkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0lTSU5GTCAxCisjIGRlZmluZSBpc2luZmwgX2lzaW5mbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19JU05BTikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0lTTkFOKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9JU05BTiAxCisjIGRlZmluZSBpc25hbiBfaXNuYW4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fSVNOQU5GKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfSVNOQU5GKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9JU05BTkYgMQorIyBkZWZpbmUgaXNuYW5mIF9pc25hbmYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fSVNOQU5MKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfSVNOQU5MKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9JU05BTkwgMQorIyBkZWZpbmUgaXNuYW5sIF9pc25hbmwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTERFWFBGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfTERFWFBGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9MREVYUEYgMQorIyBkZWZpbmUgbGRleHBmIF9sZGV4cGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTERFWFBMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfTERFWFBMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9MREVYUEwgMQorIyBkZWZpbmUgbGRleHBsIF9sZGV4cGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTE9HMTBGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfTE9HMTBGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0cxMEYgMQorIyBkZWZpbmUgbG9nMTBmIF9sb2cxMGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTE9HMTBMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfTE9HMTBMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0cxMEwgMQorIyBkZWZpbmUgbG9nMTBsIF9sb2cxMGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTE9HRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0xPR0YpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0xPR0YgMQorIyBkZWZpbmUgbG9nZiBfbG9nZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19MT0dMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfTE9HTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfTE9HTCAxCisjIGRlZmluZSBsb2dsIF9sb2dsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX01PREYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9NT0RGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9NT0RGIDEKKyMgZGVmaW5lIG1vZGYgX21vZGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTU9ERkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9NT0RGRikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfTU9ERkYgMQorIyBkZWZpbmUgbW9kZmYgX21vZGZmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX01PREZMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfTU9ERkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX01PREZMIDEKKyMgZGVmaW5lIG1vZGZsIF9tb2RmbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19QT1dGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfUE9XRikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfUE9XRiAxCisjIGRlZmluZSBwb3dmIF9wb3dmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1BPV0wpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9QT1dMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9QT1dMIDEKKyMgZGVmaW5lIHBvd2wgX3Bvd2wKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fUUZQQ0xBU1MpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9RRlBDTEFTUykKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfUUZQQ0xBU1MgMQorIyBkZWZpbmUgcWZwY2xhc3MgX3FmcGNsYXNzCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NJTkNPUykgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NJTkNPUykKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0lOQ09TIDEKKyMgZGVmaW5lIHNpbmNvcyBfc2luY29zCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NJTkNPU0YpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9TSU5DT1NGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9TSU5DT1NGIDEKKyMgZGVmaW5lIHNpbmNvc2YgX3NpbmNvc2YKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fU0lOQ09TTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NJTkNPU0wpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkNPU0wgMQorIyBkZWZpbmUgc2luY29zbCBfc2luY29zbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19TSU5GKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfU0lORikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0lORiAxCisjIGRlZmluZSBzaW5mIF9zaW5mCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NJTkhGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfU0lOSEYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkhGIDEKKyMgZGVmaW5lIHNpbmhmIF9zaW5oZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19TSU5ITCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NJTkhMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9TSU5ITCAxCisjIGRlZmluZSBzaW5obCBfc2luaGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fU0lOTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NJTkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkwgMQorIyBkZWZpbmUgc2lubCBfc2lubAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19TUVJURikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NRUlRGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9TUVJURiAxCisjIGRlZmluZSBzcXJ0ZiBfc3FydGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fU1FSVEwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9TUVJUTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1FSVEwgMQorIyBkZWZpbmUgc3FydGwgX3NxcnRsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NUUlRPRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NUUlRPRikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1RSVE9GIDEKKyMgZGVmaW5lIHN0cnRvZiBfc3RydG9mCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NUUlRPTEQpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9TVFJUT0xEKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVFJUT0xEIDEKKyMgZGVmaW5lIHN0cnRvbGQgX3N0cnRvbGQKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fVEFORikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1RBTkYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1RBTkYgMQorIyBkZWZpbmUgdGFuZiBfdGFuZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19UQU5IRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1RBTkhGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9UQU5IRiAxCisjIGRlZmluZSB0YW5oZiBfdGFuaGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fVEFOSEwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9UQU5ITCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfVEFOSEwgMQorIyBkZWZpbmUgdGFuaGwgX3RhbmhsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1RBTkwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9UQU5MKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9UQU5MIDEKKyMgZGVmaW5lIHRhbmwgX3RhbmwKKyNlbmRpZgorCisjZW5kaWYgLy8gX0dMSUJDWFhfQ1hYX0NPTkZJR19ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2MrK2lvLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2MrK2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4YzE4NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvYysraW8uaApAQCAtMCwwICsxLDUwIEBACisvLyBVbmRlcmx5aW5nIGlvIGxpYnJhcnkgZGV0YWlscyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9jKytpby5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aW9zfQorICovCisKKy8vIGNfaW9fc3RkaW8uaCAtIERlZmluZXMgZm9yIHVzaW5nICJDIiBzdGRpby5oCisKKyNpZm5kZWYgX0dMSUJDWFhfQ1hYX0lPX0gKKyNkZWZpbmUgX0dMSUJDWFhfQ1hYX0lPX0ggMQorCisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGJpdHMvZ3Roci5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdHlwZWRlZiBfX2d0aHJlYWRfbXV0ZXhfdCBfX2NfbG9jazsKKworICAvLyBmb3IgYmFzaWNfZmlsZS5oCisgIHR5cGVkZWYgRklMRSBfX2NfZmlsZTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvYysrbG9jYWxlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2MrK2xvY2FsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOGQ5NzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2MrK2xvY2FsZS5oCkBAIC0wLDAgKzEsMTE0IEBACisvLyBXcmFwcGVyIGZvciB1bmRlcmx5aW5nIEMtbGFuZ3VhZ2UgbG9jYWxpemF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2MrK2xvY2FsZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bG9jYWxlfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMi44ICBTdGFuZGFyZCBsb2NhbGUgY2F0ZWdvcmllcy4KKy8vCisKKy8vIFdyaXR0ZW4gYnkgQmVuamFtaW4gS29zbmlrIDxia296QHJlZGhhdC5jb20+CisKKyNpZm5kZWYgX0dMSUJDWFhfQ1hYX0xPQ0FMRV9ICisjZGVmaW5lIF9HTElCQ1hYX0NYWF9MT0NBTEVfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGNsb2NhbGU+CisKKyNkZWZpbmUgX0dMSUJDWFhfQ19MT0NBTEVfR05VIDEKKworI2RlZmluZSBfR0xJQkNYWF9OVU1fQ0FURUdPUklFUyA2CisKKyNpZiBfX0dMSUJDX18gPiAyIHx8IChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPiAyKQorbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIGV4dGVybiAiQyIgX190eXBlb2YodXNlbG9jYWxlKSBfX3VzZWxvY2FsZTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0eXBlZGVmIF9fbG9jYWxlX3QJCV9fY19sb2NhbGU7CisKKyAgLy8gQ29udmVydCBudW1lcmljIHZhbHVlIG9mIHR5cGUgZG91YmxlIGFuZCBsb25nIGRvdWJsZSB0byBzdHJpbmcgYW5kCisgIC8vIHJldHVybiBsZW5ndGggb2Ygc3RyaW5nLiAgSWYgdnNucHJpbnRmIGlzIGF2YWlsYWJsZSB1c2UgaXQsIG90aGVyd2lzZQorICAvLyBmYWxsIGJhY2sgdG8gdGhlIHVuc2FmZSB2c3ByaW50ZiB3aGljaCwgaW4gZ2VuZXJhbCwgY2FuIGJlIGRhbmdlcm91cworICAvLyBhbmQgc2hvdWxkIGJlIGF2b2lkZWQuCisgIGlubGluZSBpbnQKKyAgX19jb252ZXJ0X2Zyb21fdihjb25zdCBfX2NfbG9jYWxlJiBfX2Nsb2MgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKSwKKwkJICAgY2hhciogX19vdXQsCisJCSAgIGNvbnN0IGludCBfX3NpemUgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKSwKKwkJICAgY29uc3QgY2hhciogX19mbXQsIC4uLikKKyAgeworI2lmIF9fR0xJQkNfXyA+IDIgfHwgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+IDIpCisgICAgX19jX2xvY2FsZSBfX29sZCA9IF9fZ251X2N4eDo6X191c2Vsb2NhbGUoX19jbG9jKTsKKyNlbHNlCisgICAgY2hhciogX19vbGQgPSBzdGQ6OnNldGxvY2FsZShMQ19OVU1FUklDLCAwKTsKKyAgICBjaGFyKiBfX3NhdiA9IDA7CisgICAgaWYgKF9fYnVpbHRpbl9zdHJjbXAoX19vbGQsICJDIikpCisgICAgICB7CisJY29uc3Qgc2l6ZV90IF9fbGVuID0gX19idWlsdGluX3N0cmxlbihfX29sZCkgKyAxOworCV9fc2F2ID0gbmV3IGNoYXJbX19sZW5dOworCV9fYnVpbHRpbl9tZW1jcHkoX19zYXYsIF9fb2xkLCBfX2xlbik7CisJc3RkOjpzZXRsb2NhbGUoTENfTlVNRVJJQywgIkMiKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgX19idWlsdGluX3ZhX2xpc3QgX19hcmdzOworICAgIF9fYnVpbHRpbl92YV9zdGFydChfX2FyZ3MsIF9fZm10KTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTkKKyAgICBjb25zdCBpbnQgX19yZXQgPSBfX2J1aWx0aW5fdnNucHJpbnRmKF9fb3V0LCBfX3NpemUsIF9fZm10LCBfX2FyZ3MpOworI2Vsc2UKKyAgICBjb25zdCBpbnQgX19yZXQgPSBfX2J1aWx0aW5fdnNwcmludGYoX19vdXQsIF9fZm10LCBfX2FyZ3MpOworI2VuZGlmCisKKyAgICBfX2J1aWx0aW5fdmFfZW5kKF9fYXJncyk7CisKKyNpZiBfX0dMSUJDX18gPiAyIHx8IChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPiAyKQorICAgIF9fZ251X2N4eDo6X191c2Vsb2NhbGUoX19vbGQpOworI2Vsc2UKKyAgICBpZiAoX19zYXYpCisgICAgICB7CisJc3RkOjpzZXRsb2NhbGUoTENfTlVNRVJJQywgX19zYXYpOworCWRlbGV0ZSBbXSBfX3NhdjsKKyAgICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBfX3JldDsKKyAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9jcHVfZGVmaW5lcy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9jcHVfZGVmaW5lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ODFkM2YKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2NwdV9kZWZpbmVzLmgKQEAgLTAsMCArMSwzMyBAQAorLy8gU3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yIGdlbmVyaWMgcGxhdGZvcm1zICAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9jcHVfZGVmaW5lcy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aW9zZndkfQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQ1BVX0RFRklORVMKKyNkZWZpbmUgX0dMSUJDWFhfQ1BVX0RFRklORVMgMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvY3R5cGVfYmFzZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9jdHlwZV9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4ZTk3OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvY3R5cGVfYmFzZS5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vIExvY2FsZSBzdXBwb3J0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2N0eXBlX2Jhc2UuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2xvY2FsZX0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjIuMSAgTG9jYWxlcworLy8KKworLy8gSW5mb3JtYXRpb24gYXMgZ2xlYW5lZCBmcm9tIC91c3IvaW5jbHVkZS9jdHlwZS5oCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLy8gQGJyaWVmICBCYXNlIGNsYXNzIGZvciBjdHlwZS4KKyAgc3RydWN0IGN0eXBlX2Jhc2UKKyAgeworICAgIC8vIE5vbi1zdGFuZGFyZCB0eXBlZGVmcy4KKyAgICB0eXBlZGVmIGNvbnN0IGludCogCQlfX3RvX3R5cGU7CisKKyAgICAvLyBOQjogT2Zmc2V0cyBpbnRvIGN0eXBlPGNoYXI+OjpfTV90YWJsZSBmb3JjZSBhIHBhcnRpY3VsYXIgc2l6ZQorICAgIC8vIG9uIHRoZSBtYXNrIHR5cGUuIEJlY2F1c2Ugb2YgdGhpcywgd2UgZG9uJ3QgdXNlIGFuIGVudW0uCisgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAJbWFzazsKKyAgICBzdGF0aWMgY29uc3QgbWFzayB1cHBlciAgICAJPSBfSVN1cHBlcjsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBsb3dlciAJPSBfSVNsb3dlcjsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBhbHBoYSAJPSBfSVNhbHBoYTsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBkaWdpdCAJPSBfSVNkaWdpdDsKKyAgICBzdGF0aWMgY29uc3QgbWFzayB4ZGlnaXQgCT0gX0lTeGRpZ2l0OworICAgIHN0YXRpYyBjb25zdCBtYXNrIHNwYWNlIAk9IF9JU3NwYWNlOworICAgIHN0YXRpYyBjb25zdCBtYXNrIHByaW50IAk9IF9JU3ByaW50OworICAgIHN0YXRpYyBjb25zdCBtYXNrIGdyYXBoIAk9IF9JU2FscGhhIHwgX0lTZGlnaXQgfCBfSVNwdW5jdDsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBjbnRybCAJPSBfSVNjbnRybDsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBwdW5jdCAJPSBfSVNwdW5jdDsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBhbG51bSAJPSBfSVNhbHBoYSB8IF9JU2RpZ2l0OworICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2N0eXBlX2lubGluZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9jdHlwZV9pbmxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDYzMTdiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9jdHlwZV9pbmxpbmUuaApAQCAtMCwwICsxLDc2IEBACisvLyBMb2NhbGUgc3VwcG9ydCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9jdHlwZV9pbmxpbmUuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2xvY2FsZX0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjIuMSAgTG9jYWxlcworLy8KKworLy8gY3R5cGUgYml0cyB0byBiZSBpbmxpbmVkIGdvIGhlcmUuIE5vbi1pbmxpbmFibGUgKGllIHZpcnR1YWwgZG9fKikKKy8vIGZ1bmN0aW9ucyBnbyBpbiBjdHlwZS5jYworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgYm9vbAorICBjdHlwZTxjaGFyPjo6CisgIGlzKG1hc2sgX19tLCBjaGFyIF9fYykgY29uc3QKKyAgeyByZXR1cm4gX01fdGFibGVbc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oX19jKV0gJiBfX207IH0KKworICBjb25zdCBjaGFyKgorICBjdHlwZTxjaGFyPjo6CisgIGlzKGNvbnN0IGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gsIG1hc2sqIF9fdmVjKSBjb25zdAorICB7CisgICAgd2hpbGUgKF9fbG93IDwgX19oaWdoKQorICAgICAgKl9fdmVjKysgPSBfTV90YWJsZVtzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigqX19sb3crKyldOworICAgIHJldHVybiBfX2hpZ2g7CisgIH0KKworICBjb25zdCBjaGFyKgorICBjdHlwZTxjaGFyPjo6CisgIHNjYW5faXMobWFzayBfX20sIGNvbnN0IGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gpIGNvbnN0CisgIHsKKyAgICB3aGlsZSAoX19sb3cgPCBfX2hpZ2gKKwkgICAmJiAhKF9NX3RhYmxlW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KCpfX2xvdyldICYgX19tKSkKKyAgICAgICsrX19sb3c7CisgICAgcmV0dXJuIF9fbG93OworICB9CisKKyAgY29uc3QgY2hhcioKKyAgY3R5cGU8Y2hhcj46OgorICBzY2FuX25vdChtYXNrIF9fbSwgY29uc3QgY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCkgY29uc3QKKyAgeworICAgIHdoaWxlIChfX2xvdyA8IF9faGlnaAorCSAgICYmIChfTV90YWJsZVtzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigqX19sb3cpXSAmIF9fbSkgIT0gMCkKKyAgICAgICsrX19sb3c7CisgICAgcmV0dXJuIF9fbG93OworICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvY3h4YWJpX3R3ZWFrcy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9jeHhhYmlfdHdlYWtzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU4OTUzOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvY3h4YWJpX3R3ZWFrcy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8vIENvbnRyb2wgdmFyaW91cyB0YXJnZXQgc3BlY2lmaWMgQUJJIHR3ZWFrcy4gIEdlbmVyaWMgdmVyc2lvbi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvY3h4YWJpX3R3ZWFrcy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7Y3h4YWJpLmh9CisgKi8KKworI2lmbmRlZiBfQ1hYQUJJX1RXRUFLU19ICisjZGVmaW5lIF9DWFhBQklfVFdFQUtTX0ggMQorCisjaWZkZWYgX19jcGx1c3BsdXMKK25hbWVzcGFjZSBfX2N4eGFiaXYxCit7CisgIGV4dGVybiAiQyIgCisgIHsKKyNlbmRpZgorCisgIC8vIFRoZSBnZW5lcmljIEFCSSB1c2VzIHRoZSBmaXJzdCBieXRlIG9mIGEgNjQtYml0IGd1YXJkIHZhcmlhYmxlLgorI2RlZmluZSBfR0xJQkNYWF9HVUFSRF9URVNUKHgpICgqKGNoYXIgKikgKHgpICE9IDApCisjZGVmaW5lIF9HTElCQ1hYX0dVQVJEX1NFVCh4KSAqKGNoYXIgKikgKHgpID0gMQorI2RlZmluZSBfR0xJQkNYWF9HVUFSRF9CSVQgX19ndWFyZF90ZXN0X2JpdCAoMCwgMSkKKyNkZWZpbmUgX0dMSUJDWFhfR1VBUkRfUEVORElOR19CSVQgX19ndWFyZF90ZXN0X2JpdCAoMSwgMSkKKyNkZWZpbmUgX0dMSUJDWFhfR1VBUkRfV0FJVElOR19CSVQgX19ndWFyZF90ZXN0X2JpdCAoMiwgMSkKKyAgX19leHRlbnNpb25fXyB0eXBlZGVmIGludCBfX2d1YXJkIF9fYXR0cmlidXRlX18oKG1vZGUgKF9fRElfXykpKTsKKworICAvLyBfX2N4YV92ZWNfY3RvciBoYXMgdm9pZCByZXR1cm4gdHlwZS4KKyAgdHlwZWRlZiB2b2lkIF9fY3hhX3ZlY19jdG9yX3JldHVybl90eXBlOworI2RlZmluZSBfR0xJQkNYWF9DWEFfVkVDX0NUT1JfUkVUVVJOKHgpIHJldHVybgorICAvLyBDb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGRvIG5vdCByZXR1cm4gYSB2YWx1ZS4KKyAgdHlwZWRlZiB2b2lkIF9fY3hhX2NkdG9yX3JldHVybl90eXBlOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgfQorfSAvLyBuYW1lc3BhY2UgX19jeHhhYml2MQorI2VuZGlmCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvZXJyb3JfY29uc3RhbnRzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2Vycm9yX2NvbnN0YW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNmQ4ODkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2Vycm9yX2NvbnN0YW50cy5oCkBAIC0wLDAgKzEsMTc4IEBACisvLyBTcGVjaWZpYyBkZWZpbml0aW9ucyBmb3IgZ2VuZXJpYyBwbGF0Zm9ybXMgIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2Vycm9yX2NvbnN0YW50cy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7c3lzdGVtX2Vycm9yfQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfRVJST1JfQ09OU1RBTlRTCisjZGVmaW5lIF9HTElCQ1hYX0VSUk9SX0NPTlNUQU5UUyAxCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGNlcnJubz4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIGVudW0gY2xhc3MgZXJyYworICAgIHsKKyAgICAgIGFkZHJlc3NfZmFtaWx5X25vdF9zdXBwb3J0ZWQgPSAJCUVBRk5PU1VQUE9SVCwKKyAgICAgIGFkZHJlc3NfaW5fdXNlID0gCQkJCUVBRERSSU5VU0UsCisgICAgICBhZGRyZXNzX25vdF9hdmFpbGFibGUgPSAJCQlFQUREUk5PVEFWQUlMLAorICAgICAgYWxyZWFkeV9jb25uZWN0ZWQgPSAJCQlFSVNDT05OLAorICAgICAgYXJndW1lbnRfbGlzdF90b29fbG9uZyA9IAkJCUUyQklHLAorICAgICAgYXJndW1lbnRfb3V0X29mX2RvbWFpbiA9IAkJCUVET00sCisgICAgICBiYWRfYWRkcmVzcyA9IAkJCQlFRkFVTFQsCisgICAgICBiYWRfZmlsZV9kZXNjcmlwdG9yID0gCQkJRUJBREYsCisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0VCQURNU0cKKyAgICAgIGJhZF9tZXNzYWdlID0gCQkJCUVCQURNU0csCisjZW5kaWYKKworICAgICAgYnJva2VuX3BpcGUgPSAJCQkJRVBJUEUsCisgICAgICBjb25uZWN0aW9uX2Fib3J0ZWQgPSAJCQlFQ09OTkFCT1JURUQsCisgICAgICBjb25uZWN0aW9uX2FscmVhZHlfaW5fcHJvZ3Jlc3MgPSAJCUVBTFJFQURZLAorICAgICAgY29ubmVjdGlvbl9yZWZ1c2VkID0gCQkJRUNPTk5SRUZVU0VELAorICAgICAgY29ubmVjdGlvbl9yZXNldCA9IAkJCUVDT05OUkVTRVQsCisgICAgICBjcm9zc19kZXZpY2VfbGluayA9IAkJCUVYREVWLAorICAgICAgZGVzdGluYXRpb25fYWRkcmVzc19yZXF1aXJlZCA9IAkJRURFU1RBRERSUkVRLAorICAgICAgZGV2aWNlX29yX3Jlc291cmNlX2J1c3kgPSAJCUVCVVNZLAorICAgICAgZGlyZWN0b3J5X25vdF9lbXB0eSA9IAkJCUVOT1RFTVBUWSwKKyAgICAgIGV4ZWN1dGFibGVfZm9ybWF0X2Vycm9yID0gCQlFTk9FWEVDLAorICAgICAgZmlsZV9leGlzdHMgPSAJICAgICAgIAkJCUVFWElTVCwKKyAgICAgIGZpbGVfdG9vX2xhcmdlID0gCQkJCUVGQklHLAorICAgICAgZmlsZW5hbWVfdG9vX2xvbmcgPSAJCQlFTkFNRVRPT0xPTkcsCisgICAgICBmdW5jdGlvbl9ub3Rfc3VwcG9ydGVkID0gCQkJRU5PU1lTLAorICAgICAgaG9zdF91bnJlYWNoYWJsZSA9IAkJCUVIT1NUVU5SRUFDSCwKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRUlEUk0KKyAgICAgIGlkZW50aWZpZXJfcmVtb3ZlZCA9IAkJCUVJRFJNLAorI2VuZGlmCisKKyAgICAgIGlsbGVnYWxfYnl0ZV9zZXF1ZW5jZSA9IAkJCUVJTFNFUSwKKyAgICAgIGluYXBwcm9wcmlhdGVfaW9fY29udHJvbF9vcGVyYXRpb24gPSAJRU5PVFRZLAorICAgICAgaW50ZXJydXB0ZWQgPSAJCQkJRUlOVFIsCisgICAgICBpbnZhbGlkX2FyZ3VtZW50ID0gCQkJRUlOVkFMLAorICAgICAgaW52YWxpZF9zZWVrID0gCQkJCUVTUElQRSwKKyAgICAgIGlvX2Vycm9yID0gCQkJCUVJTywKKyAgICAgIGlzX2FfZGlyZWN0b3J5ID0gCQkJCUVJU0RJUiwKKyAgICAgIG1lc3NhZ2Vfc2l6ZSA9IAkJCQlFTVNHU0laRSwKKyAgICAgIG5ldHdvcmtfZG93biA9IAkJCQlFTkVURE9XTiwKKyAgICAgIG5ldHdvcmtfcmVzZXQgPSAJCQkJRU5FVFJFU0VULAorICAgICAgbmV0d29ya191bnJlYWNoYWJsZSA9IAkJCUVORVRVTlJFQUNILAorICAgICAgbm9fYnVmZmVyX3NwYWNlID0gCQkJRU5PQlVGUywKKyAgICAgIG5vX2NoaWxkX3Byb2Nlc3MgPSAJCQlFQ0hJTEQsCisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0VOT0xJTksKKyAgICAgIG5vX2xpbmsgPSAJCQkJRU5PTElOSywKKyNlbmRpZgorCisgICAgICBub19sb2NrX2F2YWlsYWJsZSA9IAkJCUVOT0xDSywKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRU5PREFUQQorICAgICAgbm9fbWVzc2FnZV9hdmFpbGFibGUgPSAJCQlFTk9EQVRBLCAKKyNlbmRpZgorCisgICAgICBub19tZXNzYWdlID0gCQkJCUVOT01TRywgCisgICAgICBub19wcm90b2NvbF9vcHRpb24gPSAJCQlFTk9QUk9UT09QVCwKKyAgICAgIG5vX3NwYWNlX29uX2RldmljZSA9IAkJCUVOT1NQQywKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRU5PU1IKKyAgICAgIG5vX3N0cmVhbV9yZXNvdXJjZXMgPSAJCQlFTk9TUiwKKyNlbmRpZgorCisgICAgICBub19zdWNoX2RldmljZV9vcl9hZGRyZXNzID0gCQlFTlhJTywKKyAgICAgIG5vX3N1Y2hfZGV2aWNlID0gCQkJCUVOT0RFViwKKyAgICAgIG5vX3N1Y2hfZmlsZV9vcl9kaXJlY3RvcnkgPSAJCUVOT0VOVCwKKyAgICAgIG5vX3N1Y2hfcHJvY2VzcyA9IAkJCUVTUkNILAorICAgICAgbm90X2FfZGlyZWN0b3J5ID0gCQkJRU5PVERJUiwKKyAgICAgIG5vdF9hX3NvY2tldCA9IAkJCQlFTk9UU09DSywKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRU5PU1RSCisgICAgICBub3RfYV9zdHJlYW0gPSAJCQkJRU5PU1RSLAorI2VuZGlmCisKKyAgICAgIG5vdF9jb25uZWN0ZWQgPSAJCQkJRU5PVENPTk4sCisgICAgICBub3RfZW5vdWdoX21lbW9yeSA9IAkJCUVOT01FTSwKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRU5PVFNVUAorICAgICAgbm90X3N1cHBvcnRlZCA9IAkJCQlFTk9UU1VQLAorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0VDQU5DRUxFRAorICAgICAgb3BlcmF0aW9uX2NhbmNlbGVkID0gCQkJRUNBTkNFTEVELAorI2VuZGlmCisKKyAgICAgIG9wZXJhdGlvbl9pbl9wcm9ncmVzcyA9IAkJCUVJTlBST0dSRVNTLAorICAgICAgb3BlcmF0aW9uX25vdF9wZXJtaXR0ZWQgPSAJCUVQRVJNLAorICAgICAgb3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQgPSAJCUVPUE5PVFNVUFAsCisgICAgICBvcGVyYXRpb25fd291bGRfYmxvY2sgPSAJCQlFV09VTERCTE9DSywKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRU9XTkVSREVBRAorICAgICAgb3duZXJfZGVhZCA9IAkJCQlFT1dORVJERUFELAorI2VuZGlmCisKKyAgICAgIHBlcm1pc3Npb25fZGVuaWVkID0gCQkJRUFDQ0VTLAorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FUFJPVE8KKyAgICAgIHByb3RvY29sX2Vycm9yID0gCQkJCUVQUk9UTywKKyNlbmRpZgorCisgICAgICBwcm90b2NvbF9ub3Rfc3VwcG9ydGVkID0gCQkJRVBST1RPTk9TVVBQT1JULAorICAgICAgcmVhZF9vbmx5X2ZpbGVfc3lzdGVtID0gCQkJRVJPRlMsCisgICAgICByZXNvdXJjZV9kZWFkbG9ja193b3VsZF9vY2N1ciA9IAkJRURFQURMSywKKyAgICAgIHJlc291cmNlX3VuYXZhaWxhYmxlX3RyeV9hZ2FpbiA9IAkJRUFHQUlOLAorICAgICAgcmVzdWx0X291dF9vZl9yYW5nZSA9IAkJCUVSQU5HRSwKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRU5PVFJFQ09WRVJBQkxFCisgICAgICBzdGF0ZV9ub3RfcmVjb3ZlcmFibGUgPSAJCQlFTk9UUkVDT1ZFUkFCTEUsCisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRVRJTUUKKyAgICAgIHN0cmVhbV90aW1lb3V0ID0gCQkJCUVUSU1FLAorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0VUWFRCU1kKKyAgICAgIHRleHRfZmlsZV9idXN5ID0gCQkJCUVUWFRCU1ksCisjZW5kaWYKKworICAgICAgdGltZWRfb3V0ID0gCQkJCUVUSU1FRE9VVCwKKyAgICAgIHRvb19tYW55X2ZpbGVzX29wZW5faW5fc3lzdGVtID0gCQlFTkZJTEUsCisgICAgICB0b29fbWFueV9maWxlc19vcGVuID0gCQkJRU1GSUxFLAorICAgICAgdG9vX21hbnlfbGlua3MgPSAJCQkJRU1MSU5LLAorICAgICAgdG9vX21hbnlfc3ltYm9saWNfbGlua19sZXZlbHMgPSAJCUVMT09QLAorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FT1ZFUkZMT1cKKyAgICAgIHZhbHVlX3Rvb19sYXJnZSA9IAkJCUVPVkVSRkxPVywKKyNlbmRpZgorCisgICAgICB3cm9uZ19wcm90b2NvbF90eXBlID0gCQkJRVBST1RPVFlQRQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2V4dGMrKy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9leHRjKysuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGE5ZWZmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9leHRjKysuaApAQCAtMCwwICsxLDcxIEBACisvLyBDKysgaW5jbHVkZXMgdXNlZCBmb3IgcHJlY29tcGlsaW5nIGV4dGVuc2lvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dGMrKy5oCisgKiAgVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBmaWxlIGZvciBhIHByZWNvbXBpbGVkIGhlYWRlci4KKyAqLworCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjaW5jbHVkZSA8Yml0cy9zdGR0cjFjKysuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZXh0L2FsZ29yaXRobT4KKyNpbmNsdWRlIDxleHQvYXJyYXlfYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8ZXh0L2F0b21pY2l0eS5oPgorI2luY2x1ZGUgPGV4dC9iaXRtYXBfYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8ZXh0L2Nhc3QuaD4KKyNpbmNsdWRlIDxleHQvY29uY3VycmVuY2UuaD4KKyNpbmNsdWRlIDxleHQvZGVidWdfYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8ZXh0L2V4dHB0cl9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxleHQvZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxleHQvaXRlcmF0b3I+CisjaW5jbHVkZSA8ZXh0L21hbGxvY19hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxleHQvbWVtb3J5PgorI2luY2x1ZGUgPGV4dC9tdF9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxleHQvbmV3X2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGV4dC9udW1lcmljPgorI2luY2x1ZGUgPGV4dC9wb2RfY2hhcl90cmFpdHMuaD4KKyNpbmNsdWRlIDxleHQvcG9pbnRlci5oPgorI2luY2x1ZGUgPGV4dC9wb29sX2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGV4dC9yYl90cmVlPgorI2luY2x1ZGUgPGV4dC9yb3BlPgorI2luY2x1ZGUgPGV4dC9zbGlzdD4KKyNpbmNsdWRlIDxleHQvc3RkaW9fZmlsZWJ1Zi5oPgorI2luY2x1ZGUgPGV4dC9zdGRpb19zeW5jX2ZpbGVidWYuaD4KKyNpbmNsdWRlIDxleHQvdGhyb3dfYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8ZXh0L3R5cGVsaXN0Lmg+CisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8ZXh0L3ZzdHJpbmcuaD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvcHJpb3JpdHlfcXVldWUuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9leGNlcHRpb24uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9oYXNoX3BvbGljeS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2xpc3RfdXBkYXRlX3BvbGljeS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvdHJpZV9wb2xpY3kuaHBwPgorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9JQ09OVgorICNpbmNsdWRlIDxleHQvY29kZWN2dF9zcGVjaWFsaXphdGlvbnMuaD4KKyAjaW5jbHVkZSA8ZXh0L2VuY19maWxlYnVmLmg+CisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvZ3Roci1kZWZhdWx0LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2d0aHItZGVmYXVsdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNzFiMTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2d0aHItZGVmYXVsdC5oCkBAIC0wLDAgKzEsODg5IEBACisvKiBUaHJlYWRzIGNvbXBhdGliaWxpdHkgcm91dGluZXMgZm9yIGxpYmdjYzIgYW5kIGxpYm9iamMuICAqLworLyogQ29tcGlsZSB0aGlzIG9uZSB3aXRoIGdjYy4gICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9HQ0NfR1RIUl9QT1NJWF9ICisjZGVmaW5lIF9HTElCQ1hYX0dDQ19HVEhSX1BPU0lYX0gKKworLyogUE9TSVggdGhyZWFkcyBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAgIEVhc3ksIHNpbmNlIHRoZSBpbnRlcmZhY2UgaXMganVzdCBvbmUtdG8tb25lIG1hcHBpbmcuICAqLworCisjZGVmaW5lIF9fR1RIUkVBRFMgMQorI2RlZmluZSBfX0dUSFJFQURTX0NYWDBYIDEKKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2lmICgoZGVmaW5lZChfTElCT0JKQykgfHwgZGVmaW5lZChfTElCT0JKQ19XRUFLKSkgXAorICAgICB8fCAhZGVmaW5lZChfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLKSkKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGlmIGRlZmluZWQoX1BPU0lYX1RJTUVPVVRTKSAmJiBfUE9TSVhfVElNRU9VVFMgPj0gMAorIyAgZGVmaW5lIF9HVEhSRUFEX1VTRV9NVVRFWF9USU1FRExPQ0sgMQorIyBlbHNlCisjICBkZWZpbmUgX0dUSFJFQURfVVNFX01VVEVYX1RJTUVETE9DSyAwCisjIGVuZGlmCisjZW5kaWYKKwordHlwZWRlZiBwdGhyZWFkX3QgX19ndGhyZWFkX3Q7Cit0eXBlZGVmIHB0aHJlYWRfa2V5X3QgX19ndGhyZWFkX2tleV90OwordHlwZWRlZiBwdGhyZWFkX29uY2VfdCBfX2d0aHJlYWRfb25jZV90OwordHlwZWRlZiBwdGhyZWFkX211dGV4X3QgX19ndGhyZWFkX211dGV4X3Q7Cit0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3Q7Cit0eXBlZGVmIHB0aHJlYWRfY29uZF90IF9fZ3RocmVhZF9jb25kX3Q7Cit0eXBlZGVmIHN0cnVjdCB0aW1lc3BlYyBfX2d0aHJlYWRfdGltZV90OworCisvKiBQT1NJWCBsaWtlIGNvbmRpdGlvbmFsIHZhcmlhYmxlcyBhcmUgc3VwcG9ydGVkLiAgUGxlYXNlIGxvb2sgYXQgY29tbWVudHMKKyAgIGluIGd0aHIuaCBmb3IgZGV0YWlscy4gKi8KKyNkZWZpbmUgX19HVEhSRUFEX0hBU19DT05ECTEKKworI2RlZmluZSBfX0dUSFJFQURfTVVURVhfSU5JVCBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSCisjZGVmaW5lIF9fR1RIUkVBRF9NVVRFWF9JTklUX0ZVTkNUSU9OIF9fZ3RocmVhZF9tdXRleF9pbml0X2Z1bmN0aW9uCisjZGVmaW5lIF9fR1RIUkVBRF9PTkNFX0lOSVQgUFRIUkVBRF9PTkNFX0lOSVQKKyNpZiBkZWZpbmVkKFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSKQorI2RlZmluZSBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVQgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVIKKyNlbGlmIGRlZmluZWQoUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlApCisjZGVmaW5lIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVCBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUAorI2Vsc2UKKyNkZWZpbmUgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkNUSU9OIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfaW5pdF9mdW5jdGlvbgorI2VuZGlmCisjZGVmaW5lIF9fR1RIUkVBRF9DT05EX0lOSVQgUFRIUkVBRF9DT05EX0lOSVRJQUxJWkVSCisjZGVmaW5lIF9fR1RIUkVBRF9USU1FX0lOSVQgezAsMH0KKworI2lmZGVmIF9HVEhSRUFEX1VTRV9NVVRFWF9JTklUX0ZVTkMKKyMgdW5kZWYgX19HVEhSRUFEX01VVEVYX0lOSVQKKyNlbmRpZgorI2lmZGVmIF9HVEhSRUFEX1VTRV9SRUNVUlNJVkVfTVVURVhfSU5JVF9GVU5DCisjIHVuZGVmIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVAorIyB1bmRlZiBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRfRlVOQ1RJT04KKyMgZGVmaW5lIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVF9GVU5DVElPTiBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2luaXRfZnVuY3Rpb24KKyNlbmRpZgorI2lmZGVmIF9HVEhSRUFEX1VTRV9DT05EX0lOSVRfRlVOQworIyB1bmRlZiBfX0dUSFJFQURfQ09ORF9JTklUCisjIGRlZmluZSBfX0dUSFJFQURfQ09ORF9JTklUX0ZVTkNUSU9OIF9fZ3RocmVhZF9jb25kX2luaXRfZnVuY3Rpb24KKyNlbmRpZgorCisjaWYgX19HWFhfV0VBS19fICYmIF9HTElCQ1hYX0dUSFJFQURfVVNFX1dFQUsKKyMgaWZuZGVmIF9fZ3RocndfcHJhZ21hCisjICBkZWZpbmUgX19ndGhyd19wcmFnbWEocHJhZ21hKQorIyBlbmRpZgorIyBkZWZpbmUgX19ndGhydzIobmFtZSxuYW1lMix0eXBlKSBcCisgIHN0YXRpYyBfX3R5cGVvZih0eXBlKSBuYW1lIF9fYXR0cmlidXRlX18gKChfX3dlYWtyZWZfXygjbmFtZTIpKSk7IFwKKyAgX19ndGhyd19wcmFnbWEod2VhayB0eXBlKQorIyBkZWZpbmUgX19ndGhyd18obmFtZSkgX19ndGhyd18gIyMgbmFtZQorI2Vsc2UKKyMgZGVmaW5lIF9fZ3RocncyKG5hbWUsbmFtZTIsdHlwZSkKKyMgZGVmaW5lIF9fZ3RocndfKG5hbWUpIG5hbWUKKyNlbmRpZgorCisvKiBUeXBpY2FsbHksIF9fZ3RocndfZm9vIGlzIGEgd2VhayByZWZlcmVuY2UgdG8gc3ltYm9sIGZvby4gICovCisjZGVmaW5lIF9fZ3RocncobmFtZSkgX19ndGhydzIoX19ndGhyd18gIyMgbmFtZSxuYW1lLG5hbWUpCisKK19fZ3RocncocHRocmVhZF9vbmNlKQorX19ndGhydyhwdGhyZWFkX2dldHNwZWNpZmljKQorX19ndGhydyhwdGhyZWFkX3NldHNwZWNpZmljKQorCitfX2d0aHJ3KHB0aHJlYWRfY3JlYXRlKQorX19ndGhydyhwdGhyZWFkX2pvaW4pCitfX2d0aHJ3KHB0aHJlYWRfZXF1YWwpCitfX2d0aHJ3KHB0aHJlYWRfc2VsZikKK19fZ3RocncocHRocmVhZF9kZXRhY2gpCisjaWZuZGVmIF9fQklPTklDX18KK19fZ3RocncocHRocmVhZF9jYW5jZWwpCisjZW5kaWYKK19fZ3Rocncoc2NoZWRfeWllbGQpCisKK19fZ3RocncocHRocmVhZF9tdXRleF9sb2NrKQorX19ndGhydyhwdGhyZWFkX211dGV4X3RyeWxvY2spCisjaWYgX0dUSFJFQURfVVNFX01VVEVYX1RJTUVETE9DSworX19ndGhydyhwdGhyZWFkX211dGV4X3RpbWVkbG9jaykKKyNlbmRpZgorX19ndGhydyhwdGhyZWFkX211dGV4X3VubG9jaykKK19fZ3RocncocHRocmVhZF9tdXRleF9pbml0KQorX19ndGhydyhwdGhyZWFkX211dGV4X2Rlc3Ryb3kpCisKK19fZ3RocncocHRocmVhZF9jb25kX2luaXQpCitfX2d0aHJ3KHB0aHJlYWRfY29uZF9icm9hZGNhc3QpCitfX2d0aHJ3KHB0aHJlYWRfY29uZF9zaWduYWwpCitfX2d0aHJ3KHB0aHJlYWRfY29uZF93YWl0KQorX19ndGhydyhwdGhyZWFkX2NvbmRfdGltZWR3YWl0KQorX19ndGhydyhwdGhyZWFkX2NvbmRfZGVzdHJveSkKKworX19ndGhydyhwdGhyZWFkX2tleV9jcmVhdGUpCitfX2d0aHJ3KHB0aHJlYWRfa2V5X2RlbGV0ZSkKK19fZ3RocncocHRocmVhZF9tdXRleGF0dHJfaW5pdCkKK19fZ3RocncocHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSkKK19fZ3RocncocHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSkKKworCisjaWYgZGVmaW5lZChfTElCT0JKQykgfHwgZGVmaW5lZChfTElCT0JKQ19XRUFLKQorLyogT2JqZWN0aXZlLUMuICAqLworX19ndGhydyhwdGhyZWFkX2V4aXQpCisjaWZkZWYgX1BPU0lYX1BSSU9SSVRZX1NDSEVEVUxJTkcKKyNpZmRlZiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcKK19fZ3Rocncoc2NoZWRfZ2V0X3ByaW9yaXR5X21heCkKK19fZ3Rocncoc2NoZWRfZ2V0X3ByaW9yaXR5X21pbikKKyNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KKyNlbmRpZiAvKiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORyAqLworX19ndGhydyhwdGhyZWFkX2F0dHJfZGVzdHJveSkKK19fZ3RocncocHRocmVhZF9hdHRyX2luaXQpCitfX2d0aHJ3KHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSkKKyNpZmRlZiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcKK19fZ3RocncocHRocmVhZF9nZXRzY2hlZHBhcmFtKQorX19ndGhydyhwdGhyZWFkX3NldHNjaGVkcGFyYW0pCisjZW5kaWYgLyogX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HICovCisjZW5kaWYgLyogX0xJQk9CSkMgfHwgX0xJQk9CSkNfV0VBSyAqLworCisjaWYgX19HWFhfV0VBS19fICYmIF9HTElCQ1hYX0dUSFJFQURfVVNFX1dFQUsKKworLyogT24gU29sYXJpcyAyLjYgdXAgdG8gOSwgdGhlIGxpYmMgZXhwb3NlcyBhIFBPU0lYIHRocmVhZHMgaW50ZXJmYWNlIGV2ZW4gaWYKKyAgIC1wdGhyZWFkcyBpcyBub3Qgc3BlY2lmaWVkLiAgVGhlIGZ1bmN0aW9ucyBhcmUgZHVtbWllcyBhbmQgbW9zdCByZXR1cm4gYW4KKyAgIGVycm9yIHZhbHVlLiAgSG93ZXZlciBwdGhyZWFkX29uY2UgcmV0dXJucyAwIHdpdGhvdXQgaW52b2tpbmcgdGhlIHJvdXRpbmUKKyAgIGl0IGlzIHBhc3NlZCBzbyB3ZSBjYW5ub3QgcHJldGVuZCB0aGF0IHRoZSBpbnRlcmZhY2UgaXMgYWN0aXZlIGlmIC1wdGhyZWFkcworICAgaXMgbm90IHNwZWNpZmllZC4gIE9uIFNvbGFyaXMgMi41LjEsIHRoZSBpbnRlcmZhY2UgaXMgbm90IGV4cG9zZWQgYXQgYWxsIHNvCisgICB3ZSBuZWVkIHRvIHBsYXkgdGhlIHVzdWFsIGdhbWUgd2l0aCB3ZWFrIHN5bWJvbHMuICBPbiBTb2xhcmlzIDEwIGFuZCB1cCwgYQorICAgd29ya2luZyBpbnRlcmZhY2UgaXMgYWx3YXlzIGV4cG9zZWQuICBPbiBGcmVlQlNEIDYgYW5kIGxhdGVyLCBsaWJjIGFsc28KKyAgIGV4cG9zZXMgYSBkdW1teSBQT1NJWCB0aHJlYWRzIGludGVyZmFjZSwgc2ltaWxhciB0byB3aGF0IFNvbGFyaXMgMi42IHVwCisgICB0byA5IGRvZXMuICBGcmVlQlNEID49IDcwMDAxNCBldmVuIHByb3ZpZGVzIGEgcHRocmVhZF9jYW5jZWwgc3R1YiBpbiBsaWJjLAorICAgd2hpY2ggbWVhbnMgdGhlIGFsdGVybmF0ZSBfX2d0aHJlYWRfYWN0aXZlX3AgYmVsb3cgY2Fubm90IGJlIHVzZWQgdGhlcmUuICAqLworCisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgKGRlZmluZWQoX19zdW4pICYmIGRlZmluZWQoX19zdnI0X18pKQorCitzdGF0aWMgdm9sYXRpbGUgaW50IF9fZ3RocmVhZF9hY3RpdmUgPSAtMTsKKworc3RhdGljIHZvaWQKK19fZ3RocmVhZF90cmlnZ2VyICh2b2lkKQoreworICBfX2d0aHJlYWRfYWN0aXZlID0gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9hY3RpdmVfcCAodm9pZCkKK3sKKyAgc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBfX2d0aHJlYWRfYWN0aXZlX211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKyAgc3RhdGljIHB0aHJlYWRfb25jZV90IF9fZ3RocmVhZF9hY3RpdmVfb25jZSA9IFBUSFJFQURfT05DRV9JTklUOworCisgIC8qIEF2b2lkIHJlYWRpbmcgX19ndGhyZWFkX2FjdGl2ZSB0d2ljZSBvbiB0aGUgbWFpbiBjb2RlIHBhdGguICAqLworICBpbnQgX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgPSBfX2d0aHJlYWRfYWN0aXZlOworCisgIC8qIFRoaXMgdGVzdCBpcyBub3QgcHJvdGVjdGVkIHRvIGF2b2lkIHRha2luZyBhIGxvY2sgb24gdGhlIG1haW4gY29kZQorICAgICBwYXRoIHNvIGV2ZXJ5IHVwZGF0ZSBvZiBfX2d0aHJlYWRfYWN0aXZlIGluIGEgdGhyZWFkZWQgcHJvZ3JhbSBtdXN0CisgICAgIGJlIGF0b21pYyB3aXRoIHJlZ2FyZCB0byB0aGUgcmVzdWx0IG9mIHRoZSB0ZXN0LiAgKi8KKyAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlIDwgMCwgMCkpCisgICAgeworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfb25jZSkpCisJeworCSAgLyogSWYgdGhpcyByZWFsbHkgaXMgYSB0aHJlYWRlZCBwcm9ncmFtLCB0aGVuIHdlIG11c3QgZW5zdXJlIHRoYXQKKwkgICAgIF9fZ3RocmVhZF9hY3RpdmUgaGFzIGJlZW4gc2V0IHRvIDEgYmVmb3JlIGV4aXRpbmcgdGhpcyBibG9jay4gICovCisJICBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2xvY2spICgmX19ndGhyZWFkX2FjdGl2ZV9tdXRleCk7CisJICBfX2d0aHJ3XyhwdGhyZWFkX29uY2UpICgmX19ndGhyZWFkX2FjdGl2ZV9vbmNlLCBfX2d0aHJlYWRfdHJpZ2dlcik7CisJICBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X3VubG9jaykgKCZfX2d0aHJlYWRfYWN0aXZlX211dGV4KTsKKwl9CisKKyAgICAgIC8qIE1ha2Ugc3VyZSB3ZSdsbCBuZXZlciBlbnRlciB0aGlzIGJsb2NrIGFnYWluLiAgKi8KKyAgICAgIGlmIChfX2d0aHJlYWRfYWN0aXZlIDwgMCkKKwlfX2d0aHJlYWRfYWN0aXZlID0gMDsKKworICAgICAgX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgPSBfX2d0aHJlYWRfYWN0aXZlOworICAgIH0KKworICByZXR1cm4gX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgIT0gMDsKK30KKworI2Vsc2UgLyogbmVpdGhlciBGcmVlQlNEIG5vciBTb2xhcmlzICovCisKKy8qIEZvciBhIHByb2dyYW0gdG8gYmUgbXVsdGktdGhyZWFkZWQgdGhlIG9ubHkgdGhpbmcgdGhhdCBpdCBjZXJ0YWlubHkgbXVzdAorICAgYmUgdXNpbmcgaXMgcHRocmVhZF9jcmVhdGUuICBIb3dldmVyLCB0aGVyZSBtYXkgYmUgb3RoZXIgbGlicmFyaWVzIHRoYXQKKyAgIGludGVyY2VwdCBwdGhyZWFkX2NyZWF0ZSB3aXRoIHRoZWlyIG93biBkZWZpbml0aW9ucyB0byB3cmFwIHB0aHJlYWRzCisgICBmdW5jdGlvbmFsaXR5IGZvciBzb21lIHB1cnBvc2UuICBJbiB0aG9zZSBjYXNlcywgcHRocmVhZF9jcmVhdGUgYmVpbmcKKyAgIGRlZmluZWQgbWlnaHQgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCBsaWJwdGhyZWFkIGlzIGFjdHVhbGx5IGxpbmtlZAorICAgaW4uCisKKyAgIEZvciB0aGUgR05VIEMgbGlicmFyeSwgd2UgY2FuIHVzZSBhIGtub3duIGludGVybmFsIG5hbWUuICBUaGlzIGlzIGFsd2F5cworICAgYXZhaWxhYmxlIGluIHRoZSBBQkksIGJ1dCBubyBvdGhlciBsaWJyYXJ5IHdvdWxkIGRlZmluZSBpdC4gIFRoYXQgaXMKKyAgIGlkZWFsLCBzaW5jZSBhbnkgcHVibGljIHB0aHJlYWQgZnVuY3Rpb24gbWlnaHQgYmUgaW50ZXJjZXB0ZWQganVzdCBhcworICAgcHRocmVhZF9jcmVhdGUgbWlnaHQgYmUuICBfX3B0aHJlYWRfa2V5X2NyZWF0ZSBpcyBhbiAiaW50ZXJuYWwiCisgICBpbXBsZW1lbnRhdGlvbiBzeW1ib2wsIGJ1dCBpdCBpcyBwYXJ0IG9mIHRoZSBwdWJsaWMgZXhwb3J0ZWQgQUJJLiAgQWxzbywKKyAgIGl0J3MgYW1vbmcgdGhlIHN5bWJvbHMgdGhhdCB0aGUgc3RhdGljIGxpYnB0aHJlYWQuYSBhbHdheXMgbGlua3MgaW4KKyAgIHdoZW5ldmVyIHB0aHJlYWRfY3JlYXRlIGlzIHVzZWQsIHNvIHRoZXJlIGlzIG5vIGRhbmdlciBvZiBhIGZhbHNlCisgICBuZWdhdGl2ZSByZXN1bHQgaW4gYW55IHN0YXRpY2FsbHktbGlua2VkLCBtdWx0aS10aHJlYWRlZCBwcm9ncmFtLgorCisgICBGb3Igb3RoZXJzLCB3ZSBjaG9vc2UgcHRocmVhZF9jYW5jZWwgYXMgYSBmdW5jdGlvbiB0aGF0IHNlZW1zIHVubGlrZWx5CisgICB0byBiZSByZWRlZmluZWQgYnkgYW4gaW50ZXJjZXB0b3IgbGlicmFyeS4gIFRoZSBiaW9uaWMgKEFuZHJvaWQpIEMKKyAgIGxpYnJhcnkgZG9lcyBub3QgcHJvdmlkZSBwdGhyZWFkX2NhbmNlbCwgc28gd2UgZG8gdXNlIHB0aHJlYWRfY3JlYXRlCisgICB0aGVyZSAoYW5kIGludGVyY2VwdG9yIGxpYnJhcmllcyBsb3NlKS4gICovCisKKyNpZmRlZiBfX0dMSUJDX18KK19fZ3RocncyKF9fZ3RocndfKF9fcHRocmVhZF9rZXlfY3JlYXRlKSwKKwkgX19wdGhyZWFkX2tleV9jcmVhdGUsCisJIHB0aHJlYWRfa2V5X2NyZWF0ZSkKKyMgZGVmaW5lIEdUSFJfQUNUSVZFX1BST1hZCV9fZ3RocndfKF9fcHRocmVhZF9rZXlfY3JlYXRlKQorI2VsaWYgZGVmaW5lZCAoX19CSU9OSUNfXykKKyMgZGVmaW5lIEdUSFJfQUNUSVZFX1BST1hZCV9fZ3RocndfKHB0aHJlYWRfY3JlYXRlKQorI2Vsc2UKKyMgZGVmaW5lIEdUSFJfQUNUSVZFX1BST1hZCV9fZ3RocndfKHB0aHJlYWRfY2FuY2VsKQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfYWN0aXZlX3AgKHZvaWQpCit7CisgIHN0YXRpYyB2b2lkICpjb25zdCBfX2d0aHJlYWRfYWN0aXZlX3B0cgorICAgID0gX19leHRlbnNpb25fXyAodm9pZCAqKSAmR1RIUl9BQ1RJVkVfUFJPWFk7CisgIHJldHVybiBfX2d0aHJlYWRfYWN0aXZlX3B0ciAhPSAwOworfQorCisjZW5kaWYgLyogRnJlZUJTRCBvciBTb2xhcmlzICovCisKKyNlbHNlIC8qIG5vdCBfX0dYWF9XRUFLX18gKi8KKworLyogU2ltaWxhciB0byBTb2xhcmlzLCBIUC1VWCAxMSBmb3IgUEEtUklTQyBwcm92aWRlcyBzdHVicyBmb3IgcHRocmVhZAorICAgY2FsbHMgaW4gc2hhcmVkIGZsYXZvcnMgb2YgdGhlIEhQLVVYIEMgbGlicmFyeS4gIE1vc3Qgb2YgdGhlIHN0dWJzCisgICBoYXZlIG5vIGZ1bmN0aW9uYWxpdHkuICBUaGUgZGV0YWlscyBhcmUgZGVzY3JpYmVkIGluIHRoZSAibGliYyBjdW11bGF0aXZlCisgICBwYXRjaCIgZm9yIGVhY2ggc3VidmVyc2lvbiBvZiBIUC1VWCAxMS4gIFRoZXJlIGFyZSB0d28gc3BlY2lhbCBpbnRlcmZhY2VzCisgICBwcm92aWRlZCBmb3IgY2hlY2tpbmcgd2hldGhlciBhbiBhcHBsaWNhdGlvbiBpcyBsaW5rZWQgdG8gYSBzaGFyZWQgcHRocmVhZAorICAgbGlicmFyeSBvciBub3QuICBIb3dldmVyLCB0aGVzZSBpbnRlcmZhY2VzIGFyZW4ndCBhdmFpbGFibGUgaW4gZWFybHkKKyAgIGxpYnB0aHJlYWQgbGlicmFyaWVzLiAgV2UgYWxzbyBuZWVkIGEgdGVzdCB0aGF0IHdvcmtzIGZvciBhcmNoaXZlCisgICBsaWJyYXJpZXMuICBXZSBjYW4ndCB1c2UgcHRocmVhZF9vbmNlIGFzIHNvbWUgbGliYyB2ZXJzaW9ucyBjYWxsIHRoZQorICAgaW5pdCBmdW5jdGlvbi4gIFdlIGFsc28gY2FuJ3QgdXNlIHB0aHJlYWRfY3JlYXRlIG9yIHB0aHJlYWRfYXR0cl9pbml0CisgICBhcyB0aGVzZSBjcmVhdGUgYSB0aHJlYWQgYW5kIHRoZXJlYnkgcHJldmVudCBjaGFuZ2luZyB0aGUgZGVmYXVsdCBzdGFjaworICAgc2l6ZS4gIFRoZSBmdW5jdGlvbiBwdGhyZWFkX2RlZmF1bHRfc3RhY2tzaXplX25wIGlzIGF2YWlsYWJsZSBpbiBib3RoCisgICB0aGUgYXJjaGl2ZSBhbmQgc2hhcmVkIHZlcnNpb25zIG9mIGxpYnB0aHJlYWQuICAgSXQgY2FuIGJlIHVzZWQgdG8KKyAgIGRldGVybWluZSB0aGUgZGVmYXVsdCBwdGhyZWFkIHN0YWNrIHNpemUuICBUaGVyZSBpcyBhIHN0dWIgaW4gc29tZQorICAgc2hhcmVkIGxpYmMgdmVyc2lvbnMgd2hpY2ggcmV0dXJucyBhIHplcm8gc2l6ZSBpZiBwdGhyZWFkcyBhcmUgbm90CisgICBhY3RpdmUuICBXZSBwcm92aWRlIGFuIGVxdWl2YWxlbnQgc3R1YiB0byBoYW5kbGUgY2FzZXMgd2hlcmUgbGliYworICAgZG9lc24ndCBwcm92aWRlIG9uZS4gICovCisKKyNpZiBkZWZpbmVkKF9faHBwYV9fKSAmJiBkZWZpbmVkKF9faHB1eF9fKQorCitzdGF0aWMgdm9sYXRpbGUgaW50IF9fZ3RocmVhZF9hY3RpdmUgPSAtMTsKKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9hY3RpdmVfcCAodm9pZCkKK3sKKyAgLyogQXZvaWQgcmVhZGluZyBfX2d0aHJlYWRfYWN0aXZlIHR3aWNlIG9uIHRoZSBtYWluIGNvZGUgcGF0aC4gICovCisgIGludCBfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSA9IF9fZ3RocmVhZF9hY3RpdmU7CisgIHNpemVfdCBfX3M7CisKKyAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlIDwgMCwgMCkpCisgICAgeworICAgICAgcHRocmVhZF9kZWZhdWx0X3N0YWNrc2l6ZV9ucCAoMCwgJl9fcyk7CisgICAgICBfX2d0aHJlYWRfYWN0aXZlID0gX19zID8gMSA6IDA7CisgICAgICBfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSA9IF9fZ3RocmVhZF9hY3RpdmU7CisgICAgfQorCisgIHJldHVybiBfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSAhPSAwOworfQorCisjZWxzZSAvKiBub3QgaHBwYS1ocHV4ICovCisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfYWN0aXZlX3AgKHZvaWQpCit7CisgIHJldHVybiAxOworfQorCisjZW5kaWYgLyogaHBwYS1ocHV4ICovCisKKyNlbmRpZiAvKiBfX0dYWF9XRUFLX18gKi8KKworI2lmZGVmIF9MSUJPQkpDCisKKy8qIFRoaXMgaXMgdGhlIGNvbmZpZy5oIGZpbGUgaW4gbGlib2JqYy8gKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2lmZGVmIEhBVkVfU0NIRURfSAorIyBpbmNsdWRlIDxzY2hlZC5oPgorI2VuZGlmCisKKy8qIEtleSBzdHJ1Y3R1cmUgZm9yIG1haW50YWluaW5nIHRocmVhZCBzcGVjaWZpYyBzdG9yYWdlICovCitzdGF0aWMgcHRocmVhZF9rZXlfdCBfb2JqY190aHJlYWRfc3RvcmFnZTsKK3N0YXRpYyBwdGhyZWFkX2F0dHJfdCBfb2JqY190aHJlYWRfYXR0cmliczsKKworLyogVGhyZWFkIGxvY2FsIHN0b3JhZ2UgZm9yIGEgc2luZ2xlIHRocmVhZCAqLworc3RhdGljIHZvaWQgKnRocmVhZF9sb2NhbF9zdG9yYWdlID0gTlVMTDsKKworLyogQmFja2VuZCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKi8KKworLyogSW5pdGlhbGl6ZSB0aGUgdGhyZWFkcyBzdWJzeXN0ZW0uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2luaXRfdGhyZWFkX3N5c3RlbSAodm9pZCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICB7CisgICAgICAvKiBJbml0aWFsaXplIHRoZSB0aHJlYWQgc3RvcmFnZSBrZXkuICAqLworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfa2V5X2NyZWF0ZSkgKCZfb2JqY190aHJlYWRfc3RvcmFnZSwgTlVMTCkgPT0gMCkKKwl7CisJICAvKiBUaGUgbm9ybWFsIGRlZmF1bHQgZGV0YWNoIHN0YXRlIGZvciB0aHJlYWRzIGlzCisJICAgKiBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSB3aGljaCBjYXVzZXMgdGhyZWFkcyB0byBub3QgZGllCisJICAgKiB3aGVuIHlvdSB0aGluayB0aGV5IHNob3VsZC4gICovCisJICBpZiAoX19ndGhyd18ocHRocmVhZF9hdHRyX2luaXQpICgmX29iamNfdGhyZWFkX2F0dHJpYnMpID09IDAKKwkgICAgICAmJiBfX2d0aHJ3XyhwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUpICgmX29iamNfdGhyZWFkX2F0dHJpYnMsCisJCQkJCSAgICAgIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEKSA9PSAwKQorCSAgICByZXR1cm4gMDsKKwl9CisgICAgfQorCisgIHJldHVybiAtMTsKK30KKworLyogQ2xvc2UgdGhlIHRocmVhZHMgc3Vic3lzdGVtLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jbG9zZV90aHJlYWRfc3lzdGVtICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpCisgICAgICAmJiBfX2d0aHJ3XyhwdGhyZWFkX2tleV9kZWxldGUpIChfb2JqY190aHJlYWRfc3RvcmFnZSkgPT0gMAorICAgICAgJiYgX19ndGhyd18ocHRocmVhZF9hdHRyX2Rlc3Ryb3kpICgmX29iamNfdGhyZWFkX2F0dHJpYnMpID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIC0xOworfQorCisvKiBCYWNrZW5kIHRocmVhZCBmdW5jdGlvbnMgKi8KKworLyogQ3JlYXRlIGEgbmV3IHRocmVhZCBvZiBleGVjdXRpb24uICAqLworc3RhdGljIGlubGluZSBvYmpjX3RocmVhZF90CitfX2d0aHJlYWRfb2JqY190aHJlYWRfZGV0YWNoICh2b2lkICgqZnVuYykodm9pZCAqKSwgdm9pZCAqYXJnKQoreworICBvYmpjX3RocmVhZF90IHRocmVhZF9pZDsKKyAgcHRocmVhZF90IG5ld190aHJlYWRfaGFuZGxlOworCisgIGlmICghX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghKF9fZ3RocndfKHB0aHJlYWRfY3JlYXRlKSAoJm5ld190aHJlYWRfaGFuZGxlLCAmX29iamNfdGhyZWFkX2F0dHJpYnMsCisJCQkJICAodm9pZCAqKSBmdW5jLCBhcmcpKSkKKyAgICB0aHJlYWRfaWQgPSAob2JqY190aHJlYWRfdCkgbmV3X3RocmVhZF9oYW5kbGU7CisgIGVsc2UKKyAgICB0aHJlYWRfaWQgPSBOVUxMOworCisgIHJldHVybiB0aHJlYWRfaWQ7Cit9CisKKy8qIFNldCB0aGUgY3VycmVudCB0aHJlYWQncyBwcmlvcml0eS4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfdGhyZWFkX3NldF9wcmlvcml0eSAoaW50IHByaW9yaXR5KQoreworICBpZiAoIV9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gLTE7CisgIGVsc2UKKyAgICB7CisjaWZkZWYgX1BPU0lYX1BSSU9SSVRZX1NDSEVEVUxJTkcKKyNpZmRlZiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcKKyAgICAgIHB0aHJlYWRfdCB0aHJlYWRfaWQgPSBfX2d0aHJ3XyhwdGhyZWFkX3NlbGYpICgpOworICAgICAgaW50IHBvbGljeTsKKyAgICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbXM7CisgICAgICBpbnQgcHJpb3JpdHlfbWluLCBwcmlvcml0eV9tYXg7CisKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX2dldHNjaGVkcGFyYW0pICh0aHJlYWRfaWQsICZwb2xpY3ksICZwYXJhbXMpID09IDApCisJeworCSAgaWYgKChwcmlvcml0eV9tYXggPSBfX2d0aHJ3XyhzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KSAocG9saWN5KSkgPT0gLTEpCisJICAgIHJldHVybiAtMTsKKworCSAgaWYgKChwcmlvcml0eV9taW4gPSBfX2d0aHJ3XyhzY2hlZF9nZXRfcHJpb3JpdHlfbWluKSAocG9saWN5KSkgPT0gLTEpCisJICAgIHJldHVybiAtMTsKKworCSAgaWYgKHByaW9yaXR5ID4gcHJpb3JpdHlfbWF4KQorCSAgICBwcmlvcml0eSA9IHByaW9yaXR5X21heDsKKwkgIGVsc2UgaWYgKHByaW9yaXR5IDwgcHJpb3JpdHlfbWluKQorCSAgICBwcmlvcml0eSA9IHByaW9yaXR5X21pbjsKKwkgIHBhcmFtcy5zY2hlZF9wcmlvcml0eSA9IHByaW9yaXR5OworCisJICAvKgorCSAgICogVGhlIHNvbGFyaXMgNyBhbmQgc2V2ZXJhbCBvdGhlciBtYW4gcGFnZXMgaW5jb3JyZWN0bHkgc3RhdGUgdGhhdAorCSAgICogdGhpcyBzaG91bGQgYmUgYSBwb2ludGVyIHRvIHBvbGljeSBidXQgcHRocmVhZC5oIGlzIHVuaXZlcnNhbGx5CisJICAgKiBhdCBvZGRzIHdpdGggdGhpcy4KKwkgICAqLworCSAgaWYgKF9fZ3RocndfKHB0aHJlYWRfc2V0c2NoZWRwYXJhbSkgKHRocmVhZF9pZCwgcG9saWN5LCAmcGFyYW1zKSA9PSAwKQorCSAgICByZXR1cm4gMDsKKwl9CisjZW5kaWYgLyogX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HICovCisjZW5kaWYgLyogX1BPU0lYX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KKyAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKKy8qIFJldHVybiB0aGUgY3VycmVudCB0aHJlYWQncyBwcmlvcml0eS4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfdGhyZWFkX2dldF9wcmlvcml0eSAodm9pZCkKK3sKKyNpZmRlZiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORworI2lmZGVmIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIGludCBwb2xpY3k7CisgICAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW1zOworCisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9nZXRzY2hlZHBhcmFtKSAoX19ndGhyd18ocHRocmVhZF9zZWxmKSAoKSwgJnBvbGljeSwgJnBhcmFtcykgPT0gMCkKKwlyZXR1cm4gcGFyYW1zLnNjaGVkX3ByaW9yaXR5OworICAgICAgZWxzZQorCXJldHVybiAtMTsKKyAgICB9CisgIGVsc2UKKyNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KKyNlbmRpZiAvKiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORyAqLworICAgIHJldHVybiBPQkpDX1RIUkVBRF9JTlRFUkFDVElWRV9QUklPUklUWTsKK30KKworLyogWWllbGQgb3VyIHByb2Nlc3MgdGltZSB0byBhbm90aGVyIHRocmVhZC4gICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19fZ3RocmVhZF9vYmpjX3RocmVhZF95aWVsZCAodm9pZCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICBfX2d0aHJ3XyhzY2hlZF95aWVsZCkgKCk7Cit9CisKKy8qIFRlcm1pbmF0ZSB0aGUgY3VycmVudCB0aHJlYWQuICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9leGl0ICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIC8qIGV4aXQgdGhlIHRocmVhZCAqLworICAgIF9fZ3RocndfKHB0aHJlYWRfZXhpdCkgKCZfX29iamNfdGhyZWFkX2V4aXRfc3RhdHVzKTsKKworICAvKiBGYWlsZWQgaWYgd2UgcmVhY2hlZCBoZXJlICovCisgIHJldHVybiAtMTsKK30KKworLyogUmV0dXJucyBhbiBpbnRlZ2VyIHZhbHVlIHdoaWNoIHVuaXF1ZWx5IGRlc2NyaWJlcyBhIHRocmVhZC4gICovCitzdGF0aWMgaW5saW5lIG9iamNfdGhyZWFkX3QKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9pZCAodm9pZCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gKG9iamNfdGhyZWFkX3QpIF9fZ3RocndfKHB0aHJlYWRfc2VsZikgKCk7CisgIGVsc2UKKyAgICByZXR1cm4gKG9iamNfdGhyZWFkX3QpIDE7Cit9CisKKy8qIFNldHMgdGhlIHRocmVhZCdzIGxvY2FsIHN0b3JhZ2UgcG9pbnRlci4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfdGhyZWFkX3NldF9kYXRhICh2b2lkICp2YWx1ZSkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9zZXRzcGVjaWZpYykgKF9vYmpjX3RocmVhZF9zdG9yYWdlLCB2YWx1ZSk7CisgIGVsc2UKKyAgICB7CisgICAgICB0aHJlYWRfbG9jYWxfc3RvcmFnZSA9IHZhbHVlOworICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvKiBSZXR1cm5zIHRoZSB0aHJlYWQncyBsb2NhbCBzdG9yYWdlIHBvaW50ZXIuICAqLworc3RhdGljIGlubGluZSB2b2lkICoKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9nZXRfZGF0YSAodm9pZCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9nZXRzcGVjaWZpYykgKF9vYmpjX3RocmVhZF9zdG9yYWdlKTsKKyAgZWxzZQorICAgIHJldHVybiB0aHJlYWRfbG9jYWxfc3RvcmFnZTsKK30KKworLyogQmFja2VuZCBtdXRleCBmdW5jdGlvbnMgKi8KKworLyogQWxsb2NhdGUgYSBtdXRleC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfYWxsb2NhdGUgKG9iamNfbXV0ZXhfdCBtdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICB7CisgICAgICBtdXRleC0+YmFja2VuZCA9IG9iamNfbWFsbG9jIChzaXplb2YgKHB0aHJlYWRfbXV0ZXhfdCkpOworCisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9tdXRleF9pbml0KSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCwgTlVMTCkpCisJeworCSAgb2JqY19mcmVlIChtdXRleC0+YmFja2VuZCk7CisJICBtdXRleC0+YmFja2VuZCA9IE5VTEw7CisJICByZXR1cm4gLTE7CisJfQorICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogRGVhbGxvY2F0ZSBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF9kZWFsbG9jYXRlIChvYmpjX211dGV4X3QgbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgaW50IGNvdW50OworCisgICAgICAvKgorICAgICAgICogUG9zaXggVGhyZWFkcyBzcGVjaWZpY2FsbHkgcmVxdWlyZSB0aGF0IHRoZSB0aHJlYWQgYmUgdW5sb2NrZWQKKyAgICAgICAqIGZvciBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2Rlc3Ryb3kpIHRvIHdvcmsuCisgICAgICAgKi8KKworICAgICAgZG8KKwl7CisJICBjb3VudCA9IF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCk7CisJICBpZiAoY291bnQgPCAwKQorCSAgICByZXR1cm4gLTE7CisJfQorICAgICAgd2hpbGUgKGNvdW50KTsKKworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSkgKChwdGhyZWFkX211dGV4X3QgKikgbXV0ZXgtPmJhY2tlbmQpKQorCXJldHVybiAtMTsKKworICAgICAgb2JqY19mcmVlIChtdXRleC0+YmFja2VuZCk7CisgICAgICBtdXRleC0+YmFja2VuZCA9IE5VTEw7CisgICAgfQorICByZXR1cm4gMDsKK30KKworLyogR3JhYiBhIGxvY2sgb24gYSBtdXRleC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfbG9jayAob2JqY19tdXRleF90IG11dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpCisgICAgICAmJiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2xvY2spICgocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kKSAhPSAwKQorICAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFRyeSB0byBncmFiIGEgbG9jayBvbiBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF90cnlsb2NrIChvYmpjX211dGV4X3QgbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaykgKChwdGhyZWFkX211dGV4X3QgKikgbXV0ZXgtPmJhY2tlbmQpICE9IDApCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogVW5sb2NrIHRoZSBtdXRleCAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X3VubG9jayAob2JqY19tdXRleF90IG11dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpCisgICAgICAmJiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X3VubG9jaykgKChwdGhyZWFkX211dGV4X3QgKikgbXV0ZXgtPmJhY2tlbmQpICE9IDApCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogQmFja2VuZCBjb25kaXRpb24gbXV0ZXggZnVuY3Rpb25zICovCisKKy8qIEFsbG9jYXRlIGEgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fYWxsb2NhdGUgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIGNvbmRpdGlvbi0+YmFja2VuZCA9IG9iamNfbWFsbG9jIChzaXplb2YgKHB0aHJlYWRfY29uZF90KSk7CisKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfaW5pdCkgKChwdGhyZWFkX2NvbmRfdCAqKSBjb25kaXRpb24tPmJhY2tlbmQsIE5VTEwpKQorCXsKKwkgIG9iamNfZnJlZSAoY29uZGl0aW9uLT5iYWNrZW5kKTsKKwkgIGNvbmRpdGlvbi0+YmFja2VuZCA9IE5VTEw7CisJICByZXR1cm4gLTE7CisJfQorICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogRGVhbGxvY2F0ZSBhIGNvbmRpdGlvbi4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfY29uZGl0aW9uX2RlYWxsb2NhdGUgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfZGVzdHJveSkgKChwdGhyZWFkX2NvbmRfdCAqKSBjb25kaXRpb24tPmJhY2tlbmQpKQorCXJldHVybiAtMTsKKworICAgICAgb2JqY19mcmVlIChjb25kaXRpb24tPmJhY2tlbmQpOworICAgICAgY29uZGl0aW9uLT5iYWNrZW5kID0gTlVMTDsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBXYWl0IG9uIHRoZSBjb25kaXRpb24gKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fd2FpdCAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24sIG9iamNfbXV0ZXhfdCBtdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX3dhaXQpICgocHRocmVhZF9jb25kX3QgKikgY29uZGl0aW9uLT5iYWNrZW5kLAorCQkJICAgICAgKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLyogV2FrZSB1cCBhbGwgdGhyZWFkcyB3YWl0aW5nIG9uIHRoaXMgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fYnJvYWRjYXN0IChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbikKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX2Jyb2FkY2FzdCkgKChwdGhyZWFkX2NvbmRfdCAqKSBjb25kaXRpb24tPmJhY2tlbmQpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFdha2UgdXAgb25lIHRocmVhZCB3YWl0aW5nIG9uIHRoaXMgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fc2lnbmFsIChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbikKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX3NpZ25hbCkgKChwdGhyZWFkX2NvbmRfdCAqKSBjb25kaXRpb24tPmJhY2tlbmQpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbHNlIC8qIF9MSUJPQkpDICovCisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY3JlYXRlIChfX2d0aHJlYWRfdCAqX190aHJlYWRpZCwgdm9pZCAqKCpfX2Z1bmMpICh2b2lkKiksCisJCSAgdm9pZCAqX19hcmdzKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jcmVhdGUpIChfX3RocmVhZGlkLCBOVUxMLCBfX2Z1bmMsIF9fYXJncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfam9pbiAoX19ndGhyZWFkX3QgX190aHJlYWRpZCwgdm9pZCAqKl9fdmFsdWVfcHRyKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9qb2luKSAoX190aHJlYWRpZCwgX192YWx1ZV9wdHIpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2RldGFjaCAoX19ndGhyZWFkX3QgX190aHJlYWRpZCkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfZGV0YWNoKSAoX190aHJlYWRpZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfZXF1YWwgKF9fZ3RocmVhZF90IF9fdDEsIF9fZ3RocmVhZF90IF9fdDIpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2VxdWFsKSAoX190MSwgX190Mik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19ndGhyZWFkX3QKK19fZ3RocmVhZF9zZWxmICh2b2lkKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9zZWxmKSAoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF95aWVsZCAodm9pZCkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHNjaGVkX3lpZWxkKSAoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vbmNlIChfX2d0aHJlYWRfb25jZV90ICpfX29uY2UsIHZvaWQgKCpfX2Z1bmMpICh2b2lkKSkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9vbmNlKSAoX19vbmNlLCBfX2Z1bmMpOworICBlbHNlCisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2tleV9jcmVhdGUgKF9fZ3RocmVhZF9rZXlfdCAqX19rZXksIHZvaWQgKCpfX2R0b3IpICh2b2lkICopKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9rZXlfY3JlYXRlKSAoX19rZXksIF9fZHRvcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfa2V5X2RlbGV0ZSAoX19ndGhyZWFkX2tleV90IF9fa2V5KQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9rZXlfZGVsZXRlKSAoX19rZXkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKgorX19ndGhyZWFkX2dldHNwZWNpZmljIChfX2d0aHJlYWRfa2V5X3QgX19rZXkpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2dldHNwZWNpZmljKSAoX19rZXkpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3NldHNwZWNpZmljIChfX2d0aHJlYWRfa2V5X3QgX19rZXksIGNvbnN0IHZvaWQgKl9fcHRyKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9zZXRzcGVjaWZpYykgKF9fa2V5LCBfX3B0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19ndGhyZWFkX211dGV4X2luaXRfZnVuY3Rpb24gKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfaW5pdCkgKF9fbXV0ZXgsIE5VTEwpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X2Rlc3Ryb3kgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2Rlc3Ryb3kpIChfX211dGV4KTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X2xvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2xvY2spIChfX211dGV4KTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X3RyeWxvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X3RyeWxvY2spIChfX211dGV4KTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisjaWYgX0dUSFJFQURfVVNFX01VVEVYX1RJTUVETE9DSworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF90aW1lZGxvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4LAorCQkJICAgY29uc3QgX19ndGhyZWFkX3RpbWVfdCAqX19hYnNfdGltZW91dCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9tdXRleF90aW1lZGxvY2spIChfX211dGV4LCBfX2Fic190aW1lb3V0KTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfdW5sb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9tdXRleF91bmxvY2spIChfX211dGV4KTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisjaWYgIWRlZmluZWQoIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QKSBcCisgIHx8IGRlZmluZWQoX0dUSFJFQURfVVNFX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkMpCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9pbml0X2Z1bmN0aW9uIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgcHRocmVhZF9tdXRleGF0dHJfdCBfX2F0dHI7CisgICAgICBpbnQgX19yOworCisgICAgICBfX3IgPSBfX2d0aHJ3XyhwdGhyZWFkX211dGV4YXR0cl9pbml0KSAoJl9fYXR0cik7CisgICAgICBpZiAoIV9fcikKKwlfX3IgPSBfX2d0aHJ3XyhwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKSAoJl9fYXR0ciwKKwkJCQkJCSAgIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfaW5pdCkgKF9fbXV0ZXgsICZfX2F0dHIpOworICAgICAgaWYgKCFfX3IpCisJX19yID0gX19ndGhyd18ocHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSkgKCZfX2F0dHIpOworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisgIHJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2xvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF9sb2NrIChfX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdHJ5bG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX211dGV4X3RyeWxvY2sgKF9fbXV0ZXgpOworfQorCisjaWYgX0dUSFJFQURfVVNFX01VVEVYX1RJTUVETE9DSworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdGltZWRsb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgsCisJCQkJICAgICBjb25zdCBfX2d0aHJlYWRfdGltZV90ICpfX2Fic190aW1lb3V0KQoreworICByZXR1cm4gX19ndGhyZWFkX211dGV4X3RpbWVkbG9jayAoX19tdXRleCwgX19hYnNfdGltZW91dCk7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdW5sb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfdW5sb2NrIChfX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfZGVzdHJveSAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX211dGV4X2Rlc3Ryb3kgKF9fbXV0ZXgpOworfQorCisjaWZkZWYgX0dUSFJFQURfVVNFX0NPTkRfSU5JVF9GVU5DCitzdGF0aWMgaW5saW5lIHZvaWQKK19fZ3RocmVhZF9jb25kX2luaXRfZnVuY3Rpb24gKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfaW5pdCkgKF9fY29uZCwgTlVMTCk7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jb25kX2Jyb2FkY2FzdCAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX2Jyb2FkY2FzdCkgKF9fY29uZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF9zaWduYWwgKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfY29uZF9zaWduYWwpIChfX2NvbmQpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NvbmRfd2FpdCAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kLCBfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfY29uZF93YWl0KSAoX19jb25kLCBfX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jb25kX3RpbWVkd2FpdCAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kLCBfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCwKKwkJCSAgY29uc3QgX19ndGhyZWFkX3RpbWVfdCAqX19hYnNfdGltZW91dCkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfY29uZF90aW1lZHdhaXQpIChfX2NvbmQsIF9fbXV0ZXgsIF9fYWJzX3RpbWVvdXQpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NvbmRfd2FpdF9yZWN1cnNpdmUgKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCwKKwkJCSAgICAgICBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfY29uZF93YWl0IChfX2NvbmQsIF9fbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NvbmRfZGVzdHJveSAoX19ndGhyZWFkX2NvbmRfdCogX19jb25kKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX2Rlc3Ryb3kpIChfX2NvbmQpOworfQorCisjZW5kaWYgLyogX0xJQk9CSkMgKi8KKworI2VuZGlmIC8qICEgX0dMSUJDWFhfR0NDX0dUSFJfUE9TSVhfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9ndGhyLXBvc2l4LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2d0aHItcG9zaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTcxYjE4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9ndGhyLXBvc2l4LmgKQEAgLTAsMCArMSw4ODkgQEAKKy8qIFRocmVhZHMgY29tcGF0aWJpbGl0eSByb3V0aW5lcyBmb3IgbGliZ2NjMiBhbmQgbGlib2JqYy4gICovCisvKiBDb21waWxlIHRoaXMgb25lIHdpdGggZ2NjLiAgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1VuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9HTElCQ1hYX0dDQ19HVEhSX1BPU0lYX0gKKyNkZWZpbmUgX0dMSUJDWFhfR0NDX0dUSFJfUE9TSVhfSAorCisvKiBQT1NJWCB0aHJlYWRzIHNwZWNpZmljIGRlZmluaXRpb25zLgorICAgRWFzeSwgc2luY2UgdGhlIGludGVyZmFjZSBpcyBqdXN0IG9uZS10by1vbmUgbWFwcGluZy4gICovCisKKyNkZWZpbmUgX19HVEhSRUFEUyAxCisjZGVmaW5lIF9fR1RIUkVBRFNfQ1hYMFggMQorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaWYgKChkZWZpbmVkKF9MSUJPQkpDKSB8fCBkZWZpbmVkKF9MSUJPQkpDX1dFQUspKSBcCisgICAgIHx8ICFkZWZpbmVkKF9HVEhSRUFEX1VTRV9NVVRFWF9USU1FRExPQ0spKQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaWYgZGVmaW5lZChfUE9TSVhfVElNRU9VVFMpICYmIF9QT1NJWF9USU1FT1VUUyA+PSAwCisjICBkZWZpbmUgX0dUSFJFQURfVVNFX01VVEVYX1RJTUVETE9DSyAxCisjIGVsc2UKKyMgIGRlZmluZSBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLIDAKKyMgZW5kaWYKKyNlbmRpZgorCit0eXBlZGVmIHB0aHJlYWRfdCBfX2d0aHJlYWRfdDsKK3R5cGVkZWYgcHRocmVhZF9rZXlfdCBfX2d0aHJlYWRfa2V5X3Q7Cit0eXBlZGVmIHB0aHJlYWRfb25jZV90IF9fZ3RocmVhZF9vbmNlX3Q7Cit0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCBfX2d0aHJlYWRfbXV0ZXhfdDsKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90IF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdDsKK3R5cGVkZWYgcHRocmVhZF9jb25kX3QgX19ndGhyZWFkX2NvbmRfdDsKK3R5cGVkZWYgc3RydWN0IHRpbWVzcGVjIF9fZ3RocmVhZF90aW1lX3Q7CisKKy8qIFBPU0lYIGxpa2UgY29uZGl0aW9uYWwgdmFyaWFibGVzIGFyZSBzdXBwb3J0ZWQuICBQbGVhc2UgbG9vayBhdCBjb21tZW50cworICAgaW4gZ3Roci5oIGZvciBkZXRhaWxzLiAqLworI2RlZmluZSBfX0dUSFJFQURfSEFTX0NPTkQJMQorCisjZGVmaW5lIF9fR1RIUkVBRF9NVVRFWF9JTklUIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIKKyNkZWZpbmUgX19HVEhSRUFEX01VVEVYX0lOSVRfRlVOQ1RJT04gX19ndGhyZWFkX211dGV4X2luaXRfZnVuY3Rpb24KKyNkZWZpbmUgX19HVEhSRUFEX09OQ0VfSU5JVCBQVEhSRUFEX09OQ0VfSU5JVAorI2lmIGRlZmluZWQoUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVIpCisjZGVmaW5lIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVCBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUgorI2VsaWYgZGVmaW5lZChQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUCkKKyNkZWZpbmUgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QCisjZWxzZQorI2RlZmluZSBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRfRlVOQ1RJT04gX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9pbml0X2Z1bmN0aW9uCisjZW5kaWYKKyNkZWZpbmUgX19HVEhSRUFEX0NPTkRfSU5JVCBQVEhSRUFEX0NPTkRfSU5JVElBTElaRVIKKyNkZWZpbmUgX19HVEhSRUFEX1RJTUVfSU5JVCB7MCwwfQorCisjaWZkZWYgX0dUSFJFQURfVVNFX01VVEVYX0lOSVRfRlVOQworIyB1bmRlZiBfX0dUSFJFQURfTVVURVhfSU5JVAorI2VuZGlmCisjaWZkZWYgX0dUSFJFQURfVVNFX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkMKKyMgdW5kZWYgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUCisjIHVuZGVmIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVF9GVU5DVElPTgorIyBkZWZpbmUgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkNUSU9OIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfaW5pdF9mdW5jdGlvbgorI2VuZGlmCisjaWZkZWYgX0dUSFJFQURfVVNFX0NPTkRfSU5JVF9GVU5DCisjIHVuZGVmIF9fR1RIUkVBRF9DT05EX0lOSVQKKyMgZGVmaW5lIF9fR1RIUkVBRF9DT05EX0lOSVRfRlVOQ1RJT04gX19ndGhyZWFkX2NvbmRfaW5pdF9mdW5jdGlvbgorI2VuZGlmCisKKyNpZiBfX0dYWF9XRUFLX18gJiYgX0dMSUJDWFhfR1RIUkVBRF9VU0VfV0VBSworIyBpZm5kZWYgX19ndGhyd19wcmFnbWEKKyMgIGRlZmluZSBfX2d0aHJ3X3ByYWdtYShwcmFnbWEpCisjIGVuZGlmCisjIGRlZmluZSBfX2d0aHJ3MihuYW1lLG5hbWUyLHR5cGUpIFwKKyAgc3RhdGljIF9fdHlwZW9mKHR5cGUpIG5hbWUgX19hdHRyaWJ1dGVfXyAoKF9fd2Vha3JlZl9fKCNuYW1lMikpKTsgXAorICBfX2d0aHJ3X3ByYWdtYSh3ZWFrIHR5cGUpCisjIGRlZmluZSBfX2d0aHJ3XyhuYW1lKSBfX2d0aHJ3XyAjIyBuYW1lCisjZWxzZQorIyBkZWZpbmUgX19ndGhydzIobmFtZSxuYW1lMix0eXBlKQorIyBkZWZpbmUgX19ndGhyd18obmFtZSkgbmFtZQorI2VuZGlmCisKKy8qIFR5cGljYWxseSwgX19ndGhyd19mb28gaXMgYSB3ZWFrIHJlZmVyZW5jZSB0byBzeW1ib2wgZm9vLiAgKi8KKyNkZWZpbmUgX19ndGhydyhuYW1lKSBfX2d0aHJ3MihfX2d0aHJ3XyAjIyBuYW1lLG5hbWUsbmFtZSkKKworX19ndGhydyhwdGhyZWFkX29uY2UpCitfX2d0aHJ3KHB0aHJlYWRfZ2V0c3BlY2lmaWMpCitfX2d0aHJ3KHB0aHJlYWRfc2V0c3BlY2lmaWMpCisKK19fZ3RocncocHRocmVhZF9jcmVhdGUpCitfX2d0aHJ3KHB0aHJlYWRfam9pbikKK19fZ3RocncocHRocmVhZF9lcXVhbCkKK19fZ3RocncocHRocmVhZF9zZWxmKQorX19ndGhydyhwdGhyZWFkX2RldGFjaCkKKyNpZm5kZWYgX19CSU9OSUNfXworX19ndGhydyhwdGhyZWFkX2NhbmNlbCkKKyNlbmRpZgorX19ndGhydyhzY2hlZF95aWVsZCkKKworX19ndGhydyhwdGhyZWFkX211dGV4X2xvY2spCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaykKKyNpZiBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfdGltZWRsb2NrKQorI2VuZGlmCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfdW5sb2NrKQorX19ndGhydyhwdGhyZWFkX211dGV4X2luaXQpCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfZGVzdHJveSkKKworX19ndGhydyhwdGhyZWFkX2NvbmRfaW5pdCkKK19fZ3RocncocHRocmVhZF9jb25kX2Jyb2FkY2FzdCkKK19fZ3RocncocHRocmVhZF9jb25kX3NpZ25hbCkKK19fZ3RocncocHRocmVhZF9jb25kX3dhaXQpCitfX2d0aHJ3KHB0aHJlYWRfY29uZF90aW1lZHdhaXQpCitfX2d0aHJ3KHB0aHJlYWRfY29uZF9kZXN0cm95KQorCitfX2d0aHJ3KHB0aHJlYWRfa2V5X2NyZWF0ZSkKK19fZ3RocncocHRocmVhZF9rZXlfZGVsZXRlKQorX19ndGhydyhwdGhyZWFkX211dGV4YXR0cl9pbml0KQorX19ndGhydyhwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKQorX19ndGhydyhwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KQorCisKKyNpZiBkZWZpbmVkKF9MSUJPQkpDKSB8fCBkZWZpbmVkKF9MSUJPQkpDX1dFQUspCisvKiBPYmplY3RpdmUtQy4gICovCitfX2d0aHJ3KHB0aHJlYWRfZXhpdCkKKyNpZmRlZiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORworI2lmZGVmIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORworX19ndGhydyhzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KQorX19ndGhydyhzY2hlZF9nZXRfcHJpb3JpdHlfbWluKQorI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyAqLworI2VuZGlmIC8qIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HICovCitfX2d0aHJ3KHB0aHJlYWRfYXR0cl9kZXN0cm95KQorX19ndGhydyhwdGhyZWFkX2F0dHJfaW5pdCkKK19fZ3RocncocHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKQorI2lmZGVmIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORworX19ndGhydyhwdGhyZWFkX2dldHNjaGVkcGFyYW0pCitfX2d0aHJ3KHB0aHJlYWRfc2V0c2NoZWRwYXJhbSkKKyNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KKyNlbmRpZiAvKiBfTElCT0JKQyB8fCBfTElCT0JKQ19XRUFLICovCisKKyNpZiBfX0dYWF9XRUFLX18gJiYgX0dMSUJDWFhfR1RIUkVBRF9VU0VfV0VBSworCisvKiBPbiBTb2xhcmlzIDIuNiB1cCB0byA5LCB0aGUgbGliYyBleHBvc2VzIGEgUE9TSVggdGhyZWFkcyBpbnRlcmZhY2UgZXZlbiBpZgorICAgLXB0aHJlYWRzIGlzIG5vdCBzcGVjaWZpZWQuICBUaGUgZnVuY3Rpb25zIGFyZSBkdW1taWVzIGFuZCBtb3N0IHJldHVybiBhbgorICAgZXJyb3IgdmFsdWUuICBIb3dldmVyIHB0aHJlYWRfb25jZSByZXR1cm5zIDAgd2l0aG91dCBpbnZva2luZyB0aGUgcm91dGluZQorICAgaXQgaXMgcGFzc2VkIHNvIHdlIGNhbm5vdCBwcmV0ZW5kIHRoYXQgdGhlIGludGVyZmFjZSBpcyBhY3RpdmUgaWYgLXB0aHJlYWRzCisgICBpcyBub3Qgc3BlY2lmaWVkLiAgT24gU29sYXJpcyAyLjUuMSwgdGhlIGludGVyZmFjZSBpcyBub3QgZXhwb3NlZCBhdCBhbGwgc28KKyAgIHdlIG5lZWQgdG8gcGxheSB0aGUgdXN1YWwgZ2FtZSB3aXRoIHdlYWsgc3ltYm9scy4gIE9uIFNvbGFyaXMgMTAgYW5kIHVwLCBhCisgICB3b3JraW5nIGludGVyZmFjZSBpcyBhbHdheXMgZXhwb3NlZC4gIE9uIEZyZWVCU0QgNiBhbmQgbGF0ZXIsIGxpYmMgYWxzbworICAgZXhwb3NlcyBhIGR1bW15IFBPU0lYIHRocmVhZHMgaW50ZXJmYWNlLCBzaW1pbGFyIHRvIHdoYXQgU29sYXJpcyAyLjYgdXAKKyAgIHRvIDkgZG9lcy4gIEZyZWVCU0QgPj0gNzAwMDE0IGV2ZW4gcHJvdmlkZXMgYSBwdGhyZWFkX2NhbmNlbCBzdHViIGluIGxpYmMsCisgICB3aGljaCBtZWFucyB0aGUgYWx0ZXJuYXRlIF9fZ3RocmVhZF9hY3RpdmVfcCBiZWxvdyBjYW5ub3QgYmUgdXNlZCB0aGVyZS4gICovCisKKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCAoZGVmaW5lZChfX3N1bikgJiYgZGVmaW5lZChfX3N2cjRfXykpCisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgX19ndGhyZWFkX2FjdGl2ZSA9IC0xOworCitzdGF0aWMgdm9pZAorX19ndGhyZWFkX3RyaWdnZXIgKHZvaWQpCit7CisgIF9fZ3RocmVhZF9hY3RpdmUgPSAxOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2FjdGl2ZV9wICh2b2lkKQoreworICBzdGF0aWMgcHRocmVhZF9tdXRleF90IF9fZ3RocmVhZF9hY3RpdmVfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworICBzdGF0aWMgcHRocmVhZF9vbmNlX3QgX19ndGhyZWFkX2FjdGl2ZV9vbmNlID0gUFRIUkVBRF9PTkNFX0lOSVQ7CisKKyAgLyogQXZvaWQgcmVhZGluZyBfX2d0aHJlYWRfYWN0aXZlIHR3aWNlIG9uIHRoZSBtYWluIGNvZGUgcGF0aC4gICovCisgIGludCBfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSA9IF9fZ3RocmVhZF9hY3RpdmU7CisKKyAgLyogVGhpcyB0ZXN0IGlzIG5vdCBwcm90ZWN0ZWQgdG8gYXZvaWQgdGFraW5nIGEgbG9jayBvbiB0aGUgbWFpbiBjb2RlCisgICAgIHBhdGggc28gZXZlcnkgdXBkYXRlIG9mIF9fZ3RocmVhZF9hY3RpdmUgaW4gYSB0aHJlYWRlZCBwcm9ncmFtIG11c3QKKyAgICAgYmUgYXRvbWljIHdpdGggcmVnYXJkIHRvIHRoZSByZXN1bHQgb2YgdGhlIHRlc3QuICAqLworICBpZiAoX19idWlsdGluX2V4cGVjdCAoX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgPCAwLCAwKSkKKyAgICB7CisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9vbmNlKSkKKwl7CisJICAvKiBJZiB0aGlzIHJlYWxseSBpcyBhIHRocmVhZGVkIHByb2dyYW0sIHRoZW4gd2UgbXVzdCBlbnN1cmUgdGhhdAorCSAgICAgX19ndGhyZWFkX2FjdGl2ZSBoYXMgYmVlbiBzZXQgdG8gMSBiZWZvcmUgZXhpdGluZyB0aGlzIGJsb2NrLiAgKi8KKwkgIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfbG9jaykgKCZfX2d0aHJlYWRfYWN0aXZlX211dGV4KTsKKwkgIF9fZ3RocndfKHB0aHJlYWRfb25jZSkgKCZfX2d0aHJlYWRfYWN0aXZlX29uY2UsIF9fZ3RocmVhZF90cmlnZ2VyKTsKKwkgIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKSAoJl9fZ3RocmVhZF9hY3RpdmVfbXV0ZXgpOworCX0KKworICAgICAgLyogTWFrZSBzdXJlIHdlJ2xsIG5ldmVyIGVudGVyIHRoaXMgYmxvY2sgYWdhaW4uICAqLworICAgICAgaWYgKF9fZ3RocmVhZF9hY3RpdmUgPCAwKQorCV9fZ3RocmVhZF9hY3RpdmUgPSAwOworCisgICAgICBfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSA9IF9fZ3RocmVhZF9hY3RpdmU7CisgICAgfQorCisgIHJldHVybiBfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSAhPSAwOworfQorCisjZWxzZSAvKiBuZWl0aGVyIEZyZWVCU0Qgbm9yIFNvbGFyaXMgKi8KKworLyogRm9yIGEgcHJvZ3JhbSB0byBiZSBtdWx0aS10aHJlYWRlZCB0aGUgb25seSB0aGluZyB0aGF0IGl0IGNlcnRhaW5seSBtdXN0CisgICBiZSB1c2luZyBpcyBwdGhyZWFkX2NyZWF0ZS4gIEhvd2V2ZXIsIHRoZXJlIG1heSBiZSBvdGhlciBsaWJyYXJpZXMgdGhhdAorICAgaW50ZXJjZXB0IHB0aHJlYWRfY3JlYXRlIHdpdGggdGhlaXIgb3duIGRlZmluaXRpb25zIHRvIHdyYXAgcHRocmVhZHMKKyAgIGZ1bmN0aW9uYWxpdHkgZm9yIHNvbWUgcHVycG9zZS4gIEluIHRob3NlIGNhc2VzLCBwdGhyZWFkX2NyZWF0ZSBiZWluZworICAgZGVmaW5lZCBtaWdodCBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGF0IGxpYnB0aHJlYWQgaXMgYWN0dWFsbHkgbGlua2VkCisgICBpbi4KKworICAgRm9yIHRoZSBHTlUgQyBsaWJyYXJ5LCB3ZSBjYW4gdXNlIGEga25vd24gaW50ZXJuYWwgbmFtZS4gIFRoaXMgaXMgYWx3YXlzCisgICBhdmFpbGFibGUgaW4gdGhlIEFCSSwgYnV0IG5vIG90aGVyIGxpYnJhcnkgd291bGQgZGVmaW5lIGl0LiAgVGhhdCBpcworICAgaWRlYWwsIHNpbmNlIGFueSBwdWJsaWMgcHRocmVhZCBmdW5jdGlvbiBtaWdodCBiZSBpbnRlcmNlcHRlZCBqdXN0IGFzCisgICBwdGhyZWFkX2NyZWF0ZSBtaWdodCBiZS4gIF9fcHRocmVhZF9rZXlfY3JlYXRlIGlzIGFuICJpbnRlcm5hbCIKKyAgIGltcGxlbWVudGF0aW9uIHN5bWJvbCwgYnV0IGl0IGlzIHBhcnQgb2YgdGhlIHB1YmxpYyBleHBvcnRlZCBBQkkuICBBbHNvLAorICAgaXQncyBhbW9uZyB0aGUgc3ltYm9scyB0aGF0IHRoZSBzdGF0aWMgbGlicHRocmVhZC5hIGFsd2F5cyBsaW5rcyBpbgorICAgd2hlbmV2ZXIgcHRocmVhZF9jcmVhdGUgaXMgdXNlZCwgc28gdGhlcmUgaXMgbm8gZGFuZ2VyIG9mIGEgZmFsc2UKKyAgIG5lZ2F0aXZlIHJlc3VsdCBpbiBhbnkgc3RhdGljYWxseS1saW5rZWQsIG11bHRpLXRocmVhZGVkIHByb2dyYW0uCisKKyAgIEZvciBvdGhlcnMsIHdlIGNob29zZSBwdGhyZWFkX2NhbmNlbCBhcyBhIGZ1bmN0aW9uIHRoYXQgc2VlbXMgdW5saWtlbHkKKyAgIHRvIGJlIHJlZGVmaW5lZCBieSBhbiBpbnRlcmNlcHRvciBsaWJyYXJ5LiAgVGhlIGJpb25pYyAoQW5kcm9pZCkgQworICAgbGlicmFyeSBkb2VzIG5vdCBwcm92aWRlIHB0aHJlYWRfY2FuY2VsLCBzbyB3ZSBkbyB1c2UgcHRocmVhZF9jcmVhdGUKKyAgIHRoZXJlIChhbmQgaW50ZXJjZXB0b3IgbGlicmFyaWVzIGxvc2UpLiAgKi8KKworI2lmZGVmIF9fR0xJQkNfXworX19ndGhydzIoX19ndGhyd18oX19wdGhyZWFkX2tleV9jcmVhdGUpLAorCSBfX3B0aHJlYWRfa2V5X2NyZWF0ZSwKKwkgcHRocmVhZF9rZXlfY3JlYXRlKQorIyBkZWZpbmUgR1RIUl9BQ1RJVkVfUFJPWFkJX19ndGhyd18oX19wdGhyZWFkX2tleV9jcmVhdGUpCisjZWxpZiBkZWZpbmVkIChfX0JJT05JQ19fKQorIyBkZWZpbmUgR1RIUl9BQ1RJVkVfUFJPWFkJX19ndGhyd18ocHRocmVhZF9jcmVhdGUpCisjZWxzZQorIyBkZWZpbmUgR1RIUl9BQ1RJVkVfUFJPWFkJX19ndGhyd18ocHRocmVhZF9jYW5jZWwpCisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9hY3RpdmVfcCAodm9pZCkKK3sKKyAgc3RhdGljIHZvaWQgKmNvbnN0IF9fZ3RocmVhZF9hY3RpdmVfcHRyCisgICAgPSBfX2V4dGVuc2lvbl9fICh2b2lkICopICZHVEhSX0FDVElWRV9QUk9YWTsKKyAgcmV0dXJuIF9fZ3RocmVhZF9hY3RpdmVfcHRyICE9IDA7Cit9CisKKyNlbmRpZiAvKiBGcmVlQlNEIG9yIFNvbGFyaXMgKi8KKworI2Vsc2UgLyogbm90IF9fR1hYX1dFQUtfXyAqLworCisvKiBTaW1pbGFyIHRvIFNvbGFyaXMsIEhQLVVYIDExIGZvciBQQS1SSVNDIHByb3ZpZGVzIHN0dWJzIGZvciBwdGhyZWFkCisgICBjYWxscyBpbiBzaGFyZWQgZmxhdm9ycyBvZiB0aGUgSFAtVVggQyBsaWJyYXJ5LiAgTW9zdCBvZiB0aGUgc3R1YnMKKyAgIGhhdmUgbm8gZnVuY3Rpb25hbGl0eS4gIFRoZSBkZXRhaWxzIGFyZSBkZXNjcmliZWQgaW4gdGhlICJsaWJjIGN1bXVsYXRpdmUKKyAgIHBhdGNoIiBmb3IgZWFjaCBzdWJ2ZXJzaW9uIG9mIEhQLVVYIDExLiAgVGhlcmUgYXJlIHR3byBzcGVjaWFsIGludGVyZmFjZXMKKyAgIHByb3ZpZGVkIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB0byBhIHNoYXJlZCBwdGhyZWFkCisgICBsaWJyYXJ5IG9yIG5vdC4gIEhvd2V2ZXIsIHRoZXNlIGludGVyZmFjZXMgYXJlbid0IGF2YWlsYWJsZSBpbiBlYXJseQorICAgbGlicHRocmVhZCBsaWJyYXJpZXMuICBXZSBhbHNvIG5lZWQgYSB0ZXN0IHRoYXQgd29ya3MgZm9yIGFyY2hpdmUKKyAgIGxpYnJhcmllcy4gIFdlIGNhbid0IHVzZSBwdGhyZWFkX29uY2UgYXMgc29tZSBsaWJjIHZlcnNpb25zIGNhbGwgdGhlCisgICBpbml0IGZ1bmN0aW9uLiAgV2UgYWxzbyBjYW4ndCB1c2UgcHRocmVhZF9jcmVhdGUgb3IgcHRocmVhZF9hdHRyX2luaXQKKyAgIGFzIHRoZXNlIGNyZWF0ZSBhIHRocmVhZCBhbmQgdGhlcmVieSBwcmV2ZW50IGNoYW5naW5nIHRoZSBkZWZhdWx0IHN0YWNrCisgICBzaXplLiAgVGhlIGZ1bmN0aW9uIHB0aHJlYWRfZGVmYXVsdF9zdGFja3NpemVfbnAgaXMgYXZhaWxhYmxlIGluIGJvdGgKKyAgIHRoZSBhcmNoaXZlIGFuZCBzaGFyZWQgdmVyc2lvbnMgb2YgbGlicHRocmVhZC4gICBJdCBjYW4gYmUgdXNlZCB0bworICAgZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IHB0aHJlYWQgc3RhY2sgc2l6ZS4gIFRoZXJlIGlzIGEgc3R1YiBpbiBzb21lCisgICBzaGFyZWQgbGliYyB2ZXJzaW9ucyB3aGljaCByZXR1cm5zIGEgemVybyBzaXplIGlmIHB0aHJlYWRzIGFyZSBub3QKKyAgIGFjdGl2ZS4gIFdlIHByb3ZpZGUgYW4gZXF1aXZhbGVudCBzdHViIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBsaWJjCisgICBkb2Vzbid0IHByb3ZpZGUgb25lLiAgKi8KKworI2lmIGRlZmluZWQoX19ocHBhX18pICYmIGRlZmluZWQoX19ocHV4X18pCisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgX19ndGhyZWFkX2FjdGl2ZSA9IC0xOworCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2FjdGl2ZV9wICh2b2lkKQoreworICAvKiBBdm9pZCByZWFkaW5nIF9fZ3RocmVhZF9hY3RpdmUgdHdpY2Ugb24gdGhlIG1haW4gY29kZSBwYXRoLiAgKi8KKyAgaW50IF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlID0gX19ndGhyZWFkX2FjdGl2ZTsKKyAgc2l6ZV90IF9fczsKKworICBpZiAoX19idWlsdGluX2V4cGVjdCAoX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgPCAwLCAwKSkKKyAgICB7CisgICAgICBwdGhyZWFkX2RlZmF1bHRfc3RhY2tzaXplX25wICgwLCAmX19zKTsKKyAgICAgIF9fZ3RocmVhZF9hY3RpdmUgPSBfX3MgPyAxIDogMDsKKyAgICAgIF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlID0gX19ndGhyZWFkX2FjdGl2ZTsKKyAgICB9CisKKyAgcmV0dXJuIF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlICE9IDA7Cit9CisKKyNlbHNlIC8qIG5vdCBocHBhLWhwdXggKi8KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9hY3RpdmVfcCAodm9pZCkKK3sKKyAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAvKiBocHBhLWhwdXggKi8KKworI2VuZGlmIC8qIF9fR1hYX1dFQUtfXyAqLworCisjaWZkZWYgX0xJQk9CSkMKKworLyogVGhpcyBpcyB0aGUgY29uZmlnLmggZmlsZSBpbiBsaWJvYmpjLyAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaWZkZWYgSEFWRV9TQ0hFRF9ICisjIGluY2x1ZGUgPHNjaGVkLmg+CisjZW5kaWYKKworLyogS2V5IHN0cnVjdHVyZSBmb3IgbWFpbnRhaW5pbmcgdGhyZWFkIHNwZWNpZmljIHN0b3JhZ2UgKi8KK3N0YXRpYyBwdGhyZWFkX2tleV90IF9vYmpjX3RocmVhZF9zdG9yYWdlOworc3RhdGljIHB0aHJlYWRfYXR0cl90IF9vYmpjX3RocmVhZF9hdHRyaWJzOworCisvKiBUaHJlYWQgbG9jYWwgc3RvcmFnZSBmb3IgYSBzaW5nbGUgdGhyZWFkICovCitzdGF0aWMgdm9pZCAqdGhyZWFkX2xvY2FsX3N0b3JhZ2UgPSBOVUxMOworCisvKiBCYWNrZW5kIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqLworCisvKiBJbml0aWFsaXplIHRoZSB0aHJlYWRzIHN1YnN5c3RlbS4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfaW5pdF90aHJlYWRfc3lzdGVtICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIC8qIEluaXRpYWxpemUgdGhlIHRocmVhZCBzdG9yYWdlIGtleS4gICovCisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9rZXlfY3JlYXRlKSAoJl9vYmpjX3RocmVhZF9zdG9yYWdlLCBOVUxMKSA9PSAwKQorCXsKKwkgIC8qIFRoZSBub3JtYWwgZGVmYXVsdCBkZXRhY2ggc3RhdGUgZm9yIHRocmVhZHMgaXMKKwkgICAqIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFIHdoaWNoIGNhdXNlcyB0aHJlYWRzIHRvIG5vdCBkaWUKKwkgICAqIHdoZW4geW91IHRoaW5rIHRoZXkgc2hvdWxkLiAgKi8KKwkgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX2F0dHJfaW5pdCkgKCZfb2JqY190aHJlYWRfYXR0cmlicykgPT0gMAorCSAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSkgKCZfb2JqY190aHJlYWRfYXR0cmlicywKKwkJCQkJICAgICAgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpID09IDApCisJICAgIHJldHVybiAwOworCX0KKyAgICB9CisKKyAgcmV0dXJuIC0xOworfQorCisvKiBDbG9zZSB0aGUgdGhyZWFkcyBzdWJzeXN0ZW0uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2Nsb3NlX3RocmVhZF9zeXN0ZW0gKHZvaWQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfa2V5X2RlbGV0ZSkgKF9vYmpjX3RocmVhZF9zdG9yYWdlKSA9PSAwCisgICAgICAmJiBfX2d0aHJ3XyhwdGhyZWFkX2F0dHJfZGVzdHJveSkgKCZfb2JqY190aHJlYWRfYXR0cmlicykgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gLTE7Cit9CisKKy8qIEJhY2tlbmQgdGhyZWFkIGZ1bmN0aW9ucyAqLworCisvKiBDcmVhdGUgYSBuZXcgdGhyZWFkIG9mIGV4ZWN1dGlvbi4gICovCitzdGF0aWMgaW5saW5lIG9iamNfdGhyZWFkX3QKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9kZXRhY2ggKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpCit7CisgIG9iamNfdGhyZWFkX3QgdGhyZWFkX2lkOworICBwdGhyZWFkX3QgbmV3X3RocmVhZF9oYW5kbGU7CisKKyAgaWYgKCFfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCEoX19ndGhyd18ocHRocmVhZF9jcmVhdGUpICgmbmV3X3RocmVhZF9oYW5kbGUsICZfb2JqY190aHJlYWRfYXR0cmlicywKKwkJCQkgICh2b2lkICopIGZ1bmMsIGFyZykpKQorICAgIHRocmVhZF9pZCA9IChvYmpjX3RocmVhZF90KSBuZXdfdGhyZWFkX2hhbmRsZTsKKyAgZWxzZQorICAgIHRocmVhZF9pZCA9IE5VTEw7CisKKyAgcmV0dXJuIHRocmVhZF9pZDsKK30KKworLyogU2V0IHRoZSBjdXJyZW50IHRocmVhZCdzIHByaW9yaXR5LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfc2V0X3ByaW9yaXR5IChpbnQgcHJpb3JpdHkpCit7CisgIGlmICghX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiAtMTsKKyAgZWxzZQorICAgIHsKKyNpZmRlZiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORworI2lmZGVmIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORworICAgICAgcHRocmVhZF90IHRocmVhZF9pZCA9IF9fZ3RocndfKHB0aHJlYWRfc2VsZikgKCk7CisgICAgICBpbnQgcG9saWN5OworICAgICAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtczsKKyAgICAgIGludCBwcmlvcml0eV9taW4sIHByaW9yaXR5X21heDsKKworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfZ2V0c2NoZWRwYXJhbSkgKHRocmVhZF9pZCwgJnBvbGljeSwgJnBhcmFtcykgPT0gMCkKKwl7CisJICBpZiAoKHByaW9yaXR5X21heCA9IF9fZ3RocndfKHNjaGVkX2dldF9wcmlvcml0eV9tYXgpIChwb2xpY3kpKSA9PSAtMSkKKwkgICAgcmV0dXJuIC0xOworCisJICBpZiAoKHByaW9yaXR5X21pbiA9IF9fZ3RocndfKHNjaGVkX2dldF9wcmlvcml0eV9taW4pIChwb2xpY3kpKSA9PSAtMSkKKwkgICAgcmV0dXJuIC0xOworCisJICBpZiAocHJpb3JpdHkgPiBwcmlvcml0eV9tYXgpCisJICAgIHByaW9yaXR5ID0gcHJpb3JpdHlfbWF4OworCSAgZWxzZSBpZiAocHJpb3JpdHkgPCBwcmlvcml0eV9taW4pCisJICAgIHByaW9yaXR5ID0gcHJpb3JpdHlfbWluOworCSAgcGFyYW1zLnNjaGVkX3ByaW9yaXR5ID0gcHJpb3JpdHk7CisKKwkgIC8qCisJICAgKiBUaGUgc29sYXJpcyA3IGFuZCBzZXZlcmFsIG90aGVyIG1hbiBwYWdlcyBpbmNvcnJlY3RseSBzdGF0ZSB0aGF0CisJICAgKiB0aGlzIHNob3VsZCBiZSBhIHBvaW50ZXIgdG8gcG9saWN5IGJ1dCBwdGhyZWFkLmggaXMgdW5pdmVyc2FsbHkKKwkgICAqIGF0IG9kZHMgd2l0aCB0aGlzLgorCSAgICovCisJICBpZiAoX19ndGhyd18ocHRocmVhZF9zZXRzY2hlZHBhcmFtKSAodGhyZWFkX2lkLCBwb2xpY3ksICZwYXJhbXMpID09IDApCisJICAgIHJldHVybiAwOworCX0KKyNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KKyNlbmRpZiAvKiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORyAqLworICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworLyogUmV0dXJuIHRoZSBjdXJyZW50IHRocmVhZCdzIHByaW9yaXR5LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfZ2V0X3ByaW9yaXR5ICh2b2lkKQoreworI2lmZGVmIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HCisjaWZkZWYgX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgaW50IHBvbGljeTsKKyAgICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbXM7CisKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX2dldHNjaGVkcGFyYW0pIChfX2d0aHJ3XyhwdGhyZWFkX3NlbGYpICgpLCAmcG9saWN5LCAmcGFyYW1zKSA9PSAwKQorCXJldHVybiBwYXJhbXMuc2NoZWRfcHJpb3JpdHk7CisgICAgICBlbHNlCisJcmV0dXJuIC0xOworICAgIH0KKyAgZWxzZQorI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyAqLworI2VuZGlmIC8qIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HICovCisgICAgcmV0dXJuIE9CSkNfVEhSRUFEX0lOVEVSQUNUSVZFX1BSSU9SSVRZOworfQorCisvKiBZaWVsZCBvdXIgcHJvY2VzcyB0aW1lIHRvIGFub3RoZXIgdGhyZWFkLiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorX19ndGhyZWFkX29iamNfdGhyZWFkX3lpZWxkICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIF9fZ3RocndfKHNjaGVkX3lpZWxkKSAoKTsKK30KKworLyogVGVybWluYXRlIHRoZSBjdXJyZW50IHRocmVhZC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfdGhyZWFkX2V4aXQgKHZvaWQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgLyogZXhpdCB0aGUgdGhyZWFkICovCisgICAgX19ndGhyd18ocHRocmVhZF9leGl0KSAoJl9fb2JqY190aHJlYWRfZXhpdF9zdGF0dXMpOworCisgIC8qIEZhaWxlZCBpZiB3ZSByZWFjaGVkIGhlcmUgKi8KKyAgcmV0dXJuIC0xOworfQorCisvKiBSZXR1cm5zIGFuIGludGVnZXIgdmFsdWUgd2hpY2ggdW5pcXVlbHkgZGVzY3JpYmVzIGEgdGhyZWFkLiAgKi8KK3N0YXRpYyBpbmxpbmUgb2JqY190aHJlYWRfdAorX19ndGhyZWFkX29iamNfdGhyZWFkX2lkICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiAob2JqY190aHJlYWRfdCkgX19ndGhyd18ocHRocmVhZF9zZWxmKSAoKTsKKyAgZWxzZQorICAgIHJldHVybiAob2JqY190aHJlYWRfdCkgMTsKK30KKworLyogU2V0cyB0aGUgdGhyZWFkJ3MgbG9jYWwgc3RvcmFnZSBwb2ludGVyLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfc2V0X2RhdGEgKHZvaWQgKnZhbHVlKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX3NldHNwZWNpZmljKSAoX29iamNfdGhyZWFkX3N0b3JhZ2UsIHZhbHVlKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHRocmVhZF9sb2NhbF9zdG9yYWdlID0gdmFsdWU7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qIFJldHVybnMgdGhlIHRocmVhZCdzIGxvY2FsIHN0b3JhZ2UgcG9pbnRlci4gICovCitzdGF0aWMgaW5saW5lIHZvaWQgKgorX19ndGhyZWFkX29iamNfdGhyZWFkX2dldF9kYXRhICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2dldHNwZWNpZmljKSAoX29iamNfdGhyZWFkX3N0b3JhZ2UpOworICBlbHNlCisgICAgcmV0dXJuIHRocmVhZF9sb2NhbF9zdG9yYWdlOworfQorCisvKiBCYWNrZW5kIG11dGV4IGZ1bmN0aW9ucyAqLworCisvKiBBbGxvY2F0ZSBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF9hbGxvY2F0ZSAob2JqY19tdXRleF90IG11dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIG11dGV4LT5iYWNrZW5kID0gb2JqY19tYWxsb2MgKHNpemVvZiAocHRocmVhZF9tdXRleF90KSk7CisKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2luaXQpICgocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kLCBOVUxMKSkKKwl7CisJICBvYmpjX2ZyZWUgKG11dGV4LT5iYWNrZW5kKTsKKwkgIG11dGV4LT5iYWNrZW5kID0gTlVMTDsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBEZWFsbG9jYXRlIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X2RlYWxsb2NhdGUgKG9iamNfbXV0ZXhfdCBtdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICB7CisgICAgICBpbnQgY291bnQ7CisKKyAgICAgIC8qCisgICAgICAgKiBQb3NpeCBUaHJlYWRzIHNwZWNpZmljYWxseSByZXF1aXJlIHRoYXQgdGhlIHRocmVhZCBiZSB1bmxvY2tlZAorICAgICAgICogZm9yIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSkgdG8gd29yay4KKyAgICAgICAqLworCisgICAgICBkbworCXsKKwkgIGNvdW50ID0gX19ndGhyd18ocHRocmVhZF9tdXRleF91bmxvY2spICgocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kKTsKKwkgIGlmIChjb3VudCA8IDApCisJICAgIHJldHVybiAtMTsKKwl9CisgICAgICB3aGlsZSAoY291bnQpOworCisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9tdXRleF9kZXN0cm95KSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCkpCisJcmV0dXJuIC0xOworCisgICAgICBvYmpjX2ZyZWUgKG11dGV4LT5iYWNrZW5kKTsKKyAgICAgIG11dGV4LT5iYWNrZW5kID0gTlVMTDsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBHcmFiIGEgbG9jayBvbiBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF9sb2NrIChvYmpjX211dGV4X3QgbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfbG9jaykgKChwdGhyZWFkX211dGV4X3QgKikgbXV0ZXgtPmJhY2tlbmQpICE9IDApCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogVHJ5IHRvIGdyYWIgYSBsb2NrIG9uIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X3RyeWxvY2sgKG9iamNfbXV0ZXhfdCBtdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKQorICAgICAgJiYgX19ndGhyd18ocHRocmVhZF9tdXRleF90cnlsb2NrKSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCkgIT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBVbmxvY2sgdGhlIG11dGV4ICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfdW5sb2NrIChvYmpjX211dGV4X3QgbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCkgIT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBCYWNrZW5kIGNvbmRpdGlvbiBtdXRleCBmdW5jdGlvbnMgKi8KKworLyogQWxsb2NhdGUgYSBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9hbGxvY2F0ZSAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24pCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgY29uZGl0aW9uLT5iYWNrZW5kID0gb2JqY19tYWxsb2MgKHNpemVvZiAocHRocmVhZF9jb25kX3QpKTsKKworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfY29uZF9pbml0KSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCwgTlVMTCkpCisJeworCSAgb2JqY19mcmVlIChjb25kaXRpb24tPmJhY2tlbmQpOworCSAgY29uZGl0aW9uLT5iYWNrZW5kID0gTlVMTDsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBEZWFsbG9jYXRlIGEgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fZGVhbGxvY2F0ZSAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24pCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfY29uZF9kZXN0cm95KSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCkpCisJcmV0dXJuIC0xOworCisgICAgICBvYmpjX2ZyZWUgKGNvbmRpdGlvbi0+YmFja2VuZCk7CisgICAgICBjb25kaXRpb24tPmJhY2tlbmQgPSBOVUxMOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFdhaXQgb24gdGhlIGNvbmRpdGlvbiAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl93YWl0IChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbiwgb2JqY19tdXRleF90IG11dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfd2FpdCkgKChwdGhyZWFkX2NvbmRfdCAqKSBjb25kaXRpb24tPmJhY2tlbmQsCisJCQkgICAgICAocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kKTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBXYWtlIHVwIGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9icm9hZGNhc3QgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLyogV2FrZSB1cCBvbmUgdGhyZWFkIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9zaWduYWwgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfc2lnbmFsKSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworI2Vsc2UgLyogX0xJQk9CSkMgKi8KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jcmVhdGUgKF9fZ3RocmVhZF90ICpfX3RocmVhZGlkLCB2b2lkICooKl9fZnVuYykgKHZvaWQqKSwKKwkJICB2b2lkICpfX2FyZ3MpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NyZWF0ZSkgKF9fdGhyZWFkaWQsIE5VTEwsIF9fZnVuYywgX19hcmdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9qb2luIChfX2d0aHJlYWRfdCBfX3RocmVhZGlkLCB2b2lkICoqX192YWx1ZV9wdHIpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2pvaW4pIChfX3RocmVhZGlkLCBfX3ZhbHVlX3B0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfZGV0YWNoIChfX2d0aHJlYWRfdCBfX3RocmVhZGlkKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9kZXRhY2gpIChfX3RocmVhZGlkKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9lcXVhbCAoX19ndGhyZWFkX3QgX190MSwgX19ndGhyZWFkX3QgX190MikKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfZXF1YWwpIChfX3QxLCBfX3QyKTsKK30KKworc3RhdGljIGlubGluZSBfX2d0aHJlYWRfdAorX19ndGhyZWFkX3NlbGYgKHZvaWQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX3NlbGYpICgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3lpZWxkICh2b2lkKQoreworICByZXR1cm4gX19ndGhyd18oc2NoZWRfeWllbGQpICgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29uY2UgKF9fZ3RocmVhZF9vbmNlX3QgKl9fb25jZSwgdm9pZCAoKl9fZnVuYykgKHZvaWQpKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX29uY2UpIChfX29uY2UsIF9fZnVuYyk7CisgIGVsc2UKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfa2V5X2NyZWF0ZSAoX19ndGhyZWFkX2tleV90ICpfX2tleSwgdm9pZCAoKl9fZHRvcikgKHZvaWQgKikpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2tleV9jcmVhdGUpIChfX2tleSwgX19kdG9yKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9rZXlfZGVsZXRlIChfX2d0aHJlYWRfa2V5X3QgX19rZXkpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2tleV9kZWxldGUpIChfX2tleSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitfX2d0aHJlYWRfZ2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfZ2V0c3BlY2lmaWMpIChfX2tleSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfc2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSwgY29uc3Qgdm9pZCAqX19wdHIpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX3NldHNwZWNpZmljKSAoX19rZXksIF9fcHRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2d0aHJlYWRfbXV0ZXhfaW5pdF9mdW5jdGlvbiAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgX19ndGhyd18ocHRocmVhZF9tdXRleF9pbml0KSAoX19tdXRleCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSkgKF9fbXV0ZXgpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfbG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfbG9jaykgKF9fbXV0ZXgpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfdHJ5bG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaykgKF9fbXV0ZXgpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X3RpbWVkbG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgsCisJCQkgICBjb25zdCBfX2d0aHJlYWRfdGltZV90ICpfX2Fic190aW1lb3V0KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X3RpbWVkbG9jaykgKF9fbXV0ZXgsIF9fYWJzX3RpbWVvdXQpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF91bmxvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X3VubG9jaykgKF9fbXV0ZXgpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiAhZGVmaW5lZCggUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlApIFwKKyAgfHwgZGVmaW5lZChfR1RIUkVBRF9VU0VfUkVDVVJTSVZFX01VVEVYX0lOSVRfRlVOQykKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2luaXRfZnVuY3Rpb24gKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICB7CisgICAgICBwdGhyZWFkX211dGV4YXR0cl90IF9fYXR0cjsKKyAgICAgIGludCBfX3I7CisKKyAgICAgIF9fciA9IF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQpICgmX19hdHRyKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUpICgmX19hdHRyLAorCQkJCQkJICAgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUpOworICAgICAgaWYgKCFfX3IpCisJX19yID0gX19ndGhyd18ocHRocmVhZF9tdXRleF9pbml0KSAoX19tdXRleCwgJl9fYXR0cik7CisgICAgICBpZiAoIV9fcikKKwlfX3IgPSBfX2d0aHJ3XyhwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KSAoJl9fYXR0cik7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfbG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX211dGV4X2xvY2sgKF9fbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90cnlsb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfdHJ5bG9jayAoX19tdXRleCk7Cit9CisKKyNpZiBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90aW1lZGxvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCwKKwkJCQkgICAgIGNvbnN0IF9fZ3RocmVhZF90aW1lX3QgKl9fYWJzX3RpbWVvdXQpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfdGltZWRsb2NrIChfX211dGV4LCBfX2Fic190aW1lb3V0KTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF91bmxvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF91bmxvY2sgKF9fbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9kZXN0cm95IChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSAoX19tdXRleCk7Cit9CisKKyNpZmRlZiBfR1RIUkVBRF9VU0VfQ09ORF9JTklUX0ZVTkMKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19ndGhyZWFkX2NvbmRfaW5pdF9mdW5jdGlvbiAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIF9fZ3RocndfKHB0aHJlYWRfY29uZF9pbml0KSAoX19jb25kLCBOVUxMKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NvbmRfYnJvYWRjYXN0IChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KSAoX19jb25kKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jb25kX3NpZ25hbCAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX3NpZ25hbCkgKF9fY29uZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF93YWl0IChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQsIF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX3dhaXQpIChfX2NvbmQsIF9fbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NvbmRfdGltZWR3YWl0IChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQsIF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4LAorCQkJICBjb25zdCBfX2d0aHJlYWRfdGltZV90ICpfX2Fic190aW1lb3V0KQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX3RpbWVkd2FpdCkgKF9fY29uZCwgX19tdXRleCwgX19hYnNfdGltZW91dCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF93YWl0X3JlY3Vyc2l2ZSAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kLAorCQkJICAgICAgIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9jb25kX3dhaXQgKF9fY29uZCwgX19tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF9kZXN0cm95IChfX2d0aHJlYWRfY29uZF90KiBfX2NvbmQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfZGVzdHJveSkgKF9fY29uZCk7Cit9CisKKyNlbmRpZiAvKiBfTElCT0JKQyAqLworCisjZW5kaWYgLyogISBfR0xJQkNYWF9HQ0NfR1RIUl9QT1NJWF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2d0aHItc2luZ2xlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2d0aHItc2luZ2xlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFlNTc1ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvZ3Roci1zaW5nbGUuaApAQCAtMCwwICsxLDI5OCBAQAorLyogVGhyZWFkcyBjb21wYXRpYmlsaXR5IHJvdXRpbmVzIGZvciBsaWJnY2MyIGFuZCBsaWJvYmpjLiAgKi8KKy8qIENvbXBpbGUgdGhpcyBvbmUgd2l0aCBnY2MuICAqLworLyogQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX0dMSUJDWFhfR0NDX0dUSFJfU0lOR0xFX0gKKyNkZWZpbmUgX0dMSUJDWFhfR0NDX0dUSFJfU0lOR0xFX0gKKworLyogSnVzdCBwcm92aWRlIGNvbXBhdGliaWxpdHkgZm9yIG11dGV4IGhhbmRsaW5nLiAgKi8KKwordHlwZWRlZiBpbnQgX19ndGhyZWFkX2tleV90OwordHlwZWRlZiBpbnQgX19ndGhyZWFkX29uY2VfdDsKK3R5cGVkZWYgaW50IF9fZ3RocmVhZF9tdXRleF90OwordHlwZWRlZiBpbnQgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90OworCisjZGVmaW5lIF9fR1RIUkVBRF9PTkNFX0lOSVQgMAorI2RlZmluZSBfX0dUSFJFQURfTVVURVhfSU5JVCAwCisjZGVmaW5lIF9fR1RIUkVBRF9NVVRFWF9JTklUX0ZVTkNUSU9OKG14KQorI2RlZmluZSBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVQgMAorCisjZGVmaW5lIF9HTElCQ1hYX1VOVVNFRCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorCisjaWZkZWYgX0xJQk9CSkMKKworLyogVGhyZWFkIGxvY2FsIHN0b3JhZ2UgZm9yIGEgc2luZ2xlIHRocmVhZCAqLworc3RhdGljIHZvaWQgKnRocmVhZF9sb2NhbF9zdG9yYWdlID0gTlVMTDsKKworLyogQmFja2VuZCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKi8KKworLyogSW5pdGlhbGl6ZSB0aGUgdGhyZWFkcyBzdWJzeXN0ZW0uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2luaXRfdGhyZWFkX3N5c3RlbSAodm9pZCkKK3sKKyAgLyogTm8gdGhyZWFkIHN1cHBvcnQgYXZhaWxhYmxlICovCisgIHJldHVybiAtMTsKK30KKworLyogQ2xvc2UgdGhlIHRocmVhZHMgc3Vic3lzdGVtLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jbG9zZV90aHJlYWRfc3lzdGVtICh2b2lkKQoreworICAvKiBObyB0aHJlYWQgc3VwcG9ydCBhdmFpbGFibGUgKi8KKyAgcmV0dXJuIC0xOworfQorCisvKiBCYWNrZW5kIHRocmVhZCBmdW5jdGlvbnMgKi8KKworLyogQ3JlYXRlIGEgbmV3IHRocmVhZCBvZiBleGVjdXRpb24uICAqLworc3RhdGljIGlubGluZSBvYmpjX3RocmVhZF90CitfX2d0aHJlYWRfb2JqY190aHJlYWRfZGV0YWNoICh2b2lkICgqIGZ1bmMpKHZvaWQgKiksIHZvaWQgKiBhcmcgX0dMSUJDWFhfVU5VU0VEKQoreworICAvKiBObyB0aHJlYWQgc3VwcG9ydCBhdmFpbGFibGUgKi8KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFNldCB0aGUgY3VycmVudCB0aHJlYWQncyBwcmlvcml0eS4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfdGhyZWFkX3NldF9wcmlvcml0eSAoaW50IHByaW9yaXR5IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgLyogTm8gdGhyZWFkIHN1cHBvcnQgYXZhaWxhYmxlICovCisgIHJldHVybiAtMTsKK30KKworLyogUmV0dXJuIHRoZSBjdXJyZW50IHRocmVhZCdzIHByaW9yaXR5LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfZ2V0X3ByaW9yaXR5ICh2b2lkKQoreworICByZXR1cm4gT0JKQ19USFJFQURfSU5URVJBQ1RJVkVfUFJJT1JJVFk7Cit9CisKKy8qIFlpZWxkIG91ciBwcm9jZXNzIHRpbWUgdG8gYW5vdGhlciB0aHJlYWQuICAqLworc3RhdGljIGlubGluZSB2b2lkCitfX2d0aHJlYWRfb2JqY190aHJlYWRfeWllbGQgKHZvaWQpCit7CisgIHJldHVybjsKK30KKworLyogVGVybWluYXRlIHRoZSBjdXJyZW50IHRocmVhZC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfdGhyZWFkX2V4aXQgKHZvaWQpCit7CisgIC8qIE5vIHRocmVhZCBzdXBwb3J0IGF2YWlsYWJsZSAqLworICAvKiBTaG91bGQgd2UgcmVhbGx5IGV4aXQgdGhlIHByb2dyYW0gKi8KKyAgLyogZXhpdCAoJl9fb2JqY190aHJlYWRfZXhpdF9zdGF0dXMpOyAqLworICByZXR1cm4gLTE7Cit9CisKKy8qIFJldHVybnMgYW4gaW50ZWdlciB2YWx1ZSB3aGljaCB1bmlxdWVseSBkZXNjcmliZXMgYSB0aHJlYWQuICAqLworc3RhdGljIGlubGluZSBvYmpjX3RocmVhZF90CitfX2d0aHJlYWRfb2JqY190aHJlYWRfaWQgKHZvaWQpCit7CisgIC8qIE5vIHRocmVhZCBzdXBwb3J0LCB1c2UgMS4gICovCisgIHJldHVybiAob2JqY190aHJlYWRfdCkgMTsKK30KKworLyogU2V0cyB0aGUgdGhyZWFkJ3MgbG9jYWwgc3RvcmFnZSBwb2ludGVyLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfc2V0X2RhdGEgKHZvaWQgKnZhbHVlKQoreworICB0aHJlYWRfbG9jYWxfc3RvcmFnZSA9IHZhbHVlOworICByZXR1cm4gMDsKK30KKworLyogUmV0dXJucyB0aGUgdGhyZWFkJ3MgbG9jYWwgc3RvcmFnZSBwb2ludGVyLiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitfX2d0aHJlYWRfb2JqY190aHJlYWRfZ2V0X2RhdGEgKHZvaWQpCit7CisgIHJldHVybiB0aHJlYWRfbG9jYWxfc3RvcmFnZTsKK30KKworLyogQmFja2VuZCBtdXRleCBmdW5jdGlvbnMgKi8KKworLyogQWxsb2NhdGUgYSBtdXRleC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfYWxsb2NhdGUgKG9iamNfbXV0ZXhfdCBtdXRleCBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCisvKiBEZWFsbG9jYXRlIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X2RlYWxsb2NhdGUgKG9iamNfbXV0ZXhfdCBtdXRleCBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCisvKiBHcmFiIGEgbG9jayBvbiBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF9sb2NrIChvYmpjX211dGV4X3QgbXV0ZXggX0dMSUJDWFhfVU5VU0VEKQoreworICAvKiBUaGVyZSBjYW4gb25seSBiZSBvbmUgdGhyZWFkLCBzbyB3ZSBhbHdheXMgZ2V0IHRoZSBsb2NrICovCisgIHJldHVybiAwOworfQorCisvKiBUcnkgdG8gZ3JhYiBhIGxvY2sgb24gYSBtdXRleC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfdHJ5bG9jayAob2JqY19tdXRleF90IG11dGV4IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgLyogVGhlcmUgY2FuIG9ubHkgYmUgb25lIHRocmVhZCwgc28gd2UgYWx3YXlzIGdldCB0aGUgbG9jayAqLworICByZXR1cm4gMDsKK30KKworLyogVW5sb2NrIHRoZSBtdXRleCAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X3VubG9jayAob2JqY19tdXRleF90IG11dGV4IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEJhY2tlbmQgY29uZGl0aW9uIG11dGV4IGZ1bmN0aW9ucyAqLworCisvKiBBbGxvY2F0ZSBhIGNvbmRpdGlvbi4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfY29uZGl0aW9uX2FsbG9jYXRlIChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbiBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCisvKiBEZWFsbG9jYXRlIGEgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fZGVhbGxvY2F0ZSAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24gX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworLyogV2FpdCBvbiB0aGUgY29uZGl0aW9uICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfY29uZGl0aW9uX3dhaXQgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uIF9HTElCQ1hYX1VOVVNFRCwKKwkJCSAgICAgICBvYmpjX211dGV4X3QgbXV0ZXggX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworLyogV2FrZSB1cCBhbGwgdGhyZWFkcyB3YWl0aW5nIG9uIHRoaXMgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fYnJvYWRjYXN0IChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbiBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCisvKiBXYWtlIHVwIG9uZSB0aHJlYWQgd2FpdGluZyBvbiB0aGlzIGNvbmRpdGlvbi4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfY29uZGl0aW9uX3NpZ25hbCAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24gX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworI2Vsc2UgLyogX0xJQk9CSkMgKi8KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9hY3RpdmVfcCAodm9pZCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb25jZSAoX19ndGhyZWFkX29uY2VfdCAqX19vbmNlIF9HTElCQ1hYX1VOVVNFRCwgdm9pZCAoKl9fZnVuYykgKHZvaWQpIF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9HTElCQ1hYX1VOVVNFRAorX19ndGhyZWFkX2tleV9jcmVhdGUgKF9fZ3RocmVhZF9rZXlfdCAqX19rZXkgX0dMSUJDWFhfVU5VU0VELCB2b2lkICgqX19mdW5jKSAodm9pZCAqKSBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9HTElCQ1hYX1VOVVNFRAorX19ndGhyZWFkX2tleV9kZWxldGUgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKgorX19ndGhyZWFkX2dldHNwZWNpZmljIChfX2d0aHJlYWRfa2V5X3QgX19rZXkgX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9zZXRzcGVjaWZpYyAoX19ndGhyZWFkX2tleV90IF9fa2V5IF9HTElCQ1hYX1VOVVNFRCwgY29uc3Qgdm9pZCAqX192IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXggX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF9sb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X3RyeWxvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfdW5sb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9sb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfbG9jayAoX19tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3RyeWxvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF90cnlsb2NrIChfX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdW5sb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfdW5sb2NrIChfX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfZGVzdHJveSAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX211dGV4X2Rlc3Ryb3kgKF9fbXV0ZXgpOworfQorCisjZW5kaWYgLyogX0xJQk9CSkMgKi8KKworI3VuZGVmIF9HTElCQ1hYX1VOVVNFRAorCisjZW5kaWYgLyogISBfR0xJQkNYWF9HQ0NfR1RIUl9TSU5HTEVfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9ndGhyLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL2d0aHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzMzOTRlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9ndGhyLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8qIFRocmVhZHMgY29tcGF0aWJpbGl0eSByb3V0aW5lcyBmb3IgbGliZ2NjMi4gICovCisvKiBDb21waWxlIHRoaXMgb25lIHdpdGggZ2NjLiAgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1VuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9HTElCQ1hYX0dDQ19HVEhSX0gKKyNkZWZpbmUgX0dMSUJDWFhfR0NDX0dUSFJfSAorCisjaWZuZGVmIF9HTElCQ1hYX0hJREVfRVhQT1JUUworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwdXNoKGRlZmF1bHQpCisjZW5kaWYKKworLyogSWYgdGhpcyBmaWxlIGlzIGNvbXBpbGVkIHdpdGggdGhyZWFkcyBzdXBwb3J0LCBpdCBtdXN0CisgICAgICAgI2RlZmluZSBfX0dUSFJFQURTIDEKKyAgIHRvIGluZGljYXRlIHRoYXQgdGhyZWFkcyBzdXBwb3J0IGlzIHByZXNlbnQuICBBbHNvIGl0IGhhcyBkZWZpbmUKKyAgIGZ1bmN0aW9uCisgICAgIGludCBfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgIHRoYXQgcmV0dXJucyAxIGlmIHRocmVhZCBzeXN0ZW0gaXMgYWN0aXZlLCAwIGlmIG5vdC4KKworICAgVGhlIHRocmVhZHMgaW50ZXJmYWNlIG11c3QgZGVmaW5lIHRoZSBmb2xsb3dpbmcgdHlwZXM6CisgICAgIF9fZ3RocmVhZF9rZXlfdAorICAgICBfX2d0aHJlYWRfb25jZV90CisgICAgIF9fZ3RocmVhZF9tdXRleF90CisgICAgIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdAorCisgICBUaGUgdGhyZWFkcyBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgdGhlIGZvbGxvd2luZyBtYWNyb3M6CisKKyAgICAgX19HVEhSRUFEX09OQ0VfSU5JVAorICAgICAJCXRvIGluaXRpYWxpemUgX19ndGhyZWFkX29uY2VfdAorICAgICBfX0dUSFJFQURfTVVURVhfSU5JVAorICAgICAJCXRvIGluaXRpYWxpemUgX19ndGhyZWFkX211dGV4X3QgdG8gZ2V0IGEgZmFzdAorCQlub24tcmVjdXJzaXZlIG11dGV4LgorICAgICBfX0dUSFJFQURfTVVURVhfSU5JVF9GVU5DVElPTgorCQl0byBpbml0aWFsaXplIF9fZ3RocmVhZF9tdXRleF90IHRvIGdldCBhIGZhc3QKKwkJbm9uLXJlY3Vyc2l2ZSBtdXRleC4KKwkJRGVmaW5lIHRoaXMgdG8gYSBmdW5jdGlvbiB3aGljaCBsb29rcyBsaWtlIHRoaXM6CisJCSAgdm9pZCBfX0dUSFJFQURfTVVURVhfSU5JVF9GVU5DVElPTiAoX19ndGhyZWFkX211dGV4X3QgKikKKyAgICAgCQlTb21lIHN5c3RlbXMgY2FuJ3QgaW5pdGlhbGl6ZSBhIG11dGV4IHdpdGhvdXQgYQorCQlmdW5jdGlvbiBjYWxsLiAgRG9uJ3QgZGVmaW5lIF9fR1RIUkVBRF9NVVRFWF9JTklUIGluIHRoaXMgY2FzZS4KKyAgICAgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUCisgICAgIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVF9GVU5DVElPTgorICAgICAJCWFzIGFib3ZlLCBidXQgZm9yIGEgcmVjdXJzaXZlIG11dGV4LgorCisgICBUaGUgdGhyZWFkcyBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgdGhlIGZvbGxvd2luZyBzdGF0aWMgZnVuY3Rpb25zOgorCisgICAgIGludCBfX2d0aHJlYWRfb25jZSAoX19ndGhyZWFkX29uY2VfdCAqb25jZSwgdm9pZCAoKmZ1bmMpICgpKQorCisgICAgIGludCBfX2d0aHJlYWRfa2V5X2NyZWF0ZSAoX19ndGhyZWFkX2tleV90ICprZXlwLCB2b2lkICgqZHRvcikgKHZvaWQgKikpCisgICAgIGludCBfX2d0aHJlYWRfa2V5X2RlbGV0ZSAoX19ndGhyZWFkX2tleV90IGtleSkKKworICAgICB2b2lkICpfX2d0aHJlYWRfZ2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBrZXkpCisgICAgIGludCBfX2d0aHJlYWRfc2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBrZXksIGNvbnN0IHZvaWQgKnB0cikKKworICAgICBpbnQgX19ndGhyZWFkX211dGV4X2Rlc3Ryb3kgKF9fZ3RocmVhZF9tdXRleF90ICptdXRleCk7CisgICAgIGludCBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2Rlc3Ryb3kgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqbXV0ZXgpOworCisgICAgIGludCBfX2d0aHJlYWRfbXV0ZXhfbG9jayAoX19ndGhyZWFkX211dGV4X3QgKm11dGV4KTsKKyAgICAgaW50IF9fZ3RocmVhZF9tdXRleF90cnlsb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpOworICAgICBpbnQgX19ndGhyZWFkX211dGV4X3VubG9jayAoX19ndGhyZWFkX211dGV4X3QgKm11dGV4KTsKKworICAgICBpbnQgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9sb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKm11dGV4KTsKKyAgICAgaW50IF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdHJ5bG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICptdXRleCk7CisgICAgIGludCBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3VubG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICptdXRleCk7CisKKyAgIFRoZSBmb2xsb3dpbmcgYXJlIHN1cHBvcnRlZCBpbiBQT1NJWCB0aHJlYWRzIG9ubHkuIFRoZXkgYXJlIHJlcXVpcmVkIHRvCisgICBmaXggYSBkZWFkbG9jayBpbiBzdGF0aWMgaW5pdGlhbGl6YXRpb24gaW5zaWRlIGxpYnN1cGMrKy4gVGhlIGhlYWRlciBmaWxlCisgICBndGhyLXBvc2l4LmggZGVmaW5lcyBhIHN5bWJvbCBfX0dUSFJFQURfSEFTX0NPTkQgdG8gc2lnbmlmeSB0aGF0IHRoZXNlIGV4dHJhCisgICBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkLgorCisgICBUeXBlczoKKyAgICAgX19ndGhyZWFkX2NvbmRfdAorCisgICBNYWNyb3M6CisgICAgIF9fR1RIUkVBRF9DT05EX0lOSVQKKyAgICAgX19HVEhSRUFEX0NPTkRfSU5JVF9GVU5DVElPTgorCisgICBJbnRlcmZhY2U6CisgICAgIGludCBfX2d0aHJlYWRfY29uZF9icm9hZGNhc3QgKF9fZ3RocmVhZF9jb25kX3QgKmNvbmQpOworICAgICBpbnQgX19ndGhyZWFkX2NvbmRfd2FpdCAoX19ndGhyZWFkX2NvbmRfdCAqY29uZCwgX19ndGhyZWFkX211dGV4X3QgKm11dGV4KTsKKyAgICAgaW50IF9fZ3RocmVhZF9jb25kX3dhaXRfcmVjdXJzaXZlIChfX2d0aHJlYWRfY29uZF90ICpjb25kLAorCQkJCQlfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKm11dGV4KTsKKworICAgQWxsIGZ1bmN0aW9ucyByZXR1cm5pbmcgaW50IHNob3VsZCByZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIHRoZSBlcnJvcgorICAgbnVtYmVyLiAgSWYgdGhlIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLCAtMSBpcyByZXR1cm5lZC4KKworICAgSWYgdGhlIGZvbGxvd2luZyBhcmUgYWxzbyBkZWZpbmVkLCB5b3Ugc2hvdWxkCisgICAgICNkZWZpbmUgX19HVEhSRUFEU19DWFgwWCAxCisgICB0byBlbmFibGUgdGhlIGMrKzB4IHRocmVhZCBsaWJyYXJ5LgorCisgICBUeXBlczoKKyAgICAgX19ndGhyZWFkX3QKKyAgICAgX19ndGhyZWFkX3RpbWVfdAorCisgICBJbnRlcmZhY2U6CisgICAgIGludCBfX2d0aHJlYWRfY3JlYXRlIChfX2d0aHJlYWRfdCAqdGhyZWFkLCB2b2lkICooKmZ1bmMpICh2b2lkKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmdzKTsKKyAgICAgaW50IF9fZ3RocmVhZF9qb2luIChfX2d0aHJlYWRfdCB0aHJlYWQsIHZvaWQgKip2YWx1ZV9wdHIpOworICAgICBpbnQgX19ndGhyZWFkX2RldGFjaCAoX19ndGhyZWFkX3QgdGhyZWFkKTsKKyAgICAgaW50IF9fZ3RocmVhZF9lcXVhbCAoX19ndGhyZWFkX3QgdDEsIF9fZ3RocmVhZF90IHQyKTsKKyAgICAgX19ndGhyZWFkX3QgX19ndGhyZWFkX3NlbGYgKHZvaWQpOworICAgICBpbnQgX19ndGhyZWFkX3lpZWxkICh2b2lkKTsKKworICAgICBpbnQgX19ndGhyZWFkX211dGV4X3RpbWVkbG9jayAoX19ndGhyZWFkX211dGV4X3QgKm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2d0aHJlYWRfdGltZV90ICphYnNfdGltZW91dCk7CisgICAgIGludCBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3RpbWVkbG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICptLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19ndGhyZWFkX3RpbWVfdCAqYWJzX3RpbWUpOworCisgICAgIGludCBfX2d0aHJlYWRfY29uZF9zaWduYWwgKF9fZ3RocmVhZF9jb25kX3QgKmNvbmQpOworICAgICBpbnQgX19ndGhyZWFkX2NvbmRfdGltZWR3YWl0IChfX2d0aHJlYWRfY29uZF90ICpjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2d0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZ3RocmVhZF90aW1lX3QgKmFic190aW1lb3V0KTsKKworKi8KKworI2lmIF9fR1hYX1dFQUtfXworLyogVGhlIHBlLWNvZmYgd2VhayBzdXBwb3J0IGlzbid0IGZ1bGx5IGNvbXBhdGlibGUgdG8gRUxGJ3Mgd2Vhay4KKyAgIEZvciBzdGF0aWMgbGlicmFyaWVzIGl0IG1pZ2h0IHdvdWxkIHdvcmssIGJ1dCBhcyB3ZSBuZWVkIHRvIGRlYWwKKyAgIHdpdGggc2hhcmVkIHZlcnNpb25zIHRvbywgd2UgZGlzYWJsZSBpdCBmb3IgbWluZ3ctdGFyZ2V0cy4gICovCisjaWZkZWYgX19NSU5HVzMyX18KKyN1bmRlZiBfR0xJQkNYWF9HVEhSRUFEX1VTRV9XRUFLCisjZGVmaW5lIF9HTElCQ1hYX0dUSFJFQURfVVNFX1dFQUsgMAorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfR1RIUkVBRF9VU0VfV0VBSworI2RlZmluZSBfR0xJQkNYWF9HVEhSRUFEX1VTRV9XRUFLIDEKKyNlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8Yml0cy9ndGhyLWRlZmF1bHQuaD4KKworI2lmbmRlZiBfR0xJQkNYWF9ISURFX0VYUE9SVFMKKyNwcmFnbWEgR0NDIHZpc2liaWxpdHkgcG9wCisjZW5kaWYKKworI2VuZGlmIC8qICEgX0dMSUJDWFhfR0NDX0dUSFJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9tZXNzYWdlc19tZW1iZXJzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL21lc3NhZ2VzX21lbWJlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzA3ZTQ5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9tZXNzYWdlc19tZW1iZXJzLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8vIHN0ZDo6bWVzc2FnZXMgaW1wbGVtZW50YXRpb24gZGV0YWlscywgR05VIHZlcnNpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvbWVzc2FnZXNfbWVtYmVycy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bG9jYWxlfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMi4yLjcuMS4yICBtZXNzYWdlcyBmdW5jdGlvbnMKKy8vCisKKy8vIFdyaXR0ZW4gYnkgQmVuamFtaW4gS29zbmlrIDxia296QHJlZGhhdC5jb20+CisKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBOb24tdmlydHVhbCBtZW1iZXIgZnVuY3Rpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgIG1lc3NhZ2VzPF9DaGFyVD46Om1lc3NhZ2VzKHNpemVfdCBfX3JlZnMpCisgICAgIDogZmFjZXQoX19yZWZzKSwgX01fY19sb2NhbGVfbWVzc2FnZXMoX1NfZ2V0X2NfbG9jYWxlKCkpLCAKKyAgICAgICBfTV9uYW1lX21lc3NhZ2VzKF9TX2dldF9jX25hbWUoKSkKKyAgICAgeyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgICBtZXNzYWdlczxfQ2hhclQ+OjptZXNzYWdlcyhfX2NfbG9jYWxlIF9fY2xvYywgY29uc3QgY2hhciogX19zLCAKKwkJCQlzaXplX3QgX19yZWZzKSAKKyAgICAgOiBmYWNldChfX3JlZnMpLCBfTV9jX2xvY2FsZV9tZXNzYWdlcygwKSwgX01fbmFtZV9tZXNzYWdlcygwKQorICAgICB7CisgICAgICAgaWYgKF9fYnVpbHRpbl9zdHJjbXAoX19zLCBfU19nZXRfY19uYW1lKCkpICE9IDApCisJIHsKKwkgICBjb25zdCBzaXplX3QgX19sZW4gPSBfX2J1aWx0aW5fc3RybGVuKF9fcykgKyAxOworCSAgIGNoYXIqIF9fdG1wID0gbmV3IGNoYXJbX19sZW5dOworCSAgIF9fYnVpbHRpbl9tZW1jcHkoX190bXAsIF9fcywgX19sZW4pOworCSAgIF9NX25hbWVfbWVzc2FnZXMgPSBfX3RtcDsKKwkgfQorICAgICAgIGVsc2UKKwkgX01fbmFtZV9tZXNzYWdlcyA9IF9TX2dldF9jX25hbWUoKTsKKworICAgICAgIC8vIExhc3QgdG8gYXZvaWQgbGVha2luZyBtZW1vcnkgaWYgbmV3IHRocm93cy4KKyAgICAgICBfTV9jX2xvY2FsZV9tZXNzYWdlcyA9IF9TX2Nsb25lX2NfbG9jYWxlKF9fY2xvYyk7CisgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgdHlwZW5hbWUgbWVzc2FnZXM8X0NoYXJUPjo6Y2F0YWxvZyAKKyAgICBtZXNzYWdlczxfQ2hhclQ+OjpvcGVuKGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyPiYgX19zLCBjb25zdCBsb2NhbGUmIF9fbG9jLCAKKwkJCSAgIGNvbnN0IGNoYXIqIF9fZGlyKSBjb25zdAorICAgIHsgCisgICAgICBiaW5kdGV4dGRvbWFpbihfX3MuY19zdHIoKSwgX19kaXIpOworICAgICAgcmV0dXJuIHRoaXMtPmRvX29wZW4oX19zLCBfX2xvYyk7IAorICAgIH0KKworICAvLyBWaXJ0dWFsIG1lbWJlciBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBtZXNzYWdlczxfQ2hhclQ+Ojp+bWVzc2FnZXMoKQorICAgIHsgCisgICAgICBpZiAoX01fbmFtZV9tZXNzYWdlcyAhPSBfU19nZXRfY19uYW1lKCkpCisJZGVsZXRlIFtdIF9NX25hbWVfbWVzc2FnZXM7CisgICAgICBfU19kZXN0cm95X2NfbG9jYWxlKF9NX2NfbG9jYWxlX21lc3NhZ2VzKTsgCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICB0eXBlbmFtZSBtZXNzYWdlczxfQ2hhclQ+OjpjYXRhbG9nIAorICAgIG1lc3NhZ2VzPF9DaGFyVD46OmRvX29wZW4oY29uc3QgYmFzaWNfc3RyaW5nPGNoYXI+JiBfX3MsIAorCQkJICAgICAgY29uc3QgbG9jYWxlJikgY29uc3QKKyAgICB7IAorICAgICAgLy8gTm8gZXJyb3IgY2hlY2tpbmcgaXMgZG9uZSwgYXNzdW1lIHRoZSBjYXRhbG9nIGV4aXN0cyBhbmQgY2FuCisgICAgICAvLyBiZSB1c2VkLgorICAgICAgdGV4dGRvbWFpbihfX3MuY19zdHIoKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIHZvaWQgICAgCisgICAgbWVzc2FnZXM8X0NoYXJUPjo6ZG9fY2xvc2UoY2F0YWxvZykgY29uc3QgCisgICAgeyB9CisKKyAgIC8vIG1lc3NhZ2VzX2J5bmFtZQorICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgICBtZXNzYWdlc19ieW5hbWU8X0NoYXJUPjo6bWVzc2FnZXNfYnluYW1lKGNvbnN0IGNoYXIqIF9fcywgc2l6ZV90IF9fcmVmcykKKyAgICAgOiBtZXNzYWdlczxfQ2hhclQ+KF9fcmVmcykgCisgICAgIHsgCisgICAgICAgaWYgKHRoaXMtPl9NX25hbWVfbWVzc2FnZXMgIT0gbG9jYWxlOjpmYWNldDo6X1NfZ2V0X2NfbmFtZSgpKQorCSB7CisJICAgZGVsZXRlIFtdIHRoaXMtPl9NX25hbWVfbWVzc2FnZXM7CisJICAgaWYgKF9fYnVpbHRpbl9zdHJjbXAoX19zLCBsb2NhbGU6OmZhY2V0OjpfU19nZXRfY19uYW1lKCkpICE9IDApCisJICAgICB7CisJICAgICAgIGNvbnN0IHNpemVfdCBfX2xlbiA9IF9fYnVpbHRpbl9zdHJsZW4oX19zKSArIDE7CisJICAgICAgIGNoYXIqIF9fdG1wID0gbmV3IGNoYXJbX19sZW5dOworCSAgICAgICBfX2J1aWx0aW5fbWVtY3B5KF9fdG1wLCBfX3MsIF9fbGVuKTsKKwkgICAgICAgdGhpcy0+X01fbmFtZV9tZXNzYWdlcyA9IF9fdG1wOworCSAgICAgfQorCSAgIGVsc2UKKwkgICAgIHRoaXMtPl9NX25hbWVfbWVzc2FnZXMgPSBsb2NhbGU6OmZhY2V0OjpfU19nZXRfY19uYW1lKCk7CisJIH0KKworICAgICAgIGlmIChfX2J1aWx0aW5fc3RyY21wKF9fcywgIkMiKSAhPSAwCisJICAgJiYgX19idWlsdGluX3N0cmNtcChfX3MsICJQT1NJWCIpICE9IDApCisJIHsKKwkgICB0aGlzLT5fU19kZXN0cm95X2NfbG9jYWxlKHRoaXMtPl9NX2NfbG9jYWxlX21lc3NhZ2VzKTsKKwkgICB0aGlzLT5fU19jcmVhdGVfY19sb2NhbGUodGhpcy0+X01fY19sb2NhbGVfbWVzc2FnZXMsIF9fcyk7IAorCSB9CisgICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9vcHRfcmFuZG9tLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL29wdF9yYW5kb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTY3YjUwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9vcHRfcmFuZG9tLmgKQEAgLTAsMCArMSwyMTkgQEAKKy8vIE9wdGltaXphdGlvbnMgZm9yIHJhbmRvbSBudW1iZXIgZnVuY3Rpb25zLCB4ODYgdmVyc2lvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9vcHRfcmFuZG9tLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtyYW5kb219CisgKi8KKworI2lmbmRlZiBfQklUU19PUFRfUkFORE9NX0gKKyNkZWZpbmUgX0JJVFNfT1BUX1JBTkRPTV9IIDEKKworI2luY2x1ZGUgPHg4NmludHJpbi5oPgorCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyNpZmRlZiBfX1NTRTNfXworICB0ZW1wbGF0ZTw+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT46OgorICAgICAgX19nZW5lcmF0ZSh0eXBlbmFtZSBub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT46OnJlc3VsdF90eXBlKiBfX2YsCisJCSB0eXBlbmFtZSBub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT46OnJlc3VsdF90eXBlKiBfX3QsCisJCSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwl0eXBlZGVmIHVpbnQ2NF90IF9fdWN0eXBlOworCisJaWYgKF9fZiA9PSBfX3QpCisJICByZXR1cm47CisKKwlpZiAoX01fc2F2ZWRfYXZhaWxhYmxlKQorCSAgeworCSAgICBfTV9zYXZlZF9hdmFpbGFibGUgPSBmYWxzZTsKKwkgICAgKl9fZisrID0gX01fc2F2ZWQgKiBfX3BhcmFtLnN0ZGRldigpICsgX19wYXJhbS5tZWFuKCk7CisKKwkgICAgaWYgKF9fZiA9PSBfX3QpCisJICAgICAgcmV0dXJuOworCSAgfQorCisJY29uc3RleHByIHVpbnQ2NF90IF9fbWFza3ZhbCA9IDB4ZmZmZmZmZmZmZmZmZnVsbDsKKwlzdGF0aWMgY29uc3QgX19tMTI4aSBfX21hc2sgPSBfbW1fc2V0MV9lcGk2NHgoX19tYXNrdmFsKTsKKwlzdGF0aWMgY29uc3QgX19tMTI4aSBfX3R3byA9IF9tbV9zZXQxX2VwaTY0eCgweDQwMDAwMDAwMDAwMDAwMDB1bGwpOworCXN0YXRpYyBjb25zdCBfX20xMjhkIF9fdGhyZWUgPSBfbW1fc2V0MV9wZCgzLjApOworCWNvbnN0IF9fbTEyOGQgX19hdiA9IF9tbV9zZXQxX3BkKF9fcGFyYW0ubWVhbigpKTsKKworCWNvbnN0IF9fdWN0eXBlIF9fdXJuZ21pbiA9IF9fdXJuZy5taW4oKTsKKwljb25zdCBfX3VjdHlwZSBfX3VybmdtYXggPSBfX3VybmcubWF4KCk7CisJY29uc3QgX191Y3R5cGUgX191cm5ncmFuZ2UgPSBfX3VybmdtYXggLSBfX3VybmdtaW47CisJY29uc3QgX191Y3R5cGUgX191ZXJuZ3JhbmdlID0gX191cm5ncmFuZ2UgKyAxOworCisJd2hpbGUgKF9fZiArIDEgPCBfX3QpCisJICB7CisJICAgIGRvdWJsZSBfX2xlOworCSAgICBfX20xMjhkIF9feDsKKwkgICAgZG8KKwkgICAgICB7CisgICAgICAgICAgICAgICAgdW5pb24KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfX20xMjhpIF9faTsKKyAgICAgICAgICAgICAgICAgIF9fbTEyOGQgX19kOworCQl9IF9fdjsKKworCQlpZiAoX191cm5ncmFuZ2UgPiBfX21hc2t2YWwpCisJCSAgeworCQkgICAgaWYgKF9fZGV0YWlsOjpfUG93ZXJfb2ZfMihfX3Vlcm5ncmFuZ2UpKQorCQkgICAgICBfX3YuX19pID0gX21tX2FuZF9zaTEyOChfbW1fc2V0X2VwaTY0eChfX3VybmcoKSwKKwkJCQkJCQkgICAgIF9fdXJuZygpKSwKKwkJCQkJICAgICAgX19tYXNrKTsKKwkJICAgIGVsc2UKKwkJICAgICAgeworCQkJY29uc3QgX191Y3R5cGUgX191ZXJhbmdlID0gX19tYXNrdmFsICsgMTsKKwkJCWNvbnN0IF9fdWN0eXBlIF9fc2NhbGluZyA9IF9fdXJuZ3JhbmdlIC8gX191ZXJhbmdlOworCQkJY29uc3QgX191Y3R5cGUgX19wYXN0ID0gX191ZXJhbmdlICogX19zY2FsaW5nOworCQkJdWludDY0X3QgX192MTsKKwkJCWRvCisJCQkgIF9fdjEgPSBfX3VjdHlwZShfX3VybmcoKSkgLSBfX3VybmdtaW47CisJCQl3aGlsZSAoX192MSA+PSBfX3Bhc3QpOworCQkJX192MSAvPSBfX3NjYWxpbmc7CisJCQl1aW50NjRfdCBfX3YyOworCQkJZG8KKwkJCSAgX192MiA9IF9fdWN0eXBlKF9fdXJuZygpKSAtIF9fdXJuZ21pbjsKKwkJCXdoaWxlIChfX3YyID49IF9fcGFzdCk7CisJCQlfX3YyIC89IF9fc2NhbGluZzsKKworCQkJX192Ll9faSA9IF9tbV9zZXRfZXBpNjR4KF9fdjEsIF9fdjIpOworCQkgICAgICB9CisJCSAgfQorCQllbHNlIGlmIChfX3VybmdyYW5nZSA9PSBfX21hc2t2YWwpCisJCSAgX192Ll9faSA9IF9tbV9zZXRfZXBpNjR4KF9fdXJuZygpLCBfX3VybmcoKSk7CisJCWVsc2UgaWYgKChfX3VybmdyYW5nZSArIDIpICogX191cm5ncmFuZ2UgPj0gX19tYXNrdmFsCisJCQkgJiYgX19kZXRhaWw6Ol9Qb3dlcl9vZl8yKF9fdWVybmdyYW5nZSkpCisJCSAgeworCQkgICAgdWludDY0X3QgX192MSA9IF9fdXJuZygpICogX191ZXJuZ3JhbmdlICsgX191cm5nKCk7CisJCSAgICB1aW50NjRfdCBfX3YyID0gX191cm5nKCkgKiBfX3Vlcm5ncmFuZ2UgKyBfX3VybmcoKTsKKworCQkgICAgX192Ll9faSA9IF9tbV9hbmRfc2kxMjgoX21tX3NldF9lcGk2NHgoX192MSwgX192MiksCisJCQkJCSAgICBfX21hc2spOworCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIHNpemVfdCBfX25ybmcgPSAyOworCQkgICAgX191Y3R5cGUgX19oaWdoID0gX19tYXNrdmFsIC8gX191ZXJuZ3JhbmdlIC8gX191ZXJuZ3JhbmdlOworCQkgICAgd2hpbGUgKF9faGlnaCA+IF9fdWVybmdyYW5nZSkKKwkJICAgICAgeworCQkJKytfX25ybmc7CisJCQlfX2hpZ2ggLz0gX191ZXJuZ3JhbmdlOworCQkgICAgICB9CisJCSAgICBjb25zdCBfX3VjdHlwZSBfX2hpZ2hyYW5nZSA9IF9faGlnaCArIDE7CisJCSAgICBjb25zdCBfX3VjdHlwZSBfX3NjYWxpbmcgPSBfX3VybmdyYW5nZSAvIF9faGlnaHJhbmdlOworCQkgICAgY29uc3QgX191Y3R5cGUgX19wYXN0ID0gX19oaWdocmFuZ2UgKiBfX3NjYWxpbmc7CisJCSAgICBfX3VjdHlwZSBfX3RtcDsKKworCQkgICAgdWludDY0X3QgX192MTsKKwkJICAgIGRvCisJCSAgICAgIHsKKwkJCWRvCisJCQkgIF9fdG1wID0gX191Y3R5cGUoX191cm5nKCkpIC0gX191cm5nbWluOworCQkJd2hpbGUgKF9fdG1wID49IF9fcGFzdCk7CisJCQlfX3YxID0gX190bXAgLyBfX3NjYWxpbmc7CisJCQlmb3IgKHNpemVfdCBfX2NudCA9IDA7IF9fY250IDwgX19ucm5nOyArK19fY250KQorCQkJICB7CisJCQkgICAgX190bXAgPSBfX3YxOworCQkJICAgIF9fdjEgKj0gX191ZXJuZ3JhbmdlOworCQkJICAgIF9fdjEgKz0gX191Y3R5cGUoX191cm5nKCkpIC0gX191cm5nbWluOworCQkJICB9CisJCSAgICAgIH0KKwkJICAgIHdoaWxlIChfX3YxID4gX19tYXNrdmFsIHx8IF9fdjEgPCBfX3RtcCk7CisKKwkJICAgIHVpbnQ2NF90IF9fdjI7CisJCSAgICBkbworCQkgICAgICB7CisJCQlkbworCQkJICBfX3RtcCA9IF9fdWN0eXBlKF9fdXJuZygpKSAtIF9fdXJuZ21pbjsKKwkJCXdoaWxlIChfX3RtcCA+PSBfX3Bhc3QpOworCQkJX192MiA9IF9fdG1wIC8gX19zY2FsaW5nOworCQkJZm9yIChzaXplX3QgX19jbnQgPSAwOyBfX2NudCA8IF9fbnJuZzsgKytfX2NudCkKKwkJCSAgeworCQkJICAgIF9fdG1wID0gX192MjsKKwkJCSAgICBfX3YyICo9IF9fdWVybmdyYW5nZTsKKwkJCSAgICBfX3YyICs9IF9fdWN0eXBlKF9fdXJuZygpKSAtIF9fdXJuZ21pbjsKKwkJCSAgfQorCQkgICAgICB9CisJCSAgICB3aGlsZSAoX192MiA+IF9fbWFza3ZhbCB8fCBfX3YyIDwgX190bXApOworCQkgICAgCisJCSAgICBfX3YuX19pID0gX21tX3NldF9lcGk2NHgoX192MSwgX192Mik7CisJCSAgfQorCisJCV9fdi5fX2kgPSBfbW1fb3Jfc2kxMjgoX192Ll9faSwgX190d28pOworCQlfX3ggPSBfbW1fc3ViX3BkKF9fdi5fX2QsIF9fdGhyZWUpOworCQlfX20xMjhkIF9fbSA9IF9tbV9tdWxfcGQoX194LCBfX3gpOworCQlfX2xlID0gX21tX2N2dHNkX2Y2NChfbW1faGFkZF9wZCAoX19tLCBfX20pKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKF9fbGUgPT0gMC4wIHx8IF9fbGUgPj0gMS4wKTsKKworICAgICAgICAgICAgZG91YmxlIF9fbXVsdCA9IChzdGQ6OnNxcnQoLTIuMCAqIHN0ZDo6bG9nKF9fbGUpIC8gX19sZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBfX3BhcmFtLnN0ZGRldigpKTsKKworICAgICAgICAgICAgX194ID0gX21tX2FkZF9wZChfbW1fbXVsX3BkKF9feCwgX21tX3NldDFfcGQoX19tdWx0KSksIF9fYXYpOworCisgICAgICAgICAgICBfbW1fc3RvcmV1X3BkKF9fZiwgX194KTsKKyAgICAgICAgICAgIF9fZiArPSAyOworICAgICAgICAgIH0KKworICAgICAgICBpZiAoX19mICE9IF9fdCkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXN1bHRfdHlwZSBfX3gsIF9feSwgX19yMjsKKworICAgICAgICAgICAgX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCByZXN1bHRfdHlwZT4KKyAgICAgICAgICAgICAgX19hdXJuZyhfX3VybmcpOworCisgICAgICAgICAgICBkbworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX194ID0gcmVzdWx0X3R5cGUoMi4wKSAqIF9fYXVybmcoKSAtIDEuMDsKKyAgICAgICAgICAgICAgICBfX3kgPSByZXN1bHRfdHlwZSgyLjApICogX19hdXJuZygpIC0gMS4wOworICAgICAgICAgICAgICAgIF9fcjIgPSBfX3ggKiBfX3ggKyBfX3kgKiBfX3k7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChfX3IyID4gMS4wIHx8IF9fcjIgPT0gMC4wKTsKKworICAgICAgICAgICAgY29uc3QgcmVzdWx0X3R5cGUgX19tdWx0ID0gc3RkOjpzcXJ0KC0yICogc3RkOjpsb2coX19yMikgLyBfX3IyKTsKKyAgICAgICAgICAgIF9NX3NhdmVkID0gX194ICogX19tdWx0OworICAgICAgICAgICAgX01fc2F2ZWRfYXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICpfX2YgPSBfX3kgKiBfX211bHQgKiBfX3BhcmFtLnN0ZGRldigpICsgX19wYXJhbS5tZWFuKCk7CisgICAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisKKyNlbmRpZiAvLyBfQklUU19PUFRfUkFORE9NX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvb3NfZGVmaW5lcy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9vc19kZWZpbmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlNDA3NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvb3NfZGVmaW5lcy5oCkBAIC0wLDAgKzEsNDggQEAKKy8vIFNwZWNpZmljIGRlZmluaXRpb25zIGZvciBHTlUvTGludXggIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL29zX2RlZmluZXMuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2lvc2Z3ZH0KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX09TX0RFRklORVMKKyNkZWZpbmUgX0dMSUJDWFhfT1NfREVGSU5FUyAxCisKKy8vIFN5c3RlbS1zcGVjaWZpYyAjZGVmaW5lLCB0eXBlZGVmcywgY29ycmVjdGlvbnMsIGV0YywgZ28gaGVyZS4gIFRoaXMKKy8vIGZpbGUgd2lsbCBjb21lIGJlZm9yZSBhbGwgb3RoZXJzLgorCisvLyBUaGlzIGtlZXBzIGlzYW51bSwgZXQgYWwgZnJvbSBiZWluZyBwcm9wYWdhdGVkIGFzIG1hY3Jvcy4KKyNkZWZpbmUgX19OT19DVFlQRSAxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvLyBQcm92aWRlIGEgZGVjbGFyYXRpb24gZm9yIHRoZSBwb3NzaWJseSBkZXByZWNhdGVkIGdldHMgZnVuY3Rpb24sIGFzCisvLyBnbGliYyAyLjE1IGFuZCBsYXRlciBkb2VzIG5vdCBkZWNsYXJlIGdldHMgZm9yIElTTyBDMTEgd2hlbgorLy8gX19HTlVfU09VUkNFIGlzIGRlZmluZWQuCisjaWYgX19HTElCQ19QUkVSRVEoMiwxNSkgJiYgZGVmaW5lZChfR05VX1NPVVJDRSkKKyMgdW5kZWYgX0dMSUJDWFhfSEFWRV9HRVRTCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9iaXRzL3N0ZGMrKy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9zdGRjKysuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTUzNzdkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9zdGRjKysuaApAQCAtMCwwICsxLDExNyBAQAorLy8gQysrIGluY2x1ZGVzIHVzZWQgZm9yIHByZWNvbXBpbGluZyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgc3RkYysrLmgKKyAqICBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGZpbGUgZm9yIGEgcHJlY29tcGlsZWQgaGVhZGVyLgorICovCisKKy8vIDE3LjQuMS4yIEhlYWRlcnMKKworLy8gQworI2lmbmRlZiBfR0xJQkNYWF9OT19BU1NFUlQKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2VuZGlmCisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPGNlcnJubz4KKyNpbmNsdWRlIDxjZmxvYXQ+CisjaW5jbHVkZSA8Y2lzbzY0Nj4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPGNsb2NhbGU+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8Y3NldGptcD4KKyNpbmNsdWRlIDxjc2lnbmFsPgorI2luY2x1ZGUgPGNzdGRhcmc+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGN0aW1lPgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPGNjb21wbGV4PgorI2luY2x1ZGUgPGNmZW52PgorI2luY2x1ZGUgPGNpbnR0eXBlcz4KKyNpbmNsdWRlIDxjc3RkYWxpZ24+CisjaW5jbHVkZSA8Y3N0ZGJvb2w+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjdGdtYXRoPgorI2luY2x1ZGUgPGN3Y2hhcj4KKyNpbmNsdWRlIDxjd2N0eXBlPgorI2VuZGlmCisKKy8vIEMrKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8Y29tcGxleD4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxleGNlcHRpb24+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zPgorI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxpc3RyZWFtPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPGxvY2FsZT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxudW1lcmljPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RhY2s+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHN0cmVhbWJ1Zj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZWluZm8+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2YWxhcnJheT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8Zm9yd2FyZF9saXN0PgorI2luY2x1ZGUgPGZ1dHVyZT4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHJhbmRvbT4KKyNpbmNsdWRlIDxyYXRpbz4KKyNpbmNsdWRlIDxyZWdleD4KKyNpbmNsdWRlIDxzY29wZWRfYWxsb2NhdG9yPgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dHlwZWluZGV4PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy9zdGR0cjFjKysuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvc3RkdHIxYysrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiZjEzNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvc3RkdHIxYysrLmgKQEAgLTAsMCArMSw1MyBAQAorLy8gQysrIGluY2x1ZGVzIHVzZWQgZm9yIHByZWNvbXBpbGluZyBUUjEgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHN0ZHRyMWMrKy5oCisgKiAgVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBmaWxlIGZvciBhIHByZWNvbXBpbGVkIGhlYWRlci4KKyAqLworCisjaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KKworI2luY2x1ZGUgPHRyMS9hcnJheT4KKyNpbmNsdWRlIDx0cjEvY2N0eXBlPgorI2luY2x1ZGUgPHRyMS9jZmVudj4KKyNpbmNsdWRlIDx0cjEvY2Zsb2F0PgorI2luY2x1ZGUgPHRyMS9jaW50dHlwZXM+CisjaW5jbHVkZSA8dHIxL2NsaW1pdHM+CisjaW5jbHVkZSA8dHIxL2NtYXRoPgorI2luY2x1ZGUgPHRyMS9jb21wbGV4PgorI2luY2x1ZGUgPHRyMS9jc3RkYXJnPgorI2luY2x1ZGUgPHRyMS9jc3RkYm9vbD4KKyNpbmNsdWRlIDx0cjEvY3N0ZGludD4KKyNpbmNsdWRlIDx0cjEvY3N0ZGlvPgorI2luY2x1ZGUgPHRyMS9jc3RkbGliPgorI2luY2x1ZGUgPHRyMS9jdGdtYXRoPgorI2luY2x1ZGUgPHRyMS9jdGltZT4KKyNpbmNsdWRlIDx0cjEvY3djaGFyPgorI2luY2x1ZGUgPHRyMS9jd2N0eXBlPgorI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgorI2luY2x1ZGUgPHRyMS9yYW5kb20+CisjaW5jbHVkZSA8dHIxL3R1cGxlPgorI2luY2x1ZGUgPHRyMS91bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHRyMS91bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHRyMS91dGlsaXR5PgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvMzIvYml0cy90aW1lX21lbWJlcnMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvdGltZV9tZW1iZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdiM2NjMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2JpdHMvdGltZV9tZW1iZXJzLmgKQEAgLTAsMCArMSw4OSBAQAorLy8gc3RkOjp0aW1lX2dldCwgc3RkOjp0aW1lX3B1dCBpbXBsZW1lbnRhdGlvbiwgR05VIHZlcnNpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvdGltZV9tZW1iZXJzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtsb2NhbGV9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIyLjIuNS4xLjIgLSB0aW1lX2dldCBmdW5jdGlvbnMKKy8vIElTTyBDKysgMTQ4ODI6IDIyLjIuNS4zLjIgLSB0aW1lX3B1dCBmdW5jdGlvbnMKKy8vCisKKy8vIFdyaXR0ZW4gYnkgQmVuamFtaW4gS29zbmlrIDxia296QHJlZGhhdC5jb20+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgX190aW1lcHVuY3Q8X0NoYXJUPjo6X190aW1lcHVuY3Qoc2l6ZV90IF9fcmVmcykgCisgICAgOiBmYWNldChfX3JlZnMpLCBfTV9kYXRhKDApLCBfTV9jX2xvY2FsZV90aW1lcHVuY3QoMCksIAorICAgICAgX01fbmFtZV90aW1lcHVuY3QoX1NfZ2V0X2NfbmFtZSgpKQorICAgIHsgX01faW5pdGlhbGl6ZV90aW1lcHVuY3QoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBfX3RpbWVwdW5jdDxfQ2hhclQ+OjpfX3RpbWVwdW5jdChfX2NhY2hlX3R5cGUqIF9fY2FjaGUsIHNpemVfdCBfX3JlZnMpIAorICAgIDogZmFjZXQoX19yZWZzKSwgX01fZGF0YShfX2NhY2hlKSwgX01fY19sb2NhbGVfdGltZXB1bmN0KDApLCAKKyAgICAgIF9NX25hbWVfdGltZXB1bmN0KF9TX2dldF9jX25hbWUoKSkKKyAgICB7IF9NX2luaXRpYWxpemVfdGltZXB1bmN0KCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgX190aW1lcHVuY3Q8X0NoYXJUPjo6X190aW1lcHVuY3QoX19jX2xvY2FsZSBfX2Nsb2MsIGNvbnN0IGNoYXIqIF9fcywKKwkJCQkgICAgIHNpemVfdCBfX3JlZnMpIAorICAgIDogZmFjZXQoX19yZWZzKSwgX01fZGF0YSgwKSwgX01fY19sb2NhbGVfdGltZXB1bmN0KDApLCAKKyAgICAgIF9NX25hbWVfdGltZXB1bmN0KDApCisgICAgeworICAgICAgaWYgKF9fYnVpbHRpbl9zdHJjbXAoX19zLCBfU19nZXRfY19uYW1lKCkpICE9IDApCisJeworCSAgY29uc3Qgc2l6ZV90IF9fbGVuID0gX19idWlsdGluX3N0cmxlbihfX3MpICsgMTsKKwkgIGNoYXIqIF9fdG1wID0gbmV3IGNoYXJbX19sZW5dOworCSAgX19idWlsdGluX21lbWNweShfX3RtcCwgX19zLCBfX2xlbik7CisJICBfTV9uYW1lX3RpbWVwdW5jdCA9IF9fdG1wOworCX0KKyAgICAgIGVsc2UKKwlfTV9uYW1lX3RpbWVwdW5jdCA9IF9TX2dldF9jX25hbWUoKTsKKworICAgICAgX190cnkKKwl7IF9NX2luaXRpYWxpemVfdGltZXB1bmN0KF9fY2xvYyk7IH0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIGlmIChfTV9uYW1lX3RpbWVwdW5jdCAhPSBfU19nZXRfY19uYW1lKCkpCisJICAgIGRlbGV0ZSBbXSBfTV9uYW1lX3RpbWVwdW5jdDsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIF9fdGltZXB1bmN0PF9DaGFyVD46On5fX3RpbWVwdW5jdCgpCisgICAgeyAKKyAgICAgIGlmIChfTV9uYW1lX3RpbWVwdW5jdCAhPSBfU19nZXRfY19uYW1lKCkpCisJZGVsZXRlIFtdIF9NX25hbWVfdGltZXB1bmN0OworICAgICAgZGVsZXRlIF9NX2RhdGE7IAorICAgICAgX1NfZGVzdHJveV9jX2xvY2FsZShfTV9jX2xvY2FsZV90aW1lcHVuY3QpOyAKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4LzMyL2V4dC9vcHRfcmFuZG9tLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9leHQvb3B0X3JhbmRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NzViMDYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC8zMi9leHQvb3B0X3JhbmRvbS5oCkBAIC0wLDAgKzEsMTQwIEBACisvLyBPcHRpbWl6YXRpb25zIGZvciByYW5kb20gbnVtYmVyIGV4dGVuc2lvbnMsIHg4NiB2ZXJzaW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvcmFuZG9tLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2V4dC9yYW5kb219CisgKi8KKworI2lmbmRlZiBfRVhUX09QVF9SQU5ET01fSAorI2RlZmluZSBfRVhUX09QVF9SQU5ET01fSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIF9fQllURV9PUkRFUl9fID09IF9fT1JERVJfTElUVExFX0VORElBTl9fCisKKyNpZmRlZiBfX1NTRTJfXworCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgbmFtZXNwYWNlIHsKKworICAgIHRlbXBsYXRlPHNpemVfdCBfX3NsMSwgc2l6ZV90IF9fc2wyLCBzaXplX3QgX19zcjEsIHNpemVfdCBfX3NyMiwKKwkgICAgIHVpbnQzMl90IF9fbXNrMSwgdWludDMyX3QgX19tc2syLCB1aW50MzJfdCBfX21zazMsIHVpbnQzMl90IF9fbXNrND4KKyAgICAgIGlubGluZSBfX20xMjhpIF9fc3NlMl9yZWN1cnNpb24oX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iLAorCQkJCSAgICAgIF9fbTEyOGkgX19jLCBfX20xMjhpIF9fZCkKKyAgICAgIHsKKwlfX20xMjhpIF9feSA9IF9tbV9zcmxpX2VwaTMyKF9fYiwgX19zcjEpOworCV9fbTEyOGkgX196ID0gX21tX3NybGlfc2kxMjgoX19jLCBfX3NyMik7CisJX19tMTI4aSBfX3YgPSBfbW1fc2xsaV9lcGkzMihfX2QsIF9fc2wxKTsKKwlfX3ogPSBfbW1feG9yX3NpMTI4KF9feiwgX19hKTsKKwlfX3ogPSBfbW1feG9yX3NpMTI4KF9feiwgX192KTsKKwlfX20xMjhpIF9feCA9IF9tbV9zbGxpX3NpMTI4KF9fYSwgX19zbDIpOworCV9feSA9IF9tbV9hbmRfc2kxMjgoX195LCBfbW1fc2V0X2VwaTMyKF9fbXNrNCwgX19tc2szLCBfX21zazIsIF9fbXNrMSkpOworCV9feiA9IF9tbV94b3Jfc2kxMjgoX196LCBfX3gpOworCXJldHVybiBfbW1feG9yX3NpMTI4KF9feiwgX195KTsKKyAgICAgIH0KKworICB9CisKKworI2RlZmluZSBfR0xJQkNYWF9PUFRfSEFWRV9SQU5ET01fU0ZNVF9HRU5fUkVBRAkxCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fbSwKKwkgICBzaXplX3QgX19wb3MxLCBzaXplX3QgX19zbDEsIHNpemVfdCBfX3NsMiwKKwkgICBzaXplX3QgX19zcjEsIHNpemVfdCBfX3NyMiwKKwkgICB1aW50MzJfdCBfX21zazEsIHVpbnQzMl90IF9fbXNrMiwKKwkgICB1aW50MzJfdCBfX21zazMsIHVpbnQzMl90IF9fbXNrNCwKKwkgICB1aW50MzJfdCBfX3Bhcml0eTEsIHVpbnQzMl90IF9fcGFyaXR5MiwKKwkgICB1aW50MzJfdCBfX3Bhcml0eTMsIHVpbnQzMl90IF9fcGFyaXR5ND4KKyAgICB2b2lkIHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fbSwKKwkJCQkJICAgX19wb3MxLCBfX3NsMSwgX19zbDIsIF9fc3IxLCBfX3NyMiwKKwkJCQkJICAgX19tc2sxLCBfX21zazIsIF9fbXNrMywgX19tc2s0LAorCQkJCQkgICBfX3Bhcml0eTEsIF9fcGFyaXR5MiwgX19wYXJpdHkzLAorCQkJCQkgICBfX3Bhcml0eTQ+OjoKKyAgICBfTV9nZW5fcmFuZCh2b2lkKQorICAgIHsKKyAgICAgIF9fbTEyOGkgX19yMSA9IF9tbV9sb2FkX3NpMTI4KCZfTV9zdGF0ZVtfTV9uc3RhdGUgLSAyXSk7CisgICAgICBfX20xMjhpIF9fcjIgPSBfbW1fbG9hZF9zaTEyOCgmX01fc3RhdGVbX01fbnN0YXRlIC0gMV0pOworCisgICAgICBzaXplX3QgX19pOworICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfTV9uc3RhdGUgLSBfX3BvczE7ICsrX19pKQorCXsKKwkgIF9fbTEyOGkgX19yID0gX19zc2UyX3JlY3Vyc2lvbjxfX3NsMSwgX19zbDIsIF9fc3IxLCBfX3NyMiwKKwkJCQkJIF9fbXNrMSwgX19tc2syLCBfX21zazMsIF9fbXNrND4KKwkgICAgKF9NX3N0YXRlW19faV0sIF9NX3N0YXRlW19faSArIF9fcG9zMV0sIF9fcjEsIF9fcjIpOworCSAgX21tX3N0b3JlX3NpMTI4KCZfTV9zdGF0ZVtfX2ldLCBfX3IpOworCSAgX19yMSA9IF9fcjI7CisJICBfX3IyID0gX19yOworCX0KKyAgICAgIGZvciAoOyBfX2kgPCBfTV9uc3RhdGU7ICsrX19pKQorCXsKKwkgIF9fbTEyOGkgX19yID0gX19zc2UyX3JlY3Vyc2lvbjxfX3NsMSwgX19zbDIsIF9fc3IxLCBfX3NyMiwKKwkJCQkJIF9fbXNrMSwgX19tc2syLCBfX21zazMsIF9fbXNrND4KKwkgICAgKF9NX3N0YXRlW19faV0sIF9NX3N0YXRlW19faSArIF9fcG9zMSAtIF9NX25zdGF0ZV0sIF9fcjEsIF9fcjIpOworCSAgX21tX3N0b3JlX3NpMTI4KCZfTV9zdGF0ZVtfX2ldLCBfX3IpOworCSAgX19yMSA9IF9fcjI7CisJICBfX3IyID0gX19yOworCX0KKworICAgICAgX01fcG9zID0gMDsKKyAgICB9CisKKworI2RlZmluZSBfR0xJQkNYWF9PUFRfSEFWRV9SQU5ET01fU0ZNVF9PUEVSQVRPUkVRVUFMCTEKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX19tLAorCSAgIHNpemVfdCBfX3BvczEsIHNpemVfdCBfX3NsMSwgc2l6ZV90IF9fc2wyLAorCSAgIHNpemVfdCBfX3NyMSwgc2l6ZV90IF9fc3IyLAorCSAgIHVpbnQzMl90IF9fbXNrMSwgdWludDMyX3QgX19tc2syLAorCSAgIHVpbnQzMl90IF9fbXNrMywgdWludDMyX3QgX19tc2s0LAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MSwgdWludDMyX3QgX19wYXJpdHkyLAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MywgdWludDMyX3QgX19wYXJpdHk0PgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9fZ251X2N4eDo6c2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwKKwkgICAgICAgX19tLCBfX3BvczEsIF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLAorCSAgICAgICBfX21zazEsIF9fbXNrMiwgX19tc2szLCBfX21zazQsCisJICAgICAgIF9fcGFyaXR5MSwgX19wYXJpdHkyLCBfX3Bhcml0eTMsIF9fcGFyaXR5ND4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX2dudV9jeHg6OnNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsCisJICAgICAgIF9fbSwgX19wb3MxLCBfX3NsMSwgX19zbDIsIF9fc3IxLCBfX3NyMiwKKwkgICAgICAgX19tc2sxLCBfX21zazIsIF9fbXNrMywgX19tc2s0LAorCSAgICAgICBfX3Bhcml0eTEsIF9fcGFyaXR5MiwgX19wYXJpdHkzLCBfX3Bhcml0eTQ+JiBfX3JocykKKyAgICB7CisgICAgICBfX20xMjhpIF9fcmVzID0gX21tX2NtcGVxX2VwaTgoX19saHMuX01fc3RhdGVbMF0sIF9fcmhzLl9NX3N0YXRlWzBdKTsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDE7IF9faSA8IF9fbGhzLl9NX25zdGF0ZTsgKytfX2kpCisJX19yZXMgPSBfbW1fYW5kX3NpMTI4KF9fcmVzLCBfbW1fY21wZXFfZXBpOChfX2xocy5fTV9zdGF0ZVtfX2ldLAorCQkJCQkJICAgIF9fcmhzLl9NX3N0YXRlW19faV0pKTsKKyAgICAgIHJldHVybiAoX21tX21vdmVtYXNrX2VwaTgoX19yZXMpID09IDB4ZmZmZgorCSAgICAgICYmIF9fbGhzLl9NX3BvcyA9PSBfX3Jocy5fTV9wb3MpOworICAgIH0KKworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBfX1NTRTJfXworCisjZW5kaWYgLy8gX19CWVRFX09SREVSX18gPT0gX19PUkRFUl9MSVRUTEVfRU5ESUFOX18KKworI2VuZGlmIC8vIF9FWFRfT1BUX1JBTkRPTV9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2F0b21pY193b3JkLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2F0b21pY193b3JkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4MzdmNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvYXRvbWljX3dvcmQuaApAQCAtMCwwICsxLDQ3IEBACisvLyBMb3ctbGV2ZWwgdHlwZSBmb3IgYXRvbWljIG9wZXJhdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGF0b21pY193b3JkLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0FUT01JQ19XT1JEX0gKKyNkZWZpbmUgX0dMSUJDWFhfQVRPTUlDX1dPUkRfSAkxCisKK3R5cGVkZWYgaW50IF9BdG9taWNfd29yZDsKKworLy8gRGVmaW5lIHRoZXNlIHR3byBtYWNyb3MgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIG1lbW9yeSBiYXJyaWVyIGZvciB0aGUgdGFyZ2V0LgorLy8gVGhlIGNvbW1lbnRlZCBvdXQgdmVyc2lvbnMgYmVsb3cgYXJlIHRoZSBkZWZhdWx0cy4KKy8vIFNlZSBpYTY0L2F0b21pY193b3JkLmggZm9yIGFuIGFsdGVybmF0aXZlIGFwcHJvYWNoLgorCisvLyBUaGlzIG9uZSBwcmV2ZW50cyBsb2FkcyBmcm9tIGJlaW5nIGhvaXN0ZWQgYWNyb3NzIHRoZSBiYXJyaWVyOworLy8gaW4gb3RoZXIgd29yZHMsIHRoaXMgaXMgYSBMb2FkLUxvYWQgYWNxdWlyZSBiYXJyaWVyLgorLy8gVGhpcyBpcyBuZWNlc3NhcnkgaWZmIFRBUkdFVF9SRUxBWEVEX09SREVSSU5HIGlzIGRlZmluZWQgaW4gdG0uaC4gIAorLy8gI2RlZmluZSBfR0xJQkNYWF9SRUFEX01FTV9CQVJSSUVSIF9fYXNtIF9fdm9sYXRpbGUgKCIiOjo6Im1lbW9yeSIpCisKKy8vIFRoaXMgb25lIHByZXZlbnRzIHN0b3JlcyBmcm9tIGJlaW5nIHN1bmsgYWNyb3NzIHRoZSBiYXJyaWVyOyBpbiBvdGhlcgorLy8gd29yZHMsIGEgU3RvcmUtU3RvcmUgcmVsZWFzZSBiYXJyaWVyLgorLy8gI2RlZmluZSBfR0xJQkNYWF9XUklURV9NRU1fQkFSUklFUiBfX2FzbSBfX3ZvbGF0aWxlICgiIjo6OiJtZW1vcnkiKQorCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2Jhc2ljX2ZpbGUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvYmFzaWNfZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZThjOGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2Jhc2ljX2ZpbGUuaApAQCAtMCwwICsxLDExMCBAQAorLy8gV3JhcHBlciBvZiBDLWxhbmd1YWdlIEZJTEUgc3RydWN0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy44ICBGaWxlLWJhc2VkIHN0cmVhbXMKKy8vCisKKy8qKiBAZmlsZSBiaXRzL2Jhc2ljX2ZpbGUuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2lvc30KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0JBU0lDX0ZJTEVfU1RESU9fSAorI2RlZmluZSBfR0xJQkNYWF9CQVNJQ19GSUxFX1NURElPX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvYysraW8uaD4gIC8vIGZvciBfX2NfbG9jayBhbmQgX19jX2ZpbGUKKyNpbmNsdWRlIDxpb3M+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBHZW5lcmljIGRlY2xhcmF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY2xhc3MgX19iYXNpY19maWxlOyAKKworICAvLyBTcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIGNsYXNzIF9fYmFzaWNfZmlsZTxjaGFyPgorICAgIHsKKyAgICAgIC8vIFVuZGVybHlpbmcgZGF0YSBzb3VyY2Uvc2luay4KKyAgICAgIF9fY19maWxlKiAJX01fY2ZpbGU7CisKKyAgICAgIC8vIFRydWUgaWZmIHdlIG9wZW5lZCBfTV9jZmlsZSwgYW5kIHRodXMgbXVzdCBjbG9zZSBpdCBvdXJzZWx2ZXMuCisgICAgICBib29sIAkJX01fY2ZpbGVfY3JlYXRlZDsKKworICAgIHB1YmxpYzoKKyAgICAgIF9fYmFzaWNfZmlsZShfX2NfbG9jayogX19sb2NrID0gMCkgdGhyb3cgKCk7CisKKyAgICAgIF9fYmFzaWNfZmlsZSogCisgICAgICBvcGVuKGNvbnN0IGNoYXIqIF9fbmFtZSwgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSwgaW50IF9fcHJvdCA9IDA2NjQpOworCisgICAgICBfX2Jhc2ljX2ZpbGUqCisgICAgICBzeXNfb3BlbihfX2NfZmlsZSogX19maWxlLCBpb3NfYmFzZTo6b3Blbm1vZGUpOworCisgICAgICBfX2Jhc2ljX2ZpbGUqCisgICAgICBzeXNfb3BlbihpbnQgX19mZCwgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkgdGhyb3cgKCk7CisKKyAgICAgIF9fYmFzaWNfZmlsZSogCisgICAgICBjbG9zZSgpOyAKKworICAgICAgX0dMSUJDWFhfUFVSRSBib29sIAorICAgICAgaXNfb3BlbigpIGNvbnN0IHRocm93ICgpOworCisgICAgICBfR0xJQkNYWF9QVVJFIGludCAKKyAgICAgIGZkKCkgdGhyb3cgKCk7CisKKyAgICAgIF9HTElCQ1hYX1BVUkUgX19jX2ZpbGUqCisgICAgICBmaWxlKCkgdGhyb3cgKCk7CisKKyAgICAgIH5fX2Jhc2ljX2ZpbGUoKTsKKworICAgICAgc3RyZWFtc2l6ZSAKKyAgICAgIHhzcHV0bihjb25zdCBjaGFyKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKworICAgICAgc3RyZWFtc2l6ZSAKKyAgICAgIHhzcHV0bl8yKGNvbnN0IGNoYXIqIF9fczEsIHN0cmVhbXNpemUgX19uMSwKKwkgICAgICAgY29uc3QgY2hhciogX19zMiwgc3RyZWFtc2l6ZSBfX24yKTsKKworICAgICAgc3RyZWFtc2l6ZSAKKyAgICAgIHhzZ2V0bihjaGFyKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKworICAgICAgc3RyZWFtb2ZmCisgICAgICBzZWVrb2ZmKHN0cmVhbW9mZiBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX193YXkpIHRocm93ICgpOworCisgICAgICBpbnQgCisgICAgICBzeW5jKCk7CisKKyAgICAgIHN0cmVhbXNpemUKKyAgICAgIHNob3dtYW55YygpOworICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9jKythbGxvY2F0b3IuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvYysrYWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ3MGJjYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvYysrYWxsb2NhdG9yLmgKQEAgLTAsMCArMSw1NSBAQAorLy8gQmFzZSB0byBzdGQ6OmFsbG9jYXRvciAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9jKythbGxvY2F0b3IuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le21lbW9yeX0KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0NYWF9BTExPQ0FUT1JfSAorI2RlZmluZSBfR0xJQkNYWF9DWFhfQUxMT0NBVE9SX0ggMQorCisjaW5jbHVkZSA8ZXh0L25ld19hbGxvY2F0b3IuaD4KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKK25hbWVzcGFjZSBzdGQKK3sKKyAgLyoqCisgICAqICBAYnJpZWYgIEFuIGFsaWFzIHRvIHRoZSBiYXNlIGNsYXNzIGZvciBzdGQ6OmFsbG9jYXRvci4KKyAgICogIEBpbmdyb3VwIGFsbG9jYXRvcnMKKyAgICoKKyAgICogIFVzZWQgdG8gc2V0IHRoZSBzdGQ6OmFsbG9jYXRvciBiYXNlIGNsYXNzIHRvCisgICAqICBfX2dudV9jeHg6Om5ld19hbGxvY2F0b3IuCisgICAqCisgICAqICBAdHBhcmFtICBfVHAgIFR5cGUgb2YgYWxsb2NhdGVkIG9iamVjdC4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdXNpbmcgX19hbGxvY2F0b3JfYmFzZSA9IF9fZ251X2N4eDo6bmV3X2FsbG9jYXRvcjxfVHA+OworfQorI2Vsc2UKKy8vIERlZmluZSBuZXdfYWxsb2NhdG9yIGFzIHRoZSBiYXNlIGNsYXNzIHRvIHN0ZDo6YWxsb2NhdG9yLgorIyBkZWZpbmUgX19hbGxvY2F0b3JfYmFzZSAgX19nbnVfY3h4OjpuZXdfYWxsb2NhdG9yCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2MrK2NvbmZpZy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9jKytjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmI3NWQzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9jKytjb25maWcuaApAQCAtMCwwICsxLDE2NjYgQEAKKy8vIFByZWRlZmluZWQgc3ltYm9scyBhbmQgbWFjcm9zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2MrK2NvbmZpZy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aW9zZndkfQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQ1hYX0NPTkZJR19ICisjZGVmaW5lIF9HTElCQ1hYX0NYWF9DT05GSUdfSCAxCisKKy8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIEMrKyBsaWJyYXJ5IGluIGNvbXByZXNzZWQgSVNPIGRhdGUgZm9ybWF0LgorI2RlZmluZSBfX0dMSUJDWFhfXyAyMDE0MDUyMgorCisvLyBNYWNyb3MgZm9yIHZhcmlvdXMgYXR0cmlidXRlcy4KKy8vICAgX0dMSUJDWFhfUFVSRQorLy8gICBfR0xJQkNYWF9DT05TVAorLy8gICBfR0xJQkNYWF9OT1JFVFVSTgorLy8gICBfR0xJQkNYWF9OT1RIUk9XCisvLyAgIF9HTElCQ1hYX1ZJU0lCSUxJVFkKKyNpZm5kZWYgX0dMSUJDWFhfUFVSRQorIyBkZWZpbmUgX0dMSUJDWFhfUFVSRSBfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKQorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfQ09OU1QKKyMgZGVmaW5lIF9HTElCQ1hYX0NPTlNUIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKQorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfTk9SRVRVUk4KKyMgZGVmaW5lIF9HTElCQ1hYX05PUkVUVVJOIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKQorI2VuZGlmCisKKy8vIFNlZSBiZWxvdyBmb3IgQysrCisjaWZuZGVmIF9HTElCQ1hYX05PVEhST1cKKyMgaWZuZGVmIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgX0dMSUJDWFhfTk9USFJPVyBfX2F0dHJpYnV0ZV9fKChfX25vdGhyb3dfXykpCisjIGVuZGlmCisjZW5kaWYKKworLy8gTWFjcm9zIGZvciB2aXNpYmlsaXR5IGF0dHJpYnV0ZXMuCisvLyAgIF9HTElCQ1hYX0hBVkVfQVRUUklCVVRFX1ZJU0lCSUxJVFkKKy8vICAgX0dMSUJDWFhfVklTSUJJTElUWQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9BVFRSSUJVVEVfVklTSUJJTElUWSAxCisKKyNpZiBfR0xJQkNYWF9IQVZFX0FUVFJJQlVURV9WSVNJQklMSVRZCisjIGRlZmluZSBfR0xJQkNYWF9WSVNJQklMSVRZKFYpIF9fYXR0cmlidXRlX18gKChfX3Zpc2liaWxpdHlfXyAoI1YpKSkKKyNlbHNlCisvLyBJZiB0aGlzIGlzIG5vdCBzdXBwbGllZCBieSB0aGUgT1Mtc3BlY2lmaWMgb3IgQ1BVLXNwZWNpZmljCisvLyBoZWFkZXJzIGluY2x1ZGVkIGJlbG93LCBpdCB3aWxsIGJlIGRlZmluZWQgdG8gYW4gZW1wdHkgZGVmYXVsdC4KKyMgZGVmaW5lIF9HTElCQ1hYX1ZJU0lCSUxJVFkoVikgX0dMSUJDWFhfUFNFVURPX1ZJU0lCSUxJVFkoVikKKyNlbmRpZgorCisvLyBNYWNyb3MgZm9yIGRlcHJlY2F0ZWQgYXR0cmlidXRlcy4KKy8vICAgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQKKy8vICAgX0dMSUJDWFhfREVQUkVDQVRFRAorI2lmbmRlZiBfR0xJQkNYWF9VU0VfREVQUkVDQVRFRAorIyBkZWZpbmUgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fREVQUkVDQVRFRCkgJiYgKF9fY3BsdXNwbHVzID49IDIwMTEwM0wpCisjIGRlZmluZSBfR0xJQkNYWF9ERVBSRUNBVEVEIF9fYXR0cmlidXRlX18gKChfX2RlcHJlY2F0ZWRfXykpCisjZWxzZQorIyBkZWZpbmUgX0dMSUJDWFhfREVQUkVDQVRFRAorI2VuZGlmCisKKy8vIE1hY3JvcyBmb3IgQUJJIHRhZyBhdHRyaWJ1dGVzLgorI2lmbmRlZiBfR0xJQkNYWF9BQklfVEFHX0NYWDExCisjIGRlZmluZSBfR0xJQkNYWF9BQklfVEFHX0NYWDExIF9fYXR0cmlidXRlICgoX19hYmlfdGFnX18gKCJjeHgxMSIpKSkKKyNlbmRpZgorCisKKyNpZiBfX2NwbHVzcGx1cworCisvLyBNYWNybyBmb3IgY29uc3RleHByLCB0byBzdXBwb3J0IGluIG1peGVkIDAzLzB4IG1vZGUuCisjaWZuZGVmIF9HTElCQ1hYX0NPTlNURVhQUgorIyBpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjICBkZWZpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGNvbnN0ZXhwcgorIyAgZGVmaW5lIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgY29uc3RleHByCisjIGVsc2UKKyMgIGRlZmluZSBfR0xJQkNYWF9DT05TVEVYUFIKKyMgIGRlZmluZSBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGNvbnN0CisjIGVuZGlmCisjZW5kaWYKKworLy8gTWFjcm8gZm9yIG5vZXhjZXB0LCB0byBzdXBwb3J0IGluIG1peGVkIDAzLzB4IG1vZGUuCisjaWZuZGVmIF9HTElCQ1hYX05PRVhDRVBUCisjIGlmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyMgIGRlZmluZSBfR0xJQkNYWF9OT0VYQ0VQVCBub2V4Y2VwdAorIyAgZGVmaW5lIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCBub2V4Y2VwdAorIyAgZGVmaW5lIF9HTElCQ1hYX1RIUk9XKF9FWEMpCisjIGVsc2UKKyMgIGRlZmluZSBfR0xJQkNYWF9OT0VYQ0VQVAorIyAgZGVmaW5lIF9HTElCQ1hYX1VTRV9OT0VYQ0VQVCB0aHJvdygpCisjICBkZWZpbmUgX0dMSUJDWFhfVEhST1coX0VYQykgdGhyb3coX0VYQykKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX05PVEhST1cKKyMgZGVmaW5lIF9HTElCQ1hYX05PVEhST1cgX0dMSUJDWFhfVVNFX05PRVhDRVBUCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9USFJPV19PUl9BQk9SVAorIyBpZiBfX0VYQ0VQVElPTlMKKyMgIGRlZmluZSBfR0xJQkNYWF9USFJPV19PUl9BQk9SVChfRVhDKSAodGhyb3cgKF9FWEMpKQorIyBlbHNlCisjICBkZWZpbmUgX0dMSUJDWFhfVEhST1dfT1JfQUJPUlQoX0VYQykgKF9fYnVpbHRpbl9hYm9ydCgpKQorIyBlbmRpZgorI2VuZGlmCisKKy8vIE1hY3JvIGZvciBleHRlcm4gdGVtcGxhdGUsIGllIGNvbnRyb2xpbmcgdGVtcGxhdGUgbGlua2FnZSB2aWEgdXNlCisvLyBvZiBleHRlcm4ga2V5d29yZCBvbiB0ZW1wbGF0ZSBkZWNsYXJhdGlvbi4gQXMgZG9jdW1lbnRlZCBpbiB0aGUgZysrCisvLyBtYW51YWwsIGl0IGluaGliaXRzIGFsbCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBhbmQgaXMgdXNlZAorLy8gdGhyb3VnaG91dCB0aGUgbGlicmFyeSB0byBhdm9pZCBtdWx0aXBsZSB3ZWFrIGRlZmluaXRpb25zIGZvcgorLy8gcmVxdWlyZWQgdHlwZXMgdGhhdCBhcmUgYWxyZWFkeSBleHBsaWNpdGx5IGluc3RhbnRpYXRlZCBpbiB0aGUKKy8vIGxpYnJhcnkgYmluYXJ5LiBUaGlzIHN1YnN0YW50aWFsbHkgcmVkdWNlcyB0aGUgYmluYXJ5IHNpemUgb2YKKy8vIHJlc3VsdGluZyBleGVjdXRhYmxlcy4KKy8vIFNwZWNpYWwgY2FzZTogX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFID09IC0xIGRpc2FsbG93cyBleHRlcm4KKy8vIHRlbXBsYXRlcyBvbmx5IGluIGJhc2ljX3N0cmluZywgdGh1cyBhY3RpdmF0aW5nIGl0cyBkZWJ1Zy1tb2RlCisvLyBjaGVja3MgZXZlbiBhdCAtTzAuCisjIGRlZmluZSBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUgMQorCisvKgorICBPdXRsaW5lIG9mIGxpYnN0ZGMrKyBuYW1lc3BhY2VzLgorCisgIG5hbWVzcGFjZSBzdGQKKyAgeworICAgIG5hbWVzcGFjZSBfX2RlYnVnIHsgfQorICAgIG5hbWVzcGFjZSBfX3BhcmFsbGVsIHsgfQorICAgIG5hbWVzcGFjZSBfX3Byb2ZpbGUgeyB9CisgICAgbmFtZXNwYWNlIF9fY3h4MTk5OCB7IH0KKworICAgIG5hbWVzcGFjZSBfX2RldGFpbCB7IH0KKworICAgIG5hbWVzcGFjZSByZWxfb3BzIHsgfQorCisgICAgbmFtZXNwYWNlIHRyMQorICAgIHsKKyAgICAgIG5hbWVzcGFjZSBwbGFjZWhvbGRlcnMgeyB9CisgICAgICBuYW1lc3BhY2UgcmVnZXhfY29uc3RhbnRzIHsgfQorICAgICAgbmFtZXNwYWNlIF9fZGV0YWlsIHsgfQorICAgIH0KKworICAgIG5hbWVzcGFjZSB0cjIgeyB9CisgICAgCisgICAgbmFtZXNwYWNlIGRlY2ltYWwgeyB9CisKKyAgICBuYW1lc3BhY2UgY2hyb25vIHsgfQorICAgIG5hbWVzcGFjZSBwbGFjZWhvbGRlcnMgeyB9CisgICAgbmFtZXNwYWNlIHJlZ2V4X2NvbnN0YW50cyB7IH0KKyAgICBuYW1lc3BhY2UgdGhpc190aHJlYWQgeyB9CisgIH0KKworICBuYW1lc3BhY2UgYWJpIHsgfQorCisgIG5hbWVzcGFjZSBfX2dudV9jeHgKKyAgeworICAgIG5hbWVzcGFjZSBfX2RldGFpbCB7IH0KKyAgfQorCisgIEZvciBmdWxsIGRldGFpbHMgc2VlOgorICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbGF0ZXN0LWRveHlnZW4vbmFtZXNwYWNlcy5odG1sCisqLworbmFtZXNwYWNlIHN0ZAoreworICB0eXBlZGVmIF9fU0laRV9UWVBFX18gCXNpemVfdDsKKyAgdHlwZWRlZiBfX1BUUkRJRkZfVFlQRV9fCXB0cmRpZmZfdDsKKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdHlwZWRlZiBkZWNsdHlwZShudWxscHRyKQludWxscHRyX3Q7CisjZW5kaWYKK30KKworCisvLyBEZWZpbmVkIGlmIGlubGluZSBuYW1lc3BhY2VzIGFyZSB1c2VkIGZvciB2ZXJzaW9uaW5nLgorIyBkZWZpbmUgX0dMSUJDWFhfSU5MSU5FX1ZFUlNJT04gMCAKKworLy8gSW5saW5lIG5hbWVzcGFjZSBmb3Igc3ltYm9sIHZlcnNpb25pbmcuCisjaWYgX0dMSUJDWFhfSU5MSU5FX1ZFUlNJT04KKworbmFtZXNwYWNlIHN0ZAoreworICBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0KKworICBuYW1lc3BhY2UgcmVsX29wcyB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9CisKKyAgbmFtZXNwYWNlIHRyMQorICB7CisgICAgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9CisgICAgbmFtZXNwYWNlIHBsYWNlaG9sZGVycyB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9CisgICAgbmFtZXNwYWNlIHJlZ2V4X2NvbnN0YW50cyB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9CisgICAgbmFtZXNwYWNlIF9fZGV0YWlsIHsgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9IH0KKyAgfQorCisgIG5hbWVzcGFjZSB0cjIKKyAgeyBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0gfQorCisgIG5hbWVzcGFjZSBkZWNpbWFsIHsgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9IH0KKworICBuYW1lc3BhY2UgY2hyb25vIHsgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9IH0KKyAgbmFtZXNwYWNlIHBsYWNlaG9sZGVycyB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9CisgIG5hbWVzcGFjZSByZWdleF9jb25zdGFudHMgeyBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0gfQorICBuYW1lc3BhY2UgdGhpc190aHJlYWQgeyBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0gfQorCisgIG5hbWVzcGFjZSBfX2RldGFpbCB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9Cit9CisKK25hbWVzcGFjZSBfX2dudV9jeHgKK3sKKyAgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9CisgIG5hbWVzcGFjZSBfX2RldGFpbCB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9Cit9CisjIGRlZmluZSBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTiBuYW1lc3BhY2UgX183IHsKKyMgZGVmaW5lIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTiB9CisjZWxzZQorIyBkZWZpbmUgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKyMgZGVmaW5lIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorI2VuZGlmCisKKworLy8gSW5saW5lIG5hbWVzcGFjZXMgZm9yIHNwZWNpYWwgbW9kZXM6IGRlYnVnLCBwYXJhbGxlbCwgcHJvZmlsZS4KKyNpZiBkZWZpbmVkKF9HTElCQ1hYX0RFQlVHKSB8fCBkZWZpbmVkKF9HTElCQ1hYX1BBUkFMTEVMKSBcCisgICAgfHwgZGVmaW5lZChfR0xJQkNYWF9QUk9GSUxFKQorbmFtZXNwYWNlIHN0ZAoreworICAvLyBOb24taW5saW5lIG5hbWVzcGFjZSBmb3IgY29tcG9uZW50cyByZXBsYWNlZCBieSBhbHRlcm5hdGVzIGluIGFjdGl2ZSBtb2RlLgorICBuYW1lc3BhY2UgX19jeHgxOTk4CisgIHsKKyNpZiBfR0xJQkNYWF9JTkxJTkVfVkVSU0lPTgorIGlubGluZSBuYW1lc3BhY2UgX183IHsgfQorI2VuZGlmCisgIH0KKworICAvLyBJbmxpbmUgbmFtZXNwYWNlIGZvciBkZWJ1ZyBtb2RlLgorIyBpZmRlZiBfR0xJQkNYWF9ERUJVRworICBpbmxpbmUgbmFtZXNwYWNlIF9fZGVidWcgeyB9CisjIGVuZGlmCisKKyAgLy8gSW5saW5lIG5hbWVzcGFjZXMgZm9yIHBhcmFsbGVsIG1vZGUuCisjIGlmZGVmIF9HTElCQ1hYX1BBUkFMTEVMCisgIGlubGluZSBuYW1lc3BhY2UgX19wYXJhbGxlbCB7IH0KKyMgZW5kaWYKKworICAvLyBJbmxpbmUgbmFtZXNwYWNlcyBmb3IgcHJvZmlsZSBtb2RlCisjIGlmZGVmIF9HTElCQ1hYX1BST0ZJTEUKKyAgaW5saW5lIG5hbWVzcGFjZSBfX3Byb2ZpbGUgeyB9CisjIGVuZGlmCit9CisKKy8vIENoZWNrIGZvciBpbnZhbGlkIHVzYWdlIGFuZCB1bnN1cHBvcnRlZCBtaXhlZC1tb2RlIHVzZS4KKyMgaWYgZGVmaW5lZChfR0xJQkNYWF9ERUJVRykgJiYgZGVmaW5lZChfR0xJQkNYWF9QQVJBTExFTCkKKyMgIGVycm9yIGlsbGVnYWwgdXNlIG9mIG11bHRpcGxlIGlubGluZWQgbmFtZXNwYWNlcworIyBlbmRpZgorIyBpZiBkZWZpbmVkKF9HTElCQ1hYX1BST0ZJTEUpICYmIGRlZmluZWQoX0dMSUJDWFhfREVCVUcpCisjICBlcnJvciBpbGxlZ2FsIHVzZSBvZiBtdWx0aXBsZSBpbmxpbmVkIG5hbWVzcGFjZXMKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChfR0xJQkNYWF9QUk9GSUxFKSAmJiBkZWZpbmVkKF9HTElCQ1hYX1BBUkFMTEVMKQorIyAgZXJyb3IgaWxsZWdhbCB1c2Ugb2YgbXVsdGlwbGUgaW5saW5lZCBuYW1lc3BhY2VzCisjIGVuZGlmCisKKy8vIENoZWNrIGZvciBpbnZhbGlkIHVzZSBkdWUgdG8gbGFjayBmb3Igd2VhayBzeW1ib2xzLgorIyBpZiBfX05PX0lOTElORV9fICYmICFfX0dYWF9XRUFLX18KKyMgIHdhcm5pbmcgY3VycmVudGx5IHVzaW5nIGlubGluZWQgbmFtZXNwYWNlIG1vZGUgd2hpY2ggbWF5IGZhaWwgXAorICAgd2l0aG91dCBpbmxpbmluZyBkdWUgdG8gbGFjayBvZiB3ZWFrIHN5bWJvbHMKKyMgZW5kaWYKKyNlbmRpZgorCisvLyBNYWNyb3MgZm9yIG5hbWVzcGFjZSBzY29wZS4gRWl0aGVyIG5hbWVzcGFjZSBzdGQ6OiBvciB0aGUgbmFtZQorLy8gb2Ygc29tZSBuZXN0ZWQgbmFtZXNwYWNlIHdpdGhpbiBpdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBhY3RpdmUgbW9kZS4KKy8vIF9HTElCQ1hYX1NURF9BCisvLyBfR0xJQkNYWF9TVERfQworLy8KKy8vIE1hY3JvcyBmb3Igb3BlbmluZy9jbG9zaW5nIGNvbmRpdGlvbmFsIG5hbWVzcGFjZXMuCisvLyBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQUxHTworLy8gX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9BTEdPCisvLyBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisvLyBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorI2lmIGRlZmluZWQoX0dMSUJDWFhfREVCVUcpIHx8IGRlZmluZWQoX0dMSUJDWFhfUFJPRklMRSkKKyMgZGVmaW5lIF9HTElCQ1hYX1NURF9DIF9fY3h4MTk5OAorIyBkZWZpbmUgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUiBcCisJIG5hbWVzcGFjZSBfR0xJQkNYWF9TVERfQyB7IF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisjIGRlZmluZSBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUiBcCisJIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTiB9CisjIHVuZGVmIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURQorIyBkZWZpbmUgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFIC0xCisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1BBUkFMTEVMCisjIGRlZmluZSBfR0xJQkNYWF9TVERfQSBfX2N4eDE5OTgKKyMgZGVmaW5lIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9BTEdPIFwKKwkgbmFtZXNwYWNlIF9HTElCQ1hYX1NURF9BIHsgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKyMgZGVmaW5lIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQUxHTyBcCisJIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTiB9CisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9TVERfQQorIyBkZWZpbmUgX0dMSUJDWFhfU1REX0Egc3RkCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9TVERfQworIyBkZWZpbmUgX0dMSUJDWFhfU1REX0Mgc3RkCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQUxHTworIyBkZWZpbmUgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0FMR08KKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQUxHTworIyBkZWZpbmUgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9BTEdPCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisjIGRlZmluZSBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorIyBkZWZpbmUgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKKyNlbmRpZgorCisvLyBHTElCQ1hYX0FCSSBEZXByZWNhdGVkCisvLyBEZWZpbmUgaWYgY29tcGF0aWJpbGl0eSBzaG91bGQgYmUgcHJvdmlkZWQgZm9yIC1tbG9uZy1kb3VibGUtNjQuCisjdW5kZWYgX0dMSUJDWFhfTE9OR19ET1VCTEVfQ09NUEFUCisKKy8vIElubGluZSBuYW1lc3BhY2UgZm9yIGxvbmcgZG91YmxlIDEyOCBtb2RlLgorI2lmIGRlZmluZWQgX0dMSUJDWFhfTE9OR19ET1VCTEVfQ09NUEFUICYmIGRlZmluZWQgX19MT05HX0RPVUJMRV8xMjhfXworbmFtZXNwYWNlIHN0ZAoreworICBpbmxpbmUgbmFtZXNwYWNlIF9fZ251X2N4eF9sZGJsMTI4IHsgfQorfQorIyBkZWZpbmUgX0dMSUJDWFhfTkFNRVNQQUNFX0xEQkwgX19nbnVfY3h4X2xkYmwxMjg6OgorIyBkZWZpbmUgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0xEQkwgbmFtZXNwYWNlIF9fZ251X2N4eF9sZGJsMTI4IHsKKyMgZGVmaW5lIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfTERCTCB9CisjZWxzZQorIyBkZWZpbmUgX0dMSUJDWFhfTkFNRVNQQUNFX0xEQkwKKyMgZGVmaW5lIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9MREJMCisjIGRlZmluZSBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0xEQkwKKyNlbmRpZgorCisvLyBBc3NlcnQuCisjaWYgIWRlZmluZWQoX0dMSUJDWFhfREVCVUcpICYmICFkZWZpbmVkKF9HTElCQ1hYX1BBUkFMTEVMKQorIyBkZWZpbmUgX19nbGliY3h4X2Fzc2VydChfQ29uZGl0aW9uKQorI2Vsc2UKK25hbWVzcGFjZSBzdGQKK3sKKyAgLy8gQXZvaWQgdGhlIHVzZSBvZiBhc3NlcnQsIGJlY2F1c2Ugd2UncmUgdHJ5aW5nIHRvIGtlZXAgdGhlIDxjYXNzZXJ0PgorICAvLyBpbmNsdWRlIG91dCBvZiB0aGUgbWl4LgorICBpbmxpbmUgdm9pZAorICBfX3JlcGxhY2VtZW50X2Fzc2VydChjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUsCisJCSAgICAgICBjb25zdCBjaGFyKiBfX2Z1bmN0aW9uLCBjb25zdCBjaGFyKiBfX2NvbmRpdGlvbikKKyAgeworICAgIF9fYnVpbHRpbl9wcmludGYoIiVzOiVkOiAlczogQXNzZXJ0aW9uICclcycgZmFpbGVkLlxuIiwgX19maWxlLCBfX2xpbmUsCisJCSAgICAgX19mdW5jdGlvbiwgX19jb25kaXRpb24pOworICAgIF9fYnVpbHRpbl9hYm9ydCgpOworICB9Cit9CisjZGVmaW5lIF9fZ2xpYmN4eF9hc3NlcnQoX0NvbmRpdGlvbikJCQkJICAgCSBcCisgIGRvIAkJCQkJCQkJCSBcCisgIHsJCQkJCQkJICAgICAgCQkgXAorICAgIGlmICghIChfQ29uZGl0aW9uKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0ZDo6X19yZXBsYWNlbWVudF9hc3NlcnQoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBcCisJCQkJI19Db25kaXRpb24pOwkJCQkgXAorICB9IHdoaWxlIChmYWxzZSkKKyNlbmRpZgorCisvLyBNYWNyb3MgZm9yIHJhY2UgZGV0ZWN0b3JzLgorLy8gX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQkVGT1JFKEEpIGFuZAorLy8gX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQUZURVIoQSkgc2hvdWxkIGJlIHVzZWQgdG8gZXhwbGFpbgorLy8gYXRvbWljIChsb2NrLWZyZWUpIHN5bmNocm9uaXphdGlvbiB0byByYWNlIGRldGVjdG9yczoKKy8vIHRoZSByYWNlIGRldGVjdG9yIHdpbGwgaW5mZXIgYSBoYXBwZW5zLWJlZm9yZSBhcmMgZnJvbSB0aGUgZm9ybWVyIHRvIHRoZQorLy8gbGF0dGVyIHdoZW4gdGhleSBzaGFyZSB0aGUgc2FtZSBhcmd1bWVudCBwb2ludGVyLgorLy8KKy8vIFRoZSBtb3N0IGZyZXF1ZW50IHVzZSBjYXNlIGZvciB0aGVzZSBtYWNyb3MgKGFuZCB0aGUgb25seSBjYXNlIGluIHRoZQorLy8gY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbGlicmFyeSkgaXMgYXRvbWljIHJlZmVyZW5jZSBjb3VudGluZzoKKy8vICAgdm9pZCBfTV9yZW1vdmVfcmVmZXJlbmNlKCkKKy8vICAgeworLy8gICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0JFRk9SRSgmdGhpcy0+X01fcmVmY291bnQpOworLy8gICAgIGlmIChfX2dudV9jeHg6Ol9fZXhjaGFuZ2VfYW5kX2FkZF9kaXNwYXRjaCgmdGhpcy0+X01fcmVmY291bnQsIC0xKSA8PSAwKQorLy8gICAgICAgeworLy8gICAgICAgICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19BRlRFUigmdGhpcy0+X01fcmVmY291bnQpOworLy8gICAgICAgICBfTV9kZXN0cm95KF9fYSk7CisvLyAgICAgICB9CisvLyAgIH0KKy8vIFRoZSBhbm5vdGF0aW9ucyBpbiB0aGlzIGV4YW1wbGUgdGVsbCB0aGUgcmFjZSBkZXRlY3RvciB0aGF0IGFsbCBtZW1vcnkKKy8vIGFjY2Vzc2VzIG9jY3VycmVkIHdoZW4gdGhlIHJlZmNvdW50IHdhcyBwb3NpdGl2ZSBkbyBub3QgcmFjZSB3aXRoCisvLyBtZW1vcnkgYWNjZXNzZXMgd2hpY2ggb2NjdXJyZWQgYWZ0ZXIgdGhlIHJlZmNvdW50IGJlY2FtZSB6ZXJvLgorI2lmbmRlZiBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19CRUZPUkUKKyMgZGVmaW5lICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19CRUZPUkUoQSkKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19BRlRFUgorIyBkZWZpbmUgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0FGVEVSKEEpCisjZW5kaWYKKworLy8gTWFjcm9zIGZvciBDIGxpbmthZ2U6IGRlZmluZSBleHRlcm4gIkMiIGxpbmthZ2Ugb25seSB3aGVuIHVzaW5nIEMrKy4KKyMgZGVmaW5lIF9HTElCQ1hYX0JFR0lOX0VYVEVSTl9DIGV4dGVybiAiQyIgeworIyBkZWZpbmUgX0dMSUJDWFhfRU5EX0VYVEVSTl9DIH0KKworI2Vsc2UgLy8gIV9fY3BsdXNwbHVzCisjIGRlZmluZSBfR0xJQkNYWF9CRUdJTl9FWFRFUk5fQworIyBkZWZpbmUgX0dMSUJDWFhfRU5EX0VYVEVSTl9DCisjZW5kaWYKKworCisvLyBGaXJzdCBpbmNsdWRlcy4KKworLy8gUGljayB1cCBhbnkgT1Mtc3BlY2lmaWMgZGVmaW5pdGlvbnMuCisjaW5jbHVkZSA8Yml0cy9vc19kZWZpbmVzLmg+CisKKy8vIFBpY2sgdXAgYW55IENQVS1zcGVjaWZpYyBkZWZpbml0aW9ucy4KKyNpbmNsdWRlIDxiaXRzL2NwdV9kZWZpbmVzLmg+CisKKy8vIElmIHBsYXRmb3JtIHVzZXMgbmVpdGhlciB2aXNpYmlsaXR5IG5vciBwc3VlZG8tdmlzaWJpbGl0eSwKKy8vIHNwZWNpZnkgZW1wdHkgZGVmYXVsdCBmb3IgbmFtZXNwYWNlIGFubm90YXRpb24gbWFjcm9zLgorI2lmbmRlZiBfR0xJQkNYWF9QU0VVRE9fVklTSUJJTElUWQorIyBkZWZpbmUgX0dMSUJDWFhfUFNFVURPX1ZJU0lCSUxJVFkoVikKKyNlbmRpZgorCisvLyBDZXJ0YWluIGZ1bmN0aW9uIGRlZmluaXRpb25zIHRoYXQgYXJlIG1lYW50IHRvIGJlIG92ZXJyaWRhYmxlIGZyb20KKy8vIHVzZXIgY29kZSBhcmUgZGVjb3JhdGVkIHdpdGggdGhpcyBtYWNyby4gIEZvciBzb21lIHRhcmdldHMsIHRoaXMKKy8vIG1hY3JvIGNhdXNlcyB0aGVzZSBkZWZpbml0aW9ucyB0byBiZSB3ZWFrLgorI2lmbmRlZiBfR0xJQkNYWF9XRUFLX0RFRklOSVRJT04KKyMgZGVmaW5lIF9HTElCQ1hYX1dFQUtfREVGSU5JVElPTgorI2VuZGlmCisKKworLy8gVGhlIHJlbWFpbmRlciBvZiB0aGUgcHJld3JpdHRlbiBjb25maWcgaXMgYXV0b21hdGljOyBhbGwgdGhlCisvLyB1c2VyIGhvb2tzIGFyZSBsaXN0ZWQgYWJvdmUuCisKKy8vIENyZWF0ZSBhIGJvb2xlYW4gZmxhZyB0byBiZSB1c2VkIHRvIGRldGVybWluZSBpZiAtLWZhc3QtbWF0aCBpcyBzZXQuCisjaWZkZWYgX19GQVNUX01BVEhfXworIyBkZWZpbmUgX0dMSUJDWFhfRkFTVF9NQVRIIDEKKyNlbHNlCisjIGRlZmluZSBfR0xJQkNYWF9GQVNUX01BVEggMAorI2VuZGlmCisKKy8vIFRoaXMgbWFya3Mgc3RyaW5nIGxpdGVyYWxzIGluIGhlYWRlciBmaWxlcyB0byBiZSBleHRyYWN0ZWQgZm9yIGV2ZW50dWFsCisvLyB0cmFuc2xhdGlvbi4gIEl0IGlzIHByaW1hcmlseSB1c2VkIGZvciBtZXNzYWdlcyBpbiB0aHJvd24gZXhjZXB0aW9uczsgc2VlCisvLyBzcmMvZnVuY3RleGNlcHQuY2MuICBXZSB1c2UgX19OIGJlY2F1c2UgdGhlIG1vcmUgdHJhZGl0aW9uYWwgX04gaXMgdXNlZAorLy8gZm9yIHNvbWV0aGluZyBlbHNlIHVuZGVyIGNlcnRhaW4gT1NlcyAoc2VlIEJBRE5BTUVTKS4KKyNkZWZpbmUgX19OKG1zZ2lkKSAgICAgKG1zZ2lkKQorCisvLyBGb3IgZXhhbXBsZSwgPHdpbmRvd3MuaD4gaXMga25vd24gdG8gI2RlZmluZSBtaW4gYW5kIG1heCBhcyBtYWNyb3MuLi4KKyN1bmRlZiBtaW4KKyN1bmRlZiBtYXgKKworLy8gRW5kIG9mIHByZXdyaXR0ZW4gY29uZmlnOyB0aGUgc2V0dGluZ3MgZGlzY292ZXJlZCBhdCBjb25maWd1cmUgdGltZSBmb2xsb3cuCisvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZy5oLmluIGJ5IGNvbmZpZ3VyZS4gICovCisvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhY29zZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfQUNPU0YgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFjb3NsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9BQ09TTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXNpbmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0FTSU5GIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhc2lubCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfQVNJTkwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgdGFyZ2V0IGFzc2VtYmxlciBzdXBwb3J0cyAuc3ltdmVyIGRpcmVjdGl2ZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9BU19TWU1WRVJfRElSRUNUSVZFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhdGFuMmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0FUQU4yRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXRhbjJsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9BVEFOMkwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGF0YW5mJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9BVEFORiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXRhbmwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0FUQU5MIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhdF9xdWlja19leGl0JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9BVF9RVUlDS19FWElUIDEKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHRhcmdldCBhc3NlbWJsZXIgc3VwcG9ydHMgdGhyZWFkLWxvY2FsIHN0b3JhZ2UuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9DQ19UTFMgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjZWlsZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfQ0VJTEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNlaWxsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9DRUlMTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Y29tcGxleC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9DT01QTEVYX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNvc2YnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0NPU0YgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNvc2hmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9DT1NIRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY29zaGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0NPU0hMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjb3NsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9DT1NMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkbGZjbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9ETEZDTl9IIDEKKworLyogRGVmaW5lIGlmIEVCQURNU0cgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VCQURNU0cgMQorCisvKiBEZWZpbmUgaWYgRUNBTkNFTEVEIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FQ0FOQ0VMRUQgMQorCisvKiBEZWZpbmUgaWYgRUNISUxEIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FQ0hJTEQgMQorCisvKiBEZWZpbmUgaWYgRUlEUk0gZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VJRFJNIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxlbmRpYW4uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRU5ESUFOX0ggMQorCisvKiBEZWZpbmUgaWYgRU5PREFUQSBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRU5PREFUQSAxCisKKy8qIERlZmluZSBpZiBFTk9MSU5LIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FTk9MSU5LIDEKKworLyogRGVmaW5lIGlmIEVOT1NQQyBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRU5PU1BDIDEKKworLyogRGVmaW5lIGlmIEVOT1NSIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FTk9TUiAxCisKKy8qIERlZmluZSBpZiBFTk9TVFIgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VOT1NUUiAxCisKKy8qIERlZmluZSBpZiBFTk9UUkVDT1ZFUkFCTEUgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VOT1RSRUNPVkVSQUJMRSAxCisKKy8qIERlZmluZSBpZiBFTk9UU1VQIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FTk9UU1VQIDEKKworLyogRGVmaW5lIGlmIEVPVkVSRkxPVyBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRU9WRVJGTE9XIDEKKworLyogRGVmaW5lIGlmIEVPV05FUkRFQUQgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VPV05FUkRFQUQgMQorCisvKiBEZWZpbmUgaWYgRVBFUk0gZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VQRVJNIDEKKworLyogRGVmaW5lIGlmIEVQUk9UTyBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRVBST1RPIDEKKworLyogRGVmaW5lIGlmIEVUSU1FIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FVElNRSAxCisKKy8qIERlZmluZSBpZiBFVElNRURPVVQgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VUSU1FRE9VVCAxCisKKy8qIERlZmluZSBpZiBFVFhUQlNZIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FVFhUQlNZIDEKKworLyogRGVmaW5lIGlmIEVXT1VMREJMT0NLIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FV09VTERCTE9DSyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZXhlY2luZm8uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRVhFQ0lORk9fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZXhwZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRVhQRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZXhwbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRVhQTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZmFic2YnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0ZBQlNGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmYWJzbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRkFCU0wgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZlbnYuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRkVOVl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmaW5pdGUnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0ZJTklURSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZmluaXRlZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRklOSVRFRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZmluaXRlbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRklOSVRFTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmxvYXQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRkxPQVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZmxvb3JmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GTE9PUkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZsb29ybCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRkxPT1JMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmbW9kZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRk1PREYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZtb2RsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GTU9ETCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZnBjbGFzcycgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9GUENMQVNTICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZnAuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9GUF9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZnJleHBmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GUkVYUEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZyZXhwbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRlJFWFBMIDEKKworLyogRGVmaW5lIGlmIF9VbndpbmRfR2V0SVBJbmZvIGlzIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9HRVRJUElORk8gMQorCisvKiBEZWZpbmUgaWYgZ2V0cyBpcyBhdmFpbGFibGUgaW4gPHN0ZGlvLmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0dFVFMgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGh5cG90JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9IWVBPVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaHlwb3RmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9IWVBPVEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGh5cG90bCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfSFlQT1RMIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBpY29udigpIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lDT05WIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpZWVlZnAuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9JRUVFRlBfSCAqLworCisvKiBEZWZpbmUgaWYgaW50NjRfdCBpcyBhdmFpbGFibGUgaW4gPHN0ZGludC5oPi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9JTlQ2NF9UIDEKKworLyogRGVmaW5lIGlmIGludDY0X3QgaXMgYSBsb25nLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lOVDY0X1RfTE9ORyAxCisKKy8qIERlZmluZSBpZiBpbnQ2NF90IGlzIGEgbG9uZyBsb25nLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfSU5UNjRfVF9MT05HX0xPTkcgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9JTlRUWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpc2luZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfSVNJTkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGlzaW5mZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfSVNJTkZGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpc2luZmwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lTSU5GTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaXNuYW4nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lTTkFOIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpc25hbmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lTTkFORiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaXNuYW5sJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9JU05BTkwgMQorCisvKiBEZWZpbmVkIGlmIGlzd2JsYW5rIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9JU1dCTEFOSyAxCisKKy8qIERlZmluZSBpZiBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MQ19NRVNTQUdFUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbGRleHBmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MREVYUEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxkZXhwbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfTERFWFBMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaWJpbnRsLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfTElCSU5UTF9IICovCisKKy8qIE9ubHkgdXNlZCBpbiBidWlsZCBkaXJlY3RvcnkgdGVzdHN1aXRlX2hvb2tzLmguICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9MSU1JVF9BUyAqLworCisvKiBPbmx5IHVzZWQgaW4gYnVpbGQgZGlyZWN0b3J5IHRlc3RzdWl0ZV9ob29rcy5oLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfTElNSVRfREFUQSAqLworCisvKiBPbmx5IHVzZWQgaW4gYnVpbGQgZGlyZWN0b3J5IHRlc3RzdWl0ZV9ob29rcy5oLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfTElNSVRfRlNJWkUgKi8KKworLyogT25seSB1c2VkIGluIGJ1aWxkIGRpcmVjdG9yeSB0ZXN0c3VpdGVfaG9va3MuaC4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX0xJTUlUX1JTUyAqLworCisvKiBPbmx5IHVzZWQgaW4gYnVpbGQgZGlyZWN0b3J5IHRlc3RzdWl0ZV9ob29rcy5oLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfTElNSVRfVk1FTSAqLworCisvKiBEZWZpbmUgaWYgZnV0ZXggc3lzY2FsbCBpcyBhdmFpbGFibGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfTElOVVhfRlVURVggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0NBTEVfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbG9nMTBmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0cxMEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxvZzEwbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfTE9HMTBMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsb2dmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0dGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsb2dsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0dMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtYWNoaW5lL2VuZGlhbi5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX01BQ0hJTkVfRU5ESUFOX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtYWNoaW5lL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfTUFDSElORV9QQVJBTV9IICovCisKKy8qIERlZmluZSBpZiBtYnN0YXRlX3QgZXhpc3RzIGluIHdjaGFyLmguICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfTUJTVEFURV9UIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfTUVNT1JZX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1vZGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX01PREYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1vZGZmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9NT0RGRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbW9kZmwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX01PREZMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuYW4uaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9OQU5fSCAqLworCisvKiBEZWZpbmUgaWYgcG9sbCBpcyBhdmFpbGFibGUgaW4gPHBvbGwuaD4uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfUE9MTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcG93ZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfUE9XRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcG93bCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfUE9XTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcWZwY2xhc3MnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfUUZQQ0xBU1MgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBxdWlja19leGl0JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9RVUlDS19FWElUIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRlbnYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfU0VURU5WICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2luY29zJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TSU5DT1MgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpbmNvc2YnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkNPU0YgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpbmNvc2wnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkNPU0wgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpbmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpbmhmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TSU5IRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2luaGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkhMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaW5sJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TSU5MIDEKKworLyogRGVmaW5lZCBpZiBzbGVlcCBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0xFRVAgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNxcnRmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TUVJURiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3FydGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NRUlRMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRhbGlnbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVERBTElHTl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRib29sLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NUREJPT0xfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NURElOVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1RETElCX0ggMQorCisvKiBEZWZpbmUgaWYgc3RyZXJyb3JfbCBpcyBhdmFpbGFibGUgaW4gPHN0cmluZy5oPi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVFJFUlJPUl9MIDEKKworLyogRGVmaW5lIGlmIHN0cmVycm9yX3IgaXMgYXZhaWxhYmxlIGluIDxzdHJpbmcuaD4uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1RSRVJST1JfUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVFJJTkdTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVFJJTkdfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RydG9mJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVFJUT0YgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnRvbGQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NUUlRPTEQgMQorCisvKiBEZWZpbmUgaWYgc3RyeGZybV9sIGlzIGF2YWlsYWJsZSBpbiA8c3RyaW5nLmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NUUlhGUk1fTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSB0YXJnZXQgcnVudGltZSBsaW5rZXIgc3VwcG9ydHMgYmluZGluZyB0aGUgc2FtZSBzeW1ib2wKKyAgIHRvIGRpZmZlcmVudCB2ZXJzaW9ucy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TWU1WRVJfU1lNQk9MX1JFTkFNSU5HX1JVTlRJTUVfU1VQUE9SVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2ZpbGlvLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfU1lTX0ZJTElPX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvaW9jdGwuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1lTX0lPQ1RMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pcGMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1lTX0lQQ19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvaXNhX2RlZnMuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9TWVNfSVNBX0RFRlNfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9tYWNoaW5lLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfU1lTX01BQ0hJTkVfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TWVNfUEFSQU1fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Jlc291cmNlLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZU19SRVNPVVJDRV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgYSBzdWl0YWJsZSA8c3lzL3NkdC5oPiBoZWFkZXIgZmlsZSAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfU1lTX1NEVF9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NlbS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TWVNfU0VNX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZU19TVEFUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zeXNpbmZvLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZU19TWVNJTkZPX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZU19USU1FX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TWVNfVFlQRVNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Vpby5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TWVNfVUlPX0ggMQorCisvKiBEZWZpbmUgaWYgU19JRlJFRyBpcyBhdmFpbGFibGUgaW4gPHN5cy9zdGF0Lmg+LiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfU19JRlJFRyAqLworCisvKiBEZWZpbmUgaWYgU19JRlJFRyBpcyBhdmFpbGFibGUgaW4gPHN5cy9zdGF0Lmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NfSVNSRUcgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHRhbmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1RBTkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHRhbmhmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9UQU5IRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdGFuaGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1RBTkhMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0YW5sJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9UQU5MIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx0Z21hdGguaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVEdNQVRIX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgdGFyZ2V0IHN1cHBvcnRzIHRocmVhZC1sb2NhbCBzdG9yYWdlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1RMUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1VOSVNURF9IIDEKKworLyogRGVmaW5lZCBpZiB1c2xlZXAgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1VTTEVFUCAxCisKKy8qIERlZmluZWQgaWYgdmZ3c2NhbmYgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1ZGV1NDQU5GIDEKKworLyogRGVmaW5lZCBpZiB2c3dzY2FuZiBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVlNXU0NBTkYgMQorCisvKiBEZWZpbmVkIGlmIHZ3c2NhbmYgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1ZXU0NBTkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHdjaGFyLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1dDSEFSX0ggMQorCisvKiBEZWZpbmVkIGlmIHdjc3RvZiBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfV0NTVE9GIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx3Y3R5cGUuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfV0NUWVBFX0ggMQorCisvKiBEZWZpbmVkIGlmIFNsZWVwIGV4aXN0cy4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX1dJTjMyX1NMRUVQICovCisKKy8qIERlZmluZSBpZiB3cml0ZXYgaXMgYXZhaWxhYmxlIGluIDxzeXMvdWlvLmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1dSSVRFViAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Fjb3NmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19BQ09TRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9hY29zbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQUNPU0wgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfYXNpbmYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0FTSU5GICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2FzaW5sJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19BU0lOTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9hdGFuMmYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0FUQU4yRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9hdGFuMmwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0FUQU4yTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9hdGFuZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQVRBTkYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfYXRhbmwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0FUQU5MICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2NlaWxmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19DRUlMRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9jZWlsbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQ0VJTEwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfY29zZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQ09TRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9jb3NoZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQ09TSEYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfY29zaGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0NPU0hMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Nvc2wnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0NPU0wgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZXhwZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRVhQRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9leHBsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19FWFBMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2ZhYnNmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GQUJTRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9mYWJzbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRkFCU0wgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZmluaXRlJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GSU5JVEUgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZmluaXRlZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRklOSVRFRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9maW5pdGVsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GSU5JVEVMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Zsb29yZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRkxPT1JGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Zsb29ybCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRkxPT1JMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Ztb2RmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GTU9ERiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9mbW9kbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRk1PREwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZnBjbGFzcycgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRlBDTEFTUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9mcmV4cGYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0ZSRVhQRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9mcmV4cGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0ZSRVhQTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9oeXBvdCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fSFlQT1QgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfaHlwb3RmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19IWVBPVEYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfaHlwb3RsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19IWVBPVEwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfaXNpbmYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0lTSU5GICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2lzaW5mZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fSVNJTkZGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2lzaW5mbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fSVNJTkZMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2lzbmFuJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19JU05BTiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9pc25hbmYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0lTTkFORiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9pc25hbmwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0lTTkFOTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9sZGV4cGYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0xERVhQRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9sZGV4cGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0xERVhQTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9sb2cxMGYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0xPRzEwRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9sb2cxMGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0xPRzEwTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9sb2dmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19MT0dGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2xvZ2wnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0xPR0wgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfbW9kZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fTU9ERiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9tb2RmZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fTU9ERkYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfbW9kZmwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX01PREZMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3Bvd2YnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1BPV0YgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfcG93bCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fUE9XTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9xZnBjbGFzcycgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fUUZQQ0xBU1MgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfc2luY29zJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19TSU5DT1MgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfc2luY29zZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fU0lOQ09TRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9zaW5jb3NsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19TSU5DT1NMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3NpbmYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1NJTkYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfc2luaGYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1NJTkhGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3NpbmhsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19TSU5ITCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9zaW5sJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19TSU5MICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3NxcnRmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19TUVJURiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9zcXJ0bCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fU1FSVEwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfdGFuZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fVEFORiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF90YW5oZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fVEFOSEYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfdGFuaGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1RBTkhMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3RhbmwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1RBTkwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfX2N4YV90aHJlYWRfYXRleGl0X2ltcGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX19DWEFfVEhSRUFEX0FURVhJVF9JTVBMICovCisKKy8qIERlZmluZSBhcyBjb25zdCBpZiB0aGUgZGVjbGFyYXRpb24gb2YgaWNvbnYoKSBuZWVkcyBjb25zdC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSUNPTlZfQ09OU1QgCisKKy8qIERlZmluZSB0byB0aGUgc3ViLWRpcmVjdG9yeSBpbiB3aGljaCBsaWJ0b29sIHN0b3JlcyB1bmluc3RhbGxlZCBsaWJyYXJpZXMuCisgICAqLworI2RlZmluZSBMVF9PQkpESVIgIi5saWJzLyIKKworLyogTmFtZSBvZiBwYWNrYWdlICovCisvKiAjdW5kZWYgX0dMSUJDWFhfUEFDS0FHRSAqLworCisvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfUEFDS0FHRV9CVUdSRVBPUlQgIiIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBfR0xJQkNYWF9QQUNLQUdFX05BTUUgInBhY2thZ2UtdW51c2VkIgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIF9HTElCQ1hYX1BBQ0tBR0VfU1RSSU5HICJwYWNrYWdlLXVudXNlZCB2ZXJzaW9uLXVudXNlZCIKKworLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBfR0xJQkNYWF9QQUNLQUdFX1RBUk5BTUUgImxpYnN0ZGMrKyIKKworLyogRGVmaW5lIHRvIHRoZSBob21lIHBhZ2UgZm9yIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfUEFDS0FHRV9VUkwgIiIKKworLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfUEFDS0FHRV9fR0xJQkNYWF9WRVJTSU9OICJ2ZXJzaW9uLXVudXNlZCIKKworLyogVGhlIHNpemUgb2YgYGNoYXInLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisvKiAjdW5kZWYgU0laRU9GX0NIQVIgKi8KKworLyogVGhlIHNpemUgb2YgYGludCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qICN1bmRlZiBTSVpFT0ZfSU5UICovCisKKy8qIFRoZSBzaXplIG9mIGBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9MT05HICovCisKKy8qIFRoZSBzaXplIG9mIGBzaG9ydCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qICN1bmRlZiBTSVpFT0ZfU0hPUlQgKi8KKworLyogVGhlIHNpemUgb2YgYHZvaWQgKicsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qICN1bmRlZiBTSVpFT0ZfVk9JRF9QICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI2RlZmluZSBTVERDX0hFQURFUlMgMQorCisvKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCisvKiAjdW5kZWYgX0dMSUJDWFhfVkVSU0lPTiAqLworCisvKiBEZWZpbmUgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIEMrKzExIGF0b21pY3MuICovCisjZGVmaW5lIF9HTElCQ1hYX0FUT01JQ19CVUlMVElOUyAxCisKKy8qIERlZmluZSB0byB1c2UgY29uY2VwdCBjaGVja2luZyBjb2RlIGZyb20gdGhlIGJvb3N0IGxpYnJhcmllcy4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9DT05DRVBUX0NIRUNLUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiBhIGZ1bGx5IGR5bmFtaWMgYmFzaWNfc3RyaW5nIGlzIHdhbnRlZCwgMCB0byBkaXNhYmxlLAorICAgdW5kZWZpbmVkIGZvciBwbGF0Zm9ybSBkZWZhdWx0cyAqLworI2RlZmluZSBfR0xJQkNYWF9GVUxMWV9EWU5BTUlDX1NUUklORyAwCisKKy8qIERlZmluZSBpZiBndGhyZWFkcyBsaWJyYXJ5IGlzIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFTX0dUSFJFQURTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgYSBmdWxsIGhvc3RlZCBsaWJyYXJ5IGlzIGJ1aWx0LCBvciAwIGlmIGZyZWVzdGFuZGluZy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSE9TVEVEIDEKKworLyogRGVmaW5lIGlmIGNvbXBhdGliaWxpdHkgc2hvdWxkIGJlIHByb3ZpZGVkIGZvciAtbWxvbmctZG91YmxlLTY0LiAqLworCisvKiBEZWZpbmUgaWYgcHRyZGlmZl90IGlzIGludC4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9QVFJESUZGX1RfSVNfSU5UICovCisKKy8qIERlZmluZSBpZiB1c2luZyBzZXRybGltaXQgdG8gc2V0IHJlc291cmNlIGxpbWl0cyBkdXJpbmcgIm1ha2UgY2hlY2siICovCisvKiAjdW5kZWYgX0dMSUJDWFhfUkVTX0xJTUlUUyAqLworCisvKiBEZWZpbmUgaWYgc2l6ZV90IGlzIHVuc2lnbmVkIGludC4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9TSVpFX1RfSVNfVUlOVCAqLworCisvKiBEZWZpbmUgaWYgdGhlIGNvbXBpbGVyIGlzIGNvbmZpZ3VyZWQgZm9yIHNldGptcC9sb25nam1wIGV4Y2VwdGlvbnMuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfU0pMSl9FWENFUFRJT05TICovCisKKy8qIERlZmluZSB0byB0aGUgdmFsdWUgb2YgdGhlIEVPRiBpbnRlZ2VyIGNvbnN0YW50LiAqLworI2RlZmluZSBfR0xJQkNYWF9TVERJT19FT0YgLTEKKworLyogRGVmaW5lIHRvIHRoZSB2YWx1ZSBvZiB0aGUgU0VFS19DVVIgaW50ZWdlciBjb25zdGFudC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfU1RESU9fU0VFS19DVVIgMQorCisvKiBEZWZpbmUgdG8gdGhlIHZhbHVlIG9mIHRoZSBTRUVLX0VORCBpbnRlZ2VyIGNvbnN0YW50LiAqLworI2RlZmluZSBfR0xJQkNYWF9TVERJT19TRUVLX0VORCAyCisKKy8qIERlZmluZSB0byB1c2Ugc3ltYm9sIHZlcnNpb25pbmcgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAqLworI2RlZmluZSBfR0xJQkNYWF9TWU1WRVIgMQorCisvKiBEZWZpbmUgdG8gdXNlIGRhcndpbiB2ZXJzaW9uaW5nIGluIHRoZSBzaGFyZWQgbGlicmFyeS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9TWU1WRVJfREFSV0lOICovCisKKy8qIERlZmluZSB0byB1c2UgR05VIHZlcnNpb25pbmcgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAqLworI2RlZmluZSBfR0xJQkNYWF9TWU1WRVJfR05VIDEKKworLyogRGVmaW5lIHRvIHVzZSBHTlUgbmFtZXNwYWNlIHZlcnNpb25pbmcgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAqLworLyogI3VuZGVmIF9HTElCQ1hYX1NZTVZFUl9HTlVfTkFNRVNQQUNFICovCisKKy8qIERlZmluZSB0byB1c2UgU3VuIHZlcnNpb25pbmcgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAqLworLyogI3VuZGVmIF9HTElCQ1hYX1NZTVZFUl9TVU4gKi8KKworLyogRGVmaW5lIGlmIEM5OSBmdW5jdGlvbnMgb3IgbWFjcm9zIGZyb20gPHdjaGFyLmg+LCA8bWF0aC5oPiwgPGNvbXBsZXguaD4sCisgICA8c3RkaW8uaD4sIGFuZCA8c3RkbGliLmg+IGNhbiBiZSB1c2VkIG9yIGV4cG9zZWQuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DOTkgMQorCisvKiBEZWZpbmUgaWYgQzk5IGZ1bmN0aW9ucyBpbiA8Y29tcGxleC5oPiBzaG91bGQgYmUgdXNlZCBpbiA8Y29tcGxleD4uIFVzaW5nCisgICBjb21waWxlciBidWlsdGlucyBmb3IgdGhlc2UgZnVuY3Rpb25zIHJlcXVpcmVzIGNvcnJlc3BvbmRpbmcgQzk5IGxpYnJhcnkKKyAgIGZ1bmN0aW9ucyB0byBiZSBwcmVzZW50LiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVggMQorCisvKiBEZWZpbmUgaWYgQzk5IGZ1bmN0aW9ucyBpbiA8Y29tcGxleC5oPiBzaG91bGQgYmUgdXNlZCBpbiA8dHIxL2NvbXBsZXg+LgorICAgVXNpbmcgY29tcGlsZXIgYnVpbHRpbnMgZm9yIHRoZXNlIGZ1bmN0aW9ucyByZXF1aXJlcyBjb3JyZXNwb25kaW5nIEM5OQorICAgbGlicmFyeSBmdW5jdGlvbnMgdG8gYmUgcHJlc2VudC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYX1RSMSAxCisKKy8qIERlZmluZSBpZiBDOTkgZnVuY3Rpb25zIGluIDxjdHlwZS5oPiBzaG91bGQgYmUgaW1wb3J0ZWQgaW4gPHRyMS9jY3R5cGU+IGluCisgICBuYW1lc3BhY2Ugc3RkOjp0cjEuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DOTlfQ1RZUEVfVFIxIDEKKworLyogRGVmaW5lIGlmIEM5OSBmdW5jdGlvbnMgaW4gPGZlbnYuaD4gc2hvdWxkIGJlIGltcG9ydGVkIGluIDx0cjEvY2ZlbnY+IGluCisgICBuYW1lc3BhY2Ugc3RkOjp0cjEuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DOTlfRkVOVl9UUjEgMQorCisvKiBEZWZpbmUgaWYgQzk5IGZ1bmN0aW9ucyBpbiA8aW50dHlwZXMuaD4gc2hvdWxkIGJlIGltcG9ydGVkIGluCisgICA8dHIxL2NpbnR0eXBlcz4gaW4gbmFtZXNwYWNlIHN0ZDo6dHIxLiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfQzk5X0lOVFRZUEVTX1RSMSAxCisKKy8qIERlZmluZSBpZiB3Y2hhcl90IEM5OSBmdW5jdGlvbnMgaW4gPGludHR5cGVzLmg+IHNob3VsZCBiZSBpbXBvcnRlZCBpbgorICAgPHRyMS9jaW50dHlwZXM+IGluIG5hbWVzcGFjZSBzdGQ6OnRyMS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0M5OV9JTlRUWVBFU19XQ0hBUl9UX1RSMSAxCisKKy8qIERlZmluZSBpZiBDOTkgZnVuY3Rpb25zIG9yIG1hY3JvcyBpbiA8bWF0aC5oPiBzaG91bGQgYmUgaW1wb3J0ZWQgaW4gPGNtYXRoPgorICAgaW4gbmFtZXNwYWNlIHN0ZC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0M5OV9NQVRIIDEKKworLyogRGVmaW5lIGlmIEM5OSBmdW5jdGlvbnMgb3IgbWFjcm9zIGluIDxtYXRoLmg+IHNob3VsZCBiZSBpbXBvcnRlZCBpbgorICAgPHRyMS9jbWF0aD4gaW4gbmFtZXNwYWNlIHN0ZDo6dHIxLiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxIDEKKworLyogRGVmaW5lIGlmIEM5OSB0eXBlcyBpbiA8c3RkaW50Lmg+IHNob3VsZCBiZSBpbXBvcnRlZCBpbiA8dHIxL2NzdGRpbnQ+IGluCisgICBuYW1lc3BhY2Ugc3RkOjp0cjEuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMSAxCisKKy8qIERlZmluZWQgaWYgY2xvY2tfZ2V0dGltZSBoYXMgbW9ub3RvbmljIGNsb2NrIHN1cHBvcnQuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DTE9DS19NT05PVE9OSUMgMQorCisvKiBEZWZpbmVkIGlmIGNsb2NrX2dldHRpbWUgc3lzY2FsbCBoYXMgbW9ub3RvbmljIGFuZCByZWFsdGltZSBjbG9jayBzdXBwb3J0LiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfQ0xPQ0tfR0VUVElNRV9TWVNDQUxMIDEKKworLyogRGVmaW5lZCBpZiBjbG9ja19nZXR0aW1lIGhhcyByZWFsdGltZSBjbG9jayBzdXBwb3J0LiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfQ0xPQ0tfUkVBTFRJTUUgMQorCisvKiBEZWZpbmUgaWYgSVNPL0lFQyBUUiAyNDczMyBkZWNpbWFsIGZsb2F0aW5nIHBvaW50IHR5cGVzIGFyZSBzdXBwb3J0ZWQgb24KKyAgIHRoaXMgaG9zdC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0RFQ0lNQUxfRkxPQVQgMQorCisvKiBEZWZpbmUgaWYgX19mbG9hdDEyOCBpcyBzdXBwb3J0ZWQgb24gdGhpcyBob3N0LiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfRkxPQVQxMjggMQorCisvKiBEZWZpbmVkIGlmIGdldHRpbWVvZmRheSBpcyBhdmFpbGFibGUuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9HRVRUSU1FT0ZEQVkgMQorCisvKiBEZWZpbmUgaWYgZ2V0X25wcm9jcyBpcyBhdmFpbGFibGUgaW4gPHN5cy9zeXNpbmZvLmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfR0VUX05QUk9DUyAxCisKKy8qIERlZmluZSBpZiBfX2ludDEyOCBpcyBzdXBwb3J0ZWQgb24gdGhpcyBob3N0LiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfSU5UMTI4IDEKKworLyogRGVmaW5lIGlmIExGUyBzdXBwb3J0IGlzIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0xGUyAxCisKKy8qIERlZmluZSBpZiBjb2RlIHNwZWNpYWxpemVkIGZvciBsb25nIGxvbmcgc2hvdWxkIGJlIHVzZWQuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9MT05HX0xPTkcgMQorCisvKiBEZWZpbmVkIGlmIG5hbm9zbGVlcCBpcyBhdmFpbGFibGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfVVNFX05BTk9TTEVFUCAqLworCisvKiBEZWZpbmUgaWYgTkxTIHRyYW5zbGF0aW9ucyBhcmUgdG8gYmUgdXNlZC4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9VU0VfTkxTICovCisKKy8qIERlZmluZSBpZiBwdGhyZWFkc19udW1fcHJvY2Vzc29yc19ucCBpcyBhdmFpbGFibGUgaW4gPHB0aHJlYWQuaD4uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfVVNFX1BUSFJFQURTX05VTV9QUk9DRVNTT1JTX05QICovCisKKy8qIERlZmluZSBpZiAvZGV2L3JhbmRvbSBhbmQgL2Rldi91cmFuZG9tIGFyZSBhdmFpbGFibGUgZm9yIHRoZSByYW5kb21fZGV2aWNlCisgICBvZiBUUjEgKENoYXB0ZXIgNS4xKS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX1JBTkRPTV9UUjEgMQorCisvKiBEZWZpbmVkIGlmIHNjaGVkX3lpZWxkIGlzIGF2YWlsYWJsZS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9VU0VfU0NIRURfWUlFTEQgKi8KKworLyogRGVmaW5lIGlmIF9TQ19OUFJPQ0VTU09SU19PTkxOIGlzIGF2YWlsYWJsZSBpbiA8dW5pc3RkLmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfU0NfTlBST0NFU1NPUlNfT05MTiAxCisKKy8qIERlZmluZSBpZiBfU0NfTlBST0NfT05MTiBpcyBhdmFpbGFibGUgaW4gPHVuaXN0ZC5oPi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9VU0VfU0NfTlBST0NfT05MTiAqLworCisvKiBEZWZpbmUgaWYgc3lzY3RsKCksIENUTF9IVyBhbmQgSFdfTkNQVSBhcmUgYXZhaWxhYmxlIGluIDxzeXMvc3lzY3RsLmg+LiAqLworLyogI3VuZGVmIF9HTElCQ1hYX1VTRV9TWVNDVExfSFdfTkNQVSAqLworCisvKiBEZWZpbmUgaWYgY29kZSBzcGVjaWFsaXplZCBmb3Igd2NoYXJfdCBzaG91bGQgYmUgdXNlZC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX1dDSEFSX1QgMQorCisvKiBEZWZpbmUgdG8gMSBpZiBhIHZlcmJvc2UgbGlicmFyeSBpcyBidWlsdCwgb3IgMCBvdGhlcndpc2UuICovCisjZGVmaW5lIF9HTElCQ1hYX1ZFUkJPU0UgMQorCisvKiBEZWZpbmVkIGlmIGFzIGNhbiBoYW5kbGUgcmRyYW5kLiAqLworI2RlZmluZSBfR0xJQkNYWF9YODZfUkRSQU5EIDEKKworLyogRGVmaW5lIHRvIDEgaWYgbXV0ZXhfdGltZWRsb2NrIGlzIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgX0dUSFJFQURfVVNFX01VVEVYX1RJTUVETE9DSyAxCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19BQ09TRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0FDT1NGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9BQ09TRiAxCisjIGRlZmluZSBhY29zZiBfYWNvc2YKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQUNPU0wpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9BQ09TTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQUNPU0wgMQorIyBkZWZpbmUgYWNvc2wgX2Fjb3NsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0FTSU5GKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQVNJTkYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0FTSU5GIDEKKyMgZGVmaW5lIGFzaW5mIF9hc2luZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19BU0lOTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0FTSU5MKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9BU0lOTCAxCisjIGRlZmluZSBhc2lubCBfYXNpbmwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQVRBTjJGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQVRBTjJGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9BVEFOMkYgMQorIyBkZWZpbmUgYXRhbjJmIF9hdGFuMmYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQVRBTjJMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQVRBTjJMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9BVEFOMkwgMQorIyBkZWZpbmUgYXRhbjJsIF9hdGFuMmwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQVRBTkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9BVEFORikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQVRBTkYgMQorIyBkZWZpbmUgYXRhbmYgX2F0YW5mCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0FUQU5MKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQVRBTkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0FUQU5MIDEKKyMgZGVmaW5lIGF0YW5sIF9hdGFubAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19DRUlMRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0NFSUxGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9DRUlMRiAxCisjIGRlZmluZSBjZWlsZiBfY2VpbGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQ0VJTEwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9DRUlMTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQ0VJTEwgMQorIyBkZWZpbmUgY2VpbGwgX2NlaWxsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0NPU0YpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9DT1NGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9DT1NGIDEKKyMgZGVmaW5lIGNvc2YgX2Nvc2YKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQ09TSEYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9DT1NIRikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQ09TSEYgMQorIyBkZWZpbmUgY29zaGYgX2Nvc2hmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0NPU0hMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQ09TSEwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0NPU0hMIDEKKyMgZGVmaW5lIGNvc2hsIF9jb3NobAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19DT1NMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQ09TTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQ09TTCAxCisjIGRlZmluZSBjb3NsIF9jb3NsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0VYUEYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9FWFBGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9FWFBGIDEKKyMgZGVmaW5lIGV4cGYgX2V4cGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRVhQTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0VYUEwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0VYUEwgMQorIyBkZWZpbmUgZXhwbCBfZXhwbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GQUJTRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZBQlNGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GQUJTRiAxCisjIGRlZmluZSBmYWJzZiBfZmFic2YKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRkFCU0wpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GQUJTTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfRkFCU0wgMQorIyBkZWZpbmUgZmFic2wgX2ZhYnNsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0ZJTklURSkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZJTklURSkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfRklOSVRFIDEKKyMgZGVmaW5lIGZpbml0ZSBfZmluaXRlCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0ZJTklURUYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GSU5JVEVGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GSU5JVEVGIDEKKyMgZGVmaW5lIGZpbml0ZWYgX2Zpbml0ZWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRklOSVRFTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZJTklURUwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZJTklURUwgMQorIyBkZWZpbmUgZmluaXRlbCBfZmluaXRlbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GTE9PUkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GTE9PUkYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZMT09SRiAxCisjIGRlZmluZSBmbG9vcmYgX2Zsb29yZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GTE9PUkwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GTE9PUkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZMT09STCAxCisjIGRlZmluZSBmbG9vcmwgX2Zsb29ybAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GTU9ERikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZNT0RGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GTU9ERiAxCisjIGRlZmluZSBmbW9kZiBfZm1vZGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRk1PREwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GTU9ETCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfRk1PREwgMQorIyBkZWZpbmUgZm1vZGwgX2Ztb2RsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0ZQQ0xBU1MpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GUENMQVNTKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GUENMQVNTIDEKKyMgZGVmaW5lIGZwY2xhc3MgX2ZwY2xhc3MKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRlJFWFBGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfRlJFWFBGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GUkVYUEYgMQorIyBkZWZpbmUgZnJleHBmIF9mcmV4cGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRlJFWFBMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfRlJFWFBMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GUkVYUEwgMQorIyBkZWZpbmUgZnJleHBsIF9mcmV4cGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fSFlQT1QpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9IWVBPVCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfSFlQT1QgMQorIyBkZWZpbmUgaHlwb3QgX2h5cG90CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0hZUE9URikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0hZUE9URikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfSFlQT1RGIDEKKyMgZGVmaW5lIGh5cG90ZiBfaHlwb3RmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0hZUE9UTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0hZUE9UTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfSFlQT1RMIDEKKyMgZGVmaW5lIGh5cG90bCBfaHlwb3RsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0lTSU5GKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfSVNJTkYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0lTSU5GIDEKKyMgZGVmaW5lIGlzaW5mIF9pc2luZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19JU0lORkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9JU0lORkYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0lTSU5GRiAxCisjIGRlZmluZSBpc2luZmYgX2lzaW5mZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19JU0lORkwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9JU0lORkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0lTSU5GTCAxCisjIGRlZmluZSBpc2luZmwgX2lzaW5mbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19JU05BTikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0lTTkFOKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9JU05BTiAxCisjIGRlZmluZSBpc25hbiBfaXNuYW4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fSVNOQU5GKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfSVNOQU5GKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9JU05BTkYgMQorIyBkZWZpbmUgaXNuYW5mIF9pc25hbmYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fSVNOQU5MKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfSVNOQU5MKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9JU05BTkwgMQorIyBkZWZpbmUgaXNuYW5sIF9pc25hbmwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTERFWFBGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfTERFWFBGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9MREVYUEYgMQorIyBkZWZpbmUgbGRleHBmIF9sZGV4cGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTERFWFBMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfTERFWFBMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9MREVYUEwgMQorIyBkZWZpbmUgbGRleHBsIF9sZGV4cGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTE9HMTBGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfTE9HMTBGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0cxMEYgMQorIyBkZWZpbmUgbG9nMTBmIF9sb2cxMGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTE9HMTBMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfTE9HMTBMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0cxMEwgMQorIyBkZWZpbmUgbG9nMTBsIF9sb2cxMGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTE9HRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0xPR0YpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0xPR0YgMQorIyBkZWZpbmUgbG9nZiBfbG9nZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19MT0dMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfTE9HTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfTE9HTCAxCisjIGRlZmluZSBsb2dsIF9sb2dsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX01PREYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9NT0RGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9NT0RGIDEKKyMgZGVmaW5lIG1vZGYgX21vZGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTU9ERkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9NT0RGRikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfTU9ERkYgMQorIyBkZWZpbmUgbW9kZmYgX21vZGZmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX01PREZMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfTU9ERkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX01PREZMIDEKKyMgZGVmaW5lIG1vZGZsIF9tb2RmbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19QT1dGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfUE9XRikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfUE9XRiAxCisjIGRlZmluZSBwb3dmIF9wb3dmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1BPV0wpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9QT1dMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9QT1dMIDEKKyMgZGVmaW5lIHBvd2wgX3Bvd2wKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fUUZQQ0xBU1MpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9RRlBDTEFTUykKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfUUZQQ0xBU1MgMQorIyBkZWZpbmUgcWZwY2xhc3MgX3FmcGNsYXNzCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NJTkNPUykgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NJTkNPUykKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0lOQ09TIDEKKyMgZGVmaW5lIHNpbmNvcyBfc2luY29zCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NJTkNPU0YpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9TSU5DT1NGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9TSU5DT1NGIDEKKyMgZGVmaW5lIHNpbmNvc2YgX3NpbmNvc2YKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fU0lOQ09TTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NJTkNPU0wpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkNPU0wgMQorIyBkZWZpbmUgc2luY29zbCBfc2luY29zbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19TSU5GKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfU0lORikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0lORiAxCisjIGRlZmluZSBzaW5mIF9zaW5mCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NJTkhGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfU0lOSEYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkhGIDEKKyMgZGVmaW5lIHNpbmhmIF9zaW5oZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19TSU5ITCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NJTkhMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9TSU5ITCAxCisjIGRlZmluZSBzaW5obCBfc2luaGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fU0lOTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NJTkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkwgMQorIyBkZWZpbmUgc2lubCBfc2lubAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19TUVJURikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NRUlRGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9TUVJURiAxCisjIGRlZmluZSBzcXJ0ZiBfc3FydGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fU1FSVEwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9TUVJUTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1FSVEwgMQorIyBkZWZpbmUgc3FydGwgX3NxcnRsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NUUlRPRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NUUlRPRikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1RSVE9GIDEKKyMgZGVmaW5lIHN0cnRvZiBfc3RydG9mCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NUUlRPTEQpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9TVFJUT0xEKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVFJUT0xEIDEKKyMgZGVmaW5lIHN0cnRvbGQgX3N0cnRvbGQKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fVEFORikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1RBTkYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1RBTkYgMQorIyBkZWZpbmUgdGFuZiBfdGFuZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19UQU5IRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1RBTkhGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9UQU5IRiAxCisjIGRlZmluZSB0YW5oZiBfdGFuaGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fVEFOSEwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9UQU5ITCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfVEFOSEwgMQorIyBkZWZpbmUgdGFuaGwgX3RhbmhsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1RBTkwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9UQU5MKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9UQU5MIDEKKyMgZGVmaW5lIHRhbmwgX3RhbmwKKyNlbmRpZgorCisjZW5kaWYgLy8gX0dMSUJDWFhfQ1hYX0NPTkZJR19ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2MrK2lvLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2MrK2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4YzE4NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvYysraW8uaApAQCAtMCwwICsxLDUwIEBACisvLyBVbmRlcmx5aW5nIGlvIGxpYnJhcnkgZGV0YWlscyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9jKytpby5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aW9zfQorICovCisKKy8vIGNfaW9fc3RkaW8uaCAtIERlZmluZXMgZm9yIHVzaW5nICJDIiBzdGRpby5oCisKKyNpZm5kZWYgX0dMSUJDWFhfQ1hYX0lPX0gKKyNkZWZpbmUgX0dMSUJDWFhfQ1hYX0lPX0ggMQorCisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGJpdHMvZ3Roci5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdHlwZWRlZiBfX2d0aHJlYWRfbXV0ZXhfdCBfX2NfbG9jazsKKworICAvLyBmb3IgYmFzaWNfZmlsZS5oCisgIHR5cGVkZWYgRklMRSBfX2NfZmlsZTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvYysrbG9jYWxlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2MrK2xvY2FsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOGQ5NzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2MrK2xvY2FsZS5oCkBAIC0wLDAgKzEsMTE0IEBACisvLyBXcmFwcGVyIGZvciB1bmRlcmx5aW5nIEMtbGFuZ3VhZ2UgbG9jYWxpemF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2MrK2xvY2FsZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bG9jYWxlfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMi44ICBTdGFuZGFyZCBsb2NhbGUgY2F0ZWdvcmllcy4KKy8vCisKKy8vIFdyaXR0ZW4gYnkgQmVuamFtaW4gS29zbmlrIDxia296QHJlZGhhdC5jb20+CisKKyNpZm5kZWYgX0dMSUJDWFhfQ1hYX0xPQ0FMRV9ICisjZGVmaW5lIF9HTElCQ1hYX0NYWF9MT0NBTEVfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGNsb2NhbGU+CisKKyNkZWZpbmUgX0dMSUJDWFhfQ19MT0NBTEVfR05VIDEKKworI2RlZmluZSBfR0xJQkNYWF9OVU1fQ0FURUdPUklFUyA2CisKKyNpZiBfX0dMSUJDX18gPiAyIHx8IChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPiAyKQorbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIGV4dGVybiAiQyIgX190eXBlb2YodXNlbG9jYWxlKSBfX3VzZWxvY2FsZTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0eXBlZGVmIF9fbG9jYWxlX3QJCV9fY19sb2NhbGU7CisKKyAgLy8gQ29udmVydCBudW1lcmljIHZhbHVlIG9mIHR5cGUgZG91YmxlIGFuZCBsb25nIGRvdWJsZSB0byBzdHJpbmcgYW5kCisgIC8vIHJldHVybiBsZW5ndGggb2Ygc3RyaW5nLiAgSWYgdnNucHJpbnRmIGlzIGF2YWlsYWJsZSB1c2UgaXQsIG90aGVyd2lzZQorICAvLyBmYWxsIGJhY2sgdG8gdGhlIHVuc2FmZSB2c3ByaW50ZiB3aGljaCwgaW4gZ2VuZXJhbCwgY2FuIGJlIGRhbmdlcm91cworICAvLyBhbmQgc2hvdWxkIGJlIGF2b2lkZWQuCisgIGlubGluZSBpbnQKKyAgX19jb252ZXJ0X2Zyb21fdihjb25zdCBfX2NfbG9jYWxlJiBfX2Nsb2MgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKSwKKwkJICAgY2hhciogX19vdXQsCisJCSAgIGNvbnN0IGludCBfX3NpemUgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKSwKKwkJICAgY29uc3QgY2hhciogX19mbXQsIC4uLikKKyAgeworI2lmIF9fR0xJQkNfXyA+IDIgfHwgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+IDIpCisgICAgX19jX2xvY2FsZSBfX29sZCA9IF9fZ251X2N4eDo6X191c2Vsb2NhbGUoX19jbG9jKTsKKyNlbHNlCisgICAgY2hhciogX19vbGQgPSBzdGQ6OnNldGxvY2FsZShMQ19OVU1FUklDLCAwKTsKKyAgICBjaGFyKiBfX3NhdiA9IDA7CisgICAgaWYgKF9fYnVpbHRpbl9zdHJjbXAoX19vbGQsICJDIikpCisgICAgICB7CisJY29uc3Qgc2l6ZV90IF9fbGVuID0gX19idWlsdGluX3N0cmxlbihfX29sZCkgKyAxOworCV9fc2F2ID0gbmV3IGNoYXJbX19sZW5dOworCV9fYnVpbHRpbl9tZW1jcHkoX19zYXYsIF9fb2xkLCBfX2xlbik7CisJc3RkOjpzZXRsb2NhbGUoTENfTlVNRVJJQywgIkMiKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgX19idWlsdGluX3ZhX2xpc3QgX19hcmdzOworICAgIF9fYnVpbHRpbl92YV9zdGFydChfX2FyZ3MsIF9fZm10KTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTkKKyAgICBjb25zdCBpbnQgX19yZXQgPSBfX2J1aWx0aW5fdnNucHJpbnRmKF9fb3V0LCBfX3NpemUsIF9fZm10LCBfX2FyZ3MpOworI2Vsc2UKKyAgICBjb25zdCBpbnQgX19yZXQgPSBfX2J1aWx0aW5fdnNwcmludGYoX19vdXQsIF9fZm10LCBfX2FyZ3MpOworI2VuZGlmCisKKyAgICBfX2J1aWx0aW5fdmFfZW5kKF9fYXJncyk7CisKKyNpZiBfX0dMSUJDX18gPiAyIHx8IChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPiAyKQorICAgIF9fZ251X2N4eDo6X191c2Vsb2NhbGUoX19vbGQpOworI2Vsc2UKKyAgICBpZiAoX19zYXYpCisgICAgICB7CisJc3RkOjpzZXRsb2NhbGUoTENfTlVNRVJJQywgX19zYXYpOworCWRlbGV0ZSBbXSBfX3NhdjsKKyAgICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBfX3JldDsKKyAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9jcHVfZGVmaW5lcy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9jcHVfZGVmaW5lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ODFkM2YKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2NwdV9kZWZpbmVzLmgKQEAgLTAsMCArMSwzMyBAQAorLy8gU3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yIGdlbmVyaWMgcGxhdGZvcm1zICAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9jcHVfZGVmaW5lcy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aW9zZndkfQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQ1BVX0RFRklORVMKKyNkZWZpbmUgX0dMSUJDWFhfQ1BVX0RFRklORVMgMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvY3R5cGVfYmFzZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9jdHlwZV9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4ZTk3OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvY3R5cGVfYmFzZS5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vIExvY2FsZSBzdXBwb3J0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2N0eXBlX2Jhc2UuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2xvY2FsZX0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjIuMSAgTG9jYWxlcworLy8KKworLy8gSW5mb3JtYXRpb24gYXMgZ2xlYW5lZCBmcm9tIC91c3IvaW5jbHVkZS9jdHlwZS5oCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLy8gQGJyaWVmICBCYXNlIGNsYXNzIGZvciBjdHlwZS4KKyAgc3RydWN0IGN0eXBlX2Jhc2UKKyAgeworICAgIC8vIE5vbi1zdGFuZGFyZCB0eXBlZGVmcy4KKyAgICB0eXBlZGVmIGNvbnN0IGludCogCQlfX3RvX3R5cGU7CisKKyAgICAvLyBOQjogT2Zmc2V0cyBpbnRvIGN0eXBlPGNoYXI+OjpfTV90YWJsZSBmb3JjZSBhIHBhcnRpY3VsYXIgc2l6ZQorICAgIC8vIG9uIHRoZSBtYXNrIHR5cGUuIEJlY2F1c2Ugb2YgdGhpcywgd2UgZG9uJ3QgdXNlIGFuIGVudW0uCisgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAJbWFzazsKKyAgICBzdGF0aWMgY29uc3QgbWFzayB1cHBlciAgICAJPSBfSVN1cHBlcjsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBsb3dlciAJPSBfSVNsb3dlcjsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBhbHBoYSAJPSBfSVNhbHBoYTsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBkaWdpdCAJPSBfSVNkaWdpdDsKKyAgICBzdGF0aWMgY29uc3QgbWFzayB4ZGlnaXQgCT0gX0lTeGRpZ2l0OworICAgIHN0YXRpYyBjb25zdCBtYXNrIHNwYWNlIAk9IF9JU3NwYWNlOworICAgIHN0YXRpYyBjb25zdCBtYXNrIHByaW50IAk9IF9JU3ByaW50OworICAgIHN0YXRpYyBjb25zdCBtYXNrIGdyYXBoIAk9IF9JU2FscGhhIHwgX0lTZGlnaXQgfCBfSVNwdW5jdDsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBjbnRybCAJPSBfSVNjbnRybDsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBwdW5jdCAJPSBfSVNwdW5jdDsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBhbG51bSAJPSBfSVNhbHBoYSB8IF9JU2RpZ2l0OworICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2N0eXBlX2lubGluZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9jdHlwZV9pbmxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDYzMTdiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9jdHlwZV9pbmxpbmUuaApAQCAtMCwwICsxLDc2IEBACisvLyBMb2NhbGUgc3VwcG9ydCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9jdHlwZV9pbmxpbmUuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2xvY2FsZX0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjIuMSAgTG9jYWxlcworLy8KKworLy8gY3R5cGUgYml0cyB0byBiZSBpbmxpbmVkIGdvIGhlcmUuIE5vbi1pbmxpbmFibGUgKGllIHZpcnR1YWwgZG9fKikKKy8vIGZ1bmN0aW9ucyBnbyBpbiBjdHlwZS5jYworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgYm9vbAorICBjdHlwZTxjaGFyPjo6CisgIGlzKG1hc2sgX19tLCBjaGFyIF9fYykgY29uc3QKKyAgeyByZXR1cm4gX01fdGFibGVbc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oX19jKV0gJiBfX207IH0KKworICBjb25zdCBjaGFyKgorICBjdHlwZTxjaGFyPjo6CisgIGlzKGNvbnN0IGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gsIG1hc2sqIF9fdmVjKSBjb25zdAorICB7CisgICAgd2hpbGUgKF9fbG93IDwgX19oaWdoKQorICAgICAgKl9fdmVjKysgPSBfTV90YWJsZVtzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigqX19sb3crKyldOworICAgIHJldHVybiBfX2hpZ2g7CisgIH0KKworICBjb25zdCBjaGFyKgorICBjdHlwZTxjaGFyPjo6CisgIHNjYW5faXMobWFzayBfX20sIGNvbnN0IGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gpIGNvbnN0CisgIHsKKyAgICB3aGlsZSAoX19sb3cgPCBfX2hpZ2gKKwkgICAmJiAhKF9NX3RhYmxlW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KCpfX2xvdyldICYgX19tKSkKKyAgICAgICsrX19sb3c7CisgICAgcmV0dXJuIF9fbG93OworICB9CisKKyAgY29uc3QgY2hhcioKKyAgY3R5cGU8Y2hhcj46OgorICBzY2FuX25vdChtYXNrIF9fbSwgY29uc3QgY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCkgY29uc3QKKyAgeworICAgIHdoaWxlIChfX2xvdyA8IF9faGlnaAorCSAgICYmIChfTV90YWJsZVtzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigqX19sb3cpXSAmIF9fbSkgIT0gMCkKKyAgICAgICsrX19sb3c7CisgICAgcmV0dXJuIF9fbG93OworICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvY3h4YWJpX3R3ZWFrcy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9jeHhhYmlfdHdlYWtzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU4OTUzOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvY3h4YWJpX3R3ZWFrcy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8vIENvbnRyb2wgdmFyaW91cyB0YXJnZXQgc3BlY2lmaWMgQUJJIHR3ZWFrcy4gIEdlbmVyaWMgdmVyc2lvbi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvY3h4YWJpX3R3ZWFrcy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7Y3h4YWJpLmh9CisgKi8KKworI2lmbmRlZiBfQ1hYQUJJX1RXRUFLU19ICisjZGVmaW5lIF9DWFhBQklfVFdFQUtTX0ggMQorCisjaWZkZWYgX19jcGx1c3BsdXMKK25hbWVzcGFjZSBfX2N4eGFiaXYxCit7CisgIGV4dGVybiAiQyIgCisgIHsKKyNlbmRpZgorCisgIC8vIFRoZSBnZW5lcmljIEFCSSB1c2VzIHRoZSBmaXJzdCBieXRlIG9mIGEgNjQtYml0IGd1YXJkIHZhcmlhYmxlLgorI2RlZmluZSBfR0xJQkNYWF9HVUFSRF9URVNUKHgpICgqKGNoYXIgKikgKHgpICE9IDApCisjZGVmaW5lIF9HTElCQ1hYX0dVQVJEX1NFVCh4KSAqKGNoYXIgKikgKHgpID0gMQorI2RlZmluZSBfR0xJQkNYWF9HVUFSRF9CSVQgX19ndWFyZF90ZXN0X2JpdCAoMCwgMSkKKyNkZWZpbmUgX0dMSUJDWFhfR1VBUkRfUEVORElOR19CSVQgX19ndWFyZF90ZXN0X2JpdCAoMSwgMSkKKyNkZWZpbmUgX0dMSUJDWFhfR1VBUkRfV0FJVElOR19CSVQgX19ndWFyZF90ZXN0X2JpdCAoMiwgMSkKKyAgX19leHRlbnNpb25fXyB0eXBlZGVmIGludCBfX2d1YXJkIF9fYXR0cmlidXRlX18oKG1vZGUgKF9fRElfXykpKTsKKworICAvLyBfX2N4YV92ZWNfY3RvciBoYXMgdm9pZCByZXR1cm4gdHlwZS4KKyAgdHlwZWRlZiB2b2lkIF9fY3hhX3ZlY19jdG9yX3JldHVybl90eXBlOworI2RlZmluZSBfR0xJQkNYWF9DWEFfVkVDX0NUT1JfUkVUVVJOKHgpIHJldHVybgorICAvLyBDb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGRvIG5vdCByZXR1cm4gYSB2YWx1ZS4KKyAgdHlwZWRlZiB2b2lkIF9fY3hhX2NkdG9yX3JldHVybl90eXBlOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgfQorfSAvLyBuYW1lc3BhY2UgX19jeHhhYml2MQorI2VuZGlmCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvZXJyb3JfY29uc3RhbnRzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2Vycm9yX2NvbnN0YW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNmQ4ODkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2Vycm9yX2NvbnN0YW50cy5oCkBAIC0wLDAgKzEsMTc4IEBACisvLyBTcGVjaWZpYyBkZWZpbml0aW9ucyBmb3IgZ2VuZXJpYyBwbGF0Zm9ybXMgIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2Vycm9yX2NvbnN0YW50cy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7c3lzdGVtX2Vycm9yfQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfRVJST1JfQ09OU1RBTlRTCisjZGVmaW5lIF9HTElCQ1hYX0VSUk9SX0NPTlNUQU5UUyAxCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGNlcnJubz4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIGVudW0gY2xhc3MgZXJyYworICAgIHsKKyAgICAgIGFkZHJlc3NfZmFtaWx5X25vdF9zdXBwb3J0ZWQgPSAJCUVBRk5PU1VQUE9SVCwKKyAgICAgIGFkZHJlc3NfaW5fdXNlID0gCQkJCUVBRERSSU5VU0UsCisgICAgICBhZGRyZXNzX25vdF9hdmFpbGFibGUgPSAJCQlFQUREUk5PVEFWQUlMLAorICAgICAgYWxyZWFkeV9jb25uZWN0ZWQgPSAJCQlFSVNDT05OLAorICAgICAgYXJndW1lbnRfbGlzdF90b29fbG9uZyA9IAkJCUUyQklHLAorICAgICAgYXJndW1lbnRfb3V0X29mX2RvbWFpbiA9IAkJCUVET00sCisgICAgICBiYWRfYWRkcmVzcyA9IAkJCQlFRkFVTFQsCisgICAgICBiYWRfZmlsZV9kZXNjcmlwdG9yID0gCQkJRUJBREYsCisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0VCQURNU0cKKyAgICAgIGJhZF9tZXNzYWdlID0gCQkJCUVCQURNU0csCisjZW5kaWYKKworICAgICAgYnJva2VuX3BpcGUgPSAJCQkJRVBJUEUsCisgICAgICBjb25uZWN0aW9uX2Fib3J0ZWQgPSAJCQlFQ09OTkFCT1JURUQsCisgICAgICBjb25uZWN0aW9uX2FscmVhZHlfaW5fcHJvZ3Jlc3MgPSAJCUVBTFJFQURZLAorICAgICAgY29ubmVjdGlvbl9yZWZ1c2VkID0gCQkJRUNPTk5SRUZVU0VELAorICAgICAgY29ubmVjdGlvbl9yZXNldCA9IAkJCUVDT05OUkVTRVQsCisgICAgICBjcm9zc19kZXZpY2VfbGluayA9IAkJCUVYREVWLAorICAgICAgZGVzdGluYXRpb25fYWRkcmVzc19yZXF1aXJlZCA9IAkJRURFU1RBRERSUkVRLAorICAgICAgZGV2aWNlX29yX3Jlc291cmNlX2J1c3kgPSAJCUVCVVNZLAorICAgICAgZGlyZWN0b3J5X25vdF9lbXB0eSA9IAkJCUVOT1RFTVBUWSwKKyAgICAgIGV4ZWN1dGFibGVfZm9ybWF0X2Vycm9yID0gCQlFTk9FWEVDLAorICAgICAgZmlsZV9leGlzdHMgPSAJICAgICAgIAkJCUVFWElTVCwKKyAgICAgIGZpbGVfdG9vX2xhcmdlID0gCQkJCUVGQklHLAorICAgICAgZmlsZW5hbWVfdG9vX2xvbmcgPSAJCQlFTkFNRVRPT0xPTkcsCisgICAgICBmdW5jdGlvbl9ub3Rfc3VwcG9ydGVkID0gCQkJRU5PU1lTLAorICAgICAgaG9zdF91bnJlYWNoYWJsZSA9IAkJCUVIT1NUVU5SRUFDSCwKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRUlEUk0KKyAgICAgIGlkZW50aWZpZXJfcmVtb3ZlZCA9IAkJCUVJRFJNLAorI2VuZGlmCisKKyAgICAgIGlsbGVnYWxfYnl0ZV9zZXF1ZW5jZSA9IAkJCUVJTFNFUSwKKyAgICAgIGluYXBwcm9wcmlhdGVfaW9fY29udHJvbF9vcGVyYXRpb24gPSAJRU5PVFRZLAorICAgICAgaW50ZXJydXB0ZWQgPSAJCQkJRUlOVFIsCisgICAgICBpbnZhbGlkX2FyZ3VtZW50ID0gCQkJRUlOVkFMLAorICAgICAgaW52YWxpZF9zZWVrID0gCQkJCUVTUElQRSwKKyAgICAgIGlvX2Vycm9yID0gCQkJCUVJTywKKyAgICAgIGlzX2FfZGlyZWN0b3J5ID0gCQkJCUVJU0RJUiwKKyAgICAgIG1lc3NhZ2Vfc2l6ZSA9IAkJCQlFTVNHU0laRSwKKyAgICAgIG5ldHdvcmtfZG93biA9IAkJCQlFTkVURE9XTiwKKyAgICAgIG5ldHdvcmtfcmVzZXQgPSAJCQkJRU5FVFJFU0VULAorICAgICAgbmV0d29ya191bnJlYWNoYWJsZSA9IAkJCUVORVRVTlJFQUNILAorICAgICAgbm9fYnVmZmVyX3NwYWNlID0gCQkJRU5PQlVGUywKKyAgICAgIG5vX2NoaWxkX3Byb2Nlc3MgPSAJCQlFQ0hJTEQsCisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0VOT0xJTksKKyAgICAgIG5vX2xpbmsgPSAJCQkJRU5PTElOSywKKyNlbmRpZgorCisgICAgICBub19sb2NrX2F2YWlsYWJsZSA9IAkJCUVOT0xDSywKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRU5PREFUQQorICAgICAgbm9fbWVzc2FnZV9hdmFpbGFibGUgPSAJCQlFTk9EQVRBLCAKKyNlbmRpZgorCisgICAgICBub19tZXNzYWdlID0gCQkJCUVOT01TRywgCisgICAgICBub19wcm90b2NvbF9vcHRpb24gPSAJCQlFTk9QUk9UT09QVCwKKyAgICAgIG5vX3NwYWNlX29uX2RldmljZSA9IAkJCUVOT1NQQywKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRU5PU1IKKyAgICAgIG5vX3N0cmVhbV9yZXNvdXJjZXMgPSAJCQlFTk9TUiwKKyNlbmRpZgorCisgICAgICBub19zdWNoX2RldmljZV9vcl9hZGRyZXNzID0gCQlFTlhJTywKKyAgICAgIG5vX3N1Y2hfZGV2aWNlID0gCQkJCUVOT0RFViwKKyAgICAgIG5vX3N1Y2hfZmlsZV9vcl9kaXJlY3RvcnkgPSAJCUVOT0VOVCwKKyAgICAgIG5vX3N1Y2hfcHJvY2VzcyA9IAkJCUVTUkNILAorICAgICAgbm90X2FfZGlyZWN0b3J5ID0gCQkJRU5PVERJUiwKKyAgICAgIG5vdF9hX3NvY2tldCA9IAkJCQlFTk9UU09DSywKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRU5PU1RSCisgICAgICBub3RfYV9zdHJlYW0gPSAJCQkJRU5PU1RSLAorI2VuZGlmCisKKyAgICAgIG5vdF9jb25uZWN0ZWQgPSAJCQkJRU5PVENPTk4sCisgICAgICBub3RfZW5vdWdoX21lbW9yeSA9IAkJCUVOT01FTSwKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRU5PVFNVUAorICAgICAgbm90X3N1cHBvcnRlZCA9IAkJCQlFTk9UU1VQLAorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0VDQU5DRUxFRAorICAgICAgb3BlcmF0aW9uX2NhbmNlbGVkID0gCQkJRUNBTkNFTEVELAorI2VuZGlmCisKKyAgICAgIG9wZXJhdGlvbl9pbl9wcm9ncmVzcyA9IAkJCUVJTlBST0dSRVNTLAorICAgICAgb3BlcmF0aW9uX25vdF9wZXJtaXR0ZWQgPSAJCUVQRVJNLAorICAgICAgb3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQgPSAJCUVPUE5PVFNVUFAsCisgICAgICBvcGVyYXRpb25fd291bGRfYmxvY2sgPSAJCQlFV09VTERCTE9DSywKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRU9XTkVSREVBRAorICAgICAgb3duZXJfZGVhZCA9IAkJCQlFT1dORVJERUFELAorI2VuZGlmCisKKyAgICAgIHBlcm1pc3Npb25fZGVuaWVkID0gCQkJRUFDQ0VTLAorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FUFJPVE8KKyAgICAgIHByb3RvY29sX2Vycm9yID0gCQkJCUVQUk9UTywKKyNlbmRpZgorCisgICAgICBwcm90b2NvbF9ub3Rfc3VwcG9ydGVkID0gCQkJRVBST1RPTk9TVVBQT1JULAorICAgICAgcmVhZF9vbmx5X2ZpbGVfc3lzdGVtID0gCQkJRVJPRlMsCisgICAgICByZXNvdXJjZV9kZWFkbG9ja193b3VsZF9vY2N1ciA9IAkJRURFQURMSywKKyAgICAgIHJlc291cmNlX3VuYXZhaWxhYmxlX3RyeV9hZ2FpbiA9IAkJRUFHQUlOLAorICAgICAgcmVzdWx0X291dF9vZl9yYW5nZSA9IAkJCUVSQU5HRSwKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRU5PVFJFQ09WRVJBQkxFCisgICAgICBzdGF0ZV9ub3RfcmVjb3ZlcmFibGUgPSAJCQlFTk9UUkVDT1ZFUkFCTEUsCisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRVRJTUUKKyAgICAgIHN0cmVhbV90aW1lb3V0ID0gCQkJCUVUSU1FLAorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0VUWFRCU1kKKyAgICAgIHRleHRfZmlsZV9idXN5ID0gCQkJCUVUWFRCU1ksCisjZW5kaWYKKworICAgICAgdGltZWRfb3V0ID0gCQkJCUVUSU1FRE9VVCwKKyAgICAgIHRvb19tYW55X2ZpbGVzX29wZW5faW5fc3lzdGVtID0gCQlFTkZJTEUsCisgICAgICB0b29fbWFueV9maWxlc19vcGVuID0gCQkJRU1GSUxFLAorICAgICAgdG9vX21hbnlfbGlua3MgPSAJCQkJRU1MSU5LLAorICAgICAgdG9vX21hbnlfc3ltYm9saWNfbGlua19sZXZlbHMgPSAJCUVMT09QLAorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FT1ZFUkZMT1cKKyAgICAgIHZhbHVlX3Rvb19sYXJnZSA9IAkJCUVPVkVSRkxPVywKKyNlbmRpZgorCisgICAgICB3cm9uZ19wcm90b2NvbF90eXBlID0gCQkJRVBST1RPVFlQRQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2V4dGMrKy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9leHRjKysuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGE5ZWZmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9leHRjKysuaApAQCAtMCwwICsxLDcxIEBACisvLyBDKysgaW5jbHVkZXMgdXNlZCBmb3IgcHJlY29tcGlsaW5nIGV4dGVuc2lvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dGMrKy5oCisgKiAgVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBmaWxlIGZvciBhIHByZWNvbXBpbGVkIGhlYWRlci4KKyAqLworCisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisjaW5jbHVkZSA8Yml0cy9zdGR0cjFjKysuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZXh0L2FsZ29yaXRobT4KKyNpbmNsdWRlIDxleHQvYXJyYXlfYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8ZXh0L2F0b21pY2l0eS5oPgorI2luY2x1ZGUgPGV4dC9iaXRtYXBfYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8ZXh0L2Nhc3QuaD4KKyNpbmNsdWRlIDxleHQvY29uY3VycmVuY2UuaD4KKyNpbmNsdWRlIDxleHQvZGVidWdfYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8ZXh0L2V4dHB0cl9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxleHQvZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxleHQvaXRlcmF0b3I+CisjaW5jbHVkZSA8ZXh0L21hbGxvY19hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxleHQvbWVtb3J5PgorI2luY2x1ZGUgPGV4dC9tdF9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxleHQvbmV3X2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGV4dC9udW1lcmljPgorI2luY2x1ZGUgPGV4dC9wb2RfY2hhcl90cmFpdHMuaD4KKyNpbmNsdWRlIDxleHQvcG9pbnRlci5oPgorI2luY2x1ZGUgPGV4dC9wb29sX2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGV4dC9yYl90cmVlPgorI2luY2x1ZGUgPGV4dC9yb3BlPgorI2luY2x1ZGUgPGV4dC9zbGlzdD4KKyNpbmNsdWRlIDxleHQvc3RkaW9fZmlsZWJ1Zi5oPgorI2luY2x1ZGUgPGV4dC9zdGRpb19zeW5jX2ZpbGVidWYuaD4KKyNpbmNsdWRlIDxleHQvdGhyb3dfYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8ZXh0L3R5cGVsaXN0Lmg+CisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8ZXh0L3ZzdHJpbmcuaD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvcHJpb3JpdHlfcXVldWUuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9leGNlcHRpb24uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9oYXNoX3BvbGljeS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2xpc3RfdXBkYXRlX3BvbGljeS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvdHJpZV9wb2xpY3kuaHBwPgorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9JQ09OVgorICNpbmNsdWRlIDxleHQvY29kZWN2dF9zcGVjaWFsaXphdGlvbnMuaD4KKyAjaW5jbHVkZSA8ZXh0L2VuY19maWxlYnVmLmg+CisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvZ3Roci1kZWZhdWx0LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2d0aHItZGVmYXVsdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNzFiMTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2d0aHItZGVmYXVsdC5oCkBAIC0wLDAgKzEsODg5IEBACisvKiBUaHJlYWRzIGNvbXBhdGliaWxpdHkgcm91dGluZXMgZm9yIGxpYmdjYzIgYW5kIGxpYm9iamMuICAqLworLyogQ29tcGlsZSB0aGlzIG9uZSB3aXRoIGdjYy4gICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9HQ0NfR1RIUl9QT1NJWF9ICisjZGVmaW5lIF9HTElCQ1hYX0dDQ19HVEhSX1BPU0lYX0gKKworLyogUE9TSVggdGhyZWFkcyBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAgIEVhc3ksIHNpbmNlIHRoZSBpbnRlcmZhY2UgaXMganVzdCBvbmUtdG8tb25lIG1hcHBpbmcuICAqLworCisjZGVmaW5lIF9fR1RIUkVBRFMgMQorI2RlZmluZSBfX0dUSFJFQURTX0NYWDBYIDEKKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2lmICgoZGVmaW5lZChfTElCT0JKQykgfHwgZGVmaW5lZChfTElCT0JKQ19XRUFLKSkgXAorICAgICB8fCAhZGVmaW5lZChfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLKSkKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGlmIGRlZmluZWQoX1BPU0lYX1RJTUVPVVRTKSAmJiBfUE9TSVhfVElNRU9VVFMgPj0gMAorIyAgZGVmaW5lIF9HVEhSRUFEX1VTRV9NVVRFWF9USU1FRExPQ0sgMQorIyBlbHNlCisjICBkZWZpbmUgX0dUSFJFQURfVVNFX01VVEVYX1RJTUVETE9DSyAwCisjIGVuZGlmCisjZW5kaWYKKwordHlwZWRlZiBwdGhyZWFkX3QgX19ndGhyZWFkX3Q7Cit0eXBlZGVmIHB0aHJlYWRfa2V5X3QgX19ndGhyZWFkX2tleV90OwordHlwZWRlZiBwdGhyZWFkX29uY2VfdCBfX2d0aHJlYWRfb25jZV90OwordHlwZWRlZiBwdGhyZWFkX211dGV4X3QgX19ndGhyZWFkX211dGV4X3Q7Cit0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3Q7Cit0eXBlZGVmIHB0aHJlYWRfY29uZF90IF9fZ3RocmVhZF9jb25kX3Q7Cit0eXBlZGVmIHN0cnVjdCB0aW1lc3BlYyBfX2d0aHJlYWRfdGltZV90OworCisvKiBQT1NJWCBsaWtlIGNvbmRpdGlvbmFsIHZhcmlhYmxlcyBhcmUgc3VwcG9ydGVkLiAgUGxlYXNlIGxvb2sgYXQgY29tbWVudHMKKyAgIGluIGd0aHIuaCBmb3IgZGV0YWlscy4gKi8KKyNkZWZpbmUgX19HVEhSRUFEX0hBU19DT05ECTEKKworI2RlZmluZSBfX0dUSFJFQURfTVVURVhfSU5JVCBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSCisjZGVmaW5lIF9fR1RIUkVBRF9NVVRFWF9JTklUX0ZVTkNUSU9OIF9fZ3RocmVhZF9tdXRleF9pbml0X2Z1bmN0aW9uCisjZGVmaW5lIF9fR1RIUkVBRF9PTkNFX0lOSVQgUFRIUkVBRF9PTkNFX0lOSVQKKyNpZiBkZWZpbmVkKFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSKQorI2RlZmluZSBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVQgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVIKKyNlbGlmIGRlZmluZWQoUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlApCisjZGVmaW5lIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVCBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUAorI2Vsc2UKKyNkZWZpbmUgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkNUSU9OIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfaW5pdF9mdW5jdGlvbgorI2VuZGlmCisjZGVmaW5lIF9fR1RIUkVBRF9DT05EX0lOSVQgUFRIUkVBRF9DT05EX0lOSVRJQUxJWkVSCisjZGVmaW5lIF9fR1RIUkVBRF9USU1FX0lOSVQgezAsMH0KKworI2lmZGVmIF9HVEhSRUFEX1VTRV9NVVRFWF9JTklUX0ZVTkMKKyMgdW5kZWYgX19HVEhSRUFEX01VVEVYX0lOSVQKKyNlbmRpZgorI2lmZGVmIF9HVEhSRUFEX1VTRV9SRUNVUlNJVkVfTVVURVhfSU5JVF9GVU5DCisjIHVuZGVmIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVAorIyB1bmRlZiBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRfRlVOQ1RJT04KKyMgZGVmaW5lIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVF9GVU5DVElPTiBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2luaXRfZnVuY3Rpb24KKyNlbmRpZgorI2lmZGVmIF9HVEhSRUFEX1VTRV9DT05EX0lOSVRfRlVOQworIyB1bmRlZiBfX0dUSFJFQURfQ09ORF9JTklUCisjIGRlZmluZSBfX0dUSFJFQURfQ09ORF9JTklUX0ZVTkNUSU9OIF9fZ3RocmVhZF9jb25kX2luaXRfZnVuY3Rpb24KKyNlbmRpZgorCisjaWYgX19HWFhfV0VBS19fICYmIF9HTElCQ1hYX0dUSFJFQURfVVNFX1dFQUsKKyMgaWZuZGVmIF9fZ3RocndfcHJhZ21hCisjICBkZWZpbmUgX19ndGhyd19wcmFnbWEocHJhZ21hKQorIyBlbmRpZgorIyBkZWZpbmUgX19ndGhydzIobmFtZSxuYW1lMix0eXBlKSBcCisgIHN0YXRpYyBfX3R5cGVvZih0eXBlKSBuYW1lIF9fYXR0cmlidXRlX18gKChfX3dlYWtyZWZfXygjbmFtZTIpKSk7IFwKKyAgX19ndGhyd19wcmFnbWEod2VhayB0eXBlKQorIyBkZWZpbmUgX19ndGhyd18obmFtZSkgX19ndGhyd18gIyMgbmFtZQorI2Vsc2UKKyMgZGVmaW5lIF9fZ3RocncyKG5hbWUsbmFtZTIsdHlwZSkKKyMgZGVmaW5lIF9fZ3RocndfKG5hbWUpIG5hbWUKKyNlbmRpZgorCisvKiBUeXBpY2FsbHksIF9fZ3RocndfZm9vIGlzIGEgd2VhayByZWZlcmVuY2UgdG8gc3ltYm9sIGZvby4gICovCisjZGVmaW5lIF9fZ3RocncobmFtZSkgX19ndGhydzIoX19ndGhyd18gIyMgbmFtZSxuYW1lLG5hbWUpCisKK19fZ3RocncocHRocmVhZF9vbmNlKQorX19ndGhydyhwdGhyZWFkX2dldHNwZWNpZmljKQorX19ndGhydyhwdGhyZWFkX3NldHNwZWNpZmljKQorCitfX2d0aHJ3KHB0aHJlYWRfY3JlYXRlKQorX19ndGhydyhwdGhyZWFkX2pvaW4pCitfX2d0aHJ3KHB0aHJlYWRfZXF1YWwpCitfX2d0aHJ3KHB0aHJlYWRfc2VsZikKK19fZ3RocncocHRocmVhZF9kZXRhY2gpCisjaWZuZGVmIF9fQklPTklDX18KK19fZ3RocncocHRocmVhZF9jYW5jZWwpCisjZW5kaWYKK19fZ3Rocncoc2NoZWRfeWllbGQpCisKK19fZ3RocncocHRocmVhZF9tdXRleF9sb2NrKQorX19ndGhydyhwdGhyZWFkX211dGV4X3RyeWxvY2spCisjaWYgX0dUSFJFQURfVVNFX01VVEVYX1RJTUVETE9DSworX19ndGhydyhwdGhyZWFkX211dGV4X3RpbWVkbG9jaykKKyNlbmRpZgorX19ndGhydyhwdGhyZWFkX211dGV4X3VubG9jaykKK19fZ3RocncocHRocmVhZF9tdXRleF9pbml0KQorX19ndGhydyhwdGhyZWFkX211dGV4X2Rlc3Ryb3kpCisKK19fZ3RocncocHRocmVhZF9jb25kX2luaXQpCitfX2d0aHJ3KHB0aHJlYWRfY29uZF9icm9hZGNhc3QpCitfX2d0aHJ3KHB0aHJlYWRfY29uZF9zaWduYWwpCitfX2d0aHJ3KHB0aHJlYWRfY29uZF93YWl0KQorX19ndGhydyhwdGhyZWFkX2NvbmRfdGltZWR3YWl0KQorX19ndGhydyhwdGhyZWFkX2NvbmRfZGVzdHJveSkKKworX19ndGhydyhwdGhyZWFkX2tleV9jcmVhdGUpCitfX2d0aHJ3KHB0aHJlYWRfa2V5X2RlbGV0ZSkKK19fZ3RocncocHRocmVhZF9tdXRleGF0dHJfaW5pdCkKK19fZ3RocncocHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSkKK19fZ3RocncocHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSkKKworCisjaWYgZGVmaW5lZChfTElCT0JKQykgfHwgZGVmaW5lZChfTElCT0JKQ19XRUFLKQorLyogT2JqZWN0aXZlLUMuICAqLworX19ndGhydyhwdGhyZWFkX2V4aXQpCisjaWZkZWYgX1BPU0lYX1BSSU9SSVRZX1NDSEVEVUxJTkcKKyNpZmRlZiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcKK19fZ3Rocncoc2NoZWRfZ2V0X3ByaW9yaXR5X21heCkKK19fZ3Rocncoc2NoZWRfZ2V0X3ByaW9yaXR5X21pbikKKyNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KKyNlbmRpZiAvKiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORyAqLworX19ndGhydyhwdGhyZWFkX2F0dHJfZGVzdHJveSkKK19fZ3RocncocHRocmVhZF9hdHRyX2luaXQpCitfX2d0aHJ3KHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSkKKyNpZmRlZiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcKK19fZ3RocncocHRocmVhZF9nZXRzY2hlZHBhcmFtKQorX19ndGhydyhwdGhyZWFkX3NldHNjaGVkcGFyYW0pCisjZW5kaWYgLyogX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HICovCisjZW5kaWYgLyogX0xJQk9CSkMgfHwgX0xJQk9CSkNfV0VBSyAqLworCisjaWYgX19HWFhfV0VBS19fICYmIF9HTElCQ1hYX0dUSFJFQURfVVNFX1dFQUsKKworLyogT24gU29sYXJpcyAyLjYgdXAgdG8gOSwgdGhlIGxpYmMgZXhwb3NlcyBhIFBPU0lYIHRocmVhZHMgaW50ZXJmYWNlIGV2ZW4gaWYKKyAgIC1wdGhyZWFkcyBpcyBub3Qgc3BlY2lmaWVkLiAgVGhlIGZ1bmN0aW9ucyBhcmUgZHVtbWllcyBhbmQgbW9zdCByZXR1cm4gYW4KKyAgIGVycm9yIHZhbHVlLiAgSG93ZXZlciBwdGhyZWFkX29uY2UgcmV0dXJucyAwIHdpdGhvdXQgaW52b2tpbmcgdGhlIHJvdXRpbmUKKyAgIGl0IGlzIHBhc3NlZCBzbyB3ZSBjYW5ub3QgcHJldGVuZCB0aGF0IHRoZSBpbnRlcmZhY2UgaXMgYWN0aXZlIGlmIC1wdGhyZWFkcworICAgaXMgbm90IHNwZWNpZmllZC4gIE9uIFNvbGFyaXMgMi41LjEsIHRoZSBpbnRlcmZhY2UgaXMgbm90IGV4cG9zZWQgYXQgYWxsIHNvCisgICB3ZSBuZWVkIHRvIHBsYXkgdGhlIHVzdWFsIGdhbWUgd2l0aCB3ZWFrIHN5bWJvbHMuICBPbiBTb2xhcmlzIDEwIGFuZCB1cCwgYQorICAgd29ya2luZyBpbnRlcmZhY2UgaXMgYWx3YXlzIGV4cG9zZWQuICBPbiBGcmVlQlNEIDYgYW5kIGxhdGVyLCBsaWJjIGFsc28KKyAgIGV4cG9zZXMgYSBkdW1teSBQT1NJWCB0aHJlYWRzIGludGVyZmFjZSwgc2ltaWxhciB0byB3aGF0IFNvbGFyaXMgMi42IHVwCisgICB0byA5IGRvZXMuICBGcmVlQlNEID49IDcwMDAxNCBldmVuIHByb3ZpZGVzIGEgcHRocmVhZF9jYW5jZWwgc3R1YiBpbiBsaWJjLAorICAgd2hpY2ggbWVhbnMgdGhlIGFsdGVybmF0ZSBfX2d0aHJlYWRfYWN0aXZlX3AgYmVsb3cgY2Fubm90IGJlIHVzZWQgdGhlcmUuICAqLworCisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgKGRlZmluZWQoX19zdW4pICYmIGRlZmluZWQoX19zdnI0X18pKQorCitzdGF0aWMgdm9sYXRpbGUgaW50IF9fZ3RocmVhZF9hY3RpdmUgPSAtMTsKKworc3RhdGljIHZvaWQKK19fZ3RocmVhZF90cmlnZ2VyICh2b2lkKQoreworICBfX2d0aHJlYWRfYWN0aXZlID0gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9hY3RpdmVfcCAodm9pZCkKK3sKKyAgc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBfX2d0aHJlYWRfYWN0aXZlX211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKyAgc3RhdGljIHB0aHJlYWRfb25jZV90IF9fZ3RocmVhZF9hY3RpdmVfb25jZSA9IFBUSFJFQURfT05DRV9JTklUOworCisgIC8qIEF2b2lkIHJlYWRpbmcgX19ndGhyZWFkX2FjdGl2ZSB0d2ljZSBvbiB0aGUgbWFpbiBjb2RlIHBhdGguICAqLworICBpbnQgX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgPSBfX2d0aHJlYWRfYWN0aXZlOworCisgIC8qIFRoaXMgdGVzdCBpcyBub3QgcHJvdGVjdGVkIHRvIGF2b2lkIHRha2luZyBhIGxvY2sgb24gdGhlIG1haW4gY29kZQorICAgICBwYXRoIHNvIGV2ZXJ5IHVwZGF0ZSBvZiBfX2d0aHJlYWRfYWN0aXZlIGluIGEgdGhyZWFkZWQgcHJvZ3JhbSBtdXN0CisgICAgIGJlIGF0b21pYyB3aXRoIHJlZ2FyZCB0byB0aGUgcmVzdWx0IG9mIHRoZSB0ZXN0LiAgKi8KKyAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlIDwgMCwgMCkpCisgICAgeworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfb25jZSkpCisJeworCSAgLyogSWYgdGhpcyByZWFsbHkgaXMgYSB0aHJlYWRlZCBwcm9ncmFtLCB0aGVuIHdlIG11c3QgZW5zdXJlIHRoYXQKKwkgICAgIF9fZ3RocmVhZF9hY3RpdmUgaGFzIGJlZW4gc2V0IHRvIDEgYmVmb3JlIGV4aXRpbmcgdGhpcyBibG9jay4gICovCisJICBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2xvY2spICgmX19ndGhyZWFkX2FjdGl2ZV9tdXRleCk7CisJICBfX2d0aHJ3XyhwdGhyZWFkX29uY2UpICgmX19ndGhyZWFkX2FjdGl2ZV9vbmNlLCBfX2d0aHJlYWRfdHJpZ2dlcik7CisJICBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X3VubG9jaykgKCZfX2d0aHJlYWRfYWN0aXZlX211dGV4KTsKKwl9CisKKyAgICAgIC8qIE1ha2Ugc3VyZSB3ZSdsbCBuZXZlciBlbnRlciB0aGlzIGJsb2NrIGFnYWluLiAgKi8KKyAgICAgIGlmIChfX2d0aHJlYWRfYWN0aXZlIDwgMCkKKwlfX2d0aHJlYWRfYWN0aXZlID0gMDsKKworICAgICAgX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgPSBfX2d0aHJlYWRfYWN0aXZlOworICAgIH0KKworICByZXR1cm4gX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgIT0gMDsKK30KKworI2Vsc2UgLyogbmVpdGhlciBGcmVlQlNEIG5vciBTb2xhcmlzICovCisKKy8qIEZvciBhIHByb2dyYW0gdG8gYmUgbXVsdGktdGhyZWFkZWQgdGhlIG9ubHkgdGhpbmcgdGhhdCBpdCBjZXJ0YWlubHkgbXVzdAorICAgYmUgdXNpbmcgaXMgcHRocmVhZF9jcmVhdGUuICBIb3dldmVyLCB0aGVyZSBtYXkgYmUgb3RoZXIgbGlicmFyaWVzIHRoYXQKKyAgIGludGVyY2VwdCBwdGhyZWFkX2NyZWF0ZSB3aXRoIHRoZWlyIG93biBkZWZpbml0aW9ucyB0byB3cmFwIHB0aHJlYWRzCisgICBmdW5jdGlvbmFsaXR5IGZvciBzb21lIHB1cnBvc2UuICBJbiB0aG9zZSBjYXNlcywgcHRocmVhZF9jcmVhdGUgYmVpbmcKKyAgIGRlZmluZWQgbWlnaHQgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCBsaWJwdGhyZWFkIGlzIGFjdHVhbGx5IGxpbmtlZAorICAgaW4uCisKKyAgIEZvciB0aGUgR05VIEMgbGlicmFyeSwgd2UgY2FuIHVzZSBhIGtub3duIGludGVybmFsIG5hbWUuICBUaGlzIGlzIGFsd2F5cworICAgYXZhaWxhYmxlIGluIHRoZSBBQkksIGJ1dCBubyBvdGhlciBsaWJyYXJ5IHdvdWxkIGRlZmluZSBpdC4gIFRoYXQgaXMKKyAgIGlkZWFsLCBzaW5jZSBhbnkgcHVibGljIHB0aHJlYWQgZnVuY3Rpb24gbWlnaHQgYmUgaW50ZXJjZXB0ZWQganVzdCBhcworICAgcHRocmVhZF9jcmVhdGUgbWlnaHQgYmUuICBfX3B0aHJlYWRfa2V5X2NyZWF0ZSBpcyBhbiAiaW50ZXJuYWwiCisgICBpbXBsZW1lbnRhdGlvbiBzeW1ib2wsIGJ1dCBpdCBpcyBwYXJ0IG9mIHRoZSBwdWJsaWMgZXhwb3J0ZWQgQUJJLiAgQWxzbywKKyAgIGl0J3MgYW1vbmcgdGhlIHN5bWJvbHMgdGhhdCB0aGUgc3RhdGljIGxpYnB0aHJlYWQuYSBhbHdheXMgbGlua3MgaW4KKyAgIHdoZW5ldmVyIHB0aHJlYWRfY3JlYXRlIGlzIHVzZWQsIHNvIHRoZXJlIGlzIG5vIGRhbmdlciBvZiBhIGZhbHNlCisgICBuZWdhdGl2ZSByZXN1bHQgaW4gYW55IHN0YXRpY2FsbHktbGlua2VkLCBtdWx0aS10aHJlYWRlZCBwcm9ncmFtLgorCisgICBGb3Igb3RoZXJzLCB3ZSBjaG9vc2UgcHRocmVhZF9jYW5jZWwgYXMgYSBmdW5jdGlvbiB0aGF0IHNlZW1zIHVubGlrZWx5CisgICB0byBiZSByZWRlZmluZWQgYnkgYW4gaW50ZXJjZXB0b3IgbGlicmFyeS4gIFRoZSBiaW9uaWMgKEFuZHJvaWQpIEMKKyAgIGxpYnJhcnkgZG9lcyBub3QgcHJvdmlkZSBwdGhyZWFkX2NhbmNlbCwgc28gd2UgZG8gdXNlIHB0aHJlYWRfY3JlYXRlCisgICB0aGVyZSAoYW5kIGludGVyY2VwdG9yIGxpYnJhcmllcyBsb3NlKS4gICovCisKKyNpZmRlZiBfX0dMSUJDX18KK19fZ3RocncyKF9fZ3RocndfKF9fcHRocmVhZF9rZXlfY3JlYXRlKSwKKwkgX19wdGhyZWFkX2tleV9jcmVhdGUsCisJIHB0aHJlYWRfa2V5X2NyZWF0ZSkKKyMgZGVmaW5lIEdUSFJfQUNUSVZFX1BST1hZCV9fZ3RocndfKF9fcHRocmVhZF9rZXlfY3JlYXRlKQorI2VsaWYgZGVmaW5lZCAoX19CSU9OSUNfXykKKyMgZGVmaW5lIEdUSFJfQUNUSVZFX1BST1hZCV9fZ3RocndfKHB0aHJlYWRfY3JlYXRlKQorI2Vsc2UKKyMgZGVmaW5lIEdUSFJfQUNUSVZFX1BST1hZCV9fZ3RocndfKHB0aHJlYWRfY2FuY2VsKQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfYWN0aXZlX3AgKHZvaWQpCit7CisgIHN0YXRpYyB2b2lkICpjb25zdCBfX2d0aHJlYWRfYWN0aXZlX3B0cgorICAgID0gX19leHRlbnNpb25fXyAodm9pZCAqKSAmR1RIUl9BQ1RJVkVfUFJPWFk7CisgIHJldHVybiBfX2d0aHJlYWRfYWN0aXZlX3B0ciAhPSAwOworfQorCisjZW5kaWYgLyogRnJlZUJTRCBvciBTb2xhcmlzICovCisKKyNlbHNlIC8qIG5vdCBfX0dYWF9XRUFLX18gKi8KKworLyogU2ltaWxhciB0byBTb2xhcmlzLCBIUC1VWCAxMSBmb3IgUEEtUklTQyBwcm92aWRlcyBzdHVicyBmb3IgcHRocmVhZAorICAgY2FsbHMgaW4gc2hhcmVkIGZsYXZvcnMgb2YgdGhlIEhQLVVYIEMgbGlicmFyeS4gIE1vc3Qgb2YgdGhlIHN0dWJzCisgICBoYXZlIG5vIGZ1bmN0aW9uYWxpdHkuICBUaGUgZGV0YWlscyBhcmUgZGVzY3JpYmVkIGluIHRoZSAibGliYyBjdW11bGF0aXZlCisgICBwYXRjaCIgZm9yIGVhY2ggc3VidmVyc2lvbiBvZiBIUC1VWCAxMS4gIFRoZXJlIGFyZSB0d28gc3BlY2lhbCBpbnRlcmZhY2VzCisgICBwcm92aWRlZCBmb3IgY2hlY2tpbmcgd2hldGhlciBhbiBhcHBsaWNhdGlvbiBpcyBsaW5rZWQgdG8gYSBzaGFyZWQgcHRocmVhZAorICAgbGlicmFyeSBvciBub3QuICBIb3dldmVyLCB0aGVzZSBpbnRlcmZhY2VzIGFyZW4ndCBhdmFpbGFibGUgaW4gZWFybHkKKyAgIGxpYnB0aHJlYWQgbGlicmFyaWVzLiAgV2UgYWxzbyBuZWVkIGEgdGVzdCB0aGF0IHdvcmtzIGZvciBhcmNoaXZlCisgICBsaWJyYXJpZXMuICBXZSBjYW4ndCB1c2UgcHRocmVhZF9vbmNlIGFzIHNvbWUgbGliYyB2ZXJzaW9ucyBjYWxsIHRoZQorICAgaW5pdCBmdW5jdGlvbi4gIFdlIGFsc28gY2FuJ3QgdXNlIHB0aHJlYWRfY3JlYXRlIG9yIHB0aHJlYWRfYXR0cl9pbml0CisgICBhcyB0aGVzZSBjcmVhdGUgYSB0aHJlYWQgYW5kIHRoZXJlYnkgcHJldmVudCBjaGFuZ2luZyB0aGUgZGVmYXVsdCBzdGFjaworICAgc2l6ZS4gIFRoZSBmdW5jdGlvbiBwdGhyZWFkX2RlZmF1bHRfc3RhY2tzaXplX25wIGlzIGF2YWlsYWJsZSBpbiBib3RoCisgICB0aGUgYXJjaGl2ZSBhbmQgc2hhcmVkIHZlcnNpb25zIG9mIGxpYnB0aHJlYWQuICAgSXQgY2FuIGJlIHVzZWQgdG8KKyAgIGRldGVybWluZSB0aGUgZGVmYXVsdCBwdGhyZWFkIHN0YWNrIHNpemUuICBUaGVyZSBpcyBhIHN0dWIgaW4gc29tZQorICAgc2hhcmVkIGxpYmMgdmVyc2lvbnMgd2hpY2ggcmV0dXJucyBhIHplcm8gc2l6ZSBpZiBwdGhyZWFkcyBhcmUgbm90CisgICBhY3RpdmUuICBXZSBwcm92aWRlIGFuIGVxdWl2YWxlbnQgc3R1YiB0byBoYW5kbGUgY2FzZXMgd2hlcmUgbGliYworICAgZG9lc24ndCBwcm92aWRlIG9uZS4gICovCisKKyNpZiBkZWZpbmVkKF9faHBwYV9fKSAmJiBkZWZpbmVkKF9faHB1eF9fKQorCitzdGF0aWMgdm9sYXRpbGUgaW50IF9fZ3RocmVhZF9hY3RpdmUgPSAtMTsKKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9hY3RpdmVfcCAodm9pZCkKK3sKKyAgLyogQXZvaWQgcmVhZGluZyBfX2d0aHJlYWRfYWN0aXZlIHR3aWNlIG9uIHRoZSBtYWluIGNvZGUgcGF0aC4gICovCisgIGludCBfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSA9IF9fZ3RocmVhZF9hY3RpdmU7CisgIHNpemVfdCBfX3M7CisKKyAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlIDwgMCwgMCkpCisgICAgeworICAgICAgcHRocmVhZF9kZWZhdWx0X3N0YWNrc2l6ZV9ucCAoMCwgJl9fcyk7CisgICAgICBfX2d0aHJlYWRfYWN0aXZlID0gX19zID8gMSA6IDA7CisgICAgICBfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSA9IF9fZ3RocmVhZF9hY3RpdmU7CisgICAgfQorCisgIHJldHVybiBfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSAhPSAwOworfQorCisjZWxzZSAvKiBub3QgaHBwYS1ocHV4ICovCisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfYWN0aXZlX3AgKHZvaWQpCit7CisgIHJldHVybiAxOworfQorCisjZW5kaWYgLyogaHBwYS1ocHV4ICovCisKKyNlbmRpZiAvKiBfX0dYWF9XRUFLX18gKi8KKworI2lmZGVmIF9MSUJPQkpDCisKKy8qIFRoaXMgaXMgdGhlIGNvbmZpZy5oIGZpbGUgaW4gbGlib2JqYy8gKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2lmZGVmIEhBVkVfU0NIRURfSAorIyBpbmNsdWRlIDxzY2hlZC5oPgorI2VuZGlmCisKKy8qIEtleSBzdHJ1Y3R1cmUgZm9yIG1haW50YWluaW5nIHRocmVhZCBzcGVjaWZpYyBzdG9yYWdlICovCitzdGF0aWMgcHRocmVhZF9rZXlfdCBfb2JqY190aHJlYWRfc3RvcmFnZTsKK3N0YXRpYyBwdGhyZWFkX2F0dHJfdCBfb2JqY190aHJlYWRfYXR0cmliczsKKworLyogVGhyZWFkIGxvY2FsIHN0b3JhZ2UgZm9yIGEgc2luZ2xlIHRocmVhZCAqLworc3RhdGljIHZvaWQgKnRocmVhZF9sb2NhbF9zdG9yYWdlID0gTlVMTDsKKworLyogQmFja2VuZCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKi8KKworLyogSW5pdGlhbGl6ZSB0aGUgdGhyZWFkcyBzdWJzeXN0ZW0uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2luaXRfdGhyZWFkX3N5c3RlbSAodm9pZCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICB7CisgICAgICAvKiBJbml0aWFsaXplIHRoZSB0aHJlYWQgc3RvcmFnZSBrZXkuICAqLworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfa2V5X2NyZWF0ZSkgKCZfb2JqY190aHJlYWRfc3RvcmFnZSwgTlVMTCkgPT0gMCkKKwl7CisJICAvKiBUaGUgbm9ybWFsIGRlZmF1bHQgZGV0YWNoIHN0YXRlIGZvciB0aHJlYWRzIGlzCisJICAgKiBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSB3aGljaCBjYXVzZXMgdGhyZWFkcyB0byBub3QgZGllCisJICAgKiB3aGVuIHlvdSB0aGluayB0aGV5IHNob3VsZC4gICovCisJICBpZiAoX19ndGhyd18ocHRocmVhZF9hdHRyX2luaXQpICgmX29iamNfdGhyZWFkX2F0dHJpYnMpID09IDAKKwkgICAgICAmJiBfX2d0aHJ3XyhwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUpICgmX29iamNfdGhyZWFkX2F0dHJpYnMsCisJCQkJCSAgICAgIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEKSA9PSAwKQorCSAgICByZXR1cm4gMDsKKwl9CisgICAgfQorCisgIHJldHVybiAtMTsKK30KKworLyogQ2xvc2UgdGhlIHRocmVhZHMgc3Vic3lzdGVtLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jbG9zZV90aHJlYWRfc3lzdGVtICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpCisgICAgICAmJiBfX2d0aHJ3XyhwdGhyZWFkX2tleV9kZWxldGUpIChfb2JqY190aHJlYWRfc3RvcmFnZSkgPT0gMAorICAgICAgJiYgX19ndGhyd18ocHRocmVhZF9hdHRyX2Rlc3Ryb3kpICgmX29iamNfdGhyZWFkX2F0dHJpYnMpID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIC0xOworfQorCisvKiBCYWNrZW5kIHRocmVhZCBmdW5jdGlvbnMgKi8KKworLyogQ3JlYXRlIGEgbmV3IHRocmVhZCBvZiBleGVjdXRpb24uICAqLworc3RhdGljIGlubGluZSBvYmpjX3RocmVhZF90CitfX2d0aHJlYWRfb2JqY190aHJlYWRfZGV0YWNoICh2b2lkICgqZnVuYykodm9pZCAqKSwgdm9pZCAqYXJnKQoreworICBvYmpjX3RocmVhZF90IHRocmVhZF9pZDsKKyAgcHRocmVhZF90IG5ld190aHJlYWRfaGFuZGxlOworCisgIGlmICghX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghKF9fZ3RocndfKHB0aHJlYWRfY3JlYXRlKSAoJm5ld190aHJlYWRfaGFuZGxlLCAmX29iamNfdGhyZWFkX2F0dHJpYnMsCisJCQkJICAodm9pZCAqKSBmdW5jLCBhcmcpKSkKKyAgICB0aHJlYWRfaWQgPSAob2JqY190aHJlYWRfdCkgbmV3X3RocmVhZF9oYW5kbGU7CisgIGVsc2UKKyAgICB0aHJlYWRfaWQgPSBOVUxMOworCisgIHJldHVybiB0aHJlYWRfaWQ7Cit9CisKKy8qIFNldCB0aGUgY3VycmVudCB0aHJlYWQncyBwcmlvcml0eS4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfdGhyZWFkX3NldF9wcmlvcml0eSAoaW50IHByaW9yaXR5KQoreworICBpZiAoIV9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gLTE7CisgIGVsc2UKKyAgICB7CisjaWZkZWYgX1BPU0lYX1BSSU9SSVRZX1NDSEVEVUxJTkcKKyNpZmRlZiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcKKyAgICAgIHB0aHJlYWRfdCB0aHJlYWRfaWQgPSBfX2d0aHJ3XyhwdGhyZWFkX3NlbGYpICgpOworICAgICAgaW50IHBvbGljeTsKKyAgICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbXM7CisgICAgICBpbnQgcHJpb3JpdHlfbWluLCBwcmlvcml0eV9tYXg7CisKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX2dldHNjaGVkcGFyYW0pICh0aHJlYWRfaWQsICZwb2xpY3ksICZwYXJhbXMpID09IDApCisJeworCSAgaWYgKChwcmlvcml0eV9tYXggPSBfX2d0aHJ3XyhzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KSAocG9saWN5KSkgPT0gLTEpCisJICAgIHJldHVybiAtMTsKKworCSAgaWYgKChwcmlvcml0eV9taW4gPSBfX2d0aHJ3XyhzY2hlZF9nZXRfcHJpb3JpdHlfbWluKSAocG9saWN5KSkgPT0gLTEpCisJICAgIHJldHVybiAtMTsKKworCSAgaWYgKHByaW9yaXR5ID4gcHJpb3JpdHlfbWF4KQorCSAgICBwcmlvcml0eSA9IHByaW9yaXR5X21heDsKKwkgIGVsc2UgaWYgKHByaW9yaXR5IDwgcHJpb3JpdHlfbWluKQorCSAgICBwcmlvcml0eSA9IHByaW9yaXR5X21pbjsKKwkgIHBhcmFtcy5zY2hlZF9wcmlvcml0eSA9IHByaW9yaXR5OworCisJICAvKgorCSAgICogVGhlIHNvbGFyaXMgNyBhbmQgc2V2ZXJhbCBvdGhlciBtYW4gcGFnZXMgaW5jb3JyZWN0bHkgc3RhdGUgdGhhdAorCSAgICogdGhpcyBzaG91bGQgYmUgYSBwb2ludGVyIHRvIHBvbGljeSBidXQgcHRocmVhZC5oIGlzIHVuaXZlcnNhbGx5CisJICAgKiBhdCBvZGRzIHdpdGggdGhpcy4KKwkgICAqLworCSAgaWYgKF9fZ3RocndfKHB0aHJlYWRfc2V0c2NoZWRwYXJhbSkgKHRocmVhZF9pZCwgcG9saWN5LCAmcGFyYW1zKSA9PSAwKQorCSAgICByZXR1cm4gMDsKKwl9CisjZW5kaWYgLyogX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HICovCisjZW5kaWYgLyogX1BPU0lYX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KKyAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKKy8qIFJldHVybiB0aGUgY3VycmVudCB0aHJlYWQncyBwcmlvcml0eS4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfdGhyZWFkX2dldF9wcmlvcml0eSAodm9pZCkKK3sKKyNpZmRlZiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORworI2lmZGVmIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIGludCBwb2xpY3k7CisgICAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW1zOworCisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9nZXRzY2hlZHBhcmFtKSAoX19ndGhyd18ocHRocmVhZF9zZWxmKSAoKSwgJnBvbGljeSwgJnBhcmFtcykgPT0gMCkKKwlyZXR1cm4gcGFyYW1zLnNjaGVkX3ByaW9yaXR5OworICAgICAgZWxzZQorCXJldHVybiAtMTsKKyAgICB9CisgIGVsc2UKKyNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KKyNlbmRpZiAvKiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORyAqLworICAgIHJldHVybiBPQkpDX1RIUkVBRF9JTlRFUkFDVElWRV9QUklPUklUWTsKK30KKworLyogWWllbGQgb3VyIHByb2Nlc3MgdGltZSB0byBhbm90aGVyIHRocmVhZC4gICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19fZ3RocmVhZF9vYmpjX3RocmVhZF95aWVsZCAodm9pZCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICBfX2d0aHJ3XyhzY2hlZF95aWVsZCkgKCk7Cit9CisKKy8qIFRlcm1pbmF0ZSB0aGUgY3VycmVudCB0aHJlYWQuICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9leGl0ICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIC8qIGV4aXQgdGhlIHRocmVhZCAqLworICAgIF9fZ3RocndfKHB0aHJlYWRfZXhpdCkgKCZfX29iamNfdGhyZWFkX2V4aXRfc3RhdHVzKTsKKworICAvKiBGYWlsZWQgaWYgd2UgcmVhY2hlZCBoZXJlICovCisgIHJldHVybiAtMTsKK30KKworLyogUmV0dXJucyBhbiBpbnRlZ2VyIHZhbHVlIHdoaWNoIHVuaXF1ZWx5IGRlc2NyaWJlcyBhIHRocmVhZC4gICovCitzdGF0aWMgaW5saW5lIG9iamNfdGhyZWFkX3QKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9pZCAodm9pZCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gKG9iamNfdGhyZWFkX3QpIF9fZ3RocndfKHB0aHJlYWRfc2VsZikgKCk7CisgIGVsc2UKKyAgICByZXR1cm4gKG9iamNfdGhyZWFkX3QpIDE7Cit9CisKKy8qIFNldHMgdGhlIHRocmVhZCdzIGxvY2FsIHN0b3JhZ2UgcG9pbnRlci4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfdGhyZWFkX3NldF9kYXRhICh2b2lkICp2YWx1ZSkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9zZXRzcGVjaWZpYykgKF9vYmpjX3RocmVhZF9zdG9yYWdlLCB2YWx1ZSk7CisgIGVsc2UKKyAgICB7CisgICAgICB0aHJlYWRfbG9jYWxfc3RvcmFnZSA9IHZhbHVlOworICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvKiBSZXR1cm5zIHRoZSB0aHJlYWQncyBsb2NhbCBzdG9yYWdlIHBvaW50ZXIuICAqLworc3RhdGljIGlubGluZSB2b2lkICoKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9nZXRfZGF0YSAodm9pZCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9nZXRzcGVjaWZpYykgKF9vYmpjX3RocmVhZF9zdG9yYWdlKTsKKyAgZWxzZQorICAgIHJldHVybiB0aHJlYWRfbG9jYWxfc3RvcmFnZTsKK30KKworLyogQmFja2VuZCBtdXRleCBmdW5jdGlvbnMgKi8KKworLyogQWxsb2NhdGUgYSBtdXRleC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfYWxsb2NhdGUgKG9iamNfbXV0ZXhfdCBtdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICB7CisgICAgICBtdXRleC0+YmFja2VuZCA9IG9iamNfbWFsbG9jIChzaXplb2YgKHB0aHJlYWRfbXV0ZXhfdCkpOworCisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9tdXRleF9pbml0KSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCwgTlVMTCkpCisJeworCSAgb2JqY19mcmVlIChtdXRleC0+YmFja2VuZCk7CisJICBtdXRleC0+YmFja2VuZCA9IE5VTEw7CisJICByZXR1cm4gLTE7CisJfQorICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogRGVhbGxvY2F0ZSBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF9kZWFsbG9jYXRlIChvYmpjX211dGV4X3QgbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgaW50IGNvdW50OworCisgICAgICAvKgorICAgICAgICogUG9zaXggVGhyZWFkcyBzcGVjaWZpY2FsbHkgcmVxdWlyZSB0aGF0IHRoZSB0aHJlYWQgYmUgdW5sb2NrZWQKKyAgICAgICAqIGZvciBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2Rlc3Ryb3kpIHRvIHdvcmsuCisgICAgICAgKi8KKworICAgICAgZG8KKwl7CisJICBjb3VudCA9IF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCk7CisJICBpZiAoY291bnQgPCAwKQorCSAgICByZXR1cm4gLTE7CisJfQorICAgICAgd2hpbGUgKGNvdW50KTsKKworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSkgKChwdGhyZWFkX211dGV4X3QgKikgbXV0ZXgtPmJhY2tlbmQpKQorCXJldHVybiAtMTsKKworICAgICAgb2JqY19mcmVlIChtdXRleC0+YmFja2VuZCk7CisgICAgICBtdXRleC0+YmFja2VuZCA9IE5VTEw7CisgICAgfQorICByZXR1cm4gMDsKK30KKworLyogR3JhYiBhIGxvY2sgb24gYSBtdXRleC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfbG9jayAob2JqY19tdXRleF90IG11dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpCisgICAgICAmJiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2xvY2spICgocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kKSAhPSAwKQorICAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFRyeSB0byBncmFiIGEgbG9jayBvbiBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF90cnlsb2NrIChvYmpjX211dGV4X3QgbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaykgKChwdGhyZWFkX211dGV4X3QgKikgbXV0ZXgtPmJhY2tlbmQpICE9IDApCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogVW5sb2NrIHRoZSBtdXRleCAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X3VubG9jayAob2JqY19tdXRleF90IG11dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpCisgICAgICAmJiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X3VubG9jaykgKChwdGhyZWFkX211dGV4X3QgKikgbXV0ZXgtPmJhY2tlbmQpICE9IDApCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogQmFja2VuZCBjb25kaXRpb24gbXV0ZXggZnVuY3Rpb25zICovCisKKy8qIEFsbG9jYXRlIGEgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fYWxsb2NhdGUgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIGNvbmRpdGlvbi0+YmFja2VuZCA9IG9iamNfbWFsbG9jIChzaXplb2YgKHB0aHJlYWRfY29uZF90KSk7CisKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfaW5pdCkgKChwdGhyZWFkX2NvbmRfdCAqKSBjb25kaXRpb24tPmJhY2tlbmQsIE5VTEwpKQorCXsKKwkgIG9iamNfZnJlZSAoY29uZGl0aW9uLT5iYWNrZW5kKTsKKwkgIGNvbmRpdGlvbi0+YmFja2VuZCA9IE5VTEw7CisJICByZXR1cm4gLTE7CisJfQorICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogRGVhbGxvY2F0ZSBhIGNvbmRpdGlvbi4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfY29uZGl0aW9uX2RlYWxsb2NhdGUgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfZGVzdHJveSkgKChwdGhyZWFkX2NvbmRfdCAqKSBjb25kaXRpb24tPmJhY2tlbmQpKQorCXJldHVybiAtMTsKKworICAgICAgb2JqY19mcmVlIChjb25kaXRpb24tPmJhY2tlbmQpOworICAgICAgY29uZGl0aW9uLT5iYWNrZW5kID0gTlVMTDsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBXYWl0IG9uIHRoZSBjb25kaXRpb24gKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fd2FpdCAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24sIG9iamNfbXV0ZXhfdCBtdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX3dhaXQpICgocHRocmVhZF9jb25kX3QgKikgY29uZGl0aW9uLT5iYWNrZW5kLAorCQkJICAgICAgKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLyogV2FrZSB1cCBhbGwgdGhyZWFkcyB3YWl0aW5nIG9uIHRoaXMgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fYnJvYWRjYXN0IChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbikKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX2Jyb2FkY2FzdCkgKChwdGhyZWFkX2NvbmRfdCAqKSBjb25kaXRpb24tPmJhY2tlbmQpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFdha2UgdXAgb25lIHRocmVhZCB3YWl0aW5nIG9uIHRoaXMgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fc2lnbmFsIChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbikKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX3NpZ25hbCkgKChwdGhyZWFkX2NvbmRfdCAqKSBjb25kaXRpb24tPmJhY2tlbmQpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbHNlIC8qIF9MSUJPQkpDICovCisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY3JlYXRlIChfX2d0aHJlYWRfdCAqX190aHJlYWRpZCwgdm9pZCAqKCpfX2Z1bmMpICh2b2lkKiksCisJCSAgdm9pZCAqX19hcmdzKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jcmVhdGUpIChfX3RocmVhZGlkLCBOVUxMLCBfX2Z1bmMsIF9fYXJncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfam9pbiAoX19ndGhyZWFkX3QgX190aHJlYWRpZCwgdm9pZCAqKl9fdmFsdWVfcHRyKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9qb2luKSAoX190aHJlYWRpZCwgX192YWx1ZV9wdHIpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2RldGFjaCAoX19ndGhyZWFkX3QgX190aHJlYWRpZCkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfZGV0YWNoKSAoX190aHJlYWRpZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfZXF1YWwgKF9fZ3RocmVhZF90IF9fdDEsIF9fZ3RocmVhZF90IF9fdDIpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2VxdWFsKSAoX190MSwgX190Mik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19ndGhyZWFkX3QKK19fZ3RocmVhZF9zZWxmICh2b2lkKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9zZWxmKSAoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF95aWVsZCAodm9pZCkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHNjaGVkX3lpZWxkKSAoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vbmNlIChfX2d0aHJlYWRfb25jZV90ICpfX29uY2UsIHZvaWQgKCpfX2Z1bmMpICh2b2lkKSkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9vbmNlKSAoX19vbmNlLCBfX2Z1bmMpOworICBlbHNlCisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2tleV9jcmVhdGUgKF9fZ3RocmVhZF9rZXlfdCAqX19rZXksIHZvaWQgKCpfX2R0b3IpICh2b2lkICopKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9rZXlfY3JlYXRlKSAoX19rZXksIF9fZHRvcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfa2V5X2RlbGV0ZSAoX19ndGhyZWFkX2tleV90IF9fa2V5KQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9rZXlfZGVsZXRlKSAoX19rZXkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKgorX19ndGhyZWFkX2dldHNwZWNpZmljIChfX2d0aHJlYWRfa2V5X3QgX19rZXkpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2dldHNwZWNpZmljKSAoX19rZXkpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3NldHNwZWNpZmljIChfX2d0aHJlYWRfa2V5X3QgX19rZXksIGNvbnN0IHZvaWQgKl9fcHRyKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9zZXRzcGVjaWZpYykgKF9fa2V5LCBfX3B0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19ndGhyZWFkX211dGV4X2luaXRfZnVuY3Rpb24gKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfaW5pdCkgKF9fbXV0ZXgsIE5VTEwpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X2Rlc3Ryb3kgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2Rlc3Ryb3kpIChfX211dGV4KTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X2xvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2xvY2spIChfX211dGV4KTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X3RyeWxvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X3RyeWxvY2spIChfX211dGV4KTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisjaWYgX0dUSFJFQURfVVNFX01VVEVYX1RJTUVETE9DSworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF90aW1lZGxvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4LAorCQkJICAgY29uc3QgX19ndGhyZWFkX3RpbWVfdCAqX19hYnNfdGltZW91dCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9tdXRleF90aW1lZGxvY2spIChfX211dGV4LCBfX2Fic190aW1lb3V0KTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfdW5sb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9tdXRleF91bmxvY2spIChfX211dGV4KTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisjaWYgIWRlZmluZWQoIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QKSBcCisgIHx8IGRlZmluZWQoX0dUSFJFQURfVVNFX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkMpCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9pbml0X2Z1bmN0aW9uIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgcHRocmVhZF9tdXRleGF0dHJfdCBfX2F0dHI7CisgICAgICBpbnQgX19yOworCisgICAgICBfX3IgPSBfX2d0aHJ3XyhwdGhyZWFkX211dGV4YXR0cl9pbml0KSAoJl9fYXR0cik7CisgICAgICBpZiAoIV9fcikKKwlfX3IgPSBfX2d0aHJ3XyhwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKSAoJl9fYXR0ciwKKwkJCQkJCSAgIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfaW5pdCkgKF9fbXV0ZXgsICZfX2F0dHIpOworICAgICAgaWYgKCFfX3IpCisJX19yID0gX19ndGhyd18ocHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSkgKCZfX2F0dHIpOworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisgIHJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2xvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF9sb2NrIChfX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdHJ5bG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX211dGV4X3RyeWxvY2sgKF9fbXV0ZXgpOworfQorCisjaWYgX0dUSFJFQURfVVNFX01VVEVYX1RJTUVETE9DSworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdGltZWRsb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgsCisJCQkJICAgICBjb25zdCBfX2d0aHJlYWRfdGltZV90ICpfX2Fic190aW1lb3V0KQoreworICByZXR1cm4gX19ndGhyZWFkX211dGV4X3RpbWVkbG9jayAoX19tdXRleCwgX19hYnNfdGltZW91dCk7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdW5sb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfdW5sb2NrIChfX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfZGVzdHJveSAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX211dGV4X2Rlc3Ryb3kgKF9fbXV0ZXgpOworfQorCisjaWZkZWYgX0dUSFJFQURfVVNFX0NPTkRfSU5JVF9GVU5DCitzdGF0aWMgaW5saW5lIHZvaWQKK19fZ3RocmVhZF9jb25kX2luaXRfZnVuY3Rpb24gKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfaW5pdCkgKF9fY29uZCwgTlVMTCk7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jb25kX2Jyb2FkY2FzdCAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX2Jyb2FkY2FzdCkgKF9fY29uZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF9zaWduYWwgKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfY29uZF9zaWduYWwpIChfX2NvbmQpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NvbmRfd2FpdCAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kLCBfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfY29uZF93YWl0KSAoX19jb25kLCBfX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jb25kX3RpbWVkd2FpdCAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kLCBfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCwKKwkJCSAgY29uc3QgX19ndGhyZWFkX3RpbWVfdCAqX19hYnNfdGltZW91dCkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfY29uZF90aW1lZHdhaXQpIChfX2NvbmQsIF9fbXV0ZXgsIF9fYWJzX3RpbWVvdXQpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NvbmRfd2FpdF9yZWN1cnNpdmUgKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCwKKwkJCSAgICAgICBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfY29uZF93YWl0IChfX2NvbmQsIF9fbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NvbmRfZGVzdHJveSAoX19ndGhyZWFkX2NvbmRfdCogX19jb25kKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX2Rlc3Ryb3kpIChfX2NvbmQpOworfQorCisjZW5kaWYgLyogX0xJQk9CSkMgKi8KKworI2VuZGlmIC8qICEgX0dMSUJDWFhfR0NDX0dUSFJfUE9TSVhfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9ndGhyLXBvc2l4LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2d0aHItcG9zaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTcxYjE4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9ndGhyLXBvc2l4LmgKQEAgLTAsMCArMSw4ODkgQEAKKy8qIFRocmVhZHMgY29tcGF0aWJpbGl0eSByb3V0aW5lcyBmb3IgbGliZ2NjMiBhbmQgbGlib2JqYy4gICovCisvKiBDb21waWxlIHRoaXMgb25lIHdpdGggZ2NjLiAgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1VuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9HTElCQ1hYX0dDQ19HVEhSX1BPU0lYX0gKKyNkZWZpbmUgX0dMSUJDWFhfR0NDX0dUSFJfUE9TSVhfSAorCisvKiBQT1NJWCB0aHJlYWRzIHNwZWNpZmljIGRlZmluaXRpb25zLgorICAgRWFzeSwgc2luY2UgdGhlIGludGVyZmFjZSBpcyBqdXN0IG9uZS10by1vbmUgbWFwcGluZy4gICovCisKKyNkZWZpbmUgX19HVEhSRUFEUyAxCisjZGVmaW5lIF9fR1RIUkVBRFNfQ1hYMFggMQorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaWYgKChkZWZpbmVkKF9MSUJPQkpDKSB8fCBkZWZpbmVkKF9MSUJPQkpDX1dFQUspKSBcCisgICAgIHx8ICFkZWZpbmVkKF9HVEhSRUFEX1VTRV9NVVRFWF9USU1FRExPQ0spKQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaWYgZGVmaW5lZChfUE9TSVhfVElNRU9VVFMpICYmIF9QT1NJWF9USU1FT1VUUyA+PSAwCisjICBkZWZpbmUgX0dUSFJFQURfVVNFX01VVEVYX1RJTUVETE9DSyAxCisjIGVsc2UKKyMgIGRlZmluZSBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLIDAKKyMgZW5kaWYKKyNlbmRpZgorCit0eXBlZGVmIHB0aHJlYWRfdCBfX2d0aHJlYWRfdDsKK3R5cGVkZWYgcHRocmVhZF9rZXlfdCBfX2d0aHJlYWRfa2V5X3Q7Cit0eXBlZGVmIHB0aHJlYWRfb25jZV90IF9fZ3RocmVhZF9vbmNlX3Q7Cit0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCBfX2d0aHJlYWRfbXV0ZXhfdDsKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90IF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdDsKK3R5cGVkZWYgcHRocmVhZF9jb25kX3QgX19ndGhyZWFkX2NvbmRfdDsKK3R5cGVkZWYgc3RydWN0IHRpbWVzcGVjIF9fZ3RocmVhZF90aW1lX3Q7CisKKy8qIFBPU0lYIGxpa2UgY29uZGl0aW9uYWwgdmFyaWFibGVzIGFyZSBzdXBwb3J0ZWQuICBQbGVhc2UgbG9vayBhdCBjb21tZW50cworICAgaW4gZ3Roci5oIGZvciBkZXRhaWxzLiAqLworI2RlZmluZSBfX0dUSFJFQURfSEFTX0NPTkQJMQorCisjZGVmaW5lIF9fR1RIUkVBRF9NVVRFWF9JTklUIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIKKyNkZWZpbmUgX19HVEhSRUFEX01VVEVYX0lOSVRfRlVOQ1RJT04gX19ndGhyZWFkX211dGV4X2luaXRfZnVuY3Rpb24KKyNkZWZpbmUgX19HVEhSRUFEX09OQ0VfSU5JVCBQVEhSRUFEX09OQ0VfSU5JVAorI2lmIGRlZmluZWQoUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVIpCisjZGVmaW5lIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVCBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUgorI2VsaWYgZGVmaW5lZChQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUCkKKyNkZWZpbmUgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QCisjZWxzZQorI2RlZmluZSBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRfRlVOQ1RJT04gX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9pbml0X2Z1bmN0aW9uCisjZW5kaWYKKyNkZWZpbmUgX19HVEhSRUFEX0NPTkRfSU5JVCBQVEhSRUFEX0NPTkRfSU5JVElBTElaRVIKKyNkZWZpbmUgX19HVEhSRUFEX1RJTUVfSU5JVCB7MCwwfQorCisjaWZkZWYgX0dUSFJFQURfVVNFX01VVEVYX0lOSVRfRlVOQworIyB1bmRlZiBfX0dUSFJFQURfTVVURVhfSU5JVAorI2VuZGlmCisjaWZkZWYgX0dUSFJFQURfVVNFX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkMKKyMgdW5kZWYgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUCisjIHVuZGVmIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVF9GVU5DVElPTgorIyBkZWZpbmUgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkNUSU9OIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfaW5pdF9mdW5jdGlvbgorI2VuZGlmCisjaWZkZWYgX0dUSFJFQURfVVNFX0NPTkRfSU5JVF9GVU5DCisjIHVuZGVmIF9fR1RIUkVBRF9DT05EX0lOSVQKKyMgZGVmaW5lIF9fR1RIUkVBRF9DT05EX0lOSVRfRlVOQ1RJT04gX19ndGhyZWFkX2NvbmRfaW5pdF9mdW5jdGlvbgorI2VuZGlmCisKKyNpZiBfX0dYWF9XRUFLX18gJiYgX0dMSUJDWFhfR1RIUkVBRF9VU0VfV0VBSworIyBpZm5kZWYgX19ndGhyd19wcmFnbWEKKyMgIGRlZmluZSBfX2d0aHJ3X3ByYWdtYShwcmFnbWEpCisjIGVuZGlmCisjIGRlZmluZSBfX2d0aHJ3MihuYW1lLG5hbWUyLHR5cGUpIFwKKyAgc3RhdGljIF9fdHlwZW9mKHR5cGUpIG5hbWUgX19hdHRyaWJ1dGVfXyAoKF9fd2Vha3JlZl9fKCNuYW1lMikpKTsgXAorICBfX2d0aHJ3X3ByYWdtYSh3ZWFrIHR5cGUpCisjIGRlZmluZSBfX2d0aHJ3XyhuYW1lKSBfX2d0aHJ3XyAjIyBuYW1lCisjZWxzZQorIyBkZWZpbmUgX19ndGhydzIobmFtZSxuYW1lMix0eXBlKQorIyBkZWZpbmUgX19ndGhyd18obmFtZSkgbmFtZQorI2VuZGlmCisKKy8qIFR5cGljYWxseSwgX19ndGhyd19mb28gaXMgYSB3ZWFrIHJlZmVyZW5jZSB0byBzeW1ib2wgZm9vLiAgKi8KKyNkZWZpbmUgX19ndGhydyhuYW1lKSBfX2d0aHJ3MihfX2d0aHJ3XyAjIyBuYW1lLG5hbWUsbmFtZSkKKworX19ndGhydyhwdGhyZWFkX29uY2UpCitfX2d0aHJ3KHB0aHJlYWRfZ2V0c3BlY2lmaWMpCitfX2d0aHJ3KHB0aHJlYWRfc2V0c3BlY2lmaWMpCisKK19fZ3RocncocHRocmVhZF9jcmVhdGUpCitfX2d0aHJ3KHB0aHJlYWRfam9pbikKK19fZ3RocncocHRocmVhZF9lcXVhbCkKK19fZ3RocncocHRocmVhZF9zZWxmKQorX19ndGhydyhwdGhyZWFkX2RldGFjaCkKKyNpZm5kZWYgX19CSU9OSUNfXworX19ndGhydyhwdGhyZWFkX2NhbmNlbCkKKyNlbmRpZgorX19ndGhydyhzY2hlZF95aWVsZCkKKworX19ndGhydyhwdGhyZWFkX211dGV4X2xvY2spCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaykKKyNpZiBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfdGltZWRsb2NrKQorI2VuZGlmCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfdW5sb2NrKQorX19ndGhydyhwdGhyZWFkX211dGV4X2luaXQpCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfZGVzdHJveSkKKworX19ndGhydyhwdGhyZWFkX2NvbmRfaW5pdCkKK19fZ3RocncocHRocmVhZF9jb25kX2Jyb2FkY2FzdCkKK19fZ3RocncocHRocmVhZF9jb25kX3NpZ25hbCkKK19fZ3RocncocHRocmVhZF9jb25kX3dhaXQpCitfX2d0aHJ3KHB0aHJlYWRfY29uZF90aW1lZHdhaXQpCitfX2d0aHJ3KHB0aHJlYWRfY29uZF9kZXN0cm95KQorCitfX2d0aHJ3KHB0aHJlYWRfa2V5X2NyZWF0ZSkKK19fZ3RocncocHRocmVhZF9rZXlfZGVsZXRlKQorX19ndGhydyhwdGhyZWFkX211dGV4YXR0cl9pbml0KQorX19ndGhydyhwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKQorX19ndGhydyhwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KQorCisKKyNpZiBkZWZpbmVkKF9MSUJPQkpDKSB8fCBkZWZpbmVkKF9MSUJPQkpDX1dFQUspCisvKiBPYmplY3RpdmUtQy4gICovCitfX2d0aHJ3KHB0aHJlYWRfZXhpdCkKKyNpZmRlZiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORworI2lmZGVmIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORworX19ndGhydyhzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KQorX19ndGhydyhzY2hlZF9nZXRfcHJpb3JpdHlfbWluKQorI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyAqLworI2VuZGlmIC8qIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HICovCitfX2d0aHJ3KHB0aHJlYWRfYXR0cl9kZXN0cm95KQorX19ndGhydyhwdGhyZWFkX2F0dHJfaW5pdCkKK19fZ3RocncocHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKQorI2lmZGVmIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORworX19ndGhydyhwdGhyZWFkX2dldHNjaGVkcGFyYW0pCitfX2d0aHJ3KHB0aHJlYWRfc2V0c2NoZWRwYXJhbSkKKyNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KKyNlbmRpZiAvKiBfTElCT0JKQyB8fCBfTElCT0JKQ19XRUFLICovCisKKyNpZiBfX0dYWF9XRUFLX18gJiYgX0dMSUJDWFhfR1RIUkVBRF9VU0VfV0VBSworCisvKiBPbiBTb2xhcmlzIDIuNiB1cCB0byA5LCB0aGUgbGliYyBleHBvc2VzIGEgUE9TSVggdGhyZWFkcyBpbnRlcmZhY2UgZXZlbiBpZgorICAgLXB0aHJlYWRzIGlzIG5vdCBzcGVjaWZpZWQuICBUaGUgZnVuY3Rpb25zIGFyZSBkdW1taWVzIGFuZCBtb3N0IHJldHVybiBhbgorICAgZXJyb3IgdmFsdWUuICBIb3dldmVyIHB0aHJlYWRfb25jZSByZXR1cm5zIDAgd2l0aG91dCBpbnZva2luZyB0aGUgcm91dGluZQorICAgaXQgaXMgcGFzc2VkIHNvIHdlIGNhbm5vdCBwcmV0ZW5kIHRoYXQgdGhlIGludGVyZmFjZSBpcyBhY3RpdmUgaWYgLXB0aHJlYWRzCisgICBpcyBub3Qgc3BlY2lmaWVkLiAgT24gU29sYXJpcyAyLjUuMSwgdGhlIGludGVyZmFjZSBpcyBub3QgZXhwb3NlZCBhdCBhbGwgc28KKyAgIHdlIG5lZWQgdG8gcGxheSB0aGUgdXN1YWwgZ2FtZSB3aXRoIHdlYWsgc3ltYm9scy4gIE9uIFNvbGFyaXMgMTAgYW5kIHVwLCBhCisgICB3b3JraW5nIGludGVyZmFjZSBpcyBhbHdheXMgZXhwb3NlZC4gIE9uIEZyZWVCU0QgNiBhbmQgbGF0ZXIsIGxpYmMgYWxzbworICAgZXhwb3NlcyBhIGR1bW15IFBPU0lYIHRocmVhZHMgaW50ZXJmYWNlLCBzaW1pbGFyIHRvIHdoYXQgU29sYXJpcyAyLjYgdXAKKyAgIHRvIDkgZG9lcy4gIEZyZWVCU0QgPj0gNzAwMDE0IGV2ZW4gcHJvdmlkZXMgYSBwdGhyZWFkX2NhbmNlbCBzdHViIGluIGxpYmMsCisgICB3aGljaCBtZWFucyB0aGUgYWx0ZXJuYXRlIF9fZ3RocmVhZF9hY3RpdmVfcCBiZWxvdyBjYW5ub3QgYmUgdXNlZCB0aGVyZS4gICovCisKKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCAoZGVmaW5lZChfX3N1bikgJiYgZGVmaW5lZChfX3N2cjRfXykpCisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgX19ndGhyZWFkX2FjdGl2ZSA9IC0xOworCitzdGF0aWMgdm9pZAorX19ndGhyZWFkX3RyaWdnZXIgKHZvaWQpCit7CisgIF9fZ3RocmVhZF9hY3RpdmUgPSAxOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2FjdGl2ZV9wICh2b2lkKQoreworICBzdGF0aWMgcHRocmVhZF9tdXRleF90IF9fZ3RocmVhZF9hY3RpdmVfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworICBzdGF0aWMgcHRocmVhZF9vbmNlX3QgX19ndGhyZWFkX2FjdGl2ZV9vbmNlID0gUFRIUkVBRF9PTkNFX0lOSVQ7CisKKyAgLyogQXZvaWQgcmVhZGluZyBfX2d0aHJlYWRfYWN0aXZlIHR3aWNlIG9uIHRoZSBtYWluIGNvZGUgcGF0aC4gICovCisgIGludCBfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSA9IF9fZ3RocmVhZF9hY3RpdmU7CisKKyAgLyogVGhpcyB0ZXN0IGlzIG5vdCBwcm90ZWN0ZWQgdG8gYXZvaWQgdGFraW5nIGEgbG9jayBvbiB0aGUgbWFpbiBjb2RlCisgICAgIHBhdGggc28gZXZlcnkgdXBkYXRlIG9mIF9fZ3RocmVhZF9hY3RpdmUgaW4gYSB0aHJlYWRlZCBwcm9ncmFtIG11c3QKKyAgICAgYmUgYXRvbWljIHdpdGggcmVnYXJkIHRvIHRoZSByZXN1bHQgb2YgdGhlIHRlc3QuICAqLworICBpZiAoX19idWlsdGluX2V4cGVjdCAoX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgPCAwLCAwKSkKKyAgICB7CisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9vbmNlKSkKKwl7CisJICAvKiBJZiB0aGlzIHJlYWxseSBpcyBhIHRocmVhZGVkIHByb2dyYW0sIHRoZW4gd2UgbXVzdCBlbnN1cmUgdGhhdAorCSAgICAgX19ndGhyZWFkX2FjdGl2ZSBoYXMgYmVlbiBzZXQgdG8gMSBiZWZvcmUgZXhpdGluZyB0aGlzIGJsb2NrLiAgKi8KKwkgIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfbG9jaykgKCZfX2d0aHJlYWRfYWN0aXZlX211dGV4KTsKKwkgIF9fZ3RocndfKHB0aHJlYWRfb25jZSkgKCZfX2d0aHJlYWRfYWN0aXZlX29uY2UsIF9fZ3RocmVhZF90cmlnZ2VyKTsKKwkgIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKSAoJl9fZ3RocmVhZF9hY3RpdmVfbXV0ZXgpOworCX0KKworICAgICAgLyogTWFrZSBzdXJlIHdlJ2xsIG5ldmVyIGVudGVyIHRoaXMgYmxvY2sgYWdhaW4uICAqLworICAgICAgaWYgKF9fZ3RocmVhZF9hY3RpdmUgPCAwKQorCV9fZ3RocmVhZF9hY3RpdmUgPSAwOworCisgICAgICBfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSA9IF9fZ3RocmVhZF9hY3RpdmU7CisgICAgfQorCisgIHJldHVybiBfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSAhPSAwOworfQorCisjZWxzZSAvKiBuZWl0aGVyIEZyZWVCU0Qgbm9yIFNvbGFyaXMgKi8KKworLyogRm9yIGEgcHJvZ3JhbSB0byBiZSBtdWx0aS10aHJlYWRlZCB0aGUgb25seSB0aGluZyB0aGF0IGl0IGNlcnRhaW5seSBtdXN0CisgICBiZSB1c2luZyBpcyBwdGhyZWFkX2NyZWF0ZS4gIEhvd2V2ZXIsIHRoZXJlIG1heSBiZSBvdGhlciBsaWJyYXJpZXMgdGhhdAorICAgaW50ZXJjZXB0IHB0aHJlYWRfY3JlYXRlIHdpdGggdGhlaXIgb3duIGRlZmluaXRpb25zIHRvIHdyYXAgcHRocmVhZHMKKyAgIGZ1bmN0aW9uYWxpdHkgZm9yIHNvbWUgcHVycG9zZS4gIEluIHRob3NlIGNhc2VzLCBwdGhyZWFkX2NyZWF0ZSBiZWluZworICAgZGVmaW5lZCBtaWdodCBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGF0IGxpYnB0aHJlYWQgaXMgYWN0dWFsbHkgbGlua2VkCisgICBpbi4KKworICAgRm9yIHRoZSBHTlUgQyBsaWJyYXJ5LCB3ZSBjYW4gdXNlIGEga25vd24gaW50ZXJuYWwgbmFtZS4gIFRoaXMgaXMgYWx3YXlzCisgICBhdmFpbGFibGUgaW4gdGhlIEFCSSwgYnV0IG5vIG90aGVyIGxpYnJhcnkgd291bGQgZGVmaW5lIGl0LiAgVGhhdCBpcworICAgaWRlYWwsIHNpbmNlIGFueSBwdWJsaWMgcHRocmVhZCBmdW5jdGlvbiBtaWdodCBiZSBpbnRlcmNlcHRlZCBqdXN0IGFzCisgICBwdGhyZWFkX2NyZWF0ZSBtaWdodCBiZS4gIF9fcHRocmVhZF9rZXlfY3JlYXRlIGlzIGFuICJpbnRlcm5hbCIKKyAgIGltcGxlbWVudGF0aW9uIHN5bWJvbCwgYnV0IGl0IGlzIHBhcnQgb2YgdGhlIHB1YmxpYyBleHBvcnRlZCBBQkkuICBBbHNvLAorICAgaXQncyBhbW9uZyB0aGUgc3ltYm9scyB0aGF0IHRoZSBzdGF0aWMgbGlicHRocmVhZC5hIGFsd2F5cyBsaW5rcyBpbgorICAgd2hlbmV2ZXIgcHRocmVhZF9jcmVhdGUgaXMgdXNlZCwgc28gdGhlcmUgaXMgbm8gZGFuZ2VyIG9mIGEgZmFsc2UKKyAgIG5lZ2F0aXZlIHJlc3VsdCBpbiBhbnkgc3RhdGljYWxseS1saW5rZWQsIG11bHRpLXRocmVhZGVkIHByb2dyYW0uCisKKyAgIEZvciBvdGhlcnMsIHdlIGNob29zZSBwdGhyZWFkX2NhbmNlbCBhcyBhIGZ1bmN0aW9uIHRoYXQgc2VlbXMgdW5saWtlbHkKKyAgIHRvIGJlIHJlZGVmaW5lZCBieSBhbiBpbnRlcmNlcHRvciBsaWJyYXJ5LiAgVGhlIGJpb25pYyAoQW5kcm9pZCkgQworICAgbGlicmFyeSBkb2VzIG5vdCBwcm92aWRlIHB0aHJlYWRfY2FuY2VsLCBzbyB3ZSBkbyB1c2UgcHRocmVhZF9jcmVhdGUKKyAgIHRoZXJlIChhbmQgaW50ZXJjZXB0b3IgbGlicmFyaWVzIGxvc2UpLiAgKi8KKworI2lmZGVmIF9fR0xJQkNfXworX19ndGhydzIoX19ndGhyd18oX19wdGhyZWFkX2tleV9jcmVhdGUpLAorCSBfX3B0aHJlYWRfa2V5X2NyZWF0ZSwKKwkgcHRocmVhZF9rZXlfY3JlYXRlKQorIyBkZWZpbmUgR1RIUl9BQ1RJVkVfUFJPWFkJX19ndGhyd18oX19wdGhyZWFkX2tleV9jcmVhdGUpCisjZWxpZiBkZWZpbmVkIChfX0JJT05JQ19fKQorIyBkZWZpbmUgR1RIUl9BQ1RJVkVfUFJPWFkJX19ndGhyd18ocHRocmVhZF9jcmVhdGUpCisjZWxzZQorIyBkZWZpbmUgR1RIUl9BQ1RJVkVfUFJPWFkJX19ndGhyd18ocHRocmVhZF9jYW5jZWwpCisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9hY3RpdmVfcCAodm9pZCkKK3sKKyAgc3RhdGljIHZvaWQgKmNvbnN0IF9fZ3RocmVhZF9hY3RpdmVfcHRyCisgICAgPSBfX2V4dGVuc2lvbl9fICh2b2lkICopICZHVEhSX0FDVElWRV9QUk9YWTsKKyAgcmV0dXJuIF9fZ3RocmVhZF9hY3RpdmVfcHRyICE9IDA7Cit9CisKKyNlbmRpZiAvKiBGcmVlQlNEIG9yIFNvbGFyaXMgKi8KKworI2Vsc2UgLyogbm90IF9fR1hYX1dFQUtfXyAqLworCisvKiBTaW1pbGFyIHRvIFNvbGFyaXMsIEhQLVVYIDExIGZvciBQQS1SSVNDIHByb3ZpZGVzIHN0dWJzIGZvciBwdGhyZWFkCisgICBjYWxscyBpbiBzaGFyZWQgZmxhdm9ycyBvZiB0aGUgSFAtVVggQyBsaWJyYXJ5LiAgTW9zdCBvZiB0aGUgc3R1YnMKKyAgIGhhdmUgbm8gZnVuY3Rpb25hbGl0eS4gIFRoZSBkZXRhaWxzIGFyZSBkZXNjcmliZWQgaW4gdGhlICJsaWJjIGN1bXVsYXRpdmUKKyAgIHBhdGNoIiBmb3IgZWFjaCBzdWJ2ZXJzaW9uIG9mIEhQLVVYIDExLiAgVGhlcmUgYXJlIHR3byBzcGVjaWFsIGludGVyZmFjZXMKKyAgIHByb3ZpZGVkIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB0byBhIHNoYXJlZCBwdGhyZWFkCisgICBsaWJyYXJ5IG9yIG5vdC4gIEhvd2V2ZXIsIHRoZXNlIGludGVyZmFjZXMgYXJlbid0IGF2YWlsYWJsZSBpbiBlYXJseQorICAgbGlicHRocmVhZCBsaWJyYXJpZXMuICBXZSBhbHNvIG5lZWQgYSB0ZXN0IHRoYXQgd29ya3MgZm9yIGFyY2hpdmUKKyAgIGxpYnJhcmllcy4gIFdlIGNhbid0IHVzZSBwdGhyZWFkX29uY2UgYXMgc29tZSBsaWJjIHZlcnNpb25zIGNhbGwgdGhlCisgICBpbml0IGZ1bmN0aW9uLiAgV2UgYWxzbyBjYW4ndCB1c2UgcHRocmVhZF9jcmVhdGUgb3IgcHRocmVhZF9hdHRyX2luaXQKKyAgIGFzIHRoZXNlIGNyZWF0ZSBhIHRocmVhZCBhbmQgdGhlcmVieSBwcmV2ZW50IGNoYW5naW5nIHRoZSBkZWZhdWx0IHN0YWNrCisgICBzaXplLiAgVGhlIGZ1bmN0aW9uIHB0aHJlYWRfZGVmYXVsdF9zdGFja3NpemVfbnAgaXMgYXZhaWxhYmxlIGluIGJvdGgKKyAgIHRoZSBhcmNoaXZlIGFuZCBzaGFyZWQgdmVyc2lvbnMgb2YgbGlicHRocmVhZC4gICBJdCBjYW4gYmUgdXNlZCB0bworICAgZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IHB0aHJlYWQgc3RhY2sgc2l6ZS4gIFRoZXJlIGlzIGEgc3R1YiBpbiBzb21lCisgICBzaGFyZWQgbGliYyB2ZXJzaW9ucyB3aGljaCByZXR1cm5zIGEgemVybyBzaXplIGlmIHB0aHJlYWRzIGFyZSBub3QKKyAgIGFjdGl2ZS4gIFdlIHByb3ZpZGUgYW4gZXF1aXZhbGVudCBzdHViIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBsaWJjCisgICBkb2Vzbid0IHByb3ZpZGUgb25lLiAgKi8KKworI2lmIGRlZmluZWQoX19ocHBhX18pICYmIGRlZmluZWQoX19ocHV4X18pCisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgX19ndGhyZWFkX2FjdGl2ZSA9IC0xOworCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2FjdGl2ZV9wICh2b2lkKQoreworICAvKiBBdm9pZCByZWFkaW5nIF9fZ3RocmVhZF9hY3RpdmUgdHdpY2Ugb24gdGhlIG1haW4gY29kZSBwYXRoLiAgKi8KKyAgaW50IF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlID0gX19ndGhyZWFkX2FjdGl2ZTsKKyAgc2l6ZV90IF9fczsKKworICBpZiAoX19idWlsdGluX2V4cGVjdCAoX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgPCAwLCAwKSkKKyAgICB7CisgICAgICBwdGhyZWFkX2RlZmF1bHRfc3RhY2tzaXplX25wICgwLCAmX19zKTsKKyAgICAgIF9fZ3RocmVhZF9hY3RpdmUgPSBfX3MgPyAxIDogMDsKKyAgICAgIF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlID0gX19ndGhyZWFkX2FjdGl2ZTsKKyAgICB9CisKKyAgcmV0dXJuIF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlICE9IDA7Cit9CisKKyNlbHNlIC8qIG5vdCBocHBhLWhwdXggKi8KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9hY3RpdmVfcCAodm9pZCkKK3sKKyAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAvKiBocHBhLWhwdXggKi8KKworI2VuZGlmIC8qIF9fR1hYX1dFQUtfXyAqLworCisjaWZkZWYgX0xJQk9CSkMKKworLyogVGhpcyBpcyB0aGUgY29uZmlnLmggZmlsZSBpbiBsaWJvYmpjLyAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaWZkZWYgSEFWRV9TQ0hFRF9ICisjIGluY2x1ZGUgPHNjaGVkLmg+CisjZW5kaWYKKworLyogS2V5IHN0cnVjdHVyZSBmb3IgbWFpbnRhaW5pbmcgdGhyZWFkIHNwZWNpZmljIHN0b3JhZ2UgKi8KK3N0YXRpYyBwdGhyZWFkX2tleV90IF9vYmpjX3RocmVhZF9zdG9yYWdlOworc3RhdGljIHB0aHJlYWRfYXR0cl90IF9vYmpjX3RocmVhZF9hdHRyaWJzOworCisvKiBUaHJlYWQgbG9jYWwgc3RvcmFnZSBmb3IgYSBzaW5nbGUgdGhyZWFkICovCitzdGF0aWMgdm9pZCAqdGhyZWFkX2xvY2FsX3N0b3JhZ2UgPSBOVUxMOworCisvKiBCYWNrZW5kIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqLworCisvKiBJbml0aWFsaXplIHRoZSB0aHJlYWRzIHN1YnN5c3RlbS4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfaW5pdF90aHJlYWRfc3lzdGVtICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIC8qIEluaXRpYWxpemUgdGhlIHRocmVhZCBzdG9yYWdlIGtleS4gICovCisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9rZXlfY3JlYXRlKSAoJl9vYmpjX3RocmVhZF9zdG9yYWdlLCBOVUxMKSA9PSAwKQorCXsKKwkgIC8qIFRoZSBub3JtYWwgZGVmYXVsdCBkZXRhY2ggc3RhdGUgZm9yIHRocmVhZHMgaXMKKwkgICAqIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFIHdoaWNoIGNhdXNlcyB0aHJlYWRzIHRvIG5vdCBkaWUKKwkgICAqIHdoZW4geW91IHRoaW5rIHRoZXkgc2hvdWxkLiAgKi8KKwkgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX2F0dHJfaW5pdCkgKCZfb2JqY190aHJlYWRfYXR0cmlicykgPT0gMAorCSAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSkgKCZfb2JqY190aHJlYWRfYXR0cmlicywKKwkJCQkJICAgICAgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpID09IDApCisJICAgIHJldHVybiAwOworCX0KKyAgICB9CisKKyAgcmV0dXJuIC0xOworfQorCisvKiBDbG9zZSB0aGUgdGhyZWFkcyBzdWJzeXN0ZW0uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2Nsb3NlX3RocmVhZF9zeXN0ZW0gKHZvaWQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfa2V5X2RlbGV0ZSkgKF9vYmpjX3RocmVhZF9zdG9yYWdlKSA9PSAwCisgICAgICAmJiBfX2d0aHJ3XyhwdGhyZWFkX2F0dHJfZGVzdHJveSkgKCZfb2JqY190aHJlYWRfYXR0cmlicykgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gLTE7Cit9CisKKy8qIEJhY2tlbmQgdGhyZWFkIGZ1bmN0aW9ucyAqLworCisvKiBDcmVhdGUgYSBuZXcgdGhyZWFkIG9mIGV4ZWN1dGlvbi4gICovCitzdGF0aWMgaW5saW5lIG9iamNfdGhyZWFkX3QKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9kZXRhY2ggKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpCit7CisgIG9iamNfdGhyZWFkX3QgdGhyZWFkX2lkOworICBwdGhyZWFkX3QgbmV3X3RocmVhZF9oYW5kbGU7CisKKyAgaWYgKCFfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCEoX19ndGhyd18ocHRocmVhZF9jcmVhdGUpICgmbmV3X3RocmVhZF9oYW5kbGUsICZfb2JqY190aHJlYWRfYXR0cmlicywKKwkJCQkgICh2b2lkICopIGZ1bmMsIGFyZykpKQorICAgIHRocmVhZF9pZCA9IChvYmpjX3RocmVhZF90KSBuZXdfdGhyZWFkX2hhbmRsZTsKKyAgZWxzZQorICAgIHRocmVhZF9pZCA9IE5VTEw7CisKKyAgcmV0dXJuIHRocmVhZF9pZDsKK30KKworLyogU2V0IHRoZSBjdXJyZW50IHRocmVhZCdzIHByaW9yaXR5LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfc2V0X3ByaW9yaXR5IChpbnQgcHJpb3JpdHkpCit7CisgIGlmICghX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiAtMTsKKyAgZWxzZQorICAgIHsKKyNpZmRlZiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORworI2lmZGVmIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORworICAgICAgcHRocmVhZF90IHRocmVhZF9pZCA9IF9fZ3RocndfKHB0aHJlYWRfc2VsZikgKCk7CisgICAgICBpbnQgcG9saWN5OworICAgICAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtczsKKyAgICAgIGludCBwcmlvcml0eV9taW4sIHByaW9yaXR5X21heDsKKworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfZ2V0c2NoZWRwYXJhbSkgKHRocmVhZF9pZCwgJnBvbGljeSwgJnBhcmFtcykgPT0gMCkKKwl7CisJICBpZiAoKHByaW9yaXR5X21heCA9IF9fZ3RocndfKHNjaGVkX2dldF9wcmlvcml0eV9tYXgpIChwb2xpY3kpKSA9PSAtMSkKKwkgICAgcmV0dXJuIC0xOworCisJICBpZiAoKHByaW9yaXR5X21pbiA9IF9fZ3RocndfKHNjaGVkX2dldF9wcmlvcml0eV9taW4pIChwb2xpY3kpKSA9PSAtMSkKKwkgICAgcmV0dXJuIC0xOworCisJICBpZiAocHJpb3JpdHkgPiBwcmlvcml0eV9tYXgpCisJICAgIHByaW9yaXR5ID0gcHJpb3JpdHlfbWF4OworCSAgZWxzZSBpZiAocHJpb3JpdHkgPCBwcmlvcml0eV9taW4pCisJICAgIHByaW9yaXR5ID0gcHJpb3JpdHlfbWluOworCSAgcGFyYW1zLnNjaGVkX3ByaW9yaXR5ID0gcHJpb3JpdHk7CisKKwkgIC8qCisJICAgKiBUaGUgc29sYXJpcyA3IGFuZCBzZXZlcmFsIG90aGVyIG1hbiBwYWdlcyBpbmNvcnJlY3RseSBzdGF0ZSB0aGF0CisJICAgKiB0aGlzIHNob3VsZCBiZSBhIHBvaW50ZXIgdG8gcG9saWN5IGJ1dCBwdGhyZWFkLmggaXMgdW5pdmVyc2FsbHkKKwkgICAqIGF0IG9kZHMgd2l0aCB0aGlzLgorCSAgICovCisJICBpZiAoX19ndGhyd18ocHRocmVhZF9zZXRzY2hlZHBhcmFtKSAodGhyZWFkX2lkLCBwb2xpY3ksICZwYXJhbXMpID09IDApCisJICAgIHJldHVybiAwOworCX0KKyNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KKyNlbmRpZiAvKiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORyAqLworICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworLyogUmV0dXJuIHRoZSBjdXJyZW50IHRocmVhZCdzIHByaW9yaXR5LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfZ2V0X3ByaW9yaXR5ICh2b2lkKQoreworI2lmZGVmIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HCisjaWZkZWYgX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgaW50IHBvbGljeTsKKyAgICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbXM7CisKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX2dldHNjaGVkcGFyYW0pIChfX2d0aHJ3XyhwdGhyZWFkX3NlbGYpICgpLCAmcG9saWN5LCAmcGFyYW1zKSA9PSAwKQorCXJldHVybiBwYXJhbXMuc2NoZWRfcHJpb3JpdHk7CisgICAgICBlbHNlCisJcmV0dXJuIC0xOworICAgIH0KKyAgZWxzZQorI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyAqLworI2VuZGlmIC8qIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HICovCisgICAgcmV0dXJuIE9CSkNfVEhSRUFEX0lOVEVSQUNUSVZFX1BSSU9SSVRZOworfQorCisvKiBZaWVsZCBvdXIgcHJvY2VzcyB0aW1lIHRvIGFub3RoZXIgdGhyZWFkLiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorX19ndGhyZWFkX29iamNfdGhyZWFkX3lpZWxkICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIF9fZ3RocndfKHNjaGVkX3lpZWxkKSAoKTsKK30KKworLyogVGVybWluYXRlIHRoZSBjdXJyZW50IHRocmVhZC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfdGhyZWFkX2V4aXQgKHZvaWQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgLyogZXhpdCB0aGUgdGhyZWFkICovCisgICAgX19ndGhyd18ocHRocmVhZF9leGl0KSAoJl9fb2JqY190aHJlYWRfZXhpdF9zdGF0dXMpOworCisgIC8qIEZhaWxlZCBpZiB3ZSByZWFjaGVkIGhlcmUgKi8KKyAgcmV0dXJuIC0xOworfQorCisvKiBSZXR1cm5zIGFuIGludGVnZXIgdmFsdWUgd2hpY2ggdW5pcXVlbHkgZGVzY3JpYmVzIGEgdGhyZWFkLiAgKi8KK3N0YXRpYyBpbmxpbmUgb2JqY190aHJlYWRfdAorX19ndGhyZWFkX29iamNfdGhyZWFkX2lkICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiAob2JqY190aHJlYWRfdCkgX19ndGhyd18ocHRocmVhZF9zZWxmKSAoKTsKKyAgZWxzZQorICAgIHJldHVybiAob2JqY190aHJlYWRfdCkgMTsKK30KKworLyogU2V0cyB0aGUgdGhyZWFkJ3MgbG9jYWwgc3RvcmFnZSBwb2ludGVyLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfc2V0X2RhdGEgKHZvaWQgKnZhbHVlKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX3NldHNwZWNpZmljKSAoX29iamNfdGhyZWFkX3N0b3JhZ2UsIHZhbHVlKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHRocmVhZF9sb2NhbF9zdG9yYWdlID0gdmFsdWU7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qIFJldHVybnMgdGhlIHRocmVhZCdzIGxvY2FsIHN0b3JhZ2UgcG9pbnRlci4gICovCitzdGF0aWMgaW5saW5lIHZvaWQgKgorX19ndGhyZWFkX29iamNfdGhyZWFkX2dldF9kYXRhICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2dldHNwZWNpZmljKSAoX29iamNfdGhyZWFkX3N0b3JhZ2UpOworICBlbHNlCisgICAgcmV0dXJuIHRocmVhZF9sb2NhbF9zdG9yYWdlOworfQorCisvKiBCYWNrZW5kIG11dGV4IGZ1bmN0aW9ucyAqLworCisvKiBBbGxvY2F0ZSBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF9hbGxvY2F0ZSAob2JqY19tdXRleF90IG11dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIG11dGV4LT5iYWNrZW5kID0gb2JqY19tYWxsb2MgKHNpemVvZiAocHRocmVhZF9tdXRleF90KSk7CisKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2luaXQpICgocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kLCBOVUxMKSkKKwl7CisJICBvYmpjX2ZyZWUgKG11dGV4LT5iYWNrZW5kKTsKKwkgIG11dGV4LT5iYWNrZW5kID0gTlVMTDsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBEZWFsbG9jYXRlIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X2RlYWxsb2NhdGUgKG9iamNfbXV0ZXhfdCBtdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICB7CisgICAgICBpbnQgY291bnQ7CisKKyAgICAgIC8qCisgICAgICAgKiBQb3NpeCBUaHJlYWRzIHNwZWNpZmljYWxseSByZXF1aXJlIHRoYXQgdGhlIHRocmVhZCBiZSB1bmxvY2tlZAorICAgICAgICogZm9yIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSkgdG8gd29yay4KKyAgICAgICAqLworCisgICAgICBkbworCXsKKwkgIGNvdW50ID0gX19ndGhyd18ocHRocmVhZF9tdXRleF91bmxvY2spICgocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kKTsKKwkgIGlmIChjb3VudCA8IDApCisJICAgIHJldHVybiAtMTsKKwl9CisgICAgICB3aGlsZSAoY291bnQpOworCisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9tdXRleF9kZXN0cm95KSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCkpCisJcmV0dXJuIC0xOworCisgICAgICBvYmpjX2ZyZWUgKG11dGV4LT5iYWNrZW5kKTsKKyAgICAgIG11dGV4LT5iYWNrZW5kID0gTlVMTDsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBHcmFiIGEgbG9jayBvbiBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF9sb2NrIChvYmpjX211dGV4X3QgbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfbG9jaykgKChwdGhyZWFkX211dGV4X3QgKikgbXV0ZXgtPmJhY2tlbmQpICE9IDApCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogVHJ5IHRvIGdyYWIgYSBsb2NrIG9uIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X3RyeWxvY2sgKG9iamNfbXV0ZXhfdCBtdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKQorICAgICAgJiYgX19ndGhyd18ocHRocmVhZF9tdXRleF90cnlsb2NrKSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCkgIT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBVbmxvY2sgdGhlIG11dGV4ICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfdW5sb2NrIChvYmpjX211dGV4X3QgbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCkgIT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBCYWNrZW5kIGNvbmRpdGlvbiBtdXRleCBmdW5jdGlvbnMgKi8KKworLyogQWxsb2NhdGUgYSBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9hbGxvY2F0ZSAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24pCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgY29uZGl0aW9uLT5iYWNrZW5kID0gb2JqY19tYWxsb2MgKHNpemVvZiAocHRocmVhZF9jb25kX3QpKTsKKworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfY29uZF9pbml0KSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCwgTlVMTCkpCisJeworCSAgb2JqY19mcmVlIChjb25kaXRpb24tPmJhY2tlbmQpOworCSAgY29uZGl0aW9uLT5iYWNrZW5kID0gTlVMTDsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBEZWFsbG9jYXRlIGEgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fZGVhbGxvY2F0ZSAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24pCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfY29uZF9kZXN0cm95KSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCkpCisJcmV0dXJuIC0xOworCisgICAgICBvYmpjX2ZyZWUgKGNvbmRpdGlvbi0+YmFja2VuZCk7CisgICAgICBjb25kaXRpb24tPmJhY2tlbmQgPSBOVUxMOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFdhaXQgb24gdGhlIGNvbmRpdGlvbiAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl93YWl0IChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbiwgb2JqY19tdXRleF90IG11dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfd2FpdCkgKChwdGhyZWFkX2NvbmRfdCAqKSBjb25kaXRpb24tPmJhY2tlbmQsCisJCQkgICAgICAocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kKTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBXYWtlIHVwIGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9icm9hZGNhc3QgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLyogV2FrZSB1cCBvbmUgdGhyZWFkIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9zaWduYWwgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfc2lnbmFsKSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworI2Vsc2UgLyogX0xJQk9CSkMgKi8KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jcmVhdGUgKF9fZ3RocmVhZF90ICpfX3RocmVhZGlkLCB2b2lkICooKl9fZnVuYykgKHZvaWQqKSwKKwkJICB2b2lkICpfX2FyZ3MpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NyZWF0ZSkgKF9fdGhyZWFkaWQsIE5VTEwsIF9fZnVuYywgX19hcmdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9qb2luIChfX2d0aHJlYWRfdCBfX3RocmVhZGlkLCB2b2lkICoqX192YWx1ZV9wdHIpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2pvaW4pIChfX3RocmVhZGlkLCBfX3ZhbHVlX3B0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfZGV0YWNoIChfX2d0aHJlYWRfdCBfX3RocmVhZGlkKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9kZXRhY2gpIChfX3RocmVhZGlkKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9lcXVhbCAoX19ndGhyZWFkX3QgX190MSwgX19ndGhyZWFkX3QgX190MikKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfZXF1YWwpIChfX3QxLCBfX3QyKTsKK30KKworc3RhdGljIGlubGluZSBfX2d0aHJlYWRfdAorX19ndGhyZWFkX3NlbGYgKHZvaWQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX3NlbGYpICgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3lpZWxkICh2b2lkKQoreworICByZXR1cm4gX19ndGhyd18oc2NoZWRfeWllbGQpICgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29uY2UgKF9fZ3RocmVhZF9vbmNlX3QgKl9fb25jZSwgdm9pZCAoKl9fZnVuYykgKHZvaWQpKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX29uY2UpIChfX29uY2UsIF9fZnVuYyk7CisgIGVsc2UKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfa2V5X2NyZWF0ZSAoX19ndGhyZWFkX2tleV90ICpfX2tleSwgdm9pZCAoKl9fZHRvcikgKHZvaWQgKikpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2tleV9jcmVhdGUpIChfX2tleSwgX19kdG9yKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9rZXlfZGVsZXRlIChfX2d0aHJlYWRfa2V5X3QgX19rZXkpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2tleV9kZWxldGUpIChfX2tleSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitfX2d0aHJlYWRfZ2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfZ2V0c3BlY2lmaWMpIChfX2tleSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfc2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSwgY29uc3Qgdm9pZCAqX19wdHIpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX3NldHNwZWNpZmljKSAoX19rZXksIF9fcHRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2d0aHJlYWRfbXV0ZXhfaW5pdF9mdW5jdGlvbiAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgX19ndGhyd18ocHRocmVhZF9tdXRleF9pbml0KSAoX19tdXRleCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSkgKF9fbXV0ZXgpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfbG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfbG9jaykgKF9fbXV0ZXgpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfdHJ5bG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaykgKF9fbXV0ZXgpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X3RpbWVkbG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgsCisJCQkgICBjb25zdCBfX2d0aHJlYWRfdGltZV90ICpfX2Fic190aW1lb3V0KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X3RpbWVkbG9jaykgKF9fbXV0ZXgsIF9fYWJzX3RpbWVvdXQpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF91bmxvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X3VubG9jaykgKF9fbXV0ZXgpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiAhZGVmaW5lZCggUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlApIFwKKyAgfHwgZGVmaW5lZChfR1RIUkVBRF9VU0VfUkVDVVJTSVZFX01VVEVYX0lOSVRfRlVOQykKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2luaXRfZnVuY3Rpb24gKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICB7CisgICAgICBwdGhyZWFkX211dGV4YXR0cl90IF9fYXR0cjsKKyAgICAgIGludCBfX3I7CisKKyAgICAgIF9fciA9IF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQpICgmX19hdHRyKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUpICgmX19hdHRyLAorCQkJCQkJICAgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUpOworICAgICAgaWYgKCFfX3IpCisJX19yID0gX19ndGhyd18ocHRocmVhZF9tdXRleF9pbml0KSAoX19tdXRleCwgJl9fYXR0cik7CisgICAgICBpZiAoIV9fcikKKwlfX3IgPSBfX2d0aHJ3XyhwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KSAoJl9fYXR0cik7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfbG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX211dGV4X2xvY2sgKF9fbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90cnlsb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfdHJ5bG9jayAoX19tdXRleCk7Cit9CisKKyNpZiBfR1RIUkVBRF9VU0VfTVVURVhfVElNRURMT0NLCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90aW1lZGxvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCwKKwkJCQkgICAgIGNvbnN0IF9fZ3RocmVhZF90aW1lX3QgKl9fYWJzX3RpbWVvdXQpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfdGltZWRsb2NrIChfX211dGV4LCBfX2Fic190aW1lb3V0KTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF91bmxvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF91bmxvY2sgKF9fbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9kZXN0cm95IChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSAoX19tdXRleCk7Cit9CisKKyNpZmRlZiBfR1RIUkVBRF9VU0VfQ09ORF9JTklUX0ZVTkMKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19ndGhyZWFkX2NvbmRfaW5pdF9mdW5jdGlvbiAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIF9fZ3RocndfKHB0aHJlYWRfY29uZF9pbml0KSAoX19jb25kLCBOVUxMKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NvbmRfYnJvYWRjYXN0IChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KSAoX19jb25kKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jb25kX3NpZ25hbCAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX3NpZ25hbCkgKF9fY29uZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF93YWl0IChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQsIF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX3dhaXQpIChfX2NvbmQsIF9fbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NvbmRfdGltZWR3YWl0IChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQsIF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4LAorCQkJICBjb25zdCBfX2d0aHJlYWRfdGltZV90ICpfX2Fic190aW1lb3V0KQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX3RpbWVkd2FpdCkgKF9fY29uZCwgX19tdXRleCwgX19hYnNfdGltZW91dCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF93YWl0X3JlY3Vyc2l2ZSAoX19ndGhyZWFkX2NvbmRfdCAqX19jb25kLAorCQkJICAgICAgIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9jb25kX3dhaXQgKF9fY29uZCwgX19tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF9kZXN0cm95IChfX2d0aHJlYWRfY29uZF90KiBfX2NvbmQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfZGVzdHJveSkgKF9fY29uZCk7Cit9CisKKyNlbmRpZiAvKiBfTElCT0JKQyAqLworCisjZW5kaWYgLyogISBfR0xJQkNYWF9HQ0NfR1RIUl9QT1NJWF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2d0aHItc2luZ2xlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2d0aHItc2luZ2xlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFlNTc1ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvZ3Roci1zaW5nbGUuaApAQCAtMCwwICsxLDI5OCBAQAorLyogVGhyZWFkcyBjb21wYXRpYmlsaXR5IHJvdXRpbmVzIGZvciBsaWJnY2MyIGFuZCBsaWJvYmpjLiAgKi8KKy8qIENvbXBpbGUgdGhpcyBvbmUgd2l0aCBnY2MuICAqLworLyogQ29weXJpZ2h0IChDKSAxOTk3LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX0dMSUJDWFhfR0NDX0dUSFJfU0lOR0xFX0gKKyNkZWZpbmUgX0dMSUJDWFhfR0NDX0dUSFJfU0lOR0xFX0gKKworLyogSnVzdCBwcm92aWRlIGNvbXBhdGliaWxpdHkgZm9yIG11dGV4IGhhbmRsaW5nLiAgKi8KKwordHlwZWRlZiBpbnQgX19ndGhyZWFkX2tleV90OwordHlwZWRlZiBpbnQgX19ndGhyZWFkX29uY2VfdDsKK3R5cGVkZWYgaW50IF9fZ3RocmVhZF9tdXRleF90OwordHlwZWRlZiBpbnQgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90OworCisjZGVmaW5lIF9fR1RIUkVBRF9PTkNFX0lOSVQgMAorI2RlZmluZSBfX0dUSFJFQURfTVVURVhfSU5JVCAwCisjZGVmaW5lIF9fR1RIUkVBRF9NVVRFWF9JTklUX0ZVTkNUSU9OKG14KQorI2RlZmluZSBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVQgMAorCisjZGVmaW5lIF9HTElCQ1hYX1VOVVNFRCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorCisjaWZkZWYgX0xJQk9CSkMKKworLyogVGhyZWFkIGxvY2FsIHN0b3JhZ2UgZm9yIGEgc2luZ2xlIHRocmVhZCAqLworc3RhdGljIHZvaWQgKnRocmVhZF9sb2NhbF9zdG9yYWdlID0gTlVMTDsKKworLyogQmFja2VuZCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKi8KKworLyogSW5pdGlhbGl6ZSB0aGUgdGhyZWFkcyBzdWJzeXN0ZW0uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2luaXRfdGhyZWFkX3N5c3RlbSAodm9pZCkKK3sKKyAgLyogTm8gdGhyZWFkIHN1cHBvcnQgYXZhaWxhYmxlICovCisgIHJldHVybiAtMTsKK30KKworLyogQ2xvc2UgdGhlIHRocmVhZHMgc3Vic3lzdGVtLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jbG9zZV90aHJlYWRfc3lzdGVtICh2b2lkKQoreworICAvKiBObyB0aHJlYWQgc3VwcG9ydCBhdmFpbGFibGUgKi8KKyAgcmV0dXJuIC0xOworfQorCisvKiBCYWNrZW5kIHRocmVhZCBmdW5jdGlvbnMgKi8KKworLyogQ3JlYXRlIGEgbmV3IHRocmVhZCBvZiBleGVjdXRpb24uICAqLworc3RhdGljIGlubGluZSBvYmpjX3RocmVhZF90CitfX2d0aHJlYWRfb2JqY190aHJlYWRfZGV0YWNoICh2b2lkICgqIGZ1bmMpKHZvaWQgKiksIHZvaWQgKiBhcmcgX0dMSUJDWFhfVU5VU0VEKQoreworICAvKiBObyB0aHJlYWQgc3VwcG9ydCBhdmFpbGFibGUgKi8KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFNldCB0aGUgY3VycmVudCB0aHJlYWQncyBwcmlvcml0eS4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfdGhyZWFkX3NldF9wcmlvcml0eSAoaW50IHByaW9yaXR5IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgLyogTm8gdGhyZWFkIHN1cHBvcnQgYXZhaWxhYmxlICovCisgIHJldHVybiAtMTsKK30KKworLyogUmV0dXJuIHRoZSBjdXJyZW50IHRocmVhZCdzIHByaW9yaXR5LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfZ2V0X3ByaW9yaXR5ICh2b2lkKQoreworICByZXR1cm4gT0JKQ19USFJFQURfSU5URVJBQ1RJVkVfUFJJT1JJVFk7Cit9CisKKy8qIFlpZWxkIG91ciBwcm9jZXNzIHRpbWUgdG8gYW5vdGhlciB0aHJlYWQuICAqLworc3RhdGljIGlubGluZSB2b2lkCitfX2d0aHJlYWRfb2JqY190aHJlYWRfeWllbGQgKHZvaWQpCit7CisgIHJldHVybjsKK30KKworLyogVGVybWluYXRlIHRoZSBjdXJyZW50IHRocmVhZC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfdGhyZWFkX2V4aXQgKHZvaWQpCit7CisgIC8qIE5vIHRocmVhZCBzdXBwb3J0IGF2YWlsYWJsZSAqLworICAvKiBTaG91bGQgd2UgcmVhbGx5IGV4aXQgdGhlIHByb2dyYW0gKi8KKyAgLyogZXhpdCAoJl9fb2JqY190aHJlYWRfZXhpdF9zdGF0dXMpOyAqLworICByZXR1cm4gLTE7Cit9CisKKy8qIFJldHVybnMgYW4gaW50ZWdlciB2YWx1ZSB3aGljaCB1bmlxdWVseSBkZXNjcmliZXMgYSB0aHJlYWQuICAqLworc3RhdGljIGlubGluZSBvYmpjX3RocmVhZF90CitfX2d0aHJlYWRfb2JqY190aHJlYWRfaWQgKHZvaWQpCit7CisgIC8qIE5vIHRocmVhZCBzdXBwb3J0LCB1c2UgMS4gICovCisgIHJldHVybiAob2JqY190aHJlYWRfdCkgMTsKK30KKworLyogU2V0cyB0aGUgdGhyZWFkJ3MgbG9jYWwgc3RvcmFnZSBwb2ludGVyLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfc2V0X2RhdGEgKHZvaWQgKnZhbHVlKQoreworICB0aHJlYWRfbG9jYWxfc3RvcmFnZSA9IHZhbHVlOworICByZXR1cm4gMDsKK30KKworLyogUmV0dXJucyB0aGUgdGhyZWFkJ3MgbG9jYWwgc3RvcmFnZSBwb2ludGVyLiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitfX2d0aHJlYWRfb2JqY190aHJlYWRfZ2V0X2RhdGEgKHZvaWQpCit7CisgIHJldHVybiB0aHJlYWRfbG9jYWxfc3RvcmFnZTsKK30KKworLyogQmFja2VuZCBtdXRleCBmdW5jdGlvbnMgKi8KKworLyogQWxsb2NhdGUgYSBtdXRleC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfYWxsb2NhdGUgKG9iamNfbXV0ZXhfdCBtdXRleCBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCisvKiBEZWFsbG9jYXRlIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X2RlYWxsb2NhdGUgKG9iamNfbXV0ZXhfdCBtdXRleCBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCisvKiBHcmFiIGEgbG9jayBvbiBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF9sb2NrIChvYmpjX211dGV4X3QgbXV0ZXggX0dMSUJDWFhfVU5VU0VEKQoreworICAvKiBUaGVyZSBjYW4gb25seSBiZSBvbmUgdGhyZWFkLCBzbyB3ZSBhbHdheXMgZ2V0IHRoZSBsb2NrICovCisgIHJldHVybiAwOworfQorCisvKiBUcnkgdG8gZ3JhYiBhIGxvY2sgb24gYSBtdXRleC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfdHJ5bG9jayAob2JqY19tdXRleF90IG11dGV4IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgLyogVGhlcmUgY2FuIG9ubHkgYmUgb25lIHRocmVhZCwgc28gd2UgYWx3YXlzIGdldCB0aGUgbG9jayAqLworICByZXR1cm4gMDsKK30KKworLyogVW5sb2NrIHRoZSBtdXRleCAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X3VubG9jayAob2JqY19tdXRleF90IG11dGV4IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEJhY2tlbmQgY29uZGl0aW9uIG11dGV4IGZ1bmN0aW9ucyAqLworCisvKiBBbGxvY2F0ZSBhIGNvbmRpdGlvbi4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfY29uZGl0aW9uX2FsbG9jYXRlIChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbiBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCisvKiBEZWFsbG9jYXRlIGEgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fZGVhbGxvY2F0ZSAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24gX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworLyogV2FpdCBvbiB0aGUgY29uZGl0aW9uICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfY29uZGl0aW9uX3dhaXQgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uIF9HTElCQ1hYX1VOVVNFRCwKKwkJCSAgICAgICBvYmpjX211dGV4X3QgbXV0ZXggX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworLyogV2FrZSB1cCBhbGwgdGhyZWFkcyB3YWl0aW5nIG9uIHRoaXMgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fYnJvYWRjYXN0IChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbiBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCisvKiBXYWtlIHVwIG9uZSB0aHJlYWQgd2FpdGluZyBvbiB0aGlzIGNvbmRpdGlvbi4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfY29uZGl0aW9uX3NpZ25hbCAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24gX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworI2Vsc2UgLyogX0xJQk9CSkMgKi8KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9hY3RpdmVfcCAodm9pZCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb25jZSAoX19ndGhyZWFkX29uY2VfdCAqX19vbmNlIF9HTElCQ1hYX1VOVVNFRCwgdm9pZCAoKl9fZnVuYykgKHZvaWQpIF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9HTElCQ1hYX1VOVVNFRAorX19ndGhyZWFkX2tleV9jcmVhdGUgKF9fZ3RocmVhZF9rZXlfdCAqX19rZXkgX0dMSUJDWFhfVU5VU0VELCB2b2lkICgqX19mdW5jKSAodm9pZCAqKSBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9HTElCQ1hYX1VOVVNFRAorX19ndGhyZWFkX2tleV9kZWxldGUgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKgorX19ndGhyZWFkX2dldHNwZWNpZmljIChfX2d0aHJlYWRfa2V5X3QgX19rZXkgX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9zZXRzcGVjaWZpYyAoX19ndGhyZWFkX2tleV90IF9fa2V5IF9HTElCQ1hYX1VOVVNFRCwgY29uc3Qgdm9pZCAqX192IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXggX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF9sb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X3RyeWxvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfdW5sb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9sb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfbG9jayAoX19tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3RyeWxvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF90cnlsb2NrIChfX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdW5sb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfdW5sb2NrIChfX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfZGVzdHJveSAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX211dGV4X2Rlc3Ryb3kgKF9fbXV0ZXgpOworfQorCisjZW5kaWYgLyogX0xJQk9CSkMgKi8KKworI3VuZGVmIF9HTElCQ1hYX1VOVVNFRAorCisjZW5kaWYgLyogISBfR0xJQkNYWF9HQ0NfR1RIUl9TSU5HTEVfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9ndGhyLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL2d0aHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzMzOTRlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9ndGhyLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8qIFRocmVhZHMgY29tcGF0aWJpbGl0eSByb3V0aW5lcyBmb3IgbGliZ2NjMi4gICovCisvKiBDb21waWxlIHRoaXMgb25lIHdpdGggZ2NjLiAgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5Ny0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1VuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9HTElCQ1hYX0dDQ19HVEhSX0gKKyNkZWZpbmUgX0dMSUJDWFhfR0NDX0dUSFJfSAorCisjaWZuZGVmIF9HTElCQ1hYX0hJREVfRVhQT1JUUworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwdXNoKGRlZmF1bHQpCisjZW5kaWYKKworLyogSWYgdGhpcyBmaWxlIGlzIGNvbXBpbGVkIHdpdGggdGhyZWFkcyBzdXBwb3J0LCBpdCBtdXN0CisgICAgICAgI2RlZmluZSBfX0dUSFJFQURTIDEKKyAgIHRvIGluZGljYXRlIHRoYXQgdGhyZWFkcyBzdXBwb3J0IGlzIHByZXNlbnQuICBBbHNvIGl0IGhhcyBkZWZpbmUKKyAgIGZ1bmN0aW9uCisgICAgIGludCBfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgIHRoYXQgcmV0dXJucyAxIGlmIHRocmVhZCBzeXN0ZW0gaXMgYWN0aXZlLCAwIGlmIG5vdC4KKworICAgVGhlIHRocmVhZHMgaW50ZXJmYWNlIG11c3QgZGVmaW5lIHRoZSBmb2xsb3dpbmcgdHlwZXM6CisgICAgIF9fZ3RocmVhZF9rZXlfdAorICAgICBfX2d0aHJlYWRfb25jZV90CisgICAgIF9fZ3RocmVhZF9tdXRleF90CisgICAgIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdAorCisgICBUaGUgdGhyZWFkcyBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgdGhlIGZvbGxvd2luZyBtYWNyb3M6CisKKyAgICAgX19HVEhSRUFEX09OQ0VfSU5JVAorICAgICAJCXRvIGluaXRpYWxpemUgX19ndGhyZWFkX29uY2VfdAorICAgICBfX0dUSFJFQURfTVVURVhfSU5JVAorICAgICAJCXRvIGluaXRpYWxpemUgX19ndGhyZWFkX211dGV4X3QgdG8gZ2V0IGEgZmFzdAorCQlub24tcmVjdXJzaXZlIG11dGV4LgorICAgICBfX0dUSFJFQURfTVVURVhfSU5JVF9GVU5DVElPTgorCQl0byBpbml0aWFsaXplIF9fZ3RocmVhZF9tdXRleF90IHRvIGdldCBhIGZhc3QKKwkJbm9uLXJlY3Vyc2l2ZSBtdXRleC4KKwkJRGVmaW5lIHRoaXMgdG8gYSBmdW5jdGlvbiB3aGljaCBsb29rcyBsaWtlIHRoaXM6CisJCSAgdm9pZCBfX0dUSFJFQURfTVVURVhfSU5JVF9GVU5DVElPTiAoX19ndGhyZWFkX211dGV4X3QgKikKKyAgICAgCQlTb21lIHN5c3RlbXMgY2FuJ3QgaW5pdGlhbGl6ZSBhIG11dGV4IHdpdGhvdXQgYQorCQlmdW5jdGlvbiBjYWxsLiAgRG9uJ3QgZGVmaW5lIF9fR1RIUkVBRF9NVVRFWF9JTklUIGluIHRoaXMgY2FzZS4KKyAgICAgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUCisgICAgIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVF9GVU5DVElPTgorICAgICAJCWFzIGFib3ZlLCBidXQgZm9yIGEgcmVjdXJzaXZlIG11dGV4LgorCisgICBUaGUgdGhyZWFkcyBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgdGhlIGZvbGxvd2luZyBzdGF0aWMgZnVuY3Rpb25zOgorCisgICAgIGludCBfX2d0aHJlYWRfb25jZSAoX19ndGhyZWFkX29uY2VfdCAqb25jZSwgdm9pZCAoKmZ1bmMpICgpKQorCisgICAgIGludCBfX2d0aHJlYWRfa2V5X2NyZWF0ZSAoX19ndGhyZWFkX2tleV90ICprZXlwLCB2b2lkICgqZHRvcikgKHZvaWQgKikpCisgICAgIGludCBfX2d0aHJlYWRfa2V5X2RlbGV0ZSAoX19ndGhyZWFkX2tleV90IGtleSkKKworICAgICB2b2lkICpfX2d0aHJlYWRfZ2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBrZXkpCisgICAgIGludCBfX2d0aHJlYWRfc2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBrZXksIGNvbnN0IHZvaWQgKnB0cikKKworICAgICBpbnQgX19ndGhyZWFkX211dGV4X2Rlc3Ryb3kgKF9fZ3RocmVhZF9tdXRleF90ICptdXRleCk7CisgICAgIGludCBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2Rlc3Ryb3kgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqbXV0ZXgpOworCisgICAgIGludCBfX2d0aHJlYWRfbXV0ZXhfbG9jayAoX19ndGhyZWFkX211dGV4X3QgKm11dGV4KTsKKyAgICAgaW50IF9fZ3RocmVhZF9tdXRleF90cnlsb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpOworICAgICBpbnQgX19ndGhyZWFkX211dGV4X3VubG9jayAoX19ndGhyZWFkX211dGV4X3QgKm11dGV4KTsKKworICAgICBpbnQgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9sb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKm11dGV4KTsKKyAgICAgaW50IF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdHJ5bG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICptdXRleCk7CisgICAgIGludCBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3VubG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICptdXRleCk7CisKKyAgIFRoZSBmb2xsb3dpbmcgYXJlIHN1cHBvcnRlZCBpbiBQT1NJWCB0aHJlYWRzIG9ubHkuIFRoZXkgYXJlIHJlcXVpcmVkIHRvCisgICBmaXggYSBkZWFkbG9jayBpbiBzdGF0aWMgaW5pdGlhbGl6YXRpb24gaW5zaWRlIGxpYnN1cGMrKy4gVGhlIGhlYWRlciBmaWxlCisgICBndGhyLXBvc2l4LmggZGVmaW5lcyBhIHN5bWJvbCBfX0dUSFJFQURfSEFTX0NPTkQgdG8gc2lnbmlmeSB0aGF0IHRoZXNlIGV4dHJhCisgICBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkLgorCisgICBUeXBlczoKKyAgICAgX19ndGhyZWFkX2NvbmRfdAorCisgICBNYWNyb3M6CisgICAgIF9fR1RIUkVBRF9DT05EX0lOSVQKKyAgICAgX19HVEhSRUFEX0NPTkRfSU5JVF9GVU5DVElPTgorCisgICBJbnRlcmZhY2U6CisgICAgIGludCBfX2d0aHJlYWRfY29uZF9icm9hZGNhc3QgKF9fZ3RocmVhZF9jb25kX3QgKmNvbmQpOworICAgICBpbnQgX19ndGhyZWFkX2NvbmRfd2FpdCAoX19ndGhyZWFkX2NvbmRfdCAqY29uZCwgX19ndGhyZWFkX211dGV4X3QgKm11dGV4KTsKKyAgICAgaW50IF9fZ3RocmVhZF9jb25kX3dhaXRfcmVjdXJzaXZlIChfX2d0aHJlYWRfY29uZF90ICpjb25kLAorCQkJCQlfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKm11dGV4KTsKKworICAgQWxsIGZ1bmN0aW9ucyByZXR1cm5pbmcgaW50IHNob3VsZCByZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIHRoZSBlcnJvcgorICAgbnVtYmVyLiAgSWYgdGhlIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLCAtMSBpcyByZXR1cm5lZC4KKworICAgSWYgdGhlIGZvbGxvd2luZyBhcmUgYWxzbyBkZWZpbmVkLCB5b3Ugc2hvdWxkCisgICAgICNkZWZpbmUgX19HVEhSRUFEU19DWFgwWCAxCisgICB0byBlbmFibGUgdGhlIGMrKzB4IHRocmVhZCBsaWJyYXJ5LgorCisgICBUeXBlczoKKyAgICAgX19ndGhyZWFkX3QKKyAgICAgX19ndGhyZWFkX3RpbWVfdAorCisgICBJbnRlcmZhY2U6CisgICAgIGludCBfX2d0aHJlYWRfY3JlYXRlIChfX2d0aHJlYWRfdCAqdGhyZWFkLCB2b2lkICooKmZ1bmMpICh2b2lkKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmdzKTsKKyAgICAgaW50IF9fZ3RocmVhZF9qb2luIChfX2d0aHJlYWRfdCB0aHJlYWQsIHZvaWQgKip2YWx1ZV9wdHIpOworICAgICBpbnQgX19ndGhyZWFkX2RldGFjaCAoX19ndGhyZWFkX3QgdGhyZWFkKTsKKyAgICAgaW50IF9fZ3RocmVhZF9lcXVhbCAoX19ndGhyZWFkX3QgdDEsIF9fZ3RocmVhZF90IHQyKTsKKyAgICAgX19ndGhyZWFkX3QgX19ndGhyZWFkX3NlbGYgKHZvaWQpOworICAgICBpbnQgX19ndGhyZWFkX3lpZWxkICh2b2lkKTsKKworICAgICBpbnQgX19ndGhyZWFkX211dGV4X3RpbWVkbG9jayAoX19ndGhyZWFkX211dGV4X3QgKm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2d0aHJlYWRfdGltZV90ICphYnNfdGltZW91dCk7CisgICAgIGludCBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3RpbWVkbG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICptLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19ndGhyZWFkX3RpbWVfdCAqYWJzX3RpbWUpOworCisgICAgIGludCBfX2d0aHJlYWRfY29uZF9zaWduYWwgKF9fZ3RocmVhZF9jb25kX3QgKmNvbmQpOworICAgICBpbnQgX19ndGhyZWFkX2NvbmRfdGltZWR3YWl0IChfX2d0aHJlYWRfY29uZF90ICpjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2d0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZ3RocmVhZF90aW1lX3QgKmFic190aW1lb3V0KTsKKworKi8KKworI2lmIF9fR1hYX1dFQUtfXworLyogVGhlIHBlLWNvZmYgd2VhayBzdXBwb3J0IGlzbid0IGZ1bGx5IGNvbXBhdGlibGUgdG8gRUxGJ3Mgd2Vhay4KKyAgIEZvciBzdGF0aWMgbGlicmFyaWVzIGl0IG1pZ2h0IHdvdWxkIHdvcmssIGJ1dCBhcyB3ZSBuZWVkIHRvIGRlYWwKKyAgIHdpdGggc2hhcmVkIHZlcnNpb25zIHRvbywgd2UgZGlzYWJsZSBpdCBmb3IgbWluZ3ctdGFyZ2V0cy4gICovCisjaWZkZWYgX19NSU5HVzMyX18KKyN1bmRlZiBfR0xJQkNYWF9HVEhSRUFEX1VTRV9XRUFLCisjZGVmaW5lIF9HTElCQ1hYX0dUSFJFQURfVVNFX1dFQUsgMAorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfR1RIUkVBRF9VU0VfV0VBSworI2RlZmluZSBfR0xJQkNYWF9HVEhSRUFEX1VTRV9XRUFLIDEKKyNlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8Yml0cy9ndGhyLWRlZmF1bHQuaD4KKworI2lmbmRlZiBfR0xJQkNYWF9ISURFX0VYUE9SVFMKKyNwcmFnbWEgR0NDIHZpc2liaWxpdHkgcG9wCisjZW5kaWYKKworI2VuZGlmIC8qICEgX0dMSUJDWFhfR0NDX0dUSFJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9tZXNzYWdlc19tZW1iZXJzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL21lc3NhZ2VzX21lbWJlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzA3ZTQ5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9tZXNzYWdlc19tZW1iZXJzLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8vIHN0ZDo6bWVzc2FnZXMgaW1wbGVtZW50YXRpb24gZGV0YWlscywgR05VIHZlcnNpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvbWVzc2FnZXNfbWVtYmVycy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bG9jYWxlfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMi4yLjcuMS4yICBtZXNzYWdlcyBmdW5jdGlvbnMKKy8vCisKKy8vIFdyaXR0ZW4gYnkgQmVuamFtaW4gS29zbmlrIDxia296QHJlZGhhdC5jb20+CisKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBOb24tdmlydHVhbCBtZW1iZXIgZnVuY3Rpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgIG1lc3NhZ2VzPF9DaGFyVD46Om1lc3NhZ2VzKHNpemVfdCBfX3JlZnMpCisgICAgIDogZmFjZXQoX19yZWZzKSwgX01fY19sb2NhbGVfbWVzc2FnZXMoX1NfZ2V0X2NfbG9jYWxlKCkpLCAKKyAgICAgICBfTV9uYW1lX21lc3NhZ2VzKF9TX2dldF9jX25hbWUoKSkKKyAgICAgeyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgICBtZXNzYWdlczxfQ2hhclQ+OjptZXNzYWdlcyhfX2NfbG9jYWxlIF9fY2xvYywgY29uc3QgY2hhciogX19zLCAKKwkJCQlzaXplX3QgX19yZWZzKSAKKyAgICAgOiBmYWNldChfX3JlZnMpLCBfTV9jX2xvY2FsZV9tZXNzYWdlcygwKSwgX01fbmFtZV9tZXNzYWdlcygwKQorICAgICB7CisgICAgICAgaWYgKF9fYnVpbHRpbl9zdHJjbXAoX19zLCBfU19nZXRfY19uYW1lKCkpICE9IDApCisJIHsKKwkgICBjb25zdCBzaXplX3QgX19sZW4gPSBfX2J1aWx0aW5fc3RybGVuKF9fcykgKyAxOworCSAgIGNoYXIqIF9fdG1wID0gbmV3IGNoYXJbX19sZW5dOworCSAgIF9fYnVpbHRpbl9tZW1jcHkoX190bXAsIF9fcywgX19sZW4pOworCSAgIF9NX25hbWVfbWVzc2FnZXMgPSBfX3RtcDsKKwkgfQorICAgICAgIGVsc2UKKwkgX01fbmFtZV9tZXNzYWdlcyA9IF9TX2dldF9jX25hbWUoKTsKKworICAgICAgIC8vIExhc3QgdG8gYXZvaWQgbGVha2luZyBtZW1vcnkgaWYgbmV3IHRocm93cy4KKyAgICAgICBfTV9jX2xvY2FsZV9tZXNzYWdlcyA9IF9TX2Nsb25lX2NfbG9jYWxlKF9fY2xvYyk7CisgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgdHlwZW5hbWUgbWVzc2FnZXM8X0NoYXJUPjo6Y2F0YWxvZyAKKyAgICBtZXNzYWdlczxfQ2hhclQ+OjpvcGVuKGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyPiYgX19zLCBjb25zdCBsb2NhbGUmIF9fbG9jLCAKKwkJCSAgIGNvbnN0IGNoYXIqIF9fZGlyKSBjb25zdAorICAgIHsgCisgICAgICBiaW5kdGV4dGRvbWFpbihfX3MuY19zdHIoKSwgX19kaXIpOworICAgICAgcmV0dXJuIHRoaXMtPmRvX29wZW4oX19zLCBfX2xvYyk7IAorICAgIH0KKworICAvLyBWaXJ0dWFsIG1lbWJlciBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBtZXNzYWdlczxfQ2hhclQ+Ojp+bWVzc2FnZXMoKQorICAgIHsgCisgICAgICBpZiAoX01fbmFtZV9tZXNzYWdlcyAhPSBfU19nZXRfY19uYW1lKCkpCisJZGVsZXRlIFtdIF9NX25hbWVfbWVzc2FnZXM7CisgICAgICBfU19kZXN0cm95X2NfbG9jYWxlKF9NX2NfbG9jYWxlX21lc3NhZ2VzKTsgCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICB0eXBlbmFtZSBtZXNzYWdlczxfQ2hhclQ+OjpjYXRhbG9nIAorICAgIG1lc3NhZ2VzPF9DaGFyVD46OmRvX29wZW4oY29uc3QgYmFzaWNfc3RyaW5nPGNoYXI+JiBfX3MsIAorCQkJICAgICAgY29uc3QgbG9jYWxlJikgY29uc3QKKyAgICB7IAorICAgICAgLy8gTm8gZXJyb3IgY2hlY2tpbmcgaXMgZG9uZSwgYXNzdW1lIHRoZSBjYXRhbG9nIGV4aXN0cyBhbmQgY2FuCisgICAgICAvLyBiZSB1c2VkLgorICAgICAgdGV4dGRvbWFpbihfX3MuY19zdHIoKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIHZvaWQgICAgCisgICAgbWVzc2FnZXM8X0NoYXJUPjo6ZG9fY2xvc2UoY2F0YWxvZykgY29uc3QgCisgICAgeyB9CisKKyAgIC8vIG1lc3NhZ2VzX2J5bmFtZQorICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgICBtZXNzYWdlc19ieW5hbWU8X0NoYXJUPjo6bWVzc2FnZXNfYnluYW1lKGNvbnN0IGNoYXIqIF9fcywgc2l6ZV90IF9fcmVmcykKKyAgICAgOiBtZXNzYWdlczxfQ2hhclQ+KF9fcmVmcykgCisgICAgIHsgCisgICAgICAgaWYgKHRoaXMtPl9NX25hbWVfbWVzc2FnZXMgIT0gbG9jYWxlOjpmYWNldDo6X1NfZ2V0X2NfbmFtZSgpKQorCSB7CisJICAgZGVsZXRlIFtdIHRoaXMtPl9NX25hbWVfbWVzc2FnZXM7CisJICAgaWYgKF9fYnVpbHRpbl9zdHJjbXAoX19zLCBsb2NhbGU6OmZhY2V0OjpfU19nZXRfY19uYW1lKCkpICE9IDApCisJICAgICB7CisJICAgICAgIGNvbnN0IHNpemVfdCBfX2xlbiA9IF9fYnVpbHRpbl9zdHJsZW4oX19zKSArIDE7CisJICAgICAgIGNoYXIqIF9fdG1wID0gbmV3IGNoYXJbX19sZW5dOworCSAgICAgICBfX2J1aWx0aW5fbWVtY3B5KF9fdG1wLCBfX3MsIF9fbGVuKTsKKwkgICAgICAgdGhpcy0+X01fbmFtZV9tZXNzYWdlcyA9IF9fdG1wOworCSAgICAgfQorCSAgIGVsc2UKKwkgICAgIHRoaXMtPl9NX25hbWVfbWVzc2FnZXMgPSBsb2NhbGU6OmZhY2V0OjpfU19nZXRfY19uYW1lKCk7CisJIH0KKworICAgICAgIGlmIChfX2J1aWx0aW5fc3RyY21wKF9fcywgIkMiKSAhPSAwCisJICAgJiYgX19idWlsdGluX3N0cmNtcChfX3MsICJQT1NJWCIpICE9IDApCisJIHsKKwkgICB0aGlzLT5fU19kZXN0cm95X2NfbG9jYWxlKHRoaXMtPl9NX2NfbG9jYWxlX21lc3NhZ2VzKTsKKwkgICB0aGlzLT5fU19jcmVhdGVfY19sb2NhbGUodGhpcy0+X01fY19sb2NhbGVfbWVzc2FnZXMsIF9fcyk7IAorCSB9CisgICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9vcHRfcmFuZG9tLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL29wdF9yYW5kb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTY3YjUwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9vcHRfcmFuZG9tLmgKQEAgLTAsMCArMSwyMTkgQEAKKy8vIE9wdGltaXphdGlvbnMgZm9yIHJhbmRvbSBudW1iZXIgZnVuY3Rpb25zLCB4ODYgdmVyc2lvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9vcHRfcmFuZG9tLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtyYW5kb219CisgKi8KKworI2lmbmRlZiBfQklUU19PUFRfUkFORE9NX0gKKyNkZWZpbmUgX0JJVFNfT1BUX1JBTkRPTV9IIDEKKworI2luY2x1ZGUgPHg4NmludHJpbi5oPgorCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyNpZmRlZiBfX1NTRTNfXworICB0ZW1wbGF0ZTw+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB2b2lkCisgICAgICBub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT46OgorICAgICAgX19nZW5lcmF0ZSh0eXBlbmFtZSBub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT46OnJlc3VsdF90eXBlKiBfX2YsCisJCSB0eXBlbmFtZSBub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT46OnJlc3VsdF90eXBlKiBfX3QsCisJCSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwl0eXBlZGVmIHVpbnQ2NF90IF9fdWN0eXBlOworCisJaWYgKF9fZiA9PSBfX3QpCisJICByZXR1cm47CisKKwlpZiAoX01fc2F2ZWRfYXZhaWxhYmxlKQorCSAgeworCSAgICBfTV9zYXZlZF9hdmFpbGFibGUgPSBmYWxzZTsKKwkgICAgKl9fZisrID0gX01fc2F2ZWQgKiBfX3BhcmFtLnN0ZGRldigpICsgX19wYXJhbS5tZWFuKCk7CisKKwkgICAgaWYgKF9fZiA9PSBfX3QpCisJICAgICAgcmV0dXJuOworCSAgfQorCisJY29uc3RleHByIHVpbnQ2NF90IF9fbWFza3ZhbCA9IDB4ZmZmZmZmZmZmZmZmZnVsbDsKKwlzdGF0aWMgY29uc3QgX19tMTI4aSBfX21hc2sgPSBfbW1fc2V0MV9lcGk2NHgoX19tYXNrdmFsKTsKKwlzdGF0aWMgY29uc3QgX19tMTI4aSBfX3R3byA9IF9tbV9zZXQxX2VwaTY0eCgweDQwMDAwMDAwMDAwMDAwMDB1bGwpOworCXN0YXRpYyBjb25zdCBfX20xMjhkIF9fdGhyZWUgPSBfbW1fc2V0MV9wZCgzLjApOworCWNvbnN0IF9fbTEyOGQgX19hdiA9IF9tbV9zZXQxX3BkKF9fcGFyYW0ubWVhbigpKTsKKworCWNvbnN0IF9fdWN0eXBlIF9fdXJuZ21pbiA9IF9fdXJuZy5taW4oKTsKKwljb25zdCBfX3VjdHlwZSBfX3VybmdtYXggPSBfX3VybmcubWF4KCk7CisJY29uc3QgX191Y3R5cGUgX191cm5ncmFuZ2UgPSBfX3VybmdtYXggLSBfX3VybmdtaW47CisJY29uc3QgX191Y3R5cGUgX191ZXJuZ3JhbmdlID0gX191cm5ncmFuZ2UgKyAxOworCisJd2hpbGUgKF9fZiArIDEgPCBfX3QpCisJICB7CisJICAgIGRvdWJsZSBfX2xlOworCSAgICBfX20xMjhkIF9feDsKKwkgICAgZG8KKwkgICAgICB7CisgICAgICAgICAgICAgICAgdW5pb24KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfX20xMjhpIF9faTsKKyAgICAgICAgICAgICAgICAgIF9fbTEyOGQgX19kOworCQl9IF9fdjsKKworCQlpZiAoX191cm5ncmFuZ2UgPiBfX21hc2t2YWwpCisJCSAgeworCQkgICAgaWYgKF9fZGV0YWlsOjpfUG93ZXJfb2ZfMihfX3Vlcm5ncmFuZ2UpKQorCQkgICAgICBfX3YuX19pID0gX21tX2FuZF9zaTEyOChfbW1fc2V0X2VwaTY0eChfX3VybmcoKSwKKwkJCQkJCQkgICAgIF9fdXJuZygpKSwKKwkJCQkJICAgICAgX19tYXNrKTsKKwkJICAgIGVsc2UKKwkJICAgICAgeworCQkJY29uc3QgX191Y3R5cGUgX191ZXJhbmdlID0gX19tYXNrdmFsICsgMTsKKwkJCWNvbnN0IF9fdWN0eXBlIF9fc2NhbGluZyA9IF9fdXJuZ3JhbmdlIC8gX191ZXJhbmdlOworCQkJY29uc3QgX191Y3R5cGUgX19wYXN0ID0gX191ZXJhbmdlICogX19zY2FsaW5nOworCQkJdWludDY0X3QgX192MTsKKwkJCWRvCisJCQkgIF9fdjEgPSBfX3VjdHlwZShfX3VybmcoKSkgLSBfX3VybmdtaW47CisJCQl3aGlsZSAoX192MSA+PSBfX3Bhc3QpOworCQkJX192MSAvPSBfX3NjYWxpbmc7CisJCQl1aW50NjRfdCBfX3YyOworCQkJZG8KKwkJCSAgX192MiA9IF9fdWN0eXBlKF9fdXJuZygpKSAtIF9fdXJuZ21pbjsKKwkJCXdoaWxlIChfX3YyID49IF9fcGFzdCk7CisJCQlfX3YyIC89IF9fc2NhbGluZzsKKworCQkJX192Ll9faSA9IF9tbV9zZXRfZXBpNjR4KF9fdjEsIF9fdjIpOworCQkgICAgICB9CisJCSAgfQorCQllbHNlIGlmIChfX3VybmdyYW5nZSA9PSBfX21hc2t2YWwpCisJCSAgX192Ll9faSA9IF9tbV9zZXRfZXBpNjR4KF9fdXJuZygpLCBfX3VybmcoKSk7CisJCWVsc2UgaWYgKChfX3VybmdyYW5nZSArIDIpICogX191cm5ncmFuZ2UgPj0gX19tYXNrdmFsCisJCQkgJiYgX19kZXRhaWw6Ol9Qb3dlcl9vZl8yKF9fdWVybmdyYW5nZSkpCisJCSAgeworCQkgICAgdWludDY0X3QgX192MSA9IF9fdXJuZygpICogX191ZXJuZ3JhbmdlICsgX191cm5nKCk7CisJCSAgICB1aW50NjRfdCBfX3YyID0gX191cm5nKCkgKiBfX3Vlcm5ncmFuZ2UgKyBfX3VybmcoKTsKKworCQkgICAgX192Ll9faSA9IF9tbV9hbmRfc2kxMjgoX21tX3NldF9lcGk2NHgoX192MSwgX192MiksCisJCQkJCSAgICBfX21hc2spOworCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIHNpemVfdCBfX25ybmcgPSAyOworCQkgICAgX191Y3R5cGUgX19oaWdoID0gX19tYXNrdmFsIC8gX191ZXJuZ3JhbmdlIC8gX191ZXJuZ3JhbmdlOworCQkgICAgd2hpbGUgKF9faGlnaCA+IF9fdWVybmdyYW5nZSkKKwkJICAgICAgeworCQkJKytfX25ybmc7CisJCQlfX2hpZ2ggLz0gX191ZXJuZ3JhbmdlOworCQkgICAgICB9CisJCSAgICBjb25zdCBfX3VjdHlwZSBfX2hpZ2hyYW5nZSA9IF9faGlnaCArIDE7CisJCSAgICBjb25zdCBfX3VjdHlwZSBfX3NjYWxpbmcgPSBfX3VybmdyYW5nZSAvIF9faGlnaHJhbmdlOworCQkgICAgY29uc3QgX191Y3R5cGUgX19wYXN0ID0gX19oaWdocmFuZ2UgKiBfX3NjYWxpbmc7CisJCSAgICBfX3VjdHlwZSBfX3RtcDsKKworCQkgICAgdWludDY0X3QgX192MTsKKwkJICAgIGRvCisJCSAgICAgIHsKKwkJCWRvCisJCQkgIF9fdG1wID0gX191Y3R5cGUoX191cm5nKCkpIC0gX191cm5nbWluOworCQkJd2hpbGUgKF9fdG1wID49IF9fcGFzdCk7CisJCQlfX3YxID0gX190bXAgLyBfX3NjYWxpbmc7CisJCQlmb3IgKHNpemVfdCBfX2NudCA9IDA7IF9fY250IDwgX19ucm5nOyArK19fY250KQorCQkJICB7CisJCQkgICAgX190bXAgPSBfX3YxOworCQkJICAgIF9fdjEgKj0gX191ZXJuZ3JhbmdlOworCQkJICAgIF9fdjEgKz0gX191Y3R5cGUoX191cm5nKCkpIC0gX191cm5nbWluOworCQkJICB9CisJCSAgICAgIH0KKwkJICAgIHdoaWxlIChfX3YxID4gX19tYXNrdmFsIHx8IF9fdjEgPCBfX3RtcCk7CisKKwkJICAgIHVpbnQ2NF90IF9fdjI7CisJCSAgICBkbworCQkgICAgICB7CisJCQlkbworCQkJICBfX3RtcCA9IF9fdWN0eXBlKF9fdXJuZygpKSAtIF9fdXJuZ21pbjsKKwkJCXdoaWxlIChfX3RtcCA+PSBfX3Bhc3QpOworCQkJX192MiA9IF9fdG1wIC8gX19zY2FsaW5nOworCQkJZm9yIChzaXplX3QgX19jbnQgPSAwOyBfX2NudCA8IF9fbnJuZzsgKytfX2NudCkKKwkJCSAgeworCQkJICAgIF9fdG1wID0gX192MjsKKwkJCSAgICBfX3YyICo9IF9fdWVybmdyYW5nZTsKKwkJCSAgICBfX3YyICs9IF9fdWN0eXBlKF9fdXJuZygpKSAtIF9fdXJuZ21pbjsKKwkJCSAgfQorCQkgICAgICB9CisJCSAgICB3aGlsZSAoX192MiA+IF9fbWFza3ZhbCB8fCBfX3YyIDwgX190bXApOworCQkgICAgCisJCSAgICBfX3YuX19pID0gX21tX3NldF9lcGk2NHgoX192MSwgX192Mik7CisJCSAgfQorCisJCV9fdi5fX2kgPSBfbW1fb3Jfc2kxMjgoX192Ll9faSwgX190d28pOworCQlfX3ggPSBfbW1fc3ViX3BkKF9fdi5fX2QsIF9fdGhyZWUpOworCQlfX20xMjhkIF9fbSA9IF9tbV9tdWxfcGQoX194LCBfX3gpOworCQlfX2xlID0gX21tX2N2dHNkX2Y2NChfbW1faGFkZF9wZCAoX19tLCBfX20pKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKF9fbGUgPT0gMC4wIHx8IF9fbGUgPj0gMS4wKTsKKworICAgICAgICAgICAgZG91YmxlIF9fbXVsdCA9IChzdGQ6OnNxcnQoLTIuMCAqIHN0ZDo6bG9nKF9fbGUpIC8gX19sZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBfX3BhcmFtLnN0ZGRldigpKTsKKworICAgICAgICAgICAgX194ID0gX21tX2FkZF9wZChfbW1fbXVsX3BkKF9feCwgX21tX3NldDFfcGQoX19tdWx0KSksIF9fYXYpOworCisgICAgICAgICAgICBfbW1fc3RvcmV1X3BkKF9fZiwgX194KTsKKyAgICAgICAgICAgIF9fZiArPSAyOworICAgICAgICAgIH0KKworICAgICAgICBpZiAoX19mICE9IF9fdCkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXN1bHRfdHlwZSBfX3gsIF9feSwgX19yMjsKKworICAgICAgICAgICAgX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCByZXN1bHRfdHlwZT4KKyAgICAgICAgICAgICAgX19hdXJuZyhfX3VybmcpOworCisgICAgICAgICAgICBkbworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX194ID0gcmVzdWx0X3R5cGUoMi4wKSAqIF9fYXVybmcoKSAtIDEuMDsKKyAgICAgICAgICAgICAgICBfX3kgPSByZXN1bHRfdHlwZSgyLjApICogX19hdXJuZygpIC0gMS4wOworICAgICAgICAgICAgICAgIF9fcjIgPSBfX3ggKiBfX3ggKyBfX3kgKiBfX3k7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChfX3IyID4gMS4wIHx8IF9fcjIgPT0gMC4wKTsKKworICAgICAgICAgICAgY29uc3QgcmVzdWx0X3R5cGUgX19tdWx0ID0gc3RkOjpzcXJ0KC0yICogc3RkOjpsb2coX19yMikgLyBfX3IyKTsKKyAgICAgICAgICAgIF9NX3NhdmVkID0gX194ICogX19tdWx0OworICAgICAgICAgICAgX01fc2F2ZWRfYXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICpfX2YgPSBfX3kgKiBfX211bHQgKiBfX3BhcmFtLnN0ZGRldigpICsgX19wYXJhbS5tZWFuKCk7CisgICAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisKKyNlbmRpZiAvLyBfQklUU19PUFRfUkFORE9NX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvb3NfZGVmaW5lcy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9vc19kZWZpbmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlNDA3NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvb3NfZGVmaW5lcy5oCkBAIC0wLDAgKzEsNDggQEAKKy8vIFNwZWNpZmljIGRlZmluaXRpb25zIGZvciBHTlUvTGludXggIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL29zX2RlZmluZXMuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2lvc2Z3ZH0KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX09TX0RFRklORVMKKyNkZWZpbmUgX0dMSUJDWFhfT1NfREVGSU5FUyAxCisKKy8vIFN5c3RlbS1zcGVjaWZpYyAjZGVmaW5lLCB0eXBlZGVmcywgY29ycmVjdGlvbnMsIGV0YywgZ28gaGVyZS4gIFRoaXMKKy8vIGZpbGUgd2lsbCBjb21lIGJlZm9yZSBhbGwgb3RoZXJzLgorCisvLyBUaGlzIGtlZXBzIGlzYW51bSwgZXQgYWwgZnJvbSBiZWluZyBwcm9wYWdhdGVkIGFzIG1hY3Jvcy4KKyNkZWZpbmUgX19OT19DVFlQRSAxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvLyBQcm92aWRlIGEgZGVjbGFyYXRpb24gZm9yIHRoZSBwb3NzaWJseSBkZXByZWNhdGVkIGdldHMgZnVuY3Rpb24sIGFzCisvLyBnbGliYyAyLjE1IGFuZCBsYXRlciBkb2VzIG5vdCBkZWNsYXJlIGdldHMgZm9yIElTTyBDMTEgd2hlbgorLy8gX19HTlVfU09VUkNFIGlzIGRlZmluZWQuCisjaWYgX19HTElCQ19QUkVSRVEoMiwxNSkgJiYgZGVmaW5lZChfR05VX1NPVVJDRSkKKyMgdW5kZWYgX0dMSUJDWFhfSEFWRV9HRVRTCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9iaXRzL3N0ZGMrKy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9zdGRjKysuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTUzNzdkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9zdGRjKysuaApAQCAtMCwwICsxLDExNyBAQAorLy8gQysrIGluY2x1ZGVzIHVzZWQgZm9yIHByZWNvbXBpbGluZyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgc3RkYysrLmgKKyAqICBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGZpbGUgZm9yIGEgcHJlY29tcGlsZWQgaGVhZGVyLgorICovCisKKy8vIDE3LjQuMS4yIEhlYWRlcnMKKworLy8gQworI2lmbmRlZiBfR0xJQkNYWF9OT19BU1NFUlQKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2VuZGlmCisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPGNlcnJubz4KKyNpbmNsdWRlIDxjZmxvYXQ+CisjaW5jbHVkZSA8Y2lzbzY0Nj4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPGNsb2NhbGU+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8Y3NldGptcD4KKyNpbmNsdWRlIDxjc2lnbmFsPgorI2luY2x1ZGUgPGNzdGRhcmc+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGN0aW1lPgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorI2luY2x1ZGUgPGNjb21wbGV4PgorI2luY2x1ZGUgPGNmZW52PgorI2luY2x1ZGUgPGNpbnR0eXBlcz4KKyNpbmNsdWRlIDxjc3RkYWxpZ24+CisjaW5jbHVkZSA8Y3N0ZGJvb2w+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjdGdtYXRoPgorI2luY2x1ZGUgPGN3Y2hhcj4KKyNpbmNsdWRlIDxjd2N0eXBlPgorI2VuZGlmCisKKy8vIEMrKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8Y29tcGxleD4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxleGNlcHRpb24+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zPgorI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxpc3RyZWFtPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPGxvY2FsZT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxudW1lcmljPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RhY2s+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHN0cmVhbWJ1Zj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZWluZm8+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2YWxhcnJheT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8Zm9yd2FyZF9saXN0PgorI2luY2x1ZGUgPGZ1dHVyZT4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHJhbmRvbT4KKyNpbmNsdWRlIDxyYXRpbz4KKyNpbmNsdWRlIDxyZWdleD4KKyNpbmNsdWRlIDxzY29wZWRfYWxsb2NhdG9yPgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dHlwZWluZGV4PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy9zdGR0cjFjKysuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvc3RkdHIxYysrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiZjEzNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvc3RkdHIxYysrLmgKQEAgLTAsMCArMSw1MyBAQAorLy8gQysrIGluY2x1ZGVzIHVzZWQgZm9yIHByZWNvbXBpbGluZyBUUjEgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHN0ZHRyMWMrKy5oCisgKiAgVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBmaWxlIGZvciBhIHByZWNvbXBpbGVkIGhlYWRlci4KKyAqLworCisjaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KKworI2luY2x1ZGUgPHRyMS9hcnJheT4KKyNpbmNsdWRlIDx0cjEvY2N0eXBlPgorI2luY2x1ZGUgPHRyMS9jZmVudj4KKyNpbmNsdWRlIDx0cjEvY2Zsb2F0PgorI2luY2x1ZGUgPHRyMS9jaW50dHlwZXM+CisjaW5jbHVkZSA8dHIxL2NsaW1pdHM+CisjaW5jbHVkZSA8dHIxL2NtYXRoPgorI2luY2x1ZGUgPHRyMS9jb21wbGV4PgorI2luY2x1ZGUgPHRyMS9jc3RkYXJnPgorI2luY2x1ZGUgPHRyMS9jc3RkYm9vbD4KKyNpbmNsdWRlIDx0cjEvY3N0ZGludD4KKyNpbmNsdWRlIDx0cjEvY3N0ZGlvPgorI2luY2x1ZGUgPHRyMS9jc3RkbGliPgorI2luY2x1ZGUgPHRyMS9jdGdtYXRoPgorI2luY2x1ZGUgPHRyMS9jdGltZT4KKyNpbmNsdWRlIDx0cjEvY3djaGFyPgorI2luY2x1ZGUgPHRyMS9jd2N0eXBlPgorI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgorI2luY2x1ZGUgPHRyMS9yYW5kb20+CisjaW5jbHVkZSA8dHIxL3R1cGxlPgorI2luY2x1ZGUgPHRyMS91bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHRyMS91bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHRyMS91dGlsaXR5PgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuOC94ODZfNjQtbGludXgvYml0cy90aW1lX21lbWJlcnMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvdGltZV9tZW1iZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdiM2NjMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2JpdHMvdGltZV9tZW1iZXJzLmgKQEAgLTAsMCArMSw4OSBAQAorLy8gc3RkOjp0aW1lX2dldCwgc3RkOjp0aW1lX3B1dCBpbXBsZW1lbnRhdGlvbiwgR05VIHZlcnNpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvdGltZV9tZW1iZXJzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtsb2NhbGV9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIyLjIuNS4xLjIgLSB0aW1lX2dldCBmdW5jdGlvbnMKKy8vIElTTyBDKysgMTQ4ODI6IDIyLjIuNS4zLjIgLSB0aW1lX3B1dCBmdW5jdGlvbnMKKy8vCisKKy8vIFdyaXR0ZW4gYnkgQmVuamFtaW4gS29zbmlrIDxia296QHJlZGhhdC5jb20+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgX190aW1lcHVuY3Q8X0NoYXJUPjo6X190aW1lcHVuY3Qoc2l6ZV90IF9fcmVmcykgCisgICAgOiBmYWNldChfX3JlZnMpLCBfTV9kYXRhKDApLCBfTV9jX2xvY2FsZV90aW1lcHVuY3QoMCksIAorICAgICAgX01fbmFtZV90aW1lcHVuY3QoX1NfZ2V0X2NfbmFtZSgpKQorICAgIHsgX01faW5pdGlhbGl6ZV90aW1lcHVuY3QoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBfX3RpbWVwdW5jdDxfQ2hhclQ+OjpfX3RpbWVwdW5jdChfX2NhY2hlX3R5cGUqIF9fY2FjaGUsIHNpemVfdCBfX3JlZnMpIAorICAgIDogZmFjZXQoX19yZWZzKSwgX01fZGF0YShfX2NhY2hlKSwgX01fY19sb2NhbGVfdGltZXB1bmN0KDApLCAKKyAgICAgIF9NX25hbWVfdGltZXB1bmN0KF9TX2dldF9jX25hbWUoKSkKKyAgICB7IF9NX2luaXRpYWxpemVfdGltZXB1bmN0KCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgX190aW1lcHVuY3Q8X0NoYXJUPjo6X190aW1lcHVuY3QoX19jX2xvY2FsZSBfX2Nsb2MsIGNvbnN0IGNoYXIqIF9fcywKKwkJCQkgICAgIHNpemVfdCBfX3JlZnMpIAorICAgIDogZmFjZXQoX19yZWZzKSwgX01fZGF0YSgwKSwgX01fY19sb2NhbGVfdGltZXB1bmN0KDApLCAKKyAgICAgIF9NX25hbWVfdGltZXB1bmN0KDApCisgICAgeworICAgICAgaWYgKF9fYnVpbHRpbl9zdHJjbXAoX19zLCBfU19nZXRfY19uYW1lKCkpICE9IDApCisJeworCSAgY29uc3Qgc2l6ZV90IF9fbGVuID0gX19idWlsdGluX3N0cmxlbihfX3MpICsgMTsKKwkgIGNoYXIqIF9fdG1wID0gbmV3IGNoYXJbX19sZW5dOworCSAgX19idWlsdGluX21lbWNweShfX3RtcCwgX19zLCBfX2xlbik7CisJICBfTV9uYW1lX3RpbWVwdW5jdCA9IF9fdG1wOworCX0KKyAgICAgIGVsc2UKKwlfTV9uYW1lX3RpbWVwdW5jdCA9IF9TX2dldF9jX25hbWUoKTsKKworICAgICAgX190cnkKKwl7IF9NX2luaXRpYWxpemVfdGltZXB1bmN0KF9fY2xvYyk7IH0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIGlmIChfTV9uYW1lX3RpbWVwdW5jdCAhPSBfU19nZXRfY19uYW1lKCkpCisJICAgIGRlbGV0ZSBbXSBfTV9uYW1lX3RpbWVwdW5jdDsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIF9fdGltZXB1bmN0PF9DaGFyVD46On5fX3RpbWVwdW5jdCgpCisgICAgeyAKKyAgICAgIGlmIChfTV9uYW1lX3RpbWVwdW5jdCAhPSBfU19nZXRfY19uYW1lKCkpCisJZGVsZXRlIFtdIF9NX25hbWVfdGltZXB1bmN0OworICAgICAgZGVsZXRlIF9NX2RhdGE7IAorICAgICAgX1NfZGVzdHJveV9jX2xvY2FsZShfTV9jX2xvY2FsZV90aW1lcHVuY3QpOyAKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjgveDg2XzY0LWxpbnV4L2V4dC9vcHRfcmFuZG9tLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9leHQvb3B0X3JhbmRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NzViMDYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC44L3g4Nl82NC1saW51eC9leHQvb3B0X3JhbmRvbS5oCkBAIC0wLDAgKzEsMTQwIEBACisvLyBPcHRpbWl6YXRpb25zIGZvciByYW5kb20gbnVtYmVyIGV4dGVuc2lvbnMsIHg4NiB2ZXJzaW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvcmFuZG9tLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2V4dC9yYW5kb219CisgKi8KKworI2lmbmRlZiBfRVhUX09QVF9SQU5ET01fSAorI2RlZmluZSBfRVhUX09QVF9SQU5ET01fSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmIF9fQllURV9PUkRFUl9fID09IF9fT1JERVJfTElUVExFX0VORElBTl9fCisKKyNpZmRlZiBfX1NTRTJfXworCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgbmFtZXNwYWNlIHsKKworICAgIHRlbXBsYXRlPHNpemVfdCBfX3NsMSwgc2l6ZV90IF9fc2wyLCBzaXplX3QgX19zcjEsIHNpemVfdCBfX3NyMiwKKwkgICAgIHVpbnQzMl90IF9fbXNrMSwgdWludDMyX3QgX19tc2syLCB1aW50MzJfdCBfX21zazMsIHVpbnQzMl90IF9fbXNrND4KKyAgICAgIGlubGluZSBfX20xMjhpIF9fc3NlMl9yZWN1cnNpb24oX19tMTI4aSBfX2EsIF9fbTEyOGkgX19iLAorCQkJCSAgICAgIF9fbTEyOGkgX19jLCBfX20xMjhpIF9fZCkKKyAgICAgIHsKKwlfX20xMjhpIF9feSA9IF9tbV9zcmxpX2VwaTMyKF9fYiwgX19zcjEpOworCV9fbTEyOGkgX196ID0gX21tX3NybGlfc2kxMjgoX19jLCBfX3NyMik7CisJX19tMTI4aSBfX3YgPSBfbW1fc2xsaV9lcGkzMihfX2QsIF9fc2wxKTsKKwlfX3ogPSBfbW1feG9yX3NpMTI4KF9feiwgX19hKTsKKwlfX3ogPSBfbW1feG9yX3NpMTI4KF9feiwgX192KTsKKwlfX20xMjhpIF9feCA9IF9tbV9zbGxpX3NpMTI4KF9fYSwgX19zbDIpOworCV9feSA9IF9tbV9hbmRfc2kxMjgoX195LCBfbW1fc2V0X2VwaTMyKF9fbXNrNCwgX19tc2szLCBfX21zazIsIF9fbXNrMSkpOworCV9feiA9IF9tbV94b3Jfc2kxMjgoX196LCBfX3gpOworCXJldHVybiBfbW1feG9yX3NpMTI4KF9feiwgX195KTsKKyAgICAgIH0KKworICB9CisKKworI2RlZmluZSBfR0xJQkNYWF9PUFRfSEFWRV9SQU5ET01fU0ZNVF9HRU5fUkVBRAkxCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fbSwKKwkgICBzaXplX3QgX19wb3MxLCBzaXplX3QgX19zbDEsIHNpemVfdCBfX3NsMiwKKwkgICBzaXplX3QgX19zcjEsIHNpemVfdCBfX3NyMiwKKwkgICB1aW50MzJfdCBfX21zazEsIHVpbnQzMl90IF9fbXNrMiwKKwkgICB1aW50MzJfdCBfX21zazMsIHVpbnQzMl90IF9fbXNrNCwKKwkgICB1aW50MzJfdCBfX3Bhcml0eTEsIHVpbnQzMl90IF9fcGFyaXR5MiwKKwkgICB1aW50MzJfdCBfX3Bhcml0eTMsIHVpbnQzMl90IF9fcGFyaXR5ND4KKyAgICB2b2lkIHNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fbSwKKwkJCQkJICAgX19wb3MxLCBfX3NsMSwgX19zbDIsIF9fc3IxLCBfX3NyMiwKKwkJCQkJICAgX19tc2sxLCBfX21zazIsIF9fbXNrMywgX19tc2s0LAorCQkJCQkgICBfX3Bhcml0eTEsIF9fcGFyaXR5MiwgX19wYXJpdHkzLAorCQkJCQkgICBfX3Bhcml0eTQ+OjoKKyAgICBfTV9nZW5fcmFuZCh2b2lkKQorICAgIHsKKyAgICAgIF9fbTEyOGkgX19yMSA9IF9tbV9sb2FkX3NpMTI4KCZfTV9zdGF0ZVtfTV9uc3RhdGUgLSAyXSk7CisgICAgICBfX20xMjhpIF9fcjIgPSBfbW1fbG9hZF9zaTEyOCgmX01fc3RhdGVbX01fbnN0YXRlIC0gMV0pOworCisgICAgICBzaXplX3QgX19pOworICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfTV9uc3RhdGUgLSBfX3BvczE7ICsrX19pKQorCXsKKwkgIF9fbTEyOGkgX19yID0gX19zc2UyX3JlY3Vyc2lvbjxfX3NsMSwgX19zbDIsIF9fc3IxLCBfX3NyMiwKKwkJCQkJIF9fbXNrMSwgX19tc2syLCBfX21zazMsIF9fbXNrND4KKwkgICAgKF9NX3N0YXRlW19faV0sIF9NX3N0YXRlW19faSArIF9fcG9zMV0sIF9fcjEsIF9fcjIpOworCSAgX21tX3N0b3JlX3NpMTI4KCZfTV9zdGF0ZVtfX2ldLCBfX3IpOworCSAgX19yMSA9IF9fcjI7CisJICBfX3IyID0gX19yOworCX0KKyAgICAgIGZvciAoOyBfX2kgPCBfTV9uc3RhdGU7ICsrX19pKQorCXsKKwkgIF9fbTEyOGkgX19yID0gX19zc2UyX3JlY3Vyc2lvbjxfX3NsMSwgX19zbDIsIF9fc3IxLCBfX3NyMiwKKwkJCQkJIF9fbXNrMSwgX19tc2syLCBfX21zazMsIF9fbXNrND4KKwkgICAgKF9NX3N0YXRlW19faV0sIF9NX3N0YXRlW19faSArIF9fcG9zMSAtIF9NX25zdGF0ZV0sIF9fcjEsIF9fcjIpOworCSAgX21tX3N0b3JlX3NpMTI4KCZfTV9zdGF0ZVtfX2ldLCBfX3IpOworCSAgX19yMSA9IF9fcjI7CisJICBfX3IyID0gX19yOworCX0KKworICAgICAgX01fcG9zID0gMDsKKyAgICB9CisKKworI2RlZmluZSBfR0xJQkNYWF9PUFRfSEFWRV9SQU5ET01fU0ZNVF9PUEVSQVRPUkVRVUFMCTEKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX19tLAorCSAgIHNpemVfdCBfX3BvczEsIHNpemVfdCBfX3NsMSwgc2l6ZV90IF9fc2wyLAorCSAgIHNpemVfdCBfX3NyMSwgc2l6ZV90IF9fc3IyLAorCSAgIHVpbnQzMl90IF9fbXNrMSwgdWludDMyX3QgX19tc2syLAorCSAgIHVpbnQzMl90IF9fbXNrMywgdWludDMyX3QgX19tc2s0LAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MSwgdWludDMyX3QgX19wYXJpdHkyLAorCSAgIHVpbnQzMl90IF9fcGFyaXR5MywgdWludDMyX3QgX19wYXJpdHk0PgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9fZ251X2N4eDo6c2ltZF9mYXN0X21lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwKKwkgICAgICAgX19tLCBfX3BvczEsIF9fc2wxLCBfX3NsMiwgX19zcjEsIF9fc3IyLAorCSAgICAgICBfX21zazEsIF9fbXNrMiwgX19tc2szLCBfX21zazQsCisJICAgICAgIF9fcGFyaXR5MSwgX19wYXJpdHkyLCBfX3Bhcml0eTMsIF9fcGFyaXR5ND4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX2dudV9jeHg6OnNpbWRfZmFzdF9tZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsCisJICAgICAgIF9fbSwgX19wb3MxLCBfX3NsMSwgX19zbDIsIF9fc3IxLCBfX3NyMiwKKwkgICAgICAgX19tc2sxLCBfX21zazIsIF9fbXNrMywgX19tc2s0LAorCSAgICAgICBfX3Bhcml0eTEsIF9fcGFyaXR5MiwgX19wYXJpdHkzLCBfX3Bhcml0eTQ+JiBfX3JocykKKyAgICB7CisgICAgICBfX20xMjhpIF9fcmVzID0gX21tX2NtcGVxX2VwaTgoX19saHMuX01fc3RhdGVbMF0sIF9fcmhzLl9NX3N0YXRlWzBdKTsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDE7IF9faSA8IF9fbGhzLl9NX25zdGF0ZTsgKytfX2kpCisJX19yZXMgPSBfbW1fYW5kX3NpMTI4KF9fcmVzLCBfbW1fY21wZXFfZXBpOChfX2xocy5fTV9zdGF0ZVtfX2ldLAorCQkJCQkJICAgIF9fcmhzLl9NX3N0YXRlW19faV0pKTsKKyAgICAgIHJldHVybiAoX21tX21vdmVtYXNrX2VwaTgoX19yZXMpID09IDB4ZmZmZgorCSAgICAgICYmIF9fbGhzLl9NX3BvcyA9PSBfX3Jocy5fTV9wb3MpOworICAgIH0KKworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBfX1NTRTJfXworCisjZW5kaWYgLy8gX19CWVRFX09SREVSX18gPT0gX19PUkRFUl9MSVRUTEVfRU5ESUFOX18KKworI2VuZGlmIC8vIF9FWFRfT1BUX1JBTkRPTV9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueCBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNWM4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueApAQCAtMCwwICsxLDIyNiBAQAorLyogRGVmYXVsdCBsaW5rZXIgc2NyaXB0LCBmb3Igbm9ybWFsIGV4ZWN1dGFibGVzICovCisvKiBNb2RpZmllZCBmb3IgQW5kcm9pZC4gICovCitPVVRQVVRfRk9STUFUKCJlbGYzMi14ODYtNjQiLCAiZWxmMzIteDg2LTY0IiwKKwkgICAgICAiZWxmMzIteDg2LTY0IikKK09VVFBVVF9BUkNIKGkzODY6eDY0LTMyKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDB4NDAwMDAwKTsgLiA9IDB4NDAwMDAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgICA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgICA6IHsgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWxhLmZpbmkgICAgICA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgICA6IHsgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsYS5kYXRhLnJlbC5ybyAgIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvIC5yZWxhLmRhdGEucmVsLnJvLiogLnJlbGEuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLnJlbGEuZGF0YSAgICAgIDogeyAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopIH0KKyAgLnJlbGEudGRhdGEJICA6IHsgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC5yZWxhLnRic3MJICA6IHsgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikgfQorICAucmVsYS5jdG9ycyAgICAgOiB7ICooLnJlbGEuY3RvcnMpIH0KKyAgLnJlbGEuZHRvcnMgICAgIDogeyAqKC5yZWxhLmR0b3JzKSB9CisgIC5yZWxhLmdvdCAgICAgICA6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbGEuYnNzICAgICAgIDogeyAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKSB9CisgIC5yZWxhLmxkYXRhICAgICA6IHsgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopIH0KKyAgLnJlbGEubGJzcyAgICAgIDogeyAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKSB9CisgIC5yZWxhLmxyb2RhdGEgICA6IHsgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikgfQorICAucmVsYS5pZnVuYyAgICAgOiB7ICooLnJlbGEuaWZ1bmMpIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDI0ID8gMjQgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oMzIgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDMyIC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54Ym4gYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueGJuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YWQyNTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueGJuCkBAIC0wLDAgKzEsMjIzIEBACisvKiBTY3JpcHQgZm9yIC1OOiBtaXggdGV4dCBhbmQgZGF0YSBvbiBzYW1lIHBhZ2U7IGRvbid0IGFsaWduIGRhdGEgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLXg4Ni02NCIsICJlbGYzMi14ODYtNjQiLAorCSAgICAgICJlbGYzMi14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4NjQtMzIpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMHg0MDAwMDApOyAuID0gMHg0MDAwMDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAgIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAgIDogeyAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbGEuZmluaSAgICAgIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAgIDogeyAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8gLnJlbGEuZGF0YS5yZWwucm8uKiAucmVsYS5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsYS5kYXRhICAgICAgOiB7ICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsYS50ZGF0YQkgIDogeyAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbGEudGJzcwkgIDogeyAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWxhLmN0b3JzICAgICA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgICAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAgIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgICAgOiB7ICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbGEubGRhdGEgICAgIDogeyAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikgfQorICAucmVsYS5sYnNzICAgICAgOiB7ICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopIH0KKyAgLnJlbGEubHJvZGF0YSAgIDogeyAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKSB9CisgIC5yZWxhLmlmdW5jICAgICA6IHsgKigucmVsYS5pZnVuYykgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gLjsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTigzMiAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gMzIgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54YyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2U0YWIwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0LnhjCkBAIC0wLDAgKzEsMjI3IEBACisvKiBTY3JpcHQgZm9yIC16IGNvbWJyZWxvYzogY29tYmluZSBhbmQgc29ydCByZWxvYyBzZWN0aW9ucyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzIteDg2LTY0IiwgImVsZjMyLXg4Ni02NCIsCisJICAgICAgImVsZjMyLXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong2NC0zMikKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAweDQwMDAwMCk7IC4gPSAweDQwMDAwMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikKKyAgICAgICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopCisgICAgICAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKQorICAgICAgKigucmVsYS5pZnVuYykKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAyNCA/IDI0IDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyAzMiAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueGQgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1OTRhNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54ZApAQCAtMCwwICsxLDIyNSBAQAorLyogU2NyaXB0IGZvciBsZCAtcGllOiBsaW5rIHBvc2l0aW9uIGluZGVwZW5kZW50IGV4ZWN1dGFibGUgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLXg4Ni02NCIsICJlbGYzMi14ODYtNjQiLAorCSAgICAgICJlbGYzMi14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4NjQtMzIpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMCk7IC4gPSAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgICA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgICA6IHsgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWxhLmZpbmkgICAgICA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgICA6IHsgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsYS5kYXRhLnJlbC5ybyAgIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvIC5yZWxhLmRhdGEucmVsLnJvLiogLnJlbGEuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLnJlbGEuZGF0YSAgICAgIDogeyAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopIH0KKyAgLnJlbGEudGRhdGEJICA6IHsgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC5yZWxhLnRic3MJICA6IHsgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikgfQorICAucmVsYS5jdG9ycyAgICAgOiB7ICooLnJlbGEuY3RvcnMpIH0KKyAgLnJlbGEuZHRvcnMgICAgIDogeyAqKC5yZWxhLmR0b3JzKSB9CisgIC5yZWxhLmdvdCAgICAgICA6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbGEuYnNzICAgICAgIDogeyAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKSB9CisgIC5yZWxhLmxkYXRhICAgICA6IHsgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopIH0KKyAgLnJlbGEubGJzcyAgICAgIDogeyAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKSB9CisgIC5yZWxhLmxyb2RhdGEgICA6IHsgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikgfQorICAucmVsYS5pZnVuYyAgICAgOiB7ICooLnJlbGEuaWZ1bmMpIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDI0ID8gMjQgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oMzIgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDMyIC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54ZGMgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueGRjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MTc4NGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueGRjCkBAIC0wLDAgKzEsMjI3IEBACisvKiBTY3JpcHQgZm9yIC1waWUgLXogY29tYnJlbG9jOiBwb3NpdGlvbiBpbmRlcGVuZGVudCBleGVjdXRhYmxlLCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLXg4Ni02NCIsICJlbGYzMi14ODYtNjQiLAorCSAgICAgICJlbGYzMi14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4NjQtMzIpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMCk7IC4gPSAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICAqKC5yZWxhLmlmdW5jKQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDI0ID8gMjQgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oMzIgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDMyIC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54ZHcgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueGR3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YjgyYjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueGR3CkBAIC0wLDAgKzEsMjI2IEBACisvKiBTY3JpcHQgZm9yIC1waWUgLXogY29tYnJlbG9jIC16IG5vdyAteiByZWxybzogcG9zaXRpb24gaW5kZXBlbmRlbnQgZXhlY3V0YWJsZSwgY29tYmluZSAmIHNvcnQgcmVsb2NzICovCitPVVRQVVRfRk9STUFUKCJlbGYzMi14ODYtNjQiLCAiZWxmMzIteDg2LTY0IiwKKwkgICAgICAiZWxmMzIteDg2LTY0IikKK09VVFBVVF9BUkNIKGkzODY6eDY0LTMyKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDApOyAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikKKyAgICAgICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopCisgICAgICAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKQorICAgICAgKigucmVsYS5pZnVuYykKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290LnBsdCkgKiguaWdvdC5wbHQpICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMCwgLik7CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyAzMiAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueG4gYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlMGY0OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54bgpAQCAtMCwwICsxLDIyNSBAQAorLyogU2NyaXB0IGZvciAtbjogbWl4IHRleHQgYW5kIGRhdGEgb24gc2FtZSBwYWdlICovCitPVVRQVVRfRk9STUFUKCJlbGYzMi14ODYtNjQiLCAiZWxmMzIteDg2LTY0IiwKKwkgICAgICAiZWxmMzIteDg2LTY0IikKK09VVFBVVF9BUkNIKGkzODY6eDY0LTMyKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDB4NDAwMDAwKTsgLiA9IDB4NDAwMDAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgICA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgICA6IHsgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWxhLmZpbmkgICAgICA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgICA6IHsgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsYS5kYXRhLnJlbC5ybyAgIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvIC5yZWxhLmRhdGEucmVsLnJvLiogLnJlbGEuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLnJlbGEuZGF0YSAgICAgIDogeyAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopIH0KKyAgLnJlbGEudGRhdGEJICA6IHsgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC5yZWxhLnRic3MJICA6IHsgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikgfQorICAucmVsYS5jdG9ycyAgICAgOiB7ICooLnJlbGEuY3RvcnMpIH0KKyAgLnJlbGEuZHRvcnMgICAgIDogeyAqKC5yZWxhLmR0b3JzKSB9CisgIC5yZWxhLmdvdCAgICAgICA6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbGEuYnNzICAgICAgIDogeyAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKSB9CisgIC5yZWxhLmxkYXRhICAgICA6IHsgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopIH0KKyAgLnJlbGEubGJzcyAgICAgIDogeyAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKSB9CisgIC5yZWxhLmxyb2RhdGEgICA6IHsgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikgfQorICAucmVsYS5pZnVuYyAgICAgOiB7ICooLnJlbGEuaWZ1bmMpIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDI0ID8gMjQgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oMzIgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDMyIC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54ciBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54cgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTRkY2IzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0LnhyCkBAIC0wLDAgKzEsMTU0IEBACisvKiBTY3JpcHQgZm9yIGxkIC1yOiBsaW5rIHdpdGhvdXQgcmVsb2NhdGlvbiAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzIteDg2LTY0IiwgImVsZjMyLXg4Ni02NCIsCisJICAgICAgImVsZjMyLXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong2NC0zMikKKyAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBTb2xhcmlzIGxpbmtlciBtYWtlcyBiYWQgZXhlY3V0YWJsZXMKKyAgaWYgZ2xkIC1yIGlzIHVzZWQgYW5kIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBoYXMgc2VjdGlvbnMgc3RhcnRpbmcKKyAgYXQgbm9uLXplcm8gYWRkcmVzc2VzLiAgQ291bGQgYmUgYSBTb2xhcmlzIGxkIGJ1ZywgY291bGQgYmUgYSBHTlUgbGQKKyAgYnVnLiAgQnV0IGZvciBub3cgYXNzaWduaW5nIHRoZSB6ZXJvIHZtYXMgd29ya3MuICAqLworU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC5pbnRlcnAgICAgICAgMCA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAwIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgMCA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAwIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAwIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAwIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAwOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgMDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgMCA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgMCA6IHsgKigucmVsYS50ZXh0KSB9CisgIC5yZWxhLmZpbmkgICAgMCA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgMCA6IHsgKigucmVsYS5yb2RhdGEpIH0KKyAgLnJlbGEuZGF0YS5yZWwucm8gMCA6IHsgKigucmVsYS5kYXRhLnJlbC5ybykgfQorICAucmVsYS5kYXRhICAgIDAgOiB7ICooLnJlbGEuZGF0YSkgfQorICAucmVsYS50ZGF0YQkwIDogeyAqKC5yZWxhLnRkYXRhKSB9CisgIC5yZWxhLnRic3MJMCA6IHsgKigucmVsYS50YnNzKSB9CisgIC5yZWxhLmN0b3JzICAgMCA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgIDAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAwIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgIDAgOiB7ICooLnJlbGEuYnNzKSB9CisgIC5yZWxhLmxkYXRhICAgMCA6IHsgKigucmVsYS5sZGF0YSkgfQorICAucmVsYS5sYnNzICAgIDAgOiB7ICooLnJlbGEubGJzcykgfQorICAucmVsYS5scm9kYXRhIDAgOiB7ICooLnJlbGEubHJvZGF0YSkgfQorICAucmVsYS5pZnVuYyAgIDAgOiB7ICooLnJlbGEuaWZ1bmMpIH0KKyAgLnJlbGEucGx0ICAgICAwIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgMCA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgMCA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgMCA6CisgIHsKKyAgICAqKC50ZXh0IC5zdHViKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgMCA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIC5yb2RhdGEgICAgICAgMCA6IHsgKigucm9kYXRhKSB9CisgIC5yb2RhdGExICAgICAgMCA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAwIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAwIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzIDAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgMCA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgMCA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgMCA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCTAgOiB7ICooLnRkYXRhKSB9CisgIC50YnNzCQkwIDogeyAqKC50YnNzKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC5wcmVpbml0X2FycmF5ICAgMCA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICAuamNyICAgICAgICAgIDAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmR5bmFtaWMgICAgICAwIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgMCA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC5nb3QucGx0ICAgICAgMCA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgMCA6CisgIHsKKyAgICAqKC5kYXRhKQorICB9CisgIC5kYXRhMSAgICAgICAgMCA6IHsgKiguZGF0YTEpIH0KKyAgLmJzcyAgICAgICAgICAwIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICB9CisgIC5sYnNzIDAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC5scm9kYXRhIDAgIDoKKyAgeworICAgICooLmxyb2RhdGEpCisgIH0KKyAgLmxkYXRhIDAgIDoKKyAgeworICAgICooLmxkYXRhKQorICB9CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54cyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTU4MDg0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0LnhzCkBAIC0wLDAgKzEsMjE2IEBACisvKiBTY3JpcHQgZm9yIGxkIC0tc2hhcmVkOiBsaW5rIHNoYXJlZCBsaWJyYXJ5ICovCitPVVRQVVRfRk9STUFUKCJlbGYzMi14ODYtNjQiLCAiZWxmMzIteDg2LTY0IiwKKwkgICAgICAiZWxmMzIteDg2LTY0IikKK09VVFBVVF9BUkNIKGkzODY6eDY0LTMyKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSAwICsgU0laRU9GX0hFQURFUlM7CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgICA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgICA6IHsgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWxhLmZpbmkgICAgICA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgICA6IHsgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsYS5kYXRhLnJlbC5ybyAgIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvIC5yZWxhLmRhdGEucmVsLnJvLiogLnJlbGEuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLnJlbGEuZGF0YSAgICAgIDogeyAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopIH0KKyAgLnJlbGEudGRhdGEJICA6IHsgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC5yZWxhLnRic3MJICA6IHsgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikgfQorICAucmVsYS5jdG9ycyAgICAgOiB7ICooLnJlbGEuY3RvcnMpIH0KKyAgLnJlbGEuZHRvcnMgICAgIDogeyAqKC5yZWxhLmR0b3JzKSB9CisgIC5yZWxhLmdvdCAgICAgICA6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbGEuYnNzICAgICAgIDogeyAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKSB9CisgIC5yZWxhLmxkYXRhICAgICA6IHsgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopIH0KKyAgLnJlbGEubGJzcyAgICAgIDogeyAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKSB9CisgIC5yZWxhLmxyb2RhdGEgICA6IHsgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikgfQorICAucmVsYS5pZnVuYyAgICAgOiB7ICooLnJlbGEuaWZ1bmMpIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAyNCA/IDI0IDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyAzMiAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueHNjIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0LnhzYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDcwMDkxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0LnhzYwpAQCAtMCwwICsxLDIxOSBAQAorLyogU2NyaXB0IGZvciAtLXNoYXJlZCAteiBjb21icmVsb2M6IHNoYXJlZCBsaWJyYXJ5LCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KKy8qIE1vZGlmaWVkIGZvciBBbmRyb2lkLiAgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLXg4Ni02NCIsICJlbGYzMi14ODYtNjQiLAorCSAgICAgICJlbGYzMi14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4NjQtMzIpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopCisgICAgICAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKQorICAgICAgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikKKyAgICAgICooLnJlbGEuaWZ1bmMpCisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgICAgKigucmVsYS5pcGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDI0ID8gMjQgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oMzIgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDMyIC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54c3cgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueHN3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZDYxMWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueHN3CkBAIC0wLDAgKzEsMjE3IEBACisvKiBTY3JpcHQgZm9yIC0tc2hhcmVkIC16IGNvbWJyZWxvYyAteiBub3cgLXogcmVscm86IHNoYXJlZCBsaWJyYXJ5LCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLXg4Ni02NCIsICJlbGYzMi14ODYtNjQiLAorCSAgICAgICJlbGYzMi14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4NjQtMzIpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopCisgICAgICAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKQorICAgICAgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikKKyAgICAgICooLnJlbGEuaWZ1bmMpCisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgICAgKigucmVsYS5pcGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QucGx0KSAqKC5pZ290LnBsdCkgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgwLCAuKTsKKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oMzIgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDMyIC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54dSBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZjMyX3g4Nl82NC54dQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWM4Y2M2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0Lnh1CkBAIC0wLDAgKzEsMTU1IEBACisvKiBTY3JpcHQgZm9yIGxkIC1VcjogbGluayB3L291dCByZWxvY2F0aW9uLCBkbyBjcmVhdGUgY29uc3RydWN0b3JzICovCitPVVRQVVRfRk9STUFUKCJlbGYzMi14ODYtNjQiLCAiZWxmMzIteDg2LTY0IiwKKwkgICAgICAiZWxmMzIteDg2LTY0IikKK09VVFBVVF9BUkNIKGkzODY6eDY0LTMyKQorIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlcworICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZworICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZAorICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLmludGVycCAgICAgICAwIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgIDAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAwIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgIDAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgIDAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gIDAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kIDA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAwOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAwIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAwIDogeyAqKC5yZWxhLnRleHQpIH0KKyAgLnJlbGEuZmluaSAgICAwIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAwIDogeyAqKC5yZWxhLnJvZGF0YSkgfQorICAucmVsYS5kYXRhLnJlbC5ybyAwIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvKSB9CisgIC5yZWxhLmRhdGEgICAgMCA6IHsgKigucmVsYS5kYXRhKSB9CisgIC5yZWxhLnRkYXRhCTAgOiB7ICooLnJlbGEudGRhdGEpIH0KKyAgLnJlbGEudGJzcwkwIDogeyAqKC5yZWxhLnRic3MpIH0KKyAgLnJlbGEuY3RvcnMgICAwIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgMCA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgIDAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgMCA6IHsgKigucmVsYS5ic3MpIH0KKyAgLnJlbGEubGRhdGEgICAwIDogeyAqKC5yZWxhLmxkYXRhKSB9CisgIC5yZWxhLmxic3MgICAgMCA6IHsgKigucmVsYS5sYnNzKSB9CisgIC5yZWxhLmxyb2RhdGEgMCA6IHsgKigucmVsYS5scm9kYXRhKSB9CisgIC5yZWxhLmlmdW5jICAgMCA6IHsgKigucmVsYS5pZnVuYykgfQorICAucmVsYS5wbHQgICAgIDAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAwIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAwIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAwIDoKKyAgeworICAgICooLnRleHQgLnN0dWIpCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAwIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgLnJvZGF0YSAgICAgICAwIDogeyAqKC5yb2RhdGEpIH0KKyAgLnJvZGF0YTEgICAgICAwIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgIDAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlIDAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgMCA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAwIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAwIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAwIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJMCA6IHsgKigudGRhdGEpIH0KKyAgLnRic3MJCTAgOiB7ICooLnRic3MpIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLnByZWluaXRfYXJyYXkgICAwIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5qY3IgICAgICAgICAgMCA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZHluYW1pYyAgICAgIDAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAwIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLmdvdC5wbHQgICAgICAwIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAwIDoKKyAgeworICAgICooLmRhdGEpCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAwIDogeyAqKC5kYXRhMSkgfQorICAuYnNzICAgICAgICAgIDAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgIH0KKyAgLmxic3MgMCA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MpCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLmxyb2RhdGEgMCAgOgorICB7CisgICAgKigubHJvZGF0YSkKKyAgfQorICAubGRhdGEgMCAgOgorICB7CisgICAgKigubGRhdGEpCisgIH0KKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0Lnh3IGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmMzJfeDg2XzY0Lnh3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZDNiNTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGYzMl94ODZfNjQueHcKQEAgLTAsMCArMSwyMjYgQEAKKy8qIFNjcmlwdCBmb3IgLXogY29tYnJlbG9jIC16IG5vdyAteiByZWxybzogY29tYmluZSBhbmQgc29ydCByZWxvYyBzZWN0aW9ucyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzIteDg2LTY0IiwgImVsZjMyLXg4Ni02NCIsCisJICAgICAgImVsZjMyLXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong2NC0zMikKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAweDQwMDAwMCk7IC4gPSAweDQwMDAwMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikKKyAgICAgICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopCisgICAgICAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKQorICAgICAgKigucmVsYS5pZnVuYykKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290LnBsdCkgKiguaWdvdC5wbHQpICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMCwgLik7CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyAzMiAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54IGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDUzNTI0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueApAQCAtMCwwICsxLDIwOCBAQAorLyogRGVmYXVsdCBsaW5rZXIgc2NyaXB0LCBmb3Igbm9ybWFsIGV4ZWN1dGFibGVzICovCisvKiBNb2RpZmllZCBmb3IgQW5kcm9pZC4gICovCitPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLAorCSAgICAgICJlbGYzMi1pMzg2IikKK09VVFBVVF9BUkNIKGkzODYpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMHgwODA0ODAwMCk7IC4gPSAweDA4MDQ4MDAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWwuaW5pdCAgICAgICA6IHsgKigucmVsLmluaXQpIH0KKyAgLnJlbC50ZXh0ICAgICAgIDogeyAqKC5yZWwudGV4dCAucmVsLnRleHQuKiAucmVsLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbC5maW5pICAgICAgIDogeyAqKC5yZWwuZmluaSkgfQorICAucmVsLnJvZGF0YSAgICAgOiB7ICooLnJlbC5yb2RhdGEgLnJlbC5yb2RhdGEuKiAucmVsLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJlbC5kYXRhLnJlbC5ybyAgIDogeyAqKC5yZWwuZGF0YS5yZWwucm8gLnJlbC5kYXRhLnJlbC5yby4qIC5yZWwuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLnJlbC5kYXRhICAgICAgIDogeyAqKC5yZWwuZGF0YSAucmVsLmRhdGEuKiAucmVsLmdudS5saW5rb25jZS5kLiopIH0KKyAgLnJlbC50ZGF0YQkgIDogeyAqKC5yZWwudGRhdGEgLnJlbC50ZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbC50YnNzCSAgOiB7ICooLnJlbC50YnNzIC5yZWwudGJzcy4qIC5yZWwuZ251LmxpbmtvbmNlLnRiLiopIH0KKyAgLnJlbC5jdG9ycyAgICAgIDogeyAqKC5yZWwuY3RvcnMpIH0KKyAgLnJlbC5kdG9ycyAgICAgIDogeyAqKC5yZWwuZHRvcnMpIH0KKyAgLnJlbC5nb3QgICAgICAgIDogeyAqKC5yZWwuZ290KSB9CisgIC5yZWwuYnNzICAgICAgICA6IHsgKigucmVsLmJzcyAucmVsLmJzcy4qIC5yZWwuZ251LmxpbmtvbmNlLmIuKikgfQorICAucmVsLmlmdW5jICAgICAgOiB7ICooLnJlbC5pZnVuYykgfQorICAucmVsLnBsdCAgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbC5wbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAxMiA/IDEyIDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC4gPSBBTElHTigzMiAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhibiBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhibgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTA3ZTRlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueGJuCkBAIC0wLDAgKzEsMjA1IEBACisvKiBTY3JpcHQgZm9yIC1OOiBtaXggdGV4dCBhbmQgZGF0YSBvbiBzYW1lIHBhZ2U7IGRvbid0IGFsaWduIGRhdGEgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsCisJICAgICAgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAweDA4MDQ4MDAwKTsgLiA9IDB4MDgwNDgwMDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbC5pbml0ICAgICAgIDogeyAqKC5yZWwuaW5pdCkgfQorICAucmVsLnRleHQgICAgICAgOiB7ICooLnJlbC50ZXh0IC5yZWwudGV4dC4qIC5yZWwuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsLmZpbmkgICAgICAgOiB7ICooLnJlbC5maW5pKSB9CisgIC5yZWwucm9kYXRhICAgICA6IHsgKigucmVsLnJvZGF0YSAucmVsLnJvZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbC5kYXRhLnJlbC5ybyAucmVsLmRhdGEucmVsLnJvLiogLnJlbC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsLmRhdGEgICAgICAgOiB7ICooLnJlbC5kYXRhIC5yZWwuZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsLnRkYXRhCSAgOiB7ICooLnJlbC50ZGF0YSAucmVsLnRkYXRhLiogLnJlbC5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsLnRic3MJICA6IHsgKigucmVsLnRic3MgLnJlbC50YnNzLiogLnJlbC5nbnUubGlua29uY2UudGIuKikgfQorICAucmVsLmN0b3JzICAgICAgOiB7ICooLnJlbC5jdG9ycykgfQorICAucmVsLmR0b3JzICAgICAgOiB7ICooLnJlbC5kdG9ycykgfQorICAucmVsLmdvdCAgICAgICAgOiB7ICooLnJlbC5nb3QpIH0KKyAgLnJlbC5ic3MgICAgICAgIDogeyAqKC5yZWwuYnNzIC5yZWwuYnNzLiogLnJlbC5nbnUubGlua29uY2UuYi4qKSB9CisgIC5yZWwuaWZ1bmMgICAgICA6IHsgKigucmVsLmlmdW5jKSB9CisgIC5yZWwucGx0ICAgICAgICA6CisgICAgeworICAgICAgKigucmVsLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWwuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IC47CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oMzIgLyA4KTsKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhjIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1MTA5NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhjCkBAIC0wLDAgKzEsMjEwIEBACisvKiBTY3JpcHQgZm9yIC16IGNvbWJyZWxvYzogY29tYmluZSBhbmQgc29ydCByZWxvYyBzZWN0aW9ucyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwKKwkgICAgICAiZWxmMzItaTM4NiIpCitPVVRQVVRfQVJDSChpMzg2KQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDB4MDgwNDgwMDApOyAuID0gMHgwODA0ODAwMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsLmR5biAgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbC5pbml0KQorICAgICAgKigucmVsLnRleHQgLnJlbC50ZXh0LiogLnJlbC5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsLmZpbmkpCisgICAgICAqKC5yZWwucm9kYXRhIC5yZWwucm9kYXRhLiogLnJlbC5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsLmRhdGEucmVsLnJvIC5yZWwuZGF0YS5yZWwucm8uKiAucmVsLmdudS5saW5rb25jZS5kLnJlbC5yby4qKQorICAgICAgKigucmVsLmRhdGEgLnJlbC5kYXRhLiogLnJlbC5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsLnRkYXRhIC5yZWwudGRhdGEuKiAucmVsLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsLnRic3MgLnJlbC50YnNzLiogLnJlbC5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbC5jdG9ycykKKyAgICAgICooLnJlbC5kdG9ycykKKyAgICAgICooLnJlbC5nb3QpCisgICAgICAqKC5yZWwuYnNzIC5yZWwuYnNzLiogLnJlbC5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsLmlmdW5jKQorICAgIH0KKyAgLnJlbC5wbHQgICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWwucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbC5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMTIgPyAxMiA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTigzMiAvIDgpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54ZCBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzODcwODMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54ZApAQCAtMCwwICsxLDIwNyBAQAorLyogU2NyaXB0IGZvciBsZCAtcGllOiBsaW5rIHBvc2l0aW9uIGluZGVwZW5kZW50IGV4ZWN1dGFibGUgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsCisJICAgICAgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAwKTsgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbC5pbml0ICAgICAgIDogeyAqKC5yZWwuaW5pdCkgfQorICAucmVsLnRleHQgICAgICAgOiB7ICooLnJlbC50ZXh0IC5yZWwudGV4dC4qIC5yZWwuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsLmZpbmkgICAgICAgOiB7ICooLnJlbC5maW5pKSB9CisgIC5yZWwucm9kYXRhICAgICA6IHsgKigucmVsLnJvZGF0YSAucmVsLnJvZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbC5kYXRhLnJlbC5ybyAucmVsLmRhdGEucmVsLnJvLiogLnJlbC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsLmRhdGEgICAgICAgOiB7ICooLnJlbC5kYXRhIC5yZWwuZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsLnRkYXRhCSAgOiB7ICooLnJlbC50ZGF0YSAucmVsLnRkYXRhLiogLnJlbC5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsLnRic3MJICA6IHsgKigucmVsLnRic3MgLnJlbC50YnNzLiogLnJlbC5nbnUubGlua29uY2UudGIuKikgfQorICAucmVsLmN0b3JzICAgICAgOiB7ICooLnJlbC5jdG9ycykgfQorICAucmVsLmR0b3JzICAgICAgOiB7ICooLnJlbC5kdG9ycykgfQorICAucmVsLmdvdCAgICAgICAgOiB7ICooLnJlbC5nb3QpIH0KKyAgLnJlbC5ic3MgICAgICAgIDogeyAqKC5yZWwuYnNzIC5yZWwuYnNzLiogLnJlbC5nbnUubGlua29uY2UuYi4qKSB9CisgIC5yZWwuaWZ1bmMgICAgICA6IHsgKigucmVsLmlmdW5jKSB9CisgIC5yZWwucGx0ICAgICAgICA6CisgICAgeworICAgICAgKigucmVsLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWwuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDEyID8gMTIgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oMzIgLyA4KTsKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueGRjIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueGRjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMTMwYTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54ZGMKQEAgLTAsMCArMSwyMTAgQEAKKy8qIFNjcmlwdCBmb3IgLXBpZSAteiBjb21icmVsb2M6IHBvc2l0aW9uIGluZGVwZW5kZW50IGV4ZWN1dGFibGUsIGNvbWJpbmUgJiBzb3J0IHJlbG9jcyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwKKwkgICAgICAiZWxmMzItaTM4NiIpCitPVVRQVVRfQVJDSChpMzg2KQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDApOyAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsLmR5biAgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbC5pbml0KQorICAgICAgKigucmVsLnRleHQgLnJlbC50ZXh0LiogLnJlbC5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsLmZpbmkpCisgICAgICAqKC5yZWwucm9kYXRhIC5yZWwucm9kYXRhLiogLnJlbC5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsLmRhdGEucmVsLnJvIC5yZWwuZGF0YS5yZWwucm8uKiAucmVsLmdudS5saW5rb25jZS5kLnJlbC5yby4qKQorICAgICAgKigucmVsLmRhdGEgLnJlbC5kYXRhLiogLnJlbC5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsLnRkYXRhIC5yZWwudGRhdGEuKiAucmVsLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsLnRic3MgLnJlbC50YnNzLiogLnJlbC5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbC5jdG9ycykKKyAgICAgICooLnJlbC5kdG9ycykKKyAgICAgICooLnJlbC5nb3QpCisgICAgICAqKC5yZWwuYnNzIC5yZWwuYnNzLiogLnJlbC5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsLmlmdW5jKQorICAgIH0KKyAgLnJlbC5wbHQgICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWwucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbC5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMTIgPyAxMiA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTigzMiAvIDgpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54ZHcgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54ZHcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiOTRhYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhkdwpAQCAtMCwwICsxLDIwOSBAQAorLyogU2NyaXB0IGZvciAtcGllIC16IGNvbWJyZWxvYyAteiBub3cgLXogcmVscm86IHBvc2l0aW9uIGluZGVwZW5kZW50IGV4ZWN1dGFibGUsIGNvbWJpbmUgJiBzb3J0IHJlbG9jcyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwKKwkgICAgICAiZWxmMzItaTM4NiIpCitPVVRQVVRfQVJDSChpMzg2KQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDApOyAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsLmR5biAgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbC5pbml0KQorICAgICAgKigucmVsLnRleHQgLnJlbC50ZXh0LiogLnJlbC5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsLmZpbmkpCisgICAgICAqKC5yZWwucm9kYXRhIC5yZWwucm9kYXRhLiogLnJlbC5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsLmRhdGEucmVsLnJvIC5yZWwuZGF0YS5yZWwucm8uKiAucmVsLmdudS5saW5rb25jZS5kLnJlbC5yby4qKQorICAgICAgKigucmVsLmRhdGEgLnJlbC5kYXRhLiogLnJlbC5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsLnRkYXRhIC5yZWwudGRhdGEuKiAucmVsLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsLnRic3MgLnJlbC50YnNzLiogLnJlbC5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbC5jdG9ycykKKyAgICAgICooLnJlbC5kdG9ycykKKyAgICAgICooLnJlbC5nb3QpCisgICAgICAqKC5yZWwuYnNzIC5yZWwuYnNzLiogLnJlbC5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsLmlmdW5jKQorICAgIH0KKyAgLnJlbC5wbHQgICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWwucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbC5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdC5wbHQpICooLmlnb3QucGx0KSAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKDAsIC4pOworICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTigzMiAvIDgpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54biBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MWM4YjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54bgpAQCAtMCwwICsxLDIwNyBAQAorLyogU2NyaXB0IGZvciAtbjogbWl4IHRleHQgYW5kIGRhdGEgb24gc2FtZSBwYWdlICovCitPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLAorCSAgICAgICJlbGYzMi1pMzg2IikKK09VVFBVVF9BUkNIKGkzODYpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMHgwODA0ODAwMCk7IC4gPSAweDA4MDQ4MDAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWwuaW5pdCAgICAgICA6IHsgKigucmVsLmluaXQpIH0KKyAgLnJlbC50ZXh0ICAgICAgIDogeyAqKC5yZWwudGV4dCAucmVsLnRleHQuKiAucmVsLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbC5maW5pICAgICAgIDogeyAqKC5yZWwuZmluaSkgfQorICAucmVsLnJvZGF0YSAgICAgOiB7ICooLnJlbC5yb2RhdGEgLnJlbC5yb2RhdGEuKiAucmVsLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJlbC5kYXRhLnJlbC5ybyAgIDogeyAqKC5yZWwuZGF0YS5yZWwucm8gLnJlbC5kYXRhLnJlbC5yby4qIC5yZWwuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLnJlbC5kYXRhICAgICAgIDogeyAqKC5yZWwuZGF0YSAucmVsLmRhdGEuKiAucmVsLmdudS5saW5rb25jZS5kLiopIH0KKyAgLnJlbC50ZGF0YQkgIDogeyAqKC5yZWwudGRhdGEgLnJlbC50ZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbC50YnNzCSAgOiB7ICooLnJlbC50YnNzIC5yZWwudGJzcy4qIC5yZWwuZ251LmxpbmtvbmNlLnRiLiopIH0KKyAgLnJlbC5jdG9ycyAgICAgIDogeyAqKC5yZWwuY3RvcnMpIH0KKyAgLnJlbC5kdG9ycyAgICAgIDogeyAqKC5yZWwuZHRvcnMpIH0KKyAgLnJlbC5nb3QgICAgICAgIDogeyAqKC5yZWwuZ290KSB9CisgIC5yZWwuYnNzICAgICAgICA6IHsgKigucmVsLmJzcyAucmVsLmJzcy4qIC5yZWwuZ251LmxpbmtvbmNlLmIuKikgfQorICAucmVsLmlmdW5jICAgICAgOiB7ICooLnJlbC5pZnVuYykgfQorICAucmVsLnBsdCAgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbC5wbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAxMiA/IDEyIDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC4gPSBBTElHTigzMiAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhyIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YwZTk2MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhyCkBAIC0wLDAgKzEsMTM3IEBACisvKiBTY3JpcHQgZm9yIGxkIC1yOiBsaW5rIHdpdGhvdXQgcmVsb2NhdGlvbiAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwKKwkgICAgICAiZWxmMzItaTM4NiIpCitPVVRQVVRfQVJDSChpMzg2KQorIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlcworICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZworICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZAorICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLmludGVycCAgICAgICAwIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgIDAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAwIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgIDAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgIDAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gIDAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kIDA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAwOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbC5pbml0ICAgICAwIDogeyAqKC5yZWwuaW5pdCkgfQorICAucmVsLnRleHQgICAgIDAgOiB7ICooLnJlbC50ZXh0KSB9CisgIC5yZWwuZmluaSAgICAgMCA6IHsgKigucmVsLmZpbmkpIH0KKyAgLnJlbC5yb2RhdGEgICAwIDogeyAqKC5yZWwucm9kYXRhKSB9CisgIC5yZWwuZGF0YS5yZWwucm8gMCA6IHsgKigucmVsLmRhdGEucmVsLnJvKSB9CisgIC5yZWwuZGF0YSAgICAgMCA6IHsgKigucmVsLmRhdGEpIH0KKyAgLnJlbC50ZGF0YQkwIDogeyAqKC5yZWwudGRhdGEpIH0KKyAgLnJlbC50YnNzCTAgOiB7ICooLnJlbC50YnNzKSB9CisgIC5yZWwuY3RvcnMgICAgMCA6IHsgKigucmVsLmN0b3JzKSB9CisgIC5yZWwuZHRvcnMgICAgMCA6IHsgKigucmVsLmR0b3JzKSB9CisgIC5yZWwuZ290ICAgICAgMCA6IHsgKigucmVsLmdvdCkgfQorICAucmVsLmJzcyAgICAgIDAgOiB7ICooLnJlbC5ic3MpIH0KKyAgLnJlbC5pZnVuYyAgICAwIDogeyAqKC5yZWwuaWZ1bmMpIH0KKyAgLnJlbC5wbHQgICAgICAwIDoKKyAgICB7CisgICAgICAqKC5yZWwucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAwIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAwIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAwIDoKKyAgeworICAgICooLnRleHQgLnN0dWIpCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAwIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgLnJvZGF0YSAgICAgICAwIDogeyAqKC5yb2RhdGEpIH0KKyAgLnJvZGF0YTEgICAgICAwIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgIDAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlIDAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgMCA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAwIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAwIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAwIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJMCA6IHsgKigudGRhdGEpIH0KKyAgLnRic3MJCTAgOiB7ICooLnRic3MpIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLnByZWluaXRfYXJyYXkgICAwIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5qY3IgICAgICAgICAgMCA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZHluYW1pYyAgICAgIDAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAwIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLmdvdC5wbHQgICAgICAwIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAwIDoKKyAgeworICAgICooLmRhdGEpCisgIH0KKyAgLmRhdGExICAgICAgICAwIDogeyAqKC5kYXRhMSkgfQorICAuYnNzICAgICAgICAgIDAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgIH0KKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueHMgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWY0NDBlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueHMKQEAgLTAsMCArMSwxOTggQEAKKy8qIFNjcmlwdCBmb3IgbGQgLS1zaGFyZWQ6IGxpbmsgc2hhcmVkIGxpYnJhcnkgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsCisJICAgICAgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsLmluaXQgICAgICAgOiB7ICooLnJlbC5pbml0KSB9CisgIC5yZWwudGV4dCAgICAgICA6IHsgKigucmVsLnRleHQgLnJlbC50ZXh0LiogLnJlbC5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWwuZmluaSAgICAgICA6IHsgKigucmVsLmZpbmkpIH0KKyAgLnJlbC5yb2RhdGEgICAgIDogeyAqKC5yZWwucm9kYXRhIC5yZWwucm9kYXRhLiogLnJlbC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWwuZGF0YS5yZWwucm8gICA6IHsgKigucmVsLmRhdGEucmVsLnJvIC5yZWwuZGF0YS5yZWwucm8uKiAucmVsLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWwuZGF0YSAgICAgICA6IHsgKigucmVsLmRhdGEgLnJlbC5kYXRhLiogLnJlbC5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWwudGRhdGEJICA6IHsgKigucmVsLnRkYXRhIC5yZWwudGRhdGEuKiAucmVsLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC5yZWwudGJzcwkgIDogeyAqKC5yZWwudGJzcyAucmVsLnRic3MuKiAucmVsLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWwuY3RvcnMgICAgICA6IHsgKigucmVsLmN0b3JzKSB9CisgIC5yZWwuZHRvcnMgICAgICA6IHsgKigucmVsLmR0b3JzKSB9CisgIC5yZWwuZ290ICAgICAgICA6IHsgKigucmVsLmdvdCkgfQorICAucmVsLmJzcyAgICAgICAgOiB7ICooLnJlbC5ic3MgLnJlbC5ic3MuKiAucmVsLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbC5pZnVuYyAgICAgIDogeyAqKC5yZWwuaWZ1bmMpIH0KKyAgLnJlbC5wbHQgICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWwucGx0KQorICAgICAgKigucmVsLmlwbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMTIgPyAxMiA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTigzMiAvIDgpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54c2MgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54c2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2ZGRhYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhzYwpAQCAtMCwwICsxLDIwMiBAQAorLyogU2NyaXB0IGZvciAtLXNoYXJlZCAteiBjb21icmVsb2M6IHNoYXJlZCBsaWJyYXJ5LCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KKy8qIE1vZGlmaWVkIGZvciBBbmRyb2lkLiAgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsCisJICAgICAgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsLmR5biAgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbC5pbml0KQorICAgICAgKigucmVsLnRleHQgLnJlbC50ZXh0LiogLnJlbC5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsLmZpbmkpCisgICAgICAqKC5yZWwucm9kYXRhIC5yZWwucm9kYXRhLiogLnJlbC5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsLmRhdGEucmVsLnJvIC5yZWwuZGF0YS5yZWwucm8uKiAucmVsLmdudS5saW5rb25jZS5kLnJlbC5yby4qKQorICAgICAgKigucmVsLmRhdGEgLnJlbC5kYXRhLiogLnJlbC5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsLnRkYXRhIC5yZWwudGRhdGEuKiAucmVsLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsLnRic3MgLnJlbC50YnNzLiogLnJlbC5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbC5jdG9ycykKKyAgICAgICooLnJlbC5kdG9ycykKKyAgICAgICooLnJlbC5nb3QpCisgICAgICAqKC5yZWwuYnNzIC5yZWwuYnNzLiogLnJlbC5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsLmlmdW5jKQorICAgIH0KKyAgLnJlbC5wbHQgICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWwucGx0KQorICAgICAgKigucmVsLmlwbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMTIgPyAxMiA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTigzMiAvIDgpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54c3cgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54c3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk3MjY5ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhzdwpAQCAtMCwwICsxLDIwMCBAQAorLyogU2NyaXB0IGZvciAtLXNoYXJlZCAteiBjb21icmVsb2MgLXogbm93IC16IHJlbHJvOiBzaGFyZWQgbGlicmFyeSwgY29tYmluZSAmIHNvcnQgcmVsb2NzICovCitPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLAorCSAgICAgICJlbGYzMi1pMzg2IikKK09VVFBVVF9BUkNIKGkzODYpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbC5keW4gICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWwuaW5pdCkKKyAgICAgICooLnJlbC50ZXh0IC5yZWwudGV4dC4qIC5yZWwuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbC5maW5pKQorICAgICAgKigucmVsLnJvZGF0YSAucmVsLnJvZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbC5kYXRhLnJlbC5ybyAucmVsLmRhdGEucmVsLnJvLiogLnJlbC5nbnUubGlua29uY2UuZC5yZWwucm8uKikKKyAgICAgICooLnJlbC5kYXRhIC5yZWwuZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbC50ZGF0YSAucmVsLnRkYXRhLiogLnJlbC5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbC50YnNzIC5yZWwudGJzcy4qIC5yZWwuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWwuY3RvcnMpCisgICAgICAqKC5yZWwuZHRvcnMpCisgICAgICAqKC5yZWwuZ290KQorICAgICAgKigucmVsLmJzcyAucmVsLmJzcy4qIC5yZWwuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbC5pZnVuYykKKyAgICB9CisgIC5yZWwucGx0ICAgICAgICA6CisgICAgeworICAgICAgKigucmVsLnBsdCkKKyAgICAgICooLnJlbC5pcGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QucGx0KSAqKC5pZ290LnBsdCkgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgwLCAuKTsKKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oMzIgLyA4KTsKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueHUgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54dQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2I1ZjJiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueHUKQEAgLTAsMCArMSwxMzggQEAKKy8qIFNjcmlwdCBmb3IgbGQgLVVyOiBsaW5rIHcvb3V0IHJlbG9jYXRpb24sIGRvIGNyZWF0ZSBjb25zdHJ1Y3RvcnMgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsCisJICAgICAgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKKyAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBTb2xhcmlzIGxpbmtlciBtYWtlcyBiYWQgZXhlY3V0YWJsZXMKKyAgaWYgZ2xkIC1yIGlzIHVzZWQgYW5kIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBoYXMgc2VjdGlvbnMgc3RhcnRpbmcKKyAgYXQgbm9uLXplcm8gYWRkcmVzc2VzLiAgQ291bGQgYmUgYSBTb2xhcmlzIGxkIGJ1ZywgY291bGQgYmUgYSBHTlUgbGQKKyAgYnVnLiAgQnV0IGZvciBub3cgYXNzaWduaW5nIHRoZSB6ZXJvIHZtYXMgd29ya3MuICAqLworU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC5pbnRlcnAgICAgICAgMCA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAwIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgMCA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAwIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAwIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAwIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAwOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgMDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWwuaW5pdCAgICAgMCA6IHsgKigucmVsLmluaXQpIH0KKyAgLnJlbC50ZXh0ICAgICAwIDogeyAqKC5yZWwudGV4dCkgfQorICAucmVsLmZpbmkgICAgIDAgOiB7ICooLnJlbC5maW5pKSB9CisgIC5yZWwucm9kYXRhICAgMCA6IHsgKigucmVsLnJvZGF0YSkgfQorICAucmVsLmRhdGEucmVsLnJvIDAgOiB7ICooLnJlbC5kYXRhLnJlbC5ybykgfQorICAucmVsLmRhdGEgICAgIDAgOiB7ICooLnJlbC5kYXRhKSB9CisgIC5yZWwudGRhdGEJMCA6IHsgKigucmVsLnRkYXRhKSB9CisgIC5yZWwudGJzcwkwIDogeyAqKC5yZWwudGJzcykgfQorICAucmVsLmN0b3JzICAgIDAgOiB7ICooLnJlbC5jdG9ycykgfQorICAucmVsLmR0b3JzICAgIDAgOiB7ICooLnJlbC5kdG9ycykgfQorICAucmVsLmdvdCAgICAgIDAgOiB7ICooLnJlbC5nb3QpIH0KKyAgLnJlbC5ic3MgICAgICAwIDogeyAqKC5yZWwuYnNzKSB9CisgIC5yZWwuaWZ1bmMgICAgMCA6IHsgKigucmVsLmlmdW5jKSB9CisgIC5yZWwucGx0ICAgICAgMCA6CisgICAgeworICAgICAgKigucmVsLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgMCA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgMCA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgMCA6CisgIHsKKyAgICAqKC50ZXh0IC5zdHViKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgMCA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIC5yb2RhdGEgICAgICAgMCA6IHsgKigucm9kYXRhKSB9CisgIC5yb2RhdGExICAgICAgMCA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAwIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAwIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzIDAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgMCA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgMCA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgMCA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCTAgOiB7ICooLnRkYXRhKSB9CisgIC50YnNzCQkwIDogeyAqKC50YnNzKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC5wcmVpbml0X2FycmF5ICAgMCA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICAuamNyICAgICAgICAgIDAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmR5bmFtaWMgICAgICAwIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgMCA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC5nb3QucGx0ICAgICAgMCA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgMCA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgMCA6IHsgKiguZGF0YTEpIH0KKyAgLmJzcyAgICAgICAgICAwIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICB9CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2Lnh3IGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueHcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk5YTZmNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2Lnh3CkBAIC0wLDAgKzEsMjA5IEBACisvKiBTY3JpcHQgZm9yIC16IGNvbWJyZWxvYyAteiBub3cgLXogcmVscm86IGNvbWJpbmUgYW5kIHNvcnQgcmVsb2Mgc2VjdGlvbnMgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsCisJICAgICAgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAweDA4MDQ4MDAwKTsgLiA9IDB4MDgwNDgwMDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbC5keW4gICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWwuaW5pdCkKKyAgICAgICooLnJlbC50ZXh0IC5yZWwudGV4dC4qIC5yZWwuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbC5maW5pKQorICAgICAgKigucmVsLnJvZGF0YSAucmVsLnJvZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbC5kYXRhLnJlbC5ybyAucmVsLmRhdGEucmVsLnJvLiogLnJlbC5nbnUubGlua29uY2UuZC5yZWwucm8uKikKKyAgICAgICooLnJlbC5kYXRhIC5yZWwuZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbC50ZGF0YSAucmVsLnRkYXRhLiogLnJlbC5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbC50YnNzIC5yZWwudGJzcy4qIC5yZWwuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWwuY3RvcnMpCisgICAgICAqKC5yZWwuZHRvcnMpCisgICAgICAqKC5yZWwuZ290KQorICAgICAgKigucmVsLmJzcyAucmVsLmJzcy4qIC5yZWwuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbC5pZnVuYykKKyAgICB9CisgIC5yZWwucGx0ICAgICAgICA6CisgICAgeworICAgICAgKigucmVsLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWwuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QucGx0KSAqKC5pZ290LnBsdCkgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgwLCAuKTsKKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oMzIgLyA4KTsKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueCBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y3NGY0MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLngKQEAgLTAsMCArMSwyMjkgQEAKKy8qIERlZmF1bHQgbGlua2VyIHNjcmlwdCwgZm9yIG5vcm1hbCBleGVjdXRhYmxlcyAqLworLyogTW9kaWZpZWQgZm9yIEFuZHJvaWQuICAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtazFvbSIsICJlbGY2NC1rMW9tIiwKKwkgICAgICAiZWxmNjQtazFvbSIpCitPVVRQVVRfQVJDSChrMW9tKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDB4NDAwMDAwKTsgLiA9IDB4NDAwMDAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgICA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgICA6IHsgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWxhLmZpbmkgICAgICA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgICA6IHsgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsYS5kYXRhLnJlbC5ybyAgIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvIC5yZWxhLmRhdGEucmVsLnJvLiogLnJlbGEuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLnJlbGEuZGF0YSAgICAgIDogeyAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopIH0KKyAgLnJlbGEudGRhdGEJICA6IHsgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC5yZWxhLnRic3MJICA6IHsgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikgfQorICAucmVsYS5jdG9ycyAgICAgOiB7ICooLnJlbGEuY3RvcnMpIH0KKyAgLnJlbGEuZHRvcnMgICAgIDogeyAqKC5yZWxhLmR0b3JzKSB9CisgIC5yZWxhLmdvdCAgICAgICA6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbGEuYnNzICAgICAgIDogeyAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKSB9CisgIC5yZWxhLmxkYXRhICAgICA6IHsgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopIH0KKyAgLnJlbGEubGJzcyAgICAgIDogeyAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKSB9CisgIC5yZWxhLmxyb2RhdGEgICA6IHsgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikgfQorICAucmVsYS5pcGx0ICAgICAgOgorICAgIHsKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgICA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDI0ID8gMjQgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oNjQgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnhibiBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnhibgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWUzMmZiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueGJuCkBAIC0wLDAgKzEsMjI2IEBACisvKiBTY3JpcHQgZm9yIC1OOiBtaXggdGV4dCBhbmQgZGF0YSBvbiBzYW1lIHBhZ2U7IGRvbid0IGFsaWduIGRhdGEgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWsxb20iLCAiZWxmNjQtazFvbSIsCisJICAgICAgImVsZjY0LWsxb20iKQorT1VUUFVUX0FSQ0goazFvbSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAweDQwMDAwMCk7IC4gPSAweDQwMDAwMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgICAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgICAgOiB7ICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsYS5maW5pICAgICAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgICAgOiB7ICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJlbGEuZGF0YS5yZWwucm8gICA6IHsgKigucmVsYS5kYXRhLnJlbC5ybyAucmVsYS5kYXRhLnJlbC5yby4qIC5yZWxhLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWxhLmRhdGEgICAgICA6IHsgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWxhLnRkYXRhCSAgOiB7ICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsYS50YnNzCSAgOiB7ICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopIH0KKyAgLnJlbGEuY3RvcnMgICAgIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgICA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgICAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgICA6IHsgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikgfQorICAucmVsYS5sZGF0YSAgICAgOiB7ICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKSB9CisgIC5yZWxhLmxic3MgICAgICA6IHsgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikgfQorICAucmVsYS5scm9kYXRhICAgOiB7ICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopIH0KKyAgLnJlbGEuaXBsdCAgICAgIDoKKyAgICB7CisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgICAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IC47CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oNjQgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54YyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnhjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNGNkMzYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54YwpAQCAtMCwwICsxLDIyOSBAQAorLyogU2NyaXB0IGZvciAteiBjb21icmVsb2M6IGNvbWJpbmUgYW5kIHNvcnQgcmVsb2Mgc2VjdGlvbnMgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWsxb20iLCAiZWxmNjQtazFvbSIsCisJICAgICAgImVsZjY0LWsxb20iKQorT1VUUFVUX0FSQ0goazFvbSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAweDQwMDAwMCk7IC4gPSAweDQwMDAwMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikKKyAgICAgICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopCisgICAgICAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X2VuZCA9IC4pOworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAgIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueGQgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDY1NjQ1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueGQKQEAgLTAsMCArMSwyMjggQEAKKy8qIFNjcmlwdCBmb3IgbGQgLXBpZTogbGluayBwb3NpdGlvbiBpbmRlcGVuZGVudCBleGVjdXRhYmxlICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1rMW9tIiwgImVsZjY0LWsxb20iLAorCSAgICAgICJlbGY2NC1rMW9tIikKK09VVFBVVF9BUkNIKGsxb20pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMCk7IC4gPSAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgICA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgICA6IHsgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWxhLmZpbmkgICAgICA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgICA6IHsgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsYS5kYXRhLnJlbC5ybyAgIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvIC5yZWxhLmRhdGEucmVsLnJvLiogLnJlbGEuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLnJlbGEuZGF0YSAgICAgIDogeyAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopIH0KKyAgLnJlbGEudGRhdGEJICA6IHsgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC5yZWxhLnRic3MJICA6IHsgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikgfQorICAucmVsYS5jdG9ycyAgICAgOiB7ICooLnJlbGEuY3RvcnMpIH0KKyAgLnJlbGEuZHRvcnMgICAgIDogeyAqKC5yZWxhLmR0b3JzKSB9CisgIC5yZWxhLmdvdCAgICAgICA6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbGEuYnNzICAgICAgIDogeyAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKSB9CisgIC5yZWxhLmxkYXRhICAgICA6IHsgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopIH0KKyAgLnJlbGEubGJzcyAgICAgIDogeyAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKSB9CisgIC5yZWxhLmxyb2RhdGEgICA6IHsgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikgfQorICAucmVsYS5pcGx0ICAgICAgOgorICAgIHsKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgICA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDI0ID8gMjQgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oNjQgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnhkYyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnhkYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjAzZGQ0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueGRjCkBAIC0wLDAgKzEsMjI5IEBACisvKiBTY3JpcHQgZm9yIC1waWUgLXogY29tYnJlbG9jOiBwb3NpdGlvbiBpbmRlcGVuZGVudCBleGVjdXRhYmxlLCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWsxb20iLCAiZWxmNjQtazFvbSIsCisJICAgICAgImVsZjY0LWsxb20iKQorT1VUUFVUX0FSQ0goazFvbSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAwKTsgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopCisgICAgICAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKQorICAgICAgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X3N0YXJ0ID0gLik7CisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9lbmQgPSAuKTsKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgICA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDI0ID8gMjQgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oNjQgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnhkdyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnhkdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmM4NzUwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueGR3CkBAIC0wLDAgKzEsMjI4IEBACisvKiBTY3JpcHQgZm9yIC1waWUgLXogY29tYnJlbG9jIC16IG5vdyAteiByZWxybzogcG9zaXRpb24gaW5kZXBlbmRlbnQgZXhlY3V0YWJsZSwgY29tYmluZSAmIHNvcnQgcmVsb2NzICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1rMW9tIiwgImVsZjY0LWsxb20iLAorCSAgICAgICJlbGY2NC1rMW9tIikKK09VVFBVVF9BUkNIKGsxb20pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMCk7IC4gPSAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9zdGFydCA9IC4pOworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfZW5kID0gLik7CisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgICAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290LnBsdCkgKiguaWdvdC5wbHQpICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMCwgLik7CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54biBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnhuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZDczNDEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54bgpAQCAtMCwwICsxLDIyOCBAQAorLyogU2NyaXB0IGZvciAtbjogbWl4IHRleHQgYW5kIGRhdGEgb24gc2FtZSBwYWdlICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1rMW9tIiwgImVsZjY0LWsxb20iLAorCSAgICAgICJlbGY2NC1rMW9tIikKK09VVFBVVF9BUkNIKGsxb20pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMHg0MDAwMDApOyAuID0gMHg0MDAwMDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAgIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAgIDogeyAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbGEuZmluaSAgICAgIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAgIDogeyAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8gLnJlbGEuZGF0YS5yZWwucm8uKiAucmVsYS5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsYS5kYXRhICAgICAgOiB7ICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsYS50ZGF0YQkgIDogeyAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbGEudGJzcwkgIDogeyAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWxhLmN0b3JzICAgICA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgICAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAgIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgICAgOiB7ICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbGEubGRhdGEgICAgIDogeyAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikgfQorICAucmVsYS5sYnNzICAgICAgOiB7ICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopIH0KKyAgLnJlbGEubHJvZGF0YSAgIDogeyAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKSB9CisgIC5yZWxhLmlwbHQgICAgICA6CisgICAgeworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAgIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueHIgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54cgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzVlZDg3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueHIKQEAgLTAsMCArMSwxNTggQEAKKy8qIFNjcmlwdCBmb3IgbGQgLXI6IGxpbmsgd2l0aG91dCByZWxvY2F0aW9uICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1rMW9tIiwgImVsZjY0LWsxb20iLAorCSAgICAgICJlbGY2NC1rMW9tIikKK09VVFBVVF9BUkNIKGsxb20pCisgLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCisgIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCisgIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCisgIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi8KK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuaW50ZXJwICAgICAgIDAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgMCA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgIDAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgMCA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgMCA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgMCA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgMDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yIDA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgIDAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgIDAgOiB7ICooLnJlbGEudGV4dCkgfQorICAucmVsYS5maW5pICAgIDAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgIDAgOiB7ICooLnJlbGEucm9kYXRhKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvIDAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8pIH0KKyAgLnJlbGEuZGF0YSAgICAwIDogeyAqKC5yZWxhLmRhdGEpIH0KKyAgLnJlbGEudGRhdGEJMCA6IHsgKigucmVsYS50ZGF0YSkgfQorICAucmVsYS50YnNzCTAgOiB7ICooLnJlbGEudGJzcykgfQorICAucmVsYS5jdG9ycyAgIDAgOiB7ICooLnJlbGEuY3RvcnMpIH0KKyAgLnJlbGEuZHRvcnMgICAwIDogeyAqKC5yZWxhLmR0b3JzKSB9CisgIC5yZWxhLmdvdCAgICAgMCA6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbGEuYnNzICAgICAwIDogeyAqKC5yZWxhLmJzcykgfQorICAucmVsYS5sZGF0YSAgIDAgOiB7ICooLnJlbGEubGRhdGEpIH0KKyAgLnJlbGEubGJzcyAgICAwIDogeyAqKC5yZWxhLmxic3MpIH0KKyAgLnJlbGEubHJvZGF0YSAwIDogeyAqKC5yZWxhLmxyb2RhdGEpIH0KKyAgLnJlbGEuaXBsdCAgICAwIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgfQorICAucmVsYS5wbHQgICAgIDAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAwIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAwIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAwIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgMCA6CisgIHsKKyAgICAqKC50ZXh0IC5zdHViKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgMCA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIC5yb2RhdGEgICAgICAgMCA6IHsgKigucm9kYXRhKSB9CisgIC5yb2RhdGExICAgICAgMCA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAwIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAwIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzIDAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgMCA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgMCA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgMCA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCTAgOiB7ICooLnRkYXRhKSB9CisgIC50YnNzCQkwIDogeyAqKC50YnNzKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC5wcmVpbml0X2FycmF5ICAgMCA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICAuamNyICAgICAgICAgIDAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmR5bmFtaWMgICAgICAwIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgMCA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC5nb3QucGx0ICAgICAgMCA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgMCA6CisgIHsKKyAgICAqKC5kYXRhKQorICB9CisgIC5kYXRhMSAgICAgICAgMCA6IHsgKiguZGF0YTEpIH0KKyAgLmJzcyAgICAgICAgICAwIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICB9CisgIC5sYnNzIDAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC5scm9kYXRhIDAgIDoKKyAgeworICAgICooLmxyb2RhdGEpCisgIH0KKyAgLmxkYXRhIDAgIDoKKyAgeworICAgICooLmxkYXRhKQorICB9CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnhzIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE5MmY1ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnhzCkBAIC0wLDAgKzEsMjE5IEBACisvKiBTY3JpcHQgZm9yIGxkIC0tc2hhcmVkOiBsaW5rIHNoYXJlZCBsaWJyYXJ5ICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1rMW9tIiwgImVsZjY0LWsxb20iLAorCSAgICAgICJlbGY2NC1rMW9tIikKK09VVFBVVF9BUkNIKGsxb20pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAgIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAgIDogeyAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbGEuZmluaSAgICAgIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAgIDogeyAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8gLnJlbGEuZGF0YS5yZWwucm8uKiAucmVsYS5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsYS5kYXRhICAgICAgOiB7ICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsYS50ZGF0YQkgIDogeyAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbGEudGJzcwkgIDogeyAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWxhLmN0b3JzICAgICA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgICAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAgIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgICAgOiB7ICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbGEubGRhdGEgICAgIDogeyAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikgfQorICAucmVsYS5sYnNzICAgICAgOiB7ICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopIH0KKyAgLnJlbGEubHJvZGF0YSAgIDogeyAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKSB9CisgIC5yZWxhLmlwbHQgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pcGx0KQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgICA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDI0ID8gMjQgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oNjQgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnhzYyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9rMW9tLnhzYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTZlNWQxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueHNjCkBAIC0wLDAgKzEsMjE5IEBACisvKiBTY3JpcHQgZm9yIC0tc2hhcmVkIC16IGNvbWJyZWxvYzogc2hhcmVkIGxpYnJhcnksIGNvbWJpbmUgJiBzb3J0IHJlbG9jcyAqLworLyogTW9kaWZpZWQgZm9yIEFuZHJvaWQuICAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtazFvbSIsICJlbGY2NC1rMW9tIiwKKwkgICAgICAiZWxmNjQtazFvbSIpCitPVVRQVVRfQVJDSChrMW9tKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSAwICsgU0laRU9GX0hFQURFUlM7CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAgIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueHN3IGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueHN3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZjNkZjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54c3cKQEAgLTAsMCArMSwyMTcgQEAKKy8qIFNjcmlwdCBmb3IgLS1zaGFyZWQgLXogY29tYnJlbG9jIC16IG5vdyAteiByZWxybzogc2hhcmVkIGxpYnJhcnksIGNvbWJpbmUgJiBzb3J0IHJlbG9jcyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtazFvbSIsICJlbGY2NC1rMW9tIiwKKwkgICAgICAiZWxmNjQtazFvbSIpCitPVVRQVVRfQVJDSChrMW9tKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSAwICsgU0laRU9GX0hFQURFUlM7CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAgIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdC5wbHQpICooLmlnb3QucGx0KSAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKDAsIC4pOworICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueHUgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54dQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWJlYzcxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueHUKQEAgLTAsMCArMSwxNTkgQEAKKy8qIFNjcmlwdCBmb3IgbGQgLVVyOiBsaW5rIHcvb3V0IHJlbG9jYXRpb24sIGRvIGNyZWF0ZSBjb25zdHJ1Y3RvcnMgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWsxb20iLCAiZWxmNjQtazFvbSIsCisJICAgICAgImVsZjY0LWsxb20iKQorT1VUUFVUX0FSQ0goazFvbSkKKyAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBTb2xhcmlzIGxpbmtlciBtYWtlcyBiYWQgZXhlY3V0YWJsZXMKKyAgaWYgZ2xkIC1yIGlzIHVzZWQgYW5kIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBoYXMgc2VjdGlvbnMgc3RhcnRpbmcKKyAgYXQgbm9uLXplcm8gYWRkcmVzc2VzLiAgQ291bGQgYmUgYSBTb2xhcmlzIGxkIGJ1ZywgY291bGQgYmUgYSBHTlUgbGQKKyAgYnVnLiAgQnV0IGZvciBub3cgYXNzaWduaW5nIHRoZSB6ZXJvIHZtYXMgd29ya3MuICAqLworU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC5pbnRlcnAgICAgICAgMCA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAwIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgMCA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAwIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAwIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAwIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAwOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgMDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgMCA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgMCA6IHsgKigucmVsYS50ZXh0KSB9CisgIC5yZWxhLmZpbmkgICAgMCA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgMCA6IHsgKigucmVsYS5yb2RhdGEpIH0KKyAgLnJlbGEuZGF0YS5yZWwucm8gMCA6IHsgKigucmVsYS5kYXRhLnJlbC5ybykgfQorICAucmVsYS5kYXRhICAgIDAgOiB7ICooLnJlbGEuZGF0YSkgfQorICAucmVsYS50ZGF0YQkwIDogeyAqKC5yZWxhLnRkYXRhKSB9CisgIC5yZWxhLnRic3MJMCA6IHsgKigucmVsYS50YnNzKSB9CisgIC5yZWxhLmN0b3JzICAgMCA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgIDAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAwIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgIDAgOiB7ICooLnJlbGEuYnNzKSB9CisgIC5yZWxhLmxkYXRhICAgMCA6IHsgKigucmVsYS5sZGF0YSkgfQorICAucmVsYS5sYnNzICAgIDAgOiB7ICooLnJlbGEubGJzcykgfQorICAucmVsYS5scm9kYXRhIDAgOiB7ICooLnJlbGEubHJvZGF0YSkgfQorICAucmVsYS5pcGx0ICAgIDAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgMCA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgIDAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgIDAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgIDAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAwIDoKKyAgeworICAgICooLnRleHQgLnN0dWIpCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAwIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgLnJvZGF0YSAgICAgICAwIDogeyAqKC5yb2RhdGEpIH0KKyAgLnJvZGF0YTEgICAgICAwIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgIDAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlIDAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgMCA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAwIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAwIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAwIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJMCA6IHsgKigudGRhdGEpIH0KKyAgLnRic3MJCTAgOiB7ICooLnRic3MpIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLnByZWluaXRfYXJyYXkgICAwIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5qY3IgICAgICAgICAgMCA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZHluYW1pYyAgICAgIDAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAwIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLmdvdC5wbHQgICAgICAwIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAwIDoKKyAgeworICAgICooLmRhdGEpCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAwIDogeyAqKC5kYXRhMSkgfQorICAuYnNzICAgICAgICAgIDAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgIH0KKyAgLmxic3MgMCA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MpCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLmxyb2RhdGEgMCAgOgorICB7CisgICAgKigubHJvZGF0YSkKKyAgfQorICAubGRhdGEgMCAgOgorICB7CisgICAgKigubGRhdGEpCisgIH0KKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueHcgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfazFvbS54dwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2ZmOTZhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2sxb20ueHcKQEAgLTAsMCArMSwyMjggQEAKKy8qIFNjcmlwdCBmb3IgLXogY29tYnJlbG9jIC16IG5vdyAteiByZWxybzogY29tYmluZSBhbmQgc29ydCByZWxvYyBzZWN0aW9ucyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtazFvbSIsICJlbGY2NC1rMW9tIiwKKwkgICAgICAiZWxmNjQtazFvbSIpCitPVVRQVVRfQVJDSChrMW9tKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDB4NDAwMDAwKTsgLiA9IDB4NDAwMDAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9zdGFydCA9IC4pOworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfZW5kID0gLik7CisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgICAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290LnBsdCkgKiguaWdvdC5wbHQpICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMCwgLik7CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54IGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODIwMzEyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueApAQCAtMCwwICsxLDIyOSBAQAorLyogRGVmYXVsdCBsaW5rZXIgc2NyaXB0LCBmb3Igbm9ybWFsIGV4ZWN1dGFibGVzICovCisvKiBNb2RpZmllZCBmb3IgQW5kcm9pZC4gICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1sMW9tIiwgImVsZjY0LWwxb20iLAorCSAgICAgICJlbGY2NC1sMW9tIikKK09VVFBVVF9BUkNIKGwxb20pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMHg0MDAwMDApOyAuID0gMHg0MDAwMDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAgIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAgIDogeyAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbGEuZmluaSAgICAgIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAgIDogeyAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8gLnJlbGEuZGF0YS5yZWwucm8uKiAucmVsYS5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsYS5kYXRhICAgICAgOiB7ICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsYS50ZGF0YQkgIDogeyAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbGEudGJzcwkgIDogeyAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWxhLmN0b3JzICAgICA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgICAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAgIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgICAgOiB7ICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbGEubGRhdGEgICAgIDogeyAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikgfQorICAucmVsYS5sYnNzICAgICAgOiB7ICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopIH0KKyAgLnJlbGEubHJvZGF0YSAgIDogeyAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKSB9CisgIC5yZWxhLmlwbHQgICAgICA6CisgICAgeworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAgIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueGJuIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueGJuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjQ5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54Ym4KQEAgLTAsMCArMSwyMjYgQEAKKy8qIFNjcmlwdCBmb3IgLU46IG1peCB0ZXh0IGFuZCBkYXRhIG9uIHNhbWUgcGFnZTsgZG9uJ3QgYWxpZ24gZGF0YSAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtbDFvbSIsICJlbGY2NC1sMW9tIiwKKwkgICAgICAiZWxmNjQtbDFvbSIpCitPVVRQVVRfQVJDSChsMW9tKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDB4NDAwMDAwKTsgLiA9IDB4NDAwMDAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgICA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgICA6IHsgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWxhLmZpbmkgICAgICA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgICA6IHsgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsYS5kYXRhLnJlbC5ybyAgIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvIC5yZWxhLmRhdGEucmVsLnJvLiogLnJlbGEuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLnJlbGEuZGF0YSAgICAgIDogeyAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopIH0KKyAgLnJlbGEudGRhdGEJICA6IHsgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC5yZWxhLnRic3MJICA6IHsgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikgfQorICAucmVsYS5jdG9ycyAgICAgOiB7ICooLnJlbGEuY3RvcnMpIH0KKyAgLnJlbGEuZHRvcnMgICAgIDogeyAqKC5yZWxhLmR0b3JzKSB9CisgIC5yZWxhLmdvdCAgICAgICA6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbGEuYnNzICAgICAgIDogeyAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKSB9CisgIC5yZWxhLmxkYXRhICAgICA6IHsgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopIH0KKyAgLnJlbGEubGJzcyAgICAgIDogeyAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKSB9CisgIC5yZWxhLmxyb2RhdGEgICA6IHsgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikgfQorICAucmVsYS5pcGx0ICAgICAgOgorICAgIHsKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgICA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gLjsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhjIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0NmQzYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhjCkBAIC0wLDAgKzEsMjI5IEBACisvKiBTY3JpcHQgZm9yIC16IGNvbWJyZWxvYzogY29tYmluZSBhbmQgc29ydCByZWxvYyBzZWN0aW9ucyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtbDFvbSIsICJlbGY2NC1sMW9tIiwKKwkgICAgICAiZWxmNjQtbDFvbSIpCitPVVRQVVRfQVJDSChsMW9tKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDB4NDAwMDAwKTsgLiA9IDB4NDAwMDAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9zdGFydCA9IC4pOworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfZW5kID0gLik7CisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgICAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAyNCA/IDI0IDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54ZCBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MjljN2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54ZApAQCAtMCwwICsxLDIyOCBAQAorLyogU2NyaXB0IGZvciBsZCAtcGllOiBsaW5rIHBvc2l0aW9uIGluZGVwZW5kZW50IGV4ZWN1dGFibGUgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWwxb20iLCAiZWxmNjQtbDFvbSIsCisJICAgICAgImVsZjY0LWwxb20iKQorT1VUUFVUX0FSQ0gobDFvbSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAwKTsgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAgIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAgIDogeyAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbGEuZmluaSAgICAgIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAgIDogeyAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8gLnJlbGEuZGF0YS5yZWwucm8uKiAucmVsYS5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsYS5kYXRhICAgICAgOiB7ICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsYS50ZGF0YQkgIDogeyAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbGEudGJzcwkgIDogeyAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWxhLmN0b3JzICAgICA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgICAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAgIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgICAgOiB7ICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbGEubGRhdGEgICAgIDogeyAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikgfQorICAucmVsYS5sYnNzICAgICAgOiB7ICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopIH0KKyAgLnJlbGEubHJvZGF0YSAgIDogeyAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKSB9CisgIC5yZWxhLmlwbHQgICAgICA6CisgICAgeworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAgIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueGRjIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueGRjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYWYzN2EKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54ZGMKQEAgLTAsMCArMSwyMjkgQEAKKy8qIFNjcmlwdCBmb3IgLXBpZSAteiBjb21icmVsb2M6IHBvc2l0aW9uIGluZGVwZW5kZW50IGV4ZWN1dGFibGUsIGNvbWJpbmUgJiBzb3J0IHJlbG9jcyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtbDFvbSIsICJlbGY2NC1sMW9tIiwKKwkgICAgICAiZWxmNjQtbDFvbSIpCitPVVRQVVRfQVJDSChsMW9tKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDApOyAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikKKyAgICAgICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopCisgICAgICAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X2VuZCA9IC4pOworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAgIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueGR3IGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueGR3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZWQxNWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54ZHcKQEAgLTAsMCArMSwyMjggQEAKKy8qIFNjcmlwdCBmb3IgLXBpZSAteiBjb21icmVsb2MgLXogbm93IC16IHJlbHJvOiBwb3NpdGlvbiBpbmRlcGVuZGVudCBleGVjdXRhYmxlLCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWwxb20iLCAiZWxmNjQtbDFvbSIsCisJICAgICAgImVsZjY0LWwxb20iKQorT1VUUFVUX0FSQ0gobDFvbSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAwKTsgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopCisgICAgICAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKQorICAgICAgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X3N0YXJ0ID0gLik7CisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9lbmQgPSAuKTsKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgICA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QucGx0KSAqKC5pZ290LnBsdCkgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgwLCAuKTsKKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oNjQgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhuIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0M2ZkMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhuCkBAIC0wLDAgKzEsMjI4IEBACisvKiBTY3JpcHQgZm9yIC1uOiBtaXggdGV4dCBhbmQgZGF0YSBvbiBzYW1lIHBhZ2UgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWwxb20iLCAiZWxmNjQtbDFvbSIsCisJICAgICAgImVsZjY0LWwxb20iKQorT1VUUFVUX0FSQ0gobDFvbSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAweDQwMDAwMCk7IC4gPSAweDQwMDAwMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgICAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgICAgOiB7ICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsYS5maW5pICAgICAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgICAgOiB7ICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJlbGEuZGF0YS5yZWwucm8gICA6IHsgKigucmVsYS5kYXRhLnJlbC5ybyAucmVsYS5kYXRhLnJlbC5yby4qIC5yZWxhLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWxhLmRhdGEgICAgICA6IHsgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWxhLnRkYXRhCSAgOiB7ICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsYS50YnNzCSAgOiB7ICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopIH0KKyAgLnJlbGEuY3RvcnMgICAgIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgICA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgICAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgICA6IHsgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikgfQorICAucmVsYS5sZGF0YSAgICAgOiB7ICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKSB9CisgIC5yZWxhLmxic3MgICAgICA6IHsgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikgfQorICAucmVsYS5scm9kYXRhICAgOiB7ICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopIH0KKyAgLnJlbGEuaXBsdCAgICAgIDoKKyAgICB7CisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgICAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAyNCA/IDI0IDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54ciBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZDVlYWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54cgpAQCAtMCwwICsxLDE1OCBAQAorLyogU2NyaXB0IGZvciBsZCAtcjogbGluayB3aXRob3V0IHJlbG9jYXRpb24gKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWwxb20iLCAiZWxmNjQtbDFvbSIsCisJICAgICAgImVsZjY0LWwxb20iKQorT1VUUFVUX0FSQ0gobDFvbSkKKyAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBTb2xhcmlzIGxpbmtlciBtYWtlcyBiYWQgZXhlY3V0YWJsZXMKKyAgaWYgZ2xkIC1yIGlzIHVzZWQgYW5kIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBoYXMgc2VjdGlvbnMgc3RhcnRpbmcKKyAgYXQgbm9uLXplcm8gYWRkcmVzc2VzLiAgQ291bGQgYmUgYSBTb2xhcmlzIGxkIGJ1ZywgY291bGQgYmUgYSBHTlUgbGQKKyAgYnVnLiAgQnV0IGZvciBub3cgYXNzaWduaW5nIHRoZSB6ZXJvIHZtYXMgd29ya3MuICAqLworU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC5pbnRlcnAgICAgICAgMCA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAwIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgMCA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAwIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAwIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAwIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAwOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgMDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgMCA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgMCA6IHsgKigucmVsYS50ZXh0KSB9CisgIC5yZWxhLmZpbmkgICAgMCA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgMCA6IHsgKigucmVsYS5yb2RhdGEpIH0KKyAgLnJlbGEuZGF0YS5yZWwucm8gMCA6IHsgKigucmVsYS5kYXRhLnJlbC5ybykgfQorICAucmVsYS5kYXRhICAgIDAgOiB7ICooLnJlbGEuZGF0YSkgfQorICAucmVsYS50ZGF0YQkwIDogeyAqKC5yZWxhLnRkYXRhKSB9CisgIC5yZWxhLnRic3MJMCA6IHsgKigucmVsYS50YnNzKSB9CisgIC5yZWxhLmN0b3JzICAgMCA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgIDAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAwIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgIDAgOiB7ICooLnJlbGEuYnNzKSB9CisgIC5yZWxhLmxkYXRhICAgMCA6IHsgKigucmVsYS5sZGF0YSkgfQorICAucmVsYS5sYnNzICAgIDAgOiB7ICooLnJlbGEubGJzcykgfQorICAucmVsYS5scm9kYXRhIDAgOiB7ICooLnJlbGEubHJvZGF0YSkgfQorICAucmVsYS5pcGx0ICAgIDAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgMCA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgIDAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgIDAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgIDAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAwIDoKKyAgeworICAgICooLnRleHQgLnN0dWIpCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAwIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgLnJvZGF0YSAgICAgICAwIDogeyAqKC5yb2RhdGEpIH0KKyAgLnJvZGF0YTEgICAgICAwIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgIDAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlIDAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgMCA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAwIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAwIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAwIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJMCA6IHsgKigudGRhdGEpIH0KKyAgLnRic3MJCTAgOiB7ICooLnRic3MpIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLnByZWluaXRfYXJyYXkgICAwIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5qY3IgICAgICAgICAgMCA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZHluYW1pYyAgICAgIDAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAwIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLmdvdC5wbHQgICAgICAwIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAwIDoKKyAgeworICAgICooLmRhdGEpCisgIH0KKyAgLmRhdGExICAgICAgICAwIDogeyAqKC5kYXRhMSkgfQorICAuYnNzICAgICAgICAgIDAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgIH0KKyAgLmxic3MgMCA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MpCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLmxyb2RhdGEgMCAgOgorICB7CisgICAgKigubHJvZGF0YSkKKyAgfQorICAubGRhdGEgMCAgOgorICB7CisgICAgKigubGRhdGEpCisgIH0KKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueHMgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTU5ZDQyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueHMKQEAgLTAsMCArMSwyMTkgQEAKKy8qIFNjcmlwdCBmb3IgbGQgLS1zaGFyZWQ6IGxpbmsgc2hhcmVkIGxpYnJhcnkgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWwxb20iLCAiZWxmNjQtbDFvbSIsCisJICAgICAgImVsZjY0LWwxb20iKQorT1VUUFVUX0FSQ0gobDFvbSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgICAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgICAgOiB7ICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsYS5maW5pICAgICAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgICAgOiB7ICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJlbGEuZGF0YS5yZWwucm8gICA6IHsgKigucmVsYS5kYXRhLnJlbC5ybyAucmVsYS5kYXRhLnJlbC5yby4qIC5yZWxhLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWxhLmRhdGEgICAgICA6IHsgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWxhLnRkYXRhCSAgOiB7ICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsYS50YnNzCSAgOiB7ICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopIH0KKyAgLnJlbGEuY3RvcnMgICAgIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgICA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgICAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgICA6IHsgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikgfQorICAucmVsYS5sZGF0YSAgICAgOiB7ICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKSB9CisgIC5yZWxhLmxic3MgICAgICA6IHsgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikgfQorICAucmVsYS5scm9kYXRhICAgOiB7ICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopIH0KKyAgLnJlbGEuaXBsdCAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAgIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueHNjIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueHNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYmRjMTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54c2MKQEAgLTAsMCArMSwyMTkgQEAKKy8qIFNjcmlwdCBmb3IgLS1zaGFyZWQgLXogY29tYnJlbG9jOiBzaGFyZWQgbGlicmFyeSwgY29tYmluZSAmIHNvcnQgcmVsb2NzICovCisvKiBNb2RpZmllZCBmb3IgQW5kcm9pZC4gICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1sMW9tIiwgImVsZjY0LWwxb20iLAorCSAgICAgICJlbGY2NC1sMW9tIikKK09VVFBVVF9BUkNIKGwxb20pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopCisgICAgICAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKQorICAgICAgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgICAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAyNCA/IDI0IDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54c3cgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54c3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4NTZkZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhzdwpAQCAtMCwwICsxLDIxNyBAQAorLyogU2NyaXB0IGZvciAtLXNoYXJlZCAteiBjb21icmVsb2MgLXogbm93IC16IHJlbHJvOiBzaGFyZWQgbGlicmFyeSwgY29tYmluZSAmIHNvcnQgcmVsb2NzICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1sMW9tIiwgImVsZjY0LWwxb20iLAorCSAgICAgICJlbGY2NC1sMW9tIikKK09VVFBVVF9BUkNIKGwxb20pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopCisgICAgICAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKQorICAgICAgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgICAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290LnBsdCkgKiguaWdvdC5wbHQpICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMCwgLik7CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54dSBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnh1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1M2RmYmUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54dQpAQCAtMCwwICsxLDE1OSBAQAorLyogU2NyaXB0IGZvciBsZCAtVXI6IGxpbmsgdy9vdXQgcmVsb2NhdGlvbiwgZG8gY3JlYXRlIGNvbnN0cnVjdG9ycyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtbDFvbSIsICJlbGY2NC1sMW9tIiwKKwkgICAgICAiZWxmNjQtbDFvbSIpCitPVVRQVVRfQVJDSChsMW9tKQorIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlcworICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZworICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZAorICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLmludGVycCAgICAgICAwIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgIDAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAwIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgIDAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgIDAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gIDAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kIDA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAwOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAwIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAwIDogeyAqKC5yZWxhLnRleHQpIH0KKyAgLnJlbGEuZmluaSAgICAwIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAwIDogeyAqKC5yZWxhLnJvZGF0YSkgfQorICAucmVsYS5kYXRhLnJlbC5ybyAwIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvKSB9CisgIC5yZWxhLmRhdGEgICAgMCA6IHsgKigucmVsYS5kYXRhKSB9CisgIC5yZWxhLnRkYXRhCTAgOiB7ICooLnJlbGEudGRhdGEpIH0KKyAgLnJlbGEudGJzcwkwIDogeyAqKC5yZWxhLnRic3MpIH0KKyAgLnJlbGEuY3RvcnMgICAwIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgMCA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgIDAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgMCA6IHsgKigucmVsYS5ic3MpIH0KKyAgLnJlbGEubGRhdGEgICAwIDogeyAqKC5yZWxhLmxkYXRhKSB9CisgIC5yZWxhLmxic3MgICAgMCA6IHsgKigucmVsYS5sYnNzKSB9CisgIC5yZWxhLmxyb2RhdGEgMCA6IHsgKigucmVsYS5scm9kYXRhKSB9CisgIC5yZWxhLmlwbHQgICAgMCA6CisgICAgeworICAgICAgKigucmVsYS5pcGx0KQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAwIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgMCA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgMCA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgMCA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgIDAgOgorICB7CisgICAgKigudGV4dCAuc3R1YikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgIDAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICAucm9kYXRhICAgICAgIDAgOiB7ICooLnJvZGF0YSkgfQorICAucm9kYXRhMSAgICAgIDAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgMCA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgMCA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAwIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgIDAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlIDAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzIDAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkwIDogeyAqKC50ZGF0YSkgfQorICAudGJzcwkJMCA6IHsgKigudGJzcykgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICAucHJlaW5pdF9hcnJheSAgIDAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmpjciAgICAgICAgICAwIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5keW5hbWljICAgICAgMCA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgIDAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuZ290LnBsdCAgICAgIDAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgIDAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgIDAgOiB7ICooLmRhdGExKSB9CisgIC5ic3MgICAgICAgICAgMCA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgfQorICAubGJzcyAwIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcykKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAubHJvZGF0YSAwICA6CisgIHsKKyAgICAqKC5scm9kYXRhKQorICB9CisgIC5sZGF0YSAwICA6CisgIHsKKyAgICAqKC5sZGF0YSkKKyAgfQorICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54dyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnh3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMTUxYTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54dwpAQCAtMCwwICsxLDIyOCBAQAorLyogU2NyaXB0IGZvciAteiBjb21icmVsb2MgLXogbm93IC16IHJlbHJvOiBjb21iaW5lIGFuZCBzb3J0IHJlbG9jIHNlY3Rpb25zICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1sMW9tIiwgImVsZjY0LWwxb20iLAorCSAgICAgICJlbGY2NC1sMW9tIikKK09VVFBVVF9BUkNIKGwxb20pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMHg0MDAwMDApOyAuID0gMHg0MDAwMDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopCisgICAgICAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKQorICAgICAgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X3N0YXJ0ID0gLik7CisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9lbmQgPSAuKTsKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgICA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QucGx0KSAqKC5pZ290LnBsdCkgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgwLCAuKTsKKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oNjQgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueCBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2YxZmI0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54CkBAIC0wLDAgKzEsMjI2IEBACisvKiBEZWZhdWx0IGxpbmtlciBzY3JpcHQsIGZvciBub3JtYWwgZXhlY3V0YWJsZXMgKi8KKy8qIE1vZGlmaWVkIGZvciBBbmRyb2lkLiAgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLAorCSAgICAgICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMHg0MDAwMDApOyAuID0gMHg0MDAwMDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAgIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAgIDogeyAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbGEuZmluaSAgICAgIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAgIDogeyAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8gLnJlbGEuZGF0YS5yZWwucm8uKiAucmVsYS5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsYS5kYXRhICAgICAgOiB7ICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsYS50ZGF0YQkgIDogeyAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbGEudGJzcwkgIDogeyAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWxhLmN0b3JzICAgICA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgICAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAgIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgICAgOiB7ICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbGEubGRhdGEgICAgIDogeyAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikgfQorICAucmVsYS5sYnNzICAgICAgOiB7ICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopIH0KKyAgLnJlbGEubHJvZGF0YSAgIDogeyAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKSB9CisgIC5yZWxhLmlmdW5jICAgICA6IHsgKigucmVsYS5pZnVuYykgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDI0ID8gMjQgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oNjQgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueGJuIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54Ym4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRmOGU5ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueGJuCkBAIC0wLDAgKzEsMjIzIEBACisvKiBTY3JpcHQgZm9yIC1OOiBtaXggdGV4dCBhbmQgZGF0YSBvbiBzYW1lIHBhZ2U7IGRvbid0IGFsaWduIGRhdGEgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLAorCSAgICAgICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gMHg0MDAwMDApOyAuID0gMHg0MDAwMDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAgIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAgIDogeyAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbGEuZmluaSAgICAgIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAgIDogeyAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8gLnJlbGEuZGF0YS5yZWwucm8uKiAucmVsYS5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsYS5kYXRhICAgICAgOiB7ICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsYS50ZGF0YQkgIDogeyAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbGEudGJzcwkgIDogeyAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWxhLmN0b3JzICAgICA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgICAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAgIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgICAgOiB7ICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbGEubGRhdGEgICAgIDogeyAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikgfQorICAucmVsYS5sYnNzICAgICAgOiB7ICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopIH0KKyAgLnJlbGEubHJvZGF0YSAgIDogeyAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKSB9CisgIC5yZWxhLmlmdW5jICAgICA6IHsgKigucmVsYS5pZnVuYykgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gLjsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueGMgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlODZhZDgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhjCkBAIC0wLDAgKzEsMjI3IEBACisvKiBTY3JpcHQgZm9yIC16IGNvbWJyZWxvYzogY29tYmluZSBhbmQgc29ydCByZWxvYyBzZWN0aW9ucyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsCisJICAgICAgImVsZjY0LXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong4Ni02NCkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAweDQwMDAwMCk7IC4gPSAweDQwMDAwMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikKKyAgICAgICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopCisgICAgICAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKQorICAgICAgKigucmVsYS5pZnVuYykKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54ZCBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIxNTM5MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueGQKQEAgLTAsMCArMSwyMjUgQEAKKy8qIFNjcmlwdCBmb3IgbGQgLXBpZTogbGluayBwb3NpdGlvbiBpbmRlcGVuZGVudCBleGVjdXRhYmxlICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC14ODYtNjQiLCAiZWxmNjQteDg2LTY0IiwKKwkgICAgICAiZWxmNjQteDg2LTY0IikKK09VVFBVVF9BUkNIKGkzODY6eDg2LTY0KQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDApOyAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgICAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgICAgOiB7ICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsYS5maW5pICAgICAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgICAgOiB7ICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJlbGEuZGF0YS5yZWwucm8gICA6IHsgKigucmVsYS5kYXRhLnJlbC5ybyAucmVsYS5kYXRhLnJlbC5yby4qIC5yZWxhLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWxhLmRhdGEgICAgICA6IHsgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWxhLnRkYXRhCSAgOiB7ICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsYS50YnNzCSAgOiB7ICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopIH0KKyAgLnJlbGEuY3RvcnMgICAgIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgICA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgICAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgICA6IHsgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikgfQorICAucmVsYS5sZGF0YSAgICAgOiB7ICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKSB9CisgIC5yZWxhLmxic3MgICAgICA6IHsgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikgfQorICAucmVsYS5scm9kYXRhICAgOiB7ICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopIH0KKyAgLnJlbGEuaWZ1bmMgICAgIDogeyAqKC5yZWxhLmlmdW5jKSB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54ZGMgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhkYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmU4MjY1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54ZGMKQEAgLTAsMCArMSwyMjcgQEAKKy8qIFNjcmlwdCBmb3IgLXBpZSAteiBjb21icmVsb2M6IHBvc2l0aW9uIGluZGVwZW5kZW50IGV4ZWN1dGFibGUsIGNvbWJpbmUgJiBzb3J0IHJlbG9jcyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsCisJICAgICAgImVsZjY0LXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong4Ni02NCkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAwKTsgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopCisgICAgICAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKQorICAgICAgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikKKyAgICAgICooLnJlbGEuaWZ1bmMpCisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUKKyAgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4vT3JhY2xlIEMrKyBjb21waWxlci4gICovCisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JPIHsgKiguZXhjZXB0aW9uX3JhbmdlcworICAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgRm9yIDMyIGJpdHMgd2Ugd2FudCB0byBhbGlnbgorICBhdCBleGFjdGx5IGEgcGFnZSBib3VuZGFyeSB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBhcHJpb3JpLiAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC8qIEVuc3VyZSB0aGUgX19wcmVpbml0X2FycmF5X3N0YXJ0IGxhYmVsIGlzIHByb3Blcmx5IGFsaWduZWQuICBXZQorICAgICBjb3VsZCBpbnN0ZWFkIG1vdmUgdGhlIGxhYmVsIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzZWN0aW9uLCBidXQKKyAgICAgdGhlIGxpbmtlciB3b3VsZCB0aGVuIGNyZWF0ZSB0aGUgc2VjdGlvbiBldmVuIGlmIGl0IHR1cm5zIG91dCB0bworICAgICBiZSBlbXB0eSwgd2hpY2ggaXNuJ3QgcHJldHR5LiAgKi8KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmZpbmlfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZCoubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvIC5kYXRhLnJlbC5yby4qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKFNJWkVPRiAoLmdvdC5wbHQpID49IDI0ID8gMjQgOiAwLCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIC4gPSAuOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oNjQgLyA4KTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsKKyAgX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgKigubWRlYnVnLiopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueGR3IGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54ZHcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkNDZhZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueGR3CkBAIC0wLDAgKzEsMjI2IEBACisvKiBTY3JpcHQgZm9yIC1waWUgLXogY29tYnJlbG9jIC16IG5vdyAteiByZWxybzogcG9zaXRpb24gaW5kZXBlbmRlbnQgZXhlY3V0YWJsZSwgY29tYmluZSAmIHNvcnQgcmVsb2NzICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC14ODYtNjQiLCAiZWxmNjQteDg2LTY0IiwKKwkgICAgICAiZWxmNjQteDg2LTY0IikKK09VVFBVVF9BUkNIKGkzODY6eDg2LTY0KQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDApOyAuID0gMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikKKyAgICAgICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopCisgICAgICAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKQorICAgICAgKigucmVsYS5pZnVuYykKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdC5wbHQpICooLmlnb3QucGx0KSAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKDAsIC4pOworICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54biBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyN2E0YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueG4KQEAgLTAsMCArMSwyMjUgQEAKKy8qIFNjcmlwdCBmb3IgLW46IG1peCB0ZXh0IGFuZCBkYXRhIG9uIHNhbWUgcGFnZSAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsCisJICAgICAgImVsZjY0LXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong4Ni02NCkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSAweDQwMDAwMCk7IC4gPSAweDQwMDAwMCArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgICAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgICAgOiB7ICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsYS5maW5pICAgICAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgICAgOiB7ICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJlbGEuZGF0YS5yZWwucm8gICA6IHsgKigucmVsYS5kYXRhLnJlbC5ybyAucmVsYS5kYXRhLnJlbC5yby4qIC5yZWxhLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWxhLmRhdGEgICAgICA6IHsgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWxhLnRkYXRhCSAgOiB7ICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsYS50YnNzCSAgOiB7ICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopIH0KKyAgLnJlbGEuY3RvcnMgICAgIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgICA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgICAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgICA6IHsgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikgfQorICAucmVsYS5sZGF0YSAgICAgOiB7ICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKSB9CisgIC5yZWxhLmxic3MgICAgICA6IHsgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikgfQorICAucmVsYS5scm9kYXRhICAgOiB7ICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopIH0KKyAgLnJlbGEuaWZ1bmMgICAgIDogeyAqKC5yZWxhLmlmdW5jKSB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5pbml0X2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoU0laRU9GICguZ290LnBsdCkgPj0gMjQgPyAyNCA6IDAsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54ciBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0MDg1MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueHIKQEAgLTAsMCArMSwxNTQgQEAKKy8qIFNjcmlwdCBmb3IgbGQgLXI6IGxpbmsgd2l0aG91dCByZWxvY2F0aW9uICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC14ODYtNjQiLCAiZWxmNjQteDg2LTY0IiwKKwkgICAgICAiZWxmNjQteDg2LTY0IikKK09VVFBVVF9BUkNIKGkzODY6eDg2LTY0KQorIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlcworICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZworICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZAorICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLmludGVycCAgICAgICAwIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgIDAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAwIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgIDAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgIDAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gIDAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kIDA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAwOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAwIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAwIDogeyAqKC5yZWxhLnRleHQpIH0KKyAgLnJlbGEuZmluaSAgICAwIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAwIDogeyAqKC5yZWxhLnJvZGF0YSkgfQorICAucmVsYS5kYXRhLnJlbC5ybyAwIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvKSB9CisgIC5yZWxhLmRhdGEgICAgMCA6IHsgKigucmVsYS5kYXRhKSB9CisgIC5yZWxhLnRkYXRhCTAgOiB7ICooLnJlbGEudGRhdGEpIH0KKyAgLnJlbGEudGJzcwkwIDogeyAqKC5yZWxhLnRic3MpIH0KKyAgLnJlbGEuY3RvcnMgICAwIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgMCA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgIDAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgMCA6IHsgKigucmVsYS5ic3MpIH0KKyAgLnJlbGEubGRhdGEgICAwIDogeyAqKC5yZWxhLmxkYXRhKSB9CisgIC5yZWxhLmxic3MgICAgMCA6IHsgKigucmVsYS5sYnNzKSB9CisgIC5yZWxhLmxyb2RhdGEgMCA6IHsgKigucmVsYS5scm9kYXRhKSB9CisgIC5yZWxhLmlmdW5jICAgMCA6IHsgKigucmVsYS5pZnVuYykgfQorICAucmVsYS5wbHQgICAgIDAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAwIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAwIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAwIDoKKyAgeworICAgICooLnRleHQgLnN0dWIpCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0KKyAgLmZpbmkgICAgICAgICAwIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5maW5pKSkpCisgIH0KKyAgLnJvZGF0YSAgICAgICAwIDogeyAqKC5yb2RhdGEpIH0KKyAgLnJvZGF0YTEgICAgICAwIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgIDAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlIDAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgMCA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAwIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAwIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAuZXhjZXB0aW9uX3JhbmdlcyAwIDogT05MWV9JRl9SVyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJMCA6IHsgKigudGRhdGEpIH0KKyAgLnRic3MJCTAgOiB7ICooLnRic3MpIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLnByZWluaXRfYXJyYXkgICAwIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5qY3IgICAgICAgICAgMCA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZHluYW1pYyAgICAgIDAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAwIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLmdvdC5wbHQgICAgICAwIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAwIDoKKyAgeworICAgICooLmRhdGEpCisgIH0KKyAgLmRhdGExICAgICAgICAwIDogeyAqKC5kYXRhMSkgfQorICAuYnNzICAgICAgICAgIDAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgIH0KKyAgLmxic3MgMCA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MpCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLmxyb2RhdGEgMCAgOgorICB7CisgICAgKigubHJvZGF0YSkKKyAgfQorICAubGRhdGEgMCAgOgorICB7CisgICAgKigubGRhdGEpCisgIH0KKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54cyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3OWI4NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueHMKQEAgLTAsMCArMSwyMTYgQEAKKy8qIFNjcmlwdCBmb3IgbGQgLS1zaGFyZWQ6IGxpbmsgc2hhcmVkIGxpYnJhcnkgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLAorCSAgICAgICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAgIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAgIDogeyAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbGEuZmluaSAgICAgIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAgIDogeyAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8gLnJlbGEuZGF0YS5yZWwucm8uKiAucmVsYS5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsYS5kYXRhICAgICAgOiB7ICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsYS50ZGF0YQkgIDogeyAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbGEudGJzcwkgIDogeyAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWxhLmN0b3JzICAgICA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgICAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAgIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgICAgOiB7ICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbGEubGRhdGEgICAgIDogeyAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikgfQorICAucmVsYS5sYnNzICAgICAgOiB7ICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopIH0KKyAgLnJlbGEubHJvZGF0YSAgIDogeyAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKSB9CisgIC5yZWxhLmlmdW5jICAgICA6IHsgKigucmVsYS5pZnVuYykgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgICAgKigucmVsYS5pcGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAyNCA/IDI0IDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhzYyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueHNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNzAwZTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhzYwpAQCAtMCwwICsxLDIxOSBAQAorLyogU2NyaXB0IGZvciAtLXNoYXJlZCAteiBjb21icmVsb2M6IHNoYXJlZCBsaWJyYXJ5LCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KKy8qIE1vZGlmaWVkIGZvciBBbmRyb2lkLiAgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLAorCSAgICAgICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IDAgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopCisgICAgICAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKQorICAgICAgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikKKyAgICAgICooLnJlbGEuaWZ1bmMpCisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgICAgKigucmVsYS5pcGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguaW5pdF9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EIChTSVpFT0YgKC5nb3QucGx0KSA+PSAyNCA/IDI0IDogMCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhzdyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueHN3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYmQ1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhzdwpAQCAtMCwwICsxLDIxNyBAQAorLyogU2NyaXB0IGZvciAtLXNoYXJlZCAteiBjb21icmVsb2MgLXogbm93IC16IHJlbHJvOiBzaGFyZWQgbGlicmFyeSwgY29tYmluZSAmIHNvcnQgcmVsb2NzICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC14ODYtNjQiLCAiZWxmNjQteDg2LTY0IiwKKwkgICAgICAiZWxmNjQteDg2LTY0IikKK09VVFBVVF9BUkNIKGkzODY6eDg2LTY0KQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSAwICsgU0laRU9GX0hFQURFUlM7CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICAqKC5yZWxhLmlmdW5jKQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguaW5pdCkpKQorICB9CisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZQorICAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFN1bi9PcmFjbGUgQysrIGNvbXBpbGVyLiAgKi8KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUk8geyAqKC5leGNlcHRpb25fcmFuZ2VzCisgIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBGb3IgMzIgYml0cyB3ZSB3YW50IHRvIGFsaWduCisgIGF0IGV4YWN0bHkgYSBwYWdlIGJvdW5kYXJ5IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGFwcmlvcmkuICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzICAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbioubyguZmluaV9hcnJheSkpCisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kKi5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8gLmRhdGEucmVsLnJvLiogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdC5wbHQpICooLmlnb3QucGx0KSAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKDAsIC4pOworICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgLiA9IC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgIC4gPSBBTElHTig2NCAvIDgpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOworICBfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiopIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMpIH0KKyAgLyogRFdBUkYgRXh0ZW5zaW9uLiAgKi8KKyAgLmRlYnVnX21hY3JvICAgIDAgOiB7ICooLmRlYnVnX21hY3JvKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSAqKC5tZGVidWcuKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54dSBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueHUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1Mjk0NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueHUKQEAgLTAsMCArMSwxNTUgQEAKKy8qIFNjcmlwdCBmb3IgbGQgLVVyOiBsaW5rIHcvb3V0IHJlbG9jYXRpb24sIGRvIGNyZWF0ZSBjb25zdHJ1Y3RvcnMgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLAorCSAgICAgICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCisgLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCisgIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCisgIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCisgIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi8KK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuaW50ZXJwICAgICAgIDAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgMCA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgIDAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgMCA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgMCA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgMCA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgMDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yIDA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgIDAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgIDAgOiB7ICooLnJlbGEudGV4dCkgfQorICAucmVsYS5maW5pICAgIDAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgIDAgOiB7ICooLnJlbGEucm9kYXRhKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvIDAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8pIH0KKyAgLnJlbGEuZGF0YSAgICAwIDogeyAqKC5yZWxhLmRhdGEpIH0KKyAgLnJlbGEudGRhdGEJMCA6IHsgKigucmVsYS50ZGF0YSkgfQorICAucmVsYS50YnNzCTAgOiB7ICooLnJlbGEudGJzcykgfQorICAucmVsYS5jdG9ycyAgIDAgOiB7ICooLnJlbGEuY3RvcnMpIH0KKyAgLnJlbGEuZHRvcnMgICAwIDogeyAqKC5yZWxhLmR0b3JzKSB9CisgIC5yZWxhLmdvdCAgICAgMCA6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbGEuYnNzICAgICAwIDogeyAqKC5yZWxhLmJzcykgfQorICAucmVsYS5sZGF0YSAgIDAgOiB7ICooLnJlbGEubGRhdGEpIH0KKyAgLnJlbGEubGJzcyAgICAwIDogeyAqKC5yZWxhLmxic3MpIH0KKyAgLnJlbGEubHJvZGF0YSAwIDogeyAqKC5yZWxhLmxyb2RhdGEpIH0KKyAgLnJlbGEuaWZ1bmMgICAwIDogeyAqKC5yZWxhLmlmdW5jKSB9CisgIC5yZWxhLnBsdCAgICAgMCA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgIDAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmluaXQpKSkKKyAgfQorICAucGx0ICAgICAgICAgIDAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgIDAgOgorICB7CisgICAgKigudGV4dCAuc3R1YikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfQorICAuZmluaSAgICAgICAgIDAgOgorICB7CisgICAgS0VFUCAoKihTT1JUX05PTkUoLmZpbmkpKSkKKyAgfQorICAucm9kYXRhICAgICAgIDAgOiB7ICooLnJvZGF0YSkgfQorICAucm9kYXRhMSAgICAgIDAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgMCA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgMCA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAwIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgIDAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlIDAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC5leGNlcHRpb25fcmFuZ2VzIDAgOiBPTkxZX0lGX1JXIHsgKiguZXhjZXB0aW9uX3JhbmdlcyAuZXhjZXB0aW9uX3JhbmdlcyopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkwIDogeyAqKC50ZGF0YSkgfQorICAudGJzcwkJMCA6IHsgKigudGJzcykgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICAucHJlaW5pdF9hcnJheSAgIDAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmpjciAgICAgICAgICAwIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5keW5hbWljICAgICAgMCA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgIDAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuZ290LnBsdCAgICAgIDAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgIDAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgIDAgOiB7ICooLmRhdGExKSB9CisgIC5ic3MgICAgICAgICAgMCA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgfQorICAubGJzcyAwIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcykKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAubHJvZGF0YSAwICA6CisgIHsKKyAgICAqKC5scm9kYXRhKQorICB9CisgIC5sZGF0YSAwICA6CisgIHsKKyAgICAqKC5sZGF0YSkKKyAgfQorICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzKSB9CisgIC8qIERXQVJGIEV4dGVuc2lvbi4gICovCisgIC5kZWJ1Z19tYWNybyAgICAwIDogeyAqKC5kZWJ1Z19tYWNybykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0Lnh3IGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54dwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTc2ZTU1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54dwpAQCAtMCwwICsxLDIyNiBAQAorLyogU2NyaXB0IGZvciAteiBjb21icmVsb2MgLXogbm93IC16IHJlbHJvOiBjb21iaW5lIGFuZCBzb3J0IHJlbG9jIHNlY3Rpb25zICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC14ODYtNjQiLCAiZWxmNjQteDg2LTY0IiwKKwkgICAgICAiZWxmNjQteDg2LTY0IikKK09VVFBVVF9BUkNIKGkzODY6eDg2LTY0KQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IDB4NDAwMDAwKTsgLiA9IDB4NDAwMDAwICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICAqKC5yZWxhLmlmdW5jKQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVF9OT05FKC5pbml0KSkpCisgIH0KKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9CisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlRfTk9ORSguZmluaSkpKQorICB9CisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlCisgIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgU3VuL09yYWNsZSBDKysgY29tcGlsZXIuICAqLworICAuZXhjZXB0aW9uX3JhbmdlcyAgIDogT05MWV9JRl9STyB7ICooLmV4Y2VwdGlvbl9yYW5nZXMKKyAgLmV4Y2VwdGlvbl9yYW5nZXMqKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIEZvciAzMiBiaXRzIHdlIHdhbnQgdG8gYWxpZ24KKyAgYXQgZXhhY3RseSBhIHBhZ2UgYm91bmRhcnkgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgYXByaW9yaS4gKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLmV4Y2VwdGlvbl9yYW5nZXMgICA6IE9OTFlfSUZfUlcgeyAqKC5leGNlcHRpb25fcmFuZ2VzIC5leGNlcHRpb25fcmFuZ2VzKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAvKiBFbnN1cmUgdGhlIF9fcHJlaW5pdF9hcnJheV9zdGFydCBsYWJlbCBpcyBwcm9wZXJseSBhbGlnbmVkLiAgV2UKKyAgICAgY291bGQgaW5zdGVhZCBtb3ZlIHRoZSBsYWJlbCBkZWZpbml0aW9uIGluc2lkZSB0aGUgc2VjdGlvbiwgYnV0CisgICAgIHRoZSBsaW5rZXIgd291bGQgdGhlbiBjcmVhdGUgdGhlIHNlY3Rpb24gZXZlbiBpZiBpdCB0dXJucyBvdXQgdG8KKyAgICAgYmUgZW1wdHksIHdoaWNoIGlzbid0IHByZXR0eS4gICovCisgIC4gPSBBTElHTigzMiAvIDgpOworICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmluaXRfYXJyYXkpKQorICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5maW5pX2FycmF5KSkKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbioubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4qLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyAuZGF0YS5yZWwucm8uKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290LnBsdCkgKiguaWdvdC5wbHQpICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMCwgLik7CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICAuID0gLjsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuICAqLworICAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47CisgIF9ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsgX19lbmRfXyA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcykgfQorICAvKiBEV0FSRiBFeHRlbnNpb24uICAqLworICAuZGVidWdfbWFjcm8gICAgMCA6IHsgKiguZGVidWdfbWFjcm8pIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopICooLm1kZWJ1Zy4qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9pMzg2bGludXgueCBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2kzODZsaW51eC54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YmM1YTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9pMzg2bGludXgueApAQCAtMCwwICsxLDQ3IEBACisvKiBEZWZhdWx0IGxpbmtlciBzY3JpcHQsIGZvciBub3JtYWwgZXhlY3V0YWJsZXMgKi8KKy8qIE1vZGlmaWVkIGZvciBBbmRyb2lkLiAgKi8KK09VVFBVVF9GT1JNQVQoImEub3V0LWkzODYtbGludXgiLCAiYS5vdXQtaTM4Ni1saW51eCIsCisJICAgICAgImEub3V0LWkzODYtbGludXgiKQorT1VUUFVUX0FSQ0goaTM4NikKK1BST1ZJREUgKF9fc3RhY2sgPSAwKTsKK1NFQ1RJT05TCit7CisgIC4gPSAweDEwMjA7CisgIC50ZXh0IDoKKyAgeworICAgIENSRUFURV9PQkpFQ1RfU1lNQk9MUworICAgICooLnRleHQpCisgICAgLyogVGhlIG5leHQgc2l4IHNlY3Rpb25zIGFyZSBmb3IgU3VuT1MgZHluYW1pYyBsaW5raW5nLiAgVGhlIG9yZGVyCisgICAgICAgaXMgaW1wb3J0YW50LiAgKi8KKyAgICAqKC5keW5yZWwpCisgICAgKiguaGFzaCkKKyAgICAqKC5keW5zeW0pCisgICAgKiguZHluc3RyKQorICAgICooLnJ1bGVzKQorICAgICooLm5lZWQpCisgICAgX2V0ZXh0ID0gLjsKKyAgICBfX2V0ZXh0ID0gLjsKKyAgfQorICAuID0gQUxJR04oMHgxMDAwKTsKKyAgLmRhdGEgOgorICB7CisgICAgLyogVGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zIGFyZSBmb3IgU3VuT1MgZHluYW1pYyBsaW5raW5nLiAgKi8KKyAgICAqKC5keW5hbWljKQorICAgICooLmdvdCkKKyAgICAqKC5wbHQpCisgICAgKiguZGF0YSkKKyAgICAqKC5saW51eC1keW5hbWljKSAvKiBGb3IgTGludXggZHluYW1pYyBsaW5raW5nLiAgKi8KKyAgICBDT05TVFJVQ1RPUlMKKyAgICBfZWRhdGEgID0gIC47CisgICAgX19lZGF0YSAgPSAgLjsKKyAgfQorICAuYnNzIDoKKyAgeworICAgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgLiA9IEFMSUdOKDQpOworICAgX2VuZCA9IC4gOworICAgX19lbmQgPSAuIDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvaTM4NmxpbnV4LnhibiBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2kzODZsaW51eC54Ym4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFiMWU5MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2kzODZsaW51eC54Ym4KQEAgLTAsMCArMSw0NiBAQAorLyogU2NyaXB0IGZvciAtTjogbWl4IHRleHQgYW5kIGRhdGEgb24gc2FtZSBwYWdlOyBkb24ndCBhbGlnbiBkYXRhICovCitPVVRQVVRfRk9STUFUKCJhLm91dC1pMzg2LWxpbnV4IiwgImEub3V0LWkzODYtbGludXgiLAorCSAgICAgICJhLm91dC1pMzg2LWxpbnV4IikKK09VVFBVVF9BUkNIKGkzODYpCitQUk9WSURFIChfX3N0YWNrID0gMCk7CitTRUNUSU9OUworeworICAuID0gMDsKKyAgLnRleHQgOgorICB7CisgICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCisgICAgKigudGV4dCkKKyAgICAvKiBUaGUgbmV4dCBzaXggc2VjdGlvbnMgYXJlIGZvciBTdW5PUyBkeW5hbWljIGxpbmtpbmcuICBUaGUgb3JkZXIKKyAgICAgICBpcyBpbXBvcnRhbnQuICAqLworICAgICooLmR5bnJlbCkKKyAgICAqKC5oYXNoKQorICAgICooLmR5bnN5bSkKKyAgICAqKC5keW5zdHIpCisgICAgKigucnVsZXMpCisgICAgKigubmVlZCkKKyAgICBfZXRleHQgPSAuOworICAgIF9fZXRleHQgPSAuOworICB9CisgIC4gPSAuOworICAuZGF0YSA6CisgIHsKKyAgICAvKiBUaGUgZmlyc3QgdGhyZWUgc2VjdGlvbnMgYXJlIGZvciBTdW5PUyBkeW5hbWljIGxpbmtpbmcuICAqLworICAgICooLmR5bmFtaWMpCisgICAgKiguZ290KQorICAgICooLnBsdCkKKyAgICAqKC5kYXRhKQorICAgICooLmxpbnV4LWR5bmFtaWMpIC8qIEZvciBMaW51eCBkeW5hbWljIGxpbmtpbmcuICAqLworICAgIENPTlNUUlVDVE9SUworICAgIF9lZGF0YSAgPSAgLjsKKyAgICBfX2VkYXRhICA9ICAuOworICB9CisgIC5ic3MgOgorICB7CisgICAgX19ic3Nfc3RhcnQgPSAuOworICAgKiguYnNzKQorICAgKihDT01NT04pCisgICAuID0gQUxJR04oNCk7CisgICBfZW5kID0gLiA7CisgICBfX2VuZCA9IC4gOworICB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9pMzg2bGludXgueG4gYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9pMzg2bGludXgueG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE4NTY1NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2kzODZsaW51eC54bgpAQCAtMCwwICsxLDQ2IEBACisvKiBTY3JpcHQgZm9yIC1uOiBtaXggdGV4dCBhbmQgZGF0YSBvbiBzYW1lIHBhZ2UgKi8KK09VVFBVVF9GT1JNQVQoImEub3V0LWkzODYtbGludXgiLCAiYS5vdXQtaTM4Ni1saW51eCIsCisJICAgICAgImEub3V0LWkzODYtbGludXgiKQorT1VUUFVUX0FSQ0goaTM4NikKK1BST1ZJREUgKF9fc3RhY2sgPSAwKTsKK1NFQ1RJT05TCit7CisgIC4gPSAwOworICAudGV4dCA6CisgIHsKKyAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKKyAgICAqKC50ZXh0KQorICAgIC8qIFRoZSBuZXh0IHNpeCBzZWN0aW9ucyBhcmUgZm9yIFN1bk9TIGR5bmFtaWMgbGlua2luZy4gIFRoZSBvcmRlcgorICAgICAgIGlzIGltcG9ydGFudC4gICovCisgICAgKiguZHlucmVsKQorICAgICooLmhhc2gpCisgICAgKiguZHluc3ltKQorICAgICooLmR5bnN0cikKKyAgICAqKC5ydWxlcykKKyAgICAqKC5uZWVkKQorICAgIF9ldGV4dCA9IC47CisgICAgX19ldGV4dCA9IC47CisgIH0KKyAgLiA9IEFMSUdOKDB4MTAwMCk7CisgIC5kYXRhIDoKKyAgeworICAgIC8qIFRoZSBmaXJzdCB0aHJlZSBzZWN0aW9ucyBhcmUgZm9yIFN1bk9TIGR5bmFtaWMgbGlua2luZy4gICovCisgICAgKiguZHluYW1pYykKKyAgICAqKC5nb3QpCisgICAgKigucGx0KQorICAgICooLmRhdGEpCisgICAgKigubGludXgtZHluYW1pYykgLyogRm9yIExpbnV4IGR5bmFtaWMgbGlua2luZy4gICovCisgICAgQ09OU1RSVUNUT1JTCisgICAgX2VkYXRhICA9ICAuOworICAgIF9fZWRhdGEgID0gIC47CisgIH0KKyAgLmJzcyA6CisgIHsKKyAgICBfX2Jzc19zdGFydCA9IC47CisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgIC4gPSBBTElHTig0KTsKKyAgIF9lbmQgPSAuIDsKKyAgIF9fZW5kID0gLiA7CisgIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2kzODZsaW51eC54ciBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2kzODZsaW51eC54cgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTMzZjI4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvaTM4NmxpbnV4LnhyCkBAIC0wLDAgKzEsMzcgQEAKKy8qIFNjcmlwdCBmb3IgbGQgLXI6IGxpbmsgd2l0aG91dCByZWxvY2F0aW9uICovCitPVVRQVVRfRk9STUFUKCJhLm91dC1pMzg2LWxpbnV4IiwgImEub3V0LWkzODYtbGludXgiLAorCSAgICAgICJhLm91dC1pMzg2LWxpbnV4IikKK09VVFBVVF9BUkNIKGkzODYpCitTRUNUSU9OUworeworICAudGV4dCA6CisgIHsKKyAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKKyAgICAqKC50ZXh0KQorICAgIC8qIFRoZSBuZXh0IHNpeCBzZWN0aW9ucyBhcmUgZm9yIFN1bk9TIGR5bmFtaWMgbGlua2luZy4gIFRoZSBvcmRlcgorICAgICAgIGlzIGltcG9ydGFudC4gICovCisgICAgKiguZHlucmVsKQorICAgICooLmhhc2gpCisgICAgKiguZHluc3ltKQorICAgICooLmR5bnN0cikKKyAgICAqKC5ydWxlcykKKyAgICAqKC5uZWVkKQorICB9CisgIC5kYXRhIDoKKyAgeworICAgIC8qIFRoZSBmaXJzdCB0aHJlZSBzZWN0aW9ucyBhcmUgZm9yIFN1bk9TIGR5bmFtaWMgbGlua2luZy4gICovCisgICAgKiguZHluYW1pYykKKyAgICAqKC5nb3QpCisgICAgKigucGx0KQorICAgICooLmRhdGEpCisgICAgKigubGludXgtZHluYW1pYykgLyogRm9yIExpbnV4IGR5bmFtaWMgbGlua2luZy4gICovCisgIH0KKyAgLmJzcyA6CisgIHsKKyAgIDsKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgOworICAgOworICB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9pMzg2bGludXgueHUgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9pMzg2bGludXgueHUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0NzEwMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2kzODZsaW51eC54dQpAQCAtMCwwICsxLDM4IEBACisvKiBTY3JpcHQgZm9yIGxkIC1VcjogbGluayB3L291dCByZWxvY2F0aW9uLCBkbyBjcmVhdGUgY29uc3RydWN0b3JzICovCitPVVRQVVRfRk9STUFUKCJhLm91dC1pMzg2LWxpbnV4IiwgImEub3V0LWkzODYtbGludXgiLAorCSAgICAgICJhLm91dC1pMzg2LWxpbnV4IikKK09VVFBVVF9BUkNIKGkzODYpCitTRUNUSU9OUworeworICAudGV4dCA6CisgIHsKKyAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKKyAgICAqKC50ZXh0KQorICAgIC8qIFRoZSBuZXh0IHNpeCBzZWN0aW9ucyBhcmUgZm9yIFN1bk9TIGR5bmFtaWMgbGlua2luZy4gIFRoZSBvcmRlcgorICAgICAgIGlzIGltcG9ydGFudC4gICovCisgICAgKiguZHlucmVsKQorICAgICooLmhhc2gpCisgICAgKiguZHluc3ltKQorICAgICooLmR5bnN0cikKKyAgICAqKC5ydWxlcykKKyAgICAqKC5uZWVkKQorICB9CisgIC5kYXRhIDoKKyAgeworICAgIC8qIFRoZSBmaXJzdCB0aHJlZSBzZWN0aW9ucyBhcmUgZm9yIFN1bk9TIGR5bmFtaWMgbGlua2luZy4gICovCisgICAgKiguZHluYW1pYykKKyAgICAqKC5nb3QpCisgICAgKigucGx0KQorICAgICooLmRhdGEpCisgICAgKigubGludXgtZHluYW1pYykgLyogRm9yIExpbnV4IGR5bmFtaWMgbGlua2luZy4gICovCisgICAgQ09OU1RSVUNUT1JTCisgIH0KKyAgLmJzcyA6CisgIHsKKyAgIDsKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgOworICAgOworICB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliMzIvbGliYXNhbi5hIGIveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmFzYW4uYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzBmMmUzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmFzYW4uYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliMzIvbGliYXNhbi5zbyBiL3g4Nl82NC1saW51eC9saWIzMi9saWJhc2FuLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjBjYTk3NzEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliMzIvbGliYXNhbi5zbwpAQCAtMCwwICsxIEBACitsaWJhc2FuLnNvLjAuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmFzYW4uc28uMCBiL3g4Nl82NC1saW51eC9saWIzMi9saWJhc2FuLnNvLjAKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMGNhOTc3MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIzMi9saWJhc2FuLnNvLjAKQEAgLTAsMCArMSBAQAorbGliYXNhbi5zby4wLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIzMi9saWJhc2FuLnNvLjAuMC4wIGIveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmFzYW4uc28uMC4wLjAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2Q3OGViNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIzMi9saWJhc2FuLnNvLjAuMC4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIzMi9saWJhc2FuX3ByZWluaXQubyBiL3g4Nl82NC1saW51eC9saWIzMi9saWJhc2FuX3ByZWluaXQubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yjc0ZDQzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmFzYW5fcHJlaW5pdC5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIzMi9saWJhdG9taWMuYSBiL3g4Nl82NC1saW51eC9saWIzMi9saWJhdG9taWMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDExMzRkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmF0b21pYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIzMi9saWJhdG9taWMuc28gYi94ODZfNjQtbGludXgvbGliMzIvbGliYXRvbWljLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjNmODQxZDYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliMzIvbGliYXRvbWljLnNvCkBAIC0wLDAgKzEgQEAKK2xpYmF0b21pYy5zby4xLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIzMi9saWJhdG9taWMuc28uMSBiL3g4Nl82NC1saW51eC9saWIzMi9saWJhdG9taWMuc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zZjg0MWQ2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmF0b21pYy5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYmF0b21pYy5zby4xLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIzMi9saWJhdG9taWMuc28uMS4wLjAgYi94ODZfNjQtbGludXgvbGliMzIvbGliYXRvbWljLnNvLjEuMC4wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhkYTRkYzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliMzIvbGliYXRvbWljLnNvLjEuMC4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIzMi9saWJnY2Nfcy5zbyBiL3g4Nl82NC1saW51eC9saWIzMi9saWJnY2Nfcy5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi44MzAzM2Y3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjMyL2xpYmdjY19zLnNvCkBAIC0wLDAgKzEgQEAKK2xpYmdjY19zLnNvLjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliMzIvbGliZ2NjX3Muc28uMSBiL3g4Nl82NC1saW51eC9saWIzMi9saWJnY2Nfcy5zby4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZmI2NTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliMzIvbGliZ2NjX3Muc28uMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliMzIvbGliaXRtLmEgYi94ODZfNjQtbGludXgvbGliMzIvbGliaXRtLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhlNmI0MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIzMi9saWJpdG0uYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliMzIvbGliaXRtLnNvIGIveDg2XzY0LWxpbnV4L2xpYjMyL2xpYml0bS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5jZDlkNmQyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjMyL2xpYml0bS5zbwpAQCAtMCwwICsxIEBACitsaWJpdG0uc28uMS4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliMzIvbGliaXRtLnNvLjEgYi94ODZfNjQtbGludXgvbGliMzIvbGliaXRtLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uY2Q5ZDZkMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIzMi9saWJpdG0uc28uMQpAQCAtMCwwICsxIEBACitsaWJpdG0uc28uMS4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliMzIvbGliaXRtLnNvLjEuMC4wIGIveDg2XzY0LWxpbnV4L2xpYjMyL2xpYml0bS5zby4xLjAuMApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMzZkYzRlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjMyL2xpYml0bS5zby4xLjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliMzIvbGliaXRtLnNwZWMgYi94ODZfNjQtbGludXgvbGliMzIvbGliaXRtLnNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxZTBkOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIzMi9saWJpdG0uc3BlYwpAQCAtMCwwICsxLDMgQEAKKyMgVGhpcyBzcGVjIGZpbGUgaXMgcmVhZCBieSBnY2Mgd2hlbiBsaW5raW5nLiAgSXQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZQorIyBzdGFuZGFyZCBsaWJyYXJpZXMgd2UgbmVlZCBpbiBvcmRlciB0byBsaW5rIHdpdGggLWZnbnUtdG0KKypsaW5rX2l0bTogLWxpdG0gJXtzdGF0aWM6IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIzMi9saWJzc3AuYSBiL3g4Nl82NC1saW51eC9saWIzMi9saWJzc3AuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmRlMDNhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjMyL2xpYnNzcC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIzMi9saWJzc3Auc28gYi94ODZfNjQtbGludXgvbGliMzIvbGlic3NwLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjY3NjUwODQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliMzIvbGlic3NwLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnNzcC5zby4wLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIzMi9saWJzc3Auc28uMCBiL3g4Nl82NC1saW51eC9saWIzMi9saWJzc3Auc28uMApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42NzY1MDg0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjMyL2xpYnNzcC5zby4wCkBAIC0wLDAgKzEgQEAKK2xpYnNzcC5zby4wLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIzMi9saWJzc3Auc28uMC4wLjAgYi94ODZfNjQtbGludXgvbGliMzIvbGlic3NwLnNvLjAuMC4wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUzYjYyMDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliMzIvbGlic3NwLnNvLjAuMC4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIzMi9saWJzc3Bfbm9uc2hhcmVkLmEgYi94ODZfNjQtbGludXgvbGliMzIvbGlic3NwX25vbnNoYXJlZC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZTc2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliMzIvbGlic3NwX25vbnNoYXJlZC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIzMi9saWJzdGRjKysuYSBiL3g4Nl82NC1saW51eC9saWIzMi9saWJzdGRjKysuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjI5MDBmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjMyL2xpYnN0ZGMrKy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIzMi9saWJzdGRjKysuc28gYi94ODZfNjQtbGludXgvbGliMzIvbGlic3RkYysrLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjRmMmNhMmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliMzIvbGlic3RkYysrLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnN0ZGMrKy5zby42LjAuMTkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliMzIvbGlic3RkYysrLnNvLjYgYi94ODZfNjQtbGludXgvbGliMzIvbGlic3RkYysrLnNvLjYKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNGYyY2EyZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIzMi9saWJzdGRjKysuc28uNgpAQCAtMCwwICsxIEBACitsaWJzdGRjKysuc28uNi4wLjE5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYjMyL2xpYnN0ZGMrKy5zby42LjAuMTkgYi94ODZfNjQtbGludXgvbGliMzIvbGlic3RkYysrLnNvLjYuMC4xOQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NmNkNDY1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjMyL2xpYnN0ZGMrKy5zby42LjAuMTkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYjMyL2xpYnN0ZGMrKy5zby42LjAuMTktZ2RiLnB5IGIveDg2XzY0LWxpbnV4L2xpYjMyL2xpYnN0ZGMrKy5zby42LjAuMTktZ2RiLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZGI5NGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliMzIvbGlic3RkYysrLnNvLjYuMC4xOS1nZGIucHkKQEAgLTAsMCArMSw2MCBAQAorIyAtKi0gcHl0aG9uIC0qLQorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworaW1wb3J0IHN5cworaW1wb3J0IGdkYgoraW1wb3J0IG9zCitpbXBvcnQgb3MucGF0aAorCitweXRob25kaXIgPSAnL3Vzci9sb2NhbC9nb29nbGUvaG9tZS9jaGgvd29ya2Rpci9wcmVjaXNlNy8xL3g4Nl82NC1saW51eC1nbGliYzIuMTUtNC44L3NoYXJlL2djYy00LjgvcHl0aG9uJworbGliZGlyID0gJy91c3IvbG9jYWwvZ29vZ2xlL2hvbWUvY2hoL3dvcmtkaXIvcHJlY2lzZTcvMS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC94ODZfNjQtbGludXgvbGliLy4uL2xpYjMyJworCisjIFRoaXMgZmlsZSBtaWdodCBiZSBsb2FkZWQgd2hlbiB0aGVyZSBpcyBubyBjdXJyZW50IG9iamZpbGUuICBUaGlzCisjIGNhbiBoYXBwZW4gaWYgdGhlIHVzZXIgbG9hZHMgaXQgbWFudWFsbHkuICBJbiB0aGlzIGNhc2Ugd2UgZG9uJ3QKKyMgdXBkYXRlIHN5cy5wYXRoOyBpbnN0ZWFkIHdlIGp1c3QgaG9wZSB0aGUgdXNlciBtYW5hZ2VkIHRvIGRvIHRoYXQKKyMgYmVmb3JlaGFuZC4KK2lmIGdkYi5jdXJyZW50X29iamZpbGUgKCkgaXMgbm90IE5vbmU6CisgICAgIyBVcGRhdGUgbW9kdWxlIHBhdGguICBXZSB3YW50IHRvIGZpbmQgdGhlIHJlbGF0aXZlIHBhdGggZnJvbSBsaWJkaXIKKyAgICAjIHRvIHB5dGhvbmRpciwgYW5kIHRoZW4gd2Ugd2FudCB0byBhcHBseSB0aGF0IHJlbGF0aXZlIHBhdGggdG8gdGhlCisgICAgIyBkaXJlY3RvcnkgaG9sZGluZyB0aGUgb2JqZmlsZSB3aXRoIHdoaWNoIHRoaXMgZmlsZSBpcyBhc3NvY2lhdGVkLgorICAgICMgVGhpcyBwcmVzZXJ2ZXMgcmVsb2NhdGFiaWxpdHkgb2YgdGhlIGdjYyB0cmVlLgorCisgICAgIyBEbyBhIHNpbXBsZSBub3JtYWxpemF0aW9uIHRoYXQgcmVtb3ZlcyBkdXBsaWNhdGUgc2VwYXJhdG9ycy4KKyAgICBweXRob25kaXIgPSBvcy5wYXRoLm5vcm1wYXRoIChweXRob25kaXIpCisgICAgbGliZGlyID0gb3MucGF0aC5ub3JtcGF0aCAobGliZGlyKQorCisgICAgcHJlZml4ID0gb3MucGF0aC5jb21tb25wcmVmaXggKFtsaWJkaXIsIHB5dGhvbmRpcl0pCisgICAgIyBJbiBzb21lIGJpemFycmUgY29uZmlndXJhdGlvbiB3ZSBtaWdodCBoYXZlIGZvdW5kIGEgbWF0Y2ggaW4gdGhlCisgICAgIyBtaWRkbGUgb2YgYSBkaXJlY3RvcnkgbmFtZS4KKyAgICBpZiBwcmVmaXhbLTFdICE9ICcvJzoKKyAgICAgICAgcHJlZml4ID0gb3MucGF0aC5kaXJuYW1lIChwcmVmaXgpICsgJy8nCisKKyAgICAjIFN0cmlwIG9mZiB0aGUgcHJlZml4LgorICAgIHB5dGhvbmRpciA9IHB5dGhvbmRpcltsZW4gKHByZWZpeCk6XQorICAgIGxpYmRpciA9IGxpYmRpcltsZW4gKHByZWZpeCk6XQorCisgICAgIyBDb21wdXRlIHRoZSAiLi4icyBuZWVkZWQgdG8gZ2V0IGZyb20gbGliZGlyIHRvIHRoZSBwcmVmaXguCisgICAgZG90ZG90cyA9ICgnLi4nICsgb3Muc2VwKSAqIGxlbiAobGliZGlyLnNwbGl0IChvcy5zZXApKQorCisgICAgb2JqZmlsZSA9IGdkYi5jdXJyZW50X29iamZpbGUgKCkuZmlsZW5hbWUKKyAgICBkaXJfID0gb3MucGF0aC5qb2luIChvcy5wYXRoLmRpcm5hbWUgKG9iamZpbGUpLCBkb3Rkb3RzLCBweXRob25kaXIpCisKKyAgICBpZiBub3QgZGlyXyBpbiBzeXMucGF0aDoKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGRpcl8pCisKKyMgTG9hZCB0aGUgcHJldHR5LXByaW50ZXJzLgorZnJvbSBsaWJzdGRjeHgudjYucHJpbnRlcnMgaW1wb3J0IHJlZ2lzdGVyX2xpYnN0ZGN4eF9wcmludGVycworcmVnaXN0ZXJfbGlic3RkY3h4X3ByaW50ZXJzIChnZGIuY3VycmVudF9vYmpmaWxlICgpKQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYjMyL2xpYnN1cGMrKy5hIGIveDg2XzY0LWxpbnV4L2xpYjMyL2xpYnN1cGMrKy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MmI4ZTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliMzIvbGlic3VwYysrLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYjY0L2xpYmFzYW4uYSBiL3g4Nl82NC1saW51eC9saWI2NC9saWJhc2FuLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0YmE0ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWI2NC9saWJhc2FuLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYjY0L2xpYmFzYW4uc28gYi94ODZfNjQtbGludXgvbGliNjQvbGliYXNhbi5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4wY2E5NzcxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYmFzYW4uc28KQEAgLTAsMCArMSBAQAorbGliYXNhbi5zby4wLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWI2NC9saWJhc2FuLnNvLjAgYi94ODZfNjQtbGludXgvbGliNjQvbGliYXNhbi5zby4wCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjBjYTk3NzEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliNjQvbGliYXNhbi5zby4wCkBAIC0wLDAgKzEgQEAKK2xpYmFzYW4uc28uMC4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliNjQvbGliYXNhbi5zby4wLjAuMCBiL3g4Nl82NC1saW51eC9saWI2NC9saWJhc2FuLnNvLjAuMC4wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU0NDI3OTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliNjQvbGliYXNhbi5zby4wLjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliNjQvbGliYXNhbl9wcmVpbml0Lm8gYi94ODZfNjQtbGludXgvbGliNjQvbGliYXNhbl9wcmVpbml0Lm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjYTM0YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWI2NC9saWJhc2FuX3ByZWluaXQubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliNjQvbGliYXRvbWljLmEgYi94ODZfNjQtbGludXgvbGliNjQvbGliYXRvbWljLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA2MmQwYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWI2NC9saWJhdG9taWMuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliNjQvbGliYXRvbWljLnNvIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYmF0b21pYy5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zZjg0MWQ2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYmF0b21pYy5zbwpAQCAtMCwwICsxIEBACitsaWJhdG9taWMuc28uMS4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliNjQvbGliYXRvbWljLnNvLjEgYi94ODZfNjQtbGludXgvbGliNjQvbGliYXRvbWljLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uM2Y4NDFkNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWI2NC9saWJhdG9taWMuc28uMQpAQCAtMCwwICsxIEBACitsaWJhdG9taWMuc28uMS4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliNjQvbGliYXRvbWljLnNvLjEuMC4wIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYmF0b21pYy5zby4xLjAuMApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NDFmMGY1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYmF0b21pYy5zby4xLjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliNjQvbGliZ2NjX3Muc28gYi94ODZfNjQtbGludXgvbGliNjQvbGliZ2NjX3Muc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uODMwMzNmNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWI2NC9saWJnY2Nfcy5zbwpAQCAtMCwwICsxIEBACitsaWJnY2Nfcy5zby4xClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYjY0L2xpYmdjY19zLnNvLjEgYi94ODZfNjQtbGludXgvbGliNjQvbGliZ2NjX3Muc28uMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzFjMDFhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYmdjY19zLnNvLjEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYjY0L2xpYml0bS5hIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYml0bS5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1N2M2N2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliNjQvbGliaXRtLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYjY0L2xpYml0bS5zbyBiL3g4Nl82NC1saW51eC9saWI2NC9saWJpdG0uc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uY2Q5ZDZkMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWI2NC9saWJpdG0uc28KQEAgLTAsMCArMSBAQAorbGliaXRtLnNvLjEuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYjY0L2xpYml0bS5zby4xIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYml0bS5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmNkOWQ2ZDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliNjQvbGliaXRtLnNvLjEKQEAgLTAsMCArMSBAQAorbGliaXRtLnNvLjEuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYjY0L2xpYml0bS5zby4xLjAuMCBiL3g4Nl82NC1saW51eC9saWI2NC9saWJpdG0uc28uMS4wLjAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2JmYWMxNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWI2NC9saWJpdG0uc28uMS4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYjY0L2xpYml0bS5zcGVjIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYml0bS5zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMWUwZDkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliNjQvbGliaXRtLnNwZWMKQEAgLTAsMCArMSwzIEBACisjIFRoaXMgc3BlYyBmaWxlIGlzIHJlYWQgYnkgZ2NjIHdoZW4gbGlua2luZy4gIEl0IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUKKyMgc3RhbmRhcmQgbGlicmFyaWVzIHdlIG5lZWQgaW4gb3JkZXIgdG8gbGluayB3aXRoIC1mZ251LXRtCisqbGlua19pdG06IC1saXRtICV7c3RhdGljOiB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliNjQvbGlic3NwLmEgYi94ODZfNjQtbGludXgvbGliNjQvbGlic3NwLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlY2Y5ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWI2NC9saWJzc3AuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliNjQvbGlic3NwLnNvIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnNzcC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42NzY1MDg0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnNzcC5zbwpAQCAtMCwwICsxIEBACitsaWJzc3Auc28uMC4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliNjQvbGlic3NwLnNvLjAgYi94ODZfNjQtbGludXgvbGliNjQvbGlic3NwLnNvLjAKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNjc2NTA4NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWI2NC9saWJzc3Auc28uMApAQCAtMCwwICsxIEBACitsaWJzc3Auc28uMC4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliNjQvbGlic3NwLnNvLjAuMC4wIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnNzcC5zby4wLjAuMApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNTQ5MzI0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnNzcC5zby4wLjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliNjQvbGlic3NwX25vbnNoYXJlZC5hIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnNzcF9ub25zaGFyZWQuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODRmOTliCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnNzcF9ub25zaGFyZWQuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliNjQvbGlic3RkYysrLmEgYi94ODZfNjQtbGludXgvbGliNjQvbGlic3RkYysrLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk2MzkxZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWI2NC9saWJzdGRjKysuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliNjQvbGlic3RkYysrLnNvIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN0ZGMrKy5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40ZjJjYTJmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN0ZGMrKy5zbwpAQCAtMCwwICsxIEBACitsaWJzdGRjKysuc28uNi4wLjE5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN0ZGMrKy5zby42IGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN0ZGMrKy5zby42Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjRmMmNhMmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliNjQvbGlic3RkYysrLnNvLjYKQEAgLTAsMCArMSBAQAorbGlic3RkYysrLnNvLjYuMC4xOQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWI2NC9saWJzdGRjKysuc28uNi4wLjE5IGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN0ZGMrKy5zby42LjAuMTkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjZlMzk5MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWI2NC9saWJzdGRjKysuc28uNi4wLjE5CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWI2NC9saWJzdGRjKysuc28uNi4wLjE5LWdkYi5weSBiL3g4Nl82NC1saW51eC9saWI2NC9saWJzdGRjKysuc28uNi4wLjE5LWdkYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjdjZmNkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN0ZGMrKy5zby42LjAuMTktZ2RiLnB5CkBAIC0wLDAgKzEsNjAgQEAKKyMgLSotIHB5dGhvbiAtKi0KKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBnZGIKK2ltcG9ydCBvcworaW1wb3J0IG9zLnBhdGgKKworcHl0aG9uZGlyID0gJy91c3IvbG9jYWwvZ29vZ2xlL2hvbWUvY2hoL3dvcmtkaXIvcHJlY2lzZTcvMS94ODZfNjQtbGludXgtZ2xpYmMyLjE1LTQuOC9zaGFyZS9nY2MtNC44L3B5dGhvbicKK2xpYmRpciA9ICcvdXNyL2xvY2FsL2dvb2dsZS9ob21lL2NoaC93b3JrZGlyL3ByZWNpc2U3LzEveDg2XzY0LWxpbnV4LWdsaWJjMi4xNS00LjgveDg2XzY0LWxpbnV4L2xpYi8uLi9saWI2NCcKKworIyBUaGlzIGZpbGUgbWlnaHQgYmUgbG9hZGVkIHdoZW4gdGhlcmUgaXMgbm8gY3VycmVudCBvYmpmaWxlLiAgVGhpcworIyBjYW4gaGFwcGVuIGlmIHRoZSB1c2VyIGxvYWRzIGl0IG1hbnVhbGx5LiAgSW4gdGhpcyBjYXNlIHdlIGRvbid0CisjIHVwZGF0ZSBzeXMucGF0aDsgaW5zdGVhZCB3ZSBqdXN0IGhvcGUgdGhlIHVzZXIgbWFuYWdlZCB0byBkbyB0aGF0CisjIGJlZm9yZWhhbmQuCitpZiBnZGIuY3VycmVudF9vYmpmaWxlICgpIGlzIG5vdCBOb25lOgorICAgICMgVXBkYXRlIG1vZHVsZSBwYXRoLiAgV2Ugd2FudCB0byBmaW5kIHRoZSByZWxhdGl2ZSBwYXRoIGZyb20gbGliZGlyCisgICAgIyB0byBweXRob25kaXIsIGFuZCB0aGVuIHdlIHdhbnQgdG8gYXBwbHkgdGhhdCByZWxhdGl2ZSBwYXRoIHRvIHRoZQorICAgICMgZGlyZWN0b3J5IGhvbGRpbmcgdGhlIG9iamZpbGUgd2l0aCB3aGljaCB0aGlzIGZpbGUgaXMgYXNzb2NpYXRlZC4KKyAgICAjIFRoaXMgcHJlc2VydmVzIHJlbG9jYXRhYmlsaXR5IG9mIHRoZSBnY2MgdHJlZS4KKworICAgICMgRG8gYSBzaW1wbGUgbm9ybWFsaXphdGlvbiB0aGF0IHJlbW92ZXMgZHVwbGljYXRlIHNlcGFyYXRvcnMuCisgICAgcHl0aG9uZGlyID0gb3MucGF0aC5ub3JtcGF0aCAocHl0aG9uZGlyKQorICAgIGxpYmRpciA9IG9zLnBhdGgubm9ybXBhdGggKGxpYmRpcikKKworICAgIHByZWZpeCA9IG9zLnBhdGguY29tbW9ucHJlZml4IChbbGliZGlyLCBweXRob25kaXJdKQorICAgICMgSW4gc29tZSBiaXphcnJlIGNvbmZpZ3VyYXRpb24gd2UgbWlnaHQgaGF2ZSBmb3VuZCBhIG1hdGNoIGluIHRoZQorICAgICMgbWlkZGxlIG9mIGEgZGlyZWN0b3J5IG5hbWUuCisgICAgaWYgcHJlZml4Wy0xXSAhPSAnLyc6CisgICAgICAgIHByZWZpeCA9IG9zLnBhdGguZGlybmFtZSAocHJlZml4KSArICcvJworCisgICAgIyBTdHJpcCBvZmYgdGhlIHByZWZpeC4KKyAgICBweXRob25kaXIgPSBweXRob25kaXJbbGVuIChwcmVmaXgpOl0KKyAgICBsaWJkaXIgPSBsaWJkaXJbbGVuIChwcmVmaXgpOl0KKworICAgICMgQ29tcHV0ZSB0aGUgIi4uInMgbmVlZGVkIHRvIGdldCBmcm9tIGxpYmRpciB0byB0aGUgcHJlZml4LgorICAgIGRvdGRvdHMgPSAoJy4uJyArIG9zLnNlcCkgKiBsZW4gKGxpYmRpci5zcGxpdCAob3Muc2VwKSkKKworICAgIG9iamZpbGUgPSBnZGIuY3VycmVudF9vYmpmaWxlICgpLmZpbGVuYW1lCisgICAgZGlyXyA9IG9zLnBhdGguam9pbiAob3MucGF0aC5kaXJuYW1lIChvYmpmaWxlKSwgZG90ZG90cywgcHl0aG9uZGlyKQorCisgICAgaWYgbm90IGRpcl8gaW4gc3lzLnBhdGg6CisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBkaXJfKQorCisjIExvYWQgdGhlIHByZXR0eS1wcmludGVycy4KK2Zyb20gbGlic3RkY3h4LnY2LnByaW50ZXJzIGltcG9ydCByZWdpc3Rlcl9saWJzdGRjeHhfcHJpbnRlcnMKK3JlZ2lzdGVyX2xpYnN0ZGN4eF9wcmludGVycyAoZ2RiLmN1cnJlbnRfb2JqZmlsZSAoKSkKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWI2NC9saWJzdXBjKysuYSBiL3g4Nl82NC1saW51eC9saWI2NC9saWJzdXBjKysuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmJhMmFmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN1cGMrKy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWI2NC9saWJ0c2FuLmEgYi94ODZfNjQtbGludXgvbGliNjQvbGlidHNhbi5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNjI5MjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliNjQvbGlidHNhbi5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWI2NC9saWJ0c2FuLnNvIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnRzYW4uc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uN2U4MTUzOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWI2NC9saWJ0c2FuLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnRzYW4uc28uMC4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliNjQvbGlidHNhbi5zby4wIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnRzYW4uc28uMApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi43ZTgxNTM4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnRzYW4uc28uMApAQCAtMCwwICsxIEBACitsaWJ0c2FuLnNvLjAuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnRzYW4uc28uMC4wLjAgYi94ODZfNjQtbGludXgvbGliNjQvbGlidHNhbi5zby4wLjAuMApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iN2U4MTViCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnRzYW4uc28uMC4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgo=